From 882586bc52957b67975691765357513eab345824 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 1 Apr 2026 09:38:24 -0600 Subject: [PATCH 001/103] Add layout traversal utilities for Dash component trees --- dash/layout.py | 228 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100644 dash/layout.py diff --git a/dash/layout.py b/dash/layout.py new file mode 100644 index 0000000000..fdca86edca --- /dev/null +++ b/dash/layout.py @@ -0,0 +1,228 @@ +"""Reusable layout utilities for traversing and inspecting Dash component trees.""" + +from __future__ import annotations + +import json +from typing import Any, Generator + +from dash import get_app +from dash._pages import PAGE_REGISTRY +from dash.dependencies import Wildcard +from dash.development.base_component import Component + +_WILDCARD_VALUES = frozenset(w.value for w in Wildcard) + + +def traverse( + start: Component | None = None, +) -> Generator[tuple[Component, tuple[Component, ...]], None, None]: + """Yield ``(component, ancestors)`` for every Component in the tree. + + If ``start`` is ``None``, the full app layout is resolved via + ``dash.get_app()``, preferring ``validation_layout`` for completeness. + """ + if start is None: + app = get_app() + start = getattr(app, "validation_layout", None) or app.get_layout() + + yield from _walk(start, ()) + + +def _walk( + node: Any, + ancestors: tuple[Component, ...], +) -> Generator[tuple[Component, tuple[Component, ...]], None, None]: + if node is None: + return + if isinstance(node, (list, tuple)): + for item in node: + yield from _walk(item, ancestors) + return + if not isinstance(node, Component): + return + + yield node, ancestors + + child_ancestors = (*ancestors, node) + for _prop_name, child in iter_children(node): + yield from _walk(child, child_ancestors) + + +def iter_children( + component: Component, +) -> Generator[tuple[str, Component], None, None]: + """Yield ``(prop_name, child_component)`` for all component-valued props. + + Walks ``children`` plus any props declared in the component's + ``_children_props`` list. Supports nested path expressions like + ``control_groups[].children`` and ``insights.title``. + """ + props_to_walk = ["children"] + getattr(component, "_children_props", []) + for prop_path in props_to_walk: + for child in get_children(component, prop_path): + yield prop_path, child + + +def get_children(component: Any, prop_path: str) -> list[Component]: + """Resolve a ``_children_props`` path expression to child Components. + + Mirrors the dash-renderer's path parsing in ``DashWrapper.tsx``. + Supports: + - ``"children"`` — simple prop + - ``"control_groups[].children"`` — array, then sub-prop per element + - ``"insights.title"`` — nested object prop + """ + clean_path = prop_path.replace("[]", "").replace("{}", "") + + if "." not in prop_path: + return _collect_components(getattr(component, clean_path, None)) + + parts = prop_path.split(".") + array_idx = next((i for i, p in enumerate(parts) if "[]" in p), len(parts)) + front = [p.replace("[]", "").replace("{}", "") for p in parts[: array_idx + 1]] + back = [p.replace("{}", "") for p in parts[array_idx + 1 :]] + + node = _resolve_path(component, front) + if node is None: + return [] + + if back and isinstance(node, (list, tuple)): + results: list[Component] = [] + for element in node: + child = _resolve_path(element, back) + results.extend(_collect_components(child)) + return results + + return _collect_components(node) + + +def _resolve_path(node: Any, keys: list[str]) -> Any: + """Walk a chain of keys through Components and dicts.""" + for key in keys: + if isinstance(node, Component): + node = getattr(node, key, None) + elif isinstance(node, dict): + node = node.get(key) + else: + return None + if node is None: + return None + return node + + +def _collect_components(value: Any) -> list[Component]: + """Extract Components from a value (single, list, or None).""" + if value is None: + return [] + if isinstance(value, Component): + return [value] + if isinstance(value, (list, tuple)): + return [item for item in value if isinstance(item, (Component, list, tuple))] + return [] + + +def find_component( + component_id: str | dict, + layout: Component | None = None, + page: str | None = None, +) -> Component | None: + """Find a component by ID. + + If neither ``layout`` nor ``page`` is provided, searches the full + app layout (preferring ``validation_layout`` for completeness). + """ + if page is not None: + layout = _resolve_page_layout(page) + + if layout is None: + app = get_app() + layout = getattr(app, "validation_layout", None) or app.get_layout() + + for comp, _ in traverse(layout): + if getattr(comp, "id", None) == component_id: + return comp + return None + + +def parse_wildcard_id(pid: Any) -> dict | None: + """Parse a component ID and return it as a dict if it contains a wildcard. + + Accepts string (JSON-encoded) or dict IDs. Returns ``None`` + if the ID is not a wildcard pattern. + + Example:: + + >>> parse_wildcard_id('{"type":"input","index":["ALL"]}') + {"type": "input", "index": ["ALL"]} + >>> parse_wildcard_id("my-dropdown") + None + """ + if isinstance(pid, str) and pid.startswith("{"): + try: + pid = json.loads(pid) + except (json.JSONDecodeError, ValueError): + return None + if not isinstance(pid, dict): + return None + for v in pid.values(): + if isinstance(v, list) and len(v) == 1 and v[0] in _WILDCARD_VALUES: + return pid + return None + + +def find_matching_components(pattern: dict) -> list[Component]: + """Find all components whose dict ID matches a wildcard pattern. + + Non-wildcard keys must match exactly. Wildcard keys are ignored. + """ + non_wildcard_keys = { + k: v + for k, v in pattern.items() + if not (isinstance(v, list) and len(v) == 1 and v[0] in _WILDCARD_VALUES) + } + matches = [] + for comp, _ in traverse(): + comp_id = getattr(comp, "id", None) + if not isinstance(comp_id, dict): + continue + if all(comp_id.get(k) == v for k, v in non_wildcard_keys.items()): + matches.append(comp) + return matches + + +def extract_text(component: Component) -> str: + """Recursively extract plain text from a component's children tree. + + Mimics the browser's ``element.textContent``. + """ + children = getattr(component, "children", None) + if children is None: + return "" + if isinstance(children, str): + return children + if isinstance(children, Component): + return extract_text(children) + if isinstance(children, (list, tuple)): + parts: list[str] = [] + for child in children: + if isinstance(child, str): + parts.append(child) + elif isinstance(child, Component): + parts.append(extract_text(child)) + return "".join(parts).strip() + return "" + + +def _resolve_page_layout(page: str) -> Any | None: + if not PAGE_REGISTRY: + return None + for _module, page_info in PAGE_REGISTRY.items(): + if page_info.get("path") == page: + page_layout = page_info.get("layout") + if callable(page_layout): + try: + page_layout = page_layout() + except (TypeError, RuntimeError): + return None + return page_layout + return None From 4d55ef8eb6c2f68c411b5af65d91254ea917b579 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 1 Apr 2026 10:01:59 -0600 Subject: [PATCH 002/103] Make Dash components compatible with Pydantic types --- dash/development/_py_components_generation.py | 5 +- dash/development/base_component.py | 17 ++++ dash/types.py | 67 ++++++++++++++- requirements/install.txt | 1 + tests/unit/test_layout.py | 83 +++++++++++++++++++ tests/unit/test_pydantic_types.py | 36 ++++++++ 6 files changed, 204 insertions(+), 5 deletions(-) create mode 100644 tests/unit/test_layout.py create mode 100644 tests/unit/test_pydantic_types.py diff --git a/dash/development/_py_components_generation.py b/dash/development/_py_components_generation.py index 73545ea4a5..b597283a04 100644 --- a/dash/development/_py_components_generation.py +++ b/dash/development/_py_components_generation.py @@ -24,6 +24,7 @@ import typing # noqa: F401 from typing_extensions import TypedDict, NotRequired, Literal # noqa: F401 from dash.development.base_component import Component, _explicitize_args +from dash.types import NumberType # noqa: F401 {custom_imports} ComponentSingleType = typing.Union[str, int, float, Component, None] ComponentType = typing.Union[ @@ -31,10 +32,6 @@ typing.Sequence[ComponentSingleType], ] -NumberType = typing.Union[ - typing.SupportsFloat, typing.SupportsInt, typing.SupportsComplex -] - """ diff --git a/dash/development/base_component.py b/dash/development/base_component.py index 342ad6da6f..70ed17e9de 100644 --- a/dash/development/base_component.py +++ b/dash/development/base_component.py @@ -117,6 +117,23 @@ class Component(metaclass=ComponentMeta): _valid_wildcard_attributes: typing.List[str] available_wildcard_properties: typing.List[str] + @classmethod + def __get_pydantic_core_schema__(cls, source_type, handler): + from pydantic_core import core_schema + return core_schema.any_schema() + + @classmethod + def __get_pydantic_json_schema__(cls, schema, handler): + namespaces = list(ComponentRegistry.namespace_to_package.keys()) + return { + "type": "object", + "properties": { + "type": {"type": "string"}, + "namespace": {"type": "string", "enum": namespaces} if namespaces else {"type": "string"}, + "props": {"type": "object"}, + }, + } + class _UNDEFINED: def __repr__(self): return "undefined" diff --git a/dash/types.py b/dash/types.py index 9a39adb43e..43bf16dc30 100644 --- a/dash/types.py +++ b/dash/types.py @@ -1,4 +1,29 @@ -from typing_extensions import TypedDict, NotRequired +import typing +from typing import Any, Dict, List, Union + +from pydantic import Field, GetCoreSchemaHandler, GetJsonSchemaHandler +from pydantic_core import core_schema +from typing_extensions import Annotated, TypedDict, NotRequired + + +class _NumberSchema: # pylint: disable=too-few-public-methods + @classmethod + def __get_pydantic_core_schema__( + cls, _source_type: Any, _handler: GetCoreSchemaHandler + ) -> Any: + return core_schema.float_schema() + + @classmethod + def __get_pydantic_json_schema__( + cls, _schema: Any, _handler: GetJsonSchemaHandler + ) -> dict: + return {"type": "number"} + + +NumberType = Annotated[ + Union[typing.SupportsFloat, typing.SupportsInt, typing.SupportsComplex], + _NumberSchema, +] class RendererHooks(TypedDict): # pylint: disable=too-many-ancestors @@ -8,3 +33,43 @@ class RendererHooks(TypedDict): # pylint: disable=too-many-ancestors request_post: NotRequired[str] callback_resolved: NotRequired[str] request_refresh_jwt: NotRequired[str] + + +class CallbackDependency(TypedDict): + id: Union[str, Dict[str, Any]] + property: str + + +class CallbackInput(TypedDict): + id: Union[str, Dict[str, Any]] + property: str + value: Any + + +class CallbackDispatchBody(TypedDict): + output: str + outputs: List[CallbackDependency] + inputs: List[CallbackInput] + state: List[CallbackInput] + changedPropIds: List[str] + + +CallbackOutput = Annotated[ + Dict[str, Any], + Field( + description="The return values of the callback. A mapping of component & property names to their updated values." + ), +] + +CallbackSideOutput = Annotated[ + Dict[str, Any], + Field( + description="Side-effect updates that the callback performed but did not declare ahead of time. A mapping of component & property names to their updated values." + ), +] + + +class CallbackDispatchResponse(TypedDict): + multi: NotRequired[bool] + response: NotRequired[Dict[str, CallbackOutput]] + sideUpdate: NotRequired[Dict[str, CallbackSideOutput]] diff --git a/requirements/install.txt b/requirements/install.txt index 284f3a5031..f65522326e 100644 --- a/requirements/install.txt +++ b/requirements/install.txt @@ -8,3 +8,4 @@ retrying nest-asyncio setuptools janus>=1.0.0 +pydantic>=2.12.5 diff --git a/tests/unit/test_layout.py b/tests/unit/test_layout.py new file mode 100644 index 0000000000..76a72f7fb4 --- /dev/null +++ b/tests/unit/test_layout.py @@ -0,0 +1,83 @@ +"""Tests for dash.layout — layout traversal and component lookup utilities.""" + +import pytest + +from dash import html, dcc +from dash.layout import ( + traverse, + find_component, + extract_text, + parse_wildcard_id, +) + + +@pytest.fixture +def sample_layout(): + return html.Div( + [ + html.Label("Name:", htmlFor="name-input"), + " ", + dcc.Input(id="name-input", value="World"), + html.Div( + [html.Span(id="deep-child", children="deep text")], + id="inner", + ), + ], + id="root", + ) + + +class TestTraverse: + def test_yields_all_components_with_correct_ancestors(self, sample_layout): + results = { + getattr(c, "id", None): len(ancestors) + for c, ancestors in traverse(sample_layout) + } + assert results["root"] == 0 + assert results["name-input"] == 1 + assert results["deep-child"] == 2 + + def test_empty_layout(self): + results = list(traverse(html.Div())) + assert len(results) == 1 # just the Div itself + + +class TestFindComponent: + def test_finds_by_string_id(self, sample_layout): + comp = find_component("deep-child", layout=sample_layout) + assert comp is not None and comp.id == "deep-child" + + def test_returns_none_for_missing_id(self, sample_layout): + assert find_component("nope", layout=sample_layout) is None + + def test_finds_by_dict_id(self): + layout = html.Div([html.Div(id={"type": "item", "index": 0})]) + assert find_component({"type": "item", "index": 0}, layout=layout) is not None + + +class TestExtractText: + def test_extracts_all_text_content(self, sample_layout): + assert extract_text(sample_layout) == "Name: deep text" + + def test_none_children(self): + assert extract_text(html.Div()) == "" + + +class TestParseWildcardId: + @pytest.mark.parametrize("wildcard", ["ALL", "MATCH", "ALLSMALLER"]) + def test_returns_dict_for_wildcard(self, wildcard): + result = parse_wildcard_id({"type": "input", "index": [wildcard]}) + assert result == {"type": "input", "index": [wildcard]} + + def test_parses_json_string(self): + result = parse_wildcard_id('{"type":"input","index":["ALL"]}') + assert result == {"type": "input", "index": ["ALL"]} + + def test_returns_none_for_plain_string(self): + assert parse_wildcard_id("my-dropdown") is None + + def test_returns_none_for_non_wildcard_dict(self): + assert parse_wildcard_id({"type": "input", "index": 0}) is None + + def test_returns_none_for_invalid_json(self): + assert parse_wildcard_id("{not valid}") is None diff --git a/tests/unit/test_pydantic_types.py b/tests/unit/test_pydantic_types.py new file mode 100644 index 0000000000..75d1dc7f41 --- /dev/null +++ b/tests/unit/test_pydantic_types.py @@ -0,0 +1,36 @@ +"""Tests for dash.types — Pydantic-compatible types and schemas.""" + +from pydantic import TypeAdapter + +from dash.types import NumberType, CallbackDispatchBody, CallbackDispatchResponse +from dash.development.base_component import Component + + +class TestNumberType: + def test_json_schema_is_number(self): + schema = TypeAdapter(NumberType).json_schema() + assert schema["type"] == "number" + + +class TestComponentPydanticSchema: + def test_produces_object_schema(self): + schema = TypeAdapter(Component).json_schema() + assert schema["type"] == "object" + assert "properties" in schema + + def test_schema_has_type_and_props(self): + schema = TypeAdapter(Component).json_schema() + props = schema["properties"] + assert "type" in props + assert "props" in props + + +class TestCallbackDispatchTypes: + def test_dispatch_body_schema(self): + schema = TypeAdapter(CallbackDispatchBody).json_schema() + assert "output" in schema["properties"] + assert "inputs" in schema["properties"] + + def test_dispatch_response_schema(self): + schema = TypeAdapter(CallbackDispatchResponse).json_schema() + assert "response" in schema["properties"] From 998d8d702a14c17a19fe4623c10e5bd56fc6ebde Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 1 Apr 2026 10:31:58 -0600 Subject: [PATCH 003/103] Extract get_layout() from serve_layout() --- dash/dash.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/dash/dash.py b/dash/dash.py index f0821abef2..9212754303 100644 --- a/dash/dash.py +++ b/dash/dash.py @@ -898,15 +898,22 @@ def index_string(self, value: str) -> None: self._index_string = value @with_app_context - def serve_layout(self): - layout = self._layout_value() + def get_layout(self): + """Return the resolved layout with all hooks applied. + This is the canonical way to obtain the app's layout — it + calls the layout function (if callable), includes extra + components, and runs layout hooks. + """ + layout = self._layout_value() for hook in self._hooks.get_hooks("layout"): layout = hook(layout) + return layout + def serve_layout(self): # TODO - Set browser cache limit - pass hash into frontend return self.backend.make_response( - to_json(layout), + to_json(self.get_layout()), mimetype="application/json", ) From 66eda33b1a28f9f7c93f8639c88bbcf21202705b Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 1 Apr 2026 10:46:25 -0600 Subject: [PATCH 004/103] Fix build issues for dash-table and dash-core-components --- components/dash-core-components/package.json | 4 ++-- components/dash-table/package.json | 2 +- dash/dash-renderer/babel.config.js | 2 +- dash/dash-renderer/package.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/components/dash-core-components/package.json b/components/dash-core-components/package.json index ffe7de1d2f..e430a00b6a 100644 --- a/components/dash-core-components/package.json +++ b/components/dash-core-components/package.json @@ -27,7 +27,7 @@ "build:js": "webpack --mode production", "build:backends": "dash-generate-components ./src/components dash_core_components -p package-info.json && cp dash_core_components_base/** dash_core_components/ && dash-generate-components ./src/components dash_core_components -p package-info.json -k RangeSlider,Slider,Dropdown,RadioItems,Checklist,DatePickerSingle,DatePickerRange,Input,Link --r-prefix 'dcc' --r-suggests 'dash,dashHtmlComponents,jsonlite,plotly' --jl-prefix 'dcc' && black dash_core_components", "build": "run-s prepublishOnly build:js build:backends", - "postbuild": "es-check es2015 dash_core_components/*.js", + "postbuild": "es-check es2017 dash_core_components/*.js", "build:watch": "watch 'npm run build' src", "format": "run-s private::format.*", "lint": "run-s private::lint.*" @@ -126,6 +126,6 @@ "react-dom": "16 - 19" }, "browserslist": [ - "last 10 years and not dead" + "last 11 years and not dead" ] } diff --git a/components/dash-table/package.json b/components/dash-table/package.json index 295517a4c9..fd905c6f40 100644 --- a/components/dash-table/package.json +++ b/components/dash-table/package.json @@ -119,6 +119,6 @@ "npm": ">=6.1.0" }, "browserslist": [ - "last 10 years and not dead" + "last 11 years and not dead" ] } diff --git a/dash/dash-renderer/babel.config.js b/dash/dash-renderer/babel.config.js index d7b0c89e8e..6e6cc5d957 100644 --- a/dash/dash-renderer/babel.config.js +++ b/dash/dash-renderer/babel.config.js @@ -3,7 +3,7 @@ module.exports = { '@babel/preset-typescript', ['@babel/preset-env', { "targets": { - "browsers": ["last 10 years and not dead"] + "browsers": ["last 11 years and not dead"] } }], '@babel/preset-react' diff --git a/dash/dash-renderer/package.json b/dash/dash-renderer/package.json index a404fa2425..b9d1965f0d 100644 --- a/dash/dash-renderer/package.json +++ b/dash/dash-renderer/package.json @@ -89,6 +89,6 @@ ], "prettier": "@plotly/prettier-config-dash", "browserslist": [ - "last 10 years and not dead" + "last 11 years and not dead" ] } From 0cdb67af951aebbcdd3a3622ead0c6228c08f98e Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 1 Apr 2026 15:13:51 -0600 Subject: [PATCH 005/103] Add CallbackDispatchBody type hints to dispatch methods --- dash/dash.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dash/dash.py b/dash/dash.py index 9212754303..225c36bb47 100644 --- a/dash/dash.py +++ b/dash/dash.py @@ -75,7 +75,7 @@ _import_layouts_from_pages, ) from ._jupyter import jupyter_dash, JupyterDisplayMode -from .types import RendererHooks +from .types import CallbackDispatchBody, RendererHooks RouteCallable = Callable[..., Any] @@ -1469,7 +1469,7 @@ def _inputs_to_vals(self, inputs): return inputs_to_vals(inputs) # pylint: disable=R0915 - def _initialize_context(self, body): + def _initialize_context(self, body: CallbackDispatchBody): """Initialize the global context for the request.""" adapter = self.backend.request_adapter() g = AttributeDict({}) @@ -1492,7 +1492,7 @@ def _initialize_context(self, body): g.updated_props = {} return g - def _prepare_callback(self, g, body): + def _prepare_callback(self, g, body: CallbackDispatchBody): """Prepare callback-related data.""" output = body["output"] try: From b64c3fee5d8bc118945dbdb2bb1e086fc9159717 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 1 Apr 2026 16:28:56 -0600 Subject: [PATCH 006/103] Use python3.8 compatible pydantic --- requirements/install.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/install.txt b/requirements/install.txt index f65522326e..119a8fe523 100644 --- a/requirements/install.txt +++ b/requirements/install.txt @@ -8,4 +8,4 @@ retrying nest-asyncio setuptools janus>=1.0.0 -pydantic>=2.12.5 +pydantic>=2.10 From a85aa6ccbdbfc82c66b87ccecd5d79add60f4bdc Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 1 Apr 2026 16:43:50 -0600 Subject: [PATCH 007/103] lint --- dash/development/base_component.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dash/development/base_component.py b/dash/development/base_component.py index 70ed17e9de..ca52837dfe 100644 --- a/dash/development/base_component.py +++ b/dash/development/base_component.py @@ -120,6 +120,7 @@ class Component(metaclass=ComponentMeta): @classmethod def __get_pydantic_core_schema__(cls, source_type, handler): from pydantic_core import core_schema + return core_schema.any_schema() @classmethod @@ -129,7 +130,9 @@ def __get_pydantic_json_schema__(cls, schema, handler): "type": "object", "properties": { "type": {"type": "string"}, - "namespace": {"type": "string", "enum": namespaces} if namespaces else {"type": "string"}, + "namespace": {"type": "string", "enum": namespaces} + if namespaces + else {"type": "string"}, "props": {"type": "object"}, }, } From 4ecaf7db2597b984ef3ecf17171f331b6db3812d Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 1 Apr 2026 17:03:03 -0600 Subject: [PATCH 008/103] Fix lint error on CI --- dash/development/base_component.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dash/development/base_component.py b/dash/development/base_component.py index ca52837dfe..d7a473c25e 100644 --- a/dash/development/base_component.py +++ b/dash/development/base_component.py @@ -118,13 +118,13 @@ class Component(metaclass=ComponentMeta): available_wildcard_properties: typing.List[str] @classmethod - def __get_pydantic_core_schema__(cls, source_type, handler): - from pydantic_core import core_schema + def __get_pydantic_core_schema__(cls, _source_type, _handler): + from pydantic_core import core_schema # pylint: disable=import-outside-toplevel return core_schema.any_schema() @classmethod - def __get_pydantic_json_schema__(cls, schema, handler): + def __get_pydantic_json_schema__(cls, _schema, _handler): namespaces = list(ComponentRegistry.namespace_to_package.keys()) return { "type": "object", From 069b0494a8b84b496f82e8fc7c51c14f825868b0 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Mon, 6 Apr 2026 12:00:13 -0600 Subject: [PATCH 009/103] Rename layout.py to _layout_utils.py --- dash/{layout.py => _layout_utils.py} | 0 tests/unit/test_layout.py | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename dash/{layout.py => _layout_utils.py} (100%) diff --git a/dash/layout.py b/dash/_layout_utils.py similarity index 100% rename from dash/layout.py rename to dash/_layout_utils.py diff --git a/tests/unit/test_layout.py b/tests/unit/test_layout.py index 76a72f7fb4..64fff724a1 100644 --- a/tests/unit/test_layout.py +++ b/tests/unit/test_layout.py @@ -1,9 +1,9 @@ -"""Tests for dash.layout — layout traversal and component lookup utilities.""" +"""Tests for dash._layout_utils — layout traversal and component lookup utilities.""" import pytest from dash import html, dcc -from dash.layout import ( +from dash._layout_utils import ( traverse, find_component, extract_text, From d684507fe3e29c8aa2225135e632f79faafb114d Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Mon, 6 Apr 2026 13:41:38 -0600 Subject: [PATCH 010/103] Make NumberType import backwards-compatible in generated components --- dash/development/_py_components_generation.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/dash/development/_py_components_generation.py b/dash/development/_py_components_generation.py index b597283a04..2fd6a6cdb7 100644 --- a/dash/development/_py_components_generation.py +++ b/dash/development/_py_components_generation.py @@ -24,7 +24,12 @@ import typing # noqa: F401 from typing_extensions import TypedDict, NotRequired, Literal # noqa: F401 from dash.development.base_component import Component, _explicitize_args -from dash.types import NumberType # noqa: F401 +try: + from dash.types import NumberType # noqa: F401 +except ImportError: + NumberType = typing.Union[ # noqa: F401 + typing.SupportsFloat, typing.SupportsInt, typing.SupportsComplex + ] {custom_imports} ComponentSingleType = typing.Union[str, int, float, Component, None] ComponentType = typing.Union[ From 17a754164773824bd24113ca705f5aea26e7df66 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Mon, 6 Apr 2026 14:34:19 -0600 Subject: [PATCH 011/103] Fix type checker for NumberType implementation --- dash/development/_py_components_generation.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/dash/development/_py_components_generation.py b/dash/development/_py_components_generation.py index 2fd6a6cdb7..1690a1744e 100644 --- a/dash/development/_py_components_generation.py +++ b/dash/development/_py_components_generation.py @@ -22,14 +22,18 @@ import_string = """# AUTO GENERATED FILE - DO NOT EDIT import typing # noqa: F401 +from typing import TYPE_CHECKING # noqa: F401 from typing_extensions import TypedDict, NotRequired, Literal # noqa: F401 from dash.development.base_component import Component, _explicitize_args -try: +if TYPE_CHECKING: from dash.types import NumberType # noqa: F401 -except ImportError: - NumberType = typing.Union[ # noqa: F401 - typing.SupportsFloat, typing.SupportsInt, typing.SupportsComplex - ] +else: + try: + from dash.types import NumberType # noqa: F401 + except ImportError: + NumberType = typing.Union[ # noqa: F401 + typing.SupportsFloat, typing.SupportsInt, typing.SupportsComplex + ] {custom_imports} ComponentSingleType = typing.Union[str, int, float, Component, None] ComponentType = typing.Union[ From dc35bff200091e79701c808fe39ee473260931bd Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Tue, 7 Apr 2026 10:30:13 -0600 Subject: [PATCH 012/103] Clean up import for pyright --- dash/development/_py_components_generation.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/dash/development/_py_components_generation.py b/dash/development/_py_components_generation.py index 1690a1744e..87211c7cc8 100644 --- a/dash/development/_py_components_generation.py +++ b/dash/development/_py_components_generation.py @@ -22,18 +22,17 @@ import_string = """# AUTO GENERATED FILE - DO NOT EDIT import typing # noqa: F401 -from typing import TYPE_CHECKING # noqa: F401 from typing_extensions import TypedDict, NotRequired, Literal # noqa: F401 from dash.development.base_component import Component, _explicitize_args -if TYPE_CHECKING: +try: from dash.types import NumberType # noqa: F401 -else: - try: - from dash.types import NumberType # noqa: F401 - except ImportError: - NumberType = typing.Union[ # noqa: F401 - typing.SupportsFloat, typing.SupportsInt, typing.SupportsComplex - ] +except ImportError: + # Backwards compatibility for dash<=4.1.0 + if typing.TYPE_CHECKING: + raise + NumberType = typing.Union[ # noqa: F401 + typing.SupportsFloat, typing.SupportsInt, typing.SupportsComplex + ] {custom_imports} ComponentSingleType = typing.Union[str, int, float, Component, None] ComponentType = typing.Union[ From 00eb203db2f25571f39c9965d039a433312d274e Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 1 Apr 2026 10:37:02 -0600 Subject: [PATCH 013/103] Add callback adapter core for MCP tool generation --- dash/_callback.py | 12 +- dash/mcp/primitives/tools/callback_adapter.py | 461 ++++++++++++++++++ .../tools/callback_adapter_collection.py | 154 ++++++ dash/mcp/primitives/tools/callback_utils.py | 36 ++ .../primitives/tools/descriptions/__init__.py | 7 + .../tools/input_schemas/__init__.py | 5 + .../tools/output_schemas/__init__.py | 5 + dash/mcp/types/__init__.py | 26 + dash/mcp/types/callback_types.py | 33 ++ dash/mcp/types/component_types.py | 20 + dash/mcp/types/exceptions.py | 30 ++ dash/mcp/types/typing_utils.py | 28 ++ requirements/install.txt | 1 + tests/unit/mcp/conftest.py | 6 + tests/unit/mcp/tools/test_callback_adapter.py | 227 +++++++++ .../tools/test_callback_adapter_collection.py | 145 ++++++ 16 files changed, 1193 insertions(+), 3 deletions(-) create mode 100644 dash/mcp/primitives/tools/callback_adapter.py create mode 100644 dash/mcp/primitives/tools/callback_adapter_collection.py create mode 100644 dash/mcp/primitives/tools/callback_utils.py create mode 100644 dash/mcp/primitives/tools/descriptions/__init__.py create mode 100644 dash/mcp/primitives/tools/input_schemas/__init__.py create mode 100644 dash/mcp/primitives/tools/output_schemas/__init__.py create mode 100644 dash/mcp/types/__init__.py create mode 100644 dash/mcp/types/callback_types.py create mode 100644 dash/mcp/types/component_types.py create mode 100644 dash/mcp/types/exceptions.py create mode 100644 dash/mcp/types/typing_utils.py create mode 100644 tests/unit/mcp/conftest.py create mode 100644 tests/unit/mcp/tools/test_callback_adapter.py create mode 100644 tests/unit/mcp/tools/test_callback_adapter_collection.py diff --git a/dash/_callback.py b/dash/_callback.py index a0d5a1021d..96a5e8f16c 100644 --- a/dash/_callback.py +++ b/dash/_callback.py @@ -39,6 +39,7 @@ from .background_callback.managers import BaseBackgroundCallbackManager from ._callback_context import context_value +from .types import CallbackDispatchResponse from ._no_update import NoUpdate from . import _validate @@ -85,6 +86,7 @@ def callback( hidden: Optional[bool] = None, websocket: Optional[bool] = False, persistent: Optional[bool] = False, + mcp_enabled: bool = True, **_kwargs, ) -> Callable[[Callable[Params, ReturnVar]], Callable[Params, ReturnVar]]: """ @@ -242,6 +244,7 @@ def callback( hidden=hidden, websocket=websocket, persistent=persistent, + mcp_enabled=mcp_enabled, ) return cast( @@ -295,6 +298,7 @@ def insert_callback( hidden=None, websocket=False, persistent=False, + mcp_enabled=True, ) -> str: if prevent_initial_call is None: prevent_initial_call = config_prevent_initial_callbacks @@ -338,6 +342,7 @@ def insert_callback( "allow_dynamic_callbacks": dynamic_creator, "no_output": no_output, "websocket": websocket, + "mcp_enabled": mcp_enabled, } callback_list.append(callback_spec) @@ -546,7 +551,7 @@ def _prepare_response( output_value, output_spec, multi, - response, + response: CallbackDispatchResponse, callback_ctx, app, original_packages, @@ -677,6 +682,7 @@ def register_callback( hidden=_kwargs.get("hidden", None), websocket=_kwargs.get("websocket", False), persistent=_kwargs.get("persistent", False), + mcp_enabled=_kwargs.get("mcp_enabled", True), ) # pylint: disable=too-many-locals @@ -711,7 +717,7 @@ def add_context(*args, **kwargs): args, kwargs, inputs_state_indices, has_output, insert_output ) - response: dict = {"multi": True} # type: ignore + response: CallbackDispatchResponse = {"multi": True} jsonResponse: Optional[str] = None try: if background is not None: @@ -783,7 +789,7 @@ async def async_add_context(*args, **kwargs): args, kwargs, inputs_state_indices, has_output, insert_output ) - response = {"multi": True} + response: CallbackDispatchResponse = {"multi": True} try: if background is not None: diff --git a/dash/mcp/primitives/tools/callback_adapter.py b/dash/mcp/primitives/tools/callback_adapter.py new file mode 100644 index 0000000000..0f50d15c03 --- /dev/null +++ b/dash/mcp/primitives/tools/callback_adapter.py @@ -0,0 +1,461 @@ +"""Adapter: Dash callback → MCP tool interface. + +Wraps a raw ``callback_map`` entry and exposes MCP-facing +properties (tool name, params, outputs) lazily. +""" + +from __future__ import annotations + +import inspect +import json +import typing +from functools import cached_property +from typing import Any + +from mcp.types import Tool + +from dash import get_app +from dash.layout import ( + _WILDCARD_VALUES, + find_component, + find_matching_components, + parse_wildcard_id, +) +from dash.mcp.types import is_nullable +from dash._grouping import flatten_grouping +from dash._utils import clean_property_name, split_callback_id +from dash.mcp.types import MCPInput, MCPOutput +from .callback_utils import run_callback +from .descriptions import build_tool_description +from .input_schemas import get_input_schema +from .output_schemas import get_output_schema + + +class CallbackAdapter: + """Adapts a single Dash callback_map entry to the MCP tool interface.""" + + def __init__(self, callback_output_id: str): + self._output_id = callback_output_id + + # ------------------------------------------------------------------- + # Projections + # ------------------------------------------------------------------- + + @cached_property + def as_mcp_tool(self) -> Tool: + """Stub — will be implemented in a future PR.""" + raise NotImplementedError("as_mcp_tool will be implemented in a future PR.") + + def as_callback_body(self, kwargs: dict[str, Any]) -> dict[str, Any]: + """Transforms the given kwargs to a dict suitable for calling this callback. + + Mirrors how the Dash renderer assembles the callback payload — + see ``fillVals()`` in ``dash-renderer/src/actions/callbacks.ts``. + + For pattern-matching callbacks, wildcard deps are expanded into + nested arrays with concrete component IDs. + """ + coerced = {k: _coerce_value(v) for k, v in kwargs.items()} + + raw_inputs = self._cb_info.get("inputs", []) + raw_state = self._cb_info.get("state", []) + n_deps = len(raw_inputs) + len(raw_state) + + flat_values = [None] * n_deps + for i, name in enumerate(self._param_names): + if i < n_deps and name in coerced: + flat_values[i] = coerced[name] + + inputs_with_values = [ + _expand_dep(dep, flat_values[i]) for i, dep in enumerate(raw_inputs) + ] + state_with_values = [ + _expand_dep(dep, flat_values[len(raw_inputs) + i]) + for i, dep in enumerate(raw_state) + ] + + outputs_spec = _expand_output_spec( + self._output_id, self._cb_info, inputs_with_values + ) + + # changedPropIds: only inputs with non-None values. + # This determines ctx.triggered_id in the callback. + changed = [] + for entry in inputs_with_values: + if isinstance(entry, dict) and entry.get("value") is not None: + eid = entry.get("id") + if isinstance(eid, dict): + changed.append( + f"{json.dumps(eid, sort_keys=True)}.{entry['property']}" + ) + elif isinstance(eid, str): + changed.append(f"{eid}.{entry['property']}") + + return { + "output": self._output_id, + "outputs": outputs_spec, + "inputs": inputs_with_values, + "state": state_with_values, + "changedPropIds": changed, + } + + # ------------------------------------------------------------------- + # Public identity and metadata + # ------------------------------------------------------------------- + + @cached_property + def is_valid(self) -> bool: + """Whether all input components exist in the layout.""" + all_deps = self._cb_info.get("inputs", []) + self._cb_info.get("state", []) + for dep in all_deps: + dep_id = str(dep.get("id", "")) + if dep_id.startswith("{"): + continue + if find_component(dep_id) is None: + return False + return True + + @property + def output_id(self) -> str: + return self._output_id + + @property + def tool_name(self) -> str: + return get_app().mcp_callback_map._tool_names_map[self._output_id] + + @cached_property + def prevents_initial_call(self) -> bool: + for cb in get_app()._callback_list: + if cb["output"] == self._output_id: + return cb.get("prevent_initial_call", False) + return False + + # ------------------------------------------------------------------- + # Private: computed fields for the MCP Tool + # ------------------------------------------------------------------- + + @cached_property + def _description(self) -> str: + return build_tool_description(self.outputs, self._docstring) + + @cached_property + def _input_schema(self) -> dict[str, Any]: + properties = {p["name"]: get_input_schema(p) for p in self.inputs} + required = [p["name"] for p in self.inputs if p["required"]] + + input_schema: dict[str, Any] = {"type": "object", "properties": properties} + if required: + input_schema["required"] = required + return input_schema + + @cached_property + def _output_schema(self) -> dict[str, Any]: + return get_output_schema() + + # ------------------------------------------------------------------- + # Private: callback metadata + # ------------------------------------------------------------------- + + @cached_property + def _docstring(self) -> str | None: + return getattr(self._original_func, "__doc__", None) + + @cached_property + def _initial_output(self) -> dict[str, dict[str, Any]]: + """Run this callback with initial input values. + + Returns the ``response`` portion of the dispatch result: + ``{component_id: {property: value}}``. + + Skipped for callbacks with ``prevent_initial_call=True``, + matching how the Dash renderer skips them on page load. + """ + if self.prevents_initial_call: + return {} + + callback_map = get_app().mcp_callback_map + kwargs = {} + for p in self.inputs: + upstream = callback_map.find_by_output(p["id_and_prop"]) + if upstream is self: + kwargs[p["name"]] = getattr( + find_component(p["component_id"]), p["property"], None + ) + else: + kwargs[p["name"]] = callback_map.get_initial_value(p["id_and_prop"]) + try: + result = run_callback(self, kwargs) + return result.get("response", {}) + except Exception: + return {} + + def initial_output_value(self, id_and_prop: str) -> Any: + """Return the initial value for a specific output ``"component_id.property"``.""" + component_id, prop = id_and_prop.rsplit(".", 1) + return self._initial_output.get(component_id, {}).get(prop) + + @cached_property + def outputs(self) -> list[MCPOutput]: + if self._cb_info.get("no_output"): + return [] + parsed = split_callback_id(self._output_id) + if isinstance(parsed, dict): + parsed = [parsed] + result: list[MCPOutput] = [] + for p in parsed: + comp_id = p["id"] + prop = clean_property_name(p["property"]) + id_and_prop = f"{comp_id}.{prop}" + comp = find_component(comp_id) + result.append( + { + "id_and_prop": id_and_prop, + "component_id": comp_id, + "property": prop, + "component_type": getattr(comp, "_type", None), + "initial_value": self.initial_output_value(id_and_prop), + "tool_name": self.tool_name, + } + ) + return result + + @cached_property + def inputs(self) -> list[MCPInput]: + all_deps = self._cb_info.get("inputs", []) + self._cb_info.get("state", []) + callback_map = get_app().mcp_callback_map + + result: list[MCPInput] = [] + for dep, name, annotation in zip( + all_deps, self._param_names, self._param_annotations + ): + comp_id = str(dep.get("id", "unknown")) + comp = find_component(comp_id) + prop = dep.get("property", "unknown") + id_and_prop = f"{comp_id}.{prop}" + + upstream_cb = callback_map.find_by_output(id_and_prop) + upstream_output = None + if upstream_cb is not None and upstream_cb is not self: + if not upstream_cb.prevents_initial_call: + for out in upstream_cb.outputs: + if out["id_and_prop"] == id_and_prop: + upstream_output = out + break + + initial_value = ( + upstream_output["initial_value"] + if upstream_output is not None + else getattr(comp, prop, None) + ) + + if annotation is not None: + required = not is_nullable(annotation) + else: + required = initial_value is not None + + result.append( + { + "name": name, + "id_and_prop": id_and_prop, + "component_id": comp_id, + "property": prop, + "annotation": annotation, + "component_type": getattr(comp, "_type", None), + "component": comp, + "required": required, + "initial_value": initial_value, + "upstream_output": upstream_output, + } + ) + return result + + # ------------------------------------------------------------------- + # Helpers + # ------------------------------------------------------------------- + + @cached_property + def _cb_info(self) -> dict[str, Any]: + return get_app().callback_map[self._output_id] + + @cached_property + def _original_func(self) -> Any | None: + func = self._cb_info.get("callback") + return getattr(func, "__wrapped__", func) + + @cached_property + def _func_signature(self) -> inspect.Signature | None: + if self._original_func is None: + return None + try: + return inspect.signature(self._original_func) + except (ValueError, TypeError): + return None + + @cached_property + def _dep_param_map(self) -> list[tuple[str, str]]: + """(func_param_name, mcp_param_name) per dep, in dep order. + + Single source of truth for mapping deps to param names. + All dict-vs-list branching is confined here. + """ + all_deps = self._cb_info.get("inputs", []) + self._cb_info.get("state", []) + n_deps = len(all_deps) + indices = self._cb_info.get("inputs_state_indices") + + if isinstance(indices, dict): + entries: list[tuple[int, str, str]] = [] + for func_name, idx in indices.items(): + positions = flatten_grouping(idx) + if len(positions) == 1: + entries.append((positions[0], func_name, func_name)) + else: + for pos in positions: + dep = all_deps[pos] if pos < n_deps else {} + comp_id = str(dep.get("id", "unknown")).replace("-", "_") + prop = dep.get("property", "unknown") + entries.append( + (pos, func_name, f"{func_name}_{comp_id}__{prop}") + ) + entries.sort(key=lambda e: e[0]) + result = [(f, m) for _, f, m in entries] + elif self._func_signature is not None: + names = list(self._func_signature.parameters.keys()) + result = [(n, n) for n in names] + else: + result = [] + + while len(result) < n_deps: + fallback = f"param_{len(result)}" + result.append((fallback, fallback)) + return result + + @cached_property + def _param_names(self) -> list[str]: + """MCP param name per dep, in dep order.""" + return [mcp for _, mcp in self._dep_param_map] + + @cached_property + def _param_annotations(self) -> list[Any | None]: + """One annotation per dep, in dep order.""" + if self._func_signature is None: + return [None] * len(self._dep_param_map) + try: + hints = typing.get_type_hints(self._original_func) + except Exception: + hints = getattr(self._original_func, "__annotations__", {}) + return [hints.get(func_name) for func_name, _ in self._dep_param_map] + + +def _expand_dep(dep: dict, value: Any) -> Any: + """Expand a dependency into the dispatch format. + + For regular deps, returns ``{id, property, value}``. + For ALL/ALLSMALLER: passes through the list of ``{id, property, value}`` dicts. + For MATCH: passes through the single ``{id, property, value}`` dict. + """ + pattern = parse_wildcard_id(dep.get("id", "")) + if pattern is None: + return {**dep, "value": value} + + # LLM provides browser-like format + if isinstance(value, list): + return value + if isinstance(value, dict) and "id" in value: + return value + return {**dep, "value": value} + + +def _expand_output_spec(output_id: str, cb_info: dict, resolved_inputs: list) -> Any: + """Build the outputs spec, expanding wildcards to concrete IDs. + + For wildcard outputs, derives concrete IDs from the resolved inputs. + The browser does the same: input and output wildcards resolve against + the same set of matching components. + """ + if cb_info.get("no_output"): + return [] + + parsed = split_callback_id(output_id) + if isinstance(parsed, dict): + parsed = [parsed] + + results = [] + for p in parsed: + pid = p["id"] + prop = clean_property_name(p["property"]) + pattern = parse_wildcard_id(pid) + if pattern is not None: + concrete_ids = _derive_output_ids(pattern, resolved_inputs) + if not concrete_ids: + concrete_ids = [comp.id for comp in find_matching_components(pattern)] + expanded = [{"id": cid, "property": prop} for cid in concrete_ids] + # ALL/ALLSMALLER → nested list; MATCH → single dict + if len(expanded) == 1: + results.append(expanded[0]) + else: + results.append(expanded) + else: + results.append({"id": pid, "property": prop}) + + if len(results) == 1: + return results[0] + return results + + +def _derive_output_ids( + output_pattern: dict, resolved_inputs: list +) -> list[dict] | None: + """Derive concrete output IDs from the resolved input entries. + + Extracts the wildcard key values from the LLM-provided concrete + input IDs and substitutes them into the output pattern. + """ + wildcard_keys = [ + k + for k, v in output_pattern.items() + if isinstance(v, list) and len(v) == 1 and v[0] in _WILDCARD_VALUES + ] + if not wildcard_keys: + return None + + def _substitute(item_id: dict) -> dict | None: + if not isinstance(item_id, dict): + return None + output_id = dict(output_pattern) + for wk in wildcard_keys: + if wk in item_id: + output_id[wk] = item_id[wk] + return output_id + + for entry in resolved_inputs: + # ALL/ALLSMALLER: nested array of {id, property, value} dicts + if isinstance(entry, list) and entry: + concrete_ids = [] + for item in entry: + out = _substitute(item.get("id")) + if out: + concrete_ids.append(out) + if concrete_ids: + return concrete_ids + # MATCH: single {id, property, value} dict + elif isinstance(entry, dict) and isinstance(entry.get("id"), dict): + out = _substitute(entry["id"]) + if out: + return [out] + + return None + + +def _coerce_value(value: Any) -> Any: + """Parse JSON strings back to Python objects. + + MCP tool parameters arrive as strings. This recovers the + intended type (list, dict, number, bool, null) via json.loads. + Plain strings that aren't valid JSON pass through unchanged. + """ + if not isinstance(value, str): + return value + try: + return json.loads(value) + except (json.JSONDecodeError, ValueError): + return value diff --git a/dash/mcp/primitives/tools/callback_adapter_collection.py b/dash/mcp/primitives/tools/callback_adapter_collection.py new file mode 100644 index 0000000000..60e9e2efe5 --- /dev/null +++ b/dash/mcp/primitives/tools/callback_adapter_collection.py @@ -0,0 +1,154 @@ +"""Collection of CallbackAdapters with cross-adapter queries. + +Stored as a singleton on ``app.mcp_callback_map``. +""" + +from __future__ import annotations + +import hashlib +import re +from functools import cached_property +from typing import Any + +from mcp.types import Tool + +from dash import get_app +from dash._utils import clean_property_name, split_callback_id +from dash.layout import extract_text, find_component, traverse +from .callback_adapter import CallbackAdapter + + +class CallbackAdapterCollection: + def __init__(self, app): + callback_map = getattr(app, "callback_map", {}) + + raw: list[tuple[str, dict]] = [] + for output_id, cb_info in callback_map.items(): + if cb_info.get("mcp_enabled") is False: + continue + if "callback" not in cb_info: + continue + raw.append((output_id, cb_info)) + + self._tool_names_map = self._build_tool_names(raw) + self._callbacks = [ + CallbackAdapter(callback_output_id=output_id) + for output_id in self._tool_names_map + ] + # TODO: enable_mcp_server() will replace this with a direct assignment on app + app.mcp_callback_map = self + + @staticmethod + def _sanitize_name(name: str) -> str: + + max_len = 64 + sanitized = re.sub(r"[^a-zA-Z0-9_]", "_", name) + sanitized = re.sub(r"_+", "_", sanitized).strip("_") + if sanitized and sanitized[0].isdigit(): + sanitized = "cb_" + sanitized + full = sanitized or "unnamed_callback" + if len(full) <= max_len: + return full + hash_suffix = hashlib.sha256(full.encode()).hexdigest()[:8] + truncated = sanitized[: max_len - 9].rstrip("_") + return f"{truncated}_{hash_suffix}" + + @classmethod + def _build_tool_names(cls, raw: list[tuple[str, dict]]) -> dict[str, str]: + func_name_counts: dict[str, int] = {} + for _output_id, cb_info in raw: + func = cb_info.get("callback") + original = getattr(func, "__wrapped__", func) + fn = getattr(original, "__name__", "") or "" + func_name_counts[fn] = func_name_counts.get(fn, 0) + 1 + + name_map: dict[str, str] = {} + for output_id, cb_info in raw: + func = cb_info.get("callback") + original = getattr(func, "__wrapped__", func) + fn = getattr(original, "__name__", "") or "" + raw_name = fn if fn and func_name_counts[fn] == 1 else output_id + name_map[output_id] = cls._sanitize_name(raw_name) + return name_map + + def __iter__(self): + return iter(self._callbacks) + + def __len__(self): + return len(self._callbacks) + + def __getitem__(self, index): + return self._callbacks[index] + + def find_by_tool_name(self, name: str) -> CallbackAdapter | None: + for cb in self._callbacks: + if cb.tool_name == name: + return cb + return None + + def find_by_output(self, id_and_prop: str) -> CallbackAdapter | None: + """Find the adapter that outputs to ``id_and_prop`` (``"component_id.property"``).""" + for cb in self._callbacks: + try: + parsed = split_callback_id(cb.output_id) + except ValueError: + continue + if isinstance(parsed, dict): + parsed = [parsed] + for p in parsed: + if f"{p['id']}.{clean_property_name(p['property'])}" == id_and_prop: + return cb + return None + + def get_initial_value(self, id_and_prop: str) -> Any: + """Return the initial value for ``id_and_prop`` (``"component_id.property"``). + + If a callback outputs to this property, runs it (recursively + resolving its inputs). Otherwise returns the layout default. + """ + upstream_cb = self.find_by_output(id_and_prop) + if upstream_cb is not None: + return upstream_cb.initial_output_value(id_and_prop) + else: + component_id, prop = id_and_prop.rsplit(".", 1) + layout_component = find_component(component_id) + return getattr(layout_component, prop, None) + + def as_mcp_tools(self) -> list[Tool]: + """Stub — will be implemented in a future PR.""" + raise NotImplementedError("as_mcp_tools will be implemented in a future PR.") + + @property + def tool_names(self) -> set[str]: + return set(self._tool_names_map.values()) + + @cached_property + def component_label_map(self) -> dict[str, list[str]]: + """Map component ID → list of label texts from html.Label containers + and/or `htmlFor` associations. + """ + layout = get_app().get_layout() + if layout is None: + return {} + + labels: dict[str, list[str]] = {} + for comp, ancestors in traverse(layout): + if getattr(comp, "_type", None) == "Label": + html_for = getattr(comp, "htmlFor", None) + if html_for is not None: + text = extract_text(comp) + if text: + labels.setdefault(str(html_for), []).append(text) + + comp_id = getattr(comp, "id", None) + if comp_id is not None: + for ancestor in reversed(ancestors): + if getattr(ancestor, "_type", None) == "Label": + text = extract_text(ancestor) + if text: + sid = str(comp_id) + if text not in labels.get(sid, []): + labels.setdefault(sid, []).append(text) + break + + return labels diff --git a/dash/mcp/primitives/tools/callback_utils.py b/dash/mcp/primitives/tools/callback_utils.py new file mode 100644 index 0000000000..ec157b6037 --- /dev/null +++ b/dash/mcp/primitives/tools/callback_utils.py @@ -0,0 +1,36 @@ +"""Callback introspection utilities for MCP tools.""" + +from __future__ import annotations + +import json +from typing import TYPE_CHECKING, Any + +from dash import get_app + +if TYPE_CHECKING: + from .callback_adapter import CallbackAdapter + + +def run_callback(callback: CallbackAdapter, kwargs: dict[str, Any]) -> dict[str, Any]: + """Execute a callback via Dash's dispatch pipeline.""" + from dash.mcp.types import CallbackExecutionError + + body = callback.as_callback_body(kwargs) + + app = get_app() + with app.server.test_request_context( + "/_dash-update-component", + method="POST", + data=json.dumps(body, default=str), + content_type="application/json", + ): + response = app.dispatch() + + response_text = response.get_data(as_text=True) + if response.status_code != 200: + raise CallbackExecutionError( + f"Callback {callback.output_id} failed " + f"(HTTP {response.status_code}): {response_text[:500]}" + ) + + return json.loads(response_text) diff --git a/dash/mcp/primitives/tools/descriptions/__init__.py b/dash/mcp/primitives/tools/descriptions/__init__.py new file mode 100644 index 0000000000..67ec78c9ff --- /dev/null +++ b/dash/mcp/primitives/tools/descriptions/__init__.py @@ -0,0 +1,7 @@ +"""Stub — real implementation in a later PR.""" + + +def build_tool_description(outputs, docstring=None): + if docstring: + return docstring.strip() + return "Dash callback" diff --git a/dash/mcp/primitives/tools/input_schemas/__init__.py b/dash/mcp/primitives/tools/input_schemas/__init__.py new file mode 100644 index 0000000000..f306042a0c --- /dev/null +++ b/dash/mcp/primitives/tools/input_schemas/__init__.py @@ -0,0 +1,5 @@ +"""Stub — real implementation in a later PR.""" + + +def get_input_schema(param): + return {} diff --git a/dash/mcp/primitives/tools/output_schemas/__init__.py b/dash/mcp/primitives/tools/output_schemas/__init__.py new file mode 100644 index 0000000000..d2d70c3552 --- /dev/null +++ b/dash/mcp/primitives/tools/output_schemas/__init__.py @@ -0,0 +1,5 @@ +"""Stub — real implementation in a later PR.""" + + +def get_output_schema(): + return {} diff --git a/dash/mcp/types/__init__.py b/dash/mcp/types/__init__.py new file mode 100644 index 0000000000..af588e0808 --- /dev/null +++ b/dash/mcp/types/__init__.py @@ -0,0 +1,26 @@ +"""MCP types, exceptions, and typing utilities.""" + +from dash.mcp.types.callback_types import MCPInput, MCPOutput +from dash.mcp.types.component_types import ( + ComponentPropertyInfo, + ComponentQueryResult, +) +from dash.mcp.types.exceptions import ( + CallbackExecutionError, + InvalidParamsError, + MCPError, + ToolNotFoundError, +) +from dash.mcp.types.typing_utils import is_nullable + +__all__ = [ + "CallbackExecutionError", + "ComponentPropertyInfo", + "ComponentQueryResult", + "InvalidParamsError", + "MCPError", + "MCPInput", + "MCPOutput", + "ToolNotFoundError", + "is_nullable", +] diff --git a/dash/mcp/types/callback_types.py b/dash/mcp/types/callback_types.py new file mode 100644 index 0000000000..9c65dcb9d8 --- /dev/null +++ b/dash/mcp/types/callback_types.py @@ -0,0 +1,33 @@ +"""Typed dicts for MCP callback adapter data.""" + +from __future__ import annotations + +from typing import Any + +from typing_extensions import TypedDict + + +class MCPOutput(TypedDict): + """A single callback output, with component type and initial value resolved.""" + + id_and_prop: str + component_id: str + property: str + component_type: str | None + initial_value: Any + tool_name: str + + +class MCPInput(TypedDict): + """A single callback parameter (input or state), fully resolved.""" + + name: str + id_and_prop: str + component_id: str + property: str + annotation: Any | None + component_type: str | None + component: Any | None + required: bool + initial_value: Any + upstream_output: MCPOutput | None diff --git a/dash/mcp/types/component_types.py b/dash/mcp/types/component_types.py new file mode 100644 index 0000000000..0cac3ad689 --- /dev/null +++ b/dash/mcp/types/component_types.py @@ -0,0 +1,20 @@ +"""Typed dicts for component data in MCP.""" + +from __future__ import annotations + +from typing import Any + +from typing_extensions import NotRequired, TypedDict + + +class ComponentPropertyInfo(TypedDict): + initial_value: Any + modified_by_tool: list[str] + input_to_tool: list[str] + + +class ComponentQueryResult(TypedDict): + component_id: str + component_type: str + label: NotRequired[list[str] | None] + properties: dict[str, ComponentPropertyInfo] diff --git a/dash/mcp/types/exceptions.py b/dash/mcp/types/exceptions.py new file mode 100644 index 0000000000..7fb962db85 --- /dev/null +++ b/dash/mcp/types/exceptions.py @@ -0,0 +1,30 @@ +"""MCP error types with JSON-RPC error codes.""" + +from __future__ import annotations + + +class MCPError(Exception): + """Base MCP error carrying a JSON-RPC error code.""" + + code = -32603 + + def __init__(self, message: str): + super().__init__(message) + + +class ToolNotFoundError(MCPError): + """Tool name not found in the callback registry.""" + + code = -32601 + + +class InvalidParamsError(MCPError): + """Invalid or missing parameters for a tool call.""" + + code = -32602 + + +class CallbackExecutionError(MCPError): + """Callback raised an exception during execution.""" + + code = -32603 diff --git a/dash/mcp/types/typing_utils.py b/dash/mcp/types/typing_utils.py new file mode 100644 index 0000000000..9a96d4135d --- /dev/null +++ b/dash/mcp/types/typing_utils.py @@ -0,0 +1,28 @@ +"""Shared typing utilities for the MCP layer.""" + +from __future__ import annotations + +import typing +from typing import Any + + +def is_nullable(annotation: Any) -> bool: + """Check if a type annotation includes NoneType (is nullable/Optional).""" + origin = getattr(annotation, "__origin__", None) + args = getattr(annotation, "__args__", ()) + + _is_union = origin is typing.Union + if not _is_union: + try: + import types as _types + + if isinstance(annotation, _types.UnionType): + _is_union = True + args = annotation.__args__ + except AttributeError: + pass + + if _is_union and args: + return type(None) in args + + return False diff --git a/requirements/install.txt b/requirements/install.txt index 119a8fe523..a976ab9010 100644 --- a/requirements/install.txt +++ b/requirements/install.txt @@ -9,3 +9,4 @@ nest-asyncio setuptools janus>=1.0.0 pydantic>=2.10 +mcp>=1.0.0; python_version>="3.10" diff --git a/tests/unit/mcp/conftest.py b/tests/unit/mcp/conftest.py new file mode 100644 index 0000000000..437a71db5c --- /dev/null +++ b/tests/unit/mcp/conftest.py @@ -0,0 +1,6 @@ +import sys + +collect_ignore_glob = [] + +if sys.version_info < (3, 10): + collect_ignore_glob.append("*") diff --git a/tests/unit/mcp/tools/test_callback_adapter.py b/tests/unit/mcp/tools/test_callback_adapter.py new file mode 100644 index 0000000000..91808d304e --- /dev/null +++ b/tests/unit/mcp/tools/test_callback_adapter.py @@ -0,0 +1,227 @@ +"""Tests for CallbackAdapter.""" + +import pytest +from dash import Dash, Input, Output, dcc, html +from dash._get_app import app_context + +from dash.mcp.primitives.tools.callback_adapter_collection import ( + CallbackAdapterCollection, +) + + +# --------------------------------------------------------------------------- +# Fixtures +# --------------------------------------------------------------------------- + + +@pytest.fixture +def simple_app(): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Label("Your Name", htmlFor="inp"), + dcc.Input(id="inp", type="text"), + html.Div(id="out"), + ] + ) + + @app.callback(Output("out", "children"), Input("inp", "value")) + def update(val): + """Update output.""" + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + return app + + +@pytest.fixture +def duplicate_names_app(): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id="in1"), + html.Div(id="out1"), + html.Div(id="in2"), + html.Div(id="out2"), + ] + ) + + @app.callback(Output("out1", "children"), Input("in1", "children")) + def cb(v): + return v + + @app.callback(Output("out2", "children"), Input("in2", "children")) + def cb(v): # noqa: F811 + return v + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + return app + + +# --------------------------------------------------------------------------- +# Tests +# --------------------------------------------------------------------------- + + +class TestFromApp: + def test_returns_list(self, simple_app): + assert len(app_context.get().mcp_callback_map) == 1 + + def test_excludes_clientside(self): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Button(id="btn"), + html.Div(id="cs-out"), + html.Div(id="srv-out"), + ] + ) + app.clientside_callback( + "function(n) { return n; }", + Output("cs-out", "children"), + Input("btn", "n_clicks"), + ) + + @app.callback(Output("srv-out", "children"), Input("btn", "n_clicks")) + def server_cb(n): + return str(n) + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + + names = [a.tool_name for a in app.mcp_callback_map] + assert names == ["server_cb"] + + def test_excludes_mcp_disabled(self): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="inp"), + html.Div(id="out1"), + html.Div(id="out2"), + ] + ) + + @app.callback(Output("out1", "children"), Input("inp", "value")) + def visible(val): + return val + + @app.callback( + Output("out2", "children"), Input("inp", "value"), mcp_enabled=False + ) + def hidden(val): + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + names = [a.tool_name for a in app.mcp_callback_map] + assert "visible" in names + assert "hidden" not in names + + +class TestToolName: + def test_uses_func_name(self, simple_app): + assert app_context.get().mcp_callback_map[0].tool_name == "update" + + def test_duplicates_get_unique_names(self, duplicate_names_app): + names = [a.tool_name for a in app_context.get().mcp_callback_map] + assert len(names) == 2 + assert names[0] != names[1] + + +class TestGetInitialValue: + def test_returns_layout_value(self, simple_app): + callback_map = app_context.get().mcp_callback_map + # Input with no value set — returns None (layout default for dcc.Input) + assert callback_map.get_initial_value("inp.value") is None + + def test_returns_set_value(self): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="dd", options=["a", "b"], value="a"), + html.Div(id="out"), + ] + ) + + @app.callback(Output("out", "children"), Input("dd", "value")) + def update(selected): + return selected + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + assert app.mcp_callback_map.get_initial_value("dd.value") == "a" + + def test_initial_callback_makes_param_required(self): + """A param with None in layout but set by an initial callback is required.""" + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown( + id="country", options=["France", "Germany"], value="France" + ), + dcc.Dropdown(id="city"), # value=None in layout + html.Div(id="out"), + ] + ) + + @app.callback( + Output("city", "options"), + Output("city", "value"), + Input("country", "value"), + ) + def update_cities(country): + return [{"label": "Paris", "value": "Paris"}], "Paris" + + @app.callback(Output("out", "children"), Input("city", "value")) + def show_city(city): + return f"Selected: {city}" + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + + # city.value is None in layout but "Paris" after initial callback + with app.server.test_request_context(): + show_city_cb = app.mcp_callback_map.find_by_tool_name("show_city") + city_param = show_city_cb.inputs[0] + assert city_param["name"] == "city" + assert city_param["required"] is True # not optional despite None in layout + + +class TestIsValid: + def test_valid_when_inputs_in_layout(self, simple_app): + assert app_context.get().mcp_callback_map[0].is_valid + + def test_invalid_when_input_not_in_layout(self): + app = Dash(__name__) + app.layout = html.Div([html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("nonexistent", "value")) + def update(val): + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + assert not app.mcp_callback_map[0].is_valid + + def test_pattern_matching_ids_always_valid(self): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id={"type": "field", "index": 0}, value="a"), + html.Div(id="out"), + ] + ) + + @app.callback( + Output("out", "children"), + Input({"type": "field", "index": 0}, "value"), + ) + def update(val): + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + assert app.mcp_callback_map[0].is_valid diff --git a/tests/unit/mcp/tools/test_callback_adapter_collection.py b/tests/unit/mcp/tools/test_callback_adapter_collection.py new file mode 100644 index 0000000000..c120a2df8b --- /dev/null +++ b/tests/unit/mcp/tools/test_callback_adapter_collection.py @@ -0,0 +1,145 @@ +"""Tests for CallbackAdapterCollection.""" + +from dash import Dash, Input, Output, dcc, html +from dash._get_app import app_context + +from dash.mcp.primitives.tools.callback_adapter_collection import ( + CallbackAdapterCollection, +) + + +def _setup(app): + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + + +class TestToolNameCollisions: + @staticmethod + def _make_duplicate_cb_app(n=3): + ids = [f"dd{i + 1}" for i in range(n)] + app = Dash(__name__) + app.layout = html.Div( + [ + item + for i in ids + for item in [ + dcc.Dropdown( + id=i, options=[chr(97 + j) for j in range(1)], value="a" + ), + html.Div(id=f"{i}-output"), + ] + ] + ) + for idx, dd_id in enumerate(ids): + + @app.callback(Output(f"{dd_id}-output", "children"), Input(dd_id, "value")) + def cb(value, _id=dd_id): # noqa: F811 + return f"{_id}: {value}" + + return app + + def test_duplicate_func_names_get_unique_tools(self): + app = self._make_duplicate_cb_app(3) + _setup(app) + tool_names = [a.tool_name for a in app.mcp_callback_map] + assert len(tool_names) == 3 + assert len(set(tool_names)) == 3, f"Tool names are not unique: {tool_names}" + for name in tool_names: + assert "dd" in name, f"Expected output ID in tool name: {name}" + + def test_unique_func_names_use_func_name(self): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id="in1"), + html.Div(id="out1"), + html.Div(id="in2"), + html.Div(id="out2"), + ] + ) + + @app.callback(Output("out1", "children"), Input("in1", "children")) + def alpha_handler(value): + return value + + @app.callback(Output("out2", "children"), Input("in2", "children")) + def beta_handler(value): + return value + + _setup(app) + tool_names = [a.tool_name for a in app.mcp_callback_map] + assert "alpha_handler" in tool_names + assert "beta_handler" in tool_names + + def test_duplicate_func_names_use_output_id(self): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id="out1"), + html.Div(id="out2"), + html.Div(id="out3"), + html.Div(id="in1"), + html.Div(id="in2"), + html.Div(id="in3"), + ] + ) + + @app.callback(Output("out1", "children"), Input("in1", "children")) + def unique_func(v): + return v + + @app.callback(Output("out2", "children"), Input("in2", "children")) + def cb(v): + return v + + @app.callback(Output("out3", "children"), Input("in3", "children")) + def cb(v): # noqa: F811 + return v + + _setup(app) + tool_names = [a.tool_name for a in app.mcp_callback_map] + assert "unique_func" in tool_names + non_unique = [n for n in tool_names if n != "unique_func"] + assert len(non_unique) == 2 + assert non_unique[0] != non_unique[1] + + +class TestAllCallbacksVisibleByDefault: + def test_all_callbacks_visible_by_default(self): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id="in1"), + html.Div(id="out1"), + html.Div(id="in2"), + html.Div(id="out2"), + ] + ) + + @app.callback(Output("out1", "children"), Input("in1", "children")) + def cb_one(value): + return value + + @app.callback(Output("out2", "children"), Input("in2", "children")) + def cb_two(value): + return value + + _setup(app) + tool_names = [a.tool_name for a in app.mcp_callback_map] + assert "cb_one" in tool_names + assert "cb_two" in tool_names + + +class TestAdapterCollection: + def test_adapter_has_expected_properties(self): + app = Dash(__name__) + app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("inp", "value")) + def update(val): + return val + + _setup(app) + adapter = app.mcp_callback_map[0] + assert adapter.tool_name == "update" + assert adapter.output_id == "out.children" From fcfa76518d57b0a888b59fc92970a80b68af74fc Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 1 Apr 2026 16:59:57 -0600 Subject: [PATCH 014/103] Fix type errors --- dash/_callback.py | 2 +- dash/types.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/dash/_callback.py b/dash/_callback.py index 96a5e8f16c..fc7f7312c7 100644 --- a/dash/_callback.py +++ b/dash/_callback.py @@ -563,7 +563,7 @@ def _prepare_response( allow_dynamic_callbacks, ): """Prepare the response object based on the callback output.""" - component_ids = collections.defaultdict(dict) + component_ids: dict = collections.defaultdict(dict) if has_output: if not multi: diff --git a/dash/types.py b/dash/types.py index 43bf16dc30..e392a2d599 100644 --- a/dash/types.py +++ b/dash/types.py @@ -73,3 +73,4 @@ class CallbackDispatchResponse(TypedDict): multi: NotRequired[bool] response: NotRequired[Dict[str, CallbackOutput]] sideUpdate: NotRequired[Dict[str, CallbackSideOutput]] + dist: NotRequired[List[Any]] From 8c89d518dfdd7aecaf8aedc7ee7da0a5ad78bc03 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Mon, 6 Apr 2026 12:11:03 -0600 Subject: [PATCH 015/103] Fix import path --- dash/mcp/primitives/tools/callback_adapter.py | 2 +- dash/mcp/primitives/tools/callback_adapter_collection.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dash/mcp/primitives/tools/callback_adapter.py b/dash/mcp/primitives/tools/callback_adapter.py index 0f50d15c03..743453af10 100644 --- a/dash/mcp/primitives/tools/callback_adapter.py +++ b/dash/mcp/primitives/tools/callback_adapter.py @@ -15,7 +15,7 @@ from mcp.types import Tool from dash import get_app -from dash.layout import ( +from dash._layout_utils import ( _WILDCARD_VALUES, find_component, find_matching_components, diff --git a/dash/mcp/primitives/tools/callback_adapter_collection.py b/dash/mcp/primitives/tools/callback_adapter_collection.py index 60e9e2efe5..59c1a7ac47 100644 --- a/dash/mcp/primitives/tools/callback_adapter_collection.py +++ b/dash/mcp/primitives/tools/callback_adapter_collection.py @@ -14,7 +14,7 @@ from dash import get_app from dash._utils import clean_property_name, split_callback_id -from dash.layout import extract_text, find_component, traverse +from dash._layout_utils import extract_text, find_component, traverse from .callback_adapter import CallbackAdapter From eeadb7f99fce72dc74f19cb89c4dc4040323b84d Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Mon, 13 Apr 2026 16:12:57 -0600 Subject: [PATCH 016/103] tighten up types used around callbacks --- dash/_callback.py | 8 +-- dash/dash.py | 6 +-- dash/mcp/primitives/tools/callback_adapter.py | 54 ++++++++----------- dash/mcp/primitives/tools/callback_utils.py | 5 +- dash/types.py | 35 ++++++++++-- tests/unit/test_pydantic_types.py | 8 +-- 6 files changed, 67 insertions(+), 49 deletions(-) diff --git a/dash/_callback.py b/dash/_callback.py index fc7f7312c7..c8d610fa48 100644 --- a/dash/_callback.py +++ b/dash/_callback.py @@ -39,7 +39,7 @@ from .background_callback.managers import BaseBackgroundCallbackManager from ._callback_context import context_value -from .types import CallbackDispatchResponse +from .types import CallbackExecutionResponse from ._no_update import NoUpdate from . import _validate @@ -551,7 +551,7 @@ def _prepare_response( output_value, output_spec, multi, - response: CallbackDispatchResponse, + response: CallbackExecutionResponse, callback_ctx, app, original_packages, @@ -717,7 +717,7 @@ def add_context(*args, **kwargs): args, kwargs, inputs_state_indices, has_output, insert_output ) - response: CallbackDispatchResponse = {"multi": True} + response: CallbackExecutionResponse = {"multi": True} jsonResponse: Optional[str] = None try: if background is not None: @@ -789,7 +789,7 @@ async def async_add_context(*args, **kwargs): args, kwargs, inputs_state_indices, has_output, insert_output ) - response: CallbackDispatchResponse = {"multi": True} + response: CallbackExecutionResponse = {"multi": True} try: if background is not None: diff --git a/dash/dash.py b/dash/dash.py index 225c36bb47..f887598497 100644 --- a/dash/dash.py +++ b/dash/dash.py @@ -75,7 +75,7 @@ _import_layouts_from_pages, ) from ._jupyter import jupyter_dash, JupyterDisplayMode -from .types import CallbackDispatchBody, RendererHooks +from .types import CallbackExecutionBody, RendererHooks RouteCallable = Callable[..., Any] @@ -1469,7 +1469,7 @@ def _inputs_to_vals(self, inputs): return inputs_to_vals(inputs) # pylint: disable=R0915 - def _initialize_context(self, body: CallbackDispatchBody): + def _initialize_context(self, body: CallbackExecutionBody): """Initialize the global context for the request.""" adapter = self.backend.request_adapter() g = AttributeDict({}) @@ -1492,7 +1492,7 @@ def _initialize_context(self, body: CallbackDispatchBody): g.updated_props = {} return g - def _prepare_callback(self, g, body: CallbackDispatchBody): + def _prepare_callback(self, g, body: CallbackExecutionBody): """Prepare callback-related data.""" output = body["output"] try: diff --git a/dash/mcp/primitives/tools/callback_adapter.py b/dash/mcp/primitives/tools/callback_adapter.py index 743453af10..693d3f8e07 100644 --- a/dash/mcp/primitives/tools/callback_adapter.py +++ b/dash/mcp/primitives/tools/callback_adapter.py @@ -21,10 +21,17 @@ find_matching_components, parse_wildcard_id, ) -from dash.mcp.types import is_nullable from dash._grouping import flatten_grouping from dash._utils import clean_property_name, split_callback_id -from dash.mcp.types import MCPInput, MCPOutput +from dash.types import ( + CallbackDependency, + CallbackExecutionBody, + CallbackInput, + CallbackOutput, + CallbackOutputTarget, + WildcardId, +) +from dash.mcp.types import MCPInput, MCPOutput, is_nullable from .callback_utils import run_callback from .descriptions import build_tool_description from .input_schemas import get_input_schema @@ -46,7 +53,7 @@ def as_mcp_tool(self) -> Tool: """Stub — will be implemented in a future PR.""" raise NotImplementedError("as_mcp_tool will be implemented in a future PR.") - def as_callback_body(self, kwargs: dict[str, Any]) -> dict[str, Any]: + def as_callback_body(self, kwargs: dict[str, Any]) -> CallbackExecutionBody: """Transforms the given kwargs to a dict suitable for calling this callback. Mirrors how the Dash renderer assembles the callback payload — @@ -55,16 +62,14 @@ def as_callback_body(self, kwargs: dict[str, Any]) -> dict[str, Any]: For pattern-matching callbacks, wildcard deps are expanded into nested arrays with concrete component IDs. """ - coerced = {k: _coerce_value(v) for k, v in kwargs.items()} - raw_inputs = self._cb_info.get("inputs", []) raw_state = self._cb_info.get("state", []) n_deps = len(raw_inputs) + len(raw_state) flat_values = [None] * n_deps for i, name in enumerate(self._param_names): - if i < n_deps and name in coerced: - flat_values[i] = coerced[name] + if i < n_deps and name in kwargs: + flat_values[i] = kwargs[name] inputs_with_values = [ _expand_dep(dep, flat_values[i]) for i, dep in enumerate(raw_inputs) @@ -161,10 +166,10 @@ def _docstring(self) -> str | None: return getattr(self._original_func, "__doc__", None) @cached_property - def _initial_output(self) -> dict[str, dict[str, Any]]: + def _initial_output(self) -> dict[str, CallbackOutput]: """Run this callback with initial input values. - Returns the ``response`` portion of the dispatch result: + Returns the ``response`` portion of the callback result: ``{component_id: {property: value}}``. Skipped for callbacks with ``prevent_initial_call=True``, @@ -346,8 +351,8 @@ def _param_annotations(self) -> list[Any | None]: return [hints.get(func_name) for func_name, _ in self._dep_param_map] -def _expand_dep(dep: dict, value: Any) -> Any: - """Expand a dependency into the dispatch format. +def _expand_dep(dep: CallbackDependency, value: Any) -> CallbackInput | list[CallbackInput]: + """Attach a concrete value to a callback dependency to produce a valid callback input. For regular deps, returns ``{id, property, value}``. For ALL/ALLSMALLER: passes through the list of ``{id, property, value}`` dicts. @@ -365,7 +370,9 @@ def _expand_dep(dep: dict, value: Any) -> Any: return {**dep, "value": value} -def _expand_output_spec(output_id: str, cb_info: dict, resolved_inputs: list) -> Any: +def _expand_output_spec( + output_id: str, cb_info: dict, resolved_inputs: list[CallbackInput], +) -> list[CallbackOutputTarget]: """Build the outputs spec, expanding wildcards to concrete IDs. For wildcard outputs, derives concrete IDs from the resolved inputs. @@ -379,7 +386,7 @@ def _expand_output_spec(output_id: str, cb_info: dict, resolved_inputs: list) -> if isinstance(parsed, dict): parsed = [parsed] - results = [] + results: list[CallbackOutputTarget] = [] for p in parsed: pid = p["id"] prop = clean_property_name(p["property"]) @@ -397,14 +404,12 @@ def _expand_output_spec(output_id: str, cb_info: dict, resolved_inputs: list) -> else: results.append({"id": pid, "property": prop}) - if len(results) == 1: - return results[0] return results def _derive_output_ids( - output_pattern: dict, resolved_inputs: list -) -> list[dict] | None: + output_pattern: WildcardId, resolved_inputs: list[CallbackInput], +) -> list[WildcardId] | None: """Derive concrete output IDs from the resolved input entries. Extracts the wildcard key values from the LLM-provided concrete @@ -418,7 +423,7 @@ def _derive_output_ids( if not wildcard_keys: return None - def _substitute(item_id: dict) -> dict | None: + def _substitute(item_id: WildcardId) -> WildcardId | None: if not isinstance(item_id, dict): return None output_id = dict(output_pattern) @@ -446,16 +451,3 @@ def _substitute(item_id: dict) -> dict | None: return None -def _coerce_value(value: Any) -> Any: - """Parse JSON strings back to Python objects. - - MCP tool parameters arrive as strings. This recovers the - intended type (list, dict, number, bool, null) via json.loads. - Plain strings that aren't valid JSON pass through unchanged. - """ - if not isinstance(value, str): - return value - try: - return json.loads(value) - except (json.JSONDecodeError, ValueError): - return value diff --git a/dash/mcp/primitives/tools/callback_utils.py b/dash/mcp/primitives/tools/callback_utils.py index ec157b6037..86c7e837f0 100644 --- a/dash/mcp/primitives/tools/callback_utils.py +++ b/dash/mcp/primitives/tools/callback_utils.py @@ -6,13 +6,14 @@ from typing import TYPE_CHECKING, Any from dash import get_app +from dash.types import CallbackExecutionResponse if TYPE_CHECKING: from .callback_adapter import CallbackAdapter -def run_callback(callback: CallbackAdapter, kwargs: dict[str, Any]) -> dict[str, Any]: - """Execute a callback via Dash's dispatch pipeline.""" +def run_callback(callback: CallbackAdapter, kwargs: dict[str, Any]) -> CallbackExecutionResponse: + """Execute a callback via the framework.""" from dash.mcp.types import CallbackExecutionError body = callback.as_callback_body(kwargs) diff --git a/dash/types.py b/dash/types.py index e392a2d599..cbc94b8151 100644 --- a/dash/types.py +++ b/dash/types.py @@ -35,20 +35,45 @@ class RendererHooks(TypedDict): # pylint: disable=too-many-ancestors request_refresh_jwt: NotRequired[str] +WildcardId = Dict[str, Any] +"""A pattern-matching component ID, e.g. ``{"type": "item", "index": 0}``.""" + + class CallbackDependency(TypedDict): - id: Union[str, Dict[str, Any]] + id: Union[str, WildcardId] property: str +CallbackOutputTarget = Union[CallbackDependency, List[CallbackDependency]] +"""One callback Output() declaration resolved against the layout. + +For regular callbacks, a single dependency:: + + {"id": "chart", "property": "figure"} + +For pattern-matching callbacks (ALL/ALLSMALLER), a list of concrete +targets that the wildcard expanded to:: + + [ + {"id": {"type": "item", "index": 0}, "property": "children"}, + {"id": {"type": "item", "index": 1}, "property": "children"}, + ] + +For MATCH, a single dependency with a dict id:: + + {"id": {"type": "item", "index": 0}, "property": "children"} +""" + + class CallbackInput(TypedDict): - id: Union[str, Dict[str, Any]] + id: Union[str, WildcardId] property: str value: Any -class CallbackDispatchBody(TypedDict): +class CallbackExecutionBody(TypedDict): output: str - outputs: List[CallbackDependency] + outputs: List[CallbackOutputTarget] inputs: List[CallbackInput] state: List[CallbackInput] changedPropIds: List[str] @@ -69,7 +94,7 @@ class CallbackDispatchBody(TypedDict): ] -class CallbackDispatchResponse(TypedDict): +class CallbackExecutionResponse(TypedDict): multi: NotRequired[bool] response: NotRequired[Dict[str, CallbackOutput]] sideUpdate: NotRequired[Dict[str, CallbackSideOutput]] diff --git a/tests/unit/test_pydantic_types.py b/tests/unit/test_pydantic_types.py index 75d1dc7f41..389e678028 100644 --- a/tests/unit/test_pydantic_types.py +++ b/tests/unit/test_pydantic_types.py @@ -2,7 +2,7 @@ from pydantic import TypeAdapter -from dash.types import NumberType, CallbackDispatchBody, CallbackDispatchResponse +from dash.types import NumberType, CallbackExecutionBody, CallbackExecutionResponse from dash.development.base_component import Component @@ -25,12 +25,12 @@ def test_schema_has_type_and_props(self): assert "props" in props -class TestCallbackDispatchTypes: +class TestCallbackExecutionTypes: def test_dispatch_body_schema(self): - schema = TypeAdapter(CallbackDispatchBody).json_schema() + schema = TypeAdapter(CallbackExecutionBody).json_schema() assert "output" in schema["properties"] assert "inputs" in schema["properties"] def test_dispatch_response_schema(self): - schema = TypeAdapter(CallbackDispatchResponse).json_schema() + schema = TypeAdapter(CallbackExecutionResponse).json_schema() assert "response" in schema["properties"] From 5b09f990d598182cbc644827853a559aa21f8f6e Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Mon, 13 Apr 2026 16:23:41 -0600 Subject: [PATCH 017/103] Remove redundant error code --- dash/mcp/types/exceptions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dash/mcp/types/exceptions.py b/dash/mcp/types/exceptions.py index 7fb962db85..4b860f4bba 100644 --- a/dash/mcp/types/exceptions.py +++ b/dash/mcp/types/exceptions.py @@ -27,4 +27,4 @@ class InvalidParamsError(MCPError): class CallbackExecutionError(MCPError): """Callback raised an exception during execution.""" - code = -32603 + pass From fa99ab096748c88c3abc67358418aabb9a16c411 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Tue, 14 Apr 2026 09:10:32 -0600 Subject: [PATCH 018/103] lint --- dash/mcp/primitives/tools/callback_adapter.py | 13 ++++++++----- dash/mcp/primitives/tools/callback_utils.py | 4 +++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/dash/mcp/primitives/tools/callback_adapter.py b/dash/mcp/primitives/tools/callback_adapter.py index 693d3f8e07..9dcb8d959e 100644 --- a/dash/mcp/primitives/tools/callback_adapter.py +++ b/dash/mcp/primitives/tools/callback_adapter.py @@ -351,7 +351,9 @@ def _param_annotations(self) -> list[Any | None]: return [hints.get(func_name) for func_name, _ in self._dep_param_map] -def _expand_dep(dep: CallbackDependency, value: Any) -> CallbackInput | list[CallbackInput]: +def _expand_dep( + dep: CallbackDependency, value: Any +) -> CallbackInput | list[CallbackInput]: """Attach a concrete value to a callback dependency to produce a valid callback input. For regular deps, returns ``{id, property, value}``. @@ -371,7 +373,9 @@ def _expand_dep(dep: CallbackDependency, value: Any) -> CallbackInput | list[Cal def _expand_output_spec( - output_id: str, cb_info: dict, resolved_inputs: list[CallbackInput], + output_id: str, + cb_info: dict, + resolved_inputs: list[CallbackInput], ) -> list[CallbackOutputTarget]: """Build the outputs spec, expanding wildcards to concrete IDs. @@ -408,7 +412,8 @@ def _expand_output_spec( def _derive_output_ids( - output_pattern: WildcardId, resolved_inputs: list[CallbackInput], + output_pattern: WildcardId, + resolved_inputs: list[CallbackInput], ) -> list[WildcardId] | None: """Derive concrete output IDs from the resolved input entries. @@ -449,5 +454,3 @@ def _substitute(item_id: WildcardId) -> WildcardId | None: return [out] return None - - diff --git a/dash/mcp/primitives/tools/callback_utils.py b/dash/mcp/primitives/tools/callback_utils.py index 86c7e837f0..0ff4f5f578 100644 --- a/dash/mcp/primitives/tools/callback_utils.py +++ b/dash/mcp/primitives/tools/callback_utils.py @@ -12,7 +12,9 @@ from .callback_adapter import CallbackAdapter -def run_callback(callback: CallbackAdapter, kwargs: dict[str, Any]) -> CallbackExecutionResponse: +def run_callback( + callback: CallbackAdapter, kwargs: dict[str, Any] +) -> CallbackExecutionResponse: """Execute a callback via the framework.""" from dash.mcp.types import CallbackExecutionError From cd1f4d4492a0b310edd57418071c0b5b0ad89d7a Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 1 Apr 2026 12:46:29 -0600 Subject: [PATCH 019/103] Add MCP resource providers for layout, components, pages, and clientside callbacks --- dash/mcp/primitives/resources/__init__.py | 52 ++++++++++ .../resource_clientside_callbacks.py | 95 +++++++++++++++++++ .../resources/resource_components.py | 59 ++++++++++++ .../primitives/resources/resource_layout.py | 44 +++++++++ .../resources/resource_page_layout.py | 77 +++++++++++++++ .../primitives/resources/resource_pages.py | 76 +++++++++++++++ .../test_resource_clientside_callbacks.py | 54 +++++++++++ .../resources/test_resource_layout.py | 59 ++++++++++++ .../resources/test_resource_page_layout.py | 52 ++++++++++ .../resources/test_resource_pages.py | 78 +++++++++++++++ 10 files changed, 646 insertions(+) create mode 100644 dash/mcp/primitives/resources/__init__.py create mode 100644 dash/mcp/primitives/resources/resource_clientside_callbacks.py create mode 100644 dash/mcp/primitives/resources/resource_components.py create mode 100644 dash/mcp/primitives/resources/resource_layout.py create mode 100644 dash/mcp/primitives/resources/resource_page_layout.py create mode 100644 dash/mcp/primitives/resources/resource_pages.py create mode 100644 tests/unit/mcp/primitives/resources/test_resource_clientside_callbacks.py create mode 100644 tests/unit/mcp/primitives/resources/test_resource_layout.py create mode 100644 tests/unit/mcp/primitives/resources/test_resource_page_layout.py create mode 100644 tests/unit/mcp/primitives/resources/test_resource_pages.py diff --git a/dash/mcp/primitives/resources/__init__.py b/dash/mcp/primitives/resources/__init__.py new file mode 100644 index 0000000000..da93feae04 --- /dev/null +++ b/dash/mcp/primitives/resources/__init__.py @@ -0,0 +1,52 @@ +"""MCP resource listing and read handling. + +Each resource module exports: +- ``URI`` — the URI prefix this module handles +- ``get_resource() -> Resource | None`` +- ``get_template() -> ResourceTemplate | None`` +- ``read_resource(uri) -> ReadResourceResult`` + +Dispatch is by prefix match: more specific prefixes must come first. +""" + +from __future__ import annotations + +from mcp.types import ( + ListResourcesResult, + ListResourceTemplatesResult, + ReadResourceResult, +) + +from . import ( + resource_clientside_callbacks as _clientside, + resource_components as _components, + resource_layout as _layout, + resource_page_layout as _page_layout, + resource_pages as _pages, +) + +_RESOURCE_MODULES = [_layout, _components, _pages, _clientside, _page_layout] + + +def list_resources() -> ListResourcesResult: + """Build the MCP resources/list response.""" + resources = [ + r for mod in _RESOURCE_MODULES for r in [mod.get_resource()] if r is not None + ] + return ListResourcesResult(resources=resources) + + +def list_resource_templates() -> ListResourceTemplatesResult: + """Build the MCP resources/templates/list response.""" + templates = [ + t for mod in _RESOURCE_MODULES for t in [mod.get_template()] if t is not None + ] + return ListResourceTemplatesResult(resourceTemplates=templates) + + +def read_resource(uri: str) -> ReadResourceResult: + """Dispatch a resources/read request by URI prefix match.""" + for mod in _RESOURCE_MODULES: + if uri.startswith(mod.URI): + return mod.read_resource(uri) + raise ValueError(f"Unknown resource URI: {uri}") diff --git a/dash/mcp/primitives/resources/resource_clientside_callbacks.py b/dash/mcp/primitives/resources/resource_clientside_callbacks.py new file mode 100644 index 0000000000..dbc3009edb --- /dev/null +++ b/dash/mcp/primitives/resources/resource_clientside_callbacks.py @@ -0,0 +1,95 @@ +"""Clientside callbacks resource.""" + +from __future__ import annotations + +import json +from typing import Any + +from mcp.types import ( + ReadResourceResult, + Resource, + ResourceTemplate, + TextResourceContents, +) + +from dash import get_app +from dash._utils import clean_property_name, split_callback_id + +URI = "dash://clientside-callbacks" + + +def get_resource() -> Resource | None: + if not _get_clientside_callbacks(): + return None + return Resource( + uri=URI, + name="dash_clientside_callbacks", + description=( + "Actions the user can take manually in the browser " + "to affect clientside state. Inputs describe the " + "components that can be changed to trigger an effect. " + "Outputs describe the components that will change " + "in response." + ), + mimeType="application/json", + ) + + +def get_template() -> ResourceTemplate | None: + return None + + +def read_resource(uri: str = "") -> ReadResourceResult: + data = { + "description": ( + "These are actions that the user can take manually in the " + "browser to affect the clientside state. Inputs describe " + "the components that can be changed to trigger an effect. " + "Outputs describe the components that will change in " + "response to the effect." + ), + "callbacks": _get_clientside_callbacks(), + } + return ReadResourceResult( + contents=[ + TextResourceContents( + uri=URI, + mimeType="application/json", + text=json.dumps(data, default=str), + ) + ] + ) + + +def _get_clientside_callbacks() -> list[dict[str, Any]]: + """Get input/output mappings for clientside callbacks.""" + app = get_app() + callbacks = [] + callback_map = getattr(app, "callback_map", {}) + + for output_id, callback_info in callback_map.items(): + if "callback" in callback_info: + continue + normalize_deps = lambda deps: [ + { + "component_id": str(d.get("id", "unknown")), + "property": d.get("property", "unknown"), + } + for d in deps + ] + parsed = split_callback_id(output_id) + if isinstance(parsed, dict): + parsed = [parsed] + outputs = [ + {"component_id": p["id"], "property": clean_property_name(p["property"])} + for p in parsed + ] + callbacks.append( + { + "outputs": outputs, + "inputs": normalize_deps(callback_info.get("inputs", [])), + "state": normalize_deps(callback_info.get("state", [])), + } + ) + + return callbacks diff --git a/dash/mcp/primitives/resources/resource_components.py b/dash/mcp/primitives/resources/resource_components.py new file mode 100644 index 0000000000..e6441d7aee --- /dev/null +++ b/dash/mcp/primitives/resources/resource_components.py @@ -0,0 +1,59 @@ +"""Component list resource.""" + +from __future__ import annotations + +import json + +from mcp.types import ( + ReadResourceResult, + Resource, + ResourceTemplate, + TextResourceContents, +) + +from dash import get_app +from dash.layout import traverse + +URI = "dash://components" + + +def get_resource() -> Resource | None: + return Resource( + uri=URI, + name="dash_components", + description=( + "All components with IDs in the app layout. " + "Use get_dash_component with any of these IDs " + "to inspect their properties and values. " + "See dash://layout for the tree structure showing " + "how these components are nested in the page." + ), + mimeType="application/json", + ) + + +def get_template() -> ResourceTemplate | None: + return None + + +def read_resource(uri: str = "") -> ReadResourceResult: + app = get_app() + layout = app.get_layout() + components = sorted( + [ + {"id": str(comp.id), "type": getattr(comp, "_type", type(comp).__name__)} + for comp, _ in traverse(layout) + if getattr(comp, "id", None) is not None + ], + key=lambda c: c["id"], + ) + + return ReadResourceResult( + contents=[ + TextResourceContents( + uri=URI, + mimeType="application/json", + text=json.dumps(components), + ) + ] + ) diff --git a/dash/mcp/primitives/resources/resource_layout.py b/dash/mcp/primitives/resources/resource_layout.py new file mode 100644 index 0000000000..01d0be046d --- /dev/null +++ b/dash/mcp/primitives/resources/resource_layout.py @@ -0,0 +1,44 @@ +"""Layout tree resource for the whole app.""" + +from __future__ import annotations + +from mcp.types import ( + ReadResourceResult, + Resource, + ResourceTemplate, + TextResourceContents, +) + +from dash import get_app +from dash._utils import to_json + +URI = "dash://layout" + + +def get_resource() -> Resource | None: + return Resource( + uri=URI, + name="dash_app_layout", + description=( + "Full component tree of the Dash app. " + "See dash://components for a compact list of component IDs." + ), + mimeType="application/json", + ) + + +def get_template() -> ResourceTemplate | None: + return None + + +def read_resource(uri: str = "") -> ReadResourceResult: + app = get_app() + return ReadResourceResult( + contents=[ + TextResourceContents( + uri=URI, + mimeType="application/json", + text=to_json(app.get_layout()), + ) + ] + ) diff --git a/dash/mcp/primitives/resources/resource_page_layout.py b/dash/mcp/primitives/resources/resource_page_layout.py new file mode 100644 index 0000000000..d82d366298 --- /dev/null +++ b/dash/mcp/primitives/resources/resource_page_layout.py @@ -0,0 +1,77 @@ +"""Per-page layout resource template for multi-page apps.""" + +from __future__ import annotations + +from mcp.types import ( + ReadResourceResult, + Resource, + ResourceTemplate, + TextResourceContents, +) + +from dash._utils import to_json + +URI = "dash://page-layout/" +_URI_TEMPLATE = "dash://page-layout/{path}" + + +def get_resource() -> Resource | None: + return None + + +def get_template() -> ResourceTemplate | None: + if not _has_pages(): + return None + return ResourceTemplate( + uriTemplate=_URI_TEMPLATE, + name="dash_page_layout", + description="Component tree for a specific page in the app.", + mimeType="application/json", + ) + + +def read_resource(uri: str) -> ReadResourceResult: + path = uri[len(URI) :] + if not path.startswith("/"): + path = "/" + path + + try: + from dash._pages import PAGE_REGISTRY + except ImportError: + raise ValueError("Dash Pages is not available.") + + page_layout = None + for _module, page in PAGE_REGISTRY.items(): + if page.get("path") == path: + page_layout = page.get("layout") + break + + if page_layout is None: + raise ValueError(f"Page not found: {path}") + + if callable(page_layout): + page_layout = page_layout() + + if isinstance(page_layout, (list, tuple)): + from dash import html + + page_layout = html.Div(list(page_layout)) + + return ReadResourceResult( + contents=[ + TextResourceContents( + uri=uri, + mimeType="application/json", + text=to_json(page_layout), + ) + ] + ) + + +def _has_pages() -> bool: + try: + from dash._pages import PAGE_REGISTRY + + return bool(PAGE_REGISTRY) + except ImportError: + return False diff --git a/dash/mcp/primitives/resources/resource_pages.py b/dash/mcp/primitives/resources/resource_pages.py new file mode 100644 index 0000000000..51a61b9f00 --- /dev/null +++ b/dash/mcp/primitives/resources/resource_pages.py @@ -0,0 +1,76 @@ +"""Pages resource for multi-page apps.""" + +from __future__ import annotations + +import json + +from mcp.types import ( + ReadResourceResult, + Resource, + ResourceTemplate, + TextResourceContents, +) + +URI = "dash://pages" + + +def _has_pages() -> bool: + try: + from dash._pages import PAGE_REGISTRY + + return bool(PAGE_REGISTRY) + except ImportError: + return False + + +def get_resource() -> Resource | None: + if not _has_pages(): + return None + return Resource( + uri=URI, + name="dash_app_pages", + description=( + "List of all pages in this multi-page Dash app " + "with paths, names, titles, and descriptions." + ), + mimeType="application/json", + ) + + +def get_template() -> ResourceTemplate | None: + return None + + +def read_resource(uri: str = "") -> ReadResourceResult: + try: + from dash._pages import PAGE_REGISTRY + except ImportError: + return ReadResourceResult( + contents=[ + TextResourceContents(uri=URI, mimeType="application/json", text="[]") + ] + ) + + pages = [] + for module, page in PAGE_REGISTRY.items(): + title = page.get("title", "") + description = page.get("description", "") + pages.append( + { + "module": module, + "path": page.get("path", ""), + "name": page.get("name", ""), + "title": title if not callable(title) else page.get("name", ""), + "description": description if not callable(description) else "", + } + ) + + return ReadResourceResult( + contents=[ + TextResourceContents( + uri=URI, + mimeType="application/json", + text=json.dumps(pages, default=str), + ) + ] + ) diff --git a/tests/unit/mcp/primitives/resources/test_resource_clientside_callbacks.py b/tests/unit/mcp/primitives/resources/test_resource_clientside_callbacks.py new file mode 100644 index 0000000000..3ba2ce7996 --- /dev/null +++ b/tests/unit/mcp/primitives/resources/test_resource_clientside_callbacks.py @@ -0,0 +1,54 @@ +"""Tests for the dash://clientside-callbacks resource.""" + +import json + +from dash import Dash, Input, Output, clientside_callback, html + +from dash.mcp.primitives.resources import list_resources, read_resource + + +class TestClientsideCallbacksResource: + @staticmethod + def _make_app(): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Button(id="btn", children="Click"), + html.Div(id="out"), + html.Div(id="server-out"), + ] + ) + + clientside_callback( + "function(n) { return n; }", + Output("out", "children"), + Input("btn", "n_clicks"), + ) + + @app.callback(Output("server-out", "children"), Input("btn", "n_clicks")) + def server_cb(n): + return str(n) + + with app.server.test_request_context(): + app._setup_server() + + return app + + def test_resource_listed(self): + app = self._make_app() + with app.server.test_request_context(): + result = list_resources() + uris = [str(r.uri) for r in result.resources] + assert "dash://clientside-callbacks" in uris + + def test_resource_read(self): + app = self._make_app() + with app.server.test_request_context(): + result = read_resource("dash://clientside-callbacks") + data = json.loads(result.contents[0].text) + assert "description" in data + callbacks = data["callbacks"] + assert len(callbacks) == 1 + assert callbacks[0]["inputs"][0]["component_id"] == "btn" + assert callbacks[0]["inputs"][0]["property"] == "n_clicks" + assert callbacks[0]["outputs"][0]["component_id"] == "out" diff --git a/tests/unit/mcp/primitives/resources/test_resource_layout.py b/tests/unit/mcp/primitives/resources/test_resource_layout.py new file mode 100644 index 0000000000..ade207b1f3 --- /dev/null +++ b/tests/unit/mcp/primitives/resources/test_resource_layout.py @@ -0,0 +1,59 @@ +"""Tests for the dash://layout resource.""" + +import json +from unittest.mock import patch + +from dash import Dash, dcc, html + +from dash.mcp.primitives.resources import list_resources, read_resource + +EXPECTED_LAYOUT = { + "type": "Div", + "namespace": "dash_html_components", + "props": { + "children": [ + { + "type": "Dropdown", + "namespace": "dash_core_components", + "props": { + "id": "test-dd", + "options": ["a", "b"], + "value": "a", + }, + }, + { + "type": "Div", + "namespace": "dash_html_components", + "props": { + "children": None, + "id": "output", + }, + }, + ] + }, +} + + +class TestLayoutResource: + def test_listed_in_resources(self): + app = Dash(__name__) + app.layout = html.Div(id="main") + with app.server.test_request_context(): + result = list_resources() + uris = [str(r.uri) for r in result.resources] + assert "dash://layout" in uris + + def test_read_returns_layout(self): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="test-dd", options=["a", "b"], value="a"), + html.Div(id="output"), + ] + ) + with app.server.test_request_context(): + with patch.object(app, "get_layout", wraps=app.get_layout) as mock: + result = read_resource("dash://layout") + mock.assert_called_once() + layout = json.loads(result.contents[0].text) + assert layout == EXPECTED_LAYOUT diff --git a/tests/unit/mcp/primitives/resources/test_resource_page_layout.py b/tests/unit/mcp/primitives/resources/test_resource_page_layout.py new file mode 100644 index 0000000000..88ffd82118 --- /dev/null +++ b/tests/unit/mcp/primitives/resources/test_resource_page_layout.py @@ -0,0 +1,52 @@ +"""Tests for the dash://page-layout/{path} resource template.""" + +import json +from unittest.mock import patch + +from dash import Dash, dcc, html + +from dash.mcp.primitives.resources import read_resource + +EXPECTED_PAGE_LAYOUT = { + "type": "Div", + "namespace": "dash_html_components", + "props": { + "children": [ + { + "type": "Dropdown", + "namespace": "dash_core_components", + "props": { + "id": "page-dd", + "options": ["a", "b"], + "value": "a", + }, + } + ] + }, +} + + +class TestPageLayoutResource: + def test_read_page_layout(self): + app = Dash(__name__) + app.layout = html.Div(id="main") + + page_layout = html.Div( + [ + dcc.Dropdown(id="page-dd", options=["a", "b"], value="a"), + ] + ) + fake_registry = { + "pages.test": { + "path": "/test", + "name": "Test", + "title": "Test Page", + "description": "", + "layout": page_layout, + }, + } + with app.server.test_request_context(): + with patch("dash._pages.PAGE_REGISTRY", fake_registry): + result = read_resource("dash://page-layout/test") + layout = json.loads(result.contents[0].text) + assert layout == EXPECTED_PAGE_LAYOUT diff --git a/tests/unit/mcp/primitives/resources/test_resource_pages.py b/tests/unit/mcp/primitives/resources/test_resource_pages.py new file mode 100644 index 0000000000..b2307d6fef --- /dev/null +++ b/tests/unit/mcp/primitives/resources/test_resource_pages.py @@ -0,0 +1,78 @@ +"""Tests for the dash://pages resource.""" + +import json +from unittest.mock import patch + +from dash import Dash, html + +from dash.mcp.primitives.resources import list_resources, read_resource + +EXPECTED_PAGES = [ + { + "path": "/", + "name": "Home", + "title": "Home Page", + "description": "The landing page", + "module": "pages.home", + }, + { + "path": "/analytics", + "name": "Analytics", + "title": "Analytics Dashboard", + "description": "View analytics", + "module": "pages.analytics", + }, +] + + +class TestPagesResource: + @staticmethod + def _make_app(): + app = Dash(__name__) + app.layout = html.Div(id="main") + return app + + def test_listed_for_multi_page_app(self): + app = self._make_app() + fake_registry = { + "pages.home": { + "path": "/", + "name": "Home", + "title": "Home", + "description": "", + } + } + with app.server.test_request_context(): + with patch("dash._pages.PAGE_REGISTRY", fake_registry): + result = list_resources() + uris = [str(r.uri) for r in result.resources] + assert "dash://pages" in uris + + def test_returns_page_info(self): + app = self._make_app() + fake_registry = { + "pages.home": EXPECTED_PAGES[0], + "pages.analytics": EXPECTED_PAGES[1], + } + with app.server.test_request_context(): + with patch("dash._pages.PAGE_REGISTRY", fake_registry): + result = read_resource("dash://pages") + content = json.loads(result.contents[0].text) + assert content == EXPECTED_PAGES + + def test_callable_title_falls_back_to_name(self): + app = self._make_app() + fake_registry = { + "pages.dynamic": { + "path": "/item/", + "name": "Item Detail", + "title": lambda **kwargs: f"Item {kwargs.get('item_id', '')}", + "description": lambda **kwargs: f"Details for {kwargs.get('item_id', '')}", + }, + } + with app.server.test_request_context(): + with patch("dash._pages.PAGE_REGISTRY", fake_registry): + result = read_resource("dash://pages") + page = json.loads(result.contents[0].text)[0] + assert page["title"] == "Item Detail" + assert page["description"] == "" From 2f00c0e5bd403b833c05ae1f508c32102dd20543 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Mon, 6 Apr 2026 12:13:28 -0600 Subject: [PATCH 020/103] Fix import path --- dash/mcp/primitives/resources/resource_components.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dash/mcp/primitives/resources/resource_components.py b/dash/mcp/primitives/resources/resource_components.py index e6441d7aee..8cf366f95c 100644 --- a/dash/mcp/primitives/resources/resource_components.py +++ b/dash/mcp/primitives/resources/resource_components.py @@ -12,7 +12,7 @@ ) from dash import get_app -from dash.layout import traverse +from dash._layout_utils import traverse URI = "dash://components" From 5e472b2f40dac44dca4848a481b2cc97babb39d6 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Mon, 13 Apr 2026 16:43:56 -0600 Subject: [PATCH 021/103] Implement base class for each resource type --- dash/mcp/primitives/resources/__init__.py | 44 ++++--- dash/mcp/primitives/resources/base.py | 28 +++++ .../resource_clientside_callbacks.py | 81 +++++++------ .../resources/resource_components.py | 87 +++++++------- .../primitives/resources/resource_layout.py | 61 +++++----- .../resources/resource_page_layout.py | 111 ++++++++---------- .../primitives/resources/resource_pages.py | 91 ++++++-------- .../resources/test_resource_page_layout.py | 5 +- .../resources/test_resource_pages.py | 15 ++- 9 files changed, 263 insertions(+), 260 deletions(-) create mode 100644 dash/mcp/primitives/resources/base.py diff --git a/dash/mcp/primitives/resources/__init__.py b/dash/mcp/primitives/resources/__init__.py index da93feae04..a65e376e6f 100644 --- a/dash/mcp/primitives/resources/__init__.py +++ b/dash/mcp/primitives/resources/__init__.py @@ -1,13 +1,4 @@ -"""MCP resource listing and read handling. - -Each resource module exports: -- ``URI`` — the URI prefix this module handles -- ``get_resource() -> Resource | None`` -- ``get_template() -> ResourceTemplate | None`` -- ``read_resource(uri) -> ReadResourceResult`` - -Dispatch is by prefix match: more specific prefixes must come first. -""" +"""MCP resource listing and read handling.""" from __future__ import annotations @@ -17,21 +8,26 @@ ReadResourceResult, ) -from . import ( - resource_clientside_callbacks as _clientside, - resource_components as _components, - resource_layout as _layout, - resource_page_layout as _page_layout, - resource_pages as _pages, -) +from .base import MCPResourceProvider +from .resource_clientside_callbacks import ClientsideCallbacksResource +from .resource_components import ComponentsResource +from .resource_layout import LayoutResource +from .resource_page_layout import PageLayoutResource +from .resource_pages import PagesResource -_RESOURCE_MODULES = [_layout, _components, _pages, _clientside, _page_layout] +_RESOURCE_PROVIDERS: list[type[MCPResourceProvider]] = [ + LayoutResource, + ComponentsResource, + PagesResource, + ClientsideCallbacksResource, + PageLayoutResource, +] def list_resources() -> ListResourcesResult: """Build the MCP resources/list response.""" resources = [ - r for mod in _RESOURCE_MODULES for r in [mod.get_resource()] if r is not None + r for p in _RESOURCE_PROVIDERS for r in [p.get_resource()] if r is not None ] return ListResourcesResult(resources=resources) @@ -39,14 +35,14 @@ def list_resources() -> ListResourcesResult: def list_resource_templates() -> ListResourceTemplatesResult: """Build the MCP resources/templates/list response.""" templates = [ - t for mod in _RESOURCE_MODULES for t in [mod.get_template()] if t is not None + t for p in _RESOURCE_PROVIDERS for t in [p.get_template()] if t is not None ] return ListResourceTemplatesResult(resourceTemplates=templates) def read_resource(uri: str) -> ReadResourceResult: - """Dispatch a resources/read request by URI prefix match.""" - for mod in _RESOURCE_MODULES: - if uri.startswith(mod.URI): - return mod.read_resource(uri) + """Route a resources/read request by URI prefix match.""" + for p in _RESOURCE_PROVIDERS: + if uri.startswith(p.uri): + return p.read_resource(uri) raise ValueError(f"Unknown resource URI: {uri}") diff --git a/dash/mcp/primitives/resources/base.py b/dash/mcp/primitives/resources/base.py new file mode 100644 index 0000000000..e63ffc9681 --- /dev/null +++ b/dash/mcp/primitives/resources/base.py @@ -0,0 +1,28 @@ +"""Base class for MCP resource providers.""" + +from __future__ import annotations + +from mcp.types import ReadResourceResult, Resource, ResourceTemplate + + +class MCPResourceProvider: + """Base class for MCP resource providers. + + Subclasses must set ``uri`` and implement ``read_resource``. + Override ``get_resource`` and/or ``get_template`` to advertise + the resource in ``resources/list`` or ``resources/templates/list``. + """ + + uri: str + + @classmethod + def get_resource(cls) -> Resource | None: + return None + + @classmethod + def get_template(cls) -> ResourceTemplate | None: + return None + + @classmethod + def read_resource(cls, uri: str) -> ReadResourceResult: + raise NotImplementedError diff --git a/dash/mcp/primitives/resources/resource_clientside_callbacks.py b/dash/mcp/primitives/resources/resource_clientside_callbacks.py index dbc3009edb..127c0f9adc 100644 --- a/dash/mcp/primitives/resources/resource_clientside_callbacks.py +++ b/dash/mcp/primitives/resources/resource_clientside_callbacks.py @@ -8,57 +8,56 @@ from mcp.types import ( ReadResourceResult, Resource, - ResourceTemplate, TextResourceContents, ) from dash import get_app from dash._utils import clean_property_name, split_callback_id -URI = "dash://clientside-callbacks" +from .base import MCPResourceProvider -def get_resource() -> Resource | None: - if not _get_clientside_callbacks(): - return None - return Resource( - uri=URI, - name="dash_clientside_callbacks", - description=( - "Actions the user can take manually in the browser " - "to affect clientside state. Inputs describe the " - "components that can be changed to trigger an effect. " - "Outputs describe the components that will change " - "in response." - ), - mimeType="application/json", - ) - - -def get_template() -> ResourceTemplate | None: - return None +class ClientsideCallbacksResource(MCPResourceProvider): + uri = "dash://clientside-callbacks" + @classmethod + def get_resource(cls) -> Resource | None: + if not _get_clientside_callbacks(): + return None + return Resource( + uri=cls.uri, + name="dash_clientside_callbacks", + description=( + "Actions the user can take manually in the browser " + "to affect clientside state. Inputs describe the " + "components that can be changed to trigger an effect. " + "Outputs describe the components that will change " + "in response." + ), + mimeType="application/json", + ) -def read_resource(uri: str = "") -> ReadResourceResult: - data = { - "description": ( - "These are actions that the user can take manually in the " - "browser to affect the clientside state. Inputs describe " - "the components that can be changed to trigger an effect. " - "Outputs describe the components that will change in " - "response to the effect." - ), - "callbacks": _get_clientside_callbacks(), - } - return ReadResourceResult( - contents=[ - TextResourceContents( - uri=URI, - mimeType="application/json", - text=json.dumps(data, default=str), - ) - ] - ) + @classmethod + def read_resource(cls, uri: str = "") -> ReadResourceResult: + data = { + "description": ( + "These are actions that the user can take manually in the " + "browser to affect the clientside state. Inputs describe " + "the components that can be changed to trigger an effect. " + "Outputs describe the components that will change in " + "response to the effect." + ), + "callbacks": _get_clientside_callbacks(), + } + return ReadResourceResult( + contents=[ + TextResourceContents( + uri=cls.uri, + mimeType="application/json", + text=json.dumps(data, default=str), + ) + ] + ) def _get_clientside_callbacks() -> list[dict[str, Any]]: diff --git a/dash/mcp/primitives/resources/resource_components.py b/dash/mcp/primitives/resources/resource_components.py index 8cf366f95c..8175aab72e 100644 --- a/dash/mcp/primitives/resources/resource_components.py +++ b/dash/mcp/primitives/resources/resource_components.py @@ -7,53 +7,52 @@ from mcp.types import ( ReadResourceResult, Resource, - ResourceTemplate, TextResourceContents, ) from dash import get_app from dash._layout_utils import traverse -URI = "dash://components" - - -def get_resource() -> Resource | None: - return Resource( - uri=URI, - name="dash_components", - description=( - "All components with IDs in the app layout. " - "Use get_dash_component with any of these IDs " - "to inspect their properties and values. " - "See dash://layout for the tree structure showing " - "how these components are nested in the page." - ), - mimeType="application/json", - ) - - -def get_template() -> ResourceTemplate | None: - return None - - -def read_resource(uri: str = "") -> ReadResourceResult: - app = get_app() - layout = app.get_layout() - components = sorted( - [ - {"id": str(comp.id), "type": getattr(comp, "_type", type(comp).__name__)} - for comp, _ in traverse(layout) - if getattr(comp, "id", None) is not None - ], - key=lambda c: c["id"], - ) - - return ReadResourceResult( - contents=[ - TextResourceContents( - uri=URI, - mimeType="application/json", - text=json.dumps(components), - ) - ] - ) +from .base import MCPResourceProvider + + +class ComponentsResource(MCPResourceProvider): + uri = "dash://components" + + @classmethod + def get_resource(cls) -> Resource | None: + return Resource( + uri=cls.uri, + name="dash_components", + description=( + "All components with IDs in the app layout. " + "Use get_dash_component with any of these IDs " + "to inspect their properties and values. " + "See dash://layout for the tree structure showing " + "how these components are nested in the page." + ), + mimeType="application/json", + ) + + @classmethod + def read_resource(cls, uri: str = "") -> ReadResourceResult: + app = get_app() + layout = app.get_layout() + components = sorted( + [ + {"id": str(comp.id), "type": getattr(comp, "_type", type(comp).__name__)} + for comp, _ in traverse(layout) + if getattr(comp, "id", None) is not None + ], + key=lambda c: c["id"], + ) + + return ReadResourceResult( + contents=[ + TextResourceContents( + uri=cls.uri, + mimeType="application/json", + text=json.dumps(components), + ) + ] + ) diff --git a/dash/mcp/primitives/resources/resource_layout.py b/dash/mcp/primitives/resources/resource_layout.py index 01d0be046d..753e2b9229 100644 --- a/dash/mcp/primitives/resources/resource_layout.py +++ b/dash/mcp/primitives/resources/resource_layout.py @@ -5,40 +5,39 @@ from mcp.types import ( ReadResourceResult, Resource, - ResourceTemplate, TextResourceContents, ) from dash import get_app from dash._utils import to_json -URI = "dash://layout" - - -def get_resource() -> Resource | None: - return Resource( - uri=URI, - name="dash_app_layout", - description=( - "Full component tree of the Dash app. " - "See dash://components for a compact list of component IDs." - ), - mimeType="application/json", - ) - - -def get_template() -> ResourceTemplate | None: - return None - - -def read_resource(uri: str = "") -> ReadResourceResult: - app = get_app() - return ReadResourceResult( - contents=[ - TextResourceContents( - uri=URI, - mimeType="application/json", - text=to_json(app.get_layout()), - ) - ] - ) +from .base import MCPResourceProvider + + +class LayoutResource(MCPResourceProvider): + uri = "dash://layout" + + @classmethod + def get_resource(cls) -> Resource | None: + return Resource( + uri=cls.uri, + name="dash_app_layout", + description=( + "Full component tree of the Dash app. " + "See dash://components for a compact list of component IDs." + ), + mimeType="application/json", + ) + + @classmethod + def read_resource(cls, uri: str = "") -> ReadResourceResult: + app = get_app() + return ReadResourceResult( + contents=[ + TextResourceContents( + uri=cls.uri, + mimeType="application/json", + text=to_json(app.get_layout()), + ) + ] + ) diff --git a/dash/mcp/primitives/resources/resource_page_layout.py b/dash/mcp/primitives/resources/resource_page_layout.py index d82d366298..02f322be25 100644 --- a/dash/mcp/primitives/resources/resource_page_layout.py +++ b/dash/mcp/primitives/resources/resource_page_layout.py @@ -4,74 +4,61 @@ from mcp.types import ( ReadResourceResult, - Resource, ResourceTemplate, TextResourceContents, ) +from dash._pages import PAGE_REGISTRY from dash._utils import to_json -URI = "dash://page-layout/" -_URI_TEMPLATE = "dash://page-layout/{path}" - - -def get_resource() -> Resource | None: - return None - - -def get_template() -> ResourceTemplate | None: - if not _has_pages(): - return None - return ResourceTemplate( - uriTemplate=_URI_TEMPLATE, - name="dash_page_layout", - description="Component tree for a specific page in the app.", - mimeType="application/json", - ) - - -def read_resource(uri: str) -> ReadResourceResult: - path = uri[len(URI) :] - if not path.startswith("/"): - path = "/" + path - - try: - from dash._pages import PAGE_REGISTRY - except ImportError: - raise ValueError("Dash Pages is not available.") - - page_layout = None - for _module, page in PAGE_REGISTRY.items(): - if page.get("path") == path: - page_layout = page.get("layout") - break - - if page_layout is None: - raise ValueError(f"Page not found: {path}") - - if callable(page_layout): - page_layout = page_layout() - - if isinstance(page_layout, (list, tuple)): - from dash import html - - page_layout = html.Div(list(page_layout)) - - return ReadResourceResult( - contents=[ - TextResourceContents( - uri=uri, - mimeType="application/json", - text=to_json(page_layout), - ) - ] - ) +from .base import MCPResourceProvider +_URI_TEMPLATE = "dash://page-layout/{path}" -def _has_pages() -> bool: - try: - from dash._pages import PAGE_REGISTRY - return bool(PAGE_REGISTRY) - except ImportError: - return False +class PageLayoutResource(MCPResourceProvider): + uri = "dash://page-layout/" + + @classmethod + def get_template(cls) -> ResourceTemplate | None: + if not PAGE_REGISTRY: + return None + return ResourceTemplate( + uriTemplate=_URI_TEMPLATE, + name="dash_page_layout", + description="Component tree for a specific page in the app.", + mimeType="application/json", + ) + + @classmethod + def read_resource(cls, uri: str) -> ReadResourceResult: + path = uri[len(cls.uri):] + if not path.startswith("/"): + path = "/" + path + + page_layout = None + for _module, page in PAGE_REGISTRY.items(): + if page.get("path") == path: + page_layout = page.get("layout") + break + + if page_layout is None: + raise ValueError(f"Page not found: {path}") + + if callable(page_layout): + page_layout = page_layout() + + if isinstance(page_layout, (list, tuple)): + from dash import html + + page_layout = html.Div(list(page_layout)) + + return ReadResourceResult( + contents=[ + TextResourceContents( + uri=uri, + mimeType="application/json", + text=to_json(page_layout), + ) + ] + ) diff --git a/dash/mcp/primitives/resources/resource_pages.py b/dash/mcp/primitives/resources/resource_pages.py index 51a61b9f00..27c39013f3 100644 --- a/dash/mcp/primitives/resources/resource_pages.py +++ b/dash/mcp/primitives/resources/resource_pages.py @@ -7,70 +7,53 @@ from mcp.types import ( ReadResourceResult, Resource, - ResourceTemplate, TextResourceContents, ) -URI = "dash://pages" +from dash._pages import PAGE_REGISTRY +from .base import MCPResourceProvider -def _has_pages() -> bool: - try: - from dash._pages import PAGE_REGISTRY - return bool(PAGE_REGISTRY) - except ImportError: - return False +class PagesResource(MCPResourceProvider): + uri = "dash://pages" + @classmethod + def get_resource(cls) -> Resource | None: + if not PAGE_REGISTRY: + return None + return Resource( + uri=cls.uri, + name="dash_app_pages", + description=( + "List of all pages in this multi-page Dash app " + "with paths, names, titles, and descriptions." + ), + mimeType="application/json", + ) -def get_resource() -> Resource | None: - if not _has_pages(): - return None - return Resource( - uri=URI, - name="dash_app_pages", - description=( - "List of all pages in this multi-page Dash app " - "with paths, names, titles, and descriptions." - ), - mimeType="application/json", - ) - - -def get_template() -> ResourceTemplate | None: - return None - + @classmethod + def read_resource(cls, uri: str = "") -> ReadResourceResult: + pages = [] + for module, page in PAGE_REGISTRY.items(): + title = page.get("title", "") + description = page.get("description", "") + pages.append( + { + "module": module, + "path": page.get("path", ""), + "name": page.get("name", ""), + "title": title if not callable(title) else page.get("name", ""), + "description": description if not callable(description) else "", + } + ) -def read_resource(uri: str = "") -> ReadResourceResult: - try: - from dash._pages import PAGE_REGISTRY - except ImportError: return ReadResourceResult( contents=[ - TextResourceContents(uri=URI, mimeType="application/json", text="[]") + TextResourceContents( + uri=cls.uri, + mimeType="application/json", + text=json.dumps(pages, default=str), + ) ] ) - - pages = [] - for module, page in PAGE_REGISTRY.items(): - title = page.get("title", "") - description = page.get("description", "") - pages.append( - { - "module": module, - "path": page.get("path", ""), - "name": page.get("name", ""), - "title": title if not callable(title) else page.get("name", ""), - "description": description if not callable(description) else "", - } - ) - - return ReadResourceResult( - contents=[ - TextResourceContents( - uri=URI, - mimeType="application/json", - text=json.dumps(pages, default=str), - ) - ] - ) diff --git a/tests/unit/mcp/primitives/resources/test_resource_page_layout.py b/tests/unit/mcp/primitives/resources/test_resource_page_layout.py index 88ffd82118..f4e9caac5d 100644 --- a/tests/unit/mcp/primitives/resources/test_resource_page_layout.py +++ b/tests/unit/mcp/primitives/resources/test_resource_page_layout.py @@ -46,7 +46,10 @@ def test_read_page_layout(self): }, } with app.server.test_request_context(): - with patch("dash._pages.PAGE_REGISTRY", fake_registry): + with patch( + "dash.mcp.primitives.resources.resource_page_layout.PAGE_REGISTRY", + fake_registry, + ): result = read_resource("dash://page-layout/test") layout = json.loads(result.contents[0].text) assert layout == EXPECTED_PAGE_LAYOUT diff --git a/tests/unit/mcp/primitives/resources/test_resource_pages.py b/tests/unit/mcp/primitives/resources/test_resource_pages.py index b2307d6fef..22e6e798fc 100644 --- a/tests/unit/mcp/primitives/resources/test_resource_pages.py +++ b/tests/unit/mcp/primitives/resources/test_resource_pages.py @@ -43,7 +43,10 @@ def test_listed_for_multi_page_app(self): } } with app.server.test_request_context(): - with patch("dash._pages.PAGE_REGISTRY", fake_registry): + with patch( + "dash.mcp.primitives.resources.resource_pages.PAGE_REGISTRY", + fake_registry, + ): result = list_resources() uris = [str(r.uri) for r in result.resources] assert "dash://pages" in uris @@ -55,7 +58,10 @@ def test_returns_page_info(self): "pages.analytics": EXPECTED_PAGES[1], } with app.server.test_request_context(): - with patch("dash._pages.PAGE_REGISTRY", fake_registry): + with patch( + "dash.mcp.primitives.resources.resource_pages.PAGE_REGISTRY", + fake_registry, + ): result = read_resource("dash://pages") content = json.loads(result.contents[0].text) assert content == EXPECTED_PAGES @@ -71,7 +77,10 @@ def test_callable_title_falls_back_to_name(self): }, } with app.server.test_request_context(): - with patch("dash._pages.PAGE_REGISTRY", fake_registry): + with patch( + "dash.mcp.primitives.resources.resource_pages.PAGE_REGISTRY", + fake_registry, + ): result = read_resource("dash://pages") page = json.loads(result.contents[0].text)[0] assert page["title"] == "Item Detail" From f8d9739d3298345743d0cab66db84abcb3d04802 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 16 Apr 2026 11:51:20 -0600 Subject: [PATCH 022/103] lint --- dash/mcp/primitives/resources/resource_components.py | 5 ++++- dash/mcp/primitives/resources/resource_page_layout.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/dash/mcp/primitives/resources/resource_components.py b/dash/mcp/primitives/resources/resource_components.py index 8175aab72e..9d035a855f 100644 --- a/dash/mcp/primitives/resources/resource_components.py +++ b/dash/mcp/primitives/resources/resource_components.py @@ -40,7 +40,10 @@ def read_resource(cls, uri: str = "") -> ReadResourceResult: layout = app.get_layout() components = sorted( [ - {"id": str(comp.id), "type": getattr(comp, "_type", type(comp).__name__)} + { + "id": str(comp.id), + "type": getattr(comp, "_type", type(comp).__name__), + } for comp, _ in traverse(layout) if getattr(comp, "id", None) is not None ], diff --git a/dash/mcp/primitives/resources/resource_page_layout.py b/dash/mcp/primitives/resources/resource_page_layout.py index 02f322be25..c1218a57d0 100644 --- a/dash/mcp/primitives/resources/resource_page_layout.py +++ b/dash/mcp/primitives/resources/resource_page_layout.py @@ -32,7 +32,7 @@ def get_template(cls) -> ResourceTemplate | None: @classmethod def read_resource(cls, uri: str) -> ReadResourceResult: - path = uri[len(cls.uri):] + path = uri[len(cls.uri) :] if not path.startswith("/"): path = "/" + path From 6d4e2a0c2badc3b8c06f17ae675a57366f6d8358 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 22 Apr 2026 11:22:22 -0600 Subject: [PATCH 023/103] Fix pylint errors --- dash/mcp/__init__.py | 0 dash/mcp/primitives/__init__.py | 0 .../resources/resource_page_layout.py | 3 +- dash/mcp/primitives/tools/__init__.py | 0 dash/mcp/primitives/tools/callback_adapter.py | 8 ++--- .../tools/callback_adapter_collection.py | 29 +++++++++++-------- dash/mcp/primitives/tools/callback_utils.py | 3 +- .../primitives/tools/descriptions/__init__.py | 2 +- .../tools/input_schemas/__init__.py | 2 +- dash/mcp/types/exceptions.py | 2 -- dash/mcp/types/typing_utils.py | 2 +- 11 files changed, 26 insertions(+), 25 deletions(-) create mode 100644 dash/mcp/__init__.py create mode 100644 dash/mcp/primitives/__init__.py create mode 100644 dash/mcp/primitives/tools/__init__.py diff --git a/dash/mcp/__init__.py b/dash/mcp/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/dash/mcp/primitives/__init__.py b/dash/mcp/primitives/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/dash/mcp/primitives/resources/resource_page_layout.py b/dash/mcp/primitives/resources/resource_page_layout.py index c1218a57d0..613f0b41b9 100644 --- a/dash/mcp/primitives/resources/resource_page_layout.py +++ b/dash/mcp/primitives/resources/resource_page_layout.py @@ -8,6 +8,7 @@ TextResourceContents, ) +from dash import html from dash._pages import PAGE_REGISTRY from dash._utils import to_json @@ -49,8 +50,6 @@ def read_resource(cls, uri: str) -> ReadResourceResult: page_layout = page_layout() if isinstance(page_layout, (list, tuple)): - from dash import html - page_layout = html.Div(list(page_layout)) return ReadResourceResult( diff --git a/dash/mcp/primitives/tools/__init__.py b/dash/mcp/primitives/tools/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/dash/mcp/primitives/tools/callback_adapter.py b/dash/mcp/primitives/tools/callback_adapter.py index 9dcb8d959e..1ed30cdad8 100644 --- a/dash/mcp/primitives/tools/callback_adapter.py +++ b/dash/mcp/primitives/tools/callback_adapter.py @@ -126,11 +126,11 @@ def output_id(self) -> str: @property def tool_name(self) -> str: - return get_app().mcp_callback_map._tool_names_map[self._output_id] + return get_app().mcp_callback_map._tool_names_map[self._output_id] # pylint: disable=protected-access @cached_property def prevents_initial_call(self) -> bool: - for cb in get_app()._callback_list: + for cb in get_app()._callback_list: # pylint: disable=protected-access if cb["output"] == self._output_id: return cb.get("prevent_initial_call", False) return False @@ -191,7 +191,7 @@ def _initial_output(self) -> dict[str, CallbackOutput]: try: result = run_callback(self, kwargs) return result.get("response", {}) - except Exception: + except Exception: # pylint: disable=broad-exception-caught return {} def initial_output_value(self, id_and_prop: str) -> Any: @@ -346,7 +346,7 @@ def _param_annotations(self) -> list[Any | None]: return [None] * len(self._dep_param_map) try: hints = typing.get_type_hints(self._original_func) - except Exception: + except Exception: # pylint: disable=broad-exception-caught hints = getattr(self._original_func, "__annotations__", {}) return [hints.get(func_name) for func_name, _ in self._dep_param_map] diff --git a/dash/mcp/primitives/tools/callback_adapter_collection.py b/dash/mcp/primitives/tools/callback_adapter_collection.py index 59c1a7ac47..8e5769124b 100644 --- a/dash/mcp/primitives/tools/callback_adapter_collection.py +++ b/dash/mcp/primitives/tools/callback_adapter_collection.py @@ -109,10 +109,9 @@ def get_initial_value(self, id_and_prop: str) -> Any: upstream_cb = self.find_by_output(id_and_prop) if upstream_cb is not None: return upstream_cb.initial_output_value(id_and_prop) - else: - component_id, prop = id_and_prop.rsplit(".", 1) - layout_component = find_component(component_id) - return getattr(layout_component, prop, None) + component_id, prop = id_and_prop.rsplit(".", 1) + layout_component = find_component(component_id) + return getattr(layout_component, prop, None) def as_mcp_tools(self) -> list[Tool]: """Stub — will be implemented in a future PR.""" @@ -142,13 +141,19 @@ def component_label_map(self) -> dict[str, list[str]]: comp_id = getattr(comp, "id", None) if comp_id is not None: - for ancestor in reversed(ancestors): - if getattr(ancestor, "_type", None) == "Label": - text = extract_text(ancestor) - if text: - sid = str(comp_id) - if text not in labels.get(sid, []): - labels.setdefault(sid, []).append(text) - break + self._add_ancestor_label(comp_id, ancestors, labels) return labels + + @staticmethod + def _add_ancestor_label(comp_id, ancestors, labels: dict[str, list[str]]) -> None: + """Record the text of the nearest Label ancestor for ``comp_id``, if any.""" + for ancestor in reversed(ancestors): + if getattr(ancestor, "_type", None) != "Label": + continue + text = extract_text(ancestor) + if text: + sid = str(comp_id) + if text not in labels.get(sid, []): + labels.setdefault(sid, []).append(text) + return diff --git a/dash/mcp/primitives/tools/callback_utils.py b/dash/mcp/primitives/tools/callback_utils.py index 0ff4f5f578..361b27fc32 100644 --- a/dash/mcp/primitives/tools/callback_utils.py +++ b/dash/mcp/primitives/tools/callback_utils.py @@ -6,6 +6,7 @@ from typing import TYPE_CHECKING, Any from dash import get_app +from dash.mcp.types import CallbackExecutionError from dash.types import CallbackExecutionResponse if TYPE_CHECKING: @@ -16,8 +17,6 @@ def run_callback( callback: CallbackAdapter, kwargs: dict[str, Any] ) -> CallbackExecutionResponse: """Execute a callback via the framework.""" - from dash.mcp.types import CallbackExecutionError - body = callback.as_callback_body(kwargs) app = get_app() diff --git a/dash/mcp/primitives/tools/descriptions/__init__.py b/dash/mcp/primitives/tools/descriptions/__init__.py index 67ec78c9ff..b3c0dd3527 100644 --- a/dash/mcp/primitives/tools/descriptions/__init__.py +++ b/dash/mcp/primitives/tools/descriptions/__init__.py @@ -1,7 +1,7 @@ """Stub — real implementation in a later PR.""" -def build_tool_description(outputs, docstring=None): +def build_tool_description(outputs, docstring=None): # pylint: disable=unused-argument if docstring: return docstring.strip() return "Dash callback" diff --git a/dash/mcp/primitives/tools/input_schemas/__init__.py b/dash/mcp/primitives/tools/input_schemas/__init__.py index f306042a0c..968363ff99 100644 --- a/dash/mcp/primitives/tools/input_schemas/__init__.py +++ b/dash/mcp/primitives/tools/input_schemas/__init__.py @@ -1,5 +1,5 @@ """Stub — real implementation in a later PR.""" -def get_input_schema(param): +def get_input_schema(param): # pylint: disable=unused-argument return {} diff --git a/dash/mcp/types/exceptions.py b/dash/mcp/types/exceptions.py index 4b860f4bba..578fa51cc9 100644 --- a/dash/mcp/types/exceptions.py +++ b/dash/mcp/types/exceptions.py @@ -26,5 +26,3 @@ class InvalidParamsError(MCPError): class CallbackExecutionError(MCPError): """Callback raised an exception during execution.""" - - pass diff --git a/dash/mcp/types/typing_utils.py b/dash/mcp/types/typing_utils.py index 9a96d4135d..e685f5808b 100644 --- a/dash/mcp/types/typing_utils.py +++ b/dash/mcp/types/typing_utils.py @@ -14,7 +14,7 @@ def is_nullable(annotation: Any) -> bool: _is_union = origin is typing.Union if not _is_union: try: - import types as _types + import types as _types # pylint: disable=import-outside-toplevel if isinstance(annotation, _types.UnionType): _is_union = True From ef1ea3fbb5bf383a4ac3d85f96124bb3a9b83671 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 1 Apr 2026 13:05:07 -0600 Subject: [PATCH 024/103] Implement callbacks as tools with rich input/output schema and description generation --- dash/mcp/primitives/tools/callback_adapter.py | 13 +- .../tools/callback_adapter_collection.py | 3 +- .../primitives/tools/descriptions/__init__.py | 35 +- .../descriptions/description_docstring.py | 15 + .../tools/descriptions/description_outputs.py | 56 +++ .../tools/input_schemas/__init__.py | 44 +- .../input_descriptions/__init__.py | 31 ++ .../description_component_props.py | 81 ++++ .../description_docstrings.py | 71 +++ .../description_html_labels.py | 23 + .../schema_callback_type_annotations.py | 67 +++ .../schema_component_proptypes.py | 32 ++ .../schema_component_proptypes_overrides.py | 70 +++ .../tools/output_schemas/__init__.py | 28 +- .../schema_callback_response.py | 16 + tests/unit/mcp/conftest.py | 81 ++++ .../unit/mcp/tools/input_schemas/__init__.py | 0 .../input_descriptions/__init__.py | 0 .../input_descriptions/test_descriptions.py | 424 ++++++++++++++++++ .../tools/input_schemas/test_input_schemas.py | 331 ++++++++++++++ .../test_schema_component_proptypes.py | 15 + tests/unit/mcp/tools/test_callback_adapter.py | 167 ++++++- tests/unit/mcp/tools/test_tool_schema.py | 64 +++ 23 files changed, 1652 insertions(+), 15 deletions(-) create mode 100644 dash/mcp/primitives/tools/descriptions/description_docstring.py create mode 100644 dash/mcp/primitives/tools/descriptions/description_outputs.py create mode 100644 dash/mcp/primitives/tools/input_schemas/input_descriptions/__init__.py create mode 100644 dash/mcp/primitives/tools/input_schemas/input_descriptions/description_component_props.py create mode 100644 dash/mcp/primitives/tools/input_schemas/input_descriptions/description_docstrings.py create mode 100644 dash/mcp/primitives/tools/input_schemas/input_descriptions/description_html_labels.py create mode 100644 dash/mcp/primitives/tools/input_schemas/schema_callback_type_annotations.py create mode 100644 dash/mcp/primitives/tools/input_schemas/schema_component_proptypes.py create mode 100644 dash/mcp/primitives/tools/input_schemas/schema_component_proptypes_overrides.py create mode 100644 dash/mcp/primitives/tools/output_schemas/schema_callback_response.py create mode 100644 tests/unit/mcp/tools/input_schemas/__init__.py create mode 100644 tests/unit/mcp/tools/input_schemas/input_descriptions/__init__.py create mode 100644 tests/unit/mcp/tools/input_schemas/input_descriptions/test_descriptions.py create mode 100644 tests/unit/mcp/tools/input_schemas/test_input_schemas.py create mode 100644 tests/unit/mcp/tools/input_schemas/test_schema_component_proptypes.py create mode 100644 tests/unit/mcp/tools/test_tool_schema.py diff --git a/dash/mcp/primitives/tools/callback_adapter.py b/dash/mcp/primitives/tools/callback_adapter.py index 1ed30cdad8..c7044de3f4 100644 --- a/dash/mcp/primitives/tools/callback_adapter.py +++ b/dash/mcp/primitives/tools/callback_adapter.py @@ -50,8 +50,17 @@ def __init__(self, callback_output_id: str): @cached_property def as_mcp_tool(self) -> Tool: - """Stub — will be implemented in a future PR.""" - raise NotImplementedError("as_mcp_tool will be implemented in a future PR.") + """Transforms the internal Dash callback to a structured MCP tool. + + This tool can be serialized for LLM consumption or used internally for + its computed data. + """ + return Tool( + name=self.tool_name, + description=self._description, + inputSchema=self._input_schema, + outputSchema=self._output_schema, + ) def as_callback_body(self, kwargs: dict[str, Any]) -> CallbackExecutionBody: """Transforms the given kwargs to a dict suitable for calling this callback. diff --git a/dash/mcp/primitives/tools/callback_adapter_collection.py b/dash/mcp/primitives/tools/callback_adapter_collection.py index 8e5769124b..0304394f63 100644 --- a/dash/mcp/primitives/tools/callback_adapter_collection.py +++ b/dash/mcp/primitives/tools/callback_adapter_collection.py @@ -114,8 +114,7 @@ def get_initial_value(self, id_and_prop: str) -> Any: return getattr(layout_component, prop, None) def as_mcp_tools(self) -> list[Tool]: - """Stub — will be implemented in a future PR.""" - raise NotImplementedError("as_mcp_tools will be implemented in a future PR.") + return [cb.as_mcp_tool for cb in self._callbacks if cb.is_valid] @property def tool_names(self) -> set[str]: diff --git a/dash/mcp/primitives/tools/descriptions/__init__.py b/dash/mcp/primitives/tools/descriptions/__init__.py index b3c0dd3527..d464677251 100644 --- a/dash/mcp/primitives/tools/descriptions/__init__.py +++ b/dash/mcp/primitives/tools/descriptions/__init__.py @@ -1,7 +1,32 @@ -"""Stub — real implementation in a later PR.""" +"""Tool-level description generation for MCP tools. +Each source shares the same signature: +``(outputs, docstring) -> list[str]`` -def build_tool_description(outputs, docstring=None): # pylint: disable=unused-argument - if docstring: - return docstring.strip() - return "Dash callback" +This is distinct from per-parameter descriptions +(in ``input_schemas/input_descriptions/``) which populate +``inputSchema.properties.{param}.description``. +""" + +from __future__ import annotations + +from typing import Any + +from .description_docstring import callback_docstring +from .description_outputs import output_summary + +_SOURCES = [ + output_summary, + callback_docstring, +] + + +def build_tool_description( + outputs: list[dict[str, Any]], + docstring: str | None = None, +) -> str: + """Build a human-readable description for an MCP tool.""" + lines: list[str] = [] + for source in _SOURCES: + lines.extend(source(outputs, docstring)) + return "\n".join(lines) if lines else "Dash callback" diff --git a/dash/mcp/primitives/tools/descriptions/description_docstring.py b/dash/mcp/primitives/tools/descriptions/description_docstring.py new file mode 100644 index 0000000000..71cf4d3d5a --- /dev/null +++ b/dash/mcp/primitives/tools/descriptions/description_docstring.py @@ -0,0 +1,15 @@ +"""Callback docstring for tool descriptions.""" + +from __future__ import annotations + +from typing import Any + + +def callback_docstring( + outputs: list[dict[str, Any]], + docstring: str | None = None, +) -> list[str]: + """Return the callback's docstring as description lines.""" + if docstring: + return ["", docstring.strip()] + return [] diff --git a/dash/mcp/primitives/tools/descriptions/description_outputs.py b/dash/mcp/primitives/tools/descriptions/description_outputs.py new file mode 100644 index 0000000000..c174c177f4 --- /dev/null +++ b/dash/mcp/primitives/tools/descriptions/description_outputs.py @@ -0,0 +1,56 @@ +"""Output summary for tool descriptions.""" + +from __future__ import annotations + +from typing import Any + +_OUTPUT_SEMANTICS: dict[tuple[str | None, str], str] = { + ("Graph", "figure"): "Returns chart/visualization data", + ("DataTable", "data"): "Returns tabular data", + ("DataTable", "columns"): "Returns table column definitions", + ("Dropdown", "options"): "Returns selection options", + ("Dropdown", "value"): "Updates a selection value", + ("RadioItems", "options"): "Returns selection options", + ("Checklist", "options"): "Returns selection options", + ("Store", "data"): "Returns stored data", + ("Download", "data"): "Returns downloadable content", + ("Markdown", "children"): "Returns formatted text", + (None, "figure"): "Returns chart/visualization data", + (None, "data"): "Returns data", + (None, "options"): "Returns selection options", + (None, "columns"): "Returns column definitions", + (None, "children"): "Returns content", + (None, "value"): "Returns a value", + (None, "style"): "Updates styling", + (None, "disabled"): "Updates enabled/disabled state", +} + + +def output_summary( + outputs: list[dict[str, Any]], + docstring: str | None = None, +) -> list[str]: + """Produce a short summary of what the callback outputs represent.""" + if not outputs: + return ["Dash callback"] + + lines: list[str] = [] + for out in outputs: + comp_id = out["component_id"] + prop = out["property"] + comp_type = out.get("component_type") + + semantic = _OUTPUT_SEMANTICS.get((comp_type, prop)) + if semantic is None: + semantic = _OUTPUT_SEMANTICS.get((None, prop)) + + if semantic is not None: + lines.append(f"- {comp_id}.{prop}: {semantic}") + else: + lines.append(f"- {comp_id}.{prop}") + + n = len(outputs) + if n == 1: + return [lines[0].lstrip("- ")] + header = f"Returns {n} output{'s' if n > 1 else ''}:" + return [header] + lines diff --git a/dash/mcp/primitives/tools/input_schemas/__init__.py b/dash/mcp/primitives/tools/input_schemas/__init__.py index 968363ff99..2c1646f56a 100644 --- a/dash/mcp/primitives/tools/input_schemas/__init__.py +++ b/dash/mcp/primitives/tools/input_schemas/__init__.py @@ -1,5 +1,43 @@ -"""Stub — real implementation in a later PR.""" +"""Input schema generation for MCP tool inputSchema fields. +Mirrors ``output_schemas/`` which generates ``outputSchema``. -def get_input_schema(param): # pylint: disable=unused-argument - return {} +Each source is tried in priority order. All share the same signature: +``(param: MCPInput) -> dict | None``. +""" + +from __future__ import annotations + +from typing import Any + +from dash.mcp.types import MCPInput +from .schema_callback_type_annotations import annotation_to_schema +from .schema_component_proptypes_overrides import get_override_schema +from .schema_component_proptypes import get_component_prop_schema +from .input_descriptions import get_property_description + +_SOURCES = [ + annotation_to_schema, + get_override_schema, + get_component_prop_schema, +] + + +def get_input_schema(param: MCPInput) -> dict[str, Any]: + """Return the complete JSON Schema for a callback input parameter. + + Type sources provide ``type``/``enum`` (first non-None wins). + Description is assembled by ``input_descriptions``. + """ + schema: dict[str, Any] = {} + for source in _SOURCES: + result = source(param) + if result is not None: + schema = result + break + + description = get_property_description(param) + if description: + schema = {**schema, "description": description} + + return schema diff --git a/dash/mcp/primitives/tools/input_schemas/input_descriptions/__init__.py b/dash/mcp/primitives/tools/input_schemas/input_descriptions/__init__.py new file mode 100644 index 0000000000..e1d1e9f47c --- /dev/null +++ b/dash/mcp/primitives/tools/input_schemas/input_descriptions/__init__.py @@ -0,0 +1,31 @@ +"""Per-property description generation for MCP tool input parameters. + +Each source shares the same signature: +``(param: MCPInput) -> list[str]`` + +Sources are tried in order from most generic to most instance-specific. +All sources that produce lines are combined. +""" + +from __future__ import annotations + +from dash.mcp.types import MCPInput +from .description_component_props import component_props_description +from .description_docstrings import docstring_prop_description +from .description_html_labels import label_description + +_SOURCES = [ + docstring_prop_description, + label_description, + component_props_description, +] + + +def get_property_description(param: MCPInput) -> str | None: + """Build a complete description string for a callback input parameter.""" + lines: list[str] = [] + if not param.get("required", True): + lines.append("Input is optional.") + for source in _SOURCES: + lines.extend(source(param)) + return "\n".join(lines) if lines else None diff --git a/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_component_props.py b/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_component_props.py new file mode 100644 index 0000000000..6934918260 --- /dev/null +++ b/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_component_props.py @@ -0,0 +1,81 @@ +"""Generic component property descriptions. + +Generate a description for each component prop that has a value (either set +directly in the layout or by an upstream callback). +""" + +from __future__ import annotations + +from typing import Any + +from dash import get_app +from dash.mcp.types import MCPInput + +_MAX_VALUE_LENGTH = 200 + +_MCP_EXCLUDED_PROPS = {"id", "className", "style"} + +_PROP_TEMPLATES: dict[tuple[str | None, str], str] = { + ("Store", "storage_type"): ( + "storage_type: {value}. Describes how to store the value client-side" + "'memory' resets on page refresh. " + "'session' persists for the duration of this session. " + "'local' persists on disk until explicitly cleared." + ), +} + + +def component_props_description(param: MCPInput) -> list[str]: + component = param.get("component") + if component is None: + return [] + + component_id = param["component_id"] + cbmap = get_app().mcp_callback_map + prop_lines: list[str] = [] + + for prop_name in getattr(component, "_prop_names", []): + if prop_name in _MCP_EXCLUDED_PROPS: + continue + + upstream = cbmap.find_by_output(f"{component_id}.{prop_name}") + if upstream is not None and not upstream.prevents_initial_call: + value = upstream.initial_output_value(f"{component_id}.{prop_name}") + else: + value = getattr(component, prop_name, None) + tool_name = upstream.tool_name if upstream is not None else None + + if value is None and tool_name is None: + continue + + component_type = param.get("component_type") + template = _PROP_TEMPLATES.get((component_type, prop_name)) + formatted_value = ( + _truncate_large_values(value, component_id, prop_name) + if value is not None + else None + ) + + if template and formatted_value is not None: + line = template.format(value=formatted_value) + elif formatted_value is not None: + line = f"{prop_name}: {formatted_value}" + else: + line = prop_name + + if tool_name: + line += f" (can be updated by tool: `{tool_name}`)" + + prop_lines.append(line) + + if not prop_lines: + return [] + return [f"Component properties for {component_id}:"] + prop_lines + + +def _truncate_large_values(value: Any, component_id: str, prop_name: str) -> str: + text = repr(value) + if len(text) > _MAX_VALUE_LENGTH: + hint = f"Use get_dash_component('{component_id}', '{prop_name}') for the full value" + return f"{text[:_MAX_VALUE_LENGTH]}... ({hint})" + return text diff --git a/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_docstrings.py b/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_docstrings.py new file mode 100644 index 0000000000..1f67c3c0f2 --- /dev/null +++ b/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_docstrings.py @@ -0,0 +1,71 @@ +"""Extract property descriptions from component class docstrings. + +Dash component classes have structured docstrings generated by +``dash-generate-components`` in the format:: + + Keyword arguments: + + - prop_name (type_string; optional): + Description text that may span + multiple lines. + +This module parses that format and returns the first sentence of the +description for a given property. +""" + +from __future__ import annotations + +import re + +from dash.mcp.types import MCPInput + +_PROP_RE = re.compile( + r"^[ ]*- (\w+) \([^)]+\):\s*\n((?:[ ]+.+\n)*)", + re.MULTILINE, +) + +_cache: dict[type, dict[str, str]] = {} + +_SENTENCE_END = re.compile(r"(?<=[.!?])\s") + + +def docstring_prop_description(param: MCPInput) -> list[str]: + component = param.get("component") + if component is None: + return [] + desc = _get_prop_description(type(component), param["property"]) + return [desc] if desc else [] + + +def _get_prop_description(cls: type, prop: str) -> str | None: + props = _parse_docstring(cls) + return props.get(prop) + + +def _parse_docstring(cls: type) -> dict[str, str]: + if cls in _cache: + return _cache[cls] + + doc = getattr(cls, "__doc__", None) + if not doc: + _cache[cls] = {} + return _cache[cls] + + props: dict[str, str] = {} + for match in _PROP_RE.finditer(doc): + prop_name = match.group(1) + raw_desc = match.group(2) + lines = [line.strip() for line in raw_desc.strip().splitlines()] + desc = " ".join(lines) + if desc: + props[prop_name] = _first_sentence(desc) + + _cache[cls] = props + return props + + +def _first_sentence(text: str) -> str: + m = _SENTENCE_END.search(text) + if m: + return text[: m.start() + 1].rstrip() + return text diff --git a/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_html_labels.py b/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_html_labels.py new file mode 100644 index 0000000000..2c9cd8dea9 --- /dev/null +++ b/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_html_labels.py @@ -0,0 +1,23 @@ +"""Label-based property descriptions. + +Reads the label map from the ``CallbackAdapterCollection``, +which builds it from the layout using ``htmlFor`` and +containment associations. +""" + +from __future__ import annotations + +from dash import get_app +from dash.mcp.types import MCPInput + + +def label_description(param: MCPInput) -> list[str]: + """Return the label text for this component, if any.""" + component_id = param.get("component_id") + if not component_id: + return [] + label_map = get_app().mcp_callback_map.component_label_map + texts = label_map.get(component_id, []) + if texts: + return [f"Labeled with: {'; '.join(texts)}"] + return [] diff --git a/dash/mcp/primitives/tools/input_schemas/schema_callback_type_annotations.py b/dash/mcp/primitives/tools/input_schemas/schema_callback_type_annotations.py new file mode 100644 index 0000000000..aee5b17c6f --- /dev/null +++ b/dash/mcp/primitives/tools/input_schemas/schema_callback_type_annotations.py @@ -0,0 +1,67 @@ +"""Map callback function type annotations to JSON Schema. + +When a callback function has explicit type annotations, those take +priority over all other schema sources (static overrides, component +introspection). + +Unlike component annotations (where nullable means "not required"), +callback annotations preserve ``null`` in the schema type when the +user writes ``Optional[X]`` — the user is explicitly saying the +value can be null. + +Also provides ``annotation_to_json_schema``, the shared low-level +converter used by both callback and component annotation pipelines. +""" + +from __future__ import annotations + +import inspect +from typing import Any + +from pydantic import TypeAdapter + +from dash.development.base_component import Component +from dash.mcp.types import MCPInput, is_nullable + + +def annotation_to_json_schema(annotation: type) -> dict[str, Any] | None: + """Convert a Python type annotation to a JSON Schema dict. + + Returns ``None`` if the annotation cannot be translated. + """ + if annotation is inspect.Parameter.empty or annotation is type(None): + return None + + if isinstance(annotation, type) and issubclass(annotation, Component): + return {"type": "string"} + + try: + return TypeAdapter(annotation).json_schema() + except Exception: + return None + + +def annotation_to_schema(param: MCPInput) -> dict[str, Any] | None: + """Convert a callback parameter's type annotation to a JSON Schema dict. + + Returns ``None`` if the annotation is not recognised, meaning the + caller should fall through to the next schema source. + + ``Optional[X]`` produces ``{"type": ["X", "null"]}`` — the user + explicitly chose a nullable type. + """ + annotation = param.get("annotation") + if annotation is None: + return None + schema = annotation_to_json_schema(annotation) + if schema is None: + return None + + if is_nullable(annotation) and schema: + t = schema.get("type") + if isinstance(t, str): + schema = {**schema, "type": [t, "null"]} + elif isinstance(t, list) and "null" not in t: + schema = {**schema, "type": [*t, "null"]} + + return schema diff --git a/dash/mcp/primitives/tools/input_schemas/schema_component_proptypes.py b/dash/mcp/primitives/tools/input_schemas/schema_component_proptypes.py new file mode 100644 index 0000000000..151e391cf4 --- /dev/null +++ b/dash/mcp/primitives/tools/input_schemas/schema_component_proptypes.py @@ -0,0 +1,32 @@ +"""Derive JSON Schema from a component's ``__init__`` type annotations.""" + +from __future__ import annotations + +import inspect +from typing import Any + +from dash.mcp.types import MCPInput +from .schema_callback_type_annotations import annotation_to_json_schema + + +def get_component_prop_schema(param: MCPInput) -> dict[str, Any] | None: + """Return the JSON Schema for a component property. + + Inspects the ``__init__`` signature of the component's class. + Returns ``None`` if the prop has no annotation. + """ + component = param.get("component") + prop = param["property"] + if component is None: + return None + + try: + sig = inspect.signature(type(component).__init__) + except (ValueError, TypeError): + return None + + sig_param = sig.parameters.get(prop) + if sig_param is None or sig_param.annotation is inspect.Parameter.empty: + return None + + return annotation_to_json_schema(sig_param.annotation) diff --git a/dash/mcp/primitives/tools/input_schemas/schema_component_proptypes_overrides.py b/dash/mcp/primitives/tools/input_schemas/schema_component_proptypes_overrides.py new file mode 100644 index 0000000000..25086896e7 --- /dev/null +++ b/dash/mcp/primitives/tools/input_schemas/schema_component_proptypes_overrides.py @@ -0,0 +1,70 @@ +"""A place to manually define Schemas that override component-defined prop types +where type generation produces insufficient results. +""" + +from __future__ import annotations + +from typing import Any + +from dash.mcp.types import MCPInput +from .schema_component_proptypes import get_component_prop_schema + +_DATE_SCHEMA = { + "type": "string", + "format": "date", + "pattern": r"^\d{4}-\d{2}-\d{2}$", +} + + +def _compute_dropdown_value_schema(param: MCPInput) -> dict[str, Any] | None: + """Dropdown values are an array if `multi=True`; scalar values otherwise.""" + schema = get_component_prop_schema(param) + if schema is None: + return None + + component = param.get("component") + t = schema.get("type") + if not isinstance(t, list): + return schema + + if getattr(component, "multi", False): + items_schema = schema.get("items", {}) + return ( + {"type": "array", "items": items_schema} + if items_schema + else {"type": "array"} + ) + + scalar_types = [x for x in t if x != "array"] + refined = dict(schema) + refined["type"] = scalar_types[0] if len(scalar_types) == 1 else scalar_types + refined.pop("items", None) + return refined + + +_OVERRIDES: dict[tuple[str, str], dict[str, Any] | callable] = { + ("DatePickerSingle", "date"): _DATE_SCHEMA, + ("DatePickerRange", "start_date"): _DATE_SCHEMA, + ("DatePickerRange", "end_date"): _DATE_SCHEMA, + # Graph — annotation says "object", we add structured properties. + ("Graph", "figure"): { + "type": "object", + "properties": { + "data": {"type": "array", "items": {"type": "object"}}, + "layout": {"type": "object"}, + "frames": {"type": "array", "items": {"type": "object"}}, + }, + }, + ("Dropdown", "value"): _compute_dropdown_value_schema, +} + + +def get_override_schema(param: MCPInput) -> dict[str, Any] | None: + """Return a schema override, or None to fall through to introspection.""" + key = (param.get("component_type"), param["property"]) + override = _OVERRIDES.get(key) + if override is None: + return None + if callable(override): + return override(param) + return dict(override) diff --git a/dash/mcp/primitives/tools/output_schemas/__init__.py b/dash/mcp/primitives/tools/output_schemas/__init__.py index d2d70c3552..41ddfd8d49 100644 --- a/dash/mcp/primitives/tools/output_schemas/__init__.py +++ b/dash/mcp/primitives/tools/output_schemas/__init__.py @@ -1,5 +1,29 @@ -"""Stub — real implementation in a later PR.""" +"""Output schema generation for MCP tool outputSchema fields. +Mirrors ``input_schemas/`` which generates ``inputSchema``. -def get_output_schema(): +Each source shares the same signature: ``() -> dict | None``. +""" + +from __future__ import annotations + +from typing import Any + +from .schema_callback_response import callback_response_schema + +_SOURCES = [ + callback_response_schema, +] + + +def get_output_schema() -> dict[str, Any]: + """Return the JSON Schema for a callback tool's output. + + Tries each source in order, returning the first non-None result. + Falls back to ``{}`` (any type). + """ + for source in _SOURCES: + schema = source() + if schema is not None: + return schema return {} diff --git a/dash/mcp/primitives/tools/output_schemas/schema_callback_response.py b/dash/mcp/primitives/tools/output_schemas/schema_callback_response.py new file mode 100644 index 0000000000..e61a482cba --- /dev/null +++ b/dash/mcp/primitives/tools/output_schemas/schema_callback_response.py @@ -0,0 +1,16 @@ +"""Output schema derived from CallbackDispatchResponse.""" + +from __future__ import annotations + +from typing import Any + +from pydantic import TypeAdapter + +from dash.types import CallbackDispatchResponse + +_schema = TypeAdapter(CallbackDispatchResponse).json_schema() + + +def callback_response_schema() -> dict[str, Any]: + """Return the JSON Schema for a callback dispatch response.""" + return _schema diff --git a/tests/unit/mcp/conftest.py b/tests/unit/mcp/conftest.py index 437a71db5c..97b8d9c137 100644 --- a/tests/unit/mcp/conftest.py +++ b/tests/unit/mcp/conftest.py @@ -4,3 +4,84 @@ if sys.version_info < (3, 10): collect_ignore_glob.append("*") + +"""Shared helpers for MCP unit tests. + +These helpers work directly with Tool objects from CallbackAdapterCollection, +avoiding the MCP server so they can be used before the server is wired up. +""" + +from dash import Dash, Input, Output, html +from dash._get_app import app_context +from dash.mcp.primitives.tools.callback_adapter_collection import ( + CallbackAdapterCollection, +) + +BUILTINS = {"get_dash_component"} + + +def _setup_mcp(app): + """Set up MCP for an app in tests.""" + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + return app + + +def _make_app(**kwargs): + """Create a minimal Dash app with a layout and one callback.""" + app = Dash(__name__, **kwargs) + app.layout = html.Div( + [ + html.Div(id="my-input"), + html.Div(id="my-output"), + ] + ) + + @app.callback(Output("my-output", "children"), Input("my-input", "children")) + def update_output(value): + """Test callback docstring.""" + return f"echo: {value}" + + return _setup_mcp(app) + + +def _tools_list(app): + """Return tools as Tool objects via as_mcp_tools().""" + _setup_mcp(app) + with app.server.test_request_context(): + return app.mcp_callback_map.as_mcp_tools() + + +def _user_tool(tools): + """Return the first tool that isn't a builtin.""" + return next(t for t in tools if t.name not in BUILTINS) + + +def _app_with_callback(component, input_prop="value", output_id="out"): + """Create a Dash app with one callback using ``component`` as Input.""" + app = Dash(__name__) + app.layout = html.Div([component, html.Div(id=output_id)]) + + @app.callback(Output(output_id, "children"), Input(component.id, input_prop)) + def update(val): + return f"got: {val}" + + return _setup_mcp(app) + + +def _schema_for(tool, param_name=None): + """Extract the JSON schema dict for a parameter, without description.""" + props = tool.inputSchema["properties"] + if param_name is None: + param_name = next(iter(props)) + schema = dict(props[param_name]) + schema.pop("description", None) + return schema + + +def _desc_for(tool, param_name=None): + """Extract the description string for a parameter, or ''.""" + props = tool.inputSchema["properties"] + if param_name is None: + param_name = next(iter(props)) + return props[param_name].get("description", "") diff --git a/tests/unit/mcp/tools/input_schemas/__init__.py b/tests/unit/mcp/tools/input_schemas/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/unit/mcp/tools/input_schemas/input_descriptions/__init__.py b/tests/unit/mcp/tools/input_schemas/input_descriptions/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/unit/mcp/tools/input_schemas/input_descriptions/test_descriptions.py b/tests/unit/mcp/tools/input_schemas/input_descriptions/test_descriptions.py new file mode 100644 index 0000000000..bc6758d2d3 --- /dev/null +++ b/tests/unit/mcp/tools/input_schemas/input_descriptions/test_descriptions.py @@ -0,0 +1,424 @@ +"""Description tests — verifies per-property description generation. + +Tests are organized by description source: +- Labels (htmlFor, containment, text extraction) +- Component-specific (date pickers, sliders) +- Options (Dropdown, RadioItems, Checklist) +- Generic props (placeholder, default value, min/max/step) +- Chained callbacks (dynamic prop/options detection) +- Combinations (label + component-specific) +""" + +import pytest + +from dash import Dash, Input, Output, dcc, html + +from tests.unit.mcp.conftest import ( + _app_with_callback, + _desc_for, + _tools_list, + _user_tool, +) + + +def _app_with_layout(layout, *inputs): + app = Dash(__name__) + app.layout = layout + + @app.callback( + Output("out", "children"), + [Input(cid, prop) for cid, prop in inputs], + ) + def update(*args): + return str(args) + + return app + + +def _tool_for(component, input_prop="value"): + app = _app_with_callback(component, input_prop=input_prop) + return _user_tool(_tools_list(app)) + + +# --------------------------------------------------------------------------- +# Labels +# --------------------------------------------------------------------------- + + +class TestLabels: + def test_html_for(self): + app = _app_with_layout( + html.Div( + [ + html.Label("Your Name", htmlFor="inp"), + dcc.Input(id="inp"), + html.Div(id="out"), + ] + ), + ("inp", "value"), + ) + tool = _user_tool(_tools_list(app)) + assert "Your Name" in _desc_for(tool) + + def test_html_for_not_adjacent(self): + app = _app_with_layout( + html.Div( + [ + html.Div(html.Label("Remote Label", htmlFor="inp")), + dcc.Input(id="inp"), + html.Div(id="out"), + ] + ), + ("inp", "value"), + ) + tool = _user_tool(_tools_list(app)) + assert "Remote Label" in _desc_for(tool) + + def test_containment(self): + app = _app_with_layout( + html.Div( + [ + html.Label( + [ + "Pick a city", + dcc.Dropdown(id="city_dd", options=["NYC", "LA"]), + ] + ), + html.Div(id="out"), + ] + ), + ("city_dd", "value"), + ) + tool = _user_tool(_tools_list(app)) + assert "Pick a city" in _desc_for(tool) + + def test_deeply_nested_containment(self): + app = _app_with_layout( + html.Div( + [ + html.Label( + [ + html.Span("Nested Label"), + html.Div(dcc.Input(id="nested_inp")), + ] + ), + html.Div(id="out"), + ] + ), + ("nested_inp", "value"), + ) + tool = _user_tool(_tools_list(app)) + assert "Nested Label" in _desc_for(tool) + + def test_both_htmlfor_and_containment_captured(self): + app = _app_with_layout( + html.Div( + [ + html.Label(["Containment Label", dcc.Input(id="inp")]), + html.Label("HtmlFor Label", htmlFor="inp"), + html.Div(id="out"), + ] + ), + ("inp", "value"), + ) + tool = _user_tool(_tools_list(app)) + desc = _desc_for(tool) + assert "HtmlFor Label" in desc + assert "Containment Label" in desc + + def test_deep_text_extraction(self): + app = _app_with_layout( + html.Div( + [ + html.Label( + html.Div(html.Span(html.B("Deep Text"))), + htmlFor="inp", + ), + dcc.Input(id="inp"), + html.Div(id="out"), + ] + ), + ("inp", "value"), + ) + tool = _user_tool(_tools_list(app)) + assert "Deep Text" in _desc_for(tool) + + def test_multiple_text_nodes(self): + app = _app_with_layout( + html.Div( + [ + html.Label( + [html.B("First"), " ", html.I("Second")], + htmlFor="inp", + ), + dcc.Input(id="inp"), + html.Div(id="out"), + ] + ), + ("inp", "value"), + ) + tool = _user_tool(_tools_list(app)) + desc = _desc_for(tool) + assert "Labeled with: First Second" in desc + + def test_unrelated_label_excluded(self): + app = _app_with_layout( + html.Div( + [ + html.Label("Other Field", htmlFor="other"), + dcc.Input(id="other"), + dcc.Input(id="target"), + html.Div(id="out"), + ] + ), + ("target", "value"), + ) + tool = _user_tool(_tools_list(app)) + desc = _desc_for(tool) + assert "Other Field" not in (desc or "") + + +# --------------------------------------------------------------------------- +# Component-specific: date pickers +# --------------------------------------------------------------------------- + + +class TestDatePickerDescriptions: + def test_single_full_range(self): + dp = dcc.DatePickerSingle( + id="dp", + min_date_allowed="2020-01-01", + max_date_allowed="2025-12-31", + ) + desc = _desc_for(_tool_for(dp, "date"), "val") + assert "2020-01-01" in desc + assert "2025-12-31" in desc + + def test_single_min_only(self): + dp = dcc.DatePickerSingle(id="dp", min_date_allowed="2020-01-01") + desc = _desc_for(_tool_for(dp, "date"), "val") + assert "min_date_allowed: '2020-01-01'" in desc + + def test_single_default_date(self): + dp = dcc.DatePickerSingle(id="dp", date="2024-06-15") + desc = _desc_for(_tool_for(dp, "date"), "val") + assert "date: '2024-06-15'" in desc + + def test_range_with_constraints(self): + dpr = dcc.DatePickerRange( + id="dpr", + min_date_allowed="2020-01-01", + max_date_allowed="2025-12-31", + ) + desc = _desc_for(_tool_for(dpr, "start_date"), "val") + assert "2020-01-01" in desc + + +# --------------------------------------------------------------------------- +# Component-specific: sliders +# --------------------------------------------------------------------------- + + +class TestSliderDescriptions: + def test_min_max(self): + sl = dcc.Slider(id="sl", min=0, max=100) + desc = _desc_for(_tool_for(sl), "val") + assert "min: 0" in desc + assert "max: 100" in desc + + def test_step(self): + sl = dcc.Slider(id="sl", min=0, max=100, step=5) + desc = _desc_for(_tool_for(sl), "val") + assert "step: 5" in desc + + def test_default_value(self): + sl = dcc.Slider(id="sl", min=0, max=100, value=50) + desc = _desc_for(_tool_for(sl), "val") + assert "value: 50" in desc + + def test_marks(self): + sl = dcc.Slider(id="sl", min=0, max=100, marks={0: "Low", 100: "High"}) + desc = _desc_for(_tool_for(sl), "val") + assert "marks: {0: 'Low', 100: 'High'}" in desc + + def test_range_slider_min_max(self): + rs = dcc.RangeSlider(id="rs", min=0, max=100) + desc = _desc_for(_tool_for(rs), "val") + assert "min: 0" in desc + assert "max: 100" in desc + + +# --------------------------------------------------------------------------- +# Options (parametrized across Dropdown, RadioItems, Checklist) +# --------------------------------------------------------------------------- + + +_OPTIONS_COMPONENTS = [ + ("Dropdown", lambda **kw: dcc.Dropdown(id="comp", **kw), "comp"), + ("RadioItems", lambda **kw: dcc.RadioItems(id="comp", **kw), "comp"), + ("Checklist", lambda **kw: dcc.Checklist(id="comp", **kw), "comp"), +] + + +class TestOptionsDescriptions: + @pytest.mark.parametrize( + "name,factory,cid", _OPTIONS_COMPONENTS, ids=[c[0] for c in _OPTIONS_COMPONENTS] + ) + def test_options_shown(self, name, factory, cid): + comp = factory(options=["X", "Y", "Z"]) + desc = _desc_for(_tool_for(comp), "val") + assert "options: ['X', 'Y', 'Z']" in desc + + @pytest.mark.parametrize( + "name,factory,cid", _OPTIONS_COMPONENTS, ids=[c[0] for c in _OPTIONS_COMPONENTS] + ) + def test_default_shown(self, name, factory, cid): + value = ["a"] if name == "Checklist" else "a" + comp = factory(options=["a", "b"], value=value) + desc = _desc_for(_tool_for(comp), "val") + assert f"value: {value!r}" in desc + + def test_dropdown_dict_options(self): + dd = dcc.Dropdown( + id="dd", + options=[ + {"label": "New York", "value": "NYC"}, + ], + ) + assert "NYC" in _desc_for(_tool_for(dd), "val") + + def test_store_storage_type_template(self): + store = dcc.Store(id="store", storage_type="session") + app = _app_with_callback(store, input_prop="data") + tool = _user_tool(_tools_list(app)) + desc = _desc_for(tool, "val") + assert ( + "storage_type: 'session'. Describes how to store the value client-side" + in desc + ) + + def test_many_options_truncated(self): + dd = dcc.Dropdown(id="big", options=[str(i) for i in range(50)], value="0") + app = _app_with_callback(dd) + tool = _user_tool(_tools_list(app)) + desc = _desc_for(tool, "val") + assert "options:" in desc + assert "Use get_dash_component('big', 'options') for the full value" in desc + + +# --------------------------------------------------------------------------- +# Generic props +# --------------------------------------------------------------------------- + + +class TestGenericDescriptions: + def test_placeholder(self): + inp = dcc.Input(id="inp", placeholder="Enter your name") + assert "placeholder: 'Enter your name'" in _desc_for(_tool_for(inp), "val") + + def test_numeric_min_max(self): + inp = dcc.Input(id="inp", type="number", min=0, max=999) + desc = _desc_for(_tool_for(inp), "val") + assert "min: 0" in desc + assert "max: 999" in desc + + def test_step(self): + inp = dcc.Input(id="inp", type="number", min=0, max=100, step=0.1) + assert "step: 0.1" in _desc_for(_tool_for(inp), "val") + + def test_default_value(self): + inp = dcc.Input(id="inp", value="hello") + desc = _desc_for(_tool_for(inp), "val") + assert "value: 'hello'" in desc + + def test_non_text_type(self): + inp = dcc.Input(id="inp", type="email") + assert "type: 'email'" in _desc_for(_tool_for(inp), "val") + + def test_store_default(self): + store = dcc.Store(id="store", data={"key": "value"}) + app = _app_with_callback(store, input_prop="data") + tool = _user_tool(_tools_list(app)) + assert "data: {'key': 'value'}" in _desc_for(tool, "val") + + +# --------------------------------------------------------------------------- +# Chained callbacks +# --------------------------------------------------------------------------- + + +class TestChainedCallbacks: + def test_options_set_by_upstream(self): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="country", options=["US", "CA"], value="US"), + dcc.Dropdown(id="city", options=[], value=None), + html.Div(id="result"), + ] + ) + + @app.callback(Output("city", "options"), Input("country", "value")) + def update_cities(country): + return ["NYC", "LA"] if country == "US" else ["Toronto"] + + @app.callback(Output("result", "children"), Input("city", "value")) + def show_city(city): + return city + + tools = _tools_list(app) + tool = next(t for t in tools if "show_city" in t.name) + desc = _desc_for(tool, "city") + assert "can be updated by tool: `update_cities`" in desc + assert "options:" in desc + + def test_value_set_by_upstream(self): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="source", value=""), + html.Div(id="derived", children=""), + html.Div(id="result"), + ] + ) + + @app.callback(Output("derived", "children"), Input("source", "value")) + def compute_derived(val): + return f"derived: {val}" + + @app.callback(Output("result", "children"), Input("derived", "children")) + def use_derived(val): + return val + + tools = _tools_list(app) + tool = next(t for t in tools if "use_derived" in t.name) + desc = _desc_for(tool, "val") + assert "can be updated by tool: `compute_derived`" in desc + + +# --------------------------------------------------------------------------- +# Combinations +# --------------------------------------------------------------------------- + + +class TestCombinations: + def test_label_with_date_picker(self): + dp = dcc.DatePickerSingle( + id="dp", + min_date_allowed="2020-01-01", + max_date_allowed="2025-12-31", + ) + app = _app_with_layout( + html.Div( + [ + html.Label("Departure Date", htmlFor="dp"), + dp, + html.Div(id="out"), + ] + ), + ("dp", "date"), + ) + tool = _user_tool(_tools_list(app)) + desc = _desc_for(tool) + assert "Departure Date" in desc + assert "2020-01-01" in desc diff --git a/tests/unit/mcp/tools/input_schemas/test_input_schemas.py b/tests/unit/mcp/tools/input_schemas/test_input_schemas.py new file mode 100644 index 0000000000..5350bd955e --- /dev/null +++ b/tests/unit/mcp/tools/input_schemas/test_input_schemas.py @@ -0,0 +1,331 @@ +"""Input schema tests — verifies JSON Schema generation for component properties. + +Tests are organized by concern: +- Static overrides (date pickers, graph, interval, sliders) +- Component introspection (representative samples — full type coverage in test_json_prop_typing) +- Callback annotation overrides (highest priority) +- Required/nullable behavior +""" + +import pytest +from typing import Optional + +from dash import Dash, Input, Output, State, dcc, html + +from tests.unit.mcp.conftest import ( + _app_with_callback, + _schema_for, + _tools_list, + _user_tool, +) + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def _get_schema(component_type, prop): + _factories = { + "DatePickerSingle": lambda: dcc.DatePickerSingle(id="dp"), + "DatePickerRange": lambda: dcc.DatePickerRange(id="dpr"), + "Graph": lambda: dcc.Graph(id="graph"), + "Interval": lambda: dcc.Interval(id="intv"), + "Input": lambda: dcc.Input(id="inp"), + "Textarea": lambda: dcc.Textarea(id="ta"), + "Tabs": lambda: dcc.Tabs(id="tabs"), + "Dropdown": lambda: dcc.Dropdown(id="dd"), + "RadioItems": lambda: dcc.RadioItems(id="ri"), + "Checklist": lambda: dcc.Checklist(id="cl"), + "Store": lambda: dcc.Store(id="store"), + "Upload": lambda: dcc.Upload(id="upload"), + "Slider": lambda: dcc.Slider(id="sl"), + "RangeSlider": lambda: dcc.RangeSlider(id="rs"), + } + app = _app_with_callback(_factories[component_type](), input_prop=prop) + tool = _user_tool(_tools_list(app)) + return _schema_for(tool) + + +# --------------------------------------------------------------------------- +# Static overrides take priority over introspection +# --------------------------------------------------------------------------- + + +class TestStaticOverrides: + """Verify that overrides win over component introspection.""" + + def test_override_beats_introspection(self): + schema = _get_schema("DatePickerSingle", "date") + # Introspection would return None for this prop; + # override provides a date format with pattern + assert schema["type"] == "string" + assert schema["format"] == "date" + assert "pattern" in schema + + +# --------------------------------------------------------------------------- +# Introspection — representative samples (not exhaustive per-component) +# --------------------------------------------------------------------------- + +INTROSPECTION_CASES = [ + # (component_type, prop, expected_schema) — one per distinct type shape + ( + "Input", + "value", + {"anyOf": [{"type": "string"}, {"type": "number"}, {"type": "null"}]}, + ), + ( + "Input", + "disabled", + { + "anyOf": [ + {"type": "boolean"}, + {"const": "disabled", "type": "string"}, + {"const": "DISABLED", "type": "string"}, + {"type": "null"}, + ] + }, + ), + ("Input", "n_submit", {"anyOf": [{"type": "number"}, {"type": "null"}]}), + ( + "Dropdown", + "value", + { + "anyOf": [ + {"type": "string"}, + {"type": "number"}, + {"type": "boolean"}, + { + "items": { + "anyOf": [ + {"type": "string"}, + {"type": "number"}, + {"type": "boolean"}, + ] + }, + "type": "array", + }, + {"type": "null"}, + ] + }, + ), + ("Dropdown", "options", {"anyOf": [{}, {"type": "null"}]}), + ( + "Checklist", + "value", + { + "anyOf": [ + { + "items": { + "anyOf": [ + {"type": "string"}, + {"type": "number"}, + {"type": "boolean"}, + ] + }, + "type": "array", + }, + {"type": "null"}, + ] + }, + ), + ( + "Store", + "data", + { + "anyOf": [ + {"additionalProperties": True, "type": "object"}, + {"items": {}, "type": "array"}, + {"type": "number"}, + {"type": "string"}, + {"type": "boolean"}, + {"type": "null"}, + ] + }, + ), + ( + "Upload", + "contents", + { + "anyOf": [ + {"type": "string"}, + {"items": {"type": "string"}, "type": "array"}, + {"type": "null"}, + ] + }, + ), + ( + "RangeSlider", + "value", + {"anyOf": [{"items": {"type": "number"}, "type": "array"}, {"type": "null"}]}, + ), + ("Tabs", "value", {"anyOf": [{"type": "string"}, {"type": "null"}]}), +] + + +class TestIntrospection: + """Representative introspection tests — full type coverage in test_json_prop_typing.""" + + @pytest.mark.parametrize( + "component_type,prop,expected", + INTROSPECTION_CASES, + ids=[f"{c}.{p}" for c, p, _ in INTROSPECTION_CASES], + ) + def test_introspected_schema(self, component_type, prop, expected): + assert _get_schema(component_type, prop) == expected + + +# --------------------------------------------------------------------------- +# Callback annotation overrides +# --------------------------------------------------------------------------- + + +def _app_with_annotated_callback(annotation_type, input_prop="disabled"): + app = Dash(__name__) + app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) + + if annotation_type is None: + + @app.callback(Output("out", "children"), Input("inp", input_prop)) + def update(val): + return str(val) + + else: + + @app.callback(Output("out", "children"), Input("inp", input_prop)) + def update(val: annotation_type): + return str(val) + + return app + + +ANNOTATION_CASES = [ + (str, "disabled", {"type": "string"}), + (int, "value", {"type": "integer"}), + (float, "value", {"type": "number"}), + (bool, "value", {"type": "boolean"}), + (list, "value", {"items": {}, "type": "array"}), + (dict, "value", {"additionalProperties": True, "type": "object"}), + (Optional[int], "value", {"anyOf": [{"type": "integer"}, {"type": "null"}]}), + (Optional[str], "value", {"anyOf": [{"type": "string"}, {"type": "null"}]}), +] + + +class TestAnnotationOverrides: + """Callback type annotations override component schemas.""" + + @pytest.mark.parametrize( + "ann,prop,expected", + ANNOTATION_CASES, + ids=[ + f"{a.__name__ if hasattr(a, '__name__') else a}-{p}" + for a, p, _ in ANNOTATION_CASES + ], + ) + def test_annotation(self, ann, prop, expected): + app = _app_with_annotated_callback(ann, input_prop=prop) + tool = _user_tool(_tools_list(app)) + assert _schema_for(tool, "val") == expected + + def test_no_annotation_uses_introspection(self): + app = _app_with_annotated_callback(None) + tool = _user_tool(_tools_list(app)) + assert _schema_for(tool, "val") == { + "anyOf": [ + {"type": "boolean"}, + {"const": "disabled", "type": "string"}, + {"const": "DISABLED", "type": "string"}, + {"type": "null"}, + ] + } + + +class TestAnnotationNullability: + """Annotations control nullable vs non-nullable schemas.""" + + def test_str_removes_null(self): + app = Dash(__name__) + app.layout = html.Div([dcc.Dropdown(id="dd"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("dd", "value")) + def update(val: str): + return val + + tool = _user_tool(_tools_list(app)) + assert _schema_for(tool, "val") == {"type": "string"} + + def test_optional_preserves_null(self): + app = Dash(__name__) + app.layout = html.Div([dcc.Dropdown(id="dd"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("dd", "value")) + def update(val: Optional[str]): + return val or "" + + tool = _user_tool(_tools_list(app)) + assert _schema_for(tool, "val") == { + "anyOf": [{"type": "string"}, {"type": "null"}] + } + + def test_optional_param_not_required(self): + app = Dash(__name__) + app.layout = html.Div([dcc.Dropdown(id="dd"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("dd", "value")) + def update(val: Optional[str]): + return val or "" + + tool = _user_tool(_tools_list(app)) + assert "val" not in tool.inputSchema.get("required", []) + + +class TestAnnotationWithState: + """Annotations work for State parameters too.""" + + def test_state_annotation_overrides(self): + app = Dash(__name__) + app.layout = html.Div( + [dcc.Input(id="inp"), dcc.Store(id="store"), html.Div(id="out")] + ) + + @app.callback( + Output("out", "children"), + Input("inp", "value"), + State("store", "data"), + ) + def update(val: str, data: dict): + return str(val) + + tool = _user_tool(_tools_list(app)) + assert _schema_for(tool, "val") == {"type": "string"} + assert _schema_for(tool, "data") == { + "additionalProperties": True, + "type": "object", + } + + def test_partial_annotations(self): + app = Dash(__name__) + app.layout = html.Div( + [dcc.Input(id="inp"), dcc.Store(id="store"), html.Div(id="out")] + ) + + @app.callback( + Output("out", "children"), + Input("inp", "value"), + State("store", "data"), + ) + def update(val: int, data): + return str(val) + + tool = _user_tool(_tools_list(app)) + assert _schema_for(tool, "val") == {"type": "integer"} + assert _schema_for(tool, "data") == { + "anyOf": [ + {"additionalProperties": True, "type": "object"}, + {"items": {}, "type": "array"}, + {"type": "number"}, + {"type": "string"}, + {"type": "boolean"}, + {"type": "null"}, + ] + } diff --git a/tests/unit/mcp/tools/input_schemas/test_schema_component_proptypes.py b/tests/unit/mcp/tools/input_schemas/test_schema_component_proptypes.py new file mode 100644 index 0000000000..10b6ae5543 --- /dev/null +++ b/tests/unit/mcp/tools/input_schemas/test_schema_component_proptypes.py @@ -0,0 +1,15 @@ +"""Tests for schema_component_proptypes. + +Only tests our custom logic — pydantic's type-to-schema conversion +is tested by pydantic itself. +""" + +from dash.development.base_component import Component +from dash.mcp.primitives.tools.input_schemas.schema_callback_type_annotations import ( + annotation_to_json_schema, +) + + +class TestComponentTypes: + def test_component_type_maps_to_string(self): + assert annotation_to_json_schema(Component) == {"type": "string"} diff --git a/tests/unit/mcp/tools/test_callback_adapter.py b/tests/unit/mcp/tools/test_callback_adapter.py index 91808d304e..dc3fc041fc 100644 --- a/tests/unit/mcp/tools/test_callback_adapter.py +++ b/tests/unit/mcp/tools/test_callback_adapter.py @@ -1,8 +1,9 @@ """Tests for CallbackAdapter.""" import pytest -from dash import Dash, Input, Output, dcc, html +from dash import Dash, Input, Output, State, dcc, html from dash._get_app import app_context +from mcp.types import Tool from dash.mcp.primitives.tools.callback_adapter_collection import ( CallbackAdapterCollection, @@ -35,6 +36,68 @@ def update(val): return app +@pytest.fixture +def multi_output_app(): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="dd", options=["a", "b"], value="a"), + dcc.Dropdown(id="dd2"), + html.Div(id="out"), + ] + ) + + @app.callback( + Output("dd2", "options"), + Output("out", "children"), + Input("dd", "value"), + ) + def update(val): + return [], val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + return app + + +@pytest.fixture +def state_app(): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Button(id="btn"), + dcc.Input(id="inp"), + html.Div(id="out"), + ] + ) + + @app.callback( + Output("out", "children"), + Input("btn", "n_clicks"), + State("inp", "value"), + ) + def update(clicks, val): + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + return app + + +@pytest.fixture +def typed_app(): + app = Dash(__name__) + app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("inp", "value")) + def update(val: str): + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + return app + + @pytest.fixture def duplicate_names_app(): app = Dash(__name__) @@ -131,6 +194,52 @@ def test_duplicates_get_unique_names(self, duplicate_names_app): assert names[0] != names[1] +class TestTool: + def test_returns_tool_instance(self, simple_app): + with simple_app.server.test_request_context(): + tool = app_context.get().mcp_callback_map[0].as_mcp_tool + assert isinstance(tool, Tool) + assert tool.name == "update" + + def test_description_includes_docstring(self, simple_app): + with simple_app.server.test_request_context(): + tool = app_context.get().mcp_callback_map[0].as_mcp_tool + assert "Update output." in tool.description + + def test_description_includes_output_target(self, simple_app): + with simple_app.server.test_request_context(): + tool = app_context.get().mcp_callback_map[0].as_mcp_tool + assert "out.children" in tool.description + + def test_param_name_from_function_signature(self, simple_app): + with simple_app.server.test_request_context(): + tool = app_context.get().mcp_callback_map[0].as_mcp_tool + assert "val" in tool.inputSchema["properties"] + + def test_param_has_label_description(self, simple_app): + with simple_app.server.test_request_context(): + tool = app_context.get().mcp_callback_map[0].as_mcp_tool + desc = tool.inputSchema["properties"]["val"].get("description", "") + assert "Your Name" in desc + + def test_state_params_included(self, state_app): + with state_app.server.test_request_context(): + tool = app_context.get().mcp_callback_map[0].as_mcp_tool + props = tool.inputSchema["properties"] + assert set(props.keys()) == {"clicks", "val"} + + def test_multi_output_description(self, multi_output_app): + with multi_output_app.server.test_request_context(): + tool = app_context.get().mcp_callback_map[0].as_mcp_tool + assert "dd2.options" in tool.description + assert "out.children" in tool.description + + def test_typed_annotation_narrows_schema(self, typed_app): + with typed_app.server.test_request_context(): + tool = app_context.get().mcp_callback_map[0].as_mcp_tool + assert tool.inputSchema["properties"]["val"]["type"] == "string" + + class TestGetInitialValue: def test_returns_layout_value(self, simple_app): callback_map = app_context.get().mcp_callback_map @@ -225,3 +334,59 @@ def update(val): app_context.set(app) app.mcp_callback_map = CallbackAdapterCollection(app) assert app.mcp_callback_map[0].is_valid + + +class TestNoInfiniteLoop: + @pytest.mark.timeout(5) + def test_initial_output_does_not_loop(self): + """Building a tool must not trigger infinite re-entry in _initial_output.""" + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Slider(id="sl", min=0, max=10, value=5), + html.Div(id="out"), + ] + ) + + @app.callback(Output("out", "children"), Input("sl", "value")) + def show(value): + return f"Value: {value}" + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + + with app.server.test_request_context(): + tool = app.mcp_callback_map[0].as_mcp_tool + assert tool.name == "show" + + @pytest.mark.timeout(5) + def test_chained_callbacks_do_not_loop(self): + """Chained callbacks with initial value resolution must not loop.""" + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Slider(id="sl", min=0, max=10, value=5), + dcc.Slider(id="sl2", min=0, max=10), + html.Div(id="out"), + ] + ) + + @app.callback(Output("sl2", "value"), Input("sl", "value")) + def sync(v): + return v + + @app.callback( + Output("out", "children"), + Input("sl", "value"), + Input("sl2", "value"), + ) + def show(v1, v2): + return f"{v1} + {v2}" + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + + with app.server.test_request_context(): + for cb in app.mcp_callback_map: + tool = cb.as_mcp_tool + assert tool.name is not None diff --git a/tests/unit/mcp/tools/test_tool_schema.py b/tests/unit/mcp/tools/test_tool_schema.py new file mode 100644 index 0000000000..49b639834c --- /dev/null +++ b/tests/unit/mcp/tools/test_tool_schema.py @@ -0,0 +1,64 @@ +"""Tool schema tests — what a Dash MCP tool looks like. + +The EXPECTED_TOOL dict below is the canonical reference for the shape of +a callback-generated MCP tool. It doubles as human-readable documentation +and as a test fixture. + +Reference: https://modelcontextprotocol.io/specification/2025-11-25/server/tools +""" + +from tests.unit.mcp.conftest import ( + _make_app, + _tools_list, + _user_tool, +) + +from pydantic import TypeAdapter +from dash.development.base_component import Component +from dash.types import CallbackDispatchResponse + +_DASH_COMPONENT_SCHEMA = TypeAdapter(Component).json_schema() + +EXPECTED_TOOL = { + "name": "update_output", + "description": ( + "my-output.children: Returns content\n" "\n" "Test callback docstring." + ), + "inputSchema": { + "type": "object", + "properties": { + "value": { + "anyOf": [ + {"type": "string"}, + {"type": "integer"}, + {"type": "number"}, + _DASH_COMPONENT_SCHEMA, + { + "items": { + "anyOf": [ + {"type": "string"}, + {"type": "integer"}, + {"type": "number"}, + _DASH_COMPONENT_SCHEMA, + {"type": "null"}, + ] + }, + "type": "array", + }, + {"type": "null"}, + ], + "description": "Input is optional.\nThe children of this component.", + }, + }, + }, + "outputSchema": TypeAdapter(CallbackDispatchResponse).json_schema(), +} + + +class TestToolSchema: + """Verify that the generated tool matches EXPECTED_TOOL exactly.""" + + def test_full_tool(self): + """The entire tool dict matches the expected shape.""" + tool = _user_tool(_tools_list(_make_app())) + assert tool.model_dump(exclude_none=True) == EXPECTED_TOOL From 9060647c0a565597ff7e6cb637ff14cd1133140c Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 8 Apr 2026 10:51:47 -0600 Subject: [PATCH 025/103] Refactor description sources to accept CallbackAdapter instances --- dash/mcp/primitives/tools/callback_adapter.py | 2 +- .../primitives/tools/descriptions/__init__.py | 16 +++++++++------- .../tools/descriptions/description_docstring.py | 11 ++++++----- .../tools/descriptions/description_outputs.py | 11 ++++++----- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/dash/mcp/primitives/tools/callback_adapter.py b/dash/mcp/primitives/tools/callback_adapter.py index c7044de3f4..d142223700 100644 --- a/dash/mcp/primitives/tools/callback_adapter.py +++ b/dash/mcp/primitives/tools/callback_adapter.py @@ -150,7 +150,7 @@ def prevents_initial_call(self) -> bool: @cached_property def _description(self) -> str: - return build_tool_description(self.outputs, self._docstring) + return build_tool_description(self) @cached_property def _input_schema(self) -> dict[str, Any]: diff --git a/dash/mcp/primitives/tools/descriptions/__init__.py b/dash/mcp/primitives/tools/descriptions/__init__.py index d464677251..29cc2840d0 100644 --- a/dash/mcp/primitives/tools/descriptions/__init__.py +++ b/dash/mcp/primitives/tools/descriptions/__init__.py @@ -1,7 +1,7 @@ """Tool-level description generation for MCP tools. Each source shares the same signature: -``(outputs, docstring) -> list[str]`` +``(adapter: CallbackAdapter) -> list[str]`` This is distinct from per-parameter descriptions (in ``input_schemas/input_descriptions/``) which populate @@ -10,23 +10,25 @@ from __future__ import annotations -from typing import Any +from __future__ import annotations + +from typing import TYPE_CHECKING from .description_docstring import callback_docstring from .description_outputs import output_summary +if TYPE_CHECKING: + from dash.mcp.primitives.tools.callback_adapter import CallbackAdapter + _SOURCES = [ output_summary, callback_docstring, ] -def build_tool_description( - outputs: list[dict[str, Any]], - docstring: str | None = None, -) -> str: +def build_tool_description(adapter: CallbackAdapter) -> str: """Build a human-readable description for an MCP tool.""" lines: list[str] = [] for source in _SOURCES: - lines.extend(source(outputs, docstring)) + lines.extend(source(adapter)) return "\n".join(lines) if lines else "Dash callback" diff --git a/dash/mcp/primitives/tools/descriptions/description_docstring.py b/dash/mcp/primitives/tools/descriptions/description_docstring.py index 71cf4d3d5a..21dbeed804 100644 --- a/dash/mcp/primitives/tools/descriptions/description_docstring.py +++ b/dash/mcp/primitives/tools/descriptions/description_docstring.py @@ -2,14 +2,15 @@ from __future__ import annotations -from typing import Any +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from dash.mcp.primitives.tools.callback_adapter import CallbackAdapter -def callback_docstring( - outputs: list[dict[str, Any]], - docstring: str | None = None, -) -> list[str]: + +def callback_docstring(adapter: CallbackAdapter) -> list[str]: """Return the callback's docstring as description lines.""" + docstring = adapter._docstring if docstring: return ["", docstring.strip()] return [] diff --git a/dash/mcp/primitives/tools/descriptions/description_outputs.py b/dash/mcp/primitives/tools/descriptions/description_outputs.py index c174c177f4..986344c75c 100644 --- a/dash/mcp/primitives/tools/descriptions/description_outputs.py +++ b/dash/mcp/primitives/tools/descriptions/description_outputs.py @@ -2,7 +2,10 @@ from __future__ import annotations -from typing import Any +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from dash.mcp.primitives.tools.callback_adapter import CallbackAdapter _OUTPUT_SEMANTICS: dict[tuple[str | None, str], str] = { ("Graph", "figure"): "Returns chart/visualization data", @@ -26,11 +29,9 @@ } -def output_summary( - outputs: list[dict[str, Any]], - docstring: str | None = None, -) -> list[str]: +def output_summary(adapter: CallbackAdapter) -> list[str]: """Produce a short summary of what the callback outputs represent.""" + outputs = adapter.outputs if not outputs: return ["Dash callback"] From 554ddc0bc00b21ca24147344891c11212011e227 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 8 Apr 2026 12:12:17 -0600 Subject: [PATCH 026/103] Fix pylint error --- tests/unit/mcp/conftest.py | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/tests/unit/mcp/conftest.py b/tests/unit/mcp/conftest.py index 97b8d9c137..83f6e5378c 100644 --- a/tests/unit/mcp/conftest.py +++ b/tests/unit/mcp/conftest.py @@ -1,21 +1,17 @@ +"""Shared helpers for MCP unit tests.""" + import sys -collect_ignore_glob = [] +from dash import Dash, Input, Output, html +from dash._get_app import app_context +collect_ignore_glob = [] if sys.version_info < (3, 10): collect_ignore_glob.append("*") - -"""Shared helpers for MCP unit tests. - -These helpers work directly with Tool objects from CallbackAdapterCollection, -avoiding the MCP server so they can be used before the server is wired up. -""" - -from dash import Dash, Input, Output, html -from dash._get_app import app_context -from dash.mcp.primitives.tools.callback_adapter_collection import ( - CallbackAdapterCollection, -) +else: + from dash.mcp.primitives.tools.callback_adapter_collection import ( # pylint: disable=wrong-import-position + CallbackAdapterCollection, + ) BUILTINS = {"get_dash_component"} From 2cfa19328a2cfaeef0a23c71cd6e764d3af82852 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 16 Apr 2026 12:55:37 -0600 Subject: [PATCH 027/103] Fix regression in CallbackAdapter --- dash/mcp/primitives/tools/callback_adapter.py | 7 ++++++- .../tools/output_schemas/schema_callback_response.py | 6 +++--- tests/unit/mcp/tools/test_tool_schema.py | 4 ++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/dash/mcp/primitives/tools/callback_adapter.py b/dash/mcp/primitives/tools/callback_adapter.py index d142223700..c97c7721ce 100644 --- a/dash/mcp/primitives/tools/callback_adapter.py +++ b/dash/mcp/primitives/tools/callback_adapter.py @@ -385,7 +385,7 @@ def _expand_output_spec( output_id: str, cb_info: dict, resolved_inputs: list[CallbackInput], -) -> list[CallbackOutputTarget]: +) -> CallbackOutputTarget | list[CallbackOutputTarget]: """Build the outputs spec, expanding wildcards to concrete IDs. For wildcard outputs, derives concrete IDs from the resolved inputs. @@ -417,6 +417,11 @@ def _expand_output_spec( else: results.append({"id": pid, "property": prop}) + # Mirror the Dash renderer: single-output callbacks send a bare dict, + # multi-output callbacks send a list. The framework's output value + # matching depends on this shape. + if len(results) == 1: + return results[0] return results diff --git a/dash/mcp/primitives/tools/output_schemas/schema_callback_response.py b/dash/mcp/primitives/tools/output_schemas/schema_callback_response.py index e61a482cba..6962fb4a4f 100644 --- a/dash/mcp/primitives/tools/output_schemas/schema_callback_response.py +++ b/dash/mcp/primitives/tools/output_schemas/schema_callback_response.py @@ -1,4 +1,4 @@ -"""Output schema derived from CallbackDispatchResponse.""" +"""Output schema derived from CallbackExecutionResponse.""" from __future__ import annotations @@ -6,9 +6,9 @@ from pydantic import TypeAdapter -from dash.types import CallbackDispatchResponse +from dash.types import CallbackExecutionResponse -_schema = TypeAdapter(CallbackDispatchResponse).json_schema() +_schema = TypeAdapter(CallbackExecutionResponse).json_schema() def callback_response_schema() -> dict[str, Any]: diff --git a/tests/unit/mcp/tools/test_tool_schema.py b/tests/unit/mcp/tools/test_tool_schema.py index 49b639834c..b39dfe08c9 100644 --- a/tests/unit/mcp/tools/test_tool_schema.py +++ b/tests/unit/mcp/tools/test_tool_schema.py @@ -15,7 +15,7 @@ from pydantic import TypeAdapter from dash.development.base_component import Component -from dash.types import CallbackDispatchResponse +from dash.types import CallbackExecutionResponse _DASH_COMPONENT_SCHEMA = TypeAdapter(Component).json_schema() @@ -51,7 +51,7 @@ }, }, }, - "outputSchema": TypeAdapter(CallbackDispatchResponse).json_schema(), + "outputSchema": TypeAdapter(CallbackExecutionResponse).json_schema(), } From dce8e9aa2bd6b1a5767a0fd83394ae38a1fba2b9 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 16 Apr 2026 13:09:05 -0600 Subject: [PATCH 028/103] Refactor tool descriptions/schemas to use a base class (just as resources do) --- .../primitives/tools/descriptions/__init__.py | 21 ++-- .../mcp/primitives/tools/descriptions/base.py | 21 ++++ .../descriptions/description_docstring.py | 15 ++- .../tools/descriptions/description_outputs.py | 67 +++++++------ .../tools/input_schemas/__init__.py | 25 ++--- .../primitives/tools/input_schemas/base.py | 20 ++++ .../input_descriptions/__init__.py | 25 +++-- .../input_schemas/input_descriptions/base.py | 18 ++++ .../description_component_props.py | 98 ++++++++++--------- .../description_docstrings.py | 18 ++-- .../description_html_labels.py | 21 ++-- .../schema_callback_type_annotations.py | 40 ++++---- .../schema_component_proptypes.py | 33 ++++--- .../schema_component_proptypes_overrides.py | 26 ++--- 14 files changed, 267 insertions(+), 181 deletions(-) create mode 100644 dash/mcp/primitives/tools/descriptions/base.py create mode 100644 dash/mcp/primitives/tools/input_schemas/base.py create mode 100644 dash/mcp/primitives/tools/input_schemas/input_descriptions/base.py diff --git a/dash/mcp/primitives/tools/descriptions/__init__.py b/dash/mcp/primitives/tools/descriptions/__init__.py index 29cc2840d0..b32238992c 100644 --- a/dash/mcp/primitives/tools/descriptions/__init__.py +++ b/dash/mcp/primitives/tools/descriptions/__init__.py @@ -1,7 +1,7 @@ """Tool-level description generation for MCP tools. -Each source shares the same signature: -``(adapter: CallbackAdapter) -> list[str]`` +Each source is a ``ToolDescriptionSource`` subclass that can add text +to the tool's description. All sources are accumulated. This is distinct from per-parameter descriptions (in ``input_schemas/input_descriptions/``) which populate @@ -10,25 +10,24 @@ from __future__ import annotations -from __future__ import annotations - from typing import TYPE_CHECKING -from .description_docstring import callback_docstring -from .description_outputs import output_summary +from .base import ToolDescriptionSource +from .description_docstring import DocstringDescription +from .description_outputs import OutputSummaryDescription if TYPE_CHECKING: from dash.mcp.primitives.tools.callback_adapter import CallbackAdapter -_SOURCES = [ - output_summary, - callback_docstring, +_SOURCES: list[type[ToolDescriptionSource]] = [ + OutputSummaryDescription, + DocstringDescription, ] -def build_tool_description(adapter: CallbackAdapter) -> str: +def build_tool_description(callback: CallbackAdapter) -> str: """Build a human-readable description for an MCP tool.""" lines: list[str] = [] for source in _SOURCES: - lines.extend(source(adapter)) + lines.extend(source.describe(callback)) return "\n".join(lines) if lines else "Dash callback" diff --git a/dash/mcp/primitives/tools/descriptions/base.py b/dash/mcp/primitives/tools/descriptions/base.py new file mode 100644 index 0000000000..c069f67918 --- /dev/null +++ b/dash/mcp/primitives/tools/descriptions/base.py @@ -0,0 +1,21 @@ +"""Base class for tool-level description sources.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from dash.mcp.primitives.tools.callback_adapter import CallbackAdapter + + +class ToolDescriptionSource: + """A source of text that can describe an MCP tool. + + Subclasses implement ``describe`` to return strings that will be + joined into the tool's ``description`` field. All sources are + accumulated — every source can add text to the overall description. + """ + + @classmethod + def describe(cls, callback: CallbackAdapter) -> list[str]: + raise NotImplementedError diff --git a/dash/mcp/primitives/tools/descriptions/description_docstring.py b/dash/mcp/primitives/tools/descriptions/description_docstring.py index 21dbeed804..9bcc697248 100644 --- a/dash/mcp/primitives/tools/descriptions/description_docstring.py +++ b/dash/mcp/primitives/tools/descriptions/description_docstring.py @@ -4,13 +4,18 @@ from typing import TYPE_CHECKING +from .base import ToolDescriptionSource + if TYPE_CHECKING: from dash.mcp.primitives.tools.callback_adapter import CallbackAdapter -def callback_docstring(adapter: CallbackAdapter) -> list[str]: +class DocstringDescription(ToolDescriptionSource): """Return the callback's docstring as description lines.""" - docstring = adapter._docstring - if docstring: - return ["", docstring.strip()] - return [] + + @classmethod + def describe(cls, callback: CallbackAdapter) -> list[str]: + docstring = callback._docstring + if docstring: + return ["", docstring.strip()] + return [] diff --git a/dash/mcp/primitives/tools/descriptions/description_outputs.py b/dash/mcp/primitives/tools/descriptions/description_outputs.py index 986344c75c..06371d7717 100644 --- a/dash/mcp/primitives/tools/descriptions/description_outputs.py +++ b/dash/mcp/primitives/tools/descriptions/description_outputs.py @@ -4,54 +4,53 @@ from typing import TYPE_CHECKING +from .base import ToolDescriptionSource + if TYPE_CHECKING: from dash.mcp.primitives.tools.callback_adapter import CallbackAdapter _OUTPUT_SEMANTICS: dict[tuple[str | None, str], str] = { - ("Graph", "figure"): "Returns chart/visualization data", ("DataTable", "data"): "Returns tabular data", ("DataTable", "columns"): "Returns table column definitions", - ("Dropdown", "options"): "Returns selection options", - ("Dropdown", "value"): "Updates a selection value", - ("RadioItems", "options"): "Returns selection options", - ("Checklist", "options"): "Returns selection options", - ("Store", "data"): "Returns stored data", + ("Store", "data"): "Returns data to be remembered client-side", ("Download", "data"): "Returns downloadable content", ("Markdown", "children"): "Returns formatted text", (None, "figure"): "Returns chart/visualization data", - (None, "data"): "Returns data", - (None, "options"): "Returns selection options", + (None, "options"): "Returns available options", (None, "columns"): "Returns column definitions", (None, "children"): "Returns content", - (None, "value"): "Returns a value", + (None, "value"): "Returns the current value", (None, "style"): "Updates styling", (None, "disabled"): "Updates enabled/disabled state", } -def output_summary(adapter: CallbackAdapter) -> list[str]: +class OutputSummaryDescription(ToolDescriptionSource): """Produce a short summary of what the callback outputs represent.""" - outputs = adapter.outputs - if not outputs: - return ["Dash callback"] - - lines: list[str] = [] - for out in outputs: - comp_id = out["component_id"] - prop = out["property"] - comp_type = out.get("component_type") - - semantic = _OUTPUT_SEMANTICS.get((comp_type, prop)) - if semantic is None: - semantic = _OUTPUT_SEMANTICS.get((None, prop)) - - if semantic is not None: - lines.append(f"- {comp_id}.{prop}: {semantic}") - else: - lines.append(f"- {comp_id}.{prop}") - - n = len(outputs) - if n == 1: - return [lines[0].lstrip("- ")] - header = f"Returns {n} output{'s' if n > 1 else ''}:" - return [header] + lines + + @classmethod + def describe(cls, callback: CallbackAdapter) -> list[str]: + outputs = callback.outputs + if not outputs: + return ["Dash callback"] + + lines: list[str] = [] + for out in outputs: + comp_id = out["component_id"] + prop = out["property"] + comp_type = out.get("component_type") + + semantic = _OUTPUT_SEMANTICS.get((comp_type, prop)) + if semantic is None: + semantic = _OUTPUT_SEMANTICS.get((None, prop)) + + if semantic is not None: + lines.append(f"- {comp_id}.{prop}: {semantic}") + else: + lines.append(f"- {comp_id}.{prop}") + + n = len(outputs) + if n == 1: + return [lines[0].lstrip("- ")] + header = f"Returns {n} output{'s' if n > 1 else ''}:" + return [header] + lines diff --git a/dash/mcp/primitives/tools/input_schemas/__init__.py b/dash/mcp/primitives/tools/input_schemas/__init__.py index 2c1646f56a..9fa82eda55 100644 --- a/dash/mcp/primitives/tools/input_schemas/__init__.py +++ b/dash/mcp/primitives/tools/input_schemas/__init__.py @@ -1,9 +1,8 @@ """Input schema generation for MCP tool inputSchema fields. -Mirrors ``output_schemas/`` which generates ``outputSchema``. - -Each source is tried in priority order. All share the same signature: -``(param: MCPInput) -> dict | None``. +Each source is an ``InputSchemaSource`` subclass that can type +an input parameter. Sources are tried in priority order — first +non-None wins. """ from __future__ import annotations @@ -11,15 +10,17 @@ from typing import Any from dash.mcp.types import MCPInput -from .schema_callback_type_annotations import annotation_to_schema -from .schema_component_proptypes_overrides import get_override_schema -from .schema_component_proptypes import get_component_prop_schema + +from .base import InputSchemaSource +from .schema_callback_type_annotations import AnnotationSchema +from .schema_component_proptypes_overrides import OverrideSchema +from .schema_component_proptypes import ComponentPropSchema from .input_descriptions import get_property_description -_SOURCES = [ - annotation_to_schema, - get_override_schema, - get_component_prop_schema, +_SOURCES: list[type[InputSchemaSource]] = [ + AnnotationSchema, + OverrideSchema, + ComponentPropSchema, ] @@ -31,7 +32,7 @@ def get_input_schema(param: MCPInput) -> dict[str, Any]: """ schema: dict[str, Any] = {} for source in _SOURCES: - result = source(param) + result = source.get_schema(param) if result is not None: schema = result break diff --git a/dash/mcp/primitives/tools/input_schemas/base.py b/dash/mcp/primitives/tools/input_schemas/base.py new file mode 100644 index 0000000000..42fe2352b6 --- /dev/null +++ b/dash/mcp/primitives/tools/input_schemas/base.py @@ -0,0 +1,20 @@ +"""Base class for input schema sources.""" + +from __future__ import annotations + +from typing import Any + +from dash.mcp.types import MCPInput + + +class InputSchemaSource: + """A source of JSON Schema that can type an MCP tool input parameter. + + Subclasses implement ``get_schema`` to return a JSON Schema dict + for the parameter, or ``None`` if this source cannot determine the + type. Sources are tried in priority order — first non-None wins. + """ + + @classmethod + def get_schema(cls, param: MCPInput) -> dict[str, Any] | None: + raise NotImplementedError diff --git a/dash/mcp/primitives/tools/input_schemas/input_descriptions/__init__.py b/dash/mcp/primitives/tools/input_schemas/input_descriptions/__init__.py index e1d1e9f47c..4bc6d8e984 100644 --- a/dash/mcp/primitives/tools/input_schemas/input_descriptions/__init__.py +++ b/dash/mcp/primitives/tools/input_schemas/input_descriptions/__init__.py @@ -1,23 +1,22 @@ """Per-property description generation for MCP tool input parameters. -Each source shares the same signature: -``(param: MCPInput) -> list[str]`` - -Sources are tried in order from most generic to most instance-specific. -All sources that produce lines are combined. +Each source is an ``InputDescriptionSource`` subclass that can add +text to a parameter's description. All sources are accumulated. """ from __future__ import annotations from dash.mcp.types import MCPInput -from .description_component_props import component_props_description -from .description_docstrings import docstring_prop_description -from .description_html_labels import label_description -_SOURCES = [ - docstring_prop_description, - label_description, - component_props_description, +from .base import InputDescriptionSource +from .description_component_props import ComponentPropsDescription +from .description_docstrings import DocstringPropDescription +from .description_html_labels import LabelDescription + +_SOURCES: list[type[InputDescriptionSource]] = [ + DocstringPropDescription, + LabelDescription, + ComponentPropsDescription, ] @@ -27,5 +26,5 @@ def get_property_description(param: MCPInput) -> str | None: if not param.get("required", True): lines.append("Input is optional.") for source in _SOURCES: - lines.extend(source(param)) + lines.extend(source.describe(param)) return "\n".join(lines) if lines else None diff --git a/dash/mcp/primitives/tools/input_schemas/input_descriptions/base.py b/dash/mcp/primitives/tools/input_schemas/input_descriptions/base.py new file mode 100644 index 0000000000..6bfd62da04 --- /dev/null +++ b/dash/mcp/primitives/tools/input_schemas/input_descriptions/base.py @@ -0,0 +1,18 @@ +"""Base class for per-parameter description sources.""" + +from __future__ import annotations + +from dash.mcp.types import MCPInput + + +class InputDescriptionSource: + """A source of text that can describe an MCP tool input parameter. + + Subclasses implement ``describe`` to return strings that will be + added to the callback parameter's description. All sources + are accumulated — every source can add text to the overall description. + """ + + @classmethod + def describe(cls, param: MCPInput) -> list[str]: + raise NotImplementedError diff --git a/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_component_props.py b/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_component_props.py index 6934918260..58b4b4627e 100644 --- a/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_component_props.py +++ b/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_component_props.py @@ -11,6 +11,8 @@ from dash import get_app from dash.mcp.types import MCPInput +from .base import InputDescriptionSource + _MAX_VALUE_LENGTH = 200 _MCP_EXCLUDED_PROPS = {"id", "className", "style"} @@ -25,52 +27,56 @@ } -def component_props_description(param: MCPInput) -> list[str]: - component = param.get("component") - if component is None: - return [] - - component_id = param["component_id"] - cbmap = get_app().mcp_callback_map - prop_lines: list[str] = [] - - for prop_name in getattr(component, "_prop_names", []): - if prop_name in _MCP_EXCLUDED_PROPS: - continue - - upstream = cbmap.find_by_output(f"{component_id}.{prop_name}") - if upstream is not None and not upstream.prevents_initial_call: - value = upstream.initial_output_value(f"{component_id}.{prop_name}") - else: - value = getattr(component, prop_name, None) - tool_name = upstream.tool_name if upstream is not None else None - - if value is None and tool_name is None: - continue - - component_type = param.get("component_type") - template = _PROP_TEMPLATES.get((component_type, prop_name)) - formatted_value = ( - _truncate_large_values(value, component_id, prop_name) - if value is not None - else None - ) - - if template and formatted_value is not None: - line = template.format(value=formatted_value) - elif formatted_value is not None: - line = f"{prop_name}: {formatted_value}" - else: - line = prop_name - - if tool_name: - line += f" (can be updated by tool: `{tool_name}`)" - - prop_lines.append(line) - - if not prop_lines: - return [] - return [f"Component properties for {component_id}:"] + prop_lines +class ComponentPropsDescription(InputDescriptionSource): + """Describe component properties with their current values.""" + + @classmethod + def describe(cls, param: MCPInput) -> list[str]: + component = param.get("component") + if component is None: + return [] + + component_id = param["component_id"] + cbmap = get_app().mcp_callback_map + prop_lines: list[str] = [] + + for prop_name in getattr(component, "_prop_names", []): + if prop_name in _MCP_EXCLUDED_PROPS: + continue + + upstream = cbmap.find_by_output(f"{component_id}.{prop_name}") + if upstream is not None and not upstream.prevents_initial_call: + value = upstream.initial_output_value(f"{component_id}.{prop_name}") + else: + value = getattr(component, prop_name, None) + tool_name = upstream.tool_name if upstream is not None else None + + if value is None and tool_name is None: + continue + + component_type = param.get("component_type") + template = _PROP_TEMPLATES.get((component_type, prop_name)) + formatted_value = ( + _truncate_large_values(value, component_id, prop_name) + if value is not None + else None + ) + + if template and formatted_value is not None: + line = template.format(value=formatted_value) + elif formatted_value is not None: + line = f"{prop_name}: {formatted_value}" + else: + line = prop_name + + if tool_name: + line += f" (can be updated by tool: `{tool_name}`)" + + prop_lines.append(line) + + if not prop_lines: + return [] + return [f"Component properties for {component_id}:"] + prop_lines def _truncate_large_values(value: Any, component_id: str, prop_name: str) -> str: diff --git a/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_docstrings.py b/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_docstrings.py index 1f67c3c0f2..23045625bf 100644 --- a/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_docstrings.py +++ b/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_docstrings.py @@ -19,6 +19,8 @@ from dash.mcp.types import MCPInput +from .base import InputDescriptionSource + _PROP_RE = re.compile( r"^[ ]*- (\w+) \([^)]+\):\s*\n((?:[ ]+.+\n)*)", re.MULTILINE, @@ -29,12 +31,16 @@ _SENTENCE_END = re.compile(r"(?<=[.!?])\s") -def docstring_prop_description(param: MCPInput) -> list[str]: - component = param.get("component") - if component is None: - return [] - desc = _get_prop_description(type(component), param["property"]) - return [desc] if desc else [] +class DocstringPropDescription(InputDescriptionSource): + """Extract property description from the component's docstring.""" + + @classmethod + def describe(cls, param: MCPInput) -> list[str]: + component = param.get("component") + if component is None: + return [] + desc = _get_prop_description(type(component), param["property"]) + return [desc] if desc else [] def _get_prop_description(cls: type, prop: str) -> str | None: diff --git a/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_html_labels.py b/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_html_labels.py index 2c9cd8dea9..111e1eaaf7 100644 --- a/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_html_labels.py +++ b/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_html_labels.py @@ -10,14 +10,19 @@ from dash import get_app from dash.mcp.types import MCPInput +from .base import InputDescriptionSource -def label_description(param: MCPInput) -> list[str]: + +class LabelDescription(InputDescriptionSource): """Return the label text for this component, if any.""" - component_id = param.get("component_id") - if not component_id: + + @classmethod + def describe(cls, param: MCPInput) -> list[str]: + component_id = param.get("component_id") + if not component_id: + return [] + label_map = get_app().mcp_callback_map.component_label_map + texts = label_map.get(component_id, []) + if texts: + return [f"Labeled with: {'; '.join(texts)}"] return [] - label_map = get_app().mcp_callback_map.component_label_map - texts = label_map.get(component_id, []) - if texts: - return [f"Labeled with: {'; '.join(texts)}"] - return [] diff --git a/dash/mcp/primitives/tools/input_schemas/schema_callback_type_annotations.py b/dash/mcp/primitives/tools/input_schemas/schema_callback_type_annotations.py index aee5b17c6f..9cf73653fa 100644 --- a/dash/mcp/primitives/tools/input_schemas/schema_callback_type_annotations.py +++ b/dash/mcp/primitives/tools/input_schemas/schema_callback_type_annotations.py @@ -23,6 +23,8 @@ from dash.development.base_component import Component from dash.mcp.types import MCPInput, is_nullable +from .base import InputSchemaSource + def annotation_to_json_schema(annotation: type) -> dict[str, Any] | None: """Convert a Python type annotation to a JSON Schema dict. @@ -41,27 +43,23 @@ def annotation_to_json_schema(annotation: type) -> dict[str, Any] | None: return None -def annotation_to_schema(param: MCPInput) -> dict[str, Any] | None: - """Convert a callback parameter's type annotation to a JSON Schema dict. - - Returns ``None`` if the annotation is not recognised, meaning the - caller should fall through to the next schema source. +class AnnotationSchema(InputSchemaSource): + """Derive JSON Schema from the callback parameter's type annotation.""" - ``Optional[X]`` produces ``{"type": ["X", "null"]}`` — the user - explicitly chose a nullable type. - """ - annotation = param.get("annotation") - if annotation is None: - return None - schema = annotation_to_json_schema(annotation) - if schema is None: - return None + @classmethod + def get_schema(cls, param: MCPInput) -> dict[str, Any] | None: + annotation = param.get("annotation") + if annotation is None: + return None + schema = annotation_to_json_schema(annotation) + if schema is None: + return None - if is_nullable(annotation) and schema: - t = schema.get("type") - if isinstance(t, str): - schema = {**schema, "type": [t, "null"]} - elif isinstance(t, list) and "null" not in t: - schema = {**schema, "type": [*t, "null"]} + if is_nullable(annotation) and schema: + t = schema.get("type") + if isinstance(t, str): + schema = {**schema, "type": [t, "null"]} + elif isinstance(t, list) and "null" not in t: + schema = {**schema, "type": [*t, "null"]} - return schema + return schema diff --git a/dash/mcp/primitives/tools/input_schemas/schema_component_proptypes.py b/dash/mcp/primitives/tools/input_schemas/schema_component_proptypes.py index 151e391cf4..d7f72d81ff 100644 --- a/dash/mcp/primitives/tools/input_schemas/schema_component_proptypes.py +++ b/dash/mcp/primitives/tools/input_schemas/schema_component_proptypes.py @@ -6,27 +6,32 @@ from typing import Any from dash.mcp.types import MCPInput + +from .base import InputSchemaSource from .schema_callback_type_annotations import annotation_to_json_schema -def get_component_prop_schema(param: MCPInput) -> dict[str, Any] | None: - """Return the JSON Schema for a component property. +class ComponentPropSchema(InputSchemaSource): + """Derive JSON Schema from a component's ``__init__`` type annotations. Inspects the ``__init__`` signature of the component's class. Returns ``None`` if the prop has no annotation. """ - component = param.get("component") - prop = param["property"] - if component is None: - return None - try: - sig = inspect.signature(type(component).__init__) - except (ValueError, TypeError): - return None + @classmethod + def get_schema(cls, param: MCPInput) -> dict[str, Any] | None: + component = param.get("component") + prop = param["property"] + if component is None: + return None + + try: + sig = inspect.signature(type(component).__init__) + except (ValueError, TypeError): + return None - sig_param = sig.parameters.get(prop) - if sig_param is None or sig_param.annotation is inspect.Parameter.empty: - return None + sig_param = sig.parameters.get(prop) + if sig_param is None or sig_param.annotation is inspect.Parameter.empty: + return None - return annotation_to_json_schema(sig_param.annotation) + return annotation_to_json_schema(sig_param.annotation) diff --git a/dash/mcp/primitives/tools/input_schemas/schema_component_proptypes_overrides.py b/dash/mcp/primitives/tools/input_schemas/schema_component_proptypes_overrides.py index 25086896e7..984d493d69 100644 --- a/dash/mcp/primitives/tools/input_schemas/schema_component_proptypes_overrides.py +++ b/dash/mcp/primitives/tools/input_schemas/schema_component_proptypes_overrides.py @@ -7,7 +7,9 @@ from typing import Any from dash.mcp.types import MCPInput -from .schema_component_proptypes import get_component_prop_schema + +from .base import InputSchemaSource +from .schema_component_proptypes import ComponentPropSchema _DATE_SCHEMA = { "type": "string", @@ -18,7 +20,7 @@ def _compute_dropdown_value_schema(param: MCPInput) -> dict[str, Any] | None: """Dropdown values are an array if `multi=True`; scalar values otherwise.""" - schema = get_component_prop_schema(param) + schema = ComponentPropSchema.get_schema(param) if schema is None: return None @@ -46,7 +48,6 @@ def _compute_dropdown_value_schema(param: MCPInput) -> dict[str, Any] | None: ("DatePickerSingle", "date"): _DATE_SCHEMA, ("DatePickerRange", "start_date"): _DATE_SCHEMA, ("DatePickerRange", "end_date"): _DATE_SCHEMA, - # Graph — annotation says "object", we add structured properties. ("Graph", "figure"): { "type": "object", "properties": { @@ -59,12 +60,15 @@ def _compute_dropdown_value_schema(param: MCPInput) -> dict[str, Any] | None: } -def get_override_schema(param: MCPInput) -> dict[str, Any] | None: +class OverrideSchema(InputSchemaSource): """Return a schema override, or None to fall through to introspection.""" - key = (param.get("component_type"), param["property"]) - override = _OVERRIDES.get(key) - if override is None: - return None - if callable(override): - return override(param) - return dict(override) + + @classmethod + def get_schema(cls, param: MCPInput) -> dict[str, Any] | None: + key = (param.get("component_type"), param["property"]) + override = _OVERRIDES.get(key) + if override is None: + return None + if callable(override): + return override(param) + return dict(override) From e29cb9cd40cd38676317d2745ec60c23f4d67c84 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Tue, 21 Apr 2026 11:24:12 -0600 Subject: [PATCH 029/103] Disable docstrings by default in MCP tool descriptions --- dash/_callback.py | 5 ++ .../descriptions/description_docstring.py | 19 +++++++- tests/unit/mcp/conftest.py | 6 ++- tests/unit/mcp/tools/test_callback_adapter.py | 46 +++++++++++++++++-- 4 files changed, 70 insertions(+), 6 deletions(-) diff --git a/dash/_callback.py b/dash/_callback.py index c8d610fa48..637a332905 100644 --- a/dash/_callback.py +++ b/dash/_callback.py @@ -87,6 +87,7 @@ def callback( websocket: Optional[bool] = False, persistent: Optional[bool] = False, mcp_enabled: bool = True, + mcp_expose_docstring: Optional[bool] = None, **_kwargs, ) -> Callable[[Callable[Params, ReturnVar]], Callable[Params, ReturnVar]]: """ @@ -245,6 +246,7 @@ def callback( websocket=websocket, persistent=persistent, mcp_enabled=mcp_enabled, + mcp_expose_docstring=mcp_expose_docstring, ) return cast( @@ -299,6 +301,7 @@ def insert_callback( websocket=False, persistent=False, mcp_enabled=True, + mcp_expose_docstring=None, ) -> str: if prevent_initial_call is None: prevent_initial_call = config_prevent_initial_callbacks @@ -343,6 +346,7 @@ def insert_callback( "no_output": no_output, "websocket": websocket, "mcp_enabled": mcp_enabled, + "mcp_expose_docstring": mcp_expose_docstring, } callback_list.append(callback_spec) @@ -683,6 +687,7 @@ def register_callback( websocket=_kwargs.get("websocket", False), persistent=_kwargs.get("persistent", False), mcp_enabled=_kwargs.get("mcp_enabled", True), + mcp_expose_docstring=_kwargs.get("mcp_expose_docstring"), ) # pylint: disable=too-many-locals diff --git a/dash/mcp/primitives/tools/descriptions/description_docstring.py b/dash/mcp/primitives/tools/descriptions/description_docstring.py index 9bcc697248..3641d3e1f7 100644 --- a/dash/mcp/primitives/tools/descriptions/description_docstring.py +++ b/dash/mcp/primitives/tools/descriptions/description_docstring.py @@ -4,6 +4,8 @@ from typing import TYPE_CHECKING +from dash import get_app + from .base import ToolDescriptionSource if TYPE_CHECKING: @@ -11,11 +13,26 @@ class DocstringDescription(ToolDescriptionSource): - """Return the callback's docstring as description lines.""" + """Return the callback's docstring as description lines. + + Gated behind an opt-in flag: docstrings may contain sensitive + implementation details that the browser never surfaces to users, + so we don't expose them to MCP clients unless the author opts in + — either per-callback or app-wide. + """ @classmethod def describe(cls, callback: CallbackAdapter) -> list[str]: + if not cls._is_exposed(callback): + return [] docstring = callback._docstring if docstring: return ["", docstring.strip()] return [] + + @classmethod + def _is_exposed(cls, callback: CallbackAdapter) -> bool: + per_callback = callback._cb_info.get("mcp_expose_docstring") + if per_callback is not None: + return per_callback + return get_app().config.get("mcp_expose_docstrings", False) diff --git a/tests/unit/mcp/conftest.py b/tests/unit/mcp/conftest.py index 83f6e5378c..7f85e4af9d 100644 --- a/tests/unit/mcp/conftest.py +++ b/tests/unit/mcp/conftest.py @@ -33,7 +33,11 @@ def _make_app(**kwargs): ] ) - @app.callback(Output("my-output", "children"), Input("my-input", "children")) + @app.callback( + Output("my-output", "children"), + Input("my-input", "children"), + mcp_expose_docstring=True, + ) def update_output(value): """Test callback docstring.""" return f"echo: {value}" diff --git a/tests/unit/mcp/tools/test_callback_adapter.py b/tests/unit/mcp/tools/test_callback_adapter.py index dc3fc041fc..41d9b18c21 100644 --- a/tests/unit/mcp/tools/test_callback_adapter.py +++ b/tests/unit/mcp/tools/test_callback_adapter.py @@ -201,10 +201,48 @@ def test_returns_tool_instance(self, simple_app): assert isinstance(tool, Tool) assert tool.name == "update" - def test_description_includes_docstring(self, simple_app): - with simple_app.server.test_request_context(): - tool = app_context.get().mcp_callback_map[0].as_mcp_tool - assert "Update output." in tool.description + def test_docstring_hidden_by_default(self): + """Callback docstrings are not exposed to MCP by default.""" + app = Dash(__name__) + app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("inp", "value")) + def update(val): + """sensitive callback docstring text that must not leak to LLMs""" + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + + with app.server.test_request_context(): + tool = app.mcp_callback_map[0].as_mcp_tool + assert ( + "sensitive callback docstring text that must not leak to LLMs" + not in tool.description + ) + + def test_docstring_exposed_when_opted_in_per_callback(self): + app = Dash(__name__) + app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) + + @app.callback( + Output("out", "children"), + Input("inp", "value"), + mcp_expose_docstring=True, + ) + def update(val): + """intentionally-exposed callback docstring text for the LLM""" + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + + with app.server.test_request_context(): + tool = app.mcp_callback_map[0].as_mcp_tool + assert ( + "intentionally-exposed callback docstring text for the LLM" + in tool.description + ) def test_description_includes_output_target(self, simple_app): with simple_app.server.test_request_context(): From 991dfa52ad0a9eaef5eba920e42958f5e541b0b9 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 22 Apr 2026 11:29:50 -0600 Subject: [PATCH 030/103] lint --- .github/workflows/testing.yml | 2 + .pylintrc | 2 +- dash/mcp/primitives/tools/callback_adapter.py | 3 +- .../descriptions/description_docstring.py | 3 +- .../schema_callback_type_annotations.py | 2 +- package.json | 2 +- .../unit/mcp/tools/input_schemas/__init__.py | 0 .../input_descriptions/__init__.py | 0 .../input_descriptions/test_descriptions.py | 424 ----------------- .../tools/input_schemas/test_input_schemas.py | 331 ------------- .../test_schema_component_proptypes.py | 15 - tests/unit/mcp/tools/test_callback_adapter.py | 430 ----------------- .../mcp/tools/test_mcp_callback_adapter.py | 182 +++++++ .../mcp/tools/test_mcp_input_descriptions.py | 445 ++++++++++++++++++ .../unit/mcp/tools/test_mcp_input_schemas.py | 270 +++++++++++ tests/unit/mcp/tools/test_mcp_tools.py | 358 ++++++++++++++ tests/unit/mcp/tools/test_tool_schema.py | 64 --- 17 files changed, 1264 insertions(+), 1269 deletions(-) delete mode 100644 tests/unit/mcp/tools/input_schemas/__init__.py delete mode 100644 tests/unit/mcp/tools/input_schemas/input_descriptions/__init__.py delete mode 100644 tests/unit/mcp/tools/input_schemas/input_descriptions/test_descriptions.py delete mode 100644 tests/unit/mcp/tools/input_schemas/test_input_schemas.py delete mode 100644 tests/unit/mcp/tools/input_schemas/test_schema_component_proptypes.py delete mode 100644 tests/unit/mcp/tools/test_callback_adapter.py create mode 100644 tests/unit/mcp/tools/test_mcp_callback_adapter.py create mode 100644 tests/unit/mcp/tools/test_mcp_input_descriptions.py create mode 100644 tests/unit/mcp/tools/test_mcp_input_schemas.py create mode 100644 tests/unit/mcp/tools/test_mcp_tools.py delete mode 100644 tests/unit/mcp/tools/test_tool_schema.py diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 2359695404..358f9fd2d2 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -122,6 +122,8 @@ jobs: echo "DISPLAY=:99" >> $GITHUB_ENV - name: Run lint + env: + PYLINT_EXTRA_ARGS: ${{ matrix.python-version == '3.8' && '--ignored-modules=mcp' || '' }} run: npm run lint - name: Run unit tests diff --git a/.pylintrc b/.pylintrc index 7ffb5576b7..39e142048d 100644 --- a/.pylintrc +++ b/.pylintrc @@ -431,7 +431,7 @@ max-returns=6 max-statements=50 # Minimum number of public methods for a class (see R0903). -min-public-methods=2 +min-public-methods=1 [IMPORTS] diff --git a/dash/mcp/primitives/tools/callback_adapter.py b/dash/mcp/primitives/tools/callback_adapter.py index c97c7721ce..c94ba32f38 100644 --- a/dash/mcp/primitives/tools/callback_adapter.py +++ b/dash/mcp/primitives/tools/callback_adapter.py @@ -135,7 +135,8 @@ def output_id(self) -> str: @property def tool_name(self) -> str: - return get_app().mcp_callback_map._tool_names_map[self._output_id] # pylint: disable=protected-access + # pylint: disable-next=protected-access + return get_app().mcp_callback_map._tool_names_map[self._output_id] @cached_property def prevents_initial_call(self) -> bool: diff --git a/dash/mcp/primitives/tools/descriptions/description_docstring.py b/dash/mcp/primitives/tools/descriptions/description_docstring.py index 3641d3e1f7..c34d527077 100644 --- a/dash/mcp/primitives/tools/descriptions/description_docstring.py +++ b/dash/mcp/primitives/tools/descriptions/description_docstring.py @@ -25,13 +25,14 @@ class DocstringDescription(ToolDescriptionSource): def describe(cls, callback: CallbackAdapter) -> list[str]: if not cls._is_exposed(callback): return [] - docstring = callback._docstring + docstring = callback._docstring # pylint: disable=protected-access if docstring: return ["", docstring.strip()] return [] @classmethod def _is_exposed(cls, callback: CallbackAdapter) -> bool: + # pylint: disable-next=protected-access per_callback = callback._cb_info.get("mcp_expose_docstring") if per_callback is not None: return per_callback diff --git a/dash/mcp/primitives/tools/input_schemas/schema_callback_type_annotations.py b/dash/mcp/primitives/tools/input_schemas/schema_callback_type_annotations.py index 9cf73653fa..b862b124d6 100644 --- a/dash/mcp/primitives/tools/input_schemas/schema_callback_type_annotations.py +++ b/dash/mcp/primitives/tools/input_schemas/schema_callback_type_annotations.py @@ -39,7 +39,7 @@ def annotation_to_json_schema(annotation: type) -> dict[str, Any] | None: try: return TypeAdapter(annotation).json_schema() - except Exception: + except Exception: # pylint: disable=broad-exception-caught return None diff --git a/package.json b/package.json index f44a0f2805..0f24f25d81 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "private::build.jupyterlab": "cd @plotly/dash-jupyterlab && jlpm install && jlpm build:pack", "private::lint.black": "black dash tests --exclude 'metadata_test.py|node_modules' --check", "private::lint.flake8": "flake8 dash tests", - "private::lint.pylint-dash": "pylint dash setup.py --rcfile=.pylintrc", + "private::lint.pylint-dash": "pylint dash setup.py --rcfile=.pylintrc ${PYLINT_EXTRA_ARGS:-}", "private::lint.pylint-tests": "pylint tests/unit tests/integration -d all -e C0410,C0413,W0109 --rcfile=.pylintrc", "private::lint.renderer": "cd dash/dash-renderer && npm run lint", "private::test.setup-components": "cd @plotly/dash-test-components && npm ci && npm run build", diff --git a/tests/unit/mcp/tools/input_schemas/__init__.py b/tests/unit/mcp/tools/input_schemas/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/unit/mcp/tools/input_schemas/input_descriptions/__init__.py b/tests/unit/mcp/tools/input_schemas/input_descriptions/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/unit/mcp/tools/input_schemas/input_descriptions/test_descriptions.py b/tests/unit/mcp/tools/input_schemas/input_descriptions/test_descriptions.py deleted file mode 100644 index bc6758d2d3..0000000000 --- a/tests/unit/mcp/tools/input_schemas/input_descriptions/test_descriptions.py +++ /dev/null @@ -1,424 +0,0 @@ -"""Description tests — verifies per-property description generation. - -Tests are organized by description source: -- Labels (htmlFor, containment, text extraction) -- Component-specific (date pickers, sliders) -- Options (Dropdown, RadioItems, Checklist) -- Generic props (placeholder, default value, min/max/step) -- Chained callbacks (dynamic prop/options detection) -- Combinations (label + component-specific) -""" - -import pytest - -from dash import Dash, Input, Output, dcc, html - -from tests.unit.mcp.conftest import ( - _app_with_callback, - _desc_for, - _tools_list, - _user_tool, -) - - -def _app_with_layout(layout, *inputs): - app = Dash(__name__) - app.layout = layout - - @app.callback( - Output("out", "children"), - [Input(cid, prop) for cid, prop in inputs], - ) - def update(*args): - return str(args) - - return app - - -def _tool_for(component, input_prop="value"): - app = _app_with_callback(component, input_prop=input_prop) - return _user_tool(_tools_list(app)) - - -# --------------------------------------------------------------------------- -# Labels -# --------------------------------------------------------------------------- - - -class TestLabels: - def test_html_for(self): - app = _app_with_layout( - html.Div( - [ - html.Label("Your Name", htmlFor="inp"), - dcc.Input(id="inp"), - html.Div(id="out"), - ] - ), - ("inp", "value"), - ) - tool = _user_tool(_tools_list(app)) - assert "Your Name" in _desc_for(tool) - - def test_html_for_not_adjacent(self): - app = _app_with_layout( - html.Div( - [ - html.Div(html.Label("Remote Label", htmlFor="inp")), - dcc.Input(id="inp"), - html.Div(id="out"), - ] - ), - ("inp", "value"), - ) - tool = _user_tool(_tools_list(app)) - assert "Remote Label" in _desc_for(tool) - - def test_containment(self): - app = _app_with_layout( - html.Div( - [ - html.Label( - [ - "Pick a city", - dcc.Dropdown(id="city_dd", options=["NYC", "LA"]), - ] - ), - html.Div(id="out"), - ] - ), - ("city_dd", "value"), - ) - tool = _user_tool(_tools_list(app)) - assert "Pick a city" in _desc_for(tool) - - def test_deeply_nested_containment(self): - app = _app_with_layout( - html.Div( - [ - html.Label( - [ - html.Span("Nested Label"), - html.Div(dcc.Input(id="nested_inp")), - ] - ), - html.Div(id="out"), - ] - ), - ("nested_inp", "value"), - ) - tool = _user_tool(_tools_list(app)) - assert "Nested Label" in _desc_for(tool) - - def test_both_htmlfor_and_containment_captured(self): - app = _app_with_layout( - html.Div( - [ - html.Label(["Containment Label", dcc.Input(id="inp")]), - html.Label("HtmlFor Label", htmlFor="inp"), - html.Div(id="out"), - ] - ), - ("inp", "value"), - ) - tool = _user_tool(_tools_list(app)) - desc = _desc_for(tool) - assert "HtmlFor Label" in desc - assert "Containment Label" in desc - - def test_deep_text_extraction(self): - app = _app_with_layout( - html.Div( - [ - html.Label( - html.Div(html.Span(html.B("Deep Text"))), - htmlFor="inp", - ), - dcc.Input(id="inp"), - html.Div(id="out"), - ] - ), - ("inp", "value"), - ) - tool = _user_tool(_tools_list(app)) - assert "Deep Text" in _desc_for(tool) - - def test_multiple_text_nodes(self): - app = _app_with_layout( - html.Div( - [ - html.Label( - [html.B("First"), " ", html.I("Second")], - htmlFor="inp", - ), - dcc.Input(id="inp"), - html.Div(id="out"), - ] - ), - ("inp", "value"), - ) - tool = _user_tool(_tools_list(app)) - desc = _desc_for(tool) - assert "Labeled with: First Second" in desc - - def test_unrelated_label_excluded(self): - app = _app_with_layout( - html.Div( - [ - html.Label("Other Field", htmlFor="other"), - dcc.Input(id="other"), - dcc.Input(id="target"), - html.Div(id="out"), - ] - ), - ("target", "value"), - ) - tool = _user_tool(_tools_list(app)) - desc = _desc_for(tool) - assert "Other Field" not in (desc or "") - - -# --------------------------------------------------------------------------- -# Component-specific: date pickers -# --------------------------------------------------------------------------- - - -class TestDatePickerDescriptions: - def test_single_full_range(self): - dp = dcc.DatePickerSingle( - id="dp", - min_date_allowed="2020-01-01", - max_date_allowed="2025-12-31", - ) - desc = _desc_for(_tool_for(dp, "date"), "val") - assert "2020-01-01" in desc - assert "2025-12-31" in desc - - def test_single_min_only(self): - dp = dcc.DatePickerSingle(id="dp", min_date_allowed="2020-01-01") - desc = _desc_for(_tool_for(dp, "date"), "val") - assert "min_date_allowed: '2020-01-01'" in desc - - def test_single_default_date(self): - dp = dcc.DatePickerSingle(id="dp", date="2024-06-15") - desc = _desc_for(_tool_for(dp, "date"), "val") - assert "date: '2024-06-15'" in desc - - def test_range_with_constraints(self): - dpr = dcc.DatePickerRange( - id="dpr", - min_date_allowed="2020-01-01", - max_date_allowed="2025-12-31", - ) - desc = _desc_for(_tool_for(dpr, "start_date"), "val") - assert "2020-01-01" in desc - - -# --------------------------------------------------------------------------- -# Component-specific: sliders -# --------------------------------------------------------------------------- - - -class TestSliderDescriptions: - def test_min_max(self): - sl = dcc.Slider(id="sl", min=0, max=100) - desc = _desc_for(_tool_for(sl), "val") - assert "min: 0" in desc - assert "max: 100" in desc - - def test_step(self): - sl = dcc.Slider(id="sl", min=0, max=100, step=5) - desc = _desc_for(_tool_for(sl), "val") - assert "step: 5" in desc - - def test_default_value(self): - sl = dcc.Slider(id="sl", min=0, max=100, value=50) - desc = _desc_for(_tool_for(sl), "val") - assert "value: 50" in desc - - def test_marks(self): - sl = dcc.Slider(id="sl", min=0, max=100, marks={0: "Low", 100: "High"}) - desc = _desc_for(_tool_for(sl), "val") - assert "marks: {0: 'Low', 100: 'High'}" in desc - - def test_range_slider_min_max(self): - rs = dcc.RangeSlider(id="rs", min=0, max=100) - desc = _desc_for(_tool_for(rs), "val") - assert "min: 0" in desc - assert "max: 100" in desc - - -# --------------------------------------------------------------------------- -# Options (parametrized across Dropdown, RadioItems, Checklist) -# --------------------------------------------------------------------------- - - -_OPTIONS_COMPONENTS = [ - ("Dropdown", lambda **kw: dcc.Dropdown(id="comp", **kw), "comp"), - ("RadioItems", lambda **kw: dcc.RadioItems(id="comp", **kw), "comp"), - ("Checklist", lambda **kw: dcc.Checklist(id="comp", **kw), "comp"), -] - - -class TestOptionsDescriptions: - @pytest.mark.parametrize( - "name,factory,cid", _OPTIONS_COMPONENTS, ids=[c[0] for c in _OPTIONS_COMPONENTS] - ) - def test_options_shown(self, name, factory, cid): - comp = factory(options=["X", "Y", "Z"]) - desc = _desc_for(_tool_for(comp), "val") - assert "options: ['X', 'Y', 'Z']" in desc - - @pytest.mark.parametrize( - "name,factory,cid", _OPTIONS_COMPONENTS, ids=[c[0] for c in _OPTIONS_COMPONENTS] - ) - def test_default_shown(self, name, factory, cid): - value = ["a"] if name == "Checklist" else "a" - comp = factory(options=["a", "b"], value=value) - desc = _desc_for(_tool_for(comp), "val") - assert f"value: {value!r}" in desc - - def test_dropdown_dict_options(self): - dd = dcc.Dropdown( - id="dd", - options=[ - {"label": "New York", "value": "NYC"}, - ], - ) - assert "NYC" in _desc_for(_tool_for(dd), "val") - - def test_store_storage_type_template(self): - store = dcc.Store(id="store", storage_type="session") - app = _app_with_callback(store, input_prop="data") - tool = _user_tool(_tools_list(app)) - desc = _desc_for(tool, "val") - assert ( - "storage_type: 'session'. Describes how to store the value client-side" - in desc - ) - - def test_many_options_truncated(self): - dd = dcc.Dropdown(id="big", options=[str(i) for i in range(50)], value="0") - app = _app_with_callback(dd) - tool = _user_tool(_tools_list(app)) - desc = _desc_for(tool, "val") - assert "options:" in desc - assert "Use get_dash_component('big', 'options') for the full value" in desc - - -# --------------------------------------------------------------------------- -# Generic props -# --------------------------------------------------------------------------- - - -class TestGenericDescriptions: - def test_placeholder(self): - inp = dcc.Input(id="inp", placeholder="Enter your name") - assert "placeholder: 'Enter your name'" in _desc_for(_tool_for(inp), "val") - - def test_numeric_min_max(self): - inp = dcc.Input(id="inp", type="number", min=0, max=999) - desc = _desc_for(_tool_for(inp), "val") - assert "min: 0" in desc - assert "max: 999" in desc - - def test_step(self): - inp = dcc.Input(id="inp", type="number", min=0, max=100, step=0.1) - assert "step: 0.1" in _desc_for(_tool_for(inp), "val") - - def test_default_value(self): - inp = dcc.Input(id="inp", value="hello") - desc = _desc_for(_tool_for(inp), "val") - assert "value: 'hello'" in desc - - def test_non_text_type(self): - inp = dcc.Input(id="inp", type="email") - assert "type: 'email'" in _desc_for(_tool_for(inp), "val") - - def test_store_default(self): - store = dcc.Store(id="store", data={"key": "value"}) - app = _app_with_callback(store, input_prop="data") - tool = _user_tool(_tools_list(app)) - assert "data: {'key': 'value'}" in _desc_for(tool, "val") - - -# --------------------------------------------------------------------------- -# Chained callbacks -# --------------------------------------------------------------------------- - - -class TestChainedCallbacks: - def test_options_set_by_upstream(self): - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Dropdown(id="country", options=["US", "CA"], value="US"), - dcc.Dropdown(id="city", options=[], value=None), - html.Div(id="result"), - ] - ) - - @app.callback(Output("city", "options"), Input("country", "value")) - def update_cities(country): - return ["NYC", "LA"] if country == "US" else ["Toronto"] - - @app.callback(Output("result", "children"), Input("city", "value")) - def show_city(city): - return city - - tools = _tools_list(app) - tool = next(t for t in tools if "show_city" in t.name) - desc = _desc_for(tool, "city") - assert "can be updated by tool: `update_cities`" in desc - assert "options:" in desc - - def test_value_set_by_upstream(self): - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Input(id="source", value=""), - html.Div(id="derived", children=""), - html.Div(id="result"), - ] - ) - - @app.callback(Output("derived", "children"), Input("source", "value")) - def compute_derived(val): - return f"derived: {val}" - - @app.callback(Output("result", "children"), Input("derived", "children")) - def use_derived(val): - return val - - tools = _tools_list(app) - tool = next(t for t in tools if "use_derived" in t.name) - desc = _desc_for(tool, "val") - assert "can be updated by tool: `compute_derived`" in desc - - -# --------------------------------------------------------------------------- -# Combinations -# --------------------------------------------------------------------------- - - -class TestCombinations: - def test_label_with_date_picker(self): - dp = dcc.DatePickerSingle( - id="dp", - min_date_allowed="2020-01-01", - max_date_allowed="2025-12-31", - ) - app = _app_with_layout( - html.Div( - [ - html.Label("Departure Date", htmlFor="dp"), - dp, - html.Div(id="out"), - ] - ), - ("dp", "date"), - ) - tool = _user_tool(_tools_list(app)) - desc = _desc_for(tool) - assert "Departure Date" in desc - assert "2020-01-01" in desc diff --git a/tests/unit/mcp/tools/input_schemas/test_input_schemas.py b/tests/unit/mcp/tools/input_schemas/test_input_schemas.py deleted file mode 100644 index 5350bd955e..0000000000 --- a/tests/unit/mcp/tools/input_schemas/test_input_schemas.py +++ /dev/null @@ -1,331 +0,0 @@ -"""Input schema tests — verifies JSON Schema generation for component properties. - -Tests are organized by concern: -- Static overrides (date pickers, graph, interval, sliders) -- Component introspection (representative samples — full type coverage in test_json_prop_typing) -- Callback annotation overrides (highest priority) -- Required/nullable behavior -""" - -import pytest -from typing import Optional - -from dash import Dash, Input, Output, State, dcc, html - -from tests.unit.mcp.conftest import ( - _app_with_callback, - _schema_for, - _tools_list, - _user_tool, -) - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - - -def _get_schema(component_type, prop): - _factories = { - "DatePickerSingle": lambda: dcc.DatePickerSingle(id="dp"), - "DatePickerRange": lambda: dcc.DatePickerRange(id="dpr"), - "Graph": lambda: dcc.Graph(id="graph"), - "Interval": lambda: dcc.Interval(id="intv"), - "Input": lambda: dcc.Input(id="inp"), - "Textarea": lambda: dcc.Textarea(id="ta"), - "Tabs": lambda: dcc.Tabs(id="tabs"), - "Dropdown": lambda: dcc.Dropdown(id="dd"), - "RadioItems": lambda: dcc.RadioItems(id="ri"), - "Checklist": lambda: dcc.Checklist(id="cl"), - "Store": lambda: dcc.Store(id="store"), - "Upload": lambda: dcc.Upload(id="upload"), - "Slider": lambda: dcc.Slider(id="sl"), - "RangeSlider": lambda: dcc.RangeSlider(id="rs"), - } - app = _app_with_callback(_factories[component_type](), input_prop=prop) - tool = _user_tool(_tools_list(app)) - return _schema_for(tool) - - -# --------------------------------------------------------------------------- -# Static overrides take priority over introspection -# --------------------------------------------------------------------------- - - -class TestStaticOverrides: - """Verify that overrides win over component introspection.""" - - def test_override_beats_introspection(self): - schema = _get_schema("DatePickerSingle", "date") - # Introspection would return None for this prop; - # override provides a date format with pattern - assert schema["type"] == "string" - assert schema["format"] == "date" - assert "pattern" in schema - - -# --------------------------------------------------------------------------- -# Introspection — representative samples (not exhaustive per-component) -# --------------------------------------------------------------------------- - -INTROSPECTION_CASES = [ - # (component_type, prop, expected_schema) — one per distinct type shape - ( - "Input", - "value", - {"anyOf": [{"type": "string"}, {"type": "number"}, {"type": "null"}]}, - ), - ( - "Input", - "disabled", - { - "anyOf": [ - {"type": "boolean"}, - {"const": "disabled", "type": "string"}, - {"const": "DISABLED", "type": "string"}, - {"type": "null"}, - ] - }, - ), - ("Input", "n_submit", {"anyOf": [{"type": "number"}, {"type": "null"}]}), - ( - "Dropdown", - "value", - { - "anyOf": [ - {"type": "string"}, - {"type": "number"}, - {"type": "boolean"}, - { - "items": { - "anyOf": [ - {"type": "string"}, - {"type": "number"}, - {"type": "boolean"}, - ] - }, - "type": "array", - }, - {"type": "null"}, - ] - }, - ), - ("Dropdown", "options", {"anyOf": [{}, {"type": "null"}]}), - ( - "Checklist", - "value", - { - "anyOf": [ - { - "items": { - "anyOf": [ - {"type": "string"}, - {"type": "number"}, - {"type": "boolean"}, - ] - }, - "type": "array", - }, - {"type": "null"}, - ] - }, - ), - ( - "Store", - "data", - { - "anyOf": [ - {"additionalProperties": True, "type": "object"}, - {"items": {}, "type": "array"}, - {"type": "number"}, - {"type": "string"}, - {"type": "boolean"}, - {"type": "null"}, - ] - }, - ), - ( - "Upload", - "contents", - { - "anyOf": [ - {"type": "string"}, - {"items": {"type": "string"}, "type": "array"}, - {"type": "null"}, - ] - }, - ), - ( - "RangeSlider", - "value", - {"anyOf": [{"items": {"type": "number"}, "type": "array"}, {"type": "null"}]}, - ), - ("Tabs", "value", {"anyOf": [{"type": "string"}, {"type": "null"}]}), -] - - -class TestIntrospection: - """Representative introspection tests — full type coverage in test_json_prop_typing.""" - - @pytest.mark.parametrize( - "component_type,prop,expected", - INTROSPECTION_CASES, - ids=[f"{c}.{p}" for c, p, _ in INTROSPECTION_CASES], - ) - def test_introspected_schema(self, component_type, prop, expected): - assert _get_schema(component_type, prop) == expected - - -# --------------------------------------------------------------------------- -# Callback annotation overrides -# --------------------------------------------------------------------------- - - -def _app_with_annotated_callback(annotation_type, input_prop="disabled"): - app = Dash(__name__) - app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) - - if annotation_type is None: - - @app.callback(Output("out", "children"), Input("inp", input_prop)) - def update(val): - return str(val) - - else: - - @app.callback(Output("out", "children"), Input("inp", input_prop)) - def update(val: annotation_type): - return str(val) - - return app - - -ANNOTATION_CASES = [ - (str, "disabled", {"type": "string"}), - (int, "value", {"type": "integer"}), - (float, "value", {"type": "number"}), - (bool, "value", {"type": "boolean"}), - (list, "value", {"items": {}, "type": "array"}), - (dict, "value", {"additionalProperties": True, "type": "object"}), - (Optional[int], "value", {"anyOf": [{"type": "integer"}, {"type": "null"}]}), - (Optional[str], "value", {"anyOf": [{"type": "string"}, {"type": "null"}]}), -] - - -class TestAnnotationOverrides: - """Callback type annotations override component schemas.""" - - @pytest.mark.parametrize( - "ann,prop,expected", - ANNOTATION_CASES, - ids=[ - f"{a.__name__ if hasattr(a, '__name__') else a}-{p}" - for a, p, _ in ANNOTATION_CASES - ], - ) - def test_annotation(self, ann, prop, expected): - app = _app_with_annotated_callback(ann, input_prop=prop) - tool = _user_tool(_tools_list(app)) - assert _schema_for(tool, "val") == expected - - def test_no_annotation_uses_introspection(self): - app = _app_with_annotated_callback(None) - tool = _user_tool(_tools_list(app)) - assert _schema_for(tool, "val") == { - "anyOf": [ - {"type": "boolean"}, - {"const": "disabled", "type": "string"}, - {"const": "DISABLED", "type": "string"}, - {"type": "null"}, - ] - } - - -class TestAnnotationNullability: - """Annotations control nullable vs non-nullable schemas.""" - - def test_str_removes_null(self): - app = Dash(__name__) - app.layout = html.Div([dcc.Dropdown(id="dd"), html.Div(id="out")]) - - @app.callback(Output("out", "children"), Input("dd", "value")) - def update(val: str): - return val - - tool = _user_tool(_tools_list(app)) - assert _schema_for(tool, "val") == {"type": "string"} - - def test_optional_preserves_null(self): - app = Dash(__name__) - app.layout = html.Div([dcc.Dropdown(id="dd"), html.Div(id="out")]) - - @app.callback(Output("out", "children"), Input("dd", "value")) - def update(val: Optional[str]): - return val or "" - - tool = _user_tool(_tools_list(app)) - assert _schema_for(tool, "val") == { - "anyOf": [{"type": "string"}, {"type": "null"}] - } - - def test_optional_param_not_required(self): - app = Dash(__name__) - app.layout = html.Div([dcc.Dropdown(id="dd"), html.Div(id="out")]) - - @app.callback(Output("out", "children"), Input("dd", "value")) - def update(val: Optional[str]): - return val or "" - - tool = _user_tool(_tools_list(app)) - assert "val" not in tool.inputSchema.get("required", []) - - -class TestAnnotationWithState: - """Annotations work for State parameters too.""" - - def test_state_annotation_overrides(self): - app = Dash(__name__) - app.layout = html.Div( - [dcc.Input(id="inp"), dcc.Store(id="store"), html.Div(id="out")] - ) - - @app.callback( - Output("out", "children"), - Input("inp", "value"), - State("store", "data"), - ) - def update(val: str, data: dict): - return str(val) - - tool = _user_tool(_tools_list(app)) - assert _schema_for(tool, "val") == {"type": "string"} - assert _schema_for(tool, "data") == { - "additionalProperties": True, - "type": "object", - } - - def test_partial_annotations(self): - app = Dash(__name__) - app.layout = html.Div( - [dcc.Input(id="inp"), dcc.Store(id="store"), html.Div(id="out")] - ) - - @app.callback( - Output("out", "children"), - Input("inp", "value"), - State("store", "data"), - ) - def update(val: int, data): - return str(val) - - tool = _user_tool(_tools_list(app)) - assert _schema_for(tool, "val") == {"type": "integer"} - assert _schema_for(tool, "data") == { - "anyOf": [ - {"additionalProperties": True, "type": "object"}, - {"items": {}, "type": "array"}, - {"type": "number"}, - {"type": "string"}, - {"type": "boolean"}, - {"type": "null"}, - ] - } diff --git a/tests/unit/mcp/tools/input_schemas/test_schema_component_proptypes.py b/tests/unit/mcp/tools/input_schemas/test_schema_component_proptypes.py deleted file mode 100644 index 10b6ae5543..0000000000 --- a/tests/unit/mcp/tools/input_schemas/test_schema_component_proptypes.py +++ /dev/null @@ -1,15 +0,0 @@ -"""Tests for schema_component_proptypes. - -Only tests our custom logic — pydantic's type-to-schema conversion -is tested by pydantic itself. -""" - -from dash.development.base_component import Component -from dash.mcp.primitives.tools.input_schemas.schema_callback_type_annotations import ( - annotation_to_json_schema, -) - - -class TestComponentTypes: - def test_component_type_maps_to_string(self): - assert annotation_to_json_schema(Component) == {"type": "string"} diff --git a/tests/unit/mcp/tools/test_callback_adapter.py b/tests/unit/mcp/tools/test_callback_adapter.py deleted file mode 100644 index 41d9b18c21..0000000000 --- a/tests/unit/mcp/tools/test_callback_adapter.py +++ /dev/null @@ -1,430 +0,0 @@ -"""Tests for CallbackAdapter.""" - -import pytest -from dash import Dash, Input, Output, State, dcc, html -from dash._get_app import app_context -from mcp.types import Tool - -from dash.mcp.primitives.tools.callback_adapter_collection import ( - CallbackAdapterCollection, -) - - -# --------------------------------------------------------------------------- -# Fixtures -# --------------------------------------------------------------------------- - - -@pytest.fixture -def simple_app(): - app = Dash(__name__) - app.layout = html.Div( - [ - html.Label("Your Name", htmlFor="inp"), - dcc.Input(id="inp", type="text"), - html.Div(id="out"), - ] - ) - - @app.callback(Output("out", "children"), Input("inp", "value")) - def update(val): - """Update output.""" - return val - - app_context.set(app) - app.mcp_callback_map = CallbackAdapterCollection(app) - return app - - -@pytest.fixture -def multi_output_app(): - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Dropdown(id="dd", options=["a", "b"], value="a"), - dcc.Dropdown(id="dd2"), - html.Div(id="out"), - ] - ) - - @app.callback( - Output("dd2", "options"), - Output("out", "children"), - Input("dd", "value"), - ) - def update(val): - return [], val - - app_context.set(app) - app.mcp_callback_map = CallbackAdapterCollection(app) - return app - - -@pytest.fixture -def state_app(): - app = Dash(__name__) - app.layout = html.Div( - [ - html.Button(id="btn"), - dcc.Input(id="inp"), - html.Div(id="out"), - ] - ) - - @app.callback( - Output("out", "children"), - Input("btn", "n_clicks"), - State("inp", "value"), - ) - def update(clicks, val): - return val - - app_context.set(app) - app.mcp_callback_map = CallbackAdapterCollection(app) - return app - - -@pytest.fixture -def typed_app(): - app = Dash(__name__) - app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) - - @app.callback(Output("out", "children"), Input("inp", "value")) - def update(val: str): - return val - - app_context.set(app) - app.mcp_callback_map = CallbackAdapterCollection(app) - return app - - -@pytest.fixture -def duplicate_names_app(): - app = Dash(__name__) - app.layout = html.Div( - [ - html.Div(id="in1"), - html.Div(id="out1"), - html.Div(id="in2"), - html.Div(id="out2"), - ] - ) - - @app.callback(Output("out1", "children"), Input("in1", "children")) - def cb(v): - return v - - @app.callback(Output("out2", "children"), Input("in2", "children")) - def cb(v): # noqa: F811 - return v - - app_context.set(app) - app.mcp_callback_map = CallbackAdapterCollection(app) - return app - - -# --------------------------------------------------------------------------- -# Tests -# --------------------------------------------------------------------------- - - -class TestFromApp: - def test_returns_list(self, simple_app): - assert len(app_context.get().mcp_callback_map) == 1 - - def test_excludes_clientside(self): - app = Dash(__name__) - app.layout = html.Div( - [ - html.Button(id="btn"), - html.Div(id="cs-out"), - html.Div(id="srv-out"), - ] - ) - app.clientside_callback( - "function(n) { return n; }", - Output("cs-out", "children"), - Input("btn", "n_clicks"), - ) - - @app.callback(Output("srv-out", "children"), Input("btn", "n_clicks")) - def server_cb(n): - return str(n) - - app_context.set(app) - app.mcp_callback_map = CallbackAdapterCollection(app) - - names = [a.tool_name for a in app.mcp_callback_map] - assert names == ["server_cb"] - - def test_excludes_mcp_disabled(self): - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Input(id="inp"), - html.Div(id="out1"), - html.Div(id="out2"), - ] - ) - - @app.callback(Output("out1", "children"), Input("inp", "value")) - def visible(val): - return val - - @app.callback( - Output("out2", "children"), Input("inp", "value"), mcp_enabled=False - ) - def hidden(val): - return val - - app_context.set(app) - app.mcp_callback_map = CallbackAdapterCollection(app) - names = [a.tool_name for a in app.mcp_callback_map] - assert "visible" in names - assert "hidden" not in names - - -class TestToolName: - def test_uses_func_name(self, simple_app): - assert app_context.get().mcp_callback_map[0].tool_name == "update" - - def test_duplicates_get_unique_names(self, duplicate_names_app): - names = [a.tool_name for a in app_context.get().mcp_callback_map] - assert len(names) == 2 - assert names[0] != names[1] - - -class TestTool: - def test_returns_tool_instance(self, simple_app): - with simple_app.server.test_request_context(): - tool = app_context.get().mcp_callback_map[0].as_mcp_tool - assert isinstance(tool, Tool) - assert tool.name == "update" - - def test_docstring_hidden_by_default(self): - """Callback docstrings are not exposed to MCP by default.""" - app = Dash(__name__) - app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) - - @app.callback(Output("out", "children"), Input("inp", "value")) - def update(val): - """sensitive callback docstring text that must not leak to LLMs""" - return val - - app_context.set(app) - app.mcp_callback_map = CallbackAdapterCollection(app) - - with app.server.test_request_context(): - tool = app.mcp_callback_map[0].as_mcp_tool - assert ( - "sensitive callback docstring text that must not leak to LLMs" - not in tool.description - ) - - def test_docstring_exposed_when_opted_in_per_callback(self): - app = Dash(__name__) - app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) - - @app.callback( - Output("out", "children"), - Input("inp", "value"), - mcp_expose_docstring=True, - ) - def update(val): - """intentionally-exposed callback docstring text for the LLM""" - return val - - app_context.set(app) - app.mcp_callback_map = CallbackAdapterCollection(app) - - with app.server.test_request_context(): - tool = app.mcp_callback_map[0].as_mcp_tool - assert ( - "intentionally-exposed callback docstring text for the LLM" - in tool.description - ) - - def test_description_includes_output_target(self, simple_app): - with simple_app.server.test_request_context(): - tool = app_context.get().mcp_callback_map[0].as_mcp_tool - assert "out.children" in tool.description - - def test_param_name_from_function_signature(self, simple_app): - with simple_app.server.test_request_context(): - tool = app_context.get().mcp_callback_map[0].as_mcp_tool - assert "val" in tool.inputSchema["properties"] - - def test_param_has_label_description(self, simple_app): - with simple_app.server.test_request_context(): - tool = app_context.get().mcp_callback_map[0].as_mcp_tool - desc = tool.inputSchema["properties"]["val"].get("description", "") - assert "Your Name" in desc - - def test_state_params_included(self, state_app): - with state_app.server.test_request_context(): - tool = app_context.get().mcp_callback_map[0].as_mcp_tool - props = tool.inputSchema["properties"] - assert set(props.keys()) == {"clicks", "val"} - - def test_multi_output_description(self, multi_output_app): - with multi_output_app.server.test_request_context(): - tool = app_context.get().mcp_callback_map[0].as_mcp_tool - assert "dd2.options" in tool.description - assert "out.children" in tool.description - - def test_typed_annotation_narrows_schema(self, typed_app): - with typed_app.server.test_request_context(): - tool = app_context.get().mcp_callback_map[0].as_mcp_tool - assert tool.inputSchema["properties"]["val"]["type"] == "string" - - -class TestGetInitialValue: - def test_returns_layout_value(self, simple_app): - callback_map = app_context.get().mcp_callback_map - # Input with no value set — returns None (layout default for dcc.Input) - assert callback_map.get_initial_value("inp.value") is None - - def test_returns_set_value(self): - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Dropdown(id="dd", options=["a", "b"], value="a"), - html.Div(id="out"), - ] - ) - - @app.callback(Output("out", "children"), Input("dd", "value")) - def update(selected): - return selected - - app_context.set(app) - app.mcp_callback_map = CallbackAdapterCollection(app) - assert app.mcp_callback_map.get_initial_value("dd.value") == "a" - - def test_initial_callback_makes_param_required(self): - """A param with None in layout but set by an initial callback is required.""" - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Dropdown( - id="country", options=["France", "Germany"], value="France" - ), - dcc.Dropdown(id="city"), # value=None in layout - html.Div(id="out"), - ] - ) - - @app.callback( - Output("city", "options"), - Output("city", "value"), - Input("country", "value"), - ) - def update_cities(country): - return [{"label": "Paris", "value": "Paris"}], "Paris" - - @app.callback(Output("out", "children"), Input("city", "value")) - def show_city(city): - return f"Selected: {city}" - - app_context.set(app) - app.mcp_callback_map = CallbackAdapterCollection(app) - - # city.value is None in layout but "Paris" after initial callback - with app.server.test_request_context(): - show_city_cb = app.mcp_callback_map.find_by_tool_name("show_city") - city_param = show_city_cb.inputs[0] - assert city_param["name"] == "city" - assert city_param["required"] is True # not optional despite None in layout - - -class TestIsValid: - def test_valid_when_inputs_in_layout(self, simple_app): - assert app_context.get().mcp_callback_map[0].is_valid - - def test_invalid_when_input_not_in_layout(self): - app = Dash(__name__) - app.layout = html.Div([html.Div(id="out")]) - - @app.callback(Output("out", "children"), Input("nonexistent", "value")) - def update(val): - return val - - app_context.set(app) - app.mcp_callback_map = CallbackAdapterCollection(app) - assert not app.mcp_callback_map[0].is_valid - - def test_pattern_matching_ids_always_valid(self): - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Input(id={"type": "field", "index": 0}, value="a"), - html.Div(id="out"), - ] - ) - - @app.callback( - Output("out", "children"), - Input({"type": "field", "index": 0}, "value"), - ) - def update(val): - return val - - app_context.set(app) - app.mcp_callback_map = CallbackAdapterCollection(app) - assert app.mcp_callback_map[0].is_valid - - -class TestNoInfiniteLoop: - @pytest.mark.timeout(5) - def test_initial_output_does_not_loop(self): - """Building a tool must not trigger infinite re-entry in _initial_output.""" - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Slider(id="sl", min=0, max=10, value=5), - html.Div(id="out"), - ] - ) - - @app.callback(Output("out", "children"), Input("sl", "value")) - def show(value): - return f"Value: {value}" - - app_context.set(app) - app.mcp_callback_map = CallbackAdapterCollection(app) - - with app.server.test_request_context(): - tool = app.mcp_callback_map[0].as_mcp_tool - assert tool.name == "show" - - @pytest.mark.timeout(5) - def test_chained_callbacks_do_not_loop(self): - """Chained callbacks with initial value resolution must not loop.""" - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Slider(id="sl", min=0, max=10, value=5), - dcc.Slider(id="sl2", min=0, max=10), - html.Div(id="out"), - ] - ) - - @app.callback(Output("sl2", "value"), Input("sl", "value")) - def sync(v): - return v - - @app.callback( - Output("out", "children"), - Input("sl", "value"), - Input("sl2", "value"), - ) - def show(v1, v2): - return f"{v1} + {v2}" - - app_context.set(app) - app.mcp_callback_map = CallbackAdapterCollection(app) - - with app.server.test_request_context(): - for cb in app.mcp_callback_map: - tool = cb.as_mcp_tool - assert tool.name is not None diff --git a/tests/unit/mcp/tools/test_mcp_callback_adapter.py b/tests/unit/mcp/tools/test_mcp_callback_adapter.py new file mode 100644 index 0000000000..82dfa0956b --- /dev/null +++ b/tests/unit/mcp/tools/test_mcp_callback_adapter.py @@ -0,0 +1,182 @@ +"""CallbackAdapter behavior: initial value resolution, validation, loop prevention.""" + +import pytest +from dash import Dash, Input, Output, dcc, html +from dash._get_app import app_context + +from dash.mcp.primitives.tools.callback_adapter_collection import ( + CallbackAdapterCollection, +) + + +@pytest.fixture +def simple_app(): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Label("Your Name", htmlFor="inp"), + dcc.Input(id="inp", type="text"), + html.Div(id="out"), + ] + ) + + @app.callback(Output("out", "children"), Input("inp", "value")) + def update(val): + """Update output.""" + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + return app + + +def test_mcpc001_returns_layout_value(simple_app): + callback_map = app_context.get().mcp_callback_map + # Input with no value set — returns None (layout default for dcc.Input) + assert callback_map.get_initial_value("inp.value") is None + + +def test_mcpc002_returns_set_value(): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="dd", options=["a", "b"], value="a"), + html.Div(id="out"), + ] + ) + + @app.callback(Output("out", "children"), Input("dd", "value")) + def update(selected): + return selected + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + assert app.mcp_callback_map.get_initial_value("dd.value") == "a" + + +def test_mcpc003_initial_callback_makes_param_required(): + """A param with None in layout but set by an initial callback is required.""" + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="country", options=["France", "Germany"], value="France"), + dcc.Dropdown(id="city"), # value=None in layout + html.Div(id="out"), + ] + ) + + @app.callback( + Output("city", "options"), + Output("city", "value"), + Input("country", "value"), + ) + def update_cities(country): + return [{"label": "Paris", "value": "Paris"}], "Paris" + + @app.callback(Output("out", "children"), Input("city", "value")) + def show_city(city): + return f"Selected: {city}" + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + + # city.value is None in layout but "Paris" after initial callback + with app.server.test_request_context(): + show_city_cb = app.mcp_callback_map.find_by_tool_name("show_city") + city_param = show_city_cb.inputs[0] + assert city_param["name"] == "city" + assert city_param["required"] is True # not optional despite None in layout + + +def test_mcpc004_valid_when_inputs_in_layout(simple_app): + assert app_context.get().mcp_callback_map[0].is_valid + + +def test_mcpc005_invalid_when_input_not_in_layout(): + app = Dash(__name__) + app.layout = html.Div([html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("nonexistent", "value")) + def update(val): + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + assert not app.mcp_callback_map[0].is_valid + + +def test_mcpc006_pattern_matching_ids_always_valid(): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id={"type": "field", "index": 0}, value="a"), + html.Div(id="out"), + ] + ) + + @app.callback( + Output("out", "children"), + Input({"type": "field", "index": 0}, "value"), + ) + def update(val): + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + assert app.mcp_callback_map[0].is_valid + + +@pytest.mark.timeout(5) +def test_mcpc007_initial_output_does_not_loop(): + """Building a tool must not trigger infinite re-entry in _initial_output.""" + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Slider(id="sl", min=0, max=10, value=5), + html.Div(id="out"), + ] + ) + + @app.callback(Output("out", "children"), Input("sl", "value")) + def show(value): + return f"Value: {value}" + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + + with app.server.test_request_context(): + tool = app.mcp_callback_map[0].as_mcp_tool + assert tool.name == "show" + + +@pytest.mark.timeout(5) +def test_mcpc008_chained_callbacks_do_not_loop(): + """Chained callbacks with initial value resolution must not loop.""" + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Slider(id="sl", min=0, max=10, value=5), + dcc.Slider(id="sl2", min=0, max=10), + html.Div(id="out"), + ] + ) + + @app.callback(Output("sl2", "value"), Input("sl", "value")) + def sync(v): + return v + + @app.callback( + Output("out", "children"), + Input("sl", "value"), + Input("sl2", "value"), + ) + def show(v1, v2): + return f"{v1} + {v2}" + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + + with app.server.test_request_context(): + for cb in app.mcp_callback_map: + tool = cb.as_mcp_tool + assert tool.name is not None diff --git a/tests/unit/mcp/tools/test_mcp_input_descriptions.py b/tests/unit/mcp/tools/test_mcp_input_descriptions.py new file mode 100644 index 0000000000..55ac4df49a --- /dev/null +++ b/tests/unit/mcp/tools/test_mcp_input_descriptions.py @@ -0,0 +1,445 @@ +"""Input descriptions — human-readable per-property descriptions for MCP tool inputs. + +Covers: +- Labels (htmlFor, containment, text extraction) +- Component-specific (date pickers, sliders) +- Options (Dropdown, RadioItems, Checklist) +- Generic props (placeholder, default value, min/max/step) +- Chained callbacks (dynamic prop/options detection) +- Combinations (label + component-specific) +""" + +import pytest + +from dash import Dash, Input, Output, dcc, html + +from tests.unit.mcp.conftest import ( + _app_with_callback, + _desc_for, + _tools_list, + _user_tool, +) + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def _app_with_layout(layout, *inputs): + app = Dash(__name__) + app.layout = layout + + @app.callback( + Output("out", "children"), + [Input(cid, prop) for cid, prop in inputs], + ) + def update(*args): + return str(args) + + return app + + +def _tool_for(component, input_prop="value"): + app = _app_with_callback(component, input_prop=input_prop) + return _user_tool(_tools_list(app)) + + +# --------------------------------------------------------------------------- +# Labels (htmlFor, containment, text extraction) +# --------------------------------------------------------------------------- + + +def test_mcpd001_label_html_for(): + app = _app_with_layout( + html.Div( + [ + html.Label("Your Name", htmlFor="inp"), + dcc.Input(id="inp"), + html.Div(id="out"), + ] + ), + ("inp", "value"), + ) + tool = _user_tool(_tools_list(app)) + assert "Your Name" in _desc_for(tool) + + +def test_mcpd002_label_html_for_not_adjacent(): + app = _app_with_layout( + html.Div( + [ + html.Div(html.Label("Remote Label", htmlFor="inp")), + dcc.Input(id="inp"), + html.Div(id="out"), + ] + ), + ("inp", "value"), + ) + tool = _user_tool(_tools_list(app)) + assert "Remote Label" in _desc_for(tool) + + +def test_mcpd003_label_containment(): + app = _app_with_layout( + html.Div( + [ + html.Label( + [ + "Pick a city", + dcc.Dropdown(id="city_dd", options=["NYC", "LA"]), + ] + ), + html.Div(id="out"), + ] + ), + ("city_dd", "value"), + ) + tool = _user_tool(_tools_list(app)) + assert "Pick a city" in _desc_for(tool) + + +def test_mcpd004_label_deeply_nested_containment(): + app = _app_with_layout( + html.Div( + [ + html.Label( + [ + html.Span("Nested Label"), + html.Div(dcc.Input(id="nested_inp")), + ] + ), + html.Div(id="out"), + ] + ), + ("nested_inp", "value"), + ) + tool = _user_tool(_tools_list(app)) + assert "Nested Label" in _desc_for(tool) + + +def test_mcpd005_label_both_htmlfor_and_containment_captured(): + app = _app_with_layout( + html.Div( + [ + html.Label(["Containment Label", dcc.Input(id="inp")]), + html.Label("HtmlFor Label", htmlFor="inp"), + html.Div(id="out"), + ] + ), + ("inp", "value"), + ) + tool = _user_tool(_tools_list(app)) + desc = _desc_for(tool) + assert "HtmlFor Label" in desc + assert "Containment Label" in desc + + +def test_mcpd006_label_deep_text_extraction(): + app = _app_with_layout( + html.Div( + [ + html.Label( + html.Div(html.Span(html.B("Deep Text"))), + htmlFor="inp", + ), + dcc.Input(id="inp"), + html.Div(id="out"), + ] + ), + ("inp", "value"), + ) + tool = _user_tool(_tools_list(app)) + assert "Deep Text" in _desc_for(tool) + + +def test_mcpd007_label_multiple_text_nodes(): + app = _app_with_layout( + html.Div( + [ + html.Label( + [html.B("First"), " ", html.I("Second")], + htmlFor="inp", + ), + dcc.Input(id="inp"), + html.Div(id="out"), + ] + ), + ("inp", "value"), + ) + tool = _user_tool(_tools_list(app)) + desc = _desc_for(tool) + assert "Labeled with: First Second" in desc + + +def test_mcpd008_label_unrelated_excluded(): + app = _app_with_layout( + html.Div( + [ + html.Label("Other Field", htmlFor="other"), + dcc.Input(id="other"), + dcc.Input(id="target"), + html.Div(id="out"), + ] + ), + ("target", "value"), + ) + tool = _user_tool(_tools_list(app)) + desc = _desc_for(tool) + assert "Other Field" not in (desc or "") + + +# --------------------------------------------------------------------------- +# Component-specific: date pickers +# --------------------------------------------------------------------------- + + +def test_mcpd009_date_picker_single_full_range(): + dp = dcc.DatePickerSingle( + id="dp", + min_date_allowed="2020-01-01", + max_date_allowed="2025-12-31", + ) + desc = _desc_for(_tool_for(dp, "date"), "val") + assert "2020-01-01" in desc + assert "2025-12-31" in desc + + +def test_mcpd010_date_picker_single_min_only(): + dp = dcc.DatePickerSingle(id="dp", min_date_allowed="2020-01-01") + desc = _desc_for(_tool_for(dp, "date"), "val") + assert "min_date_allowed: '2020-01-01'" in desc + + +def test_mcpd011_date_picker_single_default_date(): + dp = dcc.DatePickerSingle(id="dp", date="2024-06-15") + desc = _desc_for(_tool_for(dp, "date"), "val") + assert "date: '2024-06-15'" in desc + + +def test_mcpd012_date_picker_range_with_constraints(): + dpr = dcc.DatePickerRange( + id="dpr", + min_date_allowed="2020-01-01", + max_date_allowed="2025-12-31", + ) + desc = _desc_for(_tool_for(dpr, "start_date"), "val") + assert "2020-01-01" in desc + + +# --------------------------------------------------------------------------- +# Component-specific: sliders +# --------------------------------------------------------------------------- + + +def test_mcpd013_slider_min_max(): + sl = dcc.Slider(id="sl", min=0, max=100) + desc = _desc_for(_tool_for(sl), "val") + assert "min: 0" in desc + assert "max: 100" in desc + + +def test_mcpd014_slider_step(): + sl = dcc.Slider(id="sl", min=0, max=100, step=5) + desc = _desc_for(_tool_for(sl), "val") + assert "step: 5" in desc + + +def test_mcpd015_slider_default_value(): + sl = dcc.Slider(id="sl", min=0, max=100, value=50) + desc = _desc_for(_tool_for(sl), "val") + assert "value: 50" in desc + + +def test_mcpd016_slider_marks(): + sl = dcc.Slider(id="sl", min=0, max=100, marks={0: "Low", 100: "High"}) + desc = _desc_for(_tool_for(sl), "val") + assert "marks: {0: 'Low', 100: 'High'}" in desc + + +def test_mcpd017_range_slider_min_max(): + rs = dcc.RangeSlider(id="rs", min=0, max=100) + desc = _desc_for(_tool_for(rs), "val") + assert "min: 0" in desc + assert "max: 100" in desc + + +# --------------------------------------------------------------------------- +# Options (parametrized across Dropdown, RadioItems, Checklist) +# --------------------------------------------------------------------------- + + +_OPTIONS_COMPONENTS = [ + ("Dropdown", lambda **kw: dcc.Dropdown(id="comp", **kw), "comp"), + ("RadioItems", lambda **kw: dcc.RadioItems(id="comp", **kw), "comp"), + ("Checklist", lambda **kw: dcc.Checklist(id="comp", **kw), "comp"), +] + + +@pytest.mark.parametrize( + "name,factory,cid", _OPTIONS_COMPONENTS, ids=[c[0] for c in _OPTIONS_COMPONENTS] +) +def test_mcpd018_options_shown(name, factory, cid): + comp = factory(options=["X", "Y", "Z"]) + desc = _desc_for(_tool_for(comp), "val") + assert "options: ['X', 'Y', 'Z']" in desc + + +@pytest.mark.parametrize( + "name,factory,cid", _OPTIONS_COMPONENTS, ids=[c[0] for c in _OPTIONS_COMPONENTS] +) +def test_mcpd019_default_shown(name, factory, cid): + value = ["a"] if name == "Checklist" else "a" + comp = factory(options=["a", "b"], value=value) + desc = _desc_for(_tool_for(comp), "val") + assert f"value: {value!r}" in desc + + +def test_mcpd020_dropdown_dict_options(): + dd = dcc.Dropdown( + id="dd", + options=[ + {"label": "New York", "value": "NYC"}, + ], + ) + assert "NYC" in _desc_for(_tool_for(dd), "val") + + +def test_mcpd021_store_storage_type_template(): + store = dcc.Store(id="store", storage_type="session") + app = _app_with_callback(store, input_prop="data") + tool = _user_tool(_tools_list(app)) + desc = _desc_for(tool, "val") + assert ( + "storage_type: 'session'. Describes how to store the value client-side" in desc + ) + + +def test_mcpd022_many_options_truncated(): + dd = dcc.Dropdown(id="big", options=[str(i) for i in range(50)], value="0") + app = _app_with_callback(dd) + tool = _user_tool(_tools_list(app)) + desc = _desc_for(tool, "val") + assert "options:" in desc + assert "Use get_dash_component('big', 'options') for the full value" in desc + + +# --------------------------------------------------------------------------- +# Generic props (placeholder, default, numeric min/max/step) +# --------------------------------------------------------------------------- + + +def test_mcpd023_generic_placeholder(): + inp = dcc.Input(id="inp", placeholder="Enter your name") + assert "placeholder: 'Enter your name'" in _desc_for(_tool_for(inp), "val") + + +def test_mcpd024_generic_numeric_min_max(): + inp = dcc.Input(id="inp", type="number", min=0, max=999) + desc = _desc_for(_tool_for(inp), "val") + assert "min: 0" in desc + assert "max: 999" in desc + + +def test_mcpd025_generic_step(): + inp = dcc.Input(id="inp", type="number", min=0, max=100, step=0.1) + assert "step: 0.1" in _desc_for(_tool_for(inp), "val") + + +def test_mcpd026_generic_default_value(): + inp = dcc.Input(id="inp", value="hello") + desc = _desc_for(_tool_for(inp), "val") + assert "value: 'hello'" in desc + + +def test_mcpd027_generic_non_text_type(): + inp = dcc.Input(id="inp", type="email") + assert "type: 'email'" in _desc_for(_tool_for(inp), "val") + + +def test_mcpd028_generic_store_default(): + store = dcc.Store(id="store", data={"key": "value"}) + app = _app_with_callback(store, input_prop="data") + tool = _user_tool(_tools_list(app)) + assert "data: {'key': 'value'}" in _desc_for(tool, "val") + + +# --------------------------------------------------------------------------- +# Chained callbacks — descriptions reflect upstream dependencies +# --------------------------------------------------------------------------- + + +def test_mcpd029_chained_options_set_by_upstream(): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="country", options=["US", "CA"], value="US"), + dcc.Dropdown(id="city", options=[], value=None), + html.Div(id="result"), + ] + ) + + @app.callback(Output("city", "options"), Input("country", "value")) + def update_cities(country): + return ["NYC", "LA"] if country == "US" else ["Toronto"] + + @app.callback(Output("result", "children"), Input("city", "value")) + def show_city(city): + return city + + tools = _tools_list(app) + tool = next(t for t in tools if "show_city" in t.name) + desc = _desc_for(tool, "city") + assert "can be updated by tool: `update_cities`" in desc + assert "options:" in desc + + +def test_mcpd030_chained_value_set_by_upstream(): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="source", value=""), + html.Div(id="derived", children=""), + html.Div(id="result"), + ] + ) + + @app.callback(Output("derived", "children"), Input("source", "value")) + def compute_derived(val): + return f"derived: {val}" + + @app.callback(Output("result", "children"), Input("derived", "children")) + def use_derived(val): + return val + + tools = _tools_list(app) + tool = next(t for t in tools if "use_derived" in t.name) + desc = _desc_for(tool, "val") + assert "can be updated by tool: `compute_derived`" in desc + + +# --------------------------------------------------------------------------- +# Combinations — label + component-specific +# --------------------------------------------------------------------------- + + +def test_mcpd031_combination_label_with_date_picker(): + dp = dcc.DatePickerSingle( + id="dp", + min_date_allowed="2020-01-01", + max_date_allowed="2025-12-31", + ) + app = _app_with_layout( + html.Div( + [ + html.Label("Departure Date", htmlFor="dp"), + dp, + html.Div(id="out"), + ] + ), + ("dp", "date"), + ) + tool = _user_tool(_tools_list(app)) + desc = _desc_for(tool) + assert "Departure Date" in desc + assert "2020-01-01" in desc diff --git a/tests/unit/mcp/tools/test_mcp_input_schemas.py b/tests/unit/mcp/tools/test_mcp_input_schemas.py new file mode 100644 index 0000000000..d0b5e86923 --- /dev/null +++ b/tests/unit/mcp/tools/test_mcp_input_schemas.py @@ -0,0 +1,270 @@ +"""Input schema generation — JSON Schema for callback input parameters. + +Covers: +- Static overrides (DatePicker, Graph, Interval, Slider) +- Component introspection (representative per-type samples) +- Callback annotation overrides (highest priority) +- Required / nullable behavior +- Component type → JSON schema mapping +""" + +import pytest +from typing import Optional + +from dash import Dash, Input, Output, State, dcc, html +from dash.development.base_component import Component +from dash.mcp.primitives.tools.input_schemas.schema_callback_type_annotations import ( + annotation_to_json_schema, +) + +from tests.unit.mcp.conftest import ( + _app_with_callback, + _schema_for, + _tools_list, + _user_tool, +) + + +# --------------------------------------------------------------------------- +# Schema building blocks (JSON Schema primitives) +# --------------------------------------------------------------------------- + +STRING = {"type": "string"} +NUMBER = {"type": "number"} +INTEGER = {"type": "integer"} +BOOLEAN = {"type": "boolean"} +NULL = {"type": "null"} +OBJECT = {"additionalProperties": True, "type": "object"} + + +def nullable(*schemas): + """``{anyOf: [*schemas, {type: null}]}`` — a common nullable-type shape.""" + return {"anyOf": [*schemas, NULL]} + + +def array_of(*item_schemas): + """Array of a single schema, or a union when multiple are passed.""" + items = item_schemas[0] if len(item_schemas) == 1 else {"anyOf": list(item_schemas)} + return {"items": items, "type": "array"} + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def _get_schema(component_type, prop): + _factories = { + "DatePickerSingle": lambda: dcc.DatePickerSingle(id="dp"), + "DatePickerRange": lambda: dcc.DatePickerRange(id="dpr"), + "Graph": lambda: dcc.Graph(id="graph"), + "Interval": lambda: dcc.Interval(id="intv"), + "Input": lambda: dcc.Input(id="inp"), + "Textarea": lambda: dcc.Textarea(id="ta"), + "Tabs": lambda: dcc.Tabs(id="tabs"), + "Dropdown": lambda: dcc.Dropdown(id="dd"), + "RadioItems": lambda: dcc.RadioItems(id="ri"), + "Checklist": lambda: dcc.Checklist(id="cl"), + "Store": lambda: dcc.Store(id="store"), + "Upload": lambda: dcc.Upload(id="upload"), + "Slider": lambda: dcc.Slider(id="sl"), + "RangeSlider": lambda: dcc.RangeSlider(id="rs"), + } + app = _app_with_callback(_factories[component_type](), input_prop=prop) + tool = _user_tool(_tools_list(app)) + return _schema_for(tool) + + +def _app_with_annotated_callback(annotation_type, input_prop="disabled"): + app = Dash(__name__) + app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) + + if annotation_type is None: + + @app.callback(Output("out", "children"), Input("inp", input_prop)) + def update(val): + return str(val) + + else: + + @app.callback(Output("out", "children"), Input("inp", input_prop)) + def update(val: annotation_type): + return str(val) + + return app + + +# --------------------------------------------------------------------------- +# Test cases +# --------------------------------------------------------------------------- + +# (component_type, prop, expected_schema) — representative per-type samples +INTROSPECTION_CASES = [ + ("Input", "value", nullable(STRING, NUMBER)), + ( + "Input", + "disabled", + nullable( + BOOLEAN, + {"const": "disabled", "type": "string"}, + {"const": "DISABLED", "type": "string"}, + ), + ), + ("Input", "n_submit", nullable(NUMBER)), + ( + "Dropdown", + "value", + nullable(STRING, NUMBER, BOOLEAN, array_of(STRING, NUMBER, BOOLEAN)), + ), + ("Dropdown", "options", nullable({})), + ("Checklist", "value", nullable(array_of(STRING, NUMBER, BOOLEAN))), + ("Store", "data", nullable(OBJECT, array_of({}), NUMBER, STRING, BOOLEAN)), + ("Upload", "contents", nullable(STRING, array_of(STRING))), + ("RangeSlider", "value", nullable(array_of(NUMBER))), + ("Tabs", "value", nullable(STRING)), +] + +# (annotation, prop, expected_schema) — callback annotations override introspection +ANNOTATION_CASES = [ + (str, "disabled", STRING), + (int, "value", INTEGER), + (float, "value", NUMBER), + (bool, "value", BOOLEAN), + (list, "value", array_of({})), + (dict, "value", OBJECT), + (Optional[int], "value", nullable(INTEGER)), + (Optional[str], "value", nullable(STRING)), +] + + +# --------------------------------------------------------------------------- +# Tests +# --------------------------------------------------------------------------- + + +def test_mcpi001_override_beats_introspection(): + """Static override wins over component introspection.""" + schema = _get_schema("DatePickerSingle", "date") + # Introspection would return None for this prop; + # override provides a date format with pattern + assert schema["type"] == "string" + assert schema["format"] == "date" + assert "pattern" in schema + + +@pytest.mark.parametrize( + "component_type,prop,expected", + INTROSPECTION_CASES, + ids=[f"{c}.{p}" for c, p, _ in INTROSPECTION_CASES], +) +def test_mcpi002_introspected_schema(component_type, prop, expected): + """Representative introspection tests across component types.""" + assert _get_schema(component_type, prop) == expected + + +@pytest.mark.parametrize( + "ann,prop,expected", + ANNOTATION_CASES, + ids=[ + f"{a.__name__ if hasattr(a, '__name__') else a}-{p}" + for a, p, _ in ANNOTATION_CASES + ], +) +def test_mcpi003_annotation(ann, prop, expected): + """Callback type annotations override component schemas.""" + app = _app_with_annotated_callback(ann, input_prop=prop) + tool = _user_tool(_tools_list(app)) + assert _schema_for(tool, "val") == expected + + +def test_mcpi004_no_annotation_uses_introspection(): + app = _app_with_annotated_callback(None) + tool = _user_tool(_tools_list(app)) + assert _schema_for(tool, "val") == nullable( + BOOLEAN, + {"const": "disabled", "type": "string"}, + {"const": "DISABLED", "type": "string"}, + ) + + +def test_mcpi005_str_removes_null(): + app = Dash(__name__) + app.layout = html.Div([dcc.Dropdown(id="dd"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("dd", "value")) + def update(val: str): + return val + + tool = _user_tool(_tools_list(app)) + assert _schema_for(tool, "val") == STRING + + +def test_mcpi006_optional_preserves_null(): + app = Dash(__name__) + app.layout = html.Div([dcc.Dropdown(id="dd"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("dd", "value")) + def update(val: Optional[str]): + return val or "" + + tool = _user_tool(_tools_list(app)) + assert _schema_for(tool, "val") == nullable(STRING) + + +def test_mcpi007_optional_param_not_required(): + app = Dash(__name__) + app.layout = html.Div([dcc.Dropdown(id="dd"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("dd", "value")) + def update(val: Optional[str]): + return val or "" + + tool = _user_tool(_tools_list(app)) + assert "val" not in tool.inputSchema.get("required", []) + + +def test_mcpi008_state_annotation_overrides(): + """Annotations work for State parameters too.""" + app = Dash(__name__) + app.layout = html.Div( + [dcc.Input(id="inp"), dcc.Store(id="store"), html.Div(id="out")] + ) + + @app.callback( + Output("out", "children"), + Input("inp", "value"), + State("store", "data"), + ) + def update(val: str, data: dict): + return str(val) + + tool = _user_tool(_tools_list(app)) + assert _schema_for(tool, "val") == STRING + assert _schema_for(tool, "data") == OBJECT + + +def test_mcpi009_partial_annotations(): + """Some annotated, some not — introspection fills in the rest.""" + app = Dash(__name__) + app.layout = html.Div( + [dcc.Input(id="inp"), dcc.Store(id="store"), html.Div(id="out")] + ) + + @app.callback( + Output("out", "children"), + Input("inp", "value"), + State("store", "data"), + ) + def update(val: int, data): + return str(val) + + tool = _user_tool(_tools_list(app)) + assert _schema_for(tool, "val") == INTEGER + assert _schema_for(tool, "data") == nullable( + OBJECT, array_of({}), NUMBER, STRING, BOOLEAN + ) + + +def test_mcpi010_component_type_maps_to_string(): + """Component annotation type maps to string schema.""" + assert annotation_to_json_schema(Component) == STRING diff --git a/tests/unit/mcp/tools/test_mcp_tools.py b/tests/unit/mcp/tools/test_mcp_tools.py new file mode 100644 index 0000000000..cacaf13b14 --- /dev/null +++ b/tests/unit/mcp/tools/test_mcp_tools.py @@ -0,0 +1,358 @@ +"""Tool construction: how Dash callbacks become MCP Tool objects. + +Covers the CallbackAdapter → Tool pipeline: list building (from_app), +tool name generation, and the resulting Tool object's shape (description, +input schema, param metadata). + +Reference: https://modelcontextprotocol.io/specification/2025-11-25/server/tools +""" + +import pytest +from dash import Dash, Input, Output, State, dcc, html +from dash._get_app import app_context +from dash.development.base_component import Component +from dash.types import CallbackExecutionResponse +from mcp.types import Tool +from pydantic import TypeAdapter + +from dash.mcp.primitives.tools.callback_adapter_collection import ( + CallbackAdapterCollection, +) + +from tests.unit.mcp.conftest import ( + _make_app, + _tools_list, + _user_tool, +) + + +# --------------------------------------------------------------------------- +# Fixtures +# --------------------------------------------------------------------------- + + +@pytest.fixture +def simple_app(): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Label("Your Name", htmlFor="inp"), + dcc.Input(id="inp", type="text"), + html.Div(id="out"), + ] + ) + + @app.callback(Output("out", "children"), Input("inp", "value")) + def update(val): + """Update output.""" + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + return app + + +@pytest.fixture +def multi_output_app(): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="dd", options=["a", "b"], value="a"), + dcc.Dropdown(id="dd2"), + html.Div(id="out"), + ] + ) + + @app.callback( + Output("dd2", "options"), + Output("out", "children"), + Input("dd", "value"), + ) + def update(val): + return [], val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + return app + + +@pytest.fixture +def state_app(): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Button(id="btn"), + dcc.Input(id="inp"), + html.Div(id="out"), + ] + ) + + @app.callback( + Output("out", "children"), + Input("btn", "n_clicks"), + State("inp", "value"), + ) + def update(clicks, val): + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + return app + + +@pytest.fixture +def typed_app(): + app = Dash(__name__) + app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("inp", "value")) + def update(val: str): + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + return app + + +@pytest.fixture +def duplicate_names_app(): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id="in1"), + html.Div(id="out1"), + html.Div(id="in2"), + html.Div(id="out2"), + ] + ) + + @app.callback(Output("out1", "children"), Input("in1", "children")) + def cb(v): + return v + + @app.callback(Output("out2", "children"), Input("in2", "children")) + def cb(v): # noqa: F811 + return v + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + return app + + +# --------------------------------------------------------------------------- +# Tests — building the callback list from an app +# --------------------------------------------------------------------------- + + +def test_mcpt001_returns_list(simple_app): + assert len(app_context.get().mcp_callback_map) == 1 + + +def test_mcpt002_excludes_clientside(): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Button(id="btn"), + html.Div(id="cs-out"), + html.Div(id="srv-out"), + ] + ) + app.clientside_callback( + "function(n) { return n; }", + Output("cs-out", "children"), + Input("btn", "n_clicks"), + ) + + @app.callback(Output("srv-out", "children"), Input("btn", "n_clicks")) + def server_cb(n): + return str(n) + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + + names = [a.tool_name for a in app.mcp_callback_map] + assert names == ["server_cb"] + + +def test_mcpt003_excludes_mcp_disabled(): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="inp"), + html.Div(id="out1"), + html.Div(id="out2"), + ] + ) + + @app.callback(Output("out1", "children"), Input("inp", "value")) + def visible(val): + return val + + @app.callback(Output("out2", "children"), Input("inp", "value"), mcp_enabled=False) + def hidden(val): + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + names = [a.tool_name for a in app.mcp_callback_map] + assert "visible" in names + assert "hidden" not in names + + +# --------------------------------------------------------------------------- +# Tests — tool name generation +# --------------------------------------------------------------------------- + + +def test_mcpt004_uses_func_name(simple_app): + assert app_context.get().mcp_callback_map[0].tool_name == "update" + + +def test_mcpt005_duplicates_get_unique_names(duplicate_names_app): + names = [a.tool_name for a in app_context.get().mcp_callback_map] + assert len(names) == 2 + assert names[0] != names[1] + + +# --------------------------------------------------------------------------- +# Tests — Tool object shape (description, input schema, params) +# --------------------------------------------------------------------------- + + +def test_mcpt006_returns_tool_instance(simple_app): + with simple_app.server.test_request_context(): + tool = app_context.get().mcp_callback_map[0].as_mcp_tool + assert isinstance(tool, Tool) + assert tool.name == "update" + + +def test_mcpt007_docstring_hidden_by_default(): + """Callback docstrings are not exposed to MCP by default.""" + app = Dash(__name__) + app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("inp", "value")) + def update(val): + """sensitive callback docstring text that must not leak to LLMs""" + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + + with app.server.test_request_context(): + tool = app.mcp_callback_map[0].as_mcp_tool + assert ( + "sensitive callback docstring text that must not leak to LLMs" + not in tool.description + ) + + +def test_mcpt008_docstring_exposed_when_opted_in_per_callback(): + app = Dash(__name__) + app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) + + @app.callback( + Output("out", "children"), + Input("inp", "value"), + mcp_expose_docstring=True, + ) + def update(val): + """intentionally-exposed callback docstring text for the LLM""" + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + + with app.server.test_request_context(): + tool = app.mcp_callback_map[0].as_mcp_tool + assert ( + "intentionally-exposed callback docstring text for the LLM" in tool.description + ) + + +def test_mcpt009_description_includes_output_target(simple_app): + with simple_app.server.test_request_context(): + tool = app_context.get().mcp_callback_map[0].as_mcp_tool + assert "out.children" in tool.description + + +def test_mcpt010_param_name_from_function_signature(simple_app): + with simple_app.server.test_request_context(): + tool = app_context.get().mcp_callback_map[0].as_mcp_tool + assert "val" in tool.inputSchema["properties"] + + +def test_mcpt011_param_has_label_description(simple_app): + with simple_app.server.test_request_context(): + tool = app_context.get().mcp_callback_map[0].as_mcp_tool + desc = tool.inputSchema["properties"]["val"].get("description", "") + assert "Your Name" in desc + + +def test_mcpt012_state_params_included(state_app): + with state_app.server.test_request_context(): + tool = app_context.get().mcp_callback_map[0].as_mcp_tool + props = tool.inputSchema["properties"] + assert set(props.keys()) == {"clicks", "val"} + + +def test_mcpt013_multi_output_description(multi_output_app): + with multi_output_app.server.test_request_context(): + tool = app_context.get().mcp_callback_map[0].as_mcp_tool + assert "dd2.options" in tool.description + assert "out.children" in tool.description + + +def test_mcpt014_typed_annotation_narrows_schema(typed_app): + with typed_app.server.test_request_context(): + tool = app_context.get().mcp_callback_map[0].as_mcp_tool + assert tool.inputSchema["properties"]["val"]["type"] == "string" + + +# --------------------------------------------------------------------------- +# Tests — end-to-end Tool shape +# --------------------------------------------------------------------------- + + +_DASH_COMPONENT_SCHEMA = TypeAdapter(Component).json_schema() + +EXPECTED_TOOL = { + "name": "update_output", + "description": ( + "my-output.children: Returns content\n" "\n" "Test callback docstring." + ), + "inputSchema": { + "type": "object", + "properties": { + "value": { + "anyOf": [ + {"type": "string"}, + {"type": "integer"}, + {"type": "number"}, + _DASH_COMPONENT_SCHEMA, + { + "items": { + "anyOf": [ + {"type": "string"}, + {"type": "integer"}, + {"type": "number"}, + _DASH_COMPONENT_SCHEMA, + {"type": "null"}, + ] + }, + "type": "array", + }, + {"type": "null"}, + ], + "description": "Input is optional.\nThe children of this component.", + }, + }, + }, + "outputSchema": TypeAdapter(CallbackExecutionResponse).json_schema(), +} + + +def test_mcpt015_full_tool(): + """The entire tool dict matches the expected shape end-to-end.""" + tool = _user_tool(_tools_list(_make_app())) + assert tool.model_dump(exclude_none=True) == EXPECTED_TOOL diff --git a/tests/unit/mcp/tools/test_tool_schema.py b/tests/unit/mcp/tools/test_tool_schema.py deleted file mode 100644 index b39dfe08c9..0000000000 --- a/tests/unit/mcp/tools/test_tool_schema.py +++ /dev/null @@ -1,64 +0,0 @@ -"""Tool schema tests — what a Dash MCP tool looks like. - -The EXPECTED_TOOL dict below is the canonical reference for the shape of -a callback-generated MCP tool. It doubles as human-readable documentation -and as a test fixture. - -Reference: https://modelcontextprotocol.io/specification/2025-11-25/server/tools -""" - -from tests.unit.mcp.conftest import ( - _make_app, - _tools_list, - _user_tool, -) - -from pydantic import TypeAdapter -from dash.development.base_component import Component -from dash.types import CallbackExecutionResponse - -_DASH_COMPONENT_SCHEMA = TypeAdapter(Component).json_schema() - -EXPECTED_TOOL = { - "name": "update_output", - "description": ( - "my-output.children: Returns content\n" "\n" "Test callback docstring." - ), - "inputSchema": { - "type": "object", - "properties": { - "value": { - "anyOf": [ - {"type": "string"}, - {"type": "integer"}, - {"type": "number"}, - _DASH_COMPONENT_SCHEMA, - { - "items": { - "anyOf": [ - {"type": "string"}, - {"type": "integer"}, - {"type": "number"}, - _DASH_COMPONENT_SCHEMA, - {"type": "null"}, - ] - }, - "type": "array", - }, - {"type": "null"}, - ], - "description": "Input is optional.\nThe children of this component.", - }, - }, - }, - "outputSchema": TypeAdapter(CallbackExecutionResponse).json_schema(), -} - - -class TestToolSchema: - """Verify that the generated tool matches EXPECTED_TOOL exactly.""" - - def test_full_tool(self): - """The entire tool dict matches the expected shape.""" - tool = _user_tool(_tools_list(_make_app())) - assert tool.model_dump(exclude_none=True) == EXPECTED_TOOL From 4d7411c6ab40b8357f0a20fabe3ee9fb02a47355 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Fri, 24 Apr 2026 12:19:51 -0600 Subject: [PATCH 031/103] Move all hard-coded text into a `prop_roles.py` file where it can be managed centrally --- .../tools/descriptions/description_outputs.py | 31 ++-- .../schema_component_proptypes_overrides.py | 73 ++------- dash/mcp/primitives/tools/prop_roles.py | 151 ++++++++++++++++++ .../unit/mcp/tools/test_mcp_input_schemas.py | 29 +++- 4 files changed, 200 insertions(+), 84 deletions(-) create mode 100644 dash/mcp/primitives/tools/prop_roles.py diff --git a/dash/mcp/primitives/tools/descriptions/description_outputs.py b/dash/mcp/primitives/tools/descriptions/description_outputs.py index 06371d7717..b7bf55e81c 100644 --- a/dash/mcp/primitives/tools/descriptions/description_outputs.py +++ b/dash/mcp/primitives/tools/descriptions/description_outputs.py @@ -4,25 +4,18 @@ from typing import TYPE_CHECKING +from ..prop_roles import iter_prop_roles from .base import ToolDescriptionSource if TYPE_CHECKING: from dash.mcp.primitives.tools.callback_adapter import CallbackAdapter -_OUTPUT_SEMANTICS: dict[tuple[str | None, str], str] = { - ("DataTable", "data"): "Returns tabular data", - ("DataTable", "columns"): "Returns table column definitions", - ("Store", "data"): "Returns data to be remembered client-side", - ("Download", "data"): "Returns downloadable content", - ("Markdown", "children"): "Returns formatted text", - (None, "figure"): "Returns chart/visualization data", - (None, "options"): "Returns available options", - (None, "columns"): "Returns column definitions", - (None, "children"): "Returns content", - (None, "value"): "Returns the current value", - (None, "style"): "Updates styling", - (None, "disabled"): "Updates enabled/disabled state", -} + +def _describe_output(comp_type: str | None, prop: str) -> str | None: + for role in iter_prop_roles(): + if role.description is not None and role.matches(comp_type, prop): + return role.description + return None class OutputSummaryDescription(ToolDescriptionSource): @@ -38,14 +31,10 @@ def describe(cls, callback: CallbackAdapter) -> list[str]: for out in outputs: comp_id = out["component_id"] prop = out["property"] - comp_type = out.get("component_type") - - semantic = _OUTPUT_SEMANTICS.get((comp_type, prop)) - if semantic is None: - semantic = _OUTPUT_SEMANTICS.get((None, prop)) + description = _describe_output(out.get("component_type"), prop) - if semantic is not None: - lines.append(f"- {comp_id}.{prop}: {semantic}") + if description is not None: + lines.append(f"- {comp_id}.{prop}: {description}") else: lines.append(f"- {comp_id}.{prop}") diff --git a/dash/mcp/primitives/tools/input_schemas/schema_component_proptypes_overrides.py b/dash/mcp/primitives/tools/input_schemas/schema_component_proptypes_overrides.py index 984d493d69..e3d5b65756 100644 --- a/dash/mcp/primitives/tools/input_schemas/schema_component_proptypes_overrides.py +++ b/dash/mcp/primitives/tools/input_schemas/schema_component_proptypes_overrides.py @@ -1,5 +1,8 @@ -"""A place to manually define Schemas that override component-defined prop types -where type generation produces insufficient results. +"""Input schema overrides drawn from the ``PropRole`` registry. + +Looks up the parameter's ``(component_type, property)`` in the shared +registry and returns any attached ``input_schema``. Used when default +type introspection produces insufficient results. """ from __future__ import annotations @@ -8,56 +11,8 @@ from dash.mcp.types import MCPInput +from ..prop_roles import iter_prop_roles from .base import InputSchemaSource -from .schema_component_proptypes import ComponentPropSchema - -_DATE_SCHEMA = { - "type": "string", - "format": "date", - "pattern": r"^\d{4}-\d{2}-\d{2}$", -} - - -def _compute_dropdown_value_schema(param: MCPInput) -> dict[str, Any] | None: - """Dropdown values are an array if `multi=True`; scalar values otherwise.""" - schema = ComponentPropSchema.get_schema(param) - if schema is None: - return None - - component = param.get("component") - t = schema.get("type") - if not isinstance(t, list): - return schema - - if getattr(component, "multi", False): - items_schema = schema.get("items", {}) - return ( - {"type": "array", "items": items_schema} - if items_schema - else {"type": "array"} - ) - - scalar_types = [x for x in t if x != "array"] - refined = dict(schema) - refined["type"] = scalar_types[0] if len(scalar_types) == 1 else scalar_types - refined.pop("items", None) - return refined - - -_OVERRIDES: dict[tuple[str, str], dict[str, Any] | callable] = { - ("DatePickerSingle", "date"): _DATE_SCHEMA, - ("DatePickerRange", "start_date"): _DATE_SCHEMA, - ("DatePickerRange", "end_date"): _DATE_SCHEMA, - ("Graph", "figure"): { - "type": "object", - "properties": { - "data": {"type": "array", "items": {"type": "object"}}, - "layout": {"type": "object"}, - "frames": {"type": "array", "items": {"type": "object"}}, - }, - }, - ("Dropdown", "value"): _compute_dropdown_value_schema, -} class OverrideSchema(InputSchemaSource): @@ -65,10 +20,12 @@ class OverrideSchema(InputSchemaSource): @classmethod def get_schema(cls, param: MCPInput) -> dict[str, Any] | None: - key = (param.get("component_type"), param["property"]) - override = _OVERRIDES.get(key) - if override is None: - return None - if callable(override): - return override(param) - return dict(override) + component_type = param.get("component_type") + prop = param["property"] + for role in iter_prop_roles(): + if role.input_schema is None or not role.matches(component_type, prop): + continue + if callable(role.input_schema): + return role.input_schema(param) + return dict(role.input_schema) + return None diff --git a/dash/mcp/primitives/tools/prop_roles.py b/dash/mcp/primitives/tools/prop_roles.py new file mode 100644 index 0000000000..eface31147 --- /dev/null +++ b/dash/mcp/primitives/tools/prop_roles.py @@ -0,0 +1,151 @@ +"""Canonical registry of semantic roles for Dash component props. + +A ``PropRole`` bundles the set of ``(component_type, property)`` pairs +that play the same role with the metadata attached to that role: +an LLM-facing description, an input JSON Schema, etc. Tool descriptions, +input-schema overrides, and result formatters all consume this registry +so they can't drift. + +Use ``ANY_COMPONENT`` as the component_type sentinel to match any component with +the given property name. + +Declaration order matters: ``iter_prop_roles()`` yields roles in the +order they're defined in this module, and the first match wins. List +concrete-match roles before wildcard-match roles that share a prop +name (e.g. ``MARKDOWN`` before ``CONTENT`` for ``children``). +""" + +from __future__ import annotations + +from typing import Any, Callable, Dict, Iterator, NamedTuple, Union + +from typing_extensions import TypeAlias + +from dash.mcp.types import MCPInput + +PropSchema = Union[ + Dict[str, Any], + Callable[[MCPInput], Dict[str, Any]], +] + +COMPONENT: TypeAlias = Union[str, None] +ANY_COMPONENT: None = None +PROP: TypeAlias = str + + +class PropRole(NamedTuple): + identifiers: set[tuple[COMPONENT, PROP]] + description: str | None = None + input_schema: PropSchema | None = None + + def matches(self, component_type: COMPONENT, prop: PROP) -> bool: + """True if this role applies to the given ``(component_type, prop)``. + + Matches either a concrete entry or an ``ANY_COMPONENT`` wildcard + entry in ``identifiers``. Shared by every consumer so all metadata + fields apply uniformly to every identifier in the role. + """ + return (component_type, prop) in self.identifiers or ( + ANY_COMPONENT, + prop, + ) in self.identifiers + + +def _compute_dropdown_value_schema(param: MCPInput) -> dict[str, Any]: + """Dropdown values are an array if ``multi=True``; scalar otherwise.""" + _DROPDOWN_SCALAR_TYPE = { + "anyOf": [{"type": "string"}, {"type": "number"}, {"type": "boolean"}] + } + component = param.get("component") + if getattr(component, "multi", False): + return {"type": "array", "items": _DROPDOWN_SCALAR_TYPE} + return _DROPDOWN_SCALAR_TYPE + + +TABULAR = PropRole( + identifiers={("DataTable", "data"), ("AgGrid", "rowData")}, + description="Returns tabular data", +) + +DATE = PropRole( + identifiers={ + ("DatePickerSingle", "date"), + ("DatePickerRange", "start_date"), + ("DatePickerRange", "end_date"), + }, + input_schema={ + "type": "string", + "format": "date", + "pattern": r"^\d{4}-\d{2}-\d{2}$", + }, +) + +DROPDOWN_VALUE = PropRole( + identifiers={("Dropdown", "value")}, + input_schema=_compute_dropdown_value_schema, +) + +STORE_DATA = PropRole( + identifiers={("Store", "data")}, + description="Returns data to be remembered client-side", +) + +DOWNLOAD = PropRole( + identifiers={("Download", "data")}, + description="Returns downloadable content", +) + +MARKDOWN = PropRole( + identifiers={("Markdown", "children")}, + description="Returns formatted text", +) + +GENERIC_FIGURE = PropRole( + identifiers={(ANY_COMPONENT, "figure")}, + description="Returns chart/visualization data", + input_schema={ + "type": "object", + "properties": { + "data": {"type": "array", "items": {"type": "object"}}, + "layout": {"type": "object"}, + "frames": {"type": "array", "items": {"type": "object"}}, + }, + }, +) + +GENERIC_CONTENT = PropRole( + identifiers={(ANY_COMPONENT, "children")}, + description="Returns content", +) + +GENERIC_VALUE = PropRole( + identifiers={(ANY_COMPONENT, "value")}, + description="Returns the current value", +) + +GENERIC_OPTIONS = PropRole( + identifiers={(ANY_COMPONENT, "options")}, + description="Returns available options", +) + +GENERIC_COLUMNS = PropRole( + identifiers={(ANY_COMPONENT, "columns")}, + description="Returns column definitions", +) + +GENERIC_STYLE = PropRole( + identifiers={(ANY_COMPONENT, "style")}, + description="Updates styling", +) + +GENERIC_DISABLED = PropRole( + identifiers={(ANY_COMPONENT, "disabled")}, + description="Updates enabled/disabled state", +) + + +def iter_prop_roles() -> Iterator[PropRole]: + """Yield every PropRole defined in this module in declaration order.""" + for value in globals().values(): + if isinstance(value, PropRole): + yield value diff --git a/tests/unit/mcp/tools/test_mcp_input_schemas.py b/tests/unit/mcp/tools/test_mcp_input_schemas.py index d0b5e86923..ade87bbc79 100644 --- a/tests/unit/mcp/tools/test_mcp_input_schemas.py +++ b/tests/unit/mcp/tools/test_mcp_input_schemas.py @@ -111,11 +111,6 @@ def update(val: annotation_type): ), ), ("Input", "n_submit", nullable(NUMBER)), - ( - "Dropdown", - "value", - nullable(STRING, NUMBER, BOOLEAN, array_of(STRING, NUMBER, BOOLEAN)), - ), ("Dropdown", "options", nullable({})), ("Checklist", "value", nullable(array_of(STRING, NUMBER, BOOLEAN))), ("Store", "data", nullable(OBJECT, array_of({}), NUMBER, STRING, BOOLEAN)), @@ -152,6 +147,13 @@ def test_mcpi001_override_beats_introspection(): assert "pattern" in schema +def test_mcpi013_graph_figure_uses_plotly_schema_override(): + """Graph.figure matches the FIGURE role's schema override (concrete via wildcard).""" + schema = _get_schema("Graph", "figure") + assert schema["type"] == "object" + assert set(schema["properties"]) == {"data", "layout", "frames"} + + @pytest.mark.parametrize( "component_type,prop,expected", INTROSPECTION_CASES, @@ -268,3 +270,20 @@ def update(val: int, data): def test_mcpi010_component_type_maps_to_string(): """Component annotation type maps to string schema.""" assert annotation_to_json_schema(Component) == STRING + + +def test_mcpi011_dropdown_value_multi_false_narrows_to_scalar(): + """Dropdown.value with multi=False narrows to a scalar union.""" + app = _app_with_callback(dcc.Dropdown(id="dd")) + tool = _user_tool(_tools_list(app)) + assert _schema_for(tool) == {"anyOf": [STRING, NUMBER, BOOLEAN]} + + +def test_mcpi012_dropdown_value_multi_true_narrows_to_array(): + """Dropdown.value with multi=True narrows to an array of scalars.""" + app = _app_with_callback(dcc.Dropdown(id="dd", multi=True)) + tool = _user_tool(_tools_list(app)) + assert _schema_for(tool) == { + "type": "array", + "items": {"anyOf": [STRING, NUMBER, BOOLEAN]}, + } From b35749582d3f77936fad9a011bea7674d458217b Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 1 Apr 2026 14:05:37 -0600 Subject: [PATCH 032/103] Add pattern-matching callback support to input schemas and descriptions --- .../tools/input_schemas/__init__.py | 2 + .../input_descriptions/__init__.py | 2 + .../description_pattern_matching.py | 74 +++++++++++ .../input_schemas/schema_pattern_matching.py | 89 +++++++++++++ .../input_schemas/test_pattern_matching.py | 121 ++++++++++++++++++ 5 files changed, 288 insertions(+) create mode 100644 dash/mcp/primitives/tools/input_schemas/input_descriptions/description_pattern_matching.py create mode 100644 dash/mcp/primitives/tools/input_schemas/schema_pattern_matching.py create mode 100644 tests/unit/mcp/tools/input_schemas/test_pattern_matching.py diff --git a/dash/mcp/primitives/tools/input_schemas/__init__.py b/dash/mcp/primitives/tools/input_schemas/__init__.py index 9fa82eda55..e037c5793f 100644 --- a/dash/mcp/primitives/tools/input_schemas/__init__.py +++ b/dash/mcp/primitives/tools/input_schemas/__init__.py @@ -12,12 +12,14 @@ from dash.mcp.types import MCPInput from .base import InputSchemaSource +from .schema_pattern_matching import PatternMatchingSchema from .schema_callback_type_annotations import AnnotationSchema from .schema_component_proptypes_overrides import OverrideSchema from .schema_component_proptypes import ComponentPropSchema from .input_descriptions import get_property_description _SOURCES: list[type[InputSchemaSource]] = [ + PatternMatchingSchema, AnnotationSchema, OverrideSchema, ComponentPropSchema, diff --git a/dash/mcp/primitives/tools/input_schemas/input_descriptions/__init__.py b/dash/mcp/primitives/tools/input_schemas/input_descriptions/__init__.py index 4bc6d8e984..ebba3b4af8 100644 --- a/dash/mcp/primitives/tools/input_schemas/input_descriptions/__init__.py +++ b/dash/mcp/primitives/tools/input_schemas/input_descriptions/__init__.py @@ -12,11 +12,13 @@ from .description_component_props import ComponentPropsDescription from .description_docstrings import DocstringPropDescription from .description_html_labels import LabelDescription +from .description_pattern_matching import PatternMatchingDescription _SOURCES: list[type[InputDescriptionSource]] = [ DocstringPropDescription, LabelDescription, ComponentPropsDescription, + PatternMatchingDescription, ] diff --git a/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_pattern_matching.py b/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_pattern_matching.py new file mode 100644 index 0000000000..69a19829f7 --- /dev/null +++ b/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_pattern_matching.py @@ -0,0 +1,74 @@ +"""Description for pattern-matching callback inputs. + +Explains that the input corresponds to a pattern-matching callback +(ALL, MATCH, ALLSMALLER) and describes the expected format. +See: https://dash.plotly.com/pattern-matching-callbacks +""" + +from __future__ import annotations + +import json + +from dash.dependencies import Wildcard +from dash.mcp.types import MCPInput + +from .base import InputDescriptionSource + +_WILDCARD_VALUES = frozenset(w.value for w in Wildcard) + + +class PatternMatchingDescription(InputDescriptionSource): + """Describe pattern-matching behavior for wildcard inputs.""" + + @classmethod + def describe(cls, param: MCPInput) -> list[str]: + dep_id = _parse_dep_id(param["component_id"]) + if dep_id is None: + return [] + + wildcard_key, wildcard_type = _find_wildcard(dep_id) + if wildcard_key is None: + return [] + + non_wildcard = {k: v for k, v in dep_id.items() if k != wildcard_key} + pattern_desc = ", ".join(f'{k}="{v}"' for k, v in non_wildcard.items()) + prop = param["property"] + + wildcard_descriptions = { + "ALL": ( + f"Pattern-matching input (ALL): provide an array of `{prop}` values, " + f"one per component matching {{{pattern_desc}}}. " + f"All matching components are included." + ), + "MATCH": ( + f"Pattern-matching input (MATCH): provide the `{prop}` value " + f"for the specific component matching {{{pattern_desc}}} " + f"that triggered this callback." + ), + "ALLSMALLER": ( + f"Pattern-matching input (ALLSMALLER): provide an array of `{prop}` values " + f"from components matching {{{pattern_desc}}} " + f"whose `{wildcard_key}` is smaller than the triggering component's `{wildcard_key}`." + ), + } + + desc = wildcard_descriptions.get(wildcard_type) + return [desc] if desc else [] + + +def _parse_dep_id(component_id: str) -> dict | None: + if not component_id.startswith("{"): + return None + try: + return json.loads(component_id) + except (json.JSONDecodeError, ValueError): + return None + + +def _find_wildcard(dep_id: dict) -> tuple[str | None, str | None]: + """Return (key, wildcard_type) for the first wildcard found.""" + for key, value in dep_id.items(): + if isinstance(value, list) and len(value) == 1: + if value[0] in _WILDCARD_VALUES: + return key, value[0] + return None, None diff --git a/dash/mcp/primitives/tools/input_schemas/schema_pattern_matching.py b/dash/mcp/primitives/tools/input_schemas/schema_pattern_matching.py new file mode 100644 index 0000000000..e6b095370f --- /dev/null +++ b/dash/mcp/primitives/tools/input_schemas/schema_pattern_matching.py @@ -0,0 +1,89 @@ +"""Schema for pattern-matching callback inputs (ALL, MATCH, ALLSMALLER). + +When a callback input uses a wildcard ID, the callback receives a +list of values — one per matching component. This source detects +wildcard IDs and produces an array schema. If matching components +exist in the layout, the item type is inferred from a concrete match. +""" + +from __future__ import annotations + +import json +from typing import Any + +from dash._layout_utils import find_matching_components, _WILDCARD_VALUES +from dash.mcp.types import MCPInput + +from .base import InputSchemaSource + + +class PatternMatchingSchema(InputSchemaSource): + """Return a schema for pattern-matching inputs. + + For ALL/ALLSMALLER: array of ``{id, property, value}`` objects. + For MATCH: a single ``{id, property, value}`` object. + """ + + @classmethod + def get_schema(cls, param: MCPInput) -> dict[str, Any] | None: + dep_id = _parse_dep_id(param["component_id"]) + if dep_id is None: + return None + + wildcard_type = _get_wildcard_type(dep_id) + if wildcard_type is None: + return None + + value_schema = _infer_value_schema(param) + + item_schema: dict[str, Any] = { + "type": "object", + "properties": { + "id": {"type": "object"}, + "property": {"type": "string"}, + "value": value_schema or {}, + }, + "required": ["id", "property", "value"], + } + + if wildcard_type == "MATCH": + return item_schema + + return {"type": "array", "items": item_schema} + + +def _parse_dep_id(component_id: str) -> dict | None: + if not component_id.startswith("{"): + return None + try: + return json.loads(component_id) + except (json.JSONDecodeError, ValueError): + return None + + +def _get_wildcard_type(dep_id: dict) -> str | None: + """Return the wildcard type (ALL, MATCH, ALLSMALLER) or None.""" + for value in dep_id.values(): + if isinstance(value, list) and len(value) == 1: + if value[0] in _WILDCARD_VALUES: + return value[0] + return None + + +def _infer_value_schema(param: MCPInput) -> dict[str, Any] | None: + """Infer the JSON Schema for the ``value`` field from a matching component.""" + matches = find_matching_components(_parse_dep_id(param["component_id"])) + if not matches: + return None + + from . import get_input_schema + + concrete_param: MCPInput = { + **param, + "component": matches[0], + "component_id": str(getattr(matches[0], "id", "")), + "component_type": getattr(matches[0], "_type", None), + } + schema = get_input_schema(concrete_param) + schema.pop("description", None) + return schema or None diff --git a/tests/unit/mcp/tools/input_schemas/test_pattern_matching.py b/tests/unit/mcp/tools/input_schemas/test_pattern_matching.py new file mode 100644 index 0000000000..37b8a642ee --- /dev/null +++ b/tests/unit/mcp/tools/input_schemas/test_pattern_matching.py @@ -0,0 +1,121 @@ +"""Tests for pattern-matching schema and description generation.""" + +from dash import Dash, html, Input, Output, ALL, MATCH + +from tests.unit.mcp.conftest import _tools_list, _user_tool, _schema_for, _desc_for + + +class TestPatternMatchingSchema: + def test_all_produces_array_schema(self): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id={"type": "item", "index": 0}, children="A"), + html.Div(id={"type": "item", "index": 1}, children="B"), + html.Div(id="result"), + ] + ) + + @app.callback( + Output("result", "children"), + Input({"type": "item", "index": ALL}, "children"), + ) + def combine(values): + return ", ".join(values) + + tool = _user_tool(_tools_list(app)) + schema = _schema_for(tool) + assert schema["type"] == "array" + assert schema["items"]["type"] == "object" + assert "value" in schema["items"]["properties"] + + def test_match_produces_object_schema(self): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id={"type": "item", "index": 0}, children="A"), + html.Div(id="result"), + ] + ) + + @app.callback( + Output("result", "children"), + Input({"type": "item", "index": MATCH}, "children"), + ) + def echo(value): + return value + + tool = _user_tool(_tools_list(app)) + schema = _schema_for(tool) + assert schema["type"] == "object" + assert "value" in schema["properties"] + + def test_annotation_narrows_value_schema(self): + from dash import dcc + + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id={"type": "filter", "index": 0}, options=["a", "b"]), + dcc.Dropdown(id={"type": "filter", "index": 1}, options=["c", "d"]), + html.Div(id="result"), + ] + ) + + @app.callback( + Output("result", "children"), + Input({"type": "filter", "index": ALL}, "options"), + ) + def combine(options: list[str]): + return str(options) + + tool = _user_tool(_tools_list(app)) + schema = _schema_for(tool) + assert schema["type"] == "array" + value_schema = schema["items"]["properties"]["value"] + # Annotation narrows value to list[str] instead of the broad introspected type + assert value_schema == {"items": {"type": "string"}, "type": "array"} + + +class TestPatternMatchingDescription: + def test_all_description(self): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id={"type": "item", "index": 0}), + html.Div(id="result"), + ] + ) + + @app.callback( + Output("result", "children"), + Input({"type": "item", "index": ALL}, "children"), + ) + def combine(values): + return str(values) + + tool = _user_tool(_tools_list(app)) + desc = _desc_for(tool) + assert "Pattern-matching input (ALL)" in desc + assert 'type="item"' in desc + + def test_match_description(self): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id={"type": "item", "index": 0}), + html.Div(id="result"), + ] + ) + + @app.callback( + Output("result", "children"), + Input({"type": "item", "index": MATCH}, "children"), + ) + def echo(value): + return value + + tool = _user_tool(_tools_list(app)) + desc = _desc_for(tool) + assert "Pattern-matching input (MATCH)" in desc + assert 'type="item"' in desc From 6906b3d3715632ecce6c67b023fd02e301d4ffdf Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 16 Apr 2026 13:24:03 -0600 Subject: [PATCH 033/103] clean up duplicated code --- .../description_pattern_matching.py | 17 ++------------- .../input_schemas/schema_pattern_matching.py | 21 +++++++------------ 2 files changed, 10 insertions(+), 28 deletions(-) diff --git a/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_pattern_matching.py b/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_pattern_matching.py index 69a19829f7..221423aa50 100644 --- a/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_pattern_matching.py +++ b/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_pattern_matching.py @@ -7,22 +7,18 @@ from __future__ import annotations -import json - -from dash.dependencies import Wildcard +from dash._layout_utils import _WILDCARD_VALUES, parse_wildcard_id from dash.mcp.types import MCPInput from .base import InputDescriptionSource -_WILDCARD_VALUES = frozenset(w.value for w in Wildcard) - class PatternMatchingDescription(InputDescriptionSource): """Describe pattern-matching behavior for wildcard inputs.""" @classmethod def describe(cls, param: MCPInput) -> list[str]: - dep_id = _parse_dep_id(param["component_id"]) + dep_id = parse_wildcard_id(param["component_id"]) if dep_id is None: return [] @@ -56,15 +52,6 @@ def describe(cls, param: MCPInput) -> list[str]: return [desc] if desc else [] -def _parse_dep_id(component_id: str) -> dict | None: - if not component_id.startswith("{"): - return None - try: - return json.loads(component_id) - except (json.JSONDecodeError, ValueError): - return None - - def _find_wildcard(dep_id: dict) -> tuple[str | None, str | None]: """Return (key, wildcard_type) for the first wildcard found.""" for key, value in dep_id.items(): diff --git a/dash/mcp/primitives/tools/input_schemas/schema_pattern_matching.py b/dash/mcp/primitives/tools/input_schemas/schema_pattern_matching.py index e6b095370f..52e16cf58b 100644 --- a/dash/mcp/primitives/tools/input_schemas/schema_pattern_matching.py +++ b/dash/mcp/primitives/tools/input_schemas/schema_pattern_matching.py @@ -8,10 +8,13 @@ from __future__ import annotations -import json from typing import Any -from dash._layout_utils import find_matching_components, _WILDCARD_VALUES +from dash._layout_utils import ( + _WILDCARD_VALUES, + find_matching_components, + parse_wildcard_id, +) from dash.mcp.types import MCPInput from .base import InputSchemaSource @@ -26,7 +29,7 @@ class PatternMatchingSchema(InputSchemaSource): @classmethod def get_schema(cls, param: MCPInput) -> dict[str, Any] | None: - dep_id = _parse_dep_id(param["component_id"]) + dep_id = parse_wildcard_id(param["component_id"]) if dep_id is None: return None @@ -52,15 +55,6 @@ def get_schema(cls, param: MCPInput) -> dict[str, Any] | None: return {"type": "array", "items": item_schema} -def _parse_dep_id(component_id: str) -> dict | None: - if not component_id.startswith("{"): - return None - try: - return json.loads(component_id) - except (json.JSONDecodeError, ValueError): - return None - - def _get_wildcard_type(dep_id: dict) -> str | None: """Return the wildcard type (ALL, MATCH, ALLSMALLER) or None.""" for value in dep_id.values(): @@ -72,10 +66,11 @@ def _get_wildcard_type(dep_id: dict) -> str | None: def _infer_value_schema(param: MCPInput) -> dict[str, Any] | None: """Infer the JSON Schema for the ``value`` field from a matching component.""" - matches = find_matching_components(_parse_dep_id(param["component_id"])) + matches = find_matching_components(parse_wildcard_id(param["component_id"])) if not matches: return None + # pylint: disable-next=cyclic-import,import-outside-toplevel from . import get_input_schema concrete_param: MCPInput = { From 6a52dba6c68a3fb4e4ba28f14ea7e85d930aa472 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 23 Apr 2026 14:04:40 -0600 Subject: [PATCH 034/103] Refactor unit tests to conform to existing test patterns --- .../input_schemas/test_pattern_matching.py | 121 ---------------- .../mcp/tools/test_mcp_pattern_matching.py | 136 ++++++++++++++++++ 2 files changed, 136 insertions(+), 121 deletions(-) delete mode 100644 tests/unit/mcp/tools/input_schemas/test_pattern_matching.py create mode 100644 tests/unit/mcp/tools/test_mcp_pattern_matching.py diff --git a/tests/unit/mcp/tools/input_schemas/test_pattern_matching.py b/tests/unit/mcp/tools/input_schemas/test_pattern_matching.py deleted file mode 100644 index 37b8a642ee..0000000000 --- a/tests/unit/mcp/tools/input_schemas/test_pattern_matching.py +++ /dev/null @@ -1,121 +0,0 @@ -"""Tests for pattern-matching schema and description generation.""" - -from dash import Dash, html, Input, Output, ALL, MATCH - -from tests.unit.mcp.conftest import _tools_list, _user_tool, _schema_for, _desc_for - - -class TestPatternMatchingSchema: - def test_all_produces_array_schema(self): - app = Dash(__name__) - app.layout = html.Div( - [ - html.Div(id={"type": "item", "index": 0}, children="A"), - html.Div(id={"type": "item", "index": 1}, children="B"), - html.Div(id="result"), - ] - ) - - @app.callback( - Output("result", "children"), - Input({"type": "item", "index": ALL}, "children"), - ) - def combine(values): - return ", ".join(values) - - tool = _user_tool(_tools_list(app)) - schema = _schema_for(tool) - assert schema["type"] == "array" - assert schema["items"]["type"] == "object" - assert "value" in schema["items"]["properties"] - - def test_match_produces_object_schema(self): - app = Dash(__name__) - app.layout = html.Div( - [ - html.Div(id={"type": "item", "index": 0}, children="A"), - html.Div(id="result"), - ] - ) - - @app.callback( - Output("result", "children"), - Input({"type": "item", "index": MATCH}, "children"), - ) - def echo(value): - return value - - tool = _user_tool(_tools_list(app)) - schema = _schema_for(tool) - assert schema["type"] == "object" - assert "value" in schema["properties"] - - def test_annotation_narrows_value_schema(self): - from dash import dcc - - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Dropdown(id={"type": "filter", "index": 0}, options=["a", "b"]), - dcc.Dropdown(id={"type": "filter", "index": 1}, options=["c", "d"]), - html.Div(id="result"), - ] - ) - - @app.callback( - Output("result", "children"), - Input({"type": "filter", "index": ALL}, "options"), - ) - def combine(options: list[str]): - return str(options) - - tool = _user_tool(_tools_list(app)) - schema = _schema_for(tool) - assert schema["type"] == "array" - value_schema = schema["items"]["properties"]["value"] - # Annotation narrows value to list[str] instead of the broad introspected type - assert value_schema == {"items": {"type": "string"}, "type": "array"} - - -class TestPatternMatchingDescription: - def test_all_description(self): - app = Dash(__name__) - app.layout = html.Div( - [ - html.Div(id={"type": "item", "index": 0}), - html.Div(id="result"), - ] - ) - - @app.callback( - Output("result", "children"), - Input({"type": "item", "index": ALL}, "children"), - ) - def combine(values): - return str(values) - - tool = _user_tool(_tools_list(app)) - desc = _desc_for(tool) - assert "Pattern-matching input (ALL)" in desc - assert 'type="item"' in desc - - def test_match_description(self): - app = Dash(__name__) - app.layout = html.Div( - [ - html.Div(id={"type": "item", "index": 0}), - html.Div(id="result"), - ] - ) - - @app.callback( - Output("result", "children"), - Input({"type": "item", "index": MATCH}, "children"), - ) - def echo(value): - return value - - tool = _user_tool(_tools_list(app)) - desc = _desc_for(tool) - assert "Pattern-matching input (MATCH)" in desc - assert 'type="item"' in desc diff --git a/tests/unit/mcp/tools/test_mcp_pattern_matching.py b/tests/unit/mcp/tools/test_mcp_pattern_matching.py new file mode 100644 index 0000000000..25c8de1f8d --- /dev/null +++ b/tests/unit/mcp/tools/test_mcp_pattern_matching.py @@ -0,0 +1,136 @@ +"""Pattern-matching callback support — schemas and descriptions for wildcard IDs. + +Covers callbacks whose Input/Output use ``ALL``, ``MATCH``, or ``ALLSMALLER`` +wildcards in dict-based component IDs: the input is typed as an array (ALL) +or object (MATCH) of ``{id, property, value}`` entries, and descriptions +surface the wildcard kind and ID pattern. +""" + +from dash import Dash, html, Input, Output, ALL, MATCH, dcc + +from tests.unit.mcp.conftest import _tools_list, _user_tool, _schema_for, _desc_for + + +# --------------------------------------------------------------------------- +# Schema shape +# --------------------------------------------------------------------------- + + +def test_mcpm001_all_produces_array_schema(): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id={"type": "item", "index": 0}, children="A"), + html.Div(id={"type": "item", "index": 1}, children="B"), + html.Div(id="result"), + ] + ) + + @app.callback( + Output("result", "children"), + Input({"type": "item", "index": ALL}, "children"), + ) + def combine(values): + return ", ".join(values) + + tool = _user_tool(_tools_list(app)) + schema = _schema_for(tool) + assert schema["type"] == "array" + assert schema["items"]["type"] == "object" + assert "value" in schema["items"]["properties"] + + +def test_mcpm002_match_produces_object_schema(): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id={"type": "item", "index": 0}, children="A"), + html.Div(id="result"), + ] + ) + + @app.callback( + Output("result", "children"), + Input({"type": "item", "index": MATCH}, "children"), + ) + def echo(value): + return value + + tool = _user_tool(_tools_list(app)) + schema = _schema_for(tool) + assert schema["type"] == "object" + assert "value" in schema["properties"] + + +def test_mcpm003_annotation_narrows_value_schema(): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id={"type": "filter", "index": 0}, options=["a", "b"]), + dcc.Dropdown(id={"type": "filter", "index": 1}, options=["c", "d"]), + html.Div(id="result"), + ] + ) + + @app.callback( + Output("result", "children"), + Input({"type": "filter", "index": ALL}, "options"), + ) + def combine(options: list[str]): + return str(options) + + tool = _user_tool(_tools_list(app)) + schema = _schema_for(tool) + assert schema["type"] == "array" + value_schema = schema["items"]["properties"]["value"] + # Annotation narrows value to list[str] instead of the broad introspected type + assert value_schema == {"items": {"type": "string"}, "type": "array"} + + +# --------------------------------------------------------------------------- +# Descriptions +# --------------------------------------------------------------------------- + + +def test_mcpm004_all_description(): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id={"type": "item", "index": 0}), + html.Div(id="result"), + ] + ) + + @app.callback( + Output("result", "children"), + Input({"type": "item", "index": ALL}, "children"), + ) + def combine(values): + return str(values) + + tool = _user_tool(_tools_list(app)) + desc = _desc_for(tool) + assert "Pattern-matching input (ALL)" in desc + assert 'type="item"' in desc + + +def test_mcpm005_match_description(): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id={"type": "item", "index": 0}), + html.Div(id="result"), + ] + ) + + @app.callback( + Output("result", "children"), + Input({"type": "item", "index": MATCH}, "children"), + ) + def echo(value): + return value + + tool = _user_tool(_tools_list(app)) + desc = _desc_for(tool) + assert "Pattern-matching input (MATCH)" in desc + assert 'type="item"' in desc From 7ce9939fbdc4b33bf7e7aa970b1f3556da24dadb Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 1 Apr 2026 14:23:37 -0600 Subject: [PATCH 035/103] Add result formatters for Plotly figures and tabular data --- dash/mcp/primitives/tools/results/__init__.py | 52 ++++++++++ .../tools/results/result_dataframe.py | 55 +++++++++++ .../tools/results/result_plotly_figure.py | 52 ++++++++++ .../tools/results/test_callback_response.py | 98 +++++++++++++++++++ .../unit/mcp/tools/results/test_dataframe.py | 63 ++++++++++++ .../mcp/tools/results/test_plotly_figure.py | 55 +++++++++++ 6 files changed, 375 insertions(+) create mode 100644 dash/mcp/primitives/tools/results/__init__.py create mode 100644 dash/mcp/primitives/tools/results/result_dataframe.py create mode 100644 dash/mcp/primitives/tools/results/result_plotly_figure.py create mode 100644 tests/unit/mcp/tools/results/test_callback_response.py create mode 100644 tests/unit/mcp/tools/results/test_dataframe.py create mode 100644 tests/unit/mcp/tools/results/test_plotly_figure.py diff --git a/dash/mcp/primitives/tools/results/__init__.py b/dash/mcp/primitives/tools/results/__init__.py new file mode 100644 index 0000000000..e2f91a67a8 --- /dev/null +++ b/dash/mcp/primitives/tools/results/__init__.py @@ -0,0 +1,52 @@ +"""Tool result formatting for MCP tools/call responses. + +Each result formatter shares the same signature: +``(output: MCPOutput, value: Any) -> list[TextContent | ImageContent]`` + +Formatters decide for themselves whether they care about a given output. +The structuredContent is always the full dispatch response. +""" + +from __future__ import annotations + +import json +from typing import Any + +from mcp.types import CallToolResult, TextContent + +from dash.types import CallbackDispatchResponse +from dash.mcp.primitives.tools.callback_adapter import CallbackAdapter + +from .result_dataframe import dataframe_result +from .result_plotly_figure import plotly_figure_result + +_RESULT_FORMATTERS = [ + plotly_figure_result, + dataframe_result, +] + + +def format_callback_response( + response: CallbackDispatchResponse, + callback: CallbackAdapter, +) -> CallToolResult: + """Format a dispatch response as a CallToolResult. + + The response is always returned as structuredContent. Result + formatters are called per output property and may add additional + content items (images, markdown, etc.). + """ + content: list[Any] = [ + TextContent(type="text", text=json.dumps(response, default=str)), + ] + + resp = response.get("response") or {} + for callback_output in callback.outputs: + value = resp.get(callback_output["component_id"], {}).get(callback_output["property"]) + for result_fn in _RESULT_FORMATTERS: + content.extend(result_fn(callback_output, value)) + + return CallToolResult( + content=content, + structuredContent=response, + ) diff --git a/dash/mcp/primitives/tools/results/result_dataframe.py b/dash/mcp/primitives/tools/results/result_dataframe.py new file mode 100644 index 0000000000..652c31589b --- /dev/null +++ b/dash/mcp/primitives/tools/results/result_dataframe.py @@ -0,0 +1,55 @@ +"""Tabular data result: render as a markdown table. + +Detects tabular output by component type and prop name: +- DataTable.data +- AgGrid.rowData +""" + +from __future__ import annotations + +from typing import Any + +from mcp.types import TextContent + +from dash.mcp.types import MCPOutput + +MAX_ROWS = 50 + +_TABULAR_PROPS = { + ("DataTable", "data"), + ("AgGrid", "rowData"), +} + + +def _to_markdown_table(rows: list[dict], max_rows: int = MAX_ROWS) -> str: + """Render a list of row dicts as a markdown table.""" + columns = list(rows[0].keys()) + total = len(rows) + + lines: list[str] = [] + lines.append(f"*{total} rows \u00d7 {len(columns)} columns*") + lines.append("") + lines.append("| " + " | ".join(columns) + " |") + lines.append("| " + " | ".join("---" for _ in columns) + " |") + + for row in rows[:max_rows]: + cells = [ + str(row.get(col, "")).replace("|", "\\|").replace("\n", " ") + for col in columns + ] + lines.append("| " + " | ".join(cells) + " |") + + if total > max_rows: + lines.append(f"\n(\u2026 {total - max_rows} more rows)") + + return "\n".join(lines) + + +def dataframe_result(callback_output: MCPOutput, callback_output_value: Any) -> list: + """Produce a markdown table for tabular component output values.""" + key = (callback_output.get("component_type"), callback_output.get("property")) + if key not in _TABULAR_PROPS: + return [] + if not isinstance(callback_output_value, list) or not callback_output_value or not isinstance(callback_output_value[0], dict): + return [] + return [TextContent(type="text", text=_to_markdown_table(callback_output_value))] diff --git a/dash/mcp/primitives/tools/results/result_plotly_figure.py b/dash/mcp/primitives/tools/results/result_plotly_figure.py new file mode 100644 index 0000000000..d837e17eed --- /dev/null +++ b/dash/mcp/primitives/tools/results/result_plotly_figure.py @@ -0,0 +1,52 @@ +"""Plotly figure tool result: rendered image.""" + +from __future__ import annotations + +import base64 +import logging +from typing import Any + +from mcp.types import ImageContent + +from dash.mcp.types import MCPOutput + +logger = logging.getLogger(__name__) + +IMAGE_WIDTH = 700 +IMAGE_HEIGHT = 450 + + +def _render_image(figure: Any) -> ImageContent | None: + """Render the figure as a base64 PNG ImageContent. + + Returns None if kaleido is not installed. + """ + try: + img_bytes = figure.to_image( + format="png", + width=IMAGE_WIDTH, + height=IMAGE_HEIGHT, + ) + except (ValueError, ImportError): + logger.debug("MCP: kaleido not available, skipping image render") + return None + + b64 = base64.b64encode(img_bytes).decode("ascii") + return ImageContent(type="image", data=b64, mimeType="image/png") + + +def plotly_figure_result(callback_output: MCPOutput, callback_output_value: Any) -> list: + """Produce a rendered PNG for Graph.figure output values.""" + if callback_output.get("component_type") != "Graph" or callback_output.get("property") != "figure": + return [] + if not isinstance(callback_output_value, dict): + return [] + + try: + import plotly.graph_objects as go + except ImportError: + return [] + + fig = go.Figure(callback_output_value) + image = _render_image(fig) + return [image] if image is not None else [] diff --git a/tests/unit/mcp/tools/results/test_callback_response.py b/tests/unit/mcp/tools/results/test_callback_response.py new file mode 100644 index 0000000000..ff8cca5e20 --- /dev/null +++ b/tests/unit/mcp/tools/results/test_callback_response.py @@ -0,0 +1,98 @@ +"""Tests for the callback response formatter.""" + +from unittest.mock import Mock + +from dash.mcp.primitives.tools.results import format_callback_response + + +def _mock_callback(outputs=None): + cb = Mock() + cb.outputs = outputs or [] + return cb + + +class TestFormatCallbackResponse: + def test_wraps_as_structured_content(self): + response = { + "multi": True, + "response": {"out": {"children": "hello"}}, + } + result = format_callback_response(response, _mock_callback()) + assert result.structuredContent == response + + def test_content_has_json_text_fallback(self): + """Per MCP spec, structuredContent SHOULD include a TextContent fallback.""" + response = {"multi": True, "response": {}} + result = format_callback_response(response, _mock_callback()) + assert len(result.content) >= 1 + assert result.content[0].type == "text" + assert '"multi": true' in result.content[0].text + + def test_is_error_defaults_false(self): + response = {"multi": True, "response": {}} + result = format_callback_response(response, _mock_callback()) + assert result.isError is False + + def test_preserves_side_update(self): + response = { + "multi": True, + "response": {"out": {"children": "x"}}, + "sideUpdate": {"other": {"value": 42}}, + } + result = format_callback_response(response, _mock_callback()) + assert result.structuredContent["sideUpdate"] == {"other": {"value": 42}} + + def test_datatable_result_includes_markdown_table(self): + response = { + "multi": True, + "response": { + "my-table": {"data": [{"name": "Alice", "age": 30}]}, + }, + } + outputs = [ + { + "component_id": "my-table", + "component_type": "DataTable", + "property": "data", + "id_and_prop": "my-table.data", + "initial_value": None, + "tool_name": "update", + } + ] + result = format_callback_response(response, _mock_callback(outputs)) + texts = [c.text for c in result.content if c.type == "text"] + assert any("| name | age |" in t for t in texts) + + def test_plotly_figure_includes_image(self): + from unittest.mock import patch + + try: + import plotly.graph_objects as go + except ImportError: + return + + response = { + "multi": True, + "response": { + "my-graph": { + "figure": { + "data": [{"type": "bar", "x": ["A"], "y": [1]}], + "layout": {}, + } + } + }, + } + outputs = [ + { + "component_id": "my-graph", + "component_type": "Graph", + "property": "figure", + "id_and_prop": "my-graph.figure", + "initial_value": None, + "tool_name": "update", + } + ] + with patch.object(go.Figure, "to_image", return_value=b"\x89PNGfake"): + result = format_callback_response(response, _mock_callback(outputs)) + images = [c for c in result.content if c.type == "image"] + assert len(images) == 1 diff --git a/tests/unit/mcp/tools/results/test_dataframe.py b/tests/unit/mcp/tools/results/test_dataframe.py new file mode 100644 index 0000000000..a7f9e42fca --- /dev/null +++ b/tests/unit/mcp/tools/results/test_dataframe.py @@ -0,0 +1,63 @@ +"""Tests for the tabular data result formatter.""" + +from dash.mcp.primitives.tools.results.result_dataframe import ( + MAX_ROWS, + dataframe_result, +) + +EXPECTED_TABLE = ( + "*2 rows \u00d7 2 columns*\n" + "\n" + "| name | age |\n" + "| --- | --- |\n" + "| Alice | 30 |\n" + "| Bob | 25 |" +) + +SAMPLE_ROWS = [{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}] + +DATATABLE_OUTPUT = { + "component_type": "DataTable", + "property": "data", + "component_id": "t", + "id_and_prop": "t.data", + "initial_value": None, + "tool_name": "update", +} + +AGGRID_OUTPUT = { + "component_type": "AgGrid", + "property": "rowData", + "component_id": "g", + "id_and_prop": "g.rowData", + "initial_value": None, + "tool_name": "update", +} + + +class TestDataframeResult: + def test_datatable_data_renders_markdown(self): + result = dataframe_result(DATATABLE_OUTPUT, SAMPLE_ROWS) + assert len(result) == 1 + assert result[0].text == EXPECTED_TABLE + + def test_aggrid_rowdata_renders_markdown(self): + result = dataframe_result(AGGRID_OUTPUT, SAMPLE_ROWS) + assert len(result) == 1 + assert result[0].text == EXPECTED_TABLE + + def test_ignores_non_tabular_props(self): + non_tabular = {**DATATABLE_OUTPUT, "property": "columns"} + assert dataframe_result(non_tabular, SAMPLE_ROWS) == [] + + def test_ignores_empty_or_non_dict_rows(self): + assert dataframe_result(DATATABLE_OUTPUT, []) == [] + assert dataframe_result(DATATABLE_OUTPUT, ["a", "b"]) == [] + + def test_truncates_large_tables(self): + rows = [{"i": n} for n in range(MAX_ROWS + 50)] + result = dataframe_result(DATATABLE_OUTPUT, rows) + text = result[0].text + assert f"| {MAX_ROWS - 1} |" in text + assert f"| {MAX_ROWS} |" not in text + assert "50 more rows" in text diff --git a/tests/unit/mcp/tools/results/test_plotly_figure.py b/tests/unit/mcp/tools/results/test_plotly_figure.py new file mode 100644 index 0000000000..8e336ba687 --- /dev/null +++ b/tests/unit/mcp/tools/results/test_plotly_figure.py @@ -0,0 +1,55 @@ +"""Tests for the Plotly figure tool result formatter.""" + +import base64 +from unittest.mock import patch + +import pytest + +from dash.mcp.primitives.tools.results.result_plotly_figure import ( + plotly_figure_result, +) + +go = pytest.importorskip("plotly.graph_objects") + +FAKE_PNG = b"\x89PNG\r\n\x1a\nfakedata" +FAKE_B64 = base64.b64encode(FAKE_PNG).decode("ascii") + +GRAPH_FIGURE_OUTPUT = { + "component_type": "Graph", + "property": "figure", + "component_id": "g", + "id_and_prop": "g.figure", + "initial_value": None, + "tool_name": "update", +} + + +class TestPlotlyFigureResult: + def test_returns_image_when_kaleido_available(self): + fig_dict = go.Figure(data=[go.Bar(x=["A", "B"], y=[1, 2])]).to_plotly_json() + with patch.object(go.Figure, "to_image", return_value=FAKE_PNG): + result = plotly_figure_result(GRAPH_FIGURE_OUTPUT, fig_dict) + assert len(result) == 1 + assert result[0].type == "image" + assert result[0].data == FAKE_B64 + + def test_returns_empty_when_kaleido_unavailable(self): + fig_dict = go.Figure(data=[go.Bar(x=["A", "B"], y=[1, 2])]).to_plotly_json() + with patch.object(go.Figure, "to_image", side_effect=ImportError): + result = plotly_figure_result(GRAPH_FIGURE_OUTPUT, fig_dict) + assert result == [] + + def test_ignores_non_graph_components(self): + output = { + **GRAPH_FIGURE_OUTPUT, + "component_type": "Div", + "property": "children", + } + assert plotly_figure_result(output, {}) == [] + + def test_ignores_non_figure_props(self): + output = {**GRAPH_FIGURE_OUTPUT, "property": "clickData"} + assert plotly_figure_result(output, {}) == [] + + def test_ignores_non_dict_values(self): + assert plotly_figure_result(GRAPH_FIGURE_OUTPUT, "not a dict") == [] From acf75a0f3f1ae6aa3bb2cced31e884a309b10f4c Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 16 Apr 2026 13:34:23 -0600 Subject: [PATCH 036/103] Update type names --- dash/mcp/primitives/tools/results/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dash/mcp/primitives/tools/results/__init__.py b/dash/mcp/primitives/tools/results/__init__.py index e2f91a67a8..ed21178c0a 100644 --- a/dash/mcp/primitives/tools/results/__init__.py +++ b/dash/mcp/primitives/tools/results/__init__.py @@ -14,7 +14,7 @@ from mcp.types import CallToolResult, TextContent -from dash.types import CallbackDispatchResponse +from dash.types import CallbackExecutionResponse from dash.mcp.primitives.tools.callback_adapter import CallbackAdapter from .result_dataframe import dataframe_result @@ -27,7 +27,7 @@ def format_callback_response( - response: CallbackDispatchResponse, + response: CallbackExecutionResponse, callback: CallbackAdapter, ) -> CallToolResult: """Format a dispatch response as a CallToolResult. From d01d43ae5548e072db81e38c76dc8b83dd24a79d Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 16 Apr 2026 13:43:01 -0600 Subject: [PATCH 037/103] Refactor tool result formatters to use a base class (just as resources do) --- dash/mcp/primitives/tools/results/__init__.py | 24 ++++++------- dash/mcp/primitives/tools/results/base.py | 24 +++++++++++++ .../tools/results/result_dataframe.py | 27 +++++++++----- .../tools/results/result_plotly_figure.py | 35 +++++++++++-------- .../unit/mcp/tools/results/test_dataframe.py | 14 ++++---- .../mcp/tools/results/test_plotly_figure.py | 12 +++---- 6 files changed, 88 insertions(+), 48 deletions(-) create mode 100644 dash/mcp/primitives/tools/results/base.py diff --git a/dash/mcp/primitives/tools/results/__init__.py b/dash/mcp/primitives/tools/results/__init__.py index ed21178c0a..c0232d6028 100644 --- a/dash/mcp/primitives/tools/results/__init__.py +++ b/dash/mcp/primitives/tools/results/__init__.py @@ -1,10 +1,7 @@ """Tool result formatting for MCP tools/call responses. -Each result formatter shares the same signature: -``(output: MCPOutput, value: Any) -> list[TextContent | ImageContent]`` - -Formatters decide for themselves whether they care about a given output. -The structuredContent is always the full dispatch response. +Each formatter is a ``ResultFormatter`` subclass that can enrich +a tool result with additional content. All formatters are accumulated. """ from __future__ import annotations @@ -17,12 +14,13 @@ from dash.types import CallbackExecutionResponse from dash.mcp.primitives.tools.callback_adapter import CallbackAdapter -from .result_dataframe import dataframe_result -from .result_plotly_figure import plotly_figure_result +from .base import ResultFormatter +from .result_dataframe import DataFrameResult +from .result_plotly_figure import PlotlyFigureResult -_RESULT_FORMATTERS = [ - plotly_figure_result, - dataframe_result, +_RESULT_FORMATTERS: list[type[ResultFormatter]] = [ + PlotlyFigureResult, + DataFrameResult, ] @@ -30,7 +28,7 @@ def format_callback_response( response: CallbackExecutionResponse, callback: CallbackAdapter, ) -> CallToolResult: - """Format a dispatch response as a CallToolResult. + """Format a callback response as a CallToolResult. The response is always returned as structuredContent. Result formatters are called per output property and may add additional @@ -43,8 +41,8 @@ def format_callback_response( resp = response.get("response") or {} for callback_output in callback.outputs: value = resp.get(callback_output["component_id"], {}).get(callback_output["property"]) - for result_fn in _RESULT_FORMATTERS: - content.extend(result_fn(callback_output, value)) + for formatter in _RESULT_FORMATTERS: + content.extend(formatter.format(callback_output, value)) return CallToolResult( content=content, diff --git a/dash/mcp/primitives/tools/results/base.py b/dash/mcp/primitives/tools/results/base.py new file mode 100644 index 0000000000..1f7714ff6b --- /dev/null +++ b/dash/mcp/primitives/tools/results/base.py @@ -0,0 +1,24 @@ +"""Base class for result formatters.""" + +from __future__ import annotations + +from typing import Any + +from mcp.types import ImageContent, TextContent + +from dash.mcp.types import MCPOutput + + +class ResultFormatter: + """A formatter that can enrich an MCP tool result with additional content. + + Subclasses implement ``format`` to return content items (text, images) + for a specific callback output. All formatters are accumulated — every + formatter can add content to the overall tool result. + """ + + @classmethod + def format( + cls, output: MCPOutput, returned_output_value: Any + ) -> list[TextContent | ImageContent]: + raise NotImplementedError diff --git a/dash/mcp/primitives/tools/results/result_dataframe.py b/dash/mcp/primitives/tools/results/result_dataframe.py index 652c31589b..b7113f5d82 100644 --- a/dash/mcp/primitives/tools/results/result_dataframe.py +++ b/dash/mcp/primitives/tools/results/result_dataframe.py @@ -9,10 +9,12 @@ from typing import Any -from mcp.types import TextContent +from mcp.types import ImageContent, TextContent from dash.mcp.types import MCPOutput +from .base import ResultFormatter + MAX_ROWS = 50 _TABULAR_PROPS = { @@ -45,11 +47,20 @@ def _to_markdown_table(rows: list[dict], max_rows: int = MAX_ROWS) -> str: return "\n".join(lines) -def dataframe_result(callback_output: MCPOutput, callback_output_value: Any) -> list: +class DataFrameResult(ResultFormatter): """Produce a markdown table for tabular component output values.""" - key = (callback_output.get("component_type"), callback_output.get("property")) - if key not in _TABULAR_PROPS: - return [] - if not isinstance(callback_output_value, list) or not callback_output_value or not isinstance(callback_output_value[0], dict): - return [] - return [TextContent(type="text", text=_to_markdown_table(callback_output_value))] + + @classmethod + def format( + cls, output: MCPOutput, returned_output_value: Any + ) -> list[TextContent | ImageContent]: + key = (output.get("component_type"), output.get("property")) + if key not in _TABULAR_PROPS: + return [] + if ( + not isinstance(returned_output_value, list) + or not returned_output_value + or not isinstance(returned_output_value[0], dict) + ): + return [] + return [TextContent(type="text", text=_to_markdown_table(returned_output_value))] diff --git a/dash/mcp/primitives/tools/results/result_plotly_figure.py b/dash/mcp/primitives/tools/results/result_plotly_figure.py index d837e17eed..fff3a3de89 100644 --- a/dash/mcp/primitives/tools/results/result_plotly_figure.py +++ b/dash/mcp/primitives/tools/results/result_plotly_figure.py @@ -6,10 +6,12 @@ import logging from typing import Any -from mcp.types import ImageContent +from mcp.types import ImageContent, TextContent from dash.mcp.types import MCPOutput +from .base import ResultFormatter + logger = logging.getLogger(__name__) IMAGE_WIDTH = 700 @@ -35,18 +37,23 @@ def _render_image(figure: Any) -> ImageContent | None: return ImageContent(type="image", data=b64, mimeType="image/png") -def plotly_figure_result(callback_output: MCPOutput, callback_output_value: Any) -> list: +class PlotlyFigureResult(ResultFormatter): """Produce a rendered PNG for Graph.figure output values.""" - if callback_output.get("component_type") != "Graph" or callback_output.get("property") != "figure": - return [] - if not isinstance(callback_output_value, dict): - return [] - - try: - import plotly.graph_objects as go - except ImportError: - return [] - fig = go.Figure(callback_output_value) - image = _render_image(fig) - return [image] if image is not None else [] + @classmethod + def format( + cls, output: MCPOutput, returned_output_value: Any + ) -> list[TextContent | ImageContent]: + if output.get("component_type") != "Graph" or output.get("property") != "figure": + return [] + if not isinstance(returned_output_value, dict): + return [] + + try: + import plotly.graph_objects as go + except ImportError: + return [] + + fig = go.Figure(returned_output_value) + image = _render_image(fig) + return [image] if image is not None else [] diff --git a/tests/unit/mcp/tools/results/test_dataframe.py b/tests/unit/mcp/tools/results/test_dataframe.py index a7f9e42fca..65aef74d31 100644 --- a/tests/unit/mcp/tools/results/test_dataframe.py +++ b/tests/unit/mcp/tools/results/test_dataframe.py @@ -2,7 +2,7 @@ from dash.mcp.primitives.tools.results.result_dataframe import ( MAX_ROWS, - dataframe_result, + DataFrameResult, ) EXPECTED_TABLE = ( @@ -37,26 +37,26 @@ class TestDataframeResult: def test_datatable_data_renders_markdown(self): - result = dataframe_result(DATATABLE_OUTPUT, SAMPLE_ROWS) + result = DataFrameResult.format(DATATABLE_OUTPUT, SAMPLE_ROWS) assert len(result) == 1 assert result[0].text == EXPECTED_TABLE def test_aggrid_rowdata_renders_markdown(self): - result = dataframe_result(AGGRID_OUTPUT, SAMPLE_ROWS) + result = DataFrameResult.format(AGGRID_OUTPUT, SAMPLE_ROWS) assert len(result) == 1 assert result[0].text == EXPECTED_TABLE def test_ignores_non_tabular_props(self): non_tabular = {**DATATABLE_OUTPUT, "property": "columns"} - assert dataframe_result(non_tabular, SAMPLE_ROWS) == [] + assert DataFrameResult.format(non_tabular, SAMPLE_ROWS) == [] def test_ignores_empty_or_non_dict_rows(self): - assert dataframe_result(DATATABLE_OUTPUT, []) == [] - assert dataframe_result(DATATABLE_OUTPUT, ["a", "b"]) == [] + assert DataFrameResult.format(DATATABLE_OUTPUT, []) == [] + assert DataFrameResult.format(DATATABLE_OUTPUT, ["a", "b"]) == [] def test_truncates_large_tables(self): rows = [{"i": n} for n in range(MAX_ROWS + 50)] - result = dataframe_result(DATATABLE_OUTPUT, rows) + result = DataFrameResult.format(DATATABLE_OUTPUT, rows) text = result[0].text assert f"| {MAX_ROWS - 1} |" in text assert f"| {MAX_ROWS} |" not in text diff --git a/tests/unit/mcp/tools/results/test_plotly_figure.py b/tests/unit/mcp/tools/results/test_plotly_figure.py index 8e336ba687..e3c42af303 100644 --- a/tests/unit/mcp/tools/results/test_plotly_figure.py +++ b/tests/unit/mcp/tools/results/test_plotly_figure.py @@ -6,7 +6,7 @@ import pytest from dash.mcp.primitives.tools.results.result_plotly_figure import ( - plotly_figure_result, + PlotlyFigureResult, ) go = pytest.importorskip("plotly.graph_objects") @@ -28,7 +28,7 @@ class TestPlotlyFigureResult: def test_returns_image_when_kaleido_available(self): fig_dict = go.Figure(data=[go.Bar(x=["A", "B"], y=[1, 2])]).to_plotly_json() with patch.object(go.Figure, "to_image", return_value=FAKE_PNG): - result = plotly_figure_result(GRAPH_FIGURE_OUTPUT, fig_dict) + result = PlotlyFigureResult.format(GRAPH_FIGURE_OUTPUT, fig_dict) assert len(result) == 1 assert result[0].type == "image" assert result[0].data == FAKE_B64 @@ -36,7 +36,7 @@ def test_returns_image_when_kaleido_available(self): def test_returns_empty_when_kaleido_unavailable(self): fig_dict = go.Figure(data=[go.Bar(x=["A", "B"], y=[1, 2])]).to_plotly_json() with patch.object(go.Figure, "to_image", side_effect=ImportError): - result = plotly_figure_result(GRAPH_FIGURE_OUTPUT, fig_dict) + result = PlotlyFigureResult.format(GRAPH_FIGURE_OUTPUT, fig_dict) assert result == [] def test_ignores_non_graph_components(self): @@ -45,11 +45,11 @@ def test_ignores_non_graph_components(self): "component_type": "Div", "property": "children", } - assert plotly_figure_result(output, {}) == [] + assert PlotlyFigureResult.format(output, {}) == [] def test_ignores_non_figure_props(self): output = {**GRAPH_FIGURE_OUTPUT, "property": "clickData"} - assert plotly_figure_result(output, {}) == [] + assert PlotlyFigureResult.format(output, {}) == [] def test_ignores_non_dict_values(self): - assert plotly_figure_result(GRAPH_FIGURE_OUTPUT, "not a dict") == [] + assert PlotlyFigureResult.format(GRAPH_FIGURE_OUTPUT, "not a dict") == [] From 92cf27b428120d0bf710028291ec6814a69da6ca Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 16 Apr 2026 17:19:34 -0600 Subject: [PATCH 038/103] lint --- dash/mcp/primitives/tools/results/__init__.py | 4 +++- dash/mcp/primitives/tools/results/result_dataframe.py | 4 +++- dash/mcp/primitives/tools/results/result_plotly_figure.py | 5 ++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/dash/mcp/primitives/tools/results/__init__.py b/dash/mcp/primitives/tools/results/__init__.py index c0232d6028..ae3517919c 100644 --- a/dash/mcp/primitives/tools/results/__init__.py +++ b/dash/mcp/primitives/tools/results/__init__.py @@ -40,7 +40,9 @@ def format_callback_response( resp = response.get("response") or {} for callback_output in callback.outputs: - value = resp.get(callback_output["component_id"], {}).get(callback_output["property"]) + value = resp.get(callback_output["component_id"], {}).get( + callback_output["property"] + ) for formatter in _RESULT_FORMATTERS: content.extend(formatter.format(callback_output, value)) diff --git a/dash/mcp/primitives/tools/results/result_dataframe.py b/dash/mcp/primitives/tools/results/result_dataframe.py index b7113f5d82..04b1d84b3e 100644 --- a/dash/mcp/primitives/tools/results/result_dataframe.py +++ b/dash/mcp/primitives/tools/results/result_dataframe.py @@ -63,4 +63,6 @@ def format( or not isinstance(returned_output_value[0], dict) ): return [] - return [TextContent(type="text", text=_to_markdown_table(returned_output_value))] + return [ + TextContent(type="text", text=_to_markdown_table(returned_output_value)) + ] diff --git a/dash/mcp/primitives/tools/results/result_plotly_figure.py b/dash/mcp/primitives/tools/results/result_plotly_figure.py index fff3a3de89..ad2c057f89 100644 --- a/dash/mcp/primitives/tools/results/result_plotly_figure.py +++ b/dash/mcp/primitives/tools/results/result_plotly_figure.py @@ -44,7 +44,10 @@ class PlotlyFigureResult(ResultFormatter): def format( cls, output: MCPOutput, returned_output_value: Any ) -> list[TextContent | ImageContent]: - if output.get("component_type") != "Graph" or output.get("property") != "figure": + if ( + output.get("component_type") != "Graph" + or output.get("property") != "figure" + ): return [] if not isinstance(returned_output_value, dict): return [] From 13d0fbfefec3b4f0b816a625b3c9a17afa2fd331 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 22 Apr 2026 15:31:11 -0600 Subject: [PATCH 039/103] Make import top-level --- dash/mcp/primitives/tools/results/result_plotly_figure.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/dash/mcp/primitives/tools/results/result_plotly_figure.py b/dash/mcp/primitives/tools/results/result_plotly_figure.py index ad2c057f89..d3b98376f9 100644 --- a/dash/mcp/primitives/tools/results/result_plotly_figure.py +++ b/dash/mcp/primitives/tools/results/result_plotly_figure.py @@ -6,6 +6,7 @@ import logging from typing import Any +import plotly.graph_objects as go from mcp.types import ImageContent, TextContent from dash.mcp.types import MCPOutput @@ -52,11 +53,6 @@ def format( if not isinstance(returned_output_value, dict): return [] - try: - import plotly.graph_objects as go - except ImportError: - return [] - fig = go.Figure(returned_output_value) image = _render_image(fig) return [image] if image is not None else [] From ef8fc34cbbb82f3eadbd47b1c71faa2cde2c4896 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 23 Apr 2026 14:13:52 -0600 Subject: [PATCH 040/103] Refactor unit tests to conform to existing test patterns --- .../tools/results/test_callback_response.py | 98 ------- .../unit/mcp/tools/results/test_dataframe.py | 63 ----- .../mcp/tools/results/test_plotly_figure.py | 55 ---- .../test_mcp_formatted_output_results.py | 240 ++++++++++++++++++ 4 files changed, 240 insertions(+), 216 deletions(-) delete mode 100644 tests/unit/mcp/tools/results/test_callback_response.py delete mode 100644 tests/unit/mcp/tools/results/test_dataframe.py delete mode 100644 tests/unit/mcp/tools/results/test_plotly_figure.py create mode 100644 tests/unit/mcp/tools/test_mcp_formatted_output_results.py diff --git a/tests/unit/mcp/tools/results/test_callback_response.py b/tests/unit/mcp/tools/results/test_callback_response.py deleted file mode 100644 index ff8cca5e20..0000000000 --- a/tests/unit/mcp/tools/results/test_callback_response.py +++ /dev/null @@ -1,98 +0,0 @@ -"""Tests for the callback response formatter.""" - -from unittest.mock import Mock - -from dash.mcp.primitives.tools.results import format_callback_response - - -def _mock_callback(outputs=None): - cb = Mock() - cb.outputs = outputs or [] - return cb - - -class TestFormatCallbackResponse: - def test_wraps_as_structured_content(self): - response = { - "multi": True, - "response": {"out": {"children": "hello"}}, - } - result = format_callback_response(response, _mock_callback()) - assert result.structuredContent == response - - def test_content_has_json_text_fallback(self): - """Per MCP spec, structuredContent SHOULD include a TextContent fallback.""" - response = {"multi": True, "response": {}} - result = format_callback_response(response, _mock_callback()) - assert len(result.content) >= 1 - assert result.content[0].type == "text" - assert '"multi": true' in result.content[0].text - - def test_is_error_defaults_false(self): - response = {"multi": True, "response": {}} - result = format_callback_response(response, _mock_callback()) - assert result.isError is False - - def test_preserves_side_update(self): - response = { - "multi": True, - "response": {"out": {"children": "x"}}, - "sideUpdate": {"other": {"value": 42}}, - } - result = format_callback_response(response, _mock_callback()) - assert result.structuredContent["sideUpdate"] == {"other": {"value": 42}} - - def test_datatable_result_includes_markdown_table(self): - response = { - "multi": True, - "response": { - "my-table": {"data": [{"name": "Alice", "age": 30}]}, - }, - } - outputs = [ - { - "component_id": "my-table", - "component_type": "DataTable", - "property": "data", - "id_and_prop": "my-table.data", - "initial_value": None, - "tool_name": "update", - } - ] - result = format_callback_response(response, _mock_callback(outputs)) - texts = [c.text for c in result.content if c.type == "text"] - assert any("| name | age |" in t for t in texts) - - def test_plotly_figure_includes_image(self): - from unittest.mock import patch - - try: - import plotly.graph_objects as go - except ImportError: - return - - response = { - "multi": True, - "response": { - "my-graph": { - "figure": { - "data": [{"type": "bar", "x": ["A"], "y": [1]}], - "layout": {}, - } - } - }, - } - outputs = [ - { - "component_id": "my-graph", - "component_type": "Graph", - "property": "figure", - "id_and_prop": "my-graph.figure", - "initial_value": None, - "tool_name": "update", - } - ] - with patch.object(go.Figure, "to_image", return_value=b"\x89PNGfake"): - result = format_callback_response(response, _mock_callback(outputs)) - images = [c for c in result.content if c.type == "image"] - assert len(images) == 1 diff --git a/tests/unit/mcp/tools/results/test_dataframe.py b/tests/unit/mcp/tools/results/test_dataframe.py deleted file mode 100644 index 65aef74d31..0000000000 --- a/tests/unit/mcp/tools/results/test_dataframe.py +++ /dev/null @@ -1,63 +0,0 @@ -"""Tests for the tabular data result formatter.""" - -from dash.mcp.primitives.tools.results.result_dataframe import ( - MAX_ROWS, - DataFrameResult, -) - -EXPECTED_TABLE = ( - "*2 rows \u00d7 2 columns*\n" - "\n" - "| name | age |\n" - "| --- | --- |\n" - "| Alice | 30 |\n" - "| Bob | 25 |" -) - -SAMPLE_ROWS = [{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}] - -DATATABLE_OUTPUT = { - "component_type": "DataTable", - "property": "data", - "component_id": "t", - "id_and_prop": "t.data", - "initial_value": None, - "tool_name": "update", -} - -AGGRID_OUTPUT = { - "component_type": "AgGrid", - "property": "rowData", - "component_id": "g", - "id_and_prop": "g.rowData", - "initial_value": None, - "tool_name": "update", -} - - -class TestDataframeResult: - def test_datatable_data_renders_markdown(self): - result = DataFrameResult.format(DATATABLE_OUTPUT, SAMPLE_ROWS) - assert len(result) == 1 - assert result[0].text == EXPECTED_TABLE - - def test_aggrid_rowdata_renders_markdown(self): - result = DataFrameResult.format(AGGRID_OUTPUT, SAMPLE_ROWS) - assert len(result) == 1 - assert result[0].text == EXPECTED_TABLE - - def test_ignores_non_tabular_props(self): - non_tabular = {**DATATABLE_OUTPUT, "property": "columns"} - assert DataFrameResult.format(non_tabular, SAMPLE_ROWS) == [] - - def test_ignores_empty_or_non_dict_rows(self): - assert DataFrameResult.format(DATATABLE_OUTPUT, []) == [] - assert DataFrameResult.format(DATATABLE_OUTPUT, ["a", "b"]) == [] - - def test_truncates_large_tables(self): - rows = [{"i": n} for n in range(MAX_ROWS + 50)] - result = DataFrameResult.format(DATATABLE_OUTPUT, rows) - text = result[0].text - assert f"| {MAX_ROWS - 1} |" in text - assert f"| {MAX_ROWS} |" not in text - assert "50 more rows" in text diff --git a/tests/unit/mcp/tools/results/test_plotly_figure.py b/tests/unit/mcp/tools/results/test_plotly_figure.py deleted file mode 100644 index e3c42af303..0000000000 --- a/tests/unit/mcp/tools/results/test_plotly_figure.py +++ /dev/null @@ -1,55 +0,0 @@ -"""Tests for the Plotly figure tool result formatter.""" - -import base64 -from unittest.mock import patch - -import pytest - -from dash.mcp.primitives.tools.results.result_plotly_figure import ( - PlotlyFigureResult, -) - -go = pytest.importorskip("plotly.graph_objects") - -FAKE_PNG = b"\x89PNG\r\n\x1a\nfakedata" -FAKE_B64 = base64.b64encode(FAKE_PNG).decode("ascii") - -GRAPH_FIGURE_OUTPUT = { - "component_type": "Graph", - "property": "figure", - "component_id": "g", - "id_and_prop": "g.figure", - "initial_value": None, - "tool_name": "update", -} - - -class TestPlotlyFigureResult: - def test_returns_image_when_kaleido_available(self): - fig_dict = go.Figure(data=[go.Bar(x=["A", "B"], y=[1, 2])]).to_plotly_json() - with patch.object(go.Figure, "to_image", return_value=FAKE_PNG): - result = PlotlyFigureResult.format(GRAPH_FIGURE_OUTPUT, fig_dict) - assert len(result) == 1 - assert result[0].type == "image" - assert result[0].data == FAKE_B64 - - def test_returns_empty_when_kaleido_unavailable(self): - fig_dict = go.Figure(data=[go.Bar(x=["A", "B"], y=[1, 2])]).to_plotly_json() - with patch.object(go.Figure, "to_image", side_effect=ImportError): - result = PlotlyFigureResult.format(GRAPH_FIGURE_OUTPUT, fig_dict) - assert result == [] - - def test_ignores_non_graph_components(self): - output = { - **GRAPH_FIGURE_OUTPUT, - "component_type": "Div", - "property": "children", - } - assert PlotlyFigureResult.format(output, {}) == [] - - def test_ignores_non_figure_props(self): - output = {**GRAPH_FIGURE_OUTPUT, "property": "clickData"} - assert PlotlyFigureResult.format(output, {}) == [] - - def test_ignores_non_dict_values(self): - assert PlotlyFigureResult.format(GRAPH_FIGURE_OUTPUT, "not a dict") == [] diff --git a/tests/unit/mcp/tools/test_mcp_formatted_output_results.py b/tests/unit/mcp/tools/test_mcp_formatted_output_results.py new file mode 100644 index 0000000000..c255e9ba5c --- /dev/null +++ b/tests/unit/mcp/tools/test_mcp_formatted_output_results.py @@ -0,0 +1,240 @@ +"""Formatted tool-output results: structured content + text/image fallbacks. + +Covers: +- ``format_callback_response`` — wraps the callback result as + ``structuredContent`` and delegates to per-output formatters. +- ``DataFrameResult`` — renders DataTable/AgGrid rows as markdown tables. +- ``PlotlyFigureResult`` — renders ``dcc.Graph.figure`` values as PNG images + (via kaleido; skipped gracefully when kaleido is unavailable). +""" + +import base64 +from unittest.mock import Mock, patch + +import plotly.graph_objects as go # type: ignore[import-untyped] + +from dash.mcp.primitives.tools.results import format_callback_response +from dash.mcp.primitives.tools.results.result_dataframe import ( + MAX_ROWS, + DataFrameResult, +) +from dash.mcp.primitives.tools.results.result_plotly_figure import ( + PlotlyFigureResult, +) + + +# --------------------------------------------------------------------------- +# Helpers / fixtures +# --------------------------------------------------------------------------- + + +def _mock_callback(outputs=None): + cb = Mock() + cb.outputs = outputs or [] + return cb + + +EXPECTED_TABLE = ( + "*2 rows \u00d7 2 columns*\n" + "\n" + "| name | age |\n" + "| --- | --- |\n" + "| Alice | 30 |\n" + "| Bob | 25 |" +) + +SAMPLE_ROWS = [{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}] + +DATATABLE_OUTPUT = { + "component_type": "DataTable", + "property": "data", + "component_id": "t", + "id_and_prop": "t.data", + "initial_value": None, + "tool_name": "update", +} + +AGGRID_OUTPUT = { + "component_type": "AgGrid", + "property": "rowData", + "component_id": "g", + "id_and_prop": "g.rowData", + "initial_value": None, + "tool_name": "update", +} + +FAKE_PNG = b"\x89PNG\r\n\x1a\nfakedata" +FAKE_B64 = base64.b64encode(FAKE_PNG).decode("ascii") + +GRAPH_FIGURE_OUTPUT = { + "component_type": "Graph", + "property": "figure", + "component_id": "g", + "id_and_prop": "g.figure", + "initial_value": None, + "tool_name": "update", +} + + +# --------------------------------------------------------------------------- +# format_callback_response +# --------------------------------------------------------------------------- + + +def test_mcpr001_wraps_as_structured_content(): + response = { + "multi": True, + "response": {"out": {"children": "hello"}}, + } + result = format_callback_response(response, _mock_callback()) + assert result.structuredContent == response + + +def test_mcpr002_content_has_json_text_fallback(): + """Per MCP spec, structuredContent SHOULD include a TextContent fallback.""" + response = {"multi": True, "response": {}} + result = format_callback_response(response, _mock_callback()) + assert len(result.content) >= 1 + assert result.content[0].type == "text" + assert '"multi": true' in result.content[0].text + + +def test_mcpr003_is_error_defaults_false(): + response = {"multi": True, "response": {}} + result = format_callback_response(response, _mock_callback()) + assert result.isError is False + + +def test_mcpr004_preserves_side_update(): + response = { + "multi": True, + "response": {"out": {"children": "x"}}, + "sideUpdate": {"other": {"value": 42}}, + } + result = format_callback_response(response, _mock_callback()) + assert result.structuredContent["sideUpdate"] == {"other": {"value": 42}} + + +def test_mcpr005_datatable_result_includes_markdown_table(): + response = { + "multi": True, + "response": { + "my-table": {"data": [{"name": "Alice", "age": 30}]}, + }, + } + outputs = [ + { + "component_id": "my-table", + "component_type": "DataTable", + "property": "data", + "id_and_prop": "my-table.data", + "initial_value": None, + "tool_name": "update", + } + ] + result = format_callback_response(response, _mock_callback(outputs)) + texts = [c.text for c in result.content if c.type == "text"] + assert any("| name | age |" in t for t in texts) + + +def test_mcpr006_plotly_figure_includes_image(): + response = { + "multi": True, + "response": { + "my-graph": { + "figure": { + "data": [{"type": "bar", "x": ["A"], "y": [1]}], + "layout": {}, + } + } + }, + } + outputs = [ + { + "component_id": "my-graph", + "component_type": "Graph", + "property": "figure", + "id_and_prop": "my-graph.figure", + "initial_value": None, + "tool_name": "update", + } + ] + with patch.object(go.Figure, "to_image", return_value=b"\x89PNGfake"): + result = format_callback_response(response, _mock_callback(outputs)) + images = [c for c in result.content if c.type == "image"] + assert len(images) == 1 + + +# --------------------------------------------------------------------------- +# DataFrameResult (DataTable / AgGrid markdown rendering) +# --------------------------------------------------------------------------- + + +def test_mcpr007_datatable_data_renders_markdown(): + result = DataFrameResult.format(DATATABLE_OUTPUT, SAMPLE_ROWS) + assert len(result) == 1 + assert result[0].text == EXPECTED_TABLE + + +def test_mcpr008_aggrid_rowdata_renders_markdown(): + result = DataFrameResult.format(AGGRID_OUTPUT, SAMPLE_ROWS) + assert len(result) == 1 + assert result[0].text == EXPECTED_TABLE + + +def test_mcpr009_ignores_non_tabular_props(): + non_tabular = {**DATATABLE_OUTPUT, "property": "columns"} + assert DataFrameResult.format(non_tabular, SAMPLE_ROWS) == [] + + +def test_mcpr010_ignores_empty_or_non_dict_rows(): + assert DataFrameResult.format(DATATABLE_OUTPUT, []) == [] + assert DataFrameResult.format(DATATABLE_OUTPUT, ["a", "b"]) == [] + + +def test_mcpr011_truncates_large_tables(): + rows = [{"i": n} for n in range(MAX_ROWS + 50)] + result = DataFrameResult.format(DATATABLE_OUTPUT, rows) + text = result[0].text + assert f"| {MAX_ROWS - 1} |" in text + assert f"| {MAX_ROWS} |" not in text + assert "50 more rows" in text + + +# --------------------------------------------------------------------------- +# PlotlyFigureResult (Graph.figure → PNG image) +# --------------------------------------------------------------------------- + + +def test_mcpr012_returns_image_when_kaleido_available(): + fig_dict = go.Figure(data=[go.Bar(x=["A", "B"], y=[1, 2])]).to_plotly_json() + with patch.object(go.Figure, "to_image", return_value=FAKE_PNG): + result = PlotlyFigureResult.format(GRAPH_FIGURE_OUTPUT, fig_dict) + assert len(result) == 1 + assert result[0].type == "image" + assert result[0].data == FAKE_B64 + + +def test_mcpr013_returns_empty_when_kaleido_unavailable(): + fig_dict = go.Figure(data=[go.Bar(x=["A", "B"], y=[1, 2])]).to_plotly_json() + with patch.object(go.Figure, "to_image", side_effect=ImportError): + result = PlotlyFigureResult.format(GRAPH_FIGURE_OUTPUT, fig_dict) + assert result == [] + + +def test_mcpr014_ignores_non_graph_components(): + output = { + **GRAPH_FIGURE_OUTPUT, + "component_type": "Div", + "property": "children", + } + assert PlotlyFigureResult.format(output, {}) == [] + + +def test_mcpr015_ignores_non_figure_props(): + output = {**GRAPH_FIGURE_OUTPUT, "property": "clickData"} + assert PlotlyFigureResult.format(output, {}) == [] + + +def test_mcpr016_ignores_non_dict_values(): + assert PlotlyFigureResult.format(GRAPH_FIGURE_OUTPUT, "not a dict") == [] From 88589cbfd178c22df79f035c92c7f61a671efec4 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 30 Apr 2026 09:20:37 -0600 Subject: [PATCH 041/103] Use TABULAR/PLOTLY_FIGURE PropRole.matches() in formatters --- dash/mcp/primitives/tools/prop_roles.py | 2 +- dash/mcp/primitives/tools/results/result_dataframe.py | 9 ++------- .../mcp/primitives/tools/results/result_plotly_figure.py | 6 +++--- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/dash/mcp/primitives/tools/prop_roles.py b/dash/mcp/primitives/tools/prop_roles.py index eface31147..64fdc8f76d 100644 --- a/dash/mcp/primitives/tools/prop_roles.py +++ b/dash/mcp/primitives/tools/prop_roles.py @@ -100,7 +100,7 @@ def _compute_dropdown_value_schema(param: MCPInput) -> dict[str, Any]: description="Returns formatted text", ) -GENERIC_FIGURE = PropRole( +PLOTLY_FIGURE = PropRole( identifiers={(ANY_COMPONENT, "figure")}, description="Returns chart/visualization data", input_schema={ diff --git a/dash/mcp/primitives/tools/results/result_dataframe.py b/dash/mcp/primitives/tools/results/result_dataframe.py index 04b1d84b3e..1d93ca74aa 100644 --- a/dash/mcp/primitives/tools/results/result_dataframe.py +++ b/dash/mcp/primitives/tools/results/result_dataframe.py @@ -13,15 +13,11 @@ from dash.mcp.types import MCPOutput +from ..prop_roles import TABULAR from .base import ResultFormatter MAX_ROWS = 50 -_TABULAR_PROPS = { - ("DataTable", "data"), - ("AgGrid", "rowData"), -} - def _to_markdown_table(rows: list[dict], max_rows: int = MAX_ROWS) -> str: """Render a list of row dicts as a markdown table.""" @@ -54,8 +50,7 @@ class DataFrameResult(ResultFormatter): def format( cls, output: MCPOutput, returned_output_value: Any ) -> list[TextContent | ImageContent]: - key = (output.get("component_type"), output.get("property")) - if key not in _TABULAR_PROPS: + if not TABULAR.matches(output.get("component_type"), output.get("property")): return [] if ( not isinstance(returned_output_value, list) diff --git a/dash/mcp/primitives/tools/results/result_plotly_figure.py b/dash/mcp/primitives/tools/results/result_plotly_figure.py index d3b98376f9..4a62131573 100644 --- a/dash/mcp/primitives/tools/results/result_plotly_figure.py +++ b/dash/mcp/primitives/tools/results/result_plotly_figure.py @@ -11,6 +11,7 @@ from dash.mcp.types import MCPOutput +from ..prop_roles import PLOTLY_FIGURE from .base import ResultFormatter logger = logging.getLogger(__name__) @@ -45,9 +46,8 @@ class PlotlyFigureResult(ResultFormatter): def format( cls, output: MCPOutput, returned_output_value: Any ) -> list[TextContent | ImageContent]: - if ( - output.get("component_type") != "Graph" - or output.get("property") != "figure" + if not PLOTLY_FIGURE.matches( + output.get("component_type"), output.get("property") ): return [] if not isinstance(returned_output_value, dict): From 55f6514b48a7cce05f3bfb6727559957ca8fbbd6 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 30 Apr 2026 10:02:11 -0600 Subject: [PATCH 042/103] Tighten formatter types: required-field access + plotly stub ignore --- dash/mcp/primitives/tools/results/result_dataframe.py | 2 +- dash/mcp/primitives/tools/results/result_plotly_figure.py | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/dash/mcp/primitives/tools/results/result_dataframe.py b/dash/mcp/primitives/tools/results/result_dataframe.py index 1d93ca74aa..66290791a9 100644 --- a/dash/mcp/primitives/tools/results/result_dataframe.py +++ b/dash/mcp/primitives/tools/results/result_dataframe.py @@ -50,7 +50,7 @@ class DataFrameResult(ResultFormatter): def format( cls, output: MCPOutput, returned_output_value: Any ) -> list[TextContent | ImageContent]: - if not TABULAR.matches(output.get("component_type"), output.get("property")): + if not TABULAR.matches(output.get("component_type"), output["property"]): return [] if ( not isinstance(returned_output_value, list) diff --git a/dash/mcp/primitives/tools/results/result_plotly_figure.py b/dash/mcp/primitives/tools/results/result_plotly_figure.py index 4a62131573..63e4adbb31 100644 --- a/dash/mcp/primitives/tools/results/result_plotly_figure.py +++ b/dash/mcp/primitives/tools/results/result_plotly_figure.py @@ -6,7 +6,7 @@ import logging from typing import Any -import plotly.graph_objects as go +import plotly.graph_objects as go # type: ignore[import-untyped] from mcp.types import ImageContent, TextContent from dash.mcp.types import MCPOutput @@ -46,9 +46,7 @@ class PlotlyFigureResult(ResultFormatter): def format( cls, output: MCPOutput, returned_output_value: Any ) -> list[TextContent | ImageContent]: - if not PLOTLY_FIGURE.matches( - output.get("component_type"), output.get("property") - ): + if not PLOTLY_FIGURE.matches(output.get("component_type"), output["property"]): return [] if not isinstance(returned_output_value, dict): return [] From 0be83d3f623e3d86c5b3792d6b23eb52fabe4a9f Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Fri, 8 May 2026 09:35:47 -0600 Subject: [PATCH 043/103] code review feedback --- .../tools/results/result_dataframe.py | 24 +++++++++---------- .../tools/results/result_plotly_figure.py | 5 ++-- .../test_mcp_formatted_output_results.py | 14 +++++------ 3 files changed, 21 insertions(+), 22 deletions(-) diff --git a/dash/mcp/primitives/tools/results/result_dataframe.py b/dash/mcp/primitives/tools/results/result_dataframe.py index 66290791a9..8a2130387c 100644 --- a/dash/mcp/primitives/tools/results/result_dataframe.py +++ b/dash/mcp/primitives/tools/results/result_dataframe.py @@ -9,7 +9,7 @@ from typing import Any -from mcp.types import ImageContent, TextContent +from mcp.types import TextContent from dash.mcp.types import MCPOutput @@ -22,23 +22,23 @@ def _to_markdown_table(rows: list[dict], max_rows: int = MAX_ROWS) -> str: """Render a list of row dicts as a markdown table.""" columns = list(rows[0].keys()) - total = len(rows) + total_rows = len(rows) lines: list[str] = [] - lines.append(f"*{total} rows \u00d7 {len(columns)} columns*") + lines.append(f"*{total_rows} rows \u00d7 {len(columns)} columns*") lines.append("") - lines.append("| " + " | ".join(columns) + " |") - lines.append("| " + " | ".join("---" for _ in columns) + " |") + lines.append(" | ".join(columns)) + lines.append(" | ".join("---" for _ in columns)) for row in rows[:max_rows]: cells = [ str(row.get(col, "")).replace("|", "\\|").replace("\n", " ") for col in columns ] - lines.append("| " + " | ".join(cells) + " |") + lines.append(" | ".join(cells)) - if total > max_rows: - lines.append(f"\n(\u2026 {total - max_rows} more rows)") + if total_rows > max_rows: + lines.append(f"\n(\u2026 {total_rows - max_rows} more rows)") return "\n".join(lines) @@ -47,14 +47,12 @@ class DataFrameResult(ResultFormatter): """Produce a markdown table for tabular component output values.""" @classmethod - def format( - cls, output: MCPOutput, returned_output_value: Any - ) -> list[TextContent | ImageContent]: + def format(cls, output: MCPOutput, returned_output_value: Any) -> list[TextContent]: if not TABULAR.matches(output.get("component_type"), output["property"]): return [] if ( - not isinstance(returned_output_value, list) - or not returned_output_value + not returned_output_value + or not isinstance(returned_output_value, list) or not isinstance(returned_output_value[0], dict) ): return [] diff --git a/dash/mcp/primitives/tools/results/result_plotly_figure.py b/dash/mcp/primitives/tools/results/result_plotly_figure.py index 63e4adbb31..b7f4273933 100644 --- a/dash/mcp/primitives/tools/results/result_plotly_figure.py +++ b/dash/mcp/primitives/tools/results/result_plotly_figure.py @@ -21,7 +21,8 @@ def _render_image(figure: Any) -> ImageContent | None: - """Render the figure as a base64 PNG ImageContent. + """ + Render the figure as a base64 PNG ImageContent. Returns None if kaleido is not installed. """ @@ -48,7 +49,7 @@ def format( ) -> list[TextContent | ImageContent]: if not PLOTLY_FIGURE.matches(output.get("component_type"), output["property"]): return [] - if not isinstance(returned_output_value, dict): + if not returned_output_value or not isinstance(returned_output_value, dict): return [] fig = go.Figure(returned_output_value) diff --git a/tests/unit/mcp/tools/test_mcp_formatted_output_results.py b/tests/unit/mcp/tools/test_mcp_formatted_output_results.py index c255e9ba5c..da931009cd 100644 --- a/tests/unit/mcp/tools/test_mcp_formatted_output_results.py +++ b/tests/unit/mcp/tools/test_mcp_formatted_output_results.py @@ -37,10 +37,10 @@ def _mock_callback(outputs=None): EXPECTED_TABLE = ( "*2 rows \u00d7 2 columns*\n" "\n" - "| name | age |\n" - "| --- | --- |\n" - "| Alice | 30 |\n" - "| Bob | 25 |" + "name | age\n" + "--- | ---\n" + "Alice | 30\n" + "Bob | 25" ) SAMPLE_ROWS = [{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}] @@ -134,7 +134,7 @@ def test_mcpr005_datatable_result_includes_markdown_table(): ] result = format_callback_response(response, _mock_callback(outputs)) texts = [c.text for c in result.content if c.type == "text"] - assert any("| name | age |" in t for t in texts) + assert any("name | age" in t for t in texts) def test_mcpr006_plotly_figure_includes_image(): @@ -196,8 +196,8 @@ def test_mcpr011_truncates_large_tables(): rows = [{"i": n} for n in range(MAX_ROWS + 50)] result = DataFrameResult.format(DATATABLE_OUTPUT, rows) text = result[0].text - assert f"| {MAX_ROWS - 1} |" in text - assert f"| {MAX_ROWS} |" not in text + assert f"\n{MAX_ROWS - 1}\n" in text + assert f"\n{MAX_ROWS}\n" not in text assert "50 more rows" in text From bcc86c80e2432ccd2392b905d449aee9e4da07f1 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 1 Apr 2026 15:02:04 -0600 Subject: [PATCH 044/103] Add get_dash_component tool and callback tool dispatch pipeline --- dash/mcp/primitives/tools/__init__.py | 43 ++++++ .../tools/tool_get_dash_component.py | 123 ++++++++++++++++ dash/mcp/primitives/tools/tools_callbacks.py | 47 ++++++ tests/unit/mcp/conftest.py | 12 +- .../mcp/tools/test_tool_get_dash_component.py | 117 +++++++++++++++ tests/unit/mcp/tools/test_tools_callbacks.py | 137 ++++++++++++++++++ 6 files changed, 477 insertions(+), 2 deletions(-) create mode 100644 dash/mcp/primitives/tools/tool_get_dash_component.py create mode 100644 dash/mcp/primitives/tools/tools_callbacks.py create mode 100644 tests/unit/mcp/tools/test_tool_get_dash_component.py create mode 100644 tests/unit/mcp/tools/test_tools_callbacks.py diff --git a/dash/mcp/primitives/tools/__init__.py b/dash/mcp/primitives/tools/__init__.py index e69de29bb2..64f89dc3d0 100644 --- a/dash/mcp/primitives/tools/__init__.py +++ b/dash/mcp/primitives/tools/__init__.py @@ -0,0 +1,43 @@ +"""MCP tool listing and call handling. + +Each tool module exports: +- ``get_tool_names() -> set[str]`` +- ``get_tools() -> list[Tool]`` +- ``call_tool(tool_name, arguments) -> CallToolResult`` + +The __init__ assembles the list and dispatches calls by name. +""" + +from __future__ import annotations + +from typing import Any + +from mcp.types import CallToolResult, ListToolsResult + +from dash.mcp.types import ToolNotFoundError + +from . import tool_get_dash_component as _get_component +from . import tools_callbacks as _callbacks + +_TOOL_MODULES = [_callbacks, _get_component] + + +def list_tools() -> ListToolsResult: + """Build the MCP tools/list response.""" + tools = [] + for mod in _TOOL_MODULES: + tools.extend(mod.get_tools()) + return ListToolsResult(tools=tools) + + +def call_tool(tool_name: str, arguments: dict[str, Any]) -> CallToolResult: + """Dispatch a tools/call request by tool name.""" + for mod in _TOOL_MODULES: + if tool_name in mod.get_tool_names(): + result = mod.call_tool(tool_name, arguments) + return result + raise ToolNotFoundError( + f"Tool not found: {tool_name}." + " The app's callbacks may have changed." + " Please call tools/list to refresh your tool list." + ) diff --git a/dash/mcp/primitives/tools/tool_get_dash_component.py b/dash/mcp/primitives/tools/tool_get_dash_component.py new file mode 100644 index 0000000000..8584242333 --- /dev/null +++ b/dash/mcp/primitives/tools/tool_get_dash_component.py @@ -0,0 +1,123 @@ +"""Built-in tool: get_dash_component.""" + +from __future__ import annotations + +import json +from typing import Any + +from mcp.types import CallToolResult, TextContent, Tool +from pydantic import Field, TypeAdapter +from typing_extensions import Annotated, NotRequired, TypedDict + +from dash import get_app +from dash._layout_utils import find_component +from dash.mcp.types import ComponentPropertyInfo, ComponentQueryResult + + +class _ComponentQueryInput(TypedDict): + component_id: Annotated[str, Field(description="The component ID to query")] + property: NotRequired[ + Annotated[ + str, + Field( + description="The property name to read (e.g. 'options', 'value'). Omit to list all defined properties." + ), + ] + ] + + +_INPUT_SCHEMA = TypeAdapter(_ComponentQueryInput).json_schema() +_OUTPUT_SCHEMA = TypeAdapter(ComponentQueryResult).json_schema() + +NAME = "get_dash_component" + + +def get_tool_names() -> set[str]: + return {NAME} + + +def get_tools() -> list[Tool]: + return [_build_tool()] + + +def _build_tool() -> Tool: + return Tool( + name=NAME, + description=( + "Get a component's properties, values, and tool relationships. " + "If property is omitted, returns all defined properties. " + "If property is specified, returns only that property. " + "See the dash://components resource for available component IDs." + ), + inputSchema=_INPUT_SCHEMA, + outputSchema=_OUTPUT_SCHEMA, + ) + + +def call_tool(tool_name: str, arguments: dict[str, Any]) -> CallToolResult: + comp_id = arguments.get("component_id", "") + if not comp_id: + raise ValueError("component_id is required") + + prop_filter = arguments.get("property", "") + component = find_component(comp_id) + + if component is None: + callback_map = get_app().mcp_callback_map + rendering_tools = [ + cb.tool_name + for cb in callback_map + if any(out["component_id"] == comp_id for out in cb.outputs) + ] + msg = f"Component '{comp_id}' not found in static layout." + if rendering_tools: + msg += f" However, the following tools would modify it: {rendering_tools}." + msg += " Use the dash://components resource to see statically available component IDs." + return CallToolResult( + content=[TextContent(type="text", text=msg)], + isError=True, + ) + + callback_map = get_app().mcp_callback_map + + properties: dict[str, ComponentPropertyInfo] = {} + for prop_name in getattr(component, "_prop_names", []): + if prop_filter and prop_name != prop_filter: + continue + + value = callback_map.get_initial_value(f"{comp_id}.{prop_name}") + if value is None: + value = getattr(component, prop_name, None) + if value is None: + continue + + modified_by: list[str] = [] + input_to: list[str] = [] + id_and_prop = f"{comp_id}.{prop_name}" + for cb in callback_map: + for out in cb.outputs: + if out["id_and_prop"] == id_and_prop: + modified_by.append(cb.tool_name) + for inp in cb.inputs: + if inp["id_and_prop"] == id_and_prop: + input_to.append(cb.tool_name) + + properties[prop_name] = ComponentPropertyInfo( + initial_value=value, + modified_by_tool=modified_by, + input_to_tool=input_to, + ) + + labels = callback_map.component_label_map.get(comp_id, []) + + structured: ComponentQueryResult = ComponentQueryResult( + component_id=comp_id, + component_type=type(component).__name__, + label=labels if labels else None, + properties=properties, + ) + + return CallToolResult( + content=[TextContent(type="text", text=json.dumps(structured, default=str))], + structuredContent=structured, + ) diff --git a/dash/mcp/primitives/tools/tools_callbacks.py b/dash/mcp/primitives/tools/tools_callbacks.py new file mode 100644 index 0000000000..ba08795d35 --- /dev/null +++ b/dash/mcp/primitives/tools/tools_callbacks.py @@ -0,0 +1,47 @@ +"""Dynamic callback tools for MCP. + +Handles listing, naming, and executing callback-based tools. +""" + +from __future__ import annotations + +from typing import Any + +from mcp.types import CallToolResult, TextContent, Tool + +from dash import get_app +from dash.mcp.types import CallbackExecutionError, ToolNotFoundError + +from .results import format_callback_response + + +def get_tool_names() -> set[str]: + return get_app().mcp_callback_map.tool_names + + +def get_tools() -> list[Tool]: + """Return one Tool per server-callable callback.""" + return get_app().mcp_callback_map.as_mcp_tools() + + +def call_tool(tool_name: str, arguments: dict[str, Any]) -> CallToolResult: + """Execute a callback tool by name.""" + from .callback_utils import run_callback + + callback_map = get_app().mcp_callback_map + cb = callback_map.find_by_tool_name(tool_name) + if cb is None: + raise ToolNotFoundError( + f"Tool not found: {tool_name}." + " The app's callbacks may have changed." + " Please call tools/list to refresh your tool list." + ) + + try: + dispatch_response = run_callback(cb, arguments) + except CallbackExecutionError as e: + return CallToolResult( + content=[TextContent(type="text", text=str(e))], + isError=True, + ) + return format_callback_response(dispatch_response, cb) diff --git a/tests/unit/mcp/conftest.py b/tests/unit/mcp/conftest.py index 7f85e4af9d..38b2f8c00e 100644 --- a/tests/unit/mcp/conftest.py +++ b/tests/unit/mcp/conftest.py @@ -9,6 +9,7 @@ if sys.version_info < (3, 10): collect_ignore_glob.append("*") else: + from dash.mcp.primitives.tools import call_tool, list_tools # pylint: disable=wrong-import-position from dash.mcp.primitives.tools.callback_adapter_collection import ( # pylint: disable=wrong-import-position CallbackAdapterCollection, ) @@ -46,10 +47,10 @@ def update_output(value): def _tools_list(app): - """Return tools as Tool objects via as_mcp_tools().""" + """Return all tools (callbacks + builtins) as Tool objects.""" _setup_mcp(app) with app.server.test_request_context(): - return app.mcp_callback_map.as_mcp_tools() + return list_tools().tools def _user_tool(tools): @@ -85,3 +86,10 @@ def _desc_for(tool, param_name=None): if param_name is None: param_name = next(iter(props)) return props[param_name].get("description", "") + + +def _call_tool(app, tool_name, arguments=None): + """Call a tool via the dispatch pipeline and return the CallToolResult.""" + _setup_mcp(app) + with app.server.test_request_context(): + return call_tool(tool_name, arguments or {}) diff --git a/tests/unit/mcp/tools/test_tool_get_dash_component.py b/tests/unit/mcp/tools/test_tool_get_dash_component.py new file mode 100644 index 0000000000..5a8a454068 --- /dev/null +++ b/tests/unit/mcp/tools/test_tool_get_dash_component.py @@ -0,0 +1,117 @@ +"""Tests for the get_dash_component built-in tool.""" + +from dash import Dash, Input, Output, dcc, html + +from tests.unit.mcp.conftest import _call_tool, _make_app, _tools_list + + +class TestGetDashComponent: + def test_present_in_tools_list(self): + app = _make_app() + tool_names = [t.name for t in _tools_list(app)] + assert "get_dash_component" in tool_names + + def test_returns_structured_output_with_prop(self): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="my-dd", options=["a", "b"], value="b"), + ] + ) + + result = _call_tool( + app, + "get_dash_component", + { + "component_id": "my-dd", + "property": "value", + }, + ) + sc = result.structuredContent + assert sc["component_id"] == "my-dd" + assert sc["component_type"] == "Dropdown" + assert "value" in sc["properties"] + assert sc["properties"]["value"]["initial_value"] == "b" + assert "options" not in sc["properties"] + + def test_returns_all_props_without_property(self): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="my-dd", options=["a", "b"], value="b"), + ] + ) + + result = _call_tool( + app, + "get_dash_component", + { + "component_id": "my-dd", + }, + ) + sc = result.structuredContent + assert "options" in sc["properties"] + assert "value" in sc["properties"] + assert sc["properties"]["value"]["initial_value"] == "b" + + def test_includes_label(self): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Label("Pick one", htmlFor="my-dd"), + dcc.Dropdown(id="my-dd", options=["a", "b"], value="a"), + ] + ) + + @app.callback(Output("my-dd", "value"), Input("my-dd", "options")) + def noop(o): + return "a" + + result = _call_tool( + app, + "get_dash_component", + { + "component_id": "my-dd", + }, + ) + sc = result.structuredContent + assert sc["label"] == ["Pick one"] + + def test_includes_tool_references(self): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="dd", options=["a", "b"], value="a"), + html.Div(id="out"), + ] + ) + + @app.callback(Output("out", "children"), Input("dd", "value")) + def update(val): + return val + + result = _call_tool( + app, + "get_dash_component", + { + "component_id": "dd", + "property": "value", + }, + ) + prop_info = result.structuredContent["properties"]["value"] + assert "update" in prop_info["input_to_tool"] + + def test_missing_id_returns_hint(self): + app = _make_app() + result = _call_tool( + app, + "get_dash_component", + { + "component_id": "nonexistent", + "property": "value", + }, + ) + text = result.content[0].text + assert "nonexistent" in text + assert "not found" in text + assert "dash://components" in text diff --git a/tests/unit/mcp/tools/test_tools_callbacks.py b/tests/unit/mcp/tools/test_tools_callbacks.py new file mode 100644 index 0000000000..751f85bedd --- /dev/null +++ b/tests/unit/mcp/tools/test_tools_callbacks.py @@ -0,0 +1,137 @@ +"""Tool definition tests — MCP spec compliance and Dash conventions. + +Verifies that generated tools conform to the MCP specification (2025-11-25) +and Dash-specific conventions. Focuses on shape/structure, not inputSchema +values (those are covered by input_schemas/). + +Reference: https://modelcontextprotocol.io/specification/2025-11-25/server/tools +""" + +import re + +from dash.mcp.primitives.tools.callback_adapter_collection import ( + CallbackAdapterCollection, +) +from dash.mcp.primitives.tools.descriptions import build_tool_description + +from tests.unit.mcp.conftest import ( + _make_app, + _tools_list, +) + +_TOOL_NAME_RE = re.compile(r"^[A-Za-z0-9_\-.]+$") + + +class TestToolSpecCompliance: + """Every tool must conform to the MCP 2025-11-25 specification.""" + + def test_all_tools_conform_to_mcp_spec(self): + tools = _tools_list(_make_app()) + names = [t.name for t in tools] + + assert len(names) == len(set(names)), f"Duplicate tool names: {names}" + + for tool in tools: + assert tool.name + assert tool.inputSchema + assert 1 <= len(tool.name) <= 128 + assert _TOOL_NAME_RE.match(tool.name), f"Invalid tool name: {tool.name}" + + schema = tool.inputSchema + assert isinstance(schema, dict) + assert schema.get("type") == "object" + assert isinstance(schema.get("properties", {}), dict) + + required = set(schema.get("required", [])) + props = set(schema.get("properties", {}).keys()) + assert ( + required <= props + ), f"{tool.name}: required {required - props} not in properties" + + +class TestBuiltinToolDefinitions: + def _tools(self): + return _tools_list(_make_app()) + + def _builtin(self, name): + return next(t for t in self._tools() if t.name == name) + + def test_query_component_always_present(self): + names = {t.name for t in self._tools()} + assert "get_dash_component" in names + + def test_query_component_has_required_params(self): + tool = self._builtin("get_dash_component") + assert "component_id" in tool.inputSchema["properties"] + assert "property" in tool.inputSchema["properties"] + assert set(tool.inputSchema.get("required", [])) == {"component_id"} + + +class TestSanitizeToolName: + def test_simple_name(self): + assert ( + CallbackAdapterCollection._sanitize_name("update_output") == "update_output" + ) + + def test_special_characters_replaced(self): + assert ( + CallbackAdapterCollection._sanitize_name("my-func.name") == "my_func_name" + ) + + def test_leading_digit(self): + assert CallbackAdapterCollection._sanitize_name("123func") == "cb_123func" + + def test_empty_name(self): + assert CallbackAdapterCollection._sanitize_name("") == "unnamed_callback" + + def test_consecutive_underscores_collapsed(self): + assert CallbackAdapterCollection._sanitize_name("a---b___c") == "a_b_c" + + def test_long_name_truncated_to_64_chars(self): + result = CallbackAdapterCollection._sanitize_name("a" * 200) + assert len(result) <= 64 + assert result[-8:].isalnum() + + def test_long_name_uniqueness(self): + result_a = CallbackAdapterCollection._sanitize_name("a" * 200) + result_b = CallbackAdapterCollection._sanitize_name("b" * 200) + assert result_a != result_b + + def test_short_name_not_truncated(self): + assert CallbackAdapterCollection._sanitize_name("short_name") == "short_name" + + +class TestOutputSemanticSummary: + """Test the _OUTPUT_SEMANTICS mapping in description_outputs.py. + + Other description tests (docstring, output target, multi-output) are + covered by TestTool in test_callback_adapter.py using real adapters. + """ + + @staticmethod + def _adapter_with_outputs(outputs, docstring=None): + from unittest.mock import Mock + adapter = Mock() + adapter.outputs = outputs + adapter._docstring = docstring + return adapter + + @staticmethod + def _out(comp_id, prop, comp_type=None): + return { + "id_and_prop": f"{comp_id}.{prop}", + "component_id": comp_id, + "property": prop, + "component_type": comp_type, + "initial_value": None, + } + + def test_semantic_summary_with_component_type(self): + adapter = self._adapter_with_outputs([self._out("my-graph", "figure", "Graph")]) + desc = build_tool_description(adapter) + assert "Returns chart/visualization data" in desc + + def test_semantic_summary_fallback_by_property(self): + adapter = self._adapter_with_outputs([self._out("unknown-id", "figure")]) + desc = build_tool_description(adapter) + assert "Returns chart/visualization data" in desc From a95b3bf15692dc8953427c631d330723b975a01e Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 16 Apr 2026 17:16:43 -0600 Subject: [PATCH 045/103] Refactor tools to use a base class (just as resources do) --- dash/mcp/primitives/tools/__init__.py | 33 ++-- dash/mcp/primitives/tools/base.py | 28 +++ .../tools/tool_get_dash_component.py | 170 +++++++++--------- dash/mcp/primitives/tools/tools_callbacks.py | 67 +++---- 4 files changed, 165 insertions(+), 133 deletions(-) create mode 100644 dash/mcp/primitives/tools/base.py diff --git a/dash/mcp/primitives/tools/__init__.py b/dash/mcp/primitives/tools/__init__.py index 64f89dc3d0..7fa1f4aefb 100644 --- a/dash/mcp/primitives/tools/__init__.py +++ b/dash/mcp/primitives/tools/__init__.py @@ -1,12 +1,4 @@ -"""MCP tool listing and call handling. - -Each tool module exports: -- ``get_tool_names() -> set[str]`` -- ``get_tools() -> list[Tool]`` -- ``call_tool(tool_name, arguments) -> CallToolResult`` - -The __init__ assembles the list and dispatches calls by name. -""" +"""MCP tool listing and call handling.""" from __future__ import annotations @@ -16,26 +8,29 @@ from dash.mcp.types import ToolNotFoundError -from . import tool_get_dash_component as _get_component -from . import tools_callbacks as _callbacks +from .base import MCPToolProvider +from .tool_get_dash_component import GetDashComponentTool +from .tools_callbacks import CallbackTools -_TOOL_MODULES = [_callbacks, _get_component] +_TOOL_PROVIDERS: list[type[MCPToolProvider]] = [ + CallbackTools, + GetDashComponentTool, +] def list_tools() -> ListToolsResult: """Build the MCP tools/list response.""" tools = [] - for mod in _TOOL_MODULES: - tools.extend(mod.get_tools()) + for provider in _TOOL_PROVIDERS: + tools.extend(provider.list_tools()) return ListToolsResult(tools=tools) def call_tool(tool_name: str, arguments: dict[str, Any]) -> CallToolResult: - """Dispatch a tools/call request by tool name.""" - for mod in _TOOL_MODULES: - if tool_name in mod.get_tool_names(): - result = mod.call_tool(tool_name, arguments) - return result + """Route a tools/call request by tool name.""" + for provider in _TOOL_PROVIDERS: + if tool_name in provider.get_tool_names(): + return provider.call_tool(tool_name, arguments) raise ToolNotFoundError( f"Tool not found: {tool_name}." " The app's callbacks may have changed." diff --git a/dash/mcp/primitives/tools/base.py b/dash/mcp/primitives/tools/base.py new file mode 100644 index 0000000000..60fa7374d6 --- /dev/null +++ b/dash/mcp/primitives/tools/base.py @@ -0,0 +1,28 @@ +"""Base class for MCP tool providers.""" + +from __future__ import annotations + +from typing import Any + +from mcp.types import CallToolResult, Tool + + +class MCPToolProvider: + """A provider of one or more MCP tools. + + Subclasses implement ``list_tools`` to return the tools they provide, + ``get_tool_names`` to advertise those names for routing, and + ``call_tool`` to execute a tool by name. + """ + + @classmethod + def get_tool_names(cls) -> set[str]: + raise NotImplementedError + + @classmethod + def list_tools(cls) -> list[Tool]: + raise NotImplementedError + + @classmethod + def call_tool(cls, tool_name: str, arguments: dict[str, Any]) -> CallToolResult: + raise NotImplementedError diff --git a/dash/mcp/primitives/tools/tool_get_dash_component.py b/dash/mcp/primitives/tools/tool_get_dash_component.py index 8584242333..f41c9bec68 100644 --- a/dash/mcp/primitives/tools/tool_get_dash_component.py +++ b/dash/mcp/primitives/tools/tool_get_dash_component.py @@ -13,6 +13,8 @@ from dash._layout_utils import find_component from dash.mcp.types import ComponentPropertyInfo, ComponentQueryResult +from .base import MCPToolProvider + class _ComponentQueryInput(TypedDict): component_id: Annotated[str, Field(description="The component ID to query")] @@ -32,92 +34,94 @@ class _ComponentQueryInput(TypedDict): NAME = "get_dash_component" -def get_tool_names() -> set[str]: - return {NAME} - - -def get_tools() -> list[Tool]: - return [_build_tool()] - - -def _build_tool() -> Tool: - return Tool( - name=NAME, - description=( - "Get a component's properties, values, and tool relationships. " - "If property is omitted, returns all defined properties. " - "If property is specified, returns only that property. " - "See the dash://components resource for available component IDs." - ), - inputSchema=_INPUT_SCHEMA, - outputSchema=_OUTPUT_SCHEMA, - ) - - -def call_tool(tool_name: str, arguments: dict[str, Any]) -> CallToolResult: - comp_id = arguments.get("component_id", "") - if not comp_id: - raise ValueError("component_id is required") +class GetDashComponentTool(MCPToolProvider): + """Inspects a component's properties and its tool relationships.""" + + @classmethod + def get_tool_names(cls) -> set[str]: + return {NAME} + + @classmethod + def list_tools(cls) -> list[Tool]: + return [ + Tool( + name=NAME, + description=( + "Get a component's properties, values, and tool relationships. " + "If property is omitted, returns all defined properties. " + "If property is specified, returns only that property. " + "See the dash://components resource for available component IDs." + ), + inputSchema=_INPUT_SCHEMA, + outputSchema=_OUTPUT_SCHEMA, + ) + ] - prop_filter = arguments.get("property", "") - component = find_component(comp_id) + @classmethod + def call_tool(cls, tool_name: str, arguments: dict[str, Any]) -> CallToolResult: + comp_id = arguments.get("component_id", "") + if not comp_id: + raise ValueError("component_id is required") + + prop_filter = arguments.get("property", "") + component = find_component(comp_id) + + if component is None: + callback_map = get_app().mcp_callback_map + rendering_tools = [ + cb.tool_name + for cb in callback_map + if any(out["component_id"] == comp_id for out in cb.outputs) + ] + msg = f"Component '{comp_id}' not found in static layout." + if rendering_tools: + msg += f" However, the following tools would modify it: {rendering_tools}." + msg += " Use the dash://components resource to see statically available component IDs." + return CallToolResult( + content=[TextContent(type="text", text=msg)], + isError=True, + ) - if component is None: callback_map = get_app().mcp_callback_map - rendering_tools = [ - cb.tool_name - for cb in callback_map - if any(out["component_id"] == comp_id for out in cb.outputs) - ] - msg = f"Component '{comp_id}' not found in static layout." - if rendering_tools: - msg += f" However, the following tools would modify it: {rendering_tools}." - msg += " Use the dash://components resource to see statically available component IDs." - return CallToolResult( - content=[TextContent(type="text", text=msg)], - isError=True, - ) - callback_map = get_app().mcp_callback_map - - properties: dict[str, ComponentPropertyInfo] = {} - for prop_name in getattr(component, "_prop_names", []): - if prop_filter and prop_name != prop_filter: - continue - - value = callback_map.get_initial_value(f"{comp_id}.{prop_name}") - if value is None: - value = getattr(component, prop_name, None) - if value is None: - continue - - modified_by: list[str] = [] - input_to: list[str] = [] - id_and_prop = f"{comp_id}.{prop_name}" - for cb in callback_map: - for out in cb.outputs: - if out["id_and_prop"] == id_and_prop: - modified_by.append(cb.tool_name) - for inp in cb.inputs: - if inp["id_and_prop"] == id_and_prop: - input_to.append(cb.tool_name) - - properties[prop_name] = ComponentPropertyInfo( - initial_value=value, - modified_by_tool=modified_by, - input_to_tool=input_to, + properties: dict[str, ComponentPropertyInfo] = {} + for prop_name in getattr(component, "_prop_names", []): + if prop_filter and prop_name != prop_filter: + continue + + value = callback_map.get_initial_value(f"{comp_id}.{prop_name}") + if value is None: + value = getattr(component, prop_name, None) + if value is None: + continue + + modified_by: list[str] = [] + input_to: list[str] = [] + id_and_prop = f"{comp_id}.{prop_name}" + for cb in callback_map: + for out in cb.outputs: + if out["id_and_prop"] == id_and_prop: + modified_by.append(cb.tool_name) + for inp in cb.inputs: + if inp["id_and_prop"] == id_and_prop: + input_to.append(cb.tool_name) + + properties[prop_name] = ComponentPropertyInfo( + initial_value=value, + modified_by_tool=modified_by, + input_to_tool=input_to, + ) + + labels = callback_map.component_label_map.get(comp_id, []) + + structured: ComponentQueryResult = ComponentQueryResult( + component_id=comp_id, + component_type=type(component).__name__, + label=labels if labels else None, + properties=properties, ) - labels = callback_map.component_label_map.get(comp_id, []) - - structured: ComponentQueryResult = ComponentQueryResult( - component_id=comp_id, - component_type=type(component).__name__, - label=labels if labels else None, - properties=properties, - ) - - return CallToolResult( - content=[TextContent(type="text", text=json.dumps(structured, default=str))], - structuredContent=structured, - ) + return CallToolResult( + content=[TextContent(type="text", text=json.dumps(structured, default=str))], + structuredContent=structured, + ) diff --git a/dash/mcp/primitives/tools/tools_callbacks.py b/dash/mcp/primitives/tools/tools_callbacks.py index ba08795d35..91bc360059 100644 --- a/dash/mcp/primitives/tools/tools_callbacks.py +++ b/dash/mcp/primitives/tools/tools_callbacks.py @@ -1,6 +1,6 @@ """Dynamic callback tools for MCP. -Handles listing, naming, and executing callback-based tools. +Exposes every server-callable callback as an MCP tool. """ from __future__ import annotations @@ -12,36 +12,41 @@ from dash import get_app from dash.mcp.types import CallbackExecutionError, ToolNotFoundError +from .base import MCPToolProvider from .results import format_callback_response -def get_tool_names() -> set[str]: - return get_app().mcp_callback_map.tool_names - - -def get_tools() -> list[Tool]: - """Return one Tool per server-callable callback.""" - return get_app().mcp_callback_map.as_mcp_tools() - - -def call_tool(tool_name: str, arguments: dict[str, Any]) -> CallToolResult: - """Execute a callback tool by name.""" - from .callback_utils import run_callback - - callback_map = get_app().mcp_callback_map - cb = callback_map.find_by_tool_name(tool_name) - if cb is None: - raise ToolNotFoundError( - f"Tool not found: {tool_name}." - " The app's callbacks may have changed." - " Please call tools/list to refresh your tool list." - ) - - try: - dispatch_response = run_callback(cb, arguments) - except CallbackExecutionError as e: - return CallToolResult( - content=[TextContent(type="text", text=str(e))], - isError=True, - ) - return format_callback_response(dispatch_response, cb) +class CallbackTools(MCPToolProvider): + """Exposes every server-callable callback as an MCP tool.""" + + @classmethod + def get_tool_names(cls) -> set[str]: + return get_app().mcp_callback_map.tool_names + + @classmethod + def list_tools(cls) -> list[Tool]: + """Return one Tool per server-callable callback.""" + return get_app().mcp_callback_map.as_mcp_tools() + + @classmethod + def call_tool(cls, tool_name: str, arguments: dict[str, Any]) -> CallToolResult: + """Execute a callback tool by name.""" + from .callback_utils import run_callback + + callback_map = get_app().mcp_callback_map + cb = callback_map.find_by_tool_name(tool_name) + if cb is None: + raise ToolNotFoundError( + f"Tool not found: {tool_name}." + " The app's callbacks may have changed." + " Please call tools/list to refresh your tool list." + ) + + try: + callback_response = run_callback(cb, arguments) + except CallbackExecutionError as e: + return CallToolResult( + content=[TextContent(type="text", text=str(e))], + isError=True, + ) + return format_callback_response(callback_response, cb) From 9e4cc2cbf468921f30cbb872f4d6b90bda917295 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 16 Apr 2026 17:39:36 -0600 Subject: [PATCH 046/103] lint --- .../tools/tool_get_dash_component.py | 8 +- dash/mcp/primitives/tools/tools_callbacks.py | 3 +- tests/unit/development/metadata_test.py | 197 +++++++++++------- tests/unit/mcp/conftest.py | 5 +- tests/unit/mcp/tools/test_tools_callbacks.py | 1 + 5 files changed, 134 insertions(+), 80 deletions(-) diff --git a/dash/mcp/primitives/tools/tool_get_dash_component.py b/dash/mcp/primitives/tools/tool_get_dash_component.py index f41c9bec68..69b6276d5a 100644 --- a/dash/mcp/primitives/tools/tool_get_dash_component.py +++ b/dash/mcp/primitives/tools/tool_get_dash_component.py @@ -75,7 +75,9 @@ def call_tool(cls, tool_name: str, arguments: dict[str, Any]) -> CallToolResult: ] msg = f"Component '{comp_id}' not found in static layout." if rendering_tools: - msg += f" However, the following tools would modify it: {rendering_tools}." + msg += ( + f" However, the following tools would modify it: {rendering_tools}." + ) msg += " Use the dash://components resource to see statically available component IDs." return CallToolResult( content=[TextContent(type="text", text=msg)], @@ -122,6 +124,8 @@ def call_tool(cls, tool_name: str, arguments: dict[str, Any]) -> CallToolResult: ) return CallToolResult( - content=[TextContent(type="text", text=json.dumps(structured, default=str))], + content=[ + TextContent(type="text", text=json.dumps(structured, default=str)) + ], structuredContent=structured, ) diff --git a/dash/mcp/primitives/tools/tools_callbacks.py b/dash/mcp/primitives/tools/tools_callbacks.py index 91bc360059..716b777326 100644 --- a/dash/mcp/primitives/tools/tools_callbacks.py +++ b/dash/mcp/primitives/tools/tools_callbacks.py @@ -13,6 +13,7 @@ from dash.mcp.types import CallbackExecutionError, ToolNotFoundError from .base import MCPToolProvider +from .callback_utils import run_callback from .results import format_callback_response @@ -31,8 +32,6 @@ def list_tools(cls) -> list[Tool]: @classmethod def call_tool(cls, tool_name: str, arguments: dict[str, Any]) -> CallToolResult: """Execute a callback tool by name.""" - from .callback_utils import run_callback - callback_map = get_app().mcp_callback_map cb = callback_map.find_by_tool_name(tool_name) if cb is None: diff --git a/tests/unit/development/metadata_test.py b/tests/unit/development/metadata_test.py index 0ee96efdeb..e2938af338 100644 --- a/tests/unit/development/metadata_test.py +++ b/tests/unit/development/metadata_test.py @@ -1,7 +1,7 @@ # AUTO GENERATED FILE - DO NOT EDIT import typing # noqa: F401 -from typing_extensions import TypedDict, NotRequired, Literal # noqa: F401 +from typing_extensions import TypedDict, NotRequired, Literal # noqa: F401 from dash.development.base_component import Component, _explicitize_args ComponentType = typing.Union[ @@ -20,126 +20,120 @@ class Table(Component): """A Table component. -This is a description of the component. -It's multiple lines long. + This is a description of the component. + It's multiple lines long. -Keyword arguments: + Keyword arguments: -- children (a list of or a singular dash component, string or number; optional) + - children (a list of or a singular dash component, string or number; optional) -- id (string; optional) + - id (string; optional) -- aria-* (string; optional) + - aria-* (string; optional) -- customArrayProp (list; optional) + - customArrayProp (list; optional) -- customProp (optional) + - customProp (optional) -- data-* (string; optional) + - data-* (string; optional) -- in (string; optional) + - in (string; optional) -- optionalAny (boolean | number | string | dict | list; optional) + - optionalAny (boolean | number | string | dict | list; optional) -- optionalArray (list; optional): - Description of optionalArray. + - optionalArray (list; optional): + Description of optionalArray. -- optionalArrayOf (list of numbers; optional) + - optionalArrayOf (list of numbers; optional) -- optionalBool (boolean; optional) + - optionalBool (boolean; optional) -- optionalElement (dash component; optional) + - optionalElement (dash component; optional) -- optionalEnum (a value equal to: 'News', 'Photos'; optional) + - optionalEnum (a value equal to: 'News', 'Photos'; optional) -- optionalNode (a list of or a singular dash component, string or number; optional) + - optionalNode (a list of or a singular dash component, string or number; optional) -- optionalNumber (number; default 42) + - optionalNumber (number; default 42) -- optionalObject (dict; optional) + - optionalObject (dict; optional) -- optionalObjectOf (dict with strings as keys and values of type number; optional) + - optionalObjectOf (dict with strings as keys and values of type number; optional) -- optionalObjectWithExactAndNestedDescription (dict; optional) + - optionalObjectWithExactAndNestedDescription (dict; optional) - `optionalObjectWithExactAndNestedDescription` is a dict with keys: + `optionalObjectWithExactAndNestedDescription` is a dict with keys: - - color (string; optional) + - color (string; optional) - - fontSize (number; optional) + - fontSize (number; optional) - - figure (dict; optional): - Figure is a plotly graph object. + - figure (dict; optional): + Figure is a plotly graph object. - `figure` is a dict with keys: + `figure` is a dict with keys: - - data (list of dicts; optional): - data is a collection of traces. + - data (list of dicts; optional): + data is a collection of traces. - - layout (dict; optional): - layout describes the rest of the figure. + - layout (dict; optional): + layout describes the rest of the figure. -- optionalObjectWithShapeAndNestedDescription (dict; optional) + - optionalObjectWithShapeAndNestedDescription (dict; optional) - `optionalObjectWithShapeAndNestedDescription` is a dict with keys: + `optionalObjectWithShapeAndNestedDescription` is a dict with keys: - - color (string; optional) + - color (string; optional) - - fontSize (number; optional) + - fontSize (number; optional) - - figure (dict; optional): - Figure is a plotly graph object. + - figure (dict; optional): + Figure is a plotly graph object. - `figure` is a dict with keys: + `figure` is a dict with keys: - - data (list of dicts; optional): - data is a collection of traces. + - data (list of dicts; optional): + data is a collection of traces. - - layout (dict; optional): - layout describes the rest of the figure. + - layout (dict; optional): + layout describes the rest of the figure. -- optionalString (string; default 'hello world') + - optionalString (string; default 'hello world') -- optionalUnion (string | number; optional)""" - _children_props = ['optionalNode', 'optionalElement'] - _base_nodes = ['optionalNode', 'optionalElement', 'children'] - _namespace = 'TableComponents' - _type = 'Table' + - optionalUnion (string | number; optional)""" + + _children_props = ["optionalNode", "optionalElement"] + _base_nodes = ["optionalNode", "optionalElement", "children"] + _namespace = "TableComponents" + _type = "Table" OptionalObjectWithExactAndNestedDescriptionFigure = TypedDict( "OptionalObjectWithExactAndNestedDescriptionFigure", - { - "data": NotRequired[typing.Sequence[dict]], - "layout": NotRequired[dict] - } + {"data": NotRequired[typing.Sequence[dict]], "layout": NotRequired[dict]}, ) OptionalObjectWithExactAndNestedDescription = TypedDict( "OptionalObjectWithExactAndNestedDescription", - { + { "color": NotRequired[str], "fontSize": NotRequired[NumberType], - "figure": NotRequired["OptionalObjectWithExactAndNestedDescriptionFigure"] - } + "figure": NotRequired["OptionalObjectWithExactAndNestedDescriptionFigure"], + }, ) OptionalObjectWithShapeAndNestedDescriptionFigure = TypedDict( "OptionalObjectWithShapeAndNestedDescriptionFigure", - { - "data": NotRequired[typing.Sequence[dict]], - "layout": NotRequired[dict] - } + {"data": NotRequired[typing.Sequence[dict]], "layout": NotRequired[dict]}, ) OptionalObjectWithShapeAndNestedDescription = TypedDict( "OptionalObjectWithShapeAndNestedDescription", - { + { "color": NotRequired[str], "fontSize": NotRequired[NumberType], - "figure": NotRequired["OptionalObjectWithShapeAndNestedDescriptionFigure"] - } + "figure": NotRequired["OptionalObjectWithShapeAndNestedDescriptionFigure"], + }, ) - def __init__( self, children: typing.Optional[ComponentType] = None, @@ -154,26 +148,79 @@ def __init__( optionalElement: typing.Optional[Component] = None, optionalMessage: typing.Optional[typing.Any] = None, optionalEnum: typing.Optional[Literal["News", "Photos"]] = None, - optionalUnion: typing.Optional[typing.Union[str, NumberType, typing.Any]] = None, + optionalUnion: typing.Optional[ + typing.Union[str, NumberType, typing.Any] + ] = None, optionalArrayOf: typing.Optional[typing.Sequence[NumberType]] = None, - optionalObjectOf: typing.Optional[typing.Dict[typing.Union[str, float, int], NumberType]] = None, - optionalObjectWithExactAndNestedDescription: typing.Optional["OptionalObjectWithExactAndNestedDescription"] = None, - optionalObjectWithShapeAndNestedDescription: typing.Optional["OptionalObjectWithShapeAndNestedDescription"] = None, + optionalObjectOf: typing.Optional[ + typing.Dict[typing.Union[str, float, int], NumberType] + ] = None, + optionalObjectWithExactAndNestedDescription: typing.Optional[ + "OptionalObjectWithExactAndNestedDescription" + ] = None, + optionalObjectWithShapeAndNestedDescription: typing.Optional[ + "OptionalObjectWithShapeAndNestedDescription" + ] = None, optionalAny: typing.Optional[typing.Any] = None, customProp: typing.Optional[typing.Any] = None, customArrayProp: typing.Optional[typing.Sequence[typing.Any]] = None, id: typing.Optional[typing.Union[str, dict]] = None, **kwargs ): - self._prop_names = ['children', 'id', 'aria-*', 'customArrayProp', 'customProp', 'data-*', 'in', 'optionalAny', 'optionalArray', 'optionalArrayOf', 'optionalBool', 'optionalElement', 'optionalEnum', 'optionalNode', 'optionalNumber', 'optionalObject', 'optionalObjectOf', 'optionalObjectWithExactAndNestedDescription', 'optionalObjectWithShapeAndNestedDescription', 'optionalString', 'optionalUnion'] - self._valid_wildcard_attributes = ['data-', 'aria-'] - self.available_properties = ['children', 'id', 'aria-*', 'customArrayProp', 'customProp', 'data-*', 'in', 'optionalAny', 'optionalArray', 'optionalArrayOf', 'optionalBool', 'optionalElement', 'optionalEnum', 'optionalNode', 'optionalNumber', 'optionalObject', 'optionalObjectOf', 'optionalObjectWithExactAndNestedDescription', 'optionalObjectWithShapeAndNestedDescription', 'optionalString', 'optionalUnion'] - self.available_wildcard_properties = ['data-', 'aria-'] - _explicit_args = kwargs.pop('_explicit_args') + self._prop_names = [ + "children", + "id", + "aria-*", + "customArrayProp", + "customProp", + "data-*", + "in", + "optionalAny", + "optionalArray", + "optionalArrayOf", + "optionalBool", + "optionalElement", + "optionalEnum", + "optionalNode", + "optionalNumber", + "optionalObject", + "optionalObjectOf", + "optionalObjectWithExactAndNestedDescription", + "optionalObjectWithShapeAndNestedDescription", + "optionalString", + "optionalUnion", + ] + self._valid_wildcard_attributes = ["data-", "aria-"] + self.available_properties = [ + "children", + "id", + "aria-*", + "customArrayProp", + "customProp", + "data-*", + "in", + "optionalAny", + "optionalArray", + "optionalArrayOf", + "optionalBool", + "optionalElement", + "optionalEnum", + "optionalNode", + "optionalNumber", + "optionalObject", + "optionalObjectOf", + "optionalObjectWithExactAndNestedDescription", + "optionalObjectWithShapeAndNestedDescription", + "optionalString", + "optionalUnion", + ] + self.available_wildcard_properties = ["data-", "aria-"] + _explicit_args = kwargs.pop("_explicit_args") _locals = locals() _locals.update(kwargs) # For wildcard attrs and excess named props - args = {k: _locals[k] for k in _explicit_args if k != 'children'} + args = {k: _locals[k] for k in _explicit_args if k != "children"} super(Table, self).__init__(children=children, **args) + setattr(Table, "__init__", _explicitize_args(Table.__init__)) diff --git a/tests/unit/mcp/conftest.py b/tests/unit/mcp/conftest.py index 38b2f8c00e..2f7fbc1898 100644 --- a/tests/unit/mcp/conftest.py +++ b/tests/unit/mcp/conftest.py @@ -9,7 +9,10 @@ if sys.version_info < (3, 10): collect_ignore_glob.append("*") else: - from dash.mcp.primitives.tools import call_tool, list_tools # pylint: disable=wrong-import-position + from dash.mcp.primitives.tools import ( + call_tool, + list_tools, + ) # pylint: disable=wrong-import-position from dash.mcp.primitives.tools.callback_adapter_collection import ( # pylint: disable=wrong-import-position CallbackAdapterCollection, ) diff --git a/tests/unit/mcp/tools/test_tools_callbacks.py b/tests/unit/mcp/tools/test_tools_callbacks.py index 751f85bedd..fe57c42cce 100644 --- a/tests/unit/mcp/tools/test_tools_callbacks.py +++ b/tests/unit/mcp/tools/test_tools_callbacks.py @@ -111,6 +111,7 @@ class TestOutputSemanticSummary: @staticmethod def _adapter_with_outputs(outputs, docstring=None): from unittest.mock import Mock + adapter = Mock() adapter.outputs = outputs adapter._docstring = docstring From c079065dc31fad2962deb49a670711de9736231f Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 23 Apr 2026 14:24:38 -0600 Subject: [PATCH 047/103] Refactor unit tests to conform to existing test patterns --- .../tools/test_mcp_tool_get_dash_component.py | 125 ++++++++++++++ .../mcp/tools/test_mcp_tools_callbacks.py | 152 ++++++++++++++++++ .../mcp/tools/test_tool_get_dash_component.py | 117 -------------- tests/unit/mcp/tools/test_tools_callbacks.py | 138 ---------------- 4 files changed, 277 insertions(+), 255 deletions(-) create mode 100644 tests/unit/mcp/tools/test_mcp_tool_get_dash_component.py create mode 100644 tests/unit/mcp/tools/test_mcp_tools_callbacks.py delete mode 100644 tests/unit/mcp/tools/test_tool_get_dash_component.py delete mode 100644 tests/unit/mcp/tools/test_tools_callbacks.py diff --git a/tests/unit/mcp/tools/test_mcp_tool_get_dash_component.py b/tests/unit/mcp/tools/test_mcp_tool_get_dash_component.py new file mode 100644 index 0000000000..4cf11555be --- /dev/null +++ b/tests/unit/mcp/tools/test_mcp_tool_get_dash_component.py @@ -0,0 +1,125 @@ +"""The built-in ``get_dash_component`` tool. + +Lets LLMs inspect a component's current properties and their relationships +to callbacks (which tools write/read each prop). +""" + +from dash import Dash, Input, Output, dcc, html + +from tests.unit.mcp.conftest import _call_tool, _make_app, _tools_list + + +def test_mcpg001_present_in_tools_list(): + app = _make_app() + tool_names = [t.name for t in _tools_list(app)] + assert "get_dash_component" in tool_names + + +def test_mcpg002_returns_structured_output_with_prop(): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="my-dd", options=["a", "b"], value="b"), + ] + ) + + result = _call_tool( + app, + "get_dash_component", + { + "component_id": "my-dd", + "property": "value", + }, + ) + sc = result.structuredContent + assert sc["component_id"] == "my-dd" + assert sc["component_type"] == "Dropdown" + assert "value" in sc["properties"] + assert sc["properties"]["value"]["initial_value"] == "b" + assert "options" not in sc["properties"] + + +def test_mcpg003_returns_all_props_without_property(): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="my-dd", options=["a", "b"], value="b"), + ] + ) + + result = _call_tool( + app, + "get_dash_component", + { + "component_id": "my-dd", + }, + ) + sc = result.structuredContent + assert "options" in sc["properties"] + assert "value" in sc["properties"] + assert sc["properties"]["value"]["initial_value"] == "b" + + +def test_mcpg004_includes_label(): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Label("Pick one", htmlFor="my-dd"), + dcc.Dropdown(id="my-dd", options=["a", "b"], value="a"), + ] + ) + + @app.callback(Output("my-dd", "value"), Input("my-dd", "options")) + def noop(o): + return "a" + + result = _call_tool( + app, + "get_dash_component", + { + "component_id": "my-dd", + }, + ) + sc = result.structuredContent + assert sc["label"] == ["Pick one"] + + +def test_mcpg005_includes_tool_references(): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="dd", options=["a", "b"], value="a"), + html.Div(id="out"), + ] + ) + + @app.callback(Output("out", "children"), Input("dd", "value")) + def update(val): + return val + + result = _call_tool( + app, + "get_dash_component", + { + "component_id": "dd", + "property": "value", + }, + ) + prop_info = result.structuredContent["properties"]["value"] + assert "update" in prop_info["input_to_tool"] + + +def test_mcpg006_missing_id_returns_hint(): + app = _make_app() + result = _call_tool( + app, + "get_dash_component", + { + "component_id": "nonexistent", + "property": "value", + }, + ) + text = result.content[0].text + assert "nonexistent" in text + assert "not found" in text + assert "dash://components" in text diff --git a/tests/unit/mcp/tools/test_mcp_tools_callbacks.py b/tests/unit/mcp/tools/test_mcp_tools_callbacks.py new file mode 100644 index 0000000000..7148803bc1 --- /dev/null +++ b/tests/unit/mcp/tools/test_mcp_tools_callbacks.py @@ -0,0 +1,152 @@ +"""Dynamic callback tools: MCP spec compliance, tool naming, output summaries. + +Verifies that generated tools conform to the MCP 2025-11-25 specification +and Dash-specific conventions. Focuses on shape/structure, tool-name +sanitization, and ``_OUTPUT_SEMANTICS`` fallback summaries; input-schema +values are covered by ``test_mcp_input_schemas``. + +Reference: https://modelcontextprotocol.io/specification/2025-11-25/server/tools +""" + +import re +from unittest.mock import Mock + +from dash.mcp.primitives.tools.callback_adapter_collection import ( + CallbackAdapterCollection, +) +from dash.mcp.primitives.tools.descriptions import build_tool_description + +from tests.unit.mcp.conftest import ( + _make_app, + _tools_list, +) + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +_TOOL_NAME_RE = re.compile(r"^[A-Za-z0-9_\-.]+$") + + +def _adapter_with_outputs(outputs, docstring=None): + adapter = Mock() + adapter.outputs = outputs + adapter._docstring = docstring + return adapter + + +def _out(comp_id, prop, comp_type=None): + return { + "id_and_prop": f"{comp_id}.{prop}", + "component_id": comp_id, + "property": prop, + "component_type": comp_type, + "initial_value": None, + } + + +# --------------------------------------------------------------------------- +# MCP spec compliance — every generated tool must satisfy the spec +# --------------------------------------------------------------------------- + + +def test_mcptc001_all_tools_conform_to_mcp_spec(): + tools = _tools_list(_make_app()) + names = [t.name for t in tools] + + assert len(names) == len(set(names)), f"Duplicate tool names: {names}" + + for tool in tools: + assert tool.name + assert tool.inputSchema + assert 1 <= len(tool.name) <= 128 + assert _TOOL_NAME_RE.match(tool.name), f"Invalid tool name: {tool.name}" + + schema = tool.inputSchema + assert isinstance(schema, dict) + assert schema.get("type") == "object" + assert isinstance(schema.get("properties", {}), dict) + + required = set(schema.get("required", [])) + props = set(schema.get("properties", {}).keys()) + assert ( + required <= props + ), f"{tool.name}: required {required - props} not in properties" + + +# --------------------------------------------------------------------------- +# Built-in tools +# --------------------------------------------------------------------------- + + +def test_mcptc002_query_component_always_present(): + names = {t.name for t in _tools_list(_make_app())} + assert "get_dash_component" in names + + +def test_mcptc003_query_component_has_required_params(): + tool = next(t for t in _tools_list(_make_app()) if t.name == "get_dash_component") + assert "component_id" in tool.inputSchema["properties"] + assert "property" in tool.inputSchema["properties"] + assert set(tool.inputSchema.get("required", [])) == {"component_id"} + + +# --------------------------------------------------------------------------- +# Tool-name sanitization (CallbackAdapterCollection._sanitize_name) +# --------------------------------------------------------------------------- + + +def test_mcptc004_sanitize_simple_name(): + assert CallbackAdapterCollection._sanitize_name("update_output") == "update_output" + + +def test_mcptc005_sanitize_special_characters_replaced(): + assert CallbackAdapterCollection._sanitize_name("my-func.name") == "my_func_name" + + +def test_mcptc006_sanitize_leading_digit(): + assert CallbackAdapterCollection._sanitize_name("123func") == "cb_123func" + + +def test_mcptc007_sanitize_empty_name(): + assert CallbackAdapterCollection._sanitize_name("") == "unnamed_callback" + + +def test_mcptc008_sanitize_consecutive_underscores_collapsed(): + assert CallbackAdapterCollection._sanitize_name("a---b___c") == "a_b_c" + + +def test_mcptc009_sanitize_long_name_truncated_to_64_chars(): + result = CallbackAdapterCollection._sanitize_name("a" * 200) + assert len(result) <= 64 + assert result[-8:].isalnum() + + +def test_mcptc010_sanitize_long_name_uniqueness(): + result_a = CallbackAdapterCollection._sanitize_name("a" * 200) + result_b = CallbackAdapterCollection._sanitize_name("b" * 200) + assert result_a != result_b + + +def test_mcptc011_sanitize_short_name_not_truncated(): + assert CallbackAdapterCollection._sanitize_name("short_name") == "short_name" + + +# --------------------------------------------------------------------------- +# Output semantic summary (``_OUTPUT_SEMANTICS`` in description_outputs.py). +# Other description tests (docstring, output target, multi-output) are +# covered by test_mcp_tools using real adapters. +# --------------------------------------------------------------------------- + + +def test_mcptc012_semantic_summary_with_component_type(): + adapter = _adapter_with_outputs([_out("my-graph", "figure", "Graph")]) + desc = build_tool_description(adapter) + assert "Returns chart/visualization data" in desc + + +def test_mcptc013_semantic_summary_fallback_by_property(): + adapter = _adapter_with_outputs([_out("unknown-id", "figure")]) + desc = build_tool_description(adapter) + assert "Returns chart/visualization data" in desc diff --git a/tests/unit/mcp/tools/test_tool_get_dash_component.py b/tests/unit/mcp/tools/test_tool_get_dash_component.py deleted file mode 100644 index 5a8a454068..0000000000 --- a/tests/unit/mcp/tools/test_tool_get_dash_component.py +++ /dev/null @@ -1,117 +0,0 @@ -"""Tests for the get_dash_component built-in tool.""" - -from dash import Dash, Input, Output, dcc, html - -from tests.unit.mcp.conftest import _call_tool, _make_app, _tools_list - - -class TestGetDashComponent: - def test_present_in_tools_list(self): - app = _make_app() - tool_names = [t.name for t in _tools_list(app)] - assert "get_dash_component" in tool_names - - def test_returns_structured_output_with_prop(self): - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Dropdown(id="my-dd", options=["a", "b"], value="b"), - ] - ) - - result = _call_tool( - app, - "get_dash_component", - { - "component_id": "my-dd", - "property": "value", - }, - ) - sc = result.structuredContent - assert sc["component_id"] == "my-dd" - assert sc["component_type"] == "Dropdown" - assert "value" in sc["properties"] - assert sc["properties"]["value"]["initial_value"] == "b" - assert "options" not in sc["properties"] - - def test_returns_all_props_without_property(self): - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Dropdown(id="my-dd", options=["a", "b"], value="b"), - ] - ) - - result = _call_tool( - app, - "get_dash_component", - { - "component_id": "my-dd", - }, - ) - sc = result.structuredContent - assert "options" in sc["properties"] - assert "value" in sc["properties"] - assert sc["properties"]["value"]["initial_value"] == "b" - - def test_includes_label(self): - app = Dash(__name__) - app.layout = html.Div( - [ - html.Label("Pick one", htmlFor="my-dd"), - dcc.Dropdown(id="my-dd", options=["a", "b"], value="a"), - ] - ) - - @app.callback(Output("my-dd", "value"), Input("my-dd", "options")) - def noop(o): - return "a" - - result = _call_tool( - app, - "get_dash_component", - { - "component_id": "my-dd", - }, - ) - sc = result.structuredContent - assert sc["label"] == ["Pick one"] - - def test_includes_tool_references(self): - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Dropdown(id="dd", options=["a", "b"], value="a"), - html.Div(id="out"), - ] - ) - - @app.callback(Output("out", "children"), Input("dd", "value")) - def update(val): - return val - - result = _call_tool( - app, - "get_dash_component", - { - "component_id": "dd", - "property": "value", - }, - ) - prop_info = result.structuredContent["properties"]["value"] - assert "update" in prop_info["input_to_tool"] - - def test_missing_id_returns_hint(self): - app = _make_app() - result = _call_tool( - app, - "get_dash_component", - { - "component_id": "nonexistent", - "property": "value", - }, - ) - text = result.content[0].text - assert "nonexistent" in text - assert "not found" in text - assert "dash://components" in text diff --git a/tests/unit/mcp/tools/test_tools_callbacks.py b/tests/unit/mcp/tools/test_tools_callbacks.py deleted file mode 100644 index fe57c42cce..0000000000 --- a/tests/unit/mcp/tools/test_tools_callbacks.py +++ /dev/null @@ -1,138 +0,0 @@ -"""Tool definition tests — MCP spec compliance and Dash conventions. - -Verifies that generated tools conform to the MCP specification (2025-11-25) -and Dash-specific conventions. Focuses on shape/structure, not inputSchema -values (those are covered by input_schemas/). - -Reference: https://modelcontextprotocol.io/specification/2025-11-25/server/tools -""" - -import re - -from dash.mcp.primitives.tools.callback_adapter_collection import ( - CallbackAdapterCollection, -) -from dash.mcp.primitives.tools.descriptions import build_tool_description - -from tests.unit.mcp.conftest import ( - _make_app, - _tools_list, -) - -_TOOL_NAME_RE = re.compile(r"^[A-Za-z0-9_\-.]+$") - - -class TestToolSpecCompliance: - """Every tool must conform to the MCP 2025-11-25 specification.""" - - def test_all_tools_conform_to_mcp_spec(self): - tools = _tools_list(_make_app()) - names = [t.name for t in tools] - - assert len(names) == len(set(names)), f"Duplicate tool names: {names}" - - for tool in tools: - assert tool.name - assert tool.inputSchema - assert 1 <= len(tool.name) <= 128 - assert _TOOL_NAME_RE.match(tool.name), f"Invalid tool name: {tool.name}" - - schema = tool.inputSchema - assert isinstance(schema, dict) - assert schema.get("type") == "object" - assert isinstance(schema.get("properties", {}), dict) - - required = set(schema.get("required", [])) - props = set(schema.get("properties", {}).keys()) - assert ( - required <= props - ), f"{tool.name}: required {required - props} not in properties" - - -class TestBuiltinToolDefinitions: - def _tools(self): - return _tools_list(_make_app()) - - def _builtin(self, name): - return next(t for t in self._tools() if t.name == name) - - def test_query_component_always_present(self): - names = {t.name for t in self._tools()} - assert "get_dash_component" in names - - def test_query_component_has_required_params(self): - tool = self._builtin("get_dash_component") - assert "component_id" in tool.inputSchema["properties"] - assert "property" in tool.inputSchema["properties"] - assert set(tool.inputSchema.get("required", [])) == {"component_id"} - - -class TestSanitizeToolName: - def test_simple_name(self): - assert ( - CallbackAdapterCollection._sanitize_name("update_output") == "update_output" - ) - - def test_special_characters_replaced(self): - assert ( - CallbackAdapterCollection._sanitize_name("my-func.name") == "my_func_name" - ) - - def test_leading_digit(self): - assert CallbackAdapterCollection._sanitize_name("123func") == "cb_123func" - - def test_empty_name(self): - assert CallbackAdapterCollection._sanitize_name("") == "unnamed_callback" - - def test_consecutive_underscores_collapsed(self): - assert CallbackAdapterCollection._sanitize_name("a---b___c") == "a_b_c" - - def test_long_name_truncated_to_64_chars(self): - result = CallbackAdapterCollection._sanitize_name("a" * 200) - assert len(result) <= 64 - assert result[-8:].isalnum() - - def test_long_name_uniqueness(self): - result_a = CallbackAdapterCollection._sanitize_name("a" * 200) - result_b = CallbackAdapterCollection._sanitize_name("b" * 200) - assert result_a != result_b - - def test_short_name_not_truncated(self): - assert CallbackAdapterCollection._sanitize_name("short_name") == "short_name" - - -class TestOutputSemanticSummary: - """Test the _OUTPUT_SEMANTICS mapping in description_outputs.py. - - Other description tests (docstring, output target, multi-output) are - covered by TestTool in test_callback_adapter.py using real adapters. - """ - - @staticmethod - def _adapter_with_outputs(outputs, docstring=None): - from unittest.mock import Mock - - adapter = Mock() - adapter.outputs = outputs - adapter._docstring = docstring - return adapter - - @staticmethod - def _out(comp_id, prop, comp_type=None): - return { - "id_and_prop": f"{comp_id}.{prop}", - "component_id": comp_id, - "property": prop, - "component_type": comp_type, - "initial_value": None, - } - - def test_semantic_summary_with_component_type(self): - adapter = self._adapter_with_outputs([self._out("my-graph", "figure", "Graph")]) - desc = build_tool_description(adapter) - assert "Returns chart/visualization data" in desc - - def test_semantic_summary_fallback_by_property(self): - adapter = self._adapter_with_outputs([self._out("unknown-id", "figure")]) - desc = build_tool_description(adapter) - assert "Returns chart/visualization data" in desc From 99887535ff22a0c5c4522e7f551dabdd93bc32f0 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Fri, 8 May 2026 15:48:58 -0600 Subject: [PATCH 048/103] Implement a mapping of "id+prop" to callbacks that are outputs/inputs to those pairs --- .../tools/callback_adapter_collection.py | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/dash/mcp/primitives/tools/callback_adapter_collection.py b/dash/mcp/primitives/tools/callback_adapter_collection.py index 0304394f63..e740e7f0b8 100644 --- a/dash/mcp/primitives/tools/callback_adapter_collection.py +++ b/dash/mcp/primitives/tools/callback_adapter_collection.py @@ -86,8 +86,14 @@ def find_by_tool_name(self, name: str) -> CallbackAdapter | None: return cb return None - def find_by_output(self, id_and_prop: str) -> CallbackAdapter | None: - """Find the adapter that outputs to ``id_and_prop`` (``"component_id.property"``).""" + @cached_property + def outputs_by_prop(self) -> dict[str, list[CallbackAdapter]]: + """Index ``id_and_prop`` → callbacks outputting it. + + Mirrors the dash-renderer's ``outputMap`` (see + ``dash-renderer/src/actions/dependencies.js``). + """ + idx: dict[str, list[CallbackAdapter]] = {} for cb in self._callbacks: try: parsed = split_callback_id(cb.output_id) @@ -96,9 +102,31 @@ def find_by_output(self, id_and_prop: str) -> CallbackAdapter | None: if isinstance(parsed, dict): parsed = [parsed] for p in parsed: - if f"{p['id']}.{clean_property_name(p['property'])}" == id_and_prop: - return cb - return None + key = f"{p['id']}.{clean_property_name(p['property'])}" + idx.setdefault(key, []).append(cb) + return idx + + @cached_property + def inputs_by_prop(self) -> dict[str, list[CallbackAdapter]]: + """Index ``id_and_prop`` → callbacks consuming it as input/state. + + Mirrors the dash-renderer's ``inputMap`` (see + ``dash-renderer/src/actions/dependencies.js``). + Many callbacks may share a key. + """ + idx: dict[str, list[CallbackAdapter]] = {} + for cb in self._callbacks: + # pylint: disable-next=protected-access + deps = cb._cb_info.get("inputs", []) + cb._cb_info.get("state", []) + for dep in deps: + key = f"{dep.get('id', 'unknown')}.{dep.get('property', 'unknown')}" + idx.setdefault(key, []).append(cb) + return idx + + def find_by_output(self, id_and_prop: str) -> CallbackAdapter | None: + """Find the adapter that outputs to ``id_and_prop`` (``"component_id.property"``).""" + candidates = self.outputs_by_prop.get(id_and_prop, []) + return candidates[0] if candidates else None def get_initial_value(self, id_and_prop: str) -> Any: """Return the initial value for ``id_and_prop`` (``"component_id.property"``). From c2f06ae930e2dc24b3898b75c74e3935b1ab5ca6 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Fri, 8 May 2026 15:49:06 -0600 Subject: [PATCH 049/103] Code review feedback --- .../tools/tool_get_dash_component.py | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/dash/mcp/primitives/tools/tool_get_dash_component.py b/dash/mcp/primitives/tools/tool_get_dash_component.py index 69b6276d5a..5dffc2cf58 100644 --- a/dash/mcp/primitives/tools/tool_get_dash_component.py +++ b/dash/mcp/primitives/tools/tool_get_dash_component.py @@ -61,13 +61,16 @@ def list_tools(cls) -> list[Tool]: def call_tool(cls, tool_name: str, arguments: dict[str, Any]) -> CallToolResult: comp_id = arguments.get("component_id", "") if not comp_id: - raise ValueError("component_id is required") + return CallToolResult( + content=[TextContent(type="text", text="component_id is required")], + isError=True, + ) prop_filter = arguments.get("property", "") component = find_component(comp_id) + callback_map = get_app().mcp_callback_map if component is None: - callback_map = get_app().mcp_callback_map rendering_tools = [ cb.tool_name for cb in callback_map @@ -84,29 +87,24 @@ def call_tool(cls, tool_name: str, arguments: dict[str, Any]) -> CallToolResult: isError=True, ) - callback_map = get_app().mcp_callback_map - properties: dict[str, ComponentPropertyInfo] = {} for prop_name in getattr(component, "_prop_names", []): if prop_filter and prop_name != prop_filter: continue - value = callback_map.get_initial_value(f"{comp_id}.{prop_name}") + id_and_prop = f"{comp_id}.{prop_name}" + value = callback_map.get_initial_value(id_and_prop) if value is None: value = getattr(component, prop_name, None) if value is None: continue - modified_by: list[str] = [] - input_to: list[str] = [] - id_and_prop = f"{comp_id}.{prop_name}" - for cb in callback_map: - for out in cb.outputs: - if out["id_and_prop"] == id_and_prop: - modified_by.append(cb.tool_name) - for inp in cb.inputs: - if inp["id_and_prop"] == id_and_prop: - input_to.append(cb.tool_name) + modified_by = [ + cb.tool_name for cb in callback_map.outputs_by_prop.get(id_and_prop, []) + ] + input_to = [ + cb.tool_name for cb in callback_map.inputs_by_prop.get(id_and_prop, []) + ] properties[prop_name] = ComponentPropertyInfo( initial_value=value, From 34a4d980fd0526e829bf7896bb0c6d2d38a0e7b7 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Tue, 12 May 2026 17:18:56 -0600 Subject: [PATCH 050/103] Make run_callback compatible with 4.2.0 changes --- dash/mcp/primitives/tools/callback_utils.py | 33 +++++++++++---------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/dash/mcp/primitives/tools/callback_utils.py b/dash/mcp/primitives/tools/callback_utils.py index 361b27fc32..24a8a693fb 100644 --- a/dash/mcp/primitives/tools/callback_utils.py +++ b/dash/mcp/primitives/tools/callback_utils.py @@ -3,6 +3,7 @@ from __future__ import annotations import json +from contextvars import copy_context from typing import TYPE_CHECKING, Any from dash import get_app @@ -16,23 +17,25 @@ def run_callback( callback: CallbackAdapter, kwargs: dict[str, Any] ) -> CallbackExecutionResponse: - """Execute a callback via the framework.""" - body = callback.as_callback_body(kwargs) + """Execute a callback via the framework. + Must be called from inside an active request handler; the backend's + request adapter reads cookies/headers/args from the current request. + """ + body = callback.as_callback_body(kwargs) app = get_app() - with app.server.test_request_context( - "/_dash-update-component", - method="POST", - data=json.dumps(body, default=str), - content_type="application/json", - ): - response = app.dispatch() - - response_text = response.get_data(as_text=True) - if response.status_code != 200: + + try: + # pylint: disable=protected-access + cb_ctx = app._initialize_context(body) + func = app._prepare_callback(cb_ctx, body) + args = app._inputs_to_vals(cb_ctx.inputs_list + cb_ctx.states_list) + ctx = copy_context() + partial_func = app._execute_callback(func, args, cb_ctx.outputs_list, cb_ctx) + response_text = ctx.run(partial_func) + except Exception as err: raise CallbackExecutionError( - f"Callback {callback.output_id} failed " - f"(HTTP {response.status_code}): {response_text[:500]}" - ) + f"Callback {callback.output_id} failed: {err}" + ) from err return json.loads(response_text) From 227eeedb671b5fa2493815597316e169a64fdedb Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 1 Apr 2026 15:35:13 -0600 Subject: [PATCH 051/103] Wire MCP server, SSE transport, and Dash app integration --- dash/_configs.py | 2 + dash/dash.py | 31 + dash/mcp/__init__.py | 7 + dash/mcp/_server.py | 277 +++++ dash/mcp/_sse.py | 67 ++ dash/mcp/notifications/__init__.py | 7 + .../notification_tools_changed.py | 30 + dash/mcp/primitives/__init__.py | 17 + .../tools/callback_adapter_collection.py | 2 - tests/integration/mcp/conftest.py | 53 + .../primitives/resources/test_resources.py | 51 + .../tools/test_callback_signatures.py | 958 ++++++++++++++++++ .../tools/test_duplicate_outputs.py | 128 +++ .../primitives/tools/test_input_schemas.py | 66 ++ .../tools/test_tool_get_dash_component.py | 54 + .../mcp/primitives/tools/test_tools_list.py | 118 +++ tests/integration/mcp/test_server.py | 304 ++++++ tests/unit/mcp/test_server.py | 92 ++ tests/unit/mcp/tools/test_run_callback.py | 246 +++++ 19 files changed, 2508 insertions(+), 2 deletions(-) create mode 100644 dash/mcp/_server.py create mode 100644 dash/mcp/_sse.py create mode 100644 dash/mcp/notifications/__init__.py create mode 100644 dash/mcp/notifications/notification_tools_changed.py create mode 100644 tests/integration/mcp/conftest.py create mode 100644 tests/integration/mcp/primitives/resources/test_resources.py create mode 100644 tests/integration/mcp/primitives/tools/test_callback_signatures.py create mode 100644 tests/integration/mcp/primitives/tools/test_duplicate_outputs.py create mode 100644 tests/integration/mcp/primitives/tools/test_input_schemas.py create mode 100644 tests/integration/mcp/primitives/tools/test_tool_get_dash_component.py create mode 100644 tests/integration/mcp/primitives/tools/test_tools_list.py create mode 100644 tests/integration/mcp/test_server.py create mode 100644 tests/unit/mcp/test_server.py create mode 100644 tests/unit/mcp/tools/test_run_callback.py diff --git a/dash/_configs.py b/dash/_configs.py index 107b8308f5..0e1ab75505 100644 --- a/dash/_configs.py +++ b/dash/_configs.py @@ -33,6 +33,8 @@ def load_dash_env_vars(): "DASH_DISABLE_VERSION_CHECK", "DASH_PRUNE_ERRORS", "DASH_COMPRESS", + "DASH_MCP_ENABLED", + "DASH_MCP_PATH", "HOST", "PORT", ) diff --git a/dash/dash.py b/dash/dash.py index f887598497..c6fa5a6bf3 100644 --- a/dash/dash.py +++ b/dash/dash.py @@ -486,6 +486,8 @@ def __init__( # pylint: disable=too-many-statements, too-many-branches websocket_callbacks: Optional[bool] = False, websocket_allowed_origins: Optional[List[str]] = None, websocket_inactivity_timeout: Optional[int] = 300000, + enable_mcp: Optional[bool] = None, + mcp_path: Optional[str] = None, **obsolete, ): @@ -597,6 +599,13 @@ def __init__( # pylint: disable=too-many-statements, too-many-branches # keep title as a class property for backwards compatibility self.title = title + # MCP (Model Context Protocol) configuration + self._enable_mcp = get_combined_config("mcp_enabled", enable_mcp, True) + _mcp_path = get_combined_config("mcp_path", mcp_path, "_mcp") + self._mcp_path = ( + _mcp_path.lstrip("/") if isinstance(_mcp_path, str) else _mcp_path + ) + # list of dependencies - this one is used by the back end for dispatching self.callback_map: dict = {} # same deps as a list to catch duplicate outputs, and to send to the front end @@ -809,6 +818,21 @@ def _setup_routes(self): hook.data["methods"], ) + if self._enable_mcp: + from .mcp import ( # pylint: disable=import-outside-toplevel + enable_mcp_server, + ) + + try: + enable_mcp_server(self, self._mcp_path) + except Exception as e: # pylint: disable=broad-exception-caught + self._enable_mcp = False + self.logger.warning( + "MCP server could not be started at '%s': %s", + self._mcp_path, + e, + ) + def setup_apis(self): """ Register API endpoints for all callbacks defined using `dash.callback`. @@ -2452,6 +2476,13 @@ def verify_url_part(served_part, url_part, part_name): if not jupyter_dash or not jupyter_dash.in_ipython: self.logger.info("Dash is running on %s://%s%s%s\n", *display_url) + if self._enable_mcp: + self.logger.info( + " * MCP available at %s://%s%s%s%s\n", + *display_url[:3], + self.config.routes_pathname_prefix, + self._mcp_path, + ) if self.config.extra_hot_reload_paths: extra_files = flask_run_options["extra_files"] = [] diff --git a/dash/mcp/__init__.py b/dash/mcp/__init__.py index e69de29bb2..2677ea141b 100644 --- a/dash/mcp/__init__.py +++ b/dash/mcp/__init__.py @@ -0,0 +1,7 @@ +"""Dash MCP (Model Context Protocol) server integration.""" + +from dash.mcp._server import enable_mcp_server + +__all__ = [ + enable_mcp_server, +] diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py new file mode 100644 index 0000000000..1c6279290b --- /dev/null +++ b/dash/mcp/_server.py @@ -0,0 +1,277 @@ +"""Flask route setup, Streamable HTTP transport, and MCP message handling.""" + +from __future__ import annotations + +import atexit +import json +import logging +import uuid +from typing import TYPE_CHECKING, Any + +from flask import Response, request + +from dash.mcp.types import MCPError + +if TYPE_CHECKING: + from dash import Dash + +from dash import get_app + +from mcp.types import ( + LATEST_PROTOCOL_VERSION, + ErrorData, + Implementation, + InitializeResult, + JSONRPCError, + JSONRPCResponse, + ResourcesCapability, + ServerCapabilities, + ToolsCapability, +) + +from dash.version import __version__ +from dash.mcp._sse import ( + close_sse_stream, + create_sse_stream, + shutdown_all_streams, +) +from dash.mcp.primitives import ( + call_tool, + list_resource_templates, + list_resources, + list_tools, + read_resource, +) +from dash.mcp.primitives.tools.callback_adapter_collection import ( + CallbackAdapterCollection, +) + +logger = logging.getLogger(__name__) + + +def enable_mcp_server(app: Dash, mcp_path: str) -> None: + """ + Add MCP routes to a Dash/Flask app. + + Registers a single Streamable HTTP endpoint for the MCP protocol. + Uses ``app._add_url()`` so that ``routes_pathname_prefix`` is applied + automatically. + + Args: + app: The Dash application instance. + mcp_path: Route prefix for MCP endpoints. + """ + # Session storage: session_id -> metadata + sessions: dict[str, dict[str, Any]] = {} + + def _create_session() -> str: + sid = str(uuid.uuid4()) + sessions[sid] = {} + return sid + + # -- Streamable HTTP endpoint -------------------------------------------- + + def mcp_handler() -> Response: + if request.method == "POST": + return _handle_post() + if request.method == "GET": + return _handle_get() + if request.method == "DELETE": + return _handle_delete() + return Response( + json.dumps({"error": "Method not allowed"}), + content_type="application/json", + status=405, + ) + + def _handle_get() -> Response: + session_id = request.headers.get("mcp-session-id") + if not session_id or session_id not in sessions: + return Response( + json.dumps({"error": "Session not found"}), + content_type="application/json", + status=404, + ) + return create_sse_stream(sessions, session_id) + + def _handle_post() -> Response: + content_type = request.content_type or "" + if "application/json" not in content_type: + return Response( + json.dumps({"error": "Content-Type must be application/json"}), + content_type="application/json", + status=415, + ) + + try: + data = request.get_json() + except Exception: + return Response( + json.dumps({"error": "Invalid JSON"}), + content_type="application/json", + status=400, + ) + + method = data.get("method", "") + request_id = data.get("id") + session_id = request.headers.get("mcp-session-id") + + stale_session = False + if method == "initialize": + session_id = _create_session() + elif session_id and session_id not in sessions: + stale_session = True + sessions[session_id] = {} + elif not session_id: + session_id = _create_session() + + response_data = _process_mcp_message(data) + + if response_data is None: + return Response("", status=202) + + if stale_session: + _inject_warning(response_data, _STALE_SESSION_WARNING) + + return Response( + json.dumps(response_data), + content_type="application/json", + status=200, + headers={"mcp-session-id": session_id}, + ) + + def _handle_delete() -> Response: + session_id = request.headers.get("mcp-session-id") + if not session_id or session_id not in sessions: + return Response( + json.dumps({"error": "Session not found"}), + content_type="application/json", + status=404, + ) + close_sse_stream(sessions[session_id]) + del sessions[session_id] + logger.info("MCP session terminated: %s", session_id) + return Response("", status=204) + + # -- Register routes ----------------------------------------------------- + + from dash._get_app import with_app_context_factory + + app._add_url( + mcp_path, with_app_context_factory(mcp_handler, app), ["GET", "POST", "DELETE"] + ) + + # Close all SSE streams on server shutdown so MCP clients see a + # clean stream end and can reconnect promptly. + atexit.register(shutdown_all_streams, sessions) + + logger.info( + "MCP routes registered at %s%s", + app.config.routes_pathname_prefix, + mcp_path, + ) + + +_STALE_SESSION_WARNING = ( + "[Warning: your session was not recognised" + " — the app may have restarted." + " Please call tools/list to refresh your tool list." + " Please ask the user to reconnect to the MCP server.]" +) + + +def _inject_warning(response_data: dict[str, Any], warning: str) -> None: + """Append a warning to a JSON-RPC response dict. + + For successful ``tools/call`` responses the warning is added as an + extra text content block so the agent sees it alongside the result. + For error responses the warning is appended to the error message. + Other responses (tools/list, resources/*) are left unchanged — the + JSON-RPC spec forbids extra top-level keys. + """ + # tools/call success: result has a "content" list + result = response_data.get("result") + if isinstance(result, dict) and isinstance(result.get("content"), list): + result["content"].append({"type": "text", "text": warning}) + return + + # Error response + error = response_data.get("error") + if isinstance(error, dict) and "message" in error: + error["message"] += " " + warning + + +def _handle_initialize() -> InitializeResult: + return InitializeResult( + protocolVersion=LATEST_PROTOCOL_VERSION, + capabilities=ServerCapabilities( + tools=ToolsCapability(listChanged=True), + resources=ResourcesCapability(), + ), + serverInfo=Implementation(name="Plotly Dash", version=__version__), + instructions=( + "This is a Dash web application. " + "Dash apps are stateless: calling a tool executes " + "a callback and returns its result to you, but does " + "NOT update the user's browser. " + "Use tool results to answer questions about what " + "the app would produce for given inputs." + ), + ) + + +def _process_mcp_message(data: dict[str, Any]) -> dict[str, Any] | None: + """ + Process an MCP JSON-RPC message and return the response dict. + + Returns ``None`` for notifications (no ``id`` field). + """ + method = data.get("method", "") + params = data.get("params", {}) or {} + request_id = data.get("id") + + app = get_app() + if not hasattr(app, "mcp_callback_map"): + app.mcp_callback_map = CallbackAdapterCollection(app) + + mcp_methods = { + "initialize": _handle_initialize, + "tools/list": lambda: list_tools(), + "tools/call": lambda: call_tool( + params.get("name", ""), params.get("arguments", {}) + ), + "resources/list": lambda: list_resources(), + "resources/templates/list": lambda: list_resource_templates(), + "resources/read": lambda: read_resource(params.get("uri", "")), + } + + try: + handler = mcp_methods.get(method) + if handler is None: + if method.startswith("notifications/"): + return None + raise ValueError(f"Unknown method: {method}") + + result = handler() + + response = JSONRPCResponse( + jsonrpc="2.0", + id=request_id, + result=result.model_dump(exclude_none=True, mode="json"), + ) + return response.model_dump(exclude_none=True, mode="json") + + except MCPError as e: + logger.error("MCP error: %s", e) + return JSONRPCError( + jsonrpc="2.0", + id=request_id, + error=ErrorData(code=e.code, message=str(e)), + ).model_dump(exclude_none=True) + except Exception as e: + logger.error("MCP error: %s", e, exc_info=True) + return JSONRPCError( + jsonrpc="2.0", + id=request_id, + error=ErrorData(code=-32603, message=f"{type(e).__name__}: {e}"), + ).model_dump(exclude_none=True) diff --git a/dash/mcp/_sse.py b/dash/mcp/_sse.py new file mode 100644 index 0000000000..4928dc68b2 --- /dev/null +++ b/dash/mcp/_sse.py @@ -0,0 +1,67 @@ +"""SSE stream generation and queue management.""" + +from __future__ import annotations + +import queue +from typing import Any + +from flask import Response + + +def create_sse_stream(sessions: dict[str, dict[str, Any]], session_id: str) -> Response: + """Create a Server-Sent Events stream for the given session. + + Stores a :class:`queue.Queue` in ``sessions[session_id]["sse_queue"]`` + and returns a Flask streaming ``Response``. The generator yields + events pushed to the queue, with keepalive comments every 30 seconds. + """ + event_queue: queue.Queue[str | None] = queue.Queue() + # Replace any prior SSE queue for this session (client reconnect). + sessions[session_id]["sse_queue"] = event_queue + + def _generate(): + try: + while True: + try: + event = event_queue.get(timeout=30) + if event is None: + return # Sentinel: server closing stream + yield f"event: message\ndata: {event}\n\n" + except queue.Empty: + yield ": keepalive\n\n" + except GeneratorExit: + pass + finally: + # Clean up queue reference if it's still ours. + if sessions.get(session_id, {}).get("sse_queue") is event_queue: + sessions[session_id].pop("sse_queue", None) + + return Response( + _generate(), + content_type="text/event-stream", + headers={ + "Cache-Control": "no-cache", + "Connection": "keep-alive", + "mcp-session-id": session_id, + }, + ) + + +def close_sse_stream(session_data: dict[str, Any]) -> None: + """Send a sentinel to shut down the session's SSE stream cleanly.""" + sse_queue = session_data.get("sse_queue") + if sse_queue is not None: + try: + sse_queue.put_nowait(None) + except queue.Full: + pass + + +def shutdown_all_streams(sessions: dict[str, dict[str, Any]]) -> None: + """Close all active SSE streams. + + Called during server shutdown (via ``atexit``) so that connected + MCP clients see a clean stream end and can reconnect promptly. + """ + for session_data in list(sessions.values()): + close_sse_stream(session_data) diff --git a/dash/mcp/notifications/__init__.py b/dash/mcp/notifications/__init__.py new file mode 100644 index 0000000000..b1fe9e8665 --- /dev/null +++ b/dash/mcp/notifications/__init__.py @@ -0,0 +1,7 @@ +"""Server-initiated MCP notifications.""" + +from .notification_tools_changed import broadcast_tools_changed + +__all__ = [ + "broadcast_tools_changed", +] diff --git a/dash/mcp/notifications/notification_tools_changed.py b/dash/mcp/notifications/notification_tools_changed.py new file mode 100644 index 0000000000..1970667d1a --- /dev/null +++ b/dash/mcp/notifications/notification_tools_changed.py @@ -0,0 +1,30 @@ +"""Tool list change notifications.""" + +from __future__ import annotations + +import json +import queue +from typing import Any + + +def broadcast_tools_changed( + sessions: dict[str, dict[str, Any]], +) -> None: + """Push a tools/list_changed notification to all active SSE streams. + + Not called automatically yet — available for future hot-reload + or dynamic callback registration. + """ + notification = json.dumps( + { + "jsonrpc": "2.0", + "method": "notifications/tools/list_changed", + } + ) + for data in sessions.values(): + sse_queue = data.get("sse_queue") + if sse_queue is not None: + try: + sse_queue.put_nowait(notification) + except queue.Full: + pass diff --git a/dash/mcp/primitives/__init__.py b/dash/mcp/primitives/__init__.py index e69de29bb2..b14839f1e1 100644 --- a/dash/mcp/primitives/__init__.py +++ b/dash/mcp/primitives/__init__.py @@ -0,0 +1,17 @@ +from .resources import ( + list_resources, + list_resource_templates, + read_resource, +) +from .tools import ( + call_tool, + list_tools, +) + +__all__ = [ + call_tool, + list_resources, + list_resource_templates, + list_tools, + read_resource, +] diff --git a/dash/mcp/primitives/tools/callback_adapter_collection.py b/dash/mcp/primitives/tools/callback_adapter_collection.py index e740e7f0b8..4fdaeabe9c 100644 --- a/dash/mcp/primitives/tools/callback_adapter_collection.py +++ b/dash/mcp/primitives/tools/callback_adapter_collection.py @@ -35,8 +35,6 @@ def __init__(self, app): CallbackAdapter(callback_output_id=output_id) for output_id in self._tool_names_map ] - # TODO: enable_mcp_server() will replace this with a direct assignment on app - app.mcp_callback_map = self @staticmethod def _sanitize_name(name: str) -> str: diff --git a/tests/integration/mcp/conftest.py b/tests/integration/mcp/conftest.py new file mode 100644 index 0000000000..0f212d1763 --- /dev/null +++ b/tests/integration/mcp/conftest.py @@ -0,0 +1,53 @@ +"""Shared helpers for MCP integration tests.""" + +import requests + + +def _mcp_post(server_url, method, params=None, session_id=None, request_id=1): + headers = {"Content-Type": "application/json"} + if session_id: + headers["mcp-session-id"] = session_id + return requests.post( + f"{server_url}/_mcp", + json={ + "jsonrpc": "2.0", + "method": method, + "id": request_id, + "params": params or {}, + }, + headers=headers, + timeout=5, + ) + + +def _mcp_session(server_url): + resp = _mcp_post(server_url, "initialize") + resp.raise_for_status() + return resp.headers["mcp-session-id"] + + +def _mcp_tools(server_url): + sid = _mcp_session(server_url) + resp = _mcp_post(server_url, "tools/list", session_id=sid, request_id=2) + resp.raise_for_status() + return resp.json()["result"]["tools"] + + +def _mcp_call_tool(server_url, tool_name, arguments=None): + sid = _mcp_session(server_url) + resp = _mcp_post( + server_url, + "tools/call", + {"name": tool_name, "arguments": arguments or {}}, + session_id=sid, + request_id=2, + ) + resp.raise_for_status() + return resp.json() + + +def _mcp_method(server_url, method, params=None): + sid = _mcp_session(server_url) + resp = _mcp_post(server_url, method, params, session_id=sid, request_id=2) + resp.raise_for_status() + return resp.json() diff --git a/tests/integration/mcp/primitives/resources/test_resources.py b/tests/integration/mcp/primitives/resources/test_resources.py new file mode 100644 index 0000000000..dfc1e09f9b --- /dev/null +++ b/tests/integration/mcp/primitives/resources/test_resources.py @@ -0,0 +1,51 @@ +"""Integration tests for MCP resources.""" + +import json + +from dash import Dash, dcc, html + +from tests.integration.mcp.conftest import _mcp_method + + +def test_resources_list_includes_layout(dash_duo): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="dd", options=["a"], value="a"), + html.Div(id="out"), + ] + ) + + dash_duo.start_server(app) + result = _mcp_method(dash_duo.server.url, "resources/list") + + assert "result" in result + uris = [r["uri"] for r in result["result"]["resources"]] + assert "dash://layout" in uris + + +def test_read_layout_resource(dash_duo): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="res-dd", options=["x", "y"], value="x"), + html.Div(id="out"), + ] + ) + + dash_duo.start_server(app) + result = _mcp_method( + dash_duo.server.url, + "resources/read", + {"uri": "dash://layout"}, + ) + + assert "result" in result + layout = json.loads(result["result"]["contents"][0]["text"]) + assert layout["type"] == "Div" + children = layout["props"]["children"] + dd = next( + c for c in children if isinstance(c, dict) and c.get("type") == "Dropdown" + ) + assert dd["props"]["id"] == "res-dd" + assert dd["props"]["options"] == ["x", "y"] diff --git a/tests/integration/mcp/primitives/tools/test_callback_signatures.py b/tests/integration/mcp/primitives/tools/test_callback_signatures.py new file mode 100644 index 0000000000..db325f2046 --- /dev/null +++ b/tests/integration/mcp/primitives/tools/test_callback_signatures.py @@ -0,0 +1,958 @@ +""" +Integration tests for all Dash callback signature types. + +Each test verifies that: +1. The MCP tool schema accurately reflects the callback's parameters +2. Calling the tool with those parameters produces the expected result + +Assertions are derived from the callback definition, not the implementation. + +See: https://dash.plotly.com/flexible-callback-signatures +""" + +from dash import Dash, Input, Output, State, dcc, html + +from tests.integration.mcp.conftest import _mcp_call_tool, _mcp_tools + + +def _find_tool(tools, name): + return next(t for t in tools if t["name"] == name) + + +def _get_response(result): + return result["result"]["structuredContent"]["response"] + + +def test_positional_callback(dash_duo): + """Standard positional: Input("fruit", "value") → param named 'value'.""" + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="fruit", options=["apple", "banana"], value="apple"), + html.Div(id="out"), + ] + ) + + # Callback: 1 Input → 1 param named "value" (from function signature) + # Returns string → Output("out", "children") + @app.callback(Output("out", "children"), Input("fruit", "value")) + def show_fruit(value): + return f"Selected: {value}" + + dash_duo.start_server(app) + dash_duo.wait_for_text_to_equal("#out", "Selected: apple") + + tool = _find_tool(_mcp_tools(dash_duo.server.url), "show_fruit") + props = tool["inputSchema"]["properties"] + + assert set(props.keys()) == {"value"} + assert any(s.get("type") == "string" for s in props["value"]["anyOf"]) + + # Tool description reflects initial state + value_desc = props["value"].get("description", "") + assert "value: 'apple'" in value_desc + assert "options: ['apple', 'banana']" in value_desc + + # MCP tool with initial inputs matches browser + result = _mcp_call_tool(dash_duo.server.url, "show_fruit", {"value": "apple"}) + response = _get_response(result) + assert response["out"]["children"] == "Selected: apple" + + # MCP tool with different inputs + result = _mcp_call_tool(dash_duo.server.url, "show_fruit", {"value": "banana"}) + response = _get_response(result) + assert response["out"]["children"] == "Selected: banana" + + +def test_positional_with_state(dash_duo): + """Positional with State: Input + State both appear as params.""" + app = Dash(__name__) + app.layout = html.Div( + [ + html.Button(id="btn"), + dcc.Input(id="inp", value="hello"), + html.Div(id="out"), + ] + ) + + # Callback: 1 Input + 1 State → 2 params named "n_clicks" and "value" + @app.callback( + Output("out", "children"), + Input("btn", "n_clicks"), + State("inp", "value"), + ) + def update(n_clicks, value): + return f"Clicked {n_clicks} with {value}" + + dash_duo.start_server(app) + dash_duo.wait_for_text_to_equal("#out", "Clicked None with hello") + + tool = _find_tool(_mcp_tools(dash_duo.server.url), "update") + props = tool["inputSchema"]["properties"] + + assert set(props.keys()) == {"n_clicks", "value"} + assert any(s.get("type") == "number" for s in props["n_clicks"]["anyOf"]) + + # Tool description reflects initial state + assert "value: 'hello'" in props["value"].get("description", "") + + # MCP tool with initial inputs matches browser + result = _mcp_call_tool( + dash_duo.server.url, "update", {"n_clicks": None, "value": "hello"} + ) + response = _get_response(result) + assert response["out"]["children"] == "Clicked None with hello" + + result = _mcp_call_tool( + dash_duo.server.url, "update", {"n_clicks": 3, "value": "world"} + ) + response = _get_response(result) + assert response["out"]["children"] == "Clicked 3 with world" + + +def test_multi_output_positional(dash_duo): + """Multi-output: returns tuple → both outputs updated in response.""" + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="inp", value="test"), + html.Div(id="out1"), + html.Div(id="out2"), + ] + ) + + # Callback: 1 Input → 2 Outputs via tuple return + @app.callback( + Output("out1", "children"), + Output("out2", "children"), + Input("inp", "value"), + ) + def split_case(value): + return value.upper(), value.lower() + + dash_duo.start_server(app) + dash_duo.wait_for_text_to_equal("#out1", "TEST") + dash_duo.wait_for_text_to_equal("#out2", "test") + + tool = _find_tool(_mcp_tools(dash_duo.server.url), "split_case") + props = tool["inputSchema"]["properties"] + assert set(props.keys()) == {"value"} + + # Tool description reflects initial state + assert "value: 'test'" in props["value"].get("description", "") + + # MCP tool with initial inputs matches browser + result = _mcp_call_tool(dash_duo.server.url, "split_case", {"value": "test"}) + response = _get_response(result) + assert response["out1"]["children"] == "TEST" + assert response["out2"]["children"] == "test" + + +def test_dict_based_inputs_and_state(dash_duo): + """Dict-based: inputs=dict(trigger=...), state=dict(name=...) → dict keys are param names.""" + app = Dash(__name__) + app.layout = html.Div( + [ + html.Button(id="btn"), + dcc.Input(id="name-input", value="world"), + html.Div(id="out"), + ] + ) + + # Callback: dict keys "trigger" and "name" become param names + @app.callback( + Output("out", "children"), + inputs=dict(trigger=Input("btn", "n_clicks")), + state=dict(name=State("name-input", "value")), + ) + def greet(trigger, name): + return f"Hello, {name}!" + + dash_duo.start_server(app) + dash_duo.wait_for_text_to_equal("#out", "Hello, world!") + + tool = _find_tool(_mcp_tools(dash_duo.server.url), "greet") + props = tool["inputSchema"]["properties"] + + assert set(props.keys()) == {"trigger", "name"} + assert any(s.get("type") == "number" for s in props["trigger"]["anyOf"]) + + # MCP tool with initial inputs matches browser + result = _mcp_call_tool( + dash_duo.server.url, "greet", {"trigger": None, "name": "world"} + ) + response = _get_response(result) + assert response["out"]["children"] == "Hello, world!" + + result = _mcp_call_tool( + dash_duo.server.url, "greet", {"trigger": 1, "name": "Dash"} + ) + response = _get_response(result) + assert response["out"]["children"] == "Hello, Dash!" + + +def test_dict_based_outputs(dash_duo): + """Dict-based outputs: output=dict(...) → callback returns dict, both outputs updated.""" + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="inp", value="hello"), + html.Div(id="upper-out"), + html.Div(id="lower-out"), + ] + ) + + # Callback: dict output keys "upper" and "lower" map to components + @app.callback( + output=dict( + upper=Output("upper-out", "children"), + lower=Output("lower-out", "children"), + ), + inputs=dict(val=Input("inp", "value")), + ) + def transform(val): + return dict(upper=val.upper(), lower=val.lower()) + + dash_duo.start_server(app) + dash_duo.wait_for_text_to_equal("#upper-out", "HELLO") + dash_duo.wait_for_text_to_equal("#lower-out", "hello") + + tool = _find_tool(_mcp_tools(dash_duo.server.url), "transform") + props = tool["inputSchema"]["properties"] + assert set(props.keys()) == {"val"} + + # MCP tool with initial inputs matches browser + result = _mcp_call_tool(dash_duo.server.url, "transform", {"val": "hello"}) + response = _get_response(result) + assert response["upper-out"]["children"] == "HELLO" + assert response["lower-out"]["children"] == "hello" + + +def test_mixed_input_state_in_inputs(dash_duo): + """Mixed: State inside inputs=dict alongside Input → all appear as params.""" + app = Dash(__name__) + app.layout = html.Div( + [ + html.Button(id="btn"), + dcc.Input(id="first", value="Jane"), + dcc.Input(id="last", value="Doe"), + html.Div(id="out"), + ] + ) + + # Callback: Input and State mixed in same dict → all keys are params + @app.callback( + Output("out", "children"), + inputs=dict( + clicks=Input("btn", "n_clicks"), + first=State("first", "value"), + last=State("last", "value"), + ), + ) + def full_name(clicks, first, last): + return f"{first} {last}" + + dash_duo.start_server(app) + dash_duo.wait_for_text_to_equal("#out", "Jane Doe") + + tool = _find_tool(_mcp_tools(dash_duo.server.url), "full_name") + props = tool["inputSchema"]["properties"] + + assert set(props.keys()) == {"clicks", "first", "last"} + assert any(s.get("type") == "number" for s in props["clicks"]["anyOf"]) + + # MCP tool with initial inputs matches browser + result = _mcp_call_tool( + dash_duo.server.url, + "full_name", + {"clicks": None, "first": "Jane", "last": "Doe"}, + ) + response = _get_response(result) + assert response["out"]["children"] == "Jane Doe" + + result = _mcp_call_tool( + dash_duo.server.url, + "full_name", + {"clicks": 1, "first": "John", "last": "Smith"}, + ) + response = _get_response(result) + assert response["out"]["children"] == "John Smith" + + +def test_tuple_grouped_inputs(dash_duo): + """Tuple grouping: pair=(Input("a",...), Input("b",...)) → expands to two named params.""" + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="a", value="1"), + dcc.Input(id="b", value="2"), + html.Div(id="out"), + ] + ) + + # Callback: tuple group "pair" maps to 2 deps → 2 params named pair___ + @app.callback( + Output("out", "children"), + inputs=dict(pair=(Input("a", "value"), Input("b", "value"))), + ) + def combine(pair): + return f"{pair[0]}+{pair[1]}" + + dash_duo.start_server(app) + tool = _find_tool(_mcp_tools(dash_duo.server.url), "combine") + props = tool["inputSchema"]["properties"] + + # Tuple expands: one param per dep, named with group prefix + component info + assert set(props.keys()) == {"pair_a__value", "pair_b__value"} + for schema in props.values(): + assert any(s.get("type") == "string" for s in schema["anyOf"]) + + result = _mcp_call_tool( + dash_duo.server.url, + "combine", + {"pair_a__value": "x", "pair_b__value": "y"}, + ) + response = _get_response(result) + assert response["out"]["children"] == "x+y" + + +def test_initial_values_from_chained_callbacks(dash_duo): + """Querying components reflects post-initial-callback values. + + 3-link chain: country (default "France") → update_states → + state (should become "Ile-de-France") → update_cities → + city (should become "Paris"). + """ + DATA = { + "France": { + "Ile-de-France": ["Paris", "Versailles"], + "Provence": ["Marseille", "Nice"], + }, + "Germany": { + "Bavaria": ["Munich", "Nuremberg"], + "Berlin": ["Berlin"], + }, + } + + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="country", options=list(DATA.keys()), value="France"), + dcc.Dropdown(id="state"), + dcc.Dropdown(id="city"), + ] + ) + + @app.callback( + Output("state", "options"), + Output("state", "value"), + Input("country", "value"), + ) + def update_states(country): + if not country: + return [], None + states = list(DATA[country].keys()) + return [{"label": s, "value": s} for s in states], states[0] + + @app.callback( + Output("city", "options"), + Output("city", "value"), + Input("state", "value"), + Input("country", "value"), + ) + def update_cities(state, country): + if not state or not country: + return [], None + cities = DATA[country][state] + return [{"label": c, "value": c} for c in cities], cities[0] + + dash_duo.start_server(app) + + # Tool descriptions should reflect post-initial-callback state + tools = _mcp_tools(dash_duo.server.url) + update_cities_tool = _find_tool(tools, "update_cities") + state_desc = update_cities_tool["inputSchema"]["properties"]["state"].get( + "description", "" + ) + # state.value was set to "Ile-de-France" by update_states initial callback + assert "Ile-de-France" in state_desc + + # state.value should be "Ile-de-France" (first state for France) + result = _mcp_call_tool( + dash_duo.server.url, + "get_dash_component", + {"component_id": "state", "property": "value"}, + ) + state_props = result["result"]["structuredContent"]["properties"] + assert state_props["value"]["initial_value"] == "Ile-de-France" + + # city.value should be "Paris" (first city for Ile-de-France) + result = _mcp_call_tool( + dash_duo.server.url, + "get_dash_component", + {"component_id": "city", "property": "value"}, + ) + city_props = result["result"]["structuredContent"]["properties"] + assert city_props["value"]["initial_value"] == "Paris" + + +def test_dict_based_reordered_state_input(dash_duo): + """Dict-based callback with State before Input: call works, schema types correct. + + State is listed before Input in the dict. The callback should still + work correctly via MCP, and the schema types should match the + function annotations (name: str, trigger: int), not be swapped. + """ + app = Dash(__name__) + app.layout = html.Div( + [ + html.Button(id="btn"), + dcc.Input(id="inp", value="World"), + html.Div(id="out"), + ] + ) + + @app.callback( + Output("out", "children"), + inputs=dict(name=State("inp", "value"), trigger=Input("btn", "n_clicks")), + ) + def greet(name: str, trigger: int): + return f"Hello {name}" + + dash_duo.start_server(app) + + # First: verify the callback actually works with these args + result = _mcp_call_tool( + dash_duo.server.url, + "greet", + {"name": "Dash", "trigger": 1}, + ) + assert _get_response(result)["out"]["children"] == "Hello Dash" + + # Second: verify schema types match annotations + tool = _find_tool(_mcp_tools(dash_duo.server.url), "greet") + props = tool["inputSchema"]["properties"] + assert props["trigger"]["type"] == "integer" + assert props["name"]["type"] == "string" + + # Third: verify each param describes the correct component + trigger_desc = props["trigger"].get("description", "") + assert "number of times that this element has been clicked on" in trigger_desc + name_desc = props["name"].get("description", "") + assert "The value of the input" in name_desc + + +def test_pattern_matching_callback(dash_duo): + """Pattern-matching dict IDs: tool works with correct params and results.""" + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id={"type": "field", "index": 0}, value="hello"), + dcc.Input(id={"type": "field", "index": 1}, value="world"), + html.Div(id="out"), + ] + ) + + @app.callback( + Output("out", "children"), + Input({"type": "field", "index": 0}, "value"), + Input({"type": "field", "index": 1}, "value"), + ) + def combine(first, second): + return f"{first} {second}" + + dash_duo.start_server(app) + + tool = _find_tool(_mcp_tools(dash_duo.server.url), "combine") + assert tool is not None + props = tool["inputSchema"]["properties"] + assert "first" in props + assert "second" in props + + # Verify initial output matches what the browser shows + dash_duo.wait_for_text_to_equal("#out", "hello world") + result = _mcp_call_tool( + dash_duo.server.url, + "combine", + {"first": "hello", "second": "world"}, + ) + response = _get_response(result) + assert response["out"]["children"] == "hello world" + + # Verify with different values + result = _mcp_call_tool( + dash_duo.server.url, + "combine", + {"first": "foo", "second": "bar"}, + ) + response = _get_response(result) + assert response["out"]["children"] == "foo bar" + + +def test_pattern_matching_with_all_wildcard(dash_duo): + """ALL wildcard: one callback receives values from all matching components.""" + from dash import ALL + + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id={"type": "input", "index": 0}, value="alpha"), + dcc.Input(id={"type": "input", "index": 1}, value="beta"), + html.Div(id="summary"), + ] + ) + + @app.callback( + Output("summary", "children"), + Input({"type": "input", "index": ALL}, "value"), + ) + def summarize(values): + return ", ".join(v for v in values if v) + + dash_duo.start_server(app) + dash_duo.wait_for_text_to_equal("#summary", "alpha, beta") + + tool = _find_tool(_mcp_tools(dash_duo.server.url), "summarize") + assert tool is not None + + # Schema must describe values as an array of {id, property, value} objects + values_schema = tool["inputSchema"]["properties"]["values"] + assert ( + values_schema["type"] == "array" + ), f"ALL wildcard param should be typed as array, got: {values_schema}" + assert "items" in values_schema, "Array schema should include items definition" + items = values_schema["items"] + assert items["type"] == "object" + assert "id" in items["properties"] + assert "value" in items["properties"] + assert "Pattern-matching input (ALL)" in values_schema.get( + "description", "" + ), "ALL wildcard param description should explain the pattern-matching behavior" + + # MCP tool call with browser-like format: concrete IDs + values + result = _mcp_call_tool( + dash_duo.server.url, + "summarize", + { + "values": [ + { + "id": {"type": "input", "index": 0}, + "property": "value", + "value": "alpha", + }, + { + "id": {"type": "input", "index": 1}, + "property": "value", + "value": "beta", + }, + ] + }, + ) + response = _get_response(result) + assert response["summary"]["children"] == "alpha, beta" + + # Different values + result = _mcp_call_tool( + dash_duo.server.url, + "summarize", + { + "values": [ + { + "id": {"type": "input", "index": 0}, + "property": "value", + "value": "one", + }, + { + "id": {"type": "input", "index": 1}, + "property": "value", + "value": "two", + }, + ] + }, + ) + response = _get_response(result) + assert response["summary"]["children"] == "one, two" + + +def test_pattern_matching_mixed_outputs(dash_duo): + """Mixed outputs: one regular + one ALL wildcard in the same callback.""" + from dash import ALL + + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id={"type": "field", "index": 0}, value="a"), + dcc.Input(id={"type": "field", "index": 1}, value="b"), + html.Div(id={"type": "echo", "index": 0}), + html.Div(id={"type": "echo", "index": 1}), + html.Div(id="total"), + ] + ) + + @app.callback( + Output({"type": "echo", "index": ALL}, "children"), + Output("total", "children"), + Input({"type": "field", "index": ALL}, "value"), + ) + def echo_and_total(values): + echoes = [f"Echo: {v}" for v in values] + total = f"Total: {len(values)} items" + return echoes, total + + dash_duo.start_server(app) + dash_duo.wait_for_text_to_equal("#total", "Total: 2 items") + + result = _mcp_call_tool( + dash_duo.server.url, + "echo_and_total", + { + "values": [ + { + "id": {"type": "field", "index": 0}, + "property": "value", + "value": "x", + }, + { + "id": {"type": "field", "index": 1}, + "property": "value", + "value": "y", + }, + ] + }, + ) + response = _get_response(result) + assert response["total"]["children"] == "Total: 2 items" + + +def test_pattern_matching_with_match_wildcard(dash_duo): + """MATCH wildcard: callback fires per-component with matching index. + + Based on https://dash.plotly.com/pattern-matching-callbacks + """ + from dash import MATCH + + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown( + ["NYC", "MTL", "LA", "TOKYO"], + "NYC", + id={"type": "city-dd", "index": 0}, + ), + html.Div(id={"type": "city-out", "index": 0}), + dcc.Dropdown( + ["NYC", "MTL", "LA", "TOKYO"], + "LA", + id={"type": "city-dd", "index": 1}, + ), + html.Div(id={"type": "city-out", "index": 1}), + ] + ) + + @app.callback( + Output({"type": "city-out", "index": MATCH}, "children"), + Input({"type": "city-dd", "index": MATCH}, "value"), + ) + def show_city(value): + return f"Selected: {value}" + + dash_duo.start_server(app) + + tool = _find_tool(_mcp_tools(dash_duo.server.url), "show_city") + assert tool is not None + + # Schema describes MATCH input + value_schema = tool["inputSchema"]["properties"]["value"] + assert "Pattern-matching input (MATCH)" in value_schema.get("description", "") + + # Call with concrete ID for index 0 (MATCH takes a single entry, not an array) + result = _mcp_call_tool( + dash_duo.server.url, + "show_city", + { + "value": { + "id": {"type": "city-dd", "index": 0}, + "property": "value", + "value": "MTL", + } + }, + ) + response = _get_response(result) + # Find the output key containing "city-out" (Dash may serialize dict IDs differently) + out_key = next(k for k in response if "city-out" in k) + assert response[out_key]["children"] == "Selected: MTL" + + +def test_pattern_matching_with_allsmaller_wildcard(dash_duo): + """ALLSMALLER wildcard: receives values from components with smaller index. + + Based on https://dash.plotly.com/pattern-matching-callbacks + """ + from dash import MATCH, ALLSMALLER + + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown( + ["France", "Germany", "Japan"], + "France", + id={"type": "country-dd", "index": 0}, + ), + html.Div(id={"type": "country-out", "index": 0}), + dcc.Dropdown( + ["France", "Germany", "Japan"], + "Germany", + id={"type": "country-dd", "index": 1}, + ), + html.Div(id={"type": "country-out", "index": 1}), + dcc.Dropdown( + ["France", "Germany", "Japan"], + "Japan", + id={"type": "country-dd", "index": 2}, + ), + html.Div(id={"type": "country-out", "index": 2}), + ] + ) + + @app.callback( + Output({"type": "country-out", "index": MATCH}, "children"), + Input({"type": "country-dd", "index": MATCH}, "value"), + Input({"type": "country-dd", "index": ALLSMALLER}, "value"), + ) + def show_countries(current, previous): + all_selected = [current] + list(reversed(previous)) + return f"All: {', '.join(all_selected)}" + + dash_duo.start_server(app) + + tool = _find_tool(_mcp_tools(dash_duo.server.url), "show_countries") + assert tool is not None + + # Schema describes both MATCH and ALLSMALLER inputs + props = tool["inputSchema"]["properties"] + assert "Pattern-matching input (MATCH)" in props["current"].get("description", "") + assert "Pattern-matching input (ALLSMALLER)" in props["previous"].get( + "description", "" + ) + + # Call for index 2: MATCH is a single dict, ALLSMALLER is a list + result = _mcp_call_tool( + dash_duo.server.url, + "show_countries", + { + "current": { + "id": {"type": "country-dd", "index": 2}, + "property": "value", + "value": "Japan", + }, + "previous": [ + { + "id": {"type": "country-dd", "index": 0}, + "property": "value", + "value": "France", + }, + { + "id": {"type": "country-dd", "index": 1}, + "property": "value", + "value": "Germany", + }, + ], + }, + ) + response = _get_response(result) + out_key = next(k for k in response if "country-out" in k) + assert response[out_key]["children"] == "All: Japan, Germany, France" + + +def test_prevent_initial_call_uses_layout_default(dash_duo): + """prevent_initial_call=True: initial value stays as the layout default. + + The dropdown has value="original" in the layout. The callback has + prevent_initial_call=True so it doesn't run on page load. The MCP + tool description should show value: 'a' (layout default). + """ + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="dd", options=["a", "b", "c"], value="a"), + html.Div(id="out", children="not yet"), + ] + ) + + @app.callback( + Output("out", "children"), + Input("dd", "value"), + prevent_initial_call=True, + ) + def update(val): + return f"Changed to: {val}" + + dash_duo.start_server(app) + # Browser shows layout default — callback hasn't fired + dash_duo.wait_for_text_to_equal("#out", "not yet") + + tool = _find_tool(_mcp_tools(dash_duo.server.url), "update") + val_desc = tool["inputSchema"]["properties"]["val"].get("description", "") + + # Tool description reflects layout default, not callback output + assert "value: 'a'" in val_desc + + +def test_initial_callback_overrides_layout_value(dash_duo): + """Initial callback overrides layout value in tool description. + + The city dropdown has value="default-city" in the layout. + update_city runs on page load (no prevent_initial_call) and + sets city.value to "Paris". The MCP tool should show "Paris" + as the default, not "default-city". + """ + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="country", options=["France", "Germany"], value="France"), + dcc.Dropdown(id="city", options=[], value="default-city"), + html.Div(id="out"), + ] + ) + + @app.callback( + Output("city", "options"), + Output("city", "value"), + Input("country", "value"), + ) + def update_city(country): + if country == "France": + return [{"label": "Paris", "value": "Paris"}], "Paris" + return [{"label": "Berlin", "value": "Berlin"}], "Berlin" + + @app.callback(Output("out", "children"), Input("city", "value")) + def show_city(city): + return f"City: {city}" + + dash_duo.start_server(app) + # Browser shows "Paris" — the initial callback overrode "default-city" + dash_duo.wait_for_text_to_equal("#out", "City: Paris") + + tool = _find_tool(_mcp_tools(dash_duo.server.url), "show_city") + city_desc = tool["inputSchema"]["properties"]["city"].get("description", "") + + # Tool description should show the post-initial-callback value + assert "value: 'Paris'" in city_desc + assert "default-city" not in city_desc + + +def test_callback_context_triggered_id(dash_duo): + """Callbacks using dash.ctx.triggered_id work via MCP. + + Based on https://dash.plotly.com/determining-which-callback-input-changed + """ + from dash import ctx + + app = Dash(__name__) + app.layout = html.Div( + [ + html.Button("Button 1", id="btn-1"), + html.Button("Button 2", id="btn-2"), + html.Button("Button 3", id="btn-3"), + html.Div(id="output"), + ] + ) + + @app.callback( + Output("output", "children"), + Input("btn-1", "n_clicks"), + Input("btn-2", "n_clicks"), + Input("btn-3", "n_clicks"), + ) + def display(btn1, btn2, btn3): + if not ctx.triggered_id: + return "No button clicked yet" + return f"Last clicked: {ctx.triggered_id}" + + dash_duo.start_server(app) + + # Browser initial state: no button clicked + dash_duo.wait_for_text_to_equal("#output", "No button clicked yet") + + # Tool should have all three button params + tool = _find_tool(_mcp_tools(dash_duo.server.url), "display") + props = tool["inputSchema"]["properties"] + assert "btn1" in props + assert "btn2" in props + assert "btn3" in props + + # Click btn-2 via MCP — ctx.triggered_id should be "btn-2" + result = _mcp_call_tool( + dash_duo.server.url, + "display", + {"btn1": None, "btn2": 1, "btn3": None}, + ) + response = _get_response(result) + assert response["output"]["children"] == "Last clicked: btn-2" + + # Click btn-3 via MCP + result = _mcp_call_tool( + dash_duo.server.url, + "display", + {"btn1": None, "btn2": None, "btn3": 5}, + ) + response = _get_response(result) + assert response["output"]["children"] == "Last clicked: btn-3" + + +def test_no_output_callback_does_not_crash_tools_list(dash_duo): + """A callback with no Output should not crash tools/list. + + No-output callbacks use set_props for side effects. They produce + a hash-only output_id with no dot separator. + """ + from dash import set_props + + app = Dash(__name__) + app.layout = html.Div( + [ + html.Button("Log", id="log-btn"), + dcc.Dropdown(id="picker", options=["a", "b"], value="a"), + html.Div(id="display"), + ] + ) + + @app.callback(Input("log-btn", "n_clicks"), prevent_initial_call=True) + def log_click(n): + set_props("display", {"children": f"Logged {n} clicks"}) + + @app.callback(Output("display", "children"), Input("picker", "value")) + def show_selection(val): + return f"Selected: {val}" + + dash_duo.start_server(app) + + tools = _mcp_tools(dash_duo.server.url) + tool_names = [t["name"] for t in tools] + + # show_selection should appear as a tool + assert "show_selection" in tool_names + + # log_click has no declared output but uses set_props — still a valid tool + assert "log_click" in tool_names + + # Call log_click — sideUpdate should show the set_props effect + result = _mcp_call_tool( + dash_duo.server.url, + "log_click", + {"n": 3}, + ) + structured = result["result"]["structuredContent"] + assert "sideUpdate" in structured + assert structured["sideUpdate"]["display"]["children"] == "Logged 3 clicks" + + # get_dash_component shows show_selection as modifier (declared output). + # log_click uses set_props which bypasses the declarative graph — + # its effect is only visible via sideUpdate in tool call results. + result = _mcp_call_tool( + dash_duo.server.url, + "get_dash_component", + {"component_id": "display", "property": "children"}, + ) + prop_info = result["result"]["structuredContent"]["properties"]["children"] + assert "show_selection" in prop_info["modified_by_tool"] diff --git a/tests/integration/mcp/primitives/tools/test_duplicate_outputs.py b/tests/integration/mcp/primitives/tools/test_duplicate_outputs.py new file mode 100644 index 0000000000..4ad00641f8 --- /dev/null +++ b/tests/integration/mcp/primitives/tools/test_duplicate_outputs.py @@ -0,0 +1,128 @@ +"""Integration test for duplicate callback outputs. + +Multiple callbacks can output to the same component.property +when using ``allow_duplicate=True``. The MCP server must handle +this correctly — both callbacks should appear as tools, and +calling either should work. +""" + +from dash import Dash, Input, Output, dcc, html + +from tests.integration.mcp.conftest import _mcp_call_tool, _mcp_tools + + +def _find_tool(tools, name): + return next((t for t in tools if t["name"] == name), None) + + +def _get_response(result): + return result["result"]["structuredContent"]["response"] + + +def test_duplicate_outputs_both_tools_listed(dash_duo): + """Both callbacks outputting to the same component appear as tools.""" + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="first-name", value="Jane"), + dcc.Input(id="last-name", value="Doe"), + html.Div(id="greeting"), + ] + ) + + @app.callback( + Output("greeting", "children"), + Input("first-name", "value"), + ) + def greet_by_first(first): + return f"Hello, {first}!" + + @app.callback( + Output("greeting", "children", allow_duplicate=True), + Input("last-name", "value"), + prevent_initial_call=True, + ) + def greet_by_last(last): + return f"Hi, {last}!" + + dash_duo.start_server(app) + tools = _mcp_tools(dash_duo.server.url) + + first_tool = _find_tool(tools, "greet_by_first") + last_tool = _find_tool(tools, "greet_by_last") + + assert first_tool is not None, "greet_by_first should be listed" + assert last_tool is not None, "greet_by_last should be listed" + + +def test_duplicate_outputs_both_callable(dash_duo): + """Both callbacks can be called and produce correct results.""" + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="first-name", value="Jane"), + dcc.Input(id="last-name", value="Doe"), + html.Div(id="greeting"), + ] + ) + + @app.callback( + Output("greeting", "children"), + Input("first-name", "value"), + ) + def greet_by_first(first): + return f"Hello, {first}!" + + @app.callback( + Output("greeting", "children", allow_duplicate=True), + Input("last-name", "value"), + prevent_initial_call=True, + ) + def greet_by_last(last): + return f"Hi, {last}!" + + dash_duo.start_server(app) + + result1 = _mcp_call_tool(dash_duo.server.url, "greet_by_first", {"first": "Alice"}) + assert _get_response(result1)["greeting"]["children"] == "Hello, Alice!" + + result2 = _mcp_call_tool(dash_duo.server.url, "greet_by_last", {"last": "Smith"}) + assert _get_response(result2)["greeting"]["children"] == "Hi, Smith!" + + +def test_duplicate_outputs_find_by_output_returns_primary(dash_duo): + """find_by_output returns the primary (non-duplicate) callback.""" + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="first-name", value="Jane"), + dcc.Input(id="last-name", value="Doe"), + html.Div(id="greeting"), + ] + ) + + @app.callback( + Output("greeting", "children"), + Input("first-name", "value"), + ) + def greet_by_first(first): + return f"Hello, {first}!" + + @app.callback( + Output("greeting", "children", allow_duplicate=True), + Input("last-name", "value"), + prevent_initial_call=True, + ) + def greet_by_last(last): + return f"Hi, {last}!" + + dash_duo.start_server(app) + + # Query the component — should reflect initial callback (greet_by_first) + result = _mcp_call_tool( + dash_duo.server.url, + "get_dash_component", + {"component_id": "greeting", "property": "children"}, + ) + structured = result["result"]["structuredContent"] + assert structured["properties"]["children"]["initial_value"] == "Hello, Jane!" diff --git a/tests/integration/mcp/primitives/tools/test_input_schemas.py b/tests/integration/mcp/primitives/tools/test_input_schemas.py new file mode 100644 index 0000000000..6ee3510ddd --- /dev/null +++ b/tests/integration/mcp/primitives/tools/test_input_schemas.py @@ -0,0 +1,66 @@ +""" +Integration tests for MCP tool schema generation. + +Starts a real Dash server via ``dash_duo`` and verifies that tools +are generated with correct inputSchema, descriptions, and labels. +""" + +from dash import Dash, Input, Output, dcc, html + +from tests.integration.mcp.conftest import _mcp_tools + + +def test_mcp_tool_with_label_and_date_picker_schema(dash_duo): + """Full assertion on a tool with an html.Label and DatePickerSingle constraints.""" + + # -- Test data: change these to update the test -- + label_text = "Departure Date" + component_id = "dp" + min_date = "2020-01-01" + max_date = "2025-12-31" + default_date = "2024-06-15" + func_name = "select_date" + param_name = "date" # function parameter name + + app = Dash(__name__) + app.layout = html.Div( + [ + html.Label(label_text, htmlFor=component_id), + dcc.DatePickerSingle( + id=component_id, + min_date_allowed=min_date, + max_date_allowed=max_date, + date=default_date, + ), + html.Div(id="out"), + ] + ) + + @app.callback(Output("out", "children"), Input(component_id, "date")) + def select_date(date): + return f"Selected: {date}" + + dash_duo.start_server(app) + tools = _mcp_tools(dash_duo.server.url) + + # Find the callback tool + tool = next(t for t in tools if t["name"] not in ("get_dash_component",)) + + # -- Tool-level fields -- + assert func_name in tool["name"] + + # -- inputSchema structure -- + schema = tool["inputSchema"] + assert schema["type"] == "object" + assert param_name in schema["required"] + assert param_name in schema["properties"] + + # -- Property schema: type + format + description -- + prop = schema["properties"][param_name] + assert prop["type"] == "string" + assert prop["format"] == "date" + + # description includes all source values (label, constraints, default) + desc = prop["description"] + for expected in (label_text, min_date, max_date, default_date): + assert expected in desc, f"Expected {expected!r} in description: {desc!r}" diff --git a/tests/integration/mcp/primitives/tools/test_tool_get_dash_component.py b/tests/integration/mcp/primitives/tools/test_tool_get_dash_component.py new file mode 100644 index 0000000000..97472a16d7 --- /dev/null +++ b/tests/integration/mcp/primitives/tools/test_tool_get_dash_component.py @@ -0,0 +1,54 @@ +"""Integration tests for the get_dash_component tool.""" + +from dash import Dash, dcc, html + +from tests.integration.mcp.conftest import _mcp_call_tool + +EXPECTED_DROPDOWN_OPTIONS = { + "component_id": "my-dropdown", + "component_type": "Dropdown", + "label": None, + "properties": { + "options": { + "initial_value": [ + {"label": "New York", "value": "NYC"}, + {"label": "Montreal", "value": "MTL"}, + ], + "modified_by_tool": [], + "input_to_tool": [], + }, + }, +} + + +def test_query_component_returns_structured_output(dash_duo): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown( + id="my-dropdown", + options=[ + {"label": "New York", "value": "NYC"}, + {"label": "Montreal", "value": "MTL"}, + ], + value="NYC", + ), + ] + ) + + dash_duo.start_server(app) + + result = _mcp_call_tool( + dash_duo.server.url, + "get_dash_component", + {"component_id": "my-dropdown", "property": "options"}, + ) + + assert "result" in result, f"Expected result in response: {result}" + structured = result["result"]["structuredContent"] + assert structured["component_id"] == EXPECTED_DROPDOWN_OPTIONS["component_id"] + assert structured["component_type"] == EXPECTED_DROPDOWN_OPTIONS["component_type"] + assert ( + structured["properties"]["options"] + == EXPECTED_DROPDOWN_OPTIONS["properties"]["options"] + ) diff --git a/tests/integration/mcp/primitives/tools/test_tools_list.py b/tests/integration/mcp/primitives/tools/test_tools_list.py new file mode 100644 index 0000000000..dc3d977146 --- /dev/null +++ b/tests/integration/mcp/primitives/tools/test_tools_list.py @@ -0,0 +1,118 @@ +"""Integration tests for tools/list — naming, dedup, and spec compliance.""" + +from dash import Dash, Input, Output, dcc, html + +from tests.integration.mcp.conftest import _mcp_tools + + +def test_tool_names_within_64_chars(dash_duo): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="dd", options=["a"], value="a"), + html.Div(id="out"), + ] + ) + + @app.callback(Output("out", "children"), Input("dd", "value")) + def update(val): + return val + + dash_duo.start_server(app) + for tool in _mcp_tools(dash_duo.server.url): + assert len(tool["name"]) <= 64, f"Tool name exceeds 64 chars: {tool['name']}" + for param_name in tool.get("inputSchema", {}).get("properties", {}): + assert len(param_name) <= 64, f"Param name exceeds 64 chars: {param_name}" + + +def test_long_callback_ids_within_64_chars(dash_duo): + app = Dash(__name__) + long_id = "a" * 120 + app.layout = html.Div( + [ + dcc.Input(id=long_id, value="test"), + html.Div(id=f"{long_id}-output"), + ] + ) + + @app.callback(Output(f"{long_id}-output", "children"), Input(long_id, "value")) + def process(val): + return val + + dash_duo.start_server(app) + for tool in _mcp_tools(dash_duo.server.url): + assert len(tool["name"]) <= 64, f"Tool name exceeds 64 chars: {tool['name']}" + + +def test_pattern_matching_ids_within_64_chars(dash_duo): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div( + [ + dcc.Input( + id={"type": "filter-input", "index": i, "category": "primary"}, + value=f"val-{i}", + ) + for i in range(3) + ] + ), + html.Div(id="pm-output"), + ] + ) + + @app.callback( + Output("pm-output", "children"), + Input({"type": "filter-input", "index": 0, "category": "primary"}, "value"), + ) + def filter_update(v0): + return str(v0) + + dash_duo.start_server(app) + for tool in _mcp_tools(dash_duo.server.url): + assert len(tool["name"]) <= 64, f"Tool name exceeds 64 chars: {tool['name']}" + + +def test_duplicate_func_names_produce_unique_tools(dash_duo): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="dd1", options=["a"], value="a"), + html.Div(id="dd1-output"), + dcc.Dropdown(id="dd2", options=["b"], value="b"), + html.Div(id="dd2-output"), + dcc.Dropdown(id="dd3", options=["c"], value="c"), + html.Div(id="dd3-output"), + ] + ) + + @app.callback(Output("dd1-output", "children"), Input("dd1", "value")) + def cb(value): + return f"first: {value}" + + @app.callback(Output("dd2-output", "children"), Input("dd2", "value")) + def cb(value): # noqa: F811 + return f"second: {value}" + + @app.callback(Output("dd3-output", "children"), Input("dd3", "value")) + def cb(value): # noqa: F811 + return f"third: {value}" + + dash_duo.start_server(app) + tools = _mcp_tools(dash_duo.server.url) + cb_tools = [t for t in tools if t["name"] not in ("get_dash_component",)] + tool_names = [t["name"] for t in cb_tools] + + assert ( + len(tool_names) == 3 + ), f"Expected 3 callback tools, got {len(tool_names)}: {tool_names}" + assert len(set(tool_names)) == 3, f"Tool names not unique: {tool_names}" + + +def test_builtin_tools_always_present(dash_duo): + app = Dash(__name__) + app.layout = html.Div(id="root") + + dash_duo.start_server(app) + tool_names = [t["name"] for t in _mcp_tools(dash_duo.server.url)] + assert "get_dash_component" in tool_names diff --git a/tests/integration/mcp/test_server.py b/tests/integration/mcp/test_server.py new file mode 100644 index 0000000000..7af88bfbff --- /dev/null +++ b/tests/integration/mcp/test_server.py @@ -0,0 +1,304 @@ +"""Integration tests for the MCP Streamable HTTP endpoint. + +These tests use Flask's test_client to exercise the HTTP transport layer +(POST/GET/DELETE at /_mcp), session management, content-type handling, +and route registration/configuration. +""" + +import json +import os + +from dash import Dash, Input, Output, html +from mcp.types import LATEST_PROTOCOL_VERSION + +MCP_PATH = "_mcp" + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def _make_app(**kwargs): + """Create a minimal Dash app with a layout and one callback.""" + app = Dash(__name__, **kwargs) + app.layout = html.Div( + [ + html.Div(id="my-input"), + html.Div(id="my-output"), + ] + ) + + @app.callback(Output("my-output", "children"), Input("my-input", "children")) + def update_output(value): + """Test callback docstring.""" + return f"echo: {value}" + + return app + + +# --------------------------------------------------------------------------- +# Tests +# --------------------------------------------------------------------------- + + +class TestMCPEndpoint: + """Tests for the Streamable HTTP MCP endpoint at /_mcp.""" + + def test_post_initialize_creates_session(self): + app = _make_app() + client = app.server.test_client() + r = client.post( + f"/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} + ), + content_type="application/json", + ) + assert r.status_code == 200 + assert "mcp-session-id" in r.headers + data = json.loads(r.data) + assert data["result"]["protocolVersion"] == LATEST_PROTOCOL_VERSION + + def test_post_without_session_auto_assigns(self): + app = _make_app() + client = app.server.test_client() + r = client.post( + f"/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "tools/list", "id": 1, "params": {}} + ), + content_type="application/json", + ) + assert r.status_code == 200 + assert "mcp-session-id" in r.headers + data = json.loads(r.data) + assert "tools" in data["result"] + + def test_stale_session_error_includes_hint(self): + app = _make_app() + client = app.server.test_client() + r = client.post( + f"/{MCP_PATH}", + data=json.dumps( + { + "jsonrpc": "2.0", + "method": "tools/call", + "id": 1, + "params": {"name": "no_such_tool", "arguments": {}}, + } + ), + content_type="application/json", + headers={"mcp-session-id": "old-session-from-before-restart"}, + ) + assert r.status_code == 200 + data = json.loads(r.data) + assert "session was not recognised" in data["error"]["message"] + assert "tools/list" in data["error"]["message"] + + def test_post_with_valid_session(self): + app = _make_app() + client = app.server.test_client() + # Initialize to get session + r1 = client.post( + f"/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} + ), + content_type="application/json", + ) + session_id = r1.headers["mcp-session-id"] + # Use session for tools/list + r2 = client.post( + f"/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "tools/list", "id": 2, "params": {}} + ), + content_type="application/json", + headers={"mcp-session-id": session_id}, + ) + assert r2.status_code == 200 + data = json.loads(r2.data) + assert "result" in data + assert "tools" in data["result"] + + def test_notification_returns_202(self): + app = _make_app() + client = app.server.test_client() + # Initialize to get session + r1 = client.post( + f"/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} + ), + content_type="application/json", + ) + session_id = r1.headers["mcp-session-id"] + # Send notification (no id field) + r2 = client.post( + f"/{MCP_PATH}", + data=json.dumps({"jsonrpc": "2.0", "method": "notifications/initialized"}), + content_type="application/json", + headers={"mcp-session-id": session_id}, + ) + assert r2.status_code == 202 + + def test_delete_terminates_session(self): + app = _make_app() + client = app.server.test_client() + # Initialize + r1 = client.post( + f"/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} + ), + content_type="application/json", + ) + session_id = r1.headers["mcp-session-id"] + # Delete + r2 = client.delete( + f"/{MCP_PATH}", + headers={"mcp-session-id": session_id}, + ) + assert r2.status_code == 204 + # Post-delete requests still succeed + r3 = client.post( + f"/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "tools/list", "id": 2, "params": {}} + ), + content_type="application/json", + headers={"mcp-session-id": session_id}, + ) + assert r3.status_code == 200 + + def test_delete_nonexistent_session_returns_404(self): + app = _make_app() + client = app.server.test_client() + r = client.delete( + f"/{MCP_PATH}", + headers={"mcp-session-id": "nonexistent"}, + ) + assert r.status_code == 404 + + def test_get_without_session_returns_404(self): + app = _make_app() + client = app.server.test_client() + r = client.get(f"/{MCP_PATH}") + assert r.status_code == 404 + + def test_get_with_stale_session_returns_404(self): + app = _make_app() + client = app.server.test_client() + r = client.get( + f"/{MCP_PATH}", + headers={"mcp-session-id": "nonexistent"}, + ) + assert r.status_code == 404 + + def test_get_returns_sse_stream(self): + app = _make_app() + client = app.server.test_client() + # First create a session via POST initialize + init = client.post( + f"/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} + ), + content_type="application/json", + ) + session_id = init.headers["mcp-session-id"] + # GET with valid session returns SSE stream + r = client.get( + f"/{MCP_PATH}", + headers={"mcp-session-id": session_id}, + ) + assert r.status_code == 200 + assert r.content_type == "text/event-stream" + assert r.headers.get("Cache-Control") == "no-cache" + + def test_post_rejects_wrong_content_type(self): + app = _make_app() + client = app.server.test_client() + r = client.post( + f"/{MCP_PATH}", + data="not json", + content_type="text/plain", + ) + assert r.status_code == 415 + + def test_routes_not_registered_when_disabled(self): + app = _make_app(enable_mcp=False) + client = app.server.test_client() + r = client.post( + f"/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} + ), + content_type="application/json", + ) + # With MCP disabled, the route doesn't exist — response is HTML, not JSON + assert r.content_type != "application/json" + + def test_routes_respect_pathname_prefix(self): + app = _make_app(routes_pathname_prefix="/app/") + client = app.server.test_client() + + ok = client.post( + f"/app/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} + ), + content_type="application/json", + ) + assert ok.status_code == 200 + + miss = client.post( + f"/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} + ), + content_type="application/json", + ) + assert miss.status_code == 404 + + def test_enable_mcp_env_var_false(self): + old = os.environ.get("DASH_MCP_ENABLED") + try: + os.environ["DASH_MCP_ENABLED"] = "false" + app = _make_app() + client = app.server.test_client() + r = client.post( + f"/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} + ), + content_type="application/json", + ) + assert r.content_type != "application/json" + finally: + if old is None: + os.environ.pop("DASH_MCP_ENABLED", None) + else: + os.environ["DASH_MCP_ENABLED"] = old + + def test_constructor_overrides_env_var(self): + old = os.environ.get("DASH_MCP_ENABLED") + try: + os.environ["DASH_MCP_ENABLED"] = "false" + app = _make_app(enable_mcp=True) + client = app.server.test_client() + r = client.post( + f"/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} + ), + content_type="application/json", + ) + assert r.status_code == 200 + assert b"protocolVersion" in r.data + finally: + if old is None: + os.environ.pop("DASH_MCP_ENABLED", None) + else: + os.environ["DASH_MCP_ENABLED"] = old diff --git a/tests/unit/mcp/test_server.py b/tests/unit/mcp/test_server.py new file mode 100644 index 0000000000..93238faf19 --- /dev/null +++ b/tests/unit/mcp/test_server.py @@ -0,0 +1,92 @@ +"""Tests for MCP server (_server.py) — JSON-RPC message processing.""" + +from dash._get_app import app_context +from dash.mcp._server import _process_mcp_message +from mcp.types import LATEST_PROTOCOL_VERSION + +from tests.unit.mcp.conftest import _make_app, _setup_mcp + + +def _msg(method, params=None, request_id=1): + d = {"jsonrpc": "2.0", "method": method, "id": request_id} + d["params"] = params if params is not None else {} + return d + + +def _mcp(app, method, params=None, request_id=1): + with app.server.test_request_context(): + _setup_mcp(app) + return _process_mcp_message(_msg(method, params, request_id)) + + +def _tools_list(app): + return _mcp(app, "tools/list")["result"]["tools"] + + +def _call_tool(app, tool_name, arguments=None, request_id=1): + return _mcp( + app, "tools/call", {"name": tool_name, "arguments": arguments or {}}, request_id + ) + + +def _call_tool_output( + app, tool_name, arguments=None, component_id=None, prop="children" +): + result = _call_tool(app, tool_name, arguments) + structured = result["result"]["structuredContent"] + response = structured["response"] + if component_id is None: + component_id = next(iter(response)) + return response[component_id][prop] + + +class TestProcessMCPMessage: + def test_initialize(self): + app = _make_app() + result = _mcp(app, "initialize") + + assert result is not None + assert result["id"] == 1 + assert result["jsonrpc"] == "2.0" + assert result["result"]["protocolVersion"] == LATEST_PROTOCOL_VERSION + assert "serverInfo" in result["result"] + + def test_initialize_advertises_list_changed(self): + app = _make_app() + result = _mcp(app, "initialize") + caps = result["result"]["capabilities"] + assert caps["tools"]["listChanged"] is True + + def test_tools_call(self): + app = _make_app() + tools = _tools_list(app) + tool_name = next(t["name"] for t in tools if "update_output" in t["name"]) + + result = _call_tool(app, tool_name, {"value": "hello"}, request_id=2) + + assert result is not None + assert result["id"] == 2 + assert _call_tool_output(app, tool_name, {"value": "hello"}) == "echo: hello" + + def test_tools_call_unknown_tool_returns_error(self): + app = _make_app() + result = _call_tool(app, "nonexistent_tool") + + assert result is not None + assert "error" in result + assert result["error"]["code"] == -32601 + + def test_unknown_method_returns_error(self): + app = _make_app() + result = _mcp(app, "unknown/method") + + assert result is not None + assert "error" in result + + def test_notification_returns_none(self): + app = _make_app() + data = {"jsonrpc": "2.0", "method": "notifications/initialized"} + with app.server.test_request_context(): + app_context.set(app) + result = _process_mcp_message(data) + assert result is None diff --git a/tests/unit/mcp/tools/test_run_callback.py b/tests/unit/mcp/tools/test_run_callback.py new file mode 100644 index 0000000000..00f4e5b7b1 --- /dev/null +++ b/tests/unit/mcp/tools/test_run_callback.py @@ -0,0 +1,246 @@ +"""Tests for callback dispatch execution via MCP tools.""" + +from dash import Dash, Input, Output, State, dcc, html +from dash.exceptions import PreventUpdate +from dash.mcp._server import _process_mcp_message + +from tests.unit.mcp.conftest import _setup_mcp + + +def _msg(method, params=None, request_id=1): + d = {"jsonrpc": "2.0", "method": method, "id": request_id} + d["params"] = params if params is not None else {} + return d + + +def _mcp(app, method, params=None, request_id=1): + with app.server.test_request_context(): + _setup_mcp(app) + return _process_mcp_message(_msg(method, params, request_id)) + + +def _tools_list(app): + return _mcp(app, "tools/list")["result"]["tools"] + + +def _call_tool_structured(app, tool_name, arguments=None): + result = _mcp(app, "tools/call", {"name": tool_name, "arguments": arguments or {}}) + return result["result"]["structuredContent"] + + +def _call_tool_output( + app, tool_name, arguments=None, component_id=None, prop="children" +): + structured = _call_tool_structured(app, tool_name, arguments) + response = structured["response"] + if component_id is None: + component_id = next(iter(response)) + return response[component_id][prop] + + +class TestRunCallback: + def test_multi_output(self): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="dd", options=["a", "b"], value="a"), + dcc.Dropdown(id="dd2"), + html.Div(id="out"), + ] + ) + + @app.callback( + Output("dd2", "options"), + Output("out", "children"), + Input("dd", "value"), + ) + def update(val): + return [{"label": val, "value": val}], f"selected: {val}" + + tools = _tools_list(app) + tool_name = next(t["name"] for t in tools if "update" in t["name"]) + structured = _call_tool_structured(app, tool_name, {"val": "b"}) + assert structured["response"]["dd2"]["options"] == [ + {"label": "b", "value": "b"} + ] + assert structured["response"]["out"]["children"] == "selected: b" + + def test_omitted_kwargs_default_to_none(self): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="dd", options=["a"]), + dcc.Input(id="inp"), + html.Div(id="out"), + ] + ) + + @app.callback( + Output("out", "children"), + Input("dd", "value"), + State("inp", "value"), + ) + def update(selected, text): + return f"{selected}-{text}" + + tools = _tools_list(app) + tool_name = next(t["name"] for t in tools if "update" in t["name"]) + assert _call_tool_output(app, tool_name, {"selected": "a"}, "out") == "a-None" + + def test_no_output_callback(self): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Button(id="btn"), + html.Div(id="display"), + ] + ) + + @app.callback(Input("btn", "n_clicks")) + def server_cb(n): + from dash import set_props + + set_props("display", {"children": f"Clicked {n} times"}) + + tools = _tools_list(app) + tool_names = [t["name"] for t in tools] + assert "server_cb" in tool_names + + def test_prevent_update(self): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="inp", value="hello"), + html.Div(id="out"), + ] + ) + + @app.callback(Output("out", "children"), Input("inp", "value")) + def update(val): + if val == "block": + raise PreventUpdate + return f"got: {val}" + + tools = _tools_list(app) + tool_name = next(t["name"] for t in tools if "update" in t["name"]) + assert _call_tool_output(app, tool_name, {"val": "test"}, "out") == "got: test" + + def test_with_state(self): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id="trigger"), + html.Div(id="store"), + html.Div(id="result"), + ] + ) + + @app.callback( + Output("result", "children"), + Input("trigger", "children"), + State("store", "children"), + ) + def with_state(trigger, store): + return f"{trigger}-{store}" + + tools = _tools_list(app) + tool_name = next(t["name"] for t in tools if "with_state" in t["name"]) + assert ( + _call_tool_output( + app, + tool_name, + { + "trigger": "click", + "store": "data", + }, + "result", + ) + == "click-data" + ) + + def test_dict_inputs(self): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="x-input", value="hello"), + dcc.Input(id="y-input", value="world"), + html.Div(id="dict-out"), + ] + ) + + @app.callback( + Output("dict-out", "children"), + inputs={ + "x_val": Input("x-input", "value"), + "y_val": Input("y-input", "value"), + }, + ) + def combine(**kwargs): + return f"{kwargs['x_val']}-{kwargs['y_val']}" + + tools = _tools_list(app) + tool_name = next(t["name"] for t in tools if "combine" in t["name"]) + assert ( + _call_tool_output( + app, + tool_name, + { + "x_val": "foo", + "y_val": "bar", + }, + "dict-out", + ) + == "foo-bar" + ) + + def test_positional_inputs(self): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="a-input", value="A"), + html.Div(id="pos-out"), + ] + ) + + @app.callback(Output("pos-out", "children"), Input("a-input", "value")) + def echo(val): + return f"got:{val}" + + tools = _tools_list(app) + tool_name = next(t["name"] for t in tools if "echo" in t["name"]) + assert ( + _call_tool_output(app, tool_name, {"val": "test"}, "pos-out") == "got:test" + ) + + def test_dict_inputs_with_state(self): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="inp", value="hi"), + html.Div(id="st", children="state-val"), + html.Div(id="ds-out"), + ] + ) + + @app.callback( + Output("ds-out", "children"), + inputs={"trigger": Input("inp", "value")}, + state={"kept": State("st", "children")}, + ) + def with_dict_state(**kwargs): + return f"{kwargs['trigger']}+{kwargs['kept']}" + + tools = _tools_list(app) + tool_name = next(t["name"] for t in tools if "with_dict_state" in t["name"]) + assert ( + _call_tool_output( + app, + tool_name, + { + "trigger": "hey", + "kept": "saved", + }, + "ds-out", + ) + == "hey+saved" + ) From 001a7b7f815b9aa3cedbe4ec311791453fc878b8 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 9 Apr 2026 09:40:45 -0600 Subject: [PATCH 052/103] Enforce session management per MCP spec (404 for unknown sessions, 400 for missing session) --- dash/mcp/_server.py | 17 ++++++----- tests/integration/mcp/test_server.py | 43 ++++++---------------------- 2 files changed, 18 insertions(+), 42 deletions(-) diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py index 1c6279290b..95d00578a2 100644 --- a/dash/mcp/_server.py +++ b/dash/mcp/_server.py @@ -116,23 +116,26 @@ def _handle_post() -> Response: request_id = data.get("id") session_id = request.headers.get("mcp-session-id") - stale_session = False if method == "initialize": session_id = _create_session() elif session_id and session_id not in sessions: - stale_session = True - sessions[session_id] = {} + return Response( + json.dumps({"error": "Session not found. Please reinitialize."}), + content_type="application/json", + status=404, + ) elif not session_id: - session_id = _create_session() + return Response( + json.dumps({"error": "Missing session ID. Send an initialize request first."}), + content_type="application/json", + status=400, + ) response_data = _process_mcp_message(data) if response_data is None: return Response("", status=202) - if stale_session: - _inject_warning(response_data, _STALE_SESSION_WARNING) - return Response( json.dumps(response_data), content_type="application/json", diff --git a/tests/integration/mcp/test_server.py b/tests/integration/mcp/test_server.py index 7af88bfbff..8917d0f5ab 100644 --- a/tests/integration/mcp/test_server.py +++ b/tests/integration/mcp/test_server.py @@ -60,7 +60,7 @@ def test_post_initialize_creates_session(self): data = json.loads(r.data) assert data["result"]["protocolVersion"] == LATEST_PROTOCOL_VERSION - def test_post_without_session_auto_assigns(self): + def test_post_without_session_returns_400(self): app = _make_app() client = app.server.test_client() r = client.post( @@ -70,12 +70,9 @@ def test_post_without_session_auto_assigns(self): ), content_type="application/json", ) - assert r.status_code == 200 - assert "mcp-session-id" in r.headers - data = json.loads(r.data) - assert "tools" in data["result"] + assert r.status_code == 400 - def test_stale_session_error_includes_hint(self): + def test_stale_session_returns_404(self): app = _make_app() client = app.server.test_client() r = client.post( @@ -83,18 +80,15 @@ def test_stale_session_error_includes_hint(self): data=json.dumps( { "jsonrpc": "2.0", - "method": "tools/call", + "method": "tools/list", "id": 1, - "params": {"name": "no_such_tool", "arguments": {}}, + "params": {}, } ), content_type="application/json", headers={"mcp-session-id": "old-session-from-before-restart"}, ) - assert r.status_code == 200 - data = json.loads(r.data) - assert "session was not recognised" in data["error"]["message"] - assert "tools/list" in data["error"]["message"] + assert r.status_code == 404 def test_post_with_valid_session(self): app = _make_app() @@ -161,7 +155,7 @@ def test_delete_terminates_session(self): headers={"mcp-session-id": session_id}, ) assert r2.status_code == 204 - # Post-delete requests still succeed + # Post-delete requests return 404 r3 = client.post( f"/{MCP_PATH}", data=json.dumps( @@ -170,7 +164,7 @@ def test_delete_terminates_session(self): content_type="application/json", headers={"mcp-session-id": session_id}, ) - assert r3.status_code == 200 + assert r3.status_code == 404 def test_delete_nonexistent_session_returns_404(self): app = _make_app() @@ -196,27 +190,6 @@ def test_get_with_stale_session_returns_404(self): ) assert r.status_code == 404 - def test_get_returns_sse_stream(self): - app = _make_app() - client = app.server.test_client() - # First create a session via POST initialize - init = client.post( - f"/{MCP_PATH}", - data=json.dumps( - {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} - ), - content_type="application/json", - ) - session_id = init.headers["mcp-session-id"] - # GET with valid session returns SSE stream - r = client.get( - f"/{MCP_PATH}", - headers={"mcp-session-id": session_id}, - ) - assert r.status_code == 200 - assert r.content_type == "text/event-stream" - assert r.headers.get("Cache-Control") == "no-cache" - def test_post_rejects_wrong_content_type(self): app = _make_app() client = app.server.test_client() From 3fe035bfdc5883d71f424fed112cf867b37a6b27 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 15 Apr 2026 16:55:23 -0600 Subject: [PATCH 053/103] remove unused code --- dash/mcp/_server.py | 33 +++------------------------------ 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py index 95d00578a2..1060d3b27f 100644 --- a/dash/mcp/_server.py +++ b/dash/mcp/_server.py @@ -126,7 +126,9 @@ def _handle_post() -> Response: ) elif not session_id: return Response( - json.dumps({"error": "Missing session ID. Send an initialize request first."}), + json.dumps( + {"error": "Missing session ID. Send an initialize request first."} + ), content_type="application/json", status=400, ) @@ -175,35 +177,6 @@ def _handle_delete() -> Response: ) -_STALE_SESSION_WARNING = ( - "[Warning: your session was not recognised" - " — the app may have restarted." - " Please call tools/list to refresh your tool list." - " Please ask the user to reconnect to the MCP server.]" -) - - -def _inject_warning(response_data: dict[str, Any], warning: str) -> None: - """Append a warning to a JSON-RPC response dict. - - For successful ``tools/call`` responses the warning is added as an - extra text content block so the agent sees it alongside the result. - For error responses the warning is appended to the error message. - Other responses (tools/list, resources/*) are left unchanged — the - JSON-RPC spec forbids extra top-level keys. - """ - # tools/call success: result has a "content" list - result = response_data.get("result") - if isinstance(result, dict) and isinstance(result.get("content"), list): - result["content"].append({"type": "text", "text": warning}) - return - - # Error response - error = response_data.get("error") - if isinstance(error, dict) and "message" in error: - error["message"] += " " + warning - - def _handle_initialize() -> InitializeResult: return InitializeResult( protocolVersion=LATEST_PROTOCOL_VERSION, From 3b4494496d10b2de874ad5cdd7ed41b290fa12af Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 16 Apr 2026 18:31:33 -0600 Subject: [PATCH 054/103] Fix types for mypy --- dash/mcp/__init__.py | 2 +- dash/mcp/_server.py | 3 +- dash/mcp/primitives/__init__.py | 10 ++-- .../resource_clientside_callbacks.py | 5 +- .../resources/resource_components.py | 7 +-- .../primitives/resources/resource_layout.py | 5 +- .../resources/resource_page_layout.py | 3 +- .../primitives/resources/resource_pages.py | 5 +- dash/mcp/primitives/tools/callback_adapter.py | 47 +++++++++++-------- .../description_pattern_matching.py | 2 +- .../input_schemas/schema_pattern_matching.py | 5 +- dash/mcp/primitives/tools/results/__init__.py | 2 +- .../tools/tool_get_dash_component.py | 2 +- dash/types.py | 9 ++-- 14 files changed, 63 insertions(+), 44 deletions(-) diff --git a/dash/mcp/__init__.py b/dash/mcp/__init__.py index 2677ea141b..2bc4757f13 100644 --- a/dash/mcp/__init__.py +++ b/dash/mcp/__init__.py @@ -3,5 +3,5 @@ from dash.mcp._server import enable_mcp_server __all__ = [ - enable_mcp_server, + "enable_mcp_server", ] diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py index 1060d3b27f..24bbef4aeb 100644 --- a/dash/mcp/_server.py +++ b/dash/mcp/_server.py @@ -204,7 +204,8 @@ def _process_mcp_message(data: dict[str, Any]) -> dict[str, Any] | None: """ method = data.get("method", "") params = data.get("params", {}) or {} - request_id = data.get("id") + _id = data.get("id") + request_id: str | int = _id if isinstance(_id, (str, int)) else "" app = get_app() if not hasattr(app, "mcp_callback_map"): diff --git a/dash/mcp/primitives/__init__.py b/dash/mcp/primitives/__init__.py index b14839f1e1..e6b46a9af3 100644 --- a/dash/mcp/primitives/__init__.py +++ b/dash/mcp/primitives/__init__.py @@ -9,9 +9,9 @@ ) __all__ = [ - call_tool, - list_resources, - list_resource_templates, - list_tools, - read_resource, + "call_tool", + "list_resources", + "list_resource_templates", + "list_tools", + "read_resource", ] diff --git a/dash/mcp/primitives/resources/resource_clientside_callbacks.py b/dash/mcp/primitives/resources/resource_clientside_callbacks.py index 127c0f9adc..a8c0a0076a 100644 --- a/dash/mcp/primitives/resources/resource_clientside_callbacks.py +++ b/dash/mcp/primitives/resources/resource_clientside_callbacks.py @@ -10,6 +10,7 @@ Resource, TextResourceContents, ) +from pydantic import AnyUrl from dash import get_app from dash._utils import clean_property_name, split_callback_id @@ -25,7 +26,7 @@ def get_resource(cls) -> Resource | None: if not _get_clientside_callbacks(): return None return Resource( - uri=cls.uri, + uri=AnyUrl(cls.uri), name="dash_clientside_callbacks", description=( "Actions the user can take manually in the browser " @@ -52,7 +53,7 @@ def read_resource(cls, uri: str = "") -> ReadResourceResult: return ReadResourceResult( contents=[ TextResourceContents( - uri=cls.uri, + uri=AnyUrl(cls.uri), mimeType="application/json", text=json.dumps(data, default=str), ) diff --git a/dash/mcp/primitives/resources/resource_components.py b/dash/mcp/primitives/resources/resource_components.py index 9d035a855f..1f80c8bda2 100644 --- a/dash/mcp/primitives/resources/resource_components.py +++ b/dash/mcp/primitives/resources/resource_components.py @@ -9,6 +9,7 @@ Resource, TextResourceContents, ) +from pydantic import AnyUrl from dash import get_app from dash._layout_utils import traverse @@ -22,7 +23,7 @@ class ComponentsResource(MCPResourceProvider): @classmethod def get_resource(cls) -> Resource | None: return Resource( - uri=cls.uri, + uri=AnyUrl(cls.uri), name="dash_components", description=( "All components with IDs in the app layout. " @@ -41,7 +42,7 @@ def read_resource(cls, uri: str = "") -> ReadResourceResult: components = sorted( [ { - "id": str(comp.id), + "id": str(getattr(comp, "id", None)), "type": getattr(comp, "_type", type(comp).__name__), } for comp, _ in traverse(layout) @@ -53,7 +54,7 @@ def read_resource(cls, uri: str = "") -> ReadResourceResult: return ReadResourceResult( contents=[ TextResourceContents( - uri=cls.uri, + uri=AnyUrl(cls.uri), mimeType="application/json", text=json.dumps(components), ) diff --git a/dash/mcp/primitives/resources/resource_layout.py b/dash/mcp/primitives/resources/resource_layout.py index 753e2b9229..7659d1fd8f 100644 --- a/dash/mcp/primitives/resources/resource_layout.py +++ b/dash/mcp/primitives/resources/resource_layout.py @@ -7,6 +7,7 @@ Resource, TextResourceContents, ) +from pydantic import AnyUrl from dash import get_app from dash._utils import to_json @@ -20,7 +21,7 @@ class LayoutResource(MCPResourceProvider): @classmethod def get_resource(cls) -> Resource | None: return Resource( - uri=cls.uri, + uri=AnyUrl(cls.uri), name="dash_app_layout", description=( "Full component tree of the Dash app. " @@ -35,7 +36,7 @@ def read_resource(cls, uri: str = "") -> ReadResourceResult: return ReadResourceResult( contents=[ TextResourceContents( - uri=cls.uri, + uri=AnyUrl(cls.uri), mimeType="application/json", text=to_json(app.get_layout()), ) diff --git a/dash/mcp/primitives/resources/resource_page_layout.py b/dash/mcp/primitives/resources/resource_page_layout.py index 613f0b41b9..bbfca411bc 100644 --- a/dash/mcp/primitives/resources/resource_page_layout.py +++ b/dash/mcp/primitives/resources/resource_page_layout.py @@ -7,6 +7,7 @@ ResourceTemplate, TextResourceContents, ) +from pydantic import AnyUrl from dash import html from dash._pages import PAGE_REGISTRY @@ -55,7 +56,7 @@ def read_resource(cls, uri: str) -> ReadResourceResult: return ReadResourceResult( contents=[ TextResourceContents( - uri=uri, + uri=AnyUrl(uri), mimeType="application/json", text=to_json(page_layout), ) diff --git a/dash/mcp/primitives/resources/resource_pages.py b/dash/mcp/primitives/resources/resource_pages.py index 27c39013f3..21fa27679f 100644 --- a/dash/mcp/primitives/resources/resource_pages.py +++ b/dash/mcp/primitives/resources/resource_pages.py @@ -9,6 +9,7 @@ Resource, TextResourceContents, ) +from pydantic import AnyUrl from dash._pages import PAGE_REGISTRY @@ -23,7 +24,7 @@ def get_resource(cls) -> Resource | None: if not PAGE_REGISTRY: return None return Resource( - uri=cls.uri, + uri=AnyUrl(cls.uri), name="dash_app_pages", description=( "List of all pages in this multi-page Dash app " @@ -51,7 +52,7 @@ def read_resource(cls, uri: str = "") -> ReadResourceResult: return ReadResourceResult( contents=[ TextResourceContents( - uri=cls.uri, + uri=AnyUrl(cls.uri), mimeType="application/json", text=json.dumps(pages, default=str), ) diff --git a/dash/mcp/primitives/tools/callback_adapter.py b/dash/mcp/primitives/tools/callback_adapter.py index c94ba32f38..3000541a06 100644 --- a/dash/mcp/primitives/tools/callback_adapter.py +++ b/dash/mcp/primitives/tools/callback_adapter.py @@ -10,7 +10,7 @@ import json import typing from functools import cached_property -from typing import Any +from typing import Any, cast from mcp.types import Tool @@ -27,6 +27,7 @@ CallbackDependency, CallbackExecutionBody, CallbackInput, + CallbackInputs, CallbackOutput, CallbackOutputTarget, WildcardId, @@ -361,9 +362,7 @@ def _param_annotations(self) -> list[Any | None]: return [hints.get(func_name) for func_name, _ in self._dep_param_map] -def _expand_dep( - dep: CallbackDependency, value: Any -) -> CallbackInput | list[CallbackInput]: +def _expand_dep(dep: CallbackDependency, value: Any) -> CallbackInputs: """Attach a concrete value to a callback dependency to produce a valid callback input. For regular deps, returns ``{id, property, value}``. @@ -372,20 +371,20 @@ def _expand_dep( """ pattern = parse_wildcard_id(dep.get("id", "")) if pattern is None: - return {**dep, "value": value} + return CallbackInput(id=dep["id"], property=dep["property"], value=value) # LLM provides browser-like format if isinstance(value, list): - return value + return cast(list[CallbackInput], value) if isinstance(value, dict) and "id" in value: - return value - return {**dep, "value": value} + return cast(CallbackInput, value) + return CallbackInput(id=dep["id"], property=dep["property"], value=value) def _expand_output_spec( output_id: str, cb_info: dict, - resolved_inputs: list[CallbackInput], + resolved_inputs: list[CallbackInputs], ) -> CallbackOutputTarget | list[CallbackOutputTarget]: """Build the outputs spec, expanding wildcards to concrete IDs. @@ -408,15 +407,19 @@ def _expand_output_spec( if pattern is not None: concrete_ids = _derive_output_ids(pattern, resolved_inputs) if not concrete_ids: - concrete_ids = [comp.id for comp in find_matching_components(pattern)] - expanded = [{"id": cid, "property": prop} for cid in concrete_ids] + concrete_ids = [ + getattr(comp, "id") for comp in find_matching_components(pattern) + ] + expanded: list[CallbackDependency] = [ + CallbackDependency(id=cid, property=prop) for cid in concrete_ids + ] # ALL/ALLSMALLER → nested list; MATCH → single dict if len(expanded) == 1: results.append(expanded[0]) else: results.append(expanded) else: - results.append({"id": pid, "property": prop}) + results.append(CallbackDependency(id=pid, property=prop)) # Mirror the Dash renderer: single-output callbacks send a bare dict, # multi-output callbacks send a list. The framework's output value @@ -428,7 +431,7 @@ def _expand_output_spec( def _derive_output_ids( output_pattern: WildcardId, - resolved_inputs: list[CallbackInput], + resolved_inputs: list[CallbackInputs], ) -> list[WildcardId] | None: """Derive concrete output IDs from the resolved input entries. @@ -457,15 +460,19 @@ def _substitute(item_id: WildcardId) -> WildcardId | None: if isinstance(entry, list) and entry: concrete_ids = [] for item in entry: - out = _substitute(item.get("id")) - if out: - concrete_ids.append(out) + item_id = item.get("id") + if isinstance(item_id, dict): + out = _substitute(item_id) + if out: + concrete_ids.append(out) if concrete_ids: return concrete_ids # MATCH: single {id, property, value} dict - elif isinstance(entry, dict) and isinstance(entry.get("id"), dict): - out = _substitute(entry["id"]) - if out: - return [out] + elif isinstance(entry, dict): + entry_id = entry.get("id") + if isinstance(entry_id, dict): + out = _substitute(entry_id) + if out: + return [out] return None diff --git a/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_pattern_matching.py b/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_pattern_matching.py index 221423aa50..d9a1a5a26a 100644 --- a/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_pattern_matching.py +++ b/dash/mcp/primitives/tools/input_schemas/input_descriptions/description_pattern_matching.py @@ -23,7 +23,7 @@ def describe(cls, param: MCPInput) -> list[str]: return [] wildcard_key, wildcard_type = _find_wildcard(dep_id) - if wildcard_key is None: + if wildcard_key is None or wildcard_type is None: return [] non_wildcard = {k: v for k, v in dep_id.items() if k != wildcard_key} diff --git a/dash/mcp/primitives/tools/input_schemas/schema_pattern_matching.py b/dash/mcp/primitives/tools/input_schemas/schema_pattern_matching.py index 52e16cf58b..093dc197b8 100644 --- a/dash/mcp/primitives/tools/input_schemas/schema_pattern_matching.py +++ b/dash/mcp/primitives/tools/input_schemas/schema_pattern_matching.py @@ -66,7 +66,10 @@ def _get_wildcard_type(dep_id: dict) -> str | None: def _infer_value_schema(param: MCPInput) -> dict[str, Any] | None: """Infer the JSON Schema for the ``value`` field from a matching component.""" - matches = find_matching_components(parse_wildcard_id(param["component_id"])) + pattern = parse_wildcard_id(param["component_id"]) + if pattern is None: + return None + matches = find_matching_components(pattern) if not matches: return None diff --git a/dash/mcp/primitives/tools/results/__init__.py b/dash/mcp/primitives/tools/results/__init__.py index ae3517919c..09e86410a7 100644 --- a/dash/mcp/primitives/tools/results/__init__.py +++ b/dash/mcp/primitives/tools/results/__init__.py @@ -48,5 +48,5 @@ def format_callback_response( return CallToolResult( content=content, - structuredContent=response, + structuredContent=dict(response), ) diff --git a/dash/mcp/primitives/tools/tool_get_dash_component.py b/dash/mcp/primitives/tools/tool_get_dash_component.py index 5dffc2cf58..8c131c4288 100644 --- a/dash/mcp/primitives/tools/tool_get_dash_component.py +++ b/dash/mcp/primitives/tools/tool_get_dash_component.py @@ -125,5 +125,5 @@ def call_tool(cls, tool_name: str, arguments: dict[str, Any]) -> CallToolResult: content=[ TextContent(type="text", text=json.dumps(structured, default=str)) ], - structuredContent=structured, + structuredContent=dict(structured), ) diff --git a/dash/types.py b/dash/types.py index cbc94b8151..9da246b16c 100644 --- a/dash/types.py +++ b/dash/types.py @@ -71,11 +71,14 @@ class CallbackInput(TypedDict): value: Any +CallbackInputs = Union[CallbackInput, List[CallbackInput]] + + class CallbackExecutionBody(TypedDict): output: str - outputs: List[CallbackOutputTarget] - inputs: List[CallbackInput] - state: List[CallbackInput] + outputs: Union[CallbackOutputTarget, List[CallbackOutputTarget]] + inputs: List[CallbackInputs] + state: List[CallbackInputs] changedPropIds: List[str] From 9dc1f104140c55e2e8eb3d63bce3e267c8665093 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Mon, 20 Apr 2026 15:30:16 -0600 Subject: [PATCH 055/103] Remove unused SSE code for initial MCP implementation --- dash/mcp/_server.py | 87 +++---------- dash/mcp/_sse.py | 67 ---------- dash/mcp/notifications/__init__.py | 7 -- .../notification_tools_changed.py | 30 ----- tests/integration/mcp/conftest.py | 22 +--- tests/integration/mcp/test_server.py | 116 ++---------------- tests/unit/mcp/test_server.py | 6 - 7 files changed, 30 insertions(+), 305 deletions(-) delete mode 100644 dash/mcp/_sse.py delete mode 100644 dash/mcp/notifications/__init__.py delete mode 100644 dash/mcp/notifications/notification_tools_changed.py diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py index 24bbef4aeb..c00ec6c398 100644 --- a/dash/mcp/_server.py +++ b/dash/mcp/_server.py @@ -2,10 +2,8 @@ from __future__ import annotations -import atexit import json import logging -import uuid from typing import TYPE_CHECKING, Any from flask import Response, request @@ -30,11 +28,6 @@ ) from dash.version import __version__ -from dash.mcp._sse import ( - close_sse_stream, - create_sse_stream, - shutdown_all_streams, -) from dash.mcp.primitives import ( call_tool, list_resource_templates, @@ -50,25 +43,7 @@ def enable_mcp_server(app: Dash, mcp_path: str) -> None: - """ - Add MCP routes to a Dash/Flask app. - - Registers a single Streamable HTTP endpoint for the MCP protocol. - Uses ``app._add_url()`` so that ``routes_pathname_prefix`` is applied - automatically. - - Args: - app: The Dash application instance. - mcp_path: Route prefix for MCP endpoints. - """ - # Session storage: session_id -> metadata - sessions: dict[str, dict[str, Any]] = {} - - def _create_session() -> str: - sid = str(uuid.uuid4()) - sessions[sid] = {} - return sid - + """Add MCP routes to a Dash/Flask app.""" # -- Streamable HTTP endpoint -------------------------------------------- def mcp_handler() -> Response: @@ -85,14 +60,13 @@ def mcp_handler() -> Response: ) def _handle_get() -> Response: - session_id = request.headers.get("mcp-session-id") - if not session_id or session_id not in sessions: - return Response( - json.dumps({"error": "Session not found"}), - content_type="application/json", - status=404, - ) - return create_sse_stream(sessions, session_id) + # MCP spec allows servers to opt out of GET-initiated SSE streams + # by returning 405. We don't push server-initiated events. + return Response( + json.dumps({"error": "Method not allowed"}), + content_type="application/json", + status=405, + ) def _handle_post() -> Response: content_type = request.content_type or "" @@ -112,27 +86,6 @@ def _handle_post() -> Response: status=400, ) - method = data.get("method", "") - request_id = data.get("id") - session_id = request.headers.get("mcp-session-id") - - if method == "initialize": - session_id = _create_session() - elif session_id and session_id not in sessions: - return Response( - json.dumps({"error": "Session not found. Please reinitialize."}), - content_type="application/json", - status=404, - ) - elif not session_id: - return Response( - json.dumps( - {"error": "Missing session ID. Send an initialize request first."} - ), - content_type="application/json", - status=400, - ) - response_data = _process_mcp_message(data) if response_data is None: @@ -142,21 +95,15 @@ def _handle_post() -> Response: json.dumps(response_data), content_type="application/json", status=200, - headers={"mcp-session-id": session_id}, ) def _handle_delete() -> Response: - session_id = request.headers.get("mcp-session-id") - if not session_id or session_id not in sessions: - return Response( - json.dumps({"error": "Session not found"}), - content_type="application/json", - status=404, - ) - close_sse_stream(sessions[session_id]) - del sessions[session_id] - logger.info("MCP session terminated: %s", session_id) - return Response("", status=204) + # No sessions to terminate — server is stateless. + return Response( + json.dumps({"error": "Method not allowed"}), + content_type="application/json", + status=405, + ) # -- Register routes ----------------------------------------------------- @@ -166,10 +113,6 @@ def _handle_delete() -> Response: mcp_path, with_app_context_factory(mcp_handler, app), ["GET", "POST", "DELETE"] ) - # Close all SSE streams on server shutdown so MCP clients see a - # clean stream end and can reconnect promptly. - atexit.register(shutdown_all_streams, sessions) - logger.info( "MCP routes registered at %s%s", app.config.routes_pathname_prefix, @@ -181,7 +124,7 @@ def _handle_initialize() -> InitializeResult: return InitializeResult( protocolVersion=LATEST_PROTOCOL_VERSION, capabilities=ServerCapabilities( - tools=ToolsCapability(listChanged=True), + tools=ToolsCapability(listChanged=False), resources=ResourcesCapability(), ), serverInfo=Implementation(name="Plotly Dash", version=__version__), diff --git a/dash/mcp/_sse.py b/dash/mcp/_sse.py deleted file mode 100644 index 4928dc68b2..0000000000 --- a/dash/mcp/_sse.py +++ /dev/null @@ -1,67 +0,0 @@ -"""SSE stream generation and queue management.""" - -from __future__ import annotations - -import queue -from typing import Any - -from flask import Response - - -def create_sse_stream(sessions: dict[str, dict[str, Any]], session_id: str) -> Response: - """Create a Server-Sent Events stream for the given session. - - Stores a :class:`queue.Queue` in ``sessions[session_id]["sse_queue"]`` - and returns a Flask streaming ``Response``. The generator yields - events pushed to the queue, with keepalive comments every 30 seconds. - """ - event_queue: queue.Queue[str | None] = queue.Queue() - # Replace any prior SSE queue for this session (client reconnect). - sessions[session_id]["sse_queue"] = event_queue - - def _generate(): - try: - while True: - try: - event = event_queue.get(timeout=30) - if event is None: - return # Sentinel: server closing stream - yield f"event: message\ndata: {event}\n\n" - except queue.Empty: - yield ": keepalive\n\n" - except GeneratorExit: - pass - finally: - # Clean up queue reference if it's still ours. - if sessions.get(session_id, {}).get("sse_queue") is event_queue: - sessions[session_id].pop("sse_queue", None) - - return Response( - _generate(), - content_type="text/event-stream", - headers={ - "Cache-Control": "no-cache", - "Connection": "keep-alive", - "mcp-session-id": session_id, - }, - ) - - -def close_sse_stream(session_data: dict[str, Any]) -> None: - """Send a sentinel to shut down the session's SSE stream cleanly.""" - sse_queue = session_data.get("sse_queue") - if sse_queue is not None: - try: - sse_queue.put_nowait(None) - except queue.Full: - pass - - -def shutdown_all_streams(sessions: dict[str, dict[str, Any]]) -> None: - """Close all active SSE streams. - - Called during server shutdown (via ``atexit``) so that connected - MCP clients see a clean stream end and can reconnect promptly. - """ - for session_data in list(sessions.values()): - close_sse_stream(session_data) diff --git a/dash/mcp/notifications/__init__.py b/dash/mcp/notifications/__init__.py deleted file mode 100644 index b1fe9e8665..0000000000 --- a/dash/mcp/notifications/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -"""Server-initiated MCP notifications.""" - -from .notification_tools_changed import broadcast_tools_changed - -__all__ = [ - "broadcast_tools_changed", -] diff --git a/dash/mcp/notifications/notification_tools_changed.py b/dash/mcp/notifications/notification_tools_changed.py deleted file mode 100644 index 1970667d1a..0000000000 --- a/dash/mcp/notifications/notification_tools_changed.py +++ /dev/null @@ -1,30 +0,0 @@ -"""Tool list change notifications.""" - -from __future__ import annotations - -import json -import queue -from typing import Any - - -def broadcast_tools_changed( - sessions: dict[str, dict[str, Any]], -) -> None: - """Push a tools/list_changed notification to all active SSE streams. - - Not called automatically yet — available for future hot-reload - or dynamic callback registration. - """ - notification = json.dumps( - { - "jsonrpc": "2.0", - "method": "notifications/tools/list_changed", - } - ) - for data in sessions.values(): - sse_queue = data.get("sse_queue") - if sse_queue is not None: - try: - sse_queue.put_nowait(notification) - except queue.Full: - pass diff --git a/tests/integration/mcp/conftest.py b/tests/integration/mcp/conftest.py index 0f212d1763..b833bc1dea 100644 --- a/tests/integration/mcp/conftest.py +++ b/tests/integration/mcp/conftest.py @@ -3,10 +3,7 @@ import requests -def _mcp_post(server_url, method, params=None, session_id=None, request_id=1): - headers = {"Content-Type": "application/json"} - if session_id: - headers["mcp-session-id"] = session_id +def _mcp_post(server_url, method, params=None, request_id=1): return requests.post( f"{server_url}/_mcp", json={ @@ -15,39 +12,28 @@ def _mcp_post(server_url, method, params=None, session_id=None, request_id=1): "id": request_id, "params": params or {}, }, - headers=headers, + headers={"Content-Type": "application/json"}, timeout=5, ) -def _mcp_session(server_url): - resp = _mcp_post(server_url, "initialize") - resp.raise_for_status() - return resp.headers["mcp-session-id"] - - def _mcp_tools(server_url): - sid = _mcp_session(server_url) - resp = _mcp_post(server_url, "tools/list", session_id=sid, request_id=2) + resp = _mcp_post(server_url, "tools/list") resp.raise_for_status() return resp.json()["result"]["tools"] def _mcp_call_tool(server_url, tool_name, arguments=None): - sid = _mcp_session(server_url) resp = _mcp_post( server_url, "tools/call", {"name": tool_name, "arguments": arguments or {}}, - session_id=sid, - request_id=2, ) resp.raise_for_status() return resp.json() def _mcp_method(server_url, method, params=None): - sid = _mcp_session(server_url) - resp = _mcp_post(server_url, method, params, session_id=sid, request_id=2) + resp = _mcp_post(server_url, method, params) resp.raise_for_status() return resp.json() diff --git a/tests/integration/mcp/test_server.py b/tests/integration/mcp/test_server.py index 8917d0f5ab..4f0d0fca00 100644 --- a/tests/integration/mcp/test_server.py +++ b/tests/integration/mcp/test_server.py @@ -45,7 +45,7 @@ def update_output(value): class TestMCPEndpoint: """Tests for the Streamable HTTP MCP endpoint at /_mcp.""" - def test_post_initialize_creates_session(self): + def test_post_initialize_returns_protocol_version(self): app = _make_app() client = app.server.test_client() r = client.post( @@ -56,11 +56,10 @@ def test_post_initialize_creates_session(self): content_type="application/json", ) assert r.status_code == 200 - assert "mcp-session-id" in r.headers data = json.loads(r.data) assert data["result"]["protocolVersion"] == LATEST_PROTOCOL_VERSION - def test_post_without_session_returns_400(self): + def test_post_tools_list(self): app = _make_app() client = app.server.test_client() r = client.post( @@ -70,125 +69,32 @@ def test_post_without_session_returns_400(self): ), content_type="application/json", ) - assert r.status_code == 400 - - def test_stale_session_returns_404(self): - app = _make_app() - client = app.server.test_client() - r = client.post( - f"/{MCP_PATH}", - data=json.dumps( - { - "jsonrpc": "2.0", - "method": "tools/list", - "id": 1, - "params": {}, - } - ), - content_type="application/json", - headers={"mcp-session-id": "old-session-from-before-restart"}, - ) - assert r.status_code == 404 - - def test_post_with_valid_session(self): - app = _make_app() - client = app.server.test_client() - # Initialize to get session - r1 = client.post( - f"/{MCP_PATH}", - data=json.dumps( - {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} - ), - content_type="application/json", - ) - session_id = r1.headers["mcp-session-id"] - # Use session for tools/list - r2 = client.post( - f"/{MCP_PATH}", - data=json.dumps( - {"jsonrpc": "2.0", "method": "tools/list", "id": 2, "params": {}} - ), - content_type="application/json", - headers={"mcp-session-id": session_id}, - ) - assert r2.status_code == 200 - data = json.loads(r2.data) + assert r.status_code == 200 + data = json.loads(r.data) assert "result" in data assert "tools" in data["result"] def test_notification_returns_202(self): app = _make_app() client = app.server.test_client() - # Initialize to get session - r1 = client.post( - f"/{MCP_PATH}", - data=json.dumps( - {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} - ), - content_type="application/json", - ) - session_id = r1.headers["mcp-session-id"] - # Send notification (no id field) - r2 = client.post( + r = client.post( f"/{MCP_PATH}", data=json.dumps({"jsonrpc": "2.0", "method": "notifications/initialized"}), content_type="application/json", - headers={"mcp-session-id": session_id}, ) - assert r2.status_code == 202 + assert r.status_code == 202 - def test_delete_terminates_session(self): + def test_delete_returns_405(self): app = _make_app() client = app.server.test_client() - # Initialize - r1 = client.post( - f"/{MCP_PATH}", - data=json.dumps( - {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} - ), - content_type="application/json", - ) - session_id = r1.headers["mcp-session-id"] - # Delete - r2 = client.delete( - f"/{MCP_PATH}", - headers={"mcp-session-id": session_id}, - ) - assert r2.status_code == 204 - # Post-delete requests return 404 - r3 = client.post( - f"/{MCP_PATH}", - data=json.dumps( - {"jsonrpc": "2.0", "method": "tools/list", "id": 2, "params": {}} - ), - content_type="application/json", - headers={"mcp-session-id": session_id}, - ) - assert r3.status_code == 404 + r = client.delete(f"/{MCP_PATH}") + assert r.status_code == 405 - def test_delete_nonexistent_session_returns_404(self): - app = _make_app() - client = app.server.test_client() - r = client.delete( - f"/{MCP_PATH}", - headers={"mcp-session-id": "nonexistent"}, - ) - assert r.status_code == 404 - - def test_get_without_session_returns_404(self): + def test_get_returns_405(self): app = _make_app() client = app.server.test_client() r = client.get(f"/{MCP_PATH}") - assert r.status_code == 404 - - def test_get_with_stale_session_returns_404(self): - app = _make_app() - client = app.server.test_client() - r = client.get( - f"/{MCP_PATH}", - headers={"mcp-session-id": "nonexistent"}, - ) - assert r.status_code == 404 + assert r.status_code == 405 def test_post_rejects_wrong_content_type(self): app = _make_app() diff --git a/tests/unit/mcp/test_server.py b/tests/unit/mcp/test_server.py index 93238faf19..23c99c50ad 100644 --- a/tests/unit/mcp/test_server.py +++ b/tests/unit/mcp/test_server.py @@ -51,12 +51,6 @@ def test_initialize(self): assert result["result"]["protocolVersion"] == LATEST_PROTOCOL_VERSION assert "serverInfo" in result["result"] - def test_initialize_advertises_list_changed(self): - app = _make_app() - result = _mcp(app, "initialize") - caps = result["result"]["capabilities"] - assert caps["tools"]["listChanged"] is True - def test_tools_call(self): app = _make_app() tools = _tools_list(app) From f6403287b1c9e965087f699078e8f938aa91c5d5 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Tue, 21 Apr 2026 11:41:01 -0600 Subject: [PATCH 056/103] add app-level config for exposing callback docstrings in MCP tools --- dash/_configs.py | 1 + dash/dash.py | 4 +++ tests/unit/mcp/tools/test_mcp_tools.py | 45 ++++++++++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/dash/_configs.py b/dash/_configs.py index 0e1ab75505..25a401523b 100644 --- a/dash/_configs.py +++ b/dash/_configs.py @@ -35,6 +35,7 @@ def load_dash_env_vars(): "DASH_COMPRESS", "DASH_MCP_ENABLED", "DASH_MCP_PATH", + "DASH_MCP_EXPOSE_DOCSTRINGS", "HOST", "PORT", ) diff --git a/dash/dash.py b/dash/dash.py index c6fa5a6bf3..3912c638cf 100644 --- a/dash/dash.py +++ b/dash/dash.py @@ -488,6 +488,7 @@ def __init__( # pylint: disable=too-many-statements, too-many-branches websocket_inactivity_timeout: Optional[int] = 300000, enable_mcp: Optional[bool] = None, mcp_path: Optional[str] = None, + mcp_expose_docstrings: Optional[bool] = None, **obsolete, ): @@ -569,6 +570,9 @@ def __init__( # pylint: disable=too-many-statements, too-many-branches hide_all_callbacks=False, csrf_token_name=csrf_token_name, csrf_header_name=csrf_header_name, + mcp_expose_docstrings=get_combined_config( + "mcp_expose_docstrings", mcp_expose_docstrings, False + ), ) self.config.set_read_only( [ diff --git a/tests/unit/mcp/tools/test_mcp_tools.py b/tests/unit/mcp/tools/test_mcp_tools.py index cacaf13b14..3255809982 100644 --- a/tests/unit/mcp/tools/test_mcp_tools.py +++ b/tests/unit/mcp/tools/test_mcp_tools.py @@ -309,6 +309,51 @@ def test_mcpt014_typed_annotation_narrows_schema(typed_app): assert tool.inputSchema["properties"]["val"]["type"] == "string" +def test_mcpt016_app_level_opt_in_exposes_docstrings(): + """Dash(mcp_expose_docstrings=True) exposes docstrings for all callbacks.""" + app = Dash(__name__, mcp_expose_docstrings=True) + app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("inp", "value")) + def update(val): + """intentionally-exposed callback docstring text for the LLM""" + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + + with app.server.test_request_context(): + tool = app.mcp_callback_map[0].as_mcp_tool + assert ( + "intentionally-exposed callback docstring text for the LLM" in tool.description + ) + + +def test_mcpt017_per_callback_false_overrides_app_level_opt_in(): + """Per-callback mcp_expose_docstring=False wins over app-level opt-in.""" + app = Dash(__name__, mcp_expose_docstrings=True) + app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) + + @app.callback( + Output("out", "children"), + Input("inp", "value"), + mcp_expose_docstring=False, + ) + def update(val): + """sensitive callback docstring text that must not leak to LLMs""" + return val + + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + + with app.server.test_request_context(): + tool = app.mcp_callback_map[0].as_mcp_tool + assert ( + "sensitive callback docstring text that must not leak to LLMs" + not in tool.description + ) + + # --------------------------------------------------------------------------- # Tests — end-to-end Tool shape # --------------------------------------------------------------------------- From d108faf070aed5abf06e76c15219711fb696dc9a Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Tue, 21 Apr 2026 11:48:43 -0600 Subject: [PATCH 057/103] Disable MCP server by default --- dash/dash.py | 2 +- tests/integration/mcp/conftest.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/dash/dash.py b/dash/dash.py index 3912c638cf..c34dca722b 100644 --- a/dash/dash.py +++ b/dash/dash.py @@ -604,7 +604,7 @@ def __init__( # pylint: disable=too-many-statements, too-many-branches self.title = title # MCP (Model Context Protocol) configuration - self._enable_mcp = get_combined_config("mcp_enabled", enable_mcp, True) + self._enable_mcp = get_combined_config("mcp_enabled", enable_mcp, False) _mcp_path = get_combined_config("mcp_path", mcp_path, "_mcp") self._mcp_path = ( _mcp_path.lstrip("/") if isinstance(_mcp_path, str) else _mcp_path diff --git a/tests/integration/mcp/conftest.py b/tests/integration/mcp/conftest.py index b833bc1dea..c81ffceb48 100644 --- a/tests/integration/mcp/conftest.py +++ b/tests/integration/mcp/conftest.py @@ -1,8 +1,15 @@ """Shared helpers for MCP integration tests.""" +import pytest import requests +@pytest.fixture(autouse=True) +def _enable_mcp_for_integration_tests(monkeypatch): + """MCP is off by default; integration tests need it on.""" + monkeypatch.setenv("DASH_MCP_ENABLED", "true") + + def _mcp_post(server_url, method, params=None, request_id=1): return requests.post( f"{server_url}/_mcp", From eb94e143654f56c0632cdd98d2b5debd35b63194 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 22 Apr 2026 16:04:45 -0600 Subject: [PATCH 058/103] lint --- dash/_layout_utils.py | 2 +- dash/mcp/_server.py | 36 +++++++++---------- dash/mcp/primitives/tools/callback_adapter.py | 2 +- tests/integration/mcp/conftest.py | 6 ++++ 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/dash/_layout_utils.py b/dash/_layout_utils.py index fdca86edca..d421771afd 100644 --- a/dash/_layout_utils.py +++ b/dash/_layout_utils.py @@ -117,7 +117,7 @@ def _collect_components(value: Any) -> list[Component]: if isinstance(value, Component): return [value] if isinstance(value, (list, tuple)): - return [item for item in value if isinstance(item, (Component, list, tuple))] + return [item for item in value if isinstance(item, Component)] return [] diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py index c00ec6c398..07b35cd373 100644 --- a/dash/mcp/_server.py +++ b/dash/mcp/_server.py @@ -1,5 +1,9 @@ """Flask route setup, Streamable HTTP transport, and MCP message handling.""" +# pylint: disable=cyclic-import +# The MCP server imports dash primitives to dispatch callbacks, and dash +# lazy-imports this module to wire the MCP endpoint. Cycle is managed here. + from __future__ import annotations import json @@ -7,14 +11,6 @@ from typing import TYPE_CHECKING, Any from flask import Response, request - -from dash.mcp.types import MCPError - -if TYPE_CHECKING: - from dash import Dash - -from dash import get_app - from mcp.types import ( LATEST_PROTOCOL_VERSION, ErrorData, @@ -27,7 +23,8 @@ ToolsCapability, ) -from dash.version import __version__ +from dash import get_app +from dash._get_app import with_app_context_factory from dash.mcp.primitives import ( call_tool, list_resource_templates, @@ -38,6 +35,11 @@ from dash.mcp.primitives.tools.callback_adapter_collection import ( CallbackAdapterCollection, ) +from dash.mcp.types import MCPError +from dash.version import __version__ + +if TYPE_CHECKING: + from dash import Dash logger = logging.getLogger(__name__) @@ -77,9 +79,8 @@ def _handle_post() -> Response: status=415, ) - try: - data = request.get_json() - except Exception: + data = request.get_json(silent=True) + if data is None: return Response( json.dumps({"error": "Invalid JSON"}), content_type="application/json", @@ -107,8 +108,7 @@ def _handle_delete() -> Response: # -- Register routes ----------------------------------------------------- - from dash._get_app import with_app_context_factory - + # pylint: disable-next=protected-access app._add_url( mcp_path, with_app_context_factory(mcp_handler, app), ["GET", "POST", "DELETE"] ) @@ -156,12 +156,12 @@ def _process_mcp_message(data: dict[str, Any]) -> dict[str, Any] | None: mcp_methods = { "initialize": _handle_initialize, - "tools/list": lambda: list_tools(), + "tools/list": list_tools, "tools/call": lambda: call_tool( params.get("name", ""), params.get("arguments", {}) ), - "resources/list": lambda: list_resources(), - "resources/templates/list": lambda: list_resource_templates(), + "resources/list": list_resources, + "resources/templates/list": list_resource_templates, "resources/read": lambda: read_resource(params.get("uri", "")), } @@ -188,7 +188,7 @@ def _process_mcp_message(data: dict[str, Any]) -> dict[str, Any] | None: id=request_id, error=ErrorData(code=e.code, message=str(e)), ).model_dump(exclude_none=True) - except Exception as e: + except Exception as e: # pylint: disable=broad-exception-caught logger.error("MCP error: %s", e, exc_info=True) return JSONRPCError( jsonrpc="2.0", diff --git a/dash/mcp/primitives/tools/callback_adapter.py b/dash/mcp/primitives/tools/callback_adapter.py index 3000541a06..8130c6a8a1 100644 --- a/dash/mcp/primitives/tools/callback_adapter.py +++ b/dash/mcp/primitives/tools/callback_adapter.py @@ -375,7 +375,7 @@ def _expand_dep(dep: CallbackDependency, value: Any) -> CallbackInputs: # LLM provides browser-like format if isinstance(value, list): - return cast(list[CallbackInput], value) + return cast("list[CallbackInput]", value) if isinstance(value, dict) and "id" in value: return cast(CallbackInput, value) return CallbackInput(id=dep["id"], property=dep["property"], value=value) diff --git a/tests/integration/mcp/conftest.py b/tests/integration/mcp/conftest.py index c81ffceb48..5030211ed8 100644 --- a/tests/integration/mcp/conftest.py +++ b/tests/integration/mcp/conftest.py @@ -1,8 +1,14 @@ """Shared helpers for MCP integration tests.""" +import sys + import pytest import requests +collect_ignore_glob = [] +if sys.version_info < (3, 10): + collect_ignore_glob.append("*") + @pytest.fixture(autouse=True) def _enable_mcp_for_integration_tests(monkeypatch): From fdaf822496048c14af4a92c72ced7cf357d92152 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 23 Apr 2026 10:51:46 -0600 Subject: [PATCH 059/103] fix leaky state in tests --- tests/integration/mcp/conftest.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/integration/mcp/conftest.py b/tests/integration/mcp/conftest.py index 5030211ed8..0db1b775e8 100644 --- a/tests/integration/mcp/conftest.py +++ b/tests/integration/mcp/conftest.py @@ -5,6 +5,8 @@ import pytest import requests +from dash import _get_app + collect_ignore_glob = [] if sys.version_info < (3, 10): collect_ignore_glob.append("*") @@ -16,6 +18,17 @@ def _enable_mcp_for_integration_tests(monkeypatch): monkeypatch.setenv("DASH_MCP_ENABLED", "true") +@pytest.fixture(autouse=True) +def _reset_dash_app_state(): + """Reset Dash module-level state after each MCP test. + + TODO: this can be removed when 4.2 backend work lands + """ + yield + _get_app.APP = None + _get_app.app_context.set(None) + + def _mcp_post(server_url, method, params=None, request_id=1): return requests.post( f"{server_url}/_mcp", From bfc61f23e832798699e3b35d3f7c3195c68d94f6 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 23 Apr 2026 14:49:31 -0600 Subject: [PATCH 060/103] Refactor unit tests to conform to existing test patterns --- .../tools/test_duplicate_outputs.py | 128 ----- .../primitives/tools/test_input_schemas.py | 66 --- .../tools/test_tool_get_dash_component.py | 54 -- .../mcp/primitives/tools/test_tools_list.py | 118 ---- ...tures.py => test_mcp_callback_behavior.py} | 508 ++++++++++++++---- tests/integration/mcp/test_mcp_endpoint.py | 189 +++++++ ...est_resources.py => test_mcp_resources.py} | 6 +- tests/integration/mcp/test_server.py | 183 ------- tests/unit/mcp/test_mcp_server.py | 99 ++++ tests/unit/mcp/test_server.py | 86 --- tests/unit/mcp/tools/test_mcp_run_callback.py | 253 +++++++++ tests/unit/mcp/tools/test_run_callback.py | 246 --------- 12 files changed, 947 insertions(+), 989 deletions(-) delete mode 100644 tests/integration/mcp/primitives/tools/test_duplicate_outputs.py delete mode 100644 tests/integration/mcp/primitives/tools/test_input_schemas.py delete mode 100644 tests/integration/mcp/primitives/tools/test_tool_get_dash_component.py delete mode 100644 tests/integration/mcp/primitives/tools/test_tools_list.py rename tests/integration/mcp/{primitives/tools/test_callback_signatures.py => test_mcp_callback_behavior.py} (66%) create mode 100644 tests/integration/mcp/test_mcp_endpoint.py rename tests/integration/mcp/{primitives/resources/test_resources.py => test_mcp_resources.py} (86%) delete mode 100644 tests/integration/mcp/test_server.py create mode 100644 tests/unit/mcp/test_mcp_server.py delete mode 100644 tests/unit/mcp/test_server.py create mode 100644 tests/unit/mcp/tools/test_mcp_run_callback.py delete mode 100644 tests/unit/mcp/tools/test_run_callback.py diff --git a/tests/integration/mcp/primitives/tools/test_duplicate_outputs.py b/tests/integration/mcp/primitives/tools/test_duplicate_outputs.py deleted file mode 100644 index 4ad00641f8..0000000000 --- a/tests/integration/mcp/primitives/tools/test_duplicate_outputs.py +++ /dev/null @@ -1,128 +0,0 @@ -"""Integration test for duplicate callback outputs. - -Multiple callbacks can output to the same component.property -when using ``allow_duplicate=True``. The MCP server must handle -this correctly — both callbacks should appear as tools, and -calling either should work. -""" - -from dash import Dash, Input, Output, dcc, html - -from tests.integration.mcp.conftest import _mcp_call_tool, _mcp_tools - - -def _find_tool(tools, name): - return next((t for t in tools if t["name"] == name), None) - - -def _get_response(result): - return result["result"]["structuredContent"]["response"] - - -def test_duplicate_outputs_both_tools_listed(dash_duo): - """Both callbacks outputting to the same component appear as tools.""" - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Input(id="first-name", value="Jane"), - dcc.Input(id="last-name", value="Doe"), - html.Div(id="greeting"), - ] - ) - - @app.callback( - Output("greeting", "children"), - Input("first-name", "value"), - ) - def greet_by_first(first): - return f"Hello, {first}!" - - @app.callback( - Output("greeting", "children", allow_duplicate=True), - Input("last-name", "value"), - prevent_initial_call=True, - ) - def greet_by_last(last): - return f"Hi, {last}!" - - dash_duo.start_server(app) - tools = _mcp_tools(dash_duo.server.url) - - first_tool = _find_tool(tools, "greet_by_first") - last_tool = _find_tool(tools, "greet_by_last") - - assert first_tool is not None, "greet_by_first should be listed" - assert last_tool is not None, "greet_by_last should be listed" - - -def test_duplicate_outputs_both_callable(dash_duo): - """Both callbacks can be called and produce correct results.""" - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Input(id="first-name", value="Jane"), - dcc.Input(id="last-name", value="Doe"), - html.Div(id="greeting"), - ] - ) - - @app.callback( - Output("greeting", "children"), - Input("first-name", "value"), - ) - def greet_by_first(first): - return f"Hello, {first}!" - - @app.callback( - Output("greeting", "children", allow_duplicate=True), - Input("last-name", "value"), - prevent_initial_call=True, - ) - def greet_by_last(last): - return f"Hi, {last}!" - - dash_duo.start_server(app) - - result1 = _mcp_call_tool(dash_duo.server.url, "greet_by_first", {"first": "Alice"}) - assert _get_response(result1)["greeting"]["children"] == "Hello, Alice!" - - result2 = _mcp_call_tool(dash_duo.server.url, "greet_by_last", {"last": "Smith"}) - assert _get_response(result2)["greeting"]["children"] == "Hi, Smith!" - - -def test_duplicate_outputs_find_by_output_returns_primary(dash_duo): - """find_by_output returns the primary (non-duplicate) callback.""" - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Input(id="first-name", value="Jane"), - dcc.Input(id="last-name", value="Doe"), - html.Div(id="greeting"), - ] - ) - - @app.callback( - Output("greeting", "children"), - Input("first-name", "value"), - ) - def greet_by_first(first): - return f"Hello, {first}!" - - @app.callback( - Output("greeting", "children", allow_duplicate=True), - Input("last-name", "value"), - prevent_initial_call=True, - ) - def greet_by_last(last): - return f"Hi, {last}!" - - dash_duo.start_server(app) - - # Query the component — should reflect initial callback (greet_by_first) - result = _mcp_call_tool( - dash_duo.server.url, - "get_dash_component", - {"component_id": "greeting", "property": "children"}, - ) - structured = result["result"]["structuredContent"] - assert structured["properties"]["children"]["initial_value"] == "Hello, Jane!" diff --git a/tests/integration/mcp/primitives/tools/test_input_schemas.py b/tests/integration/mcp/primitives/tools/test_input_schemas.py deleted file mode 100644 index 6ee3510ddd..0000000000 --- a/tests/integration/mcp/primitives/tools/test_input_schemas.py +++ /dev/null @@ -1,66 +0,0 @@ -""" -Integration tests for MCP tool schema generation. - -Starts a real Dash server via ``dash_duo`` and verifies that tools -are generated with correct inputSchema, descriptions, and labels. -""" - -from dash import Dash, Input, Output, dcc, html - -from tests.integration.mcp.conftest import _mcp_tools - - -def test_mcp_tool_with_label_and_date_picker_schema(dash_duo): - """Full assertion on a tool with an html.Label and DatePickerSingle constraints.""" - - # -- Test data: change these to update the test -- - label_text = "Departure Date" - component_id = "dp" - min_date = "2020-01-01" - max_date = "2025-12-31" - default_date = "2024-06-15" - func_name = "select_date" - param_name = "date" # function parameter name - - app = Dash(__name__) - app.layout = html.Div( - [ - html.Label(label_text, htmlFor=component_id), - dcc.DatePickerSingle( - id=component_id, - min_date_allowed=min_date, - max_date_allowed=max_date, - date=default_date, - ), - html.Div(id="out"), - ] - ) - - @app.callback(Output("out", "children"), Input(component_id, "date")) - def select_date(date): - return f"Selected: {date}" - - dash_duo.start_server(app) - tools = _mcp_tools(dash_duo.server.url) - - # Find the callback tool - tool = next(t for t in tools if t["name"] not in ("get_dash_component",)) - - # -- Tool-level fields -- - assert func_name in tool["name"] - - # -- inputSchema structure -- - schema = tool["inputSchema"] - assert schema["type"] == "object" - assert param_name in schema["required"] - assert param_name in schema["properties"] - - # -- Property schema: type + format + description -- - prop = schema["properties"][param_name] - assert prop["type"] == "string" - assert prop["format"] == "date" - - # description includes all source values (label, constraints, default) - desc = prop["description"] - for expected in (label_text, min_date, max_date, default_date): - assert expected in desc, f"Expected {expected!r} in description: {desc!r}" diff --git a/tests/integration/mcp/primitives/tools/test_tool_get_dash_component.py b/tests/integration/mcp/primitives/tools/test_tool_get_dash_component.py deleted file mode 100644 index 97472a16d7..0000000000 --- a/tests/integration/mcp/primitives/tools/test_tool_get_dash_component.py +++ /dev/null @@ -1,54 +0,0 @@ -"""Integration tests for the get_dash_component tool.""" - -from dash import Dash, dcc, html - -from tests.integration.mcp.conftest import _mcp_call_tool - -EXPECTED_DROPDOWN_OPTIONS = { - "component_id": "my-dropdown", - "component_type": "Dropdown", - "label": None, - "properties": { - "options": { - "initial_value": [ - {"label": "New York", "value": "NYC"}, - {"label": "Montreal", "value": "MTL"}, - ], - "modified_by_tool": [], - "input_to_tool": [], - }, - }, -} - - -def test_query_component_returns_structured_output(dash_duo): - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Dropdown( - id="my-dropdown", - options=[ - {"label": "New York", "value": "NYC"}, - {"label": "Montreal", "value": "MTL"}, - ], - value="NYC", - ), - ] - ) - - dash_duo.start_server(app) - - result = _mcp_call_tool( - dash_duo.server.url, - "get_dash_component", - {"component_id": "my-dropdown", "property": "options"}, - ) - - assert "result" in result, f"Expected result in response: {result}" - structured = result["result"]["structuredContent"] - assert structured["component_id"] == EXPECTED_DROPDOWN_OPTIONS["component_id"] - assert structured["component_type"] == EXPECTED_DROPDOWN_OPTIONS["component_type"] - assert ( - structured["properties"]["options"] - == EXPECTED_DROPDOWN_OPTIONS["properties"]["options"] - ) diff --git a/tests/integration/mcp/primitives/tools/test_tools_list.py b/tests/integration/mcp/primitives/tools/test_tools_list.py deleted file mode 100644 index dc3d977146..0000000000 --- a/tests/integration/mcp/primitives/tools/test_tools_list.py +++ /dev/null @@ -1,118 +0,0 @@ -"""Integration tests for tools/list — naming, dedup, and spec compliance.""" - -from dash import Dash, Input, Output, dcc, html - -from tests.integration.mcp.conftest import _mcp_tools - - -def test_tool_names_within_64_chars(dash_duo): - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Dropdown(id="dd", options=["a"], value="a"), - html.Div(id="out"), - ] - ) - - @app.callback(Output("out", "children"), Input("dd", "value")) - def update(val): - return val - - dash_duo.start_server(app) - for tool in _mcp_tools(dash_duo.server.url): - assert len(tool["name"]) <= 64, f"Tool name exceeds 64 chars: {tool['name']}" - for param_name in tool.get("inputSchema", {}).get("properties", {}): - assert len(param_name) <= 64, f"Param name exceeds 64 chars: {param_name}" - - -def test_long_callback_ids_within_64_chars(dash_duo): - app = Dash(__name__) - long_id = "a" * 120 - app.layout = html.Div( - [ - dcc.Input(id=long_id, value="test"), - html.Div(id=f"{long_id}-output"), - ] - ) - - @app.callback(Output(f"{long_id}-output", "children"), Input(long_id, "value")) - def process(val): - return val - - dash_duo.start_server(app) - for tool in _mcp_tools(dash_duo.server.url): - assert len(tool["name"]) <= 64, f"Tool name exceeds 64 chars: {tool['name']}" - - -def test_pattern_matching_ids_within_64_chars(dash_duo): - app = Dash(__name__) - app.layout = html.Div( - [ - html.Div( - [ - dcc.Input( - id={"type": "filter-input", "index": i, "category": "primary"}, - value=f"val-{i}", - ) - for i in range(3) - ] - ), - html.Div(id="pm-output"), - ] - ) - - @app.callback( - Output("pm-output", "children"), - Input({"type": "filter-input", "index": 0, "category": "primary"}, "value"), - ) - def filter_update(v0): - return str(v0) - - dash_duo.start_server(app) - for tool in _mcp_tools(dash_duo.server.url): - assert len(tool["name"]) <= 64, f"Tool name exceeds 64 chars: {tool['name']}" - - -def test_duplicate_func_names_produce_unique_tools(dash_duo): - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Dropdown(id="dd1", options=["a"], value="a"), - html.Div(id="dd1-output"), - dcc.Dropdown(id="dd2", options=["b"], value="b"), - html.Div(id="dd2-output"), - dcc.Dropdown(id="dd3", options=["c"], value="c"), - html.Div(id="dd3-output"), - ] - ) - - @app.callback(Output("dd1-output", "children"), Input("dd1", "value")) - def cb(value): - return f"first: {value}" - - @app.callback(Output("dd2-output", "children"), Input("dd2", "value")) - def cb(value): # noqa: F811 - return f"second: {value}" - - @app.callback(Output("dd3-output", "children"), Input("dd3", "value")) - def cb(value): # noqa: F811 - return f"third: {value}" - - dash_duo.start_server(app) - tools = _mcp_tools(dash_duo.server.url) - cb_tools = [t for t in tools if t["name"] not in ("get_dash_component",)] - tool_names = [t["name"] for t in cb_tools] - - assert ( - len(tool_names) == 3 - ), f"Expected 3 callback tools, got {len(tool_names)}: {tool_names}" - assert len(set(tool_names)) == 3, f"Tool names not unique: {tool_names}" - - -def test_builtin_tools_always_present(dash_duo): - app = Dash(__name__) - app.layout = html.Div(id="root") - - dash_duo.start_server(app) - tool_names = [t["name"] for t in _mcp_tools(dash_duo.server.url)] - assert "get_dash_component" in tool_names diff --git a/tests/integration/mcp/primitives/tools/test_callback_signatures.py b/tests/integration/mcp/test_mcp_callback_behavior.py similarity index 66% rename from tests/integration/mcp/primitives/tools/test_callback_signatures.py rename to tests/integration/mcp/test_mcp_callback_behavior.py index db325f2046..7778111386 100644 --- a/tests/integration/mcp/primitives/tools/test_callback_signatures.py +++ b/tests/integration/mcp/test_mcp_callback_behavior.py @@ -1,29 +1,56 @@ +"""Callback behaviors surfaced through MCP tools (end-to-end). + +Covers the full pipeline — a real Dash server via ``dash_duo`` + the MCP +HTTP endpoint — for every callback signature variant and the surrounding +tool-list conventions: + +- Positional, dict-based, and tuple-grouped ``inputs`` / ``state`` / + ``output`` forms. +- ``State``, multi-output, ``PreventUpdate``-style no-output callbacks, + ``ctx.triggered_id``, pattern-matching (``ALL``/``MATCH``/``ALLSMALLER``). +- Initial values: ``prevent_initial_call`` vs. initial-callback overrides. +- Duplicate outputs (``allow_duplicate=True``) appearing as separate tools. +- ``tools/list`` naming rules (64-char limit, uniqueness, built-ins). +- A representative input-schema smoke test (label + DatePicker). +- ``get_dash_component`` structured output via HTTP. """ -Integration tests for all Dash callback signature types. -Each test verifies that: -1. The MCP tool schema accurately reflects the callback's parameters -2. Calling the tool with those parameters produces the expected result +from dash import ( + ALL, + ALLSMALLER, + MATCH, + Dash, + Input, + Output, + State, + ctx, + dcc, + html, + set_props, +) -Assertions are derived from the callback definition, not the implementation. - -See: https://dash.plotly.com/flexible-callback-signatures -""" +from tests.integration.mcp.conftest import _mcp_call_tool, _mcp_tools -from dash import Dash, Input, Output, State, dcc, html -from tests.integration.mcp.conftest import _mcp_call_tool, _mcp_tools +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- def _find_tool(tools, name): - return next(t for t in tools if t["name"] == name) + return next((t for t in tools if t["name"] == name), None) def _get_response(result): return result["result"]["structuredContent"]["response"] -def test_positional_callback(dash_duo): +# --------------------------------------------------------------------------- +# Callback signatures — positional, multi-output, State, dict-based, tuples +# --------------------------------------------------------------------------- + + +def test_mcpb001_positional_callback(dash_duo): """Standard positional: Input("fruit", "value") → param named 'value'.""" app = Dash(__name__) app.layout = html.Div( @@ -33,8 +60,6 @@ def test_positional_callback(dash_duo): ] ) - # Callback: 1 Input → 1 param named "value" (from function signature) - # Returns string → Output("out", "children") @app.callback(Output("out", "children"), Input("fruit", "value")) def show_fruit(value): return f"Selected: {value}" @@ -48,23 +73,20 @@ def show_fruit(value): assert set(props.keys()) == {"value"} assert any(s.get("type") == "string" for s in props["value"]["anyOf"]) - # Tool description reflects initial state value_desc = props["value"].get("description", "") assert "value: 'apple'" in value_desc assert "options: ['apple', 'banana']" in value_desc - # MCP tool with initial inputs matches browser result = _mcp_call_tool(dash_duo.server.url, "show_fruit", {"value": "apple"}) response = _get_response(result) assert response["out"]["children"] == "Selected: apple" - # MCP tool with different inputs result = _mcp_call_tool(dash_duo.server.url, "show_fruit", {"value": "banana"}) response = _get_response(result) assert response["out"]["children"] == "Selected: banana" -def test_positional_with_state(dash_duo): +def test_mcpb002_positional_with_state(dash_duo): """Positional with State: Input + State both appear as params.""" app = Dash(__name__) app.layout = html.Div( @@ -75,7 +97,6 @@ def test_positional_with_state(dash_duo): ] ) - # Callback: 1 Input + 1 State → 2 params named "n_clicks" and "value" @app.callback( Output("out", "children"), Input("btn", "n_clicks"), @@ -93,10 +114,8 @@ def update(n_clicks, value): assert set(props.keys()) == {"n_clicks", "value"} assert any(s.get("type") == "number" for s in props["n_clicks"]["anyOf"]) - # Tool description reflects initial state assert "value: 'hello'" in props["value"].get("description", "") - # MCP tool with initial inputs matches browser result = _mcp_call_tool( dash_duo.server.url, "update", {"n_clicks": None, "value": "hello"} ) @@ -110,7 +129,7 @@ def update(n_clicks, value): assert response["out"]["children"] == "Clicked 3 with world" -def test_multi_output_positional(dash_duo): +def test_mcpb003_multi_output_positional(dash_duo): """Multi-output: returns tuple → both outputs updated in response.""" app = Dash(__name__) app.layout = html.Div( @@ -121,7 +140,6 @@ def test_multi_output_positional(dash_duo): ] ) - # Callback: 1 Input → 2 Outputs via tuple return @app.callback( Output("out1", "children"), Output("out2", "children"), @@ -138,18 +156,16 @@ def split_case(value): props = tool["inputSchema"]["properties"] assert set(props.keys()) == {"value"} - # Tool description reflects initial state assert "value: 'test'" in props["value"].get("description", "") - # MCP tool with initial inputs matches browser result = _mcp_call_tool(dash_duo.server.url, "split_case", {"value": "test"}) response = _get_response(result) assert response["out1"]["children"] == "TEST" assert response["out2"]["children"] == "test" -def test_dict_based_inputs_and_state(dash_duo): - """Dict-based: inputs=dict(trigger=...), state=dict(name=...) → dict keys are param names.""" +def test_mcpb004_dict_based_inputs_and_state(dash_duo): + """Dict-based: inputs=dict(trigger=...), state=dict(name=...) → dict keys are params.""" app = Dash(__name__) app.layout = html.Div( [ @@ -159,7 +175,6 @@ def test_dict_based_inputs_and_state(dash_duo): ] ) - # Callback: dict keys "trigger" and "name" become param names @app.callback( Output("out", "children"), inputs=dict(trigger=Input("btn", "n_clicks")), @@ -177,7 +192,6 @@ def greet(trigger, name): assert set(props.keys()) == {"trigger", "name"} assert any(s.get("type") == "number" for s in props["trigger"]["anyOf"]) - # MCP tool with initial inputs matches browser result = _mcp_call_tool( dash_duo.server.url, "greet", {"trigger": None, "name": "world"} ) @@ -191,7 +205,7 @@ def greet(trigger, name): assert response["out"]["children"] == "Hello, Dash!" -def test_dict_based_outputs(dash_duo): +def test_mcpb005_dict_based_outputs(dash_duo): """Dict-based outputs: output=dict(...) → callback returns dict, both outputs updated.""" app = Dash(__name__) app.layout = html.Div( @@ -202,7 +216,6 @@ def test_dict_based_outputs(dash_duo): ] ) - # Callback: dict output keys "upper" and "lower" map to components @app.callback( output=dict( upper=Output("upper-out", "children"), @@ -221,14 +234,13 @@ def transform(val): props = tool["inputSchema"]["properties"] assert set(props.keys()) == {"val"} - # MCP tool with initial inputs matches browser result = _mcp_call_tool(dash_duo.server.url, "transform", {"val": "hello"}) response = _get_response(result) assert response["upper-out"]["children"] == "HELLO" assert response["lower-out"]["children"] == "hello" -def test_mixed_input_state_in_inputs(dash_duo): +def test_mcpb006_mixed_input_state_in_inputs(dash_duo): """Mixed: State inside inputs=dict alongside Input → all appear as params.""" app = Dash(__name__) app.layout = html.Div( @@ -240,7 +252,6 @@ def test_mixed_input_state_in_inputs(dash_duo): ] ) - # Callback: Input and State mixed in same dict → all keys are params @app.callback( Output("out", "children"), inputs=dict( @@ -261,7 +272,6 @@ def full_name(clicks, first, last): assert set(props.keys()) == {"clicks", "first", "last"} assert any(s.get("type") == "number" for s in props["clicks"]["anyOf"]) - # MCP tool with initial inputs matches browser result = _mcp_call_tool( dash_duo.server.url, "full_name", @@ -279,7 +289,7 @@ def full_name(clicks, first, last): assert response["out"]["children"] == "John Smith" -def test_tuple_grouped_inputs(dash_duo): +def test_mcpb007_tuple_grouped_inputs(dash_duo): """Tuple grouping: pair=(Input("a",...), Input("b",...)) → expands to two named params.""" app = Dash(__name__) app.layout = html.Div( @@ -290,7 +300,6 @@ def test_tuple_grouped_inputs(dash_duo): ] ) - # Callback: tuple group "pair" maps to 2 deps → 2 params named pair___ @app.callback( Output("out", "children"), inputs=dict(pair=(Input("a", "value"), Input("b", "value"))), @@ -302,7 +311,6 @@ def combine(pair): tool = _find_tool(_mcp_tools(dash_duo.server.url), "combine") props = tool["inputSchema"]["properties"] - # Tuple expands: one param per dep, named with group prefix + component info assert set(props.keys()) == {"pair_a__value", "pair_b__value"} for schema in props.values(): assert any(s.get("type") == "string" for s in schema["anyOf"]) @@ -316,7 +324,7 @@ def combine(pair): assert response["out"]["children"] == "x+y" -def test_initial_values_from_chained_callbacks(dash_duo): +def test_mcpb008_initial_values_from_chained_callbacks(dash_duo): """Querying components reflects post-initial-callback values. 3-link chain: country (default "France") → update_states → @@ -368,16 +376,13 @@ def update_cities(state, country): dash_duo.start_server(app) - # Tool descriptions should reflect post-initial-callback state tools = _mcp_tools(dash_duo.server.url) update_cities_tool = _find_tool(tools, "update_cities") state_desc = update_cities_tool["inputSchema"]["properties"]["state"].get( "description", "" ) - # state.value was set to "Ile-de-France" by update_states initial callback assert "Ile-de-France" in state_desc - # state.value should be "Ile-de-France" (first state for France) result = _mcp_call_tool( dash_duo.server.url, "get_dash_component", @@ -386,7 +391,6 @@ def update_cities(state, country): state_props = result["result"]["structuredContent"]["properties"] assert state_props["value"]["initial_value"] == "Ile-de-France" - # city.value should be "Paris" (first city for Ile-de-France) result = _mcp_call_tool( dash_duo.server.url, "get_dash_component", @@ -396,7 +400,7 @@ def update_cities(state, country): assert city_props["value"]["initial_value"] == "Paris" -def test_dict_based_reordered_state_input(dash_duo): +def test_mcpb009_dict_based_reordered_state_input(dash_duo): """Dict-based callback with State before Input: call works, schema types correct. State is listed before Input in the dict. The callback should still @@ -421,7 +425,6 @@ def greet(name: str, trigger: int): dash_duo.start_server(app) - # First: verify the callback actually works with these args result = _mcp_call_tool( dash_duo.server.url, "greet", @@ -429,20 +432,23 @@ def greet(name: str, trigger: int): ) assert _get_response(result)["out"]["children"] == "Hello Dash" - # Second: verify schema types match annotations tool = _find_tool(_mcp_tools(dash_duo.server.url), "greet") props = tool["inputSchema"]["properties"] assert props["trigger"]["type"] == "integer" assert props["name"]["type"] == "string" - # Third: verify each param describes the correct component trigger_desc = props["trigger"].get("description", "") assert "number of times that this element has been clicked on" in trigger_desc name_desc = props["name"].get("description", "") assert "The value of the input" in name_desc -def test_pattern_matching_callback(dash_duo): +# --------------------------------------------------------------------------- +# Pattern-matching callbacks (ALL / MATCH / ALLSMALLER) +# --------------------------------------------------------------------------- + + +def test_mcpb010_pattern_matching_callback(dash_duo): """Pattern-matching dict IDs: tool works with correct params and results.""" app = Dash(__name__) app.layout = html.Div( @@ -469,7 +475,6 @@ def combine(first, second): assert "first" in props assert "second" in props - # Verify initial output matches what the browser shows dash_duo.wait_for_text_to_equal("#out", "hello world") result = _mcp_call_tool( dash_duo.server.url, @@ -479,7 +484,6 @@ def combine(first, second): response = _get_response(result) assert response["out"]["children"] == "hello world" - # Verify with different values result = _mcp_call_tool( dash_duo.server.url, "combine", @@ -489,10 +493,8 @@ def combine(first, second): assert response["out"]["children"] == "foo bar" -def test_pattern_matching_with_all_wildcard(dash_duo): +def test_mcpb011_pattern_matching_with_all_wildcard(dash_duo): """ALL wildcard: one callback receives values from all matching components.""" - from dash import ALL - app = Dash(__name__) app.layout = html.Div( [ @@ -515,7 +517,6 @@ def summarize(values): tool = _find_tool(_mcp_tools(dash_duo.server.url), "summarize") assert tool is not None - # Schema must describe values as an array of {id, property, value} objects values_schema = tool["inputSchema"]["properties"]["values"] assert ( values_schema["type"] == "array" @@ -529,7 +530,6 @@ def summarize(values): "description", "" ), "ALL wildcard param description should explain the pattern-matching behavior" - # MCP tool call with browser-like format: concrete IDs + values result = _mcp_call_tool( dash_duo.server.url, "summarize", @@ -551,7 +551,6 @@ def summarize(values): response = _get_response(result) assert response["summary"]["children"] == "alpha, beta" - # Different values result = _mcp_call_tool( dash_duo.server.url, "summarize", @@ -574,10 +573,8 @@ def summarize(values): assert response["summary"]["children"] == "one, two" -def test_pattern_matching_mixed_outputs(dash_duo): +def test_mcpb012_pattern_matching_mixed_outputs(dash_duo): """Mixed outputs: one regular + one ALL wildcard in the same callback.""" - from dash import ALL - app = Dash(__name__) app.layout = html.Div( [ @@ -624,13 +621,11 @@ def echo_and_total(values): assert response["total"]["children"] == "Total: 2 items" -def test_pattern_matching_with_match_wildcard(dash_duo): +def test_mcpb013_pattern_matching_with_match_wildcard(dash_duo): """MATCH wildcard: callback fires per-component with matching index. Based on https://dash.plotly.com/pattern-matching-callbacks """ - from dash import MATCH - app = Dash(__name__) app.layout = html.Div( [ @@ -661,11 +656,9 @@ def show_city(value): tool = _find_tool(_mcp_tools(dash_duo.server.url), "show_city") assert tool is not None - # Schema describes MATCH input value_schema = tool["inputSchema"]["properties"]["value"] assert "Pattern-matching input (MATCH)" in value_schema.get("description", "") - # Call with concrete ID for index 0 (MATCH takes a single entry, not an array) result = _mcp_call_tool( dash_duo.server.url, "show_city", @@ -678,18 +671,15 @@ def show_city(value): }, ) response = _get_response(result) - # Find the output key containing "city-out" (Dash may serialize dict IDs differently) out_key = next(k for k in response if "city-out" in k) assert response[out_key]["children"] == "Selected: MTL" -def test_pattern_matching_with_allsmaller_wildcard(dash_duo): +def test_mcpb014_pattern_matching_with_allsmaller_wildcard(dash_duo): """ALLSMALLER wildcard: receives values from components with smaller index. Based on https://dash.plotly.com/pattern-matching-callbacks """ - from dash import MATCH, ALLSMALLER - app = Dash(__name__) app.layout = html.Div( [ @@ -728,14 +718,12 @@ def show_countries(current, previous): tool = _find_tool(_mcp_tools(dash_duo.server.url), "show_countries") assert tool is not None - # Schema describes both MATCH and ALLSMALLER inputs props = tool["inputSchema"]["properties"] assert "Pattern-matching input (MATCH)" in props["current"].get("description", "") assert "Pattern-matching input (ALLSMALLER)" in props["previous"].get( "description", "" ) - # Call for index 2: MATCH is a single dict, ALLSMALLER is a list result = _mcp_call_tool( dash_duo.server.url, "show_countries", @@ -764,13 +752,13 @@ def show_countries(current, previous): assert response[out_key]["children"] == "All: Japan, Germany, France" -def test_prevent_initial_call_uses_layout_default(dash_duo): - """prevent_initial_call=True: initial value stays as the layout default. +# --------------------------------------------------------------------------- +# Initial values: prevent_initial_call vs. initial-callback overrides +# --------------------------------------------------------------------------- - The dropdown has value="original" in the layout. The callback has - prevent_initial_call=True so it doesn't run on page load. The MCP - tool description should show value: 'a' (layout default). - """ + +def test_mcpb015_prevent_initial_call_uses_layout_default(dash_duo): + """prevent_initial_call=True: initial value stays as the layout default.""" app = Dash(__name__) app.layout = html.Div( [ @@ -788,24 +776,16 @@ def update(val): return f"Changed to: {val}" dash_duo.start_server(app) - # Browser shows layout default — callback hasn't fired dash_duo.wait_for_text_to_equal("#out", "not yet") tool = _find_tool(_mcp_tools(dash_duo.server.url), "update") val_desc = tool["inputSchema"]["properties"]["val"].get("description", "") - # Tool description reflects layout default, not callback output assert "value: 'a'" in val_desc -def test_initial_callback_overrides_layout_value(dash_duo): - """Initial callback overrides layout value in tool description. - - The city dropdown has value="default-city" in the layout. - update_city runs on page load (no prevent_initial_call) and - sets city.value to "Paris". The MCP tool should show "Paris" - as the default, not "default-city". - """ +def test_mcpb016_initial_callback_overrides_layout_value(dash_duo): + """Initial callback overrides layout value in tool description.""" app = Dash(__name__) app.layout = html.Div( [ @@ -830,24 +810,20 @@ def show_city(city): return f"City: {city}" dash_duo.start_server(app) - # Browser shows "Paris" — the initial callback overrode "default-city" dash_duo.wait_for_text_to_equal("#out", "City: Paris") tool = _find_tool(_mcp_tools(dash_duo.server.url), "show_city") city_desc = tool["inputSchema"]["properties"]["city"].get("description", "") - # Tool description should show the post-initial-callback value assert "value: 'Paris'" in city_desc assert "default-city" not in city_desc -def test_callback_context_triggered_id(dash_duo): +def test_mcpb017_callback_context_triggered_id(dash_duo): """Callbacks using dash.ctx.triggered_id work via MCP. Based on https://dash.plotly.com/determining-which-callback-input-changed """ - from dash import ctx - app = Dash(__name__) app.layout = html.Div( [ @@ -871,17 +847,14 @@ def display(btn1, btn2, btn3): dash_duo.start_server(app) - # Browser initial state: no button clicked dash_duo.wait_for_text_to_equal("#output", "No button clicked yet") - # Tool should have all three button params tool = _find_tool(_mcp_tools(dash_duo.server.url), "display") props = tool["inputSchema"]["properties"] assert "btn1" in props assert "btn2" in props assert "btn3" in props - # Click btn-2 via MCP — ctx.triggered_id should be "btn-2" result = _mcp_call_tool( dash_duo.server.url, "display", @@ -890,7 +863,6 @@ def display(btn1, btn2, btn3): response = _get_response(result) assert response["output"]["children"] == "Last clicked: btn-2" - # Click btn-3 via MCP result = _mcp_call_tool( dash_duo.server.url, "display", @@ -900,14 +872,12 @@ def display(btn1, btn2, btn3): assert response["output"]["children"] == "Last clicked: btn-3" -def test_no_output_callback_does_not_crash_tools_list(dash_duo): +def test_mcpb018_no_output_callback_does_not_crash_tools_list(dash_duo): """A callback with no Output should not crash tools/list. No-output callbacks use set_props for side effects. They produce a hash-only output_id with no dot separator. """ - from dash import set_props - app = Dash(__name__) app.layout = html.Div( [ @@ -930,13 +900,9 @@ def show_selection(val): tools = _mcp_tools(dash_duo.server.url) tool_names = [t["name"] for t in tools] - # show_selection should appear as a tool assert "show_selection" in tool_names - - # log_click has no declared output but uses set_props — still a valid tool assert "log_click" in tool_names - # Call log_click — sideUpdate should show the set_props effect result = _mcp_call_tool( dash_duo.server.url, "log_click", @@ -946,9 +912,6 @@ def show_selection(val): assert "sideUpdate" in structured assert structured["sideUpdate"]["display"]["children"] == "Logged 3 clicks" - # get_dash_component shows show_selection as modifier (declared output). - # log_click uses set_props which bypasses the declarative graph — - # its effect is only visible via sideUpdate in tool call results. result = _mcp_call_tool( dash_duo.server.url, "get_dash_component", @@ -956,3 +919,338 @@ def show_selection(val): ) prop_info = result["result"]["structuredContent"]["properties"]["children"] assert "show_selection" in prop_info["modified_by_tool"] + + +# --------------------------------------------------------------------------- +# Duplicate outputs (allow_duplicate=True) +# --------------------------------------------------------------------------- + + +def test_mcpb019_duplicate_outputs_both_tools_listed(dash_duo): + """Both callbacks outputting to the same component appear as tools.""" + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="first-name", value="Jane"), + dcc.Input(id="last-name", value="Doe"), + html.Div(id="greeting"), + ] + ) + + @app.callback( + Output("greeting", "children"), + Input("first-name", "value"), + ) + def greet_by_first(first): + return f"Hello, {first}!" + + @app.callback( + Output("greeting", "children", allow_duplicate=True), + Input("last-name", "value"), + prevent_initial_call=True, + ) + def greet_by_last(last): + return f"Hi, {last}!" + + dash_duo.start_server(app) + tools = _mcp_tools(dash_duo.server.url) + + first_tool = _find_tool(tools, "greet_by_first") + last_tool = _find_tool(tools, "greet_by_last") + + assert first_tool is not None, "greet_by_first should be listed" + assert last_tool is not None, "greet_by_last should be listed" + + +def test_mcpb020_duplicate_outputs_both_callable(dash_duo): + """Both callbacks can be called and produce correct results.""" + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="first-name", value="Jane"), + dcc.Input(id="last-name", value="Doe"), + html.Div(id="greeting"), + ] + ) + + @app.callback( + Output("greeting", "children"), + Input("first-name", "value"), + ) + def greet_by_first(first): + return f"Hello, {first}!" + + @app.callback( + Output("greeting", "children", allow_duplicate=True), + Input("last-name", "value"), + prevent_initial_call=True, + ) + def greet_by_last(last): + return f"Hi, {last}!" + + dash_duo.start_server(app) + + result1 = _mcp_call_tool(dash_duo.server.url, "greet_by_first", {"first": "Alice"}) + assert _get_response(result1)["greeting"]["children"] == "Hello, Alice!" + + result2 = _mcp_call_tool(dash_duo.server.url, "greet_by_last", {"last": "Smith"}) + assert _get_response(result2)["greeting"]["children"] == "Hi, Smith!" + + +def test_mcpb021_duplicate_outputs_find_by_output_returns_primary(dash_duo): + """find_by_output returns the primary (non-duplicate) callback.""" + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="first-name", value="Jane"), + dcc.Input(id="last-name", value="Doe"), + html.Div(id="greeting"), + ] + ) + + @app.callback( + Output("greeting", "children"), + Input("first-name", "value"), + ) + def greet_by_first(first): + return f"Hello, {first}!" + + @app.callback( + Output("greeting", "children", allow_duplicate=True), + Input("last-name", "value"), + prevent_initial_call=True, + ) + def greet_by_last(last): + return f"Hi, {last}!" + + dash_duo.start_server(app) + + result = _mcp_call_tool( + dash_duo.server.url, + "get_dash_component", + {"component_id": "greeting", "property": "children"}, + ) + structured = result["result"]["structuredContent"] + assert structured["properties"]["children"]["initial_value"] == "Hello, Jane!" + + +# --------------------------------------------------------------------------- +# tools/list — naming rules (64-char limit, uniqueness, built-ins) +# --------------------------------------------------------------------------- + + +def test_mcpb022_tool_names_within_64_chars(dash_duo): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="dd", options=["a"], value="a"), + html.Div(id="out"), + ] + ) + + @app.callback(Output("out", "children"), Input("dd", "value")) + def update(val): + return val + + dash_duo.start_server(app) + for tool in _mcp_tools(dash_duo.server.url): + assert len(tool["name"]) <= 64, f"Tool name exceeds 64 chars: {tool['name']}" + for param_name in tool.get("inputSchema", {}).get("properties", {}): + assert len(param_name) <= 64, f"Param name exceeds 64 chars: {param_name}" + + +def test_mcpb023_long_callback_ids_within_64_chars(dash_duo): + app = Dash(__name__) + long_id = "a" * 120 + app.layout = html.Div( + [ + dcc.Input(id=long_id, value="test"), + html.Div(id=f"{long_id}-output"), + ] + ) + + @app.callback(Output(f"{long_id}-output", "children"), Input(long_id, "value")) + def process(val): + return val + + dash_duo.start_server(app) + for tool in _mcp_tools(dash_duo.server.url): + assert len(tool["name"]) <= 64, f"Tool name exceeds 64 chars: {tool['name']}" + + +def test_mcpb024_pattern_matching_ids_within_64_chars(dash_duo): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div( + [ + dcc.Input( + id={"type": "filter-input", "index": i, "category": "primary"}, + value=f"val-{i}", + ) + for i in range(3) + ] + ), + html.Div(id="pm-output"), + ] + ) + + @app.callback( + Output("pm-output", "children"), + Input({"type": "filter-input", "index": 0, "category": "primary"}, "value"), + ) + def filter_update(v0): + return str(v0) + + dash_duo.start_server(app) + for tool in _mcp_tools(dash_duo.server.url): + assert len(tool["name"]) <= 64, f"Tool name exceeds 64 chars: {tool['name']}" + + +def test_mcpb025_duplicate_func_names_produce_unique_tools(dash_duo): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="dd1", options=["a"], value="a"), + html.Div(id="dd1-output"), + dcc.Dropdown(id="dd2", options=["b"], value="b"), + html.Div(id="dd2-output"), + dcc.Dropdown(id="dd3", options=["c"], value="c"), + html.Div(id="dd3-output"), + ] + ) + + @app.callback(Output("dd1-output", "children"), Input("dd1", "value")) + def cb(value): + return f"first: {value}" + + @app.callback(Output("dd2-output", "children"), Input("dd2", "value")) + def cb(value): # noqa: F811 + return f"second: {value}" + + @app.callback(Output("dd3-output", "children"), Input("dd3", "value")) + def cb(value): # noqa: F811 + return f"third: {value}" + + dash_duo.start_server(app) + tools = _mcp_tools(dash_duo.server.url) + cb_tools = [t for t in tools if t["name"] not in ("get_dash_component",)] + tool_names = [t["name"] for t in cb_tools] + + assert ( + len(tool_names) == 3 + ), f"Expected 3 callback tools, got {len(tool_names)}: {tool_names}" + assert len(set(tool_names)) == 3, f"Tool names not unique: {tool_names}" + + +def test_mcpb026_builtin_tools_always_present(dash_duo): + app = Dash(__name__) + app.layout = html.Div(id="root") + + dash_duo.start_server(app) + tool_names = [t["name"] for t in _mcp_tools(dash_duo.server.url)] + assert "get_dash_component" in tool_names + + +# --------------------------------------------------------------------------- +# Input schema smoke test + get_dash_component HTTP structured output +# --------------------------------------------------------------------------- + + +def test_mcpb027_mcp_tool_with_label_and_date_picker_schema(dash_duo): + """Full assertion on a tool with an html.Label and DatePickerSingle constraints.""" + label_text = "Departure Date" + component_id = "dp" + min_date = "2020-01-01" + max_date = "2025-12-31" + default_date = "2024-06-15" + func_name = "select_date" + param_name = "date" # function parameter name + + app = Dash(__name__) + app.layout = html.Div( + [ + html.Label(label_text, htmlFor=component_id), + dcc.DatePickerSingle( + id=component_id, + min_date_allowed=min_date, + max_date_allowed=max_date, + date=default_date, + ), + html.Div(id="out"), + ] + ) + + @app.callback(Output("out", "children"), Input(component_id, "date")) + def select_date(date): + return f"Selected: {date}" + + dash_duo.start_server(app) + tools = _mcp_tools(dash_duo.server.url) + + tool = next(t for t in tools if t["name"] not in ("get_dash_component",)) + + assert func_name in tool["name"] + + schema = tool["inputSchema"] + assert schema["type"] == "object" + assert param_name in schema["required"] + assert param_name in schema["properties"] + + prop = schema["properties"][param_name] + assert prop["type"] == "string" + assert prop["format"] == "date" + + desc = prop["description"] + for expected in (label_text, min_date, max_date, default_date): + assert expected in desc, f"Expected {expected!r} in description: {desc!r}" + + +EXPECTED_DROPDOWN_OPTIONS = { + "component_id": "my-dropdown", + "component_type": "Dropdown", + "label": None, + "properties": { + "options": { + "initial_value": [ + {"label": "New York", "value": "NYC"}, + {"label": "Montreal", "value": "MTL"}, + ], + "modified_by_tool": [], + "input_to_tool": [], + }, + }, +} + + +def test_mcpb028_query_component_returns_structured_output(dash_duo): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown( + id="my-dropdown", + options=[ + {"label": "New York", "value": "NYC"}, + {"label": "Montreal", "value": "MTL"}, + ], + value="NYC", + ), + ] + ) + + dash_duo.start_server(app) + + result = _mcp_call_tool( + dash_duo.server.url, + "get_dash_component", + {"component_id": "my-dropdown", "property": "options"}, + ) + + assert "result" in result, f"Expected result in response: {result}" + structured = result["result"]["structuredContent"] + assert structured["component_id"] == EXPECTED_DROPDOWN_OPTIONS["component_id"] + assert structured["component_type"] == EXPECTED_DROPDOWN_OPTIONS["component_type"] + assert ( + structured["properties"]["options"] + == EXPECTED_DROPDOWN_OPTIONS["properties"]["options"] + ) diff --git a/tests/integration/mcp/test_mcp_endpoint.py b/tests/integration/mcp/test_mcp_endpoint.py new file mode 100644 index 0000000000..44b358c25d --- /dev/null +++ b/tests/integration/mcp/test_mcp_endpoint.py @@ -0,0 +1,189 @@ +"""MCP Streamable HTTP endpoint — transport-layer behavior. + +Uses Flask's test_client to exercise POST/GET/DELETE at /_mcp, +session management, content-type handling, and route registration +driven by ``enable_mcp`` / ``DASH_MCP_ENABLED`` / ``routes_pathname_prefix``. +""" + +import json +import os + +from dash import Dash, Input, Output, html +from mcp.types import LATEST_PROTOCOL_VERSION + +MCP_PATH = "_mcp" + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def _make_app(**kwargs): + """Create a minimal Dash app with a layout and one callback.""" + app = Dash(__name__, **kwargs) + app.layout = html.Div( + [ + html.Div(id="my-input"), + html.Div(id="my-output"), + ] + ) + + @app.callback(Output("my-output", "children"), Input("my-input", "children")) + def update_output(value): + """Test callback docstring.""" + return f"echo: {value}" + + return app + + +# --------------------------------------------------------------------------- +# Tests +# --------------------------------------------------------------------------- + + +def test_mcpe001_post_initialize_returns_protocol_version(): + app = _make_app() + client = app.server.test_client() + r = client.post( + f"/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} + ), + content_type="application/json", + ) + assert r.status_code == 200 + data = json.loads(r.data) + assert data["result"]["protocolVersion"] == LATEST_PROTOCOL_VERSION + + +def test_mcpe002_post_tools_list(): + app = _make_app() + client = app.server.test_client() + r = client.post( + f"/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "tools/list", "id": 1, "params": {}} + ), + content_type="application/json", + ) + assert r.status_code == 200 + data = json.loads(r.data) + assert "result" in data + assert "tools" in data["result"] + + +def test_mcpe003_notification_returns_202(): + app = _make_app() + client = app.server.test_client() + r = client.post( + f"/{MCP_PATH}", + data=json.dumps({"jsonrpc": "2.0", "method": "notifications/initialized"}), + content_type="application/json", + ) + assert r.status_code == 202 + + +def test_mcpe004_delete_returns_405(): + app = _make_app() + client = app.server.test_client() + r = client.delete(f"/{MCP_PATH}") + assert r.status_code == 405 + + +def test_mcpe005_get_returns_405(): + app = _make_app() + client = app.server.test_client() + r = client.get(f"/{MCP_PATH}") + assert r.status_code == 405 + + +def test_mcpe006_post_rejects_wrong_content_type(): + app = _make_app() + client = app.server.test_client() + r = client.post( + f"/{MCP_PATH}", + data="not json", + content_type="text/plain", + ) + assert r.status_code == 415 + + +def test_mcpe007_routes_not_registered_when_disabled(): + app = _make_app(enable_mcp=False) + client = app.server.test_client() + r = client.post( + f"/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} + ), + content_type="application/json", + ) + # With MCP disabled, the route doesn't exist — response is HTML, not JSON + assert r.content_type != "application/json" + + +def test_mcpe008_routes_respect_pathname_prefix(): + app = _make_app(routes_pathname_prefix="/app/") + client = app.server.test_client() + + ok = client.post( + f"/app/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} + ), + content_type="application/json", + ) + assert ok.status_code == 200 + + miss = client.post( + f"/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} + ), + content_type="application/json", + ) + assert miss.status_code == 404 + + +def test_mcpe009_enable_mcp_env_var_false(): + old = os.environ.get("DASH_MCP_ENABLED") + try: + os.environ["DASH_MCP_ENABLED"] = "false" + app = _make_app() + client = app.server.test_client() + r = client.post( + f"/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} + ), + content_type="application/json", + ) + assert r.content_type != "application/json" + finally: + if old is None: + os.environ.pop("DASH_MCP_ENABLED", None) + else: + os.environ["DASH_MCP_ENABLED"] = old + + +def test_mcpe010_constructor_overrides_env_var(): + old = os.environ.get("DASH_MCP_ENABLED") + try: + os.environ["DASH_MCP_ENABLED"] = "false" + app = _make_app(enable_mcp=True) + client = app.server.test_client() + r = client.post( + f"/{MCP_PATH}", + data=json.dumps( + {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} + ), + content_type="application/json", + ) + assert r.status_code == 200 + assert b"protocolVersion" in r.data + finally: + if old is None: + os.environ.pop("DASH_MCP_ENABLED", None) + else: + os.environ["DASH_MCP_ENABLED"] = old diff --git a/tests/integration/mcp/primitives/resources/test_resources.py b/tests/integration/mcp/test_mcp_resources.py similarity index 86% rename from tests/integration/mcp/primitives/resources/test_resources.py rename to tests/integration/mcp/test_mcp_resources.py index dfc1e09f9b..41519578d1 100644 --- a/tests/integration/mcp/primitives/resources/test_resources.py +++ b/tests/integration/mcp/test_mcp_resources.py @@ -1,4 +1,4 @@ -"""Integration tests for MCP resources.""" +"""MCP resources — ``resources/list`` and ``resources/read`` via HTTP.""" import json @@ -7,7 +7,7 @@ from tests.integration.mcp.conftest import _mcp_method -def test_resources_list_includes_layout(dash_duo): +def test_mcpz001_resources_list_includes_layout(dash_duo): app = Dash(__name__) app.layout = html.Div( [ @@ -24,7 +24,7 @@ def test_resources_list_includes_layout(dash_duo): assert "dash://layout" in uris -def test_read_layout_resource(dash_duo): +def test_mcpz002_read_layout_resource(dash_duo): app = Dash(__name__) app.layout = html.Div( [ diff --git a/tests/integration/mcp/test_server.py b/tests/integration/mcp/test_server.py deleted file mode 100644 index 4f0d0fca00..0000000000 --- a/tests/integration/mcp/test_server.py +++ /dev/null @@ -1,183 +0,0 @@ -"""Integration tests for the MCP Streamable HTTP endpoint. - -These tests use Flask's test_client to exercise the HTTP transport layer -(POST/GET/DELETE at /_mcp), session management, content-type handling, -and route registration/configuration. -""" - -import json -import os - -from dash import Dash, Input, Output, html -from mcp.types import LATEST_PROTOCOL_VERSION - -MCP_PATH = "_mcp" - - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - - -def _make_app(**kwargs): - """Create a minimal Dash app with a layout and one callback.""" - app = Dash(__name__, **kwargs) - app.layout = html.Div( - [ - html.Div(id="my-input"), - html.Div(id="my-output"), - ] - ) - - @app.callback(Output("my-output", "children"), Input("my-input", "children")) - def update_output(value): - """Test callback docstring.""" - return f"echo: {value}" - - return app - - -# --------------------------------------------------------------------------- -# Tests -# --------------------------------------------------------------------------- - - -class TestMCPEndpoint: - """Tests for the Streamable HTTP MCP endpoint at /_mcp.""" - - def test_post_initialize_returns_protocol_version(self): - app = _make_app() - client = app.server.test_client() - r = client.post( - f"/{MCP_PATH}", - data=json.dumps( - {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} - ), - content_type="application/json", - ) - assert r.status_code == 200 - data = json.loads(r.data) - assert data["result"]["protocolVersion"] == LATEST_PROTOCOL_VERSION - - def test_post_tools_list(self): - app = _make_app() - client = app.server.test_client() - r = client.post( - f"/{MCP_PATH}", - data=json.dumps( - {"jsonrpc": "2.0", "method": "tools/list", "id": 1, "params": {}} - ), - content_type="application/json", - ) - assert r.status_code == 200 - data = json.loads(r.data) - assert "result" in data - assert "tools" in data["result"] - - def test_notification_returns_202(self): - app = _make_app() - client = app.server.test_client() - r = client.post( - f"/{MCP_PATH}", - data=json.dumps({"jsonrpc": "2.0", "method": "notifications/initialized"}), - content_type="application/json", - ) - assert r.status_code == 202 - - def test_delete_returns_405(self): - app = _make_app() - client = app.server.test_client() - r = client.delete(f"/{MCP_PATH}") - assert r.status_code == 405 - - def test_get_returns_405(self): - app = _make_app() - client = app.server.test_client() - r = client.get(f"/{MCP_PATH}") - assert r.status_code == 405 - - def test_post_rejects_wrong_content_type(self): - app = _make_app() - client = app.server.test_client() - r = client.post( - f"/{MCP_PATH}", - data="not json", - content_type="text/plain", - ) - assert r.status_code == 415 - - def test_routes_not_registered_when_disabled(self): - app = _make_app(enable_mcp=False) - client = app.server.test_client() - r = client.post( - f"/{MCP_PATH}", - data=json.dumps( - {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} - ), - content_type="application/json", - ) - # With MCP disabled, the route doesn't exist — response is HTML, not JSON - assert r.content_type != "application/json" - - def test_routes_respect_pathname_prefix(self): - app = _make_app(routes_pathname_prefix="/app/") - client = app.server.test_client() - - ok = client.post( - f"/app/{MCP_PATH}", - data=json.dumps( - {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} - ), - content_type="application/json", - ) - assert ok.status_code == 200 - - miss = client.post( - f"/{MCP_PATH}", - data=json.dumps( - {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} - ), - content_type="application/json", - ) - assert miss.status_code == 404 - - def test_enable_mcp_env_var_false(self): - old = os.environ.get("DASH_MCP_ENABLED") - try: - os.environ["DASH_MCP_ENABLED"] = "false" - app = _make_app() - client = app.server.test_client() - r = client.post( - f"/{MCP_PATH}", - data=json.dumps( - {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} - ), - content_type="application/json", - ) - assert r.content_type != "application/json" - finally: - if old is None: - os.environ.pop("DASH_MCP_ENABLED", None) - else: - os.environ["DASH_MCP_ENABLED"] = old - - def test_constructor_overrides_env_var(self): - old = os.environ.get("DASH_MCP_ENABLED") - try: - os.environ["DASH_MCP_ENABLED"] = "false" - app = _make_app(enable_mcp=True) - client = app.server.test_client() - r = client.post( - f"/{MCP_PATH}", - data=json.dumps( - {"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}} - ), - content_type="application/json", - ) - assert r.status_code == 200 - assert b"protocolVersion" in r.data - finally: - if old is None: - os.environ.pop("DASH_MCP_ENABLED", None) - else: - os.environ["DASH_MCP_ENABLED"] = old diff --git a/tests/unit/mcp/test_mcp_server.py b/tests/unit/mcp/test_mcp_server.py new file mode 100644 index 0000000000..f4bb595dce --- /dev/null +++ b/tests/unit/mcp/test_mcp_server.py @@ -0,0 +1,99 @@ +"""MCP server JSON-RPC message processing (``_process_mcp_message``).""" + +from dash._get_app import app_context +from dash.mcp._server import _process_mcp_message +from mcp.types import LATEST_PROTOCOL_VERSION + +from tests.unit.mcp.conftest import _make_app, _setup_mcp + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def _msg(method, params=None, request_id=1): + d = {"jsonrpc": "2.0", "method": method, "id": request_id} + d["params"] = params if params is not None else {} + return d + + +def _mcp(app, method, params=None, request_id=1): + with app.server.test_request_context(): + _setup_mcp(app) + return _process_mcp_message(_msg(method, params, request_id)) + + +def _tools_list(app): + return _mcp(app, "tools/list")["result"]["tools"] + + +def _call_tool(app, tool_name, arguments=None, request_id=1): + return _mcp( + app, "tools/call", {"name": tool_name, "arguments": arguments or {}}, request_id + ) + + +def _call_tool_output( + app, tool_name, arguments=None, component_id=None, prop="children" +): + result = _call_tool(app, tool_name, arguments) + structured = result["result"]["structuredContent"] + response = structured["response"] + if component_id is None: + component_id = next(iter(response)) + return response[component_id][prop] + + +# --------------------------------------------------------------------------- +# Tests +# --------------------------------------------------------------------------- + + +def test_mcps001_initialize(): + app = _make_app() + result = _mcp(app, "initialize") + + assert result is not None + assert result["id"] == 1 + assert result["jsonrpc"] == "2.0" + assert result["result"]["protocolVersion"] == LATEST_PROTOCOL_VERSION + assert "serverInfo" in result["result"] + + +def test_mcps002_tools_call(): + app = _make_app() + tools = _tools_list(app) + tool_name = next(t["name"] for t in tools if "update_output" in t["name"]) + + result = _call_tool(app, tool_name, {"value": "hello"}, request_id=2) + + assert result is not None + assert result["id"] == 2 + assert _call_tool_output(app, tool_name, {"value": "hello"}) == "echo: hello" + + +def test_mcps003_tools_call_unknown_tool_returns_error(): + app = _make_app() + result = _call_tool(app, "nonexistent_tool") + + assert result is not None + assert "error" in result + assert result["error"]["code"] == -32601 + + +def test_mcps004_unknown_method_returns_error(): + app = _make_app() + result = _mcp(app, "unknown/method") + + assert result is not None + assert "error" in result + + +def test_mcps005_notification_returns_none(): + app = _make_app() + data = {"jsonrpc": "2.0", "method": "notifications/initialized"} + with app.server.test_request_context(): + app_context.set(app) + result = _process_mcp_message(data) + assert result is None diff --git a/tests/unit/mcp/test_server.py b/tests/unit/mcp/test_server.py deleted file mode 100644 index 23c99c50ad..0000000000 --- a/tests/unit/mcp/test_server.py +++ /dev/null @@ -1,86 +0,0 @@ -"""Tests for MCP server (_server.py) — JSON-RPC message processing.""" - -from dash._get_app import app_context -from dash.mcp._server import _process_mcp_message -from mcp.types import LATEST_PROTOCOL_VERSION - -from tests.unit.mcp.conftest import _make_app, _setup_mcp - - -def _msg(method, params=None, request_id=1): - d = {"jsonrpc": "2.0", "method": method, "id": request_id} - d["params"] = params if params is not None else {} - return d - - -def _mcp(app, method, params=None, request_id=1): - with app.server.test_request_context(): - _setup_mcp(app) - return _process_mcp_message(_msg(method, params, request_id)) - - -def _tools_list(app): - return _mcp(app, "tools/list")["result"]["tools"] - - -def _call_tool(app, tool_name, arguments=None, request_id=1): - return _mcp( - app, "tools/call", {"name": tool_name, "arguments": arguments or {}}, request_id - ) - - -def _call_tool_output( - app, tool_name, arguments=None, component_id=None, prop="children" -): - result = _call_tool(app, tool_name, arguments) - structured = result["result"]["structuredContent"] - response = structured["response"] - if component_id is None: - component_id = next(iter(response)) - return response[component_id][prop] - - -class TestProcessMCPMessage: - def test_initialize(self): - app = _make_app() - result = _mcp(app, "initialize") - - assert result is not None - assert result["id"] == 1 - assert result["jsonrpc"] == "2.0" - assert result["result"]["protocolVersion"] == LATEST_PROTOCOL_VERSION - assert "serverInfo" in result["result"] - - def test_tools_call(self): - app = _make_app() - tools = _tools_list(app) - tool_name = next(t["name"] for t in tools if "update_output" in t["name"]) - - result = _call_tool(app, tool_name, {"value": "hello"}, request_id=2) - - assert result is not None - assert result["id"] == 2 - assert _call_tool_output(app, tool_name, {"value": "hello"}) == "echo: hello" - - def test_tools_call_unknown_tool_returns_error(self): - app = _make_app() - result = _call_tool(app, "nonexistent_tool") - - assert result is not None - assert "error" in result - assert result["error"]["code"] == -32601 - - def test_unknown_method_returns_error(self): - app = _make_app() - result = _mcp(app, "unknown/method") - - assert result is not None - assert "error" in result - - def test_notification_returns_none(self): - app = _make_app() - data = {"jsonrpc": "2.0", "method": "notifications/initialized"} - with app.server.test_request_context(): - app_context.set(app) - result = _process_mcp_message(data) - assert result is None diff --git a/tests/unit/mcp/tools/test_mcp_run_callback.py b/tests/unit/mcp/tools/test_mcp_run_callback.py new file mode 100644 index 0000000000..e345b9682e --- /dev/null +++ b/tests/unit/mcp/tools/test_mcp_run_callback.py @@ -0,0 +1,253 @@ +"""Callback dispatch execution via MCP tools (``run_callback``). + +Exercises how the MCP tool pipeline runs a Dash callback through +``_process_mcp_message`` with various signatures: multi-output, State, +positional vs. dict-based ``inputs``, ``PreventUpdate``, and no-output +set_props-style callbacks. +""" + +from dash import Dash, Input, Output, State, dcc, html, set_props +from dash.exceptions import PreventUpdate +from dash.mcp._server import _process_mcp_message + +from tests.unit.mcp.conftest import _setup_mcp + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def _msg(method, params=None, request_id=1): + d = {"jsonrpc": "2.0", "method": method, "id": request_id} + d["params"] = params if params is not None else {} + return d + + +def _mcp(app, method, params=None, request_id=1): + with app.server.test_request_context(): + _setup_mcp(app) + return _process_mcp_message(_msg(method, params, request_id)) + + +def _tools_list(app): + return _mcp(app, "tools/list")["result"]["tools"] + + +def _call_tool_structured(app, tool_name, arguments=None): + result = _mcp(app, "tools/call", {"name": tool_name, "arguments": arguments or {}}) + return result["result"]["structuredContent"] + + +def _call_tool_output( + app, tool_name, arguments=None, component_id=None, prop="children" +): + structured = _call_tool_structured(app, tool_name, arguments) + response = structured["response"] + if component_id is None: + component_id = next(iter(response)) + return response[component_id][prop] + + +# --------------------------------------------------------------------------- +# Tests +# --------------------------------------------------------------------------- + + +def test_mcpx001_multi_output(): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="dd", options=["a", "b"], value="a"), + dcc.Dropdown(id="dd2"), + html.Div(id="out"), + ] + ) + + @app.callback( + Output("dd2", "options"), + Output("out", "children"), + Input("dd", "value"), + ) + def update(val): + return [{"label": val, "value": val}], f"selected: {val}" + + tools = _tools_list(app) + tool_name = next(t["name"] for t in tools if "update" in t["name"]) + structured = _call_tool_structured(app, tool_name, {"val": "b"}) + assert structured["response"]["dd2"]["options"] == [{"label": "b", "value": "b"}] + assert structured["response"]["out"]["children"] == "selected: b" + + +def test_mcpx002_omitted_kwargs_default_to_none(): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Dropdown(id="dd", options=["a"]), + dcc.Input(id="inp"), + html.Div(id="out"), + ] + ) + + @app.callback( + Output("out", "children"), + Input("dd", "value"), + State("inp", "value"), + ) + def update(selected, text): + return f"{selected}-{text}" + + tools = _tools_list(app) + tool_name = next(t["name"] for t in tools if "update" in t["name"]) + assert _call_tool_output(app, tool_name, {"selected": "a"}, "out") == "a-None" + + +def test_mcpx003_no_output_callback(): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Button(id="btn"), + html.Div(id="display"), + ] + ) + + @app.callback(Input("btn", "n_clicks")) + def server_cb(n): + set_props("display", {"children": f"Clicked {n} times"}) + + tools = _tools_list(app) + tool_names = [t["name"] for t in tools] + assert "server_cb" in tool_names + + +def test_mcpx004_prevent_update(): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="inp", value="hello"), + html.Div(id="out"), + ] + ) + + @app.callback(Output("out", "children"), Input("inp", "value")) + def update(val): + if val == "block": + raise PreventUpdate + return f"got: {val}" + + tools = _tools_list(app) + tool_name = next(t["name"] for t in tools if "update" in t["name"]) + assert _call_tool_output(app, tool_name, {"val": "test"}, "out") == "got: test" + + +def test_mcpx005_with_state(): + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id="trigger"), + html.Div(id="store"), + html.Div(id="result"), + ] + ) + + @app.callback( + Output("result", "children"), + Input("trigger", "children"), + State("store", "children"), + ) + def with_state(trigger, store): + return f"{trigger}-{store}" + + tools = _tools_list(app) + tool_name = next(t["name"] for t in tools if "with_state" in t["name"]) + assert ( + _call_tool_output( + app, + tool_name, + {"trigger": "click", "store": "data"}, + "result", + ) + == "click-data" + ) + + +def test_mcpx006_dict_inputs(): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="x-input", value="hello"), + dcc.Input(id="y-input", value="world"), + html.Div(id="dict-out"), + ] + ) + + @app.callback( + Output("dict-out", "children"), + inputs={ + "x_val": Input("x-input", "value"), + "y_val": Input("y-input", "value"), + }, + ) + def combine(**kwargs): + return f"{kwargs['x_val']}-{kwargs['y_val']}" + + tools = _tools_list(app) + tool_name = next(t["name"] for t in tools if "combine" in t["name"]) + assert ( + _call_tool_output( + app, + tool_name, + {"x_val": "foo", "y_val": "bar"}, + "dict-out", + ) + == "foo-bar" + ) + + +def test_mcpx007_positional_inputs(): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="a-input", value="A"), + html.Div(id="pos-out"), + ] + ) + + @app.callback(Output("pos-out", "children"), Input("a-input", "value")) + def echo(val): + return f"got:{val}" + + tools = _tools_list(app) + tool_name = next(t["name"] for t in tools if "echo" in t["name"]) + assert _call_tool_output(app, tool_name, {"val": "test"}, "pos-out") == "got:test" + + +def test_mcpx008_dict_inputs_with_state(): + app = Dash(__name__) + app.layout = html.Div( + [ + dcc.Input(id="inp", value="hi"), + html.Div(id="st", children="state-val"), + html.Div(id="ds-out"), + ] + ) + + @app.callback( + Output("ds-out", "children"), + inputs={"trigger": Input("inp", "value")}, + state={"kept": State("st", "children")}, + ) + def with_dict_state(**kwargs): + return f"{kwargs['trigger']}+{kwargs['kept']}" + + tools = _tools_list(app) + tool_name = next(t["name"] for t in tools if "with_dict_state" in t["name"]) + assert ( + _call_tool_output( + app, + tool_name, + {"trigger": "hey", "kept": "saved"}, + "ds-out", + ) + == "hey+saved" + ) diff --git a/tests/unit/mcp/tools/test_run_callback.py b/tests/unit/mcp/tools/test_run_callback.py deleted file mode 100644 index 00f4e5b7b1..0000000000 --- a/tests/unit/mcp/tools/test_run_callback.py +++ /dev/null @@ -1,246 +0,0 @@ -"""Tests for callback dispatch execution via MCP tools.""" - -from dash import Dash, Input, Output, State, dcc, html -from dash.exceptions import PreventUpdate -from dash.mcp._server import _process_mcp_message - -from tests.unit.mcp.conftest import _setup_mcp - - -def _msg(method, params=None, request_id=1): - d = {"jsonrpc": "2.0", "method": method, "id": request_id} - d["params"] = params if params is not None else {} - return d - - -def _mcp(app, method, params=None, request_id=1): - with app.server.test_request_context(): - _setup_mcp(app) - return _process_mcp_message(_msg(method, params, request_id)) - - -def _tools_list(app): - return _mcp(app, "tools/list")["result"]["tools"] - - -def _call_tool_structured(app, tool_name, arguments=None): - result = _mcp(app, "tools/call", {"name": tool_name, "arguments": arguments or {}}) - return result["result"]["structuredContent"] - - -def _call_tool_output( - app, tool_name, arguments=None, component_id=None, prop="children" -): - structured = _call_tool_structured(app, tool_name, arguments) - response = structured["response"] - if component_id is None: - component_id = next(iter(response)) - return response[component_id][prop] - - -class TestRunCallback: - def test_multi_output(self): - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Dropdown(id="dd", options=["a", "b"], value="a"), - dcc.Dropdown(id="dd2"), - html.Div(id="out"), - ] - ) - - @app.callback( - Output("dd2", "options"), - Output("out", "children"), - Input("dd", "value"), - ) - def update(val): - return [{"label": val, "value": val}], f"selected: {val}" - - tools = _tools_list(app) - tool_name = next(t["name"] for t in tools if "update" in t["name"]) - structured = _call_tool_structured(app, tool_name, {"val": "b"}) - assert structured["response"]["dd2"]["options"] == [ - {"label": "b", "value": "b"} - ] - assert structured["response"]["out"]["children"] == "selected: b" - - def test_omitted_kwargs_default_to_none(self): - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Dropdown(id="dd", options=["a"]), - dcc.Input(id="inp"), - html.Div(id="out"), - ] - ) - - @app.callback( - Output("out", "children"), - Input("dd", "value"), - State("inp", "value"), - ) - def update(selected, text): - return f"{selected}-{text}" - - tools = _tools_list(app) - tool_name = next(t["name"] for t in tools if "update" in t["name"]) - assert _call_tool_output(app, tool_name, {"selected": "a"}, "out") == "a-None" - - def test_no_output_callback(self): - app = Dash(__name__) - app.layout = html.Div( - [ - html.Button(id="btn"), - html.Div(id="display"), - ] - ) - - @app.callback(Input("btn", "n_clicks")) - def server_cb(n): - from dash import set_props - - set_props("display", {"children": f"Clicked {n} times"}) - - tools = _tools_list(app) - tool_names = [t["name"] for t in tools] - assert "server_cb" in tool_names - - def test_prevent_update(self): - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Input(id="inp", value="hello"), - html.Div(id="out"), - ] - ) - - @app.callback(Output("out", "children"), Input("inp", "value")) - def update(val): - if val == "block": - raise PreventUpdate - return f"got: {val}" - - tools = _tools_list(app) - tool_name = next(t["name"] for t in tools if "update" in t["name"]) - assert _call_tool_output(app, tool_name, {"val": "test"}, "out") == "got: test" - - def test_with_state(self): - app = Dash(__name__) - app.layout = html.Div( - [ - html.Div(id="trigger"), - html.Div(id="store"), - html.Div(id="result"), - ] - ) - - @app.callback( - Output("result", "children"), - Input("trigger", "children"), - State("store", "children"), - ) - def with_state(trigger, store): - return f"{trigger}-{store}" - - tools = _tools_list(app) - tool_name = next(t["name"] for t in tools if "with_state" in t["name"]) - assert ( - _call_tool_output( - app, - tool_name, - { - "trigger": "click", - "store": "data", - }, - "result", - ) - == "click-data" - ) - - def test_dict_inputs(self): - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Input(id="x-input", value="hello"), - dcc.Input(id="y-input", value="world"), - html.Div(id="dict-out"), - ] - ) - - @app.callback( - Output("dict-out", "children"), - inputs={ - "x_val": Input("x-input", "value"), - "y_val": Input("y-input", "value"), - }, - ) - def combine(**kwargs): - return f"{kwargs['x_val']}-{kwargs['y_val']}" - - tools = _tools_list(app) - tool_name = next(t["name"] for t in tools if "combine" in t["name"]) - assert ( - _call_tool_output( - app, - tool_name, - { - "x_val": "foo", - "y_val": "bar", - }, - "dict-out", - ) - == "foo-bar" - ) - - def test_positional_inputs(self): - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Input(id="a-input", value="A"), - html.Div(id="pos-out"), - ] - ) - - @app.callback(Output("pos-out", "children"), Input("a-input", "value")) - def echo(val): - return f"got:{val}" - - tools = _tools_list(app) - tool_name = next(t["name"] for t in tools if "echo" in t["name"]) - assert ( - _call_tool_output(app, tool_name, {"val": "test"}, "pos-out") == "got:test" - ) - - def test_dict_inputs_with_state(self): - app = Dash(__name__) - app.layout = html.Div( - [ - dcc.Input(id="inp", value="hi"), - html.Div(id="st", children="state-val"), - html.Div(id="ds-out"), - ] - ) - - @app.callback( - Output("ds-out", "children"), - inputs={"trigger": Input("inp", "value")}, - state={"kept": State("st", "children")}, - ) - def with_dict_state(**kwargs): - return f"{kwargs['trigger']}+{kwargs['kept']}" - - tools = _tools_list(app) - tool_name = next(t["name"] for t in tools if "with_dict_state" in t["name"]) - assert ( - _call_tool_output( - app, - tool_name, - { - "trigger": "hey", - "kept": "saved", - }, - "ds-out", - ) - == "hey+saved" - ) From 8c7d7208003aa9a0078ec764b0ad8e54ee420044 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Mon, 4 May 2026 16:02:31 -0600 Subject: [PATCH 061/103] Add decorator to make any function mcp-enabled --- dash/dash.py | 1 + dash/mcp/__init__.py | 2 + dash/mcp/_decorator.py | 51 ++++++ dash/mcp/_server.py | 5 + dash/mcp/primitives/tools/__init__.py | 2 + .../tools/tool_decorated_mcp_functions.py | 148 +++++++++++++++ .../test_tool_decorated_mcp_functions.py | 160 +++++++++++++++++ tests/unit/mcp/conftest.py | 10 +- .../mcp/tools/test_mcp_enabled_decorator.py | 170 ++++++++++++++++++ 9 files changed, 547 insertions(+), 2 deletions(-) create mode 100644 dash/mcp/_decorator.py create mode 100644 dash/mcp/primitives/tools/tool_decorated_mcp_functions.py create mode 100644 tests/integration/mcp/primitives/tools/test_tool_decorated_mcp_functions.py create mode 100644 tests/unit/mcp/tools/test_mcp_enabled_decorator.py diff --git a/dash/dash.py b/dash/dash.py index c34dca722b..37eb7a1ffb 100644 --- a/dash/dash.py +++ b/dash/dash.py @@ -615,6 +615,7 @@ def __init__( # pylint: disable=too-many-statements, too-many-branches # same deps as a list to catch duplicate outputs, and to send to the front end self._callback_list: list = [] self.callback_api_paths: dict = {} + self.mcp_decorated_functions: dict = {} # list of inline scripts self._inline_scripts: list = [] diff --git a/dash/mcp/__init__.py b/dash/mcp/__init__.py index 2bc4757f13..2e6edffdb2 100644 --- a/dash/mcp/__init__.py +++ b/dash/mcp/__init__.py @@ -1,7 +1,9 @@ """Dash MCP (Model Context Protocol) server integration.""" +from dash.mcp._decorator import mcp_enabled from dash.mcp._server import enable_mcp_server __all__ = [ "enable_mcp_server", + "mcp_enabled", ] diff --git a/dash/mcp/_decorator.py b/dash/mcp/_decorator.py new file mode 100644 index 0000000000..1b85316207 --- /dev/null +++ b/dash/mcp/_decorator.py @@ -0,0 +1,51 @@ +"""Decorator to expose plain Python functions as MCP tools.""" + +from __future__ import annotations + +import functools +from typing import Any, Callable, Optional + +from typing_extensions import TypedDict + + +class MCPToolRegistration(TypedDict): + fn: Callable[..., Any] + expose_docstring: Optional[bool] + + +MCP_DECORATED_FUNCTIONS: dict[str, MCPToolRegistration] = {} + + +def mcp_enabled( + func: Callable[..., Any] | None = None, + *, + name: str | None = None, + expose_docstring: Optional[bool] = None, +) -> Callable[..., Any]: + """Mark a function as an MCP tool. + + Supports both bare and parameterised usage:: + + @mcp_enabled + def my_tool(x: int) -> str: ... + + @mcp_enabled(name="custom_name", expose_docstring=True) + def my_tool(x: int) -> str: ... + """ + + def _wrap(fn: Callable[..., Any]) -> Callable[..., Any]: + tool_name = name if name else fn.__name__ + MCP_DECORATED_FUNCTIONS[tool_name] = MCPToolRegistration( + fn=fn, + expose_docstring=expose_docstring, + ) + + @functools.wraps(fn) + def wrapper(*args: Any, **kwargs: Any) -> Any: + return fn(*args, **kwargs) + + return wrapper + + if func is not None: + return _wrap(func) + return _wrap diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py index 07b35cd373..64323c09af 100644 --- a/dash/mcp/_server.py +++ b/dash/mcp/_server.py @@ -25,6 +25,7 @@ from dash import get_app from dash._get_app import with_app_context_factory +from dash.mcp._decorator import MCP_DECORATED_FUNCTIONS from dash.mcp.primitives import ( call_tool, list_resource_templates, @@ -46,6 +47,10 @@ def enable_mcp_server(app: Dash, mcp_path: str) -> None: """Add MCP routes to a Dash/Flask app.""" + + app.mcp_decorated_functions = dict(MCP_DECORATED_FUNCTIONS) + MCP_DECORATED_FUNCTIONS.clear() + # -- Streamable HTTP endpoint -------------------------------------------- def mcp_handler() -> Response: diff --git a/dash/mcp/primitives/tools/__init__.py b/dash/mcp/primitives/tools/__init__.py index 7fa1f4aefb..b8f12a1dbd 100644 --- a/dash/mcp/primitives/tools/__init__.py +++ b/dash/mcp/primitives/tools/__init__.py @@ -9,12 +9,14 @@ from dash.mcp.types import ToolNotFoundError from .base import MCPToolProvider +from .tool_decorated_mcp_functions import DecoratedFunctionTools from .tool_get_dash_component import GetDashComponentTool from .tools_callbacks import CallbackTools _TOOL_PROVIDERS: list[type[MCPToolProvider]] = [ CallbackTools, GetDashComponentTool, + DecoratedFunctionTools, ] diff --git a/dash/mcp/primitives/tools/tool_decorated_mcp_functions.py b/dash/mcp/primitives/tools/tool_decorated_mcp_functions.py new file mode 100644 index 0000000000..c135455c88 --- /dev/null +++ b/dash/mcp/primitives/tools/tool_decorated_mcp_functions.py @@ -0,0 +1,148 @@ +"""MCP tools backed by ``@mcp_enabled``-decorated functions.""" + +from __future__ import annotations + +import inspect +import json +import typing +from typing import Any, Callable + +from mcp.types import CallToolResult, TextContent, Tool + +from dash import get_app +from dash.mcp._decorator import MCPToolRegistration +from dash.mcp.primitives.tools.input_schemas import get_input_schema +from dash.mcp.primitives.tools.input_schemas.schema_callback_type_annotations import ( + annotation_to_json_schema, +) +from dash.mcp.types import MCPInput, is_nullable + +from .base import MCPToolProvider + + +def _build_inputs(fn: Callable[..., Any]) -> list[MCPInput]: + """Build an ``MCPInput`` from each of the function's arguments.""" + try: + hints = typing.get_type_hints(fn) + except Exception: # pylint: disable=broad-exception-caught + hints = getattr(fn, "__annotations__", {}) + + sig = inspect.signature(fn) + inputs: list[MCPInput] = [] + + for name, param in sig.parameters.items(): + annotation = hints.get(name) + + has_default = param.default is not inspect.Parameter.empty + required = not has_default and ( + annotation is None or not is_nullable(annotation) + ) + + inputs.append( + MCPInput( + name=name, + id_and_prop="", + component_id="", + property="", + annotation=annotation, + component_type=None, + component=None, + required=required, + initial_value=param.default if has_default else None, + upstream_output=None, + ) + ) + return inputs + + +def _build_output_schema(fn: Callable[..., Any]) -> dict[str, Any]: + """Build a JSON Schema ``outputSchema`` from the return annotation. + + The schema wraps the return type in ``{"result": }`` to match + the object that ``call_tool`` returns as ``structuredContent``. + """ + try: + hints = typing.get_type_hints(fn) + except Exception: # pylint: disable=broad-exception-caught + hints = getattr(fn, "__annotations__", {}) + + ret = hints.get("return") + if ret is None: + return {} + + inner = annotation_to_json_schema(ret) + if inner is None: + return {} + + return { + "type": "object", + "properties": {"result": inner}, + "required": ["result"], + } + + +def _build_tool(tool_name: str, reg: MCPToolRegistration) -> Tool: + fn = reg["fn"] + inputs = _build_inputs(fn) + properties = {p["name"]: get_input_schema(p) for p in inputs} + required = [p["name"] for p in inputs if p["required"]] + + input_schema: dict[str, Any] = {"type": "object", "properties": properties} + if required: + input_schema["required"] = required + + expose_docstring = reg["expose_docstring"] + if expose_docstring is None: + expose_docstring = get_app().config.get("mcp_expose_docstrings", False) + + description = "MCP tool" + if expose_docstring: + docstring = getattr(fn, "__doc__", None) + if docstring: + description = docstring.strip() + + return Tool( + name=tool_name, + description=description, + inputSchema=input_schema, + outputSchema=_build_output_schema(fn), + ) + + +class DecoratedFunctionTools(MCPToolProvider): + """Exposes ``@mcp_enabled``-decorated functions as MCP tools.""" + + @classmethod + def _registry(cls) -> dict[str, MCPToolRegistration]: + return get_app().mcp_decorated_functions + + @classmethod + def get_tool_names(cls) -> set[str]: + return set(cls._registry().keys()) + + @classmethod + def list_tools(cls) -> list[Tool]: + return [_build_tool(name, reg) for name, reg in cls._registry().items()] + + @classmethod + def call_tool(cls, tool_name: str, arguments: dict[str, Any]) -> CallToolResult: + reg = cls._registry().get(tool_name) + if reg is None: + return CallToolResult( + content=[TextContent(type="text", text=f"Tool not found: {tool_name}")], + isError=True, + ) + fn = reg["fn"] + try: + result = fn(**arguments) + except Exception as exc: # pylint: disable=broad-exception-caught + return CallToolResult( + content=[TextContent(type="text", text=f"{type(exc).__name__}: {exc}")], + isError=True, + ) + + serialized = json.dumps(result, default=str) + return CallToolResult( + content=[TextContent(type="text", text=serialized)], + structuredContent={"result": result}, + ) diff --git a/tests/integration/mcp/primitives/tools/test_tool_decorated_mcp_functions.py b/tests/integration/mcp/primitives/tools/test_tool_decorated_mcp_functions.py new file mode 100644 index 0000000000..afbaf415a8 --- /dev/null +++ b/tests/integration/mcp/primitives/tools/test_tool_decorated_mcp_functions.py @@ -0,0 +1,160 @@ +"""Integration tests for @mcp_enabled decorated function tools.""" + +import json +from typing import Optional + +from dash import Dash, html +from dash.mcp import mcp_enabled + +from tests.integration.mcp.conftest import _mcp_call_tool, _mcp_tools + +BUILTINS = {"get_dash_component"} + + +def test_mcpd001_bare_decorator_appears_as_tool(dash_duo): + @mcp_enabled + def add_numbers(a: int, b: int) -> int: + """Add two numbers together.""" + return a + b + + app = Dash(__name__) + app.layout = html.Div(id="root") + dash_duo.start_server(app) + + tools = _mcp_tools(dash_duo.server.url) + names = [t["name"] for t in tools] + assert "add_numbers" in names + + tool = next(t for t in tools if t["name"] == "add_numbers") + assert "Add two numbers" not in tool["description"] + + +def test_mcpd002_expose_docstring(dash_duo): + @mcp_enabled(expose_docstring=True) + def add_numbers(a: int, b: int) -> int: + """Add two numbers together.""" + return a + b + + app = Dash(__name__) + app.layout = html.Div(id="root") + dash_duo.start_server(app) + + tool = next( + t for t in _mcp_tools(dash_duo.server.url) if t["name"] == "add_numbers" + ) + assert "Add two numbers together" in tool["description"] + + +def test_mcpd003_custom_name_overrides_function_name(dash_duo): + @mcp_enabled(name="sum_values") + def add_numbers(a: int, b: int) -> int: + """Add two numbers together.""" + return a + b + + app = Dash(__name__) + app.layout = html.Div(id="root") + dash_duo.start_server(app) + + tools = _mcp_tools(dash_duo.server.url) + names = [t["name"] for t in tools] + assert "sum_values" in names + assert "add_numbers" not in names + + +def test_mcpd004_typed_params_produce_schema(dash_duo): + @mcp_enabled + def greet(name: str, times: int) -> str: + """Greet someone.""" + return name * times + + app = Dash(__name__) + app.layout = html.Div(id="root") + dash_duo.start_server(app) + + tool = next(t for t in _mcp_tools(dash_duo.server.url) if t["name"] == "greet") + schema = tool["inputSchema"] + assert schema["type"] == "object" + assert schema["properties"]["name"]["type"] == "string" + assert schema["properties"]["times"]["type"] == "integer" + assert set(schema["required"]) == {"name", "times"} + + +def test_mcpd005_optional_param_not_required(dash_duo): + @mcp_enabled + def search(query: str, limit: Optional[int] = None) -> str: + """Search for things.""" + return query + + app = Dash(__name__) + app.layout = html.Div(id="root") + dash_duo.start_server(app) + + tool = next(t for t in _mcp_tools(dash_duo.server.url) if t["name"] == "search") + schema = tool["inputSchema"] + assert "query" in schema["required"] + assert "limit" not in schema["required"] + + +def test_mcpd006_return_annotation_becomes_output_schema(dash_duo): + @mcp_enabled + def compute(x: int) -> str: + """Compute something.""" + return str(x) + + app = Dash(__name__) + app.layout = html.Div(id="root") + dash_duo.start_server(app) + + tool = next(t for t in _mcp_tools(dash_duo.server.url) if t["name"] == "compute") + assert tool["outputSchema"]["type"] == "object" + assert tool["outputSchema"]["properties"]["result"]["type"] == "string" + + +def test_mcpd007_call_returns_result(dash_duo): + @mcp_enabled + def multiply(a: int, b: int) -> int: + """Multiply two numbers.""" + return a * b + + app = Dash(__name__) + app.layout = html.Div(id="root") + dash_duo.start_server(app) + + resp = _mcp_call_tool(dash_duo.server.url, "multiply", {"a": 3, "b": 7}) + result = resp["result"] + assert result["isError"] is not True + text = result["content"][0]["text"] + assert json.loads(text) == 21 + + +def test_mcpd008_call_with_custom_name(dash_duo): + @mcp_enabled(name="product") + def multiply(a: int, b: int) -> int: + """Multiply two numbers.""" + return a * b + + app = Dash(__name__) + app.layout = html.Div(id="root") + dash_duo.start_server(app) + + resp = _mcp_call_tool(dash_duo.server.url, "product", {"a": 4, "b": 5}) + result = resp["result"] + assert result["isError"] is not True + text = result["content"][0]["text"] + assert json.loads(text) == 20 + + +def test_mcpd009_call_error_returns_is_error(dash_duo): + @mcp_enabled + def fail_hard(x: int) -> str: + """Always fails.""" + raise ValueError("boom") + + app = Dash(__name__) + app.layout = html.Div(id="root") + dash_duo.start_server(app) + + resp = _mcp_call_tool(dash_duo.server.url, "fail_hard", {"x": 1}) + result = resp["result"] + assert result["isError"] is True + assert "boom" in result["content"][0]["text"] diff --git a/tests/unit/mcp/conftest.py b/tests/unit/mcp/conftest.py index 2f7fbc1898..a3ddd191aa 100644 --- a/tests/unit/mcp/conftest.py +++ b/tests/unit/mcp/conftest.py @@ -9,10 +9,13 @@ if sys.version_info < (3, 10): collect_ignore_glob.append("*") else: - from dash.mcp.primitives.tools import ( + from dash.mcp._decorator import ( # pylint: disable=wrong-import-position + MCP_DECORATED_FUNCTIONS, + ) + from dash.mcp.primitives.tools import ( # pylint: disable=wrong-import-position call_tool, list_tools, - ) # pylint: disable=wrong-import-position + ) from dash.mcp.primitives.tools.callback_adapter_collection import ( # pylint: disable=wrong-import-position CallbackAdapterCollection, ) @@ -23,6 +26,9 @@ def _setup_mcp(app): """Set up MCP for an app in tests.""" app_context.set(app) + if MCP_DECORATED_FUNCTIONS: + app.mcp_decorated_functions = dict(MCP_DECORATED_FUNCTIONS) + MCP_DECORATED_FUNCTIONS.clear() app.mcp_callback_map = CallbackAdapterCollection(app) return app diff --git a/tests/unit/mcp/tools/test_mcp_enabled_decorator.py b/tests/unit/mcp/tools/test_mcp_enabled_decorator.py new file mode 100644 index 0000000000..c033205f5d --- /dev/null +++ b/tests/unit/mcp/tools/test_mcp_enabled_decorator.py @@ -0,0 +1,170 @@ +"""Unit tests for the @mcp_enabled decorator and its tool integration.""" + +from typing import Optional + +from dash import Dash, html +from dash.mcp import mcp_enabled + +from tests.unit.mcp.conftest import _setup_mcp, _tools_list, _call_tool + +BUILTINS = {"get_dash_component"} + + +def _make_app_with_decorated(): + app = Dash(__name__) + app.layout = html.Div(id="root") + return _setup_mcp(app) + + +def _user_tools(app): + return [t for t in _tools_list(app) if t.name not in BUILTINS] + + +def test_mcpd001_bare_decorator_preserves_function(): + @mcp_enabled + def double(x: int) -> int: + return x * 2 + + assert double(5) == 10 + + +def test_mcpd002_parameterised_decorator_preserves_function(): + @mcp_enabled(name="doubler") + def double(x: int) -> int: + return x * 2 + + assert double(5) == 10 + + +def test_mcpd003_bare_decorator_appears_as_tool(): + @mcp_enabled + def add_numbers(a: int, b: int) -> int: + """Add two numbers together.""" + return a + b + + app = _make_app_with_decorated() + names = {t.name for t in _user_tools(app)} + assert "add_numbers" in names + + +def test_mcpd004_custom_name_overrides_function_name(): + @mcp_enabled(name="sum_values") + def add_numbers(a: int, b: int) -> int: + """Add two numbers together.""" + return a + b + + app = _make_app_with_decorated() + names = {t.name for t in _user_tools(app)} + assert "sum_values" in names + assert "add_numbers" not in names + + +def test_mcpd005_docstring_hidden_by_default(): + @mcp_enabled + def add_numbers(a: int, b: int) -> int: + """Add two numbers together.""" + return a + b + + app = _make_app_with_decorated() + tool = next(t for t in _user_tools(app) if t.name == "add_numbers") + assert "Add two numbers" not in tool.description + + +def test_mcpd006_docstring_exposed_when_opted_in(): + @mcp_enabled(expose_docstring=True) + def add_numbers(a: int, b: int) -> int: + """Add two numbers together.""" + return a + b + + app = _make_app_with_decorated() + tool = next(t for t in _user_tools(app) if t.name == "add_numbers") + assert "Add two numbers together" in tool.description + + +def test_mcpd007_typed_params_produce_schema(): + @mcp_enabled + def greet(name: str, times: int) -> str: + """Greet someone.""" + return name * times + + app = _make_app_with_decorated() + tool = next(t for t in _user_tools(app) if t.name == "greet") + schema = tool.inputSchema + assert schema["type"] == "object" + assert schema["properties"]["name"]["type"] == "string" + assert schema["properties"]["times"]["type"] == "integer" + assert set(schema["required"]) == {"name", "times"} + + +def test_mcpd008_optional_param_not_required(): + @mcp_enabled + def search(query: str, limit: Optional[int] = None) -> str: + """Search for things.""" + return query + + app = _make_app_with_decorated() + tool = next(t for t in _user_tools(app) if t.name == "search") + schema = tool.inputSchema + assert "query" in schema["required"] + assert "limit" not in schema["required"] + + +def test_mcpd009_typed_param_with_default_not_required(): + @mcp_enabled + def filter_range(min_val: float = -180.0, max_val: float = 180.0) -> list[str]: + """Filter by range.""" + return [] + + app = _make_app_with_decorated() + tool = next(t for t in _user_tools(app) if t.name == "filter_range") + schema = tool.inputSchema + assert "required" not in schema or "min_val" not in schema.get("required", []) + assert "required" not in schema or "max_val" not in schema.get("required", []) + + +def test_mcpd010_return_annotation_becomes_output_schema(): + @mcp_enabled + def compute(x: int) -> str: + """Compute something.""" + return str(x) + + app = _make_app_with_decorated() + tool = next(t for t in _user_tools(app) if t.name == "compute") + assert tool.outputSchema["type"] == "object" + assert tool.outputSchema["properties"]["result"]["type"] == "string" + + +def test_mcpd011_call_returns_result(): + @mcp_enabled + def multiply(a: int, b: int) -> int: + """Multiply two numbers.""" + return a * b + + app = _make_app_with_decorated() + result = _call_tool(app, "multiply", {"a": 3, "b": 7}) + assert result.isError is not True + assert result.structuredContent["result"] == 21 + + +def test_mcpd012_call_with_custom_name(): + @mcp_enabled(name="product") + def multiply(a: int, b: int) -> int: + """Multiply two numbers.""" + return a * b + + app = _make_app_with_decorated() + result = _call_tool(app, "product", {"a": 4, "b": 5}) + assert result.isError is not True + assert result.structuredContent["result"] == 20 + + +def test_mcpd013_call_error_returns_is_error(): + @mcp_enabled + def fail_hard(x: int) -> str: + """Always fails.""" + raise ValueError("boom") + + app = _make_app_with_decorated() + result = _call_tool(app, "fail_hard", {"x": 1}) + assert result.isError is True + assert "boom" in result.content[0].text From 4f7329ca865aa7c5c5df6f533380d388bae3dde3 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Fri, 8 May 2026 15:24:29 -0600 Subject: [PATCH 062/103] Notify connected agents of server restarts and hot-reloads so they can reload --- dash/mcp/_server.py | 86 ++++++++- .../tools/results/result_dataframe.py | 2 +- tests/integration/mcp/test_mcp_session.py | 128 ++++++++++++++ tests/unit/mcp/test_mcp_session.py | 164 ++++++++++++++++++ 4 files changed, 372 insertions(+), 8 deletions(-) create mode 100644 tests/integration/mcp/test_mcp_session.py create mode 100644 tests/unit/mcp/test_mcp_session.py diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py index 64323c09af..f7632b134b 100644 --- a/dash/mcp/_server.py +++ b/dash/mcp/_server.py @@ -8,6 +8,7 @@ import json import logging +import uuid from typing import TYPE_CHECKING, Any from flask import Response, request @@ -51,6 +52,24 @@ def enable_mcp_server(app: Dash, mcp_path: str) -> None: app.mcp_decorated_functions = dict(MCP_DECORATED_FUNCTIONS) MCP_DECORATED_FUNCTIONS.clear() + _session_id: str | None = None + + def _get_or_create_session_id() -> str: + """Read the hot-reload hash or generate a stable fallback.""" + # pylint: disable=protected-access + reload_hash = app._hot_reload.hash + return reload_hash if reload_hash is not None else uuid.uuid4().hex + + def _is_session_stale(client_session_id: str | None) -> bool: + """True when the client's session doesn't match or the hash changed.""" + if client_session_id != _session_id: + return True + # pylint: disable=protected-access + reload_hash = app._hot_reload.hash + if reload_hash is None: + return False + return reload_hash != _session_id + # -- Streamable HTTP endpoint -------------------------------------------- def mcp_handler() -> Response: @@ -75,6 +94,42 @@ def _handle_get() -> Response: status=405, ) + def _check_session(method: str) -> bool: + """Validate the session header. + + Raises ``ValueError`` when the header is missing. + Returns ``True`` when the session was stale and transparently + recovered, or ``False`` when the session is valid. + """ + nonlocal _session_id + if method == "initialize": + _session_id = _get_or_create_session_id() + return False + client_session_id = request.headers.get("Mcp-Session-Id") + if _session_id is not None and not client_session_id: + raise ValueError("Missing Mcp-Session-Id header") + if _is_session_stale(client_session_id): + _session_id = _get_or_create_session_id() + logger.debug("MCP session recovered: %s", _session_id) + return True + return False + + def _json_response(*messages: dict) -> Response: + """Wrap one or more JSON-RPC messages in a Flask Response. + + A single message is serialised as a JSON object; multiple + messages are serialised as a JSON array. + """ + body = messages[0] if len(messages) == 1 else list(messages) + resp = Response( + json.dumps(body), + content_type="application/json", + status=200, + ) + if _session_id is not None: + resp.headers["Mcp-Session-Id"] = _session_id + return resp + def _handle_post() -> Response: content_type = request.content_type or "" if "application/json" not in content_type: @@ -92,16 +147,33 @@ def _handle_post() -> Response: status=400, ) + method = data.get("method", "") + + try: + is_stale_session = _check_session(method) + except ValueError as err: + return Response( + json.dumps({"error": str(err)}), + content_type="application/json", + status=400, + ) + response_data = _process_mcp_message(data) if response_data is None: return Response("", status=202) - return Response( - json.dumps(response_data), - content_type="application/json", - status=200, - ) + if is_stale_session: + return _json_response( + {"jsonrpc": "2.0", "method": "notifications/tools/list_changed"}, + { + "jsonrpc": "2.0", + "method": "notifications/resources/list_changed", + }, + response_data, + ) + + return _json_response(response_data) def _handle_delete() -> Response: # No sessions to terminate — server is stateless. @@ -129,8 +201,8 @@ def _handle_initialize() -> InitializeResult: return InitializeResult( protocolVersion=LATEST_PROTOCOL_VERSION, capabilities=ServerCapabilities( - tools=ToolsCapability(listChanged=False), - resources=ResourcesCapability(), + tools=ToolsCapability(listChanged=True), + resources=ResourcesCapability(listChanged=True), ), serverInfo=Implementation(name="Plotly Dash", version=__version__), instructions=( diff --git a/dash/mcp/primitives/tools/results/result_dataframe.py b/dash/mcp/primitives/tools/results/result_dataframe.py index 8a2130387c..780bb264ef 100644 --- a/dash/mcp/primitives/tools/results/result_dataframe.py +++ b/dash/mcp/primitives/tools/results/result_dataframe.py @@ -47,7 +47,7 @@ class DataFrameResult(ResultFormatter): """Produce a markdown table for tabular component output values.""" @classmethod - def format(cls, output: MCPOutput, returned_output_value: Any) -> list[TextContent]: + def format(cls, output: MCPOutput, returned_output_value: Any) -> list[TextContent]: # type: ignore[override] if not TABULAR.matches(output.get("component_type"), output["property"]): return [] if ( diff --git a/tests/integration/mcp/test_mcp_session.py b/tests/integration/mcp/test_mcp_session.py new file mode 100644 index 0000000000..f3cc2bfbd8 --- /dev/null +++ b/tests/integration/mcp/test_mcp_session.py @@ -0,0 +1,128 @@ +"""MCP session lifecycle — end-to-end over a real Dash server. + +Exercises the full MCP session flow (initialize → operate → hot-reload +recovery) against a live ``dash_duo`` server using real HTTP requests. +Unit-level checks (status codes, header mechanics) live in +``tests/unit/mcp/test_mcp_session.py``; these tests verify the broader +behavioral contract. +""" + +import requests + +from dash import Dash, Input, Output, html + +from tests.integration.mcp.conftest import _mcp_post + + +def _mcp_post_with_session( + server_url, method, params=None, request_id=1, session_id=None +): + """Like ``_mcp_post`` but forwards an ``Mcp-Session-Id`` header.""" + headers = {"Content-Type": "application/json"} + if session_id is not None: + headers["Mcp-Session-Id"] = session_id + return requests.post( + f"{server_url}/_mcp", + json={ + "jsonrpc": "2.0", + "method": method, + "id": request_id, + "params": params or {}, + }, + headers=headers, + timeout=5, + ) + + +def test_mcpse_e2e001_full_session_lifecycle(dash_duo): + """Initialize → tools/list → tools/call with session headers throughout.""" + app = Dash(__name__) + app.layout = html.Div([html.Div(id="inp"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("inp", "children")) + def echo(v): + return f"echo: {v}" + + dash_duo.start_server(app) + url = dash_duo.server.url + + init = _mcp_post_with_session(url, "initialize") + assert init.status_code == 200 + sid = init.headers.get("Mcp-Session-Id") + assert sid + + notif = _mcp_post_with_session( + url, "notifications/initialized", session_id=sid, request_id=None + ) + assert notif.status_code == 202 + + tools_resp = _mcp_post_with_session(url, "tools/list", session_id=sid, request_id=2) + assert tools_resp.status_code == 200 + tools = tools_resp.json()["result"]["tools"] + assert any("echo" in t["name"] for t in tools) + + tool_name = next(t["name"] for t in tools if "echo" in t["name"]) + call_resp = _mcp_post_with_session( + url, + "tools/call", + params={"name": tool_name, "arguments": {"v": "hello"}}, + session_id=sid, + request_id=3, + ) + assert call_resp.status_code == 200 + assert call_resp.headers.get("Mcp-Session-Id") == sid + + +def test_mcpse_e2e002_stale_session_recovers_with_notifications(dash_duo): + """Simulate a hot-reload hash change and verify transparent recovery.""" + app = Dash(__name__) + app.layout = html.Div([html.Div(id="inp"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("inp", "children")) + def echo(v): + return f"echo: {v}" + + dash_duo.start_server(app) + url = dash_duo.server.url + + app._hot_reload.hash = "original_hash" + + init = _mcp_post_with_session(url, "initialize") + sid = init.headers["Mcp-Session-Id"] + assert sid == "original_hash" + + resp = _mcp_post_with_session(url, "tools/list", session_id=sid, request_id=2) + assert resp.status_code == 200 + + app._hot_reload.hash = "new_hash" + + resp = _mcp_post_with_session(url, "tools/list", session_id=sid, request_id=3) + assert resp.status_code == 200 + new_sid = resp.headers["Mcp-Session-Id"] + assert new_sid == "new_hash" + + data = resp.json() + assert isinstance(data, list) + assert len(data) == 3 + assert data[0]["method"] == "notifications/tools/list_changed" + assert data[1]["method"] == "notifications/resources/list_changed" + assert "result" in data[2] + assert "tools" in data[2]["result"] + + resp = _mcp_post_with_session(url, "tools/list", session_id=new_sid, request_id=4) + assert resp.status_code == 200 + data = resp.json() + assert isinstance(data, dict) + assert "result" in data + + +def test_mcpse_e2e003_capabilities_advertise_list_changed(dash_duo): + """Server capabilities include listChanged for tools and resources.""" + app = Dash(__name__) + app.layout = html.Div(id="root") + dash_duo.start_server(app) + + resp = _mcp_post(dash_duo.server.url, "initialize") + caps = resp.json()["result"]["capabilities"] + assert caps["tools"]["listChanged"] is True + assert caps["resources"]["listChanged"] is True diff --git a/tests/unit/mcp/test_mcp_session.py b/tests/unit/mcp/test_mcp_session.py new file mode 100644 index 0000000000..029fd284ad --- /dev/null +++ b/tests/unit/mcp/test_mcp_session.py @@ -0,0 +1,164 @@ +"""MCP session management — ``Mcp-Session-Id`` header and hot-reload hash.""" + +import json +import sys + +import pytest + +if sys.version_info < (3, 10): + pytest.skip("MCP requires Python 3.10+", allow_module_level=True) + +from tests.unit.mcp.conftest import _make_app # pylint: disable=wrong-import-position + + +def _make_mcp_app(**kwargs): + return _make_app(enable_mcp=True, **kwargs) + + +def _post(client, method, params=None, request_id=1, session_id=None): + """POST a JSON-RPC message to the MCP endpoint.""" + headers = {"Content-Type": "application/json"} + if session_id is not None: + headers["Mcp-Session-Id"] = session_id + body = {"jsonrpc": "2.0", "method": method, "id": request_id} + body["params"] = params if params is not None else {} + return client.post("/_mcp", data=json.dumps(body), headers=headers) + + +# --------------------------------------------------------------------------- +# Tests +# --------------------------------------------------------------------------- + + +def test_mcpse001_initialize_returns_session_id(): + app = _make_mcp_app() + with app.server.test_client() as client: + resp = _post(client, "initialize") + assert resp.status_code == 200 + session_id = resp.headers.get("Mcp-Session-Id") + assert session_id is not None + assert len(session_id) > 0 + + +def test_mcpse002_request_without_session_after_init_returns_400(): + app = _make_mcp_app() + with app.server.test_client() as client: + _post(client, "initialize") + resp = _post(client, "tools/list") + assert resp.status_code == 400 + + +def test_mcpse003_request_with_valid_session_succeeds(): + app = _make_mcp_app() + with app.server.test_client() as client: + init_resp = _post(client, "initialize") + session_id = init_resp.headers["Mcp-Session-Id"] + resp = _post(client, "tools/list", session_id=session_id) + assert resp.status_code == 200 + data = json.loads(resp.data) + assert "result" in data + + +def test_mcpse004_stale_session_recovers_transparently(): + app = _make_mcp_app() + app._hot_reload.hash = "hash_v1" + + with app.server.test_client() as client: + init_resp = _post(client, "initialize") + old_session = init_resp.headers["Mcp-Session-Id"] + assert old_session == "hash_v1" + + app._hot_reload.hash = "hash_v2" + + resp = _post(client, "tools/list", session_id=old_session) + assert resp.status_code == 200 + + data = json.loads(resp.data) + assert isinstance(data, list) + assert len(data) == 3 + + new_session = resp.headers.get("Mcp-Session-Id") + assert new_session is not None + assert new_session == "hash_v2" + + +def test_mcpse005_stale_session_includes_list_changed_notifications(): + app = _make_mcp_app() + app._hot_reload.hash = "hash_v1" + + with app.server.test_client() as client: + init_resp = _post(client, "initialize") + old_session = init_resp.headers["Mcp-Session-Id"] + + app._hot_reload.hash = "hash_v2" + + resp = _post(client, "tools/list", session_id=old_session) + data = json.loads(resp.data) + + assert data[0]["method"] == "notifications/tools/list_changed" + assert data[1]["method"] == "notifications/resources/list_changed" + assert "result" in data[2] + + +def test_mcpse006_reinitialize_after_hot_reload_gets_new_session(): + app = _make_mcp_app() + app._hot_reload.hash = "hash_v1" + + with app.server.test_client() as client: + init_resp = _post(client, "initialize") + old_session = init_resp.headers["Mcp-Session-Id"] + assert old_session == "hash_v1" + + app._hot_reload.hash = "hash_v2" + + # Stale request triggers transparent recovery. + resp = _post(client, "tools/list", session_id=old_session) + assert resp.status_code == 200 + recovered_session = resp.headers["Mcp-Session-Id"] + assert recovered_session == "hash_v2" + + # Re-initialize picks up the new hash. + init_resp2 = _post(client, "initialize") + assert init_resp2.status_code == 200 + new_session = init_resp2.headers["Mcp-Session-Id"] + assert new_session == "hash_v2" + + # Subsequent requests with the new session work. + resp = _post(client, "tools/list", session_id=new_session) + assert resp.status_code == 200 + data = json.loads(resp.data) + assert "result" in data + + +def test_mcpse007_no_session_required_before_first_initialize(): + app = _make_mcp_app() + with app.server.test_client() as client: + resp = _post(client, "tools/list") + assert resp.status_code == 200 + + +def test_mcpse008_production_mode_generates_stable_session(): + app = _make_mcp_app() + assert app._hot_reload.hash is None + + with app.server.test_client() as client: + init_resp = _post(client, "initialize") + session_id = init_resp.headers["Mcp-Session-Id"] + assert session_id is not None + + resp = _post(client, "tools/list", session_id=session_id) + assert resp.status_code == 200 + + resp = _post(client, "tools/list", session_id=session_id) + assert resp.status_code == 200 + + +def test_mcpse009_session_header_on_every_response(): + app = _make_mcp_app() + with app.server.test_client() as client: + init_resp = _post(client, "initialize") + session_id = init_resp.headers["Mcp-Session-Id"] + + resp = _post(client, "tools/list", session_id=session_id) + assert resp.status_code == 200 + assert resp.headers.get("Mcp-Session-Id") == session_id From cf8e9d92bf4df58232bcda16cdd08310b688e9b7 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Tue, 12 May 2026 18:08:09 -0600 Subject: [PATCH 063/103] Migrate MCP server to use v4.2.0 backend abstractions --- dash/mcp/_server.py | 78 ++++++++++++++----------------- tests/integration/mcp/conftest.py | 13 ------ 2 files changed, 36 insertions(+), 55 deletions(-) diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py index f7632b134b..5e708da25c 100644 --- a/dash/mcp/_server.py +++ b/dash/mcp/_server.py @@ -11,7 +11,6 @@ import uuid from typing import TYPE_CHECKING, Any -from flask import Response, request from mcp.types import ( LATEST_PROTOCOL_VERSION, ErrorData, @@ -25,7 +24,6 @@ ) from dash import get_app -from dash._get_app import with_app_context_factory from dash.mcp._decorator import MCP_DECORATED_FUNCTIONS from dash.mcp.primitives import ( call_tool, @@ -47,7 +45,7 @@ def enable_mcp_server(app: Dash, mcp_path: str) -> None: - """Add MCP routes to a Dash/Flask app.""" + """Add MCP routes to a Dash app.""" app.mcp_decorated_functions = dict(MCP_DECORATED_FUNCTIONS) MCP_DECORATED_FUNCTIONS.clear() @@ -72,28 +70,6 @@ def _is_session_stale(client_session_id: str | None) -> bool: # -- Streamable HTTP endpoint -------------------------------------------- - def mcp_handler() -> Response: - if request.method == "POST": - return _handle_post() - if request.method == "GET": - return _handle_get() - if request.method == "DELETE": - return _handle_delete() - return Response( - json.dumps({"error": "Method not allowed"}), - content_type="application/json", - status=405, - ) - - def _handle_get() -> Response: - # MCP spec allows servers to opt out of GET-initiated SSE streams - # by returning 405. We don't push server-initiated events. - return Response( - json.dumps({"error": "Method not allowed"}), - content_type="application/json", - status=405, - ) - def _check_session(method: str) -> bool: """Validate the session header. @@ -102,10 +78,11 @@ def _check_session(method: str) -> bool: recovered, or ``False`` when the session is valid. """ nonlocal _session_id + adapter = app.backend.request_adapter() if method == "initialize": _session_id = _get_or_create_session_id() return False - client_session_id = request.headers.get("Mcp-Session-Id") + client_session_id = adapter.headers.get("Mcp-Session-Id") if _session_id is not None and not client_session_id: raise ValueError("Missing Mcp-Session-Id header") if _is_session_stale(client_session_id): @@ -114,14 +91,14 @@ def _check_session(method: str) -> bool: return True return False - def _json_response(*messages: dict) -> Response: - """Wrap one or more JSON-RPC messages in a Flask Response. + def _json_response(*messages: dict): + """Wrap one or more JSON-RPC messages in a response. A single message is serialised as a JSON object; multiple messages are serialised as a JSON array. """ body = messages[0] if len(messages) == 1 else list(messages) - resp = Response( + resp = app.backend.make_response( json.dumps(body), content_type="application/json", status=200, @@ -130,18 +107,19 @@ def _json_response(*messages: dict) -> Response: resp.headers["Mcp-Session-Id"] = _session_id return resp - def _handle_post() -> Response: - content_type = request.content_type or "" + def _handle_post() -> Any: + adapter = app.backend.request_adapter() + content_type = adapter.headers.get("Content-Type", "") if "application/json" not in content_type: - return Response( + return app.backend.make_response( json.dumps({"error": "Content-Type must be application/json"}), content_type="application/json", status=415, ) - data = request.get_json(silent=True) + data = adapter.get_json() if data is None: - return Response( + return app.backend.make_response( json.dumps({"error": "Invalid JSON"}), content_type="application/json", status=400, @@ -152,7 +130,7 @@ def _handle_post() -> Response: try: is_stale_session = _check_session(method) except ValueError as err: - return Response( + return app.backend.make_response( json.dumps({"error": str(err)}), content_type="application/json", status=400, @@ -161,7 +139,7 @@ def _handle_post() -> Response: response_data = _process_mcp_message(data) if response_data is None: - return Response("", status=202) + return app.backend.make_response("", status=202) if is_stale_session: return _json_response( @@ -175,20 +153,36 @@ def _handle_post() -> Response: return _json_response(response_data) - def _handle_delete() -> Response: - # No sessions to terminate — server is stateless. - return Response( + def _handle_not_allowed(): + """Return 405 for GET and DELETE (MCP SSE not supported).""" + return app.backend.make_response( json.dumps({"error": "Method not allowed"}), content_type="application/json", status=405, ) # -- Register routes ----------------------------------------------------- + # Separate registrations per HTTP method so the handler never needs to + # inspect the request method. Distinct endpoint names are required by + # Flask / Werkzeug when the same URL rule is registered more than once. - # pylint: disable-next=protected-access - app._add_url( - mcp_path, with_app_context_factory(mcp_handler, app), ["GET", "POST", "DELETE"] + mcp_url = app.config.routes_pathname_prefix + mcp_path + app.backend.add_url_rule( + mcp_url, view_func=_handle_post, endpoint=f"{mcp_url}:POST", methods=["POST"] + ) + app.backend.add_url_rule( + mcp_url, + view_func=_handle_not_allowed, + endpoint=f"{mcp_url}:GET", + methods=["GET"], + ) + app.backend.add_url_rule( + mcp_url, + view_func=_handle_not_allowed, + endpoint=f"{mcp_url}:DELETE", + methods=["DELETE"], ) + app.routes.append(mcp_url) logger.info( "MCP routes registered at %s%s", diff --git a/tests/integration/mcp/conftest.py b/tests/integration/mcp/conftest.py index 0db1b775e8..5030211ed8 100644 --- a/tests/integration/mcp/conftest.py +++ b/tests/integration/mcp/conftest.py @@ -5,8 +5,6 @@ import pytest import requests -from dash import _get_app - collect_ignore_glob = [] if sys.version_info < (3, 10): collect_ignore_glob.append("*") @@ -18,17 +16,6 @@ def _enable_mcp_for_integration_tests(monkeypatch): monkeypatch.setenv("DASH_MCP_ENABLED", "true") -@pytest.fixture(autouse=True) -def _reset_dash_app_state(): - """Reset Dash module-level state after each MCP test. - - TODO: this can be removed when 4.2 backend work lands - """ - yield - _get_app.APP = None - _get_app.app_context.set(None) - - def _mcp_post(server_url, method, params=None, request_id=1): return requests.post( f"{server_url}/_mcp", From 6c3fec8bf14b70048abed750b45dde9e736f62c5 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 13 May 2026 15:17:54 -0600 Subject: [PATCH 064/103] Fix async (Quart) route registration --- dash/mcp/_server.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py index 5e708da25c..ac8b58de5a 100644 --- a/dash/mcp/_server.py +++ b/dash/mcp/_server.py @@ -7,6 +7,7 @@ from __future__ import annotations import json +import inspect import logging import uuid from typing import TYPE_CHECKING, Any @@ -108,6 +109,14 @@ def _json_response(*messages: dict): return resp def _handle_post() -> Any: + adapter = app.backend.request_adapter() + return _handle_mcp_request(adapter.get_json()) + + async def _handle_post_async() -> Any: + adapter = app.backend.request_adapter() + return _handle_mcp_request(await adapter.get_json()) + + def _handle_mcp_request(data) -> Any: adapter = app.backend.request_adapter() content_type = adapter.headers.get("Content-Type", "") if "application/json" not in content_type: @@ -117,7 +126,6 @@ def _handle_post() -> Any: status=415, ) - data = adapter.get_json() if data is None: return app.backend.make_response( json.dumps({"error": "Invalid JSON"}), @@ -165,10 +173,16 @@ def _handle_not_allowed(): # Separate registrations per HTTP method so the handler never needs to # inspect the request method. Distinct endpoint names are required by # Flask / Werkzeug when the same URL rule is registered more than once. - + if inspect.iscoroutinefunction(app.backend.request_adapter.get_json): + post_handler = _handle_post_async + else: + post_handler = _handle_post mcp_url = app.config.routes_pathname_prefix + mcp_path app.backend.add_url_rule( - mcp_url, view_func=_handle_post, endpoint=f"{mcp_url}:POST", methods=["POST"] + mcp_url, + view_func=post_handler, + endpoint=f"{mcp_url}:POST", + methods=["POST"], ) app.backend.add_url_rule( mcp_url, From 5e4775536e4bf7eddb794a2f672afbcf8e98f002 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 13 May 2026 17:07:51 -0600 Subject: [PATCH 065/103] Fix session management with multiple workers --- dash/mcp/_server.py | 27 ++++++++++++++++++--------- tests/unit/mcp/test_mcp_session.py | 8 -------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py index ac8b58de5a..9548342348 100644 --- a/dash/mcp/_server.py +++ b/dash/mcp/_server.py @@ -6,10 +6,12 @@ from __future__ import annotations -import json +import hashlib import inspect +import json import logging -import uuid +import os +import threading from typing import TYPE_CHECKING, Any from mcp.types import ( @@ -51,13 +53,22 @@ def enable_mcp_server(app: Dash, mcp_path: str) -> None: app.mcp_decorated_functions = dict(MCP_DECORATED_FUNCTIONS) MCP_DECORATED_FUNCTIONS.clear() - _session_id: str | None = None - def _get_or_create_session_id() -> str: - """Read the hot-reload hash or generate a stable fallback.""" + """ + Creates a shared session ID shared across all clients. The session is + used to notify clients of app restarts so they can refresh their view + of the app. + When hot-reloading is enabled, the reload_hash is used + Otherwise, the parent PID is used because it is a stable identifier + across different worker processes. + """ # pylint: disable=protected-access reload_hash = app._hot_reload.hash - return reload_hash if reload_hash is not None else uuid.uuid4().hex + if reload_hash is not None: + return reload_hash + return hashlib.sha256(f"dash-mcp-{os.getppid()}".encode()).hexdigest()[:32] + + _session_id: str = _get_or_create_session_id() def _is_session_stale(client_session_id: str | None) -> bool: """True when the client's session doesn't match or the hash changed.""" @@ -84,9 +95,7 @@ def _check_session(method: str) -> bool: _session_id = _get_or_create_session_id() return False client_session_id = adapter.headers.get("Mcp-Session-Id") - if _session_id is not None and not client_session_id: - raise ValueError("Missing Mcp-Session-Id header") - if _is_session_stale(client_session_id): + if client_session_id and _is_session_stale(client_session_id): _session_id = _get_or_create_session_id() logger.debug("MCP session recovered: %s", _session_id) return True diff --git a/tests/unit/mcp/test_mcp_session.py b/tests/unit/mcp/test_mcp_session.py index 029fd284ad..0c878eb3da 100644 --- a/tests/unit/mcp/test_mcp_session.py +++ b/tests/unit/mcp/test_mcp_session.py @@ -40,14 +40,6 @@ def test_mcpse001_initialize_returns_session_id(): assert len(session_id) > 0 -def test_mcpse002_request_without_session_after_init_returns_400(): - app = _make_mcp_app() - with app.server.test_client() as client: - _post(client, "initialize") - resp = _post(client, "tools/list") - assert resp.status_code == 400 - - def test_mcpse003_request_with_valid_session_succeeds(): app = _make_mcp_app() with app.server.test_client() as client: From 9566de02baaec62c19a72a7a2c5f479bb645b81e Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 13 May 2026 17:31:20 -0600 Subject: [PATCH 066/103] Fix CI errors after rebase --- dash/backends/ws.py | 5 +++-- dash/mcp/_server.py | 1 - tests/integration/mcp/conftest.py | 10 ++++++++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/dash/backends/ws.py b/dash/backends/ws.py index 041241823e..3e9739e16c 100644 --- a/dash/backends/ws.py +++ b/dash/backends/ws.py @@ -20,6 +20,7 @@ import janus from dash.exceptions import PreventUpdate, WebsocketDisconnected +from dash.types import CallbackExecutionBody from dash._utils import to_json if TYPE_CHECKING: @@ -149,7 +150,7 @@ async def get_prop( def create_ws_context( - payload: dict, + payload: CallbackExecutionBody, response_adapter: "ResponseAdapter", websocket_callback: DashWebsocketCallback, ): @@ -276,7 +277,7 @@ def on_done(f: concurrent.futures.Future) -> None: def run_callback_in_executor( executor: ThreadPoolExecutor, dash_app: "dash.Dash", - payload: dict, + payload: CallbackExecutionBody, ws_callback: DashWebsocketCallback, response_adapter: "ResponseAdapter", ) -> concurrent.futures.Future: diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py index 9548342348..aad2ce4bac 100644 --- a/dash/mcp/_server.py +++ b/dash/mcp/_server.py @@ -11,7 +11,6 @@ import json import logging import os -import threading from typing import TYPE_CHECKING, Any from mcp.types import ( diff --git a/tests/integration/mcp/conftest.py b/tests/integration/mcp/conftest.py index 5030211ed8..aad3f1b1b5 100644 --- a/tests/integration/mcp/conftest.py +++ b/tests/integration/mcp/conftest.py @@ -5,6 +5,8 @@ import pytest import requests +from dash import _get_app + collect_ignore_glob = [] if sys.version_info < (3, 10): collect_ignore_glob.append("*") @@ -16,6 +18,14 @@ def _enable_mcp_for_integration_tests(monkeypatch): monkeypatch.setenv("DASH_MCP_ENABLED", "true") +@pytest.fixture(autouse=True) +def _reset_dash_app_state(): + """Reset Dash module-level state after each MCP test.""" + yield + _get_app.APP = None + _get_app.app_context.set(None) + + def _mcp_post(server_url, method, params=None, request_id=1): return requests.post( f"{server_url}/_mcp", From 296b7ac8a89c035d9747bc186cd83f0f7a6d1bf5 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 14 May 2026 09:28:47 -0600 Subject: [PATCH 067/103] code review feedback --- dash/mcp/primitives/resources/resource_components.py | 2 +- dash/mcp/primitives/tools/callback_adapter.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/dash/mcp/primitives/resources/resource_components.py b/dash/mcp/primitives/resources/resource_components.py index 1f80c8bda2..e14cf80745 100644 --- a/dash/mcp/primitives/resources/resource_components.py +++ b/dash/mcp/primitives/resources/resource_components.py @@ -42,7 +42,7 @@ def read_resource(cls, uri: str = "") -> ReadResourceResult: components = sorted( [ { - "id": str(getattr(comp, "id", None)), + "id": str(getattr(comp, "id")), "type": getattr(comp, "_type", type(comp).__name__), } for comp, _ in traverse(layout) diff --git a/dash/mcp/primitives/tools/callback_adapter.py b/dash/mcp/primitives/tools/callback_adapter.py index 8130c6a8a1..9af56bb879 100644 --- a/dash/mcp/primitives/tools/callback_adapter.py +++ b/dash/mcp/primitives/tools/callback_adapter.py @@ -363,7 +363,8 @@ def _param_annotations(self) -> list[Any | None]: def _expand_dep(dep: CallbackDependency, value: Any) -> CallbackInputs: - """Attach a concrete value to a callback dependency to produce a valid callback input. + """ + Attach a concrete value to a callback dependency to produce a valid callback input. For regular deps, returns ``{id, property, value}``. For ALL/ALLSMALLER: passes through the list of ``{id, property, value}`` dicts. From 15f2111c03b167287ff06fd1a7e19dc1a837b349 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 8 Apr 2026 17:06:29 -0600 Subject: [PATCH 068/103] Implement background callback support --- dash/_callback.py | 5 + dash/mcp/_server.py | 8 +- dash/mcp/primitives/tools/__init__.py | 16 +- dash/mcp/primitives/tools/base.py | 6 +- .../primitives/tools/descriptions/__init__.py | 2 + .../description_background_callbacks.py | 31 ++ dash/mcp/primitives/tools/results/__init__.py | 27 +- .../primitives/tools/tool_background_tasks.py | 105 ++++++ .../tools/tool_decorated_mcp_functions.py | 4 +- .../tools/tool_get_dash_component.py | 7 +- dash/mcp/primitives/tools/tools_callbacks.py | 21 +- dash/mcp/tasks/__init__.py | 5 + dash/mcp/tasks/tasks.py | 147 +++++++++ requirements/install.txt | 2 +- .../mcp/test_background_callbacks.py | 133 ++++++++ .../mcp/tools/test_background_callbacks.py | 300 ++++++++++++++++++ 16 files changed, 805 insertions(+), 14 deletions(-) create mode 100644 dash/mcp/primitives/tools/descriptions/description_background_callbacks.py create mode 100644 dash/mcp/primitives/tools/tool_background_tasks.py create mode 100644 dash/mcp/tasks/__init__.py create mode 100644 dash/mcp/tasks/tasks.py create mode 100644 tests/integration/mcp/test_background_callbacks.py create mode 100644 tests/unit/mcp/tools/test_background_callbacks.py diff --git a/dash/_callback.py b/dash/_callback.py index 637a332905..c77419e068 100644 --- a/dash/_callback.py +++ b/dash/_callback.py @@ -1,6 +1,7 @@ import collections import hashlib import inspect +from datetime import datetime, timezone from functools import wraps from typing import Callable, Optional, Any, List, Tuple, Union, Dict, TypeVar, cast @@ -445,6 +446,10 @@ def _setup_background_callback( ctx_value, ) + callback_manager.handle.set( + f"{cache_key}-created_at", datetime.now(timezone.utc).isoformat() + ) + data = { "cacheKey": cache_key, "job": job, diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py index aad2ce4bac..07b0520bb9 100644 --- a/dash/mcp/_server.py +++ b/dash/mcp/_server.py @@ -34,6 +34,7 @@ list_tools, read_resource, ) +from dash.mcp.tasks import get_task, get_task_result, cancel_task from dash.mcp.primitives.tools.callback_adapter_collection import ( CallbackAdapterCollection, ) @@ -251,11 +252,16 @@ def _process_mcp_message(data: dict[str, Any]) -> dict[str, Any] | None: "initialize": _handle_initialize, "tools/list": list_tools, "tools/call": lambda: call_tool( - params.get("name", ""), params.get("arguments", {}) + tool_name=params.get("name", ""), + arguments=params.get("arguments", {}), + task=params.get("task"), ), "resources/list": list_resources, "resources/templates/list": list_resource_templates, "resources/read": lambda: read_resource(params.get("uri", "")), + "tasks/get": lambda: get_task(task_id=params.get("taskId", "")), + "tasks/result": lambda: get_task_result(task_id=params.get("taskId", "")), + "tasks/cancel": lambda: cancel_task(task_id=params.get("taskId", "")), } try: diff --git a/dash/mcp/primitives/tools/__init__.py b/dash/mcp/primitives/tools/__init__.py index b8f12a1dbd..eea7af43c1 100644 --- a/dash/mcp/primitives/tools/__init__.py +++ b/dash/mcp/primitives/tools/__init__.py @@ -4,17 +4,19 @@ from typing import Any -from mcp.types import CallToolResult, ListToolsResult +from mcp.types import CallToolResult, CreateTaskResult, ListToolsResult from dash.mcp.types import ToolNotFoundError from .base import MCPToolProvider +from .tool_background_tasks import BackgroundTaskTools from .tool_decorated_mcp_functions import DecoratedFunctionTools from .tool_get_dash_component import GetDashComponentTool from .tools_callbacks import CallbackTools _TOOL_PROVIDERS: list[type[MCPToolProvider]] = [ CallbackTools, + BackgroundTaskTools, GetDashComponentTool, DecoratedFunctionTools, ] @@ -28,11 +30,17 @@ def list_tools() -> ListToolsResult: return ListToolsResult(tools=tools) -def call_tool(tool_name: str, arguments: dict[str, Any]) -> CallToolResult: - """Route a tools/call request by tool name.""" +def call_tool( + tool_name: str, arguments: dict[str, Any], task: dict | None = None +) -> CallToolResult | CreateTaskResult: + """Route a tools/call request by tool name. + + The optional ``task`` parameter (per MCP Tasks protocol) is passed + through to providers that support background callbacks. + """ for provider in _TOOL_PROVIDERS: if tool_name in provider.get_tool_names(): - return provider.call_tool(tool_name, arguments) + return provider.call_tool(tool_name, arguments, task=task) raise ToolNotFoundError( f"Tool not found: {tool_name}." " The app's callbacks may have changed." diff --git a/dash/mcp/primitives/tools/base.py b/dash/mcp/primitives/tools/base.py index 60fa7374d6..f7a5c54aac 100644 --- a/dash/mcp/primitives/tools/base.py +++ b/dash/mcp/primitives/tools/base.py @@ -4,7 +4,7 @@ from typing import Any -from mcp.types import CallToolResult, Tool +from mcp.types import CallToolResult, CreateTaskResult, Tool class MCPToolProvider: @@ -24,5 +24,7 @@ def list_tools(cls) -> list[Tool]: raise NotImplementedError @classmethod - def call_tool(cls, tool_name: str, arguments: dict[str, Any]) -> CallToolResult: + def call_tool( + cls, tool_name: str, arguments: dict[str, Any], task: dict | None = None + ) -> CallToolResult | CreateTaskResult: raise NotImplementedError diff --git a/dash/mcp/primitives/tools/descriptions/__init__.py b/dash/mcp/primitives/tools/descriptions/__init__.py index b32238992c..a4227868d8 100644 --- a/dash/mcp/primitives/tools/descriptions/__init__.py +++ b/dash/mcp/primitives/tools/descriptions/__init__.py @@ -13,6 +13,7 @@ from typing import TYPE_CHECKING from .base import ToolDescriptionSource +from .description_background_callbacks import BackgroundCallbackDescription from .description_docstring import DocstringDescription from .description_outputs import OutputSummaryDescription @@ -22,6 +23,7 @@ _SOURCES: list[type[ToolDescriptionSource]] = [ OutputSummaryDescription, DocstringDescription, + BackgroundCallbackDescription, ] diff --git a/dash/mcp/primitives/tools/descriptions/description_background_callbacks.py b/dash/mcp/primitives/tools/descriptions/description_background_callbacks.py new file mode 100644 index 0000000000..3823e06e0b --- /dev/null +++ b/dash/mcp/primitives/tools/descriptions/description_background_callbacks.py @@ -0,0 +1,31 @@ +"""Description for background (long-running) callbacks. + +Informs the LLM that the tool returns a taskId immediately +and must be polled via the background task result tool. +""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from .base import ToolDescriptionSource + +if TYPE_CHECKING: + from dash.mcp.primitives.tools.callback_adapter import CallbackAdapter + + +class BackgroundCallbackDescription(ToolDescriptionSource): + """Add async polling instructions for background callbacks.""" + + @classmethod + def describe(cls, callback: CallbackAdapter) -> list[str]: + if not callback._cb_info.get("background"): + return [] + from ..tool_background_tasks import GET_RESULT_TOOL_NAME + + return [ + "", + "This is a long-running background operation. " + "It returns a taskId immediately. " + f"Call tool `{GET_RESULT_TOOL_NAME}` with the taskId to poll for the result.", + ] diff --git a/dash/mcp/primitives/tools/results/__init__.py b/dash/mcp/primitives/tools/results/__init__.py index 09e86410a7..10f364959b 100644 --- a/dash/mcp/primitives/tools/results/__init__.py +++ b/dash/mcp/primitives/tools/results/__init__.py @@ -9,7 +9,7 @@ import json from typing import Any -from mcp.types import CallToolResult, TextContent +from mcp.types import CallToolResult, CreateTaskResult, TextContent from dash.types import CallbackExecutionResponse from dash.mcp.primitives.tools.callback_adapter import CallbackAdapter @@ -50,3 +50,28 @@ def format_callback_response( content=content, structuredContent=dict(response), ) + + +def task_result_to_tool_result(create_task_result: CreateTaskResult) -> CallToolResult: + """Wrap a CreateTaskResult as a CallToolResult with polling instructions. + + MCP Tasks are not yet supported by LLM clients, so this converts the + task metadata into a tool response that guides the LLM to poll via + the get_background_task_result tool. + """ + task = create_task_result.task + return CallToolResult( + content=[TextContent( + type="text", + text=json.dumps({ + "taskId": task.taskId, + "status": task.status, + "pollInterval": task.pollInterval, + "message": ( + "This is a long-running background callback. " + "Call the get_background_task_result tool with this taskId " + "to poll for the result." + ), + }), + )], + ) diff --git a/dash/mcp/primitives/tools/tool_background_tasks.py b/dash/mcp/primitives/tools/tool_background_tasks.py new file mode 100644 index 0000000000..37f76a9d4d --- /dev/null +++ b/dash/mcp/primitives/tools/tool_background_tasks.py @@ -0,0 +1,105 @@ +"""Built-in tools for background callback task lifecycle. + +Thin wrappers around the spec-aligned core in dash.mcp.tasks. +Only registered when the app has background callbacks. +""" + +from __future__ import annotations + +from typing import Any + +from mcp.types import CallToolResult, TextContent, Tool + +from dash import get_app +from dash.mcp.tasks import get_task, get_task_result, cancel_task + +from .base import MCPToolProvider + + +GET_RESULT_TOOL_NAME = "get_background_task_result" +CANCEL_TOOL_NAME = "cancel_background_task" + + +def _has_background_callbacks() -> bool: + return any( + cb_info.get("background") + for cb_info in get_app().callback_map.values() + ) + + +class BackgroundTaskTools(MCPToolProvider): + """Built-in tools for polling and cancelling background callback tasks. + + Only registered when the app has background callbacks. + """ + + @classmethod + def get_tool_names(cls) -> set[str]: + if not _has_background_callbacks(): + return set() + return {GET_RESULT_TOOL_NAME, CANCEL_TOOL_NAME} + + @classmethod + def list_tools(cls) -> list[Tool]: + if not _has_background_callbacks(): + return [] + return [ + Tool( + name=GET_RESULT_TOOL_NAME, + description=( + "Poll for the result of a long-running background callback. " + "Pass the taskId returned by the original tool call. " + "If the task is still running, call this tool again. " + "If complete, returns the callback result." + ), + inputSchema={ + "type": "object", + "properties": { + "taskId": { + "type": "string", + "description": "The taskId returned by the background callback tool.", + }, + }, + "required": ["taskId"], + }, + ), + Tool( + name=CANCEL_TOOL_NAME, + description="Cancel a running background callback.", + inputSchema={ + "type": "object", + "properties": { + "taskId": { + "type": "string", + "description": "The taskId of the background task to cancel.", + }, + }, + "required": ["taskId"], + }, + ), + ] + + @classmethod + def call_tool( + cls, + tool_name: str, + arguments: dict[str, Any], + task: dict | None = None, + ) -> CallToolResult: + task_id = arguments.get("taskId", "") + + if tool_name == GET_RESULT_TOOL_NAME: + task_status = get_task(task_id) + if task_status.status == "completed": + return get_task_result(task_id) + return CallToolResult( + content=[TextContent(type="text", text=task_status.model_dump_json())], + ) + + if tool_name == CANCEL_TOOL_NAME: + result = cancel_task(task_id) + return CallToolResult( + content=[TextContent(type="text", text=result.model_dump_json())], + ) + + raise ValueError(f"Unknown tool: {tool_name}") diff --git a/dash/mcp/primitives/tools/tool_decorated_mcp_functions.py b/dash/mcp/primitives/tools/tool_decorated_mcp_functions.py index c135455c88..0b3edbbcbe 100644 --- a/dash/mcp/primitives/tools/tool_decorated_mcp_functions.py +++ b/dash/mcp/primitives/tools/tool_decorated_mcp_functions.py @@ -125,7 +125,9 @@ def list_tools(cls) -> list[Tool]: return [_build_tool(name, reg) for name, reg in cls._registry().items()] @classmethod - def call_tool(cls, tool_name: str, arguments: dict[str, Any]) -> CallToolResult: + def call_tool( + cls, tool_name: str, arguments: dict[str, Any], task: dict | None = None + ) -> CallToolResult: reg = cls._registry().get(tool_name) if reg is None: return CallToolResult( diff --git a/dash/mcp/primitives/tools/tool_get_dash_component.py b/dash/mcp/primitives/tools/tool_get_dash_component.py index 8c131c4288..d8ba9b6e49 100644 --- a/dash/mcp/primitives/tools/tool_get_dash_component.py +++ b/dash/mcp/primitives/tools/tool_get_dash_component.py @@ -58,7 +58,12 @@ def list_tools(cls) -> list[Tool]: ] @classmethod - def call_tool(cls, tool_name: str, arguments: dict[str, Any]) -> CallToolResult: + def call_tool( + cls, + tool_name: str, + arguments: dict[str, Any], + task: dict | None = None, + ) -> CallToolResult: comp_id = arguments.get("component_id", "") if not comp_id: return CallToolResult( diff --git a/dash/mcp/primitives/tools/tools_callbacks.py b/dash/mcp/primitives/tools/tools_callbacks.py index 716b777326..990f90e285 100644 --- a/dash/mcp/primitives/tools/tools_callbacks.py +++ b/dash/mcp/primitives/tools/tools_callbacks.py @@ -7,14 +7,15 @@ from typing import Any -from mcp.types import CallToolResult, TextContent, Tool +from mcp.types import CallToolResult, CreateTaskResult, TextContent, Tool from dash import get_app +from dash.mcp.tasks import create_task from dash.mcp.types import CallbackExecutionError, ToolNotFoundError from .base import MCPToolProvider from .callback_utils import run_callback -from .results import format_callback_response +from .results import format_callback_response, task_result_to_tool_result class CallbackTools(MCPToolProvider): @@ -30,7 +31,12 @@ def list_tools(cls) -> list[Tool]: return get_app().mcp_callback_map.as_mcp_tools() @classmethod - def call_tool(cls, tool_name: str, arguments: dict[str, Any]) -> CallToolResult: + def call_tool( + cls, + tool_name: str, + arguments: dict[str, Any], + task: dict | None = None, + ) -> CallToolResult | CreateTaskResult: """Execute a callback tool by name.""" callback_map = get_app().mcp_callback_map cb = callback_map.find_by_tool_name(tool_name) @@ -41,6 +47,8 @@ def call_tool(cls, tool_name: str, arguments: dict[str, Any]) -> CallToolResult: " Please call tools/list to refresh your tool list." ) + is_background = bool(cb._cb_info.get("background")) + try: callback_response = run_callback(cb, arguments) except CallbackExecutionError as e: @@ -48,4 +56,11 @@ def call_tool(cls, tool_name: str, arguments: dict[str, Any]) -> CallToolResult: content=[TextContent(type="text", text=str(e))], isError=True, ) + + if is_background: + task_result = create_task(callback_response, cb) + if task is not None: + return task_result + return task_result_to_tool_result(task_result) + return format_callback_response(callback_response, cb) diff --git a/dash/mcp/tasks/__init__.py b/dash/mcp/tasks/__init__.py new file mode 100644 index 0000000000..8b78741d60 --- /dev/null +++ b/dash/mcp/tasks/__init__.py @@ -0,0 +1,5 @@ +"""MCP Tasks — lifecycle management for background callback execution.""" + +from .tasks import create_task, get_task, get_task_result, cancel_task + +__all__ = ["create_task", "get_task", "get_task_result", "cancel_task"] diff --git a/dash/mcp/tasks/tasks.py b/dash/mcp/tasks/tasks.py new file mode 100644 index 0000000000..6217fc7b1e --- /dev/null +++ b/dash/mcp/tasks/tasks.py @@ -0,0 +1,147 @@ +"""Handler functions for MCP tasks/* methods.""" + +from __future__ import annotations + +import json +from datetime import datetime, timezone +from typing import Any + +from mcp.types import CreateTaskResult, GetTaskResult, Task + +from dash import get_app +from dash.mcp.primitives.tools.results import format_callback_response +from dash.mcp.types import MCPError + + +def parse_task_id(task_id: str) -> tuple[str, str, str]: + """Parse a taskId into (tool_name, job_id, cache_key).""" + return task_id.split(":", 2) + + +def _get_callback_manager(): + """Get the background callback manager from the app's callback_map.""" + app = get_app() + for cb_info in app.callback_map.values(): + manager = cb_info.get("manager") + if manager is not None: + return manager + return None + + +def create_task(dispatch_response: dict[str, Any], callback) -> CreateTaskResult: + """Create a Task from a background callback's initial dispatch response.""" + cache_key = dispatch_response["cacheKey"] + job_id = str(dispatch_response["job"]) + task_id = f"{callback.tool_name}:{job_id}:{cache_key}" + interval = callback._cb_info.get("background", {}).get("interval", 1000) + now = datetime.now(timezone.utc) + return CreateTaskResult( + task=Task( + taskId=task_id, + status="working", + createdAt=now, + lastUpdatedAt=now, + ttl=None, + pollInterval=interval, + ), + ) + + +def get_task(task_id: str) -> GetTaskResult: + """Handle tasks/get — derive status from the callback manager.""" + tool_name, job_id, cache_key = parse_task_id(task_id) + + manager = _get_callback_manager() + if manager is None: + return GetTaskResult( + taskId=task_id, + status="failed", + statusMessage="No background callback manager configured.", + createdAt=datetime.now(timezone.utc), + lastUpdatedAt=datetime.now(timezone.utc), + ttl=None, + ) + + running = manager.job_running(job_id) + progress = manager.get_progress(cache_key) + + if running: + status = "working" + elif manager.result_ready(cache_key): + status = "completed" + else: + status = "failed" + + adapter = get_app().mcp_callback_map.find_by_tool_name(tool_name) + interval = None + if adapter is not None: + interval = adapter._cb_info.get("background", {}).get("interval", 1000) + + now = datetime.now(timezone.utc) + return GetTaskResult( + taskId=task_id, + status=status, + statusMessage=str(progress) if progress else None, + createdAt=datetime.fromisoformat(manager.handle.get(f"{cache_key}-created_at") or now.isoformat()), + lastUpdatedAt=now, + ttl=manager.expire * 1000 if manager.expire else None, + pollInterval=interval, + ) + + +def get_task_result(task_id: str) -> Any: + """Handle tasks/result — retrieve and format the callback result. + + Mirrors the Dash renderer: calls get_result() which clears from cache. + """ + tool_name, job_id, cache_key = parse_task_id(task_id) + + manager = _get_callback_manager() + if manager is None: + raise MCPError("No background callback manager configured.") + + # Mirror the renderer: dispatch with cacheKey/job query params. + # The framework handles result retrieval, wrapping, and cleanup. + adapter = get_app().mcp_callback_map.find_by_tool_name(tool_name) + body = adapter.as_callback_body({}) + app = get_app() + + with app.server.test_request_context( + f"/_dash-update-component?cacheKey={cache_key}&job={job_id}", + method="POST", + data=json.dumps(body, default=str), + content_type="application/json", + ): + response = app.dispatch() + + response_data = json.loads(response.get_data(as_text=True)) + + if "response" not in response_data: + raise MCPError("Task result not ready. Poll tasks/get until status is 'completed'.") + + return format_callback_response(response_data, adapter) + + +def cancel_task(task_id: str) -> Any: + """Handle tasks/cancel — terminate the background job. + + Same underlying mechanism as the renderer's cancelJob query param. + """ + from mcp.types import CancelTaskResult + + tool_name, job_id, cache_key = parse_task_id(task_id) + + manager = _get_callback_manager() + if manager is None: + raise MCPError("No background callback manager configured.") + + manager.terminate_job(job_id) + + now = datetime.now(timezone.utc) + return CancelTaskResult( + taskId=task_id, + status="cancelled", + createdAt=datetime.fromisoformat(manager.handle.get(f"{cache_key}-created_at") or now.isoformat()), + lastUpdatedAt=now, + ttl=manager.expire * 1000 if manager.expire else None, + ) diff --git a/requirements/install.txt b/requirements/install.txt index a976ab9010..1dedc8662c 100644 --- a/requirements/install.txt +++ b/requirements/install.txt @@ -9,4 +9,4 @@ nest-asyncio setuptools janus>=1.0.0 pydantic>=2.10 -mcp>=1.0.0; python_version>="3.10" +mcp>=1.23.0; python_version>="3.10" diff --git a/tests/integration/mcp/test_background_callbacks.py b/tests/integration/mcp/test_background_callbacks.py new file mode 100644 index 0000000000..75ae009aeb --- /dev/null +++ b/tests/integration/mcp/test_background_callbacks.py @@ -0,0 +1,133 @@ +"""Integration tests for background callback support via MCP.""" + +import json +import time + +import diskcache +from dash import Dash, Input, Output, html +from dash.background_callback.managers.diskcache_manager import DiskcacheManager + +MCP_PATH = "_mcp" + + +def _make_background_app(): + cache = diskcache.Cache() + manager = DiskcacheManager(cache) + + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id="input"), + html.Div(id="output"), + ] + ) + + @app.callback( + Output("output", "children"), + Input("input", "children"), + background=True, + manager=manager, + ) + def slow_callback(value): + time.sleep(0.5) + return f"done: {value}" + + return app + + +def _post(client, method, params=None, session_id=None, request_id=1): + headers = {"Content-Type": "application/json"} + if session_id: + headers["mcp-session-id"] = session_id + return client.post( + f"/{MCP_PATH}", + data=json.dumps( + { + "jsonrpc": "2.0", + "method": method, + "id": request_id, + "params": params or {}, + } + ), + headers=headers, + ) + + +def _init_session(client): + r = _post(client, "initialize") + return r.headers["mcp-session-id"] + + +class TestBackgroundCallbackLifecycle: + """Full lifecycle: trigger → poll → get result, over HTTP.""" + + def test_trigger_poll_and_retrieve(self): + app = _make_background_app() + client = app.server.test_client() + sid = _init_session(client) + + # Trigger + r = _post( + client, + "tools/call", + { + "name": "slow_callback", + "arguments": {"value": "hello"}, + }, + session_id=sid, + ) + assert r.status_code == 200 + data = json.loads(r.data) + task_info = json.loads(data["result"]["content"][0]["text"]) + task_id = task_info["taskId"] + assert task_info["status"] == "working" + + # Poll — should be working initially + r = _post( + client, + "tools/call", + { + "name": "get_background_task_result", + "arguments": {"taskId": task_id}, + }, + session_id=sid, + request_id=2, + ) + assert r.status_code == 200 + + # Wait for completion + _, job_id, _ = task_id.split(":", 2) + manager = app.callback_map["output.children"]["manager"] + deadline = time.time() + 5 + while time.time() < deadline: + if not manager.job_running(job_id): + break + time.sleep(0.1) + + # Get result + r = _post( + client, + "tools/call", + { + "name": "get_background_task_result", + "arguments": {"taskId": task_id}, + }, + session_id=sid, + request_id=3, + ) + assert r.status_code == 200 + data = json.loads(r.data) + text = data["result"]["content"][0]["text"] + assert "done:" in text + + def test_background_tools_in_tools_list(self): + app = _make_background_app() + client = app.server.test_client() + sid = _init_session(client) + + r = _post(client, "tools/list", session_id=sid) + data = json.loads(r.data) + names = [t["name"] for t in data["result"]["tools"]] + assert "get_background_task_result" in names + assert "cancel_background_task" in names + assert "slow_callback" in names diff --git a/tests/unit/mcp/tools/test_background_callbacks.py b/tests/unit/mcp/tools/test_background_callbacks.py new file mode 100644 index 0000000000..8dc99164f5 --- /dev/null +++ b/tests/unit/mcp/tools/test_background_callbacks.py @@ -0,0 +1,300 @@ +"""Tests for background callback support via MCP Tasks API.""" + +import time + +from dash import Dash, Input, Output, html +from dash._get_app import app_context +from dash.background_callback.managers.diskcache_manager import DiskcacheManager +from dash.mcp._server import _process_mcp_message +from dash.mcp.primitives.tools.callback_adapter_collection import ( + CallbackAdapterCollection, +) + + +def _setup_mcp(app): + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + return app + + +def _msg(method, params=None, request_id=1): + d = {"jsonrpc": "2.0", "method": method, "id": request_id} + d["params"] = params if params is not None else {} + return d + + +def _mcp(app, method, params=None, request_id=1): + with app.server.test_request_context(): + _setup_mcp(app) + return _process_mcp_message(_msg(method, params, request_id)) + + +def _make_background_app(): + import diskcache + + cache = diskcache.Cache() + manager = DiskcacheManager(cache) + + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id="input"), + html.Div(id="output"), + ] + ) + + @app.callback( + Output("output", "children"), + Input("input", "children"), + background=True, + manager=manager, + ) + def slow_callback(value): + """A background callback.""" + time.sleep(0.3) + return f"done: {value}" + + return app + + +class TestCancelBackgroundTaskTool: + """cancel_background_task tool wrapper.""" + + def test_cancel_via_tool(self): + import json + + app = _make_background_app() + trigger = _mcp( + app, + "tools/call", + { + "name": "slow_callback", + "arguments": {"value": "hello"}, + }, + ) + task_id = json.loads(trigger["result"]["content"][0]["text"])["taskId"] + + cancel = _mcp( + app, + "tools/call", + { + "name": "cancel_background_task", + "arguments": {"taskId": task_id}, + }, + ) + assert cancel["result"].get("isError") is not True + + _, job_id, _ = task_id.split(":", 2) + manager = app.callback_map["output.children"]["manager"] + assert not manager.job_running(job_id) + + +class TestBackgroundToolRegistration: + """Background task tools only appear when app has background callbacks.""" + + def test_present_with_background_callbacks(self): + app = _make_background_app() + tools = _mcp(app, "tools/list")["result"]["tools"] + names = [t["name"] for t in tools] + assert "get_background_task_result" in names + assert "cancel_background_task" in names + + def test_absent_without_background_callbacks(self): + app = Dash(__name__) + app.layout = html.Div([html.Div(id="in"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("in", "children")) + def normal_cb(v): + return v + + tools = _mcp(app, "tools/list")["result"]["tools"] + names = [t["name"] for t in tools] + assert "get_background_task_result" not in names + assert "cancel_background_task" not in names + + +class TestGetBackgroundTaskResult: + """get_background_task_result tool: poll and retrieve results.""" + + def _trigger(self, app): + import json + + result = _mcp( + app, + "tools/call", + { + "name": "slow_callback", + "arguments": {"value": "hello"}, + }, + ) + return json.loads(result["result"]["content"][0]["text"])["taskId"] + + def test_returns_working_while_running(self): + app = _make_background_app() + task_id = self._trigger(app) + poll = _mcp( + app, + "tools/call", + { + "name": "get_background_task_result", + "arguments": {"taskId": task_id}, + }, + ) + text = poll["result"]["content"][0]["text"] + assert "working" in text.lower() + + def test_returns_result_when_complete(self): + app = _make_background_app() + task_id = self._trigger(app) + _, job_id, _ = task_id.split(":", 2) + + # Wait for completion + manager = app.callback_map["output.children"]["manager"] + deadline = time.time() + 3 + while time.time() < deadline: + if not manager.job_running(job_id): + break + time.sleep(0.1) + + result = _mcp( + app, + "tools/call", + { + "name": "get_background_task_result", + "arguments": {"taskId": task_id}, + }, + ) + text = result["result"]["content"][0]["text"] + assert "done:" in text + + +class TestBackgroundCallbackTrigger: + """Calling a background callback tool returns taskId immediately.""" + + def test_returns_task_id(self): + app = _make_background_app() + result = _mcp( + app, + "tools/call", + { + "name": "slow_callback", + "arguments": {"value": "hello"}, + }, + ) + text = result["result"]["content"][0]["text"] + assert "taskId" in text + assert "slow_callback:" in text + + +class TestTasksGet: + """tasks/get derives status from the callback manager.""" + + def test_working_status_while_running(self): + app = _make_background_app() + create_result = _mcp( + app, + "tools/call", + { + "name": "slow_callback", + "arguments": {"value": "hello"}, + "task": {"ttl": 60000}, + }, + ) + task_id = create_result["result"]["task"]["taskId"] + + # Immediately poll — job should still be running + get_result = _mcp(app, "tasks/get", {"taskId": task_id}) + assert get_result["result"]["status"] == "working" + assert get_result["result"]["taskId"] == task_id + + +class TestTasksResult: + """tasks/result retrieves and formats the callback result.""" + + def test_returns_formatted_result_when_complete(self): + app = _make_background_app() + create_result = _mcp( + app, + "tools/call", + { + "name": "slow_callback", + "arguments": {"value": "hello"}, + "task": {"ttl": 60000}, + }, + ) + task_id = create_result["result"]["task"]["taskId"] + tool_name, job_id, cache_key = task_id.split(":", 2) + + # Wait for the background job to finish + manager = app.callback_map["output.children"]["manager"] + deadline = time.time() + 3 + while time.time() < deadline: + if not manager.job_running(job_id): + break + time.sleep(0.1) + + # Fetch the result + result = _mcp(app, "tasks/result", {"taskId": task_id}) + assert "content" in result["result"] + text = result["result"]["content"][0]["text"] + assert "done:" in text + + +class TestTasksCancel: + """tasks/cancel terminates the background job.""" + + def test_cancel_terminates_job(self): + app = _make_background_app() + create_result = _mcp( + app, + "tools/call", + { + "name": "slow_callback", + "arguments": {"value": "hello"}, + "task": {"ttl": 60000}, + }, + ) + task_id = create_result["result"]["task"]["taskId"] + + cancel_result = _mcp(app, "tasks/cancel", {"taskId": task_id}) + assert "error" not in cancel_result + + _, job_id, _ = task_id.split(":", 2) + manager = app.callback_map["output.children"]["manager"] + assert not manager.job_running(job_id) + + +class TestBackgroundCallbackWithTask: + """When tools/call includes task metadata, return CreateTaskResult.""" + + def test_returns_create_task_result(self): + app = _make_background_app() + result = _mcp( + app, + "tools/call", + { + "name": "slow_callback", + "arguments": {"value": "hello"}, + "task": {"ttl": 60000}, + }, + ) + task = result["result"]["task"] + assert task["status"] == "working" + assert "taskId" in task + assert "pollInterval" in task + + def test_task_id_encodes_tool_name_job_id_cache_key(self): + app = _make_background_app() + result = _mcp( + app, + "tools/call", + { + "name": "slow_callback", + "arguments": {"value": "hello"}, + "task": {"ttl": 60000}, + }, + ) + task_id = result["result"]["task"]["taskId"] + tool_name, job_id, cache_key = task_id.split(":", 2) + assert tool_name == "slow_callback" + assert len(cache_key) == 64 # SHA256 hex From ee4e48c822fcae0f0edaa7b844ab7af91b5a29b3 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 8 Apr 2026 17:43:51 -0600 Subject: [PATCH 069/103] Ensure that background callback expiry is communicated in MCP tool --- dash/_callback.py | 4 +- dash/mcp/tasks/tasks.py | 5 +- .../mcp/test_background_callbacks.py | 133 -------- .../mcp/test_mcp_background_tasks.py | 298 +++++++++++++++++ .../mcp/tools/test_background_callbacks.py | 300 ------------------ .../tools/test_mcp_background_callbacks.py | 277 ++++++++++++++++ 6 files changed, 582 insertions(+), 435 deletions(-) delete mode 100644 tests/integration/mcp/test_background_callbacks.py create mode 100644 tests/integration/mcp/test_mcp_background_tasks.py delete mode 100644 tests/unit/mcp/tools/test_background_callbacks.py create mode 100644 tests/unit/mcp/tools/test_mcp_background_callbacks.py diff --git a/dash/_callback.py b/dash/_callback.py index c77419e068..c7e4cb4102 100644 --- a/dash/_callback.py +++ b/dash/_callback.py @@ -447,7 +447,9 @@ def _setup_background_callback( ) callback_manager.handle.set( - f"{cache_key}-created_at", datetime.now(timezone.utc).isoformat() + f"{cache_key}-created_at", + datetime.now(timezone.utc).isoformat(), + expire=callback_manager.expire, ) data = { diff --git a/dash/mcp/tasks/tasks.py b/dash/mcp/tasks/tasks.py index 6217fc7b1e..877b84795b 100644 --- a/dash/mcp/tasks/tasks.py +++ b/dash/mcp/tasks/tasks.py @@ -138,10 +138,13 @@ def cancel_task(task_id: str) -> Any: manager.terminate_job(job_id) now = datetime.now(timezone.utc) + created_at = manager.handle.get(f"{cache_key}-created_at") + manager.handle.delete(f"{cache_key}-created_at") + return CancelTaskResult( taskId=task_id, status="cancelled", - createdAt=datetime.fromisoformat(manager.handle.get(f"{cache_key}-created_at") or now.isoformat()), + createdAt=datetime.fromisoformat(created_at) if created_at else now, lastUpdatedAt=now, ttl=manager.expire * 1000 if manager.expire else None, ) diff --git a/tests/integration/mcp/test_background_callbacks.py b/tests/integration/mcp/test_background_callbacks.py deleted file mode 100644 index 75ae009aeb..0000000000 --- a/tests/integration/mcp/test_background_callbacks.py +++ /dev/null @@ -1,133 +0,0 @@ -"""Integration tests for background callback support via MCP.""" - -import json -import time - -import diskcache -from dash import Dash, Input, Output, html -from dash.background_callback.managers.diskcache_manager import DiskcacheManager - -MCP_PATH = "_mcp" - - -def _make_background_app(): - cache = diskcache.Cache() - manager = DiskcacheManager(cache) - - app = Dash(__name__) - app.layout = html.Div( - [ - html.Div(id="input"), - html.Div(id="output"), - ] - ) - - @app.callback( - Output("output", "children"), - Input("input", "children"), - background=True, - manager=manager, - ) - def slow_callback(value): - time.sleep(0.5) - return f"done: {value}" - - return app - - -def _post(client, method, params=None, session_id=None, request_id=1): - headers = {"Content-Type": "application/json"} - if session_id: - headers["mcp-session-id"] = session_id - return client.post( - f"/{MCP_PATH}", - data=json.dumps( - { - "jsonrpc": "2.0", - "method": method, - "id": request_id, - "params": params or {}, - } - ), - headers=headers, - ) - - -def _init_session(client): - r = _post(client, "initialize") - return r.headers["mcp-session-id"] - - -class TestBackgroundCallbackLifecycle: - """Full lifecycle: trigger → poll → get result, over HTTP.""" - - def test_trigger_poll_and_retrieve(self): - app = _make_background_app() - client = app.server.test_client() - sid = _init_session(client) - - # Trigger - r = _post( - client, - "tools/call", - { - "name": "slow_callback", - "arguments": {"value": "hello"}, - }, - session_id=sid, - ) - assert r.status_code == 200 - data = json.loads(r.data) - task_info = json.loads(data["result"]["content"][0]["text"]) - task_id = task_info["taskId"] - assert task_info["status"] == "working" - - # Poll — should be working initially - r = _post( - client, - "tools/call", - { - "name": "get_background_task_result", - "arguments": {"taskId": task_id}, - }, - session_id=sid, - request_id=2, - ) - assert r.status_code == 200 - - # Wait for completion - _, job_id, _ = task_id.split(":", 2) - manager = app.callback_map["output.children"]["manager"] - deadline = time.time() + 5 - while time.time() < deadline: - if not manager.job_running(job_id): - break - time.sleep(0.1) - - # Get result - r = _post( - client, - "tools/call", - { - "name": "get_background_task_result", - "arguments": {"taskId": task_id}, - }, - session_id=sid, - request_id=3, - ) - assert r.status_code == 200 - data = json.loads(r.data) - text = data["result"]["content"][0]["text"] - assert "done:" in text - - def test_background_tools_in_tools_list(self): - app = _make_background_app() - client = app.server.test_client() - sid = _init_session(client) - - r = _post(client, "tools/list", session_id=sid) - data = json.loads(r.data) - names = [t["name"] for t in data["result"]["tools"]] - assert "get_background_task_result" in names - assert "cancel_background_task" in names - assert "slow_callback" in names diff --git a/tests/integration/mcp/test_mcp_background_tasks.py b/tests/integration/mcp/test_mcp_background_tasks.py new file mode 100644 index 0000000000..e3e0c0acdf --- /dev/null +++ b/tests/integration/mcp/test_mcp_background_tasks.py @@ -0,0 +1,298 @@ +"""Background callback support through the MCP HTTP endpoint. + +End-to-end flows: trigger a background callback, poll via +``get_background_task_result``, observe progress (``set_progress``), +confirm the cache-expiry behavior, and verify the background-only tools +appear in ``tools/list``. +""" + +import json +import re +import time +from datetime import datetime + +import diskcache +from dash import Dash, Input, Output, html +from dash.background_callback.managers.diskcache_manager import DiskcacheManager + +MCP_PATH = "_mcp" + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def _make_background_app(): + cache = diskcache.Cache() + manager = DiskcacheManager(cache) + + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id="input"), + html.Div(id="output"), + ] + ) + + @app.callback( + Output("output", "children"), + Input("input", "children"), + background=True, + manager=manager, + ) + def slow_callback(value): + time.sleep(0.5) + return f"done: {value}" + + return app + + +def _post(client, method, params=None, request_id=1): + return client.post( + f"/{MCP_PATH}", + data=json.dumps( + { + "jsonrpc": "2.0", + "method": method, + "id": request_id, + "params": params or {}, + } + ), + headers={"Content-Type": "application/json"}, + ) + + +# --------------------------------------------------------------------------- +# Tests +# --------------------------------------------------------------------------- + + +def test_mcpbg012_trigger_poll_and_retrieve(): + app = _make_background_app() + client = app.server.test_client() + + # Trigger + r = _post( + client, + "tools/call", + {"name": "slow_callback", "arguments": {"value": "hello"}}, + ) + assert r.status_code == 200 + data = json.loads(r.data) + task_info = json.loads(data["result"]["content"][0]["text"]) + task_id = task_info["taskId"] + assert task_info["status"] == "working" + + # Read createdAt from the callback manager directly + _, _, cache_key = task_id.split(":", 2) + stored_created_at = app.callback_map["output.children"]["manager"].handle.get( + f"{cache_key}-created_at" + ) + assert stored_created_at is not None + + # Poll — should be working, with createdAt matching the stored value + r = _post( + client, + "tools/call", + { + "name": "get_background_task_result", + "arguments": {"taskId": task_id}, + }, + request_id=2, + ) + assert r.status_code == 200 + poll_data = json.loads(json.loads(r.data)["result"]["content"][0]["text"]) + assert datetime.fromisoformat(poll_data["createdAt"]) == datetime.fromisoformat( + stored_created_at + ) + + # Wait for completion + _, job_id, _ = task_id.split(":", 2) + manager = app.callback_map["output.children"]["manager"] + deadline = time.time() + 5 + while time.time() < deadline: + if not manager.job_running(job_id): + break + time.sleep(0.1) + + # Get result + r = _post( + client, + "tools/call", + { + "name": "get_background_task_result", + "arguments": {"taskId": task_id}, + }, + request_id=3, + ) + assert r.status_code == 200 + data = json.loads(r.data) + text = data["result"]["content"][0]["text"] + assert "done:" in text + + +def test_mcpbg013_result_expires(): + """Result and createdAt are available until the cache expires.""" + cache = diskcache.Cache() + manager = DiskcacheManager(cache, cache_by=[lambda: "fixed"], expire=2) + + app = Dash(__name__) + app.layout = html.Div([html.Div(id="input"), html.Div(id="output")]) + + @app.callback( + Output("output", "children"), + Input("input", "children"), + background=True, + manager=manager, + ) + def fast_cb(value): + return f"done: {value}" + + client = app.server.test_client() + + # Trigger + r = _post( + client, + "tools/call", + {"name": "fast_cb", "arguments": {"value": "hi"}}, + ) + task_info = json.loads(json.loads(r.data)["result"]["content"][0]["text"]) + task_id = task_info["taskId"] + _, job_id, cache_key = task_id.split(":", 2) + + # Wait for job to finish + deadline = time.time() + 3 + while time.time() < deadline: + if not manager.job_running(job_id): + break + time.sleep(0.1) + + # First retrieval — result and createdAt available + r = _post( + client, + "tools/call", + { + "name": "get_background_task_result", + "arguments": {"taskId": task_id}, + }, + request_id=2, + ) + text = json.loads(r.data)["result"]["content"][0]["text"] + assert "done:" in text + created_at = manager.handle.get(f"{cache_key}-created_at") + assert created_at is not None + + # Second retrieval — still available (cache_by keeps it) + r = _post( + client, + "tools/call", + { + "name": "get_background_task_result", + "arguments": {"taskId": task_id}, + }, + request_id=3, + ) + text = json.loads(r.data)["result"]["content"][0]["text"] + assert "done:" in text + assert manager.handle.get(f"{cache_key}-created_at") == created_at + + # Wait for expiry + time.sleep(2.5) + + # After expiry — tool reports failure, createdAt is fresh (stored value gone) + r = _post( + client, + "tools/call", + { + "name": "get_background_task_result", + "arguments": {"taskId": task_id}, + }, + request_id=4, + ) + poll_data = json.loads(json.loads(r.data)["result"]["content"][0]["text"]) + assert poll_data["status"] == "failed" + assert datetime.fromisoformat(poll_data["createdAt"]) > datetime.fromisoformat( + created_at + ) + + +def test_mcpbg014_progress_in_poll_response(): + """Progress reported via set_progress appears in poll statusMessage.""" + cache = diskcache.Cache() + manager = DiskcacheManager(cache) + + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id="input"), + html.Div(id="status"), + html.Div(id="output"), + ] + ) + + @app.callback( + Output("output", "children"), + Input("input", "children"), + progress=Output("status", "children"), + background=True, + manager=manager, + interval=200, + ) + def progress_cb(set_progress, value): + for i in range(10): + set_progress(f"Step {i + 1} of 10") + time.sleep(0.2) + return f"done: {value}" + + client = app.server.test_client() + + # Trigger + r = _post( + client, + "tools/call", + {"name": "progress_cb", "arguments": {"value": "hi"}}, + ) + task_info = json.loads(json.loads(r.data)["result"]["content"][0]["text"]) + task_id = task_info["taskId"] + + # Poll and collect all progress messages + progress_pattern = re.compile(r"Step \d+ of 10") + progress_messages = [] + deadline = time.time() + 10 + while time.time() < deadline: + r = _post( + client, + "tools/call", + { + "name": "get_background_task_result", + "arguments": {"taskId": task_id}, + }, + request_id=2, + ) + text = json.loads(r.data)["result"]["content"][0]["text"] + try: + poll_data = json.loads(text) + msg = poll_data.get("statusMessage") + if msg is not None: + progress_messages.append(msg) + if poll_data.get("status") == "completed": + break + except (json.JSONDecodeError, KeyError): + break + time.sleep(0.3) + + assert len(progress_messages) > 0, "Expected progress updates during polling" + for msg in progress_messages: + assert progress_pattern.search(msg), f"Unexpected progress format: {msg}" + + +def test_mcpbg015_background_tools_in_tools_list(): + app = _make_background_app() + client = app.server.test_client() + r = _post(client, "tools/list") + data = json.loads(r.data) + names = [t["name"] for t in data["result"]["tools"]] + assert "get_background_task_result" in names + assert "cancel_background_task" in names + assert "slow_callback" in names diff --git a/tests/unit/mcp/tools/test_background_callbacks.py b/tests/unit/mcp/tools/test_background_callbacks.py deleted file mode 100644 index 8dc99164f5..0000000000 --- a/tests/unit/mcp/tools/test_background_callbacks.py +++ /dev/null @@ -1,300 +0,0 @@ -"""Tests for background callback support via MCP Tasks API.""" - -import time - -from dash import Dash, Input, Output, html -from dash._get_app import app_context -from dash.background_callback.managers.diskcache_manager import DiskcacheManager -from dash.mcp._server import _process_mcp_message -from dash.mcp.primitives.tools.callback_adapter_collection import ( - CallbackAdapterCollection, -) - - -def _setup_mcp(app): - app_context.set(app) - app.mcp_callback_map = CallbackAdapterCollection(app) - return app - - -def _msg(method, params=None, request_id=1): - d = {"jsonrpc": "2.0", "method": method, "id": request_id} - d["params"] = params if params is not None else {} - return d - - -def _mcp(app, method, params=None, request_id=1): - with app.server.test_request_context(): - _setup_mcp(app) - return _process_mcp_message(_msg(method, params, request_id)) - - -def _make_background_app(): - import diskcache - - cache = diskcache.Cache() - manager = DiskcacheManager(cache) - - app = Dash(__name__) - app.layout = html.Div( - [ - html.Div(id="input"), - html.Div(id="output"), - ] - ) - - @app.callback( - Output("output", "children"), - Input("input", "children"), - background=True, - manager=manager, - ) - def slow_callback(value): - """A background callback.""" - time.sleep(0.3) - return f"done: {value}" - - return app - - -class TestCancelBackgroundTaskTool: - """cancel_background_task tool wrapper.""" - - def test_cancel_via_tool(self): - import json - - app = _make_background_app() - trigger = _mcp( - app, - "tools/call", - { - "name": "slow_callback", - "arguments": {"value": "hello"}, - }, - ) - task_id = json.loads(trigger["result"]["content"][0]["text"])["taskId"] - - cancel = _mcp( - app, - "tools/call", - { - "name": "cancel_background_task", - "arguments": {"taskId": task_id}, - }, - ) - assert cancel["result"].get("isError") is not True - - _, job_id, _ = task_id.split(":", 2) - manager = app.callback_map["output.children"]["manager"] - assert not manager.job_running(job_id) - - -class TestBackgroundToolRegistration: - """Background task tools only appear when app has background callbacks.""" - - def test_present_with_background_callbacks(self): - app = _make_background_app() - tools = _mcp(app, "tools/list")["result"]["tools"] - names = [t["name"] for t in tools] - assert "get_background_task_result" in names - assert "cancel_background_task" in names - - def test_absent_without_background_callbacks(self): - app = Dash(__name__) - app.layout = html.Div([html.Div(id="in"), html.Div(id="out")]) - - @app.callback(Output("out", "children"), Input("in", "children")) - def normal_cb(v): - return v - - tools = _mcp(app, "tools/list")["result"]["tools"] - names = [t["name"] for t in tools] - assert "get_background_task_result" not in names - assert "cancel_background_task" not in names - - -class TestGetBackgroundTaskResult: - """get_background_task_result tool: poll and retrieve results.""" - - def _trigger(self, app): - import json - - result = _mcp( - app, - "tools/call", - { - "name": "slow_callback", - "arguments": {"value": "hello"}, - }, - ) - return json.loads(result["result"]["content"][0]["text"])["taskId"] - - def test_returns_working_while_running(self): - app = _make_background_app() - task_id = self._trigger(app) - poll = _mcp( - app, - "tools/call", - { - "name": "get_background_task_result", - "arguments": {"taskId": task_id}, - }, - ) - text = poll["result"]["content"][0]["text"] - assert "working" in text.lower() - - def test_returns_result_when_complete(self): - app = _make_background_app() - task_id = self._trigger(app) - _, job_id, _ = task_id.split(":", 2) - - # Wait for completion - manager = app.callback_map["output.children"]["manager"] - deadline = time.time() + 3 - while time.time() < deadline: - if not manager.job_running(job_id): - break - time.sleep(0.1) - - result = _mcp( - app, - "tools/call", - { - "name": "get_background_task_result", - "arguments": {"taskId": task_id}, - }, - ) - text = result["result"]["content"][0]["text"] - assert "done:" in text - - -class TestBackgroundCallbackTrigger: - """Calling a background callback tool returns taskId immediately.""" - - def test_returns_task_id(self): - app = _make_background_app() - result = _mcp( - app, - "tools/call", - { - "name": "slow_callback", - "arguments": {"value": "hello"}, - }, - ) - text = result["result"]["content"][0]["text"] - assert "taskId" in text - assert "slow_callback:" in text - - -class TestTasksGet: - """tasks/get derives status from the callback manager.""" - - def test_working_status_while_running(self): - app = _make_background_app() - create_result = _mcp( - app, - "tools/call", - { - "name": "slow_callback", - "arguments": {"value": "hello"}, - "task": {"ttl": 60000}, - }, - ) - task_id = create_result["result"]["task"]["taskId"] - - # Immediately poll — job should still be running - get_result = _mcp(app, "tasks/get", {"taskId": task_id}) - assert get_result["result"]["status"] == "working" - assert get_result["result"]["taskId"] == task_id - - -class TestTasksResult: - """tasks/result retrieves and formats the callback result.""" - - def test_returns_formatted_result_when_complete(self): - app = _make_background_app() - create_result = _mcp( - app, - "tools/call", - { - "name": "slow_callback", - "arguments": {"value": "hello"}, - "task": {"ttl": 60000}, - }, - ) - task_id = create_result["result"]["task"]["taskId"] - tool_name, job_id, cache_key = task_id.split(":", 2) - - # Wait for the background job to finish - manager = app.callback_map["output.children"]["manager"] - deadline = time.time() + 3 - while time.time() < deadline: - if not manager.job_running(job_id): - break - time.sleep(0.1) - - # Fetch the result - result = _mcp(app, "tasks/result", {"taskId": task_id}) - assert "content" in result["result"] - text = result["result"]["content"][0]["text"] - assert "done:" in text - - -class TestTasksCancel: - """tasks/cancel terminates the background job.""" - - def test_cancel_terminates_job(self): - app = _make_background_app() - create_result = _mcp( - app, - "tools/call", - { - "name": "slow_callback", - "arguments": {"value": "hello"}, - "task": {"ttl": 60000}, - }, - ) - task_id = create_result["result"]["task"]["taskId"] - - cancel_result = _mcp(app, "tasks/cancel", {"taskId": task_id}) - assert "error" not in cancel_result - - _, job_id, _ = task_id.split(":", 2) - manager = app.callback_map["output.children"]["manager"] - assert not manager.job_running(job_id) - - -class TestBackgroundCallbackWithTask: - """When tools/call includes task metadata, return CreateTaskResult.""" - - def test_returns_create_task_result(self): - app = _make_background_app() - result = _mcp( - app, - "tools/call", - { - "name": "slow_callback", - "arguments": {"value": "hello"}, - "task": {"ttl": 60000}, - }, - ) - task = result["result"]["task"] - assert task["status"] == "working" - assert "taskId" in task - assert "pollInterval" in task - - def test_task_id_encodes_tool_name_job_id_cache_key(self): - app = _make_background_app() - result = _mcp( - app, - "tools/call", - { - "name": "slow_callback", - "arguments": {"value": "hello"}, - "task": {"ttl": 60000}, - }, - ) - task_id = result["result"]["task"]["taskId"] - tool_name, job_id, cache_key = task_id.split(":", 2) - assert tool_name == "slow_callback" - assert len(cache_key) == 64 # SHA256 hex diff --git a/tests/unit/mcp/tools/test_mcp_background_callbacks.py b/tests/unit/mcp/tools/test_mcp_background_callbacks.py new file mode 100644 index 0000000000..bc6f6b32ed --- /dev/null +++ b/tests/unit/mcp/tools/test_mcp_background_callbacks.py @@ -0,0 +1,277 @@ +"""Background callback support via MCP Tasks. + +Covers both layers: +- Layer 1 (``dash/mcp/tasks/``): ``tasks/get``, ``tasks/result``, ``tasks/cancel`` + derived on-demand from the callback manager. +- Layer 2 (tool wrappers): ``get_background_task_result`` and + ``cancel_background_task`` — only registered when the app has + background callbacks. +""" + +import json +import time + +import diskcache +from dash import Dash, Input, Output, html +from dash.background_callback.managers.diskcache_manager import DiskcacheManager +from dash.mcp._server import _process_mcp_message + +from tests.unit.mcp.conftest import _setup_mcp + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def _msg(method, params=None, request_id=1): + d = {"jsonrpc": "2.0", "method": method, "id": request_id} + d["params"] = params if params is not None else {} + return d + + +def _mcp(app, method, params=None, request_id=1): + with app.server.test_request_context(): + _setup_mcp(app) + return _process_mcp_message(_msg(method, params, request_id)) + + +def _make_background_app(): + cache = diskcache.Cache() + manager = DiskcacheManager(cache) + + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id="input"), + html.Div(id="output"), + ] + ) + + @app.callback( + Output("output", "children"), + Input("input", "children"), + background=True, + manager=manager, + ) + def slow_callback(value): + """A background callback.""" + time.sleep(0.3) + return f"done: {value}" + + return app + + +def _trigger_task(app): + """Call slow_callback via tools/call and return its taskId.""" + result = _mcp( + app, + "tools/call", + {"name": "slow_callback", "arguments": {"value": "hello"}}, + ) + return json.loads(result["result"]["content"][0]["text"])["taskId"] + + +def _wait_for_completion(app, task_id, timeout=3): + """Block until the callback manager reports the job is no longer running.""" + _, job_id, _ = task_id.split(":", 2) + manager = app.callback_map["output.children"]["manager"] + deadline = time.time() + timeout + while time.time() < deadline: + if not manager.job_running(job_id): + return + time.sleep(0.1) + + +# --------------------------------------------------------------------------- +# Tool-layer: cancel_background_task, get_background_task_result, registration +# --------------------------------------------------------------------------- + + +def test_mcpbg001_cancel_via_tool(): + app = _make_background_app() + task_id = _trigger_task(app) + + cancel = _mcp( + app, + "tools/call", + { + "name": "cancel_background_task", + "arguments": {"taskId": task_id}, + }, + ) + assert cancel["result"].get("isError") is not True + + _, job_id, _ = task_id.split(":", 2) + manager = app.callback_map["output.children"]["manager"] + assert not manager.job_running(job_id) + + +def test_mcpbg002_present_with_background_callbacks(): + app = _make_background_app() + tools = _mcp(app, "tools/list")["result"]["tools"] + names = [t["name"] for t in tools] + assert "get_background_task_result" in names + assert "cancel_background_task" in names + + +def test_mcpbg003_absent_without_background_callbacks(): + app = Dash(__name__) + app.layout = html.Div([html.Div(id="in"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("in", "children")) + def normal_cb(v): + return v + + tools = _mcp(app, "tools/list")["result"]["tools"] + names = [t["name"] for t in tools] + assert "get_background_task_result" not in names + assert "cancel_background_task" not in names + + +def test_mcpbg004_returns_working_while_running(): + app = _make_background_app() + task_id = _trigger_task(app) + poll = _mcp( + app, + "tools/call", + { + "name": "get_background_task_result", + "arguments": {"taskId": task_id}, + }, + ) + text = poll["result"]["content"][0]["text"] + assert "working" in text.lower() + + +def test_mcpbg005_returns_result_when_complete(): + app = _make_background_app() + task_id = _trigger_task(app) + _wait_for_completion(app, task_id) + + result = _mcp( + app, + "tools/call", + { + "name": "get_background_task_result", + "arguments": {"taskId": task_id}, + }, + ) + text = result["result"]["content"][0]["text"] + assert "done:" in text + + +def test_mcpbg006_returns_task_id(): + """Calling a background callback tool returns a taskId immediately.""" + app = _make_background_app() + result = _mcp( + app, + "tools/call", + {"name": "slow_callback", "arguments": {"value": "hello"}}, + ) + text = result["result"]["content"][0]["text"] + assert "taskId" in text + assert "slow_callback:" in text + + +# --------------------------------------------------------------------------- +# Tasks-protocol layer: tasks/get, tasks/result, tasks/cancel +# --------------------------------------------------------------------------- + + +def test_mcpbg007_tasks_get_working_status_while_running(): + app = _make_background_app() + create_result = _mcp( + app, + "tools/call", + { + "name": "slow_callback", + "arguments": {"value": "hello"}, + "task": {"ttl": 60000}, + }, + ) + task_id = create_result["result"]["task"]["taskId"] + + get_result = _mcp(app, "tasks/get", {"taskId": task_id}) + assert get_result["result"]["status"] == "working" + assert get_result["result"]["taskId"] == task_id + + +def test_mcpbg008_tasks_result_returns_formatted_result(): + app = _make_background_app() + create_result = _mcp( + app, + "tools/call", + { + "name": "slow_callback", + "arguments": {"value": "hello"}, + "task": {"ttl": 60000}, + }, + ) + task_id = create_result["result"]["task"]["taskId"] + _wait_for_completion(app, task_id) + + result = _mcp(app, "tasks/result", {"taskId": task_id}) + assert "content" in result["result"] + text = result["result"]["content"][0]["text"] + assert "done:" in text + + +def test_mcpbg009_tasks_cancel_terminates_job(): + app = _make_background_app() + create_result = _mcp( + app, + "tools/call", + { + "name": "slow_callback", + "arguments": {"value": "hello"}, + "task": {"ttl": 60000}, + }, + ) + task_id = create_result["result"]["task"]["taskId"] + + cancel_result = _mcp(app, "tasks/cancel", {"taskId": task_id}) + assert "error" not in cancel_result + + _, job_id, _ = task_id.split(":", 2) + manager = app.callback_map["output.children"]["manager"] + assert not manager.job_running(job_id) + + +# --------------------------------------------------------------------------- +# tools/call with task metadata → CreateTaskResult + taskId encoding +# --------------------------------------------------------------------------- + + +def test_mcpbg010_returns_create_task_result(): + app = _make_background_app() + result = _mcp( + app, + "tools/call", + { + "name": "slow_callback", + "arguments": {"value": "hello"}, + "task": {"ttl": 60000}, + }, + ) + task = result["result"]["task"] + assert task["status"] == "working" + assert "taskId" in task + assert "pollInterval" in task + + +def test_mcpbg011_task_id_encodes_tool_name_job_id_cache_key(): + app = _make_background_app() + result = _mcp( + app, + "tools/call", + { + "name": "slow_callback", + "arguments": {"value": "hello"}, + "task": {"ttl": 60000}, + }, + ) + task_id = result["result"]["task"]["taskId"] + tool_name, _job_id, cache_key = task_id.split(":", 2) + assert tool_name == "slow_callback" + assert len(cache_key) == 64 # SHA256 hex From bf442f789362ed7e251859affe82ff83c99e55d8 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 30 Apr 2026 10:49:28 -0600 Subject: [PATCH 070/103] lint --- .../description_background_callbacks.py | 3 +- dash/mcp/primitives/tools/results/__init__.py | 34 +++++++++++-------- .../primitives/tools/tool_background_tasks.py | 5 +-- dash/mcp/primitives/tools/tools_callbacks.py | 1 + dash/mcp/tasks/tasks.py | 16 +++++---- 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/dash/mcp/primitives/tools/descriptions/description_background_callbacks.py b/dash/mcp/primitives/tools/descriptions/description_background_callbacks.py index 3823e06e0b..eada24a01e 100644 --- a/dash/mcp/primitives/tools/descriptions/description_background_callbacks.py +++ b/dash/mcp/primitives/tools/descriptions/description_background_callbacks.py @@ -8,6 +8,7 @@ from typing import TYPE_CHECKING +from ..tool_background_tasks import GET_RESULT_TOOL_NAME from .base import ToolDescriptionSource if TYPE_CHECKING: @@ -19,9 +20,9 @@ class BackgroundCallbackDescription(ToolDescriptionSource): @classmethod def describe(cls, callback: CallbackAdapter) -> list[str]: + # pylint: disable-next=protected-access if not callback._cb_info.get("background"): return [] - from ..tool_background_tasks import GET_RESULT_TOOL_NAME return [ "", diff --git a/dash/mcp/primitives/tools/results/__init__.py b/dash/mcp/primitives/tools/results/__init__.py index 10f364959b..12f9507da7 100644 --- a/dash/mcp/primitives/tools/results/__init__.py +++ b/dash/mcp/primitives/tools/results/__init__.py @@ -7,17 +7,19 @@ from __future__ import annotations import json -from typing import Any +from typing import TYPE_CHECKING, Any from mcp.types import CallToolResult, CreateTaskResult, TextContent from dash.types import CallbackExecutionResponse -from dash.mcp.primitives.tools.callback_adapter import CallbackAdapter from .base import ResultFormatter from .result_dataframe import DataFrameResult from .result_plotly_figure import PlotlyFigureResult +if TYPE_CHECKING: + from dash.mcp.primitives.tools.callback_adapter import CallbackAdapter + _RESULT_FORMATTERS: list[type[ResultFormatter]] = [ PlotlyFigureResult, DataFrameResult, @@ -61,17 +63,21 @@ def task_result_to_tool_result(create_task_result: CreateTaskResult) -> CallTool """ task = create_task_result.task return CallToolResult( - content=[TextContent( - type="text", - text=json.dumps({ - "taskId": task.taskId, - "status": task.status, - "pollInterval": task.pollInterval, - "message": ( - "This is a long-running background callback. " - "Call the get_background_task_result tool with this taskId " - "to poll for the result." + content=[ + TextContent( + type="text", + text=json.dumps( + { + "taskId": task.taskId, + "status": task.status, + "pollInterval": task.pollInterval, + "message": ( + "This is a long-running background callback. " + "Call the get_background_task_result tool with this taskId " + "to poll for the result." + ), + } ), - }), - )], + ) + ], ) diff --git a/dash/mcp/primitives/tools/tool_background_tasks.py b/dash/mcp/primitives/tools/tool_background_tasks.py index 37f76a9d4d..a4dffa23f4 100644 --- a/dash/mcp/primitives/tools/tool_background_tasks.py +++ b/dash/mcp/primitives/tools/tool_background_tasks.py @@ -21,10 +21,7 @@ def _has_background_callbacks() -> bool: - return any( - cb_info.get("background") - for cb_info in get_app().callback_map.values() - ) + return any(cb_info.get("background") for cb_info in get_app().callback_map.values()) class BackgroundTaskTools(MCPToolProvider): diff --git a/dash/mcp/primitives/tools/tools_callbacks.py b/dash/mcp/primitives/tools/tools_callbacks.py index 990f90e285..97970c5df7 100644 --- a/dash/mcp/primitives/tools/tools_callbacks.py +++ b/dash/mcp/primitives/tools/tools_callbacks.py @@ -47,6 +47,7 @@ def call_tool( " Please call tools/list to refresh your tool list." ) + # pylint: disable-next=protected-access is_background = bool(cb._cb_info.get("background")) try: diff --git a/dash/mcp/tasks/tasks.py b/dash/mcp/tasks/tasks.py index 877b84795b..aab1a98f85 100644 --- a/dash/mcp/tasks/tasks.py +++ b/dash/mcp/tasks/tasks.py @@ -6,7 +6,7 @@ from datetime import datetime, timezone from typing import Any -from mcp.types import CreateTaskResult, GetTaskResult, Task +from mcp.types import CancelTaskResult, CreateTaskResult, GetTaskResult, Task from dash import get_app from dash.mcp.primitives.tools.results import format_callback_response @@ -33,6 +33,7 @@ def create_task(dispatch_response: dict[str, Any], callback) -> CreateTaskResult cache_key = dispatch_response["cacheKey"] job_id = str(dispatch_response["job"]) task_id = f"{callback.tool_name}:{job_id}:{cache_key}" + # pylint: disable-next=protected-access interval = callback._cb_info.get("background", {}).get("interval", 1000) now = datetime.now(timezone.utc) return CreateTaskResult( @@ -75,6 +76,7 @@ def get_task(task_id: str) -> GetTaskResult: adapter = get_app().mcp_callback_map.find_by_tool_name(tool_name) interval = None if adapter is not None: + # pylint: disable-next=protected-access interval = adapter._cb_info.get("background", {}).get("interval", 1000) now = datetime.now(timezone.utc) @@ -82,7 +84,9 @@ def get_task(task_id: str) -> GetTaskResult: taskId=task_id, status=status, statusMessage=str(progress) if progress else None, - createdAt=datetime.fromisoformat(manager.handle.get(f"{cache_key}-created_at") or now.isoformat()), + createdAt=datetime.fromisoformat( + manager.handle.get(f"{cache_key}-created_at") or now.isoformat() + ), lastUpdatedAt=now, ttl=manager.expire * 1000 if manager.expire else None, pollInterval=interval, @@ -117,7 +121,9 @@ def get_task_result(task_id: str) -> Any: response_data = json.loads(response.get_data(as_text=True)) if "response" not in response_data: - raise MCPError("Task result not ready. Poll tasks/get until status is 'completed'.") + raise MCPError( + "Task result not ready. Poll tasks/get until status is 'completed'." + ) return format_callback_response(response_data, adapter) @@ -127,9 +133,7 @@ def cancel_task(task_id: str) -> Any: Same underlying mechanism as the renderer's cancelJob query param. """ - from mcp.types import CancelTaskResult - - tool_name, job_id, cache_key = parse_task_id(task_id) + _tool_name, job_id, cache_key = parse_task_id(task_id) manager = _get_callback_manager() if manager is None: From 576145c3ff67553f7dc52598d458ff3eced68b37 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Fri, 8 May 2026 16:28:51 -0600 Subject: [PATCH 071/103] Install diskcache extra in lint-unit and typing CI jobs --- .github/workflows/testing.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 358f9fd2d2..bb9b10a016 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -108,7 +108,7 @@ jobs: run: | python -m pip install --upgrade pip wheel python -m pip install "setuptools<80.0.0" - find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[dev,ci,testing]"' \; + find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[dev,ci,testing,diskcache]"' \; - name: Install dash-renderer dependencies working-directory: dash/dash-renderer @@ -231,7 +231,7 @@ jobs: run: | python -m pip install --upgrade pip wheel python -m pip install "setuptools<80.0.0" - find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[ci,testing,dev]"' \; + find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[ci,testing,dev,diskcache]"' \; - name: Build/Setup test components run: npm run setup-tests.py # TODO build the packages and save them to packages/ in build job From 0fef9b8bdbc907047a901baa270752bd8632bb47 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Fri, 8 May 2026 16:45:16 -0600 Subject: [PATCH 072/103] Fix mypy errors in CI --- dash/background_callback/managers/diskcache_manager.py | 2 +- dash/mcp/primitives/tools/tools_callbacks.py | 2 +- dash/mcp/tasks/tasks.py | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/dash/background_callback/managers/diskcache_manager.py b/dash/background_callback/managers/diskcache_manager.py index db7cd112bc..2ded7eb48e 100644 --- a/dash/background_callback/managers/diskcache_manager.py +++ b/dash/background_callback/managers/diskcache_manager.py @@ -36,7 +36,7 @@ def __init__(self, cache=None, cache_by=None, expire=None): is determined by the default behavior of the ``cache`` instance. """ try: - import diskcache # type: ignore[import-not-found] # pylint: disable=import-outside-toplevel + import diskcache # type: ignore[import-not-found,import-untyped] # pylint: disable=import-outside-toplevel import psutil # type: ignore[import-untyped] # noqa: F401,E402 pylint: disable=import-outside-toplevel,unused-import,unused-variable,import-error import multiprocess # type: ignore[import-untyped] # noqa: F401,E402 pylint: disable=import-outside-toplevel,unused-import,unused-variable except ImportError as missing_imports: diff --git a/dash/mcp/primitives/tools/tools_callbacks.py b/dash/mcp/primitives/tools/tools_callbacks.py index 97970c5df7..2a2d866ea9 100644 --- a/dash/mcp/primitives/tools/tools_callbacks.py +++ b/dash/mcp/primitives/tools/tools_callbacks.py @@ -59,7 +59,7 @@ def call_tool( ) if is_background: - task_result = create_task(callback_response, cb) + task_result = create_task(dict(callback_response), cb) if task is not None: return task_result return task_result_to_tool_result(task_result) diff --git a/dash/mcp/tasks/tasks.py b/dash/mcp/tasks/tasks.py index aab1a98f85..763f25352b 100644 --- a/dash/mcp/tasks/tasks.py +++ b/dash/mcp/tasks/tasks.py @@ -4,7 +4,7 @@ import json from datetime import datetime, timezone -from typing import Any +from typing import Any, Literal from mcp.types import CancelTaskResult, CreateTaskResult, GetTaskResult, Task @@ -15,7 +15,8 @@ def parse_task_id(task_id: str) -> tuple[str, str, str]: """Parse a taskId into (tool_name, job_id, cache_key).""" - return task_id.split(":", 2) + tool_name, job_id, cache_key = task_id.split(":", 2) + return tool_name, job_id, cache_key def _get_callback_manager(): @@ -66,6 +67,7 @@ def get_task(task_id: str) -> GetTaskResult: running = manager.job_running(job_id) progress = manager.get_progress(cache_key) + status: Literal["working", "completed", "failed"] if running: status = "working" elif manager.result_ready(cache_key): From fd8c8d972f9fb58b539aa24166f9249ebe67c79d Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Tue, 12 May 2026 09:01:57 -0600 Subject: [PATCH 073/103] Fix bug storing metadata on background callbacks --- dash/_callback.py | 6 - dash/mcp/tasks/tasks.py | 60 +++++----- .../mcp/test_mcp_background_tasks.py | 112 +++++++++++------- .../tools/test_mcp_background_callbacks.py | 3 +- 4 files changed, 100 insertions(+), 81 deletions(-) diff --git a/dash/_callback.py b/dash/_callback.py index c7e4cb4102..a8c5a93996 100644 --- a/dash/_callback.py +++ b/dash/_callback.py @@ -446,12 +446,6 @@ def _setup_background_callback( ctx_value, ) - callback_manager.handle.set( - f"{cache_key}-created_at", - datetime.now(timezone.utc).isoformat(), - expire=callback_manager.expire, - ) - data = { "cacheKey": cache_key, "job": job, diff --git a/dash/mcp/tasks/tasks.py b/dash/mcp/tasks/tasks.py index 763f25352b..2d5df45b23 100644 --- a/dash/mcp/tasks/tasks.py +++ b/dash/mcp/tasks/tasks.py @@ -13,30 +13,33 @@ from dash.mcp.types import MCPError -def parse_task_id(task_id: str) -> tuple[str, str, str]: - """Parse a taskId into (tool_name, job_id, cache_key).""" - tool_name, job_id, cache_key = task_id.split(":", 2) - return tool_name, job_id, cache_key +def parse_task_id(task_id: str) -> tuple[str, str, str, datetime]: + """Parse a taskId into (tool_name, job_id, cache_key, created_at).""" + tool_name, job_id, rest = task_id.split(":", 2) + cache_key, created_epoch = rest.rsplit(":", 1) + created_at = datetime.fromtimestamp(int(created_epoch), tz=timezone.utc) + return tool_name, job_id, cache_key, created_at -def _get_callback_manager(): - """Get the background callback manager from the app's callback_map.""" - app = get_app() - for cb_info in app.callback_map.values(): - manager = cb_info.get("manager") - if manager is not None: - return manager - return None +def _get_callback_manager(tool_name: str): + """Resolve the background callback manager for a specific MCP tool.""" + adapter = get_app().mcp_callback_map.find_by_tool_name(tool_name) + if adapter is None: + return None + # pylint: disable-next=protected-access + return adapter._cb_info.get("manager") def create_task(dispatch_response: dict[str, Any], callback) -> CreateTaskResult: """Create a Task from a background callback's initial dispatch response.""" cache_key = dispatch_response["cacheKey"] job_id = str(dispatch_response["job"]) - task_id = f"{callback.tool_name}:{job_id}:{cache_key}" + now = datetime.now(timezone.utc) + # taskId encodes creation time so subsequent polls return a stable + # createdAt without server-side storage (works across gunicorn workers). + task_id = f"{callback.tool_name}:{job_id}:{cache_key}:{int(now.timestamp())}" # pylint: disable-next=protected-access interval = callback._cb_info.get("background", {}).get("interval", 1000) - now = datetime.now(timezone.utc) return CreateTaskResult( task=Task( taskId=task_id, @@ -51,15 +54,15 @@ def create_task(dispatch_response: dict[str, Any], callback) -> CreateTaskResult def get_task(task_id: str) -> GetTaskResult: """Handle tasks/get — derive status from the callback manager.""" - tool_name, job_id, cache_key = parse_task_id(task_id) + tool_name, job_id, cache_key, created_at = parse_task_id(task_id) - manager = _get_callback_manager() + manager = _get_callback_manager(tool_name) if manager is None: return GetTaskResult( taskId=task_id, status="failed", statusMessage="No background callback manager configured.", - createdAt=datetime.now(timezone.utc), + createdAt=created_at, lastUpdatedAt=datetime.now(timezone.utc), ttl=None, ) @@ -81,15 +84,12 @@ def get_task(task_id: str) -> GetTaskResult: # pylint: disable-next=protected-access interval = adapter._cb_info.get("background", {}).get("interval", 1000) - now = datetime.now(timezone.utc) return GetTaskResult( taskId=task_id, status=status, statusMessage=str(progress) if progress else None, - createdAt=datetime.fromisoformat( - manager.handle.get(f"{cache_key}-created_at") or now.isoformat() - ), - lastUpdatedAt=now, + createdAt=created_at, + lastUpdatedAt=datetime.now(timezone.utc), ttl=manager.expire * 1000 if manager.expire else None, pollInterval=interval, ) @@ -100,9 +100,9 @@ def get_task_result(task_id: str) -> Any: Mirrors the Dash renderer: calls get_result() which clears from cache. """ - tool_name, job_id, cache_key = parse_task_id(task_id) + tool_name, job_id, cache_key, _created_at = parse_task_id(task_id) - manager = _get_callback_manager() + manager = _get_callback_manager(tool_name) if manager is None: raise MCPError("No background callback manager configured.") @@ -135,22 +135,18 @@ def cancel_task(task_id: str) -> Any: Same underlying mechanism as the renderer's cancelJob query param. """ - _tool_name, job_id, cache_key = parse_task_id(task_id) + tool_name, job_id, _cache_key, created_at = parse_task_id(task_id) - manager = _get_callback_manager() + manager = _get_callback_manager(tool_name) if manager is None: raise MCPError("No background callback manager configured.") manager.terminate_job(job_id) - now = datetime.now(timezone.utc) - created_at = manager.handle.get(f"{cache_key}-created_at") - manager.handle.delete(f"{cache_key}-created_at") - return CancelTaskResult( taskId=task_id, status="cancelled", - createdAt=datetime.fromisoformat(created_at) if created_at else now, - lastUpdatedAt=now, + createdAt=created_at, + lastUpdatedAt=datetime.now(timezone.utc), ttl=manager.expire * 1000 if manager.expire else None, ) diff --git a/tests/integration/mcp/test_mcp_background_tasks.py b/tests/integration/mcp/test_mcp_background_tasks.py index e3e0c0acdf..8f8b946754 100644 --- a/tests/integration/mcp/test_mcp_background_tasks.py +++ b/tests/integration/mcp/test_mcp_background_tasks.py @@ -9,7 +9,6 @@ import json import re import time -from datetime import datetime import diskcache from dash import Dash, Input, Output, html @@ -84,14 +83,7 @@ def test_mcpbg012_trigger_poll_and_retrieve(): task_id = task_info["taskId"] assert task_info["status"] == "working" - # Read createdAt from the callback manager directly - _, _, cache_key = task_id.split(":", 2) - stored_created_at = app.callback_map["output.children"]["manager"].handle.get( - f"{cache_key}-created_at" - ) - assert stored_created_at is not None - - # Poll — should be working, with createdAt matching the stored value + # Poll — should be working r = _post( client, "tools/call", @@ -103,12 +95,10 @@ def test_mcpbg012_trigger_poll_and_retrieve(): ) assert r.status_code == 200 poll_data = json.loads(json.loads(r.data)["result"]["content"][0]["text"]) - assert datetime.fromisoformat(poll_data["createdAt"]) == datetime.fromisoformat( - stored_created_at - ) + assert poll_data["status"] == "working" # Wait for completion - _, job_id, _ = task_id.split(":", 2) + job_id = task_id.split(":")[1] manager = app.callback_map["output.children"]["manager"] deadline = time.time() + 5 while time.time() < deadline: @@ -133,7 +123,7 @@ def test_mcpbg012_trigger_poll_and_retrieve(): def test_mcpbg013_result_expires(): - """Result and createdAt are available until the cache expires.""" + """Result is retrievable until the cache expires, then reports failure.""" cache = diskcache.Cache() manager = DiskcacheManager(cache, cache_by=[lambda: "fixed"], expire=2) @@ -151,7 +141,6 @@ def fast_cb(value): client = app.server.test_client() - # Trigger r = _post( client, "tools/call", @@ -159,16 +148,15 @@ def fast_cb(value): ) task_info = json.loads(json.loads(r.data)["result"]["content"][0]["text"]) task_id = task_info["taskId"] - _, job_id, cache_key = task_id.split(":", 2) + job_id = task_id.split(":")[1] - # Wait for job to finish deadline = time.time() + 3 while time.time() < deadline: if not manager.job_running(job_id): break time.sleep(0.1) - # First retrieval — result and createdAt available + # Before expiry — result available r = _post( client, "tools/call", @@ -178,29 +166,11 @@ def fast_cb(value): }, request_id=2, ) - text = json.loads(r.data)["result"]["content"][0]["text"] - assert "done:" in text - created_at = manager.handle.get(f"{cache_key}-created_at") - assert created_at is not None + assert "done:" in json.loads(r.data)["result"]["content"][0]["text"] - # Second retrieval — still available (cache_by keeps it) - r = _post( - client, - "tools/call", - { - "name": "get_background_task_result", - "arguments": {"taskId": task_id}, - }, - request_id=3, - ) - text = json.loads(r.data)["result"]["content"][0]["text"] - assert "done:" in text - assert manager.handle.get(f"{cache_key}-created_at") == created_at - - # Wait for expiry time.sleep(2.5) - # After expiry — tool reports failure, createdAt is fresh (stored value gone) + # After expiry — tool reports failure r = _post( client, "tools/call", @@ -208,13 +178,10 @@ def fast_cb(value): "name": "get_background_task_result", "arguments": {"taskId": task_id}, }, - request_id=4, + request_id=3, ) poll_data = json.loads(json.loads(r.data)["result"]["content"][0]["text"]) assert poll_data["status"] == "failed" - assert datetime.fromisoformat(poll_data["createdAt"]) > datetime.fromisoformat( - created_at - ) def test_mcpbg014_progress_in_poll_response(): @@ -296,3 +263,64 @@ def test_mcpbg015_background_tools_in_tools_list(): assert "get_background_task_result" in names assert "cancel_background_task" in names assert "slow_callback" in names + + +def test_mcpbg016_per_callback_manager_lookup(): + """``tasks/get`` uses the manager attached to the specific callback.""" + manager_a = DiskcacheManager(diskcache.Cache()) + manager_b = DiskcacheManager(diskcache.Cache()) + + app = Dash(__name__) + app.layout = html.Div( + [ + html.Div(id="input_a"), + html.Div(id="output_a"), + html.Div(id="input_b"), + html.Div(id="output_b"), + ] + ) + + @app.callback( + Output("output_a", "children"), + Input("input_a", "children"), + background=True, + manager=manager_a, + ) + def callback_a(value): + time.sleep(0.5) + return f"a: {value}" + + @app.callback( + Output("output_b", "children"), + Input("input_b", "children"), + background=True, + manager=manager_b, + ) + def callback_b(value): + time.sleep(0.5) + return f"b: {value}" + + client = app.server.test_client() + + r = _post( + client, + "tools/call", + {"name": "callback_b", "arguments": {"value": "hello"}}, + ) + assert r.status_code == 200 + task_info = json.loads(json.loads(r.data)["result"]["content"][0]["text"]) + task_id = task_info["taskId"] + cache_key = task_id.split(":")[2] + + deadline = time.time() + 5 + while time.time() < deadline: + if manager_b.result_ready(cache_key): + break + time.sleep(0.1) + + assert manager_b.result_ready(cache_key) + assert not manager_a.result_ready(cache_key) + + r = _post(client, "tasks/get", {"taskId": task_id}, request_id=2) + assert r.status_code == 200 + assert json.loads(r.data)["result"]["status"] == "completed" diff --git a/tests/unit/mcp/tools/test_mcp_background_callbacks.py b/tests/unit/mcp/tools/test_mcp_background_callbacks.py index bc6f6b32ed..ffd4fb5bac 100644 --- a/tests/unit/mcp/tools/test_mcp_background_callbacks.py +++ b/tests/unit/mcp/tools/test_mcp_background_callbacks.py @@ -272,6 +272,7 @@ def test_mcpbg011_task_id_encodes_tool_name_job_id_cache_key(): }, ) task_id = result["result"]["task"]["taskId"] - tool_name, _job_id, cache_key = task_id.split(":", 2) + tool_name, _job_id, cache_key, created_epoch = task_id.split(":") assert tool_name == "slow_callback" assert len(cache_key) == 64 # SHA256 hex + assert created_epoch.isdigit() From 3cc14d8f4fd940246015ba58ec5f4f4c96a5f203 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 13 May 2026 11:00:28 -0600 Subject: [PATCH 074/103] Enable programmatic querying of background callback status/result; remove Flask dependency in MCP implementation --- dash/_callback.py | 48 +++++++++++++++++++++-------- dash/mcp/tasks/tasks.py | 67 ++++++++++++++++++++++++++++++----------- 2 files changed, 85 insertions(+), 30 deletions(-) diff --git a/dash/_callback.py b/dash/_callback.py index a8c5a93996..037f3d189b 100644 --- a/dash/_callback.py +++ b/dash/_callback.py @@ -1,7 +1,6 @@ import collections import hashlib import inspect -from datetime import datetime, timezone from functools import wraps from typing import Callable, Optional, Any, List, Tuple, Union, Dict, TypeVar, cast @@ -463,10 +462,13 @@ def _setup_background_callback( return to_json(data) -def _progress_background_callback(response, callback_manager, background): +def _progress_background_callback( + response, callback_manager, background, cache_key=None +): progress_outputs = background.get("progress") - adapter = get_app().backend.request_adapter() - cache_key = adapter.args.get("cacheKey") + if cache_key is None: + adapter = get_app().backend.request_adapter() + cache_key = adapter.args.get("cacheKey") if progress_outputs: # Get the progress before the result as it would be erased after the results. @@ -478,21 +480,38 @@ def _progress_background_callback(response, callback_manager, background): def _update_background_callback( - error_handler, callback_ctx, response, kwargs, background, multi + error_handler, + callback_ctx, + response, + kwargs, + background, + multi, + cache_key=None, + job_id=None, ): """Set up the background callback and manage jobs.""" callback_manager = _get_callback_manager(kwargs, background) - adapter = get_app().backend.request_adapter() - cache_key = adapter.args.get("cacheKey") if adapter else None - job_id = adapter.args.get("job") if adapter else None + if cache_key is None or job_id is None: + adapter = get_app().backend.request_adapter() + cache_key = cache_key or (adapter.args.get("cacheKey") if adapter else None) + job_id = job_id or (adapter.args.get("job") if adapter else None) - _progress_background_callback(response, callback_manager, background) + _progress_background_callback( + response, callback_manager, background, cache_key=cache_key + ) output_value = callback_manager.get_result(cache_key, job_id) return _handle_rest_background_callback( - output_value, callback_manager, response, error_handler, callback_ctx, multi + output_value, + callback_manager, + response, + error_handler, + callback_ctx, + multi, + cache_key=cache_key, + job_id=job_id, ) @@ -504,10 +523,13 @@ def _handle_rest_background_callback( callback_ctx, multi, has_update=False, + cache_key=None, + job_id=None, ): - adapter = get_app().backend.request_adapter() - cache_key = adapter.args.get("cacheKey") if adapter else None - job_id = adapter.args.get("job") if adapter else None + if cache_key is None or job_id is None: + adapter = get_app().backend.request_adapter() + cache_key = cache_key or (adapter.args.get("cacheKey") if adapter else None) + job_id = job_id or (adapter.args.get("job") if adapter else None) # Must get job_running after get_result since get_results terminates it. job_running = callback_manager.job_running(job_id) if not job_running and output_value is callback_manager.UNDEFINED: diff --git a/dash/mcp/tasks/tasks.py b/dash/mcp/tasks/tasks.py index 2d5df45b23..ab0fd82069 100644 --- a/dash/mcp/tasks/tasks.py +++ b/dash/mcp/tasks/tasks.py @@ -2,13 +2,15 @@ from __future__ import annotations -import json from datetime import datetime, timezone from typing import Any, Literal from mcp.types import CancelTaskResult, CreateTaskResult, GetTaskResult, Task from dash import get_app +from dash._callback import _update_background_callback, _prepare_response +from dash._utils import AttributeDict, split_callback_id +from dash.development.base_component import ComponentRegistry from dash.mcp.primitives.tools.results import format_callback_response from dash.mcp.types import MCPError @@ -98,7 +100,10 @@ def get_task(task_id: str) -> GetTaskResult: def get_task_result(task_id: str) -> Any: """Handle tasks/result — retrieve and format the callback result. - Mirrors the Dash renderer: calls get_result() which clears from cache. + Uses the framework's background callback retrieval functions + (``_update_background_callback`` and ``_prepare_response``) with + ``cache_key`` and ``job_id`` supplied directly, bypassing the + request adapter query-param lookup. """ tool_name, job_id, cache_key, _created_at = parse_task_id(task_id) @@ -106,28 +111,56 @@ def get_task_result(task_id: str) -> Any: if manager is None: raise MCPError("No background callback manager configured.") - # Mirror the renderer: dispatch with cacheKey/job query params. - # The framework handles result retrieval, wrapping, and cleanup. - adapter = get_app().mcp_callback_map.find_by_tool_name(tool_name) - body = adapter.as_callback_body({}) app = get_app() + adapter = app.mcp_callback_map.find_by_tool_name(tool_name) + # pylint: disable-next=protected-access + cb_info = adapter._cb_info + background = cb_info.get("background") + has_output = not cb_info.get("no_output") + multi = adapter.output_id.startswith("..") + output = split_callback_id(adapter.output_id) - with app.server.test_request_context( - f"/_dash-update-component?cacheKey={cache_key}&job={job_id}", - method="POST", - data=json.dumps(body, default=str), - content_type="application/json", - ): - response = app.dispatch() - - response_data = json.loads(response.get_data(as_text=True)) + # Build the body to get output_spec, same as as_callback_body + body = adapter.as_callback_body({}) + output_spec = body.get("outputs", []) + + callback_ctx = AttributeDict({"updated_props": {}}) + response = {"multi": True} + + output_value, has_update, skip = _update_background_callback( + error_handler=None, + callback_ctx=callback_ctx, + response=response, + kwargs={"background_callback_manager": manager}, + background=background, + multi=multi, + cache_key=cache_key, + job_id=job_id, + ) - if "response" not in response_data: + if skip: + # Result not ready — still polling raise MCPError( "Task result not ready. Poll tasks/get until status is 'completed'." ) - return format_callback_response(response_data, adapter) + _prepare_response( + output_value, + output_spec, + multi, + response, + callback_ctx, + app, + set(ComponentRegistry.registry), + background, + has_update, + has_output, + output, + adapter.output_id, + cb_info.get("allow_dynamic_callbacks"), + ) + + return format_callback_response(response, adapter) def cancel_task(task_id: str) -> Any: From 9d5fa6181623a14502b5ecb00ea6b5489907a330 Mon Sep 17 00:00:00 2001 From: robertclaus Date: Fri, 15 May 2026 15:55:25 -0500 Subject: [PATCH 075/103] Fix get_task status race and CallbackExecutionResponse type annotation - Reorder status checks in get_task: result_ready takes priority over job_running. A background process can write its result to the cache before the process fully exits, causing a false "working" status even after the result is available (fixes test_mcpbg016). - Annotate response as CallbackExecutionResponse so mypy accepts it as the argument to _prepare_response and format_callback_response (fixes Typing Tests CI failure). Co-Authored-By: Claude Sonnet 4.6 --- dash/mcp/tasks/tasks.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/dash/mcp/tasks/tasks.py b/dash/mcp/tasks/tasks.py index ab0fd82069..044ee74d25 100644 --- a/dash/mcp/tasks/tasks.py +++ b/dash/mcp/tasks/tasks.py @@ -13,6 +13,7 @@ from dash.development.base_component import ComponentRegistry from dash.mcp.primitives.tools.results import format_callback_response from dash.mcp.types import MCPError +from dash.types import CallbackExecutionResponse def parse_task_id(task_id: str) -> tuple[str, str, str, datetime]: @@ -72,11 +73,13 @@ def get_task(task_id: str) -> GetTaskResult: running = manager.job_running(job_id) progress = manager.get_progress(cache_key) + # Check result_ready before job_running: the process may store its result + # while still technically alive (teardown race), so result_ready wins. status: Literal["working", "completed", "failed"] - if running: - status = "working" - elif manager.result_ready(cache_key): + if manager.result_ready(cache_key): status = "completed" + elif running: + status = "working" else: status = "failed" @@ -125,7 +128,7 @@ def get_task_result(task_id: str) -> Any: output_spec = body.get("outputs", []) callback_ctx = AttributeDict({"updated_props": {}}) - response = {"multi": True} + response: CallbackExecutionResponse = {"multi": True} output_value, has_update, skip = _update_background_callback( error_handler=None, From ef778a213bcc85615a70d57df7a4306d27dd3122 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Tue, 19 May 2026 11:52:47 -0600 Subject: [PATCH 076/103] code review feedback --- dash/mcp/primitives/tools/results/__init__.py | 3 +- .../primitives/tools/tool_background_tasks.py | 34 +++++++++++-------- dash/mcp/tasks/tasks.py | 11 ++++-- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/dash/mcp/primitives/tools/results/__init__.py b/dash/mcp/primitives/tools/results/__init__.py index 12f9507da7..843ddbb4f2 100644 --- a/dash/mcp/primitives/tools/results/__init__.py +++ b/dash/mcp/primitives/tools/results/__init__.py @@ -55,7 +55,8 @@ def format_callback_response( def task_result_to_tool_result(create_task_result: CreateTaskResult) -> CallToolResult: - """Wrap a CreateTaskResult as a CallToolResult with polling instructions. + """ + Wrap a CreateTaskResult as a CallToolResult with polling instructions. MCP Tasks are not yet supported by LLM clients, so this converts the task metadata into a tool response that guides the LLM to poll via diff --git a/dash/mcp/primitives/tools/tool_background_tasks.py b/dash/mcp/primitives/tools/tool_background_tasks.py index a4dffa23f4..5f447074e4 100644 --- a/dash/mcp/primitives/tools/tool_background_tasks.py +++ b/dash/mcp/primitives/tools/tool_background_tasks.py @@ -85,18 +85,22 @@ def call_tool( ) -> CallToolResult: task_id = arguments.get("taskId", "") - if tool_name == GET_RESULT_TOOL_NAME: - task_status = get_task(task_id) - if task_status.status == "completed": - return get_task_result(task_id) - return CallToolResult( - content=[TextContent(type="text", text=task_status.model_dump_json())], - ) - - if tool_name == CANCEL_TOOL_NAME: - result = cancel_task(task_id) - return CallToolResult( - content=[TextContent(type="text", text=result.model_dump_json())], - ) - - raise ValueError(f"Unknown tool: {tool_name}") + match tool_name: + case name if name == GET_RESULT_TOOL_NAME: + task_status = get_task(task_id) + if task_status.status == "completed": + return get_task_result(task_id) + return CallToolResult( + content=[ + TextContent(type="text", text=task_status.model_dump_json()) + ], + ) + + case name if name == CANCEL_TOOL_NAME: + result = cancel_task(task_id) + return CallToolResult( + content=[TextContent(type="text", text=result.model_dump_json())], + ) + + case _: + raise ValueError(f"Unknown tool: {tool_name}") diff --git a/dash/mcp/tasks/tasks.py b/dash/mcp/tasks/tasks.py index 044ee74d25..5989dfde55 100644 --- a/dash/mcp/tasks/tasks.py +++ b/dash/mcp/tasks/tasks.py @@ -18,9 +18,12 @@ def parse_task_id(task_id: str) -> tuple[str, str, str, datetime]: """Parse a taskId into (tool_name, job_id, cache_key, created_at).""" - tool_name, job_id, rest = task_id.split(":", 2) - cache_key, created_epoch = rest.rsplit(":", 1) - created_at = datetime.fromtimestamp(int(created_epoch), tz=timezone.utc) + try: + tool_name, job_id, rest = task_id.split(":", 2) + cache_key, created_epoch = rest.rsplit(":", 1) + created_at = datetime.fromtimestamp(int(created_epoch), tz=timezone.utc) + except (ValueError, TypeError) as exc: + raise MCPError(f"Malformed taskId: {task_id!r}") from exc return tool_name, job_id, cache_key, created_at @@ -116,6 +119,8 @@ def get_task_result(task_id: str) -> Any: app = get_app() adapter = app.mcp_callback_map.find_by_tool_name(tool_name) + if adapter is None: + raise MCPError(f"Task not found: {tool_name}") # pylint: disable-next=protected-access cb_info = adapter._cb_info background = cb_info.get("background") From b78fe2a73a5e510ae7b34581ce52942f1e99c40b Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 20 May 2026 09:36:57 -0600 Subject: [PATCH 077/103] Revert match/case refactor due to compatibility problems --- .../primitives/tools/tool_background_tasks.py | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/dash/mcp/primitives/tools/tool_background_tasks.py b/dash/mcp/primitives/tools/tool_background_tasks.py index 5f447074e4..a4dffa23f4 100644 --- a/dash/mcp/primitives/tools/tool_background_tasks.py +++ b/dash/mcp/primitives/tools/tool_background_tasks.py @@ -85,22 +85,18 @@ def call_tool( ) -> CallToolResult: task_id = arguments.get("taskId", "") - match tool_name: - case name if name == GET_RESULT_TOOL_NAME: - task_status = get_task(task_id) - if task_status.status == "completed": - return get_task_result(task_id) - return CallToolResult( - content=[ - TextContent(type="text", text=task_status.model_dump_json()) - ], - ) - - case name if name == CANCEL_TOOL_NAME: - result = cancel_task(task_id) - return CallToolResult( - content=[TextContent(type="text", text=result.model_dump_json())], - ) - - case _: - raise ValueError(f"Unknown tool: {tool_name}") + if tool_name == GET_RESULT_TOOL_NAME: + task_status = get_task(task_id) + if task_status.status == "completed": + return get_task_result(task_id) + return CallToolResult( + content=[TextContent(type="text", text=task_status.model_dump_json())], + ) + + if tool_name == CANCEL_TOOL_NAME: + result = cancel_task(task_id) + return CallToolResult( + content=[TextContent(type="text", text=result.model_dump_json())], + ) + + raise ValueError(f"Unknown tool: {tool_name}") From 16da30a25e30376d1b341c2eab0fbf3d835bd3ed Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 20 May 2026 09:48:15 -0600 Subject: [PATCH 078/103] automatically load env vars with direnv --- .envrc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.envrc b/.envrc index 96b5c94a1b..22cf211038 100644 --- a/.envrc +++ b/.envrc @@ -6,3 +6,8 @@ for venv_dir in .venv .env venv env .venv* env* ENV; do break fi done + +# Include optional, local-only environment overrides +if [ -f .env ]; then + dotenv +fi From 1861302c6c90646ae8c2bd1b491f9955539e2484 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 21 May 2026 14:40:29 -0600 Subject: [PATCH 079/103] bump version and changelog --- CHANGELOG.md | 13 +++++++++++++ dash/version.py | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13c0fc585b..80966c823d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,19 @@ This project adheres to [Semantic Versioning](https://semver.org/). - [#2462](https://github.com/plotly/dash/issues/2462) Allow `MATCH` in `Input`/`State` when the callback's `Output` has no wildcards (fixed-id Output, no Output, or `ALL`-only wildcard Output). `ALLSMALLER` still requires a corresponding `MATCH` in an Output. - [#3759](https://github.com/plotly/dash/pull/3759) Fix the issue where `Patch` objects cannot be updated via `set_props()` in `websocket` callback. Fix [#3742](https://github.com/plotly/dash/issues/3742) +## [4.3.0rc0] - 2026-05-21 + +## Added +- [#3710](https://github.com/plotly/dash/pull/3710) Framework utilities, types for interacting with layout +- [#3711](https://github.com/plotly/dash/pull/3711) `CallbackAdapter` for representing callback-related data in MCP-friendly format +- [#3712](https://github.com/plotly/dash/pull/3712) MCP `Resources` for exposing app layout, components, and pages +- [#3731](https://github.com/plotly/dash/pull/3731) Expose callbacks as MCP `Tools` +- [#3747](https://github.com/plotly/dash/pull/3747) Support pattern-matching callbacks in MCP tools +- [#3748](https://github.com/plotly/dash/pull/3748) Format callback results for LLM consumption (rendered graphs, markdown tables) +- [#3749](https://github.com/plotly/dash/pull/3749) `get_dash_component` MCP tool and callback execution +- [#3750](https://github.com/plotly/dash/pull/3750) MCP server routes and Streamable HTTP transport +- [#3766](https://github.com/plotly/dash/pull/3766) Support background callbacks in MCP tools + ## [4.2.0rc3] - 2026-05-12 - [#3771](https://github.com/plotly/dash/pull/3771) Add persistent callbacks and no inputs/no outputs callback support. diff --git a/dash/version.py b/dash/version.py index d39d52c3b8..c8f491bcb2 100644 --- a/dash/version.py +++ b/dash/version.py @@ -1 +1 @@ -__version__ = "4.2.0rc3" +__version__ = "4.3.0rc0" From 3558bd3afa84c92b2bef835bc785feb8454bd28b Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 21 May 2026 14:49:59 -0600 Subject: [PATCH 080/103] changelog --- CHANGELOG.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 80966c823d..36c31ec8e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,15 +23,15 @@ This project adheres to [Semantic Versioning](https://semver.org/). ## [4.3.0rc0] - 2026-05-21 ## Added -- [#3710](https://github.com/plotly/dash/pull/3710) Framework utilities, types for interacting with layout -- [#3711](https://github.com/plotly/dash/pull/3711) `CallbackAdapter` for representing callback-related data in MCP-friendly format -- [#3712](https://github.com/plotly/dash/pull/3712) MCP `Resources` for exposing app layout, components, and pages -- [#3731](https://github.com/plotly/dash/pull/3731) Expose callbacks as MCP `Tools` -- [#3747](https://github.com/plotly/dash/pull/3747) Support pattern-matching callbacks in MCP tools -- [#3748](https://github.com/plotly/dash/pull/3748) Format callback results for LLM consumption (rendered graphs, markdown tables) -- [#3749](https://github.com/plotly/dash/pull/3749) `get_dash_component` MCP tool and callback execution -- [#3750](https://github.com/plotly/dash/pull/3750) MCP server routes and Streamable HTTP transport -- [#3766](https://github.com/plotly/dash/pull/3766) Support background callbacks in MCP tools +- [#3710](https://github.com/plotly/dash/pull/3710) MCP: Framework utilities, types for interacting with layout +- [#3711](https://github.com/plotly/dash/pull/3711) MCP: `CallbackAdapter` for representing callback-related data in MCP-friendly format +- [#3712](https://github.com/plotly/dash/pull/3712) MCP: `Resources` for exposing app layout, components, and pages +- [#3731](https://github.com/plotly/dash/pull/3731) MCP: Expose callbacks as `Tools` +- [#3747](https://github.com/plotly/dash/pull/3747) MCP: Support pattern-matching callbacks in Tools +- [#3748](https://github.com/plotly/dash/pull/3748) MCP: Format callback results for LLM consumption (rendered graphs, markdown tables) +- [#3749](https://github.com/plotly/dash/pull/3749) MCP: `get_dash_component` Tool and callback execution +- [#3750](https://github.com/plotly/dash/pull/3750) MCP: Server routes, `mcp_enabled` function decorator, and Streamable HTTP transport +- [#3766](https://github.com/plotly/dash/pull/3766) MCP: Support background callbacks in Tools ## [4.2.0rc3] - 2026-05-12 From 24a7b664aac825c73c08910e156ec343af55cc53 Mon Sep 17 00:00:00 2001 From: philippe Date: Tue, 2 Jun 2026 13:46:12 -0400 Subject: [PATCH 081/103] fix fastapi middleware swallowing user routes bodies --- dash/backends/_fastapi.py | 9 +++- .../backend_tests/test_preconfig_backends.py | 43 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/dash/backends/_fastapi.py b/dash/backends/_fastapi.py index 027b94bed4..594ebfa225 100644 --- a/dash/backends/_fastapi.py +++ b/dash/backends/_fastapi.py @@ -223,7 +223,14 @@ async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: await self.app(scope, receive, send) return - # HTTP/WebSocket request handling + # Non-Dash routes pass through to avoid consuming body stream + path = scope["path"] + prefix = self.dash_app.config.routes_pathname_prefix + if "_dash-" not in path and path != prefix and path != prefix.rstrip("/"): + await self.app(scope, receive, send) + return + + # HTTP request handling request = Request(scope, receive=receive) token = set_current_request(request) diff --git a/tests/backend_tests/test_preconfig_backends.py b/tests/backend_tests/test_preconfig_backends.py index eec832070a..5f912415ab 100644 --- a/tests/backend_tests/test_preconfig_backends.py +++ b/tests/backend_tests/test_preconfig_backends.py @@ -291,3 +291,46 @@ def test_silence_routes_logging(backend, expected_loggers): assert ( logger.level == logging.ERROR ), f"Logger {logger_name} should be set to ERROR level for {backend} backend" + + +def test_fastapi_custom_post_route(dash_duo): + """Test that user-defined POST routes work with FastAPI backend. + + Regression test for https://github.com/plotly/dash/issues/3801 + The DashMiddleware was consuming the request body for all routes, + causing POST requests to user-defined routes to hang. + """ + from fastapi import FastAPI, Request + from fastapi.responses import JSONResponse + import requests + + fastapi_app = FastAPI() + + @fastapi_app.get("/api/echo") + async def echo_get(): + return JSONResponse({"method": "GET", "ok": True}) + + @fastapi_app.post("/api/echo") + async def echo_post(request: Request): + body = await request.json() + return JSONResponse({"echo": body}) + + app = Dash(__name__, server=fastapi_app) + app.layout = html.Div("Dash is running") + + dash_duo.start_server(app) + + # Test GET request + url = dash_duo.server_url + resp = requests.get(f"{url}/api/echo", timeout=5) + assert resp.status_code == 200 + assert resp.json() == {"method": "GET", "ok": True} + + # Test POST request - this was hanging before the fix + resp = requests.post( + f"{url}/api/echo", + json={"hello": "world"}, + timeout=5, + ) + assert resp.status_code == 200 + assert resp.json() == {"echo": {"hello": "world"}} From 1297eb1fe33dca6202c961e8e19f1a67696ea20d Mon Sep 17 00:00:00 2001 From: philippe Date: Tue, 2 Jun 2026 16:02:20 -0400 Subject: [PATCH 082/103] update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32dc3f3136..1e0404e123 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ This project adheres to [Semantic Versioning](https://semver.org/). ## [UNRELEASED] +### Fixed +- [#3805](https://github.com/plotly/dash/pull/3805) Fix FastAPI POST routes deadlock caused by middleware consuming request body. Fixes [#3801](https://github.com/plotly/dash/issues/3801). + ## [4.2.0] - 2026-06-01 - *The Freedom Update* This release marks a major milestone for Dash, bringing unprecedented flexibility to how you build and deploy your applications. From 678bb66419f636c4899bb7ac00c8f2bee07d3c2b Mon Sep 17 00:00:00 2001 From: Puneet Dixit Date: Thu, 21 May 2026 14:19:48 +0530 Subject: [PATCH 083/103] Fix DataTable conditional style typing --- components/dash-table/dash_prop_typing.py | 27 ++++++++ .../development/test_dash_table_typing.py | 64 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 components/dash-table/dash_prop_typing.py create mode 100644 tests/unit/development/test_dash_table_typing.py diff --git a/components/dash-table/dash_prop_typing.py b/components/dash-table/dash_prop_typing.py new file mode 100644 index 0000000000..22fa7fd2a5 --- /dev/null +++ b/components/dash-table/dash_prop_typing.py @@ -0,0 +1,27 @@ +# This file is automatically loaded on build time to generate types. + +from dash.development._py_prop_typing import get_prop_typing + + +def generate_conditional_style(type_info, component_name, prop_name): + condition_type = get_prop_typing( + type_info["value"]["name"], + component_name, + prop_name, + type_info["value"], + ) + return ( + "typing.Sequence[" + f"typing.Union[{condition_type}, typing.Dict[str, typing.Any]]" + "]" + ) + + +custom_props = { + "DataTable": { + "style_cell_conditional": generate_conditional_style, + "style_data_conditional": generate_conditional_style, + "style_filter_conditional": generate_conditional_style, + "style_header_conditional": generate_conditional_style, + }, +} diff --git a/tests/unit/development/test_dash_table_typing.py b/tests/unit/development/test_dash_table_typing.py new file mode 100644 index 0000000000..77383f1091 --- /dev/null +++ b/tests/unit/development/test_dash_table_typing.py @@ -0,0 +1,64 @@ +import sys +from pathlib import Path + +import pytest + +from dash.development._py_components_generation import generate_class_string +from dash.development._py_prop_typing import shapes + +CONDITIONAL_STYLE_TYPE = { + "name": "arrayOf", + "value": { + "name": "shape", + "value": { + "if": { + "name": "exact", + "value": { + "column_id": {"name": "string", "required": False}, + }, + "required": False, + }, + }, + }, +} + + +@pytest.mark.parametrize( + "prop_name, shape_name", + [ + ("style_cell_conditional", "StyleCellConditional"), + ("style_data_conditional", "StyleDataConditional"), + ("style_filter_conditional", "StyleFilterConditional"), + ("style_header_conditional", "StyleHeaderConditional"), + ], +) +def test_datatable_conditional_styles_allow_style_keys( + monkeypatch, prop_name, shape_name +): + dash_table_dir = Path(__file__).resolve().parents[3] / "components" / "dash-table" + monkeypatch.syspath_prepend(str(dash_table_dir)) + sys.modules.pop("dash_prop_typing", None) + shapes.clear() + + generated = generate_class_string( + typename="DataTable", + props={ + prop_name: { + "type": CONDITIONAL_STYLE_TYPE, + "required": False, + "description": "Conditional style", + }, + }, + description="DataTable", + namespace="dash_table", + custom_typing_module="dash_prop_typing", + ) + + assert ( + f'{prop_name}: typing.Optional[typing.Sequence[typing.Union["{shape_name}", ' + "typing.Dict[str, typing.Any]]]] = None" + ) in generated + assert f'"if": NotRequired["{shape_name}If"]' in generated + + shapes.clear() + sys.modules.pop("dash_prop_typing", None) From d04009cfb576ffeb7f254924baf6bceaeaf28fb0 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Tue, 26 May 2026 11:30:33 -0600 Subject: [PATCH 084/103] Implement configuration function to customize MCP server --- dash/_callback.py | 6 +- dash/_configs.py | 1 - dash/dash.py | 5 +- dash/mcp/__init__.py | 2 + dash/mcp/_configure.py | 90 +++++++ dash/mcp/_server.py | 2 +- .../tools/callback_adapter_collection.py | 10 +- .../descriptions/description_docstring.py | 5 +- .../tools/tool_decorated_mcp_functions.py | 3 +- dash/mcp/primitives/tools/tools_callbacks.py | 4 + tests/integration/mcp/conftest.py | 13 + tests/integration/mcp/test_mcp_configure.py | 95 ++++++++ tests/unit/mcp/test_mcp_configure.py | 222 ++++++++++++++++++ tests/unit/mcp/tools/test_mcp_tools.py | 45 ---- 14 files changed, 443 insertions(+), 60 deletions(-) create mode 100644 dash/mcp/_configure.py create mode 100644 tests/integration/mcp/test_mcp_configure.py create mode 100644 tests/unit/mcp/test_mcp_configure.py diff --git a/dash/_callback.py b/dash/_callback.py index 037f3d189b..264510d6eb 100644 --- a/dash/_callback.py +++ b/dash/_callback.py @@ -86,7 +86,7 @@ def callback( hidden: Optional[bool] = None, websocket: Optional[bool] = False, persistent: Optional[bool] = False, - mcp_enabled: bool = True, + mcp_enabled: Optional[bool] = None, mcp_expose_docstring: Optional[bool] = None, **_kwargs, ) -> Callable[[Callable[Params, ReturnVar]], Callable[Params, ReturnVar]]: @@ -300,7 +300,7 @@ def insert_callback( hidden=None, websocket=False, persistent=False, - mcp_enabled=True, + mcp_enabled=None, mcp_expose_docstring=None, ) -> str: if prevent_initial_call is None: @@ -709,7 +709,7 @@ def register_callback( hidden=_kwargs.get("hidden", None), websocket=_kwargs.get("websocket", False), persistent=_kwargs.get("persistent", False), - mcp_enabled=_kwargs.get("mcp_enabled", True), + mcp_enabled=_kwargs.get("mcp_enabled", None), mcp_expose_docstring=_kwargs.get("mcp_expose_docstring"), ) diff --git a/dash/_configs.py b/dash/_configs.py index 25a401523b..0e1ab75505 100644 --- a/dash/_configs.py +++ b/dash/_configs.py @@ -35,7 +35,6 @@ def load_dash_env_vars(): "DASH_COMPRESS", "DASH_MCP_ENABLED", "DASH_MCP_PATH", - "DASH_MCP_EXPOSE_DOCSTRINGS", "HOST", "PORT", ) diff --git a/dash/dash.py b/dash/dash.py index d3f0a67c71..6f60482c3a 100644 --- a/dash/dash.py +++ b/dash/dash.py @@ -492,7 +492,6 @@ def __init__( # pylint: disable=too-many-statements, too-many-branches websocket_batch_delay: Optional[float] = 0.005, enable_mcp: Optional[bool] = None, mcp_path: Optional[str] = None, - mcp_expose_docstrings: Optional[bool] = None, **obsolete, ): @@ -574,9 +573,6 @@ def __init__( # pylint: disable=too-many-statements, too-many-branches hide_all_callbacks=False, csrf_token_name=csrf_token_name, csrf_header_name=csrf_header_name, - mcp_expose_docstrings=get_combined_config( - "mcp_expose_docstrings", mcp_expose_docstrings, False - ), ) self.config.set_read_only( [ @@ -620,6 +616,7 @@ def __init__( # pylint: disable=too-many-statements, too-many-branches self._callback_list: list = [] self.callback_api_paths: dict = {} self.mcp_decorated_functions: dict = {} + self.mcp_callback_map: Any = None # list of inline scripts self._inline_scripts: list = [] diff --git a/dash/mcp/__init__.py b/dash/mcp/__init__.py index 2e6edffdb2..b22c049bf6 100644 --- a/dash/mcp/__init__.py +++ b/dash/mcp/__init__.py @@ -1,9 +1,11 @@ """Dash MCP (Model Context Protocol) server integration.""" +from dash.mcp._configure import configure_mcp_server from dash.mcp._decorator import mcp_enabled from dash.mcp._server import enable_mcp_server __all__ = [ + "configure_mcp_server", "enable_mcp_server", "mcp_enabled", ] diff --git a/dash/mcp/_configure.py b/dash/mcp/_configure.py new file mode 100644 index 0000000000..96d349bed7 --- /dev/null +++ b/dash/mcp/_configure.py @@ -0,0 +1,90 @@ +"""Public configuration API for the Dash MCP server.""" + +# pylint: disable=cyclic-import +# dash.dash lazy-imports dash.mcp inside _setup_routes(); pylint's static +# analysis treats it as a module-level import, producing a false cycle. + +from __future__ import annotations + +from dash import get_app +from dash.exceptions import AppNotFoundError +from dash.mcp.primitives.resources import _RESOURCE_PROVIDERS as MCP_RESOURCE_PROVIDERS +from dash.mcp.primitives.resources.resource_clientside_callbacks import ( + ClientsideCallbacksResource, +) +from dash.mcp.primitives.resources.resource_components import ComponentsResource +from dash.mcp.primitives.resources.resource_layout import LayoutResource +from dash.mcp.primitives.resources.resource_page_layout import PageLayoutResource +from dash.mcp.primitives.resources.resource_pages import PagesResource +from dash.mcp.primitives.tools import _TOOL_PROVIDERS as MCP_TOOL_PROVIDERS +from dash.mcp.primitives.tools.tool_get_dash_component import GetDashComponentTool +from dash.mcp.primitives.tools.tools_callbacks import CallbackTools + +_ALL_MCP_RESOURCE_PROVIDERS = list(MCP_RESOURCE_PROVIDERS) +_ALL_MCP_TOOL_PROVIDERS = list(MCP_TOOL_PROVIDERS) + + +def configure_mcp_server( + *, + include_layout: bool = True, + include_callbacks: bool = True, + include_clientside_callbacks: bool = True, + include_pages: bool = True, + expose_callback_docstrings: bool = False, +) -> None: + """ + Configure which content the Dash MCP server exposes. + + Any parameter that is omitted will be reset to its default value. Calling + with no args will reset all configuration to its default state. + + :param include_layout: Expose ``dash://layout``, ``dash://components``, + and the ``get_dash_component`` tool. Defaults to ``True``. + :param include_callbacks: When ``True`` (default), all callbacks are + included; ``mcp_enabled=False`` on a ``@callback`` opts it out. + When ``False``, no callbacks are included by default; + ``mcp_enabled=True`` opts a specific callback in. + :param include_clientside_callbacks: Expose the + ``dash://clientside-callbacks`` resource. Defaults to ``True``. + :param include_pages: Expose ``dash://pages`` and + ``dash://page-layout/{path}``. Defaults to ``True``. + :param expose_callback_docstrings: Include callback docstrings in + tool descriptions. Defaults to ``False``. + + Example — expose only ``@mcp_enabled``-decorated functions:: + + from dash.mcp import configure_mcp_server + + configure_mcp_server( + include_layout=False, + include_callbacks=False, + include_clientside_callbacks=False, + include_pages=False, + ) + """ + try: + if get_app().backend.has_request_context(): + raise RuntimeError("MCP server can't be configured within a callback") + except AppNotFoundError: + ... + + CallbackTools.callbacks_mcp_enabled_by_default = include_callbacks + CallbackTools.expose_docstrings_by_default = expose_callback_docstrings + + updated_resources = list(_ALL_MCP_RESOURCE_PROVIDERS) + if not include_layout: + updated_resources.remove(LayoutResource) + updated_resources.remove(ComponentsResource) + if not include_clientside_callbacks: + updated_resources.remove(ClientsideCallbacksResource) + if not include_pages: + updated_resources.remove(PagesResource) + updated_resources.remove(PageLayoutResource) + MCP_RESOURCE_PROVIDERS[:] = updated_resources + + updated_tools = list(_ALL_MCP_TOOL_PROVIDERS) + if not include_layout: + updated_tools.remove(GetDashComponentTool) + MCP_TOOL_PROVIDERS[:] = updated_tools + + get_app().mcp_callback_map = None diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py index 07b0520bb9..35c57a891e 100644 --- a/dash/mcp/_server.py +++ b/dash/mcp/_server.py @@ -245,7 +245,7 @@ def _process_mcp_message(data: dict[str, Any]) -> dict[str, Any] | None: request_id: str | int = _id if isinstance(_id, (str, int)) else "" app = get_app() - if not hasattr(app, "mcp_callback_map"): + if app.mcp_callback_map is None: app.mcp_callback_map = CallbackAdapterCollection(app) mcp_methods = { diff --git a/dash/mcp/primitives/tools/callback_adapter_collection.py b/dash/mcp/primitives/tools/callback_adapter_collection.py index 4fdaeabe9c..aab0e576d5 100644 --- a/dash/mcp/primitives/tools/callback_adapter_collection.py +++ b/dash/mcp/primitives/tools/callback_adapter_collection.py @@ -16,6 +16,7 @@ from dash._utils import clean_property_name, split_callback_id from dash._layout_utils import extract_text, find_component, traverse from .callback_adapter import CallbackAdapter +from .tools_callbacks import CallbackTools class CallbackAdapterCollection: @@ -24,10 +25,15 @@ def __init__(self, app): raw: list[tuple[str, dict]] = [] for output_id, cb_info in callback_map.items(): - if cb_info.get("mcp_enabled") is False: - continue if "callback" not in cb_info: continue + if CallbackTools.callbacks_mcp_enabled_by_default: + if cb_info.get("mcp_enabled") is False: + # callbacks are included by default but this one has opted out + continue + elif not cb_info.get("mcp_enabled"): + # callbacks are excluded by default and this one has not opted in + continue raw.append((output_id, cb_info)) self._tool_names_map = self._build_tool_names(raw) diff --git a/dash/mcp/primitives/tools/descriptions/description_docstring.py b/dash/mcp/primitives/tools/descriptions/description_docstring.py index c34d527077..b22b711ec2 100644 --- a/dash/mcp/primitives/tools/descriptions/description_docstring.py +++ b/dash/mcp/primitives/tools/descriptions/description_docstring.py @@ -4,8 +4,7 @@ from typing import TYPE_CHECKING -from dash import get_app - +from ..tools_callbacks import CallbackTools from .base import ToolDescriptionSource if TYPE_CHECKING: @@ -36,4 +35,4 @@ def _is_exposed(cls, callback: CallbackAdapter) -> bool: per_callback = callback._cb_info.get("mcp_expose_docstring") if per_callback is not None: return per_callback - return get_app().config.get("mcp_expose_docstrings", False) + return CallbackTools.expose_docstrings_by_default diff --git a/dash/mcp/primitives/tools/tool_decorated_mcp_functions.py b/dash/mcp/primitives/tools/tool_decorated_mcp_functions.py index 0b3edbbcbe..d3b7738de4 100644 --- a/dash/mcp/primitives/tools/tool_decorated_mcp_functions.py +++ b/dash/mcp/primitives/tools/tool_decorated_mcp_functions.py @@ -11,6 +11,7 @@ from dash import get_app from dash.mcp._decorator import MCPToolRegistration +from dash.mcp.primitives.tools.tools_callbacks import CallbackTools from dash.mcp.primitives.tools.input_schemas import get_input_schema from dash.mcp.primitives.tools.input_schemas.schema_callback_type_annotations import ( annotation_to_json_schema, @@ -93,7 +94,7 @@ def _build_tool(tool_name: str, reg: MCPToolRegistration) -> Tool: expose_docstring = reg["expose_docstring"] if expose_docstring is None: - expose_docstring = get_app().config.get("mcp_expose_docstrings", False) + expose_docstring = CallbackTools.expose_docstrings_by_default description = "MCP tool" if expose_docstring: diff --git a/dash/mcp/primitives/tools/tools_callbacks.py b/dash/mcp/primitives/tools/tools_callbacks.py index 2a2d866ea9..4e007acf19 100644 --- a/dash/mcp/primitives/tools/tools_callbacks.py +++ b/dash/mcp/primitives/tools/tools_callbacks.py @@ -21,6 +21,10 @@ class CallbackTools(MCPToolProvider): """Exposes every server-callable callback as an MCP tool.""" + # Set by configure_mcp_server(). + callbacks_mcp_enabled_by_default: bool = True + expose_docstrings_by_default: bool = False + @classmethod def get_tool_names(cls) -> set[str]: return get_app().mcp_callback_map.tool_names diff --git a/tests/integration/mcp/conftest.py b/tests/integration/mcp/conftest.py index aad3f1b1b5..a50004bd24 100644 --- a/tests/integration/mcp/conftest.py +++ b/tests/integration/mcp/conftest.py @@ -6,6 +6,9 @@ import requests from dash import _get_app +from dash.mcp.primitives.resources import _RESOURCE_PROVIDERS +from dash.mcp.primitives.tools import _TOOL_PROVIDERS +from dash.mcp.primitives.tools.tools_callbacks import CallbackTools collect_ignore_glob = [] if sys.version_info < (3, 10): @@ -21,7 +24,17 @@ def _enable_mcp_for_integration_tests(monkeypatch): @pytest.fixture(autouse=True) def _reset_dash_app_state(): """Reset Dash module-level state after each MCP test.""" + initial_resources = list(_RESOURCE_PROVIDERS) + initial_tools = list(_TOOL_PROVIDERS) + initial_callbacks_default = CallbackTools.callbacks_mcp_enabled_by_default + initial_expose_docstrings = CallbackTools.expose_docstrings_by_default + yield + + _RESOURCE_PROVIDERS[:] = initial_resources + _TOOL_PROVIDERS[:] = initial_tools + CallbackTools.callbacks_mcp_enabled_by_default = initial_callbacks_default + CallbackTools.expose_docstrings_by_default = initial_expose_docstrings _get_app.APP = None _get_app.app_context.set(None) diff --git a/tests/integration/mcp/test_mcp_configure.py b/tests/integration/mcp/test_mcp_configure.py new file mode 100644 index 0000000000..0ea952ac17 --- /dev/null +++ b/tests/integration/mcp/test_mcp_configure.py @@ -0,0 +1,95 @@ +"""Integration tests for configure_mcp().""" + +from dash import Dash, Input, Output, dcc, html +from dash.mcp import configure_mcp_server, mcp_enabled + +from tests.integration.mcp.conftest import _mcp_method, _mcp_tools + + +def test_mcpcfg001_disable_everything_decorated_function_still_appears(dash_duo): + """configure_mcp with all content disabled: layout/callback/page resources and + tools are absent, but an @mcp_enabled decorated function still appears.""" + + @mcp_enabled + def my_tool(x: int) -> int: + return x * 2 + + app = Dash(__name__) + app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("inp", "value")) + def update(val): + return val + + configure_mcp_server( + include_layout=False, + include_callbacks=False, + include_clientside_callbacks=False, + include_pages=False, + ) + dash_duo.start_server(app) + + tools = _mcp_tools(dash_duo.server.url) + tool_names = [t["name"] for t in tools] + assert "update" not in tool_names + assert "get_dash_component" not in tool_names + assert tool_names == ["my_tool"] + + resources = _mcp_method(dash_duo.server.url, "resources/list") + uris = [r["uri"] for r in resources["result"]["resources"]] + assert "dash://layout" not in uris + assert "dash://components" not in uris + assert "dash://clientside-callbacks" not in uris + + +def test_mcpcfg002_disable_layout_callbacks_still_appear(dash_duo): + """configure_mcp(include_layout=False): callback tools are present, + get_dash_component is absent, layout resources are absent.""" + app = Dash(__name__) + app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("inp", "value")) + def update(val): + return val + + configure_mcp_server(include_layout=False) + dash_duo.start_server(app) + + tools = _mcp_tools(dash_duo.server.url) + tool_names = [t["name"] for t in tools] + assert "update" in tool_names + assert "get_dash_component" not in tool_names + + resources = _mcp_method(dash_duo.server.url, "resources/list") + uris = [r["uri"] for r in resources["result"]["resources"]] + assert "dash://layout" not in uris + assert "dash://components" not in uris + + +def test_mcpcfg003_disable_callbacks_single_opt_in_layout_queryable(dash_duo): + """configure_mcp(include_callbacks=False) with one explicit mcp_enabled=True + callback: only that callback appears as a tool, layout is queryable.""" + app = Dash(__name__) + app.layout = html.Div( + [dcc.Input(id="inp"), html.Div(id="out"), html.Div(id="out2")] + ) + + @app.callback(Output("out", "children"), Input("inp", "value")) + def excluded(val): + return val + + @app.callback(Output("out2", "children"), Input("inp", "value"), mcp_enabled=True) + def included(val): + return val + + configure_mcp_server(include_callbacks=False) + dash_duo.start_server(app) + + tools = _mcp_tools(dash_duo.server.url) + tool_names = [t["name"] for t in tools] + assert "included" in tool_names + assert "excluded" not in tool_names + + resources = _mcp_method(dash_duo.server.url, "resources/list") + uris = [r["uri"] for r in resources["result"]["resources"]] + assert "dash://layout" in uris diff --git a/tests/unit/mcp/test_mcp_configure.py b/tests/unit/mcp/test_mcp_configure.py new file mode 100644 index 0000000000..2d6f787833 --- /dev/null +++ b/tests/unit/mcp/test_mcp_configure.py @@ -0,0 +1,222 @@ +"""Tests for the public configure_mcp_server() API. + +Covers: +- include_layout / include_clientside_callbacks / include_pages toggling resources +- include_layout toggling GetDashComponentTool +- include_callbacks toggling CallbackAdapterCollection filter mode + (opt-out when True, opt-in when False) +- expose_callback_docstrings +- idempotency: re-calling configure_mcp restores providers +- cache invalidation: app.mcp_callback_map is cleared on configure_mcp +""" + +import pytest + +import dash._get_app as _get_app_module +from dash import Dash, Input, Output, dcc, html +from dash._get_app import app_context +from dash.mcp import configure_mcp_server +from dash.mcp.primitives.resources import _RESOURCE_PROVIDERS +from dash.mcp.primitives.resources.resource_clientside_callbacks import ( + ClientsideCallbacksResource, +) +from dash.mcp.primitives.resources.resource_components import ComponentsResource +from dash.mcp.primitives.resources.resource_layout import LayoutResource +from dash.mcp.primitives.resources.resource_page_layout import PageLayoutResource +from dash.mcp.primitives.resources.resource_pages import PagesResource +from dash.mcp.primitives.tools import _TOOL_PROVIDERS +from dash.mcp.primitives.tools.callback_adapter_collection import ( + CallbackAdapterCollection, +) + +from dash.mcp.primitives.tools.tool_get_dash_component import GetDashComponentTool +from dash.mcp.primitives.tools.tools_callbacks import CallbackTools + + +# --------------------------------------------------------------------------- +# Fixtures +# --------------------------------------------------------------------------- + +_DEFAULT_RESOURCE_PROVIDERS = list(_RESOURCE_PROVIDERS) +_DEFAULT_TOOL_PROVIDERS = list(_TOOL_PROVIDERS) + + +@pytest.fixture(autouse=True) +def _reset_mcp_module_state(): + """Restore module-level MCP state after every test.""" + yield + + CallbackTools.callbacks_mcp_enabled_by_default = True + CallbackTools.expose_docstrings_by_default = False + _RESOURCE_PROVIDERS[:] = list(_DEFAULT_RESOURCE_PROVIDERS) + _TOOL_PROVIDERS[:] = list(_DEFAULT_TOOL_PROVIDERS) + _get_app_module.APP = None + _get_app_module.app_context.set(None) + + +def _make_app(**cb_kwargs): + """Minimal app with one callback. cb_kwargs forwarded to @app.callback.""" + app = Dash(__name__) + app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("inp", "value"), **cb_kwargs) + def update(val): + """A callback docstring.""" + return val + + return app + + +def _collection(app): + app_context.set(app) + return CallbackAdapterCollection(app) + + +# --------------------------------------------------------------------------- +# Resources — include_layout +# --------------------------------------------------------------------------- + + +def test_mcpc001_include_layout_toggles_resources_and_tool(): + """include_layout=False removes LayoutResource, ComponentsResource, and + GetDashComponentTool; re-enabling restores all three. ClientsideCallbacks + and pages providers are independent.""" + _make_app() + + configure_mcp_server(include_layout=False) + + assert LayoutResource not in _RESOURCE_PROVIDERS + assert ComponentsResource not in _RESOURCE_PROVIDERS + assert GetDashComponentTool not in _TOOL_PROVIDERS + # Independent knobs are unaffected + assert ClientsideCallbacksResource in _RESOURCE_PROVIDERS + assert PagesResource in _RESOURCE_PROVIDERS + + configure_mcp_server(include_layout=True) + + assert LayoutResource in _RESOURCE_PROVIDERS + assert ComponentsResource in _RESOURCE_PROVIDERS + assert GetDashComponentTool in _TOOL_PROVIDERS + + +# --------------------------------------------------------------------------- +# Resources — include_clientside_callbacks +# --------------------------------------------------------------------------- + + +def test_mcpc002_include_clientside_callbacks_is_independent_knob(): + """include_clientside_callbacks=False removes only ClientsideCallbacksResource; + layout resources are unaffected. Restoring brings it back.""" + _make_app() + + configure_mcp_server(include_clientside_callbacks=False) + + assert ClientsideCallbacksResource not in _RESOURCE_PROVIDERS + assert LayoutResource in _RESOURCE_PROVIDERS + assert ComponentsResource in _RESOURCE_PROVIDERS + + configure_mcp_server(include_clientside_callbacks=True) + + assert ClientsideCallbacksResource in _RESOURCE_PROVIDERS + + +# --------------------------------------------------------------------------- +# Resources — include_pages +# --------------------------------------------------------------------------- + + +def test_mcpc003_include_pages_is_independent_knob(): + """include_pages=False removes PagesResource and PageLayoutResource; + layout is unaffected.""" + _make_app() + + configure_mcp_server(include_pages=False) + + assert PagesResource not in _RESOURCE_PROVIDERS + assert PageLayoutResource not in _RESOURCE_PROVIDERS + assert LayoutResource in _RESOURCE_PROVIDERS + + +# --------------------------------------------------------------------------- +# Tools — include_callbacks filter mode +# --------------------------------------------------------------------------- + + +def test_mcpc004_include_callbacks_true_opt_out_mode(): + """include_callbacks=True (default): mcp_enabled=None includes; + mcp_enabled=False excludes.""" + app_none = _make_app() # mcp_enabled defaults to None + configure_mcp_server(include_callbacks=True) + assert len(_collection(app_none)) == 1 + + app_false = _make_app(mcp_enabled=False) + configure_mcp_server(include_callbacks=True) + assert len(_collection(app_false)) == 0 + + +def test_mcpc005_include_callbacks_false_opt_in_mode(): + """include_callbacks=False: mcp_enabled=True opts in; + mcp_enabled=None or False both exclude (redundant False is valid).""" + app_true = _make_app(mcp_enabled=True) + configure_mcp_server(include_callbacks=False) + assert len(_collection(app_true)) == 1 + + app_none = _make_app() # mcp_enabled=None + configure_mcp_server(include_callbacks=False) + assert len(_collection(app_none)) == 0 + + app_false = _make_app(mcp_enabled=False) + configure_mcp_server(include_callbacks=False) + assert len(_collection(app_false)) == 0 + + +# --------------------------------------------------------------------------- +# expose_callback_docstrings +# --------------------------------------------------------------------------- + + +def test_mcpc006_expose_callback_docstrings(): + """expose_callback_docstrings=True exposes docstrings; False hides them.""" + app = _make_app() + configure_mcp_server(expose_callback_docstrings=True) + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + with app.server.test_request_context(): + tool = app.mcp_callback_map[0].as_mcp_tool + assert "A callback docstring." in tool.description + + app2 = _make_app() + configure_mcp_server(expose_callback_docstrings=False) + app_context.set(app2) + app2.mcp_callback_map = CallbackAdapterCollection(app2) + with app2.server.test_request_context(): + tool2 = app2.mcp_callback_map[0].as_mcp_tool + assert "A callback docstring." not in tool2.description + + +def test_mcpc008_per_callback_false_overrides_server_level_docstrings(): + """Per-callback mcp_expose_docstring=False wins over configure_mcp_server opt-in.""" + app = _make_app(mcp_expose_docstring=False) + configure_mcp_server(expose_callback_docstrings=True) + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + with app.server.test_request_context(): + tool = app.mcp_callback_map[0].as_mcp_tool + assert "A callback docstring." not in tool.description + + +# --------------------------------------------------------------------------- +# Cache invalidation +# --------------------------------------------------------------------------- + + +def test_mcpc007_configure_mcp_invalidates_mcp_callback_map(): + """configure_mcp clears app.mcp_callback_map so it is rebuilt with new config.""" + app = _make_app() + app_context.set(app) + app.mcp_callback_map = CallbackAdapterCollection(app) + assert len(app.mcp_callback_map) == 1 + + configure_mcp_server(include_callbacks=False) + + assert app.mcp_callback_map is None diff --git a/tests/unit/mcp/tools/test_mcp_tools.py b/tests/unit/mcp/tools/test_mcp_tools.py index 3255809982..cacaf13b14 100644 --- a/tests/unit/mcp/tools/test_mcp_tools.py +++ b/tests/unit/mcp/tools/test_mcp_tools.py @@ -309,51 +309,6 @@ def test_mcpt014_typed_annotation_narrows_schema(typed_app): assert tool.inputSchema["properties"]["val"]["type"] == "string" -def test_mcpt016_app_level_opt_in_exposes_docstrings(): - """Dash(mcp_expose_docstrings=True) exposes docstrings for all callbacks.""" - app = Dash(__name__, mcp_expose_docstrings=True) - app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) - - @app.callback(Output("out", "children"), Input("inp", "value")) - def update(val): - """intentionally-exposed callback docstring text for the LLM""" - return val - - app_context.set(app) - app.mcp_callback_map = CallbackAdapterCollection(app) - - with app.server.test_request_context(): - tool = app.mcp_callback_map[0].as_mcp_tool - assert ( - "intentionally-exposed callback docstring text for the LLM" in tool.description - ) - - -def test_mcpt017_per_callback_false_overrides_app_level_opt_in(): - """Per-callback mcp_expose_docstring=False wins over app-level opt-in.""" - app = Dash(__name__, mcp_expose_docstrings=True) - app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) - - @app.callback( - Output("out", "children"), - Input("inp", "value"), - mcp_expose_docstring=False, - ) - def update(val): - """sensitive callback docstring text that must not leak to LLMs""" - return val - - app_context.set(app) - app.mcp_callback_map = CallbackAdapterCollection(app) - - with app.server.test_request_context(): - tool = app.mcp_callback_map[0].as_mcp_tool - assert ( - "sensitive callback docstring text that must not leak to LLMs" - not in tool.description - ) - - # --------------------------------------------------------------------------- # Tests — end-to-end Tool shape # --------------------------------------------------------------------------- From 17f67ec59fe8531c04f012a37917b50583d177c8 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Mon, 1 Jun 2026 14:51:41 -0600 Subject: [PATCH 085/103] Fix CI test --- tests/integration/mcp/conftest.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/tests/integration/mcp/conftest.py b/tests/integration/mcp/conftest.py index a50004bd24..60a22f407e 100644 --- a/tests/integration/mcp/conftest.py +++ b/tests/integration/mcp/conftest.py @@ -6,13 +6,20 @@ import requests from dash import _get_app -from dash.mcp.primitives.resources import _RESOURCE_PROVIDERS -from dash.mcp.primitives.tools import _TOOL_PROVIDERS -from dash.mcp.primitives.tools.tools_callbacks import CallbackTools collect_ignore_glob = [] if sys.version_info < (3, 10): collect_ignore_glob.append("*") +else: + from dash.mcp.primitives.resources import ( # pylint: disable=wrong-import-position + _RESOURCE_PROVIDERS, + ) + from dash.mcp.primitives.tools import ( # pylint: disable=wrong-import-position + _TOOL_PROVIDERS, + ) + from dash.mcp.primitives.tools.tools_callbacks import ( # pylint: disable=wrong-import-position + CallbackTools, + ) @pytest.fixture(autouse=True) From 52b285885af9ddeff97bf7578d8025c33b136dff Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Mon, 1 Jun 2026 14:52:13 -0600 Subject: [PATCH 086/103] Fix @mcp_enabled decorator not working if defined after the app constructor --- dash/mcp/_server.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py index 35c57a891e..93edf7853f 100644 --- a/dash/mcp/_server.py +++ b/dash/mcp/_server.py @@ -50,9 +50,6 @@ def enable_mcp_server(app: Dash, mcp_path: str) -> None: """Add MCP routes to a Dash app.""" - app.mcp_decorated_functions = dict(MCP_DECORATED_FUNCTIONS) - MCP_DECORATED_FUNCTIONS.clear() - def _get_or_create_session_id() -> str: """ Creates a shared session ID shared across all clients. The session is @@ -247,6 +244,7 @@ def _process_mcp_message(data: dict[str, Any]) -> dict[str, Any] | None: app = get_app() if app.mcp_callback_map is None: app.mcp_callback_map = CallbackAdapterCollection(app) + app.mcp_decorated_functions = dict(MCP_DECORATED_FUNCTIONS) mcp_methods = { "initialize": _handle_initialize, From c5c48292a797e2a656fc168e4d5be012560df92a Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Wed, 3 Jun 2026 11:49:42 -0600 Subject: [PATCH 087/103] Address PR feedback --- CHANGELOG.md | 8 ++ dash/mcp/_configure.py | 101 ++++++++++++++------ tests/integration/mcp/conftest.py | 6 ++ tests/integration/mcp/test_mcp_configure.py | 27 ++++++ tests/unit/mcp/test_mcp_configure.py | 60 ++++++++++++ 5 files changed, 173 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b760cbc8f5..d7c04cd88b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ This project adheres to [Semantic Versioning](https://semver.org/). ## [UNRELEASED] +## [4.3.0rc1] - Unreleased + +## Added +- [#3796](https://github.com/plotly/dash/pull/3796) MCP: Add `configure_mcp_server()` to toggle which content the MCP server exposes (`include_layout`, `include_callbacks`, `include_clientside_callbacks`, `include_pages`, `expose_callback_docstrings`). Only the parameters explicitly passed are updated; omitted parameters retain their current value. + +## Changed +- [#3796](https://github.com/plotly/dash/pull/3796) MCP: Remove the `mcp_expose_docstrings` `Dash()` constructor argument; callback docstring exposure is now controlled via `configure_mcp_server(expose_callback_docstrings=...)`. + ## [4.3.0rc0] - 2026-05-21 ## Added diff --git a/dash/mcp/_configure.py b/dash/mcp/_configure.py index 96d349bed7..2844483a64 100644 --- a/dash/mcp/_configure.py +++ b/dash/mcp/_configure.py @@ -6,6 +6,8 @@ from __future__ import annotations +from typing import Optional + from dash import get_app from dash.exceptions import AppNotFoundError from dash.mcp.primitives.resources import _RESOURCE_PROVIDERS as MCP_RESOURCE_PROVIDERS @@ -23,20 +25,37 @@ _ALL_MCP_RESOURCE_PROVIDERS = list(MCP_RESOURCE_PROVIDERS) _ALL_MCP_TOOL_PROVIDERS = list(MCP_TOOL_PROVIDERS) +# Membership groupings (order-independent): which providers each toggle +# controls. The exposed order is owned solely by the registry lists. +_LAYOUT_RESOURCES = {LayoutResource, ComponentsResource} +_CLIENTSIDE_CALLBACK_RESOURCES = {ClientsideCallbacksResource} +_PAGE_RESOURCES = {PagesResource, PageLayoutResource} +_LAYOUT_TOOLS = {GetDashComponentTool} + +_DEFAULT_CONFIG = { + "include_layout": True, + "include_callbacks": True, + "include_clientside_callbacks": True, + "include_pages": True, + "expose_callback_docstrings": False, +} +_current_config = dict(_DEFAULT_CONFIG) + def configure_mcp_server( *, - include_layout: bool = True, - include_callbacks: bool = True, - include_clientside_callbacks: bool = True, - include_pages: bool = True, - expose_callback_docstrings: bool = False, + include_layout: Optional[bool] = None, + include_callbacks: Optional[bool] = None, + include_clientside_callbacks: Optional[bool] = None, + include_pages: Optional[bool] = None, + expose_callback_docstrings: Optional[bool] = None, ) -> None: """ Configure which content the Dash MCP server exposes. - Any parameter that is omitted will be reset to its default value. Calling - with no args will reset all configuration to its default state. + Only the parameters that are explicitly passed are updated; any parameter + that is omitted keeps its current value. On the first call, unset values + take their defaults (all content included except callback docstrings). :param include_layout: Expose ``dash://layout``, ``dash://components``, and the ``get_dash_component`` tool. Defaults to ``True``. @@ -66,25 +85,49 @@ def configure_mcp_server( if get_app().backend.has_request_context(): raise RuntimeError("MCP server can't be configured within a callback") except AppNotFoundError: - ... - - CallbackTools.callbacks_mcp_enabled_by_default = include_callbacks - CallbackTools.expose_docstrings_by_default = expose_callback_docstrings - - updated_resources = list(_ALL_MCP_RESOURCE_PROVIDERS) - if not include_layout: - updated_resources.remove(LayoutResource) - updated_resources.remove(ComponentsResource) - if not include_clientside_callbacks: - updated_resources.remove(ClientsideCallbacksResource) - if not include_pages: - updated_resources.remove(PagesResource) - updated_resources.remove(PageLayoutResource) - MCP_RESOURCE_PROVIDERS[:] = updated_resources - - updated_tools = list(_ALL_MCP_TOOL_PROVIDERS) - if not include_layout: - updated_tools.remove(GetDashComponentTool) - MCP_TOOL_PROVIDERS[:] = updated_tools - - get_app().mcp_callback_map = None + pass + + passed = { + "include_layout": include_layout, + "include_callbacks": include_callbacks, + "include_clientside_callbacks": include_clientside_callbacks, + "include_pages": include_pages, + "expose_callback_docstrings": expose_callback_docstrings, + } + _current_config.update( + {key: value for key, value in passed.items() if value is not None} + ) + + CallbackTools.callbacks_mcp_enabled_by_default = _current_config[ + "include_callbacks" + ] + CallbackTools.expose_docstrings_by_default = _current_config[ + "expose_callback_docstrings" + ] + + excluded_resources: set = set() + if not _current_config["include_layout"]: + excluded_resources |= _LAYOUT_RESOURCES + if not _current_config["include_clientside_callbacks"]: + excluded_resources |= _CLIENTSIDE_CALLBACK_RESOURCES + if not _current_config["include_pages"]: + excluded_resources |= _PAGE_RESOURCES + MCP_RESOURCE_PROVIDERS[:] = [ + resource + for resource in _ALL_MCP_RESOURCE_PROVIDERS + if resource not in excluded_resources + ] + + excluded_tools: set = set() + if not _current_config["include_layout"]: + excluded_tools |= _LAYOUT_TOOLS + MCP_TOOL_PROVIDERS[:] = [ + tool for tool in _ALL_MCP_TOOL_PROVIDERS if tool not in excluded_tools + ] + + # Invalidate the cached callback map so it is rebuilt with the new config. + # No app yet (configured before `Dash()`) means there is no cache to clear. + try: + get_app().mcp_callback_map = None + except AppNotFoundError: + pass diff --git a/tests/integration/mcp/conftest.py b/tests/integration/mcp/conftest.py index 60a22f407e..d0ef0dda1f 100644 --- a/tests/integration/mcp/conftest.py +++ b/tests/integration/mcp/conftest.py @@ -20,6 +20,10 @@ from dash.mcp.primitives.tools.tools_callbacks import ( # pylint: disable=wrong-import-position CallbackTools, ) + from dash.mcp._decorator import ( # pylint: disable=wrong-import-position + MCP_DECORATED_FUNCTIONS, + ) + from dash.mcp import _configure # pylint: disable=wrong-import-position @pytest.fixture(autouse=True) @@ -42,6 +46,8 @@ def _reset_dash_app_state(): _TOOL_PROVIDERS[:] = initial_tools CallbackTools.callbacks_mcp_enabled_by_default = initial_callbacks_default CallbackTools.expose_docstrings_by_default = initial_expose_docstrings + MCP_DECORATED_FUNCTIONS.clear() + _configure._current_config = dict(_configure._DEFAULT_CONFIG) _get_app.APP = None _get_app.app_context.set(None) diff --git a/tests/integration/mcp/test_mcp_configure.py b/tests/integration/mcp/test_mcp_configure.py index 0ea952ac17..1b9abee7b2 100644 --- a/tests/integration/mcp/test_mcp_configure.py +++ b/tests/integration/mcp/test_mcp_configure.py @@ -93,3 +93,30 @@ def included(val): resources = _mcp_method(dash_duo.server.url, "resources/list") uris = [r["uri"] for r in resources["result"]["resources"]] assert "dash://layout" in uris + + +def test_mcpcfg004_configure_before_app_governs_live_server(dash_duo): + """configure_mcp_server() called BEFORE Dash() still governs the running + server: app construction and the first request do not reset the config.""" + # Configure before the app exists. + configure_mcp_server(include_layout=False, include_callbacks=False) + + app = Dash(__name__) + app.layout = html.Div([dcc.Input(id="inp"), html.Div(id="out")]) + + @app.callback(Output("out", "children"), Input("inp", "value"), mcp_enabled=True) + def included(val): + return val + + dash_duo.start_server(app) + + # First real request builds the callback map; pre-app config must hold. + tools = _mcp_tools(dash_duo.server.url) + tool_names = [t["name"] for t in tools] + assert "included" in tool_names # opt-in honored under include_callbacks=False + assert "get_dash_component" not in tool_names # include_layout=False honored + + resources = _mcp_method(dash_duo.server.url, "resources/list") + uris = [r["uri"] for r in resources["result"]["resources"]] + assert "dash://layout" not in uris + assert "dash://components" not in uris diff --git a/tests/unit/mcp/test_mcp_configure.py b/tests/unit/mcp/test_mcp_configure.py index 2d6f787833..6987b81111 100644 --- a/tests/unit/mcp/test_mcp_configure.py +++ b/tests/unit/mcp/test_mcp_configure.py @@ -46,10 +46,13 @@ def _reset_mcp_module_state(): """Restore module-level MCP state after every test.""" yield + from dash.mcp import _configure + CallbackTools.callbacks_mcp_enabled_by_default = True CallbackTools.expose_docstrings_by_default = False _RESOURCE_PROVIDERS[:] = list(_DEFAULT_RESOURCE_PROVIDERS) _TOOL_PROVIDERS[:] = list(_DEFAULT_TOOL_PROVIDERS) + _configure._current_config = dict(_configure._DEFAULT_CONFIG) _get_app_module.APP = None _get_app_module.app_context.set(None) @@ -220,3 +223,60 @@ def test_mcpc007_configure_mcp_invalidates_mcp_callback_map(): configure_mcp_server(include_callbacks=False) assert app.mcp_callback_map is None + + +# --------------------------------------------------------------------------- +# Patch-style semantics: omitted params retain their previous value +# --------------------------------------------------------------------------- + + +def test_mcpc009_omitted_params_retain_previous_value(): + """A subsequent call only updates the params it is passed; previously-set + values persist instead of resetting to their defaults.""" + _make_app() + + configure_mcp_server(include_layout=False) + assert LayoutResource not in _RESOURCE_PROVIDERS + assert GetDashComponentTool not in _TOOL_PROVIDERS + + # Touch an unrelated knob; include_layout must stay disabled. + configure_mcp_server(include_pages=False) + + assert LayoutResource not in _RESOURCE_PROVIDERS + assert GetDashComponentTool not in _TOOL_PROVIDERS + assert PagesResource not in _RESOURCE_PROVIDERS + + +# --------------------------------------------------------------------------- +# Configuring before the app survives construction and first-request build +# --------------------------------------------------------------------------- + + +def test_mcpc010_configure_before_app_survives_construction(): + """Config applied before `Dash()` exists is not reset by `Dash.__init__`: + provider lists set pre-app remain in effect after construction.""" + # Configure first, with no app in context (must not raise). + configure_mcp_server(include_layout=False) + + # Constructing the app must not restore the disabled providers. + _make_app() + + assert LayoutResource not in _RESOURCE_PROVIDERS + assert ComponentsResource not in _RESOURCE_PROVIDERS + assert GetDashComponentTool not in _TOOL_PROVIDERS + + +def test_mcpc011_configure_before_app_governs_callback_filter_mode(): + """`include_callbacks=False` set before `Dash()` still governs how the + callback map is built on first request (opt-in mode is honored).""" + # Configure opt-in mode before any app exists. + configure_mcp_server(include_callbacks=False) + + # App built afterward; its single callback does not opt in. + app_none = _make_app() # mcp_enabled defaults to None + # The collection is built lazily (as on first request) and must reflect + # the pre-app opt-in config: the non-opted-in callback is excluded. + assert len(_collection(app_none)) == 0 + + app_opted_in = _make_app(mcp_enabled=True) + assert len(_collection(app_opted_in)) == 1 From 6b2de3f493ea5107514803cac096f8ffabfc7409 Mon Sep 17 00:00:00 2001 From: philippe Date: Wed, 3 Jun 2026 17:51:03 -0400 Subject: [PATCH 088/103] improved path check --- dash/backends/_fastapi.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/dash/backends/_fastapi.py b/dash/backends/_fastapi.py index 594ebfa225..0516b5edcb 100644 --- a/dash/backends/_fastapi.py +++ b/dash/backends/_fastapi.py @@ -226,7 +226,12 @@ async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: # Non-Dash routes pass through to avoid consuming body stream path = scope["path"] prefix = self.dash_app.config.routes_pathname_prefix - if "_dash-" not in path and path != prefix and path != prefix.rstrip("/"): + dash_prefix = prefix.rstrip("/") + "/_dash-" + if ( + not path.startswith(dash_prefix) + and path != prefix + and path != prefix.rstrip("/") + ): await self.app(scope, receive, send) return From 4028449de051650e69efa7c4daf1c1e8315afb81 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 11 Jun 2026 10:47:04 -0600 Subject: [PATCH 089/103] Fix incorrect websocket pathname --- CHANGELOG.md | 1 + dash/backends/_fastapi.py | 2 +- dash/backends/_quart.py | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e0404e123..e18cb41c78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). ### Fixed - [#3805](https://github.com/plotly/dash/pull/3805) Fix FastAPI POST routes deadlock caused by middleware consuming request body. Fixes [#3801](https://github.com/plotly/dash/issues/3801). +- [#3813](https://github.com/plotly/dash/pull/3813) Fix websockets using incorrect path when deployed behind a proxy ## [4.2.0] - 2026-06-01 - *The Freedom Update* diff --git a/dash/backends/_fastapi.py b/dash/backends/_fastapi.py index 0516b5edcb..97dce1379a 100644 --- a/dash/backends/_fastapi.py +++ b/dash/backends/_fastapi.py @@ -682,7 +682,7 @@ def serve_websocket_callback(self, dash_app: "Dash"): dash_app: The Dash application instance """ # pylint: disable=too-many-statements,too-many-locals - ws_path = dash_app.config.requests_pathname_prefix + "_dash-ws-callback" + ws_path = dash_app.config.routes_pathname_prefix + "_dash-ws-callback" # Get allowed origins from dash app config allowed_origins = getattr( diff --git a/dash/backends/_quart.py b/dash/backends/_quart.py index c7634ce93a..a6d09d1e1c 100644 --- a/dash/backends/_quart.py +++ b/dash/backends/_quart.py @@ -516,7 +516,7 @@ def serve_websocket_callback(self, dash_app: "Dash"): dash_app: The Dash application instance """ # pylint: disable=too-many-statements,too-many-locals - ws_path = dash_app.config.requests_pathname_prefix + "_dash-ws-callback" + ws_path = dash_app.config.routes_pathname_prefix + "_dash-ws-callback" # pylint: disable=protected-access allowed_origins = getattr(dash_app, "_websocket_allowed_origins", []) From f525dd31fe0614b0f6c08f844ae1f7ca2bd5eafa Mon Sep 17 00:00:00 2001 From: Ian Murray Date: Sun, 14 Jun 2026 16:39:59 +0000 Subject: [PATCH 090/103] Fix background callback context serialisation for non-dict request args Background callbacks dispatch the callback context to a worker (e.g. Celery via kombu), where the context must be JSON serialisable. The request ``args`` (query-string parameters) carried on the context can be a backend-specific multi-dict such as ``starlette.datastructures.QueryParams`` (FastAPI) or a ``werkzeug``/``quart`` ``MultiDict`` (Flask/Quart). These types are not JSON serialisable, so dispatching a background callback raised a serialisation error (e.g. "QueryParams is not JSON serializable"). Coerce ``args`` to a plain ``dict`` on the worker-bound copy of the context in ``_setup_background_callback``. The synchronous HTTP request path is left untouched, so code relying on ``args.getlist(...)`` continues to work. --- dash/_callback.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dash/_callback.py b/dash/_callback.py index a0d5a1021d..1fb3791721 100644 --- a/dash/_callback.py +++ b/dash/_callback.py @@ -429,6 +429,10 @@ def _setup_background_callback( ctx_value.pop("background_callback_manager") ctx_value.pop("dash_response") + args_value = ctx_value.get("args") + if args_value is not None and not isinstance(args_value, dict): + ctx_value["args"] = dict(args_value) + job = callback_manager.call_job_fn( cache_key, job_fn, From a17382d682c96a98852e0a6d04bfd92135534003 Mon Sep 17 00:00:00 2001 From: Ian Murray Date: Sun, 14 Jun 2026 17:24:25 +0000 Subject: [PATCH 091/103] Add regression tests for background callback args serialisation Cover the coercion of a non-dict request args (e.g. a starlette QueryParams / multi-dict) to a JSON-serialisable plain dict on the worker-bound context copy in _setup_background_callback, and assert that existing dict / None values are left unchanged. --- .../test_background_callback_serialisation.py | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 tests/unit/library/test_background_callback_serialisation.py diff --git a/tests/unit/library/test_background_callback_serialisation.py b/tests/unit/library/test_background_callback_serialisation.py new file mode 100644 index 0000000000..1502ed3df7 --- /dev/null +++ b/tests/unit/library/test_background_callback_serialisation.py @@ -0,0 +1,162 @@ +import json +from unittest import mock + +import pytest + +from dash import _callback +from dash._callback import _setup_background_callback, context_value +from dash._utils import AttributeDict + + +class FakeMultiDict: + """Minimal multi-dict standing in for a backend query-params object. + + It mimics ``starlette.datastructures.QueryParams`` for these tests: it is + convertible to a ``dict`` and exposes ``getlist``, but is **not** a ``dict`` + subclass and is **not** JSON serialisable. + + Parameters + ---------- + items : list of tuple + The ``(key, value)`` pairs held by the multi-dict. + """ + + def __init__(self, items): + self._items = list(items) + + def getlist(self, key): + """Return all values stored under ``key``.""" + return [value for stored_key, value in self._items if stored_key == key] + + def keys(self): + """Return the keys, enabling ``dict(self)`` coercion.""" + return [key for key, _ in self._items] + + def __getitem__(self, key): + for stored_key, value in self._items: + if stored_key == key: + return value + raise KeyError(key) + + +def _make_context(args_value): + """Build a minimal callback context containing ``args``. + + Parameters + ---------- + args_value : Any + The value to store under the ``args`` key. + + Returns + ------- + AttributeDict + A context with the keys ``_setup_background_callback`` expects to find + and pop. + """ + return AttributeDict( + args=args_value, + background_callback_manager=object(), + dash_response=object(), + ) + + +class _CapturingManager: + """Background callback manager stub that captures the dispatched context.""" + + def __init__(self): + self.captured_context = None + self.func_registry = mock.Mock() + self.func_registry.get.return_value = object() + + def build_cache_key(self, *_args, **_kwargs): + """Return a deterministic cache key.""" + return "cache-key" + + def call_job_fn(self, _cache_key, _job_fn, _func_args, context): + """Capture the context that would be dispatched to the worker.""" + self.captured_context = context + return "job-id" + + +@pytest.fixture(name="patched_app") +def fixture_patched_app(): + """Patch ``get_app`` so ``_get_callback_manager`` can resolve an adapter.""" + adapter = mock.Mock() + adapter.args.getlist.return_value = [] + app = mock.Mock() + app.backend.request_adapter.return_value = adapter + with mock.patch.object(_callback, "get_app", return_value=app): + yield app + + +def _run_setup(manager, args_value): + """Run ``_setup_background_callback`` with ``args_value`` on the context. + + Parameters + ---------- + manager : _CapturingManager + The manager whose ``call_job_fn`` captures the dispatched context. + args_value : Any + The value to place under the context ``args`` key. + """ + token = context_value.set(_make_context(args_value)) + try: + _setup_background_callback( + kwargs={}, + background={"manager": manager}, + background_key="bg-key", + func=lambda: None, + func_args=[], + func_kwargs={}, + callback_ctx=AttributeDict(), + ) + finally: + context_value.reset(token) + + +def test_non_dict_args_coerced_to_serialisable_dict(patched_app): + """A non-dict ``args`` is coerced to a JSON-serialisable ``dict``.""" + manager = _CapturingManager() + args_value = FakeMultiDict([("foo", "bar"), ("baz", "qux")]) + + _run_setup(manager, args_value) + + dispatched_args = manager.captured_context["args"] + assert isinstance(dispatched_args, dict) + assert dispatched_args == {"foo": "bar", "baz": "qux"} + # Must not raise; the worker dispatch relies on this being serialisable. + json.dumps(dispatched_args) + + +def test_dict_args_left_unchanged(patched_app): + """An ``args`` value that is already a ``dict`` is preserved as-is.""" + manager = _CapturingManager() + args_value = {"foo": "bar"} + + _run_setup(manager, args_value) + + dispatched_args = manager.captured_context["args"] + assert dispatched_args == {"foo": "bar"} + json.dumps(dispatched_args) + + +def test_none_args_left_as_none(patched_app): + """A missing/``None`` ``args`` value does not raise and stays ``None``.""" + manager = _CapturingManager() + + _run_setup(manager, None) + + assert manager.captured_context["args"] is None + + +def test_starlette_query_params_coerced(patched_app): + """A real ``starlette`` ``QueryParams`` is coerced to a serialisable dict.""" + query_params = pytest.importorskip("starlette.datastructures").QueryParams + + manager = _CapturingManager() + _run_setup(manager, query_params("foo=bar&baz=qux")) + + dispatched_args = manager.captured_context["args"] + assert isinstance(dispatched_args, dict) + assert dispatched_args == {"foo": "bar", "baz": "qux"} + json.dumps(dispatched_args) From e39f3fc82e700c17d6abeb0a102f3c9baa96b2d7 Mon Sep 17 00:00:00 2001 From: Ian Murray Date: Sun, 14 Jun 2026 17:27:35 +0000 Subject: [PATCH 092/103] Add CHANGELOG entry for background callback args serialisation fix (#3817) --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e0404e123..733fc0aff3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). ## [UNRELEASED] ### Fixed +- [#3817](https://github.com/plotly/dash/pull/3817) Fix background callback context serialisation for non-dict request args on the FastAPI and Quart backends. Fixes [#3816](https://github.com/plotly/dash/issues/3816). - [#3805](https://github.com/plotly/dash/pull/3805) Fix FastAPI POST routes deadlock caused by middleware consuming request body. Fixes [#3801](https://github.com/plotly/dash/issues/3801). ## [4.2.0] - 2026-06-01 - *The Freedom Update* From f4ff5cfb02339cab48238f0621ba4fdbc3e3bdd2 Mon Sep 17 00:00:00 2001 From: philippe Date: Thu, 18 Jun 2026 11:44:43 -0400 Subject: [PATCH 093/103] fix dependabot report --- .github/workflows/post-test-status.yml | 7 +++++-- .github/workflows/testing.yml | 5 +++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/post-test-status.yml b/.github/workflows/post-test-status.yml index 5f7ec4a3a4..956eb47a11 100644 --- a/.github/workflows/post-test-status.yml +++ b/.github/workflows/post-test-status.yml @@ -68,10 +68,13 @@ jobs: test-report: name: Consolidated Test Report (Fork PR) runs-on: ubuntu-latest - # Only run for fork PRs (non-fork PRs are handled in the main workflow) + # Run for fork PRs and Dependabot PRs. Both run with a read-only + # GITHUB_TOKEN in the main workflow, so the check run is created here in the + # base-repo context instead. Other same-repo PRs are handled in the main workflow. if: | github.event.workflow_run.event == 'pull_request' && - github.event.workflow_run.head_repository.full_name != github.repository + (github.event.workflow_run.head_repository.full_name != github.repository || + github.event.workflow_run.actor.login == 'dependabot[bot]') permissions: checks: write actions: read diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 2359695404..7cc2a0e395 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -1093,8 +1093,9 @@ jobs: - name: Publish Test Report uses: dorny/test-reporter@v1 - # Skip for fork PRs - handled by post-test-status.yml workflow_run - if: always() && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) + # Skip for fork PRs and Dependabot PRs - both run with a read-only + # GITHUB_TOKEN, so they're handled by post-test-status.yml workflow_run. + if: always() && (github.event_name != 'pull_request' || (github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]')) with: name: Test Results Summary path: 'test-results/**/*.xml' From a8e3b553ca846478635b0ddcf2297c603ded9a47 Mon Sep 17 00:00:00 2001 From: philippe Date: Thu, 18 Jun 2026 12:19:59 -0400 Subject: [PATCH 094/103] fix percy --- .github/workflows/testing.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 7cc2a0e395..100a365fed 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -620,6 +620,14 @@ jobs: PERCY_TOKEN: ${{ matrix.python-version == '3.12' && secrets.PERCY_TOKEN || '' }} PERCY_ENABLE: ${{ matrix.python-version == '3.12' && '1' || '0' }} PERCY_PARALLEL_TOTAL: -1 + # Pin the build identity so every shard joins the same parallel build and + # Percy links it to the PR. Auto-detection otherwise uses the ephemeral + # merge SHA (refs/pull/N/merge), so the build never shows up on the PR. + PERCY_PARALLEL_NONCE: ${{ github.run_id }}-${{ github.run_attempt }} + PERCY_COMMIT: ${{ github.event.pull_request.head.sha || github.sha }} + PERCY_BRANCH: ${{ github.head_ref || github.ref_name }} + PERCY_PULL_REQUEST: ${{ github.event.pull_request.number }} + PERCY_TARGET_BRANCH: ${{ github.base_ref }} steps: - name: Checkout repository @@ -713,6 +721,14 @@ jobs: PERCY_TOKEN: ${{ matrix.python-version == '3.12' && secrets.PERCY_TOKEN || '' }} PERCY_ENABLE: ${{ matrix.python-version == '3.12' && '1' || '0' }} PERCY_PARALLEL_TOTAL: -1 + # Pin the build identity so every shard joins the same parallel build and + # Percy links it to the PR. Auto-detection otherwise uses the ephemeral + # merge SHA (refs/pull/N/merge), so the build never shows up on the PR. + PERCY_PARALLEL_NONCE: ${{ github.run_id }}-${{ github.run_attempt }} + PERCY_COMMIT: ${{ github.event.pull_request.head.sha || github.sha }} + PERCY_BRANCH: ${{ github.head_ref || github.ref_name }} + PERCY_PULL_REQUEST: ${{ github.event.pull_request.number }} + PERCY_TARGET_BRANCH: ${{ github.base_ref }} steps: - name: Checkout repository @@ -899,6 +915,14 @@ jobs: PERCY_TOKEN: ${{ matrix.python-version == '3.12' && secrets.PERCY_TOKEN || '' }} PERCY_ENABLE: ${{ matrix.python-version == '3.12' && '1' || '0' }} PERCY_PARALLEL_TOTAL: -1 + # Pin the build identity so every shard joins the same parallel build and + # Percy links it to the PR. Auto-detection otherwise uses the ephemeral + # merge SHA (refs/pull/N/merge), so the build never shows up on the PR. + PERCY_PARALLEL_NONCE: ${{ github.run_id }}-${{ github.run_attempt }} + PERCY_COMMIT: ${{ github.event.pull_request.head.sha || github.sha }} + PERCY_BRANCH: ${{ github.head_ref || github.ref_name }} + PERCY_PULL_REQUEST: ${{ github.event.pull_request.number }} + PERCY_TARGET_BRANCH: ${{ github.base_ref }} steps: - name: Checkout repository @@ -1056,6 +1080,13 @@ jobs: if: always() env: PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }} + # Must match the snapshot jobs so finalize targets the same parallel build + # and the result is attached to the PR head commit, not the merge SHA. + PERCY_PARALLEL_NONCE: ${{ github.run_id }}-${{ github.run_attempt }} + PERCY_COMMIT: ${{ github.event.pull_request.head.sha || github.sha }} + PERCY_BRANCH: ${{ github.head_ref || github.ref_name }} + PERCY_PULL_REQUEST: ${{ github.event.pull_request.number }} + PERCY_TARGET_BRANCH: ${{ github.base_ref }} steps: - name: Finalize Main Percy Build if: | From b14961f08d9d4698fc802c6187acf76153314f9c Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 18 Jun 2026 10:48:19 -0600 Subject: [PATCH 095/103] Fix claude code connectivity timeouts --- dash/mcp/_server.py | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/dash/mcp/_server.py b/dash/mcp/_server.py index 93edf7853f..cf83f6e047 100644 --- a/dash/mcp/_server.py +++ b/dash/mcp/_server.py @@ -167,8 +167,25 @@ def _handle_mcp_request(data) -> Any: return _json_response(response_data) - def _handle_not_allowed(): - """Return 405 for GET and DELETE (MCP SSE not supported).""" + def _handle_get(): + """ + Accept GET requests for SSE streams with an empty, immediately-completed + stream. This used to be a 405 "Method Not Allowed", but that caused the + dev server to close the connection, introducing intermittent Claude + connectivity timeouts. + """ + resp = app.backend.make_response( + ": mcp stream open\n\n", + content_type="text/event-stream", + status=200, + ) + resp.headers["Cache-Control"] = "no-cache, no-transform" + if _session_id is not None: + resp.headers["Mcp-Session-Id"] = _session_id + return resp + + def _handle_delete(): + """Return 405 for DELETE; the spec allows refusing session teardown.""" return app.backend.make_response( json.dumps({"error": "Method not allowed"}), content_type="application/json", @@ -192,13 +209,13 @@ def _handle_not_allowed(): ) app.backend.add_url_rule( mcp_url, - view_func=_handle_not_allowed, + view_func=_handle_get, endpoint=f"{mcp_url}:GET", methods=["GET"], ) app.backend.add_url_rule( mcp_url, - view_func=_handle_not_allowed, + view_func=_handle_delete, endpoint=f"{mcp_url}:DELETE", methods=["DELETE"], ) From 664efdd76c934f73d73dcd041ae018e700f0f1fd Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 18 Jun 2026 11:09:25 -0600 Subject: [PATCH 096/103] attempt fix on table test --- .github/workflows/testing.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index bb9b10a016..ff68a4eff8 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -1018,6 +1018,7 @@ jobs: find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[ci,testing,dev]"' \; - name: Setup Chrome and ChromeDriver + id: setup-chrome uses: browser-actions/setup-chrome@v1 with: chrome-version: stable @@ -1036,6 +1037,10 @@ jobs: - name: Run Table visual tests if: env.PERCY_TOKEN != '' working-directory: components/dash-table + # percy-storybook bundles an old puppeteer whose Chromium is absent on + # the runner; point it at the system Chrome installed above. + env: + PUPPETEER_EXECUTABLE_PATH: ${{ steps.setup-chrome.outputs.chrome-path }} run: npm run test.visual - name: Skip Table visual tests (fork PR) From 37432d304c506a771ba9a1c57bfd8d0457c6a2df Mon Sep 17 00:00:00 2001 From: philippe Date: Thu, 18 Jun 2026 13:26:05 -0400 Subject: [PATCH 097/103] try fix percy --- .github/actions/percy-exec/action.yml | 18 +++++++++++++++++- .github/workflows/testing.yml | 4 ++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/.github/actions/percy-exec/action.yml b/.github/actions/percy-exec/action.yml index 9dbe11bad1..e1c25d5a7d 100644 --- a/.github/actions/percy-exec/action.yml +++ b/.github/actions/percy-exec/action.yml @@ -13,6 +13,10 @@ inputs: description: 'Working directory for the command' required: false default: '.' + browser-executable: + description: 'Path to a Chrome/Chromium binary for Percy to use. Defaults to the one found on PATH.' + required: false + default: '' runs: using: 'composite' @@ -23,7 +27,19 @@ runs: working-directory: ${{ inputs.working-directory }} env: PERCY_TOKEN: ${{ inputs.percy-token }} - run: npx percy exec -- ${{ inputs.command }} + PERCY_BROWSER_EXECUTABLE: ${{ inputs.browser-executable }} + run: | + # Percy otherwise downloads its own Chromium from storage.googleapis.com + # on the first snapshot. That download stalls in CI, which blocks the + # synchronous percy_snapshot() calls (so pytest never finishes and writes + # no JUnit) and leaves an empty Percy build with no snapshots. Point Percy + # at the Chrome already installed in the job so it skips the download. + if [ -z "${PERCY_BROWSER_EXECUTABLE:-}" ]; then + PERCY_BROWSER_EXECUTABLE="$(command -v google-chrome || command -v google-chrome-stable || command -v chrome || command -v chromium || command -v chromium-browser || true)" + export PERCY_BROWSER_EXECUTABLE + fi + echo "PERCY_BROWSER_EXECUTABLE=${PERCY_BROWSER_EXECUTABLE:-}" + npx percy exec -- ${{ inputs.command }} - name: Run without Percy (fork PR) if: inputs.percy-token == '' diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 100a365fed..9a43c3f195 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -662,6 +662,7 @@ jobs: find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[ci,testing,dev,celery,diskcache]"' \; - name: Setup Chrome and ChromeDriver + id: setup-chrome uses: browser-actions/setup-chrome@v1 with: chrome-version: stable @@ -686,6 +687,7 @@ jobs: with: command: pytest --headless --nopercyfinalize --junitxml=test-reports/junit_intg.xml tests/integration --splits 3 --group ${{ matrix.test-group }} percy-token: ${{ secrets.PERCY_TOKEN }} + browser-executable: ${{ steps.setup-chrome.outputs.chrome-path }} - name: Upload test results if: always() @@ -763,6 +765,7 @@ jobs: find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[ci,testing,dev]"' \; - name: Setup Chrome and ChromeDriver + id: setup-chrome uses: browser-actions/setup-chrome@v1 with: chrome-version: stable @@ -789,6 +792,7 @@ jobs: with: command: pytest --headless --nopercyfinalize --junitxml=test-reports/junit_html.xml percy-token: ${{ secrets.PERCY_TOKEN }} + browser-executable: ${{ steps.setup-chrome.outputs.chrome-path }} working-directory: components/dash-html-components - name: Upload test results From c7937783ce24bfe4c7092e260e8a61e5f4cdad23 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 18 Jun 2026 10:52:04 -0600 Subject: [PATCH 098/103] changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 44cd112e75..1026117ccc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ This project adheres to [Semantic Versioning](https://semver.org/). ## Fixed - [#3805](https://github.com/plotly/dash/pull/3805) Fix FastAPI POST routes deadlock caused by middleware consuming request body. Fixes [#3801](https://github.com/plotly/dash/issues/3801). +- [#3813](https://github.com/plotly/dash/pull/3813) Fix websockets using incorrect path when deployed behind a proxy +- [#3830](https://github.com/plotly/dash/pull/3830) MCP: Respond to the Streamable HTTP `GET` (SSE) request with an empty event stream instead of `405 Method Not Allowed` ## [4.3.0rc0] - 2026-05-21 From 7fe7a32060b7321566ec0982e7dda58be19fc7dd Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 18 Jun 2026 13:20:52 -0600 Subject: [PATCH 099/103] Fix failing mcp test --- tests/integration/mcp/test_mcp_endpoint.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/integration/mcp/test_mcp_endpoint.py b/tests/integration/mcp/test_mcp_endpoint.py index 44b358c25d..27a8385311 100644 --- a/tests/integration/mcp/test_mcp_endpoint.py +++ b/tests/integration/mcp/test_mcp_endpoint.py @@ -91,11 +91,12 @@ def test_mcpe004_delete_returns_405(): assert r.status_code == 405 -def test_mcpe005_get_returns_405(): +def test_mcpe005_get_opens_empty_sse_stream(): app = _make_app() client = app.server.test_client() r = client.get(f"/{MCP_PATH}") - assert r.status_code == 405 + assert r.status_code == 200 + assert r.headers["Content-Type"].startswith("text/event-stream") def test_mcpe006_post_rejects_wrong_content_type(): From adb6bb2ddc69065b5204e78f5d2e8c26e5020dce Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 18 Jun 2026 13:19:39 -0600 Subject: [PATCH 100/103] bump version --- CHANGELOG.md | 2 +- dash/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35cee35565..32495dd201 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to `dash` will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). -## [UNRELEASED] +## [4.3.0] - 2026-06-18 ## Added - [#3796](https://github.com/plotly/dash/pull/3796) MCP: Add `configure_mcp_server()` to toggle which content the MCP server exposes (`include_layout`, `include_callbacks`, `include_clientside_callbacks`, `include_pages`, `expose_callback_docstrings`). Only the parameters explicitly passed are updated; omitted parameters retain their current value. diff --git a/dash/version.py b/dash/version.py index c8f491bcb2..111dc9172a 100644 --- a/dash/version.py +++ b/dash/version.py @@ -1 +1 @@ -__version__ = "4.3.0rc0" +__version__ = "4.3.0" From 16e09f2aecea7516a46b3a3ddd590fa98c5c8504 Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 18 Jun 2026 13:55:32 -0600 Subject: [PATCH 101/103] Version bump of component suites --- .../dash-core-components/package-lock.json | 107 ++++++++++++++---- components/dash-core-components/package.json | 2 +- .../dash-html-components/package-lock.json | 22 ++-- components/dash-html-components/package.json | 2 +- components/dash-table/package-lock.json | 9 +- components/dash-table/package.json | 2 +- dash/dash-renderer/package.json | 2 +- 7 files changed, 104 insertions(+), 42 deletions(-) diff --git a/components/dash-core-components/package-lock.json b/components/dash-core-components/package-lock.json index b838bafda8..d78848d216 100644 --- a/components/dash-core-components/package-lock.json +++ b/components/dash-core-components/package-lock.json @@ -1,12 +1,12 @@ { "name": "dash-core-components", - "version": "4.2.0", + "version": "4.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "dash-core-components", - "version": "4.2.0", + "version": "4.3.0", "license": "MIT", "dependencies": { "@fortawesome/fontawesome-svg-core": "1.2.36", @@ -3774,6 +3774,7 @@ "version": "0.3.11", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -4801,6 +4802,7 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, "license": "MIT" }, "node_modules/@types/fast-isnumeric": { @@ -4878,7 +4880,8 @@ "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", @@ -4890,6 +4893,7 @@ "version": "22.13.10", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "dev": true, "dependencies": { "undici-types": "~6.20.0" } @@ -4898,7 +4902,7 @@ "version": "15.7.15", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/@types/ramda": { @@ -4915,7 +4919,7 @@ "version": "16.14.68", "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.68.tgz", "integrity": "sha512-GEe60JEJg7wIvnUzXBX/A++ieyum98WXF/q2oFr1RVar8OK8JxU/uEYBXgv7jF87SoaDdxtAq3KUaJFlu02ziw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -4927,7 +4931,7 @@ "version": "16.9.25", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.25.tgz", "integrity": "sha512-ZK//eAPhwft9Ul2/Zj+6O11YR6L4JX0J2sVeBC9Ft7x7HFN7xk7yUV/zDxqV6rjvqgl6r8Dq7oQImxtyf/Mzcw==", - "devOptional": true, + "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "^16.0.0" @@ -4957,7 +4961,7 @@ "version": "0.16.8", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/@types/semver": { @@ -5280,6 +5284,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" @@ -5288,22 +5293,26 @@ "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==" + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==" + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==" + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", @@ -5313,12 +5322,14 @@ "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==" + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -5330,6 +5341,7 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -5338,6 +5350,7 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -5345,12 +5358,14 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==" + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -5366,6 +5381,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", @@ -5378,6 +5394,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -5389,6 +5406,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", @@ -5402,6 +5420,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -5454,12 +5473,14 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true }, "node_modules/abort-controller": { "version": "3.0.0", @@ -5523,6 +5544,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, "dependencies": { "ajv": "^8.0.0" }, @@ -5539,6 +5561,7 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -5553,7 +5576,8 @@ "node_modules/ajv-formats/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, "node_modules/ansi-escapes": { "version": "4.3.2", @@ -6400,7 +6424,8 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true }, "node_modules/buffer-xor": { "version": "1.0.3", @@ -6618,6 +6643,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, "engines": { "node": ">=6.0" } @@ -7131,7 +7157,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/d3-format": { @@ -7500,6 +7526,7 @@ "version": "5.22.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.22.1.tgz", "integrity": "sha512-6QEuw3zoX1SJQc7b87aBXke/no+mG2bTBgw29gWMQonLmpEkWoCAVkl+M49e48AZlWzxiDzDZzYdp6kobcyLww==", + "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -7711,6 +7738,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { @@ -8215,6 +8243,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -8226,6 +8255,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "engines": { "node": ">=4.0" } @@ -8334,7 +8364,8 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-glob": { "version": "3.3.2", @@ -8376,6 +8407,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "dev": true, "funding": [ { "type": "github", @@ -8763,6 +8795,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, "license": "BSD-2-Clause" }, "node_modules/globalthis": { @@ -8826,7 +8859,8 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true }, "node_modules/graphemer": { "version": "1.4.0", @@ -12180,6 +12214,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -12194,6 +12229,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -12203,6 +12239,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -12437,6 +12474,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.11.5" @@ -12630,7 +12668,8 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "node_modules/merge2": { "version": "1.4.1", @@ -12676,6 +12715,7 @@ "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -13921,6 +13961,7 @@ "version": "16.14.0", "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "dev": true, "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -13970,6 +14011,7 @@ "version": "16.14.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", + "dev": true, "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -14372,6 +14414,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -14667,6 +14710,7 @@ "version": "0.19.1", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "dev": true, "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -14676,6 +14720,7 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -14695,6 +14740,7 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -14710,6 +14756,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -14720,7 +14767,8 @@ "node_modules/schema-utils/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, "node_modules/semver": { "version": "6.3.1", @@ -14937,6 +14985,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -14956,6 +15005,7 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", @@ -15375,6 +15425,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -15388,6 +15439,7 @@ "version": "5.48.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -15406,6 +15458,7 @@ "version": "5.6.1", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", @@ -15466,6 +15519,7 @@ "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -15478,6 +15532,7 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, "license": "MIT" }, "node_modules/test-exclude": { @@ -15981,7 +16036,8 @@ "node_modules/undici-types": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true }, "node_modules/unherit": { "version": "1.1.3", @@ -16306,6 +16362,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "dev": true, "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -16329,6 +16386,7 @@ "version": "5.107.2", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.107.2.tgz", "integrity": "sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.8", @@ -16443,6 +16501,7 @@ "version": "3.5.0", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz", "integrity": "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.13.0" @@ -16452,6 +16511,7 @@ "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -16464,6 +16524,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.13.0" @@ -16476,6 +16537,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -16488,6 +16550,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, "engines": { "node": ">=4.0" } diff --git a/components/dash-core-components/package.json b/components/dash-core-components/package.json index 50e16b35a5..a5b5089484 100644 --- a/components/dash-core-components/package.json +++ b/components/dash-core-components/package.json @@ -1,6 +1,6 @@ { "name": "dash-core-components", - "version": "4.2.0", + "version": "4.3.0", "description": "Core component suite for Dash", "repository": { "type": "git", diff --git a/components/dash-html-components/package-lock.json b/components/dash-html-components/package-lock.json index 4a311a311b..21a04f960c 100644 --- a/components/dash-html-components/package-lock.json +++ b/components/dash-html-components/package-lock.json @@ -1,12 +1,12 @@ { "name": "dash-html-components", - "version": "4.2.0", + "version": "4.3.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "dash-html-components", - "version": "4.2.0", + "version": "4.3.0", "license": "MIT", "dependencies": { "prop-types": "^15.8.1", @@ -8462,8 +8462,7 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "requires": {} + "dev": true }, "@babel/plugin-syntax-import-assertions": { "version": "7.29.7", @@ -9677,22 +9676,19 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", - "dev": true, - "requires": {} + "dev": true }, "@webpack-cli/info": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", - "dev": true, - "requires": {} + "dev": true }, "@webpack-cli/serve": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", - "dev": true, - "requires": {} + "dev": true }, "@xtuc/ieee754": { "version": "1.2.0", @@ -9716,8 +9712,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "ajv": { "version": "6.14.0", @@ -13579,8 +13574,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, - "requires": {} + "dev": true }, "eslint-scope": { "version": "5.1.1", diff --git a/components/dash-html-components/package.json b/components/dash-html-components/package.json index 5db89aa61b..a745e29b91 100644 --- a/components/dash-html-components/package.json +++ b/components/dash-html-components/package.json @@ -1,6 +1,6 @@ { "name": "dash-html-components", - "version": "4.2.0", + "version": "4.3.0", "description": "Vanilla HTML components for Dash", "main": "lib/index.js", "repository": { diff --git a/components/dash-table/package-lock.json b/components/dash-table/package-lock.json index b3af038be3..e03267c79c 100644 --- a/components/dash-table/package-lock.json +++ b/components/dash-table/package-lock.json @@ -1,12 +1,12 @@ { "name": "dash-table", - "version": "7.2.0", + "version": "7.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "dash-table", - "version": "7.2.0", + "version": "7.3.0", "license": "MIT", "devDependencies": { "@babel/cli": "^7.28.6", @@ -8104,6 +8104,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -8678,6 +8679,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -9407,6 +9409,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -10185,6 +10188,7 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -10514,6 +10518,7 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, "license": "MIT" }, "node_modules/react-select": { diff --git a/components/dash-table/package.json b/components/dash-table/package.json index e387415a4c..55db347b10 100644 --- a/components/dash-table/package.json +++ b/components/dash-table/package.json @@ -1,6 +1,6 @@ { "name": "dash-table", - "version": "7.2.0", + "version": "7.3.0", "description": "Dash table", "repository": { "type": "git", diff --git a/dash/dash-renderer/package.json b/dash/dash-renderer/package.json index 3fc507110f..cfcb5050ed 100644 --- a/dash/dash-renderer/package.json +++ b/dash/dash-renderer/package.json @@ -1,6 +1,6 @@ { "name": "dash-renderer", - "version": "3.2.0", + "version": "3.3.0", "description": "render dash components in react", "main": "build/dash_renderer.min.js", "scripts": { From b3babe43725ee6afcb0f5d5af82853729628509e Mon Sep 17 00:00:00 2001 From: Adrian Borrmann Date: Thu, 18 Jun 2026 15:51:17 -0600 Subject: [PATCH 102/103] build artifacts --- dash/dash-renderer/build/dash_renderer.dev.js | 10081 ++++++++-------- dash/dash-renderer/build/dash_renderer.min.js | 2 +- dash/dash_table/DataTable.py | 30 +- dash/dash_table/async-export.js | 2 +- dash/dash_table/async-export.js.map | 2 +- dash/dash_table/async-highlight.js | 2 +- dash/dash_table/async-highlight.js.map | 2 +- dash/dash_table/async-table.js | 2 +- dash/dash_table/async-table.js.map | 2 +- dash/dash_table/bundle.js | 2 +- dash/dash_table/bundle.js.map | 2 +- dash/dash_table/demo.js | 2 +- dash/dash_table/demo.js.map | 2 +- dash/dash_table/package-info.json | 4 +- dash/dcc/Button.py | 14 +- dash/dcc/Checklist.py | 14 +- dash/dcc/Clipboard.py | 14 +- dash/dcc/ConfirmDialog.py | 14 +- dash/dcc/ConfirmDialogProvider.py | 14 +- dash/dcc/DatePickerRange.py | 14 +- dash/dcc/DatePickerSingle.py | 14 +- dash/dcc/Download.py | 14 +- dash/dcc/Dropdown.py | 14 +- dash/dcc/Geolocation.py | 14 +- dash/dcc/Graph.py | 14 +- dash/dcc/Input.py | 14 +- dash/dcc/Interval.py | 14 +- dash/dcc/Link.py | 14 +- dash/dcc/Loading.py | 14 +- dash/dcc/Location.py | 14 +- dash/dcc/Markdown.py | 14 +- dash/dcc/RadioItems.py | 14 +- dash/dcc/RangeSlider.py | 14 +- dash/dcc/Slider.py | 14 +- dash/dcc/Store.py | 14 +- dash/dcc/Tab.py | 14 +- dash/dcc/Tabs.py | 14 +- dash/dcc/Textarea.py | 14 +- dash/dcc/Tooltip.py | 14 +- dash/dcc/Upload.py | 14 +- dash/dcc/async-datepicker.js | 2 +- dash/dcc/async-datepicker.js.map | 2 +- dash/dcc/async-dropdown.js | 2 +- dash/dcc/async-dropdown.js.LICENSE.txt | 5 - dash/dcc/async-dropdown.js.map | 2 +- dash/dcc/async-graph.js | 2 +- dash/dcc/async-graph.js.map | 2 +- dash/dcc/async-markdown.js | 2 +- dash/dcc/async-markdown.js.map | 2 +- dash/dcc/async-slider.js | 2 +- dash/dcc/async-slider.js.LICENSE.txt | 11 - dash/dcc/async-slider.js.map | 2 +- dash/dcc/async-upload.js | 2 +- dash/dcc/async-upload.js.map | 2 +- dash/dcc/dash_core_components-shared.js | 2 +- dash/dcc/dash_core_components-shared.js.map | 2 +- dash/dcc/dash_core_components.js | 2 +- dash/dcc/dash_core_components.js.map | 2 +- dash/dcc/package-info.json | 6 +- dash/dcc/plotly.min.js | 8 + dash/html/A.py | 14 +- dash/html/Abbr.py | 14 +- dash/html/Acronym.py | 14 +- dash/html/Address.py | 14 +- dash/html/Area.py | 14 +- dash/html/Article.py | 14 +- dash/html/Aside.py | 14 +- dash/html/Audio.py | 14 +- dash/html/B.py | 14 +- dash/html/Base.py | 14 +- dash/html/Basefont.py | 14 +- dash/html/Bdi.py | 14 +- dash/html/Bdo.py | 14 +- dash/html/Big.py | 14 +- dash/html/Blink.py | 14 +- dash/html/Blockquote.py | 14 +- dash/html/Br.py | 14 +- dash/html/Button.py | 14 +- dash/html/Canvas.py | 14 +- dash/html/Caption.py | 14 +- dash/html/Center.py | 14 +- dash/html/Cite.py | 14 +- dash/html/Code.py | 14 +- dash/html/Col.py | 14 +- dash/html/Colgroup.py | 14 +- dash/html/Content.py | 14 +- dash/html/Data.py | 14 +- dash/html/Datalist.py | 14 +- dash/html/Dd.py | 14 +- dash/html/Del.py | 14 +- dash/html/Details.py | 14 +- dash/html/Dfn.py | 14 +- dash/html/Dialog.py | 14 +- dash/html/Div.py | 14 +- dash/html/Dl.py | 14 +- dash/html/Dt.py | 14 +- dash/html/Em.py | 14 +- dash/html/Embed.py | 14 +- dash/html/Fieldset.py | 14 +- dash/html/Figcaption.py | 14 +- dash/html/Figure.py | 14 +- dash/html/Font.py | 14 +- dash/html/Footer.py | 14 +- dash/html/Form.py | 14 +- dash/html/Frame.py | 14 +- dash/html/Frameset.py | 14 +- dash/html/H1.py | 14 +- dash/html/H2.py | 14 +- dash/html/H3.py | 14 +- dash/html/H4.py | 14 +- dash/html/H5.py | 14 +- dash/html/H6.py | 14 +- dash/html/Header.py | 14 +- dash/html/Hgroup.py | 14 +- dash/html/Hr.py | 14 +- dash/html/I.py | 14 +- dash/html/Iframe.py | 14 +- dash/html/Img.py | 14 +- dash/html/Ins.py | 14 +- dash/html/Kbd.py | 14 +- dash/html/Keygen.py | 14 +- dash/html/Label.py | 14 +- dash/html/Legend.py | 14 +- dash/html/Li.py | 14 +- dash/html/Link.py | 14 +- dash/html/Main.py | 14 +- dash/html/MapEl.py | 14 +- dash/html/Mark.py | 14 +- dash/html/Marquee.py | 14 +- dash/html/Meta.py | 14 +- dash/html/Meter.py | 14 +- dash/html/Nav.py | 14 +- dash/html/Nobr.py | 14 +- dash/html/Noscript.py | 14 +- dash/html/ObjectEl.py | 14 +- dash/html/Ol.py | 14 +- dash/html/Optgroup.py | 14 +- dash/html/Option.py | 14 +- dash/html/Output.py | 14 +- dash/html/P.py | 14 +- dash/html/Param.py | 14 +- dash/html/Picture.py | 14 +- dash/html/Plaintext.py | 14 +- dash/html/Pre.py | 14 +- dash/html/Progress.py | 14 +- dash/html/Q.py | 14 +- dash/html/Rb.py | 14 +- dash/html/Rp.py | 14 +- dash/html/Rt.py | 14 +- dash/html/Rtc.py | 14 +- dash/html/Ruby.py | 14 +- dash/html/S.py | 14 +- dash/html/Samp.py | 14 +- dash/html/Script.py | 14 +- dash/html/Section.py | 14 +- dash/html/Select.py | 14 +- dash/html/Shadow.py | 14 +- dash/html/Slot.py | 14 +- dash/html/Small.py | 14 +- dash/html/Source.py | 14 +- dash/html/Spacer.py | 14 +- dash/html/Span.py | 14 +- dash/html/Strike.py | 14 +- dash/html/Strong.py | 14 +- dash/html/Sub.py | 14 +- dash/html/Summary.py | 14 +- dash/html/Sup.py | 14 +- dash/html/Table.py | 14 +- dash/html/Tbody.py | 14 +- dash/html/Td.py | 14 +- dash/html/Template.py | 14 +- dash/html/Textarea.py | 14 +- dash/html/Tfoot.py | 14 +- dash/html/Th.py | 14 +- dash/html/Thead.py | 14 +- dash/html/Time.py | 14 +- dash/html/Title.py | 14 +- dash/html/Tr.py | 14 +- dash/html/Track.py | 14 +- dash/html/U.py | 14 +- dash/html/Ul.py | 14 +- dash/html/Var.py | 14 +- dash/html/Video.py | 14 +- dash/html/Wbr.py | 14 +- dash/html/Xmp.py | 14 +- dash/html/package-info.json | 2 +- 186 files changed, 6709 insertions(+), 5606 deletions(-) delete mode 100644 dash/dcc/async-dropdown.js.LICENSE.txt delete mode 100644 dash/dcc/async-slider.js.LICENSE.txt create mode 100644 dash/dcc/plotly.min.js diff --git a/dash/dash-renderer/build/dash_renderer.dev.js b/dash/dash-renderer/build/dash_renderer.dev.js index 4668ad0893..c299c7a2d5 100644 --- a/dash/dash-renderer/build/dash_renderer.dev.js +++ b/dash/dash-renderer/build/dash_renderer.dev.js @@ -1,21 +1,21 @@ -/******/ (() => { // webpackBootstrap +/******/ (function() { // webpackBootstrap /******/ var __webpack_modules__ = ({ -/***/ "./node_modules/@plotly/dash-component-plugins/dist/index.js" +/***/ "./node_modules/@plotly/dash-component-plugins/dist/index.js": /*!*******************************************************************!*\ !*** ./node_modules/@plotly/dash-component-plugins/dist/index.js ***! \*******************************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { !function(e,n){ true?module.exports=n(__webpack_require__(/*! react */ "react")):0}(window,(function(e){return function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=1)}([function(n,t){n.exports=e},function(e,n,t){"use strict";t.r(n),t.d(n,"asyncDecorator",(function(){return u})),t.d(n,"inheritAsyncDecorator",(function(){return a})),t.d(n,"isReady",(function(){return c})),t.d(n,"History",(function(){return d}));var r=t(0);function o(e,n,t,r,o,i,u){try{var a=e[i](u),c=a.value}catch(e){return void t(e)}a.done?n(c):Promise.resolve(c).then(r,o)}function i(e){return function(){var n=this,t=arguments;return new Promise((function(r,i){var u=e.apply(n,t);function a(e){o(u,r,i,a,c,"next",e)}function c(e){o(u,r,i,a,c,"throw",e)}a(void 0)}))}}var u=function(e,n){var t,o={isReady:new Promise((function(e){t=e})),get:Object(r.lazy)((function(){return Promise.resolve(n()).then((function(e){return setTimeout(i(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t(!0);case 2:o.isReady=!0;case 3:case"end":return e.stop()}}),e)}))),0),e}))}))};return Object.defineProperty(e,"_dashprivate_isLazyComponentReady",{get:function(){return o.isReady}}),o.get},a=function(e,n){Object.defineProperty(e,"_dashprivate_isLazyComponentReady",{get:function(){return c(n)}})},c=function(e){return e&&e._dashprivate_isLazyComponentReady};function f(e,n){for(var t=0;t /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", _extends({ - xmlns: "http://www.w3.org/2000/svg", - width: 18, - height: 18, - fill: "none", - viewBox: "0 0 14 14" -}, props), _path || (_path = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", { - fill: "#06800A", - fillOpacity: 0.8, - d: "M9.854 5.146a.5.5 0 0 1 0 .708l-3.5 3.5a.5.5 0 0 1-.708 0l-1.5-1.5a.5.5 0 1 1 .708-.708L6 8.293l3.146-3.147a.5.5 0 0 1 .708 0M13.5 7A6.5 6.5 0 1 1 7 .5 6.507 6.507 0 0 1 13.5 7m-1 0A5.5 5.5 0 1 0 7 12.5 5.507 5.507 0 0 0 12.5 7" -}))); +var SvgCheckIcon = function SvgCheckIcon(props) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", _extends({ + xmlns: "http://www.w3.org/2000/svg", + width: 18, + height: 18, + fill: "none", + viewBox: "0 0 14 14" + }, props), _path || (_path = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", { + fill: "#06800A", + fillOpacity: 0.8, + d: "M9.854 5.146a.5.5 0 0 1 0 .708l-3.5 3.5a.5.5 0 0 1-.708 0l-1.5-1.5a.5.5 0 1 1 .708-.708L6 8.293l3.146-3.147a.5.5 0 0 1 .708 0M13.5 7A6.5 6.5 0 1 1 7 .5 6.507 6.507 0 0 1 13.5 7m-1 0A5.5 5.5 0 1 0 7 12.5 5.507 5.507 0 0 0 12.5 7" + }))); +}; /* harmony default export */ __webpack_exports__["default"] = (SvgCheckIcon); -/***/ }, +/***/ }), -/***/ "./src/components/error/icons/ClockIcon.svg" +/***/ "./src/components/error/icons/ClockIcon.svg": /*!**************************************************!*\ !*** ./src/components/error/icons/ClockIcon.svg ***! \**************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -52,24 +54,26 @@ __webpack_require__.r(__webpack_exports__); var _path; function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } -var SvgClockIcon = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", _extends({ - xmlns: "http://www.w3.org/2000/svg", - viewBox: "0 0 54 24" -}, props), _path || (_path = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", { - fill: "none", - stroke: "#fff", - strokeWidth: 4, - d: "M27 0v22h22" -}))); +var SvgClockIcon = function SvgClockIcon(props) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", _extends({ + xmlns: "http://www.w3.org/2000/svg", + viewBox: "0 0 54 24" + }, props), _path || (_path = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", { + fill: "none", + stroke: "#fff", + strokeWidth: 4, + d: "M27 0v22h22" + }))); +}; /* harmony default export */ __webpack_exports__["default"] = (SvgClockIcon); -/***/ }, +/***/ }), -/***/ "./src/components/error/icons/CloudSlashIcon.svg" +/***/ "./src/components/error/icons/CloudSlashIcon.svg": /*!*******************************************************!*\ !*** ./src/components/error/icons/CloudSlashIcon.svg ***! \*******************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -78,23 +82,25 @@ __webpack_require__.r(__webpack_exports__); var _path; function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } -var SvgCloudSlashIcon = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", _extends({ - xmlns: "http://www.w3.org/2000/svg", - width: 32, - height: 32, - viewBox: "0 0 256 256" -}, props), _path || (_path = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", { - d: "M248 128.72A87.74 87.74 0 0 1 222.41 190a4 4 0 0 1-5.77-.16L103.78 65.67a4 4 0 0 1 .39-5.76A87.82 87.82 0 0 1 160.87 40c48.28.47 87.51 40.43 87.13 88.72M53.92 34.62a8 8 0 1 0-11.84 10.76l39.25 43.18-.06.11A64 64 0 0 0 8 153c.53 35.12 29.84 63 65 63h87a87.7 87.7 0 0 0 31.78-5.95l10.3 11.33a8 8 0 0 0 11.33.52 8.32 8.32 0 0 0 .29-11.52Z" -}))); +var SvgCloudSlashIcon = function SvgCloudSlashIcon(props) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", _extends({ + xmlns: "http://www.w3.org/2000/svg", + width: 32, + height: 32, + viewBox: "0 0 256 256" + }, props), _path || (_path = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", { + d: "M248 128.72A87.74 87.74 0 0 1 222.41 190a4 4 0 0 1-5.77-.16L103.78 65.67a4 4 0 0 1 .39-5.76A87.82 87.82 0 0 1 160.87 40c48.28.47 87.51 40.43 87.13 88.72M53.92 34.62a8 8 0 1 0-11.84 10.76l39.25 43.18-.06.11A64 64 0 0 0 8 153c.53 35.12 29.84 63 65 63h87a87.7 87.7 0 0 0 31.78-5.95l10.3 11.33a8 8 0 0 0 11.33.52 8.32 8.32 0 0 0 .29-11.52Z" + }))); +}; /* harmony default export */ __webpack_exports__["default"] = (SvgCloudSlashIcon); -/***/ }, +/***/ }), -/***/ "./src/components/error/icons/CollapseIcon.svg" +/***/ "./src/components/error/icons/CollapseIcon.svg": /*!*****************************************************!*\ !*** ./src/components/error/icons/CollapseIcon.svg ***! \*****************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -103,24 +109,26 @@ __webpack_require__.r(__webpack_exports__); var _path; function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } -var SvgCollapseIcon = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", _extends({ - xmlns: "http://www.w3.org/2000/svg", - width: 10, - height: 6, - fill: "none" -}, props), _path || (_path = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", { - stroke: "#A2B1C6", - d: "m1 1 4 4 4-4" -}))); +var SvgCollapseIcon = function SvgCollapseIcon(props) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", _extends({ + xmlns: "http://www.w3.org/2000/svg", + width: 10, + height: 6, + fill: "none" + }, props), _path || (_path = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", { + stroke: "#A2B1C6", + d: "m1 1 4 4 4-4" + }))); +}; /* harmony default export */ __webpack_exports__["default"] = (SvgCollapseIcon); -/***/ }, +/***/ }), -/***/ "./src/components/error/icons/ErrorIcon.svg" +/***/ "./src/components/error/icons/ErrorIcon.svg": /*!**************************************************!*\ !*** ./src/components/error/icons/ErrorIcon.svg ***! \**************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -129,23 +137,25 @@ __webpack_require__.r(__webpack_exports__); var _path; function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } -var SvgErrorIcon = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", _extends({ - xmlns: "http://www.w3.org/2000/svg", - width: 32, - height: 32, - viewBox: "0 0 256 256" -}, props), _path || (_path = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", { - d: "M236.8 188.09 149.35 36.22a24.76 24.76 0 0 0-42.7 0L19.2 188.09a23.51 23.51 0 0 0 0 23.72A24.35 24.35 0 0 0 40.55 224h174.9a24.35 24.35 0 0 0 21.33-12.19 23.51 23.51 0 0 0 .02-23.72m-13.87 15.71a8.5 8.5 0 0 1-7.48 4.2H40.55a8.5 8.5 0 0 1-7.48-4.2 7.59 7.59 0 0 1 0-7.72l87.45-151.87a8.75 8.75 0 0 1 15 0l87.45 151.87a7.59 7.59 0 0 1-.04 7.72M120 144v-40a8 8 0 0 1 16 0v40a8 8 0 0 1-16 0m20 36a12 12 0 1 1-12-12 12 12 0 0 1 12 12" -}))); +var SvgErrorIcon = function SvgErrorIcon(props) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", _extends({ + xmlns: "http://www.w3.org/2000/svg", + width: 32, + height: 32, + viewBox: "0 0 256 256" + }, props), _path || (_path = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", { + d: "M236.8 188.09 149.35 36.22a24.76 24.76 0 0 0-42.7 0L19.2 188.09a23.51 23.51 0 0 0 0 23.72A24.35 24.35 0 0 0 40.55 224h174.9a24.35 24.35 0 0 0 21.33-12.19 23.51 23.51 0 0 0 .02-23.72m-13.87 15.71a8.5 8.5 0 0 1-7.48 4.2H40.55a8.5 8.5 0 0 1-7.48-4.2 7.59 7.59 0 0 1 0-7.72l87.45-151.87a8.75 8.75 0 0 1 15 0l87.45 151.87a7.59 7.59 0 0 1-.04 7.72M120 144v-40a8 8 0 0 1 16 0v40a8 8 0 0 1-16 0m20 36a12 12 0 1 1-12-12 12 12 0 0 1 12 12" + }))); +}; /* harmony default export */ __webpack_exports__["default"] = (SvgErrorIcon); -/***/ }, +/***/ }), -/***/ "./src/components/error/icons/Expand.svg" +/***/ "./src/components/error/icons/Expand.svg": /*!***********************************************!*\ !*** ./src/components/error/icons/Expand.svg ***! \***********************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -154,24 +164,26 @@ __webpack_require__.r(__webpack_exports__); var _path; function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } -var SvgExpand = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", _extends({ - xmlns: "http://www.w3.org/2000/svg", - width: 30, - height: 30, - fill: "currentColor", - viewBox: "0 0 256 256" -}, props), _path || (_path = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", { - d: "M201.54 54.46A104 104 0 0 0 54.46 201.54 104 104 0 0 0 201.54 54.46m-11.31 135.77a88 88 0 1 1 0-124.46 88.11 88.11 0 0 1 0 124.46m-16.57-88.57L147.31 128l26.35 26.34a8 8 0 0 1-11.32 11.32l-32-32a8 8 0 0 1 0-11.32l32-32a8 8 0 0 1 11.32 11.32m-56 0L91.31 128l26.35 26.34a8 8 0 0 1-11.32 11.32l-32-32a8 8 0 0 1 0-11.32l32-32a8 8 0 0 1 11.32 11.32" -}))); +var SvgExpand = function SvgExpand(props) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", _extends({ + xmlns: "http://www.w3.org/2000/svg", + width: 30, + height: 30, + fill: "currentColor", + viewBox: "0 0 256 256" + }, props), _path || (_path = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", { + d: "M201.54 54.46A104 104 0 0 0 54.46 201.54 104 104 0 0 0 201.54 54.46m-11.31 135.77a88 88 0 1 1 0-124.46 88.11 88.11 0 0 1 0 124.46m-16.57-88.57L147.31 128l26.35 26.34a8 8 0 0 1-11.32 11.32l-32-32a8 8 0 0 1 0-11.32l32-32a8 8 0 0 1 11.32 11.32m-56 0L91.31 128l26.35 26.34a8 8 0 0 1-11.32 11.32l-32-32a8 8 0 0 1 0-11.32l32-32a8 8 0 0 1 11.32 11.32" + }))); +}; /* harmony default export */ __webpack_exports__["default"] = (SvgExpand); -/***/ }, +/***/ }), -/***/ "./src/components/error/icons/GraphIcon.svg" +/***/ "./src/components/error/icons/GraphIcon.svg": /*!**************************************************!*\ !*** ./src/components/error/icons/GraphIcon.svg ***! \**************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -180,23 +192,25 @@ __webpack_require__.r(__webpack_exports__); var _path; function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } -var SvgGraphIcon = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", _extends({ - xmlns: "http://www.w3.org/2000/svg", - width: 32, - height: 32, - viewBox: "0 0 256 256" -}, props), _path || (_path = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", { - d: "M200 152a31.84 31.84 0 0 0-19.53 6.68l-23.11-18A31.65 31.65 0 0 0 160 128c0-.74 0-1.48-.08-2.21l13.23-4.41A32 32 0 1 0 168 104c0 .74 0 1.48.08 2.21l-13.23 4.41A32 32 0 0 0 128 96a32.6 32.6 0 0 0-5.27.44L115.89 81A32 32 0 1 0 96 88a32.6 32.6 0 0 0 5.27-.44l6.84 15.4a31.92 31.92 0 0 0-8.57 39.64l-25.71 22.84a32.06 32.06 0 1 0 10.63 12l25.71-22.84a31.91 31.91 0 0 0 37.36-1.24l23.11 18A31.65 31.65 0 0 0 168 184a32 32 0 1 0 32-32m0-64a16 16 0 1 1-16 16 16 16 0 0 1 16-16M80 56a16 16 0 1 1 16 16 16 16 0 0 1-16-16M56 208a16 16 0 1 1 16-16 16 16 0 0 1-16 16m56-80a16 16 0 1 1 16 16 16 16 0 0 1-16-16m88 72a16 16 0 1 1 16-16 16 16 0 0 1-16 16" -}))); +var SvgGraphIcon = function SvgGraphIcon(props) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", _extends({ + xmlns: "http://www.w3.org/2000/svg", + width: 32, + height: 32, + viewBox: "0 0 256 256" + }, props), _path || (_path = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", { + d: "M200 152a31.84 31.84 0 0 0-19.53 6.68l-23.11-18A31.65 31.65 0 0 0 160 128c0-.74 0-1.48-.08-2.21l13.23-4.41A32 32 0 1 0 168 104c0 .74 0 1.48.08 2.21l-13.23 4.41A32 32 0 0 0 128 96a32.6 32.6 0 0 0-5.27.44L115.89 81A32 32 0 1 0 96 88a32.6 32.6 0 0 0 5.27-.44l6.84 15.4a31.92 31.92 0 0 0-8.57 39.64l-25.71 22.84a32.06 32.06 0 1 0 10.63 12l25.71-22.84a31.91 31.91 0 0 0 37.36-1.24l23.11 18A31.65 31.65 0 0 0 168 184a32 32 0 1 0 32-32m0-64a16 16 0 1 1-16 16 16 16 0 0 1 16-16M80 56a16 16 0 1 1 16 16 16 16 0 0 1-16-16M56 208a16 16 0 1 1 16-16 16 16 0 0 1-16 16m56-80a16 16 0 1 1 16 16 16 16 0 0 1-16-16m88 72a16 16 0 1 1 16-16 16 16 0 0 1-16 16" + }))); +}; /* harmony default export */ __webpack_exports__["default"] = (SvgGraphIcon); -/***/ }, +/***/ }), -/***/ "./src/components/error/icons/OffIcon.svg" +/***/ "./src/components/error/icons/OffIcon.svg": /*!************************************************!*\ !*** ./src/components/error/icons/OffIcon.svg ***! \************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -205,24 +219,26 @@ __webpack_require__.r(__webpack_exports__); var _path; function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } -var SvgOffIcon = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", _extends({ - xmlns: "http://www.w3.org/2000/svg", - width: 18, - height: 18, - fill: "#C73A3A", - viewBox: "0 0 256 256" -}, props), _path || (_path = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", { - d: "M165.66 101.66 139.31 128l26.35 26.34a8 8 0 0 1-11.32 11.32L128 139.31l-26.34 26.35a8 8 0 0 1-11.32-11.32L116.69 128l-26.35-26.34a8 8 0 0 1 11.32-11.32L128 116.69l26.34-26.35a8 8 0 0 1 11.32 11.32M232 128A104 104 0 1 1 128 24a104.11 104.11 0 0 1 104 104m-16 0a88 88 0 1 0-88 88 88.1 88.1 0 0 0 88-88" -}))); +var SvgOffIcon = function SvgOffIcon(props) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("svg", _extends({ + xmlns: "http://www.w3.org/2000/svg", + width: 18, + height: 18, + fill: "#C73A3A", + viewBox: "0 0 256 256" + }, props), _path || (_path = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement("path", { + d: "M165.66 101.66 139.31 128l26.35 26.34a8 8 0 0 1-11.32 11.32L128 139.31l-26.34 26.35a8 8 0 0 1-11.32-11.32L116.69 128l-26.35-26.34a8 8 0 0 1 11.32-11.32L128 116.69l26.34-26.35a8 8 0 0 1 11.32 11.32M232 128A104 104 0 1 1 128 24a104.11 104.11 0 0 1 104 104m-16 0a88 88 0 1 0-88 88 88.1 88.1 0 0 0 88-88" + }))); +}; /* harmony default export */ __webpack_exports__["default"] = (SvgOffIcon); -/***/ }, +/***/ }), -/***/ "./src/AppProvider.react.tsx" +/***/ "./src/AppProvider.react.tsx": /*!***********************************!*\ !*** ./src/AppProvider.react.tsx ***! \***********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -235,11 +251,12 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _AppContainer_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./AppContainer.react */ "./src/AppContainer.react.js"); /* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./config */ "./src/config.ts"); /* harmony import */ var _observers_websocketObserver__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./observers/websocketObserver */ "./src/observers/websocketObserver.ts"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } @@ -253,7 +270,7 @@ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } -var AppProvider = _ref => { +var AppProvider = function AppProvider(_ref) { var _ref$hooks = _ref.hooks, hooks = _ref$hooks === void 0 ? { layout_pre: null, @@ -263,12 +280,14 @@ var AppProvider = _ref => { callback_resolved: null, request_refresh_jwt: null } : _ref$hooks; - var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(() => new _store__WEBPACK_IMPORTED_MODULE_3__["default"]()), + var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(function () { + return new _store__WEBPACK_IMPORTED_MODULE_3__["default"](); + }), _useState2 = _slicedToArray(_useState, 1), store = _useState2[0].store; // Initialize WebSocket connection if enabled or if websocket config is available // (for per-callback websocket=True) - (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => { + (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { var _config$websocket, _config$websocket2, _config$websocket3; var config = (0,_config__WEBPACK_IMPORTED_MODULE_5__["default"])(); if ((_config$websocket = config.websocket) !== null && _config$websocket !== void 0 && _config$websocket.enabled || (_config$websocket2 = config.websocket) !== null && _config$websocket2 !== void 0 && _config$websocket2.url && (_config$websocket3 = config.websocket) !== null && _config$websocket3 !== void 0 && _config$websocket3.worker_url) { @@ -285,7 +304,7 @@ var AppProvider = _ref => { (0,_observers_websocketObserver__WEBPACK_IMPORTED_MODULE_6__.initializeWebSocket)(store, fullConfig); } // Cleanup on unmount - return () => { + return function () { (0,_observers_websocketObserver__WEBPACK_IMPORTED_MODULE_6__.disconnectWebSocket)(); }; }, [store]); @@ -307,115 +326,136 @@ AppProvider.propTypes = { }; /* harmony default export */ __webpack_exports__["default"] = (AppProvider); -/***/ }, +/***/ }), -/***/ "./src/StoreObserver.ts" +/***/ "./src/StoreObserver.ts": /*!******************************!*\ !*** ./src/StoreObserver.ts ***! \******************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ StoreObserver) +/* harmony export */ "default": function() { return /* binding */ StoreObserver; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/any.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/filter.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/map.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } - -class StoreObserver { - constructor(_store) { - _defineProperty(this, "_store", void 0); - _defineProperty(this, "_unsubscribe", void 0); - _defineProperty(this, "_observers", []); - _defineProperty(this, "observe", (observer, inputs) => { - if (typeof observer === 'function') { - if (!Array.isArray(inputs)) { - throw new Error('inputs must be an array'); - } - this.add(observer, inputs); - return () => this.remove(observer); - } - this.add(observer.observer, observer.inputs); - return () => this.remove(observer.observer); - }); - _defineProperty(this, "setStore", store => { - this.__finalize__(); - this.__init__(store); - }); - _defineProperty(this, "__finalize__", () => { - var _this$_unsubscribe; - return (_this$_unsubscribe = this._unsubscribe) === null || _this$_unsubscribe === void 0 ? void 0 : _this$_unsubscribe.call(this); - }); - _defineProperty(this, "__init__", store => { - this._store = store; - if (store) { - this._unsubscribe = store.subscribe(this.notify); - } - this._observers.forEach(o => { - o.lastState = null; - }); +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } + +var StoreObserver = /*#__PURE__*/_createClass(function StoreObserver(_store) { + var _this = this; + _classCallCheck(this, StoreObserver); + _defineProperty(this, "_store", void 0); + _defineProperty(this, "_unsubscribe", void 0); + _defineProperty(this, "_observers", []); + _defineProperty(this, "observe", function (observer, inputs) { + if (typeof observer === 'function') { + if (!Array.isArray(inputs)) { + throw new Error('inputs must be an array'); + } + _this.add(observer, inputs); + return function () { + return _this.remove(observer); + }; + } + _this.add(observer.observer, observer.inputs); + return function () { + return _this.remove(observer.observer); + }; + }); + _defineProperty(this, "setStore", function (store) { + _this.__finalize__(); + _this.__init__(store); + }); + _defineProperty(this, "__finalize__", function () { + var _this$_unsubscribe; + return (_this$_unsubscribe = _this._unsubscribe) === null || _this$_unsubscribe === void 0 ? void 0 : _this$_unsubscribe.call(_this); + }); + _defineProperty(this, "__init__", function (store) { + _this._store = store; + if (store) { + _this._unsubscribe = store.subscribe(_this.notify); + } + _this._observers.forEach(function (o) { + o.lastState = null; }); - _defineProperty(this, "add", (observer, inputs) => this._observers.push({ - inputPaths: (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(p => p.split('.'), inputs), + }); + _defineProperty(this, "add", function (observer, inputs) { + return _this._observers.push({ + inputPaths: (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (p) { + return p.split('.'); + }, inputs), lastState: null, observer, triggered: false - })); - _defineProperty(this, "notify", () => { - var store = this._store; - if (!store) { - return; - } - var state = store.getState(); - var triggered = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(o => !o.triggered && (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(i => (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(i, state) !== (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(i, o.lastState), o.inputPaths), this._observers); - triggered.forEach(o => { - o.triggered = true; - }); - triggered.forEach(o => { - o.lastState = store.getState(); - o.observer(store); - o.triggered = false; - }); }); - _defineProperty(this, "remove", observer => this._observers.splice(this._observers.findIndex(o => observer === o.observer, this._observers), 1)); - this.__init__(_store); - } -} + }); + _defineProperty(this, "notify", function () { + var store = _this._store; + if (!store) { + return; + } + var state = store.getState(); + var triggered = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(function (o) { + return !o.triggered && (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(function (i) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(i, state) !== (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(i, o.lastState); + }, o.inputPaths); + }, _this._observers); + triggered.forEach(function (o) { + o.triggered = true; + }); + triggered.forEach(function (o) { + o.lastState = store.getState(); + o.observer(store); + o.triggered = false; + }); + }); + _defineProperty(this, "remove", function (observer) { + return _this._observers.splice(_this._observers.findIndex(function (o) { + return observer === o.observer; + }, _this._observers), 1); + }); + this.__init__(_store); +}); -/***/ }, -/***/ "./src/actions/callbacks.ts" +/***/ }), + +/***/ "./src/actions/callbacks.ts": /*!**********************************!*\ !*** ./src/actions/callbacks.ts ***! \**********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ addBlockedCallbacks: () => (/* binding */ addBlockedCallbacks), -/* harmony export */ addCompletedCallbacks: () => (/* binding */ addCompletedCallbacks), -/* harmony export */ addExecutedCallbacks: () => (/* binding */ addExecutedCallbacks), -/* harmony export */ addExecutingCallbacks: () => (/* binding */ addExecutingCallbacks), -/* harmony export */ addPrioritizedCallbacks: () => (/* binding */ addPrioritizedCallbacks), -/* harmony export */ addRequestedCallbacks: () => (/* binding */ addRequestedCallbacks), -/* harmony export */ addStoredCallbacks: () => (/* binding */ addStoredCallbacks), -/* harmony export */ addWatchedCallbacks: () => (/* binding */ addWatchedCallbacks), -/* harmony export */ aggregateCallbacks: () => (/* binding */ aggregateCallbacks), -/* harmony export */ executeCallback: () => (/* binding */ executeCallback), -/* harmony export */ removeBlockedCallbacks: () => (/* binding */ removeBlockedCallbacks), -/* harmony export */ removeExecutedCallbacks: () => (/* binding */ removeExecutedCallbacks), -/* harmony export */ removeExecutingCallbacks: () => (/* binding */ removeExecutingCallbacks), -/* harmony export */ removePrioritizedCallbacks: () => (/* binding */ removePrioritizedCallbacks), -/* harmony export */ removeRequestedCallbacks: () => (/* binding */ removeRequestedCallbacks), -/* harmony export */ removeStoredCallbacks: () => (/* binding */ removeStoredCallbacks), -/* harmony export */ removeWatchedCallbacks: () => (/* binding */ removeWatchedCallbacks) +/* harmony export */ addBlockedCallbacks: function() { return /* binding */ addBlockedCallbacks; }, +/* harmony export */ addCompletedCallbacks: function() { return /* binding */ addCompletedCallbacks; }, +/* harmony export */ addExecutedCallbacks: function() { return /* binding */ addExecutedCallbacks; }, +/* harmony export */ addExecutingCallbacks: function() { return /* binding */ addExecutingCallbacks; }, +/* harmony export */ addPrioritizedCallbacks: function() { return /* binding */ addPrioritizedCallbacks; }, +/* harmony export */ addRequestedCallbacks: function() { return /* binding */ addRequestedCallbacks; }, +/* harmony export */ addStoredCallbacks: function() { return /* binding */ addStoredCallbacks; }, +/* harmony export */ addWatchedCallbacks: function() { return /* binding */ addWatchedCallbacks; }, +/* harmony export */ aggregateCallbacks: function() { return /* binding */ aggregateCallbacks; }, +/* harmony export */ executeCallback: function() { return /* binding */ executeCallback; }, +/* harmony export */ removeBlockedCallbacks: function() { return /* binding */ removeBlockedCallbacks; }, +/* harmony export */ removeExecutedCallbacks: function() { return /* binding */ removeExecutedCallbacks; }, +/* harmony export */ removeExecutingCallbacks: function() { return /* binding */ removeExecutingCallbacks; }, +/* harmony export */ removePrioritizedCallbacks: function() { return /* binding */ removePrioritizedCallbacks; }, +/* harmony export */ removeRequestedCallbacks: function() { return /* binding */ removeRequestedCallbacks; }, +/* harmony export */ removeStoredCallbacks: function() { return /* binding */ removeStoredCallbacks; }, +/* harmony export */ removeWatchedCallbacks: function() { return /* binding */ removeWatchedCallbacks; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assocPath.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/concat.js"); @@ -445,11 +485,16 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _loading__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./loading */ "./src/actions/loading.ts"); /* harmony import */ var _wrapper_wrapping__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../wrapper/wrapping */ "./src/wrapper/wrapping.ts"); /* harmony import */ var _utils_workerClient__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../utils/workerClient */ "./src/utils/workerClient.ts"); -function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(typeof e + " is not iterable"); } +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); } function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } @@ -459,8 +504,8 @@ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } @@ -527,15 +572,15 @@ function fillVals(paths, layout, cb, specs, depType) { var getter = depType === 'Input' ? cb.getInputs : cb.getState; var errors = []; var emptyMultiValues = 0; - var inputVals = getter(paths).map((inputList, i) => { - var _unwrapIfNotMulti = unwrapIfNotMulti(paths, inputList.map(_ref => { + var inputVals = getter(paths).map(function (inputList, i) { + var _unwrapIfNotMulti = unwrapIfNotMulti(paths, inputList.map(function (_ref) { var id = _ref.id, property = _ref.property, path_ = _ref.path; return { id, property, - value: (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])([...path_, 'props', property], layout) + value: (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])([].concat(_toConsumableArray(path_), ['props', property]), layout) }; }), specs[i], cb.anyVals, depType), _unwrapIfNotMulti2 = _slicedToArray(_unwrapIfNotMulti, 2), @@ -574,8 +619,10 @@ function refErr(errors, paths) { } throw new ReferenceError(err); } -var getVals = input => Array.isArray(input) ? (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])('value', input) : input.value; -var zipIfArray = (a, b) => { +var getVals = function getVals(input) { + return Array.isArray(input) ? (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])('value', input) : input.value; +}; +var zipIfArray = function zipIfArray(a, b) { if (Array.isArray(a)) { // For client-side callbacks with multiple Outputs, only return a single dash_clientside.no_update if (b === window.dash_clientside.no_update) { @@ -593,7 +640,7 @@ function handleClientside(_x, _x2, _x3, _x4) { } function _handleClientside() { _handleClientside = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(dispatch, clientside_function, config, payload) { - var dc, inputs, outputs, state, requestTime, inputDict, stateDict, result, status, _returnValue, namespace, function_name, args, returnValue, totalTime, resources, _t4; + var dc, inputs, outputs, state, requestTime, inputDict, stateDict, result, status, _dc$namespace, _returnValue, namespace, function_name, args, returnValue, totalTime, resources, _t4; return _regenerator().w(function (_context3) { while (1) switch (_context3.p = _context3.n) { case 0: @@ -626,17 +673,19 @@ function _handleClientside() { } // setup callback context dc.callback_context = {}; - dc.callback_context.triggered = payload.changedPropIds.map(prop_id => ({ - prop_id: prop_id, - value: inputDict[prop_id] - })); + dc.callback_context.triggered = payload.changedPropIds.map(function (prop_id) { + return { + prop_id: prop_id, + value: inputDict[prop_id] + }; + }); dc.callback_context.triggered_id = getTriggeredId(payload.changedPropIds); dc.callback_context.inputs_list = inputs; dc.callback_context.inputs = inputDict; dc.callback_context.states_list = state; dc.callback_context.states = stateDict; dc.callback_context.outputs_list = outputs; - returnValue = dc[namespace][function_name](...args); + returnValue = (_dc$namespace = dc[namespace])[function_name].apply(_dc$namespace, _toConsumableArray(args)); delete dc.callback_context; if (!(typeof ((_returnValue = returnValue) === null || _returnValue === void 0 ? void 0 : _returnValue.then) === 'function')) { _context3.n = 3; @@ -648,11 +697,11 @@ function _handleClientside() { returnValue = _context3.v; case 3: if (outputs) { - zipIfArray(outputs, returnValue).forEach(_ref10 => { + zipIfArray(outputs, returnValue).forEach(function (_ref10) { var _ref11 = _slicedToArray(_ref10, 2), outi = _ref11[0], reti = _ref11[1]; - zipIfArray(outi, reti).forEach(_ref12 => { + zipIfArray(outi, reti).forEach(function (_ref12) { var _ref13 = _slicedToArray(_ref12, 2), outij = _ref13[0], retij = _ref13[1]; @@ -745,7 +794,7 @@ function updateComponent(component_id, props, cb) { */ function sideUpdate(outputs, cb) { return function (dispatch, getState) { - (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(outputs).reduce((acc, _ref2, i) => { + (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(outputs).reduce(function (acc, _ref2, i) { var _ref3 = _slicedToArray(_ref2, 2), id = _ref3[0], value = _ref3[1]; @@ -772,12 +821,12 @@ function sideUpdate(outputs, cb) { } else if (replacedIds.length === 1) { acc.push([replacedIds[0], props]); } else { - replacedIds.forEach(rep => { + replacedIds.forEach(function (rep) { acc.push([rep, props]); }); } return acc; - }, []).forEach(_ref4 => { + }, []).forEach(function (_ref4) { var _oldComponent; var _ref5 = _slicedToArray(_ref4, 2), id = _ref5[0], @@ -800,7 +849,7 @@ function sideUpdate(outputs, cb) { } dispatch((0,___WEBPACK_IMPORTED_MODULE_18__.setPaths)((0,_paths__WEBPACK_IMPORTED_MODULE_21__.computePaths)(_objectSpread(_objectSpread({}, oldComponent), {}, { props: _objectSpread(_objectSpread({}, oldComponent.props), patchedProps) - }), [...componentPath], state.paths, state.paths.events))); + }), _toConsumableArray(componentPath), state.paths, state.paths.events))); }); }; } @@ -819,11 +868,11 @@ function handleServerside(dispatch, hooks, config, payload, background, addition dispatch(sideUpdate(running.running, payload)); runningOff = running.runningOff; } - var fetchCallback = () => { + var fetchCallback = function fetchCallback() { var headers = (0,___WEBPACK_IMPORTED_MODULE_18__.getCSRFHeader)(config); var url = "".concat((0,_utils__WEBPACK_IMPORTED_MODULE_17__.urlBase)(config), "_dash-update-component"); var newBody = body; - var addArg = (name, value) => { + var addArg = function addArg(name, value) { var delim = '?'; if (url.includes('?')) { delim = '&'; @@ -844,13 +893,13 @@ function handleServerside(dispatch, hooks, config, payload, background, addition newBody = JSON.stringify(tmpBody); } if (moreArgs) { - moreArgs.forEach(_ref6 => { + moreArgs.forEach(function (_ref6) { var _ref7 = _slicedToArray(_ref6, 2), key = _ref7[0], value = _ref7[1]; return addArg(key, value); }); - moreArgs = moreArgs.filter(_ref8 => { + moreArgs = moreArgs.filter(function (_ref8) { var _ref9 = _slicedToArray(_ref8, 3), _ = _ref9[0], __ = _ref9[1], @@ -864,8 +913,8 @@ function handleServerside(dispatch, hooks, config, payload, background, addition body: newBody })); }; - return new Promise((resolve, reject) => { - var handleOutput = res => { + return new Promise(function (resolve, reject) { + var handleOutput = function handleOutput(res) { var status = res.status; if (job) { var callbackJob = getState().callbackJobs[job]; @@ -886,7 +935,7 @@ function handleServerside(dispatch, hooks, config, payload, background, addition __dash_download: Number(res.headers.get('Content-Length')) }; var timingHeaders = res.headers.get('Server-Timing') || ''; - timingHeaders.split(',').forEach(header => { + timingHeaders.split(',').forEach(function (header) { var name = header.split(';')[0]; var dur = header.match(/;dur=[0-9.]+/); if (dur) { @@ -903,7 +952,7 @@ function handleServerside(dispatch, hooks, config, payload, background, addition })); } } - var finishLine = data => { + var finishLine = function finishLine(data) { var multi = data.multi, response = data.response; if (hooks.request_post) { @@ -922,7 +971,7 @@ function handleServerside(dispatch, hooks, config, payload, background, addition recordProfile(result); resolve(result); }; - var completeJob = () => { + var completeJob = function completeJob() { if (job) { dispatch(removeCallbackJob({ jobId: job @@ -936,7 +985,7 @@ function handleServerside(dispatch, hooks, config, payload, background, addition } }; if (status === _constants_constants__WEBPACK_IMPORTED_MODULE_13__.STATUS.OK) { - res.json().then(data => { + res.json().then(function (data) { if (!cacheKey && data.cacheKey) { cacheKey = data.cacheKey; } @@ -962,7 +1011,7 @@ function handleServerside(dispatch, hooks, config, payload, background, addition } if (!background || data.response !== undefined) { if (data.dist) { - Promise.all(data.dist.map(_utils_libraries__WEBPACK_IMPORTED_MODULE_23__.loadLibrary)).then(() => { + Promise.all(data.dist.map(_utils_libraries__WEBPACK_IMPORTED_MODULE_23__.loadLibrary)).then(function () { completeJob(); finishLine(data); }); @@ -984,7 +1033,7 @@ function handleServerside(dispatch, hooks, config, payload, background, addition reject(res); } }; - var handleError = () => { + var handleError = function handleError() { if (config.ui) { dispatch(updateResourceUsage({ id: payload.output, @@ -996,7 +1045,7 @@ function handleServerside(dispatch, hooks, config, payload, background, addition } reject(new Error('Callback failed: the server did not respond.')); }; - var handle = () => { + var handle = function handle() { fetchCallback().then(handleOutput, handleError); }; handle(); @@ -1189,7 +1238,7 @@ function executeCallback(cb, config, hooks, paths, layout, _ref0, dispatch, getS } var outputs = []; var outputErrors = []; - allOutputs.forEach((out, i) => { + allOutputs.forEach(function (out, i) { var _unwrapIfNotMulti3 = unwrapIfNotMulti(paths, (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(['id', 'property']), out), cb.callback.outputs[i], cb.anyVals, 'Output'), _unwrapIfNotMulti4 = _slicedToArray(_unwrapIfNotMulti3, 2), outi = _unwrapIfNotMulti4[0], @@ -1217,7 +1266,7 @@ function executeCallback(cb, config, hooks, paths, layout, _ref0, dispatch, getS return _regenerator().w(function (_context2) { while (1) switch (_context2.p = _context2.n) { case 0: - loadingOutputs = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(outputs).map(out => { + loadingOutputs = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(outputs).map(function (out) { var _out$property; return { path: (0,_paths__WEBPACK_IMPORTED_MODULE_21__.getPath)(paths, out.id), @@ -1228,7 +1277,7 @@ function executeCallback(cb, config, hooks, paths, layout, _ref0, dispatch, getS dispatch((0,_loading__WEBPACK_IMPORTED_MODULE_25__.loading)(loadingOutputs)); _context2.p = 1; changedPropIds = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(cb.changedPropIds); - parsedChangedPropsIds = changedPropIds.map(propId => { + parsedChangedPropsIds = changedPropIds.map(function (propId) { if (propId.startsWith('{')) { return (0,_patternMatching__WEBPACK_IMPORTED_MODULE_24__.parsePMCId)(propId)[0]; } @@ -1253,7 +1302,7 @@ function executeCallback(cb, config, hooks, paths, layout, _ref0, dispatch, getS data = _context2.v; // Patch methodology: always run through parsePatchProps for each output currentLayout = getState().layout; - (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(outputs).forEach(out => { + (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(outputs).forEach(function (out) { var propName = cleanOutputProp(out.property); var outputPath = (0,_paths__WEBPACK_IMPORTED_MODULE_21__.getPath)(paths, out.id); var dataPath = [(0,_dependencies__WEBPACK_IMPORTED_MODULE_16__.stringifyId)(out.id), propName]; @@ -1283,7 +1332,7 @@ function executeCallback(cb, config, hooks, paths, layout, _ref0, dispatch, getS newHeaders = null; additionalArgs = []; jsonOutput = JSON.stringify(payload.outputs); - (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(getState().callbackJobs).forEach(job => { + (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(getState().callbackJobs).forEach(function (job) { if (jsonOutput === job.output) { // Terminate the old jobs that are not completed // set as outdated for the callback promise to @@ -1337,7 +1386,7 @@ function executeCallback(cb, config, hooks, paths, layout, _ref0, dispatch, getS // Layout may have changed. // DRY: Always run through parsePatchProps for each output _currentLayout = getState().layout; - (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(outputs).forEach(out => { + (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(outputs).forEach(function (out) { var propName = cleanOutputProp(out.property); var outputPath = (0,_paths__WEBPACK_IMPORTED_MODULE_21__.getPath)(paths, out.id); var dataPath = [(0,_dependencies__WEBPACK_IMPORTED_MODULE_16__.stringifyId)(out.id), propName]; @@ -1352,7 +1401,9 @@ function executeCallback(cb, config, hooks, paths, layout, _ref0, dispatch, getS _data = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(dataPath, newProps[propName], _data); }); if (dynamic_creator) { - setTimeout(() => dispatch((0,_requestDependencies__WEBPACK_IMPORTED_MODULE_22__.requestDependencies)()), 0); + setTimeout(function () { + return dispatch((0,_requestDependencies__WEBPACK_IMPORTED_MODULE_22__.requestDependencies)()); + }, 0); } return _context.a(2, { v: { @@ -1475,31 +1526,31 @@ function executeCallback(cb, config, hooks, paths, layout, _ref0, dispatch, getS } } -/***/ }, +/***/ }), -/***/ "./src/actions/dependencies_ts.ts" +/***/ "./src/actions/dependencies_ts.ts": /*!****************************************!*\ !*** ./src/actions/dependencies_ts.ts ***! \****************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DIRECT: () => (/* binding */ DIRECT), -/* harmony export */ INDIRECT: () => (/* binding */ INDIRECT), -/* harmony export */ combineIdAndProp: () => (/* binding */ combineIdAndProp), -/* harmony export */ getAllSubsequentOutputsForCallback: () => (/* binding */ getAllSubsequentOutputsForCallback), -/* harmony export */ getCallbacksByInput: () => (/* binding */ getCallbacksByInput), -/* harmony export */ getLayoutCallbacks: () => (/* binding */ getLayoutCallbacks), -/* harmony export */ getPriority: () => (/* binding */ getPriority), -/* harmony export */ getReadyCallbacks: () => (/* binding */ getReadyCallbacks), -/* harmony export */ getUniqueIdentifier: () => (/* binding */ getUniqueIdentifier), -/* harmony export */ includeObservers: () => (/* binding */ includeObservers), -/* harmony export */ makeResolvedCallback: () => (/* binding */ makeResolvedCallback), -/* harmony export */ mergeMax: () => (/* binding */ mergeMax), -/* harmony export */ pruneCallbacks: () => (/* binding */ pruneCallbacks), -/* harmony export */ resolveDeps: () => (/* binding */ resolveDeps) +/* harmony export */ DIRECT: function() { return /* binding */ DIRECT; }, +/* harmony export */ INDIRECT: function() { return /* binding */ INDIRECT; }, +/* harmony export */ combineIdAndProp: function() { return /* binding */ combineIdAndProp; }, +/* harmony export */ getAllSubsequentOutputsForCallback: function() { return /* binding */ getAllSubsequentOutputsForCallback; }, +/* harmony export */ getCallbacksByInput: function() { return /* binding */ getCallbacksByInput; }, +/* harmony export */ getLayoutCallbacks: function() { return /* binding */ getLayoutCallbacks; }, +/* harmony export */ getPriority: function() { return /* binding */ getPriority; }, +/* harmony export */ getReadyCallbacks: function() { return /* binding */ getReadyCallbacks; }, +/* harmony export */ getUniqueIdentifier: function() { return /* binding */ getUniqueIdentifier; }, +/* harmony export */ includeObservers: function() { return /* binding */ includeObservers; }, +/* harmony export */ makeResolvedCallback: function() { return /* binding */ makeResolvedCallback; }, +/* harmony export */ mergeMax: function() { return /* binding */ mergeMax; }, +/* harmony export */ pruneCallbacks: function() { return /* binding */ pruneCallbacks; }, +/* harmony export */ resolveDeps: function() { return /* binding */ resolveDeps; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/all.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assoc.js"); @@ -1519,24 +1570,29 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/zipObj.js"); /* harmony import */ var _dependencies__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./dependencies */ "./src/actions/dependencies.js"); /* harmony import */ var _paths__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./paths */ "./src/actions/paths.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } -function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } var DIRECT = 2; var INDIRECT = 1; var mergeMax = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(Math.max); -var combineIdAndProp = _ref => { +var combineIdAndProp = function combineIdAndProp(_ref) { var id = _ref.id, property = _ref.property; return "".concat((0,_dependencies__WEBPACK_IMPORTED_MODULE_16__.stringifyId)(id), ".").concat(property); @@ -1564,7 +1620,7 @@ function getCallbacksByInput(graphs, paths, id, prop, changeType) { if (!patterns) { return []; } - patterns.forEach(pattern => { + patterns.forEach(function (pattern) { if ((0,_dependencies__WEBPACK_IMPORTED_MODULE_16__.idMatch)(_keys, vals, pattern.values)) { // When a callback's Outputs have no MATCH keys, the // triggering Input's MATCH values are what uniquify each @@ -1576,7 +1632,7 @@ function getCallbacksByInput(graphs, paths, id, prop, changeType) { } }); } - matches.forEach(match => { + matches.forEach(function (match) { match.changedPropIds[idAndProp] = changeType || DIRECT; if (withPriority) { match.priority = getPriority(graphs, paths, match); @@ -1595,14 +1651,20 @@ function getPriority(graphs, paths, callback) { var touchedCbIds = {}; var priority = []; while (callbacks.length) { - callbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(c => { + callbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(function (c) { var touched = touchedCbIds[c.resolvedId]; touchedCbIds[c.resolvedId] = true; return touched; }, callbacks); - var outputs = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(o => !touchedOutputs[combineIdAndProp(o)], (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(cb => (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getOutputs(paths)), callbacks))); - outputs.forEach(o => touchedOutputs[combineIdAndProp(o)] = true); - callbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(_ref2 => { + var outputs = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(function (o) { + return !touchedOutputs[combineIdAndProp(o)]; + }, (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(function (cb) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getOutputs(paths)); + }, callbacks))); + outputs.forEach(function (o) { + return touchedOutputs[combineIdAndProp(o)] = true; + }); + callbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(function (_ref2) { var id = _ref2.id, property = _ref2.property; return getCallbacksByInput(graphs, paths, id, property, INDIRECT, false); @@ -1612,7 +1674,9 @@ function getPriority(graphs, paths, callback) { } } priority.unshift(priority.length); - return (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(i => Math.min(i, 35).toString(36), priority).join(''); + return (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(function (i) { + return Math.min(i, 35).toString(36); + }, priority).join(''); } function getAllSubsequentOutputsForCallback(graphs, paths, callback) { var callbacks = [callback]; @@ -1620,9 +1684,15 @@ function getAllSubsequentOutputsForCallback(graphs, paths, callback) { // this traverses the graph all the way to the end while (callbacks.length) { // don't add it if it already exists based on id and props - var outputs = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(o => !touchedOutputs[combineIdAndProp(o)], (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(cb => (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getOutputs(paths)), callbacks))); - touchedOutputs = (0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])((touched, o) => (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(combineIdAndProp(o), true, touched), touchedOutputs, outputs); - callbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(_ref3 => { + var outputs = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(function (o) { + return !touchedOutputs[combineIdAndProp(o)]; + }, (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(function (cb) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getOutputs(paths)); + }, callbacks))); + touchedOutputs = (0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])(function (touched, o) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(combineIdAndProp(o), true, touched); + }, touchedOutputs, outputs); + callbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(function (_ref3) { var id = _ref3.id, property = _ref3.property; return getCallbacksByInput(graphs, paths, id, property, INDIRECT, false); @@ -1638,19 +1708,25 @@ var getReadyCallbacks = function getReadyCallbacks(paths, candidates) { return []; } // Find all outputs of all active callbacks - var outputs = (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])((o, cb) => (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(o, (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getOutputs(paths))), [], callbacks)); + var outputs = (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])(function (o, cb) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(o, (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getOutputs(paths))); + }, [], callbacks)); // Make `outputs` hash table for faster access var outputsMap = {}; - outputs.forEach(output => outputsMap[output] = true); + outputs.forEach(function (output) { + return outputsMap[output] = true; + }); // find all the outputs touched by activeCallbacks // remove this check if graph is accessible all the time if (Object.keys(graphs).length) { //not sure if graph will be accessible all the time - var allTouchedOutputs = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(cb => getAllSubsequentOutputsForCallback(graphs, paths, cb), callbacks)); + var allTouchedOutputs = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(function (cb) { + return getAllSubsequentOutputsForCallback(graphs, paths, cb); + }, callbacks)); // overrrides the outputsMap, will duplicate callbacks filtered // this is only done to silence typescript errors if (allTouchedOutputs.length > 0) { - outputsMap = Object.assign(allTouchedOutputs[0], ...allTouchedOutputs); + outputsMap = Object.assign.apply(Object, [allTouchedOutputs[0]].concat(_toConsumableArray(allTouchedOutputs))); } } // Ramda.JS `difference` function is slow because it compares objects entirely @@ -1658,12 +1734,22 @@ var getReadyCallbacks = function getReadyCallbacks(paths, candidates) { // We can optimize this by comparing only the `id+prop` part of the inputs & outputs. // Original difference takes 380ms on average to compute difference between 200 inputs and 1 output. // The following function takes 1-2ms on average. - var differenceBasedOnId = (inputs, outputs) => inputs.filter(input => !outputs.some(output => combineIdAndProp(input) === combineIdAndProp(output))); + var differenceBasedOnId = function differenceBasedOnId(inputs, outputs) { + return inputs.filter(function (input) { + return !outputs.some(function (output) { + return combineIdAndProp(input) === combineIdAndProp(output); + }); + }); + }; // Find `requested` callbacks that do not depend on a outstanding output (as either input or state) // Outputs which overlap an input do not count as an outstanding output - return (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(cb => (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(cbp => !outputsMap[combineIdAndProp(cbp)], differenceBasedOnId((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getInputs(paths)), (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getOutputs(paths)))), candidates); + return (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(function (cb) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(function (cbp) { + return !outputsMap[combineIdAndProp(cbp)]; + }, differenceBasedOnId((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getInputs(paths)), (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb.getOutputs(paths)))); + }, candidates); }; -var getLayoutCallbacks = (graphs, paths, layout, options) => { +var getLayoutCallbacks = function getLayoutCallbacks(graphs, paths, layout, options) { var exclusions = []; var callbacks = (0,_dependencies__WEBPACK_IMPORTED_MODULE_16__.getUnfilteredLayoutCallbacks)(graphs, paths, layout, options); /* @@ -1677,7 +1763,7 @@ var getLayoutCallbacks = (graphs, paths, layout, options) => { */ while (true) { // Find callbacks for which all inputs are missing or in the exclusions - var _partition = (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(_ref4 => { + var _partition = (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (_ref4) { var inputs = _ref4.callback.inputs, getInputs = _ref4.getInputs; return (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(_dependencies__WEBPACK_IMPORTED_MODULE_16__.isMultiValued, inputs) || !(0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(getInputs(paths))), exclusions)); @@ -1691,7 +1777,7 @@ var getLayoutCallbacks = (graphs, paths, layout, options) => { } callbacks = included; // update exclusions with all additional excluded outputs - exclusions = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(exclusions, (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(_ref5 => { + exclusions = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(exclusions, (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(function (_ref5) { var getOutputs = _ref5.getOutputs; return getOutputs(paths); }, excluded)))); @@ -1701,25 +1787,31 @@ var getLayoutCallbacks = (graphs, paths, layout, options) => { if (rootId) { rootId = (0,_dependencies__WEBPACK_IMPORTED_MODULE_16__.stringifyId)(rootId); // Filter inputs that are not present in the response - callbacks = callbacks.filter(cb => cb.callback.inputs.reduce((previous, input) => previous || (0,_dependencies__WEBPACK_IMPORTED_MODULE_16__.stringifyId)(input.id) == rootId && options.filterRoot.includes(input.property), false)); + callbacks = callbacks.filter(function (cb) { + return cb.callback.inputs.reduce(function (previous, input) { + return previous || (0,_dependencies__WEBPACK_IMPORTED_MODULE_16__.stringifyId)(input.id) == rootId && options.filterRoot.includes(input.property); + }, false); + }); } } /* Return all callbacks with an `executionGroup` to allow group-processing */ var executionGroup = Math.random().toString(16); - return (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(cb => _objectSpread(_objectSpread({}, cb), {}, { - executionGroup - }), callbacks); + return (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(function (cb) { + return _objectSpread(_objectSpread({}, cb), {}, { + executionGroup + }); + }, callbacks); }; -var getUniqueIdentifier = _ref6 => { +var getUniqueIdentifier = function getUniqueIdentifier(_ref6) { var anyVals = _ref6.anyVals, _ref6$callback = _ref6.callback, inputs = _ref6$callback.inputs, outputs = _ref6$callback.outputs, state = _ref6$callback.state, output = _ref6$callback.output; - var idParts = (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(combineIdAndProp, [...inputs, ...outputs, ...state]); + var idParts = (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(combineIdAndProp, [].concat(_toConsumableArray(inputs), _toConsumableArray(outputs), _toConsumableArray(state))); // For no-output callbacks, include the output hash to ensure uniqueness if (outputs.length === 0 && output) { idParts.push(output); @@ -1727,7 +1819,9 @@ var getUniqueIdentifier = _ref6 => { return (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(idParts, Array.isArray(anyVals) ? anyVals : anyVals === '' ? [] : [anyVals]).join(','); }; function includeObservers(id, properties, graphs, paths) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(propName => getCallbacksByInput(graphs, paths, id, propName), (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(properties))); + return (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(function (propName) { + return getCallbacksByInput(graphs, paths, id, propName); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(properties))); } /* * Create a pending callback object. Includes the original callback definition, @@ -1735,83 +1829,97 @@ function includeObservers(id, properties, graphs, paths) { * accessors to find all inputs, outputs, and state involved in this * callback (lazy as not all users will want all of these). */ -var makeResolvedCallback = (callback, resolve, anyVals) => ({ - callback, - anyVals, - resolvedId: callback.output + anyVals, - getOutputs: paths => callback.outputs.map(resolve(paths)), - getInputs: paths => callback.inputs.map(resolve(paths)), - getState: paths => callback.state.map(resolve(paths)), - changedPropIds: {}, - initialCall: false -}); +var makeResolvedCallback = function makeResolvedCallback(callback, resolve, anyVals) { + return { + callback, + anyVals, + resolvedId: callback.output + anyVals, + getOutputs: function getOutputs(paths) { + return callback.outputs.map(resolve(paths)); + }, + getInputs: function getInputs(paths) { + return callback.inputs.map(resolve(paths)); + }, + getState: function getState(paths) { + return callback.state.map(resolve(paths)); + }, + changedPropIds: {}, + initialCall: false + }; +}; function pruneCallbacks(callbacks, paths) { - var _partition3 = (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(_ref7 => { + var _partition3 = (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (_ref7) { var getOutputs = _ref7.getOutputs, outputs = _ref7.callback.outputs; return (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(getOutputs(paths)).length === outputs.length; }, callbacks), _partition4 = _slicedToArray(_partition3, 2), removed = _partition4[1]; - var _partition5 = (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(_ref8 => { + var _partition5 = (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (_ref8) { var getOutputs = _ref8.getOutputs; return !(0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(getOutputs(paths)).length; }, removed), _partition6 = _slicedToArray(_partition5, 2), modified = _partition6[1]; - var added = (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(cb => (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])('changedPropIds', (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])((_, propId) => (0,_paths__WEBPACK_IMPORTED_MODULE_17__.getPath)(paths, (0,_dependencies__WEBPACK_IMPORTED_MODULE_16__.splitIdAndProp)(propId).id), cb.changedPropIds), cb), modified); + var added = (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(function (cb) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])('changedPropIds', (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(function (_, propId) { + return (0,_paths__WEBPACK_IMPORTED_MODULE_17__.getPath)(paths, (0,_dependencies__WEBPACK_IMPORTED_MODULE_16__.splitIdAndProp)(propId).id); + }, cb.changedPropIds), cb); + }, modified); return { added, removed }; } function resolveDeps(refKeys, refVals, refPatternVals) { - return paths => _ref9 => { - var idPattern = _ref9.id, - property = _ref9.property; - if (typeof idPattern === 'string') { - var _path = (0,_paths__WEBPACK_IMPORTED_MODULE_17__.getPath)(paths, idPattern); - return _path ? [{ - id: idPattern, - property, - path: _path - }] : []; - } - var _keys = Object.keys(idPattern).sort(); - var patternVals = (0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])(_keys, idPattern); - var keyStr = _keys.join(','); - var keyPaths = paths.objs[keyStr]; - if (!keyPaths) { - return []; - } - var result = []; - keyPaths.forEach(_ref0 => { - var vals = _ref0.values, - path = _ref0.path; - if ((0,_dependencies__WEBPACK_IMPORTED_MODULE_16__.idMatch)(_keys, vals, patternVals, refKeys, refVals, refPatternVals)) { - result.push({ - id: (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])(_keys, vals), + return function (paths) { + return function (_ref9) { + var idPattern = _ref9.id, + property = _ref9.property; + if (typeof idPattern === 'string') { + var _path = (0,_paths__WEBPACK_IMPORTED_MODULE_17__.getPath)(paths, idPattern); + return _path ? [{ + id: idPattern, property, - path - }); + path: _path + }] : []; + } + var _keys = Object.keys(idPattern).sort(); + var patternVals = (0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])(_keys, idPattern); + var keyStr = _keys.join(','); + var keyPaths = paths.objs[keyStr]; + if (!keyPaths) { + return []; } - }); - return result; + var result = []; + keyPaths.forEach(function (_ref0) { + var vals = _ref0.values, + path = _ref0.path; + if ((0,_dependencies__WEBPACK_IMPORTED_MODULE_16__.idMatch)(_keys, vals, patternVals, refKeys, refVals, refPatternVals)) { + result.push({ + id: (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])(_keys, vals), + property, + path + }); + } + }); + return result; + }; }; } -/***/ }, +/***/ }), -/***/ "./src/actions/isLoading.ts" +/***/ "./src/actions/isLoading.ts": /*!**********************************!*\ !*** ./src/actions/isLoading.ts ***! \**********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ setIsLoading: () => (/* binding */ setIsLoading) +/* harmony export */ setIsLoading: function() { return /* binding */ setIsLoading; } /* harmony export */ }); /* harmony import */ var redux_actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! redux-actions */ "./node_modules/redux-actions/es/createAction.js"); /* harmony import */ var _reducers_isLoading__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../reducers/isLoading */ "./src/reducers/isLoading.ts"); @@ -1819,40 +1927,40 @@ __webpack_require__.r(__webpack_exports__); var setIsLoading = (0,redux_actions__WEBPACK_IMPORTED_MODULE_0__["default"])(_reducers_isLoading__WEBPACK_IMPORTED_MODULE_1__.IsLoadingActionType.Set); -/***/ }, +/***/ }), -/***/ "./src/actions/loading.ts" +/***/ "./src/actions/loading.ts": /*!********************************!*\ !*** ./src/actions/loading.ts ***! \********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ loaded: () => (/* binding */ loaded), -/* harmony export */ loading: () => (/* binding */ loading) +/* harmony export */ loaded: function() { return /* binding */ loaded; }, +/* harmony export */ loading: function() { return /* binding */ loading; } /* harmony export */ }); /* harmony import */ var redux_actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! redux-actions */ "./node_modules/redux-actions/es/createAction.js"); var loading = (0,redux_actions__WEBPACK_IMPORTED_MODULE_0__["default"])('LOADING'); var loaded = (0,redux_actions__WEBPACK_IMPORTED_MODULE_0__["default"])('LOADED'); -/***/ }, +/***/ }), -/***/ "./src/actions/patch.ts" +/***/ "./src/actions/patch.ts": /*!******************************!*\ !*** ./src/actions/patch.ts ***! \******************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PatchBuilder: () => (/* binding */ PatchBuilder), -/* harmony export */ handlePatch: () => (/* binding */ handlePatch), -/* harmony export */ isPatch: () => (/* binding */ isPatch), -/* harmony export */ parsePatchProps: () => (/* binding */ parsePatchProps) +/* harmony export */ PatchBuilder: function() { return /* binding */ PatchBuilder; }, +/* harmony export */ handlePatch: function() { return /* binding */ handlePatch; }, +/* harmony export */ isPatch: function() { return /* binding */ isPatch; }, +/* harmony export */ parsePatchProps: function() { return /* binding */ parsePatchProps; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/append.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assocPath.js"); @@ -1866,11 +1974,15 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/prepend.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/reverse.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function isPatch(obj) { return (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])('__dash_patch_update', obj); @@ -1889,208 +2001,242 @@ function getLocationPath(location, obj) { } return current; } -class PatchBuilder { - constructor() { +var PatchBuilder = /*#__PURE__*/function () { + function PatchBuilder() { + _classCallCheck(this, PatchBuilder); _defineProperty(this, "operations", []); } - assign(location, value) { - this.operations.push({ - operation: 'Assign', - location, - params: { - value - } - }); - return this; - } - merge(location, value) { - this.operations.push({ - operation: 'Merge', - location, - params: { - value - } - }); - return this; - } - extend(location, value) { - this.operations.push({ - operation: 'Extend', - location, - params: { - value - } - }); - return this; - } - delete(location) { - this.operations.push({ - operation: 'Delete', - location, - params: {} - }); - return this; - } - insert(location, index, value) { - this.operations.push({ - operation: 'Insert', - location, - params: { - index, - value - } - }); - return this; - } - append(location, value) { - this.operations.push({ - operation: 'Append', - location, - params: { - value - } - }); - return this; - } - prepend(location, value) { - this.operations.push({ - operation: 'Prepend', - location, - params: { - value - } - }); - return this; - } - add(location, value) { - this.operations.push({ - operation: 'Add', - location, - params: { - value - } - }); - return this; - } - sub(location, value) { - this.operations.push({ - operation: 'Sub', - location, - params: { - value - } - }); - return this; - } - mul(location, value) { - this.operations.push({ - operation: 'Mul', - location, - params: { - value - } - }); - return this; - } - div(location, value) { - this.operations.push({ - operation: 'Div', - location, - params: { - value - } - }); - return this; - } - clear(location) { - this.operations.push({ - operation: 'Clear', - location, - params: {} - }); - return this; - } - reverse(location) { - this.operations.push({ - operation: 'Reverse', - location, - params: {} - }); - return this; - } - remove(location, value) { - this.operations.push({ - operation: 'Remove', - location, - params: { - value - } - }); - return this; - } - build() { - return { - __dash_patch_update: '__dash_patch_update', - operations: this.operations - }; - } -} + return _createClass(PatchBuilder, [{ + key: "assign", + value: function assign(location, value) { + this.operations.push({ + operation: 'Assign', + location, + params: { + value + } + }); + return this; + } + }, { + key: "merge", + value: function merge(location, value) { + this.operations.push({ + operation: 'Merge', + location, + params: { + value + } + }); + return this; + } + }, { + key: "extend", + value: function extend(location, value) { + this.operations.push({ + operation: 'Extend', + location, + params: { + value + } + }); + return this; + } + }, { + key: "delete", + value: function _delete(location) { + this.operations.push({ + operation: 'Delete', + location, + params: {} + }); + return this; + } + }, { + key: "insert", + value: function insert(location, index, value) { + this.operations.push({ + operation: 'Insert', + location, + params: { + index, + value + } + }); + return this; + } + }, { + key: "append", + value: function append(location, value) { + this.operations.push({ + operation: 'Append', + location, + params: { + value + } + }); + return this; + } + }, { + key: "prepend", + value: function prepend(location, value) { + this.operations.push({ + operation: 'Prepend', + location, + params: { + value + } + }); + return this; + } + }, { + key: "add", + value: function add(location, value) { + this.operations.push({ + operation: 'Add', + location, + params: { + value + } + }); + return this; + } + }, { + key: "sub", + value: function sub(location, value) { + this.operations.push({ + operation: 'Sub', + location, + params: { + value + } + }); + return this; + } + }, { + key: "mul", + value: function mul(location, value) { + this.operations.push({ + operation: 'Mul', + location, + params: { + value + } + }); + return this; + } + }, { + key: "div", + value: function div(location, value) { + this.operations.push({ + operation: 'Div', + location, + params: { + value + } + }); + return this; + } + }, { + key: "clear", + value: function clear(location) { + this.operations.push({ + operation: 'Clear', + location, + params: {} + }); + return this; + } + }, { + key: "reverse", + value: function reverse(location) { + this.operations.push({ + operation: 'Reverse', + location, + params: {} + }); + return this; + } + }, { + key: "remove", + value: function remove(location, value) { + this.operations.push({ + operation: 'Remove', + location, + params: { + value + } + }); + return this; + } + }, { + key: "build", + value: function build() { + return { + __dash_patch_update: '__dash_patch_update', + operations: this.operations + }; + } + }]); +}(); var patchHandlers = { - Assign: (previous, patchOperation) => { + Assign: function Assign(previous, patchOperation) { var params = patchOperation.params, location = patchOperation.location; return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(location, params.value, previous); }, - Merge: (previous, patchOperation) => { + Merge: function Merge(previous, patchOperation) { var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(patchOperation.location, previous); return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(patchOperation.location, _objectSpread(_objectSpread({}, prev), patchOperation.params.value), previous); }, - Extend: (previous, patchOperation) => { + Extend: function Extend(previous, patchOperation) { var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(patchOperation.location, previous); return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(patchOperation.location, (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(prev, patchOperation.params.value), previous); }, - Delete: (previous, patchOperation) => { + Delete: function Delete(previous, patchOperation) { return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(patchOperation.location, previous); }, - Insert: (previous, patchOperation) => { + Insert: function Insert(previous, patchOperation) { var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(patchOperation.location, previous); return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(patchOperation.location, (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(getLocationIndex(patchOperation.params.index, prev), patchOperation.params.value, prev), previous); }, - Append: (previous, patchOperation) => { + Append: function Append(previous, patchOperation) { var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(patchOperation.location, previous); return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(patchOperation.location, (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(patchOperation.params.value, prev), previous); }, - Prepend: (previous, patchOperation) => { + Prepend: function Prepend(previous, patchOperation) { var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(patchOperation.location, previous); return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(patchOperation.location, (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(patchOperation.params.value, prev), previous); }, - Add: (previous, patchOperation) => { + Add: function Add(previous, patchOperation) { var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(patchOperation.location, previous); return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(patchOperation.location, prev + patchOperation.params.value, previous); }, - Sub: (previous, patchOperation) => { + Sub: function Sub(previous, patchOperation) { var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(patchOperation.location, previous); return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(patchOperation.location, prev - patchOperation.params.value, previous); }, - Mul: (previous, patchOperation) => { + Mul: function Mul(previous, patchOperation) { var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(patchOperation.location, previous); return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(patchOperation.location, prev * patchOperation.params.value, previous); }, - Div: (previous, patchOperation) => { + Div: function Div(previous, patchOperation) { var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(patchOperation.location, previous); return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(patchOperation.location, prev / patchOperation.params.value, previous); }, - Clear: (previous, patchOperation) => { + Clear: function Clear(previous, patchOperation) { var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(patchOperation.location, previous); return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(patchOperation.location, (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(prev), previous); }, - Reverse: (previous, patchOperation) => { + Reverse: function Reverse(previous, patchOperation) { var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(patchOperation.location, previous); return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(patchOperation.location, (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(prev), previous); }, - Remove: (previous, patchOperation) => { + Remove: function Remove(previous, patchOperation) { var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(patchOperation.location, previous); - return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(patchOperation.location, prev.filter(item => !(0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(item, patchOperation.params.value)), previous); + return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(patchOperation.location, prev.filter(function (item) { + return !(0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(item, patchOperation.params.value); + }), previous); } }; function handlePatch(previousValue, patchValue) { @@ -2127,20 +2273,20 @@ function parsePatchProps(props, previousProps) { return patchedProps; } -/***/ }, +/***/ }), -/***/ "./src/actions/patternMatching.ts" +/***/ "./src/actions/patternMatching.ts": /*!****************************************!*\ !*** ./src/actions/patternMatching.ts ***! \****************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ getAllPMCIds: () => (/* binding */ getAllPMCIds), -/* harmony export */ parsePMCId: () => (/* binding */ parsePMCId), -/* harmony export */ replacePMC: () => (/* binding */ replacePMC) +/* harmony export */ getAllPMCIds: function() { return /* binding */ getAllPMCIds; }, +/* harmony export */ parsePMCId: function() { return /* binding */ parsePMCId; }, +/* harmony export */ replacePMC: function() { return /* binding */ replacePMC; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/dissoc.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/equals.js"); @@ -2183,10 +2329,14 @@ function parsePMCId(id) { function getAllPMCIds(id, state, triggerKey) { var keysOfIds = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(id); var idKey = keysOfIds.join(','); - return state.paths.objs[idKey].map(obj => keysOfIds.reduce((acc, key, i) => { - acc[key] = obj.values[i]; - return acc; - }, {})).filter(obj => (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(triggerKey, obj), (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(triggerKey, id))); + return state.paths.objs[idKey].map(function (obj) { + return keysOfIds.reduce(function (acc, key, i) { + acc[key] = obj.values[i]; + return acc; + }, {}); + }).filter(function (obj) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(triggerKey, obj), (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(triggerKey, id)); + }); } /** * Replace the pattern matching ids with the actual trigger value @@ -2202,7 +2352,7 @@ function getAllPMCIds(id, state, triggerKey) { function replacePMC(id, cb, index, getState) { var extras = []; var replaced = {}; - (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(id).forEach(_ref => { + (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(id).forEach(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), key = _ref2[0], value = _ref2[1]; @@ -2217,7 +2367,9 @@ function replacePMC(id, cb, index, getState) { } else if (value.includes('ALL')) { extras = getAllPMCIds(id, getState(), key); } else if (value.includes('ALLSMALLER')) { - extras = getAllPMCIds(id, getState(), key).filter(obj => obj[key] < triggerValue); + extras = getAllPMCIds(id, getState(), key).filter(function (obj) { + return obj[key] < triggerValue; + }); } } else { replaced[key] = value; @@ -2229,33 +2381,34 @@ function replacePMC(id, cb, index, getState) { return [replaced]; } -/***/ }, +/***/ }), -/***/ "./src/actions/requestDependencies.ts" +/***/ "./src/actions/requestDependencies.ts": /*!********************************************!*\ !*** ./src/actions/requestDependencies.ts ***! \********************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ requestDependencies: () => (/* binding */ requestDependencies) +/* harmony export */ requestDependencies: function() { return /* binding */ requestDependencies; } /* harmony export */ }); /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); /* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index */ "./src/actions/index.js"); /* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./api */ "./src/actions/api.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function requestDependencies() { - return (dispatch, getState) => { - (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.batch)(() => { + return function (dispatch, getState) { + (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.batch)(function () { var _getState = getState(), graphs = _getState.graphs; dispatch((0,_index__WEBPACK_IMPORTED_MODULE_1__.setGraphs)(_objectSpread(_objectSpread({}, graphs), {}, { @@ -2266,31 +2419,31 @@ function requestDependencies() { }; } -/***/ }, +/***/ }), -/***/ "./src/config.ts" +/***/ "./src/config.ts": /*!***********************!*\ !*** ./src/config.ts ***! \***********************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ getConfigFromDOM) +/* harmony export */ "default": function() { return /* binding */ getConfigFromDOM; } /* harmony export */ }); function getConfigFromDOM() { var configElement = document.getElementById('_dash-config'); return JSON.parse(configElement !== null && configElement !== void 0 && configElement.textContent ? configElement === null || configElement === void 0 ? void 0 : configElement.textContent : '{}'); } -/***/ }, +/***/ }), -/***/ "./src/dashApi.ts" +/***/ "./src/dashApi.ts": /*!************************!*\ !*** ./src/dashApi.ts ***! \************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -2346,17 +2499,17 @@ window.dash_component_api = Object.assign(window.dash_component_api || {}, { } }); -/***/ }, +/***/ }), -/***/ "./src/observers/documentTitle.ts" +/***/ "./src/observers/documentTitle.ts": /*!****************************************!*\ !*** ./src/observers/documentTitle.ts ***! \****************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -var updateTitle = getState => { +var updateTitle = function updateTitle(getState) { var _getState = getState(), config = _getState.config, isLoading = _getState.isLoading; @@ -2380,7 +2533,7 @@ var updateTitle = getState => { var _observer = { inputs: ['isLoading'], mutationObserver: undefined, - observer: _ref => { + observer: function observer(_ref) { var getState = _ref.getState; var _getState2 = getState(), config = _getState2.config; @@ -2388,7 +2541,9 @@ var _observer = { var _observer$mutationObs; _observer.config = config; (_observer$mutationObs = _observer.mutationObserver) === null || _observer$mutationObs === void 0 || _observer$mutationObs.disconnect(); - _observer.mutationObserver = new MutationObserver(() => updateTitle(getState)); + _observer.mutationObserver = new MutationObserver(function () { + return updateTitle(getState); + }); var title = document.querySelector('title'); if (title) { _observer.mutationObserver.observe(title, { @@ -2404,13 +2559,13 @@ var _observer = { }; /* harmony default export */ __webpack_exports__["default"] = (_observer); -/***/ }, +/***/ }), -/***/ "./src/observers/executedCallbacks.ts" +/***/ "./src/observers/executedCallbacks.ts": /*!********************************************!*\ !*** ./src/observers/executedCallbacks.ts ***! \********************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -2430,11 +2585,12 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../actions */ "./src/actions/index.js"); /* harmony import */ var _actions_paths__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../actions/paths */ "./src/actions/paths.js"); /* harmony import */ var _persistence__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../persistence */ "./src/persistence.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } @@ -2449,7 +2605,7 @@ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } var observer = { - observer: _ref => { + observer: function observer(_ref) { var dispatch = _ref.dispatch, getState = _ref.getState; var _getState = getState(), @@ -2482,7 +2638,7 @@ var observer = { } var requestedCallbacks = []; var storedCallbacks = []; - executed.forEach(cb => { + executed.forEach(function (cb) { var _cb$predecessors; var predecessors = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])((_cb$predecessors = cb.predecessors) !== null && _cb$predecessors !== void 0 ? _cb$predecessors : [], [cb.callback]); var _cb$callback = cb.callback, @@ -2496,7 +2652,7 @@ var observer = { error = executionResult.error, payload = executionResult.payload; if (data !== undefined) { - Object.entries(data).forEach(_ref2 => { + Object.entries(data).forEach(function (_ref2) { var _ref3 = _slicedToArray(_ref2, 2), id = _ref3[0], props = _ref3[1]; @@ -2508,9 +2664,13 @@ var observer = { // Components will trigger callbacks on their own as required (eg. derived) var appliedProps = applyProps(parsedId, props); // Add callbacks for modified inputs - requestedCallbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(requestedCallbacks, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(prop => (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_12__.getCallbacksByInput)(graphs, oldPaths, parsedId, prop, true), (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(props))).map(rcb => _objectSpread(_objectSpread({}, rcb), {}, { - predecessors - }))); + requestedCallbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(requestedCallbacks, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(function (prop) { + return (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_12__.getCallbacksByInput)(graphs, oldPaths, parsedId, prop, true); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(props))).map(function (rcb) { + return _objectSpread(_objectSpread({}, rcb), {}, { + predecessors + }); + })); var basePath = (0,_actions_paths__WEBPACK_IMPORTED_MODULE_14__.getPath)(oldPaths, parsedId); if (!basePath) { return; @@ -2526,9 +2686,11 @@ var observer = { requestedCallbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(requestedCallbacks, (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_12__.getLayoutCallbacks)(graphs, paths, children, { chunkPath: oldChildrenPath, filterRoot - }).map(rcb => _objectSpread(_objectSpread({}, rcb), {}, { - predecessors - }))); + }).map(function (rcb) { + return _objectSpread(_objectSpread({}, rcb), {}, { + predecessors + }); + })); // Wildcard callbacks with array inputs (ALL / ALLSMALLER) need to trigger // even due to the deletion of components requestedCallbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(requestedCallbacks, (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_12__.getLayoutCallbacks)(graphs, oldPaths, oldChildren, { @@ -2536,17 +2698,23 @@ var observer = { newPaths: paths, chunkPath: oldChildrenPath, filterRoot - }).map(rcb => _objectSpread(_objectSpread({}, rcb), {}, { - predecessors - }))); + }).map(function (rcb) { + return _objectSpread(_objectSpread({}, rcb), {}, { + predecessors + }); + })); }; var recomputed = false; - ['children'].concat(childrenProps).forEach(childrenProp => { + ['children'].concat(childrenProps).forEach(function (childrenProp) { if (recomputed) { return; } if (childrenProp.includes('[]')) { - var _childrenProp$split$m = childrenProp.split('[]').map(p => p.split('.').filter(e => e)), + var _childrenProp$split$m = childrenProp.split('[]').map(function (p) { + return p.split('.').filter(function (e) { + return e; + }); + }), _childrenProp$split$m2 = _slicedToArray(_childrenProp$split$m, 1), frontPath = _childrenProp$split$m2[0]; var frontObj = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(frontPath, appliedProps); @@ -2573,14 +2741,18 @@ var observer = { // persistence edge case: if you explicitly update the // persistence key, other props may change that require us // to fire additional callbacks - var addedProps = (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])((_, k) => !(k in props), appliedProps); + var addedProps = (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(function (_, k) { + return !(k in props); + }, appliedProps); if (!(0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(addedProps)) { var _getState4 = getState(), currentGraphs = _getState4.graphs, paths = _getState4.paths; - requestedCallbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(requestedCallbacks, (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_12__.includeObservers)(id, addedProps, currentGraphs, paths).map(rcb => _objectSpread(_objectSpread({}, rcb), {}, { - predecessors - }))); + requestedCallbacks = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(requestedCallbacks, (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_12__.includeObservers)(id, addedProps, currentGraphs, paths).map(function (rcb) { + return _objectSpread(_objectSpread({}, rcb), {}, { + predecessors + }); + })); } }); // Add information about potentially updated outputs vs. updated outputs, @@ -2589,14 +2761,16 @@ var observer = { storedCallbacks.push(_objectSpread(_objectSpread({}, cb), {}, { executionMeta: { allProps: (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_12__.combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(cb.getOutputs(getState().paths))), - updatedProps: (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(_ref4 => { + updatedProps: (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(function (_ref4) { var _ref5 = _slicedToArray(_ref4, 2), id = _ref5[0], value = _ref5[1]; - return (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(property => (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_12__.combineIdAndProp)({ - id, - property - }), (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(value)); + return (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(function (property) { + return (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_12__.combineIdAndProp)({ + id, + property + }); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(value)); }, (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(data))) } })); @@ -2630,13 +2804,13 @@ var observer = { }; /* harmony default export */ __webpack_exports__["default"] = (observer); -/***/ }, +/***/ }), -/***/ "./src/observers/executingCallbacks.ts" +/***/ "./src/observers/executingCallbacks.ts": /*!*********************************************!*\ !*** ./src/observers/executingCallbacks.ts ***! \*********************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -2645,13 +2819,14 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/partition.js"); /* harmony import */ var _actions_callbacks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../actions/callbacks */ "./src/actions/callbacks.ts"); /* harmony import */ var _reducers_constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../reducers/constants */ "./src/reducers/constants.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } @@ -2664,16 +2839,20 @@ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } var observer = { - observer: _ref => { + observer: function observer(_ref) { var dispatch = _ref.dispatch, getState = _ref.getState; var _getState = getState(), executing = _getState.callbacks.executing; - var _partition = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(cb => cb.executionPromise instanceof Promise, executing), + var _partition = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (cb) { + return cb.executionPromise instanceof Promise; + }, executing), _partition2 = _slicedToArray(_partition, 2), deferred = _partition2[0], skippedOrReady = _partition2[1]; - dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_3__.aggregateCallbacks)([executing.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_3__.removeExecutingCallbacks)(executing) : null, deferred.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_3__.addWatchedCallbacks)(deferred) : null, skippedOrReady.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_3__.addExecutedCallbacks)(skippedOrReady.map(cb => (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])('executionResult', cb.executionPromise, cb))) : null])); + dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_3__.aggregateCallbacks)([executing.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_3__.removeExecutingCallbacks)(executing) : null, deferred.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_3__.addWatchedCallbacks)(deferred) : null, skippedOrReady.length ? (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_3__.addExecutedCallbacks)(skippedOrReady.map(function (cb) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])('executionResult', cb.executionPromise, cb); + })) : null])); deferred.forEach(/*#__PURE__*/function () { var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(cb) { var result, _getState2, watched, appLifecycle, callback_resolved, currentCb; @@ -2696,7 +2875,9 @@ var observer = { } // Check if it's been removed from the `watched` list since - on callback completion, another callback may be cancelled // Find the callback instance or one that matches its promise (eg. could have been pruned) - currentCb = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(_cb => _cb === cb || _cb.executionPromise === cb.executionPromise, watched); + currentCb = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_cb) { + return _cb === cb || _cb.executionPromise === cb.executionPromise; + }, watched); if (currentCb) { _context.n = 3; break; @@ -2721,13 +2902,13 @@ var observer = { }; /* harmony default export */ __webpack_exports__["default"] = (observer); -/***/ }, +/***/ }), -/***/ "./src/observers/isLoading.ts" +/***/ "./src/observers/isLoading.ts": /*!************************************!*\ !*** ./src/observers/isLoading.ts ***! \************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -2736,7 +2917,7 @@ __webpack_require__.r(__webpack_exports__); var observer = { - observer: _ref => { + observer: function observer(_ref) { var dispatch = _ref.dispatch, getState = _ref.getState; var _getState = getState(), @@ -2744,7 +2925,9 @@ var observer = { isLoading = _getState.isLoading; var pendingCallbacks = (0,_utils_callbacks__WEBPACK_IMPORTED_MODULE_0__.getPendingCallbacks)(callbacks); // Filter out persistent callbacks - they shouldn't trigger the loading indicator - var nonPersistentCallbacks = pendingCallbacks.filter(cb => !cb.callback.persistent); + var nonPersistentCallbacks = pendingCallbacks.filter(function (cb) { + return !cb.callback.persistent; + }); var next = Boolean(nonPersistentCallbacks.length); if (isLoading !== next) { dispatch((0,_actions_isLoading__WEBPACK_IMPORTED_MODULE_1__.setIsLoading)(next)); @@ -2754,13 +2937,13 @@ var observer = { }; /* harmony default export */ __webpack_exports__["default"] = (observer); -/***/ }, +/***/ }), -/***/ "./src/observers/prioritizedCallbacks.ts" +/***/ "./src/observers/prioritizedCallbacks.ts": /*!***********************************************!*\ !*** ./src/observers/prioritizedCallbacks.ts ***! \***********************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -2774,38 +2957,43 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/dependencies_ts */ "./src/actions/dependencies_ts.ts"); /* harmony import */ var _actions_isAppReady__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions/isAppReady */ "./src/actions/isAppReady.js"); /* harmony import */ var _reducers_constants__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../reducers/constants */ "./src/reducers/constants.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } -function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } -var sortPriority = (c1, c2) => { +var sortPriority = function sortPriority(c1, c2) { var _c1$priority, _c2$priority; return ((_c1$priority = c1.priority) !== null && _c1$priority !== void 0 ? _c1$priority : '') > ((_c2$priority = c2.priority) !== null && _c2$priority !== void 0 ? _c2$priority : '') ? -1 : 1; }; -var getStash = (cb, paths) => { +var getStash = function getStash(cb, paths) { var getOutputs = cb.getOutputs; var allOutputs = getOutputs(paths); var flatOutputs = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(allOutputs); var allPropIds = []; var reqOut = {}; - flatOutputs.forEach(_ref => { + flatOutputs.forEach(function (_ref) { var id = _ref.id, property = _ref.property; var idStr = (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_6__.stringifyId)(id); @@ -2821,9 +3009,11 @@ var getStash = (cb, paths) => { allPropIds }; }; -var getIds = (cb, paths) => { - var items = [...(0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(cb.getInputs(paths)), ...(0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(cb.getState(paths))]; - var uniqueIds = new Map(items.map(item => [(0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_6__.stringifyId)(item.id), item])); +var getIds = function getIds(cb, paths) { + var items = [].concat(_toConsumableArray((0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(cb.getInputs(paths))), _toConsumableArray((0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(cb.getState(paths)))); + var uniqueIds = new Map(items.map(function (item) { + return [(0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_6__.stringifyId)(item.id), item]; + })); var uniqueItems = Array.from(uniqueIds.values()); return uniqueItems; }; @@ -2846,16 +3036,22 @@ var observer = { available = Math.max(0, 12 - executing.length - watched.length); // Order prioritized callbacks based on depth and breadth of callback chain prioritized = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(sortPriority, prioritized); // Divide between sync and async - _partition = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(cb => (0,_actions_isAppReady__WEBPACK_IMPORTED_MODULE_8__["default"])(layout, paths, getIds(cb, paths)) === true, prioritized), _partition2 = _slicedToArray(_partition, 2), syncCallbacks = _partition2[0], asyncCallbacks = _partition2[1]; + _partition = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(function (cb) { + return (0,_actions_isAppReady__WEBPACK_IMPORTED_MODULE_8__["default"])(layout, paths, getIds(cb, paths)) === true; + }, prioritized), _partition2 = _slicedToArray(_partition, 2), syncCallbacks = _partition2[0], asyncCallbacks = _partition2[1]; pickedSyncCallbacks = syncCallbacks.slice(0, available); pickedAsyncCallbacks = asyncCallbacks.slice(0, available - pickedSyncCallbacks.length); if (pickedSyncCallbacks.length) { - dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_5__.aggregateCallbacks)([(0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_5__.removePrioritizedCallbacks)(pickedSyncCallbacks), (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_5__.addExecutingCallbacks)((0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(cb => (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_5__.executeCallback)(cb, config, hooks, paths, layout, getStash(cb, paths), dispatch, getState), pickedSyncCallbacks))])); + dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_5__.aggregateCallbacks)([(0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_5__.removePrioritizedCallbacks)(pickedSyncCallbacks), (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_5__.addExecutingCallbacks)((0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (cb) { + return (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_5__.executeCallback)(cb, config, hooks, paths, layout, getStash(cb, paths), dispatch, getState); + }, pickedSyncCallbacks))])); } if (pickedAsyncCallbacks.length) { - deferred = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(cb => _objectSpread(_objectSpread(_objectSpread({}, cb), getStash(cb, paths)), {}, { - isReady: (0,_actions_isAppReady__WEBPACK_IMPORTED_MODULE_8__["default"])(layout, paths, getIds(cb, paths)) - }), pickedAsyncCallbacks); + deferred = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (cb) { + return _objectSpread(_objectSpread(_objectSpread({}, cb), getStash(cb, paths)), {}, { + isReady: (0,_actions_isAppReady__WEBPACK_IMPORTED_MODULE_8__["default"])(layout, paths, getIds(cb, paths)) + }); + }, pickedAsyncCallbacks); dispatch((0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_5__.aggregateCallbacks)([(0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_5__.removePrioritizedCallbacks)(pickedAsyncCallbacks), (0,_actions_callbacks__WEBPACK_IMPORTED_MODULE_5__.addBlockedCallbacks)(deferred)])); deferred.forEach(/*#__PURE__*/function () { var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(cb) { @@ -2870,7 +3066,9 @@ var observer = { // callback completion, another callback may be cancelled // Find the callback instance or one that matches its promise // (eg. could have been pruned) - currentCb = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(_cb => _cb === cb || _cb.isReady === cb.isReady, blocked); + currentCb = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(function (_cb) { + return _cb === cb || _cb.isReady === cb.isReady; + }, blocked); if (currentCb) { _context.n = 2; break; @@ -2903,13 +3101,13 @@ var observer = { }; /* harmony default export */ __webpack_exports__["default"] = (observer); -/***/ }, +/***/ }), -/***/ "./src/observers/requestedCallbacks.ts" +/***/ "./src/observers/requestedCallbacks.ts": /*!*********************************************!*\ !*** ./src/observers/requestedCallbacks.ts ***! \*********************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -2934,14 +3132,15 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../actions/dependencies_ts */ "./src/actions/dependencies_ts.ts"); /* harmony import */ var _utils_wait__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./../utils/wait */ "./src/utils/wait.ts"); /* harmony import */ var _utils_callbacks__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../utils/callbacks */ "./src/utils/callbacks.ts"); -function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(typeof e + " is not iterable"); } +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); } function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } @@ -2969,7 +3168,7 @@ var observer = { 0. Prune circular callbacks that have completed the loop - cb.callback included in cb.predecessors */ - rCirculars = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(cb => { + rCirculars = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(function (cb) { var _cb$predecessors; return (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(cb.callback, (_cb$predecessors = cb.predecessors) !== null && _cb$predecessors !== void 0 ? _cb$predecessors : []); }, requested); @@ -2984,17 +3183,21 @@ var observer = { */ rDuplicates = []; rMergedDuplicates = []; - (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_18__.getUniqueIdentifier, requested)).forEach(group => { + (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_18__.getUniqueIdentifier, requested)).forEach(function (group) { if (group.length === 1) { // keep callback if its the only one of its kind rMergedDuplicates.push(group[0]); } else { - var initial = group.find(cb => cb.initialCall); + var initial = group.find(function (cb) { + return cb.initialCall; + }); if (initial) { // drop the initial callback if it's not alone rDuplicates.push(initial); } - var groupWithoutInitial = group.filter(cb => cb !== initial); + var groupWithoutInitial = group.filter(function (cb) { + return cb !== initial; + }); if (groupWithoutInitial.length === 1) { // if there's only one callback beside the initial one, keep that callback rMergedDuplicates.push(groupWithoutInitial[0]); @@ -3003,7 +3206,9 @@ var observer = { rDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(rDuplicates, groupWithoutInitial); rMergedDuplicates.push((0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])({ changedPropIds: (0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(Math.max), {}, (0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])('changedPropIds', groupWithoutInitial)), - executionGroup: (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(exg => Boolean(exg), (0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])('executionGroup', groupWithoutInitial)).slice(-1)[0] + executionGroup: (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(function (exg) { + return Boolean(exg); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])('executionGroup', groupWithoutInitial)).slice(-1)[0] }, groupWithoutInitial.slice(-1)[0])); } } @@ -3021,10 +3226,18 @@ var observer = { Extract all but the first callback from each IOS-key group these callbacks are `prioritized` and duplicates. */ - pDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(group => group.slice(0, -1), (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_18__.getUniqueIdentifier, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(prioritized, requested))))); - bDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(group => group.slice(0, -1), (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_18__.getUniqueIdentifier, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(blocked, requested))))); - eDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(group => group.slice(0, -1), (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_18__.getUniqueIdentifier, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(executing, requested))))); - wDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(group => group.slice(0, -1), (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_18__.getUniqueIdentifier, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(watched, requested))))); + pDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (group) { + return group.slice(0, -1); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_18__.getUniqueIdentifier, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(prioritized, requested))))); + bDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (group) { + return group.slice(0, -1); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_18__.getUniqueIdentifier, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(blocked, requested))))); + eDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (group) { + return group.slice(0, -1); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_18__.getUniqueIdentifier, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(executing, requested))))); + wDuplicates = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (group) { + return group.slice(0, -1); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_18__.getUniqueIdentifier, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(watched, requested))))); /* 3. Modify or remove callbacks that are outputting to non-existing layout `id`. */ @@ -3080,9 +3293,11 @@ var observer = { candidates = (0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_18__.getReadyCallbacks)(paths, candidates, readyCallbacks); // Blocked requests need to make sure they have the callback as a predecessor blockedByAssumptions = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(candidates, candidates); - modified = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(cb => !cb.predecessors || !(0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(readyCallback.callback, cb.predecessors), blockedByAssumptions); + modified = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(function (cb) { + return !cb.predecessors || !(0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(readyCallback.callback, cb.predecessors); + }, blockedByAssumptions); oldBlocked = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(oldBlocked, modified); - newBlocked = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(newBlocked, modified.map(cb => { + newBlocked = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(newBlocked, modified.map(function (cb) { var _cb$predecessors2; return _objectSpread(_objectSpread({}, cb), {}, { predecessors: (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])((_cb$predecessors2 = cb.predecessors) !== null && _cb$predecessors2 !== void 0 ? _cb$predecessors2 : [], [readyCallback.callback]) @@ -3115,8 +3330,12 @@ var observer = { // Group by executionGroup, drop non-executionGroup callbacks // those were not triggered by layout changes and don't have "strong" interdependency for // callback chain completion - pendingGroups = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(cb => cb.executionGroup, (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(cb => !(0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(cb.executionGroup), stored)); - dropped = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(cb => { + pendingGroups = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(function (cb) { + return cb.executionGroup; + }, (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(function (cb) { + return !(0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(cb.executionGroup); + }, stored)); + dropped = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(function (cb) { // If there is no `stored` callback for the group, no outputs were dropped -> `cb` is kept if (!cb.executionGroup || !pendingGroups[cb.executionGroup] || !pendingGroups[cb.executionGroup].length) { return false; @@ -3124,9 +3343,13 @@ var observer = { // Get all inputs for `cb` var inputs = (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_18__.combineIdAndProp, (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(cb.getInputs(paths))); // Get all the potentially updated props for the group so far - var allProps = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(gcb => gcb.executionMeta.allProps, pendingGroups[cb.executionGroup])); + var allProps = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (gcb) { + return gcb.executionMeta.allProps; + }, pendingGroups[cb.executionGroup])); // Get all the updated props for the group so far - var updated = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(gcb => gcb.executionMeta.updatedProps, pendingGroups[cb.executionGroup])); + var updated = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (gcb) { + return gcb.executionMeta.updatedProps; + }, pendingGroups[cb.executionGroup])); // If there's no overlap between the updated props and the inputs, // + there's no props that aren't covered by the potentially updated props, // and not all inputs are multi valued @@ -3167,13 +3390,13 @@ var observer = { }; /* harmony default export */ __webpack_exports__["default"] = (observer); -/***/ }, +/***/ }), -/***/ "./src/observers/storedCallbacks.ts" +/***/ "./src/observers/storedCallbacks.ts": /*!******************************************!*\ !*** ./src/observers/storedCallbacks.ts ***! \******************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -3196,7 +3419,7 @@ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } var observer = { - observer: _ref => { + observer: function observer(_ref) { var dispatch = _ref.dispatch, getState = _ref.getState; var _getState = getState(), @@ -3204,13 +3427,21 @@ var observer = { var pendingCallbacks = (0,_utils_callbacks__WEBPACK_IMPORTED_MODULE_8__.getPendingCallbacks)(callbacks); var _getState2 = getState(), stored = _getState2.callbacks.stored; - var _partition = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(cb => (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(cb.executionGroup), stored), + var _partition = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(function (cb) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(cb.executionGroup); + }, stored), _partition2 = _slicedToArray(_partition, 2), nullGroupCallbacks = _partition2[0], groupCallbacks = _partition2[1]; - var executionGroups = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(cb => cb.executionGroup, groupCallbacks); - var pendingGroups = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(cb => cb.executionGroup, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(cb => !(0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(cb.executionGroup), pendingCallbacks)); - var dropped = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])((res, _ref2) => { + var executionGroups = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (cb) { + return cb.executionGroup; + }, groupCallbacks); + var pendingGroups = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (cb) { + return cb.executionGroup; + }, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(function (cb) { + return !(0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(cb.executionGroup); + }, pendingCallbacks)); + var dropped = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(function (res, _ref2) { var _ref3 = _slicedToArray(_ref2, 2), executionGroup = _ref3[0], executionGroupCallbacks = _ref3[1]; @@ -3222,19 +3453,19 @@ var observer = { }; /* harmony default export */ __webpack_exports__["default"] = (observer); -/***/ }, +/***/ }), -/***/ "./src/observers/websocketObserver.ts" +/***/ "./src/observers/websocketObserver.ts": /*!********************************************!*\ !*** ./src/observers/websocketObserver.ts ***! \********************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ disconnectWebSocket: () => (/* binding */ disconnectWebSocket), -/* harmony export */ initializeWebSocket: () => (/* binding */ initializeWebSocket) +/* harmony export */ disconnectWebSocket: function() { return /* binding */ disconnectWebSocket; }, +/* harmony export */ initializeWebSocket: function() { return /* binding */ initializeWebSocket; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); /* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../actions */ "./src/actions/index.js"); @@ -3244,16 +3475,21 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _utils_workerClient__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/workerClient */ "./src/utils/workerClient.ts"); /* harmony import */ var _actions_callbacks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../actions/callbacks */ "./src/actions/callbacks.ts"); /* harmony import */ var _actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/dependencies_ts */ "./src/actions/dependencies_ts.ts"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; } +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } /** @@ -3324,7 +3560,7 @@ function _initializeWebSocket() { return _context.a(2); case 2: workerClient = (0,_utils_workerClient__WEBPACK_IMPORTED_MODULE_5__.getWorkerClient)(); // Helper to process a single set_props payload - processSetProps = payload => { + processSetProps = function processSetProps(payload) { var componentId = payload.componentId, rawProps = payload.props; var parsedId = parseComponentId(componentId); @@ -3355,13 +3591,13 @@ function _initializeWebSocket() { var updatedState = store.getState(); store.dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_1__.setPaths)((0,_actions_paths__WEBPACK_IMPORTED_MODULE_3__.computePaths)(_objectSpread(_objectSpread({}, oldComponent), {}, { props: _objectSpread(_objectSpread({}, oldProps), processedProps) - }), [...componentPath], updatedState.paths, updatedState.paths.events))); + }), _toConsumableArray(componentPath), updatedState.paths, updatedState.paths.events))); } }; // Handle single SET_PROPS message workerClient.onSetProps = processSetProps; // Handle batched SET_PROPS_BATCH message - workerClient.onSetPropsBatch = payloads => { - (0,react_redux__WEBPACK_IMPORTED_MODULE_4__.batch)(() => { + workerClient.onSetPropsBatch = function (payloads) { + (0,react_redux__WEBPACK_IMPORTED_MODULE_4__.batch)(function () { var _iterator = _createForOfIteratorHelper(payloads), _step; try { @@ -3377,7 +3613,7 @@ function _initializeWebSocket() { }); }; // Handle GET_PROPS_REQUEST messages - workerClient.onGetPropsRequest = (requestId, payload) => { + workerClient.onGetPropsRequest = function (requestId, payload) { var componentId = payload.componentId, properties = payload.properties; var parsedId = parseComponentId(componentId); @@ -3385,7 +3621,7 @@ function _initializeWebSocket() { var componentPath = (0,_actions_paths__WEBPACK_IMPORTED_MODULE_3__.getPath)(state.paths, parsedId); var result = {}; if (componentPath) { - var componentProps = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])([...componentPath, 'props'], state.layout); + var componentProps = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])([].concat(_toConsumableArray(componentPath), ['props']), state.layout); if (componentProps) { var _iterator2 = _createForOfIteratorHelper(properties), _step2; @@ -3408,7 +3644,7 @@ function _initializeWebSocket() { }; // Track connection state for reconnection handling wasDisconnected = false; // Handle connection events - workerClient.onConnected = () => { + workerClient.onConnected = function () { console.log('[Dash] WebSocket connected'); // On reconnect (not initial connect), re-trigger persistent callbacks if (wasDisconnected) { @@ -3416,7 +3652,7 @@ function _initializeWebSocket() { var state = store.getState(); var graphs = state.graphs; if (graphs !== null && graphs !== void 0 && graphs.callbacks) { - var persistentCallbacks = graphs.callbacks.reduce((acc, cb) => { + var persistentCallbacks = graphs.callbacks.reduce(function (acc, cb) { // Only re-trigger no-output callbacks with no inputs // These are the "persistent" callbacks that should restart if (cb.noOutput && cb.inputs.length === 0) { @@ -3433,11 +3669,11 @@ function _initializeWebSocket() { } } }; - workerClient.onDisconnected = reason => { + workerClient.onDisconnected = function (reason) { console.log("[Dash] WebSocket disconnected: ".concat(reason)); wasDisconnected = true; }; - workerClient.onError = (message, code) => { + workerClient.onError = function (message, code) { console.error("[Dash] WebSocket error: ".concat(message), code); }; // Connect to the worker @@ -3454,7 +3690,7 @@ function _initializeWebSocket() { console.error('[Dash] Failed to connect to WebSocket worker:', _t); case 6: // Handle tab visibility changes - document.addEventListener('visibilitychange', () => { + document.addEventListener('visibilitychange', function () { if (document.visibilityState === 'visible') { if (workerClient.connected) { // Tab visible and connected - reset inactivity timer @@ -3462,7 +3698,9 @@ function _initializeWebSocket() { } else { // Tab visible but disconnected - reconnect console.log('[Dash] Tab visible, reconnecting WebSocket...'); - workerClient.ensureConnected(config).catch(err => console.error('[Dash] Failed to reconnect:', err)); + workerClient.ensureConnected(config).catch(function (err) { + return console.error('[Dash] Failed to reconnect:', err); + }); } } }); @@ -3492,26 +3730,32 @@ function disconnectWebSocket() { workerClient.disconnect(); } -/***/ }, +/***/ }), -/***/ "./src/reducers/callbackJobs.ts" +/***/ "./src/reducers/callbackJobs.ts": /*!**************************************!*\ !*** ./src/reducers/callbackJobs.ts ***! \**************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* export default binding */ __WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assoc.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assocPath.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/dissoc.js"); -var setJob = (job, state) => (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(job.jobId, job, state); -var removeJob = (jobId, state) => (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(jobId, state); -var setOutdated = (jobId, state) => (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])([jobId, 'outdated'], true, state); +var setJob = function setJob(job, state) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(job.jobId, job, state); +}; +var removeJob = function removeJob(jobId, state) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(jobId, state); +}; +var setOutdated = function setOutdated(jobId, state) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])([jobId, 'outdated'], true, state); +}; /* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var action = arguments.length > 1 ? arguments[1] : undefined; @@ -3527,28 +3771,29 @@ var setOutdated = (jobId, state) => (0,ramda__WEBPACK_IMPORTED_MODULE_1__["defau } } -/***/ }, +/***/ }), -/***/ "./src/reducers/callbacks.ts" +/***/ "./src/reducers/callbacks.ts": /*!***********************************!*\ !*** ./src/reducers/callbacks.ts ***! \***********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ CallbackActionType: () => (/* binding */ CallbackActionType), -/* harmony export */ CallbackAggregateActionType: () => (/* binding */ CallbackAggregateActionType) +/* harmony export */ CallbackActionType: function() { return /* binding */ CallbackActionType; }, +/* harmony export */ CallbackAggregateActionType: function() { return /* binding */ CallbackAggregateActionType; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/concat.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/difference.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/reduce.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var CallbackActionType; (function (CallbackActionType) { @@ -3614,10 +3859,12 @@ var fields = { [CallbackActionType.RemoveStored]: 'stored', [CallbackActionType.RemoveWatched]: 'watched' }; -var mutateCompleted = (state, action) => _objectSpread(_objectSpread({}, state), {}, { - completed: state.completed + action.payload -}); -var mutateCallbacks = (state, action) => { +var mutateCompleted = function mutateCompleted(state, action) { + return _objectSpread(_objectSpread({}, state), {}, { + completed: state.completed + action.payload + }); +}; +var mutateCallbacks = function mutateCallbacks(state, action) { var transform = transforms[action.type]; var field = fields[action.type]; return !transform || !field || action.payload.length === 0 ? state : _objectSpread(_objectSpread({}, state), {}, { @@ -3627,7 +3874,7 @@ var mutateCallbacks = (state, action) => { /* harmony default export */ __webpack_exports__["default"] = (function () { var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_STATE; var action = arguments.length > 1 ? arguments[1] : undefined; - return (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])((s, a) => { + return (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (s, a) { if (a === null) { return s; } else if (a.type === CallbackAggregateActionType.AddCompleted) { @@ -3637,18 +3884,18 @@ var mutateCallbacks = (state, action) => { }, state, action.type === CallbackAggregateActionType.Aggregate ? action.payload : [action]); }); -/***/ }, +/***/ }), -/***/ "./src/reducers/isLoading.ts" +/***/ "./src/reducers/isLoading.ts": /*!***********************************!*\ !*** ./src/reducers/isLoading.ts ***! \***********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ IsLoadingActionType: () => (/* binding */ IsLoadingActionType) +/* harmony export */ IsLoadingActionType: function() { return /* binding */ IsLoadingActionType; } /* harmony export */ }); var IsLoadingActionType; (function (IsLoadingActionType) { @@ -3661,18 +3908,18 @@ var DEFAULT_STATE = true; return action.type === IsLoadingActionType.Set ? action.payload : state; }); -/***/ }, +/***/ }), -/***/ "./src/reducers/loading.ts" +/***/ "./src/reducers/loading.ts": /*!*********************************!*\ !*** ./src/reducers/loading.ts ***! \*********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ loading) +/* harmony export */ "default": function() { return /* binding */ loading; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assocPath.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/includes.js"); @@ -3683,13 +3930,15 @@ function loading() { var action = arguments.length > 1 ? arguments[1] : undefined; switch (action.type) { case 'LOADED': - return action.payload.reduce((acc, load) => { + return action.payload.reduce(function (acc, load) { var loadPath = [JSON.stringify(load.path)]; var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])([], loadPath, acc); - return (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(loadPath, prev.filter(loading => loading.property !== load.property), acc); + return (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(loadPath, prev.filter(function (loading) { + return loading.property !== load.property; + }), acc); }, state); case 'LOADING': - return action.payload.reduce((acc, load) => { + return action.payload.reduce(function (acc, load) { var loadPath = [JSON.stringify(load.path)]; var prev = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])([], loadPath, acc); if (!(0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(load, prev)) { @@ -3703,18 +3952,18 @@ function loading() { } } -/***/ }, +/***/ }), -/***/ "./src/store.ts" +/***/ "./src/store.ts": /*!**********************!*\ !*** ./src/store.ts ***! \**********************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ RendererStore) +/* harmony export */ "default": function() { return /* binding */ RendererStore; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/once.js"); /* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! redux */ "./node_modules/redux/es/redux.js"); @@ -3728,9 +3977,13 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _observers_prioritizedCallbacks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./observers/prioritizedCallbacks */ "./src/observers/prioritizedCallbacks.ts"); /* harmony import */ var _observers_requestedCallbacks__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./observers/requestedCallbacks */ "./src/observers/requestedCallbacks.ts"); /* harmony import */ var _observers_storedCallbacks__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./observers/storedCallbacks */ "./src/observers/storedCallbacks.ts"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } @@ -3743,12 +3996,14 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = -class RendererStore { - constructor() { +var RendererStore = /*#__PURE__*/function () { + function RendererStore() { + var _this = this; + _classCallCheck(this, RendererStore); _defineProperty(this, "__store", void 0); _defineProperty(this, "storeObserver", new _StoreObserver__WEBPACK_IMPORTED_MODULE_4__["default"]()); - _defineProperty(this, "setObservers", (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(() => { - var observe = this.storeObserver.observe; + _defineProperty(this, "setObservers", (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(function () { + var observe = _this.storeObserver.observe; // FIXME Remove observer pattern and refactor to standard reducers/actions/selectors. observe(_observers_documentTitle__WEBPACK_IMPORTED_MODULE_5__["default"]); observe(_observers_isLoading__WEBPACK_IMPORTED_MODULE_8__["default"]); @@ -3758,14 +4013,14 @@ class RendererStore { observe(_observers_executedCallbacks__WEBPACK_IMPORTED_MODULE_6__["default"]); observe(_observers_storedCallbacks__WEBPACK_IMPORTED_MODULE_11__["default"]); })); - _defineProperty(this, "createAppStore", (reducer, middleware) => { - this.__store = (0,redux__WEBPACK_IMPORTED_MODULE_1__.createStore)(reducer, middleware); - this.storeObserver.setStore(this.__store); + _defineProperty(this, "createAppStore", function (reducer, middleware) { + _this.__store = (0,redux__WEBPACK_IMPORTED_MODULE_1__.createStore)(reducer, middleware); + _this.storeObserver.setStore(_this.__store); var ds = window.dash_stores = window.dash_stores || []; - if (!ds.includes(this.__store)) { - ds.push(this.__store); + if (!ds.includes(_this.__store)) { + ds.push(_this.__store); } - this.setObservers(); + _this.setObservers(); }); /** * Initialize a Redux store with thunk, plus logging (only in development mode) middleware @@ -3775,9 +4030,9 @@ class RendererStore { * @returns {Store} * An initialized redux store with middleware and possible hot reloading of reducers */ - _defineProperty(this, "initializeStore", reset => { - if (this.__store && !reset) { - return this.__store; + _defineProperty(this, "initializeStore", function (reset) { + if (_this.__store && !reset) { + return _this.__store; } var reducer = (0,_reducers_reducer__WEBPACK_IMPORTED_MODULE_3__.createReducer)(); // eslint-disable-next-line no-process-env @@ -3786,53 +4041,66 @@ class RendererStore { // only attach logger to middleware in non-production mode var reduxDTEC = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__; if (reduxDTEC) { - this.createAppStore(reducer, reduxDTEC({ + _this.createAppStore(reducer, reduxDTEC({ actionsDenylist: ['reloadRequest'] })((0,redux__WEBPACK_IMPORTED_MODULE_1__.applyMiddleware)(redux_thunk__WEBPACK_IMPORTED_MODULE_2__["default"]))); } else { - this.createAppStore(reducer, (0,redux__WEBPACK_IMPORTED_MODULE_1__.applyMiddleware)(redux_thunk__WEBPACK_IMPORTED_MODULE_2__["default"])); + _this.createAppStore(reducer, (0,redux__WEBPACK_IMPORTED_MODULE_1__.applyMiddleware)(redux_thunk__WEBPACK_IMPORTED_MODULE_2__["default"])); } } if (!reset) { // TODO - Protect this under a debug mode? - window.store = this.__store; + window.store = _this.__store; } if (false) // removed by dead control flow {} - return this.__store; + return _this.__store; }); this.__store = this.initializeStore(); } - get store() { - return this.__store; - } -} + return _createClass(RendererStore, [{ + key: "store", + get: function get() { + return this.__store; + } + }]); +}(); -/***/ }, -/***/ "./src/utils/callbacks.ts" +/***/ }), + +/***/ "./src/utils/callbacks.ts": /*!********************************!*\ !*** ./src/utils/callbacks.ts ***! \********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ getPendingCallbacks: () => (/* binding */ getPendingCallbacks) +/* harmony export */ getPendingCallbacks: function() { return /* binding */ getPendingCallbacks; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/omit.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/values.js"); +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } -var getPendingCallbacks = state => Array().concat(...(0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(['stored', 'completed'], state))); +var getPendingCallbacks = function getPendingCallbacks(state) { + var _Array; + return (_Array = Array()).concat.apply(_Array, _toConsumableArray((0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(['stored', 'completed'], state)))); +}; -/***/ }, +/***/ }), -/***/ "./src/utils/clientsideFunctions.ts" +/***/ "./src/utils/clientsideFunctions.ts": /*!******************************************!*\ !*** ./src/utils/clientsideFunctions.ts ***! \******************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -3841,11 +4109,18 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _actions_paths__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../actions/paths */ "./src/actions/paths.js"); /* harmony import */ var _wrapper_wrapping__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../wrapper/wrapping */ "./src/wrapper/wrapping.ts"); /* harmony import */ var _stores__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./stores */ "./src/utils/stores.ts"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } @@ -3888,7 +4163,7 @@ function set_props(idOrPath, props) { } dispatch((0,_actions_index__WEBPACK_IMPORTED_MODULE_0__.setPaths)((0,_actions_paths__WEBPACK_IMPORTED_MODULE_2__.computePaths)(_objectSpread(_objectSpread({}, oldComponent), {}, { props: _objectSpread(_objectSpread({}, oldComponent.props), props) - }), [...componentPath], state.paths, state.paths.events))); + }), _toConsumableArray(componentPath), state.paths, state.paths.events))); } } // Clean url code adapted from https://github.com/braintree/sanitize-url/blob/main/src/constants.ts @@ -3903,7 +4178,9 @@ var clean_url = function clean_url(url) { if (url === '') { return url; } - var cleaned = url.replace(newLines, '').replace(ctrlChars, '').replace(htmlEntities, (_, dec) => String.fromCharCode(dec)).trim(); + var cleaned = url.replace(newLines, '').replace(ctrlChars, '').replace(htmlEntities, function (_, dec) { + return String.fromCharCode(dec); + }).trim(); if (invalidProtocols.test(cleaned)) { return fallback; } @@ -3914,18 +4191,18 @@ dc['set_props'] = set_props; dc['clean_url'] = dc['clean_url'] === undefined ? clean_url : dc['clean_url']; dc['Patch'] = _actions_patch__WEBPACK_IMPORTED_MODULE_1__.PatchBuilder; -/***/ }, +/***/ }), -/***/ "./src/utils/libraries.ts" +/***/ "./src/utils/libraries.ts": /*!********************************!*\ !*** ./src/utils/libraries.ts ***! \********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ loadLibrary: () => (/* binding */ loadLibrary) +/* harmony export */ loadLibrary: function() { return /* binding */ loadLibrary; } /* harmony export */ }); function loadLibrary(resource) { var prom; @@ -3934,40 +4211,44 @@ function loadLibrary(resource) { var element = document.createElement('script'); element.src = resource.url; element.async = true; - prom = new Promise((resolve, reject) => { - element.onload = () => { + prom = new Promise(function (resolve, reject) { + element.onload = function () { resolve(); }; - element.onerror = error => reject(error); + element.onerror = function (error) { + return reject(error); + }; }); head === null || head === void 0 || head.appendChild(element); } else if (resource.type === '_css_dist') { var _element = document.createElement('link'); _element.href = resource.url; _element.rel = 'stylesheet'; - prom = new Promise((resolve, reject) => { - _element.onload = () => { + prom = new Promise(function (resolve, reject) { + _element.onload = function () { resolve(); }; - _element.onerror = error => reject(error); + _element.onerror = function (error) { + return reject(error); + }; }); head === null || head === void 0 || head.appendChild(_element); } return prom; } -/***/ }, +/***/ }), -/***/ "./src/utils/rendererId.ts" +/***/ "./src/utils/rendererId.ts": /*!*********************************!*\ !*** ./src/utils/rendererId.ts ***! \*********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ getRendererId: () => (/* binding */ getRendererId) +/* harmony export */ getRendererId: function() { return /* binding */ getRendererId; } /* harmony export */ }); /** Cached renderer ID for this page instance */ var cachedRendererId = null; @@ -3989,31 +4270,31 @@ function getRendererId() { return cachedRendererId; } -/***/ }, +/***/ }), -/***/ "./src/utils/stores.ts" +/***/ "./src/utils/stores.ts": /*!*****************************!*\ !*** ./src/utils/stores.ts ***! \*****************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ getStores: () => (/* binding */ getStores) +/* harmony export */ getStores: function() { return /* binding */ getStores; } /* harmony export */ }); function getStores() { var stores = window.dash_stores = window.dash_stores || []; return stores; } -/***/ }, +/***/ }), -/***/ "./src/utils/wait.ts" +/***/ "./src/utils/wait.ts": /*!***************************!*\ !*** ./src/utils/wait.ts ***! \***************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -4027,7 +4308,9 @@ function _asyncToGenerator(n) { return function () { var t = this, e = arguments return _regenerator().w(function (_context) { while (1) switch (_context.n) { case 0: - p = new Promise(resolve => _resolve = resolve); + p = new Promise(function (resolve) { + return _resolve = resolve; + }); setTimeout(_resolve, duration); return _context.a(2, p); } @@ -4038,23 +4321,24 @@ function _asyncToGenerator(n) { return function () { var t = this, e = arguments }; }()); -/***/ }, +/***/ }), -/***/ "./src/utils/workerClient.ts" +/***/ "./src/utils/workerClient.ts": /*!***********************************!*\ !*** ./src/utils/workerClient.ts ***! \***********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ WorkerMessageType: () => (/* binding */ WorkerMessageType), -/* harmony export */ getWorkerClient: () => (/* binding */ getWorkerClient), -/* harmony export */ isWebSocketAvailable: () => (/* binding */ isWebSocketAvailable), -/* harmony export */ isWebSocketEnabled: () => (/* binding */ isWebSocketEnabled) +/* harmony export */ WorkerMessageType: function() { return /* binding */ WorkerMessageType; }, +/* harmony export */ getWorkerClient: function() { return /* binding */ getWorkerClient; }, +/* harmony export */ isWebSocketAvailable: function() { return /* binding */ isWebSocketAvailable; }, +/* harmony export */ isWebSocketEnabled: function() { return /* binding */ isWebSocketEnabled; } /* harmony export */ }); /* harmony import */ var _rendererId__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rendererId */ "./src/utils/rendererId.ts"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } @@ -4066,9 +4350,12 @@ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /** * Client for communicating with the Dash WebSocket SharedWorker. */ @@ -4092,8 +4379,9 @@ var WorkerMessageType; /** * Client for the Dash WebSocket SharedWorker. */ -class WorkerClient { - constructor() { +var WorkerClient = /*#__PURE__*/function () { + function WorkerClient() { + _classCallCheck(this, WorkerClient); _defineProperty(this, "worker", null); _defineProperty(this, "rendererId", void 0); _defineProperty(this, "pendingCallbacks", new Map()); @@ -4122,281 +4410,311 @@ class WorkerClient { * @param inactivityTimeout Optional inactivity timeout in ms * @param heartbeatInterval Optional heartbeat interval in ms */ - connect(workerUrl, serverUrl, inactivityTimeout, heartbeatInterval) { - var _this = this; - return _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() { - return _regenerator().w(function (_context) { - while (1) switch (_context.n) { - case 0: - if (!_this.worker) { - _context.n = 1; - break; - } - return _context.a(2); - case 1: - // Create the SharedWorker - _this.worker = new SharedWorker(workerUrl, { - name: 'dash-ws-worker' - }); - // Set up message handling - _this.worker.port.onmessage = _this.handleMessage.bind(_this); - // Create promise for connection - _this.connectionPromise = new Promise(resolve => { - _this.connectionResolve = resolve; - }); - // Start the port - _this.worker.port.start(); - // Send connect message - _this.worker.port.postMessage({ - type: WorkerMessageType.CONNECT, - rendererId: _this.rendererId, - payload: { - serverUrl, - inactivityTimeout, - heartbeatInterval + return _createClass(WorkerClient, [{ + key: "connect", + value: (function () { + var _connect = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(workerUrl, serverUrl, inactivityTimeout, heartbeatInterval) { + var _this = this; + return _regenerator().w(function (_context) { + while (1) switch (_context.n) { + case 0: + if (!this.worker) { + _context.n = 1; + break; } - }); - // Wait for connection - _context.n = 2; - return _this.connectionPromise; - case 2: - return _context.a(2); + return _context.a(2); + case 1: + // Create the SharedWorker + this.worker = new SharedWorker(workerUrl, { + name: 'dash-ws-worker' + }); + // Set up message handling + this.worker.port.onmessage = this.handleMessage.bind(this); + // Create promise for connection + this.connectionPromise = new Promise(function (resolve) { + _this.connectionResolve = resolve; + }); + // Start the port + this.worker.port.start(); + // Send connect message + this.worker.port.postMessage({ + type: WorkerMessageType.CONNECT, + rendererId: this.rendererId, + payload: { + serverUrl, + inactivityTimeout, + heartbeatInterval + } + }); + // Wait for connection + _context.n = 2; + return this.connectionPromise; + case 2: + return _context.a(2); + } + }, _callee, this); + })); + function connect(_x, _x2, _x3, _x4) { + return _connect.apply(this, arguments); + } + return connect; + }() + /** + * Disconnect from the worker. + */ + ) + }, { + key: "disconnect", + value: function disconnect() { + if (this.worker) { + this.worker.port.postMessage({ + type: WorkerMessageType.DISCONNECT, + rendererId: this.rendererId + }); + this.worker.port.close(); + this.worker = null; + } + this.isConnected = false; + this.connectionPromise = null; + this.connectionResolve = null; + // Resolve pending callbacks with prevent_update so loading states clear + var _iterator = _createForOfIteratorHelper(this.pendingCallbacks), + _step; + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var _step$value = _slicedToArray(_step.value, 2), + pending = _step$value[1]; + pending.resolve({ + status: 'prevent_update' + }); } - }, _callee); - }))(); - } - /** - * Disconnect from the worker. - */ - disconnect() { - if (this.worker) { + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + this.pendingCallbacks.clear(); + } + /** + * Ensure the worker is connected, initiating connection if needed. + * @param config The Dash config with websocket settings + */ + }, { + key: "ensureConnected", + value: (function () { + var _ensureConnected = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(config) { + var _config$websocket, _config$websocket2; + var wsProtocol, host, wsUrl; + return _regenerator().w(function (_context2) { + while (1) switch (_context2.n) { + case 0: + if (!this.isConnected) { + _context2.n = 1; + break; + } + return _context2.a(2); + case 1: + if (!this.connectionPromise) { + _context2.n = 3; + break; + } + _context2.n = 2; + return this.connectionPromise; + case 2: + return _context2.a(2); + case 3: + if (!(!((_config$websocket = config.websocket) !== null && _config$websocket !== void 0 && _config$websocket.url) || !((_config$websocket2 = config.websocket) !== null && _config$websocket2 !== void 0 && _config$websocket2.worker_url))) { + _context2.n = 4; + break; + } + throw new Error('WebSocket config not available'); + case 4: + if (!(typeof SharedWorker === 'undefined')) { + _context2.n = 5; + break; + } + throw new Error('SharedWorker not supported'); + case 5: + // Build WebSocket URL + wsProtocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; + host = window.location.host; + wsUrl = "".concat(wsProtocol, "//").concat(host).concat(config.websocket.url); + _context2.n = 6; + return this.connect(config.websocket.worker_url, wsUrl, config.websocket.inactivity_timeout, config.websocket.heartbeat_interval); + case 6: + return _context2.a(2); + } + }, _callee2, this); + })); + function ensureConnected(_x5) { + return _ensureConnected.apply(this, arguments); + } + return ensureConnected; + }() + /** + * Send a callback request to the server via the worker. + * @param payload The callback payload + * @returns Promise that resolves with the callback response + */ + ) + }, { + key: "sendCallback", + value: (function () { + var _sendCallback = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(payload) { + var _this2 = this; + var requestId; + return _regenerator().w(function (_context3) { + while (1) switch (_context3.n) { + case 0: + if (!(this.connectionPromise && !this.isConnected)) { + _context3.n = 1; + break; + } + _context3.n = 1; + return this.connectionPromise; + case 1: + if (this.worker) { + _context3.n = 2; + break; + } + throw new Error('Worker not connected'); + case 2: + requestId = "".concat(this.rendererId, "-").concat(++this.requestCounter); + return _context3.a(2, new Promise(function (resolve, reject) { + _this2.pendingCallbacks.set(requestId, { + resolve, + reject + }); + _this2.worker.port.postMessage({ + type: WorkerMessageType.CALLBACK_REQUEST, + rendererId: _this2.rendererId, + requestId, + payload + }); + })); + } + }, _callee3, this); + })); + function sendCallback(_x6) { + return _sendCallback.apply(this, arguments); + } + return sendCallback; + }() + /** + * Send a get_props response back to the server. + * @param requestId The request ID from the get_props request + * @param props The property values + */ + ) + }, { + key: "sendGetPropsResponse", + value: function sendGetPropsResponse(requestId, props) { + if (!this.worker || !this.isConnected) { + return; + } this.worker.port.postMessage({ - type: WorkerMessageType.DISCONNECT, - rendererId: this.rendererId + type: WorkerMessageType.GET_PROPS_RESPONSE, + rendererId: this.rendererId, + requestId, + payload: props }); - this.worker.port.close(); - this.worker = null; - } - this.isConnected = false; - this.connectionPromise = null; - this.connectionResolve = null; - // Resolve pending callbacks with prevent_update so loading states clear - var _iterator = _createForOfIteratorHelper(this.pendingCallbacks), - _step; - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var _step$value = _slicedToArray(_step.value, 2), - pending = _step$value[1]; - pending.resolve({ - status: 'prevent_update' + } + /** + * Check if the worker is connected. + */ + }, { + key: "connected", + get: function get() { + return this.isConnected; + } + /** + * Notify the worker that the tab is now visible. + * This resets the inactivity timer to prevent timeout while user is viewing. + */ + }, { + key: "notifyTabVisible", + value: function notifyTabVisible() { + if (this.worker && this.isConnected) { + this.worker.port.postMessage({ + type: WorkerMessageType.TAB_VISIBLE, + rendererId: this.rendererId }); } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); } - this.pendingCallbacks.clear(); - } - /** - * Ensure the worker is connected, initiating connection if needed. - * @param config The Dash config with websocket settings - */ - ensureConnected(config) { - var _this2 = this; - return _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() { - var _config$websocket, _config$websocket2; - var wsProtocol, host, wsUrl; - return _regenerator().w(function (_context2) { - while (1) switch (_context2.n) { - case 0: - if (!_this2.isConnected) { - _context2.n = 1; - break; - } - return _context2.a(2); - case 1: - if (!_this2.connectionPromise) { - _context2.n = 3; - break; - } - _context2.n = 2; - return _this2.connectionPromise; - case 2: - return _context2.a(2); - case 3: - if (!(!((_config$websocket = config.websocket) !== null && _config$websocket !== void 0 && _config$websocket.url) || !((_config$websocket2 = config.websocket) !== null && _config$websocket2 !== void 0 && _config$websocket2.worker_url))) { - _context2.n = 4; - break; - } - throw new Error('WebSocket config not available'); - case 4: - if (!(typeof SharedWorker === 'undefined')) { - _context2.n = 5; - break; - } - throw new Error('SharedWorker not supported'); - case 5: - // Build WebSocket URL - wsProtocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; - host = window.location.host; - wsUrl = "".concat(wsProtocol, "//").concat(host).concat(config.websocket.url); - _context2.n = 6; - return _this2.connect(config.websocket.worker_url, wsUrl, config.websocket.inactivity_timeout, config.websocket.heartbeat_interval); - case 6: - return _context2.a(2); - } - }, _callee2); - }))(); - } - /** - * Send a callback request to the server via the worker. - * @param payload The callback payload - * @returns Promise that resolves with the callback response - */ - sendCallback(payload) { - var _this3 = this; - return _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() { - var requestId; - return _regenerator().w(function (_context3) { - while (1) switch (_context3.n) { - case 0: - if (!(_this3.connectionPromise && !_this3.isConnected)) { - _context3.n = 1; - break; + }, { + key: "handleMessage", + value: function handleMessage(event) { + var message = event.data; + switch (message.type) { + case WorkerMessageType.CONNECTED: + this.isConnected = true; + if (this.connectionResolve) { + this.connectionResolve(); + this.connectionResolve = null; + } + if (this.onConnected) { + this.onConnected(); + } + break; + case WorkerMessageType.DISCONNECTED: + this.isConnected = false; + // Resolve pending callbacks with prevent_update so loading states clear + var _iterator2 = _createForOfIteratorHelper(this.pendingCallbacks), + _step2; + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var _step2$value = _slicedToArray(_step2.value, 2), + pending = _step2$value[1]; + pending.resolve({ + status: 'prevent_update' + }); } - _context3.n = 1; - return _this3.connectionPromise; - case 1: - if (_this3.worker) { - _context3.n = 2; - break; + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); + } + this.pendingCallbacks.clear(); + if (this.onDisconnected) { + var _message$payload; + this.onDisconnected((_message$payload = message.payload) === null || _message$payload === void 0 ? void 0 : _message$payload.reason); + } + break; + case WorkerMessageType.CALLBACK_RESPONSE: + { + var requestId = message.requestId; + var _pending = this.pendingCallbacks.get(requestId); + if (_pending) { + this.pendingCallbacks.delete(requestId); + _pending.resolve(message.payload); } - throw new Error('Worker not connected'); - case 2: - requestId = "".concat(_this3.rendererId, "-").concat(++_this3.requestCounter); - return _context3.a(2, new Promise((resolve, reject) => { - _this3.pendingCallbacks.set(requestId, { - resolve, - reject - }); - _this3.worker.port.postMessage({ - type: WorkerMessageType.CALLBACK_REQUEST, - rendererId: _this3.rendererId, - requestId, - payload - }); - })); - } - }, _callee3); - }))(); - } - /** - * Send a get_props response back to the server. - * @param requestId The request ID from the get_props request - * @param props The property values - */ - sendGetPropsResponse(requestId, props) { - if (!this.worker || !this.isConnected) { - return; - } - this.worker.port.postMessage({ - type: WorkerMessageType.GET_PROPS_RESPONSE, - rendererId: this.rendererId, - requestId, - payload: props - }); - } - /** - * Check if the worker is connected. - */ - get connected() { - return this.isConnected; - } - /** - * Notify the worker that the tab is now visible. - * This resets the inactivity timer to prevent timeout while user is viewing. - */ - notifyTabVisible() { - if (this.worker && this.isConnected) { - this.worker.port.postMessage({ - type: WorkerMessageType.TAB_VISIBLE, - rendererId: this.rendererId - }); - } - } - handleMessage(event) { - var message = event.data; - switch (message.type) { - case WorkerMessageType.CONNECTED: - this.isConnected = true; - if (this.connectionResolve) { - this.connectionResolve(); - this.connectionResolve = null; - } - if (this.onConnected) { - this.onConnected(); - } - break; - case WorkerMessageType.DISCONNECTED: - this.isConnected = false; - // Resolve pending callbacks with prevent_update so loading states clear - var _iterator2 = _createForOfIteratorHelper(this.pendingCallbacks), - _step2; - try { - for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { - var _step2$value = _slicedToArray(_step2.value, 2), - pending = _step2$value[1]; - pending.resolve({ - status: 'prevent_update' - }); + break; } - } catch (err) { - _iterator2.e(err); - } finally { - _iterator2.f(); - } - this.pendingCallbacks.clear(); - if (this.onDisconnected) { - var _message$payload; - this.onDisconnected((_message$payload = message.payload) === null || _message$payload === void 0 ? void 0 : _message$payload.reason); - } - break; - case WorkerMessageType.CALLBACK_RESPONSE: - { - var requestId = message.requestId; - var _pending = this.pendingCallbacks.get(requestId); - if (_pending) { - this.pendingCallbacks.delete(requestId); - _pending.resolve(message.payload); + case WorkerMessageType.SET_PROPS: + if (this.onSetProps) { + this.onSetProps(message.payload); } break; - } - case WorkerMessageType.SET_PROPS: - if (this.onSetProps) { - this.onSetProps(message.payload); - } - break; - case WorkerMessageType.SET_PROPS_BATCH: - if (this.onSetPropsBatch) { - this.onSetPropsBatch(message.payload); - } - break; - case WorkerMessageType.GET_PROPS_REQUEST: - if (this.onGetPropsRequest) { - this.onGetPropsRequest(message.requestId, message.payload); - } - break; - case WorkerMessageType.ERROR: - if (this.onError) { - var _message$payload2, _message$payload3; - this.onError(((_message$payload2 = message.payload) === null || _message$payload2 === void 0 ? void 0 : _message$payload2.message) || 'Unknown error', (_message$payload3 = message.payload) === null || _message$payload3 === void 0 ? void 0 : _message$payload3.code); - } - break; + case WorkerMessageType.SET_PROPS_BATCH: + if (this.onSetPropsBatch) { + this.onSetPropsBatch(message.payload); + } + break; + case WorkerMessageType.GET_PROPS_REQUEST: + if (this.onGetPropsRequest) { + this.onGetPropsRequest(message.requestId, message.payload); + } + break; + case WorkerMessageType.ERROR: + if (this.onError) { + var _message$payload2, _message$payload3; + this.onError(((_message$payload2 = message.payload) === null || _message$payload2 === void 0 ? void 0 : _message$payload2.message) || 'Unknown error', (_message$payload3 = message.payload) === null || _message$payload3 === void 0 ? void 0 : _message$payload3.code); + } + break; + } } - } -} -// Singleton instance + }]); +}(); // Singleton instance var workerClientInstance = null; /** * Get the singleton WorkerClient instance. @@ -4424,18 +4742,18 @@ function isWebSocketAvailable(config) { return !!((_config$websocket4 = config.websocket) !== null && _config$websocket4 !== void 0 && _config$websocket4.url && (_config$websocket5 = config.websocket) !== null && _config$websocket5 !== void 0 && _config$websocket5.worker_url && typeof SharedWorker !== 'undefined'); } -/***/ }, +/***/ }), -/***/ "./src/wrapper/CheckedComponent.tsx" +/***/ "./src/wrapper/CheckedComponent.tsx": /*!******************************************!*\ !*** ./src/wrapper/CheckedComponent.tsx ***! \******************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ CheckedComponent) +/* harmony export */ "default": function() { return /* binding */ CheckedComponent; } /* harmony export */ }); /* harmony import */ var _checkPropTypes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../checkPropTypes */ "./src/checkPropTypes.js"); /* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../exceptions */ "./src/exceptions.js"); @@ -4456,20 +4774,20 @@ function CheckedComponent(p) { return children; } -/***/ }, +/***/ }), -/***/ "./src/wrapper/DashContext.tsx" +/***/ "./src/wrapper/DashContext.tsx": /*!*************************************!*\ !*** ./src/wrapper/DashContext.tsx ***! \*************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DashContext: () => (/* binding */ DashContext), -/* harmony export */ DashContextProvider: () => (/* binding */ DashContextProvider), -/* harmony export */ useDashContext: () => (/* binding */ useDashContext) +/* harmony export */ DashContext: function() { return /* binding */ DashContext; }, +/* harmony export */ DashContextProvider: function() { return /* binding */ DashContextProvider; }, +/* harmony export */ useDashContext: function() { return /* binding */ useDashContext; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); @@ -4483,9 +4801,11 @@ var DashContext = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().crea function DashContextProvider(props) { var children = props.children, componentPath = props.componentPath; - var stringPath = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => JSON.stringify(componentPath), [componentPath]); + var stringPath = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () { + return JSON.stringify(componentPath); + }, [componentPath]); var store = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useStore)(); - var isLoading = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(options => { + var isLoading = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (options) { var _ref = options || {}, extraPath = _ref.extraPath, rawPath = _ref.rawPath, @@ -4499,12 +4819,12 @@ function DashContextProvider(props) { var loading = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])([], loadingPath, store.getState().loading); return filterFunc ? loading.filter(filterFunc).length > 0 : loading.length > 0; }, [stringPath]); - var useLoading = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(options => { + var useLoading = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (options) { var _ref2 = options || {}, filterFunc = _ref2.filterFunc, extraPath = _ref2.extraPath, rawPath = _ref2.rawPath; - return (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(state => { + return (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(function (state) { var loadingPath = [stringPath]; if (extraPath) { loadingPath = [JSON.stringify((0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(componentPath, extraPath))]; @@ -4518,7 +4838,7 @@ function DashContextProvider(props) { return load.length > 0; }); }, [stringPath]); - var ctxValue = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => { + var ctxValue = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () { return { componentPath, isLoading, @@ -4541,13 +4861,13 @@ function useDashContext() { return ctx || {}; } -/***/ }, +/***/ }), -/***/ "./src/wrapper/DashWrapper.tsx" +/***/ "./src/wrapper/DashWrapper.tsx": /*!*************************************!*\ !*** ./src/wrapper/DashWrapper.tsx ***! \*************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -4578,13 +4898,18 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./selectors */ "./src/wrapper/selectors.ts"); /* harmony import */ var _CheckedComponent__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./CheckedComponent */ "./src/wrapper/CheckedComponent.tsx"); /* harmony import */ var _DashContext__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./DashContext */ "./src/wrapper/DashContext.tsx"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } var _excluded = ["componentPath", "_dashprivate_error", "_passedComponent", "_newRender"], _excluded2 = ["_dash_error"]; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } @@ -4632,7 +4957,7 @@ function DashWrapper(_ref) { renderComponent = component; renderComponentProps = componentProps; renderH = h; - (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => { + (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () { if (_newRender) { newRender.current = true; renderH = 0; @@ -4645,21 +4970,23 @@ function DashWrapper(_ref) { } renderedPath.current = componentPath; }, [_newRender]); - var setProps = newProps => { + var setProps = function setProps(newProps) { var _renderComponentProps = renderComponentProps, id = _renderComponentProps.id; var _dash_error = newProps._dash_error, restProps = _objectWithoutProperties(newProps, _excluded2); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - dispatch((dispatch, getState) => { + dispatch(function (dispatch, getState) { var currentState = getState(); var graphs = currentState.graphs; var oldLayout = (0,_wrapping__WEBPACK_IMPORTED_MODULE_20__.getComponentLayout)(renderedPath.current, currentState); if (!oldLayout) return; var oldProps = oldLayout.props; if (!oldProps) return; - var changedProps = (0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])((val, key) => !(0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(val, oldProps[key]), restProps); + var changedProps = (0,ramda__WEBPACK_IMPORTED_MODULE_14__["default"])(function (val, key) { + return !(0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(val, oldProps[key]); + }, restProps); if (_dash_error) { dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_18__.onError)({ type: 'frontEnd', @@ -4671,7 +4998,7 @@ function DashWrapper(_ref) { } // Identify the modified props that are required for callbacks var watchedKeys = (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_19__.getWatchedKeys)(id, (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(changedProps), graphs); - (0,react_redux__WEBPACK_IMPORTED_MODULE_16__.batch)(() => { + (0,react_redux__WEBPACK_IMPORTED_MODULE_16__.batch)(function () { // Only dispatch changes to Dash if a watched prop changed if (watchedKeys.length) { dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_18__.notifyObservers)({ @@ -4688,7 +5015,7 @@ function DashWrapper(_ref) { }); }); }; - var createContainer = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((container, containerPath, _childNewRender) => { + var createContainer = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (container, containerPath, _childNewRender) { var _container$props; if ((0,_isSimpleComponent__WEBPACK_IMPORTED_MODULE_22__["default"])(renderComponent)) { return renderComponent; @@ -4701,11 +5028,11 @@ function DashWrapper(_ref) { _newRender: _childNewRender }); }, []); - var wrapChildrenProp = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((node, childrenPath, _childNewRender) => { + var wrapChildrenProp = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (node, childrenPath, _childNewRender) { if (Array.isArray(node)) { - return node.map((n, i) => { + return node.map(function (n, i) { if ((0,_wrapping__WEBPACK_IMPORTED_MODULE_20__.isDryComponent)(n)) { - return createContainer(n, (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(componentPath, ['props', ...childrenPath, i]), _childNewRender); + return createContainer(n, (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(componentPath, ['props'].concat(_toConsumableArray(childrenPath), [i])), _childNewRender); } return n; }); @@ -4713,7 +5040,7 @@ function DashWrapper(_ref) { if (!(0,_wrapping__WEBPACK_IMPORTED_MODULE_20__.isDryComponent)(node)) { return node; } - return createContainer(node, (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(componentPath, ['props', ...childrenPath]), _childNewRender); + return createContainer(node, (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(componentPath, ['props'].concat(_toConsumableArray(childrenPath))), _childNewRender); }, [componentPath]); var extraProps = _objectSpread({ setProps @@ -4721,7 +5048,7 @@ function DashWrapper(_ref) { if ((0,_wrapping__WEBPACK_IMPORTED_MODULE_20__.checkRenderTypeProp)(renderComponent)) { extraProps['dashRenderType'] = newRender.current ? 'parent' : changedProps ? renderType : 'parent'; } - var setHydratedProps = (component, componentProps) => { + var setHydratedProps = function setHydratedProps(component, componentProps) { // Hydrate components props var childrenProps = (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])([], ['children_props', component === null || component === void 0 ? void 0 : component.namespace, component === null || component === void 0 ? void 0 : component.type], config); var props = (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])('children', componentProps), extraProps); @@ -4731,8 +5058,10 @@ function DashWrapper(_ref) { if (childrenProp.split('.')[0].replace('[]', '').replace('{}', '') in changedProps || newRender.current || !renderH) { childNewRender = {}; } - var handleObject = (obj, opath) => { - return (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])((node, k) => wrapChildrenProp(node, [...opath, k], childNewRender), obj); + var handleObject = function handleObject(obj, opath) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(function (node, k) { + return wrapChildrenProp(node, [].concat(_toConsumableArray(opath), [k]), childNewRender); + }, obj); }; if (childrenProp.includes('.')) { var childrenPath = childrenProp.split('.'); @@ -4745,7 +5074,7 @@ function DashWrapper(_ref) { var found = false, hasObject = false; // At first the childrenPath is always a list of strings. - childrenPath.forEach(p => { + childrenPath.forEach(function (p) { if (!found) { if (p.includes('[]')) { found = true; @@ -4778,7 +5107,7 @@ function DashWrapper(_ref) { if (!firstNode) { return 0; // continue } - nodeValue = node.map((el, i) => { + nodeValue = node.map(function (el, i) { var elementPath = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(frontPath, (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])([i], backPath)); var listValue; if (hasObject) { @@ -4820,7 +5149,9 @@ function DashWrapper(_ref) { // too dynamic for proper ts. // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - nodeValue = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])((d, k) => wrapChildrenProp(hasBack ? (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(_backPath, d) : d, hasBack ? (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(dynamic, (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])([k], _backPath)) : (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(dynamic, [k]), childNewRender), dynValue); + nodeValue = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])(function (d, k) { + return wrapChildrenProp(hasBack ? (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(_backPath, d) : d, hasBack ? (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(dynamic, (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])([k], _backPath)) : (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(dynamic, [k]), childNewRender); + }, dynValue); childrenPath = dynamic; } } else { @@ -4871,14 +5202,14 @@ function DashWrapper(_ref) { } return props; }; - (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { + (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { if (_newRender) { dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_18__.resetComponentState)({ itempath: componentPath })); } }, [_newRender]); - var hydrateFunc = () => { + var hydrateFunc = function hydrateFunc() { if (newRender.current) { renderComponent = _passedComponent; renderComponentProps = _passedComponent === null || _passedComponent === void 0 ? void 0 : _passedComponent.props; @@ -4921,13 +5252,13 @@ function DashWrapper(_ref) { } /* harmony default export */ __webpack_exports__["default"] = (DashWrapper); -/***/ }, +/***/ }), -/***/ "./src/wrapper/ExternalWrapper.tsx" +/***/ "./src/wrapper/ExternalWrapper.tsx": /*!*****************************************!*\ !*** ./src/wrapper/ExternalWrapper.tsx ***! \*****************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -4959,7 +5290,7 @@ function ExternalWrapper(_ref) { _useState2 = _slicedToArray(_useState, 2), inserted = _useState2[0], setInserted = _useState2[1]; - (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { + (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { // Give empty props for the inserted components. // The props will come from the parent so they can be updated. dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_3__.addComponentToLayout)({ @@ -4967,7 +5298,7 @@ function ExternalWrapper(_ref) { componentPath })); setInserted(true); - return () => { + return function () { if (temp) { dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_3__.removeComponent)({ componentPath @@ -4975,8 +5306,8 @@ function ExternalWrapper(_ref) { } }; }, []); - (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { - (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.batch)(() => { + (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { + (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.batch)(function () { dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_3__.updateProps)({ itempath: componentPath, props: component.props @@ -4999,20 +5330,20 @@ function ExternalWrapper(_ref) { } /* harmony default export */ __webpack_exports__["default"] = (ExternalWrapper); -/***/ }, +/***/ }), -/***/ "./src/wrapper/selectors.ts" +/***/ "./src/wrapper/selectors.ts": /*!**********************************!*\ !*** ./src/wrapper/selectors.ts ***! \**********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ selectConfig: () => (/* binding */ selectConfig), -/* harmony export */ selectDashProps: () => (/* binding */ selectDashProps), -/* harmony export */ selectDashPropsEqualityFn: () => (/* binding */ selectDashPropsEqualityFn) +/* harmony export */ selectConfig: function() { return /* binding */ selectConfig; }, +/* harmony export */ selectDashProps: function() { return /* binding */ selectDashProps; }, +/* harmony export */ selectDashPropsEqualityFn: function() { return /* binding */ selectDashPropsEqualityFn; } /* harmony export */ }); /* harmony import */ var _wrapping__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./wrapping */ "./src/wrapper/wrapping.ts"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pathOr.js"); @@ -5025,22 +5356,26 @@ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } var previousHashes = {}; -var isFirstLevelPropsChild = (updatedPath, strPath) => { +var isFirstLevelPropsChild = function isFirstLevelPropsChild(updatedPath, strPath) { var updatedSegments = updatedPath.split(','); var fullSegments = strPath.split(','); // Check that strPath actually starts with updatedPath - var startsWithPath = fullSegments.every((seg, i) => updatedSegments[i] === seg); + var startsWithPath = fullSegments.every(function (seg, i) { + return updatedSegments[i] === seg; + }); if (!startsWithPath) return [false, []]; // Get the remaining path after the prefix var remainingSegments = updatedSegments.slice(fullSegments.length); - var propsCount = remainingSegments.filter(s => s === 'props').length; + var propsCount = remainingSegments.filter(function (s) { + return s === 'props'; + }).length; return [propsCount < 2, remainingSegments]; }; function determineChangedProps(state, strPath) { var combinedHash = 0; var renderType; // Default render type, adjust as needed var changedProps = {}; - Object.entries(state.layoutHashes).forEach(_ref => { + Object.entries(state.layoutHashes).forEach(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), updatedPath = _ref2[0], pathHash = _ref2[1]; @@ -5071,27 +5406,29 @@ function determineChangedProps(state, strPath) { renderType }; } -var selectDashProps = componentPath => state => { - var c = (0,_wrapping__WEBPACK_IMPORTED_MODULE_0__.getComponentLayout)(componentPath, state); - // Layout hashes records the number of times a path has been updated. - // sum with the parents hash (match without the last ']') to get the real hash - // Then it can be easily compared without having to compare the props. - var strPath = (0,_wrapping__WEBPACK_IMPORTED_MODULE_0__.stringifyPath)(componentPath); - var hash; - if ((0,_wrapping__WEBPACK_IMPORTED_MODULE_0__.checkDashChildrenUpdate)(c)) { - hash = determineChangedProps(state, strPath); - } else { - hash = state.layoutHashes[strPath]; - } - var h = 0; - var changedProps = {}; - var renderType = ''; - if (hash) { - h = hash['hash']; - changedProps = hash['changedProps']; - renderType = hash['renderType']; - } - return [c, c === null || c === void 0 ? void 0 : c.props, h, changedProps, renderType]; +var selectDashProps = function selectDashProps(componentPath) { + return function (state) { + var c = (0,_wrapping__WEBPACK_IMPORTED_MODULE_0__.getComponentLayout)(componentPath, state); + // Layout hashes records the number of times a path has been updated. + // sum with the parents hash (match without the last ']') to get the real hash + // Then it can be easily compared without having to compare the props. + var strPath = (0,_wrapping__WEBPACK_IMPORTED_MODULE_0__.stringifyPath)(componentPath); + var hash; + if ((0,_wrapping__WEBPACK_IMPORTED_MODULE_0__.checkDashChildrenUpdate)(c)) { + hash = determineChangedProps(state, strPath); + } else { + hash = state.layoutHashes[strPath]; + } + var h = 0; + var changedProps = {}; + var renderType = ''; + if (hash) { + h = hash['hash']; + changedProps = hash['changedProps']; + renderType = hash['renderType']; + } + return [c, c === null || c === void 0 ? void 0 : c.props, h, changedProps, renderType]; + }; }; function selectDashPropsEqualityFn(_ref3, _ref4) { var _ref5 = _slicedToArray(_ref3, 3), @@ -5109,24 +5446,24 @@ function selectConfig(state) { return state.config; } -/***/ }, +/***/ }), -/***/ "./src/wrapper/wrapping.ts" +/***/ "./src/wrapper/wrapping.ts": /*!*********************************!*\ !*** ./src/wrapper/wrapping.ts ***! \*********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ checkDashChildrenUpdate: () => (/* binding */ checkDashChildrenUpdate), -/* harmony export */ checkRenderTypeProp: () => (/* binding */ checkRenderTypeProp), -/* harmony export */ createElement: () => (/* binding */ createElement), -/* harmony export */ getComponentLayout: () => (/* binding */ getComponentLayout), -/* harmony export */ isDryComponent: () => (/* binding */ isDryComponent), -/* harmony export */ stringifyPath: () => (/* binding */ stringifyPath), -/* harmony export */ validateComponent: () => (/* binding */ validateComponent) +/* harmony export */ checkDashChildrenUpdate: function() { return /* binding */ checkDashChildrenUpdate; }, +/* harmony export */ checkRenderTypeProp: function() { return /* binding */ checkRenderTypeProp; }, +/* harmony export */ createElement: function() { return /* binding */ createElement; }, +/* harmony export */ getComponentLayout: function() { return /* binding */ getComponentLayout; }, +/* harmony export */ isDryComponent: function() { return /* binding */ isDryComponent; }, +/* harmony export */ stringifyPath: function() { return /* binding */ stringifyPath; }, +/* harmony export */ validateComponent: function() { return /* binding */ validateComponent; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); @@ -5136,12 +5473,18 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pathOr.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/type.js"); +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function createElement(element, props, extraProps, children) { var allProps = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(props, extraProps); if (Array.isArray(children)) { - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(element, allProps, ...children); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement.apply((react__WEBPACK_IMPORTED_MODULE_0___default()), [element, allProps].concat(_toConsumableArray(children))); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(element, allProps, children); } @@ -5169,13 +5512,13 @@ function checkDashChildrenUpdate(componentDefinition) { return 'dashChildrenUpdate' in (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])({}, [componentDefinition === null || componentDefinition === void 0 ? void 0 : componentDefinition.namespace, componentDefinition === null || componentDefinition === void 0 ? void 0 : componentDefinition.type], window); } -/***/ }, +/***/ }), -/***/ "./src/APIController.react.js" +/***/ "./src/APIController.react.js": /*!************************************!*\ !*** ./src/APIController.react.js ***! \************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -5230,7 +5573,7 @@ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } * @param {*} props props * @returns {*} component */ -var UnconnectedContainer = props => { +var UnconnectedContainer = function UnconnectedContainer(props) { var appLifecycle = props.appLifecycle, config = props.config, dependenciesRequest = props.dependenciesRequest, @@ -5247,7 +5590,7 @@ var UnconnectedContainer = props => { } var renderedTree = (0,react__WEBPACK_IMPORTED_MODULE_3__.useRef)(false); (0,react__WEBPACK_IMPORTED_MODULE_3__.useEffect)(storeEffect.bind(null, props, events, setErrorLoading)); - (0,react__WEBPACK_IMPORTED_MODULE_3__.useEffect)(() => { + (0,react__WEBPACK_IMPORTED_MODULE_3__.useEffect)(function () { if (renderedTree.current) { _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() { return _regenerator().w(function (_context) { @@ -5265,7 +5608,7 @@ var UnconnectedContainer = props => { }))(); } }); - (0,react__WEBPACK_IMPORTED_MODULE_3__.useEffect)(() => { + (0,react__WEBPACK_IMPORTED_MODULE_3__.useEffect)(function () { if (config.serve_locally) { window._dashPlotlyJSURL = "".concat(config.requests_pathname_prefix, "_dash-component-suites/plotly/package_data/plotly.min.js"); } else { @@ -5299,11 +5642,13 @@ var UnconnectedContainer = props => { } } else if (appLifecycle === (0,_reducers_constants__WEBPACK_IMPORTED_MODULE_12__.getAppState)('HYDRATED')) { renderedTree.current = true; - content = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement((react__WEBPACK_IMPORTED_MODULE_3___default().Fragment), null, Array.isArray(layout.components) ? layout.components.map((c, i) => (0,_isSimpleComponent__WEBPACK_IMPORTED_MODULE_15__["default"])(c) ? c : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_wrapper_DashWrapper__WEBPACK_IMPORTED_MODULE_16__["default"], { - _dashprivate_error: error, - componentPath: ['components', i], - key: i - })) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_wrapper_DashWrapper__WEBPACK_IMPORTED_MODULE_16__["default"], { + content = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement((react__WEBPACK_IMPORTED_MODULE_3___default().Fragment), null, Array.isArray(layout.components) ? layout.components.map(function (c, i) { + return (0,_isSimpleComponent__WEBPACK_IMPORTED_MODULE_15__["default"])(c) ? c : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_wrapper_DashWrapper__WEBPACK_IMPORTED_MODULE_16__["default"], { + _dashprivate_error: error, + componentPath: ['components', i], + key: i + }); + }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement(_wrapper_DashWrapper__WEBPACK_IMPORTED_MODULE_16__["default"], { _dashprivate_error: error, componentPath: ['components'] })); @@ -5324,7 +5669,7 @@ function storeEffect(props, events, setErrorLoading) { layout = props.layout, layoutRequest = props.layoutRequest, config = props.config; - (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.batch)(() => { + (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.batch)(function () { if ((0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(layoutRequest)) { if (typeof hooks.layout_pre === 'function') { hooks.layout_pre(); @@ -5385,28 +5730,32 @@ UnconnectedContainer.propTypes = { }; var Container = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)( // map state to props -state => ({ - appLifecycle: state.appLifecycle, - dependenciesRequest: state.dependenciesRequest, - hooks: state.hooks, - layoutRequest: state.layoutRequest, - layout: state.layout, - graphs: state.graphs, - history: state.history, - error: state.error, - config: state.config -}), dispatch => ({ - dispatch -}))(UnconnectedContainer); +function (state) { + return { + appLifecycle: state.appLifecycle, + dependenciesRequest: state.dependenciesRequest, + hooks: state.hooks, + layoutRequest: state.layoutRequest, + layout: state.layout, + graphs: state.graphs, + history: state.history, + error: state.error, + config: state.config + }; +}, function (dispatch) { + return { + dispatch + }; +})(UnconnectedContainer); /* harmony default export */ __webpack_exports__["default"] = (Container); -/***/ }, +/***/ }), -/***/ "./src/AppContainer.react.js" +/***/ "./src/AppContainer.react.js": /*!***********************************!*\ !*** ./src/AppContainer.react.js ***! \***********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -5424,11 +5773,22 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/identity.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/memoizeWith.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/type.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } @@ -5439,9 +5799,11 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = -class UnconnectedAppContainer extends (react__WEBPACK_IMPORTED_MODULE_1___default().Component) { - constructor(props) { - super(props); +var UnconnectedAppContainer = /*#__PURE__*/function (_React$Component) { + function UnconnectedAppContainer(props) { + var _this; + _classCallCheck(this, UnconnectedAppContainer); + _this = _callSuper(this, UnconnectedAppContainer, [props]); if (props.hooks.layout_pre !== null || props.hooks.layout_post !== null || props.hooks.request_pre !== null || props.hooks.request_post !== null || props.hooks.callback_resolved !== null || props.hooks.request_refresh_jwt !== null) { var hooks = props.hooks; if (hooks.request_refresh_jwt) { @@ -5451,57 +5813,68 @@ class UnconnectedAppContainer extends (react__WEBPACK_IMPORTED_MODULE_1___defaul } props.dispatch((0,_actions_index__WEBPACK_IMPORTED_MODULE_8__.setHooks)(hooks)); } + return _this; } - UNSAFE_componentWillMount() { - var dispatch = this.props.dispatch; - var config = (0,_config__WEBPACK_IMPORTED_MODULE_7__["default"])(); + _inherits(UnconnectedAppContainer, _React$Component); + return _createClass(UnconnectedAppContainer, [{ + key: "UNSAFE_componentWillMount", + value: function UNSAFE_componentWillMount() { + var dispatch = this.props.dispatch; + var config = (0,_config__WEBPACK_IMPORTED_MODULE_7__["default"])(); - // preset common request params in the config - config.fetch = { - credentials: 'same-origin', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json' + // preset common request params in the config + config.fetch = { + credentials: 'same-origin', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json' + } + }; + dispatch((0,_actions_index__WEBPACK_IMPORTED_MODULE_8__.setConfig)(config)); + } + }, { + key: "render", + value: function render() { + var config = this.props.config; + if ((0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(config) === 'Null') { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { + className: "_dash-loading" + }, "Loading..."); } - }; - dispatch((0,_actions_index__WEBPACK_IMPORTED_MODULE_8__.setConfig)(config)); - } - render() { - var config = this.props.config; - if ((0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(config) === 'Null') { - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { - className: "_dash-loading" - }, "Loading..."); + var show_undo_redo = config.show_undo_redo; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement((react__WEBPACK_IMPORTED_MODULE_1___default().Fragment), null, show_undo_redo ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_core_Toolbar_react__WEBPACK_IMPORTED_MODULE_5__["default"], null) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_APIController_react__WEBPACK_IMPORTED_MODULE_3__["default"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_core_Loading_react__WEBPACK_IMPORTED_MODULE_4__["default"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_core_Reloader_react__WEBPACK_IMPORTED_MODULE_6__["default"], null)); } - var show_undo_redo = config.show_undo_redo; - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement((react__WEBPACK_IMPORTED_MODULE_1___default().Fragment), null, show_undo_redo ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_core_Toolbar_react__WEBPACK_IMPORTED_MODULE_5__["default"], null) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_APIController_react__WEBPACK_IMPORTED_MODULE_3__["default"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_core_Loading_react__WEBPACK_IMPORTED_MODULE_4__["default"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_components_core_Reloader_react__WEBPACK_IMPORTED_MODULE_6__["default"], null)); - } -} + }]); +}((react__WEBPACK_IMPORTED_MODULE_1___default().Component)); UnconnectedAppContainer.propTypes = { hooks: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), dispatch: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func), config: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object) }; -var AppContainer = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(state => ({ - history: state.history, - config: state.config -}), dispatch => ({ - dispatch -}))(UnconnectedAppContainer); +var AppContainer = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(function (state) { + return { + history: state.history, + config: state.config + }; +}, function (dispatch) { + return { + dispatch + }; +})(UnconnectedAppContainer); /* harmony default export */ __webpack_exports__["default"] = (AppContainer); -/***/ }, +/***/ }), -/***/ "./src/DashRenderer.js" +/***/ "./src/DashRenderer.js": /*!*****************************!*\ !*** ./src/DashRenderer.js ***! \*****************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DashRenderer: () => (/* binding */ DashRenderer) +/* harmony export */ DashRenderer: function() { return /* binding */ DashRenderer; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); @@ -5509,40 +5882,45 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _AppProvider_react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AppProvider.react */ "./src/AppProvider.react.tsx"); /* harmony import */ var _dashApi__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./dashApi */ "./src/dashApi.ts"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -class DashRenderer { - constructor(hooks) { - // render Dash Renderer upon initialising! - var container = document.getElementById('react-entry-point'); - if ((react_dom__WEBPACK_IMPORTED_MODULE_1___default().createRoot)) { - var root = react_dom__WEBPACK_IMPORTED_MODULE_1___default().createRoot(container); - root.render(/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AppProvider_react__WEBPACK_IMPORTED_MODULE_2__["default"], { - hooks: hooks - })); - } else { - react_dom__WEBPACK_IMPORTED_MODULE_1___default().render(/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AppProvider_react__WEBPACK_IMPORTED_MODULE_2__["default"], { - hooks: hooks - }), container); - } +var DashRenderer = /*#__PURE__*/_createClass(function DashRenderer(hooks) { + _classCallCheck(this, DashRenderer); + // render Dash Renderer upon initialising! + var container = document.getElementById('react-entry-point'); + if ((react_dom__WEBPACK_IMPORTED_MODULE_1___default().createRoot)) { + var root = react_dom__WEBPACK_IMPORTED_MODULE_1___default().createRoot(container); + root.render(/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AppProvider_react__WEBPACK_IMPORTED_MODULE_2__["default"], { + hooks: hooks + })); + } else { + react_dom__WEBPACK_IMPORTED_MODULE_1___default().render(/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AppProvider_react__WEBPACK_IMPORTED_MODULE_2__["default"], { + hooks: hooks + }), container); } -} +}); -/***/ }, +/***/ }), -/***/ "./src/actions/api.js" +/***/ "./src/actions/api.js": /*!****************************!*\ !*** ./src/actions/api.js ***! \****************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ apiThunk) +/* harmony export */ "default": function() { return /* binding */ apiThunk; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeDeepRight.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/once.js"); @@ -5680,7 +6058,7 @@ function apiThunk(endpoint, method, store, id, body) { _context.n = 12; break; } - return _context.a(2, res.json().then(json => { + return _context.a(2, res.json().then(function (json) { dispatch({ type: store, payload: { @@ -5721,19 +6099,19 @@ function apiThunk(endpoint, method, store, id, body) { }(); } -/***/ }, +/***/ }), -/***/ "./src/actions/constants.js" +/***/ "./src/actions/constants.js": /*!**********************************!*\ !*** ./src/actions/constants.js ***! \**********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ MAX_AUTH_RETRIES: () => (/* binding */ MAX_AUTH_RETRIES), -/* harmony export */ getAction: () => (/* binding */ getAction) +/* harmony export */ MAX_AUTH_RETRIES: function() { return /* binding */ MAX_AUTH_RETRIES; }, +/* harmony export */ getAction: function() { return /* binding */ getAction; } /* harmony export */ }); var actionList = { ON_PROP_CHANGE: 1, @@ -5750,7 +6128,7 @@ var actionList = { REMOVE_COMPONENT: 1, RESET_COMPONENT_STATE: 1 }; -var getAction = action => { +var getAction = function getAction(action) { if (actionList[action]) { return action; } @@ -5758,29 +6136,29 @@ var getAction = action => { }; var MAX_AUTH_RETRIES = 1; -/***/ }, +/***/ }), -/***/ "./src/actions/dependencies.js" +/***/ "./src/actions/dependencies.js": /*!*************************************!*\ !*** ./src/actions/dependencies.js ***! \*************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ addAllResolvedFromOutputs: () => (/* binding */ addAllResolvedFromOutputs), -/* harmony export */ computeGraphs: () => (/* binding */ computeGraphs), -/* harmony export */ getAnyVals: () => (/* binding */ getAnyVals), -/* harmony export */ getUnfilteredLayoutCallbacks: () => (/* binding */ getUnfilteredLayoutCallbacks), -/* harmony export */ getWatchedKeys: () => (/* binding */ getWatchedKeys), -/* harmony export */ idMatch: () => (/* binding */ idMatch), -/* harmony export */ isMultiOutputProp: () => (/* binding */ isMultiOutputProp), -/* harmony export */ isMultiValued: () => (/* binding */ isMultiValued), -/* harmony export */ parseIfWildcard: () => (/* binding */ parseIfWildcard), -/* harmony export */ splitIdAndProp: () => (/* binding */ splitIdAndProp), -/* harmony export */ stringifyId: () => (/* binding */ stringifyId), -/* harmony export */ validateCallbacksToLayout: () => (/* binding */ validateCallbacksToLayout) +/* harmony export */ addAllResolvedFromOutputs: function() { return /* binding */ addAllResolvedFromOutputs; }, +/* harmony export */ computeGraphs: function() { return /* binding */ computeGraphs; }, +/* harmony export */ getAnyVals: function() { return /* binding */ getAnyVals; }, +/* harmony export */ getUnfilteredLayoutCallbacks: function() { return /* binding */ getUnfilteredLayoutCallbacks; }, +/* harmony export */ getWatchedKeys: function() { return /* binding */ getWatchedKeys; }, +/* harmony export */ idMatch: function() { return /* binding */ idMatch; }, +/* harmony export */ isMultiOutputProp: function() { return /* binding */ isMultiOutputProp; }, +/* harmony export */ isMultiValued: function() { return /* binding */ isMultiValued; }, +/* harmony export */ parseIfWildcard: function() { return /* binding */ parseIfWildcard; }, +/* harmony export */ splitIdAndProp: function() { return /* binding */ splitIdAndProp; }, +/* harmony export */ stringifyId: function() { return /* binding */ stringifyId; }, +/* harmony export */ validateCallbacksToLayout: function() { return /* binding */ validateCallbacksToLayout; } /* harmony export */ }); /* harmony import */ var dependency_graph__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! dependency-graph */ "./node_modules/dependency-graph/lib/dep_graph.js"); /* harmony import */ var fast_isnumeric__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fast-isnumeric */ "./node_modules/fast-isnumeric/index.js"); @@ -5816,8 +6194,8 @@ __webpack_require__.r(__webpack_exports__); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } @@ -5825,6 +6203,7 @@ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } @@ -5839,7 +6218,9 @@ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length) * by `...`, e.g. * "..output-1.value...output-2.value...output-3.value...output-4.value.." */ -var isMultiOutputProp = idAndProp => idAndProp.startsWith('..'); +var isMultiOutputProp = function isMultiOutputProp(idAndProp) { + return idAndProp.startsWith('..'); +}; var ALL = { wild: 'ALL', multi: 1 @@ -5872,7 +6253,9 @@ var idInvalidChars = ['.', '{']; * If this ID is a wildcard, it is a stringified JSON object * the "{" character is disallowed from regular string IDs */ -var isWildcardId = idStr => idStr.startsWith('{'); +var isWildcardId = function isWildcardId(idStr) { + return idStr.startsWith('{'); +}; /* * Turn stringified wildcard IDs into objects. @@ -5880,7 +6263,9 @@ var isWildcardId = idStr => idStr.startsWith('{'); * as a string. */ function parseWildcardId(idStr) { - return (0,ramda__WEBPACK_IMPORTED_MODULE_17__["default"])(val => Array.isArray(val) && wildcards[val[0]] || val, JSON.parse(idStr)); + return (0,ramda__WEBPACK_IMPORTED_MODULE_17__["default"])(function (val) { + return Array.isArray(val) && wildcards[val[0]] || val; + }, JSON.parse(idStr)); } /* @@ -5914,11 +6299,15 @@ function parseIfWildcard(idStr) { * JSON.stringify - for the object form - but ensuring keys are sorted */ function stringifyId(id) { - if (typeof id !== 'object') { + if (_typeof(id) !== 'object') { return id; } - var stringifyVal = v => v && v.wild || JSON.stringify(v); - var parts = Object.keys(id).sort().map(k => JSON.stringify(k) + ':' + stringifyVal(id[k])); + var stringifyVal = function stringifyVal(v) { + return v && v.wild || JSON.stringify(v); + }; + var parts = Object.keys(id).sort().map(function (k) { + return JSON.stringify(k) + ':' + stringifyVal(id[k]); + }); return '{' + parts.join(',') + '}'; } @@ -5953,8 +6342,12 @@ function idValSort(a, b) { /* * Provide a value known to be before or after v, according to idValSort */ -var valBefore = v => fast_isnumeric__WEBPACK_IMPORTED_MODULE_1___default()(v) ? v - 1 : 0; -var valAfter = v => typeof v === 'string' ? v + 'z' : 'z'; +var valBefore = function valBefore(v) { + return fast_isnumeric__WEBPACK_IMPORTED_MODULE_1___default()(v) ? v - 1 : 0; +}; +var valAfter = function valAfter(v) { + return typeof v === 'string' ? v + 'z' : 'z'; +}; function addMap(depMap, id, prop, dependency) { var idMap = depMap[id] = depMap[id] || {}; var callbacks = idMap[prop] = idMap[prop] || []; @@ -5967,7 +6360,9 @@ function addPattern(patterns, idSpec, prop, dependency) { var keys = Object.keys(idSpec).sort(); var keyStr = keys.join(','); var values = (0,ramda__WEBPACK_IMPORTED_MODULE_21__["default"])(keys, idSpec); - var valuesKey = values.map(v => typeof v === 'object' && v !== null ? v.wild ? v.wild : JSON.stringify(v) : String(v)).join('|'); + var valuesKey = values.map(function (v) { + return _typeof(v) === 'object' && v !== null ? v.wild ? v.wild : JSON.stringify(v) : String(v); + }).join('|'); if (!patterns.has(keyStr)) { patterns.set(keyStr, new Map()); } @@ -6025,7 +6420,7 @@ function offloadPatterns(patternsMap, targetMap) { function validateDependencies(parsedDependencies, dispatchError) { var outStrs = {}; var outObjs = []; - parsedDependencies.forEach(dep => { + parsedDependencies.forEach(function (dep) { var inputs = dep.inputs, outputs = dep.outputs, state = dep.state; @@ -6038,7 +6433,7 @@ function validateDependencies(parsedDependencies, dispatchError) { dispatchError('A callback is missing Inputs', [head, 'there are no `Input` elements.', 'Without `Input` elements, it will never get called.', '', 'Subscribing to `Input` components will cause the', 'callback to be called whenever their values change.', '', 'If you want a callback without inputs that fires on initial load,', 'set prevent_initial_call=False.']); } var spec = [[outputs, 'Output'], [inputs, 'Input'], [state, 'State']]; - spec.forEach(_ref => { + spec.forEach(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), args = _ref2[0], cls = _ref2[1]; @@ -6051,7 +6446,7 @@ function validateDependencies(parsedDependencies, dispatchError) { if (!Array.isArray(args)) { dispatchError("Callback ".concat(cls, "(s) must be an Array"), [head, "For ".concat(cls, "(s) we found:"), JSON.stringify(args), 'but we expected an Array.']); } - args.forEach((idProp, i) => { + args.forEach(function (idProp, i) { validateArg(idProp, head, cls, i, dispatchError); }); }); @@ -6067,19 +6462,19 @@ function validateArg(_ref3, head, cls, i, dispatchError) { if (typeof property !== 'string' || !property) { dispatchError('Callback property error', [head, "".concat(cls, "[").concat(i, "].property = ").concat(JSON.stringify(property)), 'but we expected `property` to be a non-empty string.']); } - if (typeof id === 'object') { + if (_typeof(id) === 'object') { if ((0,ramda__WEBPACK_IMPORTED_MODULE_15__["default"])(id)) { dispatchError('Callback item missing ID', [head, "".concat(cls, "[").concat(i, "].id = {}"), 'Every item linked to a callback needs an ID']); } - (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])((v, k) => { + (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(function (v, k) { if (!k) { dispatchError('Callback wildcard ID error', [head, "".concat(cls, "[").concat(i, "].id has key \"").concat(k, "\""), 'Keys must be non-empty strings.']); } - if (typeof v === 'object' && v.wild) { + if (_typeof(v) === 'object' && v.wild) { if (allowedWildcards[cls][v.wild] !== v) { dispatchError('Callback wildcard ID error', [head, "".concat(cls, "[").concat(i, "].id[\"").concat(k, "\"] = ").concat(v.wild), "Allowed wildcards for ".concat(cls, "s are:"), (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(allowedWildcards[cls]).join(', ')]); } - } else if (!(0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])(typeof v, wildcardValTypes)) { + } else if (!(0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])(_typeof(v), wildcardValTypes)) { dispatchError('Callback wildcard ID error', [head, "".concat(cls, "[").concat(i, "].id[\"").concat(k, "\"] = ").concat(JSON.stringify(v)), 'Wildcard callback ID values must be either wildcards', 'or constants of one of these types:', wildcardValTypes.join(', ')]); } }, id); @@ -6087,7 +6482,9 @@ function validateArg(_ref3, head, cls, i, dispatchError) { if (!id) { dispatchError('Callback item missing ID', [head, "".concat(cls, "[").concat(i, "].id = \"").concat(id, "\""), 'Every item linked to a callback needs an ID']); } - var invalidChars = idInvalidChars.filter(c => (0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])(c, id)); + var invalidChars = idInvalidChars.filter(function (c) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_13__["default"])(c, id); + }); if (invalidChars.length) { dispatchError('Callback invalid ID string', [head, "".concat(cls, "[").concat(i, "].id = '").concat(id, "'"), "characters '".concat(invalidChars.join("', '"), "' are not allowed.")]); } @@ -6098,7 +6495,7 @@ function validateArg(_ref3, head, cls, i, dispatchError) { function findDuplicateOutputs(outputs, head, dispatchError, outStrs, outObjs) { var newOutputStrs = {}; var newOutputObjs = []; - outputs.forEach((_ref4, i) => { + outputs.forEach(function (_ref4, i) { var id = _ref4.id, property = _ref4.property; if (typeof id === 'string') { @@ -6129,20 +6526,20 @@ function findDuplicateOutputs(outputs, head, dispatchError, outStrs, outObjs) { } } }); - (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(newOutputStrs).forEach(k => { + (0,ramda__WEBPACK_IMPORTED_MODULE_16__["default"])(newOutputStrs).forEach(function (k) { outStrs[k] = 1; }); - newOutputObjs.forEach(idObj => { + newOutputObjs.forEach(function (idObj) { outObjs.push(idObj); }); } function checkInOutOverlap(out, inputs) { var outId = out.id, outProp = out.property; - return inputs.some(in_ => { + return inputs.some(function (in_) { var inId = in_.id, inProp = in_.property; - if (outProp !== inProp || typeof outId !== typeof inId) { + if (outProp !== inProp || _typeof(outId) !== _typeof(inId)) { return false; } if (typeof outId === 'string') { @@ -6158,7 +6555,7 @@ function checkInOutOverlap(out, inputs) { function findMismatchedWildcards(outputs, inputs, state, head, dispatchError) { var _findWildcardKeys = findWildcardKeys(outputs.length ? outputs[0].id : undefined), out0MatchKeys = _findWildcardKeys.matchKeys; - outputs.forEach((out, i) => { + outputs.forEach(function (out, i) { if (i && !(0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(findWildcardKeys(out.id).matchKeys, out0MatchKeys)) { dispatchError('Mismatched `MATCH` wildcards across `Output`s', [head, "Output ".concat(i, " (").concat((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_26__.combineIdAndProp)(out), ")"), 'does not have MATCH wildcards on the same keys as', "Output 0 (".concat((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_26__.combineIdAndProp)(outputs[0]), ")."), 'MATCH wildcards must be on the same keys for all Outputs.', 'ALL wildcards need not match, only MATCH.']); } @@ -6169,11 +6566,11 @@ function findMismatchedWildcards(outputs, inputs, state, head, dispatchError) { // MATCH values. ALLSMALLER still requires a MATCH reference, so that // case remains an error. See issue #2462. var outputsHaveMatch = out0MatchKeys.length > 0; - [[inputs, 'Input'], [state, 'State']].forEach(_ref5 => { + [[inputs, 'Input'], [state, 'State']].forEach(function (_ref5) { var _ref6 = _slicedToArray(_ref5, 2), args = _ref6[0], cls = _ref6[1]; - args.forEach((arg, i) => { + args.forEach(function (arg, i) { var _findWildcardKeys2 = findWildcardKeys(arg.id), matchKeys = _findWildcardKeys2.matchKeys, allsmallerKeys = _findWildcardKeys2.allsmallerKeys; @@ -6187,7 +6584,7 @@ function findMismatchedWildcards(outputs, inputs, state, head, dispatchError) { }); }); } -var matchWildKeys = _ref7 => { +var matchWildKeys = function matchWildKeys(_ref7) { var _ref8 = _slicedToArray(_ref7, 2), a = _ref8[0], b = _ref8[1]; @@ -6241,7 +6638,7 @@ function validateCallbacksToLayout(state_, dispatchError) { outputPatterns = graphs.outputPatterns, inputPatterns = graphs.inputPatterns; function tail(callbacks) { - return 'This ID was used in the callback(s) for Output(s):\n ' + callbacks.map(_ref0 => { + return 'This ID was used in the callback(s) for Output(s):\n ' + callbacks.map(function (_ref0) { var outputs = _ref0.outputs; return outputs.map(_dependencies_ts__WEBPACK_IMPORTED_MODULE_26__.combineIdAndProp).join(', '); }).join('\n '); @@ -6272,7 +6669,7 @@ function validateCallbacksToLayout(state_, dispatchError) { (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_26__.resolveDeps)()(paths)({ id, property - }).forEach(dep => { + }).forEach(function (dep) { var idResolved = dep.id, idPath = dep.path; validateProp(idResolved, idPath, property, cls, callbacks); @@ -6289,7 +6686,7 @@ function validateCallbacksToLayout(state_, dispatchError) { } callbackIdsCheckedForState[output] = 1; var cls = 'State'; - state.forEach(_ref1 => { + state.forEach(function (_ref1) { var id = _ref1.id, property = _ref1.property; if (typeof id === 'string') { @@ -6313,12 +6710,14 @@ function validateCallbacksToLayout(state_, dispatchError) { var _loop = function _loop(id) { var idProps = map[id]; var fcb = (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_23__["default"])(idProps)); - var optional = fcb.reduce((acc, cb) => { + var optional = fcb.reduce(function (acc, cb) { if (acc === false || cb.optional) { return acc; } - var deps = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(cb.outputs, cb.inputs, cb.states).filter(dep => dep.id === id); - return !deps.length || (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(_ref10 => { + var deps = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(cb.outputs, cb.inputs, cb.states).filter(function (dep) { + return dep.id === id; + }); + return !deps.length || (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (_ref10) { var allow_optional = _ref10.allow_optional; return allow_optional; }, deps); @@ -6353,7 +6752,7 @@ function validateCallbacksToLayout(state_, dispatchError) { for (var keyStr in patterns) { var keyPatterns = patterns[keyStr]; var _loop2 = function _loop2(property) { - keyPatterns[property].forEach(_ref11 => { + keyPatterns[property].forEach(function (_ref11) { var keys = _ref11.keys, values = _ref11.values, callbacks = _ref11.callbacks; @@ -6380,7 +6779,7 @@ function computeGraphs(dependencies, dispatchError, config) { var fixIds = (0,ramda__WEBPACK_IMPORTED_MODULE_17__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])({ id: parseIfWildcard })); - var parsedDependencies = (0,ramda__WEBPACK_IMPORTED_MODULE_17__["default"])(dep => { + var parsedDependencies = (0,ramda__WEBPACK_IMPORTED_MODULE_17__["default"])(function (dep) { var output = dep.output, no_output = dep.no_output; var out = (0,ramda__WEBPACK_IMPORTED_MODULE_9__["default"])({ @@ -6392,12 +6791,14 @@ function computeGraphs(dependencies, dispatchError, config) { out.outputs = []; out.noOutput = true; } else { - out.outputs = (0,ramda__WEBPACK_IMPORTED_MODULE_17__["default"])(outi => (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])('out', true, splitIdAndProp(outi)), isMultiOutputProp(output) ? parseMultipleOutputs(output) : [output]); + out.outputs = (0,ramda__WEBPACK_IMPORTED_MODULE_17__["default"])(function (outi) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])('out', true, splitIdAndProp(outi)); + }, isMultiOutputProp(output) ? parseMultipleOutputs(output) : [output]); } return out; }, dependencies); var hasError = false; - var wrappedDE = (message, lines) => { + var wrappedDE = function wrappedDE(message, lines) { hasError = true; dispatchError(message, lines); }; @@ -6448,11 +6849,13 @@ function computeGraphs(dependencies, dispatchError, config) { } // builds up wildcardPlaceholders with all the wildcard keys and values used in the callbacks, so we can generate the full list of ids that each callback depends on. - parsedDependencies.forEach(dependency => { + parsedDependencies.forEach(function (dependency) { var outputs = dependency.outputs, inputs = dependency.inputs; - outputs.concat(inputs).filter(item => typeof item.id === 'object').forEach(item => { - (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])((val, key) => { + outputs.concat(inputs).filter(function (item) { + return _typeof(item.id) === 'object'; + }).forEach(function (item) { + (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(function (val, key) { if (!wildcardPlaceholders[key]) { wildcardPlaceholders[key] = { exact: [], @@ -6472,7 +6875,7 @@ function computeGraphs(dependencies, dispatchError, config) { }); // Efficiently build wildcardPlaceholders.vals arrays - (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(keyPlaceholders => { + (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(function (keyPlaceholders) { var exact = keyPlaceholders.exact, expand = keyPlaceholders.expand; var vals = exact.slice().sort(idValSort); @@ -6493,7 +6896,7 @@ function computeGraphs(dependencies, dispatchError, config) { }, wildcardPlaceholders); function makeAllIds(idSpec, outIdFinal) { var idList = [{}]; - (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])((val, key) => { + (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(function (val, key) { var testVals = wildcardPlaceholders[key].vals; var outValIndex = testVals.indexOf(outIdFinal[key]); var newVals = [val]; @@ -6559,7 +6962,7 @@ function computeGraphs(dependencies, dispatchError, config) { cbOut[cbOut.length - 1].push(outIdProp); } } - parsedDependencies.forEach(dependency => { + parsedDependencies.forEach(function (dependency) { var outputs = dependency.outputs, inputs = dependency.inputs; @@ -6569,12 +6972,12 @@ function computeGraphs(dependencies, dispatchError, config) { function addOutputToMulti(outIdFinal, outIdProp) { if (!config.validate_callbacks) return; multiGraph.addNode(outIdProp); - inputs.forEach(inObj => { + inputs.forEach(function (inObj) { var inId = inObj.id, property = inObj.property; - if (typeof inId === 'object') { + if (_typeof(inId) === 'object') { var inIdList = makeAllIds(inId, outIdFinal); - inIdList.forEach(id => { + inIdList.forEach(function (id) { addInputToMulti((0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_26__.combineIdAndProp)({ id, property @@ -6593,13 +6996,15 @@ function computeGraphs(dependencies, dispatchError, config) { // the first output for calculations) for later convenience. var _findWildcardKeys3 = findWildcardKeys(outputs.length ? outputs[0].id : undefined), matchKeys = _findWildcardKeys3.matchKeys; - var firstSingleOutput = (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(o => !isMultiValued(o.id), outputs); + var firstSingleOutput = (0,ramda__WEBPACK_IMPORTED_MODULE_10__["default"])(function (o) { + return !isMultiValued(o.id); + }, outputs); var finalDependency = (0,ramda__WEBPACK_IMPORTED_MODULE_18__["default"])({ matchKeys, firstSingleOutput, outputs }, dependency); - outputs.forEach(outIdProp => { + outputs.forEach(function (outIdProp) { var outId = outIdProp.id, property = outIdProp.property; // check if this output is also an input to the same callback @@ -6607,10 +7012,10 @@ function computeGraphs(dependencies, dispatchError, config) { if (config.validate_callbacks) { alsoInput = checkInOutOverlap(outIdProp, inputs); } - if (typeof outId === 'object') { + if (_typeof(outId) === 'object') { if (config.validate_callbacks) { var outIdList = makeAllIds(outId, {}); - outIdList.forEach(id => { + outIdList.forEach(function (id) { var tempOutIdProp = { id, property @@ -6638,10 +7043,10 @@ function computeGraphs(dependencies, dispatchError, config) { addMap(outputMap, outId, property, finalDependency); } }); - inputs.forEach(inputObject => { + inputs.forEach(function (inputObject) { var inId = inputObject.id, inProp = inputObject.property; - if (typeof inId === 'object') { + if (_typeof(inId) === 'object') { addPattern(inputPatternMap, inId, inProp, finalDependency); } else { addMap(inputMap, inId, inProp, finalDependency); @@ -6652,17 +7057,21 @@ function computeGraphs(dependencies, dispatchError, config) { inputPatterns = offloadPatterns(inputPatternMap, inputPatterns); // second pass for adding new output nodes as dependencies where needed - duplicateOutputs.forEach(dupeOutIdProp => { + duplicateOutputs.forEach(function (dupeOutIdProp) { var originalName = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_26__.combineIdAndProp)(dupeOutIdProp); var newName = originalName.concat(outputTag); for (var cnt = 0; cnt < cbIn.length; cnt++) { // check if input to the callback - if (cbIn[cnt].some(inName => inName === originalName)) { + if (cbIn[cnt].some(function (inName) { + return inName === originalName; + })) { /* make sure it's not also an output of the callback * (this will be the original callback) */ - if (!cbOut[cnt].some(outName => outName === newName)) { - cbOut[cnt].forEach(outName => { + if (!cbOut[cnt].some(function (outName) { + return outName === newName; + })) { + cbOut[cnt].forEach(function (outName) { addInputToMulti(newName, outName, false); }); } @@ -6679,8 +7088,8 @@ function computeGraphs(dependencies, dispatchError, config) { function findWildcardKeys(id) { var matchKeys = []; var allsmallerKeys = []; - if (typeof id === 'object') { - (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])((val, key) => { + if (_typeof(id) === 'object') { + (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(function (val, key) { if (val === MATCH) { matchKeys.push(key); } else if (val === ALLSMALLER) { @@ -6754,7 +7163,9 @@ function getAnyVals(patternVals, vals) { */ function isMultiValued(_ref12) { var id = _ref12.id; - return typeof id === 'object' && (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(v => v.multi, (0,ramda__WEBPACK_IMPORTED_MODULE_23__["default"])(id)); + return _typeof(id) === 'object' && (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(function (v) { + return v.multi; + }, (0,ramda__WEBPACK_IMPORTED_MODULE_23__["default"])(id)); } /* @@ -6821,7 +7232,7 @@ function addResolvedFromOutputs(callback, outPattern, outs, matches) { var out0Keys = Object.keys(outPattern.id).sort(); var out0PatternVals = (0,ramda__WEBPACK_IMPORTED_MODULE_21__["default"])(out0Keys, outPattern.id); var foundCbIds = {}; - outs.forEach(_ref13 => { + outs.forEach(function (_ref13) { var outId = _ref13.id; var outVals = (0,ramda__WEBPACK_IMPORTED_MODULE_21__["default"])(out0Keys, outId); var resolved = (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_26__.makeResolvedCallback)(callback, (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_26__.resolveDeps)(out0Keys, outVals, out0PatternVals), getAnyVals(out0PatternVals, outVals)); @@ -6834,7 +7245,7 @@ function addResolvedFromOutputs(callback, outPattern, outs, matches) { } function addAllResolvedFromOutputs(resolve, paths, matches) { var triggerAnyVals = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; - return callback => { + return function (callback) { var matchKeys = callback.matchKeys, firstSingleOutput = callback.firstSingleOutput, outputs = callback.outputs; @@ -6849,8 +7260,8 @@ function addAllResolvedFromOutputs(resolve, paths, matches) { * That will give one result per callback invocation. */ var anySeen = {}; - outputs.forEach(outPattern => { - var outSet = resolve(paths)(outPattern).filter(i => { + outputs.forEach(function (outPattern) { + var outSet = resolve(paths)(outPattern).filter(function (i) { var matchStr = JSON.stringify((0,ramda__WEBPACK_IMPORTED_MODULE_21__["default"])(matchKeys, i.id)); if (!anySeen[matchStr]) { anySeen[matchStr] = 1; @@ -6890,7 +7301,9 @@ function getWatchedKeys(id, newProps, graphs) { } if (typeof id === 'string') { var inputs = graphs.inputMap[id]; - return inputs ? newProps.filter(newProp => inputs[newProp]) : []; + return inputs ? newProps.filter(function (newProp) { + return inputs[newProp]; + }) : []; } var keys = Object.keys(id).sort(); var vals = (0,ramda__WEBPACK_IMPORTED_MODULE_21__["default"])(keys, id); @@ -6899,9 +7312,11 @@ function getWatchedKeys(id, newProps, graphs) { if (!keyPatterns) { return []; } - return newProps.filter(prop => { + return newProps.filter(function (prop) { var patterns = keyPatterns[prop]; - return patterns && patterns.some(pattern => idMatch(keys, vals, pattern.values)); + return patterns && patterns.some(function (pattern) { + return idMatch(keys, vals, pattern.values); + }); }); } @@ -6947,22 +7362,26 @@ function getUnfilteredLayoutCallbacks(graphs, paths, layoutChunk, opts) { } } function addCallbackIfArray(idStr) { - return cb => cb.getInputs(paths).some(ini => { - if (Array.isArray(ini) && ini.some(inij => stringifyId(inij.id) === idStr)) { - // This callback should trigger even with no changedProps, - // since the props that changed no longer exist. - // We're kind of abusing the `initialCall` flag here, it's - // more like a "final call" for the removed inputs, but - // this case is not subject to `prevent_initial_call`. - if ((0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(cb.getOutputs(newPaths)).length) { - cb.initialCall = true; - cb.changedPropIds = {}; - addCallback(cb); + return function (cb) { + return cb.getInputs(paths).some(function (ini) { + if (Array.isArray(ini) && ini.some(function (inij) { + return stringifyId(inij.id) === idStr; + })) { + // This callback should trigger even with no changedProps, + // since the props that changed no longer exist. + // We're kind of abusing the `initialCall` flag here, it's + // more like a "final call" for the removed inputs, but + // this case is not subject to `prevent_initial_call`. + if ((0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(cb.getOutputs(newPaths)).length) { + cb.initialCall = true; + cb.changedPropIds = {}; + addCallback(cb); + } + return true; } - return true; - } - return false; - }); + return false; + }); + }; } function handleOneId(id, outIdCallbacks, inIdCallbacks) { if (outIdCallbacks) { @@ -6984,7 +7403,7 @@ function getUnfilteredLayoutCallbacks(graphs, paths, layoutChunk, opts) { var maybeAddCallback = removedArrayInputsOnly ? addCallbackIfArray(stringifyId(id)) : addCallback; var handleThisCallback = maybeAddCallback; if (chunkPath) { - handleThisCallback = cb => { + handleThisCallback = function handleThisCallback(cb) { if (!(0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_22__["default"])(chunkPath), (0,ramda__WEBPACK_IMPORTED_MODULE_20__["default"])('path', (0,ramda__WEBPACK_IMPORTED_MODULE_11__["default"])(cb.getOutputs(paths))))) { maybeAddCallback(cb); } @@ -6995,7 +7414,7 @@ function getUnfilteredLayoutCallbacks(graphs, paths, layoutChunk, opts) { } } } - (0,_utils__WEBPACK_IMPORTED_MODULE_28__.crawlLayout)(layoutChunk, child => { + (0,_utils__WEBPACK_IMPORTED_MODULE_28__.crawlLayout)(layoutChunk, function (child) { var id = (0,ramda__WEBPACK_IMPORTED_MODULE_19__["default"])(['props', 'id'], child); if (id) { if (typeof id === 'string' && !removedArrayInputsOnly) { @@ -7006,45 +7425,47 @@ function getUnfilteredLayoutCallbacks(graphs, paths, layoutChunk, opts) { } } }); - return (0,ramda__WEBPACK_IMPORTED_MODULE_17__["default"])(cb => _objectSpread(_objectSpread({}, cb), {}, { - priority: (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_26__.getPriority)(graphs, paths, cb) - }), callbacks); + return (0,ramda__WEBPACK_IMPORTED_MODULE_17__["default"])(function (cb) { + return _objectSpread(_objectSpread({}, cb), {}, { + priority: (0,_dependencies_ts__WEBPACK_IMPORTED_MODULE_26__.getPriority)(graphs, paths, cb) + }); + }, callbacks); } -/***/ }, +/***/ }), -/***/ "./src/actions/index.js" +/***/ "./src/actions/index.js": /*!******************************!*\ !*** ./src/actions/index.js ***! \******************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ addComponentToLayout: () => (/* binding */ addComponentToLayout), -/* harmony export */ addHttpHeaders: () => (/* binding */ addHttpHeaders), -/* harmony export */ dispatchError: () => (/* binding */ dispatchError), -/* harmony export */ getCSRFHeader: () => (/* binding */ getCSRFHeader), -/* harmony export */ handleAsyncError: () => (/* binding */ handleAsyncError), -/* harmony export */ hydrateInitialOutputs: () => (/* binding */ hydrateInitialOutputs), -/* harmony export */ insertComponent: () => (/* binding */ insertComponent), -/* harmony export */ notifyObservers: () => (/* binding */ notifyObservers), -/* harmony export */ onError: () => (/* binding */ onError), -/* harmony export */ onPropChange: () => (/* binding */ onPropChange), -/* harmony export */ redo: () => (/* binding */ redo), -/* harmony export */ removeComponent: () => (/* binding */ removeComponent), -/* harmony export */ resetComponentState: () => (/* binding */ resetComponentState), -/* harmony export */ revert: () => (/* binding */ revert), -/* harmony export */ setAppLifecycle: () => (/* binding */ setAppLifecycle), -/* harmony export */ setConfig: () => (/* binding */ setConfig), -/* harmony export */ setGraphs: () => (/* binding */ setGraphs), -/* harmony export */ setHooks: () => (/* binding */ setHooks), -/* harmony export */ setLayout: () => (/* binding */ setLayout), -/* harmony export */ setPaths: () => (/* binding */ setPaths), -/* harmony export */ setRequestQueue: () => (/* binding */ setRequestQueue), -/* harmony export */ undo: () => (/* binding */ undo), -/* harmony export */ updateProps: () => (/* binding */ updateProps) +/* harmony export */ addComponentToLayout: function() { return /* binding */ addComponentToLayout; }, +/* harmony export */ addHttpHeaders: function() { return /* binding */ addHttpHeaders; }, +/* harmony export */ dispatchError: function() { return /* binding */ dispatchError; }, +/* harmony export */ getCSRFHeader: function() { return /* binding */ getCSRFHeader; }, +/* harmony export */ handleAsyncError: function() { return /* binding */ handleAsyncError; }, +/* harmony export */ hydrateInitialOutputs: function() { return /* binding */ hydrateInitialOutputs; }, +/* harmony export */ insertComponent: function() { return /* binding */ insertComponent; }, +/* harmony export */ notifyObservers: function() { return /* binding */ notifyObservers; }, +/* harmony export */ onError: function() { return /* binding */ onError; }, +/* harmony export */ onPropChange: function() { return /* binding */ onPropChange; }, +/* harmony export */ redo: function() { return /* binding */ redo; }, +/* harmony export */ removeComponent: function() { return /* binding */ removeComponent; }, +/* harmony export */ resetComponentState: function() { return /* binding */ resetComponentState; }, +/* harmony export */ revert: function() { return /* binding */ revert; }, +/* harmony export */ setAppLifecycle: function() { return /* binding */ setAppLifecycle; }, +/* harmony export */ setConfig: function() { return /* binding */ setConfig; }, +/* harmony export */ setGraphs: function() { return /* binding */ setGraphs; }, +/* harmony export */ setHooks: function() { return /* binding */ setHooks; }, +/* harmony export */ setLayout: function() { return /* binding */ setLayout; }, +/* harmony export */ setPaths: function() { return /* binding */ setPaths; }, +/* harmony export */ setRequestQueue: function() { return /* binding */ setRequestQueue; }, +/* harmony export */ undo: function() { return /* binding */ undo; }, +/* harmony export */ updateProps: function() { return /* binding */ updateProps; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/once.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/path.js"); @@ -7061,6 +7482,12 @@ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } @@ -7085,25 +7512,31 @@ var removeComponent = (0,redux_actions__WEBPACK_IMPORTED_MODULE_2__["default"])( var onPropChange = (0,redux_actions__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_5__.getAction)('ON_PROP_CHANGE')); var resetComponentState = (0,redux_actions__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_constants__WEBPACK_IMPORTED_MODULE_5__.getAction)('RESET_COMPONENT_STATE')); function updateProps(payload) { - return (dispatch, getState) => { + return function (dispatch, getState) { var component = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(payload.itempath, getState().layout); (0,_persistence__WEBPACK_IMPORTED_MODULE_10__.recordUiEdit)(component, payload.props, dispatch); dispatch(onPropChange(payload)); }; } -var addComponentToLayout = payload => (dispatch, getState) => { - var _getState = getState(), - paths = _getState.paths; - dispatch(insertComponent(payload)); - dispatch(setPaths((0,_paths__WEBPACK_IMPORTED_MODULE_9__.computePaths)(payload.component, payload.componentPath, paths))); +var addComponentToLayout = function addComponentToLayout(payload) { + return function (dispatch, getState) { + var _getState = getState(), + paths = _getState.paths; + dispatch(insertComponent(payload)); + dispatch(setPaths((0,_paths__WEBPACK_IMPORTED_MODULE_9__.computePaths)(payload.component, payload.componentPath, paths))); + }; +}; +var dispatchError = function dispatchError(dispatch) { + return function (message, lines) { + return dispatch(onError({ + type: 'backEnd', + error: { + message, + html: lines.join('\n') + } + })); + }; }; -var dispatchError = dispatch => (message, lines) => dispatch(onError({ - type: 'backEnd', - error: { - message, - html: lines.join('\n') - } -})); function hydrateInitialOutputs() { return function (dispatch, getState) { (0,_dependencies__WEBPACK_IMPORTED_MODULE_7__.validateCallbacksToLayout)(getState(), dispatchError(dispatch)); @@ -7154,7 +7587,7 @@ function triggerDefaultState(dispatch, getState) { }); // Also include no-output and no-input callbacks that should fire on initial load - var specialCallbacks = (graphs.callbacks || []).reduce((acc, cb) => { + var specialCallbacks = (graphs.callbacks || []).reduce(function (acc, cb) { if (cb.prevent_initial_call) { return acc; } @@ -7171,20 +7604,24 @@ function triggerDefaultState(dispatch, getState) { acc.push(resolved); } else { var inputs = resolved.getInputs(paths); - if (inputs.some(inp => Array.isArray(inp) ? inp.length > 0 : inp)) { + if (inputs.some(function (inp) { + return Array.isArray(inp) ? inp.length > 0 : inp; + })) { acc.push(resolved); } } } else { // No-input: include if any output is in layout var outputs = resolved.getOutputs(paths); - if (outputs.some(out => Array.isArray(out) ? out.length > 0 : out)) { + if (outputs.some(function (out) { + return Array.isArray(out) ? out.length > 0 : out; + })) { acc.push(resolved); } } return acc; }, []); - dispatch((0,_callbacks__WEBPACK_IMPORTED_MODULE_3__.addRequestedCallbacks)([...layoutCallbacks, ...specialCallbacks])); + dispatch((0,_callbacks__WEBPACK_IMPORTED_MODULE_3__.addRequestedCallbacks)([].concat(_toConsumableArray(layoutCallbacks), _toConsumableArray(specialCallbacks)))); } var redo = moveHistory('REDO'); var undo = moveHistory('UNDO'); @@ -7235,7 +7672,7 @@ function notifyObservers(_ref2) { function handleAsyncError(err, message, dispatch) { // Handle html error responses if (err && typeof err.text === 'function') { - err.text().then(text => { + err.text().then(function (text) { var error = { message, html: text @@ -7257,13 +7694,13 @@ function handleAsyncError(err, message, dispatch) { } } -/***/ }, +/***/ }), -/***/ "./src/actions/isAppReady.js" +/***/ "./src/actions/isAppReady.js": /*!***********************************!*\ !*** ./src/actions/isAppReady.js ***! \***********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -7278,16 +7715,16 @@ __webpack_require__.r(__webpack_exports__); -/* harmony default export */ __webpack_exports__["default"] = ((layout, paths, targets) => { +/* harmony default export */ __webpack_exports__["default"] = (function (layout, paths, targets) { if (!targets.length) { return true; } var promises = []; var events = paths.events; - var rendered = new Promise(resolveRendered => { + var rendered = new Promise(function (resolveRendered) { events.once('rendered', resolveRendered); }); - targets.forEach(id => { + targets.forEach(function (id) { var pathOfId = (0,_paths__WEBPACK_IMPORTED_MODULE_3__.getPath)(paths, id); if (!pathOfId) { return; @@ -7299,25 +7736,27 @@ __webpack_require__.r(__webpack_exports__); var component = _registry__WEBPACK_IMPORTED_MODULE_2__["default"].resolve(target); var ready = (0,_plotly_dash_component_plugins__WEBPACK_IMPORTED_MODULE_1__.isReady)(component); if (ready && typeof ready.then === 'function') { - promises.push(Promise.race([ready, rendered.then(() => document.getElementById((0,_dependencies__WEBPACK_IMPORTED_MODULE_4__.stringifyId)(id)) && ready)])); + promises.push(Promise.race([ready, rendered.then(function () { + return document.getElementById((0,_dependencies__WEBPACK_IMPORTED_MODULE_4__.stringifyId)(id)) && ready; + })])); } }); return promises.length ? Promise.all(promises) : true; }); -/***/ }, +/***/ }), -/***/ "./src/actions/paths.js" +/***/ "./src/actions/paths.js": /*!******************************!*\ !*** ./src/actions/paths.js ***! \******************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ computePaths: () => (/* binding */ computePaths), -/* harmony export */ getPath: () => (/* binding */ getPath) +/* harmony export */ computePaths: function() { return /* binding */ computePaths; }, +/* harmony export */ getPath: function() { return /* binding */ getPath; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/concat.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/filter.js"); @@ -7329,6 +7768,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/propEq.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/props.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./utils */ "./src/actions/utils.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } @@ -7349,14 +7789,18 @@ function computePaths(subTree, startingPath, oldPaths, events) { }, oldStrs = _ref.strs, oldObjs = _ref.objs; - var diffHead = path => startingPath.some((v, i) => path[i] !== v); + var diffHead = function diffHead(path) { + return startingPath.some(function (v, i) { + return path[i] !== v; + }); + }; var spLen = startingPath.length; // if we're updating a subtree, clear out all of the existing items var strs = spLen ? (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(diffHead, oldStrs) : {}; var objs = {}; if (spLen) { - (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])((oldValPaths, oldKeys) => { - var newVals = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(_ref2 => { + (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(function (oldValPaths, oldKeys) { + var newVals = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(function (_ref2) { var path = _ref2.path; return diffHead(path); }, oldValPaths); @@ -7365,10 +7809,10 @@ function computePaths(subTree, startingPath, oldPaths, events) { } }, oldObjs); } - (0,_utils__WEBPACK_IMPORTED_MODULE_9__.crawlLayout)(subTree, (child, itempath) => { + (0,_utils__WEBPACK_IMPORTED_MODULE_9__.crawlLayout)(subTree, function (child, itempath) { var id = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(['props', 'id'], child); if (id) { - if (typeof id === 'object') { + if (_typeof(id) === 'object') { var keys = Object.keys(id).sort(); var values = (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(keys, id); var keyStr = keys.join(','); @@ -7399,7 +7843,7 @@ function computePaths(subTree, startingPath, oldPaths, events) { }; } function getPath(paths, id) { - if (typeof id === 'object') { + if (_typeof(id) === 'object') { var keys = Object.keys(id).sort(); var keyStr = keys.join(','); var keyPaths = paths.objs[keyStr]; @@ -7413,20 +7857,20 @@ function getPath(paths, id) { return paths.strs[id]; } -/***/ }, +/***/ }), -/***/ "./src/actions/utils.js" +/***/ "./src/actions/utils.js": /*!******************************!*\ !*** ./src/actions/utils.js ***! \******************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ EventEmitter: () => (/* binding */ EventEmitter), -/* harmony export */ crawlLayout: () => (/* binding */ _crawlLayout), -/* harmony export */ urlBase: () => (/* binding */ urlBase) +/* harmony export */ EventEmitter: function() { return /* binding */ EventEmitter; }, +/* harmony export */ crawlLayout: function() { return /* binding */ _crawlLayout; }, +/* harmony export */ urlBase: function() { return /* binding */ urlBase; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/append.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/concat.js"); @@ -7437,6 +7881,16 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/pathOr.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/slice.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/type.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } @@ -7466,16 +7920,22 @@ var _crawlLayout = function crawlLayout(object, func) { var extraPath = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : undefined; if (Array.isArray(object)) { // children array - object.forEach((child, i) => { + object.forEach(function (child, i) { if (extraPath) { - var objOf = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(p => (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])('{}', p), extraPath); + var objOf = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (p) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])('{}', p); + }, extraPath); if (objOf !== -1) { var front = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(0, objOf, extraPath); var back = (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(objOf, extraPath.length, extraPath); if (front.length) { _crawlLayout((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(front, child), func, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(currentPath, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])([i], front)), back); } else { - var backPath = back.map(p => p.replace('{}', '')).filter(e => e); + var backPath = back.map(function (p) { + return p.replace('{}', ''); + }).filter(function (e) { + return e; + }); var childObj, childPath = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])([i], backPath); if (backPath.length) { @@ -7503,9 +7963,13 @@ var _crawlLayout = function crawlLayout(object, func) { _crawlLayout(children, func, newPath); } var childrenProps = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])([], [object.namespace, object.type], window.__dashprivate_childrenProps); - childrenProps.forEach(childrenProp => { + childrenProps.forEach(function (childrenProp) { if (childrenProp.includes('[]')) { - var _childrenProp$split$m = childrenProp.split('[]').map(p => p.split('.').filter(e => e)), + var _childrenProp$split$m = childrenProp.split('[]').map(function (p) { + return p.split('.').filter(function (e) { + return e; + }); + }), _childrenProp$split$m2 = _slicedToArray(_childrenProp$split$m, 2), frontPath = _childrenProp$split$m2[0], backPath = _childrenProp$split$m2[1]; @@ -7531,21 +7995,21 @@ var _crawlLayout = function crawlLayout(object, func) { } } } - var _newPath = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(currentPath, ['props', ..._frontPath]); - var oValue = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(['props', ..._frontPath], object); + var _newPath = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(currentPath, ['props'].concat(_frontPath)); + var oValue = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(['props'].concat(_frontPath), object); if (oValue !== undefined) { for (var key in oValue) { var value = oValue[key]; if (_backPath.length) { - _crawlLayout((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(_backPath, value), func, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(_newPath, [key, ..._backPath])); + _crawlLayout((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(_backPath, value), func, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(_newPath, [key].concat(_backPath))); } else { - _crawlLayout(value, func, [..._newPath, key]); + _crawlLayout(value, func, [].concat(_toConsumableArray(_newPath), [key])); } } } } else { - var _newPath2 = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(currentPath, ['props', ...childrenProp.split('.')]); - _crawlLayout((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(['props', ...childrenProp.split('.')], object), func, _newPath2); + var _newPath2 = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(currentPath, ['props'].concat(_toConsumableArray(childrenProp.split('.')))); + _crawlLayout((0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(['props'].concat(_toConsumableArray(childrenProp.split('.'))), object), func, _newPath2); } } }); @@ -7555,60 +8019,77 @@ var _crawlLayout = function crawlLayout(object, func) { // There are packages for this but it's simple enough, I just // adapted it from https://gist.github.com/mudge/5830382 -class EventEmitter { - constructor() { +var EventEmitter = /*#__PURE__*/function () { + function EventEmitter() { + _classCallCheck(this, EventEmitter); this._ev = {}; } - on(event, listener) { - var events = this._ev[event] = this._ev[event] || []; - events.push(listener); - return () => this.removeListener(event, listener); - } - removeListener(event, listener) { - var events = this._ev[event]; - if (events) { - var idx = events.indexOf(listener); - if (idx > -1) { - events.splice(idx, 1); + return _createClass(EventEmitter, [{ + key: "on", + value: function on(event, listener) { + var _this = this; + var events = this._ev[event] = this._ev[event] || []; + events.push(listener); + return function () { + return _this.removeListener(event, listener); + }; + } + }, { + key: "removeListener", + value: function removeListener(event, listener) { + var events = this._ev[event]; + if (events) { + var idx = events.indexOf(listener); + if (idx > -1) { + events.splice(idx, 1); + } } } - } - emit(event) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; + }, { + key: "emit", + value: function emit(event) { + var _this2 = this; + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + var events = this._ev[event]; + if (events) { + events.forEach(function (listener) { + return listener.apply(_this2, args); + }); + } } - var events = this._ev[event]; - if (events) { - events.forEach(listener => listener.apply(this, args)); + }, { + key: "once", + value: function once(event, listener) { + var _this3 = this; + var remove = this.on(event, function () { + remove(); + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + listener.apply(_this3, args); + }); } - } - once(event, listener) { - var _this = this; - var remove = this.on(event, function () { - remove(); - for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - listener.apply(_this, args); - }); - } -} + }]); +}(); -/***/ }, +/***/ }), -/***/ "./src/checkPropTypes.js" +/***/ "./src/checkPropTypes.js": /*!*******************************!*\ !*** ./src/checkPropTypes.js ***! \*******************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ checkPropTypes) +/* harmony export */ "default": function() { return /* binding */ checkPropTypes; } /* harmony export */ }); /* harmony import */ var prop_types_lib_ReactPropTypesSecret__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types/lib/ReactPropTypesSecret */ "./node_modules/prop-types/lib/ReactPropTypesSecret.js"); /* harmony import */ var prop_types_lib_ReactPropTypesSecret__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types_lib_ReactPropTypesSecret__WEBPACK_IMPORTED_MODULE_0__); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } /* * Copied out of prop-types and modified - inspired by check-prop-types, but * simplified and tweaked to our needs: we don't need the NODE_ENV check, @@ -7640,7 +8121,7 @@ function checkPropTypes(typeSpecs, values, location, componentName) { // This is intentionally an invariant that gets caught. It's the same // behavior as without this statement except with a better message. if (typeof typeSpecs[typeSpecName] !== 'function') { - error = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'); + error = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + _typeof(typeSpecs[typeSpecName]) + '`.'); error.name = 'Invariant Violation'; } else { error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, (prop_types_lib_ReactPropTypesSecret__WEBPACK_IMPORTED_MODULE_0___default())); @@ -7649,7 +8130,7 @@ function checkPropTypes(typeSpecs, values, location, componentName) { error = ex; } if (error && !(error instanceof Error)) { - errors.push((componentName || 'React class') + ': type specification of ' + location + ' `' + typeSpecName + '` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).'); + errors.push((componentName || 'React class') + ': type specification of ' + location + ' `' + typeSpecName + '` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a ' + _typeof(error) + '. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).'); } if (error instanceof Error) { var stack = getStack && getStack() || ''; @@ -7660,13 +8141,13 @@ function checkPropTypes(typeSpecs, values, location, componentName) { return errors.join('\n\n'); } -/***/ }, +/***/ }), -/***/ "./src/components/core/Loading.react.js" +/***/ "./src/components/core/Loading.react.js": /*!**********************************************!*\ !*** ./src/components/core/Loading.react.js ***! \**********************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -7689,17 +8170,19 @@ function Loading(props) { Loading.propTypes = { isLoading: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired }; -/* harmony default export */ __webpack_exports__["default"] = ((0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(state => ({ - isLoading: state.isLoading -}))(Loading)); +/* harmony default export */ __webpack_exports__["default"] = ((0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(function (state) { + return { + isLoading: state.isLoading + }; +})(Loading)); -/***/ }, +/***/ }), -/***/ "./src/components/core/Reloader.react.js" +/***/ "./src/components/core/Reloader.react.js": /*!***********************************************!*\ !*** ./src/components/core/Reloader.react.js ***! \***********************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -7718,22 +8201,37 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__); /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); /* harmony import */ var _actions_api__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../actions/api */ "./src/actions/api.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } -class Reloader extends (react__WEBPACK_IMPORTED_MODULE_9___default().Component) { - constructor(props) { - super(props); +var Reloader = /*#__PURE__*/function (_React$Component) { + function Reloader(props) { + var _this; + _classCallCheck(this, Reloader); + _this = _callSuper(this, Reloader, [props]); if (props.config.hot_reload) { var _props$config$hot_rel = props.config.hot_reload, interval = _props$config$hot_rel.interval, max_retry = _props$config$hot_rel.max_retry; - this.state = { + _this.state = { interval, disabled: false, intervalId: null, @@ -7741,145 +8239,162 @@ class Reloader extends (react__WEBPACK_IMPORTED_MODULE_9___default().Component) max_retry }; } else { - this.state = { + _this.state = { disabled: true }; } - this._retry = 0; - this._head = document.querySelector('head'); - this.clearInterval = this.clearInterval.bind(this); - } - clearInterval() { - window.clearInterval(this.state.intervalId); - this.setState({ - intervalId: null - }); + _this._retry = 0; + _this._head = document.querySelector('head'); + _this.clearInterval = _this.clearInterval.bind(_this); + return _this; } - static getDerivedStateFromProps(props) { - /* - * Save the non-loading requests in the state in order to compare - * current hashes with previous hashes. - * Note that if there wasn't a "loading" state for the requests, - * then we could simply compare `props` with `prevProps` in - * `componentDidUpdate`. - */ - if (!(0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(props.reloadRequest) && props.reloadRequest.status !== 'loading') { - return { - reloadRequest: props.reloadRequest - }; + _inherits(Reloader, _React$Component); + return _createClass(Reloader, [{ + key: "clearInterval", + value: function clearInterval() { + window.clearInterval(this.state.intervalId); + this.setState({ + intervalId: null + }); } - return null; - } - componentDidUpdate(prevProps, prevState) { - var reloadRequest = this.state.reloadRequest; - var dispatch = this.props.dispatch; + }, { + key: "componentDidUpdate", + value: function componentDidUpdate(prevProps, prevState) { + var reloadRequest = this.state.reloadRequest; + var dispatch = this.props.dispatch; - // In the beginning, reloadRequest won't be defined - if (!reloadRequest) { - return; - } + // In the beginning, reloadRequest won't be defined + if (!reloadRequest) { + return; + } - /* - * When reloadRequest is first defined, prevState won't be defined - * for one render loop. - * The first reloadRequest defines the initial/baseline hash - - * it doesn't require a reload - */ - if (!(0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])('reloadRequest', prevState)) { - return; - } - if (reloadRequest.status === 200 && (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(['content', 'reloadHash'], reloadRequest) !== (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(['reloadRequest', 'content', 'reloadHash'], prevState)) { - // Check for CSS (!content.hard) or new package assets - if (reloadRequest.content.hard || !(0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(reloadRequest.content.packages.length, (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])([], ['reloadRequest', 'content', 'packages'], prevState).length) || !(0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(ramda__WEBPACK_IMPORTED_MODULE_5__["default"]), reloadRequest.content.packages), (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(ramda__WEBPACK_IMPORTED_MODULE_5__["default"]), (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])([], ['reloadRequest', 'content', 'packages'], prevState)))) { - // Look if it was a css file. - var was_css = false; - // eslint-disable-next-line prefer-const - var _iterator = _createForOfIteratorHelper(reloadRequest.content.files), - _step; - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var a = _step.value; - if (a.is_css) { - was_css = true; - var nodesToDisable = []; - - // Search for the old file by xpath. - var it = document.evaluate("//link[contains(@href, \"".concat(a.url, "\")]"), this._head); - var node = it.iterateNext(); - while (node) { - nodesToDisable.push(node); - node = it.iterateNext(); - } - (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(n => n.setAttribute('disabled', 'disabled'), nodesToDisable); - if (a.modified > 0) { - var link = document.createElement('link'); - link.href = "".concat(a.url, "?m=").concat(a.modified); - link.type = 'text/css'; - link.rel = 'stylesheet'; - this._head.appendChild(link); - // Else the file was deleted. + /* + * When reloadRequest is first defined, prevState won't be defined + * for one render loop. + * The first reloadRequest defines the initial/baseline hash - + * it doesn't require a reload + */ + if (!(0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])('reloadRequest', prevState)) { + return; + } + if (reloadRequest.status === 200 && (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(['content', 'reloadHash'], reloadRequest) !== (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(['reloadRequest', 'content', 'reloadHash'], prevState)) { + // Check for CSS (!content.hard) or new package assets + if (reloadRequest.content.hard || !(0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(reloadRequest.content.packages.length, (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])([], ['reloadRequest', 'content', 'packages'], prevState).length) || !(0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(ramda__WEBPACK_IMPORTED_MODULE_5__["default"]), reloadRequest.content.packages), (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(ramda__WEBPACK_IMPORTED_MODULE_5__["default"]), (0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])([], ['reloadRequest', 'content', 'packages'], prevState)))) { + // Look if it was a css file. + var was_css = false; + // eslint-disable-next-line prefer-const + var _iterator = _createForOfIteratorHelper(reloadRequest.content.files), + _step; + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var a = _step.value; + if (a.is_css) { + was_css = true; + var nodesToDisable = []; + + // Search for the old file by xpath. + var it = document.evaluate("//link[contains(@href, \"".concat(a.url, "\")]"), this._head); + var node = it.iterateNext(); + while (node) { + nodesToDisable.push(node); + node = it.iterateNext(); + } + (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (n) { + return n.setAttribute('disabled', 'disabled'); + }, nodesToDisable); + if (a.modified > 0) { + var link = document.createElement('link'); + link.href = "".concat(a.url, "?m=").concat(a.modified); + link.type = 'text/css'; + link.rel = 'stylesheet'; + this._head.appendChild(link); + // Else the file was deleted. + } + } else { + // If there's another kind of file here do a hard reload. + was_css = false; + break; } - } else { - // If there's another kind of file here do a hard reload. - was_css = false; - break; } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); + if (!was_css) { + // Assets file have changed + // or a component lib has been added/removed - + // Must do a hard reload + window.location.reload(); + } + } else { + // Backend code changed - can do a soft reload in place + dispatch({ + type: 'RELOAD' + }); } - if (!was_css) { - // Assets file have changed - // or a component lib has been added/removed - - // Must do a hard reload - window.location.reload(); + } else if (this.state.intervalId !== null && reloadRequest.status === 500) { + if (this._retry > this.state.max_retry) { + this.clearInterval(); + // Integrate with dev tools ui?! + window.alert("Hot reloading is disabled after failing ".concat(this._retry, " times. ") + 'Please check your application for errors, then refresh the page.'); } - } else { - // Backend code changed - can do a soft reload in place - dispatch({ - type: 'RELOAD' + this._retry++; + } + } + }, { + key: "componentDidMount", + value: function componentDidMount() { + var _this$props = this.props, + dispatch = _this$props.dispatch, + reloadRequest = _this$props.reloadRequest; + var _this$state = this.state, + disabled = _this$state.disabled, + interval = _this$state.interval; + if (!disabled && !this.state.intervalId) { + var intervalId = window.setInterval(function () { + // Prevent requests from piling up - reloading can take + // many seconds (10-30) and the interval is 3s by default + if (reloadRequest.status !== 'loading') { + dispatch((0,_actions_api__WEBPACK_IMPORTED_MODULE_12__["default"])('_reload-hash', 'GET', 'reloadRequest')); + } + }, interval); + this.setState({ + intervalId }); } - } else if (this.state.intervalId !== null && reloadRequest.status === 500) { - if (this._retry > this.state.max_retry) { + } + }, { + key: "componentWillUnmount", + value: function componentWillUnmount() { + if (!this.state.disabled && this.state.intervalId) { this.clearInterval(); - // Integrate with dev tools ui?! - window.alert("Hot reloading is disabled after failing ".concat(this._retry, " times. ") + 'Please check your application for errors, then refresh the page.'); - } - this._retry++; - } - } - componentDidMount() { - var _this$props = this.props, - dispatch = _this$props.dispatch, - reloadRequest = _this$props.reloadRequest; - var _this$state = this.state, - disabled = _this$state.disabled, - interval = _this$state.interval; - if (!disabled && !this.state.intervalId) { - var intervalId = window.setInterval(() => { - // Prevent requests from piling up - reloading can take - // many seconds (10-30) and the interval is 3s by default - if (reloadRequest.status !== 'loading') { - dispatch((0,_actions_api__WEBPACK_IMPORTED_MODULE_12__["default"])('_reload-hash', 'GET', 'reloadRequest')); - } - }, interval); - this.setState({ - intervalId - }); + } } - } - componentWillUnmount() { - if (!this.state.disabled && this.state.intervalId) { - this.clearInterval(); + }, { + key: "render", + value: function render() { + return null; } - } - render() { - return null; - } -} + }], [{ + key: "getDerivedStateFromProps", + value: function getDerivedStateFromProps(props) { + /* + * Save the non-loading requests in the state in order to compare + * current hashes with previous hashes. + * Note that if there wasn't a "loading" state for the requests, + * then we could simply compare `props` with `prevProps` in + * `componentDidUpdate`. + */ + if (!(0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(props.reloadRequest) && props.reloadRequest.status !== 'loading') { + return { + reloadRequest: props.reloadRequest + }; + } + return null; + } + }]); +}((react__WEBPACK_IMPORTED_MODULE_9___default().Component)); Reloader.defaultProps = {}; Reloader.propTypes = { id: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().string), @@ -7888,20 +8403,24 @@ Reloader.propTypes = { dispatch: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func), interval: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number) }; -/* harmony default export */ __webpack_exports__["default"] = ((0,react_redux__WEBPACK_IMPORTED_MODULE_11__.connect)(state => ({ - config: state.config, - reloadRequest: state.reloadRequest -}), dispatch => ({ - dispatch -}))(Reloader)); +/* harmony default export */ __webpack_exports__["default"] = ((0,react_redux__WEBPACK_IMPORTED_MODULE_11__.connect)(function (state) { + return { + config: state.config, + reloadRequest: state.reloadRequest + }; +}, function (dispatch) { + return { + dispatch + }; +})(Reloader)); -/***/ }, +/***/ }), -/***/ "./src/components/core/Toolbar.react.js" +/***/ "./src/components/core/Toolbar.react.js": /*!**********************************************!*\ !*** ./src/components/core/Toolbar.react.js ***! \**********************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -7923,7 +8442,9 @@ function UnconnectedToolbar(props) { var undoLink = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("span", { key: "undoLink", className: "_dash-undo-redo-link", - onClick: () => dispatch(_actions_index_js__WEBPACK_IMPORTED_MODULE_3__.undo) + onClick: function onClick() { + return dispatch(_actions_index_js__WEBPACK_IMPORTED_MODULE_3__.undo); + } }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "_dash-icon-undo" }, "\u21BA"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { @@ -7932,7 +8453,9 @@ function UnconnectedToolbar(props) { var redoLink = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("span", { key: "redoLink", className: "_dash-undo-redo-link", - onClick: () => dispatch(_actions_index_js__WEBPACK_IMPORTED_MODULE_3__.redo) + onClick: function onClick() { + return dispatch(_actions_index_js__WEBPACK_IMPORTED_MODULE_3__.redo); + } }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { className: "_dash-icon-redo" }, "\u21BB"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { @@ -7946,25 +8469,29 @@ UnconnectedToolbar.propTypes = { history: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), dispatch: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func) }; -var Toolbar = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(state => ({ - history: state.history -}), dispatch => ({ - dispatch -}))(UnconnectedToolbar); +var Toolbar = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(function (state) { + return { + history: state.history + }; +}, function (dispatch) { + return { + dispatch + }; +})(UnconnectedToolbar); /* harmony default export */ __webpack_exports__["default"] = (Toolbar); -/***/ }, +/***/ }), -/***/ "./src/components/error/CallbackGraph/CallbackGraphContainer.react.js" +/***/ "./src/components/error/CallbackGraph/CallbackGraphContainer.react.js": /*!****************************************************************************!*\ !*** ./src/components/error/CallbackGraph/CallbackGraphContainer.react.js ***! \****************************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ CallbackGraphContainer: () => (/* binding */ CallbackGraphContainer) +/* harmony export */ CallbackGraphContainer: function() { return /* binding */ CallbackGraphContainer; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); @@ -7989,6 +8516,16 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _CallbackGraphContainer_css__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./CallbackGraphContainer.css */ "./src/components/error/CallbackGraph/CallbackGraphContainer.css"); /* harmony import */ var _CallbackGraphContainerStylesheet__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./CallbackGraphContainerStylesheet */ "./src/components/error/CallbackGraph/CallbackGraphContainerStylesheet.js"); /* harmony import */ var _CallbackGraphEffects__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./CallbackGraphEffects */ "./src/components/error/CallbackGraph/CallbackGraphEffects.js"); +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } @@ -7998,8 +8535,9 @@ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } @@ -8028,7 +8566,7 @@ function generateElements(graphs, profile, extraLinks) { function recordNode(id, rawProperty) { var property = rawProperty.split('@')[0]; var idStr = (0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_14__.stringifyId)(id); - var idType = typeof id === 'object' ? 'wildcard' : 'component'; + var idType = _typeof(id) === 'object' ? 'wildcard' : 'component'; // dagre layout has problems with eg `width` property - so prepend an X var parentId = idStr; @@ -8067,7 +8605,7 @@ function generateElements(graphs, profile, extraLinks) { } }); } - (graphs.callbacks || []).reduce((visibleIndex, callback) => { + (graphs.callbacks || []).reduce(function (visibleIndex, callback) { if (callback.hidden) { return visibleIndex; } @@ -8087,19 +8625,19 @@ function generateElements(graphs, profile, extraLinks) { errorSet: Date.now() } }); - callback.outputs.forEach(_ref => { + callback.outputs.forEach(function (_ref) { var id = _ref.id, property = _ref.property; var nodeId = recordNode(id, property); recordEdge(cb, nodeId, 'output'); }); - callback.inputs.forEach(_ref2 => { + callback.inputs.forEach(function (_ref2) { var id = _ref2.id, property = _ref2.property; var nodeId = recordNode(id, property); recordEdge(nodeId, cb, 'input'); }); - callback.state.forEach(_ref3 => { + callback.state.forEach(function (_ref3) { var id = _ref3.id, property = _ref3.property; var nodeId = recordNode(id, property); @@ -8110,9 +8648,9 @@ function generateElements(graphs, profile, extraLinks) { // pull together props in the same component if (extraLinks) { - (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(structure).forEach(childIds => { - childIds.forEach(childFrom => { - childIds.forEach(childTo => { + (0,ramda__WEBPACK_IMPORTED_MODULE_12__["default"])(structure).forEach(function (childIds) { + childIds.forEach(function (childFrom) { + childIds.forEach(function (childTo) { if (childFrom !== childTo) { recordEdge(childFrom, childTo, 'hidden'); } @@ -8138,7 +8676,7 @@ function flattenOutputs(res) { return outputs; } function flattenInputs(inArray, final) { - (inArray || []).forEach(inItem => { + (inArray || []).forEach(function (inItem) { if (Array.isArray(inItem)) { flattenInputs(inItem, final); } else { @@ -8151,7 +8689,11 @@ function flattenInputs(inArray, final) { return final; } function cleanOutputId(outputId) { - return outputId.replace(/(^\.\.|\.\.$)/g, '').split('...').reduce((agg, next) => agg.concat(next.replace(/(.*\..*)(@.+)$/, (a, b) => b + ' (Duplicate)')), []).join('...'); + return outputId.replace(/(^\.\.|\.\.$)/g, '').split('...').reduce(function (agg, next) { + return agg.concat(next.replace(/(.*\..*)(@.+)$/, function (a, b) { + return b + ' (Duplicate)'; + })); + }, []).join('...'); } // len('__dash_callback__.') @@ -8180,12 +8722,24 @@ var layouts = { }; function CallbackGraph() { // Grab items from the redux store. - var paths = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(state => state.paths); - var layout = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(state => state.layout); - var graphs = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(state => state.graphs); - var profile = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(state => state.profile); - var changed = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(state => state.changed); - var lifecycleState = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(state => state.appLifecycle); + var paths = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(function (state) { + return state.paths; + }); + var layout = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(function (state) { + return state.layout; + }); + var graphs = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(function (state) { + return state.graphs; + }); + var profile = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(function (state) { + return state.profile; + }); + var changed = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(function (state) { + return state.changed; + }); + var lifecycleState = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(function (state) { + return state.appLifecycle; + }); // Keep track of cytoscape reference and user selected items. var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), @@ -8205,11 +8759,15 @@ function CallbackGraph() { setLayoutType = _useState6[1]; // Generate and memoize the elements. - var elements = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => generateElements(graphs, profile, layoutType === 'force'), [graphs, layoutType]); + var elements = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () { + return generateElements(graphs, profile, layoutType === 'force'); + }, [graphs, layoutType]); // Custom hook to make sure cytoscape is loaded. - var useCytoscapeEffect = (effect, condition) => { - (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => cytoscape && effect(cytoscape) || undefined, condition); + var useCytoscapeEffect = function useCytoscapeEffect(effect, condition) { + (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { + return cytoscape && effect(cytoscape) || undefined; + }, condition); }; function getComponent(id) { // for now ignore pattern-matching IDs @@ -8230,7 +8788,7 @@ function CallbackGraph() { var _layoutSelector$curre; var cy = _ref4.cy; var positions = {}; - cy.nodes().each(n => { + cy.nodes().each(function (n) { positions[n.id()] = n.position(); }); @@ -8251,9 +8809,11 @@ function CallbackGraph() { } // Adds callbacks once cyctoscape is initialized. - useCytoscapeEffect(cy => { - cytoscape.on('tap', 'node', e => setSelected(e.target)); - cytoscape.on('tap', e => { + useCytoscapeEffect(function (cy) { + cytoscape.on('tap', 'node', function (e) { + return setSelected(e.target); + }); + cytoscape.on('tap', function (e) { if (e.target === cy) { setSelected(null); } @@ -8264,15 +8824,23 @@ function CallbackGraph() { }, [cytoscape]); // Set node classes on selected. - useCytoscapeEffect(cy => selected && (0,_CallbackGraphEffects__WEBPACK_IMPORTED_MODULE_18__.updateSelectedNode)(cy, selected.data().id), [selected]); + useCytoscapeEffect(function (cy) { + return selected && (0,_CallbackGraphEffects__WEBPACK_IMPORTED_MODULE_18__.updateSelectedNode)(cy, selected.data().id); + }, [selected]); // Flash classes when props change. Uses changed as a trigger. Also // flash all input edges originating from this node and highlight // the subtree that contains the selected node. - useCytoscapeEffect(cy => changed && (0,_CallbackGraphEffects__WEBPACK_IMPORTED_MODULE_18__.updateChangedProps)(cy, changed.id, changed.props), [changed]); + useCytoscapeEffect(function (cy) { + return changed && (0,_CallbackGraphEffects__WEBPACK_IMPORTED_MODULE_18__.updateChangedProps)(cy, changed.id, changed.props); + }, [changed]); // Update callbacks from profiling information. - useCytoscapeEffect(cy => profile.updated.forEach(cb => (0,_CallbackGraphEffects__WEBPACK_IMPORTED_MODULE_18__.updateCallback)(cy, cb, profile.callbacks[cb])), [profile.updated]); + useCytoscapeEffect(function (cy) { + return profile.updated.forEach(function (cb) { + return (0,_CallbackGraphEffects__WEBPACK_IMPORTED_MODULE_18__.updateCallback)(cy, cb, profile.callbacks[cb]); + }); + }, [profile.updated]); if (lifecycleState !== 'HYDRATED') { // If we get here too early - most likely during hot reloading - then // we need to bail out and wait for the full state to be available @@ -8325,7 +8893,9 @@ function CallbackGraph() { result = cbProfile.result, inputs = cbProfile.inputs, state = cbProfile.state; - var avg = v => Math.round(v / (count || 1)); + var avg = function avg(v) { + return Math.round(v / (count || 1)); + }; elementInfo['call count'] = count; elementInfo.status = reduceStatus(status); var timing = elementInfo['time (avg milliseconds)'] = { @@ -8370,64 +8940,87 @@ function CallbackGraph() { }, hasPatterns ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "Info isn't supported for pattern-matching IDs at this time") : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_json_tree__WEBPACK_IMPORTED_MODULE_7__.JSONTree, { data: elementInfo, theme: "summerfruit", - labelRenderer: _keys => _keys.length === 1 ? elementName : _keys[0], - getItemString: (type, data, itemType) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, itemType), - shouldExpandNode: (keyName, data, level) => level < 1 + labelRenderer: function labelRenderer(_keys) { + return _keys.length === 1 ? elementName : _keys[0]; + }, + getItemString: function getItemString(type, data, itemType) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, itemType); + }, + shouldExpandNode: function shouldExpandNode(keyName, data, level) { + return level < 1; + } })) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("select", { className: "dash-callback-dag--layoutSelector", - onChange: e => setLayoutType(e.target.value), + onChange: function onChange(e) { + return setLayoutType(e.target.value); + }, value: layoutType, ref: layoutSelector - }, (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(layouts).map(k => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("option", { - value: k, - key: k - }, k)))); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_8__["default"])(layouts).map(function (k) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("option", { + value: k, + key: k + }, k); + }))); } CallbackGraph.propTypes = {}; -class UnconnectedCallbackGraphContainer extends react__WEBPACK_IMPORTED_MODULE_0__.Component { - constructor(props) { - super(props); - this.state = { +var UnconnectedCallbackGraphContainer = /*#__PURE__*/function (_Component) { + function UnconnectedCallbackGraphContainer(props) { + var _this; + _classCallCheck(this, UnconnectedCallbackGraphContainer); + _this = _callSuper(this, UnconnectedCallbackGraphContainer, [props]); + _this.state = { hasError: false }; + return _this; } - static getDerivedStateFromError(_) { - return { - hasError: true - }; - } - componentDidCatch(error, info) { - var dispatch = this.props.dispatch; - dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_15__.onError)({ - myID: this.state.myID, - type: 'frontEnd', - error, - info - })); - } - render() { - return this.state.hasError ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-callback-dag--container" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-callback-dag--message" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "Oops! The callback graph threw an error."), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "Check the error list for details."))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(CallbackGraph, null); - } -} + _inherits(UnconnectedCallbackGraphContainer, _Component); + return _createClass(UnconnectedCallbackGraphContainer, [{ + key: "componentDidCatch", + value: function componentDidCatch(error, info) { + var dispatch = this.props.dispatch; + dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_15__.onError)({ + myID: this.state.myID, + type: 'frontEnd', + error, + info + })); + } + }, { + key: "render", + value: function render() { + return this.state.hasError ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-callback-dag--container" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-callback-dag--message" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "Oops! The callback graph threw an error."), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, "Check the error list for details."))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(CallbackGraph, null); + } + }], [{ + key: "getDerivedStateFromError", + value: function getDerivedStateFromError(_) { + return { + hasError: true + }; + } + }]); +}(react__WEBPACK_IMPORTED_MODULE_0__.Component); UnconnectedCallbackGraphContainer.propTypes = { dispatch: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func) }; -var CallbackGraphContainer = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.connect)(null, dispatch => ({ - dispatch -}))(UnconnectedCallbackGraphContainer); +var CallbackGraphContainer = (0,react_redux__WEBPACK_IMPORTED_MODULE_2__.connect)(null, function (dispatch) { + return { + dispatch + }; +})(UnconnectedCallbackGraphContainer); -/***/ }, +/***/ }), -/***/ "./src/components/error/CallbackGraph/CallbackGraphContainerStylesheet.js" +/***/ "./src/components/error/CallbackGraph/CallbackGraphContainerStylesheet.js": /*!********************************************************************************!*\ !*** ./src/components/error/CallbackGraph/CallbackGraphContainerStylesheet.js ***! \********************************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -8489,7 +9082,9 @@ var stylesheet = [{ width: 35, height: 25, shape: 'round-rectangle', - label: e => "".concat(e.data().count, "\n").concat(e.data().time, " ms"), + label: function label(e) { + return "".concat(e.data().count, "\n").concat(e.data().time, " ms"); + }, 'text-wrap': 'wrap', 'text-justification': 'center' } @@ -8511,7 +9106,9 @@ var stylesheet = [{ width: 'label', // height: 'label', shape: 'rectangle', - content: e => e.data().label.replace(/"/g, ''), + content: function content(e) { + return e.data().label.replace(/"/g, ''); + }, 'text-valign': 'top', 'background-color': '#B9C2CE' } @@ -8560,20 +9157,20 @@ var stylesheet = [{ }]; /* harmony default export */ __webpack_exports__["default"] = (stylesheet); -/***/ }, +/***/ }), -/***/ "./src/components/error/CallbackGraph/CallbackGraphEffects.js" +/***/ "./src/components/error/CallbackGraph/CallbackGraphEffects.js": /*!********************************************************************!*\ !*** ./src/components/error/CallbackGraph/CallbackGraphEffects.js ***! \********************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ updateCallback: () => (/* binding */ updateCallback), -/* harmony export */ updateChangedProps: () => (/* binding */ updateChangedProps), -/* harmony export */ updateSelectedNode: () => (/* binding */ updateSelectedNode) +/* harmony export */ updateCallback: function() { return /* binding */ updateCallback; }, +/* harmony export */ updateChangedProps: function() { return /* binding */ updateChangedProps; }, +/* harmony export */ updateSelectedNode: function() { return /* binding */ updateSelectedNode; } /* harmony export */ }); /* harmony import */ var _constants_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../constants/constants */ "./src/constants/constants.js"); @@ -8619,7 +9216,9 @@ function updateSelectedNode(cy, id) { if (node.data().type === 'property') { collection.merge(node.ancestors()); } - parents.forEach(node => ascend(node, collection, visited)); + parents.forEach(function (node) { + return ascend(node, collection, visited); + }); } function descend(node, collection) { var visited = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Set(); @@ -8635,7 +9234,9 @@ function updateSelectedNode(cy, id) { if (node.data().type === 'property') { collection.merge(node.ancestors()); } - children.forEach(node => descend(node, collection, visited)); + children.forEach(function (node) { + return descend(node, collection, visited); + }); } if (id) { var node = cy.getElementById(id); @@ -8654,7 +9255,7 @@ function updateSelectedNode(cy, id) { descend(node, subtree); var other = subtree.absoluteComplement(); other.addClass('inactive'); - return () => { + return function () { node.removeClass('selected-node'); other.removeClass('inactive'); }; @@ -8675,7 +9276,7 @@ function updateSelectedNode(cy, id) { */ function updateChangedProps(cy, id, props) { var flashTime = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 500; - Object.keys(props).forEach(prop => { + Object.keys(props).forEach(function (prop) { var node = cy.getElementById("".concat(id, ".").concat(prop)); node.flashClass('prop-changed', flashTime); node.edgesTo('*').filter('[type = "input"]').flashClass('triggered', flashTime); @@ -8715,14 +9316,18 @@ function updateCallback(cy, id, profile) { node.addClass('callback-loading'); } else if (node.hasClass('callback-loading')) { var timeLeft = node.data('loadingSet') + flashTime - Date.now(); - setTimeout(() => node.removeClass('callback-loading'), Math.max(timeLeft, 0)); + setTimeout(function () { + return node.removeClass('callback-loading'); + }, Math.max(timeLeft, 0)); } if (latest !== 'loading' && latest !== _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUSMAP[_constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.OK] && latest !== _constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUSMAP[_constants_constants__WEBPACK_IMPORTED_MODULE_0__.STATUS.PREVENT_UPDATE]) { node.data('errorSet', Date.now()); node.addClass('callback-error'); } else if (node.hasClass('callback-error')) { var _timeLeft = node.data('errorSet') + flashTime - Date.now(); - setTimeout(() => node.removeClass('callback-error'), Math.max(_timeLeft, 0)); + setTimeout(function () { + return node.removeClass('callback-error'); + }, Math.max(_timeLeft, 0)); } // FIXME: This will flash branches that return no_update!! @@ -8732,13 +9337,13 @@ function updateCallback(cy, id, profile) { } } -/***/ }, +/***/ }), -/***/ "./src/components/error/ComponentErrorBoundary.react.js" +/***/ "./src/components/error/ComponentErrorBoundary.react.js": /*!**************************************************************!*\ !*** ./src/components/error/ComponentErrorBoundary.react.js ***! \**************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -8747,49 +9352,75 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "prop-types"); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../actions */ "./src/actions/index.js"); - - - -class ComponentErrorBoundary extends react__WEBPACK_IMPORTED_MODULE_0__.Component { - constructor(props) { - super(props); - this.state = { +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + + +var ComponentErrorBoundary = /*#__PURE__*/function (_Component) { + function ComponentErrorBoundary(props) { + var _this; + _classCallCheck(this, ComponentErrorBoundary); + _this = _callSuper(this, ComponentErrorBoundary, [props]); + _this.state = { myID: props.componentId, oldChildren: null, hasError: false }; + return _this; } - static getDerivedStateFromError(_) { - return { - hasError: true - }; - } - componentDidCatch(error, info) { - var dispatch = this.props.dispatch; - dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_2__.onError)({ - myID: this.state.myID, - type: 'frontEnd', - error, - info - })); - dispatch(_actions__WEBPACK_IMPORTED_MODULE_2__.revert); - } - componentDidUpdate(prevProps, prevState) { - var prevChildren = prevProps.children; - if (!this.state.hasError && prevChildren !== prevState.oldChildren && prevChildren !== this.props.children) { - /* eslint-disable-next-line react/no-did-update-set-state */ - this.setState({ - oldChildren: prevChildren - }); + _inherits(ComponentErrorBoundary, _Component); + return _createClass(ComponentErrorBoundary, [{ + key: "componentDidCatch", + value: function componentDidCatch(error, info) { + var dispatch = this.props.dispatch; + dispatch((0,_actions__WEBPACK_IMPORTED_MODULE_2__.onError)({ + myID: this.state.myID, + type: 'frontEnd', + error, + info + })); + dispatch(_actions__WEBPACK_IMPORTED_MODULE_2__.revert); } - } - render() { - var _this$state = this.state, - hasError = _this$state.hasError, - oldChildren = _this$state.oldChildren; - return hasError ? oldChildren : this.props.children; - } -} + }, { + key: "componentDidUpdate", + value: function componentDidUpdate(prevProps, prevState) { + var prevChildren = prevProps.children; + if (!this.state.hasError && prevChildren !== prevState.oldChildren && prevChildren !== this.props.children) { + /* eslint-disable-next-line react/no-did-update-set-state */ + this.setState({ + oldChildren: prevChildren + }); + } + } + }, { + key: "render", + value: function render() { + var _this$state = this.state, + hasError = _this$state.hasError, + oldChildren = _this$state.oldChildren; + return hasError ? oldChildren : this.props.children; + } + }], [{ + key: "getDerivedStateFromError", + value: function getDerivedStateFromError(_) { + return { + hasError: true + }; + } + }]); +}(react__WEBPACK_IMPORTED_MODULE_0__.Component); ComponentErrorBoundary.propTypes = { children: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().object), componentId: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string), @@ -8798,18 +9429,18 @@ ComponentErrorBoundary.propTypes = { }; /* harmony default export */ __webpack_exports__["default"] = (ComponentErrorBoundary); -/***/ }, +/***/ }), -/***/ "./src/components/error/FrontEnd/FrontEndError.react.js" +/***/ "./src/components/error/FrontEnd/FrontEndError.react.js": /*!**************************************************************!*\ !*** ./src/components/error/FrontEnd/FrontEndError.react.js ***! \**************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ FrontEndError: () => (/* binding */ FrontEndError) +/* harmony export */ FrontEndError: function() { return /* binding */ FrontEndError; } /* harmony export */ }); /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/es/index.js"); /* harmony import */ var _FrontEndError_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FrontEndError.css */ "./src/components/error/FrontEnd/FrontEndError.css"); @@ -8821,12 +9452,25 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _Percy_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Percy.css */ "./src/components/error/Percy.css"); /* harmony import */ var _actions_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../actions/utils */ "./src/actions/utils.js"); /* harmony import */ var _werkzeugcss__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../werkzeugcss */ "./src/components/error/werkzeugcss.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } @@ -8835,49 +9479,61 @@ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } -class FrontEndError extends react__WEBPACK_IMPORTED_MODULE_2__.Component { - constructor(props) { - super(props); - this.state = { - collapsed: this.props.isListItem +var FrontEndError = /*#__PURE__*/function (_Component) { + function FrontEndError(props) { + var _this; + _classCallCheck(this, FrontEndError); + _this = _callSuper(this, FrontEndError, [props]); + _this.state = { + collapsed: _this.props.isListItem }; + return _this; } - render() { - var _this$props = this.props, - e = _this$props.e, - inAlertsTray = _this$props.inAlertsTray; - var collapsed = this.state.collapsed; - var cardClasses = 'dash-error-card__content' + (inAlertsTray ? ' dash-error-card--alerts-tray' : ''); - - /* eslint-disable no-inline-comments */ - var errorHeader = /*#__PURE__*/React.createElement("div", { - className: "dash-fe-error-item test-devtools-error-toggle", - onClick: () => this.setState({ - collapsed: !collapsed - }) - }, /*#__PURE__*/React.createElement("span", { - className: "dash-fe-error-top__group" - }, /*#__PURE__*/React.createElement("span", { - className: "dash-fe-error__title" - }, e.error.message || 'Error')), /*#__PURE__*/React.createElement("span", { - className: "dash-fe-error-top__group" - }, /*#__PURE__*/React.createElement("span", { - className: "dash-fe-error__timestamp percy-hide" - }, "".concat(e.timestamp.toLocaleTimeString())), /*#__PURE__*/React.createElement("span", { - className: "dash-fe-error__timestamp percy-show" - }, "00:00:00 PM"), /*#__PURE__*/React.createElement(_icons_CollapseIcon_svg__WEBPACK_IMPORTED_MODULE_3__["default"], { - className: "dash-fe-error__collapse ".concat(collapsed ? 'dash-fe-error__collapse--flipped' : ''), - onClick: () => this.setState({ - collapsed: !collapsed - }) - }))); - return /*#__PURE__*/React.createElement("div", { - className: cardClasses - }, errorHeader, !collapsed && /*#__PURE__*/React.createElement(ErrorContent, { - error: e.error - })); - } -} + _inherits(FrontEndError, _Component); + return _createClass(FrontEndError, [{ + key: "render", + value: function render() { + var _this2 = this; + var _this$props = this.props, + e = _this$props.e, + inAlertsTray = _this$props.inAlertsTray; + var collapsed = this.state.collapsed; + var cardClasses = 'dash-error-card__content' + (inAlertsTray ? ' dash-error-card--alerts-tray' : ''); + + /* eslint-disable no-inline-comments */ + var errorHeader = /*#__PURE__*/React.createElement("div", { + className: "dash-fe-error-item test-devtools-error-toggle", + onClick: function onClick() { + return _this2.setState({ + collapsed: !collapsed + }); + } + }, /*#__PURE__*/React.createElement("span", { + className: "dash-fe-error-top__group" + }, /*#__PURE__*/React.createElement("span", { + className: "dash-fe-error__title" + }, e.error.message || 'Error')), /*#__PURE__*/React.createElement("span", { + className: "dash-fe-error-top__group" + }, /*#__PURE__*/React.createElement("span", { + className: "dash-fe-error__timestamp percy-hide" + }, "".concat(e.timestamp.toLocaleTimeString())), /*#__PURE__*/React.createElement("span", { + className: "dash-fe-error__timestamp percy-show" + }, "00:00:00 PM"), /*#__PURE__*/React.createElement(_icons_CollapseIcon_svg__WEBPACK_IMPORTED_MODULE_3__["default"], { + className: "dash-fe-error__collapse ".concat(collapsed ? 'dash-fe-error__collapse--flipped' : ''), + onClick: function onClick() { + return _this2.setState({ + collapsed: !collapsed + }); + } + }))); + return /*#__PURE__*/React.createElement("div", { + className: cardClasses + }, errorHeader, !collapsed && /*#__PURE__*/React.createElement(ErrorContent, { + error: e.error + })); + } + }]); +}(react__WEBPACK_IMPORTED_MODULE_2__.Component); function BackendError(_ref) { var error = _ref.error, base = _ref.base; @@ -8887,14 +9543,16 @@ function BackendError(_ref) { height = _useState2[0], setHeight = _useState2[1]; // Default height - (0,react__WEBPACK_IMPORTED_MODULE_2__.useEffect)(() => { - var handleMessage = event => { - if (event.data && typeof event.data === 'object' && event.data.type === 'IFRAME_HEIGHT') { + (0,react__WEBPACK_IMPORTED_MODULE_2__.useEffect)(function () { + var handleMessage = function handleMessage(event) { + if (event.data && _typeof(event.data) === 'object' && event.data.type === 'IFRAME_HEIGHT') { setHeight("".concat(event.data.height, "px")); } }; window.addEventListener('message', handleMessage); - return () => window.removeEventListener('message', handleMessage); + return function () { + return window.removeEventListener('message', handleMessage); + }; }, []); return /*#__PURE__*/React.createElement("iframe", { ref: iframeRef, @@ -8932,9 +9590,11 @@ function UnconnectedErrorContent(_ref2) { className: "dash-fe-error__st" }, /*#__PURE__*/React.createElement("div", { className: "dash-fe-error__info" - }, /*#__PURE__*/React.createElement("details", null, /*#__PURE__*/React.createElement("summary", null, /*#__PURE__*/React.createElement("i", null, "(This error originated from the built-in JavaScript code that runs Dash apps. Click to see the full stack trace or open your browser's console.)")), error.stack.split('\n').map((line, i) => /*#__PURE__*/React.createElement("p", { - key: i - }, line))))), isFullHtmlDoc ? /*#__PURE__*/React.createElement("div", { + }, /*#__PURE__*/React.createElement("details", null, /*#__PURE__*/React.createElement("summary", null, /*#__PURE__*/React.createElement("i", null, "(This error originated from the built-in JavaScript code that runs Dash apps. Click to see the full stack trace or open your browser's console.)")), error.stack.split('\n').map(function (line, i) { + return /*#__PURE__*/React.createElement("p", { + key: i + }, line); + })))), isFullHtmlDoc ? /*#__PURE__*/React.createElement("div", { className: "dash-be-error__st" }, /*#__PURE__*/React.createElement("div", { className: "dash-backend-error" @@ -8973,9 +9633,11 @@ UnconnectedErrorContent.propTypes = { error: errorPropTypes, base: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string) }; -var ErrorContent = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(state => ({ - base: (0,_actions_utils__WEBPACK_IMPORTED_MODULE_6__.urlBase)(state.config) -}))(UnconnectedErrorContent); +var ErrorContent = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(function (state) { + return { + base: (0,_actions_utils__WEBPACK_IMPORTED_MODULE_6__.urlBase)(state.config) + }; +})(UnconnectedErrorContent); FrontEndError.propTypes = { e: prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({ timestamp: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().object), @@ -8990,18 +9652,18 @@ FrontEndError.defaultProps = { }; -/***/ }, +/***/ }), -/***/ "./src/components/error/FrontEnd/FrontEndErrorContainer.react.js" +/***/ "./src/components/error/FrontEnd/FrontEndErrorContainer.react.js": /*!***********************************************************************!*\ !*** ./src/components/error/FrontEnd/FrontEndErrorContainer.react.js ***! \***********************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ FrontEndErrorContainer: () => (/* binding */ FrontEndErrorContainer) +/* harmony export */ FrontEndErrorContainer: function() { return /* binding */ FrontEndErrorContainer; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); @@ -9009,45 +9671,65 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types"); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _FrontEndError_react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FrontEndError.react */ "./src/components/error/FrontEnd/FrontEndError.react.js"); - - - - -class FrontEndErrorContainer extends react__WEBPACK_IMPORTED_MODULE_0__.Component { - constructor(props) { - super(props); - } - render() { - var _this$props = this.props, - errors = _this$props.errors, - connected = _this$props.connected, - clickHandler = _this$props.clickHandler; - var inAlertsTray = this.props.inAlertsTray; - var cardClasses = 'dash-error-card dash-error-card--container'; - var errorElements = errors.map((error, i) => { - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FrontEndError_react__WEBPACK_IMPORTED_MODULE_3__.FrontEndError, { - e: error, - isListItem: true, - key: i +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + + + +var FrontEndErrorContainer = /*#__PURE__*/function (_Component) { + function FrontEndErrorContainer(props) { + _classCallCheck(this, FrontEndErrorContainer); + return _callSuper(this, FrontEndErrorContainer, [props]); + } + _inherits(FrontEndErrorContainer, _Component); + return _createClass(FrontEndErrorContainer, [{ + key: "render", + value: function render() { + var _this$props = this.props, + errors = _this$props.errors, + connected = _this$props.connected, + clickHandler = _this$props.clickHandler; + var inAlertsTray = this.props.inAlertsTray; + var cardClasses = 'dash-error-card dash-error-card--container'; + var errorElements = errors.map(function (error, i) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FrontEndError_react__WEBPACK_IMPORTED_MODULE_3__.FrontEndError, { + e: error, + isListItem: true, + key: i + }); }); - }); - if (inAlertsTray) { - cardClasses += ' dash-error-card--alerts-tray'; + if (inAlertsTray) { + cardClasses += ' dash-error-card--alerts-tray'; + } + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: cardClasses + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-error-card__topbar" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-error-card__message" + }, "Errors", connected ? null : "\xA0 \uD83D\uDEAB Server Unavailable"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-fe-error__icon-x", + onClick: function onClick() { + return clickHandler(); + } + }, "\xD7")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "dash-error-card__list" + }, errorElements)); } - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: cardClasses - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-error-card__topbar" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-error-card__message" - }, "Errors", connected ? null : "\xA0 \uD83D\uDEAB Server Unavailable"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-fe-error__icon-x", - onClick: () => clickHandler() - }, "\xD7")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "dash-error-card__list" - }, errorElements)); - } -} + }]); +}(react__WEBPACK_IMPORTED_MODULE_0__.Component); FrontEndErrorContainer.propTypes = { id: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), errors: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array), @@ -9059,13 +9741,13 @@ FrontEndErrorContainer.propTypes = { }; -/***/ }, +/***/ }), -/***/ "./src/components/error/GlobalErrorContainer.react.js" +/***/ "./src/components/error/GlobalErrorContainer.react.js": /*!************************************************************!*\ !*** ./src/components/error/GlobalErrorContainer.react.js ***! \************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -9075,53 +9757,73 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types"); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _menu_DebugMenu_react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./menu/DebugMenu.react */ "./src/components/error/menu/DebugMenu.react.js"); - - - - -class UnconnectedGlobalErrorContainer extends react__WEBPACK_IMPORTED_MODULE_1__.Component { - constructor(props) { - super(props); - } - render() { - var _this$props = this.props, - config = _this$props.config, - error = _this$props.error, - children = _this$props.children; - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { - id: "_dash-global-error-container" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_menu_DebugMenu_react__WEBPACK_IMPORTED_MODULE_3__.DebugMenu, { - config: config, - error: error, - hotReload: Boolean(config.hot_reload) - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { - id: "_dash-app-content" - }, children))); - } -} +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } + + + + +var UnconnectedGlobalErrorContainer = /*#__PURE__*/function (_Component) { + function UnconnectedGlobalErrorContainer(props) { + _classCallCheck(this, UnconnectedGlobalErrorContainer); + return _callSuper(this, UnconnectedGlobalErrorContainer, [props]); + } + _inherits(UnconnectedGlobalErrorContainer, _Component); + return _createClass(UnconnectedGlobalErrorContainer, [{ + key: "render", + value: function render() { + var _this$props = this.props, + config = _this$props.config, + error = _this$props.error, + children = _this$props.children; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { + id: "_dash-global-error-container" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_menu_DebugMenu_react__WEBPACK_IMPORTED_MODULE_3__.DebugMenu, { + config: config, + error: error, + hotReload: Boolean(config.hot_reload) + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { + id: "_dash-app-content" + }, children))); + } + }]); +}(react__WEBPACK_IMPORTED_MODULE_1__.Component); UnconnectedGlobalErrorContainer.propTypes = { children: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), config: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object), error: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object) }; -var GlobalErrorContainer = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(state => ({ - config: state.config, - error: state.error -}))(UnconnectedGlobalErrorContainer); +var GlobalErrorContainer = (0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(function (state) { + return { + config: state.config, + error: state.error + }; +})(UnconnectedGlobalErrorContainer); /* harmony default export */ __webpack_exports__["default"] = (GlobalErrorContainer); -/***/ }, +/***/ }), -/***/ "./src/components/error/menu/DebugMenu.react.js" +/***/ "./src/components/error/menu/DebugMenu.react.js": /*!******************************************************!*\ !*** ./src/components/error/menu/DebugMenu.react.js ***! \******************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DebugMenu: () => (/* binding */ DebugMenu) +/* harmony export */ DebugMenu: function() { return /* binding */ DebugMenu; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); @@ -9168,8 +9870,10 @@ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } -var classes = (base, variant, variant2) => "".concat(base, " ").concat(base, "--").concat(variant) + (variant2 ? " ".concat(base, "--").concat(variant2) : ''); -var isCollapsed = () => { +var classes = function classes(base, variant, variant2) { + return "".concat(base, " ").concat(base, "--").concat(variant) + (variant2 ? " ".concat(base, "--").concat(variant2) : ''); +}; +var isCollapsed = function isCollapsed() { try { return localStorage.getItem('dash_debug_menu_collapsed') === 'true'; } catch (e) { @@ -9177,7 +9881,7 @@ var isCollapsed = () => { return false; } }; -var MenuContent = _ref => { +var MenuContent = function MenuContent(_ref) { var _config$dev_tools; var hotReload = _ref.hotReload, connected = _ref.connected, @@ -9186,12 +9890,14 @@ var MenuContent = _ref => { errCount = _ref.errCount, toggleCallbackGraph = _ref.toggleCallbackGraph, config = _ref.config; - var ready = (0,react_redux__WEBPACK_IMPORTED_MODULE_3__.useSelector)(state => state.appLifecycle === 'HYDRATED'); + var ready = (0,react_redux__WEBPACK_IMPORTED_MODULE_3__.useSelector)(function (state) { + return state.appLifecycle === 'HYDRATED'; + }); var _StatusIcon = hotReload ? connected ? _icons_CheckIcon_svg__WEBPACK_IMPORTED_MODULE_5__["default"] : _icons_OffIcon_svg__WEBPACK_IMPORTED_MODULE_9__["default"] : _icons_ClockIcon_svg__WEBPACK_IMPORTED_MODULE_6__["default"]; var status = hotReload ? connected ? 'available' : 'unavailable' : 'cold'; var custom = null; if ((_config$dev_tools = config.dev_tools) !== null && _config$dev_tools !== void 0 && _config$dev_tools.length && ready) { - custom = config.dev_tools.reduce((acc, devtool, i) => { + custom = config.dev_tools.reduce(function (acc, devtool, i) { var _devtool$props; var comp = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_wrapper_ExternalWrapper__WEBPACK_IMPORTED_MODULE_14__["default"], { component: devtool, @@ -9248,7 +9954,7 @@ var MenuContent = _ref => { } })); }; -var Debug = _ref2 => { +var Debug = function Debug(_ref2) { var error = _ref2.error, hotReload = _ref2.hotReload, config = _ref2.config, @@ -9262,18 +9968,18 @@ var Debug = _ref2 => { setCollapsed = _useState2[1]; var errCount = error.frontEnd.length + error.backEnd.length; var connected = error.backEndConnected; - (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { + (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { if (errCount > 0 && popup == null) { setPopup('errors'); } }, [errCount]); - var toggleErrors = () => { + var toggleErrors = function toggleErrors() { setPopup(popup == 'errors' ? null : 'errors'); }; - var toggleCallbackGraph = () => { + var toggleCallbackGraph = function toggleCallbackGraph() { setPopup(popup == 'callbackGraph' ? null : 'callbackGraph'); }; - var toggleCollapsed = () => { + var toggleCollapsed = function toggleCollapsed() { setCollapsed(!collapsed); try { localStorage.setItem('dash_debug_menu_collapsed', !collapsed); @@ -9282,7 +9988,7 @@ var Debug = _ref2 => { } }; var errors = (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(error.frontEnd, error.backEnd); - (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { + (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { if (errors.length && popup !== 'errors') { setPopup('errors'); } @@ -9312,7 +10018,7 @@ var Debug = _ref2 => { className: "dash-debug-menu__error-indicator" }) : null)), children); }; -var DebugMenu = _ref3 => { +var DebugMenu = function DebugMenu(_ref3) { var children = _ref3.children, props = _objectWithoutProperties(_ref3, _excluded); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_DevtoolContext__WEBPACK_IMPORTED_MODULE_16__.DevtoolProvider, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Debug, props, children)); @@ -9325,21 +10031,21 @@ DebugMenu.propTypes = { }; -/***/ }, +/***/ }), -/***/ "./src/components/error/menu/DevtoolContext.js" +/***/ "./src/components/error/menu/DevtoolContext.js": /*!*****************************************************!*\ !*** ./src/components/error/menu/DevtoolContext.js ***! \*****************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DevtoolContext: () => (/* binding */ DevtoolContext), -/* harmony export */ DevtoolProvider: () => (/* binding */ DevtoolProvider), -/* harmony export */ useDevtool: () => (/* binding */ useDevtool), -/* harmony export */ useDevtoolMenuButtonClassName: () => (/* binding */ useDevtoolMenuButtonClassName) +/* harmony export */ DevtoolContext: function() { return /* binding */ DevtoolContext; }, +/* harmony export */ DevtoolProvider: function() { return /* binding */ DevtoolProvider; }, +/* harmony export */ useDevtool: function() { return /* binding */ useDevtool; }, +/* harmony export */ useDevtoolMenuButtonClassName: function() { return /* binding */ useDevtoolMenuButtonClassName; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); @@ -9351,7 +10057,7 @@ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } var DevtoolContext = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createContext({}); -var DevtoolProvider = _ref => { +var DevtoolProvider = function DevtoolProvider(_ref) { var children = _ref.children; var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''), _useState2 = _slicedToArray(_useState, 2), @@ -9364,13 +10070,13 @@ var DevtoolProvider = _ref => { } }, children); }; -var useDevtool = () => { +var useDevtool = function useDevtool() { return (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(DevtoolContext); }; -var useDevtoolMenuButtonClassName = popupName => { +var useDevtoolMenuButtonClassName = function useDevtoolMenuButtonClassName(popupName) { var _useDevtool = useDevtool(), popup = _useDevtool.popup; - var className = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => { + var className = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () { var base = 'dash-debug-menu__button'; if (popup === popupName) { return base + ' dash-debug-menu__button--selected'; @@ -9380,13 +10086,13 @@ var useDevtoolMenuButtonClassName = popupName => { return className; }; -/***/ }, +/***/ }), -/***/ "./src/components/error/menu/PlotlyCloud.js" +/***/ "./src/components/error/menu/PlotlyCloud.js": /*!**************************************************!*\ !*** ./src/components/error/menu/PlotlyCloud.js ***! \**************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -9400,20 +10106,22 @@ __webpack_require__.r(__webpack_exports__); var CLOUD_POPUP = 'cloud'; -var PlotlyCloud = () => { +var PlotlyCloud = function PlotlyCloud() { var _useDevtool = (0,_DevtoolContext__WEBPACK_IMPORTED_MODULE_1__.useDevtool)(), popup = _useDevtool.popup, setPopup = _useDevtool.setPopup; var className = (0,_DevtoolContext__WEBPACK_IMPORTED_MODULE_1__.useDevtoolMenuButtonClassName)(CLOUD_POPUP); - var isOpen = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => popup === CLOUD_POPUP, [popup]); - var onClick = () => { + var isOpen = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () { + return popup === CLOUD_POPUP; + }, [popup]); + var onClick = function onClick() { if (popup === CLOUD_POPUP) { setPopup(''); } else { setPopup(CLOUD_POPUP); } }; - var onCopy = () => { + var onCopy = function onCopy() { navigator.clipboard.writeText('pip install "dash[cloud]"'); }; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { @@ -9435,7 +10143,9 @@ var PlotlyCloud = () => { }, "Plotly Cloud"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { key: "modal-close", className: "plotly-cloud-modal-close", - onClick: () => setPopup('') + onClick: function onClick() { + return setPopup(''); + } }, "\xD7")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: "modal-body", className: "plotly-cloud-modal-body" @@ -9448,18 +10158,18 @@ var PlotlyCloud = () => { }; /* harmony default export */ __webpack_exports__["default"] = (PlotlyCloud); -/***/ }, +/***/ }), -/***/ "./src/components/error/menu/VersionInfo.react.js" +/***/ "./src/components/error/menu/VersionInfo.react.js": /*!********************************************************!*\ !*** ./src/components/error/menu/VersionInfo.react.js ***! \********************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ VersionInfo: () => (/* binding */ VersionInfo) +/* harmony export */ VersionInfo: function() { return /* binding */ VersionInfo; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); @@ -9534,7 +10244,9 @@ function _requestDashVersionInfo() { }).toString(); return _context.a(2, fetch(dashVersionUrl + '?' + queryParams, { mode: 'cors' - }).then(response => response.json()).then(body => { + }).then(function (response) { + return response.json(); + }).then(function (body) { if (body && body.version && body.link) { try { localStorage.setItem('cachedNewDashVersion', JSON.stringify(body.version)); @@ -9547,7 +10259,7 @@ function _requestDashVersionInfo() { } else { return {}; } - }).catch(() => { + }).catch(function () { return {}; })); case 5: @@ -9598,7 +10310,7 @@ function shouldShowUpgradeNotification(currentDashVersion, newDashVersion, confi return !lastDismissed && !lastDismissedVersion; } } -var VersionInfo = _ref => { +var VersionInfo = function VersionInfo(_ref) { var config = _ref.config; var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(undefined), _useState2 = _slicedToArray(_useState, 2), @@ -9612,7 +10324,7 @@ var VersionInfo = _ref => { _useState6 = _slicedToArray(_useState5, 2), upgradeTooltipOpened = _useState6[0], setUpgradeTooltipOpened = _useState6[1]; - var setDontShowAgain = () => { + var setDontShowAgain = function setDontShowAgain() { // Set local storage to record the last dismissed notification try { localStorage.setItem('showNotifications', false); @@ -9621,7 +10333,7 @@ var VersionInfo = _ref => { } setUpgradeTooltipOpened(false); }; - var setRemindMeLater = () => { + var setRemindMeLater = function setRemindMeLater() { // Set local storage to record the last dismissed notification try { localStorage.setItem('lastDismissed', Date.now()); @@ -9630,7 +10342,7 @@ var VersionInfo = _ref => { } setUpgradeTooltipOpened(false); }; - var setSkipThisVersion = () => { + var setSkipThisVersion = function setSkipThisVersion() { // Set local storage to record the last dismissed version try { localStorage.setItem('lastDismissedVersion', newDashVersion); @@ -9639,23 +10351,25 @@ var VersionInfo = _ref => { } setUpgradeTooltipOpened(false); }; - (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { - requestDashVersionInfo(config).then(body => { + (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { + requestDashVersionInfo(config).then(function (body) { if (body) { setNewDashVersionLink(body.link); setNewDashVersion(body.version); } }); }, []); - (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { - var hideUpgradeTooltip = e => { + (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () { + var hideUpgradeTooltip = function hideUpgradeTooltip(e) { if (upgradeTooltipOpened && !e.target.matches('.dash-debug-menu__version, .dash-debug-menu__version *')) { setUpgradeTooltipOpened(false); } }; // Close the upgrade tooltip if the user clicks outside of it document.addEventListener('click', hideUpgradeTooltip); - return () => document.removeEventListener('click', hideUpgradeTooltip); + return function () { + return document.removeEventListener('click', hideUpgradeTooltip); + }; }, [upgradeTooltipOpened]); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "dash-debug-menu__version" @@ -9672,17 +10386,19 @@ var VersionInfo = _ref => { onClick: setDontShowAgain }, "Silence all version notifications")) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "v", config.dash_version), shouldShowUpgradeNotification(config.dash_version, newDashVersion, config) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "dash-debug-menu__upgrade-button", - onClick: () => setUpgradeTooltipOpened(!upgradeTooltipOpened) + onClick: function onClick() { + return setUpgradeTooltipOpened(!upgradeTooltipOpened); + } }, "Dash update available - v", newDashVersion) : null); }; -/***/ }, +/***/ }), -/***/ "./src/components/error/werkzeugcss.js" +/***/ "./src/components/error/werkzeugcss.js": /*!*********************************************!*\ !*** ./src/components/error/werkzeugcss.js ***! \*********************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -9691,22 +10407,22 @@ __webpack_require__.r(__webpack_exports__); /* harmony default export */ __webpack_exports__["default"] = ("\nbody {\n margin: 0px;\n overflow: hidden;\n}\n\n.traceback {\n background-color: white;\n border: 2px solid #dfe8f3;\n border-radius: 0px 0px 4px 4px;\n color: #506784;\n}\n\nh2.traceback {\n background-color: #f3f6fa;\n border: 2px solid #dfe8f3;\n border-bottom: 0px;\n box-sizing: border-box;\n border-radius: 4px 4px 0px 0px;\n color: #506784;\n}\n\nh2.traceback em {\n color: #506784;\n font-weight: 100;\n}\n\n.traceback pre, .debugger textarea {\n background-color: #F3F6FA;\n}\n\n.debugger h1 {\n color: #506784;\n font-family: Roboto;\n}\n\n.explanation {\n color: #A2B1C6;\n}\n\n/* Hide the Don't Panic! footer */\n.debugger .footer {\n display: none;\n}\n\n/* Hide all of the Dash traceback stuff that leads up to the call */\n.line.before {\n display: none;\n}\n\ndiv.debugger {\n padding: 0px;\n}\n\n.debugger h1 {\n display: none;\n}\n\n.debugger .errormsg {\n margin: 0;\n color: #506784;\n font-size: 16px;\n background-color: #f3f6fa;\n border: 2px solid #dfe8f3;\n box-sizing: border-box;\n border-radius: 4px;\n padding: 10px;\n}\n\n.debugger .pastemessage input {\n display: none;\n}\n\n.debugger .explanation {\n display: none;\n}\n\n.debugger div.plain {\n border-radius: 4px;\n border-width: 2px;\n color: #506784;\n}\n\n.plain {\n display: block !important;\n}\n.plain > form > p {\n display: none;\n}\n.plain pre {\n padding: 15px !important;\n overflow-x: scroll;\n}\n\n.debugger div.traceback pre {\n cursor: default;\n}\n\n.debugger .traceback .source pre.line img {\n display: none;\n}\n"); -/***/ }, +/***/ }), -/***/ "./src/constants/constants.js" +/***/ "./src/constants/constants.js": /*!************************************!*\ !*** ./src/constants/constants.js ***! \************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ JWT_EXPIRED_MESSAGE: () => (/* binding */ JWT_EXPIRED_MESSAGE), -/* harmony export */ OAUTH_COOKIE_NAME: () => (/* binding */ OAUTH_COOKIE_NAME), -/* harmony export */ REDIRECT_URI_PATHNAME: () => (/* binding */ REDIRECT_URI_PATHNAME), -/* harmony export */ STATUS: () => (/* binding */ STATUS), -/* harmony export */ STATUSMAP: () => (/* binding */ STATUSMAP) +/* harmony export */ JWT_EXPIRED_MESSAGE: function() { return /* binding */ JWT_EXPIRED_MESSAGE; }, +/* harmony export */ OAUTH_COOKIE_NAME: function() { return /* binding */ OAUTH_COOKIE_NAME; }, +/* harmony export */ REDIRECT_URI_PATHNAME: function() { return /* binding */ REDIRECT_URI_PATHNAME; }, +/* harmony export */ STATUS: function() { return /* binding */ STATUS; }, +/* harmony export */ STATUSMAP: function() { return /* binding */ STATUSMAP; } /* harmony export */ }); var REDIRECT_URI_PATHNAME = '/_oauth2/callback'; var OAUTH_COOKIE_NAME = 'plotly_oauth_token'; @@ -9727,18 +10443,18 @@ var STATUSMAP = { [STATUS.PREVENT_UPDATE]: 'NO_UPDATE' }; -/***/ }, +/***/ }), -/***/ "./src/exceptions.js" +/***/ "./src/exceptions.js": /*!***************************!*\ !*** ./src/exceptions.js ***! \***************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ propTypeErrorHandler: () => (/* binding */ propTypeErrorHandler) +/* harmony export */ propTypeErrorHandler: function() { return /* binding */ propTypeErrorHandler; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/has.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/includes.js"); @@ -9846,13 +10562,13 @@ function propTypeErrorHandler(message, props, type) { throw new Error(errorMessage); } -/***/ }, +/***/ }), -/***/ "./src/isSimpleComponent.js" +/***/ "./src/isSimpleComponent.js": /*!**********************************!*\ !*** ./src/isSimpleComponent.js ***! \**********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -9860,24 +10576,26 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/type.js"); var SIMPLE_COMPONENT_TYPES = ['String', 'Number', 'Null', 'Boolean']; -/* harmony default export */ __webpack_exports__["default"] = (component => (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(component), SIMPLE_COMPONENT_TYPES)); +/* harmony default export */ __webpack_exports__["default"] = (function (component) { + return (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(component), SIMPLE_COMPONENT_TYPES); +}); -/***/ }, +/***/ }), -/***/ "./src/persistence.js" +/***/ "./src/persistence.js": /*!****************************!*\ !*** ./src/persistence.js ***! \****************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ applyPersistence: () => (/* binding */ applyPersistence), -/* harmony export */ prunePersistence: () => (/* binding */ prunePersistence), -/* harmony export */ recordUiEdit: () => (/* binding */ recordUiEdit), -/* harmony export */ storePrefix: () => (/* binding */ storePrefix), -/* harmony export */ stores: () => (/* binding */ stores) +/* harmony export */ applyPersistence: function() { return /* binding */ applyPersistence; }, +/* harmony export */ prunePersistence: function() { return /* binding */ prunePersistence; }, +/* harmony export */ recordUiEdit: function() { return /* binding */ recordUiEdit; }, +/* harmony export */ storePrefix: function() { return /* binding */ storePrefix; }, +/* harmony export */ stores: function() { return /* binding */ stores; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/equals.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/filter.js"); @@ -9897,6 +10615,12 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /** * Generalized persistence for component props * @@ -9977,93 +10701,129 @@ function err(e) { function keyPrefixMatch(prefix, separator) { var fullStr = prefix + separator; var fullLen = fullStr.length; - return key => key === prefix || key.substr(0, fullLen) === fullStr; + return function (key) { + return key === prefix || key.substr(0, fullLen) === fullStr; + }; } var UNDEFINED = 'U'; -var _parse = val => val === UNDEFINED ? undefined : JSON.parse(val || null); -var _stringify = val => val === undefined ? UNDEFINED : JSON.stringify(val); -class WebStore { - constructor(backEnd) { +var _parse = function _parse(val) { + return val === UNDEFINED ? undefined : JSON.parse(val || null); +}; +var _stringify = function _stringify(val) { + return val === undefined ? UNDEFINED : JSON.stringify(val); +}; +var WebStore = /*#__PURE__*/function () { + function WebStore(backEnd) { + _classCallCheck(this, WebStore); this._name = backEnd; this._storage = window[backEnd]; } - hasItem(key) { - return this._storage.getItem(storePrefix + key) !== null; - } - getItem(key) { - // note: _storage.getItem returns null on missing keys - // and JSON.parse(null) returns null as well - return _parse(this._storage.getItem(storePrefix + key)); - } - _setItem(key, value) { - // unprotected version of setItem, for use by tryGetWebStore - this._storage.setItem(storePrefix + key, _stringify(value)); - } - /* - * In addition to the regular key->value to set, setItem takes - * dispatch as a parameter, so it can report OOM to devtools - */ - setItem(key, value, dispatch) { - try { - this._setItem(key, value); - } catch (e) { - dispatch(err("".concat(key, " failed to save in ").concat(this._name, ". Persisted props may be lost."))); - // TODO: at some point we may want to convert this to fall back - // on memory, pulling out all persistence keys and putting them - // in a MemStore that gets used from then onward. + return _createClass(WebStore, [{ + key: "hasItem", + value: function hasItem(key) { + return this._storage.getItem(storePrefix + key) !== null; + } + }, { + key: "getItem", + value: function getItem(key) { + // note: _storage.getItem returns null on missing keys + // and JSON.parse(null) returns null as well + return _parse(this._storage.getItem(storePrefix + key)); + } + }, { + key: "_setItem", + value: function _setItem(key, value) { + // unprotected version of setItem, for use by tryGetWebStore + this._storage.setItem(storePrefix + key, _stringify(value)); + } + /* + * In addition to the regular key->value to set, setItem takes + * dispatch as a parameter, so it can report OOM to devtools + */ + }, { + key: "setItem", + value: function setItem(key, value, dispatch) { + try { + this._setItem(key, value); + } catch (e) { + dispatch(err("".concat(key, " failed to save in ").concat(this._name, ". Persisted props may be lost."))); + // TODO: at some point we may want to convert this to fall back + // on memory, pulling out all persistence keys and putting them + // in a MemStore that gets used from then onward. + } + } + }, { + key: "removeItem", + value: function removeItem(key) { + this._storage.removeItem(storePrefix + key); } - } - removeItem(key) { - this._storage.removeItem(storePrefix + key); - } - /* - * clear matching keys matching (optionally followed by a dot and more - * characters) - or all keys associated with this store if no prefix. - */ - clear(keyPrefix) { - var fullPrefix = storePrefix + (keyPrefix || ''); - var keyMatch = keyPrefixMatch(fullPrefix, keyPrefix ? '.' : ''); - var keysToRemove = []; - // 2-step process, so we don't depend on any particular behavior of - // key order while removing some - for (var i = 0; i < this._storage.length; i++) { - var fullKey = this._storage.key(i); - if (keyMatch(fullKey)) { - keysToRemove.push(fullKey); + /* + * clear matching keys matching (optionally followed by a dot and more + * characters) - or all keys associated with this store if no prefix. + */ + }, { + key: "clear", + value: function clear(keyPrefix) { + var _this = this; + var fullPrefix = storePrefix + (keyPrefix || ''); + var keyMatch = keyPrefixMatch(fullPrefix, keyPrefix ? '.' : ''); + var keysToRemove = []; + // 2-step process, so we don't depend on any particular behavior of + // key order while removing some + for (var i = 0; i < this._storage.length; i++) { + var fullKey = this._storage.key(i); + if (keyMatch(fullKey)) { + keysToRemove.push(fullKey); + } } + (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (k) { + return _this._storage.removeItem(k); + }, keysToRemove); } - (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(k => this._storage.removeItem(k), keysToRemove); - } -} -class MemStore { - constructor() { + }]); +}(); +var MemStore = /*#__PURE__*/function () { + function MemStore() { + _classCallCheck(this, MemStore); this._data = {}; } - hasItem(key) { - return key in this._data; - } - getItem(key) { - // run this storage through JSON too so we know we get a fresh object - // each retrieval - return _parse(this._data[key]); - } - setItem(key, value) { - this._data[key] = _stringify(value); - } - removeItem(key) { - delete this._data[key]; - } - clear(keyPrefix) { - if (keyPrefix) { - (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(key => delete this._data[key], (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(keyPrefixMatch(keyPrefix, '.'), (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(this._data))); - } else { - this._data = {}; + return _createClass(MemStore, [{ + key: "hasItem", + value: function hasItem(key) { + return key in this._data; } - } -} - -// Make a string 2^16 characters long (*2 bytes/char = 130kB), to test storage. + }, { + key: "getItem", + value: function getItem(key) { + // run this storage through JSON too so we know we get a fresh object + // each retrieval + return _parse(this._data[key]); + } + }, { + key: "setItem", + value: function setItem(key, value) { + this._data[key] = _stringify(value); + } + }, { + key: "removeItem", + value: function removeItem(key) { + delete this._data[key]; + } + }, { + key: "clear", + value: function clear(keyPrefix) { + var _this2 = this; + if (keyPrefix) { + (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (key) { + return delete _this2._data[key]; + }, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(keyPrefixMatch(keyPrefix, '.'), (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(this._data))); + } else { + this._data = {}; + } + } + }]); +}(); // Make a string 2^16 characters long (*2 bytes/char = 130kB), to test storage. // That should be plenty for common persistence use cases, // without getting anywhere near typical browser limits var pow = 16; @@ -10120,10 +10880,14 @@ function getStore(type, dispatch) { return stores[type]; } var noopTransform = { - extract: propValue => propValue, - apply: (storedValue, _propValue) => storedValue + extract: function extract(propValue) { + return propValue; + }, + apply: function apply(storedValue, _propValue) { + return storedValue; + } }; -var getTransform = (element, propName, propPart) => { +var getTransform = function getTransform(element, propName, propPart) { if (element.persistenceTransforms && element.persistenceTransforms[propName]) { if (propPart) { return element.persistenceTransforms[propName][propPart]; @@ -10132,8 +10896,10 @@ var getTransform = (element, propName, propPart) => { } return noopTransform; }; -var getValsKey = (id, persistedProp, persistence) => "".concat((0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_10__.stringifyId)(id), ".").concat(persistedProp, ".").concat(JSON.stringify(persistence)); -var getProps = layout => { +var getValsKey = function getValsKey(id, persistedProp, persistence) { + return "".concat((0,_actions_dependencies__WEBPACK_IMPORTED_MODULE_10__.stringifyId)(id), ".").concat(persistedProp, ".").concat(JSON.stringify(persistence)); +}; +var getProps = function getProps(layout) { var props = layout.props, type = layout.type, namespace = layout.namespace; @@ -10146,7 +10912,9 @@ var getProps = layout => { var id = props.id, persistence = props.persistence; var element = _registry__WEBPACK_IMPORTED_MODULE_9__["default"].resolve(layout); - var getVal = prop => props[prop] || (element.defaultProps || element.dashPersistence || {})[prop]; + var getVal = function getVal(prop) { + return props[prop] || (element.defaultProps || element.dashPersistence || {})[prop]; + }; var persisted_props = getVal('persisted_props'); var persistence_type = getVal('persistence_type'); var canPersist = id && persisted_props && persistence_type; @@ -10176,7 +10944,7 @@ function recordUiEdit(layout, newProps, dispatch) { if (!canPersist || !persistence || isPersistenceMismatch) { return; } - (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(persistedProp => { + (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (persistedProp) { var _persistedProp$split = persistedProp.split('.'), _persistedProp$split2 = _slicedToArray(_persistedProp$split, 2), propName = _persistedProp$split2[0], @@ -10209,7 +10977,9 @@ function recordUiEdit(layout, newProps, dispatch) { */ function applyPersistence(layout, dispatch) { if (Array.isArray(layout)) { - return layout.map(lay => (0,_wrapper_wrapping__WEBPACK_IMPORTED_MODULE_11__.isDryComponent)(lay) ? persistenceMods(lay, lay, [], dispatch) : lay); + return layout.map(function (lay) { + return (0,_wrapper_wrapping__WEBPACK_IMPORTED_MODULE_11__.isDryComponent)(lay) ? persistenceMods(lay, lay, [], dispatch) : lay; + }); } return persistenceMods(layout, layout, [], dispatch); } @@ -10249,7 +11019,9 @@ function persistenceMods(layout, component, path, dispatch) { if (canPersist && persistence) { var storage = getStore(persistence_type, dispatch); var update = {}; - (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(persistedProp => modProp(getValsKey(id, persistedProp, persistence), storage, element, props, persistedProp, update), persisted_props); + (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (persistedProp) { + return modProp(getValsKey(id, persistedProp, persistence), storage, element, props, persistedProp, update); + }, persisted_props); for (var propName in update) { layoutOut = (0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])((0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(path.concat('props', propName)), update[propName], layoutOut); } @@ -10258,7 +11030,7 @@ function persistenceMods(layout, component, path, dispatch) { // recurse inward var children = props.children; if (Array.isArray(children)) { - children.forEach((child, i) => { + children.forEach(function (child, i) { if ((0,ramda__WEBPACK_IMPORTED_MODULE_7__["default"])(child) === 'Object' && child.props) { layoutOut = persistenceMods(layoutOut, child, path.concat('props', 'children', i), dispatch); } @@ -10283,7 +11055,9 @@ function prunePersistence(layout, newProps, dispatch) { persisted_props = _getProps3.persisted_props, persistence_type = _getProps3.persistence_type, element = _getProps3.element; - var getFinal = (propName, prevVal) => propName in newProps ? newProps[propName] : prevVal; + var getFinal = function getFinal(propName, prevVal) { + return propName in newProps ? newProps[propName] : prevVal; + }; var finalPersistence = getFinal('persistence', persistence); if (!canPersist || !(persistence || finalPersistence)) { return newProps; @@ -10291,35 +11065,41 @@ function prunePersistence(layout, newProps, dispatch) { var finalPersistenceType = getFinal('persistence_type', persistence_type); var finalPersistedProps = getFinal('persisted_props', persisted_props); var persistenceChanged = finalPersistence !== persistence || finalPersistenceType !== persistence_type || finalPersistedProps !== persisted_props; - var notInNewProps = persistedProp => !(persistedProp.split('.')[0] in newProps); + var notInNewProps = function notInNewProps(persistedProp) { + return !(persistedProp.split('.')[0] in newProps); + }; var update = {}; var depersistedProps = props; if (persistenceChanged && persistence) { // clear previously-applied persistence var storage = getStore(persistence_type, dispatch); - (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(persistedProp => modProp(getValsKey(id, persistedProp, persistence), storage, element, props, persistedProp, update, UNDO), (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(notInNewProps, persisted_props)); + (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (persistedProp) { + return modProp(getValsKey(id, persistedProp, persistence), storage, element, props, persistedProp, update, UNDO); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(notInNewProps, persisted_props)); depersistedProps = (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(props, update); } if (finalPersistence && persistenceChanged) { var finalStorage = getStore(finalPersistenceType, dispatch); // apply new persistence - (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(persistedProp => modProp(getValsKey(id, persistedProp, finalPersistence), finalStorage, element, depersistedProps, persistedProp, update), (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(notInNewProps, finalPersistedProps)); + (0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])(function (persistedProp) { + return modProp(getValsKey(id, persistedProp, finalPersistence), finalStorage, element, depersistedProps, persistedProp, update); + }, (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(notInNewProps, finalPersistedProps)); } return persistenceChanged ? (0,ramda__WEBPACK_IMPORTED_MODULE_5__["default"])(newProps, update) : newProps; } -/***/ }, +/***/ }), -/***/ "./src/reducers/api.js" +/***/ "./src/reducers/api.js": /*!*****************************!*\ !*** ./src/reducers/api.js ***! \*****************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ createApiReducer) +/* harmony export */ "default": function() { return /* binding */ createApiReducer; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assoc.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assocPath.js"); @@ -10351,13 +11131,13 @@ function createApiReducer(store) { }; } -/***/ }, +/***/ }), -/***/ "./src/reducers/appLifecycle.js" +/***/ "./src/reducers/appLifecycle.js": /*!**************************************!*\ !*** ./src/reducers/appLifecycle.js ***! \**************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -10377,13 +11157,13 @@ function appLifecycle() { } /* harmony default export */ __webpack_exports__["default"] = (appLifecycle); -/***/ }, +/***/ }), -/***/ "./src/reducers/changed.js" +/***/ "./src/reducers/changed.js": /*!*********************************!*\ !*** ./src/reducers/changed.js ***! \*********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -10400,18 +11180,18 @@ function changed() { } /* harmony default export */ __webpack_exports__["default"] = (changed); -/***/ }, +/***/ }), -/***/ "./src/reducers/config.js" +/***/ "./src/reducers/config.js": /*!********************************!*\ !*** ./src/reducers/config.js ***! \********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ config) +/* harmony export */ "default": function() { return /* binding */ config; } /* harmony export */ }); /* harmony import */ var _actions_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../actions/constants */ "./src/actions/constants.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeDeepRight.js"); @@ -10434,18 +11214,18 @@ function config() { return state; } -/***/ }, +/***/ }), -/***/ "./src/reducers/constants.js" +/***/ "./src/reducers/constants.js": /*!***********************************!*\ !*** ./src/reducers/constants.js ***! \***********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ getAppState: () => (/* binding */ getAppState) +/* harmony export */ getAppState: function() { return /* binding */ getAppState; } /* harmony export */ }); function getAppState(state) { var stateList = { @@ -10459,13 +11239,13 @@ function getAppState(state) { throw new Error("".concat(state, " is not a valid app state.")); } -/***/ }, +/***/ }), -/***/ "./src/reducers/dependencyGraph.js" +/***/ "./src/reducers/dependencyGraph.js": /*!*****************************************!*\ !*** ./src/reducers/dependencyGraph.js ***! \*****************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -10480,20 +11260,26 @@ var graphs = function graphs() { }; /* harmony default export */ __webpack_exports__["default"] = (graphs); -/***/ }, +/***/ }), -/***/ "./src/reducers/error.js" +/***/ "./src/reducers/error.js": /*!*******************************!*\ !*** ./src/reducers/error.js ***! \*******************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ error) +/* harmony export */ "default": function() { return /* binding */ error; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeRight.js"); +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } var initialError = { frontEnd: [], @@ -10517,7 +11303,7 @@ function error() { return { frontEnd: [(0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(action.payload, { timestamp: new Date() - }), ...frontEnd], + })].concat(_toConsumableArray(frontEnd)), backEnd, backEndConnected }; @@ -10526,7 +11312,7 @@ function error() { frontEnd, backEnd: [(0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(action.payload, { timestamp: new Date() - }), ...backEnd], + })].concat(_toConsumableArray(backEnd)), backEndConnected }; } @@ -10545,16 +11331,22 @@ function error() { } } -/***/ }, +/***/ }), -/***/ "./src/reducers/history.js" +/***/ "./src/reducers/history.js": /*!*********************************!*\ !*** ./src/reducers/history.js ***! \*********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } var initialHistory = { past: [], present: {}, @@ -10574,7 +11366,7 @@ function history() { return { past: newPast, present: previous, - future: [present, ...future] + future: [present].concat(_toConsumableArray(future)) }; } case 'REDO': @@ -10585,7 +11377,7 @@ function history() { var next = _future[0]; var newFuture = _future.slice(1); return { - past: [..._past, _present], + past: [].concat(_toConsumableArray(_past), [_present]), present: next, future: newFuture }; @@ -10599,7 +11391,7 @@ function history() { return { past: _newPast, present: _previous, - future: [..._future2] + future: _toConsumableArray(_future2) }; } default: @@ -10610,13 +11402,13 @@ function history() { } /* harmony default export */ __webpack_exports__["default"] = (history); -/***/ }, +/***/ }), -/***/ "./src/reducers/hooks.js" +/***/ "./src/reducers/hooks.js": /*!*******************************!*\ !*** ./src/reducers/hooks.js ***! \*******************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -10640,13 +11432,13 @@ var customHooks = function customHooks() { }; /* harmony default export */ __webpack_exports__["default"] = (customHooks); -/***/ }, +/***/ }), -/***/ "./src/reducers/layout.js" +/***/ "./src/reducers/layout.js": /*!********************************!*\ !*** ./src/reducers/layout.js ***! \********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -10658,11 +11450,18 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/mergeRight.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/view.js"); /* harmony import */ var _actions_constants__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/constants */ "./src/actions/constants.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } var layout = function layout() { @@ -10672,7 +11471,7 @@ var layout = function layout() { var action = arguments.length > 1 ? arguments[1] : undefined; if (action.type === (0,_actions_constants__WEBPACK_IMPORTED_MODULE_7__.getAction)('SET_LAYOUT')) { if (Array.isArray(action.payload)) { - state.components = [...action.payload]; + state.components = _toConsumableArray(action.payload); } else { state.components = _objectSpread({}, action.payload); } @@ -10697,13 +11496,13 @@ var layout = function layout() { }; /* harmony default export */ __webpack_exports__["default"] = (layout); -/***/ }, +/***/ }), -/***/ "./src/reducers/paths.js" +/***/ "./src/reducers/paths.js": /*!*******************************!*\ !*** ./src/reducers/paths.js ***! \*******************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -10723,13 +11522,13 @@ var paths = function paths() { }; /* harmony default export */ __webpack_exports__["default"] = (paths); -/***/ }, +/***/ }), -/***/ "./src/reducers/profile.js" +/***/ "./src/reducers/profile.js": /*!*********************************!*\ !*** ./src/reducers/profile.js ***! \*********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -10820,19 +11619,19 @@ var profile = function profile() { }; /* harmony default export */ __webpack_exports__["default"] = (profile); -/***/ }, +/***/ }), -/***/ "./src/reducers/reducer.js" +/***/ "./src/reducers/reducer.js": /*!*********************************!*\ !*** ./src/reducers/reducer.js ***! \*********************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ apiRequests: () => (/* binding */ apiRequests), -/* harmony export */ createReducer: () => (/* binding */ createReducer) +/* harmony export */ apiRequests: function() { return /* binding */ apiRequests; }, +/* harmony export */ createReducer: function() { return /* binding */ createReducer; } /* harmony export */ }); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/assoc.js"); /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ramda */ "./node_modules/ramda/es/forEach.js"); @@ -10859,6 +11658,10 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _callbackJobs__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./callbackJobs */ "./src/reducers/callbackJobs.ts"); /* harmony import */ var _loading__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./loading */ "./src/reducers/loading.ts"); /* harmony import */ var _wrapper_wrapping__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../wrapper/wrapping */ "./src/wrapper/wrapping.ts"); +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } @@ -10904,7 +11707,7 @@ var layoutHashes = function layoutHashes() { if (itempath) { var prefixStr = (0,_wrapper_wrapping__WEBPACK_IMPORTED_MODULE_24__.stringifyPath)(itempath); // Remove all hashes for keys starting with prefixStr - return Object.fromEntries(Object.entries(state).filter(_ref => { + return Object.fromEntries(Object.entries(state).filter(function (_ref) { var _ref2 = _slicedToArray(_ref, 1), key = _ref2[0]; return !key.startsWith(prefixStr); @@ -10930,7 +11733,7 @@ function mainReducer() { layoutHashes, loading: _loading__WEBPACK_IMPORTED_MODULE_23__["default"] }; - (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(r => { + (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(function (r) { parts[r] = (0,_api__WEBPACK_IMPORTED_MODULE_9__["default"])(r); }, apiRequests); parts.callbackJobs = _callbackJobs__WEBPACK_IMPORTED_MODULE_22__["default"]; @@ -10956,7 +11759,7 @@ function getInputHistoryState(payload, state, recordChanges) { id, props: {} }; - (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(props).forEach(propKey => { + (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(props).forEach(function (propKey) { if ((0,_actions_dependencies_ts__WEBPACK_IMPORTED_MODULE_8__.getCallbacksByInput)(graphs, paths, id, propKey).length) { historyEntry.props[propKey] = refProps[propKey]; } @@ -10985,7 +11788,7 @@ function recordHistory(reducer) { var _historyEntry = getInputHistoryState(payload, nextState); if (_historyEntry && !(0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(_historyEntry.props)) { nextState.history = { - past: [...nextState.history.past, state.history.present], + past: [].concat(_toConsumableArray(nextState.history.past), [state.history.present]), present: _historyEntry, future: [] }; @@ -11022,18 +11825,18 @@ function createReducer() { return reloaderReducer(recordHistory(mainReducer())); } -/***/ }, +/***/ }), -/***/ "./src/registry.js" +/***/ "./src/registry.js": /*!*************************!*\ !*** ./src/registry.js ***! \*************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony default export */ __webpack_exports__["default"] = ({ - resolve: component => { + resolve: function resolve(component) { var type = component.type, namespace = component.namespace; var ns = window[namespace]; @@ -11047,13 +11850,13 @@ __webpack_require__.r(__webpack_exports__); } }); -/***/ }, +/***/ }), -/***/ "./node_modules/cookie/dist/index.js" +/***/ "./node_modules/cookie/dist/index.js": /*!*******************************************!*\ !*** ./node_modules/cookie/dist/index.js ***! \*******************************************/ -(__unused_webpack_module, exports) { +/***/ (function(__unused_webpack_module, exports) { "use strict"; @@ -11061,8 +11864,9 @@ __webpack_require__.r(__webpack_exports__); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } -function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } -function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } Object.defineProperty(exports, "__esModule", ({ value: true })); @@ -11139,11 +11943,11 @@ var pathValueRegExp = /^[\u0020-\u003A\u003D-\u007E]*$/; */ var maxAgeRegExp = /^-?\d+$/; var __toString = Object.prototype.toString; -var NullObject = /* @__PURE__ */(() => { +var NullObject = /* @__PURE__ */function () { var C = function C() {}; C.prototype = Object.create(null); return C; -})(); +}(); /** * Parse a `Cookie` header. * @@ -11197,11 +12001,11 @@ function stringifyCookie(cookie, options) { return cookieStrings.join("; "); } function stringifySetCookie(_name, _val, _opts) { - var cookie = typeof _name === "object" ? _name : _objectSpread(_objectSpread({}, _opts), {}, { + var cookie = _typeof(_name) === "object" ? _name : _objectSpread(_objectSpread({}, _opts), {}, { name: _name, value: String(_val) }); - var options = typeof _val === "object" ? _val : _opts; + var options = _typeof(_val) === "object" ? _val : _opts; var enc = (options === null || options === void 0 ? void 0 : options.encode) || encodeURIComponent; if (!cookieNameRegExp.test(cookie.name)) { throw new TypeError("argument name is invalid: ".concat(cookie.name)); @@ -11395,26 +12199,31 @@ function isDate(val) { return __toString.call(val) === "[object Date]"; } -/***/ }, +/***/ }), -/***/ "./node_modules/cytoscape-fcose/cytoscape-fcose.js" +/***/ "./node_modules/cytoscape-fcose/cytoscape-fcose.js": /*!*********************************************************!*\ !*** ./node_modules/cytoscape-fcose/cytoscape-fcose.js ***! \*********************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { +/* module decorator */ module = __webpack_require__.nmd(module); +var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } (function webpackUniversalModuleDefinition(root, factory) { - if (true) module.exports = factory(__webpack_require__(/*! cose-base */ "./node_modules/cose-base/cose-base.js"));else // removed by dead control flow + if (( false ? 0 : _typeof(exports)) === 'object' && ( false ? 0 : _typeof(module)) === 'object') module.exports = factory(__webpack_require__(/*! cose-base */ "./node_modules/cose-base/cose-base.js"));else if (true) !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! cose-base */ "./node_modules/cose-base/cose-base.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), + __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? + (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));else // removed by dead control flow {} })(this, function (__WEBPACK_EXTERNAL_MODULE__140__) { - return /******/(() => { + return /******/function () { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = { - /***/658: (/***/module => { + /***/658: (/***/function _(module) { // Simple, internal Object.assign() polyfill for options objects etc. module.exports = Object.assign != null ? Object.assign.bind(Object) : function (tgt) { @@ -11431,7 +12240,7 @@ function isDate(val) { /***/ }), - /***/548: (/***/(module, __unused_webpack_exports, __nested_webpack_require_1248__) => { + /***/548: (/***/function _(module, __unused_webpack_exports, __nested_webpack_require_1743__) { var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; @@ -11470,7 +12279,7 @@ function isDate(val) { * Auxiliary functions */ - var LinkedList = __nested_webpack_require_1248__(140).layoutBase.LinkedList; + var LinkedList = __nested_webpack_require_1743__(140).layoutBase.LinkedList; var auxiliary = {}; // get the top most nodes @@ -11730,19 +12539,19 @@ function isDate(val) { /***/ }), - /***/816: (/***/(module, __unused_webpack_exports, __nested_webpack_require_13530__) => { + /***/816: (/***/function _(module, __unused_webpack_exports, __nested_webpack_require_14032__) { /** The implementation of the postprocessing part that applies CoSE layout over the spectral layout */ - var aux = __nested_webpack_require_13530__(548); - var CoSELayout = __nested_webpack_require_13530__(140).CoSELayout; - var CoSENode = __nested_webpack_require_13530__(140).CoSENode; - var PointD = __nested_webpack_require_13530__(140).layoutBase.PointD; - var DimensionD = __nested_webpack_require_13530__(140).layoutBase.DimensionD; - var LayoutConstants = __nested_webpack_require_13530__(140).layoutBase.LayoutConstants; - var FDLayoutConstants = __nested_webpack_require_13530__(140).layoutBase.FDLayoutConstants; - var CoSEConstants = __nested_webpack_require_13530__(140).CoSEConstants; + var aux = __nested_webpack_require_14032__(548); + var CoSELayout = __nested_webpack_require_14032__(140).CoSELayout; + var CoSENode = __nested_webpack_require_14032__(140).CoSENode; + var PointD = __nested_webpack_require_14032__(140).layoutBase.PointD; + var DimensionD = __nested_webpack_require_14032__(140).layoutBase.DimensionD; + var LayoutConstants = __nested_webpack_require_14032__(140).layoutBase.LayoutConstants; + var FDLayoutConstants = __nested_webpack_require_14032__(140).layoutBase.FDLayoutConstants; + var CoSEConstants = __nested_webpack_require_14032__(140).CoSEConstants; // main function that cose layout is processed var coseLayout = function coseLayout(options, spectralResult) { @@ -11956,7 +12765,7 @@ function isDate(val) { /***/ }), - /***/212: (/***/(module, __unused_webpack_exports, __nested_webpack_require_26788__) => { + /***/212: (/***/function _(module, __unused_webpack_exports, __nested_webpack_require_27297__) { var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { @@ -11983,11 +12792,11 @@ function isDate(val) { The implementation of the fcose layout algorithm */ - var assign = __nested_webpack_require_26788__(658); - var aux = __nested_webpack_require_26788__(548); - var _require = __nested_webpack_require_26788__(657), + var assign = __nested_webpack_require_27297__(658); + var aux = __nested_webpack_require_27297__(548); + var _require = __nested_webpack_require_27297__(657), spectralLayout = _require.spectralLayout; - var _require2 = __nested_webpack_require_26788__(816), + var _require2 = __nested_webpack_require_27297__(816), coseLayout = _require2.coseLayout; var defaults = Object.freeze({ // 'draft', 'default' or 'proof' @@ -12437,14 +13246,14 @@ function isDate(val) { /***/ }), - /***/657: (/***/(module, __unused_webpack_exports, __nested_webpack_require_51060__) => { + /***/657: (/***/function _(module, __unused_webpack_exports, __nested_webpack_require_51576__) { /** The implementation of the spectral layout that is the first part of the fcose layout algorithm */ - var aux = __nested_webpack_require_51060__(548); - var Matrix = __nested_webpack_require_51060__(140).layoutBase.Matrix; - var SVD = __nested_webpack_require_51060__(140).layoutBase.SVD; + var aux = __nested_webpack_require_51576__(548); + var Matrix = __nested_webpack_require_51576__(140).layoutBase.Matrix; + var SVD = __nested_webpack_require_51576__(140).layoutBase.SVD; // main function that spectral layout is processed var spectralLayout = function spectralLayout(options) { @@ -12851,8 +13660,8 @@ function isDate(val) { /***/ }), - /***/579: (/***/(module, __unused_webpack_exports, __nested_webpack_require_67495__) => { - var impl = __nested_webpack_require_67495__(212); + /***/579: (/***/function _(module, __unused_webpack_exports, __nested_webpack_require_68018__) { + var impl = __nested_webpack_require_68018__(212); // registers the extension on a cytoscape lib ref var register = function register(cytoscape) { @@ -12870,7 +13679,7 @@ function isDate(val) { /***/ }), - /***/140: (/***/module => { + /***/140: (/***/function _(module) { module.exports = __WEBPACK_EXTERNAL_MODULE__140__; /***/ @@ -12885,7 +13694,7 @@ function isDate(val) { /******/ /******/ // The require function /******/ - function __nested_webpack_require_68454__(moduleId) { + function __nested_webpack_require_68983__(moduleId) { /******/ // Check if module is in cache /******/var cachedModule = __webpack_module_cache__[moduleId]; /******/ @@ -12904,7 +13713,7 @@ function isDate(val) { /******/ /******/ // Execute the module function /******/ - __webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_68454__); + __webpack_modules__[moduleId](module, module.exports, __nested_webpack_require_68983__); /******/ /******/ // Return the exports of the module /******/ @@ -12918,32 +13727,45 @@ function isDate(val) { /******/ // Load entry module and return exports /******/ // This entry module is referenced by other modules so it can't be inlined /******/ - var __nested_webpack_exports__ = __nested_webpack_require_68454__(579); + var __nested_webpack_exports__ = __nested_webpack_require_68983__(579); /******/ /******/ return __nested_webpack_exports__; /******/ - })(); + }(); }); -/***/ }, +/***/ }), -/***/ "./node_modules/react-cytoscapejs/dist/react-cytoscape.modern.js" +/***/ "./node_modules/react-cytoscapejs/dist/react-cytoscape.modern.js": /*!***********************************************************************!*\ !*** ./node_modules/react-cytoscapejs/dist/react-cytoscape.modern.js ***! \***********************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ w) +/* harmony export */ "default": function() { return /* binding */ w; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "prop-types"); /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var cytoscape__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! cytoscape */ "./node_modules/cytoscape/dist/cytoscape.esm.mjs"); +function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } +function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } +function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } +function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } +function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } +function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } +function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } +function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } +function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } +function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } @@ -12988,21 +13810,31 @@ var o = (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string), wheelSensitivity: a, pixelRatio: r([o, s]) }, - p = (e, t) => { - if (((e, t) => null == e || null == t)(e, t) && (null != e || null != t)) return !0; + p = function p(e, t) { + if (function (e, t) { + return null == e || null == t; + }(e, t) && (null != e || null != t)) return !0; if (e === t) return !1; - if ("object" != typeof e || "object" != typeof t) return e !== t; + if ("object" != _typeof(e) || "object" != _typeof(t)) return e !== t; var n = Object.keys(e), o = Object.keys(t), - l = n => e[n] !== t[n]; + l = function l(n) { + return e[n] !== t[n]; + }; return n.length !== o.length || !(!n.some(l) && !o.some(l)); }, - m = (e, t) => null != e ? e[t] : null, + m = function m(e, t) { + return null != e ? e[t] : null; + }, y = { diff: p, get: m, - toJson: e => e, - forEach: (e, t) => e.forEach(t), + toJson: function toJson(e) { + return e; + }, + forEach: function forEach(e, t) { + return e.forEach(t); + }, elements: [{ data: { id: "a", @@ -13032,146 +13864,177 @@ var o = (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string), y: 0 } }, - h = (e, t, n, o) => n(m(e, o), m(t, o)), - b = (e, t, n, o, l, s, a) => { - e.batch(() => { - (o === p || h(t, n, o, "elements")) && x(e, m(t, "elements"), m(n, "elements"), l, s, a, o), h(t, n, o, "stylesheet") && E(e, m(t, "stylesheet"), m(n, "stylesheet"), l), ["zoom", "minZoom", "maxZoom", "zoomingEnabled", "userZoomingEnabled", "pan", "panningEnabled", "userPanningEnabled", "boxSelectionEnabled", "autoungrabify", "autolock", "autounselectify"].forEach(s => { + h = function h(e, t, n, o) { + return n(m(e, o), m(t, o)); + }, + b = function b(e, t, n, o, l, s, a) { + e.batch(function () { + (o === p || h(t, n, o, "elements")) && x(e, m(t, "elements"), m(n, "elements"), l, s, a, o), h(t, n, o, "stylesheet") && E(e, m(t, "stylesheet"), m(n, "stylesheet"), l), ["zoom", "minZoom", "maxZoom", "zoomingEnabled", "userZoomingEnabled", "pan", "panningEnabled", "userPanningEnabled", "boxSelectionEnabled", "autoungrabify", "autolock", "autounselectify"].forEach(function (s) { h(t, n, o, s) && f(e, s, m(t, s), m(n, s), l); }); }), h(t, n, o, "layout") && g(e, m(t, "layout"), m(n, "layout"), l); }, - f = (e, t, n, o, l) => { + f = function f(e, t, n, o, l) { e[t](l(o)); }, - g = (e, t, n, o) => { + g = function g(e, t, n, o) { var l = o(n); null != l && e.layout(l).run(); }, - E = (e, t, n, o) => { + E = function E(e, t, n, o) { var l = e.style(); null != l && l.fromJson(o(n)).update(); }, - x = (e, t, n, o, l, s, a) => { + x = function x(e, t, n, o, l, s, a) { var i = [], r = e.collection(), c = [], u = {}, d = {}, - p = e => l(l(e, "data"), "id"); - s(n, e => { + p = function p(e) { + return l(l(e, "data"), "id"); + }; + s(n, function (e) { var t = p(e); d[t] = e; - }), null != t && s(t, t => { + }), null != t && s(t, function (t) { var n = p(t); - u[n] = t, (e => null != d[e])(n) || r.merge(e.getElementById(n)); - }), s(n, e => { + u[n] = t, function (e) { + return null != d[e]; + }(n) || r.merge(e.getElementById(n)); + }), s(n, function (e) { var t = p(e), - n = (e => u[e])(t); - (e => null != u[e])(t) ? c.push({ + n = function (e) { + return u[e]; + }(t); + (function (e) { + return null != u[e]; + })(t) ? c.push({ ele1: n, ele2: e }) : i.push(o(e)); - }), r.length > 0 && e.remove(r), i.length > 0 && e.add(i), c.forEach(_ref => { + }), r.length > 0 && e.remove(r), i.length > 0 && e.add(i), c.forEach(function (_ref) { var t = _ref.ele1, n = _ref.ele2; return O(e, t, n, o, l, a); }); }, - O = (e, t, n, o, l, s) => { + O = function O(e, t, n, o, l, s) { var a = l(l(n, "data"), "id"), i = e.getElementById(a), r = {}; - ["data", "position", "selected", "selectable", "locked", "grabbable", "classes"].forEach(e => { + ["data", "position", "selected", "selectable", "locked", "grabbable", "classes"].forEach(function (e) { var a = l(n, e); s(a, l(t, e)) && (r[e] = o(a)); }); var c = l(n, "scratch"); s(c, l(t, "scratch")) && i.scratch(o(c)), Object.keys(r).length > 0 && i.json(r); }; -class w extends (react__WEBPACK_IMPORTED_MODULE_0___default().Component) { - static get propTypes() { - return d; - } - static get defaultProps() { - return y; +var w = /*#__PURE__*/function (_e$Component) { + function w(t) { + var _this; + _classCallCheck(this, w); + _this = _callSuper(this, w, [t]), _this.displayName = "CytoscapeComponent", _this.containerRef = react__WEBPACK_IMPORTED_MODULE_0___default().createRef(); + return _this; } - static normalizeElements(e) { - if (null != e.length) return e; - { - var _t = e.nodes, - _n = e.edges; - return null == _t && (_t = []), null == _n && (_n = []), _t.concat(_n); - } - } - constructor(t) { - super(t), this.displayName = "CytoscapeComponent", this.containerRef = react__WEBPACK_IMPORTED_MODULE_0___default().createRef(); - } - componentDidMount() { - var e = this.containerRef.current, - _this$props = this.props, - t = _this$props.global, - o = _this$props.headless, - l = _this$props.styleEnabled, - s = _this$props.hideEdgesOnViewport, - a = _this$props.textureOnViewport, - i = _this$props.motionBlur, - r = _this$props.motionBlurOpacity, - c = _this$props.wheelSensitivity, - u = _this$props.pixelRatio, - d = this._cy = new cytoscape__WEBPACK_IMPORTED_MODULE_2__["default"]({ - container: e, - headless: o, - styleEnabled: l, - hideEdgesOnViewport: s, - textureOnViewport: a, - motionBlur: i, - motionBlurOpacity: r, - wheelSensitivity: c, - pixelRatio: u + _inherits(w, _e$Component); + return _createClass(w, [{ + key: "componentDidMount", + value: function componentDidMount() { + var e = this.containerRef.current, + _this$props = this.props, + t = _this$props.global, + o = _this$props.headless, + l = _this$props.styleEnabled, + s = _this$props.hideEdgesOnViewport, + a = _this$props.textureOnViewport, + i = _this$props.motionBlur, + r = _this$props.motionBlurOpacity, + c = _this$props.wheelSensitivity, + u = _this$props.pixelRatio, + d = this._cy = new cytoscape__WEBPACK_IMPORTED_MODULE_2__["default"]({ + container: e, + headless: o, + styleEnabled: l, + hideEdgesOnViewport: s, + textureOnViewport: a, + motionBlur: i, + motionBlurOpacity: r, + wheelSensitivity: c, + pixelRatio: u + }); + t && (window[t] = d), this.updateCytoscape(null, this.props); + } + }, { + key: "updateCytoscape", + value: function updateCytoscape(e, t) { + var n = this._cy, + o = t.diff, + l = t.toJson, + s = t.get, + a = t.forEach; + b(n, e, t, o, l, s, a), null != t.cy && t.cy(n); + } + }, { + key: "componentDidUpdate", + value: function componentDidUpdate(e) { + this.updateCytoscape(e, this.props); + } + }, { + key: "componentWillUnmount", + value: function componentWillUnmount() { + this._cy.destroy(); + } + }, { + key: "render", + value: function render() { + var _this$props2 = this.props, + t = _this$props2.id, + n = _this$props2.className, + o = _this$props2.style; + return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + ref: this.containerRef, + id: t, + className: n, + style: o }); - t && (window[t] = d), this.updateCytoscape(null, this.props); - } - updateCytoscape(e, t) { - var n = this._cy, - o = t.diff, - l = t.toJson, - s = t.get, - a = t.forEach; - b(n, e, t, o, l, s, a), null != t.cy && t.cy(n); - } - componentDidUpdate(e) { - this.updateCytoscape(e, this.props); - } - componentWillUnmount() { - this._cy.destroy(); - } - render() { - var _this$props2 = this.props, - t = _this$props2.id, - n = _this$props2.className, - o = _this$props2.style; - return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - ref: this.containerRef, - id: t, - className: n, - style: o - }); - } -} + } + }], [{ + key: "propTypes", + get: function get() { + return d; + } + }, { + key: "defaultProps", + get: function get() { + return y; + } + }, { + key: "normalizeElements", + value: function normalizeElements(e) { + if (null != e.length) return e; + { + var _t = e.nodes, + _n = e.edges; + return null == _t && (_t = []), null == _n && (_n = []), _t.concat(_n); + } + } + }]); +}((react__WEBPACK_IMPORTED_MODULE_0___default().Component)); -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/components/Context.js" +/***/ "./node_modules/react-redux/es/components/Context.js": /*!***********************************************************!*\ !*** ./node_modules/react-redux/es/components/Context.js ***! \***********************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ ReactReduxContext: () => (/* binding */ ReactReduxContext) +/* harmony export */ ReactReduxContext: function() { return /* binding */ ReactReduxContext; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); @@ -13182,13 +14045,13 @@ if (true) { } /* harmony default export */ __webpack_exports__["default"] = (ReactReduxContext); -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/components/Provider.js" +/***/ "./node_modules/react-redux/es/components/Provider.js": /*!************************************************************!*\ !*** ./node_modules/react-redux/es/components/Provider.js ***! \************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -13206,23 +14069,27 @@ function Provider(_ref) { context = _ref.context, children = _ref.children, serverState = _ref.serverState; - var contextValue = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => { + var contextValue = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () { var subscription = (0,_utils_Subscription__WEBPACK_IMPORTED_MODULE_2__.createSubscription)(store); return { store, subscription, - getServerState: serverState ? () => serverState : undefined + getServerState: serverState ? function () { + return serverState; + } : undefined }; }, [store, serverState]); - var previousState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => store.getState(), [store]); - (0,_utils_useIsomorphicLayoutEffect__WEBPACK_IMPORTED_MODULE_3__.useIsomorphicLayoutEffect)(() => { + var previousState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () { + return store.getState(); + }, [store]); + (0,_utils_useIsomorphicLayoutEffect__WEBPACK_IMPORTED_MODULE_3__.useIsomorphicLayoutEffect)(function () { var subscription = contextValue.subscription; subscription.onStateChange = subscription.notifyNestedSubs; subscription.trySubscribe(); if (previousState !== store.getState()) { subscription.notifyNestedSubs(); } - return () => { + return function () { subscription.tryUnsubscribe(); subscription.onStateChange = undefined; }; @@ -13235,18 +14102,18 @@ function Provider(_ref) { } /* harmony default export */ __webpack_exports__["default"] = (Provider); -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/components/connect.js" +/***/ "./node_modules/react-redux/es/components/connect.js": /*!***********************************************************!*\ !*** ./node_modules/react-redux/es/components/connect.js ***! \***********************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ initializeConnect: () => (/* binding */ initializeConnect) +/* harmony export */ initializeConnect: function() { return /* binding */ initializeConnect; } /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js"); @@ -13267,10 +14134,14 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _utils_useSyncExternalStore__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../utils/useSyncExternalStore */ "./node_modules/react-redux/es/utils/useSyncExternalStore.js"); function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } -function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } +function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } +function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } var _excluded = ["reactReduxForwardedRef"]; @@ -13290,7 +14161,7 @@ var _excluded = ["reactReduxForwardedRef"]; var useSyncExternalStore = _utils_useSyncExternalStore__WEBPACK_IMPORTED_MODULE_14__.notInitialized; -var initializeConnect = fn => { +var initializeConnect = function initializeConnect(fn) { useSyncExternalStore = fn; }; // Define some constant arrays just to avoid re-creating these @@ -13298,7 +14169,7 @@ var EMPTY_ARRAY = [null, 0]; var NO_SUBSCRIPTION_ARRAY = [null, null]; // Attempts to stringify whatever not-really-a-component value we were given // for logging in an error message -var stringifyComponent = Comp => { +var stringifyComponent = function stringifyComponent(Comp) { try { return JSON.stringify(Comp); } catch (err) { @@ -13311,7 +14182,9 @@ var stringifyComponent = Comp => { // - we extract this to a separate function to avoid closing over values // and causing memory leaks function useIsomorphicLayoutEffectWithArgs(effectFunc, effectArgs, dependencies) { - (0,_utils_useIsomorphicLayoutEffect__WEBPACK_IMPORTED_MODULE_10__.useIsomorphicLayoutEffect)(() => effectFunc(...effectArgs), dependencies); + (0,_utils_useIsomorphicLayoutEffect__WEBPACK_IMPORTED_MODULE_10__.useIsomorphicLayoutEffect)(function () { + return effectFunc.apply(void 0, _toConsumableArray(effectArgs)); + }, dependencies); } // Effect callback, extracted: assign the latest props values to refs for later usage function captureWrapperProps(lastWrapperProps, lastChildProps, renderIsScheduled, wrapperProps, @@ -13332,12 +14205,12 @@ function subscribeUpdates(shouldHandleStateChanges, store, subscription, childPr // forceComponentUpdateDispatch: React.Dispatch, additionalSubscribeListener) { // If we're not subscribed to the store, nothing to do here - if (!shouldHandleStateChanges) return () => {}; // Capture values for checking if and when this component unmounts + if (!shouldHandleStateChanges) return function () {}; // Capture values for checking if and when this component unmounts var didUnsubscribe = false; var lastThrownError = null; // We'll run this callback every time a store subscription update propagates to this component - var checkForUpdates = () => { + var checkForUpdates = function checkForUpdates() { if (didUnsubscribe || !isMounted.current) { // Don't run stale listeners. // Redux doesn't guarantee unsubscriptions happen until next dispatch. @@ -13381,7 +14254,7 @@ additionalSubscribeListener) { // changed since we began. checkForUpdates(); - var unsubscribeWrapper = () => { + var unsubscribeWrapper = function unsubscribeWrapper() { didUnsubscribe = true; subscription.tryUnsubscribe(); subscription.onStateChange = null; @@ -13397,7 +14270,9 @@ additionalSubscribeListener) { return unsubscribeWrapper; } // Reducer initial state creation for our update reducer -var initStateUpdates = () => EMPTY_ARRAY; +var initStateUpdates = function initStateUpdates() { + return EMPTY_ARRAY; +}; function strictEqual(a, b) { return a === b; } @@ -13453,7 +14328,7 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { var initMapDispatchToProps = (0,_connect_mapDispatchToProps__WEBPACK_IMPORTED_MODULE_6__.mapDispatchToPropsFactory)(mapDispatchToProps); var initMergeProps = (0,_connect_mergeProps__WEBPACK_IMPORTED_MODULE_8__.mergePropsFactory)(mergeProps); var shouldHandleStateChanges = Boolean(mapStateToProps); - var wrapWithConnect = WrappedComponent => { + var wrapWithConnect = function wrapWithConnect(WrappedComponent) { if ( true && !(0,react_is__WEBPACK_IMPORTED_MODULE_4__.isValidElementType)(WrappedComponent)) { throw new Error("You must pass a component to the function returned by connect. Instead received ".concat(stringifyComponent(WrappedComponent))); } @@ -13475,7 +14350,7 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { areMergedPropsEqual }; function ConnectFunction(props) { - var _useMemo = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(() => { + var _useMemo = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () { // Distinguish between actual "data" props that were passed to the wrapper component, // and values needed to control behavior (forwarded refs, alternate context instances). // To maintain the wrapperProps object reference, memoize this destructuring. @@ -13487,7 +14362,7 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { propsContext = _useMemo2[0], reactReduxForwardedRef = _useMemo2[1], wrapperProps = _useMemo2[2]; - var ContextToUse = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(() => { + var ContextToUse = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () { // Users may optionally pass in a custom context instance to use instead of our ReactReduxContext. // Memoize the check that determines which context instance we should use. return propsContext && propsContext.Consumer && @@ -13507,12 +14382,12 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { var store = didStoreComeFromProps ? props.store : contextValue.store; var getServerState = didStoreComeFromContext ? contextValue.getServerState : store.getState; - var childPropsSelector = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(() => { + var childPropsSelector = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () { // The child props selector needs the store reference as an input. // Re-create this selector whenever the store changes. return (0,_connect_selectorFactory__WEBPACK_IMPORTED_MODULE_5__["default"])(store.dispatch, selectorFactoryOptions); }, [store]); - var _useMemo3 = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(() => { + var _useMemo3 = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () { if (!shouldHandleStateChanges) return NO_SUBSCRIPTION_ARRAY; // This Subscription's source should match where store came from: props vs. context. A component // connected to the store via props shouldn't use subscription from context, or vice versa. @@ -13529,7 +14404,7 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { notifyNestedSubs = _useMemo4[1]; // Determine what {store, subscription} value should be put into nested context, if necessary, // and memoize that value to avoid unnecessary context updates. - var overriddenContextValue = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(() => { + var overriddenContextValue = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () { if (didStoreComeFromProps) { // This component is directly subscribed to a store from props. // We don't want descendants reading from this store - pass down whatever @@ -13550,14 +14425,14 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { var isProcessingDispatch = (0,react__WEBPACK_IMPORTED_MODULE_3__.useRef)(false); var isMounted = (0,react__WEBPACK_IMPORTED_MODULE_3__.useRef)(false); var latestSubscriptionCallbackError = (0,react__WEBPACK_IMPORTED_MODULE_3__.useRef)(); - (0,_utils_useIsomorphicLayoutEffect__WEBPACK_IMPORTED_MODULE_10__.useIsomorphicLayoutEffect)(() => { + (0,_utils_useIsomorphicLayoutEffect__WEBPACK_IMPORTED_MODULE_10__.useIsomorphicLayoutEffect)(function () { isMounted.current = true; - return () => { + return function () { isMounted.current = false; }; }, []); - var actualChildPropsSelector = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(() => { - var selector = () => { + var actualChildPropsSelector = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () { + var selector = function selector() { // Tricky logic here: // - This render may have been triggered by a Redux store update that produced new child props // - However, we may have gotten new wrapper props after that @@ -13578,10 +14453,10 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { // about useLayoutEffect in SSR, so we try to detect environment and fall back to // just useEffect instead to avoid the warning, since neither will run anyway. - var subscribeForReact = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(() => { - var subscribe = reactListener => { + var subscribeForReact = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () { + var subscribe = function subscribe(reactListener) { if (!subscription) { - return () => {}; + return function () {}; } return subscribeUpdates(shouldHandleStateChanges, store, subscription, // @ts-ignore @@ -13597,7 +14472,9 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { subscribeForReact, // TODO This is incredibly hacky. We've already processed the store update and calculated new child props, // TODO and we're just passing that through so it triggers a re-render for us rather than relying on `uSES`. - actualChildPropsSelector, getServerState ? () => childPropsSelector(getServerState(), wrapperProps) : actualChildPropsSelector); + actualChildPropsSelector, getServerState ? function () { + return childPropsSelector(getServerState(), wrapperProps); + } : actualChildPropsSelector); } catch (err) { if (latestSubscriptionCallbackError.current) { ; @@ -13605,14 +14482,14 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { } throw err; } - (0,_utils_useIsomorphicLayoutEffect__WEBPACK_IMPORTED_MODULE_10__.useIsomorphicLayoutEffect)(() => { + (0,_utils_useIsomorphicLayoutEffect__WEBPACK_IMPORTED_MODULE_10__.useIsomorphicLayoutEffect)(function () { latestSubscriptionCallbackError.current = undefined; childPropsFromStoreUpdate.current = undefined; lastChildProps.current = actualChildProps; }); // Now that all that's done, we can finally try to actually render the child component. // We memoize the elements for the rendered child component as an optimization. - var renderedWrappedComponent = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(() => { + var renderedWrappedComponent = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () { return (/*#__PURE__*/ // @ts-ignore react__WEBPACK_IMPORTED_MODULE_3___default().createElement(WrappedComponent, (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, actualChildProps, { @@ -13622,7 +14499,7 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { }, [reactReduxForwardedRef, WrappedComponent, actualChildProps]); // If React sees the exact same element reference as last time, it bails out of re-rendering // that child, same as if it was wrapped in React.memo() or returned false from shouldComponentUpdate. - var renderedChild = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(() => { + var renderedChild = (0,react__WEBPACK_IMPORTED_MODULE_3__.useMemo)(function () { if (shouldHandleStateChanges) { // If this component is subscribed to store updates, we need to pass its own // subscription instance down to our descendants. That means rendering the same @@ -13659,91 +14536,100 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { } /* harmony default export */ __webpack_exports__["default"] = (connect); -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/connect/invalidArgFactory.js" +/***/ "./node_modules/react-redux/es/connect/invalidArgFactory.js": /*!******************************************************************!*\ !*** ./node_modules/react-redux/es/connect/invalidArgFactory.js ***! \******************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ createInvalidArgFactory: () => (/* binding */ createInvalidArgFactory) +/* harmony export */ createInvalidArgFactory: function() { return /* binding */ createInvalidArgFactory; } /* harmony export */ }); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function createInvalidArgFactory(arg, name) { - return (dispatch, options) => { - throw new Error("Invalid value of type ".concat(typeof arg, " for ").concat(name, " argument when connecting component ").concat(options.wrappedComponentName, ".")); + return function (dispatch, options) { + throw new Error("Invalid value of type ".concat(_typeof(arg), " for ").concat(name, " argument when connecting component ").concat(options.wrappedComponentName, ".")); }; } -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/connect/mapDispatchToProps.js" +/***/ "./node_modules/react-redux/es/connect/mapDispatchToProps.js": /*!*******************************************************************!*\ !*** ./node_modules/react-redux/es/connect/mapDispatchToProps.js ***! \*******************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ mapDispatchToPropsFactory: () => (/* binding */ mapDispatchToPropsFactory) +/* harmony export */ mapDispatchToPropsFactory: function() { return /* binding */ mapDispatchToPropsFactory; } /* harmony export */ }); /* harmony import */ var _utils_bindActionCreators__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/bindActionCreators */ "./node_modules/react-redux/es/utils/bindActionCreators.js"); /* harmony import */ var _wrapMapToProps__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./wrapMapToProps */ "./node_modules/react-redux/es/connect/wrapMapToProps.js"); /* harmony import */ var _invalidArgFactory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./invalidArgFactory */ "./node_modules/react-redux/es/connect/invalidArgFactory.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function mapDispatchToPropsFactory(mapDispatchToProps) { - return mapDispatchToProps && typeof mapDispatchToProps === 'object' ? (0,_wrapMapToProps__WEBPACK_IMPORTED_MODULE_1__.wrapMapToPropsConstant)(dispatch => - // @ts-ignore - (0,_utils_bindActionCreators__WEBPACK_IMPORTED_MODULE_0__["default"])(mapDispatchToProps, dispatch)) : !mapDispatchToProps ? (0,_wrapMapToProps__WEBPACK_IMPORTED_MODULE_1__.wrapMapToPropsConstant)(dispatch => ({ - dispatch - })) : typeof mapDispatchToProps === 'function' ? + return mapDispatchToProps && _typeof(mapDispatchToProps) === 'object' ? (0,_wrapMapToProps__WEBPACK_IMPORTED_MODULE_1__.wrapMapToPropsConstant)(function (dispatch) { + return ( + // @ts-ignore + (0,_utils_bindActionCreators__WEBPACK_IMPORTED_MODULE_0__["default"])(mapDispatchToProps, dispatch) + ); + }) : !mapDispatchToProps ? (0,_wrapMapToProps__WEBPACK_IMPORTED_MODULE_1__.wrapMapToPropsConstant)(function (dispatch) { + return { + dispatch + }; + }) : typeof mapDispatchToProps === 'function' ? // @ts-ignore (0,_wrapMapToProps__WEBPACK_IMPORTED_MODULE_1__.wrapMapToPropsFunc)(mapDispatchToProps, 'mapDispatchToProps') : (0,_invalidArgFactory__WEBPACK_IMPORTED_MODULE_2__.createInvalidArgFactory)(mapDispatchToProps, 'mapDispatchToProps'); } -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/connect/mapStateToProps.js" +/***/ "./node_modules/react-redux/es/connect/mapStateToProps.js": /*!****************************************************************!*\ !*** ./node_modules/react-redux/es/connect/mapStateToProps.js ***! \****************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ mapStateToPropsFactory: () => (/* binding */ mapStateToPropsFactory) +/* harmony export */ mapStateToPropsFactory: function() { return /* binding */ mapStateToPropsFactory; } /* harmony export */ }); /* harmony import */ var _wrapMapToProps__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./wrapMapToProps */ "./node_modules/react-redux/es/connect/wrapMapToProps.js"); /* harmony import */ var _invalidArgFactory__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./invalidArgFactory */ "./node_modules/react-redux/es/connect/invalidArgFactory.js"); function mapStateToPropsFactory(mapStateToProps) { - return !mapStateToProps ? (0,_wrapMapToProps__WEBPACK_IMPORTED_MODULE_0__.wrapMapToPropsConstant)(() => ({})) : typeof mapStateToProps === 'function' ? + return !mapStateToProps ? (0,_wrapMapToProps__WEBPACK_IMPORTED_MODULE_0__.wrapMapToPropsConstant)(function () { + return {}; + }) : typeof mapStateToProps === 'function' ? // @ts-ignore (0,_wrapMapToProps__WEBPACK_IMPORTED_MODULE_0__.wrapMapToPropsFunc)(mapStateToProps, 'mapStateToProps') : (0,_invalidArgFactory__WEBPACK_IMPORTED_MODULE_1__.createInvalidArgFactory)(mapStateToProps, 'mapStateToProps'); } -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/connect/mergeProps.js" +/***/ "./node_modules/react-redux/es/connect/mergeProps.js": /*!***********************************************************!*\ !*** ./node_modules/react-redux/es/connect/mergeProps.js ***! \***********************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ defaultMergeProps: () => (/* binding */ defaultMergeProps), -/* harmony export */ mergePropsFactory: () => (/* binding */ mergePropsFactory), -/* harmony export */ wrapMergePropsFunc: () => (/* binding */ wrapMergePropsFunc) +/* harmony export */ defaultMergeProps: function() { return /* binding */ defaultMergeProps; }, +/* harmony export */ mergePropsFactory: function() { return /* binding */ mergePropsFactory; }, +/* harmony export */ wrapMergePropsFunc: function() { return /* binding */ wrapMergePropsFunc; } /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _utils_verifyPlainObject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/verifyPlainObject */ "./node_modules/react-redux/es/utils/verifyPlainObject.js"); @@ -13775,22 +14661,24 @@ function wrapMergePropsFunc(mergeProps) { }; } function mergePropsFactory(mergeProps) { - return !mergeProps ? () => defaultMergeProps : typeof mergeProps === 'function' ? wrapMergePropsFunc(mergeProps) : (0,_invalidArgFactory__WEBPACK_IMPORTED_MODULE_2__.createInvalidArgFactory)(mergeProps, 'mergeProps'); + return !mergeProps ? function () { + return defaultMergeProps; + } : typeof mergeProps === 'function' ? wrapMergePropsFunc(mergeProps) : (0,_invalidArgFactory__WEBPACK_IMPORTED_MODULE_2__.createInvalidArgFactory)(mergeProps, 'mergeProps'); } -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/connect/selectorFactory.js" +/***/ "./node_modules/react-redux/es/connect/selectorFactory.js": /*!****************************************************************!*\ !*** ./node_modules/react-redux/es/connect/selectorFactory.js ***! \****************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ finalPropsSelectorFactory), -/* harmony export */ pureFinalPropsSelectorFactory: () => (/* binding */ pureFinalPropsSelectorFactory) +/* harmony export */ "default": function() { return /* binding */ finalPropsSelectorFactory; }, +/* harmony export */ pureFinalPropsSelectorFactory: function() { return /* binding */ pureFinalPropsSelectorFactory; } /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js"); /* harmony import */ var _verifySubselectors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./verifySubselectors */ "./node_modules/react-redux/es/connect/verifySubselectors.js"); @@ -13867,18 +14755,18 @@ function finalPropsSelectorFactory(dispatch, _ref) { return pureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, options); } -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/connect/verifySubselectors.js" +/***/ "./node_modules/react-redux/es/connect/verifySubselectors.js": /*!*******************************************************************!*\ !*** ./node_modules/react-redux/es/connect/verifySubselectors.js ***! \*******************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ verifySubselectors) +/* harmony export */ "default": function() { return /* binding */ verifySubselectors; } /* harmony export */ }); /* harmony import */ var _utils_warning__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/warning */ "./node_modules/react-redux/es/utils/warning.js"); @@ -13897,20 +14785,20 @@ function verifySubselectors(mapStateToProps, mapDispatchToProps, mergeProps) { verify(mergeProps, 'mergeProps'); } -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/connect/wrapMapToProps.js" +/***/ "./node_modules/react-redux/es/connect/wrapMapToProps.js": /*!***************************************************************!*\ !*** ./node_modules/react-redux/es/connect/wrapMapToProps.js ***! \***************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ getDependsOnOwnProps: () => (/* binding */ getDependsOnOwnProps), -/* harmony export */ wrapMapToPropsConstant: () => (/* binding */ wrapMapToPropsConstant), -/* harmony export */ wrapMapToPropsFunc: () => (/* binding */ wrapMapToPropsFunc) +/* harmony export */ getDependsOnOwnProps: function() { return /* binding */ getDependsOnOwnProps; }, +/* harmony export */ wrapMapToPropsConstant: function() { return /* binding */ wrapMapToPropsConstant; }, +/* harmony export */ wrapMapToPropsFunc: function() { return /* binding */ wrapMapToPropsFunc; } /* harmony export */ }); /* harmony import */ var _utils_verifyPlainObject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/verifyPlainObject */ "./node_modules/react-redux/es/utils/verifyPlainObject.js"); @@ -13977,27 +14865,27 @@ function wrapMapToPropsFunc(mapToProps, methodName) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/exports.js" +/***/ "./node_modules/react-redux/es/exports.js": /*!************************************************!*\ !*** ./node_modules/react-redux/es/exports.js ***! \************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Provider: () => (/* reexport safe */ _components_Provider__WEBPACK_IMPORTED_MODULE_0__["default"]), -/* harmony export */ ReactReduxContext: () => (/* reexport safe */ _components_Context__WEBPACK_IMPORTED_MODULE_2__.ReactReduxContext), -/* harmony export */ connect: () => (/* reexport safe */ _components_connect__WEBPACK_IMPORTED_MODULE_1__["default"]), -/* harmony export */ createDispatchHook: () => (/* reexport safe */ _hooks_useDispatch__WEBPACK_IMPORTED_MODULE_3__.createDispatchHook), -/* harmony export */ createSelectorHook: () => (/* reexport safe */ _hooks_useSelector__WEBPACK_IMPORTED_MODULE_4__.createSelectorHook), -/* harmony export */ createStoreHook: () => (/* reexport safe */ _hooks_useStore__WEBPACK_IMPORTED_MODULE_5__.createStoreHook), -/* harmony export */ shallowEqual: () => (/* reexport safe */ _utils_shallowEqual__WEBPACK_IMPORTED_MODULE_6__["default"]), -/* harmony export */ useDispatch: () => (/* reexport safe */ _hooks_useDispatch__WEBPACK_IMPORTED_MODULE_3__.useDispatch), -/* harmony export */ useSelector: () => (/* reexport safe */ _hooks_useSelector__WEBPACK_IMPORTED_MODULE_4__.useSelector), -/* harmony export */ useStore: () => (/* reexport safe */ _hooks_useStore__WEBPACK_IMPORTED_MODULE_5__.useStore) +/* harmony export */ Provider: function() { return /* reexport safe */ _components_Provider__WEBPACK_IMPORTED_MODULE_0__["default"]; }, +/* harmony export */ ReactReduxContext: function() { return /* reexport safe */ _components_Context__WEBPACK_IMPORTED_MODULE_2__.ReactReduxContext; }, +/* harmony export */ connect: function() { return /* reexport safe */ _components_connect__WEBPACK_IMPORTED_MODULE_1__["default"]; }, +/* harmony export */ createDispatchHook: function() { return /* reexport safe */ _hooks_useDispatch__WEBPACK_IMPORTED_MODULE_3__.createDispatchHook; }, +/* harmony export */ createSelectorHook: function() { return /* reexport safe */ _hooks_useSelector__WEBPACK_IMPORTED_MODULE_4__.createSelectorHook; }, +/* harmony export */ createStoreHook: function() { return /* reexport safe */ _hooks_useStore__WEBPACK_IMPORTED_MODULE_5__.createStoreHook; }, +/* harmony export */ shallowEqual: function() { return /* reexport safe */ _utils_shallowEqual__WEBPACK_IMPORTED_MODULE_6__["default"]; }, +/* harmony export */ useDispatch: function() { return /* reexport safe */ _hooks_useDispatch__WEBPACK_IMPORTED_MODULE_3__.useDispatch; }, +/* harmony export */ useSelector: function() { return /* reexport safe */ _hooks_useSelector__WEBPACK_IMPORTED_MODULE_4__.useSelector; }, +/* harmony export */ useStore: function() { return /* reexport safe */ _hooks_useStore__WEBPACK_IMPORTED_MODULE_5__.useStore; } /* harmony export */ }); /* harmony import */ var _components_Provider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./components/Provider */ "./node_modules/react-redux/es/components/Provider.js"); /* harmony import */ var _components_connect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/connect */ "./node_modules/react-redux/es/components/connect.js"); @@ -14017,19 +14905,19 @@ __webpack_require__.r(__webpack_exports__); -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/hooks/useDispatch.js" +/***/ "./node_modules/react-redux/es/hooks/useDispatch.js": /*!**********************************************************!*\ !*** ./node_modules/react-redux/es/hooks/useDispatch.js ***! \**********************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ createDispatchHook: () => (/* binding */ createDispatchHook), -/* harmony export */ useDispatch: () => (/* binding */ useDispatch) +/* harmony export */ createDispatchHook: function() { return /* binding */ createDispatchHook; }, +/* harmony export */ useDispatch: function() { return /* binding */ useDispatch; } /* harmony export */ }); /* harmony import */ var _components_Context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/Context */ "./node_modules/react-redux/es/components/Context.js"); /* harmony import */ var _useStore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./useStore */ "./node_modules/react-redux/es/hooks/useStore.js"); @@ -14077,18 +14965,18 @@ function createDispatchHook() { var useDispatch = /*#__PURE__*/createDispatchHook(); -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/hooks/useReduxContext.js" +/***/ "./node_modules/react-redux/es/hooks/useReduxContext.js": /*!**************************************************************!*\ !*** ./node_modules/react-redux/es/hooks/useReduxContext.js ***! \**************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ useReduxContext: () => (/* binding */ useReduxContext) +/* harmony export */ useReduxContext: function() { return /* binding */ useReduxContext; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); @@ -14120,20 +15008,20 @@ function useReduxContext() { return contextValue; } -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/hooks/useSelector.js" +/***/ "./node_modules/react-redux/es/hooks/useSelector.js": /*!**********************************************************!*\ !*** ./node_modules/react-redux/es/hooks/useSelector.js ***! \**********************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ createSelectorHook: () => (/* binding */ createSelectorHook), -/* harmony export */ initializeUseSelector: () => (/* binding */ initializeUseSelector), -/* harmony export */ useSelector: () => (/* binding */ useSelector) +/* harmony export */ createSelectorHook: function() { return /* binding */ createSelectorHook; }, +/* harmony export */ initializeUseSelector: function() { return /* binding */ initializeUseSelector; }, +/* harmony export */ useSelector: function() { return /* binding */ useSelector; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); @@ -14145,10 +15033,12 @@ __webpack_require__.r(__webpack_exports__); var useSyncExternalStoreWithSelector = _utils_useSyncExternalStore__WEBPACK_IMPORTED_MODULE_3__.notInitialized; -var initializeUseSelector = fn => { +var initializeUseSelector = function initializeUseSelector(fn) { useSyncExternalStoreWithSelector = fn; }; -var refEquality = (a, b) => a === b; +var refEquality = function refEquality(a, b) { + return a === b; +}; /** * Hook factory, which creates a `useSelector` hook bound to a given context. * @@ -14158,7 +15048,9 @@ var refEquality = (a, b) => a === b; function createSelectorHook() { var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _components_Context__WEBPACK_IMPORTED_MODULE_2__.ReactReduxContext; - var useReduxContext = context === _components_Context__WEBPACK_IMPORTED_MODULE_2__.ReactReduxContext ? _useReduxContext__WEBPACK_IMPORTED_MODULE_1__.useReduxContext : () => (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(context); + var useReduxContext = context === _components_Context__WEBPACK_IMPORTED_MODULE_2__.ReactReduxContext ? _useReduxContext__WEBPACK_IMPORTED_MODULE_1__.useReduxContext : function () { + return (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(context); + }; return function useSelector(selector) { var equalityFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : refEquality; if (true) { @@ -14207,19 +15099,19 @@ function createSelectorHook() { var useSelector = /*#__PURE__*/createSelectorHook(); -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/hooks/useStore.js" +/***/ "./node_modules/react-redux/es/hooks/useStore.js": /*!*******************************************************!*\ !*** ./node_modules/react-redux/es/hooks/useStore.js ***! \*******************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ createStoreHook: () => (/* binding */ createStoreHook), -/* harmony export */ useStore: () => (/* binding */ useStore) +/* harmony export */ createStoreHook: function() { return /* binding */ createStoreHook; }, +/* harmony export */ useStore: function() { return /* binding */ useStore; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); @@ -14239,7 +15131,9 @@ function createStoreHook() { var context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _components_Context__WEBPACK_IMPORTED_MODULE_1__.ReactReduxContext; var useReduxContext = // @ts-ignore - context === _components_Context__WEBPACK_IMPORTED_MODULE_1__.ReactReduxContext ? _useReduxContext__WEBPACK_IMPORTED_MODULE_2__.useReduxContext : () => (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(context); + context === _components_Context__WEBPACK_IMPORTED_MODULE_1__.ReactReduxContext ? _useReduxContext__WEBPACK_IMPORTED_MODULE_2__.useReduxContext : function () { + return (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(context); + }; return function useStore() { var _useReduxContext = useReduxContext(), store = _useReduxContext.store; // @ts-ignore @@ -14265,28 +15159,28 @@ function createStoreHook() { var useStore = /*#__PURE__*/createStoreHook(); -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/index.js" +/***/ "./node_modules/react-redux/es/index.js": /*!**********************************************!*\ !*** ./node_modules/react-redux/es/index.js ***! \**********************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Provider: () => (/* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.Provider), -/* harmony export */ ReactReduxContext: () => (/* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.ReactReduxContext), -/* harmony export */ batch: () => (/* reexport safe */ _utils_reactBatchedUpdates__WEBPACK_IMPORTED_MODULE_2__.unstable_batchedUpdates), -/* harmony export */ connect: () => (/* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.connect), -/* harmony export */ createDispatchHook: () => (/* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.createDispatchHook), -/* harmony export */ createSelectorHook: () => (/* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.createSelectorHook), -/* harmony export */ createStoreHook: () => (/* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.createStoreHook), -/* harmony export */ shallowEqual: () => (/* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.shallowEqual), -/* harmony export */ useDispatch: () => (/* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.useDispatch), -/* harmony export */ useSelector: () => (/* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.useSelector), -/* harmony export */ useStore: () => (/* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.useStore) +/* harmony export */ Provider: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.Provider; }, +/* harmony export */ ReactReduxContext: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.ReactReduxContext; }, +/* harmony export */ batch: function() { return /* reexport safe */ _utils_reactBatchedUpdates__WEBPACK_IMPORTED_MODULE_2__.unstable_batchedUpdates; }, +/* harmony export */ connect: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.connect; }, +/* harmony export */ createDispatchHook: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.createDispatchHook; }, +/* harmony export */ createSelectorHook: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.createSelectorHook; }, +/* harmony export */ createStoreHook: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.createStoreHook; }, +/* harmony export */ shallowEqual: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.shallowEqual; }, +/* harmony export */ useDispatch: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.useDispatch; }, +/* harmony export */ useSelector: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.useSelector; }, +/* harmony export */ useStore: function() { return /* reexport safe */ _exports__WEBPACK_IMPORTED_MODULE_6__.useStore; } /* harmony export */ }); /* harmony import */ var use_sync_external_store_shim__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! use-sync-external-store/shim */ "./node_modules/use-sync-external-store/shim/index.js"); /* harmony import */ var use_sync_external_store_shim_with_selector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! use-sync-external-store/shim/with-selector */ "./node_modules/use-sync-external-store/shim/with-selector.js"); @@ -14312,30 +15206,30 @@ __webpack_require__.r(__webpack_exports__); -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/types.js" +/***/ "./node_modules/react-redux/es/types.js": /*!**********************************************!*\ !*** ./node_modules/react-redux/es/types.js ***! \**********************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/utils/Subscription.js" +/***/ "./node_modules/react-redux/es/utils/Subscription.js": /*!***********************************************************!*\ !*** ./node_modules/react-redux/es/utils/Subscription.js ***! \***********************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ createSubscription: () => (/* binding */ createSubscription) +/* harmony export */ createSubscription: function() { return /* binding */ createSubscription; } /* harmony export */ }); /* harmony import */ var _batch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./batch */ "./node_modules/react-redux/es/utils/batch.js"); // encapsulates the subscription logic for connecting a component to the redux store, as @@ -14352,7 +15246,7 @@ function createListenerCollection() { last = null; }, notify() { - batch(() => { + batch(function () { var listener = first; while (listener) { listener.callback(); @@ -14400,7 +15294,9 @@ function createListenerCollection() { } var nullListeners = { notify() {}, - get: () => [] + get: function get() { + return []; + } }; function createSubscription(store, parentSub) { var unsubscribe; @@ -14441,24 +15337,26 @@ function createSubscription(store, parentSub) { isSubscribed, trySubscribe, tryUnsubscribe, - getListeners: () => listeners + getListeners: function getListeners() { + return listeners; + } }; return subscription; } -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/utils/batch.js" +/***/ "./node_modules/react-redux/es/utils/batch.js": /*!****************************************************!*\ !*** ./node_modules/react-redux/es/utils/batch.js ***! \****************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ getBatch: () => (/* binding */ getBatch), -/* harmony export */ setBatch: () => (/* binding */ setBatch) +/* harmony export */ getBatch: function() { return /* binding */ getBatch; }, +/* harmony export */ setBatch: function() { return /* binding */ setBatch; } /* harmony export */ }); // Default to a dummy "batch" implementation that just runs the callback function defaultNoopBatch(callback) { @@ -14466,22 +15364,26 @@ function defaultNoopBatch(callback) { } var batch = defaultNoopBatch; // Allow injecting another batching function later -var setBatch = newBatch => batch = newBatch; // Supply a getter just to skip dealing with ESM bindings +var setBatch = function setBatch(newBatch) { + return batch = newBatch; +}; // Supply a getter just to skip dealing with ESM bindings -var getBatch = () => batch; +var getBatch = function getBatch() { + return batch; +}; -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/utils/bindActionCreators.js" +/***/ "./node_modules/react-redux/es/utils/bindActionCreators.js": /*!*****************************************************************!*\ !*** ./node_modules/react-redux/es/utils/bindActionCreators.js ***! \*****************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ bindActionCreators) +/* harmony export */ "default": function() { return /* binding */ bindActionCreators; } /* harmony export */ }); function bindActionCreators(actionCreators, dispatch) { var boundActionCreators = {}; @@ -14489,7 +15391,7 @@ function bindActionCreators(actionCreators, dispatch) { var actionCreator = actionCreators[key]; if (typeof actionCreator === 'function') { boundActionCreators[key] = function () { - return dispatch(actionCreator(...arguments)); + return dispatch(actionCreator.apply(void 0, arguments)); }; } }; @@ -14499,25 +15401,26 @@ function bindActionCreators(actionCreators, dispatch) { return boundActionCreators; } -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/utils/isPlainObject.js" +/***/ "./node_modules/react-redux/es/utils/isPlainObject.js": /*!************************************************************!*\ !*** ./node_modules/react-redux/es/utils/isPlainObject.js ***! \************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ isPlainObject) +/* harmony export */ "default": function() { return /* binding */ isPlainObject; } /* harmony export */ }); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } /** * @param {any} obj The object to inspect. * @returns {boolean} True if the argument appears to be a plain object. */ function isPlainObject(obj) { - if (typeof obj !== 'object' || obj === null) return false; + if (_typeof(obj) !== 'object' || obj === null) return false; var proto = Object.getPrototypeOf(obj); if (proto === null) return true; var baseProto = proto; @@ -14527,36 +15430,37 @@ function isPlainObject(obj) { return proto === baseProto; } -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/utils/reactBatchedUpdates.js" +/***/ "./node_modules/react-redux/es/utils/reactBatchedUpdates.js": /*!******************************************************************!*\ !*** ./node_modules/react-redux/es/utils/reactBatchedUpdates.js ***! \******************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ unstable_batchedUpdates: () => (/* reexport safe */ react_dom__WEBPACK_IMPORTED_MODULE_0__.unstable_batchedUpdates) +/* harmony export */ unstable_batchedUpdates: function() { return /* reexport safe */ react_dom__WEBPACK_IMPORTED_MODULE_0__.unstable_batchedUpdates; } /* harmony export */ }); /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-dom */ "react-dom"); /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_0__); -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/utils/shallowEqual.js" +/***/ "./node_modules/react-redux/es/utils/shallowEqual.js": /*!***********************************************************!*\ !*** ./node_modules/react-redux/es/utils/shallowEqual.js ***! \***********************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ shallowEqual) +/* harmony export */ "default": function() { return /* binding */ shallowEqual; } /* harmony export */ }); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function is(x, y) { if (x === y) { return x !== 0 || y !== 0 || 1 / x === 1 / y; @@ -14566,7 +15470,7 @@ function is(x, y) { } function shallowEqual(objA, objB) { if (is(objA, objB)) return true; - if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) { + if (_typeof(objA) !== 'object' || objA === null || _typeof(objB) !== 'object' || objB === null) { return false; } var keysA = Object.keys(objA); @@ -14580,19 +15484,19 @@ function shallowEqual(objA, objB) { return true; } -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/utils/useIsomorphicLayoutEffect.js" +/***/ "./node_modules/react-redux/es/utils/useIsomorphicLayoutEffect.js": /*!************************************************************************!*\ !*** ./node_modules/react-redux/es/utils/useIsomorphicLayoutEffect.js ***! \************************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ canUseDOM: () => (/* binding */ canUseDOM), -/* harmony export */ useIsomorphicLayoutEffect: () => (/* binding */ useIsomorphicLayoutEffect) +/* harmony export */ canUseDOM: function() { return /* binding */ canUseDOM; }, +/* harmony export */ useIsomorphicLayoutEffect: function() { return /* binding */ useIsomorphicLayoutEffect; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); @@ -14609,35 +15513,35 @@ __webpack_require__.r(__webpack_exports__); var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined'); var useIsomorphicLayoutEffect = canUseDOM ? react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect : react__WEBPACK_IMPORTED_MODULE_0__.useEffect; -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/utils/useSyncExternalStore.js" +/***/ "./node_modules/react-redux/es/utils/useSyncExternalStore.js": /*!*******************************************************************!*\ !*** ./node_modules/react-redux/es/utils/useSyncExternalStore.js ***! \*******************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ notInitialized: () => (/* binding */ notInitialized) +/* harmony export */ notInitialized: function() { return /* binding */ notInitialized; } /* harmony export */ }); -var notInitialized = () => { +var notInitialized = function notInitialized() { throw new Error('uSES not initialized!'); }; -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/utils/verifyPlainObject.js" +/***/ "./node_modules/react-redux/es/utils/verifyPlainObject.js": /*!****************************************************************!*\ !*** ./node_modules/react-redux/es/utils/verifyPlainObject.js ***! \****************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ verifyPlainObject) +/* harmony export */ "default": function() { return /* binding */ verifyPlainObject; } /* harmony export */ }); /* harmony import */ var _isPlainObject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isPlainObject */ "./node_modules/react-redux/es/utils/isPlainObject.js"); /* harmony import */ var _warning__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./warning */ "./node_modules/react-redux/es/utils/warning.js"); @@ -14649,18 +15553,18 @@ function verifyPlainObject(value, displayName, methodName) { } } -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/es/utils/warning.js" +/***/ "./node_modules/react-redux/es/utils/warning.js": /*!******************************************************!*\ !*** ./node_modules/react-redux/es/utils/warning.js ***! \******************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ warning) +/* harmony export */ "default": function() { return /* binding */ warning; } /* harmony export */ }); /** * Prints a warning in the console if it exists. @@ -14685,13 +15589,13 @@ function warning(message) { /* eslint-enable no-empty */ } -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/node_modules/react-is/cjs/react-is.development.js" +/***/ "./node_modules/react-redux/node_modules/react-is/cjs/react-is.development.js": /*!************************************************************************************!*\ !*** ./node_modules/react-redux/node_modules/react-is/cjs/react-is.development.js ***! \************************************************************************************/ -(__unused_webpack_module, exports) { +/***/ (function(__unused_webpack_module, exports) { "use strict"; /** @@ -14706,6 +15610,7 @@ function warning(message) { +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } if (true) { (function () { 'use strict'; @@ -14753,7 +15658,7 @@ if (true) { if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing) { return true; } - if (typeof type === 'object' && type !== null) { + if (_typeof(type) === 'object' && type !== null) { if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object // types supported by any Flight configuration anywhere since @@ -14766,7 +15671,7 @@ if (true) { return false; } function typeOf(object) { - if (typeof object === 'object' && object !== null) { + if (_typeof(object) === 'object' && object !== null) { var $$typeof = object.$$typeof; switch ($$typeof) { case REACT_ELEMENT_TYPE: @@ -14840,7 +15745,7 @@ if (true) { return typeOf(object) === REACT_PROVIDER_TYPE; } function isElement(object) { - return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; + return _typeof(object) === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; } function isForwardRef(object) { return typeOf(object) === REACT_FORWARD_REF_TYPE; @@ -14900,13 +15805,13 @@ if (true) { })(); } -/***/ }, +/***/ }), -/***/ "./node_modules/react-redux/node_modules/react-is/index.js" +/***/ "./node_modules/react-redux/node_modules/react-is/index.js": /*!*****************************************************************!*\ !*** ./node_modules/react-redux/node_modules/react-is/index.js ***! \*****************************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -14916,13 +15821,13 @@ if (false) // removed by dead control flow module.exports = __webpack_require__(/*! ./cjs/react-is.development.js */ "./node_modules/react-redux/node_modules/react-is/cjs/react-is.development.js"); } -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/apathy.js" +/***/ "./node_modules/base16/lib/apathy.js": /*!*******************************************!*\ !*** ./node_modules/base16/lib/apathy.js ***! \*******************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -14950,13 +15855,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/ashes.js" +/***/ "./node_modules/base16/lib/ashes.js": /*!******************************************!*\ !*** ./node_modules/base16/lib/ashes.js ***! \******************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -14984,13 +15889,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/atelier-dune.js" +/***/ "./node_modules/base16/lib/atelier-dune.js": /*!*************************************************!*\ !*** ./node_modules/base16/lib/atelier-dune.js ***! \*************************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15018,13 +15923,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/atelier-forest.js" +/***/ "./node_modules/base16/lib/atelier-forest.js": /*!***************************************************!*\ !*** ./node_modules/base16/lib/atelier-forest.js ***! \***************************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15052,13 +15957,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/atelier-heath.js" +/***/ "./node_modules/base16/lib/atelier-heath.js": /*!**************************************************!*\ !*** ./node_modules/base16/lib/atelier-heath.js ***! \**************************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15086,13 +15991,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/atelier-lakeside.js" +/***/ "./node_modules/base16/lib/atelier-lakeside.js": /*!*****************************************************!*\ !*** ./node_modules/base16/lib/atelier-lakeside.js ***! \*****************************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15120,13 +16025,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/atelier-seaside.js" +/***/ "./node_modules/base16/lib/atelier-seaside.js": /*!****************************************************!*\ !*** ./node_modules/base16/lib/atelier-seaside.js ***! \****************************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15154,13 +16059,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/bespin.js" +/***/ "./node_modules/base16/lib/bespin.js": /*!*******************************************!*\ !*** ./node_modules/base16/lib/bespin.js ***! \*******************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15188,13 +16093,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/brewer.js" +/***/ "./node_modules/base16/lib/brewer.js": /*!*******************************************!*\ !*** ./node_modules/base16/lib/brewer.js ***! \*******************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15222,13 +16127,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/bright.js" +/***/ "./node_modules/base16/lib/bright.js": /*!*******************************************!*\ !*** ./node_modules/base16/lib/bright.js ***! \*******************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15256,13 +16161,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/chalk.js" +/***/ "./node_modules/base16/lib/chalk.js": /*!******************************************!*\ !*** ./node_modules/base16/lib/chalk.js ***! \******************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15290,13 +16195,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/codeschool.js" +/***/ "./node_modules/base16/lib/codeschool.js": /*!***********************************************!*\ !*** ./node_modules/base16/lib/codeschool.js ***! \***********************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15324,13 +16229,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/colors.js" +/***/ "./node_modules/base16/lib/colors.js": /*!*******************************************!*\ !*** ./node_modules/base16/lib/colors.js ***! \*******************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15358,13 +16263,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/default.js" +/***/ "./node_modules/base16/lib/default.js": /*!********************************************!*\ !*** ./node_modules/base16/lib/default.js ***! \********************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15392,13 +16297,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/eighties.js" +/***/ "./node_modules/base16/lib/eighties.js": /*!*********************************************!*\ !*** ./node_modules/base16/lib/eighties.js ***! \*********************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15426,13 +16331,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/embers.js" +/***/ "./node_modules/base16/lib/embers.js": /*!*******************************************!*\ !*** ./node_modules/base16/lib/embers.js ***! \*******************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15460,13 +16365,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/flat.js" +/***/ "./node_modules/base16/lib/flat.js": /*!*****************************************!*\ !*** ./node_modules/base16/lib/flat.js ***! \*****************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15494,13 +16399,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/google.js" +/***/ "./node_modules/base16/lib/google.js": /*!*******************************************!*\ !*** ./node_modules/base16/lib/google.js ***! \*******************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15528,13 +16433,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/grayscale.js" +/***/ "./node_modules/base16/lib/grayscale.js": /*!**********************************************!*\ !*** ./node_modules/base16/lib/grayscale.js ***! \**********************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15562,13 +16467,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/greenscreen.js" +/***/ "./node_modules/base16/lib/greenscreen.js": /*!************************************************!*\ !*** ./node_modules/base16/lib/greenscreen.js ***! \************************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15596,13 +16501,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/harmonic.js" +/***/ "./node_modules/base16/lib/harmonic.js": /*!*********************************************!*\ !*** ./node_modules/base16/lib/harmonic.js ***! \*********************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15630,13 +16535,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/hopscotch.js" +/***/ "./node_modules/base16/lib/hopscotch.js": /*!**********************************************!*\ !*** ./node_modules/base16/lib/hopscotch.js ***! \**********************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15664,13 +16569,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/index.js" +/***/ "./node_modules/base16/lib/index.js": /*!******************************************!*\ !*** ./node_modules/base16/lib/index.js ***! \******************************************/ -(__unused_webpack_module, exports, __webpack_require__) { +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; @@ -15827,13 +16732,13 @@ var _twilight = __webpack_require__(/*! ./twilight */ "./node_modules/base16/lib exports.twilight = _interopRequire(_twilight); -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/isotope.js" +/***/ "./node_modules/base16/lib/isotope.js": /*!********************************************!*\ !*** ./node_modules/base16/lib/isotope.js ***! \********************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15861,13 +16766,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/marrakesh.js" +/***/ "./node_modules/base16/lib/marrakesh.js": /*!**********************************************!*\ !*** ./node_modules/base16/lib/marrakesh.js ***! \**********************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15895,13 +16800,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/mocha.js" +/***/ "./node_modules/base16/lib/mocha.js": /*!******************************************!*\ !*** ./node_modules/base16/lib/mocha.js ***! \******************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15929,13 +16834,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/monokai.js" +/***/ "./node_modules/base16/lib/monokai.js": /*!********************************************!*\ !*** ./node_modules/base16/lib/monokai.js ***! \********************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15963,13 +16868,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/ocean.js" +/***/ "./node_modules/base16/lib/ocean.js": /*!******************************************!*\ !*** ./node_modules/base16/lib/ocean.js ***! \******************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -15997,13 +16902,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/paraiso.js" +/***/ "./node_modules/base16/lib/paraiso.js": /*!********************************************!*\ !*** ./node_modules/base16/lib/paraiso.js ***! \********************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -16031,13 +16936,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/pop.js" +/***/ "./node_modules/base16/lib/pop.js": /*!****************************************!*\ !*** ./node_modules/base16/lib/pop.js ***! \****************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -16065,13 +16970,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/railscasts.js" +/***/ "./node_modules/base16/lib/railscasts.js": /*!***********************************************!*\ !*** ./node_modules/base16/lib/railscasts.js ***! \***********************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -16099,13 +17004,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/shapeshifter.js" +/***/ "./node_modules/base16/lib/shapeshifter.js": /*!*************************************************!*\ !*** ./node_modules/base16/lib/shapeshifter.js ***! \*************************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -16133,13 +17038,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/solarized.js" +/***/ "./node_modules/base16/lib/solarized.js": /*!**********************************************!*\ !*** ./node_modules/base16/lib/solarized.js ***! \**********************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -16167,13 +17072,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/summerfruit.js" +/***/ "./node_modules/base16/lib/summerfruit.js": /*!************************************************!*\ !*** ./node_modules/base16/lib/summerfruit.js ***! \************************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -16201,13 +17106,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/threezerotwofour.js" +/***/ "./node_modules/base16/lib/threezerotwofour.js": /*!*****************************************************!*\ !*** ./node_modules/base16/lib/threezerotwofour.js ***! \*****************************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -16235,13 +17140,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/tomorrow.js" +/***/ "./node_modules/base16/lib/tomorrow.js": /*!*********************************************!*\ !*** ./node_modules/base16/lib/tomorrow.js ***! \*********************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -16269,13 +17174,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/tube.js" +/***/ "./node_modules/base16/lib/tube.js": /*!*****************************************!*\ !*** ./node_modules/base16/lib/tube.js ***! \*****************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -16303,13 +17208,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/base16/lib/twilight.js" +/***/ "./node_modules/base16/lib/twilight.js": /*!*********************************************!*\ !*** ./node_modules/base16/lib/twilight.js ***! \*********************************************/ -(module, exports) { +/***/ (function(module, exports) { "use strict"; @@ -16337,13 +17242,13 @@ exports["default"] = { }; module.exports = exports['default']; -/***/ }, +/***/ }), -/***/ "./node_modules/color-convert/conversions.js" +/***/ "./node_modules/color-convert/conversions.js": /*!***************************************************!*\ !*** ./node_modules/color-convert/conversions.js ***! \***************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { /* MIT license */ var cssKeywords = __webpack_require__(/*! color-name */ "./node_modules/color-name/index.js"); @@ -17215,13 +18120,13 @@ convert.rgb.gray = function (rgb) { }; -/***/ }, +/***/ }), -/***/ "./node_modules/color-convert/index.js" +/***/ "./node_modules/color-convert/index.js": /*!*********************************************!*\ !*** ./node_modules/color-convert/index.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var conversions = __webpack_require__(/*! ./conversions */ "./node_modules/color-convert/conversions.js"); var route = __webpack_require__(/*! ./route */ "./node_modules/color-convert/route.js"); @@ -17303,13 +18208,13 @@ models.forEach(function (fromModel) { module.exports = convert; -/***/ }, +/***/ }), -/***/ "./node_modules/color-convert/route.js" +/***/ "./node_modules/color-convert/route.js": /*!*********************************************!*\ !*** ./node_modules/color-convert/route.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var conversions = __webpack_require__(/*! ./conversions */ "./node_modules/color-convert/conversions.js"); @@ -17410,13 +18315,13 @@ module.exports = function (fromModel) { -/***/ }, +/***/ }), -/***/ "./node_modules/color-name/index.js" +/***/ "./node_modules/color-name/index.js": /*!******************************************!*\ !*** ./node_modules/color-name/index.js ***! \******************************************/ -(module) { +/***/ (function(module) { "use strict"; @@ -17573,13 +18478,13 @@ module.exports = { }; -/***/ }, +/***/ }), -/***/ "./node_modules/color-string/index.js" +/***/ "./node_modules/color-string/index.js": /*!********************************************!*\ !*** ./node_modules/color-string/index.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { /* MIT license */ var colorNames = __webpack_require__(/*! color-name */ "./node_modules/color-name/index.js"); @@ -17825,13 +18730,13 @@ function hexDouble(num) { } -/***/ }, +/***/ }), -/***/ "./node_modules/color/index.js" +/***/ "./node_modules/color/index.js": /*!*************************************!*\ !*** ./node_modules/color/index.js ***! \*************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -18318,13 +19223,13 @@ function zeroArray(arr, length) { module.exports = Color; -/***/ }, +/***/ }), -/***/ "./node_modules/cose-base/cose-base.js" +/***/ "./node_modules/cose-base/cose-base.js": /*!*********************************************!*\ !*** ./node_modules/cose-base/cose-base.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { (function webpackUniversalModuleDefinition(root, factory) { if(true) @@ -21537,13 +22442,13 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__551__; ; }); -/***/ }, +/***/ }), -/***/ "./node_modules/css-loader/dist/cjs.js!./src/components/core/Toolbar.css" +/***/ "./node_modules/css-loader/dist/cjs.js!./src/components/core/Toolbar.css": /*!*******************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./src/components/core/Toolbar.css ***! \*******************************************************************************/ -(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -21556,52 +22461,18 @@ __webpack_require__.r(__webpack_exports__); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module -___CSS_LOADER_EXPORT___.push([module.id, `._dash-undo-redo { - position: fixed; - bottom: 30px; - left: 30px; - font-size: 20px; - text-align: center; - z-index: 9999; - background-color: rgba(255, 255, 255, 0.9); -} -._dash-undo-redo > div { - position: relative; -} -._dash-undo-redo-link { - color: #0074d9; - cursor: pointer; - margin-left: 10px; - margin-right: 10px; - display: inline-block; - opacity: 0.2; -} -._dash-undo-redo-link:hover { - opacity: 1; -} -._dash-undo-redo-link ._dash-icon-undo { - font-size: 20px; - transform: rotate(270deg); -} -._dash-undo-redo-link ._dash-icon-redo { - font-size: 20px; - transform: rotate(90deg); -} -._dash-undo-redo-link ._dash-undo-redo-label { - font-size: 15px; -} -`, "",{"version":3,"sources":["webpack://./src/components/core/Toolbar.css"],"names":[],"mappings":"AAAA;IACI,eAAe;IACf,YAAY;IACZ,UAAU;IACV,eAAe;IACf,kBAAkB;IAClB,aAAa;IACb,0CAA0C;AAC9C;AACA;IACI,kBAAkB;AACtB;AACA;IACI,cAAc;IACd,eAAe;IACf,iBAAiB;IACjB,kBAAkB;IAClB,qBAAqB;IACrB,YAAY;AAChB;AACA;IACI,UAAU;AACd;AACA;IACI,eAAe;IACf,yBAAyB;AAC7B;AACA;IACI,eAAe;IACf,wBAAwB;AAC5B;AACA;IACI,eAAe;AACnB","sourcesContent":["._dash-undo-redo {\n position: fixed;\n bottom: 30px;\n left: 30px;\n font-size: 20px;\n text-align: center;\n z-index: 9999;\n background-color: rgba(255, 255, 255, 0.9);\n}\n._dash-undo-redo > div {\n position: relative;\n}\n._dash-undo-redo-link {\n color: #0074d9;\n cursor: pointer;\n margin-left: 10px;\n margin-right: 10px;\n display: inline-block;\n opacity: 0.2;\n}\n._dash-undo-redo-link:hover {\n opacity: 1;\n}\n._dash-undo-redo-link ._dash-icon-undo {\n font-size: 20px;\n transform: rotate(270deg);\n}\n._dash-undo-redo-link ._dash-icon-redo {\n font-size: 20px;\n transform: rotate(90deg);\n}\n._dash-undo-redo-link ._dash-undo-redo-label {\n font-size: 15px;\n}\n"],"sourceRoot":""}]); +___CSS_LOADER_EXPORT___.push([module.id, "._dash-undo-redo {\n position: fixed;\n bottom: 30px;\n left: 30px;\n font-size: 20px;\n text-align: center;\n z-index: 9999;\n background-color: rgba(255, 255, 255, 0.9);\n}\n._dash-undo-redo > div {\n position: relative;\n}\n._dash-undo-redo-link {\n color: #0074d9;\n cursor: pointer;\n margin-left: 10px;\n margin-right: 10px;\n display: inline-block;\n opacity: 0.2;\n}\n._dash-undo-redo-link:hover {\n opacity: 1;\n}\n._dash-undo-redo-link ._dash-icon-undo {\n font-size: 20px;\n transform: rotate(270deg);\n}\n._dash-undo-redo-link ._dash-icon-redo {\n font-size: 20px;\n transform: rotate(90deg);\n}\n._dash-undo-redo-link ._dash-undo-redo-label {\n font-size: 15px;\n}\n", "",{"version":3,"sources":["webpack://./src/components/core/Toolbar.css"],"names":[],"mappings":"AAAA;IACI,eAAe;IACf,YAAY;IACZ,UAAU;IACV,eAAe;IACf,kBAAkB;IAClB,aAAa;IACb,0CAA0C;AAC9C;AACA;IACI,kBAAkB;AACtB;AACA;IACI,cAAc;IACd,eAAe;IACf,iBAAiB;IACjB,kBAAkB;IAClB,qBAAqB;IACrB,YAAY;AAChB;AACA;IACI,UAAU;AACd;AACA;IACI,eAAe;IACf,yBAAyB;AAC7B;AACA;IACI,eAAe;IACf,wBAAwB;AAC5B;AACA;IACI,eAAe;AACnB","sourcesContent":["._dash-undo-redo {\n position: fixed;\n bottom: 30px;\n left: 30px;\n font-size: 20px;\n text-align: center;\n z-index: 9999;\n background-color: rgba(255, 255, 255, 0.9);\n}\n._dash-undo-redo > div {\n position: relative;\n}\n._dash-undo-redo-link {\n color: #0074d9;\n cursor: pointer;\n margin-left: 10px;\n margin-right: 10px;\n display: inline-block;\n opacity: 0.2;\n}\n._dash-undo-redo-link:hover {\n opacity: 1;\n}\n._dash-undo-redo-link ._dash-icon-undo {\n font-size: 20px;\n transform: rotate(270deg);\n}\n._dash-undo-redo-link ._dash-icon-redo {\n font-size: 20px;\n transform: rotate(90deg);\n}\n._dash-undo-redo-link ._dash-undo-redo-label {\n font-size: 15px;\n}\n"],"sourceRoot":""}]); // Exports /* harmony default export */ __webpack_exports__["default"] = (___CSS_LOADER_EXPORT___); -/***/ }, +/***/ }), -/***/ "./node_modules/css-loader/dist/cjs.js!./src/components/error/CallbackGraph/CallbackGraphContainer.css" +/***/ "./node_modules/css-loader/dist/cjs.js!./src/components/error/CallbackGraph/CallbackGraphContainer.css": /*!*************************************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./src/components/error/CallbackGraph/CallbackGraphContainer.css ***! \*************************************************************************************************************/ -(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -21614,63 +22485,18 @@ __webpack_require__.r(__webpack_exports__); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module -___CSS_LOADER_EXPORT___.push([module.id, `.dash-callback-dag--container { - border-radius: 4px; - width: 80vw; - position: relative; - height: calc(100vh - 75px); - overflow: hidden; - box-sizing: border-box; - background: #ffffff; - display: inline-block; - /* shadow-1 */ - box-shadow: 0px 6px 16px rgba(80, 103, 132, 0.165), - 0px 2px 6px rgba(80, 103, 132, 0.12), - 0px 0px 1px rgba(80, 103, 132, 0.32); -} - -.dash-callback-dag--info { - border-radius: 4px; - position: absolute; - padding: 8px; - bottom: 16px; - left: 16px; - max-width: calc(100% - 32px); - max-height: 50%; - overflow: auto; - box-sizing: border-box; - background: rgba(255, 255, 255, 0.9); - border: 2px solid #ccc; - font-family: Verdana, sans-serif; -} - -.dash-callback-dag--message { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - height: 100%; - line-height: 2em; - font-family: Verdana, sans-serif; -} - -.dash-callback-dag--layoutSelector { - position: absolute; - top: 3px; - right: 3px; -} -`, "",{"version":3,"sources":["webpack://./src/components/error/CallbackGraph/CallbackGraphContainer.css"],"names":[],"mappings":"AAAA;IACI,kBAAkB;IAClB,WAAW;IACX,kBAAkB;IAClB,0BAA0B;IAC1B,gBAAgB;IAChB,sBAAsB;IACtB,mBAAmB;IACnB,qBAAqB;IACrB,aAAa;IACb;;4CAEwC;AAC5C;;AAEA;IACI,kBAAkB;IAClB,kBAAkB;IAClB,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,4BAA4B;IAC5B,eAAe;IACf,cAAc;IACd,sBAAsB;IACtB,oCAAoC;IACpC,sBAAsB;IACtB,gCAAgC;AACpC;;AAEA;IACI,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,mBAAmB;IACnB,YAAY;IACZ,gBAAgB;IAChB,gCAAgC;AACpC;;AAEA;IACI,kBAAkB;IAClB,QAAQ;IACR,UAAU;AACd","sourcesContent":[".dash-callback-dag--container {\n border-radius: 4px;\n width: 80vw;\n position: relative;\n height: calc(100vh - 75px);\n overflow: hidden;\n box-sizing: border-box;\n background: #ffffff;\n display: inline-block;\n /* shadow-1 */\n box-shadow: 0px 6px 16px rgba(80, 103, 132, 0.165),\n 0px 2px 6px rgba(80, 103, 132, 0.12),\n 0px 0px 1px rgba(80, 103, 132, 0.32);\n}\n\n.dash-callback-dag--info {\n border-radius: 4px;\n position: absolute;\n padding: 8px;\n bottom: 16px;\n left: 16px;\n max-width: calc(100% - 32px);\n max-height: 50%;\n overflow: auto;\n box-sizing: border-box;\n background: rgba(255, 255, 255, 0.9);\n border: 2px solid #ccc;\n font-family: Verdana, sans-serif;\n}\n\n.dash-callback-dag--message {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: 100%;\n line-height: 2em;\n font-family: Verdana, sans-serif;\n}\n\n.dash-callback-dag--layoutSelector {\n position: absolute;\n top: 3px;\n right: 3px;\n}\n"],"sourceRoot":""}]); +___CSS_LOADER_EXPORT___.push([module.id, ".dash-callback-dag--container {\n border-radius: 4px;\n width: 80vw;\n position: relative;\n height: calc(100vh - 75px);\n overflow: hidden;\n box-sizing: border-box;\n background: #ffffff;\n display: inline-block;\n /* shadow-1 */\n box-shadow: 0px 6px 16px rgba(80, 103, 132, 0.165),\n 0px 2px 6px rgba(80, 103, 132, 0.12),\n 0px 0px 1px rgba(80, 103, 132, 0.32);\n}\n\n.dash-callback-dag--info {\n border-radius: 4px;\n position: absolute;\n padding: 8px;\n bottom: 16px;\n left: 16px;\n max-width: calc(100% - 32px);\n max-height: 50%;\n overflow: auto;\n box-sizing: border-box;\n background: rgba(255, 255, 255, 0.9);\n border: 2px solid #ccc;\n font-family: Verdana, sans-serif;\n}\n\n.dash-callback-dag--message {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: 100%;\n line-height: 2em;\n font-family: Verdana, sans-serif;\n}\n\n.dash-callback-dag--layoutSelector {\n position: absolute;\n top: 3px;\n right: 3px;\n}\n", "",{"version":3,"sources":["webpack://./src/components/error/CallbackGraph/CallbackGraphContainer.css"],"names":[],"mappings":"AAAA;IACI,kBAAkB;IAClB,WAAW;IACX,kBAAkB;IAClB,0BAA0B;IAC1B,gBAAgB;IAChB,sBAAsB;IACtB,mBAAmB;IACnB,qBAAqB;IACrB,aAAa;IACb;;4CAEwC;AAC5C;;AAEA;IACI,kBAAkB;IAClB,kBAAkB;IAClB,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,4BAA4B;IAC5B,eAAe;IACf,cAAc;IACd,sBAAsB;IACtB,oCAAoC;IACpC,sBAAsB;IACtB,gCAAgC;AACpC;;AAEA;IACI,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,mBAAmB;IACnB,YAAY;IACZ,gBAAgB;IAChB,gCAAgC;AACpC;;AAEA;IACI,kBAAkB;IAClB,QAAQ;IACR,UAAU;AACd","sourcesContent":[".dash-callback-dag--container {\n border-radius: 4px;\n width: 80vw;\n position: relative;\n height: calc(100vh - 75px);\n overflow: hidden;\n box-sizing: border-box;\n background: #ffffff;\n display: inline-block;\n /* shadow-1 */\n box-shadow: 0px 6px 16px rgba(80, 103, 132, 0.165),\n 0px 2px 6px rgba(80, 103, 132, 0.12),\n 0px 0px 1px rgba(80, 103, 132, 0.32);\n}\n\n.dash-callback-dag--info {\n border-radius: 4px;\n position: absolute;\n padding: 8px;\n bottom: 16px;\n left: 16px;\n max-width: calc(100% - 32px);\n max-height: 50%;\n overflow: auto;\n box-sizing: border-box;\n background: rgba(255, 255, 255, 0.9);\n border: 2px solid #ccc;\n font-family: Verdana, sans-serif;\n}\n\n.dash-callback-dag--message {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: 100%;\n line-height: 2em;\n font-family: Verdana, sans-serif;\n}\n\n.dash-callback-dag--layoutSelector {\n position: absolute;\n top: 3px;\n right: 3px;\n}\n"],"sourceRoot":""}]); // Exports /* harmony default export */ __webpack_exports__["default"] = (___CSS_LOADER_EXPORT___); -/***/ }, +/***/ }), -/***/ "./node_modules/css-loader/dist/cjs.js!./src/components/error/FrontEnd/FrontEndError.css" +/***/ "./node_modules/css-loader/dist/cjs.js!./src/components/error/FrontEnd/FrontEndError.css": /*!***********************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./src/components/error/FrontEnd/FrontEndError.css ***! \***********************************************************************************************/ -(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -21683,256 +22509,18 @@ __webpack_require__.r(__webpack_exports__); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module -___CSS_LOADER_EXPORT___.push([module.id, `.error-container { - padding: 0 10px; - font-family: Courier; -} - -.dash-fe-error__icon-x { - position: absolute; - right: 0; - top: 0; - color: #b9c2ce; - font-size: 20px; - cursor: pointer; -} - -.dash-fe-error__icon-x:hover { - color: #a1a9b5; -} - -.dash-fe-errors { - min-width: 386px; - max-width: 650px; - max-height: 450px; - display: inline-block; -} - -.dash-fe-error__icon-error { - width: 20px; - height: 20px; - display: inline-block; - margin-right: 16px; -} -.dash-fe-error__icon-close { - width: 10px; - height: 10px; - position: absolute; - right: 12px; - top: 12px; - display: inline-block; -} -.dash-fe-error__icon-arrow { - width: 8px; - height: 28px; - margin: 0px 8px; -} -.dash-fe-error-top__group:first-child { - /* - * 77% is the maximum space allowed based off of the other elements - * in the top part of the error container (timestamp & collapse arrow). - * this was manually determined */ - width: 77%; -} -.dash-fe-error-top__group { - display: inline-flex; - align-items: center; -} -.dash-fe-error__title { - text-align: left; - margin: 0px; - margin-left: 5px; - padding: 0px; - font-size: 12.6px; - display: inline-block; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; - line-height: 20px; -} -.dash-fe-error__timestamp { - margin-right: 20px; -} -.dash-fe-error__collapse--flipped { - -webkit-transform: rotate(180deg); - -ms-transform: rotate(180deg); - transform: rotate(180deg); -} - -.dash-fe-error__info_title { - margin: 0; - color: #506784; - font-size: 16px; - background-color: #f3f6fa; - border: 2px solid #dfe8f3; - box-sizing: border-box; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - padding: 10px; -} - -.dash-fe-error__info { - border: 1px solid #dfe8f3; - margin: 0 0 1em 0; - padding: 10px; - - background-color: white; - border: 2px solid #dfe8f3; - color: #506784; - overflow: auto; - white-space: pre-wrap; -} - -.dash-fe-error__curved { - border-radius: 4px; -} - -.dash-fe-error__curved-top { - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom-width: 0px; -} - -.dash-fe-error__curved-bottom { - border-radius-bottom-left: 4px; - border-radius-bottom-right: 4px; - background-color: #ffefef; -} - -.dash-be-error__st { - background-color: #fdf3f4; - min-width: 386px; - max-width: 650px; - /* iframe container handles the scrolling */ - overflow: hidden; - display: inline-block; -} - -.dash-be-error__str { - background-color: #f5f6fa; - min-width: 386px; - width: 100%; - overflow: auto; - line-height: 17px; - margin-bottom: 8px; -} - -.dash-backend-error { - padding: 8px; -} - -.dash-error-menu { - max-width: 50%; - max-height: 60%; - display: contents; - font-family: monospace; - font-size: 14px; - font-variant-ligatures: common-ligatures; - color: rgb(50, 50, 50); -} - -.dash-error-card { - box-sizing: border-box; - display: inline-block; - /* shadow-1 */ - border-radius: 4px; - animation: dash-error-card-animation 0.5s; - padding: 24px; - text-align: left; - background: transparent; - width: 100%; -} -.dash-error-card--alerts-tray { - position: absolute; - top: -300px; - left: -1px; - animation: none; - box-shadow: none; - border: 1px solid #ececec; - border-bottom: 0; - border-bottom-left-radius: 0px; - border-bottom-right-radius: 0px; - width: 422px; -} -.dash-error-card--container { - padding: 16px; - width: 600px; - max-width: 800px; - margin-bottom: 4px; - background-color: white; - overflow: auto; - border-radius: 6px; - box-shadow: 0px 0.7px 1.4px 0px rgba(0, 0, 0, 0.07), - 0px 1.9px 4px 0px rgba(0, 0, 0, 0.05), - 0px 4.5px 10px 0px rgba(0, 0, 0, 0.05); -} - -.dash-error-card__topbar { - width: 100%; - height: 32px; - display: flex; - justify-content: flex-start; - font-size: 14px; - align-items: center; - position: relative; - padding-bottom: 14px; - font-weight: 700; -} -.dash-error-card__message { - font-size: 14px; -} - -.dash-error-card__message > strong { - color: #ff4500; -} - -.dash-error-card__content { - box-sizing: border-box; - background-color: white; - border-radius: 2px; - margin-bottom: 15px; - border: 1px solid #0018661a; - font-size: 12.6px; -} - -.dash-fe-error-item { - background: #ffffff; - border-radius: 2px; - display: flex; - justify-content: space-between; - align-items: center; - padding: 8px; - cursor: pointer; -} - -@keyframes dash-error-card-animation { - from { - opacity: 0; - -webkit-transform: scale(1.1); - -moz-transform: scale(1.1); - -ms-transform: scale(1.1); - transform: scale(1.1); - } - to { - opacity: 1; - -webkit-transform: scale(1); - -moz-transform: scale(1); - -ms-transform: scale(1); - transform: scale(1); - } -} -`, "",{"version":3,"sources":["webpack://./src/components/error/FrontEnd/FrontEndError.css"],"names":[],"mappings":"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","sourcesContent":[".error-container {\n padding: 0 10px;\n font-family: Courier;\n}\n\n.dash-fe-error__icon-x {\n position: absolute;\n right: 0;\n top: 0;\n color: #b9c2ce;\n font-size: 20px;\n cursor: pointer;\n}\n\n.dash-fe-error__icon-x:hover {\n color: #a1a9b5;\n}\n\n.dash-fe-errors {\n min-width: 386px;\n max-width: 650px;\n max-height: 450px;\n display: inline-block;\n}\n\n.dash-fe-error__icon-error {\n width: 20px;\n height: 20px;\n display: inline-block;\n margin-right: 16px;\n}\n.dash-fe-error__icon-close {\n width: 10px;\n height: 10px;\n position: absolute;\n right: 12px;\n top: 12px;\n display: inline-block;\n}\n.dash-fe-error__icon-arrow {\n width: 8px;\n height: 28px;\n margin: 0px 8px;\n}\n.dash-fe-error-top__group:first-child {\n /*\n * 77% is the maximum space allowed based off of the other elements\n * in the top part of the error container (timestamp & collapse arrow).\n * this was manually determined */\n width: 77%;\n}\n.dash-fe-error-top__group {\n display: inline-flex;\n align-items: center;\n}\n.dash-fe-error__title {\n text-align: left;\n margin: 0px;\n margin-left: 5px;\n padding: 0px;\n font-size: 12.6px;\n display: inline-block;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n line-height: 20px;\n}\n.dash-fe-error__timestamp {\n margin-right: 20px;\n}\n.dash-fe-error__collapse--flipped {\n -webkit-transform: rotate(180deg);\n -ms-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n\n.dash-fe-error__info_title {\n margin: 0;\n color: #506784;\n font-size: 16px;\n background-color: #f3f6fa;\n border: 2px solid #dfe8f3;\n box-sizing: border-box;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n padding: 10px;\n}\n\n.dash-fe-error__info {\n border: 1px solid #dfe8f3;\n margin: 0 0 1em 0;\n padding: 10px;\n\n background-color: white;\n border: 2px solid #dfe8f3;\n color: #506784;\n overflow: auto;\n white-space: pre-wrap;\n}\n\n.dash-fe-error__curved {\n border-radius: 4px;\n}\n\n.dash-fe-error__curved-top {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-width: 0px;\n}\n\n.dash-fe-error__curved-bottom {\n border-radius-bottom-left: 4px;\n border-radius-bottom-right: 4px;\n background-color: #ffefef;\n}\n\n.dash-be-error__st {\n background-color: #fdf3f4;\n min-width: 386px;\n max-width: 650px;\n /* iframe container handles the scrolling */\n overflow: hidden;\n display: inline-block;\n}\n\n.dash-be-error__str {\n background-color: #f5f6fa;\n min-width: 386px;\n width: 100%;\n overflow: auto;\n line-height: 17px;\n margin-bottom: 8px;\n}\n\n.dash-backend-error {\n padding: 8px;\n}\n\n.dash-error-menu {\n max-width: 50%;\n max-height: 60%;\n display: contents;\n font-family: monospace;\n font-size: 14px;\n font-variant-ligatures: common-ligatures;\n color: rgb(50, 50, 50);\n}\n\n.dash-error-card {\n box-sizing: border-box;\n display: inline-block;\n /* shadow-1 */\n border-radius: 4px;\n animation: dash-error-card-animation 0.5s;\n padding: 24px;\n text-align: left;\n background: transparent;\n width: 100%;\n}\n.dash-error-card--alerts-tray {\n position: absolute;\n top: -300px;\n left: -1px;\n animation: none;\n box-shadow: none;\n border: 1px solid #ececec;\n border-bottom: 0;\n border-bottom-left-radius: 0px;\n border-bottom-right-radius: 0px;\n width: 422px;\n}\n.dash-error-card--container {\n padding: 16px;\n width: 600px;\n max-width: 800px;\n margin-bottom: 4px;\n background-color: white;\n overflow: auto;\n border-radius: 6px;\n box-shadow: 0px 0.7px 1.4px 0px rgba(0, 0, 0, 0.07),\n 0px 1.9px 4px 0px rgba(0, 0, 0, 0.05),\n 0px 4.5px 10px 0px rgba(0, 0, 0, 0.05);\n}\n\n.dash-error-card__topbar {\n width: 100%;\n height: 32px;\n display: flex;\n justify-content: flex-start;\n font-size: 14px;\n align-items: center;\n position: relative;\n padding-bottom: 14px;\n font-weight: 700;\n}\n.dash-error-card__message {\n font-size: 14px;\n}\n\n.dash-error-card__message > strong {\n color: #ff4500;\n}\n\n.dash-error-card__content {\n box-sizing: border-box;\n background-color: white;\n border-radius: 2px;\n margin-bottom: 15px;\n border: 1px solid #0018661a;\n font-size: 12.6px;\n}\n\n.dash-fe-error-item {\n background: #ffffff;\n border-radius: 2px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px;\n cursor: pointer;\n}\n\n@keyframes dash-error-card-animation {\n from {\n opacity: 0;\n -webkit-transform: scale(1.1);\n -moz-transform: scale(1.1);\n -ms-transform: scale(1.1);\n transform: scale(1.1);\n }\n to {\n opacity: 1;\n -webkit-transform: scale(1);\n -moz-transform: scale(1);\n -ms-transform: scale(1);\n transform: scale(1);\n }\n}\n"],"sourceRoot":""}]); +___CSS_LOADER_EXPORT___.push([module.id, ".error-container {\n padding: 0 10px;\n font-family: Courier;\n}\n\n.dash-fe-error__icon-x {\n position: absolute;\n right: 0;\n top: 0;\n color: #b9c2ce;\n font-size: 20px;\n cursor: pointer;\n}\n\n.dash-fe-error__icon-x:hover {\n color: #a1a9b5;\n}\n\n.dash-fe-errors {\n min-width: 386px;\n max-width: 650px;\n max-height: 450px;\n display: inline-block;\n}\n\n.dash-fe-error__icon-error {\n width: 20px;\n height: 20px;\n display: inline-block;\n margin-right: 16px;\n}\n.dash-fe-error__icon-close {\n width: 10px;\n height: 10px;\n position: absolute;\n right: 12px;\n top: 12px;\n display: inline-block;\n}\n.dash-fe-error__icon-arrow {\n width: 8px;\n height: 28px;\n margin: 0px 8px;\n}\n.dash-fe-error-top__group:first-child {\n /*\n * 77% is the maximum space allowed based off of the other elements\n * in the top part of the error container (timestamp & collapse arrow).\n * this was manually determined */\n width: 77%;\n}\n.dash-fe-error-top__group {\n display: inline-flex;\n align-items: center;\n}\n.dash-fe-error__title {\n text-align: left;\n margin: 0px;\n margin-left: 5px;\n padding: 0px;\n font-size: 12.6px;\n display: inline-block;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n line-height: 20px;\n}\n.dash-fe-error__timestamp {\n margin-right: 20px;\n}\n.dash-fe-error__collapse--flipped {\n -webkit-transform: rotate(180deg);\n -ms-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n\n.dash-fe-error__info_title {\n margin: 0;\n color: #506784;\n font-size: 16px;\n background-color: #f3f6fa;\n border: 2px solid #dfe8f3;\n box-sizing: border-box;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n padding: 10px;\n}\n\n.dash-fe-error__info {\n border: 1px solid #dfe8f3;\n margin: 0 0 1em 0;\n padding: 10px;\n\n background-color: white;\n border: 2px solid #dfe8f3;\n color: #506784;\n overflow: auto;\n white-space: pre-wrap;\n}\n\n.dash-fe-error__curved {\n border-radius: 4px;\n}\n\n.dash-fe-error__curved-top {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-width: 0px;\n}\n\n.dash-fe-error__curved-bottom {\n border-radius-bottom-left: 4px;\n border-radius-bottom-right: 4px;\n background-color: #ffefef;\n}\n\n.dash-be-error__st {\n background-color: #fdf3f4;\n min-width: 386px;\n max-width: 650px;\n /* iframe container handles the scrolling */\n overflow: hidden;\n display: inline-block;\n}\n\n.dash-be-error__str {\n background-color: #f5f6fa;\n min-width: 386px;\n width: 100%;\n overflow: auto;\n line-height: 17px;\n margin-bottom: 8px;\n}\n\n.dash-backend-error {\n padding: 8px;\n}\n\n.dash-error-menu {\n max-width: 50%;\n max-height: 60%;\n display: contents;\n font-family: monospace;\n font-size: 14px;\n font-variant-ligatures: common-ligatures;\n color: rgb(50, 50, 50);\n}\n\n.dash-error-card {\n box-sizing: border-box;\n display: inline-block;\n /* shadow-1 */\n border-radius: 4px;\n animation: dash-error-card-animation 0.5s;\n padding: 24px;\n text-align: left;\n background: transparent;\n width: 100%;\n}\n.dash-error-card--alerts-tray {\n position: absolute;\n top: -300px;\n left: -1px;\n animation: none;\n box-shadow: none;\n border: 1px solid #ececec;\n border-bottom: 0;\n border-bottom-left-radius: 0px;\n border-bottom-right-radius: 0px;\n width: 422px;\n}\n.dash-error-card--container {\n padding: 16px;\n width: 600px;\n max-width: 800px;\n margin-bottom: 4px;\n background-color: white;\n overflow: auto;\n border-radius: 6px;\n box-shadow: 0px 0.7px 1.4px 0px rgba(0, 0, 0, 0.07),\n 0px 1.9px 4px 0px rgba(0, 0, 0, 0.05),\n 0px 4.5px 10px 0px rgba(0, 0, 0, 0.05);\n}\n\n.dash-error-card__topbar {\n width: 100%;\n height: 32px;\n display: flex;\n justify-content: flex-start;\n font-size: 14px;\n align-items: center;\n position: relative;\n padding-bottom: 14px;\n font-weight: 700;\n}\n.dash-error-card__message {\n font-size: 14px;\n}\n\n.dash-error-card__message > strong {\n color: #ff4500;\n}\n\n.dash-error-card__content {\n box-sizing: border-box;\n background-color: white;\n border-radius: 2px;\n margin-bottom: 15px;\n border: 1px solid #0018661a;\n font-size: 12.6px;\n}\n\n.dash-fe-error-item {\n background: #ffffff;\n border-radius: 2px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px;\n cursor: pointer;\n}\n\n@keyframes dash-error-card-animation {\n from {\n opacity: 0;\n -webkit-transform: scale(1.1);\n -moz-transform: scale(1.1);\n -ms-transform: scale(1.1);\n transform: scale(1.1);\n }\n to {\n opacity: 1;\n -webkit-transform: scale(1);\n -moz-transform: scale(1);\n -ms-transform: scale(1);\n transform: scale(1);\n }\n}\n", "",{"version":3,"sources":["webpack://./src/components/error/FrontEnd/FrontEndError.css"],"names":[],"mappings":"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","sourcesContent":[".error-container {\n padding: 0 10px;\n font-family: Courier;\n}\n\n.dash-fe-error__icon-x {\n position: absolute;\n right: 0;\n top: 0;\n color: #b9c2ce;\n font-size: 20px;\n cursor: pointer;\n}\n\n.dash-fe-error__icon-x:hover {\n color: #a1a9b5;\n}\n\n.dash-fe-errors {\n min-width: 386px;\n max-width: 650px;\n max-height: 450px;\n display: inline-block;\n}\n\n.dash-fe-error__icon-error {\n width: 20px;\n height: 20px;\n display: inline-block;\n margin-right: 16px;\n}\n.dash-fe-error__icon-close {\n width: 10px;\n height: 10px;\n position: absolute;\n right: 12px;\n top: 12px;\n display: inline-block;\n}\n.dash-fe-error__icon-arrow {\n width: 8px;\n height: 28px;\n margin: 0px 8px;\n}\n.dash-fe-error-top__group:first-child {\n /*\n * 77% is the maximum space allowed based off of the other elements\n * in the top part of the error container (timestamp & collapse arrow).\n * this was manually determined */\n width: 77%;\n}\n.dash-fe-error-top__group {\n display: inline-flex;\n align-items: center;\n}\n.dash-fe-error__title {\n text-align: left;\n margin: 0px;\n margin-left: 5px;\n padding: 0px;\n font-size: 12.6px;\n display: inline-block;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n line-height: 20px;\n}\n.dash-fe-error__timestamp {\n margin-right: 20px;\n}\n.dash-fe-error__collapse--flipped {\n -webkit-transform: rotate(180deg);\n -ms-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n\n.dash-fe-error__info_title {\n margin: 0;\n color: #506784;\n font-size: 16px;\n background-color: #f3f6fa;\n border: 2px solid #dfe8f3;\n box-sizing: border-box;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n padding: 10px;\n}\n\n.dash-fe-error__info {\n border: 1px solid #dfe8f3;\n margin: 0 0 1em 0;\n padding: 10px;\n\n background-color: white;\n border: 2px solid #dfe8f3;\n color: #506784;\n overflow: auto;\n white-space: pre-wrap;\n}\n\n.dash-fe-error__curved {\n border-radius: 4px;\n}\n\n.dash-fe-error__curved-top {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-width: 0px;\n}\n\n.dash-fe-error__curved-bottom {\n border-radius-bottom-left: 4px;\n border-radius-bottom-right: 4px;\n background-color: #ffefef;\n}\n\n.dash-be-error__st {\n background-color: #fdf3f4;\n min-width: 386px;\n max-width: 650px;\n /* iframe container handles the scrolling */\n overflow: hidden;\n display: inline-block;\n}\n\n.dash-be-error__str {\n background-color: #f5f6fa;\n min-width: 386px;\n width: 100%;\n overflow: auto;\n line-height: 17px;\n margin-bottom: 8px;\n}\n\n.dash-backend-error {\n padding: 8px;\n}\n\n.dash-error-menu {\n max-width: 50%;\n max-height: 60%;\n display: contents;\n font-family: monospace;\n font-size: 14px;\n font-variant-ligatures: common-ligatures;\n color: rgb(50, 50, 50);\n}\n\n.dash-error-card {\n box-sizing: border-box;\n display: inline-block;\n /* shadow-1 */\n border-radius: 4px;\n animation: dash-error-card-animation 0.5s;\n padding: 24px;\n text-align: left;\n background: transparent;\n width: 100%;\n}\n.dash-error-card--alerts-tray {\n position: absolute;\n top: -300px;\n left: -1px;\n animation: none;\n box-shadow: none;\n border: 1px solid #ececec;\n border-bottom: 0;\n border-bottom-left-radius: 0px;\n border-bottom-right-radius: 0px;\n width: 422px;\n}\n.dash-error-card--container {\n padding: 16px;\n width: 600px;\n max-width: 800px;\n margin-bottom: 4px;\n background-color: white;\n overflow: auto;\n border-radius: 6px;\n box-shadow: 0px 0.7px 1.4px 0px rgba(0, 0, 0, 0.07),\n 0px 1.9px 4px 0px rgba(0, 0, 0, 0.05),\n 0px 4.5px 10px 0px rgba(0, 0, 0, 0.05);\n}\n\n.dash-error-card__topbar {\n width: 100%;\n height: 32px;\n display: flex;\n justify-content: flex-start;\n font-size: 14px;\n align-items: center;\n position: relative;\n padding-bottom: 14px;\n font-weight: 700;\n}\n.dash-error-card__message {\n font-size: 14px;\n}\n\n.dash-error-card__message > strong {\n color: #ff4500;\n}\n\n.dash-error-card__content {\n box-sizing: border-box;\n background-color: white;\n border-radius: 2px;\n margin-bottom: 15px;\n border: 1px solid #0018661a;\n font-size: 12.6px;\n}\n\n.dash-fe-error-item {\n background: #ffffff;\n border-radius: 2px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px;\n cursor: pointer;\n}\n\n@keyframes dash-error-card-animation {\n from {\n opacity: 0;\n -webkit-transform: scale(1.1);\n -moz-transform: scale(1.1);\n -ms-transform: scale(1.1);\n transform: scale(1.1);\n }\n to {\n opacity: 1;\n -webkit-transform: scale(1);\n -moz-transform: scale(1);\n -ms-transform: scale(1);\n transform: scale(1);\n }\n}\n"],"sourceRoot":""}]); // Exports /* harmony default export */ __webpack_exports__["default"] = (___CSS_LOADER_EXPORT___); -/***/ }, +/***/ }), -/***/ "./node_modules/css-loader/dist/cjs.js!./src/components/error/Percy.css" +/***/ "./node_modules/css-loader/dist/cjs.js!./src/components/error/Percy.css": /*!******************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./src/components/error/Percy.css ***! \******************************************************************************/ -(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -21945,30 +22533,18 @@ __webpack_require__.r(__webpack_exports__); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module -___CSS_LOADER_EXPORT___.push([module.id, `.percy-show { - display: none; -} - -@media only percy { - .percy-hide { - display: none; - } - .percy-show { - display: block; - } -} -`, "",{"version":3,"sources":["webpack://./src/components/error/Percy.css"],"names":[],"mappings":"AAAA;IACI,aAAa;AACjB;;AAEA;IACI;QACI,aAAa;IACjB;IACA;QACI,cAAc;IAClB;AACJ","sourcesContent":[".percy-show {\n display: none;\n}\n\n@media only percy {\n .percy-hide {\n display: none;\n }\n .percy-show {\n display: block;\n }\n}\n"],"sourceRoot":""}]); +___CSS_LOADER_EXPORT___.push([module.id, ".percy-show {\n display: none;\n}\n\n@media only percy {\n .percy-hide {\n display: none;\n }\n .percy-show {\n display: block;\n }\n}\n", "",{"version":3,"sources":["webpack://./src/components/error/Percy.css"],"names":[],"mappings":"AAAA;IACI,aAAa;AACjB;;AAEA;IACI;QACI,aAAa;IACjB;IACA;QACI,cAAc;IAClB;AACJ","sourcesContent":[".percy-show {\n display: none;\n}\n\n@media only percy {\n .percy-hide {\n display: none;\n }\n .percy-show {\n display: block;\n }\n}\n"],"sourceRoot":""}]); // Exports /* harmony default export */ __webpack_exports__["default"] = (___CSS_LOADER_EXPORT___); -/***/ }, +/***/ }), -/***/ "./node_modules/css-loader/dist/cjs.js!./src/components/error/menu/DebugMenu.css" +/***/ "./node_modules/css-loader/dist/cjs.js!./src/components/error/menu/DebugMenu.css": /*!***************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./src/components/error/menu/DebugMenu.css ***! \***************************************************************************************/ -(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -21981,279 +22557,18 @@ __webpack_require__.r(__webpack_exports__); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module -___CSS_LOADER_EXPORT___.push([module.id, `.dash-debug-menu { - transition: 0.3s; - position: fixed; - bottom: 35px; - right: 35px; - display: flex; - justify-content: center; - align-items: center; - z-index: 10001; - background-color: #119dff; - border-radius: 100%; - width: 64px; - height: 64px; - cursor: pointer; -} -.dash-debug-menu--open { - transform: rotate(-180deg); -} - -.dash-debug-menu__outer button { - height: auto; - padding: 0 8px; - line-height: normal; - text-transform: none; - font-size: 14px; - border-radius: 0px; - letter-spacing: normal; - white-space: nowrap; - gap: 6px; - cursor: pointer; - border: none; - background: none; - outline: none; - display: flex; - align-items: center; -} - -.dash-debug-menu__popup { - display: flex; - flex-direction: column; - position: absolute; - bottom: 100%; - right: 0; - gap: 8px; - max-height: calc(100vh - 75px); - justify-content: flex-end; -} - -.dash-debug-menu__version-opt-out { - display: flex; - width: 426px; - padding: 16px; - flex-direction: column; - align-items: flex-start; - gap: 8px; - border-radius: 8px; - border: 1px solid rgba(0, 24, 102, 0.1); - background: #fff; - align-self: flex-end; - position: relative; - /* Shadow/Small */ - box-shadow: 0px 0.7px 1.4px 0px rgba(0, 0, 0, 0.07), - 0px 1.9px 4px 0px rgba(0, 0, 0, 0.05), - 0px 4.5px 10px 0px rgba(0, 0, 0, 0.05); -} - -.dash-debug-menu__version-opt-out__text { - display: inline-block; -} - -.dash-debug-menu__version-opt-out__text a { - color: #7f4bc4; - text-decoration: none; -} - -.dash-debug-menu__version-opt-out__text span { - margin-right: 5px; -} - -.dash-debug-menu__version-opt-out button { - display: flex; - height: 24px; - flex-direction: column; - justify-content: center; - align-items: center; - border-radius: 4px; - cursor: pointer; - line-height: 18px; - padding: 16px 12px; -} - -.dash-debug-menu__version-opt-out__buttons-container { - display: flex; - gap: 8px; - align-self: stretch; - justify-content: center; - padding-top: 16px; - margin-top: 16px; - border-top: 1px solid rgba(0, 24, 102, 0.1); -} - -.dash-debug-menu__version-opt-out__button-primary { - border: none; - color: #fff; - background: #7f4bc4; -} - -.dash-debug-menu__version-opt-out__button-secondary { - background: rgba(161, 89, 255, 0.05); - color: #7f4bc4; - border: 1px solid rgba(134, 74, 212, 0.8); -} - -.dash-debug-menu:hover { - background-color: #7f4bc4; -} - -.dash-debug-menu__outer { - transition: 0.3s; - box-sizing: border-box; - position: fixed; - bottom: -1px; - right: -1px; - display: flex; - color: black; - flex-direction: row; - font-family: Verdana, sans-serif !important; - font-size: 14px; - justify-content: flex-end; - align-items: center; - z-index: 10000; - border-radius: 5px 0 0 0; - padding: 15px 0; - background-color: #f5f6fa; - box-shadow: 0px 0.8px 0.8px 0px rgba(0, 0, 0, 0.04), - 0px 2.3px 2px 0px rgba(0, 0, 0, 0.03); - border: 1px solid rgba(0, 24, 102, 0.1); -} -.dash-debug-menu__outer.dash-debug-menu__outer--collapsed { - max-width: 50px; -} -.dash-debug-menu__outer.dash-debug-menu__outer--expanded { - max-width: calc(100vw - 50px); -} - -.dash-debug-menu__upgrade-tooltip { - position: absolute; - bottom: calc(100% + 12px); - right: 0; - display: flex; - flex-direction: column; - background-color: white; - border-radius: 6px; - border: 1px solid #0018661a; - padding: 11px; - box-shadow: 0px 0px 14px 5px #00000012; - z-index: 1200; -} - -.dash-debug-menu__toggle { - color: #7f4bc4; - transition: 0.3s; -} -.dash-debug-menu__toggle--expanded { - transform: rotate(180deg); -} -.dash-debug-menu__error-indicator { - width: 8px; - height: 8px; - background-color: #DC3E42; - border-radius: 100%; - position: absolute; - right: 3px; - top: 13px; -} -.dash-debug-menu__status { - display: flex; - align-items: center; - gap: 6px; -} - -.dash-debug-menu__content { - display: flex; - align-items: stretch; - margin-left: 15px; - transition: all 0.5s ease; - flex-shrink: 0; -} - -.dash-debug-menu__version { - position: relative; - display: flex; - align-items: center; -} - -.dash-debug-menu__divider { - width: 1.5px; - height: 26px; - margin: 0px 13px; - background-color: #0015594d; -} - -.dash-debug-menu__button { - background: none; - border: none; - box-shadow: 0 1px #d3dae6; - display: flex; - justify-content: center; - align-items: center; - transition: background-color 0.2s; - font-family: Verdana, sans-serif !important; - color: #7f4bc4; -} - -.dash-debug-menu__button.dash-debug-menu__button--selected { - color: #7f4bc4; - box-shadow: 0 2px #7f4bc4; -} -.dash-debug-menu__button.dash-debug-menu__button--selected:hover { - color: #5806c4; -} - -.dash-debug-alert { - display: flex; - align-items: center; - font-size: 10px; -} - -.dash-debug-alert-label { - display: flex; - position: fixed; - bottom: 81px; - right: 29px; - z-index: 10002; - cursor: pointer; - box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.25), - 0px 1px 3px rgba(162, 177, 198, 0.32); - border-radius: 32px; - background-color: white; - padding: 4px; - color: rgb(50, 50, 50); -} - -.dash-debug-menu__error-count { - font-size: 12px; - color: #fff; - background-color: #c73a3a; - padding: 3px 5px; - border-radius: 3px; -} - -.dash-debug-disconnected { - font-size: 14px; - margin-left: 3px; -} -.dash-debug-menu__icon { - color: #9ca3af; -} -.dash-debug-menu__button:hover .dash-debug-menu__icon { - color: #5806c4; -} -`, "",{"version":3,"sources":["webpack://./src/components/error/menu/DebugMenu.css"],"names":[],"mappings":"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","sourcesContent":[".dash-debug-menu {\n transition: 0.3s;\n position: fixed;\n bottom: 35px;\n right: 35px;\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 10001;\n background-color: #119dff;\n border-radius: 100%;\n width: 64px;\n height: 64px;\n cursor: pointer;\n}\n.dash-debug-menu--open {\n transform: rotate(-180deg);\n}\n\n.dash-debug-menu__outer button {\n height: auto;\n padding: 0 8px;\n line-height: normal;\n text-transform: none;\n font-size: 14px;\n border-radius: 0px;\n letter-spacing: normal;\n white-space: nowrap;\n gap: 6px;\n cursor: pointer;\n border: none;\n background: none;\n outline: none;\n display: flex;\n align-items: center;\n}\n\n.dash-debug-menu__popup {\n display: flex;\n flex-direction: column;\n position: absolute;\n bottom: 100%;\n right: 0;\n gap: 8px;\n max-height: calc(100vh - 75px);\n justify-content: flex-end;\n}\n\n.dash-debug-menu__version-opt-out {\n display: flex;\n width: 426px;\n padding: 16px;\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n border-radius: 8px;\n border: 1px solid rgba(0, 24, 102, 0.1);\n background: #fff;\n align-self: flex-end;\n position: relative;\n /* Shadow/Small */\n box-shadow: 0px 0.7px 1.4px 0px rgba(0, 0, 0, 0.07),\n 0px 1.9px 4px 0px rgba(0, 0, 0, 0.05),\n 0px 4.5px 10px 0px rgba(0, 0, 0, 0.05);\n}\n\n.dash-debug-menu__version-opt-out__text {\n display: inline-block;\n}\n\n.dash-debug-menu__version-opt-out__text a {\n color: #7f4bc4;\n text-decoration: none;\n}\n\n.dash-debug-menu__version-opt-out__text span {\n margin-right: 5px;\n}\n\n.dash-debug-menu__version-opt-out button {\n display: flex;\n height: 24px;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n border-radius: 4px;\n cursor: pointer;\n line-height: 18px;\n padding: 16px 12px;\n}\n\n.dash-debug-menu__version-opt-out__buttons-container {\n display: flex;\n gap: 8px;\n align-self: stretch;\n justify-content: center;\n padding-top: 16px;\n margin-top: 16px;\n border-top: 1px solid rgba(0, 24, 102, 0.1);\n}\n\n.dash-debug-menu__version-opt-out__button-primary {\n border: none;\n color: #fff;\n background: #7f4bc4;\n}\n\n.dash-debug-menu__version-opt-out__button-secondary {\n background: rgba(161, 89, 255, 0.05);\n color: #7f4bc4;\n border: 1px solid rgba(134, 74, 212, 0.8);\n}\n\n.dash-debug-menu:hover {\n background-color: #7f4bc4;\n}\n\n.dash-debug-menu__outer {\n transition: 0.3s;\n box-sizing: border-box;\n position: fixed;\n bottom: -1px;\n right: -1px;\n display: flex;\n color: black;\n flex-direction: row;\n font-family: Verdana, sans-serif !important;\n font-size: 14px;\n justify-content: flex-end;\n align-items: center;\n z-index: 10000;\n border-radius: 5px 0 0 0;\n padding: 15px 0;\n background-color: #f5f6fa;\n box-shadow: 0px 0.8px 0.8px 0px rgba(0, 0, 0, 0.04),\n 0px 2.3px 2px 0px rgba(0, 0, 0, 0.03);\n border: 1px solid rgba(0, 24, 102, 0.1);\n}\n.dash-debug-menu__outer.dash-debug-menu__outer--collapsed {\n max-width: 50px;\n}\n.dash-debug-menu__outer.dash-debug-menu__outer--expanded {\n max-width: calc(100vw - 50px);\n}\n\n.dash-debug-menu__upgrade-tooltip {\n position: absolute;\n bottom: calc(100% + 12px);\n right: 0;\n display: flex;\n flex-direction: column;\n background-color: white;\n border-radius: 6px;\n border: 1px solid #0018661a;\n padding: 11px;\n box-shadow: 0px 0px 14px 5px #00000012;\n z-index: 1200;\n}\n\n.dash-debug-menu__toggle {\n color: #7f4bc4;\n transition: 0.3s;\n}\n.dash-debug-menu__toggle--expanded {\n transform: rotate(180deg);\n}\n.dash-debug-menu__error-indicator {\n width: 8px;\n height: 8px;\n background-color: #DC3E42;\n border-radius: 100%;\n position: absolute;\n right: 3px;\n top: 13px;\n}\n.dash-debug-menu__status {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.dash-debug-menu__content {\n display: flex;\n align-items: stretch;\n margin-left: 15px;\n transition: all 0.5s ease;\n flex-shrink: 0;\n}\n\n.dash-debug-menu__version {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.dash-debug-menu__divider {\n width: 1.5px;\n height: 26px;\n margin: 0px 13px;\n background-color: #0015594d;\n}\n\n.dash-debug-menu__button {\n background: none;\n border: none;\n box-shadow: 0 1px #d3dae6;\n display: flex;\n justify-content: center;\n align-items: center;\n transition: background-color 0.2s;\n font-family: Verdana, sans-serif !important;\n color: #7f4bc4;\n}\n\n.dash-debug-menu__button.dash-debug-menu__button--selected {\n color: #7f4bc4;\n box-shadow: 0 2px #7f4bc4;\n}\n.dash-debug-menu__button.dash-debug-menu__button--selected:hover {\n color: #5806c4;\n}\n\n.dash-debug-alert {\n display: flex;\n align-items: center;\n font-size: 10px;\n}\n\n.dash-debug-alert-label {\n display: flex;\n position: fixed;\n bottom: 81px;\n right: 29px;\n z-index: 10002;\n cursor: pointer;\n box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.25),\n 0px 1px 3px rgba(162, 177, 198, 0.32);\n border-radius: 32px;\n background-color: white;\n padding: 4px;\n color: rgb(50, 50, 50);\n}\n\n.dash-debug-menu__error-count {\n font-size: 12px;\n color: #fff;\n background-color: #c73a3a;\n padding: 3px 5px;\n border-radius: 3px;\n}\n\n.dash-debug-disconnected {\n font-size: 14px;\n margin-left: 3px;\n}\n.dash-debug-menu__icon {\n color: #9ca3af;\n}\n.dash-debug-menu__button:hover .dash-debug-menu__icon {\n color: #5806c4;\n}\n"],"sourceRoot":""}]); +___CSS_LOADER_EXPORT___.push([module.id, ".dash-debug-menu {\n transition: 0.3s;\n position: fixed;\n bottom: 35px;\n right: 35px;\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 10001;\n background-color: #119dff;\n border-radius: 100%;\n width: 64px;\n height: 64px;\n cursor: pointer;\n}\n.dash-debug-menu--open {\n transform: rotate(-180deg);\n}\n\n.dash-debug-menu__outer button {\n height: auto;\n padding: 0 8px;\n line-height: normal;\n text-transform: none;\n font-size: 14px;\n border-radius: 0px;\n letter-spacing: normal;\n white-space: nowrap;\n gap: 6px;\n cursor: pointer;\n border: none;\n background: none;\n outline: none;\n display: flex;\n align-items: center;\n}\n\n.dash-debug-menu__popup {\n display: flex;\n flex-direction: column;\n position: absolute;\n bottom: 100%;\n right: 0;\n gap: 8px;\n max-height: calc(100vh - 75px);\n justify-content: flex-end;\n}\n\n.dash-debug-menu__version-opt-out {\n display: flex;\n width: 426px;\n padding: 16px;\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n border-radius: 8px;\n border: 1px solid rgba(0, 24, 102, 0.1);\n background: #fff;\n align-self: flex-end;\n position: relative;\n /* Shadow/Small */\n box-shadow: 0px 0.7px 1.4px 0px rgba(0, 0, 0, 0.07),\n 0px 1.9px 4px 0px rgba(0, 0, 0, 0.05),\n 0px 4.5px 10px 0px rgba(0, 0, 0, 0.05);\n}\n\n.dash-debug-menu__version-opt-out__text {\n display: inline-block;\n}\n\n.dash-debug-menu__version-opt-out__text a {\n color: #7f4bc4;\n text-decoration: none;\n}\n\n.dash-debug-menu__version-opt-out__text span {\n margin-right: 5px;\n}\n\n.dash-debug-menu__version-opt-out button {\n display: flex;\n height: 24px;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n border-radius: 4px;\n cursor: pointer;\n line-height: 18px;\n padding: 16px 12px;\n}\n\n.dash-debug-menu__version-opt-out__buttons-container {\n display: flex;\n gap: 8px;\n align-self: stretch;\n justify-content: center;\n padding-top: 16px;\n margin-top: 16px;\n border-top: 1px solid rgba(0, 24, 102, 0.1);\n}\n\n.dash-debug-menu__version-opt-out__button-primary {\n border: none;\n color: #fff;\n background: #7f4bc4;\n}\n\n.dash-debug-menu__version-opt-out__button-secondary {\n background: rgba(161, 89, 255, 0.05);\n color: #7f4bc4;\n border: 1px solid rgba(134, 74, 212, 0.8);\n}\n\n.dash-debug-menu:hover {\n background-color: #7f4bc4;\n}\n\n.dash-debug-menu__outer {\n transition: 0.3s;\n box-sizing: border-box;\n position: fixed;\n bottom: -1px;\n right: -1px;\n display: flex;\n color: black;\n flex-direction: row;\n font-family: Verdana, sans-serif !important;\n font-size: 14px;\n justify-content: flex-end;\n align-items: center;\n z-index: 10000;\n border-radius: 5px 0 0 0;\n padding: 15px 0;\n background-color: #f5f6fa;\n box-shadow: 0px 0.8px 0.8px 0px rgba(0, 0, 0, 0.04),\n 0px 2.3px 2px 0px rgba(0, 0, 0, 0.03);\n border: 1px solid rgba(0, 24, 102, 0.1);\n}\n.dash-debug-menu__outer.dash-debug-menu__outer--collapsed {\n max-width: 50px;\n}\n.dash-debug-menu__outer.dash-debug-menu__outer--expanded {\n max-width: calc(100vw - 50px);\n}\n\n.dash-debug-menu__upgrade-tooltip {\n position: absolute;\n bottom: calc(100% + 12px);\n right: 0;\n display: flex;\n flex-direction: column;\n background-color: white;\n border-radius: 6px;\n border: 1px solid #0018661a;\n padding: 11px;\n box-shadow: 0px 0px 14px 5px #00000012;\n z-index: 1200;\n}\n\n.dash-debug-menu__toggle {\n color: #7f4bc4;\n transition: 0.3s;\n}\n.dash-debug-menu__toggle--expanded {\n transform: rotate(180deg);\n}\n.dash-debug-menu__error-indicator {\n width: 8px;\n height: 8px;\n background-color: #DC3E42;\n border-radius: 100%;\n position: absolute;\n right: 3px;\n top: 13px;\n}\n.dash-debug-menu__status {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.dash-debug-menu__content {\n display: flex;\n align-items: stretch;\n margin-left: 15px;\n transition: all 0.5s ease;\n flex-shrink: 0;\n}\n\n.dash-debug-menu__version {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.dash-debug-menu__divider {\n width: 1.5px;\n height: 26px;\n margin: 0px 13px;\n background-color: #0015594d;\n}\n\n.dash-debug-menu__button {\n background: none;\n border: none;\n box-shadow: 0 1px #d3dae6;\n display: flex;\n justify-content: center;\n align-items: center;\n transition: background-color 0.2s;\n font-family: Verdana, sans-serif !important;\n color: #7f4bc4;\n}\n\n.dash-debug-menu__button.dash-debug-menu__button--selected {\n color: #7f4bc4;\n box-shadow: 0 2px #7f4bc4;\n}\n.dash-debug-menu__button.dash-debug-menu__button--selected:hover {\n color: #5806c4;\n}\n\n.dash-debug-alert {\n display: flex;\n align-items: center;\n font-size: 10px;\n}\n\n.dash-debug-alert-label {\n display: flex;\n position: fixed;\n bottom: 81px;\n right: 29px;\n z-index: 10002;\n cursor: pointer;\n box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.25),\n 0px 1px 3px rgba(162, 177, 198, 0.32);\n border-radius: 32px;\n background-color: white;\n padding: 4px;\n color: rgb(50, 50, 50);\n}\n\n.dash-debug-menu__error-count {\n font-size: 12px;\n color: #fff;\n background-color: #c73a3a;\n padding: 3px 5px;\n border-radius: 3px;\n}\n\n.dash-debug-disconnected {\n font-size: 14px;\n margin-left: 3px;\n}\n.dash-debug-menu__icon {\n color: #9ca3af;\n}\n.dash-debug-menu__button:hover .dash-debug-menu__icon {\n color: #5806c4;\n}\n", "",{"version":3,"sources":["webpack://./src/components/error/menu/DebugMenu.css"],"names":[],"mappings":"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","sourcesContent":[".dash-debug-menu {\n transition: 0.3s;\n position: fixed;\n bottom: 35px;\n right: 35px;\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 10001;\n background-color: #119dff;\n border-radius: 100%;\n width: 64px;\n height: 64px;\n cursor: pointer;\n}\n.dash-debug-menu--open {\n transform: rotate(-180deg);\n}\n\n.dash-debug-menu__outer button {\n height: auto;\n padding: 0 8px;\n line-height: normal;\n text-transform: none;\n font-size: 14px;\n border-radius: 0px;\n letter-spacing: normal;\n white-space: nowrap;\n gap: 6px;\n cursor: pointer;\n border: none;\n background: none;\n outline: none;\n display: flex;\n align-items: center;\n}\n\n.dash-debug-menu__popup {\n display: flex;\n flex-direction: column;\n position: absolute;\n bottom: 100%;\n right: 0;\n gap: 8px;\n max-height: calc(100vh - 75px);\n justify-content: flex-end;\n}\n\n.dash-debug-menu__version-opt-out {\n display: flex;\n width: 426px;\n padding: 16px;\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n border-radius: 8px;\n border: 1px solid rgba(0, 24, 102, 0.1);\n background: #fff;\n align-self: flex-end;\n position: relative;\n /* Shadow/Small */\n box-shadow: 0px 0.7px 1.4px 0px rgba(0, 0, 0, 0.07),\n 0px 1.9px 4px 0px rgba(0, 0, 0, 0.05),\n 0px 4.5px 10px 0px rgba(0, 0, 0, 0.05);\n}\n\n.dash-debug-menu__version-opt-out__text {\n display: inline-block;\n}\n\n.dash-debug-menu__version-opt-out__text a {\n color: #7f4bc4;\n text-decoration: none;\n}\n\n.dash-debug-menu__version-opt-out__text span {\n margin-right: 5px;\n}\n\n.dash-debug-menu__version-opt-out button {\n display: flex;\n height: 24px;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n border-radius: 4px;\n cursor: pointer;\n line-height: 18px;\n padding: 16px 12px;\n}\n\n.dash-debug-menu__version-opt-out__buttons-container {\n display: flex;\n gap: 8px;\n align-self: stretch;\n justify-content: center;\n padding-top: 16px;\n margin-top: 16px;\n border-top: 1px solid rgba(0, 24, 102, 0.1);\n}\n\n.dash-debug-menu__version-opt-out__button-primary {\n border: none;\n color: #fff;\n background: #7f4bc4;\n}\n\n.dash-debug-menu__version-opt-out__button-secondary {\n background: rgba(161, 89, 255, 0.05);\n color: #7f4bc4;\n border: 1px solid rgba(134, 74, 212, 0.8);\n}\n\n.dash-debug-menu:hover {\n background-color: #7f4bc4;\n}\n\n.dash-debug-menu__outer {\n transition: 0.3s;\n box-sizing: border-box;\n position: fixed;\n bottom: -1px;\n right: -1px;\n display: flex;\n color: black;\n flex-direction: row;\n font-family: Verdana, sans-serif !important;\n font-size: 14px;\n justify-content: flex-end;\n align-items: center;\n z-index: 10000;\n border-radius: 5px 0 0 0;\n padding: 15px 0;\n background-color: #f5f6fa;\n box-shadow: 0px 0.8px 0.8px 0px rgba(0, 0, 0, 0.04),\n 0px 2.3px 2px 0px rgba(0, 0, 0, 0.03);\n border: 1px solid rgba(0, 24, 102, 0.1);\n}\n.dash-debug-menu__outer.dash-debug-menu__outer--collapsed {\n max-width: 50px;\n}\n.dash-debug-menu__outer.dash-debug-menu__outer--expanded {\n max-width: calc(100vw - 50px);\n}\n\n.dash-debug-menu__upgrade-tooltip {\n position: absolute;\n bottom: calc(100% + 12px);\n right: 0;\n display: flex;\n flex-direction: column;\n background-color: white;\n border-radius: 6px;\n border: 1px solid #0018661a;\n padding: 11px;\n box-shadow: 0px 0px 14px 5px #00000012;\n z-index: 1200;\n}\n\n.dash-debug-menu__toggle {\n color: #7f4bc4;\n transition: 0.3s;\n}\n.dash-debug-menu__toggle--expanded {\n transform: rotate(180deg);\n}\n.dash-debug-menu__error-indicator {\n width: 8px;\n height: 8px;\n background-color: #DC3E42;\n border-radius: 100%;\n position: absolute;\n right: 3px;\n top: 13px;\n}\n.dash-debug-menu__status {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.dash-debug-menu__content {\n display: flex;\n align-items: stretch;\n margin-left: 15px;\n transition: all 0.5s ease;\n flex-shrink: 0;\n}\n\n.dash-debug-menu__version {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.dash-debug-menu__divider {\n width: 1.5px;\n height: 26px;\n margin: 0px 13px;\n background-color: #0015594d;\n}\n\n.dash-debug-menu__button {\n background: none;\n border: none;\n box-shadow: 0 1px #d3dae6;\n display: flex;\n justify-content: center;\n align-items: center;\n transition: background-color 0.2s;\n font-family: Verdana, sans-serif !important;\n color: #7f4bc4;\n}\n\n.dash-debug-menu__button.dash-debug-menu__button--selected {\n color: #7f4bc4;\n box-shadow: 0 2px #7f4bc4;\n}\n.dash-debug-menu__button.dash-debug-menu__button--selected:hover {\n color: #5806c4;\n}\n\n.dash-debug-alert {\n display: flex;\n align-items: center;\n font-size: 10px;\n}\n\n.dash-debug-alert-label {\n display: flex;\n position: fixed;\n bottom: 81px;\n right: 29px;\n z-index: 10002;\n cursor: pointer;\n box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.25),\n 0px 1px 3px rgba(162, 177, 198, 0.32);\n border-radius: 32px;\n background-color: white;\n padding: 4px;\n color: rgb(50, 50, 50);\n}\n\n.dash-debug-menu__error-count {\n font-size: 12px;\n color: #fff;\n background-color: #c73a3a;\n padding: 3px 5px;\n border-radius: 3px;\n}\n\n.dash-debug-disconnected {\n font-size: 14px;\n margin-left: 3px;\n}\n.dash-debug-menu__icon {\n color: #9ca3af;\n}\n.dash-debug-menu__button:hover .dash-debug-menu__icon {\n color: #5806c4;\n}\n"],"sourceRoot":""}]); // Exports /* harmony default export */ __webpack_exports__["default"] = (___CSS_LOADER_EXPORT___); -/***/ }, +/***/ }), -/***/ "./node_modules/css-loader/dist/cjs.js!./src/components/error/menu/PlotlyCloud.css" +/***/ "./node_modules/css-loader/dist/cjs.js!./src/components/error/menu/PlotlyCloud.css": /*!*****************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./src/components/error/menu/PlotlyCloud.css ***! \*****************************************************************************************/ -(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -22266,106 +22581,18 @@ __webpack_require__.r(__webpack_exports__); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module -___CSS_LOADER_EXPORT___.push([module.id, `/* - Same as in plotly-cloud but without the publish - in the name to avoid future conflicts if changed - upstream. -*/ -.plotly-cloud-modal-overlay { - position: absolute; - bottom: 100%; - left: -1px; - z-index: 10000; -} - -.plotly-cloud-modal-content { - border-radius: 8px; - width: 522px; - background: white; - border: 1px solid #d1d5db; - border-radius: 4px 4px 0 0; - box-shadow: 0 -4px 6px rgba(0, 0, 0, 0.08); - overflow: hidden; -} - -.plotly-cloud-modal-header { - display: flex; - justify-content: space-between; - align-items: center; - padding: 16px 20px; - border-bottom: 1px solid #e5e5e5; - background: #f9fafb; -} - -.plotly-cloud-modal-header h3 { - margin: 0; - color: #333; -} - -.plotly-cloud-modal-close { - background: none; - border: none; - font-size: 24px; - cursor: pointer; - color: #666; - padding: 0; - width: 30px; - height: 30px; - display: flex; - align-items: center; - justify-content: center; -} - -.plotly-cloud-modal-close:hover { - color: #333; -} - -.plotly-cloud-modal-body { - padding: 20px; - color: black !important; - font-weight: 100; -} -button.plotly-cloud-modal-button { - display: inline-flex; - align-items: center; - gap: 6px; - padding: 6px 10px !important; - border-radius: 4px !important; - font-size: 12px !important; - font-weight: 600 !important; - cursor: pointer; - border: 1px solid transparent; - background: #8b5cf6; - color: white; - border-color: #7c3aed; -} - -.plotly-cloud-modal-button:disabled { - cursor: not-allowed; -} -.plotly-cloud-copy-install { - display: flex; - align-items: center; - justify-content: space-between; - gap: 10px; - padding: 8px 10px; - background: #f9fafb; - border: 1px solid #e5e7eb; - border-radius: 6px; - margin-top: 8px; -} -`, "",{"version":3,"sources":["webpack://./src/components/error/menu/PlotlyCloud.css"],"names":[],"mappings":"AAAA;;;;CAIC;AACD;IACI,kBAAkB;IAClB,YAAY;IACZ,UAAU;IACV,cAAc;AAClB;;AAEA;IACI,kBAAkB;IAClB,YAAY;IACZ,iBAAiB;IACjB,yBAAyB;IACzB,0BAA0B;IAC1B,0CAA0C;IAC1C,gBAAgB;AACpB;;AAEA;IACI,aAAa;IACb,8BAA8B;IAC9B,mBAAmB;IACnB,kBAAkB;IAClB,gCAAgC;IAChC,mBAAmB;AACvB;;AAEA;IACI,SAAS;IACT,WAAW;AACf;;AAEA;IACI,gBAAgB;IAChB,YAAY;IACZ,eAAe;IACf,eAAe;IACf,WAAW;IACX,UAAU;IACV,WAAW;IACX,YAAY;IACZ,aAAa;IACb,mBAAmB;IACnB,uBAAuB;AAC3B;;AAEA;IACI,WAAW;AACf;;AAEA;IACI,aAAa;IACb,uBAAuB;IACvB,gBAAgB;AACpB;AACA;IACI,oBAAoB;IACpB,mBAAmB;IACnB,QAAQ;IACR,4BAA4B;IAC5B,6BAA6B;IAC7B,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,6BAA6B;IAC7B,mBAAmB;IACnB,YAAY;IACZ,qBAAqB;AACzB;;AAEA;IACI,mBAAmB;AACvB;AACA;IACI,aAAa;IACb,mBAAmB;IACnB,8BAA8B;IAC9B,SAAS;IACT,iBAAiB;IACjB,mBAAmB;IACnB,yBAAyB;IACzB,kBAAkB;IAClB,eAAe;AACnB","sourcesContent":["/*\n Same as in plotly-cloud but without the publish\n in the name to avoid future conflicts if changed\n upstream.\n*/\n.plotly-cloud-modal-overlay {\n position: absolute;\n bottom: 100%;\n left: -1px;\n z-index: 10000;\n}\n\n.plotly-cloud-modal-content {\n border-radius: 8px;\n width: 522px;\n background: white;\n border: 1px solid #d1d5db;\n border-radius: 4px 4px 0 0;\n box-shadow: 0 -4px 6px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n}\n\n.plotly-cloud-modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid #e5e5e5;\n background: #f9fafb;\n}\n\n.plotly-cloud-modal-header h3 {\n margin: 0;\n color: #333;\n}\n\n.plotly-cloud-modal-close {\n background: none;\n border: none;\n font-size: 24px;\n cursor: pointer;\n color: #666;\n padding: 0;\n width: 30px;\n height: 30px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.plotly-cloud-modal-close:hover {\n color: #333;\n}\n\n.plotly-cloud-modal-body {\n padding: 20px;\n color: black !important;\n font-weight: 100;\n}\nbutton.plotly-cloud-modal-button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px !important;\n border-radius: 4px !important;\n font-size: 12px !important;\n font-weight: 600 !important;\n cursor: pointer;\n border: 1px solid transparent;\n background: #8b5cf6;\n color: white;\n border-color: #7c3aed;\n}\n\n.plotly-cloud-modal-button:disabled {\n cursor: not-allowed;\n}\n.plotly-cloud-copy-install {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding: 8px 10px;\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n margin-top: 8px;\n}\n"],"sourceRoot":""}]); +___CSS_LOADER_EXPORT___.push([module.id, "/*\n Same as in plotly-cloud but without the publish\n in the name to avoid future conflicts if changed\n upstream.\n*/\n.plotly-cloud-modal-overlay {\n position: absolute;\n bottom: 100%;\n left: -1px;\n z-index: 10000;\n}\n\n.plotly-cloud-modal-content {\n border-radius: 8px;\n width: 522px;\n background: white;\n border: 1px solid #d1d5db;\n border-radius: 4px 4px 0 0;\n box-shadow: 0 -4px 6px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n}\n\n.plotly-cloud-modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid #e5e5e5;\n background: #f9fafb;\n}\n\n.plotly-cloud-modal-header h3 {\n margin: 0;\n color: #333;\n}\n\n.plotly-cloud-modal-close {\n background: none;\n border: none;\n font-size: 24px;\n cursor: pointer;\n color: #666;\n padding: 0;\n width: 30px;\n height: 30px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.plotly-cloud-modal-close:hover {\n color: #333;\n}\n\n.plotly-cloud-modal-body {\n padding: 20px;\n color: black !important;\n font-weight: 100;\n}\nbutton.plotly-cloud-modal-button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px !important;\n border-radius: 4px !important;\n font-size: 12px !important;\n font-weight: 600 !important;\n cursor: pointer;\n border: 1px solid transparent;\n background: #8b5cf6;\n color: white;\n border-color: #7c3aed;\n}\n\n.plotly-cloud-modal-button:disabled {\n cursor: not-allowed;\n}\n.plotly-cloud-copy-install {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding: 8px 10px;\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n margin-top: 8px;\n}\n", "",{"version":3,"sources":["webpack://./src/components/error/menu/PlotlyCloud.css"],"names":[],"mappings":"AAAA;;;;CAIC;AACD;IACI,kBAAkB;IAClB,YAAY;IACZ,UAAU;IACV,cAAc;AAClB;;AAEA;IACI,kBAAkB;IAClB,YAAY;IACZ,iBAAiB;IACjB,yBAAyB;IACzB,0BAA0B;IAC1B,0CAA0C;IAC1C,gBAAgB;AACpB;;AAEA;IACI,aAAa;IACb,8BAA8B;IAC9B,mBAAmB;IACnB,kBAAkB;IAClB,gCAAgC;IAChC,mBAAmB;AACvB;;AAEA;IACI,SAAS;IACT,WAAW;AACf;;AAEA;IACI,gBAAgB;IAChB,YAAY;IACZ,eAAe;IACf,eAAe;IACf,WAAW;IACX,UAAU;IACV,WAAW;IACX,YAAY;IACZ,aAAa;IACb,mBAAmB;IACnB,uBAAuB;AAC3B;;AAEA;IACI,WAAW;AACf;;AAEA;IACI,aAAa;IACb,uBAAuB;IACvB,gBAAgB;AACpB;AACA;IACI,oBAAoB;IACpB,mBAAmB;IACnB,QAAQ;IACR,4BAA4B;IAC5B,6BAA6B;IAC7B,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,6BAA6B;IAC7B,mBAAmB;IACnB,YAAY;IACZ,qBAAqB;AACzB;;AAEA;IACI,mBAAmB;AACvB;AACA;IACI,aAAa;IACb,mBAAmB;IACnB,8BAA8B;IAC9B,SAAS;IACT,iBAAiB;IACjB,mBAAmB;IACnB,yBAAyB;IACzB,kBAAkB;IAClB,eAAe;AACnB","sourcesContent":["/*\n Same as in plotly-cloud but without the publish\n in the name to avoid future conflicts if changed\n upstream.\n*/\n.plotly-cloud-modal-overlay {\n position: absolute;\n bottom: 100%;\n left: -1px;\n z-index: 10000;\n}\n\n.plotly-cloud-modal-content {\n border-radius: 8px;\n width: 522px;\n background: white;\n border: 1px solid #d1d5db;\n border-radius: 4px 4px 0 0;\n box-shadow: 0 -4px 6px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n}\n\n.plotly-cloud-modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid #e5e5e5;\n background: #f9fafb;\n}\n\n.plotly-cloud-modal-header h3 {\n margin: 0;\n color: #333;\n}\n\n.plotly-cloud-modal-close {\n background: none;\n border: none;\n font-size: 24px;\n cursor: pointer;\n color: #666;\n padding: 0;\n width: 30px;\n height: 30px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.plotly-cloud-modal-close:hover {\n color: #333;\n}\n\n.plotly-cloud-modal-body {\n padding: 20px;\n color: black !important;\n font-weight: 100;\n}\nbutton.plotly-cloud-modal-button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px !important;\n border-radius: 4px !important;\n font-size: 12px !important;\n font-weight: 600 !important;\n cursor: pointer;\n border: 1px solid transparent;\n background: #8b5cf6;\n color: white;\n border-color: #7c3aed;\n}\n\n.plotly-cloud-modal-button:disabled {\n cursor: not-allowed;\n}\n.plotly-cloud-copy-install {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding: 8px 10px;\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n margin-top: 8px;\n}\n"],"sourceRoot":""}]); // Exports /* harmony default export */ __webpack_exports__["default"] = (___CSS_LOADER_EXPORT___); -/***/ }, +/***/ }), -/***/ "./node_modules/css-loader/dist/cjs.js!./src/components/error/menu/VersionInfo.css" +/***/ "./node_modules/css-loader/dist/cjs.js!./src/components/error/menu/VersionInfo.css": /*!*****************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./src/components/error/menu/VersionInfo.css ***! \*****************************************************************************************/ -(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -22378,63 +22605,18 @@ __webpack_require__.r(__webpack_exports__); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module -___CSS_LOADER_EXPORT___.push([module.id, `.dash-debug-menu__upgrade-tooltip button, -.dash-debug-menu__upgrade-tooltip a { - background: white; - border: none; - padding: 2px 5px; - white-space: nowrap; - color: #7f4bc4; - font-size: 10pt; - text-decoration: none; - cursor: pointer; - display: flex; - font-family: Verdana, sans-serif !important; - font-weight: 500; - line-height: normal; -} - -.dash-debug-menu__upgrade-tooltip:after { - content: ' '; - position: absolute; - top: 100%; - left: 50%; - margin-left: -5px; - border-width: 10px; - border-style: solid; - border-color: white transparent transparent transparent; -} - -.dash-debug-menu__outer button.dash-debug-menu__upgrade-button { - background-color: #a159ff0d; - border: 1px solid #864ad433; - color: #7f4bc4; - margin-left: 10px; - font-family: Verdana, sans-serif !important; - cursor: pointer; - height: 20px; - padding: 0px 8px; - border-radius: 3px; - font-weight: 500; -} - -.dash-debug-menu__upgrade-button:hover { - background-color: #864ad433; - border-color: #864ad433; - color: #7f4bc4; -} -`, "",{"version":3,"sources":["webpack://./src/components/error/menu/VersionInfo.css"],"names":[],"mappings":"AAAA;;IAEI,iBAAiB;IACjB,YAAY;IACZ,gBAAgB;IAChB,mBAAmB;IACnB,cAAc;IACd,eAAe;IACf,qBAAqB;IACrB,eAAe;IACf,aAAa;IACb,2CAA2C;IAC3C,gBAAgB;IAChB,mBAAmB;AACvB;;AAEA;IACI,YAAY;IACZ,kBAAkB;IAClB,SAAS;IACT,SAAS;IACT,iBAAiB;IACjB,kBAAkB;IAClB,mBAAmB;IACnB,uDAAuD;AAC3D;;AAEA;IACI,2BAA2B;IAC3B,2BAA2B;IAC3B,cAAc;IACd,iBAAiB;IACjB,2CAA2C;IAC3C,eAAe;IACf,YAAY;IACZ,gBAAgB;IAChB,kBAAkB;IAClB,gBAAgB;AACpB;;AAEA;IACI,2BAA2B;IAC3B,uBAAuB;IACvB,cAAc;AAClB","sourcesContent":[".dash-debug-menu__upgrade-tooltip button,\n.dash-debug-menu__upgrade-tooltip a {\n background: white;\n border: none;\n padding: 2px 5px;\n white-space: nowrap;\n color: #7f4bc4;\n font-size: 10pt;\n text-decoration: none;\n cursor: pointer;\n display: flex;\n font-family: Verdana, sans-serif !important;\n font-weight: 500;\n line-height: normal;\n}\n\n.dash-debug-menu__upgrade-tooltip:after {\n content: ' ';\n position: absolute;\n top: 100%;\n left: 50%;\n margin-left: -5px;\n border-width: 10px;\n border-style: solid;\n border-color: white transparent transparent transparent;\n}\n\n.dash-debug-menu__outer button.dash-debug-menu__upgrade-button {\n background-color: #a159ff0d;\n border: 1px solid #864ad433;\n color: #7f4bc4;\n margin-left: 10px;\n font-family: Verdana, sans-serif !important;\n cursor: pointer;\n height: 20px;\n padding: 0px 8px;\n border-radius: 3px;\n font-weight: 500;\n}\n\n.dash-debug-menu__upgrade-button:hover {\n background-color: #864ad433;\n border-color: #864ad433;\n color: #7f4bc4;\n}\n"],"sourceRoot":""}]); +___CSS_LOADER_EXPORT___.push([module.id, ".dash-debug-menu__upgrade-tooltip button,\n.dash-debug-menu__upgrade-tooltip a {\n background: white;\n border: none;\n padding: 2px 5px;\n white-space: nowrap;\n color: #7f4bc4;\n font-size: 10pt;\n text-decoration: none;\n cursor: pointer;\n display: flex;\n font-family: Verdana, sans-serif !important;\n font-weight: 500;\n line-height: normal;\n}\n\n.dash-debug-menu__upgrade-tooltip:after {\n content: ' ';\n position: absolute;\n top: 100%;\n left: 50%;\n margin-left: -5px;\n border-width: 10px;\n border-style: solid;\n border-color: white transparent transparent transparent;\n}\n\n.dash-debug-menu__outer button.dash-debug-menu__upgrade-button {\n background-color: #a159ff0d;\n border: 1px solid #864ad433;\n color: #7f4bc4;\n margin-left: 10px;\n font-family: Verdana, sans-serif !important;\n cursor: pointer;\n height: 20px;\n padding: 0px 8px;\n border-radius: 3px;\n font-weight: 500;\n}\n\n.dash-debug-menu__upgrade-button:hover {\n background-color: #864ad433;\n border-color: #864ad433;\n color: #7f4bc4;\n}\n", "",{"version":3,"sources":["webpack://./src/components/error/menu/VersionInfo.css"],"names":[],"mappings":"AAAA;;IAEI,iBAAiB;IACjB,YAAY;IACZ,gBAAgB;IAChB,mBAAmB;IACnB,cAAc;IACd,eAAe;IACf,qBAAqB;IACrB,eAAe;IACf,aAAa;IACb,2CAA2C;IAC3C,gBAAgB;IAChB,mBAAmB;AACvB;;AAEA;IACI,YAAY;IACZ,kBAAkB;IAClB,SAAS;IACT,SAAS;IACT,iBAAiB;IACjB,kBAAkB;IAClB,mBAAmB;IACnB,uDAAuD;AAC3D;;AAEA;IACI,2BAA2B;IAC3B,2BAA2B;IAC3B,cAAc;IACd,iBAAiB;IACjB,2CAA2C;IAC3C,eAAe;IACf,YAAY;IACZ,gBAAgB;IAChB,kBAAkB;IAClB,gBAAgB;AACpB;;AAEA;IACI,2BAA2B;IAC3B,uBAAuB;IACvB,cAAc;AAClB","sourcesContent":[".dash-debug-menu__upgrade-tooltip button,\n.dash-debug-menu__upgrade-tooltip a {\n background: white;\n border: none;\n padding: 2px 5px;\n white-space: nowrap;\n color: #7f4bc4;\n font-size: 10pt;\n text-decoration: none;\n cursor: pointer;\n display: flex;\n font-family: Verdana, sans-serif !important;\n font-weight: 500;\n line-height: normal;\n}\n\n.dash-debug-menu__upgrade-tooltip:after {\n content: ' ';\n position: absolute;\n top: 100%;\n left: 50%;\n margin-left: -5px;\n border-width: 10px;\n border-style: solid;\n border-color: white transparent transparent transparent;\n}\n\n.dash-debug-menu__outer button.dash-debug-menu__upgrade-button {\n background-color: #a159ff0d;\n border: 1px solid #864ad433;\n color: #7f4bc4;\n margin-left: 10px;\n font-family: Verdana, sans-serif !important;\n cursor: pointer;\n height: 20px;\n padding: 0px 8px;\n border-radius: 3px;\n font-weight: 500;\n}\n\n.dash-debug-menu__upgrade-button:hover {\n background-color: #864ad433;\n border-color: #864ad433;\n color: #7f4bc4;\n}\n"],"sourceRoot":""}]); // Exports /* harmony default export */ __webpack_exports__["default"] = (___CSS_LOADER_EXPORT___); -/***/ }, +/***/ }), -/***/ "./node_modules/css-loader/dist/runtime/api.js" +/***/ "./node_modules/css-loader/dist/runtime/api.js": /*!*****************************************************!*\ !*** ./node_modules/css-loader/dist/runtime/api.js ***! \*****************************************************/ -(module) { +/***/ (function(module) { "use strict"; @@ -22523,13 +22705,13 @@ module.exports = function (cssWithMappingToString) { return list; }; -/***/ }, +/***/ }), -/***/ "./node_modules/css-loader/dist/runtime/sourceMaps.js" +/***/ "./node_modules/css-loader/dist/runtime/sourceMaps.js": /*!************************************************************!*\ !*** ./node_modules/css-loader/dist/runtime/sourceMaps.js ***! \************************************************************/ -(module) { +/***/ (function(module) { "use strict"; @@ -22549,13 +22731,13 @@ module.exports = function (item) { return [content].join("\n"); }; -/***/ }, +/***/ }), -/***/ "./node_modules/cytoscape-dagre/cytoscape-dagre.js" +/***/ "./node_modules/cytoscape-dagre/cytoscape-dagre.js": /*!*********************************************************!*\ !*** ./node_modules/cytoscape-dagre/cytoscape-dagre.js ***! \*********************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { (function webpackUniversalModuleDefinition(root, factory) { if(true) @@ -22951,13 +23133,13 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__4__; /******/ ]); }); -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/index.js" +/***/ "./node_modules/dagre/index.js": /*!*************************************!*\ !*** ./node_modules/dagre/index.js ***! \*************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { /* Copyright (c) 2012-2014 Chris Pettitt @@ -22994,13 +23176,13 @@ module.exports = { }; -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/acyclic.js" +/***/ "./node_modules/dagre/lib/acyclic.js": /*!*******************************************!*\ !*** ./node_modules/dagre/lib/acyclic.js ***! \*******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -23072,13 +23254,13 @@ function undo(g) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/add-border-segments.js" +/***/ "./node_modules/dagre/lib/add-border-segments.js": /*!*******************************************************!*\ !*** ./node_modules/dagre/lib/add-border-segments.js ***! \*******************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js"); @@ -23120,13 +23302,13 @@ function addBorderNode(g, prop, prefix, sg, sgNode, rank) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/coordinate-system.js" +/***/ "./node_modules/dagre/lib/coordinate-system.js": /*!*****************************************************!*\ !*** ./node_modules/dagre/lib/coordinate-system.js ***! \*****************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -23203,13 +23385,13 @@ function swapXYOne(attrs) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/data/list.js" +/***/ "./node_modules/dagre/lib/data/list.js": /*!*********************************************!*\ !*** ./node_modules/dagre/lib/data/list.js ***! \*********************************************/ -(module) { +/***/ (function(module) { /* * Simple doubly linked list implementation derived from Cormen, et al., @@ -23269,13 +23451,13 @@ function filterOutLinks(k, v) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/debug.js" +/***/ "./node_modules/dagre/lib/debug.js": /*!*****************************************!*\ !*** ./node_modules/dagre/lib/debug.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js"); @@ -23313,13 +23495,13 @@ function debugOrdering(g) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/graphlib.js" +/***/ "./node_modules/dagre/lib/graphlib.js": /*!********************************************!*\ !*** ./node_modules/dagre/lib/graphlib.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { /* global window */ @@ -23340,13 +23522,13 @@ if (!graphlib) { module.exports = graphlib; -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/greedy-fas.js" +/***/ "./node_modules/dagre/lib/greedy-fas.js": /*!**********************************************!*\ !*** ./node_modules/dagre/lib/greedy-fas.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); var Graph = (__webpack_require__(/*! ./graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); @@ -23468,13 +23650,13 @@ function assignBucket(buckets, zeroIdx, entry) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/layout.js" +/***/ "./node_modules/dagre/lib/layout.js": /*!******************************************!*\ !*** ./node_modules/dagre/lib/layout.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -23871,13 +24053,13 @@ function canonicalize(attrs) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/lodash.js" +/***/ "./node_modules/dagre/lib/lodash.js": /*!******************************************!*\ !*** ./node_modules/dagre/lib/lodash.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { /* global window */ @@ -23925,13 +24107,13 @@ if (!lodash) { module.exports = lodash; -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/nesting-graph.js" +/***/ "./node_modules/dagre/lib/nesting-graph.js": /*!*************************************************!*\ !*** ./node_modules/dagre/lib/nesting-graph.js ***! \*************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js"); @@ -24067,13 +24249,13 @@ function cleanup(g) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/normalize.js" +/***/ "./node_modules/dagre/lib/normalize.js": /*!*********************************************!*\ !*** ./node_modules/dagre/lib/normalize.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -24168,13 +24350,13 @@ function undo(g) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/order/add-subgraph-constraints.js" +/***/ "./node_modules/dagre/lib/order/add-subgraph-constraints.js": /*!******************************************************************!*\ !*** ./node_modules/dagre/lib/order/add-subgraph-constraints.js ***! \******************************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); @@ -24231,13 +24413,13 @@ function addSubgraphConstraints(g, cg, vs) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/order/barycenter.js" +/***/ "./node_modules/dagre/lib/order/barycenter.js": /*!****************************************************!*\ !*** ./node_modules/dagre/lib/order/barycenter.js ***! \****************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); @@ -24269,13 +24451,13 @@ function barycenter(g, movable) { -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/order/build-layer-graph.js" +/***/ "./node_modules/dagre/lib/order/build-layer-graph.js": /*!***********************************************************!*\ !*** ./node_modules/dagre/lib/order/build-layer-graph.js ***! \***********************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); var Graph = (__webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph); @@ -24352,13 +24534,13 @@ function createRootNode(g) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/order/cross-count.js" +/***/ "./node_modules/dagre/lib/order/cross-count.js": /*!*****************************************************!*\ !*** ./node_modules/dagre/lib/order/cross-count.js ***! \*****************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -24430,13 +24612,13 @@ function twoLayerCrossCount(g, northLayer, southLayer) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/order/index.js" +/***/ "./node_modules/dagre/lib/order/index.js": /*!***********************************************!*\ !*** ./node_modules/dagre/lib/order/index.js ***! \***********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -24520,13 +24702,13 @@ function assignOrder(g, layering) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/order/init-order.js" +/***/ "./node_modules/dagre/lib/order/init-order.js": /*!****************************************************!*\ !*** ./node_modules/dagre/lib/order/init-order.js ***! \****************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -24569,13 +24751,13 @@ function initOrder(g) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/order/resolve-conflicts.js" +/***/ "./node_modules/dagre/lib/order/resolve-conflicts.js": /*!***********************************************************!*\ !*** ./node_modules/dagre/lib/order/resolve-conflicts.js ***! \***********************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -24702,13 +24884,13 @@ function mergeEntries(target, source) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/order/sort-subgraph.js" +/***/ "./node_modules/dagre/lib/order/sort-subgraph.js": /*!*******************************************************!*\ !*** ./node_modules/dagre/lib/order/sort-subgraph.js ***! \*******************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); var barycenter = __webpack_require__(/*! ./barycenter */ "./node_modules/dagre/lib/order/barycenter.js"); @@ -24788,13 +24970,13 @@ function mergeBarycenters(target, other) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/order/sort.js" +/***/ "./node_modules/dagre/lib/order/sort.js": /*!**********************************************!*\ !*** ./node_modules/dagre/lib/order/sort.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js"); var util = __webpack_require__(/*! ../util */ "./node_modules/dagre/lib/util.js"); @@ -24855,13 +25037,13 @@ function compareWithBias(bias) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/parent-dummy-chains.js" +/***/ "./node_modules/dagre/lib/parent-dummy-chains.js": /*!*******************************************************!*\ !*** ./node_modules/dagre/lib/parent-dummy-chains.js ***! \*******************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js"); @@ -24951,13 +25133,13 @@ function postorder(g) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/position/bk.js" +/***/ "./node_modules/dagre/lib/position/bk.js": /*!***********************************************!*\ !*** ./node_modules/dagre/lib/position/bk.js ***! \***********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -25381,13 +25563,13 @@ function width(g, v) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/position/index.js" +/***/ "./node_modules/dagre/lib/position/index.js": /*!**************************************************!*\ !*** ./node_modules/dagre/lib/position/index.js ***! \**************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -25422,13 +25604,13 @@ function positionY(g) { -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/rank/feasible-tree.js" +/***/ "./node_modules/dagre/lib/rank/feasible-tree.js": /*!******************************************************!*\ !*** ./node_modules/dagre/lib/rank/feasible-tree.js ***! \******************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -25522,13 +25704,13 @@ function shiftRanks(t, g, delta) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/rank/index.js" +/***/ "./node_modules/dagre/lib/rank/index.js": /*!**********************************************!*\ !*** ./node_modules/dagre/lib/rank/index.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -25581,13 +25763,13 @@ function networkSimplexRanker(g) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/rank/network-simplex.js" +/***/ "./node_modules/dagre/lib/rank/network-simplex.js": /*!********************************************************!*\ !*** ./node_modules/dagre/lib/rank/network-simplex.js ***! \********************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -25826,13 +26008,13 @@ function isDescendant(tree, vLabel, rootLabel) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/rank/util.js" +/***/ "./node_modules/dagre/lib/rank/util.js": /*!*********************************************!*\ !*** ./node_modules/dagre/lib/rank/util.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -25900,13 +26082,13 @@ function slack(g, e) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/util.js" +/***/ "./node_modules/dagre/lib/util.js": /*!****************************************!*\ !*** ./node_modules/dagre/lib/util.js ***! \****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; /* eslint "no-console": off */ @@ -26149,24 +26331,24 @@ function notime(name, fn) { } -/***/ }, +/***/ }), -/***/ "./node_modules/dagre/lib/version.js" +/***/ "./node_modules/dagre/lib/version.js": /*!*******************************************!*\ !*** ./node_modules/dagre/lib/version.js ***! \*******************************************/ -(module) { +/***/ (function(module) { module.exports = "0.8.5"; -/***/ }, +/***/ }), -/***/ "./node_modules/dependency-graph/lib/dep_graph.js" +/***/ "./node_modules/dependency-graph/lib/dep_graph.js": /*!********************************************************!*\ !*** ./node_modules/dependency-graph/lib/dep_graph.js ***! \********************************************************/ -(__unused_webpack_module, exports) { +/***/ (function(__unused_webpack_module, exports) { /** * A simple dependency graph @@ -26534,13 +26716,13 @@ DepGraphCycleError.prototype = Object.create(Error.prototype, { Object.setPrototypeOf(DepGraphCycleError, Error); -/***/ }, +/***/ }), -/***/ "./node_modules/fast-isnumeric/index.js" +/***/ "./node_modules/fast-isnumeric/index.js": /*!**********************************************!*\ !*** ./node_modules/fast-isnumeric/index.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; /** @@ -26569,13 +26751,13 @@ module.exports = function(n) { }; -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/index.js" +/***/ "./node_modules/graphlib/index.js": /*!****************************************!*\ !*** ./node_modules/graphlib/index.js ***! \****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { /** * Copyright (c) 2014, Chris Pettitt @@ -26617,13 +26799,13 @@ module.exports = { }; -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/alg/components.js" +/***/ "./node_modules/graphlib/lib/alg/components.js": /*!*****************************************************!*\ !*** ./node_modules/graphlib/lib/alg/components.js ***! \*****************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); @@ -26654,13 +26836,13 @@ function components(g) { } -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/alg/dfs.js" +/***/ "./node_modules/graphlib/lib/alg/dfs.js": /*!**********************************************!*\ !*** ./node_modules/graphlib/lib/alg/dfs.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); @@ -26706,13 +26888,13 @@ function doDfs(g, v, postorder, visited, navigation, acc) { } -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/alg/dijkstra-all.js" +/***/ "./node_modules/graphlib/lib/alg/dijkstra-all.js": /*!*******************************************************!*\ !*** ./node_modules/graphlib/lib/alg/dijkstra-all.js ***! \*******************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var dijkstra = __webpack_require__(/*! ./dijkstra */ "./node_modules/graphlib/lib/alg/dijkstra.js"); var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); @@ -26726,13 +26908,13 @@ function dijkstraAll(g, weightFunc, edgeFunc) { } -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/alg/dijkstra.js" +/***/ "./node_modules/graphlib/lib/alg/dijkstra.js": /*!***************************************************!*\ !*** ./node_modules/graphlib/lib/alg/dijkstra.js ***! \***************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); var PriorityQueue = __webpack_require__(/*! ../data/priority-queue */ "./node_modules/graphlib/lib/data/priority-queue.js"); @@ -26790,13 +26972,13 @@ function runDijkstra(g, source, weightFn, edgeFn) { } -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/alg/find-cycles.js" +/***/ "./node_modules/graphlib/lib/alg/find-cycles.js": /*!******************************************************!*\ !*** ./node_modules/graphlib/lib/alg/find-cycles.js ***! \******************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); var tarjan = __webpack_require__(/*! ./tarjan */ "./node_modules/graphlib/lib/alg/tarjan.js"); @@ -26810,13 +26992,13 @@ function findCycles(g) { } -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/alg/floyd-warshall.js" +/***/ "./node_modules/graphlib/lib/alg/floyd-warshall.js": /*!*********************************************************!*\ !*** ./node_modules/graphlib/lib/alg/floyd-warshall.js ***! \*********************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); @@ -26870,13 +27052,13 @@ function runFloydWarshall(g, weightFn, edgeFn) { } -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/alg/index.js" +/***/ "./node_modules/graphlib/lib/alg/index.js": /*!************************************************!*\ !*** ./node_modules/graphlib/lib/alg/index.js ***! \************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { module.exports = { components: __webpack_require__(/*! ./components */ "./node_modules/graphlib/lib/alg/components.js"), @@ -26893,13 +27075,13 @@ module.exports = { }; -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/alg/is-acyclic.js" +/***/ "./node_modules/graphlib/lib/alg/is-acyclic.js": /*!*****************************************************!*\ !*** ./node_modules/graphlib/lib/alg/is-acyclic.js ***! \*****************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var topsort = __webpack_require__(/*! ./topsort */ "./node_modules/graphlib/lib/alg/topsort.js"); @@ -26918,13 +27100,13 @@ function isAcyclic(g) { } -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/alg/postorder.js" +/***/ "./node_modules/graphlib/lib/alg/postorder.js": /*!****************************************************!*\ !*** ./node_modules/graphlib/lib/alg/postorder.js ***! \****************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var dfs = __webpack_require__(/*! ./dfs */ "./node_modules/graphlib/lib/alg/dfs.js"); @@ -26935,13 +27117,13 @@ function postorder(g, vs) { } -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/alg/preorder.js" +/***/ "./node_modules/graphlib/lib/alg/preorder.js": /*!***************************************************!*\ !*** ./node_modules/graphlib/lib/alg/preorder.js ***! \***************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var dfs = __webpack_require__(/*! ./dfs */ "./node_modules/graphlib/lib/alg/dfs.js"); @@ -26952,13 +27134,13 @@ function preorder(g, vs) { } -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/alg/prim.js" +/***/ "./node_modules/graphlib/lib/alg/prim.js": /*!***********************************************!*\ !*** ./node_modules/graphlib/lib/alg/prim.js ***! \***********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); var Graph = __webpack_require__(/*! ../graph */ "./node_modules/graphlib/lib/graph.js"); @@ -27014,13 +27196,13 @@ function prim(g, weightFunc) { } -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/alg/tarjan.js" +/***/ "./node_modules/graphlib/lib/alg/tarjan.js": /*!*************************************************!*\ !*** ./node_modules/graphlib/lib/alg/tarjan.js ***! \*************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); @@ -27071,13 +27253,13 @@ function tarjan(g) { } -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/alg/topsort.js" +/***/ "./node_modules/graphlib/lib/alg/topsort.js": /*!**************************************************!*\ !*** ./node_modules/graphlib/lib/alg/topsort.js ***! \**************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); @@ -27115,13 +27297,13 @@ function topsort(g) { function CycleException() {} CycleException.prototype = new Error(); // must be an instance of Error to pass testing -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/data/priority-queue.js" +/***/ "./node_modules/graphlib/lib/data/priority-queue.js": /*!**********************************************************!*\ !*** ./node_modules/graphlib/lib/data/priority-queue.js ***! \**********************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js"); @@ -27277,13 +27459,13 @@ PriorityQueue.prototype._swap = function(i, j) { }; -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/graph.js" +/***/ "./node_modules/graphlib/lib/graph.js": /*!********************************************!*\ !*** ./node_modules/graphlib/lib/graph.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -27820,13 +28002,13 @@ function edgeObjToId(isDirected, edgeObj) { } -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/index.js" +/***/ "./node_modules/graphlib/lib/index.js": /*!********************************************!*\ !*** ./node_modules/graphlib/lib/index.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { // Includes only the "core" of graphlib module.exports = { @@ -27835,13 +28017,13 @@ module.exports = { }; -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/json.js" +/***/ "./node_modules/graphlib/lib/json.js": /*!*******************************************!*\ !*** ./node_modules/graphlib/lib/json.js ***! \*******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var _ = __webpack_require__(/*! ./lodash */ "./node_modules/graphlib/lib/lodash.js"); var Graph = __webpack_require__(/*! ./graph */ "./node_modules/graphlib/lib/graph.js"); @@ -27911,13 +28093,13 @@ function read(json) { } -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/lodash.js" +/***/ "./node_modules/graphlib/lib/lodash.js": /*!*********************************************!*\ !*** ./node_modules/graphlib/lib/lodash.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { /* global window */ @@ -27955,24 +28137,24 @@ if (!lodash) { module.exports = lodash; -/***/ }, +/***/ }), -/***/ "./node_modules/graphlib/lib/version.js" +/***/ "./node_modules/graphlib/lib/version.js": /*!**********************************************!*\ !*** ./node_modules/graphlib/lib/version.js ***! \**********************************************/ -(module) { +/***/ (function(module) { module.exports = '2.1.8'; -/***/ }, +/***/ }), -/***/ "./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js" +/***/ "./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js": /*!**********************************************************************************!*\ !*** ./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js ***! \**********************************************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -28080,13 +28262,13 @@ function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) { module.exports = hoistNonReactStatics; -/***/ }, +/***/ }), -/***/ "./node_modules/invariant/browser.js" +/***/ "./node_modules/invariant/browser.js": /*!*******************************************!*\ !*** ./node_modules/invariant/browser.js ***! \*******************************************/ -(module) { +/***/ (function(module) { "use strict"; /** @@ -28140,13 +28322,13 @@ var invariant = function(condition, format, a, b, c, d, e, f) { module.exports = invariant; -/***/ }, +/***/ }), -/***/ "./node_modules/is-string-blank/index.js" +/***/ "./node_modules/is-string-blank/index.js": /*!***********************************************!*\ !*** ./node_modules/is-string-blank/index.js ***! \***********************************************/ -(module) { +/***/ (function(module) { "use strict"; @@ -28186,13 +28368,13 @@ module.exports = function(str){ } -/***/ }, +/***/ }), -/***/ "./node_modules/layout-base/layout-base.js" +/***/ "./node_modules/layout-base/layout-base.js": /*!*************************************************!*\ !*** ./node_modules/layout-base/layout-base.js ***! \*************************************************/ -(module) { +/***/ (function(module) { (function webpackUniversalModuleDefinition(root, factory) { if(true) @@ -33421,13 +33603,13 @@ module.exports = Emitter; /******/ ]); }); -/***/ }, +/***/ }), -/***/ "./node_modules/lodash.curry/index.js" +/***/ "./node_modules/lodash.curry/index.js": /*!********************************************!*\ !*** ./node_modules/lodash.curry/index.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { /** * lodash (Custom Build) @@ -34660,13 +34842,13 @@ curry.placeholder = {}; module.exports = curry; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_DataView.js" +/***/ "./node_modules/lodash/_DataView.js": /*!******************************************!*\ !*** ./node_modules/lodash/_DataView.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); @@ -34677,13 +34859,13 @@ var DataView = getNative(root, 'DataView'); module.exports = DataView; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_Hash.js" +/***/ "./node_modules/lodash/_Hash.js": /*!**************************************!*\ !*** ./node_modules/lodash/_Hash.js ***! \**************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var hashClear = __webpack_require__(/*! ./_hashClear */ "./node_modules/lodash/_hashClear.js"), hashDelete = __webpack_require__(/*! ./_hashDelete */ "./node_modules/lodash/_hashDelete.js"), @@ -34719,13 +34901,13 @@ Hash.prototype.set = hashSet; module.exports = Hash; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_ListCache.js" +/***/ "./node_modules/lodash/_ListCache.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_ListCache.js ***! \*******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var listCacheClear = __webpack_require__(/*! ./_listCacheClear */ "./node_modules/lodash/_listCacheClear.js"), listCacheDelete = __webpack_require__(/*! ./_listCacheDelete */ "./node_modules/lodash/_listCacheDelete.js"), @@ -34761,13 +34943,13 @@ ListCache.prototype.set = listCacheSet; module.exports = ListCache; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_Map.js" +/***/ "./node_modules/lodash/_Map.js": /*!*************************************!*\ !*** ./node_modules/lodash/_Map.js ***! \*************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); @@ -34778,13 +34960,13 @@ var Map = getNative(root, 'Map'); module.exports = Map; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_MapCache.js" +/***/ "./node_modules/lodash/_MapCache.js": /*!******************************************!*\ !*** ./node_modules/lodash/_MapCache.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var mapCacheClear = __webpack_require__(/*! ./_mapCacheClear */ "./node_modules/lodash/_mapCacheClear.js"), mapCacheDelete = __webpack_require__(/*! ./_mapCacheDelete */ "./node_modules/lodash/_mapCacheDelete.js"), @@ -34820,13 +35002,13 @@ MapCache.prototype.set = mapCacheSet; module.exports = MapCache; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_Promise.js" +/***/ "./node_modules/lodash/_Promise.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_Promise.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); @@ -34837,13 +35019,13 @@ var Promise = getNative(root, 'Promise'); module.exports = Promise; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_Set.js" +/***/ "./node_modules/lodash/_Set.js": /*!*************************************!*\ !*** ./node_modules/lodash/_Set.js ***! \*************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); @@ -34854,13 +35036,13 @@ var Set = getNative(root, 'Set'); module.exports = Set; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_SetCache.js" +/***/ "./node_modules/lodash/_SetCache.js": /*!******************************************!*\ !*** ./node_modules/lodash/_SetCache.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var MapCache = __webpack_require__(/*! ./_MapCache */ "./node_modules/lodash/_MapCache.js"), setCacheAdd = __webpack_require__(/*! ./_setCacheAdd */ "./node_modules/lodash/_setCacheAdd.js"), @@ -34891,13 +35073,13 @@ SetCache.prototype.has = setCacheHas; module.exports = SetCache; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_Stack.js" +/***/ "./node_modules/lodash/_Stack.js": /*!***************************************!*\ !*** ./node_modules/lodash/_Stack.js ***! \***************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"), stackClear = __webpack_require__(/*! ./_stackClear */ "./node_modules/lodash/_stackClear.js"), @@ -34928,13 +35110,13 @@ Stack.prototype.set = stackSet; module.exports = Stack; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_Symbol.js" +/***/ "./node_modules/lodash/_Symbol.js": /*!****************************************!*\ !*** ./node_modules/lodash/_Symbol.js ***! \****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); @@ -34944,13 +35126,13 @@ var Symbol = root.Symbol; module.exports = Symbol; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_Uint8Array.js" +/***/ "./node_modules/lodash/_Uint8Array.js": /*!********************************************!*\ !*** ./node_modules/lodash/_Uint8Array.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); @@ -34960,13 +35142,13 @@ var Uint8Array = root.Uint8Array; module.exports = Uint8Array; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_WeakMap.js" +/***/ "./node_modules/lodash/_WeakMap.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_WeakMap.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"), root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); @@ -34977,13 +35159,13 @@ var WeakMap = getNative(root, 'WeakMap'); module.exports = WeakMap; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_apply.js" +/***/ "./node_modules/lodash/_apply.js": /*!***************************************!*\ !*** ./node_modules/lodash/_apply.js ***! \***************************************/ -(module) { +/***/ (function(module) { /** * A faster alternative to `Function#apply`, this function invokes `func` @@ -35008,13 +35190,13 @@ function apply(func, thisArg, args) { module.exports = apply; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_arrayEach.js" +/***/ "./node_modules/lodash/_arrayEach.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_arrayEach.js ***! \*******************************************/ -(module) { +/***/ (function(module) { /** * A specialized version of `_.forEach` for arrays without support for @@ -35040,13 +35222,13 @@ function arrayEach(array, iteratee) { module.exports = arrayEach; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_arrayFilter.js" +/***/ "./node_modules/lodash/_arrayFilter.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_arrayFilter.js ***! \*********************************************/ -(module) { +/***/ (function(module) { /** * A specialized version of `_.filter` for arrays without support for @@ -35075,13 +35257,13 @@ function arrayFilter(array, predicate) { module.exports = arrayFilter; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_arrayIncludes.js" +/***/ "./node_modules/lodash/_arrayIncludes.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_arrayIncludes.js ***! \***********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseIndexOf = __webpack_require__(/*! ./_baseIndexOf */ "./node_modules/lodash/_baseIndexOf.js"); @@ -35102,13 +35284,13 @@ function arrayIncludes(array, value) { module.exports = arrayIncludes; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_arrayIncludesWith.js" +/***/ "./node_modules/lodash/_arrayIncludesWith.js": /*!***************************************************!*\ !*** ./node_modules/lodash/_arrayIncludesWith.js ***! \***************************************************/ -(module) { +/***/ (function(module) { /** * This function is like `arrayIncludes` except that it accepts a comparator. @@ -35134,13 +35316,13 @@ function arrayIncludesWith(array, value, comparator) { module.exports = arrayIncludesWith; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_arrayLikeKeys.js" +/***/ "./node_modules/lodash/_arrayLikeKeys.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_arrayLikeKeys.js ***! \***********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseTimes = __webpack_require__(/*! ./_baseTimes */ "./node_modules/lodash/_baseTimes.js"), isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"), @@ -35193,13 +35375,13 @@ function arrayLikeKeys(value, inherited) { module.exports = arrayLikeKeys; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_arrayMap.js" +/***/ "./node_modules/lodash/_arrayMap.js": /*!******************************************!*\ !*** ./node_modules/lodash/_arrayMap.js ***! \******************************************/ -(module) { +/***/ (function(module) { /** * A specialized version of `_.map` for arrays without support for iteratee @@ -35224,13 +35406,13 @@ function arrayMap(array, iteratee) { module.exports = arrayMap; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_arrayPush.js" +/***/ "./node_modules/lodash/_arrayPush.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_arrayPush.js ***! \*******************************************/ -(module) { +/***/ (function(module) { /** * Appends the elements of `values` to `array`. @@ -35254,13 +35436,13 @@ function arrayPush(array, values) { module.exports = arrayPush; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_arrayReduce.js" +/***/ "./node_modules/lodash/_arrayReduce.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_arrayReduce.js ***! \*********************************************/ -(module) { +/***/ (function(module) { /** * A specialized version of `_.reduce` for arrays without support for @@ -35290,13 +35472,13 @@ function arrayReduce(array, iteratee, accumulator, initAccum) { module.exports = arrayReduce; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_arraySome.js" +/***/ "./node_modules/lodash/_arraySome.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_arraySome.js ***! \*******************************************/ -(module) { +/***/ (function(module) { /** * A specialized version of `_.some` for arrays without support for iteratee @@ -35323,13 +35505,13 @@ function arraySome(array, predicate) { module.exports = arraySome; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_asciiSize.js" +/***/ "./node_modules/lodash/_asciiSize.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_asciiSize.js ***! \*******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseProperty = __webpack_require__(/*! ./_baseProperty */ "./node_modules/lodash/_baseProperty.js"); @@ -35345,13 +35527,13 @@ var asciiSize = baseProperty('length'); module.exports = asciiSize; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_assignMergeValue.js" +/***/ "./node_modules/lodash/_assignMergeValue.js": /*!**************************************************!*\ !*** ./node_modules/lodash/_assignMergeValue.js ***! \**************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"), eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"); @@ -35375,13 +35557,13 @@ function assignMergeValue(object, key, value) { module.exports = assignMergeValue; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_assignValue.js" +/***/ "./node_modules/lodash/_assignValue.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_assignValue.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"), eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"); @@ -35413,13 +35595,13 @@ function assignValue(object, key, value) { module.exports = assignValue; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_assocIndexOf.js" +/***/ "./node_modules/lodash/_assocIndexOf.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_assocIndexOf.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"); @@ -35444,13 +35626,13 @@ function assocIndexOf(array, key) { module.exports = assocIndexOf; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseAssign.js" +/***/ "./node_modules/lodash/_baseAssign.js": /*!********************************************!*\ !*** ./node_modules/lodash/_baseAssign.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"), keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); @@ -35471,13 +35653,13 @@ function baseAssign(object, source) { module.exports = baseAssign; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseAssignIn.js" +/***/ "./node_modules/lodash/_baseAssignIn.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_baseAssignIn.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"), keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js"); @@ -35498,13 +35680,13 @@ function baseAssignIn(object, source) { module.exports = baseAssignIn; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseAssignValue.js" +/***/ "./node_modules/lodash/_baseAssignValue.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_baseAssignValue.js ***! \*************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var defineProperty = __webpack_require__(/*! ./_defineProperty */ "./node_modules/lodash/_defineProperty.js"); @@ -35533,13 +35715,13 @@ function baseAssignValue(object, key, value) { module.exports = baseAssignValue; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseClone.js" +/***/ "./node_modules/lodash/_baseClone.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseClone.js ***! \*******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"), arrayEach = __webpack_require__(/*! ./_arrayEach */ "./node_modules/lodash/_arrayEach.js"), @@ -35709,13 +35891,13 @@ function baseClone(value, bitmask, customizer, key, object, stack) { module.exports = baseClone; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseCreate.js" +/***/ "./node_modules/lodash/_baseCreate.js": /*!********************************************!*\ !*** ./node_modules/lodash/_baseCreate.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"); @@ -35749,13 +35931,13 @@ var baseCreate = (function() { module.exports = baseCreate; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseEach.js" +/***/ "./node_modules/lodash/_baseEach.js": /*!******************************************!*\ !*** ./node_modules/lodash/_baseEach.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseForOwn = __webpack_require__(/*! ./_baseForOwn */ "./node_modules/lodash/_baseForOwn.js"), createBaseEach = __webpack_require__(/*! ./_createBaseEach */ "./node_modules/lodash/_createBaseEach.js"); @@ -35773,13 +35955,13 @@ var baseEach = createBaseEach(baseForOwn); module.exports = baseEach; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseExtremum.js" +/***/ "./node_modules/lodash/_baseExtremum.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_baseExtremum.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); @@ -35815,13 +35997,13 @@ function baseExtremum(array, iteratee, comparator) { module.exports = baseExtremum; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseFilter.js" +/***/ "./node_modules/lodash/_baseFilter.js": /*!********************************************!*\ !*** ./node_modules/lodash/_baseFilter.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js"); @@ -35846,13 +36028,13 @@ function baseFilter(collection, predicate) { module.exports = baseFilter; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseFindIndex.js" +/***/ "./node_modules/lodash/_baseFindIndex.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_baseFindIndex.js ***! \***********************************************/ -(module) { +/***/ (function(module) { /** * The base implementation of `_.findIndex` and `_.findLastIndex` without @@ -35880,13 +36062,13 @@ function baseFindIndex(array, predicate, fromIndex, fromRight) { module.exports = baseFindIndex; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseFlatten.js" +/***/ "./node_modules/lodash/_baseFlatten.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseFlatten.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var arrayPush = __webpack_require__(/*! ./_arrayPush */ "./node_modules/lodash/_arrayPush.js"), isFlattenable = __webpack_require__(/*! ./_isFlattenable */ "./node_modules/lodash/_isFlattenable.js"); @@ -35928,13 +36110,13 @@ function baseFlatten(array, depth, predicate, isStrict, result) { module.exports = baseFlatten; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseFor.js" +/***/ "./node_modules/lodash/_baseFor.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_baseFor.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var createBaseFor = __webpack_require__(/*! ./_createBaseFor */ "./node_modules/lodash/_createBaseFor.js"); @@ -35954,13 +36136,13 @@ var baseFor = createBaseFor(); module.exports = baseFor; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseForOwn.js" +/***/ "./node_modules/lodash/_baseForOwn.js": /*!********************************************!*\ !*** ./node_modules/lodash/_baseForOwn.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseFor = __webpack_require__(/*! ./_baseFor */ "./node_modules/lodash/_baseFor.js"), keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); @@ -35980,13 +36162,13 @@ function baseForOwn(object, iteratee) { module.exports = baseForOwn; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseGet.js" +/***/ "./node_modules/lodash/_baseGet.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_baseGet.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js"), toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js"); @@ -36014,13 +36196,13 @@ function baseGet(object, path) { module.exports = baseGet; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseGetAllKeys.js" +/***/ "./node_modules/lodash/_baseGetAllKeys.js": /*!************************************************!*\ !*** ./node_modules/lodash/_baseGetAllKeys.js ***! \************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var arrayPush = __webpack_require__(/*! ./_arrayPush */ "./node_modules/lodash/_arrayPush.js"), isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"); @@ -36044,13 +36226,13 @@ function baseGetAllKeys(object, keysFunc, symbolsFunc) { module.exports = baseGetAllKeys; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseGetTag.js" +/***/ "./node_modules/lodash/_baseGetTag.js": /*!********************************************!*\ !*** ./node_modules/lodash/_baseGetTag.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), getRawTag = __webpack_require__(/*! ./_getRawTag */ "./node_modules/lodash/_getRawTag.js"), @@ -36082,13 +36264,13 @@ function baseGetTag(value) { module.exports = baseGetTag; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseGt.js" +/***/ "./node_modules/lodash/_baseGt.js": /*!****************************************!*\ !*** ./node_modules/lodash/_baseGt.js ***! \****************************************/ -(module) { +/***/ (function(module) { /** * The base implementation of `_.gt` which doesn't coerce arguments. @@ -36106,13 +36288,13 @@ function baseGt(value, other) { module.exports = baseGt; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseHas.js" +/***/ "./node_modules/lodash/_baseHas.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_baseHas.js ***! \*****************************************/ -(module) { +/***/ (function(module) { /** Used for built-in method references. */ var objectProto = Object.prototype; @@ -36135,13 +36317,13 @@ function baseHas(object, key) { module.exports = baseHas; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseHasIn.js" +/***/ "./node_modules/lodash/_baseHasIn.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseHasIn.js ***! \*******************************************/ -(module) { +/***/ (function(module) { /** * The base implementation of `_.hasIn` without support for deep paths. @@ -36158,13 +36340,13 @@ function baseHasIn(object, key) { module.exports = baseHasIn; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseIndexOf.js" +/***/ "./node_modules/lodash/_baseIndexOf.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseIndexOf.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseFindIndex = __webpack_require__(/*! ./_baseFindIndex */ "./node_modules/lodash/_baseFindIndex.js"), baseIsNaN = __webpack_require__(/*! ./_baseIsNaN */ "./node_modules/lodash/_baseIsNaN.js"), @@ -36188,13 +36370,13 @@ function baseIndexOf(array, value, fromIndex) { module.exports = baseIndexOf; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseIsArguments.js" +/***/ "./node_modules/lodash/_baseIsArguments.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_baseIsArguments.js ***! \*************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); @@ -36216,13 +36398,13 @@ function baseIsArguments(value) { module.exports = baseIsArguments; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseIsEqual.js" +/***/ "./node_modules/lodash/_baseIsEqual.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseIsEqual.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseIsEqualDeep = __webpack_require__(/*! ./_baseIsEqualDeep */ "./node_modules/lodash/_baseIsEqualDeep.js"), isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); @@ -36254,13 +36436,13 @@ function baseIsEqual(value, other, bitmask, customizer, stack) { module.exports = baseIsEqual; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseIsEqualDeep.js" +/***/ "./node_modules/lodash/_baseIsEqualDeep.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_baseIsEqualDeep.js ***! \*************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"), equalArrays = __webpack_require__(/*! ./_equalArrays */ "./node_modules/lodash/_equalArrays.js"), @@ -36347,13 +36529,13 @@ function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { module.exports = baseIsEqualDeep; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseIsMap.js" +/***/ "./node_modules/lodash/_baseIsMap.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseIsMap.js ***! \*******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"), isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); @@ -36375,13 +36557,13 @@ function baseIsMap(value) { module.exports = baseIsMap; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseIsMatch.js" +/***/ "./node_modules/lodash/_baseIsMatch.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseIsMatch.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"), baseIsEqual = __webpack_require__(/*! ./_baseIsEqual */ "./node_modules/lodash/_baseIsEqual.js"); @@ -36447,13 +36629,13 @@ function baseIsMatch(object, source, matchData, customizer) { module.exports = baseIsMatch; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseIsNaN.js" +/***/ "./node_modules/lodash/_baseIsNaN.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseIsNaN.js ***! \*******************************************/ -(module) { +/***/ (function(module) { /** * The base implementation of `_.isNaN` without support for number objects. @@ -36469,13 +36651,13 @@ function baseIsNaN(value) { module.exports = baseIsNaN; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseIsNative.js" +/***/ "./node_modules/lodash/_baseIsNative.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_baseIsNative.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isFunction = __webpack_require__(/*! ./isFunction */ "./node_modules/lodash/isFunction.js"), isMasked = __webpack_require__(/*! ./_isMasked */ "./node_modules/lodash/_isMasked.js"), @@ -36526,13 +36708,13 @@ function baseIsNative(value) { module.exports = baseIsNative; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseIsSet.js" +/***/ "./node_modules/lodash/_baseIsSet.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseIsSet.js ***! \*******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"), isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); @@ -36554,13 +36736,13 @@ function baseIsSet(value) { module.exports = baseIsSet; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseIsTypedArray.js" +/***/ "./node_modules/lodash/_baseIsTypedArray.js": /*!**************************************************!*\ !*** ./node_modules/lodash/_baseIsTypedArray.js ***! \**************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), isLength = __webpack_require__(/*! ./isLength */ "./node_modules/lodash/isLength.js"), @@ -36624,13 +36806,13 @@ function baseIsTypedArray(value) { module.exports = baseIsTypedArray; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseIteratee.js" +/***/ "./node_modules/lodash/_baseIteratee.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_baseIteratee.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseMatches = __webpack_require__(/*! ./_baseMatches */ "./node_modules/lodash/_baseMatches.js"), baseMatchesProperty = __webpack_require__(/*! ./_baseMatchesProperty */ "./node_modules/lodash/_baseMatchesProperty.js"), @@ -36665,13 +36847,13 @@ function baseIteratee(value) { module.exports = baseIteratee; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseKeys.js" +/***/ "./node_modules/lodash/_baseKeys.js": /*!******************************************!*\ !*** ./node_modules/lodash/_baseKeys.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isPrototype = __webpack_require__(/*! ./_isPrototype */ "./node_modules/lodash/_isPrototype.js"), nativeKeys = __webpack_require__(/*! ./_nativeKeys */ "./node_modules/lodash/_nativeKeys.js"); @@ -36705,13 +36887,13 @@ function baseKeys(object) { module.exports = baseKeys; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseKeysIn.js" +/***/ "./node_modules/lodash/_baseKeysIn.js": /*!********************************************!*\ !*** ./node_modules/lodash/_baseKeysIn.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), isPrototype = __webpack_require__(/*! ./_isPrototype */ "./node_modules/lodash/_isPrototype.js"), @@ -36748,13 +36930,13 @@ function baseKeysIn(object) { module.exports = baseKeysIn; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseLt.js" +/***/ "./node_modules/lodash/_baseLt.js": /*!****************************************!*\ !*** ./node_modules/lodash/_baseLt.js ***! \****************************************/ -(module) { +/***/ (function(module) { /** * The base implementation of `_.lt` which doesn't coerce arguments. @@ -36772,13 +36954,13 @@ function baseLt(value, other) { module.exports = baseLt; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseMap.js" +/***/ "./node_modules/lodash/_baseMap.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_baseMap.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js"), isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"); @@ -36804,13 +36986,13 @@ function baseMap(collection, iteratee) { module.exports = baseMap; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseMatches.js" +/***/ "./node_modules/lodash/_baseMatches.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseMatches.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseIsMatch = __webpack_require__(/*! ./_baseIsMatch */ "./node_modules/lodash/_baseIsMatch.js"), getMatchData = __webpack_require__(/*! ./_getMatchData */ "./node_modules/lodash/_getMatchData.js"), @@ -36836,13 +37018,13 @@ function baseMatches(source) { module.exports = baseMatches; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseMatchesProperty.js" +/***/ "./node_modules/lodash/_baseMatchesProperty.js": /*!*****************************************************!*\ !*** ./node_modules/lodash/_baseMatchesProperty.js ***! \*****************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseIsEqual = __webpack_require__(/*! ./_baseIsEqual */ "./node_modules/lodash/_baseIsEqual.js"), get = __webpack_require__(/*! ./get */ "./node_modules/lodash/get.js"), @@ -36879,13 +37061,13 @@ function baseMatchesProperty(path, srcValue) { module.exports = baseMatchesProperty; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseMerge.js" +/***/ "./node_modules/lodash/_baseMerge.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseMerge.js ***! \*******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"), assignMergeValue = __webpack_require__(/*! ./_assignMergeValue */ "./node_modules/lodash/_assignMergeValue.js"), @@ -36931,13 +37113,13 @@ function baseMerge(object, source, srcIndex, customizer, stack) { module.exports = baseMerge; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseMergeDeep.js" +/***/ "./node_modules/lodash/_baseMergeDeep.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_baseMergeDeep.js ***! \***********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var assignMergeValue = __webpack_require__(/*! ./_assignMergeValue */ "./node_modules/lodash/_assignMergeValue.js"), cloneBuffer = __webpack_require__(/*! ./_cloneBuffer */ "./node_modules/lodash/_cloneBuffer.js"), @@ -37035,13 +37217,13 @@ function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, sta module.exports = baseMergeDeep; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseOrderBy.js" +/***/ "./node_modules/lodash/_baseOrderBy.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_baseOrderBy.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"), baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js"), @@ -37094,13 +37276,13 @@ function baseOrderBy(collection, iteratees, orders) { module.exports = baseOrderBy; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_basePick.js" +/***/ "./node_modules/lodash/_basePick.js": /*!******************************************!*\ !*** ./node_modules/lodash/_basePick.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var basePickBy = __webpack_require__(/*! ./_basePickBy */ "./node_modules/lodash/_basePickBy.js"), hasIn = __webpack_require__(/*! ./hasIn */ "./node_modules/lodash/hasIn.js"); @@ -37123,13 +37305,13 @@ function basePick(object, paths) { module.exports = basePick; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_basePickBy.js" +/***/ "./node_modules/lodash/_basePickBy.js": /*!********************************************!*\ !*** ./node_modules/lodash/_basePickBy.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js"), baseSet = __webpack_require__(/*! ./_baseSet */ "./node_modules/lodash/_baseSet.js"), @@ -37163,13 +37345,13 @@ function basePickBy(object, paths, predicate) { module.exports = basePickBy; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseProperty.js" +/***/ "./node_modules/lodash/_baseProperty.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_baseProperty.js ***! \**********************************************/ -(module) { +/***/ (function(module) { /** * The base implementation of `_.property` without support for deep paths. @@ -37187,13 +37369,13 @@ function baseProperty(key) { module.exports = baseProperty; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_basePropertyDeep.js" +/***/ "./node_modules/lodash/_basePropertyDeep.js": /*!**************************************************!*\ !*** ./node_modules/lodash/_basePropertyDeep.js ***! \**************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js"); @@ -37213,13 +37395,13 @@ function basePropertyDeep(path) { module.exports = basePropertyDeep; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseRange.js" +/***/ "./node_modules/lodash/_baseRange.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseRange.js ***! \*******************************************/ -(module) { +/***/ (function(module) { /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeCeil = Math.ceil, @@ -37251,13 +37433,13 @@ function baseRange(start, end, step, fromRight) { module.exports = baseRange; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseReduce.js" +/***/ "./node_modules/lodash/_baseReduce.js": /*!********************************************!*\ !*** ./node_modules/lodash/_baseReduce.js ***! \********************************************/ -(module) { +/***/ (function(module) { /** * The base implementation of `_.reduce` and `_.reduceRight`, without support @@ -37284,13 +37466,13 @@ function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { module.exports = baseReduce; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseRest.js" +/***/ "./node_modules/lodash/_baseRest.js": /*!******************************************!*\ !*** ./node_modules/lodash/_baseRest.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"), overRest = __webpack_require__(/*! ./_overRest */ "./node_modules/lodash/_overRest.js"), @@ -37311,13 +37493,13 @@ function baseRest(func, start) { module.exports = baseRest; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseSet.js" +/***/ "./node_modules/lodash/_baseSet.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_baseSet.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var assignValue = __webpack_require__(/*! ./_assignValue */ "./node_modules/lodash/_assignValue.js"), castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js"), @@ -37372,13 +37554,13 @@ function baseSet(object, path, value, customizer) { module.exports = baseSet; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseSetToString.js" +/***/ "./node_modules/lodash/_baseSetToString.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_baseSetToString.js ***! \*************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var constant = __webpack_require__(/*! ./constant */ "./node_modules/lodash/constant.js"), defineProperty = __webpack_require__(/*! ./_defineProperty */ "./node_modules/lodash/_defineProperty.js"), @@ -37404,13 +37586,13 @@ var baseSetToString = !defineProperty ? identity : function(func, string) { module.exports = baseSetToString; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseSortBy.js" +/***/ "./node_modules/lodash/_baseSortBy.js": /*!********************************************!*\ !*** ./node_modules/lodash/_baseSortBy.js ***! \********************************************/ -(module) { +/***/ (function(module) { /** * The base implementation of `_.sortBy` which uses `comparer` to define the @@ -37435,13 +37617,13 @@ function baseSortBy(array, comparer) { module.exports = baseSortBy; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseTimes.js" +/***/ "./node_modules/lodash/_baseTimes.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseTimes.js ***! \*******************************************/ -(module) { +/***/ (function(module) { /** * The base implementation of `_.times` without support for iteratee shorthands @@ -37465,13 +37647,13 @@ function baseTimes(n, iteratee) { module.exports = baseTimes; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseToString.js" +/***/ "./node_modules/lodash/_baseToString.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_baseToString.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"), @@ -37512,13 +37694,13 @@ function baseToString(value) { module.exports = baseToString; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseTrim.js" +/***/ "./node_modules/lodash/_baseTrim.js": /*!******************************************!*\ !*** ./node_modules/lodash/_baseTrim.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var trimmedEndIndex = __webpack_require__(/*! ./_trimmedEndIndex */ "./node_modules/lodash/_trimmedEndIndex.js"); @@ -37541,13 +37723,13 @@ function baseTrim(string) { module.exports = baseTrim; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseUnary.js" +/***/ "./node_modules/lodash/_baseUnary.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_baseUnary.js ***! \*******************************************/ -(module) { +/***/ (function(module) { /** * The base implementation of `_.unary` without support for storing metadata. @@ -37565,13 +37747,13 @@ function baseUnary(func) { module.exports = baseUnary; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseUniq.js" +/***/ "./node_modules/lodash/_baseUniq.js": /*!******************************************!*\ !*** ./node_modules/lodash/_baseUniq.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var SetCache = __webpack_require__(/*! ./_SetCache */ "./node_modules/lodash/_SetCache.js"), arrayIncludes = __webpack_require__(/*! ./_arrayIncludes */ "./node_modules/lodash/_arrayIncludes.js"), @@ -37647,13 +37829,13 @@ function baseUniq(array, iteratee, comparator) { module.exports = baseUniq; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseValues.js" +/***/ "./node_modules/lodash/_baseValues.js": /*!********************************************!*\ !*** ./node_modules/lodash/_baseValues.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"); @@ -37676,13 +37858,13 @@ function baseValues(object, props) { module.exports = baseValues; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_baseZipObject.js" +/***/ "./node_modules/lodash/_baseZipObject.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_baseZipObject.js ***! \***********************************************/ -(module) { +/***/ (function(module) { /** * This base implementation of `_.zipObject` which assigns values using `assignFunc`. @@ -37709,13 +37891,13 @@ function baseZipObject(props, values, assignFunc) { module.exports = baseZipObject; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_cacheHas.js" +/***/ "./node_modules/lodash/_cacheHas.js": /*!******************************************!*\ !*** ./node_modules/lodash/_cacheHas.js ***! \******************************************/ -(module) { +/***/ (function(module) { /** * Checks if a `cache` value for `key` exists. @@ -37732,13 +37914,13 @@ function cacheHas(cache, key) { module.exports = cacheHas; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_castFunction.js" +/***/ "./node_modules/lodash/_castFunction.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_castFunction.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"); @@ -37756,13 +37938,13 @@ function castFunction(value) { module.exports = castFunction; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_castPath.js" +/***/ "./node_modules/lodash/_castPath.js": /*!******************************************!*\ !*** ./node_modules/lodash/_castPath.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), isKey = __webpack_require__(/*! ./_isKey */ "./node_modules/lodash/_isKey.js"), @@ -37787,13 +37969,13 @@ function castPath(value, object) { module.exports = castPath; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_cloneArrayBuffer.js" +/***/ "./node_modules/lodash/_cloneArrayBuffer.js": /*!**************************************************!*\ !*** ./node_modules/lodash/_cloneArrayBuffer.js ***! \**************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var Uint8Array = __webpack_require__(/*! ./_Uint8Array */ "./node_modules/lodash/_Uint8Array.js"); @@ -37813,13 +37995,13 @@ function cloneArrayBuffer(arrayBuffer) { module.exports = cloneArrayBuffer; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_cloneBuffer.js" +/***/ "./node_modules/lodash/_cloneBuffer.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_cloneBuffer.js ***! \*********************************************/ -(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { /* module decorator */ module = __webpack_require__.nmd(module); var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); @@ -37859,13 +38041,13 @@ function cloneBuffer(buffer, isDeep) { module.exports = cloneBuffer; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_cloneDataView.js" +/***/ "./node_modules/lodash/_cloneDataView.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_cloneDataView.js ***! \***********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var cloneArrayBuffer = __webpack_require__(/*! ./_cloneArrayBuffer */ "./node_modules/lodash/_cloneArrayBuffer.js"); @@ -37885,13 +38067,13 @@ function cloneDataView(dataView, isDeep) { module.exports = cloneDataView; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_cloneRegExp.js" +/***/ "./node_modules/lodash/_cloneRegExp.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_cloneRegExp.js ***! \*********************************************/ -(module) { +/***/ (function(module) { /** Used to match `RegExp` flags from their coerced string values. */ var reFlags = /\w*$/; @@ -37912,13 +38094,13 @@ function cloneRegExp(regexp) { module.exports = cloneRegExp; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_cloneSymbol.js" +/***/ "./node_modules/lodash/_cloneSymbol.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_cloneSymbol.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"); @@ -37940,13 +38122,13 @@ function cloneSymbol(symbol) { module.exports = cloneSymbol; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_cloneTypedArray.js" +/***/ "./node_modules/lodash/_cloneTypedArray.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_cloneTypedArray.js ***! \*************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var cloneArrayBuffer = __webpack_require__(/*! ./_cloneArrayBuffer */ "./node_modules/lodash/_cloneArrayBuffer.js"); @@ -37966,13 +38148,13 @@ function cloneTypedArray(typedArray, isDeep) { module.exports = cloneTypedArray; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_compareAscending.js" +/***/ "./node_modules/lodash/_compareAscending.js": /*!**************************************************!*\ !*** ./node_modules/lodash/_compareAscending.js ***! \**************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); @@ -38017,13 +38199,13 @@ function compareAscending(value, other) { module.exports = compareAscending; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_compareMultiple.js" +/***/ "./node_modules/lodash/_compareMultiple.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_compareMultiple.js ***! \*************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var compareAscending = __webpack_require__(/*! ./_compareAscending */ "./node_modules/lodash/_compareAscending.js"); @@ -38071,13 +38253,13 @@ function compareMultiple(object, other, orders) { module.exports = compareMultiple; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_copyArray.js" +/***/ "./node_modules/lodash/_copyArray.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_copyArray.js ***! \*******************************************/ -(module) { +/***/ (function(module) { /** * Copies the values of `source` to `array`. @@ -38101,13 +38283,13 @@ function copyArray(source, array) { module.exports = copyArray; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_copyObject.js" +/***/ "./node_modules/lodash/_copyObject.js": /*!********************************************!*\ !*** ./node_modules/lodash/_copyObject.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var assignValue = __webpack_require__(/*! ./_assignValue */ "./node_modules/lodash/_assignValue.js"), baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"); @@ -38151,13 +38333,13 @@ function copyObject(source, props, object, customizer) { module.exports = copyObject; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_copySymbols.js" +/***/ "./node_modules/lodash/_copySymbols.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_copySymbols.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"), getSymbols = __webpack_require__(/*! ./_getSymbols */ "./node_modules/lodash/_getSymbols.js"); @@ -38177,13 +38359,13 @@ function copySymbols(source, object) { module.exports = copySymbols; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_copySymbolsIn.js" +/***/ "./node_modules/lodash/_copySymbolsIn.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_copySymbolsIn.js ***! \***********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"), getSymbolsIn = __webpack_require__(/*! ./_getSymbolsIn */ "./node_modules/lodash/_getSymbolsIn.js"); @@ -38203,13 +38385,13 @@ function copySymbolsIn(source, object) { module.exports = copySymbolsIn; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_coreJsData.js" +/***/ "./node_modules/lodash/_coreJsData.js": /*!********************************************!*\ !*** ./node_modules/lodash/_coreJsData.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); @@ -38219,13 +38401,13 @@ var coreJsData = root['__core-js_shared__']; module.exports = coreJsData; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_createAssigner.js" +/***/ "./node_modules/lodash/_createAssigner.js": /*!************************************************!*\ !*** ./node_modules/lodash/_createAssigner.js ***! \************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseRest = __webpack_require__(/*! ./_baseRest */ "./node_modules/lodash/_baseRest.js"), isIterateeCall = __webpack_require__(/*! ./_isIterateeCall */ "./node_modules/lodash/_isIterateeCall.js"); @@ -38266,13 +38448,13 @@ function createAssigner(assigner) { module.exports = createAssigner; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_createBaseEach.js" +/***/ "./node_modules/lodash/_createBaseEach.js": /*!************************************************!*\ !*** ./node_modules/lodash/_createBaseEach.js ***! \************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"); @@ -38308,13 +38490,13 @@ function createBaseEach(eachFunc, fromRight) { module.exports = createBaseEach; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_createBaseFor.js" +/***/ "./node_modules/lodash/_createBaseFor.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_createBaseFor.js ***! \***********************************************/ -(module) { +/***/ (function(module) { /** * Creates a base function for methods like `_.forIn` and `_.forOwn`. @@ -38343,13 +38525,13 @@ function createBaseFor(fromRight) { module.exports = createBaseFor; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_createFind.js" +/***/ "./node_modules/lodash/_createFind.js": /*!********************************************!*\ !*** ./node_modules/lodash/_createFind.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"), @@ -38378,13 +38560,13 @@ function createFind(findIndexFunc) { module.exports = createFind; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_createRange.js" +/***/ "./node_modules/lodash/_createRange.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_createRange.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseRange = __webpack_require__(/*! ./_baseRange */ "./node_modules/lodash/_baseRange.js"), isIterateeCall = __webpack_require__(/*! ./_isIterateeCall */ "./node_modules/lodash/_isIterateeCall.js"), @@ -38418,13 +38600,13 @@ function createRange(fromRight) { module.exports = createRange; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_createSet.js" +/***/ "./node_modules/lodash/_createSet.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_createSet.js ***! \*******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var Set = __webpack_require__(/*! ./_Set */ "./node_modules/lodash/_Set.js"), noop = __webpack_require__(/*! ./noop */ "./node_modules/lodash/noop.js"), @@ -38447,13 +38629,13 @@ var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop module.exports = createSet; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_defineProperty.js" +/***/ "./node_modules/lodash/_defineProperty.js": /*!************************************************!*\ !*** ./node_modules/lodash/_defineProperty.js ***! \************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"); @@ -38468,13 +38650,13 @@ var defineProperty = (function() { module.exports = defineProperty; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_equalArrays.js" +/***/ "./node_modules/lodash/_equalArrays.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_equalArrays.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var SetCache = __webpack_require__(/*! ./_SetCache */ "./node_modules/lodash/_SetCache.js"), arraySome = __webpack_require__(/*! ./_arraySome */ "./node_modules/lodash/_arraySome.js"), @@ -38562,13 +38744,13 @@ function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { module.exports = equalArrays; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_equalByTag.js" +/***/ "./node_modules/lodash/_equalByTag.js": /*!********************************************!*\ !*** ./node_modules/lodash/_equalByTag.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), Uint8Array = __webpack_require__(/*! ./_Uint8Array */ "./node_modules/lodash/_Uint8Array.js"), @@ -38684,13 +38866,13 @@ function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { module.exports = equalByTag; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_equalObjects.js" +/***/ "./node_modules/lodash/_equalObjects.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_equalObjects.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var getAllKeys = __webpack_require__(/*! ./_getAllKeys */ "./node_modules/lodash/_getAllKeys.js"); @@ -38784,13 +38966,13 @@ function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { module.exports = equalObjects; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_flatRest.js" +/***/ "./node_modules/lodash/_flatRest.js": /*!******************************************!*\ !*** ./node_modules/lodash/_flatRest.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var flatten = __webpack_require__(/*! ./flatten */ "./node_modules/lodash/flatten.js"), overRest = __webpack_require__(/*! ./_overRest */ "./node_modules/lodash/_overRest.js"), @@ -38810,13 +38992,13 @@ function flatRest(func) { module.exports = flatRest; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_freeGlobal.js" +/***/ "./node_modules/lodash/_freeGlobal.js": /*!********************************************!*\ !*** ./node_modules/lodash/_freeGlobal.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { /** Detect free variable `global` from Node.js. */ var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g; @@ -38824,13 +39006,13 @@ var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__ module.exports = freeGlobal; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_getAllKeys.js" +/***/ "./node_modules/lodash/_getAllKeys.js": /*!********************************************!*\ !*** ./node_modules/lodash/_getAllKeys.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseGetAllKeys = __webpack_require__(/*! ./_baseGetAllKeys */ "./node_modules/lodash/_baseGetAllKeys.js"), getSymbols = __webpack_require__(/*! ./_getSymbols */ "./node_modules/lodash/_getSymbols.js"), @@ -38850,13 +39032,13 @@ function getAllKeys(object) { module.exports = getAllKeys; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_getAllKeysIn.js" +/***/ "./node_modules/lodash/_getAllKeysIn.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_getAllKeysIn.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseGetAllKeys = __webpack_require__(/*! ./_baseGetAllKeys */ "./node_modules/lodash/_baseGetAllKeys.js"), getSymbolsIn = __webpack_require__(/*! ./_getSymbolsIn */ "./node_modules/lodash/_getSymbolsIn.js"), @@ -38877,13 +39059,13 @@ function getAllKeysIn(object) { module.exports = getAllKeysIn; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_getMapData.js" +/***/ "./node_modules/lodash/_getMapData.js": /*!********************************************!*\ !*** ./node_modules/lodash/_getMapData.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isKeyable = __webpack_require__(/*! ./_isKeyable */ "./node_modules/lodash/_isKeyable.js"); @@ -38905,13 +39087,13 @@ function getMapData(map, key) { module.exports = getMapData; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_getMatchData.js" +/***/ "./node_modules/lodash/_getMatchData.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_getMatchData.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isStrictComparable = __webpack_require__(/*! ./_isStrictComparable */ "./node_modules/lodash/_isStrictComparable.js"), keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); @@ -38939,13 +39121,13 @@ function getMatchData(object) { module.exports = getMatchData; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_getNative.js" +/***/ "./node_modules/lodash/_getNative.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_getNative.js ***! \*******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseIsNative = __webpack_require__(/*! ./_baseIsNative */ "./node_modules/lodash/_baseIsNative.js"), getValue = __webpack_require__(/*! ./_getValue */ "./node_modules/lodash/_getValue.js"); @@ -38966,13 +39148,13 @@ function getNative(object, key) { module.exports = getNative; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_getPrototype.js" +/***/ "./node_modules/lodash/_getPrototype.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_getPrototype.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var overArg = __webpack_require__(/*! ./_overArg */ "./node_modules/lodash/_overArg.js"); @@ -38982,13 +39164,13 @@ var getPrototype = overArg(Object.getPrototypeOf, Object); module.exports = getPrototype; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_getRawTag.js" +/***/ "./node_modules/lodash/_getRawTag.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_getRawTag.js ***! \*******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"); @@ -39038,13 +39220,13 @@ function getRawTag(value) { module.exports = getRawTag; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_getSymbols.js" +/***/ "./node_modules/lodash/_getSymbols.js": /*!********************************************!*\ !*** ./node_modules/lodash/_getSymbols.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var arrayFilter = __webpack_require__(/*! ./_arrayFilter */ "./node_modules/lodash/_arrayFilter.js"), stubArray = __webpack_require__(/*! ./stubArray */ "./node_modules/lodash/stubArray.js"); @@ -39078,13 +39260,13 @@ var getSymbols = !nativeGetSymbols ? stubArray : function(object) { module.exports = getSymbols; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_getSymbolsIn.js" +/***/ "./node_modules/lodash/_getSymbolsIn.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_getSymbolsIn.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var arrayPush = __webpack_require__(/*! ./_arrayPush */ "./node_modules/lodash/_arrayPush.js"), getPrototype = __webpack_require__(/*! ./_getPrototype */ "./node_modules/lodash/_getPrototype.js"), @@ -39113,13 +39295,13 @@ var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { module.exports = getSymbolsIn; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_getTag.js" +/***/ "./node_modules/lodash/_getTag.js": /*!****************************************!*\ !*** ./node_modules/lodash/_getTag.js ***! \****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var DataView = __webpack_require__(/*! ./_DataView */ "./node_modules/lodash/_DataView.js"), Map = __webpack_require__(/*! ./_Map */ "./node_modules/lodash/_Map.js"), @@ -39181,13 +39363,13 @@ if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || module.exports = getTag; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_getValue.js" +/***/ "./node_modules/lodash/_getValue.js": /*!******************************************!*\ !*** ./node_modules/lodash/_getValue.js ***! \******************************************/ -(module) { +/***/ (function(module) { /** * Gets the value at `key` of `object`. @@ -39204,13 +39386,13 @@ function getValue(object, key) { module.exports = getValue; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_hasPath.js" +/***/ "./node_modules/lodash/_hasPath.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_hasPath.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js"), isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"), @@ -39253,13 +39435,13 @@ function hasPath(object, path, hasFunc) { module.exports = hasPath; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_hasUnicode.js" +/***/ "./node_modules/lodash/_hasUnicode.js": /*!********************************************!*\ !*** ./node_modules/lodash/_hasUnicode.js ***! \********************************************/ -(module) { +/***/ (function(module) { /** Used to compose unicode character classes. */ var rsAstralRange = '\\ud800-\\udfff', @@ -39289,13 +39471,13 @@ function hasUnicode(string) { module.exports = hasUnicode; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_hashClear.js" +/***/ "./node_modules/lodash/_hashClear.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_hashClear.js ***! \*******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); @@ -39314,13 +39496,13 @@ function hashClear() { module.exports = hashClear; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_hashDelete.js" +/***/ "./node_modules/lodash/_hashDelete.js": /*!********************************************!*\ !*** ./node_modules/lodash/_hashDelete.js ***! \********************************************/ -(module) { +/***/ (function(module) { /** * Removes `key` and its value from the hash. @@ -39341,13 +39523,13 @@ function hashDelete(key) { module.exports = hashDelete; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_hashGet.js" +/***/ "./node_modules/lodash/_hashGet.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_hashGet.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); @@ -39381,13 +39563,13 @@ function hashGet(key) { module.exports = hashGet; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_hashHas.js" +/***/ "./node_modules/lodash/_hashHas.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_hashHas.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); @@ -39414,13 +39596,13 @@ function hashHas(key) { module.exports = hashHas; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_hashSet.js" +/***/ "./node_modules/lodash/_hashSet.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_hashSet.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js"); @@ -39447,13 +39629,13 @@ function hashSet(key, value) { module.exports = hashSet; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_initCloneArray.js" +/***/ "./node_modules/lodash/_initCloneArray.js": /*!************************************************!*\ !*** ./node_modules/lodash/_initCloneArray.js ***! \************************************************/ -(module) { +/***/ (function(module) { /** Used for built-in method references. */ var objectProto = Object.prototype; @@ -39483,13 +39665,13 @@ function initCloneArray(array) { module.exports = initCloneArray; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_initCloneByTag.js" +/***/ "./node_modules/lodash/_initCloneByTag.js": /*!************************************************!*\ !*** ./node_modules/lodash/_initCloneByTag.js ***! \************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var cloneArrayBuffer = __webpack_require__(/*! ./_cloneArrayBuffer */ "./node_modules/lodash/_cloneArrayBuffer.js"), cloneDataView = __webpack_require__(/*! ./_cloneDataView */ "./node_modules/lodash/_cloneDataView.js"), @@ -39570,13 +39752,13 @@ function initCloneByTag(object, tag, isDeep) { module.exports = initCloneByTag; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_initCloneObject.js" +/***/ "./node_modules/lodash/_initCloneObject.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_initCloneObject.js ***! \*************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseCreate = __webpack_require__(/*! ./_baseCreate */ "./node_modules/lodash/_baseCreate.js"), getPrototype = __webpack_require__(/*! ./_getPrototype */ "./node_modules/lodash/_getPrototype.js"), @@ -39598,13 +39780,13 @@ function initCloneObject(object) { module.exports = initCloneObject; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_isFlattenable.js" +/***/ "./node_modules/lodash/_isFlattenable.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_isFlattenable.js ***! \***********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"), isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"), @@ -39628,13 +39810,13 @@ function isFlattenable(value) { module.exports = isFlattenable; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_isIndex.js" +/***/ "./node_modules/lodash/_isIndex.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_isIndex.js ***! \*****************************************/ -(module) { +/***/ (function(module) { /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; @@ -39663,13 +39845,13 @@ function isIndex(value, length) { module.exports = isIndex; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_isIterateeCall.js" +/***/ "./node_modules/lodash/_isIterateeCall.js": /*!************************************************!*\ !*** ./node_modules/lodash/_isIterateeCall.js ***! \************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"), isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"), @@ -39703,13 +39885,13 @@ function isIterateeCall(value, index, object) { module.exports = isIterateeCall; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_isKey.js" +/***/ "./node_modules/lodash/_isKey.js": /*!***************************************!*\ !*** ./node_modules/lodash/_isKey.js ***! \***************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); @@ -39742,13 +39924,13 @@ function isKey(value, object) { module.exports = isKey; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_isKeyable.js" +/***/ "./node_modules/lodash/_isKeyable.js": /*!*******************************************!*\ !*** ./node_modules/lodash/_isKeyable.js ***! \*******************************************/ -(module) { +/***/ (function(module) { /** * Checks if `value` is suitable for use as unique object key. @@ -39767,13 +39949,13 @@ function isKeyable(value) { module.exports = isKeyable; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_isMasked.js" +/***/ "./node_modules/lodash/_isMasked.js": /*!******************************************!*\ !*** ./node_modules/lodash/_isMasked.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var coreJsData = __webpack_require__(/*! ./_coreJsData */ "./node_modules/lodash/_coreJsData.js"); @@ -39797,13 +39979,13 @@ function isMasked(func) { module.exports = isMasked; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_isPrototype.js" +/***/ "./node_modules/lodash/_isPrototype.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_isPrototype.js ***! \*********************************************/ -(module) { +/***/ (function(module) { /** Used for built-in method references. */ var objectProto = Object.prototype; @@ -39825,13 +40007,13 @@ function isPrototype(value) { module.exports = isPrototype; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_isStrictComparable.js" +/***/ "./node_modules/lodash/_isStrictComparable.js": /*!****************************************************!*\ !*** ./node_modules/lodash/_isStrictComparable.js ***! \****************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"); @@ -39850,13 +40032,13 @@ function isStrictComparable(value) { module.exports = isStrictComparable; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_listCacheClear.js" +/***/ "./node_modules/lodash/_listCacheClear.js": /*!************************************************!*\ !*** ./node_modules/lodash/_listCacheClear.js ***! \************************************************/ -(module) { +/***/ (function(module) { /** * Removes all key-value entries from the list cache. @@ -39873,13 +40055,13 @@ function listCacheClear() { module.exports = listCacheClear; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_listCacheDelete.js" +/***/ "./node_modules/lodash/_listCacheDelete.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_listCacheDelete.js ***! \*************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); @@ -39918,13 +40100,13 @@ function listCacheDelete(key) { module.exports = listCacheDelete; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_listCacheGet.js" +/***/ "./node_modules/lodash/_listCacheGet.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_listCacheGet.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); @@ -39947,13 +40129,13 @@ function listCacheGet(key) { module.exports = listCacheGet; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_listCacheHas.js" +/***/ "./node_modules/lodash/_listCacheHas.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_listCacheHas.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); @@ -39973,13 +40155,13 @@ function listCacheHas(key) { module.exports = listCacheHas; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_listCacheSet.js" +/***/ "./node_modules/lodash/_listCacheSet.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_listCacheSet.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js"); @@ -40009,13 +40191,13 @@ function listCacheSet(key, value) { module.exports = listCacheSet; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_mapCacheClear.js" +/***/ "./node_modules/lodash/_mapCacheClear.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_mapCacheClear.js ***! \***********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var Hash = __webpack_require__(/*! ./_Hash */ "./node_modules/lodash/_Hash.js"), ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"), @@ -40040,13 +40222,13 @@ function mapCacheClear() { module.exports = mapCacheClear; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_mapCacheDelete.js" +/***/ "./node_modules/lodash/_mapCacheDelete.js": /*!************************************************!*\ !*** ./node_modules/lodash/_mapCacheDelete.js ***! \************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); @@ -40068,13 +40250,13 @@ function mapCacheDelete(key) { module.exports = mapCacheDelete; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_mapCacheGet.js" +/***/ "./node_modules/lodash/_mapCacheGet.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_mapCacheGet.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); @@ -40094,13 +40276,13 @@ function mapCacheGet(key) { module.exports = mapCacheGet; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_mapCacheHas.js" +/***/ "./node_modules/lodash/_mapCacheHas.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_mapCacheHas.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); @@ -40120,13 +40302,13 @@ function mapCacheHas(key) { module.exports = mapCacheHas; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_mapCacheSet.js" +/***/ "./node_modules/lodash/_mapCacheSet.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_mapCacheSet.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js"); @@ -40152,13 +40334,13 @@ function mapCacheSet(key, value) { module.exports = mapCacheSet; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_mapToArray.js" +/***/ "./node_modules/lodash/_mapToArray.js": /*!********************************************!*\ !*** ./node_modules/lodash/_mapToArray.js ***! \********************************************/ -(module) { +/***/ (function(module) { /** * Converts `map` to its key-value pairs. @@ -40180,13 +40362,13 @@ function mapToArray(map) { module.exports = mapToArray; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_matchesStrictComparable.js" +/***/ "./node_modules/lodash/_matchesStrictComparable.js": /*!*********************************************************!*\ !*** ./node_modules/lodash/_matchesStrictComparable.js ***! \*********************************************************/ -(module) { +/***/ (function(module) { /** * A specialized version of `matchesProperty` for source values suitable @@ -40210,13 +40392,13 @@ function matchesStrictComparable(key, srcValue) { module.exports = matchesStrictComparable; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_memoizeCapped.js" +/***/ "./node_modules/lodash/_memoizeCapped.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_memoizeCapped.js ***! \***********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var memoize = __webpack_require__(/*! ./memoize */ "./node_modules/lodash/memoize.js"); @@ -40246,13 +40428,13 @@ function memoizeCapped(func) { module.exports = memoizeCapped; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_nativeCreate.js" +/***/ "./node_modules/lodash/_nativeCreate.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_nativeCreate.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"); @@ -40262,13 +40444,13 @@ var nativeCreate = getNative(Object, 'create'); module.exports = nativeCreate; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_nativeKeys.js" +/***/ "./node_modules/lodash/_nativeKeys.js": /*!********************************************!*\ !*** ./node_modules/lodash/_nativeKeys.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var overArg = __webpack_require__(/*! ./_overArg */ "./node_modules/lodash/_overArg.js"); @@ -40278,13 +40460,13 @@ var nativeKeys = overArg(Object.keys, Object); module.exports = nativeKeys; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_nativeKeysIn.js" +/***/ "./node_modules/lodash/_nativeKeysIn.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_nativeKeysIn.js ***! \**********************************************/ -(module) { +/***/ (function(module) { /** * This function is like @@ -40308,13 +40490,13 @@ function nativeKeysIn(object) { module.exports = nativeKeysIn; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_nodeUtil.js" +/***/ "./node_modules/lodash/_nodeUtil.js": /*!******************************************!*\ !*** ./node_modules/lodash/_nodeUtil.js ***! \******************************************/ -(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { /* module decorator */ module = __webpack_require__.nmd(module); var freeGlobal = __webpack_require__(/*! ./_freeGlobal */ "./node_modules/lodash/_freeGlobal.js"); @@ -40349,13 +40531,13 @@ var nodeUtil = (function() { module.exports = nodeUtil; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_objectToString.js" +/***/ "./node_modules/lodash/_objectToString.js": /*!************************************************!*\ !*** ./node_modules/lodash/_objectToString.js ***! \************************************************/ -(module) { +/***/ (function(module) { /** Used for built-in method references. */ var objectProto = Object.prototype; @@ -40381,13 +40563,13 @@ function objectToString(value) { module.exports = objectToString; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_overArg.js" +/***/ "./node_modules/lodash/_overArg.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_overArg.js ***! \*****************************************/ -(module) { +/***/ (function(module) { /** * Creates a unary function that invokes `func` with its argument transformed. @@ -40406,13 +40588,13 @@ function overArg(func, transform) { module.exports = overArg; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_overRest.js" +/***/ "./node_modules/lodash/_overRest.js": /*!******************************************!*\ !*** ./node_modules/lodash/_overRest.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var apply = __webpack_require__(/*! ./_apply */ "./node_modules/lodash/_apply.js"); @@ -40452,13 +40634,13 @@ function overRest(func, start, transform) { module.exports = overRest; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_root.js" +/***/ "./node_modules/lodash/_root.js": /*!**************************************!*\ !*** ./node_modules/lodash/_root.js ***! \**************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var freeGlobal = __webpack_require__(/*! ./_freeGlobal */ "./node_modules/lodash/_freeGlobal.js"); @@ -40471,13 +40653,13 @@ var root = freeGlobal || freeSelf || Function('return this')(); module.exports = root; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_safeGet.js" +/***/ "./node_modules/lodash/_safeGet.js": /*!*****************************************!*\ !*** ./node_modules/lodash/_safeGet.js ***! \*****************************************/ -(module) { +/***/ (function(module) { /** * Gets the value at `key`, unless `key` is "__proto__" or "constructor". @@ -40502,13 +40684,13 @@ function safeGet(object, key) { module.exports = safeGet; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_setCacheAdd.js" +/***/ "./node_modules/lodash/_setCacheAdd.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_setCacheAdd.js ***! \*********************************************/ -(module) { +/***/ (function(module) { /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; @@ -40531,13 +40713,13 @@ function setCacheAdd(value) { module.exports = setCacheAdd; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_setCacheHas.js" +/***/ "./node_modules/lodash/_setCacheHas.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_setCacheHas.js ***! \*********************************************/ -(module) { +/***/ (function(module) { /** * Checks if `value` is in the array cache. @@ -40555,13 +40737,13 @@ function setCacheHas(value) { module.exports = setCacheHas; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_setToArray.js" +/***/ "./node_modules/lodash/_setToArray.js": /*!********************************************!*\ !*** ./node_modules/lodash/_setToArray.js ***! \********************************************/ -(module) { +/***/ (function(module) { /** * Converts `set` to an array of its values. @@ -40583,13 +40765,13 @@ function setToArray(set) { module.exports = setToArray; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_setToString.js" +/***/ "./node_modules/lodash/_setToString.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_setToString.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseSetToString = __webpack_require__(/*! ./_baseSetToString */ "./node_modules/lodash/_baseSetToString.js"), shortOut = __webpack_require__(/*! ./_shortOut */ "./node_modules/lodash/_shortOut.js"); @@ -40607,13 +40789,13 @@ var setToString = shortOut(baseSetToString); module.exports = setToString; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_shortOut.js" +/***/ "./node_modules/lodash/_shortOut.js": /*!******************************************!*\ !*** ./node_modules/lodash/_shortOut.js ***! \******************************************/ -(module) { +/***/ (function(module) { /** Used to detect hot functions by number of calls within a span of milliseconds. */ var HOT_COUNT = 800, @@ -40654,13 +40836,13 @@ function shortOut(func) { module.exports = shortOut; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_stackClear.js" +/***/ "./node_modules/lodash/_stackClear.js": /*!********************************************!*\ !*** ./node_modules/lodash/_stackClear.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"); @@ -40679,13 +40861,13 @@ function stackClear() { module.exports = stackClear; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_stackDelete.js" +/***/ "./node_modules/lodash/_stackDelete.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_stackDelete.js ***! \*********************************************/ -(module) { +/***/ (function(module) { /** * Removes `key` and its value from the stack. @@ -40707,13 +40889,13 @@ function stackDelete(key) { module.exports = stackDelete; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_stackGet.js" +/***/ "./node_modules/lodash/_stackGet.js": /*!******************************************!*\ !*** ./node_modules/lodash/_stackGet.js ***! \******************************************/ -(module) { +/***/ (function(module) { /** * Gets the stack value for `key`. @@ -40731,13 +40913,13 @@ function stackGet(key) { module.exports = stackGet; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_stackHas.js" +/***/ "./node_modules/lodash/_stackHas.js": /*!******************************************!*\ !*** ./node_modules/lodash/_stackHas.js ***! \******************************************/ -(module) { +/***/ (function(module) { /** * Checks if a stack value for `key` exists. @@ -40755,13 +40937,13 @@ function stackHas(key) { module.exports = stackHas; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_stackSet.js" +/***/ "./node_modules/lodash/_stackSet.js": /*!******************************************!*\ !*** ./node_modules/lodash/_stackSet.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"), Map = __webpack_require__(/*! ./_Map */ "./node_modules/lodash/_Map.js"), @@ -40799,13 +40981,13 @@ function stackSet(key, value) { module.exports = stackSet; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_strictIndexOf.js" +/***/ "./node_modules/lodash/_strictIndexOf.js": /*!***********************************************!*\ !*** ./node_modules/lodash/_strictIndexOf.js ***! \***********************************************/ -(module) { +/***/ (function(module) { /** * A specialized version of `_.indexOf` which performs strict equality @@ -40832,13 +41014,13 @@ function strictIndexOf(array, value, fromIndex) { module.exports = strictIndexOf; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_stringSize.js" +/***/ "./node_modules/lodash/_stringSize.js": /*!********************************************!*\ !*** ./node_modules/lodash/_stringSize.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var asciiSize = __webpack_require__(/*! ./_asciiSize */ "./node_modules/lodash/_asciiSize.js"), hasUnicode = __webpack_require__(/*! ./_hasUnicode */ "./node_modules/lodash/_hasUnicode.js"), @@ -40860,13 +41042,13 @@ function stringSize(string) { module.exports = stringSize; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_stringToPath.js" +/***/ "./node_modules/lodash/_stringToPath.js": /*!**********************************************!*\ !*** ./node_modules/lodash/_stringToPath.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var memoizeCapped = __webpack_require__(/*! ./_memoizeCapped */ "./node_modules/lodash/_memoizeCapped.js"); @@ -40897,13 +41079,13 @@ var stringToPath = memoizeCapped(function(string) { module.exports = stringToPath; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_toKey.js" +/***/ "./node_modules/lodash/_toKey.js": /*!***************************************!*\ !*** ./node_modules/lodash/_toKey.js ***! \***************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js"); @@ -40928,13 +41110,13 @@ function toKey(value) { module.exports = toKey; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_toSource.js" +/***/ "./node_modules/lodash/_toSource.js": /*!******************************************!*\ !*** ./node_modules/lodash/_toSource.js ***! \******************************************/ -(module) { +/***/ (function(module) { /** Used for built-in method references. */ var funcProto = Function.prototype; @@ -40964,13 +41146,13 @@ function toSource(func) { module.exports = toSource; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_trimmedEndIndex.js" +/***/ "./node_modules/lodash/_trimmedEndIndex.js": /*!*************************************************!*\ !*** ./node_modules/lodash/_trimmedEndIndex.js ***! \*************************************************/ -(module) { +/***/ (function(module) { /** Used to match a single whitespace character. */ var reWhitespace = /\s/; @@ -40993,13 +41175,13 @@ function trimmedEndIndex(string) { module.exports = trimmedEndIndex; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/_unicodeSize.js" +/***/ "./node_modules/lodash/_unicodeSize.js": /*!*********************************************!*\ !*** ./node_modules/lodash/_unicodeSize.js ***! \*********************************************/ -(module) { +/***/ (function(module) { /** Used to compose unicode character classes. */ var rsAstralRange = '\\ud800-\\udfff', @@ -41047,13 +41229,13 @@ function unicodeSize(string) { module.exports = unicodeSize; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/clone.js" +/***/ "./node_modules/lodash/clone.js": /*!**************************************!*\ !*** ./node_modules/lodash/clone.js ***! \**************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseClone = __webpack_require__(/*! ./_baseClone */ "./node_modules/lodash/_baseClone.js"); @@ -41093,13 +41275,13 @@ function clone(value) { module.exports = clone; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/cloneDeep.js" +/***/ "./node_modules/lodash/cloneDeep.js": /*!******************************************!*\ !*** ./node_modules/lodash/cloneDeep.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseClone = __webpack_require__(/*! ./_baseClone */ "./node_modules/lodash/_baseClone.js"); @@ -41132,13 +41314,13 @@ function cloneDeep(value) { module.exports = cloneDeep; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/constant.js" +/***/ "./node_modules/lodash/constant.js": /*!*****************************************!*\ !*** ./node_modules/lodash/constant.js ***! \*****************************************/ -(module) { +/***/ (function(module) { /** * Creates a function that returns `value`. @@ -41168,13 +41350,13 @@ function constant(value) { module.exports = constant; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/defaults.js" +/***/ "./node_modules/lodash/defaults.js": /*!*****************************************!*\ !*** ./node_modules/lodash/defaults.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseRest = __webpack_require__(/*! ./_baseRest */ "./node_modules/lodash/_baseRest.js"), eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"), @@ -41242,24 +41424,24 @@ var defaults = baseRest(function(object, sources) { module.exports = defaults; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/each.js" +/***/ "./node_modules/lodash/each.js": /*!*************************************!*\ !*** ./node_modules/lodash/each.js ***! \*************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { module.exports = __webpack_require__(/*! ./forEach */ "./node_modules/lodash/forEach.js"); -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/eq.js" +/***/ "./node_modules/lodash/eq.js": /*!***********************************!*\ !*** ./node_modules/lodash/eq.js ***! \***********************************/ -(module) { +/***/ (function(module) { /** * Performs a @@ -41300,13 +41482,13 @@ function eq(value, other) { module.exports = eq; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/filter.js" +/***/ "./node_modules/lodash/filter.js": /*!***************************************!*\ !*** ./node_modules/lodash/filter.js ***! \***************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var arrayFilter = __webpack_require__(/*! ./_arrayFilter */ "./node_modules/lodash/_arrayFilter.js"), baseFilter = __webpack_require__(/*! ./_baseFilter */ "./node_modules/lodash/_baseFilter.js"), @@ -41362,13 +41544,13 @@ function filter(collection, predicate) { module.exports = filter; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/find.js" +/***/ "./node_modules/lodash/find.js": /*!*************************************!*\ !*** ./node_modules/lodash/find.js ***! \*************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var createFind = __webpack_require__(/*! ./_createFind */ "./node_modules/lodash/_createFind.js"), findIndex = __webpack_require__(/*! ./findIndex */ "./node_modules/lodash/findIndex.js"); @@ -41414,13 +41596,13 @@ var find = createFind(findIndex); module.exports = find; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/findIndex.js" +/***/ "./node_modules/lodash/findIndex.js": /*!******************************************!*\ !*** ./node_modules/lodash/findIndex.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseFindIndex = __webpack_require__(/*! ./_baseFindIndex */ "./node_modules/lodash/_baseFindIndex.js"), baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), @@ -41479,13 +41661,13 @@ function findIndex(array, predicate, fromIndex) { module.exports = findIndex; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/flatten.js" +/***/ "./node_modules/lodash/flatten.js": /*!****************************************!*\ !*** ./node_modules/lodash/flatten.js ***! \****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseFlatten = __webpack_require__(/*! ./_baseFlatten */ "./node_modules/lodash/_baseFlatten.js"); @@ -41511,13 +41693,13 @@ function flatten(array) { module.exports = flatten; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/forEach.js" +/***/ "./node_modules/lodash/forEach.js": /*!****************************************!*\ !*** ./node_modules/lodash/forEach.js ***! \****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var arrayEach = __webpack_require__(/*! ./_arrayEach */ "./node_modules/lodash/_arrayEach.js"), baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js"), @@ -41562,13 +41744,13 @@ function forEach(collection, iteratee) { module.exports = forEach; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/forIn.js" +/***/ "./node_modules/lodash/forIn.js": /*!**************************************!*\ !*** ./node_modules/lodash/forIn.js ***! \**************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseFor = __webpack_require__(/*! ./_baseFor */ "./node_modules/lodash/_baseFor.js"), castFunction = __webpack_require__(/*! ./_castFunction */ "./node_modules/lodash/_castFunction.js"), @@ -41611,13 +41793,13 @@ function forIn(object, iteratee) { module.exports = forIn; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/get.js" +/***/ "./node_modules/lodash/get.js": /*!************************************!*\ !*** ./node_modules/lodash/get.js ***! \************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js"); @@ -41654,13 +41836,13 @@ function get(object, path, defaultValue) { module.exports = get; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/has.js" +/***/ "./node_modules/lodash/has.js": /*!************************************!*\ !*** ./node_modules/lodash/has.js ***! \************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseHas = __webpack_require__(/*! ./_baseHas */ "./node_modules/lodash/_baseHas.js"), hasPath = __webpack_require__(/*! ./_hasPath */ "./node_modules/lodash/_hasPath.js"); @@ -41699,13 +41881,13 @@ function has(object, path) { module.exports = has; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/hasIn.js" +/***/ "./node_modules/lodash/hasIn.js": /*!**************************************!*\ !*** ./node_modules/lodash/hasIn.js ***! \**************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseHasIn = __webpack_require__(/*! ./_baseHasIn */ "./node_modules/lodash/_baseHasIn.js"), hasPath = __webpack_require__(/*! ./_hasPath */ "./node_modules/lodash/_hasPath.js"); @@ -41743,13 +41925,13 @@ function hasIn(object, path) { module.exports = hasIn; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/identity.js" +/***/ "./node_modules/lodash/identity.js": /*!*****************************************!*\ !*** ./node_modules/lodash/identity.js ***! \*****************************************/ -(module) { +/***/ (function(module) { /** * This method returns the first argument it receives. @@ -41774,13 +41956,13 @@ function identity(value) { module.exports = identity; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/isArguments.js" +/***/ "./node_modules/lodash/isArguments.js": /*!********************************************!*\ !*** ./node_modules/lodash/isArguments.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseIsArguments = __webpack_require__(/*! ./_baseIsArguments */ "./node_modules/lodash/_baseIsArguments.js"), isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); @@ -41820,13 +42002,13 @@ var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsAr module.exports = isArguments; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/isArray.js" +/***/ "./node_modules/lodash/isArray.js": /*!****************************************!*\ !*** ./node_modules/lodash/isArray.js ***! \****************************************/ -(module) { +/***/ (function(module) { /** * Checks if `value` is classified as an `Array` object. @@ -41856,13 +42038,13 @@ var isArray = Array.isArray; module.exports = isArray; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/isArrayLike.js" +/***/ "./node_modules/lodash/isArrayLike.js": /*!********************************************!*\ !*** ./node_modules/lodash/isArrayLike.js ***! \********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isFunction = __webpack_require__(/*! ./isFunction */ "./node_modules/lodash/isFunction.js"), isLength = __webpack_require__(/*! ./isLength */ "./node_modules/lodash/isLength.js"); @@ -41899,13 +42081,13 @@ function isArrayLike(value) { module.exports = isArrayLike; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/isArrayLikeObject.js" +/***/ "./node_modules/lodash/isArrayLikeObject.js": /*!**************************************************!*\ !*** ./node_modules/lodash/isArrayLikeObject.js ***! \**************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"), isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); @@ -41942,13 +42124,13 @@ function isArrayLikeObject(value) { module.exports = isArrayLikeObject; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/isBuffer.js" +/***/ "./node_modules/lodash/isBuffer.js": /*!*****************************************!*\ !*** ./node_modules/lodash/isBuffer.js ***! \*****************************************/ -(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { /* module decorator */ module = __webpack_require__.nmd(module); var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"), @@ -41991,13 +42173,13 @@ var isBuffer = nativeIsBuffer || stubFalse; module.exports = isBuffer; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/isEmpty.js" +/***/ "./node_modules/lodash/isEmpty.js": /*!****************************************!*\ !*** ./node_modules/lodash/isEmpty.js ***! \****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseKeys = __webpack_require__(/*! ./_baseKeys */ "./node_modules/lodash/_baseKeys.js"), getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"), @@ -42078,13 +42260,13 @@ function isEmpty(value) { module.exports = isEmpty; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/isFunction.js" +/***/ "./node_modules/lodash/isFunction.js": /*!*******************************************!*\ !*** ./node_modules/lodash/isFunction.js ***! \*******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"); @@ -42125,13 +42307,13 @@ function isFunction(value) { module.exports = isFunction; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/isLength.js" +/***/ "./node_modules/lodash/isLength.js": /*!*****************************************!*\ !*** ./node_modules/lodash/isLength.js ***! \*****************************************/ -(module) { +/***/ (function(module) { /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; @@ -42170,13 +42352,13 @@ function isLength(value) { module.exports = isLength; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/isMap.js" +/***/ "./node_modules/lodash/isMap.js": /*!**************************************!*\ !*** ./node_modules/lodash/isMap.js ***! \**************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseIsMap = __webpack_require__(/*! ./_baseIsMap */ "./node_modules/lodash/_baseIsMap.js"), baseUnary = __webpack_require__(/*! ./_baseUnary */ "./node_modules/lodash/_baseUnary.js"), @@ -42207,13 +42389,13 @@ var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; module.exports = isMap; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/isObject.js" +/***/ "./node_modules/lodash/isObject.js": /*!*****************************************!*\ !*** ./node_modules/lodash/isObject.js ***! \*****************************************/ -(module) { +/***/ (function(module) { /** * Checks if `value` is the @@ -42248,13 +42430,13 @@ function isObject(value) { module.exports = isObject; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/isObjectLike.js" +/***/ "./node_modules/lodash/isObjectLike.js": /*!*********************************************!*\ !*** ./node_modules/lodash/isObjectLike.js ***! \*********************************************/ -(module) { +/***/ (function(module) { /** * Checks if `value` is object-like. A value is object-like if it's not `null` @@ -42287,13 +42469,13 @@ function isObjectLike(value) { module.exports = isObjectLike; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/isPlainObject.js" +/***/ "./node_modules/lodash/isPlainObject.js": /*!**********************************************!*\ !*** ./node_modules/lodash/isPlainObject.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), getPrototype = __webpack_require__(/*! ./_getPrototype */ "./node_modules/lodash/_getPrototype.js"), @@ -42359,13 +42541,13 @@ function isPlainObject(value) { module.exports = isPlainObject; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/isSet.js" +/***/ "./node_modules/lodash/isSet.js": /*!**************************************!*\ !*** ./node_modules/lodash/isSet.js ***! \**************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseIsSet = __webpack_require__(/*! ./_baseIsSet */ "./node_modules/lodash/_baseIsSet.js"), baseUnary = __webpack_require__(/*! ./_baseUnary */ "./node_modules/lodash/_baseUnary.js"), @@ -42396,13 +42578,13 @@ var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; module.exports = isSet; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/isString.js" +/***/ "./node_modules/lodash/isString.js": /*!*****************************************!*\ !*** ./node_modules/lodash/isString.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"), @@ -42436,13 +42618,13 @@ function isString(value) { module.exports = isString; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/isSymbol.js" +/***/ "./node_modules/lodash/isSymbol.js": /*!*****************************************!*\ !*** ./node_modules/lodash/isSymbol.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"), isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js"); @@ -42475,13 +42657,13 @@ function isSymbol(value) { module.exports = isSymbol; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/isTypedArray.js" +/***/ "./node_modules/lodash/isTypedArray.js": /*!*********************************************!*\ !*** ./node_modules/lodash/isTypedArray.js ***! \*********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseIsTypedArray = __webpack_require__(/*! ./_baseIsTypedArray */ "./node_modules/lodash/_baseIsTypedArray.js"), baseUnary = __webpack_require__(/*! ./_baseUnary */ "./node_modules/lodash/_baseUnary.js"), @@ -42512,13 +42694,13 @@ var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedA module.exports = isTypedArray; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/isUndefined.js" +/***/ "./node_modules/lodash/isUndefined.js": /*!********************************************!*\ !*** ./node_modules/lodash/isUndefined.js ***! \********************************************/ -(module) { +/***/ (function(module) { /** * Checks if `value` is `undefined`. @@ -42544,13 +42726,13 @@ function isUndefined(value) { module.exports = isUndefined; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/keys.js" +/***/ "./node_modules/lodash/keys.js": /*!*************************************!*\ !*** ./node_modules/lodash/keys.js ***! \*************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var arrayLikeKeys = __webpack_require__(/*! ./_arrayLikeKeys */ "./node_modules/lodash/_arrayLikeKeys.js"), baseKeys = __webpack_require__(/*! ./_baseKeys */ "./node_modules/lodash/_baseKeys.js"), @@ -42591,13 +42773,13 @@ function keys(object) { module.exports = keys; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/keysIn.js" +/***/ "./node_modules/lodash/keysIn.js": /*!***************************************!*\ !*** ./node_modules/lodash/keysIn.js ***! \***************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var arrayLikeKeys = __webpack_require__(/*! ./_arrayLikeKeys */ "./node_modules/lodash/_arrayLikeKeys.js"), baseKeysIn = __webpack_require__(/*! ./_baseKeysIn */ "./node_modules/lodash/_baseKeysIn.js"), @@ -42633,13 +42815,13 @@ function keysIn(object) { module.exports = keysIn; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/last.js" +/***/ "./node_modules/lodash/last.js": /*!*************************************!*\ !*** ./node_modules/lodash/last.js ***! \*************************************/ -(module) { +/***/ (function(module) { /** * Gets the last element of `array`. @@ -42663,13 +42845,13 @@ function last(array) { module.exports = last; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/map.js" +/***/ "./node_modules/lodash/map.js": /*!************************************!*\ !*** ./node_modules/lodash/map.js ***! \************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"), baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), @@ -42726,13 +42908,13 @@ function map(collection, iteratee) { module.exports = map; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/mapValues.js" +/***/ "./node_modules/lodash/mapValues.js": /*!******************************************!*\ !*** ./node_modules/lodash/mapValues.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"), baseForOwn = __webpack_require__(/*! ./_baseForOwn */ "./node_modules/lodash/_baseForOwn.js"), @@ -42779,13 +42961,13 @@ function mapValues(object, iteratee) { module.exports = mapValues; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/max.js" +/***/ "./node_modules/lodash/max.js": /*!************************************!*\ !*** ./node_modules/lodash/max.js ***! \************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseExtremum = __webpack_require__(/*! ./_baseExtremum */ "./node_modules/lodash/_baseExtremum.js"), baseGt = __webpack_require__(/*! ./_baseGt */ "./node_modules/lodash/_baseGt.js"), @@ -42818,13 +43000,13 @@ function max(array) { module.exports = max; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/memoize.js" +/***/ "./node_modules/lodash/memoize.js": /*!****************************************!*\ !*** ./node_modules/lodash/memoize.js ***! \****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var MapCache = __webpack_require__(/*! ./_MapCache */ "./node_modules/lodash/_MapCache.js"); @@ -42901,13 +43083,13 @@ memoize.Cache = MapCache; module.exports = memoize; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/merge.js" +/***/ "./node_modules/lodash/merge.js": /*!**************************************!*\ !*** ./node_modules/lodash/merge.js ***! \**************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseMerge = __webpack_require__(/*! ./_baseMerge */ "./node_modules/lodash/_baseMerge.js"), createAssigner = __webpack_require__(/*! ./_createAssigner */ "./node_modules/lodash/_createAssigner.js"); @@ -42950,13 +43132,13 @@ var merge = createAssigner(function(object, source, srcIndex) { module.exports = merge; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/min.js" +/***/ "./node_modules/lodash/min.js": /*!************************************!*\ !*** ./node_modules/lodash/min.js ***! \************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseExtremum = __webpack_require__(/*! ./_baseExtremum */ "./node_modules/lodash/_baseExtremum.js"), baseLt = __webpack_require__(/*! ./_baseLt */ "./node_modules/lodash/_baseLt.js"), @@ -42989,13 +43171,13 @@ function min(array) { module.exports = min; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/minBy.js" +/***/ "./node_modules/lodash/minBy.js": /*!**************************************!*\ !*** ./node_modules/lodash/minBy.js ***! \**************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseExtremum = __webpack_require__(/*! ./_baseExtremum */ "./node_modules/lodash/_baseExtremum.js"), baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"), @@ -43033,13 +43215,13 @@ function minBy(array, iteratee) { module.exports = minBy; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/noop.js" +/***/ "./node_modules/lodash/noop.js": /*!*************************************!*\ !*** ./node_modules/lodash/noop.js ***! \*************************************/ -(module) { +/***/ (function(module) { /** * This method returns `undefined`. @@ -43060,13 +43242,13 @@ function noop() { module.exports = noop; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/now.js" +/***/ "./node_modules/lodash/now.js": /*!************************************!*\ !*** ./node_modules/lodash/now.js ***! \************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"); @@ -43093,13 +43275,13 @@ var now = function() { module.exports = now; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/pick.js" +/***/ "./node_modules/lodash/pick.js": /*!*************************************!*\ !*** ./node_modules/lodash/pick.js ***! \*************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var basePick = __webpack_require__(/*! ./_basePick */ "./node_modules/lodash/_basePick.js"), flatRest = __webpack_require__(/*! ./_flatRest */ "./node_modules/lodash/_flatRest.js"); @@ -43128,13 +43310,13 @@ var pick = flatRest(function(object, paths) { module.exports = pick; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/property.js" +/***/ "./node_modules/lodash/property.js": /*!*****************************************!*\ !*** ./node_modules/lodash/property.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseProperty = __webpack_require__(/*! ./_baseProperty */ "./node_modules/lodash/_baseProperty.js"), basePropertyDeep = __webpack_require__(/*! ./_basePropertyDeep */ "./node_modules/lodash/_basePropertyDeep.js"), @@ -43170,13 +43352,13 @@ function property(path) { module.exports = property; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/range.js" +/***/ "./node_modules/lodash/range.js": /*!**************************************!*\ !*** ./node_modules/lodash/range.js ***! \**************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var createRange = __webpack_require__(/*! ./_createRange */ "./node_modules/lodash/_createRange.js"); @@ -43226,13 +43408,13 @@ var range = createRange(); module.exports = range; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/reduce.js" +/***/ "./node_modules/lodash/reduce.js": /*!***************************************!*\ !*** ./node_modules/lodash/reduce.js ***! \***************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var arrayReduce = __webpack_require__(/*! ./_arrayReduce */ "./node_modules/lodash/_arrayReduce.js"), baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js"), @@ -43287,13 +43469,13 @@ function reduce(collection, iteratee, accumulator) { module.exports = reduce; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/size.js" +/***/ "./node_modules/lodash/size.js": /*!*************************************!*\ !*** ./node_modules/lodash/size.js ***! \*************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseKeys = __webpack_require__(/*! ./_baseKeys */ "./node_modules/lodash/_baseKeys.js"), getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"), @@ -43343,13 +43525,13 @@ function size(collection) { module.exports = size; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/sortBy.js" +/***/ "./node_modules/lodash/sortBy.js": /*!***************************************!*\ !*** ./node_modules/lodash/sortBy.js ***! \***************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseFlatten = __webpack_require__(/*! ./_baseFlatten */ "./node_modules/lodash/_baseFlatten.js"), baseOrderBy = __webpack_require__(/*! ./_baseOrderBy */ "./node_modules/lodash/_baseOrderBy.js"), @@ -43401,13 +43583,13 @@ var sortBy = baseRest(function(collection, iteratees) { module.exports = sortBy; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/stubArray.js" +/***/ "./node_modules/lodash/stubArray.js": /*!******************************************!*\ !*** ./node_modules/lodash/stubArray.js ***! \******************************************/ -(module) { +/***/ (function(module) { /** * This method returns a new empty array. @@ -43434,13 +43616,13 @@ function stubArray() { module.exports = stubArray; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/stubFalse.js" +/***/ "./node_modules/lodash/stubFalse.js": /*!******************************************!*\ !*** ./node_modules/lodash/stubFalse.js ***! \******************************************/ -(module) { +/***/ (function(module) { /** * This method returns `false`. @@ -43462,13 +43644,13 @@ function stubFalse() { module.exports = stubFalse; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/toFinite.js" +/***/ "./node_modules/lodash/toFinite.js": /*!*****************************************!*\ !*** ./node_modules/lodash/toFinite.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var toNumber = __webpack_require__(/*! ./toNumber */ "./node_modules/lodash/toNumber.js"); @@ -43514,13 +43696,13 @@ function toFinite(value) { module.exports = toFinite; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/toInteger.js" +/***/ "./node_modules/lodash/toInteger.js": /*!******************************************!*\ !*** ./node_modules/lodash/toInteger.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var toFinite = __webpack_require__(/*! ./toFinite */ "./node_modules/lodash/toFinite.js"); @@ -43560,13 +43742,13 @@ function toInteger(value) { module.exports = toInteger; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/toNumber.js" +/***/ "./node_modules/lodash/toNumber.js": /*!*****************************************!*\ !*** ./node_modules/lodash/toNumber.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseTrim = __webpack_require__(/*! ./_baseTrim */ "./node_modules/lodash/_baseTrim.js"), isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"), @@ -43634,13 +43816,13 @@ function toNumber(value) { module.exports = toNumber; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/toPlainObject.js" +/***/ "./node_modules/lodash/toPlainObject.js": /*!**********************************************!*\ !*** ./node_modules/lodash/toPlainObject.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"), keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js"); @@ -43676,13 +43858,13 @@ function toPlainObject(value) { module.exports = toPlainObject; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/toString.js" +/***/ "./node_modules/lodash/toString.js": /*!*****************************************!*\ !*** ./node_modules/lodash/toString.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseToString = __webpack_require__(/*! ./_baseToString */ "./node_modules/lodash/_baseToString.js"); @@ -43714,13 +43896,13 @@ function toString(value) { module.exports = toString; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/transform.js" +/***/ "./node_modules/lodash/transform.js": /*!******************************************!*\ !*** ./node_modules/lodash/transform.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var arrayEach = __webpack_require__(/*! ./_arrayEach */ "./node_modules/lodash/_arrayEach.js"), baseCreate = __webpack_require__(/*! ./_baseCreate */ "./node_modules/lodash/_baseCreate.js"), @@ -43789,13 +43971,13 @@ function transform(object, iteratee, accumulator) { module.exports = transform; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/union.js" +/***/ "./node_modules/lodash/union.js": /*!**************************************!*\ !*** ./node_modules/lodash/union.js ***! \**************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseFlatten = __webpack_require__(/*! ./_baseFlatten */ "./node_modules/lodash/_baseFlatten.js"), baseRest = __webpack_require__(/*! ./_baseRest */ "./node_modules/lodash/_baseRest.js"), @@ -43825,13 +44007,13 @@ var union = baseRest(function(arrays) { module.exports = union; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/uniqueId.js" +/***/ "./node_modules/lodash/uniqueId.js": /*!*****************************************!*\ !*** ./node_modules/lodash/uniqueId.js ***! \*****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var toString = __webpack_require__(/*! ./toString */ "./node_modules/lodash/toString.js"); @@ -43863,13 +44045,13 @@ function uniqueId(prefix) { module.exports = uniqueId; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/values.js" +/***/ "./node_modules/lodash/values.js": /*!***************************************!*\ !*** ./node_modules/lodash/values.js ***! \***************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var baseValues = __webpack_require__(/*! ./_baseValues */ "./node_modules/lodash/_baseValues.js"), keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js"); @@ -43907,13 +44089,13 @@ function values(object) { module.exports = values; -/***/ }, +/***/ }), -/***/ "./node_modules/lodash/zipObject.js" +/***/ "./node_modules/lodash/zipObject.js": /*!******************************************!*\ !*** ./node_modules/lodash/zipObject.js ***! \******************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { var assignValue = __webpack_require__(/*! ./_assignValue */ "./node_modules/lodash/_assignValue.js"), baseZipObject = __webpack_require__(/*! ./_baseZipObject */ "./node_modules/lodash/_baseZipObject.js"); @@ -43941,13 +44123,13 @@ function zipObject(props, values) { module.exports = zipObject; -/***/ }, +/***/ }), -/***/ "./node_modules/prop-types/lib/ReactPropTypesSecret.js" +/***/ "./node_modules/prop-types/lib/ReactPropTypesSecret.js": /*!*************************************************************!*\ !*** ./node_modules/prop-types/lib/ReactPropTypesSecret.js ***! \*************************************************************/ -(module) { +/***/ (function(module) { "use strict"; /** @@ -43964,19 +44146,19 @@ var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; module.exports = ReactPropTypesSecret; -/***/ }, +/***/ }), -/***/ "./node_modules/react-base16-styling/lib/esm/colorConverters.js" +/***/ "./node_modules/react-base16-styling/lib/esm/colorConverters.js": /*!**********************************************************************!*\ !*** ./node_modules/react-base16-styling/lib/esm/colorConverters.js ***! \**********************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ rgb2yuv: () => (/* binding */ rgb2yuv), -/* harmony export */ yuv2rgb: () => (/* binding */ yuv2rgb) +/* harmony export */ rgb2yuv: function() { return /* binding */ rgb2yuv; }, +/* harmony export */ yuv2rgb: function() { return /* binding */ yuv2rgb; } /* harmony export */ }); function yuv2rgb(yuv) { var y = yuv[0], @@ -44001,21 +44183,21 @@ function rgb2yuv(rgb) { return [y, u, v]; } -/***/ }, +/***/ }), -/***/ "./node_modules/react-base16-styling/lib/esm/index.js" +/***/ "./node_modules/react-base16-styling/lib/esm/index.js": /*!************************************************************!*\ !*** ./node_modules/react-base16-styling/lib/esm/index.js ***! \************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ createStyling: () => (/* binding */ createStyling), -/* harmony export */ getBase16Theme: () => (/* binding */ getBase16Theme), -/* harmony export */ invertBase16Theme: () => (/* binding */ invertBase16Theme), -/* harmony export */ invertTheme: () => (/* binding */ invertTheme) +/* harmony export */ createStyling: function() { return /* binding */ createStyling; }, +/* harmony export */ getBase16Theme: function() { return /* binding */ getBase16Theme; }, +/* harmony export */ invertBase16Theme: function() { return /* binding */ invertBase16Theme; }, +/* harmony export */ invertTheme: function() { return /* binding */ invertTheme; } /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/esm/typeof.js"); /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); @@ -44311,13 +44493,13 @@ var invertTheme = function invertTheme(theme) { }; -/***/ }, +/***/ }), -/***/ "./node_modules/react-is/cjs/react-is.development.js" +/***/ "./node_modules/react-is/cjs/react-is.development.js": /*!***********************************************************!*\ !*** ./node_modules/react-is/cjs/react-is.development.js ***! \***********************************************************/ -(__unused_webpack_module, exports) { +/***/ (function(__unused_webpack_module, exports) { "use strict"; /** @license React v16.13.1 @@ -44503,13 +44685,13 @@ exports.typeOf = typeOf; } -/***/ }, +/***/ }), -/***/ "./node_modules/react-is/index.js" +/***/ "./node_modules/react-is/index.js": /*!****************************************!*\ !*** ./node_modules/react-is/index.js ***! \****************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -44520,18 +44702,18 @@ if (false) // removed by dead control flow } -/***/ }, +/***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/ItemRange.js" +/***/ "./node_modules/react-json-tree/lib/esm/ItemRange.js": /*!***********************************************************!*\ !*** ./node_modules/react-json-tree/lib/esm/ItemRange.js ***! \***********************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ ItemRange) +/* harmony export */ "default": function() { return /* binding */ ItemRange; } /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/esm/classCallCheck.js"); @@ -44621,13 +44803,13 @@ var ItemRange = /*#__PURE__*/function (_React$Component) { -/***/ }, +/***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/JSONArrayNode.js" +/***/ "./node_modules/react-json-tree/lib/esm/JSONArrayNode.js": /*!***************************************************************!*\ !*** ./node_modules/react-json-tree/lib/esm/JSONArrayNode.js ***! \***************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -44670,13 +44852,13 @@ JSONArrayNode.propTypes = { }; /* harmony default export */ __webpack_exports__["default"] = (JSONArrayNode); -/***/ }, +/***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/JSONArrow.js" +/***/ "./node_modules/react-json-tree/lib/esm/JSONArrow.js": /*!***********************************************************!*\ !*** ./node_modules/react-json-tree/lib/esm/JSONArrow.js ***! \***********************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -44712,13 +44894,13 @@ JSONArrow.defaultProps = { }; /* harmony default export */ __webpack_exports__["default"] = (JSONArrow); -/***/ }, +/***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/JSONIterableNode.js" +/***/ "./node_modules/react-json-tree/lib/esm/JSONIterableNode.js": /*!******************************************************************!*\ !*** ./node_modules/react-json-tree/lib/esm/JSONIterableNode.js ***! \******************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -44784,18 +44966,18 @@ var JSONIterableNode = function JSONIterableNode(_ref) { /* harmony default export */ __webpack_exports__["default"] = (JSONIterableNode); -/***/ }, +/***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/JSONNestedNode.js" +/***/ "./node_modules/react-json-tree/lib/esm/JSONNestedNode.js": /*!****************************************************************!*\ !*** ./node_modules/react-json-tree/lib/esm/JSONNestedNode.js ***! \****************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ JSONNestedNode) +/* harmony export */ "default": function() { return /* binding */ JSONNestedNode; } /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/esm/classCallCheck.js"); /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/esm/createClass.js"); @@ -44994,13 +45176,13 @@ var JSONNestedNode = /*#__PURE__*/function (_React$Component) { -/***/ }, +/***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/JSONNode.js" +/***/ "./node_modules/react-json-tree/lib/esm/JSONNode.js": /*!**********************************************************!*\ !*** ./node_modules/react-json-tree/lib/esm/JSONNode.js ***! \**********************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -45144,13 +45326,13 @@ JSONNode.propTypes = { }; /* harmony default export */ __webpack_exports__["default"] = (JSONNode); -/***/ }, +/***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/JSONObjectNode.js" +/***/ "./node_modules/react-json-tree/lib/esm/JSONObjectNode.js": /*!****************************************************************!*\ !*** ./node_modules/react-json-tree/lib/esm/JSONObjectNode.js ***! \****************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -45195,13 +45377,13 @@ JSONObjectNode.propTypes = { }; /* harmony default export */ __webpack_exports__["default"] = (JSONObjectNode); -/***/ }, +/***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/JSONValueNode.js" +/***/ "./node_modules/react-json-tree/lib/esm/JSONValueNode.js": /*!***************************************************************!*\ !*** ./node_modules/react-json-tree/lib/esm/JSONValueNode.js ***! \***************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -45239,13 +45421,13 @@ JSONValueNode.propTypes = { }; /* harmony default export */ __webpack_exports__["default"] = (JSONValueNode); -/***/ }, +/***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/createStylingFromTheme.js" +/***/ "./node_modules/react-json-tree/lib/esm/createStylingFromTheme.js": /*!************************************************************************!*\ !*** ./node_modules/react-json-tree/lib/esm/createStylingFromTheme.js ***! \************************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -45452,18 +45634,18 @@ var createStylingFromTheme = (0,react_base16_styling__WEBPACK_IMPORTED_MODULE_1_ }); /* harmony default export */ __webpack_exports__["default"] = (createStylingFromTheme); -/***/ }, +/***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/getCollectionEntries.js" +/***/ "./node_modules/react-json-tree/lib/esm/getCollectionEntries.js": /*!**********************************************************************!*\ !*** ./node_modules/react-json-tree/lib/esm/getCollectionEntries.js ***! \**********************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ getCollectionEntries) +/* harmony export */ "default": function() { return /* binding */ getCollectionEntries; } /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js"); @@ -45632,18 +45814,18 @@ function getCollectionEntries(type, collection, sortObjectKeys, limit) { return limitedEntries; } -/***/ }, +/***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/index.js" +/***/ "./node_modules/react-json-tree/lib/esm/index.js": /*!*******************************************************!*\ !*** ./node_modules/react-json-tree/lib/esm/index.js ***! \*******************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ JSONTree: () => (/* binding */ JSONTree) +/* harmony export */ JSONTree: function() { return /* binding */ JSONTree; } /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); @@ -45852,18 +46034,18 @@ var JSONTree = /*#__PURE__*/function (_React$Component) { invertTheme: true }); -/***/ }, +/***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/objType.js" +/***/ "./node_modules/react-json-tree/lib/esm/objType.js": /*!*********************************************************!*\ !*** ./node_modules/react-json-tree/lib/esm/objType.js ***! \*********************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ objType) +/* harmony export */ "default": function() { return /* binding */ objType; } /* harmony export */ }); function objType(obj) { var type = Object.prototype.toString.call(obj).slice(8, -1); @@ -45880,13 +46062,13 @@ function objType(obj) { return type; } -/***/ }, +/***/ }), -/***/ "./node_modules/react-json-tree/lib/esm/themes/solarized.js" +/***/ "./node_modules/react-json-tree/lib/esm/themes/solarized.js": /*!******************************************************************!*\ !*** ./node_modules/react-json-tree/lib/esm/themes/solarized.js ***! \******************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -45911,18 +46093,18 @@ __webpack_require__.r(__webpack_exports__); base0F: '#d33682' }); -/***/ }, +/***/ }), -/***/ "./node_modules/redux-actions/es/createAction.js" +/***/ "./node_modules/redux-actions/es/createAction.js": /*!*******************************************************!*\ !*** ./node_modules/redux-actions/es/createAction.js ***! \*******************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ createAction) +/* harmony export */ "default": function() { return /* binding */ createAction; } /* harmony export */ }); /* harmony import */ var invariant__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! invariant */ "./node_modules/invariant/browser.js"); /* harmony import */ var invariant__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(invariant__WEBPACK_IMPORTED_MODULE_0__); @@ -45977,13 +46159,13 @@ function createAction(type, payloadCreator, metaCreator) { return actionCreator; } -/***/ }, +/***/ }), -/***/ "./node_modules/redux-actions/es/utils/identity.js" +/***/ "./node_modules/redux-actions/es/utils/identity.js": /*!*********************************************************!*\ !*** ./node_modules/redux-actions/es/utils/identity.js ***! \*********************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -45991,13 +46173,13 @@ __webpack_require__.r(__webpack_exports__); return value; }); -/***/ }, +/***/ }), -/***/ "./node_modules/redux-actions/es/utils/isFunction.js" +/***/ "./node_modules/redux-actions/es/utils/isFunction.js": /*!***********************************************************!*\ !*** ./node_modules/redux-actions/es/utils/isFunction.js ***! \***********************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -46005,13 +46187,13 @@ __webpack_require__.r(__webpack_exports__); return typeof value === 'function'; }); -/***/ }, +/***/ }), -/***/ "./node_modules/redux-actions/es/utils/isNull.js" +/***/ "./node_modules/redux-actions/es/utils/isNull.js": /*!*******************************************************!*\ !*** ./node_modules/redux-actions/es/utils/isNull.js ***! \*******************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -46019,13 +46201,13 @@ __webpack_require__.r(__webpack_exports__); return value === null; }); -/***/ }, +/***/ }), -/***/ "./node_modules/redux-thunk/es/index.js" +/***/ "./node_modules/redux-thunk/es/index.js": /*!**********************************************!*\ !*** ./node_modules/redux-thunk/es/index.js ***! \**********************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -46062,24 +46244,24 @@ var thunk = createThunkMiddleware(); // Attach the factory function so users can thunk.withExtraArgument = createThunkMiddleware; /* harmony default export */ __webpack_exports__["default"] = (thunk); -/***/ }, +/***/ }), -/***/ "./node_modules/redux/es/redux.js" +/***/ "./node_modules/redux/es/redux.js": /*!****************************************!*\ !*** ./node_modules/redux/es/redux.js ***! \****************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ __DO_NOT_USE__ActionTypes: () => (/* binding */ ActionTypes), -/* harmony export */ applyMiddleware: () => (/* binding */ applyMiddleware), -/* harmony export */ bindActionCreators: () => (/* binding */ bindActionCreators), -/* harmony export */ combineReducers: () => (/* binding */ combineReducers), -/* harmony export */ compose: () => (/* binding */ compose), -/* harmony export */ createStore: () => (/* binding */ createStore), -/* harmony export */ legacy_createStore: () => (/* binding */ legacy_createStore) +/* harmony export */ __DO_NOT_USE__ActionTypes: function() { return /* binding */ ActionTypes; }, +/* harmony export */ applyMiddleware: function() { return /* binding */ applyMiddleware; }, +/* harmony export */ bindActionCreators: function() { return /* binding */ bindActionCreators; }, +/* harmony export */ combineReducers: function() { return /* binding */ combineReducers; }, +/* harmony export */ compose: function() { return /* binding */ compose; }, +/* harmony export */ createStore: function() { return /* binding */ createStore; }, +/* harmony export */ legacy_createStore: function() { return /* binding */ legacy_createStore; } /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "./node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); @@ -46789,13 +46971,13 @@ function applyMiddleware() { -/***/ }, +/***/ }), -/***/ "./node_modules/simple-swizzle/index.js" +/***/ "./node_modules/simple-swizzle/index.js": /*!**********************************************!*\ !*** ./node_modules/simple-swizzle/index.js ***! \**********************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -46829,13 +47011,13 @@ swizzle.wrap = function (fn) { }; -/***/ }, +/***/ }), -/***/ "./node_modules/simple-swizzle/node_modules/is-arrayish/index.js" +/***/ "./node_modules/simple-swizzle/node_modules/is-arrayish/index.js": /*!***********************************************************************!*\ !*** ./node_modules/simple-swizzle/node_modules/is-arrayish/index.js ***! \***********************************************************************/ -(module) { +/***/ (function(module) { module.exports = function isArrayish(obj) { if (!obj || typeof obj === 'string') { @@ -46848,13 +47030,13 @@ module.exports = function isArrayish(obj) { }; -/***/ }, +/***/ }), -/***/ "./src/components/core/Toolbar.css" +/***/ "./src/components/core/Toolbar.css": /*!*****************************************!*\ !*** ./src/components/core/Toolbar.css ***! \*****************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -46900,13 +47082,13 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_Toolbar_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_Toolbar_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_Toolbar_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); -/***/ }, +/***/ }), -/***/ "./src/components/error/CallbackGraph/CallbackGraphContainer.css" +/***/ "./src/components/error/CallbackGraph/CallbackGraphContainer.css": /*!***********************************************************************!*\ !*** ./src/components/error/CallbackGraph/CallbackGraphContainer.css ***! \***********************************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -46952,13 +47134,13 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_CallbackGraphContainer_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_CallbackGraphContainer_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_CallbackGraphContainer_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); -/***/ }, +/***/ }), -/***/ "./src/components/error/FrontEnd/FrontEndError.css" +/***/ "./src/components/error/FrontEnd/FrontEndError.css": /*!*********************************************************!*\ !*** ./src/components/error/FrontEnd/FrontEndError.css ***! \*********************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -47004,13 +47186,13 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_FrontEndError_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_FrontEndError_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_FrontEndError_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); -/***/ }, +/***/ }), -/***/ "./src/components/error/Percy.css" +/***/ "./src/components/error/Percy.css": /*!****************************************!*\ !*** ./src/components/error/Percy.css ***! \****************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -47056,13 +47238,13 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_Percy_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_Percy_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_Percy_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); -/***/ }, +/***/ }), -/***/ "./src/components/error/menu/DebugMenu.css" +/***/ "./src/components/error/menu/DebugMenu.css": /*!*************************************************!*\ !*** ./src/components/error/menu/DebugMenu.css ***! \*************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -47108,13 +47290,13 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_DebugMenu_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_DebugMenu_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_DebugMenu_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); -/***/ }, +/***/ }), -/***/ "./src/components/error/menu/PlotlyCloud.css" +/***/ "./src/components/error/menu/PlotlyCloud.css": /*!***************************************************!*\ !*** ./src/components/error/menu/PlotlyCloud.css ***! \***************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -47160,13 +47342,13 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_PlotlyCloud_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_PlotlyCloud_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_PlotlyCloud_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); -/***/ }, +/***/ }), -/***/ "./src/components/error/menu/VersionInfo.css" +/***/ "./src/components/error/menu/VersionInfo.css": /*!***************************************************!*\ !*** ./src/components/error/menu/VersionInfo.css ***! \***************************************************/ -(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -47212,13 +47394,13 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js /* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_VersionInfo_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_VersionInfo_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_VersionInfo_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined); -/***/ }, +/***/ }), -/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js" +/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js": /*!****************************************************************************!*\ !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***! \****************************************************************************/ -(module) { +/***/ (function(module) { "use strict"; @@ -47306,13 +47488,13 @@ module.exports = function (list, options) { }; }; -/***/ }, +/***/ }), -/***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js" +/***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js": /*!********************************************************************!*\ !*** ./node_modules/style-loader/dist/runtime/insertBySelector.js ***! \********************************************************************/ -(module) { +/***/ (function(module) { "use strict"; @@ -47350,13 +47532,13 @@ function insertBySelector(insert, style) { } module.exports = insertBySelector; -/***/ }, +/***/ }), -/***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js" +/***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js": /*!**********************************************************************!*\ !*** ./node_modules/style-loader/dist/runtime/insertStyleElement.js ***! \**********************************************************************/ -(module) { +/***/ (function(module) { "use strict"; @@ -47370,13 +47552,13 @@ function insertStyleElement(options) { } module.exports = insertStyleElement; -/***/ }, +/***/ }), -/***/ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js" +/***/ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js": /*!**********************************************************************************!*\ !*** ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js ***! \**********************************************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -47390,13 +47572,13 @@ function setAttributesWithoutAttributes(styleElement) { } module.exports = setAttributesWithoutAttributes; -/***/ }, +/***/ }), -/***/ "./node_modules/style-loader/dist/runtime/styleDomAPI.js" +/***/ "./node_modules/style-loader/dist/runtime/styleDomAPI.js": /*!***************************************************************!*\ !*** ./node_modules/style-loader/dist/runtime/styleDomAPI.js ***! \***************************************************************/ -(module) { +/***/ (function(module) { "use strict"; @@ -47461,13 +47643,13 @@ function domAPI(options) { } module.exports = domAPI; -/***/ }, +/***/ }), -/***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js" +/***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js": /*!*********************************************************************!*\ !*** ./node_modules/style-loader/dist/runtime/styleTagTransform.js ***! \*********************************************************************/ -(module) { +/***/ (function(module) { "use strict"; @@ -47485,13 +47667,13 @@ function styleTagTransform(css, styleElement) { } module.exports = styleTagTransform; -/***/ }, +/***/ }), -/***/ "./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js" +/***/ "./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js": /*!**********************************************************************************************!*\ !*** ./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js ***! \**********************************************************************************************/ -(__unused_webpack_module, exports, __webpack_require__) { +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; /** @@ -47735,13 +47917,13 @@ if ( } -/***/ }, +/***/ }), -/***/ "./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js" +/***/ "./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js": /*!************************************************************************************************************!*\ !*** ./node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js ***! \************************************************************************************************************/ -(__unused_webpack_module, exports, __webpack_require__) { +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; /** @@ -47911,13 +48093,13 @@ if ( } -/***/ }, +/***/ }), -/***/ "./node_modules/use-sync-external-store/shim/index.js" +/***/ "./node_modules/use-sync-external-store/shim/index.js": /*!************************************************************!*\ !*** ./node_modules/use-sync-external-store/shim/index.js ***! \************************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -47928,13 +48110,13 @@ if (false) // removed by dead control flow } -/***/ }, +/***/ }), -/***/ "./node_modules/use-sync-external-store/shim/with-selector.js" +/***/ "./node_modules/use-sync-external-store/shim/with-selector.js": /*!********************************************************************!*\ !*** ./node_modules/use-sync-external-store/shim/with-selector.js ***! \********************************************************************/ -(module, __unused_webpack_exports, __webpack_require__) { +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { "use strict"; @@ -47945,51 +48127,51 @@ if (false) // removed by dead control flow } -/***/ }, +/***/ }), -/***/ "prop-types" +/***/ "prop-types": /*!****************************!*\ !*** external "PropTypes" ***! \****************************/ -(module) { +/***/ (function(module) { "use strict"; module.exports = window["PropTypes"]; -/***/ }, +/***/ }), -/***/ "react" +/***/ "react": /*!************************!*\ !*** external "React" ***! \************************/ -(module) { +/***/ (function(module) { "use strict"; module.exports = window["React"]; -/***/ }, +/***/ }), -/***/ "react-dom" +/***/ "react-dom": /*!***************************!*\ !*** external "ReactDOM" ***! \***************************/ -(module) { +/***/ (function(module) { "use strict"; module.exports = window["ReactDOM"]; -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js": /*!*********************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js ***! \*********************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _arrayLikeToArray) +/* harmony export */ "default": function() { return /* binding */ _arrayLikeToArray; } /* harmony export */ }); function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); @@ -47998,36 +48180,36 @@ function _arrayLikeToArray(r, a) { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js": /*!*******************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js ***! \*******************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _arrayWithHoles) +/* harmony export */ "default": function() { return /* binding */ _arrayWithHoles; } /* harmony export */ }); function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js": /*!**********************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js ***! \**********************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _arrayWithoutHoles) +/* harmony export */ "default": function() { return /* binding */ _arrayWithoutHoles; } /* harmony export */ }); /* harmony import */ var _arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayLikeToArray.js */ "./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js"); @@ -48036,18 +48218,18 @@ function _arrayWithoutHoles(r) { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js": /*!**************************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js ***! \**************************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _assertThisInitialized) +/* harmony export */ "default": function() { return /* binding */ _assertThisInitialized; } /* harmony export */ }); function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); @@ -48055,36 +48237,36 @@ function _assertThisInitialized(e) { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/classCallCheck.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/classCallCheck.js": /*!*******************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/classCallCheck.js ***! \*******************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _classCallCheck) +/* harmony export */ "default": function() { return /* binding */ _classCallCheck; } /* harmony export */ }); function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/createClass.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/createClass.js": /*!****************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/createClass.js ***! \****************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _createClass) +/* harmony export */ "default": function() { return /* binding */ _createClass; } /* harmony export */ }); /* harmony import */ var _toPropertyKey_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./toPropertyKey.js */ "./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js"); @@ -48101,18 +48283,18 @@ function _createClass(e, r, t) { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js": /*!*******************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/defineProperty.js ***! \*******************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _defineProperty) +/* harmony export */ "default": function() { return /* binding */ _defineProperty; } /* harmony export */ }); /* harmony import */ var _toPropertyKey_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./toPropertyKey.js */ "./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js"); @@ -48126,18 +48308,18 @@ function _defineProperty(e, r, t) { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/extends.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/extends.js": /*!************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/extends.js ***! \************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _extends) +/* harmony export */ "default": function() { return /* binding */ _extends; } /* harmony export */ }); function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { @@ -48150,18 +48332,18 @@ function _extends() { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js": /*!*******************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js ***! \*******************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _getPrototypeOf) +/* harmony export */ "default": function() { return /* binding */ _getPrototypeOf; } /* harmony export */ }); function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { @@ -48170,18 +48352,18 @@ function _getPrototypeOf(t) { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/inherits.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/inherits.js": /*!*************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/inherits.js ***! \*************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _inherits) +/* harmony export */ "default": function() { return /* binding */ _inherits; } /* harmony export */ }); /* harmony import */ var _setPrototypeOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./setPrototypeOf.js */ "./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js"); @@ -48199,36 +48381,36 @@ function _inherits(t, e) { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/iterableToArray.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/iterableToArray.js": /*!********************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/iterableToArray.js ***! \********************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _iterableToArray) +/* harmony export */ "default": function() { return /* binding */ _iterableToArray; } /* harmony export */ }); function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js": /*!*************************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js ***! \*************************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _iterableToArrayLimit) +/* harmony export */ "default": function() { return /* binding */ _iterableToArrayLimit; } /* harmony export */ }); function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; @@ -48259,54 +48441,54 @@ function _iterableToArrayLimit(r, l) { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js": /*!********************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js ***! \********************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _nonIterableRest) +/* harmony export */ "default": function() { return /* binding */ _nonIterableRest; } /* harmony export */ }); function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js": /*!**********************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js ***! \**********************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _nonIterableSpread) +/* harmony export */ "default": function() { return /* binding */ _nonIterableSpread; } /* harmony export */ }); function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/objectSpread2.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/objectSpread2.js": /*!******************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/objectSpread2.js ***! \******************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _objectSpread2) +/* harmony export */ "default": function() { return /* binding */ _objectSpread2; } /* harmony export */ }); /* harmony import */ var _defineProperty_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./defineProperty.js */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); @@ -48333,18 +48515,18 @@ function _objectSpread2(e) { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js": /*!****************************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js ***! \****************************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _objectWithoutProperties) +/* harmony export */ "default": function() { return /* binding */ _objectWithoutProperties; } /* harmony export */ }); /* harmony import */ var _objectWithoutPropertiesLoose_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./objectWithoutPropertiesLoose.js */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js"); @@ -48361,18 +48543,18 @@ function _objectWithoutProperties(e, t) { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js": /*!*********************************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js ***! \*********************************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _objectWithoutPropertiesLoose) +/* harmony export */ "default": function() { return /* binding */ _objectWithoutPropertiesLoose; } /* harmony export */ }); function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; @@ -48385,18 +48567,18 @@ function _objectWithoutPropertiesLoose(r, e) { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js": /*!******************************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js ***! \******************************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _possibleConstructorReturn) +/* harmony export */ "default": function() { return /* binding */ _possibleConstructorReturn; } /* harmony export */ }); /* harmony import */ var _typeof_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./typeof.js */ "./node_modules/@babel/runtime/helpers/esm/typeof.js"); /* harmony import */ var _assertThisInitialized_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./assertThisInitialized.js */ "./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js"); @@ -48409,18 +48591,18 @@ function _possibleConstructorReturn(t, e) { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js": /*!*******************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js ***! \*******************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _setPrototypeOf) +/* harmony export */ "default": function() { return /* binding */ _setPrototypeOf; } /* harmony export */ }); function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { @@ -48429,18 +48611,18 @@ function _setPrototypeOf(t, e) { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js": /*!******************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js ***! \******************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _slicedToArray) +/* harmony export */ "default": function() { return /* binding */ _slicedToArray; } /* harmony export */ }); /* harmony import */ var _arrayWithHoles_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayWithHoles.js */ "./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js"); /* harmony import */ var _iterableToArrayLimit_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./iterableToArrayLimit.js */ "./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js"); @@ -48455,18 +48637,18 @@ function _slicedToArray(r, e) { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js": /*!**********************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js ***! \**********************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _toConsumableArray) +/* harmony export */ "default": function() { return /* binding */ _toConsumableArray; } /* harmony export */ }); /* harmony import */ var _arrayWithoutHoles_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayWithoutHoles.js */ "./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js"); /* harmony import */ var _iterableToArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./iterableToArray.js */ "./node_modules/@babel/runtime/helpers/esm/iterableToArray.js"); @@ -48481,18 +48663,18 @@ function _toConsumableArray(r) { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/toPrimitive.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/toPrimitive.js": /*!****************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/toPrimitive.js ***! \****************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ toPrimitive) +/* harmony export */ "default": function() { return /* binding */ toPrimitive; } /* harmony export */ }); /* harmony import */ var _typeof_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./typeof.js */ "./node_modules/@babel/runtime/helpers/esm/typeof.js"); @@ -48508,18 +48690,18 @@ function toPrimitive(t, r) { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js": /*!******************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js ***! \******************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ toPropertyKey) +/* harmony export */ "default": function() { return /* binding */ toPropertyKey; } /* harmony export */ }); /* harmony import */ var _typeof_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./typeof.js */ "./node_modules/@babel/runtime/helpers/esm/typeof.js"); /* harmony import */ var _toPrimitive_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toPrimitive.js */ "./node_modules/@babel/runtime/helpers/esm/toPrimitive.js"); @@ -48531,18 +48713,18 @@ function toPropertyKey(t) { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/typeof.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/typeof.js": /*!***********************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/typeof.js ***! \***********************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _typeof) +/* harmony export */ "default": function() { return /* binding */ _typeof; } /* harmony export */ }); function _typeof(o) { "@babel/helpers - typeof"; @@ -48555,18 +48737,18 @@ function _typeof(o) { } -/***/ }, +/***/ }), -/***/ "./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js" +/***/ "./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js": /*!*******************************************************************************!*\ !*** ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js ***! \*******************************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _unsupportedIterableToArray) +/* harmony export */ "default": function() { return /* binding */ _unsupportedIterableToArray; } /* harmony export */ }); /* harmony import */ var _arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayLikeToArray.js */ "./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js"); @@ -48579,13 +48761,13 @@ function _unsupportedIterableToArray(r, a) { } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/all.js" +/***/ "./node_modules/ramda/es/all.js": /*!**************************************!*\ !*** ./node_modules/ramda/es/all.js ***! \**************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -48632,13 +48814,13 @@ var all = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["defa })); /* harmony default export */ __webpack_exports__["default"] = (all); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/always.js" +/***/ "./node_modules/ramda/es/always.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/always.js ***! \*****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -48671,13 +48853,13 @@ var always = /*#__PURE__*/(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["d }); /* harmony default export */ __webpack_exports__["default"] = (always); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/any.js" +/***/ "./node_modules/ramda/es/any.js": /*!**************************************!*\ !*** ./node_modules/ramda/es/any.js ***! \**************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -48725,13 +48907,13 @@ var any = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["defa })); /* harmony default export */ __webpack_exports__["default"] = (any); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/ap.js" +/***/ "./node_modules/ramda/es/ap.js": /*!*************************************!*\ !*** ./node_modules/ramda/es/ap.js ***! \*************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -48779,13 +48961,13 @@ var ap = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["defau }); /* harmony default export */ __webpack_exports__["default"] = (ap); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/append.js" +/***/ "./node_modules/ramda/es/append.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/append.js ***! \*****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -48819,13 +49001,13 @@ var append = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["d }); /* harmony default export */ __webpack_exports__["default"] = (append); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/assoc.js" +/***/ "./node_modules/ramda/es/assoc.js": /*!****************************************!*\ !*** ./node_modules/ramda/es/assoc.js ***! \****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -48860,13 +49042,13 @@ var assoc = /*#__PURE__*/(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["de }); /* harmony default export */ __webpack_exports__["default"] = (assoc); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/assocPath.js" +/***/ "./node_modules/ramda/es/assocPath.js": /*!********************************************!*\ !*** ./node_modules/ramda/es/assocPath.js ***! \********************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -48875,6 +49057,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _internal_isInteger_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_isInteger.js */ "./node_modules/ramda/es/internal/_isInteger.js"); /* harmony import */ var _internal_assoc_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/_assoc.js */ "./node_modules/ramda/es/internal/_assoc.js"); /* harmony import */ var _isNil_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./isNil.js */ "./node_modules/ramda/es/isNil.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } @@ -48911,20 +49094,20 @@ var assocPath = /*#__PURE__*/(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ } var idx = path[0]; if (path.length > 1) { - var nextObj = !(0,_isNil_js__WEBPACK_IMPORTED_MODULE_4__["default"])(obj) && (0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(idx, obj) && typeof obj[idx] === 'object' ? obj[idx] : (0,_internal_isInteger_js__WEBPACK_IMPORTED_MODULE_2__["default"])(path[1]) ? [] : {}; + var nextObj = !(0,_isNil_js__WEBPACK_IMPORTED_MODULE_4__["default"])(obj) && (0,_internal_has_js__WEBPACK_IMPORTED_MODULE_1__["default"])(idx, obj) && _typeof(obj[idx]) === 'object' ? obj[idx] : (0,_internal_isInteger_js__WEBPACK_IMPORTED_MODULE_2__["default"])(path[1]) ? [] : {}; val = assocPath(Array.prototype.slice.call(path, 1), val, nextObj); } return (0,_internal_assoc_js__WEBPACK_IMPORTED_MODULE_3__["default"])(idx, val, obj); }); /* harmony default export */ __webpack_exports__["default"] = (assocPath); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/bind.js" +/***/ "./node_modules/ramda/es/bind.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/bind.js ***! \***************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -48962,13 +49145,13 @@ var bind = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["def }); /* harmony default export */ __webpack_exports__["default"] = (bind); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/clone.js" +/***/ "./node_modules/ramda/es/clone.js": /*!****************************************!*\ !*** ./node_modules/ramda/es/clone.js ***! \****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -49009,13 +49192,13 @@ var clone = /*#__PURE__*/(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__["de }); /* harmony default export */ __webpack_exports__["default"] = (clone); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/comparator.js" +/***/ "./node_modules/ramda/es/comparator.js": /*!*********************************************!*\ !*** ./node_modules/ramda/es/comparator.js ***! \*********************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -49052,13 +49235,13 @@ var comparator = /*#__PURE__*/(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0_ }); /* harmony default export */ __webpack_exports__["default"] = (comparator); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/concat.js" +/***/ "./node_modules/ramda/es/concat.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/concat.js ***! \*****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -49124,13 +49307,13 @@ var concat = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["d }); /* harmony default export */ __webpack_exports__["default"] = (concat); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/converge.js" +/***/ "./node_modules/ramda/es/converge.js": /*!*******************************************!*\ !*** ./node_modules/ramda/es/converge.js ***! \*******************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -49186,13 +49369,13 @@ var converge = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__[ }); /* harmony default export */ __webpack_exports__["default"] = (converge); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/curryN.js" +/***/ "./node_modules/ramda/es/curryN.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/curryN.js ***! \*****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -49255,13 +49438,13 @@ var curryN = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_2__["d }); /* harmony default export */ __webpack_exports__["default"] = (curryN); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/defaultTo.js" +/***/ "./node_modules/ramda/es/defaultTo.js": /*!********************************************!*\ !*** ./node_modules/ramda/es/defaultTo.js ***! \********************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -49296,13 +49479,13 @@ var defaultTo = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ }); /* harmony default export */ __webpack_exports__["default"] = (defaultTo); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/difference.js" +/***/ "./node_modules/ramda/es/difference.js": /*!*********************************************!*\ !*** ./node_modules/ramda/es/difference.js ***! \*********************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -49350,13 +49533,13 @@ var difference = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0_ }); /* harmony default export */ __webpack_exports__["default"] = (difference); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/dissoc.js" +/***/ "./node_modules/ramda/es/dissoc.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/dissoc.js ***! \*****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -49386,13 +49569,13 @@ var dissoc = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["d }); /* harmony default export */ __webpack_exports__["default"] = (dissoc); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/dissocPath.js" +/***/ "./node_modules/ramda/es/dissocPath.js": /*!*********************************************!*\ !*** ./node_modules/ramda/es/dissocPath.js ***! \*********************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -49468,13 +49651,13 @@ var dissocPath = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0_ }); /* harmony default export */ __webpack_exports__["default"] = (dissocPath); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/empty.js" +/***/ "./node_modules/ramda/es/empty.js": /*!****************************************!*\ !*** ./node_modules/ramda/es/empty.js ***! \****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -49524,13 +49707,13 @@ var empty = /*#__PURE__*/(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["de }); /* harmony default export */ __webpack_exports__["default"] = (empty); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/equals.js" +/***/ "./node_modules/ramda/es/equals.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/equals.js ***! \*****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -49569,19 +49752,20 @@ var equals = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["d }); /* harmony default export */ __webpack_exports__["default"] = (equals); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/evolve.js" +/***/ "./node_modules/ramda/es/evolve.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/evolve.js ***! \*****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); /* harmony import */ var _internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); /* harmony import */ var _internal_isObject_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/_isObject.js */ "./node_modules/ramda/es/internal/_isObject.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } @@ -49621,20 +49805,20 @@ var evolve = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["d var transformation, key, type; for (key in object) { transformation = transformations[key]; - type = typeof transformation; + type = _typeof(transformation); result[key] = type === 'function' ? transformation(object[key]) : transformation && type === 'object' ? evolve(transformation, object[key]) : object[key]; } return result; }); /* harmony default export */ __webpack_exports__["default"] = (evolve); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/filter.js" +/***/ "./node_modules/ramda/es/filter.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/filter.js ***! \*****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -49693,13 +49877,13 @@ var filter = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["d })); /* harmony default export */ __webpack_exports__["default"] = (filter); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/find.js" +/***/ "./node_modules/ramda/es/find.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/find.js ***! \***************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -49746,13 +49930,13 @@ var find = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["def })); /* harmony default export */ __webpack_exports__["default"] = (find); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/findIndex.js" +/***/ "./node_modules/ramda/es/findIndex.js": /*!********************************************!*\ !*** ./node_modules/ramda/es/findIndex.js ***! \********************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -49798,13 +49982,13 @@ var findIndex = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ })); /* harmony default export */ __webpack_exports__["default"] = (findIndex); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/flatten.js" +/***/ "./node_modules/ramda/es/flatten.js": /*!******************************************!*\ !*** ./node_modules/ramda/es/flatten.js ***! \******************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -49833,13 +50017,13 @@ __webpack_require__.r(__webpack_exports__); var flatten = /*#__PURE__*/(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(/*#__PURE__*/(0,_internal_makeFlat_js__WEBPACK_IMPORTED_MODULE_1__["default"])(true)); /* harmony default export */ __webpack_exports__["default"] = (flatten); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/forEach.js" +/***/ "./node_modules/ramda/es/forEach.js": /*!******************************************!*\ !*** ./node_modules/ramda/es/forEach.js ***! \******************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -49893,13 +50077,13 @@ var forEach = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__[" })); /* harmony default export */ __webpack_exports__["default"] = (forEach); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/forEachObjIndexed.js" +/***/ "./node_modules/ramda/es/forEachObjIndexed.js": /*!****************************************************!*\ !*** ./node_modules/ramda/es/forEachObjIndexed.js ***! \****************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -49942,13 +50126,13 @@ var forEachObjIndexed = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MO }); /* harmony default export */ __webpack_exports__["default"] = (forEachObjIndexed); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/groupBy.js" +/***/ "./node_modules/ramda/es/groupBy.js": /*!******************************************!*\ !*** ./node_modules/ramda/es/groupBy.js ***! \******************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -50006,13 +50190,13 @@ var groupBy = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__[" }, []))); /* harmony default export */ __webpack_exports__["default"] = (groupBy); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/has.js" +/***/ "./node_modules/ramda/es/has.js": /*!**************************************!*\ !*** ./node_modules/ramda/es/has.js ***! \**************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -50050,13 +50234,13 @@ var has = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["defa }); /* harmony default export */ __webpack_exports__["default"] = (has); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/hasPath.js" +/***/ "./node_modules/ramda/es/hasPath.js": /*!******************************************!*\ !*** ./node_modules/ramda/es/hasPath.js ***! \******************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -50106,13 +50290,13 @@ var hasPath = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__[" }); /* harmony default export */ __webpack_exports__["default"] = (hasPath); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/identity.js" +/***/ "./node_modules/ramda/es/identity.js": /*!*******************************************!*\ !*** ./node_modules/ramda/es/identity.js ***! \*******************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -50143,13 +50327,13 @@ __webpack_require__.r(__webpack_exports__); var identity = /*#__PURE__*/(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_internal_identity_js__WEBPACK_IMPORTED_MODULE_1__["default"]); /* harmony default export */ __webpack_exports__["default"] = (identity); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/includes.js" +/***/ "./node_modules/ramda/es/includes.js": /*!*******************************************!*\ !*** ./node_modules/ramda/es/includes.js ***! \*******************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -50183,13 +50367,13 @@ __webpack_require__.r(__webpack_exports__); var includes = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_internal_includes_js__WEBPACK_IMPORTED_MODULE_0__["default"]); /* harmony default export */ __webpack_exports__["default"] = (includes); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/indexOf.js" +/***/ "./node_modules/ramda/es/indexOf.js": /*!******************************************!*\ !*** ./node_modules/ramda/es/indexOf.js ***! \******************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -50224,13 +50408,13 @@ var indexOf = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__[" }); /* harmony default export */ __webpack_exports__["default"] = (indexOf); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/insert.js" +/***/ "./node_modules/ramda/es/insert.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/insert.js ***! \*****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -50264,17 +50448,18 @@ var insert = /*#__PURE__*/(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["d }); /* harmony default export */ __webpack_exports__["default"] = (insert); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_Set.js" +/***/ "./node_modules/ramda/es/internal/_Set.js": /*!************************************************!*\ !*** ./node_modules/ramda/es/internal/_Set.js ***! \************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_includes.js */ "./node_modules/ramda/es/internal/_includes.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } var _Set = /*#__PURE__*/function () { function _Set() { @@ -50311,7 +50496,7 @@ var _Set = /*#__PURE__*/function () { return _Set; }(); function hasOrAdd(item, shouldAdd, set) { - var type = typeof item; + var type = _typeof(item); var prevSize, newSize; switch (type) { case 'string': @@ -50442,18 +50627,18 @@ function hasOrAdd(item, shouldAdd, set) { // A simple Set type that honours R.equals semantics /* harmony default export */ __webpack_exports__["default"] = (_Set); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_arity.js" +/***/ "./node_modules/ramda/es/internal/_arity.js": /*!**************************************************!*\ !*** ./node_modules/ramda/es/internal/_arity.js ***! \**************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _arity) +/* harmony export */ "default": function() { return /* binding */ _arity; } /* harmony export */ }); function _arity(n, fn) { /* eslint-disable no-unused-vars */ @@ -50507,18 +50692,18 @@ function _arity(n, fn) { } } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_arrayFromIterator.js" +/***/ "./node_modules/ramda/es/internal/_arrayFromIterator.js": /*!**************************************************************!*\ !*** ./node_modules/ramda/es/internal/_arrayFromIterator.js ***! \**************************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _arrayFromIterator) +/* harmony export */ "default": function() { return /* binding */ _arrayFromIterator; } /* harmony export */ }); function _arrayFromIterator(iter) { var list = []; @@ -50529,18 +50714,18 @@ function _arrayFromIterator(iter) { return list; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_arrayReduce.js" +/***/ "./node_modules/ramda/es/internal/_arrayReduce.js": /*!********************************************************!*\ !*** ./node_modules/ramda/es/internal/_arrayReduce.js ***! \********************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _arrayReduce) +/* harmony export */ "default": function() { return /* binding */ _arrayReduce; } /* harmony export */ }); function _arrayReduce(reducer, acc, list) { var index = 0; @@ -50552,18 +50737,18 @@ function _arrayReduce(reducer, acc, list) { return acc; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_assoc.js" +/***/ "./node_modules/ramda/es/internal/_assoc.js": /*!**************************************************!*\ !*** ./node_modules/ramda/es/internal/_assoc.js ***! \**************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _assoc) +/* harmony export */ "default": function() { return /* binding */ _assoc; } /* harmony export */ }); /* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); /* harmony import */ var _isInteger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isInteger.js */ "./node_modules/ramda/es/internal/_isInteger.js"); @@ -50596,18 +50781,18 @@ function _assoc(prop, val, obj) { return result; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_checkForMethod.js" +/***/ "./node_modules/ramda/es/internal/_checkForMethod.js": /*!***********************************************************!*\ !*** ./node_modules/ramda/es/internal/_checkForMethod.js ***! \***********************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _checkForMethod) +/* harmony export */ "default": function() { return /* binding */ _checkForMethod; } /* harmony export */ }); /* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); @@ -50633,21 +50818,22 @@ function _checkForMethod(methodname, fn) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_clone.js" +/***/ "./node_modules/ramda/es/internal/_clone.js": /*!**************************************************!*\ !*** ./node_modules/ramda/es/internal/_clone.js ***! \**************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _clone) +/* harmony export */ "default": function() { return /* binding */ _clone; } /* harmony export */ }); /* harmony import */ var _cloneRegExp_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_cloneRegExp.js */ "./node_modules/ramda/es/internal/_cloneRegExp.js"); /* harmony import */ var _type_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../type.js */ "./node_modules/ramda/es/type.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } @@ -50706,7 +50892,7 @@ function _clone(value, deep, map) { } } function _isPrimitive(param) { - var type = typeof param; + var type = _typeof(param); return param == null || type != 'object' && type != 'function'; } var _ObjectMap = /*#__PURE__*/function () { @@ -50762,35 +50948,35 @@ var _ObjectMap = /*#__PURE__*/function () { return _ObjectMap; }(); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_cloneRegExp.js" +/***/ "./node_modules/ramda/es/internal/_cloneRegExp.js": /*!********************************************************!*\ !*** ./node_modules/ramda/es/internal/_cloneRegExp.js ***! \********************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _cloneRegExp) +/* harmony export */ "default": function() { return /* binding */ _cloneRegExp; } /* harmony export */ }); function _cloneRegExp(pattern) { return new RegExp(pattern.source, pattern.flags ? pattern.flags : (pattern.global ? 'g' : '') + (pattern.ignoreCase ? 'i' : '') + (pattern.multiline ? 'm' : '') + (pattern.sticky ? 'y' : '') + (pattern.unicode ? 'u' : '') + (pattern.dotAll ? 's' : '')); } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_complement.js" +/***/ "./node_modules/ramda/es/internal/_complement.js": /*!*******************************************************!*\ !*** ./node_modules/ramda/es/internal/_complement.js ***! \*******************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _complement) +/* harmony export */ "default": function() { return /* binding */ _complement; } /* harmony export */ }); function _complement(f) { return function () { @@ -50798,18 +50984,18 @@ function _complement(f) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_concat.js" +/***/ "./node_modules/ramda/es/internal/_concat.js": /*!***************************************************!*\ !*** ./node_modules/ramda/es/internal/_concat.js ***! \***************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _concat) +/* harmony export */ "default": function() { return /* binding */ _concat; } /* harmony export */ }); /** * Private `concat` function to merge two array-like objects. @@ -50842,18 +51028,18 @@ function _concat(set1, set2) { return result; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_createReduce.js" +/***/ "./node_modules/ramda/es/internal/_createReduce.js": /*!*********************************************************!*\ !*** ./node_modules/ramda/es/internal/_createReduce.js ***! \*********************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _createReduce) +/* harmony export */ "default": function() { return /* binding */ _createReduce; } /* harmony export */ }); /* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArrayLike.js */ "./node_modules/ramda/es/internal/_isArrayLike.js"); @@ -50882,18 +51068,18 @@ function _createReduce(arrayReduce, methodReduce, iterableReduce) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_curry1.js" +/***/ "./node_modules/ramda/es/internal/_curry1.js": /*!***************************************************!*\ !*** ./node_modules/ramda/es/internal/_curry1.js ***! \***************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _curry1) +/* harmony export */ "default": function() { return /* binding */ _curry1; } /* harmony export */ }); /* harmony import */ var _isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isPlaceholder.js */ "./node_modules/ramda/es/internal/_isPlaceholder.js"); @@ -50916,18 +51102,18 @@ function _curry1(fn) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_curry2.js" +/***/ "./node_modules/ramda/es/internal/_curry2.js": /*!***************************************************!*\ !*** ./node_modules/ramda/es/internal/_curry2.js ***! \***************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _curry2) +/* harmony export */ "default": function() { return /* binding */ _curry2; } /* harmony export */ }); /* harmony import */ var _curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); /* harmony import */ var _isPlaceholder_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isPlaceholder.js */ "./node_modules/ramda/es/internal/_isPlaceholder.js"); @@ -50961,18 +51147,18 @@ function _curry2(fn) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_curry3.js" +/***/ "./node_modules/ramda/es/internal/_curry3.js": /*!***************************************************!*\ !*** ./node_modules/ramda/es/internal/_curry3.js ***! \***************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _curry3) +/* harmony export */ "default": function() { return /* binding */ _curry3; } /* harmony export */ }); /* harmony import */ var _curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); /* harmony import */ var _curry2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); @@ -51024,18 +51210,18 @@ function _curry3(fn) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_curryN.js" +/***/ "./node_modules/ramda/es/internal/_curryN.js": /*!***************************************************!*\ !*** ./node_modules/ramda/es/internal/_curryN.js ***! \***************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _curryN) +/* harmony export */ "default": function() { return /* binding */ _curryN; } /* harmony export */ }); /* harmony import */ var _arity_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arity.js */ "./node_modules/ramda/es/internal/_arity.js"); /* harmony import */ var _isPlaceholder_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isPlaceholder.js */ "./node_modules/ramda/es/internal/_isPlaceholder.js"); @@ -51079,18 +51265,18 @@ function _curryN(length, received, fn) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_dispatchable.js" +/***/ "./node_modules/ramda/es/internal/_dispatchable.js": /*!*********************************************************!*\ !*** ./node_modules/ramda/es/internal/_dispatchable.js ***! \*********************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _dispatchable) +/* harmony export */ "default": function() { return /* binding */ _dispatchable; } /* harmony export */ }); /* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); /* harmony import */ var _isTransformer_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isTransformer.js */ "./node_modules/ramda/es/internal/_isTransformer.js"); @@ -51135,18 +51321,18 @@ function _dispatchable(methodNames, transducerCreator, fn) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_dissoc.js" +/***/ "./node_modules/ramda/es/internal/_dissoc.js": /*!***************************************************!*\ !*** ./node_modules/ramda/es/internal/_dissoc.js ***! \***************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _dissoc) +/* harmony export */ "default": function() { return /* binding */ _dissoc; } /* harmony export */ }); /* harmony import */ var _isInteger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isInteger.js */ "./node_modules/ramda/es/internal/_isInteger.js"); /* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); @@ -51178,18 +51364,18 @@ function _dissoc(prop, obj) { return result; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_equals.js" +/***/ "./node_modules/ramda/es/internal/_equals.js": /*!***************************************************!*\ !*** ./node_modules/ramda/es/internal/_equals.js ***! \***************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _equals) +/* harmony export */ "default": function() { return /* binding */ _equals; } /* harmony export */ }); /* harmony import */ var _arrayFromIterator_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayFromIterator.js */ "./node_modules/ramda/es/internal/_arrayFromIterator.js"); /* harmony import */ var _includesWith_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_includesWith.js */ "./node_modules/ramda/es/internal/_includesWith.js"); @@ -51198,6 +51384,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _objectIs_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_objectIs.js */ "./node_modules/ramda/es/internal/_objectIs.js"); /* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../keys.js */ "./node_modules/ramda/es/keys.js"); /* harmony import */ var _type_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../type.js */ "./node_modules/ramda/es/type.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } @@ -51254,7 +51441,7 @@ function _equals(a, b, stackA, stackB) { case 'Boolean': case 'Number': case 'String': - if (!(typeof a === typeof b && (0,_objectIs_js__WEBPACK_IMPORTED_MODULE_4__["default"])(a.valueOf(), b.valueOf()))) { + if (!(_typeof(a) === _typeof(b) && (0,_objectIs_js__WEBPACK_IMPORTED_MODULE_4__["default"])(a.valueOf(), b.valueOf()))) { return false; } break; @@ -51330,18 +51517,18 @@ function _equals(a, b, stackA, stackB) { return true; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_filter.js" +/***/ "./node_modules/ramda/es/internal/_filter.js": /*!***************************************************!*\ !*** ./node_modules/ramda/es/internal/_filter.js ***! \***************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _filter) +/* harmony export */ "default": function() { return /* binding */ _filter; } /* harmony export */ }); function _filter(fn, list) { var idx = 0; @@ -51356,18 +51543,18 @@ function _filter(fn, list) { return result; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_functionName.js" +/***/ "./node_modules/ramda/es/internal/_functionName.js": /*!*********************************************************!*\ !*** ./node_modules/ramda/es/internal/_functionName.js ***! \*********************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _functionName) +/* harmony export */ "default": function() { return /* binding */ _functionName; } /* harmony export */ }); function _functionName(f) { // String(x => x) evaluates to "x => x", so the pattern may not match. @@ -51375,52 +51562,52 @@ function _functionName(f) { return match == null ? '' : match[1]; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_has.js" +/***/ "./node_modules/ramda/es/internal/_has.js": /*!************************************************!*\ !*** ./node_modules/ramda/es/internal/_has.js ***! \************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _has) +/* harmony export */ "default": function() { return /* binding */ _has; } /* harmony export */ }); function _has(prop, obj) { return Object.prototype.hasOwnProperty.call(obj, prop); } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_identity.js" +/***/ "./node_modules/ramda/es/internal/_identity.js": /*!*****************************************************!*\ !*** ./node_modules/ramda/es/internal/_identity.js ***! \*****************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _identity) +/* harmony export */ "default": function() { return /* binding */ _identity; } /* harmony export */ }); function _identity(x) { return x; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_includes.js" +/***/ "./node_modules/ramda/es/internal/_includes.js": /*!*****************************************************!*\ !*** ./node_modules/ramda/es/internal/_includes.js ***! \*****************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _includes) +/* harmony export */ "default": function() { return /* binding */ _includes; } /* harmony export */ }); /* harmony import */ var _indexOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_indexOf.js */ "./node_modules/ramda/es/internal/_indexOf.js"); @@ -51428,18 +51615,18 @@ function _includes(a, list) { return (0,_indexOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(list, a, 0) >= 0; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_includesWith.js" +/***/ "./node_modules/ramda/es/internal/_includesWith.js": /*!*********************************************************!*\ !*** ./node_modules/ramda/es/internal/_includesWith.js ***! \*********************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _includesWith) +/* harmony export */ "default": function() { return /* binding */ _includesWith; } /* harmony export */ }); function _includesWith(pred, x, list) { var idx = 0; @@ -51453,26 +51640,27 @@ function _includesWith(pred, x, list) { return false; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_indexOf.js" +/***/ "./node_modules/ramda/es/internal/_indexOf.js": /*!****************************************************!*\ !*** ./node_modules/ramda/es/internal/_indexOf.js ***! \****************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _indexOf) +/* harmony export */ "default": function() { return /* binding */ _indexOf; } /* harmony export */ }); /* harmony import */ var _equals_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../equals.js */ "./node_modules/ramda/es/equals.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _indexOf(list, a, idx) { var inf, item; // Array.prototype.indexOf doesn't exist below IE9 if (typeof list.indexOf === 'function') { - switch (typeof a) { + switch (_typeof(a)) { case 'number': if (a === 0) { // manually crawl the list to distinguish between +0 and -0 @@ -51522,13 +51710,13 @@ function _indexOf(list, a, idx) { return -1; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_isArguments.js" +/***/ "./node_modules/ramda/es/internal/_isArguments.js": /*!********************************************************!*\ !*** ./node_modules/ramda/es/internal/_isArguments.js ***! \********************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -51544,13 +51732,13 @@ var _isArguments = /*#__PURE__*/function () { }(); /* harmony default export */ __webpack_exports__["default"] = (_isArguments); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_isArray.js" +/***/ "./node_modules/ramda/es/internal/_isArray.js": /*!****************************************************!*\ !*** ./node_modules/ramda/es/internal/_isArray.js ***! \****************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -51570,19 +51758,20 @@ __webpack_require__.r(__webpack_exports__); return val != null && val.length >= 0 && Object.prototype.toString.call(val) === '[object Array]'; }); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_isArrayLike.js" +/***/ "./node_modules/ramda/es/internal/_isArrayLike.js": /*!********************************************************!*\ !*** ./node_modules/ramda/es/internal/_isArrayLike.js ***! \********************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _curry1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_curry1.js */ "./node_modules/ramda/es/internal/_curry1.js"); /* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isArray.js */ "./node_modules/ramda/es/internal/_isArray.js"); /* harmony import */ var _isString_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_isString.js */ "./node_modules/ramda/es/internal/_isString.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } @@ -51612,7 +51801,7 @@ var _isArrayLike = /*#__PURE__*/(0,_curry1_js__WEBPACK_IMPORTED_MODULE_0__["defa if (!x) { return false; } - if (typeof x !== 'object') { + if (_typeof(x) !== 'object') { return false; } if ((0,_isString_js__WEBPACK_IMPORTED_MODULE_2__["default"])(x)) { @@ -51628,31 +51817,31 @@ var _isArrayLike = /*#__PURE__*/(0,_curry1_js__WEBPACK_IMPORTED_MODULE_0__["defa }); /* harmony default export */ __webpack_exports__["default"] = (_isArrayLike); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_isFunction.js" +/***/ "./node_modules/ramda/es/internal/_isFunction.js": /*!*******************************************************!*\ !*** ./node_modules/ramda/es/internal/_isFunction.js ***! \*******************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _isFunction) +/* harmony export */ "default": function() { return /* binding */ _isFunction; } /* harmony export */ }); function _isFunction(x) { var type = Object.prototype.toString.call(x); return type === '[object Function]' || type === '[object AsyncFunction]' || type === '[object GeneratorFunction]' || type === '[object AsyncGeneratorFunction]'; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_isInteger.js" +/***/ "./node_modules/ramda/es/internal/_isInteger.js": /*!******************************************************!*\ !*** ./node_modules/ramda/es/internal/_isInteger.js ***! \******************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -51668,86 +51857,87 @@ __webpack_require__.r(__webpack_exports__); return n << 0 === n; }); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_isObject.js" +/***/ "./node_modules/ramda/es/internal/_isObject.js": /*!*****************************************************!*\ !*** ./node_modules/ramda/es/internal/_isObject.js ***! \*****************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _isObject) +/* harmony export */ "default": function() { return /* binding */ _isObject; } /* harmony export */ }); function _isObject(x) { return Object.prototype.toString.call(x) === '[object Object]'; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_isPlaceholder.js" +/***/ "./node_modules/ramda/es/internal/_isPlaceholder.js": /*!**********************************************************!*\ !*** ./node_modules/ramda/es/internal/_isPlaceholder.js ***! \**********************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _isPlaceholder) +/* harmony export */ "default": function() { return /* binding */ _isPlaceholder; } /* harmony export */ }); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _isPlaceholder(a) { - return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true; + return a != null && _typeof(a) === 'object' && a['@@functional/placeholder'] === true; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_isString.js" +/***/ "./node_modules/ramda/es/internal/_isString.js": /*!*****************************************************!*\ !*** ./node_modules/ramda/es/internal/_isString.js ***! \*****************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _isString) +/* harmony export */ "default": function() { return /* binding */ _isString; } /* harmony export */ }); function _isString(x) { return Object.prototype.toString.call(x) === '[object String]'; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_isTransformer.js" +/***/ "./node_modules/ramda/es/internal/_isTransformer.js": /*!**********************************************************!*\ !*** ./node_modules/ramda/es/internal/_isTransformer.js ***! \**********************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _isTransformer) +/* harmony export */ "default": function() { return /* binding */ _isTransformer; } /* harmony export */ }); function _isTransformer(obj) { return obj != null && typeof obj['@@transducer/step'] === 'function'; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_isTypedArray.js" +/***/ "./node_modules/ramda/es/internal/_isTypedArray.js": /*!*********************************************************!*\ !*** ./node_modules/ramda/es/internal/_isTypedArray.js ***! \*********************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _isTypedArray) +/* harmony export */ "default": function() { return /* binding */ _isTypedArray; } /* harmony export */ }); /** * Tests whether or not an object is a typed array. @@ -51768,18 +51958,18 @@ function _isTypedArray(val) { return type === '[object Uint8ClampedArray]' || type === '[object Int8Array]' || type === '[object Uint8Array]' || type === '[object Int16Array]' || type === '[object Uint16Array]' || type === '[object Int32Array]' || type === '[object Uint32Array]' || type === '[object Float32Array]' || type === '[object Float64Array]' || type === '[object BigInt64Array]' || type === '[object BigUint64Array]'; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_makeFlat.js" +/***/ "./node_modules/ramda/es/internal/_makeFlat.js": /*!*****************************************************!*\ !*** ./node_modules/ramda/es/internal/_makeFlat.js ***! \*****************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _makeFlat) +/* harmony export */ "default": function() { return /* binding */ _makeFlat; } /* harmony export */ }); /* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isArrayLike.js */ "./node_modules/ramda/es/internal/_isArrayLike.js"); @@ -51814,18 +52004,18 @@ function _makeFlat(recursive) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_map.js" +/***/ "./node_modules/ramda/es/internal/_map.js": /*!************************************************!*\ !*** ./node_modules/ramda/es/internal/_map.js ***! \************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _map) +/* harmony export */ "default": function() { return /* binding */ _map; } /* harmony export */ }); function _map(fn, functor) { var idx = 0; @@ -51838,18 +52028,18 @@ function _map(fn, functor) { return result; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_nth.js" +/***/ "./node_modules/ramda/es/internal/_nth.js": /*!************************************************!*\ !*** ./node_modules/ramda/es/internal/_nth.js ***! \************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _nth) +/* harmony export */ "default": function() { return /* binding */ _nth; } /* harmony export */ }); /* harmony import */ var _isString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isString.js */ "./node_modules/ramda/es/internal/_isString.js"); @@ -51858,13 +52048,13 @@ function _nth(offset, list) { return (0,_isString_js__WEBPACK_IMPORTED_MODULE_0__["default"])(list) ? list.charAt(idx) : list[idx]; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_objectAssign.js" +/***/ "./node_modules/ramda/es/internal/_objectAssign.js": /*!*********************************************************!*\ !*** ./node_modules/ramda/es/internal/_objectAssign.js ***! \*********************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -51894,13 +52084,13 @@ function _objectAssign(target) { } /* harmony default export */ __webpack_exports__["default"] = (typeof Object.assign === 'function' ? Object.assign : _objectAssign); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_objectIs.js" +/***/ "./node_modules/ramda/es/internal/_objectIs.js": /*!*****************************************************!*\ !*** ./node_modules/ramda/es/internal/_objectIs.js ***! \*****************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -51918,18 +52108,18 @@ function _objectIs(a, b) { } /* harmony default export */ __webpack_exports__["default"] = (typeof Object.is === 'function' ? Object.is : _objectIs); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_path.js" +/***/ "./node_modules/ramda/es/internal/_path.js": /*!*************************************************!*\ !*** ./node_modules/ramda/es/internal/_path.js ***! \*************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _path) +/* harmony export */ "default": function() { return /* binding */ _path; } /* harmony export */ }); /* harmony import */ var _isInteger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isInteger.js */ "./node_modules/ramda/es/internal/_isInteger.js"); /* harmony import */ var _nth_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_nth.js */ "./node_modules/ramda/es/internal/_nth.js"); @@ -51951,18 +52141,18 @@ function _path(pathAr, obj) { return val; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_quote.js" +/***/ "./node_modules/ramda/es/internal/_quote.js": /*!**************************************************!*\ !*** ./node_modules/ramda/es/internal/_quote.js ***! \**************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _quote) +/* harmony export */ "default": function() { return /* binding */ _quote; } /* harmony export */ }); function _quote(s) { var escaped = s.replace(/\\/g, '\\\\').replace(/[\b]/g, '\\b') // \b matches word boundary; [\b] matches backspace @@ -51970,13 +52160,13 @@ function _quote(s) { return '"' + escaped.replace(/"/g, '\\"') + '"'; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_reduce.js" +/***/ "./node_modules/ramda/es/internal/_reduce.js": /*!***************************************************!*\ !*** ./node_modules/ramda/es/internal/_reduce.js ***! \***************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -51998,18 +52188,18 @@ function _methodReduce(reducer, acc, obj, methodName) { var _reduce = /*#__PURE__*/(0,_createReduce_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_arrayReduce_js__WEBPACK_IMPORTED_MODULE_0__["default"], _methodReduce, _iterableReduce); /* harmony default export */ __webpack_exports__["default"] = (_reduce); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_reduced.js" +/***/ "./node_modules/ramda/es/internal/_reduced.js": /*!****************************************************!*\ !*** ./node_modules/ramda/es/internal/_reduced.js ***! \****************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _reduced) +/* harmony export */ "default": function() { return /* binding */ _reduced; } /* harmony export */ }); function _reduced(x) { return x && x['@@transducer/reduced'] ? x : { @@ -52018,13 +52208,13 @@ function _reduced(x) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_toISOString.js" +/***/ "./node_modules/ramda/es/internal/_toISOString.js": /*!********************************************************!*\ !*** ./node_modules/ramda/es/internal/_toISOString.js ***! \********************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -52041,18 +52231,18 @@ var _toISOString = typeof Date.prototype.toISOString === 'function' ? function _ }; /* harmony default export */ __webpack_exports__["default"] = (_toISOString); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_toString.js" +/***/ "./node_modules/ramda/es/internal/_toString.js": /*!*****************************************************!*\ !*** ./node_modules/ramda/es/internal/_toString.js ***! \*****************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _toString) +/* harmony export */ "default": function() { return /* binding */ _toString; } /* harmony export */ }); /* harmony import */ var _includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_includes.js */ "./node_modules/ramda/es/internal/_includes.js"); /* harmony import */ var _map_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_map.js */ "./node_modules/ramda/es/internal/_map.js"); @@ -52060,6 +52250,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _toISOString_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_toISOString.js */ "./node_modules/ramda/es/internal/_toISOString.js"); /* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../keys.js */ "./node_modules/ramda/es/keys.js"); /* harmony import */ var _reject_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../reject.js */ "./node_modules/ramda/es/reject.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } @@ -52086,7 +52277,7 @@ function _toString(x, seen) { return /^\d+$/.test(k); }, (0,_keys_js__WEBPACK_IMPORTED_MODULE_4__["default"])(x)))).join(', ') + ']'; case '[object Boolean]': - return typeof x === 'object' ? 'new Boolean(' + recur(x.valueOf()) + ')' : x.toString(); + return _typeof(x) === 'object' ? 'new Boolean(' + recur(x.valueOf()) + ')' : x.toString(); case '[object Date]': return 'new Date(' + (isNaN(x.valueOf()) ? recur(NaN) : (0,_quote_js__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_toISOString_js__WEBPACK_IMPORTED_MODULE_3__["default"])(x))) + ')'; case '[object Map]': @@ -52094,11 +52285,11 @@ function _toString(x, seen) { case '[object Null]': return 'null'; case '[object Number]': - return typeof x === 'object' ? 'new Number(' + recur(x.valueOf()) + ')' : 1 / x === -Infinity ? '-0' : x.toString(10); + return _typeof(x) === 'object' ? 'new Number(' + recur(x.valueOf()) + ')' : 1 / x === -Infinity ? '-0' : x.toString(10); case '[object Set]': return 'new Set(' + recur(Array.from(x).sort()) + ')'; case '[object String]': - return typeof x === 'object' ? 'new String(' + recur(x.valueOf()) + ')' : (0,_quote_js__WEBPACK_IMPORTED_MODULE_2__["default"])(x); + return _typeof(x) === 'object' ? 'new String(' + recur(x.valueOf()) + ')' : (0,_quote_js__WEBPACK_IMPORTED_MODULE_2__["default"])(x); case '[object Undefined]': return 'undefined'; default: @@ -52112,18 +52303,18 @@ function _toString(x, seen) { } } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_xArrayReduce.js" +/***/ "./node_modules/ramda/es/internal/_xArrayReduce.js": /*!*********************************************************!*\ !*** ./node_modules/ramda/es/internal/_xArrayReduce.js ***! \*********************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _xArrayReduce) +/* harmony export */ "default": function() { return /* binding */ _xArrayReduce; } /* harmony export */ }); function _xArrayReduce(xf, acc, list) { var idx = 0; @@ -52139,13 +52330,13 @@ function _xArrayReduce(xf, acc, list) { return xf['@@transducer/result'](acc); } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_xReduce.js" +/***/ "./node_modules/ramda/es/internal/_xReduce.js": /*!****************************************************!*\ !*** ./node_modules/ramda/es/internal/_xReduce.js ***! \****************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -52173,18 +52364,18 @@ function _xMethodReduce(xf, acc, obj, methodName) { var _xReduce = /*#__PURE__*/(0,_createReduce_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_xArrayReduce_js__WEBPACK_IMPORTED_MODULE_1__["default"], _xMethodReduce, _xIterableReduce); /* harmony default export */ __webpack_exports__["default"] = (_xReduce); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_xall.js" +/***/ "./node_modules/ramda/es/internal/_xall.js": /*!*************************************************!*\ !*** ./node_modules/ramda/es/internal/_xall.js ***! \*************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _xall) +/* harmony export */ "default": function() { return /* binding */ _xall; } /* harmony export */ }); /* harmony import */ var _reduced_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); /* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); @@ -52218,18 +52409,18 @@ function _xall(f) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_xany.js" +/***/ "./node_modules/ramda/es/internal/_xany.js": /*!*************************************************!*\ !*** ./node_modules/ramda/es/internal/_xany.js ***! \*************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _xany) +/* harmony export */ "default": function() { return /* binding */ _xany; } /* harmony export */ }); /* harmony import */ var _reduced_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); /* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); @@ -52263,13 +52454,13 @@ function _xany(f) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_xfBase.js" +/***/ "./node_modules/ramda/es/internal/_xfBase.js": /*!***************************************************!*\ !*** ./node_modules/ramda/es/internal/_xfBase.js ***! \***************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -52282,18 +52473,18 @@ __webpack_require__.r(__webpack_exports__); } }); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_xfilter.js" +/***/ "./node_modules/ramda/es/internal/_xfilter.js": /*!****************************************************!*\ !*** ./node_modules/ramda/es/internal/_xfilter.js ***! \****************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _xfilter) +/* harmony export */ "default": function() { return /* binding */ _xfilter; } /* harmony export */ }); /* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); @@ -52315,18 +52506,18 @@ function _xfilter(f) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_xfind.js" +/***/ "./node_modules/ramda/es/internal/_xfind.js": /*!**************************************************!*\ !*** ./node_modules/ramda/es/internal/_xfind.js ***! \**************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _xfind) +/* harmony export */ "default": function() { return /* binding */ _xfind; } /* harmony export */ }); /* harmony import */ var _reduced_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); /* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); @@ -52360,18 +52551,18 @@ function _xfind(f) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_xfindIndex.js" +/***/ "./node_modules/ramda/es/internal/_xfindIndex.js": /*!*******************************************************!*\ !*** ./node_modules/ramda/es/internal/_xfindIndex.js ***! \*******************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _xfindIndex) +/* harmony export */ "default": function() { return /* binding */ _xfindIndex; } /* harmony export */ }); /* harmony import */ var _reduced_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); /* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); @@ -52407,13 +52598,13 @@ function _xfindIndex(f) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_xmap.js" +/***/ "./node_modules/ramda/es/internal/_xmap.js": /*!*************************************************!*\ !*** ./node_modules/ramda/es/internal/_xmap.js ***! \*************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -52438,18 +52629,18 @@ var _xmap = function _xmap(f) { }; /* harmony default export */ __webpack_exports__["default"] = (_xmap); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_xreduceBy.js" +/***/ "./node_modules/ramda/es/internal/_xreduceBy.js": /*!******************************************************!*\ !*** ./node_modules/ramda/es/internal/_xreduceBy.js ***! \******************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _xreduceBy) +/* harmony export */ "default": function() { return /* binding */ _xreduceBy; } /* harmony export */ }); /* harmony import */ var _clone_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_clone.js */ "./node_modules/ramda/es/internal/_clone.js"); /* harmony import */ var _has_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_has.js */ "./node_modules/ramda/es/internal/_has.js"); @@ -52494,18 +52685,18 @@ function _xreduceBy(valueFn, valueAcc, keyFn) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_xtake.js" +/***/ "./node_modules/ramda/es/internal/_xtake.js": /*!**************************************************!*\ !*** ./node_modules/ramda/es/internal/_xtake.js ***! \**************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _xtake) +/* harmony export */ "default": function() { return /* binding */ _xtake; } /* harmony export */ }); /* harmony import */ var _reduced_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_reduced.js */ "./node_modules/ramda/es/internal/_reduced.js"); /* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); @@ -52532,18 +52723,18 @@ function _xtake(n) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_xuniqBy.js" +/***/ "./node_modules/ramda/es/internal/_xuniqBy.js": /*!****************************************************!*\ !*** ./node_modules/ramda/es/internal/_xuniqBy.js ***! \****************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _xuniqBy) +/* harmony export */ "default": function() { return /* binding */ _xuniqBy; } /* harmony export */ }); /* harmony import */ var _Set_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_Set.js */ "./node_modules/ramda/es/internal/_Set.js"); /* harmony import */ var _xfBase_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_xfBase.js */ "./node_modules/ramda/es/internal/_xfBase.js"); @@ -52568,18 +52759,18 @@ function _xuniqBy(f) { }; } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/internal/_xwrap.js" +/***/ "./node_modules/ramda/es/internal/_xwrap.js": /*!**************************************************!*\ !*** ./node_modules/ramda/es/internal/_xwrap.js ***! \**************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ _xwrap) +/* harmony export */ "default": function() { return /* binding */ _xwrap; } /* harmony export */ }); var XWrap = /*#__PURE__*/function () { function XWrap(fn) { @@ -52600,13 +52791,13 @@ function _xwrap(fn) { return new XWrap(fn); } -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/intersection.js" +/***/ "./node_modules/ramda/es/intersection.js": /*!***********************************************!*\ !*** ./node_modules/ramda/es/intersection.js ***! \***********************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -52645,13 +52836,13 @@ var intersection = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_ }); /* harmony default export */ __webpack_exports__["default"] = (intersection); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/invoker.js" +/***/ "./node_modules/ramda/es/invoker.js": /*!******************************************!*\ !*** ./node_modules/ramda/es/invoker.js ***! \******************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -52717,17 +52908,18 @@ var invoker = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__[" }); /* harmony default export */ __webpack_exports__["default"] = (invoker); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/is.js" +/***/ "./node_modules/ramda/es/is.js": /*!*************************************!*\ !*** ./node_modules/ramda/es/is.js ***! \*************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } /** @@ -52755,17 +52947,17 @@ __webpack_require__.r(__webpack_exports__); * R.is(Number, {}); //=> false */ var is = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function is(Ctor, val) { - return val instanceof Ctor || val != null && (val.constructor === Ctor || Ctor.name === 'Object' && typeof val === 'object'); + return val instanceof Ctor || val != null && (val.constructor === Ctor || Ctor.name === 'Object' && _typeof(val) === 'object'); }); /* harmony default export */ __webpack_exports__["default"] = (is); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/isEmpty.js" +/***/ "./node_modules/ramda/es/isEmpty.js": /*!******************************************!*\ !*** ./node_modules/ramda/es/isEmpty.js ***! \******************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -52803,13 +52995,13 @@ var isEmpty = /*#__PURE__*/(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__[" }); /* harmony default export */ __webpack_exports__["default"] = (isEmpty); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/isNil.js" +/***/ "./node_modules/ramda/es/isNil.js": /*!****************************************!*\ !*** ./node_modules/ramda/es/isNil.js ***! \****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -52838,13 +53030,13 @@ var isNil = /*#__PURE__*/(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["de }); /* harmony default export */ __webpack_exports__["default"] = (isNil); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/join.js" +/***/ "./node_modules/ramda/es/join.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/join.js ***! \***************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -52873,13 +53065,13 @@ __webpack_require__.r(__webpack_exports__); var join = /*#__PURE__*/(0,_invoker_js__WEBPACK_IMPORTED_MODULE_0__["default"])(1, 'join'); /* harmony default export */ __webpack_exports__["default"] = (join); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/juxt.js" +/***/ "./node_modules/ramda/es/juxt.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/juxt.js ***! \***************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -52912,13 +53104,13 @@ var juxt = /*#__PURE__*/(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["def }); /* harmony default export */ __webpack_exports__["default"] = (juxt); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/keys.js" +/***/ "./node_modules/ramda/es/keys.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/keys.js ***! \***************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -52997,13 +53189,13 @@ var keys = typeof Object.keys === 'function' && !hasArgsEnumBug ? /*#__PURE__*/( }); /* harmony default export */ __webpack_exports__["default"] = (keys); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/lens.js" +/***/ "./node_modules/ramda/es/lens.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/lens.js ***! \***************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53046,13 +53238,13 @@ var lens = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["def }); /* harmony default export */ __webpack_exports__["default"] = (lens); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/lensPath.js" +/***/ "./node_modules/ramda/es/lensPath.js": /*!*******************************************!*\ !*** ./node_modules/ramda/es/lensPath.js ***! \*******************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53097,13 +53289,13 @@ var lensPath = /*#__PURE__*/(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__[ }); /* harmony default export */ __webpack_exports__["default"] = (lensPath); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/lt.js" +/***/ "./node_modules/ramda/es/lt.js": /*!*************************************!*\ !*** ./node_modules/ramda/es/lt.js ***! \*************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53136,13 +53328,13 @@ var lt = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["defau }); /* harmony default export */ __webpack_exports__["default"] = (lt); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/map.js" +/***/ "./node_modules/ramda/es/map.js": /*!**************************************!*\ !*** ./node_modules/ramda/es/map.js ***! \**************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53213,13 +53405,13 @@ var map = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["defa })); /* harmony default export */ __webpack_exports__["default"] = (map); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/mapObjIndexed.js" +/***/ "./node_modules/ramda/es/mapObjIndexed.js": /*!************************************************!*\ !*** ./node_modules/ramda/es/mapObjIndexed.js ***! \************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53259,18 +53451,19 @@ var mapObjIndexed = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE }); /* harmony default export */ __webpack_exports__["default"] = (mapObjIndexed); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/max.js" +/***/ "./node_modules/ramda/es/max.js": /*!**************************************!*\ !*** ./node_modules/ramda/es/max.js ***! \**************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/_curry2.js */ "./node_modules/ramda/es/internal/_curry2.js"); /* harmony import */ var _toString_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toString.js */ "./node_modules/ramda/es/toString.js"); +function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } @@ -53305,9 +53498,9 @@ var max = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["defa if (maxByValue !== undefined) { return maxByValue; } - var maxByType = safeMax(typeof a, typeof b); + var maxByType = safeMax(_typeof(a), _typeof(b)); if (maxByType !== undefined) { - return maxByType === typeof a ? a : b; + return maxByType === _typeof(a) ? a : b; } var stringA = (0,_toString_js__WEBPACK_IMPORTED_MODULE_1__["default"])(a); var maxByStringValue = safeMax(stringA, (0,_toString_js__WEBPACK_IMPORTED_MODULE_1__["default"])(b)); @@ -53318,13 +53511,13 @@ var max = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["defa }); /* harmony default export */ __webpack_exports__["default"] = (max); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/memoizeWith.js" +/***/ "./node_modules/ramda/es/memoizeWith.js": /*!**********************************************!*\ !*** ./node_modules/ramda/es/memoizeWith.js ***! \**********************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53385,13 +53578,13 @@ var memoizeWith = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1 }); /* harmony default export */ __webpack_exports__["default"] = (memoizeWith); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/mergeDeepRight.js" +/***/ "./node_modules/ramda/es/mergeDeepRight.js": /*!*************************************************!*\ !*** ./node_modules/ramda/es/mergeDeepRight.js ***! \*************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53428,13 +53621,13 @@ var mergeDeepRight = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODUL }); /* harmony default export */ __webpack_exports__["default"] = (mergeDeepRight); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/mergeDeepWithKey.js" +/***/ "./node_modules/ramda/es/mergeDeepWithKey.js": /*!***************************************************!*\ !*** ./node_modules/ramda/es/mergeDeepWithKey.js ***! \***************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53484,13 +53677,13 @@ var mergeDeepWithKey = /*#__PURE__*/(0,_internal_curry3_js__WEBPACK_IMPORTED_MOD }); /* harmony default export */ __webpack_exports__["default"] = (mergeDeepWithKey); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/mergeLeft.js" +/***/ "./node_modules/ramda/es/mergeLeft.js": /*!********************************************!*\ !*** ./node_modules/ramda/es/mergeLeft.js ***! \********************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53527,13 +53720,13 @@ var mergeLeft = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__ }); /* harmony default export */ __webpack_exports__["default"] = (mergeLeft); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/mergeRight.js" +/***/ "./node_modules/ramda/es/mergeRight.js": /*!*********************************************!*\ !*** ./node_modules/ramda/es/mergeRight.js ***! \*********************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53570,13 +53763,13 @@ var mergeRight = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1_ }); /* harmony default export */ __webpack_exports__["default"] = (mergeRight); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/mergeWith.js" +/***/ "./node_modules/ramda/es/mergeWith.js": /*!********************************************!*\ !*** ./node_modules/ramda/es/mergeWith.js ***! \********************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53615,13 +53808,13 @@ var mergeWith = /*#__PURE__*/(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__ }); /* harmony default export */ __webpack_exports__["default"] = (mergeWith); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/mergeWithKey.js" +/***/ "./node_modules/ramda/es/mergeWithKey.js": /*!***********************************************!*\ !*** ./node_modules/ramda/es/mergeWithKey.js ***! \***********************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53674,13 +53867,13 @@ var mergeWithKey = /*#__PURE__*/(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_ }); /* harmony default export */ __webpack_exports__["default"] = (mergeWithKey); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/omit.js" +/***/ "./node_modules/ramda/es/omit.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/omit.js ***! \***************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53721,13 +53914,13 @@ var omit = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["def }); /* harmony default export */ __webpack_exports__["default"] = (omit); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/once.js" +/***/ "./node_modules/ramda/es/once.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/once.js ***! \***************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53769,13 +53962,13 @@ var once = /*#__PURE__*/(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_1__["def }); /* harmony default export */ __webpack_exports__["default"] = (once); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/over.js" +/***/ "./node_modules/ramda/es/over.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/over.js ***! \***************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53825,13 +54018,13 @@ var over = /*#__PURE__*/(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["def }); /* harmony default export */ __webpack_exports__["default"] = (over); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/partition.js" +/***/ "./node_modules/ramda/es/partition.js": /*!********************************************!*\ !*** ./node_modules/ramda/es/partition.js ***! \********************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53869,13 +54062,13 @@ __webpack_require__.r(__webpack_exports__); var partition = /*#__PURE__*/(0,_juxt_js__WEBPACK_IMPORTED_MODULE_1__["default"])([_filter_js__WEBPACK_IMPORTED_MODULE_0__["default"], _reject_js__WEBPACK_IMPORTED_MODULE_2__["default"]]); /* harmony default export */ __webpack_exports__["default"] = (partition); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/path.js" +/***/ "./node_modules/ramda/es/path.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/path.js ***! \***************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53912,13 +54105,13 @@ __webpack_require__.r(__webpack_exports__); var path = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_internal_path_js__WEBPACK_IMPORTED_MODULE_1__["default"]); /* harmony default export */ __webpack_exports__["default"] = (path); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/pathOr.js" +/***/ "./node_modules/ramda/es/pathOr.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/pathOr.js ***! \*****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53953,13 +54146,13 @@ var pathOr = /*#__PURE__*/(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["d }); /* harmony default export */ __webpack_exports__["default"] = (pathOr); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/pick.js" +/***/ "./node_modules/ramda/es/pick.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/pick.js ***! \***************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -53997,13 +54190,13 @@ var pick = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["def }); /* harmony default export */ __webpack_exports__["default"] = (pick); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/pickBy.js" +/***/ "./node_modules/ramda/es/pickBy.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/pickBy.js ***! \*****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54041,13 +54234,13 @@ var pickBy = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["d }); /* harmony default export */ __webpack_exports__["default"] = (pickBy); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/pluck.js" +/***/ "./node_modules/ramda/es/pluck.js": /*!****************************************!*\ !*** ./node_modules/ramda/es/pluck.js ***! \****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54090,13 +54283,13 @@ var pluck = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["de }); /* harmony default export */ __webpack_exports__["default"] = (pluck); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/prepend.js" +/***/ "./node_modules/ramda/es/prepend.js": /*!******************************************!*\ !*** ./node_modules/ramda/es/prepend.js ***! \******************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54127,13 +54320,13 @@ var prepend = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__[" }); /* harmony default export */ __webpack_exports__["default"] = (prepend); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/prop.js" +/***/ "./node_modules/ramda/es/prop.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/prop.js ***! \***************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54174,13 +54367,13 @@ var prop = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["def }); /* harmony default export */ __webpack_exports__["default"] = (prop); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/propEq.js" +/***/ "./node_modules/ramda/es/propEq.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/propEq.js ***! \*****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54223,13 +54416,13 @@ var propEq = /*#__PURE__*/(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["d }); /* harmony default export */ __webpack_exports__["default"] = (propEq); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/props.js" +/***/ "./node_modules/ramda/es/props.js": /*!****************************************!*\ !*** ./node_modules/ramda/es/props.js ***! \****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54266,13 +54459,13 @@ var props = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["de }); /* harmony default export */ __webpack_exports__["default"] = (props); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/reduce.js" +/***/ "./node_modules/ramda/es/reduce.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/reduce.js ***! \*****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54340,13 +54533,13 @@ var reduce = /*#__PURE__*/(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["d }); /* harmony default export */ __webpack_exports__["default"] = (reduce); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/reduceBy.js" +/***/ "./node_modules/ramda/es/reduceBy.js": /*!*******************************************!*\ !*** ./node_modules/ramda/es/reduceBy.js ***! \*******************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54425,13 +54618,13 @@ var reduceBy = /*#__PURE__*/(0,_internal_curryN_js__WEBPACK_IMPORTED_MODULE_1__[ })); /* harmony default export */ __webpack_exports__["default"] = (reduceBy); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/reject.js" +/***/ "./node_modules/ramda/es/reject.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/reject.js ***! \*****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54471,13 +54664,13 @@ var reject = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["d }); /* harmony default export */ __webpack_exports__["default"] = (reject); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/remove.js" +/***/ "./node_modules/ramda/es/remove.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/remove.js ***! \*****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54511,13 +54704,13 @@ var remove = /*#__PURE__*/(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["d }); /* harmony default export */ __webpack_exports__["default"] = (remove); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/reverse.js" +/***/ "./node_modules/ramda/es/reverse.js": /*!******************************************!*\ !*** ./node_modules/ramda/es/reverse.js ***! \******************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54555,13 +54748,13 @@ var reverse = /*#__PURE__*/(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__[" }); /* harmony default export */ __webpack_exports__["default"] = (reverse); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/set.js" +/***/ "./node_modules/ramda/es/set.js": /*!**************************************!*\ !*** ./node_modules/ramda/es/set.js ***! \**************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54599,13 +54792,13 @@ var set = /*#__PURE__*/(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_0__["defa }); /* harmony default export */ __webpack_exports__["default"] = (set); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/slice.js" +/***/ "./node_modules/ramda/es/slice.js": /*!****************************************!*\ !*** ./node_modules/ramda/es/slice.js ***! \****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54643,13 +54836,13 @@ var slice = /*#__PURE__*/(0,_internal_curry3_js__WEBPACK_IMPORTED_MODULE_1__["de })); /* harmony default export */ __webpack_exports__["default"] = (slice); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/sort.js" +/***/ "./node_modules/ramda/es/sort.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/sort.js ***! \***************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54682,13 +54875,13 @@ var sort = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["def }); /* harmony default export */ __webpack_exports__["default"] = (sort); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/startsWith.js" +/***/ "./node_modules/ramda/es/startsWith.js": /*!*********************************************!*\ !*** ./node_modules/ramda/es/startsWith.js ***! \*********************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54726,13 +54919,13 @@ var startsWith = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0_ }); /* harmony default export */ __webpack_exports__["default"] = (startsWith); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/take.js" +/***/ "./node_modules/ramda/es/take.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/take.js ***! \***************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54793,13 +54986,13 @@ var take = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["def })); /* harmony default export */ __webpack_exports__["default"] = (take); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/toPairs.js" +/***/ "./node_modules/ramda/es/toPairs.js": /*!******************************************!*\ !*** ./node_modules/ramda/es/toPairs.js ***! \******************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54837,13 +55030,13 @@ var toPairs = /*#__PURE__*/(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__[" }); /* harmony default export */ __webpack_exports__["default"] = (toPairs); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/toString.js" +/***/ "./node_modules/ramda/es/toString.js": /*!*******************************************!*\ !*** ./node_modules/ramda/es/toString.js ***! \*******************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54893,13 +55086,13 @@ var toString = /*#__PURE__*/(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__[ }); /* harmony default export */ __webpack_exports__["default"] = (toString); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/type.js" +/***/ "./node_modules/ramda/es/type.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/type.js ***! \***************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54938,13 +55131,13 @@ var type = /*#__PURE__*/(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["def }); /* harmony default export */ __webpack_exports__["default"] = (type); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/uniq.js" +/***/ "./node_modules/ramda/es/uniq.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/uniq.js ***! \***************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -54973,13 +55166,13 @@ __webpack_require__.r(__webpack_exports__); var uniq = /*#__PURE__*/(0,_uniqBy_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_identity_js__WEBPACK_IMPORTED_MODULE_0__["default"]); /* harmony default export */ __webpack_exports__["default"] = (uniq); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/uniqBy.js" +/***/ "./node_modules/ramda/es/uniqBy.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/uniqBy.js ***! \*****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -55029,13 +55222,13 @@ var uniqBy = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_1__["d })); /* harmony default export */ __webpack_exports__["default"] = (uniqBy); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/values.js" +/***/ "./node_modules/ramda/es/values.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/values.js ***! \*****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -55074,13 +55267,13 @@ var values = /*#__PURE__*/(0,_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__["d }); /* harmony default export */ __webpack_exports__["default"] = (values); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/view.js" +/***/ "./node_modules/ramda/es/view.js": /*!***************************************!*\ !*** ./node_modules/ramda/es/view.js ***! \***************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -55125,13 +55318,13 @@ var view = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["def }); /* harmony default export */ __webpack_exports__["default"] = (view); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/zip.js" +/***/ "./node_modules/ramda/es/zip.js": /*!**************************************!*\ !*** ./node_modules/ramda/es/zip.js ***! \**************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -55169,13 +55362,13 @@ var zip = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["defa }); /* harmony default export */ __webpack_exports__["default"] = (zip); -/***/ }, +/***/ }), -/***/ "./node_modules/ramda/es/zipObj.js" +/***/ "./node_modules/ramda/es/zipObj.js": /*!*****************************************!*\ !*** ./node_modules/ramda/es/zipObj.js ***! \*****************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); @@ -55211,18 +55404,18 @@ var zipObj = /*#__PURE__*/(0,_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__["d }); /* harmony default export */ __webpack_exports__["default"] = (zipObj); -/***/ }, +/***/ }), -/***/ "./node_modules/cytoscape/dist/cytoscape.esm.mjs" +/***/ "./node_modules/cytoscape/dist/cytoscape.esm.mjs": /*!*******************************************************!*\ !*** ./node_modules/cytoscape/dist/cytoscape.esm.mjs ***! \*******************************************************/ -(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ cytoscape) +/* harmony export */ "default": function() { return /* binding */ cytoscape; } /* harmony export */ }); /** * Copyright (c) 2016-2024, The Cytoscape Consortium. @@ -86531,7 +86724,7 @@ cytoscape.stylesheet = cytoscape.Stylesheet = Stylesheet; -/***/ } +/***/ }) /******/ }); /************************************************************************/ @@ -86570,31 +86763,31 @@ cytoscape.stylesheet = cytoscape.Stylesheet = Stylesheet; /******/ /************************************************************************/ /******/ /* webpack/runtime/compat get default export */ -/******/ (() => { +/******/ !function() { /******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { +/******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); +/******/ function() { return module['default']; } : +/******/ function() { return module; }; /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; -/******/ })(); +/******/ }(); /******/ /******/ /* webpack/runtime/define property getters */ -/******/ (() => { +/******/ !function() { /******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { +/******/ __webpack_require__.d = function(exports, definition) { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; -/******/ })(); +/******/ }(); /******/ /******/ /* webpack/runtime/global */ -/******/ (() => { +/******/ !function() { /******/ __webpack_require__.g = (function() { /******/ if (typeof globalThis === 'object') return globalThis; /******/ try { @@ -86603,42 +86796,42 @@ cytoscape.stylesheet = cytoscape.Stylesheet = Stylesheet; /******/ if (typeof window === 'object') return window; /******/ } /******/ })(); -/******/ })(); +/******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); +/******/ !function() { +/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); /******/ /******/ /* webpack/runtime/make namespace object */ -/******/ (() => { +/******/ !function() { /******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { +/******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; -/******/ })(); +/******/ }(); /******/ /******/ /* webpack/runtime/node module decorator */ -/******/ (() => { -/******/ __webpack_require__.nmd = (module) => { +/******/ !function() { +/******/ __webpack_require__.nmd = function(module) { /******/ module.paths = []; /******/ if (!module.children) module.children = []; /******/ return module; /******/ }; -/******/ })(); +/******/ }(); /******/ /******/ /* webpack/runtime/nonce */ -/******/ (() => { +/******/ !function() { /******/ __webpack_require__.nc = undefined; -/******/ })(); +/******/ }(); /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry needs to be wrapped in an IIFE because it needs to be in strict mode. -(() => { +!function() { "use strict"; var __webpack_exports__ = {}; /*!********************************************!*\ @@ -86646,11 +86839,11 @@ var __webpack_exports__ = {}; \********************************************/ __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DOMException: () => (/* binding */ DOMException), -/* harmony export */ Headers: () => (/* binding */ Headers), -/* harmony export */ Request: () => (/* binding */ Request), -/* harmony export */ Response: () => (/* binding */ Response), -/* harmony export */ fetch: () => (/* binding */ fetch) +/* harmony export */ DOMException: function() { return /* binding */ DOMException; }, +/* harmony export */ Headers: function() { return /* binding */ Headers; }, +/* harmony export */ Request: function() { return /* binding */ Request; }, +/* harmony export */ Response: function() { return /* binding */ Response; }, +/* harmony export */ fetch: function() { return /* binding */ fetch; } /* harmony export */ }); /* eslint-disable no-prototype-builtins */ var g = @@ -87295,10 +87488,9 @@ if (!g.fetch) { g.Response = Response } -})(); - +}(); // This entry needs to be wrapped in an IIFE because it needs to be in strict mode. -(() => { +!function() { "use strict"; /*!**********************!*\ !*** ./src/index.js ***! @@ -87311,9 +87503,8 @@ __webpack_require__.r(__webpack_exports__); // make DashRenderer globally available window.DashRenderer = _DashRenderer__WEBPACK_IMPORTED_MODULE_0__.DashRenderer; -})(); - +}(); window.dash_renderer = __webpack_exports__; /******/ })() ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztB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Q0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0EsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLE9BQU8sUUFBUTtBQUNoQyxpQkFBaUIsT0FBTyxRQUFRO0FBQ2hDLGtCQUFrQixPQUFPLE9BQU87QUFDaEMsa0JBQWtCLE9BQU8sT0FBTztBQUNoQyxpQkFBaUIsUUFBUSxPQUFPO0FBQ2hDLGlCQUFpQixRQUFRLE9BQU87QUFDaEM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFOztBQUV2RTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsK0NBQStDLEVBQUUsVUFBVSxFQUFFO0FBQzdEO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0IsYUFBYSxhQUFhO0FBQzFDO0FBQ0EsZ0JBQWdCLGFBQWEsYUFBYTtBQUMxQztBQUNBLGdCQUFnQixh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QUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGNBQWMsbUJBQW1CO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGNBQWM7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixjQUFjO0FBQ2hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNFQUFzRSxtQ0FBbUM7O0FBRXpHO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0EsMEhBQTBIO0FBQzFILFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtS0FBbUs7QUFDbks7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IscUJBQXFCO0FBQ3ZDO0FBQ0E7QUFD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O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrQkFBa0I7QUFDcEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQiw4QkFBOEI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLDhCQUE4Qjs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7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RkFBcUM7QUFDL0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLGtIQUFrSCxVQUFVLFlBQVksT0FBTyxLQUFLLFlBQVksV0FBVyxVQUFVLFVBQVUsVUFBVSxVQUFVLE9BQU8sS0FBSyxVQUFVLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxhQUFhLE1BQU0sS0FBSyxVQUFVLFVBQVUsWUFBWSxXQUFXLFVBQVUsWUFBWSxNQUFNLEtBQUssVUFBVSxVQUFVLFVBQVUsTUFBTSxLQUFLLE9BQU8sT0FBTyxXQUFXLEtBQUssS0FBSyxZQUFZLGFBQWEsTUFBTSxLQUFLLFlBQVksV0FBVyxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsV0FBVyxPQUFPLEtBQUssWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLFdBQVcsVUFBVSxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksYUFBYSxXQUFXLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLFdBQVcsWUFBWSxhQUFhLFdBQVcsWUFBWSxhQUFhLFdBQVcsS0FBSyxLQUFLLFlBQVksV0FBVyxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLFdBQVcsTUFBTSxLQUFLLFVBQVUsVUFBVSxZQUFZLGFBQWEsYUFBYSxXQUFXLFlBQVksT0FBTyxPQUFPLE9BQU8sS0FBSyxVQUFVLFVBQVUsVUFBVSxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLEtBQUssVUFBVSxPQUFPLEtBQUssVUFBVSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxXQUFXLFlBQVksYUFBYSxXQUFXLFVBQVUsT0FBTyxLQUFLLEtBQUssVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sS0FBSyxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSwyQ0FBMkMsc0JBQXNCLDJCQUEyQixHQUFHLDRCQUE0Qix5QkFBeUIsZUFBZSxhQUFhLHFCQUFxQixzQkFBc0Isc0JBQXNCLEdBQUcsa0NBQWtDLHFCQUFxQixHQUFHLHFCQUFxQix1QkFBdUIsdUJBQXVCLHdCQUF3Qiw0QkFBNEIsR0FBRyxnQ0FBZ0Msa0JBQWtCLG1CQUFtQiw0QkFBNEIseUJBQXlCLEdBQUcsOEJBQThCLGtCQUFrQixtQkFBbUIseUJBQXlCLGtCQUFrQixnQkFBZ0IsNEJBQTRCLEdBQUcsOEJBQThCLGlCQUFpQixtQkFBbUIsc0JBQXNCLEdBQUcseUNBQXlDLHVOQUF1TixHQUFHLDZCQUE2QiwyQkFBMkIsMEJBQTBCLEdBQUcseUJBQXlCLHVCQUF1QixrQkFBa0IsdUJBQXVCLG1CQUFtQix3QkFBd0IsNEJBQTRCLDhCQUE4QiwwQkFBMEIsdUJBQXVCLHdCQUF3QixHQUFHLDZCQUE2Qix5QkFBeUIsR0FBRyxxQ0FBcUMsd0NBQXdDLG9DQUFvQyxnQ0FBZ0MsR0FBRyxnQ0FBZ0MsZ0JBQWdCLHFCQUFxQixzQkFBc0IsZ0NBQWdDLGdDQUFnQyw2QkFBNkIsa0NBQWtDLG1DQUFtQyxvQkFBb0IsR0FBRywwQkFBMEIsZ0NBQWdDLHdCQUF3QixvQkFBb0IsZ0NBQWdDLGdDQUFnQyxxQkFBcUIscUJBQXFCLDRCQUE0QixHQUFHLDRCQUE0Qix5QkFBeUIsR0FBRyxnQ0FBZ0Msa0NBQWtDLG1DQUFtQywrQkFBK0IsR0FBRyxtQ0FBbUMscUNBQXFDLHNDQUFzQyxnQ0FBZ0MsR0FBRyx3QkFBd0IsZ0NBQWdDLHVCQUF1Qix1QkFBdUIseUVBQXlFLDRCQUE0QixHQUFHLHlCQUF5QixnQ0FBZ0MsdUJBQXVCLGtCQUFrQixxQkFBcUIsd0JBQXdCLHlCQUF5QixHQUFHLHlCQUF5QixtQkFBbUIsR0FBRyxzQkFBc0IscUJBQXFCLHNCQUFzQix3QkFBd0IsNkJBQTZCLHNCQUFzQiwrQ0FBK0MsNkJBQTZCLEdBQUcsc0JBQXNCLDZCQUE2Qiw0QkFBNEIsNkNBQTZDLGdEQUFnRCxvQkFBb0IsdUJBQXVCLDhCQUE4QixrQkFBa0IsR0FBRyxpQ0FBaUMseUJBQXlCLGtCQUFrQixpQkFBaUIsc0JBQXNCLHVCQUF1QixnQ0FBZ0MsdUJBQXVCLHFDQUFxQyxzQ0FBc0MsbUJBQW1CLEdBQUcsK0JBQStCLG9CQUFvQixtQkFBbUIsdUJBQXVCLHlCQUF5Qiw4QkFBOEIscUJBQXFCLHlCQUF5QiwySkFBMkosR0FBRyw4QkFBOEIsa0JBQWtCLG1CQUFtQixvQkFBb0Isa0NBQWtDLHNCQUFzQiwwQkFBMEIseUJBQXlCLDJCQUEyQix1QkFBdUIsR0FBRyw2QkFBNkIsc0JBQXNCLEdBQUcsd0NBQXdDLHFCQUFxQixHQUFHLCtCQUErQiw2QkFBNkIsOEJBQThCLHlCQUF5QiwwQkFBMEIsa0NBQWtDLHdCQUF3QixHQUFHLHlCQUF5QiwwQkFBMEIseUJBQXlCLG9CQUFvQixxQ0FBcUMsMEJBQTBCLG1CQUFtQixzQkFBc0IsR0FBRywwQ0FBMEMsWUFBWSxxQkFBcUIsd0NBQXdDLHFDQUFxQyxvQ0FBb0MsZ0NBQWdDLE9BQU8sVUFBVSxxQkFBcUIsc0NBQXNDLG1DQUFtQyxrQ0FBa0MsOEJBQThCLE9BQU8sR0FBRyxxQkFBcUI7QUFDM3hPO0FBQ0EsK0RBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDclB2QztBQUNnSDtBQUNqQjtBQUMvRiw4QkFBOEIsbUZBQTJCLENBQUMsNEZBQXFDO0FBQy9GO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLGlHQUFpRyxVQUFVLE9BQU8sS0FBSyxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsTUFBTSxzQ0FBc0Msb0JBQW9CLEdBQUcsdUJBQXVCLG1CQUFtQix3QkFBd0IsT0FBTyxtQkFBbUIseUJBQXlCLE9BQU8sR0FBRyxxQkFBcUI7QUFDelg7QUFDQSwrREFBZSx1QkFBdUIsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuQnZDO0FBQ21IO0FBQ2pCO0FBQ2xHLDhCQUE4QixtRkFBMkIsQ0FBQyw0RkFBcUM7QUFDL0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTywwR0FBMEcsWUFBWSxXQUFXLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxXQUFXLFlBQVksYUFBYSxXQUFXLFVBQVUsVUFBVSxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksYUFBYSxXQUFXLFlBQVksYUFBYSxhQUFhLFdBQVcsVUFBVSxVQUFVLFlBQVksV0FBVyxVQUFVLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxhQUFhLFdBQVcsVUFBVSxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsT0FBTyxPQUFPLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLFdBQVcsWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxPQUFPLEtBQUssWUFBWSxXQUFXLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxXQUFXLFVBQVUsVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLFdBQVcsWUFBWSxhQUFhLFdBQVcsWUFBWSxXQUFXLFlBQVksTUFBTSxPQUFPLGFBQWEsTUFBTSxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUFXLFlBQVksV0FBVyxPQUFPLEtBQUssVUFBVSxZQUFZLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsV0FBVyxVQUFVLEtBQUssS0FBSyxVQUFVLFlBQVksV0FBVyxNQUFNLEtBQUssVUFBVSxZQUFZLGFBQWEsYUFBYSxXQUFXLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxXQUFXLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxhQUFhLFdBQVcsT0FBTyxLQUFLLFVBQVUsWUFBWSxNQUFNLEtBQUssVUFBVSxPQUFPLEtBQUssVUFBVSxZQUFZLFdBQVcsT0FBTyxLQUFLLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLEtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixN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QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLGNBQWM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLG9CQUFvQixrQkFBa0I7QUFDdEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0IsT0FBTztBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQixLQUFLOztBQUUvQjtBQUNBO0FBQ0EsMEJBQTBCLEtBQUs7O0FBRS9COztBQUVB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0EscUdBQXFHLHFCQUFxQixtQkFBbUI7O0FBRTdJOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtB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O0FBQ25DOztBQUVBLHNCQUFzQixtQkFBbUI7QUFDekM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLG1CQUFtQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLG1CQUFtQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFlBQVksU0FBUztBQUNyQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFlBQVksU0FBUztBQUNyQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsR0FBRztBQUNkLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxpQkFBaUI7QUFDNUIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsR0FBRztBQUNkLFdBQVcsT0FBTztBQUNsQjtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEI7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsR0FBRztBQUNkLFdBQVcsT0FBTztBQUNsQjtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsR0FBRztBQUNkLFdBQVcsR0FBRztBQUNkLFdBQVcsT0FBTztBQUNsQjtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsT0FBTztBQUNwQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5QztBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQixZQUFZLFFBQVE7QUFDcEIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsc0hBQXNILHFCQUFNLG1CQUFtQixxQkFBTTs7QUFFcko7QUFDQSxtQkFBbUIsYUFBYTtBQUNoQzs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRLFdBQVc7QUFDOUIsV0FBVyxTQUFTO0FBQ3BCO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsK0NBQStDLGlCQUFpQjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBDQUEwQztBQUMxQyw0Q0FBNEM7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxrQkFBa0I7QUFDbEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsUUFBUTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IscUJBQXFCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQztBQUNEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxzQkFBc0IsZ0JBQWdCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsYUFBYTtBQUNiO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxnQkFBZ0I7QUFDaEI7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLHNDQUFzQyxPQUFPO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLHdCQUF3QixzQkFBc0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDRCQUE0QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELG1DQUFtQywwQkFBMEI7QUFDcEg7QUFDQSxLQUFLO0FBQ0w7QUFDQSxzQ0FBc0MsV0FBVztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLFdBQVc7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxXQUFXO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0Msc0NBQXNDO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUEsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7O0FBRUgsQ0FBQztBQUNELENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLGtCQUFrQixxQkFBcUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixzQkFBc0I7QUFDekM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOLDBFQUEwRTtBQUMxRTtBQUNBLDREQUE0RDtBQUM1RDs7QUFFQTtBQUNBLG9CQUFvQix1QkFBdUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHFCQUFxQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFD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LGdFQUFnRTs7QUFFaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBOztBQUVBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDJCQUEyQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQSxPQUFPLEdBQUc7O0FBRVY7QUFDQTtBQUNBO0FBQ0EsT0FBTyxHQUFHO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLHdCQUF3QjtBQUN4Qjs7QUFFQSxpQkFBaUI7QUFDakIsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpQkFBaUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLHdCQUF3QjtBQUN4Qjs7QUFFQSxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixnQkFBZ0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixRQUFRO0FBQ1I7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLE1BQU07O0FBRU47QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDOztBQUVsQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDOztBQUVyQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGlCQUFpQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsa0JBQWtCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsSUFBSTs7QUFFTCwwQkFBMEI7O0FBRTFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGlCQUFpQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG9FQUFvRTtBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQzs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFFBQVE7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFDQUFxQyxRQUFRO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGdCQUFnQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEMsUUFBUTtBQUNSLGdDQUFnQztBQUNoQyxRQUFRO0FBQ1Isc0NBQXNDO0FBQ3RDOztBQUVBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixpQkFBaUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZOztBQUVaO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixNQUFNO0FBQ04sSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBLG9GQUFvRjs7QUFFcEY7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDJCQUEyQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isc0JBQXNCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckMsMERBQTBEOztBQUUxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsdUJBQXVCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsbUJBQW1CO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHVCQUF1QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IseUJBQXlCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCLGlDQUFpQztBQUNqQztBQUNBLG9CQUFvQjtBQUNwQixpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixvQkFBb0I7QUFDcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLG9CQUFvQjtBQUNwQjtBQUNBOztBQUVBO0FBQ0EsNExBQTRMO0FBQzVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsK0JBQStCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVix3QkFBd0I7QUFDeEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyx5QkFBeUI7O0FBRXpCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLG1DQUFtQztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDLHlCQUF5Qjs7QUFFekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRTs7QUFFdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMseUJBQXlCOztBQUV6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0Esc0JBQXNCLHNCQUFzQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsVUFBVTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7O0FBRTdCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEOztBQUVBO0FBQ0EsUUFBUTtBQUNSLDhDQUE4QztBQUM5Qzs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVDQUF1QztBQUN2Qyw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNCQUFzQiw0QkFBNEI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLG1CQUFtQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUI7QUFDbkIsb0JBQW9CLG1CQUFtQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixrQkFBa0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBLG9CQUFvQixrQkFBa0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCOztBQUVoQjtBQUNBO0FBQ0Esb0JBQW9CLDRCQUE0QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsWUFBWTtBQUNaO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixxQkFBcUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsc0JBQXNCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCOztBQUU5QixvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxpQkFBaUI7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELGNBQWM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLCtCQUErQjtBQUMvQixNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxrQkFBa0IsNkJBQTZCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUcsSUFBSTtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxtQkFBbUIsbUJBQW1CO0FBQ3RDO0FBQ0EsNkJBQTZCO0FBQzdCOztBQUVBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QSxpQkFBaUI7QUFDakIsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCO0FBQ2pCLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBYztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCO0FBQ2pCLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMLGlCQUFpQjtBQUNqQixHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLDBEQUEwRDtBQUMxRCxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxpQkFBaUIsS0FBSztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IseUJBQXlCO0FBQzNDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdDQUFnQztBQUNsRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0EsMEJBQTBCLGNBQWM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IseUJBQXlCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLGdDQUFnQztBQUNsRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0I7O0FBRWhCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IscUJBQXFCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQix5QkFBeUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHlCQUF5QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IseUJBQXlCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrQkFBa0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHVCQUF1QjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsdUJBQXVCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsaUJBQWlCLEtBQUs7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QyxlQUFlLFdBQVc7QUFDMUI7QUFDQSw0Q0FBNEMscUJBQXFCO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQixtQkFBbUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBLDJCQUEyQjtBQUMzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0EseUNBQXlDLG1CQUFtQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxpQkFBaUIsS0FBSztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QVM7QUFDVCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEZBQTRGO0FBQzVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBLDJFQUEyRTtBQUMzRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUIseUJBQXlCO0FBQ3pCLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxzQ0FBc0M7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixlQUFlO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGFBQWE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0U7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDJCQUEyQjtBQUMvQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsMEJBQTBCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDRCQUE0QjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsVUFBVTs7QUFFVixZQUFZO0FBQ1osWUFBWTs7QUFFWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKLDRCQUE0QjtBQUM1QixJQUFJO0FBQ0o7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUix1QkFBdUI7QUFDdkI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isd0JBQXdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0IsZ0JBQWdCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsd0JBQXdCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IseUJBQXlCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLG9CQUFvQiw0QkFBNEI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFlBQVk7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxxQkFBcUI7QUFDMUUsdURBQXVEO0FBQ3ZEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRTs7QUFFakU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsdUJBQXVCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pELE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIscUJBQXFCO0FBQ2pEO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVELGtCQUFrQjtBQUNsQixtQkFBbUI7QUFDbkIsbUJBQW1CO0FBQ25CLGtCQUFrQjtBQUNsQixzQkFBc0I7QUFDdEIsdUJBQXVCO0FBQ3ZCLHdCQUF3QjtBQUN4QixvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLHNCQUFzQjtBQUN0Qix1QkFBdUI7QUFDdkIsNEJBQTRCO0FBQzVCLHNCQUFzQjtBQUN0Qix3QkFBd0I7QUFDeEIsMkJBQTJCO0FBQzNCLHlCQUF5QjtBQUN6QixnQ0FBZ0M7QUFDaEMsc0JBQXNCOztBQUV0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZOztBQUVaO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkIsd0JBQXdCLGVBQWU7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBdUMsVUFBVTtBQUNqRDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLG9CQUFvQjtBQUNwQjtBQUNBLDhCQUE4QixpQkFBaUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7O0FBRUEsMkJBQTJCLGlCQUFpQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixtQkFBbUI7QUFDdkM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGtCQUFrQixzQkFBc0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrQkFBa0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7O0FBRWYsdUJBQXVCO0FBQ3ZCLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLG9CQUFvQiw0QkFBNEI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBLHNCQUFzQixpQkFBaUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxzQkFBc0I7QUFDdEIsaUJBQWlCO0FBQ2pCLGdCQUFnQjtBQUNoQixvQkFBb0I7QUFDcEIsNkJBQTZCO0FBQzdCLGdDQUFnQztBQUNoQyxvQkFBb0I7QUFDcEIsc0JBQXNCO0FBQ3RCLHlCQUF5QjtBQUN6Qix1QkFBdUI7QUFDdkIsb0JBQW9CO0FBQ3BCLDRCQUE0QjtBQUM1QixnQ0FBZ0M7QUFDaEMscUNBQXFDOztBQUVyQyx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0MsaUJBQWlCOztBQUVqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qiw0QkFBNEI7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDO0FBQ2xDLG9DQUFvQyxRQUFRO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsaUJBQWlCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG1CQUFtQjtBQUNyQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGtCQUFrQixtQkFBbUI7QUFDckM7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGFBQWE7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGFBQWE7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBc0Isc0JBQXNCO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0VBQWdFO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQzs7QUFFaEM7QUFDQSxrQkFBa0IsdUJBQXVCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixtQkFBbUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG1CQUFtQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixtQkFBbUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG1CQUFtQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLDJDQUEyQztBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG1CQUFtQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isb0JBQW9CO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIscUJBQXFCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsOEJBQThCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsNEJBQTRCLHNCQUFzQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9DQUFvQzs7QUFFcEM7QUFDQTtBQUNBLG9DQUFvQztBQUNwQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQzs7QUFFL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDRCQUE0QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7O0FBRTlCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRTs7QUFFbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1YsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVixRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixtQkFBbUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHlCQUF5QjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsV0FBVztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsaUJBQWlCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsaUJBQWlCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7O0FBRXJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsdUJBQXVCO0FBQ3pDLHdFQUF3RTtBQUN4RTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isc0JBQXNCO0FBQ3hDLGlFQUFpRTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixrQkFBa0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSLDRFQUE0RTtBQUM1RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEIscUJBQXFCO0FBQ2pEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBLHFDQUFxQyw0QkFBNEI7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkIsMEJBQTBCLGVBQWU7QUFDdEU7O0FBRU87QUFDUDtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNqb0I0QztBQUNQOztBQUVyQztBQUNBdk8sTUFBTSxDQUFDbTRCLFlBQVksR0FBR0EsdURBQVksQyIsInNvdXJjZXMiOlsid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQHBsb3RseS9kYXNoLWNvbXBvbmVudC1wbHVnaW5zL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0NoZWNrSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0Nsb2NrSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0Nsb3VkU2xhc2hJY29uLnN2ZyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvaWNvbnMvQ29sbGFwc2VJY29uLnN2ZyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvaWNvbnMvRXJyb3JJY29uLnN2ZyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvaWNvbnMvRXhwYW5kLnN2ZyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvaWNvbnMvR3JhcGhJY29uLnN2ZyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvaWNvbnMvT2ZmSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9BcHBQcm92aWRlci5yZWFjdC50c3giLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9TdG9yZU9ic2VydmVyLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9jYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2RlcGVuZGVuY2llc190cy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvaXNMb2FkaW5nLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9sb2FkaW5nLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9wYXRjaC50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvcGF0dGVybk1hdGNoaW5nLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9yZXF1ZXN0RGVwZW5kZW5jaWVzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29uZmlnLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvZGFzaEFwaS50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy9kb2N1bWVudFRpdGxlLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL2V4ZWN1dGVkQ2FsbGJhY2tzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL2V4ZWN1dGluZ0NhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy9pc0xvYWRpbmcudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvcHJpb3JpdGl6ZWRDYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvcmVxdWVzdGVkQ2FsbGJhY2tzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL3N0b3JlZENhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy93ZWJzb2NrZXRPYnNlcnZlci50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NhbGxiYWNrSm9icy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2lzTG9hZGluZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2xvYWRpbmcudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9zdG9yZS50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3V0aWxzL2NhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3V0aWxzL2NsaWVudHNpZGVGdW5jdGlvbnMudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy9saWJyYXJpZXMudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy9yZW5kZXJlcklkLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvdXRpbHMvc3RvcmVzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvdXRpbHMvd2FpdC50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3V0aWxzL3dvcmtlckNsaWVudC50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3dyYXBwZXIvQ2hlY2tlZENvbXBvbmVudC50c3giLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy93cmFwcGVyL0Rhc2hDb250ZXh0LnRzeCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3dyYXBwZXIvRGFzaFdyYXBwZXIudHN4Iiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvd3JhcHBlci9FeHRlcm5hbFdyYXBwZXIudHN4Iiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvd3JhcHBlci9zZWxlY3RvcnMudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy93cmFwcGVyL3dyYXBwaW5nLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvQVBJQ29udHJvbGxlci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL0FwcENvbnRhaW5lci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL0Rhc2hSZW5kZXJlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvYXBpLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2RlcGVuZGVuY2llcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2lzQXBwUmVhZHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL3BhdGhzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy91dGlscy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NoZWNrUHJvcFR5cGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9jb3JlL0xvYWRpbmcucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2NvcmUvUmVsb2FkZXIucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2NvcmUvVG9vbGJhci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9DYWxsYmFja0dyYXBoL0NhbGxiYWNrR3JhcGhDb250YWluZXJTdHlsZXNoZWV0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9DYWxsYmFja0dyYXBoL0NhbGxiYWNrR3JhcGhFZmZlY3RzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9Db21wb25lbnRFcnJvckJvdW5kYXJ5LnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9Gcm9udEVuZC9Gcm9udEVuZEVycm9yLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9Gcm9udEVuZC9Gcm9udEVuZEVycm9yQ29udGFpbmVyLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9HbG9iYWxFcnJvckNvbnRhaW5lci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9EZWJ1Z01lbnUucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvRGV2dG9vbENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvUGxvdGx5Q2xvdWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvVmVyc2lvbkluZm8ucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL3dlcmt6ZXVnY3NzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29uc3RhbnRzL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2V4Y2VwdGlvbnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9pc1NpbXBsZUNvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3BlcnNpc3RlbmNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvYXBpLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvYXBwTGlmZWN5Y2xlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvY2hhbmdlZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NvbmZpZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2RlcGVuZGVuY3lHcmFwaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2Vycm9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvaGlzdG9yeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2hvb2tzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvbGF5b3V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvcGF0aHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9wcm9maWxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvcmVkdWNlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZ2lzdHJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi4vc3JjL2luZGV4LnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY3l0b3NjYXBlLWZjb3NlL2N5dG9zY2FwZS1mY29zZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4uL3NyYy90eXBlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4uL3NyYy9kaWZmLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi4vc3JjL2pzb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uLi9zcmMvZGVmYXVsdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uLi9zcmMvcGF0Y2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uLi9zcmMvY29tcG9uZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29tcG9uZW50cy9Db250ZXh0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29tcG9uZW50cy9Qcm92aWRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2NvbXBvbmVudHMvY29ubmVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvaW52YWxpZEFyZ0ZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L21hcERpc3BhdGNoVG9Qcm9wcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvbWFwU3RhdGVUb1Byb3BzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9tZXJnZVByb3BzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9zZWxlY3RvckZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L3ZlcmlmeVN1YnNlbGVjdG9ycy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3Qvd3JhcE1hcFRvUHJvcHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9leHBvcnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvaG9va3MvdXNlRGlzcGF0Y2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9ob29rcy91c2VSZWR1eENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9ob29rcy91c2VTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2hvb2tzL3VzZVN0b3JlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy90eXBlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL1N1YnNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL2JhdGNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvYmluZEFjdGlvbkNyZWF0b3JzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvaXNQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL3JlYWN0QmF0Y2hlZFVwZGF0ZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy9zaGFsbG93RXF1YWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvdXNlU3luY0V4dGVybmFsU3RvcmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy92ZXJpZnlQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL3dhcm5pbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hcGF0aHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2FzaGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLWR1bmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2F0ZWxpZXItZm9yZXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLWhlYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLWxha2VzaWRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLXNlYXNpZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2Jlc3Bpbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYnJld2VyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9icmlnaHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2NoYWxrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9jb2Rlc2Nob29sLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9jb2xvcnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2RlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2VpZ2h0aWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9lbWJlcnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2ZsYXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2dvb2dsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvZ3JheXNjYWxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9ncmVlbnNjcmVlbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvaGFybW9uaWMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2hvcHNjb3RjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2lzb3RvcGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL21hcnJha2VzaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvbW9jaGEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL21vbm9rYWkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL29jZWFuLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9wYXJhaXNvLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9wb3AuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3JhaWxzY2FzdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3NoYXBlc2hpZnRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvc29sYXJpemVkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9zdW1tZXJmcnVpdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvdGhyZWV6ZXJvdHdvZm91ci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvdG9tb3Jyb3cuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3R1YmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3R3aWxpZ2h0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9jb252ZXJzaW9ucy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jb2xvci1jb252ZXJ0L3JvdXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY29sb3ItbmFtZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2NvbG9yLXN0cmluZy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2NvbG9yL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY29zZS1iYXNlL2Nvc2UtYmFzZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvY29yZS9Ub29sYmFyLmNzcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyLmNzcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvRnJvbnRFbmQvRnJvbnRFbmRFcnJvci5jc3MiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL1BlcmN5LmNzcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9EZWJ1Z01lbnUuY3NzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L1Bsb3RseUNsb3VkLmNzcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9WZXJzaW9uSW5mby5jc3MiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY3l0b3NjYXBlLWRhZ3JlL2N5dG9zY2FwZS1kYWdyZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL2FjeWNsaWMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvYWRkLWJvcmRlci1zZWdtZW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9jb29yZGluYXRlLXN5c3RlbS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9kYXRhL2xpc3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvZGVidWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvZ3JhcGhsaWIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvZ3JlZWR5LWZhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9sYXlvdXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvbG9kYXNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL25lc3RpbmctZ3JhcGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvbm9ybWFsaXplLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2FkZC1zdWJncmFwaC1jb25zdHJhaW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9iYXJ5Y2VudGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2J1aWxkLWxheWVyLWdyYXBoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2Nyb3NzLWNvdW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2luaXQtb3JkZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvcmVzb2x2ZS1jb25mbGljdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvc29ydC1zdWJncmFwaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9zb3J0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL3BhcmVudC1kdW1teS1jaGFpbnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcG9zaXRpb24vYmsuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcG9zaXRpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcmFuay9mZWFzaWJsZS10cmVlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL3JhbmsvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcmFuay9uZXR3b3JrLXNpbXBsZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvcmFuay91dGlsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL3V0aWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RlcGVuZGVuY3ktZ3JhcGgvbGliL2RlcF9ncmFwaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Zhc3QtaXNudW1lcmljL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2NvbXBvbmVudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2Rmcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvZGlqa3N0cmEtYWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9kaWprc3RyYS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvZmluZC1jeWNsZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2Zsb3lkLXdhcnNoYWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvaXMtYWN5Y2xpYy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvcG9zdG9yZGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9wcmVvcmRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvcHJpbS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvdGFyamFuLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy90b3Bzb3J0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2RhdGEvcHJpb3JpdHktcXVldWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvZ3JhcGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvanNvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9sb2Rhc2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzL2Rpc3QvaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MuY2pzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvaW52YXJpYW50L2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9pcy1zdHJpbmctYmxhbmsvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sYXlvdXQtYmFzZS9sYXlvdXQtYmFzZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC5jdXJyeS9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fRGF0YVZpZXcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX0hhc2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX0xpc3RDYWNoZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fTWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19NYXBDYWNoZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fUHJvbWlzZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TZXRDYWNoZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fU3RhY2suanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1N5bWJvbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fVWludDhBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fV2Vha01hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXBwbHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5RWFjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlGaWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5SW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5SW5jbHVkZXNXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUxpa2VLZXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheU1hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlQdXNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheVJlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlTb21lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc2NpaVNpemUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Fzc2lnbk1lcmdlVmFsdWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Fzc2lnblZhbHVlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NvY0luZGV4T2YuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VBc3NpZ24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VBc3NpZ25Jbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUFzc2lnblZhbHVlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQ2xvbmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VDcmVhdGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VFYWNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRXh0cmVtdW0uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGaWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGaW5kSW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGbGF0dGVuLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRm9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRm9yT3duLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0QWxsS2V5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldFRhZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUd0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSGFzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJbmRleE9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNBcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0VxdWFsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNFcXVhbERlZXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc01hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTWF0Y2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc05hTi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTmF0aXZlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1R5cGVkQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJdGVyYXRlZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUtleXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VMdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1hdGNoZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNYXRjaGVzUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNZXJnZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1lcmdlRGVlcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU9yZGVyQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQaWNrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUGlja0J5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQcm9wZXJ0eURlZXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VSYW5nZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVJlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVJlc3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VTZXRUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNvcnRCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRpbWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VUcmltLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5hcnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VVbmlxLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVmFsdWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlWmlwT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jYWNoZUhhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2FzdEZ1bmN0aW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jYXN0UGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVBcnJheUJ1ZmZlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVCdWZmZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lRGF0YVZpZXcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lUmVnRXhwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZVN5bWJvbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVUeXBlZEFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb21wYXJlQXNjZW5kaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb21wYXJlTXVsdGlwbGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weU9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weVN5bWJvbHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlTeW1ib2xzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcmVKc0RhdGEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUFzc2lnbmVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVCYXNlRWFjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQmFzZUZvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlRmluZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlUmFuZ2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZVNldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZGVmaW5lUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2VxdWFsQXJyYXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbEJ5VGFnLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbE9iamVjdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZsYXRSZXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19mcmVlR2xvYmFsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRBbGxLZXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRBbGxLZXlzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE1hcERhdGEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE1hdGNoRGF0YS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TmF0aXZlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRQcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFJhd1RhZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0U3ltYm9scy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0U3ltYm9sc0luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRUYWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFZhbHVlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNQYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNVbmljb2RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hEZWxldGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hHZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hIYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2luaXRDbG9uZUFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pbml0Q2xvbmVCeVRhZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0ZsYXR0ZW5hYmxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0l0ZXJhdGVlQ2FsbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNLZXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzS2V5YWJsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNNYXNrZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzUHJvdG90eXBlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc1N0cmljdENvbXBhcmFibGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUNsZWFyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVEZWxldGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUdldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlSGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlRGVsZXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUdldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVIYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBUb0FycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXRjaGVzU3RyaWN0Q29tcGFyYWJsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWVtb2l6ZUNhcHBlZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbmF0aXZlQ3JlYXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVLZXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVLZXlzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25vZGVVdGlsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vYmplY3RUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlckFyZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlclJlc3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3Jvb3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NhZmVHZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlQWRkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRDYWNoZUhhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0VG9BcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0VG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3Nob3J0T3V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0NsZWFyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0RlbGV0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tHZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrSGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja1NldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RyaWN0SW5kZXhPZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RyaW5nU2l6ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RyaW5nVG9QYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL190b0tleS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fdG9Tb3VyY2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3RyaW1tZWRFbmRJbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fdW5pY29kZVNpemUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvY2xvbmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvY2xvbmVEZWVwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2NvbnN0YW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2RlZmF1bHRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2VhY2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZXEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZmlsdGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZpbmQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZmluZEluZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZsYXR0ZW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZm9yRWFjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9mb3JJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9nZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2hhc0luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lkZW50aXR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJndW1lbnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2VPYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNCdWZmZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNFbXB0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0Z1bmN0aW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzTGVuZ3RoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzTWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0TGlrZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1BsYWluT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU3ltYm9sLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1VuZGVmaW5lZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9rZXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2tleXNJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9sYXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9tYXBWYWx1ZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWF4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21lbW9pemUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWluLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21pbkJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL25vb3AuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbm93LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3BpY2suanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvcmFuZ2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvcmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3NpemUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvc29ydEJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9zdHViRmFsc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9GaW5pdGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9JbnRlZ2VyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvTnVtYmVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvUGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdHJhbnNmb3JtLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3VuaW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3VuaXF1ZUlkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC96aXBPYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJhc2UxNi1zdHlsaW5nL2xpYi9lc20vY29sb3JDb252ZXJ0ZXJzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtYmFzZTE2LXN0eWxpbmcvbGliL2VzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vSXRlbVJhbmdlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vSlNPTkFycmF5Tm9kZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0pTT05BcnJvdy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0pTT05JdGVyYWJsZU5vZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9KU09OTmVzdGVkTm9kZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0pTT05Ob2RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vSlNPTk9iamVjdE5vZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9KU09OVmFsdWVOb2RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vY3JlYXRlU3R5bGluZ0Zyb21UaGVtZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL2dldENvbGxlY3Rpb25FbnRyaWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9vYmpUeXBlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vdGhlbWVzL3NvbGFyaXplZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlZHV4LWFjdGlvbnMvZXMvY3JlYXRlQWN0aW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVkdXgtYWN0aW9ucy9lcy91dGlscy9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlZHV4LWFjdGlvbnMvZXMvdXRpbHMvaXNGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlZHV4LWFjdGlvbnMvZXMvdXRpbHMvaXNOdWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVkdXgtdGh1bmsvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWR1eC9lcy9yZWR1eC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3NpbXBsZS1zd2l6emxlL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvc2ltcGxlLXN3aXp6bGUvbm9kZV9tb2R1bGVzL2lzLWFycmF5aXNoL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9jb3JlL1Rvb2xiYXIuY3NzP2Q4MTMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0NhbGxiYWNrR3JhcGgvQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5jc3M/NThlMiIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvRnJvbnRFbmQvRnJvbnRFbmRFcnJvci5jc3M/YTkwMCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvUGVyY3kuY3NzP2FmMzgiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvRGVidWdNZW51LmNzcz82ZDU0Iiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L1Bsb3RseUNsb3VkLmNzcz85YThiIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L1ZlcnNpb25JbmZvLmNzcz9kYjIyIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltL3dpdGgtc2VsZWN0b3IuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvc2hpbS93aXRoLXNlbGVjdG9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvZXh0ZXJuYWwgd2luZG93IFwiUHJvcFR5cGVzXCIiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci9leHRlcm5hbCB3aW5kb3cgXCJSZWFjdFwiIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvZXh0ZXJuYWwgd2luZG93IFwiUmVhY3RET01cIiIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FycmF5TGlrZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheVdpdGhIb2xlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FycmF5V2l0aG91dEhvbGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2suanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2dldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL25vbkl0ZXJhYmxlUmVzdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL25vbkl0ZXJhYmxlU3ByZWFkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zZXRQcm90b3R5cGVPZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvUHJpbWl0aXZlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Qcm9wZXJ0eUtleS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYWxsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYWx3YXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYW55LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9hcHBlbmQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9hc3NvYy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2Fzc29jUGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2JpbmQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9jbG9uZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2NvbXBhcmF0b3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9jb252ZXJnZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2N1cnJ5Ti5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2RlZmF1bHRUby5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2RpZmZlcmVuY2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9kaXNzb2MuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9kaXNzb2NQYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZW1wdHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9lcXVhbHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9ldm9sdmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9maW5kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZmluZEluZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZmxhdHRlbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ZvckVhY2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9mb3JFYWNoT2JqSW5kZXhlZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2dyb3VwQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9oYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9oYXNQYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2luZGV4T2YuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnNlcnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2FyaXR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2FycmF5RnJvbUl0ZXJhdG9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2FycmF5UmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2Fzc29jLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2NoZWNrRm9yTWV0aG9kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2Nsb25lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2Nsb25lUmVnRXhwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2NvbXBsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY29uY2F0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2NyZWF0ZVJlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jdXJyeTEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY3VycnkyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2N1cnJ5My5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jdXJyeU4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2Rpc3NvYy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19lcXVhbHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fZmlsdGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2Z1bmN0aW9uTmFtZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19oYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faW5jbHVkZXNXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2luZGV4T2YuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNBcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc0FycmF5TGlrZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc0Z1bmN0aW9uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzSW50ZWdlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc09iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc1BsYWNlaG9sZGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzVHJhbnNmb3JtZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNUeXBlZEFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX21ha2VGbGF0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX21hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19udGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fb2JqZWN0QXNzaWduLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX29iamVjdElzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fcXVvdGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fcmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3JlZHVjZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fdG9JU09TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fdG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feEFycmF5UmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feGFsbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194YW55LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hmQmFzZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194ZmlsdGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hmaW5kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hmaW5kSW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feG1hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194cmVkdWNlQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feHRha2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feHVuaXFCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194d3JhcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVyc2VjdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludm9rZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2lzRW1wdHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pc05pbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2pvaW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9qdXh0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMva2V5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2xlbnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9sZW5zUGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2x0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWFwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWFwT2JqSW5kZXhlZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21heC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lbW9pemVXaXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWVyZ2VEZWVwUmlnaHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tZXJnZURlZXBXaXRoS2V5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWVyZ2VMZWZ0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWVyZ2VSaWdodC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lcmdlV2l0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lcmdlV2l0aEtleS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL29taXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9vbmNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvb3Zlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BhcnRpdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wYXRoT3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9waWNrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcGlja0J5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcGx1Y2suanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wcmVwZW5kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcHJvcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3Byb3BFcS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3Byb3BzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcmVkdWNlQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9yZWplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9yZW1vdmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9yZXZlcnNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvc2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvc2xpY2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9zb3J0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvc3RhcnRzV2l0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3Rha2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy90b1BhaXJzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy90eXBlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdW5pcS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3VuaXFCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3ZhbHVlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3ZpZXcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy96aXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy96aXBPYmouanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jeXRvc2NhcGUvZGlzdC9jeXRvc2NhcGUuZXNtLm1qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvbm9kZSBtb2R1bGUgZGVjb3JhdG9yIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ydW50aW1lL25vbmNlIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvd2hhdHdnLWZldGNoL2ZldGNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiIWZ1bmN0aW9uKGUsbil7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9bihyZXF1aXJlKFwicmVhY3RcIikpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wicmVhY3RcIl0sbik6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0c1tcImRhc2gtY29tcG9uZW50LXBsdWdpbnNcIl09bihyZXF1aXJlKFwicmVhY3RcIikpOmVbXCJkYXNoLWNvbXBvbmVudC1wbHVnaW5zXCJdPW4oZS5SZWFjdCl9KHdpbmRvdywoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPXt9O2Z1bmN0aW9uIHQocil7aWYobltyXSlyZXR1cm4gbltyXS5leHBvcnRzO3ZhciBvPW5bcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiBlW3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLHQpLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIHQubT1lLHQuYz1uLHQuZD1mdW5jdGlvbihlLG4scil7dC5vKGUsbil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4se2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sdC5yPWZ1bmN0aW9uKGUpe1widW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9LHQudD1mdW5jdGlvbihlLG4pe2lmKDEmbiYmKGU9dChlKSksOCZuKXJldHVybiBlO2lmKDQmbiYmXCJvYmplY3RcIj09dHlwZW9mIGUmJmUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKHQucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixcImRlZmF1bHRcIix7ZW51bWVyYWJsZTohMCx2YWx1ZTplfSksMiZuJiZcInN0cmluZ1wiIT10eXBlb2YgZSlmb3IodmFyIG8gaW4gZSl0LmQocixvLGZ1bmN0aW9uKG4pe3JldHVybiBlW25dfS5iaW5kKG51bGwsbykpO3JldHVybiByfSx0Lm49ZnVuY3Rpb24oZSl7dmFyIG49ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIHQuZChuLFwiYVwiLG4pLG59LHQubz1mdW5jdGlvbihlLG4pe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKX0sdC5wPVwiXCIsdCh0LnM9MSl9KFtmdW5jdGlvbihuLHQpe24uZXhwb3J0cz1lfSxmdW5jdGlvbihlLG4sdCl7XCJ1c2Ugc3RyaWN0XCI7dC5yKG4pLHQuZChuLFwiYXN5bmNEZWNvcmF0b3JcIiwoZnVuY3Rpb24oKXtyZXR1cm4gdX0pKSx0LmQobixcImluaGVyaXRBc3luY0RlY29yYXRvclwiLChmdW5jdGlvbigpe3JldHVybiBhfSkpLHQuZChuLFwiaXNSZWFkeVwiLChmdW5jdGlvbigpe3JldHVybiBjfSkpLHQuZChuLFwiSGlzdG9yeVwiLChmdW5jdGlvbigpe3JldHVybiBkfSkpO3ZhciByPXQoMCk7ZnVuY3Rpb24gbyhlLG4sdCxyLG8saSx1KXt0cnl7dmFyIGE9ZVtpXSh1KSxjPWEudmFsdWV9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgdChlKX1hLmRvbmU/bihjKTpQcm9taXNlLnJlc29sdmUoYykudGhlbihyLG8pfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcyx0PWFyZ3VtZW50cztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsaSl7dmFyIHU9ZS5hcHBseShuLHQpO2Z1bmN0aW9uIGEoZSl7byh1LHIsaSxhLGMsXCJuZXh0XCIsZSl9ZnVuY3Rpb24gYyhlKXtvKHUscixpLGEsYyxcInRocm93XCIsZSl9YSh2b2lkIDApfSkpfX12YXIgdT1mdW5jdGlvbihlLG4pe3ZhciB0LG89e2lzUmVhZHk6bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe3Q9ZX0pKSxnZXQ6T2JqZWN0KHIubGF6eSkoKGZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShuKCkpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBzZXRUaW1lb3V0KGkocmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoKGZ1bmN0aW9uIGUoKXtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9Mix0KCEwKTtjYXNlIDI6by5pc1JlYWR5PSEwO2Nhc2UgMzpjYXNlXCJlbmRcIjpyZXR1cm4gZS5zdG9wKCl9fSksZSl9KSkpLDApLGV9KSl9KSl9O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9kYXNocHJpdmF0ZV9pc0xhenlDb21wb25lbnRSZWFkeVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5pc1JlYWR5fX0pLG8uZ2V0fSxhPWZ1bmN0aW9uKGUsbil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfZGFzaHByaXZhdGVfaXNMYXp5Q29tcG9uZW50UmVhZHlcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGMobil9fSl9LGM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuX2Rhc2hwcml2YXRlX2lzTGF6eUNvbXBvbmVudFJlYWR5fTtmdW5jdGlvbiBmKGUsbil7Zm9yKHZhciB0PTA7dDxuLmxlbmd0aDt0Kyspe3ZhciByPW5bdF07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX12YXIgcz1cIl9kYXNocHJpdmF0ZV9oaXN0b3J5Y2hhbmdlXCIsZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXshZnVuY3Rpb24oZSxuKXtpZighKGUgaW5zdGFuY2VvZiBuKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLGUpfXZhciBuLHQscjtyZXR1cm4gbj1lLHI9W3trZXk6XCJkaXNwYXRjaENoYW5nZUV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24oKXt3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQocykpfX0se2tleTpcIm9uQ2hhbmdlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKHMsZSksZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIocyxlKX19fV0sKHQ9bnVsbCkmJmYobi5wcm90b3R5cGUsdCksciYmZihuLHIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLFwicHJvdG90eXBlXCIse3dyaXRhYmxlOiExfSksZX0oKX1dKX0pKTsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z0NoZWNrSWNvbiA9IHByb3BzID0+IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgd2lkdGg6IDE4LFxuICBoZWlnaHQ6IDE4LFxuICBmaWxsOiBcIm5vbmVcIixcbiAgdmlld0JveDogXCIwIDAgMTQgMTRcIlxufSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICBmaWxsOiBcIiMwNjgwMEFcIixcbiAgZmlsbE9wYWNpdHk6IDAuOCxcbiAgZDogXCJNOS44NTQgNS4xNDZhLjUuNSAwIDAgMSAwIC43MDhsLTMuNSAzLjVhLjUuNSAwIDAgMS0uNzA4IDBsLTEuNS0xLjVhLjUuNSAwIDEgMSAuNzA4LS43MDhMNiA4LjI5M2wzLjE0Ni0zLjE0N2EuNS41IDAgMCAxIC43MDggME0xMy41IDdBNi41IDYuNSAwIDEgMSA3IC41IDYuNTA3IDYuNTA3IDAgMCAxIDEzLjUgN20tMSAwQTUuNSA1LjUgMCAxIDAgNyAxMi41IDUuNTA3IDUuNTA3IDAgMCAwIDEyLjUgN1wiXG59KSkpO1xuZXhwb3J0IGRlZmF1bHQgU3ZnQ2hlY2tJY29uOyIsInZhciBfcGF0aDtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgU3ZnQ2xvY2tJY29uID0gcHJvcHMgPT4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICB2aWV3Qm94OiBcIjAgMCA1NCAyNFwiXG59LCBwcm9wcyksIF9wYXRoIHx8IChfcGF0aCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gIGZpbGw6IFwibm9uZVwiLFxuICBzdHJva2U6IFwiI2ZmZlwiLFxuICBzdHJva2VXaWR0aDogNCxcbiAgZDogXCJNMjcgMHYyMmgyMlwiXG59KSkpO1xuZXhwb3J0IGRlZmF1bHQgU3ZnQ2xvY2tJY29uOyIsInZhciBfcGF0aDtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgU3ZnQ2xvdWRTbGFzaEljb24gPSBwcm9wcyA9PiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gIHdpZHRoOiAzMixcbiAgaGVpZ2h0OiAzMixcbiAgdmlld0JveDogXCIwIDAgMjU2IDI1NlwiXG59LCBwcm9wcyksIF9wYXRoIHx8IChfcGF0aCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gIGQ6IFwiTTI0OCAxMjguNzJBODcuNzQgODcuNzQgMCAwIDEgMjIyLjQxIDE5MGE0IDQgMCAwIDEtNS43Ny0uMTZMMTAzLjc4IDY1LjY3YTQgNCAwIDAgMSAuMzktNS43NkE4Ny44MiA4Ny44MiAwIDAgMSAxNjAuODcgNDBjNDguMjguNDcgODcuNTEgNDAuNDMgODcuMTMgODguNzJNNTMuOTIgMzQuNjJhOCA4IDAgMSAwLTExLjg0IDEwLjc2bDM5LjI1IDQzLjE4LS4wNi4xMUE2NCA2NCAwIDAgMCA4IDE1M2MuNTMgMzUuMTIgMjkuODQgNjMgNjUgNjNoODdhODcuNyA4Ny43IDAgMCAwIDMxLjc4LTUuOTVsMTAuMyAxMS4zM2E4IDggMCAwIDAgMTEuMzMuNTIgOC4zMiA4LjMyIDAgMCAwIC4yOS0xMS41MlpcIlxufSkpKTtcbmV4cG9ydCBkZWZhdWx0IFN2Z0Nsb3VkU2xhc2hJY29uOyIsInZhciBfcGF0aDtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgU3ZnQ29sbGFwc2VJY29uID0gcHJvcHMgPT4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICB3aWR0aDogMTAsXG4gIGhlaWdodDogNixcbiAgZmlsbDogXCJub25lXCJcbn0sIHByb3BzKSwgX3BhdGggfHwgKF9wYXRoID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgc3Ryb2tlOiBcIiNBMkIxQzZcIixcbiAgZDogXCJtMSAxIDQgNCA0LTRcIlxufSkpKTtcbmV4cG9ydCBkZWZhdWx0IFN2Z0NvbGxhcHNlSWNvbjsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z0Vycm9ySWNvbiA9IHByb3BzID0+IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgd2lkdGg6IDMyLFxuICBoZWlnaHQ6IDMyLFxuICB2aWV3Qm94OiBcIjAgMCAyNTYgMjU2XCJcbn0sIHByb3BzKSwgX3BhdGggfHwgKF9wYXRoID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgZDogXCJNMjM2LjggMTg4LjA5IDE0OS4zNSAzNi4yMmEyNC43NiAyNC43NiAwIDAgMC00Mi43IDBMMTkuMiAxODguMDlhMjMuNTEgMjMuNTEgMCAwIDAgMCAyMy43MkEyNC4zNSAyNC4zNSAwIDAgMCA0MC41NSAyMjRoMTc0LjlhMjQuMzUgMjQuMzUgMCAwIDAgMjEuMzMtMTIuMTkgMjMuNTEgMjMuNTEgMCAwIDAgLjAyLTIzLjcybS0xMy44NyAxNS43MWE4LjUgOC41IDAgMCAxLTcuNDggNC4ySDQwLjU1YTguNSA4LjUgMCAwIDEtNy40OC00LjIgNy41OSA3LjU5IDAgMCAxIDAtNy43Mmw4Ny40NS0xNTEuODdhOC43NSA4Ljc1IDAgMCAxIDE1IDBsODcuNDUgMTUxLjg3YTcuNTkgNy41OSAwIDAgMS0uMDQgNy43Mk0xMjAgMTQ0di00MGE4IDggMCAwIDEgMTYgMHY0MGE4IDggMCAwIDEtMTYgMG0yMCAzNmExMiAxMiAwIDEgMS0xMi0xMiAxMiAxMiAwIDAgMSAxMiAxMlwiXG59KSkpO1xuZXhwb3J0IGRlZmF1bHQgU3ZnRXJyb3JJY29uOyIsInZhciBfcGF0aDtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgU3ZnRXhwYW5kID0gcHJvcHMgPT4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICB3aWR0aDogMzAsXG4gIGhlaWdodDogMzAsXG4gIGZpbGw6IFwiY3VycmVudENvbG9yXCIsXG4gIHZpZXdCb3g6IFwiMCAwIDI1NiAyNTZcIlxufSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICBkOiBcIk0yMDEuNTQgNTQuNDZBMTA0IDEwNCAwIDAgMCA1NC40NiAyMDEuNTQgMTA0IDEwNCAwIDAgMCAyMDEuNTQgNTQuNDZtLTExLjMxIDEzNS43N2E4OCA4OCAwIDEgMSAwLTEyNC40NiA4OC4xMSA4OC4xMSAwIDAgMSAwIDEyNC40Nm0tMTYuNTctODguNTdMMTQ3LjMxIDEyOGwyNi4zNSAyNi4zNGE4IDggMCAwIDEtMTEuMzIgMTEuMzJsLTMyLTMyYTggOCAwIDAgMSAwLTExLjMybDMyLTMyYTggOCAwIDAgMSAxMS4zMiAxMS4zMm0tNTYgMEw5MS4zMSAxMjhsMjYuMzUgMjYuMzRhOCA4IDAgMCAxLTExLjMyIDExLjMybC0zMi0zMmE4IDggMCAwIDEgMC0xMS4zMmwzMi0zMmE4IDggMCAwIDEgMTEuMzIgMTEuMzJcIlxufSkpKTtcbmV4cG9ydCBkZWZhdWx0IFN2Z0V4cGFuZDsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z0dyYXBoSWNvbiA9IHByb3BzID0+IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgd2lkdGg6IDMyLFxuICBoZWlnaHQ6IDMyLFxuICB2aWV3Qm94OiBcIjAgMCAyNTYgMjU2XCJcbn0sIHByb3BzKSwgX3BhdGggfHwgKF9wYXRoID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgZDogXCJNMjAwIDE1MmEzMS44NCAzMS44NCAwIDAgMC0xOS41MyA2LjY4bC0yMy4xMS0xOEEzMS42NSAzMS42NSAwIDAgMCAxNjAgMTI4YzAtLjc0IDAtMS40OC0uMDgtMi4yMWwxMy4yMy00LjQxQTMyIDMyIDAgMSAwIDE2OCAxMDRjMCAuNzQgMCAxLjQ4LjA4IDIuMjFsLTEzLjIzIDQuNDFBMzIgMzIgMCAwIDAgMTI4IDk2YTMyLjYgMzIuNiAwIDAgMC01LjI3LjQ0TDExNS44OSA4MUEzMiAzMiAwIDEgMCA5NiA4OGEzMi42IDMyLjYgMCAwIDAgNS4yNy0uNDRsNi44NCAxNS40YTMxLjkyIDMxLjkyIDAgMCAwLTguNTcgMzkuNjRsLTI1LjcxIDIyLjg0YTMyLjA2IDMyLjA2IDAgMSAwIDEwLjYzIDEybDI1LjcxLTIyLjg0YTMxLjkxIDMxLjkxIDAgMCAwIDM3LjM2LTEuMjRsMjMuMTEgMThBMzEuNjUgMzEuNjUgMCAwIDAgMTY4IDE4NGEzMiAzMiAwIDEgMCAzMi0zMm0wLTY0YTE2IDE2IDAgMSAxLTE2IDE2IDE2IDE2IDAgMCAxIDE2LTE2TTgwIDU2YTE2IDE2IDAgMSAxIDE2IDE2IDE2IDE2IDAgMCAxLTE2LTE2TTU2IDIwOGExNiAxNiAwIDEgMSAxNi0xNiAxNiAxNiAwIDAgMS0xNiAxNm01Ni04MGExNiAxNiAwIDEgMSAxNiAxNiAxNiAxNiAwIDAgMS0xNi0xNm04OCA3MmExNiAxNiAwIDEgMSAxNi0xNiAxNiAxNiAwIDAgMS0xNiAxNlwiXG59KSkpO1xuZXhwb3J0IGRlZmF1bHQgU3ZnR3JhcGhJY29uOyIsInZhciBfcGF0aDtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgU3ZnT2ZmSWNvbiA9IHByb3BzID0+IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgd2lkdGg6IDE4LFxuICBoZWlnaHQ6IDE4LFxuICBmaWxsOiBcIiNDNzNBM0FcIixcbiAgdmlld0JveDogXCIwIDAgMjU2IDI1NlwiXG59LCBwcm9wcyksIF9wYXRoIHx8IChfcGF0aCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gIGQ6IFwiTTE2NS42NiAxMDEuNjYgMTM5LjMxIDEyOGwyNi4zNSAyNi4zNGE4IDggMCAwIDEtMTEuMzIgMTEuMzJMMTI4IDEzOS4zMWwtMjYuMzQgMjYuMzVhOCA4IDAgMCAxLTExLjMyLTExLjMyTDExNi42OSAxMjhsLTI2LjM1LTI2LjM0YTggOCAwIDAgMSAxMS4zMi0xMS4zMkwxMjggMTE2LjY5bDI2LjM0LTI2LjM1YTggOCAwIDAgMSAxMS4zMiAxMS4zMk0yMzIgMTI4QTEwNCAxMDQgMCAxIDEgMTI4IDI0YTEwNC4xMSAxMDQuMTEgMCAwIDEgMTA0IDEwNG0tMTYgMGE4OCA4OCAwIDEgMC04OCA4OCA4OC4xIDg4LjEgMCAwIDAgODgtODhcIlxufSkpKTtcbmV4cG9ydCBkZWZhdWx0IFN2Z09mZkljb247IiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgU3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgQXBwQ29udGFpbmVyIGZyb20gJy4vQXBwQ29udGFpbmVyLnJlYWN0JztcbmltcG9ydCBnZXRDb25maWdGcm9tRE9NIGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IGluaXRpYWxpemVXZWJTb2NrZXQsIGRpc2Nvbm5lY3RXZWJTb2NrZXQgfSBmcm9tICcuL29ic2VydmVycy93ZWJzb2NrZXRPYnNlcnZlcic7XG5jb25zdCBBcHBQcm92aWRlciA9ICh7IGhvb2tzID0ge1xuICAgIGxheW91dF9wcmU6IG51bGwsXG4gICAgbGF5b3V0X3Bvc3Q6IG51bGwsXG4gICAgcmVxdWVzdF9wcmU6IG51bGwsXG4gICAgcmVxdWVzdF9wb3N0OiBudWxsLFxuICAgIGNhbGxiYWNrX3Jlc29sdmVkOiBudWxsLFxuICAgIHJlcXVlc3RfcmVmcmVzaF9qd3Q6IG51bGxcbn0gfSkgPT4ge1xuICAgIGNvbnN0IFt7IHN0b3JlIH1dID0gdXNlU3RhdGUoKCkgPT4gbmV3IFN0b3JlKCkpO1xuICAgIC8vIEluaXRpYWxpemUgV2ViU29ja2V0IGNvbm5lY3Rpb24gaWYgZW5hYmxlZCBvciBpZiB3ZWJzb2NrZXQgY29uZmlnIGlzIGF2YWlsYWJsZVxuICAgIC8vIChmb3IgcGVyLWNhbGxiYWNrIHdlYnNvY2tldD1UcnVlKVxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZ0Zyb21ET00oKTtcbiAgICAgICAgaWYgKGNvbmZpZy53ZWJzb2NrZXQ/LmVuYWJsZWQgfHxcbiAgICAgICAgICAgIChjb25maWcud2Vic29ja2V0Py51cmwgJiYgY29uZmlnLndlYnNvY2tldD8ud29ya2VyX3VybCkpIHtcbiAgICAgICAgICAgIC8vIEFkZCBmZXRjaCBjb25maWcgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgICAgICBjb25zdCBmdWxsQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICAgICAgICBmZXRjaDoge1xuICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW5pdGlhbGl6ZVdlYlNvY2tldChzdG9yZSwgZnVsbENvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYW51cCBvbiB1bm1vdW50XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBkaXNjb25uZWN0V2ViU29ja2V0KCk7XG4gICAgICAgIH07XG4gICAgfSwgW3N0b3JlXSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFByb3ZpZGVyLCB7IHN0b3JlOiBzdG9yZSB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEFwcENvbnRhaW5lciwgeyBob29rczogaG9va3MgfSkpKTtcbn07XG5BcHBQcm92aWRlci5wcm9wVHlwZXMgPSB7XG4gICAgaG9va3M6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgIGxheW91dF9wcmU6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICBsYXlvdXRfcG9zdDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIHJlcXVlc3RfcHJlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgcmVxdWVzdF9wb3N0OiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgY2FsbGJhY2tfcmVzb2x2ZWQ6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICByZXF1ZXN0X3JlZnJlc2hfand0OiBQcm9wVHlwZXMuZnVuY1xuICAgIH0pXG59O1xuZXhwb3J0IGRlZmF1bHQgQXBwUHJvdmlkZXI7XG4iLCJpbXBvcnQgeyBhbnksIGZpbHRlciwgbWFwLCBwYXRoIH0gZnJvbSAncmFtZGEnO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RvcmVPYnNlcnZlciB7XG4gICAgX3N0b3JlO1xuICAgIF91bnN1YnNjcmliZTtcbiAgICBfb2JzZXJ2ZXJzID0gW107XG4gICAgY29uc3RydWN0b3Ioc3RvcmUpIHtcbiAgICAgICAgdGhpcy5fX2luaXRfXyhzdG9yZSk7XG4gICAgfVxuICAgIG9ic2VydmUgPSAob2JzZXJ2ZXIsIGlucHV0cykgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG9ic2VydmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXRzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW5wdXRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWRkKG9ic2VydmVyLCBpbnB1dHMpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlKG9ic2VydmVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZChvYnNlcnZlci5vYnNlcnZlciwgb2JzZXJ2ZXIuaW5wdXRzKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHRoaXMucmVtb3ZlKG9ic2VydmVyLm9ic2VydmVyKTtcbiAgICB9O1xuICAgIHNldFN0b3JlID0gKHN0b3JlKSA9PiB7XG4gICAgICAgIHRoaXMuX19maW5hbGl6ZV9fKCk7XG4gICAgICAgIHRoaXMuX19pbml0X18oc3RvcmUpO1xuICAgIH07XG4gICAgX19maW5hbGl6ZV9fID0gKCkgPT4gdGhpcy5fdW5zdWJzY3JpYmU/LigpO1xuICAgIF9faW5pdF9fID0gKHN0b3JlKSA9PiB7XG4gICAgICAgIHRoaXMuX3N0b3JlID0gc3RvcmU7XG4gICAgICAgIGlmIChzdG9yZSkge1xuICAgICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUgPSBzdG9yZS5zdWJzY3JpYmUodGhpcy5ub3RpZnkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29ic2VydmVycy5mb3JFYWNoKG8gPT4ge1xuICAgICAgICAgICAgby5sYXN0U3RhdGUgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGFkZCA9IChvYnNlcnZlciwgaW5wdXRzKSA9PiB0aGlzLl9vYnNlcnZlcnMucHVzaCh7XG4gICAgICAgIGlucHV0UGF0aHM6IG1hcChwID0+IHAuc3BsaXQoJy4nKSwgaW5wdXRzKSxcbiAgICAgICAgbGFzdFN0YXRlOiBudWxsLFxuICAgICAgICBvYnNlcnZlcixcbiAgICAgICAgdHJpZ2dlcmVkOiBmYWxzZVxuICAgIH0pO1xuICAgIG5vdGlmeSA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLl9zdG9yZTtcbiAgICAgICAgaWYgKCFzdG9yZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgdHJpZ2dlcmVkID0gZmlsdGVyKG8gPT4gIW8udHJpZ2dlcmVkICYmXG4gICAgICAgICAgICBhbnkoaSA9PiBwYXRoKGksIHN0YXRlKSAhPT0gcGF0aChpLCBvLmxhc3RTdGF0ZSksIG8uaW5wdXRQYXRocyksIHRoaXMuX29ic2VydmVycyk7XG4gICAgICAgIHRyaWdnZXJlZC5mb3JFYWNoKG8gPT4ge1xuICAgICAgICAgICAgby50cmlnZ2VyZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgdHJpZ2dlcmVkLmZvckVhY2gobyA9PiB7XG4gICAgICAgICAgICBvLmxhc3RTdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICBvLm9ic2VydmVyKHN0b3JlKTtcbiAgICAgICAgICAgIG8udHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmVtb3ZlID0gKG9ic2VydmVyKSA9PiB0aGlzLl9vYnNlcnZlcnMuc3BsaWNlKHRoaXMuX29ic2VydmVycy5maW5kSW5kZXgobyA9PiBvYnNlcnZlciA9PT0gby5vYnNlcnZlciwgdGhpcy5fb2JzZXJ2ZXJzKSwgMSk7XG59XG4iLCJpbXBvcnQgeyBjb25jYXQsIGZsYXR0ZW4sIGludGVyc2VjdGlvbiwga2V5cywgbWFwLCBtZXJnZURlZXBSaWdodCwgcGF0aCwgcGljaywgcGx1Y2ssIHZhbHVlcywgdG9QYWlycywgemlwLCBhc3NvY1BhdGggfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBTVEFUVVMsIEpXVF9FWFBJUkVEX01FU1NBR0UgfSBmcm9tICcuLi9jb25zdGFudHMvY29uc3RhbnRzJztcbmltcG9ydCB7IE1BWF9BVVRIX1JFVFJJRVMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBDYWxsYmFja0FjdGlvblR5cGUsIENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZSB9IGZyb20gJy4uL3JlZHVjZXJzL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBpc011bHRpVmFsdWVkLCBzdHJpbmdpZnlJZCwgaXNNdWx0aU91dHB1dFByb3AgfSBmcm9tICcuL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyB1cmxCYXNlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBnZXRDU1JGSGVhZGVyLCBkaXNwYXRjaEVycm9yLCBzZXRQYXRocyB9IGZyb20gJy4nO1xuaW1wb3J0IHsgY3JlYXRlQWN0aW9uIH0gZnJvbSAncmVkdXgtYWN0aW9ucyc7XG5pbXBvcnQgeyBhZGRIdHRwSGVhZGVycyB9IGZyb20gJy4uL2FjdGlvbnMnO1xuaW1wb3J0IHsgbm90aWZ5T2JzZXJ2ZXJzLCB1cGRhdGVQcm9wcyB9IGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IHsgcGFyc2VQYXRjaFByb3BzIH0gZnJvbSAnLi9wYXRjaCc7XG5pbXBvcnQgeyBjb21wdXRlUGF0aHMsIGdldFBhdGggfSBmcm9tICcuL3BhdGhzJztcbmltcG9ydCB7IHJlcXVlc3REZXBlbmRlbmNpZXMgfSBmcm9tICcuL3JlcXVlc3REZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHsgbG9hZExpYnJhcnkgfSBmcm9tICcuLi91dGlscy9saWJyYXJpZXMnO1xuaW1wb3J0IHsgcGFyc2VQTUNJZCB9IGZyb20gJy4vcGF0dGVybk1hdGNoaW5nJztcbmltcG9ydCB7IHJlcGxhY2VQTUMgfSBmcm9tICcuL3BhdHRlcm5NYXRjaGluZyc7XG5pbXBvcnQgeyBsb2FkZWQsIGxvYWRpbmcgfSBmcm9tICcuL2xvYWRpbmcnO1xuaW1wb3J0IHsgZ2V0Q29tcG9uZW50TGF5b3V0IH0gZnJvbSAnLi4vd3JhcHBlci93cmFwcGluZyc7XG5pbXBvcnQgeyBnZXRXb3JrZXJDbGllbnQsIGlzV2ViU29ja2V0RW5hYmxlZCwgaXNXZWJTb2NrZXRBdmFpbGFibGUgfSBmcm9tICcuLi91dGlscy93b3JrZXJDbGllbnQnO1xuZXhwb3J0IGNvbnN0IGFkZEJsb2NrZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEJsb2NrZWQpO1xuZXhwb3J0IGNvbnN0IGFkZENvbXBsZXRlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGUuQWRkQ29tcGxldGVkKTtcbmV4cG9ydCBjb25zdCBhZGRFeGVjdXRlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuQWRkRXhlY3V0ZWQpO1xuZXhwb3J0IGNvbnN0IGFkZEV4ZWN1dGluZ0NhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuQWRkRXhlY3V0aW5nKTtcbmV4cG9ydCBjb25zdCBhZGRQcmlvcml0aXplZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuQWRkUHJpb3JpdGl6ZWQpO1xuZXhwb3J0IGNvbnN0IGFkZFJlcXVlc3RlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuQWRkUmVxdWVzdGVkKTtcbmV4cG9ydCBjb25zdCBhZGRTdG9yZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFN0b3JlZCk7XG5leHBvcnQgY29uc3QgYWRkV2F0Y2hlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuQWRkV2F0Y2hlZCk7XG5leHBvcnQgY29uc3QgcmVtb3ZlRXhlY3V0ZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUV4ZWN1dGVkKTtcbmV4cG9ydCBjb25zdCByZW1vdmVCbG9ja2VkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVCbG9ja2VkKTtcbmV4cG9ydCBjb25zdCByZW1vdmVFeGVjdXRpbmdDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUV4ZWN1dGluZyk7XG5leHBvcnQgY29uc3QgcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVByaW9yaXRpemVkKTtcbmV4cG9ydCBjb25zdCByZW1vdmVSZXF1ZXN0ZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVJlcXVlc3RlZCk7XG5leHBvcnQgY29uc3QgcmVtb3ZlU3RvcmVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVTdG9yZWQpO1xuZXhwb3J0IGNvbnN0IHJlbW92ZVdhdGNoZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVdhdGNoZWQpO1xuZXhwb3J0IGNvbnN0IGFnZ3JlZ2F0ZUNhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGUuQWdncmVnYXRlKTtcbmNvbnN0IHVwZGF0ZVJlc291cmNlVXNhZ2UgPSBjcmVhdGVBY3Rpb24oJ1VQREFURV9SRVNPVVJDRV9VU0FHRScpO1xuY29uc3QgYWRkQ2FsbGJhY2tKb2IgPSBjcmVhdGVBY3Rpb24oJ0FERF9DQUxMQkFDS19KT0InKTtcbmNvbnN0IHJlbW92ZUNhbGxiYWNrSm9iID0gY3JlYXRlQWN0aW9uKCdSRU1PVkVfQ0FMTEJBQ0tfSk9CJyk7XG5jb25zdCBzZXRDYWxsYmFja0pvYk91dGRhdGVkID0gY3JlYXRlQWN0aW9uKCdDQUxMQkFDS19KT0JfT1VUREFURUQnKTtcbmZ1bmN0aW9uIHVud3JhcElmTm90TXVsdGkocGF0aHMsIGlkUHJvcHMsIHNwZWMsIGFueVZhbHMsIGRlcFR5cGUpIHtcbiAgICBsZXQgbXNnID0gJyc7XG4gICAgaWYgKGlzTXVsdGlWYWx1ZWQoc3BlYykpIHtcbiAgICAgICAgcmV0dXJuIFtpZFByb3BzLCBtc2ddO1xuICAgIH1cbiAgICBpZiAoaWRQcm9wcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgaWYgKCFpZFByb3BzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHNwZWMuYWxsb3dfb3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICBpZFByb3BzID0gW3sgLi4uc3BlYywgdmFsdWU6IG51bGwgfV07XG4gICAgICAgICAgICAgICAgbXNnID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1N0ciA9IHR5cGVvZiBzcGVjLmlkID09PSAnc3RyaW5nJztcbiAgICAgICAgICAgICAgICBtc2cgPVxuICAgICAgICAgICAgICAgICAgICAnQSBub25leGlzdGVudCBvYmplY3Qgd2FzIHVzZWQgaW4gYW4gYCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVwVHlwZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnYCBvZiBhIERhc2ggY2FsbGJhY2suIFRoZSBpZCBvZiB0aGlzIG9iamVjdCBpcyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChpc1N0clxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2AnICsgc3BlYy5pZCArICdgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkoc3BlYy5pZCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW55VmFscyA/ICcgd2l0aCBNQVRDSCB2YWx1ZXMgJyArIGFueVZhbHMgOiAnJykpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgYW5kIHRoZSBwcm9wZXJ0eSBpcyBgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjLnByb3BlcnR5ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChpc1N0clxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2AuIFRoZSBzdHJpbmcgaWRzIGluIHRoZSBjdXJyZW50IGxheW91dCBhcmU6IFsnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyhwYXRocy5zdHJzKS5qb2luKCcsICcpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ10nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnYC4gVGhlIHdpbGRjYXJkIGlkcyBjdXJyZW50bHkgYXZhaWxhYmxlIGFyZSBsb2dnZWQgYWJvdmUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBtc2cgPVxuICAgICAgICAgICAgICAgICdNdWx0aXBsZSBvYmplY3RzIHdlcmUgZm91bmQgZm9yIGFuIGAnICtcbiAgICAgICAgICAgICAgICAgICAgZGVwVHlwZSArXG4gICAgICAgICAgICAgICAgICAgICdgIG9mIGEgY2FsbGJhY2sgdGhhdCBvbmx5IHRha2VzIG9uZSB2YWx1ZS4gVGhlIGlkIHNwZWMgaXMgJyArXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHNwZWMuaWQpICtcbiAgICAgICAgICAgICAgICAgICAgKGFueVZhbHMgPyAnIHdpdGggTUFUQ0ggdmFsdWVzICcgKyBhbnlWYWxzIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgJyBhbmQgdGhlIHByb3BlcnR5IGlzIGAnICtcbiAgICAgICAgICAgICAgICAgICAgc3BlYy5wcm9wZXJ0eSArXG4gICAgICAgICAgICAgICAgICAgICdgLiBUaGUgb2JqZWN0cyB3ZSBmb3VuZCBhcmU6ICcgK1xuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShtYXAocGljayhbJ2lkJywgJ3Byb3BlcnR5J10pLCBpZFByb3BzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtpZFByb3BzWzBdLCBtc2ddO1xufVxuZnVuY3Rpb24gZmlsbFZhbHMocGF0aHMsIGxheW91dCwgY2IsIHNwZWNzLCBkZXBUeXBlLCBhbGxvd0FsbE1pc3NpbmcgPSBmYWxzZSkge1xuICAgIGNvbnN0IGdldHRlciA9IGRlcFR5cGUgPT09ICdJbnB1dCcgPyBjYi5nZXRJbnB1dHMgOiBjYi5nZXRTdGF0ZTtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBsZXQgZW1wdHlNdWx0aVZhbHVlcyA9IDA7XG4gICAgY29uc3QgaW5wdXRWYWxzID0gZ2V0dGVyKHBhdGhzKS5tYXAoKGlucHV0TGlzdCwgaSkgPT4ge1xuICAgICAgICBjb25zdCBbaW5wdXRzLCBpbnB1dEVycm9yXSA9IHVud3JhcElmTm90TXVsdGkocGF0aHMsIGlucHV0TGlzdC5tYXAoKHsgaWQsIHByb3BlcnR5LCBwYXRoOiBwYXRoXyB9KSA9PiAoe1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIHZhbHVlOiBwYXRoKFsuLi5wYXRoXywgJ3Byb3BzJywgcHJvcGVydHldLCBsYXlvdXQpXG4gICAgICAgIH0pKSwgc3BlY3NbaV0sIGNiLmFueVZhbHMsIGRlcFR5cGUpO1xuICAgICAgICBpZiAoaXNNdWx0aVZhbHVlZChzcGVjc1tpXSkgJiYgIWlucHV0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVtcHR5TXVsdGlWYWx1ZXMrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXRFcnJvcikge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goaW5wdXRFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlucHV0cztcbiAgICB9KTtcbiAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICBpZiAoYWxsb3dBbGxNaXNzaW5nICYmXG4gICAgICAgICAgICBlcnJvcnMubGVuZ3RoICsgZW1wdHlNdWx0aVZhbHVlcyA9PT0gaW5wdXRWYWxzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSBhdCBsZWFzdCBvbmUgbm9uLW11bHRpdmFsdWVkIGlucHV0LCBidXQgYWxsIHNpbXBsZSBhbmRcbiAgICAgICAgICAgIC8vIG11bHRpLXZhbHVlZCBpbnB1dHMgYXJlIG1pc3NpbmcuXG4gICAgICAgICAgICAvLyAoaWYgYWxsIGlucHV0cyBhcmUgbXVsdGl2YWx1ZWQgYW5kIGFsbCBtaXNzaW5nIHdlIHN0aWxsIHJldHVyblxuICAgICAgICAgICAgLy8gdGhlbSBhcyBub3JtYWwsIGFuZCBmaXJlIHRoZSBjYWxsYmFjay4pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSB3ZSBoYXZlIHNvbWUgbWlzc2luZyBhbmQgc29tZSBwcmVzZW50IGlucHV0cy5cbiAgICAgICAgLy8gT3IgYWxsIG1pc3NpbmcgaW4gYSBjb250ZXh0IHRoYXQgZG9lc24ndCBhbGxvdyB0aGlzLlxuICAgICAgICAvLyBUaGF0J3MgYSByZWFsIHByb2JsZW0sIHNvIHRocm93IHRoZSBmaXJzdCBtZXNzYWdlIGFzIGFuIGVycm9yLlxuICAgICAgICByZWZFcnIoZXJyb3JzLCBwYXRocyk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dFZhbHM7XG59XG5mdW5jdGlvbiByZWZFcnIoZXJyb3JzLCBwYXRocykge1xuICAgIGNvbnN0IGVyciA9IGVycm9yc1swXTtcbiAgICBpZiAoZXJyLmluZGV4T2YoJ2xvZ2dlZCBhYm92ZScpICE9PSAtMSkge1xuICAgICAgICAvLyBXaWxkY2FyZCByZWZlcmVuY2UgZXJyb3JzIG1lbnRpb24gYSBsaXN0IG9mIHdpbGRjYXJkIHNwZWNzIGxvZ2dlZFxuICAgICAgICAvLyBUT0RPOiB1bndyYXBwZWQgbGlzdCBvZiB3aWxkY2FyZCBpZHM/XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IocGF0aHMub2Jqcyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihlcnIpO1xufVxuY29uc3QgZ2V0VmFscyA9IChpbnB1dCkgPT4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBwbHVjaygndmFsdWUnLCBpbnB1dCkgOiBpbnB1dC52YWx1ZTtcbmNvbnN0IHppcElmQXJyYXkgPSAoYSwgYikgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICAgIC8vIEZvciBjbGllbnQtc2lkZSBjYWxsYmFja3Mgd2l0aCBtdWx0aXBsZSBPdXRwdXRzLCBvbmx5IHJldHVybiBhIHNpbmdsZSBkYXNoX2NsaWVudHNpZGUubm9fdXBkYXRlXG4gICAgICAgIGlmIChiID09PSB3aW5kb3cuZGFzaF9jbGllbnRzaWRlLm5vX3VwZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHppcChhLCBbYl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB6aXAoYSwgYik7XG4gICAgfVxuICAgIHJldHVybiBbW2EsIGJdXTtcbn07XG5mdW5jdGlvbiBjbGVhbk91dHB1dFByb3AocHJvcGVydHkpIHtcbiAgICByZXR1cm4gcHJvcGVydHkuc3BsaXQoJ0AnKVswXTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNsaWVudHNpZGUoZGlzcGF0Y2gsIGNsaWVudHNpZGVfZnVuY3Rpb24sIGNvbmZpZywgcGF5bG9hZCkge1xuICAgIGNvbnN0IGRjID0gKHdpbmRvdy5kYXNoX2NsaWVudHNpZGUgPVxuICAgICAgICB3aW5kb3cuZGFzaF9jbGllbnRzaWRlIHx8IHt9KTtcbiAgICBpZiAoIWRjLm5vX3VwZGF0ZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGMsICdub191cGRhdGUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogeyBkZXNjcmlwdGlvbjogJ1JldHVybiB0byBwcmV2ZW50IHVwZGF0aW5nIGFuIE91dHB1dC4nIH0sXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYywgJ1ByZXZlbnRVcGRhdGUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogeyBkZXNjcmlwdGlvbjogJ1Rocm93IHRvIHByZXZlbnQgdXBkYXRpbmcgYWxsIE91dHB1dHMuJyB9LFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7IGlucHV0cywgb3V0cHV0cywgc3RhdGUgfSA9IHBheWxvYWQ7XG4gICAgY29uc3QgcmVxdWVzdFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGlucHV0RGljdCA9IGlucHV0c1RvRGljdChpbnB1dHMpO1xuICAgIGNvbnN0IHN0YXRlRGljdCA9IGlucHV0c1RvRGljdChzdGF0ZSk7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgbGV0IHN0YXR1cyA9IFNUQVRVUy5PSztcbiAgICB0cnkge1xuICAgICAgICBjb25zdCB7IG5hbWVzcGFjZSwgZnVuY3Rpb25fbmFtZSB9ID0gY2xpZW50c2lkZV9mdW5jdGlvbjtcbiAgICAgICAgbGV0IGFyZ3MgPSBpbnB1dHMubWFwKGdldFZhbHMpO1xuICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICAgIGFyZ3MgPSBjb25jYXQoYXJncywgc3RhdGUubWFwKGdldFZhbHMpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXR1cCBjYWxsYmFjayBjb250ZXh0XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQgPSB7fTtcbiAgICAgICAgZGMuY2FsbGJhY2tfY29udGV4dC50cmlnZ2VyZWQgPSBwYXlsb2FkLmNoYW5nZWRQcm9wSWRzLm1hcChwcm9wX2lkID0+ICh7XG4gICAgICAgICAgICBwcm9wX2lkOiBwcm9wX2lkLFxuICAgICAgICAgICAgdmFsdWU6IGlucHV0RGljdFtwcm9wX2lkXVxuICAgICAgICB9KSk7XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQudHJpZ2dlcmVkX2lkID0gZ2V0VHJpZ2dlcmVkSWQocGF5bG9hZC5jaGFuZ2VkUHJvcElkcyk7XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQuaW5wdXRzX2xpc3QgPSBpbnB1dHM7XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQuaW5wdXRzID0gaW5wdXREaWN0O1xuICAgICAgICBkYy5jYWxsYmFja19jb250ZXh0LnN0YXRlc19saXN0ID0gc3RhdGU7XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQuc3RhdGVzID0gc3RhdGVEaWN0O1xuICAgICAgICBkYy5jYWxsYmFja19jb250ZXh0Lm91dHB1dHNfbGlzdCA9IG91dHB1dHM7XG4gICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IGRjW25hbWVzcGFjZV1bZnVuY3Rpb25fbmFtZV0oLi4uYXJncyk7XG4gICAgICAgIGRlbGV0ZSBkYy5jYWxsYmFja19jb250ZXh0O1xuICAgICAgICBpZiAodHlwZW9mIHJldHVyblZhbHVlPy50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm5WYWx1ZSA9IGF3YWl0IHJldHVyblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdXRwdXRzKSB7XG4gICAgICAgICAgICB6aXBJZkFycmF5KG91dHB1dHMsIHJldHVyblZhbHVlKS5mb3JFYWNoKChbb3V0aSwgcmV0aV0pID0+IHtcbiAgICAgICAgICAgICAgICB6aXBJZkFycmF5KG91dGksIHJldGkpLmZvckVhY2goKFtvdXRpaiwgcmV0aWpdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaWQsIHByb3BlcnR5IH0gPSBvdXRpajtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWRTdHIgPSBzdHJpbmdpZnlJZChpZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFGb3JJZCA9IChyZXN1bHRbaWRTdHJdID0gcmVzdWx0W2lkU3RyXSB8fCB7fSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXRpaiAhPT0gZGMubm9fdXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhRm9ySWRbY2xlYW5PdXRwdXRQcm9wKHByb3BlcnR5KV0gPSByZXRpajtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgPT09IGRjLlByZXZlbnRVcGRhdGUpIHtcbiAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVUy5QUkVWRU5UX1VQREFURTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVUy5DTElFTlRTSURFX0VSUk9SO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgZGVsZXRlIGRjLmNhbGxiYWNrX2NvbnRleHQ7XG4gICAgICAgIC8vIFNldHRpbmcgc2VydmVyID0gY2xpZW50IGZvcmNlcyBuZXR3b3JrID0gMFxuICAgICAgICBjb25zdCB0b3RhbFRpbWUgPSBEYXRlLm5vdygpIC0gcmVxdWVzdFRpbWU7XG4gICAgICAgIGNvbnN0IHJlc291cmNlcyA9IHtcbiAgICAgICAgICAgIF9fZGFzaF9zZXJ2ZXI6IHRvdGFsVGltZSxcbiAgICAgICAgICAgIF9fZGFzaF9jbGllbnQ6IHRvdGFsVGltZSxcbiAgICAgICAgICAgIF9fZGFzaF91cGxvYWQ6IDAsXG4gICAgICAgICAgICBfX2Rhc2hfZG93bmxvYWQ6IDBcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNvbmZpZy51aSkge1xuICAgICAgICAgICAgZGlzcGF0Y2godXBkYXRlUmVzb3VyY2VVc2FnZSh7XG4gICAgICAgICAgICAgICAgaWQ6IHBheWxvYWQub3V0cHV0LFxuICAgICAgICAgICAgICAgIHVzYWdlOiByZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdXBkYXRlQ29tcG9uZW50KGNvbXBvbmVudF9pZCwgcHJvcHMsIGNiKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICAgICAgY29uc3QgeyBwYXRocywgY29uZmlnIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRQYXRoID0gZ2V0UGF0aChwYXRocywgY29tcG9uZW50X2lkKTtcbiAgICAgICAgaWYgKCFjb21wb25lbnRQYXRoKSB7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5zdXBwcmVzc19jYWxsYmFja19leGNlcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcihkaXNwYXRjaCkoJ0lEIHJ1bm5pbmcgY29tcG9uZW50IG5vdCBmb3VuZCBpbiBsYXlvdXQnLCBbXG4gICAgICAgICAgICAgICAgICAgICdDb21wb25lbnQgZGVmaW5lZCBpbiBydW5uaW5nIGtleXdvcmQgbm90IGZvdW5kIGluIGxheW91dC4nLFxuICAgICAgICAgICAgICAgICAgICBgQ29tcG9uZW50IGlkOiBcIiR7c3RyaW5naWZ5SWQoY29tcG9uZW50X2lkKX1cImAsXG4gICAgICAgICAgICAgICAgICAgICdUaGlzIElEIHdhcyB1c2VkIGluIHRoZSBjYWxsYmFjayhzKSBmb3IgT3V0cHV0KHMpOicsXG4gICAgICAgICAgICAgICAgICAgIGAke2NiLm91dHB1dH1gLFxuICAgICAgICAgICAgICAgICAgICAnWW91IGNhbiBzdXBwcmVzcyB0aGlzIGV4Y2VwdGlvbiBieSBzZXR0aW5nJyxcbiAgICAgICAgICAgICAgICAgICAgJ2BzdXBwcmVzc19jYWxsYmFja19leGNlcHRpb25zPVRydWVgLidcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gc3RvcCBmdXJ0aGVyIHByb2Nlc3NpbmcgYmVjYXVzZSBmdW5jdGlvbnMgZnVydGhlciBvblxuICAgICAgICAgICAgLy8gY2FuJ3Qgb3BlcmF0ZSBvbiBhbiAndW5kZWZpbmVkJyBvYmplY3QsIGFuZCB0aGV5IHdpbGwgdGhyb3cgYW5cbiAgICAgICAgICAgIC8vIGVycm9yLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRpc3BhdGNoKHVwZGF0ZVByb3BzKHtcbiAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgaXRlbXBhdGg6IGNvbXBvbmVudFBhdGgsXG4gICAgICAgICAgICByZW5kZXJUeXBlOiAnY2FsbGJhY2snXG4gICAgICAgIH0pKTtcbiAgICAgICAgZGlzcGF0Y2gobm90aWZ5T2JzZXJ2ZXJzKHsgaWQ6IGNvbXBvbmVudF9pZCwgcHJvcHMgfSkpO1xuICAgIH07XG59XG4vKipcbiAqIFVwZGF0ZSBhIGNvbXBvbmVudCBwcm9wcyB3aXRoIGBydW5uaW5nYC9gcHJvZ3Jlc3NgL2BzZXRfcHJvcHNgIGNhbGxzLlxuICpcbiAqIEBwYXJhbSBvdXRwdXRzIFByb3BzIHRvIHVwZGF0ZS5cbiAqIEBwYXJhbSBjYiBUaGUgb3JpZ2luYXRpbmcgY2FsbGJhY2sgaW5mby5cbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIHNpZGVVcGRhdGUob3V0cHV0cywgY2IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGRpc3BhdGNoLCBnZXRTdGF0ZSkge1xuICAgICAgICB0b1BhaXJzKG91dHB1dHMpXG4gICAgICAgICAgICAucmVkdWNlKChhY2MsIFtpZCwgdmFsdWVdLCBpKSA9PiB7XG4gICAgICAgICAgICBsZXQgY29tcG9uZW50SWQgPSBpZCwgcHJvcE5hbWUsIHJlcGxhY2VkSWRzID0gW107XG4gICAgICAgICAgICBpZiAoaWQuc3RhcnRzV2l0aCgneycpKSB7XG4gICAgICAgICAgICAgICAgW2NvbXBvbmVudElkLCBwcm9wTmFtZV0gPSBwYXJzZVBNQ0lkKGlkKTtcbiAgICAgICAgICAgICAgICByZXBsYWNlZElkcyA9IHJlcGxhY2VQTUMoY29tcG9uZW50SWQsIGNiLCBpLCBnZXRTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpZC5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICAgICAgW2NvbXBvbmVudElkLCBwcm9wTmFtZV0gPSBpZC5zcGxpdCgnLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBwcm9wTmFtZSA/IHsgW3Byb3BOYW1lXTogdmFsdWUgfSA6IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHJlcGxhY2VkSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGFjYy5wdXNoKFtjb21wb25lbnRJZCwgcHJvcHNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlcGxhY2VkSWRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGFjYy5wdXNoKFtyZXBsYWNlZElkc1swXSwgcHJvcHNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlcGxhY2VkSWRzLmZvckVhY2goKHJlcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhY2MucHVzaChbcmVwLCBwcm9wc10pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10pXG4gICAgICAgICAgICAuZm9yRWFjaCgoW2lkLCBpZFByb3BzXSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50UGF0aCA9IGdldFBhdGgoc3RhdGUucGF0aHMsIGlkKTtcbiAgICAgICAgICAgIGxldCBvbGRDb21wb25lbnQgPSB7IHByb3BzOiB7fSB9O1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudFBhdGgpIHtcbiAgICAgICAgICAgICAgICBvbGRDb21wb25lbnQgPSBnZXRDb21wb25lbnRMYXlvdXQoY29tcG9uZW50UGF0aCwgc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2xkUHJvcHMgPSBvbGRDb21wb25lbnQ/LnByb3BzIHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgcGF0Y2hlZFByb3BzID0gcGFyc2VQYXRjaFByb3BzKGlkUHJvcHMsIG9sZFByb3BzKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKHVwZGF0ZUNvbXBvbmVudChpZCwgcGF0Y2hlZFByb3BzLCBjYikpO1xuICAgICAgICAgICAgaWYgKCFjb21wb25lbnRQYXRoKSB7XG4gICAgICAgICAgICAgICAgLy8gQ29tcG9uZW50IGRvZXNuJ3QgZXhpc3QsIGRvZXNuJ3QgbWF0dGVyIGp1c3QgYWxsb3cgdGhlXG4gICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgdG8gY29udGludWUuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzcGF0Y2goc2V0UGF0aHMoY29tcHV0ZVBhdGhzKHtcbiAgICAgICAgICAgICAgICAuLi5vbGRDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgcHJvcHM6IHsgLi4ub2xkQ29tcG9uZW50LnByb3BzLCAuLi5wYXRjaGVkUHJvcHMgfVxuICAgICAgICAgICAgfSwgWy4uLmNvbXBvbmVudFBhdGhdLCBzdGF0ZS5wYXRocywgc3RhdGUucGF0aHMuZXZlbnRzKSkpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gaGFuZGxlU2VydmVyc2lkZShkaXNwYXRjaCwgaG9va3MsIGNvbmZpZywgcGF5bG9hZCwgYmFja2dyb3VuZCwgYWRkaXRpb25hbEFyZ3MsIGdldFN0YXRlLCBydW5uaW5nKSB7XG4gICAgaWYgKGhvb2tzLnJlcXVlc3RfcHJlKSB7XG4gICAgICAgIGhvb2tzLnJlcXVlc3RfcHJlKHBheWxvYWQpO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuICAgIGxldCBjYWNoZUtleTtcbiAgICBsZXQgam9iO1xuICAgIGxldCBydW5uaW5nT2ZmO1xuICAgIGxldCBwcm9ncmVzc0RlZmF1bHQ7XG4gICAgbGV0IG1vcmVBcmdzID0gYWRkaXRpb25hbEFyZ3M7XG4gICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgZGlzcGF0Y2goc2lkZVVwZGF0ZShydW5uaW5nLnJ1bm5pbmcsIHBheWxvYWQpKTtcbiAgICAgICAgcnVubmluZ09mZiA9IHJ1bm5pbmcucnVubmluZ09mZjtcbiAgICB9XG4gICAgY29uc3QgZmV0Y2hDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGdldENTUkZIZWFkZXIoY29uZmlnKTtcbiAgICAgICAgbGV0IHVybCA9IGAke3VybEJhc2UoY29uZmlnKX1fZGFzaC11cGRhdGUtY29tcG9uZW50YDtcbiAgICAgICAgbGV0IG5ld0JvZHkgPSBib2R5O1xuICAgICAgICBjb25zdCBhZGRBcmcgPSAobmFtZSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIGxldCBkZWxpbSA9ICc/JztcbiAgICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJz8nKSkge1xuICAgICAgICAgICAgICAgIGRlbGltID0gJyYnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXJsID0gYCR7dXJsfSR7ZGVsaW19JHtuYW1lfT0ke3ZhbHVlfWA7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChjYWNoZUtleSB8fCBqb2IpIHtcbiAgICAgICAgICAgIGlmIChjYWNoZUtleSlcbiAgICAgICAgICAgICAgICBhZGRBcmcoJ2NhY2hlS2V5JywgY2FjaGVLZXkpO1xuICAgICAgICAgICAgaWYgKGpvYilcbiAgICAgICAgICAgICAgICBhZGRBcmcoJ2pvYicsIGpvYik7XG4gICAgICAgICAgICAvLyBjbGVhciBpbnB1dHMgYXMgYmFja2dyb3VuZCBjYWxsYmFjayBkb2VzbnQgbmVlZCBpbnB1dHMsIGp1c3QgdmVyaWZ5IGZvciBjb250ZXh0XG4gICAgICAgICAgICBjb25zdCB0bXBCb2R5ID0gSlNPTi5wYXJzZShuZXdCb2R5KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG1wQm9keS5pbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0bXBCb2R5LmlucHV0c1tpXVsndmFsdWUnXSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICh0bXBCb2R5Py5zdGF0ZSB8fCBbXSkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0bXBCb2R5LnN0YXRlW2ldWyd2YWx1ZSddID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0JvZHkgPSBKU09OLnN0cmluZ2lmeSh0bXBCb2R5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9yZUFyZ3MpIHtcbiAgICAgICAgICAgIG1vcmVBcmdzLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4gYWRkQXJnKGtleSwgdmFsdWUpKTtcbiAgICAgICAgICAgIG1vcmVBcmdzID0gbW9yZUFyZ3MuZmlsdGVyKChbXywgX18sIHNpbmdsZV0pID0+ICFzaW5nbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmZXRjaCh1cmwsIG1lcmdlRGVlcFJpZ2h0KGNvbmZpZy5mZXRjaCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgYm9keTogbmV3Qm9keVxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVPdXRwdXQgPSAocmVzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHN0YXR1cyB9ID0gcmVzO1xuICAgICAgICAgICAgaWYgKGpvYikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrSm9iID0gZ2V0U3RhdGUoKS5jYWxsYmFja0pvYnNbam9iXTtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tKb2I/Lm91dGRhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHJlbW92ZUNhbGxiYWNrSm9iKHsgam9iSWQ6IGpvYiB9KSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHt9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiByZWNvcmRQcm9maWxlKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcudWkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsbGJhY2sgcHJvZmlsaW5nIC0gb25seSByZWxldmFudCBpZiB3ZSdyZSBzaG93aW5nIHRoZSBkZWJ1ZyB1aVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfc2VydmVyOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX2NsaWVudDogRGF0ZS5ub3coKSAtIHJlcXVlc3RUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX3VwbG9hZDogYm9keS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfZG93bmxvYWQ6IE51bWJlcihyZXMuaGVhZGVycy5nZXQoJ0NvbnRlbnQtTGVuZ3RoJykpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWluZ0hlYWRlcnMgPSByZXMuaGVhZGVycy5nZXQoJ1NlcnZlci1UaW1pbmcnKSB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgdGltaW5nSGVhZGVycy5zcGxpdCgnLCcpLmZvckVhY2goKGhlYWRlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGhlYWRlci5zcGxpdCgnOycpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHVyID0gaGVhZGVyLm1hdGNoKC87ZHVyPVswLTkuXSsvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXNbbmFtZV0gPSBOdW1iZXIoZHVyWzBdLnNsaWNlKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHVwZGF0ZVJlc291cmNlVXNhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHBheWxvYWQub3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2U6IHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0czogcGF5bG9hZC5pbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTogcGF5bG9hZC5zdGF0ZVxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmluaXNoTGluZSA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBtdWx0aSwgcmVzcG9uc2UgfSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgaWYgKGhvb2tzLnJlcXVlc3RfcG9zdCkge1xuICAgICAgICAgICAgICAgICAgICBob29rcy5yZXF1ZXN0X3Bvc3QocGF5bG9hZCwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChtdWx0aSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgb3V0cHV0IH0gPSBwYXlsb2FkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IG91dHB1dC5zdWJzdHIoMCwgb3V0cHV0Lmxhc3RJbmRleE9mKCcuJykpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7IFtpZF06IHJlc3BvbnNlLnByb3BzIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlY29yZFByb2ZpbGUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgY29tcGxldGVKb2IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGpvYikge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChyZW1vdmVDYWxsYmFja0pvYih7IGpvYklkOiBqb2IgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocnVubmluZ09mZikge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKHJ1bm5pbmdPZmYsIHBheWxvYWQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKHByb2dyZXNzRGVmYXVsdCwgcGF5bG9hZCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSBTVEFUVVMuT0spIHtcbiAgICAgICAgICAgICAgICByZXMuanNvbigpLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWNoZUtleSAmJiBkYXRhLmNhY2hlS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUtleSA9IGRhdGEuY2FjaGVLZXk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFqb2IgJiYgZGF0YS5qb2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpvYkluZm8gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iSWQ6IGRhdGEuam9iLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5OiBkYXRhLmNhY2hlS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbElucHV0czogZGF0YS5jYW5jZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NEZWZhdWx0OiBkYXRhLnByb2dyZXNzRGVmYXVsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQub3V0cHV0cylcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChhZGRDYWxsYmFja0pvYihqb2JJbmZvKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBqb2IgPSBkYXRhLmpvYjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zaWRlVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKGRhdGEuc2lkZVVwZGF0ZSwgcGF5bG9hZCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKGRhdGEucHJvZ3Jlc3MsIHBheWxvYWQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2dyZXNzRGVmYXVsdCAmJiBkYXRhLnByb2dyZXNzRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NEZWZhdWx0ID0gZGF0YS5wcm9ncmVzc0RlZmF1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiYWNrZ3JvdW5kIHx8IGRhdGEucmVzcG9uc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZGlzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGRhdGEuZGlzdC5tYXAobG9hZExpYnJhcnkpKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVKb2IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoTGluZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlSm9iKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoTGluZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvbGwgY2hhaW4uXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGhhbmRsZSwgYmFja2dyb3VuZC5pbnRlcnZhbCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBiYWNrZ3JvdW5kLmludGVydmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA1MDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzdGF0dXMgPT09IFNUQVRVUy5QUkVWRU5UX1VQREFURSkge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlSm9iKCk7XG4gICAgICAgICAgICAgICAgcmVjb3JkUHJvZmlsZSh7fSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZUpvYigpO1xuICAgICAgICAgICAgICAgIHJlamVjdChyZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBoYW5kbGVFcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChjb25maWcudWkpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVSZXNvdXJjZVVzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHBheWxvYWQub3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFNUQVRVUy5OT19SRVNQT05TRSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBwYXlsb2FkLmlucHV0cyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHBheWxvYWQuc3RhdGVcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdDYWxsYmFjayBmYWlsZWQ6IHRoZSBzZXJ2ZXIgZGlkIG5vdCByZXNwb25kLicpKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGFuZGxlID0gKCkgPT4ge1xuICAgICAgICAgICAgZmV0Y2hDYWxsYmFjaygpLnRoZW4oaGFuZGxlT3V0cHV0LCBoYW5kbGVFcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIGhhbmRsZSgpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBIYW5kbGUgc2VydmVyc2lkZSBjYWxsYmFjayB2aWEgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gKlxuICogVXNlcyB0aGUgU2hhcmVkV29ya2VyIHRvIHNlbmQgdGhlIGNhbGxiYWNrIHJlcXVlc3QgdGhyb3VnaCB0aGUgcGVyc2lzdGVudFxuICogV2ViU29ja2V0IGNvbm5lY3Rpb24gaW5zdGVhZCBvZiBIVFRQIFBPU1QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVdlYnNvY2tldENhbGxiYWNrKGRpc3BhdGNoLCBob29rcywgY29uZmlnLCBwYXlsb2FkLCBydW5uaW5nKSB7XG4gICAgaWYgKGhvb2tzLnJlcXVlc3RfcHJlKSB7XG4gICAgICAgIGhvb2tzLnJlcXVlc3RfcHJlKHBheWxvYWQpO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0VGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IHJ1bm5pbmdPZmY7XG4gICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgZGlzcGF0Y2goc2lkZVVwZGF0ZShydW5uaW5nLnJ1bm5pbmcsIHBheWxvYWQpKTtcbiAgICAgICAgcnVubmluZ09mZiA9IHJ1bm5pbmcucnVubmluZ09mZjtcbiAgICB9XG4gICAgY29uc3Qgd29ya2VyQ2xpZW50ID0gZ2V0V29ya2VyQ2xpZW50KCk7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gRW5zdXJlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkXG4gICAgICAgIGF3YWl0IHdvcmtlckNsaWVudC5lbnN1cmVDb25uZWN0ZWQoY29uZmlnKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB3b3JrZXJDbGllbnQuc2VuZENhbGxiYWNrKHBheWxvYWQpO1xuICAgICAgICAvLyBIYW5kbGUgcnVubmluZyBvZmYgc3RhdGVcbiAgICAgICAgaWYgKHJ1bm5pbmdPZmYpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHNpZGVVcGRhdGUocnVubmluZ09mZiwgcGF5bG9hZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09ICdwcmV2ZW50X3VwZGF0ZScpIHtcbiAgICAgICAgICAgIC8vIFJlY29yZCB0aW1pbmcgZm9yIHByb2ZpbGluZ1xuICAgICAgICAgICAgaWYgKGNvbmZpZy51aSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsVGltZSA9IERhdGUubm93KCkgLSByZXF1ZXN0VGltZTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVSZXNvdXJjZVVzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHBheWxvYWQub3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICB1c2FnZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX3NlcnZlcjogdG90YWxUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX2NsaWVudDogdG90YWxUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX3VwbG9hZDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fZGFzaF9kb3dubG9hZDogMFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFNUQVRVUy5QUkVWRU5UX1VQREFURSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBwYXlsb2FkLmlucHV0cyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHBheWxvYWQuc3RhdGVcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLm1lc3NhZ2UgfHwgJ0NhbGxiYWNrIGVycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXh0cmFjdCB0aGUgY2FsbGJhY2sgZGF0YSAtIHN0cnVjdHVyZSBpcyB7bXVsdGk6IGJvb2xlYW4sIHJlc3BvbnNlOiB7Li4ufX1cbiAgICAgICAgY29uc3QgY2FsbGJhY2tEYXRhID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgLy8gSGFuZGxlIHNpZGVVcGRhdGUgaWYgcHJlc2VudFxuICAgICAgICBpZiAoY2FsbGJhY2tEYXRhPy5zaWRlVXBkYXRlKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKGNhbGxiYWNrRGF0YS5zaWRlVXBkYXRlLCBwYXlsb2FkKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXh0cmFjdCB0aGUgYWN0dWFsIG91dHB1dHMgZnJvbSB0aGUgcmVzcG9uc2VcbiAgICAgICAgLy8gRm9ybWF0IGlzIHNpbWlsYXIgdG8gSFRUUCBwYXRoJ3MgZmluaXNoTGluZSBmdW5jdGlvblxuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCB7IG11bHRpLCByZXNwb25zZTogY2FsbGJhY2tSZXNwb25zZSB9ID0gY2FsbGJhY2tEYXRhIHx8IHt9O1xuICAgICAgICBpZiAoaG9va3MucmVxdWVzdF9wb3N0KSB7XG4gICAgICAgICAgICBob29rcy5yZXF1ZXN0X3Bvc3QocGF5bG9hZCwgY2FsbGJhY2tSZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG11bHRpKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBjYWxsYmFja1Jlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gU2luZ2xlIG91dHB1dCAtIGNvbnZlcnQgdG8gdGhlIGV4cGVjdGVkIGZvcm1hdFxuICAgICAgICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IHBheWxvYWQ7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG91dHB1dC5zdWJzdHIoMCwgb3V0cHV0Lmxhc3RJbmRleE9mKCcuJykpO1xuICAgICAgICAgICAgcmVzdWx0ID0geyBbaWRdOiBjYWxsYmFja1Jlc3BvbnNlPy5wcm9wcyB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY29yZCB0aW1pbmcgZm9yIHByb2ZpbGluZ1xuICAgICAgICBpZiAoY29uZmlnLnVpKSB7XG4gICAgICAgICAgICBjb25zdCB0b3RhbFRpbWUgPSBEYXRlLm5vdygpIC0gcmVxdWVzdFRpbWU7XG4gICAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVSZXNvdXJjZVVzYWdlKHtcbiAgICAgICAgICAgICAgICBpZDogcGF5bG9hZC5vdXRwdXQsXG4gICAgICAgICAgICAgICAgdXNhZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgX19kYXNoX3NlcnZlcjogdG90YWxUaW1lLFxuICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfY2xpZW50OiB0b3RhbFRpbWUsXG4gICAgICAgICAgICAgICAgICAgIF9fZGFzaF91cGxvYWQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIF9fZGFzaF9kb3dubG9hZDogMFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBTVEFUVVMuT0ssXG4gICAgICAgICAgICAgICAgcmVzdWx0OiByZXN1bHQgfHwge30sXG4gICAgICAgICAgICAgICAgaW5wdXRzOiBwYXlsb2FkLmlucHV0cyxcbiAgICAgICAgICAgICAgICBzdGF0ZTogcGF5bG9hZC5zdGF0ZVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQgfHwge307XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBIYW5kbGUgcnVubmluZyBvZmYgc3RhdGUgb24gZXJyb3JcbiAgICAgICAgaWYgKHJ1bm5pbmdPZmYpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHNpZGVVcGRhdGUocnVubmluZ09mZiwgcGF5bG9hZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcudWkpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHVwZGF0ZVJlc291cmNlVXNhZ2Uoe1xuICAgICAgICAgICAgICAgIGlkOiBwYXlsb2FkLm91dHB1dCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFNUQVRVUy5OT19SRVNQT05TRSxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHt9LFxuICAgICAgICAgICAgICAgIGlucHV0czogcGF5bG9hZC5pbnB1dHMsXG4gICAgICAgICAgICAgICAgc3RhdGU6IHBheWxvYWQuc3RhdGVcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG59XG5mdW5jdGlvbiBpbnB1dHNUb0RpY3QoaW5wdXRzX2xpc3QpIHtcbiAgICAvLyBQb3J0ZWQgZGlyZWN0bHkgZnJvbSBfdXRpbHMucHksIGlucHV0c190b19kaWN0XG4gICAgLy8gdGFrZXMgYW4gYXJyYXkgb2YgaW5wdXRzIChzb21lIGlucHV0cyBtYXkgYmUgYW4gYXJyYXkpXG4gICAgLy8gcmV0dXJucyBhbiBPYmplY3QgKG1hcCk6XG4gICAgLy8gIGtleXMgb2YgdGhlIGZvcm0gYGlkLnByb3BlcnR5YCBvciBge1wiaWRcIjogMH0ucHJvcGVydHlgXG4gICAgLy8gIHZhbHVlcyBjb250YWluIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICAgIGlmICghaW5wdXRzX2xpc3QpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBpbnB1dHMgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0c19saXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0c19saXN0W2ldKSkge1xuICAgICAgICAgICAgY29uc3QgaW5wdXRzaSA9IGlucHV0c19saXN0W2ldO1xuICAgICAgICAgICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IGlucHV0c2kubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRfc3RyID0gYCR7c3RyaW5naWZ5SWQoaW5wdXRzaVtpaV0uaWQpfS4ke2lucHV0c2lbaWldLnByb3BlcnR5fWA7XG4gICAgICAgICAgICAgICAgaW5wdXRzW2lkX3N0cl0gPSBpbnB1dHNpW2lpXS52YWx1ZSA/PyBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaWRfc3RyID0gYCR7c3RyaW5naWZ5SWQoaW5wdXRzX2xpc3RbaV0uaWQpfS4ke2lucHV0c19saXN0W2ldLnByb3BlcnR5fWA7XG4gICAgICAgICAgICBpbnB1dHNbaWRfc3RyXSA9IGlucHV0c19saXN0W2ldLnZhbHVlID8/IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlucHV0cztcbn1cbmZ1bmN0aW9uIGdldFRyaWdnZXJlZElkKHRyaWdnZXJlZCkge1xuICAgIC8vIGZvciByZWd1bGFyIGNhbGxiYWNrcywgIHRha2VzIHRoZSBmaXJzdCB0cmlnZ2VyZWQgcHJvcF9pZCwgZS5nLiAgXCJidG4ubl9jbGlja3NcIiBhbmQgcmV0dXJucyBcImJ0blwiXG4gICAgLy8gZm9yIHBhdHRlcm4gbWF0Y2hpbmcgY2FsbGJhY2ssIGUuZy4gJ3tcImluZGV4XCI6MCwgXCJ0eXBlXCI6XCJidG5cIn0nIGFuZCByZXR1cm5zIHtpbmRleDowLCB0eXBlOiBcImJ0blwifSdcbiAgICBpZiAodHJpZ2dlcmVkICYmIHRyaWdnZXJlZC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdHJpZyA9IHRyaWdnZXJlZFswXTtcbiAgICAgICAgbGV0IGNvbXBvbmVudElkO1xuICAgICAgICBpZiAodHJpZy5zdGFydHNXaXRoKCd7JykpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudElkID0gSlNPTi5wYXJzZSh0cmlnLnN1YnN0cmluZygwLCB0cmlnLmxhc3RJbmRleE9mKCd9JykgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb21wb25lbnRJZCA9IHRyaWcuc3BsaXQoJy4nKVswXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50SWQ7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVDYWxsYmFjayhjYiwgY29uZmlnLCBob29rcywgcGF0aHMsIGxheW91dCwgeyBhbGxPdXRwdXRzIH0sIGRpc3BhdGNoLCBnZXRTdGF0ZSkge1xuICAgIGNvbnN0IHsgb3V0cHV0LCBpbnB1dHMsIHN0YXRlLCBjbGllbnRzaWRlX2Z1bmN0aW9uLCBiYWNrZ3JvdW5kLCBkeW5hbWljX2NyZWF0b3IgfSA9IGNiLmNhbGxiYWNrO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGluVmFscyA9IGZpbGxWYWxzKHBhdGhzLCBsYXlvdXQsIGNiLCBpbnB1dHMsICdJbnB1dCcsIHRydWUpO1xuICAgICAgICAvKiBQcmV2ZW50IGNhbGxiYWNrIGlmIHRoZXJlJ3Mgbm8gaW5wdXRzICovXG4gICAgICAgIGlmIChpblZhbHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uUHJvbWlzZTogbnVsbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvdXRwdXRzID0gW107XG4gICAgICAgIGNvbnN0IG91dHB1dEVycm9ycyA9IFtdO1xuICAgICAgICBhbGxPdXRwdXRzLmZvckVhY2goKG91dCwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW291dGksIGVycmldID0gdW53cmFwSWZOb3RNdWx0aShwYXRocywgbWFwKHBpY2soWydpZCcsICdwcm9wZXJ0eSddKSwgb3V0KSwgY2IuY2FsbGJhY2sub3V0cHV0c1tpXSwgY2IuYW55VmFscywgJ091dHB1dCcpO1xuICAgICAgICAgICAgb3V0cHV0cy5wdXNoKG91dGkpO1xuICAgICAgICAgICAgaWYgKGVycmkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRFcnJvcnMucHVzaChlcnJpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvdXRwdXRFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoZmxhdHRlbihpblZhbHMpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJlZkVycihvdXRwdXRFcnJvcnMsIHBhdGhzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoaXMgY2FzZSBpcyBhbGwtZW1wdHkgbXVsdGl2YWx1ZWQgd2lsZGNhcmQgaW5wdXRzLFxuICAgICAgICAgICAgLy8gd2hpY2ggd2Ugd291bGQgbm9ybWFsbHkgZmlyZSB0aGUgY2FsbGJhY2sgZm9yLCBleGNlcHRcbiAgICAgICAgICAgIC8vIHNvbWUgb3V0cHV0cyBhcmUgbWlzc2luZy4gU28gaW5zdGVhZCB3ZSB0cmVhdCBpdCBsaWtlXG4gICAgICAgICAgICAvLyByZWd1bGFyIG1pc3NpbmcgaW5wdXRzIGFuZCBqdXN0IHNpbGVudGx5IHByZXZlbnQgaXQuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvblByb21pc2U6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgX19leGVjdXRlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbG9hZGluZ091dHB1dHMgPSBmbGF0dGVuKG91dHB1dHMpLm1hcChvdXQgPT4gKHtcbiAgICAgICAgICAgICAgICBwYXRoOiBnZXRQYXRoKHBhdGhzLCBvdXQuaWQpLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5OiBvdXQucHJvcGVydHk/LnNwbGl0KCdAJylbMF0sXG4gICAgICAgICAgICAgICAgaWQ6IHN0cmluZ2lmeUlkKG91dC5pZClcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKGxvYWRpbmcobG9hZGluZ091dHB1dHMpKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlZFByb3BJZHMgPSBrZXlzKGNiLmNoYW5nZWRQcm9wSWRzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRDaGFuZ2VkUHJvcHNJZHMgPSBjaGFuZ2VkUHJvcElkcy5tYXAocHJvcElkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BJZC5zdGFydHNXaXRoKCd7JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVBNQ0lkKHByb3BJZClbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BJZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IGlzTXVsdGlPdXRwdXRQcm9wKG91dHB1dCkgPyBvdXRwdXRzIDogb3V0cHV0c1swXSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBpblZhbHMsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wSWRzLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRDaGFuZ2VkUHJvcHNJZHMsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiBjYi5jYWxsYmFjay5zdGF0ZS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZmlsbFZhbHMocGF0aHMsIGxheW91dCwgY2IsIHN0YXRlLCAnU3RhdGUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChjbGllbnRzaWRlX2Z1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGhhbmRsZUNsaWVudHNpZGUoZGlzcGF0Y2gsIGNsaWVudHNpZGVfZnVuY3Rpb24sIGNvbmZpZywgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXRjaCBtZXRob2RvbG9neTogYWx3YXlzIHJ1biB0aHJvdWdoIHBhcnNlUGF0Y2hQcm9wcyBmb3IgZWFjaCBvdXRwdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRMYXlvdXQgPSBnZXRTdGF0ZSgpLmxheW91dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsYXR0ZW4ob3V0cHV0cykuZm9yRWFjaCgob3V0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSBjbGVhbk91dHB1dFByb3Aob3V0LnByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRQYXRoID0gZ2V0UGF0aChwYXRocywgb3V0LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhUGF0aCA9IFtzdHJpbmdpZnlJZChvdXQuaWQpLCBwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0VmFsdWUgPSBwYXRoKGRhdGFQYXRoLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFByb3BzID0gcGF0aChvdXRwdXRQYXRoLmNvbmNhdChbJ3Byb3BzJ10pLCBjdXJyZW50TGF5b3V0KSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQcm9wcyA9IHBhcnNlUGF0Y2hQcm9wcyh7IFtwcm9wTmFtZV06IG91dHB1dFZhbHVlIH0sIG9sZFByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYXNzb2NQYXRoKGRhdGFQYXRoLCBuZXdQcm9wc1twcm9wTmFtZV0sIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhLCBwYXlsb2FkIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvciwgcGF5bG9hZCB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBuZXdDb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICAgICAgbGV0IG5ld0hlYWRlcnMgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBsYXN0RXJyb3I7XG4gICAgICAgICAgICAgICAgY29uc3QgYWRkaXRpb25hbEFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBqc29uT3V0cHV0ID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZC5vdXRwdXRzKTtcbiAgICAgICAgICAgICAgICB2YWx1ZXMoZ2V0U3RhdGUoKS5jYWxsYmFja0pvYnMpLmZvckVhY2goKGpvYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbk91dHB1dCA9PT0gam9iLm91dHB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVybWluYXRlIHRoZSBvbGQgam9icyB0aGF0IGFyZSBub3QgY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgYXMgb3V0ZGF0ZWQgZm9yIHRoZSBjYWxsYmFjayBwcm9taXNlIHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNvbHZlIGFuZCByZW1vdmUgYWZ0ZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsQXJncy5wdXNoKFsnb2xkSm9iJywgam9iLmpvYklkLCB0cnVlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzZXRDYWxsYmFja0pvYk91dGRhdGVkKHsgam9iSWQ6IGpvYi5qb2JJZCB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFqb2IuY2FuY2VsSW5wdXRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXIgPSBpbnRlcnNlY3Rpb24oam9iLmNhbmNlbElucHV0cywgY2IuY2FsbGJhY2suaW5wdXRzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbEFyZ3MucHVzaChbJ2NhbmNlbEpvYicsIGpvYi5qb2JJZF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpvYi5wcm9ncmVzc0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKGpvYi5wcm9ncmVzc0RlZmF1bHQsIHBheWxvYWQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIFVzZSBXZWJTb2NrZXQgZm9yIGNhbGxiYWNrcyB3aGVuOlxuICAgICAgICAgICAgICAgIC8vIDEuIEdsb2JhbCBXZWJTb2NrZXQgaXMgZW5hYmxlZCwgT1JcbiAgICAgICAgICAgICAgICAvLyAyLiBQZXItY2FsbGJhY2sgd2Vic29ja2V0IGZsYWcgaXMgc2V0IChhbmQgV2ViU29ja2V0IGlzIGF2YWlsYWJsZSlcbiAgICAgICAgICAgICAgICAvLyAoYnV0IG5ldmVyIGZvciBiYWNrZ3JvdW5kIGNhbGxiYWNrcylcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VXZWJTb2NrZXQgPSAhYmFja2dyb3VuZCAmJlxuICAgICAgICAgICAgICAgICAgICAoaXNXZWJTb2NrZXRFbmFibGVkKGNvbmZpZykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChjYi5jYWxsYmFjay53ZWJzb2NrZXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1dlYlNvY2tldEF2YWlsYWJsZShjb25maWcpKSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcmV0cnkgPSAwOyByZXRyeSA8PSBNQVhfQVVUSF9SRVRSSUVTOyByZXRyeSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VXZWJTb2NrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgV2ViU29ja2V0IHBhdGggZm9yIHJlYWwtdGltZSBjYWxsYmFja3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYXdhaXQgaGFuZGxlV2Vic29ja2V0Q2FsbGJhY2soZGlzcGF0Y2gsIGhvb2tzLCBuZXdDb25maWcsIHBheWxvYWQsIGNiLmNhbGxiYWNrLnJ1bm5pbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRyYWRpdGlvbmFsIEhUVFAgcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhd2FpdCBoYW5kbGVTZXJ2ZXJzaWRlKGRpc3BhdGNoLCBob29rcywgbmV3Q29uZmlnLCBwYXlsb2FkLCBiYWNrZ3JvdW5kLCBhZGRpdGlvbmFsQXJncy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhZGRpdGlvbmFsQXJnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCwgZ2V0U3RhdGUsIGNiLmNhbGxiYWNrLnJ1bm5pbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0hlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChhZGRIdHRwSGVhZGVycyhuZXdIZWFkZXJzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXlvdXQgbWF5IGhhdmUgY2hhbmdlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERSWTogQWx3YXlzIHJ1biB0aHJvdWdoIHBhcnNlUGF0Y2hQcm9wcyBmb3IgZWFjaCBvdXRwdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRMYXlvdXQgPSBnZXRTdGF0ZSgpLmxheW91dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsYXR0ZW4ob3V0cHV0cykuZm9yRWFjaCgob3V0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSBjbGVhbk91dHB1dFByb3Aob3V0LnByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRQYXRoID0gZ2V0UGF0aChwYXRocywgb3V0LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhUGF0aCA9IFtzdHJpbmdpZnlJZChvdXQuaWQpLCBwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0VmFsdWUgPSBwYXRoKGRhdGFQYXRoLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFByb3BzID0gcGF0aChvdXRwdXRQYXRoLmNvbmNhdChbJ3Byb3BzJ10pLCBjdXJyZW50TGF5b3V0KSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQcm9wcyA9IHBhcnNlUGF0Y2hQcm9wcyh7IFtwcm9wTmFtZV06IG91dHB1dFZhbHVlIH0sIG9sZFByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYXNzb2NQYXRoKGRhdGFQYXRoLCBuZXdQcm9wc1twcm9wTmFtZV0sIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHluYW1pY19jcmVhdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBkaXNwYXRjaChyZXF1ZXN0RGVwZW5kZW5jaWVzKCkpLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGEsIHBheWxvYWQgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0RXJyb3IgPSByZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0cnkgPD0gTUFYX0FVVEhfUkVUUklFUyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXMuc3RhdHVzID09PSBTVEFUVVMuVU5BVVRIT1JJWkVEIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zdGF0dXMgPT09IFNUQVRVUy5CQURfUkVRVUVTVCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm9keS5pbmNsdWRlcyhKV1RfRVhQSVJFRF9NRVNTQUdFKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9va3MucmVxdWVzdF9yZWZyZXNoX2p3dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9sZEp3dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmZldGNoLmhlYWRlcnMuQXV0aG9yaXphdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEp3dCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mZXRjaC5oZWFkZXJzLkF1dGhvcml6YXRpb24uc3Vic3RyKCdCZWFyZXIgJy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Snd0ID0gYXdhaXQgaG9va3MucmVxdWVzdF9yZWZyZXNoX2p3dChvbGRKd3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0p3dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYWRlcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtuZXdKd3R9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29uZmlnID0gbWVyZ2VEZWVwUmlnaHQoY29uZmlnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBuZXdIZWFkZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHdlIHJlYWNoIGhlcmUgd2hlbiB3ZSBydW4gb3V0IG9mIHJldHJpZXMuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGxhc3RFcnJvciwgcGF5bG9hZDogbnVsbCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3IsIHBheWxvYWQ6IG51bGwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKGxvYWRlZChsb2FkaW5nT3V0cHV0cykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXdDYiA9IHtcbiAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgZXhlY3V0aW9uUHJvbWlzZTogX19leGVjdXRlKClcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ld0NiO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgZXhlY3V0aW9uUHJvbWlzZTogeyBlcnJvciwgcGF5bG9hZDogbnVsbCB9XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgYWxsLCBhc3NvYywgY29uY2F0LCBkaWZmZXJlbmNlLCBmaWx0ZXIsIGZsYXR0ZW4sIGlzRW1wdHksIGtleXMsIG1hcCwgbWVyZ2VXaXRoLCBwYXJ0aXRpb24sIHBhdGgsIHBpY2tCeSwgcHJvcHMsIHJlZHVjZSwgemlwT2JqIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWRkQWxsUmVzb2x2ZWRGcm9tT3V0cHV0cywgZ2V0QW55VmFscywgZ2V0VW5maWx0ZXJlZExheW91dENhbGxiYWNrcywgaWRNYXRjaCwgaXNNdWx0aVZhbHVlZCwgc3BsaXRJZEFuZFByb3AsIHN0cmluZ2lmeUlkIH0gZnJvbSAnLi9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHsgZ2V0UGF0aCB9IGZyb20gJy4vcGF0aHMnO1xuZXhwb3J0IGNvbnN0IERJUkVDVCA9IDI7XG5leHBvcnQgY29uc3QgSU5ESVJFQ1QgPSAxO1xuZXhwb3J0IGNvbnN0IG1lcmdlTWF4ID0gbWVyZ2VXaXRoKE1hdGgubWF4KTtcbmV4cG9ydCBjb25zdCBjb21iaW5lSWRBbmRQcm9wID0gKHsgaWQsIHByb3BlcnR5IH0pID0+IGAke3N0cmluZ2lmeUlkKGlkKX0uJHtwcm9wZXJ0eX1gO1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhbGxiYWNrc0J5SW5wdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3AsIGNoYW5nZVR5cGUsIHdpdGhQcmlvcml0eSA9IHRydWUpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gW107XG4gICAgY29uc3QgaWRBbmRQcm9wID0gY29tYmluZUlkQW5kUHJvcCh7IGlkLCBwcm9wZXJ0eTogcHJvcCB9KTtcbiAgICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBzdGFuZGFyZCBpZCB2ZXJzaW9uXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IChncmFwaHMuaW5wdXRNYXBbaWRdIHx8IHt9KVtwcm9wXTtcbiAgICAgICAgaWYgKCFjYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFja3MuZm9yRWFjaChhZGRBbGxSZXNvbHZlZEZyb21PdXRwdXRzKHJlc29sdmVEZXBzKCksIHBhdGhzLCBtYXRjaGVzKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyB3aWxkY2FyZCB2ZXJzaW9uXG4gICAgICAgIGNvbnN0IF9rZXlzID0gT2JqZWN0LmtleXMoaWQpLnNvcnQoKTtcbiAgICAgICAgY29uc3QgdmFscyA9IHByb3BzKF9rZXlzLCBpZCk7XG4gICAgICAgIGNvbnN0IGtleVN0ciA9IF9rZXlzLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSAoZ3JhcGhzLmlucHV0UGF0dGVybnNba2V5U3RyXSB8fCB7fSlbcHJvcF07XG4gICAgICAgIGlmICghcGF0dGVybnMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBwYXR0ZXJucy5mb3JFYWNoKHBhdHRlcm4gPT4ge1xuICAgICAgICAgICAgaWYgKGlkTWF0Y2goX2tleXMsIHZhbHMsIHBhdHRlcm4udmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gYSBjYWxsYmFjaydzIE91dHB1dHMgaGF2ZSBubyBNQVRDSCBrZXlzLCB0aGVcbiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyaW5nIElucHV0J3MgTUFUQ0ggdmFsdWVzIGFyZSB3aGF0IHVuaXF1aWZ5IGVhY2hcbiAgICAgICAgICAgICAgICAvLyBmaXJpbmcncyByZXNvbHZlZElkIChzZWUgYWRkQWxsUmVzb2x2ZWRGcm9tT3V0cHV0cykuXG4gICAgICAgICAgICAgICAgLy8gQ2FsbGJhY2tzIHdob3NlIE91dHB1dHMgZG8gY2FycnkgTUFUQ0gga2V5cyBpZ25vcmUgdGhpc1xuICAgICAgICAgICAgICAgIC8vIHZhbHVlIHNpbmNlIHRoZSBPdXRwdXQgcGF0dGVybiBkcml2ZXMgcmVzb2x1dGlvbi5cbiAgICAgICAgICAgICAgICBjb25zdCB0cmlnZ2VyQW55VmFscyA9IGdldEFueVZhbHMocGF0dGVybi52YWx1ZXMsIHZhbHMpO1xuICAgICAgICAgICAgICAgIHBhdHRlcm4uY2FsbGJhY2tzLmZvckVhY2goYWRkQWxsUmVzb2x2ZWRGcm9tT3V0cHV0cyhyZXNvbHZlRGVwcyhfa2V5cywgdmFscywgcGF0dGVybi52YWx1ZXMpLCBwYXRocywgbWF0Y2hlcywgdHJpZ2dlckFueVZhbHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1hdGNoZXMuZm9yRWFjaChtYXRjaCA9PiB7XG4gICAgICAgIG1hdGNoLmNoYW5nZWRQcm9wSWRzW2lkQW5kUHJvcF0gPSBjaGFuZ2VUeXBlIHx8IERJUkVDVDtcbiAgICAgICAgaWYgKHdpdGhQcmlvcml0eSkge1xuICAgICAgICAgICAgbWF0Y2gucHJpb3JpdHkgPSBnZXRQcmlvcml0eShncmFwaHMsIHBhdGhzLCBtYXRjaCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbWF0Y2hlcztcbn1cbi8qXG4gKiBCdWlsZHMgYSB0cmVlIG9mIGFsbCBjYWxsYmFja3MgdGhhdCBjYW4gYmUgdHJpZ2dlcmVkIGJ5IHRoZSBwcm92aWRlZCBjYWxsYmFjay5cbiAqIFVzZXMgdGhlIG51bWJlciBvZiBjYWxsYmFja3MgYXQgZWFjaCB0cmVlIGRlcHRoIGFuZCB0aGUgdG90YWwgZGVwdGggb2YgdGhlIHRyZWVcbiAqIHRvIGNyZWF0ZSBhIHNvcnRhYmxlIHByaW9yaXR5IGhhc2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcmlvcml0eShncmFwaHMsIHBhdGhzLCBjYWxsYmFjaykge1xuICAgIGxldCBjYWxsYmFja3MgPSBbY2FsbGJhY2tdO1xuICAgIGNvbnN0IHRvdWNoZWRPdXRwdXRzID0ge307XG4gICAgY29uc3QgdG91Y2hlZENiSWRzID0ge307XG4gICAgY29uc3QgcHJpb3JpdHkgPSBbXTtcbiAgICB3aGlsZSAoY2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICBjYWxsYmFja3MgPSBmaWx0ZXIoYyA9PiB7XG4gICAgICAgICAgICBjb25zdCB0b3VjaGVkID0gdG91Y2hlZENiSWRzW2MucmVzb2x2ZWRJZF07XG4gICAgICAgICAgICB0b3VjaGVkQ2JJZHNbYy5yZXNvbHZlZElkXSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdG91Y2hlZDtcbiAgICAgICAgfSwgY2FsbGJhY2tzKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IGZpbHRlcihvID0+ICF0b3VjaGVkT3V0cHV0c1tjb21iaW5lSWRBbmRQcm9wKG8pXSwgZmxhdHRlbihtYXAoY2IgPT4gZmxhdHRlbihjYi5nZXRPdXRwdXRzKHBhdGhzKSksIGNhbGxiYWNrcykpKTtcbiAgICAgICAgb3V0cHV0cy5mb3JFYWNoKG8gPT4gKHRvdWNoZWRPdXRwdXRzW2NvbWJpbmVJZEFuZFByb3AobyldID0gdHJ1ZSkpO1xuICAgICAgICBjYWxsYmFja3MgPSBmbGF0dGVuKG1hcCgoeyBpZCwgcHJvcGVydHkgfSkgPT4gZ2V0Q2FsbGJhY2tzQnlJbnB1dChncmFwaHMsIHBhdGhzLCBpZCwgcHJvcGVydHksIElORElSRUNULCBmYWxzZSksIG91dHB1dHMpKTtcbiAgICAgICAgaWYgKGNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHByaW9yaXR5LnB1c2goY2FsbGJhY2tzLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpb3JpdHkudW5zaGlmdChwcmlvcml0eS5sZW5ndGgpO1xuICAgIHJldHVybiBtYXAoaSA9PiBNYXRoLm1pbihpLCAzNSkudG9TdHJpbmcoMzYpLCBwcmlvcml0eSkuam9pbignJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsU3Vic2VxdWVudE91dHB1dHNGb3JDYWxsYmFjayhncmFwaHMsIHBhdGhzLCBjYWxsYmFjaykge1xuICAgIGxldCBjYWxsYmFja3MgPSBbY2FsbGJhY2tdO1xuICAgIGxldCB0b3VjaGVkT3V0cHV0cyA9IHt9O1xuICAgIC8vIHRoaXMgdHJhdmVyc2VzIHRoZSBncmFwaCBhbGwgdGhlIHdheSB0byB0aGUgZW5kXG4gICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gZG9uJ3QgYWRkIGl0IGlmIGl0IGFscmVhZHkgZXhpc3RzIGJhc2VkIG9uIGlkIGFuZCBwcm9wc1xuICAgICAgICBjb25zdCBvdXRwdXRzID0gZmlsdGVyKG8gPT4gIXRvdWNoZWRPdXRwdXRzW2NvbWJpbmVJZEFuZFByb3AobyldLCBmbGF0dGVuKG1hcChjYiA9PiBmbGF0dGVuKGNiLmdldE91dHB1dHMocGF0aHMpKSwgY2FsbGJhY2tzKSkpO1xuICAgICAgICB0b3VjaGVkT3V0cHV0cyA9IHJlZHVjZSgodG91Y2hlZCwgbykgPT4gYXNzb2MoY29tYmluZUlkQW5kUHJvcChvKSwgdHJ1ZSwgdG91Y2hlZCksIHRvdWNoZWRPdXRwdXRzLCBvdXRwdXRzKTtcbiAgICAgICAgY2FsbGJhY2tzID0gZmxhdHRlbihtYXAoKHsgaWQsIHByb3BlcnR5IH0pID0+IGdldENhbGxiYWNrc0J5SW5wdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3BlcnR5LCBJTkRJUkVDVCwgZmFsc2UpLCBvdXRwdXRzKSk7XG4gICAgfVxuICAgIHJldHVybiB0b3VjaGVkT3V0cHV0cztcbn1cbmV4cG9ydCBjb25zdCBnZXRSZWFkeUNhbGxiYWNrcyA9IChwYXRocywgY2FuZGlkYXRlcywgY2FsbGJhY2tzID0gY2FuZGlkYXRlcywgZ3JhcGhzID0ge30pID0+IHtcbiAgICAvLyBTa2lwIGlmIHRoZXJlJ3Mgbm8gY2FuZGlkYXRlc1xuICAgIGlmICghY2FuZGlkYXRlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICAvLyBGaW5kIGFsbCBvdXRwdXRzIG9mIGFsbCBhY3RpdmUgY2FsbGJhY2tzXG4gICAgY29uc3Qgb3V0cHV0cyA9IG1hcChjb21iaW5lSWRBbmRQcm9wLCByZWR1Y2UoKG8sIGNiKSA9PiBjb25jYXQobywgZmxhdHRlbihjYi5nZXRPdXRwdXRzKHBhdGhzKSkpLCBbXSwgY2FsbGJhY2tzKSk7XG4gICAgLy8gTWFrZSBgb3V0cHV0c2AgaGFzaCB0YWJsZSBmb3IgZmFzdGVyIGFjY2Vzc1xuICAgIGxldCBvdXRwdXRzTWFwID0ge307XG4gICAgb3V0cHV0cy5mb3JFYWNoKG91dHB1dCA9PiAob3V0cHV0c01hcFtvdXRwdXRdID0gdHJ1ZSkpO1xuICAgIC8vIGZpbmQgYWxsIHRoZSBvdXRwdXRzIHRvdWNoZWQgYnkgYWN0aXZlQ2FsbGJhY2tzXG4gICAgLy8gcmVtb3ZlIHRoaXMgY2hlY2sgaWYgZ3JhcGggaXMgYWNjZXNzaWJsZSBhbGwgdGhlIHRpbWVcbiAgICBpZiAoT2JqZWN0LmtleXMoZ3JhcGhzKS5sZW5ndGgpIHtcbiAgICAgICAgLy9ub3Qgc3VyZSBpZiBncmFwaCB3aWxsIGJlIGFjY2Vzc2libGUgYWxsIHRoZSB0aW1lXG4gICAgICAgIGNvbnN0IGFsbFRvdWNoZWRPdXRwdXRzID0gZmxhdHRlbihtYXAoY2IgPT4gZ2V0QWxsU3Vic2VxdWVudE91dHB1dHNGb3JDYWxsYmFjayhncmFwaHMsIHBhdGhzLCBjYiksIGNhbGxiYWNrcykpO1xuICAgICAgICAvLyBvdmVycnJpZGVzIHRoZSBvdXRwdXRzTWFwLCB3aWxsIGR1cGxpY2F0ZSBjYWxsYmFja3MgZmlsdGVyZWRcbiAgICAgICAgLy8gdGhpcyBpcyBvbmx5IGRvbmUgdG8gc2lsZW5jZSB0eXBlc2NyaXB0IGVycm9yc1xuICAgICAgICBpZiAoYWxsVG91Y2hlZE91dHB1dHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgb3V0cHV0c01hcCA9IE9iamVjdC5hc3NpZ24oYWxsVG91Y2hlZE91dHB1dHNbMF0sIC4uLmFsbFRvdWNoZWRPdXRwdXRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBSYW1kYS5KUyBgZGlmZmVyZW5jZWAgZnVuY3Rpb24gaXMgc2xvdyBiZWNhdXNlIGl0IGNvbXBhcmVzIG9iamVjdHMgZW50aXJlbHlcbiAgICAvLyBUaGlzIGNhdXNlIHRoZSBmb2xsb3dpbmcgYGZpbHRlcmAgdG8gYmUgZXhwb25lbnRpYWxseSBzbG93IGFzIHRoZSBudW1iZXIgb2YgaW5wdXRzIG9yIG91dHB1dHMgZ3Jvd1xuICAgIC8vIFdlIGNhbiBvcHRpbWl6ZSB0aGlzIGJ5IGNvbXBhcmluZyBvbmx5IHRoZSBgaWQrcHJvcGAgcGFydCBvZiB0aGUgaW5wdXRzICYgb3V0cHV0cy5cbiAgICAvLyBPcmlnaW5hbCBkaWZmZXJlbmNlIHRha2VzIDM4MG1zIG9uIGF2ZXJhZ2UgdG8gY29tcHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gMjAwIGlucHV0cyBhbmQgMSBvdXRwdXQuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbiB0YWtlcyAxLTJtcyBvbiBhdmVyYWdlLlxuICAgIGNvbnN0IGRpZmZlcmVuY2VCYXNlZE9uSWQgPSAoaW5wdXRzLCBvdXRwdXRzKSA9PiBpbnB1dHMuZmlsdGVyKGlucHV0ID0+ICFvdXRwdXRzLnNvbWUob3V0cHV0ID0+IGNvbWJpbmVJZEFuZFByb3AoaW5wdXQpID09PSBjb21iaW5lSWRBbmRQcm9wKG91dHB1dCkpKTtcbiAgICAvLyBGaW5kIGByZXF1ZXN0ZWRgIGNhbGxiYWNrcyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gYSBvdXRzdGFuZGluZyBvdXRwdXQgKGFzIGVpdGhlciBpbnB1dCBvciBzdGF0ZSlcbiAgICAvLyBPdXRwdXRzIHdoaWNoIG92ZXJsYXAgYW4gaW5wdXQgZG8gbm90IGNvdW50IGFzIGFuIG91dHN0YW5kaW5nIG91dHB1dFxuICAgIHJldHVybiBmaWx0ZXIoY2IgPT4gYWxsKGNicCA9PiAhb3V0cHV0c01hcFtjb21iaW5lSWRBbmRQcm9wKGNicCldLCBkaWZmZXJlbmNlQmFzZWRPbklkKGZsYXR0ZW4oY2IuZ2V0SW5wdXRzKHBhdGhzKSksIGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhwYXRocykpKSksIGNhbmRpZGF0ZXMpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRMYXlvdXRDYWxsYmFja3MgPSAoZ3JhcGhzLCBwYXRocywgbGF5b3V0LCBvcHRpb25zKSA9PiB7XG4gICAgbGV0IGV4Y2x1c2lvbnMgPSBbXTtcbiAgICBsZXQgY2FsbGJhY2tzID0gZ2V0VW5maWx0ZXJlZExheW91dENhbGxiYWNrcyhncmFwaHMsIHBhdGhzLCBsYXlvdXQsIG9wdGlvbnMpO1xuICAgIC8qXG4gICAgICAgIFJlbW92ZSBmcm9tIHRoZSBpbml0aWFsIGNhbGxiYWNrcyB0aG9zZSB0aGF0IGFyZSBsZWZ0IHdpdGggb25seSBleGNsdWRlZCBpbnB1dHMuXG5cbiAgICAgICAgRXhjbHVzaW9uIG9mIGlucHV0cyBoYXBwZW5zIHdoZW46XG4gICAgICAgIC0gYW4gaW5wdXQgaXMgbWlzc2luZ1xuICAgICAgICAtIGFuIGlucHV0IGluIHRoZSBpbml0aWFsIGNhbGxiYWNrIGNoYWluIGRlcGVuZHMgb25seSBvbiBleGNsdWRlZCBpbnB1dHNcblxuICAgICAgICBGdXJ0aGVyIGV4Y2x1c2lvbiBtaWdodCBoYXBwZW4gYWZ0ZXIgY2FsbGJhY2tzIHJldHVybiB3aXRoOlxuICAgICAgICAtIFByZXZlbnRVcGRhdGVcbiAgICAgICAgLSBub191cGRhdGVcbiAgICAqL1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIC8vIEZpbmQgY2FsbGJhY2tzIGZvciB3aGljaCBhbGwgaW5wdXRzIGFyZSBtaXNzaW5nIG9yIGluIHRoZSBleGNsdXNpb25zXG4gICAgICAgIGNvbnN0IFtpbmNsdWRlZCwgZXhjbHVkZWRdID0gcGFydGl0aW9uKCh7IGNhbGxiYWNrOiB7IGlucHV0cyB9LCBnZXRJbnB1dHMgfSkgPT4gYWxsKGlzTXVsdGlWYWx1ZWQsIGlucHV0cykgfHxcbiAgICAgICAgICAgICFpc0VtcHR5KGRpZmZlcmVuY2UobWFwKGNvbWJpbmVJZEFuZFByb3AsIGZsYXR0ZW4oZ2V0SW5wdXRzKHBhdGhzKSkpLCBleGNsdXNpb25zKSksIGNhbGxiYWNrcyk7XG4gICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gYWRkaXRpb25hbCBleGNsdXNpb25zLCBicmVhayBsb29wIC0gY2FsbGJhY2tzIGhhdmUgYmVlbiBjbGVhbmVkXG4gICAgICAgIGlmICghZXhjbHVkZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFja3MgPSBpbmNsdWRlZDtcbiAgICAgICAgLy8gdXBkYXRlIGV4Y2x1c2lvbnMgd2l0aCBhbGwgYWRkaXRpb25hbCBleGNsdWRlZCBvdXRwdXRzXG4gICAgICAgIGV4Y2x1c2lvbnMgPSBjb25jYXQoZXhjbHVzaW9ucywgbWFwKGNvbWJpbmVJZEFuZFByb3AsIGZsYXR0ZW4obWFwKCh7IGdldE91dHB1dHMgfSkgPT4gZ2V0T3V0cHV0cyhwYXRocyksIGV4Y2x1ZGVkKSkpKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZmlsdGVyUm9vdCkge1xuICAgICAgICBsZXQgcm9vdElkID0gcGF0aChbJ3Byb3BzJywgJ2lkJ10sIGxheW91dCk7XG4gICAgICAgIGlmIChyb290SWQpIHtcbiAgICAgICAgICAgIHJvb3RJZCA9IHN0cmluZ2lmeUlkKHJvb3RJZCk7XG4gICAgICAgICAgICAvLyBGaWx0ZXIgaW5wdXRzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSByZXNwb25zZVxuICAgICAgICAgICAgY2FsbGJhY2tzID0gY2FsbGJhY2tzLmZpbHRlcihjYiA9PiBjYi5jYWxsYmFjay5pbnB1dHMucmVkdWNlKChwcmV2aW91cywgaW5wdXQpID0+IHByZXZpb3VzIHx8XG4gICAgICAgICAgICAgICAgKHN0cmluZ2lmeUlkKGlucHV0LmlkKSA9PSByb290SWQgJiZcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWx0ZXJSb290LmluY2x1ZGVzKGlucHV0LnByb3BlcnR5KSksIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLypcbiAgICAgICAgUmV0dXJuIGFsbCBjYWxsYmFja3Mgd2l0aCBhbiBgZXhlY3V0aW9uR3JvdXBgIHRvIGFsbG93IGdyb3VwLXByb2Nlc3NpbmdcbiAgICAqL1xuICAgIGNvbnN0IGV4ZWN1dGlvbkdyb3VwID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygxNik7XG4gICAgcmV0dXJuIG1hcChjYiA9PiAoeyAuLi5jYiwgZXhlY3V0aW9uR3JvdXAgfSksIGNhbGxiYWNrcyk7XG59O1xuZXhwb3J0IGNvbnN0IGdldFVuaXF1ZUlkZW50aWZpZXIgPSAoeyBhbnlWYWxzLCBjYWxsYmFjazogeyBpbnB1dHMsIG91dHB1dHMsIHN0YXRlLCBvdXRwdXQgfSB9KSA9PiB7XG4gICAgY29uc3QgaWRQYXJ0cyA9IG1hcChjb21iaW5lSWRBbmRQcm9wLCBbLi4uaW5wdXRzLCAuLi5vdXRwdXRzLCAuLi5zdGF0ZV0pO1xuICAgIC8vIEZvciBuby1vdXRwdXQgY2FsbGJhY2tzLCBpbmNsdWRlIHRoZSBvdXRwdXQgaGFzaCB0byBlbnN1cmUgdW5pcXVlbmVzc1xuICAgIGlmIChvdXRwdXRzLmxlbmd0aCA9PT0gMCAmJiBvdXRwdXQpIHtcbiAgICAgICAgaWRQYXJ0cy5wdXNoKG91dHB1dCk7XG4gICAgfVxuICAgIHJldHVybiBjb25jYXQoaWRQYXJ0cywgQXJyYXkuaXNBcnJheShhbnlWYWxzKSA/IGFueVZhbHMgOiBhbnlWYWxzID09PSAnJyA/IFtdIDogW2FueVZhbHNdKS5qb2luKCcsJyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGluY2x1ZGVPYnNlcnZlcnMoaWQsIHByb3BlcnRpZXMsIGdyYXBocywgcGF0aHMpIHtcbiAgICByZXR1cm4gZmxhdHRlbihtYXAocHJvcE5hbWUgPT4gZ2V0Q2FsbGJhY2tzQnlJbnB1dChncmFwaHMsIHBhdGhzLCBpZCwgcHJvcE5hbWUpLCBrZXlzKHByb3BlcnRpZXMpKSk7XG59XG4vKlxuICogQ3JlYXRlIGEgcGVuZGluZyBjYWxsYmFjayBvYmplY3QuIEluY2x1ZGVzIHRoZSBvcmlnaW5hbCBjYWxsYmFjayBkZWZpbml0aW9uLFxuICogaXRzIHJlc29sdmVkIElEIChpbmNsdWRpbmcgdGhlIHZhbHVlIG9mIGFsbCBNQVRDSCB3aWxkY2FyZHMpLFxuICogYWNjZXNzb3JzIHRvIGZpbmQgYWxsIGlucHV0cywgb3V0cHV0cywgYW5kIHN0YXRlIGludm9sdmVkIGluIHRoaXNcbiAqIGNhbGxiYWNrIChsYXp5IGFzIG5vdCBhbGwgdXNlcnMgd2lsbCB3YW50IGFsbCBvZiB0aGVzZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBtYWtlUmVzb2x2ZWRDYWxsYmFjayA9IChjYWxsYmFjaywgcmVzb2x2ZSwgYW55VmFscykgPT4gKHtcbiAgICBjYWxsYmFjayxcbiAgICBhbnlWYWxzLFxuICAgIHJlc29sdmVkSWQ6IGNhbGxiYWNrLm91dHB1dCArIGFueVZhbHMsXG4gICAgZ2V0T3V0cHV0czogcGF0aHMgPT4gY2FsbGJhY2sub3V0cHV0cy5tYXAocmVzb2x2ZShwYXRocykpLFxuICAgIGdldElucHV0czogcGF0aHMgPT4gY2FsbGJhY2suaW5wdXRzLm1hcChyZXNvbHZlKHBhdGhzKSksXG4gICAgZ2V0U3RhdGU6IHBhdGhzID0+IGNhbGxiYWNrLnN0YXRlLm1hcChyZXNvbHZlKHBhdGhzKSksXG4gICAgY2hhbmdlZFByb3BJZHM6IHt9LFxuICAgIGluaXRpYWxDYWxsOiBmYWxzZVxufSk7XG5leHBvcnQgZnVuY3Rpb24gcHJ1bmVDYWxsYmFja3MoY2FsbGJhY2tzLCBwYXRocykge1xuICAgIGNvbnN0IFssIHJlbW92ZWRdID0gcGFydGl0aW9uKCh7IGdldE91dHB1dHMsIGNhbGxiYWNrOiB7IG91dHB1dHMgfSB9KSA9PiBmbGF0dGVuKGdldE91dHB1dHMocGF0aHMpKS5sZW5ndGggPT09IG91dHB1dHMubGVuZ3RoLCBjYWxsYmFja3MpO1xuICAgIGNvbnN0IFssIG1vZGlmaWVkXSA9IHBhcnRpdGlvbigoeyBnZXRPdXRwdXRzIH0pID0+ICFmbGF0dGVuKGdldE91dHB1dHMocGF0aHMpKS5sZW5ndGgsIHJlbW92ZWQpO1xuICAgIGNvbnN0IGFkZGVkID0gbWFwKGNiID0+IGFzc29jKCdjaGFuZ2VkUHJvcElkcycsIHBpY2tCeSgoXywgcHJvcElkKSA9PiBnZXRQYXRoKHBhdGhzLCBzcGxpdElkQW5kUHJvcChwcm9wSWQpLmlkKSwgY2IuY2hhbmdlZFByb3BJZHMpLCBjYiksIG1vZGlmaWVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBhZGRlZCxcbiAgICAgICAgcmVtb3ZlZFxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURlcHMocmVmS2V5cywgcmVmVmFscywgcmVmUGF0dGVyblZhbHMpIHtcbiAgICByZXR1cm4gKHBhdGhzKSA9PiAoeyBpZDogaWRQYXR0ZXJuLCBwcm9wZXJ0eSB9KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgaWRQYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IGdldFBhdGgocGF0aHMsIGlkUGF0dGVybik7XG4gICAgICAgICAgICByZXR1cm4gcGF0aCA/IFt7IGlkOiBpZFBhdHRlcm4sIHByb3BlcnR5LCBwYXRoIH1dIDogW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgX2tleXMgPSBPYmplY3Qua2V5cyhpZFBhdHRlcm4pLnNvcnQoKTtcbiAgICAgICAgY29uc3QgcGF0dGVyblZhbHMgPSBwcm9wcyhfa2V5cywgaWRQYXR0ZXJuKTtcbiAgICAgICAgY29uc3Qga2V5U3RyID0gX2tleXMuam9pbignLCcpO1xuICAgICAgICBjb25zdCBrZXlQYXRocyA9IHBhdGhzLm9ianNba2V5U3RyXTtcbiAgICAgICAgaWYgKCFrZXlQYXRocykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBrZXlQYXRocy5mb3JFYWNoKCh7IHZhbHVlczogdmFscywgcGF0aCB9KSA9PiB7XG4gICAgICAgICAgICBpZiAoaWRNYXRjaChfa2V5cywgdmFscywgcGF0dGVyblZhbHMsIHJlZktleXMsIHJlZlZhbHMsIHJlZlBhdHRlcm5WYWxzKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgaWQ6IHppcE9iaihfa2V5cywgdmFscyksIHByb3BlcnR5LCBwYXRoIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlQWN0aW9uIH0gZnJvbSAncmVkdXgtYWN0aW9ucyc7XG5pbXBvcnQgeyBJc0xvYWRpbmdBY3Rpb25UeXBlIH0gZnJvbSAnLi4vcmVkdWNlcnMvaXNMb2FkaW5nJztcbmV4cG9ydCBjb25zdCBzZXRJc0xvYWRpbmcgPSBjcmVhdGVBY3Rpb24oSXNMb2FkaW5nQWN0aW9uVHlwZS5TZXQpO1xuIiwiaW1wb3J0IHsgY3JlYXRlQWN0aW9uIH0gZnJvbSAncmVkdXgtYWN0aW9ucyc7XG5leHBvcnQgY29uc3QgbG9hZGluZyA9IGNyZWF0ZUFjdGlvbignTE9BRElORycpO1xuZXhwb3J0IGNvbnN0IGxvYWRlZCA9IGNyZWF0ZUFjdGlvbignTE9BREVEJyk7XG4iLCJpbXBvcnQgeyBhcHBlbmQsIGFzc29jUGF0aCwgY29uY2F0LCBkaXNzb2NQYXRoLCBlbXB0eSwgZXF1YWxzLCBoYXMsIGluc2VydCwgaXMsIHBhdGgsIHByZXBlbmQsIHJldmVyc2UgfSBmcm9tICdyYW1kYSc7XG5leHBvcnQgZnVuY3Rpb24gaXNQYXRjaChvYmopIHtcbiAgICByZXR1cm4gaGFzKCdfX2Rhc2hfcGF0Y2hfdXBkYXRlJywgb2JqKTtcbn1cbmZ1bmN0aW9uIGdldExvY2F0aW9uSW5kZXgodmFsdWUsIHByZXZpb3VzKSB7XG4gICAgaWYgKGlzKE51bWJlciwgdmFsdWUpICYmIHZhbHVlIDwgMCkge1xuICAgICAgICByZXR1cm4gcHJldmlvdXMubGVuZ3RoICsgdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldExvY2F0aW9uUGF0aChsb2NhdGlvbiwgb2JqKSB7XG4gICAgY29uc3QgY3VycmVudCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYXRpb24ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRMb2NhdGlvbkluZGV4KGxvY2F0aW9uW2ldLCBwYXRoKGN1cnJlbnQsIG9iaikpO1xuICAgICAgICBjdXJyZW50LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbn1cbmV4cG9ydCBjbGFzcyBQYXRjaEJ1aWxkZXIge1xuICAgIG9wZXJhdGlvbnMgPSBbXTtcbiAgICBhc3NpZ24obG9jYXRpb24sIHZhbHVlKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ0Fzc2lnbicsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIHBhcmFtczogeyB2YWx1ZSB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgbWVyZ2UobG9jYXRpb24sIHZhbHVlKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ01lcmdlJyxcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcGFyYW1zOiB7IHZhbHVlIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBleHRlbmQobG9jYXRpb24sIHZhbHVlKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ0V4dGVuZCcsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIHBhcmFtczogeyB2YWx1ZSB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGxvY2F0aW9uKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ0RlbGV0ZScsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIHBhcmFtczoge31cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpbnNlcnQobG9jYXRpb24sIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdJbnNlcnQnLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHsgaW5kZXgsIHZhbHVlIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBhcHBlbmQobG9jYXRpb24sIHZhbHVlKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ0FwcGVuZCcsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIHBhcmFtczogeyB2YWx1ZSB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcHJlcGVuZChsb2NhdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgb3BlcmF0aW9uOiAnUHJlcGVuZCcsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIHBhcmFtczogeyB2YWx1ZSB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYWRkKGxvY2F0aW9uLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdBZGQnLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWUgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHN1Yihsb2NhdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgb3BlcmF0aW9uOiAnU3ViJyxcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcGFyYW1zOiB7IHZhbHVlIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBtdWwobG9jYXRpb24sIHZhbHVlKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ011bCcsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIHBhcmFtczogeyB2YWx1ZSB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGl2KGxvY2F0aW9uLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdEaXYnLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWUgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNsZWFyKGxvY2F0aW9uKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ0NsZWFyJyxcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcGFyYW1zOiB7fVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldmVyc2UobG9jYXRpb24pIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgb3BlcmF0aW9uOiAnUmV2ZXJzZScsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIHBhcmFtczoge31cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZW1vdmUobG9jYXRpb24sIHZhbHVlKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ1JlbW92ZScsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIHBhcmFtczogeyB2YWx1ZSB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYnVpbGQoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBfX2Rhc2hfcGF0Y2hfdXBkYXRlOiAnX19kYXNoX3BhdGNoX3VwZGF0ZScsXG4gICAgICAgICAgICBvcGVyYXRpb25zOiB0aGlzLm9wZXJhdGlvbnNcbiAgICAgICAgfTtcbiAgICB9XG59XG5jb25zdCBwYXRjaEhhbmRsZXJzID0ge1xuICAgIEFzc2lnbjogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCB7IHBhcmFtcywgbG9jYXRpb24gfSA9IHBhdGNoT3BlcmF0aW9uO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKGxvY2F0aW9uLCBwYXJhbXMudmFsdWUsIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIE1lcmdlOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHtcbiAgICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgICAuLi5wYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWVcbiAgICAgICAgfSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgRXh0ZW5kOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIGNvbmNhdChwcmV2LCBwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUpLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBEZWxldGU6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgcmV0dXJuIGRpc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIEluc2VydDogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBpbnNlcnQoZ2V0TG9jYXRpb25JbmRleChwYXRjaE9wZXJhdGlvbi5wYXJhbXMuaW5kZXgsIHByZXYpLCBwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUsIHByZXYpLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBBcHBlbmQ6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgYXBwZW5kKHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSwgcHJldiksIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIFByZXBlbmQ6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJlcGVuZChwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUsIHByZXYpLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBBZGQ6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldiArIHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgU3ViOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXYgLSBwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUsIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIE11bDogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2ICogcGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBEaXY6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldiAvIHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgQ2xlYXI6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgZW1wdHkocHJldiksIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIFJldmVyc2U6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcmV2ZXJzZShwcmV2KSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgUmVtb3ZlOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXYuZmlsdGVyKChpdGVtKSA9PiAhZXF1YWxzKGl0ZW0sIHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSkpLCBwcmV2aW91cyk7XG4gICAgfVxufTtcbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVQYXRjaChwcmV2aW91c1ZhbHVlLCBwYXRjaFZhbHVlKSB7XG4gICAgbGV0IHJlZHVjZWRWYWx1ZSA9IHByZXZpb3VzVmFsdWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRjaFZhbHVlLm9wZXJhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGF0Y2ggPSBwYXRjaFZhbHVlLm9wZXJhdGlvbnNbaV07XG4gICAgICAgIHBhdGNoLmxvY2F0aW9uID0gZ2V0TG9jYXRpb25QYXRoKHBhdGNoLmxvY2F0aW9uLCByZWR1Y2VkVmFsdWUpO1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gcGF0Y2hIYW5kbGVyc1twYXRjaC5vcGVyYXRpb25dO1xuICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBPcGVyYXRpb24gJHtwYXRjaC5vcGVyYXRpb259YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVkdWNlZFZhbHVlID0gaGFuZGxlcihyZWR1Y2VkVmFsdWUsIHBhdGNoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZHVjZWRWYWx1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhdGNoUHJvcHMocHJvcHMsIHByZXZpb3VzUHJvcHMpIHtcbiAgICBpZiAoIWlzKE9iamVjdCwgcHJvcHMpKSB7XG4gICAgICAgIHJldHVybiBwcm9wcztcbiAgICB9XG4gICAgY29uc3QgcGF0Y2hlZFByb3BzID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocHJvcHMpKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHByb3BzW2tleV07XG4gICAgICAgIGlmIChpc1BhdGNoKHZhbCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBwcmV2aW91c1Byb3BzW2tleV07XG4gICAgICAgICAgICBpZiAocHJldmlvdXNWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcGF0Y2ggdW5kZWZpbmVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXRjaGVkUHJvcHNba2V5XSA9IGhhbmRsZVBhdGNoKHByZXZpb3VzVmFsdWUsIHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwYXRjaGVkUHJvcHNba2V5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGF0Y2hlZFByb3BzO1xufVxuIiwiaW1wb3J0IHsga2V5cywgZXF1YWxzLCBkaXNzb2MsIHRvUGFpcnMgfSBmcm9tICdyYW1kYSc7XG4vKipcbiAqIERlc2VyaWFsaXplIHBhdHRlcm4gbWF0Y2hpbmcgaWRzIHRoYXQgY29tZSBpbiBvbmUgb2YgdGhlIGZvcm06XG4gKiAtICd7XCJ0eXBlXCI6XCJjb21wb25lbnRcIixcImluZGV4XCI6W1wiTUFUQ0hcIl19LmNoaWxkcmVuJ1xuICogLSAne1widHlwZVwiOlwiY29tcG9uZW50XCIsXCJpbmRleFwiOltcIk1BVENIXCJdfSdcbiAqXG4gKiBAcGFyYW0gaWQgVGhlIHJhdyBvYmplY3QgYXMgYSBzdHJpbmcgaWQuXG4gKiBAcmV0dXJucyBUaGUgaWQgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQTUNJZChpZCkge1xuICAgIGxldCBjb21wb25lbnRJZCwgcHJvcE5hbWU7XG4gICAgY29uc3QgaW5kZXggPSBpZC5sYXN0SW5kZXhPZignfScpO1xuICAgIGlmIChpbmRleCArIDIgPCBpZC5sZW5ndGgpIHtcbiAgICAgICAgcHJvcE5hbWUgPSBpZC5zdWJzdHJpbmcoaW5kZXggKyAyKTtcbiAgICAgICAgY29tcG9uZW50SWQgPSBKU09OLnBhcnNlKGlkLnN1YnN0cmluZygwLCBpbmRleCArIDEpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudElkID0gSlNPTi5wYXJzZShpZCk7XG4gICAgfVxuICAgIHJldHVybiBbY29tcG9uZW50SWQsIHByb3BOYW1lXTtcbn1cbi8qKlxuICogR2V0IGFsbCB0aGUgYXNzb2NpYXRlZCBpZHMgZm9yIGFuIGlkLlxuICpcbiAqIEBwYXJhbSBpZCBJZCB0byBnZXQgYWxsIHRoZSBwbWMgaWRzIGZyb20uXG4gKiBAcGFyYW0gc3RhdGUgU3RhdGUgb2YgdGhlIHN0b3JlLlxuICogQHBhcmFtIHRyaWdnZXJLZXkgS2V5IHRvIHJlbW92ZSBmcm9tIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uLlxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbFBNQ0lkcyhpZCwgc3RhdGUsIHRyaWdnZXJLZXkpIHtcbiAgICBjb25zdCBrZXlzT2ZJZHMgPSBrZXlzKGlkKTtcbiAgICBjb25zdCBpZEtleSA9IGtleXNPZklkcy5qb2luKCcsJyk7XG4gICAgcmV0dXJuIHN0YXRlLnBhdGhzLm9ianNbaWRLZXldXG4gICAgICAgIC5tYXAoKG9iaikgPT4ga2V5c09mSWRzLnJlZHVjZSgoYWNjLCBrZXksIGkpID0+IHtcbiAgICAgICAgYWNjW2tleV0gPSBvYmoudmFsdWVzW2ldO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KSlcbiAgICAgICAgLmZpbHRlcigob2JqKSA9PiBlcXVhbHMoZGlzc29jKHRyaWdnZXJLZXksIG9iaiksIGRpc3NvYyh0cmlnZ2VyS2V5LCBpZCkpKTtcbn1cbi8qKlxuICogUmVwbGFjZSB0aGUgcGF0dGVybiBtYXRjaGluZyBpZHMgd2l0aCB0aGUgYWN0dWFsIHRyaWdnZXIgdmFsdWVcbiAqIGZvciBNQVRDSCwgYWxsIHRoZSBpZHMgZm9yIEFMTCBhbmQgc21hbGxlciB0aGFuIHRoZSB0cmlnZ2VyIHZhbHVlXG4gKiBmb3IgQUxMU01BTExFUi5cbiAqXG4gKiBAcGFyYW0gaWQgVGhlIHBhcnNlZCBpZCBpbiBkaWN0aW9uYXJ5IGZvcm1hdC5cbiAqIEBwYXJhbSBjYiBPcmlnaW5hbCBjYWxsYmFjayBpbmZvLlxuICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHRoZSBkZXBlbmRlbmN5IGluIGNhc2UgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBjaGFuZ2VkIGlkLlxuICogQHBhcmFtIGdldFN0YXRlIEZ1bmN0aW9uIHRvIGdldCB0aGUgc3RhdGUgb2YgdGhlIHJlZHV4IHN0b3JlLlxuICogQHJldHVybnMgTGlzdCBvZiByZXBsYWNlZCBpZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlUE1DKGlkLCBjYiwgaW5kZXgsIGdldFN0YXRlKSB7XG4gICAgbGV0IGV4dHJhcyA9IFtdO1xuICAgIGNvbnN0IHJlcGxhY2VkID0ge307XG4gICAgdG9QYWlycyhpZCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGlmIChleHRyYXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBBbGwgZG9uZS5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJWYWx1ZSA9IChjYi5wYXJzZWRDaGFuZ2VkUHJvcHNJZHNbaW5kZXhdIHx8XG4gICAgICAgICAgICAgICAgY2IucGFyc2VkQ2hhbmdlZFByb3BzSWRzWzBdKVtrZXldO1xuICAgICAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKCdNQVRDSCcpKSB7XG4gICAgICAgICAgICAgICAgcmVwbGFjZWRba2V5XSA9IHRyaWdnZXJWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLmluY2x1ZGVzKCdBTEwnKSkge1xuICAgICAgICAgICAgICAgIGV4dHJhcyA9IGdldEFsbFBNQ0lkcyhpZCwgZ2V0U3RhdGUoKSwga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLmluY2x1ZGVzKCdBTExTTUFMTEVSJykpIHtcbiAgICAgICAgICAgICAgICBleHRyYXMgPSBnZXRBbGxQTUNJZHMoaWQsIGdldFN0YXRlKCksIGtleSkuZmlsdGVyKChvYmopID0+IG9ialtrZXldIDwgdHJpZ2dlclZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGxhY2VkW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChleHRyYXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBleHRyYXM7XG4gICAgfVxuICAgIHJldHVybiBbcmVwbGFjZWRdO1xufVxuIiwiaW1wb3J0IHsgYmF0Y2ggfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgeyBzZXRHcmFwaHMgfSBmcm9tICcuL2luZGV4JztcbmltcG9ydCBhcGlUaHVuayBmcm9tICcuL2FwaSc7XG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdERlcGVuZGVuY2llcygpIHtcbiAgICByZXR1cm4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgICAgICBiYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGdyYXBocyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKHNldEdyYXBocyh7IC4uLmdyYXBocywgcmVzZXQ6IHRydWUgfSkpO1xuICAgICAgICAgICAgZGlzcGF0Y2goYXBpVGh1bmsoJ19kYXNoLWRlcGVuZGVuY2llcycsICdHRVQnLCAnZGVwZW5kZW5jaWVzUmVxdWVzdCcpKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbmZpZ0Zyb21ET00oKSB7XG4gICAgY29uc3QgY29uZmlnRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdfZGFzaC1jb25maWcnKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShjb25maWdFbGVtZW50Py50ZXh0Q29udGVudCA/IGNvbmZpZ0VsZW1lbnQ/LnRleHRDb250ZW50IDogJ3t9Jyk7XG59XG4iLCJpbXBvcnQgeyBwYXRoIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgRGFzaENvbnRleHQsIHVzZURhc2hDb250ZXh0IH0gZnJvbSAnLi93cmFwcGVyL0Rhc2hDb250ZXh0JztcbmltcG9ydCB7IGdldFBhdGggfSBmcm9tICcuL2FjdGlvbnMvcGF0aHMnO1xuaW1wb3J0IHsgZ2V0U3RvcmVzIH0gZnJvbSAnLi91dGlscy9zdG9yZXMnO1xuaW1wb3J0IEV4dGVybmFsV3JhcHBlciBmcm9tICcuL3dyYXBwZXIvRXh0ZXJuYWxXcmFwcGVyJztcbmltcG9ydCB7IHN0cmluZ2lmeUlkIH0gZnJvbSAnLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBEZXZ0b29sQ29udGV4dCwgdXNlRGV2dG9vbCwgdXNlRGV2dG9vbE1lbnVCdXR0b25DbGFzc05hbWUgfSBmcm9tICcuL2NvbXBvbmVudHMvZXJyb3IvbWVudS9EZXZ0b29sQ29udGV4dCc7XG4vKipcbiAqIEdldCB0aGUgZGFzaCBwcm9wcyBmcm9tIGEgY29tcG9uZW50IHBhdGggb3IgaWQuXG4gKlxuICogQHBhcmFtIGNvbXBvbmVudFBhdGhPcklkIFRoZSBwYXRoIG9yIHRoZSBpZCBvZiB0aGUgY29tcG9uZW50IHRvIGdldCB0aGUgcHJvcHMgb2YuXG4gKiBAcGFyYW0gcHJvcFBhdGggQWRkaXRpb25hbCBrZXkgdG8gZ2V0IHRoZSBwcm9wZXJ0eSBpbnN0ZWFkIG9mIHBsYWluIHByb3BzLlxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gZ2V0TGF5b3V0KGNvbXBvbmVudFBhdGhPcklkKSB7XG4gICAgY29uc3QgZHMgPSBnZXRTdG9yZXMoKTtcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGRzLmxlbmd0aDsgeSsrKSB7XG4gICAgICAgIGNvbnN0IHsgcGF0aHMsIGxheW91dCB9ID0gZHNbeV0uZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IGNvbXBvbmVudFBhdGg7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb21wb25lbnRQYXRoT3JJZCkpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudFBhdGggPSBnZXRQYXRoKHBhdGhzLCBjb21wb25lbnRQYXRoT3JJZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb21wb25lbnRQYXRoID0gY29tcG9uZW50UGF0aE9ySWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvcHMgPSBwYXRoKGNvbXBvbmVudFBhdGgsIGxheW91dCk7XG4gICAgICAgIGlmIChwcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgICAgIH1cbiAgICB9XG59XG53aW5kb3cuZGFzaF9jb21wb25lbnRfYXBpID0gT2JqZWN0LmFzc2lnbih3aW5kb3cuZGFzaF9jb21wb25lbnRfYXBpIHx8IHt9LCB7XG4gICAgRXh0ZXJuYWxXcmFwcGVyLFxuICAgIERhc2hDb250ZXh0LFxuICAgIHVzZURhc2hDb250ZXh0LFxuICAgIGdldExheW91dCxcbiAgICBzdHJpbmdpZnlJZCxcbiAgICBkZXZ0b29sOiB7XG4gICAgICAgIERldnRvb2xDb250ZXh0LFxuICAgICAgICB1c2VEZXZ0b29sLFxuICAgICAgICB1c2VEZXZ0b29sTWVudUJ1dHRvbkNsYXNzTmFtZVxuICAgIH1cbn0pO1xuIiwiY29uc3QgdXBkYXRlVGl0bGUgPSAoZ2V0U3RhdGUpID0+IHtcbiAgICBjb25zdCB7IGNvbmZpZywgaXNMb2FkaW5nIH0gPSBnZXRTdGF0ZSgpO1xuICAgIGNvbnN0IHVwZGF0ZV90aXRsZSA9IGNvbmZpZz8udXBkYXRlX3RpdGxlO1xuICAgIGlmICghdXBkYXRlX3RpdGxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzTG9hZGluZykge1xuICAgICAgICBpZiAoZG9jdW1lbnQudGl0bGUgIT09IHVwZGF0ZV90aXRsZSkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIudGl0bGUgPSBkb2N1bWVudC50aXRsZTtcbiAgICAgICAgICAgIGRvY3VtZW50LnRpdGxlID0gdXBkYXRlX3RpdGxlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoZG9jdW1lbnQudGl0bGUgPT09IHVwZGF0ZV90aXRsZSkge1xuICAgICAgICAgICAgZG9jdW1lbnQudGl0bGUgPSBvYnNlcnZlci50aXRsZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9ic2VydmVyLnRpdGxlID0gZG9jdW1lbnQudGl0bGU7XG4gICAgICAgIH1cbiAgICB9XG59O1xuY29uc3Qgb2JzZXJ2ZXIgPSB7XG4gICAgaW5wdXRzOiBbJ2lzTG9hZGluZyddLFxuICAgIG11dGF0aW9uT2JzZXJ2ZXI6IHVuZGVmaW5lZCxcbiAgICBvYnNlcnZlcjogKHsgZ2V0U3RhdGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmZpZyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgaWYgKG9ic2VydmVyLmNvbmZpZyAhPT0gY29uZmlnKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICBvYnNlcnZlci5tdXRhdGlvbk9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBvYnNlcnZlci5tdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gdXBkYXRlVGl0bGUoZ2V0U3RhdGUpKTtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKTtcbiAgICAgICAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLm11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZSh0aXRsZSwge1xuICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckRhdGE6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVUaXRsZShnZXRTdGF0ZSk7XG4gICAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IG9ic2VydmVyO1xuIiwiaW1wb3J0IHsgY29uY2F0LCBmbGF0dGVuLCBpc0VtcHR5LCBpc05pbCwgbWFwLCBwYXRoLCBrZXlzLCBwaWNrQnksIHRvUGFpcnMsIHBhdGhPciB9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7IGFnZ3JlZ2F0ZUNhbGxiYWNrcywgYWRkUmVxdWVzdGVkQ2FsbGJhY2tzLCByZW1vdmVFeGVjdXRlZENhbGxiYWNrcywgYWRkQ29tcGxldGVkQ2FsbGJhY2tzLCBhZGRTdG9yZWRDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBwYXJzZUlmV2lsZGNhcmQgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBjb21iaW5lSWRBbmRQcm9wLCBnZXRDYWxsYmFja3NCeUlucHV0LCBnZXRMYXlvdXRDYWxsYmFja3MsIGluY2x1ZGVPYnNlcnZlcnMgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llc190cyc7XG5pbXBvcnQgeyB1cGRhdGVQcm9wcywgc2V0UGF0aHMsIGhhbmRsZUFzeW5jRXJyb3IgfSBmcm9tICcuLi9hY3Rpb25zJztcbmltcG9ydCB7IGdldFBhdGgsIGNvbXB1dGVQYXRocyB9IGZyb20gJy4uL2FjdGlvbnMvcGF0aHMnO1xuaW1wb3J0IHsgYXBwbHlQZXJzaXN0ZW5jZSwgcHJ1bmVQZXJzaXN0ZW5jZSB9IGZyb20gJy4uL3BlcnNpc3RlbmNlJztcbmNvbnN0IG9ic2VydmVyID0ge1xuICAgIG9ic2VydmVyOiAoeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrczogeyBleGVjdXRlZCB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBmdW5jdGlvbiBhcHBseVByb3BzKGlkLCB1cGRhdGVkUHJvcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbGF5b3V0LCBwYXRocyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1wYXRoID0gZ2V0UGF0aChwYXRocywgaWQpO1xuICAgICAgICAgICAgaWYgKCFpdGVtcGF0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBjYWxsYmFjay1nZW5lcmF0ZWQgdXBkYXRlLlxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpbnZhbGlkYXRlcyBleGlzdGluZyBwZXJzaXN0ZWQgcHJvcCB2YWx1ZXMsXG4gICAgICAgICAgICAvLyBvciBpZiBwZXJzaXN0ZW5jZSBjaGFuZ2VkLCB3aGV0aGVyIHRoaXMgdXBkYXRlcyBvdGhlciBwcm9wcy5cbiAgICAgICAgICAgIHVwZGF0ZWRQcm9wcyA9IHBydW5lUGVyc2lzdGVuY2UocGF0aChpdGVtcGF0aCwgbGF5b3V0KSwgdXBkYXRlZFByb3BzLCBkaXNwYXRjaCk7XG4gICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSB1cGRhdGUgY29udGFpbnMgd2hvbGUgY29tcG9uZW50cywgc2VlIGlmIGFueSBvZlxuICAgICAgICAgICAgLy8gdGhvc2UgY29tcG9uZW50cyBoYXZlIHByb3BzIHRvIHVwZGF0ZSB0byBwZXJzaXN0IHVzZXIgZWRpdHMuXG4gICAgICAgICAgICBjb25zdCB7IHByb3BzIH0gPSBhcHBseVBlcnNpc3RlbmNlKHsgcHJvcHM6IHVwZGF0ZWRQcm9wcyB9LCBkaXNwYXRjaCk7XG4gICAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVQcm9wcyh7XG4gICAgICAgICAgICAgICAgaXRlbXBhdGgsXG4gICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgc291cmNlOiAncmVzcG9uc2UnLFxuICAgICAgICAgICAgICAgIHJlbmRlclR5cGU6ICdjYWxsYmFjaydcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBwcm9wcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVxdWVzdGVkQ2FsbGJhY2tzID0gW107XG4gICAgICAgIGNvbnN0IHN0b3JlZENhbGxiYWNrcyA9IFtdO1xuICAgICAgICBleGVjdXRlZC5mb3JFYWNoKGNiID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZWRlY2Vzc29ycyA9IGNvbmNhdChjYi5wcmVkZWNlc3NvcnMgPz8gW10sIFtjYi5jYWxsYmFja10pO1xuICAgICAgICAgICAgY29uc3QgeyBjYWxsYmFjazogeyBjbGllbnRzaWRlX2Z1bmN0aW9uLCBvdXRwdXQgfSwgZXhlY3V0aW9uUmVzdWx0IH0gPSBjYjtcbiAgICAgICAgICAgIGlmIChpc05pbChleGVjdXRpb25SZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBlcnJvciwgcGF5bG9hZCB9ID0gZXhlY3V0aW9uUmVzdWx0O1xuICAgICAgICAgICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZvckVhY2goKFtpZCwgcHJvcHNdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZElkID0gcGFyc2VJZldpbGRjYXJkKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBncmFwaHMsIGxheW91dDogb2xkTGF5b3V0LCBwYXRoczogb2xkUGF0aHMgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIENvbXBvbmVudHMgd2lsbCB0cmlnZ2VyIGNhbGxiYWNrcyBvbiB0aGVpciBvd24gYXMgcmVxdWlyZWQgKGVnLiBkZXJpdmVkKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcHBsaWVkUHJvcHMgPSBhcHBseVByb3BzKHBhcnNlZElkLCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCBjYWxsYmFja3MgZm9yIG1vZGlmaWVkIGlucHV0c1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDYWxsYmFja3MgPSBjb25jYXQocmVxdWVzdGVkQ2FsbGJhY2tzLCBmbGF0dGVuKG1hcChwcm9wID0+IGdldENhbGxiYWNrc0J5SW5wdXQoZ3JhcGhzLCBvbGRQYXRocywgcGFyc2VkSWQsIHByb3AsIHRydWUpLCBrZXlzKHByb3BzKSkpLm1hcChyY2IgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJjYixcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlY2Vzc29yc1xuICAgICAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlUGF0aCA9IGdldFBhdGgob2xkUGF0aHMsIHBhcnNlZElkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiYXNlUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZE9iaiA9IHBhdGgoYmFzZVBhdGgsIG9sZExheW91dCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuUHJvcHMgPSBwYXRoT3IoJ2RlZmF1bHRWYWx1ZScsIFtvbGRPYmoubmFtZXNwYWNlLCBvbGRPYmoudHlwZV0sIHdpbmRvdy5fX2Rhc2hwcml2YXRlX2NoaWxkcmVuUHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVQYXRocyA9IChjaGlsZHJlbiwgb2xkQ2hpbGRyZW4sIG9sZENoaWxkcmVuUGF0aCwgZmlsdGVyUm9vdCA9IGZhbHNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvUGF0aHMgPSBnZXRTdGF0ZSgpLnBhdGhzO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aHMgPSBjb21wdXRlUGF0aHMoY2hpbGRyZW4sIG9sZENoaWxkcmVuUGF0aCwgb1BhdGhzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHNldFBhdGhzKHBhdGhzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgY2FsbGJhY2tzIGZvciBuZXcgbGF5b3V0ICh3LyBleGVjdXRpb24gZ3JvdXApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDYWxsYmFja3MgPSBjb25jYXQocmVxdWVzdGVkQ2FsbGJhY2tzLCBnZXRMYXlvdXRDYWxsYmFja3MoZ3JhcGhzLCBwYXRocywgY2hpbGRyZW4sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua1BhdGg6IG9sZENoaWxkcmVuUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJSb290XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5tYXAocmNiID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmNiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlY2Vzc29yc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpbGRjYXJkIGNhbGxiYWNrcyB3aXRoIGFycmF5IGlucHV0cyAoQUxMIC8gQUxMU01BTExFUikgbmVlZCB0byB0cmlnZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVuIGR1ZSB0byB0aGUgZGVsZXRpb24gb2YgY29tcG9uZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ2FsbGJhY2tzID0gY29uY2F0KHJlcXVlc3RlZENhbGxiYWNrcywgZ2V0TGF5b3V0Q2FsbGJhY2tzKGdyYXBocywgb2xkUGF0aHMsIG9sZENoaWxkcmVuLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZEFycmF5SW5wdXRzT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRoczogcGF0aHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtQYXRoOiBvbGRDaGlsZHJlblBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUm9vdFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkubWFwKHJjYiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJjYixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWNvbXB1dGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIFsnY2hpbGRyZW4nXVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChjaGlsZHJlblByb3BzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goY2hpbGRyZW5Qcm9wID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvbXB1dGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygnW10nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtmcm9udFBhdGhdID0gY2hpbGRyZW5Qcm9wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnW10nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKHAgPT4gcC5zcGxpdCgnLicpLmZpbHRlcihlID0+IGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcm9udE9iaiA9IHBhdGgoZnJvbnRQYXRoLCBhcHBsaWVkUHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZnJvbnRPYmopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmF3bCBsYXlvdXQgbmVlZHMgdGhlIG5zL3R5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVQYXRocyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm9sZE9iaixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm9sZE9iai5wcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmFwcGxpZWRQcm9wc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgb2xkT2JqLCBiYXNlUGF0aCwga2V5cyhhcHBsaWVkUHJvcHMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGRvIGl0IG9uY2UgZm9yIHRoZSBjb21wb25lbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb21wdXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlblByb3BQYXRoID0gY2hpbGRyZW5Qcm9wLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBwYXRoKGNoaWxkcmVuUHJvcFBhdGgsIGFwcGxpZWRQcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZENoaWxkcmVuUGF0aCA9IGNvbmNhdChnZXRQYXRoKG9sZFBhdGhzLCBwYXJzZWRJZCksIFsncHJvcHMnXS5jb25jYXQoY2hpbGRyZW5Qcm9wUGF0aCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZENoaWxkcmVuID0gcGF0aChvbGRDaGlsZHJlblBhdGgsIG9sZExheW91dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGF0aHMoY2hpbGRyZW4sIG9sZENoaWxkcmVuLCBvbGRDaGlsZHJlblBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcGVyc2lzdGVuY2UgZWRnZSBjYXNlOiBpZiB5b3UgZXhwbGljaXRseSB1cGRhdGUgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHBlcnNpc3RlbmNlIGtleSwgb3RoZXIgcHJvcHMgbWF5IGNoYW5nZSB0aGF0IHJlcXVpcmUgdXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdG8gZmlyZSBhZGRpdGlvbmFsIGNhbGxiYWNrc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRlZFByb3BzID0gcGlja0J5KChfLCBrKSA9PiAhKGsgaW4gcHJvcHMpLCBhcHBsaWVkUHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRW1wdHkoYWRkZWRQcm9wcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZ3JhcGhzOiBjdXJyZW50R3JhcGhzLCBwYXRocyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENhbGxiYWNrcyA9IGNvbmNhdChyZXF1ZXN0ZWRDYWxsYmFja3MsIGluY2x1ZGVPYnNlcnZlcnMoaWQsIGFkZGVkUHJvcHMsIGN1cnJlbnRHcmFwaHMsIHBhdGhzKS5tYXAocmNiID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmNiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlY2Vzc29yc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIEFkZCBpbmZvcm1hdGlvbiBhYm91dCBwb3RlbnRpYWxseSB1cGRhdGVkIG91dHB1dHMgdnMuIHVwZGF0ZWQgb3V0cHV0cyxcbiAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgYmUgdXNlZCB0byBkcm9wIGNhbGxiYWNrcyBmcm9tIGV4ZWN1dGlvbiBncm91cHMgd2hlbiBubyBvdXRwdXRcbiAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyB0aGUgZG93bnN0cmVhbSBjYWxsYmFjaydzIGlucHV0cyB3ZXJlIG1vZGlmaWVkXG4gICAgICAgICAgICAgICAgc3RvcmVkQ2FsbGJhY2tzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAuLi5jYixcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uTWV0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsUHJvcHM6IG1hcChjb21iaW5lSWRBbmRQcm9wLCBmbGF0dGVuKGNiLmdldE91dHB1dHMoZ2V0U3RhdGUoKS5wYXRocykpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRQcm9wczogZmxhdHRlbihtYXAoKFtpZCwgdmFsdWVdKSA9PiBtYXAocHJvcGVydHkgPT4gY29tYmluZUlkQW5kUHJvcCh7IGlkLCBwcm9wZXJ0eSB9KSwga2V5cyh2YWx1ZSkpLCB0b1BhaXJzKGRhdGEpKSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgICAgICAgICBpZiAoY2IuY2FsbGJhY2subm9fb3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHRzID0ga2V5cyhjYi5jaGFuZ2VkUHJvcElkcykuam9pbignLCAnKTtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBDYWxsYmFjayBlcnJvciB3aXRoIG5vIG91dHB1dCBmcm9tIGlucHV0ICR7aW5wdHN9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dHMgPSBwYXlsb2FkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG1hcChjb21iaW5lSWRBbmRQcm9wLCBmbGF0dGVuKFtwYXlsb2FkLm91dHB1dHNdKSkuam9pbignLCAnKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgQ2FsbGJhY2sgZXJyb3IgdXBkYXRpbmcgJHtvdXRwdXRzfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjbGllbnRzaWRlX2Z1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbmFtZXNwYWNlOiBucywgZnVuY3Rpb25fbmFtZTogZm4gfSA9IGNsaWVudHNpZGVfZnVuY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gYCB2aWEgY2xpZW50c2lkZSBmdW5jdGlvbiAke25zfS4ke2ZufWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZUFzeW5jRXJyb3IoZXJyb3IsIG1lc3NhZ2UsIGRpc3BhdGNoKTtcbiAgICAgICAgICAgICAgICBzdG9yZWRDYWxsYmFja3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25NZXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxQcm9wczogbWFwKGNvbWJpbmVJZEFuZFByb3AsIGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhnZXRTdGF0ZSgpLnBhdGhzKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFByb3BzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkaXNwYXRjaChhZ2dyZWdhdGVDYWxsYmFja3MoW1xuICAgICAgICAgICAgZXhlY3V0ZWQubGVuZ3RoID8gcmVtb3ZlRXhlY3V0ZWRDYWxsYmFja3MoZXhlY3V0ZWQpIDogbnVsbCxcbiAgICAgICAgICAgIGV4ZWN1dGVkLmxlbmd0aCA/IGFkZENvbXBsZXRlZENhbGxiYWNrcyhleGVjdXRlZC5sZW5ndGgpIDogbnVsbCxcbiAgICAgICAgICAgIHN0b3JlZENhbGxiYWNrcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IGFkZFN0b3JlZENhbGxiYWNrcyhzdG9yZWRDYWxsYmFja3MpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgcmVxdWVzdGVkQ2FsbGJhY2tzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gYWRkUmVxdWVzdGVkQ2FsbGJhY2tzKHJlcXVlc3RlZENhbGxiYWNrcylcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgXSkpO1xuICAgIH0sXG4gICAgaW5wdXRzOiBbJ2NhbGxiYWNrcy5leGVjdXRlZCddXG59O1xuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQgeyBhc3NvYywgZmluZCwgcGFydGl0aW9uIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWRkRXhlY3V0ZWRDYWxsYmFja3MsIGFkZFdhdGNoZWRDYWxsYmFja3MsIGFnZ3JlZ2F0ZUNhbGxiYWNrcywgcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzLCByZW1vdmVXYXRjaGVkQ2FsbGJhY2tzIH0gZnJvbSAnLi4vYWN0aW9ucy9jYWxsYmFja3MnO1xuaW1wb3J0IHsgZ2V0QXBwU3RhdGUgfSBmcm9tICcuLi9yZWR1Y2Vycy9jb25zdGFudHMnO1xuY29uc3Qgb2JzZXJ2ZXIgPSB7XG4gICAgb2JzZXJ2ZXI6ICh7IGRpc3BhdGNoLCBnZXRTdGF0ZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2tzOiB7IGV4ZWN1dGluZyB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBbZGVmZXJyZWQsIHNraXBwZWRPclJlYWR5XSA9IHBhcnRpdGlvbihjYiA9PiBjYi5leGVjdXRpb25Qcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSwgZXhlY3V0aW5nKTtcbiAgICAgICAgZGlzcGF0Y2goYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgIGV4ZWN1dGluZy5sZW5ndGggPyByZW1vdmVFeGVjdXRpbmdDYWxsYmFja3MoZXhlY3V0aW5nKSA6IG51bGwsXG4gICAgICAgICAgICBkZWZlcnJlZC5sZW5ndGggPyBhZGRXYXRjaGVkQ2FsbGJhY2tzKGRlZmVycmVkKSA6IG51bGwsXG4gICAgICAgICAgICBza2lwcGVkT3JSZWFkeS5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IGFkZEV4ZWN1dGVkQ2FsbGJhY2tzKHNraXBwZWRPclJlYWR5Lm1hcChjYiA9PiBhc3NvYygnZXhlY3V0aW9uUmVzdWx0JywgY2IuZXhlY3V0aW9uUHJvbWlzZSwgY2IpKSlcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgXSkpO1xuICAgICAgICBkZWZlcnJlZC5mb3JFYWNoKGFzeW5jIChjYikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2IuZXhlY3V0aW9uUHJvbWlzZTtcbiAgICAgICAgICAgIGNvbnN0IHsgY2FsbGJhY2tzOiB7IHdhdGNoZWQgfSwgYXBwTGlmZWN5Y2xlLCBob29rczogeyBjYWxsYmFja19yZXNvbHZlZCB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgICAgaWYgKGFwcExpZmVjeWNsZSAhPT0gZ2V0QXBwU3RhdGUoJ0hZRFJBVEVEJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2tfcmVzb2x2ZWQpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja19yZXNvbHZlZChjYi5jYWxsYmFjaywgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYmVlbiByZW1vdmVkIGZyb20gdGhlIGB3YXRjaGVkYCBsaXN0IHNpbmNlIC0gb24gY2FsbGJhY2sgY29tcGxldGlvbiwgYW5vdGhlciBjYWxsYmFjayBtYXkgYmUgY2FuY2VsbGVkXG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBjYWxsYmFjayBpbnN0YW5jZSBvciBvbmUgdGhhdCBtYXRjaGVzIGl0cyBwcm9taXNlIChlZy4gY291bGQgaGF2ZSBiZWVuIHBydW5lZClcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDYiA9IGZpbmQoX2NiID0+IF9jYiA9PT0gY2IgfHwgX2NiLmV4ZWN1dGlvblByb21pc2UgPT09IGNiLmV4ZWN1dGlvblByb21pc2UsIHdhdGNoZWQpO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50Q2IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UgbW92ZSB0byBgZXhlY3V0ZWRgIGFuZCByZW1vdmUgZnJvbSBgd2F0Y2hlZGBcbiAgICAgICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAgICAgcmVtb3ZlV2F0Y2hlZENhbGxiYWNrcyhbY3VycmVudENiXSksXG4gICAgICAgICAgICAgICAgYWRkRXhlY3V0ZWRDYWxsYmFja3MoW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50Q2IsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25SZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIF0pKTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBpbnB1dHM6IFsnY2FsbGJhY2tzLmV4ZWN1dGluZyddXG59O1xuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQgeyBnZXRQZW5kaW5nQ2FsbGJhY2tzIH0gZnJvbSAnLi4vdXRpbHMvY2FsbGJhY2tzJztcbmltcG9ydCB7IHNldElzTG9hZGluZyB9IGZyb20gJy4uL2FjdGlvbnMvaXNMb2FkaW5nJztcbmNvbnN0IG9ic2VydmVyID0ge1xuICAgIG9ic2VydmVyOiAoeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrcywgaXNMb2FkaW5nIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBwZW5kaW5nQ2FsbGJhY2tzID0gZ2V0UGVuZGluZ0NhbGxiYWNrcyhjYWxsYmFja3MpO1xuICAgICAgICAvLyBGaWx0ZXIgb3V0IHBlcnNpc3RlbnQgY2FsbGJhY2tzIC0gdGhleSBzaG91bGRuJ3QgdHJpZ2dlciB0aGUgbG9hZGluZyBpbmRpY2F0b3JcbiAgICAgICAgY29uc3Qgbm9uUGVyc2lzdGVudENhbGxiYWNrcyA9IHBlbmRpbmdDYWxsYmFja3MuZmlsdGVyKGNiID0+ICFjYi5jYWxsYmFjay5wZXJzaXN0ZW50KTtcbiAgICAgICAgY29uc3QgbmV4dCA9IEJvb2xlYW4obm9uUGVyc2lzdGVudENhbGxiYWNrcy5sZW5ndGgpO1xuICAgICAgICBpZiAoaXNMb2FkaW5nICE9PSBuZXh0KSB7XG4gICAgICAgICAgICBkaXNwYXRjaChzZXRJc0xvYWRpbmcobmV4dCkpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBpbnB1dHM6IFsnY2FsbGJhY2tzJ11cbn07XG5leHBvcnQgZGVmYXVsdCBvYnNlcnZlcjtcbiIsImltcG9ydCB7IGZpbmQsIGZsYXR0ZW4sIG1hcCwgcGFydGl0aW9uLCBzb3J0IH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWRkQmxvY2tlZENhbGxiYWNrcywgYWRkRXhlY3V0aW5nQ2FsbGJhY2tzLCBhZ2dyZWdhdGVDYWxsYmFja3MsIGV4ZWN1dGVDYWxsYmFjaywgcmVtb3ZlQmxvY2tlZENhbGxiYWNrcywgcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlJZCB9IGZyb20gJy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7IGNvbWJpbmVJZEFuZFByb3AgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llc190cyc7XG5pbXBvcnQgaXNBcHBSZWFkeSBmcm9tICcuLi9hY3Rpb25zL2lzQXBwUmVhZHknO1xuaW1wb3J0IHsgZ2V0QXBwU3RhdGUgfSBmcm9tICcuLi9yZWR1Y2Vycy9jb25zdGFudHMnO1xuY29uc3Qgc29ydFByaW9yaXR5ID0gKGMxLCBjMikgPT4ge1xuICAgIHJldHVybiAoYzEucHJpb3JpdHkgPz8gJycpID4gKGMyLnByaW9yaXR5ID8/ICcnKSA/IC0xIDogMTtcbn07XG5jb25zdCBnZXRTdGFzaCA9IChjYiwgcGF0aHMpID0+IHtcbiAgICBjb25zdCB7IGdldE91dHB1dHMgfSA9IGNiO1xuICAgIGNvbnN0IGFsbE91dHB1dHMgPSBnZXRPdXRwdXRzKHBhdGhzKTtcbiAgICBjb25zdCBmbGF0T3V0cHV0cyA9IGZsYXR0ZW4oYWxsT3V0cHV0cyk7XG4gICAgY29uc3QgYWxsUHJvcElkcyA9IFtdO1xuICAgIGNvbnN0IHJlcU91dCA9IHt9O1xuICAgIGZsYXRPdXRwdXRzLmZvckVhY2goKHsgaWQsIHByb3BlcnR5IH0pID0+IHtcbiAgICAgICAgY29uc3QgaWRTdHIgPSBzdHJpbmdpZnlJZChpZCk7XG4gICAgICAgIGNvbnN0IGlkT3V0ID0gKHJlcU91dFtpZFN0cl0gPSByZXFPdXRbaWRTdHJdIHx8IFtdKTtcbiAgICAgICAgaWRPdXQucHVzaChwcm9wZXJ0eSk7XG4gICAgICAgIGFsbFByb3BJZHMucHVzaChjb21iaW5lSWRBbmRQcm9wKHsgaWQ6IGlkU3RyLCBwcm9wZXJ0eSB9KSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgYWxsT3V0cHV0cywgYWxsUHJvcElkcyB9O1xufTtcbmNvbnN0IGdldElkcyA9IChjYiwgcGF0aHMpID0+IHtcbiAgICBjb25zdCBpdGVtcyA9IFtcbiAgICAgICAgLi4uZmxhdHRlbihjYi5nZXRJbnB1dHMocGF0aHMpKSxcbiAgICAgICAgLi4uZmxhdHRlbihjYi5nZXRTdGF0ZShwYXRocykpXG4gICAgXTtcbiAgICBjb25zdCB1bmlxdWVJZHMgPSBuZXcgTWFwKGl0ZW1zLm1hcChpdGVtID0+IFtzdHJpbmdpZnlJZChpdGVtLmlkKSwgaXRlbV0pKTtcbiAgICBjb25zdCB1bmlxdWVJdGVtcyA9IEFycmF5LmZyb20odW5pcXVlSWRzLnZhbHVlcygpKTtcbiAgICByZXR1cm4gdW5pcXVlSXRlbXM7XG59O1xuY29uc3Qgb2JzZXJ2ZXIgPSB7XG4gICAgb2JzZXJ2ZXI6IGFzeW5jICh7IGRpc3BhdGNoLCBnZXRTdGF0ZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2tzOiB7IGV4ZWN1dGluZywgd2F0Y2hlZCB9LCBjb25maWcsIGhvb2tzLCBsYXlvdXQsIHBhdGhzLCBhcHBMaWZlY3ljbGUgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGxldCB7IGNhbGxiYWNrczogeyBwcmlvcml0aXplZCB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBpZiAoYXBwTGlmZWN5Y2xlICE9PSBnZXRBcHBTdGF0ZSgnSFlEUkFURUQnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZSA9IE1hdGgubWF4KDAsIDEyIC0gZXhlY3V0aW5nLmxlbmd0aCAtIHdhdGNoZWQubGVuZ3RoKTtcbiAgICAgICAgLy8gT3JkZXIgcHJpb3JpdGl6ZWQgY2FsbGJhY2tzIGJhc2VkIG9uIGRlcHRoIGFuZCBicmVhZHRoIG9mIGNhbGxiYWNrIGNoYWluXG4gICAgICAgIHByaW9yaXRpemVkID0gc29ydChzb3J0UHJpb3JpdHksIHByaW9yaXRpemVkKTtcbiAgICAgICAgLy8gRGl2aWRlIGJldHdlZW4gc3luYyBhbmQgYXN5bmNcbiAgICAgICAgY29uc3QgW3N5bmNDYWxsYmFja3MsIGFzeW5jQ2FsbGJhY2tzXSA9IHBhcnRpdGlvbihjYiA9PiBpc0FwcFJlYWR5KGxheW91dCwgcGF0aHMsIGdldElkcyhjYiwgcGF0aHMpKSA9PT0gdHJ1ZSwgcHJpb3JpdGl6ZWQpO1xuICAgICAgICBjb25zdCBwaWNrZWRTeW5jQ2FsbGJhY2tzID0gc3luY0NhbGxiYWNrcy5zbGljZSgwLCBhdmFpbGFibGUpO1xuICAgICAgICBjb25zdCBwaWNrZWRBc3luY0NhbGxiYWNrcyA9IGFzeW5jQ2FsbGJhY2tzLnNsaWNlKDAsIGF2YWlsYWJsZSAtIHBpY2tlZFN5bmNDYWxsYmFja3MubGVuZ3RoKTtcbiAgICAgICAgaWYgKHBpY2tlZFN5bmNDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChhZ2dyZWdhdGVDYWxsYmFja3MoW1xuICAgICAgICAgICAgICAgIHJlbW92ZVByaW9yaXRpemVkQ2FsbGJhY2tzKHBpY2tlZFN5bmNDYWxsYmFja3MpLFxuICAgICAgICAgICAgICAgIGFkZEV4ZWN1dGluZ0NhbGxiYWNrcyhtYXAoY2IgPT4gZXhlY3V0ZUNhbGxiYWNrKGNiLCBjb25maWcsIGhvb2tzLCBwYXRocywgbGF5b3V0LCBnZXRTdGFzaChjYiwgcGF0aHMpLCBkaXNwYXRjaCwgZ2V0U3RhdGUpLCBwaWNrZWRTeW5jQ2FsbGJhY2tzKSlcbiAgICAgICAgICAgIF0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGlja2VkQXN5bmNDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBkZWZlcnJlZCA9IG1hcChjYiA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgIC4uLmdldFN0YXNoKGNiLCBwYXRocyksXG4gICAgICAgICAgICAgICAgaXNSZWFkeTogaXNBcHBSZWFkeShsYXlvdXQsIHBhdGhzLCBnZXRJZHMoY2IsIHBhdGhzKSlcbiAgICAgICAgICAgIH0pLCBwaWNrZWRBc3luY0NhbGxiYWNrcyk7XG4gICAgICAgICAgICBkaXNwYXRjaChhZ2dyZWdhdGVDYWxsYmFja3MoW1xuICAgICAgICAgICAgICAgIHJlbW92ZVByaW9yaXRpemVkQ2FsbGJhY2tzKHBpY2tlZEFzeW5jQ2FsbGJhY2tzKSxcbiAgICAgICAgICAgICAgICBhZGRCbG9ja2VkQ2FsbGJhY2tzKGRlZmVycmVkKVxuICAgICAgICAgICAgXSkpO1xuICAgICAgICAgICAgZGVmZXJyZWQuZm9yRWFjaChhc3luYyAoY2IpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBjYi5pc1JlYWR5O1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgY2FsbGJhY2tzOiB7IGJsb2NrZWQgfSB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBgYmxvY2tlZGAgbGlzdCBzaW5jZSAtIG9uXG4gICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgY29tcGxldGlvbiwgYW5vdGhlciBjYWxsYmFjayBtYXkgYmUgY2FuY2VsbGVkXG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgY2FsbGJhY2sgaW5zdGFuY2Ugb3Igb25lIHRoYXQgbWF0Y2hlcyBpdHMgcHJvbWlzZVxuICAgICAgICAgICAgICAgIC8vIChlZy4gY291bGQgaGF2ZSBiZWVuIHBydW5lZClcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q2IgPSBmaW5kKF9jYiA9PiBfY2IgPT09IGNiIHx8IF9jYi5pc1JlYWR5ID09PSBjYi5pc1JlYWR5LCBibG9ja2VkKTtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRDYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGluZ0NhbGxiYWNrID0gZXhlY3V0ZUNhbGxiYWNrKGNiLCBjb25maWcsIGhvb2tzLCBwYXRocywgbGF5b3V0LCBjYiwgZGlzcGF0Y2gsIGdldFN0YXRlKTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChhZ2dyZWdhdGVDYWxsYmFja3MoW1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVCbG9ja2VkQ2FsbGJhY2tzKFtjYl0pLFxuICAgICAgICAgICAgICAgICAgICBhZGRFeGVjdXRpbmdDYWxsYmFja3MoW2V4ZWN1dGluZ0NhbGxiYWNrXSlcbiAgICAgICAgICAgICAgICBdKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaW5wdXRzOiBbJ2NhbGxiYWNrcy5wcmlvcml0aXplZCcsICdjYWxsYmFja3MuY29tcGxldGVkJ11cbn07XG5leHBvcnQgZGVmYXVsdCBvYnNlcnZlcjtcbiIsImltcG9ydCB7IGFsbCwgY29uY2F0LCBkaWZmZXJlbmNlLCBmaWx0ZXIsIGZsYXR0ZW4sIGdyb3VwQnksIGluY2x1ZGVzLCBpbnRlcnNlY3Rpb24sIGlzRW1wdHksIGlzTmlsLCBtYXAsIG1lcmdlTGVmdCwgbWVyZ2VXaXRoLCBwbHVjaywgcmVkdWNlLCB2YWx1ZXMgfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBhZ2dyZWdhdGVDYWxsYmFja3MsIHJlbW92ZVByaW9yaXRpemVkQ2FsbGJhY2tzLCByZW1vdmVFeGVjdXRpbmdDYWxsYmFja3MsIHJlbW92ZVdhdGNoZWRDYWxsYmFja3MsIGFkZFByaW9yaXRpemVkQ2FsbGJhY2tzLCBhZGRFeGVjdXRpbmdDYWxsYmFja3MsIGFkZFdhdGNoZWRDYWxsYmFja3MsIHJlbW92ZUJsb2NrZWRDYWxsYmFja3MsIGFkZEJsb2NrZWRDYWxsYmFja3MsIGFkZFJlcXVlc3RlZENhbGxiYWNrcywgcmVtb3ZlUmVxdWVzdGVkQ2FsbGJhY2tzIH0gZnJvbSAnLi4vYWN0aW9ucy9jYWxsYmFja3MnO1xuaW1wb3J0IHsgaXNNdWx0aVZhbHVlZCB9IGZyb20gJy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7IGNvbWJpbmVJZEFuZFByb3AsIGdldFJlYWR5Q2FsbGJhY2tzLCBnZXRVbmlxdWVJZGVudGlmaWVyLCBwcnVuZUNhbGxiYWNrcyB9IGZyb20gJy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzX3RzJztcbmltcG9ydCB3YWl0IGZyb20gJy4vLi4vdXRpbHMvd2FpdCc7XG5pbXBvcnQgeyBnZXRQZW5kaW5nQ2FsbGJhY2tzIH0gZnJvbSAnLi4vdXRpbHMvY2FsbGJhY2tzJztcbmNvbnN0IG9ic2VydmVyID0ge1xuICAgIG9ic2VydmVyOiBhc3luYyAoeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSkgPT4ge1xuICAgICAgICBhd2FpdCB3YWl0KDApO1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrcywgY2FsbGJhY2tzOiB7IHByaW9yaXRpemVkLCBibG9ja2VkLCBleGVjdXRpbmcsIHdhdGNoZWQsIHN0b3JlZCB9LCBwYXRocywgZ3JhcGhzIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBsZXQgeyBjYWxsYmFja3M6IHsgcmVxdWVzdGVkIH0gfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IGluaXRpYWxSZXF1ZXN0ZWQgPSByZXF1ZXN0ZWQuc2xpY2UoMCk7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdDYWxsYmFja3MgPSBnZXRQZW5kaW5nQ2FsbGJhY2tzKGNhbGxiYWNrcyk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICAwLiBQcnVuZSBjaXJjdWxhciBjYWxsYmFja3MgdGhhdCBoYXZlIGNvbXBsZXRlZCB0aGUgbG9vcFxuICAgICAgICAgICAgLSBjYi5jYWxsYmFjayBpbmNsdWRlZCBpbiBjYi5wcmVkZWNlc3NvcnNcbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgckNpcmN1bGFycyA9IGZpbHRlcihjYiA9PiBpbmNsdWRlcyhjYi5jYWxsYmFjaywgY2IucHJlZGVjZXNzb3JzID8/IFtdKSwgcmVxdWVzdGVkKTtcbiAgICAgICAgLypcbiAgICAgICAgICAgIFRPRE8/XG4gICAgICAgICAgICBDbGVhbiB1cCB0aGUgYHJlcXVlc3RlZGAgbGlzdCAtIGR1cmluZyB0aGUgZGlzcGF0Y2ggcGhhc2UsXG4gICAgICAgICAgICBjaXJjdWxhcnMgd2lsbCBiZSByZW1vdmVkIGZvciByZWFsXG4gICAgICAgICovXG4gICAgICAgIHJlcXVlc3RlZCA9IGRpZmZlcmVuY2UocmVxdWVzdGVkLCByQ2lyY3VsYXJzKTtcbiAgICAgICAgLypcbiAgICAgICAgICAgIDEuIFJlbW92ZSBkdXBsaWNhdGVkIGByZXF1ZXN0ZWRgIGNhbGxiYWNrcyAtIGdpdmUgcHJlY2VkZW5jZSB0byBuZXdlciBjYWxsYmFja3Mgb3ZlciBvbGRlciBvbmVzXG4gICAgICAgICovXG4gICAgICAgIGxldCByRHVwbGljYXRlcyA9IFtdO1xuICAgICAgICBjb25zdCByTWVyZ2VkRHVwbGljYXRlcyA9IFtdO1xuICAgICAgICB2YWx1ZXMoZ3JvdXBCeShnZXRVbmlxdWVJZGVudGlmaWVyLCByZXF1ZXN0ZWQpKS5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICAgICAgICAgIGlmIChncm91cC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBrZWVwIGNhbGxiYWNrIGlmIGl0cyB0aGUgb25seSBvbmUgb2YgaXRzIGtpbmRcbiAgICAgICAgICAgICAgICByTWVyZ2VkRHVwbGljYXRlcy5wdXNoKGdyb3VwWzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluaXRpYWwgPSBncm91cC5maW5kKGNiID0+IGNiLmluaXRpYWxDYWxsKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIHRoZSBpbml0aWFsIGNhbGxiYWNrIGlmIGl0J3Mgbm90IGFsb25lXG4gICAgICAgICAgICAgICAgICAgIHJEdXBsaWNhdGVzLnB1c2goaW5pdGlhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwV2l0aG91dEluaXRpYWwgPSBncm91cC5maWx0ZXIoY2IgPT4gY2IgIT09IGluaXRpYWwpO1xuICAgICAgICAgICAgICAgIGlmIChncm91cFdpdGhvdXRJbml0aWFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIG9ubHkgb25lIGNhbGxiYWNrIGJlc2lkZSB0aGUgaW5pdGlhbCBvbmUsIGtlZXAgdGhhdCBjYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICByTWVyZ2VkRHVwbGljYXRlcy5wdXNoKGdyb3VwV2l0aG91dEluaXRpYWxbMF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIG1lcmdlIGFsbCByZW1haW5pbmcgY2FsbGJhY2tzIHRvZ2V0aGVyXG4gICAgICAgICAgICAgICAgICAgIHJEdXBsaWNhdGVzID0gY29uY2F0KHJEdXBsaWNhdGVzLCBncm91cFdpdGhvdXRJbml0aWFsKTtcbiAgICAgICAgICAgICAgICAgICAgck1lcmdlZER1cGxpY2F0ZXMucHVzaChtZXJnZUxlZnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFByb3BJZHM6IHJlZHVjZShtZXJnZVdpdGgoTWF0aC5tYXgpLCB7fSwgcGx1Y2soJ2NoYW5nZWRQcm9wSWRzJywgZ3JvdXBXaXRob3V0SW5pdGlhbCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uR3JvdXA6IGZpbHRlcihleGcgPT4gQm9vbGVhbihleGcpLCBwbHVjaygnZXhlY3V0aW9uR3JvdXAnLCBncm91cFdpdGhvdXRJbml0aWFsKSkuc2xpY2UoLTEpWzBdXG4gICAgICAgICAgICAgICAgICAgIH0sIGdyb3VwV2l0aG91dEluaXRpYWwuc2xpY2UoLTEpWzBdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLypcbiAgICAgICAgICAgIFRPRE8/XG4gICAgICAgICAgICBDbGVhbiB1cCB0aGUgYHJlcXVlc3RlZGAgbGlzdCAtIGR1cmluZyB0aGUgZGlzcGF0Y2ggcGhhc2UsXG4gICAgICAgICAgICBkdXBsaWNhdGVzIHdpbGwgYmUgcmVtb3ZlZCBmb3IgcmVhbFxuICAgICAgICAqL1xuICAgICAgICByZXF1ZXN0ZWQgPSByTWVyZ2VkRHVwbGljYXRlcztcbiAgICAgICAgLypcbiAgICAgICAgICAgIDIuIFJlbW92ZSBkdXBsaWNhdGVkIGBwcmlvcml0aXplZGAsIGBleGVjdXRpbmdgIGFuZCBgd2F0Y2hpbmdgIGNhbGxiYWNrc1xuICAgICAgICAqL1xuICAgICAgICAvKlxuICAgICAgICAgICAgRXh0cmFjdCBhbGwgYnV0IHRoZSBmaXJzdCBjYWxsYmFjayBmcm9tIGVhY2ggSU9TLWtleSBncm91cFxuICAgICAgICAgICAgdGhlc2UgY2FsbGJhY2tzIGFyZSBgcHJpb3JpdGl6ZWRgIGFuZCBkdXBsaWNhdGVzLlxuICAgICAgICAqL1xuICAgICAgICBjb25zdCBwRHVwbGljYXRlcyA9IGZsYXR0ZW4obWFwKGdyb3VwID0+IGdyb3VwLnNsaWNlKDAsIC0xKSwgdmFsdWVzKGdyb3VwQnkoZ2V0VW5pcXVlSWRlbnRpZmllciwgY29uY2F0KHByaW9yaXRpemVkLCByZXF1ZXN0ZWQpKSkpKTtcbiAgICAgICAgY29uc3QgYkR1cGxpY2F0ZXMgPSBmbGF0dGVuKG1hcChncm91cCA9PiBncm91cC5zbGljZSgwLCAtMSksIHZhbHVlcyhncm91cEJ5KGdldFVuaXF1ZUlkZW50aWZpZXIsIGNvbmNhdChibG9ja2VkLCByZXF1ZXN0ZWQpKSkpKTtcbiAgICAgICAgY29uc3QgZUR1cGxpY2F0ZXMgPSBmbGF0dGVuKG1hcChncm91cCA9PiBncm91cC5zbGljZSgwLCAtMSksIHZhbHVlcyhncm91cEJ5KGdldFVuaXF1ZUlkZW50aWZpZXIsIGNvbmNhdChleGVjdXRpbmcsIHJlcXVlc3RlZCkpKSkpO1xuICAgICAgICBjb25zdCB3RHVwbGljYXRlcyA9IGZsYXR0ZW4obWFwKGdyb3VwID0+IGdyb3VwLnNsaWNlKDAsIC0xKSwgdmFsdWVzKGdyb3VwQnkoZ2V0VW5pcXVlSWRlbnRpZmllciwgY29uY2F0KHdhdGNoZWQsIHJlcXVlc3RlZCkpKSkpO1xuICAgICAgICAvKlxuICAgICAgICAgICAgMy4gTW9kaWZ5IG9yIHJlbW92ZSBjYWxsYmFja3MgdGhhdCBhcmUgb3V0cHV0dGluZyB0byBub24tZXhpc3RpbmcgbGF5b3V0IGBpZGAuXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IHsgYWRkZWQ6IHJBZGRlZCwgcmVtb3ZlZDogclJlbW92ZWQgfSA9IHBydW5lQ2FsbGJhY2tzKHJlcXVlc3RlZCwgcGF0aHMpO1xuICAgICAgICBjb25zdCB7IGFkZGVkOiBwQWRkZWQsIHJlbW92ZWQ6IHBSZW1vdmVkIH0gPSBwcnVuZUNhbGxiYWNrcyhwcmlvcml0aXplZCwgcGF0aHMpO1xuICAgICAgICBjb25zdCB7IGFkZGVkOiBiQWRkZWQsIHJlbW92ZWQ6IGJSZW1vdmVkIH0gPSBwcnVuZUNhbGxiYWNrcyhibG9ja2VkLCBwYXRocyk7XG4gICAgICAgIGNvbnN0IHsgYWRkZWQ6IGVBZGRlZCwgcmVtb3ZlZDogZVJlbW92ZWQgfSA9IHBydW5lQ2FsbGJhY2tzKGV4ZWN1dGluZywgcGF0aHMpO1xuICAgICAgICBjb25zdCB7IGFkZGVkOiB3QWRkZWQsIHJlbW92ZWQ6IHdSZW1vdmVkIH0gPSBwcnVuZUNhbGxiYWNrcyh3YXRjaGVkLCBwYXRocyk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgaXQgd2lsbCBiZSB1cGRhdGVkIGZvciByZWFsXG4gICAgICAgICovXG4gICAgICAgIHJlcXVlc3RlZCA9IGNvbmNhdChkaWZmZXJlbmNlKHJlcXVlc3RlZCwgclJlbW92ZWQpLCByQWRkZWQpO1xuICAgICAgICAvKlxuICAgICAgICAgICAgNC4gRmluZCBgcmVxdWVzdGVkYCBjYWxsYmFja3MgdGhhdCBkbyBub3QgZGVwZW5kIG9uIGEgb3V0c3RhbmRpbmcgb3V0cHV0IChhcyBlaXRoZXIgaW5wdXQgb3Igc3RhdGUpXG4gICAgICAgICovXG4gICAgICAgIGxldCByZWFkeUNhbGxiYWNrcyA9IGdldFJlYWR5Q2FsbGJhY2tzKHBhdGhzLCByZXF1ZXN0ZWQsIHBlbmRpbmdDYWxsYmFja3MsIGdyYXBocyk7XG4gICAgICAgIGxldCBvbGRCbG9ja2VkID0gW107XG4gICAgICAgIGxldCBuZXdCbG9ja2VkID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiB0aGVyZSBpcyA6XG4gICAgICAgICAqIC0gbm8gcmVhZHkgY2FsbGJhY2tzXG4gICAgICAgICAqIC0gYXQgbGVhc3Qgb25lIHJlcXVlc3RlZCBjYWxsYmFja1xuICAgICAgICAgKiAtIG5vIGFkZGl0aW9uYWwgcGVuZGluZyBjYWxsYmFja3NcbiAgICAgICAgICpcbiAgICAgICAgICogY2FuIGFzc3VtZTpcbiAgICAgICAgICogLSB0aGUgcmVxdWVzdGVkIGNhbGxiYWNrcyBhcmUgcGFydCBvZiBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgbG9vcFxuICAgICAgICAgKlxuICAgICAgICAgKiB0aGVuIHJlY3Vyc2l2ZWx5OlxuICAgICAgICAgKiAtIGFzc3VtZSB0aGUgZmlyc3QgY2FsbGJhY2sgaW4gdGhlIGxpc3QgaXMgcmVhZHkgKHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIGxvb3ApXG4gICAgICAgICAqIC0gY2hlY2sgd2hhdCBjYWxsYmFja3MgYXJlIGJsb2NrZWQgLyByZWFkeSB3aXRoIHRoZSBhc3N1bXB0aW9uXG4gICAgICAgICAqIC0gdXBkYXRlIHRoZSBtaXNzaW5nIHByZWRlY2Vzc29ycyBiYXNlZCBvbiBhc3N1bXB0aW9uc1xuICAgICAgICAgKiAtIGNvbnRpbnVlIHVudGlsIHRoZXJlIGFyZSBubyByZW1haW5pbmcgY2FuZGlkYXRlc1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKCFyZWFkeUNhbGxiYWNrcy5sZW5ndGggJiZcbiAgICAgICAgICAgIHJlcXVlc3RlZC5sZW5ndGggJiZcbiAgICAgICAgICAgIHJlcXVlc3RlZC5sZW5ndGggPT09IHBlbmRpbmdDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgY2FuZGlkYXRlcyA9IHJlcXVlc3RlZC5zbGljZSgwKTtcbiAgICAgICAgICAgIHdoaWxlIChjYW5kaWRhdGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIEFzc3VtZSAxc3QgY2FsbGJhY2sgaXMgcmVhZHkgYW5kXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNhbmRpZGF0ZXMgLyByZWFkeUNhbGxiYWNrcyBhY2NvcmRpbmdseVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWR5Q2FsbGJhY2sgPSBjYW5kaWRhdGVzWzBdO1xuICAgICAgICAgICAgICAgIHJlYWR5Q2FsbGJhY2tzLnB1c2gocmVhZHlDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlcyA9IGNhbmRpZGF0ZXMuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgLy8gUmVtYWluaW5nIGNhbmRpZGF0ZXMgYXJlIG5vdCBibG9ja2VkIGJ5IGN1cnJlbnQgYXNzdW1wdGlvbnNcbiAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gZ2V0UmVhZHlDYWxsYmFja3MocGF0aHMsIGNhbmRpZGF0ZXMsIHJlYWR5Q2FsbGJhY2tzKTtcbiAgICAgICAgICAgICAgICAvLyBCbG9ja2VkIHJlcXVlc3RzIG5lZWQgdG8gbWFrZSBzdXJlIHRoZXkgaGF2ZSB0aGUgY2FsbGJhY2sgYXMgYSBwcmVkZWNlc3NvclxuICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrZWRCeUFzc3VtcHRpb25zID0gZGlmZmVyZW5jZShjYW5kaWRhdGVzLCBjYW5kaWRhdGVzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RpZmllZCA9IGZpbHRlcihjYiA9PiAhY2IucHJlZGVjZXNzb3JzIHx8XG4gICAgICAgICAgICAgICAgICAgICFpbmNsdWRlcyhyZWFkeUNhbGxiYWNrLmNhbGxiYWNrLCBjYi5wcmVkZWNlc3NvcnMpLCBibG9ja2VkQnlBc3N1bXB0aW9ucyk7XG4gICAgICAgICAgICAgICAgb2xkQmxvY2tlZCA9IGNvbmNhdChvbGRCbG9ja2VkLCBtb2RpZmllZCk7XG4gICAgICAgICAgICAgICAgbmV3QmxvY2tlZCA9IGNvbmNhdChuZXdCbG9ja2VkLCBtb2RpZmllZC5tYXAoY2IgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICAgICAgICAgIHByZWRlY2Vzc29yczogY29uY2F0KGNiLnByZWRlY2Vzc29ycyA/PyBbXSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHlDYWxsYmFjay5jYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLypcbiAgICAgICAgICAgIFRPRE8/XG4gICAgICAgICAgICBDbGVhbiB1cCB0aGUgYHJlcXVlc3RlZGAgbGlzdCAtIGR1cmluZyB0aGUgZGlzcGF0Y2ggcGhhc2UsXG4gICAgICAgICAgICBpdCB3aWxsIGJlIHVwZGF0ZWQgZm9yIHJlYWxcbiAgICAgICAgKi9cbiAgICAgICAgcmVxdWVzdGVkID0gY29uY2F0KGRpZmZlcmVuY2UocmVxdWVzdGVkLCBvbGRCbG9ja2VkKSwgbmV3QmxvY2tlZCk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICA1LiBQcnVuZSBjYWxsYmFja3MgdGhhdCBiZWNhbWUgaXJyZWxldmFudCBpbiB0aGVpciBgZXhlY3V0aW9uR3JvdXBgXG4gICAgICAgICovXG4gICAgICAgIC8vIEdyb3VwIGJ5IGV4ZWN1dGlvbkdyb3VwLCBkcm9wIG5vbi1leGVjdXRpb25Hcm91cCBjYWxsYmFja3NcbiAgICAgICAgLy8gdGhvc2Ugd2VyZSBub3QgdHJpZ2dlcmVkIGJ5IGxheW91dCBjaGFuZ2VzIGFuZCBkb24ndCBoYXZlIFwic3Ryb25nXCIgaW50ZXJkZXBlbmRlbmN5IGZvclxuICAgICAgICAvLyBjYWxsYmFjayBjaGFpbiBjb21wbGV0aW9uXG4gICAgICAgIGNvbnN0IHBlbmRpbmdHcm91cHMgPSBncm91cEJ5KGNiID0+IGNiLmV4ZWN1dGlvbkdyb3VwLCBmaWx0ZXIoY2IgPT4gIWlzTmlsKGNiLmV4ZWN1dGlvbkdyb3VwKSwgc3RvcmVkKSk7XG4gICAgICAgIGNvbnN0IGRyb3BwZWQgPSBmaWx0ZXIoY2IgPT4ge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gYHN0b3JlZGAgY2FsbGJhY2sgZm9yIHRoZSBncm91cCwgbm8gb3V0cHV0cyB3ZXJlIGRyb3BwZWQgLT4gYGNiYCBpcyBrZXB0XG4gICAgICAgICAgICBpZiAoIWNiLmV4ZWN1dGlvbkdyb3VwIHx8XG4gICAgICAgICAgICAgICAgIXBlbmRpbmdHcm91cHNbY2IuZXhlY3V0aW9uR3JvdXBdIHx8XG4gICAgICAgICAgICAgICAgIXBlbmRpbmdHcm91cHNbY2IuZXhlY3V0aW9uR3JvdXBdLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEdldCBhbGwgaW5wdXRzIGZvciBgY2JgXG4gICAgICAgICAgICBjb25zdCBpbnB1dHMgPSBtYXAoY29tYmluZUlkQW5kUHJvcCwgZmxhdHRlbihjYi5nZXRJbnB1dHMocGF0aHMpKSk7XG4gICAgICAgICAgICAvLyBHZXQgYWxsIHRoZSBwb3RlbnRpYWxseSB1cGRhdGVkIHByb3BzIGZvciB0aGUgZ3JvdXAgc28gZmFyXG4gICAgICAgICAgICBjb25zdCBhbGxQcm9wcyA9IGZsYXR0ZW4obWFwKGdjYiA9PiBnY2IuZXhlY3V0aW9uTWV0YS5hbGxQcm9wcywgcGVuZGluZ0dyb3Vwc1tjYi5leGVjdXRpb25Hcm91cF0pKTtcbiAgICAgICAgICAgIC8vIEdldCBhbGwgdGhlIHVwZGF0ZWQgcHJvcHMgZm9yIHRoZSBncm91cCBzbyBmYXJcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBmbGF0dGVuKG1hcChnY2IgPT4gZ2NiLmV4ZWN1dGlvbk1ldGEudXBkYXRlZFByb3BzLCBwZW5kaW5nR3JvdXBzW2NiLmV4ZWN1dGlvbkdyb3VwXSkpO1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBubyBvdmVybGFwIGJldHdlZW4gdGhlIHVwZGF0ZWQgcHJvcHMgYW5kIHRoZSBpbnB1dHMsXG4gICAgICAgICAgICAvLyArIHRoZXJlJ3Mgbm8gcHJvcHMgdGhhdCBhcmVuJ3QgY292ZXJlZCBieSB0aGUgcG90ZW50aWFsbHkgdXBkYXRlZCBwcm9wcyxcbiAgICAgICAgICAgIC8vIGFuZCBub3QgYWxsIGlucHV0cyBhcmUgbXVsdGkgdmFsdWVkXG4gICAgICAgICAgICAvLyAtPiBkcm9wIGBjYmBcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGlzRW1wdHkoaW50ZXJzZWN0aW9uKGlucHV0cywgdXBkYXRlZCkpICYmXG4gICAgICAgICAgICAgICAgaXNFbXB0eShkaWZmZXJlbmNlKGlucHV0cywgYWxsUHJvcHMpKSAmJlxuICAgICAgICAgICAgICAgICFhbGwoaXNNdWx0aVZhbHVlZCwgY2IuY2FsbGJhY2suaW5wdXRzKTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0sIHJlYWR5Q2FsbGJhY2tzKTtcbiAgICAgICAgLypcbiAgICAgICAgICAgIFRPRE8/XG4gICAgICAgICAgICBDbGVhbiB1cCB0aGUgYHJlcXVlc3RlZGAgbGlzdCAtIGR1cmluZyB0aGUgZGlzcGF0Y2ggcGhhc2UsXG4gICAgICAgICAgICBpdCB3aWxsIGJlIHVwZGF0ZWQgZm9yIHJlYWxcbiAgICAgICAgKi9cbiAgICAgICAgcmVxdWVzdGVkID0gZGlmZmVyZW5jZShyZXF1ZXN0ZWQsIGRyb3BwZWQpO1xuICAgICAgICByZWFkeUNhbGxiYWNrcyA9IGRpZmZlcmVuY2UocmVhZHlDYWxsYmFja3MsIGRyb3BwZWQpO1xuICAgICAgICByZXF1ZXN0ZWQgPSBkaWZmZXJlbmNlKHJlcXVlc3RlZCwgcmVhZHlDYWxsYmFja3MpO1xuICAgICAgICBjb25zdCBhZGRlZCA9IGRpZmZlcmVuY2UocmVxdWVzdGVkLCBpbml0aWFsUmVxdWVzdGVkKTtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGRpZmZlcmVuY2UoaW5pdGlhbFJlcXVlc3RlZCwgcmVxdWVzdGVkKTtcbiAgICAgICAgZGlzcGF0Y2goYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RlZCBjYWxsYmFja3NcbiAgICAgICAgICAgIGFkZGVkLmxlbmd0aCA/IGFkZFJlcXVlc3RlZENhbGxiYWNrcyhhZGRlZCkgOiBudWxsLFxuICAgICAgICAgICAgcmVtb3ZlZC5sZW5ndGggPyByZW1vdmVSZXF1ZXN0ZWRDYWxsYmFja3MocmVtb3ZlZCkgOiBudWxsLFxuICAgICAgICAgICAgLy8gQ2xlYW4gdXAgZHVwbGljYXRlZCBjYWxsYmFja3NcbiAgICAgICAgICAgIHBEdXBsaWNhdGVzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MocER1cGxpY2F0ZXMpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgYkR1cGxpY2F0ZXMubGVuZ3RoID8gcmVtb3ZlQmxvY2tlZENhbGxiYWNrcyhiRHVwbGljYXRlcykgOiBudWxsLFxuICAgICAgICAgICAgZUR1cGxpY2F0ZXMubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyByZW1vdmVFeGVjdXRpbmdDYWxsYmFja3MoZUR1cGxpY2F0ZXMpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgd0R1cGxpY2F0ZXMubGVuZ3RoID8gcmVtb3ZlV2F0Y2hlZENhbGxiYWNrcyh3RHVwbGljYXRlcykgOiBudWxsLFxuICAgICAgICAgICAgLy8gUHJ1bmUgY2FsbGJhY2tzXG4gICAgICAgICAgICBwUmVtb3ZlZC5sZW5ndGggPyByZW1vdmVQcmlvcml0aXplZENhbGxiYWNrcyhwUmVtb3ZlZCkgOiBudWxsLFxuICAgICAgICAgICAgcEFkZGVkLmxlbmd0aCA/IGFkZFByaW9yaXRpemVkQ2FsbGJhY2tzKHBBZGRlZCkgOiBudWxsLFxuICAgICAgICAgICAgYlJlbW92ZWQubGVuZ3RoID8gcmVtb3ZlQmxvY2tlZENhbGxiYWNrcyhiUmVtb3ZlZCkgOiBudWxsLFxuICAgICAgICAgICAgYkFkZGVkLmxlbmd0aCA/IGFkZEJsb2NrZWRDYWxsYmFja3MoYkFkZGVkKSA6IG51bGwsXG4gICAgICAgICAgICBlUmVtb3ZlZC5sZW5ndGggPyByZW1vdmVFeGVjdXRpbmdDYWxsYmFja3MoZVJlbW92ZWQpIDogbnVsbCxcbiAgICAgICAgICAgIGVBZGRlZC5sZW5ndGggPyBhZGRFeGVjdXRpbmdDYWxsYmFja3MoZUFkZGVkKSA6IG51bGwsXG4gICAgICAgICAgICB3UmVtb3ZlZC5sZW5ndGggPyByZW1vdmVXYXRjaGVkQ2FsbGJhY2tzKHdSZW1vdmVkKSA6IG51bGwsXG4gICAgICAgICAgICB3QWRkZWQubGVuZ3RoID8gYWRkV2F0Y2hlZENhbGxiYWNrcyh3QWRkZWQpIDogbnVsbCxcbiAgICAgICAgICAgIC8vIFByb21vdGUgY2FsbGJhY2tzXG4gICAgICAgICAgICByZWFkeUNhbGxiYWNrcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IGFkZFByaW9yaXRpemVkQ2FsbGJhY2tzKHJlYWR5Q2FsbGJhY2tzKVxuICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICBdKSk7XG4gICAgfSxcbiAgICBpbnB1dHM6IFsnY2FsbGJhY2tzLnJlcXVlc3RlZCcsICdjYWxsYmFja3MuY29tcGxldGVkJ11cbn07XG5leHBvcnQgZGVmYXVsdCBvYnNlcnZlcjtcbiIsImltcG9ydCB7IGNvbmNhdCwgZmlsdGVyLCBncm91cEJ5LCBpc05pbCwgcGFydGl0aW9uLCByZWR1Y2UsIHRvUGFpcnMgfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBhZ2dyZWdhdGVDYWxsYmFja3MsIHJlbW92ZVN0b3JlZENhbGxiYWNrcyB9IGZyb20gJy4uL2FjdGlvbnMvY2FsbGJhY2tzJztcbmltcG9ydCB7IGdldFBlbmRpbmdDYWxsYmFja3MgfSBmcm9tICcuLi91dGlscy9jYWxsYmFja3MnO1xuY29uc3Qgb2JzZXJ2ZXIgPSB7XG4gICAgb2JzZXJ2ZXI6ICh7IGRpc3BhdGNoLCBnZXRTdGF0ZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2tzIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBwZW5kaW5nQ2FsbGJhY2tzID0gZ2V0UGVuZGluZ0NhbGxiYWNrcyhjYWxsYmFja3MpO1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrczogeyBzdG9yZWQgfSB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgW251bGxHcm91cENhbGxiYWNrcywgZ3JvdXBDYWxsYmFja3NdID0gcGFydGl0aW9uKGNiID0+IGlzTmlsKGNiLmV4ZWN1dGlvbkdyb3VwKSwgc3RvcmVkKTtcbiAgICAgICAgY29uc3QgZXhlY3V0aW9uR3JvdXBzID0gZ3JvdXBCeShjYiA9PiBjYi5leGVjdXRpb25Hcm91cCwgZ3JvdXBDYWxsYmFja3MpO1xuICAgICAgICBjb25zdCBwZW5kaW5nR3JvdXBzID0gZ3JvdXBCeShjYiA9PiBjYi5leGVjdXRpb25Hcm91cCwgZmlsdGVyKGNiID0+ICFpc05pbChjYi5leGVjdXRpb25Hcm91cCksIHBlbmRpbmdDYWxsYmFja3MpKTtcbiAgICAgICAgY29uc3QgZHJvcHBlZCA9IHJlZHVjZSgocmVzLCBbZXhlY3V0aW9uR3JvdXAsIGV4ZWN1dGlvbkdyb3VwQ2FsbGJhY2tzXSkgPT4gIXBlbmRpbmdHcm91cHNbZXhlY3V0aW9uR3JvdXBdXG4gICAgICAgICAgICA/IGNvbmNhdChyZXMsIGV4ZWN1dGlvbkdyb3VwQ2FsbGJhY2tzKVxuICAgICAgICAgICAgOiByZXMsIFtdLCB0b1BhaXJzKGV4ZWN1dGlvbkdyb3VwcykpO1xuICAgICAgICBkaXNwYXRjaChhZ2dyZWdhdGVDYWxsYmFja3MoW1xuICAgICAgICAgICAgbnVsbEdyb3VwQ2FsbGJhY2tzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gcmVtb3ZlU3RvcmVkQ2FsbGJhY2tzKG51bGxHcm91cENhbGxiYWNrcylcbiAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICBkcm9wcGVkLmxlbmd0aCA/IHJlbW92ZVN0b3JlZENhbGxiYWNrcyhkcm9wcGVkKSA6IG51bGxcbiAgICAgICAgXSkpO1xuICAgIH0sXG4gICAgaW5wdXRzOiBbJ2NhbGxiYWNrcy5zdG9yZWQnLCAnY2FsbGJhY2tzLmNvbXBsZXRlZCddXG59O1xuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCIvKipcbiAqIE9ic2VydmVyIGZvciBoYW5kbGluZyBpbmNvbWluZyBXZWJTb2NrZXQgbWVzc2FnZXMgKFNFVF9QUk9QUywgR0VUX1BST1BTX1JFUVVFU1QpLlxuICovXG5pbXBvcnQgeyBwYXRoIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgdXBkYXRlUHJvcHMsIG5vdGlmeU9ic2VydmVycywgc2V0UGF0aHMgfSBmcm9tICcuLi9hY3Rpb25zJztcbmltcG9ydCB7IHBhcnNlUGF0Y2hQcm9wcyB9IGZyb20gJy4uL2FjdGlvbnMvcGF0Y2gnO1xuaW1wb3J0IHsgY29tcHV0ZVBhdGhzLCBnZXRQYXRoIH0gZnJvbSAnLi4vYWN0aW9ucy9wYXRocyc7XG5pbXBvcnQgeyBiYXRjaCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IGdldFdvcmtlckNsaWVudCB9IGZyb20gJy4uL3V0aWxzL3dvcmtlckNsaWVudCc7XG5pbXBvcnQgeyBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBtYWtlUmVzb2x2ZWRDYWxsYmFjaywgcmVzb2x2ZURlcHMgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llc190cyc7XG4vKipcbiAqIFBhcnNlIGEgY29tcG9uZW50IElEIHRoYXQgbWF5IGJlIGEgc3RyaW5naWZpZWQgSlNPTiBvYmplY3QuXG4gKiBUaGlzIGhhbmRsZXMgZGljdCBJRHMgbGlrZSAne1wiaW5kZXhcIjowLFwidHlwZVwiOlwib3V0cHV0XCJ9JyB0aGF0IG5lZWRcbiAqIHRvIGJlIHBhcnNlZCBiYWNrIHRvIG9iamVjdHMgZm9yIGdldFBhdGggdG8gd29yayBjb3JyZWN0bHkuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ29tcG9uZW50SWQoY29tcG9uZW50SWQpIHtcbiAgICBpZiAoY29tcG9uZW50SWQuc3RhcnRzV2l0aCgneycpICYmIGNvbXBvbmVudElkLmVuZHNXaXRoKCd9JykpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGNvbXBvbmVudElkKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAvLyBOb3QgdmFsaWQgSlNPTiwgcmV0dXJuIGFzLWlzXG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50SWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudElkO1xufVxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSBXZWJTb2NrZXQgb2JzZXJ2ZXIuXG4gKlxuICogU2V0cyB1cCBoYW5kbGVycyBmb3I6XG4gKiAtIFNFVF9QUk9QUzogVXBkYXRlIGNvbXBvbmVudCBwcm9wcyB3aGVuIHJlY2VpdmVkIGZyb20gc2VydmVyXG4gKiAtIEdFVF9QUk9QU19SRVFVRVNUOiBTZW5kIGN1cnJlbnQgcHJvcCB2YWx1ZXMgYmFjayB0byBzZXJ2ZXJcbiAqXG4gKiBAcGFyYW0gc3RvcmUgUmVkdXggc3RvcmVcbiAqIEBwYXJhbSBjb25maWcgRGFzaCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplV2ViU29ja2V0KHN0b3JlLCBjb25maWcpIHtcbiAgICAvLyBJbml0aWFsaXplIFdlYlNvY2tldCBpZjpcbiAgICAvLyAxLiBHbG9iYWwgd2Vic29ja2V0IGlzIGVuYWJsZWQsIE9SXG4gICAgLy8gMi4gV2ViU29ja2V0IGNvbmZpZyBpcyBhdmFpbGFibGUgKGZvciBwZXItY2FsbGJhY2sgd2Vic29ja2V0PVRydWUpXG4gICAgY29uc3Qgd3NBdmFpbGFibGUgPSAhIShjb25maWcud2Vic29ja2V0Py51cmwgJiYgY29uZmlnLndlYnNvY2tldD8ud29ya2VyX3VybCk7XG4gICAgaWYgKCF3c0F2YWlsYWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIFNoYXJlZFdvcmtlciBpcyBzdXBwb3J0ZWRcbiAgICBpZiAodHlwZW9mIFNoYXJlZFdvcmtlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTaGFyZWRXb3JrZXIgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIuICcgK1xuICAgICAgICAgICAgJ1dlYlNvY2tldCBjYWxsYmFja3Mgd2lsbCBmYWxsIGJhY2sgdG8gSFRUUC4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB3b3JrZXJDbGllbnQgPSBnZXRXb3JrZXJDbGllbnQoKTtcbiAgICAvLyBIZWxwZXIgdG8gcHJvY2VzcyBhIHNpbmdsZSBzZXRfcHJvcHMgcGF5bG9hZFxuICAgIGNvbnN0IHByb2Nlc3NTZXRQcm9wcyA9IChwYXlsb2FkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29tcG9uZW50SWQsIHByb3BzOiByYXdQcm9wcyB9ID0gcGF5bG9hZDtcbiAgICAgICAgY29uc3QgcGFyc2VkSWQgPSBwYXJzZUNvbXBvbmVudElkKGNvbXBvbmVudElkKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRQYXRoID0gZ2V0UGF0aChzdGF0ZS5wYXRocywgcGFyc2VkSWQpO1xuICAgICAgICBpZiAoIWNvbXBvbmVudFBhdGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgU0VUX1BST1BTOiBDb21wb25lbnQgJHtjb21wb25lbnRJZH0gbm90IGZvdW5kIGluIGxheW91dGApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdldCBvbGQgY29tcG9uZW50IGZvciBQYXRjaCBwcm9jZXNzaW5nIGFuZCBwYXRoIHJlY29tcHV0YXRpb25cbiAgICAgICAgY29uc3Qgb2xkQ29tcG9uZW50ID0gcGF0aChjb21wb25lbnRQYXRoLCBzdGF0ZS5sYXlvdXQpO1xuICAgICAgICBjb25zdCBvbGRQcm9wcyA9IChvbGRDb21wb25lbnQ/LnByb3BzIHx8IHt9KTtcbiAgICAgICAgLy8gUHJvY2VzcyBwcm9wcyB0byBoYW5kbGUgUGF0Y2ggb2JqZWN0c1xuICAgICAgICBjb25zdCBwcm9jZXNzZWRQcm9wcyA9IHBhcnNlUGF0Y2hQcm9wcyhyYXdQcm9wcywgb2xkUHJvcHMpO1xuICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbXBvbmVudCBwcm9wc1xuICAgICAgICBzdG9yZS5kaXNwYXRjaCh1cGRhdGVQcm9wcyh7XG4gICAgICAgICAgICBwcm9wczogcHJvY2Vzc2VkUHJvcHMsXG4gICAgICAgICAgICBpdGVtcGF0aDogY29tcG9uZW50UGF0aCxcbiAgICAgICAgICAgIHJlbmRlclR5cGU6ICd3ZWJzb2NrZXQnXG4gICAgICAgIH0pKTtcbiAgICAgICAgLy8gTm90aWZ5IG9ic2VydmVyc1xuICAgICAgICBzdG9yZS5kaXNwYXRjaChub3RpZnlPYnNlcnZlcnMoeyBpZDogcGFyc2VkSWQsIHByb3BzOiBwcm9jZXNzZWRQcm9wcyB9KSk7XG4gICAgICAgIC8vIFJlY29tcHV0ZSBwYXRocyBmb3IgYW55IG5ldyBjaGlsZCBjb21wb25lbnRzXG4gICAgICAgIGlmIChvbGRDb21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRTdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICBzdG9yZS5kaXNwYXRjaChzZXRQYXRocyhjb21wdXRlUGF0aHMoe1xuICAgICAgICAgICAgICAgIC4uLm9sZENvbXBvbmVudCxcbiAgICAgICAgICAgICAgICBwcm9wczogeyAuLi5vbGRQcm9wcywgLi4ucHJvY2Vzc2VkUHJvcHMgfVxuICAgICAgICAgICAgfSwgWy4uLmNvbXBvbmVudFBhdGhdLCB1cGRhdGVkU3RhdGUucGF0aHMsIHVwZGF0ZWRTdGF0ZS5wYXRocy5ldmVudHMpKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIEhhbmRsZSBzaW5nbGUgU0VUX1BST1BTIG1lc3NhZ2VcbiAgICB3b3JrZXJDbGllbnQub25TZXRQcm9wcyA9IHByb2Nlc3NTZXRQcm9wcztcbiAgICAvLyBIYW5kbGUgYmF0Y2hlZCBTRVRfUFJPUFNfQkFUQ0ggbWVzc2FnZVxuICAgIHdvcmtlckNsaWVudC5vblNldFByb3BzQmF0Y2ggPSAocGF5bG9hZHMpID0+IHtcbiAgICAgICAgYmF0Y2goKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYXlsb2FkIG9mIHBheWxvYWRzKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc1NldFByb3BzKHBheWxvYWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIEhhbmRsZSBHRVRfUFJPUFNfUkVRVUVTVCBtZXNzYWdlc1xuICAgIHdvcmtlckNsaWVudC5vbkdldFByb3BzUmVxdWVzdCA9IChyZXF1ZXN0SWQsIHBheWxvYWQpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb21wb25lbnRJZCwgcHJvcGVydGllcyB9ID0gcGF5bG9hZDtcbiAgICAgICAgY29uc3QgcGFyc2VkSWQgPSBwYXJzZUNvbXBvbmVudElkKGNvbXBvbmVudElkKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRQYXRoID0gZ2V0UGF0aChzdGF0ZS5wYXRocywgcGFyc2VkSWQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgICAgaWYgKGNvbXBvbmVudFBhdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFByb3BzID0gcGF0aChbLi4uY29tcG9uZW50UGF0aCwgJ3Byb3BzJ10sIHN0YXRlLmxheW91dCk7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50UHJvcHMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BOYW1lXSA9IGNvbXBvbmVudFByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEdFVF9QUk9QU19SRVFVRVNUOiBDb21wb25lbnQgJHtjb21wb25lbnRJZH0gbm90IGZvdW5kIGluIGxheW91dGApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlbmQgdGhlIHJlc3BvbnNlXG4gICAgICAgIHdvcmtlckNsaWVudC5zZW5kR2V0UHJvcHNSZXNwb25zZShyZXF1ZXN0SWQsIHJlc3VsdCk7XG4gICAgfTtcbiAgICAvLyBUcmFjayBjb25uZWN0aW9uIHN0YXRlIGZvciByZWNvbm5lY3Rpb24gaGFuZGxpbmdcbiAgICBsZXQgd2FzRGlzY29ubmVjdGVkID0gZmFsc2U7XG4gICAgLy8gSGFuZGxlIGNvbm5lY3Rpb24gZXZlbnRzXG4gICAgd29ya2VyQ2xpZW50Lm9uQ29ubmVjdGVkID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnW0Rhc2hdIFdlYlNvY2tldCBjb25uZWN0ZWQnKTtcbiAgICAgICAgLy8gT24gcmVjb25uZWN0IChub3QgaW5pdGlhbCBjb25uZWN0KSwgcmUtdHJpZ2dlciBwZXJzaXN0ZW50IGNhbGxiYWNrc1xuICAgICAgICBpZiAod2FzRGlzY29ubmVjdGVkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW0Rhc2hdIFJlY29ubmVjdGVkIC0gcmUtdHJpZ2dlcmluZyBwZXJzaXN0ZW50IGNhbGxiYWNrcycpO1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgY29uc3QgeyBncmFwaHMgfSA9IHN0YXRlO1xuICAgICAgICAgICAgaWYgKGdyYXBocz8uY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGVyc2lzdGVudENhbGxiYWNrcyA9IGdyYXBocy5jYWxsYmFja3MucmVkdWNlKChhY2MsIGNiKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcmUtdHJpZ2dlciBuby1vdXRwdXQgY2FsbGJhY2tzIHdpdGggbm8gaW5wdXRzXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGFyZSB0aGUgXCJwZXJzaXN0ZW50XCIgY2FsbGJhY2tzIHRoYXQgc2hvdWxkIHJlc3RhcnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNiLm5vT3V0cHV0ICYmIGNiLmlucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gbWFrZVJlc29sdmVkQ2FsbGJhY2soY2IsIHJlc29sdmVEZXBzKCksICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkLmluaXRpYWxDYWxsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjYy5wdXNoKHJlc29sdmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgICAgIH0sIFtdKTtcbiAgICAgICAgICAgICAgICBpZiAocGVyc2lzdGVudENhbGxiYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbRGFzaF0gUmUtdHJpZ2dlcmluZyAke3BlcnNpc3RlbnRDYWxsYmFja3MubGVuZ3RofSBwZXJzaXN0ZW50IGNhbGxiYWNrKHMpYCk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKGFkZFJlcXVlc3RlZENhbGxiYWNrcyhwZXJzaXN0ZW50Q2FsbGJhY2tzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICB3b3JrZXJDbGllbnQub25EaXNjb25uZWN0ZWQgPSAocmVhc29uKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbRGFzaF0gV2ViU29ja2V0IGRpc2Nvbm5lY3RlZDogJHtyZWFzb259YCk7XG4gICAgICAgIHdhc0Rpc2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgfTtcbiAgICB3b3JrZXJDbGllbnQub25FcnJvciA9IChtZXNzYWdlLCBjb2RlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtEYXNoXSBXZWJTb2NrZXQgZXJyb3I6ICR7bWVzc2FnZX1gLCBjb2RlKTtcbiAgICB9O1xuICAgIC8vIENvbm5lY3QgdG8gdGhlIHdvcmtlclxuICAgIGNvbnN0IHdzVXJsID0gYnVpbGRXZWJTb2NrZXRVcmwoY29uZmlnKTtcbiAgICB0cnkge1xuICAgICAgICAvLyBjb25maWcud2Vic29ja2V0IGlzIGd1YXJhbnRlZWQgdG8gZXhpc3QgZHVlIHRvIHdzQXZhaWxhYmxlIGNoZWNrIGFib3ZlXG4gICAgICAgIGF3YWl0IHdvcmtlckNsaWVudC5jb25uZWN0KGNvbmZpZy53ZWJzb2NrZXQud29ya2VyX3VybCwgd3NVcmwsIGNvbmZpZy53ZWJzb2NrZXQuaW5hY3Rpdml0eV90aW1lb3V0KTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tEYXNoXSBGYWlsZWQgdG8gY29ubmVjdCB0byBXZWJTb2NrZXQgd29ya2VyOicsIGVycm9yKTtcbiAgICB9XG4gICAgLy8gSGFuZGxlIHRhYiB2aXNpYmlsaXR5IGNoYW5nZXNcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgKCkgPT4ge1xuICAgICAgICBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAndmlzaWJsZScpIHtcbiAgICAgICAgICAgIGlmICh3b3JrZXJDbGllbnQuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgLy8gVGFiIHZpc2libGUgYW5kIGNvbm5lY3RlZCAtIHJlc2V0IGluYWN0aXZpdHkgdGltZXJcbiAgICAgICAgICAgICAgICB3b3JrZXJDbGllbnQubm90aWZ5VGFiVmlzaWJsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGFiIHZpc2libGUgYnV0IGRpc2Nvbm5lY3RlZCAtIHJlY29ubmVjdFxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbRGFzaF0gVGFiIHZpc2libGUsIHJlY29ubmVjdGluZyBXZWJTb2NrZXQuLi4nKTtcbiAgICAgICAgICAgICAgICB3b3JrZXJDbGllbnRcbiAgICAgICAgICAgICAgICAgICAgLmVuc3VyZUNvbm5lY3RlZChjb25maWcpXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcignW0Rhc2hdIEZhaWxlZCB0byByZWNvbm5lY3Q6JywgZXJyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogQnVpbGQgdGhlIFdlYlNvY2tldCBVUkwgZnJvbSBjb25maWcuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkV2ViU29ja2V0VXJsKGNvbmZpZykge1xuICAgIGlmICghY29uZmlnLndlYnNvY2tldD8udXJsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2ViU29ja2V0IFVSTCBub3QgY29uZmlndXJlZCcpO1xuICAgIH1cbiAgICAvLyBDb252ZXJ0IEhUVFAoUykgVVJMIHRvIFdTKFMpXG4gICAgY29uc3Qgd3NQcm90b2NvbCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnd3NzOicgOiAnd3M6JztcbiAgICBjb25zdCBob3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7XG4gICAgLy8gVGhlIGNvbmZpZy53ZWJzb2NrZXQudXJsIGlzIGEgcGF0aCBsaWtlIFwiL19kYXNoLXdzLWNhbGxiYWNrXCJcbiAgICByZXR1cm4gYCR7d3NQcm90b2NvbH0vLyR7aG9zdH0ke2NvbmZpZy53ZWJzb2NrZXQudXJsfWA7XG59XG4vKipcbiAqIERpc2Nvbm5lY3QgZnJvbSB0aGUgV2ViU29ja2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzY29ubmVjdFdlYlNvY2tldCgpIHtcbiAgICBjb25zdCB3b3JrZXJDbGllbnQgPSBnZXRXb3JrZXJDbGllbnQoKTtcbiAgICB3b3JrZXJDbGllbnQuZGlzY29ubmVjdCgpO1xufVxuIiwiaW1wb3J0IHsgYXNzb2MsIGFzc29jUGF0aCwgZGlzc29jIH0gZnJvbSAncmFtZGEnO1xuY29uc3Qgc2V0Sm9iID0gKGpvYiwgc3RhdGUpID0+IGFzc29jKGpvYi5qb2JJZCwgam9iLCBzdGF0ZSk7XG5jb25zdCByZW1vdmVKb2IgPSAoam9iSWQsIHN0YXRlKSA9PiBkaXNzb2Moam9iSWQsIHN0YXRlKTtcbmNvbnN0IHNldE91dGRhdGVkID0gKGpvYklkLCBzdGF0ZSkgPT4gYXNzb2NQYXRoKFtqb2JJZCwgJ291dGRhdGVkJ10sIHRydWUsIHN0YXRlKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzdGF0ZSA9IHt9LCBhY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0FERF9DQUxMQkFDS19KT0InOlxuICAgICAgICAgICAgcmV0dXJuIHNldEpvYihhY3Rpb24ucGF5bG9hZCwgc3RhdGUpO1xuICAgICAgICBjYXNlICdSRU1PVkVfQ0FMTEJBQ0tfSk9CJzpcbiAgICAgICAgICAgIHJldHVybiByZW1vdmVKb2IoYWN0aW9uLnBheWxvYWQuam9iSWQsIHN0YXRlKTtcbiAgICAgICAgY2FzZSAnQ0FMTEJBQ0tfSk9CX09VVERBVEVEJzpcbiAgICAgICAgICAgIHJldHVybiBzZXRPdXRkYXRlZChhY3Rpb24ucGF5bG9hZC5qb2JJZCwgc3RhdGUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IGNvbmNhdCwgZGlmZmVyZW5jZSwgcmVkdWNlIH0gZnJvbSAncmFtZGEnO1xuZXhwb3J0IHZhciBDYWxsYmFja0FjdGlvblR5cGU7XG4oZnVuY3Rpb24gKENhbGxiYWNrQWN0aW9uVHlwZSkge1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIkFkZEJsb2NrZWRcIl0gPSBcIkNhbGxiYWNrcy5BZGRCbG9ja2VkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiQWRkRXhlY3V0ZWRcIl0gPSBcIkNhbGxiYWNrcy5BZGRFeGVjdXRlZFwiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIkFkZEV4ZWN1dGluZ1wiXSA9IFwiQ2FsbGJhY2tzLkFkZEV4ZWN1dGluZ1wiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIkFkZFByaW9yaXRpemVkXCJdID0gXCJDYWxsYmFja3MuQWRkUHJpb3JpdGl6ZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJBZGRSZXF1ZXN0ZWRcIl0gPSBcIkNhbGxiYWNrcy5BZGRSZXF1ZXN0ZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJBZGRTdG9yZWRcIl0gPSBcIkNhbGxiYWNrcy5BZGRTdG9yZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJBZGRXYXRjaGVkXCJdID0gXCJDYWxsYmFja3MuQWRkV2F0Y2hlZFwiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIlJlbW92ZUJsb2NrZWRcIl0gPSBcIkNhbGxiYWNrcy5SZW1vdmVCbG9ja2VkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiUmVtb3ZlRXhlY3V0ZWRcIl0gPSBcIkNhbGxiYWNrcy5SZW1vdmVFeGVjdXRlZFwiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIlJlbW92ZUV4ZWN1dGluZ1wiXSA9IFwiQ2FsbGJhY2tzLlJlbW92ZUV4ZWN1dGluZ1wiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIlJlbW92ZVByaW9yaXRpemVkXCJdID0gXCJDYWxsYmFja3MuUmVtb3ZlUHJpb3JpdGl6ZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJSZW1vdmVSZXF1ZXN0ZWRcIl0gPSBcIkNhbGxiYWNrcy5SZW1vdmVSZXF1ZXN0ZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJSZW1vdmVTdG9yZWRcIl0gPSBcIkNhbGxiYWNrcy5SZW1vdmVTdG9yZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJSZW1vdmVXYXRjaGVkXCJdID0gXCJDYWxsYmFja3MuUmVtb3ZlV2F0Y2hlZFwiO1xufSkoQ2FsbGJhY2tBY3Rpb25UeXBlIHx8IChDYWxsYmFja0FjdGlvblR5cGUgPSB7fSkpO1xuZXhwb3J0IHZhciBDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGU7XG4oZnVuY3Rpb24gKENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZSkge1xuICAgIENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZVtcIkFkZENvbXBsZXRlZFwiXSA9IFwiQ2FsbGJhY2tzLkNvbXBsZXRlZFwiO1xuICAgIENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZVtcIkFnZ3JlZ2F0ZVwiXSA9IFwiQ2FsbGJhY2tzLkFnZ3JlZ2F0ZVwiO1xufSkoQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlIHx8IChDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGUgPSB7fSkpO1xuY29uc3QgREVGQVVMVF9TVEFURSA9IHtcbiAgICBibG9ja2VkOiBbXSxcbiAgICBleGVjdXRlZDogW10sXG4gICAgZXhlY3V0aW5nOiBbXSxcbiAgICBwcmlvcml0aXplZDogW10sXG4gICAgcmVxdWVzdGVkOiBbXSxcbiAgICBzdG9yZWQ6IFtdLFxuICAgIHdhdGNoZWQ6IFtdLFxuICAgIGNvbXBsZXRlZDogMFxufTtcbmNvbnN0IHRyYW5zZm9ybXMgPSB7XG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRCbG9ja2VkXTogY29uY2F0LFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkRXhlY3V0ZWRdOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRFeGVjdXRpbmddOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRQcmlvcml0aXplZF06IGNvbmNhdCxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFJlcXVlc3RlZF06IGNvbmNhdCxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFN0b3JlZF06IGNvbmNhdCxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFdhdGNoZWRdOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVCbG9ja2VkXTogZGlmZmVyZW5jZSxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUV4ZWN1dGVkXTogZGlmZmVyZW5jZSxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUV4ZWN1dGluZ106IGRpZmZlcmVuY2UsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVQcmlvcml0aXplZF06IGRpZmZlcmVuY2UsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVSZXF1ZXN0ZWRdOiBkaWZmZXJlbmNlLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlU3RvcmVkXTogZGlmZmVyZW5jZSxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVdhdGNoZWRdOiBkaWZmZXJlbmNlXG59O1xuY29uc3QgZmllbGRzID0ge1xuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkQmxvY2tlZF06ICdibG9ja2VkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEV4ZWN1dGVkXTogJ2V4ZWN1dGVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEV4ZWN1dGluZ106ICdleGVjdXRpbmcnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkUHJpb3JpdGl6ZWRdOiAncHJpb3JpdGl6ZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkUmVxdWVzdGVkXTogJ3JlcXVlc3RlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRTdG9yZWRdOiAnc3RvcmVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFdhdGNoZWRdOiAnd2F0Y2hlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVCbG9ja2VkXTogJ2Jsb2NrZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlRXhlY3V0ZWRdOiAnZXhlY3V0ZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlRXhlY3V0aW5nXTogJ2V4ZWN1dGluZycsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVQcmlvcml0aXplZF06ICdwcmlvcml0aXplZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVSZXF1ZXN0ZWRdOiAncmVxdWVzdGVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVN0b3JlZF06ICdzdG9yZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlV2F0Y2hlZF06ICd3YXRjaGVkJ1xufTtcbmNvbnN0IG11dGF0ZUNvbXBsZXRlZCA9IChzdGF0ZSwgYWN0aW9uKSA9PiAoe1xuICAgIC4uLnN0YXRlLFxuICAgIGNvbXBsZXRlZDogc3RhdGUuY29tcGxldGVkICsgYWN0aW9uLnBheWxvYWRcbn0pO1xuY29uc3QgbXV0YXRlQ2FsbGJhY2tzID0gKHN0YXRlLCBhY3Rpb24pID0+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSB0cmFuc2Zvcm1zW2FjdGlvbi50eXBlXTtcbiAgICBjb25zdCBmaWVsZCA9IGZpZWxkc1thY3Rpb24udHlwZV07XG4gICAgcmV0dXJuICF0cmFuc2Zvcm0gfHwgIWZpZWxkIHx8IGFjdGlvbi5wYXlsb2FkLmxlbmd0aCA9PT0gMFxuICAgICAgICA/IHN0YXRlXG4gICAgICAgIDoge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBbZmllbGRdOiB0cmFuc2Zvcm0oc3RhdGVbZmllbGRdLCBhY3Rpb24ucGF5bG9hZClcbiAgICAgICAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCAoc3RhdGUgPSBERUZBVUxUX1NUQVRFLCBhY3Rpb24pID0+IHJlZHVjZSgocywgYSkgPT4ge1xuICAgIGlmIChhID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgICBlbHNlIGlmIChhLnR5cGUgPT09IENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZS5BZGRDb21wbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuIG11dGF0ZUNvbXBsZXRlZChzLCBhKTtcbiAgICB9XG4gICAgcmV0dXJuIG11dGF0ZUNhbGxiYWNrcyhzLCBhKTtcbn0sIHN0YXRlLCBhY3Rpb24udHlwZSA9PT0gQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlLkFnZ3JlZ2F0ZVxuICAgID8gYWN0aW9uLnBheWxvYWRcbiAgICA6IFthY3Rpb25dKTtcbiIsImV4cG9ydCB2YXIgSXNMb2FkaW5nQWN0aW9uVHlwZTtcbihmdW5jdGlvbiAoSXNMb2FkaW5nQWN0aW9uVHlwZSkge1xuICAgIElzTG9hZGluZ0FjdGlvblR5cGVbXCJTZXRcIl0gPSBcIklzTG9hZGluZy5TZXRcIjtcbn0pKElzTG9hZGluZ0FjdGlvblR5cGUgfHwgKElzTG9hZGluZ0FjdGlvblR5cGUgPSB7fSkpO1xuY29uc3QgREVGQVVMVF9TVEFURSA9IHRydWU7XG5leHBvcnQgZGVmYXVsdCAoc3RhdGUgPSBERUZBVUxUX1NUQVRFLCBhY3Rpb24pID0+IChhY3Rpb24udHlwZSA9PT0gSXNMb2FkaW5nQWN0aW9uVHlwZS5TZXQgPyBhY3Rpb24ucGF5bG9hZCA6IHN0YXRlKTtcbiIsImltcG9ydCB7IGFzc29jUGF0aCwgaW5jbHVkZXMsIHBhdGhPciB9IGZyb20gJ3JhbWRhJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxvYWRpbmcoc3RhdGUgPSB7fSwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdMT0FERUQnOlxuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkLnJlZHVjZSgoYWNjLCBsb2FkKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9hZFBhdGggPSBbSlNPTi5zdHJpbmdpZnkobG9hZC5wYXRoKV07XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldiA9IHBhdGhPcihbXSwgbG9hZFBhdGgsIGFjYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFzc29jUGF0aChsb2FkUGF0aCwgcHJldi5maWx0ZXIoKGxvYWRpbmcpID0+IGxvYWRpbmcucHJvcGVydHkgIT09IGxvYWQucHJvcGVydHkpLCBhY2MpO1xuICAgICAgICAgICAgfSwgc3RhdGUpO1xuICAgICAgICBjYXNlICdMT0FESU5HJzpcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZC5yZWR1Y2UoKGFjYywgbG9hZCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRQYXRoID0gW0pTT04uc3RyaW5naWZ5KGxvYWQucGF0aCldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBwYXRoT3IoW10sIGxvYWRQYXRoLCBhY2MpO1xuICAgICAgICAgICAgICAgIGlmICghaW5jbHVkZXMobG9hZCwgcHJldikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZHVwbGljYXRlIG91dHB1dHNcbiAgICAgICAgICAgICAgICAgICAgcHJldi5wdXNoKGxvYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXNzb2NQYXRoKGxvYWRQYXRoLCBwcmV2LCBhY2MpO1xuICAgICAgICAgICAgfSwgc3RhdGUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IG9uY2UgfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBjcmVhdGVTdG9yZSwgYXBwbHlNaWRkbGV3YXJlIH0gZnJvbSAncmVkdXgnO1xuaW1wb3J0IHRodW5rIGZyb20gJ3JlZHV4LXRodW5rJztcbmltcG9ydCB7IGNyZWF0ZVJlZHVjZXIgfSBmcm9tICcuL3JlZHVjZXJzL3JlZHVjZXInO1xuaW1wb3J0IFN0b3JlT2JzZXJ2ZXIgZnJvbSAnLi9TdG9yZU9ic2VydmVyJztcbmltcG9ydCBkb2N1bWVudFRpdGxlIGZyb20gJy4vb2JzZXJ2ZXJzL2RvY3VtZW50VGl0bGUnO1xuaW1wb3J0IGV4ZWN1dGVkQ2FsbGJhY2tzIGZyb20gJy4vb2JzZXJ2ZXJzL2V4ZWN1dGVkQ2FsbGJhY2tzJztcbmltcG9ydCBleGVjdXRpbmdDYWxsYmFja3MgZnJvbSAnLi9vYnNlcnZlcnMvZXhlY3V0aW5nQ2FsbGJhY2tzJztcbmltcG9ydCBpc0xvYWRpbmcgZnJvbSAnLi9vYnNlcnZlcnMvaXNMb2FkaW5nJztcbmltcG9ydCBwcmlvcml0aXplZENhbGxiYWNrcyBmcm9tICcuL29ic2VydmVycy9wcmlvcml0aXplZENhbGxiYWNrcyc7XG5pbXBvcnQgcmVxdWVzdGVkQ2FsbGJhY2tzIGZyb20gJy4vb2JzZXJ2ZXJzL3JlcXVlc3RlZENhbGxiYWNrcyc7XG5pbXBvcnQgc3RvcmVkQ2FsbGJhY2tzIGZyb20gJy4vb2JzZXJ2ZXJzL3N0b3JlZENhbGxiYWNrcyc7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZW5kZXJlclN0b3JlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fX3N0b3JlID0gdGhpcy5pbml0aWFsaXplU3RvcmUoKTtcbiAgICB9XG4gICAgX19zdG9yZTtcbiAgICBnZXQgc3RvcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fc3RvcmU7XG4gICAgfVxuICAgIHN0b3JlT2JzZXJ2ZXIgPSBuZXcgU3RvcmVPYnNlcnZlcigpO1xuICAgIHNldE9ic2VydmVycyA9IG9uY2UoKCkgPT4ge1xuICAgICAgICBjb25zdCBvYnNlcnZlID0gdGhpcy5zdG9yZU9ic2VydmVyLm9ic2VydmU7XG4gICAgICAgIC8vIEZJWE1FIFJlbW92ZSBvYnNlcnZlciBwYXR0ZXJuIGFuZCByZWZhY3RvciB0byBzdGFuZGFyZCByZWR1Y2Vycy9hY3Rpb25zL3NlbGVjdG9ycy5cbiAgICAgICAgb2JzZXJ2ZShkb2N1bWVudFRpdGxlKTtcbiAgICAgICAgb2JzZXJ2ZShpc0xvYWRpbmcpO1xuICAgICAgICBvYnNlcnZlKHJlcXVlc3RlZENhbGxiYWNrcyk7XG4gICAgICAgIG9ic2VydmUocHJpb3JpdGl6ZWRDYWxsYmFja3MpO1xuICAgICAgICBvYnNlcnZlKGV4ZWN1dGluZ0NhbGxiYWNrcyk7XG4gICAgICAgIG9ic2VydmUoZXhlY3V0ZWRDYWxsYmFja3MpO1xuICAgICAgICBvYnNlcnZlKHN0b3JlZENhbGxiYWNrcyk7XG4gICAgfSk7XG4gICAgY3JlYXRlQXBwU3RvcmUgPSAocmVkdWNlciwgbWlkZGxld2FyZSkgPT4ge1xuICAgICAgICB0aGlzLl9fc3RvcmUgPSBjcmVhdGVTdG9yZShyZWR1Y2VyLCBtaWRkbGV3YXJlKTtcbiAgICAgICAgdGhpcy5zdG9yZU9ic2VydmVyLnNldFN0b3JlKHRoaXMuX19zdG9yZSk7XG4gICAgICAgIGNvbnN0IGRzID0gKHdpbmRvdy5kYXNoX3N0b3JlcyA9XG4gICAgICAgICAgICB3aW5kb3cuZGFzaF9zdG9yZXMgfHwgW10pO1xuICAgICAgICBpZiAoIWRzLmluY2x1ZGVzKHRoaXMuX19zdG9yZSkpIHtcbiAgICAgICAgICAgIGRzLnB1c2godGhpcy5fX3N0b3JlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldE9ic2VydmVycygpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBhIFJlZHV4IHN0b3JlIHdpdGggdGh1bmssIHBsdXMgbG9nZ2luZyAob25seSBpbiBkZXZlbG9wbWVudCBtb2RlKSBtaWRkbGV3YXJlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2x9IHJlc2V0OiBkaXNjYXJkIGFueSBwcmV2aW91cyBzdG9yZVxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0b3JlPEdlbmVyaWNTdG9yZUVuaGFuY2VyPn1cbiAgICAgKiAgQW4gaW5pdGlhbGl6ZWQgcmVkdXggc3RvcmUgd2l0aCBtaWRkbGV3YXJlIGFuZCBwb3NzaWJsZSBob3QgcmVsb2FkaW5nIG9mIHJlZHVjZXJzXG4gICAgICovXG4gICAgaW5pdGlhbGl6ZVN0b3JlID0gKHJlc2V0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9fc3RvcmUgJiYgIXJlc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fX3N0b3JlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlZHVjZXIgPSBjcmVhdGVSZWR1Y2VyKCk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm9jZXNzLWVudlxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVBcHBTdG9yZShyZWR1Y2VyLCBhcHBseU1pZGRsZXdhcmUodGh1bmspKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIG9ubHkgYXR0YWNoIGxvZ2dlciB0byBtaWRkbGV3YXJlIGluIG5vbi1wcm9kdWN0aW9uIG1vZGVcbiAgICAgICAgICAgIGNvbnN0IHJlZHV4RFRFQyA9IHdpbmRvd1xuICAgICAgICAgICAgICAgIC5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9DT01QT1NFX187XG4gICAgICAgICAgICBpZiAocmVkdXhEVEVDKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVBcHBTdG9yZShyZWR1Y2VyLCByZWR1eERURUMoeyBhY3Rpb25zRGVueWxpc3Q6IFsncmVsb2FkUmVxdWVzdCddIH0pKGFwcGx5TWlkZGxld2FyZSh0aHVuaykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQXBwU3RvcmUocmVkdWNlciwgYXBwbHlNaWRkbGV3YXJlKHRodW5rKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZXNldCkge1xuICAgICAgICAgICAgLy8gVE9ETyAtIFByb3RlY3QgdGhpcyB1bmRlciBhIGRlYnVnIG1vZGU/XG4gICAgICAgICAgICB3aW5kb3cuc3RvcmUgPSB0aGlzLl9fc3RvcmU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vZHVsZS5ob3QpIHtcbiAgICAgICAgICAgIC8vIEVuYWJsZSBob3QgbW9kdWxlIHJlcGxhY2VtZW50IGZvciByZWR1Y2Vyc1xuICAgICAgICAgICAgbW9kdWxlLmhvdC5hY2NlcHQoJy4vcmVkdWNlcnMvcmVkdWNlcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0Um9vdFJlZHVjZXIgPSByZXF1aXJlKCcuL3JlZHVjZXJzL3JlZHVjZXInKS5jcmVhdGVSZWR1Y2VyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fX3N0b3JlLnJlcGxhY2VSZWR1Y2VyKG5leHRSb290UmVkdWNlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fX3N0b3JlO1xuICAgIH07XG59XG4iLCJpbXBvcnQgeyBvbWl0LCB2YWx1ZXMgfSBmcm9tICdyYW1kYSc7XG5leHBvcnQgY29uc3QgZ2V0UGVuZGluZ0NhbGxiYWNrcyA9IChzdGF0ZSkgPT4gQXJyYXkoKS5jb25jYXQoLi4udmFsdWVzKG9taXQoWydzdG9yZWQnLCAnY29tcGxldGVkJ10sIHN0YXRlKSkpO1xuIiwiaW1wb3J0IHsgdXBkYXRlUHJvcHMsIG5vdGlmeU9ic2VydmVycywgc2V0UGF0aHMgfSBmcm9tICcuLi9hY3Rpb25zL2luZGV4JztcbmltcG9ydCB7IHBhcnNlUGF0Y2hQcm9wcywgUGF0Y2hCdWlsZGVyIH0gZnJvbSAnLi4vYWN0aW9ucy9wYXRjaCc7XG5pbXBvcnQgeyBjb21wdXRlUGF0aHMsIGdldFBhdGggfSBmcm9tICcuLi9hY3Rpb25zL3BhdGhzJztcbmltcG9ydCB7IGdldENvbXBvbmVudExheW91dCB9IGZyb20gJy4uL3dyYXBwZXIvd3JhcHBpbmcnO1xuaW1wb3J0IHsgZ2V0U3RvcmVzIH0gZnJvbSAnLi9zdG9yZXMnO1xuLyoqXG4gKiBTZXQgdGhlIHByb3BzIG9mIGEgZGFzaCBjb21wb25lbnQgYnkgaWQgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gaWRPclBhdGggUGF0aCBvciBpZCBvZiB0aGUgZGFzaCBjb21wb25lbnQgdG8gdXBkYXRlLlxuICogQHBhcmFtIHByb3BzIFRoZSBwcm9wcyB0byB1cGRhdGUuXG4gKi9cbmZ1bmN0aW9uIHNldF9wcm9wcyhpZE9yUGF0aCwgcHJvcHMpIHtcbiAgICBjb25zdCBkcyA9IGdldFN0b3JlcygpO1xuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgZHMubGVuZ3RoOyB5KyspIHtcbiAgICAgICAgY29uc3QgeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSA9IGRzW3ldO1xuICAgICAgICBsZXQgY29tcG9uZW50UGF0aDtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaWRPclBhdGgpKSB7XG4gICAgICAgICAgICBjb21wb25lbnRQYXRoID0gZ2V0UGF0aChzdGF0ZS5wYXRocywgaWRPclBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29tcG9uZW50UGF0aCA9IGlkT3JQYXRoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9sZENvbXBvbmVudCA9IGdldENvbXBvbmVudExheW91dChjb21wb25lbnRQYXRoLCBzdGF0ZSk7XG4gICAgICAgIC8vIEhhbmRsZSBhbnkgcGF0Y2ggcHJvcHNcbiAgICAgICAgcHJvcHMgPSBwYXJzZVBhdGNoUHJvcHMocHJvcHMsIG9sZENvbXBvbmVudD8ucHJvcHMgfHwge30pO1xuICAgICAgICAvLyBVcGRhdGUgdGhlIHByb3BzXG4gICAgICAgIGRpc3BhdGNoKHVwZGF0ZVByb3BzKHtcbiAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgaXRlbXBhdGg6IGNvbXBvbmVudFBhdGgsXG4gICAgICAgICAgICByZW5kZXJUeXBlOiAnY2xpZW50c2lkZUFwaSdcbiAgICAgICAgfSkpO1xuICAgICAgICBkaXNwYXRjaChub3RpZnlPYnNlcnZlcnMoeyBpZDogaWRPclBhdGgsIHByb3BzIH0pKTtcbiAgICAgICAgaWYgKCFvbGRDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkaXNwYXRjaChzZXRQYXRocyhjb21wdXRlUGF0aHMoe1xuICAgICAgICAgICAgLi4ub2xkQ29tcG9uZW50LFxuICAgICAgICAgICAgcHJvcHM6IHsgLi4ub2xkQ29tcG9uZW50LnByb3BzLCAuLi5wcm9wcyB9XG4gICAgICAgIH0sIFsuLi5jb21wb25lbnRQYXRoXSwgc3RhdGUucGF0aHMsIHN0YXRlLnBhdGhzLmV2ZW50cykpKTtcbiAgICB9XG59XG4vLyBDbGVhbiB1cmwgY29kZSBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2JyYWludHJlZS9zYW5pdGl6ZS11cmwvYmxvYi9tYWluL3NyYy9jb25zdGFudHMudHNcbi8vIHRvIGFsbG93IGZvciBkYXRhIHByb3RvY29sLlxuY29uc3QgaW52YWxpZFByb3RvY29scyA9IC9eKFteXFx3XSopKGphdmFzY3JpcHR8dmJzY3JpcHQpL2ltO1xuY29uc3QgbmV3TGluZXMgPSAvJih0YWJ8bmV3bGluZSk7L2dpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbmNvbnN0IGN0cmxDaGFycyA9IC9bXFx1MDAwMC1cXHUwMDFGXFx1MDA3Ri1cXHUwMDlGXFx1MjAwMC1cXHUyMDBEXFx1RkVGRl0vZ2ltO1xuY29uc3QgaHRtbEVudGl0aWVzID0gLyYjKFxcdyspKF5cXHd8Oyk/L2c7XG5jb25zdCBjbGVhbl91cmwgPSAodXJsLCBmYWxsYmFjayA9ICdhYm91dDpibGFuaycpID0+IHtcbiAgICBpZiAodXJsID09PSAnJykge1xuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cbiAgICBjb25zdCBjbGVhbmVkID0gdXJsXG4gICAgICAgIC5yZXBsYWNlKG5ld0xpbmVzLCAnJylcbiAgICAgICAgLnJlcGxhY2UoY3RybENoYXJzLCAnJylcbiAgICAgICAgLnJlcGxhY2UoaHRtbEVudGl0aWVzLCAoXywgZGVjKSA9PiBTdHJpbmcuZnJvbUNoYXJDb2RlKGRlYykpXG4gICAgICAgIC50cmltKCk7XG4gICAgaWYgKGludmFsaWRQcm90b2NvbHMudGVzdChjbGVhbmVkKSkge1xuICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG59O1xuY29uc3QgZGMgPSAod2luZG93LmRhc2hfY2xpZW50c2lkZSA9XG4gICAgd2luZG93LmRhc2hfY2xpZW50c2lkZSB8fCB7fSk7XG5kY1snc2V0X3Byb3BzJ10gPSBzZXRfcHJvcHM7XG5kY1snY2xlYW5fdXJsJ10gPSBkY1snY2xlYW5fdXJsJ10gPT09IHVuZGVmaW5lZCA/IGNsZWFuX3VybCA6IGRjWydjbGVhbl91cmwnXTtcbmRjWydQYXRjaCddID0gUGF0Y2hCdWlsZGVyO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGxvYWRMaWJyYXJ5KHJlc291cmNlKSB7XG4gICAgbGV0IHByb207XG4gICAgY29uc3QgaGVhZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQnKTtcbiAgICBpZiAocmVzb3VyY2UudHlwZSA9PT0gJ19qc19kaXN0Jykge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIGVsZW1lbnQuc3JjID0gcmVzb3VyY2UudXJsO1xuICAgICAgICBlbGVtZW50LmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgcHJvbSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBlbGVtZW50Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgaGVhZD8uYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlc291cmNlLnR5cGUgPT09ICdfY3NzX2Rpc3QnKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIGVsZW1lbnQuaHJlZiA9IHJlc291cmNlLnVybDtcbiAgICAgICAgZWxlbWVudC5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIHByb20gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZWxlbWVudC5vbmVycm9yID0gZXJyb3IgPT4gcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGhlYWQ/LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbTtcbn1cbiIsIi8qKiBDYWNoZWQgcmVuZGVyZXIgSUQgZm9yIHRoaXMgcGFnZSBpbnN0YW5jZSAqL1xubGV0IGNhY2hlZFJlbmRlcmVySWQgPSBudWxsO1xuLyoqXG4gKiBHZW5lcmF0ZSBhIHVuaXF1ZSByZW5kZXJlciBJRCBmb3IgdGhpcyBwYWdlIGluc3RhbmNlLlxuICpcbiAqIEVhY2ggcGFnZSBsb2FkIGdldHMgYSBmcmVzaCBJRCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBzdGFsZVxuICogY29ubmVjdGlvbnMgaW4gdGhlIFNoYXJlZFdvcmtlciBhZnRlciBwYWdlIHJlbG9hZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZW5kZXJlcklkKCkge1xuICAgIGlmICghY2FjaGVkUmVuZGVyZXJJZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgICAgIGNhY2hlZFJlbmRlcmVySWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2sgZm9yIG9sZGVyIGJyb3dzZXJzXG4gICAgICAgICAgICBjYWNoZWRSZW5kZXJlcklkID0gYCR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpXG4gICAgICAgICAgICAgICAgLnRvU3RyaW5nKDM2KVxuICAgICAgICAgICAgICAgIC5zbGljZSgyKX1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWRSZW5kZXJlcklkO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGdldFN0b3JlcygpIHtcbiAgICBjb25zdCBzdG9yZXMgPSAod2luZG93LmRhc2hfc3RvcmVzID1cbiAgICAgICAgd2luZG93LmRhc2hfc3RvcmVzIHx8IFtdKTtcbiAgICByZXR1cm4gc3RvcmVzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgYXN5bmMgKGR1cmF0aW9uKSA9PiB7XG4gICAgbGV0IF9yZXNvbHZlO1xuICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IChfcmVzb2x2ZSA9IHJlc29sdmUpKTtcbiAgICBzZXRUaW1lb3V0KF9yZXNvbHZlLCBkdXJhdGlvbik7XG4gICAgcmV0dXJuIHA7XG59O1xuIiwiLyoqXG4gKiBDbGllbnQgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgRGFzaCBXZWJTb2NrZXQgU2hhcmVkV29ya2VyLlxuICovXG5pbXBvcnQgeyBnZXRSZW5kZXJlcklkIH0gZnJvbSAnLi9yZW5kZXJlcklkJztcbi8qKiBNZXNzYWdlIHR5cGVzIGZvciB3b3JrZXIgY29tbXVuaWNhdGlvbiAqL1xuZXhwb3J0IHZhciBXb3JrZXJNZXNzYWdlVHlwZTtcbihmdW5jdGlvbiAoV29ya2VyTWVzc2FnZVR5cGUpIHtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkNPTk5FQ1RcIl0gPSBcImNvbm5lY3RcIjtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkRJU0NPTk5FQ1RcIl0gPSBcImRpc2Nvbm5lY3RcIjtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkNBTExCQUNLX1JFUVVFU1RcIl0gPSBcImNhbGxiYWNrX3JlcXVlc3RcIjtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkdFVF9QUk9QU19SRVNQT05TRVwiXSA9IFwiZ2V0X3Byb3BzX3Jlc3BvbnNlXCI7XG4gICAgV29ya2VyTWVzc2FnZVR5cGVbXCJUQUJfVklTSUJMRVwiXSA9IFwidGFiX3Zpc2libGVcIjtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkNPTk5FQ1RFRFwiXSA9IFwiY29ubmVjdGVkXCI7XG4gICAgV29ya2VyTWVzc2FnZVR5cGVbXCJESVNDT05ORUNURURcIl0gPSBcImRpc2Nvbm5lY3RlZFwiO1xuICAgIFdvcmtlck1lc3NhZ2VUeXBlW1wiQ0FMTEJBQ0tfUkVTUE9OU0VcIl0gPSBcImNhbGxiYWNrX3Jlc3BvbnNlXCI7XG4gICAgV29ya2VyTWVzc2FnZVR5cGVbXCJTRVRfUFJPUFNcIl0gPSBcInNldF9wcm9wc1wiO1xuICAgIFdvcmtlck1lc3NhZ2VUeXBlW1wiU0VUX1BST1BTX0JBVENIXCJdID0gXCJzZXRfcHJvcHNfYmF0Y2hcIjtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkdFVF9QUk9QU19SRVFVRVNUXCJdID0gXCJnZXRfcHJvcHNfcmVxdWVzdFwiO1xuICAgIFdvcmtlck1lc3NhZ2VUeXBlW1wiRVJST1JcIl0gPSBcImVycm9yXCI7XG59KShXb3JrZXJNZXNzYWdlVHlwZSB8fCAoV29ya2VyTWVzc2FnZVR5cGUgPSB7fSkpO1xuLyoqXG4gKiBDbGllbnQgZm9yIHRoZSBEYXNoIFdlYlNvY2tldCBTaGFyZWRXb3JrZXIuXG4gKi9cbmNsYXNzIFdvcmtlckNsaWVudCB7XG4gICAgd29ya2VyID0gbnVsbDtcbiAgICByZW5kZXJlcklkO1xuICAgIHBlbmRpbmdDYWxsYmFja3MgPSBuZXcgTWFwKCk7XG4gICAgcmVxdWVzdENvdW50ZXIgPSAwO1xuICAgIGlzQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgY29ubmVjdGlvblByb21pc2UgPSBudWxsO1xuICAgIGNvbm5lY3Rpb25SZXNvbHZlID0gbnVsbDtcbiAgICAvKiogQ2FsbGJhY2sgd2hlbiBTRVRfUFJPUFMgbWVzc2FnZSBpcyByZWNlaXZlZCAqL1xuICAgIG9uU2V0UHJvcHMgPSBudWxsO1xuICAgIC8qKiBDYWxsYmFjayB3aGVuIFNFVF9QUk9QU19CQVRDSCBtZXNzYWdlIGlzIHJlY2VpdmVkICovXG4gICAgb25TZXRQcm9wc0JhdGNoID0gbnVsbDtcbiAgICAvKiogQ2FsbGJhY2sgd2hlbiBHRVRfUFJPUFNfUkVRVUVTVCBtZXNzYWdlIGlzIHJlY2VpdmVkICovXG4gICAgb25HZXRQcm9wc1JlcXVlc3QgPSBudWxsO1xuICAgIC8qKiBDYWxsYmFjayB3aGVuIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgKi9cbiAgICBvbkNvbm5lY3RlZCA9IG51bGw7XG4gICAgLyoqIENhbGxiYWNrIHdoZW4gY29ubmVjdGlvbiBpcyBsb3N0ICovXG4gICAgb25EaXNjb25uZWN0ZWQgPSBudWxsO1xuICAgIC8qKiBDYWxsYmFjayB3aGVuIGFuIGVycm9yIG9jY3VycyAqL1xuICAgIG9uRXJyb3IgPSBudWxsO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVySWQgPSBnZXRSZW5kZXJlcklkKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIHdvcmtlciBjb25uZWN0aW9uLlxuICAgICAqIEBwYXJhbSB3b3JrZXJVcmwgVVJMIHRvIHRoZSBTaGFyZWRXb3JrZXIgc2NyaXB0XG4gICAgICogQHBhcmFtIHNlcnZlclVybCBXZWJTb2NrZXQgc2VydmVyIFVSTFxuICAgICAqIEBwYXJhbSBpbmFjdGl2aXR5VGltZW91dCBPcHRpb25hbCBpbmFjdGl2aXR5IHRpbWVvdXQgaW4gbXNcbiAgICAgKiBAcGFyYW0gaGVhcnRiZWF0SW50ZXJ2YWwgT3B0aW9uYWwgaGVhcnRiZWF0IGludGVydmFsIGluIG1zXG4gICAgICovXG4gICAgYXN5bmMgY29ubmVjdCh3b3JrZXJVcmwsIHNlcnZlclVybCwgaW5hY3Rpdml0eVRpbWVvdXQsIGhlYXJ0YmVhdEludGVydmFsKSB7XG4gICAgICAgIGlmICh0aGlzLndvcmtlcikge1xuICAgICAgICAgICAgLy8gQWxyZWFkeSBjb25uZWN0ZWRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBDcmVhdGUgdGhlIFNoYXJlZFdvcmtlclxuICAgICAgICB0aGlzLndvcmtlciA9IG5ldyBTaGFyZWRXb3JrZXIod29ya2VyVXJsLCB7XG4gICAgICAgICAgICBuYW1lOiAnZGFzaC13cy13b3JrZXInXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBTZXQgdXAgbWVzc2FnZSBoYW5kbGluZ1xuICAgICAgICB0aGlzLndvcmtlci5wb3J0Lm9ubWVzc2FnZSA9IHRoaXMuaGFuZGxlTWVzc2FnZS5iaW5kKHRoaXMpO1xuICAgICAgICAvLyBDcmVhdGUgcHJvbWlzZSBmb3IgY29ubmVjdGlvblxuICAgICAgICB0aGlzLmNvbm5lY3Rpb25Qcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25SZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFN0YXJ0IHRoZSBwb3J0XG4gICAgICAgIHRoaXMud29ya2VyLnBvcnQuc3RhcnQoKTtcbiAgICAgICAgLy8gU2VuZCBjb25uZWN0IG1lc3NhZ2VcbiAgICAgICAgdGhpcy53b3JrZXIucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICB0eXBlOiBXb3JrZXJNZXNzYWdlVHlwZS5DT05ORUNULFxuICAgICAgICAgICAgcmVuZGVyZXJJZDogdGhpcy5yZW5kZXJlcklkLFxuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgIHNlcnZlclVybCxcbiAgICAgICAgICAgICAgICBpbmFjdGl2aXR5VGltZW91dCxcbiAgICAgICAgICAgICAgICBoZWFydGJlYXRJbnRlcnZhbFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gV2FpdCBmb3IgY29ubmVjdGlvblxuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb25Qcm9taXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0IGZyb20gdGhlIHdvcmtlci5cbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICBpZiAodGhpcy53b3JrZXIpIHtcbiAgICAgICAgICAgIHRoaXMud29ya2VyLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFdvcmtlck1lc3NhZ2VUeXBlLkRJU0NPTk5FQ1QsXG4gICAgICAgICAgICAgICAgcmVuZGVyZXJJZDogdGhpcy5yZW5kZXJlcklkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMud29ya2VyLnBvcnQuY2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMud29ya2VyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblByb21pc2UgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25SZXNvbHZlID0gbnVsbDtcbiAgICAgICAgLy8gUmVzb2x2ZSBwZW5kaW5nIGNhbGxiYWNrcyB3aXRoIHByZXZlbnRfdXBkYXRlIHNvIGxvYWRpbmcgc3RhdGVzIGNsZWFyXG4gICAgICAgIGZvciAoY29uc3QgWywgcGVuZGluZ10gb2YgdGhpcy5wZW5kaW5nQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBwZW5kaW5nLnJlc29sdmUoeyBzdGF0dXM6ICdwcmV2ZW50X3VwZGF0ZScgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wZW5kaW5nQ2FsbGJhY2tzLmNsZWFyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuc3VyZSB0aGUgd29ya2VyIGlzIGNvbm5lY3RlZCwgaW5pdGlhdGluZyBjb25uZWN0aW9uIGlmIG5lZWRlZC5cbiAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSBEYXNoIGNvbmZpZyB3aXRoIHdlYnNvY2tldCBzZXR0aW5nc1xuICAgICAqL1xuICAgIGFzeW5jIGVuc3VyZUNvbm5lY3RlZChjb25maWcpIHtcbiAgICAgICAgLy8gQWxyZWFkeSBjb25uZWN0ZWRcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBDb25uZWN0aW9uIGluIHByb2dyZXNzLCB3YWl0IGZvciBpdFxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uUHJvbWlzZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uUHJvbWlzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBOZWVkIHRvIGluaXRpYXRlIGNvbm5lY3Rpb25cbiAgICAgICAgaWYgKCFjb25maWcud2Vic29ja2V0Py51cmwgfHwgIWNvbmZpZy53ZWJzb2NrZXQ/Lndvcmtlcl91cmwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2ViU29ja2V0IGNvbmZpZyBub3QgYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBTaGFyZWRXb3JrZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYXJlZFdvcmtlciBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnVpbGQgV2ViU29ja2V0IFVSTFxuICAgICAgICBjb25zdCB3c1Byb3RvY29sID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3M6JyA6ICd3czonO1xuICAgICAgICBjb25zdCBob3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7XG4gICAgICAgIGNvbnN0IHdzVXJsID0gYCR7d3NQcm90b2NvbH0vLyR7aG9zdH0ke2NvbmZpZy53ZWJzb2NrZXQudXJsfWA7XG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdChjb25maWcud2Vic29ja2V0Lndvcmtlcl91cmwsIHdzVXJsLCBjb25maWcud2Vic29ja2V0LmluYWN0aXZpdHlfdGltZW91dCwgY29uZmlnLndlYnNvY2tldC5oZWFydGJlYXRfaW50ZXJ2YWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgY2FsbGJhY2sgcmVxdWVzdCB0byB0aGUgc2VydmVyIHZpYSB0aGUgd29ya2VyLlxuICAgICAqIEBwYXJhbSBwYXlsb2FkIFRoZSBjYWxsYmFjayBwYXlsb2FkXG4gICAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNhbGxiYWNrIHJlc3BvbnNlXG4gICAgICovXG4gICAgYXN5bmMgc2VuZENhbGxiYWNrKHBheWxvYWQpIHtcbiAgICAgICAgLy8gV2FpdCBmb3IgaW5pdGlhbCBjb25uZWN0aW9uIGlmIG9uZSBpcyBpbiBwcm9ncmVzc1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uUHJvbWlzZSAmJiAhdGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uUHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMud29ya2VyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtlciBub3QgY29ubmVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gYCR7dGhpcy5yZW5kZXJlcklkfS0keysrdGhpcy5yZXF1ZXN0Q291bnRlcn1gO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2FsbGJhY2tzLnNldChyZXF1ZXN0SWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICAgICAgdGhpcy53b3JrZXIucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogV29ya2VyTWVzc2FnZVR5cGUuQ0FMTEJBQ0tfUkVRVUVTVCxcbiAgICAgICAgICAgICAgICByZW5kZXJlcklkOiB0aGlzLnJlbmRlcmVySWQsXG4gICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhIGdldF9wcm9wcyByZXNwb25zZSBiYWNrIHRvIHRoZSBzZXJ2ZXIuXG4gICAgICogQHBhcmFtIHJlcXVlc3RJZCBUaGUgcmVxdWVzdCBJRCBmcm9tIHRoZSBnZXRfcHJvcHMgcmVxdWVzdFxuICAgICAqIEBwYXJhbSBwcm9wcyBUaGUgcHJvcGVydHkgdmFsdWVzXG4gICAgICovXG4gICAgc2VuZEdldFByb3BzUmVzcG9uc2UocmVxdWVzdElkLCBwcm9wcykge1xuICAgICAgICBpZiAoIXRoaXMud29ya2VyIHx8ICF0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53b3JrZXIucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICB0eXBlOiBXb3JrZXJNZXNzYWdlVHlwZS5HRVRfUFJPUFNfUkVTUE9OU0UsXG4gICAgICAgICAgICByZW5kZXJlcklkOiB0aGlzLnJlbmRlcmVySWQsXG4gICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICBwYXlsb2FkOiBwcm9wc1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIHdvcmtlciBpcyBjb25uZWN0ZWQuXG4gICAgICovXG4gICAgZ2V0IGNvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5vdGlmeSB0aGUgd29ya2VyIHRoYXQgdGhlIHRhYiBpcyBub3cgdmlzaWJsZS5cbiAgICAgKiBUaGlzIHJlc2V0cyB0aGUgaW5hY3Rpdml0eSB0aW1lciB0byBwcmV2ZW50IHRpbWVvdXQgd2hpbGUgdXNlciBpcyB2aWV3aW5nLlxuICAgICAqL1xuICAgIG5vdGlmeVRhYlZpc2libGUoKSB7XG4gICAgICAgIGlmICh0aGlzLndvcmtlciAmJiB0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLndvcmtlci5wb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBXb3JrZXJNZXNzYWdlVHlwZS5UQUJfVklTSUJMRSxcbiAgICAgICAgICAgICAgICByZW5kZXJlcklkOiB0aGlzLnJlbmRlcmVySWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZU1lc3NhZ2UoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFdvcmtlck1lc3NhZ2VUeXBlLkNPTk5FQ1RFRDpcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uUmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25SZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblJlc29sdmUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbkNvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ29ubmVjdGVkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBXb3JrZXJNZXNzYWdlVHlwZS5ESVNDT05ORUNURUQ6XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgcGVuZGluZyBjYWxsYmFja3Mgd2l0aCBwcmV2ZW50X3VwZGF0ZSBzbyBsb2FkaW5nIHN0YXRlcyBjbGVhclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgWywgcGVuZGluZ10gb2YgdGhpcy5wZW5kaW5nQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcucmVzb2x2ZSh7IHN0YXR1czogJ3ByZXZlbnRfdXBkYXRlJyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2FsbGJhY2tzLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25EaXNjb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRpc2Nvbm5lY3RlZChtZXNzYWdlLnBheWxvYWQ/LnJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBXb3JrZXJNZXNzYWdlVHlwZS5DQUxMQkFDS19SRVNQT05TRToge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IG1lc3NhZ2UucmVxdWVzdElkO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2FsbGJhY2tzLmRlbGV0ZShyZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLnJlc29sdmUobWVzc2FnZS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFdvcmtlck1lc3NhZ2VUeXBlLlNFVF9QUk9QUzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vblNldFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TZXRQcm9wcyhtZXNzYWdlLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgV29ya2VyTWVzc2FnZVR5cGUuU0VUX1BST1BTX0JBVENIOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uU2V0UHJvcHNCYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2V0UHJvcHNCYXRjaChtZXNzYWdlLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgV29ya2VyTWVzc2FnZVR5cGUuR0VUX1BST1BTX1JFUVVFU1Q6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25HZXRQcm9wc1JlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkdldFByb3BzUmVxdWVzdChtZXNzYWdlLnJlcXVlc3RJZCwgbWVzc2FnZS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdvcmtlck1lc3NhZ2VUeXBlLkVSUk9SOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKG1lc3NhZ2UucGF5bG9hZD8ubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcicsIG1lc3NhZ2UucGF5bG9hZD8uY29kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gU2luZ2xldG9uIGluc3RhbmNlXG5sZXQgd29ya2VyQ2xpZW50SW5zdGFuY2UgPSBudWxsO1xuLyoqXG4gKiBHZXQgdGhlIHNpbmdsZXRvbiBXb3JrZXJDbGllbnQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZXJDbGllbnQoKSB7XG4gICAgaWYgKCF3b3JrZXJDbGllbnRJbnN0YW5jZSkge1xuICAgICAgICB3b3JrZXJDbGllbnRJbnN0YW5jZSA9IG5ldyBXb3JrZXJDbGllbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHdvcmtlckNsaWVudEluc3RhbmNlO1xufVxuLyoqXG4gKiBDaGVjayBpZiBXZWJTb2NrZXQgY2FsbGJhY2tzIGFyZSBnbG9iYWxseSBlbmFibGVkIGFuZCBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0gY29uZmlnIFRoZSBEYXNoIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXZWJTb2NrZXRFbmFibGVkKGNvbmZpZykge1xuICAgIHJldHVybiAhIShjb25maWcud2Vic29ja2V0Py5lbmFibGVkICYmIHR5cGVvZiBTaGFyZWRXb3JrZXIgIT09ICd1bmRlZmluZWQnKTtcbn1cbi8qKlxuICogQ2hlY2sgaWYgV2ViU29ja2V0IGluZnJhc3RydWN0dXJlIGlzIGF2YWlsYWJsZSAoZm9yIHBlci1jYWxsYmFjayB3ZWJzb2NrZXQpLlxuICogQHBhcmFtIGNvbmZpZyBUaGUgRGFzaCBjb25maWdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV2ViU29ja2V0QXZhaWxhYmxlKGNvbmZpZykge1xuICAgIHJldHVybiAhIShjb25maWcud2Vic29ja2V0Py51cmwgJiZcbiAgICAgICAgY29uZmlnLndlYnNvY2tldD8ud29ya2VyX3VybCAmJlxuICAgICAgICB0eXBlb2YgU2hhcmVkV29ya2VyICE9PSAndW5kZWZpbmVkJyk7XG59XG4iLCJpbXBvcnQgY2hlY2tQcm9wVHlwZXMgZnJvbSAnLi4vY2hlY2tQcm9wVHlwZXMnO1xuaW1wb3J0IHsgcHJvcFR5cGVFcnJvckhhbmRsZXIgfSBmcm9tICcuLi9leGNlcHRpb25zJztcbmltcG9ydCB7IHZhbGlkYXRlQ29tcG9uZW50IH0gZnJvbSAnLi93cmFwcGluZyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDaGVja2VkQ29tcG9uZW50KHApIHtcbiAgICBjb25zdCB7IGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbiwgY29tcG9uZW50IH0gPSBwO1xuICAgIHZhbGlkYXRlQ29tcG9uZW50KGNvbXBvbmVudCk7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gY2hlY2tQcm9wVHlwZXMoZWxlbWVudC5wcm9wVHlwZXMsIHByb3BzLCAnY29tcG9uZW50IHByb3AnLCBlbGVtZW50KTtcbiAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIHByb3BUeXBlRXJyb3JIYW5kbGVyKGVycm9yTWVzc2FnZSwgcHJvcHMsIGNvbXBvbmVudC50eXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xufVxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VDb250ZXh0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlU3RvcmUsIHVzZVNlbGVjdG9yLCB1c2VEaXNwYXRjaCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IGNvbmNhdCwgcGF0aE9yIH0gZnJvbSAncmFtZGEnO1xuZXhwb3J0IGNvbnN0IERhc2hDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh7fSk7XG5leHBvcnQgZnVuY3Rpb24gRGFzaENvbnRleHRQcm92aWRlcihwcm9wcykge1xuICAgIGNvbnN0IHsgY2hpbGRyZW4sIGNvbXBvbmVudFBhdGggfSA9IHByb3BzO1xuICAgIGNvbnN0IHN0cmluZ1BhdGggPSB1c2VNZW1vKCgpID0+IEpTT04uc3RyaW5naWZ5KGNvbXBvbmVudFBhdGgpLCBbY29tcG9uZW50UGF0aF0pO1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmUoKTtcbiAgICBjb25zdCBpc0xvYWRpbmcgPSB1c2VDYWxsYmFjaygob3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCB7IGV4dHJhUGF0aCwgcmF3UGF0aCwgZmlsdGVyRnVuYyB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgbGV0IGxvYWRpbmdQYXRoID0gW3N0cmluZ1BhdGhdO1xuICAgICAgICBpZiAoZXh0cmFQYXRoKSB7XG4gICAgICAgICAgICBsb2FkaW5nUGF0aCA9IFtcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShjb25jYXQoY29tcG9uZW50UGF0aCwgZXh0cmFQYXRoKSlcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmF3UGF0aCkge1xuICAgICAgICAgICAgbG9hZGluZ1BhdGggPSBbSlNPTi5zdHJpbmdpZnkocmF3UGF0aCldO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvYWRpbmcgPSBwYXRoT3IoW10sIGxvYWRpbmdQYXRoLCBzdG9yZS5nZXRTdGF0ZSgpLmxvYWRpbmcpO1xuICAgICAgICByZXR1cm4gZmlsdGVyRnVuY1xuICAgICAgICAgICAgPyBsb2FkaW5nLmZpbHRlcihmaWx0ZXJGdW5jKS5sZW5ndGggPiAwXG4gICAgICAgICAgICA6IGxvYWRpbmcubGVuZ3RoID4gMDtcbiAgICB9LCBbc3RyaW5nUGF0aF0pO1xuICAgIGNvbnN0IHVzZUxvYWRpbmcgPSB1c2VDYWxsYmFjaygob3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCB7IGZpbHRlckZ1bmMsIGV4dHJhUGF0aCwgcmF3UGF0aCB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHVzZVNlbGVjdG9yKChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgbGV0IGxvYWRpbmdQYXRoID0gW3N0cmluZ1BhdGhdO1xuICAgICAgICAgICAgaWYgKGV4dHJhUGF0aCkge1xuICAgICAgICAgICAgICAgIGxvYWRpbmdQYXRoID0gW1xuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShjb25jYXQoY29tcG9uZW50UGF0aCwgZXh0cmFQYXRoKSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmF3UGF0aCkge1xuICAgICAgICAgICAgICAgIGxvYWRpbmdQYXRoID0gW0pTT04uc3RyaW5naWZ5KHJhd1BhdGgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxvYWQgPSBwYXRoT3IoW10sIGxvYWRpbmdQYXRoLCBzdGF0ZS5sb2FkaW5nKTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJGdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvYWQuZmlsdGVyKGZpbHRlckZ1bmMpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbG9hZC5sZW5ndGggPiAwO1xuICAgICAgICB9KTtcbiAgICB9LCBbc3RyaW5nUGF0aF0pO1xuICAgIGNvbnN0IGN0eFZhbHVlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb21wb25lbnRQYXRoLFxuICAgICAgICAgICAgaXNMb2FkaW5nLFxuICAgICAgICAgICAgdXNlTG9hZGluZyxcbiAgICAgICAgICAgIHVzZVNlbGVjdG9yLFxuICAgICAgICAgICAgdXNlU3RvcmUsXG4gICAgICAgICAgICB1c2VEaXNwYXRjaFxuICAgICAgICB9O1xuICAgIH0sIFtzdHJpbmdQYXRoXSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KERhc2hDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBjdHhWYWx1ZSB9LCBjaGlsZHJlbikpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVzZURhc2hDb250ZXh0KCkge1xuICAgIGNvbnN0IGN0eCA9IHVzZUNvbnRleHQoRGFzaENvbnRleHQpO1xuICAgIGlmICghY3R4KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Rhc2ggQ29udGV4dCB3YXMgbm90IGZvdW5kLCBjb21wb25lbnQgd2FzIHJlbmRlcmVkIHdpdGhvdXQgYSB3cmFwcGVyLiBVc2UgYHdpbmRvdy5kYXNoX2NvbXBvbmVudF9hcGkuRXh0ZXJuYWxXcmFwcGVyYCB0byBtYWtlIHN1cmUgdGhlIGNvbXBvbmVudCBpcyBwcm9wZXJseSBjb25uZWN0ZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiBjdHggfHwge307XG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlTWVtbywgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcGF0aCwgY29uY2F0LCBwaWNrQnksIGVxdWFscywga2V5cywgaXMsIGlzRW1wdHksIHBpY2ssIGFzc29jUGF0aCwgcGF0aE9yLCBtZXJnZVJpZ2h0LCBkaXNzb2MsIGFzc29jLCBtYXBPYmpJbmRleGVkLCB0eXBlIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgdXNlU2VsZWN0b3IsIHVzZURpc3BhdGNoLCBiYXRjaCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBDb21wb25lbnRFcnJvckJvdW5kYXJ5IGZyb20gJy4uL2NvbXBvbmVudHMvZXJyb3IvQ29tcG9uZW50RXJyb3JCb3VuZGFyeS5yZWFjdCc7XG5pbXBvcnQgeyBub3RpZnlPYnNlcnZlcnMsIG9uRXJyb3IsIHVwZGF0ZVByb3BzLCByZXNldENvbXBvbmVudFN0YXRlIH0gZnJvbSAnLi4vYWN0aW9ucyc7XG5pbXBvcnQgeyBnZXRXYXRjaGVkS2V5cywgc3RyaW5naWZ5SWQgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBnZXRDb21wb25lbnRMYXlvdXQsIGlzRHJ5Q29tcG9uZW50LCBjaGVja1JlbmRlclR5cGVQcm9wLCBzdHJpbmdpZnlQYXRoIH0gZnJvbSAnLi93cmFwcGluZyc7XG5pbXBvcnQgUmVnaXN0cnkgZnJvbSAnLi4vcmVnaXN0cnknO1xuaW1wb3J0IGlzU2ltcGxlQ29tcG9uZW50IGZyb20gJy4uL2lzU2ltcGxlQ29tcG9uZW50JztcbmltcG9ydCB7IHNlbGVjdERhc2hQcm9wcywgc2VsZWN0RGFzaFByb3BzRXF1YWxpdHlGbiwgc2VsZWN0Q29uZmlnIH0gZnJvbSAnLi9zZWxlY3RvcnMnO1xuaW1wb3J0IENoZWNrZWRDb21wb25lbnQgZnJvbSAnLi9DaGVja2VkQ29tcG9uZW50JztcbmltcG9ydCB7IERhc2hDb250ZXh0UHJvdmlkZXIgfSBmcm9tICcuL0Rhc2hDb250ZXh0JztcbmZ1bmN0aW9uIERhc2hXcmFwcGVyKHsgY29tcG9uZW50UGF0aCwgX2Rhc2hwcml2YXRlX2Vycm9yLCBfcGFzc2VkQ29tcG9uZW50LCAvLyBwYXNzIGNvbXBvbmVudCB0byB0aGUgRGFzaFdyYXBwZXIgaW4gdGhlIGV2ZW50IHRoYXQgaXQgaXMgYSBuZXdSZW5kZXIgYW5kIHRoZXJlIGFyZSBubyBsYXlvdXRoYXNoZXNcbl9uZXdSZW5kZXIsIC8vIHRoaXMgaXMgdG8gZm9yY2UgdGhlIGNvbXBvbmVudCB0byBuZXdseSByZW5kZXIgcmVnYXJkbGVzcyBvZiBwcm9wcyAocmVkcmF3IGFuZCBjb21wb25lbnQgYXMgcHJvcHMpIGlzIHBhc3NlZCBmcm9tIHRoZSBwYXJlbnRcbi4uLmV4dHJhcyB9KSB7XG4gICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpO1xuICAgIGNvbnN0IG1lbW9pemVkS2V5cyA9IHVzZVJlZih7fSk7XG4gICAgY29uc3QgbmV3UmVuZGVyID0gdXNlUmVmKGZhbHNlKTtcbiAgICBjb25zdCBmcmVzaFJlbmRlcnMgPSB1c2VSZWYoMCk7XG4gICAgY29uc3QgcmVuZGVyZWRQYXRoID0gdXNlUmVmKGNvbXBvbmVudFBhdGgpO1xuICAgIGxldCByZW5kZXJDb21wb25lbnQgPSBudWxsO1xuICAgIGxldCByZW5kZXJDb21wb25lbnRQcm9wcyA9IG51bGw7XG4gICAgbGV0IHJlbmRlckggPSBudWxsO1xuICAgIC8vIEdldCB0aGUgY29uZmlnIGZvciB0aGUgY29tcG9uZW50IGFzIHByb3BzXG4gICAgY29uc3QgY29uZmlnID0gdXNlU2VsZWN0b3Ioc2VsZWN0Q29uZmlnKTtcbiAgICAvLyBTZWxlY3QgY29tcG9uZW50IGFuZCBpdCdzIHByb3BzLCBhbG9uZyB3aXRoIHJlbmRlciBoYXNoLCBjaGFuZ2VkIHByb3BzIGFuZCB0aGUgcmVhc29uIGZvciByZW5kZXJcbiAgICBjb25zdCBbY29tcG9uZW50LCBjb21wb25lbnRQcm9wcywgaCwgY2hhbmdlZFByb3BzLCByZW5kZXJUeXBlXSA9IHVzZVNlbGVjdG9yKHNlbGVjdERhc2hQcm9wcyhjb21wb25lbnRQYXRoKSwgc2VsZWN0RGFzaFByb3BzRXF1YWxpdHlGbik7XG4gICAgcmVuZGVyQ29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgIHJlbmRlckNvbXBvbmVudFByb3BzID0gY29tcG9uZW50UHJvcHM7XG4gICAgcmVuZGVySCA9IGg7XG4gICAgdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGlmIChfbmV3UmVuZGVyKSB7XG4gICAgICAgICAgICBuZXdSZW5kZXIuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgICByZW5kZXJIID0gMDtcbiAgICAgICAgICAgIGZyZXNoUmVuZGVycy5jdXJyZW50ICs9IDE7XG4gICAgICAgICAgICBpZiAocmVuZGVySCBpbiBtZW1vaXplZEtleXMuY3VycmVudCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBtZW1vaXplZEtleXMuY3VycmVudFtyZW5kZXJIXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5ld1JlbmRlci5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyZWRQYXRoLmN1cnJlbnQgPSBjb21wb25lbnRQYXRoO1xuICAgIH0sIFtfbmV3UmVuZGVyXSk7XG4gICAgY29uc3Qgc2V0UHJvcHMgPSAobmV3UHJvcHMpID0+IHtcbiAgICAgICAgY29uc3QgeyBpZCB9ID0gcmVuZGVyQ29tcG9uZW50UHJvcHM7XG4gICAgICAgIGNvbnN0IHsgX2Rhc2hfZXJyb3IsIC4uLnJlc3RQcm9wcyB9ID0gbmV3UHJvcHM7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkaXNwYXRjaCgoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgICAgY29uc3QgeyBncmFwaHMgfSA9IGN1cnJlbnRTdGF0ZTtcbiAgICAgICAgICAgIGNvbnN0IG9sZExheW91dCA9IGdldENvbXBvbmVudExheW91dChyZW5kZXJlZFBhdGguY3VycmVudCwgY3VycmVudFN0YXRlKTtcbiAgICAgICAgICAgIGlmICghb2xkTGF5b3V0KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHsgcHJvcHM6IG9sZFByb3BzIH0gPSBvbGRMYXlvdXQ7XG4gICAgICAgICAgICBpZiAoIW9sZFByb3BzKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZWRQcm9wcyA9IHBpY2tCeSgodmFsLCBrZXkpID0+ICFlcXVhbHModmFsLCBvbGRQcm9wc1trZXldKSwgcmVzdFByb3BzKTtcbiAgICAgICAgICAgIGlmIChfZGFzaF9lcnJvcikge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKG9uRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZnJvbnRFbmQnLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogX2Rhc2hfZXJyb3JcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNFbXB0eShjaGFuZ2VkUHJvcHMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWRlbnRpZnkgdGhlIG1vZGlmaWVkIHByb3BzIHRoYXQgYXJlIHJlcXVpcmVkIGZvciBjYWxsYmFja3NcbiAgICAgICAgICAgIGNvbnN0IHdhdGNoZWRLZXlzID0gZ2V0V2F0Y2hlZEtleXMoaWQsIGtleXMoY2hhbmdlZFByb3BzKSwgZ3JhcGhzKTtcbiAgICAgICAgICAgIGJhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGRpc3BhdGNoIGNoYW5nZXMgdG8gRGFzaCBpZiBhIHdhdGNoZWQgcHJvcCBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgaWYgKHdhdGNoZWRLZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChub3RpZnlPYnNlcnZlcnMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogcGljayh3YXRjaGVkS2V5cywgY2hhbmdlZFByb3BzKVxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEFsd2F5cyB1cGRhdGUgdGhpcyBjb21wb25lbnQncyBwcm9wc1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHVwZGF0ZVByb3BzKHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHM6IGNoYW5nZWRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgaXRlbXBhdGg6IHJlbmRlcmVkUGF0aC5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJUeXBlOiAnaW50ZXJuYWwnXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgY3JlYXRlQ29udGFpbmVyID0gdXNlQ2FsbGJhY2soKGNvbnRhaW5lciwgY29udGFpbmVyUGF0aCwgX2NoaWxkTmV3UmVuZGVyKSA9PiB7XG4gICAgICAgIGlmIChpc1NpbXBsZUNvbXBvbmVudChyZW5kZXJDb21wb25lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyQ29tcG9uZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChEYXNoV3JhcHBlciwgeyBrZXk6IGNvbnRhaW5lcj8ucHJvcHM/LmlkXG4gICAgICAgICAgICAgICAgPyBzdHJpbmdpZnlJZChjb250YWluZXIucHJvcHMuaWQpXG4gICAgICAgICAgICAgICAgOiBzdHJpbmdpZnlQYXRoKGNvbnRhaW5lclBhdGgpLCBfZGFzaHByaXZhdGVfZXJyb3I6IF9kYXNocHJpdmF0ZV9lcnJvciwgY29tcG9uZW50UGF0aDogY29udGFpbmVyUGF0aCwgX3Bhc3NlZENvbXBvbmVudDogY29udGFpbmVyLCBfbmV3UmVuZGVyOiBfY2hpbGROZXdSZW5kZXIgfSkpO1xuICAgIH0sIFtdKTtcbiAgICBjb25zdCB3cmFwQ2hpbGRyZW5Qcm9wID0gdXNlQ2FsbGJhY2soKG5vZGUsIGNoaWxkcmVuUGF0aCwgX2NoaWxkTmV3UmVuZGVyKSA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5tYXAoKG4sIGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNEcnlDb21wb25lbnQobikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbnRhaW5lcihuLCBjb25jYXQoY29tcG9uZW50UGF0aCwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmNoaWxkcmVuUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlcbiAgICAgICAgICAgICAgICAgICAgXSksIF9jaGlsZE5ld1JlbmRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0RyeUNvbXBvbmVudChub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbnRhaW5lcihub2RlLCBjb25jYXQoY29tcG9uZW50UGF0aCwgWydwcm9wcycsIC4uLmNoaWxkcmVuUGF0aF0pLCBfY2hpbGROZXdSZW5kZXIpO1xuICAgIH0sIFtjb21wb25lbnRQYXRoXSk7XG4gICAgY29uc3QgZXh0cmFQcm9wcyA9IHtcbiAgICAgICAgc2V0UHJvcHMsXG4gICAgICAgIC4uLmV4dHJhc1xuICAgIH07XG4gICAgaWYgKGNoZWNrUmVuZGVyVHlwZVByb3AocmVuZGVyQ29tcG9uZW50KSkge1xuICAgICAgICBleHRyYVByb3BzWydkYXNoUmVuZGVyVHlwZSddID0gbmV3UmVuZGVyLmN1cnJlbnRcbiAgICAgICAgICAgID8gJ3BhcmVudCdcbiAgICAgICAgICAgIDogY2hhbmdlZFByb3BzXG4gICAgICAgICAgICAgICAgPyByZW5kZXJUeXBlXG4gICAgICAgICAgICAgICAgOiAncGFyZW50JztcbiAgICB9XG4gICAgY29uc3Qgc2V0SHlkcmF0ZWRQcm9wcyA9IChjb21wb25lbnQsIGNvbXBvbmVudFByb3BzKSA9PiB7XG4gICAgICAgIC8vIEh5ZHJhdGUgY29tcG9uZW50cyBwcm9wc1xuICAgICAgICBjb25zdCBjaGlsZHJlblByb3BzID0gcGF0aE9yKFtdLCBbJ2NoaWxkcmVuX3Byb3BzJywgY29tcG9uZW50Py5uYW1lc3BhY2UsIGNvbXBvbmVudD8udHlwZV0sIGNvbmZpZyk7XG4gICAgICAgIGxldCBwcm9wcyA9IG1lcmdlUmlnaHQoZGlzc29jKCdjaGlsZHJlbicsIGNvbXBvbmVudFByb3BzKSwgZXh0cmFQcm9wcyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW5Qcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW5Qcm9wID0gY2hpbGRyZW5Qcm9wc1tpXTtcbiAgICAgICAgICAgIGxldCBjaGlsZE5ld1JlbmRlciA9IDA7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5Qcm9wXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcuJylbMF1cbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnW10nLCAnJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgne30nLCAnJykgaW4gY2hhbmdlZFByb3BzIHx8XG4gICAgICAgICAgICAgICAgbmV3UmVuZGVyLmN1cnJlbnQgfHxcbiAgICAgICAgICAgICAgICAhcmVuZGVySCkge1xuICAgICAgICAgICAgICAgIGNoaWxkTmV3UmVuZGVyID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVPYmplY3QgPSAob2JqLCBvcGF0aCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXBPYmpJbmRleGVkKChub2RlLCBrKSA9PiB3cmFwQ2hpbGRyZW5Qcm9wKG5vZGUsIFsuLi5vcGF0aCwga10sIGNoaWxkTmV3UmVuZGVyKSwgb2JqKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5Qcm9wLmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW5QYXRoID0gY2hpbGRyZW5Qcm9wLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGU7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5Qcm9wLmluY2x1ZGVzKCdbXScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyb250UGF0aCA9IFtdLCBiYWNrUGF0aCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZSwgaGFzT2JqZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF0IGZpcnN0IHRoZSBjaGlsZHJlblBhdGggaXMgYWx3YXlzIGEgbGlzdCBvZiBzdHJpbmdzLlxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlblBhdGguZm9yRWFjaChwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocC5pbmNsdWRlcygnW10nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLmluY2x1ZGVzKCd7fScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPYmplY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRQYXRoLnB1c2gocC5yZXBsYWNlKCd7fScsICcnKS5yZXBsYWNlKCdbXScsICcnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9udFBhdGgucHVzaChwLnJlcGxhY2UoJ1tdJywgJycpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwLmluY2x1ZGVzKCd7fScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc09iamVjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250UGF0aC5wdXNoKHAucmVwbGFjZSgne30nLCAnJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRQYXRoLnB1c2gocCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuaW5jbHVkZXMoJ3t9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT2JqZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja1BhdGgucHVzaChwLnJlcGxhY2UoJ3t9JywgJycpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tQYXRoLnB1c2gocCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHBhdGgoZnJvbnRQYXRoLCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQgfHwgIW5vZGU/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3ROb2RlID0gcGF0aChiYWNrUGF0aCwgbm9kZVswXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3ROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBub2RlVmFsdWUgPSBub2RlLm1hcCgoZWwsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRQYXRoID0gY29uY2F0KGZyb250UGF0aCwgY29uY2F0KFtpXSwgYmFja1BhdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tQYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0VmFsdWUgPSBoYW5kbGVPYmplY3QocGF0aChiYWNrUGF0aCwgZWwpLCBlbGVtZW50UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0VmFsdWUgPSBoYW5kbGVPYmplY3QoZWwsIGVsZW1lbnRQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0VmFsdWUgPSB3cmFwQ2hpbGRyZW5Qcm9wKHBhdGgoYmFja1BhdGgsIGVsKSwgZWxlbWVudFBhdGgsIGNoaWxkTmV3UmVuZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhc3NvY1BhdGgoYmFja1BhdGgsIGxpc3RWYWx1ZSwgZWwpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5QYXRoID0gZnJvbnRQYXRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBzdXBwb3J0cyBvbmUgbGV2ZWwgb2YgbmVzdGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyb250ID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZHluYW1pYyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc0JhY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tQYXRoID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNoaWxkcmVuUGF0aC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1ciA9IGNoaWxkcmVuUGF0aFtqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyLmluY2x1ZGVzKCd7fScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgPSBjb25jYXQoZnJvbnQsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ci5yZXBsYWNlKCd7fScsICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPCBjaGlsZHJlblBhdGgubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQmFjayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNCYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrUGF0aC5wdXNoKGN1cik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9udC5wdXNoKGN1cik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkeW5WYWx1ZSA9IHBhdGgoZHluYW1pYywgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5blZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b28gZHluYW1pYyBmb3IgcHJvcGVyIHRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVZhbHVlID0gbWFwT2JqSW5kZXhlZCgoZCwgaykgPT4gd3JhcENoaWxkcmVuUHJvcChoYXNCYWNrID8gcGF0aChiYWNrUGF0aCwgZCkgOiBkLCBoYXNCYWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY29uY2F0KGR5bmFtaWMsIGNvbmNhdChba10sIGJhY2tQYXRoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb25jYXQoZHluYW1pYywgW2tdKSwgY2hpbGROZXdSZW5kZXIpLCBkeW5WYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5QYXRoID0gZHluYW1pYztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBwYXRoKGNoaWxkcmVuUGF0aCwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVZhbHVlID0gd3JhcENoaWxkcmVuUHJvcChub2RlLCBjaGlsZHJlblBhdGgsIGNoaWxkTmV3UmVuZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9wcyA9IGFzc29jUGF0aChjaGlsZHJlblBhdGgsIG5vZGVWYWx1ZSwgcHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3BhdGggPSBjaGlsZHJlblByb3AucmVwbGFjZSgne30nLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQXJyYXkgPSBjaGlsZHJlblByb3AuaW5jbHVkZXMoJ1tdJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGF0aCA9IG9wYXRoLnJlcGxhY2UoJ1tdJywgJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBwcm9wc1tvcGF0aF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBub2RlLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFQYXRoID0gY29uY2F0KFtvcGF0aF0sIFtqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzID0gYXNzb2NQYXRoKGFQYXRoLCBoYW5kbGVPYmplY3Qobm9kZVtqXSwgYVBhdGgpLCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMgPSBhc3NvYyhvcGF0aCwgaGFuZGxlT2JqZWN0KG5vZGUsIFtvcGF0aF0pLCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBwcm9wc1tjaGlsZHJlblByb3BdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wcyA9IGFzc29jKGNoaWxkcmVuUHJvcCwgd3JhcENoaWxkcmVuUHJvcChub2RlLCBbY2hpbGRyZW5Qcm9wXSwgY2hpbGROZXdSZW5kZXIpLCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUocHJvcHMuaWQpID09PSAnT2JqZWN0Jykge1xuICAgICAgICAgICAgLy8gVHVybiBvYmplY3QgaWRzIChmb3Igd2lsZGNhcmRzKSBpbnRvIHVuaXF1ZSBzdHJpbmdzLlxuICAgICAgICAgICAgLy8gQmVjYXVzZSBvZiB0aGUgYGRpc3NvY2AgYWJvdmUgd2UncmUgbm90IG11dGF0aW5nIHRoZSBsYXlvdXQsXG4gICAgICAgICAgICAvLyBqdXN0IHRoZSBpZCB3ZSBwYXNzIG9uIHRvIHRoZSByZW5kZXJlZCBjb21wb25lbnRcbiAgICAgICAgICAgIHByb3BzLmlkID0gc3RyaW5naWZ5SWQocHJvcHMuaWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wcztcbiAgICB9O1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChfbmV3UmVuZGVyKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChyZXNldENvbXBvbmVudFN0YXRlKHtcbiAgICAgICAgICAgICAgICBpdGVtcGF0aDogY29tcG9uZW50UGF0aFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfSwgW19uZXdSZW5kZXJdKTtcbiAgICBjb25zdCBoeWRyYXRlRnVuYyA9ICgpID0+IHtcbiAgICAgICAgaWYgKG5ld1JlbmRlci5jdXJyZW50KSB7XG4gICAgICAgICAgICByZW5kZXJDb21wb25lbnQgPSBfcGFzc2VkQ29tcG9uZW50O1xuICAgICAgICAgICAgcmVuZGVyQ29tcG9uZW50UHJvcHMgPSBfcGFzc2VkQ29tcG9uZW50Py5wcm9wcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlbmRlckNvbXBvbmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IFJlZ2lzdHJ5LnJlc29sdmUocmVuZGVyQ29tcG9uZW50KTtcbiAgICAgICAgY29uc3QgaHlkcmF0ZWRQcm9wcyA9IHNldEh5ZHJhdGVkUHJvcHMocmVuZGVyQ29tcG9uZW50LCByZW5kZXJDb21wb25lbnRQcm9wcyk7XG4gICAgICAgIGxldCBoeWRyYXRlZENoaWxkcmVuO1xuICAgICAgICBpZiAocmVuZGVyQ29tcG9uZW50UHJvcHMuY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaHlkcmF0ZWRDaGlsZHJlbiA9IHdyYXBDaGlsZHJlblByb3AocmVuZGVyQ29tcG9uZW50UHJvcHMuY2hpbGRyZW4sIFsnY2hpbGRyZW4nXSwgIXJlbmRlckggfHwgbmV3UmVuZGVyLmN1cnJlbnQgfHwgJ2NoaWxkcmVuJyBpbiBjaGFuZ2VkUHJvcHNcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiAwKTtcbiAgICAgICAgfVxuICAgICAgICBuZXdSZW5kZXIuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gY29uZmlnLnByb3BzX2NoZWNrID8gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hlY2tlZENvbXBvbmVudCwgeyBlbGVtZW50OiBlbGVtZW50LCBwcm9wczogaHlkcmF0ZWRQcm9wcywgY29tcG9uZW50OiByZW5kZXJDb21wb25lbnQgfSwgY3JlYXRlRWxlbWVudChlbGVtZW50LCBoeWRyYXRlZFByb3BzLCBleHRyYVByb3BzLCBoeWRyYXRlZENoaWxkcmVuKSkpIDogKGNyZWF0ZUVsZW1lbnQoZWxlbWVudCwgaHlkcmF0ZWRQcm9wcywgZXh0cmFQcm9wcywgaHlkcmF0ZWRDaGlsZHJlbikpO1xuICAgIH07XG4gICAgbGV0IGh5ZHJhdGVkID0gbnVsbDtcbiAgICBpZiAocmVuZGVySCBpbiBtZW1vaXplZEtleXMuY3VycmVudCAmJiAhbmV3UmVuZGVyLmN1cnJlbnQpIHtcbiAgICAgICAgaHlkcmF0ZWQgPSBSZWFjdC5pc1ZhbGlkRWxlbWVudChtZW1vaXplZEtleXMuY3VycmVudFtyZW5kZXJIXSlcbiAgICAgICAgICAgID8gbWVtb2l6ZWRLZXlzLmN1cnJlbnRbcmVuZGVySF1cbiAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG4gICAgaWYgKCFoeWRyYXRlZCkge1xuICAgICAgICBoeWRyYXRlZCA9IGh5ZHJhdGVGdW5jKCk7XG4gICAgICAgIG1lbW9pemVkS2V5cy5jdXJyZW50ID0geyBbcmVuZGVySF06IGh5ZHJhdGVkIH07XG4gICAgfVxuICAgIHJldHVybiByZW5kZXJDb21wb25lbnQgPyAoUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnRFcnJvckJvdW5kYXJ5LCB7IGNvbXBvbmVudFR5cGU6IHJlbmRlckNvbXBvbmVudC50eXBlLCBjb21wb25lbnRJZDogaXMoT2JqZWN0LCByZW5kZXJDb21wb25lbnRQcm9wcy5pZClcbiAgICAgICAgICAgID8gc3RyaW5naWZ5SWQocmVuZGVyQ29tcG9uZW50UHJvcHMuaWQpXG4gICAgICAgICAgICA6IHJlbmRlckNvbXBvbmVudFByb3BzLmlkLCBlcnJvcjogX2Rhc2hwcml2YXRlX2Vycm9yLCBkaXNwYXRjaDogZGlzcGF0Y2gsIGtleTogZnJlc2hSZW5kZXJzLmN1cnJlbnQgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChEYXNoQ29udGV4dFByb3ZpZGVyLCB7IGNvbXBvbmVudFBhdGg6IGNvbXBvbmVudFBhdGggfSwgUmVhY3QuaXNWYWxpZEVsZW1lbnQoaHlkcmF0ZWQpID8gaHlkcmF0ZWQgOiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwpKSkpIDogKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgbnVsbCkpO1xufVxuZXhwb3J0IGRlZmF1bHQgRGFzaFdyYXBwZXI7XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGJhdGNoLCB1c2VEaXNwYXRjaCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBEYXNoV3JhcHBlciBmcm9tICcuL0Rhc2hXcmFwcGVyJztcbmltcG9ydCB7IGFkZENvbXBvbmVudFRvTGF5b3V0LCBub3RpZnlPYnNlcnZlcnMsIHJlbW92ZUNvbXBvbmVudCwgdXBkYXRlUHJvcHMgfSBmcm9tICcuLi9hY3Rpb25zJztcbi8qKlxuICogRm9yIHJlbmRlcmluZyBjb21wb25lbnRzIHRoYXQgYXJlIG91dCBvZiB0aGUgcmVndWxhciBsYXlvdXQgdHJlZS5cbiAqL1xuZnVuY3Rpb24gRXh0ZXJuYWxXcmFwcGVyKHsgY29tcG9uZW50LCBjb21wb25lbnRQYXRoLCB0ZW1wID0gZmFsc2UgfSkge1xuICAgIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcbiAgICBjb25zdCBbaW5zZXJ0ZWQsIHNldEluc2VydGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICAvLyBHaXZlIGVtcHR5IHByb3BzIGZvciB0aGUgaW5zZXJ0ZWQgY29tcG9uZW50cy5cbiAgICAgICAgLy8gVGhlIHByb3BzIHdpbGwgY29tZSBmcm9tIHRoZSBwYXJlbnQgc28gdGhleSBjYW4gYmUgdXBkYXRlZC5cbiAgICAgICAgZGlzcGF0Y2goYWRkQ29tcG9uZW50VG9MYXlvdXQoe1xuICAgICAgICAgICAgY29tcG9uZW50LFxuICAgICAgICAgICAgY29tcG9uZW50UGF0aFxuICAgICAgICB9KSk7XG4gICAgICAgIHNldEluc2VydGVkKHRydWUpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRlbXApIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChyZW1vdmVDb21wb25lbnQoeyBjb21wb25lbnRQYXRoIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9LCBbXSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgYmF0Y2goKCkgPT4ge1xuICAgICAgICAgICAgZGlzcGF0Y2godXBkYXRlUHJvcHMoeyBpdGVtcGF0aDogY29tcG9uZW50UGF0aCwgcHJvcHM6IGNvbXBvbmVudC5wcm9wcyB9KSk7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50LnByb3BzLmlkKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2gobm90aWZ5T2JzZXJ2ZXJzKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbXBvbmVudC5wcm9wcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHM6IGNvbXBvbmVudC5wcm9wc1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSwgW2NvbXBvbmVudC5wcm9wc10pO1xuICAgIGlmICghaW5zZXJ0ZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIFJlbmRlciBhIHdyYXBwZXIgd2l0aCB0aGUgYWN0dWFsIHByb3BzLlxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KERhc2hXcmFwcGVyLCB7IGNvbXBvbmVudFBhdGg6IGNvbXBvbmVudFBhdGggfSk7XG59XG5leHBvcnQgZGVmYXVsdCBFeHRlcm5hbFdyYXBwZXI7XG4iLCJpbXBvcnQgeyBnZXRDb21wb25lbnRMYXlvdXQsIHN0cmluZ2lmeVBhdGgsIGNoZWNrRGFzaENoaWxkcmVuVXBkYXRlIH0gZnJvbSAnLi93cmFwcGluZyc7XG5pbXBvcnQgeyBwYXRoT3IgfSBmcm9tICdyYW1kYSc7XG5jb25zdCBwcmV2aW91c0hhc2hlcyA9IHt9O1xuY29uc3QgaXNGaXJzdExldmVsUHJvcHNDaGlsZCA9ICh1cGRhdGVkUGF0aCwgc3RyUGF0aCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWRTZWdtZW50cyA9IHVwZGF0ZWRQYXRoLnNwbGl0KCcsJyk7XG4gICAgY29uc3QgZnVsbFNlZ21lbnRzID0gc3RyUGF0aC5zcGxpdCgnLCcpO1xuICAgIC8vIENoZWNrIHRoYXQgc3RyUGF0aCBhY3R1YWxseSBzdGFydHMgd2l0aCB1cGRhdGVkUGF0aFxuICAgIGNvbnN0IHN0YXJ0c1dpdGhQYXRoID0gZnVsbFNlZ21lbnRzLmV2ZXJ5KChzZWcsIGkpID0+IHVwZGF0ZWRTZWdtZW50c1tpXSA9PT0gc2VnKTtcbiAgICBpZiAoIXN0YXJ0c1dpdGhQYXRoKVxuICAgICAgICByZXR1cm4gW2ZhbHNlLCBbXV07XG4gICAgLy8gR2V0IHRoZSByZW1haW5pbmcgcGF0aCBhZnRlciB0aGUgcHJlZml4XG4gICAgY29uc3QgcmVtYWluaW5nU2VnbWVudHMgPSB1cGRhdGVkU2VnbWVudHMuc2xpY2UoZnVsbFNlZ21lbnRzLmxlbmd0aCk7XG4gICAgY29uc3QgcHJvcHNDb3VudCA9IHJlbWFpbmluZ1NlZ21lbnRzLmZpbHRlcihzID0+IHMgPT09ICdwcm9wcycpLmxlbmd0aDtcbiAgICByZXR1cm4gW3Byb3BzQ291bnQgPCAyLCByZW1haW5pbmdTZWdtZW50c107XG59O1xuZnVuY3Rpb24gZGV0ZXJtaW5lQ2hhbmdlZFByb3BzKHN0YXRlLCBzdHJQYXRoKSB7XG4gICAgbGV0IGNvbWJpbmVkSGFzaCA9IDA7XG4gICAgbGV0IHJlbmRlclR5cGU7IC8vIERlZmF1bHQgcmVuZGVyIHR5cGUsIGFkanVzdCBhcyBuZWVkZWRcbiAgICBjb25zdCBjaGFuZ2VkUHJvcHMgPSB7fTtcbiAgICBPYmplY3QuZW50cmllcyhzdGF0ZS5sYXlvdXRIYXNoZXMpLmZvckVhY2goKFt1cGRhdGVkUGF0aCwgcGF0aEhhc2hdKSA9PiB7XG4gICAgICAgIGNvbnN0IFtkZXNjZW5kYW50LCByZW1haW5pbmdTZWdtZW50c10gPSBpc0ZpcnN0TGV2ZWxQcm9wc0NoaWxkKHVwZGF0ZWRQYXRoLCBzdHJQYXRoKTtcbiAgICAgICAgaWYgKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSGFzaCA9IHBhdGhPcih7fSwgW3VwZGF0ZWRQYXRoXSwgcHJldmlvdXNIYXNoZXMpO1xuICAgICAgICAgICAgY29tYmluZWRIYXNoICs9IHBhdGhPcigwLCBbJ2hhc2gnXSwgcGF0aEhhc2gpO1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzSGFzaCAhPT0gcGF0aEhhc2gpIHtcbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlZFBhdGggIT09IHN0clBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjaGFuZ2VkUHJvcHMsIHsgW3JlbWFpbmluZ1NlZ21lbnRzWzFdXTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyVHlwZSA9ICdjb21wb25lbnRzJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY2hhbmdlZFByb3BzLCBwYXRoT3Ioe30sIFsnY2hhbmdlZFByb3BzJ10sIHBhdGhIYXNoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlclR5cGUgPSBwYXRoT3Ioe30sIFsncmVuZGVyVHlwZSddLCBwYXRoSGFzaCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZXZpb3VzSGFzaGVzW3VwZGF0ZWRQYXRoXSA9IHBhdGhIYXNoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaGFzaDogY29tYmluZWRIYXNoLFxuICAgICAgICBjaGFuZ2VkUHJvcHMsXG4gICAgICAgIHJlbmRlclR5cGVcbiAgICB9O1xufVxuZXhwb3J0IGNvbnN0IHNlbGVjdERhc2hQcm9wcyA9IChjb21wb25lbnRQYXRoKSA9PiAoc3RhdGUpID0+IHtcbiAgICBjb25zdCBjID0gZ2V0Q29tcG9uZW50TGF5b3V0KGNvbXBvbmVudFBhdGgsIHN0YXRlKTtcbiAgICAvLyBMYXlvdXQgaGFzaGVzIHJlY29yZHMgdGhlIG51bWJlciBvZiB0aW1lcyBhIHBhdGggaGFzIGJlZW4gdXBkYXRlZC5cbiAgICAvLyBzdW0gd2l0aCB0aGUgcGFyZW50cyBoYXNoIChtYXRjaCB3aXRob3V0IHRoZSBsYXN0ICddJykgdG8gZ2V0IHRoZSByZWFsIGhhc2hcbiAgICAvLyBUaGVuIGl0IGNhbiBiZSBlYXNpbHkgY29tcGFyZWQgd2l0aG91dCBoYXZpbmcgdG8gY29tcGFyZSB0aGUgcHJvcHMuXG4gICAgY29uc3Qgc3RyUGF0aCA9IHN0cmluZ2lmeVBhdGgoY29tcG9uZW50UGF0aCk7XG4gICAgbGV0IGhhc2g7XG4gICAgaWYgKGNoZWNrRGFzaENoaWxkcmVuVXBkYXRlKGMpKSB7XG4gICAgICAgIGhhc2ggPSBkZXRlcm1pbmVDaGFuZ2VkUHJvcHMoc3RhdGUsIHN0clBhdGgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaGFzaCA9IHN0YXRlLmxheW91dEhhc2hlc1tzdHJQYXRoXTtcbiAgICB9XG4gICAgbGV0IGggPSAwO1xuICAgIGxldCBjaGFuZ2VkUHJvcHMgPSB7fTtcbiAgICBsZXQgcmVuZGVyVHlwZSA9ICcnO1xuICAgIGlmIChoYXNoKSB7XG4gICAgICAgIGggPSBoYXNoWydoYXNoJ107XG4gICAgICAgIGNoYW5nZWRQcm9wcyA9IGhhc2hbJ2NoYW5nZWRQcm9wcyddO1xuICAgICAgICByZW5kZXJUeXBlID0gaGFzaFsncmVuZGVyVHlwZSddO1xuICAgIH1cbiAgICByZXR1cm4gW2MsIGM/LnByb3BzLCBoLCBjaGFuZ2VkUHJvcHMsIHJlbmRlclR5cGVdO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3REYXNoUHJvcHNFcXVhbGl0eUZuKFtfLCBfXywgaGFzaF0sIFtfX18sIF9fX18sIHByZXZpb3VzSGFzaF0pIHtcbiAgICAvLyBPbmx5IG5lZWQgdG8gY29tcGFyZSB0aGUgaGFzaCBhcyBhbnkgY2hhbmdlIGlzIHN1bW1lZCB1cFxuICAgIHJldHVybiBoYXNoID09PSBwcmV2aW91c0hhc2g7XG59XG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0Q29uZmlnKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLmNvbmZpZztcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBtZXJnZVJpZ2h0LCBwYXRoLCB0eXBlLCBoYXMsIGpvaW4sIHBhdGhPciB9IGZyb20gJ3JhbWRhJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KGVsZW1lbnQsIHByb3BzLCBleHRyYVByb3BzLCBjaGlsZHJlbikge1xuICAgIGNvbnN0IGFsbFByb3BzID0gbWVyZ2VSaWdodChwcm9wcywgZXh0cmFQcm9wcyk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGVsZW1lbnQsIGFsbFByb3BzLCAuLi5jaGlsZHJlbik7XG4gICAgfVxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGVsZW1lbnQsIGFsbFByb3BzLCBjaGlsZHJlbik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEcnlDb21wb25lbnQob2JqKSB7XG4gICAgcmV0dXJuICh0eXBlKG9iaikgPT09ICdPYmplY3QnICYmXG4gICAgICAgIGhhcygndHlwZScsIG9iaikgJiZcbiAgICAgICAgaGFzKCduYW1lc3BhY2UnLCBvYmopICYmXG4gICAgICAgIGhhcygncHJvcHMnLCBvYmopKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgaWYgKHR5cGUoY29tcG9uZW50RGVmaW5pdGlvbikgPT09ICdBcnJheScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY2hpbGRyZW4gcHJvcGVydHkgb2YgYSBjb21wb25lbnQgaXMgYSBsaXN0IG9mIGxpc3RzLCBpbnN0ZWFkICcgK1xuICAgICAgICAgICAgJ29mIGp1c3QgYSBsaXN0LiBUaGlzIGNhbiBzb21ldGltZXMgYmUgZHVlIHRvIGEgdHJhaWxpbmcgY29tbWEuICcgK1xuICAgICAgICAgICAgJ0NoZWNrIHRoZSBjb21wb25lbnQgdGhhdCBoYXMgdGhlIGZvbGxvd2luZyBjb250ZW50cyAnICtcbiAgICAgICAgICAgICdhbmQgcmVtb3ZlIG9uZSBvZiB0aGUgbGV2ZWxzIG9mIG5lc3Rpbmc6IFxcbicgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29tcG9uZW50RGVmaW5pdGlvbiwgbnVsbCwgMikpO1xuICAgIH1cbiAgICBpZiAodHlwZShjb21wb25lbnREZWZpbml0aW9uKSA9PT0gJ09iamVjdCcgJiZcbiAgICAgICAgIShoYXMoJ25hbWVzcGFjZScsIGNvbXBvbmVudERlZmluaXRpb24pICYmXG4gICAgICAgICAgICBoYXMoJ3R5cGUnLCBjb21wb25lbnREZWZpbml0aW9uKSAmJlxuICAgICAgICAgICAgaGFzKCdwcm9wcycsIGNvbXBvbmVudERlZmluaXRpb24pKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIG9iamVjdCB3YXMgcHJvdmlkZWQgYXMgYGNoaWxkcmVuYCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50LCAnICtcbiAgICAgICAgICAgICdzdHJpbmcsIG9yIG51bWJlciAob3IgbGlzdCBvZiB0aG9zZSkuICcgK1xuICAgICAgICAgICAgJ0NoZWNrIHRoZSBjaGlsZHJlbiBwcm9wZXJ0eSB0aGF0IGxvb2tzIHNvbWV0aGluZyBsaWtlOlxcbicgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29tcG9uZW50RGVmaW5pdGlvbiwgbnVsbCwgMikpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlQYXRoKGxheW91dFBhdGgpIHtcbiAgICByZXR1cm4gam9pbignLCcsIGxheW91dFBhdGgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBvbmVudExheW91dChjb21wb25lbnRQYXRoLCBzdGF0ZSkge1xuICAgIHJldHVybiBwYXRoKGNvbXBvbmVudFBhdGgsIHN0YXRlLmxheW91dCk7XG59XG5leHBvcnQgZnVuY3Rpb24gY2hlY2tSZW5kZXJUeXBlUHJvcChjb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgcmV0dXJuICgnZGFzaFJlbmRlclR5cGUnIGluXG4gICAgICAgIHBhdGhPcih7fSwgW2NvbXBvbmVudERlZmluaXRpb24/Lm5hbWVzcGFjZSwgY29tcG9uZW50RGVmaW5pdGlvbj8udHlwZV0sIHdpbmRvdykpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRGFzaENoaWxkcmVuVXBkYXRlKGNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICByZXR1cm4gKCdkYXNoQ2hpbGRyZW5VcGRhdGUnIGluXG4gICAgICAgIHBhdGhPcih7fSwgW2NvbXBvbmVudERlZmluaXRpb24/Lm5hbWVzcGFjZSwgY29tcG9uZW50RGVmaW5pdGlvbj8udHlwZV0sIHdpbmRvdykpO1xufVxuIiwiaW1wb3J0IHtiYXRjaCwgY29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHtpbmNsdWRlcywgaXNFbXB0eX0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IFJlYWN0LCB7dXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgR2xvYmFsRXJyb3JDb250YWluZXIgZnJvbSAnLi9jb21wb25lbnRzL2Vycm9yL0dsb2JhbEVycm9yQ29udGFpbmVyLnJlYWN0JztcbmltcG9ydCB7XG4gICAgZGlzcGF0Y2hFcnJvcixcbiAgICBoeWRyYXRlSW5pdGlhbE91dHB1dHMsXG4gICAgb25FcnJvcixcbiAgICBzZXRHcmFwaHMsXG4gICAgc2V0UGF0aHMsXG4gICAgc2V0TGF5b3V0XG59IGZyb20gJy4vYWN0aW9ucyc7XG5pbXBvcnQge2NvbXB1dGVQYXRoc30gZnJvbSAnLi9hY3Rpb25zL3BhdGhzJztcbmltcG9ydCB7Y29tcHV0ZUdyYXBoc30gZnJvbSAnLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgYXBpVGh1bmsgZnJvbSAnLi9hY3Rpb25zL2FwaSc7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnLi9hY3Rpb25zL3V0aWxzJztcbmltcG9ydCB7YXBwbHlQZXJzaXN0ZW5jZX0gZnJvbSAnLi9wZXJzaXN0ZW5jZSc7XG5pbXBvcnQge2dldEFwcFN0YXRlfSBmcm9tICcuL3JlZHVjZXJzL2NvbnN0YW50cyc7XG5pbXBvcnQge1NUQVRVU30gZnJvbSAnLi9jb25zdGFudHMvY29uc3RhbnRzJztcbmltcG9ydCB3YWl0IGZyb20gJy4vdXRpbHMvd2FpdCc7XG5pbXBvcnQgaXNTaW1wbGVDb21wb25lbnQgZnJvbSAnLi9pc1NpbXBsZUNvbXBvbmVudCc7XG5pbXBvcnQgRGFzaFdyYXBwZXIgZnJvbSAnLi93cmFwcGVyL0Rhc2hXcmFwcGVyJztcblxuLyoqXG4gKiBGaXJlIG9mZiBBUEkgY2FsbHMgZm9yIGluaXRpYWxpemF0aW9uXG4gKiBAcGFyYW0geyp9IHByb3BzIHByb3BzXG4gKiBAcmV0dXJucyB7Kn0gY29tcG9uZW50XG4gKi9cbmNvbnN0IFVuY29ubmVjdGVkQ29udGFpbmVyID0gcHJvcHMgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgICAgYXBwTGlmZWN5Y2xlLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3QsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBsYXlvdXRSZXF1ZXN0LFxuICAgICAgICBsYXlvdXRcbiAgICB9ID0gcHJvcHM7XG5cbiAgICBjb25zdCBbZXJyb3JMb2FkaW5nLCBzZXRFcnJvckxvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgY29uc3QgZXZlbnRzID0gdXNlUmVmKG51bGwpO1xuICAgIGlmICghZXZlbnRzLmN1cnJlbnQpIHtcbiAgICAgICAgZXZlbnRzLmN1cnJlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgfVxuICAgIGNvbnN0IHJlbmRlcmVkVHJlZSA9IHVzZVJlZihmYWxzZSk7XG5cbiAgICB1c2VFZmZlY3Qoc3RvcmVFZmZlY3QuYmluZChudWxsLCBwcm9wcywgZXZlbnRzLCBzZXRFcnJvckxvYWRpbmcpKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChyZW5kZXJlZFRyZWUuY3VycmVudCkge1xuICAgICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICByZW5kZXJlZFRyZWUuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHdhaXQoMCk7XG4gICAgICAgICAgICAgICAgZXZlbnRzLmN1cnJlbnQuZW1pdCgncmVuZGVyZWQnKTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChjb25maWcuc2VydmVfbG9jYWxseSkge1xuICAgICAgICAgICAgd2luZG93Ll9kYXNoUGxvdGx5SlNVUkwgPSBgJHtjb25maWcucmVxdWVzdHNfcGF0aG5hbWVfcHJlZml4fV9kYXNoLWNvbXBvbmVudC1zdWl0ZXMvcGxvdGx5L3BhY2thZ2VfZGF0YS9wbG90bHkubWluLmpzYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpbmRvdy5fZGFzaFBsb3RseUpTVVJMID0gY29uZmlnLnBsb3RseWpzX3VybDtcbiAgICAgICAgfVxuICAgIH0sIFtdKTtcblxuICAgIGxldCBjb250ZW50O1xuICAgIGlmIChcbiAgICAgICAgbGF5b3V0UmVxdWVzdC5zdGF0dXMgJiZcbiAgICAgICAgIWluY2x1ZGVzKGxheW91dFJlcXVlc3Quc3RhdHVzLCBbU1RBVFVTLk9LLCAnbG9hZGluZyddKVxuICAgICkge1xuICAgICAgICBpZiAoY29uZmlnLnVpKSB7XG4gICAgICAgICAgICBjb250ZW50ID0gKFxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGxheW91dFJlcXVlc3QuY29udGVudH19XG4gICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtZXJyb3InPkVycm9yIGxvYWRpbmcgbGF5b3V0PC9kaXY+O1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICAgZXJyb3JMb2FkaW5nIHx8XG4gICAgICAgIChkZXBlbmRlbmNpZXNSZXF1ZXN0LnN0YXR1cyAmJlxuICAgICAgICAgICAgIWluY2x1ZGVzKGRlcGVuZGVuY2llc1JlcXVlc3Quc3RhdHVzLCBbU1RBVFVTLk9LLCAnbG9hZGluZyddKSlcbiAgICApIHtcbiAgICAgICAgaWYgKGNvbmZpZy51aSkge1xuICAgICAgICAgICAgY29udGVudCA9IChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGRlcGVuZGVuY2llc1JlcXVlc3QuY29udGVudFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZW50ID0gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC1lcnJvcic+RXJyb3IgbG9hZGluZyBkZXBlbmRlbmNpZXM8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFwcExpZmVjeWNsZSA9PT0gZ2V0QXBwU3RhdGUoJ0hZRFJBVEVEJykpIHtcbiAgICAgICAgcmVuZGVyZWRUcmVlLmN1cnJlbnQgPSB0cnVlO1xuXG4gICAgICAgIGNvbnRlbnQgPSAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIHtBcnJheS5pc0FycmF5KGxheW91dC5jb21wb25lbnRzKSA/IChcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmNvbXBvbmVudHMubWFwKChjLCBpKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNTaW1wbGVDb21wb25lbnQoYykgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY1xuICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RGFzaFdyYXBwZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2Vycm9yPXtlcnJvcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UGF0aD17Wydjb21wb25lbnRzJywgaV19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17aX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgPERhc2hXcmFwcGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBfZGFzaHByaXZhdGVfZXJyb3I9e2Vycm9yfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UGF0aD17Wydjb21wb25lbnRzJ119XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvPlxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRlbnQgPSA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtbG9hZGluZyc+TG9hZGluZy4uLjwvZGl2PjtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnICYmIGNvbmZpZy51aSA9PT0gdHJ1ZSA/IChcbiAgICAgICAgPEdsb2JhbEVycm9yQ29udGFpbmVyPntjb250ZW50fTwvR2xvYmFsRXJyb3JDb250YWluZXI+XG4gICAgKSA6IChcbiAgICAgICAgY29udGVudFxuICAgICk7XG59O1xuXG5mdW5jdGlvbiBzdG9yZUVmZmVjdChwcm9wcywgZXZlbnRzLCBzZXRFcnJvckxvYWRpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICAgIGFwcExpZmVjeWNsZSxcbiAgICAgICAgZGVwZW5kZW5jaWVzUmVxdWVzdCxcbiAgICAgICAgZGlzcGF0Y2gsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBncmFwaHMsXG4gICAgICAgIGhvb2tzLFxuICAgICAgICBsYXlvdXQsXG4gICAgICAgIGxheW91dFJlcXVlc3QsXG4gICAgICAgIGNvbmZpZ1xuICAgIH0gPSBwcm9wcztcblxuICAgIGJhdGNoKCgpID0+IHtcbiAgICAgICAgaWYgKGlzRW1wdHkobGF5b3V0UmVxdWVzdCkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaG9va3MubGF5b3V0X3ByZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGhvb2tzLmxheW91dF9wcmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3BhdGNoKGFwaVRodW5rKCdfZGFzaC1sYXlvdXQnLCAnR0VUJywgJ2xheW91dFJlcXVlc3QnKSk7XG4gICAgICAgIH0gZWxzZSBpZiAobGF5b3V0UmVxdWVzdC5zdGF0dXMgPT09IFNUQVRVUy5PSykge1xuICAgICAgICAgICAgaWYgKGlzRW1wdHkobGF5b3V0LmNvbXBvbmVudHMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBob29rcy5sYXlvdXRfcG9zdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBob29rcy5sYXlvdXRfcG9zdChsYXlvdXRSZXF1ZXN0LmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBmaW5hbExheW91dCA9IGFwcGx5UGVyc2lzdGVuY2UoXG4gICAgICAgICAgICAgICAgICAgIGxheW91dFJlcXVlc3QuY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgICAgICBzZXRQYXRocyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVQYXRocyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbExheW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2NvbXBvbmVudHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5jdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHNldExheW91dChmaW5hbExheW91dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRW1wdHkoZGVwZW5kZW5jaWVzUmVxdWVzdCkpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIGFwaVRodW5rKCdfZGFzaC1kZXBlbmRlbmNpZXMnLCAnR0VUJywgJ2RlcGVuZGVuY2llc1JlcXVlc3QnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3Quc3RhdHVzID09PSBTVEFUVVMuT0sgJiZcbiAgICAgICAgICAgIChpc0VtcHR5KGdyYXBocykgfHwgZ3JhcGhzLnJlc2V0KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIHNldEdyYXBocyhcbiAgICAgICAgICAgICAgICAgICAgY29tcHV0ZUdyYXBocyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3QuY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoZGlzcGF0Y2gpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzUmVxdWVzdCBhbmQgaXRzIGNvbXB1dGVkIHN0b3Jlc1xuICAgICAgICAgICAgZGVwZW5kZW5jaWVzUmVxdWVzdC5zdGF0dXMgPT09IFNUQVRVUy5PSyAmJlxuICAgICAgICAgICAgIWlzRW1wdHkoZ3JhcGhzKSAmJlxuICAgICAgICAgICAgLy8gTGF5b3V0UmVxdWVzdCBhbmQgaXRzIGNvbXB1dGVkIHN0b3Jlc1xuICAgICAgICAgICAgbGF5b3V0UmVxdWVzdC5zdGF0dXMgPT09IFNUQVRVUy5PSyAmJlxuICAgICAgICAgICAgIWlzRW1wdHkobGF5b3V0LmNvbXBvbmVudHMpICYmXG4gICAgICAgICAgICAvLyBIYXNuJ3QgYWxyZWFkeSBoeWRyYXRlZFxuICAgICAgICAgICAgYXBwTGlmZWN5Y2xlID09PSBnZXRBcHBTdGF0ZSgnU1RBUlRFRCcpXG4gICAgICAgICkge1xuICAgICAgICAgICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKGh5ZHJhdGVJbml0aWFsT3V0cHV0cyhkaXNwYXRjaEVycm9yKGRpc3BhdGNoKSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gRGlzcGxheSB0aGlzIGVycm9yIGluIGRldnRvb2xzLCB1bmxlc3Mgd2UgaGF2ZSBlcnJvcnNcbiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5LCBpbiB3aGljaCBjYXNlIHdlIGFzc3VtZSB0aGlzIG5ldyBvbmUgaXMgbW9vdFxuICAgICAgICAgICAgICAgIGlmICghZXJyb3IuZnJvbnRFbmQubGVuZ3RoICYmICFlcnJvci5iYWNrRW5kLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChvbkVycm9yKHt0eXBlOiAnYmFja0VuZCcsIGVycm9yOiBlcnJ9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgc2V0RXJyb3JMb2FkaW5nKGhhc0Vycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5VbmNvbm5lY3RlZENvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gICAgYXBwTGlmZWN5Y2xlOiBQcm9wVHlwZXMub25lT2YoW1xuICAgICAgICBnZXRBcHBTdGF0ZSgnU1RBUlRFRCcpLFxuICAgICAgICBnZXRBcHBTdGF0ZSgnSFlEUkFURUQnKSxcbiAgICAgICAgZ2V0QXBwU3RhdGUoJ0RFU1RST1lFRCcpXG4gICAgXSksXG4gICAgZGlzcGF0Y2g6IFByb3BUeXBlcy5mdW5jLFxuICAgIGRlcGVuZGVuY2llc1JlcXVlc3Q6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZ3JhcGhzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGhvb2tzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGxheW91dFJlcXVlc3Q6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgbGF5b3V0OiBQcm9wVHlwZXMuYW55LFxuICAgIGhpc3Rvcnk6IFByb3BUeXBlcy5hbnksXG4gICAgZXJyb3I6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgY29uZmlnOiBQcm9wVHlwZXMub2JqZWN0XG59O1xuXG5jb25zdCBDb250YWluZXIgPSBjb25uZWN0KFxuICAgIC8vIG1hcCBzdGF0ZSB0byBwcm9wc1xuICAgIHN0YXRlID0+ICh7XG4gICAgICAgIGFwcExpZmVjeWNsZTogc3RhdGUuYXBwTGlmZWN5Y2xlLFxuICAgICAgICBkZXBlbmRlbmNpZXNSZXF1ZXN0OiBzdGF0ZS5kZXBlbmRlbmNpZXNSZXF1ZXN0LFxuICAgICAgICBob29rczogc3RhdGUuaG9va3MsXG4gICAgICAgIGxheW91dFJlcXVlc3Q6IHN0YXRlLmxheW91dFJlcXVlc3QsXG4gICAgICAgIGxheW91dDogc3RhdGUubGF5b3V0LFxuICAgICAgICBncmFwaHM6IHN0YXRlLmdyYXBocyxcbiAgICAgICAgaGlzdG9yeTogc3RhdGUuaGlzdG9yeSxcbiAgICAgICAgZXJyb3I6IHN0YXRlLmVycm9yLFxuICAgICAgICBjb25maWc6IHN0YXRlLmNvbmZpZ1xuICAgIH0pLFxuICAgIGRpc3BhdGNoID0+ICh7ZGlzcGF0Y2h9KVxuKShVbmNvbm5lY3RlZENvbnRhaW5lcik7XG5cbmV4cG9ydCBkZWZhdWx0IENvbnRhaW5lcjtcbiIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgQVBJQ29udHJvbGxlciBmcm9tICcuL0FQSUNvbnRyb2xsZXIucmVhY3QnO1xuaW1wb3J0IExvYWRpbmcgZnJvbSAnLi9jb21wb25lbnRzL2NvcmUvTG9hZGluZy5yZWFjdCc7XG5pbXBvcnQgVG9vbGJhciBmcm9tICcuL2NvbXBvbmVudHMvY29yZS9Ub29sYmFyLnJlYWN0JztcbmltcG9ydCBSZWxvYWRlciBmcm9tICcuL2NvbXBvbmVudHMvY29yZS9SZWxvYWRlci5yZWFjdCc7XG5pbXBvcnQgZ2V0Q29uZmlnRnJvbURPTSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQge3NldEhvb2tzLCBzZXRDb25maWd9IGZyb20gJy4vYWN0aW9ucy9pbmRleCc7XG5pbXBvcnQge3R5cGUsIG1lbW9pemVXaXRoLCBpZGVudGl0eX0gZnJvbSAncmFtZGEnO1xuXG5jbGFzcyBVbmNvbm5lY3RlZEFwcENvbnRhaW5lciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwcm9wcy5ob29rcy5sYXlvdXRfcHJlICE9PSBudWxsIHx8XG4gICAgICAgICAgICBwcm9wcy5ob29rcy5sYXlvdXRfcG9zdCAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgcHJvcHMuaG9va3MucmVxdWVzdF9wcmUgIT09IG51bGwgfHxcbiAgICAgICAgICAgIHByb3BzLmhvb2tzLnJlcXVlc3RfcG9zdCAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgcHJvcHMuaG9va3MuY2FsbGJhY2tfcmVzb2x2ZWQgIT09IG51bGwgfHxcbiAgICAgICAgICAgIHByb3BzLmhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3QgIT09IG51bGxcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgaG9va3MgPSBwcm9wcy5ob29rcztcblxuICAgICAgICAgICAgaWYgKGhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3QpIHtcbiAgICAgICAgICAgICAgICBob29rcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaG9va3MsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVmcmVzaF9qd3Q6IG1lbW9pemVXaXRoKFxuICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICBob29rcy5yZXF1ZXN0X3JlZnJlc2hfand0XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcm9wcy5kaXNwYXRjaChzZXRIb29rcyhob29rcykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICAgICAgY29uc3Qge2Rpc3BhdGNofSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZ0Zyb21ET00oKTtcblxuICAgICAgICAvLyBwcmVzZXQgY29tbW9uIHJlcXVlc3QgcGFyYW1zIGluIHRoZSBjb25maWdcbiAgICAgICAgY29uZmlnLmZldGNoID0ge1xuICAgICAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGRpc3BhdGNoKHNldENvbmZpZyhjb25maWcpKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtjb25maWd9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgaWYgKHR5cGUoY29uZmlnKSA9PT0gJ051bGwnKSB7XG4gICAgICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9J19kYXNoLWxvYWRpbmcnPkxvYWRpbmcuLi48L2Rpdj47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qge3Nob3dfdW5kb19yZWRvfSA9IGNvbmZpZztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICB7c2hvd191bmRvX3JlZG8gPyA8VG9vbGJhciAvPiA6IG51bGx9XG4gICAgICAgICAgICAgICAgPEFQSUNvbnRyb2xsZXIgLz5cbiAgICAgICAgICAgICAgICA8TG9hZGluZyAvPlxuICAgICAgICAgICAgICAgIDxSZWxvYWRlciAvPlxuICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblVuY29ubmVjdGVkQXBwQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgICBob29rczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBkaXNwYXRjaDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgY29uZmlnOiBQcm9wVHlwZXMub2JqZWN0XG59O1xuXG5jb25zdCBBcHBDb250YWluZXIgPSBjb25uZWN0KFxuICAgIHN0YXRlID0+ICh7XG4gICAgICAgIGhpc3Rvcnk6IHN0YXRlLmhpc3RvcnksXG4gICAgICAgIGNvbmZpZzogc3RhdGUuY29uZmlnXG4gICAgfSksXG4gICAgZGlzcGF0Y2ggPT4gKHtkaXNwYXRjaH0pXG4pKFVuY29ubmVjdGVkQXBwQ29udGFpbmVyKTtcblxuZXhwb3J0IGRlZmF1bHQgQXBwQ29udGFpbmVyO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuXG5pbXBvcnQgQXBwUHJvdmlkZXIgZnJvbSAnLi9BcHBQcm92aWRlci5yZWFjdCc7XG5cbmltcG9ydCAnLi9kYXNoQXBpJztcblxuY2xhc3MgRGFzaFJlbmRlcmVyIHtcbiAgICBjb25zdHJ1Y3Rvcihob29rcykge1xuICAgICAgICAvLyByZW5kZXIgRGFzaCBSZW5kZXJlciB1cG9uIGluaXRpYWxpc2luZyFcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlYWN0LWVudHJ5LXBvaW50Jyk7XG5cbiAgICAgICAgaWYgKFJlYWN0RE9NLmNyZWF0ZVJvb3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvb3QgPSBSZWFjdERPTS5jcmVhdGVSb290KGNvbnRhaW5lcik7XG4gICAgICAgICAgICByb290LnJlbmRlcig8QXBwUHJvdmlkZXIgaG9va3M9e2hvb2tzfSAvPik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBSZWFjdERPTS5yZW5kZXIoPEFwcFByb3ZpZGVyIGhvb2tzPXtob29rc30gLz4sIGNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB7RGFzaFJlbmRlcmVyfTtcbiIsImltcG9ydCB7bWVyZ2VEZWVwUmlnaHQsIG9uY2V9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7Z2V0Q1NSRkhlYWRlciwgaGFuZGxlQXN5bmNFcnJvciwgYWRkSHR0cEhlYWRlcnN9IGZyb20gJy4uL2FjdGlvbnMnO1xuaW1wb3J0IHt1cmxCYXNlfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7TUFYX0FVVEhfUkVUUklFU30gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtKV1RfRVhQSVJFRF9NRVNTQUdFLCBTVEFUVVN9IGZyb20gJy4uL2NvbnN0YW50cy9jb25zdGFudHMnO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAqL1xuY29uc3QgbG9nV2FybmluZ09uY2UgPSBvbmNlKGNvbnNvbGUud2Fybik7XG5cbmZ1bmN0aW9uIEdFVChwYXRoLCBmZXRjaENvbmZpZywgX2JvZHksIGNvbmZpZykge1xuICAgIHJldHVybiBmZXRjaChcbiAgICAgICAgcGF0aCxcbiAgICAgICAgbWVyZ2VEZWVwUmlnaHQoZmV0Y2hDb25maWcsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiBnZXRDU1JGSGVhZGVyKGNvbmZpZylcbiAgICAgICAgfSlcbiAgICApO1xufVxuXG5mdW5jdGlvbiBQT1NUKHBhdGgsIGZldGNoQ29uZmlnLCBib2R5ID0ge30sIGNvbmZpZykge1xuICAgIHJldHVybiBmZXRjaChcbiAgICAgICAgcGF0aCxcbiAgICAgICAgbWVyZ2VEZWVwUmlnaHQoZmV0Y2hDb25maWcsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogZ2V0Q1NSRkhlYWRlcihjb25maWcpLFxuICAgICAgICAgICAgYm9keTogYm9keSA/IEpTT04uc3RyaW5naWZ5KGJvZHkpIDogbnVsbFxuICAgICAgICB9KVxuICAgICk7XG59XG5cbmNvbnN0IHJlcXVlc3QgPSB7R0VULCBQT1NUfTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXBpVGh1bmsoZW5kcG9pbnQsIG1ldGhvZCwgc3RvcmUsIGlkLCBib2R5KSB7XG4gICAgcmV0dXJuIGFzeW5jIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICAgICAgbGV0IHtjb25maWcsIGhvb2tzfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGxldCBuZXdIZWFkZXJzID0gbnVsbDtcblxuICAgICAgICBjb25zdCB1cmwgPSBgJHt1cmxCYXNlKGNvbmZpZyl9JHtlbmRwb2ludH1gO1xuXG4gICAgICAgIGZ1bmN0aW9uIHNldENvbm5lY3Rpb25TdGF0dXMoY29ubmVjdGVkKSB7XG4gICAgICAgICAgICBpZiAoZ2V0U3RhdGUoKS5lcnJvci5iYWNrRW5kQ29ubmVjdGVkICE9PSBjb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTRVRfQ09OTkVDVElPTl9TVEFUVVMnLFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBjb25uZWN0ZWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6IHN0b3JlLFxuICAgICAgICAgICAgcGF5bG9hZDoge2lkLCBzdGF0dXM6ICdsb2FkaW5nJ31cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXM7XG4gICAgICAgICAgICBmb3IgKGxldCByZXRyeSA9IDA7IHJldHJ5IDw9IE1BWF9BVVRIX1JFVFJJRVM7IHJldHJ5KyspIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXMgPSBhd2FpdCByZXF1ZXN0W21ldGhvZF0oXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZmV0Y2gsXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmZXRjaCByZWplY3Rpb24gLSB0aGlzIG1lYW5zIHRoZSByZXF1ZXN0IGRpZG4ndCByZXR1cm4sXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGdldCBoZXJlIGZyb20gNDAwLzUwMCBlcnJvcnMsIG9ubHkgbmV0d29ya1xuICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcnMgb3IgdW5yZXNwb25zaXZlIHNlcnZlcnMuXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmZXRjaCBlcnJvcicsIHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIHNldENvbm5lY3Rpb25TdGF0dXMoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICByZXMuc3RhdHVzID09PSBTVEFUVVMuVU5BVVRIT1JJWkVEIHx8XG4gICAgICAgICAgICAgICAgICAgIHJlcy5zdGF0dXMgPT09IFNUQVRVUy5CQURfUkVRVUVTVFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaG9va3MucmVxdWVzdF9yZWZyZXNoX2p3dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm9keS5pbmNsdWRlcyhKV1RfRVhQSVJFRF9NRVNTQUdFKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0p3dCA9IGF3YWl0IGhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mZXRjaC5oZWFkZXJzLkF1dGhvcml6YXRpb24uc3Vic3RyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JlYXJlciAnLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Snd0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYWRlcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bmV3Snd0fWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBtZXJnZURlZXBSaWdodChjb25maWcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogbmV3SGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcblxuICAgICAgICAgICAgaWYgKG5ld0hlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChhZGRIdHRwSGVhZGVycyhuZXdIZWFkZXJzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRDb25uZWN0aW9uU3RhdHVzKHRydWUpO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlICYmIGNvbnRlbnRUeXBlLmluZGV4T2YoJ2FwcGxpY2F0aW9uL2pzb24nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKS50aGVuKGpzb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzdG9yZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlcy5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDoganNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgICAgICAgIGxvZ1dhcm5pbmdPbmNlKFxuICAgICAgICAgICAgICAgICdSZXNwb25zZSBpcyBtaXNzaW5nIGhlYWRlcjogY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogc3RvcmUsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXMuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdFcnJvciBmcm9tIEFQSSBjYWxsOiAnICsgZW5kcG9pbnQ7XG4gICAgICAgICAgICBoYW5kbGVBc3luY0Vycm9yKGVyciwgbWVzc2FnZSwgZGlzcGF0Y2gpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbiIsImNvbnN0IGFjdGlvbkxpc3QgPSB7XG4gICAgT05fUFJPUF9DSEFOR0U6IDEsXG4gICAgU0VUX1JFUVVFU1RfUVVFVUU6IDEsXG4gICAgU0VUX0dSQVBIUzogMSxcbiAgICBTRVRfUEFUSFM6IDEsXG4gICAgU0VUX0xBWU9VVDogMSxcbiAgICBTRVRfQVBQX0xJRkVDWUNMRTogMSxcbiAgICBTRVRfQ09ORklHOiAxLFxuICAgIEFERF9IVFRQX0hFQURFUlM6IDEsXG4gICAgT05fRVJST1I6IDEsXG4gICAgU0VUX0hPT0tTOiAxLFxuICAgIElOU0VSVF9DT01QT05FTlQ6IDEsXG4gICAgUkVNT1ZFX0NPTVBPTkVOVDogMSxcbiAgICBSRVNFVF9DT01QT05FTlRfU1RBVEU6IDFcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBY3Rpb24gPSBhY3Rpb24gPT4ge1xuICAgIGlmIChhY3Rpb25MaXN0W2FjdGlvbl0pIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2FjdGlvbn0gaXMgbm90IGRlZmluZWQuYCk7XG59O1xuXG5leHBvcnQgY29uc3QgTUFYX0FVVEhfUkVUUklFUyA9IDE7XG4iLCJpbXBvcnQge0RlcEdyYXBofSBmcm9tICdkZXBlbmRlbmN5LWdyYXBoJztcbmltcG9ydCBpc051bWVyaWMgZnJvbSAnZmFzdC1pc251bWVyaWMnO1xuaW1wb3J0IHtcbiAgICBhbGwsXG4gICAgYW55LFxuICAgIGFwLFxuICAgIGFzc29jLFxuICAgIGNvbmNhdCxcbiAgICBkaWZmZXJlbmNlLFxuICAgIGVxdWFscyxcbiAgICBldm9sdmUsXG4gICAgZmluZEluZGV4LFxuICAgIGZsYXR0ZW4sXG4gICAgZm9yRWFjaE9iakluZGV4ZWQsXG4gICAgaW5jbHVkZXMsXG4gICAgaW50ZXJzZWN0aW9uLFxuICAgIGlzRW1wdHksXG4gICAga2V5cyxcbiAgICBtYXAsXG4gICAgbWVyZ2VSaWdodCxcbiAgICBwYXRoLFxuICAgIHBsdWNrLFxuICAgIHByb3BzLFxuICAgIHN0YXJ0c1dpdGgsXG4gICAgdmFsdWVzLFxuICAgIHppcCxcbiAgICB6aXBPYmpcbn0gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge1xuICAgIGNvbWJpbmVJZEFuZFByb3AsXG4gICAgZ2V0Q2FsbGJhY2tzQnlJbnB1dCxcbiAgICBnZXRQcmlvcml0eSxcbiAgICBJTkRJUkVDVCxcbiAgICBtZXJnZU1heCxcbiAgICBtYWtlUmVzb2x2ZWRDYWxsYmFjayxcbiAgICByZXNvbHZlRGVwc1xufSBmcm9tICcuL2RlcGVuZGVuY2llc190cyc7XG5pbXBvcnQge2NvbXB1dGVQYXRocywgZ2V0UGF0aH0gZnJvbSAnLi9wYXRocyc7XG5cbmltcG9ydCB7Y3Jhd2xMYXlvdXR9IGZyb20gJy4vdXRpbHMnO1xuXG5pbXBvcnQgUmVnaXN0cnkgZnJvbSAnLi4vcmVnaXN0cnknO1xuXG4vKlxuICogSWYgdGhpcyB1cGRhdGUgaXMgZm9yIG11bHRpcGxlIG91dHB1dHMsIHRoZW4gaXQgaGFzXG4gKiBzdGFydGluZyAmIHRyYWlsaW5nIGAuLmAgYW5kIGVhY2ggcHJvcElkIHBhaXIgaXMgc2VwYXJhdGVkXG4gKiBieSBgLi4uYCwgZS5nLlxuICogXCIuLm91dHB1dC0xLnZhbHVlLi4ub3V0cHV0LTIudmFsdWUuLi5vdXRwdXQtMy52YWx1ZS4uLm91dHB1dC00LnZhbHVlLi5cIlxuICovXG5leHBvcnQgY29uc3QgaXNNdWx0aU91dHB1dFByb3AgPSBpZEFuZFByb3AgPT4gaWRBbmRQcm9wLnN0YXJ0c1dpdGgoJy4uJyk7XG5cbmNvbnN0IEFMTCA9IHt3aWxkOiAnQUxMJywgbXVsdGk6IDF9O1xuY29uc3QgTUFUQ0ggPSB7d2lsZDogJ01BVENIJ307XG5jb25zdCBBTExTTUFMTEVSID0ge3dpbGQ6ICdBTExTTUFMTEVSJywgbXVsdGk6IDEsIGV4cGFuZDogMX07XG5jb25zdCB3aWxkY2FyZHMgPSB7QUxMLCBNQVRDSCwgQUxMU01BTExFUn07XG5jb25zdCBhbGxvd2VkV2lsZGNhcmRzID0ge1xuICAgIE91dHB1dDoge0FMTCwgTUFUQ0h9LFxuICAgIElucHV0OiB3aWxkY2FyZHMsXG4gICAgU3RhdGU6IHdpbGRjYXJkc1xufTtcbmNvbnN0IHdpbGRjYXJkVmFsVHlwZXMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddO1xuXG5jb25zdCBpZEludmFsaWRDaGFycyA9IFsnLicsICd7J107XG5cbi8qXG4gKiBJZiB0aGlzIElEIGlzIGEgd2lsZGNhcmQsIGl0IGlzIGEgc3RyaW5naWZpZWQgSlNPTiBvYmplY3RcbiAqIHRoZSBcIntcIiBjaGFyYWN0ZXIgaXMgZGlzYWxsb3dlZCBmcm9tIHJlZ3VsYXIgc3RyaW5nIElEc1xuICovXG5jb25zdCBpc1dpbGRjYXJkSWQgPSBpZFN0ciA9PiBpZFN0ci5zdGFydHNXaXRoKCd7Jyk7XG5cbi8qXG4gKiBUdXJuIHN0cmluZ2lmaWVkIHdpbGRjYXJkIElEcyBpbnRvIG9iamVjdHMuXG4gKiBXaWxkY2FyZHMgYXJlIGVuY29kZWQgYXMgc2luZ2xlLWl0ZW0gYXJyYXlzIGNvbnRhaW5pbmcgdGhlIHdpbGRjYXJkIG5hbWVcbiAqIGFzIGEgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBwYXJzZVdpbGRjYXJkSWQoaWRTdHIpIHtcbiAgICByZXR1cm4gbWFwKFxuICAgICAgICB2YWwgPT4gKEFycmF5LmlzQXJyYXkodmFsKSAmJiB3aWxkY2FyZHNbdmFsWzBdXSkgfHwgdmFsLFxuICAgICAgICBKU09OLnBhcnNlKGlkU3RyKVxuICAgICk7XG59XG5cbi8qXG4gKiBJZiB0aGlzIHVwZGF0ZSBpcyBmb3IgbXVsdGlwbGUgb3V0cHV0cywgdGhlbiBpdCBoYXNcbiAqIHN0YXJ0aW5nICYgdHJhaWxpbmcgYC4uYCBhbmQgZWFjaCBwcm9wSWQgcGFpciBpcyBzZXBhcmF0ZWRcbiAqIGJ5IGAuLi5gLCBlLmcuXG4gKiBcIi4ub3V0cHV0LTEudmFsdWUuLi5vdXRwdXQtMi52YWx1ZS4uLm91dHB1dC0zLnZhbHVlLi4ub3V0cHV0LTQudmFsdWUuLlwiXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTXVsdGlwbGVPdXRwdXRzKG91dHB1dElkQW5kUHJvcCkge1xuICAgIHJldHVybiBvdXRwdXRJZEFuZFByb3Auc3Vic3RyKDIsIG91dHB1dElkQW5kUHJvcC5sZW5ndGggLSA0KS5zcGxpdCgnLi4uJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdElkQW5kUHJvcChpZEFuZFByb3ApIHtcbiAgICAvLyBzaW5jZSB3aWxkY2FyZCBpZHMgY2FuIGhhdmUgLiBpbiB0aGVtIGJ1dCBwcm9wcyBjYW4ndCxcbiAgICAvLyBsb29rIGZvciB0aGUgbGFzdCAuIGluIHRoZSBzdHJpbmcgYW5kIHNwbGl0IHRoZXJlXG4gICAgY29uc3QgZG90UG9zID0gaWRBbmRQcm9wLmxhc3RJbmRleE9mKCcuJyk7XG4gICAgY29uc3QgaWRTdHIgPSBpZEFuZFByb3Auc3Vic3RyKDAsIGRvdFBvcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHBhcnNlSWZXaWxkY2FyZChpZFN0ciksXG4gICAgICAgIHByb3BlcnR5OiBpZEFuZFByb3Auc3Vic3RyKGRvdFBvcyArIDEpXG4gICAgfTtcbn1cblxuLypcbiAqIENoZWNrIGlmIHRoaXMgSUQgaXMgYSBzdHJpbmdpZmllZCBvYmplY3QsIGFuZCBpZiBzbyBwYXJzZSBpdCB0byB0aGF0IG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJZldpbGRjYXJkKGlkU3RyKSB7XG4gICAgcmV0dXJuIGlzV2lsZGNhcmRJZChpZFN0cikgPyBwYXJzZVdpbGRjYXJkSWQoaWRTdHIpIDogaWRTdHI7XG59XG5cbi8qXG4gKiBKU09OLnN0cmluZ2lmeSAtIGZvciB0aGUgb2JqZWN0IGZvcm0gLSBidXQgZW5zdXJpbmcga2V5cyBhcmUgc29ydGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlJZChpZCkge1xuICAgIGlmICh0eXBlb2YgaWQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gICAgY29uc3Qgc3RyaW5naWZ5VmFsID0gdiA9PiAodiAmJiB2LndpbGQpIHx8IEpTT04uc3RyaW5naWZ5KHYpO1xuICAgIGNvbnN0IHBhcnRzID0gT2JqZWN0LmtleXMoaWQpXG4gICAgICAgIC5zb3J0KClcbiAgICAgICAgLm1hcChrID0+IEpTT04uc3RyaW5naWZ5KGspICsgJzonICsgc3RyaW5naWZ5VmFsKGlkW2tdKSk7XG4gICAgcmV0dXJuICd7JyArIHBhcnRzLmpvaW4oJywnKSArICd9Jztcbn1cblxuLypcbiAqIGlkIGRpY3QgdmFsdWVzIGNhbiBiZSBudW1iZXJzLCBzdHJpbmdzLCBhbmQgYm9vbGVhbnMuXG4gKiBXZSBuZWVkIGEgZGVmaW5pdGUgb3JkZXJpbmcgdGhhdCB3aWxsIHdvcmsgYWNyb3NzIHR5cGVzLFxuICogZXZlbiBpZiBzYW5lIHVzZXJzIHdvdWxkIG5vdCBtaXggdHlwZXMuXG4gKiAtIG51bWVyaWMgc3RyaW5ncyBhcmUgdHJlYXRlZCBhcyBudW1iZXJzXG4gKiAtIGJvb2xlYW5zIGNvbWUgYWZ0ZXIgbnVtYmVycywgYmVmb3JlIHN0cmluZ3MuIGZhbHNlLCB0aGVuIHRydWUuXG4gKiAtIG5vbi1udW1lcmljIHN0cmluZ3MgY29tZSBsYXN0XG4gKi9cbmZ1bmN0aW9uIGlkVmFsU29ydChhLCBiKSB7XG4gICAgY29uc3QgYklzTnVtZXJpYyA9IGlzTnVtZXJpYyhiKTtcbiAgICBpZiAoaXNOdW1lcmljKGEpKSB7XG4gICAgICAgIGlmIChiSXNOdW1lcmljKSB7XG4gICAgICAgICAgICBjb25zdCBhTiA9IE51bWJlcihhKTtcbiAgICAgICAgICAgIGNvbnN0IGJOID0gTnVtYmVyKGIpO1xuICAgICAgICAgICAgcmV0dXJuIGFOID4gYk4gPyAxIDogYU4gPCBiTiA/IC0xIDogMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGlmIChiSXNOdW1lcmljKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBjb25zdCBhSXNCb29sID0gdHlwZW9mIGEgPT09ICdib29sZWFuJztcbiAgICBpZiAoYUlzQm9vbCAhPT0gKHR5cGVvZiBiID09PSAnYm9vbGVhbicpKSB7XG4gICAgICAgIHJldHVybiBhSXNCb29sID8gLTEgOiAxO1xuICAgIH1cbiAgICByZXR1cm4gYSA+IGIgPyAxIDogYSA8IGIgPyAtMSA6IDA7XG59XG5cbi8qXG4gKiBQcm92aWRlIGEgdmFsdWUga25vd24gdG8gYmUgYmVmb3JlIG9yIGFmdGVyIHYsIGFjY29yZGluZyB0byBpZFZhbFNvcnRcbiAqL1xuY29uc3QgdmFsQmVmb3JlID0gdiA9PiAoaXNOdW1lcmljKHYpID8gdiAtIDEgOiAwKTtcbmNvbnN0IHZhbEFmdGVyID0gdiA9PiAodHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiArICd6JyA6ICd6Jyk7XG5cbmZ1bmN0aW9uIGFkZE1hcChkZXBNYXAsIGlkLCBwcm9wLCBkZXBlbmRlbmN5KSB7XG4gICAgY29uc3QgaWRNYXAgPSAoZGVwTWFwW2lkXSA9IGRlcE1hcFtpZF0gfHwge30pO1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IChpZE1hcFtwcm9wXSA9IGlkTWFwW3Byb3BdIHx8IFtdKTtcbiAgICBjYWxsYmFja3MucHVzaChkZXBlbmRlbmN5KTtcbn1cblxuLy8gUGF0dGVybnMgYXJlIHN0b3JlZCBpbiBhIG5lc3RlZCBNYXAgc3RydWN0dXJlIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZlxuLy8gc3RyaW5naWZ5aW5nIGlkcyBmb3IgZXZlcnkgY2FsbGJhY2suXG5mdW5jdGlvbiBhZGRQYXR0ZXJuKHBhdHRlcm5zLCBpZFNwZWMsIHByb3AsIGRlcGVuZGVuY3kpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaWRTcGVjKS5zb3J0KCk7XG4gICAgY29uc3Qga2V5U3RyID0ga2V5cy5qb2luKCcsJyk7XG4gICAgY29uc3QgdmFsdWVzID0gcHJvcHMoa2V5cywgaWRTcGVjKTtcbiAgICBjb25zdCB2YWx1ZXNLZXkgPSB2YWx1ZXNcbiAgICAgICAgLm1hcCh2ID0+XG4gICAgICAgICAgICB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gdi53aWxkXG4gICAgICAgICAgICAgICAgICAgID8gdi53aWxkXG4gICAgICAgICAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkodilcbiAgICAgICAgICAgICAgICA6IFN0cmluZyh2KVxuICAgICAgICApXG4gICAgICAgIC5qb2luKCd8Jyk7XG5cbiAgICBpZiAoIXBhdHRlcm5zLmhhcyhrZXlTdHIpKSB7XG4gICAgICAgIHBhdHRlcm5zLnNldChrZXlTdHIsIG5ldyBNYXAoKSk7XG4gICAgfVxuICAgIGNvbnN0IHByb3BNYXAgPSBwYXR0ZXJucy5nZXQoa2V5U3RyKTtcbiAgICBpZiAoIXByb3BNYXAuaGFzKHByb3ApKSB7XG4gICAgICAgIHByb3BNYXAuc2V0KHByb3AsIG5ldyBNYXAoKSk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlTWFwID0gcHJvcE1hcC5nZXQocHJvcCk7XG5cbiAgICBsZXQgdmFsTWF0Y2ggPSB2YWx1ZU1hcC5nZXQodmFsdWVzS2V5KTtcbiAgICBpZiAoIXZhbE1hdGNoKSB7XG4gICAgICAgIHZhbE1hdGNoID0ge2tleXMsIHZhbHVlcywgY2FsbGJhY2tzOiBbXX07XG4gICAgICAgIHZhbHVlTWFwLnNldCh2YWx1ZXNLZXksIHZhbE1hdGNoKTtcbiAgICB9XG4gICAgdmFsTWF0Y2guY2FsbGJhY2tzLnB1c2goZGVwZW5kZW5jeSk7XG59XG5cbi8vIENvbnZlcnQgdGhlIG5lc3RlZCBNYXAgc3RydWN0dXJlIG9mIHBhdHRlcm5zIGludG8gdGhlIHBsYWluIG5lc3RlZCBvYmplY3Qgc3RydWN0dXJlXG4vLyBleHBlY3RlZCBieSB0aGUgcmVzdCBvZiB0aGUgY29kZSwgd2l0aCBzdHJpbmdpZmllZCBpZCBrZXlzLlxuLy8gVGhpcyBpcyBvbmx5IGRvbmUgb25jZSBwZXIgcGF0dGVybiwgYXQgdGhlIGVuZCBvZiBncmFwaCBjb25zdHJ1Y3Rpb24sXG4vLyB0byBtaW5pbWl6ZSB0aGUgb3ZlcmhlYWQgb2Ygc3RyaW5naWZ5aW5nIGlkcy5cbmZ1bmN0aW9uIG9mZmxvYWRQYXR0ZXJucyhwYXR0ZXJuc01hcCwgdGFyZ2V0TWFwKSB7XG4gICAgZm9yIChjb25zdCBba2V5U3RyLCBwcm9wTWFwXSBvZiBwYXR0ZXJuc01hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgdGFyZ2V0TWFwW2tleVN0cl0gPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbcHJvcCwgdmFsdWVNYXBdIG9mIHByb3BNYXAuZW50cmllcygpKSB7XG4gICAgICAgICAgICB0YXJnZXRNYXBba2V5U3RyXVtwcm9wXSA9IEFycmF5LmZyb20odmFsdWVNYXAudmFsdWVzKCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZURlcGVuZGVuY2llcyhwYXJzZWREZXBlbmRlbmNpZXMsIGRpc3BhdGNoRXJyb3IpIHtcbiAgICBjb25zdCBvdXRTdHJzID0ge307XG4gICAgY29uc3Qgb3V0T2JqcyA9IFtdO1xuXG4gICAgcGFyc2VkRGVwZW5kZW5jaWVzLmZvckVhY2goZGVwID0+IHtcbiAgICAgICAgY29uc3Qge2lucHV0cywgb3V0cHV0cywgc3RhdGV9ID0gZGVwO1xuICAgICAgICBsZXQgaGFzT3V0cHV0cyA9IHRydWU7XG4gICAgICAgIGlmIChvdXRwdXRzLmxlbmd0aCA9PT0gMSAmJiAhb3V0cHV0c1swXS5pZCAmJiAhb3V0cHV0c1swXS5wcm9wZXJ0eSkge1xuICAgICAgICAgICAgaGFzT3V0cHV0cyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGVhZCA9XG4gICAgICAgICAgICAnSW4gdGhlIGNhbGxiYWNrIGZvciBvdXRwdXQocyk6XFxuICAnICtcbiAgICAgICAgICAgIG91dHB1dHMubWFwKGNvbWJpbmVJZEFuZFByb3ApLmpvaW4oJ1xcbiAgJyk7XG5cbiAgICAgICAgaWYgKCFpbnB1dHMubGVuZ3RoICYmIGRlcC5wcmV2ZW50X2luaXRpYWxfY2FsbCkge1xuICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignQSBjYWxsYmFjayBpcyBtaXNzaW5nIElucHV0cycsIFtcbiAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgICd0aGVyZSBhcmUgbm8gYElucHV0YCBlbGVtZW50cy4nLFxuICAgICAgICAgICAgICAgICdXaXRob3V0IGBJbnB1dGAgZWxlbWVudHMsIGl0IHdpbGwgbmV2ZXIgZ2V0IGNhbGxlZC4nLFxuICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICdTdWJzY3JpYmluZyB0byBgSW5wdXRgIGNvbXBvbmVudHMgd2lsbCBjYXVzZSB0aGUnLFxuICAgICAgICAgICAgICAgICdjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlaXIgdmFsdWVzIGNoYW5nZS4nLFxuICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICdJZiB5b3Ugd2FudCBhIGNhbGxiYWNrIHdpdGhvdXQgaW5wdXRzIHRoYXQgZmlyZXMgb24gaW5pdGlhbCBsb2FkLCcsXG4gICAgICAgICAgICAgICAgJ3NldCBwcmV2ZW50X2luaXRpYWxfY2FsbD1GYWxzZS4nXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwZWMgPSBbXG4gICAgICAgICAgICBbb3V0cHV0cywgJ091dHB1dCddLFxuICAgICAgICAgICAgW2lucHV0cywgJ0lucHV0J10sXG4gICAgICAgICAgICBbc3RhdGUsICdTdGF0ZSddXG4gICAgICAgIF07XG4gICAgICAgIHNwZWMuZm9yRWFjaCgoW2FyZ3MsIGNsc10pID0+IHtcbiAgICAgICAgICAgIGlmIChjbHMgPT09ICdPdXRwdXQnICYmICFoYXNPdXRwdXRzKSB7XG4gICAgICAgICAgICAgICAgLy8ganVzdCBhIHF1aXJrIG9mIGhvdyB3ZSBwYXNzICYgcGFyc2Ugb3V0cHV0cyAtIGlmIHlvdSBkb24ndFxuICAgICAgICAgICAgICAgIC8vIHByb3ZpZGUgb25lLCBpdCBsb29rcyBsaWtlIGEgc2luZ2xlIGJsYW5rIG91dHB1dC4gVGhpcyBpc1xuICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IHVzZWZ1bCBmb3IgZ3JhY2VmdWwgZmFpbHVyZSwgc28gd2Ugd29yayBhcm91bmQgaXQuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJncykpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKGBDYWxsYmFjayAke2Nsc30ocykgbXVzdCBiZSBhbiBBcnJheWAsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYEZvciAke2Nsc30ocykgd2UgZm91bmQ6YCxcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoYXJncyksXG4gICAgICAgICAgICAgICAgICAgICdidXQgd2UgZXhwZWN0ZWQgYW4gQXJyYXkuJ1xuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXJncy5mb3JFYWNoKChpZFByb3AsIGkpID0+IHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUFyZyhpZFByb3AsIGhlYWQsIGNscywgaSwgZGlzcGF0Y2hFcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGhhc091dHB1dHMpIHtcbiAgICAgICAgICAgIGZpbmREdXBsaWNhdGVPdXRwdXRzKFxuICAgICAgICAgICAgICAgIG91dHB1dHMsXG4gICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yLFxuICAgICAgICAgICAgICAgIG91dFN0cnMsXG4gICAgICAgICAgICAgICAgb3V0T2Jqc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZpbmRNaXNtYXRjaGVkV2lsZGNhcmRzKFxuICAgICAgICAgICAgICAgIG91dHB1dHMsXG4gICAgICAgICAgICAgICAgaW5wdXRzLFxuICAgICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvclxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFyZyh7aWQsIHByb3BlcnR5fSwgaGVhZCwgY2xzLCBpLCBkaXNwYXRjaEVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSAhPT0gJ3N0cmluZycgfHwgIXByb3BlcnR5KSB7XG4gICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIHByb3BlcnR5IGVycm9yJywgW1xuICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgIGAke2Nsc31bJHtpfV0ucHJvcGVydHkgPSAke0pTT04uc3RyaW5naWZ5KHByb3BlcnR5KX1gLFxuICAgICAgICAgICAgJ2J1dCB3ZSBleHBlY3RlZCBgcHJvcGVydHlgIHRvIGJlIGEgbm9uLWVtcHR5IHN0cmluZy4nXG4gICAgICAgIF0pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChpc0VtcHR5KGlkKSkge1xuICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignQ2FsbGJhY2sgaXRlbSBtaXNzaW5nIElEJywgW1xuICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgYCR7Y2xzfVske2l9XS5pZCA9IHt9YCxcbiAgICAgICAgICAgICAgICAnRXZlcnkgaXRlbSBsaW5rZWQgdG8gYSBjYWxsYmFjayBuZWVkcyBhbiBJRCdcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yRWFjaE9iakluZGV4ZWQoKHYsIGspID0+IHtcbiAgICAgICAgICAgIGlmICghaykge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIHdpbGRjYXJkIElEIGVycm9yJywgW1xuICAgICAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgICAgICBgJHtjbHN9WyR7aX1dLmlkIGhhcyBrZXkgXCIke2t9XCJgLFxuICAgICAgICAgICAgICAgICAgICAnS2V5cyBtdXN0IGJlIG5vbi1lbXB0eSBzdHJpbmdzLidcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2LndpbGQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZFdpbGRjYXJkc1tjbHNdW3Yud2lsZF0gIT09IHYpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignQ2FsbGJhY2sgd2lsZGNhcmQgSUQgZXJyb3InLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7Y2xzfVske2l9XS5pZFtcIiR7a31cIl0gPSAke3Yud2lsZH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgYEFsbG93ZWQgd2lsZGNhcmRzIGZvciAke2Nsc31zIGFyZTpgLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5cyhhbGxvd2VkV2lsZGNhcmRzW2Nsc10pLmpvaW4oJywgJylcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICghaW5jbHVkZXModHlwZW9mIHYsIHdpbGRjYXJkVmFsVHlwZXMpKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignQ2FsbGJhY2sgd2lsZGNhcmQgSUQgZXJyb3InLCBbXG4gICAgICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWRbXCIke2t9XCJdID0gJHtKU09OLnN0cmluZ2lmeSh2KX1gLFxuICAgICAgICAgICAgICAgICAgICAnV2lsZGNhcmQgY2FsbGJhY2sgSUQgdmFsdWVzIG11c3QgYmUgZWl0aGVyIHdpbGRjYXJkcycsXG4gICAgICAgICAgICAgICAgICAgICdvciBjb25zdGFudHMgb2Ygb25lIG9mIHRoZXNlIHR5cGVzOicsXG4gICAgICAgICAgICAgICAgICAgIHdpbGRjYXJkVmFsVHlwZXMuam9pbignLCAnKVxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBpZCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIGl0ZW0gbWlzc2luZyBJRCcsIFtcbiAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWQgPSBcIiR7aWR9XCJgLFxuICAgICAgICAgICAgICAgICdFdmVyeSBpdGVtIGxpbmtlZCB0byBhIGNhbGxiYWNrIG5lZWRzIGFuIElEJ1xuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW52YWxpZENoYXJzID0gaWRJbnZhbGlkQ2hhcnMuZmlsdGVyKGMgPT4gaW5jbHVkZXMoYywgaWQpKTtcbiAgICAgICAgaWYgKGludmFsaWRDaGFycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIGludmFsaWQgSUQgc3RyaW5nJywgW1xuICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgYCR7Y2xzfVske2l9XS5pZCA9ICcke2lkfSdgLFxuICAgICAgICAgICAgICAgIGBjaGFyYWN0ZXJzICcke2ludmFsaWRDaGFycy5qb2luKFwiJywgJ1wiKX0nIGFyZSBub3QgYWxsb3dlZC5gXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIElEIHR5cGUgZXJyb3InLCBbXG4gICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgYCR7Y2xzfVske2l9XS5pZCA9ICR7SlNPTi5zdHJpbmdpZnkoaWQpfWAsXG4gICAgICAgICAgICAnSURzIG11c3QgYmUgc3RyaW5ncyBvciB3aWxkY2FyZC1jb21wYXRpYmxlIG9iamVjdHMuJ1xuICAgICAgICBdKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGZpbmREdXBsaWNhdGVPdXRwdXRzKG91dHB1dHMsIGhlYWQsIGRpc3BhdGNoRXJyb3IsIG91dFN0cnMsIG91dE9ianMpIHtcbiAgICBjb25zdCBuZXdPdXRwdXRTdHJzID0ge307XG4gICAgY29uc3QgbmV3T3V0cHV0T2JqcyA9IFtdO1xuICAgIG91dHB1dHMuZm9yRWFjaCgoe2lkLCBwcm9wZXJ0eX0sIGkpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IGNvbWJpbmVJZEFuZFByb3Aoe2lkLCBwcm9wZXJ0eX0pO1xuICAgICAgICAgICAgaWYgKG5ld091dHB1dFN0cnNbaWRQcm9wXSkge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0R1cGxpY2F0ZSBjYWxsYmFjayBPdXRwdXRzJywgW1xuICAgICAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgICAgICBgT3V0cHV0ICR7aX0gKCR7aWRQcm9wfSkgaXMgYWxyZWFkeSB1c2VkIGJ5IHRoaXMgY2FsbGJhY2suYFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRTdHJzW2lkUHJvcF0pIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdEdXBsaWNhdGUgY2FsbGJhY2sgb3V0cHV0cycsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYE91dHB1dCAke2l9ICgke2lkUHJvcH0pIGlzIGFscmVhZHkgaW4gdXNlLmAsXG4gICAgICAgICAgICAgICAgICAgICdUbyByZXNvbHZlIHRoaXMsIHNldCBgYWxsb3dfZHVwbGljYXRlPVRydWVgIG9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ2R1cGxpY2F0ZSBvdXRwdXRzLCBvciBjb21iaW5lIHRoZSBvdXRwdXRzIGludG8nLFxuICAgICAgICAgICAgICAgICAgICAnb25lIGNhbGxiYWNrIGZ1bmN0aW9uLCBkaXN0aW5ndWlzaGluZyB0aGUgdHJpZ2dlcicsXG4gICAgICAgICAgICAgICAgICAgICdieSB1c2luZyBgZGFzaC5jYWxsYmFja19jb250ZXh0YCBpZiBuZWNlc3NhcnkuJ1xuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdPdXRwdXRTdHJzW2lkUHJvcF0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaWRPYmogPSB7aWQsIHByb3BlcnR5fTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGZPdmVybGFwID0gd2lsZGNhcmRPdmVybGFwKGlkT2JqLCBuZXdPdXRwdXRPYmpzKTtcbiAgICAgICAgICAgIGNvbnN0IG90aGVyT3ZlcmxhcCA9IHNlbGZPdmVybGFwIHx8IHdpbGRjYXJkT3ZlcmxhcChpZE9iaiwgb3V0T2Jqcyk7XG4gICAgICAgICAgICBpZiAoc2VsZk92ZXJsYXAgfHwgb3RoZXJPdmVybGFwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRQcm9wID0gY29tYmluZUlkQW5kUHJvcChpZE9iaik7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRQcm9wMiA9IGNvbWJpbmVJZEFuZFByb3Aoc2VsZk92ZXJsYXAgfHwgb3RoZXJPdmVybGFwKTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdPdmVybGFwcGluZyB3aWxkY2FyZCBjYWxsYmFjayBvdXRwdXRzJywgW1xuICAgICAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgICAgICBgT3V0cHV0ICR7aX0gKCR7aWRQcm9wfSlgLFxuICAgICAgICAgICAgICAgICAgICBgb3ZlcmxhcHMgYW5vdGhlciBvdXRwdXQgKCR7aWRQcm9wMn0pYCxcbiAgICAgICAgICAgICAgICAgICAgYHVzZWQgaW4gJHtzZWxmT3ZlcmxhcCA/ICd0aGlzJyA6ICdhIGRpZmZlcmVudCd9IGNhbGxiYWNrLmBcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3T3V0cHV0T2Jqcy5wdXNoKGlkT2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGtleXMobmV3T3V0cHV0U3RycykuZm9yRWFjaChrID0+IHtcbiAgICAgICAgb3V0U3Ryc1trXSA9IDE7XG4gICAgfSk7XG4gICAgbmV3T3V0cHV0T2Jqcy5mb3JFYWNoKGlkT2JqID0+IHtcbiAgICAgICAgb3V0T2Jqcy5wdXNoKGlkT2JqKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY2hlY2tJbk91dE92ZXJsYXAob3V0LCBpbnB1dHMpIHtcbiAgICBjb25zdCB7aWQ6IG91dElkLCBwcm9wZXJ0eTogb3V0UHJvcH0gPSBvdXQ7XG4gICAgcmV0dXJuIGlucHV0cy5zb21lKGluXyA9PiB7XG4gICAgICAgIGNvbnN0IHtpZDogaW5JZCwgcHJvcGVydHk6IGluUHJvcH0gPSBpbl87XG4gICAgICAgIGlmIChvdXRQcm9wICE9PSBpblByb3AgfHwgdHlwZW9mIG91dElkICE9PSB0eXBlb2YgaW5JZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygb3V0SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAob3V0SWQgPT09IGluSWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh3aWxkY2FyZE92ZXJsYXAoaW5fLCBbb3V0XSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZmluZE1pc21hdGNoZWRXaWxkY2FyZHMob3V0cHV0cywgaW5wdXRzLCBzdGF0ZSwgaGVhZCwgZGlzcGF0Y2hFcnJvcikge1xuICAgIGNvbnN0IHttYXRjaEtleXM6IG91dDBNYXRjaEtleXN9ID0gZmluZFdpbGRjYXJkS2V5cyhcbiAgICAgICAgb3V0cHV0cy5sZW5ndGggPyBvdXRwdXRzWzBdLmlkIDogdW5kZWZpbmVkXG4gICAgKTtcbiAgICBvdXRwdXRzLmZvckVhY2goKG91dCwgaSkgPT4ge1xuICAgICAgICBpZiAoaSAmJiAhZXF1YWxzKGZpbmRXaWxkY2FyZEtleXMob3V0LmlkKS5tYXRjaEtleXMsIG91dDBNYXRjaEtleXMpKSB7XG4gICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdNaXNtYXRjaGVkIGBNQVRDSGAgd2lsZGNhcmRzIGFjcm9zcyBgT3V0cHV0YHMnLCBbXG4gICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICBgT3V0cHV0ICR7aX0gKCR7Y29tYmluZUlkQW5kUHJvcChvdXQpfSlgLFxuICAgICAgICAgICAgICAgICdkb2VzIG5vdCBoYXZlIE1BVENIIHdpbGRjYXJkcyBvbiB0aGUgc2FtZSBrZXlzIGFzJyxcbiAgICAgICAgICAgICAgICBgT3V0cHV0IDAgKCR7Y29tYmluZUlkQW5kUHJvcChvdXRwdXRzWzBdKX0pLmAsXG4gICAgICAgICAgICAgICAgJ01BVENIIHdpbGRjYXJkcyBtdXN0IGJlIG9uIHRoZSBzYW1lIGtleXMgZm9yIGFsbCBPdXRwdXRzLicsXG4gICAgICAgICAgICAgICAgJ0FMTCB3aWxkY2FyZHMgbmVlZCBub3QgbWF0Y2gsIG9ubHkgTUFUQ0guJ1xuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBXaGVuIHRoZSBPdXRwdXRzIGRvbid0IGNhcnJ5IGFueSBNQVRDSCBrZXlzIChmaXhlZC1pZCBvdXRwdXRzLCBub1xuICAgIC8vIG91dHB1dHMsIG9yIHdpbGRjYXJkIG91dHB1dHMgd2l0aCBvbmx5IEFMTCksIHRoZSBJbnB1dHMvU3RhdGUgbWF5IHVzZVxuICAgIC8vIE1BVENIIGZyZWVseSDigJQgZWFjaCBmaXJpbmcgaXMgaWRlbnRpZmllZCBieSB0aGUgdHJpZ2dlcmluZyBpbnB1dCdzXG4gICAgLy8gTUFUQ0ggdmFsdWVzLiBBTExTTUFMTEVSIHN0aWxsIHJlcXVpcmVzIGEgTUFUQ0ggcmVmZXJlbmNlLCBzbyB0aGF0XG4gICAgLy8gY2FzZSByZW1haW5zIGFuIGVycm9yLiBTZWUgaXNzdWUgIzI0NjIuXG4gICAgY29uc3Qgb3V0cHV0c0hhdmVNYXRjaCA9IG91dDBNYXRjaEtleXMubGVuZ3RoID4gMDtcbiAgICBbXG4gICAgICAgIFtpbnB1dHMsICdJbnB1dCddLFxuICAgICAgICBbc3RhdGUsICdTdGF0ZSddXG4gICAgXS5mb3JFYWNoKChbYXJncywgY2xzXSkgPT4ge1xuICAgICAgICBhcmdzLmZvckVhY2goKGFyZywgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge21hdGNoS2V5cywgYWxsc21hbGxlcktleXN9ID0gZmluZFdpbGRjYXJkS2V5cyhhcmcuaWQpO1xuICAgICAgICAgICAgY29uc3QgZGlmZktleXMgPSBvdXRwdXRzSGF2ZU1hdGNoXG4gICAgICAgICAgICAgICAgPyBtYXRjaEtleXMuY29uY2F0KGFsbHNtYWxsZXJLZXlzKVxuICAgICAgICAgICAgICAgIDogYWxsc21hbGxlcktleXM7XG4gICAgICAgICAgICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZShkaWZmS2V5cywgb3V0ME1hdGNoS2V5cyk7XG4gICAgICAgICAgICBpZiAoZGlmZi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBkaWZmLnNvcnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXREZXNjID0gb3V0cHV0cy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgPyBgT3V0cHV0IDAgKCR7Y29tYmluZUlkQW5kUHJvcChvdXRwdXRzWzBdKX0pYFxuICAgICAgICAgICAgICAgICAgICA6ICd0aGUgKGFic2VudCkgT3V0cHV0JztcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdgSW5wdXRgIC8gYFN0YXRlYCB3aWxkY2FyZHMgbm90IGluIGBPdXRwdXRgcycsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYCR7Y2xzfSAke2l9ICgke2NvbWJpbmVJZEFuZFByb3AoYXJnKX0pYCxcbiAgICAgICAgICAgICAgICAgICAgYGhhcyBNQVRDSCBvciBBTExTTUFMTEVSIG9uIGtleShzKSAke2RpZmYuam9pbignLCAnKX1gLFxuICAgICAgICAgICAgICAgICAgICBgd2hlcmUgJHtvdXREZXNjfWAsXG4gICAgICAgICAgICAgICAgICAgICdkb2VzIG5vdCBoYXZlIGEgTUFUQ0ggd2lsZGNhcmQuIElucHV0cyBhbmQgU3RhdGUgZG8gbm90JyxcbiAgICAgICAgICAgICAgICAgICAgJ25lZWQgZXZlcnkgTUFUQ0ggZnJvbSB0aGUgT3V0cHV0KHMpLCBidXQgQUxMU01BTExFUicsXG4gICAgICAgICAgICAgICAgICAgICdyZXF1aXJlcyBhIG1hdGNoaW5nIE1BVENIIGluIHRoZSBPdXRwdXQocyksIGFuZCB3aGVuJyxcbiAgICAgICAgICAgICAgICAgICAgJ3RoZSBPdXRwdXQocykgaGF2ZSBhbnkgTUFUQ0gsIElucHV0L1N0YXRlIE1BVENIIGtleXMnLFxuICAgICAgICAgICAgICAgICAgICAnbXVzdCBiZSBhIHN1YnNldCBvZiB0aGVtLidcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmNvbnN0IG1hdGNoV2lsZEtleXMgPSAoW2EsIGJdKSA9PiB7XG4gICAgY29uc3QgYVdpbGQgPSBhICYmIGEud2lsZDtcbiAgICBjb25zdCBiV2lsZCA9IGIgJiYgYi53aWxkO1xuICAgIGlmIChhV2lsZCAmJiBiV2lsZCkge1xuICAgICAgICAvLyBFdmVyeSB3aWxkY2FyZCBjb21iaW5hdGlvbiBvdmVybGFwcyBleGNlcHQgTUFUQ0g8LT5BTExTTUFMTEVSXG4gICAgICAgIHJldHVybiAhKFxuICAgICAgICAgICAgKGEgPT09IE1BVENIICYmIGIgPT09IEFMTFNNQUxMRVIpIHx8XG4gICAgICAgICAgICAoYSA9PT0gQUxMU01BTExFUiAmJiBiID09PSBNQVRDSClcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGEgPT09IGIgfHwgYVdpbGQgfHwgYldpbGQ7XG59O1xuXG5mdW5jdGlvbiB3aWxkY2FyZE92ZXJsYXAoe2lkLCBwcm9wZXJ0eX0sIG9ianMpIHtcbiAgICBjb25zdCBpZEtleXMgPSBrZXlzKGlkKS5zb3J0KCk7XG4gICAgY29uc3QgaWRWYWxzID0gcHJvcHMoaWRLZXlzLCBpZCk7XG4gICAgZm9yIChjb25zdCBvYmogb2Ygb2Jqcykge1xuICAgICAgICBjb25zdCB7aWQ6IGlkMiwgcHJvcGVydHk6IHByb3BlcnR5Mn0gPSBvYmo7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb3BlcnR5MiA9PT0gcHJvcGVydHkgJiZcbiAgICAgICAgICAgIHR5cGVvZiBpZDIgIT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICBlcXVhbHMoa2V5cyhpZDIpLnNvcnQoKSwgaWRLZXlzKSAmJlxuICAgICAgICAgICAgYWxsKG1hdGNoV2lsZEtleXMsIHppcChpZFZhbHMsIHByb3BzKGlkS2V5cywgaWQyKSkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNhbGxiYWNrc1RvTGF5b3V0KHN0YXRlXywgZGlzcGF0Y2hFcnJvcikge1xuICAgIGNvbnN0IHtjb25maWcsIGdyYXBocywgbGF5b3V0OiBsYXlvdXRfLCBwYXRoczogcGF0aHNffSA9IHN0YXRlXztcbiAgICBjb25zdCB2YWxpZGF0ZUlkcyA9ICFjb25maWcuc3VwcHJlc3NfY2FsbGJhY2tfZXhjZXB0aW9ucztcbiAgICBsZXQgbGF5b3V0LCBwYXRocztcbiAgICBpZiAodmFsaWRhdGVJZHMgJiYgY29uZmlnLnZhbGlkYXRpb25fbGF5b3V0KSB7XG4gICAgICAgIGxheW91dCA9IGNvbmZpZy52YWxpZGF0aW9uX2xheW91dDtcbiAgICAgICAgcGF0aHMgPSBjb21wdXRlUGF0aHMobGF5b3V0LCBbXSwgbnVsbCwgcGF0aHNfLmV2ZW50cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGF5b3V0ID0gbGF5b3V0XztcbiAgICAgICAgcGF0aHMgPSBwYXRoc187XG4gICAgfVxuICAgIGNvbnN0IHtvdXRwdXRNYXAsIGlucHV0TWFwLCBvdXRwdXRQYXR0ZXJucywgaW5wdXRQYXR0ZXJuc30gPSBncmFwaHM7XG5cbiAgICBmdW5jdGlvbiB0YWlsKGNhbGxiYWNrcykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgJ1RoaXMgSUQgd2FzIHVzZWQgaW4gdGhlIGNhbGxiYWNrKHMpIGZvciBPdXRwdXQocyk6XFxuICAnICtcbiAgICAgICAgICAgIGNhbGxiYWNrc1xuICAgICAgICAgICAgICAgIC5tYXAoKHtvdXRwdXRzfSkgPT4gb3V0cHV0cy5tYXAoY29tYmluZUlkQW5kUHJvcCkuam9pbignLCAnKSlcbiAgICAgICAgICAgICAgICAuam9pbignXFxuICAnKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1pc3NpbmdJZChpZCwgY2xzLCBjYWxsYmFja3MpIHtcbiAgICAgICAgZGlzcGF0Y2hFcnJvcignSUQgbm90IGZvdW5kIGluIGxheW91dCcsIFtcbiAgICAgICAgICAgIGBBdHRlbXB0aW5nIHRvIGNvbm5lY3QgYSBjYWxsYmFjayAke2Nsc30gaXRlbSB0byBjb21wb25lbnQ6YCxcbiAgICAgICAgICAgIGAgIFwiJHtzdHJpbmdpZnlJZChpZCl9XCJgLFxuICAgICAgICAgICAgJ2J1dCBubyBjb21wb25lbnRzIHdpdGggdGhhdCBpZCBleGlzdCBpbiB0aGUgbGF5b3V0LicsXG4gICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICdJZiB5b3UgYXJlIGFzc2lnbmluZyBjYWxsYmFja3MgdG8gY29tcG9uZW50cyB0aGF0IGFyZScsXG4gICAgICAgICAgICAnZ2VuZXJhdGVkIGJ5IG90aGVyIGNhbGxiYWNrcyAoYW5kIHRoZXJlZm9yZSBub3QgaW4gdGhlJyxcbiAgICAgICAgICAgICdpbml0aWFsIGxheW91dCksIHlvdSBjYW4gc3VwcHJlc3MgdGhpcyBleGNlcHRpb24gYnkgc2V0dGluZycsXG4gICAgICAgICAgICAnYHN1cHByZXNzX2NhbGxiYWNrX2V4Y2VwdGlvbnM9VHJ1ZWAuJyxcbiAgICAgICAgICAgIHRhaWwoY2FsbGJhY2tzKVxuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZVByb3AoaWQsIGlkUGF0aCwgcmF3UHJvcCwgY2xzLCBjYWxsYmFja3MpIHtcbiAgICAgICAgY29uc3QgcHJvcCA9IHJhd1Byb3Auc3BsaXQoJ0AnKVswXTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gcGF0aChpZFBhdGgsIGxheW91dCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBSZWdpc3RyeS5yZXNvbHZlKGNvbXBvbmVudCk7XG5cbiAgICAgICAgLy8gbm90ZTogRmxvdyBjb21wb25lbnRzIGRvIG5vdCBoYXZlIHByb3BUeXBlcywgc28gd2UgY2FuJ3QgdmFsaWRhdGUuXG4gICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQucHJvcFR5cGVzICYmICFlbGVtZW50LnByb3BUeXBlc1twcm9wXSkge1xuICAgICAgICAgICAgLy8gbG9vayBmb3Igd2lsZGNhcmQgcHJvcHMgKGllIGRhdGEtKiBldGMpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BOYW1lIGluIGVsZW1lbnQucHJvcFR5cGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IHByb3BOYW1lLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZS5jaGFyQXQobGFzdCkgPT09ICcqJyAmJlxuICAgICAgICAgICAgICAgICAgICBwcm9wLnN1YnN0cigwLCBsYXN0KSA9PT0gcHJvcE5hbWUuc3Vic3RyKDAsIGxhc3QpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7dHlwZSwgbmFtZXNwYWNlfSA9IGNvbXBvbmVudDtcbiAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0ludmFsaWQgcHJvcCBmb3IgdGhpcyBjb21wb25lbnQnLCBbXG4gICAgICAgICAgICAgICAgYFByb3BlcnR5IFwiJHtwcm9wfVwiIHdhcyB1c2VkIHdpdGggY29tcG9uZW50IElEOmAsXG4gICAgICAgICAgICAgICAgYCAgJHtKU09OLnN0cmluZ2lmeShpZCl9YCxcbiAgICAgICAgICAgICAgICBgaW4gb25lIG9mIHRoZSAke2Nsc30gaXRlbXMgb2YgYSBjYWxsYmFjay5gLFxuICAgICAgICAgICAgICAgIGBUaGlzIElEIGlzIGFzc2lnbmVkIHRvIGEgJHtuYW1lc3BhY2V9LiR7dHlwZX0gY29tcG9uZW50YCxcbiAgICAgICAgICAgICAgICAnaW4gdGhlIGxheW91dCwgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHByb3BlcnR5LicsXG4gICAgICAgICAgICAgICAgdGFpbChjYWxsYmFja3MpXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlSWRQYXR0ZXJuUHJvcChpZCwgcHJvcGVydHksIGNscywgY2FsbGJhY2tzKSB7XG4gICAgICAgIHJlc29sdmVEZXBzKCkocGF0aHMpKHtpZCwgcHJvcGVydHl9KS5mb3JFYWNoKGRlcCA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aWQ6IGlkUmVzb2x2ZWQsIHBhdGg6IGlkUGF0aH0gPSBkZXA7XG4gICAgICAgICAgICB2YWxpZGF0ZVByb3AoaWRSZXNvbHZlZCwgaWRQYXRoLCBwcm9wZXJ0eSwgY2xzLCBjYWxsYmFja3MpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBjYWxsYmFja0lkc0NoZWNrZWRGb3JTdGF0ZSA9IHt9O1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVTdGF0ZShjYWxsYmFjaykge1xuICAgICAgICBjb25zdCB7c3RhdGUsIG91dHB1dH0gPSBjYWxsYmFjaztcblxuICAgICAgICAvLyBlbnN1cmUgd2UgZG9uJ3QgY2hlY2sgdGhlIHNhbWUgY2FsbGJhY2sgZm9yIHN0YXRlIG11bHRpcGxlIHRpbWVzXG4gICAgICAgIGlmIChjYWxsYmFja0lkc0NoZWNrZWRGb3JTdGF0ZVtvdXRwdXRdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2tJZHNDaGVja2VkRm9yU3RhdGVbb3V0cHV0XSA9IDE7XG5cbiAgICAgICAgY29uc3QgY2xzID0gJ1N0YXRlJztcblxuICAgICAgICBzdGF0ZS5mb3JFYWNoKCh7aWQsIHByb3BlcnR5fSkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZFBhdGggPSBnZXRQYXRoKHBhdGhzLCBpZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFpZFBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlSWRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nSWQoaWQsIGNscywgW2NhbGxiYWNrXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVByb3AoaWQsIGlkUGF0aCwgcHJvcGVydHksIGNscywgW2NhbGxiYWNrXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gT25seSB2YWxpZGF0ZSBwcm9wcyBmb3IgU3RhdGUgb2JqZWN0IGlkcyB0aGF0IHdlIGRvbid0IG5lZWQgdG9cbiAgICAgICAgICAgIC8vIHJlc29sdmUgdGhlbSB0byBzcGVjaWZpYyBpbnB1dHMgb3Igb3V0cHV0c1xuICAgICAgICAgICAgZWxzZSBpZiAoIWludGVyc2VjdGlvbihbTUFUQ0gsIEFMTFNNQUxMRVJdLCB2YWx1ZXMoaWQpKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUlkUGF0dGVyblByb3AoaWQsIHByb3BlcnR5LCBjbHMsIFtjYWxsYmFja10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZU1hcChtYXAsIGNscywgZG9TdGF0ZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIG1hcCkge1xuICAgICAgICAgICAgY29uc3QgaWRQcm9wcyA9IG1hcFtpZF07XG4gICAgICAgICAgICBjb25zdCBmY2IgPSBmbGF0dGVuKHZhbHVlcyhpZFByb3BzKSk7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25hbCA9IGZjYi5yZWR1Y2UoKGFjYywgY2IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYWNjID09PSBmYWxzZSB8fCBjYi5vcHRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBkZXBzID0gY29uY2F0KGNiLm91dHB1dHMsIGNiLmlucHV0cywgY2Iuc3RhdGVzKS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIGRlcCA9PiBkZXAuaWQgPT09IGlkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAhZGVwcy5sZW5ndGggfHxcbiAgICAgICAgICAgICAgICAgICAgYWxsKCh7YWxsb3dfb3B0aW9uYWx9KSA9PiBhbGxvd19vcHRpb25hbCwgZGVwcylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAob3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkUGF0aCA9IGdldFBhdGgocGF0aHMsIGlkKTtcbiAgICAgICAgICAgIGlmICghaWRQYXRoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlSWRzKSB7XG4gICAgICAgICAgICAgICAgICAgIG1pc3NpbmdJZChpZCwgY2xzLCBmY2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBpZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IGlkUHJvcHNbcHJvcGVydHldO1xuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVByb3AoaWQsIGlkUGF0aCwgcHJvcGVydHksIGNscywgY2FsbGJhY2tzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0IHdvdWxkIGJlIHJlZHVuZGFudCB0byBjaGVjayBzdGF0ZSBvbiBib3RoIGlucHV0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG91dHB1dHMgLSBzbyBvbmx5IHNldCBkb1N0YXRlIGZvciBvdXRwdXRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmZvckVhY2godmFsaWRhdGVTdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YWxpZGF0ZU1hcChvdXRwdXRNYXAsICdPdXRwdXQnLCB0cnVlKTtcbiAgICB2YWxpZGF0ZU1hcChpbnB1dE1hcCwgJ0lucHV0Jyk7XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZVBhdHRlcm5zKHBhdHRlcm5zLCBjbHMsIGRvU3RhdGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXlTdHIgaW4gcGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleVBhdHRlcm5zID0gcGF0dGVybnNba2V5U3RyXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4ga2V5UGF0dGVybnMpIHtcbiAgICAgICAgICAgICAgICBrZXlQYXR0ZXJuc1twcm9wZXJ0eV0uZm9yRWFjaCgoe2tleXMsIHZhbHVlcywgY2FsbGJhY2tzfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHppcE9iaihrZXlzLCB2YWx1ZXMpO1xuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUlkUGF0dGVyblByb3AoaWQsIHByb3BlcnR5LCBjbHMsIGNhbGxiYWNrcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb1N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuZm9yRWFjaCh2YWxpZGF0ZVN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQYXR0ZXJucyhvdXRwdXRQYXR0ZXJucywgJ091dHB1dCcsIHRydWUpO1xuICAgIHZhbGlkYXRlUGF0dGVybnMoaW5wdXRQYXR0ZXJucywgJ0lucHV0Jyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlR3JhcGhzKGRlcGVuZGVuY2llcywgZGlzcGF0Y2hFcnJvciwgY29uZmlnKSB7XG4gICAgLy8gbXVsdGlHcmFwaCBpcyBqdXN0IGZvciBmaW5kaW5nIGNpcmN1bGFyIGRlcHNcbiAgICBjb25zdCBtdWx0aUdyYXBoID0gbmV3IERlcEdyYXBoKCk7XG4gICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgIGNvbnN0IHdpbGRjYXJkUGxhY2Vob2xkZXJzID0ge307XG5cbiAgICBjb25zdCBmaXhJZHMgPSBtYXAoZXZvbHZlKHtpZDogcGFyc2VJZldpbGRjYXJkfSkpO1xuICAgIGNvbnN0IHBhcnNlZERlcGVuZGVuY2llcyA9IG1hcChkZXAgPT4ge1xuICAgICAgICBjb25zdCB7b3V0cHV0LCBub19vdXRwdXR9ID0gZGVwO1xuICAgICAgICBjb25zdCBvdXQgPSBldm9sdmUoe2lucHV0czogZml4SWRzLCBzdGF0ZTogZml4SWRzfSwgZGVwKTtcbiAgICAgICAgaWYgKG5vX291dHB1dCkge1xuICAgICAgICAgICAgLy8gTm8gb3V0cHV0IGNhc2VcbiAgICAgICAgICAgIG91dC5vdXRwdXRzID0gW107XG4gICAgICAgICAgICBvdXQubm9PdXRwdXQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0Lm91dHB1dHMgPSBtYXAoXG4gICAgICAgICAgICAgICAgb3V0aSA9PiBhc3NvYygnb3V0JywgdHJ1ZSwgc3BsaXRJZEFuZFByb3Aob3V0aSkpLFxuICAgICAgICAgICAgICAgIGlzTXVsdGlPdXRwdXRQcm9wKG91dHB1dClcbiAgICAgICAgICAgICAgICAgICAgPyBwYXJzZU11bHRpcGxlT3V0cHV0cyhvdXRwdXQpXG4gICAgICAgICAgICAgICAgICAgIDogW291dHB1dF1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH0sIGRlcGVuZGVuY2llcyk7XG5cbiAgICBsZXQgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICBjb25zdCB3cmFwcGVkREUgPSAobWVzc2FnZSwgbGluZXMpID0+IHtcbiAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICBkaXNwYXRjaEVycm9yKG1lc3NhZ2UsIGxpbmVzKTtcbiAgICB9O1xuICAgIGlmIChjb25maWcudmFsaWRhdGVfY2FsbGJhY2tzKSB7XG4gICAgICAgIHZhbGlkYXRlRGVwZW5kZW5jaWVzKHBhcnNlZERlcGVuZGVuY2llcywgd3JhcHBlZERFKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEZvciByZWd1bGFyIGlkcywgb3V0cHV0TWFwIGFuZCBpbnB1dE1hcCBhcmU6XG4gICAgICogICB7W2lkXToge1twcm9wXTogW2NhbGxiYWNrLCAuLi5dfX1cbiAgICAgKiB3aGVyZSBjYWxsYmFja3MgYXJlIHRoZSBtYXRjaGluZyBzcGVjcyBmcm9tIHRoZSBvcmlnaW5hbFxuICAgICAqIGRlcGVuZGVuY2llc1JlcXVlc3QsIGJ1dCB3aXRoIG91dHB1dHMgcGFyc2VkIHRvIGxvb2sgbGlrZSBpbnB1dHMsXG4gICAgICogYW5kIGEgbGlzdCBtYXRjaEtleXMgYWRkZWQgaWYgdGhlIG91dHB1dHMgaGF2ZSBNQVRDSCB3aWxkY2FyZHMuXG4gICAgICogRm9yIG91dHB1dE1hcCB0aGVyZSBzaG91bGQgb25seSBldmVyIGJlIG9uZSBjYWxsYmFjayBwZXIgaWQvcHJvcFxuICAgICAqIGJ1dCBmb3IgaW5wdXRNYXAgdGhlcmUgbWF5IGJlIG1hbnkuXG4gICAgICpcbiAgICAgKiBGb3Igd2lsZGNhcmQgaWRzLCBvdXRwdXRQYXR0ZXJucyBhbmQgaW5wdXRQYXR0ZXJucyBhcmU6XG4gICAgICogICB7XG4gICAgICogICAgICAgW2tleXN0cl06IHtcbiAgICAgKiAgICAgICAgICAgW3Byb3BdOiBbXG4gICAgICogICAgICAgICAgICAgICB7a2V5czogWy4uLl0sIHZhbHVlczogWy4uLl0sIGNhbGxiYWNrczogW2NhbGxiYWNrLCAuLi5dfSxcbiAgICAgKiAgICAgICAgICAgICAgIHsuLi59XG4gICAgICogICAgICAgICAgIF1cbiAgICAgKiAgICAgICB9XG4gICAgICogICB9XG4gICAgICoga2V5c3RyIGlzIGEgc3RyaW5naWZpZWQgb3JkZXJlZCBsaXN0IG9mIGtleXMgaW4gdGhlIGlkXG4gICAgICoga2V5cyBpcyB0aGUgc2FtZSBvcmRlcmVkIGxpc3QgKGp1c3QgY29waWVkIGZvciBjb252ZW5pZW5jZSlcbiAgICAgKiB2YWx1ZXMgaXMgYW4gYXJyYXkgb2YgZXhwbGljaXQgb3Igd2lsZGNhcmQgdmFsdWVzIGZvciBlYWNoIGtleSBpbiBrZXlzXG4gICAgICovXG4gICAgY29uc3Qgb3V0cHV0TWFwID0ge307XG4gICAgY29uc3QgaW5wdXRNYXAgPSB7fTtcbiAgICBjb25zdCBvdXRwdXRQYXR0ZXJuTWFwID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGlucHV0UGF0dGVybk1hcCA9IG5ldyBNYXAoKTtcbiAgICBsZXQgb3V0cHV0UGF0dGVybnMgPSB7fTtcbiAgICBsZXQgaW5wdXRQYXR0ZXJucyA9IHt9O1xuXG4gICAgY29uc3QgZmluYWxHcmFwaHMgPSB7XG4gICAgICAgIE11bHRpR3JhcGg6IG11bHRpR3JhcGgsXG4gICAgICAgIG91dHB1dE1hcCxcbiAgICAgICAgaW5wdXRNYXAsXG4gICAgICAgIG91dHB1dFBhdHRlcm5zLFxuICAgICAgICBpbnB1dFBhdHRlcm5zLFxuICAgICAgICBjYWxsYmFja3M6IHBhcnNlZERlcGVuZGVuY2llc1xuICAgIH07XG5cbiAgICBpZiAoaGFzRXJyb3IpIHtcbiAgICAgICAgLy8gbGVhdmUgdGhlIGdyYXBocyBlbXB0eSBpZiB3ZSBmb3VuZCBhbiBlcnJvciwgc28gd2UgZG9uJ3QgdHJ5IHRvXG4gICAgICAgIC8vIGV4ZWN1dGUgdGhlIGJyb2tlbiBjYWxsYmFja3MuXG4gICAgICAgIHJldHVybiBmaW5hbEdyYXBocztcbiAgICB9XG5cbiAgICAvLyBidWlsZHMgdXAgd2lsZGNhcmRQbGFjZWhvbGRlcnMgd2l0aCBhbGwgdGhlIHdpbGRjYXJkIGtleXMgYW5kIHZhbHVlcyB1c2VkIGluIHRoZSBjYWxsYmFja3MsIHNvIHdlIGNhbiBnZW5lcmF0ZSB0aGUgZnVsbCBsaXN0IG9mIGlkcyB0aGF0IGVhY2ggY2FsbGJhY2sgZGVwZW5kcyBvbi5cbiAgICBwYXJzZWREZXBlbmRlbmNpZXMuZm9yRWFjaChkZXBlbmRlbmN5ID0+IHtcbiAgICAgICAgY29uc3Qge291dHB1dHMsIGlucHV0c30gPSBkZXBlbmRlbmN5O1xuXG4gICAgICAgIG91dHB1dHNcbiAgICAgICAgICAgIC5jb25jYXQoaW5wdXRzKVxuICAgICAgICAgICAgLmZpbHRlcihpdGVtID0+IHR5cGVvZiBpdGVtLmlkID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgIC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGZvckVhY2hPYmpJbmRleGVkKCh2YWwsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbGRjYXJkUGxhY2Vob2xkZXJzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGRjYXJkUGxhY2Vob2xkZXJzW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlQbGFjZWhvbGRlcnMgPSB3aWxkY2FyZFBsYWNlaG9sZGVyc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsICYmIHZhbC53aWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmV4cGFuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVBsYWNlaG9sZGVycy5leHBhbmQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlQbGFjZWhvbGRlcnMuZXhhY3QuaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5UGxhY2Vob2xkZXJzLmV4YWN0LnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIGl0ZW0uaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBFZmZpY2llbnRseSBidWlsZCB3aWxkY2FyZFBsYWNlaG9sZGVycy52YWxzIGFycmF5c1xuICAgIGZvckVhY2hPYmpJbmRleGVkKGtleVBsYWNlaG9sZGVycyA9PiB7XG4gICAgICAgIGNvbnN0IHtleGFjdCwgZXhwYW5kfSA9IGtleVBsYWNlaG9sZGVycztcbiAgICAgICAgY29uc3QgdmFscyA9IGV4YWN0LnNsaWNlKCkuc29ydChpZFZhbFNvcnQpO1xuICAgICAgICBpZiAoZXhwYW5kKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGFuZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4YWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB2YWxzLnNwbGljZSgwLCAwLCBbdmFsQmVmb3JlKHZhbHNbMF0pXSk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHMucHVzaCh2YWxBZnRlcih2YWxzW3ZhbHMubGVuZ3RoIC0gMV0pKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWxzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFleGFjdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIG9ubHkgTUFUQ0gvQUxMIC0gc3RpbGwgbmVlZCBhIHZhbHVlXG4gICAgICAgICAgICB2YWxzLnB1c2goMCk7XG4gICAgICAgIH1cbiAgICAgICAga2V5UGxhY2Vob2xkZXJzLnZhbHMgPSB2YWxzO1xuICAgIH0sIHdpbGRjYXJkUGxhY2Vob2xkZXJzKTtcblxuICAgIGZ1bmN0aW9uIG1ha2VBbGxJZHMoaWRTcGVjLCBvdXRJZEZpbmFsKSB7XG4gICAgICAgIGxldCBpZExpc3QgPSBbe31dO1xuICAgICAgICBmb3JFYWNoT2JqSW5kZXhlZCgodmFsLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3RWYWxzID0gd2lsZGNhcmRQbGFjZWhvbGRlcnNba2V5XS52YWxzO1xuICAgICAgICAgICAgY29uc3Qgb3V0VmFsSW5kZXggPSB0ZXN0VmFscy5pbmRleE9mKG91dElkRmluYWxba2V5XSk7XG4gICAgICAgICAgICBsZXQgbmV3VmFscyA9IFt2YWxdO1xuICAgICAgICAgICAgaWYgKHZhbCAmJiB2YWwud2lsZCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IEFMTFNNQUxMRVIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG91dFZhbEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFscyA9IHRlc3RWYWxzLnNsaWNlKDAsIG91dFZhbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNtYWxsZXIgaXRlbXMgLSBkZWxldGUgYWxsIG91dHB1dHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWxzID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBNQVRDSCBvciBBTExcbiAgICAgICAgICAgICAgICAgICAgLy8gTUFUQ0ggKmlzKiBBTEwgZm9yIG91dHB1dHMsIGllIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhXG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHNwZWNpZmllZCBpbiBgb3V0SWRGaW5hbGBcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFscyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRWYWxJbmRleCA9PT0gLTEgfHwgdmFsID09PSBBTExcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRlc3RWYWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBbb3V0SWRGaW5hbFtrZXldXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXBsaWNhdGVzIGV2ZXJ5dGhpbmcgaW4gaWRMaXN0IG9uY2UgZm9yIGVhY2ggaXRlbSBpblxuICAgICAgICAgICAgLy8gbmV3VmFscywgYXR0YWNoaW5nIGVhY2ggdmFsdWUgYXQga2V5LlxuICAgICAgICAgICAgaWRMaXN0ID0gYXAoYXAoW2Fzc29jKGtleSldLCBuZXdWYWxzKSwgaWRMaXN0KTtcbiAgICAgICAgfSwgaWRTcGVjKTtcbiAgICAgICAgcmV0dXJuIGlkTGlzdDtcbiAgICB9XG5cbiAgICAvKiBtdWx0aUdyYXBoIGlzIHVzZWQgb25seSBmb3IgdGVzdGluZyBjaXJjdWxhcml0eVxuICAgICAqXG4gICAgICogRWFjaCBjb21wb25lbnQrcHJvcGVydHkgdGhhdCBpcyB1c2VkIGFzIGFuIGlucHV0IG9yIG91dHB1dCBpcyBhZGRlZCBhcyBhIG5vZGVcbiAgICAgKiB0byBhIGRpcmVjdGVkIGdyYXBoIHdpdGggYSBkZXBlbmRlbmN5IGZyb20gZWFjaCBpbnB1dCB0byBlYWNoIG91dHB1dC4gVGhlXG4gICAgICogZnVuY3Rpb24gdHJpZ2dlckRlZmF1bHRTdGF0ZSBpbiBpbmRleC5qcyB0aGVuIGNoZWNrcyB0aGlzIGdyYXBoIGZvciBjaXJjdWxhcml0eS5cbiAgICAgKlxuICAgICAqIEluIG9yZGVyIHRvIGFsbG93IHRoZSBzYW1lIGNvbXBvbmVudCtwcm9wZXJ0eSB0byBiZSBib3RoIGFuIGlucHV0IGFuZCBvdXRwdXRcbiAgICAgKiBvZiB0aGUgc2FtZSBjYWxsYmFjaywgYSB0d28gcGFzcyBhcHByb2FjaCBpcyB1c2VkLlxuICAgICAqXG4gICAgICogSW4gdGhlIGZpcnN0IHBhc3MsIHRoZSBncmFwaCBpcyBidWlsdCB1cCBub3JtYWxseSB3aXRoIHRoZSBleGNlcHRpb24gdGhhdFxuICAgICAqIGluIGNhc2VzIHdoZXJlIGFuIG91dHB1dCBpcyBhbHNvIGFuIGlucHV0IHRvIHRoZSBzYW1lIGNhbGxiYWNrIGEgc3BlY2lhbFxuICAgICAqIFwib3V0cHV0XCIgbm9kZSBpcyBhZGRlZCBhbmQgdGhlIGRlcGVuZGVuY2llcyB0YXJnZXQgdGhpcyBvdXRwdXQgbm9kZSBpbnN0ZWFkLlxuICAgICAqIEZvciBleGFtcGxlLCBpZiBgc2xpZGVyLnZhbHVlYCBpcyBib3RoIGFuIGlucHV0IGFuZCBhbiBvdXRwdXQsIHRoZW4gdGhlIGEgbmV3XG4gICAgICogbm9kZSBgc2xpZGVyLnZhbHVlX19vdXRwdXRgIHdpbGwgYmUgYWRkZWQgd2l0aCBhIGRlcGVuZGVuY3kgZnJvbSBgc2xpZGVyLnZhbHVlYFxuICAgICAqIHRvIGBzbGlkZXIudmFsdWVfX291dHB1dGAuIFNwbGl0dGluZyB0aGUgaW5wdXQgYW5kIG91dHB1dCBpbnRvIHNlcGFyYXRlIG5vZGVzXG4gICAgICogcmVtb3ZlcyB0aGUgY2lyY3VsYXJpdHkuXG4gICAgICpcbiAgICAgKiBJbiBvcmRlciB0byBzdGlsbCBkZXRlY3Qgb3RoZXIgZm9ybXMgb2YgY2lyY3VsYXJpdHksIGl0IGlzIG5lY2Vzc2FyeSB0byBkbyBhXG4gICAgICogc2Vjb25kIHBhc3MgYW5kIGFkZCB0aGUgbmV3IG91dHB1dCBub2RlcyBhcyBhIGRlcGVuZGVuY3kgaW4gYW55ICpvdGhlciogY2FsbGJhY2tzXG4gICAgICogd2hlcmUgdGhlIG9yaWdpbmFsIG5vZGUgd2FzIGFuIGlucHV0LiBDb250aW51aW5nIHRoZSBleGFtcGxlLCBhbnkgb3RoZXIgY2FsbGJhY2tcbiAgICAgKiB0aGF0IGhhZCBgc2xpZGVyLnZhbHVlYCBhcyBhbiBpbnB1dCBkZXBlbmRlbmN5IGFsc28gbmVlZHMgdG8gaGF2ZVxuICAgICAqIGBzbGlkZXIudmFsdWVfX291dHB1dGAgYXMgYSBkZXBlbmRlbmN5LiBUbyBtYWtlIHRoaXMgZWZmaWNpZW50LCBhbGwgdGhlIGlucHV0c1xuICAgICAqIGFuZCBvdXRwdXRzIGZvciBlYWNoIGNhbGxiYWNrIGFyZSBzdG9yZWQgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLlxuICAgICAqL1xuXG4gICAgY29uc3Qgb3V0cHV0VGFnID0gJ19fb3V0cHV0JztcbiAgICBjb25zdCBkdXBsaWNhdGVPdXRwdXRzID0gW107XG4gICAgY29uc3QgY2JJbiA9IFtdO1xuICAgIGNvbnN0IGNiT3V0ID0gW107XG5cbiAgICBmdW5jdGlvbiBhZGRJbnB1dFRvTXVsdGkoaW5JZFByb3AsIG91dElkUHJvcCwgZmlyc3RQYXNzID0gdHJ1ZSkge1xuICAgICAgICBpZiAoIWNvbmZpZy52YWxpZGF0ZV9jYWxsYmFja3MpIHJldHVybjtcbiAgICAgICAgbXVsdGlHcmFwaC5hZGROb2RlKGluSWRQcm9wKTtcbiAgICAgICAgbXVsdGlHcmFwaC5hZGREZXBlbmRlbmN5KGluSWRQcm9wLCBvdXRJZFByb3ApO1xuICAgICAgICAvLyBvbmx5IHN0b3JlIGNhbGxiYWNrIGlucHV0cyBhbmQgb3V0cHV0cyBkdXJpbmcgdGhlIGZpcnN0IHBhc3NcbiAgICAgICAgaWYgKGZpcnN0UGFzcykge1xuICAgICAgICAgICAgY2JJbltjYkluLmxlbmd0aCAtIDFdLnB1c2goaW5JZFByb3ApO1xuICAgICAgICAgICAgY2JPdXRbY2JPdXQubGVuZ3RoIC0gMV0ucHVzaChvdXRJZFByb3ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VkRGVwZW5kZW5jaWVzLmZvckVhY2goZGVwZW5kZW5jeSA9PiB7XG4gICAgICAgIGNvbnN0IHtvdXRwdXRzLCBpbnB1dHN9ID0gZGVwZW5kZW5jeTtcblxuICAgICAgICAvLyBuZXcgY2FsbGJhY2ssIGFkZCBhbiBlbXB0eSBhcnJheSBmb3IgaXRzIGlucHV0cyBhbmQgb3V0cHV0c1xuICAgICAgICBjYkluLnB1c2goW10pO1xuICAgICAgICBjYk91dC5wdXNoKFtdKTtcblxuICAgICAgICBmdW5jdGlvbiBhZGRPdXRwdXRUb011bHRpKG91dElkRmluYWwsIG91dElkUHJvcCkge1xuICAgICAgICAgICAgaWYgKCFjb25maWcudmFsaWRhdGVfY2FsbGJhY2tzKSByZXR1cm47XG4gICAgICAgICAgICBtdWx0aUdyYXBoLmFkZE5vZGUob3V0SWRQcm9wKTtcbiAgICAgICAgICAgIGlucHV0cy5mb3JFYWNoKGluT2JqID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7aWQ6IGluSWQsIHByb3BlcnR5fSA9IGluT2JqO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5JZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5JZExpc3QgPSBtYWtlQWxsSWRzKGluSWQsIG91dElkRmluYWwpO1xuICAgICAgICAgICAgICAgICAgICBpbklkTGlzdC5mb3JFYWNoKGlkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZElucHV0VG9NdWx0aShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lSWRBbmRQcm9wKHtpZCwgcHJvcGVydHl9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRJZFByb3BcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZElucHV0VG9NdWx0aShjb21iaW5lSWRBbmRQcm9wKGluT2JqKSwgb3V0SWRQcm9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlJ2xsIGNvbnRpbnVlIHRvIHVzZSBkZXAub3V0cHV0IGFzIGl0cyBpZCwgYnV0IGFkZCBvdXRwdXRzIGFzIHdlbGxcbiAgICAgICAgLy8gZm9yIGNvbnZlbmllbmNlIGFuZCBzeW1tZXRyeSB3aXRoIHRoZSBzdHJ1Y3R1cmUgb2YgaW5wdXRzIGFuZCBzdGF0ZS5cbiAgICAgICAgLy8gQWxzbyBjb2xsZWN0IE1BVENIIGtleXMgaW4gdGhlIG91dHB1dCAoYWxsIG91dHB1dHMgbXVzdCBzaGFyZSB0aGVzZSlcbiAgICAgICAgLy8gYW5kIEFMTCBrZXlzIGluIHRoZSBmaXJzdCBvdXRwdXQgKG5lZWQgbm90IGJlIHNoYXJlZCBidXQgd2UnbGwgdXNlXG4gICAgICAgIC8vIHRoZSBmaXJzdCBvdXRwdXQgZm9yIGNhbGN1bGF0aW9ucykgZm9yIGxhdGVyIGNvbnZlbmllbmNlLlxuICAgICAgICBjb25zdCB7bWF0Y2hLZXlzfSA9IGZpbmRXaWxkY2FyZEtleXMoXG4gICAgICAgICAgICBvdXRwdXRzLmxlbmd0aCA/IG91dHB1dHNbMF0uaWQgOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZmlyc3RTaW5nbGVPdXRwdXQgPSBmaW5kSW5kZXgobyA9PiAhaXNNdWx0aVZhbHVlZChvLmlkKSwgb3V0cHV0cyk7XG4gICAgICAgIGNvbnN0IGZpbmFsRGVwZW5kZW5jeSA9IG1lcmdlUmlnaHQoXG4gICAgICAgICAgICB7bWF0Y2hLZXlzLCBmaXJzdFNpbmdsZU91dHB1dCwgb3V0cHV0c30sXG4gICAgICAgICAgICBkZXBlbmRlbmN5XG4gICAgICAgICk7XG5cbiAgICAgICAgb3V0cHV0cy5mb3JFYWNoKG91dElkUHJvcCA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aWQ6IG91dElkLCBwcm9wZXJ0eX0gPSBvdXRJZFByb3A7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGlzIG91dHB1dCBpcyBhbHNvIGFuIGlucHV0IHRvIHRoZSBzYW1lIGNhbGxiYWNrXG4gICAgICAgICAgICBsZXQgYWxzb0lucHV0O1xuICAgICAgICAgICAgaWYgKGNvbmZpZy52YWxpZGF0ZV9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgICAgICBhbHNvSW5wdXQgPSBjaGVja0luT3V0T3ZlcmxhcChvdXRJZFByb3AsIGlucHV0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG91dElkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcudmFsaWRhdGVfY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dElkTGlzdCA9IG1ha2VBbGxJZHMob3V0SWQsIHt9KTtcbiAgICAgICAgICAgICAgICAgICAgb3V0SWRMaXN0LmZvckVhY2goaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcE91dElkUHJvcCA9IHtpZCwgcHJvcGVydHl9O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG91dElkTmFtZSA9IGNvbWJpbmVJZEFuZFByb3AodGVtcE91dElkUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIG91dHB1dCBpcyBhbHNvIGFuIGlucHV0LCBhZGQgYG91dHB1dFRhZ2AgdG8gdGhlIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHNvSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVPdXRwdXRzLnB1c2godGVtcE91dElkUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SWROYW1lICs9IG91dHB1dFRhZztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dFRvTXVsdGkoaWQsIG91dElkTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuKG91dHB1dFBhdHRlcm5NYXAsIG91dElkLCBwcm9wZXJ0eSwgZmluYWxEZXBlbmRlbmN5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy52YWxpZGF0ZV9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG91dElkTmFtZSA9IGNvbWJpbmVJZEFuZFByb3Aob3V0SWRQcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBvdXRwdXQgaXMgYWxzbyBhbiBpbnB1dCwgYWRkIGBvdXRwdXRUYWdgIHRvIHRoZSBuYW1lXG4gICAgICAgICAgICAgICAgICAgIGlmIChhbHNvSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZU91dHB1dHMucHVzaChvdXRJZFByb3ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0SWROYW1lICs9IG91dHB1dFRhZztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXRUb011bHRpKHt9LCBvdXRJZE5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhZGRNYXAob3V0cHV0TWFwLCBvdXRJZCwgcHJvcGVydHksIGZpbmFsRGVwZW5kZW5jeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlucHV0cy5mb3JFYWNoKGlucHV0T2JqZWN0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtpZDogaW5JZCwgcHJvcGVydHk6IGluUHJvcH0gPSBpbnB1dE9iamVjdDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5JZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuKGlucHV0UGF0dGVybk1hcCwgaW5JZCwgaW5Qcm9wLCBmaW5hbERlcGVuZGVuY3kpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhZGRNYXAoaW5wdXRNYXAsIGluSWQsIGluUHJvcCwgZmluYWxEZXBlbmRlbmN5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgb3V0cHV0UGF0dGVybnMgPSBvZmZsb2FkUGF0dGVybnMob3V0cHV0UGF0dGVybk1hcCwgb3V0cHV0UGF0dGVybnMpO1xuICAgIGlucHV0UGF0dGVybnMgPSBvZmZsb2FkUGF0dGVybnMoaW5wdXRQYXR0ZXJuTWFwLCBpbnB1dFBhdHRlcm5zKTtcblxuICAgIC8vIHNlY29uZCBwYXNzIGZvciBhZGRpbmcgbmV3IG91dHB1dCBub2RlcyBhcyBkZXBlbmRlbmNpZXMgd2hlcmUgbmVlZGVkXG4gICAgZHVwbGljYXRlT3V0cHV0cy5mb3JFYWNoKGR1cGVPdXRJZFByb3AgPT4ge1xuICAgICAgICBjb25zdCBvcmlnaW5hbE5hbWUgPSBjb21iaW5lSWRBbmRQcm9wKGR1cGVPdXRJZFByb3ApO1xuICAgICAgICBjb25zdCBuZXdOYW1lID0gb3JpZ2luYWxOYW1lLmNvbmNhdChvdXRwdXRUYWcpO1xuICAgICAgICBmb3IgKHZhciBjbnQgPSAwOyBjbnQgPCBjYkluLmxlbmd0aDsgY250KyspIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGlucHV0IHRvIHRoZSBjYWxsYmFja1xuICAgICAgICAgICAgaWYgKGNiSW5bY250XS5zb21lKGluTmFtZSA9PiBpbk5hbWUgPT09IG9yaWdpbmFsTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvKiBtYWtlIHN1cmUgaXQncyBub3QgYWxzbyBhbiBvdXRwdXQgb2YgdGhlIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgICogKHRoaXMgd2lsbCBiZSB0aGUgb3JpZ2luYWwgY2FsbGJhY2spXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKCFjYk91dFtjbnRdLnNvbWUob3V0TmFtZSA9PiBvdXROYW1lID09PSBuZXdOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjYk91dFtjbnRdLmZvckVhY2gob3V0TmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJbnB1dFRvTXVsdGkobmV3TmFtZSwgb3V0TmFtZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBlbmQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBpZiAoIXdpbmRvdy5kYXNoX2NvbXBvbmVudF9hcGkpIHtcbiAgICAgICAgd2luZG93LmRhc2hfY29tcG9uZW50X2FwaSA9IHt9O1xuICAgIH1cbiAgICB3aW5kb3cuZGFzaF9jb21wb25lbnRfYXBpLmNhbGxiYWNrR3JhcGhUaW1lID0gKGVuZCAtIHN0YXJ0KS50b0ZpeGVkKDIpO1xuXG4gICAgcmV0dXJuIGZpbmFsR3JhcGhzO1xufVxuXG5mdW5jdGlvbiBmaW5kV2lsZGNhcmRLZXlzKGlkKSB7XG4gICAgY29uc3QgbWF0Y2hLZXlzID0gW107XG4gICAgY29uc3QgYWxsc21hbGxlcktleXMgPSBbXTtcbiAgICBpZiAodHlwZW9mIGlkID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3JFYWNoT2JqSW5kZXhlZCgodmFsLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWwgPT09IE1BVENIKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsID09PSBBTExTTUFMTEVSKSB7XG4gICAgICAgICAgICAgICAgYWxsc21hbGxlcktleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBpZCk7XG4gICAgICAgIG1hdGNoS2V5cy5zb3J0KCk7XG4gICAgICAgIGFsbHNtYWxsZXJLZXlzLnNvcnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHttYXRjaEtleXMsIGFsbHNtYWxsZXJLZXlzfTtcbn1cblxuLypcbiAqIERvIHRoZSBnaXZlbiBpZCB2YWx1ZXMgYHZhbHNgIG1hdGNoIHRoZSBwYXR0ZXJuIGBwYXR0ZXJuVmFsc2A/XG4gKiBga2V5c2AsIGBwYXR0ZXJuVmFsc2AsIGFuZCBgdmFsc2AgYXJlIGFsbCBhcnJheXMsIGFuZCB3ZSBhbHJlYWR5IGtub3cgdGhhdFxuICogd2UncmUgb25seSBsb29raW5nIGF0IGlkcyB3aXRoIHRoZSBzYW1lIGtleXMgYXMgdGhlIHBhdHRlcm4uXG4gKlxuICogT3B0aW9uYWxseSwgaW5jbHVkZSBhbm90aGVyIHJlZmVyZW5jZSBzZXQgb2YgdGhlIHNhbWUgLSB0byBlbnN1cmUgdGhlXG4gKiBjb3JyZWN0IG1hdGNoaW5nIG9mIE1BVENIIG9yIEFMTFNNQUxMRVIgYmV0d2VlbiBpbnB1dCBhbmQgb3V0cHV0IGl0ZW1zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaWRNYXRjaChcbiAgICBrZXlzLFxuICAgIHZhbHMsXG4gICAgcGF0dGVyblZhbHMsXG4gICAgcmVmS2V5cyxcbiAgICByZWZWYWxzLFxuICAgIHJlZlBhdHRlcm5WYWxzXG4pIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdmFsID0gdmFsc1tpXTtcbiAgICAgICAgY29uc3QgcGF0dGVyblZhbCA9IHBhdHRlcm5WYWxzW2ldO1xuICAgICAgICBpZiAocGF0dGVyblZhbC53aWxkKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgc2Vjb25kIGlkLCBjb21wYXJlIHRoZSB3aWxkY2FyZCB2YWx1ZXMuXG4gICAgICAgICAgICAvLyBXaXRob3V0IGEgc2Vjb25kIGlkLCBhbGwgd2lsZGNhcmRzIHBhc3MgYXQgdGhpcyBzdGFnZS5cbiAgICAgICAgICAgIGlmIChyZWZLZXlzICYmIHBhdHRlcm5WYWwgIT09IEFMTCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkluZGV4ID0gcmVmS2V5cy5pbmRleE9mKGtleXNbaV0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZlBhdHRlcm5WYWwgPSByZWZQYXR0ZXJuVmFsc1tyZWZJbmRleF07XG4gICAgICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrLiBTaG91bGRuJ3QgZXZlciBmYWlsIHRoaXMsIGlmIHRoZSBiYWNrIGVuZFxuICAgICAgICAgICAgICAgIC8vIGRpZCBpdHMgam9iIHZhbGlkYXRpbmcgY2FsbGJhY2tzLlxuICAgICAgICAgICAgICAgIC8vIFlvdSBjYW4ndCByZXNvbHZlIGFuIGlucHV0IGFnYWluc3QgYW4gaW5wdXQsIGJlY2F1c2VcbiAgICAgICAgICAgICAgICAvLyB0d28gQUxMU01BTExFUidzIHdvdWxkbid0IG1ha2Ugc2Vuc2UhXG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm5WYWwgPT09IEFMTFNNQUxMRVIgJiYgcmVmUGF0dGVyblZhbCA9PT0gQUxMU01BTExFUikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAnaW52YWxpZCB3aWxkY2FyZCBpZCBwYWlyOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5WYWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZLZXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZQYXR0ZXJuVmFscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVmFsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgaWRWYWxTb3J0KHZhbCwgcmVmVmFsc1tyZWZJbmRleF0pICE9PVxuICAgICAgICAgICAgICAgICAgICAocGF0dGVyblZhbCA9PT0gQUxMU01BTExFUlxuICAgICAgICAgICAgICAgICAgICAgICAgPyAtMVxuICAgICAgICAgICAgICAgICAgICAgICAgOiByZWZQYXR0ZXJuVmFsID09PSBBTExTTUFMTEVSXG4gICAgICAgICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgICAgICAgIDogMClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgIT09IHBhdHRlcm5WYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFueVZhbHMocGF0dGVyblZhbHMsIHZhbHMpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuVmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGF0dGVyblZhbHNbaV0gPT09IE1BVENIKSB7XG4gICAgICAgICAgICBtYXRjaGVzLnB1c2godmFsc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoZXMubGVuZ3RoID8gSlNPTi5zdHJpbmdpZnkobWF0Y2hlcykgOiAnJztcbn1cblxuLypcbiAqIERvZXMgdGhpcyBpdGVtIChpbnB1dCAvIG91dHB1dCAvIHN0YXRlKSBzdXBwb3J0IG11bHRpcGxlIHZhbHVlcz9cbiAqIHN0cmluZyBJRHMgZG8gbm90OyB3aWxkY2FyZCBJRHMgb25seSBkbyBpZiB0aGV5IGNvbnRhaW4gQUxMIG9yIEFMTFNNQUxMRVJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTXVsdGlWYWx1ZWQoe2lkfSkge1xuICAgIHJldHVybiB0eXBlb2YgaWQgPT09ICdvYmplY3QnICYmIGFueSh2ID0+IHYubXVsdGksIHZhbHVlcyhpZCkpO1xufVxuXG4vKlxuICogRm9yIGEgZ2l2ZW4gb3V0cHV0IGlkIGFuZCBwcm9wLCBmaW5kIHRoZSBjYWxsYmFjayBnZW5lcmF0aW5nIGl0LlxuICogSWYgbm8gY2FsbGJhY2sgaXMgZm91bmQsIHJldHVybnMgZmFsc2UuXG4gKiBJZiBvbmUgaXMgZm91bmQsIHJldHVybnM6XG4gKiB7XG4gKiAgICAgY2FsbGJhY2s6IHRoZSBjYWxsYmFjayBzcGVjIHtvdXRwdXRzLCBpbnB1dHMsIHN0YXRlIGV0Y31cbiAqICAgICBhbnlWYWxzOiBzdHJpbmdpZmllZCBsaXN0IG9mIHJlc29sdmVkIE1BVENIIGtleXMgd2UgbWF0Y2hlZFxuICogICAgIHJlc29sdmVkSWQ6IHRoZSBcIm91dHB1dHNcIiBpZCBzdHJpbmcgcGx1cyBNQVRDSCB2YWx1ZXMgd2UgbWF0Y2hlZFxuICogICAgIGdldE91dHB1dHM6IGFjY2Vzc29yIGZ1bmN0aW9uIHRvIGdpdmUgYWxsIHJlc29sdmVkIG91dHB1dHMgb2YgdGhpc1xuICogICAgICAgICBjYWxsYmFjay4gVGFrZXMgYHBhdGhzYCBhcyBhcmd1bWVudCB0byBhcHBseSB3aGVuIHRoZSBjYWxsYmFjayBpc1xuICogICAgICAgICBkaXNwYXRjaGVkLCBpbiBjYXNlIGEgcHJldmlvdXMgY2FsbGJhY2sgaGFzIGFsdGVyZWQgdGhlIGxheW91dC5cbiAqICAgICAgICAgVGhlIHJlc3VsdCBpcyBhIGxpc3Qgb2Yge2lkIChzdHJpbmcgb3Igb2JqZWN0KSwgcHJvcGVydHkgKHN0cmluZyl9XG4gKiAgICAgZ2V0SW5wdXRzOiBzYW1lIGZvciBpbnB1dHNcbiAqICAgICBnZXRTdGF0ZTogc2FtZSBmb3Igc3RhdGVcbiAqICAgICBjaGFuZ2VkUHJvcElkczogYW4gb2JqZWN0IG9mIHtbaWRBbmRQcm9wXTogdn0gdHJpZ2dlcmluZyB0aGlzIGNhbGxiYWNrXG4gKiAgICAgICAgIHYgPSBESVJFQ1QgKDIpOiB0aGUgcHJvcCB3YXMgY2hhbmdlZCBpbiB0aGUgZnJvbnQgZW5kLCBzbyBkZXBlbmRlbnRcbiAqICAgICAgICAgICAgIGNhbGxiYWNrcyAqTVVTVCogYmUgZXhlY3V0ZWQuXG4gKiAgICAgICAgIHYgPSBJTkRJUkVDVCAoMSk6IHRoZSBwcm9wIGlzIGV4cGVjdGVkIHRvIGJlIGNoYW5nZWQgYnkgYSBjYWxsYmFjayxcbiAqICAgICAgICAgICAgIGJ1dCBpZiB0aGlzIGlzIHByZXZlbnRlZCwgZGVwZW5kZW50IGNhbGxiYWNrcyBtYXkgYmUgcHJ1bmVkLlxuICogICAgIGluaXRpYWxDYWxsOiBib29sZWFuLCBpZiB0cnVlIHdlIGRvbid0IHJlcXVpcmUgYW55IGNoYW5nZWRQcm9wSWRzXG4gKiAgICAgICAgIHRvIGtlZXAgdGhpcyBjYWxsYmFjayBhcm91bmQsIGFzIGl0J3MgdGhlIGluaXRpYWwgY2FsbCB0byBwb3B1bGF0ZVxuICogICAgICAgICB0aGlzIHZhbHVlIG9uIHBhZ2UgbG9hZCBvciBjaGFuZ2luZyBwYXJ0IG9mIHRoZSBsYXlvdXQuXG4gKiAgICAgICAgIEJ5IGRlZmF1bHQgdGhpcyBpcyB0cnVlIGZvciBjYWxsYmFja3MgZ2VuZXJhdGVkIGJ5XG4gKiAgICAgICAgIGdldENhbGxiYWNrQnlPdXRwdXQsIGZhbHNlIGZyb20gZ2V0Q2FsbGJhY2tzQnlJbnB1dC5cbiAqIH1cbiAqL1xuZnVuY3Rpb24gZ2V0Q2FsbGJhY2tCeU91dHB1dChncmFwaHMsIHBhdGhzLCBpZCwgcHJvcCkge1xuICAgIGxldCByZXNvbHZlO1xuICAgIGxldCBjYWxsYmFjaztcbiAgICBsZXQgYW55VmFscyA9ICcnO1xuICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIHN0YW5kYXJkIGlkIHZlcnNpb25cbiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gKGdyYXBocy5vdXRwdXRNYXBbaWRdIHx8IHt9KVtwcm9wXTtcbiAgICAgICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFja3NbMF07XG4gICAgICAgICAgICByZXNvbHZlID0gcmVzb2x2ZURlcHMoKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHdpbGRjYXJkIHZlcnNpb25cbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IHZhbHMgPSBwcm9wcyhrZXlzLCBpZCk7XG4gICAgICAgIGNvbnN0IGtleVN0ciA9IGtleXMuam9pbignLCcpO1xuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IChncmFwaHMub3V0cHV0UGF0dGVybnNba2V5U3RyXSB8fCB7fSlbcHJvcF07XG4gICAgICAgIGlmIChwYXR0ZXJucykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5WYWxzID0gcGF0dGVybnNbaV0udmFsdWVzO1xuICAgICAgICAgICAgICAgIGlmIChpZE1hdGNoKGtleXMsIHZhbHMsIHBhdHRlcm5WYWxzKSkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHBhdHRlcm5zW2ldLmNhbGxiYWNrc1swXTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSA9IHJlc29sdmVEZXBzKGtleXMsIHZhbHMsIHBhdHRlcm5WYWxzKTtcbiAgICAgICAgICAgICAgICAgICAgYW55VmFscyA9IGdldEFueVZhbHMocGF0dGVyblZhbHMsIHZhbHMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFyZXNvbHZlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZVJlc29sdmVkQ2FsbGJhY2soY2FsbGJhY2ssIHJlc29sdmUsIGFueVZhbHMpO1xufVxuXG5mdW5jdGlvbiBhZGRSZXNvbHZlZEZyb21PdXRwdXRzKGNhbGxiYWNrLCBvdXRQYXR0ZXJuLCBvdXRzLCBtYXRjaGVzKSB7XG4gICAgY29uc3Qgb3V0MEtleXMgPSBPYmplY3Qua2V5cyhvdXRQYXR0ZXJuLmlkKS5zb3J0KCk7XG4gICAgY29uc3Qgb3V0MFBhdHRlcm5WYWxzID0gcHJvcHMob3V0MEtleXMsIG91dFBhdHRlcm4uaWQpO1xuICAgIGNvbnN0IGZvdW5kQ2JJZHMgPSB7fTtcbiAgICBvdXRzLmZvckVhY2goKHtpZDogb3V0SWR9KSA9PiB7XG4gICAgICAgIGNvbnN0IG91dFZhbHMgPSBwcm9wcyhvdXQwS2V5cywgb3V0SWQpO1xuICAgICAgICBjb25zdCByZXNvbHZlZCA9IG1ha2VSZXNvbHZlZENhbGxiYWNrKFxuICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICByZXNvbHZlRGVwcyhvdXQwS2V5cywgb3V0VmFscywgb3V0MFBhdHRlcm5WYWxzKSxcbiAgICAgICAgICAgIGdldEFueVZhbHMob3V0MFBhdHRlcm5WYWxzLCBvdXRWYWxzKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCB7cmVzb2x2ZWRJZH0gPSByZXNvbHZlZDtcbiAgICAgICAgaWYgKCFmb3VuZENiSWRzW3Jlc29sdmVkSWRdKSB7XG4gICAgICAgICAgICBtYXRjaGVzLnB1c2gocmVzb2x2ZWQpO1xuICAgICAgICAgICAgZm91bmRDYklkc1tyZXNvbHZlZElkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEFsbFJlc29sdmVkRnJvbU91dHB1dHMoXG4gICAgcmVzb2x2ZSxcbiAgICBwYXRocyxcbiAgICBtYXRjaGVzLFxuICAgIHRyaWdnZXJBbnlWYWxzID0gJydcbikge1xuICAgIHJldHVybiBjYWxsYmFjayA9PiB7XG4gICAgICAgIGNvbnN0IHttYXRjaEtleXMsIGZpcnN0U2luZ2xlT3V0cHV0LCBvdXRwdXRzfSA9IGNhbGxiYWNrO1xuICAgICAgICBpZiAobWF0Y2hLZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3Qgc2luZ2xlT3V0UGF0dGVybiA9IG91dHB1dHNbZmlyc3RTaW5nbGVPdXRwdXRdO1xuICAgICAgICAgICAgaWYgKHNpbmdsZU91dFBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBhZGRSZXNvbHZlZEZyb21PdXRwdXRzKFxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgICAgICAgICAgICAgc2luZ2xlT3V0UGF0dGVybixcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShwYXRocykoc2luZ2xlT3V0UGF0dGVybiksXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAqIElmIGV2ZXJ5IG91dHB1dCBoYXMgQUxMIHdlIG5lZWQgdG8gcmVkdWNlIHJlc29sdmVkIHNldFxuICAgICAgICAgICAgICAgICAqIHRvIG9uZSBpdGVtIHBlciBjb21iaW5hdGlvbiBvZiBNQVRDSCB2YWx1ZXMuXG4gICAgICAgICAgICAgICAgICogVGhhdCB3aWxsIGdpdmUgb25lIHJlc3VsdCBwZXIgY2FsbGJhY2sgaW52b2NhdGlvbi5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBhbnlTZWVuID0ge307XG4gICAgICAgICAgICAgICAgb3V0cHV0cy5mb3JFYWNoKG91dFBhdHRlcm4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRTZXQgPSByZXNvbHZlKHBhdGhzKShvdXRQYXR0ZXJuKS5maWx0ZXIoaSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaFN0ciA9IEpTT04uc3RyaW5naWZ5KHByb3BzKG1hdGNoS2V5cywgaS5pZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbnlTZWVuW21hdGNoU3RyXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueVNlZW5bbWF0Y2hTdHJdID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGFkZFJlc29sdmVkRnJvbU91dHB1dHMoXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dFBhdHRlcm4sXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRTZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBPdXRwdXRzIGhhdmUgbm8gTUFUQ0gga2V5cyAoZml4ZWQtaWQgb3V0cHV0cyBvciBubyBvdXRwdXQpLlxuICAgICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSB0cmlnZ2VyaW5nIGlucHV0J3MgTUFUQ0ggdmFsdWVzIHNvIHRoYXRcbiAgICAgICAgICAgIC8vIHNlcGFyYXRlIE1BVENIIHRyaWdnZXJzIHByb2R1Y2UgZGlzdGluY3QgcmVzb2x2ZWRJZHMgYW5kXG4gICAgICAgICAgICAvLyBhcmVuJ3QgZGVkdXBsaWNhdGVkIGludG8gYSBzaW5nbGUgZmlyaW5nLiBTZWUgaXNzdWUgIzI0NjIuXG4gICAgICAgICAgICBjb25zdCBjYiA9IG1ha2VSZXNvbHZlZENhbGxiYWNrKGNhbGxiYWNrLCByZXNvbHZlLCB0cmlnZ2VyQW55VmFscyk7XG4gICAgICAgICAgICBtYXRjaGVzLnB1c2goY2IpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuLypcbiAqIEZvciBhIGdpdmVuIGlkIGFuZCBwcm9wIGZpbmQgYWxsIGNhbGxiYWNrcyBpdCdzIGFuIGlucHV0IG9mLlxuICpcbiAqIFJldHVybnMgYW4gYXJyYXkgb2Ygb2JqZWN0czpcbiAqICAge2NhbGxiYWNrLCByZXNvbHZlZElkLCBnZXRPdXRwdXRzLCBnZXRJbnB1dHMsIGdldFN0YXRlfVxuICogICBTZWUgZ2V0Q2FsbGJhY2tCeU91dHB1dCBmb3IgZGV0YWlscy5cbiAqXG4gKiBOb3RlIHRoYXQgaWYgdGhlIG9yaWdpbmFsIGlucHV0IGNvbnRhaW5zIGFuIEFMTFNNQUxMRVIgd2lsZGNhcmQsXG4gKiB0aGVyZSBtYXkgYmUgbWFueSBlbnRyaWVzIGZvciB0aGUgc2FtZSBjYWxsYmFjaywgYnV0IGFueSBnaXZlbiBvdXRwdXRcbiAqICh3aXRoIGFuIE1BVENIIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0J3MgQUxMU01BTExFUikgd2lsbCBvbmx5IGFwcGVhclxuICogaW4gb25lIGVudHJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2F0Y2hlZEtleXMoaWQsIG5ld1Byb3BzLCBncmFwaHMpIHtcbiAgICBpZiAoIShpZCAmJiBncmFwaHMgJiYgbmV3UHJvcHMubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgaW5wdXRzID0gZ3JhcGhzLmlucHV0TWFwW2lkXTtcbiAgICAgICAgcmV0dXJuIGlucHV0cyA/IG5ld1Byb3BzLmZpbHRlcihuZXdQcm9wID0+IGlucHV0c1tuZXdQcm9wXSkgOiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaWQpLnNvcnQoKTtcbiAgICBjb25zdCB2YWxzID0gcHJvcHMoa2V5cywgaWQpO1xuICAgIGNvbnN0IGtleVN0ciA9IGtleXMuam9pbignLCcpO1xuICAgIGNvbnN0IGtleVBhdHRlcm5zID0gZ3JhcGhzLmlucHV0UGF0dGVybnNba2V5U3RyXTtcbiAgICBpZiAoIWtleVBhdHRlcm5zKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1Byb3BzLmZpbHRlcihwcm9wID0+IHtcbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSBrZXlQYXR0ZXJuc1twcm9wXTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHBhdHRlcm5zICYmXG4gICAgICAgICAgICBwYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gaWRNYXRjaChrZXlzLCB2YWxzLCBwYXR0ZXJuLnZhbHVlcykpXG4gICAgICAgICk7XG4gICAgfSk7XG59XG5cbi8qXG4gKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBjYWxsYmFja3MgcmVmZXJlbmNpbmcgYSBjaHVuayBvZiB0aGUgbGF5b3V0LFxuICogZWl0aGVyIGFzIGlucHV0cyBvciBvdXRwdXRzLlxuICpcbiAqIG9wdHMub3V0cHV0c09ubHk6IGJvb2xlYW4sIHNldCB0cnVlIHdoZW4gY3Jhd2xpbmcgdGhlICp3aG9sZSogbGF5b3V0LFxuICogICBiZWNhdXNlIG91dHB1dHMgYXJlIGVub3VnaCB0byBnZXQgZXZlcnl0aGluZy5cbiAqIG9wdHMucmVtb3ZlZEFycmF5SW5wdXRzT25seTogYm9vbGVhbiwgc2V0IHRydWUgdG8gb25seSBsb29rIGZvciBpbnB1dHMgaW5cbiAqICAgd2lsZGNhcmQgYXJyYXlzIChBTEwgb3IgQUxMU01BTExFUiksIG5vIG91dHB1dHMuIFRoaXMgZ2V0cyB1c2VkIHRvIHRlbGxcbiAqICAgd2hlbiB0aGUgbmV3ICphYnNlbmNlKiBvZiBhIGdpdmVuIGNvbXBvbmVudCBzaG91bGQgdHJpZ2dlciBhIGNhbGxiYWNrLlxuICogb3B0cy5uZXdQYXRoczogcGF0aHMgb2JqZWN0IGFmdGVyIHRoZSBlZGl0IC0gdG8gYmUgdXNlZCB3aXRoXG4gKiAgIHJlbW92ZWRBcnJheUlucHV0c09ubHkgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjYWxsYmFjayBzdGlsbCBoYXMgaXRzIG91dHB1dHNcbiAqIG9wdHMuY2h1bmtQYXRoOiBwYXRoIHRvIHRoZSBuZXcgY2h1bmsgLSB1c2VkIHRvIGRldGVybWluZSBpZiBhbnkgb3V0cHV0cyBhcmVcbiAqICAgb3V0c2lkZSBvZiB0aGlzIGNodW5rLCBiZWNhdXNlIHRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIGlucHV0cyBpbnNpZGUgdGhlXG4gKiAgIGNodW5rIGNvdW50IGFzIGhhdmluZyBjaGFuZ2VkXG4gKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3RzOlxuICogICB7Y2FsbGJhY2ssIHJlc29sdmVkSWQsIGdldE91dHB1dHMsIGdldElucHV0cywgZ2V0U3RhdGUsIC4uLmV0Y31cbiAqICAgU2VlIGdldENhbGxiYWNrQnlPdXRwdXQgZm9yIGRldGFpbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbmZpbHRlcmVkTGF5b3V0Q2FsbGJhY2tzKGdyYXBocywgcGF0aHMsIGxheW91dENodW5rLCBvcHRzKSB7XG4gICAgY29uc3Qge291dHB1dHNPbmx5LCByZW1vdmVkQXJyYXlJbnB1dHNPbmx5LCBuZXdQYXRocywgY2h1bmtQYXRofSA9IG9wdHM7XG4gICAgY29uc3QgZm91bmRDYklkcyA9IHt9O1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IFtdO1xuXG4gICAgZnVuY3Rpb24gYWRkQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZEluZGV4ID0gZm91bmRDYklkc1tjYWxsYmFjay5yZXNvbHZlZElkXTtcbiAgICAgICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZENiID0gY2FsbGJhY2tzW2ZvdW5kSW5kZXhdO1xuICAgICAgICAgICAgICAgIGZvdW5kQ2IuY2hhbmdlZFByb3BJZHMgPSBtZXJnZU1heChcbiAgICAgICAgICAgICAgICAgICAgZm91bmRDYi5jaGFuZ2VkUHJvcElkcyxcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2hhbmdlZFByb3BJZHNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjay5pbml0aWFsQ2FsbCkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENiLmluaXRpYWxDYWxsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvdW5kQ2JJZHNbY2FsbGJhY2sucmVzb2x2ZWRJZF0gPSBjYWxsYmFja3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZENhbGxiYWNrSWZBcnJheShpZFN0cikge1xuICAgICAgICByZXR1cm4gY2IgPT5cbiAgICAgICAgICAgIGNiLmdldElucHV0cyhwYXRocykuc29tZShpbmkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShpbmkpICYmXG4gICAgICAgICAgICAgICAgICAgIGluaS5zb21lKGluaWogPT4gc3RyaW5naWZ5SWQoaW5pai5pZCkgPT09IGlkU3RyKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNhbGxiYWNrIHNob3VsZCB0cmlnZ2VyIGV2ZW4gd2l0aCBubyBjaGFuZ2VkUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBwcm9wcyB0aGF0IGNoYW5nZWQgbm8gbG9uZ2VyIGV4aXN0LlxuICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBraW5kIG9mIGFidXNpbmcgdGhlIGBpbml0aWFsQ2FsbGAgZmxhZyBoZXJlLCBpdCdzXG4gICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgbGlrZSBhIFwiZmluYWwgY2FsbFwiIGZvciB0aGUgcmVtb3ZlZCBpbnB1dHMsIGJ1dFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNhc2UgaXMgbm90IHN1YmplY3QgdG8gYHByZXZlbnRfaW5pdGlhbF9jYWxsYC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhuZXdQYXRocykpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2IuaW5pdGlhbENhbGwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2IuY2hhbmdlZFByb3BJZHMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZENhbGxiYWNrKGNiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlT25lSWQoaWQsIG91dElkQ2FsbGJhY2tzLCBpbklkQ2FsbGJhY2tzKSB7XG4gICAgICAgIGlmIChvdXRJZENhbGxiYWNrcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBvdXRJZENhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNiID0gZ2V0Q2FsbGJhY2tCeU91dHB1dChncmFwaHMsIHBhdGhzLCBpZCwgcHJvcGVydHkpO1xuICAgICAgICAgICAgICAgIGlmIChjYikge1xuICAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFja3MgZm91bmQgaW4gdGhlIGxheW91dCBieSBvdXRwdXQgc2hvdWxkIGFsd2F5cyBydW5cbiAgICAgICAgICAgICAgICAgICAgLy8gdW5sZXNzIHNwZWNpZmljYWxseSByZXF1ZXN0ZWQgbm90IHRvLlxuICAgICAgICAgICAgICAgICAgICAvLyBpZSB0aGlzIGlzIHRoZSBpbml0aWFsIGNhbGwgb2YgdGhpcyBjYWxsYmFjayBldmVuIGlmIGl0J3NcbiAgICAgICAgICAgICAgICAgICAgLy8gbm90IHRoZSBwYWdlIGluaXRpYWxpemF0aW9uIGJ1dCBqdXN0IGEgbmV3IGxheW91dCBjaHVua1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNiLmNhbGxiYWNrLnByZXZlbnRfaW5pdGlhbF9jYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYi5pbml0aWFsQ2FsbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRDYWxsYmFjayhjYik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvdXRwdXRzT25seSAmJiBpbklkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBjb25zdCBtYXliZUFkZENhbGxiYWNrID0gcmVtb3ZlZEFycmF5SW5wdXRzT25seVxuICAgICAgICAgICAgICAgID8gYWRkQ2FsbGJhY2tJZkFycmF5KHN0cmluZ2lmeUlkKGlkKSlcbiAgICAgICAgICAgICAgICA6IGFkZENhbGxiYWNrO1xuICAgICAgICAgICAgbGV0IGhhbmRsZVRoaXNDYWxsYmFjayA9IG1heWJlQWRkQ2FsbGJhY2s7XG4gICAgICAgICAgICBpZiAoY2h1bmtQYXRoKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlVGhpc0NhbGxiYWNrID0gY2IgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAhYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0c1dpdGgoY2h1bmtQYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVjaygncGF0aCcsIGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhwYXRocykpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlQWRkQ2FsbGJhY2soY2IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gaW5JZENhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgIGdldENhbGxiYWNrc0J5SW5wdXQoXG4gICAgICAgICAgICAgICAgICAgIGdyYXBocyxcbiAgICAgICAgICAgICAgICAgICAgcGF0aHMsXG4gICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgSU5ESVJFQ1RcbiAgICAgICAgICAgICAgICApLmZvckVhY2goaGFuZGxlVGhpc0NhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyYXdsTGF5b3V0KGxheW91dENodW5rLCBjaGlsZCA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gcGF0aChbJ3Byb3BzJywgJ2lkJ10sIGNoaWxkKTtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiAhcmVtb3ZlZEFycmF5SW5wdXRzT25seSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZU9uZUlkKGlkLCBncmFwaHMub3V0cHV0TWFwW2lkXSwgZ3JhcGhzLmlucHV0TWFwW2lkXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleVN0ciA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCkuam9pbignLCcpO1xuICAgICAgICAgICAgICAgIGhhbmRsZU9uZUlkKFxuICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgIXJlbW92ZWRBcnJheUlucHV0c09ubHkgJiYgZ3JhcGhzLm91dHB1dFBhdHRlcm5zW2tleVN0cl0sXG4gICAgICAgICAgICAgICAgICAgIGdyYXBocy5pbnB1dFBhdHRlcm5zW2tleVN0cl1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWFwKFxuICAgICAgICBjYiA9PiAoe1xuICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICBwcmlvcml0eTogZ2V0UHJpb3JpdHkoZ3JhcGhzLCBwYXRocywgY2IpXG4gICAgICAgIH0pLFxuICAgICAgICBjYWxsYmFja3NcbiAgICApO1xufVxuIiwiaW1wb3J0IHtvbmNlLCBwYXRofSBmcm9tICdyYW1kYSc7XG5pbXBvcnQge2NyZWF0ZUFjdGlvbn0gZnJvbSAncmVkdXgtYWN0aW9ucyc7XG5pbXBvcnQge2FkZFJlcXVlc3RlZENhbGxiYWNrc30gZnJvbSAnLi9jYWxsYmFja3MnO1xuaW1wb3J0IHtnZXRBcHBTdGF0ZX0gZnJvbSAnLi4vcmVkdWNlcnMvY29uc3RhbnRzJztcbmltcG9ydCB7Z2V0QWN0aW9ufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgKiBhcyBjb29raWUgZnJvbSAnY29va2llJztcbmltcG9ydCB7dmFsaWRhdGVDYWxsYmFja3NUb0xheW91dH0gZnJvbSAnLi9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHtcbiAgICBpbmNsdWRlT2JzZXJ2ZXJzLFxuICAgIGdldExheW91dENhbGxiYWNrcyxcbiAgICBtYWtlUmVzb2x2ZWRDYWxsYmFjayxcbiAgICByZXNvbHZlRGVwc1xufSBmcm9tICcuL2RlcGVuZGVuY2llc190cyc7XG5pbXBvcnQge2NvbXB1dGVQYXRocywgZ2V0UGF0aH0gZnJvbSAnLi9wYXRocyc7XG5pbXBvcnQge3JlY29yZFVpRWRpdH0gZnJvbSAnLi4vcGVyc2lzdGVuY2UnO1xuXG5leHBvcnQgY29uc3Qgb25FcnJvciA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ09OX0VSUk9SJykpO1xuZXhwb3J0IGNvbnN0IHNldEFwcExpZmVjeWNsZSA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ1NFVF9BUFBfTElGRUNZQ0xFJykpO1xuZXhwb3J0IGNvbnN0IHNldENvbmZpZyA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ1NFVF9DT05GSUcnKSk7XG5leHBvcnQgY29uc3QgYWRkSHR0cEhlYWRlcnMgPSBjcmVhdGVBY3Rpb24oZ2V0QWN0aW9uKCdBRERfSFRUUF9IRUFERVJTJykpO1xuZXhwb3J0IGNvbnN0IHNldEdyYXBocyA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ1NFVF9HUkFQSFMnKSk7XG5leHBvcnQgY29uc3Qgc2V0SG9va3MgPSBjcmVhdGVBY3Rpb24oZ2V0QWN0aW9uKCdTRVRfSE9PS1MnKSk7XG5leHBvcnQgY29uc3Qgc2V0TGF5b3V0ID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX0xBWU9VVCcpKTtcbmV4cG9ydCBjb25zdCBzZXRQYXRocyA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ1NFVF9QQVRIUycpKTtcbmV4cG9ydCBjb25zdCBzZXRSZXF1ZXN0UXVldWUgPSBjcmVhdGVBY3Rpb24oZ2V0QWN0aW9uKCdTRVRfUkVRVUVTVF9RVUVVRScpKTtcbmV4cG9ydCBjb25zdCBpbnNlcnRDb21wb25lbnQgPSBjcmVhdGVBY3Rpb24oZ2V0QWN0aW9uKCdJTlNFUlRfQ09NUE9ORU5UJykpO1xuZXhwb3J0IGNvbnN0IHJlbW92ZUNvbXBvbmVudCA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ1JFTU9WRV9DT01QT05FTlQnKSk7XG5cbmV4cG9ydCBjb25zdCBvblByb3BDaGFuZ2UgPSBjcmVhdGVBY3Rpb24oZ2V0QWN0aW9uKCdPTl9QUk9QX0NIQU5HRScpKTtcbmV4cG9ydCBjb25zdCByZXNldENvbXBvbmVudFN0YXRlID0gY3JlYXRlQWN0aW9uKFxuICAgIGdldEFjdGlvbignUkVTRVRfQ09NUE9ORU5UX1NUQVRFJylcbik7XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVQcm9wcyhwYXlsb2FkKSB7XG4gICAgcmV0dXJuIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gcGF0aChwYXlsb2FkLml0ZW1wYXRoLCBnZXRTdGF0ZSgpLmxheW91dCk7XG4gICAgICAgIHJlY29yZFVpRWRpdChjb21wb25lbnQsIHBheWxvYWQucHJvcHMsIGRpc3BhdGNoKTtcbiAgICAgICAgZGlzcGF0Y2gob25Qcm9wQ2hhbmdlKHBheWxvYWQpKTtcbiAgICB9O1xufVxuXG5leHBvcnQgY29uc3QgYWRkQ29tcG9uZW50VG9MYXlvdXQgPSBwYXlsb2FkID0+IChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICBjb25zdCB7cGF0aHN9ID0gZ2V0U3RhdGUoKTtcbiAgICBkaXNwYXRjaChpbnNlcnRDb21wb25lbnQocGF5bG9hZCkpO1xuICAgIGRpc3BhdGNoKFxuICAgICAgICBzZXRQYXRocyhjb21wdXRlUGF0aHMocGF5bG9hZC5jb21wb25lbnQsIHBheWxvYWQuY29tcG9uZW50UGF0aCwgcGF0aHMpKVxuICAgICk7XG59O1xuXG5leHBvcnQgY29uc3QgZGlzcGF0Y2hFcnJvciA9IGRpc3BhdGNoID0+IChtZXNzYWdlLCBsaW5lcykgPT5cbiAgICBkaXNwYXRjaChcbiAgICAgICAgb25FcnJvcih7XG4gICAgICAgICAgICB0eXBlOiAnYmFja0VuZCcsXG4gICAgICAgICAgICBlcnJvcjoge21lc3NhZ2UsIGh0bWw6IGxpbmVzLmpvaW4oJ1xcbicpfVxuICAgICAgICB9KVxuICAgICk7XG5cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlSW5pdGlhbE91dHB1dHMoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICAgICAgdmFsaWRhdGVDYWxsYmFja3NUb0xheW91dChnZXRTdGF0ZSgpLCBkaXNwYXRjaEVycm9yKGRpc3BhdGNoKSk7XG4gICAgICAgIHRyaWdnZXJEZWZhdWx0U3RhdGUoZGlzcGF0Y2gsIGdldFN0YXRlKTtcbiAgICAgICAgZGlzcGF0Y2goc2V0QXBwTGlmZWN5Y2xlKGdldEFwcFN0YXRlKCdIWURSQVRFRCcpKSk7XG4gICAgfTtcbn1cblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUgKi9cbmNvbnN0IGxvZ1dhcm5pbmdPbmNlID0gb25jZShjb25zb2xlLndhcm4pO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q1NSRkhlYWRlcihjb25maWcpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCB0b2tlbk5hbWUgPSAoY29uZmlnICYmIGNvbmZpZy5jc3JmX3Rva2VuX25hbWUpIHx8ICdfY3NyZl90b2tlbic7XG4gICAgICAgIGNvbnN0IGhlYWRlck5hbWUgPSAoY29uZmlnICYmIGNvbmZpZy5jc3JmX2hlYWRlcl9uYW1lKSB8fCAnWC1DU1JGVG9rZW4nO1xuICAgICAgICBjb25zdCBjb29raWVzID0gY29va2llLnBhcnNlKGRvY3VtZW50LmNvb2tpZSk7XG4gICAgICAgIGNvbnN0IHRva2VuID0gY29va2llc1t0b2tlbk5hbWVdO1xuICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtbaGVhZGVyTmFtZV06IHRva2VufTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ1dhcm5pbmdPbmNlKGUpO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyRGVmYXVsdFN0YXRlKGRpc3BhdGNoLCBnZXRTdGF0ZSkge1xuICAgIGNvbnN0IHtncmFwaHMsIHBhdGhzLCBsYXlvdXR9ID0gZ2V0U3RhdGUoKTtcblxuICAgIC8vIG92ZXJhbGxPcmRlciB3aWxsIGFzc2VydCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgZm9yIG11bHRpIG91dHB1dC5cbiAgICB0cnkge1xuICAgICAgICBncmFwaHMuTXVsdGlHcmFwaC5vdmVyYWxsT3JkZXIoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICBvbkVycm9yKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYmFja0VuZCcsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0NpcmN1bGFyIERlcGVuZGVuY2llcycsXG4gICAgICAgICAgICAgICAgICAgIGh0bWw6IGVyci50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBsYXlvdXRDYWxsYmFja3MgPSBnZXRMYXlvdXRDYWxsYmFja3MoXG4gICAgICAgIGdyYXBocyxcbiAgICAgICAgcGF0aHMsXG4gICAgICAgIGxheW91dC5jb21wb25lbnRzLFxuICAgICAgICB7XG4gICAgICAgICAgICBvdXRwdXRzT25seTogdHJ1ZVxuICAgICAgICB9XG4gICAgKTtcblxuICAgIC8vIEFsc28gaW5jbHVkZSBuby1vdXRwdXQgYW5kIG5vLWlucHV0IGNhbGxiYWNrcyB0aGF0IHNob3VsZCBmaXJlIG9uIGluaXRpYWwgbG9hZFxuICAgIGNvbnN0IHNwZWNpYWxDYWxsYmFja3MgPSAoZ3JhcGhzLmNhbGxiYWNrcyB8fCBbXSkucmVkdWNlKChhY2MsIGNiKSA9PiB7XG4gICAgICAgIGlmIChjYi5wcmV2ZW50X2luaXRpYWxfY2FsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzTm9PdXRwdXQgPSBjYi5ub091dHB1dDtcbiAgICAgICAgY29uc3QgaXNOb0lucHV0ID0gIWNiLm5vT3V0cHV0ICYmIGNiLmlucHV0cy5sZW5ndGggPT09IDA7XG5cbiAgICAgICAgaWYgKCFpc05vT3V0cHV0ICYmICFpc05vSW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IG1ha2VSZXNvbHZlZENhbGxiYWNrKGNiLCByZXNvbHZlRGVwcygpLCAnJyk7XG4gICAgICAgIHJlc29sdmVkLmluaXRpYWxDYWxsID0gdHJ1ZTtcblxuICAgICAgICBpZiAoaXNOb091dHB1dCkge1xuICAgICAgICAgICAgLy8gTm8tb3V0cHV0OiBpbmNsdWRlIGlmIG5vIGlucHV0cyBvciBhbnkgaW5wdXQgaXMgaW4gbGF5b3V0XG4gICAgICAgICAgICBpZiAoY2IuaW5wdXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGFjYy5wdXNoKHJlc29sdmVkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXRzID0gcmVzb2x2ZWQuZ2V0SW5wdXRzKHBhdGhzKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGlucHV0cy5zb21lKGlucCA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShpbnApID8gaW5wLmxlbmd0aCA+IDAgOiBpbnBcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBhY2MucHVzaChyZXNvbHZlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8taW5wdXQ6IGluY2x1ZGUgaWYgYW55IG91dHB1dCBpcyBpbiBsYXlvdXRcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dHMgPSByZXNvbHZlZC5nZXRPdXRwdXRzKHBhdGhzKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBvdXRwdXRzLnNvbWUob3V0ID0+IChBcnJheS5pc0FycmF5KG91dCkgPyBvdXQubGVuZ3RoID4gMCA6IG91dCkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBhY2MucHVzaChyZXNvbHZlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdKTtcblxuICAgIGRpc3BhdGNoKGFkZFJlcXVlc3RlZENhbGxiYWNrcyhbLi4ubGF5b3V0Q2FsbGJhY2tzLCAuLi5zcGVjaWFsQ2FsbGJhY2tzXSkpO1xufVxuXG5leHBvcnQgY29uc3QgcmVkbyA9IG1vdmVIaXN0b3J5KCdSRURPJyk7XG5leHBvcnQgY29uc3QgdW5kbyA9IG1vdmVIaXN0b3J5KCdVTkRPJyk7XG5leHBvcnQgY29uc3QgcmV2ZXJ0ID0gbW92ZUhpc3RvcnkoJ1JFVkVSVCcpO1xuXG5mdW5jdGlvbiBtb3ZlSGlzdG9yeShjaGFuZ2VUeXBlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICAgICAgY29uc3Qge2hpc3RvcnksIHBhdGhzfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGRpc3BhdGNoKGNyZWF0ZUFjdGlvbihjaGFuZ2VUeXBlKSgpKTtcbiAgICAgICAgY29uc3Qge2lkLCBwcm9wc30gPVxuICAgICAgICAgICAgKGNoYW5nZVR5cGUgPT09ICdSRURPJ1xuICAgICAgICAgICAgICAgID8gaGlzdG9yeS5mdXR1cmVbMF1cbiAgICAgICAgICAgICAgICA6IGhpc3RvcnkucGFzdFtoaXN0b3J5LnBhc3QubGVuZ3RoIC0gMV0pIHx8IHt9O1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBwcm9wc1xuICAgICAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICAgICAgY3JlYXRlQWN0aW9uKCdVTkRPX1BST1BfQ0hBTkdFJykoe1xuICAgICAgICAgICAgICAgICAgICBpdGVtcGF0aDogZ2V0UGF0aChwYXRocywgaWQpLFxuICAgICAgICAgICAgICAgICAgICBwcm9wc1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBkaXNwYXRjaChub3RpZnlPYnNlcnZlcnMoe2lkLCBwcm9wc30pKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3RpZnlPYnNlcnZlcnMoe2lkLCBwcm9wc30pIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKGRpc3BhdGNoLCBnZXRTdGF0ZSkge1xuICAgICAgICBjb25zdCB7Z3JhcGhzLCBwYXRoc30gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgIGFkZFJlcXVlc3RlZENhbGxiYWNrcyhpbmNsdWRlT2JzZXJ2ZXJzKGlkLCBwcm9wcywgZ3JhcGhzLCBwYXRocykpXG4gICAgICAgICk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUFzeW5jRXJyb3IoZXJyLCBtZXNzYWdlLCBkaXNwYXRjaCkge1xuICAgIC8vIEhhbmRsZSBodG1sIGVycm9yIHJlc3BvbnNlc1xuICAgIGlmIChlcnIgJiYgdHlwZW9mIGVyci50ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVyci50ZXh0KCkudGhlbih0ZXh0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0ge21lc3NhZ2UsIGh0bWw6IHRleHR9O1xuICAgICAgICAgICAgZGlzcGF0Y2gob25FcnJvcih7dHlwZTogJ2JhY2tFbmQnLCBlcnJvcn0pKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyciA6IHttZXNzYWdlLCBodG1sOiBlcnJ9O1xuICAgICAgICBkaXNwYXRjaChvbkVycm9yKHt0eXBlOiAnYmFja0VuZCcsIGVycm9yfSkpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7cGF0aH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHtpc1JlYWR5fSBmcm9tICdAcGxvdGx5L2Rhc2gtY29tcG9uZW50LXBsdWdpbnMnO1xuXG5pbXBvcnQgUmVnaXN0cnkgZnJvbSAnLi4vcmVnaXN0cnknO1xuaW1wb3J0IHtnZXRQYXRofSBmcm9tICcuL3BhdGhzJztcbmltcG9ydCB7c3RyaW5naWZ5SWR9IGZyb20gJy4vZGVwZW5kZW5jaWVzJztcblxuZXhwb3J0IGRlZmF1bHQgKGxheW91dCwgcGF0aHMsIHRhcmdldHMpID0+IHtcbiAgICBpZiAoIXRhcmdldHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuXG4gICAgY29uc3Qge2V2ZW50c30gPSBwYXRocztcbiAgICBjb25zdCByZW5kZXJlZCA9IG5ldyBQcm9taXNlKHJlc29sdmVSZW5kZXJlZCA9PiB7XG4gICAgICAgIGV2ZW50cy5vbmNlKCdyZW5kZXJlZCcsIHJlc29sdmVSZW5kZXJlZCk7XG4gICAgfSk7XG5cbiAgICB0YXJnZXRzLmZvckVhY2goaWQgPT4ge1xuICAgICAgICBjb25zdCBwYXRoT2ZJZCA9IGdldFBhdGgocGF0aHMsIGlkKTtcbiAgICAgICAgaWYgKCFwYXRoT2ZJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcGF0aChwYXRoT2ZJZCwgbGF5b3V0KTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IFJlZ2lzdHJ5LnJlc29sdmUodGFyZ2V0KTtcbiAgICAgICAgY29uc3QgcmVhZHkgPSBpc1JlYWR5KGNvbXBvbmVudCk7XG5cbiAgICAgICAgaWYgKHJlYWR5ICYmIHR5cGVvZiByZWFkeS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgICAgIFByb21pc2UucmFjZShbXG4gICAgICAgICAgICAgICAgICAgIHJlYWR5LFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJlZC50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3RyaW5naWZ5SWQoaWQpKSAmJiByZWFkeVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBwcm9taXNlcy5sZW5ndGggPyBQcm9taXNlLmFsbChwcm9taXNlcykgOiB0cnVlO1xufTtcbiIsImltcG9ydCB7XG4gICAgY29uY2F0LFxuICAgIGZpbHRlcixcbiAgICBmaW5kLFxuICAgIGZvckVhY2hPYmpJbmRleGVkLFxuICAgIGluc2VydCxcbiAgICBwYXRoLFxuICAgIHByb3BFcSxcbiAgICBwcm9wcyxcbiAgICBpbmRleE9mXG59IGZyb20gJ3JhbWRhJztcblxuaW1wb3J0IHtjcmF3bExheW91dH0gZnJvbSAnLi91dGlscyc7XG5cbi8qXG4gKiBzdGF0ZS5wYXRocyBoYXMgc3RydWN0dXJlOlxuICoge1xuICogICBzdHJzOiB7W2lkXTogcGF0aH0gLy8gZm9yIHJlZ3VsYXIgc3RyaW5nIGlkc1xuICogICBvYmpzOiB7W2tleVN0cl06IFt7dmFsdWVzLCBwYXRofV19IC8vIGZvciB3aWxkY2FyZCBpZHNcbiAqIH1cbiAqIGtleVN0cjogc29ydGVkIGtleXMgb2YgdGhlIGlkLCBqb2luZWQgd2l0aCAnLCcgaW50byBvbmUgc3RyaW5nXG4gKiB2YWx1ZXM6IGFycmF5IG9mIHZhbHVlcyBpbiB0aGUgaWQsIGluIG9yZGVyIG9mIGtleXNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVBhdGhzKHN1YlRyZWUsIHN0YXJ0aW5nUGF0aCwgb2xkUGF0aHMsIGV2ZW50cykge1xuICAgIGNvbnN0IHtzdHJzOiBvbGRTdHJzLCBvYmpzOiBvbGRPYmpzfSA9IG9sZFBhdGhzIHx8IHtzdHJzOiB7fSwgb2Jqczoge319O1xuXG4gICAgY29uc3QgZGlmZkhlYWQgPSBwYXRoID0+IHN0YXJ0aW5nUGF0aC5zb21lKCh2LCBpKSA9PiBwYXRoW2ldICE9PSB2KTtcblxuICAgIGNvbnN0IHNwTGVuID0gc3RhcnRpbmdQYXRoLmxlbmd0aDtcbiAgICAvLyBpZiB3ZSdyZSB1cGRhdGluZyBhIHN1YnRyZWUsIGNsZWFyIG91dCBhbGwgb2YgdGhlIGV4aXN0aW5nIGl0ZW1zXG4gICAgY29uc3Qgc3RycyA9IHNwTGVuID8gZmlsdGVyKGRpZmZIZWFkLCBvbGRTdHJzKSA6IHt9O1xuICAgIGNvbnN0IG9ianMgPSB7fTtcbiAgICBpZiAoc3BMZW4pIHtcbiAgICAgICAgZm9yRWFjaE9iakluZGV4ZWQoKG9sZFZhbFBhdGhzLCBvbGRLZXlzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWxzID0gZmlsdGVyKCh7cGF0aH0pID0+IGRpZmZIZWFkKHBhdGgpLCBvbGRWYWxQYXRocyk7XG4gICAgICAgICAgICBpZiAobmV3VmFscy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBvYmpzW29sZEtleXNdID0gbmV3VmFscztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgb2xkT2Jqcyk7XG4gICAgfVxuXG4gICAgY3Jhd2xMYXlvdXQoc3ViVHJlZSwgKGNoaWxkLCBpdGVtcGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IHBhdGgoWydwcm9wcycsICdpZCddLCBjaGlsZCk7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaWQpLnNvcnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBwcm9wcyhrZXlzLCBpZCk7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5U3RyID0ga2V5cy5qb2luKCcsJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aHMgPSAob2Jqc1trZXlTdHJdID0gb2Jqc1trZXlTdHJdIHx8IFtdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRpZSA9IG9sZE9ianNba2V5U3RyXSB8fCBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0ge3ZhbHVlcywgcGF0aDogY29uY2F0KHN0YXJ0aW5nUGF0aCwgaXRlbXBhdGgpfTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGluZGV4T2YoaXRlbSwgb2xkaWUpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aHMucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvYmpzW2tleVN0cl0gPSBpbnNlcnQoaW5kZXgsIGl0ZW0sIHBhdGhzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0cnNbaWRdID0gY29uY2F0KHN0YXJ0aW5nUGF0aCwgaXRlbXBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBXZSBpbmNsdWRlIGFuIGV2ZW50IGVtaXR0ZXIgaGVyZSBiZWNhdXNlIGl0IHdpbGwgYmUgdXNlZCBhbG9uZyB3aXRoXG4gICAgLy8gcGF0aHMgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIGFwcCBpcyByZWFkeSBmb3IgY2FsbGJhY2tzLlxuICAgIHJldHVybiB7c3Rycywgb2JqcywgZXZlbnRzOiBldmVudHMgfHwgb2xkUGF0aHMuZXZlbnRzfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhdGgocGF0aHMsIGlkKSB7XG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IGtleVN0ciA9IGtleXMuam9pbignLCcpO1xuICAgICAgICBjb25zdCBrZXlQYXRocyA9IHBhdGhzLm9ianNba2V5U3RyXTtcbiAgICAgICAgaWYgKCFrZXlQYXRocykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHByb3BzKGtleXMsIGlkKTtcbiAgICAgICAgY29uc3QgcGF0aE9iaiA9IGZpbmQocHJvcEVxKHZhbHVlcywgJ3ZhbHVlcycpLCBrZXlQYXRocyk7XG4gICAgICAgIHJldHVybiBwYXRoT2JqICYmIHBhdGhPYmoucGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhzLnN0cnNbaWRdO1xufVxuIiwiaW1wb3J0IHtcbiAgICBhcHBlbmQsXG4gICAgY29uY2F0LFxuICAgIGhhcyxcbiAgICBwYXRoLFxuICAgIHBhdGhPcixcbiAgICB0eXBlLFxuICAgIGZpbmRJbmRleCxcbiAgICBpbmNsdWRlcyxcbiAgICBzbGljZVxufSBmcm9tICdyYW1kYSc7XG5cbi8qXG4gKiByZXF1ZXN0c19wYXRobmFtZV9wcmVmaXggaXMgdGhlIG5ldyBjb25maWcgcGFyYW1ldGVyIGludHJvZHVjZWQgaW5cbiAqIGRhc2g9PTAuMTguMC4gVGhlIHByZXZpb3VzIHZlcnNpb25zIGp1c3QgaGFkIHVybF9iYXNlX3BhdGhuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cmxCYXNlKGNvbmZpZykge1xuICAgIGNvbnN0IGhhc1VybEJhc2UgPSBoYXMoJ3VybF9iYXNlX3BhdGhuYW1lJywgY29uZmlnKTtcbiAgICBjb25zdCBoYXNSZXFQcmVmaXggPSBoYXMoJ3JlcXVlc3RzX3BhdGhuYW1lX3ByZWZpeCcsIGNvbmZpZyk7XG4gICAgaWYgKHR5cGUoY29uZmlnKSAhPT0gJ09iamVjdCcgfHwgKCFoYXNVcmxCYXNlICYmICFoYXNSZXFQcmVmaXgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgIFRyeWluZyB0byBtYWtlIGFuIEFQSSByZXF1ZXN0IGJ1dCBuZWl0aGVyXG4gICAgICAgICAgICBcInVybF9iYXNlX3BhdGhuYW1lXCIgbm9yIFwicmVxdWVzdHNfcGF0aG5hbWVfcHJlZml4XCJcbiAgICAgICAgICAgIGlzIGluIFxcYGNvbmZpZ1xcYC4gXFxgY29uZmlnXFxgIGlzOiBgLFxuICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZSA9IGhhc1JlcVByZWZpeFxuICAgICAgICA/IGNvbmZpZy5yZXF1ZXN0c19wYXRobmFtZV9wcmVmaXhcbiAgICAgICAgOiBjb25maWcudXJsX2Jhc2VfcGF0aG5hbWU7XG5cbiAgICByZXR1cm4gYmFzZS5jaGFyQXQoYmFzZS5sZW5ndGggLSAxKSA9PT0gJy8nID8gYmFzZSA6IGJhc2UgKyAnLyc7XG59XG5cbmNvbnN0IHByb3BzQ2hpbGRyZW4gPSBbJ3Byb3BzJywgJ2NoaWxkcmVuJ107XG5cbi8vIGNyYXdsIGEgbGF5b3V0IG9iamVjdCBvciBjaGlsZHJlbiBhcnJheSwgYXBwbHkgYSBmdW5jdGlvbiBvbiBldmVyeSBvYmplY3RcbmV4cG9ydCBjb25zdCBjcmF3bExheW91dCA9IChcbiAgICBvYmplY3QsXG4gICAgZnVuYyxcbiAgICBjdXJyZW50UGF0aCA9IFtdLFxuICAgIGV4dHJhUGF0aCA9IHVuZGVmaW5lZFxuKSA9PiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgICAvLyBjaGlsZHJlbiBhcnJheVxuICAgICAgICBvYmplY3QuZm9yRWFjaCgoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChleHRyYVBhdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvYmpPZiA9IGZpbmRJbmRleChwID0+IGluY2x1ZGVzKCd7fScsIHApLCBleHRyYVBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChvYmpPZiAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbnQgPSBzbGljZSgwLCBvYmpPZiwgZXh0cmFQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFjayA9IHNsaWNlKG9iak9mLCBleHRyYVBhdGgubGVuZ3RoLCBleHRyYVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcmF3bExheW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKGZyb250LCBjaGlsZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jYXQoY3VycmVudFBhdGgsIGNvbmNhdChbaV0sIGZyb250KSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tQYXRoID0gYmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAocCA9PiBwLnJlcGxhY2UoJ3t9JywgJycpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZSA9PiBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZE9iaixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFBhdGggPSBjb25jYXQoW2ldLCBiYWNrUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja1BhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRPYmogPSBwYXRoKGJhY2tQYXRoLCBjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkT2JqID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjaGlsZE9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2hpbGRPYmpba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmF3bExheW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNhdChjdXJyZW50UGF0aCwgY2hpbGRQYXRoLmNvbmNhdChba2V5XSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNyYXdsTGF5b3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aChleHRyYVBhdGgsIGNoaWxkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25jYXQoY3VycmVudFBhdGgsIGNvbmNhdChbaV0sIGV4dHJhUGF0aCkpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjcmF3bExheW91dChjaGlsZCwgZnVuYywgYXBwZW5kKGksIGN1cnJlbnRQYXRoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZShvYmplY3QpID09PSAnT2JqZWN0Jykge1xuICAgICAgICBmdW5jKG9iamVjdCwgY3VycmVudFBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gcGF0aChwcm9wc0NoaWxkcmVuLCBvYmplY3QpO1xuICAgICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhdGggPSBjb25jYXQoY3VycmVudFBhdGgsIHByb3BzQ2hpbGRyZW4pO1xuICAgICAgICAgICAgY3Jhd2xMYXlvdXQoY2hpbGRyZW4sIGZ1bmMsIG5ld1BhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hpbGRyZW5Qcm9wcyA9IHBhdGhPcihcbiAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgW29iamVjdC5uYW1lc3BhY2UsIG9iamVjdC50eXBlXSxcbiAgICAgICAgICAgIHdpbmRvdy5fX2Rhc2hwcml2YXRlX2NoaWxkcmVuUHJvcHNcbiAgICAgICAgKTtcbiAgICAgICAgY2hpbGRyZW5Qcm9wcy5mb3JFYWNoKGNoaWxkcmVuUHJvcCA9PiB7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5Qcm9wLmluY2x1ZGVzKCdbXScpKSB7XG4gICAgICAgICAgICAgICAgbGV0IFtmcm9udFBhdGgsIGJhY2tQYXRoXSA9IGNoaWxkcmVuUHJvcFxuICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ1tdJylcbiAgICAgICAgICAgICAgICAgICAgLm1hcChwID0+IHAuc3BsaXQoJy4nKS5maWx0ZXIoZSA9PiBlKSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmcm9udCA9IGNvbmNhdChbJ3Byb3BzJ10sIGZyb250UGF0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZVBhdGggPSBjb25jYXQoY3VycmVudFBhdGgsIGZyb250KTtcbiAgICAgICAgICAgICAgICBjcmF3bExheW91dChwYXRoKGZyb250LCBvYmplY3QpLCBmdW5jLCBiYXNlUGF0aCwgYmFja1BhdGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5Qcm9wLmluY2x1ZGVzKCd7fScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wYXRoID0gY2hpbGRyZW5Qcm9wLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyb250UGF0aCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrUGF0aCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJQYXRoID0gb3BhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kICYmIGN1clBhdGguaW5jbHVkZXMoJ3t9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRQYXRoLnB1c2goY3VyUGF0aC5yZXBsYWNlKCd7fScsICcnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrUGF0aC5wdXNoKGN1clBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250UGF0aC5wdXNoKGN1clBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQYXRoID0gY29uY2F0KGN1cnJlbnRQYXRoLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZnJvbnRQYXRoXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9WYWx1ZSA9IHBhdGgoWydwcm9wcycsIC4uLmZyb250UGF0aF0sIG9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvVmFsdWVba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja1BhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyYXdsTGF5b3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aChiYWNrUGF0aCwgdmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNhdChuZXdQYXRoLCBba2V5LCAuLi5iYWNrUGF0aF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2xMYXlvdXQodmFsdWUsIGZ1bmMsIFsuLi5uZXdQYXRoLCBrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQYXRoID0gY29uY2F0KGN1cnJlbnRQYXRoLCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY2hpbGRyZW5Qcm9wLnNwbGl0KCcuJylcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgIGNyYXdsTGF5b3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aChbJ3Byb3BzJywgLi4uY2hpbGRyZW5Qcm9wLnNwbGl0KCcuJyldLCBvYmplY3QpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGhcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbi8vIFRoZXJlIGFyZSBwYWNrYWdlcyBmb3IgdGhpcyBidXQgaXQncyBzaW1wbGUgZW5vdWdoLCBJIGp1c3Rcbi8vIGFkYXB0ZWQgaXQgZnJvbSBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9tdWRnZS81ODMwMzgyXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fZXYgPSB7fTtcbiAgICB9XG4gICAgb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50cyA9ICh0aGlzLl9ldltldmVudF0gPSB0aGlzLl9ldltldmVudF0gfHwgW10pO1xuICAgICAgICBldmVudHMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfVxuICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICBjb25zdCBldmVudHMgPSB0aGlzLl9ldltldmVudF07XG4gICAgICAgIGlmIChldmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGV2ZW50cy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbWl0KGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMuX2V2W2V2ZW50XTtcbiAgICAgICAgaWYgKGV2ZW50cykge1xuICAgICAgICAgICAgZXZlbnRzLmZvckVhY2gobGlzdGVuZXIgPT4gbGlzdGVuZXIuYXBwbHkodGhpcywgYXJncykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uY2UoZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZSA9IHRoaXMub24oZXZlbnQsICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICByZW1vdmUoKTtcbiAgICAgICAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIvKlxuICogQ29waWVkIG91dCBvZiBwcm9wLXR5cGVzIGFuZCBtb2RpZmllZCAtIGluc3BpcmVkIGJ5IGNoZWNrLXByb3AtdHlwZXMsIGJ1dFxuICogc2ltcGxpZmllZCBhbmQgdHdlYWtlZCB0byBvdXIgbmVlZHM6IHdlIGRvbid0IG5lZWQgdGhlIE5PREVfRU5WIGNoZWNrLFxuICogd2UgcmVwb3J0IGFsbCBlcnJvcnMsIG5vdCBqdXN0IHRoZSBmaXJzdCBvbmUsIGFuZCB3ZSBkb24ndCBuZWVkIHRoZSB0aHJvd2luZ1xuICogdmFyaWFudCBgYXNzZXJ0UHJvcFR5cGVzYC5cbiAqL1xuaW1wb3J0IFJlYWN0UHJvcFR5cGVzU2VjcmV0IGZyb20gJ3Byb3AtdHlwZXMvbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0JztcblxuLyoqXG4gKiBBc3NlcnQgdGhhdCB0aGUgdmFsdWVzIG1hdGNoIHdpdGggdGhlIHR5cGUgc3BlY3MuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgbmFtZSB0byBhIFJlYWN0UHJvcFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgUnVudGltZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHR5cGUtY2hlY2tlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIGUuZy4gXCJwcm9wXCIsIFwiY29udGV4dFwiLCBcImNoaWxkIGNvbnRleHRcIlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXBvbmVudE5hbWUgTmFtZSBvZiB0aGUgY29tcG9uZW50IGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBnZXRTdGFjayBSZXR1cm5zIHRoZSBjb21wb25lbnQgc3RhY2suXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEFueSBlcnJvciBtZXNzYWdlIHJlc3VsdGluZyBmcm9tIGNoZWNraW5nIHRoZSB0eXBlc1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjaGVja1Byb3BUeXBlcyhcbiAgICB0eXBlU3BlY3MsXG4gICAgdmFsdWVzLFxuICAgIGxvY2F0aW9uLFxuICAgIGNvbXBvbmVudE5hbWUsXG4gICAgZ2V0U3RhY2sgPSBudWxsXG4pIHtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgICAgaWYgKHR5cGVTcGVjcy5oYXNPd25Qcm9wZXJ0eSh0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3I7XG4gICAgICAgICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIHR5cGUgYCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTcGVjTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2AgaXMgaW52YWxpZDsgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdgLidcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVNwZWNOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0UHJvcFR5cGVzU2VjcmV0XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yICYmICEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyBgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3BlY05hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBlcnJvciArXG4gICAgICAgICAgICAgICAgICAgICAgICAnLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YWNrID0gKGdldFN0YWNrICYmIGdldFN0YWNrKCkpIHx8ICcnO1xuXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICdGYWlsZWQgJyArIGxvY2F0aW9uICsgJyB0eXBlOiAnICsgZXJyb3IubWVzc2FnZSArIHN0YWNrXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzLmpvaW4oJ1xcblxcbicpO1xufVxuIiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuZnVuY3Rpb24gTG9hZGluZyhwcm9wcykge1xuICAgIGlmIChwcm9wcy5pc0xvYWRpbmcpIHtcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC1sb2FkaW5nLWNhbGxiYWNrJyAvPjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbkxvYWRpbmcucHJvcFR5cGVzID0ge1xuICAgIGlzTG9hZGluZzogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChzdGF0ZSA9PiAoe1xuICAgIGlzTG9hZGluZzogc3RhdGUuaXNMb2FkaW5nXG59KSkoTG9hZGluZyk7XG4iLCJpbXBvcnQge1xuICAgIGNvbXBhcmF0b3IsXG4gICAgZXF1YWxzLFxuICAgIGZvckVhY2gsXG4gICAgaGFzLFxuICAgIGlzRW1wdHksXG4gICAgbHQsXG4gICAgcGF0aCxcbiAgICBwYXRoT3IsXG4gICAgc29ydFxufSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IGFwaVRodW5rIGZyb20gJy4uLy4uL2FjdGlvbnMvYXBpJztcblxuY2xhc3MgUmVsb2FkZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgaWYgKHByb3BzLmNvbmZpZy5ob3RfcmVsb2FkKSB7XG4gICAgICAgICAgICBjb25zdCB7aW50ZXJ2YWwsIG1heF9yZXRyeX0gPSBwcm9wcy5jb25maWcuaG90X3JlbG9hZDtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgaW50ZXJ2YWwsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGludGVydmFsSWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgcGFja2FnZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgbWF4X3JldHJ5XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZXRyeSA9IDA7XG4gICAgICAgIHRoaXMuX2hlYWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkJyk7XG4gICAgICAgIHRoaXMuY2xlYXJJbnRlcnZhbCA9IHRoaXMuY2xlYXJJbnRlcnZhbC5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIGNsZWFySW50ZXJ2YWwoKSB7XG4gICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuc3RhdGUuaW50ZXJ2YWxJZCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2ludGVydmFsSWQ6IG51bGx9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIFNhdmUgdGhlIG5vbi1sb2FkaW5nIHJlcXVlc3RzIGluIHRoZSBzdGF0ZSBpbiBvcmRlciB0byBjb21wYXJlXG4gICAgICAgICAqIGN1cnJlbnQgaGFzaGVzIHdpdGggcHJldmlvdXMgaGFzaGVzLlxuICAgICAgICAgKiBOb3RlIHRoYXQgaWYgdGhlcmUgd2Fzbid0IGEgXCJsb2FkaW5nXCIgc3RhdGUgZm9yIHRoZSByZXF1ZXN0cyxcbiAgICAgICAgICogdGhlbiB3ZSAgY291bGQgc2ltcGx5IGNvbXBhcmUgYHByb3BzYCB3aXRoIGBwcmV2UHJvcHNgIGluXG4gICAgICAgICAqIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWlzRW1wdHkocHJvcHMucmVsb2FkUmVxdWVzdCkgJiZcbiAgICAgICAgICAgIHByb3BzLnJlbG9hZFJlcXVlc3Quc3RhdHVzICE9PSAnbG9hZGluZydcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4ge3JlbG9hZFJlcXVlc3Q6IHByb3BzLnJlbG9hZFJlcXVlc3R9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgICBjb25zdCB7cmVsb2FkUmVxdWVzdH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBjb25zdCB7ZGlzcGF0Y2h9ID0gdGhpcy5wcm9wcztcblxuICAgICAgICAvLyBJbiB0aGUgYmVnaW5uaW5nLCByZWxvYWRSZXF1ZXN0IHdvbid0IGJlIGRlZmluZWRcbiAgICAgICAgaWYgKCFyZWxvYWRSZXF1ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgKiBXaGVuIHJlbG9hZFJlcXVlc3QgaXMgZmlyc3QgZGVmaW5lZCwgcHJldlN0YXRlIHdvbid0IGJlIGRlZmluZWRcbiAgICAgICAgICogZm9yIG9uZSByZW5kZXIgbG9vcC5cbiAgICAgICAgICogVGhlIGZpcnN0IHJlbG9hZFJlcXVlc3QgZGVmaW5lcyB0aGUgaW5pdGlhbC9iYXNlbGluZSBoYXNoIC1cbiAgICAgICAgICogaXQgZG9lc24ndCByZXF1aXJlIGEgcmVsb2FkXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoIWhhcygncmVsb2FkUmVxdWVzdCcsIHByZXZTdGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHJlbG9hZFJlcXVlc3Quc3RhdHVzID09PSAyMDAgJiZcbiAgICAgICAgICAgIHBhdGgoWydjb250ZW50JywgJ3JlbG9hZEhhc2gnXSwgcmVsb2FkUmVxdWVzdCkgIT09XG4gICAgICAgICAgICAgICAgcGF0aChbJ3JlbG9hZFJlcXVlc3QnLCAnY29udGVudCcsICdyZWxvYWRIYXNoJ10sIHByZXZTdGF0ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgQ1NTICghY29udGVudC5oYXJkKSBvciBuZXcgcGFja2FnZSBhc3NldHNcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICByZWxvYWRSZXF1ZXN0LmNvbnRlbnQuaGFyZCB8fFxuICAgICAgICAgICAgICAgICFlcXVhbHMoXG4gICAgICAgICAgICAgICAgICAgIHJlbG9hZFJlcXVlc3QuY29udGVudC5wYWNrYWdlcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHBhdGhPcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgWydyZWxvYWRSZXF1ZXN0JywgJ2NvbnRlbnQnLCAncGFja2FnZXMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZTdGF0ZVxuICAgICAgICAgICAgICAgICAgICApLmxlbmd0aFxuICAgICAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgICAgICAhZXF1YWxzKFxuICAgICAgICAgICAgICAgICAgICBzb3J0KGNvbXBhcmF0b3IobHQpLCByZWxvYWRSZXF1ZXN0LmNvbnRlbnQucGFja2FnZXMpLFxuICAgICAgICAgICAgICAgICAgICBzb3J0KFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyYXRvcihsdCksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoT3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydyZWxvYWRSZXF1ZXN0JywgJ2NvbnRlbnQnLCAncGFja2FnZXMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2U3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIExvb2sgaWYgaXQgd2FzIGEgY3NzIGZpbGUuXG4gICAgICAgICAgICAgICAgbGV0IHdhc19jc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYSBvZiByZWxvYWRSZXF1ZXN0LmNvbnRlbnQuZmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEuaXNfY3NzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YXNfY3NzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzVG9EaXNhYmxlID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIG9sZCBmaWxlIGJ5IHhwYXRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXQgPSBkb2N1bWVudC5ldmFsdWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgLy9saW5rW2NvbnRhaW5zKEBocmVmLCBcIiR7YS51cmx9XCIpXWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faGVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlID0gaXQuaXRlcmF0ZU5leHQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvRGlzYWJsZS5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBpdC5pdGVyYXRlTmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPT4gbi5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb0Rpc2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLm1vZGlmaWVkID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay5ocmVmID0gYCR7YS51cmx9P209JHthLm1vZGlmaWVkfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9oZWFkLmFwcGVuZENoaWxkKGxpbmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVsc2UgdGhlIGZpbGUgd2FzIGRlbGV0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGFub3RoZXIga2luZCBvZiBmaWxlIGhlcmUgZG8gYSBoYXJkIHJlbG9hZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdhc19jc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghd2FzX2Nzcykge1xuICAgICAgICAgICAgICAgICAgICAvLyBBc3NldHMgZmlsZSBoYXZlIGNoYW5nZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gb3IgYSBjb21wb25lbnQgbGliIGhhcyBiZWVuIGFkZGVkL3JlbW92ZWQgLVxuICAgICAgICAgICAgICAgICAgICAvLyBNdXN0IGRvIGEgaGFyZCByZWxvYWRcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQmFja2VuZCBjb2RlIGNoYW5nZWQgLSBjYW4gZG8gYSBzb2Z0IHJlbG9hZCBpbiBwbGFjZVxuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHt0eXBlOiAnUkVMT0FEJ30pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5pbnRlcnZhbElkICE9PSBudWxsICYmXG4gICAgICAgICAgICByZWxvYWRSZXF1ZXN0LnN0YXR1cyA9PT0gNTAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JldHJ5ID4gdGhpcy5zdGF0ZS5tYXhfcmV0cnkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFySW50ZXJ2YWwoKTtcbiAgICAgICAgICAgICAgICAvLyBJbnRlZ3JhdGUgd2l0aCBkZXYgdG9vbHMgdWk/IVxuICAgICAgICAgICAgICAgIHdpbmRvdy5hbGVydChcbiAgICAgICAgICAgICAgICAgICAgYEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQgYWZ0ZXIgZmFpbGluZyAke3RoaXMuX3JldHJ5fSB0aW1lcy4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnUGxlYXNlIGNoZWNrIHlvdXIgYXBwbGljYXRpb24gZm9yIGVycm9ycywgdGhlbiByZWZyZXNoIHRoZSBwYWdlLidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmV0cnkrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICBjb25zdCB7ZGlzcGF0Y2gsIHJlbG9hZFJlcXVlc3R9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3Qge2Rpc2FibGVkLCBpbnRlcnZhbH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBpZiAoIWRpc2FibGVkICYmICF0aGlzLnN0YXRlLmludGVydmFsSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgcmVxdWVzdHMgZnJvbSBwaWxpbmcgdXAgLSByZWxvYWRpbmcgY2FuIHRha2VcbiAgICAgICAgICAgICAgICAvLyBtYW55IHNlY29uZHMgKDEwLTMwKSBhbmQgdGhlIGludGVydmFsIGlzIDNzIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgICAgICBpZiAocmVsb2FkUmVxdWVzdC5zdGF0dXMgIT09ICdsb2FkaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChhcGlUaHVuaygnX3JlbG9hZC1oYXNoJywgJ0dFVCcsICdyZWxvYWRSZXF1ZXN0JykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGludGVydmFsKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2ludGVydmFsSWR9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGUuZGlzYWJsZWQgJiYgdGhpcy5zdGF0ZS5pbnRlcnZhbElkKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFySW50ZXJ2YWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5SZWxvYWRlci5kZWZhdWx0UHJvcHMgPSB7fTtcblxuUmVsb2FkZXIucHJvcFR5cGVzID0ge1xuICAgIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNvbmZpZzogUHJvcFR5cGVzLm9iamVjdCxcbiAgICByZWxvYWRSZXF1ZXN0OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGRpc3BhdGNoOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBpbnRlcnZhbDogUHJvcFR5cGVzLm51bWJlclxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChcbiAgICBzdGF0ZSA9PiAoe1xuICAgICAgICBjb25maWc6IHN0YXRlLmNvbmZpZyxcbiAgICAgICAgcmVsb2FkUmVxdWVzdDogc3RhdGUucmVsb2FkUmVxdWVzdFxuICAgIH0pLFxuICAgIGRpc3BhdGNoID0+ICh7ZGlzcGF0Y2h9KVxuKShSZWxvYWRlcik7XG4iLCJpbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtyZWRvLCB1bmRvfSBmcm9tICcuLi8uLi9hY3Rpb25zL2luZGV4LmpzJztcbmltcG9ydCAnLi9Ub29sYmFyLmNzcyc7XG5cbmZ1bmN0aW9uIFVuY29ubmVjdGVkVG9vbGJhcihwcm9wcykge1xuICAgIGNvbnN0IHtkaXNwYXRjaCwgaGlzdG9yeX0gPSBwcm9wcztcblxuICAgIGNvbnN0IHVuZG9MaW5rID0gKFxuICAgICAgICA8c3BhblxuICAgICAgICAgICAga2V5PSd1bmRvTGluaydcbiAgICAgICAgICAgIGNsYXNzTmFtZT0nX2Rhc2gtdW5kby1yZWRvLWxpbmsnXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBkaXNwYXRjaCh1bmRvKX1cbiAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J19kYXNoLWljb24tdW5kbyc+4oa6PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtdW5kby1yZWRvLWxhYmVsJz51bmRvPC9kaXY+XG4gICAgICAgIDwvc3Bhbj5cbiAgICApO1xuXG4gICAgY29uc3QgcmVkb0xpbmsgPSAoXG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICBrZXk9J3JlZG9MaW5rJ1xuICAgICAgICAgICAgY2xhc3NOYW1lPSdfZGFzaC11bmRvLXJlZG8tbGluaydcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGRpc3BhdGNoKHJlZG8pfVxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtaWNvbi1yZWRvJz7ihrs8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC11bmRvLXJlZG8tbGFiZWwnPnJlZG88L2Rpdj5cbiAgICAgICAgPC9zcGFuPlxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtdW5kby1yZWRvJz5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAge2hpc3RvcnkucGFzdC5sZW5ndGggPiAwID8gdW5kb0xpbmsgOiBudWxsfVxuICAgICAgICAgICAgICAgIHtoaXN0b3J5LmZ1dHVyZS5sZW5ndGggPiAwID8gcmVkb0xpbmsgOiBudWxsfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59XG5cblVuY29ubmVjdGVkVG9vbGJhci5wcm9wVHlwZXMgPSB7XG4gICAgaGlzdG9yeTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBkaXNwYXRjaDogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbmNvbnN0IFRvb2xiYXIgPSBjb25uZWN0KFxuICAgIHN0YXRlID0+ICh7XG4gICAgICAgIGhpc3Rvcnk6IHN0YXRlLmhpc3RvcnlcbiAgICB9KSxcbiAgICBkaXNwYXRjaCA9PiAoe2Rpc3BhdGNofSlcbikoVW5jb25uZWN0ZWRUb29sYmFyKTtcblxuZXhwb3J0IGRlZmF1bHQgVG9vbGJhcjtcbiIsImltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgdXNlU3RhdGUsIHVzZU1lbW8sIHVzZUVmZmVjdCwgdXNlUmVmfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtjb25uZWN0LCB1c2VTZWxlY3Rvcn0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IEN5dG9zY2FwZSBmcm9tICdjeXRvc2NhcGUnO1xuaW1wb3J0IEN5dG9zY2FwZUNvbXBvbmVudCBmcm9tICdyZWFjdC1jeXRvc2NhcGVqcyc7XG5pbXBvcnQgZGFncmUgZnJvbSAnY3l0b3NjYXBlLWRhZ3JlJztcbmltcG9ydCBmY29zZSBmcm9tICdjeXRvc2NhcGUtZmNvc2UnO1xuaW1wb3J0IHtKU09OVHJlZX0gZnJvbSAncmVhY3QtanNvbi10cmVlJztcbmltcG9ydCB7a2V5cywgbWVyZ2VSaWdodCwgb21pdCwgcGF0aCwgdmFsdWVzfSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCB7Z2V0UGF0aH0gZnJvbSAnLi4vLi4vLi4vYWN0aW9ucy9wYXRocyc7XG5pbXBvcnQge3N0cmluZ2lmeUlkfSBmcm9tICcuLi8uLi8uLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQge29uRXJyb3J9IGZyb20gJy4uLy4uLy4uL2FjdGlvbnMnO1xuXG5pbXBvcnQgJy4vQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5jc3MnO1xuaW1wb3J0IHN0eWxlc2hlZXQgZnJvbSAnLi9DYWxsYmFja0dyYXBoQ29udGFpbmVyU3R5bGVzaGVldCc7XG5pbXBvcnQge1xuICAgIHVwZGF0ZVNlbGVjdGVkTm9kZSxcbiAgICB1cGRhdGVDaGFuZ2VkUHJvcHMsXG4gICAgdXBkYXRlQ2FsbGJhY2tcbn0gZnJvbSAnLi9DYWxsYmFja0dyYXBoRWZmZWN0cyc7XG5cbkN5dG9zY2FwZS51c2UoZGFncmUpO1xuQ3l0b3NjYXBlLnVzZShmY29zZSk7XG5cbi8qXG4gKiBHZW5lcmF0ZXMgYWxsIHRoZSBlbGVtZW50cyAobm9kZXMsIGVkZ2VzKSBmb3IgdGhlIGRlcGVuZGVuY3kgZ3JhcGguXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlRWxlbWVudHMoZ3JhcGhzLCBwcm9maWxlLCBleHRyYUxpbmtzKSB7XG4gICAgY29uc3QgY29uc3VtZWQgPSBbXTtcbiAgICBjb25zdCBlbGVtZW50cyA9IFtdO1xuICAgIGNvbnN0IHN0cnVjdHVyZSA9IHt9O1xuXG4gICAgZnVuY3Rpb24gcmVjb3JkTm9kZShpZCwgcmF3UHJvcGVydHkpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSByYXdQcm9wZXJ0eS5zcGxpdCgnQCcpWzBdO1xuICAgICAgICBjb25zdCBpZFN0ciA9IHN0cmluZ2lmeUlkKGlkKTtcbiAgICAgICAgY29uc3QgaWRUeXBlID0gdHlwZW9mIGlkID09PSAnb2JqZWN0JyA/ICd3aWxkY2FyZCcgOiAnY29tcG9uZW50JztcblxuICAgICAgICAvLyBkYWdyZSBsYXlvdXQgaGFzIHByb2JsZW1zIHdpdGggZWcgYHdpZHRoYCBwcm9wZXJ0eSAtIHNvIHByZXBlbmQgYW4gWFxuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IGlkU3RyO1xuICAgICAgICBjb25zdCBjaGlsZElkID0gYCR7cGFyZW50SWR9Llgke3Byb3BlcnR5fWA7XG5cbiAgICAgICAgaWYgKCFjb25zdW1lZC5pbmNsdWRlcyhwYXJlbnRJZCkpIHtcbiAgICAgICAgICAgIGNvbnN1bWVkLnB1c2gocGFyZW50SWQpO1xuICAgICAgICAgICAgZWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBpZDogcGFyZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpZFN0cixcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogaWRUeXBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdHJ1Y3R1cmVbcGFyZW50SWRdID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbnN1bWVkLmluY2x1ZGVzKGNoaWxkSWQpKSB7XG4gICAgICAgICAgICBjb25zdW1lZC5wdXNoKGNoaWxkSWQpO1xuICAgICAgICAgICAgZWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBpZDogY2hpbGRJZCxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IHBhcmVudElkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAncHJvcGVydHknXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdHJ1Y3R1cmVbcGFyZW50SWRdLnB1c2goY2hpbGRJZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hpbGRJZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWNvcmRFZGdlKHNvdXJjZSwgdGFyZ2V0LCB0eXBlKSB7XG4gICAgICAgIGVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgKGdyYXBocy5jYWxsYmFja3MgfHwgW10pLnJlZHVjZSgodmlzaWJsZUluZGV4LCBjYWxsYmFjaykgPT4ge1xuICAgICAgICBpZiAoY2FsbGJhY2suaGlkZGVuKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlzaWJsZUluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2IgPSBgX19kYXNoX2NhbGxiYWNrX18uJHtjYWxsYmFjay5vdXRwdXR9YDtcbiAgICAgICAgY29uc3QgY2JQcm9maWxlID0gcHJvZmlsZS5jYWxsYmFja3NbY2FsbGJhY2sub3V0cHV0XSB8fCB7fTtcbiAgICAgICAgY29uc3QgY291bnQgPSBjYlByb2ZpbGUuY291bnQgfHwgMDtcbiAgICAgICAgY29uc3QgdGltZSA9IGNiUHJvZmlsZS50b3RhbCB8fCAwO1xuXG4gICAgICAgIGVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGlkOiBjYixcbiAgICAgICAgICAgICAgICBsYWJlbDogYGNhbGxiYWNrLiR7dmlzaWJsZUluZGV4fWAsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2NhbGxiYWNrJyxcbiAgICAgICAgICAgICAgICBtb2RlOiBjYWxsYmFjay5jbGllbnRzaWRlX2Z1bmN0aW9uID8gJ2NsaWVudCcgOiAnc2VydmVyJyxcbiAgICAgICAgICAgICAgICBjb3VudDogY291bnQsXG4gICAgICAgICAgICAgICAgdGltZTogY291bnQgPiAwID8gTWF0aC5yb3VuZCh0aW1lIC8gY291bnQpIDogMCxcbiAgICAgICAgICAgICAgICBsb2FkaW5nU2V0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgIGVycm9yU2V0OiBEYXRlLm5vdygpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNhbGxiYWNrLm91dHB1dHMuZm9yRWFjaCgoe2lkLCBwcm9wZXJ0eX0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVJZCA9IHJlY29yZE5vZGUoaWQsIHByb3BlcnR5KTtcbiAgICAgICAgICAgIHJlY29yZEVkZ2UoY2IsIG5vZGVJZCwgJ291dHB1dCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjYWxsYmFjay5pbnB1dHMuZm9yRWFjaCgoe2lkLCBwcm9wZXJ0eX0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVJZCA9IHJlY29yZE5vZGUoaWQsIHByb3BlcnR5KTtcbiAgICAgICAgICAgIHJlY29yZEVkZ2Uobm9kZUlkLCBjYiwgJ2lucHV0Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNhbGxiYWNrLnN0YXRlLmZvckVhY2goKHtpZCwgcHJvcGVydHl9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub2RlSWQgPSByZWNvcmROb2RlKGlkLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgICByZWNvcmRFZGdlKG5vZGVJZCwgY2IsICdzdGF0ZScpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmlzaWJsZUluZGV4ICsgMTtcbiAgICB9LCAwKTtcblxuICAgIC8vIHB1bGwgdG9nZXRoZXIgcHJvcHMgaW4gdGhlIHNhbWUgY29tcG9uZW50XG4gICAgaWYgKGV4dHJhTGlua3MpIHtcbiAgICAgICAgdmFsdWVzKHN0cnVjdHVyZSkuZm9yRWFjaChjaGlsZElkcyA9PiB7XG4gICAgICAgICAgICBjaGlsZElkcy5mb3JFYWNoKGNoaWxkRnJvbSA9PiB7XG4gICAgICAgICAgICAgICAgY2hpbGRJZHMuZm9yRWFjaChjaGlsZFRvID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRnJvbSAhPT0gY2hpbGRUbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkRWRnZShjaGlsZEZyb20sIGNoaWxkVG8sICdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50cztcbn1cblxuZnVuY3Rpb24gcmVkdWNlU3RhdHVzKHN0YXR1cykge1xuICAgIGlmIChrZXlzKHN0YXR1cykubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHJldHVybiBzdGF0dXMubGF0ZXN0O1xuICAgIH1cbiAgICByZXR1cm4gc3RhdHVzO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuT3V0cHV0cyhyZXMpIHtcbiAgICBjb25zdCBvdXRwdXRzID0ge307XG4gICAgZm9yIChjb25zdCBpZFN0ciBpbiByZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHJlc1tpZFN0cl0pIHtcbiAgICAgICAgICAgIG91dHB1dHNbaWRTdHIgKyAnLicgKyBwcm9wXSA9IHJlc1tpZFN0cl1bcHJvcF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dHM7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5JbnB1dHMoaW5BcnJheSwgZmluYWwpIHtcbiAgICAoaW5BcnJheSB8fCBbXSkuZm9yRWFjaChpbkl0ZW0gPT4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbkl0ZW0pKSB7XG4gICAgICAgICAgICBmbGF0dGVuSW5wdXRzKGluSXRlbSwgZmluYWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qge2lkLCBwcm9wZXJ0eSwgdmFsdWV9ID0gaW5JdGVtO1xuICAgICAgICAgICAgZmluYWxbc3RyaW5naWZ5SWQoaWQpICsgJy4nICsgcHJvcGVydHldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmluYWw7XG59XG5cbmZ1bmN0aW9uIGNsZWFuT3V0cHV0SWQob3V0cHV0SWQpIHtcbiAgICByZXR1cm4gb3V0cHV0SWRcbiAgICAgICAgLnJlcGxhY2UoLyheXFwuXFwufFxcLlxcLiQpL2csICcnKVxuICAgICAgICAuc3BsaXQoJy4uLicpXG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAoYWdnLCBuZXh0KSA9PlxuICAgICAgICAgICAgICAgIGFnZy5jb25jYXQoXG4gICAgICAgICAgICAgICAgICAgIG5leHQucmVwbGFjZSgvKC4qXFwuLiopKEAuKykkLywgKGEsIGIpID0+IGIgKyAnIChEdXBsaWNhdGUpJylcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgW11cbiAgICAgICAgKVxuICAgICAgICAuam9pbignLi4uJyk7XG59XG5cbi8vIGxlbignX19kYXNoX2NhbGxiYWNrX18uJylcbmNvbnN0IGNiUHJlZml4TGVuID0gMTg7XG5cbmNvbnN0IGRhZ3JlTGF5b3V0ID0ge1xuICAgIG5hbWU6ICdkYWdyZScsXG4gICAgcGFkZGluZzogMTAsXG4gICAgcmFua2VyOiAndGlnaHQtdHJlZSdcbn07XG5cbmNvbnN0IGZvcmNlTGF5b3V0ID0ge25hbWU6ICdmY29zZScsIHBhZGRpbmc6IDEwLCBhbmltYXRlOiBmYWxzZX07XG5cbmNvbnN0IGxheW91dHMgPSB7XG4gICAgJ3RvcC1kb3duJzogey4uLmRhZ3JlTGF5b3V0LCBzcGFjaW5nRmFjdG9yOiAwLjh9LFxuICAgICdsZWZ0LXJpZ2h0Jzogey4uLmRhZ3JlTGF5b3V0LCBub2RlU2VwOiAwLCByYW5rU2VwOiA4MCwgcmFua0RpcjogJ0xSJ30sXG4gICAgZm9yY2U6IGZvcmNlTGF5b3V0LFxuICAgICdmb3JjZS1sb29zZSc6IGZvcmNlTGF5b3V0XG59O1xuXG5mdW5jdGlvbiBDYWxsYmFja0dyYXBoKCkge1xuICAgIC8vIEdyYWIgaXRlbXMgZnJvbSB0aGUgcmVkdXggc3RvcmUuXG4gICAgY29uc3QgcGF0aHMgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5wYXRocyk7XG4gICAgY29uc3QgbGF5b3V0ID0gdXNlU2VsZWN0b3Ioc3RhdGUgPT4gc3RhdGUubGF5b3V0KTtcbiAgICBjb25zdCBncmFwaHMgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5ncmFwaHMpO1xuICAgIGNvbnN0IHByb2ZpbGUgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5wcm9maWxlKTtcbiAgICBjb25zdCBjaGFuZ2VkID0gdXNlU2VsZWN0b3Ioc3RhdGUgPT4gc3RhdGUuY2hhbmdlZCk7XG4gICAgY29uc3QgbGlmZWN5Y2xlU3RhdGUgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5hcHBMaWZlY3ljbGUpO1xuXG4gICAgLy8gS2VlcCB0cmFjayBvZiBjeXRvc2NhcGUgcmVmZXJlbmNlIGFuZCB1c2VyIHNlbGVjdGVkIGl0ZW1zLlxuICAgIGNvbnN0IFtzZWxlY3RlZCwgc2V0U2VsZWN0ZWRdID0gdXNlU3RhdGUobnVsbCk7XG4gICAgY29uc3QgW2N5dG9zY2FwZSwgc2V0Q3l0b3NjYXBlXSA9IHVzZVN0YXRlKG51bGwpO1xuXG4gICAgY29uc3Qge2dyYXBoTGF5b3V0fSA9IHByb2ZpbGU7XG4gICAgY29uc3QgY2hvc2VuVHlwZSA9IGdyYXBoTGF5b3V0Py5fY2hvc2VuVHlwZTtcbiAgICBjb25zdCBsYXlvdXRTZWxlY3RvciA9IHVzZVJlZihudWxsKTtcbiAgICBjb25zdCBbbGF5b3V0VHlwZSwgc2V0TGF5b3V0VHlwZV0gPSB1c2VTdGF0ZShjaG9zZW5UeXBlIHx8ICd0b3AtZG93bicpO1xuXG4gICAgLy8gR2VuZXJhdGUgYW5kIG1lbW9pemUgdGhlIGVsZW1lbnRzLlxuICAgIGNvbnN0IGVsZW1lbnRzID0gdXNlTWVtbyhcbiAgICAgICAgKCkgPT4gZ2VuZXJhdGVFbGVtZW50cyhncmFwaHMsIHByb2ZpbGUsIGxheW91dFR5cGUgPT09ICdmb3JjZScpLFxuICAgICAgICBbZ3JhcGhzLCBsYXlvdXRUeXBlXVxuICAgICk7XG5cbiAgICAvLyBDdXN0b20gaG9vayB0byBtYWtlIHN1cmUgY3l0b3NjYXBlIGlzIGxvYWRlZC5cbiAgICBjb25zdCB1c2VDeXRvc2NhcGVFZmZlY3QgPSAoZWZmZWN0LCBjb25kaXRpb24pID0+IHtcbiAgICAgICAgdXNlRWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4gKGN5dG9zY2FwZSAmJiBlZmZlY3QoY3l0b3NjYXBlKSkgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29uZGl0aW9uXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudChpZCkge1xuICAgICAgICAvLyBmb3Igbm93IGlnbm9yZSBwYXR0ZXJuLW1hdGNoaW5nIElEc1xuICAgICAgICAvLyB0byBkbyBiZXR0ZXIgd2UgbWF5IG5lZWQgdG8gc3RvcmUgdGhlICphY3R1YWwqIElEcyB1c2VkIGZvciBlYWNoXG4gICAgICAgIC8vIGNhbGxiYWNrIGludm9jYXRpb24sIHNpbmNlIHRoZXkgbmVlZCBub3QgbWF0Y2ggd2hhdCdzIG9uIHRoZSBwYWdlIG5vdy5cbiAgICAgICAgaWYgKGlkLmNoYXJBdCgwKSA9PT0gJ3snKSB7XG4gICAgICAgICAgICBoYXNQYXR0ZXJucyA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlkUGF0aCA9IGdldFBhdGgocGF0aHMsIGlkKTtcbiAgICAgICAgcmV0dXJuIGlkUGF0aCA/IHBhdGgoaWRQYXRoLCBsYXlvdXQpIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFByb3BWYWx1ZShkYXRhKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGdldENvbXBvbmVudChkYXRhLnBhcmVudCk7XG4gICAgICAgIHJldHVybiBwYXJlbnQgPyBwYXJlbnQucHJvcHNbZGF0YS5sYWJlbF0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0UHJlc2V0TGF5b3V0KHtjeX0pIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb25zID0ge307XG4gICAgICAgIGN5Lm5vZGVzKCkuZWFjaChuID0+IHtcbiAgICAgICAgICAgIHBvc2l0aW9uc1tuLmlkKCldID0gbi5wb3NpdGlvbigpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBIYWNrISBXZSdyZSBtdXRhdGluZyB0aGUgcmVkdXggc3RvcmUgZGlyZWN0bHkgaGVyZSwgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gZGlzcGF0Y2hpbmcgYW4gYWN0aW9uLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdGhpcyB0byB0cmlnZ2VyIGFcbiAgICAgICAgLy8gcmVyZW5kZXIsIHdlIGp1c3Qgd2FudCB0aGUgbGF5b3V0IHRvIHBlcnNpc3Qgd2hlbiB0aGUgY2FsbGJhY2sgZ3JhcGhcbiAgICAgICAgLy8gaXMgcmVyZW5kZXJlZCAtIGVpdGhlciBiZWNhdXNlIHRoZXJlJ3MgbmV3IHByb2ZpbGUgaW5mb3JtYXRpb24gdG9cbiAgICAgICAgLy8gZGlzcGxheSBvciBiZWNhdXNlIHRoZSBncmFwaCB3YXMgY2xvc2VkIGFuZCByZW9wZW5lZC4gVGhlIGxhdHRlciBpc1xuICAgICAgICAvLyB0aGUgcmVhc29uIHdlJ3JlIG5vdCB1c2luZyBjb21wb25lbnQgc3RhdGUgdG8gc3RvcmUgdGhlIGxheW91dC5cbiAgICAgICAgcHJvZmlsZS5ncmFwaExheW91dCA9IHtcbiAgICAgICAgICAgIG5hbWU6ICdwcmVzZXQnLFxuICAgICAgICAgICAgZml0OiBmYWxzZSxcbiAgICAgICAgICAgIHBvc2l0aW9ucyxcbiAgICAgICAgICAgIHpvb206IGN5Lnpvb20oKSxcbiAgICAgICAgICAgIHBhbjogY3kucGFuKCksXG4gICAgICAgICAgICBfY2hvc2VuVHlwZTogbGF5b3V0U2VsZWN0b3IuY3VycmVudD8udmFsdWVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBZGRzIGNhbGxiYWNrcyBvbmNlIGN5Y3Rvc2NhcGUgaXMgaW5pdGlhbGl6ZWQuXG4gICAgdXNlQ3l0b3NjYXBlRWZmZWN0KFxuICAgICAgICBjeSA9PiB7XG4gICAgICAgICAgICBjeXRvc2NhcGUub24oJ3RhcCcsICdub2RlJywgZSA9PiBzZXRTZWxlY3RlZChlLnRhcmdldCkpO1xuICAgICAgICAgICAgY3l0b3NjYXBlLm9uKCd0YXAnLCBlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IGN5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkKG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY3l0b3NjYXBlLm9uKCd6b29tJywgc2V0UHJlc2V0TGF5b3V0KTtcbiAgICAgICAgICAgIGN5dG9zY2FwZS5vbigncGFuJywgc2V0UHJlc2V0TGF5b3V0KTtcbiAgICAgICAgICAgIGN5dG9zY2FwZS5ub2RlcygpLm9uKCdwb3NpdGlvbicsIHNldFByZXNldExheW91dCk7XG4gICAgICAgIH0sXG4gICAgICAgIFtjeXRvc2NhcGVdXG4gICAgKTtcblxuICAgIC8vIFNldCBub2RlIGNsYXNzZXMgb24gc2VsZWN0ZWQuXG4gICAgdXNlQ3l0b3NjYXBlRWZmZWN0KFxuICAgICAgICBjeSA9PiBzZWxlY3RlZCAmJiB1cGRhdGVTZWxlY3RlZE5vZGUoY3ksIHNlbGVjdGVkLmRhdGEoKS5pZCksXG4gICAgICAgIFtzZWxlY3RlZF1cbiAgICApO1xuXG4gICAgLy8gRmxhc2ggY2xhc3NlcyB3aGVuIHByb3BzIGNoYW5nZS4gVXNlcyBjaGFuZ2VkIGFzIGEgdHJpZ2dlci4gQWxzb1xuICAgIC8vIGZsYXNoIGFsbCBpbnB1dCBlZGdlcyBvcmlnaW5hdGluZyBmcm9tIHRoaXMgbm9kZSBhbmQgaGlnaGxpZ2h0XG4gICAgLy8gdGhlIHN1YnRyZWUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgbm9kZS5cbiAgICB1c2VDeXRvc2NhcGVFZmZlY3QoXG4gICAgICAgIGN5ID0+IGNoYW5nZWQgJiYgdXBkYXRlQ2hhbmdlZFByb3BzKGN5LCBjaGFuZ2VkLmlkLCBjaGFuZ2VkLnByb3BzKSxcbiAgICAgICAgW2NoYW5nZWRdXG4gICAgKTtcblxuICAgIC8vIFVwZGF0ZSBjYWxsYmFja3MgZnJvbSBwcm9maWxpbmcgaW5mb3JtYXRpb24uXG4gICAgdXNlQ3l0b3NjYXBlRWZmZWN0KFxuICAgICAgICBjeSA9PlxuICAgICAgICAgICAgcHJvZmlsZS51cGRhdGVkLmZvckVhY2goY2IgPT5cbiAgICAgICAgICAgICAgICB1cGRhdGVDYWxsYmFjayhjeSwgY2IsIHByb2ZpbGUuY2FsbGJhY2tzW2NiXSlcbiAgICAgICAgICAgICksXG4gICAgICAgIFtwcm9maWxlLnVwZGF0ZWRdXG4gICAgKTtcblxuICAgIGlmIChsaWZlY3ljbGVTdGF0ZSAhPT0gJ0hZRFJBVEVEJykge1xuICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSB0b28gZWFybHkgLSBtb3N0IGxpa2VseSBkdXJpbmcgaG90IHJlbG9hZGluZyAtIHRoZW5cbiAgICAgICAgLy8gd2UgbmVlZCB0byBiYWlsIG91dCBhbmQgd2FpdCBmb3IgdGhlIGZ1bGwgc3RhdGUgdG8gYmUgYXZhaWxhYmxlXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1jYWxsYmFjay1kYWctLWNvbnRhaW5lcic+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtY2FsbGJhY2stZGFnLS1tZXNzYWdlJz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5XYWl0aW5nIGZvciBhcHAgdG8gYmUgcmVhZHkuLi48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIEZJWE1FOiBNb3ZlIHRvIGEgbmV3IGNvbXBvbmVudD9cbiAgICAvLyBHZW5lcmF0ZSB0aGUgZWxlbWVudCBpbnRyb3NwZWN0aW9uIGRhdGEuXG4gICAgbGV0IGVsZW1lbnROYW1lID0gJyc7XG4gICAgbGV0IGVsZW1lbnRJbmZvID0ge307XG4gICAgbGV0IGhhc1BhdHRlcm5zID0gZmFsc2U7XG5cbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHNlbGVjdGVkLmRhdGEoKTtcblxuICAgICAgICBzd2l0Y2ggKGRhdGEudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnY29tcG9uZW50Jzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3QgPSBvbWl0KFsnaWQnXSwgZ2V0Q29tcG9uZW50KGRhdGEuaWQpPy5wcm9wcyk7XG4gICAgICAgICAgICAgICAgZWxlbWVudEluZm8gPSByZXN0O1xuICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gZGF0YS5pZDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAncHJvcGVydHknOiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSBkYXRhLnBhcmVudDtcbiAgICAgICAgICAgICAgICBlbGVtZW50SW5mb1tkYXRhLmxhYmVsXSA9IGdldFByb3BWYWx1ZShkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2FsbGJhY2tcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50SW5mby50eXBlID0gZGF0YS5tb2RlO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHVpZCBhbmQgc2V0IHByb2ZpbGUuXG4gICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tPdXRwdXRJZCA9IGRhdGEuaWQuc2xpY2UoY2JQcmVmaXhMZW4pO1xuICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gY2xlYW5PdXRwdXRJZChjYWxsYmFja091dHB1dElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYlByb2ZpbGUgPSBwcm9maWxlLmNhbGxiYWNrc1tjYWxsYmFja091dHB1dElkXTtcbiAgICAgICAgICAgICAgICBpZiAoY2JQcm9maWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yayxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgICAgICAgICAgIH0gPSBjYlByb2ZpbGU7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXZnID0gdiA9PiBNYXRoLnJvdW5kKHYgLyAoY291bnQgfHwgMSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvWydjYWxsIGNvdW50J10gPSBjb3VudDtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluZm8uc3RhdHVzID0gcmVkdWNlU3RhdHVzKHN0YXR1cyk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltaW5nID0gKGVsZW1lbnRJbmZvWyd0aW1lIChhdmcgbWlsbGlzZWNvbmRzKSddID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw6IGF2Zyh0b3RhbCksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlOiBhdmcoY29tcHV0ZSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLm1vZGUgPT09ICdzZXJ2ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1pbmcubmV0d29yayA9IGF2ZyhuZXR3b3JrLnRpbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5mb1snZGF0YSB0cmFuc2ZlciAoYXZnIGJ5dGVzKSddID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkOiBhdmcobmV0d29yay5kb3dubG9hZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkOiBhdmcobmV0d29yay51cGxvYWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHJlc291cmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltaW5nWyd1c2VyOiAnICsga2V5XSA9IGF2ZyhyZXNvdXJjZXNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5mby5vdXRwdXRzID0gZmxhdHRlbk91dHB1dHMocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluZm8uaW5wdXRzID0gZmxhdHRlbklucHV0cyhpbnB1dHMsIHt9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluZm8uc3RhdGUgPSBmbGF0dGVuSW5wdXRzKHN0YXRlLCB7fSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluZm9bJ2NhbGwgY291bnQnXSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY3lMYXlvdXQgPVxuICAgICAgICBjaG9zZW5UeXBlID09PSBsYXlvdXRUeXBlXG4gICAgICAgICAgICA/IGdyYXBoTGF5b3V0XG4gICAgICAgICAgICA6IG1lcmdlUmlnaHQobGF5b3V0c1tsYXlvdXRUeXBlXSwge3JlYWR5OiBzZXRQcmVzZXRMYXlvdXR9KTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWNhbGxiYWNrLWRhZy0tY29udGFpbmVyJz5cbiAgICAgICAgICAgIDxDeXRvc2NhcGVDb21wb25lbnRcbiAgICAgICAgICAgICAgICBzdHlsZT17e3dpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMCUnfX1cbiAgICAgICAgICAgICAgICBjeT17c2V0Q3l0b3NjYXBlfVxuICAgICAgICAgICAgICAgIGVsZW1lbnRzPXtlbGVtZW50c31cbiAgICAgICAgICAgICAgICBsYXlvdXQ9e2N5TGF5b3V0fVxuICAgICAgICAgICAgICAgIHN0eWxlc2hlZXQ9e3N0eWxlc2hlZXR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge3NlbGVjdGVkID8gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWNhbGxiYWNrLWRhZy0taW5mbyc+XG4gICAgICAgICAgICAgICAgICAgIHtoYXNQYXR0ZXJucyA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyBpc24ndCBzdXBwb3J0ZWQgZm9yIHBhdHRlcm4tbWF0Y2hpbmcgSURzIGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB0aW1lXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICAgIDxKU09OVHJlZVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT17ZWxlbWVudEluZm99XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGVtZT0nc3VtbWVyZnJ1aXQnXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFJlbmRlcmVyPXtfa2V5cyA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9rZXlzLmxlbmd0aCA9PT0gMSA/IGVsZW1lbnROYW1lIDogX2tleXNbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGdldEl0ZW1TdHJpbmc9eyh0eXBlLCBkYXRhLCBpdGVtVHlwZSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPntpdGVtVHlwZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkRXhwYW5kTm9kZT17KGtleU5hbWUsIGRhdGEsIGxldmVsKSA9PiBsZXZlbCA8IDF9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Rhc2gtY2FsbGJhY2stZGFnLS1sYXlvdXRTZWxlY3RvcidcbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17ZSA9PiBzZXRMYXlvdXRUeXBlKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICB2YWx1ZT17bGF5b3V0VHlwZX1cbiAgICAgICAgICAgICAgICByZWY9e2xheW91dFNlbGVjdG9yfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtrZXlzKGxheW91dHMpLm1hcChrID0+IChcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT17a30ga2V5PXtrfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtrfVxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufVxuXG5DYWxsYmFja0dyYXBoLnByb3BUeXBlcyA9IHt9O1xuXG5jbGFzcyBVbmNvbm5lY3RlZENhbGxiYWNrR3JhcGhDb250YWluZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtoYXNFcnJvcjogZmFsc2V9O1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoXykge1xuICAgICAgICByZXR1cm4ge2hhc0Vycm9yOiB0cnVlfTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRDYXRjaChlcnJvciwgaW5mbykge1xuICAgICAgICBjb25zdCB7ZGlzcGF0Y2h9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICBvbkVycm9yKHtcbiAgICAgICAgICAgICAgICBteUlEOiB0aGlzLnN0YXRlLm15SUQsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2Zyb250RW5kJyxcbiAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICBpbmZvXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuaGFzRXJyb3IgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1jYWxsYmFjay1kYWctLWNvbnRhaW5lcic+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtY2FsbGJhY2stZGFnLS1tZXNzYWdlJz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5Pb3BzISBUaGUgY2FsbGJhY2sgZ3JhcGggdGhyZXcgYW4gZXJyb3IuPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+Q2hlY2sgdGhlIGVycm9yIGxpc3QgZm9yIGRldGFpbHMuPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxDYWxsYmFja0dyYXBoIC8+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5VbmNvbm5lY3RlZENhbGxiYWNrR3JhcGhDb250YWluZXIucHJvcFR5cGVzID0ge1xuICAgIGRpc3BhdGNoOiBQcm9wVHlwZXMuZnVuY1xufTtcblxuY29uc3QgQ2FsbGJhY2tHcmFwaENvbnRhaW5lciA9IGNvbm5lY3QobnVsbCwgZGlzcGF0Y2ggPT4gKHtkaXNwYXRjaH0pKShcbiAgICBVbmNvbm5lY3RlZENhbGxiYWNrR3JhcGhDb250YWluZXJcbik7XG5cbmV4cG9ydCB7Q2FsbGJhY2tHcmFwaENvbnRhaW5lcn07XG4iLCJjb25zdCBzdHlsZXNoZWV0ID0gW1xuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICcqJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICdmb250LXNpemUnOiAxMixcbiAgICAgICAgICAgICdmb250LWZhbWlseSc6ICdWZXJkYW5hLCBzYW5zLXNlcmlmJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdlZGdlJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIHdpZHRoOiAyLFxuICAgICAgICAgICAgJ2xpbmUtY29sb3InOiAnIzg4ODg4OCcsXG4gICAgICAgICAgICAndGFyZ2V0LWFycm93LWNvbG9yJzogJyM4ODg4ODgnLFxuICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1zaGFwZSc6ICd0cmlhbmdsZScsXG4gICAgICAgICAgICAndGFyZ2V0LWFycm93LWZpbGwnOiAnZmlsbGVkJyxcbiAgICAgICAgICAgICdhcnJvdy1zY2FsZSc6IDEsXG4gICAgICAgICAgICAnY3VydmUtc3R5bGUnOiAnYmV6aWVyJyxcbiAgICAgICAgICAgICdjb250cm9sLXBvaW50LXN0ZXAtc2l6ZSc6IDQwLFxuICAgICAgICAgICAgJ3RyYW5zaXRpb24tcHJvcGVydHknOiAnbGluZS1jb2xvciwgdGFyZ2V0LWFycm93LWNvbG9yJyxcbiAgICAgICAgICAgICd0cmFuc2l0aW9uLWR1cmF0aW9uJzogJzAuMjVzJyxcbiAgICAgICAgICAgICd0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbic6ICdlYXNlLWluLW91dC1zaW5lJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdlZGdlW3R5cGU9XCJoaWRkZW5cIl0nLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ2VkZ2VbdHlwZT1cIm91dHB1dFwiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAnbGluZS1jb2xvcic6ICcjMDA4MEQwJyxcbiAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctY29sb3InOiAnIzAwODBEMCdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnZWRnZVt0eXBlPVwic3RhdGVcIl0nLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgJ2xpbmUtc3R5bGUnOiAnZGFzaGVkJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdub2RlJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGNvbG9yOiAnIzMzMzMzMycsXG4gICAgICAgICAgICBwYWRkaW5nOiA2LFxuICAgICAgICAgICAgJ3RleHQtdmFsaWduJzogJ2NlbnRlcicsXG4gICAgICAgICAgICAndGV4dC1oYWxpZ24nOiAnY2VudGVyJyxcbiAgICAgICAgICAgICdib3JkZXItd2lkdGgnOiAyLFxuICAgICAgICAgICAgJ2JvcmRlci1vcGFjaXR5JzogMCxcbiAgICAgICAgICAgICdib3JkZXItc3R5bGUnOiAnc29saWQnLFxuICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICcjODg4ODg4JyxcbiAgICAgICAgICAgICd0cmFuc2l0aW9uLXByb3BlcnR5JzogJ2JvcmRlci1vcGFjaXR5JyxcbiAgICAgICAgICAgICd0cmFuc2l0aW9uLWR1cmF0aW9uJzogJzAuMjVzJyxcbiAgICAgICAgICAgICd0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbic6ICdlYXNlLWluLW91dC1zaW5lJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdub2RlW3R5cGU9XCJjYWxsYmFja1wiXScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICB3aWR0aDogMzUsXG4gICAgICAgICAgICBoZWlnaHQ6IDI1LFxuICAgICAgICAgICAgc2hhcGU6ICdyb3VuZC1yZWN0YW5nbGUnLFxuICAgICAgICAgICAgbGFiZWw6IGUgPT4gYCR7ZS5kYXRhKCkuY291bnR9XFxuJHtlLmRhdGEoKS50aW1lfSBtc2AsXG4gICAgICAgICAgICAndGV4dC13cmFwJzogJ3dyYXAnLFxuICAgICAgICAgICAgJ3RleHQtanVzdGlmaWNhdGlvbic6ICdjZW50ZXInXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ25vZGVbdHlwZT1cImNhbGxiYWNrXCJdW21vZGU9XCJjbGllbnRcIl0nLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgY29sb3I6ICcjMzIzMzMwJyxcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyNGMERCNEYnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ25vZGVbdHlwZT1cImNhbGxiYWNrXCJdW21vZGU9XCJzZXJ2ZXJcIl0nLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgY29sb3I6ICcjMzIzMzMwJyxcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyMwMENDOTYnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ25vZGVbdHlwZT1cImNvbXBvbmVudFwiXSwgbm9kZVt0eXBlPVwid2lsZGNhcmRcIl0nLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgd2lkdGg6ICdsYWJlbCcsXG4gICAgICAgICAgICAvLyBoZWlnaHQ6ICdsYWJlbCcsXG4gICAgICAgICAgICBzaGFwZTogJ3JlY3RhbmdsZScsXG4gICAgICAgICAgICBjb250ZW50OiBlID0+IGUuZGF0YSgpLmxhYmVsLnJlcGxhY2UoL1wiL2csICcnKSxcbiAgICAgICAgICAgICd0ZXh0LXZhbGlnbic6ICd0b3AnLFxuICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAnI0I5QzJDRSdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnbm9kZVt0eXBlPVwicHJvcGVydHlcIl0nLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgd2lkdGg6ICdsYWJlbCcsXG4gICAgICAgICAgICBoZWlnaHQ6IDIwLFxuICAgICAgICAgICAgc2hhcGU6ICdyZWN0YW5nbGUnLFxuICAgICAgICAgICAgY29udGVudDogJ2RhdGEobGFiZWwpJyxcbiAgICAgICAgICAgIGNvbG9yOiAnd2hpdGUnLFxuICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzEwOURGRidcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnLnNlbGVjdGVkLW5vZGUnLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgZ2hvc3Q6ICd5ZXMnLFxuICAgICAgICAgICAgJ2dob3N0LW9mZnNldC14JzogMixcbiAgICAgICAgICAgICdnaG9zdC1vZmZzZXQteSc6IDIsXG4gICAgICAgICAgICAnZ2hvc3Qtb3BhY2l0eSc6IDAuMjUsXG4gICAgICAgICAgICAnYm9yZGVyLW9wYWNpdHknOiAxXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJy5wcm9wLWNoYW5nZWQsIC5jYWxsYmFjay1sb2FkaW5nJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICdib3JkZXItY29sb3InOiAnI0NDNDNCNycsXG4gICAgICAgICAgICAnYm9yZGVyLXdpZHRoJzogMixcbiAgICAgICAgICAgICdib3JkZXItb3BhY2l0eSc6IDFcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnLmNhbGxiYWNrLWVycm9yJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyNFMTMzMkUnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJy50cmlnZ2VyZWQnLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgJ2xpbmUtY29sb3InOiAnI0NDNDNCNycsXG4gICAgICAgICAgICAndGFyZ2V0LWFycm93LWNvbG9yJzogJyNDQzQzQjcnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJy5pbmFjdGl2ZScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBvcGFjaXR5OiAwLjVcbiAgICAgICAgfVxuICAgIH1cbl07XG5cbmV4cG9ydCBkZWZhdWx0IHN0eWxlc2hlZXQ7XG4iLCJpbXBvcnQge1NUQVRVUywgU1RBVFVTTUFQfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvY29uc3RhbnRzJztcblxuLyoqXG4gKiBnZXRFZGdlVHlwZXNcbiAqXG4gKiBGaW5kcyBhbGwgZWRnZXMgY29ubmVjdGVkIHRvIGEgbm9kZSBhbmQgc3BsaXRzIHRoZW0gYnkgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbm9kZSAtIEN5dG9zY2FwZSBub2RlLlxuICogQHJldHVybnMge09iamVjdH0gLSBPYmplY3QgY29udGFpbmluZyB0aGUgZWRnZXMsIHNvcnRlZCBieSB0eXBlLlxuICovXG5mdW5jdGlvbiBnZXRFZGdlVHlwZXMobm9kZSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gbm9kZS5jb25uZWN0ZWRFZGdlcygpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGlucHV0OiBlbGVtZW50cy5maWx0ZXIoJ1t0eXBlID0gXCJpbnB1dFwiXScpLFxuICAgICAgICBzdGF0ZTogZWxlbWVudHMuZmlsdGVyKCdbdHlwZSA9IFwic3RhdGVcIl0nKSxcbiAgICAgICAgb3V0cHV0OiBlbGVtZW50cy5maWx0ZXIoJ1t0eXBlID0gXCJvdXRwdXRcIl0nKVxuICAgIH07XG59XG5cbi8qKlxuICogdXBkYXRlU2VsZWN0ZWRcbiAqXG4gKiBVcGRhdGVzIHRoZSBjbGFzc2VzIG9mIHRoZSBzZWxlY3RlZCBub2RlIGFuZCByZWNlbnRlcnMgdGhlIHZpZXdwb3J0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjeSAtIFJlZmVyZW5jZSB0byB0aGUgY3l0b3NjYXBlIGluc3RhbmNlLlxuICogQHBhcmFtIHtTdHJpbmd9IGlkIC0gVGhlIGlkIG9mIHRoZSBzZWxlY3RlZCBub2RlLlxuICogQHJldHVybnMge2Z1bmN0aW9ufSAtIGNsZWFudXAgZnVuY3Rpb24sIGZvciB1c2VFZmZlY3QgaG9va1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU2VsZWN0ZWROb2RlKGN5LCBpZCkge1xuICAgIGZ1bmN0aW9uIGFzY2VuZChub2RlLCBjb2xsZWN0aW9uLCB2aXNpdGVkID0gbmV3IFNldCgpKSB7XG4gICAgICAgIGlmICh2aXNpdGVkLmhhcyhub2RlLmlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmlzaXRlZC5hZGQobm9kZS5pZCgpKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IG5vZGUuZGF0YSgpLnR5cGUgPT09ICdjYWxsYmFjaycgPyAnaW5wdXQnIDogJ291dHB1dCc7XG4gICAgICAgIGNvbnN0IGVkZ2VzID0gZ2V0RWRnZVR5cGVzKG5vZGUpW3R5cGVdO1xuICAgICAgICBjb25zdCBwYXJlbnRzID0gZWRnZXMuc291cmNlcygpO1xuICAgICAgICBjb2xsZWN0aW9uLm1lcmdlKGVkZ2VzKTtcbiAgICAgICAgY29sbGVjdGlvbi5tZXJnZShwYXJlbnRzKTtcbiAgICAgICAgaWYgKG5vZGUuZGF0YSgpLnR5cGUgPT09ICdwcm9wZXJ0eScpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24ubWVyZ2Uobm9kZS5hbmNlc3RvcnMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50cy5mb3JFYWNoKG5vZGUgPT4gYXNjZW5kKG5vZGUsIGNvbGxlY3Rpb24sIHZpc2l0ZWQpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXNjZW5kKG5vZGUsIGNvbGxlY3Rpb24sIHZpc2l0ZWQgPSBuZXcgU2V0KCkpIHtcbiAgICAgICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUuaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2aXNpdGVkLmFkZChub2RlLmlkKCkpO1xuICAgICAgICBjb25zdCB0eXBlID0gbm9kZS5kYXRhKCkudHlwZSA9PT0gJ2NhbGxiYWNrJyA/ICdvdXRwdXQnIDogJ2lucHV0JztcbiAgICAgICAgY29uc3QgZWRnZXMgPSBnZXRFZGdlVHlwZXMobm9kZSlbdHlwZV07XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZWRnZXMudGFyZ2V0cygpO1xuICAgICAgICBjb2xsZWN0aW9uLm1lcmdlKGVkZ2VzKTtcbiAgICAgICAgY29sbGVjdGlvbi5tZXJnZShjaGlsZHJlbik7XG4gICAgICAgIGlmIChub2RlLmRhdGEoKS50eXBlID09PSAncHJvcGVydHknKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uLm1lcmdlKG5vZGUuYW5jZXN0b3JzKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuLmZvckVhY2gobm9kZSA9PiBkZXNjZW5kKG5vZGUsIGNvbGxlY3Rpb24sIHZpc2l0ZWQpKTtcbiAgICB9XG5cbiAgICBpZiAoaWQpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlkKTtcblxuICAgICAgICAvLyBIaWdobGlnaHQgdGhlIHNlbGVjdGVkIG5vZGUuXG5cbiAgICAgICAgbm9kZS5hZGRDbGFzcygnc2VsZWN0ZWQtbm9kZScpO1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIHN1YnRyZWUgdGhhdCB0aGUgbm9kZSBiZWxvbmdzIHRvLiBBIHN1YnRyZWUgY29udGFpbnNcbiAgICAgICAgLy8gYWxsIGFsbCBhbmNlc3RvcnMgYW5kIGRlc2NlbmRhbnRzIHRoYXQgYXJlIGNvbm5lY3RlZCB2aWEgSW5wdXRzXG4gICAgICAgIC8vIG9yIE91dHB1dHMgKGJ1dCBub3QgU3RhdGUpLlxuXG4gICAgICAgIGNvbnN0IHN1YnRyZWUgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgIHN1YnRyZWUubWVyZ2Uobm9kZSk7XG4gICAgICAgIGFzY2VuZChub2RlLCBzdWJ0cmVlKTtcbiAgICAgICAgZGVzY2VuZChub2RlLCBzdWJ0cmVlKTtcblxuICAgICAgICBjb25zdCBvdGhlciA9IHN1YnRyZWUuYWJzb2x1dGVDb21wbGVtZW50KCk7XG4gICAgICAgIG90aGVyLmFkZENsYXNzKCdpbmFjdGl2ZScpO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBub2RlLnJlbW92ZUNsYXNzKCdzZWxlY3RlZC1ub2RlJyk7XG4gICAgICAgICAgICBvdGhlci5yZW1vdmVDbGFzcygnaW5hY3RpdmUnKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiB1cGRhdGVDaGFuZ2VkUHJvcFxuICpcbiAqIEZsYXNoZXMgcHJvcGVydHkgbm9kZXMgdGhhdCB1cGRhdGVkIGFuZCBhbnkgaW5wdXRzIHRoZXkgYXJlIGNvbm5lY3RlZCB0by5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3kgLSBSZWZlcmVuY2UgdG8gdGhlIGN5dG9zY2FwZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBpZCAtIFRoZSBjb21wb25lbnQgaWQgd2hpY2ggdXBkYXRlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyAtIFRoZSBwcm9wcyB0aGF0IHVwZGF0ZWQuXG4gKiBAcGFyYW0ge051bWJlcn0gZmxhc2hUaW1lIC0gVGhlIHRpbWUgdG8gZmxhc2ggY2xhc3NlcyBmb3IgaW4gbXMuXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQ2hhbmdlZFByb3BzKGN5LCBpZCwgcHJvcHMsIGZsYXNoVGltZSA9IDUwMCkge1xuICAgIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICBjb25zdCBub2RlID0gY3kuZ2V0RWxlbWVudEJ5SWQoYCR7aWR9LiR7cHJvcH1gKTtcbiAgICAgICAgbm9kZS5mbGFzaENsYXNzKCdwcm9wLWNoYW5nZWQnLCBmbGFzaFRpbWUpO1xuICAgICAgICBub2RlLmVkZ2VzVG8oJyonKVxuICAgICAgICAgICAgLmZpbHRlcignW3R5cGUgPSBcImlucHV0XCJdJylcbiAgICAgICAgICAgIC5mbGFzaENsYXNzKCd0cmlnZ2VyZWQnLCBmbGFzaFRpbWUpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIHVwZGF0ZUNhbGxiYWNrXG4gKlxuICogVXBkYXRlcyBhIGNhbGxiYWNrIG5vZGUgd2l0aCBwcm9maWxpbmcgaW5mb3JtYXRpb24gKGNhbGwgY291bnQsIGF2ZyB0aW1lKVxuICogYW5kIGFkZHMgb3IgcmVtb3ZlcyBjbGFzc2VzIGFzIG5lY2Vzc2FyeS4gQ2xhc3NlcyBhcmUgYWx3YXlzIGFzc2VydCBmb3JcbiAqIGF0IGxlYXN0IGZsYXNoVGltZSBtcyBzbyB0aGF0IHRoZXkgY2FuIGJlIHZpc3VhbGx5IG9ic2VydmVkLiBXaGVuIGNhbGxiYWNrc1xuICogcmVzb2x2ZSwgYWxsIG91dHB1dCBlZGdlcyBhcmUgZmxhc2hlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3kgLSBSZWZlcmVuY2UgdG8gdGhlIGN5dG9zY2FwZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBpZCAtIFRoZSBpZCBvZiB0aGUgY2FsbGJhY2sgKGkuZS4sIGl0J3Mgb3V0cHV0IGlkZW50aWZpZXIpXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvZmlsZSAtIFRoZSBjYWxsYmFjayBwcm9maWxpbmcgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0ge051bWJlcn0gZmxhc2hUaW1lIC0gVGhlIHRpbWUgdG8gZmxhc2ggY2xhc3NlcyBmb3IgaW4gbXMuXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQ2FsbGJhY2soY3ksIGlkLCBwcm9maWxlLCBmbGFzaFRpbWUgPSA1MDApIHtcbiAgICBjb25zdCBub2RlID0gY3kuZ2V0RWxlbWVudEJ5SWQoYF9fZGFzaF9jYWxsYmFja19fLiR7aWR9YCk7XG4gICAgY29uc3Qge2NvdW50LCB0b3RhbCwgc3RhdHVzfSA9IHByb2ZpbGU7XG4gICAgY29uc3Qge2xhdGVzdH0gPSBzdGF0dXM7XG5cbiAgICAvLyBVcGRhdGUgZGF0YS5cbiAgICBjb25zdCBhdmdUaW1lID0gY291bnQgPiAwID8gdG90YWwgLyBjb3VudCA6IDA7XG4gICAgbm9kZS5kYXRhKCdjb3VudCcsIGNvdW50KTtcbiAgICBub2RlLmRhdGEoJ3RpbWUnLCBNYXRoLnJvdW5kKGF2Z1RpbWUpKTtcblxuICAgIC8vIEVpdGhlciBmbGFzaCB0aGUgY2xhc3NlcyBPUiBtYWludGFpbiBpdCBmb3IgbG9uZyBjYWxsYmFja3MuXG4gICAgaWYgKGxhdGVzdCA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICAgIG5vZGUuZGF0YSgnbG9hZGluZ1NldCcsIERhdGUubm93KCkpO1xuICAgICAgICBub2RlLmFkZENsYXNzKCdjYWxsYmFjay1sb2FkaW5nJyk7XG4gICAgfSBlbHNlIGlmIChub2RlLmhhc0NsYXNzKCdjYWxsYmFjay1sb2FkaW5nJykpIHtcbiAgICAgICAgY29uc3QgdGltZUxlZnQgPSBub2RlLmRhdGEoJ2xvYWRpbmdTZXQnKSArIGZsYXNoVGltZSAtIERhdGUubm93KCk7XG4gICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAoKSA9PiBub2RlLnJlbW92ZUNsYXNzKCdjYWxsYmFjay1sb2FkaW5nJyksXG4gICAgICAgICAgICBNYXRoLm1heCh0aW1lTGVmdCwgMClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAgIGxhdGVzdCAhPT0gJ2xvYWRpbmcnICYmXG4gICAgICAgIGxhdGVzdCAhPT0gU1RBVFVTTUFQW1NUQVRVUy5PS10gJiZcbiAgICAgICAgbGF0ZXN0ICE9PSBTVEFUVVNNQVBbU1RBVFVTLlBSRVZFTlRfVVBEQVRFXVxuICAgICkge1xuICAgICAgICBub2RlLmRhdGEoJ2Vycm9yU2V0JywgRGF0ZS5ub3coKSk7XG4gICAgICAgIG5vZGUuYWRkQ2xhc3MoJ2NhbGxiYWNrLWVycm9yJyk7XG4gICAgfSBlbHNlIGlmIChub2RlLmhhc0NsYXNzKCdjYWxsYmFjay1lcnJvcicpKSB7XG4gICAgICAgIGNvbnN0IHRpbWVMZWZ0ID0gbm9kZS5kYXRhKCdlcnJvclNldCcpICsgZmxhc2hUaW1lIC0gRGF0ZS5ub3coKTtcbiAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+IG5vZGUucmVtb3ZlQ2xhc3MoJ2NhbGxiYWNrLWVycm9yJyksXG4gICAgICAgICAgICBNYXRoLm1heCh0aW1lTGVmdCwgMClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGSVhNRTogVGhpcyB3aWxsIGZsYXNoIGJyYW5jaGVzIHRoYXQgcmV0dXJuIG5vX3VwZGF0ZSEhXG4gICAgLy8gSWYgdGhlIGNhbGxiYWNrIHJlc29sdmVkIHByb3Blcmx5LCBmbGFzaCB0aGUgb3V0cHV0cy5cbiAgICBpZiAobGF0ZXN0ID09PSBTVEFUVVNNQVBbU1RBVFVTLk9LXSkge1xuICAgICAgICBub2RlLmVkZ2VzVG8oJyonKS5mbGFzaENsYXNzKCd0cmlnZ2VyZWQnLCBmbGFzaFRpbWUpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtvbkVycm9yLCByZXZlcnR9IGZyb20gJy4uLy4uL2FjdGlvbnMnO1xuXG5jbGFzcyBDb21wb25lbnRFcnJvckJvdW5kYXJ5IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBteUlEOiBwcm9wcy5jb21wb25lbnRJZCxcbiAgICAgICAgICAgIG9sZENoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaGFzRXJyb3I6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihfKSB7XG4gICAgICAgIHJldHVybiB7aGFzRXJyb3I6IHRydWV9O1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZENhdGNoKGVycm9yLCBpbmZvKSB7XG4gICAgICAgIGNvbnN0IHtkaXNwYXRjaH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgIG9uRXJyb3Ioe1xuICAgICAgICAgICAgICAgIG15SUQ6IHRoaXMuc3RhdGUubXlJRCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZnJvbnRFbmQnLFxuICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgIGluZm9cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGRpc3BhdGNoKHJldmVydCk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHByZXZDaGlsZHJlbiA9IHByZXZQcm9wcy5jaGlsZHJlbjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuc3RhdGUuaGFzRXJyb3IgJiZcbiAgICAgICAgICAgIHByZXZDaGlsZHJlbiAhPT0gcHJldlN0YXRlLm9sZENoaWxkcmVuICYmXG4gICAgICAgICAgICBwcmV2Q2hpbGRyZW4gIT09IHRoaXMucHJvcHMuY2hpbGRyZW5cbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tZGlkLXVwZGF0ZS1zZXQtc3RhdGUgKi9cbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIG9sZENoaWxkcmVuOiBwcmV2Q2hpbGRyZW5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB7aGFzRXJyb3IsIG9sZENoaWxkcmVufSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIHJldHVybiBoYXNFcnJvciA/IG9sZENoaWxkcmVuIDogdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgICB9XG59XG5cbkNvbXBvbmVudEVycm9yQm91bmRhcnkucHJvcFR5cGVzID0ge1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGNvbXBvbmVudElkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGVycm9yOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGRpc3BhdGNoOiBQcm9wVHlwZXMuZnVuY1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQ29tcG9uZW50RXJyb3JCb3VuZGFyeTtcbiIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0ICcuL0Zyb250RW5kRXJyb3IuY3NzJztcbmltcG9ydCB7Q29tcG9uZW50LCB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3R9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDb2xsYXBzZUljb24gZnJvbSAnLi4vaWNvbnMvQ29sbGFwc2VJY29uLnN2Zyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICcuLi9QZXJjeS5jc3MnO1xuaW1wb3J0IHt1cmxCYXNlfSBmcm9tICcuLi8uLi8uLi9hY3Rpb25zL3V0aWxzJztcblxuaW1wb3J0IHdlcmt6ZXVnQ3NzIGZyb20gJy4uL3dlcmt6ZXVnY3NzJztcblxuY2xhc3MgRnJvbnRFbmRFcnJvciBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgY29sbGFwc2VkOiB0aGlzLnByb3BzLmlzTGlzdEl0ZW1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtlLCBpbkFsZXJ0c1RyYXl9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3Qge2NvbGxhcHNlZH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgICAgIGNvbnN0IGNhcmRDbGFzc2VzID1cbiAgICAgICAgICAgICdkYXNoLWVycm9yLWNhcmRfX2NvbnRlbnQnICtcbiAgICAgICAgICAgIChpbkFsZXJ0c1RyYXkgPyAnIGRhc2gtZXJyb3ItY2FyZC0tYWxlcnRzLXRyYXknIDogJycpO1xuXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWlubGluZS1jb21tZW50cyAqL1xuICAgICAgICBjb25zdCBlcnJvckhlYWRlciA9IChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3ItaXRlbSB0ZXN0LWRldnRvb2xzLWVycm9yLXRvZ2dsZSdcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB0aGlzLnNldFN0YXRlKHtjb2xsYXBzZWQ6ICFjb2xsYXBzZWR9KX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3ItdG9wX19ncm91cCc+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9fdGl0bGUnPlxuICAgICAgICAgICAgICAgICAgICAgICAge2UuZXJyb3IubWVzc2FnZSB8fCAnRXJyb3InfVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvci10b3BfX2dyb3VwJz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yX190aW1lc3RhbXAgcGVyY3ktaGlkZSc+XG4gICAgICAgICAgICAgICAgICAgICAgICB7YCR7ZS50aW1lc3RhbXAudG9Mb2NhbGVUaW1lU3RyaW5nKCl9YH1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX3RpbWVzdGFtcCBwZXJjeS1zaG93Jz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsvKiBTcGVjaWFsIHBlcmN5IHRpbWVzdGFtcCBmb3IgdmlzdWFsIHRlc3RpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBIaWRkZW4gZHVyaW5nIHJlZ3VsYXIgdXNhZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi99XG4gICAgICAgICAgICAgICAgICAgICAgICAwMDowMDowMCBQTVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgPENvbGxhcHNlSWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZGFzaC1mZS1lcnJvcl9fY29sbGFwc2UgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZWQgPyAnZGFzaC1mZS1lcnJvcl9fY29sbGFwc2UtLWZsaXBwZWQnIDogJydcbiAgICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdGhpcy5zZXRTdGF0ZSh7Y29sbGFwc2VkOiAhY29sbGFwc2VkfSl9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjYXJkQ2xhc3Nlc30+XG4gICAgICAgICAgICAgICAge2Vycm9ySGVhZGVyfVxuICAgICAgICAgICAgICAgIHshY29sbGFwc2VkICYmIDxFcnJvckNvbnRlbnQgZXJyb3I9e2UuZXJyb3J9IC8+fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBCYWNrZW5kRXJyb3Ioe2Vycm9yLCBiYXNlfSkge1xuICAgIGNvbnN0IGlmcmFtZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgICBjb25zdCBbaGVpZ2h0LCBzZXRIZWlnaHRdID0gdXNlU3RhdGUoJzUwMHB4Jyk7IC8vIERlZmF1bHQgaGVpZ2h0XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVNZXNzYWdlID0gZXZlbnQgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICBldmVudC5kYXRhLnR5cGUgPT09ICdJRlJBTUVfSEVJR0hUJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgc2V0SGVpZ2h0KGAke2V2ZW50LmRhdGEuaGVpZ2h0fXB4YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlTWVzc2FnZSk7XG4gICAgfSwgW10pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGlmcmFtZVxuICAgICAgICAgICAgcmVmPXtpZnJhbWVSZWZ9XG4gICAgICAgICAgICBzcmNEb2M9e2Vycm9yLmh0bWxcbiAgICAgICAgICAgICAgICAucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgJzwvaGVhZD4nLFxuICAgICAgICAgICAgICAgICAgICBgPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPiR7d2Vya3pldWdDc3N9PC9zdHlsZT5cbiAgICAgICAgICAgICAgICAgICAgPHNjcmlwdD5cbiAgZnVuY3Rpb24gc2VuZEhlaWdodCgpIHtcbiAgICBjb25zdCBoZWlnaHQgPSBkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodDtcbiAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHsgdHlwZTogXCJJRlJBTUVfSEVJR0hUXCIsIGhlaWdodCB9LCBcIipcIik7XG4gIH1cblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgc2VuZEhlaWdodCk7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHNlbmRIZWlnaHQpO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHNlbmRIZWlnaHQpO1xuPC9zY3JpcHQ+PC9oZWFkPmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJz1cIj9fX2RlYnVnZ2VyX18nLCBgPVwiJHtiYXNlfT9fX2RlYnVnZ2VyX19gKX1cbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgKiA2N3B4IG9mIHBhZGRpbmcgYW5kIG1hcmdpbiBiZXR3ZWVuIHRoaXNcbiAgICAgICAgICAgICAgICAgKiBpZnJhbWUgYW5kIHRoZSBwYXJlbnQgY29udGFpbmVyLlxuICAgICAgICAgICAgICAgICAqIDY3IHdhcyBkZXRlcm1pbmVkIG1hbnVhbGx5IGluIHRoZVxuICAgICAgICAgICAgICAgICAqIGJyb3dzZXIncyBkZXYgdG9vbHMuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgd2lkdGg6ICdjYWxjKDYwMHB4IC0gNjdweCknLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJ25vbmUnLFxuICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICAgICAgICB9fVxuICAgICAgICAvPlxuICAgICk7XG59XG5cbmNvbnN0IE1BWF9NRVNTQUdFX0xFTkdUSCA9IDQwO1xuLyogZXNsaW50LWRpc2FibGUgbm8taW5saW5lLWNvbW1lbnRzICovXG5mdW5jdGlvbiBVbmNvbm5lY3RlZEVycm9yQ29udGVudCh7ZXJyb3IsIGJhc2V9KSB7XG4gICAgLy8gSGVscGVyIHRvIGRldGVjdCBmdWxsIEhUTUwgZG9jdW1lbnRcbiAgICBjb25zdCBpc0Z1bGxIdG1sRG9jID1cbiAgICAgICAgdHlwZW9mIGVycm9yLmh0bWwgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIGVycm9yLmh0bWwudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnPCFkb2N0eXBlJyk7XG5cbiAgICAvLyBIZWxwZXIgdG8gZGV0ZWN0IEhUTUwgZnJhZ21lbnRcbiAgICBjb25zdCBpc0h0bWxGcmFnbWVudCA9XG4gICAgICAgIHR5cGVvZiBlcnJvci5odG1sID09PSAnc3RyaW5nJyAmJiBlcnJvci5odG1sLnRyaW0oKS5zdGFydHNXaXRoKCc8Jyk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZXJyb3ItY29udGFpbmVyJz5cbiAgICAgICAgICAgIHsvKiBGcm9udGVuZCBlcnJvciBtZXNzYWdlICovfVxuICAgICAgICAgICAge3R5cGVvZiBlcnJvci5tZXNzYWdlICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgZXJyb3IubWVzc2FnZS5sZW5ndGggPCBNQVhfTUVTU0FHRV9MRU5HVEggPyBudWxsIDogKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yX19zdCc+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yX19pbmZvIGRhc2gtZmUtZXJyb3JfX2N1cnZlZCc+XG4gICAgICAgICAgICAgICAgICAgICAgICB7ZXJyb3IubWVzc2FnZX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICB7LyogRnJvbnRlbmQgc3RhY2sgdHJhY2UgKi99XG4gICAgICAgICAgICB7dHlwZW9mIGVycm9yLnN0YWNrICE9PSAnc3RyaW5nJyA/IG51bGwgOiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX3N0Jz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX2luZm8nPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRldGFpbHM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN1bW1hcnk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRoaXMgZXJyb3Igb3JpZ2luYXRlZCBmcm9tIHRoZSBidWlsdC1pblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YVNjcmlwdCBjb2RlIHRoYXQgcnVucyBEYXNoIGFwcHMuIENsaWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzZWUgdGhlIGZ1bGwgc3RhY2sgdHJhY2Ugb3Igb3BlbiB5b3VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyJ3MgY29uc29sZS4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N1bW1hcnk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2Vycm9yLnN0YWNrLnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUsIGkpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAga2V5PXtpfT57bGluZX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2RldGFpbHM+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgey8qIEJhY2tlbmQgZXJyb3I6IGZ1bGwgSFRNTCBkb2N1bWVudCAqL31cbiAgICAgICAgICAgIHtpc0Z1bGxIdG1sRG9jID8gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWJlLWVycm9yX19zdCc+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWJhY2tlbmQtZXJyb3InPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEJhY2tlbmRFcnJvciBlcnJvcj17ZXJyb3J9IGJhc2U9e2Jhc2V9IC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSA6IGlzSHRtbEZyYWdtZW50ID8gKFxuICAgICAgICAgICAgICAgIC8vIEJhY2tlbmQgZXJyb3I6IEhUTUwgZnJhZ21lbnRcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1iZS1lcnJvcl9fc3RyJz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdkYXNoLWJhY2tlbmQtZXJyb3InXG4gICAgICAgICAgICAgICAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17e19faHRtbDogZXJyb3IuaHRtbH19XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogdHlwZW9mIGVycm9yLmh0bWwgPT09ICdzdHJpbmcnID8gKFxuICAgICAgICAgICAgICAgIC8vIEJhY2tlbmQgZXJyb3I6IHBsYWluIHRleHRcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1iZS1lcnJvcl9fc3RyJz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtYmFja2VuZC1lcnJvcic+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cHJlPntlcnJvci5odG1sfTwvcHJlPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufVxuLyogZXNsaW50LWVuYWJsZSBuby1pbmxpbmUtY29tbWVudHMgKi9cblxuY29uc3QgZXJyb3JQcm9wVHlwZXMgPSBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIG1lc3NhZ2U6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgICAvKiBmcm9udC1lbmQgZXJyb3IgbWVzc2FnZXMgKi9cbiAgICBzdGFjazogUHJvcFR5cGVzLnN0cmluZyxcblxuICAgIC8qIGJhY2tlbmQgZXJyb3IgbWVzc2FnZXMgKi9cbiAgICBodG1sOiBQcm9wVHlwZXMuc3RyaW5nXG59KTtcblxuVW5jb25uZWN0ZWRFcnJvckNvbnRlbnQucHJvcFR5cGVzID0ge1xuICAgIGVycm9yOiBlcnJvclByb3BUeXBlcyxcbiAgICBiYXNlOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuXG5jb25zdCBFcnJvckNvbnRlbnQgPSBjb25uZWN0KHN0YXRlID0+ICh7YmFzZTogdXJsQmFzZShzdGF0ZS5jb25maWcpfSkpKFxuICAgIFVuY29ubmVjdGVkRXJyb3JDb250ZW50XG4pO1xuXG5Gcm9udEVuZEVycm9yLnByb3BUeXBlcyA9IHtcbiAgICBlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICB0aW1lc3RhbXA6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICAgIGVycm9yOiBlcnJvclByb3BUeXBlc1xuICAgIH0pLFxuICAgIGluQWxlcnRzVHJheTogUHJvcFR5cGVzLmJvb2wsXG4gICAgaXNMaXN0SXRlbTogUHJvcFR5cGVzLmJvb2xcbn07XG5cbkZyb250RW5kRXJyb3IuZGVmYXVsdFByb3BzID0ge1xuICAgIGluQWxlcnRzVHJheTogZmFsc2UsXG4gICAgaXNMaXN0SXRlbTogZmFsc2Vcbn07XG5cbmV4cG9ydCB7RnJvbnRFbmRFcnJvcn07XG4iLCJpbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCAnLi9Gcm9udEVuZEVycm9yLmNzcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtGcm9udEVuZEVycm9yfSBmcm9tICcuL0Zyb250RW5kRXJyb3IucmVhY3QnO1xuXG5jbGFzcyBGcm9udEVuZEVycm9yQ29udGFpbmVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB7ZXJyb3JzLCBjb25uZWN0ZWQsIGNsaWNrSGFuZGxlcn0gPSB0aGlzLnByb3BzO1xuXG4gICAgICAgIGNvbnN0IGluQWxlcnRzVHJheSA9IHRoaXMucHJvcHMuaW5BbGVydHNUcmF5O1xuICAgICAgICBsZXQgY2FyZENsYXNzZXMgPSAnZGFzaC1lcnJvci1jYXJkIGRhc2gtZXJyb3ItY2FyZC0tY29udGFpbmVyJztcblxuICAgICAgICBjb25zdCBlcnJvckVsZW1lbnRzID0gZXJyb3JzLm1hcCgoZXJyb3IsIGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiA8RnJvbnRFbmRFcnJvciBlPXtlcnJvcn0gaXNMaXN0SXRlbT17dHJ1ZX0ga2V5PXtpfSAvPjtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpbkFsZXJ0c1RyYXkpIHtcbiAgICAgICAgICAgIGNhcmRDbGFzc2VzICs9ICcgZGFzaC1lcnJvci1jYXJkLS1hbGVydHMtdHJheSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjYXJkQ2xhc3Nlc30+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZXJyb3ItY2FyZF9fdG9wYmFyJz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZXJyb3ItY2FyZF9fbWVzc2FnZSc+XG4gICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb25uZWN0ZWQgPyBudWxsIDogJ1xcdTAwYTAg8J+aqyBTZXJ2ZXIgVW5hdmFpbGFibGUnfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yX19pY29uLXgnXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBjbGlja0hhbmRsZXIoKX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgw5dcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZXJyb3ItY2FyZF9fbGlzdCc+e2Vycm9yRWxlbWVudHN9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbkZyb250RW5kRXJyb3JDb250YWluZXIucHJvcFR5cGVzID0ge1xuICAgIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGVycm9yczogUHJvcFR5cGVzLmFycmF5LFxuICAgIGNvbm5lY3RlZDogUHJvcFR5cGVzLmJvb2wsXG4gICAgaW5BbGVydHNUcmF5OiBQcm9wVHlwZXMuYW55XG59O1xuXG5Gcm9udEVuZEVycm9yQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgICBpbkFsZXJ0c1RyYXk6IFByb3BUeXBlcy5hbnlcbn07XG5cbmV4cG9ydCB7RnJvbnRFbmRFcnJvckNvbnRhaW5lcn07XG4iLCJpbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7RGVidWdNZW51fSBmcm9tICcuL21lbnUvRGVidWdNZW51LnJlYWN0JztcblxuY2xhc3MgVW5jb25uZWN0ZWRHbG9iYWxFcnJvckNvbnRhaW5lciBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge2NvbmZpZywgZXJyb3IsIGNoaWxkcmVufSA9IHRoaXMucHJvcHM7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGlkPSdfZGFzaC1nbG9iYWwtZXJyb3ItY29udGFpbmVyJz5cbiAgICAgICAgICAgICAgICA8RGVidWdNZW51XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZz17Y29uZmlnfVxuICAgICAgICAgICAgICAgICAgICBlcnJvcj17ZXJyb3J9XG4gICAgICAgICAgICAgICAgICAgIGhvdFJlbG9hZD17Qm9vbGVhbihjb25maWcuaG90X3JlbG9hZCl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSdfZGFzaC1hcHAtY29udGVudCc+e2NoaWxkcmVufTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvRGVidWdNZW51PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5VbmNvbm5lY3RlZEdsb2JhbEVycm9yQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBjb25maWc6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZXJyb3I6IFByb3BUeXBlcy5vYmplY3Rcbn07XG5cbmNvbnN0IEdsb2JhbEVycm9yQ29udGFpbmVyID0gY29ubmVjdChzdGF0ZSA9PiAoe1xuICAgIGNvbmZpZzogc3RhdGUuY29uZmlnLFxuICAgIGVycm9yOiBzdGF0ZS5lcnJvclxufSkpKFVuY29ubmVjdGVkR2xvYmFsRXJyb3JDb250YWluZXIpO1xuXG5leHBvcnQgZGVmYXVsdCBHbG9iYWxFcnJvckNvbnRhaW5lcjtcbiIsImltcG9ydCBSZWFjdCwge3VzZUVmZmVjdCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge2NvbmNhdH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHt1c2VTZWxlY3Rvcn0gZnJvbSAncmVhY3QtcmVkdXgnO1xuXG5pbXBvcnQgJy4vRGVidWdNZW51LmNzcyc7XG5cbmltcG9ydCBDaGVja0ljb24gZnJvbSAnLi4vaWNvbnMvQ2hlY2tJY29uLnN2Zyc7XG5pbXBvcnQgQ2xvY2tJY29uIGZyb20gJy4uL2ljb25zL0Nsb2NrSWNvbi5zdmcnO1xuaW1wb3J0IEVycm9ySWNvbiBmcm9tICcuLi9pY29ucy9FcnJvckljb24uc3ZnJztcbmltcG9ydCBHcmFwaEljb24gZnJvbSAnLi4vaWNvbnMvR3JhcGhJY29uLnN2Zyc7XG5pbXBvcnQgT2ZmSWNvbiBmcm9tICcuLi9pY29ucy9PZmZJY29uLnN2Zyc7XG5pbXBvcnQgRXhwYW5kIGZyb20gJy4uL2ljb25zL0V4cGFuZC5zdmcnO1xuaW1wb3J0IHtWZXJzaW9uSW5mb30gZnJvbSAnLi9WZXJzaW9uSW5mby5yZWFjdCc7XG5pbXBvcnQge0NhbGxiYWNrR3JhcGhDb250YWluZXJ9IGZyb20gJy4uL0NhbGxiYWNrR3JhcGgvQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5yZWFjdCc7XG5pbXBvcnQge0Zyb250RW5kRXJyb3JDb250YWluZXJ9IGZyb20gJy4uL0Zyb250RW5kL0Zyb250RW5kRXJyb3JDb250YWluZXIucmVhY3QnO1xuaW1wb3J0IEV4dGVybmFsV3JhcHBlciBmcm9tICcuLi8uLi8uLi93cmFwcGVyL0V4dGVybmFsV3JhcHBlcic7XG5pbXBvcnQgUGxvdGx5Q2xvdWQgZnJvbSAnLi9QbG90bHlDbG91ZCc7XG5pbXBvcnQge0RldnRvb2xQcm92aWRlciwgdXNlRGV2dG9vbH0gZnJvbSAnLi9EZXZ0b29sQ29udGV4dCc7XG5cbmNvbnN0IGNsYXNzZXMgPSAoYmFzZSwgdmFyaWFudCwgdmFyaWFudDIpID0+XG4gICAgYCR7YmFzZX0gJHtiYXNlfS0tJHt2YXJpYW50fWAgKyAodmFyaWFudDIgPyBgICR7YmFzZX0tLSR7dmFyaWFudDJ9YCA6ICcnKTtcblxuY29uc3QgaXNDb2xsYXBzZWQgPSAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdkYXNoX2RlYnVnX21lbnVfY29sbGFwc2VkJykgPT09ICd0cnVlJztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElmIGxvY2FsU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlLCBkZWZhdWx0IHRvIGZhbHNlXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuXG5jb25zdCBNZW51Q29udGVudCA9ICh7XG4gICAgaG90UmVsb2FkLFxuICAgIGNvbm5lY3RlZCxcbiAgICBwb3B1cCxcbiAgICB0b2dnbGVFcnJvcnMsXG4gICAgZXJyQ291bnQsXG4gICAgdG9nZ2xlQ2FsbGJhY2tHcmFwaCxcbiAgICBjb25maWdcbn0pID0+IHtcbiAgICBjb25zdCByZWFkeSA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLmFwcExpZmVjeWNsZSA9PT0gJ0hZRFJBVEVEJyk7XG4gICAgY29uc3QgX1N0YXR1c0ljb24gPSBob3RSZWxvYWRcbiAgICAgICAgPyBjb25uZWN0ZWRcbiAgICAgICAgICAgID8gQ2hlY2tJY29uXG4gICAgICAgICAgICA6IE9mZkljb25cbiAgICAgICAgOiBDbG9ja0ljb247XG5cbiAgICBjb25zdCBzdGF0dXMgPSBob3RSZWxvYWRcbiAgICAgICAgPyBjb25uZWN0ZWRcbiAgICAgICAgICAgID8gJ2F2YWlsYWJsZSdcbiAgICAgICAgICAgIDogJ3VuYXZhaWxhYmxlJ1xuICAgICAgICA6ICdjb2xkJztcblxuICAgIGxldCBjdXN0b20gPSBudWxsO1xuICAgIGlmIChjb25maWcuZGV2X3Rvb2xzPy5sZW5ndGggJiYgcmVhZHkpIHtcbiAgICAgICAgY3VzdG9tID0gY29uZmlnLmRldl90b29scy5yZWR1Y2UoXG4gICAgICAgICAgICAoYWNjLCBkZXZ0b29sLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcCA9IChcbiAgICAgICAgICAgICAgICAgICAgPEV4dGVybmFsV3JhcHBlclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50PXtkZXZ0b29sfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UGF0aD17WydfX2Rhc2hfZGV2dG9vbHMnLCBpXX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGtleT17ZGV2dG9vbD8ucHJvcHM/LmlkID8gZGV2dG9vbC5wcm9wcy5pZCA6IGl9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoZGV2dG9vbC5wb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjYy5sZWZ0LnB1c2goY29tcCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjLnJpZ2h0LnB1c2goY29tcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge2xlZnQ6IFtdLCByaWdodDogW119XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9fY29udGVudCc+XG4gICAgICAgICAgICB7Y3VzdG9tICYmIDw+e2N1c3RvbS5sZWZ0fTwvPn1cbiAgICAgICAgICAgIHshY29uZmlnLnBsb3RseV9jbG91ZF9pbnN0YWxsZWQgPyA8UGxvdGx5Q2xvdWQgLz4gOiBudWxsfVxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RvZ2dsZUVycm9yc31cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e1xuICAgICAgICAgICAgICAgICAgICAocG9wdXAgPT0gJ2Vycm9ycydcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2Rhc2gtZGVidWctbWVudV9fYnV0dG9uLS1zZWxlY3RlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCkgKyAnIGRhc2gtZGVidWctbWVudV9fYnV0dG9uJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZD0nZGFzaC1kZWJ1Zy1tZW51X19lcnJvcnMtYnV0dG9uJ1xuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxFcnJvckljb25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2ljb24nXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPXsxNn1cbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PXsxNn1cbiAgICAgICAgICAgICAgICAgICAgZmlsbD0nY3VycmVudENvbG9yJ1xuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgRXJyb3JzXG4gICAgICAgICAgICAgICAge2VyckNvdW50ID4gMCA/IChcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSd0ZXN0LWRldnRvb2xzLWVycm9yLWNvdW50IGRhc2gtZGVidWctbWVudV9fZXJyb3ItY291bnQnPlxuICAgICAgICAgICAgICAgICAgICAgICAge2VyckNvdW50fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0b2dnbGVDYWxsYmFja0dyYXBofVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17XG4gICAgICAgICAgICAgICAgICAgIChwb3B1cCA9PSAnY2FsbGJhY2tHcmFwaCdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2Rhc2gtZGVidWctbWVudV9fYnV0dG9uLS1zZWxlY3RlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJycpICsgJyBkYXNoLWRlYnVnLW1lbnVfX2J1dHRvbidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWQ9J2Rhc2gtZGVidWctbWVudV9fY2FsbGJhY2stZ3JhcGgtYnV0dG9uJ1xuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxHcmFwaEljb25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2ljb24nXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPXsxNn1cbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PXsxNn1cbiAgICAgICAgICAgICAgICAgICAgZmlsbD0nY3VycmVudENvbG9yJ1xuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgQ2FsbGJhY2tzXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2RpdmlkZXInIC8+XG4gICAgICAgICAgICA8VmVyc2lvbkluZm8gY29uZmlnPXtjb25maWd9IC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X19kaXZpZGVyJyAvPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGRhc2gtZGVidWctbWVudV9fc3RhdHVzIGRhc2gtZGVidWctbWVudV9fYnV0dG9uLS0ke3N0YXR1c31gfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIFNlcnZlclxuICAgICAgICAgICAgICAgIDxfU3RhdHVzSWNvbiBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9faWNvbicgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAge2N1c3RvbSAmJiA8PntjdXN0b20ucmlnaHR9PC8+fVxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X19kaXZpZGVyJ1xuICAgICAgICAgICAgICAgIHN0eWxlPXt7bWFyZ2luUmlnaHQ6IDB9fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn07XG5cbmNvbnN0IERlYnVnID0gKHtlcnJvciwgaG90UmVsb2FkLCBjb25maWcsIGNoaWxkcmVufSkgPT4ge1xuICAgIGNvbnN0IHtwb3B1cCwgc2V0UG9wdXB9ID0gdXNlRGV2dG9vbCgpO1xuICAgIGNvbnN0IFtjb2xsYXBzZWQsIHNldENvbGxhcHNlZF0gPSB1c2VTdGF0ZShpc0NvbGxhcHNlZCk7XG5cbiAgICBjb25zdCBlcnJDb3VudCA9IGVycm9yLmZyb250RW5kLmxlbmd0aCArIGVycm9yLmJhY2tFbmQubGVuZ3RoO1xuICAgIGNvbnN0IGNvbm5lY3RlZCA9IGVycm9yLmJhY2tFbmRDb25uZWN0ZWQ7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoZXJyQ291bnQgPiAwICYmIHBvcHVwID09IG51bGwpIHtcbiAgICAgICAgICAgIHNldFBvcHVwKCdlcnJvcnMnKTtcbiAgICAgICAgfVxuICAgIH0sIFtlcnJDb3VudF0pO1xuXG4gICAgY29uc3QgdG9nZ2xlRXJyb3JzID0gKCkgPT4ge1xuICAgICAgICBzZXRQb3B1cChwb3B1cCA9PSAnZXJyb3JzJyA/IG51bGwgOiAnZXJyb3JzJyk7XG4gICAgfTtcblxuICAgIGNvbnN0IHRvZ2dsZUNhbGxiYWNrR3JhcGggPSAoKSA9PiB7XG4gICAgICAgIHNldFBvcHVwKHBvcHVwID09ICdjYWxsYmFja0dyYXBoJyA/IG51bGwgOiAnY2FsbGJhY2tHcmFwaCcpO1xuICAgIH07XG5cbiAgICBjb25zdCB0b2dnbGVDb2xsYXBzZWQgPSAoKSA9PiB7XG4gICAgICAgIHNldENvbGxhcHNlZCghY29sbGFwc2VkKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdkYXNoX2RlYnVnX21lbnVfY29sbGFwc2VkJywgIWNvbGxhcHNlZCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIElmIGxvY2FsU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlLCBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgZXJyb3JzID0gY29uY2F0KGVycm9yLmZyb250RW5kLCBlcnJvci5iYWNrRW5kKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcnMubGVuZ3RoICYmIHBvcHVwICE9PSAnZXJyb3JzJykge1xuICAgICAgICAgICAgc2V0UG9wdXAoJ2Vycm9ycycpO1xuICAgICAgICB9XG4gICAgfSwgW2Vycm9yXSk7XG5cbiAgICBjb25zdCBwb3B1cENvbnRlbnQgPSAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX3BvcHVwJz5cbiAgICAgICAgICAgIHtwb3B1cCA9PSAnY2FsbGJhY2tHcmFwaCcgPyA8Q2FsbGJhY2tHcmFwaENvbnRhaW5lciAvPiA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgIHtwb3B1cCA9PSAnZXJyb3JzJyAmJiBlcnJDb3VudCA+IDAgPyAoXG4gICAgICAgICAgICAgICAgPEZyb250RW5kRXJyb3JDb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgY2xpY2tIYW5kbGVyPXt0b2dnbGVFcnJvcnN9XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycz17ZXJyb3JzfVxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQ9e2Vycm9yLmJhY2tFbmRDb25uZWN0ZWR9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkgOiB1bmRlZmluZWR9XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG5cbiAgICBjb25zdCBtZW51Q29udGVudCA9IGNvbGxhcHNlZCA/IHVuZGVmaW5lZCA6IChcbiAgICAgICAgPE1lbnVDb250ZW50XG4gICAgICAgICAgICBwb3B1cD17cG9wdXB9XG4gICAgICAgICAgICBlcnJDb3VudD17ZXJyQ291bnR9XG4gICAgICAgICAgICB0b2dnbGVFcnJvcnM9e3RvZ2dsZUVycm9yc31cbiAgICAgICAgICAgIHRvZ2dsZUNhbGxiYWNrR3JhcGg9e3RvZ2dsZUNhbGxiYWNrR3JhcGh9XG4gICAgICAgICAgICBjb25maWc9e2NvbmZpZ31cbiAgICAgICAgICAgIGhvdFJlbG9hZD17aG90UmVsb2FkfVxuICAgICAgICAgICAgY29ubmVjdGVkPXtjb25uZWN0ZWR9XG4gICAgICAgIC8+XG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzKFxuICAgICAgICAgICAgICAgICAgICAnZGFzaC1kZWJ1Zy1tZW51X19vdXRlcicsXG4gICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlZCA/ICdjb2xsYXBzZWQnIDogJ2V4cGFuZGVkJ1xuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3BvcHVwQ29udGVudH1cbiAgICAgICAgICAgICAgICB7bWVudUNvbnRlbnR9XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0b2dnbGVDb2xsYXBzZWR9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICdkYXNoLWRlYnVnLW1lbnVfX3RvZ2dsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZWQgPyAnY29sbGFwc2VkJyA6ICdleHBhbmRlZCdcbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxFeHBhbmQgLz5cbiAgICAgICAgICAgICAgICAgICAge2VyckNvdW50ID4gMCAmJiBjb2xsYXBzZWQgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X19lcnJvci1pbmRpY2F0b3InIC8+XG4gICAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59O1xuXG5jb25zdCBEZWJ1Z01lbnUgPSAoe2NoaWxkcmVuLCAuLi5wcm9wc30pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgICA8RGV2dG9vbFByb3ZpZGVyPlxuICAgICAgICAgICAgPERlYnVnIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvRGVidWc+XG4gICAgICAgIDwvRGV2dG9vbFByb3ZpZGVyPlxuICAgICk7XG59O1xuXG5EZWJ1Z01lbnUucHJvcFR5cGVzID0ge1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGVycm9yOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGhvdFJlbG9hZDogUHJvcFR5cGVzLmJvb2wsXG4gICAgY29uZmlnOiBQcm9wVHlwZXMub2JqZWN0XG59O1xuXG5leHBvcnQge0RlYnVnTWVudX07XG4iLCJpbXBvcnQgUmVhY3QsIHt1c2VDb250ZXh0LCB1c2VNZW1vLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgY29uc3QgRGV2dG9vbENvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KHt9KTtcblxuZXhwb3J0IGNvbnN0IERldnRvb2xQcm92aWRlciA9ICh7Y2hpbGRyZW59KSA9PiB7XG4gICAgY29uc3QgW3BvcHVwLCBzZXRQb3B1cF0gPSB1c2VTdGF0ZSgnJyk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8RGV2dG9vbENvbnRleHQuUHJvdmlkZXJcbiAgICAgICAgICAgIHZhbHVlPXt7XG4gICAgICAgICAgICAgICAgcG9wdXAsXG4gICAgICAgICAgICAgICAgc2V0UG9wdXBcbiAgICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9EZXZ0b29sQ29udGV4dC5Qcm92aWRlcj5cbiAgICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZURldnRvb2wgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHVzZUNvbnRleHQoRGV2dG9vbENvbnRleHQpO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZURldnRvb2xNZW51QnV0dG9uQ2xhc3NOYW1lID0gcG9wdXBOYW1lID0+IHtcbiAgICBjb25zdCB7cG9wdXB9ID0gdXNlRGV2dG9vbCgpO1xuXG4gICAgY29uc3QgY2xhc3NOYW1lID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJhc2UgPSAnZGFzaC1kZWJ1Zy1tZW51X19idXR0b24nO1xuICAgICAgICBpZiAocG9wdXAgPT09IHBvcHVwTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGJhc2UgKyAnIGRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1zZWxlY3RlZCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgfSwgW3BvcHVwXSk7XG5cbiAgICByZXR1cm4gY2xhc3NOYW1lO1xufTtcbiIsImltcG9ydCBSZWFjdCwge3VzZU1lbW99IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHt1c2VEZXZ0b29sLCB1c2VEZXZ0b29sTWVudUJ1dHRvbkNsYXNzTmFtZX0gZnJvbSAnLi9EZXZ0b29sQ29udGV4dCc7XG5cbmltcG9ydCAnLi9QbG90bHlDbG91ZC5jc3MnO1xuaW1wb3J0IENsb3VkU2xhc2hJY29uIGZyb20gJy4uL2ljb25zL0Nsb3VkU2xhc2hJY29uLnN2Zyc7XG5cbmNvbnN0IENMT1VEX1BPUFVQID0gJ2Nsb3VkJztcblxuY29uc3QgUGxvdGx5Q2xvdWQgPSAoKSA9PiB7XG4gICAgY29uc3Qge3BvcHVwLCBzZXRQb3B1cH0gPSB1c2VEZXZ0b29sKCk7XG5cbiAgICBjb25zdCBjbGFzc05hbWUgPSB1c2VEZXZ0b29sTWVudUJ1dHRvbkNsYXNzTmFtZShDTE9VRF9QT1BVUCk7XG5cbiAgICBjb25zdCBpc09wZW4gPSB1c2VNZW1vKCgpID0+IHBvcHVwID09PSBDTE9VRF9QT1BVUCwgW3BvcHVwXSk7XG5cbiAgICBjb25zdCBvbkNsaWNrID0gKCkgPT4ge1xuICAgICAgICBpZiAocG9wdXAgPT09IENMT1VEX1BPUFVQKSB7XG4gICAgICAgICAgICBzZXRQb3B1cCgnJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRQb3B1cChDTE9VRF9QT1BVUCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25Db3B5ID0gKCkgPT4ge1xuICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCgncGlwIGluc3RhbGwgXCJkYXNoW2Nsb3VkXVwiJyk7XG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDw+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT17Y2xhc3NOYW1lfSBvbkNsaWNrPXtvbkNsaWNrfT5cbiAgICAgICAgICAgICAgICA8Q2xvdWRTbGFzaEljb25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2ljb24nXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPXsxNn1cbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PXsxNn1cbiAgICAgICAgICAgICAgICAgICAgZmlsbD0nY3VycmVudENvbG9yJ1xuICAgICAgICAgICAgICAgIC8+eycgJ31cbiAgICAgICAgICAgICAgICBQbG90bHkgQ2xvdWRcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAge2lzT3BlbiA/IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncGxvdGx5LWNsb3VkLW1vZGFsLW92ZXJsYXknPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncGxvdGx5LWNsb3VkLW1vZGFsLWNvbnRlbnQnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3Bsb3RseS1jbG91ZC1tb2RhbC1oZWFkZXInPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBrZXk9J21vZGFsLXRpdGxlJz5QbG90bHkgQ2xvdWQ8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PSdtb2RhbC1jbG9zZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdwbG90bHktY2xvdWQtbW9kYWwtY2xvc2UnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFBvcHVwKCcnKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMOXXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9J21vZGFsLWJvZHknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdwbG90bHktY2xvdWQtbW9kYWwtYm9keSdcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0YWxsIHRoZSBleHRlbnNpb24gdG8gcHVibGlzaCB0byBQbG90bHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvdWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3Bsb3RseS1jbG91ZC1jb3B5LWluc3RhbGwnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57J3BpcCBpbnN0YWxsIFwiZGFzaFtjbG91ZF1cIid9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtvbkNvcHl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J3Bsb3RseS1jbG91ZC1tb2RhbC1idXR0b24nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC8+XG4gICAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFBsb3RseUNsb3VkO1xuIiwiaW1wb3J0IFJlYWN0LCB7dXNlRWZmZWN0LCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgJy4vVmVyc2lvbkluZm8uY3NzJztcblxuY29uc3QgREFZX0lOX01TID0gODY0MDAwMDA7XG5cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyh2MSwgdjIpIHtcbiAgICAvLyBSZW1vdmUgYW55IG5vbi1udW1lcmljIGNoYXJhY3RlcnMgZnJvbSB0aGUgdmVyc2lvbiBzdHJpbmdzXG4gICAgLy8gYW5kIGFueXRoaW5nIGFmdGVyIHRoZW0gKGUuZy4gMS4yLjMtcmMuMSAtPiAxLjIuMywgMS4yLjMrYnVpbGQuMSAtPiAxLjIuMylcbiAgICB2MSA9IHYxLnJlcGxhY2UoL1xcLj9bXjAtOS5dLiokLywgJycpO1xuICAgIHYyID0gdjIucmVwbGFjZSgvXFwuP1teMC05Ll0uKiQvLCAnJyk7XG5cbiAgICBjb25zdCB2MVBhcnRzID0gdjEuc3BsaXQoJy4nKS5tYXAoTnVtYmVyKTtcbiAgICBjb25zdCB2MlBhcnRzID0gdjIuc3BsaXQoJy4nKS5tYXAoTnVtYmVyKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5tYXgodjFQYXJ0cy5sZW5ndGgsIHYyUGFydHMubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBhcnQxID0gdjFQYXJ0c1tpXSB8fCAwO1xuICAgICAgICBjb25zdCBwYXJ0MiA9IHYyUGFydHNbaV0gfHwgMDtcblxuICAgICAgICBpZiAocGFydDEgPiBwYXJ0MikgcmV0dXJuIDE7XG4gICAgICAgIGlmIChwYXJ0MSA8IHBhcnQyKSByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3REYXNoVmVyc2lvbkluZm8oY29uZmlnKSB7XG4gICAgY29uc3Qge1xuICAgICAgICBkYXNoX3ZlcnNpb246IGN1cnJlbnREYXNoVmVyc2lvbixcbiAgICAgICAgZGFzaF92ZXJzaW9uX3VybDogZGFzaFZlcnNpb25VcmwsXG4gICAgICAgIHB5dGhvbl92ZXJzaW9uOiBweXRob25WZXJzaW9uLFxuICAgICAgICBkZGtfdmVyc2lvbjogZGRrVmVyc2lvbixcbiAgICAgICAgcGxvdGx5X3ZlcnNpb246IHBsb3RseVZlcnNpb25cbiAgICB9ID0gY29uZmlnO1xuICAgIGxldCBjYWNoZWRWZXJzaW9uSW5mbywgY2FjaGVkTmV3RGFzaFZlcnNpb25MaW5rLCBsYXN0RmV0Y2hlZDtcbiAgICB0cnkge1xuICAgICAgICBjYWNoZWRWZXJzaW9uSW5mbyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYWNoZWROZXdEYXNoVmVyc2lvbicpO1xuICAgICAgICBjYWNoZWROZXdEYXNoVmVyc2lvbkxpbmsgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcbiAgICAgICAgICAgICdjYWNoZWROZXdEYXNoVmVyc2lvbkxpbmsnXG4gICAgICAgICk7XG4gICAgICAgIGxhc3RGZXRjaGVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhc3RGZXRjaGVkJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZiBsb2NhbFN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZSwgcmV0dXJuIGFuIGVtcHR5IG9iamVjdFxuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGlmIChcbiAgICAgICAgbGFzdEZldGNoZWQgJiZcbiAgICAgICAgRGF0ZS5ub3coKSAtIE51bWJlcihsYXN0RmV0Y2hlZCkgPCBEQVlfSU5fTVMgJiZcbiAgICAgICAgY2FjaGVkVmVyc2lvbkluZm9cbiAgICApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZlcnNpb246IEpTT04ucGFyc2UoY2FjaGVkVmVyc2lvbkluZm8pLFxuICAgICAgICAgICAgbGluazogY2FjaGVkTmV3RGFzaFZlcnNpb25MaW5rXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChzaG91bGRSZXF1ZXN0RGFzaFZlcnNpb24oY29uZmlnKSkge1xuICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICAgICAgZGFzaF92ZXJzaW9uOiBjdXJyZW50RGFzaFZlcnNpb24sXG4gICAgICAgICAgICBweXRob25fdmVyc2lvbjogcHl0aG9uVmVyc2lvbixcbiAgICAgICAgICAgIGRka192ZXJzaW9uOiBkZGtWZXJzaW9uLFxuICAgICAgICAgICAgcGxvdGx5X3ZlcnNpb246IHBsb3RseVZlcnNpb25cbiAgICAgICAgfSkudG9TdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIGZldGNoKGRhc2hWZXJzaW9uVXJsICsgJz8nICsgcXVlcnlQYXJhbXMsIHttb2RlOiAnY29ycyd9KVxuICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuanNvbigpKVxuICAgICAgICAgICAgLnRoZW4oYm9keSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGJvZHkgJiYgYm9keS52ZXJzaW9uICYmIGJvZHkubGluaykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhY2hlZE5ld0Rhc2hWZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShib2R5LnZlcnNpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhY2hlZE5ld0Rhc2hWZXJzaW9uTGluaycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keS5saW5rXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2xhc3RGZXRjaGVkJywgRGF0ZS5ub3coKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnMgaWYgbG9jYWxTdG9yYWdlIGlzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm9keTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRSZXF1ZXN0RGFzaFZlcnNpb24oY29uZmlnKSB7XG4gICAgLy8gSWYgdmVyc2lvbiBjaGVjayBpcyBkaXNhYmxlZCwgcmV0dXJuIGZhbHNlIHRvIGF2b2lkXG4gICAgLy8gY2hlY2tpbmcgbG9jYWxTdG9yYWdlIHVubmVjZXNzYXJpbHlcbiAgICBpZiAoY29uZmlnLmRpc2FibGVfdmVyc2lvbl9jaGVjaykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCBzaG93Tm90aWZpY2F0aW9ucywgbGFzdEZldGNoZWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbnMgPVxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Nob3dOb3RpZmljYXRpb25zJykgIT09ICdmYWxzZSc7XG4gICAgICAgIGxhc3RGZXRjaGVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhc3RGZXRjaGVkJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZiBsb2NhbFN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZSwgcmV0dXJuIGZhbHNlXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbnMgJiZcbiAgICAgICAgKCFsYXN0RmV0Y2hlZCB8fCBEYXRlLm5vdygpIC0gTnVtYmVyKGxhc3RGZXRjaGVkKSA+IERBWV9JTl9NUylcbiAgICApO1xufVxuXG5mdW5jdGlvbiBzaG91bGRTaG93VXBncmFkZU5vdGlmaWNhdGlvbihcbiAgICBjdXJyZW50RGFzaFZlcnNpb24sXG4gICAgbmV3RGFzaFZlcnNpb24sXG4gICAgY29uZmlnXG4pIHtcbiAgICAvLyBJZiB2ZXJzaW9uIGNoZWNrIGlzIGRpc2FibGVkLCByZXR1cm4gZmFsc2UgdG8gYXZvaWRcbiAgICAvLyBjaGVja2luZyBsb2NhbFN0b3JhZ2UgdW5uZWNlc3NhcmlseVxuICAgIGlmIChjb25maWcuZGlzYWJsZV92ZXJzaW9uX2NoZWNrKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHNob3dOb3RpZmljYXRpb25zLCBsYXN0RGlzbWlzc2VkLCBsYXN0RGlzbWlzc2VkVmVyc2lvbjtcbiAgICB0cnkge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9ucyA9XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2hvd05vdGlmaWNhdGlvbnMnKSAhPT0gJ2ZhbHNlJztcbiAgICAgICAgbGFzdERpc21pc3NlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsYXN0RGlzbWlzc2VkJyk7XG4gICAgICAgIGxhc3REaXNtaXNzZWRWZXJzaW9uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhc3REaXNtaXNzZWRWZXJzaW9uJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZiBsb2NhbFN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZSwgcmV0dXJuIGZhbHNlXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgICBuZXdEYXNoVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIGNvbXBhcmVWZXJzaW9ucyhjdXJyZW50RGFzaFZlcnNpb24sIG5ld0Rhc2hWZXJzaW9uKSA+PSAwIHx8XG4gICAgICAgICFzaG93Tm90aWZpY2F0aW9uc1xuICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICAgbGFzdERpc21pc3NlZCAmJlxuICAgICAgICBEYXRlLm5vdygpIC0gTnVtYmVyKGxhc3REaXNtaXNzZWQpID4gREFZX0lOX01TXG4gICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGxhc3REaXNtaXNzZWRWZXJzaW9uICYmXG4gICAgICAgICFsYXN0RGlzbWlzc2VkICYmXG4gICAgICAgIGNvbXBhcmVWZXJzaW9ucyhsYXN0RGlzbWlzc2VkVmVyc2lvbiwgbmV3RGFzaFZlcnNpb24pIDwgMFxuICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gIWxhc3REaXNtaXNzZWQgJiYgIWxhc3REaXNtaXNzZWRWZXJzaW9uO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IFZlcnNpb25JbmZvID0gKHtjb25maWd9KSA9PiB7XG4gICAgY29uc3QgW25ld0Rhc2hWZXJzaW9uLCBzZXROZXdEYXNoVmVyc2lvbl0gPSB1c2VTdGF0ZSh1bmRlZmluZWQpO1xuICAgIGNvbnN0IFtuZXdEYXNoVmVyc2lvbkxpbmssIHNldE5ld0Rhc2hWZXJzaW9uTGlua10gPSB1c2VTdGF0ZSh1bmRlZmluZWQpO1xuICAgIGNvbnN0IFt1cGdyYWRlVG9vbHRpcE9wZW5lZCwgc2V0VXBncmFkZVRvb2x0aXBPcGVuZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgY29uc3Qgc2V0RG9udFNob3dBZ2FpbiA9ICgpID0+IHtcbiAgICAgICAgLy8gU2V0IGxvY2FsIHN0b3JhZ2UgdG8gcmVjb3JkIHRoZSBsYXN0IGRpc21pc3NlZCBub3RpZmljYXRpb25cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzaG93Tm90aWZpY2F0aW9ucycsIGZhbHNlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSWdub3JlIGVycm9ycyBpZiBsb2NhbFN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZVxuICAgICAgICB9XG4gICAgICAgIHNldFVwZ3JhZGVUb29sdGlwT3BlbmVkKGZhbHNlKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgc2V0UmVtaW5kTWVMYXRlciA9ICgpID0+IHtcbiAgICAgICAgLy8gU2V0IGxvY2FsIHN0b3JhZ2UgdG8gcmVjb3JkIHRoZSBsYXN0IGRpc21pc3NlZCBub3RpZmljYXRpb25cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdsYXN0RGlzbWlzc2VkJywgRGF0ZS5ub3coKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnMgaWYgbG9jYWxTdG9yYWdlIGlzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgfVxuICAgICAgICBzZXRVcGdyYWRlVG9vbHRpcE9wZW5lZChmYWxzZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHNldFNraXBUaGlzVmVyc2lvbiA9ICgpID0+IHtcbiAgICAgICAgLy8gU2V0IGxvY2FsIHN0b3JhZ2UgdG8gcmVjb3JkIHRoZSBsYXN0IGRpc21pc3NlZCB2ZXJzaW9uXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbGFzdERpc21pc3NlZFZlcnNpb24nLCBuZXdEYXNoVmVyc2lvbik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnMgaWYgbG9jYWxTdG9yYWdlIGlzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgfVxuICAgICAgICBzZXRVcGdyYWRlVG9vbHRpcE9wZW5lZChmYWxzZSk7XG4gICAgfTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHJlcXVlc3REYXNoVmVyc2lvbkluZm8oY29uZmlnKS50aGVuKGJvZHkgPT4ge1xuICAgICAgICAgICAgaWYgKGJvZHkpIHtcbiAgICAgICAgICAgICAgICBzZXROZXdEYXNoVmVyc2lvbkxpbmsoYm9keS5saW5rKTtcbiAgICAgICAgICAgICAgICBzZXROZXdEYXNoVmVyc2lvbihib2R5LnZlcnNpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9LCBbXSk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCBoaWRlVXBncmFkZVRvb2x0aXAgPSBlID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB1cGdyYWRlVG9vbHRpcE9wZW5lZCAmJlxuICAgICAgICAgICAgICAgICFlLnRhcmdldC5tYXRjaGVzKFxuICAgICAgICAgICAgICAgICAgICAnLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbiwgLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbiAqJ1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHNldFVwZ3JhZGVUb29sdGlwT3BlbmVkKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gQ2xvc2UgdGhlIHVwZ3JhZGUgdG9vbHRpcCBpZiB0aGUgdXNlciBjbGlja3Mgb3V0c2lkZSBvZiBpdFxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZGVVcGdyYWRlVG9vbHRpcCk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGlkZVVwZ3JhZGVUb29sdGlwKTtcbiAgICB9LCBbdXBncmFkZVRvb2x0aXBPcGVuZWRdKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24nPlxuICAgICAgICAgICAge3VwZ3JhZGVUb29sdGlwT3BlbmVkID8gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtdG9vbHRpcCc+XG4gICAgICAgICAgICAgICAgICAgIHtuZXdEYXNoVmVyc2lvbkxpbmsgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSB0YXJnZXQ9J19ibGFuaycgaHJlZj17bmV3RGFzaFZlcnNpb25MaW5rfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkIGRldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gb25DbGljaz17c2V0U2tpcFRoaXNWZXJzaW9ufT5cbiAgICAgICAgICAgICAgICAgICAgICAgIFNraXAgdGhpcyB2ZXJzaW9uXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e3NldFJlbWluZE1lTGF0ZXJ9PlxuICAgICAgICAgICAgICAgICAgICAgICAgUmVtaW5kIG1lIHRvbW9ycm93XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e3NldERvbnRTaG93QWdhaW59PlxuICAgICAgICAgICAgICAgICAgICAgICAgU2lsZW5jZSBhbGwgdmVyc2lvbiBub3RpZmljYXRpb25zXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICA8c3Bhbj52e2NvbmZpZy5kYXNoX3ZlcnNpb259PC9zcGFuPlxuICAgICAgICAgICAge3Nob3VsZFNob3dVcGdyYWRlTm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgICAgIGNvbmZpZy5kYXNoX3ZlcnNpb24sXG4gICAgICAgICAgICAgICAgbmV3RGFzaFZlcnNpb24sXG4gICAgICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICAgICApID8gKFxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtYnV0dG9uJ1xuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VXBncmFkZVRvb2x0aXBPcGVuZWQoIXVwZ3JhZGVUb29sdGlwT3BlbmVkKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBEYXNoIHVwZGF0ZSBhdmFpbGFibGUgLSB2e25ld0Rhc2hWZXJzaW9ufVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59O1xuIiwiLy8gV2Vya3pldWcgY3NzIGluY2x1ZGVkIGFzIGEgc3RyaW5nLCBiZWNhdXNlIHdlIHdhbnQgdG8gaW5qZWN0XG4vLyBpdCBpbnRvIGFuIGlmcmFtZSBzcmNEb2NcblxuZXhwb3J0IGRlZmF1bHQgYFxuYm9keSB7XG4gICAgbWFyZ2luOiAwcHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnRyYWNlYmFjayB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcbiAgICBib3JkZXItcmFkaXVzOiAwcHggMHB4IDRweCA0cHg7XG4gICAgY29sb3I6ICM1MDY3ODQ7XG59XG5cbmgyLnRyYWNlYmFjayB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YzZjZmYTtcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjZGZlOGYzO1xuICAgIGJvcmRlci1ib3R0b206IDBweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweCA0cHggMHB4IDBweDtcbiAgICBjb2xvcjogIzUwNjc4NDtcbn1cblxuaDIudHJhY2ViYWNrIGVtIHtcbiAgICBjb2xvcjogIzUwNjc4NDtcbiAgICBmb250LXdlaWdodDogMTAwO1xufVxuXG4udHJhY2ViYWNrIHByZSwgLmRlYnVnZ2VyIHRleHRhcmVhIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjNGNkZBO1xufVxuXG4uZGVidWdnZXIgaDEge1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xuICAgIGZvbnQtZmFtaWx5OiBSb2JvdG87XG59XG5cbi5leHBsYW5hdGlvbiB7XG4gICAgY29sb3I6ICNBMkIxQzY7XG59XG5cbi8qIEhpZGUgdGhlIERvbid0IFBhbmljISBmb290ZXIgKi9cbi5kZWJ1Z2dlciAuZm9vdGVyIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4vKiBIaWRlIGFsbCBvZiB0aGUgRGFzaCB0cmFjZWJhY2sgc3R1ZmYgdGhhdCBsZWFkcyB1cCB0byB0aGUgY2FsbCAqL1xuLmxpbmUuYmVmb3JlIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG5kaXYuZGVidWdnZXIge1xuICAgIHBhZGRpbmc6IDBweDtcbn1cblxuLmRlYnVnZ2VyIGgxIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4uZGVidWdnZXIgLmVycm9ybXNnIHtcbiAgICBtYXJnaW46IDA7XG4gICAgY29sb3I6ICM1MDY3ODQ7XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2Y2ZmE7XG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBwYWRkaW5nOiAxMHB4O1xufVxuXG4uZGVidWdnZXIgLnBhc3RlbWVzc2FnZSBpbnB1dCB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmRlYnVnZ2VyIC5leHBsYW5hdGlvbiB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmRlYnVnZ2VyIGRpdi5wbGFpbiB7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIGJvcmRlci13aWR0aDogMnB4O1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xufVxuXG4ucGxhaW4ge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG59XG4ucGxhaW4gPiBmb3JtID4gcCB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbi5wbGFpbiBwcmUge1xuICAgIHBhZGRpbmc6IDE1cHggIWltcG9ydGFudDtcbiAgICBvdmVyZmxvdy14OiBzY3JvbGw7XG59XG5cbi5kZWJ1Z2dlciBkaXYudHJhY2ViYWNrIHByZSB7XG4gICAgY3Vyc29yOiBkZWZhdWx0O1xufVxuXG4uZGVidWdnZXIgLnRyYWNlYmFjayAuc291cmNlIHByZS5saW5lIGltZyB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbmA7XG4iLCJleHBvcnQgY29uc3QgUkVESVJFQ1RfVVJJX1BBVEhOQU1FID0gJy9fb2F1dGgyL2NhbGxiYWNrJztcbmV4cG9ydCBjb25zdCBPQVVUSF9DT09LSUVfTkFNRSA9ICdwbG90bHlfb2F1dGhfdG9rZW4nO1xuZXhwb3J0IGNvbnN0IEpXVF9FWFBJUkVEX01FU1NBR0UgPSAnSldUIEV4cGlyZWQnO1xuXG5leHBvcnQgY29uc3QgU1RBVFVTID0ge1xuICAgIE9LOiAyMDAsXG4gICAgUFJFVkVOVF9VUERBVEU6IDIwNCxcbiAgICAvLyBXZSBhY2NlcHQgYm90aCA0MDAgYW5kIDQwMSBmb3IgSldUIHRva2VuIGV4cGlyeSByZXNwb25zZXMuXG4gICAgLy8gU29tZSBzZXJ2ZXJzIHVzZSBjb2RlIDQwMCBmb3IgZXhwaXJlZCB0b2tlbnMsIGJlY2F1c2VcbiAgICAvLyB0aGV5IHJlc2VydmUgNDAxIGZvciBjYXNlcyB0aGF0IHJlcXVpcmUgdXNlciBhY3Rpb25cbiAgICBCQURfUkVRVUVTVDogNDAwLFxuICAgIFVOQVVUSE9SSVpFRDogNDAxLFxuICAgIENMSUVOVFNJREVfRVJST1I6ICdDTElFTlRTSURFX0VSUk9SJyxcbiAgICBOT19SRVNQT05TRTogJ05PX1JFU1BPTlNFJ1xufTtcblxuZXhwb3J0IGNvbnN0IFNUQVRVU01BUCA9IHtcbiAgICBbU1RBVFVTLk9LXTogJ1NVQ0NFU1MnLFxuICAgIFtTVEFUVVMuUFJFVkVOVF9VUERBVEVdOiAnTk9fVVBEQVRFJ1xufTtcbiIsImltcG9ydCB7aGFzLCBpbmNsdWRlc30gZnJvbSAncmFtZGEnO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJvcFR5cGVFcnJvckhhbmRsZXIobWVzc2FnZSwgcHJvcHMsIHR5cGUpIHtcbiAgICAvKlxuICAgICAqIHByb3BUeXBlIGVycm9yIG1lc3NhZ2VzIGFyZSBjb25zdHJ1Y3RlZCBpblxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9wcm9wLXR5cGVzL2Jsb2IvdjE1LjcuMi9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qc1xuICAgICAqIChWZXJzaW9uIDE1LjcuMilcbiAgICAgKlxuICAgICAqIFBhcnNlIHRoZXNlIGV4Y2VwdGlvbiBvYmplY3RzIHRvIHJlbW92ZSBKUyBzb3VyY2UgY29kZSBhbmQgaW1wcm92ZVxuICAgICAqIHRoZSBjbGFyaXR5LlxuICAgICAqXG4gICAgICogSWYgd3JvbmcgcHJvcCB0eXBlIHdhcyBwYXNzZWQgaW4sIG1lc3NhZ2UgbG9va3MgbGlrZTpcbiAgICAgKlxuICAgICAqIEVycm9yOiBcIkZhaWxlZCBjb21wb25lbnQgcHJvcCB0eXBlOiBJbnZhbGlkIGNvbXBvbmVudCBwcm9wIGBhbmltYXRlYCBvZiB0eXBlIGBudW1iZXJgIHN1cHBsaWVkIHRvIGBmdW5jdGlvbiBHcmFwaFdpdGhEZWZhdWx0cyhwcm9wcykge1xuICAgICAqICAgdmFyIGlkID0gcHJvcHMuaWQgPyBwcm9wcy5pZCA6IGdlbmVyYXRlSWQoKTtcbiAgICAgKiAgIHJldHVybiByZWFjdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KFBsb3RseUdyYXBoLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgKiAgICAgaWQ6IGlkXG4gICAgICogICB9KSk7XG4gICAgICogfWAsIGV4cGVjdGVkIGBib29sZWFuYC5cIlxuICAgICAqXG4gICAgICpcbiAgICAgKiBJZiBhIHJlcXVpcmVkIHByb3AgdHlwZSB3YXMgb21pdHRlZCwgbWVzc2FnZSBsb29rcyBsaWtlOlxuICAgICAqXG4gICAgICogXCJGYWlsZWQgY29tcG9uZW50IHByb3AgdHlwZTogVGhlIGNvbXBvbmVudCBwcm9wIGBvcHRpb25zWzBdLnZhbHVlYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgaW4gYGZ1bmN0aW9uIENoZWNrbGlzdChwcm9wcykge1xuICAgICAqICAgIHZhciBfdGhpcztcbiAgICAgKlxuICAgICAqICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDaGVja2xpc3QpO1xuICAgICAqXG4gICAgICogICAgIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX2dldFByb3RvdHlwZU9mKENoZWNrbGlzdCkuY2FsbCh0aGlzLCBwcm9wcykpO1xuICAgICAqICAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgKiAgICAgICB2YWx1ZXM6IHByb3BzLnZhbHVlc1xuICAgICAqICAgICB9O1xuICAgICAqICAgICByZXR1cm4gX3RoaXM7XG4gICAgICogICB9YCwgYnV0IGl0cyB2YWx1ZSBpcyBgdW5kZWZpbmVkYC5cIlxuICAgICAqXG4gICAgICovXG5cbiAgICBjb25zdCBtZXNzYWdlUGFydHMgPSBtZXNzYWdlLnNwbGl0KCdgJyk7XG4gICAgbGV0IGVycm9yTWVzc2FnZTtcbiAgICBpZiAoaW5jbHVkZXMoJ2lzIG1hcmtlZCBhcyByZXF1aXJlZCcsIG1lc3NhZ2UpKSB7XG4gICAgICAgIGNvbnN0IGludmFsaWRQcm9wUGF0aCA9IG1lc3NhZ2VQYXJ0c1sxXTtcbiAgICAgICAgZXJyb3JNZXNzYWdlID0gYCR7aW52YWxpZFByb3BQYXRofSBpbiAke3R5cGV9YDtcbiAgICAgICAgaWYgKHByb3BzLmlkKSB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYCB3aXRoIElEIFwiJHtwcm9wcy5pZH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgZXJyb3JNZXNzYWdlICs9ICcgaXMgcmVxdWlyZWQgYnV0IGl0IHdhcyBub3QgcHJvdmlkZWQuJztcbiAgICB9IGVsc2UgaWYgKGluY2x1ZGVzKCdCYWQgb2JqZWN0JywgbWVzc2FnZSkpIHtcbiAgICAgICAgLypcbiAgICAgICAgICogSGFuZGxlIC5leGFjdCBlcnJvcnNcbiAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3Byb3AtdHlwZXMvYmxvYi92MTUuNy4yL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzI0w0MzgtTDQ0MlxuICAgICAgICAgKi9cbiAgICAgICAgZXJyb3JNZXNzYWdlID1cbiAgICAgICAgICAgIG1lc3NhZ2Uuc3BsaXQoJ3N1cHBsaWVkIHRvICcpWzBdICtcbiAgICAgICAgICAgIGBzdXBwbGllZCB0byAke3R5cGV9YCArXG4gICAgICAgICAgICAnLlxcbkJhZCcgK1xuICAgICAgICAgICAgbWVzc2FnZS5zcGxpdCgnLlxcbkJhZCcpWzFdO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGluY2x1ZGVzKCdJbnZhbGlkICcsIG1lc3NhZ2UpICYmXG4gICAgICAgIGluY2x1ZGVzKCcgc3VwcGxpZWQgdG8gJywgbWVzc2FnZSlcbiAgICApIHtcbiAgICAgICAgY29uc3QgaW52YWxpZFByb3BQYXRoID0gbWVzc2FnZVBhcnRzWzFdO1xuXG4gICAgICAgIGVycm9yTWVzc2FnZSA9IGBJbnZhbGlkIGFyZ3VtZW50IFxcYCR7aW52YWxpZFByb3BQYXRofVxcYCBwYXNzZWQgaW50byAke3R5cGV9YDtcbiAgICAgICAgaWYgKHByb3BzLmlkKSB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYCB3aXRoIElEIFwiJHtwcm9wcy5pZH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgZXJyb3JNZXNzYWdlICs9ICcuJztcblxuICAgICAgICAvKlxuICAgICAgICAgKiBOb3QgYWxsIGVycm9yIG1lc3NhZ2VzIGluY2x1ZGUgdGhlIGV4cGVjdGVkIHZhbHVlLlxuICAgICAgICAgKiBJbiBwYXJ0aWN1bGFyLCBvbmVPZlR5cGUuXG4gICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9wcm9wLXR5cGVzL2Jsb2IvdjE1LjcuMi9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qcyNMMzg4XG4gICAgICAgICAqL1xuICAgICAgICBpZiAoaW5jbHVkZXMoJywgZXhwZWN0ZWQgJywgbWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkUHJvcFR5cGUgPSBtZXNzYWdlLnNwbGl0KCcsIGV4cGVjdGVkICcpWzFdO1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGBcXG5FeHBlY3RlZCAke2V4cGVjdGVkUHJvcFR5cGV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIE5vdCBhbGwgZXJyb3IgbWVzc2FnZXMgaW5jbHVkZSB0aGUgdHlwZVxuICAgICAgICAgKiBJbiBwYXJ0aWN1bGFyLCBvbmVPZlR5cGUuXG4gICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9wcm9wLXR5cGVzL2Jsb2IvdjE1LjcuMi9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qcyNMMzg4XG4gICAgICAgICAqL1xuICAgICAgICBpZiAoaW5jbHVkZXMoJyBvZiB0eXBlIGAnLCBtZXNzYWdlKSkge1xuICAgICAgICAgICAgY29uc3QgaW52YWxpZFByb3BUeXBlUHJvdmlkZWQgPSBtZXNzYWdlXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcgb2YgdHlwZSBgJylbMV1cbiAgICAgICAgICAgICAgICAuc3BsaXQoJ2AnKVswXTtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBgXFxuV2FzIHN1cHBsaWVkIHR5cGUgXFxgJHtpbnZhbGlkUHJvcFR5cGVQcm92aWRlZH1cXGAuYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXMoaW52YWxpZFByb3BQYXRoLCBwcm9wcykpIHtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBpbnZhbGlkUHJvcFBhdGggbWF5IGJlIG5lc3RlZCBsaWtlIGBvcHRpb25zWzBdLnZhbHVlYC5cbiAgICAgICAgICAgICAqIEZvciBub3csIHdlIHdvbid0IHRyeSB0byB1bnBhY2sgdGhlc2UgbmVzdGVkIG9wdGlvbnNcbiAgICAgICAgICAgICAqIGJ1dCB3ZSBjb3VsZCBpbiB0aGUgZnV0dXJlLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBqc29uU3VwcGxpZWRWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIHByb3BzW2ludmFsaWRQcm9wUGF0aF0sXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGpzb25TdXBwbGllZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVzKCdcXG4nLCBqc29uU3VwcGxpZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGBcXG5WYWx1ZSBwcm92aWRlZDogXFxuJHtqc29uU3VwcGxpZWRWYWx1ZX1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBgXFxuVmFsdWUgcHJvdmlkZWQ6ICR7anNvblN1cHBsaWVkVmFsdWV9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvKlxuICAgICAgICAgKiBOb3QgYXdhcmUgb2Ygb3RoZXIgcHJvcCB0eXBlIHdhcm5pbmcgbWVzc2FnZXMuXG4gICAgICAgICAqIEJ1dCwgaWYgdGhleSBleGlzdCwgdGhlbiBhdCBsZWFzdCB0aHJvdyB0aGUgZGVmYXVsdFxuICAgICAgICAgKiByZWFjdCBwcm9wIHR5cGVzIGVycm9yXG4gICAgICAgICAqL1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG59XG4iLCJpbXBvcnQge2luY2x1ZGVzLCB0eXBlfSBmcm9tICdyYW1kYSc7XG5cbmNvbnN0IFNJTVBMRV9DT01QT05FTlRfVFlQRVMgPSBbJ1N0cmluZycsICdOdW1iZXInLCAnTnVsbCcsICdCb29sZWFuJ107XG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudCA9PiBpbmNsdWRlcyh0eXBlKGNvbXBvbmVudCksIFNJTVBMRV9DT01QT05FTlRfVFlQRVMpO1xuIiwiLyoqXG4gKiBHZW5lcmFsaXplZCBwZXJzaXN0ZW5jZSBmb3IgY29tcG9uZW50IHByb3BzXG4gKlxuICogV2hlbiB1c2VycyBpbnB1dCBuZXcgcHJvcCB2YWx1ZXMsIHRoZXkgY2FuIGJlIHN0b3JlZCBhbmQgcmVhcHBsaWVkIGxhdGVyLFxuICogd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlY3JlYXRlZCAoY2hhbmdpbmcgYFRhYmAgZm9yIGV4YW1wbGUpIG9yIHdoZW4gdGhlXG4gKiBwYWdlIGlzIHJlbG9hZGVkIChkZXBlbmRpbmcgb24gYHBlcnNpc3RlbmNlX3R5cGVgKS4gU3RvcmFnZSBpcyB0aWVkIHRvXG4gKiBjb21wb25lbnQgSUQsIGFuZCB0aGUgcHJvcCB2YWx1ZXMgd2lsbCBub3QgYmUgc3RvcmVkIHdpdGggY29tcG9uZW50c1xuICogd2l0aG91dCBhbiBJRC5cbiAqXG4gKiBSZW5kZXJlciBoYW5kbGVzIHRoZSBtZWNoYW5pY3MsIGJ1dCBjb21wb25lbnRzIG11c3QgZGVmaW5lIGEgZmV3IHByb3BzOlxuICpcbiAqIC0gYHBlcnNpc3RlbmNlYDogYm9vbGVhbiwgc3RyaW5nLCBvciBudW1iZXIuIEZvciBzaW1wbGUgdXNhZ2UsIHNldCB0byBgdHJ1ZWBcbiAqICAgdG8gZW5hYmxlIHBlcnNpc3RlbmNlLCBvbWl0IG9yIHNldCBgZmFsc2VgIHRvIGRpc2FibGUuIEZvciBtb3JlIGNvbXBsZXhcbiAqICAgc2NlbmFyaW9zLCB1c2UgYW55IHRydXRoeSB2YWx1ZSwgYW5kIGNoYW5nZSB0byBhICpkaWZmZXJlbnQqIHRydXRoeSB2YWx1ZVxuICogICB3aGVuIHlvdSB3YW50IHRoZSBwZXJzaXN0ZWQgdmFsdWVzIGNsZWFyZWQuIChtb2RlbGVkIG9mZiBgdWlyZXZpc2lvbmAgaW4pXG4gKiAgIHBsb3RseS5qc1xuICogICBUeXBpY2FsbHkgc2hvdWxkIGhhdmUgbm8gZGVmYXVsdCwgYnV0IHRoZSBvdGhlciBwZXJzaXN0ZW5jZSBwcm9wcyBzaG91bGRcbiAqICAgaGF2ZSBkZWZhdWx0cywgc28gYWxsIGEgdXNlciBuZWVkcyB0byBkbyB0byBlbmFibGUgcGVyc2lzdGVuY2UgaXMgc2V0IHRoaXNcbiAqICAgb25lIHByb3AuXG4gKlxuICogLSBgcGVyc2lzdGVkX3Byb3BzYDogYXJyYXkgb2YgcHJvcCBuYW1lcyBvciBcIm5lc3RlZCBwcm9wIElEc1wiIGFsbG93ZWQgdG9cbiAqICAgcGVyc2lzdC4gTm9ybWFsbHkgc2hvdWxkIGRlZmF1bHQgdG8gdGhlIGZ1bGwgbGlzdCBvZiBzdXBwb3J0ZWQgcHJvcHMsXG4gKiAgIHNvIHRoZXkgY2FuIGFsbCBiZSBlbmFibGVkIGF0IG9uY2UuIFRoZSBtYWluIGV4Y2VwdGlvbiB0byB0aGlzIGlzIGlmXG4gKiAgIHRoZXJlJ3MgYSBwcm9wIHRoYXQgKmNhbiogYmUgcGVyc2lzdGVkIGJ1dCBtb3N0IHVzZXJzIHdvdWxkbid0IHdhbnQgdGhpcy5cbiAqICAgQSBuZXN0ZWQgcHJvcCBJRCBkZXNjcmliZXMgKnBhcnQqIG9mIGEgcHJvcCB0byBzdG9yZS4gSXQgbXVzdCBiZVxuICogICBcIjxwcm9wTmFtZT4uPHBpZWNlPlwiIHdoZXJlIHByb3BOYW1lIGlzIHRoZSBwcm9wIHRoYXQgaGFzIHRoaXMgaW5mbywgYW5kXG4gKiAgIHBpZWNlIG1heSBvciBtYXkgbm90IG1hcCB0byB0aGUgZXhhY3Qgc3Vic3RydWN0dXJlIGJlaW5nIHN0b3JlZCBidXQgaXNcbiAqICAgbWVhbmluZ2Z1bCB0byB0aGUgdXNlci4gRm9yIGV4YW1wbGUsIGluIGBkYXNoX3RhYmxlYCwgYGNvbHVtbnMubmFtZWBcbiAqICAgc3RvcmVzIGBjb2x1bW5zW2ldLm5hbWVgIGZvciBhbGwgY29sdW1ucyBgaWAuIE5lc3RlZCBwcm9wcyBhbHNvIG5lZWRcbiAqICAgZW50cmllcyBpbiBgcGVyc2lzdGVuY2VUcmFuc2Zvcm1zYCAtIHNlZSBiZWxvdy5cbiAqXG4gKiAtIGBwZXJzaXN0ZW5jZV90eXBlYDogb25lIG9mIFwibG9jYWxcIiwgXCJzZXNzaW9uXCIsIG9yIFwibWVtb3J5XCIsIGp1c3QgbGlrZVxuICogICBgZGNjLlN0b3JlYC4gQnV0IHRoZSBkZWZhdWx0IGhlcmUgc2hvdWxkIGJlIFwibG9jYWxcIiBiZWNhdXNlIHRoZSBtYWluIHVzZVxuICogICBjYXNlIGlzIHRvIG1haW50YWluIHNldHRpbmdzIGFjcm9zcyByZWxvYWRzLlxuICpcbiAqIElmIGFueSBgcGVyc2lzdGVkX3Byb3BzYCBhcmUgbmVzdGVkIHByb3AgSURzLCB0aGUgY29tcG9uZW50IHNob3VsZCBkZWZpbmUgYVxuICogY2xhc3MgcHJvcGVydHkgKG5vdCBhIFJlYWN0IHByb3ApIGBwZXJzaXN0ZW5jZVRyYW5zZm9ybXNgLCBhcyBhbiBvYmplY3Q6XG4gKiB7XG4gKiAgIFtwcm9wTmFtZV06IHtcbiAqICAgICBbcGllY2VdOiB7XG4gKiAgICAgICBleHRyYWN0OiBwcm9wVmFsdWUgPT4gdmFsdWVUb1N0b3JlLFxuICogICAgICAgYXBwbHk6IChzdG9yZWRWYWx1ZSwgcHJvcFZhbHVlKSA9PiBuZXdQcm9wVmFsdWVcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIC0gYGV4dHJhY3RgIHR1cm5zIGEgcHJvcCB2YWx1ZSBpbnRvIGEgcmVkdWNlZCB2YWx1ZSB0byBzdG9yZS5cbiAqIC0gYGFwcGx5YCBwdXRzIGFuIGV4dHJhY3RlZCB2YWx1ZSBiYWNrIGludG8gdGhlIHByb3AuIE1ha2Ugc3VyZSB0aGlzIGNyZWF0ZXNcbiAqICAgYSBuZXcgb2JqZWN0IHJhdGhlciB0aGFuIG11dGF0aW5nIGBwcm9WYWx1ZWAsIGFuZCB0aGF0IGlmIHRoZXJlIGFyZVxuICogICBtdWx0aXBsZSBgcGllY2VgIGVudHJpZXMgZm9yIG9uZSBgcHJvcE5hbWVgLCB0aGVpciBgYXBwbHlgIGZ1bmN0aW9uc1xuICogICBjb21tdXRlIC0gd2hpY2ggc2hvdWxkIG5vdCBiZSBhbiBpc3N1ZSBpZiB0aGV5IGV4dHJhY3QgYW5kIGFwcGx5XG4gKiAgIG5vbi1pbnRlcnNlY3RpbmcgcGFydHMgb2YgdGhlIGZ1bGwgcHJvcC5cbiAqIFlvdSBvbmx5IG5lZWQgdG8gZGVmaW5lIHRoZXNlIGZvciB0aGUgcHJvcHMgdGhhdCBuZWVkIHRoZW0uXG4gKiBJdCdzIGltcG9ydGFudCB0aGF0IGBleHRyYWN0YCBwdWxscyBvdXQgKm9ubHkqIHRoZSByZWxldmFudCBwaWVjZXMgb2YgdGhlXG4gKiBwcm9wLCBiZWNhdXNlIHBlcnNpc3RlbmNlIGlzIG9ubHkgbWFpbnRhaW5lZCBpZiB0aGUgZXh0cmFjdGVkIHZhbHVlIG9mIHRoZVxuICogcHJvcCBiZWZvcmUgYXBwbHlpbmcgcGVyc2lzdGVuY2UgaXMgdGhlIHNhbWUgYXMgaXQgd2FzIGJlZm9yZSB0aGUgdXNlcidzXG4gKiBjaGFuZ2VzLlxuICovXG5cbmltcG9ydCB7XG4gICAgZXF1YWxzLFxuICAgIGZpbHRlcixcbiAgICBmb3JFYWNoLFxuICAgIGtleXMsXG4gICAgbGVuc1BhdGgsXG4gICAgbWVyZ2VSaWdodCxcbiAgICBzZXQsXG4gICAgdHlwZVxufSBmcm9tICdyYW1kYSc7XG5pbXBvcnQge2NyZWF0ZUFjdGlvbn0gZnJvbSAncmVkdXgtYWN0aW9ucyc7XG5cbmltcG9ydCBSZWdpc3RyeSBmcm9tICcuL3JlZ2lzdHJ5JztcbmltcG9ydCB7c3RyaW5naWZ5SWR9IGZyb20gJy4vYWN0aW9ucy9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHtpc0RyeUNvbXBvbmVudH0gZnJvbSAnLi93cmFwcGVyL3dyYXBwaW5nJztcblxuZXhwb3J0IGNvbnN0IHN0b3JlUHJlZml4ID0gJ19kYXNoX3BlcnNpc3RlbmNlLic7XG5cbmZ1bmN0aW9uIGVycihlKSB7XG4gICAgY29uc3QgZXJyb3IgPSB0eXBlb2YgZSA9PT0gJ3N0cmluZycgPyBuZXcgRXJyb3IoZSkgOiBlO1xuXG4gICAgcmV0dXJuIGNyZWF0ZUFjdGlvbignT05fRVJST1InKSh7XG4gICAgICAgIHR5cGU6ICdmcm9udEVuZCcsXG4gICAgICAgIGVycm9yXG4gICAgfSk7XG59XG5cbi8qXG4gKiBEb2VzIGEga2V5IGZpdCB0aGlzIHByZWZpeD8gTXVzdCBlaXRoZXIgYmUgYW4gZXhhY3QgbWF0Y2hcbiAqIG9yLCBpZiBhIHNlcGFyYXRvciBpcyBwcm92aWRlZCwgYSBzY29wZWQgbWF0Y2ggLSBleGFjdCBwcmVmaXhcbiAqIGZvbGxvd2VkIGJ5IHRoZSBzZXBhcmF0b3IgKHRoZW4gYW55dGhpbmcgZWxzZSlcbiAqL1xuZnVuY3Rpb24ga2V5UHJlZml4TWF0Y2gocHJlZml4LCBzZXBhcmF0b3IpIHtcbiAgICBjb25zdCBmdWxsU3RyID0gcHJlZml4ICsgc2VwYXJhdG9yO1xuICAgIGNvbnN0IGZ1bGxMZW4gPSBmdWxsU3RyLmxlbmd0aDtcbiAgICByZXR1cm4ga2V5ID0+IGtleSA9PT0gcHJlZml4IHx8IGtleS5zdWJzdHIoMCwgZnVsbExlbikgPT09IGZ1bGxTdHI7XG59XG5cbmNvbnN0IFVOREVGSU5FRCA9ICdVJztcbmNvbnN0IF9wYXJzZSA9IHZhbCA9PiAodmFsID09PSBVTkRFRklORUQgPyB1bmRlZmluZWQgOiBKU09OLnBhcnNlKHZhbCB8fCBudWxsKSk7XG5jb25zdCBfc3RyaW5naWZ5ID0gdmFsID0+ICh2YWwgPT09IHVuZGVmaW5lZCA/IFVOREVGSU5FRCA6IEpTT04uc3RyaW5naWZ5KHZhbCkpO1xuXG5jbGFzcyBXZWJTdG9yZSB7XG4gICAgY29uc3RydWN0b3IoYmFja0VuZCkge1xuICAgICAgICB0aGlzLl9uYW1lID0gYmFja0VuZDtcbiAgICAgICAgdGhpcy5fc3RvcmFnZSA9IHdpbmRvd1tiYWNrRW5kXTtcbiAgICB9XG5cbiAgICBoYXNJdGVtKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RvcmFnZS5nZXRJdGVtKHN0b3JlUHJlZml4ICsga2V5KSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXRJdGVtKGtleSkge1xuICAgICAgICAvLyBub3RlOiBfc3RvcmFnZS5nZXRJdGVtIHJldHVybnMgbnVsbCBvbiBtaXNzaW5nIGtleXNcbiAgICAgICAgLy8gYW5kIEpTT04ucGFyc2UobnVsbCkgcmV0dXJucyBudWxsIGFzIHdlbGxcbiAgICAgICAgcmV0dXJuIF9wYXJzZSh0aGlzLl9zdG9yYWdlLmdldEl0ZW0oc3RvcmVQcmVmaXggKyBrZXkpKTtcbiAgICB9XG5cbiAgICBfc2V0SXRlbShrZXksIHZhbHVlKSB7XG4gICAgICAgIC8vIHVucHJvdGVjdGVkIHZlcnNpb24gb2Ygc2V0SXRlbSwgZm9yIHVzZSBieSB0cnlHZXRXZWJTdG9yZVxuICAgICAgICB0aGlzLl9zdG9yYWdlLnNldEl0ZW0oc3RvcmVQcmVmaXggKyBrZXksIF9zdHJpbmdpZnkodmFsdWUpKTtcbiAgICB9XG4gICAgLypcbiAgICAgKiBJbiBhZGRpdGlvbiB0byB0aGUgcmVndWxhciBrZXktPnZhbHVlIHRvIHNldCwgc2V0SXRlbSB0YWtlc1xuICAgICAqIGRpc3BhdGNoIGFzIGEgcGFyYW1ldGVyLCBzbyBpdCBjYW4gcmVwb3J0IE9PTSB0byBkZXZ0b29sc1xuICAgICAqL1xuICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSwgZGlzcGF0Y2gpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuX3NldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIGVycihcbiAgICAgICAgICAgICAgICAgICAgYCR7a2V5fSBmYWlsZWQgdG8gc2F2ZSBpbiAke3RoaXMuX25hbWV9LiBQZXJzaXN0ZWQgcHJvcHMgbWF5IGJlIGxvc3QuYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBUT0RPOiBhdCBzb21lIHBvaW50IHdlIG1heSB3YW50IHRvIGNvbnZlcnQgdGhpcyB0byBmYWxsIGJhY2tcbiAgICAgICAgICAgIC8vIG9uIG1lbW9yeSwgcHVsbGluZyBvdXQgYWxsIHBlcnNpc3RlbmNlIGtleXMgYW5kIHB1dHRpbmcgdGhlbVxuICAgICAgICAgICAgLy8gaW4gYSBNZW1TdG9yZSB0aGF0IGdldHMgdXNlZCBmcm9tIHRoZW4gb253YXJkLlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlSXRlbShrZXkpIHtcbiAgICAgICAgdGhpcy5fc3RvcmFnZS5yZW1vdmVJdGVtKHN0b3JlUHJlZml4ICsga2V5KTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIGNsZWFyIG1hdGNoaW5nIGtleXMgbWF0Y2hpbmcgKG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSBkb3QgYW5kIG1vcmVcbiAgICAgKiBjaGFyYWN0ZXJzKSAtIG9yIGFsbCBrZXlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0b3JlIGlmIG5vIHByZWZpeC5cbiAgICAgKi9cbiAgICBjbGVhcihrZXlQcmVmaXgpIHtcbiAgICAgICAgY29uc3QgZnVsbFByZWZpeCA9IHN0b3JlUHJlZml4ICsgKGtleVByZWZpeCB8fCAnJyk7XG4gICAgICAgIGNvbnN0IGtleU1hdGNoID0ga2V5UHJlZml4TWF0Y2goZnVsbFByZWZpeCwga2V5UHJlZml4ID8gJy4nIDogJycpO1xuICAgICAgICBjb25zdCBrZXlzVG9SZW1vdmUgPSBbXTtcbiAgICAgICAgLy8gMi1zdGVwIHByb2Nlc3MsIHNvIHdlIGRvbid0IGRlcGVuZCBvbiBhbnkgcGFydGljdWxhciBiZWhhdmlvciBvZlxuICAgICAgICAvLyBrZXkgb3JkZXIgd2hpbGUgcmVtb3Zpbmcgc29tZVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3N0b3JhZ2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxLZXkgPSB0aGlzLl9zdG9yYWdlLmtleShpKTtcbiAgICAgICAgICAgIGlmIChrZXlNYXRjaChmdWxsS2V5KSkge1xuICAgICAgICAgICAgICAgIGtleXNUb1JlbW92ZS5wdXNoKGZ1bGxLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvckVhY2goayA9PiB0aGlzLl9zdG9yYWdlLnJlbW92ZUl0ZW0oayksIGtleXNUb1JlbW92ZSk7XG4gICAgfVxufVxuXG5jbGFzcyBNZW1TdG9yZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcbiAgICB9XG5cbiAgICBoYXNJdGVtKGtleSkge1xuICAgICAgICByZXR1cm4ga2V5IGluIHRoaXMuX2RhdGE7XG4gICAgfVxuXG4gICAgZ2V0SXRlbShrZXkpIHtcbiAgICAgICAgLy8gcnVuIHRoaXMgc3RvcmFnZSB0aHJvdWdoIEpTT04gdG9vIHNvIHdlIGtub3cgd2UgZ2V0IGEgZnJlc2ggb2JqZWN0XG4gICAgICAgIC8vIGVhY2ggcmV0cmlldmFsXG4gICAgICAgIHJldHVybiBfcGFyc2UodGhpcy5fZGF0YVtrZXldKTtcbiAgICB9XG5cbiAgICBzZXRJdGVtKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZGF0YVtrZXldID0gX3N0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmVtb3ZlSXRlbShrZXkpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2RhdGFba2V5XTtcbiAgICB9XG5cbiAgICBjbGVhcihrZXlQcmVmaXgpIHtcbiAgICAgICAgaWYgKGtleVByZWZpeCkge1xuICAgICAgICAgICAgZm9yRWFjaChcbiAgICAgICAgICAgICAgICBrZXkgPT4gZGVsZXRlIHRoaXMuX2RhdGFba2V5XSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIoa2V5UHJlZml4TWF0Y2goa2V5UHJlZml4LCAnLicpLCBrZXlzKHRoaXMuX2RhdGEpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gTWFrZSBhIHN0cmluZyAyXjE2IGNoYXJhY3RlcnMgbG9uZyAoKjIgYnl0ZXMvY2hhciA9IDEzMGtCKSwgdG8gdGVzdCBzdG9yYWdlLlxuLy8gVGhhdCBzaG91bGQgYmUgcGxlbnR5IGZvciBjb21tb24gcGVyc2lzdGVuY2UgdXNlIGNhc2VzLFxuLy8gd2l0aG91dCBnZXR0aW5nIGFueXdoZXJlIG5lYXIgdHlwaWNhbCBicm93c2VyIGxpbWl0c1xuY29uc3QgcG93ID0gMTY7XG5mdW5jdGlvbiBsb25nU3RyaW5nKCkge1xuICAgIGxldCBzID0gJ1NwYW0nO1xuICAgIGZvciAobGV0IGkgPSAyOyBpIDwgcG93OyBpKyspIHtcbiAgICAgICAgcyArPSBzO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn1cblxuZXhwb3J0IGNvbnN0IHN0b3JlcyA9IHtcbiAgICBtZW1vcnk6IG5ldyBNZW1TdG9yZSgpXG4gICAgLy8gRGVmZXIgdGVzdGluZyAmIG1ha2luZyBsb2NhbC9zZXNzaW9uIHN0b3JlcyB1bnRpbCByZXF1ZXN0ZWQuXG4gICAgLy8gVGhhdCB3YXkgaWYgd2UgaGF2ZSBlcnJvcnMgaGVyZSB0aGV5IGNhbiBzaG93IHVwIGluIGRldnRvb2xzLlxufTtcblxuY29uc3QgYmFja0VuZHMgPSB7XG4gICAgbG9jYWw6ICdsb2NhbFN0b3JhZ2UnLFxuICAgIHNlc3Npb246ICdzZXNzaW9uU3RvcmFnZSdcbn07XG5cbmZ1bmN0aW9uIHRyeUdldFdlYlN0b3JlKGJhY2tFbmQsIGRpc3BhdGNoKSB7XG4gICAgY29uc3Qgc3RvcmUgPSBuZXcgV2ViU3RvcmUoYmFja0VuZCk7XG4gICAgY29uc3QgZmFsbGJhY2tTdG9yZSA9IHN0b3Jlcy5tZW1vcnk7XG4gICAgY29uc3Qgc3RvcmVUZXN0ID0gbG9uZ1N0cmluZygpO1xuICAgIGNvbnN0IHRlc3RLZXkgPSBzdG9yZVByZWZpeCArICd4LngnO1xuICAgIHRyeSB7XG4gICAgICAgIHN0b3JlLl9zZXRJdGVtKHRlc3RLZXksIHN0b3JlVGVzdCk7XG4gICAgICAgIGlmIChzdG9yZS5nZXRJdGVtKHRlc3RLZXkpICE9PSBzdG9yZVRlc3QpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIGVycihgJHtiYWNrRW5kfSBpbml0IGZhaWxlZCBzZXQvZ2V0LCBmYWxsaW5nIGJhY2sgdG8gbWVtb3J5YClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZmFsbGJhY2tTdG9yZTtcbiAgICAgICAgfVxuICAgICAgICBzdG9yZS5yZW1vdmVJdGVtKHRlc3RLZXkpO1xuICAgICAgICByZXR1cm4gc3RvcmU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgIGVycihgJHtiYWNrRW5kfSBpbml0IGZpcnN0IHRyeSBmYWlsZWQ7IGNsZWFyaW5nIGFuZCByZXRyeWluZ2ApXG4gICAgICAgICk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHN0b3JlLmNsZWFyKCk7XG4gICAgICAgIHN0b3JlLl9zZXRJdGVtKHRlc3RLZXksIHN0b3JlVGVzdCk7XG4gICAgICAgIGlmIChzdG9yZS5nZXRJdGVtKHRlc3RLZXkpICE9PSBzdG9yZVRlc3QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm9wZScpO1xuICAgICAgICB9XG4gICAgICAgIHN0b3JlLnJlbW92ZUl0ZW0odGVzdEtleSk7XG4gICAgICAgIGRpc3BhdGNoKGVycihgJHtiYWNrRW5kfSBpbml0IHNldC9nZXQgc3VjY2VlZGVkIGFmdGVyIGNsZWFyaW5nIWApKTtcbiAgICAgICAgcmV0dXJuIHN0b3JlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZGlzcGF0Y2goZXJyKGAke2JhY2tFbmR9IGluaXQgc3RpbGwgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gbWVtb3J5YCkpO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2tTdG9yZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0b3JlKHR5cGUsIGRpc3BhdGNoKSB7XG4gICAgaWYgKCFzdG9yZXNbdHlwZV0pIHtcbiAgICAgICAgc3RvcmVzW3R5cGVdID0gdHJ5R2V0V2ViU3RvcmUoYmFja0VuZHNbdHlwZV0sIGRpc3BhdGNoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0b3Jlc1t0eXBlXTtcbn1cblxuY29uc3Qgbm9vcFRyYW5zZm9ybSA9IHtcbiAgICBleHRyYWN0OiBwcm9wVmFsdWUgPT4gcHJvcFZhbHVlLFxuICAgIGFwcGx5OiAoc3RvcmVkVmFsdWUsIF9wcm9wVmFsdWUpID0+IHN0b3JlZFZhbHVlXG59O1xuXG5jb25zdCBnZXRUcmFuc2Zvcm0gPSAoZWxlbWVudCwgcHJvcE5hbWUsIHByb3BQYXJ0KSA9PiB7XG4gICAgaWYgKFxuICAgICAgICBlbGVtZW50LnBlcnNpc3RlbmNlVHJhbnNmb3JtcyAmJlxuICAgICAgICBlbGVtZW50LnBlcnNpc3RlbmNlVHJhbnNmb3Jtc1twcm9wTmFtZV1cbiAgICApIHtcbiAgICAgICAgaWYgKHByb3BQYXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5wZXJzaXN0ZW5jZVRyYW5zZm9ybXNbcHJvcE5hbWVdW3Byb3BQYXJ0XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudC5wZXJzaXN0ZW5jZVRyYW5zZm9ybXNbcHJvcE5hbWVdO1xuICAgIH1cbiAgICByZXR1cm4gbm9vcFRyYW5zZm9ybTtcbn07XG5cbmNvbnN0IGdldFZhbHNLZXkgPSAoaWQsIHBlcnNpc3RlZFByb3AsIHBlcnNpc3RlbmNlKSA9PlxuICAgIGAke3N0cmluZ2lmeUlkKGlkKX0uJHtwZXJzaXN0ZWRQcm9wfS4ke0pTT04uc3RyaW5naWZ5KHBlcnNpc3RlbmNlKX1gO1xuXG5jb25zdCBnZXRQcm9wcyA9IGxheW91dCA9PiB7XG4gICAgY29uc3Qge3Byb3BzLCB0eXBlLCBuYW1lc3BhY2V9ID0gbGF5b3V0O1xuICAgIGlmICghdHlwZSB8fCAhbmFtZXNwYWNlKSB7XG4gICAgICAgIC8vIG5vdCBhIHJlYWwgY29tcG9uZW50IC0ganVzdCBuZWVkIHRoZSBwcm9wcyBmb3IgcmVjdXJzaW9uXG4gICAgICAgIHJldHVybiB7cHJvcHN9O1xuICAgIH1cbiAgICBjb25zdCB7aWQsIHBlcnNpc3RlbmNlfSA9IHByb3BzO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IFJlZ2lzdHJ5LnJlc29sdmUobGF5b3V0KTtcbiAgICBjb25zdCBnZXRWYWwgPSBwcm9wID0+XG4gICAgICAgIHByb3BzW3Byb3BdIHx8XG4gICAgICAgIChlbGVtZW50LmRlZmF1bHRQcm9wcyB8fCBlbGVtZW50LmRhc2hQZXJzaXN0ZW5jZSB8fCB7fSlbcHJvcF07XG4gICAgY29uc3QgcGVyc2lzdGVkX3Byb3BzID0gZ2V0VmFsKCdwZXJzaXN0ZWRfcHJvcHMnKTtcbiAgICBjb25zdCBwZXJzaXN0ZW5jZV90eXBlID0gZ2V0VmFsKCdwZXJzaXN0ZW5jZV90eXBlJyk7XG4gICAgY29uc3QgY2FuUGVyc2lzdCA9IGlkICYmIHBlcnNpc3RlZF9wcm9wcyAmJiBwZXJzaXN0ZW5jZV90eXBlO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2FuUGVyc2lzdCxcbiAgICAgICAgaWQsXG4gICAgICAgIHByb3BzLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBwZXJzaXN0ZW5jZSxcbiAgICAgICAgcGVyc2lzdGVkX3Byb3BzLFxuICAgICAgICBwZXJzaXN0ZW5jZV90eXBlXG4gICAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRVaUVkaXQobGF5b3V0LCBuZXdQcm9wcywgZGlzcGF0Y2gpIHtcbiAgICBjb25zdCB7XG4gICAgICAgIGNhblBlcnNpc3QsXG4gICAgICAgIGlkLFxuICAgICAgICBwcm9wcyxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgcGVyc2lzdGVuY2UsXG4gICAgICAgIHBlcnNpc3RlZF9wcm9wcyxcbiAgICAgICAgcGVyc2lzdGVuY2VfdHlwZVxuICAgIH0gPSBnZXRQcm9wcyhsYXlvdXQpO1xuXG4gICAgLy8gaWYgdGhlIFwicGVyc2lzdGVuY2VcIiBwcm9wZXJ0eSBpcyBjaGFuZ2VkIGFzIGEgY2FsbGJhY2sgb3V0cHV0LFxuICAgIC8vIHNraXAgdGhlIHBlcnNpc3RlbmNlIHN0b3JhZ2Ugb3ZlcndyaXRpbmcuXG4gICAgY29uc3QgaXNQZXJzaXN0ZW5jZU1pc21hdGNoID1cbiAgICAgICAgbmV3UHJvcHM/LnBlcnNpc3RlbmNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgbmV3UHJvcHMucGVyc2lzdGVuY2UgIT09IHBlcnNpc3RlbmNlO1xuXG4gICAgaWYgKCFjYW5QZXJzaXN0IHx8ICFwZXJzaXN0ZW5jZSB8fCBpc1BlcnNpc3RlbmNlTWlzbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvckVhY2gocGVyc2lzdGVkUHJvcCA9PiB7XG4gICAgICAgIGNvbnN0IFtwcm9wTmFtZSwgcHJvcFBhcnRdID0gcGVyc2lzdGVkUHJvcC5zcGxpdCgnLicpO1xuICAgICAgICBpZiAobmV3UHJvcHNbcHJvcE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBnZXRTdG9yZShwZXJzaXN0ZW5jZV90eXBlLCBkaXNwYXRjaCk7XG4gICAgICAgICAgICBjb25zdCB7ZXh0cmFjdH0gPSBnZXRUcmFuc2Zvcm0oZWxlbWVudCwgcHJvcE5hbWUsIHByb3BQYXJ0KTtcblxuICAgICAgICAgICAgY29uc3QgdmFsc0tleSA9IGdldFZhbHNLZXkoaWQsIHBlcnNpc3RlZFByb3AsIHBlcnNpc3RlbmNlKTtcbiAgICAgICAgICAgIGxldCBvcmlnaW5hbFZhbCA9IGV4dHJhY3QocHJvcHNbcHJvcE5hbWVdKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbCA9IGV4dHJhY3QobmV3UHJvcHNbcHJvcE5hbWVdKTtcblxuICAgICAgICAgICAgLy8gbWFpbmx5IGZvciBuZXN0ZWQgcHJvcHMgd2l0aCBtdWx0aXBsZSBwZXJzaXN0ZWQgcGFydHMsIGl0J3NcbiAgICAgICAgICAgIC8vIHBvc3NpYmxlIHRvIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYmVmb3JlIC0gc2hvdWxkIG5vdCBzdG9yZVxuICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlLlxuICAgICAgICAgICAgaWYgKG9yaWdpbmFsVmFsICE9PSBuZXdWYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RvcmFnZS5oYXNJdGVtKHZhbHNLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsID0gc3RvcmFnZS5nZXRJdGVtKHZhbHNLZXkpWzFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB2YWxzID1cbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxWYWwgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBbbmV3VmFsXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBbbmV3VmFsLCBvcmlnaW5hbFZhbF07XG4gICAgICAgICAgICAgICAgc3RvcmFnZS5zZXRJdGVtKHZhbHNLZXksIHZhbHMsIGRpc3BhdGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHBlcnNpc3RlZF9wcm9wcyk7XG59XG5cbi8qXG4gKiBVc2VkIGZvciBlbnRpcmUgbGF5b3V0cyAob24gbG9hZCkgb3IgcGFydGlhbCBsYXlvdXRzIChmcm9tIGNoaWxkcmVuXG4gKiBjYWxsYmFja3MpIHRvIGFwcGx5IHByZXZpb3VzbHktc3RvcmVkIFVJIGVkaXRzIHRvIGNvbXBvbmVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGVyc2lzdGVuY2UobGF5b3V0LCBkaXNwYXRjaCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGxheW91dCkpIHtcbiAgICAgICAgcmV0dXJuIGxheW91dC5tYXAobGF5ID0+XG4gICAgICAgICAgICBpc0RyeUNvbXBvbmVudChsYXkpID8gcGVyc2lzdGVuY2VNb2RzKGxheSwgbGF5LCBbXSwgZGlzcGF0Y2gpIDogbGF5XG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBwZXJzaXN0ZW5jZU1vZHMobGF5b3V0LCBsYXlvdXQsIFtdLCBkaXNwYXRjaCk7XG59XG5cbmNvbnN0IFVORE8gPSB0cnVlO1xuZnVuY3Rpb24gbW9kUHJvcChrZXksIHN0b3JhZ2UsIGVsZW1lbnQsIHByb3BzLCBwZXJzaXN0ZWRQcm9wLCB1cGRhdGUsIHVuZG8pIHtcbiAgICBpZiAoc3RvcmFnZS5oYXNJdGVtKGtleSkpIHtcbiAgICAgICAgY29uc3QgW25ld1ZhbCwgb3JpZ2luYWxWYWxdID0gc3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICAgIGNvbnN0IGZyb21WYWwgPSB1bmRvID8gbmV3VmFsIDogb3JpZ2luYWxWYWw7XG4gICAgICAgIGNvbnN0IHRvVmFsID0gdW5kbyA/IG9yaWdpbmFsVmFsIDogbmV3VmFsO1xuICAgICAgICBjb25zdCBbcHJvcE5hbWUsIHByb3BQYXJ0XSA9IHBlcnNpc3RlZFByb3Auc3BsaXQoJy4nKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gZ2V0VHJhbnNmb3JtKGVsZW1lbnQsIHByb3BOYW1lLCBwcm9wUGFydCk7XG5cbiAgICAgICAgaWYgKGVxdWFscyhmcm9tVmFsLCB0cmFuc2Zvcm0uZXh0cmFjdChwcm9wc1twcm9wTmFtZV0pKSkge1xuICAgICAgICAgICAgdXBkYXRlW3Byb3BOYW1lXSA9IHRyYW5zZm9ybS5hcHBseShcbiAgICAgICAgICAgICAgICB0b1ZhbCxcbiAgICAgICAgICAgICAgICBwcm9wTmFtZSBpbiB1cGRhdGUgPyB1cGRhdGVbcHJvcE5hbWVdIDogcHJvcHNbcHJvcE5hbWVdXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY2xlYXIgdGhpcyBzYXZlZCBlZGl0IC0gd2UndmUgc3RhcnRlZCB3aXRoIHRoZSB3cm9uZ1xuICAgICAgICAgICAgLy8gdmFsdWUgZm9yIHRoaXMgcGVyc2lzdGVuY2UgSURcbiAgICAgICAgICAgIHN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwZXJzaXN0ZW5jZU1vZHMobGF5b3V0LCBjb21wb25lbnQsIHBhdGgsIGRpc3BhdGNoKSB7XG4gICAgY29uc3Qge1xuICAgICAgICBjYW5QZXJzaXN0LFxuICAgICAgICBpZCxcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHBlcnNpc3RlbmNlLFxuICAgICAgICBwZXJzaXN0ZWRfcHJvcHMsXG4gICAgICAgIHBlcnNpc3RlbmNlX3R5cGVcbiAgICB9ID0gZ2V0UHJvcHMoY29tcG9uZW50KTtcblxuICAgIGxldCBsYXlvdXRPdXQgPSBsYXlvdXQ7XG4gICAgaWYgKGNhblBlcnNpc3QgJiYgcGVyc2lzdGVuY2UpIHtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGdldFN0b3JlKHBlcnNpc3RlbmNlX3R5cGUsIGRpc3BhdGNoKTtcbiAgICAgICAgY29uc3QgdXBkYXRlID0ge307XG4gICAgICAgIGZvckVhY2goXG4gICAgICAgICAgICBwZXJzaXN0ZWRQcm9wID0+XG4gICAgICAgICAgICAgICAgbW9kUHJvcChcbiAgICAgICAgICAgICAgICAgICAgZ2V0VmFsc0tleShpZCwgcGVyc2lzdGVkUHJvcCwgcGVyc2lzdGVuY2UpLFxuICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVkUHJvcCxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHBlcnNpc3RlZF9wcm9wc1xuICAgICAgICApO1xuXG4gICAgICAgIGZvciAoY29uc3QgcHJvcE5hbWUgaW4gdXBkYXRlKSB7XG4gICAgICAgICAgICBsYXlvdXRPdXQgPSBzZXQoXG4gICAgICAgICAgICAgICAgbGVuc1BhdGgocGF0aC5jb25jYXQoJ3Byb3BzJywgcHJvcE5hbWUpKSxcbiAgICAgICAgICAgICAgICB1cGRhdGVbcHJvcE5hbWVdLFxuICAgICAgICAgICAgICAgIGxheW91dE91dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJlY3Vyc2UgaW53YXJkXG4gICAgY29uc3Qge2NoaWxkcmVufSA9IHByb3BzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGUoY2hpbGQpID09PSAnT2JqZWN0JyAmJiBjaGlsZC5wcm9wcykge1xuICAgICAgICAgICAgICAgIGxheW91dE91dCA9IHBlcnNpc3RlbmNlTW9kcyhcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0T3V0LFxuICAgICAgICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5jb25jYXQoJ3Byb3BzJywgJ2NoaWxkcmVuJywgaSksXG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlKGNoaWxkcmVuKSA9PT0gJ09iamVjdCcgJiYgY2hpbGRyZW4ucHJvcHMpIHtcbiAgICAgICAgbGF5b3V0T3V0ID0gcGVyc2lzdGVuY2VNb2RzKFxuICAgICAgICAgICAgbGF5b3V0T3V0LFxuICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICBwYXRoLmNvbmNhdCgncHJvcHMnLCAnY2hpbGRyZW4nKSxcbiAgICAgICAgICAgIGRpc3BhdGNoXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBsYXlvdXRPdXQ7XG59XG5cbi8qXG4gKiBXaGVuIHdlIHJlY2VpdmUgbmV3IGV4cGxpY2l0IHByb3BzIGZyb20gYSBjYWxsYmFjayxcbiAqIHRoZXNlIG92ZXJyaWRlIFVJLWRyaXZlbiBlZGl0cyBvZiB0aG9zZSBleGFjdCBwcm9wc1xuICogYnV0IG5vdCBmb3IgcHJvcHMgbmVzdGVkIGluc2lkZSBjaGlsZHJlblxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJ1bmVQZXJzaXN0ZW5jZShsYXlvdXQsIG5ld1Byb3BzLCBkaXNwYXRjaCkge1xuICAgIGNvbnN0IHtcbiAgICAgICAgY2FuUGVyc2lzdCxcbiAgICAgICAgaWQsXG4gICAgICAgIHByb3BzLFxuICAgICAgICBwZXJzaXN0ZW5jZSxcbiAgICAgICAgcGVyc2lzdGVkX3Byb3BzLFxuICAgICAgICBwZXJzaXN0ZW5jZV90eXBlLFxuICAgICAgICBlbGVtZW50XG4gICAgfSA9IGdldFByb3BzKGxheW91dCk7XG5cbiAgICBjb25zdCBnZXRGaW5hbCA9IChwcm9wTmFtZSwgcHJldlZhbCkgPT5cbiAgICAgICAgcHJvcE5hbWUgaW4gbmV3UHJvcHMgPyBuZXdQcm9wc1twcm9wTmFtZV0gOiBwcmV2VmFsO1xuICAgIGNvbnN0IGZpbmFsUGVyc2lzdGVuY2UgPSBnZXRGaW5hbCgncGVyc2lzdGVuY2UnLCBwZXJzaXN0ZW5jZSk7XG5cbiAgICBpZiAoIWNhblBlcnNpc3QgfHwgIShwZXJzaXN0ZW5jZSB8fCBmaW5hbFBlcnNpc3RlbmNlKSkge1xuICAgICAgICByZXR1cm4gbmV3UHJvcHM7XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxQZXJzaXN0ZW5jZVR5cGUgPSBnZXRGaW5hbCgncGVyc2lzdGVuY2VfdHlwZScsIHBlcnNpc3RlbmNlX3R5cGUpO1xuICAgIGNvbnN0IGZpbmFsUGVyc2lzdGVkUHJvcHMgPSBnZXRGaW5hbCgncGVyc2lzdGVkX3Byb3BzJywgcGVyc2lzdGVkX3Byb3BzKTtcbiAgICBjb25zdCBwZXJzaXN0ZW5jZUNoYW5nZWQgPVxuICAgICAgICBmaW5hbFBlcnNpc3RlbmNlICE9PSBwZXJzaXN0ZW5jZSB8fFxuICAgICAgICBmaW5hbFBlcnNpc3RlbmNlVHlwZSAhPT0gcGVyc2lzdGVuY2VfdHlwZSB8fFxuICAgICAgICBmaW5hbFBlcnNpc3RlZFByb3BzICE9PSBwZXJzaXN0ZWRfcHJvcHM7XG5cbiAgICBjb25zdCBub3RJbk5ld1Byb3BzID0gcGVyc2lzdGVkUHJvcCA9PlxuICAgICAgICAhKHBlcnNpc3RlZFByb3Auc3BsaXQoJy4nKVswXSBpbiBuZXdQcm9wcyk7XG5cbiAgICBjb25zdCB1cGRhdGUgPSB7fTtcblxuICAgIGxldCBkZXBlcnNpc3RlZFByb3BzID0gcHJvcHM7XG5cbiAgICBpZiAocGVyc2lzdGVuY2VDaGFuZ2VkICYmIHBlcnNpc3RlbmNlKSB7XG4gICAgICAgIC8vIGNsZWFyIHByZXZpb3VzbHktYXBwbGllZCBwZXJzaXN0ZW5jZVxuICAgICAgICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmUocGVyc2lzdGVuY2VfdHlwZSwgZGlzcGF0Y2gpO1xuICAgICAgICBmb3JFYWNoKFxuICAgICAgICAgICAgcGVyc2lzdGVkUHJvcCA9PlxuICAgICAgICAgICAgICAgIG1vZFByb3AoXG4gICAgICAgICAgICAgICAgICAgIGdldFZhbHNLZXkoaWQsIHBlcnNpc3RlZFByb3AsIHBlcnNpc3RlbmNlKSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlZFByb3AsXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgVU5ET1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmaWx0ZXIobm90SW5OZXdQcm9wcywgcGVyc2lzdGVkX3Byb3BzKVxuICAgICAgICApO1xuICAgICAgICBkZXBlcnNpc3RlZFByb3BzID0gbWVyZ2VSaWdodChwcm9wcywgdXBkYXRlKTtcbiAgICB9XG5cbiAgICBpZiAoZmluYWxQZXJzaXN0ZW5jZSAmJiBwZXJzaXN0ZW5jZUNoYW5nZWQpIHtcbiAgICAgICAgY29uc3QgZmluYWxTdG9yYWdlID0gZ2V0U3RvcmUoZmluYWxQZXJzaXN0ZW5jZVR5cGUsIGRpc3BhdGNoKTtcbiAgICAgICAgLy8gYXBwbHkgbmV3IHBlcnNpc3RlbmNlXG4gICAgICAgIGZvckVhY2goXG4gICAgICAgICAgICBwZXJzaXN0ZWRQcm9wID0+XG4gICAgICAgICAgICAgICAgbW9kUHJvcChcbiAgICAgICAgICAgICAgICAgICAgZ2V0VmFsc0tleShpZCwgcGVyc2lzdGVkUHJvcCwgZmluYWxQZXJzaXN0ZW5jZSksXG4gICAgICAgICAgICAgICAgICAgIGZpbmFsU3RvcmFnZSxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgZGVwZXJzaXN0ZWRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVkUHJvcCxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZpbHRlcihub3RJbk5ld1Byb3BzLCBmaW5hbFBlcnNpc3RlZFByb3BzKVxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcGVyc2lzdGVuY2VDaGFuZ2VkID8gbWVyZ2VSaWdodChuZXdQcm9wcywgdXBkYXRlKSA6IG5ld1Byb3BzO1xufVxuIiwiaW1wb3J0IHthc3NvYywgYXNzb2NQYXRoLCBtZXJnZVJpZ2h0fSBmcm9tICdyYW1kYSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZUFwaVJlZHVjZXIoc3RvcmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gQXBpUmVkdWNlcihzdGF0ZSA9IHt9LCBhY3Rpb24pIHtcbiAgICAgICAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gc3RvcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHtpZCwgc3RhdHVzLCBjb250ZW50fSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgICAgICAgICAgY29uc3QgbmV3UmVxdWVzdCA9IHtzdGF0dXMsIGNvbnRlbnR9O1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaWQpKSB7XG4gICAgICAgICAgICAgICAgbmV3U3RhdGUgPSBhc3NvY1BhdGgoaWQsIG5ld1JlcXVlc3QsIHN0YXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IGFzc29jKGlkLCBuZXdSZXF1ZXN0LCBzdGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1N0YXRlID0gbWVyZ2VSaWdodChzdGF0ZSwgbmV3UmVxdWVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgIH07XG59XG4iLCJpbXBvcnQge2dldEFjdGlvbn0gZnJvbSAnLi4vYWN0aW9ucy9jb25zdGFudHMnO1xuaW1wb3J0IHtnZXRBcHBTdGF0ZX0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5mdW5jdGlvbiBhcHBMaWZlY3ljbGUoc3RhdGUgPSBnZXRBcHBTdGF0ZSgnU1RBUlRFRCcpLCBhY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgZ2V0QWN0aW9uKCdTRVRfQVBQX0xJRkVDWUNMRScpOlxuICAgICAgICAgICAgcmV0dXJuIGdldEFwcFN0YXRlKGFjdGlvbi5wYXlsb2FkKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFwcExpZmVjeWNsZTtcbiIsImNvbnN0IGluaXRpYWxDaGFuZ2UgPSB7XG4gICAgaWQ6IG51bGwsXG4gICAgcHJvcHM6IHt9XG59O1xuXG5mdW5jdGlvbiBjaGFuZ2VkKHN0YXRlID0gaW5pdGlhbENoYW5nZSkge1xuICAgIC8vIFRoaXMgaXMgZW1wdHkganVzdCB0byBpbml0aWFsaXplIHRoZSBzdG9yZS4gQ2hhbmdlc1xuICAgIC8vIGFyZSBhY3R1YWxseSByZWNvcmRlZCBpbiByZWR1Y2VyLmpzIHNvIHRoYXQgd2UgY2FuXG4gICAgLy8gcmVzb2x2ZSBwYXRocyB0byBpZC5cbiAgICByZXR1cm4gc3RhdGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNoYW5nZWQ7XG4iLCJpbXBvcnQge2dldEFjdGlvbn0gZnJvbSAnLi4vYWN0aW9ucy9jb25zdGFudHMnO1xuaW1wb3J0IHttZXJnZURlZXBSaWdodH0gZnJvbSAncmFtZGEnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb25maWcoc3RhdGUgPSBudWxsLCBhY3Rpb24pIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGdldEFjdGlvbignU0VUX0NPTkZJRycpKSB7XG4gICAgICAgIC8vIFB1dCB0aGUgY29tcG9uZW50cyBjaGlsZHJlblByb3BzIGluIHdpbmRvd3MgZm9yIHNpZGUgdXNhZ2UuXG4gICAgICAgIHdpbmRvdy5fX2Rhc2hwcml2YXRlX2NoaWxkcmVuUHJvcHMgPSBtZXJnZURlZXBSaWdodChcbiAgICAgICAgICAgIHdpbmRvdy5fX2Rhc2hwcml2YXRlX2NoaWxkcmVuUHJvcHMgfHwge30sXG4gICAgICAgICAgICBhY3Rpb24ucGF5bG9hZC5jaGlsZHJlbl9wcm9wc1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gZ2V0QWN0aW9uKCdBRERfSFRUUF9IRUFERVJTJykpIHtcbiAgICAgICAgcmV0dXJuIG1lcmdlRGVlcFJpZ2h0KHN0YXRlLCB7XG4gICAgICAgICAgICBmZXRjaDoge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGFjdGlvbi5wYXlsb2FkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZ2V0QXBwU3RhdGUoc3RhdGUpIHtcbiAgICBjb25zdCBzdGF0ZUxpc3QgPSB7XG4gICAgICAgIFNUQVJURUQ6ICdTVEFSVEVEJyxcbiAgICAgICAgSFlEUkFURUQ6ICdIWURSQVRFRCcsXG4gICAgICAgIERFU1RST1lFRDogJ0RFU1RST1lFRCdcbiAgICB9O1xuICAgIGlmIChzdGF0ZUxpc3Rbc3RhdGVdKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZUxpc3Rbc3RhdGVdO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c3RhdGV9IGlzIG5vdCBhIHZhbGlkIGFwcCBzdGF0ZS5gKTtcbn1cbiIsImNvbnN0IGluaXRpYWxHcmFwaCA9IHt9O1xuXG5jb25zdCBncmFwaHMgPSAoc3RhdGUgPSBpbml0aWFsR3JhcGgsIGFjdGlvbikgPT4ge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ1NFVF9HUkFQSFMnKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZ3JhcGhzO1xuIiwiaW1wb3J0IHttZXJnZVJpZ2h0fSBmcm9tICdyYW1kYSc7XG5cbmNvbnN0IGluaXRpYWxFcnJvciA9IHtcbiAgICBmcm9udEVuZDogW10sXG4gICAgYmFja0VuZDogW10sXG4gICAgYmFja0VuZENvbm5lY3RlZDogdHJ1ZVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXJyb3Ioc3RhdGUgPSBpbml0aWFsRXJyb3IsIGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnT05fRVJST1InOiB7XG4gICAgICAgICAgICBjb25zdCB7ZnJvbnRFbmQsIGJhY2tFbmQsIGJhY2tFbmRDb25uZWN0ZWR9ID0gc3RhdGU7XG4gICAgICAgICAgICAvLyBsb2cgZXJyb3JzIHRvIHRoZSBjb25zb2xlIGZvciBzdGFjayB0cmFjaW5nIGFuZCBzbyB0aGV5J3JlXG4gICAgICAgICAgICAvLyBhdmFpbGFibGUgZXZlbiB3aXRoIGRlYnVnZ2luZyBvZmZcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlICovXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGFjdGlvbi5wYXlsb2FkLmVycm9yKTtcblxuICAgICAgICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkLnR5cGUgPT09ICdmcm9udEVuZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBmcm9udEVuZDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VSaWdodChhY3Rpb24ucGF5bG9hZCwge3RpbWVzdGFtcDogbmV3IERhdGUoKX0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZnJvbnRFbmRcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgYmFja0VuZCxcbiAgICAgICAgICAgICAgICAgICAgYmFja0VuZENvbm5lY3RlZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5wYXlsb2FkLnR5cGUgPT09ICdiYWNrRW5kJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGZyb250RW5kLFxuICAgICAgICAgICAgICAgICAgICBiYWNrRW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZVJpZ2h0KGFjdGlvbi5wYXlsb2FkLCB7dGltZXN0YW1wOiBuZXcgRGF0ZSgpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5iYWNrRW5kXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGJhY2tFbmRDb25uZWN0ZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NFVF9DT05ORUNUSU9OX1NUQVRVUyc6IHtcbiAgICAgICAgICAgIHJldHVybiBtZXJnZVJpZ2h0KHN0YXRlLCB7YmFja0VuZENvbm5lY3RlZDogYWN0aW9uLnBheWxvYWR9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImNvbnN0IGluaXRpYWxIaXN0b3J5ID0ge1xuICAgIHBhc3Q6IFtdLFxuICAgIHByZXNlbnQ6IHt9LFxuICAgIGZ1dHVyZTogW11cbn07XG5cbmZ1bmN0aW9uIGhpc3Rvcnkoc3RhdGUgPSBpbml0aWFsSGlzdG9yeSwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdVTkRPJzoge1xuICAgICAgICAgICAgY29uc3Qge3Bhc3QsIHByZXNlbnQsIGZ1dHVyZX0gPSBzdGF0ZTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzID0gcGFzdFtwYXN0Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgY29uc3QgbmV3UGFzdCA9IHBhc3Quc2xpY2UoMCwgcGFzdC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGFzdDogbmV3UGFzdCxcbiAgICAgICAgICAgICAgICBwcmVzZW50OiBwcmV2aW91cyxcbiAgICAgICAgICAgICAgICBmdXR1cmU6IFtwcmVzZW50LCAuLi5mdXR1cmVdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnUkVETyc6IHtcbiAgICAgICAgICAgIGNvbnN0IHtwYXN0LCBwcmVzZW50LCBmdXR1cmV9ID0gc3RhdGU7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gZnV0dXJlWzBdO1xuICAgICAgICAgICAgY29uc3QgbmV3RnV0dXJlID0gZnV0dXJlLnNsaWNlKDEpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwYXN0OiBbLi4ucGFzdCwgcHJlc2VudF0sXG4gICAgICAgICAgICAgICAgcHJlc2VudDogbmV4dCxcbiAgICAgICAgICAgICAgICBmdXR1cmU6IG5ld0Z1dHVyZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ1JFVkVSVCc6IHtcbiAgICAgICAgICAgIGNvbnN0IHtwYXN0LCBmdXR1cmV9ID0gc3RhdGU7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IHBhc3RbcGFzdC5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1Bhc3QgPSBwYXN0LnNsaWNlKDAsIHBhc3QubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHBhc3Q6IG5ld1Bhc3QsXG4gICAgICAgICAgICAgICAgcHJlc2VudDogcHJldmlvdXMsXG4gICAgICAgICAgICAgICAgZnV0dXJlOiBbLi4uZnV0dXJlXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgaGlzdG9yeTtcbiIsImNvbnN0IGN1c3RvbUhvb2tzID0gKFxuICAgIHN0YXRlID0ge1xuICAgICAgICBsYXlvdXRfcHJlOiBudWxsLFxuICAgICAgICBsYXlvdXRfcG9zdDogbnVsbCxcbiAgICAgICAgcmVxdWVzdF9wcmU6IG51bGwsXG4gICAgICAgIHJlcXVlc3RfcG9zdDogbnVsbCxcbiAgICAgICAgY2FsbGJhY2tfcmVzb2x2ZWQ6IG51bGwsXG4gICAgICAgIHJlcXVlc3RfcmVmcmVzaF9qd3Q6IG51bGwsXG4gICAgICAgIGJlYXI6IGZhbHNlXG4gICAgfSxcbiAgICBhY3Rpb25cbikgPT4ge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnU0VUX0hPT0tTJzpcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjdXN0b21Ib29rcztcbiIsImltcG9ydCB7XG4gICAgaW5jbHVkZXMsXG4gICAgbWVyZ2VSaWdodCxcbiAgICBhcHBlbmQsXG4gICAgdmlldyxcbiAgICBsZW5zUGF0aCxcbiAgICBhc3NvY1BhdGgsXG4gICAgZGlzc29jUGF0aFxufSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCB7Z2V0QWN0aW9ufSBmcm9tICcuLi9hY3Rpb25zL2NvbnN0YW50cyc7XG5cbmNvbnN0IGxheW91dCA9IChzdGF0ZSA9IHtjb21wb25lbnRzOiBbXX0sIGFjdGlvbikgPT4ge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gZ2V0QWN0aW9uKCdTRVRfTEFZT1VUJykpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYWN0aW9uLnBheWxvYWQpKSB7XG4gICAgICAgICAgICBzdGF0ZS5jb21wb25lbnRzID0gWy4uLmFjdGlvbi5wYXlsb2FkXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLmNvbXBvbmVudHMgPSB7Li4uYWN0aW9uLnBheWxvYWR9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGluY2x1ZGVzKGFjdGlvbi50eXBlLCBbXG4gICAgICAgICAgICAnVU5ET19QUk9QX0NIQU5HRScsXG4gICAgICAgICAgICAnUkVET19QUk9QX0NIQU5HRScsXG4gICAgICAgICAgICBnZXRBY3Rpb24oJ09OX1BST1BfQ0hBTkdFJylcbiAgICAgICAgXSlcbiAgICApIHtcbiAgICAgICAgY29uc3QgcHJvcFBhdGggPSBhcHBlbmQoJ3Byb3BzJywgYWN0aW9uLnBheWxvYWQuaXRlbXBhdGgpO1xuICAgICAgICBjb25zdCBleGlzdGluZ1Byb3BzID0gdmlldyhsZW5zUGF0aChwcm9wUGF0aCksIHN0YXRlKTtcbiAgICAgICAgY29uc3QgbWVyZ2VkUHJvcHMgPSBtZXJnZVJpZ2h0KGV4aXN0aW5nUHJvcHMsIGFjdGlvbi5wYXlsb2FkLnByb3BzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwcm9wUGF0aCwgbWVyZ2VkUHJvcHMsIHN0YXRlKTtcbiAgICB9XG4gICAgLy8gQ3VzdG9tIGNvbXBvbmVudCByZW5kZXJlZCBvdXQgb2YgdHJlZS5cbiAgICBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gZ2V0QWN0aW9uKCdJTlNFUlRfQ09NUE9ORU5UJykpIHtcbiAgICAgICAgY29uc3Qge2NvbXBvbmVudCwgY29tcG9uZW50UGF0aH0gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChjb21wb25lbnRQYXRoLCBjb21wb25lbnQsIHN0YXRlKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSBnZXRBY3Rpb24oJ1JFTU9WRV9DT01QT05FTlQnKSkge1xuICAgICAgICBjb25zdCB7Y29tcG9uZW50UGF0aH0gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgcmV0dXJuIGRpc3NvY1BhdGgoY29tcG9uZW50UGF0aCwgc3RhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxheW91dDtcbiIsImltcG9ydCB7Z2V0QWN0aW9ufSBmcm9tICcuLi9hY3Rpb25zL2NvbnN0YW50cyc7XG5cbmNvbnN0IGluaXRpYWxQYXRocyA9IHtzdHJzOiB7fSwgb2Jqczoge319O1xuXG5jb25zdCBwYXRocyA9IChzdGF0ZSA9IGluaXRpYWxQYXRocywgYWN0aW9uKSA9PiB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBnZXRBY3Rpb24oJ1NFVF9QQVRIUycpKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcGF0aHM7XG4iLCJpbXBvcnQge2Nsb25lfSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCB7U1RBVFVTTUFQfSBmcm9tICcuLi9jb25zdGFudHMvY29uc3RhbnRzJztcblxuY29uc3QgZGVmYXVsdFByb2ZpbGUgPSB7XG4gICAgY291bnQ6IDAsXG4gICAgdG90YWw6IDAsXG4gICAgY29tcHV0ZTogMCxcbiAgICBuZXR3b3JrOiB7XG4gICAgICAgIHRpbWU6IDAsXG4gICAgICAgIHVwbG9hZDogMCxcbiAgICAgICAgZG93bmxvYWQ6IDBcbiAgICB9LFxuICAgIHJlc291cmNlczoge30sXG4gICAgc3RhdHVzOiB7XG4gICAgICAgIGxhdGVzdDogbnVsbFxuICAgIH0sXG4gICAgcmVzdWx0OiB7fVxufTtcblxuY29uc3QgZGVmYXVsdFN0YXRlID0ge1xuICAgIHVwZGF0ZWQ6IFtdLFxuICAgIHJlc291cmNlczoge30sXG4gICAgY2FsbGJhY2tzOiB7fSxcbiAgICBncmFwaExheW91dDogbnVsbFxufTtcblxuY29uc3QgcHJvZmlsZSA9IChzdGF0ZSA9IGRlZmF1bHRTdGF0ZSwgYWN0aW9uKSA9PiB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSAnVVBEQVRFX1JFU09VUkNFX1VTQUdFJykge1xuICAgICAgICAvLyBLZWVwIGEgcmVjb3JkIG9mIHRoZSBtb3N0IHJlY2VudCBjaGFuZ2UuIFRoaXNcbiAgICAgICAgLy8gaXMgc3VidGx5IGRpZmZlcmVudCBmcm9tIGhpc3RvcnkucHJlc2VudCBiZWNhdXNlXG4gICAgICAgIC8vIGl0IHdhdGNoZXMgYWxsIHByb3BzLCBub3QganVzdCBpbnB1dHMuXG4gICAgICAgIGNvbnN0IHtpZCwgdXNhZ2UsIHN0YXR1c30gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgY29uc3Qgc3RhdHVzTWFwcGVkID0gU1RBVFVTTUFQW3N0YXR1c10gfHwgc3RhdHVzO1xuXG4gICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGNhbGxiYWNrIHRoYXQgYWN0dWFsbHkgY2hhbmdlZC5cbiAgICAgICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICB1cGRhdGVkOiBbaWRdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBzdGF0ZS5yZXNvdXJjZXMsXG4gICAgICAgICAgICBjYWxsYmFja3M6IHN0YXRlLmNhbGxiYWNrcyxcbiAgICAgICAgICAgIC8vIGdyYXBoTGF5b3V0IGlzIG5ldmVyIHBhc3NlZCBpbiB2aWEgYWN0aW9ucywgYmVjYXVzZSB3ZSBkb24ndFxuICAgICAgICAgICAgLy8gd2FudCBpdCB0byB0cmlnZ2VyIGEgcmVyZW5kZXIgb2YgdGhlIGNhbGxiYWNrIGdyYXBoLlxuICAgICAgICAgICAgLy8gU2VlIENhbGxiYWNrR3JhcGhDb250YWluZXIucmVhY3RcbiAgICAgICAgICAgIGdyYXBoTGF5b3V0OiBzdGF0ZS5ncmFwaExheW91dFxuICAgICAgICB9O1xuXG4gICAgICAgIG5ld1N0YXRlLmNhbGxiYWNrc1tpZF0gPVxuICAgICAgICAgICAgbmV3U3RhdGUuY2FsbGJhY2tzW2lkXSB8fCBjbG9uZShkZWZhdWx0UHJvZmlsZSk7XG5cbiAgICAgICAgY29uc3QgY2IgPSBuZXdTdGF0ZS5jYWxsYmFja3NbaWRdO1xuICAgICAgICBjb25zdCBjYlJlc291cmNlcyA9IGNiLnJlc291cmNlcztcbiAgICAgICAgY29uc3QgdG90YWxSZXNvdXJjZXMgPSBuZXdTdGF0ZS5yZXNvdXJjZXM7XG5cbiAgICAgICAgLy8gVXBkYXRlIHJlc291cmNlIHVzYWdlICYgcGFyYW1zLlxuICAgICAgICBjYi5jb3VudCArPSAxO1xuICAgICAgICBjYi5zdGF0dXMubGF0ZXN0ID0gc3RhdHVzTWFwcGVkO1xuICAgICAgICBjYi5zdGF0dXNbc3RhdHVzTWFwcGVkXSA9IChjYi5zdGF0dXNbc3RhdHVzTWFwcGVkXSB8fCAwKSArIDE7XG4gICAgICAgIGNiLnJlc3VsdCA9IGFjdGlvbi5wYXlsb2FkLnJlc3VsdDtcbiAgICAgICAgY2IuaW5wdXRzID0gYWN0aW9uLnBheWxvYWQuaW5wdXRzO1xuICAgICAgICBjYi5zdGF0ZSA9IGFjdGlvbi5wYXlsb2FkLnN0YXRlO1xuXG4gICAgICAgIGlmICh1c2FnZSkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIF9fZGFzaF9jbGllbnQsXG4gICAgICAgICAgICAgICAgX19kYXNoX3NlcnZlcixcbiAgICAgICAgICAgICAgICBfX2Rhc2hfdXBsb2FkLFxuICAgICAgICAgICAgICAgIF9fZGFzaF9kb3dubG9hZCxcbiAgICAgICAgICAgICAgICAuLi51c2VyXG4gICAgICAgICAgICB9ID0gdXNhZ2U7XG5cbiAgICAgICAgICAgIGNiLnRvdGFsICs9IF9fZGFzaF9jbGllbnQ7XG4gICAgICAgICAgICBjYi5jb21wdXRlICs9IF9fZGFzaF9zZXJ2ZXI7XG4gICAgICAgICAgICBjYi5uZXR3b3JrLnRpbWUgKz0gX19kYXNoX2NsaWVudCAtIF9fZGFzaF9zZXJ2ZXI7XG4gICAgICAgICAgICBjYi5uZXR3b3JrLnVwbG9hZCArPSBfX2Rhc2hfdXBsb2FkO1xuICAgICAgICAgICAgY2IubmV0d29yay5kb3dubG9hZCArPSBfX2Rhc2hfZG93bmxvYWQ7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgciBpbiB1c2VyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXIuaGFzT3duUHJvcGVydHkocikpIHtcbiAgICAgICAgICAgICAgICAgICAgY2JSZXNvdXJjZXNbcl0gPSAoY2JSZXNvdXJjZXNbcl0gfHwgMCkgKyB1c2VyW3JdO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbFJlc291cmNlc1tyXSA9ICh0b3RhbFJlc291cmNlc1tyXSB8fCAwKSArIHVzZXJbcl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHByb2ZpbGU7XG4iLCJpbXBvcnQge2ZvckVhY2gsIGluY2x1ZGVzLCBpc0VtcHR5LCBrZXlzLCBwYXRoLCBhc3NvYywgcGF0aE9yfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQge2NvbWJpbmVSZWR1Y2Vyc30gZnJvbSAncmVkdXgnO1xuXG5pbXBvcnQge2dldENhbGxiYWNrc0J5SW5wdXR9IGZyb20gJy4uL2FjdGlvbnMvZGVwZW5kZW5jaWVzX3RzJztcblxuaW1wb3J0IGNyZWF0ZUFwaVJlZHVjZXIgZnJvbSAnLi9hcGknO1xuaW1wb3J0IGFwcExpZmVjeWNsZSBmcm9tICcuL2FwcExpZmVjeWNsZSc7XG5pbXBvcnQgY2FsbGJhY2tzIGZyb20gJy4vY2FsbGJhY2tzJztcbmltcG9ydCBjb25maWcgZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IGdyYXBocyBmcm9tICcuL2RlcGVuZGVuY3lHcmFwaCc7XG5pbXBvcnQgZXJyb3IgZnJvbSAnLi9lcnJvcic7XG5pbXBvcnQgaGlzdG9yeSBmcm9tICcuL2hpc3RvcnknO1xuaW1wb3J0IGhvb2tzIGZyb20gJy4vaG9va3MnO1xuaW1wb3J0IHByb2ZpbGUgZnJvbSAnLi9wcm9maWxlJztcbmltcG9ydCBjaGFuZ2VkIGZyb20gJy4vY2hhbmdlZCc7XG5pbXBvcnQgaXNMb2FkaW5nIGZyb20gJy4vaXNMb2FkaW5nJztcbmltcG9ydCBsYXlvdXQgZnJvbSAnLi9sYXlvdXQnO1xuaW1wb3J0IHBhdGhzIGZyb20gJy4vcGF0aHMnO1xuaW1wb3J0IGNhbGxiYWNrSm9icyBmcm9tICcuL2NhbGxiYWNrSm9icyc7XG5pbXBvcnQgbG9hZGluZyBmcm9tICcuL2xvYWRpbmcnO1xuaW1wb3J0IHtzdHJpbmdpZnlQYXRofSBmcm9tICcuLi93cmFwcGVyL3dyYXBwaW5nJztcblxuZXhwb3J0IGNvbnN0IGFwaVJlcXVlc3RzID0gW1xuICAgICdkZXBlbmRlbmNpZXNSZXF1ZXN0JyxcbiAgICAnbGF5b3V0UmVxdWVzdCcsXG4gICAgJ3JlbG9hZFJlcXVlc3QnLFxuICAgICdsb2dpblJlcXVlc3QnXG5dO1xuXG5jb25zdCBsYXlvdXRIYXNoZXMgPSAoc3RhdGUgPSB7fSwgYWN0aW9uKSA9PiB7XG4gICAgaWYgKFxuICAgICAgICBpbmNsdWRlcyhhY3Rpb24udHlwZSwgW1xuICAgICAgICAgICAgJ1VORE9fUFJPUF9DSEFOR0UnLFxuICAgICAgICAgICAgJ1JFRE9fUFJPUF9DSEFOR0UnLFxuICAgICAgICAgICAgJ09OX1BST1BfQ0hBTkdFJ1xuICAgICAgICBdKVxuICAgICkge1xuICAgICAgICAvLyBMZXQgdXMgY29tcGFyZSB0aGUgcGF0aHMgc3VtcyB0byBnZXQgdXBkYXRlcyB3aXRob3V0IHRyaWdnZXJpbmdcbiAgICAgICAgLy8gcmVuZGVyIG9uIHRoZSBwYXJlbnQgY29udGFpbmVycy5cbiAgICAgICAgY29uc3QgYWN0aW9uUGF0aCA9IGFjdGlvbi5wYXlsb2FkLml0ZW1wYXRoO1xuICAgICAgICBjb25zdCBzdHJQYXRoID0gc3RyaW5naWZ5UGF0aChhY3Rpb25QYXRoKTtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGhPcigwLCBbc3RyUGF0aCwgJ2hhc2gnXSwgc3RhdGUpO1xuICAgICAgICBzdGF0ZSA9IGFzc29jKFxuICAgICAgICAgICAgc3RyUGF0aCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBoYXNoOiBwcmV2ICsgMSxcbiAgICAgICAgICAgICAgICBjaGFuZ2VkUHJvcHM6IGFjdGlvbi5wYXlsb2FkLnByb3BzLFxuICAgICAgICAgICAgICAgIHJlbmRlclR5cGU6IGFjdGlvbi5wYXlsb2FkLnJlbmRlclR5cGVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICApO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdSRVNFVF9DT01QT05FTlRfU1RBVEUnKSB7XG4gICAgICAgIGNvbnN0IHtpdGVtcGF0aH0gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgaWYgKGl0ZW1wYXRoKSB7XG4gICAgICAgICAgICBjb25zdCBwcmVmaXhTdHIgPSBzdHJpbmdpZnlQYXRoKGl0ZW1wYXRoKTtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgaGFzaGVzIGZvciBrZXlzIHN0YXJ0aW5nIHdpdGggcHJlZml4U3RyXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHN0YXRlKS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChba2V5XSkgPT4gIWtleS5zdGFydHNXaXRoKHByZWZpeFN0cilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbn07XG5cbmZ1bmN0aW9uIG1haW5SZWR1Y2VyKCkge1xuICAgIGNvbnN0IHBhcnRzID0ge1xuICAgICAgICBhcHBMaWZlY3ljbGUsXG4gICAgICAgIGNhbGxiYWNrcyxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBlcnJvcixcbiAgICAgICAgZ3JhcGhzLFxuICAgICAgICBoaXN0b3J5LFxuICAgICAgICBob29rcyxcbiAgICAgICAgcHJvZmlsZSxcbiAgICAgICAgY2hhbmdlZCxcbiAgICAgICAgaXNMb2FkaW5nLFxuICAgICAgICBsYXlvdXQsXG4gICAgICAgIHBhdGhzLFxuICAgICAgICBsYXlvdXRIYXNoZXMsXG4gICAgICAgIGxvYWRpbmdcbiAgICB9O1xuICAgIGZvckVhY2gociA9PiB7XG4gICAgICAgIHBhcnRzW3JdID0gY3JlYXRlQXBpUmVkdWNlcihyKTtcbiAgICB9LCBhcGlSZXF1ZXN0cyk7XG5cbiAgICBwYXJ0cy5jYWxsYmFja0pvYnMgPSBjYWxsYmFja0pvYnM7XG5cbiAgICByZXR1cm4gY29tYmluZVJlZHVjZXJzKHBhcnRzKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5wdXRIaXN0b3J5U3RhdGUocGF5bG9hZCwgc3RhdGUsIHJlY29yZENoYW5nZXMpIHtcbiAgICBjb25zdCB7Z3JhcGhzLCBwYXRocywgbGF5b3V0fSA9IHN0YXRlO1xuICAgIGNvbnN0IHtpdGVtcGF0aCwgcHJvcHN9ID0gcGF5bG9hZDtcbiAgICBjb25zdCByZWZQcm9wcyA9IHBhdGgoaXRlbXBhdGguY29uY2F0KFsncHJvcHMnXSksIGxheW91dCkgfHwge307XG4gICAgY29uc3Qge2lkfSA9IHJlZlByb3BzO1xuXG4gICAgbGV0IGhpc3RvcnlFbnRyeTtcbiAgICBpZiAoaWQpIHtcbiAgICAgICAgaWYgKHJlY29yZENoYW5nZXMpIHtcbiAgICAgICAgICAgIHN0YXRlLmNoYW5nZWQgPSB7aWQsIHByb3BzfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGhpc3RvcnlFbnRyeSA9IHtpZCwgcHJvcHM6IHt9fTtcbiAgICAgICAga2V5cyhwcm9wcykuZm9yRWFjaChwcm9wS2V5ID0+IHtcbiAgICAgICAgICAgIGlmIChnZXRDYWxsYmFja3NCeUlucHV0KGdyYXBocywgcGF0aHMsIGlkLCBwcm9wS2V5KS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBoaXN0b3J5RW50cnkucHJvcHNbcHJvcEtleV0gPSByZWZQcm9wc1twcm9wS2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBoaXN0b3J5RW50cnk7XG59XG5cbmZ1bmN0aW9uIHJlY29yZEhpc3RvcnkocmVkdWNlcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikge1xuICAgICAgICAvLyBSZWNvcmQgaW5pdGlhbCBzdGF0ZVxuICAgICAgICBjb25zdCB7dHlwZSwgcGF5bG9hZH0gPSBhY3Rpb247XG4gICAgICAgIGlmICh0eXBlID09PSAnT05fUFJPUF9DSEFOR0UnKSB7XG4gICAgICAgICAgICAvLyBoaXN0b3J5IHJlY29yZHMgYWxsIHByb3AgY2hhbmdlcyB0aGF0IGFyZSBpbnB1dHMuXG4gICAgICAgICAgICBjb25zdCBoaXN0b3J5RW50cnkgPSBnZXRJbnB1dEhpc3RvcnlTdGF0ZShwYXlsb2FkLCBzdGF0ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoaGlzdG9yeUVudHJ5ICYmICFpc0VtcHR5KGhpc3RvcnlFbnRyeS5wcm9wcykpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5oaXN0b3J5LnByZXNlbnQgPSBoaXN0b3J5RW50cnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXh0U3RhdGUgPSByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pO1xuXG4gICAgICAgIGlmICh0eXBlID09PSAnT05fUFJPUF9DSEFOR0UnICYmIHBheWxvYWQuc291cmNlICE9PSAncmVzcG9uc2UnKSB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogaWYgdGhlIHByb3AgY2hhbmdlIGlzIGFuIGlucHV0LCB0aGVuXG4gICAgICAgICAgICAgKiByZWNvcmQgaXQgc28gdGhhdCBpdCBjYW4gYmUgcGxheWVkIGJhY2tcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgaGlzdG9yeUVudHJ5ID0gZ2V0SW5wdXRIaXN0b3J5U3RhdGUocGF5bG9hZCwgbmV4dFN0YXRlKTtcbiAgICAgICAgICAgIGlmIChoaXN0b3J5RW50cnkgJiYgIWlzRW1wdHkoaGlzdG9yeUVudHJ5LnByb3BzKSkge1xuICAgICAgICAgICAgICAgIG5leHRTdGF0ZS5oaXN0b3J5ID0ge1xuICAgICAgICAgICAgICAgICAgICBwYXN0OiBbLi4ubmV4dFN0YXRlLmhpc3RvcnkucGFzdCwgc3RhdGUuaGlzdG9yeS5wcmVzZW50XSxcbiAgICAgICAgICAgICAgICAgICAgcHJlc2VudDogaGlzdG9yeUVudHJ5LFxuICAgICAgICAgICAgICAgICAgICBmdXR1cmU6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0U3RhdGU7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gcmVsb2FkZXJSZWR1Y2VyKHJlZHVjZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHtcbiAgICAgICAgY29uc3Qge2hpc3RvcnksIGNvbmZpZywgaG9va3N9ID0gc3RhdGUgfHwge307XG4gICAgICAgIGxldCBuZXdTdGF0ZSA9IHN0YXRlO1xuICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdSRUxPQUQnKSB7XG4gICAgICAgICAgICBuZXdTdGF0ZSA9IHtoaXN0b3J5LCBjb25maWcsIGhvb2tzfTtcbiAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gJ1NFVF9DT05GSUcnKSB7XG4gICAgICAgICAgICAvLyBuZXcgY29uZmlnIGFsc28gcmVsb2FkcywgYW5kIGV2ZW4gY2xlYXJzIGhpc3RvcnksXG4gICAgICAgICAgICAvLyBpbiBjYXNlIHRoZXJlJ3MgYSBuZXcgdXNlciBvciBldmVuIGEgdG90YWxseSBkaWZmZXJlbnQgYXBwIVxuICAgICAgICAgICAgLy8gaG9va3MgYXJlIHNldCBhdCBhbiBldmVuIGhpZ2hlciBsZXZlbCB0aGFuIGNvbmZpZyB0aG91Z2guXG4gICAgICAgICAgICBuZXdTdGF0ZSA9IHtob29rc307XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZHVjZXIobmV3U3RhdGUsIGFjdGlvbik7XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZHVjZXIoKSB7XG4gICAgcmV0dXJuIHJlbG9hZGVyUmVkdWNlcihyZWNvcmRIaXN0b3J5KG1haW5SZWR1Y2VyKCkpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IHtcbiAgICByZXNvbHZlOiBjb21wb25lbnQgPT4ge1xuICAgICAgICBjb25zdCB7dHlwZSwgbmFtZXNwYWNlfSA9IGNvbXBvbmVudDtcblxuICAgICAgICBjb25zdCBucyA9IHdpbmRvd1tuYW1lc3BhY2VdO1xuXG4gICAgICAgIGlmIChucykge1xuICAgICAgICAgICAgaWYgKG5zW3R5cGVdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5zW3R5cGVdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbXBvbmVudCAke3R5cGV9IG5vdCBmb3VuZCBpbiAke25hbWVzcGFjZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lc3BhY2V9IHdhcyBub3QgZm91bmQuYCk7XG4gICAgfVxufTtcbiIsIi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIGNvb2tpZS1uYW1lIGluIFJGQyA2MjY1IHNlYyA0LjEuMVxuICogVGhpcyByZWZlcnMgb3V0IHRvIHRoZSBvYnNvbGV0ZWQgZGVmaW5pdGlvbiBvZiB0b2tlbiBpbiBSRkMgMjYxNiBzZWMgMi4yXG4gKiB3aGljaCBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgdG9rZW4gZGVmaW5pdGlvbiBpbiBSRkMgNzIzMCBhcHBlbmRpeCBCLlxuICpcbiAqIGNvb2tpZS1uYW1lICAgICAgID0gdG9rZW5cbiAqIHRva2VuICAgICAgICAgICAgID0gMSp0Y2hhclxuICogdGNoYXIgICAgICAgICAgICAgPSBcIiFcIiAvIFwiI1wiIC8gXCIkXCIgLyBcIiVcIiAvIFwiJlwiIC8gXCInXCIgL1xuICogICAgICAgICAgICAgICAgICAgICBcIipcIiAvIFwiK1wiIC8gXCItXCIgLyBcIi5cIiAvIFwiXlwiIC8gXCJfXCIgL1xuICogICAgICAgICAgICAgICAgICAgICBcImBcIiAvIFwifFwiIC8gXCJ+XCIgLyBESUdJVCAvIEFMUEhBXG4gKlxuICogTm90ZTogQWxsb3dpbmcgbW9yZSBjaGFyYWN0ZXJzIC0gaHR0cHM6Ly9naXRodWIuY29tL2pzaHR0cC9jb29raWUvaXNzdWVzLzE5MVxuICogQWxsb3cgc2FtZSByYW5nZSBhcyBjb29raWUgdmFsdWUsIGV4Y2VwdCBgPWAsIHdoaWNoIGRlbGltaXRzIGVuZCBvZiBuYW1lLlxuICovXG5jb25zdCBjb29raWVOYW1lUmVnRXhwID0gL15bXFx1MDAyMS1cXHUwMDNBXFx1MDAzQ1xcdTAwM0UtXFx1MDA3RV0rJC87XG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIGNvb2tpZS12YWx1ZSBpbiBSRkMgNjI2NSBzZWMgNC4xLjFcbiAqXG4gKiBjb29raWUtdmFsdWUgICAgICA9ICpjb29raWUtb2N0ZXQgLyAoIERRVU9URSAqY29va2llLW9jdGV0IERRVU9URSApXG4gKiBjb29raWUtb2N0ZXQgICAgICA9ICV4MjEgLyAleDIzLTJCIC8gJXgyRC0zQSAvICV4M0MtNUIgLyAleDVELTdFXG4gKiAgICAgICAgICAgICAgICAgICAgIDsgVVMtQVNDSUkgY2hhcmFjdGVycyBleGNsdWRpbmcgQ1RMcyxcbiAqICAgICAgICAgICAgICAgICAgICAgOyB3aGl0ZXNwYWNlIERRVU9URSwgY29tbWEsIHNlbWljb2xvbixcbiAqICAgICAgICAgICAgICAgICAgICAgOyBhbmQgYmFja3NsYXNoXG4gKlxuICogQWxsb3dpbmcgbW9yZSBjaGFyYWN0ZXJzOiBodHRwczovL2dpdGh1Yi5jb20vanNodHRwL2Nvb2tpZS9pc3N1ZXMvMTkxXG4gKiBDb21tYSwgYmFja3NsYXNoLCBhbmQgRFFVT1RFIGFyZSBub3QgcGFydCBvZiB0aGUgcGFyc2luZyBhbGdvcml0aG0uXG4gKi9cbmNvbnN0IGNvb2tpZVZhbHVlUmVnRXhwID0gL15bXFx1MDAyMS1cXHUwMDNBXFx1MDAzQy1cXHUwMDdFXSokLztcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggZG9tYWluLXZhbHVlIGluIFJGQyA2MjY1IHNlYyA0LjEuMVxuICpcbiAqIGRvbWFpbi12YWx1ZSAgICAgID0gPHN1YmRvbWFpbj5cbiAqICAgICAgICAgICAgICAgICAgICAgOyBkZWZpbmVkIGluIFtSRkMxMDM0XSwgU2VjdGlvbiAzLjUsIGFzXG4gKiAgICAgICAgICAgICAgICAgICAgIDsgZW5oYW5jZWQgYnkgW1JGQzExMjNdLCBTZWN0aW9uIDIuMVxuICogPHN1YmRvbWFpbj4gICAgICAgPSA8bGFiZWw+IHwgPHN1YmRvbWFpbj4gXCIuXCIgPGxhYmVsPlxuICogPGxhYmVsPiAgICAgICAgICAgPSA8bGV0LWRpZz4gWyBbIDxsZGgtc3RyPiBdIDxsZXQtZGlnPiBdXG4gKiAgICAgICAgICAgICAgICAgICAgIExhYmVscyBtdXN0IGJlIDYzIGNoYXJhY3RlcnMgb3IgbGVzcy5cbiAqICAgICAgICAgICAgICAgICAgICAgJ2xldC1kaWcnIG5vdCAnbGV0dGVyJyBpbiB0aGUgZmlyc3QgY2hhciwgcGVyIFJGQzExMjNcbiAqIDxsZGgtc3RyPiAgICAgICAgID0gPGxldC1kaWctaHlwPiB8IDxsZXQtZGlnLWh5cD4gPGxkaC1zdHI+XG4gKiA8bGV0LWRpZy1oeXA+ICAgICA9IDxsZXQtZGlnPiB8IFwiLVwiXG4gKiA8bGV0LWRpZz4gICAgICAgICA9IDxsZXR0ZXI+IHwgPGRpZ2l0PlxuICogPGxldHRlcj4gICAgICAgICAgPSBhbnkgb25lIG9mIHRoZSA1MiBhbHBoYWJldGljIGNoYXJhY3RlcnMgQSB0aHJvdWdoIFogaW5cbiAqICAgICAgICAgICAgICAgICAgICAgdXBwZXIgY2FzZSBhbmQgYSB0aHJvdWdoIHogaW4gbG93ZXIgY2FzZVxuICogPGRpZ2l0PiAgICAgICAgICAgPSBhbnkgb25lIG9mIHRoZSB0ZW4gZGlnaXRzIDAgdGhyb3VnaCA5XG4gKlxuICogS2VlcCBzdXBwb3J0IGZvciBsZWFkaW5nIGRvdDogaHR0cHM6Ly9naXRodWIuY29tL2pzaHR0cC9jb29raWUvaXNzdWVzLzE3M1xuICpcbiAqID4gKE5vdGUgdGhhdCBhIGxlYWRpbmcgJXgyRSAoXCIuXCIpLCBpZiBwcmVzZW50LCBpcyBpZ25vcmVkIGV2ZW4gdGhvdWdoIHRoYXRcbiAqIGNoYXJhY3RlciBpcyBub3QgcGVybWl0dGVkLCBidXQgYSB0cmFpbGluZyAleDJFIChcIi5cIiksIGlmIHByZXNlbnQsIHdpbGxcbiAqIGNhdXNlIHRoZSB1c2VyIGFnZW50IHRvIGlnbm9yZSB0aGUgYXR0cmlidXRlLilcbiAqL1xuY29uc3QgZG9tYWluVmFsdWVSZWdFeHAgPVxuICAvXihbLl0/W2EtejAtOV0oW2EtejAtOS1dezAsNjF9W2EtejAtOV0pPykoWy5dW2EtejAtOV0oW2EtejAtOS1dezAsNjF9W2EtejAtOV0pPykqJC9pO1xuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCBwYXRoLXZhbHVlIGluIFJGQyA2MjY1IHNlYyA0LjEuMVxuICpcbiAqIHBhdGgtdmFsdWUgICAgICAgID0gPGFueSBDSEFSIGV4Y2VwdCBDVExzIG9yIFwiO1wiPlxuICogQ0hBUiAgICAgICAgICAgICAgPSAleDAxLTdGXG4gKiAgICAgICAgICAgICAgICAgICAgIDsgZGVmaW5lZCBpbiBSRkMgNTIzNCBhcHBlbmRpeCBCLjFcbiAqL1xuY29uc3QgcGF0aFZhbHVlUmVnRXhwID0gL15bXFx1MDAyMC1cXHUwMDNBXFx1MDAzRC1cXHUwMDdFXSokLztcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggbWF4LWFnZS12YWx1ZSBpbiBSRkMgNjI2NSBzZWMgNS42LjJcbiAqL1xuY29uc3QgbWF4QWdlUmVnRXhwID0gL14tP1xcZCskLztcblxuY29uc3QgX190b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbmNvbnN0IE51bGxPYmplY3QgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IHtcbiAgY29uc3QgQyA9IGZ1bmN0aW9uICgpIHt9O1xuICBDLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHJldHVybiBDO1xufSkoKSBhcyB1bmtub3duIGFzIHsgbmV3ICgpOiBhbnkgfTtcblxuLyoqXG4gKiBQYXJzZSBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBkZWNvZGUgYSBbY29va2llLXZhbHVlXShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzYyNjUjc2VjdGlvbi00LjEuMSkuXG4gICAqIFNpbmNlIHRoZSB2YWx1ZSBvZiBhIGNvb2tpZSBoYXMgYSBsaW1pdGVkIGNoYXJhY3RlciBzZXQgKGFuZCBtdXN0IGJlIGEgc2ltcGxlIHN0cmluZyksIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZGVjb2RlXG4gICAqIGEgcHJldmlvdXNseS1lbmNvZGVkIGNvb2tpZSB2YWx1ZSBpbnRvIGEgSmF2YVNjcmlwdCBzdHJpbmcuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIGlzIHRoZSBnbG9iYWwgYGRlY29kZVVSSUNvbXBvbmVudGAsIHdyYXBwZWQgaW4gYSBgdHJ5Li5jYXRjaGAuIElmIGFuIGVycm9yXG4gICAqIGlzIHRocm93biBpdCB3aWxsIHJldHVybiB0aGUgY29va2llJ3Mgb3JpZ2luYWwgdmFsdWUuIElmIHlvdSBwcm92aWRlIHlvdXIgb3duIGVuY29kZS9kZWNvZGVcbiAgICogc2NoZW1lIHlvdSBtdXN0IGVuc3VyZSBlcnJvcnMgYXJlIGFwcHJvcHJpYXRlbHkgaGFuZGxlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZGVjb2RlXG4gICAqL1xuICBkZWNvZGU/OiAoc3RyOiBzdHJpbmcpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDb29raWVzIG9iamVjdC5cbiAqL1xuZXhwb3J0IHR5cGUgQ29va2llcyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD47XG5cbi8qKlxuICogUGFyc2UgYSBgQ29va2llYCBoZWFkZXIuXG4gKlxuICogUGFyc2UgdGhlIGdpdmVuIGNvb2tpZSBoZWFkZXIgc3RyaW5nIGludG8gYW4gb2JqZWN0XG4gKiBUaGUgb2JqZWN0IGhhcyB0aGUgdmFyaW91cyBjb29raWVzIGFzIGtleXMobmFtZXMpID0+IHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDb29raWUoc3RyOiBzdHJpbmcsIG9wdGlvbnM/OiBQYXJzZU9wdGlvbnMpOiBDb29raWVzIHtcbiAgY29uc3Qgb2JqOiBDb29raWVzID0gbmV3IE51bGxPYmplY3QoKTtcbiAgY29uc3QgbGVuID0gc3RyLmxlbmd0aDtcbiAgLy8gUkZDIDYyNjUgc2VjIDQuMS4xLCBSRkMgMjYxNiAyLjIgZGVmaW5lcyBhIGNvb2tpZSBuYW1lIGNvbnNpc3RzIG9mIG9uZSBjaGFyIG1pbmltdW0sIHBsdXMgJz0nLlxuICBpZiAobGVuIDwgMikgcmV0dXJuIG9iajtcblxuICBjb25zdCBkZWMgPSBvcHRpb25zPy5kZWNvZGUgfHwgZGVjb2RlO1xuICBsZXQgaW5kZXggPSAwO1xuXG4gIGRvIHtcbiAgICBjb25zdCBlcUlkeCA9IGVxSW5kZXgoc3RyLCBpbmRleCwgbGVuKTtcbiAgICBpZiAoZXFJZHggPT09IC0xKSBicmVhazsgLy8gTm8gbW9yZSBjb29raWUgcGFpcnMuXG5cbiAgICBjb25zdCBlbmRJZHggPSBlbmRJbmRleChzdHIsIGluZGV4LCBsZW4pO1xuXG4gICAgaWYgKGVxSWR4ID4gZW5kSWR4KSB7XG4gICAgICAvLyBiYWNrdHJhY2sgb24gcHJpb3Igc2VtaWNvbG9uXG4gICAgICBpbmRleCA9IHN0ci5sYXN0SW5kZXhPZihcIjtcIiwgZXFJZHggLSAxKSArIDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXkgPSB2YWx1ZVNsaWNlKHN0ciwgaW5kZXgsIGVxSWR4KTtcblxuICAgIC8vIG9ubHkgYXNzaWduIG9uY2VcbiAgICBpZiAob2JqW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgb2JqW2tleV0gPSBkZWModmFsdWVTbGljZShzdHIsIGVxSWR4ICsgMSwgZW5kSWR4KSk7XG4gICAgfVxuXG4gICAgaW5kZXggPSBlbmRJZHggKyAxO1xuICB9IHdoaWxlIChpbmRleCA8IGxlbik7XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdpZnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGVuY29kZSBhIFtjb29raWUtdmFsdWVdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTQuMS4xKS5cbiAgICogU2luY2UgdmFsdWUgb2YgYSBjb29raWUgaGFzIGEgbGltaXRlZCBjaGFyYWN0ZXIgc2V0IChhbmQgbXVzdCBiZSBhIHNpbXBsZSBzdHJpbmcpLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGVuY29kZVxuICAgKiBhIHZhbHVlIGludG8gYSBzdHJpbmcgc3VpdGVkIGZvciBhIGNvb2tpZSdzIHZhbHVlLCBhbmQgc2hvdWxkIG1pcnJvciBgZGVjb2RlYCB3aGVuIHBhcnNpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGVuY29kZVVSSUNvbXBvbmVudFxuICAgKi9cbiAgZW5jb2RlPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmc7XG59XG5cbi8qKlxuICogU3RyaW5naWZpZXMgYW4gb2JqZWN0IGludG8gYW4gSFRUUCBgQ29va2llYCBoZWFkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlDb29raWUoXG4gIGNvb2tpZTogQ29va2llcyxcbiAgb3B0aW9ucz86IFN0cmluZ2lmeU9wdGlvbnMsXG4pOiBzdHJpbmcge1xuICBjb25zdCBlbmMgPSBvcHRpb25zPy5lbmNvZGUgfHwgZW5jb2RlVVJJQ29tcG9uZW50O1xuICBjb25zdCBjb29raWVTdHJpbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhjb29raWUpKSB7XG4gICAgY29uc3QgdmFsID0gY29va2llW25hbWVdO1xuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBpZiAoIWNvb2tpZU5hbWVSZWdFeHAudGVzdChuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgY29va2llIG5hbWUgaXMgaW52YWxpZDogJHtuYW1lfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gZW5jKHZhbCk7XG5cbiAgICBpZiAoIWNvb2tpZVZhbHVlUmVnRXhwLnRlc3QodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBjb29raWUgdmFsIGlzIGludmFsaWQ6ICR7dmFsfWApO1xuICAgIH1cblxuICAgIGNvb2tpZVN0cmluZ3MucHVzaChgJHtuYW1lfT0ke3ZhbHVlfWApO1xuICB9XG5cbiAgcmV0dXJuIGNvb2tpZVN0cmluZ3Muam9pbihcIjsgXCIpO1xufVxuXG4vKipcbiAqIFNldC1Db29raWUgb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldENvb2tpZSB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGNvb2tpZS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgc3RyaW5nIHRvIGJlIHRoZSB2YWx1ZSBmb3IgdGhlIGNvb2tpZS5cbiAgICovXG4gIHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGBudW1iZXJgIChpbiBzZWNvbmRzKSB0byBiZSB0aGUgdmFsdWUgZm9yIHRoZSBbYE1heC1BZ2VgIGBTZXQtQ29va2llYCBhdHRyaWJ1dGVdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNS4yLjIpLlxuICAgKlxuICAgKiBUaGUgW2Nvb2tpZSBzdG9yYWdlIG1vZGVsIHNwZWNpZmljYXRpb25dKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNS4zKSBzdGF0ZXMgdGhhdCBpZiBib3RoIGBleHBpcmVzYCBhbmRcbiAgICogYG1heEFnZWAgYXJlIHNldCwgdGhlbiBgbWF4QWdlYCB0YWtlcyBwcmVjZWRlbmNlLCBidXQgaXQgaXMgcG9zc2libGUgbm90IGFsbCBjbGllbnRzIGJ5IG9iZXkgdGhpcyxcbiAgICogc28gaWYgYm90aCBhcmUgc2V0LCB0aGV5IHNob3VsZCBwb2ludCB0byB0aGUgc2FtZSBkYXRlIGFuZCB0aW1lLlxuICAgKi9cbiAgbWF4QWdlPzogbnVtYmVyO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBgRGF0ZWAgb2JqZWN0IHRvIGJlIHRoZSB2YWx1ZSBmb3IgdGhlIFtgRXhwaXJlc2AgYFNldC1Db29raWVgIGF0dHJpYnV0ZV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyNjUjc2VjdGlvbi01LjIuMSkuXG4gICAqIFdoZW4gbm8gZXhwaXJhdGlvbiBpcyBzZXQsIGNsaWVudHMgY29uc2lkZXIgdGhpcyBhIFwibm9uLXBlcnNpc3RlbnQgY29va2llXCIgYW5kIGRlbGV0ZSBpdCB3aGVuIHRoZSBjdXJyZW50IHNlc3Npb24gaXMgb3Zlci5cbiAgICpcbiAgICogVGhlIFtjb29raWUgc3RvcmFnZSBtb2RlbCBzcGVjaWZpY2F0aW9uXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTUuMykgc3RhdGVzIHRoYXQgaWYgYm90aCBgZXhwaXJlc2AgYW5kXG4gICAqIGBtYXhBZ2VgIGFyZSBzZXQsIHRoZW4gYG1heEFnZWAgdGFrZXMgcHJlY2VkZW5jZSwgYnV0IGl0IGlzIHBvc3NpYmxlIG5vdCBhbGwgY2xpZW50cyBieSBvYmV5IHRoaXMsXG4gICAqIHNvIGlmIGJvdGggYXJlIHNldCwgdGhleSBzaG91bGQgcG9pbnQgdG8gdGhlIHNhbWUgZGF0ZSBhbmQgdGltZS5cbiAgICovXG4gIGV4cGlyZXM/OiBEYXRlO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSB2YWx1ZSBmb3IgdGhlIFtgRG9tYWluYCBgU2V0LUNvb2tpZWAgYXR0cmlidXRlXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTUuMi4zKS5cbiAgICogV2hlbiBubyBkb21haW4gaXMgc2V0LCBjbGllbnRzIGNvbnNpZGVyIHRoZSBjb29raWUgdG8gYXBwbHkgdG8gdGhlIGN1cnJlbnQgZG9tYWluIG9ubHkuXG4gICAqL1xuICBkb21haW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHZhbHVlIGZvciB0aGUgW2BQYXRoYCBgU2V0LUNvb2tpZWAgYXR0cmlidXRlXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTUuMi40KS5cbiAgICogV2hlbiBubyBwYXRoIGlzIHNldCwgdGhlIHBhdGggaXMgY29uc2lkZXJlZCB0aGUgW1wiZGVmYXVsdCBwYXRoXCJdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNS4xLjQpLlxuICAgKi9cbiAgcGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIEVuYWJsZXMgdGhlIFtgSHR0cE9ubHlgIGBTZXQtQ29va2llYCBhdHRyaWJ1dGVdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNS4yLjYpLlxuICAgKiBXaGVuIGVuYWJsZWQsIGNsaWVudHMgd2lsbCBub3QgYWxsb3cgY2xpZW50LXNpZGUgSmF2YVNjcmlwdCB0byBzZWUgdGhlIGNvb2tpZSBpbiBgZG9jdW1lbnQuY29va2llYC5cbiAgICovXG4gIGh0dHBPbmx5PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEVuYWJsZXMgdGhlIFtgU2VjdXJlYCBgU2V0LUNvb2tpZWAgYXR0cmlidXRlXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTUuMi41KS5cbiAgICogV2hlbiBlbmFibGVkLCBjbGllbnRzIHdpbGwgb25seSBzZW5kIHRoZSBjb29raWUgYmFjayBpZiB0aGUgYnJvd3NlciBoYXMgYW4gSFRUUFMgY29ubmVjdGlvbi5cbiAgICovXG4gIHNlY3VyZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFbmFibGVzIHRoZSBbYFBhcnRpdGlvbmVkYCBgU2V0LUNvb2tpZWAgYXR0cmlidXRlXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtY3V0bGVyLWh0dHBiaXMtcGFydGl0aW9uZWQtY29va2llcy8pLlxuICAgKiBXaGVuIGVuYWJsZWQsIGNsaWVudHMgd2lsbCBvbmx5IHNlbmQgdGhlIGNvb2tpZSBiYWNrIHdoZW4gdGhlIGN1cnJlbnQgZG9tYWluIF9hbmRfIHRvcC1sZXZlbCBkb21haW4gbWF0Y2hlcy5cbiAgICpcbiAgICogVGhpcyBpcyBhbiBhdHRyaWJ1dGUgdGhhdCBoYXMgbm90IHlldCBiZWVuIGZ1bGx5IHN0YW5kYXJkaXplZCwgYW5kIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS5cbiAgICogVGhpcyBhbHNvIG1lYW5zIGNsaWVudHMgbWF5IGlnbm9yZSB0aGlzIGF0dHJpYnV0ZSB1bnRpbCB0aGV5IHVuZGVyc3RhbmQgaXQuIE1vcmUgaW5mb3JtYXRpb25cbiAgICogYWJvdXQgY2FuIGJlIGZvdW5kIGluIFt0aGUgcHJvcG9zYWxdKGh0dHBzOi8vZ2l0aHViLmNvbS9wcml2YWN5Y2cvQ0hJUFMpLlxuICAgKi9cbiAgcGFydGl0aW9uZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSB2YWx1ZSBmb3IgdGhlIFtgUHJpb3JpdHlgIGBTZXQtQ29va2llYCBhdHRyaWJ1dGVdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC13ZXN0LWNvb2tpZS1wcmlvcml0eS0wMCNzZWN0aW9uLTQuMSkuXG4gICAqXG4gICAqIC0gYCdsb3cnYCB3aWxsIHNldCB0aGUgYFByaW9yaXR5YCBhdHRyaWJ1dGUgdG8gYExvd2AuXG4gICAqIC0gYCdtZWRpdW0nYCB3aWxsIHNldCB0aGUgYFByaW9yaXR5YCBhdHRyaWJ1dGUgdG8gYE1lZGl1bWAsIHRoZSBkZWZhdWx0IHByaW9yaXR5IHdoZW4gbm90IHNldC5cbiAgICogLSBgJ2hpZ2gnYCB3aWxsIHNldCB0aGUgYFByaW9yaXR5YCBhdHRyaWJ1dGUgdG8gYEhpZ2hgLlxuICAgKlxuICAgKiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHByaW9yaXR5IGxldmVscyBjYW4gYmUgZm91bmQgaW4gW3RoZSBzcGVjaWZpY2F0aW9uXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtd2VzdC1jb29raWUtcHJpb3JpdHktMDAjc2VjdGlvbi00LjEpLlxuICAgKi9cbiAgcHJpb3JpdHk/OiBcImxvd1wiIHwgXCJtZWRpdW1cIiB8IFwiaGlnaFwiO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSB2YWx1ZSBmb3IgdGhlIFtgU2FtZVNpdGVgIGBTZXQtQ29va2llYCBhdHRyaWJ1dGVdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcy0wOSNzZWN0aW9uLTUuNC43KS5cbiAgICpcbiAgICogLSBgdHJ1ZWAgd2lsbCBzZXQgdGhlIGBTYW1lU2l0ZWAgYXR0cmlidXRlIHRvIGBTdHJpY3RgIGZvciBzdHJpY3Qgc2FtZSBzaXRlIGVuZm9yY2VtZW50LlxuICAgKiAtIGAnbGF4J2Agd2lsbCBzZXQgdGhlIGBTYW1lU2l0ZWAgYXR0cmlidXRlIHRvIGBMYXhgIGZvciBsYXggc2FtZSBzaXRlIGVuZm9yY2VtZW50LlxuICAgKiAtIGAnbm9uZSdgIHdpbGwgc2V0IHRoZSBgU2FtZVNpdGVgIGF0dHJpYnV0ZSB0byBgTm9uZWAgZm9yIGFuIGV4cGxpY2l0IGNyb3NzLXNpdGUgY29va2llLlxuICAgKiAtIGAnc3RyaWN0J2Agd2lsbCBzZXQgdGhlIGBTYW1lU2l0ZWAgYXR0cmlidXRlIHRvIGBTdHJpY3RgIGZvciBzdHJpY3Qgc2FtZSBzaXRlIGVuZm9yY2VtZW50LlxuICAgKlxuICAgKiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IGVuZm9yY2VtZW50IGxldmVscyBjYW4gYmUgZm91bmQgaW4gW3RoZSBzcGVjaWZpY2F0aW9uXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMtMDkjc2VjdGlvbi01LjQuNykuXG4gICAqL1xuICBzYW1lU2l0ZT86IGJvb2xlYW4gfCBcImxheFwiIHwgXCJzdHJpY3RcIiB8IFwibm9uZVwiO1xufVxuXG4vKipcbiAqIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgc2VyaWFsaXplIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZU9wdGlvbnMgPSBTdHJpbmdpZnlPcHRpb25zICZcbiAgT21pdDxTZXRDb29raWUsIFwibmFtZVwiIHwgXCJ2YWx1ZVwiPjtcblxuLyoqXG4gKiBTZXJpYWxpemUgZGF0YSBpbnRvIGEgY29va2llIGhlYWRlci5cbiAqXG4gKiBTZXJpYWxpemUgYSBuYW1lIHZhbHVlIHBhaXIgaW50byBhIGNvb2tpZSBzdHJpbmcgc3VpdGFibGUgZm9yXG4gKiBodHRwIGhlYWRlcnMuIEFuIG9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHNwZWNpZmllcyBjb29raWUgcGFyYW1ldGVycy5cbiAqXG4gKiBzZXJpYWxpemUoJ2ZvbycsICdiYXInLCB7IGh0dHBPbmx5OiB0cnVlIH0pXG4gKiAgID0+IFwiZm9vPWJhcjsgaHR0cE9ubHlcIlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5U2V0Q29va2llKFxuICBjb29raWU6IFNldENvb2tpZSxcbiAgb3B0aW9ucz86IFN0cmluZ2lmeU9wdGlvbnMsXG4pOiBzdHJpbmc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5U2V0Q29va2llKFxuICBuYW1lOiBzdHJpbmcsXG4gIHZhbDogc3RyaW5nLFxuICBvcHRpb25zPzogU2VyaWFsaXplT3B0aW9ucyxcbik6IHN0cmluZztcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlTZXRDb29raWUoXG4gIF9uYW1lOiBzdHJpbmcgfCBTZXRDb29raWUsXG4gIF92YWw/OiBzdHJpbmcgfCBTdHJpbmdpZnlPcHRpb25zLFxuICBfb3B0cz86IFNlcmlhbGl6ZU9wdGlvbnMsXG4pOiBzdHJpbmcge1xuICBjb25zdCBjb29raWUgPVxuICAgIHR5cGVvZiBfbmFtZSA9PT0gXCJvYmplY3RcIlxuICAgICAgPyBfbmFtZVxuICAgICAgOiB7IC4uLl9vcHRzLCBuYW1lOiBfbmFtZSwgdmFsdWU6IFN0cmluZyhfdmFsKSB9O1xuICBjb25zdCBvcHRpb25zID0gdHlwZW9mIF92YWwgPT09IFwib2JqZWN0XCIgPyBfdmFsIDogX29wdHM7XG4gIGNvbnN0IGVuYyA9IG9wdGlvbnM/LmVuY29kZSB8fCBlbmNvZGVVUklDb21wb25lbnQ7XG5cbiAgaWYgKCFjb29raWVOYW1lUmVnRXhwLnRlc3QoY29va2llLm5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgYXJndW1lbnQgbmFtZSBpcyBpbnZhbGlkOiAke2Nvb2tpZS5uYW1lfWApO1xuICB9XG5cbiAgY29uc3QgdmFsdWUgPSBjb29raWUudmFsdWUgPyBlbmMoY29va2llLnZhbHVlKSA6IFwiXCI7XG5cbiAgaWYgKCFjb29raWVWYWx1ZVJlZ0V4cC50ZXN0KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGFyZ3VtZW50IHZhbCBpcyBpbnZhbGlkOiAke2Nvb2tpZS52YWx1ZX1gKTtcbiAgfVxuXG4gIGxldCBzdHIgPSBjb29raWUubmFtZSArIFwiPVwiICsgdmFsdWU7XG5cbiAgaWYgKGNvb2tpZS5tYXhBZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihjb29raWUubWF4QWdlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgb3B0aW9uIG1heEFnZSBpcyBpbnZhbGlkOiAke2Nvb2tpZS5tYXhBZ2V9YCk7XG4gICAgfVxuXG4gICAgc3RyICs9IFwiOyBNYXgtQWdlPVwiICsgY29va2llLm1heEFnZTtcbiAgfVxuXG4gIGlmIChjb29raWUuZG9tYWluKSB7XG4gICAgaWYgKCFkb21haW5WYWx1ZVJlZ0V4cC50ZXN0KGNvb2tpZS5kb21haW4pKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBvcHRpb24gZG9tYWluIGlzIGludmFsaWQ6ICR7Y29va2llLmRvbWFpbn1gKTtcbiAgICB9XG5cbiAgICBzdHIgKz0gXCI7IERvbWFpbj1cIiArIGNvb2tpZS5kb21haW47XG4gIH1cblxuICBpZiAoY29va2llLnBhdGgpIHtcbiAgICBpZiAoIXBhdGhWYWx1ZVJlZ0V4cC50ZXN0KGNvb2tpZS5wYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgb3B0aW9uIHBhdGggaXMgaW52YWxpZDogJHtjb29raWUucGF0aH1gKTtcbiAgICB9XG5cbiAgICBzdHIgKz0gXCI7IFBhdGg9XCIgKyBjb29raWUucGF0aDtcbiAgfVxuXG4gIGlmIChjb29raWUuZXhwaXJlcykge1xuICAgIGlmICghaXNEYXRlKGNvb2tpZS5leHBpcmVzKSB8fCAhTnVtYmVyLmlzRmluaXRlKGNvb2tpZS5leHBpcmVzLnZhbHVlT2YoKSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYG9wdGlvbiBleHBpcmVzIGlzIGludmFsaWQ6ICR7Y29va2llLmV4cGlyZXN9YCk7XG4gICAgfVxuXG4gICAgc3RyICs9IFwiOyBFeHBpcmVzPVwiICsgY29va2llLmV4cGlyZXMudG9VVENTdHJpbmcoKTtcbiAgfVxuXG4gIGlmIChjb29raWUuaHR0cE9ubHkpIHtcbiAgICBzdHIgKz0gXCI7IEh0dHBPbmx5XCI7XG4gIH1cblxuICBpZiAoY29va2llLnNlY3VyZSkge1xuICAgIHN0ciArPSBcIjsgU2VjdXJlXCI7XG4gIH1cblxuICBpZiAoY29va2llLnBhcnRpdGlvbmVkKSB7XG4gICAgc3RyICs9IFwiOyBQYXJ0aXRpb25lZFwiO1xuICB9XG5cbiAgaWYgKGNvb2tpZS5wcmlvcml0eSkge1xuICAgIGNvbnN0IHByaW9yaXR5ID1cbiAgICAgIHR5cGVvZiBjb29raWUucHJpb3JpdHkgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBjb29raWUucHJpb3JpdHkudG9Mb3dlckNhc2UoKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBzd2l0Y2ggKHByaW9yaXR5KSB7XG4gICAgICBjYXNlIFwibG93XCI6XG4gICAgICAgIHN0ciArPSBcIjsgUHJpb3JpdHk9TG93XCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm1lZGl1bVwiOlxuICAgICAgICBzdHIgKz0gXCI7IFByaW9yaXR5PU1lZGl1bVwiO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJoaWdoXCI6XG4gICAgICAgIHN0ciArPSBcIjsgUHJpb3JpdHk9SGlnaFwiO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYG9wdGlvbiBwcmlvcml0eSBpcyBpbnZhbGlkOiAke2Nvb2tpZS5wcmlvcml0eX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29va2llLnNhbWVTaXRlKSB7XG4gICAgY29uc3Qgc2FtZVNpdGUgPVxuICAgICAgdHlwZW9mIGNvb2tpZS5zYW1lU2l0ZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGNvb2tpZS5zYW1lU2l0ZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIDogY29va2llLnNhbWVTaXRlO1xuICAgIHN3aXRjaCAoc2FtZVNpdGUpIHtcbiAgICAgIGNhc2UgdHJ1ZTpcbiAgICAgIGNhc2UgXCJzdHJpY3RcIjpcbiAgICAgICAgc3RyICs9IFwiOyBTYW1lU2l0ZT1TdHJpY3RcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibGF4XCI6XG4gICAgICAgIHN0ciArPSBcIjsgU2FtZVNpdGU9TGF4XCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm5vbmVcIjpcbiAgICAgICAgc3RyICs9IFwiOyBTYW1lU2l0ZT1Ob25lXCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgb3B0aW9uIHNhbWVTaXRlIGlzIGludmFsaWQ6ICR7Y29va2llLnNhbWVTaXRlfWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHI7XG59XG5cbi8qKlxuICogRGVzZXJpYWxpemUgYSBgU2V0LUNvb2tpZWAgaGVhZGVyIGludG8gYW4gb2JqZWN0LlxuICpcbiAqIGRlc2VyaWFsaXplKCdmb289YmFyOyBodHRwT25seScpXG4gKiAgID0+IHsgbmFtZTogJ2ZvbycsIHZhbHVlOiAnYmFyJywgaHR0cE9ubHk6IHRydWUgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTZXRDb29raWUoc3RyOiBzdHJpbmcsIG9wdGlvbnM/OiBQYXJzZU9wdGlvbnMpOiBTZXRDb29raWUge1xuICBjb25zdCBkZWMgPSBvcHRpb25zPy5kZWNvZGUgfHwgZGVjb2RlO1xuICBjb25zdCBsZW4gPSBzdHIubGVuZ3RoO1xuICBjb25zdCBlbmRJZHggPSBlbmRJbmRleChzdHIsIDAsIGxlbik7XG4gIGNvbnN0IGVxSWR4ID0gZXFJbmRleChzdHIsIDAsIGVuZElkeCk7XG4gIGNvbnN0IHNldENvb2tpZTogU2V0Q29va2llID1cbiAgICBlcUlkeCA9PT0gLTFcbiAgICAgID8geyBuYW1lOiBcIlwiLCB2YWx1ZTogZGVjKHZhbHVlU2xpY2Uoc3RyLCAwLCBlbmRJZHgpKSB9XG4gICAgICA6IHtcbiAgICAgICAgICBuYW1lOiB2YWx1ZVNsaWNlKHN0ciwgMCwgZXFJZHgpLFxuICAgICAgICAgIHZhbHVlOiBkZWModmFsdWVTbGljZShzdHIsIGVxSWR4ICsgMSwgZW5kSWR4KSksXG4gICAgICAgIH07XG5cbiAgbGV0IGluZGV4ID0gZW5kSWR4ICsgMTtcbiAgd2hpbGUgKGluZGV4IDwgbGVuKSB7XG4gICAgY29uc3QgZW5kSWR4ID0gZW5kSW5kZXgoc3RyLCBpbmRleCwgbGVuKTtcbiAgICBjb25zdCBlcUlkeCA9IGVxSW5kZXgoc3RyLCBpbmRleCwgZW5kSWR4KTtcbiAgICBjb25zdCBhdHRyID1cbiAgICAgIGVxSWR4ID09PSAtMVxuICAgICAgICA/IHZhbHVlU2xpY2Uoc3RyLCBpbmRleCwgZW5kSWR4KVxuICAgICAgICA6IHZhbHVlU2xpY2Uoc3RyLCBpbmRleCwgZXFJZHgpO1xuICAgIGNvbnN0IHZhbCA9IGVxSWR4ID09PSAtMSA/IHVuZGVmaW5lZCA6IHZhbHVlU2xpY2Uoc3RyLCBlcUlkeCArIDEsIGVuZElkeCk7XG5cbiAgICBzd2l0Y2ggKGF0dHIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSBcImh0dHBvbmx5XCI6XG4gICAgICAgIHNldENvb2tpZS5odHRwT25seSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInNlY3VyZVwiOlxuICAgICAgICBzZXRDb29raWUuc2VjdXJlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicGFydGl0aW9uZWRcIjpcbiAgICAgICAgc2V0Q29va2llLnBhcnRpdGlvbmVkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZG9tYWluXCI6XG4gICAgICAgIHNldENvb2tpZS5kb21haW4gPSB2YWw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInBhdGhcIjpcbiAgICAgICAgc2V0Q29va2llLnBhdGggPSB2YWw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm1heC1hZ2VcIjpcbiAgICAgICAgaWYgKHZhbCAmJiBtYXhBZ2VSZWdFeHAudGVzdCh2YWwpKSBzZXRDb29raWUubWF4QWdlID0gTnVtYmVyKHZhbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImV4cGlyZXNcIjpcbiAgICAgICAgaWYgKCF2YWwpIGJyZWFrO1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsKTtcbiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShkYXRlLnZhbHVlT2YoKSkpIHNldENvb2tpZS5leHBpcmVzID0gZGF0ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicHJpb3JpdHlcIjpcbiAgICAgICAgaWYgKCF2YWwpIGJyZWFrO1xuICAgICAgICBjb25zdCBwcmlvcml0eSA9IHZhbC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJpb3JpdHkgPT09IFwibG93XCIgfHxcbiAgICAgICAgICBwcmlvcml0eSA9PT0gXCJtZWRpdW1cIiB8fFxuICAgICAgICAgIHByaW9yaXR5ID09PSBcImhpZ2hcIlxuICAgICAgICApIHtcbiAgICAgICAgICBzZXRDb29raWUucHJpb3JpdHkgPSBwcmlvcml0eTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJzYW1lc2l0ZVwiOlxuICAgICAgICBpZiAoIXZhbCkgYnJlYWs7XG4gICAgICAgIGNvbnN0IHNhbWVTaXRlID0gdmFsLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzYW1lU2l0ZSA9PT0gXCJsYXhcIiB8fFxuICAgICAgICAgIHNhbWVTaXRlID09PSBcInN0cmljdFwiIHx8XG4gICAgICAgICAgc2FtZVNpdGUgPT09IFwibm9uZVwiXG4gICAgICAgICkge1xuICAgICAgICAgIHNldENvb2tpZS5zYW1lU2l0ZSA9IHNhbWVTaXRlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGluZGV4ID0gZW5kSWR4ICsgMTtcbiAgfVxuXG4gIHJldHVybiBzZXRDb29raWU7XG59XG5cbi8qKlxuICogRmluZCB0aGUgYDtgIGNoYXJhY3RlciBiZXR3ZWVuIGBtaW5gIGFuZCBgbGVuYCBpbiBzdHIuXG4gKi9cbmZ1bmN0aW9uIGVuZEluZGV4KHN0cjogc3RyaW5nLCBtaW46IG51bWJlciwgbGVuOiBudW1iZXIpIHtcbiAgY29uc3QgaW5kZXggPSBzdHIuaW5kZXhPZihcIjtcIiwgbWluKTtcbiAgcmV0dXJuIGluZGV4ID09PSAtMSA/IGxlbiA6IGluZGV4O1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIGA9YCBjaGFyYWN0ZXIgYmV0d2VlbiBgbWluYCBhbmQgYG1heGAgaW4gc3RyLlxuICovXG5mdW5jdGlvbiBlcUluZGV4KHN0cjogc3RyaW5nLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgY29uc3QgaW5kZXggPSBzdHIuaW5kZXhPZihcIj1cIiwgbWluKTtcbiAgcmV0dXJuIGluZGV4IDwgbWF4ID8gaW5kZXggOiAtMTtcbn1cblxuLyoqXG4gKiBTbGljZSBvdXQgYSB2YWx1ZSBiZXR3ZWVuIHN0YXJ0UG9kIHRvIG1heC5cbiAqL1xuZnVuY3Rpb24gdmFsdWVTbGljZShzdHI6IHN0cmluZywgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XG4gIGxldCBzdGFydCA9IG1pbjtcbiAgbGV0IGVuZCA9IG1heDtcblxuICBkbyB7XG4gICAgY29uc3QgY29kZSA9IHN0ci5jaGFyQ29kZUF0KHN0YXJ0KTtcbiAgICBpZiAoY29kZSAhPT0gMHgyMCAvKiAgICovICYmIGNvZGUgIT09IDB4MDkgLyogXFx0ICovKSBicmVhaztcbiAgfSB3aGlsZSAoKytzdGFydCA8IGVuZCk7XG5cbiAgd2hpbGUgKGVuZCA+IHN0YXJ0KSB7XG4gICAgY29uc3QgY29kZSA9IHN0ci5jaGFyQ29kZUF0KGVuZCAtIDEpO1xuICAgIGlmIChjb2RlICE9PSAweDIwIC8qICAgKi8gJiYgY29kZSAhPT0gMHgwOSAvKiBcXHQgKi8pIGJyZWFrO1xuICAgIGVuZC0tO1xuICB9XG5cbiAgcmV0dXJuIHN0ci5zbGljZShzdGFydCwgZW5kKTtcbn1cblxuLyoqXG4gKiBVUkwtZGVjb2RlIHN0cmluZyB2YWx1ZS4gT3B0aW1pemVkIHRvIHNraXAgbmF0aXZlIGNhbGwgd2hlbiBubyAlLlxuICovXG5mdW5jdGlvbiBkZWNvZGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoc3RyLmluZGV4T2YoXCIlXCIpID09PSAtMSkgcmV0dXJuIHN0cjtcblxuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc3RyKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdmFsdWUgaXMgYSBEYXRlLlxuICovXG5mdW5jdGlvbiBpc0RhdGUodmFsOiBhbnkpOiB2YWwgaXMgRGF0ZSB7XG4gIHJldHVybiBfX3RvU3RyaW5nLmNhbGwodmFsKSA9PT0gXCJbb2JqZWN0IERhdGVdXCI7XG59XG5cbi8qKlxuICogQmFja3dhcmQgY29tcGF0aWJpbGl0eSBleHBvcnRzLlxuICovXG5leHBvcnQgeyBzdHJpbmdpZnlTZXRDb29raWUgYXMgc2VyaWFsaXplLCBwYXJzZUNvb2tpZSBhcyBwYXJzZSB9O1xuIiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiY29zZS1iYXNlXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtcImNvc2UtYmFzZVwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJjeXRvc2NhcGVGY29zZVwiXSA9IGZhY3RvcnkocmVxdWlyZShcImNvc2UtYmFzZVwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiY3l0b3NjYXBlRmNvc2VcIl0gPSBmYWN0b3J5KHJvb3RbXCJjb3NlQmFzZVwiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xNDBfXykge1xucmV0dXJuIC8qKioqKiovICgoKSA9PiB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0XCJ1c2Ugc3RyaWN0XCI7XG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gKHtcblxuLyoqKi8gNjU4OlxuLyoqKi8gKChtb2R1bGUpID0+IHtcblxuXG5cbi8vIFNpbXBsZSwgaW50ZXJuYWwgT2JqZWN0LmFzc2lnbigpIHBvbHlmaWxsIGZvciBvcHRpb25zIG9iamVjdHMgZXRjLlxuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5hc3NpZ24gIT0gbnVsbCA/IE9iamVjdC5hc3NpZ24uYmluZChPYmplY3QpIDogZnVuY3Rpb24gKHRndCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgc3JjcyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBzcmNzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHNyY3MuZm9yRWFjaChmdW5jdGlvbiAoc3JjKSB7XG4gICAgT2JqZWN0LmtleXMoc3JjKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gdGd0W2tdID0gc3JjW2tdO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gdGd0O1xufTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU0ODpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBfc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0pIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfSByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IHJldHVybiBhcnI7IH0gZWxzZSBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSB7IHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7IH0gZWxzZSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9IH07IH0oKTtcblxuLypcbiAqIEF1eGlsaWFyeSBmdW5jdGlvbnNcbiAqL1xuXG52YXIgTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLkxpbmtlZExpc3Q7XG5cbnZhciBhdXhpbGlhcnkgPSB7fTtcblxuLy8gZ2V0IHRoZSB0b3AgbW9zdCBub2Rlc1xuYXV4aWxpYXJ5LmdldFRvcE1vc3ROb2RlcyA9IGZ1bmN0aW9uIChub2Rlcykge1xuICB2YXIgbm9kZXNNYXAgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIG5vZGVzTWFwW25vZGVzW2ldLmlkKCldID0gdHJ1ZTtcbiAgfVxuICB2YXIgcm9vdHMgPSBub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKGVsZSwgaSkge1xuICAgIGlmICh0eXBlb2YgZWxlID09PSBcIm51bWJlclwiKSB7XG4gICAgICBlbGUgPSBpO1xuICAgIH1cbiAgICB2YXIgcGFyZW50ID0gZWxlLnBhcmVudCgpWzBdO1xuICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGVzTWFwW3BhcmVudC5pZCgpXSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50KClbMF07XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gcm9vdHM7XG59O1xuXG4vLyBmaW5kIGRpc2Nvbm5lY3RlZCBjb21wb25lbnRzIGFuZCBjcmVhdGUgZHVtbXkgbm9kZXMgdGhhdCBjb25uZWN0IHRoZW1cbmF1eGlsaWFyeS5jb25uZWN0Q29tcG9uZW50cyA9IGZ1bmN0aW9uIChjeSwgZWxlcywgdG9wTW9zdE5vZGVzLCBkdW1teU5vZGVzKSB7XG4gIHZhciBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7XG4gIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICB2YXIgdmlzaXRlZFRvcE1vc3ROb2RlcyA9IFtdO1xuICB2YXIgY3VycmVudE5laWdoYm9yID0gdm9pZCAwO1xuICB2YXIgbWluRGVncmVlTm9kZSA9IHZvaWQgMDtcbiAgdmFyIG1pbkRlZ3JlZSA9IHZvaWQgMDtcblxuICB2YXIgaXNDb25uZWN0ZWQgPSBmYWxzZTtcbiAgdmFyIGNvdW50ID0gMTtcbiAgdmFyIG5vZGVzQ29ubmVjdGVkVG9EdW1teSA9IFtdO1xuICB2YXIgY29tcG9uZW50cyA9IFtdO1xuXG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgIHZhciBjbXB0ID0gY3kuY29sbGVjdGlvbigpO1xuICAgIGNvbXBvbmVudHMucHVzaChjbXB0KTtcblxuICAgIHZhciBjdXJyZW50Tm9kZSA9IHRvcE1vc3ROb2Rlc1swXTtcbiAgICB2YXIgY2hpbGRyZW5PZkN1cnJlbnROb2RlID0gY3kuY29sbGVjdGlvbigpO1xuICAgIGNoaWxkcmVuT2ZDdXJyZW50Tm9kZS5tZXJnZShjdXJyZW50Tm9kZSkubWVyZ2UoY3VycmVudE5vZGUuZGVzY2VuZGFudHMoKS5pbnRlcnNlY3Rpb24oZWxlcykpO1xuICAgIHZpc2l0ZWRUb3BNb3N0Tm9kZXMucHVzaChjdXJyZW50Tm9kZSk7XG5cbiAgICBjaGlsZHJlbk9mQ3VycmVudE5vZGUuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcXVldWUucHVzaChub2RlKTtcbiAgICAgIHZpc2l0ZWQuYWRkKG5vZGUpO1xuICAgICAgY21wdC5tZXJnZShub2RlKTtcbiAgICB9KTtcblxuICAgIHZhciBfbG9vcDIgPSBmdW5jdGlvbiBfbG9vcDIoKSB7XG4gICAgICBjdXJyZW50Tm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgIC8vIFRyYXZlcnNlIGFsbCBuZWlnaGJvcnMgb2YgdGhpcyBub2RlXG4gICAgICB2YXIgbmVpZ2hib3JOb2RlcyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgIGN1cnJlbnROb2RlLm5laWdoYm9yaG9vZCgpLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAoZWxlcy5pbnRlcnNlY3Rpb24oY3VycmVudE5vZGUuZWRnZXNXaXRoKG5vZGUpKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbmVpZ2hib3JOb2Rlcy5tZXJnZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVpZ2hib3JOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbmVpZ2hib3JOb2RlID0gbmVpZ2hib3JOb2Rlc1tpXTtcbiAgICAgICAgY3VycmVudE5laWdoYm9yID0gdG9wTW9zdE5vZGVzLmludGVyc2VjdGlvbihuZWlnaGJvck5vZGUudW5pb24obmVpZ2hib3JOb2RlLmFuY2VzdG9ycygpKSk7XG4gICAgICAgIGlmIChjdXJyZW50TmVpZ2hib3IgIT0gbnVsbCAmJiAhdmlzaXRlZC5oYXMoY3VycmVudE5laWdoYm9yWzBdKSkge1xuICAgICAgICAgIHZhciBjaGlsZHJlbk9mTmVpZ2hib3IgPSBjdXJyZW50TmVpZ2hib3IudW5pb24oY3VycmVudE5laWdoYm9yLmRlc2NlbmRhbnRzKCkpO1xuXG4gICAgICAgICAgY2hpbGRyZW5PZk5laWdoYm9yLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgICAgICAgICAgIGNtcHQubWVyZ2Uobm9kZSk7XG4gICAgICAgICAgICBpZiAodG9wTW9zdE5vZGVzLmhhcyhub2RlKSkge1xuICAgICAgICAgICAgICB2aXNpdGVkVG9wTW9zdE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPSAwKSB7XG4gICAgICBfbG9vcDIoKTtcbiAgICB9XG5cbiAgICBjbXB0LmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIGVsZXMuaW50ZXJzZWN0aW9uKG5vZGUuY29ubmVjdGVkRWRnZXMoKSkuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAvLyBjb25uZWN0ZWRFZGdlcygpIHVzdWFsbHkgY2FjaGVkXG4gICAgICAgIGlmIChjbXB0LmhhcyhlLnNvdXJjZSgpKSAmJiBjbXB0LmhhcyhlLnRhcmdldCgpKSkge1xuICAgICAgICAgIC8vIGhhcygpIGlzIGNoZWFwXG4gICAgICAgICAgY21wdC5tZXJnZShlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAodmlzaXRlZFRvcE1vc3ROb2Rlcy5sZW5ndGggPT0gdG9wTW9zdE5vZGVzLmxlbmd0aCkge1xuICAgICAgaXNDb25uZWN0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghaXNDb25uZWN0ZWQgfHwgaXNDb25uZWN0ZWQgJiYgY291bnQgPiAxKSB7XG4gICAgICBtaW5EZWdyZWVOb2RlID0gdmlzaXRlZFRvcE1vc3ROb2Rlc1swXTtcbiAgICAgIG1pbkRlZ3JlZSA9IG1pbkRlZ3JlZU5vZGUuY29ubmVjdGVkRWRnZXMoKS5sZW5ndGg7XG4gICAgICB2aXNpdGVkVG9wTW9zdE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuY29ubmVjdGVkRWRnZXMoKS5sZW5ndGggPCBtaW5EZWdyZWUpIHtcbiAgICAgICAgICBtaW5EZWdyZWUgPSBub2RlLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoO1xuICAgICAgICAgIG1pbkRlZ3JlZU5vZGUgPSBub2RlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG5vZGVzQ29ubmVjdGVkVG9EdW1teS5wdXNoKG1pbkRlZ3JlZU5vZGUuaWQoKSk7XG4gICAgICAvLyBUTyBETzogQ2hlY2sgZWZmaWNpZW5jeSBvZiB0aGlzIHBhcnRcbiAgICAgIHZhciB0ZW1wID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgdGVtcC5tZXJnZSh2aXNpdGVkVG9wTW9zdE5vZGVzWzBdKTtcbiAgICAgIHZpc2l0ZWRUb3BNb3N0Tm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB0ZW1wLm1lcmdlKG5vZGUpO1xuICAgICAgfSk7XG4gICAgICB2aXNpdGVkVG9wTW9zdE5vZGVzID0gW107XG4gICAgICB0b3BNb3N0Tm9kZXMgPSB0b3BNb3N0Tm9kZXMuZGlmZmVyZW5jZSh0ZW1wKTtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuICB9O1xuXG4gIGRvIHtcbiAgICBfbG9vcCgpO1xuICB9IHdoaWxlICghaXNDb25uZWN0ZWQpO1xuXG4gIGlmIChkdW1teU5vZGVzKSB7XG4gICAgaWYgKG5vZGVzQ29ubmVjdGVkVG9EdW1teS5sZW5ndGggPiAwKSB7XG4gICAgICBkdW1teU5vZGVzLnNldCgnZHVtbXknICsgKGR1bW15Tm9kZXMuc2l6ZSArIDEpLCBub2Rlc0Nvbm5lY3RlZFRvRHVtbXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29tcG9uZW50cztcbn07XG5cbi8vIHJlbG9jYXRlcyBjb21wb25lbnRSZXN1bHQgdG8gb3JpZ2luYWxDZW50ZXIgaWYgdGhlcmUgaXMgbm8gZml4ZWROb2RlQ29uc3RyYWludFxuYXV4aWxpYXJ5LnJlbG9jYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKG9yaWdpbmFsQ2VudGVyLCBjb21wb25lbnRSZXN1bHQsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQpIHtcbiAgICB2YXIgbWluWENvb3JkID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIHZhciBtYXhYQ29vcmQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIG1pbllDb29yZCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICB2YXIgbWF4WUNvb3JkID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiKSB7XG4gICAgICAvLyBjYWxjdWxhdGUgY3VycmVudCBib3VuZGluZyBib3hcbiAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvciA9IGZhbHNlO1xuICAgICAgdmFyIF9pdGVyYXRvckVycm9yID0gdW5kZWZpbmVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBjb21wb25lbnRSZXN1bHQubm9kZUluZGV4ZXNbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gKF9zdGVwID0gX2l0ZXJhdG9yLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlKSB7XG4gICAgICAgICAgdmFyIF9yZWYgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgIHZhciBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpO1xuXG4gICAgICAgICAgdmFyIGtleSA9IF9yZWYyWzBdO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IF9yZWYyWzFdO1xuXG4gICAgICAgICAgdmFyIGN5Tm9kZSA9IG9wdGlvbnMuY3kuZ2V0RWxlbWVudEJ5SWQoa2V5KTtcbiAgICAgICAgICBpZiAoY3lOb2RlKSB7XG4gICAgICAgICAgICB2YXIgbm9kZUJCID0gY3lOb2RlLmJvdW5kaW5nQm94KCk7XG4gICAgICAgICAgICB2YXIgbGVmdFggPSBjb21wb25lbnRSZXN1bHQueENvb3Jkc1t2YWx1ZV0gLSBub2RlQkIudyAvIDI7XG4gICAgICAgICAgICB2YXIgcmlnaHRYID0gY29tcG9uZW50UmVzdWx0LnhDb29yZHNbdmFsdWVdICsgbm9kZUJCLncgLyAyO1xuICAgICAgICAgICAgdmFyIHRvcFkgPSBjb21wb25lbnRSZXN1bHQueUNvb3Jkc1t2YWx1ZV0gLSBub2RlQkIuaCAvIDI7XG4gICAgICAgICAgICB2YXIgYm90dG9tWSA9IGNvbXBvbmVudFJlc3VsdC55Q29vcmRzW3ZhbHVlXSArIG5vZGVCQi5oIC8gMjtcblxuICAgICAgICAgICAgaWYgKGxlZnRYIDwgbWluWENvb3JkKSBtaW5YQ29vcmQgPSBsZWZ0WDtcbiAgICAgICAgICAgIGlmIChyaWdodFggPiBtYXhYQ29vcmQpIG1heFhDb29yZCA9IHJpZ2h0WDtcbiAgICAgICAgICAgIGlmICh0b3BZIDwgbWluWUNvb3JkKSBtaW5ZQ29vcmQgPSB0b3BZO1xuICAgICAgICAgICAgaWYgKGJvdHRvbVkgPiBtYXhZQ29vcmQpIG1heFlDb29yZCA9IGJvdHRvbVk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgYW5kIG9yaWdpbmFsIGNlbnRlclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgX2l0ZXJhdG9yRXJyb3IgPSBlcnI7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3IucmV0dXJuKSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBkaWZmT25YID0gb3JpZ2luYWxDZW50ZXIueCAtIChtYXhYQ29vcmQgKyBtaW5YQ29vcmQpIC8gMjtcbiAgICAgIHZhciBkaWZmT25ZID0gb3JpZ2luYWxDZW50ZXIueSAtIChtYXhZQ29vcmQgKyBtaW5ZQ29vcmQpIC8gMjtcbiAgICAgIC8vIG1vdmUgY29tcG9uZW50IHRvIG9yaWdpbmFsIGNlbnRlclxuICAgICAgY29tcG9uZW50UmVzdWx0LnhDb29yZHMgPSBjb21wb25lbnRSZXN1bHQueENvb3Jkcy5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHggKyBkaWZmT25YO1xuICAgICAgfSk7XG4gICAgICBjb21wb25lbnRSZXN1bHQueUNvb3JkcyA9IGNvbXBvbmVudFJlc3VsdC55Q29vcmRzLm1hcChmdW5jdGlvbiAoeSkge1xuICAgICAgICByZXR1cm4geSArIGRpZmZPblk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY2FsY3VsYXRlIGN1cnJlbnQgYm91bmRpbmcgYm94XG4gICAgICBPYmplY3Qua2V5cyhjb21wb25lbnRSZXN1bHQpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgdmFyIG5vZGUgPSBjb21wb25lbnRSZXN1bHRbaXRlbV07XG4gICAgICAgIHZhciBsZWZ0WCA9IG5vZGUuZ2V0UmVjdCgpLng7XG4gICAgICAgIHZhciByaWdodFggPSBub2RlLmdldFJlY3QoKS54ICsgbm9kZS5nZXRSZWN0KCkud2lkdGg7XG4gICAgICAgIHZhciB0b3BZID0gbm9kZS5nZXRSZWN0KCkueTtcbiAgICAgICAgdmFyIGJvdHRvbVkgPSBub2RlLmdldFJlY3QoKS55ICsgbm9kZS5nZXRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgICAgIGlmIChsZWZ0WCA8IG1pblhDb29yZCkgbWluWENvb3JkID0gbGVmdFg7XG4gICAgICAgIGlmIChyaWdodFggPiBtYXhYQ29vcmQpIG1heFhDb29yZCA9IHJpZ2h0WDtcbiAgICAgICAgaWYgKHRvcFkgPCBtaW5ZQ29vcmQpIG1pbllDb29yZCA9IHRvcFk7XG4gICAgICAgIGlmIChib3R0b21ZID4gbWF4WUNvb3JkKSBtYXhZQ29vcmQgPSBib3R0b21ZO1xuICAgICAgfSk7XG4gICAgICAvLyBmaW5kIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IGFuZCBvcmlnaW5hbCBjZW50ZXJcbiAgICAgIHZhciBfZGlmZk9uWCA9IG9yaWdpbmFsQ2VudGVyLnggLSAobWF4WENvb3JkICsgbWluWENvb3JkKSAvIDI7XG4gICAgICB2YXIgX2RpZmZPblkgPSBvcmlnaW5hbENlbnRlci55IC0gKG1heFlDb29yZCArIG1pbllDb29yZCkgLyAyO1xuICAgICAgLy8gbW92ZSBjb21wb25lbnQgdG8gb3JpZ2luYWwgY2VudGVyXG4gICAgICBPYmplY3Qua2V5cyhjb21wb25lbnRSZXN1bHQpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgdmFyIG5vZGUgPSBjb21wb25lbnRSZXN1bHRbaXRlbV07XG4gICAgICAgIG5vZGUuc2V0Q2VudGVyKG5vZGUuZ2V0Q2VudGVyWCgpICsgX2RpZmZPblgsIG5vZGUuZ2V0Q2VudGVyWSgpICsgX2RpZmZPblkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59O1xuXG5hdXhpbGlhcnkuY2FsY0JvdW5kaW5nQm94ID0gZnVuY3Rpb24gKHBhcmVudE5vZGUsIHhDb29yZHMsIHlDb29yZHMsIG5vZGVJbmRleGVzKSB7XG4gIC8vIGNhbGN1bGF0ZSBib3VuZHNcbiAgdmFyIGxlZnQgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgdmFyIHJpZ2h0ID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gIHZhciB0b3AgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgdmFyIGJvdHRvbSA9IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xuICB2YXIgbm9kZUxlZnQgPSB2b2lkIDA7XG4gIHZhciBub2RlUmlnaHQgPSB2b2lkIDA7XG4gIHZhciBub2RlVG9wID0gdm9pZCAwO1xuICB2YXIgbm9kZUJvdHRvbSA9IHZvaWQgMDtcblxuICB2YXIgbm9kZXMgPSBwYXJlbnROb2RlLmRlc2NlbmRhbnRzKCkubm90KFwiOnBhcmVudFwiKTtcbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcblxuICAgIG5vZGVMZWZ0ID0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKV0gLSBub2RlLndpZHRoKCkgLyAyO1xuICAgIG5vZGVSaWdodCA9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGUuaWQoKSldICsgbm9kZS53aWR0aCgpIC8gMjtcbiAgICBub2RlVG9wID0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKV0gLSBub2RlLmhlaWdodCgpIC8gMjtcbiAgICBub2RlQm90dG9tID0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKV0gKyBub2RlLmhlaWdodCgpIC8gMjtcblxuICAgIGlmIChsZWZ0ID4gbm9kZUxlZnQpIHtcbiAgICAgIGxlZnQgPSBub2RlTGVmdDtcbiAgICB9XG5cbiAgICBpZiAocmlnaHQgPCBub2RlUmlnaHQpIHtcbiAgICAgIHJpZ2h0ID0gbm9kZVJpZ2h0O1xuICAgIH1cblxuICAgIGlmICh0b3AgPiBub2RlVG9wKSB7XG4gICAgICB0b3AgPSBub2RlVG9wO1xuICAgIH1cblxuICAgIGlmIChib3R0b20gPCBub2RlQm90dG9tKSB7XG4gICAgICBib3R0b20gPSBub2RlQm90dG9tO1xuICAgIH1cbiAgfVxuXG4gIHZhciBib3VuZGluZ0JveCA9IHt9O1xuICBib3VuZGluZ0JveC50b3BMZWZ0WCA9IGxlZnQ7XG4gIGJvdW5kaW5nQm94LnRvcExlZnRZID0gdG9wO1xuICBib3VuZGluZ0JveC53aWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgYm91bmRpbmdCb3guaGVpZ2h0ID0gYm90dG9tIC0gdG9wO1xuICByZXR1cm4gYm91bmRpbmdCb3g7XG59O1xuXG4vLyBUaGlzIGZ1bmN0aW9uIGZpbmRzIGFuZCByZXR1cm5zIHBhcmVudCBub2RlcyB3aG9zZSBhbGwgY2hpbGRyZW4gYXJlIGhpZGRlblxuYXV4aWxpYXJ5LmNhbGNQYXJlbnRzV2l0aG91dENoaWxkcmVuID0gZnVuY3Rpb24gKGN5LCBlbGVzKSB7XG4gIHZhciBwYXJlbnRzV2l0aG91dENoaWxkcmVuID0gY3kuY29sbGVjdGlvbigpO1xuICBlbGVzLm5vZGVzKCc6cGFyZW50JykuZm9yRWFjaChmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgdmFyIGNoZWNrID0gZmFsc2U7XG4gICAgcGFyZW50LmNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZC5jc3MoJ2Rpc3BsYXknKSAhPSAnbm9uZScpIHtcbiAgICAgICAgY2hlY2sgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghY2hlY2spIHtcbiAgICAgIHBhcmVudHNXaXRob3V0Q2hpbGRyZW4ubWVyZ2UocGFyZW50KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJlbnRzV2l0aG91dENoaWxkcmVuO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBhdXhpbGlhcnk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4MTY6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG4vKipcbiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwb3N0cHJvY2Vzc2luZyBwYXJ0IHRoYXQgYXBwbGllcyBDb1NFIGxheW91dCBvdmVyIHRoZSBzcGVjdHJhbCBsYXlvdXRcbiovXG5cbnZhciBhdXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0OCk7XG52YXIgQ29TRUxheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5Db1NFTGF5b3V0O1xudmFyIENvU0VOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLkNvU0VOb2RlO1xudmFyIFBvaW50RCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLlBvaW50RDtcbnZhciBEaW1lbnNpb25EID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLmxheW91dEJhc2UuRGltZW5zaW9uRDtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MCkubGF5b3V0QmFzZS5MYXlvdXRDb25zdGFudHM7XG52YXIgRkRMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MCkubGF5b3V0QmFzZS5GRExheW91dENvbnN0YW50cztcbnZhciBDb1NFQ29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLkNvU0VDb25zdGFudHM7XG5cbi8vIG1haW4gZnVuY3Rpb24gdGhhdCBjb3NlIGxheW91dCBpcyBwcm9jZXNzZWRcbnZhciBjb3NlTGF5b3V0ID0gZnVuY3Rpb24gY29zZUxheW91dChvcHRpb25zLCBzcGVjdHJhbFJlc3VsdCkge1xuXG4gIHZhciBjeSA9IG9wdGlvbnMuY3k7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCk7XG4gIHZhciBlZGdlcyA9IGVsZXMuZWRnZXMoKTtcblxuICB2YXIgbm9kZUluZGV4ZXMgPSB2b2lkIDA7XG4gIHZhciB4Q29vcmRzID0gdm9pZCAwO1xuICB2YXIgeUNvb3JkcyA9IHZvaWQgMDtcbiAgdmFyIGlkVG9MTm9kZSA9IHt9O1xuXG4gIGlmIChvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgIG5vZGVJbmRleGVzID0gc3BlY3RyYWxSZXN1bHRbXCJub2RlSW5kZXhlc1wiXTtcbiAgICB4Q29vcmRzID0gc3BlY3RyYWxSZXN1bHRbXCJ4Q29vcmRzXCJdO1xuICAgIHlDb29yZHMgPSBzcGVjdHJhbFJlc3VsdFtcInlDb29yZHNcIl07XG4gIH1cblxuICB2YXIgaXNGbiA9IGZ1bmN0aW9uIGlzRm4oZm4pIHtcbiAgICByZXR1cm4gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nO1xuICB9O1xuXG4gIHZhciBvcHRGbiA9IGZ1bmN0aW9uIG9wdEZuKG9wdCwgZWxlKSB7XG4gICAgaWYgKGlzRm4ob3B0KSkge1xuICAgICAgcmV0dXJuIG9wdChlbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3B0O1xuICAgIH1cbiAgfTtcblxuICAvKioqKiBQb3N0cHJvY2Vzc2luZyBmdW5jdGlvbnMgKioqKi9cblxuICB2YXIgcGFyZW50c1dpdGhvdXRDaGlsZHJlbiA9IGF1eC5jYWxjUGFyZW50c1dpdGhvdXRDaGlsZHJlbihjeSwgZWxlcyk7XG5cbiAgLy8gdHJhbnNmZXIgY3l0b3NjYXBlIG5vZGVzIHRvIGNvc2Ugbm9kZXNcbiAgdmFyIHByb2Nlc3NDaGlsZHJlbkxpc3QgPSBmdW5jdGlvbiBwcm9jZXNzQ2hpbGRyZW5MaXN0KHBhcmVudCwgY2hpbGRyZW4sIGxheW91dCwgb3B0aW9ucykge1xuICAgIHZhciBzaXplID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICB2YXIgdGhlQ2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIHZhciBjaGlsZHJlbl9vZl9jaGlsZHJlbiA9IG51bGw7XG4gICAgICBpZiAodGhlQ2hpbGQuaW50ZXJzZWN0aW9uKHBhcmVudHNXaXRob3V0Q2hpbGRyZW4pLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIGNoaWxkcmVuX29mX2NoaWxkcmVuID0gdGhlQ2hpbGQuY2hpbGRyZW4oKTtcbiAgICAgIH1cbiAgICAgIHZhciB0aGVOb2RlID0gdm9pZCAwO1xuXG4gICAgICB2YXIgZGltZW5zaW9ucyA9IHRoZUNoaWxkLmxheW91dERpbWVuc2lvbnMoe1xuICAgICAgICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IG9wdGlvbnMubm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzXG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoZUNoaWxkLm91dGVyV2lkdGgoKSAhPSBudWxsICYmIHRoZUNoaWxkLm91dGVySGVpZ2h0KCkgIT0gbnVsbCkge1xuICAgICAgICBpZiAob3B0aW9ucy5yYW5kb21pemUpIHtcbiAgICAgICAgICBpZiAoIXRoZUNoaWxkLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgIHRoZU5vZGUgPSBwYXJlbnQuYWRkKG5ldyBDb1NFTm9kZShsYXlvdXQuZ3JhcGhNYW5hZ2VyLCBuZXcgUG9pbnREKHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KHRoZUNoaWxkLmlkKCkpXSAtIGRpbWVuc2lvbnMudyAvIDIsIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KHRoZUNoaWxkLmlkKCkpXSAtIGRpbWVuc2lvbnMuaCAvIDIpLCBuZXcgRGltZW5zaW9uRChwYXJzZUZsb2F0KGRpbWVuc2lvbnMudyksIHBhcnNlRmxvYXQoZGltZW5zaW9ucy5oKSkpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHBhcmVudEluZm8gPSBhdXguY2FsY0JvdW5kaW5nQm94KHRoZUNoaWxkLCB4Q29vcmRzLCB5Q29vcmRzLCBub2RlSW5kZXhlcyk7XG4gICAgICAgICAgICBpZiAodGhlQ2hpbGQuaW50ZXJzZWN0aW9uKHBhcmVudHNXaXRob3V0Q2hpbGRyZW4pLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgIHRoZU5vZGUgPSBwYXJlbnQuYWRkKG5ldyBDb1NFTm9kZShsYXlvdXQuZ3JhcGhNYW5hZ2VyLCBuZXcgUG9pbnREKHBhcmVudEluZm8udG9wTGVmdFgsIHBhcmVudEluZm8udG9wTGVmdFkpLCBuZXcgRGltZW5zaW9uRChwYXJlbnRJbmZvLndpZHRoLCBwYXJlbnRJbmZvLmhlaWdodCkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGZvciB0aGUgcGFyZW50c1dpdGhvdXRDaGlsZHJlblxuICAgICAgICAgICAgICB0aGVOb2RlID0gcGFyZW50LmFkZChuZXcgQ29TRU5vZGUobGF5b3V0LmdyYXBoTWFuYWdlciwgbmV3IFBvaW50RChwYXJlbnRJbmZvLnRvcExlZnRYLCBwYXJlbnRJbmZvLnRvcExlZnRZKSwgbmV3IERpbWVuc2lvbkQocGFyc2VGbG9hdChkaW1lbnNpb25zLncpLCBwYXJzZUZsb2F0KGRpbWVuc2lvbnMuaCkpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoZU5vZGUgPSBwYXJlbnQuYWRkKG5ldyBDb1NFTm9kZShsYXlvdXQuZ3JhcGhNYW5hZ2VyLCBuZXcgUG9pbnREKHRoZUNoaWxkLnBvc2l0aW9uKCd4JykgLSBkaW1lbnNpb25zLncgLyAyLCB0aGVDaGlsZC5wb3NpdGlvbigneScpIC0gZGltZW5zaW9ucy5oIC8gMiksIG5ldyBEaW1lbnNpb25EKHBhcnNlRmxvYXQoZGltZW5zaW9ucy53KSwgcGFyc2VGbG9hdChkaW1lbnNpb25zLmgpKSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGVOb2RlID0gcGFyZW50LmFkZChuZXcgQ29TRU5vZGUodGhpcy5ncmFwaE1hbmFnZXIpKTtcbiAgICAgIH1cbiAgICAgIC8vIEF0dGFjaCBpZCB0byB0aGUgbGF5b3V0IG5vZGUgYW5kIHJlcHVsc2lvbiB2YWx1ZVxuICAgICAgdGhlTm9kZS5pZCA9IHRoZUNoaWxkLmRhdGEoXCJpZFwiKTtcbiAgICAgIHRoZU5vZGUubm9kZVJlcHVsc2lvbiA9IG9wdEZuKG9wdGlvbnMubm9kZVJlcHVsc2lvbiwgdGhlQ2hpbGQpO1xuICAgICAgLy8gQXR0YWNoIHRoZSBwYWRkaW5ncyBvZiBjeSBub2RlIHRvIGxheW91dCBub2RlXG4gICAgICB0aGVOb2RlLnBhZGRpbmdMZWZ0ID0gcGFyc2VJbnQodGhlQ2hpbGQuY3NzKCdwYWRkaW5nJykpO1xuICAgICAgdGhlTm9kZS5wYWRkaW5nVG9wID0gcGFyc2VJbnQodGhlQ2hpbGQuY3NzKCdwYWRkaW5nJykpO1xuICAgICAgdGhlTm9kZS5wYWRkaW5nUmlnaHQgPSBwYXJzZUludCh0aGVDaGlsZC5jc3MoJ3BhZGRpbmcnKSk7XG4gICAgICB0aGVOb2RlLnBhZGRpbmdCb3R0b20gPSBwYXJzZUludCh0aGVDaGlsZC5jc3MoJ3BhZGRpbmcnKSk7XG5cbiAgICAgIC8vQXR0YWNoIHRoZSBsYWJlbCBwcm9wZXJ0aWVzIHRvIGJvdGggY29tcG91bmQgYW5kIHNpbXBsZSBub2RlcyBpZiBsYWJlbHMgd2lsbCBiZSBpbmNsdWRlZCBpbiBub2RlIGRpbWVuc2lvbnNcbiAgICAgIC8vVGhlc2UgcHJvcGVydGllcyB3aWxsIGJlIHVzZWQgd2hpbGUgdXBkYXRpbmcgYm91bmRzIG9mIGNvbXBvdW5kcyBkdXJpbmcgaXRlcmF0aW9ucyBvciB0aWxpbmdcbiAgICAgIC8vYW5kIHdpbGwgYmUgdXNlZCBmb3Igc2ltcGxlIG5vZGVzIHdoaWxlIHRyYW5zZmVycmluZyBmaW5hbCBwb3NpdGlvbnMgdG8gY3l0b3NjYXBlXG4gICAgICBpZiAob3B0aW9ucy5ub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHMpIHtcbiAgICAgICAgdGhlTm9kZS5sYWJlbFdpZHRoID0gdGhlQ2hpbGQuYm91bmRpbmdCb3goeyBpbmNsdWRlTGFiZWxzOiB0cnVlLCBpbmNsdWRlTm9kZXM6IGZhbHNlLCBpbmNsdWRlT3ZlcmxheXM6IGZhbHNlIH0pLnc7XG4gICAgICAgIHRoZU5vZGUubGFiZWxIZWlnaHQgPSB0aGVDaGlsZC5ib3VuZGluZ0JveCh7IGluY2x1ZGVMYWJlbHM6IHRydWUsIGluY2x1ZGVOb2RlczogZmFsc2UsIGluY2x1ZGVPdmVybGF5czogZmFsc2UgfSkuaDtcbiAgICAgICAgdGhlTm9kZS5sYWJlbFBvc1ZlcnRpY2FsID0gdGhlQ2hpbGQuY3NzKFwidGV4dC12YWxpZ25cIik7XG4gICAgICAgIHRoZU5vZGUubGFiZWxQb3NIb3Jpem9udGFsID0gdGhlQ2hpbGQuY3NzKFwidGV4dC1oYWxpZ25cIik7XG4gICAgICB9XG5cbiAgICAgIC8vIE1hcCB0aGUgbGF5b3V0IG5vZGVcbiAgICAgIGlkVG9MTm9kZVt0aGVDaGlsZC5kYXRhKFwiaWRcIildID0gdGhlTm9kZTtcblxuICAgICAgaWYgKGlzTmFOKHRoZU5vZGUucmVjdC54KSkge1xuICAgICAgICB0aGVOb2RlLnJlY3QueCA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc05hTih0aGVOb2RlLnJlY3QueSkpIHtcbiAgICAgICAgdGhlTm9kZS5yZWN0LnkgPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGRyZW5fb2ZfY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbl9vZl9jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciB0aGVOZXdHcmFwaCA9IHZvaWQgMDtcbiAgICAgICAgdGhlTmV3R3JhcGggPSBsYXlvdXQuZ2V0R3JhcGhNYW5hZ2VyKCkuYWRkKGxheW91dC5uZXdHcmFwaCgpLCB0aGVOb2RlKTtcbiAgICAgICAgcHJvY2Vzc0NoaWxkcmVuTGlzdCh0aGVOZXdHcmFwaCwgY2hpbGRyZW5fb2ZfY2hpbGRyZW4sIGxheW91dCwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIHRyYW5zZmVyIGN5dG9zY2FwZSBlZGdlcyB0byBjb3NlIGVkZ2VzXG4gIHZhciBwcm9jZXNzRWRnZXMgPSBmdW5jdGlvbiBwcm9jZXNzRWRnZXMobGF5b3V0LCBnbSwgZWRnZXMpIHtcbiAgICB2YXIgaWRlYWxMZW5ndGhUb3RhbCA9IDA7XG4gICAgdmFyIGVkZ2VDb3VudCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcbiAgICAgIHZhciBzb3VyY2VOb2RlID0gaWRUb0xOb2RlW2VkZ2UuZGF0YShcInNvdXJjZVwiKV07XG4gICAgICB2YXIgdGFyZ2V0Tm9kZSA9IGlkVG9MTm9kZVtlZGdlLmRhdGEoXCJ0YXJnZXRcIildO1xuICAgICAgaWYgKHNvdXJjZU5vZGUgJiYgdGFyZ2V0Tm9kZSAmJiBzb3VyY2VOb2RlICE9PSB0YXJnZXROb2RlICYmIHNvdXJjZU5vZGUuZ2V0RWRnZXNCZXR3ZWVuKHRhcmdldE5vZGUpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHZhciBlMSA9IGdtLmFkZChsYXlvdXQubmV3RWRnZSgpLCBzb3VyY2VOb2RlLCB0YXJnZXROb2RlKTtcbiAgICAgICAgZTEuaWQgPSBlZGdlLmlkKCk7XG4gICAgICAgIGUxLmlkZWFsTGVuZ3RoID0gb3B0Rm4ob3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGgsIGVkZ2UpO1xuICAgICAgICBlMS5lZGdlRWxhc3RpY2l0eSA9IG9wdEZuKG9wdGlvbnMuZWRnZUVsYXN0aWNpdHksIGVkZ2UpO1xuICAgICAgICBpZGVhbExlbmd0aFRvdGFsICs9IGUxLmlkZWFsTGVuZ3RoO1xuICAgICAgICBlZGdlQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gd2UgbmVlZCB0byB1cGRhdGUgdGhlIGlkZWFsIGVkZ2UgbGVuZ3RoIGNvbnN0YW50IHdpdGggdGhlIGF2Zy4gaWRlYWwgbGVuZ3RoIHZhbHVlIGFmdGVyIHByb2Nlc3NpbmcgZWRnZXNcbiAgICAvLyBpbiBjYXNlIHRoZXJlIGlzIG5vIGVkZ2UsIHVzZSBvdGhlciBvcHRpb25zXG4gICAgaWYgKG9wdGlvbnMuaWRlYWxFZGdlTGVuZ3RoICE9IG51bGwpIHtcbiAgICAgIGlmIChlZGdlQ291bnQgPiAwKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIID0gaWRlYWxMZW5ndGhUb3RhbCAvIGVkZ2VDb3VudDtlbHNlIGlmICghaXNGbihvcHRpb25zLmlkZWFsRWRnZUxlbmd0aCkpIC8vIGluIGNhc2UgdGhlcmUgaXMgbm8gZWRnZSwgYnV0IG9wdGlvbiBnaXZlcyBhIHZhbHVlIHRvIHVzZVxuICAgICAgICBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIID0gb3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGg7ZWxzZSAvLyBpbiBjYXNlIHRoZXJlIGlzIG5vIGVkZ2UgYW5kIHdlIGNhbm5vdCBnZXQgYSB2YWx1ZSBmcm9tIG9wdGlvbiAoYmVjYXVzZSBpdCdzIGEgZnVuY3Rpb24pXG4gICAgICAgIENvU0VDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSA1MDtcbiAgICAgIC8vIHdlIG5lZWQgdG8gdXBkYXRlIHRoZXNlIGNvbnN0YW50IHZhbHVlcyBiYXNlZCBvbiB0aGUgaWRlYWwgZWRnZSBsZW5ndGggY29uc3RhbnRcbiAgICAgIENvU0VDb25zdGFudHMuTUlOX1JFUFVMU0lPTl9ESVNUID0gRkRMYXlvdXRDb25zdGFudHMuTUlOX1JFUFVMU0lPTl9ESVNUID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCAvIDEwLjA7XG4gICAgICBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfUkFESUFMX1NFUEFSQVRJT04gPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIO1xuICAgIH1cbiAgfTtcblxuICAvLyB0cmFuc2ZlciBjeXRvc2NhcGUgY29uc3RyYWludHMgdG8gY29zZSBsYXlvdXRcbiAgdmFyIHByb2Nlc3NDb25zdHJhaW50cyA9IGZ1bmN0aW9uIHByb2Nlc3NDb25zdHJhaW50cyhsYXlvdXQsIG9wdGlvbnMpIHtcbiAgICAvLyBnZXQgbm9kZXMgdG8gYmUgZml4ZWRcbiAgICBpZiAob3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50KSB7XG4gICAgICBsYXlvdXQuY29uc3RyYWludHNbXCJmaXhlZE5vZGVDb25zdHJhaW50XCJdID0gb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50O1xuICAgIH1cbiAgICAvLyBnZXQgbm9kZXMgdG8gYmUgYWxpZ25lZFxuICAgIGlmIChvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICAgIGxheW91dC5jb25zdHJhaW50c1tcImFsaWdubWVudENvbnN0cmFpbnRcIl0gPSBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQ7XG4gICAgfVxuICAgIC8vIGdldCBub2RlcyB0byBiZSByZWxhdGl2ZWx5IHBsYWNlZFxuICAgIGlmIChvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuICAgICAgbGF5b3V0LmNvbnN0cmFpbnRzW1wicmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50XCJdID0gb3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQ7XG4gICAgfVxuICB9O1xuXG4gIC8qKioqIEFwcGx5IHBvc3Rwcm9jZXNzaW5nICoqKiovXG4gIGlmIChvcHRpb25zLm5lc3RpbmdGYWN0b3IgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5QRVJfTEVWRUxfSURFQUxfRURHRV9MRU5HVEhfRkFDVE9SID0gRkRMYXlvdXRDb25zdGFudHMuUEVSX0xFVkVMX0lERUFMX0VER0VfTEVOR1RIX0ZBQ1RPUiA9IG9wdGlvbnMubmVzdGluZ0ZhY3RvcjtcbiAgaWYgKG9wdGlvbnMuZ3Jhdml0eSAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSCA9IG9wdGlvbnMuZ3Jhdml0eTtcbiAgaWYgKG9wdGlvbnMubnVtSXRlciAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLk1BWF9JVEVSQVRJT05TID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX0lURVJBVElPTlMgPSBvcHRpb25zLm51bUl0ZXI7XG4gIGlmIChvcHRpb25zLmdyYXZpdHlSYW5nZSAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9SQU5HRV9GQUNUT1IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVZJVFlfUkFOR0VfRkFDVE9SID0gb3B0aW9ucy5ncmF2aXR5UmFuZ2U7XG4gIGlmIChvcHRpb25zLmdyYXZpdHlDb21wb3VuZCAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9TVFJFTkdUSCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9TVFJFTkdUSCA9IG9wdGlvbnMuZ3Jhdml0eUNvbXBvdW5kO1xuICBpZiAob3B0aW9ucy5ncmF2aXR5UmFuZ2VDb21wb3VuZCAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9SQU5HRV9GQUNUT1IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfUkFOR0VfRkFDVE9SID0gb3B0aW9ucy5ncmF2aXR5UmFuZ2VDb21wb3VuZDtcbiAgaWYgKG9wdGlvbnMuaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWwgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCA9IG9wdGlvbnMuaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWw7XG5cbiAgaWYgKG9wdGlvbnMudGlsaW5nQ29tcGFyZUJ5ICE9IG51bGwpIENvU0VDb25zdGFudHMuVElMSU5HX0NPTVBBUkVfQlkgPSBvcHRpb25zLnRpbGluZ0NvbXBhcmVCeTtcblxuICBpZiAob3B0aW9ucy5xdWFsaXR5ID09ICdwcm9vZicpIExheW91dENvbnN0YW50cy5RVUFMSVRZID0gMjtlbHNlIExheW91dENvbnN0YW50cy5RVUFMSVRZID0gMDtcblxuICBDb1NFQ29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyA9IEZETGF5b3V0Q29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyA9IExheW91dENvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMgPSBvcHRpb25zLm5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVscztcbiAgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gIW9wdGlvbnMucmFuZG9taXplO1xuICBDb1NFQ29uc3RhbnRzLkFOSU1BVEUgPSBGRExheW91dENvbnN0YW50cy5BTklNQVRFID0gTGF5b3V0Q29uc3RhbnRzLkFOSU1BVEUgPSBvcHRpb25zLmFuaW1hdGU7XG4gIENvU0VDb25zdGFudHMuVElMRSA9IG9wdGlvbnMudGlsZTtcbiAgQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19WRVJUSUNBTCA9IHR5cGVvZiBvcHRpb25zLnRpbGluZ1BhZGRpbmdWZXJ0aWNhbCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGlsaW5nUGFkZGluZ1ZlcnRpY2FsLmNhbGwoKSA6IG9wdGlvbnMudGlsaW5nUGFkZGluZ1ZlcnRpY2FsO1xuICBDb1NFQ29uc3RhbnRzLlRJTElOR19QQURESU5HX0hPUklaT05UQUwgPSB0eXBlb2Ygb3B0aW9ucy50aWxpbmdQYWRkaW5nSG9yaXpvbnRhbCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGlsaW5nUGFkZGluZ0hvcml6b250YWwuY2FsbCgpIDogb3B0aW9ucy50aWxpbmdQYWRkaW5nSG9yaXpvbnRhbDtcblxuICBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUwgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUwgPSB0cnVlO1xuICBDb1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwgPSAhb3B0aW9ucy5yYW5kb21pemU7XG4gIExheW91dENvbnN0YW50cy5ERUZBVUxUX1VOSUZPUk1fTEVBRl9OT0RFX1NJWkVTID0gb3B0aW9ucy51bmlmb3JtTm9kZURpbWVuc2lvbnM7XG5cbiAgLy8gVGhpcyBwYXJ0IGlzIGZvciBkZWJ1Zy9kZW1vIHB1cnBvc2VcbiAgaWYgKG9wdGlvbnMuc3RlcCA9PSBcInRyYW5zZm9ybWVkXCIpIHtcbiAgICBDb1NFQ29uc3RhbnRzLlRSQU5TRk9STV9PTl9DT05TVFJBSU5UX0hBTkRMSU5HID0gdHJ1ZTtcbiAgICBDb1NFQ29uc3RhbnRzLkVORk9SQ0VfQ09OU1RSQUlOVFMgPSBmYWxzZTtcbiAgICBDb1NFQ29uc3RhbnRzLkFQUExZX0xBWU9VVCA9IGZhbHNlO1xuICB9XG4gIGlmIChvcHRpb25zLnN0ZXAgPT0gXCJlbmZvcmNlZFwiKSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUyA9IHRydWU7XG4gICAgQ29TRUNvbnN0YW50cy5BUFBMWV9MQVlPVVQgPSBmYWxzZTtcbiAgfVxuICBpZiAob3B0aW9ucy5zdGVwID09IFwiY29zZVwiKSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuQVBQTFlfTEFZT1VUID0gdHJ1ZTtcbiAgfVxuICBpZiAob3B0aW9ucy5zdGVwID09IFwiYWxsXCIpIHtcbiAgICBpZiAob3B0aW9ucy5yYW5kb21pemUpIENvU0VDb25zdGFudHMuVFJBTlNGT1JNX09OX0NPTlNUUkFJTlRfSEFORExJTkcgPSB0cnVlO2Vsc2UgQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IGZhbHNlO1xuICAgIENvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUyA9IHRydWU7XG4gICAgQ29TRUNvbnN0YW50cy5BUFBMWV9MQVlPVVQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuZml4ZWROb2RlQ29uc3RyYWludCB8fCBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQgfHwgb3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICBDb1NFQ29uc3RhbnRzLlRSRUVfUkVEVUNUSU9OX09OX0lOQ1JFTUVOVEFMID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkVFX1JFRFVDVElPTl9PTl9JTkNSRU1FTlRBTCA9IHRydWU7XG4gIH1cblxuICB2YXIgY29zZUxheW91dCA9IG5ldyBDb1NFTGF5b3V0KCk7XG4gIHZhciBnbSA9IGNvc2VMYXlvdXQubmV3R3JhcGhNYW5hZ2VyKCk7XG5cbiAgcHJvY2Vzc0NoaWxkcmVuTGlzdChnbS5hZGRSb290KCksIGF1eC5nZXRUb3BNb3N0Tm9kZXMobm9kZXMpLCBjb3NlTGF5b3V0LCBvcHRpb25zKTtcbiAgcHJvY2Vzc0VkZ2VzKGNvc2VMYXlvdXQsIGdtLCBlZGdlcyk7XG4gIHByb2Nlc3NDb25zdHJhaW50cyhjb3NlTGF5b3V0LCBvcHRpb25zKTtcblxuICBjb3NlTGF5b3V0LnJ1bkxheW91dCgpO1xuXG4gIHJldHVybiBpZFRvTE5vZGU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgY29zZUxheW91dDogY29zZUxheW91dCB9O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMjEyOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuLyoqXG4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZmNvc2UgbGF5b3V0IGFsZ29yaXRobVxuKi9cblxudmFyIGFzc2lnbiA9IF9fd2VicGFja19yZXF1aXJlX18oNjU4KTtcbnZhciBhdXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0OCk7XG5cbnZhciBfcmVxdWlyZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjU3KSxcbiAgICBzcGVjdHJhbExheW91dCA9IF9yZXF1aXJlLnNwZWN0cmFsTGF5b3V0O1xuXG52YXIgX3JlcXVpcmUyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MTYpLFxuICAgIGNvc2VMYXlvdXQgPSBfcmVxdWlyZTIuY29zZUxheW91dDtcblxudmFyIGRlZmF1bHRzID0gT2JqZWN0LmZyZWV6ZSh7XG5cbiAgLy8gJ2RyYWZ0JywgJ2RlZmF1bHQnIG9yICdwcm9vZicgXG4gIC8vIC0gJ2RyYWZ0JyBvbmx5IGFwcGxpZXMgc3BlY3RyYWwgbGF5b3V0IFxuICAvLyAtICdkZWZhdWx0JyBpbXByb3ZlcyB0aGUgcXVhbGl0eSB3aXRoIHN1YnNlcXVlbnQgQ29TRSBsYXlvdXQgKGZhc3QgY29vbGluZyByYXRlKVxuICAvLyAtICdwcm9vZicgaW1wcm92ZXMgdGhlIHF1YWxpdHkgd2l0aCBzdWJzZXF1ZW50IENvU0UgbGF5b3V0IChzbG93IGNvb2xpbmcgcmF0ZSkgXG4gIHF1YWxpdHk6IFwiZGVmYXVsdFwiLFxuICAvLyBVc2UgcmFuZG9tIG5vZGUgcG9zaXRpb25zIGF0IGJlZ2lubmluZyBvZiBsYXlvdXRcbiAgLy8gaWYgdGhpcyBpcyBzZXQgdG8gZmFsc2UsIHRoZW4gcXVhbGl0eSBvcHRpb24gbXVzdCBiZSBcInByb29mXCJcbiAgcmFuZG9taXplOiB0cnVlLFxuICAvLyBXaGV0aGVyIG9yIG5vdCB0byBhbmltYXRlIHRoZSBsYXlvdXRcbiAgYW5pbWF0ZTogdHJ1ZSxcbiAgLy8gRHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zLCBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiAxMDAwLFxuICAvLyBFYXNpbmcgb2YgYW5pbWF0aW9uLCBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBGaXQgdGhlIHZpZXdwb3J0IHRvIHRoZSByZXBvc2l0aW9uZWQgbm9kZXNcbiAgZml0OiB0cnVlLFxuICAvLyBQYWRkaW5nIGFyb3VuZCBsYXlvdXRcbiAgcGFkZGluZzogMzAsXG4gIC8vIFdoZXRoZXIgdG8gaW5jbHVkZSBsYWJlbHMgaW4gbm9kZSBkaW1lbnNpb25zLiBWYWxpZCBpbiBcInByb29mXCIgcXVhbGl0eVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBXaGV0aGVyIG9yIG5vdCBzaW1wbGUgbm9kZXMgKG5vbi1jb21wb3VuZCBub2RlcykgYXJlIG9mIHVuaWZvcm0gZGltZW5zaW9uc1xuICB1bmlmb3JtTm9kZURpbWVuc2lvbnM6IGZhbHNlLFxuICAvLyBXaGV0aGVyIHRvIHBhY2sgZGlzY29ubmVjdGVkIGNvbXBvbmVudHMgLSB2YWxpZCBvbmx5IGlmIHJhbmRvbWl6ZTogdHJ1ZVxuICBwYWNrQ29tcG9uZW50czogdHJ1ZSxcbiAgLy8gTGF5b3V0IHN0ZXAgLSBhbGwsIHRyYW5zZm9ybWVkLCBlbmZvcmNlZCwgY29zZSAtIGZvciBkZWJ1ZyBwdXJwb3NlIG9ubHlcbiAgc3RlcDogXCJhbGxcIixcblxuICAvKiBzcGVjdHJhbCBsYXlvdXQgb3B0aW9ucyAqL1xuXG4gIC8vIEZhbHNlIGZvciByYW5kb20sIHRydWUgZm9yIGdyZWVkeVxuICBzYW1wbGluZ1R5cGU6IHRydWUsXG4gIC8vIFNhbXBsZSBzaXplIHRvIGNvbnN0cnVjdCBkaXN0YW5jZSBtYXRyaXhcbiAgc2FtcGxlU2l6ZTogMjUsXG4gIC8vIFNlcGFyYXRpb24gYW1vdW50IGJldHdlZW4gbm9kZXNcbiAgbm9kZVNlcGFyYXRpb246IDc1LFxuICAvLyBQb3dlciBpdGVyYXRpb24gdG9sZXJhbmNlXG4gIHBpVG9sOiAwLjAwMDAwMDEsXG5cbiAgLyogQ29TRSBsYXlvdXQgb3B0aW9ucyAqL1xuXG4gIC8vIE5vZGUgcmVwdWxzaW9uIChub24gb3ZlcmxhcHBpbmcpIG11bHRpcGxpZXJcbiAgbm9kZVJlcHVsc2lvbjogZnVuY3Rpb24gbm9kZVJlcHVsc2lvbihub2RlKSB7XG4gICAgcmV0dXJuIDQ1MDA7XG4gIH0sXG4gIC8vIElkZWFsIGVkZ2UgKG5vbiBuZXN0ZWQpIGxlbmd0aFxuICBpZGVhbEVkZ2VMZW5ndGg6IGZ1bmN0aW9uIGlkZWFsRWRnZUxlbmd0aChlZGdlKSB7XG4gICAgcmV0dXJuIDUwO1xuICB9LFxuICAvLyBEaXZpc29yIHRvIGNvbXB1dGUgZWRnZSBmb3JjZXNcbiAgZWRnZUVsYXN0aWNpdHk6IGZ1bmN0aW9uIGVkZ2VFbGFzdGljaXR5KGVkZ2UpIHtcbiAgICByZXR1cm4gMC40NTtcbiAgfSxcbiAgLy8gTmVzdGluZyBmYWN0b3IgKG11bHRpcGxpZXIpIHRvIGNvbXB1dGUgaWRlYWwgZWRnZSBsZW5ndGggZm9yIG5lc3RlZCBlZGdlc1xuICBuZXN0aW5nRmFjdG9yOiAwLjEsXG4gIC8vIEdyYXZpdHkgZm9yY2UgKGNvbnN0YW50KVxuICBncmF2aXR5OiAwLjI1LFxuICAvLyBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHBlcmZvcm1cbiAgbnVtSXRlcjogMjUwMCxcbiAgLy8gRm9yIGVuYWJsaW5nIHRpbGluZ1xuICB0aWxlOiB0cnVlLFxuICAvLyBUaGUgZnVuY3Rpb24gdGhhdCBzcGVjaWZpZXMgdGhlIGNyaXRlcmlhIGZvciBjb21wYXJpbmcgbm9kZXMgd2hpbGUgc29ydGluZyB0aGVtIGR1cmluZyB0aWxpbmcgb3BlcmF0aW9uLlxuICAvLyBUYWtlcyB0aGUgbm9kZSBpZCBhcyBhIHBhcmFtZXRlciBhbmQgdGhlIGRlZmF1bHQgdGlsaW5nIG9wZXJhdGlvbiBpcyBwZXJmb21lZCB3aGVuIHRoaXMgb3B0aW9uIGlzIG5vdCBzZXQuXG4gIHRpbGluZ0NvbXBhcmVCeTogdW5kZWZpbmVkLFxuICAvLyBSZXByZXNlbnRzIHRoZSBhbW91bnQgb2YgdGhlIHZlcnRpY2FsIHNwYWNlIHRvIHB1dCBiZXR3ZWVuIHRoZSB6ZXJvIGRlZ3JlZSBtZW1iZXJzIGR1cmluZyB0aGUgdGlsaW5nIG9wZXJhdGlvbihjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uKVxuICB0aWxpbmdQYWRkaW5nVmVydGljYWw6IDEwLFxuICAvLyBSZXByZXNlbnRzIHRoZSBhbW91bnQgb2YgdGhlIGhvcml6b250YWwgc3BhY2UgdG8gcHV0IGJldHdlZW4gdGhlIHplcm8gZGVncmVlIG1lbWJlcnMgZHVyaW5nIHRoZSB0aWxpbmcgb3BlcmF0aW9uKGNhbiBhbHNvIGJlIGEgZnVuY3Rpb24pXG4gIHRpbGluZ1BhZGRpbmdIb3Jpem9udGFsOiAxMCxcbiAgLy8gR3Jhdml0eSByYW5nZSAoY29uc3RhbnQpIGZvciBjb21wb3VuZHNcbiAgZ3Jhdml0eVJhbmdlQ29tcG91bmQ6IDEuNSxcbiAgLy8gR3Jhdml0eSBmb3JjZSAoY29uc3RhbnQpIGZvciBjb21wb3VuZHNcbiAgZ3Jhdml0eUNvbXBvdW5kOiAxLjAsXG4gIC8vIEdyYXZpdHkgcmFuZ2UgKGNvbnN0YW50KVxuICBncmF2aXR5UmFuZ2U6IDMuOCxcbiAgLy8gSW5pdGlhbCBjb29saW5nIGZhY3RvciBmb3IgaW5jcmVtZW50YWwgbGF5b3V0ICBcbiAgaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWw6IDAuMyxcblxuICAvKiBjb25zdHJhaW50IG9wdGlvbnMgKi9cblxuICAvLyBGaXggcmVxdWlyZWQgbm9kZXMgdG8gcHJlZGVmaW5lZCBwb3NpdGlvbnNcbiAgLy8gW3tub2RlSWQ6ICduMScsIHBvc2l0aW9uOiB7eDogMTAwLCB5OiAyMDB9LCB7Li4ufV1cbiAgZml4ZWROb2RlQ29uc3RyYWludDogdW5kZWZpbmVkLFxuICAvLyBBbGlnbiByZXF1aXJlZCBub2RlcyBpbiB2ZXJ0aWNhbC9ob3Jpem9udGFsIGRpcmVjdGlvblxuICAvLyB7dmVydGljYWw6IFtbJ24xJywgJ24yJyldLCBbJ24zJywgJ240J11dLCBob3Jpem9udGFsOiBbJ24yJywgJ240J119XG4gIGFsaWdubWVudENvbnN0cmFpbnQ6IHVuZGVmaW5lZCxcbiAgLy8gUGxhY2UgdHdvIG5vZGVzIHJlbGF0aXZlbHkgaW4gdmVydGljYWwvaG9yaXpvbnRhbCBkaXJlY3Rpb24gXG4gIC8vIFt7dG9wOiAnbjEnLCBib3R0b206ICduMicsIGdhcDogMTAwfSwge2xlZnQ6ICduMycsIHJpZ2h0OiAnbjQnLCBnYXA6IDc1fV1cbiAgcmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50OiB1bmRlZmluZWQsXG5cbiAgLyogbGF5b3V0IGV2ZW50IGNhbGxiYWNrcyAqL1xuICByZWFkeTogZnVuY3Rpb24gcmVhZHkoKSB7fSwgLy8gb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHt9IC8vIG9uIGxheW91dHN0b3Bcbn0pO1xuXG52YXIgTGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBMYXlvdXQob3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMYXlvdXQpO1xuXG4gICAgdGhpcy5vcHRpb25zID0gYXNzaWduKHt9LCBkZWZhdWx0cywgb3B0aW9ucyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTGF5b3V0LCBbe1xuICAgIGtleTogJ3J1bicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJ1bigpIHtcbiAgICAgIHZhciBsYXlvdXQgPSB0aGlzO1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICAgICAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG5cbiAgICAgIHZhciBzcGVjdHJhbFJlc3VsdCA9IFtdO1xuICAgICAgdmFyIHhDb29yZHMgPSB2b2lkIDA7XG4gICAgICB2YXIgeUNvb3JkcyA9IHZvaWQgMDtcbiAgICAgIHZhciBjb3NlUmVzdWx0ID0gW107XG4gICAgICB2YXIgY29tcG9uZW50cyA9IHZvaWQgMDtcbiAgICAgIHZhciBjb21wb25lbnRDZW50ZXJzID0gW107XG5cbiAgICAgIC8vIGJhc2ljIHZhbGlkaXR5IGNoZWNrIGZvciBjb25zdHJhaW50IGlucHV0cyBcbiAgICAgIGlmIChvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQgJiYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMuZml4ZWROb2RlQ29uc3RyYWludCkgfHwgb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50Lmxlbmd0aCA9PSAwKSkge1xuICAgICAgICBvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCAmJiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsKSB8fCBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWwubGVuZ3RoID09IDApKSB7XG4gICAgICAgICAgb3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCAmJiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWwpIHx8IG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsLmxlbmd0aCA9PSAwKSkge1xuICAgICAgICAgIG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCAmJiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHx8IG9wdGlvbnMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50Lmxlbmd0aCA9PSAwKSkge1xuICAgICAgICBvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgYW55IGNvbnN0cmFpbnQgZXhpc3RzLCBzZXQgc29tZSBvcHRpb25zXG4gICAgICB2YXIgY29uc3RyYWludEV4aXN0ID0gb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50IHx8IG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludCB8fCBvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludDtcbiAgICAgIGlmIChjb25zdHJhaW50RXhpc3QpIHtcbiAgICAgICAgLy8gY29uc3RyYWludHMgd29yayB3aXRoIHRoZXNlIG9wdGlvbnNcbiAgICAgICAgb3B0aW9ucy50aWxlID0gZmFsc2U7XG4gICAgICAgIG9wdGlvbnMucGFja0NvbXBvbmVudHMgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gZGVjaWRlIGNvbXBvbmVudCBwYWNraW5nIGlzIGVuYWJsZWQgb3Igbm90XG4gICAgICB2YXIgbGF5VXRpbCA9IHZvaWQgMDtcbiAgICAgIHZhciBwYWNraW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgaWYgKGN5LmxheW91dFV0aWxpdGllcyAmJiBvcHRpb25zLnBhY2tDb21wb25lbnRzKSB7XG4gICAgICAgIGxheVV0aWwgPSBjeS5sYXlvdXRVdGlsaXRpZXMoXCJnZXRcIik7XG4gICAgICAgIGlmICghbGF5VXRpbCkgbGF5VXRpbCA9IGN5LmxheW91dFV0aWxpdGllcygpO1xuICAgICAgICBwYWNraW5nRW5hYmxlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVzLm5vZGVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBpZiBwYWNraW5nIGlzIG5vdCBlbmFibGVkLCBwZXJmb3JtIGxheW91dCBvbiB0aGUgd2hvbGUgZ3JhcGhcbiAgICAgICAgaWYgKCFwYWNraW5nRW5hYmxlZCkge1xuICAgICAgICAgIC8vIHN0b3JlIGNvbXBvbmVudCBjZW50ZXJcbiAgICAgICAgICB2YXIgYm91bmRpbmdCb3ggPSBvcHRpb25zLmVsZXMuYm91bmRpbmdCb3goKTtcbiAgICAgICAgICBjb21wb25lbnRDZW50ZXJzLnB1c2goeyB4OiBib3VuZGluZ0JveC54MSArIGJvdW5kaW5nQm94LncgLyAyLCB5OiBib3VuZGluZ0JveC55MSArIGJvdW5kaW5nQm94LmggLyAyIH0pO1xuICAgICAgICAgIC8vIGFwcGx5IHNwZWN0cmFsIGxheW91dFxuICAgICAgICAgIGlmIChvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHNwZWN0cmFsTGF5b3V0KG9wdGlvbnMpO1xuICAgICAgICAgICAgc3BlY3RyYWxSZXN1bHQucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBhcHBseSBjb3NlIGxheW91dCBhcyBwb3N0cHJvY2Vzc2luZ1xuICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkZWZhdWx0XCIgfHwgb3B0aW9ucy5xdWFsaXR5ID09IFwicHJvb2ZcIikge1xuICAgICAgICAgICAgY29zZVJlc3VsdC5wdXNoKGNvc2VMYXlvdXQob3B0aW9ucywgc3BlY3RyYWxSZXN1bHRbMF0pKTtcbiAgICAgICAgICAgIGF1eC5yZWxvY2F0ZUNvbXBvbmVudChjb21wb25lbnRDZW50ZXJzWzBdLCBjb3NlUmVzdWx0WzBdLCBvcHRpb25zKTsgLy8gcmVsb2NhdGUgY2VudGVyIHRvIG9yaWdpbmFsIHBvc2l0aW9uXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF1eC5yZWxvY2F0ZUNvbXBvbmVudChjb21wb25lbnRDZW50ZXJzWzBdLCBzcGVjdHJhbFJlc3VsdFswXSwgb3B0aW9ucyk7IC8vIHJlbG9jYXRlIGNlbnRlciB0byBvcmlnaW5hbCBwb3NpdGlvblxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBwYWNraW5nIGlzIGVuYWJsZWRcbiAgICAgICAgICB2YXIgdG9wTW9zdE5vZGVzID0gYXV4LmdldFRvcE1vc3ROb2RlcyhvcHRpb25zLmVsZXMubm9kZXMoKSk7XG4gICAgICAgICAgY29tcG9uZW50cyA9IGF1eC5jb25uZWN0Q29tcG9uZW50cyhjeSwgb3B0aW9ucy5lbGVzLCB0b3BNb3N0Tm9kZXMpO1xuICAgICAgICAgIC8vIHN0b3JlIGNvbXBvbmVudCBjZW50ZXJzXG4gICAgICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgIHZhciBib3VuZGluZ0JveCA9IGNvbXBvbmVudC5ib3VuZGluZ0JveCgpO1xuICAgICAgICAgICAgY29tcG9uZW50Q2VudGVycy5wdXNoKHsgeDogYm91bmRpbmdCb3gueDEgKyBib3VuZGluZ0JveC53IC8gMiwgeTogYm91bmRpbmdCb3gueTEgKyBib3VuZGluZ0JveC5oIC8gMiB9KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vc2VuZCBlYWNoIGNvbXBvbmVudCB0byBzcGVjdHJhbCBsYXlvdXQgaWYgcmFuZG9taXplZFxuICAgICAgICAgIGlmIChvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgICAgICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgb3B0aW9ucy5lbGVzID0gY29tcG9uZW50O1xuICAgICAgICAgICAgICBzcGVjdHJhbFJlc3VsdC5wdXNoKHNwZWN0cmFsTGF5b3V0KG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkZWZhdWx0XCIgfHwgb3B0aW9ucy5xdWFsaXR5ID09IFwicHJvb2ZcIikge1xuICAgICAgICAgICAgdmFyIHRvQmVUaWxlZE5vZGVzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudGlsZSkge1xuICAgICAgICAgICAgICAvLyBiZWhhdmUgbm9kZXMgdG8gYmUgdGlsZWQgYXMgb25lIGNvbXBvbmVudFxuICAgICAgICAgICAgICB2YXIgbm9kZUluZGV4ZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICAgIHZhciBfeENvb3JkcyA9IFtdO1xuICAgICAgICAgICAgICB2YXIgX3lDb29yZHMgPSBbXTtcbiAgICAgICAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgICAgICAgdmFyIHRlbXBTcGVjdHJhbFJlc3VsdCA9IHsgbm9kZUluZGV4ZXM6IG5vZGVJbmRleGVzLCB4Q29vcmRzOiBfeENvb3JkcywgeUNvb3JkczogX3lDb29yZHMgfTtcbiAgICAgICAgICAgICAgdmFyIGluZGV4ZXNUb0JlRGVsZXRlZCA9IFtdO1xuICAgICAgICAgICAgICBjb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmVkZ2VzKCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9CZVRpbGVkTm9kZXMubWVyZ2UoY29tcG9uZW50Lm5vZGVzKClbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUuaXNQYXJlbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHRlbXBTcGVjdHJhbFJlc3VsdC5ub2RlSW5kZXhlcy5zZXQoY29tcG9uZW50Lm5vZGVzKClbaV0uaWQoKSwgY291bnQrKyk7XG4gICAgICAgICAgICAgICAgICAgICAgdGVtcFNwZWN0cmFsUmVzdWx0LnhDb29yZHMucHVzaChjb21wb25lbnQubm9kZXMoKVswXS5wb3NpdGlvbigpLngpO1xuICAgICAgICAgICAgICAgICAgICAgIHRlbXBTcGVjdHJhbFJlc3VsdC55Q29vcmRzLnB1c2goY29tcG9uZW50Lm5vZGVzKClbMF0ucG9zaXRpb24oKS55KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpbmRleGVzVG9CZURlbGV0ZWQucHVzaChpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKHRvQmVUaWxlZE5vZGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2JvdW5kaW5nQm94ID0gdG9CZVRpbGVkTm9kZXMuYm91bmRpbmdCb3goKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRDZW50ZXJzLnB1c2goeyB4OiBfYm91bmRpbmdCb3gueDEgKyBfYm91bmRpbmdCb3gudyAvIDIsIHk6IF9ib3VuZGluZ0JveC55MSArIF9ib3VuZGluZ0JveC5oIC8gMiB9KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2godG9CZVRpbGVkTm9kZXMpO1xuICAgICAgICAgICAgICAgIHNwZWN0cmFsUmVzdWx0LnB1c2godGVtcFNwZWN0cmFsUmVzdWx0KTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gaW5kZXhlc1RvQmVEZWxldGVkLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRzLnNwbGljZShpbmRleGVzVG9CZURlbGV0ZWRbaV0sIDEpO1xuICAgICAgICAgICAgICAgICAgc3BlY3RyYWxSZXN1bHQuc3BsaWNlKGluZGV4ZXNUb0JlRGVsZXRlZFtpXSwgMSk7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRDZW50ZXJzLnNwbGljZShpbmRleGVzVG9CZURlbGV0ZWRbaV0sIDEpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICAgICAgICAvLyBzZW5kIGVhY2ggY29tcG9uZW50IHRvIGNvc2UgbGF5b3V0XG4gICAgICAgICAgICAgIG9wdGlvbnMuZWxlcyA9IGNvbXBvbmVudDtcbiAgICAgICAgICAgICAgY29zZVJlc3VsdC5wdXNoKGNvc2VMYXlvdXQob3B0aW9ucywgc3BlY3RyYWxSZXN1bHRbaW5kZXhdKSk7XG4gICAgICAgICAgICAgIGF1eC5yZWxvY2F0ZUNvbXBvbmVudChjb21wb25lbnRDZW50ZXJzW2luZGV4XSwgY29zZVJlc3VsdFtpbmRleF0sIG9wdGlvbnMpOyAvLyByZWxvY2F0ZSBjZW50ZXIgdG8gb3JpZ2luYWwgcG9zaXRpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgYXV4LnJlbG9jYXRlQ29tcG9uZW50KGNvbXBvbmVudENlbnRlcnNbaW5kZXhdLCBzcGVjdHJhbFJlc3VsdFtpbmRleF0sIG9wdGlvbnMpOyAvLyByZWxvY2F0ZSBjZW50ZXIgdG8gb3JpZ2luYWwgcG9zaXRpb25cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHBhY2tpbmdcbiAgICAgICAgICB2YXIgY29tcG9uZW50c0V2YWx1YXRlZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICBpZiAoY29tcG9uZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgc3ViZ3JhcGhzID0gW107XG4gICAgICAgICAgICB2YXIgaGlkZGVuRWxlcyA9IGVsZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVsZS5jc3MoJ2Rpc3BsYXknKSA9PSAnbm9uZSc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICAgICAgICB2YXIgbm9kZUluZGV4ZXMgPSB2b2lkIDA7XG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiKSB7XG4gICAgICAgICAgICAgICAgbm9kZUluZGV4ZXMgPSBzcGVjdHJhbFJlc3VsdFtpbmRleF0ubm9kZUluZGV4ZXM7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm5vZGVzKCkubm90KGhpZGRlbkVsZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgc3ViZ3JhcGggPSB7fTtcbiAgICAgICAgICAgICAgICBzdWJncmFwaC5lZGdlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHN1YmdyYXBoLm5vZGVzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIG5vZGVJbmRleCA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQubm9kZXMoKS5ub3QoaGlkZGVuRWxlcykuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucXVhbGl0eSA9PSBcImRyYWZ0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBub2RlSW5kZXggPSBub2RlSW5kZXhlcy5nZXQobm9kZS5pZCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICBzdWJncmFwaC5ub2Rlcy5wdXNoKHsgeDogc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnhDb29yZHNbbm9kZUluZGV4XSAtIG5vZGUuYm91bmRpbmdib3goKS53IC8gMiwgeTogc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHNbbm9kZUluZGV4XSAtIG5vZGUuYm91bmRpbmdib3goKS5oIC8gMiwgd2lkdGg6IG5vZGUuYm91bmRpbmdib3goKS53LCBoZWlnaHQ6IG5vZGUuYm91bmRpbmdib3goKS5oIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJbmZvID0gYXV4LmNhbGNCb3VuZGluZ0JveChub2RlLCBzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkcywgc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHMsIG5vZGVJbmRleGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICBzdWJncmFwaC5ub2Rlcy5wdXNoKHsgeDogcGFyZW50SW5mby50b3BMZWZ0WCwgeTogcGFyZW50SW5mby50b3BMZWZ0WSwgd2lkdGg6IHBhcmVudEluZm8ud2lkdGgsIGhlaWdodDogcGFyZW50SW5mby5oZWlnaHQgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3NlUmVzdWx0W2luZGV4XVtub2RlLmlkKCldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3ViZ3JhcGgubm9kZXMucHVzaCh7IHg6IGNvc2VSZXN1bHRbaW5kZXhdW25vZGUuaWQoKV0uZ2V0TGVmdCgpLCB5OiBjb3NlUmVzdWx0W2luZGV4XVtub2RlLmlkKCldLmdldFRvcCgpLCB3aWR0aDogY29zZVJlc3VsdFtpbmRleF1bbm9kZS5pZCgpXS5nZXRXaWR0aCgpLCBoZWlnaHQ6IGNvc2VSZXN1bHRbaW5kZXhdW25vZGUuaWQoKV0uZ2V0SGVpZ2h0KCkgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuZWRnZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gZWRnZS5zb3VyY2UoKTtcbiAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBlZGdlLnRhcmdldCgpO1xuICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5jc3MoXCJkaXNwbGF5XCIpICE9IFwibm9uZVwiICYmIHRhcmdldC5jc3MoXCJkaXNwbGF5XCIpICE9IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZU5vZGVJbmRleCA9IG5vZGVJbmRleGVzLmdldChzb3VyY2UuaWQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldE5vZGVJbmRleCA9IG5vZGVJbmRleGVzLmdldCh0YXJnZXQuaWQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZUNlbnRlciA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDZW50ZXIgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRJbmZvID0gYXV4LmNhbGNCb3VuZGluZ0JveChzb3VyY2UsIHNwZWN0cmFsUmVzdWx0W2luZGV4XS54Q29vcmRzLCBzcGVjdHJhbFJlc3VsdFtpbmRleF0ueUNvb3Jkcywgbm9kZUluZGV4ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ2VudGVyLnB1c2gocGFyZW50SW5mby50b3BMZWZ0WCArIHBhcmVudEluZm8ud2lkdGggLyAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNlbnRlci5wdXNoKHBhcmVudEluZm8udG9wTGVmdFkgKyBwYXJlbnRJbmZvLmhlaWdodCAvIDIpO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDZW50ZXIucHVzaChzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkc1tzb3VyY2VOb2RlSW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNlbnRlci5wdXNoKHNwZWN0cmFsUmVzdWx0W2luZGV4XS55Q29vcmRzW3NvdXJjZU5vZGVJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGFyZW50SW5mbyA9IGF1eC5jYWxjQm91bmRpbmdCb3godGFyZ2V0LCBzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkcywgc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHMsIG5vZGVJbmRleGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlci5wdXNoKF9wYXJlbnRJbmZvLnRvcExlZnRYICsgX3BhcmVudEluZm8ud2lkdGggLyAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlci5wdXNoKF9wYXJlbnRJbmZvLnRvcExlZnRZICsgX3BhcmVudEluZm8uaGVpZ2h0IC8gMik7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlci5wdXNoKHNwZWN0cmFsUmVzdWx0W2luZGV4XS54Q29vcmRzW3RhcmdldE5vZGVJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Q2VudGVyLnB1c2goc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHNbdGFyZ2V0Tm9kZUluZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHN1YmdyYXBoLmVkZ2VzLnB1c2goeyBzdGFydFg6IHNvdXJjZUNlbnRlclswXSwgc3RhcnRZOiBzb3VyY2VDZW50ZXJbMV0sIGVuZFg6IHRhcmdldENlbnRlclswXSwgZW5kWTogdGFyZ2V0Q2VudGVyWzFdIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3NlUmVzdWx0W2luZGV4XVtzb3VyY2UuaWQoKV0gJiYgY29zZVJlc3VsdFtpbmRleF1bdGFyZ2V0LmlkKCldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJncmFwaC5lZGdlcy5wdXNoKHsgc3RhcnRYOiBjb3NlUmVzdWx0W2luZGV4XVtzb3VyY2UuaWQoKV0uZ2V0Q2VudGVyWCgpLCBzdGFydFk6IGNvc2VSZXN1bHRbaW5kZXhdW3NvdXJjZS5pZCgpXS5nZXRDZW50ZXJZKCksIGVuZFg6IGNvc2VSZXN1bHRbaW5kZXhdW3RhcmdldC5pZCgpXS5nZXRDZW50ZXJYKCksIGVuZFk6IGNvc2VSZXN1bHRbaW5kZXhdW3RhcmdldC5pZCgpXS5nZXRDZW50ZXJZKCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHN1YmdyYXBoLm5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHN1YmdyYXBocy5wdXNoKHN1YmdyYXBoKTtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNFdmFsdWF0ZWQuYWRkKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIHNoaWZ0UmVzdWx0ID0gbGF5VXRpbC5wYWNrQ29tcG9uZW50cyhzdWJncmFwaHMsIG9wdGlvbnMucmFuZG9taXplKS5zaGlmdHM7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZHJhZnRcIikge1xuICAgICAgICAgICAgICBzcGVjdHJhbFJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChyZXN1bHQsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld1hDb29yZHMgPSByZXN1bHQueENvb3Jkcy5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB4ICsgc2hpZnRSZXN1bHRbaW5kZXhdLmR4O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHZhciBuZXdZQ29vcmRzID0gcmVzdWx0LnlDb29yZHMubWFwKGZ1bmN0aW9uICh5KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4geSArIHNoaWZ0UmVzdWx0W2luZGV4XS5keTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXN1bHQueENvb3JkcyA9IG5ld1hDb29yZHM7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnlDb29yZHMgPSBuZXdZQ29vcmRzO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBfY291bnQgPSAwO1xuICAgICAgICAgICAgICBjb21wb25lbnRzRXZhbHVhdGVkLmZvckVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY29zZVJlc3VsdFtpbmRleF0pLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgIHZhciBub2RlUmVjdGFuZ2xlID0gY29zZVJlc3VsdFtpbmRleF1baXRlbV07XG4gICAgICAgICAgICAgICAgICBub2RlUmVjdGFuZ2xlLnNldENlbnRlcihub2RlUmVjdGFuZ2xlLmdldENlbnRlclgoKSArIHNoaWZ0UmVzdWx0W19jb3VudF0uZHgsIG5vZGVSZWN0YW5nbGUuZ2V0Q2VudGVyWSgpICsgc2hpZnRSZXN1bHRbX2NvdW50XS5keSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgX2NvdW50Kys7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBnZXQgZWFjaCBlbGVtZW50J3MgY2FsY3VsYXRlZCBwb3NpdGlvblxuICAgICAgdmFyIGdldFBvc2l0aW9ucyA9IGZ1bmN0aW9uIGdldFBvc2l0aW9ucyhlbGUsIGkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucXVhbGl0eSA9PSBcImRlZmF1bHRcIiB8fCBvcHRpb25zLnF1YWxpdHkgPT0gXCJwcm9vZlwiKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBlbGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGVsZSA9IGk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBwb3MgPSB2b2lkIDA7XG4gICAgICAgICAgdmFyIG5vZGUgPSB2b2lkIDA7XG4gICAgICAgICAgdmFyIHRoZUlkID0gZWxlLmRhdGEoJ2lkJyk7XG4gICAgICAgICAgY29zZVJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0aGVJZCBpbiByZXN1bHQpIHtcbiAgICAgICAgICAgICAgcG9zID0geyB4OiByZXN1bHRbdGhlSWRdLmdldFJlY3QoKS5nZXRDZW50ZXJYKCksIHk6IHJlc3VsdFt0aGVJZF0uZ2V0UmVjdCgpLmdldENlbnRlclkoKSB9O1xuICAgICAgICAgICAgICBub2RlID0gcmVzdWx0W3RoZUlkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAob3B0aW9ucy5ub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHMpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmxhYmVsV2lkdGgpIHtcbiAgICAgICAgICAgICAgaWYgKG5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICAgICAgcG9zLnggKz0gbm9kZS5sYWJlbFdpZHRoIC8gMjtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICAgICAgICBwb3MueCAtPSBub2RlLmxhYmVsV2lkdGggLyAyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS5sYWJlbEhlaWdodCkge1xuICAgICAgICAgICAgICBpZiAobm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwidG9wXCIpIHtcbiAgICAgICAgICAgICAgICBwb3MueSArPSBub2RlLmxhYmVsSGVpZ2h0IC8gMjtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJib3R0b21cIikge1xuICAgICAgICAgICAgICAgIHBvcy55IC09IG5vZGUubGFiZWxIZWlnaHQgLyAyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwb3MgPT0gdW5kZWZpbmVkKSBwb3MgPSB7IHg6IGVsZS5wb3NpdGlvbihcInhcIiksIHk6IGVsZS5wb3NpdGlvbihcInlcIikgfTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogcG9zLngsXG4gICAgICAgICAgICB5OiBwb3MueVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIF9wb3MgPSB2b2lkIDA7XG4gICAgICAgICAgc3BlY3RyYWxSZXN1bHQuZm9yRWFjaChmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSByZXN1bHQubm9kZUluZGV4ZXMuZ2V0KGVsZS5pZCgpKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgX3BvcyA9IHsgeDogcmVzdWx0LnhDb29yZHNbaW5kZXhdLCB5OiByZXN1bHQueUNvb3Jkc1tpbmRleF0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoX3BvcyA9PSB1bmRlZmluZWQpIF9wb3MgPSB7IHg6IGVsZS5wb3NpdGlvbihcInhcIiksIHk6IGVsZS5wb3NpdGlvbihcInlcIikgfTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogX3Bvcy54LFxuICAgICAgICAgICAgeTogX3Bvcy55XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gcXVhbGl0eSA9IFwiZHJhZnRcIiBhbmQgcmFuZG9taXplID0gZmFsc2UgYXJlIGNvbnRyYWRpY3RpdmUgc28gaW4gdGhhdCBjYXNlIHBvc2l0aW9ucyBkb24ndCBjaGFuZ2VcbiAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkZWZhdWx0XCIgfHwgb3B0aW9ucy5xdWFsaXR5ID09IFwicHJvb2ZcIiB8fCBvcHRpb25zLnJhbmRvbWl6ZSkge1xuICAgICAgICAvLyB0cmFuc2ZlciBjYWxjdWxhdGVkIHBvc2l0aW9ucyB0byBub2RlcyAocG9zaXRpb25zIG9mIG9ubHkgc2ltcGxlIG5vZGVzIGFyZSBldmFsdWF0ZWQsIGNvbXBvdW5kcyBhcmUgcG9zaXRpb25lZCBhdXRvbWF0aWNhbGx5KVxuICAgICAgICB2YXIgcGFyZW50c1dpdGhvdXRDaGlsZHJlbiA9IGF1eC5jYWxjUGFyZW50c1dpdGhvdXRDaGlsZHJlbihjeSwgZWxlcyk7XG4gICAgICAgIHZhciBfaGlkZGVuRWxlcyA9IGVsZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlLmNzcygnZGlzcGxheScpID09ICdub25lJztcbiAgICAgICAgfSk7XG4gICAgICAgIG9wdGlvbnMuZWxlcyA9IGVsZXMubm90KF9oaWRkZW5FbGVzKTtcblxuICAgICAgICBlbGVzLm5vZGVzKCkubm90KFwiOnBhcmVudFwiKS5ub3QoX2hpZGRlbkVsZXMpLmxheW91dFBvc2l0aW9ucyhsYXlvdXQsIG9wdGlvbnMsIGdldFBvc2l0aW9ucyk7XG5cbiAgICAgICAgaWYgKHBhcmVudHNXaXRob3V0Q2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHBhcmVudHNXaXRob3V0Q2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICBlbGUucG9zaXRpb24oZ2V0UG9zaXRpb25zKGVsZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhcIklmIHJhbmRvbWl6ZSBvcHRpb24gaXMgc2V0IHRvIGZhbHNlLCB0aGVuIHF1YWxpdHkgb3B0aW9uIG11c3QgYmUgJ2RlZmF1bHQnIG9yICdwcm9vZicuXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMYXlvdXQ7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTGF5b3V0O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNjU3OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuLyoqXG4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3BlY3RyYWwgbGF5b3V0IHRoYXQgaXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGZjb3NlIGxheW91dCBhbGdvcml0aG1cbiovXG5cbnZhciBhdXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU0OCk7XG52YXIgTWF0cml4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLmxheW91dEJhc2UuTWF0cml4O1xudmFyIFNWRCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLlNWRDtcblxuLy8gbWFpbiBmdW5jdGlvbiB0aGF0IHNwZWN0cmFsIGxheW91dCBpcyBwcm9jZXNzZWRcbnZhciBzcGVjdHJhbExheW91dCA9IGZ1bmN0aW9uIHNwZWN0cmFsTGF5b3V0KG9wdGlvbnMpIHtcblxuICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpO1xuICB2YXIgcGFyZW50Tm9kZXMgPSBlbGVzLm5vZGVzKFwiOnBhcmVudFwiKTtcblxuICB2YXIgZHVtbXlOb2RlcyA9IG5ldyBNYXAoKTsgLy8gbWFwIHRvIGtlZXAgZHVtbXkgbm9kZXMgYW5kIHRoZWlyIG5laWdoYm9yc1xuICB2YXIgbm9kZUluZGV4ZXMgPSBuZXcgTWFwKCk7IC8vIG1hcCB0byBrZWVwIGluZGV4ZXMgdG8gbm9kZXNcbiAgdmFyIHBhcmVudENoaWxkTWFwID0gbmV3IE1hcCgpOyAvLyBtYXBwaW5nIGJ0dy4gY29tcG91bmQgYW5kIGl0cyByZXByZXNlbnRhdGl2ZSBub2RlIFxuICB2YXIgYWxsTm9kZXNOZWlnaGJvcmhvb2QgPSBbXTsgLy8gYXJyYXkgdG8ga2VlcCBuZWlnaGJvcmhvb2Qgb2YgYWxsIG5vZGVzXG4gIHZhciB4Q29vcmRzID0gW107XG4gIHZhciB5Q29vcmRzID0gW107XG5cbiAgdmFyIHNhbXBsZXNDb2x1bW4gPSBbXTsgLy8gc2FtcGxlZCB2ZXJ0aWNlc1xuICB2YXIgbWluRGlzdGFuY2VzQ29sdW1uID0gW107XG4gIHZhciBDID0gW107IC8vIGNvbHVtbiBzYW1wbGluZyBtYXRyaXhcbiAgdmFyIFBISSA9IFtdOyAvLyBpbnRlcnNlY3Rpb24gb2YgY29sdW1uIGFuZCByb3cgc2FtcGxpbmcgbWF0cmljZXMgXG4gIHZhciBJTlYgPSBbXTsgLy8gaW52ZXJzZSBvZiBQSEkgXG5cbiAgdmFyIGZpcnN0U2FtcGxlID0gdm9pZCAwOyAvLyB0aGUgZmlyc3Qgc2FtcGxlZCBub2RlXG4gIHZhciBub2RlU2l6ZSA9IHZvaWQgMDtcblxuICB2YXIgaW5maW5pdHkgPSAxMDAwMDAwMDA7XG4gIHZhciBzbWFsbCA9IDAuMDAwMDAwMDAxO1xuXG4gIHZhciBwaVRvbCA9IG9wdGlvbnMucGlUb2w7XG4gIHZhciBzYW1wbGluZ1R5cGUgPSBvcHRpb25zLnNhbXBsaW5nVHlwZTsgLy8gZmFsc2UgZm9yIHJhbmRvbSwgdHJ1ZSBmb3IgZ3JlZWR5XG4gIHZhciBub2RlU2VwYXJhdGlvbiA9IG9wdGlvbnMubm9kZVNlcGFyYXRpb247XG4gIHZhciBzYW1wbGVTaXplID0gdm9pZCAwO1xuXG4gIC8qKioqIFNwZWN0cmFsLXByZXByb2Nlc3NpbmcgZnVuY3Rpb25zICoqKiovXG5cbiAgLyoqKiogU3BlY3RyYWwgbGF5b3V0IGZ1bmN0aW9ucyAqKioqL1xuXG4gIC8vIGRldGVybWluZSB3aGljaCBjb2x1bW5zIHRvIGJlIHNhbXBsZWRcbiAgdmFyIHJhbmRvbVNhbXBsZUNSID0gZnVuY3Rpb24gcmFuZG9tU2FtcGxlQ1IoKSB7XG4gICAgdmFyIHNhbXBsZSA9IDA7XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgZmxhZyA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKGNvdW50IDwgc2FtcGxlU2l6ZSkge1xuICAgICAgc2FtcGxlID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbm9kZVNpemUpO1xuXG4gICAgICBmbGFnID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgaWYgKHNhbXBsZXNDb2x1bW5baV0gPT0gc2FtcGxlKSB7XG4gICAgICAgICAgZmxhZyA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgIHNhbXBsZXNDb2x1bW5bY291bnRdID0gc2FtcGxlO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIHRha2VzIHRoZSBpbmRleCBvZiB0aGUgbm9kZShwaXZvdCkgdG8gaW5pdGlhdGUgQkZTIGFzIGEgcGFyYW1ldGVyXG4gIHZhciBCRlMgPSBmdW5jdGlvbiBCRlMocGl2b3QsIGluZGV4LCBzYW1wbGluZ01ldGhvZCkge1xuICAgIHZhciBwYXRoID0gW107IC8vIHRoZSBmcm9udCBvZiB0aGUgcGF0aFxuICAgIHZhciBmcm9udCA9IDA7IC8vIHRoZSBiYWNrIG9mIHRoZSBwYXRoXG4gICAgdmFyIGJhY2sgPSAwO1xuICAgIHZhciBjdXJyZW50ID0gMDtcbiAgICB2YXIgdGVtcCA9IHZvaWQgMDtcbiAgICB2YXIgZGlzdGFuY2UgPSBbXTtcblxuICAgIHZhciBtYXhfZGlzdCA9IDA7IC8vIHRoZSBmdXJ0aGVzdCBub2RlIHRvIGJlIHJldHVybmVkXG4gICAgdmFyIG1heF9pbmQgPSAxO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlU2l6ZTsgaSsrKSB7XG4gICAgICBkaXN0YW5jZVtpXSA9IGluZmluaXR5O1xuICAgIH1cblxuICAgIHBhdGhbYmFja10gPSBwaXZvdDtcbiAgICBkaXN0YW5jZVtwaXZvdF0gPSAwO1xuXG4gICAgd2hpbGUgKGJhY2sgPj0gZnJvbnQpIHtcbiAgICAgIGN1cnJlbnQgPSBwYXRoW2Zyb250KytdO1xuICAgICAgdmFyIG5laWdoYm9ycyA9IGFsbE5vZGVzTmVpZ2hib3Job29kW2N1cnJlbnRdO1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5laWdoYm9ycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdGVtcCA9IG5vZGVJbmRleGVzLmdldChuZWlnaGJvcnNbX2ldKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlW3RlbXBdID09IGluZmluaXR5KSB7XG4gICAgICAgICAgZGlzdGFuY2VbdGVtcF0gPSBkaXN0YW5jZVtjdXJyZW50XSArIDE7XG4gICAgICAgICAgcGF0aFsrK2JhY2tdID0gdGVtcDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgQ1tjdXJyZW50XVtpbmRleF0gPSBkaXN0YW5jZVtjdXJyZW50XSAqIG5vZGVTZXBhcmF0aW9uO1xuICAgIH1cblxuICAgIGlmIChzYW1wbGluZ01ldGhvZCkge1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZVNpemU7IF9pMisrKSB7XG4gICAgICAgIGlmIChDW19pMl1baW5kZXhdIDwgbWluRGlzdGFuY2VzQ29sdW1uW19pMl0pIG1pbkRpc3RhbmNlc0NvbHVtbltfaTJdID0gQ1tfaTJdW2luZGV4XTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbm9kZVNpemU7IF9pMysrKSB7XG4gICAgICAgIGlmIChtaW5EaXN0YW5jZXNDb2x1bW5bX2kzXSA+IG1heF9kaXN0KSB7XG4gICAgICAgICAgbWF4X2Rpc3QgPSBtaW5EaXN0YW5jZXNDb2x1bW5bX2kzXTtcbiAgICAgICAgICBtYXhfaW5kID0gX2kzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXhfaW5kO1xuICB9O1xuXG4gIC8vIGFwcGx5IEJGUyB0byBhbGwgbm9kZXMgb3Igc2VsZWN0ZWQgc2FtcGxlc1xuICB2YXIgYWxsQkZTID0gZnVuY3Rpb24gYWxsQkZTKHNhbXBsaW5nTWV0aG9kKSB7XG5cbiAgICB2YXIgc2FtcGxlID0gdm9pZCAwO1xuXG4gICAgaWYgKCFzYW1wbGluZ01ldGhvZCkge1xuICAgICAgcmFuZG9tU2FtcGxlQ1IoKTtcblxuICAgICAgLy8gY2FsbCBCRlNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICAgIEJGUyhzYW1wbGVzQ29sdW1uW2ldLCBpLCBzYW1wbGluZ01ldGhvZCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzYW1wbGUgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBub2RlU2l6ZSk7XG4gICAgICBmaXJzdFNhbXBsZSA9IHNhbXBsZTtcblxuICAgICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgbm9kZVNpemU7IF9pNCsrKSB7XG4gICAgICAgIG1pbkRpc3RhbmNlc0NvbHVtbltfaTRdID0gaW5maW5pdHk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IHNhbXBsZVNpemU7IF9pNSsrKSB7XG4gICAgICAgIHNhbXBsZXNDb2x1bW5bX2k1XSA9IHNhbXBsZTtcbiAgICAgICAgc2FtcGxlID0gQkZTKHNhbXBsZSwgX2k1LCBzYW1wbGluZ01ldGhvZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZm9ybSB0aGUgc3F1YXJlZCBkaXN0YW5jZXMgZm9yIENcbiAgICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBub2RlU2l6ZTsgX2k2KyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2FtcGxlU2l6ZTsgaisrKSB7XG4gICAgICAgIENbX2k2XVtqXSAqPSBDW19pNl1bal07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZm9ybSBQSElcbiAgICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCBzYW1wbGVTaXplOyBfaTcrKykge1xuICAgICAgUEhJW19pN10gPSBbXTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaTggPSAwOyBfaTggPCBzYW1wbGVTaXplOyBfaTgrKykge1xuICAgICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IHNhbXBsZVNpemU7IF9qKyspIHtcbiAgICAgICAgUEhJW19pOF1bX2pdID0gQ1tzYW1wbGVzQ29sdW1uW19qXV1bX2k4XTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gcGVyZm9ybSB0aGUgU1ZEIGFsZ29yaXRobSBhbmQgYXBwbHkgYSByZWd1bGFyaXphdGlvbiBzdGVwXG4gIHZhciBzYW1wbGUgPSBmdW5jdGlvbiBzYW1wbGUoKSB7XG5cbiAgICB2YXIgU1ZEUmVzdWx0ID0gU1ZELnN2ZChQSEkpO1xuXG4gICAgdmFyIGFfcSA9IFNWRFJlc3VsdC5TO1xuICAgIHZhciBhX3UgPSBTVkRSZXN1bHQuVTtcbiAgICB2YXIgYV92ID0gU1ZEUmVzdWx0LlY7XG5cbiAgICB2YXIgbWF4X3MgPSBhX3FbMF0gKiBhX3FbMF0gKiBhX3FbMF07XG5cbiAgICB2YXIgYV9TaWcgPSBbXTtcblxuICAgIC8vICByZWd1bGFyaXphdGlvblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICBhX1NpZ1tpXSA9IFtdO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzYW1wbGVTaXplOyBqKyspIHtcbiAgICAgICAgYV9TaWdbaV1bal0gPSAwO1xuICAgICAgICBpZiAoaSA9PSBqKSB7XG4gICAgICAgICAgYV9TaWdbaV1bal0gPSBhX3FbaV0gLyAoYV9xW2ldICogYV9xW2ldICsgbWF4X3MgLyAoYV9xW2ldICogYV9xW2ldKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBJTlYgPSBNYXRyaXgubXVsdE1hdChNYXRyaXgubXVsdE1hdChhX3YsIGFfU2lnKSwgTWF0cml4LnRyYW5zcG9zZShhX3UpKTtcbiAgfTtcblxuICAvLyBjYWxjdWxhdGUgZmluYWwgY29vcmRpbmF0ZXMgXG4gIHZhciBwb3dlckl0ZXJhdGlvbiA9IGZ1bmN0aW9uIHBvd2VySXRlcmF0aW9uKCkge1xuICAgIC8vIHR3byBsYXJnZXN0IGVpZ2VudmFsdWVzXG4gICAgdmFyIHRoZXRhMSA9IHZvaWQgMDtcbiAgICB2YXIgdGhldGEyID0gdm9pZCAwO1xuXG4gICAgLy8gaW5pdGlhbCBndWVzc2VzIGZvciBlaWdlbnZlY3RvcnNcbiAgICB2YXIgWTEgPSBbXTtcbiAgICB2YXIgWTIgPSBbXTtcblxuICAgIHZhciBWMSA9IFtdO1xuICAgIHZhciBWMiA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlU2l6ZTsgaSsrKSB7XG4gICAgICBZMVtpXSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICBZMltpXSA9IE1hdGgucmFuZG9tKCk7XG4gICAgfVxuXG4gICAgWTEgPSBNYXRyaXgubm9ybWFsaXplKFkxKTtcbiAgICBZMiA9IE1hdHJpeC5ub3JtYWxpemUoWTIpO1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICAvLyB0byBrZWVwIHRyYWNrIG9mIHRoZSBpbXByb3ZlbWVudCByYXRpbyBpbiBwb3dlciBpdGVyYXRpb25cbiAgICB2YXIgY3VycmVudCA9IHNtYWxsO1xuICAgIHZhciBwcmV2aW91cyA9IHNtYWxsO1xuXG4gICAgdmFyIHRlbXAgPSB2b2lkIDA7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY291bnQrKztcblxuICAgICAgZm9yICh2YXIgX2k5ID0gMDsgX2k5IDwgbm9kZVNpemU7IF9pOSsrKSB7XG4gICAgICAgIFYxW19pOV0gPSBZMVtfaTldO1xuICAgICAgfVxuXG4gICAgICBZMSA9IE1hdHJpeC5tdWx0R2FtbWEoTWF0cml4Lm11bHRMKE1hdHJpeC5tdWx0R2FtbWEoVjEpLCBDLCBJTlYpKTtcbiAgICAgIHRoZXRhMSA9IE1hdHJpeC5kb3RQcm9kdWN0KFYxLCBZMSk7XG4gICAgICBZMSA9IE1hdHJpeC5ub3JtYWxpemUoWTEpO1xuXG4gICAgICBjdXJyZW50ID0gTWF0cml4LmRvdFByb2R1Y3QoVjEsIFkxKTtcblxuICAgICAgdGVtcCA9IE1hdGguYWJzKGN1cnJlbnQgLyBwcmV2aW91cyk7XG5cbiAgICAgIGlmICh0ZW1wIDw9IDEgKyBwaVRvbCAmJiB0ZW1wID49IDEpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzID0gY3VycmVudDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaTEwID0gMDsgX2kxMCA8IG5vZGVTaXplOyBfaTEwKyspIHtcbiAgICAgIFYxW19pMTBdID0gWTFbX2kxMF07XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZpb3VzID0gc21hbGw7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvdW50Kys7XG5cbiAgICAgIGZvciAodmFyIF9pMTEgPSAwOyBfaTExIDwgbm9kZVNpemU7IF9pMTErKykge1xuICAgICAgICBWMltfaTExXSA9IFkyW19pMTFdO1xuICAgICAgfVxuXG4gICAgICBWMiA9IE1hdHJpeC5taW51c09wKFYyLCBNYXRyaXgubXVsdENvbnMoVjEsIE1hdHJpeC5kb3RQcm9kdWN0KFYxLCBWMikpKTtcbiAgICAgIFkyID0gTWF0cml4Lm11bHRHYW1tYShNYXRyaXgubXVsdEwoTWF0cml4Lm11bHRHYW1tYShWMiksIEMsIElOVikpO1xuICAgICAgdGhldGEyID0gTWF0cml4LmRvdFByb2R1Y3QoVjIsIFkyKTtcbiAgICAgIFkyID0gTWF0cml4Lm5vcm1hbGl6ZShZMik7XG5cbiAgICAgIGN1cnJlbnQgPSBNYXRyaXguZG90UHJvZHVjdChWMiwgWTIpO1xuXG4gICAgICB0ZW1wID0gTWF0aC5hYnMoY3VycmVudCAvIHByZXZpb3VzKTtcblxuICAgICAgaWYgKHRlbXAgPD0gMSArIHBpVG9sICYmIHRlbXAgPj0gMSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXMgPSBjdXJyZW50O1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pMTIgPSAwOyBfaTEyIDwgbm9kZVNpemU7IF9pMTIrKykge1xuICAgICAgVjJbX2kxMl0gPSBZMltfaTEyXTtcbiAgICB9XG5cbiAgICAvLyB0aGV0YTEgbm93IGNvbnRhaW5zIGRvbWluYW50IGVpZ2VudmFsdWVcbiAgICAvLyB0aGV0YTIgbm93IGNvbnRhaW5zIHRoZSBzZWNvbmQtbGFyZ2VzdCBlaWdlbnZhbHVlXG4gICAgLy8gVjEgbm93IGNvbnRhaW5zIHRoZXRhMSdzIGVpZ2VudmVjdG9yXG4gICAgLy8gVjIgbm93IGNvbnRhaW5zIHRoZXRhMidzIGVpZ2VudmVjdG9yXG5cbiAgICAvL3BvcHVsYXRlIHRoZSB0d28gdmVjdG9yc1xuICAgIHhDb29yZHMgPSBNYXRyaXgubXVsdENvbnMoVjEsIE1hdGguc3FydChNYXRoLmFicyh0aGV0YTEpKSk7XG4gICAgeUNvb3JkcyA9IE1hdHJpeC5tdWx0Q29ucyhWMiwgTWF0aC5zcXJ0KE1hdGguYWJzKHRoZXRhMikpKTtcbiAgfTtcblxuICAvKioqKiBQcmVwYXJhdGlvbiBmb3Igc3BlY3RyYWwgbGF5b3V0IChQcmVwcm9jZXNzaW5nKSAqKioqL1xuXG4gIC8vIGNvbm5lY3QgZGlzY29ubmVjdGVkIGNvbXBvbmVudHMgKGZpcnN0IHRvcCBsZXZlbCwgdGhlbiBpbnNpZGUgb2YgZWFjaCBjb21wb3VuZCBub2RlKVxuICBhdXguY29ubmVjdENvbXBvbmVudHMoY3ksIGVsZXMsIGF1eC5nZXRUb3BNb3N0Tm9kZXMobm9kZXMpLCBkdW1teU5vZGVzKTtcblxuICBwYXJlbnROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICBhdXguY29ubmVjdENvbXBvbmVudHMoY3ksIGVsZXMsIGF1eC5nZXRUb3BNb3N0Tm9kZXMoZWxlLmRlc2NlbmRhbnRzKCkuaW50ZXJzZWN0aW9uKGVsZXMpKSwgZHVtbXlOb2Rlcyk7XG4gIH0pO1xuXG4gIC8vIGFzc2lnbiBpbmRleGVzIHRvIG5vZGVzIChmaXJzdCByZWFsLCB0aGVuIGR1bW15IG5vZGVzKVxuICB2YXIgaW5kZXggPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFub2Rlc1tpXS5pc1BhcmVudCgpKSB7XG4gICAgICBub2RlSW5kZXhlcy5zZXQobm9kZXNbaV0uaWQoKSwgaW5kZXgrKyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgdmFyIF9pdGVyYXRvckVycm9yID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gZHVtbXlOb2Rlcy5rZXlzKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gKF9zdGVwID0gX2l0ZXJhdG9yLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlKSB7XG4gICAgICB2YXIga2V5ID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgIG5vZGVJbmRleGVzLnNldChrZXksIGluZGV4KyspO1xuICAgIH1cblxuICAgIC8vIGluc3RhbnRpYXRlIHRoZSBuZWlnaGJvcmhvb2QgbWF0cml4XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICBfaXRlcmF0b3JFcnJvciA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgX2l0ZXJhdG9yLnJldHVybigpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX2kxMyA9IDA7IF9pMTMgPCBub2RlSW5kZXhlcy5zaXplOyBfaTEzKyspIHtcbiAgICBhbGxOb2Rlc05laWdoYm9yaG9vZFtfaTEzXSA9IFtdO1xuICB9XG5cbiAgLy8gZm9ybSBhIHBhcmVudC1jaGlsZCBtYXAgdG8ga2VlcCByZXByZXNlbnRhdGl2ZSBub2RlIG9mIGVhY2ggY29tcG91bmQgbm9kZSAgXG4gIHBhcmVudE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgIHZhciBjaGlsZHJlbiA9IGVsZS5jaGlsZHJlbigpLmludGVyc2VjdGlvbihlbGVzKTtcblxuICAgIC8vICAgICAgbGV0IHJhbmRvbSA9IDA7XG4gICAgd2hpbGUgKGNoaWxkcmVuLm5vZGVzKFwiOmNoaWxkbGVzc1wiKS5sZW5ndGggPT0gMCkge1xuICAgICAgLy8gICAgICAgIHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoaWxkcmVuLm5vZGVzKCkubGVuZ3RoKTsgLy8gaWYgYWxsIGNoaWxkcmVuIGFyZSBjb21wb3VuZCB0aGVuIHByb2NlZWQgcmFuZG9tbHlcbiAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4ubm9kZXMoKVswXS5jaGlsZHJlbigpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICB9XG4gICAgLy8gIHNlbGVjdCB0aGUgcmVwcmVzZW50YXRpdmUgbm9kZSAtIHdlIGNhbiBhcHBseSBkaWZmZXJlbnQgbWV0aG9kcyBoZXJlXG4gICAgLy8gICAgICByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGlsZHJlbi5ub2RlcyhcIjpjaGlsZGxlc3NcIikubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBtaW4gPSBjaGlsZHJlbi5ub2RlcyhcIjpjaGlsZGxlc3NcIilbMF0uY29ubmVjdGVkRWRnZXMoKS5sZW5ndGg7XG4gICAgY2hpbGRyZW4ubm9kZXMoXCI6Y2hpbGRsZXNzXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsZTIsIGkpIHtcbiAgICAgIGlmIChlbGUyLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoIDwgbWluKSB7XG4gICAgICAgIG1pbiA9IGVsZTIuY29ubmVjdGVkRWRnZXMoKS5sZW5ndGg7XG4gICAgICAgIGluZGV4ID0gaTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwYXJlbnRDaGlsZE1hcC5zZXQoZWxlLmlkKCksIGNoaWxkcmVuLm5vZGVzKFwiOmNoaWxkbGVzc1wiKVtpbmRleF0uaWQoKSk7XG4gIH0pO1xuXG4gIC8vIGFkZCBuZWlnaGJvcmhvb2QgcmVsYXRpb25zIChmaXJzdCByZWFsLCB0aGVuIGR1bW15IG5vZGVzKVxuICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICB2YXIgZWxlSW5kZXggPSB2b2lkIDA7XG5cbiAgICBpZiAoZWxlLmlzUGFyZW50KCkpIGVsZUluZGV4ID0gbm9kZUluZGV4ZXMuZ2V0KHBhcmVudENoaWxkTWFwLmdldChlbGUuaWQoKSkpO2Vsc2UgZWxlSW5kZXggPSBub2RlSW5kZXhlcy5nZXQoZWxlLmlkKCkpO1xuXG4gICAgZWxlLm5laWdoYm9yaG9vZCgpLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgaWYgKGVsZXMuaW50ZXJzZWN0aW9uKGVsZS5lZGdlc1dpdGgobm9kZSkpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKG5vZGUuaXNQYXJlbnQoKSkgYWxsTm9kZXNOZWlnaGJvcmhvb2RbZWxlSW5kZXhdLnB1c2gocGFyZW50Q2hpbGRNYXAuZ2V0KG5vZGUuaWQoKSkpO2Vsc2UgYWxsTm9kZXNOZWlnaGJvcmhvb2RbZWxlSW5kZXhdLnB1c2gobm9kZS5pZCgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoX2tleSkge1xuICAgIHZhciBlbGVJbmRleCA9IG5vZGVJbmRleGVzLmdldChfa2V5KTtcbiAgICB2YXIgZGlzY29ubmVjdGVkSWQgPSB2b2lkIDA7XG4gICAgZHVtbXlOb2Rlcy5nZXQoX2tleSkuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGlmIChjeS5nZXRFbGVtZW50QnlJZChpZCkuaXNQYXJlbnQoKSkgZGlzY29ubmVjdGVkSWQgPSBwYXJlbnRDaGlsZE1hcC5nZXQoaWQpO2Vsc2UgZGlzY29ubmVjdGVkSWQgPSBpZDtcblxuICAgICAgYWxsTm9kZXNOZWlnaGJvcmhvb2RbZWxlSW5kZXhdLnB1c2goZGlzY29ubmVjdGVkSWQpO1xuICAgICAgYWxsTm9kZXNOZWlnaGJvcmhvb2Rbbm9kZUluZGV4ZXMuZ2V0KGRpc2Nvbm5lY3RlZElkKV0ucHVzaChfa2V5KTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSB0cnVlO1xuICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IyID0gZmFsc2U7XG4gIHZhciBfaXRlcmF0b3JFcnJvcjIgPSB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gZHVtbXlOb2Rlcy5rZXlzKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDI7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSAoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IHRydWUpIHtcbiAgICAgIHZhciBfa2V5ID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICBfbG9vcChfa2V5KTtcbiAgICB9XG5cbiAgICAvLyBub2RlU2l6ZSBub3cgb25seSBjb25zaWRlcnMgdGhlIHNpemUgb2YgdHJhbnNmb3JtZWQgZ3JhcGhcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2RpZEl0ZXJhdG9yRXJyb3IyID0gdHJ1ZTtcbiAgICBfaXRlcmF0b3JFcnJvcjIgPSBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgJiYgX2l0ZXJhdG9yMi5yZXR1cm4pIHtcbiAgICAgICAgX2l0ZXJhdG9yMi5yZXR1cm4oKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yMikge1xuICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbm9kZVNpemUgPSBub2RlSW5kZXhlcy5zaXplO1xuXG4gIHZhciBzcGVjdHJhbFJlc3VsdCA9IHZvaWQgMDtcblxuICAvLyBJZiBudW1iZXIgb2Ygbm9kZXMgaW4gdHJhbnNmb3JtZWQgZ3JhcGggaXMgMSBvciAyLCBlaXRoZXIgU1ZEIG9yIHBvd2VySXRlcmF0aW9uIGNhdXNlcyBwcm9ibGVtXG4gIC8vIFNvIHNraXAgc3BlY3RyYWwgYW5kIGxheW91dCB0aGUgZ3JhcGggd2l0aCBjb3NlXG4gIGlmIChub2RlU2l6ZSA+IDIpIHtcbiAgICAvLyBpZiAjIG9mIG5vZGVzIGluIHRyYW5zZm9ybWVkIGdyYXBoIGlzIHNtYWxsZXIgdGhhbiBzYW1wbGUgc2l6ZSxcbiAgICAvLyB0aGVuIHVzZSAjIG9mIG5vZGVzIGFzIHNhbXBsZSBzaXplXG4gICAgc2FtcGxlU2l6ZSA9IG5vZGVTaXplIDwgb3B0aW9ucy5zYW1wbGVTaXplID8gbm9kZVNpemUgOiBvcHRpb25zLnNhbXBsZVNpemU7XG5cbiAgICAvLyBpbnN0YW50aWF0ZXMgdGhlIHBhcnRpYWwgbWF0cmljZXMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gc3BlY3RyYWwgbGF5b3V0XG4gICAgZm9yICh2YXIgX2kxNCA9IDA7IF9pMTQgPCBub2RlU2l6ZTsgX2kxNCsrKSB7XG4gICAgICBDW19pMTRdID0gW107XG4gICAgfVxuICAgIGZvciAodmFyIF9pMTUgPSAwOyBfaTE1IDwgc2FtcGxlU2l6ZTsgX2kxNSsrKSB7XG4gICAgICBJTlZbX2kxNV0gPSBbXTtcbiAgICB9XG5cbiAgICAvKioqKiBBcHBseSBzcGVjdHJhbCBsYXlvdXQgKioqKi9cblxuICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiIHx8IG9wdGlvbnMuc3RlcCA9PSBcImFsbFwiKSB7XG4gICAgICBhbGxCRlMoc2FtcGxpbmdUeXBlKTtcbiAgICAgIHNhbXBsZSgpO1xuICAgICAgcG93ZXJJdGVyYXRpb24oKTtcblxuICAgICAgc3BlY3RyYWxSZXN1bHQgPSB7IG5vZGVJbmRleGVzOiBub2RlSW5kZXhlcywgeENvb3JkczogeENvb3JkcywgeUNvb3JkczogeUNvb3JkcyB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlSW5kZXhlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgIHhDb29yZHMucHVzaChjeS5nZXRFbGVtZW50QnlJZChrZXkpLnBvc2l0aW9uKFwieFwiKSk7XG4gICAgICAgIHlDb29yZHMucHVzaChjeS5nZXRFbGVtZW50QnlJZChrZXkpLnBvc2l0aW9uKFwieVwiKSk7XG4gICAgICB9KTtcbiAgICAgIHNwZWN0cmFsUmVzdWx0ID0geyBub2RlSW5kZXhlczogbm9kZUluZGV4ZXMsIHhDb29yZHM6IHhDb29yZHMsIHlDb29yZHM6IHlDb29yZHMgfTtcbiAgICB9XG4gICAgcmV0dXJuIHNwZWN0cmFsUmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIHZhciBpdGVyYXRvciA9IG5vZGVJbmRleGVzLmtleXMoKTtcbiAgICB2YXIgZmlyc3ROb2RlID0gY3kuZ2V0RWxlbWVudEJ5SWQoaXRlcmF0b3IubmV4dCgpLnZhbHVlKTtcbiAgICB2YXIgZmlyc3ROb2RlUG9zID0gZmlyc3ROb2RlLnBvc2l0aW9uKCk7XG4gICAgdmFyIGZpcnN0Tm9kZVdpZHRoID0gZmlyc3ROb2RlLm91dGVyV2lkdGgoKTtcbiAgICB4Q29vcmRzLnB1c2goZmlyc3ROb2RlUG9zLngpO1xuICAgIHlDb29yZHMucHVzaChmaXJzdE5vZGVQb3MueSk7XG4gICAgaWYgKG5vZGVTaXplID09IDIpIHtcbiAgICAgIHZhciBzZWNvbmROb2RlID0gY3kuZ2V0RWxlbWVudEJ5SWQoaXRlcmF0b3IubmV4dCgpLnZhbHVlKTtcbiAgICAgIHZhciBzZWNvbmROb2RlV2lkdGggPSBzZWNvbmROb2RlLm91dGVyV2lkdGgoKTtcbiAgICAgIHhDb29yZHMucHVzaChmaXJzdE5vZGVQb3MueCArIGZpcnN0Tm9kZVdpZHRoIC8gMiArIHNlY29uZE5vZGVXaWR0aCAvIDIgKyBvcHRpb25zLmlkZWFsRWRnZUxlbmd0aCk7XG4gICAgICB5Q29vcmRzLnB1c2goZmlyc3ROb2RlUG9zLnkpO1xuICAgIH1cblxuICAgIHNwZWN0cmFsUmVzdWx0ID0geyBub2RlSW5kZXhlczogbm9kZUluZGV4ZXMsIHhDb29yZHM6IHhDb29yZHMsIHlDb29yZHM6IHlDb29yZHMgfTtcbiAgICByZXR1cm4gc3BlY3RyYWxSZXN1bHQ7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0geyBzcGVjdHJhbExheW91dDogc3BlY3RyYWxMYXlvdXQgfTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU3OTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBpbXBsID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTIpO1xuXG4vLyByZWdpc3RlcnMgdGhlIGV4dGVuc2lvbiBvbiBhIGN5dG9zY2FwZSBsaWIgcmVmXG52YXIgcmVnaXN0ZXIgPSBmdW5jdGlvbiByZWdpc3RlcihjeXRvc2NhcGUpIHtcbiAgaWYgKCFjeXRvc2NhcGUpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gY2FuJ3QgcmVnaXN0ZXIgaWYgY3l0b3NjYXBlIHVuc3BlY2lmaWVkXG5cbiAgY3l0b3NjYXBlKCdsYXlvdXQnLCAnZmNvc2UnLCBpbXBsKTsgLy8gcmVnaXN0ZXIgd2l0aCBjeXRvc2NhcGUuanNcbn07XG5cbmlmICh0eXBlb2YgY3l0b3NjYXBlICE9PSAndW5kZWZpbmVkJykge1xuICAvLyBleHBvc2UgdG8gZ2xvYmFsIGN5dG9zY2FwZSAoaS5lLiB3aW5kb3cuY3l0b3NjYXBlKVxuICByZWdpc3RlcihjeXRvc2NhcGUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlZ2lzdGVyO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMTQwOlxuLyoqKi8gKChtb2R1bGUpID0+IHtcblxubW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xNDBfXztcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gXHR9KTtcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqLyBcdFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIHN0YXJ0dXBcbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdC8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NzkpO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19leHBvcnRzX187XG4vKioqKioqLyB9KSgpXG47XG59KTsiLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5jb25zdCB7IHN0cmluZywgYXJyYXksIG9iamVjdCwgbnVtYmVyLCBib29sLCBvbmVPZlR5cGUsIGFueSwgZnVuYyB9ID0gUHJvcFR5cGVzO1xuXG5leHBvcnQgY29uc3QgdHlwZXMgPSB7XG4gIC8qKlxuICAgKiBUaGUgYGlkYCBIVE1MIGF0dHJpYnV0ZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKiAqL1xuICBpZDogc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgYGNsYXNzYCBIVE1MIGF0dHJpYnV0ZSBvZiB0aGUgY29tcG9uZW50LiAgVXNlIHRoaXMgdG8gc2V0IHRoZSBkaW1lbnNpb25zIG9mXG4gICAqIHRoZSBncmFwaCB2aXN1YWxpc2F0aW9uIHZpYSBhIHN0eWxlIGJsb2NrIGluIHlvdXIgQ1NTIGZpbGUuXG4gICAqL1xuICBjbGFzc05hbWU6IHN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGBzdHlsZWAgSFRNTCBhdHRyaWJ1dGUgb2YgdGhlIGNvbXBvbmVudC4gIFVzZSB0aGlzIHRvIHNldCB0aGUgZGltZW5zaW9ucyBvZlxuICAgKiB0aGUgZ3JhcGggdmlzdWFsaXNhdGlvbiBpZiB5b3UgZG8gbm90IHVzZSBzZXBhcmF0ZSBDU1MgZmlsZXMuXG4gICAqL1xuICBzdHlsZTogb25lT2ZUeXBlKFtzdHJpbmcsIG9iamVjdF0pLFxuXG4gIC8qKlxuICAgKiBUaGUgZmxhdCBsaXN0IG9mIEN5dG9zY2FwZSBlbGVtZW50cyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZ3JhcGgsIGVhY2ggcmVwcmVzZW50ZWRcbiAgICogYXMgbm9uLXN0cmluZ2lmaWVkIEpTT04uICBFLmcuOlxuICAgKlxuICAgKiBgYGBcbiAgICogZWxlbWVudHM6IFtcbiAgICogICB7IGRhdGE6IHsgaWQ6ICdvbmUnLCBsYWJlbDogJ05vZGUgMScgfSwgcG9zaXRpb246IHsgeDogMCwgeTogMCB9IH0sXG4gICAqICAgeyBkYXRhOiB7IGlkOiAndHdvJywgbGFiZWw6ICdOb2RlIDInIH0sIHBvc2l0aW9uOiB7IHg6IDEwMCwgeTogMCB9IH0sXG4gICAqICAgeyBkYXRhOiB7IHNvdXJjZTogJ29uZScsIHRhcmdldDogJ3R3bycsIGxhYmVsOiAnRWRnZSBmcm9tIE5vZGUxIHRvIE5vZGUyJyB9IH1cbiAgICogXVxuICAgKiBgYGBcbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNub3RhdGlvbi9lbGVtZW50cy1qc29uXG4gICAqICovXG4gIGVsZW1lbnRzOiBvbmVPZlR5cGUoW2FycmF5LCBhbnldKSxcblxuICAvKipcbiAgICogVGhlIEN5dG9zY2FwZSBzdHlsZXNoZWV0IGFzIG5vbi1zdHJpbmdpZmllZCBKU09OLiAgRS5nLjpcbiAgICpcbiAgICogYGBgXG4gICAqIHN0eWxlc2hlZXQ6IFtcbiAgICogICB7XG4gICAqICAgICAgc2VsZWN0b3I6ICdub2RlJyxcbiAgICogICAgICBzdHlsZToge1xuICAgKiAgICAgICAgJ3dpZHRoJzogMzAsXG4gICAqICAgICAgICAnaGVpZ2h0JzogMzAsXG4gICAqICAgICAgICAnc2hhcGUnOiAncmVjdGFuZ2xlJ1xuICAgKiAgICAgIH1cbiAgICogICB9XG4gICAqIF1cbiAgICogYGBgXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jc3R5bGVcbiAgICovXG4gIHN0eWxlc2hlZXQ6IG9uZU9mVHlwZShbYXJyYXksIGFueV0pLFxuXG4gIC8qKlxuICAgKiBVc2UgYSBsYXlvdXQgdG8gYXV0b21hdGljYWxseSBwb3NpdGlvbiB0aGUgbm9kZXMgaW4gdGhlIGdyYXBoLiAgRS5nLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGF5b3V0OiB7IG5hbWU6ICdyYW5kb20nIH1cbiAgICogYGBgXG4gICAqXG4gICAqIE4uYi4gdG8gdXNlIGFuIGV4dGVybmFsIGxheW91dCBleHRlbnNpb24sIHlvdSBtdXN0IHJlZ2lzdGVyIHRoZSBleHRlbnNpb25cbiAgICogcHJpb3IgdG8gcmVuZGVyaW5nIHRoaXMgY29tcG9uZW50LCBlLmcuOlxuICAgKlxuICAgKiBgYGBcbiAgICogaW1wb3J0IEN5dG9zY2FwZSBmcm9tICdjeXRvc2NhcGUnO1xuICAgKiBpbXBvcnQgQ09TRUJpbGtlbnQgZnJvbSAnY3l0b3NjYXBlLWNvc2UtYmlsa2VudCc7XG4gICAqIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG4gICAqIGltcG9ydCBDeXRvc2NhcGVDb21wb25lbnQgZnJvbSAnY3l0b3NjYXBlLXJlYWN0anMnO1xuICAgKlxuICAgKiBDeXRvc2NhcGUudXNlKENPU0VCaWxrZW50KTtcbiAgICpcbiAgICogY2xhc3MgTXlBcHAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgKiAgIHJlbmRlcigpIHtcbiAgICogICAgIGNvbnN0IGVsZW1lbnRzID0gW1xuICAgKiAgICAgICB7IGRhdGE6IHsgaWQ6ICdvbmUnLCBsYWJlbDogJ05vZGUgMScgfSwgcG9zaXRpb246IHsgeDogMCwgeTogMCB9IH0sXG4gICAqICAgICAgIHsgZGF0YTogeyBpZDogJ3R3bycsIGxhYmVsOiAnTm9kZSAyJyB9LCBwb3NpdGlvbjogeyB4OiAxMDAsIHk6IDAgfSB9LFxuICAgKiAgICAgICB7IGRhdGE6IHsgc291cmNlOiAnb25lJywgdGFyZ2V0OiAndHdvJywgbGFiZWw6ICdFZGdlIGZyb20gTm9kZTEgdG8gTm9kZTInIH0gfVxuICAgKiAgICAgXTtcbiAgICpcbiAgICogICAgIGNvbnN0IGxheW91dCA9IHsgbmFtZTogJ2Nvc2UtYmlsa2VudCcgfTtcbiAgICpcbiAgICogICAgIHJldHVybiA8Q3l0b3NjYXBlQ29tcG9uZW50IGVsZW1lbnRzPXtlbGVtZW50c30gbGF5b3V0PXtsYXlvdXR9PjtcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jbGF5b3V0c1xuICAgKi9cbiAgbGF5b3V0OiBvbmVPZlR5cGUoW29iamVjdCwgYW55XSksXG5cbiAgLyoqXG4gICAqIFRoZSBwYW5uaW5nIHBvc2l0aW9uIG9mIHRoZSBncmFwaC5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvcGFuXG4gICAqL1xuICBwYW46IG9uZU9mVHlwZShbb2JqZWN0LCBhbnldKSxcblxuICAvKipcbiAgICogVGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy96b29tXG4gICAqL1xuICB6b29tOiBudW1iZXIsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBhbm5pbmcgcG9zaXRpb24gb2YgdGhlIGdyYXBoIGlzIG11dGFibGUgb3ZlcmFsbC5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvcGFubmluZ0VuYWJsZWRcbiAgICovXG4gIHBhbm5pbmdFbmFibGVkOiBib29sLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYW5uaW5nIHBvc2l0aW9uIG9mIHRoZSBncmFwaCBpcyBtdXRhYmxlIGJ5IHVzZXIgZ2VzdHVyZXMgKGUuZy4gc3dpcGUpLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy91c2VyUGFubmluZ0VuYWJsZWRcbiAgICovXG4gIHVzZXJQYW5uaW5nRW5hYmxlZDogYm9vbCxcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGguXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL21pblpvb21cbiAgICovXG4gIG1pblpvb206IG51bWJlcixcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGguXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL21heFpvb21cbiAgICovXG4gIG1heFpvb206IG51bWJlcixcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgem9vbSBsZXZlbCBvZiB0aGUgZ3JhcGggaXMgbXV0YWJsZSBvdmVyYWxsLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy96b29taW5nRW5hYmxlZFxuICAgKi9cbiAgem9vbWluZ0VuYWJsZWQ6IGJvb2wsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoIGlzIG11dGFibGUgYnkgdXNlciBnZXN0dXJlcyAoZS5nLiBwaW5jaC10by16b29tKS5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvdXNlclpvb21pbmdFbmFibGVkXG4gICAqL1xuICB1c2VyWm9vbWluZ0VuYWJsZWQ6IGJvb2wsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc2hpZnQrY2xpY2stYW5kLWRyYWcgYm94IHNlbGVjdGlvbiBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy9ib3hTZWxlY3Rpb25FbmFibGVkXG4gICAqL1xuICBib3hTZWxlY3Rpb25FbmFibGVkOiBib29sLFxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBub2RlcyBhdXRvbWF0aWNhbGx5IGNhbiBub3QgYmUgZ3JhYmJlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXJcbiAgICogZWFjaCBub2RlIGlzIG1hcmtlZCBhcyBncmFiYmFibGUuXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL2F1dG91bmdyYWJpZnlcbiAgICovXG4gIGF1dG91bmdyYWJpZnk6IGJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIG5vZGVzIGNhbiBub3QgYmUgbW92ZWQgYXQgYWxsLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy9hdXRvbG9ja1xuICAgKi9cbiAgYXV0b2xvY2s6IGJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGVsZW1lbnRzIGhhdmUgaW1tdXRhYmxlIHNlbGVjdGlvbiBzdGF0ZS5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvYXV0b3Vuc2VsZWN0aWZ5XG4gICAqL1xuICBhdXRvdW5zZWxlY3RpZnk6IGJvb2wsXG5cbiAgLyoqXG4gICAqIGBnZXQob2JqZWN0LCBrZXkpYFxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYG9iamVjdGAgYXQgdGhlIGBrZXlgLCB3aGljaCBtYXkgYmUgYW4gaW50ZWdlclxuICAgKiBpbiB0aGUgY2FzZSBvZiBsaXN0cy9hcnJheXMgb3Igc3RyaW5ncyBpbiB0aGUgY2FzZSBvZiBtYXBzL29iamVjdHMuXG4gICAqL1xuICBnZXQ6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGB0b0pzb24ob2JqZWN0KWBcbiAgICogR2V0IHRoZSBkZWVwIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYG9iamVjdGAgYXMgbm9uLXN0cmluZ2lmaWVkIEpTT04uXG4gICAqL1xuICB0b0pzb246IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGRpZmYob2JqZWN0QSwgb2JqZWN0QilcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHR3byBvYmplY3RzIGhhdmUgZXF1YWwgdmFsdWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWZcbiAgICogYW5kIHdoZXJlIEN5dG9zY2FwZSBuZWVkcyB0byBiZSBwYXRjaGVkLlxuICAgKi9cbiAgZGlmZjogZnVuYyxcblxuICAvKipcbiAgICogZm9yRWFjaChsaXN0LCBpdGVyYXRvcilcbiAgICogQ2FsbCBgaXRlcmF0b3JgIG9uIGVhY2ggZWxlbWVudCBpbiB0aGUgYGxpc3RgLCBpbiBvcmRlci5cbiAgICovXG4gIGZvckVhY2g6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGN5KGN5UmVmKVxuICAgKiBUaGUgYGN5YCBwcm9wIGFsbG93cyBmb3IgZ2V0dGluZyBhIHJlZmVyZW5jZSB0byB0aGUgYGN5YCBDeXRvc2NhcGUgb2JqZWN0LCBlLmcuOlxuICAgKlxuICAgKiBgPEN5dG9zY2FwZUNvbXBvbmVudCBjeT17Y3kgPT4gKG15Q3lSZWYgPSBjeSl9IC8+YFxuICAgKi9cbiAgY3k6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGhlYWRsZXNzXG4gICAqIFRoZSBgaGVhZGxlc3NgIHByb3BlciBhbGxvd3MgZm9yIHNldHRpbmcgd2hldGhlciB0aGUgQ3l0b3NjYXBlIGluc3RhbmNlIGlzIGhlYWRsZXNzLCBpLmUuXG4gICAqIG5vdCByZW5kZXJlZC4gIFRoaXMgdmFsdWUgY2FuIG5vdCBiZSBjaGFuZ2VkIGFmdGVyIGluaXRpYWxpc2F0aW9uIG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBoZWFkbGVzczogYm9vbCxcblxuICAvKipcbiAgICogc3R5bGVFbmFibGVkXG4gICAqIFRoZSBgc3R5bGVFbmFibGVkYCBmbGFnIGlzIHVzZWQgdG8gZW5hYmxlIHN0eWxlIGZ1bmN0aW9uYWxpdHkgaW4gYSBoZWFkbGVzcyBpbnN0YW5jZSAoaS5lLlxuICAgKiBgaGVhZGxlc3M6IHRydWUsIHN0eWxlRW5hYmxlZDogdHJ1ZWApLiAgRm9yIGEgcmVuZGVyZWQgaW5zdGFuY2UsIGRvIG5vdCBzZXQgdGhpcyB2YWx1ZS5cbiAgICovXG4gIHN0eWxlRW5hYmxlZDogYm9vbCxcblxuICAvKipcbiAgICogaGlkZUVkZ2VzT25WaWV3cG9ydFxuICAgKiBBIHJlbmRlcmluZyBoaW50IHRoYXQgc3BlY2lmaWVzLCBmb3IgcmVuZGVyZXJzIHdoaWNoIHN1cHBvcnQgdGhlIGhpbnQsIHdoZXRoZXIgZWRnZXMgc2hvdWxkXG4gICAqIGJlIGhpZGRlbiBkdXJpbmcgem9vbSBhbmQgcGFuIG9wZXJhdGlvbnMuXG4gICAqL1xuICBoaWRlRWRnZXNPblZpZXdwb3J0OiBib29sLFxuXG4gIC8qKlxuICAgKiB0ZXh0dXJlT25WaWV3cG9ydFxuICAgKiBBIHJlbmRlcmluZyBoaW50IHRoYXQgc3BlY2lmaWVzLCBmb3IgcmVuZGVyZXJzIHdoaWNoIHN1cHBvcnQgdGhlIGhpbnQsIHdoZXRoZXIgYSBwcmV2aWV3XG4gICAqIGJhc2VkIG9uIHRoZSBleGlzdGluZyBzY2VuZSBzaG91bGQgYmUgdXNlZCBpbiBwbGFjZSBvZiBidWlsZGluZyBhIG5ldyBzY2VuZS5cbiAgICovXG4gIHRleHR1cmVPblZpZXdwb3J0OiBib29sLFxuXG4gIC8qKlxuICAgKiBtb3Rpb25CbHVyXG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgd2hldGhlciBhIG1vdGlvbiBibHVyXG4gICAqIGVmZmVjdCBzaG91bGQgYmUgYXBwbGllZC5cbiAgICovXG4gIG1vdGlvbkJsdXI6IGJvb2wsXG5cbiAgLyoqXG4gICAqIG1vdGlvbkJsdXJPcGFjaXR5XG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgaG93IHN0cm9uZyB0aGUgbW90aW9uXG4gICAqIGJsdXIgZWZmZWN0IHNob3VsZCBiZS4gIFRoZSB2YWx1ZSByYW5nZXMgZnJvbSAwIHRvIDEsIHdpdGggbGFyZ2VyIHZhbHVlcyBpbmRpY2F0aW5nIGxhcmdlclxuICAgKiBzdHJlbmd0aC5cbiAgICovXG4gIG1vdGlvbkJsdXJPcGFjaXR5OiBudW1iZXIsXG5cbiAgLyoqXG4gICAqIHdoZWVsU2Vuc2l0aXZpdHlcbiAgICogQSByZW5kZXJpbmcgaGludCB0aGF0IHNwZWNpZmllcywgZm9yIHJlbmRlcmVycyB3aGljaCBzdXBwb3J0IHRoZSBoaW50LCBob3cgZmFzdCB3aGVlbCB6b29taW5nXG4gICAqIHNob3VsZCBiZS4gIFRoZSB2YWx1ZSBpcyBhIHBvc2l0aXZlIG11bHRpcGxpZXIuICBEbyBub3Qgc2V0IHRoaXMgdmFsdWUgdW5sZXNzIHlvdSBhcmUgdXNpbmdcbiAgICogdW5jb252ZW50aW9uYWwgaGFyZHdhcmUgYW5kIGNhbiBndWFyYW50ZWUgdGhhdCBhbGwgeW91ciB1c2VycyB3aWxsIHVzZSB0aGUgc2FtZSBoYXJkd2FyZS4gIFRoZVxuICAgKiBkZWZhdWx0IHZhbHVlIHdvcmtzIHdlbGwgZm9yIHN0YW5kYXJkIG1pY2Ugb24gY29tbW9uIG9wZXJhdGluZyBzeXN0ZW1zLiAgSWYgeW91IGNoYW5nZSB0aGlzXG4gICAqIHZhbHVlLCBpdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IHlvdSB3aWxsIGNyZWF0ZSBhIGJhZCB1c2VyIGV4cGVyaWVuY2UgZm9yIG1hbnkgb3IgbW9zdCBvZiB5b3VyXG4gICAqIHVzZXJzLlxuICAgKi9cbiAgd2hlZWxTZW5zaXRpdml0eTogbnVtYmVyLFxuXG4gIC8qKlxuICAgKiBwaXhlbFJhdGlvXG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgdGhlIHBpeGVsIHJhdGlvIHRoYXRcbiAgICogc2hvdWxkIGJlIHVzZWQuICBNYXkgYmUgJ2F1dG8nIG9yIGEgcG9zaXRpdmUgbnVtYmVyLlxuICAgKi9cbiAgcGl4ZWxSYXRpbzogb25lT2ZUeXBlKFtzdHJpbmcsIG9iamVjdF0pLFxufTtcbiIsImNvbnN0IGVpdGhlcklzTmlsID0gKGEsIGIpID0+IGEgPT0gbnVsbCB8fCBiID09IG51bGw7XG5cbmV4cG9ydCBjb25zdCBoYXNoRGlmZiA9IChhLCBiKSA9PiB7XG4gIHJldHVybiBlaXRoZXJJc05pbChhLCBiKSB8fCBhLmhhc2goKSAhPT0gYi5oYXNoKCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2hhbGxvd09iakRpZmYgPSAoYSwgYikgPT4ge1xuICBpZiAoZWl0aGVySXNOaWwoYSwgYikgJiYgIShhID09IG51bGwgJiYgYiA9PSBudWxsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGEgPT09IGIpIHtcbiAgICAvLyBjYW4ndCBkbyBhIGRpZmYgb24gdGhlIHNhbWUgb2JqXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gbm9uLW9iamVjdCB2YWx1ZXMgY2FuIGJlIGNvbXBhcmVkIHdpdGggdGhlIGVxdWFsaXR5IG9wZXJhdG9yXG4gIGlmICh0eXBlb2YgYSAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGEgIT09IGI7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICBjb25zdCBtaXNtYXRjaGVzID0gKGtleSkgPT4gYVtrZXldICE9PSBiW2tleV07XG5cbiAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYUtleXMuc29tZShtaXNtYXRjaGVzKSB8fCBiS2V5cy5zb21lKG1pc21hdGNoZXMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuIiwiZXhwb3J0IGNvbnN0IGdldCA9IChvYmosIGtleSkgPT4gKG9iaiAhPSBudWxsID8gb2JqW2tleV0gOiBudWxsKTtcblxuZXhwb3J0IGNvbnN0IHRvSnNvbiA9IChvYmopID0+IG9iajtcblxuZXhwb3J0IGNvbnN0IGZvckVhY2ggPSAoYXJyLCBpdGVyYXRvcikgPT4gYXJyLmZvckVhY2goaXRlcmF0b3IpO1xuIiwiaW1wb3J0IHsgc2hhbGxvd09iakRpZmYgfSBmcm9tICcuL2RpZmYnO1xuaW1wb3J0IHsgZ2V0LCB0b0pzb24sIGZvckVhY2ggfSBmcm9tICcuL2pzb24nO1xuXG5leHBvcnQgY29uc3QgaWRlbnRpdHkgPSAoeCkgPT4geDtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRzID0gW1xuICB7IGRhdGE6IHsgaWQ6ICdhJywgbGFiZWw6ICdFeGFtcGxlIG5vZGUgQScgfSB9LFxuICB7IGRhdGE6IHsgaWQ6ICdiJywgbGFiZWw6ICdFeGFtcGxlIG5vZGUgQicgfSB9LFxuICB7IGRhdGE6IHsgaWQ6ICdlJywgc291cmNlOiAnYScsIHRhcmdldDogJ2InIH0gfSxcbl07XG5cbmV4cG9ydCBjb25zdCBzdHlsZXNoZWV0ID0gW1xuICB7XG4gICAgc2VsZWN0b3I6ICdub2RlJyxcbiAgICBzdHlsZToge1xuICAgICAgbGFiZWw6ICdkYXRhKGxhYmVsKScsXG4gICAgfSxcbiAgfSxcbl07XG5cbmV4cG9ydCBjb25zdCB6b29tID0gMTtcblxuZXhwb3J0IGNvbnN0IHBhbiA9IHtcbiAgeDogMCxcbiAgeTogMCxcbn07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0cyA9IHtcbiAgZGlmZjogc2hhbGxvd09iakRpZmYsXG4gIGdldCxcbiAgdG9Kc29uLFxuICBmb3JFYWNoLFxuICBlbGVtZW50cyxcbiAgc3R5bGVzaGVldCxcbiAgem9vbSxcbiAgcGFuLFxufTtcbiIsImltcG9ydCB7IGdldCBhcyBhdEtleSB9IGZyb20gJy4vanNvbic7XG5pbXBvcnQgeyBzaGFsbG93T2JqRGlmZiB9IGZyb20gJy4vZGlmZic7XG5cbmNvbnN0IGlzRGlmZkF0S2V5ID0gKGpzb24xLCBqc29uMiwgZGlmZiwga2V5KSA9PlxuICBkaWZmKGF0S2V5KGpzb24xLCBrZXkpLCBhdEtleShqc29uMiwga2V5KSk7XG5cbmV4cG9ydCBjb25zdCBwYXRjaCA9IChjeSwganNvbjEsIGpzb24yLCBkaWZmLCB0b0pzb24sIGdldCwgZm9yRWFjaCkgPT4ge1xuICBjeS5iYXRjaCgoKSA9PiB7XG4gICAgLy8gVGhlIHNoYWxsb3cgb2JqZWN0IGRpZmYoKSBtdXN0IGRlZmVyIHRvIHBhdGNoRWxlbWVudHMoKSBhcyBpdCBtdXN0IGNvbXBhcmUgdGhlXG4gICAgLy8gZWxlbWVudHMgYXMgYW4gdW5vcmRlcmVkIHNldC4gIEEgY3VzdG9tIGRpZmYoKSwgd2l0aCBJbW11dGFibGUgZm9yIGV4YW1wbGUsXG4gICAgLy8gY291bGQganVzdCB1c2UgYW4gZXF1YWxpdHkgY2hlY2sgKD09PSkuXG4gICAgaWYgKFxuICAgICAgZGlmZiA9PT0gc2hhbGxvd09iakRpZmYgfHxcbiAgICAgIGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwgJ2VsZW1lbnRzJylcbiAgICApIHtcbiAgICAgIHBhdGNoRWxlbWVudHMoXG4gICAgICAgIGN5LFxuICAgICAgICBhdEtleShqc29uMSwgJ2VsZW1lbnRzJyksXG4gICAgICAgIGF0S2V5KGpzb24yLCAnZWxlbWVudHMnKSxcbiAgICAgICAgdG9Kc29uLFxuICAgICAgICBnZXQsXG4gICAgICAgIGZvckVhY2gsXG4gICAgICAgIGRpZmZcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwgJ3N0eWxlc2hlZXQnKSkge1xuICAgICAgcGF0Y2hTdHlsZShcbiAgICAgICAgY3ksXG4gICAgICAgIGF0S2V5KGpzb24xLCAnc3R5bGVzaGVldCcpLFxuICAgICAgICBhdEtleShqc29uMiwgJ3N0eWxlc2hlZXQnKSxcbiAgICAgICAgdG9Kc29uXG4gICAgICApO1xuICAgIH1cblxuICAgIFtcbiAgICAgIC8vIHNpbXBsZSBrZXlzIHRoYXQgY2FuIGJlIHBhdGNoZWQgZGlyZWN0bHkgKGtleSBzYW1lIGFzIGZuIG5hbWUpXG4gICAgICAnem9vbScsXG4gICAgICAnbWluWm9vbScsXG4gICAgICAnbWF4Wm9vbScsXG4gICAgICAnem9vbWluZ0VuYWJsZWQnLFxuICAgICAgJ3VzZXJab29taW5nRW5hYmxlZCcsXG4gICAgICAncGFuJyxcbiAgICAgICdwYW5uaW5nRW5hYmxlZCcsXG4gICAgICAndXNlclBhbm5pbmdFbmFibGVkJyxcbiAgICAgICdib3hTZWxlY3Rpb25FbmFibGVkJyxcbiAgICAgICdhdXRvdW5ncmFiaWZ5JyxcbiAgICAgICdhdXRvbG9jaycsXG4gICAgICAnYXV0b3Vuc2VsZWN0aWZ5JyxcbiAgICBdLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwga2V5KSkge1xuICAgICAgICBwYXRjaEpzb24oY3ksIGtleSwgYXRLZXkoanNvbjEsIGtleSksIGF0S2V5KGpzb24yLCBrZXkpLCB0b0pzb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBpZiAoaXNEaWZmQXRLZXkoanNvbjEsIGpzb24yLCBkaWZmLCAnbGF5b3V0JykpIHtcbiAgICBwYXRjaExheW91dChjeSwgYXRLZXkoanNvbjEsICdsYXlvdXQnKSwgYXRLZXkoanNvbjIsICdsYXlvdXQnKSwgdG9Kc29uKTtcbiAgfVxufTtcblxuY29uc3QgcGF0Y2hKc29uID0gKGN5LCBrZXksIHZhbDEsIHZhbDIsIHRvSnNvbikgPT4ge1xuICBjeVtrZXldKHRvSnNvbih2YWwyKSk7XG59O1xuXG5jb25zdCBwYXRjaExheW91dCA9IChjeSwgbGF5b3V0MSwgbGF5b3V0MiwgdG9Kc29uKSA9PiB7XG4gIGNvbnN0IGxheW91dE9wdHMgPSB0b0pzb24obGF5b3V0Mik7XG5cbiAgaWYgKGxheW91dE9wdHMgIT0gbnVsbCkge1xuICAgIGN5LmxheW91dChsYXlvdXRPcHRzKS5ydW4oKTtcbiAgfVxufTtcblxuY29uc3QgcGF0Y2hTdHlsZSA9IChjeSwgc3R5bGUxLCBzdHlsZTIsIHRvSnNvbikgPT4ge1xuICBjb25zdCBzdHlsZSA9IGN5LnN0eWxlKCk7XG5cbiAgaWYgKHN0eWxlID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdHlsZS5mcm9tSnNvbih0b0pzb24oc3R5bGUyKSkudXBkYXRlKCk7XG59O1xuXG5jb25zdCBwYXRjaEVsZW1lbnRzID0gKGN5LCBlbGVzMSwgZWxlczIsIHRvSnNvbiwgZ2V0LCBmb3JFYWNoLCBkaWZmKSA9PiB7XG4gIGNvbnN0IHRvQWRkID0gW107XG4gIGNvbnN0IHRvUm0gPSBjeS5jb2xsZWN0aW9uKCk7XG4gIGNvbnN0IHRvUGF0Y2ggPSBbXTtcbiAgY29uc3QgZWxlczFNYXAgPSB7fTtcbiAgY29uc3QgZWxlczJNYXAgPSB7fTtcbiAgY29uc3QgZWxlczFIYXNJZCA9IChpZCkgPT4gZWxlczFNYXBbaWRdICE9IG51bGw7XG4gIGNvbnN0IGVsZXMySGFzSWQgPSAoaWQpID0+IGVsZXMyTWFwW2lkXSAhPSBudWxsO1xuICBjb25zdCBnZXRFbGUxID0gKGlkKSA9PiBlbGVzMU1hcFtpZF07XG4gIGNvbnN0IGdldElkID0gKGVsZSkgPT4gZ2V0KGdldChlbGUsICdkYXRhJyksICdpZCcpO1xuXG4gIGZvckVhY2goZWxlczIsIChlbGUyKSA9PiB7XG4gICAgY29uc3QgaWQgPSBnZXRJZChlbGUyKTtcblxuICAgIGVsZXMyTWFwW2lkXSA9IGVsZTI7XG4gIH0pO1xuXG4gIGlmIChlbGVzMSAhPSBudWxsKSB7XG4gICAgZm9yRWFjaChlbGVzMSwgKGVsZTEpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0SWQoZWxlMSk7XG5cbiAgICAgIGVsZXMxTWFwW2lkXSA9IGVsZTE7XG5cbiAgICAgIGlmICghZWxlczJIYXNJZChpZCkpIHtcbiAgICAgICAgdG9SbS5tZXJnZShjeS5nZXRFbGVtZW50QnlJZChpZCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZm9yRWFjaChlbGVzMiwgKGVsZTIpID0+IHtcbiAgICBjb25zdCBpZCA9IGdldElkKGVsZTIpO1xuICAgIGNvbnN0IGVsZTEgPSBnZXRFbGUxKGlkKTtcblxuICAgIGlmIChlbGVzMUhhc0lkKGlkKSkge1xuICAgICAgdG9QYXRjaC5wdXNoKHsgZWxlMSwgZWxlMiB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9BZGQucHVzaCh0b0pzb24oZWxlMikpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHRvUm0ubGVuZ3RoID4gMCkge1xuICAgIGN5LnJlbW92ZSh0b1JtKTtcbiAgfVxuXG4gIGlmICh0b0FkZC5sZW5ndGggPiAwKSB7XG4gICAgY3kuYWRkKHRvQWRkKTtcbiAgfVxuXG4gIHRvUGF0Y2guZm9yRWFjaCgoeyBlbGUxLCBlbGUyIH0pID0+XG4gICAgcGF0Y2hFbGVtZW50KGN5LCBlbGUxLCBlbGUyLCB0b0pzb24sIGdldCwgZGlmZilcbiAgKTtcbn07XG5cbmNvbnN0IHBhdGNoRWxlbWVudCA9IChjeSwgZWxlMSwgZWxlMiwgdG9Kc29uLCBnZXQsIGRpZmYpID0+IHtcbiAgY29uc3QgaWQgPSBnZXQoZ2V0KGVsZTIsICdkYXRhJyksICdpZCcpO1xuICBjb25zdCBjeUVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgY29uc3QgcGF0Y2ggPSB7fTtcbiAgY29uc3QganNvbktleXMgPSBbXG4gICAgJ2RhdGEnLFxuICAgICdwb3NpdGlvbicsXG4gICAgJ3NlbGVjdGVkJyxcbiAgICAnc2VsZWN0YWJsZScsXG4gICAgJ2xvY2tlZCcsXG4gICAgJ2dyYWJiYWJsZScsXG4gICAgJ2NsYXNzZXMnLFxuICBdO1xuXG4gIGpzb25LZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IGRhdGEyID0gZ2V0KGVsZTIsIGtleSk7XG5cbiAgICBpZiAoZGlmZihkYXRhMiwgZ2V0KGVsZTEsIGtleSkpKSB7XG4gICAgICBwYXRjaFtrZXldID0gdG9Kc29uKGRhdGEyKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHNjcmF0Y2gyID0gZ2V0KGVsZTIsICdzY3JhdGNoJyk7XG4gIGlmIChkaWZmKHNjcmF0Y2gyLCBnZXQoZWxlMSwgJ3NjcmF0Y2gnKSkpIHtcbiAgICBjeUVsZS5zY3JhdGNoKHRvSnNvbihzY3JhdGNoMikpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHBhdGNoKS5sZW5ndGggPiAwKSB7XG4gICAgY3lFbGUuanNvbihwYXRjaCk7XG4gIH1cbn07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdHlwZXMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGRlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cyc7XG5pbXBvcnQgQ3l0b3NjYXBlIGZyb20gJ2N5dG9zY2FwZSc7XG5pbXBvcnQgeyBwYXRjaCB9IGZyb20gJy4vcGF0Y2gnO1xuXG4vKipcbiAqIFRoZSBgQ3l0b3NjYXBlQ29tcG9uZW50YCBpcyBhIFJlYWN0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBmb3IgdGhlIGRlY2xhcmF0aXZlIGNyZWF0aW9uXG4gKiBhbmQgbW9kaWZpY2F0aW9uIG9mIGEgQ3l0b3NjYXBlIGluc3RhbmNlLCBhIGdyYXBoIHZpc3VhbGlzYXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN5dG9zY2FwZUNvbXBvbmVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcFR5cGVzKCkge1xuICAgIHJldHVybiB0eXBlcztcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BzKCkge1xuICAgIHJldHVybiBkZWZhdWx0cztcbiAgfVxuXG4gIHN0YXRpYyBub3JtYWxpemVFbGVtZW50cyhlbGVtZW50cykge1xuICAgIGNvbnN0IGlzQXJyYXkgPSBlbGVtZW50cy5sZW5ndGggIT0gbnVsbDtcblxuICAgIGlmIChpc0FycmF5KSB7XG4gICAgICByZXR1cm4gZWxlbWVudHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB7IG5vZGVzLCBlZGdlcyB9ID0gZWxlbWVudHM7XG5cbiAgICAgIGlmIChub2RlcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVzID0gW107XG4gICAgICB9XG5cbiAgICAgIGlmIChlZGdlcyA9PSBudWxsKSB7XG4gICAgICAgIGVkZ2VzID0gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2Rlcy5jb25jYXQoZWRnZXMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuZGlzcGxheU5hbWUgPSAnQ3l0b3NjYXBlQ29tcG9uZW50JztcbiAgICB0aGlzLmNvbnRhaW5lclJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXJSZWYuY3VycmVudDtcblxuICAgIGNvbnN0IHtcbiAgICAgIGdsb2JhbCxcbiAgICAgIGhlYWRsZXNzLFxuICAgICAgc3R5bGVFbmFibGVkLFxuICAgICAgaGlkZUVkZ2VzT25WaWV3cG9ydCxcbiAgICAgIHRleHR1cmVPblZpZXdwb3J0LFxuICAgICAgbW90aW9uQmx1cixcbiAgICAgIG1vdGlvbkJsdXJPcGFjaXR5LFxuICAgICAgd2hlZWxTZW5zaXRpdml0eSxcbiAgICAgIHBpeGVsUmF0aW8sXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCBjeSA9ICh0aGlzLl9jeSA9IG5ldyBDeXRvc2NhcGUoe1xuICAgICAgY29udGFpbmVyLFxuICAgICAgaGVhZGxlc3MsXG4gICAgICBzdHlsZUVuYWJsZWQsXG4gICAgICBoaWRlRWRnZXNPblZpZXdwb3J0LFxuICAgICAgdGV4dHVyZU9uVmlld3BvcnQsXG4gICAgICBtb3Rpb25CbHVyLFxuICAgICAgbW90aW9uQmx1ck9wYWNpdHksXG4gICAgICB3aGVlbFNlbnNpdGl2aXR5LFxuICAgICAgcGl4ZWxSYXRpbyxcbiAgICB9KSk7XG5cbiAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICB3aW5kb3dbZ2xvYmFsXSA9IGN5O1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQ3l0b3NjYXBlKG51bGwsIHRoaXMucHJvcHMpO1xuICB9XG5cbiAgdXBkYXRlQ3l0b3NjYXBlKHByZXZQcm9wcywgbmV3UHJvcHMpIHtcbiAgICBjb25zdCBjeSA9IHRoaXMuX2N5O1xuICAgIGNvbnN0IHsgZGlmZiwgdG9Kc29uLCBnZXQsIGZvckVhY2ggfSA9IG5ld1Byb3BzO1xuXG4gICAgcGF0Y2goY3ksIHByZXZQcm9wcywgbmV3UHJvcHMsIGRpZmYsIHRvSnNvbiwgZ2V0LCBmb3JFYWNoKTtcblxuICAgIGlmIChuZXdQcm9wcy5jeSAhPSBudWxsKSB7XG4gICAgICBuZXdQcm9wcy5jeShjeSk7XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgIHRoaXMudXBkYXRlQ3l0b3NjYXBlKHByZXZQcm9wcywgdGhpcy5wcm9wcyk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLl9jeS5kZXN0cm95KCk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBpZCwgY2xhc3NOYW1lLCBzdHlsZSB9ID0gdGhpcy5wcm9wcztcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCdkaXYnLCB7XG4gICAgICByZWY6IHRoaXMuY29udGFpbmVyUmVmLFxuICAgICAgaWQsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBzdHlsZSxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBjb25zdCBSZWFjdFJlZHV4Q29udGV4dCA9IC8qI19fUFVSRV9fKi9jcmVhdGVDb250ZXh0KG51bGwpO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWFjdFJlZHV4Q29udGV4dC5kaXNwbGF5TmFtZSA9ICdSZWFjdFJlZHV4Jztcbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVhY3RSZWR1eENvbnRleHQ7IiwiaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4vQ29udGV4dCc7XG5pbXBvcnQgeyBjcmVhdGVTdWJzY3JpcHRpb24gfSBmcm9tICcuLi91dGlscy9TdWJzY3JpcHRpb24nO1xuaW1wb3J0IHsgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCB9IGZyb20gJy4uL3V0aWxzL3VzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QnO1xuXG5mdW5jdGlvbiBQcm92aWRlcih7XG4gIHN0b3JlLFxuICBjb250ZXh0LFxuICBjaGlsZHJlbixcbiAgc2VydmVyU3RhdGVcbn0pIHtcbiAgY29uc3QgY29udGV4dFZhbHVlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gY3JlYXRlU3Vic2NyaXB0aW9uKHN0b3JlKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RvcmUsXG4gICAgICBzdWJzY3JpcHRpb24sXG4gICAgICBnZXRTZXJ2ZXJTdGF0ZTogc2VydmVyU3RhdGUgPyAoKSA9PiBzZXJ2ZXJTdGF0ZSA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH0sIFtzdG9yZSwgc2VydmVyU3RhdGVdKTtcbiAgY29uc3QgcHJldmlvdXNTdGF0ZSA9IHVzZU1lbW8oKCkgPT4gc3RvcmUuZ2V0U3RhdGUoKSwgW3N0b3JlXSk7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHN1YnNjcmlwdGlvblxuICAgIH0gPSBjb250ZXh0VmFsdWU7XG4gICAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UgPSBzdWJzY3JpcHRpb24ubm90aWZ5TmVzdGVkU3VicztcbiAgICBzdWJzY3JpcHRpb24udHJ5U3Vic2NyaWJlKCk7XG5cbiAgICBpZiAocHJldmlvdXNTdGF0ZSAhPT0gc3RvcmUuZ2V0U3RhdGUoKSkge1xuICAgICAgc3Vic2NyaXB0aW9uLm5vdGlmeU5lc3RlZFN1YnMoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICB9LCBbY29udGV4dFZhbHVlLCBwcmV2aW91c1N0YXRlXSk7XG4gIGNvbnN0IENvbnRleHQgPSBjb250ZXh0IHx8IFJlYWN0UmVkdXhDb250ZXh0OyAvLyBAdHMtaWdub3JlICdBbnlBY3Rpb24nIGlzIGFzc2lnbmFibGUgdG8gdGhlIGNvbnN0cmFpbnQgb2YgdHlwZSAnQScsIGJ1dCAnQScgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkaWZmZXJlbnQgc3VidHlwZVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGNvbnRleHRWYWx1ZVxuICB9LCBjaGlsZHJlbik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFByb3ZpZGVyOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlXCI7XG5jb25zdCBfZXhjbHVkZWQgPSBbXCJyZWFjdFJlZHV4Rm9yd2FyZGVkUmVmXCJdO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYywgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG5pbXBvcnQgaG9pc3RTdGF0aWNzIGZyb20gJ2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzJztcbmltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0LCB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc1ZhbGlkRWxlbWVudFR5cGUsIGlzQ29udGV4dENvbnN1bWVyIH0gZnJvbSAncmVhY3QtaXMnO1xuaW1wb3J0IGRlZmF1bHRTZWxlY3RvckZhY3RvcnkgZnJvbSAnLi4vY29ubmVjdC9zZWxlY3RvckZhY3RvcnknO1xuaW1wb3J0IHsgbWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yeSB9IGZyb20gJy4uL2Nvbm5lY3QvbWFwRGlzcGF0Y2hUb1Byb3BzJztcbmltcG9ydCB7IG1hcFN0YXRlVG9Qcm9wc0ZhY3RvcnkgfSBmcm9tICcuLi9jb25uZWN0L21hcFN0YXRlVG9Qcm9wcyc7XG5pbXBvcnQgeyBtZXJnZVByb3BzRmFjdG9yeSB9IGZyb20gJy4uL2Nvbm5lY3QvbWVyZ2VQcm9wcyc7XG5pbXBvcnQgeyBjcmVhdGVTdWJzY3JpcHRpb24gfSBmcm9tICcuLi91dGlscy9TdWJzY3JpcHRpb24nO1xuaW1wb3J0IHsgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCB9IGZyb20gJy4uL3V0aWxzL3VzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QnO1xuaW1wb3J0IHNoYWxsb3dFcXVhbCBmcm9tICcuLi91dGlscy9zaGFsbG93RXF1YWwnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vdXRpbHMvd2FybmluZyc7XG5pbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4vQ29udGV4dCc7XG5pbXBvcnQgeyBub3RJbml0aWFsaXplZCB9IGZyb20gJy4uL3V0aWxzL3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbmxldCB1c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IG5vdEluaXRpYWxpemVkO1xuZXhwb3J0IGNvbnN0IGluaXRpYWxpemVDb25uZWN0ID0gZm4gPT4ge1xuICB1c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IGZuO1xufTsgLy8gRGVmaW5lIHNvbWUgY29uc3RhbnQgYXJyYXlzIGp1c3QgdG8gYXZvaWQgcmUtY3JlYXRpbmcgdGhlc2VcblxuY29uc3QgRU1QVFlfQVJSQVkgPSBbbnVsbCwgMF07XG5jb25zdCBOT19TVUJTQ1JJUFRJT05fQVJSQVkgPSBbbnVsbCwgbnVsbF07IC8vIEF0dGVtcHRzIHRvIHN0cmluZ2lmeSB3aGF0ZXZlciBub3QtcmVhbGx5LWEtY29tcG9uZW50IHZhbHVlIHdlIHdlcmUgZ2l2ZW5cbi8vIGZvciBsb2dnaW5nIGluIGFuIGVycm9yIG1lc3NhZ2VcblxuY29uc3Qgc3RyaW5naWZ5Q29tcG9uZW50ID0gQ29tcCA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KENvbXApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gU3RyaW5nKENvbXApO1xuICB9XG59O1xuXG4vLyBUaGlzIGlzIFwianVzdFwiIGEgYHVzZUxheW91dEVmZmVjdGAsIGJ1dCB3aXRoIHR3byBtb2RpZmljYXRpb25zOlxuLy8gLSB3ZSBuZWVkIHRvIGZhbGwgYmFjayB0byBgdXNlRWZmZWN0YCBpbiBTU1IgdG8gYXZvaWQgYW5ub3lpbmcgd2FybmluZ3Ncbi8vIC0gd2UgZXh0cmFjdCB0aGlzIHRvIGEgc2VwYXJhdGUgZnVuY3Rpb24gdG8gYXZvaWQgY2xvc2luZyBvdmVyIHZhbHVlc1xuLy8gICBhbmQgY2F1c2luZyBtZW1vcnkgbGVha3NcbmZ1bmN0aW9uIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3RXaXRoQXJncyhlZmZlY3RGdW5jLCBlZmZlY3RBcmdzLCBkZXBlbmRlbmNpZXMpIHtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiBlZmZlY3RGdW5jKC4uLmVmZmVjdEFyZ3MpLCBkZXBlbmRlbmNpZXMpO1xufSAvLyBFZmZlY3QgY2FsbGJhY2ssIGV4dHJhY3RlZDogYXNzaWduIHRoZSBsYXRlc3QgcHJvcHMgdmFsdWVzIHRvIHJlZnMgZm9yIGxhdGVyIHVzYWdlXG5cblxuZnVuY3Rpb24gY2FwdHVyZVdyYXBwZXJQcm9wcyhsYXN0V3JhcHBlclByb3BzLCBsYXN0Q2hpbGRQcm9wcywgcmVuZGVySXNTY2hlZHVsZWQsIHdyYXBwZXJQcm9wcywgLy8gYWN0dWFsQ2hpbGRQcm9wczogdW5rbm93bixcbmNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsIG5vdGlmeU5lc3RlZFN1YnMpIHtcbiAgLy8gV2Ugd2FudCB0byBjYXB0dXJlIHRoZSB3cmFwcGVyIHByb3BzIGFuZCBjaGlsZCBwcm9wcyB3ZSB1c2VkIGZvciBsYXRlciBjb21wYXJpc29uc1xuICBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnQgPSB3cmFwcGVyUHJvcHM7XG4gIHJlbmRlcklzU2NoZWR1bGVkLmN1cnJlbnQgPSBmYWxzZTsgLy8gSWYgdGhlIHJlbmRlciB3YXMgZnJvbSBhIHN0b3JlIHVwZGF0ZSwgY2xlYXIgb3V0IHRoYXQgcmVmZXJlbmNlIGFuZCBjYXNjYWRlIHRoZSBzdWJzY3JpYmVyIHVwZGF0ZVxuXG4gIGlmIChjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQpIHtcbiAgICBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQgPSBudWxsO1xuICAgIG5vdGlmeU5lc3RlZFN1YnMoKTtcbiAgfVxufSAvLyBFZmZlY3QgY2FsbGJhY2ssIGV4dHJhY3RlZDogc3Vic2NyaWJlIHRvIHRoZSBSZWR1eCBzdG9yZSBvciBuZWFyZXN0IGNvbm5lY3RlZCBhbmNlc3Rvcixcbi8vIGNoZWNrIGZvciB1cGRhdGVzIGFmdGVyIGRpc3BhdGNoZWQgYWN0aW9ucywgYW5kIHRyaWdnZXIgcmUtcmVuZGVycy5cblxuXG5mdW5jdGlvbiBzdWJzY3JpYmVVcGRhdGVzKHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcywgc3RvcmUsIHN1YnNjcmlwdGlvbiwgY2hpbGRQcm9wc1NlbGVjdG9yLCBsYXN0V3JhcHBlclByb3BzLCBsYXN0Q2hpbGRQcm9wcywgcmVuZGVySXNTY2hlZHVsZWQsIGlzTW91bnRlZCwgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSwgbm90aWZ5TmVzdGVkU3VicywgLy8gZm9yY2VDb21wb25lbnRVcGRhdGVEaXNwYXRjaDogUmVhY3QuRGlzcGF0Y2g8YW55PixcbmFkZGl0aW9uYWxTdWJzY3JpYmVMaXN0ZW5lcikge1xuICAvLyBJZiB3ZSdyZSBub3Qgc3Vic2NyaWJlZCB0byB0aGUgc3RvcmUsIG5vdGhpbmcgdG8gZG8gaGVyZVxuICBpZiAoIXNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcykgcmV0dXJuICgpID0+IHt9OyAvLyBDYXB0dXJlIHZhbHVlcyBmb3IgY2hlY2tpbmcgaWYgYW5kIHdoZW4gdGhpcyBjb21wb25lbnQgdW5tb3VudHNcblxuICBsZXQgZGlkVW5zdWJzY3JpYmUgPSBmYWxzZTtcbiAgbGV0IGxhc3RUaHJvd25FcnJvciA9IG51bGw7IC8vIFdlJ2xsIHJ1biB0aGlzIGNhbGxiYWNrIGV2ZXJ5IHRpbWUgYSBzdG9yZSBzdWJzY3JpcHRpb24gdXBkYXRlIHByb3BhZ2F0ZXMgdG8gdGhpcyBjb21wb25lbnRcblxuICBjb25zdCBjaGVja0ZvclVwZGF0ZXMgPSAoKSA9PiB7XG4gICAgaWYgKGRpZFVuc3Vic2NyaWJlIHx8ICFpc01vdW50ZWQuY3VycmVudCkge1xuICAgICAgLy8gRG9uJ3QgcnVuIHN0YWxlIGxpc3RlbmVycy5cbiAgICAgIC8vIFJlZHV4IGRvZXNuJ3QgZ3VhcmFudGVlIHVuc3Vic2NyaXB0aW9ucyBoYXBwZW4gdW50aWwgbmV4dCBkaXNwYXRjaC5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFRPRE8gV2UncmUgY3VycmVudGx5IGNhbGxpbmcgZ2V0U3RhdGUgb3Vyc2VsdmVzIGhlcmUsIHJhdGhlciB0aGFuIGxldHRpbmcgYHVTRVNgIGRvIGl0XG5cblxuICAgIGNvbnN0IGxhdGVzdFN0b3JlU3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGxldCBuZXdDaGlsZFByb3BzLCBlcnJvcjtcblxuICAgIHRyeSB7XG4gICAgICAvLyBBY3R1YWxseSBydW4gdGhlIHNlbGVjdG9yIHdpdGggdGhlIG1vc3QgcmVjZW50IHN0b3JlIHN0YXRlIGFuZCB3cmFwcGVyIHByb3BzXG4gICAgICAvLyB0byBkZXRlcm1pbmUgd2hhdCB0aGUgY2hpbGQgcHJvcHMgc2hvdWxkIGJlXG4gICAgICBuZXdDaGlsZFByb3BzID0gY2hpbGRQcm9wc1NlbGVjdG9yKGxhdGVzdFN0b3JlU3RhdGUsIGxhc3RXcmFwcGVyUHJvcHMuY3VycmVudCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3IgPSBlO1xuICAgICAgbGFzdFRocm93bkVycm9yID0gZTtcbiAgICB9XG5cbiAgICBpZiAoIWVycm9yKSB7XG4gICAgICBsYXN0VGhyb3duRXJyb3IgPSBudWxsO1xuICAgIH0gLy8gSWYgdGhlIGNoaWxkIHByb3BzIGhhdmVuJ3QgY2hhbmdlZCwgbm90aGluZyB0byBkbyBoZXJlIC0gY2FzY2FkZSB0aGUgc3Vic2NyaXB0aW9uIHVwZGF0ZVxuXG5cbiAgICBpZiAobmV3Q2hpbGRQcm9wcyA9PT0gbGFzdENoaWxkUHJvcHMuY3VycmVudCkge1xuICAgICAgaWYgKCFyZW5kZXJJc1NjaGVkdWxlZC5jdXJyZW50KSB7XG4gICAgICAgIG5vdGlmeU5lc3RlZFN1YnMoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2F2ZSByZWZlcmVuY2VzIHRvIHRoZSBuZXcgY2hpbGQgcHJvcHMuICBOb3RlIHRoYXQgd2UgdHJhY2sgdGhlIFwiY2hpbGQgcHJvcHMgZnJvbSBzdG9yZSB1cGRhdGVcIlxuICAgICAgLy8gYXMgYSByZWYgaW5zdGVhZCBvZiBhIHVzZVN0YXRlL3VzZVJlZHVjZXIgYmVjYXVzZSB3ZSBuZWVkIGEgd2F5IHRvIGRldGVybWluZSBpZiB0aGF0IHZhbHVlIGhhc1xuICAgICAgLy8gYmVlbiBwcm9jZXNzZWQuICBJZiB0aGlzIHdlbnQgaW50byB1c2VTdGF0ZS91c2VSZWR1Y2VyLCB3ZSBjb3VsZG4ndCBjbGVhciBvdXQgdGhlIHZhbHVlIHdpdGhvdXRcbiAgICAgIC8vIGZvcmNpbmcgYW5vdGhlciByZS1yZW5kZXIsIHdoaWNoIHdlIGRvbid0IHdhbnQuXG4gICAgICBsYXN0Q2hpbGRQcm9wcy5jdXJyZW50ID0gbmV3Q2hpbGRQcm9wcztcbiAgICAgIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCA9IG5ld0NoaWxkUHJvcHM7XG4gICAgICByZW5kZXJJc1NjaGVkdWxlZC5jdXJyZW50ID0gdHJ1ZTsgLy8gVE9ETyBUaGlzIGlzIGhhY2t5IGFuZCBub3QgaG93IGB1U0VTYCBpcyBtZWFudCB0byBiZSB1c2VkXG4gICAgICAvLyBUcmlnZ2VyIHRoZSBSZWFjdCBgdXNlU3luY0V4dGVybmFsU3RvcmVgIHN1YnNjcmliZXJcblxuICAgICAgYWRkaXRpb25hbFN1YnNjcmliZUxpc3RlbmVyKCk7XG4gICAgfVxuICB9OyAvLyBBY3R1YWxseSBzdWJzY3JpYmUgdG8gdGhlIG5lYXJlc3QgY29ubmVjdGVkIGFuY2VzdG9yIChvciBzdG9yZSlcblxuXG4gIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gY2hlY2tGb3JVcGRhdGVzO1xuICBzdWJzY3JpcHRpb24udHJ5U3Vic2NyaWJlKCk7IC8vIFB1bGwgZGF0YSBmcm9tIHRoZSBzdG9yZSBhZnRlciBmaXJzdCByZW5kZXIgaW4gY2FzZSB0aGUgc3RvcmUgaGFzXG4gIC8vIGNoYW5nZWQgc2luY2Ugd2UgYmVnYW4uXG5cbiAgY2hlY2tGb3JVcGRhdGVzKCk7XG5cbiAgY29uc3QgdW5zdWJzY3JpYmVXcmFwcGVyID0gKCkgPT4ge1xuICAgIGRpZFVuc3Vic2NyaWJlID0gdHJ1ZTtcbiAgICBzdWJzY3JpcHRpb24udHJ5VW5zdWJzY3JpYmUoKTtcbiAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IG51bGw7XG5cbiAgICBpZiAobGFzdFRocm93bkVycm9yKSB7XG4gICAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgd2UgY2F1Z2h0IGFuIGVycm9yIGR1ZSB0byBhIGJhZCBtYXBTdGF0ZSBmdW5jdGlvbiwgYnV0IHRoZVxuICAgICAgLy8gcGFyZW50IHJlLXJlbmRlcmVkIHdpdGhvdXQgdGhpcyBjb21wb25lbnQgYW5kIHdlJ3JlIGFib3V0IHRvIHVubW91bnQuXG4gICAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gYXMgbG9uZyBhcyB3ZSBkbyB0b3AtZG93biBzdWJzY3JpcHRpb25zIGNvcnJlY3RseSwgYnV0XG4gICAgICAvLyBpZiB3ZSBldmVyIGRvIHRob3NlIHdyb25nLCB0aGlzIHRocm93IHdpbGwgc3VyZmFjZSB0aGUgZXJyb3IgaW4gb3VyIHRlc3RzLlxuICAgICAgLy8gSW4gdGhhdCBjYXNlLCB0aHJvdyB0aGUgZXJyb3IgZnJvbSBoZXJlIHNvIGl0IGRvZXNuJ3QgZ2V0IGxvc3QuXG4gICAgICB0aHJvdyBsYXN0VGhyb3duRXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB1bnN1YnNjcmliZVdyYXBwZXI7XG59IC8vIFJlZHVjZXIgaW5pdGlhbCBzdGF0ZSBjcmVhdGlvbiBmb3Igb3VyIHVwZGF0ZSByZWR1Y2VyXG5cblxuY29uc3QgaW5pdFN0YXRlVXBkYXRlcyA9ICgpID0+IEVNUFRZX0FSUkFZO1xuXG5mdW5jdGlvbiBzdHJpY3RFcXVhbChhLCBiKSB7XG4gIHJldHVybiBhID09PSBiO1xufVxuLyoqXHJcbiAqIEluZmVycyB0aGUgdHlwZSBvZiBwcm9wcyB0aGF0IGEgY29ubmVjdG9yIHdpbGwgaW5qZWN0IGludG8gYSBjb21wb25lbnQuXHJcbiAqL1xuXG5cbmxldCBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRQdXJlT3B0aW9uID0gZmFsc2U7XG4vKipcclxuICogQ29ubmVjdHMgYSBSZWFjdCBjb21wb25lbnQgdG8gYSBSZWR1eCBzdG9yZS5cclxuICpcclxuICogLSBXaXRob3V0IGFyZ3VtZW50cywganVzdCB3cmFwcyB0aGUgY29tcG9uZW50LCB3aXRob3V0IGNoYW5naW5nIHRoZSBiZWhhdmlvciAvIHByb3BzXHJcbiAqXHJcbiAqIC0gSWYgMiBwYXJhbXMgYXJlIHBhc3NlZCAoM3JkIHBhcmFtLCBtZXJnZVByb3BzLCBpcyBza2lwcGVkKSwgZGVmYXVsdCBiZWhhdmlvclxyXG4gKiBpcyB0byBvdmVycmlkZSBvd25Qcm9wcyAoYXMgc3RhdGVkIGluIHRoZSBkb2NzKSwgc28gd2hhdCByZW1haW5zIGlzIGV2ZXJ5dGhpbmcgdGhhdCdzXHJcbiAqIG5vdCBhIHN0YXRlIG9yIGRpc3BhdGNoIHByb3BcclxuICpcclxuICogLSBXaGVuIDNyZCBwYXJhbSBpcyBwYXNzZWQsIHdlIGRvbid0IGtub3cgaWYgb3duUHJvcHMgcHJvcGFnYXRlIGFuZCB3aGV0aGVyIHRoZXlcclxuICogc2hvdWxkIGJlIHZhbGlkIGNvbXBvbmVudCBwcm9wcywgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIG1lcmdlUHJvcHMgaW1wbGVtZW50YXRpb24uXHJcbiAqIEFzIHN1Y2gsIGl0IGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZXh0ZW5kIG93blByb3BzIGludGVyZmFjZSBmcm9tIHN0YXRlIG9yXHJcbiAqIGRpc3BhdGNoIHByb3BzIG9yIGJvdGggd2hlbiBhcHBsaWNhYmxlXHJcbiAqXHJcbiAqIEBwYXJhbSBtYXBTdGF0ZVRvUHJvcHMgQSBmdW5jdGlvbiB0aGF0IGV4dHJhY3RzIHZhbHVlcyBmcm9tIHN0YXRlXHJcbiAqIEBwYXJhbSBtYXBEaXNwYXRjaFRvUHJvcHMgU2V0dXAgZm9yIGRpc3BhdGNoaW5nIGFjdGlvbnNcclxuICogQHBhcmFtIG1lcmdlUHJvcHMgT3B0aW9uYWwgY2FsbGJhY2sgdG8gbWVyZ2Ugc3RhdGUgYW5kIGRpc3BhdGNoIHByb3BzIHRvZ2V0aGVyXHJcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBjb25uZWN0aW9uXHJcbiAqXHJcbiAqL1xuXG5mdW5jdGlvbiBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCB7XG4gIC8vIFRoZSBgcHVyZWAgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQsIHNvIFRTIGRvZXNuJ3QgbGlrZSB1cyBkZXN0cnVjdHVyaW5nIHRoaXMgdG8gY2hlY2sgaXRzIGV4aXN0ZW5jZS5cbiAgLy8gQHRzLWlnbm9yZVxuICBwdXJlLFxuICBhcmVTdGF0ZXNFcXVhbCA9IHN0cmljdEVxdWFsLFxuICBhcmVPd25Qcm9wc0VxdWFsID0gc2hhbGxvd0VxdWFsLFxuICBhcmVTdGF0ZVByb3BzRXF1YWwgPSBzaGFsbG93RXF1YWwsXG4gIGFyZU1lcmdlZFByb3BzRXF1YWwgPSBzaGFsbG93RXF1YWwsXG4gIC8vIHVzZSBSZWFjdCdzIGZvcndhcmRSZWYgdG8gZXhwb3NlIGEgcmVmIG9mIHRoZSB3cmFwcGVkIGNvbXBvbmVudFxuICBmb3J3YXJkUmVmID0gZmFsc2UsXG4gIC8vIHRoZSBjb250ZXh0IGNvbnN1bWVyIHRvIHVzZVxuICBjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHRcbn0gPSB7fSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChwdXJlICE9PSB1bmRlZmluZWQgJiYgIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZFB1cmVPcHRpb24pIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZFB1cmVPcHRpb24gPSB0cnVlO1xuICAgICAgd2FybmluZygnVGhlIGBwdXJlYCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZC4gYGNvbm5lY3RgIGlzIG5vdyBhbHdheXMgYSBcInB1cmUvbWVtb2l6ZWRcIiBjb21wb25lbnQnKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBDb250ZXh0ID0gY29udGV4dDtcbiAgY29uc3QgaW5pdE1hcFN0YXRlVG9Qcm9wcyA9IG1hcFN0YXRlVG9Qcm9wc0ZhY3RvcnkobWFwU3RhdGVUb1Byb3BzKTtcbiAgY29uc3QgaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcnkobWFwRGlzcGF0Y2hUb1Byb3BzKTtcbiAgY29uc3QgaW5pdE1lcmdlUHJvcHMgPSBtZXJnZVByb3BzRmFjdG9yeShtZXJnZVByb3BzKTtcbiAgY29uc3Qgc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzID0gQm9vbGVhbihtYXBTdGF0ZVRvUHJvcHMpO1xuXG4gIGNvbnN0IHdyYXBXaXRoQ29ubmVjdCA9IFdyYXBwZWRDb21wb25lbnQgPT4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFpc1ZhbGlkRWxlbWVudFR5cGUoV3JhcHBlZENvbXBvbmVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgWW91IG11c3QgcGFzcyBhIGNvbXBvbmVudCB0byB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgY29ubmVjdC4gSW5zdGVhZCByZWNlaXZlZCAke3N0cmluZ2lmeUNvbXBvbmVudChXcmFwcGVkQ29tcG9uZW50KX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCB3cmFwcGVkQ29tcG9uZW50TmFtZSA9IFdyYXBwZWRDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgV3JhcHBlZENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xuICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gYENvbm5lY3QoJHt3cmFwcGVkQ29tcG9uZW50TmFtZX0pYDtcbiAgICBjb25zdCBzZWxlY3RvckZhY3RvcnlPcHRpb25zID0ge1xuICAgICAgc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzLFxuICAgICAgZGlzcGxheU5hbWUsXG4gICAgICB3cmFwcGVkQ29tcG9uZW50TmFtZSxcbiAgICAgIFdyYXBwZWRDb21wb25lbnQsXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBpbml0TWFwU3RhdGVUb1Byb3BzLFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyxcbiAgICAgIGluaXRNZXJnZVByb3BzLFxuICAgICAgYXJlU3RhdGVzRXF1YWwsXG4gICAgICBhcmVTdGF0ZVByb3BzRXF1YWwsXG4gICAgICBhcmVPd25Qcm9wc0VxdWFsLFxuICAgICAgYXJlTWVyZ2VkUHJvcHNFcXVhbFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBDb25uZWN0RnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgIGNvbnN0IFtwcm9wc0NvbnRleHQsIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWYsIHdyYXBwZXJQcm9wc10gPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgLy8gRGlzdGluZ3Vpc2ggYmV0d2VlbiBhY3R1YWwgXCJkYXRhXCIgcHJvcHMgdGhhdCB3ZXJlIHBhc3NlZCB0byB0aGUgd3JhcHBlciBjb21wb25lbnQsXG4gICAgICAgIC8vIGFuZCB2YWx1ZXMgbmVlZGVkIHRvIGNvbnRyb2wgYmVoYXZpb3IgKGZvcndhcmRlZCByZWZzLCBhbHRlcm5hdGUgY29udGV4dCBpbnN0YW5jZXMpLlxuICAgICAgICAvLyBUbyBtYWludGFpbiB0aGUgd3JhcHBlclByb3BzIG9iamVjdCByZWZlcmVuY2UsIG1lbW9pemUgdGhpcyBkZXN0cnVjdHVyaW5nLlxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgcmVhY3RSZWR1eEZvcndhcmRlZFJlZlxuICAgICAgICB9ID0gcHJvcHMsXG4gICAgICAgICAgICAgIHdyYXBwZXJQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHByb3BzLCBfZXhjbHVkZWQpO1xuXG4gICAgICAgIHJldHVybiBbcHJvcHMuY29udGV4dCwgcmVhY3RSZWR1eEZvcndhcmRlZFJlZiwgd3JhcHBlclByb3BzXTtcbiAgICAgIH0sIFtwcm9wc10pO1xuICAgICAgY29uc3QgQ29udGV4dFRvVXNlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIC8vIFVzZXJzIG1heSBvcHRpb25hbGx5IHBhc3MgaW4gYSBjdXN0b20gY29udGV4dCBpbnN0YW5jZSB0byB1c2UgaW5zdGVhZCBvZiBvdXIgUmVhY3RSZWR1eENvbnRleHQuXG4gICAgICAgIC8vIE1lbW9pemUgdGhlIGNoZWNrIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBjb250ZXh0IGluc3RhbmNlIHdlIHNob3VsZCB1c2UuXG4gICAgICAgIHJldHVybiBwcm9wc0NvbnRleHQgJiYgcHJvcHNDb250ZXh0LkNvbnN1bWVyICYmIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaXNDb250ZXh0Q29uc3VtZXIoIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KHByb3BzQ29udGV4dC5Db25zdW1lciwgbnVsbCkpID8gcHJvcHNDb250ZXh0IDogQ29udGV4dDtcbiAgICAgIH0sIFtwcm9wc0NvbnRleHQsIENvbnRleHRdKTsgLy8gUmV0cmlldmUgdGhlIHN0b3JlIGFuZCBhbmNlc3RvciBzdWJzY3JpcHRpb24gdmlhIGNvbnRleHQsIGlmIGF2YWlsYWJsZVxuXG4gICAgICBjb25zdCBjb250ZXh0VmFsdWUgPSB1c2VDb250ZXh0KENvbnRleHRUb1VzZSk7IC8vIFRoZSBzdG9yZSBfbXVzdF8gZXhpc3QgYXMgZWl0aGVyIGEgcHJvcCBvciBpbiBjb250ZXh0LlxuICAgICAgLy8gV2UnbGwgY2hlY2sgdG8gc2VlIGlmIGl0IF9sb29rc18gbGlrZSBhIFJlZHV4IHN0b3JlIGZpcnN0LlxuICAgICAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gcGFzcyB0aHJvdWdoIGEgYHN0b3JlYCBwcm9wIHRoYXQgaXMganVzdCBhIHBsYWluIHZhbHVlLlxuXG4gICAgICBjb25zdCBkaWRTdG9yZUNvbWVGcm9tUHJvcHMgPSBCb29sZWFuKHByb3BzLnN0b3JlKSAmJiBCb29sZWFuKHByb3BzLnN0b3JlLmdldFN0YXRlKSAmJiBCb29sZWFuKHByb3BzLnN0b3JlLmRpc3BhdGNoKTtcbiAgICAgIGNvbnN0IGRpZFN0b3JlQ29tZUZyb21Db250ZXh0ID0gQm9vbGVhbihjb250ZXh0VmFsdWUpICYmIEJvb2xlYW4oY29udGV4dFZhbHVlLnN0b3JlKTtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgIWRpZFN0b3JlQ29tZUZyb21Qcm9wcyAmJiAhZGlkU3RvcmVDb21lRnJvbUNvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBcInN0b3JlXCIgaW4gdGhlIGNvbnRleHQgb2YgYCArIGBcIiR7ZGlzcGxheU5hbWV9XCIuIEVpdGhlciB3cmFwIHRoZSByb290IGNvbXBvbmVudCBpbiBhIDxQcm92aWRlcj4sIGAgKyBgb3IgcGFzcyBhIGN1c3RvbSBSZWFjdCBjb250ZXh0IHByb3ZpZGVyIHRvIDxQcm92aWRlcj4gYW5kIHRoZSBjb3JyZXNwb25kaW5nIGAgKyBgUmVhY3QgY29udGV4dCBjb25zdW1lciB0byAke2Rpc3BsYXlOYW1lfSBpbiBjb25uZWN0IG9wdGlvbnMuYCk7XG4gICAgICB9IC8vIEJhc2VkIG9uIHRoZSBwcmV2aW91cyBjaGVjaywgb25lIG9mIHRoZXNlIG11c3QgYmUgdHJ1ZVxuXG5cbiAgICAgIGNvbnN0IHN0b3JlID0gZGlkU3RvcmVDb21lRnJvbVByb3BzID8gcHJvcHMuc3RvcmUgOiBjb250ZXh0VmFsdWUuc3RvcmU7XG4gICAgICBjb25zdCBnZXRTZXJ2ZXJTdGF0ZSA9IGRpZFN0b3JlQ29tZUZyb21Db250ZXh0ID8gY29udGV4dFZhbHVlLmdldFNlcnZlclN0YXRlIDogc3RvcmUuZ2V0U3RhdGU7XG4gICAgICBjb25zdCBjaGlsZFByb3BzU2VsZWN0b3IgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgLy8gVGhlIGNoaWxkIHByb3BzIHNlbGVjdG9yIG5lZWRzIHRoZSBzdG9yZSByZWZlcmVuY2UgYXMgYW4gaW5wdXQuXG4gICAgICAgIC8vIFJlLWNyZWF0ZSB0aGlzIHNlbGVjdG9yIHdoZW5ldmVyIHRoZSBzdG9yZSBjaGFuZ2VzLlxuICAgICAgICByZXR1cm4gZGVmYXVsdFNlbGVjdG9yRmFjdG9yeShzdG9yZS5kaXNwYXRjaCwgc2VsZWN0b3JGYWN0b3J5T3B0aW9ucyk7XG4gICAgICB9LCBbc3RvcmVdKTtcbiAgICAgIGNvbnN0IFtzdWJzY3JpcHRpb24sIG5vdGlmeU5lc3RlZFN1YnNdID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGlmICghc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzKSByZXR1cm4gTk9fU1VCU0NSSVBUSU9OX0FSUkFZOyAvLyBUaGlzIFN1YnNjcmlwdGlvbidzIHNvdXJjZSBzaG91bGQgbWF0Y2ggd2hlcmUgc3RvcmUgY2FtZSBmcm9tOiBwcm9wcyB2cy4gY29udGV4dC4gQSBjb21wb25lbnRcbiAgICAgICAgLy8gY29ubmVjdGVkIHRvIHRoZSBzdG9yZSB2aWEgcHJvcHMgc2hvdWxkbid0IHVzZSBzdWJzY3JpcHRpb24gZnJvbSBjb250ZXh0LCBvciB2aWNlIHZlcnNhLlxuXG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGNyZWF0ZVN1YnNjcmlwdGlvbihzdG9yZSwgZGlkU3RvcmVDb21lRnJvbVByb3BzID8gdW5kZWZpbmVkIDogY29udGV4dFZhbHVlLnN1YnNjcmlwdGlvbik7IC8vIGBub3RpZnlOZXN0ZWRTdWJzYCBpcyBkdXBsaWNhdGVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgY29tcG9uZW50IGlzIHVubW91bnRlZCBpblxuICAgICAgICAvLyB0aGUgbWlkZGxlIG9mIHRoZSBub3RpZmljYXRpb24gbG9vcCwgd2hlcmUgYHN1YnNjcmlwdGlvbmAgd2lsbCB0aGVuIGJlIG51bGwuIFRoaXMgY2FuXG4gICAgICAgIC8vIHByb2JhYmx5IGJlIGF2b2lkZWQgaWYgU3Vic2NyaXB0aW9uJ3MgbGlzdGVuZXJzIGxvZ2ljIGlzIGNoYW5nZWQgdG8gbm90IGNhbGwgbGlzdGVuZXJzXG4gICAgICAgIC8vIHRoYXQgaGF2ZSBiZWVuIHVuc3Vic2NyaWJlZCBpbiB0aGUgIG1pZGRsZSBvZiB0aGUgbm90aWZpY2F0aW9uIGxvb3AuXG5cbiAgICAgICAgY29uc3Qgbm90aWZ5TmVzdGVkU3VicyA9IHN1YnNjcmlwdGlvbi5ub3RpZnlOZXN0ZWRTdWJzLmJpbmQoc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgcmV0dXJuIFtzdWJzY3JpcHRpb24sIG5vdGlmeU5lc3RlZFN1YnNdO1xuICAgICAgfSwgW3N0b3JlLCBkaWRTdG9yZUNvbWVGcm9tUHJvcHMsIGNvbnRleHRWYWx1ZV0pOyAvLyBEZXRlcm1pbmUgd2hhdCB7c3RvcmUsIHN1YnNjcmlwdGlvbn0gdmFsdWUgc2hvdWxkIGJlIHB1dCBpbnRvIG5lc3RlZCBjb250ZXh0LCBpZiBuZWNlc3NhcnksXG4gICAgICAvLyBhbmQgbWVtb2l6ZSB0aGF0IHZhbHVlIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGNvbnRleHQgdXBkYXRlcy5cblxuICAgICAgY29uc3Qgb3ZlcnJpZGRlbkNvbnRleHRWYWx1ZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBpZiAoZGlkU3RvcmVDb21lRnJvbVByb3BzKSB7XG4gICAgICAgICAgLy8gVGhpcyBjb21wb25lbnQgaXMgZGlyZWN0bHkgc3Vic2NyaWJlZCB0byBhIHN0b3JlIGZyb20gcHJvcHMuXG4gICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCBkZXNjZW5kYW50cyByZWFkaW5nIGZyb20gdGhpcyBzdG9yZSAtIHBhc3MgZG93biB3aGF0ZXZlclxuICAgICAgICAgIC8vIHRoZSBleGlzdGluZyBjb250ZXh0IHZhbHVlIGlzIGZyb20gdGhlIG5lYXJlc3QgY29ubmVjdGVkIGFuY2VzdG9yLlxuICAgICAgICAgIHJldHVybiBjb250ZXh0VmFsdWU7XG4gICAgICAgIH0gLy8gT3RoZXJ3aXNlLCBwdXQgdGhpcyBjb21wb25lbnQncyBzdWJzY3JpcHRpb24gaW5zdGFuY2UgaW50byBjb250ZXh0LCBzbyB0aGF0XG4gICAgICAgIC8vIGNvbm5lY3RlZCBkZXNjZW5kYW50cyB3b24ndCB1cGRhdGUgdW50aWwgYWZ0ZXIgdGhpcyBjb21wb25lbnQgaXMgZG9uZVxuXG5cbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBjb250ZXh0VmFsdWUsIHtcbiAgICAgICAgICBzdWJzY3JpcHRpb25cbiAgICAgICAgfSk7XG4gICAgICB9LCBbZGlkU3RvcmVDb21lRnJvbVByb3BzLCBjb250ZXh0VmFsdWUsIHN1YnNjcmlwdGlvbl0pOyAvLyBTZXQgdXAgcmVmcyB0byBjb29yZGluYXRlIHZhbHVlcyBiZXR3ZWVuIHRoZSBzdWJzY3JpcHRpb24gZWZmZWN0IGFuZCB0aGUgcmVuZGVyIGxvZ2ljXG5cbiAgICAgIGNvbnN0IGxhc3RDaGlsZFByb3BzID0gdXNlUmVmKCk7XG4gICAgICBjb25zdCBsYXN0V3JhcHBlclByb3BzID0gdXNlUmVmKHdyYXBwZXJQcm9wcyk7XG4gICAgICBjb25zdCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlID0gdXNlUmVmKCk7XG4gICAgICBjb25zdCByZW5kZXJJc1NjaGVkdWxlZCA9IHVzZVJlZihmYWxzZSk7XG4gICAgICBjb25zdCBpc1Byb2Nlc3NpbmdEaXNwYXRjaCA9IHVzZVJlZihmYWxzZSk7XG4gICAgICBjb25zdCBpc01vdW50ZWQgPSB1c2VSZWYoZmFsc2UpO1xuICAgICAgY29uc3QgbGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvciA9IHVzZVJlZigpO1xuICAgICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlzTW91bnRlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBpc01vdW50ZWQuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgfSwgW10pO1xuICAgICAgY29uc3QgYWN0dWFsQ2hpbGRQcm9wc1NlbGVjdG9yID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gKCkgPT4ge1xuICAgICAgICAgIC8vIFRyaWNreSBsb2dpYyBoZXJlOlxuICAgICAgICAgIC8vIC0gVGhpcyByZW5kZXIgbWF5IGhhdmUgYmVlbiB0cmlnZ2VyZWQgYnkgYSBSZWR1eCBzdG9yZSB1cGRhdGUgdGhhdCBwcm9kdWNlZCBuZXcgY2hpbGQgcHJvcHNcbiAgICAgICAgICAvLyAtIEhvd2V2ZXIsIHdlIG1heSBoYXZlIGdvdHRlbiBuZXcgd3JhcHBlciBwcm9wcyBhZnRlciB0aGF0XG4gICAgICAgICAgLy8gSWYgd2UgaGF2ZSBuZXcgY2hpbGQgcHJvcHMsIGFuZCB0aGUgc2FtZSB3cmFwcGVyIHByb3BzLCB3ZSBrbm93IHdlIHNob3VsZCB1c2UgdGhlIG5ldyBjaGlsZCBwcm9wcyBhcy1pcy5cbiAgICAgICAgICAvLyBCdXQsIGlmIHdlIGhhdmUgbmV3IHdyYXBwZXIgcHJvcHMsIHRob3NlIG1pZ2h0IGNoYW5nZSB0aGUgY2hpbGQgcHJvcHMsIHNvIHdlIGhhdmUgdG8gcmVjYWxjdWxhdGUgdGhpbmdzLlxuICAgICAgICAgIC8vIFNvLCB3ZSdsbCB1c2UgdGhlIGNoaWxkIHByb3BzIGZyb20gc3RvcmUgdXBkYXRlIG9ubHkgaWYgdGhlIHdyYXBwZXIgcHJvcHMgYXJlIHRoZSBzYW1lIGFzIGxhc3QgdGltZS5cbiAgICAgICAgICBpZiAoY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50ICYmIHdyYXBwZXJQcm9wcyA9PT0gbGFzdFdyYXBwZXJQcm9wcy5jdXJyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50O1xuICAgICAgICAgIH0gLy8gVE9ETyBXZSdyZSByZWFkaW5nIHRoZSBzdG9yZSBkaXJlY3RseSBpbiByZW5kZXIoKSBoZXJlLiBCYWQgaWRlYT9cbiAgICAgICAgICAvLyBUaGlzIHdpbGwgbGlrZWx5IGNhdXNlIEJhZCBUaGluZ3MgKFRNKSB0byBoYXBwZW4gaW4gQ29uY3VycmVudCBNb2RlLlxuICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyB0aGlzIGJlY2F1c2Ugb24gcmVuZGVycyBfbm90XyBjYXVzZWQgYnkgc3RvcmUgdXBkYXRlcywgd2UgbmVlZCB0aGUgbGF0ZXN0IHN0b3JlIHN0YXRlXG4gICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIGNoaWxkIHByb3BzIHNob3VsZCBiZS5cblxuXG4gICAgICAgICAgcmV0dXJuIGNoaWxkUHJvcHNTZWxlY3RvcihzdG9yZS5nZXRTdGF0ZSgpLCB3cmFwcGVyUHJvcHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBzZWxlY3RvcjtcbiAgICAgIH0sIFtzdG9yZSwgd3JhcHBlclByb3BzXSk7IC8vIFdlIG5lZWQgdGhpcyB0byBleGVjdXRlIHN5bmNocm9ub3VzbHkgZXZlcnkgdGltZSB3ZSByZS1yZW5kZXIuIEhvd2V2ZXIsIFJlYWN0IHdhcm5zXG4gICAgICAvLyBhYm91dCB1c2VMYXlvdXRFZmZlY3QgaW4gU1NSLCBzbyB3ZSB0cnkgdG8gZGV0ZWN0IGVudmlyb25tZW50IGFuZCBmYWxsIGJhY2sgdG9cbiAgICAgIC8vIGp1c3QgdXNlRWZmZWN0IGluc3RlYWQgdG8gYXZvaWQgdGhlIHdhcm5pbmcsIHNpbmNlIG5laXRoZXIgd2lsbCBydW4gYW55d2F5LlxuXG4gICAgICBjb25zdCBzdWJzY3JpYmVGb3JSZWFjdCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBjb25zdCBzdWJzY3JpYmUgPSByZWFjdExpc3RlbmVyID0+IHtcbiAgICAgICAgICBpZiAoIXN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzdWJzY3JpYmVVcGRhdGVzKHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcywgc3RvcmUsIHN1YnNjcmlwdGlvbiwgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGNoaWxkUHJvcHNTZWxlY3RvciwgbGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCBpc01vdW50ZWQsIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsIG5vdGlmeU5lc3RlZFN1YnMsIHJlYWN0TGlzdGVuZXIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBzdWJzY3JpYmU7XG4gICAgICB9LCBbc3Vic2NyaXB0aW9uXSk7XG4gICAgICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0V2l0aEFyZ3MoY2FwdHVyZVdyYXBwZXJQcm9wcywgW2xhc3RXcmFwcGVyUHJvcHMsIGxhc3RDaGlsZFByb3BzLCByZW5kZXJJc1NjaGVkdWxlZCwgd3JhcHBlclByb3BzLCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzXSk7XG4gICAgICBsZXQgYWN0dWFsQ2hpbGRQcm9wcztcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYWN0dWFsQ2hpbGRQcm9wcyA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlKCAvLyBUT0RPIFdlJ3JlIHBhc3NpbmcgdGhyb3VnaCBhIGJpZyB3cmFwcGVyIHRoYXQgZG9lcyBhIGJ1bmNoIG9mIGV4dHJhIHNpZGUgZWZmZWN0cyBiZXNpZGVzIHN1YnNjcmliaW5nXG4gICAgICAgIHN1YnNjcmliZUZvclJlYWN0LCAvLyBUT0RPIFRoaXMgaXMgaW5jcmVkaWJseSBoYWNreS4gV2UndmUgYWxyZWFkeSBwcm9jZXNzZWQgdGhlIHN0b3JlIHVwZGF0ZSBhbmQgY2FsY3VsYXRlZCBuZXcgY2hpbGQgcHJvcHMsXG4gICAgICAgIC8vIFRPRE8gYW5kIHdlJ3JlIGp1c3QgcGFzc2luZyB0aGF0IHRocm91Z2ggc28gaXQgdHJpZ2dlcnMgYSByZS1yZW5kZXIgZm9yIHVzIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gYHVTRVNgLlxuICAgICAgICBhY3R1YWxDaGlsZFByb3BzU2VsZWN0b3IsIGdldFNlcnZlclN0YXRlID8gKCkgPT4gY2hpbGRQcm9wc1NlbGVjdG9yKGdldFNlcnZlclN0YXRlKCksIHdyYXBwZXJQcm9wcykgOiBhY3R1YWxDaGlsZFByb3BzU2VsZWN0b3IpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQpIHtcbiAgICAgICAgICA7XG4gICAgICAgICAgZXJyLm1lc3NhZ2UgKz0gYFxcblRoZSBlcnJvciBtYXkgYmUgY29ycmVsYXRlZCB3aXRoIHRoaXMgcHJldmlvdXMgZXJyb3I6XFxuJHtsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQuc3RhY2t9XFxuXFxuYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cblxuICAgICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGxhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICBsYXN0Q2hpbGRQcm9wcy5jdXJyZW50ID0gYWN0dWFsQ2hpbGRQcm9wcztcbiAgICAgIH0pOyAvLyBOb3cgdGhhdCBhbGwgdGhhdCdzIGRvbmUsIHdlIGNhbiBmaW5hbGx5IHRyeSB0byBhY3R1YWxseSByZW5kZXIgdGhlIGNoaWxkIGNvbXBvbmVudC5cbiAgICAgIC8vIFdlIG1lbW9pemUgdGhlIGVsZW1lbnRzIGZvciB0aGUgcmVuZGVyZWQgY2hpbGQgY29tcG9uZW50IGFzIGFuIG9wdGltaXphdGlvbi5cblxuICAgICAgY29uc3QgcmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgLyojX19QVVJFX18qL1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIF9leHRlbmRzKHt9LCBhY3R1YWxDaGlsZFByb3BzLCB7XG4gICAgICAgICAgICByZWY6IHJlYWN0UmVkdXhGb3J3YXJkZWRSZWZcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcbiAgICAgIH0sIFtyZWFjdFJlZHV4Rm9yd2FyZGVkUmVmLCBXcmFwcGVkQ29tcG9uZW50LCBhY3R1YWxDaGlsZFByb3BzXSk7IC8vIElmIFJlYWN0IHNlZXMgdGhlIGV4YWN0IHNhbWUgZWxlbWVudCByZWZlcmVuY2UgYXMgbGFzdCB0aW1lLCBpdCBiYWlscyBvdXQgb2YgcmUtcmVuZGVyaW5nXG4gICAgICAvLyB0aGF0IGNoaWxkLCBzYW1lIGFzIGlmIGl0IHdhcyB3cmFwcGVkIGluIFJlYWN0Lm1lbW8oKSBvciByZXR1cm5lZCBmYWxzZSBmcm9tIHNob3VsZENvbXBvbmVudFVwZGF0ZS5cblxuICAgICAgY29uc3QgcmVuZGVyZWRDaGlsZCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBpZiAoc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBjb21wb25lbnQgaXMgc3Vic2NyaWJlZCB0byBzdG9yZSB1cGRhdGVzLCB3ZSBuZWVkIHRvIHBhc3MgaXRzIG93blxuICAgICAgICAgIC8vIHN1YnNjcmlwdGlvbiBpbnN0YW5jZSBkb3duIHRvIG91ciBkZXNjZW5kYW50cy4gVGhhdCBtZWFucyByZW5kZXJpbmcgdGhlIHNhbWVcbiAgICAgICAgICAvLyBDb250ZXh0IGluc3RhbmNlLCBhbmQgcHV0dGluZyBhIGRpZmZlcmVudCB2YWx1ZSBpbnRvIHRoZSBjb250ZXh0LlxuICAgICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb250ZXh0VG9Vc2UuUHJvdmlkZXIsIHtcbiAgICAgICAgICAgIHZhbHVlOiBvdmVycmlkZGVuQ29udGV4dFZhbHVlXG4gICAgICAgICAgfSwgcmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZW5kZXJlZFdyYXBwZWRDb21wb25lbnQ7XG4gICAgICB9LCBbQ29udGV4dFRvVXNlLCByZW5kZXJlZFdyYXBwZWRDb21wb25lbnQsIG92ZXJyaWRkZW5Db250ZXh0VmFsdWVdKTtcbiAgICAgIHJldHVybiByZW5kZXJlZENoaWxkO1xuICAgIH1cblxuICAgIGNvbnN0IF9Db25uZWN0ID0gUmVhY3QubWVtbyhDb25uZWN0RnVuY3Rpb24pO1xuXG4gICAgLy8gQWRkIGEgaGFja3kgY2FzdCB0byBnZXQgdGhlIHJpZ2h0IG91dHB1dCB0eXBlXG4gICAgY29uc3QgQ29ubmVjdCA9IF9Db25uZWN0O1xuICAgIENvbm5lY3QuV3JhcHBlZENvbXBvbmVudCA9IFdyYXBwZWRDb21wb25lbnQ7XG4gICAgQ29ubmVjdC5kaXNwbGF5TmFtZSA9IENvbm5lY3RGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuXG4gICAgaWYgKGZvcndhcmRSZWYpIHtcbiAgICAgIGNvbnN0IF9mb3J3YXJkZWQgPSBSZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIGZvcndhcmRDb25uZWN0UmVmKHByb3BzLCByZWYpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29ubmVjdCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICAgICAgcmVhY3RSZWR1eEZvcndhcmRlZFJlZjogcmVmXG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBmb3J3YXJkZWQgPSBfZm9yd2FyZGVkO1xuICAgICAgZm9yd2FyZGVkLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG4gICAgICBmb3J3YXJkZWQuV3JhcHBlZENvbXBvbmVudCA9IFdyYXBwZWRDb21wb25lbnQ7XG4gICAgICByZXR1cm4gaG9pc3RTdGF0aWNzKGZvcndhcmRlZCwgV3JhcHBlZENvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhvaXN0U3RhdGljcyhDb25uZWN0LCBXcmFwcGVkQ29tcG9uZW50KTtcbiAgfTtcblxuICByZXR1cm4gd3JhcFdpdGhDb25uZWN0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0OyIsImV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeShhcmcsIG5hbWUpIHtcbiAgcmV0dXJuIChkaXNwYXRjaCwgb3B0aW9ucykgPT4ge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2YWx1ZSBvZiB0eXBlICR7dHlwZW9mIGFyZ30gZm9yICR7bmFtZX0gYXJndW1lbnQgd2hlbiBjb25uZWN0aW5nIGNvbXBvbmVudCAke29wdGlvbnMud3JhcHBlZENvbXBvbmVudE5hbWV9LmApO1xuICB9O1xufSIsImltcG9ydCBiaW5kQWN0aW9uQ3JlYXRvcnMgZnJvbSAnLi4vdXRpbHMvYmluZEFjdGlvbkNyZWF0b3JzJztcbmltcG9ydCB7IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQsIHdyYXBNYXBUb1Byb3BzRnVuYyB9IGZyb20gJy4vd3JhcE1hcFRvUHJvcHMnO1xuaW1wb3J0IHsgY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkgfSBmcm9tICcuL2ludmFsaWRBcmdGYWN0b3J5JztcbmV4cG9ydCBmdW5jdGlvbiBtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3J5KG1hcERpc3BhdGNoVG9Qcm9wcykge1xuICByZXR1cm4gbWFwRGlzcGF0Y2hUb1Byb3BzICYmIHR5cGVvZiBtYXBEaXNwYXRjaFRvUHJvcHMgPT09ICdvYmplY3QnID8gd3JhcE1hcFRvUHJvcHNDb25zdGFudChkaXNwYXRjaCA9PiAvLyBAdHMtaWdub3JlXG4gIGJpbmRBY3Rpb25DcmVhdG9ycyhtYXBEaXNwYXRjaFRvUHJvcHMsIGRpc3BhdGNoKSkgOiAhbWFwRGlzcGF0Y2hUb1Byb3BzID8gd3JhcE1hcFRvUHJvcHNDb25zdGFudChkaXNwYXRjaCA9PiAoe1xuICAgIGRpc3BhdGNoXG4gIH0pKSA6IHR5cGVvZiBtYXBEaXNwYXRjaFRvUHJvcHMgPT09ICdmdW5jdGlvbicgPyAvLyBAdHMtaWdub3JlXG4gIHdyYXBNYXBUb1Byb3BzRnVuYyhtYXBEaXNwYXRjaFRvUHJvcHMsICdtYXBEaXNwYXRjaFRvUHJvcHMnKSA6IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5KG1hcERpc3BhdGNoVG9Qcm9wcywgJ21hcERpc3BhdGNoVG9Qcm9wcycpO1xufSIsImltcG9ydCB7IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQsIHdyYXBNYXBUb1Byb3BzRnVuYyB9IGZyb20gJy4vd3JhcE1hcFRvUHJvcHMnO1xuaW1wb3J0IHsgY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkgfSBmcm9tICcuL2ludmFsaWRBcmdGYWN0b3J5JztcbmV4cG9ydCBmdW5jdGlvbiBtYXBTdGF0ZVRvUHJvcHNGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcykge1xuICByZXR1cm4gIW1hcFN0YXRlVG9Qcm9wcyA/IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoKCkgPT4gKHt9KSkgOiB0eXBlb2YgbWFwU3RhdGVUb1Byb3BzID09PSAnZnVuY3Rpb24nID8gLy8gQHRzLWlnbm9yZVxuICB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwU3RhdGVUb1Byb3BzLCAnbWFwU3RhdGVUb1Byb3BzJykgOiBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMsICdtYXBTdGF0ZVRvUHJvcHMnKTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCB2ZXJpZnlQbGFpbk9iamVjdCBmcm9tICcuLi91dGlscy92ZXJpZnlQbGFpbk9iamVjdCc7XG5pbXBvcnQgeyBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeSB9IGZyb20gJy4vaW52YWxpZEFyZ0ZhY3RvcnknO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRNZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKSB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIF9leHRlbmRzKHt9LCBvd25Qcm9wcywgc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gd3JhcE1lcmdlUHJvcHNGdW5jKG1lcmdlUHJvcHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRNZXJnZVByb3BzUHJveHkoZGlzcGF0Y2gsIHtcbiAgICBkaXNwbGF5TmFtZSxcbiAgICBhcmVNZXJnZWRQcm9wc0VxdWFsXG4gIH0pIHtcbiAgICBsZXQgaGFzUnVuT25jZSA9IGZhbHNlO1xuICAgIGxldCBtZXJnZWRQcm9wcztcbiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VQcm9wc1Byb3h5KHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKSB7XG4gICAgICBjb25zdCBuZXh0TWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcblxuICAgICAgaWYgKGhhc1J1bk9uY2UpIHtcbiAgICAgICAgaWYgKCFhcmVNZXJnZWRQcm9wc0VxdWFsKG5leHRNZXJnZWRQcm9wcywgbWVyZ2VkUHJvcHMpKSBtZXJnZWRQcm9wcyA9IG5leHRNZXJnZWRQcm9wcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhc1J1bk9uY2UgPSB0cnVlO1xuICAgICAgICBtZXJnZWRQcm9wcyA9IG5leHRNZXJnZWRQcm9wcztcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHZlcmlmeVBsYWluT2JqZWN0KG1lcmdlZFByb3BzLCBkaXNwbGF5TmFtZSwgJ21lcmdlUHJvcHMnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICAgIH07XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VQcm9wc0ZhY3RvcnkobWVyZ2VQcm9wcykge1xuICByZXR1cm4gIW1lcmdlUHJvcHMgPyAoKSA9PiBkZWZhdWx0TWVyZ2VQcm9wcyA6IHR5cGVvZiBtZXJnZVByb3BzID09PSAnZnVuY3Rpb24nID8gd3JhcE1lcmdlUHJvcHNGdW5jKG1lcmdlUHJvcHMpIDogY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkobWVyZ2VQcm9wcywgJ21lcmdlUHJvcHMnKTtcbn0iLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcbmNvbnN0IF9leGNsdWRlZCA9IFtcImluaXRNYXBTdGF0ZVRvUHJvcHNcIiwgXCJpbml0TWFwRGlzcGF0Y2hUb1Byb3BzXCIsIFwiaW5pdE1lcmdlUHJvcHNcIl07XG5pbXBvcnQgdmVyaWZ5U3Vic2VsZWN0b3JzIGZyb20gJy4vdmVyaWZ5U3Vic2VsZWN0b3JzJztcbmV4cG9ydCBmdW5jdGlvbiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgZGlzcGF0Y2gsIHtcbiAgYXJlU3RhdGVzRXF1YWwsXG4gIGFyZU93blByb3BzRXF1YWwsXG4gIGFyZVN0YXRlUHJvcHNFcXVhbFxufSkge1xuICBsZXQgaGFzUnVuQXRMZWFzdE9uY2UgPSBmYWxzZTtcbiAgbGV0IHN0YXRlO1xuICBsZXQgb3duUHJvcHM7XG4gIGxldCBzdGF0ZVByb3BzO1xuICBsZXQgZGlzcGF0Y2hQcm9wcztcbiAgbGV0IG1lcmdlZFByb3BzO1xuXG4gIGZ1bmN0aW9uIGhhbmRsZUZpcnN0Q2FsbChmaXJzdFN0YXRlLCBmaXJzdE93blByb3BzKSB7XG4gICAgc3RhdGUgPSBmaXJzdFN0YXRlO1xuICAgIG93blByb3BzID0gZmlyc3RPd25Qcm9wcztcbiAgICBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgaGFzUnVuQXRMZWFzdE9uY2UgPSB0cnVlO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU5ld1Byb3BzQW5kTmV3U3RhdGUoKSB7XG4gICAgc3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIGlmIChtYXBEaXNwYXRjaFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMpIGRpc3BhdGNoUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU5ld1Byb3BzKCkge1xuICAgIGlmIChtYXBTdGF0ZVRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMpIHN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBpZiAobWFwRGlzcGF0Y2hUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBkaXNwYXRjaFByb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXdTdGF0ZSgpIHtcbiAgICBjb25zdCBuZXh0U3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIGNvbnN0IHN0YXRlUHJvcHNDaGFuZ2VkID0gIWFyZVN0YXRlUHJvcHNFcXVhbChuZXh0U3RhdGVQcm9wcywgc3RhdGVQcm9wcyk7XG4gICAgc3RhdGVQcm9wcyA9IG5leHRTdGF0ZVByb3BzO1xuICAgIGlmIChzdGF0ZVByb3BzQ2hhbmdlZCkgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVTdWJzZXF1ZW50Q2FsbHMobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpIHtcbiAgICBjb25zdCBwcm9wc0NoYW5nZWQgPSAhYXJlT3duUHJvcHNFcXVhbChuZXh0T3duUHJvcHMsIG93blByb3BzKTtcbiAgICBjb25zdCBzdGF0ZUNoYW5nZWQgPSAhYXJlU3RhdGVzRXF1YWwobmV4dFN0YXRlLCBzdGF0ZSwgbmV4dE93blByb3BzLCBvd25Qcm9wcyk7XG4gICAgc3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgb3duUHJvcHMgPSBuZXh0T3duUHJvcHM7XG4gICAgaWYgKHByb3BzQ2hhbmdlZCAmJiBzdGF0ZUNoYW5nZWQpIHJldHVybiBoYW5kbGVOZXdQcm9wc0FuZE5ld1N0YXRlKCk7XG4gICAgaWYgKHByb3BzQ2hhbmdlZCkgcmV0dXJuIGhhbmRsZU5ld1Byb3BzKCk7XG4gICAgaWYgKHN0YXRlQ2hhbmdlZCkgcmV0dXJuIGhhbmRsZU5ld1N0YXRlKCk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHB1cmVGaW5hbFByb3BzU2VsZWN0b3IobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpIHtcbiAgICByZXR1cm4gaGFzUnVuQXRMZWFzdE9uY2UgPyBoYW5kbGVTdWJzZXF1ZW50Q2FsbHMobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpIDogaGFuZGxlRmlyc3RDYWxsKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKTtcbiAgfTtcbn1cbi8vIFRPRE86IEFkZCBtb3JlIGNvbW1lbnRzXG4vLyBUaGUgc2VsZWN0b3IgcmV0dXJuZWQgYnkgc2VsZWN0b3JGYWN0b3J5IHdpbGwgbWVtb2l6ZSBpdHMgcmVzdWx0cyxcbi8vIGFsbG93aW5nIGNvbm5lY3QncyBzaG91bGRDb21wb25lbnRVcGRhdGUgdG8gcmV0dXJuIGZhbHNlIGlmIGZpbmFsXG4vLyBwcm9wcyBoYXZlIG5vdCBjaGFuZ2VkLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShkaXNwYXRjaCwgX3JlZikge1xuICBsZXQge1xuICAgIGluaXRNYXBTdGF0ZVRvUHJvcHMsXG4gICAgaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyxcbiAgICBpbml0TWVyZ2VQcm9wc1xuICB9ID0gX3JlZixcbiAgICAgIG9wdGlvbnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIGNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9IGluaXRNYXBTdGF0ZVRvUHJvcHMoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuICBjb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcbiAgY29uc3QgbWVyZ2VQcm9wcyA9IGluaXRNZXJnZVByb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZlcmlmeVN1YnNlbGVjdG9ycyhtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcyk7XG4gIH1cblxuICByZXR1cm4gcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BhdGNoLCBvcHRpb25zKTtcbn0iLCJpbXBvcnQgd2FybmluZyBmcm9tICcuLi91dGlscy93YXJuaW5nJztcblxuZnVuY3Rpb24gdmVyaWZ5KHNlbGVjdG9yLCBtZXRob2ROYW1lKSB7XG4gIGlmICghc2VsZWN0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgdmFsdWUgZm9yICR7bWV0aG9kTmFtZX0gaW4gY29ubmVjdC5gKTtcbiAgfSBlbHNlIGlmIChtZXRob2ROYW1lID09PSAnbWFwU3RhdGVUb1Byb3BzJyB8fCBtZXRob2ROYW1lID09PSAnbWFwRGlzcGF0Y2hUb1Byb3BzJykge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNlbGVjdG9yLCAnZGVwZW5kc09uT3duUHJvcHMnKSkge1xuICAgICAgd2FybmluZyhgVGhlIHNlbGVjdG9yIGZvciAke21ldGhvZE5hbWV9IG9mIGNvbm5lY3QgZGlkIG5vdCBzcGVjaWZ5IGEgdmFsdWUgZm9yIGRlcGVuZHNPbk93blByb3BzLmApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2ZXJpZnlTdWJzZWxlY3RvcnMobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMpIHtcbiAgdmVyaWZ5KG1hcFN0YXRlVG9Qcm9wcywgJ21hcFN0YXRlVG9Qcm9wcycpO1xuICB2ZXJpZnkobWFwRGlzcGF0Y2hUb1Byb3BzLCAnbWFwRGlzcGF0Y2hUb1Byb3BzJyk7XG4gIHZlcmlmeShtZXJnZVByb3BzLCAnbWVyZ2VQcm9wcycpO1xufSIsImltcG9ydCB2ZXJpZnlQbGFpbk9iamVjdCBmcm9tICcuLi91dGlscy92ZXJpZnlQbGFpbk9iamVjdCc7XG5leHBvcnQgZnVuY3Rpb24gd3JhcE1hcFRvUHJvcHNDb25zdGFudCggLy8gKiBOb3RlOlxuLy8gIEl0IHNlZW1zIHRoYXQgdGhlIGRpc3BhdGNoIGFyZ3VtZW50XG4vLyAgY291bGQgYmUgYSBkaXNwYXRjaCBmdW5jdGlvbiBpbiBzb21lIGNhc2VzIChleDogd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzTWlzc2luZylcbi8vICBhbmQgYSBzdGF0ZSBvYmplY3QgaW4gc29tZSBvdGhlcnMgKGV4OiB3aGVuTWFwU3RhdGVUb1Byb3BzSXNNaXNzaW5nKVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5nZXRDb25zdGFudCkge1xuICByZXR1cm4gZnVuY3Rpb24gaW5pdENvbnN0YW50U2VsZWN0b3IoZGlzcGF0Y2gpIHtcbiAgICBjb25zdCBjb25zdGFudCA9IGdldENvbnN0YW50KGRpc3BhdGNoKTtcblxuICAgIGZ1bmN0aW9uIGNvbnN0YW50U2VsZWN0b3IoKSB7XG4gICAgICByZXR1cm4gY29uc3RhbnQ7XG4gICAgfVxuXG4gICAgY29uc3RhbnRTZWxlY3Rvci5kZXBlbmRzT25Pd25Qcm9wcyA9IGZhbHNlO1xuICAgIHJldHVybiBjb25zdGFudFNlbGVjdG9yO1xuICB9O1xufSAvLyBkZXBlbmRzT25Pd25Qcm9wcyBpcyB1c2VkIGJ5IGNyZWF0ZU1hcFRvUHJvcHNQcm94eSB0byBkZXRlcm1pbmUgd2hldGhlciB0byBwYXNzIHByb3BzIGFzIGFyZ3Ncbi8vIHRvIHRoZSBtYXBUb1Byb3BzIGZ1bmN0aW9uIGJlaW5nIHdyYXBwZWQuIEl0IGlzIGFsc28gdXNlZCBieSBtYWtlUHVyZVByb3BzU2VsZWN0b3IgdG8gZGV0ZXJtaW5lXG4vLyB3aGV0aGVyIG1hcFRvUHJvcHMgbmVlZHMgdG8gYmUgaW52b2tlZCB3aGVuIHByb3BzIGhhdmUgY2hhbmdlZC5cbi8vXG4vLyBBIGxlbmd0aCBvZiBvbmUgc2lnbmFscyB0aGF0IG1hcFRvUHJvcHMgZG9lcyBub3QgZGVwZW5kIG9uIHByb3BzIGZyb20gdGhlIHBhcmVudCBjb21wb25lbnQuXG4vLyBBIGxlbmd0aCBvZiB6ZXJvIGlzIGFzc3VtZWQgdG8gbWVhbiBtYXBUb1Byb3BzIGlzIGdldHRpbmcgYXJncyB2aWEgYXJndW1lbnRzIG9yIC4uLmFyZ3MgYW5kXG4vLyB0aGVyZWZvcmUgbm90IHJlcG9ydGluZyBpdHMgbGVuZ3RoIGFjY3VyYXRlbHkuLlxuLy8gVE9ETyBDYW4gdGhpcyBnZXQgcHVsbGVkIG91dCBzbyB0aGF0IHdlIGNhbiBzdWJzY3JpYmUgZGlyZWN0bHkgdG8gdGhlIHN0b3JlIGlmIHdlIGRvbid0IG5lZWQgb3duUHJvcHM/XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXBlbmRzT25Pd25Qcm9wcyhtYXBUb1Byb3BzKSB7XG4gIHJldHVybiBtYXBUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzID8gQm9vbGVhbihtYXBUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSA6IG1hcFRvUHJvcHMubGVuZ3RoICE9PSAxO1xufSAvLyBVc2VkIGJ5IHdoZW5NYXBTdGF0ZVRvUHJvcHNJc0Z1bmN0aW9uIGFuZCB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNGdW5jdGlvbixcbi8vIHRoaXMgZnVuY3Rpb24gd3JhcHMgbWFwVG9Qcm9wcyBpbiBhIHByb3h5IGZ1bmN0aW9uIHdoaWNoIGRvZXMgc2V2ZXJhbCB0aGluZ3M6XG4vL1xuLy8gICogRGV0ZWN0cyB3aGV0aGVyIHRoZSBtYXBUb1Byb3BzIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZCBkZXBlbmRzIG9uIHByb3BzLCB3aGljaFxuLy8gICAgaXMgdXNlZCBieSBzZWxlY3RvckZhY3RvcnkgdG8gZGVjaWRlIGlmIGl0IHNob3VsZCByZWludm9rZSBvbiBwcm9wcyBjaGFuZ2VzLlxuLy9cbi8vICAqIE9uIGZpcnN0IGNhbGwsIGhhbmRsZXMgbWFwVG9Qcm9wcyBpZiByZXR1cm5zIGFub3RoZXIgZnVuY3Rpb24sIGFuZCB0cmVhdHMgdGhhdFxuLy8gICAgbmV3IGZ1bmN0aW9uIGFzIHRoZSB0cnVlIG1hcFRvUHJvcHMgZm9yIHN1YnNlcXVlbnQgY2FsbHMuXG4vL1xuLy8gICogT24gZmlyc3QgY2FsbCwgdmVyaWZpZXMgdGhlIGZpcnN0IHJlc3VsdCBpcyBhIHBsYWluIG9iamVjdCwgaW4gb3JkZXIgdG8gd2FyblxuLy8gICAgdGhlIGRldmVsb3BlciB0aGF0IHRoZWlyIG1hcFRvUHJvcHMgZnVuY3Rpb24gaXMgbm90IHJldHVybmluZyBhIHZhbGlkIHJlc3VsdC5cbi8vXG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwVG9Qcm9wcywgbWV0aG9kTmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gaW5pdFByb3h5U2VsZWN0b3IoZGlzcGF0Y2gsIHtcbiAgICBkaXNwbGF5TmFtZVxuICB9KSB7XG4gICAgY29uc3QgcHJveHkgPSBmdW5jdGlvbiBtYXBUb1Byb3BzUHJveHkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcykge1xuICAgICAgcmV0dXJuIHByb3h5LmRlcGVuZHNPbk93blByb3BzID8gcHJveHkubWFwVG9Qcm9wcyhzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKSA6IHByb3h5Lm1hcFRvUHJvcHMoc3RhdGVPckRpc3BhdGNoLCB1bmRlZmluZWQpO1xuICAgIH07IC8vIGFsbG93IGRldGVjdEZhY3RvcnlBbmRWZXJpZnkgdG8gZ2V0IG93blByb3BzXG5cblxuICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gdHJ1ZTtcblxuICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBmdW5jdGlvbiBkZXRlY3RGYWN0b3J5QW5kVmVyaWZ5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIHtcbiAgICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBtYXBUb1Byb3BzO1xuICAgICAgcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPSBnZXREZXBlbmRzT25Pd25Qcm9wcyhtYXBUb1Byb3BzKTtcbiAgICAgIGxldCBwcm9wcyA9IHByb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpO1xuXG4gICAgICBpZiAodHlwZW9mIHByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBwcm9wcztcbiAgICAgICAgcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPSBnZXREZXBlbmRzT25Pd25Qcm9wcyhwcm9wcyk7XG4gICAgICAgIHByb3BzID0gcHJveHkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB2ZXJpZnlQbGFpbk9iamVjdChwcm9wcywgZGlzcGxheU5hbWUsIG1ldGhvZE5hbWUpO1xuICAgICAgcmV0dXJuIHByb3BzO1xuICAgIH07XG5cbiAgICByZXR1cm4gcHJveHk7XG4gIH07XG59IiwiaW1wb3J0IFByb3ZpZGVyIGZyb20gJy4vY29tcG9uZW50cy9Qcm92aWRlcic7XG5pbXBvcnQgY29ubmVjdCBmcm9tICcuL2NvbXBvbmVudHMvY29ubmVjdCc7XG5pbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4vY29tcG9uZW50cy9Db250ZXh0JztcbmltcG9ydCB7IHVzZURpc3BhdGNoLCBjcmVhdGVEaXNwYXRjaEhvb2sgfSBmcm9tICcuL2hvb2tzL3VzZURpc3BhdGNoJztcbmltcG9ydCB7IHVzZVNlbGVjdG9yLCBjcmVhdGVTZWxlY3Rvckhvb2sgfSBmcm9tICcuL2hvb2tzL3VzZVNlbGVjdG9yJztcbmltcG9ydCB7IHVzZVN0b3JlLCBjcmVhdGVTdG9yZUhvb2sgfSBmcm9tICcuL2hvb2tzL3VzZVN0b3JlJztcbmltcG9ydCBzaGFsbG93RXF1YWwgZnJvbSAnLi91dGlscy9zaGFsbG93RXF1YWwnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgeyBQcm92aWRlciwgUmVhY3RSZWR1eENvbnRleHQsIGNvbm5lY3QsIHVzZURpc3BhdGNoLCBjcmVhdGVEaXNwYXRjaEhvb2ssIHVzZVNlbGVjdG9yLCBjcmVhdGVTZWxlY3Rvckhvb2ssIHVzZVN0b3JlLCBjcmVhdGVTdG9yZUhvb2ssIHNoYWxsb3dFcXVhbCB9OyIsImltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0JztcbmltcG9ydCB7IHVzZVN0b3JlIGFzIHVzZURlZmF1bHRTdG9yZSwgY3JlYXRlU3RvcmVIb29rIH0gZnJvbSAnLi91c2VTdG9yZSc7XG4vKipcclxuICogSG9vayBmYWN0b3J5LCB3aGljaCBjcmVhdGVzIGEgYHVzZURpc3BhdGNoYCBob29rIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cclxuICpcclxuICogQHBhcmFtIHtSZWFjdC5Db250ZXh0fSBbY29udGV4dD1SZWFjdFJlZHV4Q29udGV4dF0gQ29udGV4dCBwYXNzZWQgdG8geW91ciBgPFByb3ZpZGVyPmAuXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBgdXNlRGlzcGF0Y2hgIGhvb2sgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBjb250ZXh0LlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURpc3BhdGNoSG9vayhjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQpIHtcbiAgY29uc3QgdXNlU3RvcmUgPSAvLyBAdHMtaWdub3JlXG4gIGNvbnRleHQgPT09IFJlYWN0UmVkdXhDb250ZXh0ID8gdXNlRGVmYXVsdFN0b3JlIDogY3JlYXRlU3RvcmVIb29rKGNvbnRleHQpO1xuICByZXR1cm4gZnVuY3Rpb24gdXNlRGlzcGF0Y2goKSB7XG4gICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZSgpOyAvLyBAdHMtaWdub3JlXG5cbiAgICByZXR1cm4gc3RvcmUuZGlzcGF0Y2g7XG4gIH07XG59XG4vKipcclxuICogQSBob29rIHRvIGFjY2VzcyB0aGUgcmVkdXggYGRpc3BhdGNoYCBmdW5jdGlvbi5cclxuICpcclxuICogQHJldHVybnMge2FueXxmdW5jdGlvbn0gcmVkdXggc3RvcmUncyBgZGlzcGF0Y2hgIGZ1bmN0aW9uXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqXHJcbiAqIGltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0J1xyXG4gKiBpbXBvcnQgeyB1c2VEaXNwYXRjaCB9IGZyb20gJ3JlYWN0LXJlZHV4J1xyXG4gKlxyXG4gKiBleHBvcnQgY29uc3QgQ291bnRlckNvbXBvbmVudCA9ICh7IHZhbHVlIH0pID0+IHtcclxuICogICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKClcclxuICogICBjb25zdCBpbmNyZWFzZUNvdW50ZXIgPSB1c2VDYWxsYmFjaygoKSA9PiBkaXNwYXRjaCh7IHR5cGU6ICdpbmNyZWFzZS1jb3VudGVyJyB9KSwgW10pXHJcbiAqICAgcmV0dXJuIChcclxuICogICAgIDxkaXY+XHJcbiAqICAgICAgIDxzcGFuPnt2YWx1ZX08L3NwYW4+XHJcbiAqICAgICAgIDxidXR0b24gb25DbGljaz17aW5jcmVhc2VDb3VudGVyfT5JbmNyZWFzZSBjb3VudGVyPC9idXR0b24+XHJcbiAqICAgICA8L2Rpdj5cclxuICogICApXHJcbiAqIH1cclxuICovXG5cbmV4cG9ydCBjb25zdCB1c2VEaXNwYXRjaCA9IC8qI19fUFVSRV9fKi9jcmVhdGVEaXNwYXRjaEhvb2soKTsiLCJpbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuLi9jb21wb25lbnRzL0NvbnRleHQnO1xuXG4vKipcclxuICogQSBob29rIHRvIGFjY2VzcyB0aGUgdmFsdWUgb2YgdGhlIGBSZWFjdFJlZHV4Q29udGV4dGAuIFRoaXMgaXMgYSBsb3ctbGV2ZWxcclxuICogaG9vayB0aGF0IHlvdSBzaG91bGQgdXN1YWxseSBub3QgbmVlZCB0byBjYWxsIGRpcmVjdGx5LlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7YW55fSB0aGUgdmFsdWUgb2YgdGhlIGBSZWFjdFJlZHV4Q29udGV4dGBcclxuICpcclxuICogQGV4YW1wbGVcclxuICpcclxuICogaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xyXG4gKiBpbXBvcnQgeyB1c2VSZWR1eENvbnRleHQgfSBmcm9tICdyZWFjdC1yZWR1eCdcclxuICpcclxuICogZXhwb3J0IGNvbnN0IENvdW50ZXJDb21wb25lbnQgPSAoKSA9PiB7XHJcbiAqICAgY29uc3QgeyBzdG9yZSB9ID0gdXNlUmVkdXhDb250ZXh0KClcclxuICogICByZXR1cm4gPGRpdj57c3RvcmUuZ2V0U3RhdGUoKX08L2Rpdj5cclxuICogfVxyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWR1eENvbnRleHQoKSB7XG4gIGNvbnN0IGNvbnRleHRWYWx1ZSA9IHVzZUNvbnRleHQoUmVhY3RSZWR1eENvbnRleHQpO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFjb250ZXh0VmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCBmaW5kIHJlYWN0LXJlZHV4IGNvbnRleHQgdmFsdWU7IHBsZWFzZSBlbnN1cmUgdGhlIGNvbXBvbmVudCBpcyB3cmFwcGVkIGluIGEgPFByb3ZpZGVyPicpO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRleHRWYWx1ZTtcbn0iLCJpbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VEZWJ1Z1ZhbHVlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlUmVkdXhDb250ZXh0IGFzIHVzZURlZmF1bHRSZWR1eENvbnRleHQgfSBmcm9tICcuL3VzZVJlZHV4Q29udGV4dCc7XG5pbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ29udGV4dCc7XG5pbXBvcnQgeyBub3RJbml0aWFsaXplZCB9IGZyb20gJy4uL3V0aWxzL3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbmxldCB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciA9IG5vdEluaXRpYWxpemVkO1xuZXhwb3J0IGNvbnN0IGluaXRpYWxpemVVc2VTZWxlY3RvciA9IGZuID0+IHtcbiAgdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IgPSBmbjtcbn07XG5cbmNvbnN0IHJlZkVxdWFsaXR5ID0gKGEsIGIpID0+IGEgPT09IGI7XG4vKipcclxuICogSG9vayBmYWN0b3J5LCB3aGljaCBjcmVhdGVzIGEgYHVzZVNlbGVjdG9yYCBob29rIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dC5cclxuICpcclxuICogQHBhcmFtIHtSZWFjdC5Db250ZXh0fSBbY29udGV4dD1SZWFjdFJlZHV4Q29udGV4dF0gQ29udGV4dCBwYXNzZWQgdG8geW91ciBgPFByb3ZpZGVyPmAuXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBgdXNlU2VsZWN0b3JgIGhvb2sgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBjb250ZXh0LlxyXG4gKi9cblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3JIb29rKGNvbnRleHQgPSBSZWFjdFJlZHV4Q29udGV4dCkge1xuICBjb25zdCB1c2VSZWR1eENvbnRleHQgPSBjb250ZXh0ID09PSBSZWFjdFJlZHV4Q29udGV4dCA/IHVzZURlZmF1bHRSZWR1eENvbnRleHQgOiAoKSA9PiB1c2VDb250ZXh0KGNvbnRleHQpO1xuICByZXR1cm4gZnVuY3Rpb24gdXNlU2VsZWN0b3Ioc2VsZWN0b3IsIGVxdWFsaXR5Rm4gPSByZWZFcXVhbGl0eSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWW91IG11c3QgcGFzcyBhIHNlbGVjdG9yIHRvIHVzZVNlbGVjdG9yYCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2VsZWN0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBZb3UgbXVzdCBwYXNzIGEgZnVuY3Rpb24gYXMgYSBzZWxlY3RvciB0byB1c2VTZWxlY3RvcmApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGVxdWFsaXR5Rm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBZb3UgbXVzdCBwYXNzIGEgZnVuY3Rpb24gYXMgYW4gZXF1YWxpdHkgZnVuY3Rpb24gdG8gdXNlU2VsZWN0b3JgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBzdG9yZSxcbiAgICAgIHN1YnNjcmlwdGlvbixcbiAgICAgIGdldFNlcnZlclN0YXRlXG4gICAgfSA9IHVzZVJlZHV4Q29udGV4dCgpO1xuICAgIGNvbnN0IHNlbGVjdGVkU3RhdGUgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvcihzdWJzY3JpcHRpb24uYWRkTmVzdGVkU3ViLCBzdG9yZS5nZXRTdGF0ZSwgZ2V0U2VydmVyU3RhdGUgfHwgc3RvcmUuZ2V0U3RhdGUsIHNlbGVjdG9yLCBlcXVhbGl0eUZuKTtcbiAgICB1c2VEZWJ1Z1ZhbHVlKHNlbGVjdGVkU3RhdGUpO1xuICAgIHJldHVybiBzZWxlY3RlZFN0YXRlO1xuICB9O1xufVxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHJlZHV4IHN0b3JlJ3Mgc3RhdGUuIFRoaXMgaG9vayB0YWtlcyBhIHNlbGVjdG9yIGZ1bmN0aW9uXHJcbiAqIGFzIGFuIGFyZ3VtZW50LiBUaGUgc2VsZWN0b3IgaXMgY2FsbGVkIHdpdGggdGhlIHN0b3JlIHN0YXRlLlxyXG4gKlxyXG4gKiBUaGlzIGhvb2sgdGFrZXMgYW4gb3B0aW9uYWwgZXF1YWxpdHkgY29tcGFyaXNvbiBmdW5jdGlvbiBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlclxyXG4gKiB0aGF0IGFsbG93cyB5b3UgdG8gY3VzdG9taXplIHRoZSB3YXkgdGhlIHNlbGVjdGVkIHN0YXRlIGlzIGNvbXBhcmVkIHRvIGRldGVybWluZVxyXG4gKiB3aGV0aGVyIHRoZSBjb21wb25lbnQgbmVlZHMgdG8gYmUgcmUtcmVuZGVyZWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGVjdG9yIHRoZSBzZWxlY3RvciBmdW5jdGlvblxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9uPX0gZXF1YWxpdHlGbiB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGVxdWFsaXR5XHJcbiAqXHJcbiAqIEByZXR1cm5zIHthbnl9IHRoZSBzZWxlY3RlZCBzdGF0ZVxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKlxyXG4gKiBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXHJcbiAqIGltcG9ydCB7IHVzZVNlbGVjdG9yIH0gZnJvbSAncmVhY3QtcmVkdXgnXHJcbiAqXHJcbiAqIGV4cG9ydCBjb25zdCBDb3VudGVyQ29tcG9uZW50ID0gKCkgPT4ge1xyXG4gKiAgIGNvbnN0IGNvdW50ZXIgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5jb3VudGVyKVxyXG4gKiAgIHJldHVybiA8ZGl2Pntjb3VudGVyfTwvZGl2PlxyXG4gKiB9XHJcbiAqL1xuXG5leHBvcnQgY29uc3QgdXNlU2VsZWN0b3IgPSAvKiNfX1BVUkVfXyovY3JlYXRlU2VsZWN0b3JIb29rKCk7IiwiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0JztcbmltcG9ydCB7IHVzZVJlZHV4Q29udGV4dCBhcyB1c2VEZWZhdWx0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi91c2VSZWR1eENvbnRleHQnO1xuLyoqXHJcbiAqIEhvb2sgZmFjdG9yeSwgd2hpY2ggY3JlYXRlcyBhIGB1c2VTdG9yZWAgaG9vayBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhY3QuQ29udGV4dH0gW2NvbnRleHQ9UmVhY3RSZWR1eENvbnRleHRdIENvbnRleHQgcGFzc2VkIHRvIHlvdXIgYDxQcm92aWRlcj5gLlxyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgYHVzZVN0b3JlYCBob29rIGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dC5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdG9yZUhvb2soY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0KSB7XG4gIGNvbnN0IHVzZVJlZHV4Q29udGV4dCA9IC8vIEB0cy1pZ25vcmVcbiAgY29udGV4dCA9PT0gUmVhY3RSZWR1eENvbnRleHQgPyB1c2VEZWZhdWx0UmVkdXhDb250ZXh0IDogKCkgPT4gdXNlQ29udGV4dChjb250ZXh0KTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZVN0b3JlKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHN0b3JlXG4gICAgfSA9IHVzZVJlZHV4Q29udGV4dCgpOyAvLyBAdHMtaWdub3JlXG5cbiAgICByZXR1cm4gc3RvcmU7XG4gIH07XG59XG4vKipcclxuICogQSBob29rIHRvIGFjY2VzcyB0aGUgcmVkdXggc3RvcmUuXHJcbiAqXHJcbiAqIEByZXR1cm5zIHthbnl9IHRoZSByZWR1eCBzdG9yZVxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKlxyXG4gKiBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXHJcbiAqIGltcG9ydCB7IHVzZVN0b3JlIH0gZnJvbSAncmVhY3QtcmVkdXgnXHJcbiAqXHJcbiAqIGV4cG9ydCBjb25zdCBFeGFtcGxlQ29tcG9uZW50ID0gKCkgPT4ge1xyXG4gKiAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmUoKVxyXG4gKiAgIHJldHVybiA8ZGl2PntzdG9yZS5nZXRTdGF0ZSgpfTwvZGl2PlxyXG4gKiB9XHJcbiAqL1xuXG5leHBvcnQgY29uc3QgdXNlU3RvcmUgPSAvKiNfX1BVUkVfXyovY3JlYXRlU3RvcmVIb29rKCk7IiwiLy8gVGhlIHByaW1hcnkgZW50cnkgcG9pbnQgYXNzdW1lcyB3ZSdyZSB3b3JraW5nIHdpdGggc3RhbmRhcmQgUmVhY3RET00vUk4sIGJ1dFxuLy8gb2xkZXIgdmVyc2lvbnMgdGhhdCBkbyBub3QgaW5jbHVkZSBgdXNlU3luY0V4dGVybmFsU3RvcmVgIChSZWFjdCAxNi45IC0gMTcueCkuXG4vLyBCZWNhdXNlIG9mIHRoYXQsIHRoZSB1c2VTeW5jRXh0ZXJuYWxTdG9yZSBjb21wYXQgc2hpbSBpcyBuZWVkZWQuXG5pbXBvcnQgeyB1c2VTeW5jRXh0ZXJuYWxTdG9yZSB9IGZyb20gJ3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL3NoaW0nO1xuaW1wb3J0IHsgdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IgfSBmcm9tICd1c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL3dpdGgtc2VsZWN0b3InO1xuaW1wb3J0IHsgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgYXMgYmF0Y2ggfSBmcm9tICcuL3V0aWxzL3JlYWN0QmF0Y2hlZFVwZGF0ZXMnO1xuaW1wb3J0IHsgc2V0QmF0Y2ggfSBmcm9tICcuL3V0aWxzL2JhdGNoJztcbmltcG9ydCB7IGluaXRpYWxpemVVc2VTZWxlY3RvciB9IGZyb20gJy4vaG9va3MvdXNlU2VsZWN0b3InO1xuaW1wb3J0IHsgaW5pdGlhbGl6ZUNvbm5lY3QgfSBmcm9tICcuL2NvbXBvbmVudHMvY29ubmVjdCc7XG5pbml0aWFsaXplVXNlU2VsZWN0b3IodXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IpO1xuaW5pdGlhbGl6ZUNvbm5lY3QodXNlU3luY0V4dGVybmFsU3RvcmUpOyAvLyBFbmFibGUgYmF0Y2hlZCB1cGRhdGVzIGluIG91ciBzdWJzY3JpcHRpb25zIGZvciB1c2Vcbi8vIHdpdGggc3RhbmRhcmQgUmVhY3QgcmVuZGVyZXJzIChSZWFjdERPTSwgUmVhY3QgTmF0aXZlKVxuXG5zZXRCYXRjaChiYXRjaCk7XG5leHBvcnQgeyBiYXRjaCB9O1xuZXhwb3J0ICogZnJvbSAnLi9leHBvcnRzJzsiLCJleHBvcnQge307IiwiaW1wb3J0IHsgZ2V0QmF0Y2ggfSBmcm9tICcuL2JhdGNoJzsgLy8gZW5jYXBzdWxhdGVzIHRoZSBzdWJzY3JpcHRpb24gbG9naWMgZm9yIGNvbm5lY3RpbmcgYSBjb21wb25lbnQgdG8gdGhlIHJlZHV4IHN0b3JlLCBhc1xuLy8gd2VsbCBhcyBuZXN0aW5nIHN1YnNjcmlwdGlvbnMgb2YgZGVzY2VuZGFudCBjb21wb25lbnRzLCBzbyB0aGF0IHdlIGNhbiBlbnN1cmUgdGhlXG4vLyBhbmNlc3RvciBjb21wb25lbnRzIHJlLXJlbmRlciBiZWZvcmUgZGVzY2VuZGFudHNcblxuZnVuY3Rpb24gY3JlYXRlTGlzdGVuZXJDb2xsZWN0aW9uKCkge1xuICBjb25zdCBiYXRjaCA9IGdldEJhdGNoKCk7XG4gIGxldCBmaXJzdCA9IG51bGw7XG4gIGxldCBsYXN0ID0gbnVsbDtcbiAgcmV0dXJuIHtcbiAgICBjbGVhcigpIHtcbiAgICAgIGZpcnN0ID0gbnVsbDtcbiAgICAgIGxhc3QgPSBudWxsO1xuICAgIH0sXG5cbiAgICBub3RpZnkoKSB7XG4gICAgICBiYXRjaCgoKSA9PiB7XG4gICAgICAgIGxldCBsaXN0ZW5lciA9IGZpcnN0O1xuXG4gICAgICAgIHdoaWxlIChsaXN0ZW5lcikge1xuICAgICAgICAgIGxpc3RlbmVyLmNhbGxiYWNrKCk7XG4gICAgICAgICAgbGlzdGVuZXIgPSBsaXN0ZW5lci5uZXh0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgZ2V0KCkge1xuICAgICAgbGV0IGxpc3RlbmVycyA9IFtdO1xuICAgICAgbGV0IGxpc3RlbmVyID0gZmlyc3Q7XG5cbiAgICAgIHdoaWxlIChsaXN0ZW5lcikge1xuICAgICAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXIubmV4dDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxpc3RlbmVycztcbiAgICB9LFxuXG4gICAgc3Vic2NyaWJlKGNhbGxiYWNrKSB7XG4gICAgICBsZXQgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IGxhc3QgPSB7XG4gICAgICAgIGNhbGxiYWNrLFxuICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICBwcmV2OiBsYXN0XG4gICAgICB9O1xuXG4gICAgICBpZiAobGlzdGVuZXIucHJldikge1xuICAgICAgICBsaXN0ZW5lci5wcmV2Lm5leHQgPSBsaXN0ZW5lcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpcnN0ID0gbGlzdGVuZXI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHtcbiAgICAgICAgaWYgKCFpc1N1YnNjcmliZWQgfHwgZmlyc3QgPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgaXNTdWJzY3JpYmVkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGxpc3RlbmVyLm5leHQpIHtcbiAgICAgICAgICBsaXN0ZW5lci5uZXh0LnByZXYgPSBsaXN0ZW5lci5wcmV2O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxhc3QgPSBsaXN0ZW5lci5wcmV2O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpc3RlbmVyLnByZXYpIHtcbiAgICAgICAgICBsaXN0ZW5lci5wcmV2Lm5leHQgPSBsaXN0ZW5lci5uZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpcnN0ID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgfTtcbn1cblxuY29uc3QgbnVsbExpc3RlbmVycyA9IHtcbiAgbm90aWZ5KCkge30sXG5cbiAgZ2V0OiAoKSA9PiBbXVxufTtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdWJzY3JpcHRpb24oc3RvcmUsIHBhcmVudFN1Yikge1xuICBsZXQgdW5zdWJzY3JpYmU7XG4gIGxldCBsaXN0ZW5lcnMgPSBudWxsTGlzdGVuZXJzO1xuXG4gIGZ1bmN0aW9uIGFkZE5lc3RlZFN1YihsaXN0ZW5lcikge1xuICAgIHRyeVN1YnNjcmliZSgpO1xuICAgIHJldHVybiBsaXN0ZW5lcnMuc3Vic2NyaWJlKGxpc3RlbmVyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vdGlmeU5lc3RlZFN1YnMoKSB7XG4gICAgbGlzdGVuZXJzLm5vdGlmeSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlQ2hhbmdlV3JhcHBlcigpIHtcbiAgICBpZiAoc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UpIHtcbiAgICAgIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNTdWJzY3JpYmVkKCkge1xuICAgIHJldHVybiBCb29sZWFuKHVuc3Vic2NyaWJlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyeVN1YnNjcmliZSgpIHtcbiAgICBpZiAoIXVuc3Vic2NyaWJlKSB7XG4gICAgICB1bnN1YnNjcmliZSA9IHBhcmVudFN1YiA/IHBhcmVudFN1Yi5hZGROZXN0ZWRTdWIoaGFuZGxlQ2hhbmdlV3JhcHBlcikgOiBzdG9yZS5zdWJzY3JpYmUoaGFuZGxlQ2hhbmdlV3JhcHBlcik7XG4gICAgICBsaXN0ZW5lcnMgPSBjcmVhdGVMaXN0ZW5lckNvbGxlY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0cnlVbnN1YnNjcmliZSgpIHtcbiAgICBpZiAodW5zdWJzY3JpYmUpIHtcbiAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICB1bnN1YnNjcmliZSA9IHVuZGVmaW5lZDtcbiAgICAgIGxpc3RlbmVycy5jbGVhcigpO1xuICAgICAgbGlzdGVuZXJzID0gbnVsbExpc3RlbmVycztcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdWJzY3JpcHRpb24gPSB7XG4gICAgYWRkTmVzdGVkU3ViLFxuICAgIG5vdGlmeU5lc3RlZFN1YnMsXG4gICAgaGFuZGxlQ2hhbmdlV3JhcHBlcixcbiAgICBpc1N1YnNjcmliZWQsXG4gICAgdHJ5U3Vic2NyaWJlLFxuICAgIHRyeVVuc3Vic2NyaWJlLFxuICAgIGdldExpc3RlbmVyczogKCkgPT4gbGlzdGVuZXJzXG4gIH07XG4gIHJldHVybiBzdWJzY3JpcHRpb247XG59IiwiLy8gRGVmYXVsdCB0byBhIGR1bW15IFwiYmF0Y2hcIiBpbXBsZW1lbnRhdGlvbiB0aGF0IGp1c3QgcnVucyB0aGUgY2FsbGJhY2tcbmZ1bmN0aW9uIGRlZmF1bHROb29wQmF0Y2goY2FsbGJhY2spIHtcbiAgY2FsbGJhY2soKTtcbn1cblxubGV0IGJhdGNoID0gZGVmYXVsdE5vb3BCYXRjaDsgLy8gQWxsb3cgaW5qZWN0aW5nIGFub3RoZXIgYmF0Y2hpbmcgZnVuY3Rpb24gbGF0ZXJcblxuZXhwb3J0IGNvbnN0IHNldEJhdGNoID0gbmV3QmF0Y2ggPT4gYmF0Y2ggPSBuZXdCYXRjaDsgLy8gU3VwcGx5IGEgZ2V0dGVyIGp1c3QgdG8gc2tpcCBkZWFsaW5nIHdpdGggRVNNIGJpbmRpbmdzXG5cbmV4cG9ydCBjb25zdCBnZXRCYXRjaCA9ICgpID0+IGJhdGNoOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9ycyhhY3Rpb25DcmVhdG9ycywgZGlzcGF0Y2gpIHtcbiAgY29uc3QgYm91bmRBY3Rpb25DcmVhdG9ycyA9IHt9O1xuXG4gIGZvciAoY29uc3Qga2V5IGluIGFjdGlvbkNyZWF0b3JzKSB7XG4gICAgY29uc3QgYWN0aW9uQ3JlYXRvciA9IGFjdGlvbkNyZWF0b3JzW2tleV07XG5cbiAgICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGJvdW5kQWN0aW9uQ3JlYXRvcnNba2V5XSA9ICguLi5hcmdzKSA9PiBkaXNwYXRjaChhY3Rpb25DcmVhdG9yKC4uLmFyZ3MpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYm91bmRBY3Rpb25DcmVhdG9ycztcbn0iLCIvKipcclxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXHJcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBhcmd1bWVudCBhcHBlYXJzIHRvIGJlIGEgcGxhaW4gb2JqZWN0LlxyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgbGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG4gIGlmIChwcm90byA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gIGxldCBiYXNlUHJvdG8gPSBwcm90bztcblxuICB3aGlsZSAoT2JqZWN0LmdldFByb3RvdHlwZU9mKGJhc2VQcm90bykgIT09IG51bGwpIHtcbiAgICBiYXNlUHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYmFzZVByb3RvKTtcbiAgfVxuXG4gIHJldHVybiBwcm90byA9PT0gYmFzZVByb3RvO1xufSIsImV4cG9ydCB7IHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIH0gZnJvbSAncmVhY3QtZG9tJzsiLCJmdW5jdGlvbiBpcyh4LCB5KSB7XG4gIGlmICh4ID09PSB5KSB7XG4gICAgcmV0dXJuIHggIT09IDAgfHwgeSAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQikge1xuICBpZiAoaXMob2JqQSwgb2JqQikpIHJldHVybiB0cnVlO1xuXG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gJ29iamVjdCcgfHwgb2JqQSA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqQiAhPT0gJ29iamVjdCcgfHwgb2JqQiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmpCLCBrZXlzQVtpXSkgfHwgIWlzKG9iakFba2V5c0FbaV1dLCBvYmpCW2tleXNBW2ldXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn0iLCJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZUxheW91dEVmZmVjdCB9IGZyb20gJ3JlYWN0JzsgLy8gUmVhY3QgY3VycmVudGx5IHRocm93cyBhIHdhcm5pbmcgd2hlbiB1c2luZyB1c2VMYXlvdXRFZmZlY3Qgb24gdGhlIHNlcnZlci5cbi8vIFRvIGdldCBhcm91bmQgaXQsIHdlIGNhbiBjb25kaXRpb25hbGx5IHVzZUVmZmVjdCBvbiB0aGUgc2VydmVyIChuby1vcCkgYW5kXG4vLyB1c2VMYXlvdXRFZmZlY3QgaW4gdGhlIGJyb3dzZXIuIFdlIG5lZWQgdXNlTGF5b3V0RWZmZWN0IHRvIGVuc3VyZSB0aGUgc3RvcmVcbi8vIHN1YnNjcmlwdGlvbiBjYWxsYmFjayBhbHdheXMgaGFzIHRoZSBzZWxlY3RvciBmcm9tIHRoZSBsYXRlc3QgcmVuZGVyIGNvbW1pdFxuLy8gYXZhaWxhYmxlLCBvdGhlcndpc2UgYSBzdG9yZSB1cGRhdGUgbWF5IGhhcHBlbiBiZXR3ZWVuIHJlbmRlciBhbmQgdGhlIGVmZmVjdCxcbi8vIHdoaWNoIG1heSBjYXVzZSBtaXNzZWQgdXBkYXRlczsgd2UgYWxzbyBtdXN0IGVuc3VyZSB0aGUgc3RvcmUgc3Vic2NyaXB0aW9uXG4vLyBpcyBjcmVhdGVkIHN5bmNocm9ub3VzbHksIG90aGVyd2lzZSBhIHN0b3JlIHVwZGF0ZSBtYXkgb2NjdXIgYmVmb3JlIHRoZVxuLy8gc3Vic2NyaXB0aW9uIGlzIGNyZWF0ZWQgYW5kIGFuIGluY29uc2lzdGVudCBzdGF0ZSBtYXkgYmUgb2JzZXJ2ZWRcbi8vIE1hdGNoZXMgbG9naWMgaW4gUmVhY3QncyBgc2hhcmVkL0V4ZWN1dGlvbkVudmlyb25tZW50YCBmaWxlXG5cbmV4cG9ydCBjb25zdCBjYW5Vc2VET00gPSAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgIT09ICd1bmRlZmluZWQnKTtcbmV4cG9ydCBjb25zdCB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0ID0gY2FuVXNlRE9NID8gdXNlTGF5b3V0RWZmZWN0IDogdXNlRWZmZWN0OyIsImV4cG9ydCBjb25zdCBub3RJbml0aWFsaXplZCA9ICgpID0+IHtcbiAgdGhyb3cgbmV3IEVycm9yKCd1U0VTIG5vdCBpbml0aWFsaXplZCEnKTtcbn07IiwiaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSAnLi9pc1BsYWluT2JqZWN0JztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4vd2FybmluZyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2ZXJpZnlQbGFpbk9iamVjdCh2YWx1ZSwgZGlzcGxheU5hbWUsIG1ldGhvZE5hbWUpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIHdhcm5pbmcoYCR7bWV0aG9kTmFtZX0oKSBpbiAke2Rpc3BsYXlOYW1lfSBtdXN0IHJldHVybiBhIHBsYWluIG9iamVjdC4gSW5zdGVhZCByZWNlaXZlZCAke3ZhbHVlfS5gKTtcbiAgfVxufSIsIi8qKlxyXG4gKiBQcmludHMgYSB3YXJuaW5nIGluIHRoZSBjb25zb2xlIGlmIGl0IGV4aXN0cy5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIHdhcm5pbmcgbWVzc2FnZS5cclxuICogQHJldHVybnMge3ZvaWR9XHJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd2FybmluZyhtZXNzYWdlKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG5cblxuICB0cnkge1xuICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgaWYgeW91IGVuYWJsZVxuICAgIC8vIFwiYnJlYWsgb24gYWxsIGV4Y2VwdGlvbnNcIiBpbiB5b3VyIGNvbnNvbGUsXG4gICAgLy8gaXQgd291bGQgcGF1c2UgdGhlIGV4ZWN1dGlvbiBhdCB0aGlzIGxpbmUuXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWVtcHR5ICovXG4gIH0gY2F0Y2ggKGUpIHt9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tZW1wdHkgKi9cblxufSIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKTtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKTtcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKTtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKTtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0Jyk7XG52YXIgUkVBQ1RfU0VSVkVSX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnNlcnZlcl9jb250ZXh0Jyk7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpO1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKTtcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5Jyk7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZVNjb3BlQVBJID0gZmFsc2U7IC8vIEV4cGVyaW1lbnRhbCBDcmVhdGUgRXZlbnQgSGFuZGxlIEFQSS5cbnZhciBlbmFibGVDYWNoZUVsZW1lbnQgPSBmYWxzZTtcbnZhciBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyA9IGZhbHNlOyAvLyBObyBrbm93biBidWdzLCBidXQgbmVlZHMgcGVyZm9ybWFuY2UgdGVzdGluZ1xuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuLy8gc3R1ZmYuIEludGVuZGVkIHRvIGVuYWJsZSBSZWFjdCBjb3JlIG1lbWJlcnMgdG8gbW9yZSBlYXNpbHkgZGVidWcgc2NoZWR1bGluZ1xuLy8gaXNzdWVzIGluIERFViBidWlsZHMuXG5cbnZhciBlbmFibGVEZWJ1Z1RyYWNpbmcgPSBmYWxzZTsgLy8gVHJhY2sgd2hpY2ggRmliZXIocykgc2NoZWR1bGUgcmVuZGVyIHdvcmsuXG5cbnZhciBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFO1xuXG57XG4gIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKCdyZWFjdC5tb2R1bGUucmVmZXJlbmNlJyk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBOb3RlOiB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyAoZS5nLiBpZiBpdCdzIGEgcG9seWZpbGwpLlxuXG5cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCBlbmFibGVEZWJ1Z1RyYWNpbmcgIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICB8fCB0eXBlID09PSBSRUFDVF9PRkZTQ1JFRU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSAgfHwgZW5hYmxlQ2FjaGVFbGVtZW50ICB8fCBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdFxuICAgIC8vIHR5cGVzIHN1cHBvcnRlZCBieSBhbnkgRmxpZ2h0IGNvbmZpZ3VyYXRpb24gYW55d2hlcmUgc2luY2VcbiAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIEZsaWdodCBidWlsZCB0aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHVzZWRcbiAgICAvLyB3aXRoLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgfHwgdHlwZS5nZXRNb2R1bGVJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciAkJHR5cGVvZlR5cGUgPSB0eXBlICYmIHR5cGUuJCR0eXBlb2Y7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoJCR0eXBlb2ZUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfU0VSVkVSX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIFN1c3BlbnNlTGlzdCA9IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUgPSBmYWxzZTsgLy8gQXN5bmNNb2RlIHNob3VsZCBiZSBkZXByZWNhdGVkXG5cbmZ1bmN0aW9uIGlzQXN5bmNNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSB0cnVlOyAvLyBVc2luZyBjb25zb2xlWyd3YXJuJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuXG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1RoZSBSZWFjdElzLmlzQXN5bmNNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE4Ky4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE4Ky4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRDb25zdW1lcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05URVhUX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9WSURFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNGb3J3YXJkUmVmKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZyYWdtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0xhenkob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTEFaWV9UWVBFO1xufVxuZnVuY3Rpb24gaXNNZW1vKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX01FTU9fVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUG9ydGFsKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BPUlRBTF9UWVBFO1xufVxuZnVuY3Rpb24gaXNQcm9maWxlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdHJpY3RNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlTGlzdChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG59XG5cbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5TdXNwZW5zZUxpc3QgPSBTdXNwZW5zZUxpc3Q7XG5leHBvcnRzLmlzQXN5bmNNb2RlID0gaXNBc3luY01vZGU7XG5leHBvcnRzLmlzQ29uY3VycmVudE1vZGUgPSBpc0NvbmN1cnJlbnRNb2RlO1xuZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lciA9IGlzQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5pc0NvbnRleHRQcm92aWRlciA9IGlzQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG5leHBvcnRzLmlzRm9yd2FyZFJlZiA9IGlzRm9yd2FyZFJlZjtcbmV4cG9ydHMuaXNGcmFnbWVudCA9IGlzRnJhZ21lbnQ7XG5leHBvcnRzLmlzTGF6eSA9IGlzTGF6eTtcbmV4cG9ydHMuaXNNZW1vID0gaXNNZW1vO1xuZXhwb3J0cy5pc1BvcnRhbCA9IGlzUG9ydGFsO1xuZXhwb3J0cy5pc1Byb2ZpbGVyID0gaXNQcm9maWxlcjtcbmV4cG9ydHMuaXNTdHJpY3RNb2RlID0gaXNTdHJpY3RNb2RlO1xuZXhwb3J0cy5pc1N1c3BlbnNlID0gaXNTdXNwZW5zZTtcbmV4cG9ydHMuaXNTdXNwZW5zZUxpc3QgPSBpc1N1c3BlbnNlTGlzdDtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlO1xuZXhwb3J0cy50eXBlT2YgPSB0eXBlT2Y7XG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYXBhdGh5JyxcbiAgYXV0aG9yOiAnamFubmlrIHNpZWJlcnQgKGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5uaWtzKScsXG4gIGJhc2UwMDogJyMwMzFBMTYnLFxuICBiYXNlMDE6ICcjMEIzNDJEJyxcbiAgYmFzZTAyOiAnIzE4NEU0NScsXG4gIGJhc2UwMzogJyMyQjY4NUUnLFxuICBiYXNlMDQ6ICcjNUY5QzkyJyxcbiAgYmFzZTA1OiAnIzgxQjVBQycsXG4gIGJhc2UwNjogJyNBN0NFQzgnLFxuICBiYXNlMDc6ICcjRDJFN0U0JyxcbiAgYmFzZTA4OiAnIzNFOTY4OCcsXG4gIGJhc2UwOTogJyMzRTc5OTYnLFxuICBiYXNlMEE6ICcjM0U0Qzk2JyxcbiAgYmFzZTBCOiAnIzg4M0U5NicsXG4gIGJhc2UwQzogJyM5NjNFNEMnLFxuICBiYXNlMEQ6ICcjOTY4ODNFJyxcbiAgYmFzZTBFOiAnIzRDOTYzRScsXG4gIGJhc2UwRjogJyMzRTk2NUInXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdhc2hlcycsXG4gIGF1dGhvcjogJ2phbm5payBzaWViZXJ0IChodHRwczovL2dpdGh1Yi5jb20vamFubmlrcyknLFxuICBiYXNlMDA6ICcjMUMyMDIzJyxcbiAgYmFzZTAxOiAnIzM5M0Y0NScsXG4gIGJhc2UwMjogJyM1NjVFNjUnLFxuICBiYXNlMDM6ICcjNzQ3Qzg0JyxcbiAgYmFzZTA0OiAnI0FEQjNCQScsXG4gIGJhc2UwNTogJyNDN0NDRDEnLFxuICBiYXNlMDY6ICcjREZFMkU1JyxcbiAgYmFzZTA3OiAnI0YzRjRGNScsXG4gIGJhc2UwODogJyNDN0FFOTUnLFxuICBiYXNlMDk6ICcjQzdDNzk1JyxcbiAgYmFzZTBBOiAnI0FFQzc5NScsXG4gIGJhc2UwQjogJyM5NUM3QUUnLFxuICBiYXNlMEM6ICcjOTVBRUM3JyxcbiAgYmFzZTBEOiAnI0FFOTVDNycsXG4gIGJhc2UwRTogJyNDNzk1QUUnLFxuICBiYXNlMEY6ICcjQzc5NTk1J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYXRlbGllciBkdW5lJyxcbiAgYXV0aG9yOiAnYnJhbSBkZSBoYWFuIChodHRwOi8vYXRlbGllcmJyYW0uZ2l0aHViLmlvL3N5bnRheC1oaWdobGlnaHRpbmcvYXRlbGllci1zY2hlbWVzL2R1bmUpJyxcbiAgYmFzZTAwOiAnIzIwMjAxZCcsXG4gIGJhc2UwMTogJyMyOTI4MjQnLFxuICBiYXNlMDI6ICcjNmU2YjVlJyxcbiAgYmFzZTAzOiAnIzdkN2E2OCcsXG4gIGJhc2UwNDogJyM5OTk1ODAnLFxuICBiYXNlMDU6ICcjYTZhMjhjJyxcbiAgYmFzZTA2OiAnI2U4ZTRjZicsXG4gIGJhc2UwNzogJyNmZWZiZWMnLFxuICBiYXNlMDg6ICcjZDczNzM3JyxcbiAgYmFzZTA5OiAnI2I2NTYxMScsXG4gIGJhc2UwQTogJyNjZmIwMTcnLFxuICBiYXNlMEI6ICcjNjBhYzM5JyxcbiAgYmFzZTBDOiAnIzFmYWQ4MycsXG4gIGJhc2UwRDogJyM2Njg0ZTEnLFxuICBiYXNlMEU6ICcjYjg1NGQ0JyxcbiAgYmFzZTBGOiAnI2Q0MzU1Midcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2F0ZWxpZXIgZm9yZXN0JyxcbiAgYXV0aG9yOiAnYnJhbSBkZSBoYWFuIChodHRwOi8vYXRlbGllcmJyYW0uZ2l0aHViLmlvL3N5bnRheC1oaWdobGlnaHRpbmcvYXRlbGllci1zY2hlbWVzL2ZvcmVzdCknLFxuICBiYXNlMDA6ICcjMWIxOTE4JyxcbiAgYmFzZTAxOiAnIzJjMjQyMScsXG4gIGJhc2UwMjogJyM2ODYxNWUnLFxuICBiYXNlMDM6ICcjNzY2ZTZiJyxcbiAgYmFzZTA0OiAnIzljOTQ5MScsXG4gIGJhc2UwNTogJyNhOGExOWYnLFxuICBiYXNlMDY6ICcjZTZlMmUwJyxcbiAgYmFzZTA3OiAnI2YxZWZlZScsXG4gIGJhc2UwODogJyNmMjJjNDAnLFxuICBiYXNlMDk6ICcjZGY1MzIwJyxcbiAgYmFzZTBBOiAnI2Q1OTExYScsXG4gIGJhc2UwQjogJyM1YWI3MzgnLFxuICBiYXNlMEM6ICcjMDBhZDljJyxcbiAgYmFzZTBEOiAnIzQwN2VlNycsXG4gIGJhc2UwRTogJyM2NjY2ZWEnLFxuICBiYXNlMEY6ICcjYzMzZmYzJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYXRlbGllciBoZWF0aCcsXG4gIGF1dGhvcjogJ2JyYW0gZGUgaGFhbiAoaHR0cDovL2F0ZWxpZXJicmFtLmdpdGh1Yi5pby9zeW50YXgtaGlnaGxpZ2h0aW5nL2F0ZWxpZXItc2NoZW1lcy9oZWF0aCknLFxuICBiYXNlMDA6ICcjMWIxODFiJyxcbiAgYmFzZTAxOiAnIzI5MjMyOScsXG4gIGJhc2UwMjogJyM2OTVkNjknLFxuICBiYXNlMDM6ICcjNzc2OTc3JyxcbiAgYmFzZTA0OiAnIzllOGY5ZScsXG4gIGJhc2UwNTogJyNhYjliYWInLFxuICBiYXNlMDY6ICcjZDhjYWQ4JyxcbiAgYmFzZTA3OiAnI2Y3ZjNmNycsXG4gIGJhc2UwODogJyNjYTQwMmInLFxuICBiYXNlMDk6ICcjYTY1OTI2JyxcbiAgYmFzZTBBOiAnI2JiOGEzNScsXG4gIGJhc2UwQjogJyMzNzlhMzcnLFxuICBiYXNlMEM6ICcjMTU5MzkzJyxcbiAgYmFzZTBEOiAnIzUxNmFlYycsXG4gIGJhc2UwRTogJyM3YjU5YzAnLFxuICBiYXNlMEY6ICcjY2MzM2NjJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYXRlbGllciBsYWtlc2lkZScsXG4gIGF1dGhvcjogJ2JyYW0gZGUgaGFhbiAoaHR0cDovL2F0ZWxpZXJicmFtLmdpdGh1Yi5pby9zeW50YXgtaGlnaGxpZ2h0aW5nL2F0ZWxpZXItc2NoZW1lcy9sYWtlc2lkZS8pJyxcbiAgYmFzZTAwOiAnIzE2MWIxZCcsXG4gIGJhc2UwMTogJyMxZjI5MmUnLFxuICBiYXNlMDI6ICcjNTE2ZDdiJyxcbiAgYmFzZTAzOiAnIzVhN2I4YycsXG4gIGJhc2UwNDogJyM3MTk1YTgnLFxuICBiYXNlMDU6ICcjN2VhMmI0JyxcbiAgYmFzZTA2OiAnI2MxZTRmNicsXG4gIGJhc2UwNzogJyNlYmY4ZmYnLFxuICBiYXNlMDg6ICcjZDIyZDcyJyxcbiAgYmFzZTA5OiAnIzkzNWMyNScsXG4gIGJhc2UwQTogJyM4YThhMGYnLFxuICBiYXNlMEI6ICcjNTY4YzNiJyxcbiAgYmFzZTBDOiAnIzJkOGY2ZicsXG4gIGJhc2UwRDogJyMyNTdmYWQnLFxuICBiYXNlMEU6ICcjNWQ1ZGIxJyxcbiAgYmFzZTBGOiAnI2I3MmRkMidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2F0ZWxpZXIgc2Vhc2lkZScsXG4gIGF1dGhvcjogJ2JyYW0gZGUgaGFhbiAoaHR0cDovL2F0ZWxpZXJicmFtLmdpdGh1Yi5pby9zeW50YXgtaGlnaGxpZ2h0aW5nL2F0ZWxpZXItc2NoZW1lcy9zZWFzaWRlLyknLFxuICBiYXNlMDA6ICcjMTMxNTEzJyxcbiAgYmFzZTAxOiAnIzI0MjkyNCcsXG4gIGJhc2UwMjogJyM1ZTZlNWUnLFxuICBiYXNlMDM6ICcjNjg3ZDY4JyxcbiAgYmFzZTA0OiAnIzgwOTk4MCcsXG4gIGJhc2UwNTogJyM4Y2E2OGMnLFxuICBiYXNlMDY6ICcjY2ZlOGNmJyxcbiAgYmFzZTA3OiAnI2YwZmZmMCcsXG4gIGJhc2UwODogJyNlNjE5M2MnLFxuICBiYXNlMDk6ICcjODc3MTFkJyxcbiAgYmFzZTBBOiAnI2MzYzMyMicsXG4gIGJhc2UwQjogJyMyOWEzMjknLFxuICBiYXNlMEM6ICcjMTk5OWIzJyxcbiAgYmFzZTBEOiAnIzNkNjJmNScsXG4gIGJhc2UwRTogJyNhZDJiZWUnLFxuICBiYXNlMEY6ICcjZTYxOWMzJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYmVzcGluJyxcbiAgYXV0aG9yOiAnamFuIHQuIHNvdHQnLFxuICBiYXNlMDA6ICcjMjgyMTFjJyxcbiAgYmFzZTAxOiAnIzM2MzEyZScsXG4gIGJhc2UwMjogJyM1ZTVkNWMnLFxuICBiYXNlMDM6ICcjNjY2NjY2JyxcbiAgYmFzZTA0OiAnIzc5Nzk3NycsXG4gIGJhc2UwNTogJyM4YTg5ODYnLFxuICBiYXNlMDY6ICcjOWQ5Yjk3JyxcbiAgYmFzZTA3OiAnI2JhYWU5ZScsXG4gIGJhc2UwODogJyNjZjZhNGMnLFxuICBiYXNlMDk6ICcjY2Y3ZDM0JyxcbiAgYmFzZTBBOiAnI2Y5ZWU5OCcsXG4gIGJhc2UwQjogJyM1NGJlMGQnLFxuICBiYXNlMEM6ICcjYWZjNGRiJyxcbiAgYmFzZTBEOiAnIzVlYTZlYScsXG4gIGJhc2UwRTogJyM5Yjg1OWQnLFxuICBiYXNlMEY6ICcjOTM3MTIxJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYnJld2VyJyxcbiAgYXV0aG9yOiAndGltb3Row6llIHBvaXNvdCAoaHR0cDovL2dpdGh1Yi5jb20vdHBvaXNvdCknLFxuICBiYXNlMDA6ICcjMGMwZDBlJyxcbiAgYmFzZTAxOiAnIzJlMmYzMCcsXG4gIGJhc2UwMjogJyM1MTUyNTMnLFxuICBiYXNlMDM6ICcjNzM3NDc1JyxcbiAgYmFzZTA0OiAnIzk1OTY5NycsXG4gIGJhc2UwNTogJyNiN2I4YjknLFxuICBiYXNlMDY6ICcjZGFkYmRjJyxcbiAgYmFzZTA3OiAnI2ZjZmRmZScsXG4gIGJhc2UwODogJyNlMzFhMWMnLFxuICBiYXNlMDk6ICcjZTY1NTBkJyxcbiAgYmFzZTBBOiAnI2RjYTA2MCcsXG4gIGJhc2UwQjogJyMzMWEzNTQnLFxuICBiYXNlMEM6ICcjODBiMWQzJyxcbiAgYmFzZTBEOiAnIzMxODJiZCcsXG4gIGJhc2UwRTogJyM3NTZiYjEnLFxuICBiYXNlMEY6ICcjYjE1OTI4J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYnJpZ2h0JyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzAwMDAwMCcsXG4gIGJhc2UwMTogJyMzMDMwMzAnLFxuICBiYXNlMDI6ICcjNTA1MDUwJyxcbiAgYmFzZTAzOiAnI2IwYjBiMCcsXG4gIGJhc2UwNDogJyNkMGQwZDAnLFxuICBiYXNlMDU6ICcjZTBlMGUwJyxcbiAgYmFzZTA2OiAnI2Y1ZjVmNScsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjZmIwMTIwJyxcbiAgYmFzZTA5OiAnI2ZjNmQyNCcsXG4gIGJhc2UwQTogJyNmZGEzMzEnLFxuICBiYXNlMEI6ICcjYTFjNjU5JyxcbiAgYmFzZTBDOiAnIzc2YzdiNycsXG4gIGJhc2UwRDogJyM2ZmIzZDInLFxuICBiYXNlMEU6ICcjZDM4MWMzJyxcbiAgYmFzZTBGOiAnI2JlNjQzYydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2NoYWxrJyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzE1MTUxNScsXG4gIGJhc2UwMTogJyMyMDIwMjAnLFxuICBiYXNlMDI6ICcjMzAzMDMwJyxcbiAgYmFzZTAzOiAnIzUwNTA1MCcsXG4gIGJhc2UwNDogJyNiMGIwYjAnLFxuICBiYXNlMDU6ICcjZDBkMGQwJyxcbiAgYmFzZTA2OiAnI2UwZTBlMCcsXG4gIGJhc2UwNzogJyNmNWY1ZjUnLFxuICBiYXNlMDg6ICcjZmI5ZmIxJyxcbiAgYmFzZTA5OiAnI2VkYTk4NycsXG4gIGJhc2UwQTogJyNkZGIyNmYnLFxuICBiYXNlMEI6ICcjYWNjMjY3JyxcbiAgYmFzZTBDOiAnIzEyY2ZjMCcsXG4gIGJhc2UwRDogJyM2ZmMyZWYnLFxuICBiYXNlMEU6ICcjZTFhM2VlJyxcbiAgYmFzZTBGOiAnI2RlYWY4Zidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2NvZGVzY2hvb2wnLFxuICBhdXRob3I6ICdicmV0dG9mODYnLFxuICBiYXNlMDA6ICcjMjMyYzMxJyxcbiAgYmFzZTAxOiAnIzFjMzY1NycsXG4gIGJhc2UwMjogJyMyYTM0M2EnLFxuICBiYXNlMDM6ICcjM2Y0OTQ0JyxcbiAgYmFzZTA0OiAnIzg0ODk4YycsXG4gIGJhc2UwNTogJyM5ZWE3YTYnLFxuICBiYXNlMDY6ICcjYTdjZmEzJyxcbiAgYmFzZTA3OiAnI2I1ZDhmNicsXG4gIGJhc2UwODogJyMyYTU0OTEnLFxuICBiYXNlMDk6ICcjNDM4MjBkJyxcbiAgYmFzZTBBOiAnI2EwM2IxZScsXG4gIGJhc2UwQjogJyMyMzc5ODYnLFxuICBiYXNlMEM6ICcjYjAyZjMwJyxcbiAgYmFzZTBEOiAnIzQ4NGQ3OScsXG4gIGJhc2UwRTogJyNjNTk4MjAnLFxuICBiYXNlMEY6ICcjYzk4MzQ0J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnY29sb3JzJyxcbiAgYXV0aG9yOiAnbXJtcnMgKGh0dHA6Ly9jbHJzLmNjKScsXG4gIGJhc2UwMDogJyMxMTExMTEnLFxuICBiYXNlMDE6ICcjMzMzMzMzJyxcbiAgYmFzZTAyOiAnIzU1NTU1NScsXG4gIGJhc2UwMzogJyM3Nzc3NzcnLFxuICBiYXNlMDQ6ICcjOTk5OTk5JyxcbiAgYmFzZTA1OiAnI2JiYmJiYicsXG4gIGJhc2UwNjogJyNkZGRkZGQnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI2ZmNDEzNicsXG4gIGJhc2UwOTogJyNmZjg1MWInLFxuICBiYXNlMEE6ICcjZmZkYzAwJyxcbiAgYmFzZTBCOiAnIzJlY2M0MCcsXG4gIGJhc2UwQzogJyM3ZmRiZmYnLFxuICBiYXNlMEQ6ICcjMDA3NGQ5JyxcbiAgYmFzZTBFOiAnI2IxMGRjOScsXG4gIGJhc2UwRjogJyM4NTE0NGInXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdkZWZhdWx0JyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzE4MTgxOCcsXG4gIGJhc2UwMTogJyMyODI4MjgnLFxuICBiYXNlMDI6ICcjMzgzODM4JyxcbiAgYmFzZTAzOiAnIzU4NTg1OCcsXG4gIGJhc2UwNDogJyNiOGI4YjgnLFxuICBiYXNlMDU6ICcjZDhkOGQ4JyxcbiAgYmFzZTA2OiAnI2U4ZThlOCcsXG4gIGJhc2UwNzogJyNmOGY4ZjgnLFxuICBiYXNlMDg6ICcjYWI0NjQyJyxcbiAgYmFzZTA5OiAnI2RjOTY1NicsXG4gIGJhc2UwQTogJyNmN2NhODgnLFxuICBiYXNlMEI6ICcjYTFiNTZjJyxcbiAgYmFzZTBDOiAnIzg2YzFiOScsXG4gIGJhc2UwRDogJyM3Y2FmYzInLFxuICBiYXNlMEU6ICcjYmE4YmFmJyxcbiAgYmFzZTBGOiAnI2ExNjk0Nidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2VpZ2h0aWVzJyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzJkMmQyZCcsXG4gIGJhc2UwMTogJyMzOTM5MzknLFxuICBiYXNlMDI6ICcjNTE1MTUxJyxcbiAgYmFzZTAzOiAnIzc0NzM2OScsXG4gIGJhc2UwNDogJyNhMDlmOTMnLFxuICBiYXNlMDU6ICcjZDNkMGM4JyxcbiAgYmFzZTA2OiAnI2U4ZTZkZicsXG4gIGJhc2UwNzogJyNmMmYwZWMnLFxuICBiYXNlMDg6ICcjZjI3NzdhJyxcbiAgYmFzZTA5OiAnI2Y5OTE1NycsXG4gIGJhc2UwQTogJyNmZmNjNjYnLFxuICBiYXNlMEI6ICcjOTljYzk5JyxcbiAgYmFzZTBDOiAnIzY2Y2NjYycsXG4gIGJhc2UwRDogJyM2Njk5Y2MnLFxuICBiYXNlMEU6ICcjY2M5OWNjJyxcbiAgYmFzZTBGOiAnI2QyN2I1Mydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2VtYmVycycsXG4gIGF1dGhvcjogJ2phbm5payBzaWViZXJ0IChodHRwczovL2dpdGh1Yi5jb20vamFubmlrcyknLFxuICBiYXNlMDA6ICcjMTYxMzBGJyxcbiAgYmFzZTAxOiAnIzJDMjYyMCcsXG4gIGJhc2UwMjogJyM0MzNCMzInLFxuICBiYXNlMDM6ICcjNUE1MDQ3JyxcbiAgYmFzZTA0OiAnIzhBODA3NScsXG4gIGJhc2UwNTogJyNBMzlBOTAnLFxuICBiYXNlMDY6ICcjQkVCNkFFJyxcbiAgYmFzZTA3OiAnI0RCRDZEMScsXG4gIGJhc2UwODogJyM4MjZENTcnLFxuICBiYXNlMDk6ICcjODI4MjU3JyxcbiAgYmFzZTBBOiAnIzZEODI1NycsXG4gIGJhc2UwQjogJyM1NzgyNkQnLFxuICBiYXNlMEM6ICcjNTc2RDgyJyxcbiAgYmFzZTBEOiAnIzZENTc4MicsXG4gIGJhc2UwRTogJyM4MjU3NkQnLFxuICBiYXNlMEY6ICcjODI1NzU3J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnZmxhdCcsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMyQzNFNTAnLFxuICBiYXNlMDE6ICcjMzQ0OTVFJyxcbiAgYmFzZTAyOiAnIzdGOEM4RCcsXG4gIGJhc2UwMzogJyM5NUE1QTYnLFxuICBiYXNlMDQ6ICcjQkRDM0M3JyxcbiAgYmFzZTA1OiAnI2UwZTBlMCcsXG4gIGJhc2UwNjogJyNmNWY1ZjUnLFxuICBiYXNlMDc6ICcjRUNGMEYxJyxcbiAgYmFzZTA4OiAnI0U3NEMzQycsXG4gIGJhc2UwOTogJyNFNjdFMjInLFxuICBiYXNlMEE6ICcjRjFDNDBGJyxcbiAgYmFzZTBCOiAnIzJFQ0M3MScsXG4gIGJhc2UwQzogJyMxQUJDOUMnLFxuICBiYXNlMEQ6ICcjMzQ5OERCJyxcbiAgYmFzZTBFOiAnIzlCNTlCNicsXG4gIGJhc2UwRjogJyNiZTY0M2MnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdnb29nbGUnLFxuICBhdXRob3I6ICdzZXRoIHdyaWdodCAoaHR0cDovL3NldGhhd3JpZ2h0LmNvbSknLFxuICBiYXNlMDA6ICcjMWQxZjIxJyxcbiAgYmFzZTAxOiAnIzI4MmEyZScsXG4gIGJhc2UwMjogJyMzNzNiNDEnLFxuICBiYXNlMDM6ICcjOTY5ODk2JyxcbiAgYmFzZTA0OiAnI2I0YjdiNCcsXG4gIGJhc2UwNTogJyNjNWM4YzYnLFxuICBiYXNlMDY6ICcjZTBlMGUwJyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNDQzM0MkInLFxuICBiYXNlMDk6ICcjRjk2QTM4JyxcbiAgYmFzZTBBOiAnI0ZCQTkyMicsXG4gIGJhc2UwQjogJyMxOTg4NDQnLFxuICBiYXNlMEM6ICcjMzk3MUVEJyxcbiAgYmFzZTBEOiAnIzM5NzFFRCcsXG4gIGJhc2UwRTogJyNBMzZBQzcnLFxuICBiYXNlMEY6ICcjMzk3MUVEJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnZ3JheXNjYWxlJyxcbiAgYXV0aG9yOiAnYWxleGFuZHJlIGdhdmlvbGkgKGh0dHBzOi8vZ2l0aHViLmNvbS9hbGV4eDIvKScsXG4gIGJhc2UwMDogJyMxMDEwMTAnLFxuICBiYXNlMDE6ICcjMjUyNTI1JyxcbiAgYmFzZTAyOiAnIzQ2NDY0NicsXG4gIGJhc2UwMzogJyM1MjUyNTInLFxuICBiYXNlMDQ6ICcjYWJhYmFiJyxcbiAgYmFzZTA1OiAnI2I5YjliOScsXG4gIGJhc2UwNjogJyNlM2UzZTMnLFxuICBiYXNlMDc6ICcjZjdmN2Y3JyxcbiAgYmFzZTA4OiAnIzdjN2M3YycsXG4gIGJhc2UwOTogJyM5OTk5OTknLFxuICBiYXNlMEE6ICcjYTBhMGEwJyxcbiAgYmFzZTBCOiAnIzhlOGU4ZScsXG4gIGJhc2UwQzogJyM4Njg2ODYnLFxuICBiYXNlMEQ6ICcjNjg2ODY4JyxcbiAgYmFzZTBFOiAnIzc0NzQ3NCcsXG4gIGJhc2UwRjogJyM1ZTVlNWUnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdncmVlbiBzY3JlZW4nLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMDAxMTAwJyxcbiAgYmFzZTAxOiAnIzAwMzMwMCcsXG4gIGJhc2UwMjogJyMwMDU1MDAnLFxuICBiYXNlMDM6ICcjMDA3NzAwJyxcbiAgYmFzZTA0OiAnIzAwOTkwMCcsXG4gIGJhc2UwNTogJyMwMGJiMDAnLFxuICBiYXNlMDY6ICcjMDBkZDAwJyxcbiAgYmFzZTA3OiAnIzAwZmYwMCcsXG4gIGJhc2UwODogJyMwMDc3MDAnLFxuICBiYXNlMDk6ICcjMDA5OTAwJyxcbiAgYmFzZTBBOiAnIzAwNzcwMCcsXG4gIGJhc2UwQjogJyMwMGJiMDAnLFxuICBiYXNlMEM6ICcjMDA1NTAwJyxcbiAgYmFzZTBEOiAnIzAwOTkwMCcsXG4gIGJhc2UwRTogJyMwMGJiMDAnLFxuICBiYXNlMEY6ICcjMDA1NTAwJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnaGFybW9uaWMxNicsXG4gIGF1dGhvcjogJ2phbm5payBzaWViZXJ0IChodHRwczovL2dpdGh1Yi5jb20vamFubmlrcyknLFxuICBiYXNlMDA6ICcjMGIxYzJjJyxcbiAgYmFzZTAxOiAnIzIyM2I1NCcsXG4gIGJhc2UwMjogJyM0MDVjNzknLFxuICBiYXNlMDM6ICcjNjI3ZTk5JyxcbiAgYmFzZTA0OiAnI2FhYmNjZScsXG4gIGJhc2UwNTogJyNjYmQ2ZTInLFxuICBiYXNlMDY6ICcjZTVlYmYxJyxcbiAgYmFzZTA3OiAnI2Y3ZjlmYicsXG4gIGJhc2UwODogJyNiZjhiNTYnLFxuICBiYXNlMDk6ICcjYmZiZjU2JyxcbiAgYmFzZTBBOiAnIzhiYmY1NicsXG4gIGJhc2UwQjogJyM1NmJmOGInLFxuICBiYXNlMEM6ICcjNTY4YmJmJyxcbiAgYmFzZTBEOiAnIzhiNTZiZicsXG4gIGJhc2UwRTogJyNiZjU2OGInLFxuICBiYXNlMEY6ICcjYmY1NjU2J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnaG9wc2NvdGNoJyxcbiAgYXV0aG9yOiAnamFuIHQuIHNvdHQnLFxuICBiYXNlMDA6ICcjMzIyOTMxJyxcbiAgYmFzZTAxOiAnIzQzM2I0MicsXG4gIGJhc2UwMjogJyM1YzU0NWInLFxuICBiYXNlMDM6ICcjNzk3Mzc5JyxcbiAgYmFzZTA0OiAnIzk4OTQ5OCcsXG4gIGJhc2UwNTogJyNiOWI1YjgnLFxuICBiYXNlMDY6ICcjZDVkM2Q1JyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNkZDQ2NGMnLFxuICBiYXNlMDk6ICcjZmQ4YjE5JyxcbiAgYmFzZTBBOiAnI2ZkY2M1OScsXG4gIGJhc2UwQjogJyM4ZmMxM2UnLFxuICBiYXNlMEM6ICcjMTQ5YjkzJyxcbiAgYmFzZTBEOiAnIzEyOTBiZicsXG4gIGJhc2UwRTogJyNjODVlN2MnLFxuICBiYXNlMEY6ICcjYjMzNTA4J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlKG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqWydkZWZhdWx0J10gOiBvYmo7IH1cblxudmFyIF90aHJlZXplcm90d29mb3VyID0gcmVxdWlyZSgnLi90aHJlZXplcm90d29mb3VyJyk7XG5cbmV4cG9ydHMudGhyZWV6ZXJvdHdvZm91ciA9IF9pbnRlcm9wUmVxdWlyZShfdGhyZWV6ZXJvdHdvZm91cik7XG5cbnZhciBfYXBhdGh5ID0gcmVxdWlyZSgnLi9hcGF0aHknKTtcblxuZXhwb3J0cy5hcGF0aHkgPSBfaW50ZXJvcFJlcXVpcmUoX2FwYXRoeSk7XG5cbnZhciBfYXNoZXMgPSByZXF1aXJlKCcuL2FzaGVzJyk7XG5cbmV4cG9ydHMuYXNoZXMgPSBfaW50ZXJvcFJlcXVpcmUoX2FzaGVzKTtcblxudmFyIF9hdGVsaWVyRHVuZSA9IHJlcXVpcmUoJy4vYXRlbGllci1kdW5lJyk7XG5cbmV4cG9ydHMuYXRlbGllckR1bmUgPSBfaW50ZXJvcFJlcXVpcmUoX2F0ZWxpZXJEdW5lKTtcblxudmFyIF9hdGVsaWVyRm9yZXN0ID0gcmVxdWlyZSgnLi9hdGVsaWVyLWZvcmVzdCcpO1xuXG5leHBvcnRzLmF0ZWxpZXJGb3Jlc3QgPSBfaW50ZXJvcFJlcXVpcmUoX2F0ZWxpZXJGb3Jlc3QpO1xuXG52YXIgX2F0ZWxpZXJIZWF0aCA9IHJlcXVpcmUoJy4vYXRlbGllci1oZWF0aCcpO1xuXG5leHBvcnRzLmF0ZWxpZXJIZWF0aCA9IF9pbnRlcm9wUmVxdWlyZShfYXRlbGllckhlYXRoKTtcblxudmFyIF9hdGVsaWVyTGFrZXNpZGUgPSByZXF1aXJlKCcuL2F0ZWxpZXItbGFrZXNpZGUnKTtcblxuZXhwb3J0cy5hdGVsaWVyTGFrZXNpZGUgPSBfaW50ZXJvcFJlcXVpcmUoX2F0ZWxpZXJMYWtlc2lkZSk7XG5cbnZhciBfYXRlbGllclNlYXNpZGUgPSByZXF1aXJlKCcuL2F0ZWxpZXItc2Vhc2lkZScpO1xuXG5leHBvcnRzLmF0ZWxpZXJTZWFzaWRlID0gX2ludGVyb3BSZXF1aXJlKF9hdGVsaWVyU2Vhc2lkZSk7XG5cbnZhciBfYmVzcGluID0gcmVxdWlyZSgnLi9iZXNwaW4nKTtcblxuZXhwb3J0cy5iZXNwaW4gPSBfaW50ZXJvcFJlcXVpcmUoX2Jlc3Bpbik7XG5cbnZhciBfYnJld2VyID0gcmVxdWlyZSgnLi9icmV3ZXInKTtcblxuZXhwb3J0cy5icmV3ZXIgPSBfaW50ZXJvcFJlcXVpcmUoX2JyZXdlcik7XG5cbnZhciBfYnJpZ2h0ID0gcmVxdWlyZSgnLi9icmlnaHQnKTtcblxuZXhwb3J0cy5icmlnaHQgPSBfaW50ZXJvcFJlcXVpcmUoX2JyaWdodCk7XG5cbnZhciBfY2hhbGsgPSByZXF1aXJlKCcuL2NoYWxrJyk7XG5cbmV4cG9ydHMuY2hhbGsgPSBfaW50ZXJvcFJlcXVpcmUoX2NoYWxrKTtcblxudmFyIF9jb2Rlc2Nob29sID0gcmVxdWlyZSgnLi9jb2Rlc2Nob29sJyk7XG5cbmV4cG9ydHMuY29kZXNjaG9vbCA9IF9pbnRlcm9wUmVxdWlyZShfY29kZXNjaG9vbCk7XG5cbnZhciBfY29sb3JzID0gcmVxdWlyZSgnLi9jb2xvcnMnKTtcblxuZXhwb3J0cy5jb2xvcnMgPSBfaW50ZXJvcFJlcXVpcmUoX2NvbG9ycyk7XG5cbnZhciBfZGVmYXVsdCA9IHJlcXVpcmUoJy4vZGVmYXVsdCcpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBfaW50ZXJvcFJlcXVpcmUoX2RlZmF1bHQpO1xuXG52YXIgX2VpZ2h0aWVzID0gcmVxdWlyZSgnLi9laWdodGllcycpO1xuXG5leHBvcnRzLmVpZ2h0aWVzID0gX2ludGVyb3BSZXF1aXJlKF9laWdodGllcyk7XG5cbnZhciBfZW1iZXJzID0gcmVxdWlyZSgnLi9lbWJlcnMnKTtcblxuZXhwb3J0cy5lbWJlcnMgPSBfaW50ZXJvcFJlcXVpcmUoX2VtYmVycyk7XG5cbnZhciBfZmxhdCA9IHJlcXVpcmUoJy4vZmxhdCcpO1xuXG5leHBvcnRzLmZsYXQgPSBfaW50ZXJvcFJlcXVpcmUoX2ZsYXQpO1xuXG52YXIgX2dvb2dsZSA9IHJlcXVpcmUoJy4vZ29vZ2xlJyk7XG5cbmV4cG9ydHMuZ29vZ2xlID0gX2ludGVyb3BSZXF1aXJlKF9nb29nbGUpO1xuXG52YXIgX2dyYXlzY2FsZSA9IHJlcXVpcmUoJy4vZ3JheXNjYWxlJyk7XG5cbmV4cG9ydHMuZ3JheXNjYWxlID0gX2ludGVyb3BSZXF1aXJlKF9ncmF5c2NhbGUpO1xuXG52YXIgX2dyZWVuc2NyZWVuID0gcmVxdWlyZSgnLi9ncmVlbnNjcmVlbicpO1xuXG5leHBvcnRzLmdyZWVuc2NyZWVuID0gX2ludGVyb3BSZXF1aXJlKF9ncmVlbnNjcmVlbik7XG5cbnZhciBfaGFybW9uaWMgPSByZXF1aXJlKCcuL2hhcm1vbmljJyk7XG5cbmV4cG9ydHMuaGFybW9uaWMgPSBfaW50ZXJvcFJlcXVpcmUoX2hhcm1vbmljKTtcblxudmFyIF9ob3BzY290Y2ggPSByZXF1aXJlKCcuL2hvcHNjb3RjaCcpO1xuXG5leHBvcnRzLmhvcHNjb3RjaCA9IF9pbnRlcm9wUmVxdWlyZShfaG9wc2NvdGNoKTtcblxudmFyIF9pc290b3BlID0gcmVxdWlyZSgnLi9pc290b3BlJyk7XG5cbmV4cG9ydHMuaXNvdG9wZSA9IF9pbnRlcm9wUmVxdWlyZShfaXNvdG9wZSk7XG5cbnZhciBfbWFycmFrZXNoID0gcmVxdWlyZSgnLi9tYXJyYWtlc2gnKTtcblxuZXhwb3J0cy5tYXJyYWtlc2ggPSBfaW50ZXJvcFJlcXVpcmUoX21hcnJha2VzaCk7XG5cbnZhciBfbW9jaGEgPSByZXF1aXJlKCcuL21vY2hhJyk7XG5cbmV4cG9ydHMubW9jaGEgPSBfaW50ZXJvcFJlcXVpcmUoX21vY2hhKTtcblxudmFyIF9tb25va2FpID0gcmVxdWlyZSgnLi9tb25va2FpJyk7XG5cbmV4cG9ydHMubW9ub2thaSA9IF9pbnRlcm9wUmVxdWlyZShfbW9ub2thaSk7XG5cbnZhciBfb2NlYW4gPSByZXF1aXJlKCcuL29jZWFuJyk7XG5cbmV4cG9ydHMub2NlYW4gPSBfaW50ZXJvcFJlcXVpcmUoX29jZWFuKTtcblxudmFyIF9wYXJhaXNvID0gcmVxdWlyZSgnLi9wYXJhaXNvJyk7XG5cbmV4cG9ydHMucGFyYWlzbyA9IF9pbnRlcm9wUmVxdWlyZShfcGFyYWlzbyk7XG5cbnZhciBfcG9wID0gcmVxdWlyZSgnLi9wb3AnKTtcblxuZXhwb3J0cy5wb3AgPSBfaW50ZXJvcFJlcXVpcmUoX3BvcCk7XG5cbnZhciBfcmFpbHNjYXN0cyA9IHJlcXVpcmUoJy4vcmFpbHNjYXN0cycpO1xuXG5leHBvcnRzLnJhaWxzY2FzdHMgPSBfaW50ZXJvcFJlcXVpcmUoX3JhaWxzY2FzdHMpO1xuXG52YXIgX3NoYXBlc2hpZnRlciA9IHJlcXVpcmUoJy4vc2hhcGVzaGlmdGVyJyk7XG5cbmV4cG9ydHMuc2hhcGVzaGlmdGVyID0gX2ludGVyb3BSZXF1aXJlKF9zaGFwZXNoaWZ0ZXIpO1xuXG52YXIgX3NvbGFyaXplZCA9IHJlcXVpcmUoJy4vc29sYXJpemVkJyk7XG5cbmV4cG9ydHMuc29sYXJpemVkID0gX2ludGVyb3BSZXF1aXJlKF9zb2xhcml6ZWQpO1xuXG52YXIgX3N1bW1lcmZydWl0ID0gcmVxdWlyZSgnLi9zdW1tZXJmcnVpdCcpO1xuXG5leHBvcnRzLnN1bW1lcmZydWl0ID0gX2ludGVyb3BSZXF1aXJlKF9zdW1tZXJmcnVpdCk7XG5cbnZhciBfdG9tb3Jyb3cgPSByZXF1aXJlKCcuL3RvbW9ycm93Jyk7XG5cbmV4cG9ydHMudG9tb3Jyb3cgPSBfaW50ZXJvcFJlcXVpcmUoX3RvbW9ycm93KTtcblxudmFyIF90dWJlID0gcmVxdWlyZSgnLi90dWJlJyk7XG5cbmV4cG9ydHMudHViZSA9IF9pbnRlcm9wUmVxdWlyZShfdHViZSk7XG5cbnZhciBfdHdpbGlnaHQgPSByZXF1aXJlKCcuL3R3aWxpZ2h0Jyk7XG5cbmV4cG9ydHMudHdpbGlnaHQgPSBfaW50ZXJvcFJlcXVpcmUoX3R3aWxpZ2h0KTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2lzb3RvcGUnLFxuICBhdXRob3I6ICdqYW4gdC4gc290dCcsXG4gIGJhc2UwMDogJyMwMDAwMDAnLFxuICBiYXNlMDE6ICcjNDA0MDQwJyxcbiAgYmFzZTAyOiAnIzYwNjA2MCcsXG4gIGJhc2UwMzogJyM4MDgwODAnLFxuICBiYXNlMDQ6ICcjYzBjMGMwJyxcbiAgYmFzZTA1OiAnI2QwZDBkMCcsXG4gIGJhc2UwNjogJyNlMGUwZTAnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI2ZmMDAwMCcsXG4gIGJhc2UwOTogJyNmZjk5MDAnLFxuICBiYXNlMEE6ICcjZmYwMDk5JyxcbiAgYmFzZTBCOiAnIzMzZmYwMCcsXG4gIGJhc2UwQzogJyMwMGZmZmYnLFxuICBiYXNlMEQ6ICcjMDA2NmZmJyxcbiAgYmFzZTBFOiAnI2NjMDBmZicsXG4gIGJhc2UwRjogJyMzMzAwZmYnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdtYXJyYWtlc2gnLFxuICBhdXRob3I6ICdhbGV4YW5kcmUgZ2F2aW9saSAoaHR0cDovL2dpdGh1Yi5jb20vYWxleHgyLyknLFxuICBiYXNlMDA6ICcjMjAxNjAyJyxcbiAgYmFzZTAxOiAnIzMwMmUwMCcsXG4gIGJhc2UwMjogJyM1ZjViMTcnLFxuICBiYXNlMDM6ICcjNmM2ODIzJyxcbiAgYmFzZTA0OiAnIzg2ODEzYicsXG4gIGJhc2UwNTogJyM5NDhlNDgnLFxuICBiYXNlMDY6ICcjY2NjMzdhJyxcbiAgYmFzZTA3OiAnI2ZhZjBhNScsXG4gIGJhc2UwODogJyNjMzUzNTknLFxuICBiYXNlMDk6ICcjYjM2MTQ0JyxcbiAgYmFzZTBBOiAnI2E4ODMzOScsXG4gIGJhc2UwQjogJyMxODk3NGUnLFxuICBiYXNlMEM6ICcjNzVhNzM4JyxcbiAgYmFzZTBEOiAnIzQ3N2NhMScsXG4gIGJhc2UwRTogJyM4ODY4YjMnLFxuICBiYXNlMEY6ICcjYjM1ODhlJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnbW9jaGEnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjM0IzMjI4JyxcbiAgYmFzZTAxOiAnIzUzNDYzNicsXG4gIGJhc2UwMjogJyM2NDUyNDAnLFxuICBiYXNlMDM6ICcjN2U3MDVhJyxcbiAgYmFzZTA0OiAnI2I4YWZhZCcsXG4gIGJhc2UwNTogJyNkMGM4YzYnLFxuICBiYXNlMDY6ICcjZTllMWRkJyxcbiAgYmFzZTA3OiAnI2Y1ZWVlYicsXG4gIGJhc2UwODogJyNjYjYwNzcnLFxuICBiYXNlMDk6ICcjZDI4YjcxJyxcbiAgYmFzZTBBOiAnI2Y0YmM4NycsXG4gIGJhc2UwQjogJyNiZWI1NWInLFxuICBiYXNlMEM6ICcjN2JiZGE0JyxcbiAgYmFzZTBEOiAnIzhhYjNiNScsXG4gIGJhc2UwRTogJyNhODliYjknLFxuICBiYXNlMEY6ICcjYmI5NTg0J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnbW9ub2thaScsXG4gIGF1dGhvcjogJ3dpbWVyIGhhemVuYmVyZyAoaHR0cDovL3d3dy5tb25va2FpLm5sKScsXG4gIGJhc2UwMDogJyMyNzI4MjInLFxuICBiYXNlMDE6ICcjMzgzODMwJyxcbiAgYmFzZTAyOiAnIzQ5NDgzZScsXG4gIGJhc2UwMzogJyM3NTcxNWUnLFxuICBiYXNlMDQ6ICcjYTU5Zjg1JyxcbiAgYmFzZTA1OiAnI2Y4ZjhmMicsXG4gIGJhc2UwNjogJyNmNWY0ZjEnLFxuICBiYXNlMDc6ICcjZjlmOGY1JyxcbiAgYmFzZTA4OiAnI2Y5MjY3MicsXG4gIGJhc2UwOTogJyNmZDk3MWYnLFxuICBiYXNlMEE6ICcjZjRiZjc1JyxcbiAgYmFzZTBCOiAnI2E2ZTIyZScsXG4gIGJhc2UwQzogJyNhMWVmZTQnLFxuICBiYXNlMEQ6ICcjNjZkOWVmJyxcbiAgYmFzZTBFOiAnI2FlODFmZicsXG4gIGJhc2UwRjogJyNjYzY2MzMnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdvY2VhbicsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMyYjMwM2InLFxuICBiYXNlMDE6ICcjMzQzZDQ2JyxcbiAgYmFzZTAyOiAnIzRmNWI2NicsXG4gIGJhc2UwMzogJyM2NTczN2UnLFxuICBiYXNlMDQ6ICcjYTdhZGJhJyxcbiAgYmFzZTA1OiAnI2MwYzVjZScsXG4gIGJhc2UwNjogJyNkZmUxZTgnLFxuICBiYXNlMDc6ICcjZWZmMWY1JyxcbiAgYmFzZTA4OiAnI2JmNjE2YScsXG4gIGJhc2UwOTogJyNkMDg3NzAnLFxuICBiYXNlMEE6ICcjZWJjYjhiJyxcbiAgYmFzZTBCOiAnI2EzYmU4YycsXG4gIGJhc2UwQzogJyM5NmI1YjQnLFxuICBiYXNlMEQ6ICcjOGZhMWIzJyxcbiAgYmFzZTBFOiAnI2I0OGVhZCcsXG4gIGJhc2UwRjogJyNhYjc5NjcnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdwYXJhaXNvJyxcbiAgYXV0aG9yOiAnamFuIHQuIHNvdHQnLFxuICBiYXNlMDA6ICcjMmYxZTJlJyxcbiAgYmFzZTAxOiAnIzQxMzIzZicsXG4gIGJhc2UwMjogJyM0ZjQyNGMnLFxuICBiYXNlMDM6ICcjNzc2ZTcxJyxcbiAgYmFzZTA0OiAnIzhkODY4NycsXG4gIGJhc2UwNTogJyNhMzllOWInLFxuICBiYXNlMDY6ICcjYjliNmIwJyxcbiAgYmFzZTA3OiAnI2U3ZTlkYicsXG4gIGJhc2UwODogJyNlZjYxNTUnLFxuICBiYXNlMDk6ICcjZjk5YjE1JyxcbiAgYmFzZTBBOiAnI2ZlYzQxOCcsXG4gIGJhc2UwQjogJyM0OGI2ODUnLFxuICBiYXNlMEM6ICcjNWJjNGJmJyxcbiAgYmFzZTBEOiAnIzA2YjZlZicsXG4gIGJhc2UwRTogJyM4MTViYTQnLFxuICBiYXNlMEY6ICcjZTk2YmE4J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAncG9wJyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzAwMDAwMCcsXG4gIGJhc2UwMTogJyMyMDIwMjAnLFxuICBiYXNlMDI6ICcjMzAzMDMwJyxcbiAgYmFzZTAzOiAnIzUwNTA1MCcsXG4gIGJhc2UwNDogJyNiMGIwYjAnLFxuICBiYXNlMDU6ICcjZDBkMGQwJyxcbiAgYmFzZTA2OiAnI2UwZTBlMCcsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjZWIwMDhhJyxcbiAgYmFzZTA5OiAnI2YyOTMzMycsXG4gIGJhc2UwQTogJyNmOGNhMTInLFxuICBiYXNlMEI6ICcjMzdiMzQ5JyxcbiAgYmFzZTBDOiAnIzAwYWFiYicsXG4gIGJhc2UwRDogJyMwZTVhOTQnLFxuICBiYXNlMEU6ICcjYjMxZThkJyxcbiAgYmFzZTBGOiAnIzdhMmQwMCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3JhaWxzY2FzdHMnLFxuICBhdXRob3I6ICdyeWFuIGJhdGVzIChodHRwOi8vcmFpbHNjYXN0cy5jb20pJyxcbiAgYmFzZTAwOiAnIzJiMmIyYicsXG4gIGJhc2UwMTogJyMyNzI5MzUnLFxuICBiYXNlMDI6ICcjM2E0MDU1JyxcbiAgYmFzZTAzOiAnIzVhNjQ3ZScsXG4gIGJhc2UwNDogJyNkNGNmYzknLFxuICBiYXNlMDU6ICcjZTZlMWRjJyxcbiAgYmFzZTA2OiAnI2Y0ZjFlZCcsXG4gIGJhc2UwNzogJyNmOWY3ZjMnLFxuICBiYXNlMDg6ICcjZGE0OTM5JyxcbiAgYmFzZTA5OiAnI2NjNzgzMycsXG4gIGJhc2UwQTogJyNmZmM2NmQnLFxuICBiYXNlMEI6ICcjYTVjMjYxJyxcbiAgYmFzZTBDOiAnIzUxOWY1MCcsXG4gIGJhc2UwRDogJyM2ZDljYmUnLFxuICBiYXNlMEU6ICcjYjZiM2ViJyxcbiAgYmFzZTBGOiAnI2JjOTQ1OCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3NoYXBlc2hpZnRlcicsXG4gIGF1dGhvcjogJ3R5bGVyIGJlbnppZ2VyIChodHRwOi8vdHliZW56LmNvbSknLFxuICBiYXNlMDA6ICcjMDAwMDAwJyxcbiAgYmFzZTAxOiAnIzA0MDQwNCcsXG4gIGJhc2UwMjogJyMxMDIwMTUnLFxuICBiYXNlMDM6ICcjMzQzNDM0JyxcbiAgYmFzZTA0OiAnIzU1NTU1NScsXG4gIGJhc2UwNTogJyNhYmFiYWInLFxuICBiYXNlMDY6ICcjZTBlMGUwJyxcbiAgYmFzZTA3OiAnI2Y5ZjlmOScsXG4gIGJhc2UwODogJyNlOTJmMmYnLFxuICBiYXNlMDk6ICcjZTA5NDQ4JyxcbiAgYmFzZTBBOiAnI2RkZGQxMycsXG4gIGJhc2UwQjogJyMwZWQ4MzknLFxuICBiYXNlMEM6ICcjMjNlZGRhJyxcbiAgYmFzZTBEOiAnIzNiNDhlMycsXG4gIGJhc2UwRTogJyNmOTk2ZTInLFxuICBiYXNlMEY6ICcjNjk1NDJkJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnc29sYXJpemVkJyxcbiAgYXV0aG9yOiAnZXRoYW4gc2Nob29ub3ZlciAoaHR0cDovL2V0aGFuc2Nob29ub3Zlci5jb20vc29sYXJpemVkKScsXG4gIGJhc2UwMDogJyMwMDJiMzYnLFxuICBiYXNlMDE6ICcjMDczNjQyJyxcbiAgYmFzZTAyOiAnIzU4NmU3NScsXG4gIGJhc2UwMzogJyM2NTdiODMnLFxuICBiYXNlMDQ6ICcjODM5NDk2JyxcbiAgYmFzZTA1OiAnIzkzYTFhMScsXG4gIGJhc2UwNjogJyNlZWU4ZDUnLFxuICBiYXNlMDc6ICcjZmRmNmUzJyxcbiAgYmFzZTA4OiAnI2RjMzIyZicsXG4gIGJhc2UwOTogJyNjYjRiMTYnLFxuICBiYXNlMEE6ICcjYjU4OTAwJyxcbiAgYmFzZTBCOiAnIzg1OTkwMCcsXG4gIGJhc2UwQzogJyMyYWExOTgnLFxuICBiYXNlMEQ6ICcjMjY4YmQyJyxcbiAgYmFzZTBFOiAnIzZjNzFjNCcsXG4gIGJhc2UwRjogJyNkMzM2ODInXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdzdW1tZXJmcnVpdCcsXG4gIGF1dGhvcjogJ2NocmlzdG9waGVyIGNvcmxleSAoaHR0cDovL2NzY29ybGV5LmdpdGh1Yi5pby8pJyxcbiAgYmFzZTAwOiAnIzE1MTUxNScsXG4gIGJhc2UwMTogJyMyMDIwMjAnLFxuICBiYXNlMDI6ICcjMzAzMDMwJyxcbiAgYmFzZTAzOiAnIzUwNTA1MCcsXG4gIGJhc2UwNDogJyNCMEIwQjAnLFxuICBiYXNlMDU6ICcjRDBEMEQwJyxcbiAgYmFzZTA2OiAnI0UwRTBFMCcsXG4gIGJhc2UwNzogJyNGRkZGRkYnLFxuICBiYXNlMDg6ICcjRkYwMDg2JyxcbiAgYmFzZTA5OiAnI0ZEODkwMCcsXG4gIGJhc2UwQTogJyNBQkE4MDAnLFxuICBiYXNlMEI6ICcjMDBDOTE4JyxcbiAgYmFzZTBDOiAnIzFmYWFhYScsXG4gIGJhc2UwRDogJyMzNzc3RTYnLFxuICBiYXNlMEU6ICcjQUQwMEExJyxcbiAgYmFzZTBGOiAnI2NjNjYzMydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3RocmVlemVyb3R3b2ZvdXInLFxuICBhdXRob3I6ICdqYW4gdC4gc290dCAoaHR0cDovL2dpdGh1Yi5jb20vaWRsZWJlcmcpJyxcbiAgYmFzZTAwOiAnIzA5MDMwMCcsXG4gIGJhc2UwMTogJyMzYTM0MzInLFxuICBiYXNlMDI6ICcjNGE0NTQzJyxcbiAgYmFzZTAzOiAnIzVjNTg1NScsXG4gIGJhc2UwNDogJyM4MDdkN2MnLFxuICBiYXNlMDU6ICcjYTVhMmEyJyxcbiAgYmFzZTA2OiAnI2Q2ZDVkNCcsXG4gIGJhc2UwNzogJyNmN2Y3ZjcnLFxuICBiYXNlMDg6ICcjZGIyZDIwJyxcbiAgYmFzZTA5OiAnI2U4YmJkMCcsXG4gIGJhc2UwQTogJyNmZGVkMDInLFxuICBiYXNlMEI6ICcjMDFhMjUyJyxcbiAgYmFzZTBDOiAnI2I1ZTRmNCcsXG4gIGJhc2UwRDogJyMwMWEwZTQnLFxuICBiYXNlMEU6ICcjYTE2YTk0JyxcbiAgYmFzZTBGOiAnI2NkYWI1Mydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3RvbW9ycm93JyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzFkMWYyMScsXG4gIGJhc2UwMTogJyMyODJhMmUnLFxuICBiYXNlMDI6ICcjMzczYjQxJyxcbiAgYmFzZTAzOiAnIzk2OTg5NicsXG4gIGJhc2UwNDogJyNiNGI3YjQnLFxuICBiYXNlMDU6ICcjYzVjOGM2JyxcbiAgYmFzZTA2OiAnI2UwZTBlMCcsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjY2M2NjY2JyxcbiAgYmFzZTA5OiAnI2RlOTM1ZicsXG4gIGJhc2UwQTogJyNmMGM2NzQnLFxuICBiYXNlMEI6ICcjYjViZDY4JyxcbiAgYmFzZTBDOiAnIzhhYmViNycsXG4gIGJhc2UwRDogJyM4MWEyYmUnLFxuICBiYXNlMEU6ICcjYjI5NGJiJyxcbiAgYmFzZTBGOiAnI2EzNjg1YSdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2xvbmRvbiB0dWJlJyxcbiAgYXV0aG9yOiAnamFuIHQuIHNvdHQnLFxuICBiYXNlMDA6ICcjMjMxZjIwJyxcbiAgYmFzZTAxOiAnIzFjM2Y5NScsXG4gIGJhc2UwMjogJyM1YTU3NTgnLFxuICBiYXNlMDM6ICcjNzM3MTcxJyxcbiAgYmFzZTA0OiAnIzk1OWNhMScsXG4gIGJhc2UwNTogJyNkOWQ4ZDgnLFxuICBiYXNlMDY6ICcjZTdlN2U4JyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNlZTJlMjQnLFxuICBiYXNlMDk6ICcjZjM4NmExJyxcbiAgYmFzZTBBOiAnI2ZmZDIwNCcsXG4gIGJhc2UwQjogJyMwMDg1M2UnLFxuICBiYXNlMEM6ICcjODVjZWJjJyxcbiAgYmFzZTBEOiAnIzAwOWRkYycsXG4gIGJhc2UwRTogJyM5ODAwNWQnLFxuICBiYXNlMEY6ICcjYjA2MTEwJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAndHdpbGlnaHQnLFxuICBhdXRob3I6ICdkYXZpZCBoYXJ0IChodHRwOi8vaGFydC1kZXYuY29tKScsXG4gIGJhc2UwMDogJyMxZTFlMWUnLFxuICBiYXNlMDE6ICcjMzIzNTM3JyxcbiAgYmFzZTAyOiAnIzQ2NGI1MCcsXG4gIGJhc2UwMzogJyM1ZjVhNjAnLFxuICBiYXNlMDQ6ICcjODM4MTg0JyxcbiAgYmFzZTA1OiAnI2E3YTdhNycsXG4gIGJhc2UwNjogJyNjM2MzYzMnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI2NmNmE0YycsXG4gIGJhc2UwOTogJyNjZGE4NjknLFxuICBiYXNlMEE6ICcjZjllZTk4JyxcbiAgYmFzZTBCOiAnIzhmOWQ2YScsXG4gIGJhc2UwQzogJyNhZmM0ZGInLFxuICBiYXNlMEQ6ICcjNzU4N2E2JyxcbiAgYmFzZTBFOiAnIzliODU5ZCcsXG4gIGJhc2UwRjogJyM5YjcwM2YnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiLyogTUlUIGxpY2Vuc2UgKi9cbnZhciBjc3NLZXl3b3JkcyA9IHJlcXVpcmUoJ2NvbG9yLW5hbWUnKTtcblxuLy8gTk9URTogY29udmVyc2lvbnMgc2hvdWxkIG9ubHkgcmV0dXJuIHByaW1pdGl2ZSB2YWx1ZXMgKGkuZS4gYXJyYXlzLCBvclxuLy8gICAgICAgdmFsdWVzIHRoYXQgZ2l2ZSBjb3JyZWN0IGB0eXBlb2ZgIHJlc3VsdHMpLlxuLy8gICAgICAgZG8gbm90IHVzZSBib3ggdmFsdWVzIHR5cGVzIChpLmUuIE51bWJlcigpLCBTdHJpbmcoKSwgZXRjLilcblxudmFyIHJldmVyc2VLZXl3b3JkcyA9IHt9O1xuZm9yICh2YXIga2V5IGluIGNzc0tleXdvcmRzKSB7XG5cdGlmIChjc3NLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0cmV2ZXJzZUtleXdvcmRzW2Nzc0tleXdvcmRzW2tleV1dID0ga2V5O1xuXHR9XG59XG5cbnZhciBjb252ZXJ0ID0gbW9kdWxlLmV4cG9ydHMgPSB7XG5cdHJnYjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdyZ2InfSxcblx0aHNsOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2hzbCd9LFxuXHRoc3Y6IHtjaGFubmVsczogMywgbGFiZWxzOiAnaHN2J30sXG5cdGh3Yjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdod2InfSxcblx0Y215azoge2NoYW5uZWxzOiA0LCBsYWJlbHM6ICdjbXlrJ30sXG5cdHh5ejoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICd4eXonfSxcblx0bGFiOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2xhYid9LFxuXHRsY2g6IHtjaGFubmVsczogMywgbGFiZWxzOiAnbGNoJ30sXG5cdGhleDoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnaGV4J119LFxuXHRrZXl3b3JkOiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydrZXl3b3JkJ119LFxuXHRhbnNpMTY6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2Fuc2kxNiddfSxcblx0YW5zaTI1Njoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnYW5zaTI1NiddfSxcblx0aGNnOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogWydoJywgJ2MnLCAnZyddfSxcblx0YXBwbGU6IHtjaGFubmVsczogMywgbGFiZWxzOiBbJ3IxNicsICdnMTYnLCAnYjE2J119LFxuXHRncmF5OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydncmF5J119XG59O1xuXG4vLyBoaWRlIC5jaGFubmVscyBhbmQgLmxhYmVscyBwcm9wZXJ0aWVzXG5mb3IgKHZhciBtb2RlbCBpbiBjb252ZXJ0KSB7XG5cdGlmIChjb252ZXJ0Lmhhc093blByb3BlcnR5KG1vZGVsKSkge1xuXHRcdGlmICghKCdjaGFubmVscycgaW4gY29udmVydFttb2RlbF0pKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2hhbm5lbHMgcHJvcGVydHk6ICcgKyBtb2RlbCk7XG5cdFx0fVxuXG5cdFx0aWYgKCEoJ2xhYmVscycgaW4gY29udmVydFttb2RlbF0pKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2hhbm5lbCBsYWJlbHMgcHJvcGVydHk6ICcgKyBtb2RlbCk7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbnZlcnRbbW9kZWxdLmxhYmVscy5sZW5ndGggIT09IGNvbnZlcnRbbW9kZWxdLmNoYW5uZWxzKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ2NoYW5uZWwgYW5kIGxhYmVsIGNvdW50cyBtaXNtYXRjaDogJyArIG1vZGVsKTtcblx0XHR9XG5cblx0XHR2YXIgY2hhbm5lbHMgPSBjb252ZXJ0W21vZGVsXS5jaGFubmVscztcblx0XHR2YXIgbGFiZWxzID0gY29udmVydFttb2RlbF0ubGFiZWxzO1xuXHRcdGRlbGV0ZSBjb252ZXJ0W21vZGVsXS5jaGFubmVscztcblx0XHRkZWxldGUgY29udmVydFttb2RlbF0ubGFiZWxzO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W21vZGVsXSwgJ2NoYW5uZWxzJywge3ZhbHVlOiBjaGFubmVsc30pO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W21vZGVsXSwgJ2xhYmVscycsIHt2YWx1ZTogbGFiZWxzfSk7XG5cdH1cbn1cblxuY29udmVydC5yZ2IuaHNsID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgciA9IHJnYlswXSAvIDI1NTtcblx0dmFyIGcgPSByZ2JbMV0gLyAyNTU7XG5cdHZhciBiID0gcmdiWzJdIC8gMjU1O1xuXHR2YXIgbWluID0gTWF0aC5taW4ociwgZywgYik7XG5cdHZhciBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcblx0dmFyIGRlbHRhID0gbWF4IC0gbWluO1xuXHR2YXIgaDtcblx0dmFyIHM7XG5cdHZhciBsO1xuXG5cdGlmIChtYXggPT09IG1pbikge1xuXHRcdGggPSAwO1xuXHR9IGVsc2UgaWYgKHIgPT09IG1heCkge1xuXHRcdGggPSAoZyAtIGIpIC8gZGVsdGE7XG5cdH0gZWxzZSBpZiAoZyA9PT0gbWF4KSB7XG5cdFx0aCA9IDIgKyAoYiAtIHIpIC8gZGVsdGE7XG5cdH0gZWxzZSBpZiAoYiA9PT0gbWF4KSB7XG5cdFx0aCA9IDQgKyAociAtIGcpIC8gZGVsdGE7XG5cdH1cblxuXHRoID0gTWF0aC5taW4oaCAqIDYwLCAzNjApO1xuXG5cdGlmIChoIDwgMCkge1xuXHRcdGggKz0gMzYwO1xuXHR9XG5cblx0bCA9IChtaW4gKyBtYXgpIC8gMjtcblxuXHRpZiAobWF4ID09PSBtaW4pIHtcblx0XHRzID0gMDtcblx0fSBlbHNlIGlmIChsIDw9IDAuNSkge1xuXHRcdHMgPSBkZWx0YSAvIChtYXggKyBtaW4pO1xuXHR9IGVsc2Uge1xuXHRcdHMgPSBkZWx0YSAvICgyIC0gbWF4IC0gbWluKTtcblx0fVxuXG5cdHJldHVybiBbaCwgcyAqIDEwMCwgbCAqIDEwMF07XG59O1xuXG5jb252ZXJ0LnJnYi5oc3YgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByZGlmO1xuXHR2YXIgZ2RpZjtcblx0dmFyIGJkaWY7XG5cdHZhciBoO1xuXHR2YXIgcztcblxuXHR2YXIgciA9IHJnYlswXSAvIDI1NTtcblx0dmFyIGcgPSByZ2JbMV0gLyAyNTU7XG5cdHZhciBiID0gcmdiWzJdIC8gMjU1O1xuXHR2YXIgdiA9IE1hdGgubWF4KHIsIGcsIGIpO1xuXHR2YXIgZGlmZiA9IHYgLSBNYXRoLm1pbihyLCBnLCBiKTtcblx0dmFyIGRpZmZjID0gZnVuY3Rpb24gKGMpIHtcblx0XHRyZXR1cm4gKHYgLSBjKSAvIDYgLyBkaWZmICsgMSAvIDI7XG5cdH07XG5cblx0aWYgKGRpZmYgPT09IDApIHtcblx0XHRoID0gcyA9IDA7XG5cdH0gZWxzZSB7XG5cdFx0cyA9IGRpZmYgLyB2O1xuXHRcdHJkaWYgPSBkaWZmYyhyKTtcblx0XHRnZGlmID0gZGlmZmMoZyk7XG5cdFx0YmRpZiA9IGRpZmZjKGIpO1xuXG5cdFx0aWYgKHIgPT09IHYpIHtcblx0XHRcdGggPSBiZGlmIC0gZ2RpZjtcblx0XHR9IGVsc2UgaWYgKGcgPT09IHYpIHtcblx0XHRcdGggPSAoMSAvIDMpICsgcmRpZiAtIGJkaWY7XG5cdFx0fSBlbHNlIGlmIChiID09PSB2KSB7XG5cdFx0XHRoID0gKDIgLyAzKSArIGdkaWYgLSByZGlmO1xuXHRcdH1cblx0XHRpZiAoaCA8IDApIHtcblx0XHRcdGggKz0gMTtcblx0XHR9IGVsc2UgaWYgKGggPiAxKSB7XG5cdFx0XHRoIC09IDE7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIFtcblx0XHRoICogMzYwLFxuXHRcdHMgKiAxMDAsXG5cdFx0diAqIDEwMFxuXHRdO1xufTtcblxuY29udmVydC5yZ2IuaHdiID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgciA9IHJnYlswXTtcblx0dmFyIGcgPSByZ2JbMV07XG5cdHZhciBiID0gcmdiWzJdO1xuXHR2YXIgaCA9IGNvbnZlcnQucmdiLmhzbChyZ2IpWzBdO1xuXHR2YXIgdyA9IDEgLyAyNTUgKiBNYXRoLm1pbihyLCBNYXRoLm1pbihnLCBiKSk7XG5cblx0YiA9IDEgLSAxIC8gMjU1ICogTWF0aC5tYXgociwgTWF0aC5tYXgoZywgYikpO1xuXG5cdHJldHVybiBbaCwgdyAqIDEwMCwgYiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LnJnYi5jbXlrID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgciA9IHJnYlswXSAvIDI1NTtcblx0dmFyIGcgPSByZ2JbMV0gLyAyNTU7XG5cdHZhciBiID0gcmdiWzJdIC8gMjU1O1xuXHR2YXIgYztcblx0dmFyIG07XG5cdHZhciB5O1xuXHR2YXIgaztcblxuXHRrID0gTWF0aC5taW4oMSAtIHIsIDEgLSBnLCAxIC0gYik7XG5cdGMgPSAoMSAtIHIgLSBrKSAvICgxIC0gaykgfHwgMDtcblx0bSA9ICgxIC0gZyAtIGspIC8gKDEgLSBrKSB8fCAwO1xuXHR5ID0gKDEgLSBiIC0gaykgLyAoMSAtIGspIHx8IDA7XG5cblx0cmV0dXJuIFtjICogMTAwLCBtICogMTAwLCB5ICogMTAwLCBrICogMTAwXTtcbn07XG5cbi8qKlxuICogU2VlIGh0dHBzOi8vZW4ubS53aWtpcGVkaWEub3JnL3dpa2kvRXVjbGlkZWFuX2Rpc3RhbmNlI1NxdWFyZWRfRXVjbGlkZWFuX2Rpc3RhbmNlXG4gKiAqL1xuZnVuY3Rpb24gY29tcGFyYXRpdmVEaXN0YW5jZSh4LCB5KSB7XG5cdHJldHVybiAoXG5cdFx0TWF0aC5wb3coeFswXSAtIHlbMF0sIDIpICtcblx0XHRNYXRoLnBvdyh4WzFdIC0geVsxXSwgMikgK1xuXHRcdE1hdGgucG93KHhbMl0gLSB5WzJdLCAyKVxuXHQpO1xufVxuXG5jb252ZXJ0LnJnYi5rZXl3b3JkID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgcmV2ZXJzZWQgPSByZXZlcnNlS2V5d29yZHNbcmdiXTtcblx0aWYgKHJldmVyc2VkKSB7XG5cdFx0cmV0dXJuIHJldmVyc2VkO1xuXHR9XG5cblx0dmFyIGN1cnJlbnRDbG9zZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcblx0dmFyIGN1cnJlbnRDbG9zZXN0S2V5d29yZDtcblxuXHRmb3IgKHZhciBrZXl3b3JkIGluIGNzc0tleXdvcmRzKSB7XG5cdFx0aWYgKGNzc0tleXdvcmRzLmhhc093blByb3BlcnR5KGtleXdvcmQpKSB7XG5cdFx0XHR2YXIgdmFsdWUgPSBjc3NLZXl3b3Jkc1trZXl3b3JkXTtcblxuXHRcdFx0Ly8gQ29tcHV0ZSBjb21wYXJhdGl2ZSBkaXN0YW5jZVxuXHRcdFx0dmFyIGRpc3RhbmNlID0gY29tcGFyYXRpdmVEaXN0YW5jZShyZ2IsIHZhbHVlKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgaXRzIGxlc3MsIGlmIHNvIHNldCBhcyBjbG9zZXN0XG5cdFx0XHRpZiAoZGlzdGFuY2UgPCBjdXJyZW50Q2xvc2VzdERpc3RhbmNlKSB7XG5cdFx0XHRcdGN1cnJlbnRDbG9zZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcblx0XHRcdFx0Y3VycmVudENsb3Nlc3RLZXl3b3JkID0ga2V5d29yZDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY3VycmVudENsb3Nlc3RLZXl3b3JkO1xufTtcblxuY29udmVydC5rZXl3b3JkLnJnYiA9IGZ1bmN0aW9uIChrZXl3b3JkKSB7XG5cdHJldHVybiBjc3NLZXl3b3Jkc1trZXl3b3JkXTtcbn07XG5cbmNvbnZlcnQucmdiLnh5eiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHIgPSByZ2JbMF0gLyAyNTU7XG5cdHZhciBnID0gcmdiWzFdIC8gMjU1O1xuXHR2YXIgYiA9IHJnYlsyXSAvIDI1NTtcblxuXHQvLyBhc3N1bWUgc1JHQlxuXHRyID0gciA+IDAuMDQwNDUgPyBNYXRoLnBvdygoKHIgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCkgOiAociAvIDEyLjkyKTtcblx0ZyA9IGcgPiAwLjA0MDQ1ID8gTWF0aC5wb3coKChnICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpIDogKGcgLyAxMi45Mik7XG5cdGIgPSBiID4gMC4wNDA0NSA/IE1hdGgucG93KCgoYiArIDAuMDU1KSAvIDEuMDU1KSwgMi40KSA6IChiIC8gMTIuOTIpO1xuXG5cdHZhciB4ID0gKHIgKiAwLjQxMjQpICsgKGcgKiAwLjM1NzYpICsgKGIgKiAwLjE4MDUpO1xuXHR2YXIgeSA9IChyICogMC4yMTI2KSArIChnICogMC43MTUyKSArIChiICogMC4wNzIyKTtcblx0dmFyIHogPSAociAqIDAuMDE5MykgKyAoZyAqIDAuMTE5MikgKyAoYiAqIDAuOTUwNSk7XG5cblx0cmV0dXJuIFt4ICogMTAwLCB5ICogMTAwLCB6ICogMTAwXTtcbn07XG5cbmNvbnZlcnQucmdiLmxhYiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHh5eiA9IGNvbnZlcnQucmdiLnh5eihyZ2IpO1xuXHR2YXIgeCA9IHh5elswXTtcblx0dmFyIHkgPSB4eXpbMV07XG5cdHZhciB6ID0geHl6WzJdO1xuXHR2YXIgbDtcblx0dmFyIGE7XG5cdHZhciBiO1xuXG5cdHggLz0gOTUuMDQ3O1xuXHR5IC89IDEwMDtcblx0eiAvPSAxMDguODgzO1xuXG5cdHggPSB4ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh4LCAxIC8gMykgOiAoNy43ODcgKiB4KSArICgxNiAvIDExNik7XG5cdHkgPSB5ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh5LCAxIC8gMykgOiAoNy43ODcgKiB5KSArICgxNiAvIDExNik7XG5cdHogPSB6ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh6LCAxIC8gMykgOiAoNy43ODcgKiB6KSArICgxNiAvIDExNik7XG5cblx0bCA9ICgxMTYgKiB5KSAtIDE2O1xuXHRhID0gNTAwICogKHggLSB5KTtcblx0YiA9IDIwMCAqICh5IC0geik7XG5cblx0cmV0dXJuIFtsLCBhLCBiXTtcbn07XG5cbmNvbnZlcnQuaHNsLnJnYiA9IGZ1bmN0aW9uIChoc2wpIHtcblx0dmFyIGggPSBoc2xbMF0gLyAzNjA7XG5cdHZhciBzID0gaHNsWzFdIC8gMTAwO1xuXHR2YXIgbCA9IGhzbFsyXSAvIDEwMDtcblx0dmFyIHQxO1xuXHR2YXIgdDI7XG5cdHZhciB0Mztcblx0dmFyIHJnYjtcblx0dmFyIHZhbDtcblxuXHRpZiAocyA9PT0gMCkge1xuXHRcdHZhbCA9IGwgKiAyNTU7XG5cdFx0cmV0dXJuIFt2YWwsIHZhbCwgdmFsXTtcblx0fVxuXG5cdGlmIChsIDwgMC41KSB7XG5cdFx0dDIgPSBsICogKDEgKyBzKTtcblx0fSBlbHNlIHtcblx0XHR0MiA9IGwgKyBzIC0gbCAqIHM7XG5cdH1cblxuXHR0MSA9IDIgKiBsIC0gdDI7XG5cblx0cmdiID0gWzAsIDAsIDBdO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdHQzID0gaCArIDEgLyAzICogLShpIC0gMSk7XG5cdFx0aWYgKHQzIDwgMCkge1xuXHRcdFx0dDMrKztcblx0XHR9XG5cdFx0aWYgKHQzID4gMSkge1xuXHRcdFx0dDMtLTtcblx0XHR9XG5cblx0XHRpZiAoNiAqIHQzIDwgMSkge1xuXHRcdFx0dmFsID0gdDEgKyAodDIgLSB0MSkgKiA2ICogdDM7XG5cdFx0fSBlbHNlIGlmICgyICogdDMgPCAxKSB7XG5cdFx0XHR2YWwgPSB0Mjtcblx0XHR9IGVsc2UgaWYgKDMgKiB0MyA8IDIpIHtcblx0XHRcdHZhbCA9IHQxICsgKHQyIC0gdDEpICogKDIgLyAzIC0gdDMpICogNjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFsID0gdDE7XG5cdFx0fVxuXG5cdFx0cmdiW2ldID0gdmFsICogMjU1O1xuXHR9XG5cblx0cmV0dXJuIHJnYjtcbn07XG5cbmNvbnZlcnQuaHNsLmhzdiA9IGZ1bmN0aW9uIChoc2wpIHtcblx0dmFyIGggPSBoc2xbMF07XG5cdHZhciBzID0gaHNsWzFdIC8gMTAwO1xuXHR2YXIgbCA9IGhzbFsyXSAvIDEwMDtcblx0dmFyIHNtaW4gPSBzO1xuXHR2YXIgbG1pbiA9IE1hdGgubWF4KGwsIDAuMDEpO1xuXHR2YXIgc3Y7XG5cdHZhciB2O1xuXG5cdGwgKj0gMjtcblx0cyAqPSAobCA8PSAxKSA/IGwgOiAyIC0gbDtcblx0c21pbiAqPSBsbWluIDw9IDEgPyBsbWluIDogMiAtIGxtaW47XG5cdHYgPSAobCArIHMpIC8gMjtcblx0c3YgPSBsID09PSAwID8gKDIgKiBzbWluKSAvIChsbWluICsgc21pbikgOiAoMiAqIHMpIC8gKGwgKyBzKTtcblxuXHRyZXR1cm4gW2gsIHN2ICogMTAwLCB2ICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHN2LnJnYiA9IGZ1bmN0aW9uIChoc3YpIHtcblx0dmFyIGggPSBoc3ZbMF0gLyA2MDtcblx0dmFyIHMgPSBoc3ZbMV0gLyAxMDA7XG5cdHZhciB2ID0gaHN2WzJdIC8gMTAwO1xuXHR2YXIgaGkgPSBNYXRoLmZsb29yKGgpICUgNjtcblxuXHR2YXIgZiA9IGggLSBNYXRoLmZsb29yKGgpO1xuXHR2YXIgcCA9IDI1NSAqIHYgKiAoMSAtIHMpO1xuXHR2YXIgcSA9IDI1NSAqIHYgKiAoMSAtIChzICogZikpO1xuXHR2YXIgdCA9IDI1NSAqIHYgKiAoMSAtIChzICogKDEgLSBmKSkpO1xuXHR2ICo9IDI1NTtcblxuXHRzd2l0Y2ggKGhpKSB7XG5cdFx0Y2FzZSAwOlxuXHRcdFx0cmV0dXJuIFt2LCB0LCBwXTtcblx0XHRjYXNlIDE6XG5cdFx0XHRyZXR1cm4gW3EsIHYsIHBdO1xuXHRcdGNhc2UgMjpcblx0XHRcdHJldHVybiBbcCwgdiwgdF07XG5cdFx0Y2FzZSAzOlxuXHRcdFx0cmV0dXJuIFtwLCBxLCB2XTtcblx0XHRjYXNlIDQ6XG5cdFx0XHRyZXR1cm4gW3QsIHAsIHZdO1xuXHRcdGNhc2UgNTpcblx0XHRcdHJldHVybiBbdiwgcCwgcV07XG5cdH1cbn07XG5cbmNvbnZlcnQuaHN2LmhzbCA9IGZ1bmN0aW9uIChoc3YpIHtcblx0dmFyIGggPSBoc3ZbMF07XG5cdHZhciBzID0gaHN2WzFdIC8gMTAwO1xuXHR2YXIgdiA9IGhzdlsyXSAvIDEwMDtcblx0dmFyIHZtaW4gPSBNYXRoLm1heCh2LCAwLjAxKTtcblx0dmFyIGxtaW47XG5cdHZhciBzbDtcblx0dmFyIGw7XG5cblx0bCA9ICgyIC0gcykgKiB2O1xuXHRsbWluID0gKDIgLSBzKSAqIHZtaW47XG5cdHNsID0gcyAqIHZtaW47XG5cdHNsIC89IChsbWluIDw9IDEpID8gbG1pbiA6IDIgLSBsbWluO1xuXHRzbCA9IHNsIHx8IDA7XG5cdGwgLz0gMjtcblxuXHRyZXR1cm4gW2gsIHNsICogMTAwLCBsICogMTAwXTtcbn07XG5cbi8vIGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzcy1jb2xvci8jaHdiLXRvLXJnYlxuY29udmVydC5od2IucmdiID0gZnVuY3Rpb24gKGh3Yikge1xuXHR2YXIgaCA9IGh3YlswXSAvIDM2MDtcblx0dmFyIHdoID0gaHdiWzFdIC8gMTAwO1xuXHR2YXIgYmwgPSBod2JbMl0gLyAxMDA7XG5cdHZhciByYXRpbyA9IHdoICsgYmw7XG5cdHZhciBpO1xuXHR2YXIgdjtcblx0dmFyIGY7XG5cdHZhciBuO1xuXG5cdC8vIHdoICsgYmwgY2FudCBiZSA+IDFcblx0aWYgKHJhdGlvID4gMSkge1xuXHRcdHdoIC89IHJhdGlvO1xuXHRcdGJsIC89IHJhdGlvO1xuXHR9XG5cblx0aSA9IE1hdGguZmxvb3IoNiAqIGgpO1xuXHR2ID0gMSAtIGJsO1xuXHRmID0gNiAqIGggLSBpO1xuXG5cdGlmICgoaSAmIDB4MDEpICE9PSAwKSB7XG5cdFx0ZiA9IDEgLSBmO1xuXHR9XG5cblx0biA9IHdoICsgZiAqICh2IC0gd2gpOyAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvblxuXG5cdHZhciByO1xuXHR2YXIgZztcblx0dmFyIGI7XG5cdHN3aXRjaCAoaSkge1xuXHRcdGRlZmF1bHQ6XG5cdFx0Y2FzZSA2OlxuXHRcdGNhc2UgMDogciA9IHY7IGcgPSBuOyBiID0gd2g7IGJyZWFrO1xuXHRcdGNhc2UgMTogciA9IG47IGcgPSB2OyBiID0gd2g7IGJyZWFrO1xuXHRcdGNhc2UgMjogciA9IHdoOyBnID0gdjsgYiA9IG47IGJyZWFrO1xuXHRcdGNhc2UgMzogciA9IHdoOyBnID0gbjsgYiA9IHY7IGJyZWFrO1xuXHRcdGNhc2UgNDogciA9IG47IGcgPSB3aDsgYiA9IHY7IGJyZWFrO1xuXHRcdGNhc2UgNTogciA9IHY7IGcgPSB3aDsgYiA9IG47IGJyZWFrO1xuXHR9XG5cblx0cmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn07XG5cbmNvbnZlcnQuY215ay5yZ2IgPSBmdW5jdGlvbiAoY215aykge1xuXHR2YXIgYyA9IGNteWtbMF0gLyAxMDA7XG5cdHZhciBtID0gY215a1sxXSAvIDEwMDtcblx0dmFyIHkgPSBjbXlrWzJdIC8gMTAwO1xuXHR2YXIgayA9IGNteWtbM10gLyAxMDA7XG5cdHZhciByO1xuXHR2YXIgZztcblx0dmFyIGI7XG5cblx0ciA9IDEgLSBNYXRoLm1pbigxLCBjICogKDEgLSBrKSArIGspO1xuXHRnID0gMSAtIE1hdGgubWluKDEsIG0gKiAoMSAtIGspICsgayk7XG5cdGIgPSAxIC0gTWF0aC5taW4oMSwgeSAqICgxIC0gaykgKyBrKTtcblxuXHRyZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufTtcblxuY29udmVydC54eXoucmdiID0gZnVuY3Rpb24gKHh5eikge1xuXHR2YXIgeCA9IHh5elswXSAvIDEwMDtcblx0dmFyIHkgPSB4eXpbMV0gLyAxMDA7XG5cdHZhciB6ID0geHl6WzJdIC8gMTAwO1xuXHR2YXIgcjtcblx0dmFyIGc7XG5cdHZhciBiO1xuXG5cdHIgPSAoeCAqIDMuMjQwNikgKyAoeSAqIC0xLjUzNzIpICsgKHogKiAtMC40OTg2KTtcblx0ZyA9ICh4ICogLTAuOTY4OSkgKyAoeSAqIDEuODc1OCkgKyAoeiAqIDAuMDQxNSk7XG5cdGIgPSAoeCAqIDAuMDU1NykgKyAoeSAqIC0wLjIwNDApICsgKHogKiAxLjA1NzApO1xuXG5cdC8vIGFzc3VtZSBzUkdCXG5cdHIgPSByID4gMC4wMDMxMzA4XG5cdFx0PyAoKDEuMDU1ICogTWF0aC5wb3cociwgMS4wIC8gMi40KSkgLSAwLjA1NSlcblx0XHQ6IHIgKiAxMi45MjtcblxuXHRnID0gZyA+IDAuMDAzMTMwOFxuXHRcdD8gKCgxLjA1NSAqIE1hdGgucG93KGcsIDEuMCAvIDIuNCkpIC0gMC4wNTUpXG5cdFx0OiBnICogMTIuOTI7XG5cblx0YiA9IGIgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiBNYXRoLnBvdyhiLCAxLjAgLyAyLjQpKSAtIDAuMDU1KVxuXHRcdDogYiAqIDEyLjkyO1xuXG5cdHIgPSBNYXRoLm1pbihNYXRoLm1heCgwLCByKSwgMSk7XG5cdGcgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBnKSwgMSk7XG5cdGIgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBiKSwgMSk7XG5cblx0cmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn07XG5cbmNvbnZlcnQueHl6LmxhYiA9IGZ1bmN0aW9uICh4eXopIHtcblx0dmFyIHggPSB4eXpbMF07XG5cdHZhciB5ID0geHl6WzFdO1xuXHR2YXIgeiA9IHh5elsyXTtcblx0dmFyIGw7XG5cdHZhciBhO1xuXHR2YXIgYjtcblxuXHR4IC89IDk1LjA0Nztcblx0eSAvPSAxMDA7XG5cdHogLz0gMTA4Ljg4MztcblxuXHR4ID0geCA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeCwgMSAvIDMpIDogKDcuNzg3ICogeCkgKyAoMTYgLyAxMTYpO1xuXHR5ID0geSA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeSwgMSAvIDMpIDogKDcuNzg3ICogeSkgKyAoMTYgLyAxMTYpO1xuXHR6ID0geiA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeiwgMSAvIDMpIDogKDcuNzg3ICogeikgKyAoMTYgLyAxMTYpO1xuXG5cdGwgPSAoMTE2ICogeSkgLSAxNjtcblx0YSA9IDUwMCAqICh4IC0geSk7XG5cdGIgPSAyMDAgKiAoeSAtIHopO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LmxhYi54eXogPSBmdW5jdGlvbiAobGFiKSB7XG5cdHZhciBsID0gbGFiWzBdO1xuXHR2YXIgYSA9IGxhYlsxXTtcblx0dmFyIGIgPSBsYWJbMl07XG5cdHZhciB4O1xuXHR2YXIgeTtcblx0dmFyIHo7XG5cblx0eSA9IChsICsgMTYpIC8gMTE2O1xuXHR4ID0gYSAvIDUwMCArIHk7XG5cdHogPSB5IC0gYiAvIDIwMDtcblxuXHR2YXIgeTIgPSBNYXRoLnBvdyh5LCAzKTtcblx0dmFyIHgyID0gTWF0aC5wb3coeCwgMyk7XG5cdHZhciB6MiA9IE1hdGgucG93KHosIDMpO1xuXHR5ID0geTIgPiAwLjAwODg1NiA/IHkyIDogKHkgLSAxNiAvIDExNikgLyA3Ljc4Nztcblx0eCA9IHgyID4gMC4wMDg4NTYgPyB4MiA6ICh4IC0gMTYgLyAxMTYpIC8gNy43ODc7XG5cdHogPSB6MiA+IDAuMDA4ODU2ID8gejIgOiAoeiAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuXG5cdHggKj0gOTUuMDQ3O1xuXHR5ICo9IDEwMDtcblx0eiAqPSAxMDguODgzO1xuXG5cdHJldHVybiBbeCwgeSwgel07XG59O1xuXG5jb252ZXJ0LmxhYi5sY2ggPSBmdW5jdGlvbiAobGFiKSB7XG5cdHZhciBsID0gbGFiWzBdO1xuXHR2YXIgYSA9IGxhYlsxXTtcblx0dmFyIGIgPSBsYWJbMl07XG5cdHZhciBocjtcblx0dmFyIGg7XG5cdHZhciBjO1xuXG5cdGhyID0gTWF0aC5hdGFuMihiLCBhKTtcblx0aCA9IGhyICogMzYwIC8gMiAvIE1hdGguUEk7XG5cblx0aWYgKGggPCAwKSB7XG5cdFx0aCArPSAzNjA7XG5cdH1cblxuXHRjID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpO1xuXG5cdHJldHVybiBbbCwgYywgaF07XG59O1xuXG5jb252ZXJ0LmxjaC5sYWIgPSBmdW5jdGlvbiAobGNoKSB7XG5cdHZhciBsID0gbGNoWzBdO1xuXHR2YXIgYyA9IGxjaFsxXTtcblx0dmFyIGggPSBsY2hbMl07XG5cdHZhciBhO1xuXHR2YXIgYjtcblx0dmFyIGhyO1xuXG5cdGhyID0gaCAvIDM2MCAqIDIgKiBNYXRoLlBJO1xuXHRhID0gYyAqIE1hdGguY29zKGhyKTtcblx0YiA9IGMgKiBNYXRoLnNpbihocik7XG5cblx0cmV0dXJuIFtsLCBhLCBiXTtcbn07XG5cbmNvbnZlcnQucmdiLmFuc2kxNiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHZhciByID0gYXJnc1swXTtcblx0dmFyIGcgPSBhcmdzWzFdO1xuXHR2YXIgYiA9IGFyZ3NbMl07XG5cdHZhciB2YWx1ZSA9IDEgaW4gYXJndW1lbnRzID8gYXJndW1lbnRzWzFdIDogY29udmVydC5yZ2IuaHN2KGFyZ3MpWzJdOyAvLyBoc3YgLT4gYW5zaTE2IG9wdGltaXphdGlvblxuXG5cdHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSAvIDUwKTtcblxuXHRpZiAodmFsdWUgPT09IDApIHtcblx0XHRyZXR1cm4gMzA7XG5cdH1cblxuXHR2YXIgYW5zaSA9IDMwXG5cdFx0KyAoKE1hdGgucm91bmQoYiAvIDI1NSkgPDwgMilcblx0XHR8IChNYXRoLnJvdW5kKGcgLyAyNTUpIDw8IDEpXG5cdFx0fCBNYXRoLnJvdW5kKHIgLyAyNTUpKTtcblxuXHRpZiAodmFsdWUgPT09IDIpIHtcblx0XHRhbnNpICs9IDYwO1xuXHR9XG5cblx0cmV0dXJuIGFuc2k7XG59O1xuXG5jb252ZXJ0Lmhzdi5hbnNpMTYgPSBmdW5jdGlvbiAoYXJncykge1xuXHQvLyBvcHRpbWl6YXRpb24gaGVyZTsgd2UgYWxyZWFkeSBrbm93IHRoZSB2YWx1ZSBhbmQgZG9uJ3QgbmVlZCB0byBnZXRcblx0Ly8gaXQgY29udmVydGVkIGZvciB1cy5cblx0cmV0dXJuIGNvbnZlcnQucmdiLmFuc2kxNihjb252ZXJ0Lmhzdi5yZ2IoYXJncyksIGFyZ3NbMl0pO1xufTtcblxuY29udmVydC5yZ2IuYW5zaTI1NiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHZhciByID0gYXJnc1swXTtcblx0dmFyIGcgPSBhcmdzWzFdO1xuXHR2YXIgYiA9IGFyZ3NbMl07XG5cblx0Ly8gd2UgdXNlIHRoZSBleHRlbmRlZCBncmV5c2NhbGUgcGFsZXR0ZSBoZXJlLCB3aXRoIHRoZSBleGNlcHRpb24gb2Zcblx0Ly8gYmxhY2sgYW5kIHdoaXRlLiBub3JtYWwgcGFsZXR0ZSBvbmx5IGhhcyA0IGdyZXlzY2FsZSBzaGFkZXMuXG5cdGlmIChyID09PSBnICYmIGcgPT09IGIpIHtcblx0XHRpZiAociA8IDgpIHtcblx0XHRcdHJldHVybiAxNjtcblx0XHR9XG5cblx0XHRpZiAociA+IDI0OCkge1xuXHRcdFx0cmV0dXJuIDIzMTtcblx0XHR9XG5cblx0XHRyZXR1cm4gTWF0aC5yb3VuZCgoKHIgLSA4KSAvIDI0NykgKiAyNCkgKyAyMzI7XG5cdH1cblxuXHR2YXIgYW5zaSA9IDE2XG5cdFx0KyAoMzYgKiBNYXRoLnJvdW5kKHIgLyAyNTUgKiA1KSlcblx0XHQrICg2ICogTWF0aC5yb3VuZChnIC8gMjU1ICogNSkpXG5cdFx0KyBNYXRoLnJvdW5kKGIgLyAyNTUgKiA1KTtcblxuXHRyZXR1cm4gYW5zaTtcbn07XG5cbmNvbnZlcnQuYW5zaTE2LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHZhciBjb2xvciA9IGFyZ3MgJSAxMDtcblxuXHQvLyBoYW5kbGUgZ3JleXNjYWxlXG5cdGlmIChjb2xvciA9PT0gMCB8fCBjb2xvciA9PT0gNykge1xuXHRcdGlmIChhcmdzID4gNTApIHtcblx0XHRcdGNvbG9yICs9IDMuNTtcblx0XHR9XG5cblx0XHRjb2xvciA9IGNvbG9yIC8gMTAuNSAqIDI1NTtcblxuXHRcdHJldHVybiBbY29sb3IsIGNvbG9yLCBjb2xvcl07XG5cdH1cblxuXHR2YXIgbXVsdCA9ICh+fihhcmdzID4gNTApICsgMSkgKiAwLjU7XG5cdHZhciByID0gKChjb2xvciAmIDEpICogbXVsdCkgKiAyNTU7XG5cdHZhciBnID0gKCgoY29sb3IgPj4gMSkgJiAxKSAqIG11bHQpICogMjU1O1xuXHR2YXIgYiA9ICgoKGNvbG9yID4+IDIpICYgMSkgKiBtdWx0KSAqIDI1NTtcblxuXHRyZXR1cm4gW3IsIGcsIGJdO1xufTtcblxuY29udmVydC5hbnNpMjU2LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdC8vIGhhbmRsZSBncmV5c2NhbGVcblx0aWYgKGFyZ3MgPj0gMjMyKSB7XG5cdFx0dmFyIGMgPSAoYXJncyAtIDIzMikgKiAxMCArIDg7XG5cdFx0cmV0dXJuIFtjLCBjLCBjXTtcblx0fVxuXG5cdGFyZ3MgLT0gMTY7XG5cblx0dmFyIHJlbTtcblx0dmFyIHIgPSBNYXRoLmZsb29yKGFyZ3MgLyAzNikgLyA1ICogMjU1O1xuXHR2YXIgZyA9IE1hdGguZmxvb3IoKHJlbSA9IGFyZ3MgJSAzNikgLyA2KSAvIDUgKiAyNTU7XG5cdHZhciBiID0gKHJlbSAlIDYpIC8gNSAqIDI1NTtcblxuXHRyZXR1cm4gW3IsIGcsIGJdO1xufTtcblxuY29udmVydC5yZ2IuaGV4ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0dmFyIGludGVnZXIgPSAoKE1hdGgucm91bmQoYXJnc1swXSkgJiAweEZGKSA8PCAxNilcblx0XHQrICgoTWF0aC5yb3VuZChhcmdzWzFdKSAmIDB4RkYpIDw8IDgpXG5cdFx0KyAoTWF0aC5yb3VuZChhcmdzWzJdKSAmIDB4RkYpO1xuXG5cdHZhciBzdHJpbmcgPSBpbnRlZ2VyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRyZXR1cm4gJzAwMDAwMCcuc3Vic3RyaW5nKHN0cmluZy5sZW5ndGgpICsgc3RyaW5nO1xufTtcblxuY29udmVydC5oZXgucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0dmFyIG1hdGNoID0gYXJncy50b1N0cmluZygxNikubWF0Y2goL1thLWYwLTldezZ9fFthLWYwLTldezN9L2kpO1xuXHRpZiAoIW1hdGNoKSB7XG5cdFx0cmV0dXJuIFswLCAwLCAwXTtcblx0fVxuXG5cdHZhciBjb2xvclN0cmluZyA9IG1hdGNoWzBdO1xuXG5cdGlmIChtYXRjaFswXS5sZW5ndGggPT09IDMpIHtcblx0XHRjb2xvclN0cmluZyA9IGNvbG9yU3RyaW5nLnNwbGl0KCcnKS5tYXAoZnVuY3Rpb24gKGNoYXIpIHtcblx0XHRcdHJldHVybiBjaGFyICsgY2hhcjtcblx0XHR9KS5qb2luKCcnKTtcblx0fVxuXG5cdHZhciBpbnRlZ2VyID0gcGFyc2VJbnQoY29sb3JTdHJpbmcsIDE2KTtcblx0dmFyIHIgPSAoaW50ZWdlciA+PiAxNikgJiAweEZGO1xuXHR2YXIgZyA9IChpbnRlZ2VyID4+IDgpICYgMHhGRjtcblx0dmFyIGIgPSBpbnRlZ2VyICYgMHhGRjtcblxuXHRyZXR1cm4gW3IsIGcsIGJdO1xufTtcblxuY29udmVydC5yZ2IuaGNnID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgciA9IHJnYlswXSAvIDI1NTtcblx0dmFyIGcgPSByZ2JbMV0gLyAyNTU7XG5cdHZhciBiID0gcmdiWzJdIC8gMjU1O1xuXHR2YXIgbWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgociwgZyksIGIpO1xuXHR2YXIgbWluID0gTWF0aC5taW4oTWF0aC5taW4ociwgZyksIGIpO1xuXHR2YXIgY2hyb21hID0gKG1heCAtIG1pbik7XG5cdHZhciBncmF5c2NhbGU7XG5cdHZhciBodWU7XG5cblx0aWYgKGNocm9tYSA8IDEpIHtcblx0XHRncmF5c2NhbGUgPSBtaW4gLyAoMSAtIGNocm9tYSk7XG5cdH0gZWxzZSB7XG5cdFx0Z3JheXNjYWxlID0gMDtcblx0fVxuXG5cdGlmIChjaHJvbWEgPD0gMCkge1xuXHRcdGh1ZSA9IDA7XG5cdH0gZWxzZVxuXHRpZiAobWF4ID09PSByKSB7XG5cdFx0aHVlID0gKChnIC0gYikgLyBjaHJvbWEpICUgNjtcblx0fSBlbHNlXG5cdGlmIChtYXggPT09IGcpIHtcblx0XHRodWUgPSAyICsgKGIgLSByKSAvIGNocm9tYTtcblx0fSBlbHNlIHtcblx0XHRodWUgPSA0ICsgKHIgLSBnKSAvIGNocm9tYSArIDQ7XG5cdH1cblxuXHRodWUgLz0gNjtcblx0aHVlICU9IDE7XG5cblx0cmV0dXJuIFtodWUgKiAzNjAsIGNocm9tYSAqIDEwMCwgZ3JheXNjYWxlICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHNsLmhjZyA9IGZ1bmN0aW9uIChoc2wpIHtcblx0dmFyIHMgPSBoc2xbMV0gLyAxMDA7XG5cdHZhciBsID0gaHNsWzJdIC8gMTAwO1xuXHR2YXIgYyA9IDE7XG5cdHZhciBmID0gMDtcblxuXHRpZiAobCA8IDAuNSkge1xuXHRcdGMgPSAyLjAgKiBzICogbDtcblx0fSBlbHNlIHtcblx0XHRjID0gMi4wICogcyAqICgxLjAgLSBsKTtcblx0fVxuXG5cdGlmIChjIDwgMS4wKSB7XG5cdFx0ZiA9IChsIC0gMC41ICogYykgLyAoMS4wIC0gYyk7XG5cdH1cblxuXHRyZXR1cm4gW2hzbFswXSwgYyAqIDEwMCwgZiAqIDEwMF07XG59O1xuXG5jb252ZXJ0Lmhzdi5oY2cgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdHZhciBzID0gaHN2WzFdIC8gMTAwO1xuXHR2YXIgdiA9IGhzdlsyXSAvIDEwMDtcblxuXHR2YXIgYyA9IHMgKiB2O1xuXHR2YXIgZiA9IDA7XG5cblx0aWYgKGMgPCAxLjApIHtcblx0XHRmID0gKHYgLSBjKSAvICgxIC0gYyk7XG5cdH1cblxuXHRyZXR1cm4gW2hzdlswXSwgYyAqIDEwMCwgZiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhjZy5yZ2IgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdHZhciBoID0gaGNnWzBdIC8gMzYwO1xuXHR2YXIgYyA9IGhjZ1sxXSAvIDEwMDtcblx0dmFyIGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0aWYgKGMgPT09IDAuMCkge1xuXHRcdHJldHVybiBbZyAqIDI1NSwgZyAqIDI1NSwgZyAqIDI1NV07XG5cdH1cblxuXHR2YXIgcHVyZSA9IFswLCAwLCAwXTtcblx0dmFyIGhpID0gKGggJSAxKSAqIDY7XG5cdHZhciB2ID0gaGkgJSAxO1xuXHR2YXIgdyA9IDEgLSB2O1xuXHR2YXIgbWcgPSAwO1xuXG5cdHN3aXRjaCAoTWF0aC5mbG9vcihoaSkpIHtcblx0XHRjYXNlIDA6XG5cdFx0XHRwdXJlWzBdID0gMTsgcHVyZVsxXSA9IHY7IHB1cmVbMl0gPSAwOyBicmVhaztcblx0XHRjYXNlIDE6XG5cdFx0XHRwdXJlWzBdID0gdzsgcHVyZVsxXSA9IDE7IHB1cmVbMl0gPSAwOyBicmVhaztcblx0XHRjYXNlIDI6XG5cdFx0XHRwdXJlWzBdID0gMDsgcHVyZVsxXSA9IDE7IHB1cmVbMl0gPSB2OyBicmVhaztcblx0XHRjYXNlIDM6XG5cdFx0XHRwdXJlWzBdID0gMDsgcHVyZVsxXSA9IHc7IHB1cmVbMl0gPSAxOyBicmVhaztcblx0XHRjYXNlIDQ6XG5cdFx0XHRwdXJlWzBdID0gdjsgcHVyZVsxXSA9IDA7IHB1cmVbMl0gPSAxOyBicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0cHVyZVswXSA9IDE7IHB1cmVbMV0gPSAwOyBwdXJlWzJdID0gdztcblx0fVxuXG5cdG1nID0gKDEuMCAtIGMpICogZztcblxuXHRyZXR1cm4gW1xuXHRcdChjICogcHVyZVswXSArIG1nKSAqIDI1NSxcblx0XHQoYyAqIHB1cmVbMV0gKyBtZykgKiAyNTUsXG5cdFx0KGMgKiBwdXJlWzJdICsgbWcpICogMjU1XG5cdF07XG59O1xuXG5jb252ZXJ0LmhjZy5oc3YgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdHZhciBjID0gaGNnWzFdIC8gMTAwO1xuXHR2YXIgZyA9IGhjZ1syXSAvIDEwMDtcblxuXHR2YXIgdiA9IGMgKyBnICogKDEuMCAtIGMpO1xuXHR2YXIgZiA9IDA7XG5cblx0aWYgKHYgPiAwLjApIHtcblx0XHRmID0gYyAvIHY7XG5cdH1cblxuXHRyZXR1cm4gW2hjZ1swXSwgZiAqIDEwMCwgdiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhjZy5oc2wgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdHZhciBjID0gaGNnWzFdIC8gMTAwO1xuXHR2YXIgZyA9IGhjZ1syXSAvIDEwMDtcblxuXHR2YXIgbCA9IGcgKiAoMS4wIC0gYykgKyAwLjUgKiBjO1xuXHR2YXIgcyA9IDA7XG5cblx0aWYgKGwgPiAwLjAgJiYgbCA8IDAuNSkge1xuXHRcdHMgPSBjIC8gKDIgKiBsKTtcblx0fSBlbHNlXG5cdGlmIChsID49IDAuNSAmJiBsIDwgMS4wKSB7XG5cdFx0cyA9IGMgLyAoMiAqICgxIC0gbCkpO1xuXHR9XG5cblx0cmV0dXJuIFtoY2dbMF0sIHMgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cuaHdiID0gZnVuY3Rpb24gKGhjZykge1xuXHR2YXIgYyA9IGhjZ1sxXSAvIDEwMDtcblx0dmFyIGcgPSBoY2dbMl0gLyAxMDA7XG5cdHZhciB2ID0gYyArIGcgKiAoMS4wIC0gYyk7XG5cdHJldHVybiBbaGNnWzBdLCAodiAtIGMpICogMTAwLCAoMSAtIHYpICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHdiLmhjZyA9IGZ1bmN0aW9uIChod2IpIHtcblx0dmFyIHcgPSBod2JbMV0gLyAxMDA7XG5cdHZhciBiID0gaHdiWzJdIC8gMTAwO1xuXHR2YXIgdiA9IDEgLSBiO1xuXHR2YXIgYyA9IHYgLSB3O1xuXHR2YXIgZyA9IDA7XG5cblx0aWYgKGMgPCAxKSB7XG5cdFx0ZyA9ICh2IC0gYykgLyAoMSAtIGMpO1xuXHR9XG5cblx0cmV0dXJuIFtod2JbMF0sIGMgKiAxMDAsIGcgKiAxMDBdO1xufTtcblxuY29udmVydC5hcHBsZS5yZ2IgPSBmdW5jdGlvbiAoYXBwbGUpIHtcblx0cmV0dXJuIFsoYXBwbGVbMF0gLyA2NTUzNSkgKiAyNTUsIChhcHBsZVsxXSAvIDY1NTM1KSAqIDI1NSwgKGFwcGxlWzJdIC8gNjU1MzUpICogMjU1XTtcbn07XG5cbmNvbnZlcnQucmdiLmFwcGxlID0gZnVuY3Rpb24gKHJnYikge1xuXHRyZXR1cm4gWyhyZ2JbMF0gLyAyNTUpICogNjU1MzUsIChyZ2JbMV0gLyAyNTUpICogNjU1MzUsIChyZ2JbMl0gLyAyNTUpICogNjU1MzVdO1xufTtcblxuY29udmVydC5ncmF5LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHJldHVybiBbYXJnc1swXSAvIDEwMCAqIDI1NSwgYXJnc1swXSAvIDEwMCAqIDI1NSwgYXJnc1swXSAvIDEwMCAqIDI1NV07XG59O1xuXG5jb252ZXJ0LmdyYXkuaHNsID0gY29udmVydC5ncmF5LmhzdiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHJldHVybiBbMCwgMCwgYXJnc1swXV07XG59O1xuXG5jb252ZXJ0LmdyYXkuaHdiID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0cmV0dXJuIFswLCAxMDAsIGdyYXlbMF1dO1xufTtcblxuY29udmVydC5ncmF5LmNteWsgPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRyZXR1cm4gWzAsIDAsIDAsIGdyYXlbMF1dO1xufTtcblxuY29udmVydC5ncmF5LmxhYiA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHJldHVybiBbZ3JheVswXSwgMCwgMF07XG59O1xuXG5jb252ZXJ0LmdyYXkuaGV4ID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0dmFyIHZhbCA9IE1hdGgucm91bmQoZ3JheVswXSAvIDEwMCAqIDI1NSkgJiAweEZGO1xuXHR2YXIgaW50ZWdlciA9ICh2YWwgPDwgMTYpICsgKHZhbCA8PCA4KSArIHZhbDtcblxuXHR2YXIgc3RyaW5nID0gaW50ZWdlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuICcwMDAwMDAnLnN1YnN0cmluZyhzdHJpbmcubGVuZ3RoKSArIHN0cmluZztcbn07XG5cbmNvbnZlcnQucmdiLmdyYXkgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciB2YWwgPSAocmdiWzBdICsgcmdiWzFdICsgcmdiWzJdKSAvIDM7XG5cdHJldHVybiBbdmFsIC8gMjU1ICogMTAwXTtcbn07XG4iLCJ2YXIgY29udmVyc2lvbnMgPSByZXF1aXJlKCcuL2NvbnZlcnNpb25zJyk7XG52YXIgcm91dGUgPSByZXF1aXJlKCcuL3JvdXRlJyk7XG5cbnZhciBjb252ZXJ0ID0ge307XG5cbnZhciBtb2RlbHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9ucyk7XG5cbmZ1bmN0aW9uIHdyYXBSYXcoZm4pIHtcblx0dmFyIHdyYXBwZWRGbiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdFx0aWYgKGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gYXJncztcblx0XHR9XG5cblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXHRcdH1cblxuXHRcdHJldHVybiBmbihhcmdzKTtcblx0fTtcblxuXHQvLyBwcmVzZXJ2ZSAuY29udmVyc2lvbiBwcm9wZXJ0eSBpZiB0aGVyZSBpcyBvbmVcblx0aWYgKCdjb252ZXJzaW9uJyBpbiBmbikge1xuXHRcdHdyYXBwZWRGbi5jb252ZXJzaW9uID0gZm4uY29udmVyc2lvbjtcblx0fVxuXG5cdHJldHVybiB3cmFwcGVkRm47XG59XG5cbmZ1bmN0aW9uIHdyYXBSb3VuZGVkKGZuKSB7XG5cdHZhciB3cmFwcGVkRm4gPSBmdW5jdGlvbiAoYXJncykge1xuXHRcdGlmIChhcmdzID09PSB1bmRlZmluZWQgfHwgYXJncyA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGFyZ3M7XG5cdFx0fVxuXG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblx0XHR9XG5cblx0XHR2YXIgcmVzdWx0ID0gZm4oYXJncyk7XG5cblx0XHQvLyB3ZSdyZSBhc3N1bWluZyB0aGUgcmVzdWx0IGlzIGFuIGFycmF5IGhlcmUuXG5cdFx0Ly8gc2VlIG5vdGljZSBpbiBjb252ZXJzaW9ucy5qczsgZG9uJ3QgdXNlIGJveCB0eXBlc1xuXHRcdC8vIGluIGNvbnZlcnNpb24gZnVuY3Rpb25zLlxuXHRcdGlmICh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0Jykge1xuXHRcdFx0Zm9yICh2YXIgbGVuID0gcmVzdWx0Lmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0XHRyZXN1bHRbaV0gPSBNYXRoLnJvdW5kKHJlc3VsdFtpXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcblxuXHQvLyBwcmVzZXJ2ZSAuY29udmVyc2lvbiBwcm9wZXJ0eSBpZiB0aGVyZSBpcyBvbmVcblx0aWYgKCdjb252ZXJzaW9uJyBpbiBmbikge1xuXHRcdHdyYXBwZWRGbi5jb252ZXJzaW9uID0gZm4uY29udmVyc2lvbjtcblx0fVxuXG5cdHJldHVybiB3cmFwcGVkRm47XG59XG5cbm1vZGVscy5mb3JFYWNoKGZ1bmN0aW9uIChmcm9tTW9kZWwpIHtcblx0Y29udmVydFtmcm9tTW9kZWxdID0ge307XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbZnJvbU1vZGVsXSwgJ2NoYW5uZWxzJywge3ZhbHVlOiBjb252ZXJzaW9uc1tmcm9tTW9kZWxdLmNoYW5uZWxzfSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W2Zyb21Nb2RlbF0sICdsYWJlbHMnLCB7dmFsdWU6IGNvbnZlcnNpb25zW2Zyb21Nb2RlbF0ubGFiZWxzfSk7XG5cblx0dmFyIHJvdXRlcyA9IHJvdXRlKGZyb21Nb2RlbCk7XG5cdHZhciByb3V0ZU1vZGVscyA9IE9iamVjdC5rZXlzKHJvdXRlcyk7XG5cblx0cm91dGVNb2RlbHMuZm9yRWFjaChmdW5jdGlvbiAodG9Nb2RlbCkge1xuXHRcdHZhciBmbiA9IHJvdXRlc1t0b01vZGVsXTtcblxuXHRcdGNvbnZlcnRbZnJvbU1vZGVsXVt0b01vZGVsXSA9IHdyYXBSb3VuZGVkKGZuKTtcblx0XHRjb252ZXJ0W2Zyb21Nb2RlbF1bdG9Nb2RlbF0ucmF3ID0gd3JhcFJhdyhmbik7XG5cdH0pO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydDtcbiIsInZhciBjb252ZXJzaW9ucyA9IHJlcXVpcmUoJy4vY29udmVyc2lvbnMnKTtcblxuLypcblx0dGhpcyBmdW5jdGlvbiByb3V0ZXMgYSBtb2RlbCB0byBhbGwgb3RoZXIgbW9kZWxzLlxuXG5cdGFsbCBmdW5jdGlvbnMgdGhhdCBhcmUgcm91dGVkIGhhdmUgYSBwcm9wZXJ0eSBgLmNvbnZlcnNpb25gIGF0dGFjaGVkXG5cdHRvIHRoZSByZXR1cm5lZCBzeW50aGV0aWMgZnVuY3Rpb24uIFRoaXMgcHJvcGVydHkgaXMgYW4gYXJyYXlcblx0b2Ygc3RyaW5ncywgZWFjaCB3aXRoIHRoZSBzdGVwcyBpbiBiZXR3ZWVuIHRoZSAnZnJvbScgYW5kICd0bydcblx0Y29sb3IgbW9kZWxzIChpbmNsdXNpdmUpLlxuXG5cdGNvbnZlcnNpb25zIHRoYXQgYXJlIG5vdCBwb3NzaWJsZSBzaW1wbHkgYXJlIG5vdCBpbmNsdWRlZC5cbiovXG5cbmZ1bmN0aW9uIGJ1aWxkR3JhcGgoKSB7XG5cdHZhciBncmFwaCA9IHt9O1xuXHQvLyBodHRwczovL2pzcGVyZi5jb20vb2JqZWN0LWtleXMtdnMtZm9yLWluLXdpdGgtY2xvc3VyZS8zXG5cdHZhciBtb2RlbHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9ucyk7XG5cblx0Zm9yICh2YXIgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdGdyYXBoW21vZGVsc1tpXV0gPSB7XG5cdFx0XHQvLyBodHRwOi8vanNwZXJmLmNvbS8xLXZzLWluZmluaXR5XG5cdFx0XHQvLyBtaWNyby1vcHQsIGJ1dCB0aGlzIGlzIHNpbXBsZS5cblx0XHRcdGRpc3RhbmNlOiAtMSxcblx0XHRcdHBhcmVudDogbnVsbFxuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4gZ3JhcGg7XG59XG5cbi8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JyZWFkdGgtZmlyc3Rfc2VhcmNoXG5mdW5jdGlvbiBkZXJpdmVCRlMoZnJvbU1vZGVsKSB7XG5cdHZhciBncmFwaCA9IGJ1aWxkR3JhcGgoKTtcblx0dmFyIHF1ZXVlID0gW2Zyb21Nb2RlbF07IC8vIHVuc2hpZnQgLT4gcXVldWUgLT4gcG9wXG5cblx0Z3JhcGhbZnJvbU1vZGVsXS5kaXN0YW5jZSA9IDA7XG5cblx0d2hpbGUgKHF1ZXVlLmxlbmd0aCkge1xuXHRcdHZhciBjdXJyZW50ID0gcXVldWUucG9wKCk7XG5cdFx0dmFyIGFkamFjZW50cyA9IE9iamVjdC5rZXlzKGNvbnZlcnNpb25zW2N1cnJlbnRdKTtcblxuXHRcdGZvciAodmFyIGxlbiA9IGFkamFjZW50cy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdHZhciBhZGphY2VudCA9IGFkamFjZW50c1tpXTtcblx0XHRcdHZhciBub2RlID0gZ3JhcGhbYWRqYWNlbnRdO1xuXG5cdFx0XHRpZiAobm9kZS5kaXN0YW5jZSA9PT0gLTEpIHtcblx0XHRcdFx0bm9kZS5kaXN0YW5jZSA9IGdyYXBoW2N1cnJlbnRdLmRpc3RhbmNlICsgMTtcblx0XHRcdFx0bm9kZS5wYXJlbnQgPSBjdXJyZW50O1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KGFkamFjZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZ3JhcGg7XG59XG5cbmZ1bmN0aW9uIGxpbmsoZnJvbSwgdG8pIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChhcmdzKSB7XG5cdFx0cmV0dXJuIHRvKGZyb20oYXJncykpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCkge1xuXHR2YXIgcGF0aCA9IFtncmFwaFt0b01vZGVsXS5wYXJlbnQsIHRvTW9kZWxdO1xuXHR2YXIgZm4gPSBjb252ZXJzaW9uc1tncmFwaFt0b01vZGVsXS5wYXJlbnRdW3RvTW9kZWxdO1xuXG5cdHZhciBjdXIgPSBncmFwaFt0b01vZGVsXS5wYXJlbnQ7XG5cdHdoaWxlIChncmFwaFtjdXJdLnBhcmVudCkge1xuXHRcdHBhdGgudW5zaGlmdChncmFwaFtjdXJdLnBhcmVudCk7XG5cdFx0Zm4gPSBsaW5rKGNvbnZlcnNpb25zW2dyYXBoW2N1cl0ucGFyZW50XVtjdXJdLCBmbik7XG5cdFx0Y3VyID0gZ3JhcGhbY3VyXS5wYXJlbnQ7XG5cdH1cblxuXHRmbi5jb252ZXJzaW9uID0gcGF0aDtcblx0cmV0dXJuIGZuO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmcm9tTW9kZWwpIHtcblx0dmFyIGdyYXBoID0gZGVyaXZlQkZTKGZyb21Nb2RlbCk7XG5cdHZhciBjb252ZXJzaW9uID0ge307XG5cblx0dmFyIG1vZGVscyA9IE9iamVjdC5rZXlzKGdyYXBoKTtcblx0Zm9yICh2YXIgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdHZhciB0b01vZGVsID0gbW9kZWxzW2ldO1xuXHRcdHZhciBub2RlID0gZ3JhcGhbdG9Nb2RlbF07XG5cblx0XHRpZiAobm9kZS5wYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdC8vIG5vIHBvc3NpYmxlIGNvbnZlcnNpb24sIG9yIHRoaXMgbm9kZSBpcyB0aGUgc291cmNlIG1vZGVsLlxuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29udmVyc2lvblt0b01vZGVsXSA9IHdyYXBDb252ZXJzaW9uKHRvTW9kZWwsIGdyYXBoKTtcblx0fVxuXG5cdHJldHVybiBjb252ZXJzaW9uO1xufTtcblxuIiwiJ3VzZSBzdHJpY3QnXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHRcImFsaWNlYmx1ZVwiOiBbMjQwLCAyNDgsIDI1NV0sXHJcblx0XCJhbnRpcXVld2hpdGVcIjogWzI1MCwgMjM1LCAyMTVdLFxyXG5cdFwiYXF1YVwiOiBbMCwgMjU1LCAyNTVdLFxyXG5cdFwiYXF1YW1hcmluZVwiOiBbMTI3LCAyNTUsIDIxMl0sXHJcblx0XCJhenVyZVwiOiBbMjQwLCAyNTUsIDI1NV0sXHJcblx0XCJiZWlnZVwiOiBbMjQ1LCAyNDUsIDIyMF0sXHJcblx0XCJiaXNxdWVcIjogWzI1NSwgMjI4LCAxOTZdLFxyXG5cdFwiYmxhY2tcIjogWzAsIDAsIDBdLFxyXG5cdFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwgMjM1LCAyMDVdLFxyXG5cdFwiYmx1ZVwiOiBbMCwgMCwgMjU1XSxcclxuXHRcImJsdWV2aW9sZXRcIjogWzEzOCwgNDMsIDIyNl0sXHJcblx0XCJicm93blwiOiBbMTY1LCA0MiwgNDJdLFxyXG5cdFwiYnVybHl3b29kXCI6IFsyMjIsIDE4NCwgMTM1XSxcclxuXHRcImNhZGV0Ymx1ZVwiOiBbOTUsIDE1OCwgMTYwXSxcclxuXHRcImNoYXJ0cmV1c2VcIjogWzEyNywgMjU1LCAwXSxcclxuXHRcImNob2NvbGF0ZVwiOiBbMjEwLCAxMDUsIDMwXSxcclxuXHRcImNvcmFsXCI6IFsyNTUsIDEyNywgODBdLFxyXG5cdFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwgMTQ5LCAyMzddLFxyXG5cdFwiY29ybnNpbGtcIjogWzI1NSwgMjQ4LCAyMjBdLFxyXG5cdFwiY3JpbXNvblwiOiBbMjIwLCAyMCwgNjBdLFxyXG5cdFwiY3lhblwiOiBbMCwgMjU1LCAyNTVdLFxyXG5cdFwiZGFya2JsdWVcIjogWzAsIDAsIDEzOV0sXHJcblx0XCJkYXJrY3lhblwiOiBbMCwgMTM5LCAxMzldLFxyXG5cdFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LCAxMzQsIDExXSxcclxuXHRcImRhcmtncmF5XCI6IFsxNjksIDE2OSwgMTY5XSxcclxuXHRcImRhcmtncmVlblwiOiBbMCwgMTAwLCAwXSxcclxuXHRcImRhcmtncmV5XCI6IFsxNjksIDE2OSwgMTY5XSxcclxuXHRcImRhcmtraGFraVwiOiBbMTg5LCAxODMsIDEwN10sXHJcblx0XCJkYXJrbWFnZW50YVwiOiBbMTM5LCAwLCAxMzldLFxyXG5cdFwiZGFya29saXZlZ3JlZW5cIjogWzg1LCAxMDcsIDQ3XSxcclxuXHRcImRhcmtvcmFuZ2VcIjogWzI1NSwgMTQwLCAwXSxcclxuXHRcImRhcmtvcmNoaWRcIjogWzE1MywgNTAsIDIwNF0sXHJcblx0XCJkYXJrcmVkXCI6IFsxMzksIDAsIDBdLFxyXG5cdFwiZGFya3NhbG1vblwiOiBbMjMzLCAxNTAsIDEyMl0sXHJcblx0XCJkYXJrc2VhZ3JlZW5cIjogWzE0MywgMTg4LCAxNDNdLFxyXG5cdFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsIDYxLCAxMzldLFxyXG5cdFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsIDc5LCA3OV0sXHJcblx0XCJkYXJrc2xhdGVncmV5XCI6IFs0NywgNzksIDc5XSxcclxuXHRcImRhcmt0dXJxdW9pc2VcIjogWzAsIDIwNiwgMjA5XSxcclxuXHRcImRhcmt2aW9sZXRcIjogWzE0OCwgMCwgMjExXSxcclxuXHRcImRlZXBwaW5rXCI6IFsyNTUsIDIwLCAxNDddLFxyXG5cdFwiZGVlcHNreWJsdWVcIjogWzAsIDE5MSwgMjU1XSxcclxuXHRcImRpbWdyYXlcIjogWzEwNSwgMTA1LCAxMDVdLFxyXG5cdFwiZGltZ3JleVwiOiBbMTA1LCAxMDUsIDEwNV0sXHJcblx0XCJkb2RnZXJibHVlXCI6IFszMCwgMTQ0LCAyNTVdLFxyXG5cdFwiZmlyZWJyaWNrXCI6IFsxNzgsIDM0LCAzNF0sXHJcblx0XCJmbG9yYWx3aGl0ZVwiOiBbMjU1LCAyNTAsIDI0MF0sXHJcblx0XCJmb3Jlc3RncmVlblwiOiBbMzQsIDEzOSwgMzRdLFxyXG5cdFwiZnVjaHNpYVwiOiBbMjU1LCAwLCAyNTVdLFxyXG5cdFwiZ2FpbnNib3JvXCI6IFsyMjAsIDIyMCwgMjIwXSxcclxuXHRcImdob3N0d2hpdGVcIjogWzI0OCwgMjQ4LCAyNTVdLFxyXG5cdFwiZ29sZFwiOiBbMjU1LCAyMTUsIDBdLFxyXG5cdFwiZ29sZGVucm9kXCI6IFsyMTgsIDE2NSwgMzJdLFxyXG5cdFwiZ3JheVwiOiBbMTI4LCAxMjgsIDEyOF0sXHJcblx0XCJncmVlblwiOiBbMCwgMTI4LCAwXSxcclxuXHRcImdyZWVueWVsbG93XCI6IFsxNzMsIDI1NSwgNDddLFxyXG5cdFwiZ3JleVwiOiBbMTI4LCAxMjgsIDEyOF0sXHJcblx0XCJob25leWRld1wiOiBbMjQwLCAyNTUsIDI0MF0sXHJcblx0XCJob3RwaW5rXCI6IFsyNTUsIDEwNSwgMTgwXSxcclxuXHRcImluZGlhbnJlZFwiOiBbMjA1LCA5MiwgOTJdLFxyXG5cdFwiaW5kaWdvXCI6IFs3NSwgMCwgMTMwXSxcclxuXHRcIml2b3J5XCI6IFsyNTUsIDI1NSwgMjQwXSxcclxuXHRcImtoYWtpXCI6IFsyNDAsIDIzMCwgMTQwXSxcclxuXHRcImxhdmVuZGVyXCI6IFsyMzAsIDIzMCwgMjUwXSxcclxuXHRcImxhdmVuZGVyYmx1c2hcIjogWzI1NSwgMjQwLCAyNDVdLFxyXG5cdFwibGF3bmdyZWVuXCI6IFsxMjQsIDI1MiwgMF0sXHJcblx0XCJsZW1vbmNoaWZmb25cIjogWzI1NSwgMjUwLCAyMDVdLFxyXG5cdFwibGlnaHRibHVlXCI6IFsxNzMsIDIxNiwgMjMwXSxcclxuXHRcImxpZ2h0Y29yYWxcIjogWzI0MCwgMTI4LCAxMjhdLFxyXG5cdFwibGlnaHRjeWFuXCI6IFsyMjQsIDI1NSwgMjU1XSxcclxuXHRcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFsyNTAsIDI1MCwgMjEwXSxcclxuXHRcImxpZ2h0Z3JheVwiOiBbMjExLCAyMTEsIDIxMV0sXHJcblx0XCJsaWdodGdyZWVuXCI6IFsxNDQsIDIzOCwgMTQ0XSxcclxuXHRcImxpZ2h0Z3JleVwiOiBbMjExLCAyMTEsIDIxMV0sXHJcblx0XCJsaWdodHBpbmtcIjogWzI1NSwgMTgyLCAxOTNdLFxyXG5cdFwibGlnaHRzYWxtb25cIjogWzI1NSwgMTYwLCAxMjJdLFxyXG5cdFwibGlnaHRzZWFncmVlblwiOiBbMzIsIDE3OCwgMTcwXSxcclxuXHRcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDI1MF0sXHJcblx0XCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LCAxMzYsIDE1M10sXHJcblx0XCJsaWdodHNsYXRlZ3JleVwiOiBbMTE5LCAxMzYsIDE1M10sXHJcblx0XCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LCAxOTYsIDIyMl0sXHJcblx0XCJsaWdodHllbGxvd1wiOiBbMjU1LCAyNTUsIDIyNF0sXHJcblx0XCJsaW1lXCI6IFswLCAyNTUsIDBdLFxyXG5cdFwibGltZWdyZWVuXCI6IFs1MCwgMjA1LCA1MF0sXHJcblx0XCJsaW5lblwiOiBbMjUwLCAyNDAsIDIzMF0sXHJcblx0XCJtYWdlbnRhXCI6IFsyNTUsIDAsIDI1NV0sXHJcblx0XCJtYXJvb25cIjogWzEyOCwgMCwgMF0sXHJcblx0XCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsIDIwNSwgMTcwXSxcclxuXHRcIm1lZGl1bWJsdWVcIjogWzAsIDAsIDIwNV0sXHJcblx0XCJtZWRpdW1vcmNoaWRcIjogWzE4NiwgODUsIDIxMV0sXHJcblx0XCJtZWRpdW1wdXJwbGVcIjogWzE0NywgMTEyLCAyMTldLFxyXG5cdFwibWVkaXVtc2VhZ3JlZW5cIjogWzYwLCAxNzksIDExM10sXHJcblx0XCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywgMTA0LCAyMzhdLFxyXG5cdFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsIDI1MCwgMTU0XSxcclxuXHRcIm1lZGl1bXR1cnF1b2lzZVwiOiBbNzIsIDIwOSwgMjA0XSxcclxuXHRcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LCAyMSwgMTMzXSxcclxuXHRcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsIDI1LCAxMTJdLFxyXG5cdFwibWludGNyZWFtXCI6IFsyNDUsIDI1NSwgMjUwXSxcclxuXHRcIm1pc3R5cm9zZVwiOiBbMjU1LCAyMjgsIDIyNV0sXHJcblx0XCJtb2NjYXNpblwiOiBbMjU1LCAyMjgsIDE4MV0sXHJcblx0XCJuYXZham93aGl0ZVwiOiBbMjU1LCAyMjIsIDE3M10sXHJcblx0XCJuYXZ5XCI6IFswLCAwLCAxMjhdLFxyXG5cdFwib2xkbGFjZVwiOiBbMjUzLCAyNDUsIDIzMF0sXHJcblx0XCJvbGl2ZVwiOiBbMTI4LCAxMjgsIDBdLFxyXG5cdFwib2xpdmVkcmFiXCI6IFsxMDcsIDE0MiwgMzVdLFxyXG5cdFwib3JhbmdlXCI6IFsyNTUsIDE2NSwgMF0sXHJcblx0XCJvcmFuZ2VyZWRcIjogWzI1NSwgNjksIDBdLFxyXG5cdFwib3JjaGlkXCI6IFsyMTgsIDExMiwgMjE0XSxcclxuXHRcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwgMjMyLCAxNzBdLFxyXG5cdFwicGFsZWdyZWVuXCI6IFsxNTIsIDI1MSwgMTUyXSxcclxuXHRcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwgMjM4LCAyMzhdLFxyXG5cdFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LCAxMTIsIDE0N10sXHJcblx0XCJwYXBheWF3aGlwXCI6IFsyNTUsIDIzOSwgMjEzXSxcclxuXHRcInBlYWNocHVmZlwiOiBbMjU1LCAyMTgsIDE4NV0sXHJcblx0XCJwZXJ1XCI6IFsyMDUsIDEzMywgNjNdLFxyXG5cdFwicGlua1wiOiBbMjU1LCAxOTIsIDIwM10sXHJcblx0XCJwbHVtXCI6IFsyMjEsIDE2MCwgMjIxXSxcclxuXHRcInBvd2RlcmJsdWVcIjogWzE3NiwgMjI0LCAyMzBdLFxyXG5cdFwicHVycGxlXCI6IFsxMjgsIDAsIDEyOF0sXHJcblx0XCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsIDUxLCAxNTNdLFxyXG5cdFwicmVkXCI6IFsyNTUsIDAsIDBdLFxyXG5cdFwicm9zeWJyb3duXCI6IFsxODgsIDE0MywgMTQzXSxcclxuXHRcInJveWFsYmx1ZVwiOiBbNjUsIDEwNSwgMjI1XSxcclxuXHRcInNhZGRsZWJyb3duXCI6IFsxMzksIDY5LCAxOV0sXHJcblx0XCJzYWxtb25cIjogWzI1MCwgMTI4LCAxMTRdLFxyXG5cdFwic2FuZHlicm93blwiOiBbMjQ0LCAxNjQsIDk2XSxcclxuXHRcInNlYWdyZWVuXCI6IFs0NiwgMTM5LCA4N10sXHJcblx0XCJzZWFzaGVsbFwiOiBbMjU1LCAyNDUsIDIzOF0sXHJcblx0XCJzaWVubmFcIjogWzE2MCwgODIsIDQ1XSxcclxuXHRcInNpbHZlclwiOiBbMTkyLCAxOTIsIDE5Ml0sXHJcblx0XCJza3libHVlXCI6IFsxMzUsIDIwNiwgMjM1XSxcclxuXHRcInNsYXRlYmx1ZVwiOiBbMTA2LCA5MCwgMjA1XSxcclxuXHRcInNsYXRlZ3JheVwiOiBbMTEyLCAxMjgsIDE0NF0sXHJcblx0XCJzbGF0ZWdyZXlcIjogWzExMiwgMTI4LCAxNDRdLFxyXG5cdFwic25vd1wiOiBbMjU1LCAyNTAsIDI1MF0sXHJcblx0XCJzcHJpbmdncmVlblwiOiBbMCwgMjU1LCAxMjddLFxyXG5cdFwic3RlZWxibHVlXCI6IFs3MCwgMTMwLCAxODBdLFxyXG5cdFwidGFuXCI6IFsyMTAsIDE4MCwgMTQwXSxcclxuXHRcInRlYWxcIjogWzAsIDEyOCwgMTI4XSxcclxuXHRcInRoaXN0bGVcIjogWzIxNiwgMTkxLCAyMTZdLFxyXG5cdFwidG9tYXRvXCI6IFsyNTUsIDk5LCA3MV0sXHJcblx0XCJ0dXJxdW9pc2VcIjogWzY0LCAyMjQsIDIwOF0sXHJcblx0XCJ2aW9sZXRcIjogWzIzOCwgMTMwLCAyMzhdLFxyXG5cdFwid2hlYXRcIjogWzI0NSwgMjIyLCAxNzldLFxyXG5cdFwid2hpdGVcIjogWzI1NSwgMjU1LCAyNTVdLFxyXG5cdFwid2hpdGVzbW9rZVwiOiBbMjQ1LCAyNDUsIDI0NV0sXHJcblx0XCJ5ZWxsb3dcIjogWzI1NSwgMjU1LCAwXSxcclxuXHRcInllbGxvd2dyZWVuXCI6IFsxNTQsIDIwNSwgNTBdXHJcbn07XHJcbiIsIi8qIE1JVCBsaWNlbnNlICovXG52YXIgY29sb3JOYW1lcyA9IHJlcXVpcmUoJ2NvbG9yLW5hbWUnKTtcbnZhciBzd2l6emxlID0gcmVxdWlyZSgnc2ltcGxlLXN3aXp6bGUnKTtcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIHJldmVyc2VOYW1lcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbi8vIGNyZWF0ZSBhIGxpc3Qgb2YgcmV2ZXJzZSBjb2xvciBuYW1lc1xuZm9yICh2YXIgbmFtZSBpbiBjb2xvck5hbWVzKSB7XG5cdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbG9yTmFtZXMsIG5hbWUpKSB7XG5cdFx0cmV2ZXJzZU5hbWVzW2NvbG9yTmFtZXNbbmFtZV1dID0gbmFtZTtcblx0fVxufVxuXG52YXIgY3MgPSBtb2R1bGUuZXhwb3J0cyA9IHtcblx0dG86IHt9LFxuXHRnZXQ6IHt9XG59O1xuXG5jcy5nZXQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdHZhciBwcmVmaXggPSBzdHJpbmcuc3Vic3RyaW5nKDAsIDMpLnRvTG93ZXJDYXNlKCk7XG5cdHZhciB2YWw7XG5cdHZhciBtb2RlbDtcblx0c3dpdGNoIChwcmVmaXgpIHtcblx0XHRjYXNlICdoc2wnOlxuXHRcdFx0dmFsID0gY3MuZ2V0LmhzbChzdHJpbmcpO1xuXHRcdFx0bW9kZWwgPSAnaHNsJztcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ2h3Yic6XG5cdFx0XHR2YWwgPSBjcy5nZXQuaHdiKHN0cmluZyk7XG5cdFx0XHRtb2RlbCA9ICdod2InO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHZhbCA9IGNzLmdldC5yZ2Ioc3RyaW5nKTtcblx0XHRcdG1vZGVsID0gJ3JnYic7XG5cdFx0XHRicmVhaztcblx0fVxuXG5cdGlmICghdmFsKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRyZXR1cm4ge21vZGVsOiBtb2RlbCwgdmFsdWU6IHZhbH07XG59O1xuXG5jcy5nZXQucmdiID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHRpZiAoIXN0cmluZykge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0dmFyIGFiYnIgPSAvXiMoW2EtZjAtOV17Myw0fSkkL2k7XG5cdHZhciBoZXggPSAvXiMoW2EtZjAtOV17Nn0pKFthLWYwLTldezJ9KT8kL2k7XG5cdHZhciByZ2JhID0gL15yZ2JhP1xcKFxccyooWystXT9cXGQrKSg/PVtcXHMsXSlcXHMqKD86LFxccyopPyhbKy1dP1xcZCspKD89W1xccyxdKVxccyooPzosXFxzKik/KFsrLV0/XFxkKylcXHMqKD86Wyx8XFwvXVxccyooWystXT9bXFxkXFwuXSspKCU/KVxccyopP1xcKSQvO1xuXHR2YXIgcGVyID0gL15yZ2JhP1xcKFxccyooWystXT9bXFxkXFwuXSspXFwlXFxzKiw/XFxzKihbKy1dP1tcXGRcXC5dKylcXCVcXHMqLD9cXHMqKFsrLV0/W1xcZFxcLl0rKVxcJVxccyooPzpbLHxcXC9dXFxzKihbKy1dP1tcXGRcXC5dKykoJT8pXFxzKik/XFwpJC87XG5cdHZhciBrZXl3b3JkID0gL14oXFx3KykkLztcblxuXHR2YXIgcmdiID0gWzAsIDAsIDAsIDFdO1xuXHR2YXIgbWF0Y2g7XG5cdHZhciBpO1xuXHR2YXIgaGV4QWxwaGE7XG5cblx0aWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKGhleCkpIHtcblx0XHRoZXhBbHBoYSA9IG1hdGNoWzJdO1xuXHRcdG1hdGNoID0gbWF0Y2hbMV07XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0XHQvLyBodHRwczovL2pzcGVyZi5jb20vc2xpY2UtdnMtc3Vic3RyLXZzLXN1YnN0cmluZy1tZXRob2RzLWxvbmctc3RyaW5nLzE5XG5cdFx0XHR2YXIgaTIgPSBpICogMjtcblx0XHRcdHJnYltpXSA9IHBhcnNlSW50KG1hdGNoLnNsaWNlKGkyLCBpMiArIDIpLCAxNik7XG5cdFx0fVxuXG5cdFx0aWYgKGhleEFscGhhKSB7XG5cdFx0XHRyZ2JbM10gPSBwYXJzZUludChoZXhBbHBoYSwgMTYpIC8gMjU1O1xuXHRcdH1cblx0fSBlbHNlIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChhYmJyKSkge1xuXHRcdG1hdGNoID0gbWF0Y2hbMV07XG5cdFx0aGV4QWxwaGEgPSBtYXRjaFszXTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYltpXSA9IHBhcnNlSW50KG1hdGNoW2ldICsgbWF0Y2hbaV0sIDE2KTtcblx0XHR9XG5cblx0XHRpZiAoaGV4QWxwaGEpIHtcblx0XHRcdHJnYlszXSA9IHBhcnNlSW50KGhleEFscGhhICsgaGV4QWxwaGEsIDE2KSAvIDI1NTtcblx0XHR9XG5cdH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2gocmdiYSkpIHtcblx0XHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0XHRyZ2JbaV0gPSBwYXJzZUludChtYXRjaFtpICsgMV0sIDApO1xuXHRcdH1cblxuXHRcdGlmIChtYXRjaFs0XSkge1xuXHRcdFx0aWYgKG1hdGNoWzVdKSB7XG5cdFx0XHRcdHJnYlszXSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pICogMC4wMTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJnYlszXSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChwZXIpKSB7XG5cdFx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0cmdiW2ldID0gTWF0aC5yb3VuZChwYXJzZUZsb2F0KG1hdGNoW2kgKyAxXSkgKiAyLjU1KTtcblx0XHR9XG5cblx0XHRpZiAobWF0Y2hbNF0pIHtcblx0XHRcdGlmIChtYXRjaFs1XSkge1xuXHRcdFx0XHRyZ2JbM10gPSBwYXJzZUZsb2F0KG1hdGNoWzRdKSAqIDAuMDE7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZ2JbM10gPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goa2V5d29yZCkpIHtcblx0XHRpZiAobWF0Y2hbMV0gPT09ICd0cmFuc3BhcmVudCcpIHtcblx0XHRcdHJldHVybiBbMCwgMCwgMCwgMF07XG5cdFx0fVxuXG5cdFx0aWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbG9yTmFtZXMsIG1hdGNoWzFdKSkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0cmdiID0gY29sb3JOYW1lc1ttYXRjaFsxXV07XG5cdFx0cmdiWzNdID0gMTtcblxuXHRcdHJldHVybiByZ2I7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0cmdiW2ldID0gY2xhbXAocmdiW2ldLCAwLCAyNTUpO1xuXHR9XG5cdHJnYlszXSA9IGNsYW1wKHJnYlszXSwgMCwgMSk7XG5cblx0cmV0dXJuIHJnYjtcbn07XG5cbmNzLmdldC5oc2wgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdGlmICghc3RyaW5nKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHR2YXIgaHNsID0gL15oc2xhP1xcKFxccyooWystXT8oPzpcXGR7MCwzfVxcLik/XFxkKykoPzpkZWcpP1xccyosP1xccyooWystXT9bXFxkXFwuXSspJVxccyosP1xccyooWystXT9bXFxkXFwuXSspJVxccyooPzpbLHxcXC9dXFxzKihbKy1dPyg/PVxcLlxcZHxcXGQpKD86MHxbMS05XVxcZCopPyg/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPylcXHMqKT9cXCkkLztcblx0dmFyIG1hdGNoID0gc3RyaW5nLm1hdGNoKGhzbCk7XG5cblx0aWYgKG1hdGNoKSB7XG5cdFx0dmFyIGFscGhhID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG5cdFx0dmFyIGggPSAoKHBhcnNlRmxvYXQobWF0Y2hbMV0pICUgMzYwKSArIDM2MCkgJSAzNjA7XG5cdFx0dmFyIHMgPSBjbGFtcChwYXJzZUZsb2F0KG1hdGNoWzJdKSwgMCwgMTAwKTtcblx0XHR2YXIgbCA9IGNsYW1wKHBhcnNlRmxvYXQobWF0Y2hbM10pLCAwLCAxMDApO1xuXHRcdHZhciBhID0gY2xhbXAoaXNOYU4oYWxwaGEpID8gMSA6IGFscGhhLCAwLCAxKTtcblxuXHRcdHJldHVybiBbaCwgcywgbCwgYV07XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn07XG5cbmNzLmdldC5od2IgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdGlmICghc3RyaW5nKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHR2YXIgaHdiID0gL15od2JcXChcXHMqKFsrLV0/XFxkezAsM30oPzpcXC5cXGQrKT8pKD86ZGVnKT9cXHMqLFxccyooWystXT9bXFxkXFwuXSspJVxccyosXFxzKihbKy1dP1tcXGRcXC5dKyklXFxzKig/OixcXHMqKFsrLV0/KD89XFwuXFxkfFxcZCkoPzowfFsxLTldXFxkKik/KD86XFwuXFxkKik/KD86W2VFXVsrLV0/XFxkKyk/KVxccyopP1xcKSQvO1xuXHR2YXIgbWF0Y2ggPSBzdHJpbmcubWF0Y2goaHdiKTtcblxuXHRpZiAobWF0Y2gpIHtcblx0XHR2YXIgYWxwaGEgPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcblx0XHR2YXIgaCA9ICgocGFyc2VGbG9hdChtYXRjaFsxXSkgJSAzNjApICsgMzYwKSAlIDM2MDtcblx0XHR2YXIgdyA9IGNsYW1wKHBhcnNlRmxvYXQobWF0Y2hbMl0pLCAwLCAxMDApO1xuXHRcdHZhciBiID0gY2xhbXAocGFyc2VGbG9hdChtYXRjaFszXSksIDAsIDEwMCk7XG5cdFx0dmFyIGEgPSBjbGFtcChpc05hTihhbHBoYSkgPyAxIDogYWxwaGEsIDAsIDEpO1xuXHRcdHJldHVybiBbaCwgdywgYiwgYV07XG5cdH1cblxuXHRyZXR1cm4gbnVsbDtcbn07XG5cbmNzLnRvLmhleCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHJnYmEgPSBzd2l6emxlKGFyZ3VtZW50cyk7XG5cblx0cmV0dXJuIChcblx0XHQnIycgK1xuXHRcdGhleERvdWJsZShyZ2JhWzBdKSArXG5cdFx0aGV4RG91YmxlKHJnYmFbMV0pICtcblx0XHRoZXhEb3VibGUocmdiYVsyXSkgK1xuXHRcdChyZ2JhWzNdIDwgMVxuXHRcdFx0PyAoaGV4RG91YmxlKE1hdGgucm91bmQocmdiYVszXSAqIDI1NSkpKVxuXHRcdFx0OiAnJylcblx0KTtcbn07XG5cbmNzLnRvLnJnYiA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHJnYmEgPSBzd2l6emxlKGFyZ3VtZW50cyk7XG5cblx0cmV0dXJuIHJnYmEubGVuZ3RoIDwgNCB8fCByZ2JhWzNdID09PSAxXG5cdFx0PyAncmdiKCcgKyBNYXRoLnJvdW5kKHJnYmFbMF0pICsgJywgJyArIE1hdGgucm91bmQocmdiYVsxXSkgKyAnLCAnICsgTWF0aC5yb3VuZChyZ2JhWzJdKSArICcpJ1xuXHRcdDogJ3JnYmEoJyArIE1hdGgucm91bmQocmdiYVswXSkgKyAnLCAnICsgTWF0aC5yb3VuZChyZ2JhWzFdKSArICcsICcgKyBNYXRoLnJvdW5kKHJnYmFbMl0pICsgJywgJyArIHJnYmFbM10gKyAnKSc7XG59O1xuXG5jcy50by5yZ2IucGVyY2VudCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIHJnYmEgPSBzd2l6emxlKGFyZ3VtZW50cyk7XG5cblx0dmFyIHIgPSBNYXRoLnJvdW5kKHJnYmFbMF0gLyAyNTUgKiAxMDApO1xuXHR2YXIgZyA9IE1hdGgucm91bmQocmdiYVsxXSAvIDI1NSAqIDEwMCk7XG5cdHZhciBiID0gTWF0aC5yb3VuZChyZ2JhWzJdIC8gMjU1ICogMTAwKTtcblxuXHRyZXR1cm4gcmdiYS5sZW5ndGggPCA0IHx8IHJnYmFbM10gPT09IDFcblx0XHQ/ICdyZ2IoJyArIHIgKyAnJSwgJyArIGcgKyAnJSwgJyArIGIgKyAnJSknXG5cdFx0OiAncmdiYSgnICsgciArICclLCAnICsgZyArICclLCAnICsgYiArICclLCAnICsgcmdiYVszXSArICcpJztcbn07XG5cbmNzLnRvLmhzbCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIGhzbGEgPSBzd2l6emxlKGFyZ3VtZW50cyk7XG5cdHJldHVybiBoc2xhLmxlbmd0aCA8IDQgfHwgaHNsYVszXSA9PT0gMVxuXHRcdD8gJ2hzbCgnICsgaHNsYVswXSArICcsICcgKyBoc2xhWzFdICsgJyUsICcgKyBoc2xhWzJdICsgJyUpJ1xuXHRcdDogJ2hzbGEoJyArIGhzbGFbMF0gKyAnLCAnICsgaHNsYVsxXSArICclLCAnICsgaHNsYVsyXSArICclLCAnICsgaHNsYVszXSArICcpJztcbn07XG5cbi8vIGh3YiBpcyBhIGJpdCBkaWZmZXJlbnQgdGhhbiByZ2IoYSkgJiBoc2woYSkgc2luY2UgdGhlcmUgaXMgbm8gYWxwaGEgc3BlY2lmaWMgc3ludGF4XG4vLyAoaHdiIGhhdmUgYWxwaGEgb3B0aW9uYWwgJiAxIGlzIGRlZmF1bHQgdmFsdWUpXG5jcy50by5od2IgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBod2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHZhciBhID0gJyc7XG5cdGlmIChod2JhLmxlbmd0aCA+PSA0ICYmIGh3YmFbM10gIT09IDEpIHtcblx0XHRhID0gJywgJyArIGh3YmFbM107XG5cdH1cblxuXHRyZXR1cm4gJ2h3YignICsgaHdiYVswXSArICcsICcgKyBod2JhWzFdICsgJyUsICcgKyBod2JhWzJdICsgJyUnICsgYSArICcpJztcbn07XG5cbmNzLnRvLmtleXdvcmQgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHJldHVybiByZXZlcnNlTmFtZXNbcmdiLnNsaWNlKDAsIDMpXTtcbn07XG5cbi8vIGhlbHBlcnNcbmZ1bmN0aW9uIGNsYW1wKG51bSwgbWluLCBtYXgpIHtcblx0cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG1pbiwgbnVtKSwgbWF4KTtcbn1cblxuZnVuY3Rpb24gaGV4RG91YmxlKG51bSkge1xuXHR2YXIgc3RyID0gTWF0aC5yb3VuZChudW0pLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRyZXR1cm4gKHN0ci5sZW5ndGggPCAyKSA/ICcwJyArIHN0ciA6IHN0cjtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbG9yU3RyaW5nID0gcmVxdWlyZSgnY29sb3Itc3RyaW5nJyk7XG52YXIgY29udmVydCA9IHJlcXVpcmUoJ2NvbG9yLWNvbnZlcnQnKTtcblxudmFyIF9zbGljZSA9IFtdLnNsaWNlO1xuXG52YXIgc2tpcHBlZE1vZGVscyA9IFtcblx0Ly8gdG8gYmUgaG9uZXN0LCBJIGRvbid0IHJlYWxseSBmZWVsIGxpa2Uga2V5d29yZCBiZWxvbmdzIGluIGNvbG9yIGNvbnZlcnQsIGJ1dCBlaC5cblx0J2tleXdvcmQnLFxuXG5cdC8vIGdyYXkgY29uZmxpY3RzIHdpdGggc29tZSBtZXRob2QgbmFtZXMsIGFuZCBoYXMgaXRzIG93biBtZXRob2QgZGVmaW5lZC5cblx0J2dyYXknLFxuXG5cdC8vIHNob3VsZG4ndCByZWFsbHkgYmUgaW4gY29sb3ItY29udmVydCBlaXRoZXIuLi5cblx0J2hleCdcbl07XG5cbnZhciBoYXNoZWRNb2RlbEtleXMgPSB7fTtcbk9iamVjdC5rZXlzKGNvbnZlcnQpLmZvckVhY2goZnVuY3Rpb24gKG1vZGVsKSB7XG5cdGhhc2hlZE1vZGVsS2V5c1tfc2xpY2UuY2FsbChjb252ZXJ0W21vZGVsXS5sYWJlbHMpLnNvcnQoKS5qb2luKCcnKV0gPSBtb2RlbDtcbn0pO1xuXG52YXIgbGltaXRlcnMgPSB7fTtcblxuZnVuY3Rpb24gQ29sb3Iob2JqLCBtb2RlbCkge1xuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgQ29sb3IpKSB7XG5cdFx0cmV0dXJuIG5ldyBDb2xvcihvYmosIG1vZGVsKTtcblx0fVxuXG5cdGlmIChtb2RlbCAmJiBtb2RlbCBpbiBza2lwcGVkTW9kZWxzKSB7XG5cdFx0bW9kZWwgPSBudWxsO1xuXHR9XG5cblx0aWYgKG1vZGVsICYmICEobW9kZWwgaW4gY29udmVydCkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbW9kZWw6ICcgKyBtb2RlbCk7XG5cdH1cblxuXHR2YXIgaTtcblx0dmFyIGNoYW5uZWxzO1xuXG5cdGlmIChvYmogPT0gbnVsbCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG5cdFx0dGhpcy5tb2RlbCA9ICdyZ2InO1xuXHRcdHRoaXMuY29sb3IgPSBbMCwgMCwgMF07XG5cdFx0dGhpcy52YWxwaGEgPSAxO1xuXHR9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIENvbG9yKSB7XG5cdFx0dGhpcy5tb2RlbCA9IG9iai5tb2RlbDtcblx0XHR0aGlzLmNvbG9yID0gb2JqLmNvbG9yLnNsaWNlKCk7XG5cdFx0dGhpcy52YWxwaGEgPSBvYmoudmFscGhhO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG5cdFx0dmFyIHJlc3VsdCA9IGNvbG9yU3RyaW5nLmdldChvYmopO1xuXHRcdGlmIChyZXN1bHQgPT09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIGNvbG9yIGZyb20gc3RyaW5nOiAnICsgb2JqKTtcblx0XHR9XG5cblx0XHR0aGlzLm1vZGVsID0gcmVzdWx0Lm1vZGVsO1xuXHRcdGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHR0aGlzLmNvbG9yID0gcmVzdWx0LnZhbHVlLnNsaWNlKDAsIGNoYW5uZWxzKTtcblx0XHR0aGlzLnZhbHBoYSA9IHR5cGVvZiByZXN1bHQudmFsdWVbY2hhbm5lbHNdID09PSAnbnVtYmVyJyA/IHJlc3VsdC52YWx1ZVtjaGFubmVsc10gOiAxO1xuXHR9IGVsc2UgaWYgKG9iai5sZW5ndGgpIHtcblx0XHR0aGlzLm1vZGVsID0gbW9kZWwgfHwgJ3JnYic7XG5cdFx0Y2hhbm5lbHMgPSBjb252ZXJ0W3RoaXMubW9kZWxdLmNoYW5uZWxzO1xuXHRcdHZhciBuZXdBcnIgPSBfc2xpY2UuY2FsbChvYmosIDAsIGNoYW5uZWxzKTtcblx0XHR0aGlzLmNvbG9yID0gemVyb0FycmF5KG5ld0FyciwgY2hhbm5lbHMpO1xuXHRcdHRoaXMudmFscGhhID0gdHlwZW9mIG9ialtjaGFubmVsc10gPT09ICdudW1iZXInID8gb2JqW2NoYW5uZWxzXSA6IDE7XG5cdH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ251bWJlcicpIHtcblx0XHQvLyB0aGlzIGlzIGFsd2F5cyBSR0IgLSBjYW4gYmUgY29udmVydGVkIGxhdGVyIG9uLlxuXHRcdG9iaiAmPSAweEZGRkZGRjtcblx0XHR0aGlzLm1vZGVsID0gJ3JnYic7XG5cdFx0dGhpcy5jb2xvciA9IFtcblx0XHRcdChvYmogPj4gMTYpICYgMHhGRixcblx0XHRcdChvYmogPj4gOCkgJiAweEZGLFxuXHRcdFx0b2JqICYgMHhGRlxuXHRcdF07XG5cdFx0dGhpcy52YWxwaGEgPSAxO1xuXHR9IGVsc2Uge1xuXHRcdHRoaXMudmFscGhhID0gMTtcblxuXHRcdHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcblx0XHRpZiAoJ2FscGhhJyBpbiBvYmopIHtcblx0XHRcdGtleXMuc3BsaWNlKGtleXMuaW5kZXhPZignYWxwaGEnKSwgMSk7XG5cdFx0XHR0aGlzLnZhbHBoYSA9IHR5cGVvZiBvYmouYWxwaGEgPT09ICdudW1iZXInID8gb2JqLmFscGhhIDogMDtcblx0XHR9XG5cblx0XHR2YXIgaGFzaGVkS2V5cyA9IGtleXMuc29ydCgpLmpvaW4oJycpO1xuXHRcdGlmICghKGhhc2hlZEtleXMgaW4gaGFzaGVkTW9kZWxLZXlzKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcGFyc2UgY29sb3IgZnJvbSBvYmplY3Q6ICcgKyBKU09OLnN0cmluZ2lmeShvYmopKTtcblx0XHR9XG5cblx0XHR0aGlzLm1vZGVsID0gaGFzaGVkTW9kZWxLZXlzW2hhc2hlZEtleXNdO1xuXG5cdFx0dmFyIGxhYmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0ubGFiZWxzO1xuXHRcdHZhciBjb2xvciA9IFtdO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbG9yLnB1c2gob2JqW2xhYmVsc1tpXV0pO1xuXHRcdH1cblxuXHRcdHRoaXMuY29sb3IgPSB6ZXJvQXJyYXkoY29sb3IpO1xuXHR9XG5cblx0Ly8gcGVyZm9ybSBsaW1pdGF0aW9ucyAoY2xhbXBpbmcsIGV0Yy4pXG5cdGlmIChsaW1pdGVyc1t0aGlzLm1vZGVsXSkge1xuXHRcdGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHRmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykge1xuXHRcdFx0dmFyIGxpbWl0ID0gbGltaXRlcnNbdGhpcy5tb2RlbF1baV07XG5cdFx0XHRpZiAobGltaXQpIHtcblx0XHRcdFx0dGhpcy5jb2xvcltpXSA9IGxpbWl0KHRoaXMuY29sb3JbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHRoaXMudmFscGhhID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdGhpcy52YWxwaGEpKTtcblxuXHRpZiAoT2JqZWN0LmZyZWV6ZSkge1xuXHRcdE9iamVjdC5mcmVlemUodGhpcyk7XG5cdH1cbn1cblxuQ29sb3IucHJvdG90eXBlID0ge1xuXHR0b1N0cmluZzogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnN0cmluZygpO1xuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzW3RoaXMubW9kZWxdKCk7XG5cdH0sXG5cblx0c3RyaW5nOiBmdW5jdGlvbiAocGxhY2VzKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzLm1vZGVsIGluIGNvbG9yU3RyaW5nLnRvID8gdGhpcyA6IHRoaXMucmdiKCk7XG5cdFx0c2VsZiA9IHNlbGYucm91bmQodHlwZW9mIHBsYWNlcyA9PT0gJ251bWJlcicgPyBwbGFjZXMgOiAxKTtcblx0XHR2YXIgYXJncyA9IHNlbGYudmFscGhhID09PSAxID8gc2VsZi5jb2xvciA6IHNlbGYuY29sb3IuY29uY2F0KHRoaXMudmFscGhhKTtcblx0XHRyZXR1cm4gY29sb3JTdHJpbmcudG9bc2VsZi5tb2RlbF0oYXJncyk7XG5cdH0sXG5cblx0cGVyY2VudFN0cmluZzogZnVuY3Rpb24gKHBsYWNlcykge1xuXHRcdHZhciBzZWxmID0gdGhpcy5yZ2IoKS5yb3VuZCh0eXBlb2YgcGxhY2VzID09PSAnbnVtYmVyJyA/IHBsYWNlcyA6IDEpO1xuXHRcdHZhciBhcmdzID0gc2VsZi52YWxwaGEgPT09IDEgPyBzZWxmLmNvbG9yIDogc2VsZi5jb2xvci5jb25jYXQodGhpcy52YWxwaGEpO1xuXHRcdHJldHVybiBjb2xvclN0cmluZy50by5yZ2IucGVyY2VudChhcmdzKTtcblx0fSxcblxuXHRhcnJheTogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnZhbHBoYSA9PT0gMSA/IHRoaXMuY29sb3Iuc2xpY2UoKSA6IHRoaXMuY29sb3IuY29uY2F0KHRoaXMudmFscGhhKTtcblx0fSxcblxuXHRvYmplY3Q6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmVzdWx0ID0ge307XG5cdFx0dmFyIGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHR2YXIgbGFiZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5sYWJlbHM7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHtcblx0XHRcdHJlc3VsdFtsYWJlbHNbaV1dID0gdGhpcy5jb2xvcltpXTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy52YWxwaGEgIT09IDEpIHtcblx0XHRcdHJlc3VsdC5hbHBoYSA9IHRoaXMudmFscGhhO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0dW5pdEFycmF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHJnYiA9IHRoaXMucmdiKCkuY29sb3I7XG5cdFx0cmdiWzBdIC89IDI1NTtcblx0XHRyZ2JbMV0gLz0gMjU1O1xuXHRcdHJnYlsyXSAvPSAyNTU7XG5cblx0XHRpZiAodGhpcy52YWxwaGEgIT09IDEpIHtcblx0XHRcdHJnYi5wdXNoKHRoaXMudmFscGhhKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmdiO1xuXHR9LFxuXG5cdHVuaXRPYmplY3Q6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5vYmplY3QoKTtcblx0XHRyZ2IuciAvPSAyNTU7XG5cdFx0cmdiLmcgLz0gMjU1O1xuXHRcdHJnYi5iIC89IDI1NTtcblxuXHRcdGlmICh0aGlzLnZhbHBoYSAhPT0gMSkge1xuXHRcdFx0cmdiLmFscGhhID0gdGhpcy52YWxwaGE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJnYjtcblx0fSxcblxuXHRyb3VuZDogZnVuY3Rpb24gKHBsYWNlcykge1xuXHRcdHBsYWNlcyA9IE1hdGgubWF4KHBsYWNlcyB8fCAwLCAwKTtcblx0XHRyZXR1cm4gbmV3IENvbG9yKHRoaXMuY29sb3IubWFwKHJvdW5kVG9QbGFjZShwbGFjZXMpKS5jb25jYXQodGhpcy52YWxwaGEpLCB0aGlzLm1vZGVsKTtcblx0fSxcblxuXHRhbHBoYTogZnVuY3Rpb24gKHZhbCkge1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKHRoaXMuY29sb3IuY29uY2F0KE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHZhbCkpKSwgdGhpcy5tb2RlbCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMudmFscGhhO1xuXHR9LFxuXG5cdC8vIHJnYlxuXHRyZWQ6IGdldHNldCgncmdiJywgMCwgbWF4Zm4oMjU1KSksXG5cdGdyZWVuOiBnZXRzZXQoJ3JnYicsIDEsIG1heGZuKDI1NSkpLFxuXHRibHVlOiBnZXRzZXQoJ3JnYicsIDIsIG1heGZuKDI1NSkpLFxuXG5cdGh1ZTogZ2V0c2V0KFsnaHNsJywgJ2hzdicsICdoc2wnLCAnaHdiJywgJ2hjZyddLCAwLCBmdW5jdGlvbiAodmFsKSB7IHJldHVybiAoKHZhbCAlIDM2MCkgKyAzNjApICUgMzYwOyB9KSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBicmFjZS1zdHlsZVxuXG5cdHNhdHVyYXRpb25sOiBnZXRzZXQoJ2hzbCcsIDEsIG1heGZuKDEwMCkpLFxuXHRsaWdodG5lc3M6IGdldHNldCgnaHNsJywgMiwgbWF4Zm4oMTAwKSksXG5cblx0c2F0dXJhdGlvbnY6IGdldHNldCgnaHN2JywgMSwgbWF4Zm4oMTAwKSksXG5cdHZhbHVlOiBnZXRzZXQoJ2hzdicsIDIsIG1heGZuKDEwMCkpLFxuXG5cdGNocm9tYTogZ2V0c2V0KCdoY2cnLCAxLCBtYXhmbigxMDApKSxcblx0Z3JheTogZ2V0c2V0KCdoY2cnLCAyLCBtYXhmbigxMDApKSxcblxuXHR3aGl0ZTogZ2V0c2V0KCdod2InLCAxLCBtYXhmbigxMDApKSxcblx0d2JsYWNrOiBnZXRzZXQoJ2h3YicsIDIsIG1heGZuKDEwMCkpLFxuXG5cdGN5YW46IGdldHNldCgnY215aycsIDAsIG1heGZuKDEwMCkpLFxuXHRtYWdlbnRhOiBnZXRzZXQoJ2NteWsnLCAxLCBtYXhmbigxMDApKSxcblx0eWVsbG93OiBnZXRzZXQoJ2NteWsnLCAyLCBtYXhmbigxMDApKSxcblx0YmxhY2s6IGdldHNldCgnY215aycsIDMsIG1heGZuKDEwMCkpLFxuXG5cdHg6IGdldHNldCgneHl6JywgMCwgbWF4Zm4oMTAwKSksXG5cdHk6IGdldHNldCgneHl6JywgMSwgbWF4Zm4oMTAwKSksXG5cdHo6IGdldHNldCgneHl6JywgMiwgbWF4Zm4oMTAwKSksXG5cblx0bDogZ2V0c2V0KCdsYWInLCAwLCBtYXhmbigxMDApKSxcblx0YTogZ2V0c2V0KCdsYWInLCAxKSxcblx0YjogZ2V0c2V0KCdsYWInLCAyKSxcblxuXHRrZXl3b3JkOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodmFsKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29udmVydFt0aGlzLm1vZGVsXS5rZXl3b3JkKHRoaXMuY29sb3IpO1xuXHR9LFxuXG5cdGhleDogZnVuY3Rpb24gKHZhbCkge1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKHZhbCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbG9yU3RyaW5nLnRvLmhleCh0aGlzLnJnYigpLnJvdW5kKCkuY29sb3IpO1xuXHR9LFxuXG5cdHJnYk51bWJlcjogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXHRcdHJldHVybiAoKHJnYlswXSAmIDB4RkYpIDw8IDE2KSB8ICgocmdiWzFdICYgMHhGRikgPDwgOCkgfCAocmdiWzJdICYgMHhGRik7XG5cdH0sXG5cblx0bHVtaW5vc2l0eTogZnVuY3Rpb24gKCkge1xuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblxuXHRcdHZhciBsdW0gPSBbXTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHJnYi5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGNoYW4gPSByZ2JbaV0gLyAyNTU7XG5cdFx0XHRsdW1baV0gPSAoY2hhbiA8PSAwLjAzOTI4KSA/IGNoYW4gLyAxMi45MiA6IE1hdGgucG93KCgoY2hhbiArIDAuMDU1KSAvIDEuMDU1KSwgMi40KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gMC4yMTI2ICogbHVtWzBdICsgMC43MTUyICogbHVtWzFdICsgMC4wNzIyICogbHVtWzJdO1xuXHR9LFxuXG5cdGNvbnRyYXN0OiBmdW5jdGlvbiAoY29sb3IyKSB7XG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNjb250cmFzdC1yYXRpb2RlZlxuXHRcdHZhciBsdW0xID0gdGhpcy5sdW1pbm9zaXR5KCk7XG5cdFx0dmFyIGx1bTIgPSBjb2xvcjIubHVtaW5vc2l0eSgpO1xuXG5cdFx0aWYgKGx1bTEgPiBsdW0yKSB7XG5cdFx0XHRyZXR1cm4gKGx1bTEgKyAwLjA1KSAvIChsdW0yICsgMC4wNSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChsdW0yICsgMC4wNSkgLyAobHVtMSArIDAuMDUpO1xuXHR9LFxuXG5cdGxldmVsOiBmdW5jdGlvbiAoY29sb3IyKSB7XG5cdFx0dmFyIGNvbnRyYXN0UmF0aW8gPSB0aGlzLmNvbnRyYXN0KGNvbG9yMik7XG5cdFx0aWYgKGNvbnRyYXN0UmF0aW8gPj0gNy4xKSB7XG5cdFx0XHRyZXR1cm4gJ0FBQSc7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChjb250cmFzdFJhdGlvID49IDQuNSkgPyAnQUEnIDogJyc7XG5cdH0sXG5cblx0aXNEYXJrOiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gWUlRIGVxdWF0aW9uIGZyb20gaHR0cDovLzI0d2F5cy5vcmcvMjAxMC9jYWxjdWxhdGluZy1jb2xvci1jb250cmFzdFxuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXHRcdHZhciB5aXEgPSAocmdiWzBdICogMjk5ICsgcmdiWzFdICogNTg3ICsgcmdiWzJdICogMTE0KSAvIDEwMDA7XG5cdFx0cmV0dXJuIHlpcSA8IDEyODtcblx0fSxcblxuXHRpc0xpZ2h0OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuICF0aGlzLmlzRGFyaygpO1xuXHR9LFxuXG5cdG5lZ2F0ZTogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0XHRyZ2IuY29sb3JbaV0gPSAyNTUgLSByZ2IuY29sb3JbaV07XG5cdFx0fVxuXHRcdHJldHVybiByZ2I7XG5cdH0sXG5cblx0bGlnaHRlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0aHNsLmNvbG9yWzJdICs9IGhzbC5jb2xvclsyXSAqIHJhdGlvO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0ZGFya2VuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHNsID0gdGhpcy5oc2woKTtcblx0XHRoc2wuY29sb3JbMl0gLT0gaHNsLmNvbG9yWzJdICogcmF0aW87XG5cdFx0cmV0dXJuIGhzbDtcblx0fSxcblxuXHRzYXR1cmF0ZTogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0aHNsLmNvbG9yWzFdICs9IGhzbC5jb2xvclsxXSAqIHJhdGlvO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0ZGVzYXR1cmF0ZTogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0aHNsLmNvbG9yWzFdIC09IGhzbC5jb2xvclsxXSAqIHJhdGlvO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0d2hpdGVuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHdiID0gdGhpcy5od2IoKTtcblx0XHRod2IuY29sb3JbMV0gKz0gaHdiLmNvbG9yWzFdICogcmF0aW87XG5cdFx0cmV0dXJuIGh3Yjtcblx0fSxcblxuXHRibGFja2VuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHdiID0gdGhpcy5od2IoKTtcblx0XHRod2IuY29sb3JbMl0gKz0gaHdiLmNvbG9yWzJdICogcmF0aW87XG5cdFx0cmV0dXJuIGh3Yjtcblx0fSxcblxuXHRncmF5c2NhbGU6IGZ1bmN0aW9uICgpIHtcblx0XHQvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dyYXlzY2FsZSNDb252ZXJ0aW5nX2NvbG9yX3RvX2dyYXlzY2FsZVxuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXHRcdHZhciB2YWwgPSByZ2JbMF0gKiAwLjMgKyByZ2JbMV0gKiAwLjU5ICsgcmdiWzJdICogMC4xMTtcblx0XHRyZXR1cm4gQ29sb3IucmdiKHZhbCwgdmFsLCB2YWwpO1xuXHR9LFxuXG5cdGZhZGU6IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHJldHVybiB0aGlzLmFscGhhKHRoaXMudmFscGhhIC0gKHRoaXMudmFscGhhICogcmF0aW8pKTtcblx0fSxcblxuXHRvcGFxdWVyOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHRyZXR1cm4gdGhpcy5hbHBoYSh0aGlzLnZhbHBoYSArICh0aGlzLnZhbHBoYSAqIHJhdGlvKSk7XG5cdH0sXG5cblx0cm90YXRlOiBmdW5jdGlvbiAoZGVncmVlcykge1xuXHRcdHZhciBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdHZhciBodWUgPSBoc2wuY29sb3JbMF07XG5cdFx0aHVlID0gKGh1ZSArIGRlZ3JlZXMpICUgMzYwO1xuXHRcdGh1ZSA9IGh1ZSA8IDAgPyAzNjAgKyBodWUgOiBodWU7XG5cdFx0aHNsLmNvbG9yWzBdID0gaHVlO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0bWl4OiBmdW5jdGlvbiAobWl4aW5Db2xvciwgd2VpZ2h0KSB7XG5cdFx0Ly8gcG9ydGVkIGZyb20gc2FzcyBpbXBsZW1lbnRhdGlvbiBpbiBDXG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3Nhc3MvbGlic2Fzcy9ibG9iLzBlNmI0YTI4NTAwOTIzNTZhYTNlY2UwN2M2YjI0OWYwMjIxY2FjZWQvZnVuY3Rpb25zLmNwcCNMMjA5XG5cdFx0aWYgKCFtaXhpbkNvbG9yIHx8ICFtaXhpbkNvbG9yLnJnYikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCB0byBcIm1peFwiIHdhcyBub3QgYSBDb2xvciBpbnN0YW5jZSwgYnV0IHJhdGhlciBhbiBpbnN0YW5jZSBvZiAnICsgdHlwZW9mIG1peGluQ29sb3IpO1xuXHRcdH1cblx0XHR2YXIgY29sb3IxID0gbWl4aW5Db2xvci5yZ2IoKTtcblx0XHR2YXIgY29sb3IyID0gdGhpcy5yZ2IoKTtcblx0XHR2YXIgcCA9IHdlaWdodCA9PT0gdW5kZWZpbmVkID8gMC41IDogd2VpZ2h0O1xuXG5cdFx0dmFyIHcgPSAyICogcCAtIDE7XG5cdFx0dmFyIGEgPSBjb2xvcjEuYWxwaGEoKSAtIGNvbG9yMi5hbHBoYSgpO1xuXG5cdFx0dmFyIHcxID0gKCgodyAqIGEgPT09IC0xKSA/IHcgOiAodyArIGEpIC8gKDEgKyB3ICogYSkpICsgMSkgLyAyLjA7XG5cdFx0dmFyIHcyID0gMSAtIHcxO1xuXG5cdFx0cmV0dXJuIENvbG9yLnJnYihcblx0XHRcdFx0dzEgKiBjb2xvcjEucmVkKCkgKyB3MiAqIGNvbG9yMi5yZWQoKSxcblx0XHRcdFx0dzEgKiBjb2xvcjEuZ3JlZW4oKSArIHcyICogY29sb3IyLmdyZWVuKCksXG5cdFx0XHRcdHcxICogY29sb3IxLmJsdWUoKSArIHcyICogY29sb3IyLmJsdWUoKSxcblx0XHRcdFx0Y29sb3IxLmFscGhhKCkgKiBwICsgY29sb3IyLmFscGhhKCkgKiAoMSAtIHApKTtcblx0fVxufTtcblxuLy8gbW9kZWwgY29udmVyc2lvbiBtZXRob2RzIGFuZCBzdGF0aWMgY29uc3RydWN0b3JzXG5PYmplY3Qua2V5cyhjb252ZXJ0KS5mb3JFYWNoKGZ1bmN0aW9uIChtb2RlbCkge1xuXHRpZiAoc2tpcHBlZE1vZGVscy5pbmRleE9mKG1vZGVsKSAhPT0gLTEpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR2YXIgY2hhbm5lbHMgPSBjb252ZXJ0W21vZGVsXS5jaGFubmVscztcblxuXHQvLyBjb252ZXJzaW9uIG1ldGhvZHNcblx0Q29sb3IucHJvdG90eXBlW21vZGVsXSA9IGZ1bmN0aW9uICgpIHtcblx0XHRpZiAodGhpcy5tb2RlbCA9PT0gbW9kZWwpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodGhpcyk7XG5cdFx0fVxuXG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IoYXJndW1lbnRzLCBtb2RlbCk7XG5cdFx0fVxuXG5cdFx0dmFyIG5ld0FscGhhID0gdHlwZW9mIGFyZ3VtZW50c1tjaGFubmVsc10gPT09ICdudW1iZXInID8gY2hhbm5lbHMgOiB0aGlzLnZhbHBoYTtcblx0XHRyZXR1cm4gbmV3IENvbG9yKGFzc2VydEFycmF5KGNvbnZlcnRbdGhpcy5tb2RlbF1bbW9kZWxdLnJhdyh0aGlzLmNvbG9yKSkuY29uY2F0KG5ld0FscGhhKSwgbW9kZWwpO1xuXHR9O1xuXG5cdC8vICdzdGF0aWMnIGNvbnN0cnVjdGlvbiBtZXRob2RzXG5cdENvbG9yW21vZGVsXSA9IGZ1bmN0aW9uIChjb2xvcikge1xuXHRcdGlmICh0eXBlb2YgY29sb3IgPT09ICdudW1iZXInKSB7XG5cdFx0XHRjb2xvciA9IHplcm9BcnJheShfc2xpY2UuY2FsbChhcmd1bWVudHMpLCBjaGFubmVscyk7XG5cdFx0fVxuXHRcdHJldHVybiBuZXcgQ29sb3IoY29sb3IsIG1vZGVsKTtcblx0fTtcbn0pO1xuXG5mdW5jdGlvbiByb3VuZFRvKG51bSwgcGxhY2VzKSB7XG5cdHJldHVybiBOdW1iZXIobnVtLnRvRml4ZWQocGxhY2VzKSk7XG59XG5cbmZ1bmN0aW9uIHJvdW5kVG9QbGFjZShwbGFjZXMpIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChudW0pIHtcblx0XHRyZXR1cm4gcm91bmRUbyhudW0sIHBsYWNlcyk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGdldHNldChtb2RlbCwgY2hhbm5lbCwgbW9kaWZpZXIpIHtcblx0bW9kZWwgPSBBcnJheS5pc0FycmF5KG1vZGVsKSA/IG1vZGVsIDogW21vZGVsXTtcblxuXHRtb2RlbC5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7XG5cdFx0KGxpbWl0ZXJzW21dIHx8IChsaW1pdGVyc1ttXSA9IFtdKSlbY2hhbm5lbF0gPSBtb2RpZmllcjtcblx0fSk7XG5cblx0bW9kZWwgPSBtb2RlbFswXTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gKHZhbCkge1xuXHRcdHZhciByZXN1bHQ7XG5cblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0aWYgKG1vZGlmaWVyKSB7XG5cdFx0XHRcdHZhbCA9IG1vZGlmaWVyKHZhbCk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3VsdCA9IHRoaXNbbW9kZWxdKCk7XG5cdFx0XHRyZXN1bHQuY29sb3JbY2hhbm5lbF0gPSB2YWw7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdHJlc3VsdCA9IHRoaXNbbW9kZWxdKCkuY29sb3JbY2hhbm5lbF07XG5cdFx0aWYgKG1vZGlmaWVyKSB7XG5cdFx0XHRyZXN1bHQgPSBtb2RpZmllcihyZXN1bHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG59XG5cbmZ1bmN0aW9uIG1heGZuKG1heCkge1xuXHRyZXR1cm4gZnVuY3Rpb24gKHYpIHtcblx0XHRyZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4obWF4LCB2KSk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGFzc2VydEFycmF5KHZhbCkge1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07XG59XG5cbmZ1bmN0aW9uIHplcm9BcnJheShhcnIsIGxlbmd0aCkge1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKHR5cGVvZiBhcnJbaV0gIT09ICdudW1iZXInKSB7XG5cdFx0XHRhcnJbaV0gPSAwO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29sb3I7XG4iLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJsYXlvdXQtYmFzZVwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXCJsYXlvdXQtYmFzZVwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJjb3NlQmFzZVwiXSA9IGZhY3RvcnkocmVxdWlyZShcImxheW91dC1iYXNlXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJjb3NlQmFzZVwiXSA9IGZhY3Rvcnkocm9vdFtcImxheW91dEJhc2VcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNTUxX18pIHtcbnJldHVybiAvKioqKioqLyAoKCkgPT4geyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdFwidXNlIHN0cmljdFwiO1xuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9ICh7XG5cbi8qKiovIDQ1OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIGNvc2VCYXNlID0ge307XG5cbmNvc2VCYXNlLmxheW91dEJhc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSk7XG5jb3NlQmFzZS5Db1NFQ29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MDYpO1xuY29zZUJhc2UuQ29TRUVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2Nyk7XG5jb3NlQmFzZS5Db1NFR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg4MCk7XG5jb3NlQmFzZS5Db1NFR3JhcGhNYW5hZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NzgpO1xuY29zZUJhc2UuQ29TRUxheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oNzY1KTtcbmNvc2VCYXNlLkNvU0VOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5OTEpO1xuY29zZUJhc2UuQ29uc3RyYWludEhhbmRsZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkwMik7XG5cbm1vZHVsZS5leHBvcnRzID0gY29zZUJhc2U7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA4MDY6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgRkRMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuRkRMYXlvdXRDb25zdGFudHM7XG5cbmZ1bmN0aW9uIENvU0VDb25zdGFudHMoKSB7fVxuXG4vL0NvU0VDb25zdGFudHMgaW5oZXJpdHMgc3RhdGljIHByb3BzIGluIEZETGF5b3V0Q29uc3RhbnRzXG5mb3IgKHZhciBwcm9wIGluIEZETGF5b3V0Q29uc3RhbnRzKSB7XG4gIENvU0VDb25zdGFudHNbcHJvcF0gPSBGRExheW91dENvbnN0YW50c1twcm9wXTtcbn1cblxuQ29TRUNvbnN0YW50cy5ERUZBVUxUX1VTRV9NVUxUSV9MRVZFTF9TQ0FMSU5HID0gZmFsc2U7XG5Db1NFQ29uc3RhbnRzLkRFRkFVTFRfUkFESUFMX1NFUEFSQVRJT04gPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIO1xuQ29TRUNvbnN0YW50cy5ERUZBVUxUX0NPTVBPTkVOVF9TRVBFUkFUSU9OID0gNjA7XG5Db1NFQ29uc3RhbnRzLlRJTEUgPSB0cnVlO1xuQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19WRVJUSUNBTCA9IDEwO1xuQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19IT1JJWk9OVEFMID0gMTA7XG5Db1NFQ29uc3RhbnRzLlRSQU5TRk9STV9PTl9DT05TVFJBSU5UX0hBTkRMSU5HID0gdHJ1ZTtcbkNvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUyA9IHRydWU7XG5Db1NFQ29uc3RhbnRzLkFQUExZX0xBWU9VVCA9IHRydWU7XG5Db1NFQ29uc3RhbnRzLlJFTEFYX01PVkVNRU5UX09OX0NPTlNUUkFJTlRTID0gdHJ1ZTtcbkNvU0VDb25zdGFudHMuVFJFRV9SRURVQ1RJT05fT05fSU5DUkVNRU5UQUwgPSB0cnVlOyAvLyB0aGlzIHNob3VsZCBiZSBzZXQgdG8gZmFsc2UgaWYgdGhlcmUgd2lsbCBiZSBhIGNvbnN0cmFpbnRcbi8vIFRoaXMgY29uc3RhbnQgaXMgZm9yIGRpZmZlcmVudGlhdGluZyB3aGV0aGVyIGFjdHVhbCBsYXlvdXQgYWxnb3JpdGhtIHRoYXQgdXNlcyBjb3NlLWJhc2Ugd2FudHMgdG8gYXBwbHkgb25seSBpbmNyZW1lbnRhbCBsYXlvdXQgb3IgXG4vLyBhbiBpbmNyZW1lbnRhbCBsYXlvdXQgb24gdG9wIG9mIGEgcmFuZG9taXplZCBsYXlvdXQuIElmIGl0IGlzIG9ubHkgaW5jcmVtZW50YWwgbGF5b3V0LCB0aGVuIHRoaXMgY29uc3RhbnQgc2hvdWxkIGJlIHRydWUuXG5Db1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwgPSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUw7XG5cbm1vZHVsZS5leHBvcnRzID0gQ29TRUNvbnN0YW50cztcblxuLyoqKi8gfSksXG5cbi8qKiovIDc2Nzpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBGRExheW91dEVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuRkRMYXlvdXRFZGdlO1xuXG5mdW5jdGlvbiBDb1NFRWRnZShzb3VyY2UsIHRhcmdldCwgdkVkZ2UpIHtcbiAgRkRMYXlvdXRFZGdlLmNhbGwodGhpcywgc291cmNlLCB0YXJnZXQsIHZFZGdlKTtcbn1cblxuQ29TRUVkZ2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShGRExheW91dEVkZ2UucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gRkRMYXlvdXRFZGdlKSB7XG4gIENvU0VFZGdlW3Byb3BdID0gRkRMYXlvdXRFZGdlW3Byb3BdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvU0VFZGdlO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODgwOlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIExHcmFwaCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5MR3JhcGg7XG5cbmZ1bmN0aW9uIENvU0VHcmFwaChwYXJlbnQsIGdyYXBoTWdyLCB2R3JhcGgpIHtcbiAgTEdyYXBoLmNhbGwodGhpcywgcGFyZW50LCBncmFwaE1nciwgdkdyYXBoKTtcbn1cblxuQ29TRUdyYXBoLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTEdyYXBoLnByb3RvdHlwZSk7XG5mb3IgKHZhciBwcm9wIGluIExHcmFwaCkge1xuICBDb1NFR3JhcGhbcHJvcF0gPSBMR3JhcGhbcHJvcF07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29TRUdyYXBoO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNTc4OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIExHcmFwaE1hbmFnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuTEdyYXBoTWFuYWdlcjtcblxuZnVuY3Rpb24gQ29TRUdyYXBoTWFuYWdlcihsYXlvdXQpIHtcbiAgTEdyYXBoTWFuYWdlci5jYWxsKHRoaXMsIGxheW91dCk7XG59XG5cbkNvU0VHcmFwaE1hbmFnZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGhNYW5hZ2VyLnByb3RvdHlwZSk7XG5mb3IgKHZhciBwcm9wIGluIExHcmFwaE1hbmFnZXIpIHtcbiAgQ29TRUdyYXBoTWFuYWdlcltwcm9wXSA9IExHcmFwaE1hbmFnZXJbcHJvcF07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29TRUdyYXBoTWFuYWdlcjtcblxuLyoqKi8gfSksXG5cbi8qKiovIDc2NTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBGRExheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5GRExheW91dDtcbnZhciBDb1NFR3JhcGhNYW5hZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NzgpO1xudmFyIENvU0VHcmFwaCA9IF9fd2VicGFja19yZXF1aXJlX18oODgwKTtcbnZhciBDb1NFTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oOTkxKTtcbnZhciBDb1NFRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzY3KTtcbnZhciBDb1NFQ29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MDYpO1xudmFyIENvbnN0cmFpbnRIYW5kbGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MDIpO1xudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkZETGF5b3V0Q29uc3RhbnRzO1xudmFyIExheW91dENvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5MYXlvdXRDb25zdGFudHM7XG52YXIgUG9pbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuUG9pbnQ7XG52YXIgUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLlBvaW50RDtcbnZhciBEaW1lbnNpb25EID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkRpbWVuc2lvbkQ7XG52YXIgTGF5b3V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkxheW91dDtcbnZhciBJbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkludGVnZXI7XG52YXIgSUdlb21ldHJ5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLklHZW9tZXRyeTtcbnZhciBMR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuTEdyYXBoO1xudmFyIFRyYW5zZm9ybSA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5UcmFuc2Zvcm07XG52YXIgTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5MaW5rZWRMaXN0O1xuXG5mdW5jdGlvbiBDb1NFTGF5b3V0KCkge1xuICBGRExheW91dC5jYWxsKHRoaXMpO1xuXG4gIHRoaXMudG9CZVRpbGVkID0ge307IC8vIE1lbW9yaXplIGlmIGEgbm9kZSBpcyB0byBiZSB0aWxlZCBvciBpcyB0aWxlZFxuICB0aGlzLmNvbnN0cmFpbnRzID0ge307IC8vIGtlZXAgbGF5b3V0IGNvbnN0cmFpbnRzXG59XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShGRExheW91dC5wcm90b3R5cGUpO1xuXG5mb3IgKHZhciBwcm9wIGluIEZETGF5b3V0KSB7XG4gIENvU0VMYXlvdXRbcHJvcF0gPSBGRExheW91dFtwcm9wXTtcbn1cblxuQ29TRUxheW91dC5wcm90b3R5cGUubmV3R3JhcGhNYW5hZ2VyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZ20gPSBuZXcgQ29TRUdyYXBoTWFuYWdlcih0aGlzKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIgPSBnbTtcbiAgcmV0dXJuIGdtO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUubmV3R3JhcGggPSBmdW5jdGlvbiAodkdyYXBoKSB7XG4gIHJldHVybiBuZXcgQ29TRUdyYXBoKG51bGwsIHRoaXMuZ3JhcGhNYW5hZ2VyLCB2R3JhcGgpO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUubmV3Tm9kZSA9IGZ1bmN0aW9uICh2Tm9kZSkge1xuICByZXR1cm4gbmV3IENvU0VOb2RlKHRoaXMuZ3JhcGhNYW5hZ2VyLCB2Tm9kZSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5uZXdFZGdlID0gZnVuY3Rpb24gKHZFZGdlKSB7XG4gIHJldHVybiBuZXcgQ29TRUVkZ2UobnVsbCwgbnVsbCwgdkVkZ2UpO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuaW5pdFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7XG4gIEZETGF5b3V0LnByb3RvdHlwZS5pbml0UGFyYW1ldGVycy5jYWxsKHRoaXMsIGFyZ3VtZW50cyk7XG4gIGlmICghdGhpcy5pc1N1YkxheW91dCkge1xuICAgIGlmIChDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPCAxMCkge1xuICAgICAgdGhpcy5pZGVhbEVkZ2VMZW5ndGggPSAxMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pZGVhbEVkZ2VMZW5ndGggPSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEg7XG4gICAgfVxuXG4gICAgdGhpcy51c2VTbWFydElkZWFsRWRnZUxlbmd0aENhbGN1bGF0aW9uID0gQ29TRUNvbnN0YW50cy5ERUZBVUxUX1VTRV9TTUFSVF9JREVBTF9FREdFX0xFTkdUSF9DQUxDVUxBVElPTjtcbiAgICB0aGlzLmdyYXZpdHlDb25zdGFudCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSDtcbiAgICB0aGlzLmNvbXBvdW5kR3Jhdml0eUNvbnN0YW50ID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1NUUkVOR1RIO1xuICAgIHRoaXMuZ3Jhdml0eVJhbmdlRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUjtcbiAgICB0aGlzLmNvbXBvdW5kR3Jhdml0eVJhbmdlRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUjtcblxuICAgIC8vIHZhcmlhYmxlcyBmb3IgdHJlZSByZWR1Y3Rpb24gc3VwcG9ydFxuICAgIHRoaXMucHJ1bmVkTm9kZXNBbGwgPSBbXTtcbiAgICB0aGlzLmdyb3dUcmVlSXRlcmF0aW9ucyA9IDA7XG4gICAgdGhpcy5hZnRlckdyb3d0aEl0ZXJhdGlvbnMgPSAwO1xuICAgIHRoaXMuaXNUcmVlR3Jvd2luZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNHcm93dGhGaW5pc2hlZCA9IGZhbHNlO1xuICB9XG59O1xuXG4vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNldCBDb1NFIHJlbGF0ZWQgcGFyYW1ldGVycyB1c2VkIGJ5IHNwcmluZyBlbWJlZGRlci5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmluaXRTcHJpbmdFbWJlZGRlciA9IGZ1bmN0aW9uICgpIHtcbiAgRkRMYXlvdXQucHJvdG90eXBlLmluaXRTcHJpbmdFbWJlZGRlci5jYWxsKHRoaXMpO1xuXG4gIC8vIHZhcmlhYmxlcyBmb3IgY29vbGluZ1xuICB0aGlzLmNvb2xpbmdDeWNsZSA9IDA7XG4gIHRoaXMubWF4Q29vbGluZ0N5Y2xlID0gdGhpcy5tYXhJdGVyYXRpb25zIC8gRkRMYXlvdXRDb25zdGFudHMuQ09OVkVSR0VOQ0VfQ0hFQ0tfUEVSSU9EO1xuICB0aGlzLmZpbmFsVGVtcGVyYXR1cmUgPSAwLjA0O1xuICB0aGlzLmNvb2xpbmdBZGp1c3RlciA9IDE7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5sYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjcmVhdGVCZW5kc0FzTmVlZGVkID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ1JFQVRFX0JFTkRTX0FTX05FRURFRDtcbiAgaWYgKGNyZWF0ZUJlbmRzQXNOZWVkZWQpIHtcbiAgICB0aGlzLmNyZWF0ZUJlbmRwb2ludHMoKTtcbiAgICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbEVkZ2VzKCk7XG4gIH1cblxuICB0aGlzLmxldmVsID0gMDtcbiAgcmV0dXJuIHRoaXMuY2xhc3NpY0xheW91dCgpO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuY2xhc3NpY0xheW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5ub2Rlc1dpdGhHcmF2aXR5ID0gdGhpcy5jYWxjdWxhdGVOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvblRvKCk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLnNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKHRoaXMubm9kZXNXaXRoR3Jhdml0eSk7XG4gIHRoaXMuY2FsY05vT2ZDaGlsZHJlbkZvckFsbE5vZGVzKCk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLmNhbGNMb3dlc3RDb21tb25BbmNlc3RvcnMoKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIuY2FsY0luY2x1c2lvblRyZWVEZXB0aHMoKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmNhbGNFc3RpbWF0ZWRTaXplKCk7XG4gIHRoaXMuY2FsY0lkZWFsRWRnZUxlbmd0aHMoKTtcblxuICBpZiAoIXRoaXMuaW5jcmVtZW50YWwpIHtcbiAgICB2YXIgZm9yZXN0ID0gdGhpcy5nZXRGbGF0Rm9yZXN0KCk7XG5cbiAgICAvLyBUaGUgZ3JhcGggYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF5b3V0IGlzIGZsYXQgYW5kIGEgZm9yZXN0XG4gICAgaWYgKGZvcmVzdC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnBvc2l0aW9uTm9kZXNSYWRpYWxseShmb3Jlc3QpO1xuICAgIH1cbiAgICAvLyBUaGUgZ3JhcGggYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF5b3V0IGlzIG5vdCBmbGF0IG9yIGEgZm9yZXN0XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFJlZHVjZSB0aGUgdHJlZXMgd2hlbiBpbmNyZW1lbnRhbCBtb2RlIGlzIG5vdCBlbmFibGVkIGFuZCBncmFwaCBpcyBub3QgYSBmb3Jlc3QgXG4gICAgICAgIHRoaXMucmVkdWNlVHJlZXMoKTtcbiAgICAgICAgLy8gVXBkYXRlIG5vZGVzIHRoYXQgZ3Jhdml0eSB3aWxsIGJlIGFwcGxpZWRcbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbigpO1xuICAgICAgICB2YXIgYWxsTm9kZXMgPSBuZXcgU2V0KHRoaXMuZ2V0QWxsTm9kZXMoKSk7XG4gICAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSB0aGlzLm5vZGVzV2l0aEdyYXZpdHkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgcmV0dXJuIGFsbE5vZGVzLmhhcyh4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKGludGVyc2VjdGlvbik7XG5cbiAgICAgICAgdGhpcy5wb3NpdGlvbk5vZGVzUmFuZG9tbHkoKTtcbiAgICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoQ29TRUNvbnN0YW50cy5UUkVFX1JFRFVDVElPTl9PTl9JTkNSRU1FTlRBTCkge1xuICAgICAgLy8gUmVkdWNlIHRoZSB0cmVlcyBpbiBpbmNyZW1lbnRhbCBtb2RlIGlmIG9ubHkgdGhpcyBjb25zdGFudCBpcyBzZXQgdG8gdHJ1ZSBcbiAgICAgIHRoaXMucmVkdWNlVHJlZXMoKTtcbiAgICAgIC8vIFVwZGF0ZSBub2RlcyB0aGF0IGdyYXZpdHkgd2lsbCBiZSBhcHBsaWVkXG4gICAgICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKCk7XG4gICAgICB2YXIgYWxsTm9kZXMgPSBuZXcgU2V0KHRoaXMuZ2V0QWxsTm9kZXMoKSk7XG4gICAgICB2YXIgaW50ZXJzZWN0aW9uID0gdGhpcy5ub2Rlc1dpdGhHcmF2aXR5LmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gYWxsTm9kZXMuaGFzKHgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmdyYXBoTWFuYWdlci5zZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbihpbnRlcnNlY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyh0aGlzLmNvbnN0cmFpbnRzKS5sZW5ndGggPiAwKSB7XG4gICAgQ29uc3RyYWludEhhbmRsZXIuaGFuZGxlQ29uc3RyYWludHModGhpcyk7XG4gICAgdGhpcy5pbml0Q29uc3RyYWludFZhcmlhYmxlcygpO1xuICB9XG5cbiAgdGhpcy5pbml0U3ByaW5nRW1iZWRkZXIoKTtcbiAgaWYgKENvU0VDb25zdGFudHMuQVBQTFlfTEFZT1VUKSB7XG4gICAgdGhpcy5ydW5TcHJpbmdFbWJlZGRlcigpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS50aWNrID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnRvdGFsSXRlcmF0aW9ucysrO1xuXG4gIGlmICh0aGlzLnRvdGFsSXRlcmF0aW9ucyA9PT0gdGhpcy5tYXhJdGVyYXRpb25zICYmICF0aGlzLmlzVHJlZUdyb3dpbmcgJiYgIXRoaXMuaXNHcm93dGhGaW5pc2hlZCkge1xuICAgIGlmICh0aGlzLnBydW5lZE5vZGVzQWxsLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuaXNUcmVlR3Jvd2luZyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLnRvdGFsSXRlcmF0aW9ucyAlIEZETGF5b3V0Q29uc3RhbnRzLkNPTlZFUkdFTkNFX0NIRUNLX1BFUklPRCA9PSAwICYmICF0aGlzLmlzVHJlZUdyb3dpbmcgJiYgIXRoaXMuaXNHcm93dGhGaW5pc2hlZCkge1xuICAgIGlmICh0aGlzLmlzQ29udmVyZ2VkKCkpIHtcbiAgICAgIGlmICh0aGlzLnBydW5lZE5vZGVzQWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5pc1RyZWVHcm93aW5nID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29vbGluZ0N5Y2xlKys7XG5cbiAgICBpZiAodGhpcy5sYXlvdXRRdWFsaXR5ID09IDApIHtcbiAgICAgIC8vIHF1YWxpdHkgLSBcImRyYWZ0XCJcbiAgICAgIHRoaXMuY29vbGluZ0FkanVzdGVyID0gdGhpcy5jb29saW5nQ3ljbGU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxheW91dFF1YWxpdHkgPT0gMSkge1xuICAgICAgLy8gcXVhbGl0eSAtIFwiZGVmYXVsdFwiXG4gICAgICB0aGlzLmNvb2xpbmdBZGp1c3RlciA9IHRoaXMuY29vbGluZ0N5Y2xlIC8gMztcbiAgICB9XG5cbiAgICAvLyBjb29saW5nIHNjaGVkdWxlIGlzIGJhc2VkIG9uIGh0dHA6Ly93d3cuYnRsdWtlLmNvbS9zaW1hbmYxLmh0bWwgLT4gY29vbGluZyBzY2hlZHVsZSAzXG4gICAgdGhpcy5jb29saW5nRmFjdG9yID0gTWF0aC5tYXgodGhpcy5pbml0aWFsQ29vbGluZ0ZhY3RvciAtIE1hdGgucG93KHRoaXMuY29vbGluZ0N5Y2xlLCBNYXRoLmxvZygxMDAgKiAodGhpcy5pbml0aWFsQ29vbGluZ0ZhY3RvciAtIHRoaXMuZmluYWxUZW1wZXJhdHVyZSkpIC8gTWF0aC5sb2codGhpcy5tYXhDb29saW5nQ3ljbGUpKSAvIDEwMCAqIHRoaXMuY29vbGluZ0FkanVzdGVyLCB0aGlzLmZpbmFsVGVtcGVyYXR1cmUpO1xuICAgIHRoaXMuYW5pbWF0aW9uUGVyaW9kID0gTWF0aC5jZWlsKHRoaXMuaW5pdGlhbEFuaW1hdGlvblBlcmlvZCAqIE1hdGguc3FydCh0aGlzLmNvb2xpbmdGYWN0b3IpKTtcbiAgfVxuICAvLyBPcGVyYXRpb25zIHdoaWxlIHRyZWUgaXMgZ3Jvd2luZyBhZ2FpbiBcbiAgaWYgKHRoaXMuaXNUcmVlR3Jvd2luZykge1xuICAgIGlmICh0aGlzLmdyb3dUcmVlSXRlcmF0aW9ucyAlIDEwID09IDApIHtcbiAgICAgIGlmICh0aGlzLnBydW5lZE5vZGVzQWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIudXBkYXRlQm91bmRzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlR3JpZCgpO1xuICAgICAgICB0aGlzLmdyb3dUcmVlKHRoaXMucHJ1bmVkTm9kZXNBbGwpO1xuICAgICAgICAvLyBVcGRhdGUgbm9kZXMgdGhhdCBncmF2aXR5IHdpbGwgYmUgYXBwbGllZFxuICAgICAgICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKCk7XG4gICAgICAgIHZhciBhbGxOb2RlcyA9IG5ldyBTZXQodGhpcy5nZXRBbGxOb2RlcygpKTtcbiAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IHRoaXMubm9kZXNXaXRoR3Jhdml0eS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICByZXR1cm4gYWxsTm9kZXMuaGFzKHgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIuc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24oaW50ZXJzZWN0aW9uKTtcblxuICAgICAgICB0aGlzLmdyYXBoTWFuYWdlci51cGRhdGVCb3VuZHMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVHcmlkKCk7XG4gICAgICAgIGlmIChDb1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwpIHRoaXMuY29vbGluZ0ZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09PTElOR19GQUNUT1JfSU5DUkVNRU5UQUwgLyAyO2Vsc2UgdGhpcy5jb29saW5nRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXNUcmVlR3Jvd2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzR3Jvd3RoRmluaXNoZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmdyb3dUcmVlSXRlcmF0aW9ucysrO1xuICB9XG4gIC8vIE9wZXJhdGlvbnMgYWZ0ZXIgZ3Jvd3RoIGlzIGZpbmlzaGVkXG4gIGlmICh0aGlzLmlzR3Jvd3RoRmluaXNoZWQpIHtcbiAgICBpZiAodGhpcy5pc0NvbnZlcmdlZCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWZ0ZXJHcm93dGhJdGVyYXRpb25zICUgMTAgPT0gMCkge1xuICAgICAgdGhpcy5ncmFwaE1hbmFnZXIudXBkYXRlQm91bmRzKCk7XG4gICAgICB0aGlzLnVwZGF0ZUdyaWQoKTtcbiAgICB9XG4gICAgaWYgKENvU0VDb25zdGFudHMuUFVSRV9JTkNSRU1FTlRBTCkgdGhpcy5jb29saW5nRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCAvIDIgKiAoKDEwMCAtIHRoaXMuYWZ0ZXJHcm93dGhJdGVyYXRpb25zKSAvIDEwMCk7ZWxzZSB0aGlzLmNvb2xpbmdGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMICogKCgxMDAgLSB0aGlzLmFmdGVyR3Jvd3RoSXRlcmF0aW9ucykgLyAxMDApO1xuICAgIHRoaXMuYWZ0ZXJHcm93dGhJdGVyYXRpb25zKys7XG4gIH1cblxuICB2YXIgZ3JpZFVwZGF0ZUFsbG93ZWQgPSAhdGhpcy5pc1RyZWVHcm93aW5nICYmICF0aGlzLmlzR3Jvd3RoRmluaXNoZWQ7XG4gIHZhciBmb3JjZVRvTm9kZVN1cnJvdW5kaW5nVXBkYXRlID0gdGhpcy5ncm93VHJlZUl0ZXJhdGlvbnMgJSAxMCA9PSAxICYmIHRoaXMuaXNUcmVlR3Jvd2luZyB8fCB0aGlzLmFmdGVyR3Jvd3RoSXRlcmF0aW9ucyAlIDEwID09IDEgJiYgdGhpcy5pc0dyb3d0aEZpbmlzaGVkO1xuXG4gIHRoaXMudG90YWxEaXNwbGFjZW1lbnQgPSAwO1xuICB0aGlzLmdyYXBoTWFuYWdlci51cGRhdGVCb3VuZHMoKTtcbiAgdGhpcy5jYWxjU3ByaW5nRm9yY2VzKCk7XG4gIHRoaXMuY2FsY1JlcHVsc2lvbkZvcmNlcyhncmlkVXBkYXRlQWxsb3dlZCwgZm9yY2VUb05vZGVTdXJyb3VuZGluZ1VwZGF0ZSk7XG4gIHRoaXMuY2FsY0dyYXZpdGF0aW9uYWxGb3JjZXMoKTtcbiAgdGhpcy5tb3ZlTm9kZXMoKTtcbiAgdGhpcy5hbmltYXRlKCk7XG5cbiAgcmV0dXJuIGZhbHNlOyAvLyBMYXlvdXQgaXMgbm90IGVuZGVkIHlldCByZXR1cm4gZmFsc2Vcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmdldFBvc2l0aW9uc0RhdGEgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhbGxOb2RlcyA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbE5vZGVzKCk7XG4gIHZhciBwRGF0YSA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJlY3QgPSBhbGxOb2Rlc1tpXS5yZWN0O1xuICAgIHZhciBpZCA9IGFsbE5vZGVzW2ldLmlkO1xuICAgIHBEYXRhW2lkXSA9IHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIHg6IHJlY3QuZ2V0Q2VudGVyWCgpLFxuICAgICAgeTogcmVjdC5nZXRDZW50ZXJZKCksXG4gICAgICB3OiByZWN0LndpZHRoLFxuICAgICAgaDogcmVjdC5oZWlnaHRcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHBEYXRhO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUucnVuU3ByaW5nRW1iZWRkZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaW5pdGlhbEFuaW1hdGlvblBlcmlvZCA9IDI1O1xuICB0aGlzLmFuaW1hdGlvblBlcmlvZCA9IHRoaXMuaW5pdGlhbEFuaW1hdGlvblBlcmlvZDtcbiAgdmFyIGxheW91dEVuZGVkID0gZmFsc2U7XG5cbiAgLy8gSWYgYW1pbmF0ZSBvcHRpb24gaXMgJ2R1cmluZycgc2lnbmFsIHRoYXQgbGF5b3V0IGlzIHN1cHBvc2VkIHRvIHN0YXJ0IGl0ZXJhdGluZ1xuICBpZiAoRkRMYXlvdXRDb25zdGFudHMuQU5JTUFURSA9PT0gJ2R1cmluZycpIHtcbiAgICB0aGlzLmVtaXQoJ2xheW91dHN0YXJ0ZWQnKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbWluYXRlIG9wdGlvbiBpcyAnZHVyaW5nJyB0aWNrKCkgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgb24gaW5kZXguanNcbiAgICB3aGlsZSAoIWxheW91dEVuZGVkKSB7XG4gICAgICBsYXlvdXRFbmRlZCA9IHRoaXMudGljaygpO1xuICAgIH1cblxuICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnVwZGF0ZUJvdW5kcygpO1xuICB9XG59O1xuXG4vLyBvdmVycmlkZXMgbW92ZU5vZGVzIG1ldGhvZCBpbiBGRExheW91dFxuQ29TRUxheW91dC5wcm90b3R5cGUubW92ZU5vZGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbE5vZGVzID0gdGhpcy5nZXRBbGxOb2RlcygpO1xuICB2YXIgbm9kZTtcblxuICAvLyBjYWxjdWxhdGUgZGlzcGxhY2VtZW50IGZvciBlYWNoIG5vZGUgXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IGxOb2Rlc1tpXTtcbiAgICBub2RlLmNhbGN1bGF0ZURpc3BsYWNlbWVudCgpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHRoaXMuY29uc3RyYWludHMpLmxlbmd0aCA+IDApIHtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYWNlbWVudHMoKTtcbiAgfVxuXG4gIC8vIG1vdmUgZWFjaCBub2RlXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IGxOb2Rlc1tpXTtcbiAgICBub2RlLm1vdmUoKTtcbiAgfVxufTtcblxuLy8gY29uc3RyYWludCByZWxhdGVkIG1ldGhvZHM6IGluaXRDb25zdHJhaW50VmFyaWFibGVzIGFuZCB1cGRhdGVEaXNwbGFjZW1lbnRzXG5cbi8vIGluaXRpYWxpemUgY29uc3RyYWludCByZWxhdGVkIHZhcmlhYmxlc1xuQ29TRUxheW91dC5wcm90b3R5cGUuaW5pdENvbnN0cmFpbnRWYXJpYWJsZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5pZFRvTm9kZU1hcCA9IG5ldyBNYXAoKTtcbiAgdGhpcy5maXhlZE5vZGVTZXQgPSBuZXcgU2V0KCk7XG5cbiAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXMoKTtcblxuICAvLyBmaWxsIGlkVG9Ob2RlTWFwXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IGFsbE5vZGVzW2ldO1xuICAgIHRoaXMuaWRUb05vZGVNYXAuc2V0KG5vZGUuaWQsIG5vZGUpO1xuICB9XG5cbiAgLy8gY2FsY3VsYXRlIGZpeGVkIG5vZGUgd2VpZ2h0IGZvciBnaXZlbiBjb21wb3VuZCBub2RlXG4gIHZhciBjYWxjdWxhdGVDb21wb3VuZFdlaWdodCA9IGZ1bmN0aW9uIGNhbGN1bGF0ZUNvbXBvdW5kV2VpZ2h0KGNvbXBvdW5kTm9kZSkge1xuICAgIHZhciBub2RlcyA9IGNvbXBvdW5kTm9kZS5nZXRDaGlsZCgpLmdldE5vZGVzKCk7XG4gICAgdmFyIG5vZGU7XG4gICAgdmFyIGZpeGVkTm9kZVdlaWdodCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgaWYgKG5vZGUuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChzZWxmLmZpeGVkTm9kZVNldC5oYXMobm9kZS5pZCkpIHtcbiAgICAgICAgICBmaXhlZE5vZGVXZWlnaHQgKz0gMTAwO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaXhlZE5vZGVXZWlnaHQgKz0gY2FsY3VsYXRlQ29tcG91bmRXZWlnaHQobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaXhlZE5vZGVXZWlnaHQ7XG4gIH07XG5cbiAgaWYgKHRoaXMuY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludCkge1xuICAgIC8vIGZpbGwgZml4ZWROb2RlU2V0XG4gICAgdGhpcy5jb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVEYXRhKSB7XG4gICAgICBzZWxmLmZpeGVkTm9kZVNldC5hZGQobm9kZURhdGEubm9kZUlkKTtcbiAgICB9KTtcblxuICAgIC8vIGFzc2lnbiBmaXhlZCBub2RlIHdlaWdodHMgdG8gY29tcG91bmRzIGlmIHRoZXkgY29udGFpbiBmaXhlZCBub2Rlc1xuICAgIHZhciBhbGxOb2RlcyA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbE5vZGVzKCk7XG4gICAgdmFyIG5vZGU7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub2RlID0gYWxsTm9kZXNbaV07XG4gICAgICBpZiAobm9kZS5nZXRDaGlsZCgpICE9IG51bGwpIHtcbiAgICAgICAgdmFyIGZpeGVkTm9kZVdlaWdodCA9IGNhbGN1bGF0ZUNvbXBvdW5kV2VpZ2h0KG5vZGUpO1xuICAgICAgICBpZiAoZml4ZWROb2RlV2VpZ2h0ID4gMCkge1xuICAgICAgICAgIG5vZGUuZml4ZWROb2RlV2VpZ2h0ID0gZml4ZWROb2RlV2VpZ2h0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMuY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG4gICAgdmFyIG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgdmFyIG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5maXhlZE5vZGVzT25Ib3Jpem9udGFsID0gbmV3IFNldCgpO1xuICAgIHRoaXMuZml4ZWROb2Rlc09uVmVydGljYWwgPSBuZXcgU2V0KCk7XG5cbiAgICAvLyBmaWxsIG1hcHMgYW5kIHNldHNcbiAgICB0aGlzLmZpeGVkTm9kZVNldC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgIHNlbGYuZml4ZWROb2Rlc09uSG9yaXpvbnRhbC5hZGQobm9kZUlkKTtcbiAgICAgIHNlbGYuZml4ZWROb2Rlc09uVmVydGljYWwuYWRkKG5vZGVJZCk7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50KSB7XG4gICAgICBpZiAodGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsKSB7XG4gICAgICAgIHZhciB2ZXJ0aWNhbEFsaWdubWVudCA9IHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNhbEFsaWdubWVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5zZXQoXCJkdW1teVwiICsgaSwgW10pO1xuICAgICAgICAgIHZlcnRpY2FsQWxpZ25tZW50W2ldLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5zZXQobm9kZUlkLCBcImR1bW15XCIgKyBpKTtcbiAgICAgICAgICAgIHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoXCJkdW1teVwiICsgaSkucHVzaChub2RlSWQpO1xuICAgICAgICAgICAgaWYgKHNlbGYuZml4ZWROb2RlU2V0Lmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgIHNlbGYuZml4ZWROb2Rlc09uSG9yaXpvbnRhbC5hZGQoXCJkdW1teVwiICsgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCkge1xuICAgICAgICB2YXIgaG9yaXpvbnRhbEFsaWdubWVudCA9IHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvcml6b250YWxBbGlnbm1lbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0aGlzLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5zZXQoXCJkdW1teVwiICsgaSwgW10pO1xuICAgICAgICAgIGhvcml6b250YWxBbGlnbm1lbnRbaV0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuc2V0KG5vZGVJZCwgXCJkdW1teVwiICsgaSk7XG4gICAgICAgICAgICBzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoXCJkdW1teVwiICsgaSkucHVzaChub2RlSWQpO1xuICAgICAgICAgICAgaWYgKHNlbGYuZml4ZWROb2RlU2V0Lmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgIHNlbGYuZml4ZWROb2Rlc09uVmVydGljYWwuYWRkKFwiZHVtbXlcIiArIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKENvU0VDb25zdGFudHMuUkVMQVhfTU9WRU1FTlRfT05fQ09OU1RSQUlOVFMpIHtcblxuICAgICAgdGhpcy5zaHVmZmxlID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgICAgIHZhciBqLCB4LCBpO1xuICAgICAgICBmb3IgKGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID49IDIgKiBhcnJheS5sZW5ndGggLyAzOyBpLS0pIHtcbiAgICAgICAgICBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgICAgeCA9IGFycmF5W2ldO1xuICAgICAgICAgIGFycmF5W2ldID0gYXJyYXlbal07XG4gICAgICAgICAgYXJyYXlbal0gPSB4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMubm9kZXNJblJlbGF0aXZlSG9yaXpvbnRhbCA9IFtdO1xuICAgICAgdGhpcy5ub2Rlc0luUmVsYXRpdmVWZXJ0aWNhbCA9IFtdO1xuICAgICAgdGhpcy5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBIb3Jpem9udGFsID0gbmV3IE1hcCgpO1xuICAgICAgdGhpcy5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBWZXJ0aWNhbCA9IG5ldyBNYXAoKTtcbiAgICAgIHRoaXMubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbCA9IG5ldyBNYXAoKTtcbiAgICAgIHRoaXMubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwgPSBuZXcgTWFwKCk7XG5cbiAgICAgIC8vIGZpbGwgYXJyYXlzIGFuZCBtYXBzXG4gICAgICB0aGlzLmNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgIGlmIChjb25zdHJhaW50LmxlZnQpIHtcbiAgICAgICAgICB2YXIgbm9kZUlkTGVmdCA9IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQubGVmdCkgPyBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChjb25zdHJhaW50LmxlZnQpIDogY29uc3RyYWludC5sZWZ0O1xuICAgICAgICAgIHZhciBub2RlSWRSaWdodCA9IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQucmlnaHQpID8gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC5yaWdodCkgOiBjb25zdHJhaW50LnJpZ2h0O1xuXG4gICAgICAgICAgaWYgKCFzZWxmLm5vZGVzSW5SZWxhdGl2ZUhvcml6b250YWwuaW5jbHVkZXMobm9kZUlkTGVmdCkpIHtcbiAgICAgICAgICAgIHNlbGYubm9kZXNJblJlbGF0aXZlSG9yaXpvbnRhbC5wdXNoKG5vZGVJZExlZnQpO1xuICAgICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBIb3Jpem9udGFsLnNldChub2RlSWRMZWZ0LCBbXSk7XG4gICAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhub2RlSWRMZWZ0KSkge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuc2V0KG5vZGVJZExlZnQsIHNlbGYuaWRUb05vZGVNYXAuZ2V0KHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQobm9kZUlkTGVmdClbMF0pLmdldENlbnRlclgoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuc2V0KG5vZGVJZExlZnQsIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZExlZnQpLmdldENlbnRlclgoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc2VsZi5ub2Rlc0luUmVsYXRpdmVIb3Jpem9udGFsLmluY2x1ZGVzKG5vZGVJZFJpZ2h0KSkge1xuICAgICAgICAgICAgc2VsZi5ub2Rlc0luUmVsYXRpdmVIb3Jpem9udGFsLnB1c2gobm9kZUlkUmlnaHQpO1xuICAgICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBIb3Jpem9udGFsLnNldChub2RlSWRSaWdodCwgW10pO1xuICAgICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMobm9kZUlkUmlnaHQpKSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5zZXQobm9kZUlkUmlnaHQsIHNlbGYuaWRUb05vZGVNYXAuZ2V0KHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQobm9kZUlkUmlnaHQpWzBdKS5nZXRDZW50ZXJYKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLnNldChub2RlSWRSaWdodCwgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkUmlnaHQpLmdldENlbnRlclgoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBIb3Jpem9udGFsLmdldChub2RlSWRMZWZ0KS5wdXNoKHsgcmlnaHQ6IG5vZGVJZFJpZ2h0LCBnYXA6IGNvbnN0cmFpbnQuZ2FwIH0pO1xuICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwSG9yaXpvbnRhbC5nZXQobm9kZUlkUmlnaHQpLnB1c2goeyBsZWZ0OiBub2RlSWRMZWZ0LCBnYXA6IGNvbnN0cmFpbnQuZ2FwIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBub2RlSWRUb3AgPSBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQudG9wKSA/IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC50b3ApIDogY29uc3RyYWludC50b3A7XG4gICAgICAgICAgdmFyIG5vZGVJZEJvdHRvbSA9IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMoY29uc3RyYWludC5ib3R0b20pID8gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChjb25zdHJhaW50LmJvdHRvbSkgOiBjb25zdHJhaW50LmJvdHRvbTtcblxuICAgICAgICAgIGlmICghc2VsZi5ub2Rlc0luUmVsYXRpdmVWZXJ0aWNhbC5pbmNsdWRlcyhub2RlSWRUb3ApKSB7XG4gICAgICAgICAgICBzZWxmLm5vZGVzSW5SZWxhdGl2ZVZlcnRpY2FsLnB1c2gobm9kZUlkVG9wKTtcbiAgICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwVmVydGljYWwuc2V0KG5vZGVJZFRvcCwgW10pO1xuICAgICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhub2RlSWRUb3ApKSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuc2V0KG5vZGVJZFRvcCwgc2VsZi5pZFRvTm9kZU1hcC5nZXQoc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KG5vZGVJZFRvcClbMF0pLmdldENlbnRlclkoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLnNldChub2RlSWRUb3AsIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZFRvcCkuZ2V0Q2VudGVyWSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzZWxmLm5vZGVzSW5SZWxhdGl2ZVZlcnRpY2FsLmluY2x1ZGVzKG5vZGVJZEJvdHRvbSkpIHtcbiAgICAgICAgICAgIHNlbGYubm9kZXNJblJlbGF0aXZlVmVydGljYWwucHVzaChub2RlSWRCb3R0b20pO1xuICAgICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBWZXJ0aWNhbC5zZXQobm9kZUlkQm90dG9tLCBbXSk7XG4gICAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKG5vZGVJZEJvdHRvbSkpIHtcbiAgICAgICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5zZXQobm9kZUlkQm90dG9tLCBzZWxmLmlkVG9Ob2RlTWFwLmdldChzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQobm9kZUlkQm90dG9tKVswXSkuZ2V0Q2VudGVyWSgpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuc2V0KG5vZGVJZEJvdHRvbSwgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkQm90dG9tKS5nZXRDZW50ZXJZKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcFZlcnRpY2FsLmdldChub2RlSWRUb3ApLnB1c2goeyBib3R0b206IG5vZGVJZEJvdHRvbSwgZ2FwOiBjb25zdHJhaW50LmdhcCB9KTtcbiAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcFZlcnRpY2FsLmdldChub2RlSWRCb3R0b20pLnB1c2goeyB0b3A6IG5vZGVJZFRvcCwgZ2FwOiBjb25zdHJhaW50LmdhcCB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdWJHcmFwaE9uSG9yaXpvbnRhbCA9IG5ldyBNYXAoKTsgLy8gc3ViZ3JhcGggZnJvbSB2ZXJ0aWNhbCBSUCBjb25zdHJhaW50c1xuICAgICAgdmFyIHN1YkdyYXBoT25WZXJ0aWNhbCA9IG5ldyBNYXAoKTsgLy8gc3ViZ3JhcGggZnJvbSB2ZXJ0aWNhbCBSUCBjb25zdHJhaW50c1xuXG4gICAgICAvLyBjb25zdHJ1Y3Qgc3ViZ3JhcGhzIGZyb20gcmVsYXRpdmUgcGxhY2VtZW50IGNvbnN0cmFpbnRzIFxuICAgICAgdGhpcy5jb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICBpZiAoY29uc3RyYWludC5sZWZ0KSB7XG4gICAgICAgICAgdmFyIGxlZnQgPSBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LmxlZnQpID8gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC5sZWZ0KSA6IGNvbnN0cmFpbnQubGVmdDtcbiAgICAgICAgICB2YXIgcmlnaHQgPSBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LnJpZ2h0KSA/IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGNvbnN0cmFpbnQucmlnaHQpIDogY29uc3RyYWludC5yaWdodDtcbiAgICAgICAgICBpZiAoc3ViR3JhcGhPbkhvcml6b250YWwuaGFzKGxlZnQpKSB7XG4gICAgICAgICAgICBzdWJHcmFwaE9uSG9yaXpvbnRhbC5nZXQobGVmdCkucHVzaChyaWdodCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YkdyYXBoT25Ib3Jpem9udGFsLnNldChsZWZ0LCBbcmlnaHRdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN1YkdyYXBoT25Ib3Jpem9udGFsLmhhcyhyaWdodCkpIHtcbiAgICAgICAgICAgIHN1YkdyYXBoT25Ib3Jpem9udGFsLmdldChyaWdodCkucHVzaChsZWZ0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ViR3JhcGhPbkhvcml6b250YWwuc2V0KHJpZ2h0LCBbbGVmdF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgdG9wID0gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LnRvcCkgPyBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGNvbnN0cmFpbnQudG9wKSA6IGNvbnN0cmFpbnQudG9wO1xuICAgICAgICAgIHZhciBib3R0b20gPSBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQuYm90dG9tKSA/IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC5ib3R0b20pIDogY29uc3RyYWludC5ib3R0b207XG4gICAgICAgICAgaWYgKHN1YkdyYXBoT25WZXJ0aWNhbC5oYXModG9wKSkge1xuICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLmdldCh0b3ApLnB1c2goYm90dG9tKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLnNldCh0b3AsIFtib3R0b21dKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN1YkdyYXBoT25WZXJ0aWNhbC5oYXMoYm90dG9tKSkge1xuICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLmdldChib3R0b20pLnB1c2godG9wKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLnNldChib3R0b20sIFt0b3BdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgY29tcG9uZW50cyBmcm9tIGEgZ2l2ZW4gZ3JhcGggXG4gICAgICAvLyBhbHNvIHJldHVybnMgYW4gYXJyYXkgdGhhdCBrZWVwcyB3aGV0aGVyIGVhY2ggY29tcG9uZW50IGNvbnRhaW5zIGZpeGVkIG5vZGVcbiAgICAgIHZhciBjb25zdHJ1Y3RDb21wb25lbnRzID0gZnVuY3Rpb24gY29uc3RydWN0Q29tcG9uZW50cyhncmFwaCwgZml4ZWROb2Rlcykge1xuICAgICAgICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICAgICAgICB2YXIgaXNGaXhlZCA9IFtdO1xuICAgICAgICB2YXIgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpO1xuICAgICAgICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgdmFyIGNvdW50ID0gMDtcblxuICAgICAgICBncmFwaC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgaWYgKCF2aXNpdGVkLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBjb21wb25lbnRzW2NvdW50XSA9IFtdO1xuICAgICAgICAgICAgaXNGaXhlZFtjb3VudF0gPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBjdXJyZW50Tm9kZSA9IGtleTtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2goY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgdmlzaXRlZC5hZGQoY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgY29tcG9uZW50c1tjb3VudF0ucHVzaChjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIGlmIChmaXhlZE5vZGVzLmhhcyhjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgICAgICBpc0ZpeGVkW2NvdW50XSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIG5laWdoYm9ycyA9IGdyYXBoLmdldChjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICAgIG5laWdoYm9ycy5mb3JFYWNoKGZ1bmN0aW9uIChuZWlnaGJvcikge1xuICAgICAgICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMobmVpZ2hib3IpKSB7XG4gICAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKG5laWdoYm9yKTtcbiAgICAgICAgICAgICAgICAgIHZpc2l0ZWQuYWRkKG5laWdoYm9yKTtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbY291bnRdLnB1c2gobmVpZ2hib3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHsgY29tcG9uZW50czogY29tcG9uZW50cywgaXNGaXhlZDogaXNGaXhlZCB9O1xuICAgICAgfTtcblxuICAgICAgdmFyIHJlc3VsdE9uSG9yaXpvbnRhbCA9IGNvbnN0cnVjdENvbXBvbmVudHMoc3ViR3JhcGhPbkhvcml6b250YWwsIHNlbGYuZml4ZWROb2Rlc09uSG9yaXpvbnRhbCk7XG4gICAgICB0aGlzLmNvbXBvbmVudHNPbkhvcml6b250YWwgPSByZXN1bHRPbkhvcml6b250YWwuY29tcG9uZW50cztcbiAgICAgIHRoaXMuZml4ZWRDb21wb25lbnRzT25Ib3Jpem9udGFsID0gcmVzdWx0T25Ib3Jpem9udGFsLmlzRml4ZWQ7XG4gICAgICB2YXIgcmVzdWx0T25WZXJ0aWNhbCA9IGNvbnN0cnVjdENvbXBvbmVudHMoc3ViR3JhcGhPblZlcnRpY2FsLCBzZWxmLmZpeGVkTm9kZXNPblZlcnRpY2FsKTtcbiAgICAgIHRoaXMuY29tcG9uZW50c09uVmVydGljYWwgPSByZXN1bHRPblZlcnRpY2FsLmNvbXBvbmVudHM7XG4gICAgICB0aGlzLmZpeGVkQ29tcG9uZW50c09uVmVydGljYWwgPSByZXN1bHRPblZlcnRpY2FsLmlzRml4ZWQ7XG4gICAgfVxuICB9XG59O1xuXG4vLyB1cGRhdGVzIG5vZGUgZGlzcGxhY2VtZW50cyBiYXNlZCBvbiBjb25zdHJhaW50c1xuQ29TRUxheW91dC5wcm90b3R5cGUudXBkYXRlRGlzcGxhY2VtZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAodGhpcy5jb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50KSB7XG4gICAgdGhpcy5jb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVEYXRhKSB7XG4gICAgICB2YXIgZml4ZWROb2RlID0gc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZURhdGEubm9kZUlkKTtcbiAgICAgIGZpeGVkTm9kZS5kaXNwbGFjZW1lbnRYID0gMDtcbiAgICAgIGZpeGVkTm9kZS5kaXNwbGFjZW1lbnRZID0gMDtcbiAgICB9KTtcbiAgfVxuXG4gIGlmICh0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICBpZiAodGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsKSB7XG4gICAgICB2YXIgYWxsVmVydGljYWxBbGlnbm1lbnRzID0gdGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxWZXJ0aWNhbEFsaWdubWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHRvdGFsRGlzcGxhY2VtZW50WCA9IDA7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYWxsVmVydGljYWxBbGlnbm1lbnRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZml4ZWROb2RlU2V0LmhhcyhhbGxWZXJ0aWNhbEFsaWdubWVudHNbaV1bal0pKSB7XG4gICAgICAgICAgICB0b3RhbERpc3BsYWNlbWVudFggPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRvdGFsRGlzcGxhY2VtZW50WCArPSB0aGlzLmlkVG9Ob2RlTWFwLmdldChhbGxWZXJ0aWNhbEFsaWdubWVudHNbaV1bal0pLmRpc3BsYWNlbWVudFg7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGF2ZXJhZ2VEaXNwbGFjZW1lbnRYID0gdG90YWxEaXNwbGFjZW1lbnRYIC8gYWxsVmVydGljYWxBbGlnbm1lbnRzW2ldLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhbGxWZXJ0aWNhbEFsaWdubWVudHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB0aGlzLmlkVG9Ob2RlTWFwLmdldChhbGxWZXJ0aWNhbEFsaWdubWVudHNbaV1bal0pLmRpc3BsYWNlbWVudFggPSBhdmVyYWdlRGlzcGxhY2VtZW50WDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWwpIHtcbiAgICAgIHZhciBhbGxIb3Jpem9udGFsQWxpZ25tZW50cyA9IHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxIb3Jpem9udGFsQWxpZ25tZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdG90YWxEaXNwbGFjZW1lbnRZID0gMDtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhbGxIb3Jpem9udGFsQWxpZ25tZW50c1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmICh0aGlzLmZpeGVkTm9kZVNldC5oYXMoYWxsSG9yaXpvbnRhbEFsaWdubWVudHNbaV1bal0pKSB7XG4gICAgICAgICAgICB0b3RhbERpc3BsYWNlbWVudFkgPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRvdGFsRGlzcGxhY2VtZW50WSArPSB0aGlzLmlkVG9Ob2RlTWFwLmdldChhbGxIb3Jpem9udGFsQWxpZ25tZW50c1tpXVtqXSkuZGlzcGxhY2VtZW50WTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYXZlcmFnZURpc3BsYWNlbWVudFkgPSB0b3RhbERpc3BsYWNlbWVudFkgLyBhbGxIb3Jpem9udGFsQWxpZ25tZW50c1tpXS5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYWxsSG9yaXpvbnRhbEFsaWdubWVudHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB0aGlzLmlkVG9Ob2RlTWFwLmdldChhbGxIb3Jpem9udGFsQWxpZ25tZW50c1tpXVtqXSkuZGlzcGxhY2VtZW50WSA9IGF2ZXJhZ2VEaXNwbGFjZW1lbnRZO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMuY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG5cbiAgICBpZiAoQ29TRUNvbnN0YW50cy5SRUxBWF9NT1ZFTUVOVF9PTl9DT05TVFJBSU5UUykge1xuICAgICAgLy8gc2h1ZmZsZSBhcnJheSB0byByYW5kb21pemUgbm9kZSBwcm9jZXNzaW5nIG9yZGVyXG4gICAgICBpZiAodGhpcy50b3RhbEl0ZXJhdGlvbnMgJSAxMCA9PSAwKSB7XG4gICAgICAgIHRoaXMuc2h1ZmZsZSh0aGlzLm5vZGVzSW5SZWxhdGl2ZUhvcml6b250YWwpO1xuICAgICAgICB0aGlzLnNodWZmbGUodGhpcy5ub2Rlc0luUmVsYXRpdmVWZXJ0aWNhbCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubm9kZXNJblJlbGF0aXZlSG9yaXpvbnRhbC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgaWYgKCFzZWxmLmZpeGVkTm9kZXNPbkhvcml6b250YWwuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICB2YXIgZGlzcGxhY2VtZW50ID0gMDtcbiAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICBkaXNwbGFjZW1lbnQgPSBzZWxmLmlkVG9Ob2RlTWFwLmdldChzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KG5vZGVJZClbMF0pLmRpc3BsYWNlbWVudFg7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpc3BsYWNlbWVudCA9IHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WDtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBIb3Jpem9udGFsLmdldChub2RlSWQpLmZvckVhY2goZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgIGlmIChjb25zdHJhaW50LnJpZ2h0KSB7XG4gICAgICAgICAgICAgIHZhciBkaWZmID0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChjb25zdHJhaW50LnJpZ2h0KSAtIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5nZXQobm9kZUlkKSAtIGRpc3BsYWNlbWVudDtcbiAgICAgICAgICAgICAgaWYgKGRpZmYgPCBjb25zdHJhaW50LmdhcCkge1xuICAgICAgICAgICAgICAgIGRpc3BsYWNlbWVudCAtPSBjb25zdHJhaW50LmdhcCAtIGRpZmY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBkaWZmID0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChub2RlSWQpIC0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChjb25zdHJhaW50LmxlZnQpICsgZGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgICBpZiAoZGlmZiA8IGNvbnN0cmFpbnQuZ2FwKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50ICs9IGNvbnN0cmFpbnQuZ2FwIC0gZGlmZjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5zZXQobm9kZUlkLCBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuZ2V0KG5vZGVJZCkgKyBkaXNwbGFjZW1lbnQpO1xuICAgICAgICAgIGlmIChzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgIHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQobm9kZUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRYID0gZGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WCA9IGRpc3BsYWNlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLm5vZGVzSW5SZWxhdGl2ZVZlcnRpY2FsLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICBpZiAoIXNlbGYuZml4ZWROb2Rlc09uSG9yaXpvbnRhbC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgIHZhciBkaXNwbGFjZW1lbnQgPSAwO1xuICAgICAgICAgIGlmIChzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgZGlzcGxhY2VtZW50ID0gc2VsZi5pZFRvTm9kZU1hcC5nZXQoc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KG5vZGVJZClbMF0pLmRpc3BsYWNlbWVudFk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpc3BsYWNlbWVudCA9IHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBWZXJ0aWNhbC5nZXQobm9kZUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgICAgICBpZiAoY29uc3RyYWludC5ib3R0b20pIHtcbiAgICAgICAgICAgICAgdmFyIGRpZmYgPSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLmdldChjb25zdHJhaW50LmJvdHRvbSkgLSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLmdldChub2RlSWQpIC0gZGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgICBpZiAoZGlmZiA8IGNvbnN0cmFpbnQuZ2FwKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50IC09IGNvbnN0cmFpbnQuZ2FwIC0gZGlmZjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIGRpZmYgPSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLmdldChub2RlSWQpIC0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5nZXQoY29uc3RyYWludC50b3ApICsgZGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgICBpZiAoZGlmZiA8IGNvbnN0cmFpbnQuZ2FwKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50ICs9IGNvbnN0cmFpbnQuZ2FwIC0gZGlmZjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuc2V0KG5vZGVJZCwgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5nZXQobm9kZUlkKSArIGRpc3BsYWNlbWVudCk7XG4gICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICBzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQobm9kZUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRZID0gZGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WSA9IGRpc3BsYWNlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29tcG9uZW50c09uSG9yaXpvbnRhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzT25Ib3Jpem9udGFsW2ldO1xuICAgICAgICBpZiAodGhpcy5maXhlZENvbXBvbmVudHNPbkhvcml6b250YWxbaV0pIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbXBvbmVudC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMoY29tcG9uZW50W2pdKSkge1xuICAgICAgICAgICAgICB0aGlzLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGNvbXBvbmVudFtqXSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRYID0gMDtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmlkVG9Ob2RlTWFwLmdldChjb21wb25lbnRbal0pLmRpc3BsYWNlbWVudFggPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3VtID0gMDtcbiAgICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcG9uZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhjb21wb25lbnRbal0pKSB7XG4gICAgICAgICAgICAgIHZhciBhY3R1YWxOb2RlcyA9IHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoY29tcG9uZW50W2pdKTtcbiAgICAgICAgICAgICAgc3VtICs9IGFjdHVhbE5vZGVzLmxlbmd0aCAqIHRoaXMuaWRUb05vZGVNYXAuZ2V0KGFjdHVhbE5vZGVzWzBdKS5kaXNwbGFjZW1lbnRYO1xuICAgICAgICAgICAgICBjb3VudCArPSBhY3R1YWxOb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdW0gKz0gdGhpcy5pZFRvTm9kZU1hcC5nZXQoY29tcG9uZW50W2pdKS5kaXNwbGFjZW1lbnRYO1xuICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgYXZlcmFnZURpc3BsYWNlbWVudCA9IHN1bSAvIGNvdW50O1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcG9uZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhjb21wb25lbnRbal0pKSB7XG4gICAgICAgICAgICAgIHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoY29tcG9uZW50W2pdKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFggPSBhdmVyYWdlRGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaWRUb05vZGVNYXAuZ2V0KGNvbXBvbmVudFtqXSkuZGlzcGxhY2VtZW50WCA9IGF2ZXJhZ2VEaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb21wb25lbnRzT25WZXJ0aWNhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzT25WZXJ0aWNhbFtpXTtcbiAgICAgICAgaWYgKHRoaXMuZml4ZWRDb21wb25lbnRzT25WZXJ0aWNhbFtpXSkge1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcG9uZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKGNvbXBvbmVudFtqXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGNvbXBvbmVudFtqXSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRZID0gMDtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmlkVG9Ob2RlTWFwLmdldChjb21wb25lbnRbal0pLmRpc3BsYWNlbWVudFkgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3VtID0gMDtcbiAgICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcG9uZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKGNvbXBvbmVudFtqXSkpIHtcbiAgICAgICAgICAgICAgdmFyIGFjdHVhbE5vZGVzID0gdGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGNvbXBvbmVudFtqXSk7XG4gICAgICAgICAgICAgIHN1bSArPSBhY3R1YWxOb2Rlcy5sZW5ndGggKiB0aGlzLmlkVG9Ob2RlTWFwLmdldChhY3R1YWxOb2Rlc1swXSkuZGlzcGxhY2VtZW50WTtcbiAgICAgICAgICAgICAgY291bnQgKz0gYWN0dWFsTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3VtICs9IHRoaXMuaWRUb05vZGVNYXAuZ2V0KGNvbXBvbmVudFtqXSkuZGlzcGxhY2VtZW50WTtcbiAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGF2ZXJhZ2VEaXNwbGFjZW1lbnQgPSBzdW0gLyBjb3VudDtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbXBvbmVudC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhjb21wb25lbnRbal0pKSB7XG4gICAgICAgICAgICAgIHRoaXMuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChjb21wb25lbnRbal0pLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WSA9IGF2ZXJhZ2VEaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5pZFRvTm9kZU1hcC5nZXQoY29tcG9uZW50W2pdKS5kaXNwbGFjZW1lbnRZID0gYXZlcmFnZURpc3BsYWNlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNhbGN1bGF0ZU5vZGVzVG9BcHBseUdyYXZpdGF0aW9uVG8gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBub2RlTGlzdCA9IFtdO1xuICB2YXIgZ3JhcGg7XG5cbiAgdmFyIGdyYXBocyA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEdyYXBocygpO1xuICB2YXIgc2l6ZSA9IGdyYXBocy5sZW5ndGg7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgZ3JhcGggPSBncmFwaHNbaV07XG5cbiAgICBncmFwaC51cGRhdGVDb25uZWN0ZWQoKTtcblxuICAgIGlmICghZ3JhcGguaXNDb25uZWN0ZWQpIHtcbiAgICAgIG5vZGVMaXN0ID0gbm9kZUxpc3QuY29uY2F0KGdyYXBoLmdldE5vZGVzKCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub2RlTGlzdDtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNyZWF0ZUJlbmRwb2ludHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlZGdlcyA9IFtdO1xuICBlZGdlcyA9IGVkZ2VzLmNvbmNhdCh0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxFZGdlcygpKTtcbiAgdmFyIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWRnZSA9IGVkZ2VzW2ldO1xuXG4gICAgaWYgKCF2aXNpdGVkLmhhcyhlZGdlKSkge1xuICAgICAgdmFyIHNvdXJjZSA9IGVkZ2UuZ2V0U291cmNlKCk7XG4gICAgICB2YXIgdGFyZ2V0ID0gZWRnZS5nZXRUYXJnZXQoKTtcblxuICAgICAgaWYgKHNvdXJjZSA9PSB0YXJnZXQpIHtcbiAgICAgICAgZWRnZS5nZXRCZW5kcG9pbnRzKCkucHVzaChuZXcgUG9pbnREKCkpO1xuICAgICAgICBlZGdlLmdldEJlbmRwb2ludHMoKS5wdXNoKG5ldyBQb2ludEQoKSk7XG4gICAgICAgIHRoaXMuY3JlYXRlRHVtbXlOb2Rlc0ZvckJlbmRwb2ludHMoZWRnZSk7XG4gICAgICAgIHZpc2l0ZWQuYWRkKGVkZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGVkZ2VMaXN0ID0gW107XG5cbiAgICAgICAgZWRnZUxpc3QgPSBlZGdlTGlzdC5jb25jYXQoc291cmNlLmdldEVkZ2VMaXN0VG9Ob2RlKHRhcmdldCkpO1xuICAgICAgICBlZGdlTGlzdCA9IGVkZ2VMaXN0LmNvbmNhdCh0YXJnZXQuZ2V0RWRnZUxpc3RUb05vZGUoc291cmNlKSk7XG5cbiAgICAgICAgaWYgKCF2aXNpdGVkLmhhcyhlZGdlTGlzdFswXSkpIHtcbiAgICAgICAgICBpZiAoZWRnZUxpc3QubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdmFyIGs7XG4gICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZWRnZUxpc3QubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgdmFyIG11bHRpRWRnZSA9IGVkZ2VMaXN0W2tdO1xuICAgICAgICAgICAgICBtdWx0aUVkZ2UuZ2V0QmVuZHBvaW50cygpLnB1c2gobmV3IFBvaW50RCgpKTtcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVEdW1teU5vZGVzRm9yQmVuZHBvaW50cyhtdWx0aUVkZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlZGdlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgICB2aXNpdGVkLmFkZChlZGdlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2aXNpdGVkLnNpemUgPT0gZWRnZXMubGVuZ3RoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnBvc2l0aW9uTm9kZXNSYWRpYWxseSA9IGZ1bmN0aW9uIChmb3Jlc3QpIHtcbiAgLy8gV2UgdGlsZSB0aGUgdHJlZXMgdG8gYSBncmlkIHJvdyBieSByb3c7IGZpcnN0IHRyZWUgc3RhcnRzIGF0ICgwLDApXG4gIHZhciBjdXJyZW50U3RhcnRpbmdQb2ludCA9IG5ldyBQb2ludCgwLCAwKTtcbiAgdmFyIG51bWJlck9mQ29sdW1ucyA9IE1hdGguY2VpbChNYXRoLnNxcnQoZm9yZXN0Lmxlbmd0aCkpO1xuICB2YXIgaGVpZ2h0ID0gMDtcbiAgdmFyIGN1cnJlbnRZID0gMDtcbiAgdmFyIGN1cnJlbnRYID0gMDtcbiAgdmFyIHBvaW50ID0gbmV3IFBvaW50RCgwLCAwKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcmVzdC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChpICUgbnVtYmVyT2ZDb2x1bW5zID09IDApIHtcbiAgICAgIC8vIFN0YXJ0IG9mIGEgbmV3IHJvdywgbWFrZSB0aGUgeCBjb29yZGluYXRlIDAsIGluY3JlbWVudCB0aGVcbiAgICAgIC8vIHkgY29vcmRpbmF0ZSB3aXRoIHRoZSBtYXggaGVpZ2h0IG9mIHRoZSBwcmV2aW91cyByb3dcbiAgICAgIGN1cnJlbnRYID0gMDtcbiAgICAgIGN1cnJlbnRZID0gaGVpZ2h0O1xuXG4gICAgICBpZiAoaSAhPSAwKSB7XG4gICAgICAgIGN1cnJlbnRZICs9IENvU0VDb25zdGFudHMuREVGQVVMVF9DT01QT05FTlRfU0VQRVJBVElPTjtcbiAgICAgIH1cblxuICAgICAgaGVpZ2h0ID0gMDtcbiAgICB9XG5cbiAgICB2YXIgdHJlZSA9IGZvcmVzdFtpXTtcblxuICAgIC8vIEZpbmQgdGhlIGNlbnRlciBvZiB0aGUgdHJlZVxuICAgIHZhciBjZW50ZXJOb2RlID0gTGF5b3V0LmZpbmRDZW50ZXJPZlRyZWUodHJlZSk7XG5cbiAgICAvLyBTZXQgdGhlIHN0YXJpbmcgcG9pbnQgb2YgdGhlIG5leHQgdHJlZVxuICAgIGN1cnJlbnRTdGFydGluZ1BvaW50LnggPSBjdXJyZW50WDtcbiAgICBjdXJyZW50U3RhcnRpbmdQb2ludC55ID0gY3VycmVudFk7XG5cbiAgICAvLyBEbyBhIHJhZGlhbCBsYXlvdXQgc3RhcnRpbmcgd2l0aCB0aGUgY2VudGVyXG4gICAgcG9pbnQgPSBDb1NFTGF5b3V0LnJhZGlhbExheW91dCh0cmVlLCBjZW50ZXJOb2RlLCBjdXJyZW50U3RhcnRpbmdQb2ludCk7XG5cbiAgICBpZiAocG9pbnQueSA+IGhlaWdodCkge1xuICAgICAgaGVpZ2h0ID0gTWF0aC5mbG9vcihwb2ludC55KTtcbiAgICB9XG5cbiAgICBjdXJyZW50WCA9IE1hdGguZmxvb3IocG9pbnQueCArIENvU0VDb25zdGFudHMuREVGQVVMVF9DT01QT05FTlRfU0VQRVJBVElPTik7XG4gIH1cblxuICB0aGlzLnRyYW5zZm9ybShuZXcgUG9pbnREKExheW91dENvbnN0YW50cy5XT1JMRF9DRU5URVJfWCAtIHBvaW50LnggLyAyLCBMYXlvdXRDb25zdGFudHMuV09STERfQ0VOVEVSX1kgLSBwb2ludC55IC8gMikpO1xufTtcblxuQ29TRUxheW91dC5yYWRpYWxMYXlvdXQgPSBmdW5jdGlvbiAodHJlZSwgY2VudGVyTm9kZSwgc3RhcnRpbmdQb2ludCkge1xuICB2YXIgcmFkaWFsU2VwID0gTWF0aC5tYXgodGhpcy5tYXhEaWFnb25hbEluVHJlZSh0cmVlKSwgQ29TRUNvbnN0YW50cy5ERUZBVUxUX1JBRElBTF9TRVBBUkFUSU9OKTtcbiAgQ29TRUxheW91dC5icmFuY2hSYWRpYWxMYXlvdXQoY2VudGVyTm9kZSwgbnVsbCwgMCwgMzU5LCAwLCByYWRpYWxTZXApO1xuICB2YXIgYm91bmRzID0gTEdyYXBoLmNhbGN1bGF0ZUJvdW5kcyh0cmVlKTtcblxuICB2YXIgdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybSgpO1xuICB0cmFuc2Zvcm0uc2V0RGV2aWNlT3JnWChib3VuZHMuZ2V0TWluWCgpKTtcbiAgdHJhbnNmb3JtLnNldERldmljZU9yZ1koYm91bmRzLmdldE1pblkoKSk7XG4gIHRyYW5zZm9ybS5zZXRXb3JsZE9yZ1goc3RhcnRpbmdQb2ludC54KTtcbiAgdHJhbnNmb3JtLnNldFdvcmxkT3JnWShzdGFydGluZ1BvaW50LnkpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJlZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gdHJlZVtpXTtcbiAgICBub2RlLnRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICB9XG5cbiAgdmFyIGJvdHRvbVJpZ2h0ID0gbmV3IFBvaW50RChib3VuZHMuZ2V0TWF4WCgpLCBib3VuZHMuZ2V0TWF4WSgpKTtcblxuICByZXR1cm4gdHJhbnNmb3JtLmludmVyc2VUcmFuc2Zvcm1Qb2ludChib3R0b21SaWdodCk7XG59O1xuXG5Db1NFTGF5b3V0LmJyYW5jaFJhZGlhbExheW91dCA9IGZ1bmN0aW9uIChub2RlLCBwYXJlbnRPZk5vZGUsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCBkaXN0YW5jZSwgcmFkaWFsU2VwYXJhdGlvbikge1xuICAvLyBGaXJzdCwgcG9zaXRpb24gdGhpcyBub2RlIGJ5IGZpbmRpbmcgaXRzIGFuZ2xlLlxuICB2YXIgaGFsZkludGVydmFsID0gKGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSArIDEpIC8gMjtcblxuICBpZiAoaGFsZkludGVydmFsIDwgMCkge1xuICAgIGhhbGZJbnRlcnZhbCArPSAxODA7XG4gIH1cblxuICB2YXIgbm9kZUFuZ2xlID0gKGhhbGZJbnRlcnZhbCArIHN0YXJ0QW5nbGUpICUgMzYwO1xuICB2YXIgdGV0YSA9IG5vZGVBbmdsZSAqIElHZW9tZXRyeS5UV09fUEkgLyAzNjA7XG5cbiAgLy8gTWFrZSBwb2xhciB0byBqYXZhIGNvcmRpbmF0ZSBjb252ZXJzaW9uLlxuICB2YXIgY29zX3RldGEgPSBNYXRoLmNvcyh0ZXRhKTtcbiAgdmFyIHhfID0gZGlzdGFuY2UgKiBNYXRoLmNvcyh0ZXRhKTtcbiAgdmFyIHlfID0gZGlzdGFuY2UgKiBNYXRoLnNpbih0ZXRhKTtcblxuICBub2RlLnNldENlbnRlcih4XywgeV8pO1xuXG4gIC8vIFRyYXZlcnNlIGFsbCBuZWlnaGJvcnMgb2YgdGhpcyBub2RlIGFuZCByZWN1cnNpdmVseSBjYWxsIHRoaXNcbiAgLy8gZnVuY3Rpb24uXG4gIHZhciBuZWlnaGJvckVkZ2VzID0gW107XG4gIG5laWdoYm9yRWRnZXMgPSBuZWlnaGJvckVkZ2VzLmNvbmNhdChub2RlLmdldEVkZ2VzKCkpO1xuICB2YXIgY2hpbGRDb3VudCA9IG5laWdoYm9yRWRnZXMubGVuZ3RoO1xuXG4gIGlmIChwYXJlbnRPZk5vZGUgIT0gbnVsbCkge1xuICAgIGNoaWxkQ291bnQtLTtcbiAgfVxuXG4gIHZhciBicmFuY2hDb3VudCA9IDA7XG5cbiAgdmFyIGluY0VkZ2VzQ291bnQgPSBuZWlnaGJvckVkZ2VzLmxlbmd0aDtcbiAgdmFyIHN0YXJ0SW5kZXg7XG5cbiAgdmFyIGVkZ2VzID0gbm9kZS5nZXRFZGdlc0JldHdlZW4ocGFyZW50T2ZOb2RlKTtcblxuICAvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgZWRnZXMsIHBydW5lIHRoZW0gdW50aWwgdGhlcmUgcmVtYWlucyBvbmx5IG9uZVxuICAvLyBlZGdlLlxuICB3aGlsZSAoZWRnZXMubGVuZ3RoID4gMSkge1xuICAgIC8vbmVpZ2hib3JFZGdlcy5yZW1vdmUoZWRnZXMucmVtb3ZlKDApKTtcbiAgICB2YXIgdGVtcCA9IGVkZ2VzWzBdO1xuICAgIGVkZ2VzLnNwbGljZSgwLCAxKTtcbiAgICB2YXIgaW5kZXggPSBuZWlnaGJvckVkZ2VzLmluZGV4T2YodGVtcCk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIG5laWdoYm9yRWRnZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgaW5jRWRnZXNDb3VudC0tO1xuICAgIGNoaWxkQ291bnQtLTtcbiAgfVxuXG4gIGlmIChwYXJlbnRPZk5vZGUgIT0gbnVsbCkge1xuICAgIC8vYXNzZXJ0IGVkZ2VzLmxlbmd0aCA9PSAxO1xuICAgIHN0YXJ0SW5kZXggPSAobmVpZ2hib3JFZGdlcy5pbmRleE9mKGVkZ2VzWzBdKSArIDEpICUgaW5jRWRnZXNDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBzdGFydEluZGV4ID0gMDtcbiAgfVxuXG4gIHZhciBzdGVwQW5nbGUgPSBNYXRoLmFicyhlbmRBbmdsZSAtIHN0YXJ0QW5nbGUpIC8gY2hpbGRDb3VudDtcblxuICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgYnJhbmNoQ291bnQgIT0gY2hpbGRDb3VudDsgaSA9ICsraSAlIGluY0VkZ2VzQ291bnQpIHtcbiAgICB2YXIgY3VycmVudE5laWdoYm9yID0gbmVpZ2hib3JFZGdlc1tpXS5nZXRPdGhlckVuZChub2RlKTtcblxuICAgIC8vIERvbid0IGJhY2sgdHJhdmVyc2UgdG8gcm9vdCBub2RlIGluIGN1cnJlbnQgdHJlZS5cbiAgICBpZiAoY3VycmVudE5laWdoYm9yID09IHBhcmVudE9mTm9kZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkU3RhcnRBbmdsZSA9IChzdGFydEFuZ2xlICsgYnJhbmNoQ291bnQgKiBzdGVwQW5nbGUpICUgMzYwO1xuICAgIHZhciBjaGlsZEVuZEFuZ2xlID0gKGNoaWxkU3RhcnRBbmdsZSArIHN0ZXBBbmdsZSkgJSAzNjA7XG5cbiAgICBDb1NFTGF5b3V0LmJyYW5jaFJhZGlhbExheW91dChjdXJyZW50TmVpZ2hib3IsIG5vZGUsIGNoaWxkU3RhcnRBbmdsZSwgY2hpbGRFbmRBbmdsZSwgZGlzdGFuY2UgKyByYWRpYWxTZXBhcmF0aW9uLCByYWRpYWxTZXBhcmF0aW9uKTtcblxuICAgIGJyYW5jaENvdW50Kys7XG4gIH1cbn07XG5cbkNvU0VMYXlvdXQubWF4RGlhZ29uYWxJblRyZWUgPSBmdW5jdGlvbiAodHJlZSkge1xuICB2YXIgbWF4RGlhZ29uYWwgPSBJbnRlZ2VyLk1JTl9WQUxVRTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRyZWUubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IHRyZWVbaV07XG4gICAgdmFyIGRpYWdvbmFsID0gbm9kZS5nZXREaWFnb25hbCgpO1xuXG4gICAgaWYgKGRpYWdvbmFsID4gbWF4RGlhZ29uYWwpIHtcbiAgICAgIG1heERpYWdvbmFsID0gZGlhZ29uYWw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1heERpYWdvbmFsO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuY2FsY1JlcHVsc2lvblJhbmdlID0gZnVuY3Rpb24gKCkge1xuICAvLyBmb3JtdWxhIGlzIDIgeCAobGV2ZWwgKyAxKSB4IGlkZWFsRWRnZUxlbmd0aFxuICByZXR1cm4gMiAqICh0aGlzLmxldmVsICsgMSkgKiB0aGlzLmlkZWFsRWRnZUxlbmd0aDtcbn07XG5cbi8vIFRpbGluZyBtZXRob2RzXG5cbi8vIEdyb3VwIHplcm8gZGVncmVlIG1lbWJlcnMgd2hvc2UgcGFyZW50cyBhcmUgbm90IHRvIGJlIHRpbGVkLCBjcmVhdGUgZHVtbXkgcGFyZW50cyB3aGVyZSBuZWVkZWQgYW5kIGZpbGwgbWVtYmVyR3JvdXBzIGJ5IHRoZWlyIGR1bW1wIHBhcmVudCBpZCdzXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5ncm91cFplcm9EZWdyZWVNZW1iZXJzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIC8vIGFycmF5IG9mIFtwYXJlbnRfaWQgeCBvbmVEZWdyZWVOb2RlX2lkXVxuICB2YXIgdGVtcE1lbWJlckdyb3VwcyA9IHt9OyAvLyBBIHRlbXBvcmFyeSBtYXAgb2YgcGFyZW50IG5vZGUgYW5kIGl0cyB6ZXJvIGRlZ3JlZSBtZW1iZXJzXG4gIHRoaXMubWVtYmVyR3JvdXBzID0ge307IC8vIEEgbWFwIG9mIGR1bW15IHBhcmVudCBub2RlIGFuZCBpdHMgemVybyBkZWdyZWUgbWVtYmVycyB3aG9zZSBwYXJlbnRzIGFyZSBub3QgdG8gYmUgdGlsZWRcbiAgdGhpcy5pZFRvRHVtbXlOb2RlID0ge307IC8vIEEgbWFwIG9mIGlkIHRvIGR1bW15IG5vZGUgXG5cbiAgdmFyIHplcm9EZWdyZWUgPSBbXTsgLy8gTGlzdCBvZiB6ZXJvIGRlZ3JlZSBub2RlcyB3aG9zZSBwYXJlbnRzIGFyZSBub3QgdG8gYmUgdGlsZWRcbiAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXMoKTtcblxuICAvLyBGaWxsIHplcm8gZGVncmVlIGxpc3RcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gYWxsTm9kZXNbaV07XG4gICAgdmFyIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50KCk7XG4gICAgLy8gSWYgYSBub2RlIGhhcyB6ZXJvIGRlZ3JlZSBhbmQgaXRzIHBhcmVudCBpcyBub3QgdG8gYmUgdGlsZWQgaWYgZXhpc3RzIGFkZCB0aGF0IG5vZGUgdG8gemVyb0RlZ3JlcyBsaXN0XG4gICAgaWYgKHRoaXMuZ2V0Tm9kZURlZ3JlZVdpdGhDaGlsZHJlbihub2RlKSA9PT0gMCAmJiAocGFyZW50LmlkID09IHVuZGVmaW5lZCB8fCAhdGhpcy5nZXRUb0JlVGlsZWQocGFyZW50KSkpIHtcbiAgICAgIHplcm9EZWdyZWUucHVzaChub2RlKTtcbiAgICB9XG4gIH1cblxuICAvLyBDcmVhdGUgYSBtYXAgb2YgcGFyZW50IG5vZGUgYW5kIGl0cyB6ZXJvIGRlZ3JlZSBtZW1iZXJzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgemVyb0RlZ3JlZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gemVyb0RlZ3JlZVtpXTsgLy8gWmVybyBkZWdyZWUgbm9kZSBpdHNlbGZcbiAgICB2YXIgcF9pZCA9IG5vZGUuZ2V0UGFyZW50KCkuaWQ7IC8vIFBhcmVudCBpZFxuXG4gICAgaWYgKHR5cGVvZiB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdID09PSBcInVuZGVmaW5lZFwiKSB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdID0gW107XG5cbiAgICB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdID0gdGVtcE1lbWJlckdyb3Vwc1twX2lkXS5jb25jYXQobm9kZSk7IC8vIFB1c2ggbm9kZSB0byB0aGUgbGlzdCBiZWxvbmdzIHRvIGl0cyBwYXJlbnQgaW4gdGVtcE1lbWJlckdyb3Vwc1xuICB9XG5cbiAgLy8gSWYgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byBub2RlcyBhdCBhIGxldmVsLCBjcmVhdGUgYSBkdW1teSBjb21wb3VuZCBmb3IgdGhlbVxuICBPYmplY3Qua2V5cyh0ZW1wTWVtYmVyR3JvdXBzKS5mb3JFYWNoKGZ1bmN0aW9uIChwX2lkKSB7XG4gICAgaWYgKHRlbXBNZW1iZXJHcm91cHNbcF9pZF0ubGVuZ3RoID4gMSkge1xuICAgICAgdmFyIGR1bW15Q29tcG91bmRJZCA9IFwiRHVtbXlDb21wb3VuZF9cIiArIHBfaWQ7IC8vIFRoZSBpZCBvZiBkdW1teSBjb21wb3VuZCB3aGljaCB3aWxsIGJlIGNyZWF0ZWQgc29vblxuICAgICAgc2VsZi5tZW1iZXJHcm91cHNbZHVtbXlDb21wb3VuZElkXSA9IHRlbXBNZW1iZXJHcm91cHNbcF9pZF07IC8vIEFkZCBkdW1teSBjb21wb3VuZCB0byBtZW1iZXJHcm91cHNcblxuICAgICAgdmFyIHBhcmVudCA9IHRlbXBNZW1iZXJHcm91cHNbcF9pZF1bMF0uZ2V0UGFyZW50KCk7IC8vIFRoZSBwYXJlbnQgb2YgemVybyBkZWdyZWUgbm9kZXMgd2lsbCBiZSB0aGUgcGFyZW50IG9mIG5ldyBkdW1teSBjb21wb3VuZFxuXG4gICAgICAvLyBDcmVhdGUgYSBkdW1teSBjb21wb3VuZCB3aXRoIGNhbGN1bGF0ZWQgaWRcbiAgICAgIHZhciBkdW1teUNvbXBvdW5kID0gbmV3IENvU0VOb2RlKHNlbGYuZ3JhcGhNYW5hZ2VyKTtcbiAgICAgIGR1bW15Q29tcG91bmQuaWQgPSBkdW1teUNvbXBvdW5kSWQ7XG4gICAgICBkdW1teUNvbXBvdW5kLnBhZGRpbmdMZWZ0ID0gcGFyZW50LnBhZGRpbmdMZWZ0IHx8IDA7XG4gICAgICBkdW1teUNvbXBvdW5kLnBhZGRpbmdSaWdodCA9IHBhcmVudC5wYWRkaW5nUmlnaHQgfHwgMDtcbiAgICAgIGR1bW15Q29tcG91bmQucGFkZGluZ0JvdHRvbSA9IHBhcmVudC5wYWRkaW5nQm90dG9tIHx8IDA7XG4gICAgICBkdW1teUNvbXBvdW5kLnBhZGRpbmdUb3AgPSBwYXJlbnQucGFkZGluZ1RvcCB8fCAwO1xuXG4gICAgICBzZWxmLmlkVG9EdW1teU5vZGVbZHVtbXlDb21wb3VuZElkXSA9IGR1bW15Q29tcG91bmQ7XG5cbiAgICAgIHZhciBkdW1teVBhcmVudEdyYXBoID0gc2VsZi5nZXRHcmFwaE1hbmFnZXIoKS5hZGQoc2VsZi5uZXdHcmFwaCgpLCBkdW1teUNvbXBvdW5kKTtcbiAgICAgIHZhciBwYXJlbnRHcmFwaCA9IHBhcmVudC5nZXRDaGlsZCgpO1xuXG4gICAgICAvLyBBZGQgZHVtbXkgY29tcG91bmQgdG8gcGFyZW50IHRoZSBncmFwaFxuICAgICAgcGFyZW50R3JhcGguYWRkKGR1bW15Q29tcG91bmQpO1xuXG4gICAgICAvLyBGb3IgZWFjaCB6ZXJvIGRlZ3JlZSBub2RlIGluIHRoaXMgbGV2ZWwgcmVtb3ZlIGl0IGZyb20gaXRzIHBhcmVudCBncmFwaCBhbmQgYWRkIGl0IHRvIHRoZSBncmFwaCBvZiBkdW1teSBwYXJlbnRcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGVtcE1lbWJlckdyb3Vwc1twX2lkXS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbm9kZSA9IHRlbXBNZW1iZXJHcm91cHNbcF9pZF1baV07XG5cbiAgICAgICAgcGFyZW50R3JhcGgucmVtb3ZlKG5vZGUpO1xuICAgICAgICBkdW1teVBhcmVudEdyYXBoLmFkZChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuY2xlYXJDb21wb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjaGlsZEdyYXBoTWFwID0ge307XG4gIHZhciBpZFRvTm9kZSA9IHt9O1xuXG4gIC8vIEdldCBjb21wb3VuZCBvcmRlcmluZyBieSBmaW5kaW5nIHRoZSBpbm5lciBvbmUgZmlyc3RcbiAgdGhpcy5wZXJmb3JtREZTT25Db21wb3VuZHMoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29tcG91bmRPcmRlci5sZW5ndGg7IGkrKykge1xuXG4gICAgaWRUb05vZGVbdGhpcy5jb21wb3VuZE9yZGVyW2ldLmlkXSA9IHRoaXMuY29tcG91bmRPcmRlcltpXTtcbiAgICBjaGlsZEdyYXBoTWFwW3RoaXMuY29tcG91bmRPcmRlcltpXS5pZF0gPSBbXS5jb25jYXQodGhpcy5jb21wb3VuZE9yZGVyW2ldLmdldENoaWxkKCkuZ2V0Tm9kZXMoKSk7XG5cbiAgICAvLyBSZW1vdmUgY2hpbGRyZW4gb2YgY29tcG91bmRzXG4gICAgdGhpcy5ncmFwaE1hbmFnZXIucmVtb3ZlKHRoaXMuY29tcG91bmRPcmRlcltpXS5nZXRDaGlsZCgpKTtcbiAgICB0aGlzLmNvbXBvdW5kT3JkZXJbaV0uY2hpbGQgPSBudWxsO1xuICB9XG5cbiAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxOb2RlcygpO1xuXG4gIC8vIFRpbGUgdGhlIHJlbW92ZWQgY2hpbGRyZW5cbiAgdGhpcy50aWxlQ29tcG91bmRNZW1iZXJzKGNoaWxkR3JhcGhNYXAsIGlkVG9Ob2RlKTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNsZWFyWmVyb0RlZ3JlZU1lbWJlcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHRpbGVkWmVyb0RlZ3JlZVBhY2sgPSB0aGlzLnRpbGVkWmVyb0RlZ3JlZVBhY2sgPSBbXTtcblxuICBPYmplY3Qua2V5cyh0aGlzLm1lbWJlckdyb3VwcykuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgY29tcG91bmROb2RlID0gc2VsZi5pZFRvRHVtbXlOb2RlW2lkXTsgLy8gR2V0IHRoZSBkdW1teSBjb21wb3VuZFxuXG4gICAgdGlsZWRaZXJvRGVncmVlUGFja1tpZF0gPSBzZWxmLnRpbGVOb2RlcyhzZWxmLm1lbWJlckdyb3Vwc1tpZF0sIGNvbXBvdW5kTm9kZS5wYWRkaW5nTGVmdCArIGNvbXBvdW5kTm9kZS5wYWRkaW5nUmlnaHQpO1xuXG4gICAgLy8gU2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBkdW1teSBjb21wb3VuZCBhcyBjYWxjdWxhdGVkXG4gICAgY29tcG91bmROb2RlLnJlY3Qud2lkdGggPSB0aWxlZFplcm9EZWdyZWVQYWNrW2lkXS53aWR0aDtcbiAgICBjb21wb3VuZE5vZGUucmVjdC5oZWlnaHQgPSB0aWxlZFplcm9EZWdyZWVQYWNrW2lkXS5oZWlnaHQ7XG4gICAgY29tcG91bmROb2RlLnNldENlbnRlcih0aWxlZFplcm9EZWdyZWVQYWNrW2lkXS5jZW50ZXJYLCB0aWxlZFplcm9EZWdyZWVQYWNrW2lkXS5jZW50ZXJZKTtcblxuICAgIC8vIGNvbXBvdW5kIGxlZnQgYW5kIHRvcCBtYXJnaW5ncyBmb3IgbGFiZWxzXG4gICAgLy8gd2hlbiBub2RlIGxhYmVscyBhcmUgaW5jbHVkZWQsIHRoZXNlIHZhbHVlcyBtYXkgYmUgc2V0IHRvIGRpZmZlcmVudCB2YWx1ZXMgYmVsb3cgYW5kIGFyZSB1c2VkIGluIHRpbGluZ1Bvc3RMYXlvdXQsXG4gICAgLy8gb3RoZXJ3aXNlIHRoZXkgc3RheSBhcyB6ZXJvXG4gICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdCA9IDA7XG4gICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wID0gMDtcblxuICAgIC8vIFVwZGF0ZSBjb21wb3VuZCBib3VuZHMgY29uc2lkZXJpbmcgaXRzIGxhYmVsIHByb3BlcnRpZXMgYW5kIHNldCBsYWJlbCBtYXJnaW5zIGZvciBsZWZ0IGFuZCB0b3BcbiAgICBpZiAoQ29TRUNvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMpIHtcblxuICAgICAgdmFyIHdpZHRoID0gY29tcG91bmROb2RlLnJlY3Qud2lkdGg7XG4gICAgICB2YXIgaGVpZ2h0ID0gY29tcG91bmROb2RlLnJlY3QuaGVpZ2h0O1xuXG4gICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsV2lkdGgpIHtcbiAgICAgICAgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC54IC09IGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRXaWR0aCh3aWR0aCArIGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0ID0gY29tcG91bmROb2RlLmxhYmVsV2lkdGg7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcImNlbnRlclwiICYmIGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoID4gd2lkdGgpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC54IC09IChjb21wb3VuZE5vZGUubGFiZWxXaWR0aCAtIHdpZHRoKSAvIDI7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldFdpZHRoKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0ID0gKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwicmlnaHRcIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRXaWR0aCh3aWR0aCArIGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KSB7XG4gICAgICAgIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9PSBcInRvcFwiKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnJlY3QueSAtPSBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQ7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldEhlaWdodChoZWlnaHQgKyBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQpO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcCA9IGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodDtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9PSBcImNlbnRlclwiICYmIGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCA+IGhlaWdodCkge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5yZWN0LnkgLT0gKGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCAtIGhlaWdodCkgLyAyO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRIZWlnaHQoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5Ub3AgPSAoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0IC0gaGVpZ2h0KSAvIDI7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJib3R0b21cIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRIZWlnaHQoaGVpZ2h0ICsgY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5yZXBvcHVsYXRlQ29tcG91bmRzID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBpID0gdGhpcy5jb21wb3VuZE9yZGVyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGxDb21wb3VuZE5vZGUgPSB0aGlzLmNvbXBvdW5kT3JkZXJbaV07XG4gICAgdmFyIGlkID0gbENvbXBvdW5kTm9kZS5pZDtcbiAgICB2YXIgaG9yaXpvbnRhbE1hcmdpbiA9IGxDb21wb3VuZE5vZGUucGFkZGluZ0xlZnQ7XG4gICAgdmFyIHZlcnRpY2FsTWFyZ2luID0gbENvbXBvdW5kTm9kZS5wYWRkaW5nVG9wO1xuICAgIHZhciBsYWJlbE1hcmdpbkxlZnQgPSBsQ29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdDtcbiAgICB2YXIgbGFiZWxNYXJnaW5Ub3AgPSBsQ29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wO1xuXG4gICAgdGhpcy5hZGp1c3RMb2NhdGlvbnModGhpcy50aWxlZE1lbWJlclBhY2tbaWRdLCBsQ29tcG91bmROb2RlLnJlY3QueCwgbENvbXBvdW5kTm9kZS5yZWN0LnksIGhvcml6b250YWxNYXJnaW4sIHZlcnRpY2FsTWFyZ2luLCBsYWJlbE1hcmdpbkxlZnQsIGxhYmVsTWFyZ2luVG9wKTtcbiAgfVxufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUucmVwb3B1bGF0ZVplcm9EZWdyZWVNZW1iZXJzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0aWxlZFBhY2sgPSB0aGlzLnRpbGVkWmVyb0RlZ3JlZVBhY2s7XG5cbiAgT2JqZWN0LmtleXModGlsZWRQYWNrKS5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBjb21wb3VuZE5vZGUgPSBzZWxmLmlkVG9EdW1teU5vZGVbaWRdOyAvLyBHZXQgdGhlIGR1bW15IGNvbXBvdW5kIGJ5IGl0cyBpZFxuICAgIHZhciBob3Jpem9udGFsTWFyZ2luID0gY29tcG91bmROb2RlLnBhZGRpbmdMZWZ0O1xuICAgIHZhciB2ZXJ0aWNhbE1hcmdpbiA9IGNvbXBvdW5kTm9kZS5wYWRkaW5nVG9wO1xuICAgIHZhciBsYWJlbE1hcmdpbkxlZnQgPSBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0O1xuICAgIHZhciBsYWJlbE1hcmdpblRvcCA9IGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcDtcblxuICAgIC8vIEFkanVzdCB0aGUgcG9zaXRpb25zIG9mIG5vZGVzIHdydCBpdHMgY29tcG91bmRcbiAgICBzZWxmLmFkanVzdExvY2F0aW9ucyh0aWxlZFBhY2tbaWRdLCBjb21wb3VuZE5vZGUucmVjdC54LCBjb21wb3VuZE5vZGUucmVjdC55LCBob3Jpem9udGFsTWFyZ2luLCB2ZXJ0aWNhbE1hcmdpbiwgbGFiZWxNYXJnaW5MZWZ0LCBsYWJlbE1hcmdpblRvcCk7XG4gIH0pO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuZ2V0VG9CZVRpbGVkID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIGlkID0gbm9kZS5pZDtcbiAgLy9maXJzdGx5IGNoZWNrIHRoZSBwcmV2aW91cyByZXN1bHRzXG4gIGlmICh0aGlzLnRvQmVUaWxlZFtpZF0gIT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLnRvQmVUaWxlZFtpZF07XG4gIH1cblxuICAvL29ubHkgY29tcG91bmQgbm9kZXMgYXJlIHRvIGJlIHRpbGVkXG4gIHZhciBjaGlsZEdyYXBoID0gbm9kZS5nZXRDaGlsZCgpO1xuICBpZiAoY2hpbGRHcmFwaCA9PSBudWxsKSB7XG4gICAgdGhpcy50b0JlVGlsZWRbaWRdID0gZmFsc2U7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGNoaWxkcmVuID0gY2hpbGRHcmFwaC5nZXROb2RlcygpOyAvLyBHZXQgdGhlIGNoaWxkcmVuIG5vZGVzXG5cbiAgLy9hIGNvbXBvdW5kIG5vZGUgaXMgbm90IHRvIGJlIHRpbGVkIGlmIGFsbCBvZiBpdHMgY29tcG91bmQgY2hpbGRyZW4gYXJlIG5vdCB0byBiZSB0aWxlZFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHRoZUNoaWxkID0gY2hpbGRyZW5baV07XG5cbiAgICBpZiAodGhpcy5nZXROb2RlRGVncmVlKHRoZUNoaWxkKSA+IDApIHtcbiAgICAgIHRoaXMudG9CZVRpbGVkW2lkXSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vcGFzcyB0aGUgY2hpbGRyZW4gbm90IGhhdmluZyB0aGUgY29tcG91bmQgc3RydWN0dXJlXG4gICAgaWYgKHRoZUNoaWxkLmdldENoaWxkKCkgPT0gbnVsbCkge1xuICAgICAgdGhpcy50b0JlVGlsZWRbdGhlQ2hpbGQuaWRdID0gZmFsc2U7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZ2V0VG9CZVRpbGVkKHRoZUNoaWxkKSkge1xuICAgICAgdGhpcy50b0JlVGlsZWRbaWRdID0gZmFsc2U7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHRoaXMudG9CZVRpbGVkW2lkXSA9IHRydWU7XG4gIHJldHVybiB0cnVlO1xufTtcblxuLy8gR2V0IGRlZ3JlZSBvZiBhIG5vZGUgZGVwZW5kaW5nIG9mIGl0cyBlZGdlcyBhbmQgaW5kZXBlbmRlbnQgb2YgaXRzIGNoaWxkcmVuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5nZXROb2RlRGVncmVlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIGlkID0gbm9kZS5pZDtcbiAgdmFyIGVkZ2VzID0gbm9kZS5nZXRFZGdlcygpO1xuICB2YXIgZGVncmVlID0gMDtcblxuICAvLyBGb3IgdGhlIGVkZ2VzIGNvbm5lY3RlZFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcbiAgICBpZiAoZWRnZS5nZXRTb3VyY2UoKS5pZCAhPT0gZWRnZS5nZXRUYXJnZXQoKS5pZCkge1xuICAgICAgZGVncmVlID0gZGVncmVlICsgMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlZ3JlZTtcbn07XG5cbi8vIEdldCBkZWdyZWUgb2YgYSBub2RlIHdpdGggaXRzIGNoaWxkcmVuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5nZXROb2RlRGVncmVlV2l0aENoaWxkcmVuID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIGRlZ3JlZSA9IHRoaXMuZ2V0Tm9kZURlZ3JlZShub2RlKTtcbiAgaWYgKG5vZGUuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGRlZ3JlZTtcbiAgfVxuICB2YXIgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkKCkuZ2V0Tm9kZXMoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIGRlZ3JlZSArPSB0aGlzLmdldE5vZGVEZWdyZWVXaXRoQ2hpbGRyZW4oY2hpbGQpO1xuICB9XG4gIHJldHVybiBkZWdyZWU7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5wZXJmb3JtREZTT25Db21wb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuY29tcG91bmRPcmRlciA9IFtdO1xuICB0aGlzLmZpbGxDb21wZXhPcmRlckJ5REZTKHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS5nZXROb2RlcygpKTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmZpbGxDb21wZXhPcmRlckJ5REZTID0gZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBpZiAoY2hpbGQuZ2V0Q2hpbGQoKSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmZpbGxDb21wZXhPcmRlckJ5REZTKGNoaWxkLmdldENoaWxkKCkuZ2V0Tm9kZXMoKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdldFRvQmVUaWxlZChjaGlsZCkpIHtcbiAgICAgIHRoaXMuY29tcG91bmRPcmRlci5wdXNoKGNoaWxkKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuKiBUaGlzIG1ldGhvZCBwbGFjZXMgZWFjaCB6ZXJvIGRlZ3JlZSBtZW1iZXIgd3J0IGdpdmVuICh4LHkpIGNvb3JkaW5hdGVzICh0b3AgbGVmdCkuXG4qL1xuQ29TRUxheW91dC5wcm90b3R5cGUuYWRqdXN0TG9jYXRpb25zID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbiwgeCwgeSwgY29tcG91bmRIb3Jpem9udGFsTWFyZ2luLCBjb21wb3VuZFZlcnRpY2FsTWFyZ2luLCBjb21wb3VuZExhYmVsTWFyZ2luTGVmdCwgY29tcG91bmRMYWJlbE1hcmdpblRvcCkge1xuICB4ICs9IGNvbXBvdW5kSG9yaXpvbnRhbE1hcmdpbiArIGNvbXBvdW5kTGFiZWxNYXJnaW5MZWZ0O1xuICB5ICs9IGNvbXBvdW5kVmVydGljYWxNYXJnaW4gKyBjb21wb3VuZExhYmVsTWFyZ2luVG9wO1xuXG4gIHZhciBsZWZ0ID0geDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJvdyA9IG9yZ2FuaXphdGlvbi5yb3dzW2ldO1xuICAgIHggPSBsZWZ0O1xuICAgIHZhciBtYXhIZWlnaHQgPSAwO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCByb3cubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBsbm9kZSA9IHJvd1tqXTtcblxuICAgICAgbG5vZGUucmVjdC54ID0geDsgLy8gKyBsbm9kZS5yZWN0LndpZHRoIC8gMjtcbiAgICAgIGxub2RlLnJlY3QueSA9IHk7IC8vICsgbG5vZGUucmVjdC5oZWlnaHQgLyAyO1xuXG4gICAgICB4ICs9IGxub2RlLnJlY3Qud2lkdGggKyBvcmdhbml6YXRpb24uaG9yaXpvbnRhbFBhZGRpbmc7XG5cbiAgICAgIGlmIChsbm9kZS5yZWN0LmhlaWdodCA+IG1heEhlaWdodCkgbWF4SGVpZ2h0ID0gbG5vZGUucmVjdC5oZWlnaHQ7XG4gICAgfVxuXG4gICAgeSArPSBtYXhIZWlnaHQgKyBvcmdhbml6YXRpb24udmVydGljYWxQYWRkaW5nO1xuICB9XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS50aWxlQ29tcG91bmRNZW1iZXJzID0gZnVuY3Rpb24gKGNoaWxkR3JhcGhNYXAsIGlkVG9Ob2RlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy50aWxlZE1lbWJlclBhY2sgPSBbXTtcblxuICBPYmplY3Qua2V5cyhjaGlsZEdyYXBoTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgIC8vIEdldCB0aGUgY29tcG91bmQgbm9kZVxuICAgIHZhciBjb21wb3VuZE5vZGUgPSBpZFRvTm9kZVtpZF07XG5cbiAgICBzZWxmLnRpbGVkTWVtYmVyUGFja1tpZF0gPSBzZWxmLnRpbGVOb2RlcyhjaGlsZEdyYXBoTWFwW2lkXSwgY29tcG91bmROb2RlLnBhZGRpbmdMZWZ0ICsgY29tcG91bmROb2RlLnBhZGRpbmdSaWdodCk7XG5cbiAgICBjb21wb3VuZE5vZGUucmVjdC53aWR0aCA9IHNlbGYudGlsZWRNZW1iZXJQYWNrW2lkXS53aWR0aDtcbiAgICBjb21wb3VuZE5vZGUucmVjdC5oZWlnaHQgPSBzZWxmLnRpbGVkTWVtYmVyUGFja1tpZF0uaGVpZ2h0O1xuICAgIGNvbXBvdW5kTm9kZS5zZXRDZW50ZXIoc2VsZi50aWxlZE1lbWJlclBhY2tbaWRdLmNlbnRlclgsIHNlbGYudGlsZWRNZW1iZXJQYWNrW2lkXS5jZW50ZXJZKTtcblxuICAgIC8vIGNvbXBvdW5kIGxlZnQgYW5kIHRvcCBtYXJnaW5ncyBmb3IgbGFiZWxzXG4gICAgLy8gd2hlbiBub2RlIGxhYmVscyBhcmUgaW5jbHVkZWQsIHRoZXNlIHZhbHVlcyBtYXkgYmUgc2V0IHRvIGRpZmZlcmVudCB2YWx1ZXMgYmVsb3cgYW5kIGFyZSB1c2VkIGluIHRpbGluZ1Bvc3RMYXlvdXQsXG4gICAgLy8gb3RoZXJ3aXNlIHRoZXkgc3RheSBhcyB6ZXJvXG4gICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdCA9IDA7XG4gICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wID0gMDtcblxuICAgIC8vIFVwZGF0ZSBjb21wb3VuZCBib3VuZHMgY29uc2lkZXJpbmcgaXRzIGxhYmVsIHByb3BlcnRpZXMgYW5kIHNldCBsYWJlbCBtYXJnaW5zIGZvciBsZWZ0IGFuZCB0b3BcbiAgICBpZiAoQ29TRUNvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMpIHtcblxuICAgICAgdmFyIHdpZHRoID0gY29tcG91bmROb2RlLnJlY3Qud2lkdGg7XG4gICAgICB2YXIgaGVpZ2h0ID0gY29tcG91bmROb2RlLnJlY3QuaGVpZ2h0O1xuXG4gICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsV2lkdGgpIHtcbiAgICAgICAgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC54IC09IGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRXaWR0aCh3aWR0aCArIGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0ID0gY29tcG91bmROb2RlLmxhYmVsV2lkdGg7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcImNlbnRlclwiICYmIGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoID4gd2lkdGgpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC54IC09IChjb21wb3VuZE5vZGUubGFiZWxXaWR0aCAtIHdpZHRoKSAvIDI7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldFdpZHRoKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5MZWZ0ID0gKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwicmlnaHRcIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRXaWR0aCh3aWR0aCArIGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KSB7XG4gICAgICAgIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9PSBcInRvcFwiKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnJlY3QueSAtPSBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQ7XG4gICAgICAgICAgY29tcG91bmROb2RlLnNldEhlaWdodChoZWlnaHQgKyBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQpO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcCA9IGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodDtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9PSBcImNlbnRlclwiICYmIGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCA+IGhlaWdodCkge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5yZWN0LnkgLT0gKGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCAtIGhlaWdodCkgLyAyO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRIZWlnaHQoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5Ub3AgPSAoY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0IC0gaGVpZ2h0KSAvIDI7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJib3R0b21cIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRIZWlnaHQoaGVpZ2h0ICsgY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS50aWxlTm9kZXMgPSBmdW5jdGlvbiAobm9kZXMsIG1pbldpZHRoKSB7XG4gIHZhciBob3Jpem9udGFsT3JnID0gdGhpcy50aWxlTm9kZXNCeUZhdm9yaW5nRGltKG5vZGVzLCBtaW5XaWR0aCwgdHJ1ZSk7XG4gIHZhciB2ZXJ0aWNhbE9yZyA9IHRoaXMudGlsZU5vZGVzQnlGYXZvcmluZ0RpbShub2RlcywgbWluV2lkdGgsIGZhbHNlKTtcblxuICB2YXIgaG9yaXpvbnRhbFJhdGlvID0gdGhpcy5nZXRPcmdSYXRpbyhob3Jpem9udGFsT3JnKTtcbiAgdmFyIHZlcnRpY2FsUmF0aW8gPSB0aGlzLmdldE9yZ1JhdGlvKHZlcnRpY2FsT3JnKTtcbiAgdmFyIGJlc3RPcmc7XG5cbiAgLy8gdGhlIGJlc3QgcmF0aW8gaXMgdGhlIG9uZSB0aGF0IGlzIGNsb3NlciB0byAxIHNpbmNlIHRoZSByYXRpb3MgYXJlIGFscmVhZHkgbm9ybWFsaXplZFxuICAvLyBhbmQgdGhlIGJlc3Qgb3JnYW5pemF0aW9uIGlzIHRoZSBvbmUgdGhhdCBoYXMgdGhlIGJlc3QgcmF0aW9cbiAgaWYgKHZlcnRpY2FsUmF0aW8gPCBob3Jpem9udGFsUmF0aW8pIHtcbiAgICBiZXN0T3JnID0gdmVydGljYWxPcmc7XG4gIH0gZWxzZSB7XG4gICAgYmVzdE9yZyA9IGhvcml6b250YWxPcmc7XG4gIH1cblxuICByZXR1cm4gYmVzdE9yZztcbn07XG5cbi8vIGdldCB0aGUgd2lkdGgvaGVpZ2h0IHJhdGlvIG9mIHRoZSBvcmdhbml6YXRpb24gdGhhdCBpcyBub3JtYWxpemVkIHNvIHRoYXQgaXQgd2lsbCBub3QgYmUgbGVzcyB0aGFuIDFcbkNvU0VMYXlvdXQucHJvdG90eXBlLmdldE9yZ1JhdGlvID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbikge1xuICAvLyBnZXQgZGltZW5zaW9ucyBhbmQgY2FsY3VsYXRlIHRoZSBpbml0aWFsIHJhdGlvXG4gIHZhciB3aWR0aCA9IG9yZ2FuaXphdGlvbi53aWR0aDtcbiAgdmFyIGhlaWdodCA9IG9yZ2FuaXphdGlvbi5oZWlnaHQ7XG4gIHZhciByYXRpbyA9IHdpZHRoIC8gaGVpZ2h0O1xuXG4gIC8vIGlmIHRoZSBpbml0aWFsIHJhdGlvIGlzIGxlc3MgdGhlbiAxIHRoZW4gaW52ZXJzZSBpdFxuICBpZiAocmF0aW8gPCAxKSB7XG4gICAgcmF0aW8gPSAxIC8gcmF0aW87XG4gIH1cblxuICAvLyByZXR1cm4gdGhlIG5vcm1hbGl6ZWQgcmF0aW9cbiAgcmV0dXJuIHJhdGlvO1xufTtcblxuLypcbiAqIENhbGN1bGF0ZXMgdGhlIGlkZWFsIHdpZHRoIGZvciB0aGUgcm93cy4gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0XG4gKiBlYWNoIG5vZGUgaGFzIHRoZSBzYW1lIHNpemVzIGFuZCBjYWxjdWxhdGVzIHRoZSBpZGVhbCByb3cgd2lkdGggdGhhdFxuICogYXBwcm94aW1hdGVzIGEgc3F1YXJlIHNoYXBlZCBjb21wbGV4IGFjY29yZGluZ2x5LiBIb3dldmVyLCBzaW5jZSBub2RlcyB3b3VsZFxuICogaGF2ZSBkaWZmZXJlbnQgc2l6ZXMgc29tZSByb3dzIHdvdWxkIGhhdmUgZGlmZmVyZW50IHNpemVzIGFuZCB0aGUgcmVzdWx0aW5nXG4gKiBzaGFwZSB3b3VsZCBub3QgYmUgYW4gZXhhY3Qgc3F1YXJlLlxuICovXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5jYWxjSWRlYWxSb3dXaWR0aCA9IGZ1bmN0aW9uIChtZW1iZXJzLCBmYXZvckhvcml6b250YWxEaW0pIHtcbiAgLy8gVG8gYXBwcm94aW1hdGUgYSBzcXVhcmUgc2hhcGVkIGNvbXBsZXggd2UgbmVlZCB0byBtYWtlIGNvbXBsZXggd2lkdGggZXF1YWwgdG8gY29tcGxleCBoZWlnaHQuXG4gIC8vIFRvIGFjaGlldmUgdGhpcyB3ZSBuZWVkIHRvIHNvbHZlIHRoZSBmb2xsb3dpbmcgZXF1YXRpb24gc3lzdGVtIGZvciBoYzpcbiAgLy8gKHggKyBieCkgKiBoYyAtIGJ4ID0gKHkgKyBieSkgKiB2YyAtIGJ5LCBoYyAqIHZjID0gblxuICAvLyB3aGVyZSB4IGlzIHRoZSBhdmFyYWdlIHdpZHRoIG9mIHRoZSBub2RlcywgeSBpcyB0aGUgYXZhcmFnZSBoZWlnaHQgb2Ygbm9kZXNcbiAgLy8gYnggYW5kIGJ5IGFyZSB0aGUgYnVmZmVyIHNpemVzIGluIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRpbWVuc2lvbnMgYWNjb3JkaW5nbHksXG4gIC8vIGhjIGFuZCB2YyBhcmUgdGhlIG51bWJlciBvZiByb3dzIGluIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRpbWVuc2lvbnNcbiAgLy8gbiBpcyBudW1iZXIgb2YgbWVtYmVycy5cblxuICB2YXIgdmVydGljYWxQYWRkaW5nID0gQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19WRVJUSUNBTDtcbiAgdmFyIGhvcml6b250YWxQYWRkaW5nID0gQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19IT1JJWk9OVEFMO1xuXG4gIC8vIG51bWJlciBvZiBtZW1iZXJzXG4gIHZhciBtZW1iZXJzU2l6ZSA9IG1lbWJlcnMubGVuZ3RoO1xuXG4gIC8vIHN1bSBvZiB0aGUgd2lkdGggb2YgYWxsIG1lbWJlcnNcbiAgdmFyIHRvdGFsV2lkdGggPSAwO1xuXG4gIC8vIHN1bSBvZiB0aGUgaGVpZ2h0IG9mIGFsbCBtZW1iZXJzXG4gIHZhciB0b3RhbEhlaWdodCA9IDA7XG5cbiAgdmFyIG1heFdpZHRoID0gMDtcblxuICAvLyB0cmF2ZXJzZSBhbGwgbWVtYmVycyB0byBjYWxjdWxhdGUgdG90YWwgd2lkdGggYW5kIHRvdGFsIGhlaWdodCBhbmQgZ2V0IHRoZSBtYXhpbXVtIG1lbWJlcnMgd2lkdGhcbiAgbWVtYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgdG90YWxXaWR0aCArPSBub2RlLmdldFdpZHRoKCk7XG4gICAgdG90YWxIZWlnaHQgKz0gbm9kZS5nZXRIZWlnaHQoKTtcblxuICAgIGlmIChub2RlLmdldFdpZHRoKCkgPiBtYXhXaWR0aCkge1xuICAgICAgbWF4V2lkdGggPSBub2RlLmdldFdpZHRoKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBhdmVyYWdlIHdpZHRoIG9mIHRoZSBtZW1iZXJzXG4gIHZhciBhdmVyYWdlV2lkdGggPSB0b3RhbFdpZHRoIC8gbWVtYmVyc1NpemU7XG5cbiAgLy8gYXZlcmFnZSBoZWlnaHQgb2YgdGhlIG1lbWJlcnNcbiAgdmFyIGF2ZXJhZ2VIZWlnaHQgPSB0b3RhbEhlaWdodCAvIG1lbWJlcnNTaXplO1xuXG4gIC8vIHNvbHZpbmcgdGhlIGluaXRpYWwgZXF1YXRpb24gc3lzdGVtIGZvciB0aGUgaGMgeWllbGRzIHRoZSBmb2xsb3dpbmcgc2Vjb25kIGRlZ3JlZSBlcXVhdGlvbjpcbiAgLy8gaGNeMiAqICh4K2J4KSArIGhjICogKGJ5IC0gYngpIC0gbiAqICh5ICsgYnkpID0gMFxuXG4gIC8vIHRoZSBkZWx0YSB2YWx1ZSB0byBzb2x2ZSB0aGUgZXF1YXRpb24gYWJvdmUgZm9yIGhjXG4gIHZhciBkZWx0YSA9IE1hdGgucG93KHZlcnRpY2FsUGFkZGluZyAtIGhvcml6b250YWxQYWRkaW5nLCAyKSArIDQgKiAoYXZlcmFnZVdpZHRoICsgaG9yaXpvbnRhbFBhZGRpbmcpICogKGF2ZXJhZ2VIZWlnaHQgKyB2ZXJ0aWNhbFBhZGRpbmcpICogbWVtYmVyc1NpemU7XG5cbiAgLy8gc29sdmUgdGhlIGVxdWF0aW9uIHVzaW5nIGRlbHRhIHZhbHVlIHRvIGNhbGN1bGF0ZSB0aGUgaG9yaXpvbnRhbCBjb3VudFxuICAvLyB0aGF0IHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBub2RlcyBpbiBhbiBpZGVhbCByb3dcbiAgdmFyIGhvcml6b250YWxDb3VudERvdWJsZSA9IChob3Jpem9udGFsUGFkZGluZyAtIHZlcnRpY2FsUGFkZGluZyArIE1hdGguc3FydChkZWx0YSkpIC8gKDIgKiAoYXZlcmFnZVdpZHRoICsgaG9yaXpvbnRhbFBhZGRpbmcpKTtcbiAgLy8gcm91bmQgdGhlIGNhbGN1bGF0ZWQgaG9yaXpvbnRhbCBjb3VudCB1cCBvciBkb3duIGFjY29yZGluZyB0byB0aGUgZmF2b3JlZCBkaW1lbnNpb25cbiAgdmFyIGhvcml6b250YWxDb3VudDtcblxuICBpZiAoZmF2b3JIb3Jpem9udGFsRGltKSB7XG4gICAgaG9yaXpvbnRhbENvdW50ID0gTWF0aC5jZWlsKGhvcml6b250YWxDb3VudERvdWJsZSk7XG4gICAgLy8gaWYgaG9yaXpvbnRhbENvdW50IGNvdW50IGlzIG5vdCBhIGZsb2F0IHZhbHVlIHRoZW4gYm90aCBvZiByb3VuZGluZyB0byBmbG9vciBhbmQgY2VpbFxuICAgIC8vIHdpbGwgeWllbGQgdGhlIHNhbWUgdmFsdWVzLiBJbnN0ZWFkIG9mIHJlcGVhdGluZyB0aGUgc2FtZSBjYWxjdWxhdGlvbiB0cnkgZ29pbmcgdXBcbiAgICAvLyB3aGlsZSBmYXZvcmluZyBob3Jpem9udGFsIGRpbWVuc2lvbiBpbiBzdWNoIGNhc2VzXG4gICAgaWYgKGhvcml6b250YWxDb3VudCA9PSBob3Jpem9udGFsQ291bnREb3VibGUpIHtcbiAgICAgIGhvcml6b250YWxDb3VudCsrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBob3Jpem9udGFsQ291bnQgPSBNYXRoLmZsb29yKGhvcml6b250YWxDb3VudERvdWJsZSk7XG4gIH1cblxuICAvLyBpZGVhbCB3aWR0aCB0byBiZSBjYWxjdWxhdGVkXG4gIHZhciBpZGVhbFdpZHRoID0gaG9yaXpvbnRhbENvdW50ICogKGF2ZXJhZ2VXaWR0aCArIGhvcml6b250YWxQYWRkaW5nKSAtIGhvcml6b250YWxQYWRkaW5nO1xuXG4gIC8vIGlmIG1heCB3aWR0aCBpcyBiaWdnZXIgdGhhbiBjYWxjdWxhdGVkIGlkZWFsIHdpZHRoIHJlc2V0IGlkZWFsIHdpZHRoIHRvIGl0XG4gIGlmIChtYXhXaWR0aCA+IGlkZWFsV2lkdGgpIHtcbiAgICBpZGVhbFdpZHRoID0gbWF4V2lkdGg7XG4gIH1cblxuICAvLyBhZGQgdGhlIGxlZnQtcmlnaHQgbWFyZ2lucyB0byB0aGUgaWRlYWwgcm93IHdpZHRoXG4gIGlkZWFsV2lkdGggKz0gaG9yaXpvbnRhbFBhZGRpbmcgKiAyO1xuXG4gIC8vIHJldHVybiB0aGUgaWRlYWwgcm93IHdpZHRoMVxuICByZXR1cm4gaWRlYWxXaWR0aDtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnRpbGVOb2Rlc0J5RmF2b3JpbmdEaW0gPSBmdW5jdGlvbiAobm9kZXMsIG1pbldpZHRoLCBmYXZvckhvcml6b250YWxEaW0pIHtcbiAgdmFyIHZlcnRpY2FsUGFkZGluZyA9IENvU0VDb25zdGFudHMuVElMSU5HX1BBRERJTkdfVkVSVElDQUw7XG4gIHZhciBob3Jpem9udGFsUGFkZGluZyA9IENvU0VDb25zdGFudHMuVElMSU5HX1BBRERJTkdfSE9SSVpPTlRBTDtcbiAgdmFyIHRpbGluZ0NvbXBhcmVCeSA9IENvU0VDb25zdGFudHMuVElMSU5HX0NPTVBBUkVfQlk7XG4gIHZhciBvcmdhbml6YXRpb24gPSB7XG4gICAgcm93czogW10sXG4gICAgcm93V2lkdGg6IFtdLFxuICAgIHJvd0hlaWdodDogW10sXG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiBtaW5XaWR0aCwgLy8gYXNzdW1lIG1pbkhlaWdodCBlcXVhbHMgdG8gbWluV2lkdGhcbiAgICB2ZXJ0aWNhbFBhZGRpbmc6IHZlcnRpY2FsUGFkZGluZyxcbiAgICBob3Jpem9udGFsUGFkZGluZzogaG9yaXpvbnRhbFBhZGRpbmcsXG4gICAgY2VudGVyWDogMCxcbiAgICBjZW50ZXJZOiAwXG4gIH07XG5cbiAgaWYgKHRpbGluZ0NvbXBhcmVCeSkge1xuICAgIG9yZ2FuaXphdGlvbi5pZGVhbFJvd1dpZHRoID0gdGhpcy5jYWxjSWRlYWxSb3dXaWR0aChub2RlcywgZmF2b3JIb3Jpem9udGFsRGltKTtcbiAgfVxuXG4gIHZhciBnZXROb2RlQXJlYSA9IGZ1bmN0aW9uIGdldE5vZGVBcmVhKG4pIHtcbiAgICByZXR1cm4gbi5yZWN0LndpZHRoICogbi5yZWN0LmhlaWdodDtcbiAgfTtcblxuICB2YXIgYXJlYUNvbXBhcmVGY24gPSBmdW5jdGlvbiBhcmVhQ29tcGFyZUZjbihuMSwgbjIpIHtcbiAgICByZXR1cm4gZ2V0Tm9kZUFyZWEobjIpIC0gZ2V0Tm9kZUFyZWEobjEpO1xuICB9O1xuXG4gIC8vIFNvcnQgdGhlIG5vZGVzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlaXIgYXJlYXNcbiAgbm9kZXMuc29ydChmdW5jdGlvbiAobjEsIG4yKSB7XG4gICAgdmFyIGNtcEJ5ID0gYXJlYUNvbXBhcmVGY247XG4gICAgaWYgKG9yZ2FuaXphdGlvbi5pZGVhbFJvd1dpZHRoKSB7XG4gICAgICBjbXBCeSA9IHRpbGluZ0NvbXBhcmVCeTtcbiAgICAgIHJldHVybiBjbXBCeShuMS5pZCwgbjIuaWQpO1xuICAgIH1cbiAgICByZXR1cm4gY21wQnkobjEsIG4yKTtcbiAgfSk7XG5cbiAgLy8gQ3JlYXRlIHRoZSBvcmdhbml6YXRpb24gLT4gY2FsY3VsYXRlIGNvbXBvdW5kIGNlbnRlclxuICB2YXIgc3VtQ2VudGVyWCA9IDA7XG4gIHZhciBzdW1DZW50ZXJZID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBsTm9kZSA9IG5vZGVzW2ldO1xuXG4gICAgc3VtQ2VudGVyWCArPSBsTm9kZS5nZXRDZW50ZXJYKCk7XG4gICAgc3VtQ2VudGVyWSArPSBsTm9kZS5nZXRDZW50ZXJZKCk7XG4gIH1cblxuICBvcmdhbml6YXRpb24uY2VudGVyWCA9IHN1bUNlbnRlclggLyBub2Rlcy5sZW5ndGg7XG4gIG9yZ2FuaXphdGlvbi5jZW50ZXJZID0gc3VtQ2VudGVyWSAvIG5vZGVzLmxlbmd0aDtcblxuICAvLyBDcmVhdGUgdGhlIG9yZ2FuaXphdGlvbiAtPiB0aWxlIG1lbWJlcnNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBsTm9kZSA9IG5vZGVzW2ldO1xuXG4gICAgaWYgKG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmluc2VydE5vZGVUb1Jvdyhvcmdhbml6YXRpb24sIGxOb2RlLCAwLCBtaW5XaWR0aCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNhbkFkZEhvcml6b250YWwob3JnYW5pemF0aW9uLCBsTm9kZS5yZWN0LndpZHRoLCBsTm9kZS5yZWN0LmhlaWdodCkpIHtcbiAgICAgIHZhciByb3dJbmRleCA9IG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aCAtIDE7XG4gICAgICBpZiAoIW9yZ2FuaXphdGlvbi5pZGVhbFJvd1dpZHRoKSB7XG4gICAgICAgIHJvd0luZGV4ID0gdGhpcy5nZXRTaG9ydGVzdFJvd0luZGV4KG9yZ2FuaXphdGlvbik7XG4gICAgICB9XG4gICAgICB0aGlzLmluc2VydE5vZGVUb1Jvdyhvcmdhbml6YXRpb24sIGxOb2RlLCByb3dJbmRleCwgbWluV2lkdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluc2VydE5vZGVUb1Jvdyhvcmdhbml6YXRpb24sIGxOb2RlLCBvcmdhbml6YXRpb24ucm93cy5sZW5ndGgsIG1pbldpZHRoKTtcbiAgICB9XG5cbiAgICB0aGlzLnNoaWZ0VG9MYXN0Um93KG9yZ2FuaXphdGlvbik7XG4gIH1cblxuICByZXR1cm4gb3JnYW5pemF0aW9uO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUuaW5zZXJ0Tm9kZVRvUm93ID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbiwgbm9kZSwgcm93SW5kZXgsIG1pbldpZHRoKSB7XG4gIHZhciBtaW5Db21wb3VuZFNpemUgPSBtaW5XaWR0aDtcblxuICAvLyBBZGQgbmV3IHJvdyBpZiBuZWVkZWRcbiAgaWYgKHJvd0luZGV4ID09IG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aCkge1xuICAgIHZhciBzZWNvbmREaW1lbnNpb24gPSBbXTtcblxuICAgIG9yZ2FuaXphdGlvbi5yb3dzLnB1c2goc2Vjb25kRGltZW5zaW9uKTtcbiAgICBvcmdhbml6YXRpb24ucm93V2lkdGgucHVzaChtaW5Db21wb3VuZFNpemUpO1xuICAgIG9yZ2FuaXphdGlvbi5yb3dIZWlnaHQucHVzaCgwKTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSByb3cgd2lkdGhcbiAgdmFyIHcgPSBvcmdhbml6YXRpb24ucm93V2lkdGhbcm93SW5kZXhdICsgbm9kZS5yZWN0LndpZHRoO1xuXG4gIGlmIChvcmdhbml6YXRpb24ucm93c1tyb3dJbmRleF0ubGVuZ3RoID4gMCkge1xuICAgIHcgKz0gb3JnYW5pemF0aW9uLmhvcml6b250YWxQYWRkaW5nO1xuICB9XG5cbiAgb3JnYW5pemF0aW9uLnJvd1dpZHRoW3Jvd0luZGV4XSA9IHc7XG4gIC8vIFVwZGF0ZSBjb21wb3VuZCB3aWR0aFxuICBpZiAob3JnYW5pemF0aW9uLndpZHRoIDwgdykge1xuICAgIG9yZ2FuaXphdGlvbi53aWR0aCA9IHc7XG4gIH1cblxuICAvLyBVcGRhdGUgaGVpZ2h0XG4gIHZhciBoID0gbm9kZS5yZWN0LmhlaWdodDtcbiAgaWYgKHJvd0luZGV4ID4gMCkgaCArPSBvcmdhbml6YXRpb24udmVydGljYWxQYWRkaW5nO1xuXG4gIHZhciBleHRyYUhlaWdodCA9IDA7XG4gIGlmIChoID4gb3JnYW5pemF0aW9uLnJvd0hlaWdodFtyb3dJbmRleF0pIHtcbiAgICBleHRyYUhlaWdodCA9IG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbcm93SW5kZXhdO1xuICAgIG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbcm93SW5kZXhdID0gaDtcbiAgICBleHRyYUhlaWdodCA9IG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbcm93SW5kZXhdIC0gZXh0cmFIZWlnaHQ7XG4gIH1cblxuICBvcmdhbml6YXRpb24uaGVpZ2h0ICs9IGV4dHJhSGVpZ2h0O1xuXG4gIC8vIEluc2VydCBub2RlXG4gIG9yZ2FuaXphdGlvbi5yb3dzW3Jvd0luZGV4XS5wdXNoKG5vZGUpO1xufTtcblxuLy9TY2FucyB0aGUgcm93cyBvZiBhbiBvcmdhbml6YXRpb24gYW5kIHJldHVybnMgdGhlIG9uZSB3aXRoIHRoZSBtaW4gd2lkdGhcbkNvU0VMYXlvdXQucHJvdG90eXBlLmdldFNob3J0ZXN0Um93SW5kZXggPSBmdW5jdGlvbiAob3JnYW5pemF0aW9uKSB7XG4gIHZhciByID0gLTE7XG4gIHZhciBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgb3JnYW5pemF0aW9uLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAob3JnYW5pemF0aW9uLnJvd1dpZHRoW2ldIDwgbWluKSB7XG4gICAgICByID0gaTtcbiAgICAgIG1pbiA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHI7XG59O1xuXG4vL1NjYW5zIHRoZSByb3dzIG9mIGFuIG9yZ2FuaXphdGlvbiBhbmQgcmV0dXJucyB0aGUgb25lIHdpdGggdGhlIG1heCB3aWR0aFxuQ29TRUxheW91dC5wcm90b3R5cGUuZ2V0TG9uZ2VzdFJvd0luZGV4ID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbikge1xuICB2YXIgciA9IC0xO1xuICB2YXIgbWF4ID0gTnVtYmVyLk1JTl9WQUxVRTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICBpZiAob3JnYW5pemF0aW9uLnJvd1dpZHRoW2ldID4gbWF4KSB7XG4gICAgICByID0gaTtcbiAgICAgIG1heCA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtpXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcjtcbn07XG5cbi8qKlxuKiBUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciBhZGRpbmcgZXh0cmEgd2lkdGggdG8gdGhlIG9yZ2FuaXphdGlvbiB2aW9sYXRlc1xuKiB0aGUgYXNwZWN0IHJhdGlvKDEpIG9yIG5vdC5cbiovXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5jYW5BZGRIb3Jpem9udGFsID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbiwgZXh0cmFXaWR0aCwgZXh0cmFIZWlnaHQpIHtcblxuICAvLyBpZiB0aGVyZSBpcyBhbiBpZGVhbCByb3cgd2lkdGggc3BlY2lmaWVkIHVzZSBpdCBpbnN0ZWFkIG9mIGNoZWNraW5nIHRoZSBhc3BlY3QgcmF0aW9cbiAgaWYgKG9yZ2FuaXphdGlvbi5pZGVhbFJvd1dpZHRoKSB7XG4gICAgdmFyIGxhc3RSb3dJbmRleCA9IG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aCAtIDE7XG4gICAgdmFyIGxhc3RSb3dXaWR0aCA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtsYXN0Um93SW5kZXhdO1xuXG4gICAgLy8gY2hlY2sgYW5kIHJldHVybiBpZiBpZGVhbCByb3cgd2lkdGggd2lsbCBiZSBleGNlZWQgaWYgdGhlIG5vZGUgaXMgYWRkZWQgdG8gdGhlIHJvd1xuICAgIHJldHVybiBsYXN0Um93V2lkdGggKyBleHRyYVdpZHRoICsgb3JnYW5pemF0aW9uLmhvcml6b250YWxQYWRkaW5nIDw9IG9yZ2FuaXphdGlvbi5pZGVhbFJvd1dpZHRoO1xuICB9XG5cbiAgdmFyIHNyaSA9IHRoaXMuZ2V0U2hvcnRlc3RSb3dJbmRleChvcmdhbml6YXRpb24pO1xuXG4gIGlmIChzcmkgPCAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgbWluID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW3NyaV07XG5cbiAgaWYgKG1pbiArIG9yZ2FuaXphdGlvbi5ob3Jpem9udGFsUGFkZGluZyArIGV4dHJhV2lkdGggPD0gb3JnYW5pemF0aW9uLndpZHRoKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgaERpZmYgPSAwO1xuXG4gIC8vIEFkZGluZyB0byBhbiBleGlzdGluZyByb3dcbiAgaWYgKG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbc3JpXSA8IGV4dHJhSGVpZ2h0KSB7XG4gICAgaWYgKHNyaSA+IDApIGhEaWZmID0gZXh0cmFIZWlnaHQgKyBvcmdhbml6YXRpb24udmVydGljYWxQYWRkaW5nIC0gb3JnYW5pemF0aW9uLnJvd0hlaWdodFtzcmldO1xuICB9XG5cbiAgdmFyIGFkZF90b19yb3dfcmF0aW87XG4gIGlmIChvcmdhbml6YXRpb24ud2lkdGggLSBtaW4gPj0gZXh0cmFXaWR0aCArIG9yZ2FuaXphdGlvbi5ob3Jpem9udGFsUGFkZGluZykge1xuICAgIGFkZF90b19yb3dfcmF0aW8gPSAob3JnYW5pemF0aW9uLmhlaWdodCArIGhEaWZmKSAvIChtaW4gKyBleHRyYVdpZHRoICsgb3JnYW5pemF0aW9uLmhvcml6b250YWxQYWRkaW5nKTtcbiAgfSBlbHNlIHtcbiAgICBhZGRfdG9fcm93X3JhdGlvID0gKG9yZ2FuaXphdGlvbi5oZWlnaHQgKyBoRGlmZikgLyBvcmdhbml6YXRpb24ud2lkdGg7XG4gIH1cblxuICAvLyBBZGRpbmcgYSBuZXcgcm93IGZvciB0aGlzIG5vZGVcbiAgaERpZmYgPSBleHRyYUhlaWdodCArIG9yZ2FuaXphdGlvbi52ZXJ0aWNhbFBhZGRpbmc7XG4gIHZhciBhZGRfbmV3X3Jvd19yYXRpbztcbiAgaWYgKG9yZ2FuaXphdGlvbi53aWR0aCA8IGV4dHJhV2lkdGgpIHtcbiAgICBhZGRfbmV3X3Jvd19yYXRpbyA9IChvcmdhbml6YXRpb24uaGVpZ2h0ICsgaERpZmYpIC8gZXh0cmFXaWR0aDtcbiAgfSBlbHNlIHtcbiAgICBhZGRfbmV3X3Jvd19yYXRpbyA9IChvcmdhbml6YXRpb24uaGVpZ2h0ICsgaERpZmYpIC8gb3JnYW5pemF0aW9uLndpZHRoO1xuICB9XG5cbiAgaWYgKGFkZF9uZXdfcm93X3JhdGlvIDwgMSkgYWRkX25ld19yb3dfcmF0aW8gPSAxIC8gYWRkX25ld19yb3dfcmF0aW87XG5cbiAgaWYgKGFkZF90b19yb3dfcmF0aW8gPCAxKSBhZGRfdG9fcm93X3JhdGlvID0gMSAvIGFkZF90b19yb3dfcmF0aW87XG5cbiAgcmV0dXJuIGFkZF90b19yb3dfcmF0aW8gPCBhZGRfbmV3X3Jvd19yYXRpbztcbn07XG5cbi8vSWYgbW92aW5nIHRoZSBsYXN0IG5vZGUgZnJvbSB0aGUgbG9uZ2VzdCByb3cgYW5kIGFkZGluZyBpdCB0byB0aGUgbGFzdFxuLy9yb3cgbWFrZXMgdGhlIGJvdW5kaW5nIGJveCBzbWFsbGVyLCBkbyBpdC5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnNoaWZ0VG9MYXN0Um93ID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbikge1xuICB2YXIgbG9uZ2VzdCA9IHRoaXMuZ2V0TG9uZ2VzdFJvd0luZGV4KG9yZ2FuaXphdGlvbik7XG4gIHZhciBsYXN0ID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoLmxlbmd0aCAtIDE7XG4gIHZhciByb3cgPSBvcmdhbml6YXRpb24ucm93c1tsb25nZXN0XTtcbiAgdmFyIG5vZGUgPSByb3dbcm93Lmxlbmd0aCAtIDFdO1xuXG4gIHZhciBkaWZmID0gbm9kZS53aWR0aCArIG9yZ2FuaXphdGlvbi5ob3Jpem9udGFsUGFkZGluZztcblxuICAvLyBDaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2Ugb24gdGhlIGxhc3Qgcm93XG4gIGlmIChvcmdhbml6YXRpb24ud2lkdGggLSBvcmdhbml6YXRpb24ucm93V2lkdGhbbGFzdF0gPiBkaWZmICYmIGxvbmdlc3QgIT0gbGFzdCkge1xuICAgIC8vIFJlbW92ZSB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBsb25nZXN0IHJvd1xuICAgIHJvdy5zcGxpY2UoLTEsIDEpO1xuXG4gICAgLy8gUHVzaCBpdCB0byB0aGUgbGFzdCByb3dcbiAgICBvcmdhbml6YXRpb24ucm93c1tsYXN0XS5wdXNoKG5vZGUpO1xuXG4gICAgb3JnYW5pemF0aW9uLnJvd1dpZHRoW2xvbmdlc3RdID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW2xvbmdlc3RdIC0gZGlmZjtcbiAgICBvcmdhbml6YXRpb24ucm93V2lkdGhbbGFzdF0gPSBvcmdhbml6YXRpb24ucm93V2lkdGhbbGFzdF0gKyBkaWZmO1xuICAgIG9yZ2FuaXphdGlvbi53aWR0aCA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtpbnN0YW5jZS5nZXRMb25nZXN0Um93SW5kZXgob3JnYW5pemF0aW9uKV07XG5cbiAgICAvLyBVcGRhdGUgaGVpZ2h0cyBvZiB0aGUgb3JnYW5pemF0aW9uXG4gICAgdmFyIG1heEhlaWdodCA9IE51bWJlci5NSU5fVkFMVUU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyb3dbaV0uaGVpZ2h0ID4gbWF4SGVpZ2h0KSBtYXhIZWlnaHQgPSByb3dbaV0uaGVpZ2h0O1xuICAgIH1cbiAgICBpZiAobG9uZ2VzdCA+IDApIG1heEhlaWdodCArPSBvcmdhbml6YXRpb24udmVydGljYWxQYWRkaW5nO1xuXG4gICAgdmFyIHByZXZUb3RhbCA9IG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbbG9uZ2VzdF0gKyBvcmdhbml6YXRpb24ucm93SGVpZ2h0W2xhc3RdO1xuXG4gICAgb3JnYW5pemF0aW9uLnJvd0hlaWdodFtsb25nZXN0XSA9IG1heEhlaWdodDtcbiAgICBpZiAob3JnYW5pemF0aW9uLnJvd0hlaWdodFtsYXN0XSA8IG5vZGUuaGVpZ2h0ICsgb3JnYW5pemF0aW9uLnZlcnRpY2FsUGFkZGluZykgb3JnYW5pemF0aW9uLnJvd0hlaWdodFtsYXN0XSA9IG5vZGUuaGVpZ2h0ICsgb3JnYW5pemF0aW9uLnZlcnRpY2FsUGFkZGluZztcblxuICAgIHZhciBmaW5hbFRvdGFsID0gb3JnYW5pemF0aW9uLnJvd0hlaWdodFtsb25nZXN0XSArIG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbbGFzdF07XG4gICAgb3JnYW5pemF0aW9uLmhlaWdodCArPSBmaW5hbFRvdGFsIC0gcHJldlRvdGFsO1xuXG4gICAgdGhpcy5zaGlmdFRvTGFzdFJvdyhvcmdhbml6YXRpb24pO1xuICB9XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS50aWxpbmdQcmVMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChDb1NFQ29uc3RhbnRzLlRJTEUpIHtcbiAgICAvLyBGaW5kIHplcm8gZGVncmVlIG5vZGVzIGFuZCBjcmVhdGUgYSBjb21wb3VuZCBmb3IgZWFjaCBsZXZlbFxuICAgIHRoaXMuZ3JvdXBaZXJvRGVncmVlTWVtYmVycygpO1xuICAgIC8vIFRpbGUgYW5kIGNsZWFyIGNoaWxkcmVuIG9mIGVhY2ggY29tcG91bmRcbiAgICB0aGlzLmNsZWFyQ29tcG91bmRzKCk7XG4gICAgLy8gU2VwYXJhdGVseSB0aWxlIGFuZCBjbGVhciB6ZXJvIGRlZ3JlZSBub2RlcyBmb3IgZWFjaCBsZXZlbFxuICAgIHRoaXMuY2xlYXJaZXJvRGVncmVlTWVtYmVycygpO1xuICB9XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS50aWxpbmdQb3N0TGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAoQ29TRUNvbnN0YW50cy5USUxFKSB7XG4gICAgdGhpcy5yZXBvcHVsYXRlWmVyb0RlZ3JlZU1lbWJlcnMoKTtcbiAgICB0aGlzLnJlcG9wdWxhdGVDb21wb3VuZHMoKTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlY3Rpb246IFRyZWUgUmVkdWN0aW9uIG1ldGhvZHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZWR1Y2UgdHJlZXMgXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5yZWR1Y2VUcmVlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHBydW5lZE5vZGVzQWxsID0gW107XG4gIHZhciBjb250YWluc0xlYWYgPSB0cnVlO1xuICB2YXIgbm9kZTtcblxuICB3aGlsZSAoY29udGFpbnNMZWFmKSB7XG4gICAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXMoKTtcbiAgICB2YXIgcHJ1bmVkTm9kZXNJblN0ZXBUZW1wID0gW107XG4gICAgY29udGFpbnNMZWFmID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub2RlID0gYWxsTm9kZXNbaV07XG4gICAgICBpZiAobm9kZS5nZXRFZGdlcygpLmxlbmd0aCA9PSAxICYmICFub2RlLmdldEVkZ2VzKClbMF0uaXNJbnRlckdyYXBoICYmIG5vZGUuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChDb1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwpIHtcbiAgICAgICAgICB2YXIgb3RoZXJFbmQgPSBub2RlLmdldEVkZ2VzKClbMF0uZ2V0T3RoZXJFbmQobm9kZSk7XG4gICAgICAgICAgdmFyIHJlbGF0aXZlUG9zaXRpb24gPSBuZXcgRGltZW5zaW9uRChub2RlLmdldENlbnRlclgoKSAtIG90aGVyRW5kLmdldENlbnRlclgoKSwgbm9kZS5nZXRDZW50ZXJZKCkgLSBvdGhlckVuZC5nZXRDZW50ZXJZKCkpO1xuICAgICAgICAgIHBydW5lZE5vZGVzSW5TdGVwVGVtcC5wdXNoKFtub2RlLCBub2RlLmdldEVkZ2VzKClbMF0sIG5vZGUuZ2V0T3duZXIoKSwgcmVsYXRpdmVQb3NpdGlvbl0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBydW5lZE5vZGVzSW5TdGVwVGVtcC5wdXNoKFtub2RlLCBub2RlLmdldEVkZ2VzKClbMF0sIG5vZGUuZ2V0T3duZXIoKV0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRhaW5zTGVhZiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb250YWluc0xlYWYgPT0gdHJ1ZSkge1xuICAgICAgdmFyIHBydW5lZE5vZGVzSW5TdGVwID0gW107XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHBydW5lZE5vZGVzSW5TdGVwVGVtcC5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocHJ1bmVkTm9kZXNJblN0ZXBUZW1wW2pdWzBdLmdldEVkZ2VzKCkubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICBwcnVuZWROb2Rlc0luU3RlcC5wdXNoKHBydW5lZE5vZGVzSW5TdGVwVGVtcFtqXSk7XG4gICAgICAgICAgcHJ1bmVkTm9kZXNJblN0ZXBUZW1wW2pdWzBdLmdldE93bmVyKCkucmVtb3ZlKHBydW5lZE5vZGVzSW5TdGVwVGVtcFtqXVswXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBydW5lZE5vZGVzQWxsLnB1c2gocHJ1bmVkTm9kZXNJblN0ZXApO1xuICAgICAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxOb2RlcygpO1xuICAgICAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxFZGdlcygpO1xuICAgIH1cbiAgfVxuICB0aGlzLnBydW5lZE5vZGVzQWxsID0gcHJ1bmVkTm9kZXNBbGw7XG59O1xuXG4vLyBHcm93IHRyZWUgb25lIHN0ZXAgXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5ncm93VHJlZSA9IGZ1bmN0aW9uIChwcnVuZWROb2Rlc0FsbCkge1xuICB2YXIgbGVuZ3RoT2ZQcnVuZWROb2Rlc0luU3RlcCA9IHBydW5lZE5vZGVzQWxsLmxlbmd0aDtcbiAgdmFyIHBydW5lZE5vZGVzSW5TdGVwID0gcHJ1bmVkTm9kZXNBbGxbbGVuZ3RoT2ZQcnVuZWROb2Rlc0luU3RlcCAtIDFdO1xuXG4gIHZhciBub2RlRGF0YTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcnVuZWROb2Rlc0luU3RlcC5sZW5ndGg7IGkrKykge1xuICAgIG5vZGVEYXRhID0gcHJ1bmVkTm9kZXNJblN0ZXBbaV07XG5cbiAgICB0aGlzLmZpbmRQbGFjZWZvclBydW5lZE5vZGUobm9kZURhdGEpO1xuXG4gICAgbm9kZURhdGFbMl0uYWRkKG5vZGVEYXRhWzBdKTtcbiAgICBub2RlRGF0YVsyXS5hZGQobm9kZURhdGFbMV0sIG5vZGVEYXRhWzFdLnNvdXJjZSwgbm9kZURhdGFbMV0udGFyZ2V0KTtcbiAgfVxuXG4gIHBydW5lZE5vZGVzQWxsLnNwbGljZShwcnVuZWROb2Rlc0FsbC5sZW5ndGggLSAxLCAxKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxOb2RlcygpO1xuICB0aGlzLmdyYXBoTWFuYWdlci5yZXNldEFsbEVkZ2VzKCk7XG59O1xuXG4vLyBGaW5kIGFuIGFwcHJvcHJpYXRlIHBvc2l0aW9uIHRvIHJlcGxhY2UgcHJ1bmVkIG5vZGUsIHRoaXMgbWV0aG9kIGNhbiBiZSBpbXByb3ZlZFxuQ29TRUxheW91dC5wcm90b3R5cGUuZmluZFBsYWNlZm9yUHJ1bmVkTm9kZSA9IGZ1bmN0aW9uIChub2RlRGF0YSkge1xuXG4gIHZhciBncmlkRm9yUHJ1bmVkTm9kZTtcbiAgdmFyIG5vZGVUb0Nvbm5lY3Q7XG4gIHZhciBwcnVuZWROb2RlID0gbm9kZURhdGFbMF07XG4gIGlmIChwcnVuZWROb2RlID09IG5vZGVEYXRhWzFdLnNvdXJjZSkge1xuICAgIG5vZGVUb0Nvbm5lY3QgPSBub2RlRGF0YVsxXS50YXJnZXQ7XG4gIH0gZWxzZSB7XG4gICAgbm9kZVRvQ29ubmVjdCA9IG5vZGVEYXRhWzFdLnNvdXJjZTtcbiAgfVxuXG4gIGlmIChDb1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwpIHtcbiAgICBwcnVuZWROb2RlLnNldENlbnRlcihub2RlVG9Db25uZWN0LmdldENlbnRlclgoKSArIG5vZGVEYXRhWzNdLmdldFdpZHRoKCksIG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWSgpICsgbm9kZURhdGFbM10uZ2V0SGVpZ2h0KCkpO1xuICB9IGVsc2Uge1xuICAgIHZhciBzdGFydEdyaWRYID0gbm9kZVRvQ29ubmVjdC5zdGFydFg7XG4gICAgdmFyIGZpbmlzaEdyaWRYID0gbm9kZVRvQ29ubmVjdC5maW5pc2hYO1xuICAgIHZhciBzdGFydEdyaWRZID0gbm9kZVRvQ29ubmVjdC5zdGFydFk7XG4gICAgdmFyIGZpbmlzaEdyaWRZID0gbm9kZVRvQ29ubmVjdC5maW5pc2hZO1xuXG4gICAgdmFyIHVwTm9kZUNvdW50ID0gMDtcbiAgICB2YXIgZG93bk5vZGVDb3VudCA9IDA7XG4gICAgdmFyIHJpZ2h0Tm9kZUNvdW50ID0gMDtcbiAgICB2YXIgbGVmdE5vZGVDb3VudCA9IDA7XG4gICAgdmFyIGNvbnRyb2xSZWdpb25zID0gW3VwTm9kZUNvdW50LCByaWdodE5vZGVDb3VudCwgZG93bk5vZGVDb3VudCwgbGVmdE5vZGVDb3VudF07XG5cbiAgICBpZiAoc3RhcnRHcmlkWSA+IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSBzdGFydEdyaWRYOyBpIDw9IGZpbmlzaEdyaWRYOyBpKyspIHtcbiAgICAgICAgY29udHJvbFJlZ2lvbnNbMF0gKz0gdGhpcy5ncmlkW2ldW3N0YXJ0R3JpZFkgLSAxXS5sZW5ndGggKyB0aGlzLmdyaWRbaV1bc3RhcnRHcmlkWV0ubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpbmlzaEdyaWRYIDwgdGhpcy5ncmlkLmxlbmd0aCAtIDEpIHtcbiAgICAgIGZvciAodmFyIGkgPSBzdGFydEdyaWRZOyBpIDw9IGZpbmlzaEdyaWRZOyBpKyspIHtcbiAgICAgICAgY29udHJvbFJlZ2lvbnNbMV0gKz0gdGhpcy5ncmlkW2ZpbmlzaEdyaWRYICsgMV1baV0ubGVuZ3RoICsgdGhpcy5ncmlkW2ZpbmlzaEdyaWRYXVtpXS5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmluaXNoR3JpZFkgPCB0aGlzLmdyaWRbMF0ubGVuZ3RoIC0gMSkge1xuICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0R3JpZFg7IGkgPD0gZmluaXNoR3JpZFg7IGkrKykge1xuICAgICAgICBjb250cm9sUmVnaW9uc1syXSArPSB0aGlzLmdyaWRbaV1bZmluaXNoR3JpZFkgKyAxXS5sZW5ndGggKyB0aGlzLmdyaWRbaV1bZmluaXNoR3JpZFldLmxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdGFydEdyaWRYID4gMCkge1xuICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0R3JpZFk7IGkgPD0gZmluaXNoR3JpZFk7IGkrKykge1xuICAgICAgICBjb250cm9sUmVnaW9uc1szXSArPSB0aGlzLmdyaWRbc3RhcnRHcmlkWCAtIDFdW2ldLmxlbmd0aCArIHRoaXMuZ3JpZFtzdGFydEdyaWRYXVtpXS5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgbWluID0gSW50ZWdlci5NQVhfVkFMVUU7XG4gICAgdmFyIG1pbkNvdW50O1xuICAgIHZhciBtaW5JbmRleDtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRyb2xSZWdpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoY29udHJvbFJlZ2lvbnNbal0gPCBtaW4pIHtcbiAgICAgICAgbWluID0gY29udHJvbFJlZ2lvbnNbal07XG4gICAgICAgIG1pbkNvdW50ID0gMTtcbiAgICAgICAgbWluSW5kZXggPSBqO1xuICAgICAgfSBlbHNlIGlmIChjb250cm9sUmVnaW9uc1tqXSA9PSBtaW4pIHtcbiAgICAgICAgbWluQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWluQ291bnQgPT0gMyAmJiBtaW4gPT0gMCkge1xuICAgICAgaWYgKGNvbnRyb2xSZWdpb25zWzBdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMV0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1syXSA9PSAwKSB7XG4gICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMTtcbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbFJlZ2lvbnNbMF0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1sxXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzNdID09IDApIHtcbiAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAwO1xuICAgICAgfSBlbHNlIGlmIChjb250cm9sUmVnaW9uc1swXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzJdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbM10gPT0gMCkge1xuICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDM7XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzFdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMl0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1szXSA9PSAwKSB7XG4gICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1pbkNvdW50ID09IDIgJiYgbWluID09IDApIHtcbiAgICAgIHZhciByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyKTtcbiAgICAgIGlmIChjb250cm9sUmVnaW9uc1swXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzFdID09IDApIHtcbiAgICAgICAgO1xuICAgICAgICBpZiAocmFuZG9tID09IDApIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAxO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzBdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMl0gPT0gMCkge1xuICAgICAgICBpZiAocmFuZG9tID09IDApIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzBdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbM10gPT0gMCkge1xuICAgICAgICBpZiAocmFuZG9tID09IDApIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzFdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMl0gPT0gMCkge1xuICAgICAgICBpZiAocmFuZG9tID09IDApIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzFdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbM10gPT0gMCkge1xuICAgICAgICBpZiAocmFuZG9tID09IDApIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocmFuZG9tID09IDApIHtcbiAgICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtaW5Db3VudCA9PSA0ICYmIG1pbiA9PSAwKSB7XG4gICAgICB2YXIgcmFuZG9tID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNCk7XG4gICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IHJhbmRvbTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSBtaW5JbmRleDtcbiAgICB9XG5cbiAgICBpZiAoZ3JpZEZvclBydW5lZE5vZGUgPT0gMCkge1xuICAgICAgcHJ1bmVkTm9kZS5zZXRDZW50ZXIobm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJYKCksIG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWSgpIC0gbm9kZVRvQ29ubmVjdC5nZXRIZWlnaHQoKSAvIDIgLSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC0gcHJ1bmVkTm9kZS5nZXRIZWlnaHQoKSAvIDIpO1xuICAgIH0gZWxzZSBpZiAoZ3JpZEZvclBydW5lZE5vZGUgPT0gMSkge1xuICAgICAgcHJ1bmVkTm9kZS5zZXRDZW50ZXIobm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJYKCkgKyBub2RlVG9Db25uZWN0LmdldFdpZHRoKCkgLyAyICsgRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCArIHBydW5lZE5vZGUuZ2V0V2lkdGgoKSAvIDIsIG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWSgpKTtcbiAgICB9IGVsc2UgaWYgKGdyaWRGb3JQcnVuZWROb2RlID09IDIpIHtcbiAgICAgIHBydW5lZE5vZGUuc2V0Q2VudGVyKG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWCgpLCBub2RlVG9Db25uZWN0LmdldENlbnRlclkoKSArIG5vZGVUb0Nvbm5lY3QuZ2V0SGVpZ2h0KCkgLyAyICsgRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCArIHBydW5lZE5vZGUuZ2V0SGVpZ2h0KCkgLyAyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJ1bmVkTm9kZS5zZXRDZW50ZXIobm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJYKCkgLSBub2RlVG9Db25uZWN0LmdldFdpZHRoKCkgLyAyIC0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCAtIHBydW5lZE5vZGUuZ2V0V2lkdGgoKSAvIDIsIG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWSgpKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ29TRUxheW91dDtcblxuLyoqKi8gfSksXG5cbi8qKiovIDk5MTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBGRExheW91dE5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuRkRMYXlvdXROb2RlO1xudmFyIElNYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLklNYXRoO1xuXG5mdW5jdGlvbiBDb1NFTm9kZShnbSwgbG9jLCBzaXplLCB2Tm9kZSkge1xuICBGRExheW91dE5vZGUuY2FsbCh0aGlzLCBnbSwgbG9jLCBzaXplLCB2Tm9kZSk7XG59XG5cbkNvU0VOb2RlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRkRMYXlvdXROb2RlLnByb3RvdHlwZSk7XG5mb3IgKHZhciBwcm9wIGluIEZETGF5b3V0Tm9kZSkge1xuICBDb1NFTm9kZVtwcm9wXSA9IEZETGF5b3V0Tm9kZVtwcm9wXTtcbn1cblxuQ29TRU5vZGUucHJvdG90eXBlLmNhbGN1bGF0ZURpc3BsYWNlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGxheW91dCA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldExheW91dCgpO1xuICAvLyB0aGlzIGNoZWNrIGlzIGZvciBjb21wb3VuZCBub2RlcyB0aGF0IGNvbnRhaW4gZml4ZWQgbm9kZXNcbiAgaWYgKHRoaXMuZ2V0Q2hpbGQoKSAhPSBudWxsICYmIHRoaXMuZml4ZWROb2RlV2VpZ2h0KSB7XG4gICAgdGhpcy5kaXNwbGFjZW1lbnRYICs9IGxheW91dC5jb29saW5nRmFjdG9yICogKHRoaXMuc3ByaW5nRm9yY2VYICsgdGhpcy5yZXB1bHNpb25Gb3JjZVggKyB0aGlzLmdyYXZpdGF0aW9uRm9yY2VYKSAvIHRoaXMuZml4ZWROb2RlV2VpZ2h0O1xuICAgIHRoaXMuZGlzcGxhY2VtZW50WSArPSBsYXlvdXQuY29vbGluZ0ZhY3RvciAqICh0aGlzLnNwcmluZ0ZvcmNlWSArIHRoaXMucmVwdWxzaW9uRm9yY2VZICsgdGhpcy5ncmF2aXRhdGlvbkZvcmNlWSkgLyB0aGlzLmZpeGVkTm9kZVdlaWdodDtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmRpc3BsYWNlbWVudFggKz0gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiAodGhpcy5zcHJpbmdGb3JjZVggKyB0aGlzLnJlcHVsc2lvbkZvcmNlWCArIHRoaXMuZ3Jhdml0YXRpb25Gb3JjZVgpIC8gdGhpcy5ub09mQ2hpbGRyZW47XG4gICAgdGhpcy5kaXNwbGFjZW1lbnRZICs9IGxheW91dC5jb29saW5nRmFjdG9yICogKHRoaXMuc3ByaW5nRm9yY2VZICsgdGhpcy5yZXB1bHNpb25Gb3JjZVkgKyB0aGlzLmdyYXZpdGF0aW9uRm9yY2VZKSAvIHRoaXMubm9PZkNoaWxkcmVuO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKHRoaXMuZGlzcGxhY2VtZW50WCkgPiBsYXlvdXQuY29vbGluZ0ZhY3RvciAqIGxheW91dC5tYXhOb2RlRGlzcGxhY2VtZW50KSB7XG4gICAgdGhpcy5kaXNwbGFjZW1lbnRYID0gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiBsYXlvdXQubWF4Tm9kZURpc3BsYWNlbWVudCAqIElNYXRoLnNpZ24odGhpcy5kaXNwbGFjZW1lbnRYKTtcbiAgfVxuXG4gIGlmIChNYXRoLmFicyh0aGlzLmRpc3BsYWNlbWVudFkpID4gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiBsYXlvdXQubWF4Tm9kZURpc3BsYWNlbWVudCkge1xuICAgIHRoaXMuZGlzcGxhY2VtZW50WSA9IGxheW91dC5jb29saW5nRmFjdG9yICogbGF5b3V0Lm1heE5vZGVEaXNwbGFjZW1lbnQgKiBJTWF0aC5zaWduKHRoaXMuZGlzcGxhY2VtZW50WSk7XG4gIH1cblxuICAvLyBub24tZW1wdHkgY29tcG91bmQgbm9kZSwgcHJvcG9nYXRlIG1vdmVtZW50IHRvIGNoaWxkcmVuIGFzIHdlbGxcbiAgaWYgKHRoaXMuY2hpbGQgJiYgdGhpcy5jaGlsZC5nZXROb2RlcygpLmxlbmd0aCA+IDApIHtcbiAgICB0aGlzLnByb3BvZ2F0ZURpc3BsYWNlbWVudFRvQ2hpbGRyZW4odGhpcy5kaXNwbGFjZW1lbnRYLCB0aGlzLmRpc3BsYWNlbWVudFkpO1xuICB9XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUucHJvcG9nYXRlRGlzcGxhY2VtZW50VG9DaGlsZHJlbiA9IGZ1bmN0aW9uIChkWCwgZFkpIHtcbiAgdmFyIG5vZGVzID0gdGhpcy5nZXRDaGlsZCgpLmdldE5vZGVzKCk7XG4gIHZhciBub2RlO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgIGlmIChub2RlLmdldENoaWxkKCkgPT0gbnVsbCkge1xuICAgICAgbm9kZS5kaXNwbGFjZW1lbnRYICs9IGRYO1xuICAgICAgbm9kZS5kaXNwbGFjZW1lbnRZICs9IGRZO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnByb3BvZ2F0ZURpc3BsYWNlbWVudFRvQ2hpbGRyZW4oZFgsIGRZKTtcbiAgICB9XG4gIH1cbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbGF5b3V0ID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0TGF5b3V0KCk7XG5cbiAgLy8gYSBzaW1wbGUgbm9kZSBvciBhbiBlbXB0eSBjb21wb3VuZCBub2RlLCBtb3ZlIGl0XG4gIGlmICh0aGlzLmNoaWxkID09IG51bGwgfHwgdGhpcy5jaGlsZC5nZXROb2RlcygpLmxlbmd0aCA9PSAwKSB7XG4gICAgdGhpcy5tb3ZlQnkodGhpcy5kaXNwbGFjZW1lbnRYLCB0aGlzLmRpc3BsYWNlbWVudFkpO1xuXG4gICAgbGF5b3V0LnRvdGFsRGlzcGxhY2VtZW50ICs9IE1hdGguYWJzKHRoaXMuZGlzcGxhY2VtZW50WCkgKyBNYXRoLmFicyh0aGlzLmRpc3BsYWNlbWVudFkpO1xuICB9XG5cbiAgdGhpcy5zcHJpbmdGb3JjZVggPSAwO1xuICB0aGlzLnNwcmluZ0ZvcmNlWSA9IDA7XG4gIHRoaXMucmVwdWxzaW9uRm9yY2VYID0gMDtcbiAgdGhpcy5yZXB1bHNpb25Gb3JjZVkgPSAwO1xuICB0aGlzLmdyYXZpdGF0aW9uRm9yY2VYID0gMDtcbiAgdGhpcy5ncmF2aXRhdGlvbkZvcmNlWSA9IDA7XG4gIHRoaXMuZGlzcGxhY2VtZW50WCA9IDA7XG4gIHRoaXMuZGlzcGxhY2VtZW50WSA9IDA7XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUuc2V0UHJlZDEgPSBmdW5jdGlvbiAocHJlZDEpIHtcbiAgdGhpcy5wcmVkMSA9IHByZWQxO1xufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLmdldFByZWQxID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcHJlZDE7XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUuZ2V0UHJlZDIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBwcmVkMjtcbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5zZXROZXh0ID0gZnVuY3Rpb24gKG5leHQpIHtcbiAgdGhpcy5uZXh0ID0gbmV4dDtcbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5nZXROZXh0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV4dDtcbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5zZXRQcm9jZXNzZWQgPSBmdW5jdGlvbiAocHJvY2Vzc2VkKSB7XG4gIHRoaXMucHJvY2Vzc2VkID0gcHJvY2Vzc2VkO1xufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLmlzUHJvY2Vzc2VkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcHJvY2Vzc2VkO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb1NFTm9kZTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDkwMjpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG52YXIgQ29TRUNvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oODA2KTtcbnZhciBMaW5rZWRMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkxpbmtlZExpc3Q7XG52YXIgTWF0cml4ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLk1hdHJpeDtcbnZhciBTVkQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuU1ZEO1xuXG5mdW5jdGlvbiBDb25zdHJhaW50SGFuZGxlcigpIHt9XG5cbkNvbnN0cmFpbnRIYW5kbGVyLmhhbmRsZUNvbnN0cmFpbnRzID0gZnVuY3Rpb24gKGxheW91dCkge1xuICAvLyAgbGV0IGxheW91dCA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldExheW91dCgpO1xuXG4gIC8vIGdldCBjb25zdHJhaW50cyBmcm9tIGxheW91dFxuICB2YXIgY29uc3RyYWludHMgPSB7fTtcbiAgY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludCA9IGxheW91dC5jb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50O1xuICBjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50ID0gbGF5b3V0LmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQ7XG4gIGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCA9IGxheW91dC5jb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQ7XG5cbiAgdmFyIGlkVG9Ob2RlTWFwID0gbmV3IE1hcCgpO1xuICB2YXIgbm9kZUluZGV4ZXMgPSBuZXcgTWFwKCk7XG4gIHZhciB4Q29vcmRzID0gW107XG4gIHZhciB5Q29vcmRzID0gW107XG5cbiAgdmFyIGFsbE5vZGVzID0gbGF5b3V0LmdldEFsbE5vZGVzKCk7XG4gIHZhciBpbmRleCA9IDA7XG4gIC8vIGZpbGwgaW5kZXggbWFwIGFuZCBjb29yZGluYXRlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBhbGxOb2Rlc1tpXTtcbiAgICBpZiAobm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICAgIG5vZGVJbmRleGVzLnNldChub2RlLmlkLCBpbmRleCsrKTtcbiAgICAgIHhDb29yZHMucHVzaChub2RlLmdldENlbnRlclgoKSk7XG4gICAgICB5Q29vcmRzLnB1c2gobm9kZS5nZXRDZW50ZXJZKCkpO1xuICAgICAgaWRUb05vZGVNYXAuc2V0KG5vZGUuaWQsIG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZXJlIGV4aXN0cyByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludCB3aXRob3V0IGdhcCB2YWx1ZSwgc2V0IGl0IHRvIGRlZmF1bHQgXG4gIGlmIChjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICBjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgaWYgKCFjb25zdHJhaW50LmdhcCAmJiBjb25zdHJhaW50LmdhcCAhPSAwKSB7XG4gICAgICAgIGlmIChjb25zdHJhaW50LmxlZnQpIHtcbiAgICAgICAgICBjb25zdHJhaW50LmdhcCA9IENvU0VDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCArIGlkVG9Ob2RlTWFwLmdldChjb25zdHJhaW50LmxlZnQpLmdldFdpZHRoKCkgLyAyICsgaWRUb05vZGVNYXAuZ2V0KGNvbnN0cmFpbnQucmlnaHQpLmdldFdpZHRoKCkgLyAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0cmFpbnQuZ2FwID0gQ29TRUNvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIICsgaWRUb05vZGVNYXAuZ2V0KGNvbnN0cmFpbnQudG9wKS5nZXRIZWlnaHQoKSAvIDIgKyBpZFRvTm9kZU1hcC5nZXQoY29uc3RyYWludC5ib3R0b20pLmdldEhlaWdodCgpIC8gMjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyogYXV4aWxpYXJ5IGZ1bmN0aW9ucyAqL1xuXG4gIC8vIGNhbGN1bGF0ZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHBvc2l0aW9uIG9iamVjdHNcbiAgdmFyIGNhbGN1bGF0ZVBvc2l0aW9uRGlmZiA9IGZ1bmN0aW9uIGNhbGN1bGF0ZVBvc2l0aW9uRGlmZihwb3MxLCBwb3MyKSB7XG4gICAgcmV0dXJuIHsgeDogcG9zMS54IC0gcG9zMi54LCB5OiBwb3MxLnkgLSBwb3MyLnkgfTtcbiAgfTtcblxuICAvLyBjYWxjdWxhdGUgYXZlcmFnZSBwb3NpdGlvbiBvZiB0aGUgbm9kZXNcbiAgdmFyIGNhbGN1bGF0ZUF2Z1Bvc2l0aW9uID0gZnVuY3Rpb24gY2FsY3VsYXRlQXZnUG9zaXRpb24obm9kZUlkU2V0KSB7XG4gICAgdmFyIHhQb3NTdW0gPSAwO1xuICAgIHZhciB5UG9zU3VtID0gMDtcbiAgICBub2RlSWRTZXQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICB4UG9zU3VtICs9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldO1xuICAgICAgeVBvc1N1bSArPSB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHg6IHhQb3NTdW0gLyBub2RlSWRTZXQuc2l6ZSwgeTogeVBvc1N1bSAvIG5vZGVJZFNldC5zaXplIH07XG4gIH07XG5cbiAgLy8gZmluZCBhbiBhcHByb3ByaWF0ZSBwb3NpdGlvbmluZyBmb3IgdGhlIG5vZGVzIGluIGEgZ2l2ZW4gZ3JhcGggYWNjb3JkaW5nIHRvIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50c1xuICAvLyB0aGlzIGZ1bmN0aW9uIGFsc28gdGFrZXMgdGhlIGZpeGVkIG5vZGVzIGFuZCBhbGlnbm1lbnQgY29uc3RyYWludHMgaW50byBhY2NvdW50XG4gIC8vIGdyYXBoOiBkYWcgdG8gYmUgZXZhbHVhdGVkLCBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiIG9yIFwidmVydGljYWxcIiwgXG4gIC8vIGZpeGVkTm9kZXM6IHNldCBvZiBmaXhlZCBub2RlcyB0byBjb25zaWRlciBkdXJpbmcgZXZhbHVhdGlvbiwgZHVtbXlQb3NpdGlvbnM6IGFwcHJvcHJpYXRlIGNvb3JkaW5hdGVzIG9mIHRoZSBkdW1teSBub2RlcyAgXG4gIHZhciBmaW5kQXBwcm9wcmlhdGVQb3NpdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50ID0gZnVuY3Rpb24gZmluZEFwcHJvcHJpYXRlUG9zaXRpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChncmFwaCwgZGlyZWN0aW9uLCBmaXhlZE5vZGVzLCBkdW1teVBvc2l0aW9ucywgY29tcG9uZW50U291cmNlcykge1xuXG4gICAgLy8gZmluZCB1bmlvbiBvZiB0d28gc2V0c1xuICAgIGZ1bmN0aW9uIHNldFVuaW9uKHNldEEsIHNldEIpIHtcbiAgICAgIHZhciB1bmlvbiA9IG5ldyBTZXQoc2V0QSk7XG4gICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgIHZhciBfaXRlcmF0b3JFcnJvciA9IHVuZGVmaW5lZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gc2V0QltTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSAoX3N0ZXAgPSBfaXRlcmF0b3IubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWUpIHtcbiAgICAgICAgICB2YXIgZWxlbSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICAgICAgdW5pb24uYWRkKGVsZW0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSB0cnVlO1xuICAgICAgICBfaXRlcmF0b3JFcnJvciA9IGVycjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAgIF9pdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuaW9uO1xuICAgIH1cblxuICAgIC8vIGZpbmQgaW5kZWdyZWUgY291bnQgZm9yIGVhY2ggbm9kZVxuICAgIHZhciBpbkRlZ3JlZXMgPSBuZXcgTWFwKCk7XG5cbiAgICBncmFwaC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICBpbkRlZ3JlZXMuc2V0KGtleSwgMCk7XG4gICAgfSk7XG4gICAgZ3JhcGguZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoYWRqYWNlbnQpIHtcbiAgICAgICAgaW5EZWdyZWVzLnNldChhZGphY2VudC5pZCwgaW5EZWdyZWVzLmdldChhZGphY2VudC5pZCkgKyAxKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdmFyIHBvc2l0aW9uTWFwID0gbmV3IE1hcCgpOyAvLyBrZWVwcyB0aGUgcG9zaXRpb24gZm9yIGVhY2ggbm9kZVxuICAgIHZhciBwYXN0TWFwID0gbmV3IE1hcCgpOyAvLyBrZWVwcyB0aGUgcHJlZGVjZXNzb3JzKHBhc3QpIG9mIGEgbm9kZVxuICAgIHZhciBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7XG4gICAgaW5EZWdyZWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSAwKSB7XG4gICAgICAgIHF1ZXVlLnB1c2goa2V5KTtcbiAgICAgICAgaWYgKCFmaXhlZE5vZGVzKSB7XG4gICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBcImhvcml6b250YWxcIikge1xuICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KGtleSwgbm9kZUluZGV4ZXMuaGFzKGtleSkgPyB4Q29vcmRzW25vZGVJbmRleGVzLmdldChrZXkpXSA6IGR1bW15UG9zaXRpb25zLmdldChrZXkpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KGtleSwgbm9kZUluZGV4ZXMuaGFzKGtleSkgPyB5Q29vcmRzW25vZGVJbmRleGVzLmdldChrZXkpXSA6IGR1bW15UG9zaXRpb25zLmdldChrZXkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvc2l0aW9uTWFwLnNldChrZXksIE51bWJlci5ORUdBVElWRV9JTkZJTklUWSk7XG4gICAgICB9XG4gICAgICBpZiAoZml4ZWROb2Rlcykge1xuICAgICAgICBwYXN0TWFwLnNldChrZXksIG5ldyBTZXQoW2tleV0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGFsaWduIHNvdXJjZXMgb2YgZWFjaCBjb21wb25lbnQgaW4gZW5mb3JjZW1lbnQgcGhhc2VcbiAgICBpZiAoZml4ZWROb2Rlcykge1xuICAgICAgY29tcG9uZW50U291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGZpeGVkSWRzID0gW107XG4gICAgICAgIGNvbXBvbmVudC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICBpZiAoZml4ZWROb2Rlcy5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgZml4ZWRJZHMucHVzaChub2RlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChmaXhlZElkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFyIHBvc2l0aW9uID0gMDtcbiAgICAgICAgICBmaXhlZElkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaXhlZElkKSB7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChmaXhlZElkLCBub2RlSW5kZXhlcy5oYXMoZml4ZWRJZCkgPyB4Q29vcmRzW25vZGVJbmRleGVzLmdldChmaXhlZElkKV0gOiBkdW1teVBvc2l0aW9ucy5nZXQoZml4ZWRJZCkpO1xuICAgICAgICAgICAgICBwb3NpdGlvbiArPSBwb3NpdGlvbk1hcC5nZXQoZml4ZWRJZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQoZml4ZWRJZCwgbm9kZUluZGV4ZXMuaGFzKGZpeGVkSWQpID8geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoZml4ZWRJZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KGZpeGVkSWQpKTtcbiAgICAgICAgICAgICAgcG9zaXRpb24gKz0gcG9zaXRpb25NYXAuZ2V0KGZpeGVkSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gLyBmaXhlZElkcy5sZW5ndGg7XG4gICAgICAgICAgY29tcG9uZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgaWYgKCFmaXhlZE5vZGVzLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChub2RlSWQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgX3Bvc2l0aW9uID0gMDtcbiAgICAgICAgICBjb21wb25lbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICAgIF9wb3NpdGlvbiArPSBub2RlSW5kZXhlcy5oYXMobm9kZUlkKSA/IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KG5vZGVJZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBfcG9zaXRpb24gKz0gbm9kZUluZGV4ZXMuaGFzKG5vZGVJZCkgPyB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSA6IGR1bW15UG9zaXRpb25zLmdldChub2RlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9wb3NpdGlvbiA9IF9wb3NpdGlvbiAvIGNvbXBvbmVudC5sZW5ndGg7XG4gICAgICAgICAgY29tcG9uZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KG5vZGVJZCwgX3Bvc2l0aW9uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIHBvc2l0aW9ucyBvZiB0aGUgbm9kZXNcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgICAgdmFyIGN1cnJlbnROb2RlID0gcXVldWUuc2hpZnQoKTtcbiAgICAgIHZhciBuZWlnaGJvcnMgPSBncmFwaC5nZXQoY3VycmVudE5vZGUpO1xuICAgICAgbmVpZ2hib3JzLmZvckVhY2goZnVuY3Rpb24gKG5laWdoYm9yKSB7XG4gICAgICAgIGlmIChwb3NpdGlvbk1hcC5nZXQobmVpZ2hib3IuaWQpIDwgcG9zaXRpb25NYXAuZ2V0KGN1cnJlbnROb2RlKSArIG5laWdoYm9yLmdhcCkge1xuICAgICAgICAgIGlmIChmaXhlZE5vZGVzICYmIGZpeGVkTm9kZXMuaGFzKG5laWdoYm9yLmlkKSkge1xuICAgICAgICAgICAgdmFyIGZpeGVkUG9zaXRpb24gPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICAgIGZpeGVkUG9zaXRpb24gPSBub2RlSW5kZXhlcy5oYXMobmVpZ2hib3IuaWQpID8geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobmVpZ2hib3IuaWQpXSA6IGR1bW15UG9zaXRpb25zLmdldChuZWlnaGJvci5pZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmaXhlZFBvc2l0aW9uID0gbm9kZUluZGV4ZXMuaGFzKG5laWdoYm9yLmlkKSA/IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5laWdoYm9yLmlkKV0gOiBkdW1teVBvc2l0aW9ucy5nZXQobmVpZ2hib3IuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KG5laWdoYm9yLmlkLCBmaXhlZFBvc2l0aW9uKTsgLy8gVE9ETzogbWF5IGRvIHVubmVjZXNzYXJ5IHdvcmtcbiAgICAgICAgICAgIGlmIChmaXhlZFBvc2l0aW9uIDwgcG9zaXRpb25NYXAuZ2V0KGN1cnJlbnROb2RlKSArIG5laWdoYm9yLmdhcCkge1xuICAgICAgICAgICAgICB2YXIgZGlmZiA9IHBvc2l0aW9uTWFwLmdldChjdXJyZW50Tm9kZSkgKyBuZWlnaGJvci5nYXAgLSBmaXhlZFBvc2l0aW9uO1xuICAgICAgICAgICAgICBwYXN0TWFwLmdldChjdXJyZW50Tm9kZSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KG5vZGVJZCwgcG9zaXRpb25NYXAuZ2V0KG5vZGVJZCkgLSBkaWZmKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChuZWlnaGJvci5pZCwgcG9zaXRpb25NYXAuZ2V0KGN1cnJlbnROb2RlKSArIG5laWdoYm9yLmdhcCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGluRGVncmVlcy5zZXQobmVpZ2hib3IuaWQsIGluRGVncmVlcy5nZXQobmVpZ2hib3IuaWQpIC0gMSk7XG4gICAgICAgIGlmIChpbkRlZ3JlZXMuZ2V0KG5laWdoYm9yLmlkKSA9PSAwKSB7XG4gICAgICAgICAgcXVldWUucHVzaChuZWlnaGJvci5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpeGVkTm9kZXMpIHtcbiAgICAgICAgICBwYXN0TWFwLnNldChuZWlnaGJvci5pZCwgc2V0VW5pb24ocGFzdE1hcC5nZXQoY3VycmVudE5vZGUpLCBwYXN0TWFwLmdldChuZWlnaGJvci5pZCkpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggIT0gMCkge1xuICAgICAgX2xvb3AoKTtcbiAgICB9XG5cbiAgICAvLyByZWFkanVzdCBwb3NpdGlvbiBvZiB0aGUgbm9kZXMgYWZ0ZXIgZW5mb3JjZW1lbnRcbiAgICBpZiAoZml4ZWROb2Rlcykge1xuICAgICAgLy8gZmluZCBpbmRlZ3JlZSBjb3VudCBmb3IgZWFjaCBub2RlXG4gICAgICB2YXIgc2lua05vZGVzID0gbmV3IFNldCgpO1xuXG4gICAgICBncmFwaC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgIHNpbmtOb2Rlcy5hZGQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBfY29tcG9uZW50cyA9IFtdO1xuICAgICAgcGFzdE1hcC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgIGlmIChzaW5rTm9kZXMuaGFzKGtleSkpIHtcbiAgICAgICAgICB2YXIgaXNGaXhlZENvbXBvbmVudCA9IGZhbHNlO1xuICAgICAgICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IHRydWU7XG4gICAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yMiA9IGZhbHNlO1xuICAgICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjIgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IHZhbHVlW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAyOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gKF9zdGVwMiA9IF9pdGVyYXRvcjIubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSB0cnVlKSB7XG4gICAgICAgICAgICAgIHZhciBub2RlSWQgPSBfc3RlcDIudmFsdWU7XG5cbiAgICAgICAgICAgICAgaWYgKGZpeGVkTm9kZXMuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgICBpc0ZpeGVkQ29tcG9uZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IyID0gdHJ1ZTtcbiAgICAgICAgICAgIF9pdGVyYXRvckVycm9yMiA9IGVycjtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiAmJiBfaXRlcmF0b3IyLnJldHVybikge1xuICAgICAgICAgICAgICAgIF9pdGVyYXRvcjIucmV0dXJuKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWlzRml4ZWRDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHZhciBpc0V4aXN0ID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgZXhpc3RBdCA9IHZvaWQgMDtcbiAgICAgICAgICAgIF9jb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5oYXMoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheSh2YWx1ZSkpWzBdKSkge1xuICAgICAgICAgICAgICAgIGlzRXhpc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGV4aXN0QXQgPSBpbmRleDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWlzRXhpc3QpIHtcbiAgICAgICAgICAgICAgX2NvbXBvbmVudHMucHVzaChuZXcgU2V0KHZhbHVlKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgICBfY29tcG9uZW50c1tleGlzdEF0XS5hZGQoZWxlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgX2NvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICB2YXIgbWluQmVmb3JlID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICB2YXIgbWluQWZ0ZXIgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIHZhciBtYXhCZWZvcmUgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIHZhciBtYXhBZnRlciA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMgPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IzID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjMgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IzID0gY29tcG9uZW50W1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAzOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zID0gKF9zdGVwMyA9IF9pdGVyYXRvcjMubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjMgPSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIgbm9kZUlkID0gX3N0ZXAzLnZhbHVlO1xuXG4gICAgICAgICAgICB2YXIgcG9zQmVmb3JlID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBcImhvcml6b250YWxcIikge1xuICAgICAgICAgICAgICBwb3NCZWZvcmUgPSBub2RlSW5kZXhlcy5oYXMobm9kZUlkKSA/IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KG5vZGVJZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwb3NCZWZvcmUgPSBub2RlSW5kZXhlcy5oYXMobm9kZUlkKSA/IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KG5vZGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcG9zQWZ0ZXIgPSBwb3NpdGlvbk1hcC5nZXQobm9kZUlkKTtcbiAgICAgICAgICAgIGlmIChwb3NCZWZvcmUgPCBtaW5CZWZvcmUpIHtcbiAgICAgICAgICAgICAgbWluQmVmb3JlID0gcG9zQmVmb3JlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvc0JlZm9yZSA+IG1heEJlZm9yZSkge1xuICAgICAgICAgICAgICBtYXhCZWZvcmUgPSBwb3NCZWZvcmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zQWZ0ZXIgPCBtaW5BZnRlcikge1xuICAgICAgICAgICAgICBtaW5BZnRlciA9IHBvc0FmdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvc0FmdGVyID4gbWF4QWZ0ZXIpIHtcbiAgICAgICAgICAgICAgbWF4QWZ0ZXIgPSBwb3NBZnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yMyA9IHRydWU7XG4gICAgICAgICAgX2l0ZXJhdG9yRXJyb3IzID0gZXJyO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zICYmIF9pdGVyYXRvcjMucmV0dXJuKSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjMucmV0dXJuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjMpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaWZmID0gKG1pbkJlZm9yZSArIG1heEJlZm9yZSkgLyAyIC0gKG1pbkFmdGVyICsgbWF4QWZ0ZXIpIC8gMjtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjQgPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3I0ID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I0ID0gY29tcG9uZW50W1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA0OyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb240ID0gKF9zdGVwNCA9IF9pdGVyYXRvcjQubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjQgPSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIgX25vZGVJZCA9IF9zdGVwNC52YWx1ZTtcblxuICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KF9ub2RlSWQsIHBvc2l0aW9uTWFwLmdldChfbm9kZUlkKSArIGRpZmYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3I0ID0gdHJ1ZTtcbiAgICAgICAgICBfaXRlcmF0b3JFcnJvcjQgPSBlcnI7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjQgJiYgX2l0ZXJhdG9yNC5yZXR1cm4pIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yNC5yZXR1cm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yNCkge1xuICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zaXRpb25NYXA7XG4gIH07XG5cbiAgLy8gZmluZCB0cmFuc2Zvcm1hdGlvbiBiYXNlZCBvbiByZWwuIHBsYWNlbWVudCBjb25zdHJhaW50cyBpZiB0aGVyZSBhcmUgYm90aCBhbGlnbm1lbnQgYW5kIHJlbC4gcGxhY2VtZW50IGNvbnN0cmFpbnRzXG4gIC8vIG9yIGlmIHRoZXJlIGFyZSBvbmx5IHJlbC4gcGxhY2VtZW50IGNvbnRyYWludHMgd2hlcmUgdGhlIGxhcmdlc3QgY29tcG9uZW50IGlzbid0IHN1ZmZpY2llbnRseSBsYXJnZVxuICB2YXIgYXBwbHlSZWZsZWN0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQgPSBmdW5jdGlvbiBhcHBseVJlZmxlY3Rpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChyZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnRzKSB7XG4gICAgLy8gdmFyaWFibGVzIHRvIGNvdW50IHZvdGVzXG4gICAgdmFyIHJlZmxlY3RPblkgPSAwLFxuICAgICAgICBub3RSZWZsZWN0T25ZID0gMDtcbiAgICB2YXIgcmVmbGVjdE9uWCA9IDAsXG4gICAgICAgIG5vdFJlZmxlY3RPblggPSAwO1xuXG4gICAgcmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICBpZiAoY29uc3RyYWludC5sZWZ0KSB7XG4gICAgICAgIHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGNvbnN0cmFpbnQubGVmdCldIC0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoY29uc3RyYWludC5yaWdodCldID49IDAgPyByZWZsZWN0T25ZKysgOiBub3RSZWZsZWN0T25ZKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB5Q29vcmRzW25vZGVJbmRleGVzLmdldChjb25zdHJhaW50LnRvcCldIC0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoY29uc3RyYWludC5ib3R0b20pXSA+PSAwID8gcmVmbGVjdE9uWCsrIDogbm90UmVmbGVjdE9uWCsrO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHJlZmxlY3RPblkgPiBub3RSZWZsZWN0T25ZICYmIHJlZmxlY3RPblggPiBub3RSZWZsZWN0T25YKSB7XG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbm9kZUluZGV4ZXMuc2l6ZTsgX2krKykge1xuICAgICAgICB4Q29vcmRzW19pXSA9IC0xICogeENvb3Jkc1tfaV07XG4gICAgICAgIHlDb29yZHNbX2ldID0gLTEgKiB5Q29vcmRzW19pXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlZmxlY3RPblkgPiBub3RSZWZsZWN0T25ZKSB7XG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBub2RlSW5kZXhlcy5zaXplOyBfaTIrKykge1xuICAgICAgICB4Q29vcmRzW19pMl0gPSAtMSAqIHhDb29yZHNbX2kyXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlZmxlY3RPblggPiBub3RSZWZsZWN0T25YKSB7XG4gICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBub2RlSW5kZXhlcy5zaXplOyBfaTMrKykge1xuICAgICAgICB5Q29vcmRzW19pM10gPSAtMSAqIHlDb29yZHNbX2kzXTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gZmluZCB3ZWFrbHkgY29ubmVjdGVkIGNvbXBvbmVudHMgaW4gdW5kaXJlY3RlZCBncmFwaFxuICB2YXIgZmluZENvbXBvbmVudHMgPSBmdW5jdGlvbiBmaW5kQ29tcG9uZW50cyhncmFwaCkge1xuICAgIC8vIGZpbmQgd2Vha2x5IGNvbm5lY3RlZCBjb21wb25lbnRzIGluIGRhZ1xuICAgIHZhciBjb21wb25lbnRzID0gW107XG4gICAgdmFyIHF1ZXVlID0gbmV3IExpbmtlZExpc3QoKTtcbiAgICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgICB2YXIgY291bnQgPSAwO1xuXG4gICAgZ3JhcGguZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbXBvbmVudHNbY291bnRdID0gW107XG4gICAgICAgIHZhciBfY3VycmVudE5vZGUgPSBrZXk7XG4gICAgICAgIHF1ZXVlLnB1c2goX2N1cnJlbnROb2RlKTtcbiAgICAgICAgdmlzaXRlZC5hZGQoX2N1cnJlbnROb2RlKTtcbiAgICAgICAgY29tcG9uZW50c1tjb3VudF0ucHVzaChfY3VycmVudE5vZGUpO1xuXG4gICAgICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggIT0gMCkge1xuICAgICAgICAgIF9jdXJyZW50Tm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgdmFyIG5laWdoYm9ycyA9IGdyYXBoLmdldChfY3VycmVudE5vZGUpO1xuICAgICAgICAgIG5laWdoYm9ycy5mb3JFYWNoKGZ1bmN0aW9uIChuZWlnaGJvcikge1xuICAgICAgICAgICAgaWYgKCF2aXNpdGVkLmhhcyhuZWlnaGJvci5pZCkpIHtcbiAgICAgICAgICAgICAgcXVldWUucHVzaChuZWlnaGJvci5pZCk7XG4gICAgICAgICAgICAgIHZpc2l0ZWQuYWRkKG5laWdoYm9yLmlkKTtcbiAgICAgICAgICAgICAgY29tcG9uZW50c1tjb3VudF0ucHVzaChuZWlnaGJvci5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29tcG9uZW50cztcbiAgfTtcblxuICAvLyByZXR1cm4gdW5kaXJlY3RlZCB2ZXJzaW9uIG9mIGdpdmVuIGRhZ1xuICB2YXIgZGFnVG9VbmRpcmVjdGVkID0gZnVuY3Rpb24gZGFnVG9VbmRpcmVjdGVkKGRhZykge1xuICAgIHZhciB1bmRpcmVjdGVkID0gbmV3IE1hcCgpO1xuXG4gICAgZGFnLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIHVuZGlyZWN0ZWQuc2V0KGtleSwgW10pO1xuICAgIH0pO1xuXG4gICAgZGFnLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGFkamFjZW50KSB7XG4gICAgICAgIHVuZGlyZWN0ZWQuZ2V0KGtleSkucHVzaChhZGphY2VudCk7XG4gICAgICAgIHVuZGlyZWN0ZWQuZ2V0KGFkamFjZW50LmlkKS5wdXNoKHsgaWQ6IGtleSwgZ2FwOiBhZGphY2VudC5nYXAsIGRpcmVjdGlvbjogYWRqYWNlbnQuZGlyZWN0aW9uIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdW5kaXJlY3RlZDtcbiAgfTtcblxuICAvLyByZXR1cm4gcmV2ZXJzZWQgKGRpcmVjdGlvbnMgaW52ZXJ0ZWQpIHZlcnNpb24gb2YgZ2l2ZW4gZGFnXG4gIHZhciBkYWdUb1JldmVyc2VkID0gZnVuY3Rpb24gZGFnVG9SZXZlcnNlZChkYWcpIHtcbiAgICB2YXIgcmV2ZXJzZWQgPSBuZXcgTWFwKCk7XG5cbiAgICBkYWcuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgcmV2ZXJzZWQuc2V0KGtleSwgW10pO1xuICAgIH0pO1xuXG4gICAgZGFnLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGFkamFjZW50KSB7XG4gICAgICAgIHJldmVyc2VkLmdldChhZGphY2VudC5pZCkucHVzaCh7IGlkOiBrZXksIGdhcDogYWRqYWNlbnQuZ2FwLCBkaXJlY3Rpb246IGFkamFjZW50LmRpcmVjdGlvbiB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJldmVyc2VkO1xuICB9O1xuXG4gIC8qKioqICBhcHBseSB0cmFuc2Zvcm1hdGlvbiB0byB0aGUgaW5pdGlhbCBkcmFmdCBsYXlvdXQgdG8gYmV0dGVyIGFsaWduIHdpdGggY29uc3RyYWluZWQgbm9kZXMgKioqKi9cbiAgLy8gc29sdmUgdGhlIE9ydGhvZ29uYWwgUHJvY3J1c3RlYW4gUHJvYmxlbSB0byByb3RhdGUgYW5kL29yIHJlZmxlY3QgaW5pdGlhbCBkcmFmdCBsYXlvdXRcbiAgLy8gaGVyZSB3ZSBmb2xsb3cgdGhlIHNvbHV0aW9uIGluIENoYXB0ZXIgMjAuMiBvZiBCb3JnLCBJLiAmIEdyb2VuZW4sIFAuICgyMDA1KSBNb2Rlcm4gTXVsdGlkaW1lbnNpb25hbCBTY2FsaW5nOiBUaGVvcnkgYW5kIEFwcGxpY2F0aW9ucyBcblxuICAvKiBjb25zdHJ1Y3Qgc291cmNlIGFuZCB0YXJnZXQgY29uZmlndXJhdGlvbnMgKi9cblxuICB2YXIgdGFyZ2V0TWF0cml4ID0gW107IC8vIEEgLSB0YXJnZXQgY29uZmlndXJhdGlvblxuICB2YXIgc291cmNlTWF0cml4ID0gW107IC8vIEIgLSBzb3VyY2UgY29uZmlndXJhdGlvbiBcbiAgdmFyIHN0YW5kYXJkVHJhbnNmb3JtYXRpb24gPSBmYWxzZTsgLy8gZmFsc2UgZm9yIG5vIHRyYW5zZm9ybWF0aW9uLCB0cnVlIGZvciBzdGFuZGFydCAoUHJvY3J1c3RlcykgdHJhbnNmb3JtYXRpb24gKHJvdGF0aW9uIGFuZC9vciByZWZsZWN0aW9uKVxuICB2YXIgcmVmbGVjdGlvblR5cGUgPSBmYWxzZTsgLy8gZmFsc2UvdHJ1ZSBmb3IgcmVmbGVjdGlvbiBjaGVjaywgJ3JlZmxlY3RPblgnLCAncmVmbGVjdE9uWScgb3IgJ3JlZmxlY3RPbkJvdGgnIGZvciByZWZsZWN0aW9uIHR5cGUgaWYgbmVjZXNzYXJ5XG4gIHZhciBmaXhlZE5vZGVzID0gbmV3IFNldCgpO1xuICB2YXIgZGFnID0gbmV3IE1hcCgpOyAvLyBhZGphY2VuY3kgbGlzdCB0byBrZWVwIGRpcmVjdGVkIGFjeWNsaWMgZ3JhcGggKGRhZykgdGhhdCBjb25zaXN0cyBvZiByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludHNcbiAgdmFyIGRhZ1VuZGlyZWN0ZWQgPSBuZXcgTWFwKCk7IC8vIHVuZGlyZWN0ZWQgdmVyc2lvbiBvZiB0aGUgZGFnXG4gIHZhciBjb21wb25lbnRzID0gW107IC8vIHdlYWtseSBjb25uZWN0ZWQgY29tcG9uZW50c1xuXG4gIC8vIGZpbGwgZml4ZWROb2RlcyBjb2xsZWN0aW9uIHRvIHVzZSBsYXRlclxuICBpZiAoY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludCkge1xuICAgIGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZURhdGEpIHtcbiAgICAgIGZpeGVkTm9kZXMuYWRkKG5vZGVEYXRhLm5vZGVJZCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBjb25zdHJ1Y3QgZGFnIGZyb20gcmVsYXRpdmUgcGxhY2VtZW50IGNvbnN0cmFpbnRzIFxuICBpZiAoY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG4gICAgLy8gY29uc3RydWN0IGJvdGggZGlyZWN0ZWQgYW5kIHVuZGlyZWN0ZWQgdmVyc2lvbiBvZiB0aGUgZGFnXG4gICAgY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgIGlmIChjb25zdHJhaW50LmxlZnQpIHtcbiAgICAgICAgaWYgKGRhZy5oYXMoY29uc3RyYWludC5sZWZ0KSkge1xuICAgICAgICAgIGRhZy5nZXQoY29uc3RyYWludC5sZWZ0KS5wdXNoKHsgaWQ6IGNvbnN0cmFpbnQucmlnaHQsIGdhcDogY29uc3RyYWludC5nYXAsIGRpcmVjdGlvbjogXCJob3Jpem9udGFsXCIgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGFnLnNldChjb25zdHJhaW50LmxlZnQsIFt7IGlkOiBjb25zdHJhaW50LnJpZ2h0LCBnYXA6IGNvbnN0cmFpbnQuZ2FwLCBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiIH1dKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRhZy5oYXMoY29uc3RyYWludC5yaWdodCkpIHtcbiAgICAgICAgICBkYWcuc2V0KGNvbnN0cmFpbnQucmlnaHQsIFtdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRhZy5oYXMoY29uc3RyYWludC50b3ApKSB7XG4gICAgICAgICAgZGFnLmdldChjb25zdHJhaW50LnRvcCkucHVzaCh7IGlkOiBjb25zdHJhaW50LmJvdHRvbSwgZ2FwOiBjb25zdHJhaW50LmdhcCwgZGlyZWN0aW9uOiBcInZlcnRpY2FsXCIgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGFnLnNldChjb25zdHJhaW50LnRvcCwgW3sgaWQ6IGNvbnN0cmFpbnQuYm90dG9tLCBnYXA6IGNvbnN0cmFpbnQuZ2FwLCBkaXJlY3Rpb246IFwidmVydGljYWxcIiB9XSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkYWcuaGFzKGNvbnN0cmFpbnQuYm90dG9tKSkge1xuICAgICAgICAgIGRhZy5zZXQoY29uc3RyYWludC5ib3R0b20sIFtdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZGFnVW5kaXJlY3RlZCA9IGRhZ1RvVW5kaXJlY3RlZChkYWcpO1xuICAgIGNvbXBvbmVudHMgPSBmaW5kQ29tcG9uZW50cyhkYWdVbmRpcmVjdGVkKTtcbiAgfVxuXG4gIGlmIChDb1NFQ29uc3RhbnRzLlRSQU5TRk9STV9PTl9DT05TVFJBSU5UX0hBTkRMSU5HKSB7XG4gICAgLy8gZmlyc3QgY2hlY2sgZml4ZWQgbm9kZSBjb25zdHJhaW50XG4gICAgaWYgKGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQgJiYgY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVEYXRhLCBpKSB7XG4gICAgICAgIHRhcmdldE1hdHJpeFtpXSA9IFtub2RlRGF0YS5wb3NpdGlvbi54LCBub2RlRGF0YS5wb3NpdGlvbi55XTtcbiAgICAgICAgc291cmNlTWF0cml4W2ldID0gW3hDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVEYXRhLm5vZGVJZCldLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlRGF0YS5ub2RlSWQpXV07XG4gICAgICB9KTtcbiAgICAgIHN0YW5kYXJkVHJhbnNmb3JtYXRpb24gPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludCkge1xuICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gdGhlbiBjaGVjayBhbGlnbm1lbnQgY29uc3RyYWludFxuICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCkge1xuICAgICAgICAgIHZhciB2ZXJ0aWNhbEFsaWduID0gY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbDtcblxuICAgICAgICAgIHZhciBfbG9vcDIgPSBmdW5jdGlvbiBfbG9vcDIoX2k0KSB7XG4gICAgICAgICAgICB2YXIgYWxpZ25tZW50U2V0ID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgdmVydGljYWxBbGlnbltfaTRdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICBhbGlnbm1lbnRTZXQuYWRkKG5vZGVJZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBuZXcgU2V0KFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoYWxpZ25tZW50U2V0KSkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgIHJldHVybiBmaXhlZE5vZGVzLmhhcyh4KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHZhciB4UG9zID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKGludGVyc2VjdGlvbi5zaXplID4gMCkgeFBvcyA9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGludGVyc2VjdGlvbi52YWx1ZXMoKS5uZXh0KCkudmFsdWUpXTtlbHNlIHhQb3MgPSBjYWxjdWxhdGVBdmdQb3NpdGlvbihhbGlnbm1lbnRTZXQpLng7XG5cbiAgICAgICAgICAgIHZlcnRpY2FsQWxpZ25bX2k0XS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgdGFyZ2V0TWF0cml4W2NvdW50XSA9IFt4UG9zLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXV07XG4gICAgICAgICAgICAgIHNvdXJjZU1hdHJpeFtjb3VudF0gPSBbeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0sIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldXTtcbiAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCB2ZXJ0aWNhbEFsaWduLmxlbmd0aDsgX2k0KyspIHtcbiAgICAgICAgICAgIF9sb29wMihfaTQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFuZGFyZFRyYW5zZm9ybWF0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgdmFyIGhvcml6b250YWxBbGlnbiA9IGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbDtcblxuICAgICAgICAgIHZhciBfbG9vcDMgPSBmdW5jdGlvbiBfbG9vcDMoX2k1KSB7XG4gICAgICAgICAgICB2YXIgYWxpZ25tZW50U2V0ID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduW19pNV0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIGFsaWdubWVudFNldC5hZGQobm9kZUlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IG5ldyBTZXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhbGlnbm1lbnRTZXQpKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZpeGVkTm9kZXMuaGFzKHgpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgdmFyIHlQb3MgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoaW50ZXJzZWN0aW9uLnNpemUgPiAwKSB5UG9zID0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoaW50ZXJzZWN0aW9uLnZhbHVlcygpLm5leHQoKS52YWx1ZSldO2Vsc2UgeVBvcyA9IGNhbGN1bGF0ZUF2Z1Bvc2l0aW9uKGFsaWdubWVudFNldCkueTtcblxuICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduW19pNV0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIHRhcmdldE1hdHJpeFtjb3VudF0gPSBbeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0sIHlQb3NdO1xuICAgICAgICAgICAgICBzb3VyY2VNYXRyaXhbY291bnRdID0gW3hDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXV07XG4gICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgaG9yaXpvbnRhbEFsaWduLmxlbmd0aDsgX2k1KyspIHtcbiAgICAgICAgICAgIF9sb29wMyhfaTUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFuZGFyZFRyYW5zZm9ybWF0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG4gICAgICAgICAgcmVmbGVjdGlvblR5cGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH0gZWxzZSBpZiAoY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG4gICAgICAvLyBmaW5hbGx5IGNoZWNrIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50XG4gICAgICAvLyBmaW5kIGxhcmdlc3QgY29tcG9uZW50IGluIGRhZ1xuICAgICAgdmFyIGxhcmdlc3RDb21wb25lbnRTaXplID0gMDtcbiAgICAgIHZhciBsYXJnZXN0Q29tcG9uZW50SW5kZXggPSAwO1xuICAgICAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgY29tcG9uZW50cy5sZW5ndGg7IF9pNisrKSB7XG4gICAgICAgIGlmIChjb21wb25lbnRzW19pNl0ubGVuZ3RoID4gbGFyZ2VzdENvbXBvbmVudFNpemUpIHtcbiAgICAgICAgICBsYXJnZXN0Q29tcG9uZW50U2l6ZSA9IGNvbXBvbmVudHNbX2k2XS5sZW5ndGg7XG4gICAgICAgICAgbGFyZ2VzdENvbXBvbmVudEluZGV4ID0gX2k2O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBpZiBsYXJnZXN0IGNvbXBvbmVudCBpc24ndCBkb21pbmFudCwgdGhlbiB0YWtlIHRoZSB2b3RlcyBmb3IgcmVmbGVjdGlvblxuICAgICAgaWYgKGxhcmdlc3RDb21wb25lbnRTaXplIDwgZGFnVW5kaXJlY3RlZC5zaXplIC8gMikge1xuICAgICAgICBhcHBseVJlZmxlY3Rpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpO1xuICAgICAgICBzdGFuZGFyZFRyYW5zZm9ybWF0aW9uID0gZmFsc2U7XG4gICAgICAgIHJlZmxlY3Rpb25UeXBlID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB1c2UgbGFyZ2VzdCBjb21wb25lbnQgZm9yIHRyYW5zZm9ybWF0aW9uXG4gICAgICAgIC8vIGNvbnN0cnVjdCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBzdWJncmFwaHMgaW4gdGhlIGxhcmdlc3QgY29tcG9uZW50XG4gICAgICAgIHZhciBzdWJHcmFwaE9uSG9yaXpvbnRhbCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIHN1YkdyYXBoT25WZXJ0aWNhbCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGNvbnN0cmFpbnRzSW5sYXJnZXN0Q29tcG9uZW50ID0gW107XG5cbiAgICAgICAgY29tcG9uZW50c1tsYXJnZXN0Q29tcG9uZW50SW5kZXhdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgIGRhZy5nZXQobm9kZUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChhZGphY2VudCkge1xuICAgICAgICAgICAgaWYgKGFkamFjZW50LmRpcmVjdGlvbiA9PSBcImhvcml6b250YWxcIikge1xuICAgICAgICAgICAgICBpZiAoc3ViR3JhcGhPbkhvcml6b250YWwuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgICBzdWJHcmFwaE9uSG9yaXpvbnRhbC5nZXQobm9kZUlkKS5wdXNoKGFkamFjZW50KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdWJHcmFwaE9uSG9yaXpvbnRhbC5zZXQobm9kZUlkLCBbYWRqYWNlbnRdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIXN1YkdyYXBoT25Ib3Jpem9udGFsLmhhcyhhZGphY2VudC5pZCkpIHtcbiAgICAgICAgICAgICAgICBzdWJHcmFwaE9uSG9yaXpvbnRhbC5zZXQoYWRqYWNlbnQuaWQsIFtdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdHJhaW50c0lubGFyZ2VzdENvbXBvbmVudC5wdXNoKHsgbGVmdDogbm9kZUlkLCByaWdodDogYWRqYWNlbnQuaWQgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoc3ViR3JhcGhPblZlcnRpY2FsLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLmdldChub2RlSWQpLnB1c2goYWRqYWNlbnQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN1YkdyYXBoT25WZXJ0aWNhbC5zZXQobm9kZUlkLCBbYWRqYWNlbnRdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIXN1YkdyYXBoT25WZXJ0aWNhbC5oYXMoYWRqYWNlbnQuaWQpKSB7XG4gICAgICAgICAgICAgICAgc3ViR3JhcGhPblZlcnRpY2FsLnNldChhZGphY2VudC5pZCwgW10pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0cmFpbnRzSW5sYXJnZXN0Q29tcG9uZW50LnB1c2goeyB0b3A6IG5vZGVJZCwgYm90dG9tOiBhZGphY2VudC5pZCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXBwbHlSZWZsZWN0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQoY29uc3RyYWludHNJbmxhcmdlc3RDb21wb25lbnQpO1xuICAgICAgICByZWZsZWN0aW9uVHlwZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBhcHByb3ByaWF0ZSBwb3NpdGlvbmluZyBmb3Igc3ViZ3JhcGhzXG4gICAgICAgIHZhciBwb3NpdGlvbk1hcEhvcml6b250YWwgPSBmaW5kQXBwcm9wcmlhdGVQb3NpdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KHN1YkdyYXBoT25Ib3Jpem9udGFsLCBcImhvcml6b250YWxcIik7XG4gICAgICAgIHZhciBwb3NpdGlvbk1hcFZlcnRpY2FsID0gZmluZEFwcHJvcHJpYXRlUG9zaXRpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChzdWJHcmFwaE9uVmVydGljYWwsIFwidmVydGljYWxcIik7XG5cbiAgICAgICAgLy8gY29uc3RydWN0IHNvdXJjZSBhbmQgdGFyZ2V0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgY29tcG9uZW50c1tsYXJnZXN0Q29tcG9uZW50SW5kZXhdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCwgaSkge1xuICAgICAgICAgIHNvdXJjZU1hdHJpeFtpXSA9IFt4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSwgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV1dO1xuICAgICAgICAgIHRhcmdldE1hdHJpeFtpXSA9IFtdO1xuICAgICAgICAgIGlmIChwb3NpdGlvbk1hcEhvcml6b250YWwuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgIHRhcmdldE1hdHJpeFtpXVswXSA9IHBvc2l0aW9uTWFwSG9yaXpvbnRhbC5nZXQobm9kZUlkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0TWF0cml4W2ldWzBdID0geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwb3NpdGlvbk1hcFZlcnRpY2FsLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICB0YXJnZXRNYXRyaXhbaV1bMV0gPSBwb3NpdGlvbk1hcFZlcnRpY2FsLmdldChub2RlSWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRNYXRyaXhbaV1bMV0gPSB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN0YW5kYXJkVHJhbnNmb3JtYXRpb24gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHRyYW5zZm9ybWF0aW9uIGlzIHJlcXVpcmVkLCB0aGVuIGNhbGN1bGF0ZSBhbmQgYXBwbHkgdHJhbnNmb3JtYXRpb24gbWF0cml4XG4gICAgaWYgKHN0YW5kYXJkVHJhbnNmb3JtYXRpb24pIHtcbiAgICAgIC8qIGNhbGN1bGF0ZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggKi9cbiAgICAgIHZhciB0cmFuc2Zvcm1hdGlvbk1hdHJpeCA9IHZvaWQgMDtcbiAgICAgIHZhciB0YXJnZXRNYXRyaXhUcmFuc3Bvc2UgPSBNYXRyaXgudHJhbnNwb3NlKHRhcmdldE1hdHJpeCk7IC8vIEEnXG4gICAgICB2YXIgc291cmNlTWF0cml4VHJhbnNwb3NlID0gTWF0cml4LnRyYW5zcG9zZShzb3VyY2VNYXRyaXgpOyAvLyBCJ1xuXG4gICAgICAvLyBjZW50cmFsaXplIHRyYW5zcG9zZSBtYXRyaWNlc1xuICAgICAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgdGFyZ2V0TWF0cml4VHJhbnNwb3NlLmxlbmd0aDsgX2k3KyspIHtcbiAgICAgICAgdGFyZ2V0TWF0cml4VHJhbnNwb3NlW19pN10gPSBNYXRyaXgubXVsdEdhbW1hKHRhcmdldE1hdHJpeFRyYW5zcG9zZVtfaTddKTtcbiAgICAgICAgc291cmNlTWF0cml4VHJhbnNwb3NlW19pN10gPSBNYXRyaXgubXVsdEdhbW1hKHNvdXJjZU1hdHJpeFRyYW5zcG9zZVtfaTddKTtcbiAgICAgIH1cblxuICAgICAgLy8gZG8gYWN0dWFsIGNhbGN1bGF0aW9uIGZvciB0cmFuc2Zvcm1hdGlvbiBtYXRyaXhcbiAgICAgIHZhciB0ZW1wTWF0cml4ID0gTWF0cml4Lm11bHRNYXQodGFyZ2V0TWF0cml4VHJhbnNwb3NlLCBNYXRyaXgudHJhbnNwb3NlKHNvdXJjZU1hdHJpeFRyYW5zcG9zZSkpOyAvLyB0ZW1wTWF0cml4ID0gQSdCXG4gICAgICB2YXIgU1ZEUmVzdWx0ID0gU1ZELnN2ZCh0ZW1wTWF0cml4KTsgLy8gU1ZEKEEnQikgPSBVU1YnLCBzdmQgZnVuY3Rpb24gcmV0dXJucyBVLCBTIGFuZCBWIFxuICAgICAgdHJhbnNmb3JtYXRpb25NYXRyaXggPSBNYXRyaXgubXVsdE1hdChTVkRSZXN1bHQuViwgTWF0cml4LnRyYW5zcG9zZShTVkRSZXN1bHQuVSkpOyAvLyB0cmFuc2Zvcm1hdGlvbk1hdHJpeCA9IFQgPSBWVSdcblxuICAgICAgLyogYXBwbHkgZm91bmQgdHJhbnNmb3JtYXRpb24gbWF0cml4IHRvIG9idGFpbiBmaW5hbCBkcmFmdCBsYXlvdXQgKi9cbiAgICAgIGZvciAodmFyIF9pOCA9IDA7IF9pOCA8IG5vZGVJbmRleGVzLnNpemU7IF9pOCsrKSB7XG4gICAgICAgIHZhciB0ZW1wMSA9IFt4Q29vcmRzW19pOF0sIHlDb29yZHNbX2k4XV07XG4gICAgICAgIHZhciB0ZW1wMiA9IFt0cmFuc2Zvcm1hdGlvbk1hdHJpeFswXVswXSwgdHJhbnNmb3JtYXRpb25NYXRyaXhbMV1bMF1dO1xuICAgICAgICB2YXIgdGVtcDMgPSBbdHJhbnNmb3JtYXRpb25NYXRyaXhbMF1bMV0sIHRyYW5zZm9ybWF0aW9uTWF0cml4WzFdWzFdXTtcbiAgICAgICAgeENvb3Jkc1tfaThdID0gTWF0cml4LmRvdFByb2R1Y3QodGVtcDEsIHRlbXAyKTtcbiAgICAgICAgeUNvb3Jkc1tfaThdID0gTWF0cml4LmRvdFByb2R1Y3QodGVtcDEsIHRlbXAzKTtcbiAgICAgIH1cblxuICAgICAgLy8gYXBwbGllZCBvbmx5IGJvdGggYWxpZ25tZW50IGFuZCByZWwuIHBsYWNlbWVudCBjb25zdHJhaW50cyBleGlzdFxuICAgICAgaWYgKHJlZmxlY3Rpb25UeXBlKSB7XG4gICAgICAgIGFwcGx5UmVmbGVjdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKENvU0VDb25zdGFudHMuRU5GT1JDRV9DT05TVFJBSU5UUykge1xuICAgIC8qKioqICBlbmZvcmNlIGNvbnN0cmFpbnRzIG9uIHRoZSB0cmFuc2Zvcm1lZCBkcmFmdCBsYXlvdXQgKioqKi9cblxuICAgIC8qIGZpcnN0IGVuZm9yY2UgZml4ZWQgbm9kZSBjb25zdHJhaW50ICovXG5cbiAgICBpZiAoY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludCAmJiBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciB0cmFuc2xhdGlvbkFtb3VudCA9IHsgeDogMCwgeTogMCB9O1xuICAgICAgY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRGF0YSwgaSkge1xuICAgICAgICB2YXIgcG9zSW5UaGVvcnkgPSB7IHg6IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVEYXRhLm5vZGVJZCldLCB5OiB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlRGF0YS5ub2RlSWQpXSB9O1xuICAgICAgICB2YXIgcG9zRGVzaXJlZCA9IG5vZGVEYXRhLnBvc2l0aW9uO1xuICAgICAgICB2YXIgcG9zRGlmZiA9IGNhbGN1bGF0ZVBvc2l0aW9uRGlmZihwb3NEZXNpcmVkLCBwb3NJblRoZW9yeSk7XG4gICAgICAgIHRyYW5zbGF0aW9uQW1vdW50LnggKz0gcG9zRGlmZi54O1xuICAgICAgICB0cmFuc2xhdGlvbkFtb3VudC55ICs9IHBvc0RpZmYueTtcbiAgICAgIH0pO1xuICAgICAgdHJhbnNsYXRpb25BbW91bnQueCAvPSBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50Lmxlbmd0aDtcbiAgICAgIHRyYW5zbGF0aW9uQW1vdW50LnkgLz0gY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5sZW5ndGg7XG5cbiAgICAgIHhDb29yZHMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGkpIHtcbiAgICAgICAgeENvb3Jkc1tpXSArPSB0cmFuc2xhdGlvbkFtb3VudC54O1xuICAgICAgfSk7XG5cbiAgICAgIHlDb29yZHMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGkpIHtcbiAgICAgICAgeUNvb3Jkc1tpXSArPSB0cmFuc2xhdGlvbkFtb3VudC55O1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZURhdGEpIHtcbiAgICAgICAgeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZURhdGEubm9kZUlkKV0gPSBub2RlRGF0YS5wb3NpdGlvbi54O1xuICAgICAgICB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlRGF0YS5ub2RlSWQpXSA9IG5vZGVEYXRhLnBvc2l0aW9uLnk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiB0aGVuIGVuZm9yY2UgYWxpZ25tZW50IGNvbnN0cmFpbnQgKi9cblxuICAgIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50KSB7XG4gICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCkge1xuICAgICAgICB2YXIgeEFsaWduID0gY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbDtcblxuICAgICAgICB2YXIgX2xvb3A0ID0gZnVuY3Rpb24gX2xvb3A0KF9pOSkge1xuICAgICAgICAgIHZhciBhbGlnbm1lbnRTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgeEFsaWduW19pOV0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBhbGlnbm1lbnRTZXQuYWRkKG5vZGVJZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IG5ldyBTZXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhbGlnbm1lbnRTZXQpKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXhlZE5vZGVzLmhhcyh4KTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgdmFyIHhQb3MgPSB2b2lkIDA7XG4gICAgICAgICAgaWYgKGludGVyc2VjdGlvbi5zaXplID4gMCkgeFBvcyA9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGludGVyc2VjdGlvbi52YWx1ZXMoKS5uZXh0KCkudmFsdWUpXTtlbHNlIHhQb3MgPSBjYWxjdWxhdGVBdmdQb3NpdGlvbihhbGlnbm1lbnRTZXQpLng7XG5cbiAgICAgICAgICBhbGlnbm1lbnRTZXQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBpZiAoIWZpeGVkTm9kZXMuaGFzKG5vZGVJZCkpIHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldID0geFBvcztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKHZhciBfaTkgPSAwOyBfaTkgPCB4QWxpZ24ubGVuZ3RoOyBfaTkrKykge1xuICAgICAgICAgIF9sb29wNChfaTkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsKSB7XG4gICAgICAgIHZhciB5QWxpZ24gPSBjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWw7XG5cbiAgICAgICAgdmFyIF9sb29wNSA9IGZ1bmN0aW9uIF9sb29wNShfaTEwKSB7XG4gICAgICAgICAgdmFyIGFsaWdubWVudFNldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB5QWxpZ25bX2kxMF0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBhbGlnbm1lbnRTZXQuYWRkKG5vZGVJZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IG5ldyBTZXQoW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhbGlnbm1lbnRTZXQpKS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXhlZE5vZGVzLmhhcyh4KTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgdmFyIHlQb3MgPSB2b2lkIDA7XG4gICAgICAgICAgaWYgKGludGVyc2VjdGlvbi5zaXplID4gMCkgeVBvcyA9IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGludGVyc2VjdGlvbi52YWx1ZXMoKS5uZXh0KCkudmFsdWUpXTtlbHNlIHlQb3MgPSBjYWxjdWxhdGVBdmdQb3NpdGlvbihhbGlnbm1lbnRTZXQpLnk7XG5cbiAgICAgICAgICBhbGlnbm1lbnRTZXQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBpZiAoIWZpeGVkTm9kZXMuaGFzKG5vZGVJZCkpIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldID0geVBvcztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKHZhciBfaTEwID0gMDsgX2kxMCA8IHlBbGlnbi5sZW5ndGg7IF9pMTArKykge1xuICAgICAgICAgIF9sb29wNShfaTEwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIGZpbmFsbHkgZW5mb3JjZSByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludCAqL1xuXG4gICAgaWYgKGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBkdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgZHVtbXlQb3NpdGlvbnNGb3JWZXJ0aWNhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGR1bW15UG9zaXRpb25zRm9ySG9yaXpvbnRhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGZpeGVkTm9kZXNPbkhvcml6b250YWwgPSBuZXcgU2V0KCk7XG4gICAgICAgIHZhciBmaXhlZE5vZGVzT25WZXJ0aWNhbCA9IG5ldyBTZXQoKTtcblxuICAgICAgICAvLyBmaWxsIG1hcHMgYW5kIHNldHMgICAgICBcbiAgICAgICAgZml4ZWROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICBmaXhlZE5vZGVzT25Ib3Jpem9udGFsLmFkZChub2RlSWQpO1xuICAgICAgICAgIGZpeGVkTm9kZXNPblZlcnRpY2FsLmFkZChub2RlSWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludCkge1xuICAgICAgICAgIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsKSB7XG4gICAgICAgICAgICB2YXIgdmVydGljYWxBbGlnbm1lbnQgPSBjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsO1xuXG4gICAgICAgICAgICB2YXIgX2xvb3A2ID0gZnVuY3Rpb24gX2xvb3A2KF9pMTEpIHtcbiAgICAgICAgICAgICAgZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5zZXQoXCJkdW1teVwiICsgX2kxMSwgW10pO1xuICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWdubWVudFtfaTExXS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgICBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LnNldChub2RlSWQsIFwiZHVtbXlcIiArIF9pMTEpO1xuICAgICAgICAgICAgICAgIGR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KFwiZHVtbXlcIiArIF9pMTEpLnB1c2gobm9kZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAoZml4ZWROb2Rlcy5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgICAgICAgZml4ZWROb2Rlc09uSG9yaXpvbnRhbC5hZGQoXCJkdW1teVwiICsgX2kxMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgZHVtbXlQb3NpdGlvbnNGb3JWZXJ0aWNhbEFsaWdubWVudC5zZXQoXCJkdW1teVwiICsgX2kxMSwgeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQodmVydGljYWxBbGlnbm1lbnRbX2kxMV1bMF0pXSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmb3IgKHZhciBfaTExID0gMDsgX2kxMSA8IHZlcnRpY2FsQWxpZ25tZW50Lmxlbmd0aDsgX2kxMSsrKSB7XG4gICAgICAgICAgICAgIF9sb29wNihfaTExKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgdmFyIGhvcml6b250YWxBbGlnbm1lbnQgPSBjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWw7XG5cbiAgICAgICAgICAgIHZhciBfbG9vcDcgPSBmdW5jdGlvbiBfbG9vcDcoX2kxMikge1xuICAgICAgICAgICAgICBkdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuc2V0KFwiZHVtbXlcIiArIF9pMTIsIFtdKTtcbiAgICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWdubWVudFtfaTEyXS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgICBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuc2V0KG5vZGVJZCwgXCJkdW1teVwiICsgX2kxMik7XG4gICAgICAgICAgICAgICAgZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChcImR1bW15XCIgKyBfaTEyKS5wdXNoKG5vZGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGZpeGVkTm9kZXMuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpeGVkTm9kZXNPblZlcnRpY2FsLmFkZChcImR1bW15XCIgKyBfaTEyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBkdW1teVBvc2l0aW9uc0Zvckhvcml6b250YWxBbGlnbm1lbnQuc2V0KFwiZHVtbXlcIiArIF9pMTIsIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGhvcml6b250YWxBbGlnbm1lbnRbX2kxMl1bMF0pXSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmb3IgKHZhciBfaTEyID0gMDsgX2kxMiA8IGhvcml6b250YWxBbGlnbm1lbnQubGVuZ3RoOyBfaTEyKyspIHtcbiAgICAgICAgICAgICAgX2xvb3A3KF9pMTIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnN0cnVjdCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkYWdzIChzdWJncmFwaHMpIGZyb20gb3ZlcmFsbCBkYWdcbiAgICAgICAgdmFyIGRhZ09uSG9yaXpvbnRhbCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGRhZ09uVmVydGljYWwgPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgdmFyIF9sb29wOCA9IGZ1bmN0aW9uIF9sb29wOChub2RlSWQpIHtcbiAgICAgICAgICBkYWcuZ2V0KG5vZGVJZCkuZm9yRWFjaChmdW5jdGlvbiAoYWRqYWNlbnQpIHtcbiAgICAgICAgICAgIHZhciBzb3VyY2VJZCA9IHZvaWQgMDtcbiAgICAgICAgICAgIHZhciB0YXJnZXROb2RlID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKGFkamFjZW50W1wiZGlyZWN0aW9uXCJdID09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICAgICAgICAgIHNvdXJjZUlkID0gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQobm9kZUlkKSA/IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KG5vZGVJZCkgOiBub2RlSWQ7XG4gICAgICAgICAgICAgIGlmIChub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChhZGphY2VudC5pZCkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXROb2RlID0geyBpZDogbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoYWRqYWNlbnQuaWQpLCBnYXA6IGFkamFjZW50LmdhcCwgZGlyZWN0aW9uOiBhZGphY2VudC5kaXJlY3Rpb24gfTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXROb2RlID0gYWRqYWNlbnQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGRhZ09uSG9yaXpvbnRhbC5oYXMoc291cmNlSWQpKSB7XG4gICAgICAgICAgICAgICAgZGFnT25Ib3Jpem9udGFsLmdldChzb3VyY2VJZCkucHVzaCh0YXJnZXROb2RlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYWdPbkhvcml6b250YWwuc2V0KHNvdXJjZUlkLCBbdGFyZ2V0Tm9kZV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghZGFnT25Ib3Jpem9udGFsLmhhcyh0YXJnZXROb2RlLmlkKSkge1xuICAgICAgICAgICAgICAgIGRhZ09uSG9yaXpvbnRhbC5zZXQodGFyZ2V0Tm9kZS5pZCwgW10pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzb3VyY2VJZCA9IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQobm9kZUlkKSA/IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQobm9kZUlkKSA6IG5vZGVJZDtcbiAgICAgICAgICAgICAgaWYgKG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoYWRqYWNlbnQuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IHsgaWQ6IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoYWRqYWNlbnQuaWQpLCBnYXA6IGFkamFjZW50LmdhcCwgZGlyZWN0aW9uOiBhZGphY2VudC5kaXJlY3Rpb24gfTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXROb2RlID0gYWRqYWNlbnQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGRhZ09uVmVydGljYWwuaGFzKHNvdXJjZUlkKSkge1xuICAgICAgICAgICAgICAgIGRhZ09uVmVydGljYWwuZ2V0KHNvdXJjZUlkKS5wdXNoKHRhcmdldE5vZGUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhZ09uVmVydGljYWwuc2V0KHNvdXJjZUlkLCBbdGFyZ2V0Tm9kZV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghZGFnT25WZXJ0aWNhbC5oYXModGFyZ2V0Tm9kZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBkYWdPblZlcnRpY2FsLnNldCh0YXJnZXROb2RlLmlkLCBbXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjUgPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3I1ID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjUgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I1ID0gZGFnLmtleXMoKVtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwNTsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNSA9IChfc3RlcDUgPSBfaXRlcmF0b3I1Lm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb241ID0gdHJ1ZSkge1xuICAgICAgICAgICAgdmFyIG5vZGVJZCA9IF9zdGVwNS52YWx1ZTtcblxuICAgICAgICAgICAgX2xvb3A4KG5vZGVJZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZmluZCBzb3VyY2Ugbm9kZXMgb2YgZWFjaCBjb21wb25lbnQgaW4gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZGFnc1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjUgPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yNSA9IGVycjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNSAmJiBfaXRlcmF0b3I1LnJldHVybikge1xuICAgICAgICAgICAgICBfaXRlcmF0b3I1LnJldHVybigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3I1KSB7XG4gICAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdW5kaXJlY3RlZE9uSG9yaXpvbnRhbCA9IGRhZ1RvVW5kaXJlY3RlZChkYWdPbkhvcml6b250YWwpO1xuICAgICAgICB2YXIgdW5kaXJlY3RlZE9uVmVydGljYWwgPSBkYWdUb1VuZGlyZWN0ZWQoZGFnT25WZXJ0aWNhbCk7XG4gICAgICAgIHZhciBjb21wb25lbnRzT25Ib3Jpem9udGFsID0gZmluZENvbXBvbmVudHModW5kaXJlY3RlZE9uSG9yaXpvbnRhbCk7XG4gICAgICAgIHZhciBjb21wb25lbnRzT25WZXJ0aWNhbCA9IGZpbmRDb21wb25lbnRzKHVuZGlyZWN0ZWRPblZlcnRpY2FsKTtcbiAgICAgICAgdmFyIHJldmVyc2VkRGFnT25Ib3Jpem9udGFsID0gZGFnVG9SZXZlcnNlZChkYWdPbkhvcml6b250YWwpO1xuICAgICAgICB2YXIgcmV2ZXJzZWREYWdPblZlcnRpY2FsID0gZGFnVG9SZXZlcnNlZChkYWdPblZlcnRpY2FsKTtcbiAgICAgICAgdmFyIGNvbXBvbmVudFNvdXJjZXNPbkhvcml6b250YWwgPSBbXTtcbiAgICAgICAgdmFyIGNvbXBvbmVudFNvdXJjZXNPblZlcnRpY2FsID0gW107XG5cbiAgICAgICAgY29tcG9uZW50c09uSG9yaXpvbnRhbC5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQsIGluZGV4KSB7XG4gICAgICAgICAgY29tcG9uZW50U291cmNlc09uSG9yaXpvbnRhbFtpbmRleF0gPSBbXTtcbiAgICAgICAgICBjb21wb25lbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICBpZiAocmV2ZXJzZWREYWdPbkhvcml6b250YWwuZ2V0KG5vZGVJZCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50U291cmNlc09uSG9yaXpvbnRhbFtpbmRleF0ucHVzaChub2RlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb21wb25lbnRzT25WZXJ0aWNhbC5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQsIGluZGV4KSB7XG4gICAgICAgICAgY29tcG9uZW50U291cmNlc09uVmVydGljYWxbaW5kZXhdID0gW107XG4gICAgICAgICAgY29tcG9uZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgaWYgKHJldmVyc2VkRGFnT25WZXJ0aWNhbC5nZXQobm9kZUlkKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICBjb21wb25lbnRTb3VyY2VzT25WZXJ0aWNhbFtpbmRleF0ucHVzaChub2RlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgYXBwcm9wcmlhdGUgcG9zaXRpb25pbmcgZm9yIHN1YmdyYXBoc1xuICAgICAgICB2YXIgcG9zaXRpb25NYXBIb3Jpem9udGFsID0gZmluZEFwcHJvcHJpYXRlUG9zaXRpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChkYWdPbkhvcml6b250YWwsIFwiaG9yaXpvbnRhbFwiLCBmaXhlZE5vZGVzT25Ib3Jpem9udGFsLCBkdW1teVBvc2l0aW9uc0ZvclZlcnRpY2FsQWxpZ25tZW50LCBjb21wb25lbnRTb3VyY2VzT25Ib3Jpem9udGFsKTtcbiAgICAgICAgdmFyIHBvc2l0aW9uTWFwVmVydGljYWwgPSBmaW5kQXBwcm9wcmlhdGVQb3NpdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KGRhZ09uVmVydGljYWwsIFwidmVydGljYWxcIiwgZml4ZWROb2Rlc09uVmVydGljYWwsIGR1bW15UG9zaXRpb25zRm9ySG9yaXpvbnRhbEFsaWdubWVudCwgY29tcG9uZW50U291cmNlc09uVmVydGljYWwpO1xuXG4gICAgICAgIC8vIHVwZGF0ZSBwb3NpdGlvbnMgb2YgdGhlIG5vZGVzIGJhc2VkIG9uIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50c1xuXG4gICAgICAgIHZhciBfbG9vcDkgPSBmdW5jdGlvbiBfbG9vcDkoa2V5KSB7XG4gICAgICAgICAgaWYgKGR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGtleSkpIHtcbiAgICAgICAgICAgIGR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGtleSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldID0gcG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChrZXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGtleSldID0gcG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjYgPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3I2ID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjYgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I2ID0gcG9zaXRpb25NYXBIb3Jpem9udGFsLmtleXMoKVtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwNjsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNiA9IChfc3RlcDYgPSBfaXRlcmF0b3I2Lm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb242ID0gdHJ1ZSkge1xuICAgICAgICAgICAgdmFyIGtleSA9IF9zdGVwNi52YWx1ZTtcblxuICAgICAgICAgICAgX2xvb3A5KGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjYgPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yNiA9IGVycjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNiAmJiBfaXRlcmF0b3I2LnJldHVybikge1xuICAgICAgICAgICAgICBfaXRlcmF0b3I2LnJldHVybigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3I2KSB7XG4gICAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yNjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2xvb3AxMCA9IGZ1bmN0aW9uIF9sb29wMTAoa2V5KSB7XG4gICAgICAgICAgaWYgKGR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoa2V5KSkge1xuICAgICAgICAgICAgZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChrZXkpLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSA9IHBvc2l0aW9uTWFwVmVydGljYWwuZ2V0KGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoa2V5KV0gPSBwb3NpdGlvbk1hcFZlcnRpY2FsLmdldChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjcgPSB0cnVlO1xuICAgICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3I3ID0gZmFsc2U7XG4gICAgICAgIHZhciBfaXRlcmF0b3JFcnJvcjcgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I3ID0gcG9zaXRpb25NYXBWZXJ0aWNhbC5rZXlzKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDc7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjcgPSAoX3N0ZXA3ID0gX2l0ZXJhdG9yNy5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNyA9IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBfc3RlcDcudmFsdWU7XG5cbiAgICAgICAgICAgIF9sb29wMTAoa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yNyA9IHRydWU7XG4gICAgICAgICAgX2l0ZXJhdG9yRXJyb3I3ID0gZXJyO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb243ICYmIF9pdGVyYXRvcjcucmV0dXJuKSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjcucmV0dXJuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjcpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I3O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9XG4gIH1cblxuICAvLyBhc3NpZ24gbmV3IGNvb3JkaW5hdGVzIHRvIG5vZGVzIGFmdGVyIGNvbnN0cmFpbnQgaGFuZGxpbmdcbiAgZm9yICh2YXIgX2kxMyA9IDA7IF9pMTMgPCBhbGxOb2Rlcy5sZW5ndGg7IF9pMTMrKykge1xuICAgIHZhciBfbm9kZSA9IGFsbE5vZGVzW19pMTNdO1xuICAgIGlmIChfbm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICAgIF9ub2RlLnNldENlbnRlcih4Q29vcmRzW25vZGVJbmRleGVzLmdldChfbm9kZS5pZCldLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldChfbm9kZS5pZCldKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ29uc3RyYWludEhhbmRsZXI7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1NTE6XG4vKioqLyAoKG1vZHVsZSkgPT4ge1xuXG5tb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzU1MV9fO1xuXG4vKioqLyB9KVxuXG4vKioqKioqLyBcdH0pO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG4vKioqKioqLyBcdFx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovIFx0XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0Ly8gc3RhcnR1cFxuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0Ly8gVGhpcyBlbnRyeSBtb2R1bGUgaXMgcmVmZXJlbmNlZCBieSBvdGhlciBtb2R1bGVzIHNvIGl0IGNhbid0IGJlIGlubGluZWRcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1KTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfZXhwb3J0c19fO1xuLyoqKioqKi8gfSkoKVxuO1xufSk7IiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC5fZGFzaC11bmRvLXJlZG8ge1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICBib3R0b206IDMwcHg7XG4gICAgbGVmdDogMzBweDtcbiAgICBmb250LXNpemU6IDIwcHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHotaW5kZXg6IDk5OTk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xufVxuLl9kYXNoLXVuZG8tcmVkbyA+IGRpdiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuLl9kYXNoLXVuZG8tcmVkby1saW5rIHtcbiAgICBjb2xvcjogIzAwNzRkOTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBvcGFjaXR5OiAwLjI7XG59XG4uX2Rhc2gtdW5kby1yZWRvLWxpbms6aG92ZXIge1xuICAgIG9wYWNpdHk6IDE7XG59XG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsgLl9kYXNoLWljb24tdW5kbyB7XG4gICAgZm9udC1zaXplOiAyMHB4O1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7XG59XG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsgLl9kYXNoLWljb24tcmVkbyB7XG4gICAgZm9udC1zaXplOiAyMHB4O1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcbn1cbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtdW5kby1yZWRvLWxhYmVsIHtcbiAgICBmb250LXNpemU6IDE1cHg7XG59XG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9jb21wb25lbnRzL2NvcmUvVG9vbGJhci5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxlQUFlO0lBQ2YsWUFBWTtJQUNaLFVBQVU7SUFDVixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLGFBQWE7SUFDYiwwQ0FBMEM7QUFDOUM7QUFDQTtJQUNJLGtCQUFrQjtBQUN0QjtBQUNBO0lBQ0ksY0FBYztJQUNkLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLHFCQUFxQjtJQUNyQixZQUFZO0FBQ2hCO0FBQ0E7SUFDSSxVQUFVO0FBQ2Q7QUFDQTtJQUNJLGVBQWU7SUFDZix5QkFBeUI7QUFDN0I7QUFDQTtJQUNJLGVBQWU7SUFDZix3QkFBd0I7QUFDNUI7QUFDQTtJQUNJLGVBQWU7QUFDbkJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLl9kYXNoLXVuZG8tcmVkbyB7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgYm90dG9tOiAzMHB4O1xcbiAgICBsZWZ0OiAzMHB4O1xcbiAgICBmb250LXNpemU6IDIwcHg7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgei1pbmRleDogOTk5OTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcbn1cXG4uX2Rhc2gtdW5kby1yZWRvID4gZGl2IHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsge1xcbiAgICBjb2xvcjogIzAwNzRkOTtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcXG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIG9wYWNpdHk6IDAuMjtcXG59XFxuLl9kYXNoLXVuZG8tcmVkby1saW5rOmhvdmVyIHtcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuLl9kYXNoLXVuZG8tcmVkby1saW5rIC5fZGFzaC1pY29uLXVuZG8ge1xcbiAgICBmb250LXNpemU6IDIwcHg7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7XFxufVxcbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtaWNvbi1yZWRvIHtcXG4gICAgZm9udC1zaXplOiAyMHB4O1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XFxufVxcbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtdW5kby1yZWRvLWxhYmVsIHtcXG4gICAgZm9udC1zaXplOiAxNXB4O1xcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC5kYXNoLWNhbGxiYWNrLWRhZy0tY29udGFpbmVyIHtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgd2lkdGg6IDgwdnc7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGhlaWdodDogY2FsYygxMDB2aCAtIDc1cHgpO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAvKiBzaGFkb3ctMSAqL1xuICAgIGJveC1zaGFkb3c6IDBweCA2cHggMTZweCByZ2JhKDgwLCAxMDMsIDEzMiwgMC4xNjUpLFxuICAgICAgICAwcHggMnB4IDZweCByZ2JhKDgwLCAxMDMsIDEzMiwgMC4xMiksXG4gICAgICAgIDBweCAwcHggMXB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjMyKTtcbn1cblxuLmRhc2gtY2FsbGJhY2stZGFnLS1pbmZvIHtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHBhZGRpbmc6IDhweDtcbiAgICBib3R0b206IDE2cHg7XG4gICAgbGVmdDogMTZweDtcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDMycHgpO1xuICAgIG1heC1oZWlnaHQ6IDUwJTtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTtcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjY2NjO1xuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmO1xufVxuXG4uZGFzaC1jYWxsYmFjay1kYWctLW1lc3NhZ2Uge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBsaW5lLWhlaWdodDogMmVtO1xuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmO1xufVxuXG4uZGFzaC1jYWxsYmFjay1kYWctLWxheW91dFNlbGVjdG9yIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAzcHg7XG4gICAgcmlnaHQ6IDNweDtcbn1cbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLDBCQUEwQjtJQUMxQixnQkFBZ0I7SUFDaEIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixxQkFBcUI7SUFDckIsYUFBYTtJQUNiOzs0Q0FFd0M7QUFDNUM7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixZQUFZO0lBQ1osVUFBVTtJQUNWLDRCQUE0QjtJQUM1QixlQUFlO0lBQ2YsY0FBYztJQUNkLHNCQUFzQjtJQUN0QixvQ0FBb0M7SUFDcEMsc0JBQXNCO0lBQ3RCLGdDQUFnQztBQUNwQzs7QUFFQTtJQUNJLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGdDQUFnQztBQUNwQzs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsVUFBVTtBQUNkXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5kYXNoLWNhbGxiYWNrLWRhZy0tY29udGFpbmVyIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICB3aWR0aDogODB2dztcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBoZWlnaHQ6IGNhbGMoMTAwdmggLSA3NXB4KTtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICAvKiBzaGFkb3ctMSAqL1xcbiAgICBib3gtc2hhZG93OiAwcHggNnB4IDE2cHggcmdiYSg4MCwgMTAzLCAxMzIsIDAuMTY1KSxcXG4gICAgICAgIDBweCAycHggNnB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjEyKSxcXG4gICAgICAgIDBweCAwcHggMXB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjMyKTtcXG59XFxuXFxuLmRhc2gtY2FsbGJhY2stZGFnLS1pbmZvIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHBhZGRpbmc6IDhweDtcXG4gICAgYm90dG9tOiAxNnB4O1xcbiAgICBsZWZ0OiAxNnB4O1xcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDMycHgpO1xcbiAgICBtYXgtaGVpZ2h0OiA1MCU7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7XFxuICAgIGJvcmRlcjogMnB4IHNvbGlkICNjY2M7XFxuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmO1xcbn1cXG5cXG4uZGFzaC1jYWxsYmFjay1kYWctLW1lc3NhZ2Uge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgaGVpZ2h0OiAxMDAlO1xcbiAgICBsaW5lLWhlaWdodDogMmVtO1xcbiAgICBmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZjtcXG59XFxuXFxuLmRhc2gtY2FsbGJhY2stZGFnLS1sYXlvdXRTZWxlY3RvciB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAzcHg7XFxuICAgIHJpZ2h0OiAzcHg7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLmVycm9yLWNvbnRhaW5lciB7XG4gICAgcGFkZGluZzogMCAxMHB4O1xuICAgIGZvbnQtZmFtaWx5OiBDb3VyaWVyO1xufVxuXG4uZGFzaC1mZS1lcnJvcl9faWNvbi14IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIGNvbG9yOiAjYjljMmNlO1xuICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5kYXNoLWZlLWVycm9yX19pY29uLXg6aG92ZXIge1xuICAgIGNvbG9yOiAjYTFhOWI1O1xufVxuXG4uZGFzaC1mZS1lcnJvcnMge1xuICAgIG1pbi13aWR0aDogMzg2cHg7XG4gICAgbWF4LXdpZHRoOiA2NTBweDtcbiAgICBtYXgtaGVpZ2h0OiA0NTBweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5kYXNoLWZlLWVycm9yX19pY29uLWVycm9yIHtcbiAgICB3aWR0aDogMjBweDtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi1yaWdodDogMTZweDtcbn1cbi5kYXNoLWZlLWVycm9yX19pY29uLWNsb3NlIHtcbiAgICB3aWR0aDogMTBweDtcbiAgICBoZWlnaHQ6IDEwcHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAxMnB4O1xuICAgIHRvcDogMTJweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4uZGFzaC1mZS1lcnJvcl9faWNvbi1hcnJvdyB7XG4gICAgd2lkdGg6IDhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgbWFyZ2luOiAwcHggOHB4O1xufVxuLmRhc2gtZmUtZXJyb3ItdG9wX19ncm91cDpmaXJzdC1jaGlsZCB7XG4gICAgLypcbiAgICAgKiA3NyUgaXMgdGhlIG1heGltdW0gc3BhY2UgYWxsb3dlZCBiYXNlZCBvZmYgb2YgdGhlIG90aGVyIGVsZW1lbnRzXG4gICAgICogaW4gdGhlIHRvcCBwYXJ0IG9mIHRoZSBlcnJvciBjb250YWluZXIgKHRpbWVzdGFtcCAmIGNvbGxhcHNlIGFycm93KS5cbiAgICAgKiB0aGlzIHdhcyBtYW51YWxseSBkZXRlcm1pbmVkICovXG4gICAgd2lkdGg6IDc3JTtcbn1cbi5kYXNoLWZlLWVycm9yLXRvcF9fZ3JvdXAge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG4uZGFzaC1mZS1lcnJvcl9fdGl0bGUge1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgbWFyZ2luOiAwcHg7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICBwYWRkaW5nOiAwcHg7XG4gICAgZm9udC1zaXplOiAxMi42cHg7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBsaW5lLWhlaWdodDogMjBweDtcbn1cbi5kYXNoLWZlLWVycm9yX190aW1lc3RhbXAge1xuICAgIG1hcmdpbi1yaWdodDogMjBweDtcbn1cbi5kYXNoLWZlLWVycm9yX19jb2xsYXBzZS0tZmxpcHBlZCB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xuICAgIC1tcy10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XG59XG5cbi5kYXNoLWZlLWVycm9yX19pbmZvX3RpdGxlIHtcbiAgICBtYXJnaW46IDA7XG4gICAgY29sb3I6ICM1MDY3ODQ7XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2Y2ZmE7XG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDtcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xuICAgIHBhZGRpbmc6IDEwcHg7XG59XG5cbi5kYXNoLWZlLWVycm9yX19pbmZvIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGZlOGYzO1xuICAgIG1hcmdpbjogMCAwIDFlbSAwO1xuICAgIHBhZGRpbmc6IDEwcHg7XG5cbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjZGZlOGYzO1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbn1cblxuLmRhc2gtZmUtZXJyb3JfX2N1cnZlZCB7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuXG4uZGFzaC1mZS1lcnJvcl9fY3VydmVkLXRvcCB7XG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7XG4gICAgYm9yZGVyLWJvdHRvbS13aWR0aDogMHB4O1xufVxuXG4uZGFzaC1mZS1lcnJvcl9fY3VydmVkLWJvdHRvbSB7XG4gICAgYm9yZGVyLXJhZGl1cy1ib3R0b20tbGVmdDogNHB4O1xuICAgIGJvcmRlci1yYWRpdXMtYm90dG9tLXJpZ2h0OiA0cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZWZlZjtcbn1cblxuLmRhc2gtYmUtZXJyb3JfX3N0IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmRmM2Y0O1xuICAgIG1pbi13aWR0aDogMzg2cHg7XG4gICAgbWF4LXdpZHRoOiA2NTBweDtcbiAgICAvKiBpZnJhbWUgY29udGFpbmVyIGhhbmRsZXMgdGhlIHNjcm9sbGluZyAqL1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4uZGFzaC1iZS1lcnJvcl9fc3RyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNmZhO1xuICAgIG1pbi13aWR0aDogMzg2cHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgbGluZS1oZWlnaHQ6IDE3cHg7XG4gICAgbWFyZ2luLWJvdHRvbTogOHB4O1xufVxuXG4uZGFzaC1iYWNrZW5kLWVycm9yIHtcbiAgICBwYWRkaW5nOiA4cHg7XG59XG5cbi5kYXNoLWVycm9yLW1lbnUge1xuICAgIG1heC13aWR0aDogNTAlO1xuICAgIG1heC1oZWlnaHQ6IDYwJTtcbiAgICBkaXNwbGF5OiBjb250ZW50cztcbiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBmb250LXZhcmlhbnQtbGlnYXR1cmVzOiBjb21tb24tbGlnYXR1cmVzO1xuICAgIGNvbG9yOiByZ2IoNTAsIDUwLCA1MCk7XG59XG5cbi5kYXNoLWVycm9yLWNhcmQge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIC8qIHNoYWRvdy0xICovXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIGFuaW1hdGlvbjogZGFzaC1lcnJvci1jYXJkLWFuaW1hdGlvbiAwLjVzO1xuICAgIHBhZGRpbmc6IDI0cHg7XG4gICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICB3aWR0aDogMTAwJTtcbn1cbi5kYXNoLWVycm9yLWNhcmQtLWFsZXJ0cy10cmF5IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAtMzAwcHg7XG4gICAgbGVmdDogLTFweDtcbiAgICBhbmltYXRpb246IG5vbmU7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZWNlY2VjO1xuICAgIGJvcmRlci1ib3R0b206IDA7XG4gICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMHB4O1xuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwcHg7XG4gICAgd2lkdGg6IDQyMnB4O1xufVxuLmRhc2gtZXJyb3ItY2FyZC0tY29udGFpbmVyIHtcbiAgICBwYWRkaW5nOiAxNnB4O1xuICAgIHdpZHRoOiA2MDBweDtcbiAgICBtYXgtd2lkdGg6IDgwMHB4O1xuICAgIG1hcmdpbi1ib3R0b206IDRweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgYm94LXNoYWRvdzogMHB4IDAuN3B4IDEuNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDcpLFxuICAgICAgICAwcHggMS45cHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDUpLFxuICAgICAgICAwcHggNC41cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcbn1cblxuLmRhc2gtZXJyb3ItY2FyZF9fdG9wYmFyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDMycHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHBhZGRpbmctYm90dG9tOiAxNHB4O1xuICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG59XG4uZGFzaC1lcnJvci1jYXJkX19tZXNzYWdlIHtcbiAgICBmb250LXNpemU6IDE0cHg7XG59XG5cbi5kYXNoLWVycm9yLWNhcmRfX21lc3NhZ2UgPiBzdHJvbmcge1xuICAgIGNvbG9yOiAjZmY0NTAwO1xufVxuXG4uZGFzaC1lcnJvci1jYXJkX19jb250ZW50IHtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDE4NjYxYTtcbiAgICBmb250LXNpemU6IDEyLjZweDtcbn1cblxuLmRhc2gtZmUtZXJyb3ItaXRlbSB7XG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBwYWRkaW5nOiA4cHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5Aa2V5ZnJhbWVzIGRhc2gtZXJyb3ItY2FyZC1hbmltYXRpb24ge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEuMSk7XG4gICAgICAgIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEuMSk7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgfVxufVxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9lcnJvci9Gcm9udEVuZC9Gcm9udEVuZEVycm9yLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGVBQWU7SUFDZixvQkFBb0I7QUFDeEI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLE1BQU07SUFDTixjQUFjO0lBQ2QsZUFBZTtJQUNmLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksZ0JBQWdCO0lB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Q25CLFlBQVk7SUFDWixlQUFlO0FBQ25COztBQUVBO0lBQ0k7UUFDSSxVQUFVO1FBQ1YsNkJBQTZCO1FBQzdCLDBCQUEwQjtRQUMxQix5QkFBeUI7UUFDekIscUJBQXFCO0lBQ3pCO0lBQ0E7UUFDSSxVQUFVO1FBQ1YsMkJBQTJCO1FBQzNCLHdCQUF3QjtRQUN4Qix1QkFBdUI7UUFDdkIsbUJBQW1CO0lBQ3ZCO0FBQ0pcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmVycm9yLWNvbnRhaW5lciB7XFxuICAgIHBhZGRpbmc6IDAgMTBweDtcXG4gICAgZm9udC1mYW1pbHk6IENvdXJpZXI7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19pY29uLXgge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHJpZ2h0OiAwO1xcbiAgICB0b3A6IDA7XFxuICAgIGNvbG9yOiAjYjljMmNlO1xcbiAgICBmb250LXNpemU6IDIwcHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2ljb24teDpob3ZlciB7XFxuICAgIGNvbG9yOiAjYTFhOWI1O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcnMge1xcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xcbiAgICBtYXgtd2lkdGg6IDY1MHB4O1xcbiAgICBtYXgtaGVpZ2h0OiA0NTBweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9faWNvbi1lcnJvciB7XFxuICAgIHdpZHRoOiAyMHB4O1xcbiAgICBoZWlnaHQ6IDIwcHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgbWFyZ2luLXJpZ2h0OiAxNnB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9faWNvbi1jbG9zZSB7XFxuICAgIHdpZHRoOiAxMHB4O1xcbiAgICBoZWlnaHQ6IDEwcHg7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IDEycHg7XFxuICAgIHRvcDogMTJweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9faWNvbi1hcnJvdyB7XFxuICAgIHdpZHRoOiA4cHg7XFxuICAgIGhlaWdodDogMjhweDtcXG4gICAgbWFyZ2luOiAwcHggOHB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvci10b3BfX2dyb3VwOmZpcnN0LWNoaWxkIHtcXG4gICAgLypcXG4gICAgICogNzclIGlzIHRoZSBtYXhpbXVtIHNwYWNlIGFsbG93ZWQgYmFzZWQgb2ZmIG9mIHRoZSBvdGhlciBlbGVtZW50c1xcbiAgICAgKiBpbiB0aGUgdG9wIHBhcnQgb2YgdGhlIGVycm9yIGNvbnRhaW5lciAodGltZXN0YW1wICYgY29sbGFwc2UgYXJyb3cpLlxcbiAgICAgKiB0aGlzIHdhcyBtYW51YWxseSBkZXRlcm1pbmVkICovXFxuICAgIHdpZHRoOiA3NyU7XFxufVxcbi5kYXNoLWZlLWVycm9yLXRvcF9fZ3JvdXAge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuLmRhc2gtZmUtZXJyb3JfX3RpdGxlIHtcXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcXG4gICAgbWFyZ2luOiAwcHg7XFxuICAgIG1hcmdpbi1sZWZ0OiA1cHg7XFxuICAgIHBhZGRpbmc6IDBweDtcXG4gICAgZm9udC1zaXplOiAxMi42cHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxuICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9fdGltZXN0YW1wIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiAyMHB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9fY29sbGFwc2UtLWZsaXBwZWQge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICAgIC1tcy10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9faW5mb190aXRsZSB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgY29sb3I6ICM1MDY3ODQ7XFxuICAgIGZvbnQtc2l6ZTogMTZweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YzZjZmYTtcXG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xcbiAgICBwYWRkaW5nOiAxMHB4O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9faW5mbyB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZmU4ZjM7XFxuICAgIG1hcmdpbjogMCAwIDFlbSAwO1xcbiAgICBwYWRkaW5nOiAxMHB4O1xcblxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcXG4gICAgY29sb3I6ICM1MDY3ODQ7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19jdXJ2ZWQge1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19jdXJ2ZWQtdG9wIHtcXG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItYm90dG9tLXdpZHRoOiAwcHg7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19jdXJ2ZWQtYm90dG9tIHtcXG4gICAgYm9yZGVyLXJhZGl1cy1ib3R0b20tbGVmdDogNHB4O1xcbiAgICBib3JkZXItcmFkaXVzLWJvdHRvbS1yaWdodDogNHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZlZmVmO1xcbn1cXG5cXG4uZGFzaC1iZS1lcnJvcl9fc3Qge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmRmM2Y0O1xcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xcbiAgICBtYXgtd2lkdGg6IDY1MHB4O1xcbiAgICAvKiBpZnJhbWUgY29udGFpbmVyIGhhbmRsZXMgdGhlIHNjcm9sbGluZyAqL1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcblxcbi5kYXNoLWJlLWVycm9yX19zdHIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNmZhO1xcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIGxpbmUtaGVpZ2h0OiAxN3B4O1xcbiAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxufVxcblxcbi5kYXNoLWJhY2tlbmQtZXJyb3Ige1xcbiAgICBwYWRkaW5nOiA4cHg7XFxufVxcblxcbi5kYXNoLWVycm9yLW1lbnUge1xcbiAgICBtYXgtd2lkdGg6IDUwJTtcXG4gICAgbWF4LWhlaWdodDogNjAlO1xcbiAgICBkaXNwbGF5OiBjb250ZW50cztcXG4gICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBmb250LXZhcmlhbnQtbGlnYXR1cmVzOiBjb21tb24tbGlnYXR1cmVzO1xcbiAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbn1cXG5cXG4uZGFzaC1lcnJvci1jYXJkIHtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICAvKiBzaGFkb3ctMSAqL1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGFuaW1hdGlvbjogZGFzaC1lcnJvci1jYXJkLWFuaW1hdGlvbiAwLjVzO1xcbiAgICBwYWRkaW5nOiAyNHB4O1xcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcXG4gICAgd2lkdGg6IDEwMCU7XFxufVxcbi5kYXNoLWVycm9yLWNhcmQtLWFsZXJ0cy10cmF5IHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IC0zMDBweDtcXG4gICAgbGVmdDogLTFweDtcXG4gICAgYW5pbWF0aW9uOiBub25lO1xcbiAgICBib3gtc2hhZG93OiBub25lO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZWNlY2VjO1xcbiAgICBib3JkZXItYm90dG9tOiAwO1xcbiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwcHg7XFxuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwcHg7XFxuICAgIHdpZHRoOiA0MjJweDtcXG59XFxuLmRhc2gtZXJyb3ItY2FyZC0tY29udGFpbmVyIHtcXG4gICAgcGFkZGluZzogMTZweDtcXG4gICAgd2lkdGg6IDYwMHB4O1xcbiAgICBtYXgtd2lkdGg6IDgwMHB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiA0cHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBib3gtc2hhZG93OiAwcHggMC43cHggMS40cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNyksXFxuICAgICAgICAwcHggMS45cHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDUpLFxcbiAgICAgICAgMHB4IDQuNXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XFxufVxcblxcbi5kYXNoLWVycm9yLWNhcmRfX3RvcGJhciB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDMycHg7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHBhZGRpbmctYm90dG9tOiAxNHB4O1xcbiAgICBmb250LXdlaWdodDogNzAwO1xcbn1cXG4uZGFzaC1lcnJvci1jYXJkX19tZXNzYWdlIHtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbn1cXG5cXG4uZGFzaC1lcnJvci1jYXJkX19tZXNzYWdlID4gc3Ryb25nIHtcXG4gICAgY29sb3I6ICNmZjQ1MDA7XFxufVxcblxcbi5kYXNoLWVycm9yLWNhcmRfX2NvbnRlbnQge1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjMDAxODY2MWE7XFxuICAgIGZvbnQtc2l6ZTogMTIuNnB4O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvci1pdGVtIHtcXG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcXG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHBhZGRpbmc6IDhweDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG5Aa2V5ZnJhbWVzIGRhc2gtZXJyb3ItY2FyZC1hbmltYXRpb24ge1xcbiAgICBmcm9tIHtcXG4gICAgICAgIG9wYWNpdHk6IDA7XFxuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxLjEpO1xcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgfVxcbiAgICB0byB7XFxuICAgICAgICBvcGFjaXR5OiAxO1xcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMSk7XFxuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICB9XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLnBlcmN5LXNob3cge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbkBtZWRpYSBvbmx5IHBlcmN5IHtcbiAgICAucGVyY3ktaGlkZSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICAgIC5wZXJjeS1zaG93IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxufVxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9lcnJvci9QZXJjeS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxhQUFhO0FBQ2pCOztBQUVBO0lBQ0k7UUFDSSxhQUFhO0lBQ2pCO0lBQ0E7UUFDSSxjQUFjO0lBQ2xCO0FBQ0pcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLnBlcmN5LXNob3cge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG5AbWVkaWEgb25seSBwZXJjeSB7XFxuICAgIC5wZXJjeS1oaWRlIHtcXG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIH1cXG4gICAgLnBlcmN5LXNob3cge1xcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XFxuICAgIH1cXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuZGFzaC1kZWJ1Zy1tZW51IHtcbiAgICB0cmFuc2l0aW9uOiAwLjNzO1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICBib3R0b206IDM1cHg7XG4gICAgcmlnaHQ6IDM1cHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHotaW5kZXg6IDEwMDAxO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMxMTlkZmY7XG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgICB3aWR0aDogNjRweDtcbiAgICBoZWlnaHQ6IDY0cHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuLmRhc2gtZGVidWctbWVudS0tb3BlbiB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoLTE4MGRlZyk7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIGJ1dHRvbiB7XG4gICAgaGVpZ2h0OiBhdXRvO1xuICAgIHBhZGRpbmc6IDAgOHB4O1xuICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG4gICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDBweDtcbiAgICBsZXR0ZXItc3BhY2luZzogbm9ybWFsO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgZ2FwOiA2cHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIG91dGxpbmU6IG5vbmU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X19wb3B1cCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3R0b206IDEwMCU7XG4gICAgcmlnaHQ6IDA7XG4gICAgZ2FwOiA4cHg7XG4gICAgbWF4LWhlaWdodDogY2FsYygxMDB2aCAtIDc1cHgpO1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB3aWR0aDogNDI2cHg7XG4gICAgcGFkZGluZzogMTZweDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgIGdhcDogOHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDI0LCAxMDIsIDAuMSk7XG4gICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgLyogU2hhZG93L1NtYWxsICovXG4gICAgYm94LXNoYWRvdzogMHB4IDAuN3B4IDEuNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDcpLFxuICAgICAgICAwcHggMS45cHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDUpLFxuICAgICAgICAwcHggNC41cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X190ZXh0IHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fdGV4dCBhIHtcbiAgICBjb2xvcjogIzdmNGJjNDtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fdGV4dCBzcGFuIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDVweDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0IGJ1dHRvbiB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBoZWlnaHQ6IDI0cHg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgbGluZS1oZWlnaHQ6IDE4cHg7XG4gICAgcGFkZGluZzogMTZweCAxMnB4O1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX2J1dHRvbnMtY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGdhcDogOHB4O1xuICAgIGFsaWduLXNlbGY6IHN0cmV0Y2g7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgcGFkZGluZy10b3A6IDE2cHg7XG4gICAgbWFyZ2luLXRvcDogMTZweDtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgwLCAyNCwgMTAyLCAwLjEpO1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX2J1dHRvbi1wcmltYXJ5IHtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgY29sb3I6ICNmZmY7XG4gICAgYmFja2dyb3VuZDogIzdmNGJjNDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X19idXR0b24tc2Vjb25kYXJ5IHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE2MSwgODksIDI1NSwgMC4wNSk7XG4gICAgY29sb3I6ICM3ZjRiYzQ7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMzQsIDc0LCAyMTIsIDAuOCk7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnU6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM3ZjRiYzQ7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIHtcbiAgICB0cmFuc2l0aW9uOiAwLjNzO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIGJvdHRvbTogLTFweDtcbiAgICByaWdodDogLTFweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGNvbG9yOiBibGFjaztcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB6LWluZGV4OiAxMDAwMDtcbiAgICBib3JkZXItcmFkaXVzOiA1cHggMCAwIDA7XG4gICAgcGFkZGluZzogMTVweCAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNWY2ZmE7XG4gICAgYm94LXNoYWRvdzogMHB4IDAuOHB4IDAuOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDQpLFxuICAgICAgICAwcHggMi4zcHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDMpO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMjQsIDEwMiwgMC4xKTtcbn1cbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyLmRhc2gtZGVidWctbWVudV9fb3V0ZXItLWNvbGxhcHNlZCB7XG4gICAgbWF4LXdpZHRoOiA1MHB4O1xufVxuLmRhc2gtZGVidWctbWVudV9fb3V0ZXIuZGFzaC1kZWJ1Zy1tZW51X19vdXRlci0tZXhwYW5kZWQge1xuICAgIG1heC13aWR0aDogY2FsYygxMDB2dyAtIDUwcHgpO1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLXRvb2x0aXAge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3R0b206IGNhbGMoMTAwJSArIDEycHgpO1xuICAgIHJpZ2h0OiAwO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMTg2NjFhO1xuICAgIHBhZGRpbmc6IDExcHg7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAxNHB4IDVweCAjMDAwMDAwMTI7XG4gICAgei1pbmRleDogMTIwMDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fdG9nZ2xlIHtcbiAgICBjb2xvcjogIzdmNGJjNDtcbiAgICB0cmFuc2l0aW9uOiAwLjNzO1xufVxuLmRhc2gtZGVidWctbWVudV9fdG9nZ2xlLS1leHBhbmRlZCB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbn1cbi5kYXNoLWRlYnVnLW1lbnVfX2Vycm9yLWluZGljYXRvciB7XG4gICAgd2lkdGg6IDhweDtcbiAgICBoZWlnaHQ6IDhweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjREMzRTQyO1xuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAzcHg7XG4gICAgdG9wOiAxM3B4O1xufVxuLmRhc2gtZGVidWctbWVudV9fc3RhdHVzIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZ2FwOiA2cHg7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX2NvbnRlbnQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gICAgbWFyZ2luLWxlZnQ6IDE1cHg7XG4gICAgdHJhbnNpdGlvbjogYWxsIDAuNXMgZWFzZTtcbiAgICBmbGV4LXNocmluazogMDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fZGl2aWRlciB7XG4gICAgd2lkdGg6IDEuNXB4O1xuICAgIGhlaWdodDogMjZweDtcbiAgICBtYXJnaW46IDBweCAxM3B4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDE1NTk0ZDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uIHtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3gtc2hhZG93OiAwIDFweCAjZDNkYWU2O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG4gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcbiAgICBjb2xvcjogIzdmNGJjNDtcbn1cblxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1zZWxlY3RlZCB7XG4gICAgY29sb3I6ICM3ZjRiYzQ7XG4gICAgYm94LXNoYWRvdzogMCAycHggIzdmNGJjNDtcbn1cbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tc2VsZWN0ZWQ6aG92ZXIge1xuICAgIGNvbG9yOiAjNTgwNmM0O1xufVxuXG4uZGFzaC1kZWJ1Zy1hbGVydCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGZvbnQtc2l6ZTogMTBweDtcbn1cblxuLmRhc2gtZGVidWctYWxlcnQtbGFiZWwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIGJvdHRvbTogODFweDtcbiAgICByaWdodDogMjlweDtcbiAgICB6LWluZGV4OiAxMDAwMjtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjI1KSxcbiAgICAgICAgMHB4IDFweCAzcHggcmdiYSgxNjIsIDE3NywgMTk4LCAwLjMyKTtcbiAgICBib3JkZXItcmFkaXVzOiAzMnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIHBhZGRpbmc6IDRweDtcbiAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X19lcnJvci1jb3VudCB7XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICAgIGNvbG9yOiAjZmZmO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNjNzNhM2E7XG4gICAgcGFkZGluZzogM3B4IDVweDtcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XG59XG5cbi5kYXNoLWRlYnVnLWRpc2Nvbm5lY3RlZCB7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIG1hcmdpbi1sZWZ0OiAzcHg7XG59XG4uZGFzaC1kZWJ1Zy1tZW51X19pY29uIHtcbiAgICBjb2xvcjogIzljYTNhZjtcbn1cbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbjpob3ZlciAuZGFzaC1kZWJ1Zy1tZW51X19pY29uIHtcbiAgICBjb2xvcjogIzU4MDZjNDtcbn1cbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9EZWJ1Z01lbnUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixZQUFZO0lBQ1osV0FBVztJQUNYLGFBQWE7SUFDYix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLGNBQWM7SUFDZCx5QkFBeUI7SUFDekIsbUJBQW1CO0lBQ25CLFdBQVc7SUFDWCxZQUFZO0lBQ1osZUFBZTtBQUNuQjtBQUNBO0lBQ0ksMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLGNBQWM7SUFDZCxtQkFBbUI7SUFDbkIsb0JBQW9CO0lBQ3BCLGVBQWU7SUFDZixrQkFBa0I7SUFDbEIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixRQUFRO0lBQ1IsZUFBZTtJQUNmLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsYUFBYTtJQUNiLGFBQWE7SUFDYixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixZ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QUN6QixnQkFBZ0I7SUFDaEIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksZUFBZTtJQUNmLGdCQUFnQjtBQUNwQjtBQUNBO0lBQ0ksY0FBYztBQUNsQjtBQUNBO0lBQ0ksY0FBYztBQUNsQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuZGFzaC1kZWJ1Zy1tZW51IHtcXG4gICAgdHJhbnNpdGlvbjogMC4zcztcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBib3R0b206IDM1cHg7XFxuICAgIHJpZ2h0OiAzNXB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgei1pbmRleDogMTAwMDE7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMxMTlkZmY7XFxuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XFxuICAgIHdpZHRoOiA2NHB4O1xcbiAgICBoZWlnaHQ6IDY0cHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLmRhc2gtZGVidWctbWVudS0tb3BlbiB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKC0xODBkZWcpO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19vdXRlciBidXR0b24ge1xcbiAgICBoZWlnaHQ6IGF1dG87XFxuICAgIHBhZGRpbmc6IDAgOHB4O1xcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xcbiAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiAwcHg7XFxuICAgIGxldHRlci1zcGFjaW5nOiBub3JtYWw7XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIGdhcDogNnB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgYmFja2dyb3VuZDogbm9uZTtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fcG9wdXAge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJvdHRvbTogMTAwJTtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIGdhcDogOHB4O1xcbiAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNzVweCk7XFxuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIHdpZHRoOiA0MjZweDtcXG4gICAgcGFkZGluZzogMTZweDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XFxuICAgIGdhcDogOHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiA4cHg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMjQsIDEwMiwgMC4xKTtcXG4gICAgYmFja2dyb3VuZDogI2ZmZjtcXG4gICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgLyogU2hhZG93L1NtYWxsICovXFxuICAgIGJveC1zaGFkb3c6IDBweCAwLjdweCAxLjRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjA3KSxcXG4gICAgICAgIDBweCAxLjlweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNSksXFxuICAgICAgICAwcHggNC41cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X190ZXh0IHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX3RleHQgYSB7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fdGV4dCBzcGFuIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dCBidXR0b24ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBoZWlnaHQ6IDI0cHg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgbGluZS1oZWlnaHQ6IDE4cHg7XFxuICAgIHBhZGRpbmc6IDE2cHggMTJweDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X19idXR0b25zLWNvbnRhaW5lciB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGdhcDogOHB4O1xcbiAgICBhbGlnbi1zZWxmOiBzdHJldGNoO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgcGFkZGluZy10b3A6IDE2cHg7XFxuICAgIG1hcmdpbi10b3A6IDE2cHg7XFxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDI0LCAxMDIsIDAuMSk7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fYnV0dG9uLXByaW1hcnkge1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIGNvbG9yOiAjZmZmO1xcbiAgICBiYWNrZ3JvdW5kOiAjN2Y0YmM0O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX2J1dHRvbi1zZWNvbmRhcnkge1xcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE2MSwgODksIDI1NSwgMC4wNSk7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDEzNCwgNzQsIDIxMiwgMC44KTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudTpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM3ZjRiYzQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIHtcXG4gICAgdHJhbnNpdGlvbjogMC4zcztcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBib3R0b206IC0xcHg7XFxuICAgIHJpZ2h0OiAtMXB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBjb2xvcjogYmxhY2s7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgei1pbmRleDogMTAwMDA7XFxuICAgIGJvcmRlci1yYWRpdXM6IDVweCAwIDAgMDtcXG4gICAgcGFkZGluZzogMTVweCAwO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNmZhO1xcbiAgICBib3gtc2hhZG93OiAwcHggMC44cHggMC44cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNCksXFxuICAgICAgICAwcHggMi4zcHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDMpO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDI0LCAxMDIsIDAuMSk7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyLmRhc2gtZGVidWctbWVudV9fb3V0ZXItLWNvbGxhcHNlZCB7XFxuICAgIG1heC13aWR0aDogNTBweDtcXG59XFxuLmRhc2gtZGVidWctbWVudV9fb3V0ZXIuZGFzaC1kZWJ1Zy1tZW51X19vdXRlci0tZXhwYW5kZWQge1xcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSA1MHB4KTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS10b29sdGlwIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBib3R0b206IGNhbGMoMTAwJSArIDEycHgpO1xcbiAgICByaWdodDogMDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMTg2NjFhO1xcbiAgICBwYWRkaW5nOiAxMXB4O1xcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDE0cHggNXB4ICMwMDAwMDAxMjtcXG4gICAgei1pbmRleDogMTIwMDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdG9nZ2xlIHtcXG4gICAgY29sb3I6ICM3ZjRiYzQ7XFxuICAgIHRyYW5zaXRpb246IDAuM3M7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX3RvZ2dsZS0tZXhwYW5kZWQge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbn1cXG4uZGFzaC1kZWJ1Zy1tZW51X19lcnJvci1pbmRpY2F0b3Ige1xcbiAgICB3aWR0aDogOHB4O1xcbiAgICBoZWlnaHQ6IDhweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0RDM0U0MjtcXG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICByaWdodDogM3B4O1xcbiAgICB0b3A6IDEzcHg7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX3N0YXR1cyB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGdhcDogNnB4O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19jb250ZW50IHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XFxuICAgIG1hcmdpbi1sZWZ0OiAxNXB4O1xcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC41cyBlYXNlO1xcbiAgICBmbGV4LXNocmluazogMDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbiB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fZGl2aWRlciB7XFxuICAgIHdpZHRoOiAxLjVweDtcXG4gICAgaGVpZ2h0OiAyNnB4O1xcbiAgICBtYXJnaW46IDBweCAxM3B4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAxNTU5NGQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbiB7XFxuICAgIGJhY2tncm91bmQ6IG5vbmU7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgYm94LXNoYWRvdzogMCAxcHggI2QzZGFlNjtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4ycztcXG4gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcXG4gICAgY29sb3I6ICM3ZjRiYzQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tc2VsZWN0ZWQge1xcbiAgICBjb2xvcjogIzdmNGJjNDtcXG4gICAgYm94LXNoYWRvdzogMCAycHggIzdmNGJjNDtcXG59XFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1zZWxlY3RlZDpob3ZlciB7XFxuICAgIGNvbG9yOiAjNTgwNmM0O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1hbGVydCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGZvbnQtc2l6ZTogMTBweDtcXG59XFxuXFxuLmRhc2gtZGVidWctYWxlcnQtbGFiZWwge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgIGJvdHRvbTogODFweDtcXG4gICAgcmlnaHQ6IDI5cHg7XFxuICAgIHotaW5kZXg6IDEwMDAyO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4yNSksXFxuICAgICAgICAwcHggMXB4IDNweCByZ2JhKDE2MiwgMTc3LCAxOTgsIDAuMzIpO1xcbiAgICBib3JkZXItcmFkaXVzOiAzMnB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgcGFkZGluZzogNHB4O1xcbiAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19lcnJvci1jb3VudCB7XFxuICAgIGZvbnQtc2l6ZTogMTJweDtcXG4gICAgY29sb3I6ICNmZmY7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNjNzNhM2E7XFxuICAgIHBhZGRpbmc6IDNweCA1cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcXG59XFxuXFxuLmRhc2gtZGVidWctZGlzY29ubmVjdGVkIHtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBtYXJnaW4tbGVmdDogM3B4O1xcbn1cXG4uZGFzaC1kZWJ1Zy1tZW51X19pY29uIHtcXG4gICAgY29sb3I6ICM5Y2EzYWY7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbjpob3ZlciAuZGFzaC1kZWJ1Zy1tZW51X19pY29uIHtcXG4gICAgY29sb3I6ICM1ODA2YzQ7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLypcbiAgICBTYW1lIGFzIGluIHBsb3RseS1jbG91ZCBidXQgd2l0aG91dCB0aGUgcHVibGlzaFxuICAgIGluIHRoZSBuYW1lIHRvIGF2b2lkIGZ1dHVyZSBjb25mbGljdHMgaWYgY2hhbmdlZFxuICAgIHVwc3RyZWFtLlxuKi9cbi5wbG90bHktY2xvdWQtbW9kYWwtb3ZlcmxheSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJvdHRvbTogMTAwJTtcbiAgICBsZWZ0OiAtMXB4O1xuICAgIHotaW5kZXg6IDEwMDAwO1xufVxuXG4ucGxvdGx5LWNsb3VkLW1vZGFsLWNvbnRlbnQge1xuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICB3aWR0aDogNTIycHg7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2QxZDVkYjtcbiAgICBib3JkZXItcmFkaXVzOiA0cHggNHB4IDAgMDtcbiAgICBib3gtc2hhZG93OiAwIC00cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4wOCk7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnBsb3RseS1jbG91ZC1tb2RhbC1oZWFkZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgcGFkZGluZzogMTZweCAyMHB4O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTVlNWU1O1xuICAgIGJhY2tncm91bmQ6ICNmOWZhZmI7XG59XG5cbi5wbG90bHktY2xvdWQtbW9kYWwtaGVhZGVyIGgzIHtcbiAgICBtYXJnaW46IDA7XG4gICAgY29sb3I6ICMzMzM7XG59XG5cbi5wbG90bHktY2xvdWQtbW9kYWwtY2xvc2Uge1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGZvbnQtc2l6ZTogMjRweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgY29sb3I6ICM2NjY7XG4gICAgcGFkZGluZzogMDtcbiAgICB3aWR0aDogMzBweDtcbiAgICBoZWlnaHQ6IDMwcHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4ucGxvdGx5LWNsb3VkLW1vZGFsLWNsb3NlOmhvdmVyIHtcbiAgICBjb2xvcjogIzMzMztcbn1cblxuLnBsb3RseS1jbG91ZC1tb2RhbC1ib2R5IHtcbiAgICBwYWRkaW5nOiAyMHB4O1xuICAgIGNvbG9yOiBibGFjayAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiAxMDA7XG59XG5idXR0b24ucGxvdGx5LWNsb3VkLW1vZGFsLWJ1dHRvbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDZweDtcbiAgICBwYWRkaW5nOiA2cHggMTBweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweCAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiA2MDAgIWltcG9ydGFudDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgYmFja2dyb3VuZDogIzhiNWNmNjtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgYm9yZGVyLWNvbG9yOiAjN2MzYWVkO1xufVxuXG4ucGxvdGx5LWNsb3VkLW1vZGFsLWJ1dHRvbjpkaXNhYmxlZCB7XG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cbi5wbG90bHktY2xvdWQtY29weS1pbnN0YWxsIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGdhcDogMTBweDtcbiAgICBwYWRkaW5nOiA4cHggMTBweDtcbiAgICBiYWNrZ3JvdW5kOiAjZjlmYWZiO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNlNWU3ZWI7XG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgIG1hcmdpbi10b3A6IDhweDtcbn1cbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9QbG90bHlDbG91ZC5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7Ozs7Q0FJQztBQUNEO0lBQ0ksa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixVQUFVO0lBQ1YsY0FBYztBQUNsQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixZQUFZO0lBQ1osaUJBQWlCO0lBQ2pCLHlCQUF5QjtJQUN6QiwwQkFBMEI7SUFDMUIsMENBQTBDO0lBQzFDLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGFBQWE7SUFDYiw4QkFBOEI7SUFDOUIsbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUNsQixnQ0FBZ0M7SUFDaEMsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksU0FBUztJQUNULFdBQVc7QUFDZjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixZQUFZO0lBQ1osZUFBZTtJQUNmLGVBQWU7SUFDZixXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxZQUFZO0lBQ1osYUFBYTtJQUNiLG1CQUFtQjtJQUNuQix1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsdUJBQXVCO0lBQ3ZCLGdCQUFnQjtBQUNwQjtBQUNBO0lBQ0ksb0JBQW9CO0lBQ3BCLG1CQUFtQjtJQUNuQixRQUFRO0lBQ1IsNEJBQTRCO0lBQzVCLDZCQUE2QjtJQUM3QiwwQkFBMEI7SUFDMUIsMkJBQTJCO0lBQzNCLGVBQWU7SUFDZiw2QkFBNkI7SUFDN0IsbUJBQW1CO0lBQ25CLFlBQVk7SUFDWixxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSxtQkFBbUI7QUFDdkI7QUFDQTtJQUNJLGFBQWE7SUFDYixtQkFBbUI7SUFDbkIsOEJBQThCO0lBQzlCLFNBQVM7SUFDVCxpQkFBaUI7SUFDakIsbUJBQW1CO0lBQ25CLHlCQUF5QjtJQUN6QixrQkFBa0I7SUFDbEIsZUFBZTtBQUNuQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIvKlxcbiAgICBTYW1lIGFzIGluIHBsb3RseS1jbG91ZCBidXQgd2l0aG91dCB0aGUgcHVibGlzaFxcbiAgICBpbiB0aGUgbmFtZSB0byBhdm9pZCBmdXR1cmUgY29uZmxpY3RzIGlmIGNoYW5nZWRcXG4gICAgdXBzdHJlYW0uXFxuKi9cXG4ucGxvdGx5LWNsb3VkLW1vZGFsLW92ZXJsYXkge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJvdHRvbTogMTAwJTtcXG4gICAgbGVmdDogLTFweDtcXG4gICAgei1pbmRleDogMTAwMDA7XFxufVxcblxcbi5wbG90bHktY2xvdWQtbW9kYWwtY29udGVudCB7XFxuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcXG4gICAgd2lkdGg6IDUyMnB4O1xcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2QxZDVkYjtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4IDRweCAwIDA7XFxuICAgIGJveC1zaGFkb3c6IDAgLTRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjA4KTtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuXFxuLnBsb3RseS1jbG91ZC1tb2RhbC1oZWFkZXIge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHBhZGRpbmc6IDE2cHggMjBweDtcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNWU1ZTU7XFxuICAgIGJhY2tncm91bmQ6ICNmOWZhZmI7XFxufVxcblxcbi5wbG90bHktY2xvdWQtbW9kYWwtaGVhZGVyIGgzIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBjb2xvcjogIzMzMztcXG59XFxuXFxuLnBsb3RseS1jbG91ZC1tb2RhbC1jbG9zZSB7XFxuICAgIGJhY2tncm91bmQ6IG5vbmU7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgZm9udC1zaXplOiAyNHB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGNvbG9yOiAjNjY2O1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICB3aWR0aDogMzBweDtcXG4gICAgaGVpZ2h0OiAzMHB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG59XFxuXFxuLnBsb3RseS1jbG91ZC1tb2RhbC1jbG9zZTpob3ZlciB7XFxuICAgIGNvbG9yOiAjMzMzO1xcbn1cXG5cXG4ucGxvdGx5LWNsb3VkLW1vZGFsLWJvZHkge1xcbiAgICBwYWRkaW5nOiAyMHB4O1xcbiAgICBjb2xvcjogYmxhY2sgIWltcG9ydGFudDtcXG4gICAgZm9udC13ZWlnaHQ6IDEwMDtcXG59XFxuYnV0dG9uLnBsb3RseS1jbG91ZC1tb2RhbC1idXR0b24ge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgZ2FwOiA2cHg7XFxuICAgIHBhZGRpbmc6IDZweCAxMHB4ICFpbXBvcnRhbnQ7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweCAhaW1wb3J0YW50O1xcbiAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcXG4gICAgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgICBiYWNrZ3JvdW5kOiAjOGI1Y2Y2O1xcbiAgICBjb2xvcjogd2hpdGU7XFxuICAgIGJvcmRlci1jb2xvcjogIzdjM2FlZDtcXG59XFxuXFxuLnBsb3RseS1jbG91ZC1tb2RhbC1idXR0b246ZGlzYWJsZWQge1xcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xcbn1cXG4ucGxvdGx5LWNsb3VkLWNvcHktaW5zdGFsbCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG4gICAgZ2FwOiAxMHB4O1xcbiAgICBwYWRkaW5nOiA4cHggMTBweDtcXG4gICAgYmFja2dyb3VuZDogI2Y5ZmFmYjtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2U1ZTdlYjtcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBtYXJnaW4tdG9wOiA4cHg7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS10b29sdGlwIGJ1dHRvbixcbi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtdG9vbHRpcCBhIHtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgcGFkZGluZzogMnB4IDVweDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIGNvbG9yOiAjN2Y0YmM0O1xuICAgIGZvbnQtc2l6ZTogMTBwdDtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcbiAgICBmb250LXdlaWdodDogNTAwO1xuICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtdG9vbHRpcDphZnRlciB7XG4gICAgY29udGVudDogJyAnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDEwMCU7XG4gICAgbGVmdDogNTAlO1xuICAgIG1hcmdpbi1sZWZ0OiAtNXB4O1xuICAgIGJvcmRlci13aWR0aDogMTBweDtcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICAgIGJvcmRlci1jb2xvcjogd2hpdGUgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XG59XG5cbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIGJ1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtYnV0dG9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYTE1OWZmMGQ7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzg2NGFkNDMzO1xuICAgIGNvbG9yOiAjN2Y0YmM0O1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGhlaWdodDogMjBweDtcbiAgICBwYWRkaW5nOiAwcHggOHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICBmb250LXdlaWdodDogNTAwO1xufVxuXG4uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLWJ1dHRvbjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzg2NGFkNDMzO1xuICAgIGJvcmRlci1jb2xvcjogIzg2NGFkNDMzO1xuICAgIGNvbG9yOiAjN2Y0YmM0O1xufVxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L1ZlcnNpb25JbmZvLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTs7SUFFSSxpQkFBaUI7SUFDakIsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixtQkFBbUI7SUFDbkIsY0FBYztJQUNkLGVBQWU7SUFDZixxQkFBcUI7SUFDckIsZUFBZTtJQUNmLGFBQWE7SUFDYiwyQ0FBMkM7SUFDM0MsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsU0FBUztJQUNULFNBQVM7SUFDVCxpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQix1REFBdUQ7QUFDM0Q7O0FBRUE7SUFDSSwyQkFBMkI7SUFDM0IsMkJBQTJCO0lBQzNCLGNBQWM7SUFDZCxpQkFBaUI7SUFDakIsMkNBQTJDO0lBQzNDLGVBQWU7SUFDZixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSwyQkFBMkI7SUFDM0IsdUJBQXVCO0lBQ3ZCLGNBQWM7QUFDbEJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS10b29sdGlwIGJ1dHRvbixcXG4uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLXRvb2x0aXAgYSB7XFxuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIHBhZGRpbmc6IDJweCA1cHg7XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICBmb250LXNpemU6IDEwcHQ7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZiAhaW1wb3J0YW50O1xcbiAgICBmb250LXdlaWdodDogNTAwO1xcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLXRvb2x0aXA6YWZ0ZXIge1xcbiAgICBjb250ZW50OiAnICc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAxMDAlO1xcbiAgICBsZWZ0OiA1MCU7XFxuICAgIG1hcmdpbi1sZWZ0OiAtNXB4O1xcbiAgICBib3JkZXItd2lkdGg6IDEwcHg7XFxuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XFxuICAgIGJvcmRlci1jb2xvcjogd2hpdGUgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIGJ1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtYnV0dG9uIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ExNTlmZjBkO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjODY0YWQ0MzM7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcXG4gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBoZWlnaHQ6IDIwcHg7XFxuICAgIHBhZGRpbmc6IDBweCA4cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcXG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS1idXR0b246aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODY0YWQ0MzM7XFxuICAgIGJvcmRlci1jb2xvcjogIzg2NGFkNDMzO1xcbiAgICBjb2xvcjogIzdmNGJjNDtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJkYWdyZVwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXCJkYWdyZVwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJjeXRvc2NhcGVEYWdyZVwiXSA9IGZhY3RvcnkocmVxdWlyZShcImRhZ3JlXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJjeXRvc2NhcGVEYWdyZVwiXSA9IGZhY3Rvcnkocm9vdFtcImRhZ3JlXCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzRfXykge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vKioqKioqLyBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuLyoqKioqKi8gXHRcdHJldHVybiBucztcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBpbXBsID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTsgLy8gcmVnaXN0ZXJzIHRoZSBleHRlbnNpb24gb24gYSBjeXRvc2NhcGUgbGliIHJlZlxuXG5cbnZhciByZWdpc3RlciA9IGZ1bmN0aW9uIHJlZ2lzdGVyKGN5dG9zY2FwZSkge1xuICBpZiAoIWN5dG9zY2FwZSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBjYW4ndCByZWdpc3RlciBpZiBjeXRvc2NhcGUgdW5zcGVjaWZpZWRcblxuXG4gIGN5dG9zY2FwZSgnbGF5b3V0JywgJ2RhZ3JlJywgaW1wbCk7IC8vIHJlZ2lzdGVyIHdpdGggY3l0b3NjYXBlLmpzXG59O1xuXG5pZiAodHlwZW9mIGN5dG9zY2FwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gZXhwb3NlIHRvIGdsb2JhbCBjeXRvc2NhcGUgKGkuZS4gd2luZG93LmN5dG9zY2FwZSlcbiAgcmVnaXN0ZXIoY3l0b3NjYXBlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWdpc3RlcjtcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiBpc0Z1bmN0aW9uKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSAnZnVuY3Rpb24nO1xufTtcblxudmFyIGRlZmF1bHRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxudmFyIGFzc2lnbiA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cbnZhciBkYWdyZSA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7IC8vIGNvbnN0cnVjdG9yXG4vLyBvcHRpb25zIDogb2JqZWN0IGNvbnRhaW5pbmcgbGF5b3V0IG9wdGlvbnNcblxuXG5mdW5jdGlvbiBEYWdyZUxheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGFzc2lnbih7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xufSAvLyBydW5zIHRoZSBsYXlvdXRcblxuXG5EYWdyZUxheW91dC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgdmFyIGxheW91dCA9IHRoaXM7XG4gIHZhciBjeSA9IG9wdGlvbnMuY3k7IC8vIGN5IGlzIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVkIGZvciB1cyBpbiB0aGUgY29uc3RydWN0b3JcblxuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcblxuICB2YXIgZ2V0VmFsID0gZnVuY3Rpb24gZ2V0VmFsKGVsZSwgdmFsKSB7XG4gICAgcmV0dXJuIGlzRnVuY3Rpb24odmFsKSA/IHZhbC5hcHBseShlbGUsIFtlbGVdKSA6IHZhbDtcbiAgfTtcblxuICB2YXIgYmIgPSBvcHRpb25zLmJvdW5kaW5nQm94IHx8IHtcbiAgICB4MTogMCxcbiAgICB5MTogMCxcbiAgICB3OiBjeS53aWR0aCgpLFxuICAgIGg6IGN5LmhlaWdodCgpXG4gIH07XG5cbiAgaWYgKGJiLngyID09PSB1bmRlZmluZWQpIHtcbiAgICBiYi54MiA9IGJiLngxICsgYmIudztcbiAgfVxuXG4gIGlmIChiYi53ID09PSB1bmRlZmluZWQpIHtcbiAgICBiYi53ID0gYmIueDIgLSBiYi54MTtcbiAgfVxuXG4gIGlmIChiYi55MiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYmIueTIgPSBiYi55MSArIGJiLmg7XG4gIH1cblxuICBpZiAoYmIuaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gIH1cblxuICB2YXIgZyA9IG5ldyBkYWdyZS5ncmFwaGxpYi5HcmFwaCh7XG4gICAgbXVsdGlncmFwaDogdHJ1ZSxcbiAgICBjb21wb3VuZDogdHJ1ZVxuICB9KTtcbiAgdmFyIGdPYmogPSB7fTtcblxuICB2YXIgc2V0R09iaiA9IGZ1bmN0aW9uIHNldEdPYmoobmFtZSwgdmFsKSB7XG4gICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICBnT2JqW25hbWVdID0gdmFsO1xuICAgIH1cbiAgfTtcblxuICBzZXRHT2JqKCdub2Rlc2VwJywgb3B0aW9ucy5ub2RlU2VwKTtcbiAgc2V0R09iaignZWRnZXNlcCcsIG9wdGlvbnMuZWRnZVNlcCk7XG4gIHNldEdPYmooJ3JhbmtzZXAnLCBvcHRpb25zLnJhbmtTZXApO1xuICBzZXRHT2JqKCdyYW5rZGlyJywgb3B0aW9ucy5yYW5rRGlyKTtcbiAgc2V0R09iaignYWxpZ24nLCBvcHRpb25zLmFsaWduKTtcbiAgc2V0R09iaigncmFua2VyJywgb3B0aW9ucy5yYW5rZXIpO1xuICBzZXRHT2JqKCdhY3ljbGljZXInLCBvcHRpb25zLmFjeWNsaWNlcik7XG4gIGcuc2V0R3JhcGgoZ09iaik7XG4gIGcuc2V0RGVmYXVsdEVkZ2VMYWJlbChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9KTtcbiAgZy5zZXREZWZhdWx0Tm9kZUxhYmVsKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge307XG4gIH0pOyAvLyBhZGQgbm9kZXMgdG8gZGFncmVcblxuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCk7XG5cbiAgaWYgKGlzRnVuY3Rpb24ob3B0aW9ucy5zb3J0KSkge1xuICAgIG5vZGVzID0gbm9kZXMuc29ydChvcHRpb25zLnNvcnQpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgdmFyIG5iYiA9IG5vZGUubGF5b3V0RGltZW5zaW9ucyhvcHRpb25zKTtcbiAgICBnLnNldE5vZGUobm9kZS5pZCgpLCB7XG4gICAgICB3aWR0aDogbmJiLncsXG4gICAgICBoZWlnaHQ6IG5iYi5oLFxuICAgICAgbmFtZTogbm9kZS5pZCgpXG4gICAgfSk7IC8vIGNvbnNvbGUubG9nKCBnLm5vZGUobm9kZS5pZCgpKSApO1xuICB9IC8vIHNldCBjb21wb3VuZCBwYXJlbnRzXG5cblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbm9kZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIF9ub2RlID0gbm9kZXNbX2ldO1xuXG4gICAgaWYgKF9ub2RlLmlzQ2hpbGQoKSkge1xuICAgICAgZy5zZXRQYXJlbnQoX25vZGUuaWQoKSwgX25vZGUucGFyZW50KCkuaWQoKSk7XG4gICAgfVxuICB9IC8vIGFkZCBlZGdlcyB0byBkYWdyZVxuXG5cbiAgdmFyIGVkZ2VzID0gZWxlcy5lZGdlcygpLnN0ZEZpbHRlcihmdW5jdGlvbiAoZWRnZSkge1xuICAgIHJldHVybiAhZWRnZS5zb3VyY2UoKS5pc1BhcmVudCgpICYmICFlZGdlLnRhcmdldCgpLmlzUGFyZW50KCk7IC8vIGRhZ3JlIGNhbid0IGhhbmRsZSBlZGdlcyBvbiBjb21wb3VuZCBub2Rlc1xuICB9KTtcblxuICBpZiAoaXNGdW5jdGlvbihvcHRpb25zLnNvcnQpKSB7XG4gICAgZWRnZXMgPSBlZGdlcy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gIH1cblxuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBlZGdlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tfaTJdO1xuICAgIGcuc2V0RWRnZShlZGdlLnNvdXJjZSgpLmlkKCksIGVkZ2UudGFyZ2V0KCkuaWQoKSwge1xuICAgICAgbWlubGVuOiBnZXRWYWwoZWRnZSwgb3B0aW9ucy5taW5MZW4pLFxuICAgICAgd2VpZ2h0OiBnZXRWYWwoZWRnZSwgb3B0aW9ucy5lZGdlV2VpZ2h0KSxcbiAgICAgIG5hbWU6IGVkZ2UuaWQoKVxuICAgIH0sIGVkZ2UuaWQoKSk7IC8vIGNvbnNvbGUubG9nKCBnLmVkZ2UoZWRnZS5zb3VyY2UoKS5pZCgpLCBlZGdlLnRhcmdldCgpLmlkKCksIGVkZ2UuaWQoKSkgKTtcbiAgfVxuXG4gIGRhZ3JlLmxheW91dChnKTtcbiAgdmFyIGdOb2RlSWRzID0gZy5ub2RlcygpO1xuXG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGdOb2RlSWRzLmxlbmd0aDsgX2kzKyspIHtcbiAgICB2YXIgaWQgPSBnTm9kZUlkc1tfaTNdO1xuICAgIHZhciBuID0gZy5ub2RlKGlkKTtcbiAgICBjeS5nZXRFbGVtZW50QnlJZChpZCkuc2NyYXRjaCgpLmRhZ3JlID0gbjtcbiAgfVxuXG4gIHZhciBkYWdyZUJCO1xuXG4gIGlmIChvcHRpb25zLmJvdW5kaW5nQm94KSB7XG4gICAgZGFncmVCQiA9IHtcbiAgICAgIHgxOiBJbmZpbml0eSxcbiAgICAgIHgyOiAtSW5maW5pdHksXG4gICAgICB5MTogSW5maW5pdHksXG4gICAgICB5MjogLUluZmluaXR5XG4gICAgfTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICB2YXIgZE1vZGVsID0gbm9kZS5zY3JhdGNoKCkuZGFncmU7XG4gICAgICBkYWdyZUJCLngxID0gTWF0aC5taW4oZGFncmVCQi54MSwgZE1vZGVsLngpO1xuICAgICAgZGFncmVCQi54MiA9IE1hdGgubWF4KGRhZ3JlQkIueDIsIGRNb2RlbC54KTtcbiAgICAgIGRhZ3JlQkIueTEgPSBNYXRoLm1pbihkYWdyZUJCLnkxLCBkTW9kZWwueSk7XG4gICAgICBkYWdyZUJCLnkyID0gTWF0aC5tYXgoZGFncmVCQi55MiwgZE1vZGVsLnkpO1xuICAgIH0pO1xuICAgIGRhZ3JlQkIudyA9IGRhZ3JlQkIueDIgLSBkYWdyZUJCLngxO1xuICAgIGRhZ3JlQkIuaCA9IGRhZ3JlQkIueTIgLSBkYWdyZUJCLnkxO1xuICB9IGVsc2Uge1xuICAgIGRhZ3JlQkIgPSBiYjtcbiAgfVxuXG4gIHZhciBjb25zdHJhaW5Qb3MgPSBmdW5jdGlvbiBjb25zdHJhaW5Qb3MocCkge1xuICAgIGlmIChvcHRpb25zLmJvdW5kaW5nQm94KSB7XG4gICAgICB2YXIgeFBjdCA9IGRhZ3JlQkIudyA9PT0gMCA/IDAgOiAocC54IC0gZGFncmVCQi54MSkgLyBkYWdyZUJCLnc7XG4gICAgICB2YXIgeVBjdCA9IGRhZ3JlQkIuaCA9PT0gMCA/IDAgOiAocC55IC0gZGFncmVCQi55MSkgLyBkYWdyZUJCLmg7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBiYi54MSArIHhQY3QgKiBiYi53LFxuICAgICAgICB5OiBiYi55MSArIHlQY3QgKiBiYi5oXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gIH07XG5cbiAgbm9kZXMubGF5b3V0UG9zaXRpb25zKGxheW91dCwgb3B0aW9ucywgZnVuY3Rpb24gKGVsZSkge1xuICAgIGVsZSA9IF90eXBlb2YoZWxlKSA9PT0gXCJvYmplY3RcIiA/IGVsZSA6IHRoaXM7XG4gICAgdmFyIGRNb2RlbCA9IGVsZS5zY3JhdGNoKCkuZGFncmU7XG4gICAgcmV0dXJuIGNvbnN0cmFpblBvcyh7XG4gICAgICB4OiBkTW9kZWwueCxcbiAgICAgIHk6IGRNb2RlbC55XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRGFncmVMYXlvdXQ7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gIC8vIGRhZ3JlIGFsZ28gb3B0aW9ucywgdXNlcyBkZWZhdWx0IHZhbHVlIG9uIHVuZGVmaW5lZFxuICBub2RlU2VwOiB1bmRlZmluZWQsXG4gIC8vIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gYWRqYWNlbnQgbm9kZXMgaW4gdGhlIHNhbWUgcmFua1xuICBlZGdlU2VwOiB1bmRlZmluZWQsXG4gIC8vIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gYWRqYWNlbnQgZWRnZXMgaW4gdGhlIHNhbWUgcmFua1xuICByYW5rU2VwOiB1bmRlZmluZWQsXG4gIC8vIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gYWRqYWNlbnQgbm9kZXMgaW4gdGhlIHNhbWUgcmFua1xuICByYW5rRGlyOiB1bmRlZmluZWQsXG4gIC8vICdUQicgZm9yIHRvcCB0byBib3R0b20gZmxvdywgJ0xSJyBmb3IgbGVmdCB0byByaWdodCxcbiAgYWxpZ246IHVuZGVmaW5lZCxcbiAgLy8gYWxpZ25tZW50IGZvciByYW5rIG5vZGVzLiBDYW4gYmUgJ1VMJywgJ1VSJywgJ0RMJywgb3IgJ0RSJywgd2hlcmUgVSA9IHVwLCBEID0gZG93biwgTCA9IGxlZnQsIGFuZCBSID0gcmlnaHRcbiAgYWN5Y2xpY2VyOiB1bmRlZmluZWQsXG4gIC8vIElmIHNldCB0byAnZ3JlZWR5JywgdXNlcyBhIGdyZWVkeSBoZXVyaXN0aWMgZm9yIGZpbmRpbmcgYSBmZWVkYmFjayBhcmMgc2V0IGZvciBhIGdyYXBoLlxuICAvLyBBIGZlZWRiYWNrIGFyYyBzZXQgaXMgYSBzZXQgb2YgZWRnZXMgdGhhdCBjYW4gYmUgcmVtb3ZlZCB0byBtYWtlIGEgZ3JhcGggYWN5Y2xpYy5cbiAgcmFua2VyOiB1bmRlZmluZWQsXG4gIC8vIFR5cGUgb2YgYWxnb3JpdGhtIHRvIGFzc2lnbnMgYSByYW5rIHRvIGVhY2ggbm9kZSBpbiB0aGUgaW5wdXQgZ3JhcGguXG4gIC8vIFBvc3NpYmxlIHZhbHVlczogbmV0d29yay1zaW1wbGV4LCB0aWdodC10cmVlIG9yIGxvbmdlc3QtcGF0aFxuICBtaW5MZW46IGZ1bmN0aW9uIG1pbkxlbihlZGdlKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0sXG4gIC8vIG51bWJlciBvZiByYW5rcyB0byBrZWVwIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9mIHRoZSBlZGdlXG4gIGVkZ2VXZWlnaHQ6IGZ1bmN0aW9uIGVkZ2VXZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICAvLyBoaWdoZXIgd2VpZ2h0IGVkZ2VzIGFyZSBnZW5lcmFsbHkgbWFkZSBzaG9ydGVyIGFuZCBzdHJhaWdodGVyIHRoYW4gbG93ZXIgd2VpZ2h0IGVkZ2VzXG4gIC8vIGdlbmVyYWwgbGF5b3V0IG9wdGlvbnNcbiAgZml0OiB0cnVlLFxuICAvLyB3aGV0aGVyIHRvIGZpdCB0byB2aWV3cG9ydFxuICBwYWRkaW5nOiAzMCxcbiAgLy8gZml0IHBhZGRpbmdcbiAgc3BhY2luZ0ZhY3RvcjogdW5kZWZpbmVkLFxuICAvLyBBcHBsaWVzIGEgbXVsdGlwbGljYXRpdmUgZmFjdG9yICg+MCkgdG8gZXhwYW5kIG9yIGNvbXByZXNzIHRoZSBvdmVyYWxsIGFyZWEgdGhhdCB0aGUgbm9kZXMgdGFrZSB1cFxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyB3aGV0aGVyIGxhYmVscyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gZGV0ZXJtaW5pbmcgdGhlIHNwYWNlIHVzZWQgYnkgYSBub2RlXG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGVGaWx0ZXI6IGZ1bmN0aW9uIGFuaW1hdGVGaWx0ZXIobm9kZSwgaSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyB3aGV0aGVyIHRvIGFuaW1hdGUgc3BlY2lmaWMgbm9kZXMgd2hlbiBhbmltYXRpb24gaXMgb247IG5vbi1hbmltYXRlZCBub2RlcyBpbW1lZGlhdGVseSBnbyB0byB0aGVpciBmaW5hbCBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZFxuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgdHJhbnNmb3JtOiBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSwgcG9zKSB7XG4gICAgcmV0dXJuIHBvcztcbiAgfSxcbiAgLy8gYSBmdW5jdGlvbiB0aGF0IGFwcGxpZXMgYSB0cmFuc2Zvcm0gdG8gdGhlIGZpbmFsIG5vZGUgcG9zaXRpb25cbiAgcmVhZHk6IGZ1bmN0aW9uIHJlYWR5KCkge30sXG4gIC8vIG9uIGxheW91dHJlYWR5XG4gIHNvcnQ6IHVuZGVmaW5lZCxcbiAgLy8gYSBzb3J0aW5nIGZ1bmN0aW9uIHRvIG9yZGVyIHRoZSBub2RlcyBhbmQgZWRnZXM7IGUuZy4gZnVuY3Rpb24oYSwgYil7IHJldHVybiBhLmRhdGEoJ3dlaWdodCcpIC0gYi5kYXRhKCd3ZWlnaHQnKSB9XG4gIC8vIGJlY2F1c2UgY3l0b3NjYXBlIGRhZ3JlIGNyZWF0ZXMgYSBkaXJlY3RlZCBncmFwaCwgYW5kIGRpcmVjdGVkIGdyYXBocyB1c2UgdGhlIG5vZGUgb3JkZXIgYXMgYSB0aWUgYnJlYWtlciB3aGVuXG4gIC8vIGRlZmluaW5nIHRoZSB0b3BvbG9neSBvZiBhIGdyYXBoLCB0aGlzIHNvcnQgZnVuY3Rpb24gY2FuIGhlbHAgZW5zdXJlIHRoZSBjb3JyZWN0IG9yZGVyIG9mIHRoZSBub2Rlcy9lZGdlcy5cbiAgLy8gdGhpcyBmZWF0dXJlIGlzIG1vc3QgdXNlZnVsIHdoZW4gYWRkaW5nIGFuZCByZW1vdmluZyB0aGUgc2FtZSBub2RlcyBhbmQgZWRnZXMgbXVsdGlwbGUgdGltZXMgaW4gYSBncmFwaC5cbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHt9IC8vIG9uIGxheW91dHN0b3BcblxufTtcbm1vZHVsZS5leHBvcnRzID0gZGVmYXVsdHM7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG4vLyBTaW1wbGUsIGludGVybmFsIE9iamVjdC5hc3NpZ24oKSBwb2x5ZmlsbCBmb3Igb3B0aW9ucyBvYmplY3RzIGV0Yy5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmFzc2lnbiAhPSBudWxsID8gT2JqZWN0LmFzc2lnbi5iaW5kKE9iamVjdCkgOiBmdW5jdGlvbiAodGd0KSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzcmNzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBzcmNzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHNyY3MuZm9yRWFjaChmdW5jdGlvbiAoc3JjKSB7XG4gICAgT2JqZWN0LmtleXMoc3JjKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gdGd0W2tdID0gc3JjW2tdO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHRndDtcbn07XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzRfXztcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xufSk7IiwiLypcbkNvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFBldHRpdHRcblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLlxuKi9cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdyYXBobGliOiByZXF1aXJlKFwiLi9saWIvZ3JhcGhsaWJcIiksXG5cbiAgbGF5b3V0OiByZXF1aXJlKFwiLi9saWIvbGF5b3V0XCIpLFxuICBkZWJ1ZzogcmVxdWlyZShcIi4vbGliL2RlYnVnXCIpLFxuICB1dGlsOiB7XG4gICAgdGltZTogcmVxdWlyZShcIi4vbGliL3V0aWxcIikudGltZSxcbiAgICBub3RpbWU6IHJlcXVpcmUoXCIuL2xpYi91dGlsXCIpLm5vdGltZVxuICB9LFxuICB2ZXJzaW9uOiByZXF1aXJlKFwiLi9saWIvdmVyc2lvblwiKVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBncmVlZHlGQVMgPSByZXF1aXJlKFwiLi9ncmVlZHktZmFzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcnVuOiBydW4sXG4gIHVuZG86IHVuZG9cbn07XG5cbmZ1bmN0aW9uIHJ1bihnKSB7XG4gIHZhciBmYXMgPSAoZy5ncmFwaCgpLmFjeWNsaWNlciA9PT0gXCJncmVlZHlcIlxuICAgID8gZ3JlZWR5RkFTKGcsIHdlaWdodEZuKGcpKVxuICAgIDogZGZzRkFTKGcpKTtcbiAgXy5mb3JFYWNoKGZhcywgZnVuY3Rpb24oZSkge1xuICAgIHZhciBsYWJlbCA9IGcuZWRnZShlKTtcbiAgICBnLnJlbW92ZUVkZ2UoZSk7XG4gICAgbGFiZWwuZm9yd2FyZE5hbWUgPSBlLm5hbWU7XG4gICAgbGFiZWwucmV2ZXJzZWQgPSB0cnVlO1xuICAgIGcuc2V0RWRnZShlLncsIGUudiwgbGFiZWwsIF8udW5pcXVlSWQoXCJyZXZcIikpO1xuICB9KTtcblxuICBmdW5jdGlvbiB3ZWlnaHRGbihnKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiBnLmVkZ2UoZSkud2VpZ2h0O1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZGZzRkFTKGcpIHtcbiAgdmFyIGZhcyA9IFtdO1xuICB2YXIgc3RhY2sgPSB7fTtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIGlmIChfLmhhcyh2aXNpdGVkLCB2KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICBzdGFja1t2XSA9IHRydWU7XG4gICAgXy5mb3JFYWNoKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGlmIChfLmhhcyhzdGFjaywgZS53KSkge1xuICAgICAgICBmYXMucHVzaChlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRmcyhlLncpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRlbGV0ZSBzdGFja1t2XTtcbiAgfVxuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGRmcyk7XG4gIHJldHVybiBmYXM7XG59XG5cbmZ1bmN0aW9uIHVuZG8oZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGxhYmVsID0gZy5lZGdlKGUpO1xuICAgIGlmIChsYWJlbC5yZXZlcnNlZCkge1xuICAgICAgZy5yZW1vdmVFZGdlKGUpO1xuXG4gICAgICB2YXIgZm9yd2FyZE5hbWUgPSBsYWJlbC5mb3J3YXJkTmFtZTtcbiAgICAgIGRlbGV0ZSBsYWJlbC5yZXZlcnNlZDtcbiAgICAgIGRlbGV0ZSBsYWJlbC5mb3J3YXJkTmFtZTtcbiAgICAgIGcuc2V0RWRnZShlLncsIGUudiwgbGFiZWwsIGZvcndhcmROYW1lKTtcbiAgICB9XG4gIH0pO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gYWRkQm9yZGVyU2VnbWVudHM7XG5cbmZ1bmN0aW9uIGFkZEJvcmRlclNlZ21lbnRzKGcpIHtcbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBnLmNoaWxkcmVuKHYpO1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIF8uZm9yRWFjaChjaGlsZHJlbiwgZGZzKTtcbiAgICB9XG5cbiAgICBpZiAoXy5oYXMobm9kZSwgXCJtaW5SYW5rXCIpKSB7XG4gICAgICBub2RlLmJvcmRlckxlZnQgPSBbXTtcbiAgICAgIG5vZGUuYm9yZGVyUmlnaHQgPSBbXTtcbiAgICAgIGZvciAodmFyIHJhbmsgPSBub2RlLm1pblJhbmssIG1heFJhbmsgPSBub2RlLm1heFJhbmsgKyAxO1xuICAgICAgICByYW5rIDwgbWF4UmFuaztcbiAgICAgICAgKytyYW5rKSB7XG4gICAgICAgIGFkZEJvcmRlck5vZGUoZywgXCJib3JkZXJMZWZ0XCIsIFwiX2JsXCIsIHYsIG5vZGUsIHJhbmspO1xuICAgICAgICBhZGRCb3JkZXJOb2RlKGcsIFwiYm9yZGVyUmlnaHRcIiwgXCJfYnJcIiwgdiwgbm9kZSwgcmFuayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgXy5mb3JFYWNoKGcuY2hpbGRyZW4oKSwgZGZzKTtcbn1cblxuZnVuY3Rpb24gYWRkQm9yZGVyTm9kZShnLCBwcm9wLCBwcmVmaXgsIHNnLCBzZ05vZGUsIHJhbmspIHtcbiAgdmFyIGxhYmVsID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCByYW5rOiByYW5rLCBib3JkZXJUeXBlOiBwcm9wIH07XG4gIHZhciBwcmV2ID0gc2dOb2RlW3Byb3BdW3JhbmsgLSAxXTtcbiAgdmFyIGN1cnIgPSB1dGlsLmFkZER1bW15Tm9kZShnLCBcImJvcmRlclwiLCBsYWJlbCwgcHJlZml4KTtcbiAgc2dOb2RlW3Byb3BdW3JhbmtdID0gY3VycjtcbiAgZy5zZXRQYXJlbnQoY3Vyciwgc2cpO1xuICBpZiAocHJldikge1xuICAgIGcuc2V0RWRnZShwcmV2LCBjdXJyLCB7IHdlaWdodDogMSB9KTtcbiAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYWRqdXN0OiBhZGp1c3QsXG4gIHVuZG86IHVuZG9cbn07XG5cbmZ1bmN0aW9uIGFkanVzdChnKSB7XG4gIHZhciByYW5rRGlyID0gZy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJhbmtEaXIgPT09IFwibHJcIiB8fCByYW5rRGlyID09PSBcInJsXCIpIHtcbiAgICBzd2FwV2lkdGhIZWlnaHQoZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5kbyhnKSB7XG4gIHZhciByYW5rRGlyID0gZy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJhbmtEaXIgPT09IFwiYnRcIiB8fCByYW5rRGlyID09PSBcInJsXCIpIHtcbiAgICByZXZlcnNlWShnKTtcbiAgfVxuXG4gIGlmIChyYW5rRGlyID09PSBcImxyXCIgfHwgcmFua0RpciA9PT0gXCJybFwiKSB7XG4gICAgc3dhcFhZKGcpO1xuICAgIHN3YXBXaWR0aEhlaWdodChnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzd2FwV2lkdGhIZWlnaHQoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHN3YXBXaWR0aEhlaWdodE9uZShnLm5vZGUodikpOyB9KTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkgeyBzd2FwV2lkdGhIZWlnaHRPbmUoZy5lZGdlKGUpKTsgfSk7XG59XG5cbmZ1bmN0aW9uIHN3YXBXaWR0aEhlaWdodE9uZShhdHRycykge1xuICB2YXIgdyA9IGF0dHJzLndpZHRoO1xuICBhdHRycy53aWR0aCA9IGF0dHJzLmhlaWdodDtcbiAgYXR0cnMuaGVpZ2h0ID0gdztcbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVkoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldmVyc2VZT25lKGcubm9kZSh2KSk7IH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBfLmZvckVhY2goZWRnZS5wb2ludHMsIHJldmVyc2VZT25lKTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ5XCIpKSB7XG4gICAgICByZXZlcnNlWU9uZShlZGdlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXZlcnNlWU9uZShhdHRycykge1xuICBhdHRycy55ID0gLWF0dHJzLnk7XG59XG5cbmZ1bmN0aW9uIHN3YXBYWShnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgc3dhcFhZT25lKGcubm9kZSh2KSk7IH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBfLmZvckVhY2goZWRnZS5wb2ludHMsIHN3YXBYWU9uZSk7XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieFwiKSkge1xuICAgICAgc3dhcFhZT25lKGVkZ2UpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3YXBYWU9uZShhdHRycykge1xuICB2YXIgeCA9IGF0dHJzLng7XG4gIGF0dHJzLnggPSBhdHRycy55O1xuICBhdHRycy55ID0geDtcbn1cbiIsIi8qXG4gKiBTaW1wbGUgZG91Ymx5IGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uIGRlcml2ZWQgZnJvbSBDb3JtZW4sIGV0IGFsLixcbiAqIFwiSW50cm9kdWN0aW9uIHRvIEFsZ29yaXRobXNcIi5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpc3Q7XG5cbmZ1bmN0aW9uIExpc3QoKSB7XG4gIHZhciBzZW50aW5lbCA9IHt9O1xuICBzZW50aW5lbC5fbmV4dCA9IHNlbnRpbmVsLl9wcmV2ID0gc2VudGluZWw7XG4gIHRoaXMuX3NlbnRpbmVsID0gc2VudGluZWw7XG59XG5cbkxpc3QucHJvdG90eXBlLmRlcXVldWUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbnRpbmVsID0gdGhpcy5fc2VudGluZWw7XG4gIHZhciBlbnRyeSA9IHNlbnRpbmVsLl9wcmV2O1xuICBpZiAoZW50cnkgIT09IHNlbnRpbmVsKSB7XG4gICAgdW5saW5rKGVudHJ5KTtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cbn07XG5cbkxpc3QucHJvdG90eXBlLmVucXVldWUgPSBmdW5jdGlvbihlbnRyeSkge1xuICB2YXIgc2VudGluZWwgPSB0aGlzLl9zZW50aW5lbDtcbiAgaWYgKGVudHJ5Ll9wcmV2ICYmIGVudHJ5Ll9uZXh0KSB7XG4gICAgdW5saW5rKGVudHJ5KTtcbiAgfVxuICBlbnRyeS5fbmV4dCA9IHNlbnRpbmVsLl9uZXh0O1xuICBzZW50aW5lbC5fbmV4dC5fcHJldiA9IGVudHJ5O1xuICBzZW50aW5lbC5fbmV4dCA9IGVudHJ5O1xuICBlbnRyeS5fcHJldiA9IHNlbnRpbmVsO1xufTtcblxuTGlzdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0cnMgPSBbXTtcbiAgdmFyIHNlbnRpbmVsID0gdGhpcy5fc2VudGluZWw7XG4gIHZhciBjdXJyID0gc2VudGluZWwuX3ByZXY7XG4gIHdoaWxlIChjdXJyICE9PSBzZW50aW5lbCkge1xuICAgIHN0cnMucHVzaChKU09OLnN0cmluZ2lmeShjdXJyLCBmaWx0ZXJPdXRMaW5rcykpO1xuICAgIGN1cnIgPSBjdXJyLl9wcmV2O1xuICB9XG4gIHJldHVybiBcIltcIiArIHN0cnMuam9pbihcIiwgXCIpICsgXCJdXCI7XG59O1xuXG5mdW5jdGlvbiB1bmxpbmsoZW50cnkpIHtcbiAgZW50cnkuX3ByZXYuX25leHQgPSBlbnRyeS5fbmV4dDtcbiAgZW50cnkuX25leHQuX3ByZXYgPSBlbnRyeS5fcHJldjtcbiAgZGVsZXRlIGVudHJ5Ll9uZXh0O1xuICBkZWxldGUgZW50cnkuX3ByZXY7XG59XG5cbmZ1bmN0aW9uIGZpbHRlck91dExpbmtzKGssIHYpIHtcbiAgaWYgKGsgIT09IFwiX25leHRcIiAmJiBrICE9PSBcIl9wcmV2XCIpIHtcbiAgICByZXR1cm4gdjtcbiAgfVxufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaGxpYlwiKS5HcmFwaDtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRlYnVnT3JkZXJpbmc6IGRlYnVnT3JkZXJpbmdcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBkZWJ1Z09yZGVyaW5nKGcpIHtcbiAgdmFyIGxheWVyTWF0cml4ID0gdXRpbC5idWlsZExheWVyTWF0cml4KGcpO1xuXG4gIHZhciBoID0gbmV3IEdyYXBoKHsgY29tcG91bmQ6IHRydWUsIG11bHRpZ3JhcGg6IHRydWUgfSkuc2V0R3JhcGgoe30pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBoLnNldE5vZGUodiwgeyBsYWJlbDogdiB9KTtcbiAgICBoLnNldFBhcmVudCh2LCBcImxheWVyXCIgKyBnLm5vZGUodikucmFuayk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBoLnNldEVkZ2UoZS52LCBlLncsIHt9LCBlLm5hbWUpO1xuICB9KTtcblxuICBfLmZvckVhY2gobGF5ZXJNYXRyaXgsIGZ1bmN0aW9uKGxheWVyLCBpKSB7XG4gICAgdmFyIGxheWVyViA9IFwibGF5ZXJcIiArIGk7XG4gICAgaC5zZXROb2RlKGxheWVyViwgeyByYW5rOiBcInNhbWVcIiB9KTtcbiAgICBfLnJlZHVjZShsYXllciwgZnVuY3Rpb24odSwgdikge1xuICAgICAgaC5zZXRFZGdlKHUsIHYsIHsgc3R5bGU6IFwiaW52aXNcIiB9KTtcbiAgICAgIHJldHVybiB2O1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gaDtcbn1cbiIsIi8qIGdsb2JhbCB3aW5kb3cgKi9cblxudmFyIGdyYXBobGliO1xuXG5pZiAodHlwZW9mIHJlcXVpcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICB0cnkge1xuICAgIGdyYXBobGliID0gcmVxdWlyZShcImdyYXBobGliXCIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuICB9XG59XG5cbmlmICghZ3JhcGhsaWIpIHtcbiAgZ3JhcGhsaWIgPSB3aW5kb3cuZ3JhcGhsaWI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ3JhcGhsaWI7XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuL2dyYXBobGliXCIpLkdyYXBoO1xudmFyIExpc3QgPSByZXF1aXJlKFwiLi9kYXRhL2xpc3RcIik7XG5cbi8qXG4gKiBBIGdyZWVkeSBoZXVyaXN0aWMgZm9yIGZpbmRpbmcgYSBmZWVkYmFjayBhcmMgc2V0IGZvciBhIGdyYXBoLiBBIGZlZWRiYWNrXG4gKiBhcmMgc2V0IGlzIGEgc2V0IG9mIGVkZ2VzIHRoYXQgY2FuIGJlIHJlbW92ZWQgdG8gbWFrZSBhIGdyYXBoIGFjeWNsaWMuXG4gKiBUaGUgYWxnb3JpdGhtIGNvbWVzIGZyb206IFAuIEVhZGVzLCBYLiBMaW4sIGFuZCBXLiBGLiBTbXl0aCwgXCJBIGZhc3QgYW5kXG4gKiBlZmZlY3RpdmUgaGV1cmlzdGljIGZvciB0aGUgZmVlZGJhY2sgYXJjIHNldCBwcm9ibGVtLlwiIFRoaXMgaW1wbGVtZW50YXRpb25cbiAqIGFkanVzdHMgdGhhdCBmcm9tIHRoZSBwYXBlciB0byBhbGxvdyBmb3Igd2VpZ2h0ZWQgZWRnZXMuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZ3JlZWR5RkFTO1xuXG52YXIgREVGQVVMVF9XRUlHSFRfRk4gPSBfLmNvbnN0YW50KDEpO1xuXG5mdW5jdGlvbiBncmVlZHlGQVMoZywgd2VpZ2h0Rm4pIHtcbiAgaWYgKGcubm9kZUNvdW50KCkgPD0gMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgc3RhdGUgPSBidWlsZFN0YXRlKGcsIHdlaWdodEZuIHx8IERFRkFVTFRfV0VJR0hUX0ZOKTtcbiAgdmFyIHJlc3VsdHMgPSBkb0dyZWVkeUZBUyhzdGF0ZS5ncmFwaCwgc3RhdGUuYnVja2V0cywgc3RhdGUuemVyb0lkeCk7XG5cbiAgLy8gRXhwYW5kIG11bHRpLWVkZ2VzXG4gIHJldHVybiBfLmZsYXR0ZW4oXy5tYXAocmVzdWx0cywgZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiBnLm91dEVkZ2VzKGUudiwgZS53KTtcbiAgfSksIHRydWUpO1xufVxuXG5mdW5jdGlvbiBkb0dyZWVkeUZBUyhnLCBidWNrZXRzLCB6ZXJvSWR4KSB7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBzb3VyY2VzID0gYnVja2V0c1tidWNrZXRzLmxlbmd0aCAtIDFdO1xuICB2YXIgc2lua3MgPSBidWNrZXRzWzBdO1xuXG4gIHZhciBlbnRyeTtcbiAgd2hpbGUgKGcubm9kZUNvdW50KCkpIHtcbiAgICB3aGlsZSAoKGVudHJ5ID0gc2lua3MuZGVxdWV1ZSgpKSkgICB7IHJlbW92ZU5vZGUoZywgYnVja2V0cywgemVyb0lkeCwgZW50cnkpOyB9XG4gICAgd2hpbGUgKChlbnRyeSA9IHNvdXJjZXMuZGVxdWV1ZSgpKSkgeyByZW1vdmVOb2RlKGcsIGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5KTsgfVxuICAgIGlmIChnLm5vZGVDb3VudCgpKSB7XG4gICAgICBmb3IgKHZhciBpID0gYnVja2V0cy5sZW5ndGggLSAyOyBpID4gMDsgLS1pKSB7XG4gICAgICAgIGVudHJ5ID0gYnVja2V0c1tpXS5kZXF1ZXVlKCk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChyZW1vdmVOb2RlKGcsIGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5LCB0cnVlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZShnLCBidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSwgY29sbGVjdFByZWRlY2Vzc29ycykge1xuICB2YXIgcmVzdWx0cyA9IGNvbGxlY3RQcmVkZWNlc3NvcnMgPyBbXSA6IHVuZGVmaW5lZDtcblxuICBfLmZvckVhY2goZy5pbkVkZ2VzKGVudHJ5LnYpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgdmFyIHdlaWdodCA9IGcuZWRnZShlZGdlKTtcbiAgICB2YXIgdUVudHJ5ID0gZy5ub2RlKGVkZ2Uudik7XG5cbiAgICBpZiAoY29sbGVjdFByZWRlY2Vzc29ycykge1xuICAgICAgcmVzdWx0cy5wdXNoKHsgdjogZWRnZS52LCB3OiBlZGdlLncgfSk7XG4gICAgfVxuXG4gICAgdUVudHJ5Lm91dCAtPSB3ZWlnaHQ7XG4gICAgYXNzaWduQnVja2V0KGJ1Y2tldHMsIHplcm9JZHgsIHVFbnRyeSk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLm91dEVkZ2VzKGVudHJ5LnYpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgdmFyIHdlaWdodCA9IGcuZWRnZShlZGdlKTtcbiAgICB2YXIgdyA9IGVkZ2UudztcbiAgICB2YXIgd0VudHJ5ID0gZy5ub2RlKHcpO1xuICAgIHdFbnRyeVtcImluXCJdIC09IHdlaWdodDtcbiAgICBhc3NpZ25CdWNrZXQoYnVja2V0cywgemVyb0lkeCwgd0VudHJ5KTtcbiAgfSk7XG5cbiAgZy5yZW1vdmVOb2RlKGVudHJ5LnYpO1xuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBidWlsZFN0YXRlKGcsIHdlaWdodEZuKSB7XG4gIHZhciBmYXNHcmFwaCA9IG5ldyBHcmFwaCgpO1xuICB2YXIgbWF4SW4gPSAwO1xuICB2YXIgbWF4T3V0ID0gMDtcblxuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgZmFzR3JhcGguc2V0Tm9kZSh2LCB7IHY6IHYsIFwiaW5cIjogMCwgb3V0OiAwIH0pO1xuICB9KTtcblxuICAvLyBBZ2dyZWdhdGUgd2VpZ2h0cyBvbiBub2RlcywgYnV0IGFsc28gc3VtIHRoZSB3ZWlnaHRzIGFjcm9zcyBtdWx0aS1lZGdlc1xuICAvLyBpbnRvIGEgc2luZ2xlIGVkZ2UgZm9yIHRoZSBmYXNHcmFwaC5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBwcmV2V2VpZ2h0ID0gZmFzR3JhcGguZWRnZShlLnYsIGUudykgfHwgMDtcbiAgICB2YXIgd2VpZ2h0ID0gd2VpZ2h0Rm4oZSk7XG4gICAgdmFyIGVkZ2VXZWlnaHQgPSBwcmV2V2VpZ2h0ICsgd2VpZ2h0O1xuICAgIGZhc0dyYXBoLnNldEVkZ2UoZS52LCBlLncsIGVkZ2VXZWlnaHQpO1xuICAgIG1heE91dCA9IE1hdGgubWF4KG1heE91dCwgZmFzR3JhcGgubm9kZShlLnYpLm91dCArPSB3ZWlnaHQpO1xuICAgIG1heEluICA9IE1hdGgubWF4KG1heEluLCAgZmFzR3JhcGgubm9kZShlLncpW1wiaW5cIl0gICs9IHdlaWdodCk7XG4gIH0pO1xuXG4gIHZhciBidWNrZXRzID0gXy5yYW5nZShtYXhPdXQgKyBtYXhJbiArIDMpLm1hcChmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBMaXN0KCk7IH0pO1xuICB2YXIgemVyb0lkeCA9IG1heEluICsgMTtcblxuICBfLmZvckVhY2goZmFzR3JhcGgubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGFzc2lnbkJ1Y2tldChidWNrZXRzLCB6ZXJvSWR4LCBmYXNHcmFwaC5ub2RlKHYpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgZ3JhcGg6IGZhc0dyYXBoLCBidWNrZXRzOiBidWNrZXRzLCB6ZXJvSWR4OiB6ZXJvSWR4IH07XG59XG5cbmZ1bmN0aW9uIGFzc2lnbkJ1Y2tldChidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSkge1xuICBpZiAoIWVudHJ5Lm91dCkge1xuICAgIGJ1Y2tldHNbMF0uZW5xdWV1ZShlbnRyeSk7XG4gIH0gZWxzZSBpZiAoIWVudHJ5W1wiaW5cIl0pIHtcbiAgICBidWNrZXRzW2J1Y2tldHMubGVuZ3RoIC0gMV0uZW5xdWV1ZShlbnRyeSk7XG4gIH0gZWxzZSB7XG4gICAgYnVja2V0c1tlbnRyeS5vdXQgLSBlbnRyeVtcImluXCJdICsgemVyb0lkeF0uZW5xdWV1ZShlbnRyeSk7XG4gIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBhY3ljbGljID0gcmVxdWlyZShcIi4vYWN5Y2xpY1wiKTtcbnZhciBub3JtYWxpemUgPSByZXF1aXJlKFwiLi9ub3JtYWxpemVcIik7XG52YXIgcmFuayA9IHJlcXVpcmUoXCIuL3JhbmtcIik7XG52YXIgbm9ybWFsaXplUmFua3MgPSByZXF1aXJlKFwiLi91dGlsXCIpLm5vcm1hbGl6ZVJhbmtzO1xudmFyIHBhcmVudER1bW15Q2hhaW5zID0gcmVxdWlyZShcIi4vcGFyZW50LWR1bW15LWNoYWluc1wiKTtcbnZhciByZW1vdmVFbXB0eVJhbmtzID0gcmVxdWlyZShcIi4vdXRpbFwiKS5yZW1vdmVFbXB0eVJhbmtzO1xudmFyIG5lc3RpbmdHcmFwaCA9IHJlcXVpcmUoXCIuL25lc3RpbmctZ3JhcGhcIik7XG52YXIgYWRkQm9yZGVyU2VnbWVudHMgPSByZXF1aXJlKFwiLi9hZGQtYm9yZGVyLXNlZ21lbnRzXCIpO1xudmFyIGNvb3JkaW5hdGVTeXN0ZW0gPSByZXF1aXJlKFwiLi9jb29yZGluYXRlLXN5c3RlbVwiKTtcbnZhciBvcmRlciA9IHJlcXVpcmUoXCIuL29yZGVyXCIpO1xudmFyIHBvc2l0aW9uID0gcmVxdWlyZShcIi4vcG9zaXRpb25cIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaGxpYlwiKS5HcmFwaDtcblxubW9kdWxlLmV4cG9ydHMgPSBsYXlvdXQ7XG5cbmZ1bmN0aW9uIGxheW91dChnLCBvcHRzKSB7XG4gIHZhciB0aW1lID0gb3B0cyAmJiBvcHRzLmRlYnVnVGltaW5nID8gdXRpbC50aW1lIDogdXRpbC5ub3RpbWU7XG4gIHRpbWUoXCJsYXlvdXRcIiwgZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxheW91dEdyYXBoID0gXG4gICAgICB0aW1lKFwiICBidWlsZExheW91dEdyYXBoXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gYnVpbGRMYXlvdXRHcmFwaChnKTsgfSk7XG4gICAgdGltZShcIiAgcnVuTGF5b3V0XCIsICAgICAgICBmdW5jdGlvbigpIHsgcnVuTGF5b3V0KGxheW91dEdyYXBoLCB0aW1lKTsgfSk7XG4gICAgdGltZShcIiAgdXBkYXRlSW5wdXRHcmFwaFwiLCBmdW5jdGlvbigpIHsgdXBkYXRlSW5wdXRHcmFwaChnLCBsYXlvdXRHcmFwaCk7IH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuTGF5b3V0KGcsIHRpbWUpIHtcbiAgdGltZShcIiAgICBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzXCIsIGZ1bmN0aW9uKCkgeyBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzKGcpOyB9KTtcbiAgdGltZShcIiAgICByZW1vdmVTZWxmRWRnZXNcIiwgICAgICAgIGZ1bmN0aW9uKCkgeyByZW1vdmVTZWxmRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFjeWNsaWNcIiwgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IGFjeWNsaWMucnVuKGcpOyB9KTtcbiAgdGltZShcIiAgICBuZXN0aW5nR3JhcGgucnVuXCIsICAgICAgIGZ1bmN0aW9uKCkgeyBuZXN0aW5nR3JhcGgucnVuKGcpOyB9KTtcbiAgdGltZShcIiAgICByYW5rXCIsICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByYW5rKHV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpKTsgfSk7XG4gIHRpbWUoXCIgICAgaW5qZWN0RWRnZUxhYmVsUHJveGllc1wiLCBmdW5jdGlvbigpIHsgaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgcmVtb3ZlRW1wdHlSYW5rc1wiLCAgICAgICBmdW5jdGlvbigpIHsgcmVtb3ZlRW1wdHlSYW5rcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgbmVzdGluZ0dyYXBoLmNsZWFudXBcIiwgICBmdW5jdGlvbigpIHsgbmVzdGluZ0dyYXBoLmNsZWFudXAoZyk7IH0pO1xuICB0aW1lKFwiICAgIG5vcm1hbGl6ZVJhbmtzXCIsICAgICAgICAgZnVuY3Rpb24oKSB7IG5vcm1hbGl6ZVJhbmtzKGcpOyB9KTtcbiAgdGltZShcIiAgICBhc3NpZ25SYW5rTWluTWF4XCIsICAgICAgIGZ1bmN0aW9uKCkgeyBhc3NpZ25SYW5rTWluTWF4KGcpOyB9KTtcbiAgdGltZShcIiAgICByZW1vdmVFZGdlTGFiZWxQcm94aWVzXCIsIGZ1bmN0aW9uKCkgeyByZW1vdmVFZGdlTGFiZWxQcm94aWVzKGcpOyB9KTtcbiAgdGltZShcIiAgICBub3JtYWxpemUucnVuXCIsICAgICAgICAgIGZ1bmN0aW9uKCkgeyBub3JtYWxpemUucnVuKGcpOyB9KTtcbiAgdGltZShcIiAgICBwYXJlbnREdW1teUNoYWluc1wiLCAgICAgIGZ1bmN0aW9uKCkgeyBwYXJlbnREdW1teUNoYWlucyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgYWRkQm9yZGVyU2VnbWVudHNcIiwgICAgICBmdW5jdGlvbigpIHsgYWRkQm9yZGVyU2VnbWVudHMoZyk7IH0pO1xuICB0aW1lKFwiICAgIG9yZGVyXCIsICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IG9yZGVyKGcpOyB9KTtcbiAgdGltZShcIiAgICBpbnNlcnRTZWxmRWRnZXNcIiwgICAgICAgIGZ1bmN0aW9uKCkgeyBpbnNlcnRTZWxmRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFkanVzdENvb3JkaW5hdGVTeXN0ZW1cIiwgZnVuY3Rpb24oKSB7IGNvb3JkaW5hdGVTeXN0ZW0uYWRqdXN0KGcpOyB9KTtcbiAgdGltZShcIiAgICBwb3NpdGlvblwiLCAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyBwb3NpdGlvbihnKTsgfSk7XG4gIHRpbWUoXCIgICAgcG9zaXRpb25TZWxmRWRnZXNcIiwgICAgICBmdW5jdGlvbigpIHsgcG9zaXRpb25TZWxmRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIHJlbW92ZUJvcmRlck5vZGVzXCIsICAgICAgZnVuY3Rpb24oKSB7IHJlbW92ZUJvcmRlck5vZGVzKGcpOyB9KTtcbiAgdGltZShcIiAgICBub3JtYWxpemUudW5kb1wiLCAgICAgICAgIGZ1bmN0aW9uKCkgeyBub3JtYWxpemUudW5kbyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgZml4dXBFZGdlTGFiZWxDb29yZHNcIiwgICBmdW5jdGlvbigpIHsgZml4dXBFZGdlTGFiZWxDb29yZHMoZyk7IH0pO1xuICB0aW1lKFwiICAgIHVuZG9Db29yZGluYXRlU3lzdGVtXCIsICAgZnVuY3Rpb24oKSB7IGNvb3JkaW5hdGVTeXN0ZW0udW5kbyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgdHJhbnNsYXRlR3JhcGhcIiwgICAgICAgICBmdW5jdGlvbigpIHsgdHJhbnNsYXRlR3JhcGgoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFzc2lnbk5vZGVJbnRlcnNlY3RzXCIsICAgZnVuY3Rpb24oKSB7IGFzc2lnbk5vZGVJbnRlcnNlY3RzKGcpOyB9KTtcbiAgdGltZShcIiAgICByZXZlcnNlUG9pbnRzXCIsICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgYWN5Y2xpYy51bmRvXCIsICAgICAgICAgICBmdW5jdGlvbigpIHsgYWN5Y2xpYy51bmRvKGcpOyB9KTtcbn1cblxuLypcbiAqIENvcGllcyBmaW5hbCBsYXlvdXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGF5b3V0IGdyYXBoIGJhY2sgdG8gdGhlIGlucHV0XG4gKiBncmFwaC4gVGhpcyBwcm9jZXNzIG9ubHkgY29waWVzIHdoaXRlbGlzdGVkIGF0dHJpYnV0ZXMgZnJvbSB0aGUgbGF5b3V0IGdyYXBoXG4gKiB0byB0aGUgaW5wdXQgZ3JhcGgsIHNvIGl0IHNlcnZlcyBhcyBhIGdvb2QgcGxhY2UgdG8gZGV0ZXJtaW5lIHdoYXRcbiAqIGF0dHJpYnV0ZXMgY2FuIGluZmx1ZW5jZSBsYXlvdXQuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUlucHV0R3JhcGgoaW5wdXRHcmFwaCwgbGF5b3V0R3JhcGgpIHtcbiAgXy5mb3JFYWNoKGlucHV0R3JhcGgubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBpbnB1dExhYmVsID0gaW5wdXRHcmFwaC5ub2RlKHYpO1xuICAgIHZhciBsYXlvdXRMYWJlbCA9IGxheW91dEdyYXBoLm5vZGUodik7XG5cbiAgICBpZiAoaW5wdXRMYWJlbCkge1xuICAgICAgaW5wdXRMYWJlbC54ID0gbGF5b3V0TGFiZWwueDtcbiAgICAgIGlucHV0TGFiZWwueSA9IGxheW91dExhYmVsLnk7XG5cbiAgICAgIGlmIChsYXlvdXRHcmFwaC5jaGlsZHJlbih2KS5sZW5ndGgpIHtcbiAgICAgICAgaW5wdXRMYWJlbC53aWR0aCA9IGxheW91dExhYmVsLndpZHRoO1xuICAgICAgICBpbnB1dExhYmVsLmhlaWdodCA9IGxheW91dExhYmVsLmhlaWdodDtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChpbnB1dEdyYXBoLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgaW5wdXRMYWJlbCA9IGlucHV0R3JhcGguZWRnZShlKTtcbiAgICB2YXIgbGF5b3V0TGFiZWwgPSBsYXlvdXRHcmFwaC5lZGdlKGUpO1xuXG4gICAgaW5wdXRMYWJlbC5wb2ludHMgPSBsYXlvdXRMYWJlbC5wb2ludHM7XG4gICAgaWYgKF8uaGFzKGxheW91dExhYmVsLCBcInhcIikpIHtcbiAgICAgIGlucHV0TGFiZWwueCA9IGxheW91dExhYmVsLng7XG4gICAgICBpbnB1dExhYmVsLnkgPSBsYXlvdXRMYWJlbC55O1xuICAgIH1cbiAgfSk7XG5cbiAgaW5wdXRHcmFwaC5ncmFwaCgpLndpZHRoID0gbGF5b3V0R3JhcGguZ3JhcGgoKS53aWR0aDtcbiAgaW5wdXRHcmFwaC5ncmFwaCgpLmhlaWdodCA9IGxheW91dEdyYXBoLmdyYXBoKCkuaGVpZ2h0O1xufVxuXG52YXIgZ3JhcGhOdW1BdHRycyA9IFtcIm5vZGVzZXBcIiwgXCJlZGdlc2VwXCIsIFwicmFua3NlcFwiLCBcIm1hcmdpbnhcIiwgXCJtYXJnaW55XCJdO1xudmFyIGdyYXBoRGVmYXVsdHMgPSB7IHJhbmtzZXA6IDUwLCBlZGdlc2VwOiAyMCwgbm9kZXNlcDogNTAsIHJhbmtkaXI6IFwidGJcIiB9O1xudmFyIGdyYXBoQXR0cnMgPSBbXCJhY3ljbGljZXJcIiwgXCJyYW5rZXJcIiwgXCJyYW5rZGlyXCIsIFwiYWxpZ25cIl07XG52YXIgbm9kZU51bUF0dHJzID0gW1wid2lkdGhcIiwgXCJoZWlnaHRcIl07XG52YXIgbm9kZURlZmF1bHRzID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG52YXIgZWRnZU51bUF0dHJzID0gW1wibWlubGVuXCIsIFwid2VpZ2h0XCIsIFwid2lkdGhcIiwgXCJoZWlnaHRcIiwgXCJsYWJlbG9mZnNldFwiXTtcbnZhciBlZGdlRGVmYXVsdHMgPSB7XG4gIG1pbmxlbjogMSwgd2VpZ2h0OiAxLCB3aWR0aDogMCwgaGVpZ2h0OiAwLFxuICBsYWJlbG9mZnNldDogMTAsIGxhYmVscG9zOiBcInJcIlxufTtcbnZhciBlZGdlQXR0cnMgPSBbXCJsYWJlbHBvc1wiXTtcblxuLypcbiAqIENvbnN0cnVjdHMgYSBuZXcgZ3JhcGggZnJvbSB0aGUgaW5wdXQgZ3JhcGgsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBsYXlvdXQuXG4gKiBUaGlzIHByb2Nlc3MgY29waWVzIG9ubHkgd2hpdGVsaXN0ZWQgYXR0cmlidXRlcyBmcm9tIHRoZSBpbnB1dCBncmFwaCB0byB0aGVcbiAqIGxheW91dCBncmFwaC4gVGh1cyB0aGlzIGZ1bmN0aW9uIHNlcnZlcyBhcyBhIGdvb2QgcGxhY2UgdG8gZGV0ZXJtaW5lIHdoYXRcbiAqIGF0dHJpYnV0ZXMgY2FuIGluZmx1ZW5jZSBsYXlvdXQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTGF5b3V0R3JhcGgoaW5wdXRHcmFwaCkge1xuICB2YXIgZyA9IG5ldyBHcmFwaCh7IG11bHRpZ3JhcGg6IHRydWUsIGNvbXBvdW5kOiB0cnVlIH0pO1xuICB2YXIgZ3JhcGggPSBjYW5vbmljYWxpemUoaW5wdXRHcmFwaC5ncmFwaCgpKTtcblxuICBnLnNldEdyYXBoKF8ubWVyZ2Uoe30sXG4gICAgZ3JhcGhEZWZhdWx0cyxcbiAgICBzZWxlY3ROdW1iZXJBdHRycyhncmFwaCwgZ3JhcGhOdW1BdHRycyksXG4gICAgXy5waWNrKGdyYXBoLCBncmFwaEF0dHJzKSkpO1xuXG4gIF8uZm9yRWFjaChpbnB1dEdyYXBoLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLm5vZGUodikpO1xuICAgIGcuc2V0Tm9kZSh2LCBfLmRlZmF1bHRzKHNlbGVjdE51bWJlckF0dHJzKG5vZGUsIG5vZGVOdW1BdHRycyksIG5vZGVEZWZhdWx0cykpO1xuICAgIGcuc2V0UGFyZW50KHYsIGlucHV0R3JhcGgucGFyZW50KHYpKTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGlucHV0R3JhcGguZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gY2Fub25pY2FsaXplKGlucHV0R3JhcGguZWRnZShlKSk7XG4gICAgZy5zZXRFZGdlKGUsIF8ubWVyZ2Uoe30sXG4gICAgICBlZGdlRGVmYXVsdHMsXG4gICAgICBzZWxlY3ROdW1iZXJBdHRycyhlZGdlLCBlZGdlTnVtQXR0cnMpLFxuICAgICAgXy5waWNrKGVkZ2UsIGVkZ2VBdHRycykpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGc7XG59XG5cbi8qXG4gKiBUaGlzIGlkZWEgY29tZXMgZnJvbSB0aGUgR2Fuc25lciBwYXBlcjogdG8gYWNjb3VudCBmb3IgZWRnZSBsYWJlbHMgaW4gb3VyXG4gKiBsYXlvdXQgd2Ugc3BsaXQgZWFjaCByYW5rIGluIGhhbGYgYnkgZG91YmxpbmcgbWlubGVuIGFuZCBoYWx2aW5nIHJhbmtzZXAuXG4gKiBUaGVuIHdlIGNhbiBwbGFjZSBsYWJlbHMgYXQgdGhlc2UgbWlkLXBvaW50cyBiZXR3ZWVuIG5vZGVzLlxuICpcbiAqIFdlIGFsc28gYWRkIHNvbWUgbWluaW1hbCBwYWRkaW5nIHRvIHRoZSB3aWR0aCB0byBwdXNoIHRoZSBsYWJlbCBmb3IgdGhlIGVkZ2VcbiAqIGF3YXkgZnJvbSB0aGUgZWRnZSBpdHNlbGYgYSBiaXQuXG4gKi9cbmZ1bmN0aW9uIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMoZykge1xuICB2YXIgZ3JhcGggPSBnLmdyYXBoKCk7XG4gIGdyYXBoLnJhbmtzZXAgLz0gMjtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGVkZ2UubWlubGVuICo9IDI7XG4gICAgaWYgKGVkZ2UubGFiZWxwb3MudG9Mb3dlckNhc2UoKSAhPT0gXCJjXCIpIHtcbiAgICAgIGlmIChncmFwaC5yYW5rZGlyID09PSBcIlRCXCIgfHwgZ3JhcGgucmFua2RpciA9PT0gXCJCVFwiKSB7XG4gICAgICAgIGVkZ2Uud2lkdGggKz0gZWRnZS5sYWJlbG9mZnNldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVkZ2UuaGVpZ2h0ICs9IGVkZ2UubGFiZWxvZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLypcbiAqIENyZWF0ZXMgdGVtcG9yYXJ5IGR1bW15IG5vZGVzIHRoYXQgY2FwdHVyZSB0aGUgcmFuayBpbiB3aGljaCBlYWNoIGVkZ2Unc1xuICogbGFiZWwgaXMgZ29pbmcgdG8sIGlmIGl0IGhhcyBvbmUgb2Ygbm9uLXplcm8gd2lkdGggYW5kIGhlaWdodC4gV2UgZG8gdGhpc1xuICogc28gdGhhdCB3ZSBjYW4gc2FmZWx5IHJlbW92ZSBlbXB0eSByYW5rcyB3aGlsZSBwcmVzZXJ2aW5nIGJhbGFuY2UgZm9yIHRoZVxuICogbGFiZWwncyBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKSB7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBpZiAoZWRnZS53aWR0aCAmJiBlZGdlLmhlaWdodCkge1xuICAgICAgdmFyIHYgPSBnLm5vZGUoZS52KTtcbiAgICAgIHZhciB3ID0gZy5ub2RlKGUudyk7XG4gICAgICB2YXIgbGFiZWwgPSB7IHJhbms6ICh3LnJhbmsgLSB2LnJhbmspIC8gMiArIHYucmFuaywgZTogZSB9O1xuICAgICAgdXRpbC5hZGREdW1teU5vZGUoZywgXCJlZGdlLXByb3h5XCIsIGxhYmVsLCBcIl9lcFwiKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25SYW5rTWluTWF4KGcpIHtcbiAgdmFyIG1heFJhbmsgPSAwO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKG5vZGUuYm9yZGVyVG9wKSB7XG4gICAgICBub2RlLm1pblJhbmsgPSBnLm5vZGUobm9kZS5ib3JkZXJUb3ApLnJhbms7XG4gICAgICBub2RlLm1heFJhbmsgPSBnLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pLnJhbms7XG4gICAgICBtYXhSYW5rID0gXy5tYXgobWF4UmFuaywgbm9kZS5tYXhSYW5rKTtcbiAgICB9XG4gIH0pO1xuICBnLmdyYXBoKCkubWF4UmFuayA9IG1heFJhbms7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVkZ2VMYWJlbFByb3hpZXMoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKG5vZGUuZHVtbXkgPT09IFwiZWRnZS1wcm94eVwiKSB7XG4gICAgICBnLmVkZ2Uobm9kZS5lKS5sYWJlbFJhbmsgPSBub2RlLnJhbms7XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlR3JhcGgoZykge1xuICB2YXIgbWluWCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgdmFyIG1heFggPSAwO1xuICB2YXIgbWluWSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgdmFyIG1heFkgPSAwO1xuICB2YXIgZ3JhcGhMYWJlbCA9IGcuZ3JhcGgoKTtcbiAgdmFyIG1hcmdpblggPSBncmFwaExhYmVsLm1hcmdpbnggfHwgMDtcbiAgdmFyIG1hcmdpblkgPSBncmFwaExhYmVsLm1hcmdpbnkgfHwgMDtcblxuICBmdW5jdGlvbiBnZXRFeHRyZW1lcyhhdHRycykge1xuICAgIHZhciB4ID0gYXR0cnMueDtcbiAgICB2YXIgeSA9IGF0dHJzLnk7XG4gICAgdmFyIHcgPSBhdHRycy53aWR0aDtcbiAgICB2YXIgaCA9IGF0dHJzLmhlaWdodDtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCAtIHcgLyAyKTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeCArIHcgLyAyKTtcbiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgeSAtIGggLyAyKTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSArIGggLyAyKTtcbiAgfVxuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgZ2V0RXh0cmVtZXMoZy5ub2RlKHYpKTsgfSk7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ4XCIpKSB7XG4gICAgICBnZXRFeHRyZW1lcyhlZGdlKTtcbiAgICB9XG4gIH0pO1xuXG4gIG1pblggLT0gbWFyZ2luWDtcbiAgbWluWSAtPSBtYXJnaW5ZO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBub2RlLnggLT0gbWluWDtcbiAgICBub2RlLnkgLT0gbWluWTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIF8uZm9yRWFjaChlZGdlLnBvaW50cywgZnVuY3Rpb24ocCkge1xuICAgICAgcC54IC09IG1pblg7XG4gICAgICBwLnkgLT0gbWluWTtcbiAgICB9KTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ4XCIpKSB7IGVkZ2UueCAtPSBtaW5YOyB9XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieVwiKSkgeyBlZGdlLnkgLT0gbWluWTsgfVxuICB9KTtcblxuICBncmFwaExhYmVsLndpZHRoID0gbWF4WCAtIG1pblggKyBtYXJnaW5YO1xuICBncmFwaExhYmVsLmhlaWdodCA9IG1heFkgLSBtaW5ZICsgbWFyZ2luWTtcbn1cblxuZnVuY3Rpb24gYXNzaWduTm9kZUludGVyc2VjdHMoZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgdmFyIG5vZGVWID0gZy5ub2RlKGUudik7XG4gICAgdmFyIG5vZGVXID0gZy5ub2RlKGUudyk7XG4gICAgdmFyIHAxLCBwMjtcbiAgICBpZiAoIWVkZ2UucG9pbnRzKSB7XG4gICAgICBlZGdlLnBvaW50cyA9IFtdO1xuICAgICAgcDEgPSBub2RlVztcbiAgICAgIHAyID0gbm9kZVY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAxID0gZWRnZS5wb2ludHNbMF07XG4gICAgICBwMiA9IGVkZ2UucG9pbnRzW2VkZ2UucG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICBlZGdlLnBvaW50cy51bnNoaWZ0KHV0aWwuaW50ZXJzZWN0UmVjdChub2RlViwgcDEpKTtcbiAgICBlZGdlLnBvaW50cy5wdXNoKHV0aWwuaW50ZXJzZWN0UmVjdChub2RlVywgcDIpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGZpeHVwRWRnZUxhYmVsQ29vcmRzKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGlmIChfLmhhcyhlZGdlLCBcInhcIikpIHtcbiAgICAgIGlmIChlZGdlLmxhYmVscG9zID09PSBcImxcIiB8fCBlZGdlLmxhYmVscG9zID09PSBcInJcIikge1xuICAgICAgICBlZGdlLndpZHRoIC09IGVkZ2UubGFiZWxvZmZzZXQ7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGVkZ2UubGFiZWxwb3MpIHtcbiAgICAgIGNhc2UgXCJsXCI6IGVkZ2UueCAtPSBlZGdlLndpZHRoIC8gMiArIGVkZ2UubGFiZWxvZmZzZXQ7IGJyZWFrO1xuICAgICAgY2FzZSBcInJcIjogZWRnZS54ICs9IGVkZ2Uud2lkdGggLyAyICsgZWRnZS5sYWJlbG9mZnNldDsgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVBvaW50c0ZvclJldmVyc2VkRWRnZXMoZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKGVkZ2UucmV2ZXJzZWQpIHtcbiAgICAgIGVkZ2UucG9pbnRzLnJldmVyc2UoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVCb3JkZXJOb2RlcyhnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoZy5jaGlsZHJlbih2KS5sZW5ndGgpIHtcbiAgICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgICAgdmFyIHQgPSBnLm5vZGUobm9kZS5ib3JkZXJUb3ApO1xuICAgICAgdmFyIGIgPSBnLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pO1xuICAgICAgdmFyIGwgPSBnLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyTGVmdCkpO1xuICAgICAgdmFyIHIgPSBnLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyUmlnaHQpKTtcblxuICAgICAgbm9kZS53aWR0aCA9IE1hdGguYWJzKHIueCAtIGwueCk7XG4gICAgICBub2RlLmhlaWdodCA9IE1hdGguYWJzKGIueSAtIHQueSk7XG4gICAgICBub2RlLnggPSBsLnggKyBub2RlLndpZHRoIC8gMjtcbiAgICAgIG5vZGUueSA9IHQueSArIG5vZGUuaGVpZ2h0IC8gMjtcbiAgICB9XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoZy5ub2RlKHYpLmR1bW15ID09PSBcImJvcmRlclwiKSB7XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU2VsZkVkZ2VzKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIGlmIChlLnYgPT09IGUudykge1xuICAgICAgdmFyIG5vZGUgPSBnLm5vZGUoZS52KTtcbiAgICAgIGlmICghbm9kZS5zZWxmRWRnZXMpIHtcbiAgICAgICAgbm9kZS5zZWxmRWRnZXMgPSBbXTtcbiAgICAgIH1cbiAgICAgIG5vZGUuc2VsZkVkZ2VzLnB1c2goeyBlOiBlLCBsYWJlbDogZy5lZGdlKGUpIH0pO1xuICAgICAgZy5yZW1vdmVFZGdlKGUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGluc2VydFNlbGZFZGdlcyhnKSB7XG4gIHZhciBsYXllcnMgPSB1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7XG4gIF8uZm9yRWFjaChsYXllcnMsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgdmFyIG9yZGVyU2hpZnQgPSAwO1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgaSkge1xuICAgICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgICBub2RlLm9yZGVyID0gaSArIG9yZGVyU2hpZnQ7XG4gICAgICBfLmZvckVhY2gobm9kZS5zZWxmRWRnZXMsIGZ1bmN0aW9uKHNlbGZFZGdlKSB7XG4gICAgICAgIHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwic2VsZmVkZ2VcIiwge1xuICAgICAgICAgIHdpZHRoOiBzZWxmRWRnZS5sYWJlbC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHNlbGZFZGdlLmxhYmVsLmhlaWdodCxcbiAgICAgICAgICByYW5rOiBub2RlLnJhbmssXG4gICAgICAgICAgb3JkZXI6IGkgKyAoKytvcmRlclNoaWZ0KSxcbiAgICAgICAgICBlOiBzZWxmRWRnZS5lLFxuICAgICAgICAgIGxhYmVsOiBzZWxmRWRnZS5sYWJlbFxuICAgICAgICB9LCBcIl9zZVwiKTtcbiAgICAgIH0pO1xuICAgICAgZGVsZXRlIG5vZGUuc2VsZkVkZ2VzO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpb25TZWxmRWRnZXMoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKG5vZGUuZHVtbXkgPT09IFwic2VsZmVkZ2VcIikge1xuICAgICAgdmFyIHNlbGZOb2RlID0gZy5ub2RlKG5vZGUuZS52KTtcbiAgICAgIHZhciB4ID0gc2VsZk5vZGUueCArIHNlbGZOb2RlLndpZHRoIC8gMjtcbiAgICAgIHZhciB5ID0gc2VsZk5vZGUueTtcbiAgICAgIHZhciBkeCA9IG5vZGUueCAtIHg7XG4gICAgICB2YXIgZHkgPSBzZWxmTm9kZS5oZWlnaHQgLyAyO1xuICAgICAgZy5zZXRFZGdlKG5vZGUuZSwgbm9kZS5sYWJlbCk7XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgICBub2RlLmxhYmVsLnBvaW50cyA9IFtcbiAgICAgICAgeyB4OiB4ICsgMiAqIGR4IC8gMywgeTogeSAtIGR5IH0sXG4gICAgICAgIHsgeDogeCArIDUgKiBkeCAvIDYsIHk6IHkgLSBkeSB9LFxuICAgICAgICB7IHg6IHggKyAgICAgZHggICAgLCB5OiB5IH0sXG4gICAgICAgIHsgeDogeCArIDUgKiBkeCAvIDYsIHk6IHkgKyBkeSB9LFxuICAgICAgICB7IHg6IHggKyAyICogZHggLyAzLCB5OiB5ICsgZHkgfVxuICAgICAgXTtcbiAgICAgIG5vZGUubGFiZWwueCA9IG5vZGUueDtcbiAgICAgIG5vZGUubGFiZWwueSA9IG5vZGUueTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZWxlY3ROdW1iZXJBdHRycyhvYmosIGF0dHJzKSB7XG4gIHJldHVybiBfLm1hcFZhbHVlcyhfLnBpY2sob2JqLCBhdHRycyksIE51bWJlcik7XG59XG5cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShhdHRycykge1xuICB2YXIgbmV3QXR0cnMgPSB7fTtcbiAgXy5mb3JFYWNoKGF0dHJzLCBmdW5jdGlvbih2LCBrKSB7XG4gICAgbmV3QXR0cnNbay50b0xvd2VyQ2FzZSgpXSA9IHY7XG4gIH0pO1xuICByZXR1cm4gbmV3QXR0cnM7XG59XG4iLCIvKiBnbG9iYWwgd2luZG93ICovXG5cbnZhciBsb2Rhc2g7XG5cbmlmICh0eXBlb2YgcmVxdWlyZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gIHRyeSB7XG4gICAgbG9kYXNoID0ge1xuICAgICAgY2xvbmVEZWVwOiByZXF1aXJlKFwibG9kYXNoL2Nsb25lRGVlcFwiKSxcbiAgICAgIGNvbnN0YW50OiByZXF1aXJlKFwibG9kYXNoL2NvbnN0YW50XCIpLFxuICAgICAgZGVmYXVsdHM6IHJlcXVpcmUoXCJsb2Rhc2gvZGVmYXVsdHNcIiksXG4gICAgICBlYWNoOiByZXF1aXJlKFwibG9kYXNoL2VhY2hcIiksXG4gICAgICBmaWx0ZXI6IHJlcXVpcmUoXCJsb2Rhc2gvZmlsdGVyXCIpLFxuICAgICAgZmluZDogcmVxdWlyZShcImxvZGFzaC9maW5kXCIpLFxuICAgICAgZmxhdHRlbjogcmVxdWlyZShcImxvZGFzaC9mbGF0dGVuXCIpLFxuICAgICAgZm9yRWFjaDogcmVxdWlyZShcImxvZGFzaC9mb3JFYWNoXCIpLFxuICAgICAgZm9ySW46IHJlcXVpcmUoXCJsb2Rhc2gvZm9ySW5cIiksXG4gICAgICBoYXM6ICByZXF1aXJlKFwibG9kYXNoL2hhc1wiKSxcbiAgICAgIGlzVW5kZWZpbmVkOiByZXF1aXJlKFwibG9kYXNoL2lzVW5kZWZpbmVkXCIpLFxuICAgICAgbGFzdDogcmVxdWlyZShcImxvZGFzaC9sYXN0XCIpLFxuICAgICAgbWFwOiByZXF1aXJlKFwibG9kYXNoL21hcFwiKSxcbiAgICAgIG1hcFZhbHVlczogcmVxdWlyZShcImxvZGFzaC9tYXBWYWx1ZXNcIiksXG4gICAgICBtYXg6IHJlcXVpcmUoXCJsb2Rhc2gvbWF4XCIpLFxuICAgICAgbWVyZ2U6IHJlcXVpcmUoXCJsb2Rhc2gvbWVyZ2VcIiksXG4gICAgICBtaW46IHJlcXVpcmUoXCJsb2Rhc2gvbWluXCIpLFxuICAgICAgbWluQnk6IHJlcXVpcmUoXCJsb2Rhc2gvbWluQnlcIiksXG4gICAgICBub3c6IHJlcXVpcmUoXCJsb2Rhc2gvbm93XCIpLFxuICAgICAgcGljazogcmVxdWlyZShcImxvZGFzaC9waWNrXCIpLFxuICAgICAgcmFuZ2U6IHJlcXVpcmUoXCJsb2Rhc2gvcmFuZ2VcIiksXG4gICAgICByZWR1Y2U6IHJlcXVpcmUoXCJsb2Rhc2gvcmVkdWNlXCIpLFxuICAgICAgc29ydEJ5OiByZXF1aXJlKFwibG9kYXNoL3NvcnRCeVwiKSxcbiAgICAgIHVuaXF1ZUlkOiByZXF1aXJlKFwibG9kYXNoL3VuaXF1ZUlkXCIpLFxuICAgICAgdmFsdWVzOiByZXF1aXJlKFwibG9kYXNoL3ZhbHVlc1wiKSxcbiAgICAgIHppcE9iamVjdDogcmVxdWlyZShcImxvZGFzaC96aXBPYmplY3RcIiksXG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgZXJyb3JcbiAgfVxufVxuXG5pZiAoIWxvZGFzaCkge1xuICBsb2Rhc2ggPSB3aW5kb3cuXztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsb2Rhc2g7XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJ1bjogcnVuLFxuICBjbGVhbnVwOiBjbGVhbnVwXG59O1xuXG4vKlxuICogQSBuZXN0aW5nIGdyYXBoIGNyZWF0ZXMgZHVtbXkgbm9kZXMgZm9yIHRoZSB0b3BzIGFuZCBib3R0b21zIG9mIHN1YmdyYXBocyxcbiAqIGFkZHMgYXBwcm9wcmlhdGUgZWRnZXMgdG8gZW5zdXJlIHRoYXQgYWxsIGNsdXN0ZXIgbm9kZXMgYXJlIHBsYWNlZCBiZXR3ZWVuXG4gKiB0aGVzZSBib3VuZHJpZXMsIGFuZCBlbnN1cmVzIHRoYXQgdGhlIGdyYXBoIGlzIGNvbm5lY3RlZC5cbiAqXG4gKiBJbiBhZGRpdGlvbiB3ZSBlbnN1cmUsIHRocm91Z2ggdGhlIHVzZSBvZiB0aGUgbWlubGVuIHByb3BlcnR5LCB0aGF0IG5vZGVzXG4gKiBhbmQgc3ViZ3JhcGggYm9yZGVyIG5vZGVzIHRvIG5vdCBlbmQgdXAgb24gdGhlIHNhbWUgcmFuay5cbiAqXG4gKiBQcmVjb25kaXRpb25zOlxuICpcbiAqICAgIDEuIElucHV0IGdyYXBoIGlzIGEgREFHXG4gKiAgICAyLiBOb2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGFzIGEgbWlubGVuIGF0dHJpYnV0ZVxuICpcbiAqIFBvc3Rjb25kaXRpb25zOlxuICpcbiAqICAgIDEuIElucHV0IGdyYXBoIGlzIGNvbm5lY3RlZC5cbiAqICAgIDIuIER1bW15IG5vZGVzIGFyZSBhZGRlZCBmb3IgdGhlIHRvcHMgYW5kIGJvdHRvbXMgb2Ygc3ViZ3JhcGhzLlxuICogICAgMy4gVGhlIG1pbmxlbiBhdHRyaWJ1dGUgZm9yIG5vZGVzIGlzIGFkanVzdGVkIHRvIGVuc3VyZSBub2RlcyBkbyBub3RcbiAqICAgICAgIGdldCBwbGFjZWQgb24gdGhlIHNhbWUgcmFuayBhcyBzdWJncmFwaCBib3JkZXIgbm9kZXMuXG4gKlxuICogVGhlIG5lc3RpbmcgZ3JhcGggaWRlYSBjb21lcyBmcm9tIFNhbmRlciwgXCJMYXlvdXQgb2YgQ29tcG91bmQgRGlyZWN0ZWRcbiAqIEdyYXBocy5cIlxuICovXG5mdW5jdGlvbiBydW4oZykge1xuICB2YXIgcm9vdCA9IHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwicm9vdFwiLCB7fSwgXCJfcm9vdFwiKTtcbiAgdmFyIGRlcHRocyA9IHRyZWVEZXB0aHMoZyk7XG4gIHZhciBoZWlnaHQgPSBfLm1heChfLnZhbHVlcyhkZXB0aHMpKSAtIDE7IC8vIE5vdGU6IGRlcHRocyBpcyBhbiBPYmplY3Qgbm90IGFuIGFycmF5XG4gIHZhciBub2RlU2VwID0gMiAqIGhlaWdodCArIDE7XG5cbiAgZy5ncmFwaCgpLm5lc3RpbmdSb290ID0gcm9vdDtcblxuICAvLyBNdWx0aXBseSBtaW5sZW4gYnkgbm9kZVNlcCB0byBhbGlnbiBub2RlcyBvbiBub24tYm9yZGVyIHJhbmtzLlxuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7IGcuZWRnZShlKS5taW5sZW4gKj0gbm9kZVNlcDsgfSk7XG5cbiAgLy8gQ2FsY3VsYXRlIGEgd2VpZ2h0IHRoYXQgaXMgc3VmZmljaWVudCB0byBrZWVwIHN1YmdyYXBocyB2ZXJ0aWNhbGx5IGNvbXBhY3RcbiAgdmFyIHdlaWdodCA9IHN1bVdlaWdodHMoZykgKyAxO1xuXG4gIC8vIENyZWF0ZSBib3JkZXIgbm9kZXMgYW5kIGxpbmsgdGhlbSB1cFxuICBfLmZvckVhY2goZy5jaGlsZHJlbigpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgIGRmcyhnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCBjaGlsZCk7XG4gIH0pO1xuXG4gIC8vIFNhdmUgdGhlIG11bHRpcGxpZXIgZm9yIG5vZGUgbGF5ZXJzIGZvciBsYXRlciByZW1vdmFsIG9mIGVtcHR5IGJvcmRlclxuICAvLyBsYXllcnMuXG4gIGcuZ3JhcGgoKS5ub2RlUmFua0ZhY3RvciA9IG5vZGVTZXA7XG59XG5cbmZ1bmN0aW9uIGRmcyhnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCB2KSB7XG4gIHZhciBjaGlsZHJlbiA9IGcuY2hpbGRyZW4odik7XG4gIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgaWYgKHYgIT09IHJvb3QpIHtcbiAgICAgIGcuc2V0RWRnZShyb290LCB2LCB7IHdlaWdodDogMCwgbWlubGVuOiBub2RlU2VwIH0pO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdG9wID0gdXRpbC5hZGRCb3JkZXJOb2RlKGcsIFwiX2J0XCIpO1xuICB2YXIgYm90dG9tID0gdXRpbC5hZGRCb3JkZXJOb2RlKGcsIFwiX2JiXCIpO1xuICB2YXIgbGFiZWwgPSBnLm5vZGUodik7XG5cbiAgZy5zZXRQYXJlbnQodG9wLCB2KTtcbiAgbGFiZWwuYm9yZGVyVG9wID0gdG9wO1xuICBnLnNldFBhcmVudChib3R0b20sIHYpO1xuICBsYWJlbC5ib3JkZXJCb3R0b20gPSBib3R0b207XG5cbiAgXy5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgIGRmcyhnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCBjaGlsZCk7XG5cbiAgICB2YXIgY2hpbGROb2RlID0gZy5ub2RlKGNoaWxkKTtcbiAgICB2YXIgY2hpbGRUb3AgPSBjaGlsZE5vZGUuYm9yZGVyVG9wID8gY2hpbGROb2RlLmJvcmRlclRvcCA6IGNoaWxkO1xuICAgIHZhciBjaGlsZEJvdHRvbSA9IGNoaWxkTm9kZS5ib3JkZXJCb3R0b20gPyBjaGlsZE5vZGUuYm9yZGVyQm90dG9tIDogY2hpbGQ7XG4gICAgdmFyIHRoaXNXZWlnaHQgPSBjaGlsZE5vZGUuYm9yZGVyVG9wID8gd2VpZ2h0IDogMiAqIHdlaWdodDtcbiAgICB2YXIgbWlubGVuID0gY2hpbGRUb3AgIT09IGNoaWxkQm90dG9tID8gMSA6IGhlaWdodCAtIGRlcHRoc1t2XSArIDE7XG5cbiAgICBnLnNldEVkZ2UodG9wLCBjaGlsZFRvcCwge1xuICAgICAgd2VpZ2h0OiB0aGlzV2VpZ2h0LFxuICAgICAgbWlubGVuOiBtaW5sZW4sXG4gICAgICBuZXN0aW5nRWRnZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgZy5zZXRFZGdlKGNoaWxkQm90dG9tLCBib3R0b20sIHtcbiAgICAgIHdlaWdodDogdGhpc1dlaWdodCxcbiAgICAgIG1pbmxlbjogbWlubGVuLFxuICAgICAgbmVzdGluZ0VkZ2U6IHRydWVcbiAgICB9KTtcbiAgfSk7XG5cbiAgaWYgKCFnLnBhcmVudCh2KSkge1xuICAgIGcuc2V0RWRnZShyb290LCB0b3AsIHsgd2VpZ2h0OiAwLCBtaW5sZW46IGhlaWdodCArIGRlcHRoc1t2XSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmVlRGVwdGhzKGcpIHtcbiAgdmFyIGRlcHRocyA9IHt9O1xuICBmdW5jdGlvbiBkZnModiwgZGVwdGgpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBnLmNoaWxkcmVuKHYpO1xuICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIF8uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgZGZzKGNoaWxkLCBkZXB0aCArIDEpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGRlcHRoc1t2XSA9IGRlcHRoO1xuICB9XG4gIF8uZm9yRWFjaChnLmNoaWxkcmVuKCksIGZ1bmN0aW9uKHYpIHsgZGZzKHYsIDEpOyB9KTtcbiAgcmV0dXJuIGRlcHRocztcbn1cblxuZnVuY3Rpb24gc3VtV2VpZ2h0cyhnKSB7XG4gIHJldHVybiBfLnJlZHVjZShnLmVkZ2VzKCksIGZ1bmN0aW9uKGFjYywgZSkge1xuICAgIHJldHVybiBhY2MgKyBnLmVkZ2UoZSkud2VpZ2h0O1xuICB9LCAwKTtcbn1cblxuZnVuY3Rpb24gY2xlYW51cChnKSB7XG4gIHZhciBncmFwaExhYmVsID0gZy5ncmFwaCgpO1xuICBnLnJlbW92ZU5vZGUoZ3JhcGhMYWJlbC5uZXN0aW5nUm9vdCk7XG4gIGRlbGV0ZSBncmFwaExhYmVsLm5lc3RpbmdSb290O1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKGVkZ2UubmVzdGluZ0VkZ2UpIHtcbiAgICAgIGcucmVtb3ZlRWRnZShlKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcnVuOiBydW4sXG4gIHVuZG86IHVuZG9cbn07XG5cbi8qXG4gKiBCcmVha3MgYW55IGxvbmcgZWRnZXMgaW4gdGhlIGdyYXBoIGludG8gc2hvcnQgc2VnbWVudHMgdGhhdCBzcGFuIDEgbGF5ZXJcbiAqIGVhY2guIFRoaXMgb3BlcmF0aW9uIGlzIHVuZG9hYmxlIHdpdGggdGhlIGRlbm9ybWFsaXplIGZ1bmN0aW9uLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIFRoZSBpbnB1dCBncmFwaCBpcyBhIERBRy5cbiAqICAgIDIuIEVhY2ggbm9kZSBpbiB0aGUgZ3JhcGggaGFzIGEgXCJyYW5rXCIgcHJvcGVydHkuXG4gKlxuICogUG9zdC1jb25kaXRpb246XG4gKlxuICogICAgMS4gQWxsIGVkZ2VzIGluIHRoZSBncmFwaCBoYXZlIGEgbGVuZ3RoIG9mIDEuXG4gKiAgICAyLiBEdW1teSBub2RlcyBhcmUgYWRkZWQgd2hlcmUgZWRnZXMgaGF2ZSBiZWVuIHNwbGl0IGludG8gc2VnbWVudHMuXG4gKiAgICAzLiBUaGUgZ3JhcGggaXMgYXVnbWVudGVkIHdpdGggYSBcImR1bW15Q2hhaW5zXCIgYXR0cmlidXRlIHdoaWNoIGNvbnRhaW5zXG4gKiAgICAgICB0aGUgZmlyc3QgZHVtbXkgaW4gZWFjaCBjaGFpbiBvZiBkdW1teSBub2RlcyBwcm9kdWNlZC5cbiAqL1xuZnVuY3Rpb24gcnVuKGcpIHtcbiAgZy5ncmFwaCgpLmR1bW15Q2hhaW5zID0gW107XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGVkZ2UpIHsgbm9ybWFsaXplRWRnZShnLCBlZGdlKTsgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVkZ2UoZywgZSkge1xuICB2YXIgdiA9IGUudjtcbiAgdmFyIHZSYW5rID0gZy5ub2RlKHYpLnJhbms7XG4gIHZhciB3ID0gZS53O1xuICB2YXIgd1JhbmsgPSBnLm5vZGUodykucmFuaztcbiAgdmFyIG5hbWUgPSBlLm5hbWU7XG4gIHZhciBlZGdlTGFiZWwgPSBnLmVkZ2UoZSk7XG4gIHZhciBsYWJlbFJhbmsgPSBlZGdlTGFiZWwubGFiZWxSYW5rO1xuXG4gIGlmICh3UmFuayA9PT0gdlJhbmsgKyAxKSByZXR1cm47XG5cbiAgZy5yZW1vdmVFZGdlKGUpO1xuXG4gIHZhciBkdW1teSwgYXR0cnMsIGk7XG4gIGZvciAoaSA9IDAsICsrdlJhbms7IHZSYW5rIDwgd1Jhbms7ICsraSwgKyt2UmFuaykge1xuICAgIGVkZ2VMYWJlbC5wb2ludHMgPSBbXTtcbiAgICBhdHRycyA9IHtcbiAgICAgIHdpZHRoOiAwLCBoZWlnaHQ6IDAsXG4gICAgICBlZGdlTGFiZWw6IGVkZ2VMYWJlbCwgZWRnZU9iajogZSxcbiAgICAgIHJhbms6IHZSYW5rXG4gICAgfTtcbiAgICBkdW1teSA9IHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwiZWRnZVwiLCBhdHRycywgXCJfZFwiKTtcbiAgICBpZiAodlJhbmsgPT09IGxhYmVsUmFuaykge1xuICAgICAgYXR0cnMud2lkdGggPSBlZGdlTGFiZWwud2lkdGg7XG4gICAgICBhdHRycy5oZWlnaHQgPSBlZGdlTGFiZWwuaGVpZ2h0O1xuICAgICAgYXR0cnMuZHVtbXkgPSBcImVkZ2UtbGFiZWxcIjtcbiAgICAgIGF0dHJzLmxhYmVscG9zID0gZWRnZUxhYmVsLmxhYmVscG9zO1xuICAgIH1cbiAgICBnLnNldEVkZ2UodiwgZHVtbXksIHsgd2VpZ2h0OiBlZGdlTGFiZWwud2VpZ2h0IH0sIG5hbWUpO1xuICAgIGlmIChpID09PSAwKSB7XG4gICAgICBnLmdyYXBoKCkuZHVtbXlDaGFpbnMucHVzaChkdW1teSk7XG4gICAgfVxuICAgIHYgPSBkdW1teTtcbiAgfVxuXG4gIGcuc2V0RWRnZSh2LCB3LCB7IHdlaWdodDogZWRnZUxhYmVsLndlaWdodCB9LCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gdW5kbyhnKSB7XG4gIF8uZm9yRWFjaChnLmdyYXBoKCkuZHVtbXlDaGFpbnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICB2YXIgb3JpZ0xhYmVsID0gbm9kZS5lZGdlTGFiZWw7XG4gICAgdmFyIHc7XG4gICAgZy5zZXRFZGdlKG5vZGUuZWRnZU9iaiwgb3JpZ0xhYmVsKTtcbiAgICB3aGlsZSAobm9kZS5kdW1teSkge1xuICAgICAgdyA9IGcuc3VjY2Vzc29ycyh2KVswXTtcbiAgICAgIGcucmVtb3ZlTm9kZSh2KTtcbiAgICAgIG9yaWdMYWJlbC5wb2ludHMucHVzaCh7IHg6IG5vZGUueCwgeTogbm9kZS55IH0pO1xuICAgICAgaWYgKG5vZGUuZHVtbXkgPT09IFwiZWRnZS1sYWJlbFwiKSB7XG4gICAgICAgIG9yaWdMYWJlbC54ID0gbm9kZS54O1xuICAgICAgICBvcmlnTGFiZWwueSA9IG5vZGUueTtcbiAgICAgICAgb3JpZ0xhYmVsLndpZHRoID0gbm9kZS53aWR0aDtcbiAgICAgICAgb3JpZ0xhYmVsLmhlaWdodCA9IG5vZGUuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgdiA9IHc7XG4gICAgICBub2RlID0gZy5ub2RlKHYpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gYWRkU3ViZ3JhcGhDb25zdHJhaW50cztcblxuZnVuY3Rpb24gYWRkU3ViZ3JhcGhDb25zdHJhaW50cyhnLCBjZywgdnMpIHtcbiAgdmFyIHByZXYgPSB7fSxcbiAgICByb290UHJldjtcblxuICBfLmZvckVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgY2hpbGQgPSBnLnBhcmVudCh2KSxcbiAgICAgIHBhcmVudCxcbiAgICAgIHByZXZDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIHBhcmVudCA9IGcucGFyZW50KGNoaWxkKTtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcHJldkNoaWxkID0gcHJldltwYXJlbnRdO1xuICAgICAgICBwcmV2W3BhcmVudF0gPSBjaGlsZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByZXZDaGlsZCA9IHJvb3RQcmV2O1xuICAgICAgICByb290UHJldiA9IGNoaWxkO1xuICAgICAgfVxuICAgICAgaWYgKHByZXZDaGlsZCAmJiBwcmV2Q2hpbGQgIT09IGNoaWxkKSB7XG4gICAgICAgIGNnLnNldEVkZ2UocHJldkNoaWxkLCBjaGlsZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNoaWxkID0gcGFyZW50O1xuICAgIH1cbiAgfSk7XG5cbiAgLypcbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB2ID8gZy5jaGlsZHJlbih2KSA6IGcuY2hpbGRyZW4oKTtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICB2YXIgbWluID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgICAgICAgIHN1YmdyYXBocyA9IFtdO1xuICAgICAgXy5lYWNoKGNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICB2YXIgY2hpbGRNaW4gPSBkZnMoY2hpbGQpO1xuICAgICAgICBpZiAoZy5jaGlsZHJlbihjaGlsZCkubGVuZ3RoKSB7XG4gICAgICAgICAgc3ViZ3JhcGhzLnB1c2goeyB2OiBjaGlsZCwgb3JkZXI6IGNoaWxkTWluIH0pO1xuICAgICAgICB9XG4gICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgY2hpbGRNaW4pO1xuICAgICAgfSk7XG4gICAgICBfLnJlZHVjZShfLnNvcnRCeShzdWJncmFwaHMsIFwib3JkZXJcIiksIGZ1bmN0aW9uKHByZXYsIGN1cnIpIHtcbiAgICAgICAgY2cuc2V0RWRnZShwcmV2LnYsIGN1cnIudik7XG4gICAgICAgIHJldHVybiBjdXJyO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWluO1xuICAgIH1cbiAgICByZXR1cm4gZy5ub2RlKHYpLm9yZGVyO1xuICB9XG4gIGRmcyh1bmRlZmluZWQpO1xuICAqL1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhcnljZW50ZXI7XG5cbmZ1bmN0aW9uIGJhcnljZW50ZXIoZywgbW92YWJsZSkge1xuICByZXR1cm4gXy5tYXAobW92YWJsZSwgZnVuY3Rpb24odikge1xuICAgIHZhciBpblYgPSBnLmluRWRnZXModik7XG4gICAgaWYgKCFpblYubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyB2OiB2IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXN1bHQgPSBfLnJlZHVjZShpblYsIGZ1bmN0aW9uKGFjYywgZSkge1xuICAgICAgICB2YXIgZWRnZSA9IGcuZWRnZShlKSxcbiAgICAgICAgICBub2RlVSA9IGcubm9kZShlLnYpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1bTogYWNjLnN1bSArIChlZGdlLndlaWdodCAqIG5vZGVVLm9yZGVyKSxcbiAgICAgICAgICB3ZWlnaHQ6IGFjYy53ZWlnaHQgKyBlZGdlLndlaWdodFxuICAgICAgICB9O1xuICAgICAgfSwgeyBzdW06IDAsIHdlaWdodDogMCB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdjogdixcbiAgICAgICAgYmFyeWNlbnRlcjogcmVzdWx0LnN1bSAvIHJlc3VsdC53ZWlnaHQsXG4gICAgICAgIHdlaWdodDogcmVzdWx0LndlaWdodFxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuXG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuR3JhcGg7XG5cbm1vZHVsZS5leHBvcnRzID0gYnVpbGRMYXllckdyYXBoO1xuXG4vKlxuICogQ29uc3RydWN0cyBhIGdyYXBoIHRoYXQgY2FuIGJlIHVzZWQgdG8gc29ydCBhIGxheWVyIG9mIG5vZGVzLiBUaGUgZ3JhcGggd2lsbFxuICogY29udGFpbiBhbGwgYmFzZSBhbmQgc3ViZ3JhcGggbm9kZXMgZnJvbSB0aGUgcmVxdWVzdCBsYXllciBpbiB0aGVpciBvcmlnaW5hbFxuICogaGllcmFyY2h5IGFuZCBhbnkgZWRnZXMgdGhhdCBhcmUgaW5jaWRlbnQgb24gdGhlc2Ugbm9kZXMgYW5kIGFyZSBvZiB0aGUgdHlwZVxuICogcmVxdWVzdGVkIGJ5IHRoZSBcInJlbGF0aW9uc2hpcFwiIHBhcmFtZXRlci5cbiAqXG4gKiBOb2RlcyBmcm9tIHRoZSByZXF1ZXN0ZWQgcmFuayB0aGF0IGRvIG5vdCBoYXZlIHBhcmVudHMgYXJlIGFzc2lnbmVkIGEgcm9vdFxuICogbm9kZSBpbiB0aGUgb3V0cHV0IGdyYXBoLCB3aGljaCBpcyBzZXQgaW4gdGhlIHJvb3QgZ3JhcGggYXR0cmlidXRlLiBUaGlzXG4gKiBtYWtlcyBpdCBlYXN5IHRvIHdhbGsgdGhlIGhpZXJhcmNoeSBvZiBtb3ZhYmxlIG5vZGVzIGR1cmluZyBvcmRlcmluZy5cbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBpcyBhIERBR1xuICogICAgMi4gQmFzZSBub2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGF2ZSBhIHJhbmsgYXR0cmlidXRlXG4gKiAgICAzLiBTdWJncmFwaCBub2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGFzIG1pblJhbmsgYW5kIG1heFJhbmsgYXR0cmlidXRlc1xuICogICAgNC4gRWRnZXMgaGF2ZSBhbiBhc3NpZ25lZCB3ZWlnaHRcbiAqXG4gKiBQb3N0LWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gT3V0cHV0IGdyYXBoIGhhcyBhbGwgbm9kZXMgaW4gdGhlIG1vdmFibGUgcmFuayB3aXRoIHByZXNlcnZlZFxuICogICAgICAgaGllcmFyY2h5LlxuICogICAgMi4gUm9vdCBub2RlcyBpbiB0aGUgbW92YWJsZSBsYXllciBhcmUgbWFkZSBjaGlsZHJlbiBvZiB0aGUgbm9kZVxuICogICAgICAgaW5kaWNhdGVkIGJ5IHRoZSByb290IGF0dHJpYnV0ZSBvZiB0aGUgZ3JhcGguXG4gKiAgICAzLiBOb24tbW92YWJsZSBub2RlcyBpbmNpZGVudCBvbiBtb3ZhYmxlIG5vZGVzLCBzZWxlY3RlZCBieSB0aGVcbiAqICAgICAgIHJlbGF0aW9uc2hpcCBwYXJhbWV0ZXIsIGFyZSBpbmNsdWRlZCBpbiB0aGUgZ3JhcGggKHdpdGhvdXQgaGllcmFyY2h5KS5cbiAqICAgIDQuIEVkZ2VzIGluY2lkZW50IG9uIG1vdmFibGUgbm9kZXMsIHNlbGVjdGVkIGJ5IHRoZSByZWxhdGlvbnNoaXBcbiAqICAgICAgIHBhcmFtZXRlciwgYXJlIGFkZGVkIHRvIHRoZSBvdXRwdXQgZ3JhcGguXG4gKiAgICA1LiBUaGUgd2VpZ2h0cyBmb3IgY29waWVkIGVkZ2VzIGFyZSBhZ2dyZWdhdGVkIGFzIG5lZWQsIHNpbmNlIHRoZSBvdXRwdXRcbiAqICAgICAgIGdyYXBoIGlzIG5vdCBhIG11bHRpLWdyYXBoLlxuICovXG5mdW5jdGlvbiBidWlsZExheWVyR3JhcGgoZywgcmFuaywgcmVsYXRpb25zaGlwKSB7XG4gIHZhciByb290ID0gY3JlYXRlUm9vdE5vZGUoZyksXG4gICAgcmVzdWx0ID0gbmV3IEdyYXBoKHsgY29tcG91bmQ6IHRydWUgfSkuc2V0R3JhcGgoeyByb290OiByb290IH0pXG4gICAgICAuc2V0RGVmYXVsdE5vZGVMYWJlbChmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodik7IH0pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KSxcbiAgICAgIHBhcmVudCA9IGcucGFyZW50KHYpO1xuXG4gICAgaWYgKG5vZGUucmFuayA9PT0gcmFuayB8fCBub2RlLm1pblJhbmsgPD0gcmFuayAmJiByYW5rIDw9IG5vZGUubWF4UmFuaykge1xuICAgICAgcmVzdWx0LnNldE5vZGUodik7XG4gICAgICByZXN1bHQuc2V0UGFyZW50KHYsIHBhcmVudCB8fCByb290KTtcblxuICAgICAgLy8gVGhpcyBhc3N1bWVzIHdlIGhhdmUgb25seSBzaG9ydCBlZGdlcyFcbiAgICAgIF8uZm9yRWFjaChnW3JlbGF0aW9uc2hpcF0odiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdmFyIHUgPSBlLnYgPT09IHYgPyBlLncgOiBlLnYsXG4gICAgICAgICAgZWRnZSA9IHJlc3VsdC5lZGdlKHUsIHYpLFxuICAgICAgICAgIHdlaWdodCA9ICFfLmlzVW5kZWZpbmVkKGVkZ2UpID8gZWRnZS53ZWlnaHQgOiAwO1xuICAgICAgICByZXN1bHQuc2V0RWRnZSh1LCB2LCB7IHdlaWdodDogZy5lZGdlKGUpLndlaWdodCArIHdlaWdodCB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoXy5oYXMobm9kZSwgXCJtaW5SYW5rXCIpKSB7XG4gICAgICAgIHJlc3VsdC5zZXROb2RlKHYsIHtcbiAgICAgICAgICBib3JkZXJMZWZ0OiBub2RlLmJvcmRlckxlZnRbcmFua10sXG4gICAgICAgICAgYm9yZGVyUmlnaHQ6IG5vZGUuYm9yZGVyUmlnaHRbcmFua11cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSb290Tm9kZShnKSB7XG4gIHZhciB2O1xuICB3aGlsZSAoZy5oYXNOb2RlKCh2ID0gXy51bmlxdWVJZChcIl9yb290XCIpKSkpO1xuICByZXR1cm4gdjtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY3Jvc3NDb3VudDtcblxuLypcbiAqIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGxheWVyaW5nIChhbiBhcnJheSBvZiBsYXllcnMsIGVhY2ggd2l0aCBhbiBhcnJheSBvZlxuICogb3JkZXJlcmQgbm9kZXMpIGFuZCBhIGdyYXBoIGFuZCByZXR1cm5zIGEgd2VpZ2h0ZWQgY3Jvc3NpbmcgY291bnQuXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gSW5wdXQgZ3JhcGggbXVzdCBiZSBzaW1wbGUgKG5vdCBhIG11bHRpZ3JhcGgpLCBkaXJlY3RlZCwgYW5kIGluY2x1ZGVcbiAqICAgICAgIG9ubHkgc2ltcGxlIGVkZ2VzLlxuICogICAgMi4gRWRnZXMgaW4gdGhlIGlucHV0IGdyYXBoIG11c3QgaGF2ZSBhc3NpZ25lZCB3ZWlnaHRzLlxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBUaGUgZ3JhcGggYW5kIGxheWVyaW5nIG1hdHJpeCBhcmUgbGVmdCB1bmNoYW5nZWQuXG4gKlxuICogVGhpcyBhbGdvcml0aG0gaXMgZGVyaXZlZCBmcm9tIEJhcnRoLCBldCBhbC4sIFwiQmlsYXllciBDcm9zcyBDb3VudGluZy5cIlxuICovXG5mdW5jdGlvbiBjcm9zc0NvdW50KGcsIGxheWVyaW5nKSB7XG4gIHZhciBjYyA9IDA7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGF5ZXJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICBjYyArPSB0d29MYXllckNyb3NzQ291bnQoZywgbGF5ZXJpbmdbaS0xXSwgbGF5ZXJpbmdbaV0pO1xuICB9XG4gIHJldHVybiBjYztcbn1cblxuZnVuY3Rpb24gdHdvTGF5ZXJDcm9zc0NvdW50KGcsIG5vcnRoTGF5ZXIsIHNvdXRoTGF5ZXIpIHtcbiAgLy8gU29ydCBhbGwgb2YgdGhlIGVkZ2VzIGJldHdlZW4gdGhlIG5vcnRoIGFuZCBzb3V0aCBsYXllcnMgYnkgdGhlaXIgcG9zaXRpb25cbiAgLy8gaW4gdGhlIG5vcnRoIGxheWVyIGFuZCB0aGVuIHRoZSBzb3V0aC4gTWFwIHRoZXNlIGVkZ2VzIHRvIHRoZSBwb3NpdGlvbiBvZlxuICAvLyB0aGVpciBoZWFkIGluIHRoZSBzb3V0aCBsYXllci5cbiAgdmFyIHNvdXRoUG9zID0gXy56aXBPYmplY3Qoc291dGhMYXllcixcbiAgICBfLm1hcChzb3V0aExheWVyLCBmdW5jdGlvbiAodiwgaSkgeyByZXR1cm4gaTsgfSkpO1xuICB2YXIgc291dGhFbnRyaWVzID0gXy5mbGF0dGVuKF8ubWFwKG5vcnRoTGF5ZXIsIGZ1bmN0aW9uKHYpIHtcbiAgICByZXR1cm4gXy5zb3J0QnkoXy5tYXAoZy5vdXRFZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuIHsgcG9zOiBzb3V0aFBvc1tlLnddLCB3ZWlnaHQ6IGcuZWRnZShlKS53ZWlnaHQgfTtcbiAgICB9KSwgXCJwb3NcIik7XG4gIH0pLCB0cnVlKTtcblxuICAvLyBCdWlsZCB0aGUgYWNjdW11bGF0b3IgdHJlZVxuICB2YXIgZmlyc3RJbmRleCA9IDE7XG4gIHdoaWxlIChmaXJzdEluZGV4IDwgc291dGhMYXllci5sZW5ndGgpIGZpcnN0SW5kZXggPDw9IDE7XG4gIHZhciB0cmVlU2l6ZSA9IDIgKiBmaXJzdEluZGV4IC0gMTtcbiAgZmlyc3RJbmRleCAtPSAxO1xuICB2YXIgdHJlZSA9IF8ubWFwKG5ldyBBcnJheSh0cmVlU2l6ZSksIGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfSk7XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSB3ZWlnaHRlZCBjcm9zc2luZ3NcbiAgdmFyIGNjID0gMDtcbiAgXy5mb3JFYWNoKHNvdXRoRW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgdmFyIGluZGV4ID0gZW50cnkucG9zICsgZmlyc3RJbmRleDtcbiAgICB0cmVlW2luZGV4XSArPSBlbnRyeS53ZWlnaHQ7XG4gICAgdmFyIHdlaWdodFN1bSA9IDA7XG4gICAgd2hpbGUgKGluZGV4ID4gMCkge1xuICAgICAgaWYgKGluZGV4ICUgMikge1xuICAgICAgICB3ZWlnaHRTdW0gKz0gdHJlZVtpbmRleCArIDFdO1xuICAgICAgfVxuICAgICAgaW5kZXggPSAoaW5kZXggLSAxKSA+PiAxO1xuICAgICAgdHJlZVtpbmRleF0gKz0gZW50cnkud2VpZ2h0O1xuICAgIH1cbiAgICBjYyArPSBlbnRyeS53ZWlnaHQgKiB3ZWlnaHRTdW07XG4gIH0pKTtcblxuICByZXR1cm4gY2M7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIGluaXRPcmRlciA9IHJlcXVpcmUoXCIuL2luaXQtb3JkZXJcIik7XG52YXIgY3Jvc3NDb3VudCA9IHJlcXVpcmUoXCIuL2Nyb3NzLWNvdW50XCIpO1xudmFyIHNvcnRTdWJncmFwaCA9IHJlcXVpcmUoXCIuL3NvcnQtc3ViZ3JhcGhcIik7XG52YXIgYnVpbGRMYXllckdyYXBoID0gcmVxdWlyZShcIi4vYnVpbGQtbGF5ZXItZ3JhcGhcIik7XG52YXIgYWRkU3ViZ3JhcGhDb25zdHJhaW50cyA9IHJlcXVpcmUoXCIuL2FkZC1zdWJncmFwaC1jb25zdHJhaW50c1wiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5HcmFwaDtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4uL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gb3JkZXI7XG5cbi8qXG4gKiBBcHBsaWVzIGhldXJpc3RpY3MgdG8gbWluaW1pemUgZWRnZSBjcm9zc2luZ3MgaW4gdGhlIGdyYXBoIGFuZCBzZXRzIHRoZSBiZXN0XG4gKiBvcmRlciBzb2x1dGlvbiBhcyBhbiBvcmRlciBhdHRyaWJ1dGUgb24gZWFjaCBub2RlLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEdyYXBoIG11c3QgYmUgREFHXG4gKiAgICAyLiBHcmFwaCBub2RlcyBtdXN0IGJlIG9iamVjdHMgd2l0aCBhIFwicmFua1wiIGF0dHJpYnV0ZVxuICogICAgMy4gR3JhcGggZWRnZXMgbXVzdCBoYXZlIHRoZSBcIndlaWdodFwiIGF0dHJpYnV0ZVxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBub2RlcyB3aWxsIGhhdmUgYW4gXCJvcmRlclwiIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiB0aGVcbiAqICAgICAgIGFsZ29yaXRobS5cbiAqL1xuZnVuY3Rpb24gb3JkZXIoZykge1xuICB2YXIgbWF4UmFuayA9IHV0aWwubWF4UmFuayhnKSxcbiAgICBkb3duTGF5ZXJHcmFwaHMgPSBidWlsZExheWVyR3JhcGhzKGcsIF8ucmFuZ2UoMSwgbWF4UmFuayArIDEpLCBcImluRWRnZXNcIiksXG4gICAgdXBMYXllckdyYXBocyA9IGJ1aWxkTGF5ZXJHcmFwaHMoZywgXy5yYW5nZShtYXhSYW5rIC0gMSwgLTEsIC0xKSwgXCJvdXRFZGdlc1wiKTtcblxuICB2YXIgbGF5ZXJpbmcgPSBpbml0T3JkZXIoZyk7XG4gIGFzc2lnbk9yZGVyKGcsIGxheWVyaW5nKTtcblxuICB2YXIgYmVzdENDID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgIGJlc3Q7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxhc3RCZXN0ID0gMDsgbGFzdEJlc3QgPCA0OyArK2ksICsrbGFzdEJlc3QpIHtcbiAgICBzd2VlcExheWVyR3JhcGhzKGkgJSAyID8gZG93bkxheWVyR3JhcGhzIDogdXBMYXllckdyYXBocywgaSAlIDQgPj0gMik7XG5cbiAgICBsYXllcmluZyA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcbiAgICB2YXIgY2MgPSBjcm9zc0NvdW50KGcsIGxheWVyaW5nKTtcbiAgICBpZiAoY2MgPCBiZXN0Q0MpIHtcbiAgICAgIGxhc3RCZXN0ID0gMDtcbiAgICAgIGJlc3QgPSBfLmNsb25lRGVlcChsYXllcmluZyk7XG4gICAgICBiZXN0Q0MgPSBjYztcbiAgICB9XG4gIH1cblxuICBhc3NpZ25PcmRlcihnLCBiZXN0KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMYXllckdyYXBocyhnLCByYW5rcywgcmVsYXRpb25zaGlwKSB7XG4gIHJldHVybiBfLm1hcChyYW5rcywgZnVuY3Rpb24ocmFuaykge1xuICAgIHJldHVybiBidWlsZExheWVyR3JhcGgoZywgcmFuaywgcmVsYXRpb25zaGlwKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3ZWVwTGF5ZXJHcmFwaHMobGF5ZXJHcmFwaHMsIGJpYXNSaWdodCkge1xuICB2YXIgY2cgPSBuZXcgR3JhcGgoKTtcbiAgXy5mb3JFYWNoKGxheWVyR3JhcGhzLCBmdW5jdGlvbihsZykge1xuICAgIHZhciByb290ID0gbGcuZ3JhcGgoKS5yb290O1xuICAgIHZhciBzb3J0ZWQgPSBzb3J0U3ViZ3JhcGgobGcsIHJvb3QsIGNnLCBiaWFzUmlnaHQpO1xuICAgIF8uZm9yRWFjaChzb3J0ZWQudnMsIGZ1bmN0aW9uKHYsIGkpIHtcbiAgICAgIGxnLm5vZGUodikub3JkZXIgPSBpO1xuICAgIH0pO1xuICAgIGFkZFN1YmdyYXBoQ29uc3RyYWludHMobGcsIGNnLCBzb3J0ZWQudnMpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXNzaWduT3JkZXIoZywgbGF5ZXJpbmcpIHtcbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgaSkge1xuICAgICAgZy5ub2RlKHYpLm9yZGVyID0gaTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRPcmRlcjtcblxuLypcbiAqIEFzc2lnbnMgYW4gaW5pdGlhbCBvcmRlciB2YWx1ZSBmb3IgZWFjaCBub2RlIGJ5IHBlcmZvcm1pbmcgYSBERlMgc2VhcmNoXG4gKiBzdGFydGluZyBmcm9tIG5vZGVzIGluIHRoZSBmaXJzdCByYW5rLiBOb2RlcyBhcmUgYXNzaWduZWQgYW4gb3JkZXIgaW4gdGhlaXJcbiAqIHJhbmsgYXMgdGhleSBhcmUgZmlyc3QgdmlzaXRlZC5cbiAqXG4gKiBUaGlzIGFwcHJvYWNoIGNvbWVzIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkEgVGVjaG5pcXVlIGZvciBEcmF3aW5nIERpcmVjdGVkXG4gKiBHcmFwaHMuXCJcbiAqXG4gKiBSZXR1cm5zIGEgbGF5ZXJpbmcgbWF0cml4IHdpdGggYW4gYXJyYXkgcGVyIGxheWVyIGFuZCBlYWNoIGxheWVyIHNvcnRlZCBieVxuICogdGhlIG9yZGVyIG9mIGl0cyBub2Rlcy5cbiAqL1xuZnVuY3Rpb24gaW5pdE9yZGVyKGcpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgdmFyIHNpbXBsZU5vZGVzID0gXy5maWx0ZXIoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuICFnLmNoaWxkcmVuKHYpLmxlbmd0aDtcbiAgfSk7XG4gIHZhciBtYXhSYW5rID0gXy5tYXgoXy5tYXAoc2ltcGxlTm9kZXMsIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KSk7XG4gIHZhciBsYXllcnMgPSBfLm1hcChfLnJhbmdlKG1heFJhbmsgKyAxKSwgZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfSk7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHJldHVybjtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBsYXllcnNbbm9kZS5yYW5rXS5wdXNoKHYpO1xuICAgIF8uZm9yRWFjaChnLnN1Y2Nlc3NvcnModiksIGRmcyk7XG4gIH1cblxuICB2YXIgb3JkZXJlZFZzID0gXy5zb3J0Qnkoc2ltcGxlTm9kZXMsIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KTtcbiAgXy5mb3JFYWNoKG9yZGVyZWRWcywgZGZzKTtcblxuICByZXR1cm4gbGF5ZXJzO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXNvbHZlQ29uZmxpY3RzO1xuXG4vKlxuICogR2l2ZW4gYSBsaXN0IG9mIGVudHJpZXMgb2YgdGhlIGZvcm0ge3YsIGJhcnljZW50ZXIsIHdlaWdodH0gYW5kIGFcbiAqIGNvbnN0cmFpbnQgZ3JhcGggdGhpcyBmdW5jdGlvbiB3aWxsIHJlc29sdmUgYW55IGNvbmZsaWN0cyBiZXR3ZWVuIHRoZVxuICogY29uc3RyYWludCBncmFwaCBhbmQgdGhlIGJhcnljZW50ZXJzIGZvciB0aGUgZW50cmllcy4gSWYgdGhlIGJhcnljZW50ZXJzIGZvclxuICogYW4gZW50cnkgd291bGQgdmlvbGF0ZSBhIGNvbnN0cmFpbnQgaW4gdGhlIGNvbnN0cmFpbnQgZ3JhcGggdGhlbiB3ZSBjb2FsZXNjZVxuICogdGhlIG5vZGVzIGluIHRoZSBjb25mbGljdCBpbnRvIGEgbmV3IG5vZGUgdGhhdCByZXNwZWN0cyB0aGUgY29udHJhaW50IGFuZFxuICogYWdncmVnYXRlcyBiYXJ5Y2VudGVyIGFuZCB3ZWlnaHQgaW5mb3JtYXRpb24uXG4gKlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgZGVzY3JpcHRpb24gaW4gRm9yc3RlciwgXCJBIEZhc3QgYW5kXG4gKiBTaW1wbGUgSHVlcmlzdGljIGZvciBDb25zdHJhaW5lZCBUd28tTGV2ZWwgQ3Jvc3NpbmcgUmVkdWN0aW9uLFwiIHRob3VnaHQgaXRcbiAqIGRpZmZlcnMgaW4gc29tZSBzcGVjaWZpYyBkZXRhaWxzLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEVhY2ggZW50cnkgaGFzIHRoZSBmb3JtIHt2LCBiYXJ5Y2VudGVyLCB3ZWlnaHR9LCBvciBpZiB0aGUgbm9kZSBoYXNcbiAqICAgICAgIG5vIGJhcnljZW50ZXIsIHRoZW4ge3Z9LlxuICpcbiAqIFJldHVybnM6XG4gKlxuICogICAgQSBuZXcgbGlzdCBvZiBlbnRyaWVzIG9mIHRoZSBmb3JtIHt2cywgaSwgYmFyeWNlbnRlciwgd2VpZ2h0fS4gVGhlIGxpc3RcbiAqICAgIGB2c2AgbWF5IGVpdGhlciBiZSBhIHNpbmdsZXRvbiBvciBpdCBtYXkgYmUgYW4gYWdncmVnYXRpb24gb2Ygbm9kZXNcbiAqICAgIG9yZGVyZWQgc3VjaCB0aGF0IHRoZXkgZG8gbm90IHZpb2xhdGUgY29uc3RyYWludHMgZnJvbSB0aGUgY29uc3RyYWludFxuICogICAgZ3JhcGguIFRoZSBwcm9wZXJ0eSBgaWAgaXMgdGhlIGxvd2VzdCBvcmlnaW5hbCBpbmRleCBvZiBhbnkgb2YgdGhlXG4gKiAgICBlbGVtZW50cyBpbiBgdnNgLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQ29uZmxpY3RzKGVudHJpZXMsIGNnKSB7XG4gIHZhciBtYXBwZWRFbnRyaWVzID0ge307XG4gIF8uZm9yRWFjaChlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSwgaSkge1xuICAgIHZhciB0bXAgPSBtYXBwZWRFbnRyaWVzW2VudHJ5LnZdID0ge1xuICAgICAgaW5kZWdyZWU6IDAsXG4gICAgICBcImluXCI6IFtdLFxuICAgICAgb3V0OiBbXSxcbiAgICAgIHZzOiBbZW50cnkudl0sXG4gICAgICBpOiBpXG4gICAgfTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZW50cnkuYmFyeWNlbnRlcikpIHtcbiAgICAgIHRtcC5iYXJ5Y2VudGVyID0gZW50cnkuYmFyeWNlbnRlcjtcbiAgICAgIHRtcC53ZWlnaHQgPSBlbnRyeS53ZWlnaHQ7XG4gICAgfVxuICB9KTtcblxuICBfLmZvckVhY2goY2cuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlbnRyeVYgPSBtYXBwZWRFbnRyaWVzW2Uudl07XG4gICAgdmFyIGVudHJ5VyA9IG1hcHBlZEVudHJpZXNbZS53XTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZW50cnlWKSAmJiAhXy5pc1VuZGVmaW5lZChlbnRyeVcpKSB7XG4gICAgICBlbnRyeVcuaW5kZWdyZWUrKztcbiAgICAgIGVudHJ5Vi5vdXQucHVzaChtYXBwZWRFbnRyaWVzW2Uud10pO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIHNvdXJjZVNldCA9IF8uZmlsdGVyKG1hcHBlZEVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgcmV0dXJuICFlbnRyeS5pbmRlZ3JlZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGRvUmVzb2x2ZUNvbmZsaWN0cyhzb3VyY2VTZXQpO1xufVxuXG5mdW5jdGlvbiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KSB7XG4gIHZhciBlbnRyaWVzID0gW107XG5cbiAgZnVuY3Rpb24gaGFuZGxlSW4odkVudHJ5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHVFbnRyeSkge1xuICAgICAgaWYgKHVFbnRyeS5tZXJnZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodUVudHJ5LmJhcnljZW50ZXIpIHx8XG4gICAgICAgICAgXy5pc1VuZGVmaW5lZCh2RW50cnkuYmFyeWNlbnRlcikgfHxcbiAgICAgICAgICB1RW50cnkuYmFyeWNlbnRlciA+PSB2RW50cnkuYmFyeWNlbnRlcikge1xuICAgICAgICBtZXJnZUVudHJpZXModkVudHJ5LCB1RW50cnkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVPdXQodkVudHJ5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHdFbnRyeSkge1xuICAgICAgd0VudHJ5W1wiaW5cIl0ucHVzaCh2RW50cnkpO1xuICAgICAgaWYgKC0td0VudHJ5LmluZGVncmVlID09PSAwKSB7XG4gICAgICAgIHNvdXJjZVNldC5wdXNoKHdFbnRyeSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHdoaWxlIChzb3VyY2VTZXQubGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gc291cmNlU2V0LnBvcCgpO1xuICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgXy5mb3JFYWNoKGVudHJ5W1wiaW5cIl0ucmV2ZXJzZSgpLCBoYW5kbGVJbihlbnRyeSkpO1xuICAgIF8uZm9yRWFjaChlbnRyeS5vdXQsIGhhbmRsZU91dChlbnRyeSkpO1xuICB9XG5cbiAgcmV0dXJuIF8ubWFwKF8uZmlsdGVyKGVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7IHJldHVybiAhZW50cnkubWVyZ2VkOyB9KSxcbiAgICBmdW5jdGlvbihlbnRyeSkge1xuICAgICAgcmV0dXJuIF8ucGljayhlbnRyeSwgW1widnNcIiwgXCJpXCIsIFwiYmFyeWNlbnRlclwiLCBcIndlaWdodFwiXSk7XG4gICAgfSk7XG5cbn1cblxuZnVuY3Rpb24gbWVyZ2VFbnRyaWVzKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBzdW0gPSAwO1xuICB2YXIgd2VpZ2h0ID0gMDtcblxuICBpZiAodGFyZ2V0LndlaWdodCkge1xuICAgIHN1bSArPSB0YXJnZXQuYmFyeWNlbnRlciAqIHRhcmdldC53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IHRhcmdldC53ZWlnaHQ7XG4gIH1cblxuICBpZiAoc291cmNlLndlaWdodCkge1xuICAgIHN1bSArPSBzb3VyY2UuYmFyeWNlbnRlciAqIHNvdXJjZS53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IHNvdXJjZS53ZWlnaHQ7XG4gIH1cblxuICB0YXJnZXQudnMgPSBzb3VyY2UudnMuY29uY2F0KHRhcmdldC52cyk7XG4gIHRhcmdldC5iYXJ5Y2VudGVyID0gc3VtIC8gd2VpZ2h0O1xuICB0YXJnZXQud2VpZ2h0ID0gd2VpZ2h0O1xuICB0YXJnZXQuaSA9IE1hdGgubWluKHNvdXJjZS5pLCB0YXJnZXQuaSk7XG4gIHNvdXJjZS5tZXJnZWQgPSB0cnVlO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIGJhcnljZW50ZXIgPSByZXF1aXJlKFwiLi9iYXJ5Y2VudGVyXCIpO1xudmFyIHJlc29sdmVDb25mbGljdHMgPSByZXF1aXJlKFwiLi9yZXNvbHZlLWNvbmZsaWN0c1wiKTtcbnZhciBzb3J0ID0gcmVxdWlyZShcIi4vc29ydFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzb3J0U3ViZ3JhcGg7XG5cbmZ1bmN0aW9uIHNvcnRTdWJncmFwaChnLCB2LCBjZywgYmlhc1JpZ2h0KSB7XG4gIHZhciBtb3ZhYmxlID0gZy5jaGlsZHJlbih2KTtcbiAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gIHZhciBibCA9IG5vZGUgPyBub2RlLmJvcmRlckxlZnQgOiB1bmRlZmluZWQ7XG4gIHZhciBiciA9IG5vZGUgPyBub2RlLmJvcmRlclJpZ2h0OiB1bmRlZmluZWQ7XG4gIHZhciBzdWJncmFwaHMgPSB7fTtcblxuICBpZiAoYmwpIHtcbiAgICBtb3ZhYmxlID0gXy5maWx0ZXIobW92YWJsZSwgZnVuY3Rpb24odykge1xuICAgICAgcmV0dXJuIHcgIT09IGJsICYmIHcgIT09IGJyO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGJhcnljZW50ZXJzID0gYmFyeWNlbnRlcihnLCBtb3ZhYmxlKTtcbiAgXy5mb3JFYWNoKGJhcnljZW50ZXJzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIGlmIChnLmNoaWxkcmVuKGVudHJ5LnYpLmxlbmd0aCkge1xuICAgICAgdmFyIHN1YmdyYXBoUmVzdWx0ID0gc29ydFN1YmdyYXBoKGcsIGVudHJ5LnYsIGNnLCBiaWFzUmlnaHQpO1xuICAgICAgc3ViZ3JhcGhzW2VudHJ5LnZdID0gc3ViZ3JhcGhSZXN1bHQ7XG4gICAgICBpZiAoXy5oYXMoc3ViZ3JhcGhSZXN1bHQsIFwiYmFyeWNlbnRlclwiKSkge1xuICAgICAgICBtZXJnZUJhcnljZW50ZXJzKGVudHJ5LCBzdWJncmFwaFJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICB2YXIgZW50cmllcyA9IHJlc29sdmVDb25mbGljdHMoYmFyeWNlbnRlcnMsIGNnKTtcbiAgZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsIHN1YmdyYXBocyk7XG5cbiAgdmFyIHJlc3VsdCA9IHNvcnQoZW50cmllcywgYmlhc1JpZ2h0KTtcblxuICBpZiAoYmwpIHtcbiAgICByZXN1bHQudnMgPSBfLmZsYXR0ZW4oW2JsLCByZXN1bHQudnMsIGJyXSwgdHJ1ZSk7XG4gICAgaWYgKGcucHJlZGVjZXNzb3JzKGJsKS5sZW5ndGgpIHtcbiAgICAgIHZhciBibFByZWQgPSBnLm5vZGUoZy5wcmVkZWNlc3NvcnMoYmwpWzBdKSxcbiAgICAgICAgYnJQcmVkID0gZy5ub2RlKGcucHJlZGVjZXNzb3JzKGJyKVswXSk7XG4gICAgICBpZiAoIV8uaGFzKHJlc3VsdCwgXCJiYXJ5Y2VudGVyXCIpKSB7XG4gICAgICAgIHJlc3VsdC5iYXJ5Y2VudGVyID0gMDtcbiAgICAgICAgcmVzdWx0LndlaWdodCA9IDA7XG4gICAgICB9XG4gICAgICByZXN1bHQuYmFyeWNlbnRlciA9IChyZXN1bHQuYmFyeWNlbnRlciAqIHJlc3VsdC53ZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxQcmVkLm9yZGVyICsgYnJQcmVkLm9yZGVyKSAvIChyZXN1bHQud2VpZ2h0ICsgMik7XG4gICAgICByZXN1bHQud2VpZ2h0ICs9IDI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsIHN1YmdyYXBocykge1xuICBfLmZvckVhY2goZW50cmllcywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICBlbnRyeS52cyA9IF8uZmxhdHRlbihlbnRyeS52cy5tYXAoZnVuY3Rpb24odikge1xuICAgICAgaWYgKHN1YmdyYXBoc1t2XSkge1xuICAgICAgICByZXR1cm4gc3ViZ3JhcGhzW3ZdLnZzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHY7XG4gICAgfSksIHRydWUpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VCYXJ5Y2VudGVycyh0YXJnZXQsIG90aGVyKSB7XG4gIGlmICghXy5pc1VuZGVmaW5lZCh0YXJnZXQuYmFyeWNlbnRlcikpIHtcbiAgICB0YXJnZXQuYmFyeWNlbnRlciA9ICh0YXJnZXQuYmFyeWNlbnRlciAqIHRhcmdldC53ZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLmJhcnljZW50ZXIgKiBvdGhlci53ZWlnaHQpIC9cbiAgICAgICAgICAgICAgICAgICAgICAgICh0YXJnZXQud2VpZ2h0ICsgb3RoZXIud2VpZ2h0KTtcbiAgICB0YXJnZXQud2VpZ2h0ICs9IG90aGVyLndlaWdodDtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQuYmFyeWNlbnRlciA9IG90aGVyLmJhcnljZW50ZXI7XG4gICAgdGFyZ2V0LndlaWdodCA9IG90aGVyLndlaWdodDtcbiAgfVxufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzb3J0O1xuXG5mdW5jdGlvbiBzb3J0KGVudHJpZXMsIGJpYXNSaWdodCkge1xuICB2YXIgcGFydHMgPSB1dGlsLnBhcnRpdGlvbihlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIHJldHVybiBfLmhhcyhlbnRyeSwgXCJiYXJ5Y2VudGVyXCIpO1xuICB9KTtcbiAgdmFyIHNvcnRhYmxlID0gcGFydHMubGhzLFxuICAgIHVuc29ydGFibGUgPSBfLnNvcnRCeShwYXJ0cy5yaHMsIGZ1bmN0aW9uKGVudHJ5KSB7IHJldHVybiAtZW50cnkuaTsgfSksXG4gICAgdnMgPSBbXSxcbiAgICBzdW0gPSAwLFxuICAgIHdlaWdodCA9IDAsXG4gICAgdnNJbmRleCA9IDA7XG5cbiAgc29ydGFibGUuc29ydChjb21wYXJlV2l0aEJpYXMoISFiaWFzUmlnaHQpKTtcblxuICB2c0luZGV4ID0gY29uc3VtZVVuc29ydGFibGUodnMsIHVuc29ydGFibGUsIHZzSW5kZXgpO1xuXG4gIF8uZm9yRWFjaChzb3J0YWJsZSwgZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgdnNJbmRleCArPSBlbnRyeS52cy5sZW5ndGg7XG4gICAgdnMucHVzaChlbnRyeS52cyk7XG4gICAgc3VtICs9IGVudHJ5LmJhcnljZW50ZXIgKiBlbnRyeS53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IGVudHJ5LndlaWdodDtcbiAgICB2c0luZGV4ID0gY29uc3VtZVVuc29ydGFibGUodnMsIHVuc29ydGFibGUsIHZzSW5kZXgpO1xuICB9KTtcblxuICB2YXIgcmVzdWx0ID0geyB2czogXy5mbGF0dGVuKHZzLCB0cnVlKSB9O1xuICBpZiAod2VpZ2h0KSB7XG4gICAgcmVzdWx0LmJhcnljZW50ZXIgPSBzdW0gLyB3ZWlnaHQ7XG4gICAgcmVzdWx0LndlaWdodCA9IHdlaWdodDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjb25zdW1lVW5zb3J0YWJsZSh2cywgdW5zb3J0YWJsZSwgaW5kZXgpIHtcbiAgdmFyIGxhc3Q7XG4gIHdoaWxlICh1bnNvcnRhYmxlLmxlbmd0aCAmJiAobGFzdCA9IF8ubGFzdCh1bnNvcnRhYmxlKSkuaSA8PSBpbmRleCkge1xuICAgIHVuc29ydGFibGUucG9wKCk7XG4gICAgdnMucHVzaChsYXN0LnZzKTtcbiAgICBpbmRleCsrO1xuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuZnVuY3Rpb24gY29tcGFyZVdpdGhCaWFzKGJpYXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGVudHJ5ViwgZW50cnlXKSB7XG4gICAgaWYgKGVudHJ5Vi5iYXJ5Y2VudGVyIDwgZW50cnlXLmJhcnljZW50ZXIpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5Vi5iYXJ5Y2VudGVyID4gZW50cnlXLmJhcnljZW50ZXIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIHJldHVybiAhYmlhcyA/IGVudHJ5Vi5pIC0gZW50cnlXLmkgOiBlbnRyeVcuaSAtIGVudHJ5Vi5pO1xuICB9O1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50RHVtbXlDaGFpbnM7XG5cbmZ1bmN0aW9uIHBhcmVudER1bW15Q2hhaW5zKGcpIHtcbiAgdmFyIHBvc3RvcmRlck51bXMgPSBwb3N0b3JkZXIoZyk7XG5cbiAgXy5mb3JFYWNoKGcuZ3JhcGgoKS5kdW1teUNoYWlucywgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIHZhciBlZGdlT2JqID0gbm9kZS5lZGdlT2JqO1xuICAgIHZhciBwYXRoRGF0YSA9IGZpbmRQYXRoKGcsIHBvc3RvcmRlck51bXMsIGVkZ2VPYmoudiwgZWRnZU9iai53KTtcbiAgICB2YXIgcGF0aCA9IHBhdGhEYXRhLnBhdGg7XG4gICAgdmFyIGxjYSA9IHBhdGhEYXRhLmxjYTtcbiAgICB2YXIgcGF0aElkeCA9IDA7XG4gICAgdmFyIHBhdGhWID0gcGF0aFtwYXRoSWR4XTtcbiAgICB2YXIgYXNjZW5kaW5nID0gdHJ1ZTtcblxuICAgIHdoaWxlICh2ICE9PSBlZGdlT2JqLncpIHtcbiAgICAgIG5vZGUgPSBnLm5vZGUodik7XG5cbiAgICAgIGlmIChhc2NlbmRpbmcpIHtcbiAgICAgICAgd2hpbGUgKChwYXRoViA9IHBhdGhbcGF0aElkeF0pICE9PSBsY2EgJiZcbiAgICAgICAgICAgICAgIGcubm9kZShwYXRoVikubWF4UmFuayA8IG5vZGUucmFuaykge1xuICAgICAgICAgIHBhdGhJZHgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXRoViA9PT0gbGNhKSB7XG4gICAgICAgICAgYXNjZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhc2NlbmRpbmcpIHtcbiAgICAgICAgd2hpbGUgKHBhdGhJZHggPCBwYXRoLmxlbmd0aCAtIDEgJiZcbiAgICAgICAgICAgICAgIGcubm9kZShwYXRoViA9IHBhdGhbcGF0aElkeCArIDFdKS5taW5SYW5rIDw9IG5vZGUucmFuaykge1xuICAgICAgICAgIHBhdGhJZHgrKztcbiAgICAgICAgfVxuICAgICAgICBwYXRoViA9IHBhdGhbcGF0aElkeF07XG4gICAgICB9XG5cbiAgICAgIGcuc2V0UGFyZW50KHYsIHBhdGhWKTtcbiAgICAgIHYgPSBnLnN1Y2Nlc3NvcnModilbMF07XG4gICAgfVxuICB9KTtcbn1cblxuLy8gRmluZCBhIHBhdGggZnJvbSB2IHRvIHcgdGhyb3VnaCB0aGUgbG93ZXN0IGNvbW1vbiBhbmNlc3RvciAoTENBKS4gUmV0dXJuIHRoZVxuLy8gZnVsbCBwYXRoIGFuZCB0aGUgTENBLlxuZnVuY3Rpb24gZmluZFBhdGgoZywgcG9zdG9yZGVyTnVtcywgdiwgdykge1xuICB2YXIgdlBhdGggPSBbXTtcbiAgdmFyIHdQYXRoID0gW107XG4gIHZhciBsb3cgPSBNYXRoLm1pbihwb3N0b3JkZXJOdW1zW3ZdLmxvdywgcG9zdG9yZGVyTnVtc1t3XS5sb3cpO1xuICB2YXIgbGltID0gTWF0aC5tYXgocG9zdG9yZGVyTnVtc1t2XS5saW0sIHBvc3RvcmRlck51bXNbd10ubGltKTtcbiAgdmFyIHBhcmVudDtcbiAgdmFyIGxjYTtcblxuICAvLyBUcmF2ZXJzZSB1cCBmcm9tIHYgdG8gZmluZCB0aGUgTENBXG4gIHBhcmVudCA9IHY7XG4gIGRvIHtcbiAgICBwYXJlbnQgPSBnLnBhcmVudChwYXJlbnQpO1xuICAgIHZQYXRoLnB1c2gocGFyZW50KTtcbiAgfSB3aGlsZSAocGFyZW50ICYmXG4gICAgICAgICAgIChwb3N0b3JkZXJOdW1zW3BhcmVudF0ubG93ID4gbG93IHx8IGxpbSA+IHBvc3RvcmRlck51bXNbcGFyZW50XS5saW0pKTtcbiAgbGNhID0gcGFyZW50O1xuXG4gIC8vIFRyYXZlcnNlIGZyb20gdyB0byBMQ0FcbiAgcGFyZW50ID0gdztcbiAgd2hpbGUgKChwYXJlbnQgPSBnLnBhcmVudChwYXJlbnQpKSAhPT0gbGNhKSB7XG4gICAgd1BhdGgucHVzaChwYXJlbnQpO1xuICB9XG5cbiAgcmV0dXJuIHsgcGF0aDogdlBhdGguY29uY2F0KHdQYXRoLnJldmVyc2UoKSksIGxjYTogbGNhIH07XG59XG5cbmZ1bmN0aW9uIHBvc3RvcmRlcihnKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgdmFyIGxpbSA9IDA7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgbG93ID0gbGltO1xuICAgIF8uZm9yRWFjaChnLmNoaWxkcmVuKHYpLCBkZnMpO1xuICAgIHJlc3VsdFt2XSA9IHsgbG93OiBsb3csIGxpbTogbGltKysgfTtcbiAgfVxuICBfLmZvckVhY2goZy5jaGlsZHJlbigpLCBkZnMpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBobGliXCIpLkdyYXBoO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxuLypcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGNvb3JkaW5hdGUgYXNzaWdubWVudCBiYXNlZCBvbiBCcmFuZGVzIGFuZCBLw7ZwZiwgXCJGYXN0XG4gKiBhbmQgU2ltcGxlIEhvcml6b250YWwgQ29vcmRpbmF0ZSBBc3NpZ25tZW50LlwiXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBvc2l0aW9uWDogcG9zaXRpb25YLFxuICBmaW5kVHlwZTFDb25mbGljdHM6IGZpbmRUeXBlMUNvbmZsaWN0cyxcbiAgZmluZFR5cGUyQ29uZmxpY3RzOiBmaW5kVHlwZTJDb25mbGljdHMsXG4gIGFkZENvbmZsaWN0OiBhZGRDb25mbGljdCxcbiAgaGFzQ29uZmxpY3Q6IGhhc0NvbmZsaWN0LFxuICB2ZXJ0aWNhbEFsaWdubWVudDogdmVydGljYWxBbGlnbm1lbnQsXG4gIGhvcml6b250YWxDb21wYWN0aW9uOiBob3Jpem9udGFsQ29tcGFjdGlvbixcbiAgYWxpZ25Db29yZGluYXRlczogYWxpZ25Db29yZGluYXRlcyxcbiAgZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQ6IGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50LFxuICBiYWxhbmNlOiBiYWxhbmNlXG59O1xuXG4vKlxuICogTWFya3MgYWxsIGVkZ2VzIGluIHRoZSBncmFwaCB3aXRoIGEgdHlwZS0xIGNvbmZsaWN0IHdpdGggdGhlIFwidHlwZTFDb25mbGljdFwiXG4gKiBwcm9wZXJ0eS4gQSB0eXBlLTEgY29uZmxpY3QgaXMgb25lIHdoZXJlIGEgbm9uLWlubmVyIHNlZ21lbnQgY3Jvc3NlcyBhblxuICogaW5uZXIgc2VnbWVudC4gQW4gaW5uZXIgc2VnbWVudCBpcyBhbiBlZGdlIHdpdGggYm90aCBpbmNpZGVudCBub2RlcyBtYXJrZWRcbiAqIHdpdGggdGhlIFwiZHVtbXlcIiBwcm9wZXJ0eS5cbiAqXG4gKiBUaGlzIGFsZ29yaXRobSBzY2FucyBsYXllciBieSBsYXllciwgc3RhcnRpbmcgd2l0aCB0aGUgc2Vjb25kLCBmb3IgdHlwZS0xXG4gKiBjb25mbGljdHMgYmV0d2VlbiB0aGUgY3VycmVudCBsYXllciBhbmQgdGhlIHByZXZpb3VzIGxheWVyLiBGb3IgZWFjaCBsYXllclxuICogaXQgc2NhbnMgdGhlIG5vZGVzIGZyb20gbGVmdCB0byByaWdodCB1bnRpbCBpdCByZWFjaGVzIG9uZSB0aGF0IGlzIGluY2lkZW50XG4gKiBvbiBhbiBpbm5lciBzZWdtZW50LiBJdCB0aGVuIHNjYW5zIHByZWRlY2Vzc29ycyB0byBkZXRlcm1pbmUgaWYgdGhleSBoYXZlXG4gKiBlZGdlcyB0aGF0IGNyb3NzIHRoYXQgaW5uZXIgc2VnbWVudC4gQXQgdGhlIGVuZCBhIGZpbmFsIHNjYW4gaXMgZG9uZSBmb3IgYWxsXG4gKiBub2RlcyBvbiB0aGUgY3VycmVudCByYW5rIHRvIHNlZSBpZiB0aGV5IGNyb3NzIHRoZSBsYXN0IHZpc2l0ZWQgaW5uZXJcbiAqIHNlZ21lbnQuXG4gKlxuICogVGhpcyBhbGdvcml0aG0gKHNhZmVseSkgYXNzdW1lcyB0aGF0IGEgZHVtbXkgbm9kZSB3aWxsIG9ubHkgYmUgaW5jaWRlbnQgb24gYVxuICogc2luZ2xlIG5vZGUgaW4gdGhlIGxheWVycyBiZWluZyBzY2FubmVkLlxuICovXG5mdW5jdGlvbiBmaW5kVHlwZTFDb25mbGljdHMoZywgbGF5ZXJpbmcpIHtcbiAgdmFyIGNvbmZsaWN0cyA9IHt9O1xuXG4gIGZ1bmN0aW9uIHZpc2l0TGF5ZXIocHJldkxheWVyLCBsYXllcikge1xuICAgIHZhclxuICAgICAgLy8gbGFzdCB2aXNpdGVkIG5vZGUgaW4gdGhlIHByZXZpb3VzIGxheWVyIHRoYXQgaXMgaW5jaWRlbnQgb24gYW4gaW5uZXJcbiAgICAgIC8vIHNlZ21lbnQuXG4gICAgICBrMCA9IDAsXG4gICAgICAvLyBUcmFja3MgdGhlIGxhc3Qgbm9kZSBpbiB0aGlzIGxheWVyIHNjYW5uZWQgZm9yIGNyb3NzaW5ncyB3aXRoIGEgdHlwZS0xXG4gICAgICAvLyBzZWdtZW50LlxuICAgICAgc2NhblBvcyA9IDAsXG4gICAgICBwcmV2TGF5ZXJMZW5ndGggPSBwcmV2TGF5ZXIubGVuZ3RoLFxuICAgICAgbGFzdE5vZGUgPSBfLmxhc3QobGF5ZXIpO1xuXG4gICAgXy5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2LCBpKSB7XG4gICAgICB2YXIgdyA9IGZpbmRPdGhlcklubmVyU2VnbWVudE5vZGUoZywgdiksXG4gICAgICAgIGsxID0gdyA/IGcubm9kZSh3KS5vcmRlciA6IHByZXZMYXllckxlbmd0aDtcblxuICAgICAgaWYgKHcgfHwgdiA9PT0gbGFzdE5vZGUpIHtcbiAgICAgICAgXy5mb3JFYWNoKGxheWVyLnNsaWNlKHNjYW5Qb3MsIGkgKzEpLCBmdW5jdGlvbihzY2FuTm9kZSkge1xuICAgICAgICAgIF8uZm9yRWFjaChnLnByZWRlY2Vzc29ycyhzY2FuTm9kZSksIGZ1bmN0aW9uKHUpIHtcbiAgICAgICAgICAgIHZhciB1TGFiZWwgPSBnLm5vZGUodSksXG4gICAgICAgICAgICAgIHVQb3MgPSB1TGFiZWwub3JkZXI7XG4gICAgICAgICAgICBpZiAoKHVQb3MgPCBrMCB8fCBrMSA8IHVQb3MpICYmXG4gICAgICAgICAgICAgICAgISh1TGFiZWwuZHVtbXkgJiYgZy5ub2RlKHNjYW5Ob2RlKS5kdW1teSkpIHtcbiAgICAgICAgICAgICAgYWRkQ29uZmxpY3QoY29uZmxpY3RzLCB1LCBzY2FuTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzY2FuUG9zID0gaSArIDE7XG4gICAgICAgIGswID0gazE7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGF5ZXI7XG4gIH1cblxuICBfLnJlZHVjZShsYXllcmluZywgdmlzaXRMYXllcik7XG4gIHJldHVybiBjb25mbGljdHM7XG59XG5cbmZ1bmN0aW9uIGZpbmRUeXBlMkNvbmZsaWN0cyhnLCBsYXllcmluZykge1xuICB2YXIgY29uZmxpY3RzID0ge307XG5cbiAgZnVuY3Rpb24gc2Nhbihzb3V0aCwgc291dGhQb3MsIHNvdXRoRW5kLCBwcmV2Tm9ydGhCb3JkZXIsIG5leHROb3J0aEJvcmRlcikge1xuICAgIHZhciB2O1xuICAgIF8uZm9yRWFjaChfLnJhbmdlKHNvdXRoUG9zLCBzb3V0aEVuZCksIGZ1bmN0aW9uKGkpIHtcbiAgICAgIHYgPSBzb3V0aFtpXTtcbiAgICAgIGlmIChnLm5vZGUodikuZHVtbXkpIHtcbiAgICAgICAgXy5mb3JFYWNoKGcucHJlZGVjZXNzb3JzKHYpLCBmdW5jdGlvbih1KSB7XG4gICAgICAgICAgdmFyIHVOb2RlID0gZy5ub2RlKHUpO1xuICAgICAgICAgIGlmICh1Tm9kZS5kdW1teSAmJlxuICAgICAgICAgICAgICAodU5vZGUub3JkZXIgPCBwcmV2Tm9ydGhCb3JkZXIgfHwgdU5vZGUub3JkZXIgPiBuZXh0Tm9ydGhCb3JkZXIpKSB7XG4gICAgICAgICAgICBhZGRDb25mbGljdChjb25mbGljdHMsIHUsIHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIHZpc2l0TGF5ZXIobm9ydGgsIHNvdXRoKSB7XG4gICAgdmFyIHByZXZOb3J0aFBvcyA9IC0xLFxuICAgICAgbmV4dE5vcnRoUG9zLFxuICAgICAgc291dGhQb3MgPSAwO1xuXG4gICAgXy5mb3JFYWNoKHNvdXRoLCBmdW5jdGlvbih2LCBzb3V0aExvb2thaGVhZCkge1xuICAgICAgaWYgKGcubm9kZSh2KS5kdW1teSA9PT0gXCJib3JkZXJcIikge1xuICAgICAgICB2YXIgcHJlZGVjZXNzb3JzID0gZy5wcmVkZWNlc3NvcnModik7XG4gICAgICAgIGlmIChwcmVkZWNlc3NvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgbmV4dE5vcnRoUG9zID0gZy5ub2RlKHByZWRlY2Vzc29yc1swXSkub3JkZXI7XG4gICAgICAgICAgc2Nhbihzb3V0aCwgc291dGhQb3MsIHNvdXRoTG9va2FoZWFkLCBwcmV2Tm9ydGhQb3MsIG5leHROb3J0aFBvcyk7XG4gICAgICAgICAgc291dGhQb3MgPSBzb3V0aExvb2thaGVhZDtcbiAgICAgICAgICBwcmV2Tm9ydGhQb3MgPSBuZXh0Tm9ydGhQb3M7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNjYW4oc291dGgsIHNvdXRoUG9zLCBzb3V0aC5sZW5ndGgsIG5leHROb3J0aFBvcywgbm9ydGgubGVuZ3RoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBzb3V0aDtcbiAgfVxuXG4gIF8ucmVkdWNlKGxheWVyaW5nLCB2aXNpdExheWVyKTtcbiAgcmV0dXJuIGNvbmZsaWN0cztcbn1cblxuZnVuY3Rpb24gZmluZE90aGVySW5uZXJTZWdtZW50Tm9kZShnLCB2KSB7XG4gIGlmIChnLm5vZGUodikuZHVtbXkpIHtcbiAgICByZXR1cm4gXy5maW5kKGcucHJlZGVjZXNzb3JzKHYpLCBmdW5jdGlvbih1KSB7XG4gICAgICByZXR1cm4gZy5ub2RlKHUpLmR1bW15O1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZENvbmZsaWN0KGNvbmZsaWN0cywgdiwgdykge1xuICBpZiAodiA+IHcpIHtcbiAgICB2YXIgdG1wID0gdjtcbiAgICB2ID0gdztcbiAgICB3ID0gdG1wO1xuICB9XG5cbiAgdmFyIGNvbmZsaWN0c1YgPSBjb25mbGljdHNbdl07XG4gIGlmICghY29uZmxpY3RzVikge1xuICAgIGNvbmZsaWN0c1t2XSA9IGNvbmZsaWN0c1YgPSB7fTtcbiAgfVxuICBjb25mbGljdHNWW3ddID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaGFzQ29uZmxpY3QoY29uZmxpY3RzLCB2LCB3KSB7XG4gIGlmICh2ID4gdykge1xuICAgIHZhciB0bXAgPSB2O1xuICAgIHYgPSB3O1xuICAgIHcgPSB0bXA7XG4gIH1cbiAgcmV0dXJuIF8uaGFzKGNvbmZsaWN0c1t2XSwgdyk7XG59XG5cbi8qXG4gKiBUcnkgdG8gYWxpZ24gbm9kZXMgaW50byB2ZXJ0aWNhbCBcImJsb2Nrc1wiIHdoZXJlIHBvc3NpYmxlLiBUaGlzIGFsZ29yaXRobVxuICogYXR0ZW1wdHMgdG8gYWxpZ24gYSBub2RlIHdpdGggb25lIG9mIGl0cyBtZWRpYW4gbmVpZ2hib3JzLiBJZiB0aGUgZWRnZVxuICogY29ubmVjdGluZyBhIG5laWdoYm9yIGlzIGEgdHlwZS0xIGNvbmZsaWN0IHRoZW4gd2UgaWdub3JlIHRoYXQgcG9zc2liaWxpdHkuXG4gKiBJZiBhIHByZXZpb3VzIG5vZGUgaGFzIGFscmVhZHkgZm9ybWVkIGEgYmxvY2sgd2l0aCBhIG5vZGUgYWZ0ZXIgdGhlIG5vZGVcbiAqIHdlJ3JlIHRyeWluZyB0byBmb3JtIGEgYmxvY2sgd2l0aCwgd2UgYWxzbyBpZ25vcmUgdGhhdCBwb3NzaWJpbGl0eSAtIG91clxuICogYmxvY2tzIHdvdWxkIGJlIHNwbGl0IGluIHRoYXQgc2NlbmFyaW8uXG4gKi9cbmZ1bmN0aW9uIHZlcnRpY2FsQWxpZ25tZW50KGcsIGxheWVyaW5nLCBjb25mbGljdHMsIG5laWdoYm9yRm4pIHtcbiAgdmFyIHJvb3QgPSB7fSxcbiAgICBhbGlnbiA9IHt9LFxuICAgIHBvcyA9IHt9O1xuXG4gIC8vIFdlIGNhY2hlIHRoZSBwb3NpdGlvbiBoZXJlIGJhc2VkIG9uIHRoZSBsYXllcmluZyBiZWNhdXNlIHRoZSBncmFwaCBhbmRcbiAgLy8gbGF5ZXJpbmcgbWF5IGJlIG91dCBvZiBzeW5jLiBUaGUgbGF5ZXJpbmcgbWF0cml4IGlzIG1hbmlwdWxhdGVkIHRvXG4gIC8vIGdlbmVyYXRlIGRpZmZlcmVudCBleHRyZW1lIGFsaWdubWVudHMuXG4gIF8uZm9yRWFjaChsYXllcmluZywgZnVuY3Rpb24obGF5ZXIpIHtcbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYsIG9yZGVyKSB7XG4gICAgICByb290W3ZdID0gdjtcbiAgICAgIGFsaWduW3ZdID0gdjtcbiAgICAgIHBvc1t2XSA9IG9yZGVyO1xuICAgIH0pO1xuICB9KTtcblxuICBfLmZvckVhY2gobGF5ZXJpbmcsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgdmFyIHByZXZJZHggPSAtMTtcbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYpIHtcbiAgICAgIHZhciB3cyA9IG5laWdoYm9yRm4odik7XG4gICAgICBpZiAod3MubGVuZ3RoKSB7XG4gICAgICAgIHdzID0gXy5zb3J0Qnkod3MsIGZ1bmN0aW9uKHcpIHsgcmV0dXJuIHBvc1t3XTsgfSk7XG4gICAgICAgIHZhciBtcCA9ICh3cy5sZW5ndGggLSAxKSAvIDI7XG4gICAgICAgIGZvciAodmFyIGkgPSBNYXRoLmZsb29yKG1wKSwgaWwgPSBNYXRoLmNlaWwobXApOyBpIDw9IGlsOyArK2kpIHtcbiAgICAgICAgICB2YXIgdyA9IHdzW2ldO1xuICAgICAgICAgIGlmIChhbGlnblt2XSA9PT0gdiAmJlxuICAgICAgICAgICAgICBwcmV2SWR4IDwgcG9zW3ddICYmXG4gICAgICAgICAgICAgICFoYXNDb25mbGljdChjb25mbGljdHMsIHYsIHcpKSB7XG4gICAgICAgICAgICBhbGlnblt3XSA9IHY7XG4gICAgICAgICAgICBhbGlnblt2XSA9IHJvb3Rbdl0gPSByb290W3ddO1xuICAgICAgICAgICAgcHJldklkeCA9IHBvc1t3XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgcm9vdDogcm9vdCwgYWxpZ246IGFsaWduIH07XG59XG5cbmZ1bmN0aW9uIGhvcml6b250YWxDb21wYWN0aW9uKGcsIGxheWVyaW5nLCByb290LCBhbGlnbiwgcmV2ZXJzZVNlcCkge1xuICAvLyBUaGlzIHBvcnRpb24gb2YgdGhlIGFsZ29yaXRobSBkaWZmZXJzIGZyb20gQksgZHVlIHRvIGEgbnVtYmVyIG9mIHByb2JsZW1zLlxuICAvLyBJbnN0ZWFkIG9mIHRoZWlyIGFsZ29yaXRobSB3ZSBjb25zdHJ1Y3QgYSBuZXcgYmxvY2sgZ3JhcGggYW5kIGRvIHR3b1xuICAvLyBzd2VlcHMuIFRoZSBmaXJzdCBzd2VlcCBwbGFjZXMgYmxvY2tzIHdpdGggdGhlIHNtYWxsZXN0IHBvc3NpYmxlXG4gIC8vIGNvb3JkaW5hdGVzLiBUaGUgc2Vjb25kIHN3ZWVwIHJlbW92ZXMgdW51c2VkIHNwYWNlIGJ5IG1vdmluZyBibG9ja3MgdG8gdGhlXG4gIC8vIGdyZWF0ZXN0IGNvb3JkaW5hdGVzIHdpdGhvdXQgdmlvbGF0aW5nIHNlcGFyYXRpb24uXG4gIHZhciB4cyA9IHt9LFxuICAgIGJsb2NrRyA9IGJ1aWxkQmxvY2tHcmFwaChnLCBsYXllcmluZywgcm9vdCwgcmV2ZXJzZVNlcCksXG4gICAgYm9yZGVyVHlwZSA9IHJldmVyc2VTZXAgPyBcImJvcmRlckxlZnRcIiA6IFwiYm9yZGVyUmlnaHRcIjtcblxuICBmdW5jdGlvbiBpdGVyYXRlKHNldFhzRnVuYywgbmV4dE5vZGVzRnVuYykge1xuICAgIHZhciBzdGFjayA9IGJsb2NrRy5ub2RlcygpO1xuICAgIHZhciBlbGVtID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgICB3aGlsZSAoZWxlbSkge1xuICAgICAgaWYgKHZpc2l0ZWRbZWxlbV0pIHtcbiAgICAgICAgc2V0WHNGdW5jKGVsZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmlzaXRlZFtlbGVtXSA9IHRydWU7XG4gICAgICAgIHN0YWNrLnB1c2goZWxlbSk7XG4gICAgICAgIHN0YWNrID0gc3RhY2suY29uY2F0KG5leHROb2Rlc0Z1bmMoZWxlbSkpO1xuICAgICAgfVxuXG4gICAgICBlbGVtID0gc3RhY2sucG9wKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRmlyc3QgcGFzcywgYXNzaWduIHNtYWxsZXN0IGNvb3JkaW5hdGVzXG4gIGZ1bmN0aW9uIHBhc3MxKGVsZW0pIHtcbiAgICB4c1tlbGVtXSA9IGJsb2NrRy5pbkVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsIGUpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heChhY2MsIHhzW2Uudl0gKyBibG9ja0cuZWRnZShlKSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvLyBTZWNvbmQgcGFzcywgYXNzaWduIGdyZWF0ZXN0IGNvb3JkaW5hdGVzXG4gIGZ1bmN0aW9uIHBhc3MyKGVsZW0pIHtcbiAgICB2YXIgbWluID0gYmxvY2tHLm91dEVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsIGUpIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbihhY2MsIHhzW2Uud10gLSBibG9ja0cuZWRnZShlKSk7XG4gICAgfSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcblxuICAgIHZhciBub2RlID0gZy5ub2RlKGVsZW0pO1xuICAgIGlmIChtaW4gIT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSAmJiBub2RlLmJvcmRlclR5cGUgIT09IGJvcmRlclR5cGUpIHtcbiAgICAgIHhzW2VsZW1dID0gTWF0aC5tYXgoeHNbZWxlbV0sIG1pbik7XG4gICAgfVxuICB9XG5cbiAgaXRlcmF0ZShwYXNzMSwgYmxvY2tHLnByZWRlY2Vzc29ycy5iaW5kKGJsb2NrRykpO1xuICBpdGVyYXRlKHBhc3MyLCBibG9ja0cuc3VjY2Vzc29ycy5iaW5kKGJsb2NrRykpO1xuXG4gIC8vIEFzc2lnbiB4IGNvb3JkaW5hdGVzIHRvIGFsbCBub2Rlc1xuICBfLmZvckVhY2goYWxpZ24sIGZ1bmN0aW9uKHYpIHtcbiAgICB4c1t2XSA9IHhzW3Jvb3Rbdl1dO1xuICB9KTtcblxuICByZXR1cm4geHM7XG59XG5cblxuZnVuY3Rpb24gYnVpbGRCbG9ja0dyYXBoKGcsIGxheWVyaW5nLCByb290LCByZXZlcnNlU2VwKSB7XG4gIHZhciBibG9ja0dyYXBoID0gbmV3IEdyYXBoKCksXG4gICAgZ3JhcGhMYWJlbCA9IGcuZ3JhcGgoKSxcbiAgICBzZXBGbiA9IHNlcChncmFwaExhYmVsLm5vZGVzZXAsIGdyYXBoTGFiZWwuZWRnZXNlcCwgcmV2ZXJzZVNlcCk7XG5cbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIHZhciB1O1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odikge1xuICAgICAgdmFyIHZSb290ID0gcm9vdFt2XTtcbiAgICAgIGJsb2NrR3JhcGguc2V0Tm9kZSh2Um9vdCk7XG4gICAgICBpZiAodSkge1xuICAgICAgICB2YXIgdVJvb3QgPSByb290W3VdLFxuICAgICAgICAgIHByZXZNYXggPSBibG9ja0dyYXBoLmVkZ2UodVJvb3QsIHZSb290KTtcbiAgICAgICAgYmxvY2tHcmFwaC5zZXRFZGdlKHVSb290LCB2Um9vdCwgTWF0aC5tYXgoc2VwRm4oZywgdiwgdSksIHByZXZNYXggfHwgMCkpO1xuICAgICAgfVxuICAgICAgdSA9IHY7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBibG9ja0dyYXBoO1xufVxuXG4vKlxuICogUmV0dXJucyB0aGUgYWxpZ25tZW50IHRoYXQgaGFzIHRoZSBzbWFsbGVzdCB3aWR0aCBvZiB0aGUgZ2l2ZW4gYWxpZ25tZW50cy5cbiAqL1xuZnVuY3Rpb24gZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQoZywgeHNzKSB7XG4gIHJldHVybiBfLm1pbkJ5KF8udmFsdWVzKHhzcyksIGZ1bmN0aW9uICh4cykge1xuICAgIHZhciBtYXggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIG1pbiA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuICAgIF8uZm9ySW4oeHMsIGZ1bmN0aW9uICh4LCB2KSB7XG4gICAgICB2YXIgaGFsZldpZHRoID0gd2lkdGgoZywgdikgLyAyO1xuXG4gICAgICBtYXggPSBNYXRoLm1heCh4ICsgaGFsZldpZHRoLCBtYXgpO1xuICAgICAgbWluID0gTWF0aC5taW4oeCAtIGhhbGZXaWR0aCwgbWluKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtYXggLSBtaW47XG4gIH0pO1xufVxuXG4vKlxuICogQWxpZ24gdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggb2YgdGhlIGxheW91dCBhbGlnbm1lbnRzIHN1Y2ggdGhhdFxuICogbGVmdC1iaWFzZWQgYWxpZ25tZW50cyBoYXZlIHRoZWlyIG1pbmltdW0gY29vcmRpbmF0ZSBhdCB0aGUgc2FtZSBwb2ludCBhc1xuICogdGhlIG1pbmltdW0gY29vcmRpbmF0ZSBvZiB0aGUgc21hbGxlc3Qgd2lkdGggYWxpZ25tZW50IGFuZCByaWdodC1iaWFzZWRcbiAqIGFsaWdubWVudHMgaGF2ZSB0aGVpciBtYXhpbXVtIGNvb3JkaW5hdGUgYXQgdGhlIHNhbWUgcG9pbnQgYXMgdGhlIG1heGltdW1cbiAqIGNvb3JkaW5hdGUgb2YgdGhlIHNtYWxsZXN0IHdpZHRoIGFsaWdubWVudC5cbiAqL1xuZnVuY3Rpb24gYWxpZ25Db29yZGluYXRlcyh4c3MsIGFsaWduVG8pIHtcbiAgdmFyIGFsaWduVG9WYWxzID0gXy52YWx1ZXMoYWxpZ25UbyksXG4gICAgYWxpZ25Ub01pbiA9IF8ubWluKGFsaWduVG9WYWxzKSxcbiAgICBhbGlnblRvTWF4ID0gXy5tYXgoYWxpZ25Ub1ZhbHMpO1xuXG4gIF8uZm9yRWFjaChbXCJ1XCIsIFwiZFwiXSwgZnVuY3Rpb24odmVydCkge1xuICAgIF8uZm9yRWFjaChbXCJsXCIsIFwiclwiXSwgZnVuY3Rpb24oaG9yaXopIHtcbiAgICAgIHZhciBhbGlnbm1lbnQgPSB2ZXJ0ICsgaG9yaXosXG4gICAgICAgIHhzID0geHNzW2FsaWdubWVudF0sXG4gICAgICAgIGRlbHRhO1xuICAgICAgaWYgKHhzID09PSBhbGlnblRvKSByZXR1cm47XG5cbiAgICAgIHZhciB4c1ZhbHMgPSBfLnZhbHVlcyh4cyk7XG4gICAgICBkZWx0YSA9IGhvcml6ID09PSBcImxcIiA/IGFsaWduVG9NaW4gLSBfLm1pbih4c1ZhbHMpIDogYWxpZ25Ub01heCAtIF8ubWF4KHhzVmFscyk7XG5cbiAgICAgIGlmIChkZWx0YSkge1xuICAgICAgICB4c3NbYWxpZ25tZW50XSA9IF8ubWFwVmFsdWVzKHhzLCBmdW5jdGlvbih4KSB7IHJldHVybiB4ICsgZGVsdGE7IH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYmFsYW5jZSh4c3MsIGFsaWduKSB7XG4gIHJldHVybiBfLm1hcFZhbHVlcyh4c3MudWwsIGZ1bmN0aW9uKGlnbm9yZSwgdikge1xuICAgIGlmIChhbGlnbikge1xuICAgICAgcmV0dXJuIHhzc1thbGlnbi50b0xvd2VyQ2FzZSgpXVt2XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHhzID0gXy5zb3J0QnkoXy5tYXAoeHNzLCB2KSk7XG4gICAgICByZXR1cm4gKHhzWzFdICsgeHNbMl0pIC8gMjtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwb3NpdGlvblgoZykge1xuICB2YXIgbGF5ZXJpbmcgPSB1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7XG4gIHZhciBjb25mbGljdHMgPSBfLm1lcmdlKFxuICAgIGZpbmRUeXBlMUNvbmZsaWN0cyhnLCBsYXllcmluZyksXG4gICAgZmluZFR5cGUyQ29uZmxpY3RzKGcsIGxheWVyaW5nKSk7XG5cbiAgdmFyIHhzcyA9IHt9O1xuICB2YXIgYWRqdXN0ZWRMYXllcmluZztcbiAgXy5mb3JFYWNoKFtcInVcIiwgXCJkXCJdLCBmdW5jdGlvbih2ZXJ0KSB7XG4gICAgYWRqdXN0ZWRMYXllcmluZyA9IHZlcnQgPT09IFwidVwiID8gbGF5ZXJpbmcgOiBfLnZhbHVlcyhsYXllcmluZykucmV2ZXJzZSgpO1xuICAgIF8uZm9yRWFjaChbXCJsXCIsIFwiclwiXSwgZnVuY3Rpb24oaG9yaXopIHtcbiAgICAgIGlmIChob3JpeiA9PT0gXCJyXCIpIHtcbiAgICAgICAgYWRqdXN0ZWRMYXllcmluZyA9IF8ubWFwKGFkanVzdGVkTGF5ZXJpbmcsIGZ1bmN0aW9uKGlubmVyKSB7XG4gICAgICAgICAgcmV0dXJuIF8udmFsdWVzKGlubmVyKS5yZXZlcnNlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmVpZ2hib3JGbiA9ICh2ZXJ0ID09PSBcInVcIiA/IGcucHJlZGVjZXNzb3JzIDogZy5zdWNjZXNzb3JzKS5iaW5kKGcpO1xuICAgICAgdmFyIGFsaWduID0gdmVydGljYWxBbGlnbm1lbnQoZywgYWRqdXN0ZWRMYXllcmluZywgY29uZmxpY3RzLCBuZWlnaGJvckZuKTtcbiAgICAgIHZhciB4cyA9IGhvcml6b250YWxDb21wYWN0aW9uKGcsIGFkanVzdGVkTGF5ZXJpbmcsXG4gICAgICAgIGFsaWduLnJvb3QsIGFsaWduLmFsaWduLCBob3JpeiA9PT0gXCJyXCIpO1xuICAgICAgaWYgKGhvcml6ID09PSBcInJcIikge1xuICAgICAgICB4cyA9IF8ubWFwVmFsdWVzKHhzLCBmdW5jdGlvbih4KSB7IHJldHVybiAteDsgfSk7XG4gICAgICB9XG4gICAgICB4c3NbdmVydCArIGhvcml6XSA9IHhzO1xuICAgIH0pO1xuICB9KTtcblxuICB2YXIgc21hbGxlc3RXaWR0aCA9IGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50KGcsIHhzcyk7XG4gIGFsaWduQ29vcmRpbmF0ZXMoeHNzLCBzbWFsbGVzdFdpZHRoKTtcbiAgcmV0dXJuIGJhbGFuY2UoeHNzLCBnLmdyYXBoKCkuYWxpZ24pO1xufVxuXG5mdW5jdGlvbiBzZXAobm9kZVNlcCwgZWRnZVNlcCwgcmV2ZXJzZVNlcCkge1xuICByZXR1cm4gZnVuY3Rpb24oZywgdiwgdykge1xuICAgIHZhciB2TGFiZWwgPSBnLm5vZGUodik7XG4gICAgdmFyIHdMYWJlbCA9IGcubm9kZSh3KTtcbiAgICB2YXIgc3VtID0gMDtcbiAgICB2YXIgZGVsdGE7XG5cbiAgICBzdW0gKz0gdkxhYmVsLndpZHRoIC8gMjtcbiAgICBpZiAoXy5oYXModkxhYmVsLCBcImxhYmVscG9zXCIpKSB7XG4gICAgICBzd2l0Y2ggKHZMYWJlbC5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlIFwibFwiOiBkZWx0YSA9IC12TGFiZWwud2lkdGggLyAyOyBicmVhaztcbiAgICAgIGNhc2UgXCJyXCI6IGRlbHRhID0gdkxhYmVsLndpZHRoIC8gMjsgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWx0YSkge1xuICAgICAgc3VtICs9IHJldmVyc2VTZXAgPyBkZWx0YSA6IC1kZWx0YTtcbiAgICB9XG4gICAgZGVsdGEgPSAwO1xuXG4gICAgc3VtICs9ICh2TGFiZWwuZHVtbXkgPyBlZGdlU2VwIDogbm9kZVNlcCkgLyAyO1xuICAgIHN1bSArPSAod0xhYmVsLmR1bW15ID8gZWRnZVNlcCA6IG5vZGVTZXApIC8gMjtcblxuICAgIHN1bSArPSB3TGFiZWwud2lkdGggLyAyO1xuICAgIGlmIChfLmhhcyh3TGFiZWwsIFwibGFiZWxwb3NcIikpIHtcbiAgICAgIHN3aXRjaCAod0xhYmVsLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgXCJsXCI6IGRlbHRhID0gd0xhYmVsLndpZHRoIC8gMjsgYnJlYWs7XG4gICAgICBjYXNlIFwiclwiOiBkZWx0YSA9IC13TGFiZWwud2lkdGggLyAyOyBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbHRhKSB7XG4gICAgICBzdW0gKz0gcmV2ZXJzZVNlcCA/IGRlbHRhIDogLWRlbHRhO1xuICAgIH1cbiAgICBkZWx0YSA9IDA7XG5cbiAgICByZXR1cm4gc3VtO1xuICB9O1xufVxuXG5mdW5jdGlvbiB3aWR0aChnLCB2KSB7XG4gIHJldHVybiBnLm5vZGUodikud2lkdGg7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcbnZhciBwb3NpdGlvblggPSByZXF1aXJlKFwiLi9ia1wiKS5wb3NpdGlvblg7XG5cbm1vZHVsZS5leHBvcnRzID0gcG9zaXRpb247XG5cbmZ1bmN0aW9uIHBvc2l0aW9uKGcpIHtcbiAgZyA9IHV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpO1xuXG4gIHBvc2l0aW9uWShnKTtcbiAgXy5mb3JFYWNoKHBvc2l0aW9uWChnKSwgZnVuY3Rpb24oeCwgdikge1xuICAgIGcubm9kZSh2KS54ID0geDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBvc2l0aW9uWShnKSB7XG4gIHZhciBsYXllcmluZyA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcbiAgdmFyIHJhbmtTZXAgPSBnLmdyYXBoKCkucmFua3NlcDtcbiAgdmFyIHByZXZZID0gMDtcbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIHZhciBtYXhIZWlnaHQgPSBfLm1heChfLm1hcChsYXllciwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLmhlaWdodDsgfSkpO1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odikge1xuICAgICAgZy5ub2RlKHYpLnkgPSBwcmV2WSArIG1heEhlaWdodCAvIDI7XG4gICAgfSk7XG4gICAgcHJldlkgKz0gbWF4SGVpZ2h0ICsgcmFua1NlcDtcbiAgfSk7XG59XG5cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuR3JhcGg7XG52YXIgc2xhY2sgPSByZXF1aXJlKFwiLi91dGlsXCIpLnNsYWNrO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZlYXNpYmxlVHJlZTtcblxuLypcbiAqIENvbnN0cnVjdHMgYSBzcGFubmluZyB0cmVlIHdpdGggdGlnaHQgZWRnZXMgYW5kIGFkanVzdGVkIHRoZSBpbnB1dCBub2RlJ3NcbiAqIHJhbmtzIHRvIGFjaGlldmUgdGhpcy4gQSB0aWdodCBlZGdlIGlzIG9uZSB0aGF0IGlzIGhhcyBhIGxlbmd0aCB0aGF0IG1hdGNoZXNcbiAqIGl0cyBcIm1pbmxlblwiIGF0dHJpYnV0ZS5cbiAqXG4gKiBUaGUgYmFzaWMgc3RydWN0dXJlIGZvciB0aGlzIGZ1bmN0aW9uIGlzIGRlcml2ZWQgZnJvbSBHYW5zbmVyLCBldCBhbC4sIFwiQVxuICogVGVjaG5pcXVlIGZvciBEcmF3aW5nIERpcmVjdGVkIEdyYXBocy5cIlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEdyYXBoIG11c3QgYmUgYSBEQUcuXG4gKiAgICAyLiBHcmFwaCBtdXN0IGJlIGNvbm5lY3RlZC5cbiAqICAgIDMuIEdyYXBoIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbm9kZS5cbiAqICAgIDUuIEdyYXBoIG5vZGVzIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgYXNzaWduZWQgYSBcInJhbmtcIiBwcm9wZXJ0eSB0aGF0XG4gKiAgICAgICByZXNwZWN0cyB0aGUgXCJtaW5sZW5cIiBwcm9wZXJ0eSBvZiBpbmNpZGVudCBlZGdlcy5cbiAqICAgIDYuIEdyYXBoIGVkZ2VzIG11c3QgaGF2ZSBhIFwibWlubGVuXCIgcHJvcGVydHkuXG4gKlxuICogUG9zdC1jb25kaXRpb25zOlxuICpcbiAqICAgIC0gR3JhcGggbm9kZXMgd2lsbCBoYXZlIHRoZWlyIHJhbmsgYWRqdXN0ZWQgdG8gZW5zdXJlIHRoYXQgYWxsIGVkZ2VzIGFyZVxuICogICAgICB0aWdodC5cbiAqXG4gKiBSZXR1cm5zIGEgdHJlZSAodW5kaXJlY3RlZCBncmFwaCkgdGhhdCBpcyBjb25zdHJ1Y3RlZCB1c2luZyBvbmx5IFwidGlnaHRcIlxuICogZWRnZXMuXG4gKi9cbmZ1bmN0aW9uIGZlYXNpYmxlVHJlZShnKSB7XG4gIHZhciB0ID0gbmV3IEdyYXBoKHsgZGlyZWN0ZWQ6IGZhbHNlIH0pO1xuXG4gIC8vIENob29zZSBhcmJpdHJhcnkgbm9kZSBmcm9tIHdoaWNoIHRvIHN0YXJ0IG91ciB0cmVlXG4gIHZhciBzdGFydCA9IGcubm9kZXMoKVswXTtcbiAgdmFyIHNpemUgPSBnLm5vZGVDb3VudCgpO1xuICB0LnNldE5vZGUoc3RhcnQsIHt9KTtcblxuICB2YXIgZWRnZSwgZGVsdGE7XG4gIHdoaWxlICh0aWdodFRyZWUodCwgZykgPCBzaXplKSB7XG4gICAgZWRnZSA9IGZpbmRNaW5TbGFja0VkZ2UodCwgZyk7XG4gICAgZGVsdGEgPSB0Lmhhc05vZGUoZWRnZS52KSA/IHNsYWNrKGcsIGVkZ2UpIDogLXNsYWNrKGcsIGVkZ2UpO1xuICAgIHNoaWZ0UmFua3ModCwgZywgZGVsdGEpO1xuICB9XG5cbiAgcmV0dXJuIHQ7XG59XG5cbi8qXG4gKiBGaW5kcyBhIG1heGltYWwgdHJlZSBvZiB0aWdodCBlZGdlcyBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZVxuICogdHJlZS5cbiAqL1xuZnVuY3Rpb24gdGlnaHRUcmVlKHQsIGcpIHtcbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBfLmZvckVhY2goZy5ub2RlRWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHZhciBlZGdlViA9IGUudixcbiAgICAgICAgdyA9ICh2ID09PSBlZGdlVikgPyBlLncgOiBlZGdlVjtcbiAgICAgIGlmICghdC5oYXNOb2RlKHcpICYmICFzbGFjayhnLCBlKSkge1xuICAgICAgICB0LnNldE5vZGUodywge30pO1xuICAgICAgICB0LnNldEVkZ2Uodiwgdywge30pO1xuICAgICAgICBkZnModyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfLmZvckVhY2godC5ub2RlcygpLCBkZnMpO1xuICByZXR1cm4gdC5ub2RlQ291bnQoKTtcbn1cblxuLypcbiAqIEZpbmRzIHRoZSBlZGdlIHdpdGggdGhlIHNtYWxsZXN0IHNsYWNrIHRoYXQgaXMgaW5jaWRlbnQgb24gdHJlZSBhbmQgcmV0dXJuc1xuICogaXQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRNaW5TbGFja0VkZ2UodCwgZykge1xuICByZXR1cm4gXy5taW5CeShnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAodC5oYXNOb2RlKGUudikgIT09IHQuaGFzTm9kZShlLncpKSB7XG4gICAgICByZXR1cm4gc2xhY2soZywgZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2hpZnRSYW5rcyh0LCBnLCBkZWx0YSkge1xuICBfLmZvckVhY2godC5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgZy5ub2RlKHYpLnJhbmsgKz0gZGVsdGE7XG4gIH0pO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciByYW5rVXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgbG9uZ2VzdFBhdGggPSByYW5rVXRpbC5sb25nZXN0UGF0aDtcbnZhciBmZWFzaWJsZVRyZWUgPSByZXF1aXJlKFwiLi9mZWFzaWJsZS10cmVlXCIpO1xudmFyIG5ldHdvcmtTaW1wbGV4ID0gcmVxdWlyZShcIi4vbmV0d29yay1zaW1wbGV4XCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJhbms7XG5cbi8qXG4gKiBBc3NpZ25zIGEgcmFuayB0byBlYWNoIG5vZGUgaW4gdGhlIGlucHV0IGdyYXBoIHRoYXQgcmVzcGVjdHMgdGhlIFwibWlubGVuXCJcbiAqIGNvbnN0cmFpbnQgc3BlY2lmaWVkIG9uIGVkZ2VzIGJldHdlZW4gbm9kZXMuXG4gKlxuICogVGhpcyBiYXNpYyBzdHJ1Y3R1cmUgaXMgZGVyaXZlZCBmcm9tIEdhbnNuZXIsIGV0IGFsLiwgXCJBIFRlY2huaXF1ZSBmb3JcbiAqIERyYXdpbmcgRGlyZWN0ZWQgR3JhcGhzLlwiXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gR3JhcGggbXVzdCBiZSBhIGNvbm5lY3RlZCBEQUdcbiAqICAgIDIuIEdyYXBoIG5vZGVzIG11c3QgYmUgb2JqZWN0c1xuICogICAgMy4gR3JhcGggZWRnZXMgbXVzdCBoYXZlIFwid2VpZ2h0XCIgYW5kIFwibWlubGVuXCIgYXR0cmlidXRlc1xuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBub2RlcyB3aWxsIGhhdmUgYSBcInJhbmtcIiBhdHRyaWJ1dGUgYmFzZWQgb24gdGhlIHJlc3VsdHMgb2YgdGhlXG4gKiAgICAgICBhbGdvcml0aG0uIFJhbmtzIGNhbiBzdGFydCBhdCBhbnkgaW5kZXggKGluY2x1ZGluZyBuZWdhdGl2ZSksIHdlJ2xsXG4gKiAgICAgICBmaXggdGhlbSB1cCBsYXRlci5cbiAqL1xuZnVuY3Rpb24gcmFuayhnKSB7XG4gIHN3aXRjaChnLmdyYXBoKCkucmFua2VyKSB7XG4gIGNhc2UgXCJuZXR3b3JrLXNpbXBsZXhcIjogbmV0d29ya1NpbXBsZXhSYW5rZXIoZyk7IGJyZWFrO1xuICBjYXNlIFwidGlnaHQtdHJlZVwiOiB0aWdodFRyZWVSYW5rZXIoZyk7IGJyZWFrO1xuICBjYXNlIFwibG9uZ2VzdC1wYXRoXCI6IGxvbmdlc3RQYXRoUmFua2VyKGcpOyBicmVhaztcbiAgZGVmYXVsdDogbmV0d29ya1NpbXBsZXhSYW5rZXIoZyk7XG4gIH1cbn1cblxuLy8gQSBmYXN0IGFuZCBzaW1wbGUgcmFua2VyLCBidXQgcmVzdWx0cyBhcmUgZmFyIGZyb20gb3B0aW1hbC5cbnZhciBsb25nZXN0UGF0aFJhbmtlciA9IGxvbmdlc3RQYXRoO1xuXG5mdW5jdGlvbiB0aWdodFRyZWVSYW5rZXIoZykge1xuICBsb25nZXN0UGF0aChnKTtcbiAgZmVhc2libGVUcmVlKGcpO1xufVxuXG5mdW5jdGlvbiBuZXR3b3JrU2ltcGxleFJhbmtlcihnKSB7XG4gIG5ldHdvcmtTaW1wbGV4KGcpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBmZWFzaWJsZVRyZWUgPSByZXF1aXJlKFwiLi9mZWFzaWJsZS10cmVlXCIpO1xudmFyIHNsYWNrID0gcmVxdWlyZShcIi4vdXRpbFwiKS5zbGFjaztcbnZhciBpbml0UmFuayA9IHJlcXVpcmUoXCIuL3V0aWxcIikubG9uZ2VzdFBhdGg7XG52YXIgcHJlb3JkZXIgPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuYWxnLnByZW9yZGVyO1xudmFyIHBvc3RvcmRlciA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5hbGcucG9zdG9yZGVyO1xudmFyIHNpbXBsaWZ5ID0gcmVxdWlyZShcIi4uL3V0aWxcIikuc2ltcGxpZnk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV0d29ya1NpbXBsZXg7XG5cbi8vIEV4cG9zZSBzb21lIGludGVybmFscyBmb3IgdGVzdGluZyBwdXJwb3Nlc1xubmV0d29ya1NpbXBsZXguaW5pdExvd0xpbVZhbHVlcyA9IGluaXRMb3dMaW1WYWx1ZXM7XG5uZXR3b3JrU2ltcGxleC5pbml0Q3V0VmFsdWVzID0gaW5pdEN1dFZhbHVlcztcbm5ldHdvcmtTaW1wbGV4LmNhbGNDdXRWYWx1ZSA9IGNhbGNDdXRWYWx1ZTtcbm5ldHdvcmtTaW1wbGV4LmxlYXZlRWRnZSA9IGxlYXZlRWRnZTtcbm5ldHdvcmtTaW1wbGV4LmVudGVyRWRnZSA9IGVudGVyRWRnZTtcbm5ldHdvcmtTaW1wbGV4LmV4Y2hhbmdlRWRnZXMgPSBleGNoYW5nZUVkZ2VzO1xuXG4vKlxuICogVGhlIG5ldHdvcmsgc2ltcGxleCBhbGdvcml0aG0gYXNzaWducyByYW5rcyB0byBlYWNoIG5vZGUgaW4gdGhlIGlucHV0IGdyYXBoXG4gKiBhbmQgaXRlcmF0aXZlbHkgaW1wcm92ZXMgdGhlIHJhbmtpbmcgdG8gcmVkdWNlIHRoZSBsZW5ndGggb2YgZWRnZXMuXG4gKlxuICogUHJlY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBUaGUgaW5wdXQgZ3JhcGggbXVzdCBiZSBhIERBRy5cbiAqICAgIDIuIEFsbCBub2RlcyBpbiB0aGUgZ3JhcGggbXVzdCBoYXZlIGFuIG9iamVjdCB2YWx1ZS5cbiAqICAgIDMuIEFsbCBlZGdlcyBpbiB0aGUgZ3JhcGggbXVzdCBoYXZlIFwibWlubGVuXCIgYW5kIFwid2VpZ2h0XCIgYXR0cmlidXRlcy5cbiAqXG4gKiBQb3N0Y29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBBbGwgbm9kZXMgaW4gdGhlIGdyYXBoIHdpbGwgaGF2ZSBhbiBhc3NpZ25lZCBcInJhbmtcIiBhdHRyaWJ1dGUgdGhhdCBoYXNcbiAqICAgICAgIGJlZW4gb3B0aW1pemVkIGJ5IHRoZSBuZXR3b3JrIHNpbXBsZXggYWxnb3JpdGhtLiBSYW5rcyBzdGFydCBhdCAwLlxuICpcbiAqXG4gKiBBIHJvdWdoIHNrZXRjaCBvZiB0aGUgYWxnb3JpdGhtIGlzIGFzIGZvbGxvd3M6XG4gKlxuICogICAgMS4gQXNzaWduIGluaXRpYWwgcmFua3MgdG8gZWFjaCBub2RlLiBXZSB1c2UgdGhlIGxvbmdlc3QgcGF0aCBhbGdvcml0aG0sXG4gKiAgICAgICB3aGljaCBhc3NpZ25zIHJhbmtzIHRvIHRoZSBsb3dlc3QgcG9zaXRpb24gcG9zc2libGUuIEluIGdlbmVyYWwgdGhpc1xuICogICAgICAgbGVhZHMgdG8gdmVyeSB3aWRlIGJvdHRvbSByYW5rcyBhbmQgdW5uZWNlc3NhcmlseSBsb25nIGVkZ2VzLlxuICogICAgMi4gQ29uc3RydWN0IGEgZmVhc2libGUgdGlnaHQgdHJlZS4gQSB0aWdodCB0cmVlIGlzIG9uZSBzdWNoIHRoYXQgYWxsXG4gKiAgICAgICBlZGdlcyBpbiB0aGUgdHJlZSBoYXZlIG5vIHNsYWNrIChkaWZmZXJlbmNlIGJldHdlZW4gbGVuZ3RoIG9mIGVkZ2VcbiAqICAgICAgIGFuZCBtaW5sZW4gZm9yIHRoZSBlZGdlKS4gVGhpcyBieSBpdHNlbGYgZ3JlYXRseSBpbXByb3ZlcyB0aGUgYXNzaWduZWRcbiAqICAgICAgIHJhbmtpbmdzIGJ5IHNob3J0aW5nIGVkZ2VzLlxuICogICAgMy4gSXRlcmF0aXZlbHkgZmluZCBlZGdlcyB0aGF0IGhhdmUgbmVnYXRpdmUgY3V0IHZhbHVlcy4gR2VuZXJhbGx5IGFcbiAqICAgICAgIG5lZ2F0aXZlIGN1dCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZWRnZSBjb3VsZCBiZSByZW1vdmVkIGFuZCBhIG5ld1xuICogICAgICAgdHJlZSBlZGdlIGNvdWxkIGJlIGFkZGVkIHRvIHByb2R1Y2UgYSBtb3JlIGNvbXBhY3QgZ3JhcGguXG4gKlxuICogTXVjaCBvZiB0aGUgYWxnb3JpdGhtcyBoZXJlIGFyZSBkZXJpdmVkIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkEgVGVjaG5pcXVlXG4gKiBmb3IgRHJhd2luZyBEaXJlY3RlZCBHcmFwaHMuXCIgVGhlIHN0cnVjdHVyZSBvZiB0aGUgZmlsZSByb3VnaGx5IGZvbGxvd3MgdGhlXG4gKiBzdHJ1Y3R1cmUgb2YgdGhlIG92ZXJhbGwgYWxnb3JpdGhtLlxuICovXG5mdW5jdGlvbiBuZXR3b3JrU2ltcGxleChnKSB7XG4gIGcgPSBzaW1wbGlmeShnKTtcbiAgaW5pdFJhbmsoZyk7XG4gIHZhciB0ID0gZmVhc2libGVUcmVlKGcpO1xuICBpbml0TG93TGltVmFsdWVzKHQpO1xuICBpbml0Q3V0VmFsdWVzKHQsIGcpO1xuXG4gIHZhciBlLCBmO1xuICB3aGlsZSAoKGUgPSBsZWF2ZUVkZ2UodCkpKSB7XG4gICAgZiA9IGVudGVyRWRnZSh0LCBnLCBlKTtcbiAgICBleGNoYW5nZUVkZ2VzKHQsIGcsIGUsIGYpO1xuICB9XG59XG5cbi8qXG4gKiBJbml0aWFsaXplcyBjdXQgdmFsdWVzIGZvciBhbGwgZWRnZXMgaW4gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDdXRWYWx1ZXModCwgZykge1xuICB2YXIgdnMgPSBwb3N0b3JkZXIodCwgdC5ub2RlcygpKTtcbiAgdnMgPSB2cy5zbGljZSgwLCB2cy5sZW5ndGggLSAxKTtcbiAgXy5mb3JFYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgYXNzaWduQ3V0VmFsdWUodCwgZywgdik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25DdXRWYWx1ZSh0LCBnLCBjaGlsZCkge1xuICB2YXIgY2hpbGRMYWIgPSB0Lm5vZGUoY2hpbGQpO1xuICB2YXIgcGFyZW50ID0gY2hpbGRMYWIucGFyZW50O1xuICB0LmVkZ2UoY2hpbGQsIHBhcmVudCkuY3V0dmFsdWUgPSBjYWxjQ3V0VmFsdWUodCwgZywgY2hpbGQpO1xufVxuXG4vKlxuICogR2l2ZW4gdGhlIHRpZ2h0IHRyZWUsIGl0cyBncmFwaCwgYW5kIGEgY2hpbGQgaW4gdGhlIGdyYXBoIGNhbGN1bGF0ZSBhbmRcbiAqIHJldHVybiB0aGUgY3V0IHZhbHVlIGZvciB0aGUgZWRnZSBiZXR3ZWVuIHRoZSBjaGlsZCBhbmQgaXRzIHBhcmVudC5cbiAqL1xuZnVuY3Rpb24gY2FsY0N1dFZhbHVlKHQsIGcsIGNoaWxkKSB7XG4gIHZhciBjaGlsZExhYiA9IHQubm9kZShjaGlsZCk7XG4gIHZhciBwYXJlbnQgPSBjaGlsZExhYi5wYXJlbnQ7XG4gIC8vIFRydWUgaWYgdGhlIGNoaWxkIGlzIG9uIHRoZSB0YWlsIGVuZCBvZiB0aGUgZWRnZSBpbiB0aGUgZGlyZWN0ZWQgZ3JhcGhcbiAgdmFyIGNoaWxkSXNUYWlsID0gdHJ1ZTtcbiAgLy8gVGhlIGdyYXBoJ3MgdmlldyBvZiB0aGUgdHJlZSBlZGdlIHdlJ3JlIGluc3BlY3RpbmdcbiAgdmFyIGdyYXBoRWRnZSA9IGcuZWRnZShjaGlsZCwgcGFyZW50KTtcbiAgLy8gVGhlIGFjY3VtdWxhdGVkIGN1dCB2YWx1ZSBmb3IgdGhlIGVkZ2UgYmV0d2VlbiB0aGlzIG5vZGUgYW5kIGl0cyBwYXJlbnRcbiAgdmFyIGN1dFZhbHVlID0gMDtcblxuICBpZiAoIWdyYXBoRWRnZSkge1xuICAgIGNoaWxkSXNUYWlsID0gZmFsc2U7XG4gICAgZ3JhcGhFZGdlID0gZy5lZGdlKHBhcmVudCwgY2hpbGQpO1xuICB9XG5cbiAgY3V0VmFsdWUgPSBncmFwaEVkZ2Uud2VpZ2h0O1xuXG4gIF8uZm9yRWFjaChnLm5vZGVFZGdlcyhjaGlsZCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgaXNPdXRFZGdlID0gZS52ID09PSBjaGlsZCxcbiAgICAgIG90aGVyID0gaXNPdXRFZGdlID8gZS53IDogZS52O1xuXG4gICAgaWYgKG90aGVyICE9PSBwYXJlbnQpIHtcbiAgICAgIHZhciBwb2ludHNUb0hlYWQgPSBpc091dEVkZ2UgPT09IGNoaWxkSXNUYWlsLFxuICAgICAgICBvdGhlcldlaWdodCA9IGcuZWRnZShlKS53ZWlnaHQ7XG5cbiAgICAgIGN1dFZhbHVlICs9IHBvaW50c1RvSGVhZCA/IG90aGVyV2VpZ2h0IDogLW90aGVyV2VpZ2h0O1xuICAgICAgaWYgKGlzVHJlZUVkZ2UodCwgY2hpbGQsIG90aGVyKSkge1xuICAgICAgICB2YXIgb3RoZXJDdXRWYWx1ZSA9IHQuZWRnZShjaGlsZCwgb3RoZXIpLmN1dHZhbHVlO1xuICAgICAgICBjdXRWYWx1ZSArPSBwb2ludHNUb0hlYWQgPyAtb3RoZXJDdXRWYWx1ZSA6IG90aGVyQ3V0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY3V0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIGluaXRMb3dMaW1WYWx1ZXModHJlZSwgcm9vdCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICByb290ID0gdHJlZS5ub2RlcygpWzBdO1xuICB9XG4gIGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB7fSwgMSwgcm9vdCk7XG59XG5cbmZ1bmN0aW9uIGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB2aXNpdGVkLCBuZXh0TGltLCB2LCBwYXJlbnQpIHtcbiAgdmFyIGxvdyA9IG5leHRMaW07XG4gIHZhciBsYWJlbCA9IHRyZWUubm9kZSh2KTtcblxuICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgXy5mb3JFYWNoKHRyZWUubmVpZ2hib3JzKHYpLCBmdW5jdGlvbih3KSB7XG4gICAgaWYgKCFfLmhhcyh2aXNpdGVkLCB3KSkge1xuICAgICAgbmV4dExpbSA9IGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB2aXNpdGVkLCBuZXh0TGltLCB3LCB2KTtcbiAgICB9XG4gIH0pO1xuXG4gIGxhYmVsLmxvdyA9IGxvdztcbiAgbGFiZWwubGltID0gbmV4dExpbSsrO1xuICBpZiAocGFyZW50KSB7XG4gICAgbGFiZWwucGFyZW50ID0gcGFyZW50O1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE8gc2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlIHRoaXMgd2hlbiB3ZSBpbmNyZW1lbnRhbGx5IHVwZGF0ZSBsb3cgbGltXG4gICAgZGVsZXRlIGxhYmVsLnBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBuZXh0TGltO1xufVxuXG5mdW5jdGlvbiBsZWF2ZUVkZ2UodHJlZSkge1xuICByZXR1cm4gXy5maW5kKHRyZWUuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiB0cmVlLmVkZ2UoZSkuY3V0dmFsdWUgPCAwO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZW50ZXJFZGdlKHQsIGcsIGVkZ2UpIHtcbiAgdmFyIHYgPSBlZGdlLnY7XG4gIHZhciB3ID0gZWRnZS53O1xuXG4gIC8vIEZvciB0aGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uIHdlIGFzc3VtZSB0aGF0IHYgaXMgdGhlIHRhaWwgYW5kIHcgaXMgdGhlXG4gIC8vIGhlYWQsIHNvIGlmIHdlIGRvbid0IGhhdmUgdGhpcyBlZGdlIGluIHRoZSBncmFwaCB3ZSBzaG91bGQgZmxpcCBpdCB0b1xuICAvLyBtYXRjaCB0aGUgY29ycmVjdCBvcmllbnRhdGlvbi5cbiAgaWYgKCFnLmhhc0VkZ2UodiwgdykpIHtcbiAgICB2ID0gZWRnZS53O1xuICAgIHcgPSBlZGdlLnY7XG4gIH1cblxuICB2YXIgdkxhYmVsID0gdC5ub2RlKHYpO1xuICB2YXIgd0xhYmVsID0gdC5ub2RlKHcpO1xuICB2YXIgdGFpbExhYmVsID0gdkxhYmVsO1xuICB2YXIgZmxpcCA9IGZhbHNlO1xuXG4gIC8vIElmIHRoZSByb290IGlzIGluIHRoZSB0YWlsIG9mIHRoZSBlZGdlIHRoZW4gd2UgbmVlZCB0byBmbGlwIHRoZSBsb2dpYyB0aGF0XG4gIC8vIGNoZWNrcyBmb3IgdGhlIGhlYWQgYW5kIHRhaWwgbm9kZXMgaW4gdGhlIGNhbmRpZGF0ZXMgZnVuY3Rpb24gYmVsb3cuXG4gIGlmICh2TGFiZWwubGltID4gd0xhYmVsLmxpbSkge1xuICAgIHRhaWxMYWJlbCA9IHdMYWJlbDtcbiAgICBmbGlwID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBjYW5kaWRhdGVzID0gXy5maWx0ZXIoZy5lZGdlcygpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgcmV0dXJuIGZsaXAgPT09IGlzRGVzY2VuZGFudCh0LCB0Lm5vZGUoZWRnZS52KSwgdGFpbExhYmVsKSAmJlxuICAgICAgICAgICBmbGlwICE9PSBpc0Rlc2NlbmRhbnQodCwgdC5ub2RlKGVkZ2UudyksIHRhaWxMYWJlbCk7XG4gIH0pO1xuXG4gIHJldHVybiBfLm1pbkJ5KGNhbmRpZGF0ZXMsIGZ1bmN0aW9uKGVkZ2UpIHsgcmV0dXJuIHNsYWNrKGcsIGVkZ2UpOyB9KTtcbn1cblxuZnVuY3Rpb24gZXhjaGFuZ2VFZGdlcyh0LCBnLCBlLCBmKSB7XG4gIHZhciB2ID0gZS52O1xuICB2YXIgdyA9IGUudztcbiAgdC5yZW1vdmVFZGdlKHYsIHcpO1xuICB0LnNldEVkZ2UoZi52LCBmLncsIHt9KTtcbiAgaW5pdExvd0xpbVZhbHVlcyh0KTtcbiAgaW5pdEN1dFZhbHVlcyh0LCBnKTtcbiAgdXBkYXRlUmFua3ModCwgZyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJhbmtzKHQsIGcpIHtcbiAgdmFyIHJvb3QgPSBfLmZpbmQodC5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldHVybiAhZy5ub2RlKHYpLnBhcmVudDsgfSk7XG4gIHZhciB2cyA9IHByZW9yZGVyKHQsIHJvb3QpO1xuICB2cyA9IHZzLnNsaWNlKDEpO1xuICBfLmZvckVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgcGFyZW50ID0gdC5ub2RlKHYpLnBhcmVudCxcbiAgICAgIGVkZ2UgPSBnLmVkZ2UodiwgcGFyZW50KSxcbiAgICAgIGZsaXBwZWQgPSBmYWxzZTtcblxuICAgIGlmICghZWRnZSkge1xuICAgICAgZWRnZSA9IGcuZWRnZShwYXJlbnQsIHYpO1xuICAgICAgZmxpcHBlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZy5ub2RlKHYpLnJhbmsgPSBnLm5vZGUocGFyZW50KS5yYW5rICsgKGZsaXBwZWQgPyBlZGdlLm1pbmxlbiA6IC1lZGdlLm1pbmxlbik7XG4gIH0pO1xufVxuXG4vKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBlZGdlIGlzIGluIHRoZSB0cmVlLlxuICovXG5mdW5jdGlvbiBpc1RyZWVFZGdlKHRyZWUsIHUsIHYpIHtcbiAgcmV0dXJuIHRyZWUuaGFzRWRnZSh1LCB2KTtcbn1cblxuLypcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgZGVzY2VuZGFudCBvZiB0aGUgcm9vdCBub2RlIHBlciB0aGVcbiAqIGFzc2lnbmVkIGxvdyBhbmQgbGltIGF0dHJpYnV0ZXMgaW4gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIGlzRGVzY2VuZGFudCh0cmVlLCB2TGFiZWwsIHJvb3RMYWJlbCkge1xuICByZXR1cm4gcm9vdExhYmVsLmxvdyA8PSB2TGFiZWwubGltICYmIHZMYWJlbC5saW0gPD0gcm9vdExhYmVsLmxpbTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBsb25nZXN0UGF0aDogbG9uZ2VzdFBhdGgsXG4gIHNsYWNrOiBzbGFja1xufTtcblxuLypcbiAqIEluaXRpYWxpemVzIHJhbmtzIGZvciB0aGUgaW5wdXQgZ3JhcGggdXNpbmcgdGhlIGxvbmdlc3QgcGF0aCBhbGdvcml0aG0uIFRoaXNcbiAqIGFsZ29yaXRobSBzY2FsZXMgd2VsbCBhbmQgaXMgZmFzdCBpbiBwcmFjdGljZSwgaXQgeWllbGRzIHJhdGhlciBwb29yXG4gKiBzb2x1dGlvbnMuIE5vZGVzIGFyZSBwdXNoZWQgdG8gdGhlIGxvd2VzdCBsYXllciBwb3NzaWJsZSwgbGVhdmluZyB0aGUgYm90dG9tXG4gKiByYW5rcyB3aWRlIGFuZCBsZWF2aW5nIGVkZ2VzIGxvbmdlciB0aGFuIG5lY2Vzc2FyeS4gSG93ZXZlciwgZHVlIHRvIGl0c1xuICogc3BlZWQsIHRoaXMgYWxnb3JpdGhtIGlzIGdvb2QgZm9yIGdldHRpbmcgYW4gaW5pdGlhbCByYW5raW5nIHRoYXQgY2FuIGJlIGZlZFxuICogaW50byBvdGhlciBhbGdvcml0aG1zLlxuICpcbiAqIFRoaXMgYWxnb3JpdGhtIGRvZXMgbm90IG5vcm1hbGl6ZSBsYXllcnMgYmVjYXVzZSBpdCB3aWxsIGJlIHVzZWQgYnkgb3RoZXJcbiAqIGFsZ29yaXRobXMgaW4gbW9zdCBjYXNlcy4gSWYgdXNpbmcgdGhpcyBhbGdvcml0aG0gZGlyZWN0bHksIGJlIHN1cmUgdG9cbiAqIHJ1biBub3JtYWxpemUgYXQgdGhlIGVuZC5cbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBpcyBhIERBRy5cbiAqICAgIDIuIElucHV0IGdyYXBoIG5vZGUgbGFiZWxzIGNhbiBiZSBhc3NpZ25lZCBwcm9wZXJ0aWVzLlxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBFYWNoIG5vZGUgd2lsbCBiZSBhc3NpZ24gYW4gKHVubm9ybWFsaXplZCkgXCJyYW5rXCIgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGxvbmdlc3RQYXRoKGcpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIHZhciBsYWJlbCA9IGcubm9kZSh2KTtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHtcbiAgICAgIHJldHVybiBsYWJlbC5yYW5rO1xuICAgIH1cbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcblxuICAgIHZhciByYW5rID0gXy5taW4oXy5tYXAoZy5vdXRFZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuIGRmcyhlLncpIC0gZy5lZGdlKGUpLm1pbmxlbjtcbiAgICB9KSk7XG5cbiAgICBpZiAocmFuayA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIHx8IC8vIHJldHVybiB2YWx1ZSBvZiBfLm1hcChbXSkgZm9yIExvZGFzaCAzXG4gICAgICAgIHJhbmsgPT09IHVuZGVmaW5lZCB8fCAvLyByZXR1cm4gdmFsdWUgb2YgXy5tYXAoW10pIGZvciBMb2Rhc2ggNFxuICAgICAgICByYW5rID09PSBudWxsKSB7IC8vIHJldHVybiB2YWx1ZSBvZiBfLm1hcChbbnVsbF0pXG4gICAgICByYW5rID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gKGxhYmVsLnJhbmsgPSByYW5rKTtcbiAgfVxuXG4gIF8uZm9yRWFjaChnLnNvdXJjZXMoKSwgZGZzKTtcbn1cblxuLypcbiAqIFJldHVybnMgdGhlIGFtb3VudCBvZiBzbGFjayBmb3IgdGhlIGdpdmVuIGVkZ2UuIFRoZSBzbGFjayBpcyBkZWZpbmVkIGFzIHRoZVxuICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBsZW5ndGggb2YgdGhlIGVkZ2UgYW5kIGl0cyBtaW5pbXVtIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gc2xhY2soZywgZSkge1xuICByZXR1cm4gZy5ub2RlKGUudykucmFuayAtIGcubm9kZShlLnYpLnJhbmsgLSBnLmVkZ2UoZSkubWlubGVuO1xufVxuIiwiLyogZXNsaW50IFwibm8tY29uc29sZVwiOiBvZmYgKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4vZ3JhcGhsaWJcIikuR3JhcGg7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhZGREdW1teU5vZGU6IGFkZER1bW15Tm9kZSxcbiAgc2ltcGxpZnk6IHNpbXBsaWZ5LFxuICBhc05vbkNvbXBvdW5kR3JhcGg6IGFzTm9uQ29tcG91bmRHcmFwaCxcbiAgc3VjY2Vzc29yV2VpZ2h0czogc3VjY2Vzc29yV2VpZ2h0cyxcbiAgcHJlZGVjZXNzb3JXZWlnaHRzOiBwcmVkZWNlc3NvcldlaWdodHMsXG4gIGludGVyc2VjdFJlY3Q6IGludGVyc2VjdFJlY3QsXG4gIGJ1aWxkTGF5ZXJNYXRyaXg6IGJ1aWxkTGF5ZXJNYXRyaXgsXG4gIG5vcm1hbGl6ZVJhbmtzOiBub3JtYWxpemVSYW5rcyxcbiAgcmVtb3ZlRW1wdHlSYW5rczogcmVtb3ZlRW1wdHlSYW5rcyxcbiAgYWRkQm9yZGVyTm9kZTogYWRkQm9yZGVyTm9kZSxcbiAgbWF4UmFuazogbWF4UmFuayxcbiAgcGFydGl0aW9uOiBwYXJ0aXRpb24sXG4gIHRpbWU6IHRpbWUsXG4gIG5vdGltZTogbm90aW1lXG59O1xuXG4vKlxuICogQWRkcyBhIGR1bW15IG5vZGUgdG8gdGhlIGdyYXBoIGFuZCByZXR1cm4gdi5cbiAqL1xuZnVuY3Rpb24gYWRkRHVtbXlOb2RlKGcsIHR5cGUsIGF0dHJzLCBuYW1lKSB7XG4gIHZhciB2O1xuICBkbyB7XG4gICAgdiA9IF8udW5pcXVlSWQobmFtZSk7XG4gIH0gd2hpbGUgKGcuaGFzTm9kZSh2KSk7XG5cbiAgYXR0cnMuZHVtbXkgPSB0eXBlO1xuICBnLnNldE5vZGUodiwgYXR0cnMpO1xuICByZXR1cm4gdjtcbn1cblxuLypcbiAqIFJldHVybnMgYSBuZXcgZ3JhcGggd2l0aCBvbmx5IHNpbXBsZSBlZGdlcy4gSGFuZGxlcyBhZ2dyZWdhdGlvbiBvZiBkYXRhXG4gKiBhc3NvY2lhdGVkIHdpdGggbXVsdGktZWRnZXMuXG4gKi9cbmZ1bmN0aW9uIHNpbXBsaWZ5KGcpIHtcbiAgdmFyIHNpbXBsaWZpZWQgPSBuZXcgR3JhcGgoKS5zZXRHcmFwaChnLmdyYXBoKCkpO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHNpbXBsaWZpZWQuc2V0Tm9kZSh2LCBnLm5vZGUodikpOyB9KTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBzaW1wbGVMYWJlbCA9IHNpbXBsaWZpZWQuZWRnZShlLnYsIGUudykgfHwgeyB3ZWlnaHQ6IDAsIG1pbmxlbjogMSB9O1xuICAgIHZhciBsYWJlbCA9IGcuZWRnZShlKTtcbiAgICBzaW1wbGlmaWVkLnNldEVkZ2UoZS52LCBlLncsIHtcbiAgICAgIHdlaWdodDogc2ltcGxlTGFiZWwud2VpZ2h0ICsgbGFiZWwud2VpZ2h0LFxuICAgICAgbWlubGVuOiBNYXRoLm1heChzaW1wbGVMYWJlbC5taW5sZW4sIGxhYmVsLm1pbmxlbilcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBzaW1wbGlmaWVkO1xufVxuXG5mdW5jdGlvbiBhc05vbkNvbXBvdW5kR3JhcGgoZykge1xuICB2YXIgc2ltcGxpZmllZCA9IG5ldyBHcmFwaCh7IG11bHRpZ3JhcGg6IGcuaXNNdWx0aWdyYXBoKCkgfSkuc2V0R3JhcGgoZy5ncmFwaCgpKTtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGlmICghZy5jaGlsZHJlbih2KS5sZW5ndGgpIHtcbiAgICAgIHNpbXBsaWZpZWQuc2V0Tm9kZSh2LCBnLm5vZGUodikpO1xuICAgIH1cbiAgfSk7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBzaW1wbGlmaWVkLnNldEVkZ2UoZSwgZy5lZGdlKGUpKTtcbiAgfSk7XG4gIHJldHVybiBzaW1wbGlmaWVkO1xufVxuXG5mdW5jdGlvbiBzdWNjZXNzb3JXZWlnaHRzKGcpIHtcbiAgdmFyIHdlaWdodE1hcCA9IF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBzdWNzID0ge307XG4gICAgXy5mb3JFYWNoKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHN1Y3NbZS53XSA9IChzdWNzW2Uud10gfHwgMCkgKyBnLmVkZ2UoZSkud2VpZ2h0O1xuICAgIH0pO1xuICAgIHJldHVybiBzdWNzO1xuICB9KTtcbiAgcmV0dXJuIF8uemlwT2JqZWN0KGcubm9kZXMoKSwgd2VpZ2h0TWFwKTtcbn1cblxuZnVuY3Rpb24gcHJlZGVjZXNzb3JXZWlnaHRzKGcpIHtcbiAgdmFyIHdlaWdodE1hcCA9IF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBwcmVkcyA9IHt9O1xuICAgIF8uZm9yRWFjaChnLmluRWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHByZWRzW2Uudl0gPSAocHJlZHNbZS52XSB8fCAwKSArIGcuZWRnZShlKS53ZWlnaHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByZWRzO1xuICB9KTtcbiAgcmV0dXJuIF8uemlwT2JqZWN0KGcubm9kZXMoKSwgd2VpZ2h0TWFwKTtcbn1cblxuLypcbiAqIEZpbmRzIHdoZXJlIGEgbGluZSBzdGFydGluZyBhdCBwb2ludCAoe3gsIHl9KSB3b3VsZCBpbnRlcnNlY3QgYSByZWN0YW5nbGVcbiAqICh7eCwgeSwgd2lkdGgsIGhlaWdodH0pIGlmIGl0IHdlcmUgcG9pbnRpbmcgYXQgdGhlIHJlY3RhbmdsZSdzIGNlbnRlci5cbiAqL1xuZnVuY3Rpb24gaW50ZXJzZWN0UmVjdChyZWN0LCBwb2ludCkge1xuICB2YXIgeCA9IHJlY3QueDtcbiAgdmFyIHkgPSByZWN0Lnk7XG5cbiAgLy8gUmVjdGFuZ2xlIGludGVyc2VjdGlvbiBhbGdvcml0aG0gZnJvbTpcbiAgLy8gaHR0cDovL21hdGguc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzEwODExMy9maW5kLWVkZ2UtYmV0d2Vlbi10d28tYm94ZXNcbiAgdmFyIGR4ID0gcG9pbnQueCAtIHg7XG4gIHZhciBkeSA9IHBvaW50LnkgLSB5O1xuICB2YXIgdyA9IHJlY3Qud2lkdGggLyAyO1xuICB2YXIgaCA9IHJlY3QuaGVpZ2h0IC8gMjtcblxuICBpZiAoIWR4ICYmICFkeSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBwb3NzaWJsZSB0byBmaW5kIGludGVyc2VjdGlvbiBpbnNpZGUgb2YgdGhlIHJlY3RhbmdsZVwiKTtcbiAgfVxuXG4gIHZhciBzeCwgc3k7XG4gIGlmIChNYXRoLmFicyhkeSkgKiB3ID4gTWF0aC5hYnMoZHgpICogaCkge1xuICAgIC8vIEludGVyc2VjdGlvbiBpcyB0b3Agb3IgYm90dG9tIG9mIHJlY3QuXG4gICAgaWYgKGR5IDwgMCkge1xuICAgICAgaCA9IC1oO1xuICAgIH1cbiAgICBzeCA9IGggKiBkeCAvIGR5O1xuICAgIHN5ID0gaDtcbiAgfSBlbHNlIHtcbiAgICAvLyBJbnRlcnNlY3Rpb24gaXMgbGVmdCBvciByaWdodCBvZiByZWN0LlxuICAgIGlmIChkeCA8IDApIHtcbiAgICAgIHcgPSAtdztcbiAgICB9XG4gICAgc3ggPSB3O1xuICAgIHN5ID0gdyAqIGR5IC8gZHg7XG4gIH1cblxuICByZXR1cm4geyB4OiB4ICsgc3gsIHk6IHkgKyBzeSB9O1xufVxuXG4vKlxuICogR2l2ZW4gYSBEQUcgd2l0aCBlYWNoIG5vZGUgYXNzaWduZWQgXCJyYW5rXCIgYW5kIFwib3JkZXJcIiBwcm9wZXJ0aWVzLCB0aGlzXG4gKiBmdW5jdGlvbiB3aWxsIHByb2R1Y2UgYSBtYXRyaXggd2l0aCB0aGUgaWRzIG9mIGVhY2ggbm9kZS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRMYXllck1hdHJpeChnKSB7XG4gIHZhciBsYXllcmluZyA9IF8ubWFwKF8ucmFuZ2UobWF4UmFuayhnKSArIDEpLCBmdW5jdGlvbigpIHsgcmV0dXJuIFtdOyB9KTtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIHZhciByYW5rID0gbm9kZS5yYW5rO1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChyYW5rKSkge1xuICAgICAgbGF5ZXJpbmdbcmFua11bbm9kZS5vcmRlcl0gPSB2O1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsYXllcmluZztcbn1cblxuLypcbiAqIEFkanVzdHMgdGhlIHJhbmtzIGZvciBhbGwgbm9kZXMgaW4gdGhlIGdyYXBoIHN1Y2ggdGhhdCBhbGwgbm9kZXMgdiBoYXZlXG4gKiByYW5rKHYpID49IDAgYW5kIGF0IGxlYXN0IG9uZSBub2RlIHcgaGFzIHJhbmsodykgPSAwLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSYW5rcyhnKSB7XG4gIHZhciBtaW4gPSBfLm1pbihfLm1hcChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KSk7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBpZiAoXy5oYXMobm9kZSwgXCJyYW5rXCIpKSB7XG4gICAgICBub2RlLnJhbmsgLT0gbWluO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5UmFua3MoZykge1xuICAvLyBSYW5rcyBtYXkgbm90IHN0YXJ0IGF0IDAsIHNvIHdlIG5lZWQgdG8gb2Zmc2V0IHRoZW1cbiAgdmFyIG9mZnNldCA9IF8ubWluKF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLnJhbms7IH0pKTtcblxuICB2YXIgbGF5ZXJzID0gW107XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgcmFuayA9IGcubm9kZSh2KS5yYW5rIC0gb2Zmc2V0O1xuICAgIGlmICghbGF5ZXJzW3JhbmtdKSB7XG4gICAgICBsYXllcnNbcmFua10gPSBbXTtcbiAgICB9XG4gICAgbGF5ZXJzW3JhbmtdLnB1c2godik7XG4gIH0pO1xuXG4gIHZhciBkZWx0YSA9IDA7XG4gIHZhciBub2RlUmFua0ZhY3RvciA9IGcuZ3JhcGgoKS5ub2RlUmFua0ZhY3RvcjtcbiAgXy5mb3JFYWNoKGxheWVycywgZnVuY3Rpb24odnMsIGkpIHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh2cykgJiYgaSAlIG5vZGVSYW5rRmFjdG9yICE9PSAwKSB7XG4gICAgICAtLWRlbHRhO1xuICAgIH0gZWxzZSBpZiAoZGVsdGEpIHtcbiAgICAgIF8uZm9yRWFjaCh2cywgZnVuY3Rpb24odikgeyBnLm5vZGUodikucmFuayArPSBkZWx0YTsgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkQm9yZGVyTm9kZShnLCBwcmVmaXgsIHJhbmssIG9yZGVyKSB7XG4gIHZhciBub2RlID0ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9O1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSB7XG4gICAgbm9kZS5yYW5rID0gcmFuaztcbiAgICBub2RlLm9yZGVyID0gb3JkZXI7XG4gIH1cbiAgcmV0dXJuIGFkZER1bW15Tm9kZShnLCBcImJvcmRlclwiLCBub2RlLCBwcmVmaXgpO1xufVxuXG5mdW5jdGlvbiBtYXhSYW5rKGcpIHtcbiAgcmV0dXJuIF8ubWF4KF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciByYW5rID0gZy5ub2RlKHYpLnJhbms7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHJhbmspKSB7XG4gICAgICByZXR1cm4gcmFuaztcbiAgICB9XG4gIH0pKTtcbn1cblxuLypcbiAqIFBhcnRpdGlvbiBhIGNvbGxlY3Rpb24gaW50byB0d28gZ3JvdXBzOiBgbGhzYCBhbmQgYHJoc2AuIElmIHRoZSBzdXBwbGllZFxuICogZnVuY3Rpb24gcmV0dXJucyB0cnVlIGZvciBhbiBlbnRyeSBpdCBnb2VzIGludG8gYGxoc2AuIE90aGVyd2lzZSBpdCBnb2VzXG4gKiBpbnRvIGByaHMuXG4gKi9cbmZ1bmN0aW9uIHBhcnRpdGlvbihjb2xsZWN0aW9uLCBmbikge1xuICB2YXIgcmVzdWx0ID0geyBsaHM6IFtdLCByaHM6IFtdIH07XG4gIF8uZm9yRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmIChmbih2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdC5saHMucHVzaCh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5yaHMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLypcbiAqIFJldHVybnMgYSBuZXcgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZm5gIHdpdGggYSB0aW1lci4gVGhlIHdyYXBwZXIgbG9ncyB0aGVcbiAqIHRpbWUgaXQgdGFrZXMgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHRpbWUobmFtZSwgZm4pIHtcbiAgdmFyIHN0YXJ0ID0gXy5ub3coKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjb25zb2xlLmxvZyhuYW1lICsgXCIgdGltZTogXCIgKyAoXy5ub3coKSAtIHN0YXJ0KSArIFwibXNcIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm90aW1lKG5hbWUsIGZuKSB7XG4gIHJldHVybiBmbigpO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjAuOC41XCI7XG4iLCIvKipcbiAqIEEgc2ltcGxlIGRlcGVuZGVuY3kgZ3JhcGhcbiAqL1xuXG4vKipcbiAqIEhlbHBlciBmb3IgY3JlYXRpbmcgYSBUb3BvbG9naWNhbCBTb3J0IHVzaW5nIERlcHRoLUZpcnN0LVNlYXJjaCBvbiBhIHNldCBvZiBlZGdlcy5cbiAqXG4gKiBEZXRlY3RzIGN5Y2xlcyBhbmQgdGhyb3dzIGFuIEVycm9yIGlmIG9uZSBpcyBkZXRlY3RlZCAodW5sZXNzIHRoZSBcImNpcmN1bGFyXCJcbiAqIHBhcmFtZXRlciBpcyBcInRydWVcIiBpbiB3aGljaCBjYXNlIGl0IGlnbm9yZXMgdGhlbSkuXG4gKlxuICogQHBhcmFtIGVkZ2VzIFRoZSBzZXQgb2YgZWRnZXMgdG8gREZTIHRocm91Z2hcbiAqIEBwYXJhbSBsZWF2ZXNPbmx5IFdoZXRoZXIgdG8gb25seSByZXR1cm4gXCJsZWFmXCIgbm9kZXMgKG9uZXMgd2hvIGhhdmUgbm8gZWRnZXMpXG4gKiBAcGFyYW0gcmVzdWx0IEFuIGFycmF5IGluIHdoaWNoIHRoZSByZXN1bHRzIHdpbGwgYmUgcG9wdWxhdGVkXG4gKiBAcGFyYW0gY2lyY3VsYXIgQSBib29sZWFuIHRvIGFsbG93IGNpcmN1bGFyIGRlcGVuZGVuY2llc1xuICovXG5mdW5jdGlvbiBjcmVhdGVERlMoZWRnZXMsIGxlYXZlc09ubHksIHJlc3VsdCwgY2lyY3VsYXIpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzdGFydCkge1xuICAgIGlmICh2aXNpdGVkW3N0YXJ0XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW5DdXJyZW50UGF0aCA9IHt9O1xuICAgIHZhciBjdXJyZW50UGF0aCA9IFtdO1xuICAgIHZhciB0b2RvID0gW107IC8vIHVzZWQgYXMgYSBzdGFja1xuICAgIHRvZG8ucHVzaCh7IG5vZGU6IHN0YXJ0LCBwcm9jZXNzZWQ6IGZhbHNlIH0pO1xuICAgIHdoaWxlICh0b2RvLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBjdXJyZW50ID0gdG9kb1t0b2RvLmxlbmd0aCAtIDFdOyAvLyBwZWVrIGF0IHRoZSB0b2RvIHN0YWNrXG4gICAgICB2YXIgcHJvY2Vzc2VkID0gY3VycmVudC5wcm9jZXNzZWQ7XG4gICAgICB2YXIgbm9kZSA9IGN1cnJlbnQubm9kZTtcbiAgICAgIGlmICghcHJvY2Vzc2VkKSB7XG4gICAgICAgIC8vIEhhdmVuJ3QgdmlzaXRlZCBlZGdlcyB5ZXQgKHZpc2l0aW5nIHBoYXNlKVxuICAgICAgICBpZiAodmlzaXRlZFtub2RlXSkge1xuICAgICAgICAgIHRvZG8ucG9wKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5DdXJyZW50UGF0aFtub2RlXSkge1xuICAgICAgICAgIC8vIEl0J3Mgbm90IGEgREFHXG4gICAgICAgICAgaWYgKGNpcmN1bGFyKSB7XG4gICAgICAgICAgICB0b2RvLnBvcCgpO1xuICAgICAgICAgICAgLy8gSWYgd2UncmUgdG9sZXJhdGluZyBjeWNsZXMsIGRvbid0IHJldmlzaXQgdGhlIG5vZGVcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50UGF0aC5wdXNoKG5vZGUpO1xuICAgICAgICAgIHRocm93IG5ldyBEZXBHcmFwaEN5Y2xlRXJyb3IoY3VycmVudFBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5DdXJyZW50UGF0aFtub2RlXSA9IHRydWU7XG4gICAgICAgIGN1cnJlbnRQYXRoLnB1c2gobm9kZSk7XG4gICAgICAgIHZhciBub2RlRWRnZXMgPSBlZGdlc1tub2RlXTtcbiAgICAgICAgLy8gKHB1c2ggZWRnZXMgb250byB0aGUgdG9kbyBzdGFjayBpbiByZXZlcnNlIG9yZGVyIHRvIGJlIG9yZGVyLWNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIERGUyBpbXBsZW1lbnRhdGlvbilcbiAgICAgICAgZm9yICh2YXIgaSA9IG5vZGVFZGdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRvZG8ucHVzaCh7IG5vZGU6IG5vZGVFZGdlc1tpXSwgcHJvY2Vzc2VkOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LnByb2Nlc3NlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYXZlIHZpc2l0ZWQgZWRnZXMgKHN0YWNrIHVucm9sbGluZyBwaGFzZSlcbiAgICAgICAgdG9kby5wb3AoKTtcbiAgICAgICAgY3VycmVudFBhdGgucG9wKCk7XG4gICAgICAgIGluQ3VycmVudFBhdGhbbm9kZV0gPSBmYWxzZTtcbiAgICAgICAgdmlzaXRlZFtub2RlXSA9IHRydWU7XG4gICAgICAgIGlmICghbGVhdmVzT25seSB8fCBlZGdlc1tub2RlXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgRGVwZW5kZW5jeSBHcmFwaFxuICovXG52YXIgRGVwR3JhcGggPSAoZXhwb3J0cy5EZXBHcmFwaCA9IGZ1bmN0aW9uIERlcEdyYXBoKG9wdHMpIHtcbiAgdGhpcy5ub2RlcyA9IHt9OyAvLyBOb2RlIC0+IE5vZGUvRGF0YSAodHJlYXRlZCBsaWtlIGEgU2V0KVxuICB0aGlzLm91dGdvaW5nRWRnZXMgPSB7fTsgLy8gTm9kZSAtPiBbRGVwZW5kZW5jeSBOb2RlXVxuICB0aGlzLmluY29taW5nRWRnZXMgPSB7fTsgLy8gTm9kZSAtPiBbRGVwZW5kYW50IE5vZGVdXG4gIHRoaXMuY2lyY3VsYXIgPSBvcHRzICYmICEhb3B0cy5jaXJjdWxhcjsgLy8gQWxsb3dzIGNpcmN1bGFyIGRlcHNcbn0pO1xuRGVwR3JhcGgucHJvdG90eXBlID0ge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBzaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMubm9kZXMpLmxlbmd0aDtcbiAgfSxcbiAgLyoqXG4gICAqIEFkZCBhIG5vZGUgdG8gdGhlIGRlcGVuZGVuY3kgZ3JhcGguIElmIGEgbm9kZSBhbHJlYWR5IGV4aXN0cywgdGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nLlxuICAgKi9cbiAgYWRkTm9kZTogZnVuY3Rpb24gKG5vZGUsIGRhdGEpIHtcbiAgICBpZiAoIXRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgLy8gQ2hlY2tpbmcgdGhlIGFyZ3VtZW50cyBsZW5ndGggYWxsb3dzIHRoZSB1c2VyIHRvIGFkZCBhIG5vZGUgd2l0aCB1bmRlZmluZWQgZGF0YVxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgdGhpcy5ub2Rlc1tub2RlXSA9IGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm5vZGVzW25vZGVdID0gbm9kZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3V0Z29pbmdFZGdlc1tub2RlXSA9IFtdO1xuICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzW25vZGVdID0gW107XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogUmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSBkZXBlbmRlbmN5IGdyYXBoLiBJZiBhIG5vZGUgZG9lcyBub3QgZXhpc3QsIHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZy5cbiAgICovXG4gIHJlbW92ZU5vZGU6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgZGVsZXRlIHRoaXMubm9kZXNbbm9kZV07XG4gICAgICBkZWxldGUgdGhpcy5vdXRnb2luZ0VkZ2VzW25vZGVdO1xuICAgICAgZGVsZXRlIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXTtcbiAgICAgIFt0aGlzLmluY29taW5nRWRnZXMsIHRoaXMub3V0Z29pbmdFZGdlc10uZm9yRWFjaChmdW5jdGlvbiAoZWRnZUxpc3QpIHtcbiAgICAgICAgT2JqZWN0LmtleXMoZWRnZUxpc3QpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHZhciBpZHggPSBlZGdlTGlzdFtrZXldLmluZGV4T2Yobm9kZSk7XG4gICAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgICBlZGdlTGlzdFtrZXldLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG5vZGUgZXhpc3RzIGluIHRoZSBncmFwaFxuICAgKi9cbiAgaGFzTm9kZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlKTtcbiAgfSxcbiAgLyoqXG4gICAqIEdldCB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBub2RlIG5hbWVcbiAgICovXG4gIGdldE5vZGVEYXRhOiBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzW25vZGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFNldCB0aGUgYXNzb2NpYXRlZCBkYXRhIGZvciBhIGdpdmVuIG5vZGUgbmFtZS4gSWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QsIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJyb3JcbiAgICovXG4gIHNldE5vZGVEYXRhOiBmdW5jdGlvbiAobm9kZSwgZGF0YSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIHRoaXMubm9kZXNbbm9kZV0gPSBkYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEFkZCBhIGRlcGVuZGVuY3kgYmV0d2VlbiB0d28gbm9kZXMuIElmIGVpdGhlciBvZiB0aGUgbm9kZXMgZG9lcyBub3QgZXhpc3QsXG4gICAqIGFuIEVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKi9cbiAgYWRkRGVwZW5kZW5jeTogZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gICAgaWYgKCF0aGlzLmhhc05vZGUoZnJvbSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgZnJvbSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNOb2RlKHRvKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyB0byk7XG4gICAgfVxuICAgIGlmICh0aGlzLm91dGdvaW5nRWRnZXNbZnJvbV0uaW5kZXhPZih0bykgPT09IC0xKSB7XG4gICAgICB0aGlzLm91dGdvaW5nRWRnZXNbZnJvbV0ucHVzaCh0byk7XG4gICAgfVxuICAgIGlmICh0aGlzLmluY29taW5nRWRnZXNbdG9dLmluZGV4T2YoZnJvbSkgPT09IC0xKSB7XG4gICAgICB0aGlzLmluY29taW5nRWRnZXNbdG9dLnB1c2goZnJvbSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKipcbiAgICogUmVtb3ZlIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBub2Rlcy5cbiAgICovXG4gIHJlbW92ZURlcGVuZGVuY3k6IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgIHZhciBpZHg7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShmcm9tKSkge1xuICAgICAgaWR4ID0gdGhpcy5vdXRnb2luZ0VkZ2VzW2Zyb21dLmluZGV4T2YodG8pO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNOb2RlKHRvKSkge1xuICAgICAgaWR4ID0gdGhpcy5pbmNvbWluZ0VkZ2VzW3RvXS5pbmRleE9mKGZyb20pO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHRoaXMuaW5jb21pbmdFZGdlc1t0b10uc3BsaWNlKGlkeCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogUmV0dXJuIGEgY2xvbmUgb2YgdGhlIGRlcGVuZGVuY3kgZ3JhcGguIElmIGFueSBjdXN0b20gZGF0YSBpcyBhdHRhY2hlZFxuICAgKiB0byB0aGUgbm9kZXMsIGl0IHdpbGwgb25seSBiZSBzaGFsbG93IGNvcGllZC5cbiAgICovXG4gIGNsb25lOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHRoaXM7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBEZXBHcmFwaCgpO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoc291cmNlLm5vZGVzKTtcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJlc3VsdC5ub2Rlc1tuXSA9IHNvdXJjZS5ub2Rlc1tuXTtcbiAgICAgIHJlc3VsdC5vdXRnb2luZ0VkZ2VzW25dID0gc291cmNlLm91dGdvaW5nRWRnZXNbbl0uc2xpY2UoMCk7XG4gICAgICByZXN1bHQuaW5jb21pbmdFZGdlc1tuXSA9IHNvdXJjZS5pbmNvbWluZ0VkZ2VzW25dLnNsaWNlKDApO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZGlyZWN0IGRlcGVuZGVuY2llcyBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqL1xuICBkaXJlY3REZXBlbmRlbmNpZXNPZjogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAodGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5vdXRnb2luZ0VkZ2VzW25vZGVdLnNsaWNlKDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBjb250YWluaW5nIHRoZSBub2RlcyB0aGF0IGRpcmVjdGx5IGRlcGVuZCBvbiB0aGUgc3BlY2lmaWVkIG5vZGUuXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqL1xuICBkaXJlY3REZXBlbmRhbnRzT2Y6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXS5zbGljZSgwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbm9kZXMgdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgZGVwZW5kcyBvbiAodHJhbnNpdGl2ZWx5KS5cbiAgICpcbiAgICogVGhyb3dzIGFuIEVycm9yIGlmIHRoZSBncmFwaCBoYXMgYSBjeWNsZSwgb3IgdGhlIHNwZWNpZmllZCBub2RlIGRvZXMgbm90IGV4aXN0LlxuICAgKlxuICAgKiBJZiBgbGVhdmVzT25seWAgaXMgdHJ1ZSwgb25seSBub2RlcyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gYW55IG90aGVyIG5vZGVzIHdpbGwgYmUgcmV0dXJuZWRcbiAgICogaW4gdGhlIGFycmF5LlxuICAgKi9cbiAgZGVwZW5kZW5jaWVzT2Y6IGZ1bmN0aW9uIChub2RlLCBsZWF2ZXNPbmx5KSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgdmFyIERGUyA9IGNyZWF0ZURGUyhcbiAgICAgICAgdGhpcy5vdXRnb2luZ0VkZ2VzLFxuICAgICAgICBsZWF2ZXNPbmx5LFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHRoaXMuY2lyY3VsYXJcbiAgICAgICk7XG4gICAgICBERlMobm9kZSk7XG4gICAgICB2YXIgaWR4ID0gcmVzdWx0LmluZGV4T2Yobm9kZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgcmVzdWx0LnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBnZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbm9kZXMgdGhhdCBkZXBlbmQgb24gdGhlIHNwZWNpZmllZCBub2RlICh0cmFuc2l0aXZlbHkpLlxuICAgKlxuICAgKiBUaHJvd3MgYW4gRXJyb3IgaWYgdGhlIGdyYXBoIGhhcyBhIGN5Y2xlLCBvciB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqXG4gICAqIElmIGBsZWF2ZXNPbmx5YCBpcyB0cnVlLCBvbmx5IG5vZGVzIHRoYXQgZG8gbm90IGhhdmUgYW55IGRlcGVuZGFudHMgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgYXJyYXkuXG4gICAqL1xuICBkZXBlbmRhbnRzT2Y6IGZ1bmN0aW9uIChub2RlLCBsZWF2ZXNPbmx5KSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgdmFyIERGUyA9IGNyZWF0ZURGUyhcbiAgICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzLFxuICAgICAgICBsZWF2ZXNPbmx5LFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHRoaXMuY2lyY3VsYXJcbiAgICAgICk7XG4gICAgICBERlMobm9kZSk7XG4gICAgICB2YXIgaWR4ID0gcmVzdWx0LmluZGV4T2Yobm9kZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgcmVzdWx0LnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgdGhlIG92ZXJhbGwgcHJvY2Vzc2luZyBvcmRlciBmb3IgdGhlIGRlcGVuZGVuY3kgZ3JhcGguXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgZ3JhcGggaGFzIGEgY3ljbGUuXG4gICAqXG4gICAqIElmIGBsZWF2ZXNPbmx5YCBpcyB0cnVlLCBvbmx5IG5vZGVzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBhbnkgb3RoZXIgbm9kZXMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICovXG4gIG92ZXJhbGxPcmRlcjogZnVuY3Rpb24gKGxlYXZlc09ubHkpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGhpcy5ub2Rlcyk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0OyAvLyBFbXB0eSBncmFwaFxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMuY2lyY3VsYXIpIHtcbiAgICAgICAgLy8gTG9vayBmb3IgY3ljbGVzIC0gd2UgcnVuIHRoZSBERlMgc3RhcnRpbmcgYXQgYWxsIHRoZSBub2RlcyBpbiBjYXNlIHRoZXJlXG4gICAgICAgIC8vIGFyZSBzZXZlcmFsIGRpc2Nvbm5lY3RlZCBzdWJncmFwaHMgaW5zaWRlIHRoaXMgZGVwZW5kZW5jeSBncmFwaC5cbiAgICAgICAgdmFyIEN5Y2xlREZTID0gY3JlYXRlREZTKHRoaXMub3V0Z29pbmdFZGdlcywgZmFsc2UsIFtdLCB0aGlzLmNpcmN1bGFyKTtcbiAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgQ3ljbGVERlMobik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgREZTID0gY3JlYXRlREZTKFxuICAgICAgICB0aGlzLm91dGdvaW5nRWRnZXMsXG4gICAgICAgIGxlYXZlc09ubHksXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgdGhpcy5jaXJjdWxhclxuICAgICAgKTtcbiAgICAgIC8vIEZpbmQgYWxsIHBvdGVudGlhbCBzdGFydGluZyBwb2ludHMgKG5vZGVzIHdpdGggbm90aGluZyBkZXBlbmRpbmcgb24gdGhlbSkgYW5cbiAgICAgIC8vIHJ1biBhIERGUyBzdGFydGluZyBhdCB0aGVzZSBwb2ludHMgdG8gZ2V0IHRoZSBvcmRlclxuICAgICAga2V5c1xuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuaW5jb21pbmdFZGdlc1tub2RlXS5sZW5ndGggPT09IDA7XG4gICAgICAgIH0pXG4gICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgREZTKG4pO1xuICAgICAgICB9KTtcblxuICAgICAgLy8gSWYgd2UncmUgYWxsb3dpbmcgY3ljbGVzIC0gd2UgbmVlZCB0byBydW4gdGhlIERGUyBhZ2FpbnN0IGFueSByZW1haW5pbmdcbiAgICAgIC8vIG5vZGVzIHRoYXQgZGlkIG5vdCBlbmQgdXAgaW4gdGhlIGluaXRpYWwgcmVzdWx0IChhcyB0aGV5IGFyZSBwYXJ0IG9mIGFcbiAgICAgIC8vIHN1YmdyYXBoIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGNsZWFyIHN0YXJ0aW5nIHBvaW50KVxuICAgICAgaWYgKHRoaXMuY2lyY3VsYXIpIHtcbiAgICAgICAga2V5c1xuICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuaW5kZXhPZihub2RlKSA9PT0gLTE7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgREZTKG4pO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiBub2RlcyB0aGF0IGhhdmUgbm8gZGVwZW5kYW50cyAoaS5lLiBub3RoaW5nIGRlcGVuZHMgb24gdGhlbSkuXG4gICAqL1xuICBlbnRyeU5vZGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLm5vZGVzKS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBzZWxmLmluY29taW5nRWRnZXNbbm9kZV0ubGVuZ3RoID09PSAwO1xuICAgIH0pO1xuICB9XG59O1xuXG4vLyBDcmVhdGUgc29tZSBhbGlhc2VzXG5EZXBHcmFwaC5wcm90b3R5cGUuZGlyZWN0RGVwZW5kZW50c09mID0gRGVwR3JhcGgucHJvdG90eXBlLmRpcmVjdERlcGVuZGFudHNPZjtcbkRlcEdyYXBoLnByb3RvdHlwZS5kZXBlbmRlbnRzT2YgPSBEZXBHcmFwaC5wcm90b3R5cGUuZGVwZW5kYW50c09mO1xuXG4vKipcbiAqIEN5Y2xlIGVycm9yLCBpbmNsdWRpbmcgdGhlIHBhdGggb2YgdGhlIGN5Y2xlLlxuICovXG52YXIgRGVwR3JhcGhDeWNsZUVycm9yID0gKGV4cG9ydHMuRGVwR3JhcGhDeWNsZUVycm9yID0gZnVuY3Rpb24gKGN5Y2xlUGF0aCkge1xuICB2YXIgbWVzc2FnZSA9IFwiRGVwZW5kZW5jeSBDeWNsZSBGb3VuZDogXCIgKyBjeWNsZVBhdGguam9pbihcIiAtPiBcIik7XG4gIHZhciBpbnN0YW5jZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgaW5zdGFuY2UuY3ljbGVQYXRoID0gY3ljbGVQYXRoO1xuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoaW5zdGFuY2UsIE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSk7XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGluc3RhbmNlLCBEZXBHcmFwaEN5Y2xlRXJyb3IpO1xuICB9XG4gIHJldHVybiBpbnN0YW5jZTtcbn0pO1xuRGVwR3JhcGhDeWNsZUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlLCB7XG4gIGNvbnN0cnVjdG9yOiB7XG4gICAgdmFsdWU6IEVycm9yLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KTtcbk9iamVjdC5zZXRQcm90b3R5cGVPZihEZXBHcmFwaEN5Y2xlRXJyb3IsIEVycm9yKTtcbiIsIi8qKlxuICogaW5zcGlyZWQgYnkgaXMtbnVtYmVyIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1udW1iZXI+XG4gKiBidXQgc2lnbmlmaWNhbnRseSBzaW1wbGlmaWVkIGFuZCBzcGVkIHVwIGJ5IGlnbm9yaW5nIG51bWJlciBhbmQgc3RyaW5nIGNvbnN0cnVjdG9yc1xuICogaWUgdGhlc2UgcmV0dXJuIGZhbHNlOlxuICogICBuZXcgTnVtYmVyKDEpXG4gKiAgIG5ldyBTdHJpbmcoJzEnKVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGFsbEJsYW5rQ2hhckNvZGVzID0gcmVxdWlyZSgnaXMtc3RyaW5nLWJsYW5rJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obikge1xuICAgIHZhciB0eXBlID0gdHlwZW9mIG47XG4gICAgaWYodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsID0gbjtcbiAgICAgICAgbiA9ICtuO1xuICAgICAgICAvLyB3aGl0ZXNwYWNlIHN0cmluZ3MgY2FzdCB0byB6ZXJvIC0gZmlsdGVyIHRoZW0gb3V0XG4gICAgICAgIGlmKG49PT0wICYmIGFsbEJsYW5rQ2hhckNvZGVzKG9yaWdpbmFsKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmKHR5cGUgIT09ICdudW1iZXInKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gbiAtIG4gPCAxO1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LCBDaHJpcyBQZXR0aXR0XG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuICogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXRcbiAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFXG4gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1JcbiAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSXG4gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxudmFyIGxpYiA9IHJlcXVpcmUoXCIuL2xpYlwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEdyYXBoOiBsaWIuR3JhcGgsXG4gIGpzb246IHJlcXVpcmUoXCIuL2xpYi9qc29uXCIpLFxuICBhbGc6IHJlcXVpcmUoXCIuL2xpYi9hbGdcIiksXG4gIHZlcnNpb246IGxpYi52ZXJzaW9uXG59O1xuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBvbmVudHM7XG5cbmZ1bmN0aW9uIGNvbXBvbmVudHMoZykge1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuICB2YXIgY21wdHMgPSBbXTtcbiAgdmFyIGNtcHQ7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHJldHVybjtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICBjbXB0LnB1c2godik7XG4gICAgXy5lYWNoKGcuc3VjY2Vzc29ycyh2KSwgZGZzKTtcbiAgICBfLmVhY2goZy5wcmVkZWNlc3NvcnModiksIGRmcyk7XG4gIH1cblxuICBfLmVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgY21wdCA9IFtdO1xuICAgIGRmcyh2KTtcbiAgICBpZiAoY21wdC5sZW5ndGgpIHtcbiAgICAgIGNtcHRzLnB1c2goY21wdCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY21wdHM7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGZzO1xuXG4vKlxuICogQSBoZWxwZXIgdGhhdCBwcmVmb3JtcyBhIHByZS0gb3IgcG9zdC1vcmRlciB0cmF2ZXJzYWwgb24gdGhlIGlucHV0IGdyYXBoXG4gKiBhbmQgcmV0dXJucyB0aGUgbm9kZXMgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSB2aXNpdGVkLiBJZiB0aGUgZ3JhcGggaXNcbiAqIHVuZGlyZWN0ZWQgdGhlbiB0aGlzIGFsZ29yaXRobSB3aWxsIG5hdmlnYXRlIHVzaW5nIG5laWdoYm9ycy4gSWYgdGhlIGdyYXBoXG4gKiBpcyBkaXJlY3RlZCB0aGVuIHRoaXMgYWxnb3JpdGhtIHdpbGwgbmF2aWdhdGUgdXNpbmcgc3VjY2Vzc29ycy5cbiAqXG4gKiBPcmRlciBtdXN0IGJlIG9uZSBvZiBcInByZVwiIG9yIFwicG9zdFwiLlxuICovXG5mdW5jdGlvbiBkZnMoZywgdnMsIG9yZGVyKSB7XG4gIGlmICghXy5pc0FycmF5KHZzKSkge1xuICAgIHZzID0gW3ZzXTtcbiAgfVxuXG4gIHZhciBuYXZpZ2F0aW9uID0gKGcuaXNEaXJlY3RlZCgpID8gZy5zdWNjZXNzb3JzIDogZy5uZWlnaGJvcnMpLmJpbmQoZyk7XG5cbiAgdmFyIGFjYyA9IFtdO1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuICBfLmVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoIWcuaGFzTm9kZSh2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR3JhcGggZG9lcyBub3QgaGF2ZSBub2RlOiBcIiArIHYpO1xuICAgIH1cblxuICAgIGRvRGZzKGcsIHYsIG9yZGVyID09PSBcInBvc3RcIiwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKTtcbiAgfSk7XG4gIHJldHVybiBhY2M7XG59XG5cbmZ1bmN0aW9uIGRvRGZzKGcsIHYsIHBvc3RvcmRlciwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKSB7XG4gIGlmICghXy5oYXModmlzaXRlZCwgdikpIHtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcblxuICAgIGlmICghcG9zdG9yZGVyKSB7IGFjYy5wdXNoKHYpOyB9XG4gICAgXy5lYWNoKG5hdmlnYXRpb24odiksIGZ1bmN0aW9uKHcpIHtcbiAgICAgIGRvRGZzKGcsIHcsIHBvc3RvcmRlciwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKTtcbiAgICB9KTtcbiAgICBpZiAocG9zdG9yZGVyKSB7IGFjYy5wdXNoKHYpOyB9XG4gIH1cbn1cbiIsInZhciBkaWprc3RyYSA9IHJlcXVpcmUoXCIuL2RpamtzdHJhXCIpO1xudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRpamtzdHJhQWxsO1xuXG5mdW5jdGlvbiBkaWprc3RyYUFsbChnLCB3ZWlnaHRGdW5jLCBlZGdlRnVuYykge1xuICByZXR1cm4gXy50cmFuc2Zvcm0oZy5ub2RlcygpLCBmdW5jdGlvbihhY2MsIHYpIHtcbiAgICBhY2Nbdl0gPSBkaWprc3RyYShnLCB2LCB3ZWlnaHRGdW5jLCBlZGdlRnVuYyk7XG4gIH0sIHt9KTtcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBQcmlvcml0eVF1ZXVlID0gcmVxdWlyZShcIi4uL2RhdGEvcHJpb3JpdHktcXVldWVcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGlqa3N0cmE7XG5cbnZhciBERUZBVUxUX1dFSUdIVF9GVU5DID0gXy5jb25zdGFudCgxKTtcblxuZnVuY3Rpb24gZGlqa3N0cmEoZywgc291cmNlLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHJldHVybiBydW5EaWprc3RyYShnLCBTdHJpbmcoc291cmNlKSxcbiAgICB3ZWlnaHRGbiB8fCBERUZBVUxUX1dFSUdIVF9GVU5DLFxuICAgIGVkZ2VGbiB8fCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm91dEVkZ2VzKHYpOyB9KTtcbn1cblxuZnVuY3Rpb24gcnVuRGlqa3N0cmEoZywgc291cmNlLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHZhciByZXN1bHRzID0ge307XG4gIHZhciBwcSA9IG5ldyBQcmlvcml0eVF1ZXVlKCk7XG4gIHZhciB2LCB2RW50cnk7XG5cbiAgdmFyIHVwZGF0ZU5laWdoYm9ycyA9IGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICB2YXIgdyA9IGVkZ2UudiAhPT0gdiA/IGVkZ2UudiA6IGVkZ2UudztcbiAgICB2YXIgd0VudHJ5ID0gcmVzdWx0c1t3XTtcbiAgICB2YXIgd2VpZ2h0ID0gd2VpZ2h0Rm4oZWRnZSk7XG4gICAgdmFyIGRpc3RhbmNlID0gdkVudHJ5LmRpc3RhbmNlICsgd2VpZ2h0O1xuXG4gICAgaWYgKHdlaWdodCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImRpamtzdHJhIGRvZXMgbm90IGFsbG93IG5lZ2F0aXZlIGVkZ2Ugd2VpZ2h0cy4gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiQmFkIGVkZ2U6IFwiICsgZWRnZSArIFwiIFdlaWdodDogXCIgKyB3ZWlnaHQpO1xuICAgIH1cblxuICAgIGlmIChkaXN0YW5jZSA8IHdFbnRyeS5kaXN0YW5jZSkge1xuICAgICAgd0VudHJ5LmRpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICB3RW50cnkucHJlZGVjZXNzb3IgPSB2O1xuICAgICAgcHEuZGVjcmVhc2UodywgZGlzdGFuY2UpO1xuICAgIH1cbiAgfTtcblxuICBnLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbih2KSB7XG4gICAgdmFyIGRpc3RhbmNlID0gdiA9PT0gc291cmNlID8gMCA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICByZXN1bHRzW3ZdID0geyBkaXN0YW5jZTogZGlzdGFuY2UgfTtcbiAgICBwcS5hZGQodiwgZGlzdGFuY2UpO1xuICB9KTtcblxuICB3aGlsZSAocHEuc2l6ZSgpID4gMCkge1xuICAgIHYgPSBwcS5yZW1vdmVNaW4oKTtcbiAgICB2RW50cnkgPSByZXN1bHRzW3ZdO1xuICAgIGlmICh2RW50cnkuZGlzdGFuY2UgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZWRnZUZuKHYpLmZvckVhY2godXBkYXRlTmVpZ2hib3JzKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHRhcmphbiA9IHJlcXVpcmUoXCIuL3RhcmphblwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmaW5kQ3ljbGVzO1xuXG5mdW5jdGlvbiBmaW5kQ3ljbGVzKGcpIHtcbiAgcmV0dXJuIF8uZmlsdGVyKHRhcmphbihnKSwgZnVuY3Rpb24oY21wdCkge1xuICAgIHJldHVybiBjbXB0Lmxlbmd0aCA+IDEgfHwgKGNtcHQubGVuZ3RoID09PSAxICYmIGcuaGFzRWRnZShjbXB0WzBdLCBjbXB0WzBdKSk7XG4gIH0pO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZsb3lkV2Fyc2hhbGw7XG5cbnZhciBERUZBVUxUX1dFSUdIVF9GVU5DID0gXy5jb25zdGFudCgxKTtcblxuZnVuY3Rpb24gZmxveWRXYXJzaGFsbChnLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHJldHVybiBydW5GbG95ZFdhcnNoYWxsKGcsXG4gICAgd2VpZ2h0Rm4gfHwgREVGQVVMVF9XRUlHSFRfRlVOQyxcbiAgICBlZGdlRm4gfHwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5vdXRFZGdlcyh2KTsgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkZsb3lkV2Fyc2hhbGwoZywgd2VpZ2h0Rm4sIGVkZ2VGbikge1xuICB2YXIgcmVzdWx0cyA9IHt9O1xuICB2YXIgbm9kZXMgPSBnLm5vZGVzKCk7XG5cbiAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbih2KSB7XG4gICAgcmVzdWx0c1t2XSA9IHt9O1xuICAgIHJlc3VsdHNbdl1bdl0gPSB7IGRpc3RhbmNlOiAwIH07XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbih3KSB7XG4gICAgICBpZiAodiAhPT0gdykge1xuICAgICAgICByZXN1bHRzW3ZdW3ddID0geyBkaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIH07XG4gICAgICB9XG4gICAgfSk7XG4gICAgZWRnZUZuKHYpLmZvckVhY2goZnVuY3Rpb24oZWRnZSkge1xuICAgICAgdmFyIHcgPSBlZGdlLnYgPT09IHYgPyBlZGdlLncgOiBlZGdlLnY7XG4gICAgICB2YXIgZCA9IHdlaWdodEZuKGVkZ2UpO1xuICAgICAgcmVzdWx0c1t2XVt3XSA9IHsgZGlzdGFuY2U6IGQsIHByZWRlY2Vzc29yOiB2IH07XG4gICAgfSk7XG4gIH0pO1xuXG4gIG5vZGVzLmZvckVhY2goZnVuY3Rpb24oaykge1xuICAgIHZhciByb3dLID0gcmVzdWx0c1trXTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGkpIHtcbiAgICAgIHZhciByb3dJID0gcmVzdWx0c1tpXTtcbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24oaikge1xuICAgICAgICB2YXIgaWsgPSByb3dJW2tdO1xuICAgICAgICB2YXIga2ogPSByb3dLW2pdO1xuICAgICAgICB2YXIgaWogPSByb3dJW2pdO1xuICAgICAgICB2YXIgYWx0RGlzdGFuY2UgPSBpay5kaXN0YW5jZSArIGtqLmRpc3RhbmNlO1xuICAgICAgICBpZiAoYWx0RGlzdGFuY2UgPCBpai5kaXN0YW5jZSkge1xuICAgICAgICAgIGlqLmRpc3RhbmNlID0gYWx0RGlzdGFuY2U7XG4gICAgICAgICAgaWoucHJlZGVjZXNzb3IgPSBrai5wcmVkZWNlc3NvcjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHRzO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbXBvbmVudHM6IHJlcXVpcmUoXCIuL2NvbXBvbmVudHNcIiksXG4gIGRpamtzdHJhOiByZXF1aXJlKFwiLi9kaWprc3RyYVwiKSxcbiAgZGlqa3N0cmFBbGw6IHJlcXVpcmUoXCIuL2RpamtzdHJhLWFsbFwiKSxcbiAgZmluZEN5Y2xlczogcmVxdWlyZShcIi4vZmluZC1jeWNsZXNcIiksXG4gIGZsb3lkV2Fyc2hhbGw6IHJlcXVpcmUoXCIuL2Zsb3lkLXdhcnNoYWxsXCIpLFxuICBpc0FjeWNsaWM6IHJlcXVpcmUoXCIuL2lzLWFjeWNsaWNcIiksXG4gIHBvc3RvcmRlcjogcmVxdWlyZShcIi4vcG9zdG9yZGVyXCIpLFxuICBwcmVvcmRlcjogcmVxdWlyZShcIi4vcHJlb3JkZXJcIiksXG4gIHByaW06IHJlcXVpcmUoXCIuL3ByaW1cIiksXG4gIHRhcmphbjogcmVxdWlyZShcIi4vdGFyamFuXCIpLFxuICB0b3Bzb3J0OiByZXF1aXJlKFwiLi90b3Bzb3J0XCIpXG59O1xuIiwidmFyIHRvcHNvcnQgPSByZXF1aXJlKFwiLi90b3Bzb3J0XCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQWN5Y2xpYztcblxuZnVuY3Rpb24gaXNBY3ljbGljKGcpIHtcbiAgdHJ5IHtcbiAgICB0b3Bzb3J0KGcpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiB0b3Bzb3J0LkN5Y2xlRXhjZXB0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJ2YXIgZGZzID0gcmVxdWlyZShcIi4vZGZzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBvc3RvcmRlcjtcblxuZnVuY3Rpb24gcG9zdG9yZGVyKGcsIHZzKSB7XG4gIHJldHVybiBkZnMoZywgdnMsIFwicG9zdFwiKTtcbn1cbiIsInZhciBkZnMgPSByZXF1aXJlKFwiLi9kZnNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcHJlb3JkZXI7XG5cbmZ1bmN0aW9uIHByZW9yZGVyKGcsIHZzKSB7XG4gIHJldHVybiBkZnMoZywgdnMsIFwicHJlXCIpO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBoXCIpO1xudmFyIFByaW9yaXR5UXVldWUgPSByZXF1aXJlKFwiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwcmltO1xuXG5mdW5jdGlvbiBwcmltKGcsIHdlaWdodEZ1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBHcmFwaCgpO1xuICB2YXIgcGFyZW50cyA9IHt9O1xuICB2YXIgcHEgPSBuZXcgUHJpb3JpdHlRdWV1ZSgpO1xuICB2YXIgdjtcblxuICBmdW5jdGlvbiB1cGRhdGVOZWlnaGJvcnMoZWRnZSkge1xuICAgIHZhciB3ID0gZWRnZS52ID09PSB2ID8gZWRnZS53IDogZWRnZS52O1xuICAgIHZhciBwcmkgPSBwcS5wcmlvcml0eSh3KTtcbiAgICBpZiAocHJpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBlZGdlV2VpZ2h0ID0gd2VpZ2h0RnVuYyhlZGdlKTtcbiAgICAgIGlmIChlZGdlV2VpZ2h0IDwgcHJpKSB7XG4gICAgICAgIHBhcmVudHNbd10gPSB2O1xuICAgICAgICBwcS5kZWNyZWFzZSh3LCBlZGdlV2VpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZy5ub2RlQ291bnQoKSA9PT0gMCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBfLmVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcHEuYWRkKHYsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgcmVzdWx0LnNldE5vZGUodik7XG4gIH0pO1xuXG4gIC8vIFN0YXJ0IGZyb20gYW4gYXJiaXRyYXJ5IG5vZGVcbiAgcHEuZGVjcmVhc2UoZy5ub2RlcygpWzBdLCAwKTtcblxuICB2YXIgaW5pdCA9IGZhbHNlO1xuICB3aGlsZSAocHEuc2l6ZSgpID4gMCkge1xuICAgIHYgPSBwcS5yZW1vdmVNaW4oKTtcbiAgICBpZiAoXy5oYXMocGFyZW50cywgdikpIHtcbiAgICAgIHJlc3VsdC5zZXRFZGdlKHYsIHBhcmVudHNbdl0pO1xuICAgIH0gZWxzZSBpZiAoaW5pdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5wdXQgZ3JhcGggaXMgbm90IGNvbm5lY3RlZDogXCIgKyBnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5pdCA9IHRydWU7XG4gICAgfVxuXG4gICAgZy5ub2RlRWRnZXModikuZm9yRWFjaCh1cGRhdGVOZWlnaGJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0YXJqYW47XG5cbmZ1bmN0aW9uIHRhcmphbihnKSB7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgdmlzaXRlZCA9IHt9OyAvLyBub2RlIGlkIC0+IHsgb25TdGFjaywgbG93bGluaywgaW5kZXggfVxuICB2YXIgcmVzdWx0cyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgdmFyIGVudHJ5ID0gdmlzaXRlZFt2XSA9IHtcbiAgICAgIG9uU3RhY2s6IHRydWUsXG4gICAgICBsb3dsaW5rOiBpbmRleCxcbiAgICAgIGluZGV4OiBpbmRleCsrXG4gICAgfTtcbiAgICBzdGFjay5wdXNoKHYpO1xuXG4gICAgZy5zdWNjZXNzb3JzKHYpLmZvckVhY2goZnVuY3Rpb24odykge1xuICAgICAgaWYgKCFfLmhhcyh2aXNpdGVkLCB3KSkge1xuICAgICAgICBkZnModyk7XG4gICAgICAgIGVudHJ5Lmxvd2xpbmsgPSBNYXRoLm1pbihlbnRyeS5sb3dsaW5rLCB2aXNpdGVkW3ddLmxvd2xpbmspO1xuICAgICAgfSBlbHNlIGlmICh2aXNpdGVkW3ddLm9uU3RhY2spIHtcbiAgICAgICAgZW50cnkubG93bGluayA9IE1hdGgubWluKGVudHJ5Lmxvd2xpbmssIHZpc2l0ZWRbd10uaW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGVudHJ5Lmxvd2xpbmsgPT09IGVudHJ5LmluZGV4KSB7XG4gICAgICB2YXIgY21wdCA9IFtdO1xuICAgICAgdmFyIHc7XG4gICAgICBkbyB7XG4gICAgICAgIHcgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgdmlzaXRlZFt3XS5vblN0YWNrID0gZmFsc2U7XG4gICAgICAgIGNtcHQucHVzaCh3KTtcbiAgICAgIH0gd2hpbGUgKHYgIT09IHcpO1xuICAgICAgcmVzdWx0cy5wdXNoKGNtcHQpO1xuICAgIH1cbiAgfVxuXG4gIGcubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoIV8uaGFzKHZpc2l0ZWQsIHYpKSB7XG4gICAgICBkZnModik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0cztcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0b3Bzb3J0O1xudG9wc29ydC5DeWNsZUV4Y2VwdGlvbiA9IEN5Y2xlRXhjZXB0aW9uO1xuXG5mdW5jdGlvbiB0b3Bzb3J0KGcpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgdmFyIHN0YWNrID0ge307XG4gIHZhciByZXN1bHRzID0gW107XG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZSkge1xuICAgIGlmIChfLmhhcyhzdGFjaywgbm9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBDeWNsZUV4Y2VwdGlvbigpO1xuICAgIH1cblxuICAgIGlmICghXy5oYXModmlzaXRlZCwgbm9kZSkpIHtcbiAgICAgIHN0YWNrW25vZGVdID0gdHJ1ZTtcbiAgICAgIHZpc2l0ZWRbbm9kZV0gPSB0cnVlO1xuICAgICAgXy5lYWNoKGcucHJlZGVjZXNzb3JzKG5vZGUpLCB2aXNpdCk7XG4gICAgICBkZWxldGUgc3RhY2tbbm9kZV07XG4gICAgICByZXN1bHRzLnB1c2gobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgXy5lYWNoKGcuc2lua3MoKSwgdmlzaXQpO1xuXG4gIGlmIChfLnNpemUodmlzaXRlZCkgIT09IGcubm9kZUNvdW50KCkpIHtcbiAgICB0aHJvdyBuZXcgQ3ljbGVFeGNlcHRpb24oKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBDeWNsZUV4Y2VwdGlvbigpIHt9XG5DeWNsZUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsgLy8gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBFcnJvciB0byBwYXNzIHRlc3RpbmciLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJpb3JpdHlRdWV1ZTtcblxuLyoqXG4gKiBBIG1pbi1wcmlvcml0eSBxdWV1ZSBkYXRhIHN0cnVjdHVyZS4gVGhpcyBhbGdvcml0aG0gaXMgZGVyaXZlZCBmcm9tIENvcm1lbixcbiAqIGV0IGFsLiwgXCJJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtc1wiLiBUaGUgYmFzaWMgaWRlYSBvZiBhIG1pbi1wcmlvcml0eVxuICogcXVldWUgaXMgdGhhdCB5b3UgY2FuIGVmZmljaWVudGx5IChpbiBPKDEpIHRpbWUpIGdldCB0aGUgc21hbGxlc3Qga2V5IGluXG4gKiB0aGUgcXVldWUuIEFkZGluZyBhbmQgcmVtb3ZpbmcgZWxlbWVudHMgdGFrZXMgTyhsb2cgbikgdGltZS4gQSBrZXkgY2FuXG4gKiBoYXZlIGl0cyBwcmlvcml0eSBkZWNyZWFzZWQgaW4gTyhsb2cgbikgdGltZS5cbiAqL1xuZnVuY3Rpb24gUHJpb3JpdHlRdWV1ZSgpIHtcbiAgdGhpcy5fYXJyID0gW107XG4gIHRoaXMuX2tleUluZGljZXMgPSB7fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlLiBUYWtlcyBgTygxKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fYXJyLmxlbmd0aDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUga2V5cyB0aGF0IGFyZSBpbiB0aGUgcXVldWUuIFRha2VzIGBPKG4pYCB0aW1lLlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9hcnIubWFwKGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHgua2V5OyB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgKiprZXkqKiBpcyBpbiB0aGUgcXVldWUgYW5kIGBmYWxzZWAgaWYgbm90LlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbihrZXkpIHtcbiAgcmV0dXJuIF8uaGFzKHRoaXMuX2tleUluZGljZXMsIGtleSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHByaW9yaXR5IGZvciAqKmtleSoqLiBJZiAqKmtleSoqIGlzIG5vdCBwcmVzZW50IGluIHRoZSBxdWV1ZVxuICogdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYHVuZGVmaW5lZGAuIFRha2VzIGBPKDEpYCB0aW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBrZXlcbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucHJpb3JpdHkgPSBmdW5jdGlvbihrZXkpIHtcbiAgdmFyIGluZGV4ID0gdGhpcy5fa2V5SW5kaWNlc1trZXldO1xuICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5O1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhlIG1pbmltdW0gZWxlbWVudCBpbiB0aGlzIHF1ZXVlLiBJZiB0aGUgcXVldWUgaXNcbiAqIGVtcHR5IHRoaXMgZnVuY3Rpb24gdGhyb3dzIGFuIEVycm9yLiBUYWtlcyBgTygxKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUubWluID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUoKSA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlF1ZXVlIHVuZGVyZmxvd1wiKTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyWzBdLmtleTtcbn07XG5cbi8qKlxuICogSW5zZXJ0cyBhIG5ldyBrZXkgaW50byB0aGUgcHJpb3JpdHkgcXVldWUuIElmIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMgaW5cbiAqIHRoZSBxdWV1ZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYGZhbHNlYDsgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIGB0cnVlYC5cbiAqIFRha2VzIGBPKG4pYCB0aW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBrZXkgdGhlIGtleSB0byBhZGRcbiAqIEBwYXJhbSB7TnVtYmVyfSBwcmlvcml0eSB0aGUgaW5pdGlhbCBwcmlvcml0eSBmb3IgdGhlIGtleVxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihrZXksIHByaW9yaXR5KSB7XG4gIHZhciBrZXlJbmRpY2VzID0gdGhpcy5fa2V5SW5kaWNlcztcbiAga2V5ID0gU3RyaW5nKGtleSk7XG4gIGlmICghXy5oYXMoa2V5SW5kaWNlcywga2V5KSkge1xuICAgIHZhciBhcnIgPSB0aGlzLl9hcnI7XG4gICAgdmFyIGluZGV4ID0gYXJyLmxlbmd0aDtcbiAgICBrZXlJbmRpY2VzW2tleV0gPSBpbmRleDtcbiAgICBhcnIucHVzaCh7a2V5OiBrZXksIHByaW9yaXR5OiBwcmlvcml0eX0pO1xuICAgIHRoaXMuX2RlY3JlYXNlKGluZGV4KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIHNtYWxsZXN0IGtleSBpbiB0aGUgcXVldWUuIFRha2VzIGBPKGxvZyBuKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucmVtb3ZlTWluID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3N3YXAoMCwgdGhpcy5fYXJyLmxlbmd0aCAtIDEpO1xuICB2YXIgbWluID0gdGhpcy5fYXJyLnBvcCgpO1xuICBkZWxldGUgdGhpcy5fa2V5SW5kaWNlc1ttaW4ua2V5XTtcbiAgdGhpcy5faGVhcGlmeSgwKTtcbiAgcmV0dXJuIG1pbi5rZXk7XG59O1xuXG4vKipcbiAqIERlY3JlYXNlcyB0aGUgcHJpb3JpdHkgZm9yICoqa2V5KiogdG8gKipwcmlvcml0eSoqLiBJZiB0aGUgbmV3IHByaW9yaXR5IGlzXG4gKiBncmVhdGVyIHRoYW4gdGhlIHByZXZpb3VzIHByaW9yaXR5LCB0aGlzIGZ1bmN0aW9uIHdpbGwgdGhyb3cgYW4gRXJyb3IuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGtleSB0aGUga2V5IGZvciB3aGljaCB0byByYWlzZSBwcmlvcml0eVxuICogQHBhcmFtIHtOdW1iZXJ9IHByaW9yaXR5IHRoZSBuZXcgcHJpb3JpdHkgZm9yIHRoZSBrZXlcbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuZGVjcmVhc2UgPSBmdW5jdGlvbihrZXksIHByaW9yaXR5KSB7XG4gIHZhciBpbmRleCA9IHRoaXMuX2tleUluZGljZXNba2V5XTtcbiAgaWYgKHByaW9yaXR5ID4gdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5ldyBwcmlvcml0eSBpcyBncmVhdGVyIHRoYW4gY3VycmVudCBwcmlvcml0eS4gXCIgK1xuICAgICAgICBcIktleTogXCIgKyBrZXkgKyBcIiBPbGQ6IFwiICsgdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSArIFwiIE5ldzogXCIgKyBwcmlvcml0eSk7XG4gIH1cbiAgdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSA9IHByaW9yaXR5O1xuICB0aGlzLl9kZWNyZWFzZShpbmRleCk7XG59O1xuXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5faGVhcGlmeSA9IGZ1bmN0aW9uKGkpIHtcbiAgdmFyIGFyciA9IHRoaXMuX2FycjtcbiAgdmFyIGwgPSAyICogaTtcbiAgdmFyIHIgPSBsICsgMTtcbiAgdmFyIGxhcmdlc3QgPSBpO1xuICBpZiAobCA8IGFyci5sZW5ndGgpIHtcbiAgICBsYXJnZXN0ID0gYXJyW2xdLnByaW9yaXR5IDwgYXJyW2xhcmdlc3RdLnByaW9yaXR5ID8gbCA6IGxhcmdlc3Q7XG4gICAgaWYgKHIgPCBhcnIubGVuZ3RoKSB7XG4gICAgICBsYXJnZXN0ID0gYXJyW3JdLnByaW9yaXR5IDwgYXJyW2xhcmdlc3RdLnByaW9yaXR5ID8gciA6IGxhcmdlc3Q7XG4gICAgfVxuICAgIGlmIChsYXJnZXN0ICE9PSBpKSB7XG4gICAgICB0aGlzLl9zd2FwKGksIGxhcmdlc3QpO1xuICAgICAgdGhpcy5faGVhcGlmeShsYXJnZXN0KTtcbiAgICB9XG4gIH1cbn07XG5cblByaW9yaXR5UXVldWUucHJvdG90eXBlLl9kZWNyZWFzZSA9IGZ1bmN0aW9uKGluZGV4KSB7XG4gIHZhciBhcnIgPSB0aGlzLl9hcnI7XG4gIHZhciBwcmlvcml0eSA9IGFycltpbmRleF0ucHJpb3JpdHk7XG4gIHZhciBwYXJlbnQ7XG4gIHdoaWxlIChpbmRleCAhPT0gMCkge1xuICAgIHBhcmVudCA9IGluZGV4ID4+IDE7XG4gICAgaWYgKGFycltwYXJlbnRdLnByaW9yaXR5IDwgcHJpb3JpdHkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLl9zd2FwKGluZGV4LCBwYXJlbnQpO1xuICAgIGluZGV4ID0gcGFyZW50O1xuICB9XG59O1xuXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5fc3dhcCA9IGZ1bmN0aW9uKGksIGopIHtcbiAgdmFyIGFyciA9IHRoaXMuX2FycjtcbiAgdmFyIGtleUluZGljZXMgPSB0aGlzLl9rZXlJbmRpY2VzO1xuICB2YXIgb3JpZ0FyckkgPSBhcnJbaV07XG4gIHZhciBvcmlnQXJySiA9IGFycltqXTtcbiAgYXJyW2ldID0gb3JpZ0Fycko7XG4gIGFycltqXSA9IG9yaWdBcnJJO1xuICBrZXlJbmRpY2VzW29yaWdBcnJKLmtleV0gPSBpO1xuICBrZXlJbmRpY2VzW29yaWdBcnJJLmtleV0gPSBqO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBHcmFwaDtcblxudmFyIERFRkFVTFRfRURHRV9OQU1FID0gXCJcXHgwMFwiO1xudmFyIEdSQVBIX05PREUgPSBcIlxceDAwXCI7XG52YXIgRURHRV9LRVlfREVMSU0gPSBcIlxceDAxXCI7XG5cbi8vIEltcGxlbWVudGF0aW9uIG5vdGVzOlxuLy9cbi8vICAqIE5vZGUgaWQgcXVlcnkgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gc3RyaW5nIGlkcyBmb3IgdGhlIG5vZGVzXG4vLyAgKiBFZGdlIGlkIHF1ZXJ5IGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIGFuIFwiZWRnZU9ialwiLCBlZGdlIG9iamVjdCwgdGhhdCBpc1xuLy8gICAgY29tcG9zZWQgb2YgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuIGVkZ2U6IHt2LCB3LCBuYW1lfS5cbi8vICAqIEludGVybmFsbHkgd2UgdXNlIGFuIFwiZWRnZUlkXCIsIGEgc3RyaW5naWZpZWQgZm9ybSBvZiB0aGUgZWRnZU9iaiwgdG9cbi8vICAgIHJlZmVyZW5jZSBlZGdlcy4gVGhpcyBpcyBiZWNhdXNlIHdlIG5lZWQgYSBwZXJmb3JtYW50IHdheSB0byBsb29rIHRoZXNlXG4vLyAgICBlZGdlcyB1cCBhbmQsIG9iamVjdCBwcm9wZXJ0aWVzLCB3aGljaCBoYXZlIHN0cmluZyBrZXlzLCBhcmUgdGhlIGNsb3Nlc3Rcbi8vICAgIHdlJ3JlIGdvaW5nIHRvIGdldCB0byBhIHBlcmZvcm1hbnQgaGFzaHRhYmxlIGluIEphdmFTY3JpcHQuXG5cbmZ1bmN0aW9uIEdyYXBoKG9wdHMpIHtcbiAgdGhpcy5faXNEaXJlY3RlZCA9IF8uaGFzKG9wdHMsIFwiZGlyZWN0ZWRcIikgPyBvcHRzLmRpcmVjdGVkIDogdHJ1ZTtcbiAgdGhpcy5faXNNdWx0aWdyYXBoID0gXy5oYXMob3B0cywgXCJtdWx0aWdyYXBoXCIpID8gb3B0cy5tdWx0aWdyYXBoIDogZmFsc2U7XG4gIHRoaXMuX2lzQ29tcG91bmQgPSBfLmhhcyhvcHRzLCBcImNvbXBvdW5kXCIpID8gb3B0cy5jb21wb3VuZCA6IGZhbHNlO1xuXG4gIC8vIExhYmVsIGZvciB0aGUgZ3JhcGggaXRzZWxmXG4gIHRoaXMuX2xhYmVsID0gdW5kZWZpbmVkO1xuXG4gIC8vIERlZmF1bHRzIHRvIGJlIHNldCB3aGVuIGNyZWF0aW5nIGEgbmV3IG5vZGVcbiAgdGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuID0gXy5jb25zdGFudCh1bmRlZmluZWQpO1xuXG4gIC8vIERlZmF1bHRzIHRvIGJlIHNldCB3aGVuIGNyZWF0aW5nIGEgbmV3IGVkZ2VcbiAgdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuID0gXy5jb25zdGFudCh1bmRlZmluZWQpO1xuXG4gIC8vIHYgLT4gbGFiZWxcbiAgdGhpcy5fbm9kZXMgPSB7fTtcblxuICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgIC8vIHYgLT4gcGFyZW50XG4gICAgdGhpcy5fcGFyZW50ID0ge307XG5cbiAgICAvLyB2IC0+IGNoaWxkcmVuXG4gICAgdGhpcy5fY2hpbGRyZW4gPSB7fTtcbiAgICB0aGlzLl9jaGlsZHJlbltHUkFQSF9OT0RFXSA9IHt9O1xuICB9XG5cbiAgLy8gdiAtPiBlZGdlT2JqXG4gIHRoaXMuX2luID0ge307XG5cbiAgLy8gdSAtPiB2IC0+IE51bWJlclxuICB0aGlzLl9wcmVkcyA9IHt9O1xuXG4gIC8vIHYgLT4gZWRnZU9ialxuICB0aGlzLl9vdXQgPSB7fTtcblxuICAvLyB2IC0+IHcgLT4gTnVtYmVyXG4gIHRoaXMuX3N1Y3MgPSB7fTtcblxuICAvLyBlIC0+IGVkZ2VPYmpcbiAgdGhpcy5fZWRnZU9ianMgPSB7fTtcblxuICAvLyBlIC0+IGxhYmVsXG4gIHRoaXMuX2VkZ2VMYWJlbHMgPSB7fTtcbn1cblxuLyogTnVtYmVyIG9mIG5vZGVzIGluIHRoZSBncmFwaC4gU2hvdWxkIG9ubHkgYmUgY2hhbmdlZCBieSB0aGUgaW1wbGVtZW50YXRpb24uICovXG5HcmFwaC5wcm90b3R5cGUuX25vZGVDb3VudCA9IDA7XG5cbi8qIE51bWJlciBvZiBlZGdlcyBpbiB0aGUgZ3JhcGguIFNob3VsZCBvbmx5IGJlIGNoYW5nZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uLiAqL1xuR3JhcGgucHJvdG90eXBlLl9lZGdlQ291bnQgPSAwO1xuXG5cbi8qID09PSBHcmFwaCBmdW5jdGlvbnMgPT09PT09PT09ICovXG5cbkdyYXBoLnByb3RvdHlwZS5pc0RpcmVjdGVkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9pc0RpcmVjdGVkO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmlzTXVsdGlncmFwaCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5faXNNdWx0aWdyYXBoO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmlzQ29tcG91bmQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2lzQ29tcG91bmQ7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0R3JhcGggPSBmdW5jdGlvbihsYWJlbCkge1xuICB0aGlzLl9sYWJlbCA9IGxhYmVsO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ncmFwaCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fbGFiZWw7XG59O1xuXG5cbi8qID09PSBOb2RlIGZ1bmN0aW9ucyA9PT09PT09PT09ICovXG5cbkdyYXBoLnByb3RvdHlwZS5zZXREZWZhdWx0Tm9kZUxhYmVsID0gZnVuY3Rpb24obmV3RGVmYXVsdCkge1xuICBpZiAoIV8uaXNGdW5jdGlvbihuZXdEZWZhdWx0KSkge1xuICAgIG5ld0RlZmF1bHQgPSBfLmNvbnN0YW50KG5ld0RlZmF1bHQpO1xuICB9XG4gIHRoaXMuX2RlZmF1bHROb2RlTGFiZWxGbiA9IG5ld0RlZmF1bHQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLm5vZGVDb3VudCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fbm9kZUNvdW50O1xufTtcblxuR3JhcGgucHJvdG90eXBlLm5vZGVzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBfLmtleXModGhpcy5fbm9kZXMpO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNvdXJjZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICByZXR1cm4gXy5maWx0ZXIodGhpcy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuIF8uaXNFbXB0eShzZWxmLl9pblt2XSk7XG4gIH0pO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNpbmtzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgcmV0dXJuIF8uZmlsdGVyKHRoaXMubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHJldHVybiBfLmlzRW1wdHkoc2VsZi5fb3V0W3ZdKTtcbiAgfSk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0Tm9kZXMgPSBmdW5jdGlvbih2cywgdmFsdWUpIHtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgXy5lYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuICAgICAgc2VsZi5zZXROb2RlKHYsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5zZXROb2RlKHYpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNldE5vZGUgPSBmdW5jdGlvbih2LCB2YWx1ZSkge1xuICBpZiAoXy5oYXModGhpcy5fbm9kZXMsIHYpKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLl9ub2Rlc1t2XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoaXMuX25vZGVzW3ZdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyB2YWx1ZSA6IHRoaXMuX2RlZmF1bHROb2RlTGFiZWxGbih2KTtcbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICB0aGlzLl9wYXJlbnRbdl0gPSBHUkFQSF9OT0RFO1xuICAgIHRoaXMuX2NoaWxkcmVuW3ZdID0ge307XG4gICAgdGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV1bdl0gPSB0cnVlO1xuICB9XG4gIHRoaXMuX2luW3ZdID0ge307XG4gIHRoaXMuX3ByZWRzW3ZdID0ge307XG4gIHRoaXMuX291dFt2XSA9IHt9O1xuICB0aGlzLl9zdWNzW3ZdID0ge307XG4gICsrdGhpcy5fbm9kZUNvdW50O1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ub2RlID0gZnVuY3Rpb24odikge1xuICByZXR1cm4gdGhpcy5fbm9kZXNbdl07XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaGFzTm9kZSA9IGZ1bmN0aW9uKHYpIHtcbiAgcmV0dXJuIF8uaGFzKHRoaXMuX25vZGVzLCB2KTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5yZW1vdmVOb2RlID0gIGZ1bmN0aW9uKHYpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoXy5oYXModGhpcy5fbm9kZXMsIHYpKSB7XG4gICAgdmFyIHJlbW92ZUVkZ2UgPSBmdW5jdGlvbihlKSB7IHNlbGYucmVtb3ZlRWRnZShzZWxmLl9lZGdlT2Jqc1tlXSk7IH07XG4gICAgZGVsZXRlIHRoaXMuX25vZGVzW3ZdO1xuICAgIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgICB0aGlzLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCh2KTtcbiAgICAgIGRlbGV0ZSB0aGlzLl9wYXJlbnRbdl07XG4gICAgICBfLmVhY2godGhpcy5jaGlsZHJlbih2KSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgc2VsZi5zZXRQYXJlbnQoY2hpbGQpO1xuICAgICAgfSk7XG4gICAgICBkZWxldGUgdGhpcy5fY2hpbGRyZW5bdl07XG4gICAgfVxuICAgIF8uZWFjaChfLmtleXModGhpcy5faW5bdl0pLCByZW1vdmVFZGdlKTtcbiAgICBkZWxldGUgdGhpcy5faW5bdl07XG4gICAgZGVsZXRlIHRoaXMuX3ByZWRzW3ZdO1xuICAgIF8uZWFjaChfLmtleXModGhpcy5fb3V0W3ZdKSwgcmVtb3ZlRWRnZSk7XG4gICAgZGVsZXRlIHRoaXMuX291dFt2XTtcbiAgICBkZWxldGUgdGhpcy5fc3Vjc1t2XTtcbiAgICAtLXRoaXMuX25vZGVDb3VudDtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXRQYXJlbnQgPSBmdW5jdGlvbih2LCBwYXJlbnQpIHtcbiAgaWYgKCF0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNldCBwYXJlbnQgaW4gYSBub24tY29tcG91bmQgZ3JhcGhcIik7XG4gIH1cblxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJlbnQpKSB7XG4gICAgcGFyZW50ID0gR1JBUEhfTk9ERTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDb2VyY2UgcGFyZW50IHRvIHN0cmluZ1xuICAgIHBhcmVudCArPSBcIlwiO1xuICAgIGZvciAodmFyIGFuY2VzdG9yID0gcGFyZW50O1xuICAgICAgIV8uaXNVbmRlZmluZWQoYW5jZXN0b3IpO1xuICAgICAgYW5jZXN0b3IgPSB0aGlzLnBhcmVudChhbmNlc3RvcikpIHtcbiAgICAgIGlmIChhbmNlc3RvciA9PT0gdikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZXR0aW5nIFwiICsgcGFyZW50KyBcIiBhcyBwYXJlbnQgb2YgXCIgKyB2ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIHdvdWxkIGNyZWF0ZSBhIGN5Y2xlXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0Tm9kZShwYXJlbnQpO1xuICB9XG5cbiAgdGhpcy5zZXROb2RlKHYpO1xuICB0aGlzLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCh2KTtcbiAgdGhpcy5fcGFyZW50W3ZdID0gcGFyZW50O1xuICB0aGlzLl9jaGlsZHJlbltwYXJlbnRdW3ZdID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0ID0gZnVuY3Rpb24odikge1xuICBkZWxldGUgdGhpcy5fY2hpbGRyZW5bdGhpcy5fcGFyZW50W3ZdXVt2XTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5wYXJlbnQgPSBmdW5jdGlvbih2KSB7XG4gIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMuX3BhcmVudFt2XTtcbiAgICBpZiAocGFyZW50ICE9PSBHUkFQSF9OT0RFKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLmNoaWxkcmVuID0gZnVuY3Rpb24odikge1xuICBpZiAoXy5pc1VuZGVmaW5lZCh2KSkge1xuICAgIHYgPSBHUkFQSF9OT0RFO1xuICB9XG5cbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLl9jaGlsZHJlblt2XTtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiBfLmtleXMoY2hpbGRyZW4pO1xuICAgIH1cbiAgfSBlbHNlIGlmICh2ID09PSBHUkFQSF9OT0RFKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZXMoKTtcbiAgfSBlbHNlIGlmICh0aGlzLmhhc05vZGUodikpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5wcmVkZWNlc3NvcnMgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBwcmVkc1YgPSB0aGlzLl9wcmVkc1t2XTtcbiAgaWYgKHByZWRzVikge1xuICAgIHJldHVybiBfLmtleXMocHJlZHNWKTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLnN1Y2Nlc3NvcnMgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBzdWNzViA9IHRoaXMuX3N1Y3Nbdl07XG4gIGlmIChzdWNzVikge1xuICAgIHJldHVybiBfLmtleXMoc3Vjc1YpO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUubmVpZ2hib3JzID0gZnVuY3Rpb24odikge1xuICB2YXIgcHJlZHMgPSB0aGlzLnByZWRlY2Vzc29ycyh2KTtcbiAgaWYgKHByZWRzKSB7XG4gICAgcmV0dXJuIF8udW5pb24ocHJlZHMsIHRoaXMuc3VjY2Vzc29ycyh2KSk7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5pc0xlYWYgPSBmdW5jdGlvbiAodikge1xuICB2YXIgbmVpZ2hib3JzO1xuICBpZiAodGhpcy5pc0RpcmVjdGVkKCkpIHtcbiAgICBuZWlnaGJvcnMgPSB0aGlzLnN1Y2Nlc3NvcnModik7XG4gIH0gZWxzZSB7XG4gICAgbmVpZ2hib3JzID0gdGhpcy5uZWlnaGJvcnModik7XG4gIH1cbiAgcmV0dXJuIG5laWdoYm9ycy5sZW5ndGggPT09IDA7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZmlsdGVyTm9kZXMgPSBmdW5jdGlvbihmaWx0ZXIpIHtcbiAgdmFyIGNvcHkgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih7XG4gICAgZGlyZWN0ZWQ6IHRoaXMuX2lzRGlyZWN0ZWQsXG4gICAgbXVsdGlncmFwaDogdGhpcy5faXNNdWx0aWdyYXBoLFxuICAgIGNvbXBvdW5kOiB0aGlzLl9pc0NvbXBvdW5kXG4gIH0pO1xuXG4gIGNvcHkuc2V0R3JhcGgodGhpcy5ncmFwaCgpKTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIF8uZWFjaCh0aGlzLl9ub2RlcywgZnVuY3Rpb24odmFsdWUsIHYpIHtcbiAgICBpZiAoZmlsdGVyKHYpKSB7XG4gICAgICBjb3B5LnNldE5vZGUodiwgdmFsdWUpO1xuICAgIH1cbiAgfSk7XG5cbiAgXy5lYWNoKHRoaXMuX2VkZ2VPYmpzLCBmdW5jdGlvbihlKSB7XG4gICAgaWYgKGNvcHkuaGFzTm9kZShlLnYpICYmIGNvcHkuaGFzTm9kZShlLncpKSB7XG4gICAgICBjb3B5LnNldEVkZ2UoZSwgc2VsZi5lZGdlKGUpKTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciBwYXJlbnRzID0ge307XG4gIGZ1bmN0aW9uIGZpbmRQYXJlbnQodikge1xuICAgIHZhciBwYXJlbnQgPSBzZWxmLnBhcmVudCh2KTtcbiAgICBpZiAocGFyZW50ID09PSB1bmRlZmluZWQgfHwgY29weS5oYXNOb2RlKHBhcmVudCkpIHtcbiAgICAgIHBhcmVudHNbdl0gPSBwYXJlbnQ7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH0gZWxzZSBpZiAocGFyZW50IGluIHBhcmVudHMpIHtcbiAgICAgIHJldHVybiBwYXJlbnRzW3BhcmVudF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kUGFyZW50KHBhcmVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICBfLmVhY2goY29weS5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgICBjb3B5LnNldFBhcmVudCh2LCBmaW5kUGFyZW50KHYpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb3B5O1xufTtcblxuLyogPT09IEVkZ2UgZnVuY3Rpb25zID09PT09PT09PT0gKi9cblxuR3JhcGgucHJvdG90eXBlLnNldERlZmF1bHRFZGdlTGFiZWwgPSBmdW5jdGlvbihuZXdEZWZhdWx0KSB7XG4gIGlmICghXy5pc0Z1bmN0aW9uKG5ld0RlZmF1bHQpKSB7XG4gICAgbmV3RGVmYXVsdCA9IF8uY29uc3RhbnQobmV3RGVmYXVsdCk7XG4gIH1cbiAgdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuID0gbmV3RGVmYXVsdDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZWRnZUNvdW50ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9lZGdlQ291bnQ7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZWRnZXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIF8udmFsdWVzKHRoaXMuX2VkZ2VPYmpzKTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXRQYXRoID0gZnVuY3Rpb24odnMsIHZhbHVlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIF8ucmVkdWNlKHZzLCBmdW5jdGlvbih2LCB3KSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuICAgICAgc2VsZi5zZXRFZGdlKHYsIHcsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5zZXRFZGdlKHYsIHcpO1xuICAgIH1cbiAgICByZXR1cm4gdztcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLypcbiAqIHNldEVkZ2UodiwgdywgW3ZhbHVlLCBbbmFtZV1dKVxuICogc2V0RWRnZSh7IHYsIHcsIFtuYW1lXSB9LCBbdmFsdWVdKVxuICovXG5HcmFwaC5wcm90b3R5cGUuc2V0RWRnZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgdiwgdywgbmFtZSwgdmFsdWU7XG4gIHZhciB2YWx1ZVNwZWNpZmllZCA9IGZhbHNlO1xuICB2YXIgYXJnMCA9IGFyZ3VtZW50c1swXTtcblxuICBpZiAodHlwZW9mIGFyZzAgPT09IFwib2JqZWN0XCIgJiYgYXJnMCAhPT0gbnVsbCAmJiBcInZcIiBpbiBhcmcwKSB7XG4gICAgdiA9IGFyZzAudjtcbiAgICB3ID0gYXJnMC53O1xuICAgIG5hbWUgPSBhcmcwLm5hbWU7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHZhbHVlID0gYXJndW1lbnRzWzFdO1xuICAgICAgdmFsdWVTcGVjaWZpZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2ID0gYXJnMDtcbiAgICB3ID0gYXJndW1lbnRzWzFdO1xuICAgIG5hbWUgPSBhcmd1bWVudHNbM107XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICB2YWx1ZSA9IGFyZ3VtZW50c1syXTtcbiAgICAgIHZhbHVlU3BlY2lmaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2ID0gXCJcIiArIHY7XG4gIHcgPSBcIlwiICsgdztcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgbmFtZSA9IFwiXCIgKyBuYW1lO1xuICB9XG5cbiAgdmFyIGUgPSBlZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSk7XG4gIGlmIChfLmhhcyh0aGlzLl9lZGdlTGFiZWxzLCBlKSkge1xuICAgIGlmICh2YWx1ZVNwZWNpZmllZCkge1xuICAgICAgdGhpcy5fZWRnZUxhYmVsc1tlXSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmICghXy5pc1VuZGVmaW5lZChuYW1lKSAmJiAhdGhpcy5faXNNdWx0aWdyYXBoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNldCBhIG5hbWVkIGVkZ2Ugd2hlbiBpc011bHRpZ3JhcGggPSBmYWxzZVwiKTtcbiAgfVxuXG4gIC8vIEl0IGRpZG4ndCBleGlzdCwgc28gd2UgbmVlZCB0byBjcmVhdGUgaXQuXG4gIC8vIEZpcnN0IGVuc3VyZSB0aGUgbm9kZXMgZXhpc3QuXG4gIHRoaXMuc2V0Tm9kZSh2KTtcbiAgdGhpcy5zZXROb2RlKHcpO1xuXG4gIHRoaXMuX2VkZ2VMYWJlbHNbZV0gPSB2YWx1ZVNwZWNpZmllZCA/IHZhbHVlIDogdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuKHYsIHcsIG5hbWUpO1xuXG4gIHZhciBlZGdlT2JqID0gZWRnZUFyZ3NUb09iaih0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKTtcbiAgLy8gRW5zdXJlIHdlIGFkZCB1bmRpcmVjdGVkIGVkZ2VzIGluIGEgY29uc2lzdGVudCB3YXkuXG4gIHYgPSBlZGdlT2JqLnY7XG4gIHcgPSBlZGdlT2JqLnc7XG5cbiAgT2JqZWN0LmZyZWV6ZShlZGdlT2JqKTtcbiAgdGhpcy5fZWRnZU9ianNbZV0gPSBlZGdlT2JqO1xuICBpbmNyZW1lbnRPckluaXRFbnRyeSh0aGlzLl9wcmVkc1t3XSwgdik7XG4gIGluY3JlbWVudE9ySW5pdEVudHJ5KHRoaXMuX3N1Y3Nbdl0sIHcpO1xuICB0aGlzLl9pblt3XVtlXSA9IGVkZ2VPYmo7XG4gIHRoaXMuX291dFt2XVtlXSA9IGVkZ2VPYmo7XG4gIHRoaXMuX2VkZ2VDb3VudCsrO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5lZGdlID0gZnVuY3Rpb24odiwgdywgbmFtZSkge1xuICB2YXIgZSA9IChhcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgPyBlZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCBhcmd1bWVudHNbMF0pXG4gICAgOiBlZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSkpO1xuICByZXR1cm4gdGhpcy5fZWRnZUxhYmVsc1tlXTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5oYXNFZGdlID0gZnVuY3Rpb24odiwgdywgbmFtZSkge1xuICB2YXIgZSA9IChhcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgPyBlZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCBhcmd1bWVudHNbMF0pXG4gICAgOiBlZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSkpO1xuICByZXR1cm4gXy5oYXModGhpcy5fZWRnZUxhYmVscywgZSk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUucmVtb3ZlRWRnZSA9IGZ1bmN0aW9uKHYsIHcsIG5hbWUpIHtcbiAgdmFyIGUgPSAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMVxuICAgID8gZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCwgYXJndW1lbnRzWzBdKVxuICAgIDogZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIHYsIHcsIG5hbWUpKTtcbiAgdmFyIGVkZ2UgPSB0aGlzLl9lZGdlT2Jqc1tlXTtcbiAgaWYgKGVkZ2UpIHtcbiAgICB2ID0gZWRnZS52O1xuICAgIHcgPSBlZGdlLnc7XG4gICAgZGVsZXRlIHRoaXMuX2VkZ2VMYWJlbHNbZV07XG4gICAgZGVsZXRlIHRoaXMuX2VkZ2VPYmpzW2VdO1xuICAgIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkodGhpcy5fcHJlZHNbd10sIHYpO1xuICAgIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkodGhpcy5fc3Vjc1t2XSwgdyk7XG4gICAgZGVsZXRlIHRoaXMuX2luW3ddW2VdO1xuICAgIGRlbGV0ZSB0aGlzLl9vdXRbdl1bZV07XG4gICAgdGhpcy5fZWRnZUNvdW50LS07XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaW5FZGdlcyA9IGZ1bmN0aW9uKHYsIHUpIHtcbiAgdmFyIGluViA9IHRoaXMuX2luW3ZdO1xuICBpZiAoaW5WKSB7XG4gICAgdmFyIGVkZ2VzID0gXy52YWx1ZXMoaW5WKTtcbiAgICBpZiAoIXUpIHtcbiAgICAgIHJldHVybiBlZGdlcztcbiAgICB9XG4gICAgcmV0dXJuIF8uZmlsdGVyKGVkZ2VzLCBmdW5jdGlvbihlZGdlKSB7IHJldHVybiBlZGdlLnYgPT09IHU7IH0pO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUub3V0RWRnZXMgPSBmdW5jdGlvbih2LCB3KSB7XG4gIHZhciBvdXRWID0gdGhpcy5fb3V0W3ZdO1xuICBpZiAob3V0Vikge1xuICAgIHZhciBlZGdlcyA9IF8udmFsdWVzKG91dFYpO1xuICAgIGlmICghdykge1xuICAgICAgcmV0dXJuIGVkZ2VzO1xuICAgIH1cbiAgICByZXR1cm4gXy5maWx0ZXIoZWRnZXMsIGZ1bmN0aW9uKGVkZ2UpIHsgcmV0dXJuIGVkZ2UudyA9PT0gdzsgfSk7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ub2RlRWRnZXMgPSBmdW5jdGlvbih2LCB3KSB7XG4gIHZhciBpbkVkZ2VzID0gdGhpcy5pbkVkZ2VzKHYsIHcpO1xuICBpZiAoaW5FZGdlcykge1xuICAgIHJldHVybiBpbkVkZ2VzLmNvbmNhdCh0aGlzLm91dEVkZ2VzKHYsIHcpKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gaW5jcmVtZW50T3JJbml0RW50cnkobWFwLCBrKSB7XG4gIGlmIChtYXBba10pIHtcbiAgICBtYXBba10rKztcbiAgfSBlbHNlIHtcbiAgICBtYXBba10gPSAxO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkobWFwLCBrKSB7XG4gIGlmICghLS1tYXBba10pIHsgZGVsZXRlIG1hcFtrXTsgfVxufVxuXG5mdW5jdGlvbiBlZGdlQXJnc1RvSWQoaXNEaXJlY3RlZCwgdl8sIHdfLCBuYW1lKSB7XG4gIHZhciB2ID0gXCJcIiArIHZfO1xuICB2YXIgdyA9IFwiXCIgKyB3XztcbiAgaWYgKCFpc0RpcmVjdGVkICYmIHYgPiB3KSB7XG4gICAgdmFyIHRtcCA9IHY7XG4gICAgdiA9IHc7XG4gICAgdyA9IHRtcDtcbiAgfVxuICByZXR1cm4gdiArIEVER0VfS0VZX0RFTElNICsgdyArIEVER0VfS0VZX0RFTElNICtcbiAgICAgICAgICAgICAoXy5pc1VuZGVmaW5lZChuYW1lKSA/IERFRkFVTFRfRURHRV9OQU1FIDogbmFtZSk7XG59XG5cbmZ1bmN0aW9uIGVkZ2VBcmdzVG9PYmooaXNEaXJlY3RlZCwgdl8sIHdfLCBuYW1lKSB7XG4gIHZhciB2ID0gXCJcIiArIHZfO1xuICB2YXIgdyA9IFwiXCIgKyB3XztcbiAgaWYgKCFpc0RpcmVjdGVkICYmIHYgPiB3KSB7XG4gICAgdmFyIHRtcCA9IHY7XG4gICAgdiA9IHc7XG4gICAgdyA9IHRtcDtcbiAgfVxuICB2YXIgZWRnZU9iaiA9ICB7IHY6IHYsIHc6IHcgfTtcbiAgaWYgKG5hbWUpIHtcbiAgICBlZGdlT2JqLm5hbWUgPSBuYW1lO1xuICB9XG4gIHJldHVybiBlZGdlT2JqO1xufVxuXG5mdW5jdGlvbiBlZGdlT2JqVG9JZChpc0RpcmVjdGVkLCBlZGdlT2JqKSB7XG4gIHJldHVybiBlZGdlQXJnc1RvSWQoaXNEaXJlY3RlZCwgZWRnZU9iai52LCBlZGdlT2JqLncsIGVkZ2VPYmoubmFtZSk7XG59XG4iLCIvLyBJbmNsdWRlcyBvbmx5IHRoZSBcImNvcmVcIiBvZiBncmFwaGxpYlxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEdyYXBoOiByZXF1aXJlKFwiLi9ncmFwaFwiKSxcbiAgdmVyc2lvbjogcmVxdWlyZShcIi4vdmVyc2lvblwiKVxufTtcbiIsInZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4vZ3JhcGhcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB3cml0ZTogd3JpdGUsXG4gIHJlYWQ6IHJlYWRcbn07XG5cbmZ1bmN0aW9uIHdyaXRlKGcpIHtcbiAgdmFyIGpzb24gPSB7XG4gICAgb3B0aW9uczoge1xuICAgICAgZGlyZWN0ZWQ6IGcuaXNEaXJlY3RlZCgpLFxuICAgICAgbXVsdGlncmFwaDogZy5pc011bHRpZ3JhcGgoKSxcbiAgICAgIGNvbXBvdW5kOiBnLmlzQ29tcG91bmQoKVxuICAgIH0sXG4gICAgbm9kZXM6IHdyaXRlTm9kZXMoZyksXG4gICAgZWRnZXM6IHdyaXRlRWRnZXMoZylcbiAgfTtcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKGcuZ3JhcGgoKSkpIHtcbiAgICBqc29uLnZhbHVlID0gXy5jbG9uZShnLmdyYXBoKCkpO1xuICB9XG4gIHJldHVybiBqc29uO1xufVxuXG5mdW5jdGlvbiB3cml0ZU5vZGVzKGcpIHtcbiAgcmV0dXJuIF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlVmFsdWUgPSBnLm5vZGUodik7XG4gICAgdmFyIHBhcmVudCA9IGcucGFyZW50KHYpO1xuICAgIHZhciBub2RlID0geyB2OiB2IH07XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKG5vZGVWYWx1ZSkpIHtcbiAgICAgIG5vZGUudmFsdWUgPSBub2RlVmFsdWU7XG4gICAgfVxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJlbnQpKSB7XG4gICAgICBub2RlLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB3cml0ZUVkZ2VzKGcpIHtcbiAgcmV0dXJuIF8ubWFwKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlVmFsdWUgPSBnLmVkZ2UoZSk7XG4gICAgdmFyIGVkZ2UgPSB7IHY6IGUudiwgdzogZS53IH07XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGUubmFtZSkpIHtcbiAgICAgIGVkZ2UubmFtZSA9IGUubmFtZTtcbiAgICB9XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGVkZ2VWYWx1ZSkpIHtcbiAgICAgIGVkZ2UudmFsdWUgPSBlZGdlVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBlZGdlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZChqc29uKSB7XG4gIHZhciBnID0gbmV3IEdyYXBoKGpzb24ub3B0aW9ucykuc2V0R3JhcGgoanNvbi52YWx1ZSk7XG4gIF8uZWFjaChqc29uLm5vZGVzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIGcuc2V0Tm9kZShlbnRyeS52LCBlbnRyeS52YWx1ZSk7XG4gICAgaWYgKGVudHJ5LnBhcmVudCkge1xuICAgICAgZy5zZXRQYXJlbnQoZW50cnkudiwgZW50cnkucGFyZW50KTtcbiAgICB9XG4gIH0pO1xuICBfLmVhY2goanNvbi5lZGdlcywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICBnLnNldEVkZ2UoeyB2OiBlbnRyeS52LCB3OiBlbnRyeS53LCBuYW1lOiBlbnRyeS5uYW1lIH0sIGVudHJ5LnZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiBnO1xufVxuIiwiLyogZ2xvYmFsIHdpbmRvdyAqL1xuXG52YXIgbG9kYXNoO1xuXG5pZiAodHlwZW9mIHJlcXVpcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICB0cnkge1xuICAgIGxvZGFzaCA9IHtcbiAgICAgIGNsb25lOiByZXF1aXJlKFwibG9kYXNoL2Nsb25lXCIpLFxuICAgICAgY29uc3RhbnQ6IHJlcXVpcmUoXCJsb2Rhc2gvY29uc3RhbnRcIiksXG4gICAgICBlYWNoOiByZXF1aXJlKFwibG9kYXNoL2VhY2hcIiksXG4gICAgICBmaWx0ZXI6IHJlcXVpcmUoXCJsb2Rhc2gvZmlsdGVyXCIpLFxuICAgICAgaGFzOiAgcmVxdWlyZShcImxvZGFzaC9oYXNcIiksXG4gICAgICBpc0FycmF5OiByZXF1aXJlKFwibG9kYXNoL2lzQXJyYXlcIiksXG4gICAgICBpc0VtcHR5OiByZXF1aXJlKFwibG9kYXNoL2lzRW1wdHlcIiksXG4gICAgICBpc0Z1bmN0aW9uOiByZXF1aXJlKFwibG9kYXNoL2lzRnVuY3Rpb25cIiksXG4gICAgICBpc1VuZGVmaW5lZDogcmVxdWlyZShcImxvZGFzaC9pc1VuZGVmaW5lZFwiKSxcbiAgICAgIGtleXM6IHJlcXVpcmUoXCJsb2Rhc2gva2V5c1wiKSxcbiAgICAgIG1hcDogcmVxdWlyZShcImxvZGFzaC9tYXBcIiksXG4gICAgICByZWR1Y2U6IHJlcXVpcmUoXCJsb2Rhc2gvcmVkdWNlXCIpLFxuICAgICAgc2l6ZTogcmVxdWlyZShcImxvZGFzaC9zaXplXCIpLFxuICAgICAgdHJhbnNmb3JtOiByZXF1aXJlKFwibG9kYXNoL3RyYW5zZm9ybVwiKSxcbiAgICAgIHVuaW9uOiByZXF1aXJlKFwibG9kYXNoL3VuaW9uXCIpLFxuICAgICAgdmFsdWVzOiByZXF1aXJlKFwibG9kYXNoL3ZhbHVlc1wiKVxuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXG4gIH1cbn1cblxuaWYgKCFsb2Rhc2gpIHtcbiAgbG9kYXNoID0gd2luZG93Ll87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbG9kYXNoO1xuIiwibW9kdWxlLmV4cG9ydHMgPSAnMi4xLjgnO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbi8qKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vISBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbnZhciBSRUFDVF9TVEFUSUNTID0ge1xuICBjaGlsZENvbnRleHRUeXBlczogdHJ1ZSxcbiAgY29udGV4dFR5cGU6IHRydWUsXG4gIGNvbnRleHRUeXBlczogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgZ2V0RGVmYXVsdFByb3BzOiB0cnVlLFxuICBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I6IHRydWUsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wczogdHJ1ZSxcbiAgbWl4aW5zOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWUsXG4gIHR5cGU6IHRydWVcbn07XG52YXIgS05PV05fU1RBVElDUyA9IHtcbiAgbmFtZTogdHJ1ZSxcbiAgbGVuZ3RoOiB0cnVlLFxuICBwcm90b3R5cGU6IHRydWUsXG4gIGNhbGxlcjogdHJ1ZSxcbiAgY2FsbGVlOiB0cnVlLFxuICBhcmd1bWVudHM6IHRydWUsXG4gIGFyaXR5OiB0cnVlXG59O1xudmFyIEZPUldBUkRfUkVGX1NUQVRJQ1MgPSB7XG4gICckJHR5cGVvZic6IHRydWUsXG4gIHJlbmRlcjogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlXG59O1xudmFyIE1FTU9fU1RBVElDUyA9IHtcbiAgJyQkdHlwZW9mJzogdHJ1ZSxcbiAgY29tcGFyZTogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlLFxuICB0eXBlOiB0cnVlXG59O1xudmFyIFRZUEVfU1RBVElDUyA9IHt9O1xuVFlQRV9TVEFUSUNTW3JlYWN0SXMuRm9yd2FyZFJlZl0gPSBGT1JXQVJEX1JFRl9TVEFUSUNTO1xuVFlQRV9TVEFUSUNTW3JlYWN0SXMuTWVtb10gPSBNRU1PX1NUQVRJQ1M7XG5cbmZ1bmN0aW9uIGdldFN0YXRpY3MoY29tcG9uZW50KSB7XG4gIC8vIFJlYWN0IHYxNi4xMSBhbmQgYmVsb3dcbiAgaWYgKHJlYWN0SXMuaXNNZW1vKGNvbXBvbmVudCkpIHtcbiAgICByZXR1cm4gTUVNT19TVEFUSUNTO1xuICB9IC8vIFJlYWN0IHYxNi4xMiBhbmQgYWJvdmVcblxuXG4gIHJldHVybiBUWVBFX1NUQVRJQ1NbY29tcG9uZW50WyckJHR5cGVvZiddXSB8fCBSRUFDVF9TVEFUSUNTO1xufVxuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBvYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuZnVuY3Rpb24gaG9pc3ROb25SZWFjdFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50LCBzb3VyY2VDb21wb25lbnQsIGJsYWNrbGlzdCkge1xuICBpZiAodHlwZW9mIHNvdXJjZUNvbXBvbmVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAvLyBkb24ndCBob2lzdCBvdmVyIHN0cmluZyAoaHRtbCkgY29tcG9uZW50c1xuICAgIGlmIChvYmplY3RQcm90b3R5cGUpIHtcbiAgICAgIHZhciBpbmhlcml0ZWRDb21wb25lbnQgPSBnZXRQcm90b3R5cGVPZihzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgICBpZiAoaW5oZXJpdGVkQ29tcG9uZW50ICYmIGluaGVyaXRlZENvbXBvbmVudCAhPT0gb2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICAgIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgaW5oZXJpdGVkQ29tcG9uZW50LCBibGFja2xpc3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgaWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAga2V5cyA9IGtleXMuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2VDb21wb25lbnQpKTtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0U3RhdGljcyA9IGdldFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50KTtcbiAgICB2YXIgc291cmNlU3RhdGljcyA9IGdldFN0YXRpY3Moc291cmNlQ29tcG9uZW50KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmICghS05PV05fU1RBVElDU1trZXldICYmICEoYmxhY2tsaXN0ICYmIGJsYWNrbGlzdFtrZXldKSAmJiAhKHNvdXJjZVN0YXRpY3MgJiYgc291cmNlU3RhdGljc1trZXldKSAmJiAhKHRhcmdldFN0YXRpY3MgJiYgdGFyZ2V0U3RhdGljc1trZXldKSkge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2VDb21wb25lbnQsIGtleSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBBdm9pZCBmYWlsdXJlcyBmcm9tIHJlYWQtb25seSBwcm9wZXJ0aWVzXG4gICAgICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0Q29tcG9uZW50LCBrZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXRDb21wb25lbnQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaG9pc3ROb25SZWFjdFN0YXRpY3M7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVc2UgaW52YXJpYW50KCkgdG8gYXNzZXJ0IHN0YXRlIHdoaWNoIHlvdXIgcHJvZ3JhbSBhc3N1bWVzIHRvIGJlIHRydWUuXG4gKlxuICogUHJvdmlkZSBzcHJpbnRmLXN0eWxlIGZvcm1hdCAob25seSAlcyBpcyBzdXBwb3J0ZWQpIGFuZCBhcmd1bWVudHNcbiAqIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBicm9rZSBhbmQgd2hhdCB5b3Ugd2VyZVxuICogZXhwZWN0aW5nLlxuICpcbiAqIFRoZSBpbnZhcmlhbnQgbWVzc2FnZSB3aWxsIGJlIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgaW52YXJpYW50XG4gKiB3aWxsIHJlbWFpbiB0byBlbnN1cmUgbG9naWMgZG9lcyBub3QgZGlmZmVyIGluIHByb2R1Y3Rpb24uXG4gKi9cblxudmFyIGludmFyaWFudCA9IGZ1bmN0aW9uKGNvbmRpdGlvbiwgZm9ybWF0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFyaWFudCByZXF1aXJlcyBhbiBlcnJvciBtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB2YXIgZXJyb3I7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgJ01pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50ICcgK1xuICAgICAgICAnZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IFthLCBiLCBjLCBkLCBlLCBmXTtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJnc1thcmdJbmRleCsrXTsgfSlcbiAgICAgICk7XG4gICAgICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIH1cblxuICAgIGVycm9yLmZyYW1lc1RvUG9wID0gMTsgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCBpbnZhcmlhbnQncyBvd24gZnJhbWVcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbnZhcmlhbnQ7XG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG4vKipcclxuICogSXMgdGhpcyBzdHJpbmcgYWxsIHdoaXRlc3BhY2U/XHJcbiAqIFRoaXMgc29sdXRpb24ga2luZCBvZiBtYWtlcyBteSBicmFpbiBodXJ0LCBidXQgaXQncyBzaWduaWZpY2FudGx5IGZhc3RlclxyXG4gKiB0aGFuICFzdHIudHJpbSgpIG9yIGFueSBvdGhlciBzb2x1dGlvbiBJIGNvdWxkIGZpbmQuXHJcbiAqXHJcbiAqIHdoaXRlc3BhY2UgY29kZXMgZnJvbTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XaGl0ZXNwYWNlX2NoYXJhY3RlclxyXG4gKiBhbmQgdmVyaWZpZWQgd2l0aDpcclxuICpcclxuICogIGZvcih2YXIgaSA9IDA7IGkgPCA2NTUzNjsgaSsrKSB7XHJcbiAqICAgICAgdmFyIHMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpO1xyXG4gKiAgICAgIGlmKCtzPT09MCAmJiAhcy50cmltKCkpIGNvbnNvbGUubG9nKGksIHMpO1xyXG4gKiAgfVxyXG4gKlxyXG4gKiB3aGljaCBjb3VudHMgYSBjb3VwbGUgb2YgdGhlc2UgYXMgKm5vdCogd2hpdGVzcGFjZSwgYnV0IGZpbmRzIG5vdGhpbmcgZWxzZVxyXG4gKiB0aGF0ICppcyogd2hpdGVzcGFjZS4gTm90ZSB0aGF0IGNoYXJDb2RlQXQgc3RvcHMgYXQgMTYgYml0cywgYnV0IGl0IGFwcGVhcnNcclxuICogdGhhdCB0aGVyZSBhcmUgbm8gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFib3ZlIHRoaXMsIGFuZCBjb2RlIHBvaW50cyBhYm92ZVxyXG4gKiB0aGlzIGRvIG5vdCBtYXAgb250byB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzLlxyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc3RyKXtcclxuICAgIHZhciBsID0gc3RyLmxlbmd0aCxcclxuICAgICAgICBhO1xyXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGEgPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgICAgICBpZigoYSA8IDkgfHwgYSA+IDEzKSAmJiAoYSAhPT0gMzIpICYmIChhICE9PSAxMzMpICYmIChhICE9PSAxNjApICYmXHJcbiAgICAgICAgICAgIChhICE9PSA1NzYwKSAmJiAoYSAhPT0gNjE1OCkgJiYgKGEgPCA4MTkyIHx8IGEgPiA4MjA1KSAmJlxyXG4gICAgICAgICAgICAoYSAhPT0gODIzMikgJiYgKGEgIT09IDgyMzMpICYmIChhICE9PSA4MjM5KSAmJiAoYSAhPT0gODI4NykgJiZcclxuICAgICAgICAgICAgKGEgIT09IDgyODgpICYmIChhICE9PSAxMjI4OCkgJiYgKGEgIT09IDY1Mjc5KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbiIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImxheW91dEJhc2VcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wibGF5b3V0QmFzZVwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDI4KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gTGF5b3V0Q29uc3RhbnRzKCkge31cblxuLyoqXHJcbiAqIExheW91dCBRdWFsaXR5OiAwOmRyYWZ0LCAxOmRlZmF1bHQsIDI6cHJvb2ZcclxuICovXG5MYXlvdXRDb25zdGFudHMuUVVBTElUWSA9IDE7XG5cbi8qKlxyXG4gKiBEZWZhdWx0IHBhcmFtZXRlcnNcclxuICovXG5MYXlvdXRDb25zdGFudHMuREVGQVVMVF9DUkVBVEVfQkVORFNfQVNfTkVFREVEID0gZmFsc2U7XG5MYXlvdXRDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTCA9IGZhbHNlO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX09OX0xBWU9VVCA9IHRydWU7XG5MYXlvdXRDb25zdGFudHMuREVGQVVMVF9BTklNQVRJT05fRFVSSU5HX0xBWU9VVCA9IGZhbHNlO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX1BFUklPRCA9IDUwO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfVU5JRk9STV9MRUFGX05PREVfU0laRVMgPSBmYWxzZTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlY3Rpb246IEdlbmVyYWwgb3RoZXIgY29uc3RhbnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLypcclxuICogTWFyZ2lucyBvZiBhIGdyYXBoIHRvIGJlIGFwcGxpZWQgb24gYm91ZGluZyByZWN0YW5nbGUgb2YgaXRzIGNvbnRlbnRzLiBXZVxyXG4gKiBhc3N1bWUgbWFyZ2lucyBvbiBhbGwgZm91ciBzaWRlcyB0byBiZSB1bmlmb3JtLlxyXG4gKi9cbkxheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVBIX01BUkdJTiA9IDE1O1xuXG4vKlxyXG4gKiBXaGV0aGVyIHRvIGNvbnNpZGVyIGxhYmVscyBpbiBub2RlIGRpbWVuc2lvbnMgb3Igbm90XHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyA9IGZhbHNlO1xuXG4vKlxyXG4gKiBEZWZhdWx0IGRpbWVuc2lvbiBvZiBhIG5vbi1jb21wb3VuZCBub2RlLlxyXG4gKi9cbkxheW91dENvbnN0YW50cy5TSU1QTEVfTk9ERV9TSVpFID0gNDA7XG5cbi8qXHJcbiAqIERlZmF1bHQgZGltZW5zaW9uIG9mIGEgbm9uLWNvbXBvdW5kIG5vZGUuXHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLlNJTVBMRV9OT0RFX0hBTEZfU0laRSA9IExheW91dENvbnN0YW50cy5TSU1QTEVfTk9ERV9TSVpFIC8gMjtcblxuLypcclxuICogRW1wdHkgY29tcG91bmQgbm9kZSBzaXplLiBXaGVuIGEgY29tcG91bmQgbm9kZSBpcyBlbXB0eSwgaXRzIGJvdGhcclxuICogZGltZW5zaW9ucyBzaG91bGQgYmUgb2YgdGhpcyB2YWx1ZS5cclxuICovXG5MYXlvdXRDb25zdGFudHMuRU1QVFlfQ09NUE9VTkRfTk9ERV9TSVpFID0gNDA7XG5cbi8qXHJcbiAqIE1pbmltdW0gbGVuZ3RoIHRoYXQgYW4gZWRnZSBzaG91bGQgdGFrZSBkdXJpbmcgbGF5b3V0XHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLk1JTl9FREdFX0xFTkdUSCA9IDE7XG5cbi8qXHJcbiAqIFdvcmxkIGJvdW5kYXJpZXMgdGhhdCBsYXlvdXQgb3BlcmF0ZXMgb25cclxuICovXG5MYXlvdXRDb25zdGFudHMuV09STERfQk9VTkRBUlkgPSAxMDAwMDAwO1xuXG4vKlxyXG4gKiBXb3JsZCBib3VuZGFyaWVzIHRoYXQgcmFuZG9tIHBvc2l0aW9uaW5nIGNhbiBiZSBwZXJmb3JtZWQgd2l0aFxyXG4gKi9cbkxheW91dENvbnN0YW50cy5JTklUSUFMX1dPUkxEX0JPVU5EQVJZID0gTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZIC8gMTAwMDtcblxuLypcclxuICogQ29vcmRpbmF0ZXMgb2YgdGhlIHdvcmxkIGNlbnRlclxyXG4gKi9cbkxheW91dENvbnN0YW50cy5XT1JMRF9DRU5URVJfWCA9IDEyMDA7XG5MYXlvdXRDb25zdGFudHMuV09STERfQ0VOVEVSX1kgPSA5MDA7XG5cbm1vZHVsZS5leHBvcnRzID0gTGF5b3V0Q29uc3RhbnRzO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIExHcmFwaE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG52YXIgSUdlb21ldHJ5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcbnZhciBJTWF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cbmZ1bmN0aW9uIExFZGdlKHNvdXJjZSwgdGFyZ2V0LCB2RWRnZSkge1xuICBMR3JhcGhPYmplY3QuY2FsbCh0aGlzLCB2RWRnZSk7XG5cbiAgdGhpcy5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQgPSBmYWxzZTtcbiAgdGhpcy52R3JhcGhPYmplY3QgPSB2RWRnZTtcbiAgdGhpcy5iZW5kcG9pbnRzID0gW107XG4gIHRoaXMuc291cmNlID0gc291cmNlO1xuICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbn1cblxuTEVkZ2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGhPYmplY3QucHJvdG90eXBlKTtcblxuZm9yICh2YXIgcHJvcCBpbiBMR3JhcGhPYmplY3QpIHtcbiAgTEVkZ2VbcHJvcF0gPSBMR3JhcGhPYmplY3RbcHJvcF07XG59XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRTb3VyY2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnNvdXJjZTtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnRhcmdldDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5pc0ludGVyR3JhcGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmlzSW50ZXJHcmFwaDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxlbmd0aDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmlzT3ZlcmxhcGluZ1NvdXJjZUFuZFRhcmdldDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRCZW5kcG9pbnRzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5iZW5kcG9pbnRzO1xufTtcblxuTEVkZ2UucHJvdG90eXBlLmdldExjYSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubGNhO1xufTtcblxuTEVkZ2UucHJvdG90eXBlLmdldFNvdXJjZUluTGNhID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5zb3VyY2VJbkxjYTtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRUYXJnZXRJbkxjYSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudGFyZ2V0SW5MY2E7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuZ2V0T3RoZXJFbmQgPSBmdW5jdGlvbiAobm9kZSkge1xuICBpZiAodGhpcy5zb3VyY2UgPT09IG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy50YXJnZXQ7XG4gIH0gZWxzZSBpZiAodGhpcy50YXJnZXQgPT09IG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2U7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgXCJOb2RlIGlzIG5vdCBpbmNpZGVudCB3aXRoIHRoaXMgZWRnZVwiO1xuICB9XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuZ2V0T3RoZXJFbmRJbkdyYXBoID0gZnVuY3Rpb24gKG5vZGUsIGdyYXBoKSB7XG4gIHZhciBvdGhlckVuZCA9IHRoaXMuZ2V0T3RoZXJFbmQobm9kZSk7XG4gIHZhciByb290ID0gZ3JhcGguZ2V0R3JhcGhNYW5hZ2VyKCkuZ2V0Um9vdCgpO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKG90aGVyRW5kLmdldE93bmVyKCkgPT0gZ3JhcGgpIHtcbiAgICAgIHJldHVybiBvdGhlckVuZDtcbiAgICB9XG5cbiAgICBpZiAob3RoZXJFbmQuZ2V0T3duZXIoKSA9PSByb290KSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBvdGhlckVuZCA9IG90aGVyRW5kLmdldE93bmVyKCkuZ2V0UGFyZW50KCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS51cGRhdGVMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjbGlwUG9pbnRDb29yZGluYXRlcyA9IG5ldyBBcnJheSg0KTtcblxuICB0aGlzLmlzT3ZlcmxhcGluZ1NvdXJjZUFuZFRhcmdldCA9IElHZW9tZXRyeS5nZXRJbnRlcnNlY3Rpb24odGhpcy50YXJnZXQuZ2V0UmVjdCgpLCB0aGlzLnNvdXJjZS5nZXRSZWN0KCksIGNsaXBQb2ludENvb3JkaW5hdGVzKTtcblxuICBpZiAoIXRoaXMuaXNPdmVybGFwaW5nU291cmNlQW5kVGFyZ2V0KSB7XG4gICAgdGhpcy5sZW5ndGhYID0gY2xpcFBvaW50Q29vcmRpbmF0ZXNbMF0gLSBjbGlwUG9pbnRDb29yZGluYXRlc1syXTtcbiAgICB0aGlzLmxlbmd0aFkgPSBjbGlwUG9pbnRDb29yZGluYXRlc1sxXSAtIGNsaXBQb2ludENvb3JkaW5hdGVzWzNdO1xuXG4gICAgaWYgKE1hdGguYWJzKHRoaXMubGVuZ3RoWCkgPCAxLjApIHtcbiAgICAgIHRoaXMubGVuZ3RoWCA9IElNYXRoLnNpZ24odGhpcy5sZW5ndGhYKTtcbiAgICB9XG5cbiAgICBpZiAoTWF0aC5hYnModGhpcy5sZW5ndGhZKSA8IDEuMCkge1xuICAgICAgdGhpcy5sZW5ndGhZID0gSU1hdGguc2lnbih0aGlzLmxlbmd0aFkpO1xuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5zcXJ0KHRoaXMubGVuZ3RoWCAqIHRoaXMubGVuZ3RoWCArIHRoaXMubGVuZ3RoWSAqIHRoaXMubGVuZ3RoWSk7XG4gIH1cbn07XG5cbkxFZGdlLnByb3RvdHlwZS51cGRhdGVMZW5ndGhTaW1wbGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMubGVuZ3RoWCA9IHRoaXMudGFyZ2V0LmdldENlbnRlclgoKSAtIHRoaXMuc291cmNlLmdldENlbnRlclgoKTtcbiAgdGhpcy5sZW5ndGhZID0gdGhpcy50YXJnZXQuZ2V0Q2VudGVyWSgpIC0gdGhpcy5zb3VyY2UuZ2V0Q2VudGVyWSgpO1xuXG4gIGlmIChNYXRoLmFicyh0aGlzLmxlbmd0aFgpIDwgMS4wKSB7XG4gICAgdGhpcy5sZW5ndGhYID0gSU1hdGguc2lnbih0aGlzLmxlbmd0aFgpO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKHRoaXMubGVuZ3RoWSkgPCAxLjApIHtcbiAgICB0aGlzLmxlbmd0aFkgPSBJTWF0aC5zaWduKHRoaXMubGVuZ3RoWSk7XG4gIH1cblxuICB0aGlzLmxlbmd0aCA9IE1hdGguc3FydCh0aGlzLmxlbmd0aFggKiB0aGlzLmxlbmd0aFggKyB0aGlzLmxlbmd0aFkgKiB0aGlzLmxlbmd0aFkpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBMRWRnZTtcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIExHcmFwaE9iamVjdCh2R3JhcGhPYmplY3QpIHtcbiAgdGhpcy52R3JhcGhPYmplY3QgPSB2R3JhcGhPYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTEdyYXBoT2JqZWN0O1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIExHcmFwaE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG52YXIgSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xudmFyIFJlY3RhbmdsZUQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIFJhbmRvbVNlZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcbnZhciBQb2ludEQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXG5mdW5jdGlvbiBMTm9kZShnbSwgbG9jLCBzaXplLCB2Tm9kZSkge1xuICAvL0FsdGVybmF0aXZlIGNvbnN0cnVjdG9yIDEgOiBMTm9kZShMR3JhcGhNYW5hZ2VyIGdtLCBQb2ludCBsb2MsIERpbWVuc2lvbiBzaXplLCBPYmplY3Qgdk5vZGUpXG4gIGlmIChzaXplID09IG51bGwgJiYgdk5vZGUgPT0gbnVsbCkge1xuICAgIHZOb2RlID0gbG9jO1xuICB9XG5cbiAgTEdyYXBoT2JqZWN0LmNhbGwodGhpcywgdk5vZGUpO1xuXG4gIC8vQWx0ZXJuYXRpdmUgY29uc3RydWN0b3IgMiA6IExOb2RlKExheW91dCBsYXlvdXQsIE9iamVjdCB2Tm9kZSlcbiAgaWYgKGdtLmdyYXBoTWFuYWdlciAhPSBudWxsKSBnbSA9IGdtLmdyYXBoTWFuYWdlcjtcblxuICB0aGlzLmVzdGltYXRlZFNpemUgPSBJbnRlZ2VyLk1JTl9WQUxVRTtcbiAgdGhpcy5pbmNsdXNpb25UcmVlRGVwdGggPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdGhpcy52R3JhcGhPYmplY3QgPSB2Tm9kZTtcbiAgdGhpcy5lZGdlcyA9IFtdO1xuICB0aGlzLmdyYXBoTWFuYWdlciA9IGdtO1xuXG4gIGlmIChzaXplICE9IG51bGwgJiYgbG9jICE9IG51bGwpIHRoaXMucmVjdCA9IG5ldyBSZWN0YW5nbGVEKGxvYy54LCBsb2MueSwgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpO2Vsc2UgdGhpcy5yZWN0ID0gbmV3IFJlY3RhbmdsZUQoKTtcbn1cblxuTE5vZGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGhPYmplY3QucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gTEdyYXBoT2JqZWN0KSB7XG4gIExOb2RlW3Byb3BdID0gTEdyYXBoT2JqZWN0W3Byb3BdO1xufVxuXG5MTm9kZS5wcm90b3R5cGUuZ2V0RWRnZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmVkZ2VzO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldENoaWxkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5jaGlsZDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRPd25lciA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gIGlmICh0aGlzLm93bmVyICE9IG51bGwpIHtcbiAgLy8gICAgaWYgKCEodGhpcy5vd25lciA9PSBudWxsIHx8IHRoaXMub3duZXIuZ2V0Tm9kZXMoKS5pbmRleE9mKHRoaXMpID4gLTEpKSB7XG4gIC8vICAgICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIC8vICAgIH1cbiAgLy8gIH1cblxuICByZXR1cm4gdGhpcy5vd25lcjtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmVjdC53aWR0aDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5zZXRXaWR0aCA9IGZ1bmN0aW9uICh3aWR0aCkge1xuICB0aGlzLnJlY3Qud2lkdGggPSB3aWR0aDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QuaGVpZ2h0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLnNldEhlaWdodCA9IGZ1bmN0aW9uIChoZWlnaHQpIHtcbiAgdGhpcy5yZWN0LmhlaWdodCA9IGhlaWdodDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRDZW50ZXJYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0LnggKyB0aGlzLnJlY3Qud2lkdGggLyAyO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldENlbnRlclkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueSArIHRoaXMucmVjdC5oZWlnaHQgLyAyO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldENlbnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBQb2ludEQodGhpcy5yZWN0LnggKyB0aGlzLnJlY3Qud2lkdGggLyAyLCB0aGlzLnJlY3QueSArIHRoaXMucmVjdC5oZWlnaHQgLyAyKTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRMb2NhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBQb2ludEQodGhpcy5yZWN0LngsIHRoaXMucmVjdC55KTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRSZWN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldERpYWdvbmFsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMucmVjdC53aWR0aCAqIHRoaXMucmVjdC53aWR0aCArIHRoaXMucmVjdC5oZWlnaHQgKiB0aGlzLnJlY3QuaGVpZ2h0KTtcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBoYWxmIHRoZSBkaWFnb25hbCBsZW5ndGggb2YgdGhpcyBub2RlLlxuICovXG5MTm9kZS5wcm90b3R5cGUuZ2V0SGFsZlRoZURpYWdvbmFsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMucmVjdC5oZWlnaHQgKiB0aGlzLnJlY3QuaGVpZ2h0ICsgdGhpcy5yZWN0LndpZHRoICogdGhpcy5yZWN0LndpZHRoKSAvIDI7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuc2V0UmVjdCA9IGZ1bmN0aW9uICh1cHBlckxlZnQsIGRpbWVuc2lvbikge1xuICB0aGlzLnJlY3QueCA9IHVwcGVyTGVmdC54O1xuICB0aGlzLnJlY3QueSA9IHVwcGVyTGVmdC55O1xuICB0aGlzLnJlY3Qud2lkdGggPSBkaW1lbnNpb24ud2lkdGg7XG4gIHRoaXMucmVjdC5oZWlnaHQgPSBkaW1lbnNpb24uaGVpZ2h0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLnNldENlbnRlciA9IGZ1bmN0aW9uIChjeCwgY3kpIHtcbiAgdGhpcy5yZWN0LnggPSBjeCAtIHRoaXMucmVjdC53aWR0aCAvIDI7XG4gIHRoaXMucmVjdC55ID0gY3kgLSB0aGlzLnJlY3QuaGVpZ2h0IC8gMjtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5zZXRMb2NhdGlvbiA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gIHRoaXMucmVjdC54ID0geDtcbiAgdGhpcy5yZWN0LnkgPSB5O1xufTtcblxuTE5vZGUucHJvdG90eXBlLm1vdmVCeSA9IGZ1bmN0aW9uIChkeCwgZHkpIHtcbiAgdGhpcy5yZWN0LnggKz0gZHg7XG4gIHRoaXMucmVjdC55ICs9IGR5O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldEVkZ2VMaXN0VG9Ob2RlID0gZnVuY3Rpb24gKHRvKSB7XG4gIHZhciBlZGdlTGlzdCA9IFtdO1xuICB2YXIgZWRnZTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHNlbGYuZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuXG4gICAgaWYgKGVkZ2UudGFyZ2V0ID09IHRvKSB7XG4gICAgICBpZiAoZWRnZS5zb3VyY2UgIT0gc2VsZikgdGhyb3cgXCJJbmNvcnJlY3QgZWRnZSBzb3VyY2UhXCI7XG5cbiAgICAgIGVkZ2VMaXN0LnB1c2goZWRnZSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZWRnZUxpc3Q7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0RWRnZXNCZXR3ZWVuID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gIHZhciBlZGdlTGlzdCA9IFtdO1xuICB2YXIgZWRnZTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYuZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuXG4gICAgaWYgKCEoZWRnZS5zb3VyY2UgPT0gc2VsZiB8fCBlZGdlLnRhcmdldCA9PSBzZWxmKSkgdGhyb3cgXCJJbmNvcnJlY3QgZWRnZSBzb3VyY2UgYW5kL29yIHRhcmdldFwiO1xuXG4gICAgaWYgKGVkZ2UudGFyZ2V0ID09IG90aGVyIHx8IGVkZ2Uuc291cmNlID09IG90aGVyKSB7XG4gICAgICBlZGdlTGlzdC5wdXNoKGVkZ2UpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGVkZ2VMaXN0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldE5laWdoYm9yc0xpc3QgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBuZWlnaGJvcnMgPSBuZXcgU2V0KCk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcblxuICAgIGlmIChlZGdlLnNvdXJjZSA9PSBzZWxmKSB7XG4gICAgICBuZWlnaGJvcnMuYWRkKGVkZ2UudGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVkZ2UudGFyZ2V0ICE9IHNlbGYpIHtcbiAgICAgICAgdGhyb3cgXCJJbmNvcnJlY3QgaW5jaWRlbmN5IVwiO1xuICAgICAgfVxuXG4gICAgICBuZWlnaGJvcnMuYWRkKGVkZ2Uuc291cmNlKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBuZWlnaGJvcnM7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUud2l0aENoaWxkcmVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgd2l0aE5laWdoYm9yc0xpc3QgPSBuZXcgU2V0KCk7XG4gIHZhciBjaGlsZE5vZGU7XG4gIHZhciBjaGlsZHJlbjtcblxuICB3aXRoTmVpZ2hib3JzTGlzdC5hZGQodGhpcyk7XG5cbiAgaWYgKHRoaXMuY2hpbGQgIT0gbnVsbCkge1xuICAgIHZhciBub2RlcyA9IHRoaXMuY2hpbGQuZ2V0Tm9kZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZE5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIGNoaWxkcmVuID0gY2hpbGROb2RlLndpdGhDaGlsZHJlbigpO1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB3aXRoTmVpZ2hib3JzTGlzdC5hZGQobm9kZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd2l0aE5laWdoYm9yc0xpc3Q7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0Tm9PZkNoaWxkcmVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm9PZkNoaWxkcmVuID0gMDtcbiAgdmFyIGNoaWxkTm9kZTtcblxuICBpZiAodGhpcy5jaGlsZCA9PSBudWxsKSB7XG4gICAgbm9PZkNoaWxkcmVuID0gMTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLmNoaWxkLmdldE5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGROb2RlID0gbm9kZXNbaV07XG5cbiAgICAgIG5vT2ZDaGlsZHJlbiArPSBjaGlsZE5vZGUuZ2V0Tm9PZkNoaWxkcmVuKCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG5vT2ZDaGlsZHJlbiA9PSAwKSB7XG4gICAgbm9PZkNoaWxkcmVuID0gMTtcbiAgfVxuICByZXR1cm4gbm9PZkNoaWxkcmVuO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldEVzdGltYXRlZFNpemUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmVzdGltYXRlZFNpemUgPT0gSW50ZWdlci5NSU5fVkFMVUUpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuICByZXR1cm4gdGhpcy5lc3RpbWF0ZWRTaXplO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmNhbGNFc3RpbWF0ZWRTaXplID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jaGlsZCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuZXN0aW1hdGVkU2l6ZSA9ICh0aGlzLnJlY3Qud2lkdGggKyB0aGlzLnJlY3QuaGVpZ2h0KSAvIDI7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5lc3RpbWF0ZWRTaXplID0gdGhpcy5jaGlsZC5jYWxjRXN0aW1hdGVkU2l6ZSgpO1xuICAgIHRoaXMucmVjdC53aWR0aCA9IHRoaXMuZXN0aW1hdGVkU2l6ZTtcbiAgICB0aGlzLnJlY3QuaGVpZ2h0ID0gdGhpcy5lc3RpbWF0ZWRTaXplO1xuXG4gICAgcmV0dXJuIHRoaXMuZXN0aW1hdGVkU2l6ZTtcbiAgfVxufTtcblxuTE5vZGUucHJvdG90eXBlLnNjYXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByYW5kb21DZW50ZXJYO1xuICB2YXIgcmFuZG9tQ2VudGVyWTtcblxuICB2YXIgbWluWCA9IC1MYXlvdXRDb25zdGFudHMuSU5JVElBTF9XT1JMRF9CT1VOREFSWTtcbiAgdmFyIG1heFggPSBMYXlvdXRDb25zdGFudHMuSU5JVElBTF9XT1JMRF9CT1VOREFSWTtcbiAgcmFuZG9tQ2VudGVyWCA9IExheW91dENvbnN0YW50cy5XT1JMRF9DRU5URVJfWCArIFJhbmRvbVNlZWQubmV4dERvdWJsZSgpICogKG1heFggLSBtaW5YKSArIG1pblg7XG5cbiAgdmFyIG1pblkgPSAtTGF5b3V0Q29uc3RhbnRzLklOSVRJQUxfV09STERfQk9VTkRBUlk7XG4gIHZhciBtYXhZID0gTGF5b3V0Q29uc3RhbnRzLklOSVRJQUxfV09STERfQk9VTkRBUlk7XG4gIHJhbmRvbUNlbnRlclkgPSBMYXlvdXRDb25zdGFudHMuV09STERfQ0VOVEVSX1kgKyBSYW5kb21TZWVkLm5leHREb3VibGUoKSAqIChtYXhZIC0gbWluWSkgKyBtaW5ZO1xuXG4gIHRoaXMucmVjdC54ID0gcmFuZG9tQ2VudGVyWDtcbiAgdGhpcy5yZWN0LnkgPSByYW5kb21DZW50ZXJZO1xufTtcblxuTE5vZGUucHJvdG90eXBlLnVwZGF0ZUJvdW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIH1cbiAgaWYgKHRoaXMuZ2V0Q2hpbGQoKS5nZXROb2RlcygpLmxlbmd0aCAhPSAwKSB7XG4gICAgLy8gd3JhcCB0aGUgY2hpbGRyZW4gbm9kZXMgYnkgcmUtYXJyYW5naW5nIHRoZSBib3VuZGFyaWVzXG4gICAgdmFyIGNoaWxkR3JhcGggPSB0aGlzLmdldENoaWxkKCk7XG4gICAgY2hpbGRHcmFwaC51cGRhdGVCb3VuZHModHJ1ZSk7XG5cbiAgICB0aGlzLnJlY3QueCA9IGNoaWxkR3JhcGguZ2V0TGVmdCgpO1xuICAgIHRoaXMucmVjdC55ID0gY2hpbGRHcmFwaC5nZXRUb3AoKTtcblxuICAgIHRoaXMuc2V0V2lkdGgoY2hpbGRHcmFwaC5nZXRSaWdodCgpIC0gY2hpbGRHcmFwaC5nZXRMZWZ0KCkpO1xuICAgIHRoaXMuc2V0SGVpZ2h0KGNoaWxkR3JhcGguZ2V0Qm90dG9tKCkgLSBjaGlsZEdyYXBoLmdldFRvcCgpKTtcblxuICAgIC8vIFVwZGF0ZSBjb21wb3VuZCBib3VuZHMgY29uc2lkZXJpbmcgaXRzIGxhYmVsIHByb3BlcnRpZXMgICAgXG4gICAgaWYgKExheW91dENvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMpIHtcblxuICAgICAgdmFyIHdpZHRoID0gY2hpbGRHcmFwaC5nZXRSaWdodCgpIC0gY2hpbGRHcmFwaC5nZXRMZWZ0KCk7XG4gICAgICB2YXIgaGVpZ2h0ID0gY2hpbGRHcmFwaC5nZXRCb3R0b20oKSAtIGNoaWxkR3JhcGguZ2V0VG9wKCk7XG5cbiAgICAgIGlmICh0aGlzLmxhYmVsV2lkdGgpIHtcbiAgICAgICAgaWYgKHRoaXMubGFiZWxQb3NIb3Jpem9udGFsID09IFwibGVmdFwiKSB7XG4gICAgICAgICAgdGhpcy5yZWN0LnggLT0gdGhpcy5sYWJlbFdpZHRoO1xuICAgICAgICAgIHRoaXMuc2V0V2lkdGgod2lkdGggKyB0aGlzLmxhYmVsV2lkdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGFiZWxQb3NIb3Jpem9udGFsID09IFwiY2VudGVyXCIgJiYgdGhpcy5sYWJlbFdpZHRoID4gd2lkdGgpIHtcbiAgICAgICAgICB0aGlzLnJlY3QueCAtPSAodGhpcy5sYWJlbFdpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICAgICAgICB0aGlzLnNldFdpZHRoKHRoaXMubGFiZWxXaWR0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgdGhpcy5zZXRXaWR0aCh3aWR0aCArIHRoaXMubGFiZWxXaWR0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubGFiZWxIZWlnaHQpIHtcbiAgICAgICAgaWYgKHRoaXMubGFiZWxQb3NWZXJ0aWNhbCA9PSBcInRvcFwiKSB7XG4gICAgICAgICAgdGhpcy5yZWN0LnkgLT0gdGhpcy5sYWJlbEhlaWdodDtcbiAgICAgICAgICB0aGlzLnNldEhlaWdodChoZWlnaHQgKyB0aGlzLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhYmVsUG9zVmVydGljYWwgPT0gXCJjZW50ZXJcIiAmJiB0aGlzLmxhYmVsSGVpZ2h0ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgdGhpcy5yZWN0LnkgLT0gKHRoaXMubGFiZWxIZWlnaHQgLSBoZWlnaHQpIC8gMjtcbiAgICAgICAgICB0aGlzLnNldEhlaWdodCh0aGlzLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhYmVsUG9zVmVydGljYWwgPT0gXCJib3R0b21cIikge1xuICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KGhlaWdodCArIHRoaXMubGFiZWxIZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0SW5jbHVzaW9uVHJlZURlcHRoID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5pbmNsdXNpb25UcmVlRGVwdGggPT0gSW50ZWdlci5NQVhfVkFMVUUpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuICByZXR1cm4gdGhpcy5pbmNsdXNpb25UcmVlRGVwdGg7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHRyYW5zKSB7XG4gIHZhciBsZWZ0ID0gdGhpcy5yZWN0Lng7XG5cbiAgaWYgKGxlZnQgPiBMYXlvdXRDb25zdGFudHMuV09STERfQk9VTkRBUlkpIHtcbiAgICBsZWZ0ID0gTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZO1xuICB9IGVsc2UgaWYgKGxlZnQgPCAtTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZKSB7XG4gICAgbGVmdCA9IC1MYXlvdXRDb25zdGFudHMuV09STERfQk9VTkRBUlk7XG4gIH1cblxuICB2YXIgdG9wID0gdGhpcy5yZWN0Lnk7XG5cbiAgaWYgKHRvcCA+IExheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWSkge1xuICAgIHRvcCA9IExheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWTtcbiAgfSBlbHNlIGlmICh0b3AgPCAtTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZKSB7XG4gICAgdG9wID0gLUxheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWTtcbiAgfVxuXG4gIHZhciBsZWZ0VG9wID0gbmV3IFBvaW50RChsZWZ0LCB0b3ApO1xuICB2YXIgdkxlZnRUb3AgPSB0cmFucy5pbnZlcnNlVHJhbnNmb3JtUG9pbnQobGVmdFRvcCk7XG5cbiAgdGhpcy5zZXRMb2NhdGlvbih2TGVmdFRvcC54LCB2TGVmdFRvcC55KTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRMZWZ0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0Lng7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0UmlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueCArIHRoaXMucmVjdC53aWR0aDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRUb3AgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRCb3R0b20gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueSArIHRoaXMucmVjdC5oZWlnaHQ7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0UGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5vd25lciA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdGhpcy5vd25lci5nZXRQYXJlbnQoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTE5vZGU7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuZnVuY3Rpb24gRkRMYXlvdXRDb25zdGFudHMoKSB7fVxuXG4vL0ZETGF5b3V0Q29uc3RhbnRzIGluaGVyaXRzIHN0YXRpYyBwcm9wcyBpbiBMYXlvdXRDb25zdGFudHNcbmZvciAodmFyIHByb3AgaW4gTGF5b3V0Q29uc3RhbnRzKSB7XG4gIEZETGF5b3V0Q29uc3RhbnRzW3Byb3BdID0gTGF5b3V0Q29uc3RhbnRzW3Byb3BdO1xufVxuXG5GRExheW91dENvbnN0YW50cy5NQVhfSVRFUkFUSU9OUyA9IDI1MDA7XG5cbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSA1MDtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfU1BSSU5HX1NUUkVOR1RIID0gMC40NTtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfUkVQVUxTSU9OX1NUUkVOR1RIID0gNDUwMC4wO1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1NUUkVOR1RIID0gMC40O1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1NUUkVOR1RIID0gMS4wO1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUiA9IDMuODtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9SQU5HRV9GQUNUT1IgPSAxLjU7XG5GRExheW91dENvbnN0YW50cy5ERUZBVUxUX1VTRV9TTUFSVF9JREVBTF9FREdFX0xFTkdUSF9DQUxDVUxBVElPTiA9IHRydWU7XG5GRExheW91dENvbnN0YW50cy5ERUZBVUxUX1VTRV9TTUFSVF9SRVBVTFNJT05fUkFOR0VfQ0FMQ1VMQVRJT04gPSB0cnVlO1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCA9IDAuMztcbkZETGF5b3V0Q29uc3RhbnRzLkNPT0xJTkdfQURBUFRBVElPTl9GQUNUT1IgPSAwLjMzO1xuRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9MT1dFUl9OT0RFX0xJTUlUID0gMTAwMDtcbkZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fVVBQRVJfTk9ERV9MSU1JVCA9IDUwMDA7XG5GRExheW91dENvbnN0YW50cy5NQVhfTk9ERV9ESVNQTEFDRU1FTlRfSU5DUkVNRU5UQUwgPSAxMDAuMDtcbkZETGF5b3V0Q29uc3RhbnRzLk1BWF9OT0RFX0RJU1BMQUNFTUVOVCA9IEZETGF5b3V0Q29uc3RhbnRzLk1BWF9OT0RFX0RJU1BMQUNFTUVOVF9JTkNSRU1FTlRBTCAqIDM7XG5GRExheW91dENvbnN0YW50cy5NSU5fUkVQVUxTSU9OX0RJU1QgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC8gMTAuMDtcbkZETGF5b3V0Q29uc3RhbnRzLkNPTlZFUkdFTkNFX0NIRUNLX1BFUklPRCA9IDEwMDtcbkZETGF5b3V0Q29uc3RhbnRzLlBFUl9MRVZFTF9JREVBTF9FREdFX0xFTkdUSF9GQUNUT1IgPSAwLjE7XG5GRExheW91dENvbnN0YW50cy5NSU5fRURHRV9MRU5HVEggPSAxO1xuRkRMYXlvdXRDb25zdGFudHMuR1JJRF9DQUxDVUxBVElPTl9DSEVDS19QRVJJT0QgPSAxMDtcblxubW9kdWxlLmV4cG9ydHMgPSBGRExheW91dENvbnN0YW50cztcblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIFBvaW50RCh4LCB5KSB7XG4gIGlmICh4ID09IG51bGwgJiYgeSA9PSBudWxsKSB7XG4gICAgdGhpcy54ID0gMDtcbiAgICB0aGlzLnkgPSAwO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgfVxufVxuXG5Qb2ludEQucHJvdG90eXBlLmdldFggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLng7XG59O1xuXG5Qb2ludEQucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnk7XG59O1xuXG5Qb2ludEQucHJvdG90eXBlLnNldFggPSBmdW5jdGlvbiAoeCkge1xuICB0aGlzLnggPSB4O1xufTtcblxuUG9pbnRELnByb3RvdHlwZS5zZXRZID0gZnVuY3Rpb24gKHkpIHtcbiAgdGhpcy55ID0geTtcbn07XG5cblBvaW50RC5wcm90b3R5cGUuZ2V0RGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChwdCkge1xuICByZXR1cm4gbmV3IERpbWVuc2lvbkQodGhpcy54IC0gcHQueCwgdGhpcy55IC0gcHQueSk7XG59O1xuXG5Qb2ludEQucHJvdG90eXBlLmdldENvcHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgUG9pbnREKHRoaXMueCwgdGhpcy55KTtcbn07XG5cblBvaW50RC5wcm90b3R5cGUudHJhbnNsYXRlID0gZnVuY3Rpb24gKGRpbSkge1xuICB0aGlzLnggKz0gZGltLndpZHRoO1xuICB0aGlzLnkgKz0gZGltLmhlaWdodDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvaW50RDtcblxuLyoqKi8gfSksXG4vKiA2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMR3JhcGhPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xudmFyIEludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIExHcmFwaE1hbmFnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xudmFyIExOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbnZhciBMRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG52YXIgUmVjdGFuZ2xlRCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xudmFyIFBvaW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG52YXIgTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXG5mdW5jdGlvbiBMR3JhcGgocGFyZW50LCBvYmoyLCB2R3JhcGgpIHtcbiAgTEdyYXBoT2JqZWN0LmNhbGwodGhpcywgdkdyYXBoKTtcbiAgdGhpcy5lc3RpbWF0ZWRTaXplID0gSW50ZWdlci5NSU5fVkFMVUU7XG4gIHRoaXMubWFyZ2luID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBUEhfTUFSR0lOO1xuICB0aGlzLmVkZ2VzID0gW107XG4gIHRoaXMubm9kZXMgPSBbXTtcbiAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICB0aGlzLnBhcmVudCA9IHBhcmVudDtcblxuICBpZiAob2JqMiAhPSBudWxsICYmIG9iajIgaW5zdGFuY2VvZiBMR3JhcGhNYW5hZ2VyKSB7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIgPSBvYmoyO1xuICB9IGVsc2UgaWYgKG9iajIgIT0gbnVsbCAmJiBvYmoyIGluc3RhbmNlb2YgTGF5b3V0KSB7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIgPSBvYmoyLmdyYXBoTWFuYWdlcjtcbiAgfVxufVxuXG5MR3JhcGgucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGhPYmplY3QucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gTEdyYXBoT2JqZWN0KSB7XG4gIExHcmFwaFtwcm9wXSA9IExHcmFwaE9iamVjdFtwcm9wXTtcbn1cblxuTEdyYXBoLnByb3RvdHlwZS5nZXROb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZXM7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmdldEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5lZGdlcztcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0R3JhcGhNYW5hZ2VyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ncmFwaE1hbmFnZXI7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmdldFBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucGFyZW50O1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5nZXRMZWZ0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sZWZ0O1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5nZXRSaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmlnaHQ7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmdldFRvcCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudG9wO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5nZXRCb3R0b20gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmJvdHRvbTtcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuaXNDb25uZWN0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAob2JqMSwgc291cmNlTm9kZSwgdGFyZ2V0Tm9kZSkge1xuICBpZiAoc291cmNlTm9kZSA9PSBudWxsICYmIHRhcmdldE5vZGUgPT0gbnVsbCkge1xuICAgIHZhciBuZXdOb2RlID0gb2JqMTtcbiAgICBpZiAodGhpcy5ncmFwaE1hbmFnZXIgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJHcmFwaCBoYXMgbm8gZ3JhcGggbWdyIVwiO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXROb2RlcygpLmluZGV4T2YobmV3Tm9kZSkgPiAtMSkge1xuICAgICAgdGhyb3cgXCJOb2RlIGFscmVhZHkgaW4gZ3JhcGghXCI7XG4gICAgfVxuICAgIG5ld05vZGUub3duZXIgPSB0aGlzO1xuICAgIHRoaXMuZ2V0Tm9kZXMoKS5wdXNoKG5ld05vZGUpO1xuXG4gICAgcmV0dXJuIG5ld05vZGU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5ld0VkZ2UgPSBvYmoxO1xuICAgIGlmICghKHRoaXMuZ2V0Tm9kZXMoKS5pbmRleE9mKHNvdXJjZU5vZGUpID4gLTEgJiYgdGhpcy5nZXROb2RlcygpLmluZGV4T2YodGFyZ2V0Tm9kZSkgPiAtMSkpIHtcbiAgICAgIHRocm93IFwiU291cmNlIG9yIHRhcmdldCBub3QgaW4gZ3JhcGghXCI7XG4gICAgfVxuXG4gICAgaWYgKCEoc291cmNlTm9kZS5vd25lciA9PSB0YXJnZXROb2RlLm93bmVyICYmIHNvdXJjZU5vZGUub3duZXIgPT0gdGhpcykpIHtcbiAgICAgIHRocm93IFwiQm90aCBvd25lcnMgbXVzdCBiZSB0aGlzIGdyYXBoIVwiO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2VOb2RlLm93bmVyICE9IHRhcmdldE5vZGUub3duZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHNldCBzb3VyY2UgYW5kIHRhcmdldFxuICAgIG5ld0VkZ2Uuc291cmNlID0gc291cmNlTm9kZTtcbiAgICBuZXdFZGdlLnRhcmdldCA9IHRhcmdldE5vZGU7XG5cbiAgICAvLyBzZXQgYXMgaW50cmEtZ3JhcGggZWRnZVxuICAgIG5ld0VkZ2UuaXNJbnRlckdyYXBoID0gZmFsc2U7XG5cbiAgICAvLyBhZGQgdG8gZ3JhcGggZWRnZSBsaXN0XG4gICAgdGhpcy5nZXRFZGdlcygpLnB1c2gobmV3RWRnZSk7XG5cbiAgICAvLyBhZGQgdG8gaW5jaWRlbmN5IGxpc3RzXG4gICAgc291cmNlTm9kZS5lZGdlcy5wdXNoKG5ld0VkZ2UpO1xuXG4gICAgaWYgKHRhcmdldE5vZGUgIT0gc291cmNlTm9kZSkge1xuICAgICAgdGFyZ2V0Tm9kZS5lZGdlcy5wdXNoKG5ld0VkZ2UpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdFZGdlO1xuICB9XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIG5vZGUgPSBvYmo7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBMTm9kZSkge1xuICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgIHRocm93IFwiTm9kZSBpcyBudWxsIVwiO1xuICAgIH1cbiAgICBpZiAoIShub2RlLm93bmVyICE9IG51bGwgJiYgbm9kZS5vd25lciA9PSB0aGlzKSkge1xuICAgICAgdGhyb3cgXCJPd25lciBncmFwaCBpcyBpbnZhbGlkIVwiO1xuICAgIH1cbiAgICBpZiAodGhpcy5ncmFwaE1hbmFnZXIgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJPd25lciBncmFwaCBtYW5hZ2VyIGlzIGludmFsaWQhXCI7XG4gICAgfVxuICAgIC8vIHJlbW92ZSBpbmNpZGVudCBlZGdlcyBmaXJzdCAobWFrZSBhIGNvcHkgdG8gZG8gaXQgc2FmZWx5KVxuICAgIHZhciBlZGdlc1RvQmVSZW1vdmVkID0gbm9kZS5lZGdlcy5zbGljZSgpO1xuICAgIHZhciBlZGdlO1xuICAgIHZhciBzID0gZWRnZXNUb0JlUmVtb3ZlZC5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgIGVkZ2UgPSBlZGdlc1RvQmVSZW1vdmVkW2ldO1xuXG4gICAgICBpZiAoZWRnZS5pc0ludGVyR3JhcGgpIHtcbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIucmVtb3ZlKGVkZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWRnZS5zb3VyY2Uub3duZXIucmVtb3ZlKGVkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG5vdyB0aGUgbm9kZSBpdHNlbGZcbiAgICB2YXIgaW5kZXggPSB0aGlzLm5vZGVzLmluZGV4T2Yobm9kZSk7XG4gICAgaWYgKGluZGV4ID09IC0xKSB7XG4gICAgICB0aHJvdyBcIk5vZGUgbm90IGluIG93bmVyIG5vZGUgbGlzdCFcIjtcbiAgICB9XG5cbiAgICB0aGlzLm5vZGVzLnNwbGljZShpbmRleCwgMSk7XG4gIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTEVkZ2UpIHtcbiAgICB2YXIgZWRnZSA9IG9iajtcbiAgICBpZiAoZWRnZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIkVkZ2UgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKCEoZWRnZS5zb3VyY2UgIT0gbnVsbCAmJiBlZGdlLnRhcmdldCAhPSBudWxsKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBpcyBudWxsIVwiO1xuICAgIH1cbiAgICBpZiAoIShlZGdlLnNvdXJjZS5vd25lciAhPSBudWxsICYmIGVkZ2UudGFyZ2V0Lm93bmVyICE9IG51bGwgJiYgZWRnZS5zb3VyY2Uub3duZXIgPT0gdGhpcyAmJiBlZGdlLnRhcmdldC5vd25lciA9PSB0aGlzKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBvd25lciBpcyBpbnZhbGlkIVwiO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VJbmRleCA9IGVkZ2Uuc291cmNlLmVkZ2VzLmluZGV4T2YoZWRnZSk7XG4gICAgdmFyIHRhcmdldEluZGV4ID0gZWRnZS50YXJnZXQuZWRnZXMuaW5kZXhPZihlZGdlKTtcbiAgICBpZiAoIShzb3VyY2VJbmRleCA+IC0xICYmIHRhcmdldEluZGV4ID4gLTEpKSB7XG4gICAgICB0aHJvdyBcIlNvdXJjZSBhbmQvb3IgdGFyZ2V0IGRvZXNuJ3Qga25vdyB0aGlzIGVkZ2UhXCI7XG4gICAgfVxuXG4gICAgZWRnZS5zb3VyY2UuZWRnZXMuc3BsaWNlKHNvdXJjZUluZGV4LCAxKTtcblxuICAgIGlmIChlZGdlLnRhcmdldCAhPSBlZGdlLnNvdXJjZSkge1xuICAgICAgZWRnZS50YXJnZXQuZWRnZXMuc3BsaWNlKHRhcmdldEluZGV4LCAxKTtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSBlZGdlLnNvdXJjZS5vd25lci5nZXRFZGdlcygpLmluZGV4T2YoZWRnZSk7XG4gICAgaWYgKGluZGV4ID09IC0xKSB7XG4gICAgICB0aHJvdyBcIk5vdCBpbiBvd25lcidzIGVkZ2UgbGlzdCFcIjtcbiAgICB9XG5cbiAgICBlZGdlLnNvdXJjZS5vd25lci5nZXRFZGdlcygpLnNwbGljZShpbmRleCwgMSk7XG4gIH1cbn07XG5cbkxHcmFwaC5wcm90b3R5cGUudXBkYXRlTGVmdFRvcCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRvcCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgbGVmdCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgbm9kZVRvcDtcbiAgdmFyIG5vZGVMZWZ0O1xuICB2YXIgbWFyZ2luO1xuXG4gIHZhciBub2RlcyA9IHRoaXMuZ2V0Tm9kZXMoKTtcbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICB2YXIgbE5vZGUgPSBub2Rlc1tpXTtcbiAgICBub2RlVG9wID0gbE5vZGUuZ2V0VG9wKCk7XG4gICAgbm9kZUxlZnQgPSBsTm9kZS5nZXRMZWZ0KCk7XG5cbiAgICBpZiAodG9wID4gbm9kZVRvcCkge1xuICAgICAgdG9wID0gbm9kZVRvcDtcbiAgICB9XG5cbiAgICBpZiAobGVmdCA+IG5vZGVMZWZ0KSB7XG4gICAgICBsZWZ0ID0gbm9kZUxlZnQ7XG4gICAgfVxuICB9XG5cbiAgLy8gRG8gd2UgaGF2ZSBhbnkgbm9kZXMgaW4gdGhpcyBncmFwaD9cbiAgaWYgKHRvcCA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKG5vZGVzWzBdLmdldFBhcmVudCgpLnBhZGRpbmdMZWZ0ICE9IHVuZGVmaW5lZCkge1xuICAgIG1hcmdpbiA9IG5vZGVzWzBdLmdldFBhcmVudCgpLnBhZGRpbmdMZWZ0O1xuICB9IGVsc2Uge1xuICAgIG1hcmdpbiA9IHRoaXMubWFyZ2luO1xuICB9XG5cbiAgdGhpcy5sZWZ0ID0gbGVmdCAtIG1hcmdpbjtcbiAgdGhpcy50b3AgPSB0b3AgLSBtYXJnaW47XG5cbiAgLy8gQXBwbHkgdGhlIG1hcmdpbnMgYW5kIHJldHVybiB0aGUgcmVzdWx0XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcy5sZWZ0LCB0aGlzLnRvcCk7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLnVwZGF0ZUJvdW5kcyA9IGZ1bmN0aW9uIChyZWN1cnNpdmUpIHtcbiAgLy8gY2FsY3VsYXRlIGJvdW5kc1xuICB2YXIgbGVmdCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgcmlnaHQgPSAtSW50ZWdlci5NQVhfVkFMVUU7XG4gIHZhciB0b3AgPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIGJvdHRvbSA9IC1JbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIG5vZGVMZWZ0O1xuICB2YXIgbm9kZVJpZ2h0O1xuICB2YXIgbm9kZVRvcDtcbiAgdmFyIG5vZGVCb3R0b207XG4gIHZhciBtYXJnaW47XG5cbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcztcbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIGxOb2RlID0gbm9kZXNbaV07XG5cbiAgICBpZiAocmVjdXJzaXZlICYmIGxOb2RlLmNoaWxkICE9IG51bGwpIHtcbiAgICAgIGxOb2RlLnVwZGF0ZUJvdW5kcygpO1xuICAgIH1cbiAgICBub2RlTGVmdCA9IGxOb2RlLmdldExlZnQoKTtcbiAgICBub2RlUmlnaHQgPSBsTm9kZS5nZXRSaWdodCgpO1xuICAgIG5vZGVUb3AgPSBsTm9kZS5nZXRUb3AoKTtcbiAgICBub2RlQm90dG9tID0gbE5vZGUuZ2V0Qm90dG9tKCk7XG5cbiAgICBpZiAobGVmdCA+IG5vZGVMZWZ0KSB7XG4gICAgICBsZWZ0ID0gbm9kZUxlZnQ7XG4gICAgfVxuXG4gICAgaWYgKHJpZ2h0IDwgbm9kZVJpZ2h0KSB7XG4gICAgICByaWdodCA9IG5vZGVSaWdodDtcbiAgICB9XG5cbiAgICBpZiAodG9wID4gbm9kZVRvcCkge1xuICAgICAgdG9wID0gbm9kZVRvcDtcbiAgICB9XG5cbiAgICBpZiAoYm90dG9tIDwgbm9kZUJvdHRvbSkge1xuICAgICAgYm90dG9tID0gbm9kZUJvdHRvbTtcbiAgICB9XG4gIH1cblxuICB2YXIgYm91bmRpbmdSZWN0ID0gbmV3IFJlY3RhbmdsZUQobGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7XG4gIGlmIChsZWZ0ID09IEludGVnZXIuTUFYX1ZBTFVFKSB7XG4gICAgdGhpcy5sZWZ0ID0gdGhpcy5wYXJlbnQuZ2V0TGVmdCgpO1xuICAgIHRoaXMucmlnaHQgPSB0aGlzLnBhcmVudC5nZXRSaWdodCgpO1xuICAgIHRoaXMudG9wID0gdGhpcy5wYXJlbnQuZ2V0VG9wKCk7XG4gICAgdGhpcy5ib3R0b20gPSB0aGlzLnBhcmVudC5nZXRCb3R0b20oKTtcbiAgfVxuXG4gIGlmIChub2Rlc1swXS5nZXRQYXJlbnQoKS5wYWRkaW5nTGVmdCAhPSB1bmRlZmluZWQpIHtcbiAgICBtYXJnaW4gPSBub2Rlc1swXS5nZXRQYXJlbnQoKS5wYWRkaW5nTGVmdDtcbiAgfSBlbHNlIHtcbiAgICBtYXJnaW4gPSB0aGlzLm1hcmdpbjtcbiAgfVxuXG4gIHRoaXMubGVmdCA9IGJvdW5kaW5nUmVjdC54IC0gbWFyZ2luO1xuICB0aGlzLnJpZ2h0ID0gYm91bmRpbmdSZWN0LnggKyBib3VuZGluZ1JlY3Qud2lkdGggKyBtYXJnaW47XG4gIHRoaXMudG9wID0gYm91bmRpbmdSZWN0LnkgLSBtYXJnaW47XG4gIHRoaXMuYm90dG9tID0gYm91bmRpbmdSZWN0LnkgKyBib3VuZGluZ1JlY3QuaGVpZ2h0ICsgbWFyZ2luO1xufTtcblxuTEdyYXBoLmNhbGN1bGF0ZUJvdW5kcyA9IGZ1bmN0aW9uIChub2Rlcykge1xuICB2YXIgbGVmdCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgcmlnaHQgPSAtSW50ZWdlci5NQVhfVkFMVUU7XG4gIHZhciB0b3AgPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIGJvdHRvbSA9IC1JbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIG5vZGVMZWZ0O1xuICB2YXIgbm9kZVJpZ2h0O1xuICB2YXIgbm9kZVRvcDtcbiAgdmFyIG5vZGVCb3R0b207XG5cbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICB2YXIgbE5vZGUgPSBub2Rlc1tpXTtcbiAgICBub2RlTGVmdCA9IGxOb2RlLmdldExlZnQoKTtcbiAgICBub2RlUmlnaHQgPSBsTm9kZS5nZXRSaWdodCgpO1xuICAgIG5vZGVUb3AgPSBsTm9kZS5nZXRUb3AoKTtcbiAgICBub2RlQm90dG9tID0gbE5vZGUuZ2V0Qm90dG9tKCk7XG5cbiAgICBpZiAobGVmdCA+IG5vZGVMZWZ0KSB7XG4gICAgICBsZWZ0ID0gbm9kZUxlZnQ7XG4gICAgfVxuXG4gICAgaWYgKHJpZ2h0IDwgbm9kZVJpZ2h0KSB7XG4gICAgICByaWdodCA9IG5vZGVSaWdodDtcbiAgICB9XG5cbiAgICBpZiAodG9wID4gbm9kZVRvcCkge1xuICAgICAgdG9wID0gbm9kZVRvcDtcbiAgICB9XG5cbiAgICBpZiAoYm90dG9tIDwgbm9kZUJvdHRvbSkge1xuICAgICAgYm90dG9tID0gbm9kZUJvdHRvbTtcbiAgICB9XG4gIH1cblxuICB2YXIgYm91bmRpbmdSZWN0ID0gbmV3IFJlY3RhbmdsZUQobGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7XG5cbiAgcmV0dXJuIGJvdW5kaW5nUmVjdDtcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0SW5jbHVzaW9uVHJlZURlcHRoID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcyA9PSB0aGlzLmdyYXBoTWFuYWdlci5nZXRSb290KCkpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0SW5jbHVzaW9uVHJlZURlcHRoKCk7XG4gIH1cbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0RXN0aW1hdGVkU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuZXN0aW1hdGVkU2l6ZSA9PSBJbnRlZ2VyLk1JTl9WQUxVRSkge1xuICAgIHRocm93IFwiYXNzZXJ0IGZhaWxlZFwiO1xuICB9XG4gIHJldHVybiB0aGlzLmVzdGltYXRlZFNpemU7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmNhbGNFc3RpbWF0ZWRTaXplID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2l6ZSA9IDA7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXM7XG4gIHZhciBzID0gbm9kZXMubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIGxOb2RlID0gbm9kZXNbaV07XG4gICAgc2l6ZSArPSBsTm9kZS5jYWxjRXN0aW1hdGVkU2l6ZSgpO1xuICB9XG5cbiAgaWYgKHNpemUgPT0gMCkge1xuICAgIHRoaXMuZXN0aW1hdGVkU2l6ZSA9IExheW91dENvbnN0YW50cy5FTVBUWV9DT01QT1VORF9OT0RFX1NJWkU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5lc3RpbWF0ZWRTaXplID0gc2l6ZSAvIE1hdGguc3FydCh0aGlzLm5vZGVzLmxlbmd0aCk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lc3RpbWF0ZWRTaXplO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS51cGRhdGVDb25uZWN0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKHRoaXMubm9kZXMubGVuZ3RoID09IDApIHtcbiAgICB0aGlzLmlzQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpO1xuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIGN1cnJlbnROb2RlID0gdGhpcy5ub2Rlc1swXTtcbiAgdmFyIG5laWdoYm9yRWRnZXM7XG4gIHZhciBjdXJyZW50TmVpZ2hib3I7XG4gIHZhciBjaGlsZHJlbk9mTm9kZSA9IGN1cnJlbnROb2RlLndpdGhDaGlsZHJlbigpO1xuICBjaGlsZHJlbk9mTm9kZS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcXVldWUucHVzaChub2RlKTtcbiAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgfSk7XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPT0gMCkge1xuICAgIGN1cnJlbnROb2RlID0gcXVldWUuc2hpZnQoKTtcblxuICAgIC8vIFRyYXZlcnNlIGFsbCBuZWlnaGJvcnMgb2YgdGhpcyBub2RlXG4gICAgbmVpZ2hib3JFZGdlcyA9IGN1cnJlbnROb2RlLmdldEVkZ2VzKCk7XG4gICAgdmFyIHNpemUgPSBuZWlnaGJvckVkZ2VzLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgdmFyIG5laWdoYm9yRWRnZSA9IG5laWdoYm9yRWRnZXNbaV07XG4gICAgICBjdXJyZW50TmVpZ2hib3IgPSBuZWlnaGJvckVkZ2UuZ2V0T3RoZXJFbmRJbkdyYXBoKGN1cnJlbnROb2RlLCB0aGlzKTtcblxuICAgICAgLy8gQWRkIHVudmlzaXRlZCBuZWlnaGJvcnMgdG8gdGhlIGxpc3QgdG8gdmlzaXRcbiAgICAgIGlmIChjdXJyZW50TmVpZ2hib3IgIT0gbnVsbCAmJiAhdmlzaXRlZC5oYXMoY3VycmVudE5laWdoYm9yKSkge1xuICAgICAgICB2YXIgY2hpbGRyZW5PZk5laWdoYm9yID0gY3VycmVudE5laWdoYm9yLndpdGhDaGlsZHJlbigpO1xuXG4gICAgICAgIGNoaWxkcmVuT2ZOZWlnaGJvci5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcXVldWUucHVzaChub2RlKTtcbiAgICAgICAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuXG4gIGlmICh2aXNpdGVkLnNpemUgPj0gdGhpcy5ub2Rlcy5sZW5ndGgpIHtcbiAgICB2YXIgbm9PZlZpc2l0ZWRJblRoaXNHcmFwaCA9IDA7XG5cbiAgICB2aXNpdGVkLmZvckVhY2goZnVuY3Rpb24gKHZpc2l0ZWROb2RlKSB7XG4gICAgICBpZiAodmlzaXRlZE5vZGUub3duZXIgPT0gc2VsZikge1xuICAgICAgICBub09mVmlzaXRlZEluVGhpc0dyYXBoKys7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAobm9PZlZpc2l0ZWRJblRoaXNHcmFwaCA9PSB0aGlzLm5vZGVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IExHcmFwaDtcblxuLyoqKi8gfSksXG4vKiA3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMR3JhcGg7XG52YXIgTEVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXG5mdW5jdGlvbiBMR3JhcGhNYW5hZ2VyKGxheW91dCkge1xuICBMR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOyAvLyBJdCBtYXkgYmUgYmV0dGVyIHRvIGluaXRpbGl6ZSB0aGlzIG91dCBvZiB0aGlzIGZ1bmN0aW9uIGJ1dCBpdCBnaXZlcyBhbiBlcnJvciAoUmlnaHQtaGFuZCBzaWRlIG9mICdpbnN0YW5jZW9mJyBpcyBub3QgY2FsbGFibGUpIG5vdy5cbiAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG5cbiAgdGhpcy5ncmFwaHMgPSBbXTtcbiAgdGhpcy5lZGdlcyA9IFtdO1xufVxuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5hZGRSb290ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbmdyYXBoID0gdGhpcy5sYXlvdXQubmV3R3JhcGgoKTtcbiAgdmFyIG5ub2RlID0gdGhpcy5sYXlvdXQubmV3Tm9kZShudWxsKTtcbiAgdmFyIHJvb3QgPSB0aGlzLmFkZChuZ3JhcGgsIG5ub2RlKTtcbiAgdGhpcy5zZXRSb290R3JhcGgocm9vdCk7XG4gIHJldHVybiB0aGlzLnJvb3RHcmFwaDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChuZXdHcmFwaCwgcGFyZW50Tm9kZSwgbmV3RWRnZSwgc291cmNlTm9kZSwgdGFyZ2V0Tm9kZSkge1xuICAvL3RoZXJlIGFyZSBqdXN0IDIgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRoZW4gaXQgYWRkcyBhbiBMR3JhcGggZWxzZSBpdCBhZGRzIGFuIExFZGdlXG4gIGlmIChuZXdFZGdlID09IG51bGwgJiYgc291cmNlTm9kZSA9PSBudWxsICYmIHRhcmdldE5vZGUgPT0gbnVsbCkge1xuICAgIGlmIChuZXdHcmFwaCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIkdyYXBoIGlzIG51bGwhXCI7XG4gICAgfVxuICAgIGlmIChwYXJlbnROb2RlID09IG51bGwpIHtcbiAgICAgIHRocm93IFwiUGFyZW50IG5vZGUgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JhcGhzLmluZGV4T2YobmV3R3JhcGgpID4gLTEpIHtcbiAgICAgIHRocm93IFwiR3JhcGggYWxyZWFkeSBpbiB0aGlzIGdyYXBoIG1nciFcIjtcbiAgICB9XG5cbiAgICB0aGlzLmdyYXBocy5wdXNoKG5ld0dyYXBoKTtcblxuICAgIGlmIChuZXdHcmFwaC5wYXJlbnQgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJBbHJlYWR5IGhhcyBhIHBhcmVudCFcIjtcbiAgICB9XG4gICAgaWYgKHBhcmVudE5vZGUuY2hpbGQgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJBbHJlYWR5IGhhcyBhIGNoaWxkIVwiO1xuICAgIH1cblxuICAgIG5ld0dyYXBoLnBhcmVudCA9IHBhcmVudE5vZGU7XG4gICAgcGFyZW50Tm9kZS5jaGlsZCA9IG5ld0dyYXBoO1xuXG4gICAgcmV0dXJuIG5ld0dyYXBoO1xuICB9IGVsc2Uge1xuICAgIC8vY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgcGFyYW1ldGVyc1xuICAgIHRhcmdldE5vZGUgPSBuZXdFZGdlO1xuICAgIHNvdXJjZU5vZGUgPSBwYXJlbnROb2RlO1xuICAgIG5ld0VkZ2UgPSBuZXdHcmFwaDtcbiAgICB2YXIgc291cmNlR3JhcGggPSBzb3VyY2VOb2RlLmdldE93bmVyKCk7XG4gICAgdmFyIHRhcmdldEdyYXBoID0gdGFyZ2V0Tm9kZS5nZXRPd25lcigpO1xuXG4gICAgaWYgKCEoc291cmNlR3JhcGggIT0gbnVsbCAmJiBzb3VyY2VHcmFwaC5nZXRHcmFwaE1hbmFnZXIoKSA9PSB0aGlzKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2Ugbm90IGluIHRoaXMgZ3JhcGggbWdyIVwiO1xuICAgIH1cbiAgICBpZiAoISh0YXJnZXRHcmFwaCAhPSBudWxsICYmIHRhcmdldEdyYXBoLmdldEdyYXBoTWFuYWdlcigpID09IHRoaXMpKSB7XG4gICAgICB0aHJvdyBcIlRhcmdldCBub3QgaW4gdGhpcyBncmFwaCBtZ3IhXCI7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZUdyYXBoID09IHRhcmdldEdyYXBoKSB7XG4gICAgICBuZXdFZGdlLmlzSW50ZXJHcmFwaCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHNvdXJjZUdyYXBoLmFkZChuZXdFZGdlLCBzb3VyY2VOb2RlLCB0YXJnZXROb2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RWRnZS5pc0ludGVyR3JhcGggPSB0cnVlO1xuXG4gICAgICAvLyBzZXQgc291cmNlIGFuZCB0YXJnZXRcbiAgICAgIG5ld0VkZ2Uuc291cmNlID0gc291cmNlTm9kZTtcbiAgICAgIG5ld0VkZ2UudGFyZ2V0ID0gdGFyZ2V0Tm9kZTtcblxuICAgICAgLy8gYWRkIGVkZ2UgdG8gaW50ZXItZ3JhcGggZWRnZSBsaXN0XG4gICAgICBpZiAodGhpcy5lZGdlcy5pbmRleE9mKG5ld0VkZ2UpID4gLTEpIHtcbiAgICAgICAgdGhyb3cgXCJFZGdlIGFscmVhZHkgaW4gaW50ZXItZ3JhcGggZWRnZSBsaXN0IVwiO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVkZ2VzLnB1c2gobmV3RWRnZSk7XG5cbiAgICAgIC8vIGFkZCBlZGdlIHRvIHNvdXJjZSBhbmQgdGFyZ2V0IGluY2lkZW5jeSBsaXN0c1xuICAgICAgaWYgKCEobmV3RWRnZS5zb3VyY2UgIT0gbnVsbCAmJiBuZXdFZGdlLnRhcmdldCAhPSBudWxsKSkge1xuICAgICAgICB0aHJvdyBcIkVkZ2Ugc291cmNlIGFuZC9vciB0YXJnZXQgaXMgbnVsbCFcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKCEobmV3RWRnZS5zb3VyY2UuZWRnZXMuaW5kZXhPZihuZXdFZGdlKSA9PSAtMSAmJiBuZXdFZGdlLnRhcmdldC5lZGdlcy5pbmRleE9mKG5ld0VkZ2UpID09IC0xKSkge1xuICAgICAgICB0aHJvdyBcIkVkZ2UgYWxyZWFkeSBpbiBzb3VyY2UgYW5kL29yIHRhcmdldCBpbmNpZGVuY3kgbGlzdCFcIjtcbiAgICAgIH1cblxuICAgICAgbmV3RWRnZS5zb3VyY2UuZWRnZXMucHVzaChuZXdFZGdlKTtcbiAgICAgIG5ld0VkZ2UudGFyZ2V0LmVkZ2VzLnB1c2gobmV3RWRnZSk7XG5cbiAgICAgIHJldHVybiBuZXdFZGdlO1xuICAgIH1cbiAgfVxufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGxPYmopIHtcbiAgaWYgKGxPYmogaW5zdGFuY2VvZiBMR3JhcGgpIHtcbiAgICB2YXIgZ3JhcGggPSBsT2JqO1xuICAgIGlmIChncmFwaC5nZXRHcmFwaE1hbmFnZXIoKSAhPSB0aGlzKSB7XG4gICAgICB0aHJvdyBcIkdyYXBoIG5vdCBpbiB0aGlzIGdyYXBoIG1nclwiO1xuICAgIH1cbiAgICBpZiAoIShncmFwaCA9PSB0aGlzLnJvb3RHcmFwaCB8fCBncmFwaC5wYXJlbnQgIT0gbnVsbCAmJiBncmFwaC5wYXJlbnQuZ3JhcGhNYW5hZ2VyID09IHRoaXMpKSB7XG4gICAgICB0aHJvdyBcIkludmFsaWQgcGFyZW50IG5vZGUhXCI7XG4gICAgfVxuXG4gICAgLy8gZmlyc3QgdGhlIGVkZ2VzIChtYWtlIGEgY29weSB0byBkbyBpdCBzYWZlbHkpXG4gICAgdmFyIGVkZ2VzVG9CZVJlbW92ZWQgPSBbXTtcblxuICAgIGVkZ2VzVG9CZVJlbW92ZWQgPSBlZGdlc1RvQmVSZW1vdmVkLmNvbmNhdChncmFwaC5nZXRFZGdlcygpKTtcblxuICAgIHZhciBlZGdlO1xuICAgIHZhciBzID0gZWRnZXNUb0JlUmVtb3ZlZC5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgIGVkZ2UgPSBlZGdlc1RvQmVSZW1vdmVkW2ldO1xuICAgICAgZ3JhcGgucmVtb3ZlKGVkZ2UpO1xuICAgIH1cblxuICAgIC8vIHRoZW4gdGhlIG5vZGVzIChtYWtlIGEgY29weSB0byBkbyBpdCBzYWZlbHkpXG4gICAgdmFyIG5vZGVzVG9CZVJlbW92ZWQgPSBbXTtcblxuICAgIG5vZGVzVG9CZVJlbW92ZWQgPSBub2Rlc1RvQmVSZW1vdmVkLmNvbmNhdChncmFwaC5nZXROb2RlcygpKTtcblxuICAgIHZhciBub2RlO1xuICAgIHMgPSBub2Rlc1RvQmVSZW1vdmVkLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgICAgbm9kZSA9IG5vZGVzVG9CZVJlbW92ZWRbaV07XG4gICAgICBncmFwaC5yZW1vdmUobm9kZSk7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgZ3JhcGggaXMgdGhlIHJvb3RcbiAgICBpZiAoZ3JhcGggPT0gdGhpcy5yb290R3JhcGgpIHtcbiAgICAgIHRoaXMuc2V0Um9vdEdyYXBoKG51bGwpO1xuICAgIH1cblxuICAgIC8vIG5vdyByZW1vdmUgdGhlIGdyYXBoIGl0c2VsZlxuICAgIHZhciBpbmRleCA9IHRoaXMuZ3JhcGhzLmluZGV4T2YoZ3JhcGgpO1xuICAgIHRoaXMuZ3JhcGhzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBhbHNvIHJlc2V0IHRoZSBwYXJlbnQgb2YgdGhlIGdyYXBoXG4gICAgZ3JhcGgucGFyZW50ID0gbnVsbDtcbiAgfSBlbHNlIGlmIChsT2JqIGluc3RhbmNlb2YgTEVkZ2UpIHtcbiAgICBlZGdlID0gbE9iajtcbiAgICBpZiAoZWRnZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIkVkZ2UgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKCFlZGdlLmlzSW50ZXJHcmFwaCkge1xuICAgICAgdGhyb3cgXCJOb3QgYW4gaW50ZXItZ3JhcGggZWRnZSFcIjtcbiAgICB9XG4gICAgaWYgKCEoZWRnZS5zb3VyY2UgIT0gbnVsbCAmJiBlZGdlLnRhcmdldCAhPSBudWxsKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBpcyBudWxsIVwiO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBlZGdlIGZyb20gc291cmNlIGFuZCB0YXJnZXQgbm9kZXMnIGluY2lkZW5jeSBsaXN0c1xuXG4gICAgaWYgKCEoZWRnZS5zb3VyY2UuZWRnZXMuaW5kZXhPZihlZGdlKSAhPSAtMSAmJiBlZGdlLnRhcmdldC5lZGdlcy5pbmRleE9mKGVkZ2UpICE9IC0xKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBkb2Vzbid0IGtub3cgdGhpcyBlZGdlIVwiO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IGVkZ2Uuc291cmNlLmVkZ2VzLmluZGV4T2YoZWRnZSk7XG4gICAgZWRnZS5zb3VyY2UuZWRnZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpbmRleCA9IGVkZ2UudGFyZ2V0LmVkZ2VzLmluZGV4T2YoZWRnZSk7XG4gICAgZWRnZS50YXJnZXQuZWRnZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIHJlbW92ZSBlZGdlIGZyb20gb3duZXIgZ3JhcGggbWFuYWdlcidzIGludGVyLWdyYXBoIGVkZ2UgbGlzdFxuXG4gICAgaWYgKCEoZWRnZS5zb3VyY2Uub3duZXIgIT0gbnVsbCAmJiBlZGdlLnNvdXJjZS5vd25lci5nZXRHcmFwaE1hbmFnZXIoKSAhPSBudWxsKSkge1xuICAgICAgdGhyb3cgXCJFZGdlIG93bmVyIGdyYXBoIG9yIG93bmVyIGdyYXBoIG1hbmFnZXIgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKGVkZ2Uuc291cmNlLm93bmVyLmdldEdyYXBoTWFuYWdlcigpLmVkZ2VzLmluZGV4T2YoZWRnZSkgPT0gLTEpIHtcbiAgICAgIHRocm93IFwiTm90IGluIG93bmVyIGdyYXBoIG1hbmFnZXIncyBlZGdlIGxpc3QhXCI7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4ID0gZWRnZS5zb3VyY2Uub3duZXIuZ2V0R3JhcGhNYW5hZ2VyKCkuZWRnZXMuaW5kZXhPZihlZGdlKTtcbiAgICBlZGdlLnNvdXJjZS5vd25lci5nZXRHcmFwaE1hbmFnZXIoKS5lZGdlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS51cGRhdGVCb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucm9vdEdyYXBoLnVwZGF0ZUJvdW5kcyh0cnVlKTtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldEdyYXBocyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhzO1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuZ2V0QWxsTm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmFsbE5vZGVzID09IG51bGwpIHtcbiAgICB2YXIgbm9kZUxpc3QgPSBbXTtcbiAgICB2YXIgZ3JhcGhzID0gdGhpcy5nZXRHcmFwaHMoKTtcbiAgICB2YXIgcyA9IGdyYXBocy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgIG5vZGVMaXN0ID0gbm9kZUxpc3QuY29uY2F0KGdyYXBoc1tpXS5nZXROb2RlcygpKTtcbiAgICB9XG4gICAgdGhpcy5hbGxOb2RlcyA9IG5vZGVMaXN0O1xuICB9XG4gIHJldHVybiB0aGlzLmFsbE5vZGVzO1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUucmVzZXRBbGxOb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5hbGxOb2RlcyA9IG51bGw7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5yZXNldEFsbEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmFsbEVkZ2VzID0gbnVsbDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLnJlc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuYWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBudWxsO1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuZ2V0QWxsRWRnZXMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmFsbEVkZ2VzID09IG51bGwpIHtcbiAgICB2YXIgZWRnZUxpc3QgPSBbXTtcbiAgICB2YXIgZ3JhcGhzID0gdGhpcy5nZXRHcmFwaHMoKTtcbiAgICB2YXIgcyA9IGdyYXBocy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncmFwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGVkZ2VMaXN0ID0gZWRnZUxpc3QuY29uY2F0KGdyYXBoc1tpXS5nZXRFZGdlcygpKTtcbiAgICB9XG5cbiAgICBlZGdlTGlzdCA9IGVkZ2VMaXN0LmNvbmNhdCh0aGlzLmVkZ2VzKTtcblxuICAgIHRoaXMuYWxsRWRnZXMgPSBlZGdlTGlzdDtcbiAgfVxuICByZXR1cm4gdGhpcy5hbGxFZGdlcztcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5hbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbjtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLnNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uID0gZnVuY3Rpb24gKG5vZGVMaXN0KSB7XG4gIGlmICh0aGlzLmFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uICE9IG51bGwpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuXG4gIHRoaXMuYWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBub2RlTGlzdDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldFJvb3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJvb3RHcmFwaDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLnNldFJvb3RHcmFwaCA9IGZ1bmN0aW9uIChncmFwaCkge1xuICBpZiAoZ3JhcGguZ2V0R3JhcGhNYW5hZ2VyKCkgIT0gdGhpcykge1xuICAgIHRocm93IFwiUm9vdCBub3QgaW4gdGhpcyBncmFwaCBtZ3IhXCI7XG4gIH1cblxuICB0aGlzLnJvb3RHcmFwaCA9IGdyYXBoO1xuICAvLyByb290IGdyYXBoIG11c3QgaGF2ZSBhIHJvb3Qgbm9kZSBhc3NvY2lhdGVkIHdpdGggaXQgZm9yIGNvbnZlbmllbmNlXG4gIGlmIChncmFwaC5wYXJlbnQgPT0gbnVsbCkge1xuICAgIGdyYXBoLnBhcmVudCA9IHRoaXMubGF5b3V0Lm5ld05vZGUoXCJSb290IG5vZGVcIik7XG4gIH1cbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldExheW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubGF5b3V0O1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuaXNPbmVBbmNlc3Rvck9mT3RoZXIgPSBmdW5jdGlvbiAoZmlyc3ROb2RlLCBzZWNvbmROb2RlKSB7XG4gIGlmICghKGZpcnN0Tm9kZSAhPSBudWxsICYmIHNlY29uZE5vZGUgIT0gbnVsbCkpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuXG4gIGlmIChmaXJzdE5vZGUgPT0gc2Vjb25kTm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIElzIHNlY29uZCBub2RlIGFuIGFuY2VzdG9yIG9mIHRoZSBmaXJzdCBvbmU/XG4gIHZhciBvd25lckdyYXBoID0gZmlyc3ROb2RlLmdldE93bmVyKCk7XG4gIHZhciBwYXJlbnROb2RlO1xuXG4gIGRvIHtcbiAgICBwYXJlbnROb2RlID0gb3duZXJHcmFwaC5nZXRQYXJlbnQoKTtcblxuICAgIGlmIChwYXJlbnROb2RlID09IG51bGwpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChwYXJlbnROb2RlID09IHNlY29uZE5vZGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIG93bmVyR3JhcGggPSBwYXJlbnROb2RlLmdldE93bmVyKCk7XG4gICAgaWYgKG93bmVyR3JhcGggPT0gbnVsbCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcbiAgLy8gSXMgZmlyc3Qgbm9kZSBhbiBhbmNlc3RvciBvZiB0aGUgc2Vjb25kIG9uZT9cbiAgb3duZXJHcmFwaCA9IHNlY29uZE5vZGUuZ2V0T3duZXIoKTtcblxuICBkbyB7XG4gICAgcGFyZW50Tm9kZSA9IG93bmVyR3JhcGguZ2V0UGFyZW50KCk7XG5cbiAgICBpZiAocGFyZW50Tm9kZSA9PSBudWxsKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocGFyZW50Tm9kZSA9PSBmaXJzdE5vZGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIG93bmVyR3JhcGggPSBwYXJlbnROb2RlLmdldE93bmVyKCk7XG4gICAgaWYgKG93bmVyR3JhcGggPT0gbnVsbCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5jYWxjTG93ZXN0Q29tbW9uQW5jZXN0b3JzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWRnZTtcbiAgdmFyIHNvdXJjZU5vZGU7XG4gIHZhciB0YXJnZXROb2RlO1xuICB2YXIgc291cmNlQW5jZXN0b3JHcmFwaDtcbiAgdmFyIHRhcmdldEFuY2VzdG9yR3JhcGg7XG5cbiAgdmFyIGVkZ2VzID0gdGhpcy5nZXRBbGxFZGdlcygpO1xuICB2YXIgcyA9IGVkZ2VzLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICBlZGdlID0gZWRnZXNbaV07XG5cbiAgICBzb3VyY2VOb2RlID0gZWRnZS5zb3VyY2U7XG4gICAgdGFyZ2V0Tm9kZSA9IGVkZ2UudGFyZ2V0O1xuICAgIGVkZ2UubGNhID0gbnVsbDtcbiAgICBlZGdlLnNvdXJjZUluTGNhID0gc291cmNlTm9kZTtcbiAgICBlZGdlLnRhcmdldEluTGNhID0gdGFyZ2V0Tm9kZTtcblxuICAgIGlmIChzb3VyY2VOb2RlID09IHRhcmdldE5vZGUpIHtcbiAgICAgIGVkZ2UubGNhID0gc291cmNlTm9kZS5nZXRPd25lcigpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgc291cmNlQW5jZXN0b3JHcmFwaCA9IHNvdXJjZU5vZGUuZ2V0T3duZXIoKTtcblxuICAgIHdoaWxlIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICBlZGdlLnRhcmdldEluTGNhID0gdGFyZ2V0Tm9kZTtcbiAgICAgIHRhcmdldEFuY2VzdG9yR3JhcGggPSB0YXJnZXROb2RlLmdldE93bmVyKCk7XG5cbiAgICAgIHdoaWxlIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICAgIGlmICh0YXJnZXRBbmNlc3RvckdyYXBoID09IHNvdXJjZUFuY2VzdG9yR3JhcGgpIHtcbiAgICAgICAgICBlZGdlLmxjYSA9IHRhcmdldEFuY2VzdG9yR3JhcGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0QW5jZXN0b3JHcmFwaCA9PSB0aGlzLnJvb3RHcmFwaCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVkZ2UubGNhICE9IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgICAgICAgfVxuICAgICAgICBlZGdlLnRhcmdldEluTGNhID0gdGFyZ2V0QW5jZXN0b3JHcmFwaC5nZXRQYXJlbnQoKTtcbiAgICAgICAgdGFyZ2V0QW5jZXN0b3JHcmFwaCA9IGVkZ2UudGFyZ2V0SW5MY2EuZ2V0T3duZXIoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNvdXJjZUFuY2VzdG9yR3JhcGggPT0gdGhpcy5yb290R3JhcGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICAgIGVkZ2Uuc291cmNlSW5MY2EgPSBzb3VyY2VBbmNlc3RvckdyYXBoLmdldFBhcmVudCgpO1xuICAgICAgICBzb3VyY2VBbmNlc3RvckdyYXBoID0gZWRnZS5zb3VyY2VJbkxjYS5nZXRPd25lcigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgICB9XG4gIH1cbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmNhbGNMb3dlc3RDb21tb25BbmNlc3RvciA9IGZ1bmN0aW9uIChmaXJzdE5vZGUsIHNlY29uZE5vZGUpIHtcbiAgaWYgKGZpcnN0Tm9kZSA9PSBzZWNvbmROb2RlKSB7XG4gICAgcmV0dXJuIGZpcnN0Tm9kZS5nZXRPd25lcigpO1xuICB9XG4gIHZhciBmaXJzdE93bmVyR3JhcGggPSBmaXJzdE5vZGUuZ2V0T3duZXIoKTtcblxuICBkbyB7XG4gICAgaWYgKGZpcnN0T3duZXJHcmFwaCA9PSBudWxsKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIHNlY29uZE93bmVyR3JhcGggPSBzZWNvbmROb2RlLmdldE93bmVyKCk7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoc2Vjb25kT3duZXJHcmFwaCA9PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2Vjb25kT3duZXJHcmFwaCA9PSBmaXJzdE93bmVyR3JhcGgpIHtcbiAgICAgICAgcmV0dXJuIHNlY29uZE93bmVyR3JhcGg7XG4gICAgICB9XG4gICAgICBzZWNvbmRPd25lckdyYXBoID0gc2Vjb25kT3duZXJHcmFwaC5nZXRQYXJlbnQoKS5nZXRPd25lcigpO1xuICAgIH0gd2hpbGUgKHRydWUpO1xuXG4gICAgZmlyc3RPd25lckdyYXBoID0gZmlyc3RPd25lckdyYXBoLmdldFBhcmVudCgpLmdldE93bmVyKCk7XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJldHVybiBmaXJzdE93bmVyR3JhcGg7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5jYWxjSW5jbHVzaW9uVHJlZURlcHRocyA9IGZ1bmN0aW9uIChncmFwaCwgZGVwdGgpIHtcbiAgaWYgKGdyYXBoID09IG51bGwgJiYgZGVwdGggPT0gbnVsbCkge1xuICAgIGdyYXBoID0gdGhpcy5yb290R3JhcGg7XG4gICAgZGVwdGggPSAxO1xuICB9XG4gIHZhciBub2RlO1xuXG4gIHZhciBub2RlcyA9IGdyYXBoLmdldE5vZGVzKCk7XG4gIHZhciBzID0gbm9kZXMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICBub2RlLmluY2x1c2lvblRyZWVEZXB0aCA9IGRlcHRoO1xuXG4gICAgaWYgKG5vZGUuY2hpbGQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5jYWxjSW5jbHVzaW9uVHJlZURlcHRocyhub2RlLmNoaWxkLCBkZXB0aCArIDEpO1xuICAgIH1cbiAgfVxufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuaW5jbHVkZXNJbnZhbGlkRWRnZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVkZ2U7XG4gIHZhciBlZGdlc1RvUmVtb3ZlID0gW107XG5cbiAgdmFyIHMgPSB0aGlzLmVkZ2VzLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICBlZGdlID0gdGhpcy5lZGdlc1tpXTtcblxuICAgIGlmICh0aGlzLmlzT25lQW5jZXN0b3JPZk90aGVyKGVkZ2Uuc291cmNlLCBlZGdlLnRhcmdldCkpIHtcbiAgICAgIGVkZ2VzVG9SZW1vdmUucHVzaChlZGdlKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZW1vdmUgaW52YWxpZCBlZGdlcyBmcm9tIGdyYXBoIG1hbmFnZXJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5yZW1vdmUoZWRnZXNUb1JlbW92ZVtpXSk7XG4gIH1cblxuICAvLyBJbnZhbGlkIGVkZ2VzIGFyZSBjbGVhcmVkLCBzbyByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBMR3JhcGhNYW5hZ2VyO1xuXG4vKioqLyB9KSxcbi8qIDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLyoqXG4gKiBUaGlzIGNsYXNzIG1haW50YWlucyBhIGxpc3Qgb2Ygc3RhdGljIGdlb21ldHJ5IHJlbGF0ZWQgdXRpbGl0eSBtZXRob2RzLlxuICpcbiAqXG4gKiBDb3B5cmlnaHQ6IGktVmlzIFJlc2VhcmNoIEdyb3VwLCBCaWxrZW50IFVuaXZlcnNpdHksIDIwMDcgLSBwcmVzZW50XG4gKi9cblxudmFyIFBvaW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5cbmZ1bmN0aW9uIElHZW9tZXRyeSgpIHt9XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2FsY3VsYXRlcyAqaGFsZiogdGhlIGFtb3VudCBpbiB4IGFuZCB5IGRpcmVjdGlvbnMgb2YgdGhlIHR3b1xuICogaW5wdXQgcmVjdGFuZ2xlcyBuZWVkZWQgdG8gc2VwYXJhdGUgdGhlbSBrZWVwaW5nIHRoZWlyIHJlc3BlY3RpdmVcbiAqIHBvc2l0aW9uaW5nLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGluIHRoZSBpbnB1dCBhcnJheS4gQW4gaW5wdXRcbiAqIHNlcGFyYXRpb24gYnVmZmVyIGFkZGVkIHRvIHRoZSBhbW91bnQgaW4gYm90aCBkaXJlY3Rpb25zLiBXZSBhc3N1bWUgdGhhdFxuICogdGhlIHR3byByZWN0YW5nbGVzIGRvIGludGVyc2VjdC5cbiAqL1xuSUdlb21ldHJ5LmNhbGNTZXBhcmF0aW9uQW1vdW50ID0gZnVuY3Rpb24gKHJlY3RBLCByZWN0Qiwgb3ZlcmxhcEFtb3VudCwgc2VwYXJhdGlvbkJ1ZmZlcikge1xuICBpZiAoIXJlY3RBLmludGVyc2VjdHMocmVjdEIpKSB7XG4gICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIH1cblxuICB2YXIgZGlyZWN0aW9ucyA9IG5ldyBBcnJheSgyKTtcblxuICB0aGlzLmRlY2lkZURpcmVjdGlvbnNGb3JPdmVybGFwcGluZ05vZGVzKHJlY3RBLCByZWN0QiwgZGlyZWN0aW9ucyk7XG5cbiAgb3ZlcmxhcEFtb3VudFswXSA9IE1hdGgubWluKHJlY3RBLmdldFJpZ2h0KCksIHJlY3RCLmdldFJpZ2h0KCkpIC0gTWF0aC5tYXgocmVjdEEueCwgcmVjdEIueCk7XG4gIG92ZXJsYXBBbW91bnRbMV0gPSBNYXRoLm1pbihyZWN0QS5nZXRCb3R0b20oKSwgcmVjdEIuZ2V0Qm90dG9tKCkpIC0gTWF0aC5tYXgocmVjdEEueSwgcmVjdEIueSk7XG5cbiAgLy8gdXBkYXRlIHRoZSBvdmVybGFwcGluZyBhbW91bnRzIGZvciB0aGUgZm9sbG93aW5nIGNhc2VzOlxuICBpZiAocmVjdEEuZ2V0WCgpIDw9IHJlY3RCLmdldFgoKSAmJiByZWN0QS5nZXRSaWdodCgpID49IHJlY3RCLmdldFJpZ2h0KCkpIHtcbiAgICAvKiBDYXNlIHguMTpcbiAgICAqXG4gICAgKiByZWN0QVxuICAgICogXHR8ICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgKiBcdHwgICAgICAgIF9fX19fX19fXyAgICAgIHxcbiAgICAqIFx0fCAgICAgICAgfCAgICAgICB8ICAgICAgfFxuICAgICogXHR8X19fX19fX198X19fX19fX3xfX19fX198XG4gICAgKiBcdFx0XHQgfCAgICAgICB8XG4gICAgKiAgICAgICAgICAgfCAgICAgICB8XG4gICAgKiAgICAgICAgcmVjdEJcbiAgICAqL1xuICAgIG92ZXJsYXBBbW91bnRbMF0gKz0gTWF0aC5taW4ocmVjdEIuZ2V0WCgpIC0gcmVjdEEuZ2V0WCgpLCByZWN0QS5nZXRSaWdodCgpIC0gcmVjdEIuZ2V0UmlnaHQoKSk7XG4gIH0gZWxzZSBpZiAocmVjdEIuZ2V0WCgpIDw9IHJlY3RBLmdldFgoKSAmJiByZWN0Qi5nZXRSaWdodCgpID49IHJlY3RBLmdldFJpZ2h0KCkpIHtcbiAgICAvKiBDYXNlIHguMjpcbiAgICAqXG4gICAgKiByZWN0QlxuICAgICogXHR8ICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgKiBcdHwgICAgICAgIF9fX19fX19fXyAgICAgIHxcbiAgICAqIFx0fCAgICAgICAgfCAgICAgICB8ICAgICAgfFxuICAgICogXHR8X19fX19fX198X19fX19fX3xfX19fX198XG4gICAgKiBcdFx0XHQgfCAgICAgICB8XG4gICAgKiAgICAgICAgICAgfCAgICAgICB8XG4gICAgKiAgICAgICAgcmVjdEFcbiAgICAqL1xuICAgIG92ZXJsYXBBbW91bnRbMF0gKz0gTWF0aC5taW4ocmVjdEEuZ2V0WCgpIC0gcmVjdEIuZ2V0WCgpLCByZWN0Qi5nZXRSaWdodCgpIC0gcmVjdEEuZ2V0UmlnaHQoKSk7XG4gIH1cbiAgaWYgKHJlY3RBLmdldFkoKSA8PSByZWN0Qi5nZXRZKCkgJiYgcmVjdEEuZ2V0Qm90dG9tKCkgPj0gcmVjdEIuZ2V0Qm90dG9tKCkpIHtcbiAgICAvKiBDYXNlIHkuMTpcbiAgICAgKiAgICAgICAgICBfX19fX19fXyByZWN0QVxuICAgICAqICAgICAgICAgfFxuICAgICAqICAgICAgICAgfFxuICAgICAqICAgX19fX19ffF9fX18gIHJlY3RCXG4gICAgICogICAgICAgICB8ICAgIHxcbiAgICAgKiAgICAgICAgIHwgICAgfFxuICAgICAqICAgX19fX19ffF9fX198XG4gICAgICogICAgICAgICB8XG4gICAgICogICAgICAgICB8XG4gICAgICogICAgICAgICB8X19fX19fX19cbiAgICAgKlxuICAgICAqL1xuICAgIG92ZXJsYXBBbW91bnRbMV0gKz0gTWF0aC5taW4ocmVjdEIuZ2V0WSgpIC0gcmVjdEEuZ2V0WSgpLCByZWN0QS5nZXRCb3R0b20oKSAtIHJlY3RCLmdldEJvdHRvbSgpKTtcbiAgfSBlbHNlIGlmIChyZWN0Qi5nZXRZKCkgPD0gcmVjdEEuZ2V0WSgpICYmIHJlY3RCLmdldEJvdHRvbSgpID49IHJlY3RBLmdldEJvdHRvbSgpKSB7XG4gICAgLyogQ2FzZSB5LjI6XG4gICAgKiAgICAgICAgICBfX19fX19fXyByZWN0QlxuICAgICogICAgICAgICB8XG4gICAgKiAgICAgICAgIHxcbiAgICAqICAgX19fX19ffF9fX18gIHJlY3RBXG4gICAgKiAgICAgICAgIHwgICAgfFxuICAgICogICAgICAgICB8ICAgIHxcbiAgICAqICAgX19fX19ffF9fX198XG4gICAgKiAgICAgICAgIHxcbiAgICAqICAgICAgICAgfFxuICAgICogICAgICAgICB8X19fX19fX19cbiAgICAqXG4gICAgKi9cbiAgICBvdmVybGFwQW1vdW50WzFdICs9IE1hdGgubWluKHJlY3RBLmdldFkoKSAtIHJlY3RCLmdldFkoKSwgcmVjdEIuZ2V0Qm90dG9tKCkgLSByZWN0QS5nZXRCb3R0b20oKSk7XG4gIH1cblxuICAvLyBmaW5kIHNsb3BlIG9mIHRoZSBsaW5lIHBhc3NlcyB0d28gY2VudGVyc1xuICB2YXIgc2xvcGUgPSBNYXRoLmFicygocmVjdEIuZ2V0Q2VudGVyWSgpIC0gcmVjdEEuZ2V0Q2VudGVyWSgpKSAvIChyZWN0Qi5nZXRDZW50ZXJYKCkgLSByZWN0QS5nZXRDZW50ZXJYKCkpKTtcbiAgLy8gaWYgY2VudGVycyBhcmUgb3ZlcmxhcHBlZFxuICBpZiAocmVjdEIuZ2V0Q2VudGVyWSgpID09PSByZWN0QS5nZXRDZW50ZXJZKCkgJiYgcmVjdEIuZ2V0Q2VudGVyWCgpID09PSByZWN0QS5nZXRDZW50ZXJYKCkpIHtcbiAgICAvLyBhc3N1bWUgdGhlIHNsb3BlIGlzIDEgKDQ1IGRlZ3JlZSlcbiAgICBzbG9wZSA9IDEuMDtcbiAgfVxuXG4gIHZhciBtb3ZlQnlZID0gc2xvcGUgKiBvdmVybGFwQW1vdW50WzBdO1xuICB2YXIgbW92ZUJ5WCA9IG92ZXJsYXBBbW91bnRbMV0gLyBzbG9wZTtcbiAgaWYgKG92ZXJsYXBBbW91bnRbMF0gPCBtb3ZlQnlYKSB7XG4gICAgbW92ZUJ5WCA9IG92ZXJsYXBBbW91bnRbMF07XG4gIH0gZWxzZSB7XG4gICAgbW92ZUJ5WSA9IG92ZXJsYXBBbW91bnRbMV07XG4gIH1cbiAgLy8gcmV0dXJuIGhhbGYgdGhlIGFtb3VudCBzbyB0aGF0IGlmIGVhY2ggcmVjdGFuZ2xlIGlzIG1vdmVkIGJ5IHRoZXNlXG4gIC8vIGFtb3VudHMgaW4gb3Bwb3NpdGUgZGlyZWN0aW9ucywgb3ZlcmxhcCB3aWxsIGJlIHJlc29sdmVkXG4gIG92ZXJsYXBBbW91bnRbMF0gPSAtMSAqIGRpcmVjdGlvbnNbMF0gKiAobW92ZUJ5WCAvIDIgKyBzZXBhcmF0aW9uQnVmZmVyKTtcbiAgb3ZlcmxhcEFtb3VudFsxXSA9IC0xICogZGlyZWN0aW9uc1sxXSAqIChtb3ZlQnlZIC8gMiArIHNlcGFyYXRpb25CdWZmZXIpO1xufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBkZWNpZGVzIHRoZSBzZXBhcmF0aW9uIGRpcmVjdGlvbiBvZiBvdmVybGFwcGluZyBub2Rlc1xuICpcbiAqIGlmIGRpcmVjdGlvbnNbMF0gPSAtMSwgdGhlbiByZWN0QSBnb2VzIGxlZnRcbiAqIGlmIGRpcmVjdGlvbnNbMF0gPSAxLCAgdGhlbiByZWN0QSBnb2VzIHJpZ2h0XG4gKiBpZiBkaXJlY3Rpb25zWzFdID0gLTEsIHRoZW4gcmVjdEEgZ29lcyB1cFxuICogaWYgZGlyZWN0aW9uc1sxXSA9IDEsICB0aGVuIHJlY3RBIGdvZXMgZG93blxuICovXG5JR2VvbWV0cnkuZGVjaWRlRGlyZWN0aW9uc0Zvck92ZXJsYXBwaW5nTm9kZXMgPSBmdW5jdGlvbiAocmVjdEEsIHJlY3RCLCBkaXJlY3Rpb25zKSB7XG4gIGlmIChyZWN0QS5nZXRDZW50ZXJYKCkgPCByZWN0Qi5nZXRDZW50ZXJYKCkpIHtcbiAgICBkaXJlY3Rpb25zWzBdID0gLTE7XG4gIH0gZWxzZSB7XG4gICAgZGlyZWN0aW9uc1swXSA9IDE7XG4gIH1cblxuICBpZiAocmVjdEEuZ2V0Q2VudGVyWSgpIDwgcmVjdEIuZ2V0Q2VudGVyWSgpKSB7XG4gICAgZGlyZWN0aW9uc1sxXSA9IC0xO1xuICB9IGVsc2Uge1xuICAgIGRpcmVjdGlvbnNbMV0gPSAxO1xuICB9XG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNhbGN1bGF0ZXMgdGhlIGludGVyc2VjdGlvbiAoY2xpcHBpbmcpIHBvaW50cyBvZiB0aGUgdHdvXG4gKiBpbnB1dCByZWN0YW5nbGVzIHdpdGggbGluZSBzZWdtZW50IGRlZmluZWQgYnkgdGhlIGNlbnRlcnMgb2YgdGhlc2UgdHdvXG4gKiByZWN0YW5nbGVzLiBUaGUgY2xpcHBpbmcgcG9pbnRzIGFyZSBzYXZlZCBpbiB0aGUgaW5wdXQgZG91YmxlIGFycmF5IGFuZFxuICogd2hldGhlciBvciBub3QgdGhlIHR3byByZWN0YW5nbGVzIG92ZXJsYXAgaXMgcmV0dXJuZWQuXG4gKi9cbklHZW9tZXRyeS5nZXRJbnRlcnNlY3Rpb24yID0gZnVuY3Rpb24gKHJlY3RBLCByZWN0QiwgcmVzdWx0KSB7XG4gIC8vcmVzdWx0WzAtMV0gd2lsbCBjb250YWluIGNsaXBQb2ludCBvZiByZWN0QSwgcmVzdWx0WzItM10gd2lsbCBjb250YWluIGNsaXBQb2ludCBvZiByZWN0QlxuICB2YXIgcDF4ID0gcmVjdEEuZ2V0Q2VudGVyWCgpO1xuICB2YXIgcDF5ID0gcmVjdEEuZ2V0Q2VudGVyWSgpO1xuICB2YXIgcDJ4ID0gcmVjdEIuZ2V0Q2VudGVyWCgpO1xuICB2YXIgcDJ5ID0gcmVjdEIuZ2V0Q2VudGVyWSgpO1xuXG4gIC8vaWYgdHdvIHJlY3RhbmdsZXMgaW50ZXJzZWN0LCB0aGVuIGNsaXBwaW5nIHBvaW50cyBhcmUgY2VudGVyc1xuICBpZiAocmVjdEEuaW50ZXJzZWN0cyhyZWN0QikpIHtcbiAgICByZXN1bHRbMF0gPSBwMXg7XG4gICAgcmVzdWx0WzFdID0gcDF5O1xuICAgIHJlc3VsdFsyXSA9IHAyeDtcbiAgICByZXN1bHRbM10gPSBwMnk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy92YXJpYWJsZXMgZm9yIHJlY3RBXG4gIHZhciB0b3BMZWZ0QXggPSByZWN0QS5nZXRYKCk7XG4gIHZhciB0b3BMZWZ0QXkgPSByZWN0QS5nZXRZKCk7XG4gIHZhciB0b3BSaWdodEF4ID0gcmVjdEEuZ2V0UmlnaHQoKTtcbiAgdmFyIGJvdHRvbUxlZnRBeCA9IHJlY3RBLmdldFgoKTtcbiAgdmFyIGJvdHRvbUxlZnRBeSA9IHJlY3RBLmdldEJvdHRvbSgpO1xuICB2YXIgYm90dG9tUmlnaHRBeCA9IHJlY3RBLmdldFJpZ2h0KCk7XG4gIHZhciBoYWxmV2lkdGhBID0gcmVjdEEuZ2V0V2lkdGhIYWxmKCk7XG4gIHZhciBoYWxmSGVpZ2h0QSA9IHJlY3RBLmdldEhlaWdodEhhbGYoKTtcbiAgLy92YXJpYWJsZXMgZm9yIHJlY3RCXG4gIHZhciB0b3BMZWZ0QnggPSByZWN0Qi5nZXRYKCk7XG4gIHZhciB0b3BMZWZ0QnkgPSByZWN0Qi5nZXRZKCk7XG4gIHZhciB0b3BSaWdodEJ4ID0gcmVjdEIuZ2V0UmlnaHQoKTtcbiAgdmFyIGJvdHRvbUxlZnRCeCA9IHJlY3RCLmdldFgoKTtcbiAgdmFyIGJvdHRvbUxlZnRCeSA9IHJlY3RCLmdldEJvdHRvbSgpO1xuICB2YXIgYm90dG9tUmlnaHRCeCA9IHJlY3RCLmdldFJpZ2h0KCk7XG4gIHZhciBoYWxmV2lkdGhCID0gcmVjdEIuZ2V0V2lkdGhIYWxmKCk7XG4gIHZhciBoYWxmSGVpZ2h0QiA9IHJlY3RCLmdldEhlaWdodEhhbGYoKTtcblxuICAvL2ZsYWcgd2hldGhlciBjbGlwcGluZyBwb2ludHMgYXJlIGZvdW5kXG4gIHZhciBjbGlwUG9pbnRBRm91bmQgPSBmYWxzZTtcbiAgdmFyIGNsaXBQb2ludEJGb3VuZCA9IGZhbHNlO1xuXG4gIC8vIGxpbmUgaXMgdmVydGljYWxcbiAgaWYgKHAxeCA9PT0gcDJ4KSB7XG4gICAgaWYgKHAxeSA+IHAyeSkge1xuICAgICAgcmVzdWx0WzBdID0gcDF4O1xuICAgICAgcmVzdWx0WzFdID0gdG9wTGVmdEF5O1xuICAgICAgcmVzdWx0WzJdID0gcDJ4O1xuICAgICAgcmVzdWx0WzNdID0gYm90dG9tTGVmdEJ5O1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAocDF5IDwgcDJ5KSB7XG4gICAgICByZXN1bHRbMF0gPSBwMXg7XG4gICAgICByZXN1bHRbMV0gPSBib3R0b21MZWZ0QXk7XG4gICAgICByZXN1bHRbMl0gPSBwMng7XG4gICAgICByZXN1bHRbM10gPSB0b3BMZWZ0Qnk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vbm90IGxpbmUsIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICAvLyBsaW5lIGlzIGhvcml6b250YWxcbiAgZWxzZSBpZiAocDF5ID09PSBwMnkpIHtcbiAgICAgIGlmIChwMXggPiBwMngpIHtcbiAgICAgICAgcmVzdWx0WzBdID0gdG9wTGVmdEF4O1xuICAgICAgICByZXN1bHRbMV0gPSBwMXk7XG4gICAgICAgIHJlc3VsdFsyXSA9IHRvcFJpZ2h0Qng7XG4gICAgICAgIHJlc3VsdFszXSA9IHAyeTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChwMXggPCBwMngpIHtcbiAgICAgICAgcmVzdWx0WzBdID0gdG9wUmlnaHRBeDtcbiAgICAgICAgcmVzdWx0WzFdID0gcDF5O1xuICAgICAgICByZXN1bHRbMl0gPSB0b3BMZWZ0Qng7XG4gICAgICAgIHJlc3VsdFszXSA9IHAyeTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy9ub3QgdmFsaWQgbGluZSwgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vc2xvcGVzIG9mIHJlY3RBJ3MgYW5kIHJlY3RCJ3MgZGlhZ29uYWxzXG4gICAgICB2YXIgc2xvcGVBID0gcmVjdEEuaGVpZ2h0IC8gcmVjdEEud2lkdGg7XG4gICAgICB2YXIgc2xvcGVCID0gcmVjdEIuaGVpZ2h0IC8gcmVjdEIud2lkdGg7XG5cbiAgICAgIC8vc2xvcGUgb2YgbGluZSBiZXR3ZWVuIGNlbnRlciBvZiByZWN0QSBhbmQgY2VudGVyIG9mIHJlY3RCXG4gICAgICB2YXIgc2xvcGVQcmltZSA9IChwMnkgLSBwMXkpIC8gKHAyeCAtIHAxeCk7XG4gICAgICB2YXIgY2FyZGluYWxEaXJlY3Rpb25BID0gdm9pZCAwO1xuICAgICAgdmFyIGNhcmRpbmFsRGlyZWN0aW9uQiA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRBeCA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRBeSA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRCeCA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRCeSA9IHZvaWQgMDtcblxuICAgICAgLy9kZXRlcm1pbmUgd2hldGhlciBjbGlwcGluZyBwb2ludCBpcyB0aGUgY29ybmVyIG9mIG5vZGVBXG4gICAgICBpZiAoLXNsb3BlQSA9PT0gc2xvcGVQcmltZSkge1xuICAgICAgICBpZiAocDF4ID4gcDJ4KSB7XG4gICAgICAgICAgcmVzdWx0WzBdID0gYm90dG9tTGVmdEF4O1xuICAgICAgICAgIHJlc3VsdFsxXSA9IGJvdHRvbUxlZnRBeTtcbiAgICAgICAgICBjbGlwUG9pbnRBRm91bmQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFswXSA9IHRvcFJpZ2h0QXg7XG4gICAgICAgICAgcmVzdWx0WzFdID0gdG9wTGVmdEF5O1xuICAgICAgICAgIGNsaXBQb2ludEFGb3VuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2xvcGVBID09PSBzbG9wZVByaW1lKSB7XG4gICAgICAgIGlmIChwMXggPiBwMngpIHtcbiAgICAgICAgICByZXN1bHRbMF0gPSB0b3BMZWZ0QXg7XG4gICAgICAgICAgcmVzdWx0WzFdID0gdG9wTGVmdEF5O1xuICAgICAgICAgIGNsaXBQb2ludEFGb3VuZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0WzBdID0gYm90dG9tUmlnaHRBeDtcbiAgICAgICAgICByZXN1bHRbMV0gPSBib3R0b21MZWZ0QXk7XG4gICAgICAgICAgY2xpcFBvaW50QUZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvL2RldGVybWluZSB3aGV0aGVyIGNsaXBwaW5nIHBvaW50IGlzIHRoZSBjb3JuZXIgb2Ygbm9kZUJcbiAgICAgIGlmICgtc2xvcGVCID09PSBzbG9wZVByaW1lKSB7XG4gICAgICAgIGlmIChwMnggPiBwMXgpIHtcbiAgICAgICAgICByZXN1bHRbMl0gPSBib3R0b21MZWZ0Qng7XG4gICAgICAgICAgcmVzdWx0WzNdID0gYm90dG9tTGVmdEJ5O1xuICAgICAgICAgIGNsaXBQb2ludEJGb3VuZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0WzJdID0gdG9wUmlnaHRCeDtcbiAgICAgICAgICByZXN1bHRbM10gPSB0b3BMZWZ0Qnk7XG4gICAgICAgICAgY2xpcFBvaW50QkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzbG9wZUIgPT09IHNsb3BlUHJpbWUpIHtcbiAgICAgICAgaWYgKHAyeCA+IHAxeCkge1xuICAgICAgICAgIHJlc3VsdFsyXSA9IHRvcExlZnRCeDtcbiAgICAgICAgICByZXN1bHRbM10gPSB0b3BMZWZ0Qnk7XG4gICAgICAgICAgY2xpcFBvaW50QkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRbMl0gPSBib3R0b21SaWdodEJ4O1xuICAgICAgICAgIHJlc3VsdFszXSA9IGJvdHRvbUxlZnRCeTtcbiAgICAgICAgICBjbGlwUG9pbnRCRm91bmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vaWYgYm90aCBjbGlwcGluZyBwb2ludHMgYXJlIGNvcm5lcnNcbiAgICAgIGlmIChjbGlwUG9pbnRBRm91bmQgJiYgY2xpcFBvaW50QkZvdW5kKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy9kZXRlcm1pbmUgQ2FyZGluYWwgRGlyZWN0aW9uIG9mIHJlY3RhbmdsZXNcbiAgICAgIGlmIChwMXggPiBwMngpIHtcbiAgICAgICAgaWYgKHAxeSA+IHAyeSkge1xuICAgICAgICAgIGNhcmRpbmFsRGlyZWN0aW9uQSA9IHRoaXMuZ2V0Q2FyZGluYWxEaXJlY3Rpb24oc2xvcGVBLCBzbG9wZVByaW1lLCA0KTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKHNsb3BlQiwgc2xvcGVQcmltZSwgMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FyZGluYWxEaXJlY3Rpb25BID0gdGhpcy5nZXRDYXJkaW5hbERpcmVjdGlvbigtc2xvcGVBLCBzbG9wZVByaW1lLCAzKTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKC1zbG9wZUIsIHNsb3BlUHJpbWUsIDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocDF5ID4gcDJ5KSB7XG4gICAgICAgICAgY2FyZGluYWxEaXJlY3Rpb25BID0gdGhpcy5nZXRDYXJkaW5hbERpcmVjdGlvbigtc2xvcGVBLCBzbG9wZVByaW1lLCAxKTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKC1zbG9wZUIsIHNsb3BlUHJpbWUsIDMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhcmRpbmFsRGlyZWN0aW9uQSA9IHRoaXMuZ2V0Q2FyZGluYWxEaXJlY3Rpb24oc2xvcGVBLCBzbG9wZVByaW1lLCAyKTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKHNsb3BlQiwgc2xvcGVQcmltZSwgNCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vY2FsY3VsYXRlIGNsaXBwaW5nIFBvaW50IGlmIGl0IGlzIG5vdCBmb3VuZCBiZWZvcmVcbiAgICAgIGlmICghY2xpcFBvaW50QUZvdW5kKSB7XG4gICAgICAgIHN3aXRjaCAoY2FyZGluYWxEaXJlY3Rpb25BKSB7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdGVtcFBvaW50QXkgPSB0b3BMZWZ0QXk7XG4gICAgICAgICAgICB0ZW1wUG9pbnRBeCA9IHAxeCArIC1oYWxmSGVpZ2h0QSAvIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMF0gPSB0ZW1wUG9pbnRBeDtcbiAgICAgICAgICAgIHJlc3VsdFsxXSA9IHRlbXBQb2ludEF5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgdGVtcFBvaW50QXggPSBib3R0b21SaWdodEF4O1xuICAgICAgICAgICAgdGVtcFBvaW50QXkgPSBwMXkgKyBoYWxmV2lkdGhBICogc2xvcGVQcmltZTtcbiAgICAgICAgICAgIHJlc3VsdFswXSA9IHRlbXBQb2ludEF4O1xuICAgICAgICAgICAgcmVzdWx0WzFdID0gdGVtcFBvaW50QXk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICB0ZW1wUG9pbnRBeSA9IGJvdHRvbUxlZnRBeTtcbiAgICAgICAgICAgIHRlbXBQb2ludEF4ID0gcDF4ICsgaGFsZkhlaWdodEEgLyBzbG9wZVByaW1lO1xuICAgICAgICAgICAgcmVzdWx0WzBdID0gdGVtcFBvaW50QXg7XG4gICAgICAgICAgICByZXN1bHRbMV0gPSB0ZW1wUG9pbnRBeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHRlbXBQb2ludEF4ID0gYm90dG9tTGVmdEF4O1xuICAgICAgICAgICAgdGVtcFBvaW50QXkgPSBwMXkgKyAtaGFsZldpZHRoQSAqIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMF0gPSB0ZW1wUG9pbnRBeDtcbiAgICAgICAgICAgIHJlc3VsdFsxXSA9IHRlbXBQb2ludEF5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghY2xpcFBvaW50QkZvdW5kKSB7XG4gICAgICAgIHN3aXRjaCAoY2FyZGluYWxEaXJlY3Rpb25CKSB7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdGVtcFBvaW50QnkgPSB0b3BMZWZ0Qnk7XG4gICAgICAgICAgICB0ZW1wUG9pbnRCeCA9IHAyeCArIC1oYWxmSGVpZ2h0QiAvIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMl0gPSB0ZW1wUG9pbnRCeDtcbiAgICAgICAgICAgIHJlc3VsdFszXSA9IHRlbXBQb2ludEJ5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgdGVtcFBvaW50QnggPSBib3R0b21SaWdodEJ4O1xuICAgICAgICAgICAgdGVtcFBvaW50QnkgPSBwMnkgKyBoYWxmV2lkdGhCICogc2xvcGVQcmltZTtcbiAgICAgICAgICAgIHJlc3VsdFsyXSA9IHRlbXBQb2ludEJ4O1xuICAgICAgICAgICAgcmVzdWx0WzNdID0gdGVtcFBvaW50Qnk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICB0ZW1wUG9pbnRCeSA9IGJvdHRvbUxlZnRCeTtcbiAgICAgICAgICAgIHRlbXBQb2ludEJ4ID0gcDJ4ICsgaGFsZkhlaWdodEIgLyBzbG9wZVByaW1lO1xuICAgICAgICAgICAgcmVzdWx0WzJdID0gdGVtcFBvaW50Qng7XG4gICAgICAgICAgICByZXN1bHRbM10gPSB0ZW1wUG9pbnRCeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHRlbXBQb2ludEJ4ID0gYm90dG9tTGVmdEJ4O1xuICAgICAgICAgICAgdGVtcFBvaW50QnkgPSBwMnkgKyAtaGFsZldpZHRoQiAqIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMl0gPSB0ZW1wUG9pbnRCeDtcbiAgICAgICAgICAgIHJlc3VsdFszXSA9IHRlbXBQb2ludEJ5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBpbiB3aGljaCBjYXJkaW5hbCBkaXJlY3Rpb24gZG9lcyBpbnB1dCBwb2ludCBzdGF5c1xuICogMTogTm9ydGhcbiAqIDI6IEVhc3RcbiAqIDM6IFNvdXRoXG4gKiA0OiBXZXN0XG4gKi9cbklHZW9tZXRyeS5nZXRDYXJkaW5hbERpcmVjdGlvbiA9IGZ1bmN0aW9uIChzbG9wZSwgc2xvcGVQcmltZSwgbGluZSkge1xuICBpZiAoc2xvcGUgPiBzbG9wZVByaW1lKSB7XG4gICAgcmV0dXJuIGxpbmU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDEgKyBsaW5lICUgNDtcbiAgfVxufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjYWxjdWxhdGVzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBsaW5lcyBkZWZpbmVkIGJ5XG4gKiBwb2ludCBwYWlycyAoczEsczIpIGFuZCAoZjEsZjIpLlxuICovXG5JR2VvbWV0cnkuZ2V0SW50ZXJzZWN0aW9uID0gZnVuY3Rpb24gKHMxLCBzMiwgZjEsIGYyKSB7XG4gIGlmIChmMiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SW50ZXJzZWN0aW9uMihzMSwgczIsIGYxKTtcbiAgfVxuXG4gIHZhciB4MSA9IHMxLng7XG4gIHZhciB5MSA9IHMxLnk7XG4gIHZhciB4MiA9IHMyLng7XG4gIHZhciB5MiA9IHMyLnk7XG4gIHZhciB4MyA9IGYxLng7XG4gIHZhciB5MyA9IGYxLnk7XG4gIHZhciB4NCA9IGYyLng7XG4gIHZhciB5NCA9IGYyLnk7XG4gIHZhciB4ID0gdm9pZCAwLFxuICAgICAgeSA9IHZvaWQgMDsgLy8gaW50ZXJzZWN0aW9uIHBvaW50XG4gIHZhciBhMSA9IHZvaWQgMCxcbiAgICAgIGEyID0gdm9pZCAwLFxuICAgICAgYjEgPSB2b2lkIDAsXG4gICAgICBiMiA9IHZvaWQgMCxcbiAgICAgIGMxID0gdm9pZCAwLFxuICAgICAgYzIgPSB2b2lkIDA7IC8vIGNvZWZmaWNpZW50cyBvZiBsaW5lIGVxbnMuXG4gIHZhciBkZW5vbSA9IHZvaWQgMDtcblxuICBhMSA9IHkyIC0geTE7XG4gIGIxID0geDEgLSB4MjtcbiAgYzEgPSB4MiAqIHkxIC0geDEgKiB5MjsgLy8geyBhMSp4ICsgYjEqeSArIGMxID0gMCBpcyBsaW5lIDEgfVxuXG4gIGEyID0geTQgLSB5MztcbiAgYjIgPSB4MyAtIHg0O1xuICBjMiA9IHg0ICogeTMgLSB4MyAqIHk0OyAvLyB7IGEyKnggKyBiMip5ICsgYzIgPSAwIGlzIGxpbmUgMiB9XG5cbiAgZGVub20gPSBhMSAqIGIyIC0gYTIgKiBiMTtcblxuICBpZiAoZGVub20gPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHggPSAoYjEgKiBjMiAtIGIyICogYzEpIC8gZGVub207XG4gIHkgPSAoYTIgKiBjMSAtIGExICogYzIpIC8gZGVub207XG5cbiAgcmV0dXJuIG5ldyBQb2ludCh4LCB5KTtcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgZmluZHMgYW5kIHJldHVybnMgdGhlIGFuZ2xlIG9mIHRoZSB2ZWN0b3IgZnJvbSB0aGUgKyB4LWF4aXNcbiAqIGluIGNsb2Nrd2lzZSBkaXJlY3Rpb24gKGNvbXBhdGlibGUgdy8gSmF2YSBjb29yZGluYXRlIHN5c3RlbSEpLlxuICovXG5JR2VvbWV0cnkuYW5nbGVPZlZlY3RvciA9IGZ1bmN0aW9uIChDeCwgQ3ksIE54LCBOeSkge1xuICB2YXIgQ19hbmdsZSA9IHZvaWQgMDtcblxuICBpZiAoQ3ggIT09IE54KSB7XG4gICAgQ19hbmdsZSA9IE1hdGguYXRhbigoTnkgLSBDeSkgLyAoTnggLSBDeCkpO1xuXG4gICAgaWYgKE54IDwgQ3gpIHtcbiAgICAgIENfYW5nbGUgKz0gTWF0aC5QSTtcbiAgICB9IGVsc2UgaWYgKE55IDwgQ3kpIHtcbiAgICAgIENfYW5nbGUgKz0gdGhpcy5UV09fUEk7XG4gICAgfVxuICB9IGVsc2UgaWYgKE55IDwgQ3kpIHtcbiAgICBDX2FuZ2xlID0gdGhpcy5PTkVfQU5EX0hBTEZfUEk7IC8vIDI3MCBkZWdyZWVzXG4gIH0gZWxzZSB7XG4gICAgQ19hbmdsZSA9IHRoaXMuSEFMRl9QSTsgLy8gOTAgZGVncmVlc1xuICB9XG5cbiAgcmV0dXJuIENfYW5nbGU7XG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB0d28gbGluZSBzZWdtZW50cyAob25lIHdpdGggcG9pbnRcbiAqIHAxIGFuZCBwMiwgdGhlIG90aGVyIHdpdGggcG9pbnQgcDMgYW5kIHA0KSBpbnRlcnNlY3QgYXQgYSBwb2ludCBvdGhlclxuICogdGhhbiB0aGVzZSBwb2ludHMuXG4gKi9cbklHZW9tZXRyeS5kb0ludGVyc2VjdCA9IGZ1bmN0aW9uIChwMSwgcDIsIHAzLCBwNCkge1xuICB2YXIgYSA9IHAxLng7XG4gIHZhciBiID0gcDEueTtcbiAgdmFyIGMgPSBwMi54O1xuICB2YXIgZCA9IHAyLnk7XG4gIHZhciBwID0gcDMueDtcbiAgdmFyIHEgPSBwMy55O1xuICB2YXIgciA9IHA0Lng7XG4gIHZhciBzID0gcDQueTtcbiAgdmFyIGRldCA9IChjIC0gYSkgKiAocyAtIHEpIC0gKHIgLSBwKSAqIChkIC0gYik7XG5cbiAgaWYgKGRldCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGFtYmRhID0gKChzIC0gcSkgKiAociAtIGEpICsgKHAgLSByKSAqIChzIC0gYikpIC8gZGV0O1xuICAgIHZhciBnYW1tYSA9ICgoYiAtIGQpICogKHIgLSBhKSArIChjIC0gYSkgKiAocyAtIGIpKSAvIGRldDtcbiAgICByZXR1cm4gMCA8IGxhbWJkYSAmJiBsYW1iZGEgPCAxICYmIDAgPCBnYW1tYSAmJiBnYW1tYSA8IDE7XG4gIH1cbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGFuZCBjYWxjdWxhdGVzIHRoZSBpbnRlcnNlY3Rpb24gb2YgXG4gKiBhIGxpbmUgc2VnbWVudCBhbmQgYSBjaXJjbGUuXG4gKi9cbklHZW9tZXRyeS5maW5kQ2lyY2xlTGluZUludGVyc2VjdGlvbnMgPSBmdW5jdGlvbiAoRXgsIEV5LCBMeCwgTHksIEN4LCBDeSwgcikge1xuXG4gIC8vIEUgaXMgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSByYXksXG4gIC8vIEwgaXMgdGhlIGVuZCBwb2ludCBvZiB0aGUgcmF5LFxuICAvLyBDIGlzIHRoZSBjZW50ZXIgb2Ygc3BoZXJlIHlvdSdyZSB0ZXN0aW5nIGFnYWluc3RcbiAgLy8gciBpcyB0aGUgcmFkaXVzIG9mIHRoYXQgc3BoZXJlXG5cbiAgLy8gQ29tcHV0ZTpcbiAgLy8gZCA9IEwgLSBFICggRGlyZWN0aW9uIHZlY3RvciBvZiByYXksIGZyb20gc3RhcnQgdG8gZW5kIClcbiAgLy8gZiA9IEUgLSBDICggVmVjdG9yIGZyb20gY2VudGVyIHNwaGVyZSB0byByYXkgc3RhcnQgKVxuXG4gIC8vIFRoZW4gdGhlIGludGVyc2VjdGlvbiBpcyBmb3VuZCBieS4uXG4gIC8vIFAgPSBFICsgdCAqIGRcbiAgLy8gVGhpcyBpcyBhIHBhcmFtZXRyaWMgZXF1YXRpb246XG4gIC8vIFB4ID0gRXggKyB0ZHhcbiAgLy8gUHkgPSBFeSArIHRkeVxuXG4gIC8vIGdldCBhLCBiLCBjIHZhbHVlc1xuICB2YXIgYSA9IChMeCAtIEV4KSAqIChMeCAtIEV4KSArIChMeSAtIEV5KSAqIChMeSAtIEV5KTtcbiAgdmFyIGIgPSAyICogKChFeCAtIEN4KSAqIChMeCAtIEV4KSArIChFeSAtIEN5KSAqIChMeSAtIEV5KSk7XG4gIHZhciBjID0gKEV4IC0gQ3gpICogKEV4IC0gQ3gpICsgKEV5IC0gQ3kpICogKEV5IC0gQ3kpIC0gciAqIHI7XG5cbiAgLy8gZ2V0IGRpc2NyaW1pbmFudFxuICB2YXIgZGlzYyA9IGIgKiBiIC0gNCAqIGEgKiBjO1xuICBpZiAoZGlzYyA+PSAwKSB7XG4gICAgLy8gaW5zZXJ0IGludG8gcXVhZHJhdGljIGZvcm11bGFcbiAgICB2YXIgdDEgPSAoLWIgKyBNYXRoLnNxcnQoYiAqIGIgLSA0ICogYSAqIGMpKSAvICgyICogYSk7XG4gICAgdmFyIHQyID0gKC1iIC0gTWF0aC5zcXJ0KGIgKiBiIC0gNCAqIGEgKiBjKSkgLyAoMiAqIGEpO1xuICAgIHZhciBpbnRlcnNlY3Rpb25zID0gbnVsbDtcbiAgICBpZiAodDEgPj0gMCAmJiB0MSA8PSAxKSB7XG4gICAgICAvLyB0MSBpcyB0aGUgaW50ZXJzZWN0aW9uLCBhbmQgaXQncyBjbG9zZXIgdGhhbiB0MlxuICAgICAgLy8gKHNpbmNlIHQxIHVzZXMgLWIgLSBkaXNjcmltaW5hbnQpXG4gICAgICAvLyBJbXBhbGUsIFBva2VcbiAgICAgIHJldHVybiBbdDFdO1xuICAgIH1cblxuICAgIC8vIGhlcmUgdDEgZGlkbid0IGludGVyc2VjdCBzbyB3ZSBhcmUgZWl0aGVyIHN0YXJ0ZWRcbiAgICAvLyBpbnNpZGUgdGhlIHNwaGVyZSBvciBjb21wbGV0ZWx5IHBhc3QgaXRcbiAgICBpZiAodDIgPj0gMCAmJiB0MiA8PSAxKSB7XG4gICAgICAvLyBFeGl0V291bmRcbiAgICAgIHJldHVybiBbdDJdO1xuICAgIH1cblxuICAgIHJldHVybiBpbnRlcnNlY3Rpb25zO1xuICB9IGVsc2UgcmV0dXJuIG51bGw7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VjdGlvbjogQ2xhc3MgQ29uc3RhbnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBTb21lIHVzZWZ1bCBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHNcbiAqL1xuSUdlb21ldHJ5LkhBTEZfUEkgPSAwLjUgKiBNYXRoLlBJO1xuSUdlb21ldHJ5Lk9ORV9BTkRfSEFMRl9QSSA9IDEuNSAqIE1hdGguUEk7XG5JR2VvbWV0cnkuVFdPX1BJID0gMi4wICogTWF0aC5QSTtcbklHZW9tZXRyeS5USFJFRV9QSSA9IDMuMCAqIE1hdGguUEk7XG5cbm1vZHVsZS5leHBvcnRzID0gSUdlb21ldHJ5O1xuXG4vKioqLyB9KSxcbi8qIDkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gSU1hdGgoKSB7fVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpZ24gb2YgdGhlIGlucHV0IHZhbHVlLlxuICovXG5JTWF0aC5zaWduID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA+IDApIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIGlmICh2YWx1ZSA8IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbklNYXRoLmZsb29yID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA8IDAgPyBNYXRoLmNlaWwodmFsdWUpIDogTWF0aC5mbG9vcih2YWx1ZSk7XG59O1xuXG5JTWF0aC5jZWlsID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA8IDAgPyBNYXRoLmZsb29yKHZhbHVlKSA6IE1hdGguY2VpbCh2YWx1ZSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IElNYXRoO1xuXG4vKioqLyB9KSxcbi8qIDEwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIEludGVnZXIoKSB7fVxuXG5JbnRlZ2VyLk1BWF9WQUxVRSA9IDIxNDc0ODM2NDc7XG5JbnRlZ2VyLk1JTl9WQUxVRSA9IC0yMTQ3NDgzNjQ4O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEludGVnZXI7XG5cbi8qKiovIH0pLFxuLyogMTEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIG5vZGVGcm9tID0gZnVuY3Rpb24gbm9kZUZyb20odmFsdWUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBuZXh0OiBudWxsLCBwcmV2OiBudWxsIH07XG59O1xuXG52YXIgYWRkID0gZnVuY3Rpb24gYWRkKHByZXYsIG5vZGUsIG5leHQsIGxpc3QpIHtcbiAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICBwcmV2Lm5leHQgPSBub2RlO1xuICB9IGVsc2Uge1xuICAgIGxpc3QuaGVhZCA9IG5vZGU7XG4gIH1cblxuICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgIG5leHQucHJldiA9IG5vZGU7XG4gIH0gZWxzZSB7XG4gICAgbGlzdC50YWlsID0gbm9kZTtcbiAgfVxuXG4gIG5vZGUucHJldiA9IHByZXY7XG4gIG5vZGUubmV4dCA9IG5leHQ7XG5cbiAgbGlzdC5sZW5ndGgrKztcblxuICByZXR1cm4gbm9kZTtcbn07XG5cbnZhciBfcmVtb3ZlID0gZnVuY3Rpb24gX3JlbW92ZShub2RlLCBsaXN0KSB7XG4gIHZhciBwcmV2ID0gbm9kZS5wcmV2LFxuICAgICAgbmV4dCA9IG5vZGUubmV4dDtcblxuXG4gIGlmIChwcmV2ICE9PSBudWxsKSB7XG4gICAgcHJldi5uZXh0ID0gbmV4dDtcbiAgfSBlbHNlIHtcbiAgICBsaXN0LmhlYWQgPSBuZXh0O1xuICB9XG5cbiAgaWYgKG5leHQgIT09IG51bGwpIHtcbiAgICBuZXh0LnByZXYgPSBwcmV2O1xuICB9IGVsc2Uge1xuICAgIGxpc3QudGFpbCA9IHByZXY7XG4gIH1cblxuICBub2RlLnByZXYgPSBub2RlLm5leHQgPSBudWxsO1xuXG4gIGxpc3QubGVuZ3RoLS07XG5cbiAgcmV0dXJuIG5vZGU7XG59O1xuXG52YXIgTGlua2VkTGlzdCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTGlua2VkTGlzdCh2YWxzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMaW5rZWRMaXN0KTtcblxuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgIHRoaXMudGFpbCA9IG51bGw7XG5cbiAgICBpZiAodmFscyAhPSBudWxsKSB7XG4gICAgICB2YWxzLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLnB1c2godik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTGlua2VkTGlzdCwgW3tcbiAgICBrZXk6IFwic2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaXplKCkge1xuICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnNlcnRCZWZvcmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKHZhbCwgb3RoZXJOb2RlKSB7XG4gICAgICByZXR1cm4gYWRkKG90aGVyTm9kZS5wcmV2LCBub2RlRnJvbSh2YWwpLCBvdGhlck5vZGUsIHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnNlcnRBZnRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnRBZnRlcih2YWwsIG90aGVyTm9kZSkge1xuICAgICAgcmV0dXJuIGFkZChvdGhlck5vZGUsIG5vZGVGcm9tKHZhbCksIG90aGVyTm9kZS5uZXh0LCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5zZXJ0Tm9kZUJlZm9yZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnROb2RlQmVmb3JlKG5ld05vZGUsIG90aGVyTm9kZSkge1xuICAgICAgcmV0dXJuIGFkZChvdGhlck5vZGUucHJldiwgbmV3Tm9kZSwgb3RoZXJOb2RlLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5zZXJ0Tm9kZUFmdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluc2VydE5vZGVBZnRlcihuZXdOb2RlLCBvdGhlck5vZGUpIHtcbiAgICAgIHJldHVybiBhZGQob3RoZXJOb2RlLCBuZXdOb2RlLCBvdGhlck5vZGUubmV4dCwgdGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInB1c2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHVzaCh2YWwpIHtcbiAgICAgIHJldHVybiBhZGQodGhpcy50YWlsLCBub2RlRnJvbSh2YWwpLCBudWxsLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5zaGlmdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bnNoaWZ0KHZhbCkge1xuICAgICAgcmV0dXJuIGFkZChudWxsLCBub2RlRnJvbSh2YWwpLCB0aGlzLmhlYWQsIHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKG5vZGUpIHtcbiAgICAgIHJldHVybiBfcmVtb3ZlKG5vZGUsIHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwb3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcG9wKCkge1xuICAgICAgcmV0dXJuIF9yZW1vdmUodGhpcy50YWlsLCB0aGlzKS52YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicG9wTm9kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwb3BOb2RlKCkge1xuICAgICAgcmV0dXJuIF9yZW1vdmUodGhpcy50YWlsLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hpZnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnQoKSB7XG4gICAgICByZXR1cm4gX3JlbW92ZSh0aGlzLmhlYWQsIHRoaXMpLnZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaGlmdE5vZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnROb2RlKCkge1xuICAgICAgcmV0dXJuIF9yZW1vdmUodGhpcy5oZWFkLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0X29iamVjdF9hdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRfb2JqZWN0X2F0KGluZGV4KSB7XG4gICAgICBpZiAoaW5kZXggPD0gdGhpcy5sZW5ndGgoKSkge1xuICAgICAgICB2YXIgaSA9IDE7XG4gICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5oZWFkO1xuICAgICAgICB3aGlsZSAoaSA8IGluZGV4KSB7XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldF9vYmplY3RfYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0X29iamVjdF9hdChpbmRleCwgdmFsdWUpIHtcbiAgICAgIGlmIChpbmRleCA8PSB0aGlzLmxlbmd0aCgpKSB7XG4gICAgICAgIHZhciBpID0gMTtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmhlYWQ7XG4gICAgICAgIHdoaWxlIChpIDwgaW5kZXgpIHtcbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExpbmtlZExpc3Q7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTGlua2VkTGlzdDtcblxuLyoqKi8gfSksXG4vKiAxMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG4vKlxyXG4gKlRoaXMgY2xhc3MgaXMgdGhlIGphdmFzY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFBvaW50LmphdmEgY2xhc3MgaW4gamRrXHJcbiAqL1xuZnVuY3Rpb24gUG9pbnQoeCwgeSwgcCkge1xuICB0aGlzLnggPSBudWxsO1xuICB0aGlzLnkgPSBudWxsO1xuICBpZiAoeCA9PSBudWxsICYmIHkgPT0gbnVsbCAmJiBwID09IG51bGwpIHtcbiAgICB0aGlzLnggPSAwO1xuICAgIHRoaXMueSA9IDA7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHggPT0gJ251bWJlcicgJiYgdHlwZW9mIHkgPT0gJ251bWJlcicgJiYgcCA9PSBudWxsKSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICB9IGVsc2UgaWYgKHguY29uc3RydWN0b3IubmFtZSA9PSAnUG9pbnQnICYmIHkgPT0gbnVsbCAmJiBwID09IG51bGwpIHtcbiAgICBwID0geDtcbiAgICB0aGlzLnggPSBwLng7XG4gICAgdGhpcy55ID0gcC55O1xuICB9XG59XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy54O1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0TG9jYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcy54LCB0aGlzLnkpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLnNldExvY2F0aW9uID0gZnVuY3Rpb24gKHgsIHksIHApIHtcbiAgaWYgKHguY29uc3RydWN0b3IubmFtZSA9PSAnUG9pbnQnICYmIHkgPT0gbnVsbCAmJiBwID09IG51bGwpIHtcbiAgICBwID0geDtcbiAgICB0aGlzLnNldExvY2F0aW9uKHAueCwgcC55KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgeCA9PSAnbnVtYmVyJyAmJiB0eXBlb2YgeSA9PSAnbnVtYmVyJyAmJiBwID09IG51bGwpIHtcbiAgICAvL2lmIGJvdGggcGFyYW1ldGVycyBhcmUgaW50ZWdlciBqdXN0IG1vdmUgKHgseSkgbG9jYXRpb25cbiAgICBpZiAocGFyc2VJbnQoeCkgPT0geCAmJiBwYXJzZUludCh5KSA9PSB5KSB7XG4gICAgICB0aGlzLm1vdmUoeCwgeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMueCA9IE1hdGguZmxvb3IoeCArIDAuNSk7XG4gICAgICB0aGlzLnkgPSBNYXRoLmZsb29yKHkgKyAwLjUpO1xuICAgIH1cbiAgfVxufTtcblxuUG9pbnQucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbiAoeCwgeSkge1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xufTtcblxuUG9pbnQucHJvdG90eXBlLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIChkeCwgZHkpIHtcbiAgdGhpcy54ICs9IGR4O1xuICB0aGlzLnkgKz0gZHk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKG9iaikge1xuICBpZiAob2JqLmNvbnN0cnVjdG9yLm5hbWUgPT0gXCJQb2ludFwiKSB7XG4gICAgdmFyIHB0ID0gb2JqO1xuICAgIHJldHVybiB0aGlzLnggPT0gcHQueCAmJiB0aGlzLnkgPT0gcHQueTtcbiAgfVxuICByZXR1cm4gdGhpcyA9PSBvYmo7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgUG9pbnQoKS5jb25zdHJ1Y3Rvci5uYW1lICsgXCJbeD1cIiArIHRoaXMueCArIFwiLHk9XCIgKyB0aGlzLnkgKyBcIl1cIjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUG9pbnQ7XG5cbi8qKiovIH0pLFxuLyogMTMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gUmVjdGFuZ2xlRCh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHRoaXMueCA9IDA7XG4gIHRoaXMueSA9IDA7XG4gIHRoaXMud2lkdGggPSAwO1xuICB0aGlzLmhlaWdodCA9IDA7XG5cbiAgaWYgKHggIT0gbnVsbCAmJiB5ICE9IG51bGwgJiYgd2lkdGggIT0gbnVsbCAmJiBoZWlnaHQgIT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cbn1cblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMueDtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLnNldFggPSBmdW5jdGlvbiAoeCkge1xuICB0aGlzLnggPSB4O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMueTtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLnNldFkgPSBmdW5jdGlvbiAoeSkge1xuICB0aGlzLnkgPSB5O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcbiAgdGhpcy53aWR0aCA9IHdpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5oZWlnaHQ7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5zZXRIZWlnaHQgPSBmdW5jdGlvbiAoaGVpZ2h0KSB7XG4gIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0UmlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnggKyB0aGlzLndpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0Qm90dG9tID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy55ICsgdGhpcy5oZWlnaHQ7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5pbnRlcnNlY3RzID0gZnVuY3Rpb24gKGEpIHtcbiAgaWYgKHRoaXMuZ2V0UmlnaHQoKSA8IGEueCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0aGlzLmdldEJvdHRvbSgpIDwgYS55KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGEuZ2V0UmlnaHQoKSA8IHRoaXMueCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChhLmdldEJvdHRvbSgpIDwgdGhpcy55KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRDZW50ZXJYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy54ICsgdGhpcy53aWR0aCAvIDI7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRNaW5YID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5nZXRYKCk7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRNYXhYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5nZXRYKCkgKyB0aGlzLndpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0Q2VudGVyWSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMueSArIHRoaXMuaGVpZ2h0IC8gMjtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLmdldE1pblkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdldFkoKTtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLmdldE1heFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdldFkoKSArIHRoaXMuaGVpZ2h0O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0V2lkdGhIYWxmID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53aWR0aCAvIDI7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRIZWlnaHRIYWxmID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5oZWlnaHQgLyAyO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWN0YW5nbGVEO1xuXG4vKioqLyB9KSxcbi8qIDE0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuZnVuY3Rpb24gVW5pcXVlSURHZW5lcmV0b3IoKSB7fVxuXG5VbmlxdWVJREdlbmVyZXRvci5sYXN0SUQgPSAwO1xuXG5VbmlxdWVJREdlbmVyZXRvci5jcmVhdGVJRCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgaWYgKFVuaXF1ZUlER2VuZXJldG9yLmlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIGlmIChvYmoudW5pcXVlSUQgIT0gbnVsbCkge1xuICAgIHJldHVybiBvYmoudW5pcXVlSUQ7XG4gIH1cbiAgb2JqLnVuaXF1ZUlEID0gVW5pcXVlSURHZW5lcmV0b3IuZ2V0U3RyaW5nKCk7XG4gIFVuaXF1ZUlER2VuZXJldG9yLmxhc3RJRCsrO1xuICByZXR1cm4gb2JqLnVuaXF1ZUlEO1xufTtcblxuVW5pcXVlSURHZW5lcmV0b3IuZ2V0U3RyaW5nID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlmIChpZCA9PSBudWxsKSBpZCA9IFVuaXF1ZUlER2VuZXJldG9yLmxhc3RJRDtcbiAgcmV0dXJuIFwiT2JqZWN0I1wiICsgaWQgKyBcIlwiO1xufTtcblxuVW5pcXVlSURHZW5lcmV0b3IuaXNQcmltaXRpdmUgPSBmdW5jdGlvbiAoYXJnKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGFyZyA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKGFyZyk7XG4gIHJldHVybiBhcmcgPT0gbnVsbCB8fCB0eXBlICE9IFwib2JqZWN0XCIgJiYgdHlwZSAhPSBcImZ1bmN0aW9uXCI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVuaXF1ZUlER2VuZXJldG9yO1xuXG4vKioqLyB9KSxcbi8qIDE1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG52YXIgTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbnZhciBMR3JhcGhNYW5hZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcbnZhciBMTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG52YXIgTEVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xudmFyIExHcmFwaCA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG52YXIgUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcbnZhciBUcmFuc2Zvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KTtcbnZhciBFbWl0dGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSk7XG5cbmZ1bmN0aW9uIExheW91dChpc1JlbW90ZVVzZSkge1xuICBFbWl0dGVyLmNhbGwodGhpcyk7XG5cbiAgLy9MYXlvdXQgUXVhbGl0eTogMDpkcmFmdCwgMTpkZWZhdWx0LCAyOnByb29mXG4gIHRoaXMubGF5b3V0UXVhbGl0eSA9IExheW91dENvbnN0YW50cy5RVUFMSVRZO1xuICAvL1doZXRoZXIgbGF5b3V0IHNob3VsZCBjcmVhdGUgYmVuZHBvaW50cyBhcyBuZWVkZWQgb3Igbm90XG4gIHRoaXMuY3JlYXRlQmVuZHNBc05lZWRlZCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0NSRUFURV9CRU5EU19BU19ORUVERUQ7XG4gIC8vV2hldGhlciBsYXlvdXQgc2hvdWxkIGJlIGluY3JlbWVudGFsIG9yIG5vdFxuICB0aGlzLmluY3JlbWVudGFsID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUw7XG4gIC8vV2hldGhlciB3ZSBhbmltYXRlIGZyb20gYmVmb3JlIHRvIGFmdGVyIGxheW91dCBub2RlIHBvc2l0aW9uc1xuICB0aGlzLmFuaW1hdGlvbk9uTGF5b3V0ID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX09OX0xBWU9VVDtcbiAgLy9XaGV0aGVyIHdlIGFuaW1hdGUgdGhlIGxheW91dCBwcm9jZXNzIG9yIG5vdFxuICB0aGlzLmFuaW1hdGlvbkR1cmluZ0xheW91dCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0FOSU1BVElPTl9EVVJJTkdfTEFZT1VUO1xuICAvL051bWJlciBpdGVyYXRpb25zIHRoYXQgc2hvdWxkIGJlIGRvbmUgYmV0d2VlbiB0d28gc3VjY2Vzc2l2ZSBhbmltYXRpb25zXG4gIHRoaXMuYW5pbWF0aW9uUGVyaW9kID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX1BFUklPRDtcbiAgLyoqXHJcbiAgICogV2hldGhlciBvciBub3QgbGVhZiBub2RlcyAobm9uLWNvbXBvdW5kIG5vZGVzKSBhcmUgb2YgdW5pZm9ybSBzaXplcy4gV2hlblxyXG4gICAqIHRoZXkgYXJlLCBib3RoIHNwcmluZyBhbmQgcmVwdWxzaW9uIGZvcmNlcyBiZXR3ZWVuIHR3byBsZWFmIG5vZGVzIGNhbiBiZVxyXG4gICAqIGNhbGN1bGF0ZWQgd2l0aG91dCB0aGUgZXhwZW5zaXZlIGNsaXBwaW5nIHBvaW50IGNhbGN1bGF0aW9ucywgcmVzdWx0aW5nXHJcbiAgICogaW4gbWFqb3Igc3BlZWQtdXAuXHJcbiAgICovXG4gIHRoaXMudW5pZm9ybUxlYWZOb2RlU2l6ZXMgPSBMYXlvdXRDb25zdGFudHMuREVGQVVMVF9VTklGT1JNX0xFQUZfTk9ERV9TSVpFUztcbiAgLyoqXHJcbiAgICogVGhpcyBpcyB1c2VkIGZvciBjcmVhdGlvbiBvZiBiZW5kcG9pbnRzIGJ5IHVzaW5nIGR1bW15IG5vZGVzIGFuZCBlZGdlcy5cclxuICAgKiBNYXBzIGFuIExFZGdlIHRvIGl0cyBkdW1teSBiZW5kcG9pbnQgcGF0aC5cclxuICAgKi9cbiAgdGhpcy5lZGdlVG9EdW1teU5vZGVzID0gbmV3IE1hcCgpO1xuICB0aGlzLmdyYXBoTWFuYWdlciA9IG5ldyBMR3JhcGhNYW5hZ2VyKHRoaXMpO1xuICB0aGlzLmlzTGF5b3V0RmluaXNoZWQgPSBmYWxzZTtcbiAgdGhpcy5pc1N1YkxheW91dCA9IGZhbHNlO1xuICB0aGlzLmlzUmVtb3RlVXNlID0gZmFsc2U7XG5cbiAgaWYgKGlzUmVtb3RlVXNlICE9IG51bGwpIHtcbiAgICB0aGlzLmlzUmVtb3RlVXNlID0gaXNSZW1vdGVVc2U7XG4gIH1cbn1cblxuTGF5b3V0LlJBTkRPTV9TRUVEID0gMTtcblxuTGF5b3V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRW1pdHRlci5wcm90b3R5cGUpO1xuXG5MYXlvdXQucHJvdG90eXBlLmdldEdyYXBoTWFuYWdlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhNYW5hZ2VyO1xufTtcblxuTGF5b3V0LnByb3RvdHlwZS5nZXRBbGxOb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbE5vZGVzKCk7XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLmdldEFsbEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsRWRnZXMoKTtcbn07XG5cbkxheW91dC5wcm90b3R5cGUuZ2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbigpO1xufTtcblxuTGF5b3V0LnByb3RvdHlwZS5uZXdHcmFwaE1hbmFnZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBnbSA9IG5ldyBMR3JhcGhNYW5hZ2VyKHRoaXMpO1xuICB0aGlzLmdyYXBoTWFuYWdlciA9IGdtO1xuICByZXR1cm4gZ207XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLm5ld0dyYXBoID0gZnVuY3Rpb24gKHZHcmFwaCkge1xuICByZXR1cm4gbmV3IExHcmFwaChudWxsLCB0aGlzLmdyYXBoTWFuYWdlciwgdkdyYXBoKTtcbn07XG5cbkxheW91dC5wcm90b3R5cGUubmV3Tm9kZSA9IGZ1bmN0aW9uICh2Tm9kZSkge1xuICByZXR1cm4gbmV3IExOb2RlKHRoaXMuZ3JhcGhNYW5hZ2VyLCB2Tm9kZSk7XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLm5ld0VkZ2UgPSBmdW5jdGlvbiAodkVkZ2UpIHtcbiAgcmV0dXJuIG5ldyBMRWRnZShudWxsLCBudWxsLCB2RWRnZSk7XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLmNoZWNrTGF5b3V0U3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKSA9PSBudWxsIHx8IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS5nZXROb2RlcygpLmxlbmd0aCA9PSAwIHx8IHRoaXMuZ3JhcGhNYW5hZ2VyLmluY2x1ZGVzSW52YWxpZEVkZ2UoKTtcbn07XG5cbkxheW91dC5wcm90b3R5cGUucnVuTGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmlzTGF5b3V0RmluaXNoZWQgPSBmYWxzZTtcblxuICBpZiAodGhpcy50aWxpbmdQcmVMYXlvdXQpIHtcbiAgICB0aGlzLnRpbGluZ1ByZUxheW91dCgpO1xuICB9XG5cbiAgdGhpcy5pbml0UGFyYW1ldGVycygpO1xuICB2YXIgaXNMYXlvdXRTdWNjZXNzZnVsbDtcblxuICBpZiAodGhpcy5jaGVja0xheW91dFN1Y2Nlc3MoKSkge1xuICAgIGlzTGF5b3V0U3VjY2Vzc2Z1bGwgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBpc0xheW91dFN1Y2Nlc3NmdWxsID0gdGhpcy5sYXlvdXQoKTtcbiAgfVxuXG4gIGlmIChMYXlvdXRDb25zdGFudHMuQU5JTUFURSA9PT0gJ2R1cmluZycpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgJ2R1cmluZycgbGF5b3V0IGFuaW1hdGlvbi4gTGF5b3V0IGlzIG5vdCBmaW5pc2hlZCB5ZXQuIFxuICAgIC8vIFdlIG5lZWQgdG8gcGVyZm9ybSB0aGVzZSBpbiBpbmRleC5qcyB3aGVuIGxheW91dCBpcyByZWFsbHkgZmluaXNoZWQuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzTGF5b3V0U3VjY2Vzc2Z1bGwpIHtcbiAgICBpZiAoIXRoaXMuaXNTdWJMYXlvdXQpIHtcbiAgICAgIHRoaXMuZG9Qb3N0TGF5b3V0KCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMudGlsaW5nUG9zdExheW91dCkge1xuICAgIHRoaXMudGlsaW5nUG9zdExheW91dCgpO1xuICB9XG5cbiAgdGhpcy5pc0xheW91dEZpbmlzaGVkID0gdHJ1ZTtcblxuICByZXR1cm4gaXNMYXlvdXRTdWNjZXNzZnVsbDtcbn07XG5cbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyB0aGUgb3BlcmF0aW9ucyByZXF1aXJlZCBhZnRlciBsYXlvdXQuXHJcbiAqL1xuTGF5b3V0LnByb3RvdHlwZS5kb1Bvc3RMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIC8vYXNzZXJ0ICFpc1N1YkxheW91dCA6IFwiU2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gc3ViLWxheW91dCFcIjtcbiAgLy8gUHJvcGFnYXRlIGdlb21ldHJpYyBjaGFuZ2VzIHRvIHYtbGV2ZWwgb2JqZWN0c1xuICBpZiAoIXRoaXMuaW5jcmVtZW50YWwpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSgpO1xuICB9XG4gIHRoaXMudXBkYXRlKCk7XG59O1xuXG4vKipcclxuICogVGhpcyBtZXRob2QgdXBkYXRlcyB0aGUgZ2VvbWV0cnkgb2YgdGhlIHRhcmdldCBncmFwaCBhY2NvcmRpbmcgdG9cclxuICogY2FsY3VsYXRlZCBsYXlvdXQuXHJcbiAqL1xuTGF5b3V0LnByb3RvdHlwZS51cGRhdGUyID0gZnVuY3Rpb24gKCkge1xuICAvLyB1cGRhdGUgYmVuZCBwb2ludHNcbiAgaWYgKHRoaXMuY3JlYXRlQmVuZHNBc05lZWRlZCkge1xuICAgIHRoaXMuY3JlYXRlQmVuZHBvaW50c0Zyb21EdW1teU5vZGVzKCk7XG5cbiAgICAvLyByZXNldCBhbGwgZWRnZXMsIHNpbmNlIHRoZSB0b3BvbG9neSBoYXMgY2hhbmdlZFxuICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsRWRnZXMoKTtcbiAgfVxuXG4gIC8vIHBlcmZvcm0gZWRnZSwgbm9kZSBhbmQgcm9vdCB1cGRhdGVzIGlmIGxheW91dCBpcyBub3QgY2FsbGVkXG4gIC8vIHJlbW90ZWx5XG4gIGlmICghdGhpcy5pc1JlbW90ZVVzZSkge1xuICAgIC8vIHVwZGF0ZSBhbGwgZWRnZXNcbiAgICB2YXIgZWRnZTtcbiAgICB2YXIgYWxsRWRnZXMgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxFZGdlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsRWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGVkZ2UgPSBhbGxFZGdlc1tpXTtcbiAgICAgIC8vICAgICAgdGhpcy51cGRhdGUoZWRnZSk7XG4gICAgfVxuXG4gICAgLy8gcmVjdXJzaXZlbHkgdXBkYXRlIG5vZGVzXG4gICAgdmFyIG5vZGU7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldE5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgLy8gICAgICB0aGlzLnVwZGF0ZShub2RlKTtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgcm9vdCBncmFwaFxuICAgIHRoaXMudXBkYXRlKHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKSk7XG4gIH1cbn07XG5cbkxheW91dC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKG9iaikge1xuICBpZiAob2JqID09IG51bGwpIHtcbiAgICB0aGlzLnVwZGF0ZTIoKTtcbiAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBMTm9kZSkge1xuICAgIHZhciBub2RlID0gb2JqO1xuICAgIGlmIChub2RlLmdldENoaWxkKCkgIT0gbnVsbCkge1xuICAgICAgLy8gc2luY2Ugbm9kZSBpcyBjb21wb3VuZCwgcmVjdXJzaXZlbHkgdXBkYXRlIGNoaWxkIG5vZGVzXG4gICAgICB2YXIgbm9kZXMgPSBub2RlLmdldENoaWxkKCkuZ2V0Tm9kZXMoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdXBkYXRlKG5vZGVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgbC1sZXZlbCBub2RlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHYtbGV2ZWwgZ3JhcGggb2JqZWN0LFxuICAgIC8vIHRoZW4gaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSB2LWxldmVsIG5vZGUgaW1wbGVtZW50cyB0aGVcbiAgICAvLyBpbnRlcmZhY2UgVXBkYXRhYmxlLlxuICAgIGlmIChub2RlLnZHcmFwaE9iamVjdCAhPSBudWxsKSB7XG4gICAgICAvLyBjYXN0IHRvIFVwZGF0YWJsZSB3aXRob3V0IGFueSB0eXBlIGNoZWNrXG4gICAgICB2YXIgdk5vZGUgPSBub2RlLnZHcmFwaE9iamVjdDtcblxuICAgICAgLy8gY2FsbCB0aGUgdXBkYXRlIG1ldGhvZCBvZiB0aGUgaW50ZXJmYWNlXG4gICAgICB2Tm9kZS51cGRhdGUobm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExFZGdlKSB7XG4gICAgdmFyIGVkZ2UgPSBvYmo7XG4gICAgLy8gaWYgdGhlIGwtbGV2ZWwgZWRnZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB2LWxldmVsIGdyYXBoIG9iamVjdCxcbiAgICAvLyB0aGVuIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgdi1sZXZlbCBlZGdlIGltcGxlbWVudHMgdGhlXG4gICAgLy8gaW50ZXJmYWNlIFVwZGF0YWJsZS5cblxuICAgIGlmIChlZGdlLnZHcmFwaE9iamVjdCAhPSBudWxsKSB7XG4gICAgICAvLyBjYXN0IHRvIFVwZGF0YWJsZSB3aXRob3V0IGFueSB0eXBlIGNoZWNrXG4gICAgICB2YXIgdkVkZ2UgPSBlZGdlLnZHcmFwaE9iamVjdDtcblxuICAgICAgLy8gY2FsbCB0aGUgdXBkYXRlIG1ldGhvZCBvZiB0aGUgaW50ZXJmYWNlXG4gICAgICB2RWRnZS51cGRhdGUoZWRnZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExHcmFwaCkge1xuICAgIHZhciBncmFwaCA9IG9iajtcbiAgICAvLyBpZiB0aGUgbC1sZXZlbCBncmFwaCBpcyBhc3NvY2lhdGVkIHdpdGggYSB2LWxldmVsIGdyYXBoIG9iamVjdCxcbiAgICAvLyB0aGVuIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgdi1sZXZlbCBvYmplY3QgaW1wbGVtZW50cyB0aGVcbiAgICAvLyBpbnRlcmZhY2UgVXBkYXRhYmxlLlxuXG4gICAgaWYgKGdyYXBoLnZHcmFwaE9iamVjdCAhPSBudWxsKSB7XG4gICAgICAvLyBjYXN0IHRvIFVwZGF0YWJsZSB3aXRob3V0IGFueSB0eXBlIGNoZWNrXG4gICAgICB2YXIgdkdyYXBoID0gZ3JhcGgudkdyYXBoT2JqZWN0O1xuXG4gICAgICAvLyBjYWxsIHRoZSB1cGRhdGUgbWV0aG9kIG9mIHRoZSBpbnRlcmZhY2VcbiAgICAgIHZHcmFwaC51cGRhdGUoZ3JhcGgpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXHJcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IGFsbCBsYXlvdXQgcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlc1xyXG4gKiBkZXRlcm1pbmVkIGF0IGNvbXBpbGUgdGltZS5cclxuICovXG5MYXlvdXQucHJvdG90eXBlLmluaXRQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuaXNTdWJMYXlvdXQpIHtcbiAgICB0aGlzLmxheW91dFF1YWxpdHkgPSBMYXlvdXRDb25zdGFudHMuUVVBTElUWTtcbiAgICB0aGlzLmFuaW1hdGlvbkR1cmluZ0xheW91dCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0FOSU1BVElPTl9EVVJJTkdfTEFZT1VUO1xuICAgIHRoaXMuYW5pbWF0aW9uUGVyaW9kID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX1BFUklPRDtcbiAgICB0aGlzLmFuaW1hdGlvbk9uTGF5b3V0ID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX09OX0xBWU9VVDtcbiAgICB0aGlzLmluY3JlbWVudGFsID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUw7XG4gICAgdGhpcy5jcmVhdGVCZW5kc0FzTmVlZGVkID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ1JFQVRFX0JFTkRTX0FTX05FRURFRDtcbiAgICB0aGlzLnVuaWZvcm1MZWFmTm9kZVNpemVzID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfVU5JRk9STV9MRUFGX05PREVfU0laRVM7XG4gIH1cblxuICBpZiAodGhpcy5hbmltYXRpb25EdXJpbmdMYXlvdXQpIHtcbiAgICB0aGlzLmFuaW1hdGlvbk9uTGF5b3V0ID0gZmFsc2U7XG4gIH1cbn07XG5cbkxheW91dC5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKG5ld0xlZnRUb3ApIHtcbiAgaWYgKG5ld0xlZnRUb3AgPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0obmV3IFBvaW50RCgwLCAwKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gY3JlYXRlIGEgdHJhbnNmb3JtYXRpb24gb2JqZWN0IChmcm9tIEVjbGlwc2UgdG8gbGF5b3V0KS4gV2hlbiBhblxuICAgIC8vIGludmVyc2UgdHJhbnNmb3JtIGlzIGFwcGxpZWQsIHdlIGdldCB1cHBlci1sZWZ0IGNvb3JkaW5hdGUgb2YgdGhlXG4gICAgLy8gZHJhd2luZyBvciB0aGUgcm9vdCBncmFwaCBhdCBnaXZlbiBpbnB1dCBjb29yZGluYXRlIChzb21lIG1hcmdpbnNcbiAgICAvLyBhbHJlYWR5IGluY2x1ZGVkIGluIGNhbGN1bGF0aW9uIG9mIGxlZnQtdG9wKS5cblxuICAgIHZhciB0cmFucyA9IG5ldyBUcmFuc2Zvcm0oKTtcbiAgICB2YXIgbGVmdFRvcCA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS51cGRhdGVMZWZ0VG9wKCk7XG5cbiAgICBpZiAobGVmdFRvcCAhPSBudWxsKSB7XG4gICAgICB0cmFucy5zZXRXb3JsZE9yZ1gobmV3TGVmdFRvcC54KTtcbiAgICAgIHRyYW5zLnNldFdvcmxkT3JnWShuZXdMZWZ0VG9wLnkpO1xuXG4gICAgICB0cmFucy5zZXREZXZpY2VPcmdYKGxlZnRUb3AueCk7XG4gICAgICB0cmFucy5zZXREZXZpY2VPcmdZKGxlZnRUb3AueSk7XG5cbiAgICAgIHZhciBub2RlcyA9IHRoaXMuZ2V0QWxsTm9kZXMoKTtcbiAgICAgIHZhciBub2RlO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgbm9kZS50cmFuc2Zvcm0odHJhbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuTGF5b3V0LnByb3RvdHlwZS5wb3NpdGlvbk5vZGVzUmFuZG9tbHkgPSBmdW5jdGlvbiAoZ3JhcGgpIHtcblxuICBpZiAoZ3JhcGggPT0gdW5kZWZpbmVkKSB7XG4gICAgLy9hc3NlcnQgIXRoaXMuaW5jcmVtZW50YWw7XG4gICAgdGhpcy5wb3NpdGlvbk5vZGVzUmFuZG9tbHkodGhpcy5nZXRHcmFwaE1hbmFnZXIoKS5nZXRSb290KCkpO1xuICAgIHRoaXMuZ2V0R3JhcGhNYW5hZ2VyKCkuZ2V0Um9vdCgpLnVwZGF0ZUJvdW5kcyh0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbE5vZGU7XG4gICAgdmFyIGNoaWxkR3JhcGg7XG5cbiAgICB2YXIgbm9kZXMgPSBncmFwaC5nZXROb2RlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxOb2RlID0gbm9kZXNbaV07XG4gICAgICBjaGlsZEdyYXBoID0gbE5vZGUuZ2V0Q2hpbGQoKTtcblxuICAgICAgaWYgKGNoaWxkR3JhcGggPT0gbnVsbCkge1xuICAgICAgICBsTm9kZS5zY2F0dGVyKCk7XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkR3JhcGguZ2V0Tm9kZXMoKS5sZW5ndGggPT0gMCkge1xuICAgICAgICBsTm9kZS5zY2F0dGVyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvc2l0aW9uTm9kZXNSYW5kb21seShjaGlsZEdyYXBoKTtcbiAgICAgICAgbE5vZGUudXBkYXRlQm91bmRzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vKipcclxuICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgdHJlZXMgd2hlcmUgZWFjaCB0cmVlIGlzIHJlcHJlc2VudGVkIGFzIGFcclxuICogbGlzdCBvZiBsLW5vZGVzLiBUaGUgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIHNpemUgMCB3aGVuOlxyXG4gKiAtIFRoZSBncmFwaCBpcyBub3QgZmxhdCBvclxyXG4gKiAtIE9uZSBvZiB0aGUgY29tcG9uZW50KHMpIG9mIHRoZSBncmFwaCBpcyBub3QgYSB0cmVlLlxyXG4gKi9cbkxheW91dC5wcm90b3R5cGUuZ2V0RmxhdEZvcmVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZsYXRGb3Jlc3QgPSBbXTtcbiAgdmFyIGlzRm9yZXN0ID0gdHJ1ZTtcblxuICAvLyBRdWljayByZWZlcmVuY2UgZm9yIGFsbCBub2RlcyBpbiB0aGUgZ3JhcGggbWFuYWdlciBhc3NvY2lhdGVkIHdpdGhcbiAgLy8gdGhpcyBsYXlvdXQuIFRoZSBsaXN0IHNob3VsZCBub3QgYmUgY2hhbmdlZC5cbiAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldE5vZGVzKCk7XG5cbiAgLy8gRmlyc3QgYmUgc3VyZSB0aGF0IHRoZSBncmFwaCBpcyBmbGF0XG4gIHZhciBpc0ZsYXQgPSB0cnVlO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYWxsTm9kZXNbaV0uZ2V0Q2hpbGQoKSAhPSBudWxsKSB7XG4gICAgICBpc0ZsYXQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm4gZW1wdHkgZm9yZXN0IGlmIHRoZSBncmFwaCBpcyBub3QgZmxhdC5cbiAgaWYgKCFpc0ZsYXQpIHtcbiAgICByZXR1cm4gZmxhdEZvcmVzdDtcbiAgfVxuXG4gIC8vIFJ1biBCRlMgZm9yIGVhY2ggY29tcG9uZW50IG9mIHRoZSBncmFwaC5cblxuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIHRvQmVWaXNpdGVkID0gW107XG4gIHZhciBwYXJlbnRzID0gbmV3IE1hcCgpO1xuICB2YXIgdW5Qcm9jZXNzZWROb2RlcyA9IFtdO1xuXG4gIHVuUHJvY2Vzc2VkTm9kZXMgPSB1blByb2Nlc3NlZE5vZGVzLmNvbmNhdChhbGxOb2Rlcyk7XG5cbiAgLy8gRWFjaCBpdGVyYXRpb24gb2YgdGhpcyBsb29wIGZpbmRzIGEgY29tcG9uZW50IG9mIHRoZSBncmFwaCBhbmRcbiAgLy8gZGVjaWRlcyB3aGV0aGVyIGl0IGlzIGEgdHJlZSBvciBub3QuIElmIGl0IGlzIGEgdHJlZSwgYWRkcyBpdCB0byB0aGVcbiAgLy8gZm9yZXN0IGFuZCBjb250aW51ZWQgd2l0aCB0aGUgbmV4dCBjb21wb25lbnQuXG5cbiAgd2hpbGUgKHVuUHJvY2Vzc2VkTm9kZXMubGVuZ3RoID4gMCAmJiBpc0ZvcmVzdCkge1xuICAgIHRvQmVWaXNpdGVkLnB1c2godW5Qcm9jZXNzZWROb2Rlc1swXSk7XG5cbiAgICAvLyBTdGFydCB0aGUgQkZTLiBFYWNoIGl0ZXJhdGlvbiBvZiB0aGlzIGxvb3AgdmlzaXRzIGEgbm9kZSBpbiBhXG4gICAgLy8gQkZTIG1hbm5lci5cbiAgICB3aGlsZSAodG9CZVZpc2l0ZWQubGVuZ3RoID4gMCAmJiBpc0ZvcmVzdCkge1xuICAgICAgLy9wb29sIG9wZXJhdGlvblxuICAgICAgdmFyIGN1cnJlbnROb2RlID0gdG9CZVZpc2l0ZWRbMF07XG4gICAgICB0b0JlVmlzaXRlZC5zcGxpY2UoMCwgMSk7XG4gICAgICB2aXNpdGVkLmFkZChjdXJyZW50Tm9kZSk7XG5cbiAgICAgIC8vIFRyYXZlcnNlIGFsbCBuZWlnaGJvcnMgb2YgdGhpcyBub2RlXG4gICAgICB2YXIgbmVpZ2hib3JFZGdlcyA9IGN1cnJlbnROb2RlLmdldEVkZ2VzKCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVpZ2hib3JFZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY3VycmVudE5laWdoYm9yID0gbmVpZ2hib3JFZGdlc1tpXS5nZXRPdGhlckVuZChjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgLy8gSWYgQkZTIGlzIG5vdCBncm93aW5nIGZyb20gdGhpcyBuZWlnaGJvci5cbiAgICAgICAgaWYgKHBhcmVudHMuZ2V0KGN1cnJlbnROb2RlKSAhPSBjdXJyZW50TmVpZ2hib3IpIHtcbiAgICAgICAgICAvLyBXZSBoYXZlbid0IHByZXZpb3VzbHkgdmlzaXRlZCB0aGlzIG5laWdoYm9yLlxuICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMoY3VycmVudE5laWdoYm9yKSkge1xuICAgICAgICAgICAgdG9CZVZpc2l0ZWQucHVzaChjdXJyZW50TmVpZ2hib3IpO1xuICAgICAgICAgICAgcGFyZW50cy5zZXQoY3VycmVudE5laWdoYm9yLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNpbmNlIHdlIGhhdmUgcHJldmlvdXNseSB2aXNpdGVkIHRoaXMgbmVpZ2hib3IgYW5kXG4gICAgICAgICAgLy8gdGhpcyBuZWlnaGJvciBpcyBub3QgcGFyZW50IG9mIGN1cnJlbnROb2RlLCBnaXZlblxuICAgICAgICAgIC8vIGdyYXBoIGNvbnRhaW5zIGEgY29tcG9uZW50IHRoYXQgaXMgbm90IHRyZWUsIGhlbmNlXG4gICAgICAgICAgLy8gaXQgaXMgbm90IGEgZm9yZXN0LlxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBpc0ZvcmVzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBncmFwaCBjb250YWlucyBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCBhIHRyZWUuIEVtcHR5XG4gICAgLy8gcHJldmlvdXNseSBmb3VuZCB0cmVlcy4gVGhlIG1ldGhvZCB3aWxsIGVuZC5cbiAgICBpZiAoIWlzRm9yZXN0KSB7XG4gICAgICBmbGF0Rm9yZXN0ID0gW107XG4gICAgfVxuICAgIC8vIFNhdmUgY3VycmVudGx5IHZpc2l0ZWQgbm9kZXMgYXMgYSB0cmVlIGluIG91ciBmb3Jlc3QuIFJlc2V0XG4gICAgLy8gdmlzaXRlZCBhbmQgcGFyZW50cyBsaXN0cy4gQ29udGludWUgd2l0aCB0aGUgbmV4dCBjb21wb25lbnQgb2ZcbiAgICAvLyB0aGUgZ3JhcGgsIGlmIGFueS5cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHRlbXAgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHZpc2l0ZWQpKTtcbiAgICAgICAgZmxhdEZvcmVzdC5wdXNoKHRlbXApO1xuICAgICAgICAvL2ZsYXRGb3Jlc3QgPSBmbGF0Rm9yZXN0LmNvbmNhdCh0ZW1wKTtcbiAgICAgICAgLy91blByb2Nlc3NlZE5vZGVzLnJlbW92ZUFsbCh2aXNpdGVkKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZW1wLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gdGVtcFtpXTtcbiAgICAgICAgICB2YXIgaW5kZXggPSB1blByb2Nlc3NlZE5vZGVzLmluZGV4T2YodmFsdWUpO1xuICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB1blByb2Nlc3NlZE5vZGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgIHBhcmVudHMgPSBuZXcgTWFwKCk7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gZmxhdEZvcmVzdDtcbn07XG5cbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGR1bW15IG5vZGVzIChhbiBsLWxldmVsIG5vZGUgd2l0aCBtaW5pbWFsIGRpbWVuc2lvbnMpXHJcbiAqIGZvciB0aGUgZ2l2ZW4gZWRnZSAob25lIHBlciBiZW5kcG9pbnQpLiBUaGUgZXhpc3RpbmcgbC1sZXZlbCBzdHJ1Y3R1cmVcclxuICogaXMgdXBkYXRlZCBhY2NvcmRpbmdseS5cclxuICovXG5MYXlvdXQucHJvdG90eXBlLmNyZWF0ZUR1bW15Tm9kZXNGb3JCZW5kcG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIGR1bW15Tm9kZXMgPSBbXTtcbiAgdmFyIHByZXYgPSBlZGdlLnNvdXJjZTtcblxuICB2YXIgZ3JhcGggPSB0aGlzLmdyYXBoTWFuYWdlci5jYWxjTG93ZXN0Q29tbW9uQW5jZXN0b3IoZWRnZS5zb3VyY2UsIGVkZ2UudGFyZ2V0KTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2UuYmVuZHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgIC8vIGNyZWF0ZSBuZXcgZHVtbXkgbm9kZVxuICAgIHZhciBkdW1teU5vZGUgPSB0aGlzLm5ld05vZGUobnVsbCk7XG4gICAgZHVtbXlOb2RlLnNldFJlY3QobmV3IFBvaW50KDAsIDApLCBuZXcgRGltZW5zaW9uKDEsIDEpKTtcblxuICAgIGdyYXBoLmFkZChkdW1teU5vZGUpO1xuXG4gICAgLy8gY3JlYXRlIG5ldyBkdW1teSBlZGdlIGJldHdlZW4gcHJldiBhbmQgZHVtbXkgbm9kZVxuICAgIHZhciBkdW1teUVkZ2UgPSB0aGlzLm5ld0VkZ2UobnVsbCk7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIuYWRkKGR1bW15RWRnZSwgcHJldiwgZHVtbXlOb2RlKTtcblxuICAgIGR1bW15Tm9kZXMuYWRkKGR1bW15Tm9kZSk7XG4gICAgcHJldiA9IGR1bW15Tm9kZTtcbiAgfVxuXG4gIHZhciBkdW1teUVkZ2UgPSB0aGlzLm5ld0VkZ2UobnVsbCk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLmFkZChkdW1teUVkZ2UsIHByZXYsIGVkZ2UudGFyZ2V0KTtcblxuICB0aGlzLmVkZ2VUb0R1bW15Tm9kZXMuc2V0KGVkZ2UsIGR1bW15Tm9kZXMpO1xuXG4gIC8vIHJlbW92ZSByZWFsIGVkZ2UgZnJvbSBncmFwaCBtYW5hZ2VyIGlmIGl0IGlzIGludGVyLWdyYXBoXG4gIGlmIChlZGdlLmlzSW50ZXJHcmFwaCgpKSB7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIucmVtb3ZlKGVkZ2UpO1xuICB9XG4gIC8vIGVsc2UsIHJlbW92ZSB0aGUgZWRnZSBmcm9tIHRoZSBjdXJyZW50IGdyYXBoXG4gIGVsc2Uge1xuICAgICAgZ3JhcGgucmVtb3ZlKGVkZ2UpO1xuICAgIH1cblxuICByZXR1cm4gZHVtbXlOb2Rlcztcbn07XG5cbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGJlbmRwb2ludHMgZm9yIGVkZ2VzIGZyb20gdGhlIGR1bW15IG5vZGVzXHJcbiAqIGF0IGwtbGV2ZWwuXHJcbiAqL1xuTGF5b3V0LnByb3RvdHlwZS5jcmVhdGVCZW5kcG9pbnRzRnJvbUR1bW15Tm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlZGdlcyA9IFtdO1xuICBlZGdlcyA9IGVkZ2VzLmNvbmNhdCh0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxFZGdlcygpKTtcbiAgZWRnZXMgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHRoaXMuZWRnZVRvRHVtbXlOb2Rlcy5rZXlzKCkpKS5jb25jYXQoZWRnZXMpO1xuXG4gIGZvciAodmFyIGsgPSAwOyBrIDwgZWRnZXMubGVuZ3RoOyBrKyspIHtcbiAgICB2YXIgbEVkZ2UgPSBlZGdlc1trXTtcblxuICAgIGlmIChsRWRnZS5iZW5kcG9pbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBwYXRoID0gdGhpcy5lZGdlVG9EdW1teU5vZGVzLmdldChsRWRnZSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZHVtbXlOb2RlID0gcGF0aFtpXTtcbiAgICAgICAgdmFyIHAgPSBuZXcgUG9pbnREKGR1bW15Tm9kZS5nZXRDZW50ZXJYKCksIGR1bW15Tm9kZS5nZXRDZW50ZXJZKCkpO1xuXG4gICAgICAgIC8vIHVwZGF0ZSBiZW5kcG9pbnQncyBsb2NhdGlvbiBhY2NvcmRpbmcgdG8gZHVtbXkgbm9kZVxuICAgICAgICB2YXIgZWJwID0gbEVkZ2UuYmVuZHBvaW50cy5nZXQoaSk7XG4gICAgICAgIGVicC54ID0gcC54O1xuICAgICAgICBlYnAueSA9IHAueTtcblxuICAgICAgICAvLyByZW1vdmUgdGhlIGR1bW15IG5vZGUsIGR1bW15IGVkZ2VzIGluY2lkZW50IHdpdGggdGhpc1xuICAgICAgICAvLyBkdW1teSBub2RlIGlzIGFsc28gcmVtb3ZlZCAod2l0aGluIHRoZSByZW1vdmUgbWV0aG9kKVxuICAgICAgICBkdW1teU5vZGUuZ2V0T3duZXIoKS5yZW1vdmUoZHVtbXlOb2RlKTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHRoZSByZWFsIGVkZ2UgdG8gZ3JhcGhcbiAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLmFkZChsRWRnZSwgbEVkZ2Uuc291cmNlLCBsRWRnZS50YXJnZXQpO1xuICAgIH1cbiAgfVxufTtcblxuTGF5b3V0LnRyYW5zZm9ybSA9IGZ1bmN0aW9uIChzbGlkZXJWYWx1ZSwgZGVmYXVsdFZhbHVlLCBtaW5EaXYsIG1heE11bCkge1xuICBpZiAobWluRGl2ICE9IHVuZGVmaW5lZCAmJiBtYXhNdWwgIT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuXG4gICAgaWYgKHNsaWRlclZhbHVlIDw9IDUwKSB7XG4gICAgICB2YXIgbWluVmFsdWUgPSBkZWZhdWx0VmFsdWUgLyBtaW5EaXY7XG4gICAgICB2YWx1ZSAtPSAoZGVmYXVsdFZhbHVlIC0gbWluVmFsdWUpIC8gNTAgKiAoNTAgLSBzbGlkZXJWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBtYXhWYWx1ZSA9IGRlZmF1bHRWYWx1ZSAqIG1heE11bDtcbiAgICAgIHZhbHVlICs9IChtYXhWYWx1ZSAtIGRlZmF1bHRWYWx1ZSkgLyA1MCAqIChzbGlkZXJWYWx1ZSAtIDUwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGEsIGI7XG5cbiAgICBpZiAoc2xpZGVyVmFsdWUgPD0gNTApIHtcbiAgICAgIGEgPSA5LjAgKiBkZWZhdWx0VmFsdWUgLyA1MDAuMDtcbiAgICAgIGIgPSBkZWZhdWx0VmFsdWUgLyAxMC4wO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gOS4wICogZGVmYXVsdFZhbHVlIC8gNTAuMDtcbiAgICAgIGIgPSAtOCAqIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYSAqIHNsaWRlclZhbHVlICsgYjtcbiAgfVxufTtcblxuLyoqXHJcbiAqIFRoaXMgbWV0aG9kIGZpbmRzIGFuZCByZXR1cm5zIHRoZSBjZW50ZXIgb2YgdGhlIGdpdmVuIG5vZGVzLCBhc3N1bWluZ1xyXG4gKiB0aGF0IHRoZSBnaXZlbiBub2RlcyBmb3JtIGEgdHJlZSBpbiB0aGVtc2VsdmVzLlxyXG4gKi9cbkxheW91dC5maW5kQ2VudGVyT2ZUcmVlID0gZnVuY3Rpb24gKG5vZGVzKSB7XG4gIHZhciBsaXN0ID0gW107XG4gIGxpc3QgPSBsaXN0LmNvbmNhdChub2Rlcyk7XG5cbiAgdmFyIHJlbW92ZWROb2RlcyA9IFtdO1xuICB2YXIgcmVtYWluaW5nRGVncmVlcyA9IG5ldyBNYXAoKTtcbiAgdmFyIGZvdW5kQ2VudGVyID0gZmFsc2U7XG4gIHZhciBjZW50ZXJOb2RlID0gbnVsbDtcblxuICBpZiAobGlzdC5sZW5ndGggPT0gMSB8fCBsaXN0Lmxlbmd0aCA9PSAyKSB7XG4gICAgZm91bmRDZW50ZXIgPSB0cnVlO1xuICAgIGNlbnRlck5vZGUgPSBsaXN0WzBdO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBsaXN0W2ldO1xuICAgIHZhciBkZWdyZWUgPSBub2RlLmdldE5laWdoYm9yc0xpc3QoKS5zaXplO1xuICAgIHJlbWFpbmluZ0RlZ3JlZXMuc2V0KG5vZGUsIG5vZGUuZ2V0TmVpZ2hib3JzTGlzdCgpLnNpemUpO1xuXG4gICAgaWYgKGRlZ3JlZSA9PSAxKSB7XG4gICAgICByZW1vdmVkTm9kZXMucHVzaChub2RlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgdGVtcExpc3QgPSBbXTtcbiAgdGVtcExpc3QgPSB0ZW1wTGlzdC5jb25jYXQocmVtb3ZlZE5vZGVzKTtcblxuICB3aGlsZSAoIWZvdW5kQ2VudGVyKSB7XG4gICAgdmFyIHRlbXBMaXN0MiA9IFtdO1xuICAgIHRlbXBMaXN0MiA9IHRlbXBMaXN0Mi5jb25jYXQodGVtcExpc3QpO1xuICAgIHRlbXBMaXN0ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbGlzdFtpXTtcblxuICAgICAgdmFyIGluZGV4ID0gbGlzdC5pbmRleE9mKG5vZGUpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgbGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmVpZ2hib3VycyA9IG5vZGUuZ2V0TmVpZ2hib3JzTGlzdCgpO1xuXG4gICAgICBuZWlnaGJvdXJzLmZvckVhY2goZnVuY3Rpb24gKG5laWdoYm91cikge1xuICAgICAgICBpZiAocmVtb3ZlZE5vZGVzLmluZGV4T2YobmVpZ2hib3VyKSA8IDApIHtcbiAgICAgICAgICB2YXIgb3RoZXJEZWdyZWUgPSByZW1haW5pbmdEZWdyZWVzLmdldChuZWlnaGJvdXIpO1xuICAgICAgICAgIHZhciBuZXdEZWdyZWUgPSBvdGhlckRlZ3JlZSAtIDE7XG5cbiAgICAgICAgICBpZiAobmV3RGVncmVlID09IDEpIHtcbiAgICAgICAgICAgIHRlbXBMaXN0LnB1c2gobmVpZ2hib3VyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZW1haW5pbmdEZWdyZWVzLnNldChuZWlnaGJvdXIsIG5ld0RlZ3JlZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbW92ZWROb2RlcyA9IHJlbW92ZWROb2Rlcy5jb25jYXQodGVtcExpc3QpO1xuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09IDEgfHwgbGlzdC5sZW5ndGggPT0gMikge1xuICAgICAgZm91bmRDZW50ZXIgPSB0cnVlO1xuICAgICAgY2VudGVyTm9kZSA9IGxpc3RbMF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNlbnRlck5vZGU7XG59O1xuXG4vKipcclxuICogRHVyaW5nIHRoZSBjb2Fyc2VuaW5nIHByb2Nlc3MsIHRoaXMgbGF5b3V0IG1heSBiZSByZWZlcmVuY2VkIGJ5IHR3byBncmFwaCBtYW5hZ2Vyc1xyXG4gKiB0aGlzIHNldHRlciBmdW5jdGlvbiBncmFudHMgYWNjZXNzIHRvIGNoYW5nZSB0aGUgY3VycmVudGx5IGJlaW5nIHVzZWQgZ3JhcGggbWFuYWdlclxyXG4gKi9cbkxheW91dC5wcm90b3R5cGUuc2V0R3JhcGhNYW5hZ2VyID0gZnVuY3Rpb24gKGdtKSB7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyID0gZ207XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IExheW91dDtcblxuLyoqKi8gfSksXG4vKiAxNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBSYW5kb21TZWVkKCkge31cbi8vIGFkYXB0ZWQgZnJvbTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE5MzAzNzI1XG5SYW5kb21TZWVkLnNlZWQgPSAxO1xuUmFuZG9tU2VlZC54ID0gMDtcblxuUmFuZG9tU2VlZC5uZXh0RG91YmxlID0gZnVuY3Rpb24gKCkge1xuICBSYW5kb21TZWVkLnggPSBNYXRoLnNpbihSYW5kb21TZWVkLnNlZWQrKykgKiAxMDAwMDtcbiAgcmV0dXJuIFJhbmRvbVNlZWQueCAtIE1hdGguZmxvb3IoUmFuZG9tU2VlZC54KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmFuZG9tU2VlZDtcblxuLyoqKi8gfSksXG4vKiAxNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblxuZnVuY3Rpb24gVHJhbnNmb3JtKHgsIHkpIHtcbiAgdGhpcy5sd29ybGRPcmdYID0gMC4wO1xuICB0aGlzLmx3b3JsZE9yZ1kgPSAwLjA7XG4gIHRoaXMubGRldmljZU9yZ1ggPSAwLjA7XG4gIHRoaXMubGRldmljZU9yZ1kgPSAwLjA7XG4gIHRoaXMubHdvcmxkRXh0WCA9IDEuMDtcbiAgdGhpcy5sd29ybGRFeHRZID0gMS4wO1xuICB0aGlzLmxkZXZpY2VFeHRYID0gMS4wO1xuICB0aGlzLmxkZXZpY2VFeHRZID0gMS4wO1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkT3JnWCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkT3JnWDtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRPcmdYID0gZnVuY3Rpb24gKHdveCkge1xuICB0aGlzLmx3b3JsZE9yZ1ggPSB3b3g7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkT3JnWSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkT3JnWTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRPcmdZID0gZnVuY3Rpb24gKHdveSkge1xuICB0aGlzLmx3b3JsZE9yZ1kgPSB3b3k7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkRXh0WCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkRXh0WDtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRFeHRYID0gZnVuY3Rpb24gKHdleCkge1xuICB0aGlzLmx3b3JsZEV4dFggPSB3ZXg7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkRXh0WSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkRXh0WTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRFeHRZID0gZnVuY3Rpb24gKHdleSkge1xuICB0aGlzLmx3b3JsZEV4dFkgPSB3ZXk7XG59O1xuXG4vKiBEZXZpY2UgcmVsYXRlZCAqL1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldERldmljZU9yZ1ggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxkZXZpY2VPcmdYO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5zZXREZXZpY2VPcmdYID0gZnVuY3Rpb24gKGRveCkge1xuICB0aGlzLmxkZXZpY2VPcmdYID0gZG94O1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5nZXREZXZpY2VPcmdZID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sZGV2aWNlT3JnWTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0RGV2aWNlT3JnWSA9IGZ1bmN0aW9uIChkb3kpIHtcbiAgdGhpcy5sZGV2aWNlT3JnWSA9IGRveTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuZ2V0RGV2aWNlRXh0WCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubGRldmljZUV4dFg7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnNldERldmljZUV4dFggPSBmdW5jdGlvbiAoZGV4KSB7XG4gIHRoaXMubGRldmljZUV4dFggPSBkZXg7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldERldmljZUV4dFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxkZXZpY2VFeHRZO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5zZXREZXZpY2VFeHRZID0gZnVuY3Rpb24gKGRleSkge1xuICB0aGlzLmxkZXZpY2VFeHRZID0gZGV5O1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS50cmFuc2Zvcm1YID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIHhEZXZpY2UgPSAwLjA7XG4gIHZhciB3b3JsZEV4dFggPSB0aGlzLmx3b3JsZEV4dFg7XG4gIGlmICh3b3JsZEV4dFggIT0gMC4wKSB7XG4gICAgeERldmljZSA9IHRoaXMubGRldmljZU9yZ1ggKyAoeCAtIHRoaXMubHdvcmxkT3JnWCkgKiB0aGlzLmxkZXZpY2VFeHRYIC8gd29ybGRFeHRYO1xuICB9XG5cbiAgcmV0dXJuIHhEZXZpY2U7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnRyYW5zZm9ybVkgPSBmdW5jdGlvbiAoeSkge1xuICB2YXIgeURldmljZSA9IDAuMDtcbiAgdmFyIHdvcmxkRXh0WSA9IHRoaXMubHdvcmxkRXh0WTtcbiAgaWYgKHdvcmxkRXh0WSAhPSAwLjApIHtcbiAgICB5RGV2aWNlID0gdGhpcy5sZGV2aWNlT3JnWSArICh5IC0gdGhpcy5sd29ybGRPcmdZKSAqIHRoaXMubGRldmljZUV4dFkgLyB3b3JsZEV4dFk7XG4gIH1cblxuICByZXR1cm4geURldmljZTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuaW52ZXJzZVRyYW5zZm9ybVggPSBmdW5jdGlvbiAoeCkge1xuICB2YXIgeFdvcmxkID0gMC4wO1xuICB2YXIgZGV2aWNlRXh0WCA9IHRoaXMubGRldmljZUV4dFg7XG4gIGlmIChkZXZpY2VFeHRYICE9IDAuMCkge1xuICAgIHhXb3JsZCA9IHRoaXMubHdvcmxkT3JnWCArICh4IC0gdGhpcy5sZGV2aWNlT3JnWCkgKiB0aGlzLmx3b3JsZEV4dFggLyBkZXZpY2VFeHRYO1xuICB9XG5cbiAgcmV0dXJuIHhXb3JsZDtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuaW52ZXJzZVRyYW5zZm9ybVkgPSBmdW5jdGlvbiAoeSkge1xuICB2YXIgeVdvcmxkID0gMC4wO1xuICB2YXIgZGV2aWNlRXh0WSA9IHRoaXMubGRldmljZUV4dFk7XG4gIGlmIChkZXZpY2VFeHRZICE9IDAuMCkge1xuICAgIHlXb3JsZCA9IHRoaXMubHdvcmxkT3JnWSArICh5IC0gdGhpcy5sZGV2aWNlT3JnWSkgKiB0aGlzLmx3b3JsZEV4dFkgLyBkZXZpY2VFeHRZO1xuICB9XG4gIHJldHVybiB5V29ybGQ7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmludmVyc2VUcmFuc2Zvcm1Qb2ludCA9IGZ1bmN0aW9uIChpblBvaW50KSB7XG4gIHZhciBvdXRQb2ludCA9IG5ldyBQb2ludEQodGhpcy5pbnZlcnNlVHJhbnNmb3JtWChpblBvaW50LngpLCB0aGlzLmludmVyc2VUcmFuc2Zvcm1ZKGluUG9pbnQueSkpO1xuICByZXR1cm4gb3V0UG9pbnQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxuLyoqKi8gfSksXG4vKiAxOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblxudmFyIExheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIElHZW9tZXRyeSA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG52YXIgSU1hdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXG5mdW5jdGlvbiBGRExheW91dCgpIHtcbiAgTGF5b3V0LmNhbGwodGhpcyk7XG5cbiAgdGhpcy51c2VTbWFydElkZWFsRWRnZUxlbmd0aENhbGN1bGF0aW9uID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9VU0VfU01BUlRfSURFQUxfRURHRV9MRU5HVEhfQ0FMQ1VMQVRJT047XG4gIHRoaXMuZ3Jhdml0eUNvbnN0YW50ID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1NUUkVOR1RIO1xuICB0aGlzLmNvbXBvdW5kR3Jhdml0eUNvbnN0YW50ID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1NUUkVOR1RIO1xuICB0aGlzLmdyYXZpdHlSYW5nZUZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9SQU5HRV9GQUNUT1I7XG4gIHRoaXMuY29tcG91bmRHcmF2aXR5UmFuZ2VGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfUkFOR0VfRkFDVE9SO1xuICB0aGlzLmRpc3BsYWNlbWVudFRocmVzaG9sZFBlck5vZGUgPSAzLjAgKiBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC8gMTAwO1xuICB0aGlzLmNvb2xpbmdGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMO1xuICB0aGlzLmluaXRpYWxDb29saW5nRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTDtcbiAgdGhpcy50b3RhbERpc3BsYWNlbWVudCA9IDAuMDtcbiAgdGhpcy5vbGRUb3RhbERpc3BsYWNlbWVudCA9IDAuMDtcbiAgdGhpcy5tYXhJdGVyYXRpb25zID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX0lURVJBVElPTlM7XG59XG5cbkZETGF5b3V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTGF5b3V0LnByb3RvdHlwZSk7XG5cbmZvciAodmFyIHByb3AgaW4gTGF5b3V0KSB7XG4gIEZETGF5b3V0W3Byb3BdID0gTGF5b3V0W3Byb3BdO1xufVxuXG5GRExheW91dC5wcm90b3R5cGUuaW5pdFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7XG4gIExheW91dC5wcm90b3R5cGUuaW5pdFBhcmFtZXRlcnMuY2FsbCh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIHRoaXMudG90YWxJdGVyYXRpb25zID0gMDtcbiAgdGhpcy5ub3RBbmltYXRlZEl0ZXJhdGlvbnMgPSAwO1xuXG4gIHRoaXMudXNlRlJHcmlkVmFyaWFudCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfVVNFX1NNQVJUX1JFUFVMU0lPTl9SQU5HRV9DQUxDVUxBVElPTjtcblxuICB0aGlzLmdyaWQgPSBbXTtcbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjSWRlYWxFZGdlTGVuZ3RocyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVkZ2U7XG4gIHZhciBvcmlnaW5hbElkZWFsTGVuZ3RoO1xuICB2YXIgbGNhRGVwdGg7XG4gIHZhciBzb3VyY2U7XG4gIHZhciB0YXJnZXQ7XG4gIHZhciBzaXplT2ZTb3VyY2VJbkxjYTtcbiAgdmFyIHNpemVPZlRhcmdldEluTGNhO1xuXG4gIHZhciBhbGxFZGdlcyA9IHRoaXMuZ2V0R3JhcGhNYW5hZ2VyKCkuZ2V0QWxsRWRnZXMoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxFZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIGVkZ2UgPSBhbGxFZGdlc1tpXTtcblxuICAgIG9yaWdpbmFsSWRlYWxMZW5ndGggPSBlZGdlLmlkZWFsTGVuZ3RoO1xuXG4gICAgaWYgKGVkZ2UuaXNJbnRlckdyYXBoKSB7XG4gICAgICBzb3VyY2UgPSBlZGdlLmdldFNvdXJjZSgpO1xuICAgICAgdGFyZ2V0ID0gZWRnZS5nZXRUYXJnZXQoKTtcblxuICAgICAgc2l6ZU9mU291cmNlSW5MY2EgPSBlZGdlLmdldFNvdXJjZUluTGNhKCkuZ2V0RXN0aW1hdGVkU2l6ZSgpO1xuICAgICAgc2l6ZU9mVGFyZ2V0SW5MY2EgPSBlZGdlLmdldFRhcmdldEluTGNhKCkuZ2V0RXN0aW1hdGVkU2l6ZSgpO1xuXG4gICAgICBpZiAodGhpcy51c2VTbWFydElkZWFsRWRnZUxlbmd0aENhbGN1bGF0aW9uKSB7XG4gICAgICAgIGVkZ2UuaWRlYWxMZW5ndGggKz0gc2l6ZU9mU291cmNlSW5MY2EgKyBzaXplT2ZUYXJnZXRJbkxjYSAtIDIgKiBMYXlvdXRDb25zdGFudHMuU0lNUExFX05PREVfU0laRTtcbiAgICAgIH1cblxuICAgICAgbGNhRGVwdGggPSBlZGdlLmdldExjYSgpLmdldEluY2x1c2lvblRyZWVEZXB0aCgpO1xuXG4gICAgICBlZGdlLmlkZWFsTGVuZ3RoICs9IG9yaWdpbmFsSWRlYWxMZW5ndGggKiBGRExheW91dENvbnN0YW50cy5QRVJfTEVWRUxfSURFQUxfRURHRV9MRU5HVEhfRkFDVE9SICogKHNvdXJjZS5nZXRJbmNsdXNpb25UcmVlRGVwdGgoKSArIHRhcmdldC5nZXRJbmNsdXNpb25UcmVlRGVwdGgoKSAtIDIgKiBsY2FEZXB0aCk7XG4gICAgfVxuICB9XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuaW5pdFNwcmluZ0VtYmVkZGVyID0gZnVuY3Rpb24gKCkge1xuXG4gIHZhciBzID0gdGhpcy5nZXRBbGxOb2RlcygpLmxlbmd0aDtcbiAgaWYgKHRoaXMuaW5jcmVtZW50YWwpIHtcbiAgICBpZiAocyA+IEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fTE9XRVJfTk9ERV9MSU1JVCkge1xuICAgICAgdGhpcy5jb29saW5nRmFjdG9yID0gTWF0aC5tYXgodGhpcy5jb29saW5nRmFjdG9yICogRkRMYXlvdXRDb25zdGFudHMuQ09PTElOR19BREFQVEFUSU9OX0ZBQ1RPUiwgdGhpcy5jb29saW5nRmFjdG9yIC0gKHMgLSBGRExheW91dENvbnN0YW50cy5BREFQVEFUSU9OX0xPV0VSX05PREVfTElNSVQpIC8gKEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fVVBQRVJfTk9ERV9MSU1JVCAtIEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fTE9XRVJfTk9ERV9MSU1JVCkgKiB0aGlzLmNvb2xpbmdGYWN0b3IgKiAoMSAtIEZETGF5b3V0Q29uc3RhbnRzLkNPT0xJTkdfQURBUFRBVElPTl9GQUNUT1IpKTtcbiAgICB9XG4gICAgdGhpcy5tYXhOb2RlRGlzcGxhY2VtZW50ID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX05PREVfRElTUExBQ0VNRU5UX0lOQ1JFTUVOVEFMO1xuICB9IGVsc2Uge1xuICAgIGlmIChzID4gRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9MT1dFUl9OT0RFX0xJTUlUKSB7XG4gICAgICB0aGlzLmNvb2xpbmdGYWN0b3IgPSBNYXRoLm1heChGRExheW91dENvbnN0YW50cy5DT09MSU5HX0FEQVBUQVRJT05fRkFDVE9SLCAxLjAgLSAocyAtIEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fTE9XRVJfTk9ERV9MSU1JVCkgLyAoRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9VUFBFUl9OT0RFX0xJTUlUIC0gRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9MT1dFUl9OT0RFX0xJTUlUKSAqICgxIC0gRkRMYXlvdXRDb25zdGFudHMuQ09PTElOR19BREFQVEFUSU9OX0ZBQ1RPUikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvb2xpbmdGYWN0b3IgPSAxLjA7XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbENvb2xpbmdGYWN0b3IgPSB0aGlzLmNvb2xpbmdGYWN0b3I7XG4gICAgdGhpcy5tYXhOb2RlRGlzcGxhY2VtZW50ID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX05PREVfRElTUExBQ0VNRU5UO1xuICB9XG5cbiAgdGhpcy5tYXhJdGVyYXRpb25zID0gTWF0aC5tYXgodGhpcy5nZXRBbGxOb2RlcygpLmxlbmd0aCAqIDUsIHRoaXMubWF4SXRlcmF0aW9ucyk7XG5cbiAgLy8gUmVhc3NpZ24gdGhpcyBhdHRyaWJ1dGUgYnkgdXNpbmcgbmV3IGNvbnN0YW50IHZhbHVlXG4gIHRoaXMuZGlzcGxhY2VtZW50VGhyZXNob2xkUGVyTm9kZSA9IDMuMCAqIEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggLyAxMDA7XG4gIHRoaXMudG90YWxEaXNwbGFjZW1lbnRUaHJlc2hvbGQgPSB0aGlzLmRpc3BsYWNlbWVudFRocmVzaG9sZFBlck5vZGUgKiB0aGlzLmdldEFsbE5vZGVzKCkubGVuZ3RoO1xuXG4gIHRoaXMucmVwdWxzaW9uUmFuZ2UgPSB0aGlzLmNhbGNSZXB1bHNpb25SYW5nZSgpO1xufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmNhbGNTcHJpbmdGb3JjZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsRWRnZXMgPSB0aGlzLmdldEFsbEVkZ2VzKCk7XG4gIHZhciBlZGdlO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbEVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgZWRnZSA9IGxFZGdlc1tpXTtcblxuICAgIHRoaXMuY2FsY1NwcmluZ0ZvcmNlKGVkZ2UsIGVkZ2UuaWRlYWxMZW5ndGgpO1xuICB9XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuY2FsY1JlcHVsc2lvbkZvcmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGdyaWRVcGRhdGVBbGxvd2VkID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICB2YXIgZm9yY2VUb05vZGVTdXJyb3VuZGluZ1VwZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgdmFyIGksIGo7XG4gIHZhciBub2RlQSwgbm9kZUI7XG4gIHZhciBsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzKCk7XG4gIHZhciBwcm9jZXNzZWROb2RlU2V0O1xuXG4gIGlmICh0aGlzLnVzZUZSR3JpZFZhcmlhbnQpIHtcbiAgICBpZiAodGhpcy50b3RhbEl0ZXJhdGlvbnMgJSBGRExheW91dENvbnN0YW50cy5HUklEX0NBTENVTEFUSU9OX0NIRUNLX1BFUklPRCA9PSAxICYmIGdyaWRVcGRhdGVBbGxvd2VkKSB7XG4gICAgICB0aGlzLnVwZGF0ZUdyaWQoKTtcbiAgICB9XG5cbiAgICBwcm9jZXNzZWROb2RlU2V0ID0gbmV3IFNldCgpO1xuXG4gICAgLy8gY2FsY3VsYXRlIHJlcHVsc2lvbiBmb3JjZXMgYmV0d2VlbiBlYWNoIG5vZGVzIGFuZCBpdHMgc3Vycm91bmRpbmdcbiAgICBmb3IgKGkgPSAwOyBpIDwgbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub2RlQSA9IGxOb2Rlc1tpXTtcbiAgICAgIHRoaXMuY2FsY3VsYXRlUmVwdWxzaW9uRm9yY2VPZkFOb2RlKG5vZGVBLCBwcm9jZXNzZWROb2RlU2V0LCBncmlkVXBkYXRlQWxsb3dlZCwgZm9yY2VUb05vZGVTdXJyb3VuZGluZ1VwZGF0ZSk7XG4gICAgICBwcm9jZXNzZWROb2RlU2V0LmFkZChub2RlQSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5vZGVBID0gbE5vZGVzW2ldO1xuXG4gICAgICBmb3IgKGogPSBpICsgMTsgaiA8IGxOb2Rlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBub2RlQiA9IGxOb2Rlc1tqXTtcblxuICAgICAgICAvLyBJZiBib3RoIG5vZGVzIGFyZSBub3QgbWVtYmVycyBvZiB0aGUgc2FtZSBncmFwaCwgc2tpcC5cbiAgICAgICAgaWYgKG5vZGVBLmdldE93bmVyKCkgIT0gbm9kZUIuZ2V0T3duZXIoKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxjUmVwdWxzaW9uRm9yY2Uobm9kZUEsIG5vZGVCKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjR3Jhdml0YXRpb25hbEZvcmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vZGU7XG4gIHZhciBsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlID0gbE5vZGVzW2ldO1xuICAgIHRoaXMuY2FsY0dyYXZpdGF0aW9uYWxGb3JjZShub2RlKTtcbiAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLm1vdmVOb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGxOb2RlcyA9IHRoaXMuZ2V0QWxsTm9kZXMoKTtcbiAgdmFyIG5vZGU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlID0gbE5vZGVzW2ldO1xuICAgIG5vZGUubW92ZSgpO1xuICB9XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuY2FsY1NwcmluZ0ZvcmNlID0gZnVuY3Rpb24gKGVkZ2UsIGlkZWFsTGVuZ3RoKSB7XG4gIHZhciBzb3VyY2VOb2RlID0gZWRnZS5nZXRTb3VyY2UoKTtcbiAgdmFyIHRhcmdldE5vZGUgPSBlZGdlLmdldFRhcmdldCgpO1xuXG4gIHZhciBsZW5ndGg7XG4gIHZhciBzcHJpbmdGb3JjZTtcbiAgdmFyIHNwcmluZ0ZvcmNlWDtcbiAgdmFyIHNwcmluZ0ZvcmNlWTtcblxuICAvLyBVcGRhdGUgZWRnZSBsZW5ndGhcbiAgaWYgKHRoaXMudW5pZm9ybUxlYWZOb2RlU2l6ZXMgJiYgc291cmNlTm9kZS5nZXRDaGlsZCgpID09IG51bGwgJiYgdGFyZ2V0Tm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICBlZGdlLnVwZGF0ZUxlbmd0aFNpbXBsZSgpO1xuICB9IGVsc2Uge1xuICAgIGVkZ2UudXBkYXRlTGVuZ3RoKCk7XG5cbiAgICBpZiAoZWRnZS5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBsZW5ndGggPSBlZGdlLmdldExlbmd0aCgpO1xuXG4gIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuO1xuXG4gIC8vIENhbGN1bGF0ZSBzcHJpbmcgZm9yY2VzXG4gIHNwcmluZ0ZvcmNlID0gZWRnZS5lZGdlRWxhc3RpY2l0eSAqIChsZW5ndGggLSBpZGVhbExlbmd0aCk7XG5cbiAgLy8gUHJvamVjdCBmb3JjZSBvbnRvIHggYW5kIHkgYXhlc1xuICBzcHJpbmdGb3JjZVggPSBzcHJpbmdGb3JjZSAqIChlZGdlLmxlbmd0aFggLyBsZW5ndGgpO1xuICBzcHJpbmdGb3JjZVkgPSBzcHJpbmdGb3JjZSAqIChlZGdlLmxlbmd0aFkgLyBsZW5ndGgpO1xuXG4gIC8vIEFwcGx5IGZvcmNlcyBvbiB0aGUgZW5kIG5vZGVzXG4gIHNvdXJjZU5vZGUuc3ByaW5nRm9yY2VYICs9IHNwcmluZ0ZvcmNlWDtcbiAgc291cmNlTm9kZS5zcHJpbmdGb3JjZVkgKz0gc3ByaW5nRm9yY2VZO1xuICB0YXJnZXROb2RlLnNwcmluZ0ZvcmNlWCAtPSBzcHJpbmdGb3JjZVg7XG4gIHRhcmdldE5vZGUuc3ByaW5nRm9yY2VZIC09IHNwcmluZ0ZvcmNlWTtcbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjUmVwdWxzaW9uRm9yY2UgPSBmdW5jdGlvbiAobm9kZUEsIG5vZGVCKSB7XG4gIHZhciByZWN0QSA9IG5vZGVBLmdldFJlY3QoKTtcbiAgdmFyIHJlY3RCID0gbm9kZUIuZ2V0UmVjdCgpO1xuICB2YXIgb3ZlcmxhcEFtb3VudCA9IG5ldyBBcnJheSgyKTtcbiAgdmFyIGNsaXBQb2ludHMgPSBuZXcgQXJyYXkoNCk7XG4gIHZhciBkaXN0YW5jZVg7XG4gIHZhciBkaXN0YW5jZVk7XG4gIHZhciBkaXN0YW5jZVNxdWFyZWQ7XG4gIHZhciBkaXN0YW5jZTtcbiAgdmFyIHJlcHVsc2lvbkZvcmNlO1xuICB2YXIgcmVwdWxzaW9uRm9yY2VYO1xuICB2YXIgcmVwdWxzaW9uRm9yY2VZO1xuXG4gIGlmIChyZWN0QS5pbnRlcnNlY3RzKHJlY3RCKSkgLy8gdHdvIG5vZGVzIG92ZXJsYXBcbiAgICB7XG4gICAgICAvLyBjYWxjdWxhdGUgc2VwYXJhdGlvbiBhbW91bnQgaW4geCBhbmQgeSBkaXJlY3Rpb25zXG4gICAgICBJR2VvbWV0cnkuY2FsY1NlcGFyYXRpb25BbW91bnQocmVjdEEsIHJlY3RCLCBvdmVybGFwQW1vdW50LCBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC8gMi4wKTtcblxuICAgICAgcmVwdWxzaW9uRm9yY2VYID0gMiAqIG92ZXJsYXBBbW91bnRbMF07XG4gICAgICByZXB1bHNpb25Gb3JjZVkgPSAyICogb3ZlcmxhcEFtb3VudFsxXTtcblxuICAgICAgdmFyIGNoaWxkcmVuQ29uc3RhbnQgPSBub2RlQS5ub09mQ2hpbGRyZW4gKiBub2RlQi5ub09mQ2hpbGRyZW4gLyAobm9kZUEubm9PZkNoaWxkcmVuICsgbm9kZUIubm9PZkNoaWxkcmVuKTtcblxuICAgICAgLy8gQXBwbHkgZm9yY2VzIG9uIHRoZSB0d28gbm9kZXNcbiAgICAgIG5vZGVBLnJlcHVsc2lvbkZvcmNlWCAtPSBjaGlsZHJlbkNvbnN0YW50ICogcmVwdWxzaW9uRm9yY2VYO1xuICAgICAgbm9kZUEucmVwdWxzaW9uRm9yY2VZIC09IGNoaWxkcmVuQ29uc3RhbnQgKiByZXB1bHNpb25Gb3JjZVk7XG4gICAgICBub2RlQi5yZXB1bHNpb25Gb3JjZVggKz0gY2hpbGRyZW5Db25zdGFudCAqIHJlcHVsc2lvbkZvcmNlWDtcbiAgICAgIG5vZGVCLnJlcHVsc2lvbkZvcmNlWSArPSBjaGlsZHJlbkNvbnN0YW50ICogcmVwdWxzaW9uRm9yY2VZO1xuICAgIH0gZWxzZSAvLyBubyBvdmVybGFwXG4gICAge1xuICAgICAgLy8gY2FsY3VsYXRlIGRpc3RhbmNlXG5cbiAgICAgIGlmICh0aGlzLnVuaWZvcm1MZWFmTm9kZVNpemVzICYmIG5vZGVBLmdldENoaWxkKCkgPT0gbnVsbCAmJiBub2RlQi5nZXRDaGlsZCgpID09IG51bGwpIC8vIHNpbXBseSBiYXNlIHJlcHVsc2lvbiBvbiBkaXN0YW5jZSBvZiBub2RlIGNlbnRlcnNcbiAgICAgICAge1xuICAgICAgICAgIGRpc3RhbmNlWCA9IHJlY3RCLmdldENlbnRlclgoKSAtIHJlY3RBLmdldENlbnRlclgoKTtcbiAgICAgICAgICBkaXN0YW5jZVkgPSByZWN0Qi5nZXRDZW50ZXJZKCkgLSByZWN0QS5nZXRDZW50ZXJZKCk7XG4gICAgICAgIH0gZWxzZSAvLyB1c2UgY2xpcHBpbmcgcG9pbnRzXG4gICAgICAgIHtcbiAgICAgICAgICBJR2VvbWV0cnkuZ2V0SW50ZXJzZWN0aW9uKHJlY3RBLCByZWN0QiwgY2xpcFBvaW50cyk7XG5cbiAgICAgICAgICBkaXN0YW5jZVggPSBjbGlwUG9pbnRzWzJdIC0gY2xpcFBvaW50c1swXTtcbiAgICAgICAgICBkaXN0YW5jZVkgPSBjbGlwUG9pbnRzWzNdIC0gY2xpcFBvaW50c1sxXTtcbiAgICAgICAgfVxuXG4gICAgICAvLyBObyByZXB1bHNpb24gcmFuZ2UuIEZSIGdyaWQgdmFyaWFudCBzaG91bGQgdGFrZSBjYXJlIG9mIHRoaXMuXG4gICAgICBpZiAoTWF0aC5hYnMoZGlzdGFuY2VYKSA8IEZETGF5b3V0Q29uc3RhbnRzLk1JTl9SRVBVTFNJT05fRElTVCkge1xuICAgICAgICBkaXN0YW5jZVggPSBJTWF0aC5zaWduKGRpc3RhbmNlWCkgKiBGRExheW91dENvbnN0YW50cy5NSU5fUkVQVUxTSU9OX0RJU1Q7XG4gICAgICB9XG5cbiAgICAgIGlmIChNYXRoLmFicyhkaXN0YW5jZVkpIDwgRkRMYXlvdXRDb25zdGFudHMuTUlOX1JFUFVMU0lPTl9ESVNUKSB7XG4gICAgICAgIGRpc3RhbmNlWSA9IElNYXRoLnNpZ24oZGlzdGFuY2VZKSAqIEZETGF5b3V0Q29uc3RhbnRzLk1JTl9SRVBVTFNJT05fRElTVDtcbiAgICAgIH1cblxuICAgICAgZGlzdGFuY2VTcXVhcmVkID0gZGlzdGFuY2VYICogZGlzdGFuY2VYICsgZGlzdGFuY2VZICogZGlzdGFuY2VZO1xuICAgICAgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGlzdGFuY2VTcXVhcmVkKTtcblxuICAgICAgLy8gSGVyZSB3ZSB1c2UgaGFsZiBvZiB0aGUgbm9kZXMnIHJlcHVsc2lvbiB2YWx1ZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgIHJlcHVsc2lvbkZvcmNlID0gKG5vZGVBLm5vZGVSZXB1bHNpb24gLyAyICsgbm9kZUIubm9kZVJlcHVsc2lvbiAvIDIpICogbm9kZUEubm9PZkNoaWxkcmVuICogbm9kZUIubm9PZkNoaWxkcmVuIC8gZGlzdGFuY2VTcXVhcmVkO1xuXG4gICAgICAvLyBQcm9qZWN0IGZvcmNlIG9udG8geCBhbmQgeSBheGVzXG4gICAgICByZXB1bHNpb25Gb3JjZVggPSByZXB1bHNpb25Gb3JjZSAqIGRpc3RhbmNlWCAvIGRpc3RhbmNlO1xuICAgICAgcmVwdWxzaW9uRm9yY2VZID0gcmVwdWxzaW9uRm9yY2UgKiBkaXN0YW5jZVkgLyBkaXN0YW5jZTtcblxuICAgICAgLy8gQXBwbHkgZm9yY2VzIG9uIHRoZSB0d28gbm9kZXMgICAgXG4gICAgICBub2RlQS5yZXB1bHNpb25Gb3JjZVggLT0gcmVwdWxzaW9uRm9yY2VYO1xuICAgICAgbm9kZUEucmVwdWxzaW9uRm9yY2VZIC09IHJlcHVsc2lvbkZvcmNlWTtcbiAgICAgIG5vZGVCLnJlcHVsc2lvbkZvcmNlWCArPSByZXB1bHNpb25Gb3JjZVg7XG4gICAgICBub2RlQi5yZXB1bHNpb25Gb3JjZVkgKz0gcmVwdWxzaW9uRm9yY2VZO1xuICAgIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjR3Jhdml0YXRpb25hbEZvcmNlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIG93bmVyR3JhcGg7XG4gIHZhciBvd25lckNlbnRlclg7XG4gIHZhciBvd25lckNlbnRlclk7XG4gIHZhciBkaXN0YW5jZVg7XG4gIHZhciBkaXN0YW5jZVk7XG4gIHZhciBhYnNEaXN0YW5jZVg7XG4gIHZhciBhYnNEaXN0YW5jZVk7XG4gIHZhciBlc3RpbWF0ZWRTaXplO1xuICBvd25lckdyYXBoID0gbm9kZS5nZXRPd25lcigpO1xuXG4gIG93bmVyQ2VudGVyWCA9IChvd25lckdyYXBoLmdldFJpZ2h0KCkgKyBvd25lckdyYXBoLmdldExlZnQoKSkgLyAyO1xuICBvd25lckNlbnRlclkgPSAob3duZXJHcmFwaC5nZXRUb3AoKSArIG93bmVyR3JhcGguZ2V0Qm90dG9tKCkpIC8gMjtcbiAgZGlzdGFuY2VYID0gbm9kZS5nZXRDZW50ZXJYKCkgLSBvd25lckNlbnRlclg7XG4gIGRpc3RhbmNlWSA9IG5vZGUuZ2V0Q2VudGVyWSgpIC0gb3duZXJDZW50ZXJZO1xuICBhYnNEaXN0YW5jZVggPSBNYXRoLmFicyhkaXN0YW5jZVgpICsgbm9kZS5nZXRXaWR0aCgpIC8gMjtcbiAgYWJzRGlzdGFuY2VZID0gTWF0aC5hYnMoZGlzdGFuY2VZKSArIG5vZGUuZ2V0SGVpZ2h0KCkgLyAyO1xuXG4gIGlmIChub2RlLmdldE93bmVyKCkgPT0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpKSAvLyBpbiB0aGUgcm9vdCBncmFwaFxuICAgIHtcbiAgICAgIGVzdGltYXRlZFNpemUgPSBvd25lckdyYXBoLmdldEVzdGltYXRlZFNpemUoKSAqIHRoaXMuZ3Jhdml0eVJhbmdlRmFjdG9yO1xuXG4gICAgICBpZiAoYWJzRGlzdGFuY2VYID4gZXN0aW1hdGVkU2l6ZSB8fCBhYnNEaXN0YW5jZVkgPiBlc3RpbWF0ZWRTaXplKSB7XG4gICAgICAgIG5vZGUuZ3Jhdml0YXRpb25Gb3JjZVggPSAtdGhpcy5ncmF2aXR5Q29uc3RhbnQgKiBkaXN0YW5jZVg7XG4gICAgICAgIG5vZGUuZ3Jhdml0YXRpb25Gb3JjZVkgPSAtdGhpcy5ncmF2aXR5Q29uc3RhbnQgKiBkaXN0YW5jZVk7XG4gICAgICB9XG4gICAgfSBlbHNlIC8vIGluc2lkZSBhIGNvbXBvdW5kXG4gICAge1xuICAgICAgZXN0aW1hdGVkU2l6ZSA9IG93bmVyR3JhcGguZ2V0RXN0aW1hdGVkU2l6ZSgpICogdGhpcy5jb21wb3VuZEdyYXZpdHlSYW5nZUZhY3RvcjtcblxuICAgICAgaWYgKGFic0Rpc3RhbmNlWCA+IGVzdGltYXRlZFNpemUgfHwgYWJzRGlzdGFuY2VZID4gZXN0aW1hdGVkU2l6ZSkge1xuICAgICAgICBub2RlLmdyYXZpdGF0aW9uRm9yY2VYID0gLXRoaXMuZ3Jhdml0eUNvbnN0YW50ICogZGlzdGFuY2VYICogdGhpcy5jb21wb3VuZEdyYXZpdHlDb25zdGFudDtcbiAgICAgICAgbm9kZS5ncmF2aXRhdGlvbkZvcmNlWSA9IC10aGlzLmdyYXZpdHlDb25zdGFudCAqIGRpc3RhbmNlWSAqIHRoaXMuY29tcG91bmRHcmF2aXR5Q29uc3RhbnQ7XG4gICAgICB9XG4gICAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmlzQ29udmVyZ2VkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY29udmVyZ2VkO1xuICB2YXIgb3NjaWxhdGluZyA9IGZhbHNlO1xuXG4gIGlmICh0aGlzLnRvdGFsSXRlcmF0aW9ucyA+IHRoaXMubWF4SXRlcmF0aW9ucyAvIDMpIHtcbiAgICBvc2NpbGF0aW5nID0gTWF0aC5hYnModGhpcy50b3RhbERpc3BsYWNlbWVudCAtIHRoaXMub2xkVG90YWxEaXNwbGFjZW1lbnQpIDwgMjtcbiAgfVxuXG4gIGNvbnZlcmdlZCA9IHRoaXMudG90YWxEaXNwbGFjZW1lbnQgPCB0aGlzLnRvdGFsRGlzcGxhY2VtZW50VGhyZXNob2xkO1xuXG4gIHRoaXMub2xkVG90YWxEaXNwbGFjZW1lbnQgPSB0aGlzLnRvdGFsRGlzcGxhY2VtZW50O1xuXG4gIHJldHVybiBjb252ZXJnZWQgfHwgb3NjaWxhdGluZztcbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5hbmltYXRlID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5hbmltYXRpb25EdXJpbmdMYXlvdXQgJiYgIXRoaXMuaXNTdWJMYXlvdXQpIHtcbiAgICBpZiAodGhpcy5ub3RBbmltYXRlZEl0ZXJhdGlvbnMgPT0gdGhpcy5hbmltYXRpb25QZXJpb2QpIHtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICB0aGlzLm5vdEFuaW1hdGVkSXRlcmF0aW9ucyA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubm90QW5pbWF0ZWRJdGVyYXRpb25zKys7XG4gICAgfVxuICB9XG59O1xuXG4vL1RoaXMgbWV0aG9kIGNhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiAod2VpZ2h0KSBmb3IgYWxsIG5vZGVzXG5GRExheW91dC5wcm90b3R5cGUuY2FsY05vT2ZDaGlsZHJlbkZvckFsbE5vZGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm9kZTtcbiAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXMoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IGFsbE5vZGVzW2ldO1xuICAgIG5vZGUubm9PZkNoaWxkcmVuID0gbm9kZS5nZXROb09mQ2hpbGRyZW4oKTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlY3Rpb246IEZSLUdyaWQgVmFyaWFudCBSZXB1bHNpb24gRm9yY2UgQ2FsY3VsYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjR3JpZCA9IGZ1bmN0aW9uIChncmFwaCkge1xuXG4gIHZhciBzaXplWCA9IDA7XG4gIHZhciBzaXplWSA9IDA7XG5cbiAgc2l6ZVggPSBwYXJzZUludChNYXRoLmNlaWwoKGdyYXBoLmdldFJpZ2h0KCkgLSBncmFwaC5nZXRMZWZ0KCkpIC8gdGhpcy5yZXB1bHNpb25SYW5nZSkpO1xuICBzaXplWSA9IHBhcnNlSW50KE1hdGguY2VpbCgoZ3JhcGguZ2V0Qm90dG9tKCkgLSBncmFwaC5nZXRUb3AoKSkgLyB0aGlzLnJlcHVsc2lvblJhbmdlKSk7XG5cbiAgdmFyIGdyaWQgPSBuZXcgQXJyYXkoc2l6ZVgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZVg7IGkrKykge1xuICAgIGdyaWRbaV0gPSBuZXcgQXJyYXkoc2l6ZVkpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplWDsgaSsrKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzaXplWTsgaisrKSB7XG4gICAgICBncmlkW2ldW2pdID0gbmV3IEFycmF5KCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdyaWQ7XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuYWRkTm9kZVRvR3JpZCA9IGZ1bmN0aW9uICh2LCBsZWZ0LCB0b3ApIHtcblxuICB2YXIgc3RhcnRYID0gMDtcbiAgdmFyIGZpbmlzaFggPSAwO1xuICB2YXIgc3RhcnRZID0gMDtcbiAgdmFyIGZpbmlzaFkgPSAwO1xuXG4gIHN0YXJ0WCA9IHBhcnNlSW50KE1hdGguZmxvb3IoKHYuZ2V0UmVjdCgpLnggLSBsZWZ0KSAvIHRoaXMucmVwdWxzaW9uUmFuZ2UpKTtcbiAgZmluaXNoWCA9IHBhcnNlSW50KE1hdGguZmxvb3IoKHYuZ2V0UmVjdCgpLndpZHRoICsgdi5nZXRSZWN0KCkueCAtIGxlZnQpIC8gdGhpcy5yZXB1bHNpb25SYW5nZSkpO1xuICBzdGFydFkgPSBwYXJzZUludChNYXRoLmZsb29yKCh2LmdldFJlY3QoKS55IC0gdG9wKSAvIHRoaXMucmVwdWxzaW9uUmFuZ2UpKTtcbiAgZmluaXNoWSA9IHBhcnNlSW50KE1hdGguZmxvb3IoKHYuZ2V0UmVjdCgpLmhlaWdodCArIHYuZ2V0UmVjdCgpLnkgLSB0b3ApIC8gdGhpcy5yZXB1bHNpb25SYW5nZSkpO1xuXG4gIGZvciAodmFyIGkgPSBzdGFydFg7IGkgPD0gZmluaXNoWDsgaSsrKSB7XG4gICAgZm9yICh2YXIgaiA9IHN0YXJ0WTsgaiA8PSBmaW5pc2hZOyBqKyspIHtcbiAgICAgIHRoaXMuZ3JpZFtpXVtqXS5wdXNoKHYpO1xuICAgICAgdi5zZXRHcmlkQ29vcmRpbmF0ZXMoc3RhcnRYLCBmaW5pc2hYLCBzdGFydFksIGZpbmlzaFkpO1xuICAgIH1cbiAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLnVwZGF0ZUdyaWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpO1xuICB2YXIgbm9kZUE7XG4gIHZhciBsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzKCk7XG5cbiAgdGhpcy5ncmlkID0gdGhpcy5jYWxjR3JpZCh0aGlzLmdyYXBoTWFuYWdlci5nZXRSb290KCkpO1xuXG4gIC8vIHB1dCBhbGwgbm9kZXMgdG8gcHJvcGVyIGdyaWQgY2VsbHNcbiAgZm9yIChpID0gMDsgaSA8IGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIG5vZGVBID0gbE5vZGVzW2ldO1xuICAgIHRoaXMuYWRkTm9kZVRvR3JpZChub2RlQSwgdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldExlZnQoKSwgdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldFRvcCgpKTtcbiAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmNhbGN1bGF0ZVJlcHVsc2lvbkZvcmNlT2ZBTm9kZSA9IGZ1bmN0aW9uIChub2RlQSwgcHJvY2Vzc2VkTm9kZVNldCwgZ3JpZFVwZGF0ZUFsbG93ZWQsIGZvcmNlVG9Ob2RlU3Vycm91bmRpbmdVcGRhdGUpIHtcblxuICBpZiAodGhpcy50b3RhbEl0ZXJhdGlvbnMgJSBGRExheW91dENvbnN0YW50cy5HUklEX0NBTENVTEFUSU9OX0NIRUNLX1BFUklPRCA9PSAxICYmIGdyaWRVcGRhdGVBbGxvd2VkIHx8IGZvcmNlVG9Ob2RlU3Vycm91bmRpbmdVcGRhdGUpIHtcbiAgICB2YXIgc3Vycm91bmRpbmcgPSBuZXcgU2V0KCk7XG4gICAgbm9kZUEuc3Vycm91bmRpbmcgPSBuZXcgQXJyYXkoKTtcbiAgICB2YXIgbm9kZUI7XG4gICAgdmFyIGdyaWQgPSB0aGlzLmdyaWQ7XG5cbiAgICBmb3IgKHZhciBpID0gbm9kZUEuc3RhcnRYIC0gMTsgaSA8IG5vZGVBLmZpbmlzaFggKyAyOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSBub2RlQS5zdGFydFkgLSAxOyBqIDwgbm9kZUEuZmluaXNoWSArIDI7IGorKykge1xuICAgICAgICBpZiAoIShpIDwgMCB8fCBqIDwgMCB8fCBpID49IGdyaWQubGVuZ3RoIHx8IGogPj0gZ3JpZFswXS5sZW5ndGgpKSB7XG4gICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBncmlkW2ldW2pdLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBub2RlQiA9IGdyaWRbaV1bal1ba107XG5cbiAgICAgICAgICAgIC8vIElmIGJvdGggbm9kZXMgYXJlIG5vdCBtZW1iZXJzIG9mIHRoZSBzYW1lIGdyYXBoLCBcbiAgICAgICAgICAgIC8vIG9yIGJvdGggbm9kZXMgYXJlIHRoZSBzYW1lLCBza2lwLlxuICAgICAgICAgICAgaWYgKG5vZGVBLmdldE93bmVyKCkgIT0gbm9kZUIuZ2V0T3duZXIoKSB8fCBub2RlQSA9PSBub2RlQikge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHJlcHVsc2lvbiBmb3JjZSBiZXR3ZWVuXG4gICAgICAgICAgICAvLyBub2RlQSBhbmQgbm9kZUIgaGFzIGFscmVhZHkgYmVlbiBjYWxjdWxhdGVkXG4gICAgICAgICAgICBpZiAoIXByb2Nlc3NlZE5vZGVTZXQuaGFzKG5vZGVCKSAmJiAhc3Vycm91bmRpbmcuaGFzKG5vZGVCKSkge1xuICAgICAgICAgICAgICB2YXIgZGlzdGFuY2VYID0gTWF0aC5hYnMobm9kZUEuZ2V0Q2VudGVyWCgpIC0gbm9kZUIuZ2V0Q2VudGVyWCgpKSAtIChub2RlQS5nZXRXaWR0aCgpIC8gMiArIG5vZGVCLmdldFdpZHRoKCkgLyAyKTtcbiAgICAgICAgICAgICAgdmFyIGRpc3RhbmNlWSA9IE1hdGguYWJzKG5vZGVBLmdldENlbnRlclkoKSAtIG5vZGVCLmdldENlbnRlclkoKSkgLSAobm9kZUEuZ2V0SGVpZ2h0KCkgLyAyICsgbm9kZUIuZ2V0SGVpZ2h0KCkgLyAyKTtcblxuICAgICAgICAgICAgICAvLyBpZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiBub2RlQSBhbmQgbm9kZUIgXG4gICAgICAgICAgICAgIC8vIGlzIGxlc3MgdGhlbiBjYWxjdWxhdGlvbiByYW5nZVxuICAgICAgICAgICAgICBpZiAoZGlzdGFuY2VYIDw9IHRoaXMucmVwdWxzaW9uUmFuZ2UgJiYgZGlzdGFuY2VZIDw9IHRoaXMucmVwdWxzaW9uUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAvL3RoZW4gYWRkIG5vZGVCIHRvIHN1cnJvdW5kaW5nIG9mIG5vZGVBXG4gICAgICAgICAgICAgICAgc3Vycm91bmRpbmcuYWRkKG5vZGVCKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGVBLnN1cnJvdW5kaW5nID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShzdXJyb3VuZGluZykpO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCBub2RlQS5zdXJyb3VuZGluZy5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMuY2FsY1JlcHVsc2lvbkZvcmNlKG5vZGVBLCBub2RlQS5zdXJyb3VuZGluZ1tpXSk7XG4gIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjUmVwdWxzaW9uUmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAwLjA7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZETGF5b3V0O1xuXG4vKioqLyB9KSxcbi8qIDE5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG52YXIgRkRMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXG5mdW5jdGlvbiBGRExheW91dEVkZ2Uoc291cmNlLCB0YXJnZXQsIHZFZGdlKSB7XG4gIExFZGdlLmNhbGwodGhpcywgc291cmNlLCB0YXJnZXQsIHZFZGdlKTtcblxuICAvLyBJZGVhbCBsZW5ndGggYW5kIGVsYXN0aWNpdHkgdmFsdWUgZm9yIHRoaXMgZWRnZVxuICB0aGlzLmlkZWFsTGVuZ3RoID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSDtcbiAgdGhpcy5lZGdlRWxhc3RpY2l0eSA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfU1BSSU5HX1NUUkVOR1RIO1xufVxuXG5GRExheW91dEVkZ2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMRWRnZS5wcm90b3R5cGUpO1xuXG5mb3IgKHZhciBwcm9wIGluIExFZGdlKSB7XG4gIEZETGF5b3V0RWRnZVtwcm9wXSA9IExFZGdlW3Byb3BdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEZETGF5b3V0RWRnZTtcblxuLyoqKi8gfSksXG4vKiAyMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgTE5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblxuZnVuY3Rpb24gRkRMYXlvdXROb2RlKGdtLCBsb2MsIHNpemUsIHZOb2RlKSB7XG4gIC8vIGFsdGVybmF0aXZlIGNvbnN0cnVjdG9yIGlzIGhhbmRsZWQgaW5zaWRlIExOb2RlXG4gIExOb2RlLmNhbGwodGhpcywgZ20sIGxvYywgc2l6ZSwgdk5vZGUpO1xuXG4gIC8vIFJlcHVsc2lvbiB2YWx1ZSBvZiB0aGlzIG5vZGVcbiAgdGhpcy5ub2RlUmVwdWxzaW9uID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9SRVBVTFNJT05fU1RSRU5HVEg7XG5cbiAgLy9TcHJpbmcsIHJlcHVsc2lvbiBhbmQgZ3Jhdml0YXRpb25hbCBmb3JjZXMgYWN0aW5nIG9uIHRoaXMgbm9kZVxuICB0aGlzLnNwcmluZ0ZvcmNlWCA9IDA7XG4gIHRoaXMuc3ByaW5nRm9yY2VZID0gMDtcbiAgdGhpcy5yZXB1bHNpb25Gb3JjZVggPSAwO1xuICB0aGlzLnJlcHVsc2lvbkZvcmNlWSA9IDA7XG4gIHRoaXMuZ3Jhdml0YXRpb25Gb3JjZVggPSAwO1xuICB0aGlzLmdyYXZpdGF0aW9uRm9yY2VZID0gMDtcbiAgLy9BbW91bnQgYnkgd2hpY2ggdGhpcyBub2RlIGlzIHRvIGJlIG1vdmVkIGluIHRoaXMgaXRlcmF0aW9uXG4gIHRoaXMuZGlzcGxhY2VtZW50WCA9IDA7XG4gIHRoaXMuZGlzcGxhY2VtZW50WSA9IDA7XG5cbiAgLy9TdGFydCBhbmQgZmluaXNoIGdyaWQgY29vcmRpbmF0ZXMgdGhhdCB0aGlzIG5vZGUgaXMgZmFsbGVuIGludG9cbiAgdGhpcy5zdGFydFggPSAwO1xuICB0aGlzLmZpbmlzaFggPSAwO1xuICB0aGlzLnN0YXJ0WSA9IDA7XG4gIHRoaXMuZmluaXNoWSA9IDA7XG5cbiAgLy9HZW9tZXRyaWMgbmVpZ2hib3JzIG9mIHRoaXMgbm9kZVxuICB0aGlzLnN1cnJvdW5kaW5nID0gW107XG59XG5cbkZETGF5b3V0Tm9kZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKExOb2RlLnByb3RvdHlwZSk7XG5cbmZvciAodmFyIHByb3AgaW4gTE5vZGUpIHtcbiAgRkRMYXlvdXROb2RlW3Byb3BdID0gTE5vZGVbcHJvcF07XG59XG5cbkZETGF5b3V0Tm9kZS5wcm90b3R5cGUuc2V0R3JpZENvb3JkaW5hdGVzID0gZnVuY3Rpb24gKF9zdGFydFgsIF9maW5pc2hYLCBfc3RhcnRZLCBfZmluaXNoWSkge1xuICB0aGlzLnN0YXJ0WCA9IF9zdGFydFg7XG4gIHRoaXMuZmluaXNoWCA9IF9maW5pc2hYO1xuICB0aGlzLnN0YXJ0WSA9IF9zdGFydFk7XG4gIHRoaXMuZmluaXNoWSA9IF9maW5pc2hZO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBGRExheW91dE5vZGU7XG5cbi8qKiovIH0pLFxuLyogMjEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gRGltZW5zaW9uRCh3aWR0aCwgaGVpZ2h0KSB7XG4gIHRoaXMud2lkdGggPSAwO1xuICB0aGlzLmhlaWdodCA9IDA7XG4gIGlmICh3aWR0aCAhPT0gbnVsbCAmJiBoZWlnaHQgIT09IG51bGwpIHtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gIH1cbn1cblxuRGltZW5zaW9uRC5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndpZHRoO1xufTtcblxuRGltZW5zaW9uRC5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcbiAgdGhpcy53aWR0aCA9IHdpZHRoO1xufTtcblxuRGltZW5zaW9uRC5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5oZWlnaHQ7XG59O1xuXG5EaW1lbnNpb25ELnByb3RvdHlwZS5zZXRIZWlnaHQgPSBmdW5jdGlvbiAoaGVpZ2h0KSB7XG4gIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBEaW1lbnNpb25EO1xuXG4vKioqLyB9KSxcbi8qIDIyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBVbmlxdWVJREdlbmVyZXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xuXG5mdW5jdGlvbiBIYXNoTWFwKCkge1xuICB0aGlzLm1hcCA9IHt9O1xuICB0aGlzLmtleXMgPSBbXTtcbn1cblxuSGFzaE1hcC5wcm90b3R5cGUucHV0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdmFyIHRoZUlkID0gVW5pcXVlSURHZW5lcmV0b3IuY3JlYXRlSUQoa2V5KTtcbiAgaWYgKCF0aGlzLmNvbnRhaW5zKHRoZUlkKSkge1xuICAgIHRoaXMubWFwW3RoZUlkXSA9IHZhbHVlO1xuICAgIHRoaXMua2V5cy5wdXNoKGtleSk7XG4gIH1cbn07XG5cbkhhc2hNYXAucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgdGhlSWQgPSBVbmlxdWVJREdlbmVyZXRvci5jcmVhdGVJRChrZXkpO1xuICByZXR1cm4gdGhpcy5tYXBba2V5XSAhPSBudWxsO1xufTtcblxuSGFzaE1hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgdGhlSWQgPSBVbmlxdWVJREdlbmVyZXRvci5jcmVhdGVJRChrZXkpO1xuICByZXR1cm4gdGhpcy5tYXBbdGhlSWRdO1xufTtcblxuSGFzaE1hcC5wcm90b3R5cGUua2V5U2V0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5rZXlzO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBIYXNoTWFwO1xuXG4vKioqLyB9KSxcbi8qIDIzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBVbmlxdWVJREdlbmVyZXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xuXG5mdW5jdGlvbiBIYXNoU2V0KCkge1xuICB0aGlzLnNldCA9IHt9O1xufVxuO1xuXG5IYXNoU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciB0aGVJZCA9IFVuaXF1ZUlER2VuZXJldG9yLmNyZWF0ZUlEKG9iaik7XG4gIGlmICghdGhpcy5jb250YWlucyh0aGVJZCkpIHRoaXMuc2V0W3RoZUlkXSA9IG9iajtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgZGVsZXRlIHRoaXMuc2V0W1VuaXF1ZUlER2VuZXJldG9yLmNyZWF0ZUlEKG9iaildO1xufTtcblxuSGFzaFNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2V0ID0ge307XG59O1xuXG5IYXNoU2V0LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHRoaXMuc2V0W1VuaXF1ZUlER2VuZXJldG9yLmNyZWF0ZUlEKG9iaildID09IG9iajtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnNpemUoKSA9PT0gMDtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnNldCkubGVuZ3RoO1xufTtcblxuLy9jb25jYXRzIHRoaXMuc2V0IHRvIHRoZSBnaXZlbiBsaXN0XG5IYXNoU2V0LnByb3RvdHlwZS5hZGRBbGxUbyA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModGhpcy5zZXQpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBsaXN0LnB1c2godGhpcy5zZXRba2V5c1tpXV0pO1xuICB9XG59O1xuXG5IYXNoU2V0LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5zZXQpLmxlbmd0aDtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLmFkZEFsbCA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gIHZhciBzID0gbGlzdC5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIHYgPSBsaXN0W2ldO1xuICAgIHRoaXMuYWRkKHYpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2hTZXQ7XG5cbi8qKiovIH0pLFxuLyogMjQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLy8gU29tZSBtYXRyaXggKDFkIGFuZCAyZCBhcnJheSkgb3BlcmF0aW9uc1xuZnVuY3Rpb24gTWF0cml4KCkge31cblxuLyoqXG4gKiBtYXRyaXggbXVsdGlwbGljYXRpb25cbiAqIGFycmF5MSwgYXJyYXkyIGFuZCByZXN1bHQgYXJlIDJkIGFycmF5c1xuICovXG5NYXRyaXgubXVsdE1hdCA9IGZ1bmN0aW9uIChhcnJheTEsIGFycmF5Mikge1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheTEubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRbaV0gPSBbXTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFycmF5MlswXS5sZW5ndGg7IGorKykge1xuICAgICAgcmVzdWx0W2ldW2pdID0gMDtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgYXJyYXkxWzBdLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHJlc3VsdFtpXVtqXSArPSBhcnJheTFbaV1ba10gKiBhcnJheTJba11bal07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIG1hdHJpeCB0cmFuc3Bvc2VcbiAqIGFycmF5IGFuZCByZXN1bHQgYXJlIDJkIGFycmF5c1xuICovXG5NYXRyaXgudHJhbnNwb3NlID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5WzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzdWx0W2ldID0gW107XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBhcnJheS5sZW5ndGg7IGorKykge1xuICAgICAgcmVzdWx0W2ldW2pdID0gYXJyYXlbal1baV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogbXVsdGlwbHkgYXJyYXkgd2l0aCBjb25zdGFudFxuICogYXJyYXkgYW5kIHJlc3VsdCBhcmUgMWQgYXJyYXlzXG4gKi9cbk1hdHJpeC5tdWx0Q29ucyA9IGZ1bmN0aW9uIChhcnJheSwgY29uc3RhbnQpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRbaV0gPSBhcnJheVtpXSAqIGNvbnN0YW50O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogc3Vic3RyYWN0IHR3byBhcnJheXNcbiAqIGFycmF5MSwgYXJyYXkyIGFuZCByZXN1bHQgYXJlIDFkIGFycmF5c1xuICovXG5NYXRyaXgubWludXNPcCA9IGZ1bmN0aW9uIChhcnJheTEsIGFycmF5Mikge1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheTEubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRbaV0gPSBhcnJheTFbaV0gLSBhcnJheTJbaV07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBkb3QgcHJvZHVjdCBvZiB0d28gYXJyYXlzIHdpdGggc2FtZSBzaXplXG4gKiBhcnJheTEgYW5kIGFycmF5MiBhcmUgMWQgYXJyYXlzXG4gKi9cbk1hdHJpeC5kb3RQcm9kdWN0ID0gZnVuY3Rpb24gKGFycmF5MSwgYXJyYXkyKSB7XG4gIHZhciBwcm9kdWN0ID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5MS5sZW5ndGg7IGkrKykge1xuICAgIHByb2R1Y3QgKz0gYXJyYXkxW2ldICogYXJyYXkyW2ldO1xuICB9XG5cbiAgcmV0dXJuIHByb2R1Y3Q7XG59O1xuXG4vKipcbiAqIG1hZ25pdHVkZSBvZiBhbiBhcnJheVxuICogYXJyYXkgaXMgMWQgYXJyYXlcbiAqL1xuTWF0cml4Lm1hZyA9IGZ1bmN0aW9uIChhcnJheSkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZG90UHJvZHVjdChhcnJheSwgYXJyYXkpKTtcbn07XG5cbi8qKlxuICogbm9ybWFsaXphdGlvbiBvZiBhbiBhcnJheVxuICogYXJyYXkgYW5kIHJlc3VsdCBhcmUgMWQgYXJyYXlcbiAqL1xuTWF0cml4Lm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBtYWduaXR1ZGUgPSB0aGlzLm1hZyhhcnJheSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIHJlc3VsdFtpXSA9IGFycmF5W2ldIC8gbWFnbml0dWRlO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogbXVsdGlwbHkgYW4gYXJyYXkgd2l0aCBjZW50ZXJpbmcgbWF0cml4XG4gKiBhcnJheSBhbmQgcmVzdWx0IGFyZSAxZCBhcnJheVxuICovXG5NYXRyaXgubXVsdEdhbW1hID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIHN1bSA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIHN1bSArPSBhcnJheVtpXTtcbiAgfVxuXG4gIHN1bSAqPSAtMSAvIGFycmF5Lmxlbmd0aDtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJyYXkubGVuZ3RoOyBfaSsrKSB7XG4gICAgcmVzdWx0W19pXSA9IHN1bSArIGFycmF5W19pXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBhIHNwZWNpYWwgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gKiByZXN1bHQgPSAwLjUgKiBDICogSU5WICogQ15UICogYXJyYXlcbiAqIGFycmF5IGFuZCByZXN1bHQgYXJlIDFkLCBDIGFuZCBJTlYgYXJlIDJkIGFycmF5c1xuICovXG5NYXRyaXgubXVsdEwgPSBmdW5jdGlvbiAoYXJyYXksIEMsIElOVikge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciB0ZW1wMSA9IFtdO1xuICB2YXIgdGVtcDIgPSBbXTtcblxuICAvLyBtdWx0aXBseSBieSBDXlRcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBDWzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBDLmxlbmd0aDsgaisrKSB7XG4gICAgICBzdW0gKz0gLTAuNSAqIENbal1baV0gKiBhcnJheVtqXTtcbiAgICB9XG4gICAgdGVtcDFbaV0gPSBzdW07XG4gIH1cbiAgLy8gbXVsdGlwbHkgdGhlIHJlc3VsdCBieSBJTlZcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgSU5WLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIgX3N1bSA9IDA7XG4gICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IElOVi5sZW5ndGg7IF9qKyspIHtcbiAgICAgIF9zdW0gKz0gSU5WW19pMl1bX2pdICogdGVtcDFbX2pdO1xuICAgIH1cbiAgICB0ZW1wMltfaTJdID0gX3N1bTtcbiAgfVxuICAvLyBtdWx0aXBseSB0aGUgcmVzdWx0IGJ5IENcbiAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgQy5sZW5ndGg7IF9pMysrKSB7XG4gICAgdmFyIF9zdW0yID0gMDtcbiAgICBmb3IgKHZhciBfajIgPSAwOyBfajIgPCBDWzBdLmxlbmd0aDsgX2oyKyspIHtcbiAgICAgIF9zdW0yICs9IENbX2kzXVtfajJdICogdGVtcDJbX2oyXTtcbiAgICB9XG4gICAgcmVzdWx0W19pM10gPSBfc3VtMjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hdHJpeDtcblxuLyoqKi8gfSksXG4vKiAyNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG4vKipcbiAqIEEgY2xhc3NpYyBRdWlja3NvcnQgYWxnb3JpdGhtIHdpdGggSG9hcmUncyBwYXJ0aXRpb25cbiAqIC0gV29ya3MgYWxzbyBvbiBMaW5rZWRMaXN0IG9iamVjdHNcbiAqXG4gKiBDb3B5cmlnaHQ6IGktVmlzIFJlc2VhcmNoIEdyb3VwLCBCaWxrZW50IFVuaXZlcnNpdHksIDIwMDcgLSBwcmVzZW50XG4gKi9cblxudmFyIExpbmtlZExpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKTtcblxudmFyIFF1aWNrc29ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBRdWlja3NvcnQoQSwgY29tcGFyZUZ1bmN0aW9uKSB7XG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBRdWlja3NvcnQpO1xuXG4gICAgICAgIGlmIChjb21wYXJlRnVuY3Rpb24gIT09IG51bGwgfHwgY29tcGFyZUZ1bmN0aW9uICE9PSB1bmRlZmluZWQpIHRoaXMuY29tcGFyZUZ1bmN0aW9uID0gdGhpcy5fZGVmYXVsdENvbXBhcmVGdW5jdGlvbjtcblxuICAgICAgICB2YXIgbGVuZ3RoID0gdm9pZCAwO1xuICAgICAgICBpZiAoQSBpbnN0YW5jZW9mIExpbmtlZExpc3QpIGxlbmd0aCA9IEEuc2l6ZSgpO2Vsc2UgbGVuZ3RoID0gQS5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5fcXVpY2tzb3J0KEEsIDAsIGxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhRdWlja3NvcnQsIFt7XG4gICAgICAgIGtleTogJ19xdWlja3NvcnQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3F1aWNrc29ydChBLCBwLCByKSB7XG4gICAgICAgICAgICBpZiAocCA8IHIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcSA9IHRoaXMuX3BhcnRpdGlvbihBLCBwLCByKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9xdWlja3NvcnQoQSwgcCwgcSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcXVpY2tzb3J0KEEsIHEgKyAxLCByKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnX3BhcnRpdGlvbicsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfcGFydGl0aW9uKEEsIHAsIHIpIHtcbiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5fZ2V0KEEsIHApO1xuICAgICAgICAgICAgdmFyIGkgPSBwO1xuICAgICAgICAgICAgdmFyIGogPSByO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5jb21wYXJlRnVuY3Rpb24oeCwgdGhpcy5fZ2V0KEEsIGopKSkge1xuICAgICAgICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICAgICAgfXdoaWxlICh0aGlzLmNvbXBhcmVGdW5jdGlvbih0aGlzLl9nZXQoQSwgaSksIHgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9aWYgKGkgPCBqKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N3YXAoQSwgaSwgaik7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSByZXR1cm4gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnX2dldCcsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0KG9iamVjdCwgaW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBMaW5rZWRMaXN0KSByZXR1cm4gb2JqZWN0LmdldF9vYmplY3RfYXQoaW5kZXgpO2Vsc2UgcmV0dXJuIG9iamVjdFtpbmRleF07XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19zZXQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3NldChvYmplY3QsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpbmtlZExpc3QpIG9iamVjdC5zZXRfb2JqZWN0X2F0KGluZGV4LCB2YWx1ZSk7ZWxzZSBvYmplY3RbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19zd2FwJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9zd2FwKEEsIGksIGopIHtcbiAgICAgICAgICAgIHZhciB0ZW1wID0gdGhpcy5fZ2V0KEEsIGkpO1xuICAgICAgICAgICAgdGhpcy5fc2V0KEEsIGksIHRoaXMuX2dldChBLCBqKSk7XG4gICAgICAgICAgICB0aGlzLl9zZXQoQSwgaiwgdGVtcCk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19kZWZhdWx0Q29tcGFyZUZ1bmN0aW9uJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWZhdWx0Q29tcGFyZUZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiID4gYTtcbiAgICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBRdWlja3NvcnQ7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gUXVpY2tzb3J0O1xuXG4vKioqLyB9KSxcbi8qIDI2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbi8vIFNpbmd1bGFyIFZhbHVlIERlY29tcG9zaXRpb24gaW1wbGVtZW50YXRpb25cbmZ1bmN0aW9uIFNWRCgpIHt9O1xuXG4vKiBCZWxvdyBzaW5ndWxhciB2YWx1ZSBkZWNvbXBvc2l0aW9uIChzdmQpIGNvZGUgaW5jbHVkaW5nIGh5cG90IGZ1bmN0aW9uIGlzIGFkb3B0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZHJhZ29uZmx5LWFpL0phbWFKU1xuICAgU29tZSBjaGFuZ2VzIGFyZSBhcHBsaWVkIHRvIG1ha2UgdGhlIGNvZGUgY29tcGF0aWJsZSB3aXRoIHRoZSBmY29zZSBjb2RlIGFuZCB0byBtYWtlIGl0IGluZGVwZW5kZW50IGZyb20gSmFtYS5cbiAgIElucHV0IG1hdHJpeCBpcyBjaGFuZ2VkIHRvIGEgMkQgYXJyYXkgaW5zdGVhZCBvZiBKYW1hIG1hdHJpeC4gTWF0cml4IGRpbWVuc2lvbnMgYXJlIHRha2VuIGFjY29yZGluZyB0byAyRCBhcnJheSBpbnN0ZWFkIG9mIHVzaW5nIEphbWEgZnVuY3Rpb25zLlxuICAgQW4gb2JqZWN0IHRoYXQgaW5jbHVkZXMgc2luZ3VsYXIgdmFsdWUgY29tcG9uZW50cyBpcyBjcmVhdGVkIGZvciByZXR1cm4uIFxuICAgVGhlIHR5cGVzIG9mIGlucHV0IHBhcmFtZXRlcnMgb2YgdGhlIGh5cG90IGZ1bmN0aW9uIGFyZSByZW1vdmVkLiBcbiAgIGxldCBpcyB1c2VkIGluc3RlYWQgb2YgdmFyIGZvciB0aGUgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24uXG4qL1xuLypcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNFxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL1xuXG4gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT05cblxuICAgMS4gRGVmaW5pdGlvbnMuXG5cbiAgICAgIFwiTGljZW5zZVwiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbixcbiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LlxuXG4gICAgICBcIkxpY2Vuc29yXCIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5XG4gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICAgIFwiTGVnYWwgRW50aXR5XCIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbFxuICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vblxuICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbixcbiAgICAgIFwiY29udHJvbFwiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlXG4gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvclxuICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlXG4gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LlxuXG4gICAgICBcIllvdVwiIChvciBcIllvdXJcIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eVxuICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS5cblxuICAgICAgXCJTb3VyY2VcIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyxcbiAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb25cbiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuXG5cbiAgICAgIFwiT2JqZWN0XCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWxcbiAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXRcbiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbixcbiAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy5cblxuICAgICAgXCJXb3JrXCIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvclxuICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYVxuICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrXG4gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLlxuXG4gICAgICBcIkRlcml2YXRpdmUgV29ya3NcIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3RcbiAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGVcbiAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnNcbiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzXG4gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW5cbiAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZixcbiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuXG5cbiAgICAgIFwiQ29udHJpYnV0aW9uXCIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmdcbiAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnNcbiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseVxuICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lclxuICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mXG4gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgXCJzdWJtaXR0ZWRcIlxuICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudFxuICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG9cbiAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsXG4gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZVxuICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0XG4gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZVxuICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgXCJOb3QgYSBDb250cmlidXRpb24uXCJcblxuICAgICAgXCJDb250cmlidXRvclwiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eVxuICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kXG4gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay5cblxuICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG4gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsXG4gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZVxuICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsXG4gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGVcbiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uXG5cbiAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLFxuICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGVcbiAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLFxuICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssXG4gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZVxuICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXJcbiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocylcbiAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91XG4gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYVxuICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29ya1xuICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3RcbiAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXNcbiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZVxuICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLlxuXG4gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZVxuICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0XG4gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdVxuICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbiAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yXG4gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmRcblxuICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlc1xuICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZFxuXG4gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3NcbiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kXG4gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yayxcbiAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mXG4gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZFxuXG4gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSBcIk5PVElDRVwiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0c1xuICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3RcbiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWRcbiAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3RcbiAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmVcbiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZFxuICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3JcbiAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvcixcbiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kXG4gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzXG4gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZFxuICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uXG4gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGVcbiAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWRcbiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWRcbiAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZFxuICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvclxuICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsXG4gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGhcbiAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuXG5cbiAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSxcbiAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29ya1xuICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcbiAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLlxuICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeVxuICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWRcbiAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy5cblxuICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZVxuICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLFxuICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlXG4gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS5cblxuICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yXG4gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoXG4gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yXG4gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9uc1xuICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQVxuICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlXG4gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnlcbiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS5cblxuICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksXG4gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSxcbiAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5XG4gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZVxuICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLFxuICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhXG4gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlXG4gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsXG4gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbFxuICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvclxuICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLlxuXG4gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nXG4gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLFxuICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSxcbiAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzXG4gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seVxuICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGZcbiAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSxcbiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eVxuICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvblxuICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuXG5cbiAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OU1xuXG4gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuXG5cbiAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nXG4gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBcInt9XCJcbiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlXG4gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZVxuICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhXG4gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlXG4gICAgICBzYW1lIFwicHJpbnRlZCBwYWdlXCIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llclxuICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLlxuXG4gICBDb3B5cmlnaHQge3l5eXl9IHtuYW1lIG9mIGNvcHlyaWdodCBvd25lcn1cblxuICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5TVkQuc3ZkID0gZnVuY3Rpb24gKEEpIHtcbiAgdGhpcy5VID0gbnVsbDtcbiAgdGhpcy5WID0gbnVsbDtcbiAgdGhpcy5zID0gbnVsbDtcbiAgdGhpcy5tID0gMDtcbiAgdGhpcy5uID0gMDtcbiAgdGhpcy5tID0gQS5sZW5ndGg7XG4gIHRoaXMubiA9IEFbMF0ubGVuZ3RoO1xuICB2YXIgbnUgPSBNYXRoLm1pbih0aGlzLm0sIHRoaXMubik7XG4gIHRoaXMucyA9IGZ1bmN0aW9uIChzKSB7XG4gICAgdmFyIGEgPSBbXTtcbiAgICB3aGlsZSAocy0tID4gMCkge1xuICAgICAgYS5wdXNoKDApO1xuICAgIH1yZXR1cm4gYTtcbiAgfShNYXRoLm1pbih0aGlzLm0gKyAxLCB0aGlzLm4pKTtcbiAgdGhpcy5VID0gZnVuY3Rpb24gKGRpbXMpIHtcbiAgICB2YXIgYWxsb2NhdGUgPSBmdW5jdGlvbiBhbGxvY2F0ZShkaW1zKSB7XG4gICAgICBpZiAoZGltcy5sZW5ndGggPT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBhcnJheSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbXNbMF07IGkrKykge1xuICAgICAgICAgIGFycmF5LnB1c2goYWxsb2NhdGUoZGltcy5zbGljZSgxKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBhbGxvY2F0ZShkaW1zKTtcbiAgfShbdGhpcy5tLCBudV0pO1xuICB0aGlzLlYgPSBmdW5jdGlvbiAoZGltcykge1xuICAgIHZhciBhbGxvY2F0ZSA9IGZ1bmN0aW9uIGFsbG9jYXRlKGRpbXMpIHtcbiAgICAgIGlmIChkaW1zLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGltc1swXTsgaSsrKSB7XG4gICAgICAgICAgYXJyYXkucHVzaChhbGxvY2F0ZShkaW1zLnNsaWNlKDEpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGFsbG9jYXRlKGRpbXMpO1xuICB9KFt0aGlzLm4sIHRoaXMubl0pO1xuICB2YXIgZSA9IGZ1bmN0aW9uIChzKSB7XG4gICAgdmFyIGEgPSBbXTtcbiAgICB3aGlsZSAocy0tID4gMCkge1xuICAgICAgYS5wdXNoKDApO1xuICAgIH1yZXR1cm4gYTtcbiAgfSh0aGlzLm4pO1xuICB2YXIgd29yayA9IGZ1bmN0aW9uIChzKSB7XG4gICAgdmFyIGEgPSBbXTtcbiAgICB3aGlsZSAocy0tID4gMCkge1xuICAgICAgYS5wdXNoKDApO1xuICAgIH1yZXR1cm4gYTtcbiAgfSh0aGlzLm0pO1xuICB2YXIgd2FudHUgPSB0cnVlO1xuICB2YXIgd2FudHYgPSB0cnVlO1xuICB2YXIgbmN0ID0gTWF0aC5taW4odGhpcy5tIC0gMSwgdGhpcy5uKTtcbiAgdmFyIG5ydCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMubiAtIDIsIHRoaXMubSkpO1xuICBmb3IgKHZhciBrID0gMDsgayA8IE1hdGgubWF4KG5jdCwgbnJ0KTsgaysrKSB7XG4gICAgaWYgKGsgPCBuY3QpIHtcbiAgICAgIHRoaXMuc1trXSA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gazsgaSA8IHRoaXMubTsgaSsrKSB7XG4gICAgICAgIHRoaXMuc1trXSA9IFNWRC5oeXBvdCh0aGlzLnNba10sIEFbaV1ba10pO1xuICAgICAgfVxuICAgICAgO1xuICAgICAgaWYgKHRoaXMuc1trXSAhPT0gMC4wKSB7XG4gICAgICAgIGlmIChBW2tdW2tdIDwgMC4wKSB7XG4gICAgICAgICAgdGhpcy5zW2tdID0gLXRoaXMuc1trXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBfaSA9IGs7IF9pIDwgdGhpcy5tOyBfaSsrKSB7XG4gICAgICAgICAgQVtfaV1ba10gLz0gdGhpcy5zW2tdO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgICAgQVtrXVtrXSArPSAxLjA7XG4gICAgICB9XG4gICAgICB0aGlzLnNba10gPSAtdGhpcy5zW2tdO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gayArIDE7IGogPCB0aGlzLm47IGorKykge1xuICAgICAgaWYgKGZ1bmN0aW9uIChsaHMsIHJocykge1xuICAgICAgICByZXR1cm4gbGhzICYmIHJocztcbiAgICAgIH0oayA8IG5jdCwgdGhpcy5zW2tdICE9PSAwLjApKSB7XG4gICAgICAgIHZhciB0ID0gMDtcbiAgICAgICAgZm9yICh2YXIgX2kyID0gazsgX2kyIDwgdGhpcy5tOyBfaTIrKykge1xuICAgICAgICAgIHQgKz0gQVtfaTJdW2tdICogQVtfaTJdW2pdO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgICAgdCA9IC10IC8gQVtrXVtrXTtcbiAgICAgICAgZm9yICh2YXIgX2kzID0gazsgX2kzIDwgdGhpcy5tOyBfaTMrKykge1xuICAgICAgICAgIEFbX2kzXVtqXSArPSB0ICogQVtfaTNdW2tdO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgIH1cbiAgICAgIGVbal0gPSBBW2tdW2pdO1xuICAgIH1cbiAgICA7XG4gICAgaWYgKGZ1bmN0aW9uIChsaHMsIHJocykge1xuICAgICAgcmV0dXJuIGxocyAmJiByaHM7XG4gICAgfSh3YW50dSwgayA8IG5jdCkpIHtcbiAgICAgIGZvciAodmFyIF9pNCA9IGs7IF9pNCA8IHRoaXMubTsgX2k0KyspIHtcbiAgICAgICAgdGhpcy5VW19pNF1ba10gPSBBW19pNF1ba107XG4gICAgICB9XG4gICAgICA7XG4gICAgfVxuICAgIGlmIChrIDwgbnJ0KSB7XG4gICAgICBlW2tdID0gMDtcbiAgICAgIGZvciAodmFyIF9pNSA9IGsgKyAxOyBfaTUgPCB0aGlzLm47IF9pNSsrKSB7XG4gICAgICAgIGVba10gPSBTVkQuaHlwb3QoZVtrXSwgZVtfaTVdKTtcbiAgICAgIH1cbiAgICAgIDtcbiAgICAgIGlmIChlW2tdICE9PSAwLjApIHtcbiAgICAgICAgaWYgKGVbayArIDFdIDwgMC4wKSB7XG4gICAgICAgICAgZVtrXSA9IC1lW2tdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIF9pNiA9IGsgKyAxOyBfaTYgPCB0aGlzLm47IF9pNisrKSB7XG4gICAgICAgICAgZVtfaTZdIC89IGVba107XG4gICAgICAgIH1cbiAgICAgICAgO1xuICAgICAgICBlW2sgKyAxXSArPSAxLjA7XG4gICAgICB9XG4gICAgICBlW2tdID0gLWVba107XG4gICAgICBpZiAoZnVuY3Rpb24gKGxocywgcmhzKSB7XG4gICAgICAgIHJldHVybiBsaHMgJiYgcmhzO1xuICAgICAgfShrICsgMSA8IHRoaXMubSwgZVtrXSAhPT0gMC4wKSkge1xuICAgICAgICBmb3IgKHZhciBfaTcgPSBrICsgMTsgX2k3IDwgdGhpcy5tOyBfaTcrKykge1xuICAgICAgICAgIHdvcmtbX2k3XSA9IDAuMDtcbiAgICAgICAgfVxuICAgICAgICA7XG4gICAgICAgIGZvciAodmFyIF9qID0gayArIDE7IF9qIDwgdGhpcy5uOyBfaisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgX2k4ID0gayArIDE7IF9pOCA8IHRoaXMubTsgX2k4KyspIHtcbiAgICAgICAgICAgIHdvcmtbX2k4XSArPSBlW19qXSAqIEFbX2k4XVtfal07XG4gICAgICAgICAgfVxuICAgICAgICAgIDtcbiAgICAgICAgfVxuICAgICAgICA7XG4gICAgICAgIGZvciAodmFyIF9qMiA9IGsgKyAxOyBfajIgPCB0aGlzLm47IF9qMisrKSB7XG4gICAgICAgICAgdmFyIF90ID0gLWVbX2oyXSAvIGVbayArIDFdO1xuICAgICAgICAgIGZvciAodmFyIF9pOSA9IGsgKyAxOyBfaTkgPCB0aGlzLm07IF9pOSsrKSB7XG4gICAgICAgICAgICBBW19pOV1bX2oyXSArPSBfdCAqIHdvcmtbX2k5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgIH1cbiAgICAgIGlmICh3YW50dikge1xuICAgICAgICBmb3IgKHZhciBfaTEwID0gayArIDE7IF9pMTAgPCB0aGlzLm47IF9pMTArKykge1xuICAgICAgICAgIHRoaXMuVltfaTEwXVtrXSA9IGVbX2kxMF07XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgcCA9IE1hdGgubWluKHRoaXMubiwgdGhpcy5tICsgMSk7XG4gIGlmIChuY3QgPCB0aGlzLm4pIHtcbiAgICB0aGlzLnNbbmN0XSA9IEFbbmN0XVtuY3RdO1xuICB9XG4gIGlmICh0aGlzLm0gPCBwKSB7XG4gICAgdGhpcy5zW3AgLSAxXSA9IDAuMDtcbiAgfVxuICBpZiAobnJ0ICsgMSA8IHApIHtcbiAgICBlW25ydF0gPSBBW25ydF1bcCAtIDFdO1xuICB9XG4gIGVbcCAtIDFdID0gMC4wO1xuICBpZiAod2FudHUpIHtcbiAgICBmb3IgKHZhciBfajMgPSBuY3Q7IF9qMyA8IG51OyBfajMrKykge1xuICAgICAgZm9yICh2YXIgX2kxMSA9IDA7IF9pMTEgPCB0aGlzLm07IF9pMTErKykge1xuICAgICAgICB0aGlzLlVbX2kxMV1bX2ozXSA9IDAuMDtcbiAgICAgIH1cbiAgICAgIDtcbiAgICAgIHRoaXMuVVtfajNdW19qM10gPSAxLjA7XG4gICAgfTtcbiAgICBmb3IgKHZhciBfayA9IG5jdCAtIDE7IF9rID49IDA7IF9rLS0pIHtcbiAgICAgIGlmICh0aGlzLnNbX2tdICE9PSAwLjApIHtcbiAgICAgICAgZm9yICh2YXIgX2o0ID0gX2sgKyAxOyBfajQgPCBudTsgX2o0KyspIHtcbiAgICAgICAgICB2YXIgX3QyID0gMDtcbiAgICAgICAgICBmb3IgKHZhciBfaTEyID0gX2s7IF9pMTIgPCB0aGlzLm07IF9pMTIrKykge1xuICAgICAgICAgICAgX3QyICs9IHRoaXMuVVtfaTEyXVtfa10gKiB0aGlzLlVbX2kxMl1bX2o0XTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIF90MiA9IC1fdDIgLyB0aGlzLlVbX2tdW19rXTtcbiAgICAgICAgICBmb3IgKHZhciBfaTEzID0gX2s7IF9pMTMgPCB0aGlzLm07IF9pMTMrKykge1xuICAgICAgICAgICAgdGhpcy5VW19pMTNdW19qNF0gKz0gX3QyICogdGhpcy5VW19pMTNdW19rXTtcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKHZhciBfaTE0ID0gX2s7IF9pMTQgPCB0aGlzLm07IF9pMTQrKykge1xuICAgICAgICAgIHRoaXMuVVtfaTE0XVtfa10gPSAtdGhpcy5VW19pMTRdW19rXTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5VW19rXVtfa10gPSAxLjAgKyB0aGlzLlVbX2tdW19rXTtcbiAgICAgICAgZm9yICh2YXIgX2kxNSA9IDA7IF9pMTUgPCBfayAtIDE7IF9pMTUrKykge1xuICAgICAgICAgIHRoaXMuVVtfaTE1XVtfa10gPSAwLjA7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBfaTE2ID0gMDsgX2kxNiA8IHRoaXMubTsgX2kxNisrKSB7XG4gICAgICAgICAgdGhpcy5VW19pMTZdW19rXSA9IDAuMDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5VW19rXVtfa10gPSAxLjA7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBpZiAod2FudHYpIHtcbiAgICBmb3IgKHZhciBfazIgPSB0aGlzLm4gLSAxOyBfazIgPj0gMDsgX2syLS0pIHtcbiAgICAgIGlmIChmdW5jdGlvbiAobGhzLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIGxocyAmJiByaHM7XG4gICAgICB9KF9rMiA8IG5ydCwgZVtfazJdICE9PSAwLjApKSB7XG4gICAgICAgIGZvciAodmFyIF9qNSA9IF9rMiArIDE7IF9qNSA8IG51OyBfajUrKykge1xuICAgICAgICAgIHZhciBfdDMgPSAwO1xuICAgICAgICAgIGZvciAodmFyIF9pMTcgPSBfazIgKyAxOyBfaTE3IDwgdGhpcy5uOyBfaTE3KyspIHtcbiAgICAgICAgICAgIF90MyArPSB0aGlzLlZbX2kxN11bX2syXSAqIHRoaXMuVltfaTE3XVtfajVdO1xuICAgICAgICAgIH07XG4gICAgICAgICAgX3QzID0gLV90MyAvIHRoaXMuVltfazIgKyAxXVtfazJdO1xuICAgICAgICAgIGZvciAodmFyIF9pMTggPSBfazIgKyAxOyBfaTE4IDwgdGhpcy5uOyBfaTE4KyspIHtcbiAgICAgICAgICAgIHRoaXMuVltfaTE4XVtfajVdICs9IF90MyAqIHRoaXMuVltfaTE4XVtfazJdO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBfaTE5ID0gMDsgX2kxOSA8IHRoaXMubjsgX2kxOSsrKSB7XG4gICAgICAgIHRoaXMuVltfaTE5XVtfazJdID0gMC4wO1xuICAgICAgfTtcbiAgICAgIHRoaXMuVltfazJdW19rMl0gPSAxLjA7XG4gICAgfTtcbiAgfVxuICB2YXIgcHAgPSBwIC0gMTtcbiAgdmFyIGl0ZXIgPSAwO1xuICB2YXIgZXBzID0gTWF0aC5wb3coMi4wLCAtNTIuMCk7XG4gIHZhciB0aW55ID0gTWF0aC5wb3coMi4wLCAtOTY2LjApO1xuICB3aGlsZSAocCA+IDApIHtcbiAgICB2YXIgX2szID0gdm9pZCAwO1xuICAgIHZhciBrYXNlID0gdm9pZCAwO1xuICAgIGZvciAoX2szID0gcCAtIDI7IF9rMyA+PSAtMTsgX2szLS0pIHtcbiAgICAgIGlmIChfazMgPT09IC0xKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKE1hdGguYWJzKGVbX2szXSkgPD0gdGlueSArIGVwcyAqIChNYXRoLmFicyh0aGlzLnNbX2szXSkgKyBNYXRoLmFicyh0aGlzLnNbX2szICsgMV0pKSkge1xuICAgICAgICBlW19rM10gPSAwLjA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKF9rMyA9PT0gcCAtIDIpIHtcbiAgICAgIGthc2UgPSA0O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIga3MgPSB2b2lkIDA7XG4gICAgICBmb3IgKGtzID0gcCAtIDE7IGtzID49IF9rMzsga3MtLSkge1xuICAgICAgICBpZiAoa3MgPT09IF9rMykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfdDQgPSAoa3MgIT09IHAgPyBNYXRoLmFicyhlW2tzXSkgOiAwLjApICsgKGtzICE9PSBfazMgKyAxID8gTWF0aC5hYnMoZVtrcyAtIDFdKSA6IDAuMCk7XG4gICAgICAgIGlmIChNYXRoLmFicyh0aGlzLnNba3NdKSA8PSB0aW55ICsgZXBzICogX3Q0KSB7XG4gICAgICAgICAgdGhpcy5zW2tzXSA9IDAuMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChrcyA9PT0gX2szKSB7XG4gICAgICAgIGthc2UgPSAzO1xuICAgICAgfSBlbHNlIGlmIChrcyA9PT0gcCAtIDEpIHtcbiAgICAgICAga2FzZSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrYXNlID0gMjtcbiAgICAgICAgX2szID0ga3M7XG4gICAgICB9XG4gICAgfVxuICAgIF9rMysrO1xuICAgIHN3aXRjaCAoa2FzZSkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGYgPSBlW3AgLSAyXTtcbiAgICAgICAgICBlW3AgLSAyXSA9IDAuMDtcbiAgICAgICAgICBmb3IgKHZhciBfajYgPSBwIC0gMjsgX2o2ID49IF9rMzsgX2o2LS0pIHtcbiAgICAgICAgICAgIHZhciBfdDUgPSBTVkQuaHlwb3QodGhpcy5zW19qNl0sIGYpO1xuICAgICAgICAgICAgdmFyIGNzID0gdGhpcy5zW19qNl0gLyBfdDU7XG4gICAgICAgICAgICB2YXIgc24gPSBmIC8gX3Q1O1xuICAgICAgICAgICAgdGhpcy5zW19qNl0gPSBfdDU7XG4gICAgICAgICAgICBpZiAoX2o2ICE9PSBfazMpIHtcbiAgICAgICAgICAgICAgZiA9IC1zbiAqIGVbX2o2IC0gMV07XG4gICAgICAgICAgICAgIGVbX2o2IC0gMV0gPSBjcyAqIGVbX2o2IC0gMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2FudHYpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgX2kyMCA9IDA7IF9pMjAgPCB0aGlzLm47IF9pMjArKykge1xuICAgICAgICAgICAgICAgIF90NSA9IGNzICogdGhpcy5WW19pMjBdW19qNl0gKyBzbiAqIHRoaXMuVltfaTIwXVtwIC0gMV07XG4gICAgICAgICAgICAgICAgdGhpcy5WW19pMjBdW3AgLSAxXSA9IC1zbiAqIHRoaXMuVltfaTIwXVtfajZdICsgY3MgKiB0aGlzLlZbX2kyMF1bcCAtIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVltfaTIwXVtfajZdID0gX3Q1O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9mID0gZVtfazMgLSAxXTtcbiAgICAgICAgICBlW19rMyAtIDFdID0gMC4wO1xuICAgICAgICAgIGZvciAodmFyIF9qNyA9IF9rMzsgX2o3IDwgcDsgX2o3KyspIHtcbiAgICAgICAgICAgIHZhciBfdDYgPSBTVkQuaHlwb3QodGhpcy5zW19qN10sIF9mKTtcbiAgICAgICAgICAgIHZhciBfY3MgPSB0aGlzLnNbX2o3XSAvIF90NjtcbiAgICAgICAgICAgIHZhciBfc24gPSBfZiAvIF90NjtcbiAgICAgICAgICAgIHRoaXMuc1tfajddID0gX3Q2O1xuICAgICAgICAgICAgX2YgPSAtX3NuICogZVtfajddO1xuICAgICAgICAgICAgZVtfajddID0gX2NzICogZVtfajddO1xuICAgICAgICAgICAgaWYgKHdhbnR1KSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pMjEgPSAwOyBfaTIxIDwgdGhpcy5tOyBfaTIxKyspIHtcbiAgICAgICAgICAgICAgICBfdDYgPSBfY3MgKiB0aGlzLlVbX2kyMV1bX2o3XSArIF9zbiAqIHRoaXMuVVtfaTIxXVtfazMgLSAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlVbX2kyMV1bX2szIC0gMV0gPSAtX3NuICogdGhpcy5VW19pMjFdW19qN10gKyBfY3MgKiB0aGlzLlVbX2kyMV1bX2szIC0gMV07XG4gICAgICAgICAgICAgICAgdGhpcy5VW19pMjFdW19qN10gPSBfdDY7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgc2NhbGUgPSBNYXRoLm1heChNYXRoLm1heChNYXRoLm1heChNYXRoLm1heChNYXRoLmFicyh0aGlzLnNbcCAtIDFdKSwgTWF0aC5hYnModGhpcy5zW3AgLSAyXSkpLCBNYXRoLmFicyhlW3AgLSAyXSkpLCBNYXRoLmFicyh0aGlzLnNbX2szXSkpLCBNYXRoLmFicyhlW19rM10pKTtcbiAgICAgICAgICB2YXIgc3AgPSB0aGlzLnNbcCAtIDFdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIHNwbTEgPSB0aGlzLnNbcCAtIDJdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIGVwbTEgPSBlW3AgLSAyXSAvIHNjYWxlO1xuICAgICAgICAgIHZhciBzayA9IHRoaXMuc1tfazNdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIGVrID0gZVtfazNdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIGIgPSAoKHNwbTEgKyBzcCkgKiAoc3BtMSAtIHNwKSArIGVwbTEgKiBlcG0xKSAvIDIuMDtcbiAgICAgICAgICB2YXIgYyA9IHNwICogZXBtMSAqIChzcCAqIGVwbTEpO1xuICAgICAgICAgIHZhciBzaGlmdCA9IDAuMDtcbiAgICAgICAgICBpZiAoZnVuY3Rpb24gKGxocywgcmhzKSB7XG4gICAgICAgICAgICByZXR1cm4gbGhzIHx8IHJocztcbiAgICAgICAgICB9KGIgIT09IDAuMCwgYyAhPT0gMC4wKSkge1xuICAgICAgICAgICAgc2hpZnQgPSBNYXRoLnNxcnQoYiAqIGIgKyBjKTtcbiAgICAgICAgICAgIGlmIChiIDwgMC4wKSB7XG4gICAgICAgICAgICAgIHNoaWZ0ID0gLXNoaWZ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2hpZnQgPSBjIC8gKGIgKyBzaGlmdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBfZjIgPSAoc2sgKyBzcCkgKiAoc2sgLSBzcCkgKyBzaGlmdDtcbiAgICAgICAgICB2YXIgZyA9IHNrICogZWs7XG4gICAgICAgICAgZm9yICh2YXIgX2o4ID0gX2szOyBfajggPCBwIC0gMTsgX2o4KyspIHtcbiAgICAgICAgICAgIHZhciBfdDcgPSBTVkQuaHlwb3QoX2YyLCBnKTtcbiAgICAgICAgICAgIHZhciBfY3MyID0gX2YyIC8gX3Q3O1xuICAgICAgICAgICAgdmFyIF9zbjIgPSBnIC8gX3Q3O1xuICAgICAgICAgICAgaWYgKF9qOCAhPT0gX2szKSB7XG4gICAgICAgICAgICAgIGVbX2o4IC0gMV0gPSBfdDc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfZjIgPSBfY3MyICogdGhpcy5zW19qOF0gKyBfc24yICogZVtfajhdO1xuICAgICAgICAgICAgZVtfajhdID0gX2NzMiAqIGVbX2o4XSAtIF9zbjIgKiB0aGlzLnNbX2o4XTtcbiAgICAgICAgICAgIGcgPSBfc24yICogdGhpcy5zW19qOCArIDFdO1xuICAgICAgICAgICAgdGhpcy5zW19qOCArIDFdID0gX2NzMiAqIHRoaXMuc1tfajggKyAxXTtcbiAgICAgICAgICAgIGlmICh3YW50dikge1xuICAgICAgICAgICAgICBmb3IgKHZhciBfaTIyID0gMDsgX2kyMiA8IHRoaXMubjsgX2kyMisrKSB7XG4gICAgICAgICAgICAgICAgX3Q3ID0gX2NzMiAqIHRoaXMuVltfaTIyXVtfajhdICsgX3NuMiAqIHRoaXMuVltfaTIyXVtfajggKyAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlZbX2kyMl1bX2o4ICsgMV0gPSAtX3NuMiAqIHRoaXMuVltfaTIyXVtfajhdICsgX2NzMiAqIHRoaXMuVltfaTIyXVtfajggKyAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlZbX2kyMl1bX2o4XSA9IF90NztcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF90NyA9IFNWRC5oeXBvdChfZjIsIGcpO1xuICAgICAgICAgICAgX2NzMiA9IF9mMiAvIF90NztcbiAgICAgICAgICAgIF9zbjIgPSBnIC8gX3Q3O1xuICAgICAgICAgICAgdGhpcy5zW19qOF0gPSBfdDc7XG4gICAgICAgICAgICBfZjIgPSBfY3MyICogZVtfajhdICsgX3NuMiAqIHRoaXMuc1tfajggKyAxXTtcbiAgICAgICAgICAgIHRoaXMuc1tfajggKyAxXSA9IC1fc24yICogZVtfajhdICsgX2NzMiAqIHRoaXMuc1tfajggKyAxXTtcbiAgICAgICAgICAgIGcgPSBfc24yICogZVtfajggKyAxXTtcbiAgICAgICAgICAgIGVbX2o4ICsgMV0gPSBfY3MyICogZVtfajggKyAxXTtcbiAgICAgICAgICAgIGlmICh3YW50dSAmJiBfajggPCB0aGlzLm0gLSAxKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pMjMgPSAwOyBfaTIzIDwgdGhpcy5tOyBfaTIzKyspIHtcbiAgICAgICAgICAgICAgICBfdDcgPSBfY3MyICogdGhpcy5VW19pMjNdW19qOF0gKyBfc24yICogdGhpcy5VW19pMjNdW19qOCArIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTIzXVtfajggKyAxXSA9IC1fc24yICogdGhpcy5VW19pMjNdW19qOF0gKyBfY3MyICogdGhpcy5VW19pMjNdW19qOCArIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTIzXVtfajhdID0gX3Q3O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgZVtwIC0gMl0gPSBfZjI7XG4gICAgICAgICAgaXRlciA9IGl0ZXIgKyAxO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0aGlzLnNbX2szXSA8PSAwLjApIHtcbiAgICAgICAgICAgIHRoaXMuc1tfazNdID0gdGhpcy5zW19rM10gPCAwLjAgPyAtdGhpcy5zW19rM10gOiAwLjA7XG4gICAgICAgICAgICBpZiAod2FudHYpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgX2kyNCA9IDA7IF9pMjQgPD0gcHA7IF9pMjQrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuVltfaTI0XVtfazNdID0gLXRoaXMuVltfaTI0XVtfazNdO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAoX2szIDwgcHApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNbX2szXSA+PSB0aGlzLnNbX2szICsgMV0pIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgX3Q4ID0gdGhpcy5zW19rM107XG4gICAgICAgICAgICB0aGlzLnNbX2szXSA9IHRoaXMuc1tfazMgKyAxXTtcbiAgICAgICAgICAgIHRoaXMuc1tfazMgKyAxXSA9IF90ODtcbiAgICAgICAgICAgIGlmICh3YW50diAmJiBfazMgPCB0aGlzLm4gLSAxKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pMjUgPSAwOyBfaTI1IDwgdGhpcy5uOyBfaTI1KyspIHtcbiAgICAgICAgICAgICAgICBfdDggPSB0aGlzLlZbX2kyNV1bX2szICsgMV07XG4gICAgICAgICAgICAgICAgdGhpcy5WW19pMjVdW19rMyArIDFdID0gdGhpcy5WW19pMjVdW19rM107XG4gICAgICAgICAgICAgICAgdGhpcy5WW19pMjVdW19rM10gPSBfdDg7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2FudHUgJiYgX2szIDwgdGhpcy5tIC0gMSkge1xuICAgICAgICAgICAgICBmb3IgKHZhciBfaTI2ID0gMDsgX2kyNiA8IHRoaXMubTsgX2kyNisrKSB7XG4gICAgICAgICAgICAgICAgX3Q4ID0gdGhpcy5VW19pMjZdW19rMyArIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTI2XVtfazMgKyAxXSA9IHRoaXMuVVtfaTI2XVtfazNdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTI2XVtfazNdID0gX3Q4O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2szKys7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpdGVyID0gMDtcbiAgICAgICAgICBwLS07XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfTtcbiAgdmFyIHJlc3VsdCA9IHsgVTogdGhpcy5VLCBWOiB0aGlzLlYsIFM6IHRoaXMucyB9O1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gc3FydChhXjIgKyBiXjIpIHdpdGhvdXQgdW5kZXIvb3ZlcmZsb3cuXG5TVkQuaHlwb3QgPSBmdW5jdGlvbiAoYSwgYikge1xuICB2YXIgciA9IHZvaWQgMDtcbiAgaWYgKE1hdGguYWJzKGEpID4gTWF0aC5hYnMoYikpIHtcbiAgICByID0gYiAvIGE7XG4gICAgciA9IE1hdGguYWJzKGEpICogTWF0aC5zcXJ0KDEgKyByICogcik7XG4gIH0gZWxzZSBpZiAoYiAhPSAwKSB7XG4gICAgciA9IGEgLyBiO1xuICAgIHIgPSBNYXRoLmFicyhiKSAqIE1hdGguc3FydCgxICsgciAqIHIpO1xuICB9IGVsc2Uge1xuICAgIHIgPSAwLjA7XG4gIH1cbiAgcmV0dXJuIHI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNWRDtcblxuLyoqKi8gfSksXG4vKiAyNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG4vKipcbiAqICAgTmVlZGxlbWFuLVd1bnNjaCBhbGdvcml0aG0gaXMgYW4gcHJvY2VkdXJlIHRvIGNvbXB1dGUgdGhlIG9wdGltYWwgZ2xvYmFsIGFsaWdubWVudCBvZiB0d28gc3RyaW5nXG4gKiAgIHNlcXVlbmNlcyBieSBTLkIuTmVlZGxlbWFuIGFuZCBDLkQuV3Vuc2NoICgxOTcwKS5cbiAqXG4gKiAgIEFzaWRlIGZyb20gdGhlIGlucHV0cywgeW91IGNhbiBhc3NpZ24gdGhlIHNjb3JlcyBmb3IsXG4gKiAgIC0gTWF0Y2g6IFRoZSB0d28gY2hhcmFjdGVycyBhdCB0aGUgY3VycmVudCBpbmRleCBhcmUgc2FtZS5cbiAqICAgLSBNaXNtYXRjaDogVGhlIHR3byBjaGFyYWN0ZXJzIGF0IHRoZSBjdXJyZW50IGluZGV4IGFyZSBkaWZmZXJlbnQuXG4gKiAgIC0gSW5zZXJ0aW9uL0RlbGV0aW9uKGdhcHMpOiBUaGUgYmVzdCBhbGlnbm1lbnQgaW52b2x2ZXMgb25lIGxldHRlciBhbGlnbmluZyB0byBhIGdhcCBpbiB0aGUgb3RoZXIgc3RyaW5nLlxuICovXG5cbnZhciBOZWVkbGVtYW5XdW5zY2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmVlZGxlbWFuV3Vuc2NoKHNlcXVlbmNlMSwgc2VxdWVuY2UyKSB7XG4gICAgICAgIHZhciBtYXRjaF9zY29yZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMTtcbiAgICAgICAgdmFyIG1pc21hdGNoX3BlbmFsdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IC0xO1xuICAgICAgICB2YXIgZ2FwX3BlbmFsdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IC0xO1xuXG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOZWVkbGVtYW5XdW5zY2gpO1xuXG4gICAgICAgIHRoaXMuc2VxdWVuY2UxID0gc2VxdWVuY2UxO1xuICAgICAgICB0aGlzLnNlcXVlbmNlMiA9IHNlcXVlbmNlMjtcbiAgICAgICAgdGhpcy5tYXRjaF9zY29yZSA9IG1hdGNoX3Njb3JlO1xuICAgICAgICB0aGlzLm1pc21hdGNoX3BlbmFsdHkgPSBtaXNtYXRjaF9wZW5hbHR5O1xuICAgICAgICB0aGlzLmdhcF9wZW5hbHR5ID0gZ2FwX3BlbmFsdHk7XG5cbiAgICAgICAgLy8gSnVzdCB0aGUgcmVtb3ZlIHJlZHVuZGFuY3lcbiAgICAgICAgdGhpcy5pTWF4ID0gc2VxdWVuY2UxLmxlbmd0aCArIDE7XG4gICAgICAgIHRoaXMuak1heCA9IHNlcXVlbmNlMi5sZW5ndGggKyAxO1xuXG4gICAgICAgIC8vIEdyaWQgbWF0cml4IG9mIHNjb3Jlc1xuICAgICAgICB0aGlzLmdyaWQgPSBuZXcgQXJyYXkodGhpcy5pTWF4KTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmlNYXg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5ncmlkW2ldID0gbmV3IEFycmF5KHRoaXMuak1heCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5qTWF4OyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRbaV1bal0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhY2ViYWNrIG1hdHJpeCAoMkQgYXJyYXksIGVhY2ggY2VsbCBpcyBhbiBhcnJheSBvZiBib29sZWFuIHZhbHVlcyBmb3IgW2BEaWFnYCwgYFVwYCwgYExlZnRgXSBwb3NpdGlvbnMpXG4gICAgICAgIHRoaXMudHJhY2ViYWNrR3JpZCA9IG5ldyBBcnJheSh0aGlzLmlNYXgpO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdGhpcy5pTWF4OyBfaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbX2ldID0gbmV3IEFycmF5KHRoaXMuak1heCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCB0aGlzLmpNYXg7IF9qKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbX2ldW19qXSA9IFtudWxsLCBudWxsLCBudWxsXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBhbGlnbmVkIHNlcXVlbmNlcyAocmV0dXJuIG11bHRpcGxlIHBvc3NpYmlsaXRpZXMpXG4gICAgICAgIHRoaXMuYWxpZ25tZW50cyA9IFtdO1xuXG4gICAgICAgIC8vIEZpbmFsIGFsaWdubWVudCBzY29yZVxuICAgICAgICB0aGlzLnNjb3JlID0gLTE7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHNjb3JlcyBhbmQgdHJhY2ViYWNrc1xuICAgICAgICB0aGlzLmNvbXB1dGVHcmlkcygpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhOZWVkbGVtYW5XdW5zY2gsIFt7XG4gICAgICAgIGtleTogXCJnZXRTY29yZVwiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2NvcmUoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zY29yZTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiBcImdldEFsaWdubWVudHNcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFsaWdubWVudHMoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hbGlnbm1lbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFpbiBkeW5hbWljIHByb2dyYW1taW5nIHByb2NlZHVyZVxuXG4gICAgfSwge1xuICAgICAgICBrZXk6IFwiY29tcHV0ZUdyaWRzXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wdXRlR3JpZHMoKSB7XG4gICAgICAgICAgICAvLyBGaWxsIGluIHRoZSBmaXJzdCByb3dcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgdGhpcy5qTWF4OyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRbMF1bal0gPSB0aGlzLmdyaWRbMF1baiAtIDFdICsgdGhpcy5nYXBfcGVuYWx0eTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbMF1bal0gPSBbZmFsc2UsIGZhbHNlLCB0cnVlXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlsbCBpbiB0aGUgZmlyc3QgY29sdW1uXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRoaXMuaU1heDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkW2ldWzBdID0gdGhpcy5ncmlkW2kgLSAxXVswXSArIHRoaXMuZ2FwX3BlbmFsdHk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFjZWJhY2tHcmlkW2ldWzBdID0gW2ZhbHNlLCB0cnVlLCBmYWxzZV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbGwgdGhlIHJlc3Qgb2YgdGhlIGdyaWRcbiAgICAgICAgICAgIGZvciAodmFyIF9pMiA9IDE7IF9pMiA8IHRoaXMuaU1heDsgX2kyKyspIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfajIgPSAxOyBfajIgPCB0aGlzLmpNYXg7IF9qMisrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIG1heCBzY29yZShzKSBhbW9uZyBbYERpYWdgLCBgVXBgLCBgTGVmdGBdXG4gICAgICAgICAgICAgICAgICAgIHZhciBkaWFnID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXF1ZW5jZTFbX2kyIC0gMV0gPT09IHRoaXMuc2VxdWVuY2UyW19qMiAtIDFdKSBkaWFnID0gdGhpcy5ncmlkW19pMiAtIDFdW19qMiAtIDFdICsgdGhpcy5tYXRjaF9zY29yZTtlbHNlIGRpYWcgPSB0aGlzLmdyaWRbX2kyIC0gMV1bX2oyIC0gMV0gKyB0aGlzLm1pc21hdGNoX3BlbmFsdHk7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHVwID0gdGhpcy5ncmlkW19pMiAtIDFdW19qMl0gKyB0aGlzLmdhcF9wZW5hbHR5O1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IHRoaXMuZ3JpZFtfaTJdW19qMiAtIDFdICsgdGhpcy5nYXBfcGVuYWx0eTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBleGlzdHMgbXVsdGlwbGUgbWF4IHZhbHVlcywgY2FwdHVyZSB0aGVtIGZvciBtdWx0aXBsZSBwYXRoc1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWF4T2YgPSBbZGlhZywgdXAsIGxlZnRdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuYXJyYXlBbGxNYXhJbmRleGVzKG1heE9mKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgR3JpZHNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkW19pMl1bX2oyXSA9IG1heE9mW2luZGljZXNbMF1dO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbX2kyXVtfajJdID0gW2luZGljZXMuaW5jbHVkZXMoMCksIGluZGljZXMuaW5jbHVkZXMoMSksIGluZGljZXMuaW5jbHVkZXMoMildO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIGFsaWdubWVudCBzY29yZVxuICAgICAgICAgICAgdGhpcy5zY29yZSA9IHRoaXMuZ3JpZFt0aGlzLmlNYXggLSAxXVt0aGlzLmpNYXggLSAxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldHMgYWxsIHBvc3NpYmxlIHZhbGlkIHNlcXVlbmNlIGNvbWJpbmF0aW9uc1xuXG4gICAgfSwge1xuICAgICAgICBrZXk6IFwiYWxpZ25tZW50VHJhY2ViYWNrXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBhbGlnbm1lbnRUcmFjZWJhY2soKSB7XG4gICAgICAgICAgICB2YXIgaW5Qcm9jZXNzQWxpZ25tZW50cyA9IFtdO1xuXG4gICAgICAgICAgICBpblByb2Nlc3NBbGlnbm1lbnRzLnB1c2goeyBwb3M6IFt0aGlzLnNlcXVlbmNlMS5sZW5ndGgsIHRoaXMuc2VxdWVuY2UyLmxlbmd0aF0sXG4gICAgICAgICAgICAgICAgc2VxMTogXCJcIixcbiAgICAgICAgICAgICAgICBzZXEyOiBcIlwiXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgd2hpbGUgKGluUHJvY2Vzc0FsaWdubWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudCA9IGluUHJvY2Vzc0FsaWdubWVudHNbMF07XG4gICAgICAgICAgICAgICAgdmFyIGRpcmVjdGlvbnMgPSB0aGlzLnRyYWNlYmFja0dyaWRbY3VycmVudC5wb3NbMF1dW2N1cnJlbnQucG9zWzFdXTtcblxuICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb25zWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGluUHJvY2Vzc0FsaWdubWVudHMucHVzaCh7IHBvczogW2N1cnJlbnQucG9zWzBdIC0gMSwgY3VycmVudC5wb3NbMV0gLSAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcTE6IHRoaXMuc2VxdWVuY2UxW2N1cnJlbnQucG9zWzBdIC0gMV0gKyBjdXJyZW50LnNlcTEsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXEyOiB0aGlzLnNlcXVlbmNlMltjdXJyZW50LnBvc1sxXSAtIDFdICsgY3VycmVudC5zZXEyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICBpblByb2Nlc3NBbGlnbm1lbnRzLnB1c2goeyBwb3M6IFtjdXJyZW50LnBvc1swXSAtIDEsIGN1cnJlbnQucG9zWzFdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcTE6IHRoaXMuc2VxdWVuY2UxW2N1cnJlbnQucG9zWzBdIC0gMV0gKyBjdXJyZW50LnNlcTEsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXEyOiAnLScgKyBjdXJyZW50LnNlcTJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb25zWzJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGluUHJvY2Vzc0FsaWdubWVudHMucHVzaCh7IHBvczogW2N1cnJlbnQucG9zWzBdLCBjdXJyZW50LnBvc1sxXSAtIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VxMTogJy0nICsgY3VycmVudC5zZXExLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VxMjogdGhpcy5zZXF1ZW5jZTJbY3VycmVudC5wb3NbMV0gLSAxXSArIGN1cnJlbnQuc2VxMlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5wb3NbMF0gPT09IDAgJiYgY3VycmVudC5wb3NbMV0gPT09IDApIHRoaXMuYWxpZ25tZW50cy5wdXNoKHsgc2VxdWVuY2UxOiBjdXJyZW50LnNlcTEsXG4gICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlMjogY3VycmVudC5zZXEyXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpblByb2Nlc3NBbGlnbm1lbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFsaWdubWVudHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIZWxwZXIgRnVuY3Rpb25zXG5cbiAgICB9LCB7XG4gICAgICAgIGtleTogXCJnZXRBbGxJbmRleGVzXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBbGxJbmRleGVzKGFyciwgdmFsKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXhlcyA9IFtdLFxuICAgICAgICAgICAgICAgIGkgPSAtMTtcbiAgICAgICAgICAgIHdoaWxlICgoaSA9IGFyci5pbmRleE9mKHZhbCwgaSArIDEpKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5kZXhlcztcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiBcImFycmF5QWxsTWF4SW5kZXhlc1wiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gYXJyYXlBbGxNYXhJbmRleGVzKGFycmF5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBbGxJbmRleGVzKGFycmF5LCBNYXRoLm1heC5hcHBseShudWxsLCBhcnJheSkpO1xuICAgICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIE5lZWRsZW1hbld1bnNjaDtcbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOZWVkbGVtYW5XdW5zY2g7XG5cbi8qKiovIH0pLFxuLyogMjggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGxheW91dEJhc2UgPSBmdW5jdGlvbiBsYXlvdXRCYXNlKCkge1xuICByZXR1cm47XG59O1xuXG5sYXlvdXRCYXNlLkZETGF5b3V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7XG5sYXlvdXRCYXNlLkZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbmxheW91dEJhc2UuRkRMYXlvdXRFZGdlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSk7XG5sYXlvdXRCYXNlLkZETGF5b3V0Tm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjApO1xubGF5b3V0QmFzZS5EaW1lbnNpb25EID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMSk7XG5sYXlvdXRCYXNlLkhhc2hNYXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKTtcbmxheW91dEJhc2UuSGFzaFNldCA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpO1xubGF5b3V0QmFzZS5JR2VvbWV0cnkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xubGF5b3V0QmFzZS5JTWF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5sYXlvdXRCYXNlLkludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcbmxheW91dEJhc2UuUG9pbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTtcbmxheW91dEJhc2UuUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcbmxheW91dEJhc2UuUmFuZG9tU2VlZCA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpO1xubGF5b3V0QmFzZS5SZWN0YW5nbGVEID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG5sYXlvdXRCYXNlLlRyYW5zZm9ybSA9IF9fd2VicGFja19yZXF1aXJlX18oMTcpO1xubGF5b3V0QmFzZS5VbmlxdWVJREdlbmVyZXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xubGF5b3V0QmFzZS5RdWlja3NvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTtcbmxheW91dEJhc2UuTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xubGF5b3V0QmFzZS5MR3JhcGhPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xubGF5b3V0QmFzZS5MR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xubGF5b3V0QmFzZS5MRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5sYXlvdXRCYXNlLkxHcmFwaE1hbmFnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xubGF5b3V0QmFzZS5MTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5sYXlvdXRCYXNlLkxheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xubGF5b3V0QmFzZS5MYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xubGF5b3V0QmFzZS5OZWVkbGVtYW5XdW5zY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTtcbmxheW91dEJhc2UuTWF0cml4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7XG5sYXlvdXRCYXNlLlNWRCA9IF9fd2VicGFja19yZXF1aXJlX18oMjYpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxheW91dEJhc2U7XG5cbi8qKiovIH0pLFxuLyogMjkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gRW1pdHRlcigpIHtcbiAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbn1cblxudmFyIHAgPSBFbWl0dGVyLnByb3RvdHlwZTtcblxucC5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCwgY2FsbGJhY2spIHtcbiAgdGhpcy5saXN0ZW5lcnMucHVzaCh7XG4gICAgZXZlbnQ6IGV2ZW50LFxuICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICB9KTtcbn07XG5cbnAucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGNhbGxiYWNrKSB7XG4gIGZvciAodmFyIGkgPSB0aGlzLmxpc3RlbmVycy5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGwgPSB0aGlzLmxpc3RlbmVyc1tpXTtcblxuICAgIGlmIChsLmV2ZW50ID09PSBldmVudCAmJiBsLmNhbGxiYWNrID09PSBjYWxsYmFjaykge1xuICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxufTtcblxucC5lbWl0ID0gZnVuY3Rpb24gKGV2ZW50LCBkYXRhKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5saXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbCA9IHRoaXMubGlzdGVuZXJzW2ldO1xuXG4gICAgaWYgKGV2ZW50ID09PSBsLmV2ZW50KSB7XG4gICAgICBsLmNhbGxiYWNrKGRhdGEpO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFbWl0dGVyO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG59KTsiLCIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHRoZSBpbnRlcm5hbCBhcmd1bWVudCBwbGFjZWhvbGRlci4gKi9cbnZhciBQTEFDRUhPTERFUiA9ICdfX2xvZGFzaF9wbGFjZWhvbGRlcl9fJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG52YXIgQklORF9GTEFHID0gMSxcbiAgICBCSU5EX0tFWV9GTEFHID0gMixcbiAgICBDVVJSWV9CT1VORF9GTEFHID0gNCxcbiAgICBDVVJSWV9GTEFHID0gOCxcbiAgICBDVVJSWV9SSUdIVF9GTEFHID0gMTYsXG4gICAgUEFSVElBTF9GTEFHID0gMzIsXG4gICAgUEFSVElBTF9SSUdIVF9GTEFHID0gNjQsXG4gICAgQVJZX0ZMQUcgPSAxMjgsXG4gICAgUkVBUkdfRkxBRyA9IDI1NixcbiAgICBGTElQX0ZMQUcgPSA1MTI7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTEsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICBOQU4gPSAwIC8gMDtcblxuLyoqIFVzZWQgdG8gYXNzb2NpYXRlIHdyYXAgbWV0aG9kcyB3aXRoIHRoZWlyIGJpdCBmbGFncy4gKi9cbnZhciB3cmFwRmxhZ3MgPSBbXG4gIFsnYXJ5JywgQVJZX0ZMQUddLFxuICBbJ2JpbmQnLCBCSU5EX0ZMQUddLFxuICBbJ2JpbmRLZXknLCBCSU5EX0tFWV9GTEFHXSxcbiAgWydjdXJyeScsIENVUlJZX0ZMQUddLFxuICBbJ2N1cnJ5UmlnaHQnLCBDVVJSWV9SSUdIVF9GTEFHXSxcbiAgWydmbGlwJywgRkxJUF9GTEFHXSxcbiAgWydwYXJ0aWFsJywgUEFSVElBTF9GTEFHXSxcbiAgWydwYXJ0aWFsUmlnaHQnLCBQQVJUSUFMX1JJR0hUX0ZMQUddLFxuICBbJ3JlYXJnJywgUkVBUkdfRkxBR11cbl07XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKipcbiAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICovXG52YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBtYXRjaCB3cmFwIGRldGFpbCBjb21tZW50cy4gKi9cbnZhciByZVdyYXBDb21tZW50ID0gL1xceyg/OlxcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggLitcXF0gXFwqXFwvKT9cXG4/LyxcbiAgICByZVdyYXBEZXRhaWxzID0gL1xce1xcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggKC4rKVxcXSBcXCovLFxuICAgIHJlU3BsaXREZXRhaWxzID0gLyw/ICYgLztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG52YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xudmFyIHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBhcnJheUVhY2goYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheUluY2x1ZGVzKGFycmF5LCB2YWx1ZSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuICByZXR1cm4gISFsZW5ndGggJiYgYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCAwKSA+IC0xO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgaWYgKHZhbHVlICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG4gIH1cbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBudW1iZXIgb2YgYHBsYWNlaG9sZGVyYCBvY2N1cnJlbmNlcyBpbiBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciBjb3VudC5cbiAqL1xuZnVuY3Rpb24gY291bnRIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gMDtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBpZiAoYXJyYXlbbGVuZ3RoXSA9PT0gcGxhY2Vob2xkZXIpIHtcbiAgICAgIHJlc3VsdCsrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0IGluIElFIDwgOS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSG9zdE9iamVjdCh2YWx1ZSkge1xuICAvLyBNYW55IGhvc3Qgb2JqZWN0cyBhcmUgYE9iamVjdGAgb2JqZWN0cyB0aGF0IGNhbiBjb2VyY2UgdG8gc3RyaW5nc1xuICAvLyBkZXNwaXRlIGhhdmluZyBpbXByb3Blcmx5IGRlZmluZWQgYHRvU3RyaW5nYCBtZXRob2RzLlxuICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9ICEhKHZhbHVlICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyBhbGwgYHBsYWNlaG9sZGVyYCBlbGVtZW50cyBpbiBgYXJyYXlgIHdpdGggYW4gaW50ZXJuYWwgcGxhY2Vob2xkZXJcbiAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZWlyIGluZGV4ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byByZXBsYWNlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKHZhbHVlID09PSBwbGFjZWhvbGRlciB8fCB2YWx1ZSA9PT0gUExBQ0VIT0xERVIpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IFBMQUNFSE9MREVSO1xuICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG52YXIgY29yZUpzRGF0YSA9IHJvb3RbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xudmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbn0oKSk7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qIFVzZWQgdG8gc2V0IGB0b1N0cmluZ2AgbWV0aG9kcy4gKi9cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKSxcbiAgICAgIG5hbWUgPSBnZXROYXRpdmUubmFtZTtcblxuICByZXR1cm4gKG5hbWUgJiYgbmFtZS5sZW5ndGggPiAyKSA/IGZ1bmMgOiB1bmRlZmluZWQ7XG59KCkpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNyZWF0ZWAgd2l0aG91dCBzdXBwb3J0IGZvciBhc3NpZ25pbmdcbiAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZUNyZWF0ZShwcm90bykge1xuICByZXR1cm4gaXNPYmplY3QocHJvdG8pID8gb2JqZWN0Q3JlYXRlKHByb3RvKSA6IHt9O1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSAoaXNGdW5jdGlvbih2YWx1ZSkgfHwgaXNIb3N0T2JqZWN0KHZhbHVlKSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yO1xuICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMsXG4gKiBwbGFjZWhvbGRlcnMsIGFuZCBwcm92aWRlZCBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBhcnJheSBvZiBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbXMge2Jvb2xlYW59IFtpc0N1cnJpZWRdIFNwZWNpZnkgY29tcG9zaW5nIGZvciBhIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VBcmdzKGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgYXJnc0xlbmd0aCA9IGFyZ3MubGVuZ3RoLFxuICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgcmFuZ2VMZW5ndGggPSBuYXRpdmVNYXgoYXJnc0xlbmd0aCAtIGhvbGRlcnNMZW5ndGgsIDApLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSxcbiAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICB3aGlsZSAoKytsZWZ0SW5kZXggPCBsZWZ0TGVuZ3RoKSB7XG4gICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2FyZ3NJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgcmVzdWx0W2hvbGRlcnNbYXJnc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleF07XG4gICAgfVxuICB9XG4gIHdoaWxlIChyYW5nZUxlbmd0aC0tKSB7XG4gICAgcmVzdWx0W2xlZnRJbmRleCsrXSA9IGFyZ3NbYXJnc0luZGV4KytdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBjb21wb3NlQXJnc2AgZXhjZXB0IHRoYXQgdGhlIGFyZ3VtZW50cyBjb21wb3NpdGlvblxuICogaXMgdGFpbG9yZWQgZm9yIGBfLnBhcnRpYWxSaWdodGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICogQHBhcmFtIHtBcnJheX0gaG9sZGVycyBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKSB7XG4gIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgIGhvbGRlcnNJbmRleCA9IC0xLFxuICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgcmlnaHRJbmRleCA9IC0xLFxuICAgICAgcmlnaHRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICByZXN1bHQgPSBBcnJheShyYW5nZUxlbmd0aCArIHJpZ2h0TGVuZ3RoKSxcbiAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICB3aGlsZSAoKythcmdzSW5kZXggPCByYW5nZUxlbmd0aCkge1xuICAgIHJlc3VsdFthcmdzSW5kZXhdID0gYXJnc1thcmdzSW5kZXhdO1xuICB9XG4gIHZhciBvZmZzZXQgPSBhcmdzSW5kZXg7XG4gIHdoaWxlICgrK3JpZ2h0SW5kZXggPCByaWdodExlbmd0aCkge1xuICAgIHJlc3VsdFtvZmZzZXQgKyByaWdodEluZGV4XSA9IHBhcnRpYWxzW3JpZ2h0SW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2hvbGRlcnNJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgcmVzdWx0W29mZnNldCArIGhvbGRlcnNbaG9sZGVyc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBvcHRpb25hbCBgdGhpc2BcbiAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCaW5kKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcpIHtcbiAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBCSU5EX0ZMQUcsXG4gICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgcmV0dXJuIGZuLmFwcGx5KGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmd1bWVudHMpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGluc3RhbmNlIG9mIGBDdG9yYCByZWdhcmRsZXNzIG9mXG4gKiB3aGV0aGVyIGl0IHdhcyBpbnZva2VkIGFzIHBhcnQgb2YgYSBgbmV3YCBleHByZXNzaW9uIG9yIGJ5IGBjYWxsYCBvciBgYXBwbHlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBDdG9yIFRoZSBjb25zdHJ1Y3RvciB0byB3cmFwLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ3RvcihDdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAvLyBVc2UgYSBgc3dpdGNoYCBzdGF0ZW1lbnQgdG8gd29yayB3aXRoIGNsYXNzIGNvbnN0cnVjdG9ycy4gU2VlXG4gICAgLy8gaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1mdW5jdGlvbi1vYmplY3RzLWNhbGwtdGhpc2FyZ3VtZW50LWFyZ3VtZW50c2xpc3RcbiAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBDdG9yO1xuICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSk7XG4gICAgICBjYXNlIDI6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICBjYXNlIDU6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdKTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pO1xuICAgICAgY2FzZSA3OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSwgYXJnc1s2XSk7XG4gICAgfVxuICAgIHZhciB0aGlzQmluZGluZyA9IGJhc2VDcmVhdGUoQ3Rvci5wcm90b3R5cGUpLFxuICAgICAgICByZXN1bHQgPSBDdG9yLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcblxuICAgIC8vIE1pbWljIHRoZSBjb25zdHJ1Y3RvcidzIGByZXR1cm5gIGJlaGF2aW9yLlxuICAgIC8vIFNlZSBodHRwczovL2VzNS5naXRodWIuaW8vI3gxMy4yLjIgZm9yIG1vcmUgZGV0YWlscy5cbiAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBlbmFibGUgY3VycnlpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtudW1iZXJ9IGFyaXR5IFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSkge1xuICB2YXIgQ3RvciA9IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKTtcblxuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgfVxuICAgIHZhciBob2xkZXJzID0gKGxlbmd0aCA8IDMgJiYgYXJnc1swXSAhPT0gcGxhY2Vob2xkZXIgJiYgYXJnc1tsZW5ndGggLSAxXSAhPT0gcGxhY2Vob2xkZXIpXG4gICAgICA/IFtdXG4gICAgICA6IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcblxuICAgIGxlbmd0aCAtPSBob2xkZXJzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoIDwgYXJpdHkpIHtcbiAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICBmdW5jLCBiaXRtYXNrLCBjcmVhdGVIeWJyaWQsIHdyYXBwZXIucGxhY2Vob2xkZXIsIHVuZGVmaW5lZCxcbiAgICAgICAgYXJncywgaG9sZGVycywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFyaXR5IC0gbGVuZ3RoKTtcbiAgICB9XG4gICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICByZXR1cm4gYXBwbHkoZm4sIHRoaXMsIGFyZ3MpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCBvcHRpb25hbCBgdGhpc2BcbiAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLCBwYXJ0aWFsIGFwcGxpY2F0aW9uLCBhbmQgY3VycnlpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc1JpZ2h0XSBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZFxuICogIHRvIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc1JpZ2h0XSBUaGUgYHBhcnRpYWxzUmlnaHRgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSHlicmlkKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICB2YXIgaXNBcnkgPSBiaXRtYXNrICYgQVJZX0ZMQUcsXG4gICAgICBpc0JpbmQgPSBiaXRtYXNrICYgQklORF9GTEFHLFxuICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIEJJTkRfS0VZX0ZMQUcsXG4gICAgICBpc0N1cnJpZWQgPSBiaXRtYXNrICYgKENVUlJZX0ZMQUcgfCBDVVJSWV9SSUdIVF9GTEFHKSxcbiAgICAgIGlzRmxpcCA9IGJpdG1hc2sgJiBGTElQX0ZMQUcsXG4gICAgICBDdG9yID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogY3JlYXRlQ3RvcihmdW5jKTtcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICBhcmdzID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgYXJnc1tpbmRleF0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgIH1cbiAgICBpZiAoaXNDdXJyaWVkKSB7XG4gICAgICB2YXIgcGxhY2Vob2xkZXIgPSBnZXRIb2xkZXIod3JhcHBlciksXG4gICAgICAgICAgaG9sZGVyc0NvdW50ID0gY291bnRIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcbiAgICB9XG4gICAgaWYgKHBhcnRpYWxzKSB7XG4gICAgICBhcmdzID0gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCk7XG4gICAgfVxuICAgIGlmIChwYXJ0aWFsc1JpZ2h0KSB7XG4gICAgICBhcmdzID0gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGlzQ3VycmllZCk7XG4gICAgfVxuICAgIGxlbmd0aCAtPSBob2xkZXJzQ291bnQ7XG4gICAgaWYgKGlzQ3VycmllZCAmJiBsZW5ndGggPCBhcml0eSkge1xuICAgICAgdmFyIG5ld0hvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG4gICAgICByZXR1cm4gY3JlYXRlUmVjdXJyeShcbiAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB0aGlzQXJnLFxuICAgICAgICBhcmdzLCBuZXdIb2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkgLSBsZW5ndGhcbiAgICAgICk7XG4gICAgfVxuICAgIHZhciB0aGlzQmluZGluZyA9IGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLFxuICAgICAgICBmbiA9IGlzQmluZEtleSA/IHRoaXNCaW5kaW5nW2Z1bmNdIDogZnVuYztcblxuICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICAgIGlmIChhcmdQb3MpIHtcbiAgICAgIGFyZ3MgPSByZW9yZGVyKGFyZ3MsIGFyZ1Bvcyk7XG4gICAgfSBlbHNlIGlmIChpc0ZsaXAgJiYgbGVuZ3RoID4gMSkge1xuICAgICAgYXJncy5yZXZlcnNlKCk7XG4gICAgfVxuICAgIGlmIChpc0FyeSAmJiBhcnkgPCBsZW5ndGgpIHtcbiAgICAgIGFyZ3MubGVuZ3RoID0gYXJ5O1xuICAgIH1cbiAgICBpZiAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSB7XG4gICAgICBmbiA9IEN0b3IgfHwgY3JlYXRlQ3Rvcihmbik7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG4gIH1cbiAgcmV0dXJuIHdyYXBwZXI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZ1xuICogb2YgYHRoaXNBcmdgIGFuZCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpIHtcbiAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBCSU5EX0ZMQUcsXG4gICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgIGxlZnRJbmRleCA9IC0xLFxuICAgICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICBhcmdzID0gQXJyYXkobGVmdExlbmd0aCArIGFyZ3NMZW5ndGgpLFxuICAgICAgICBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG5cbiAgICB3aGlsZSAoKytsZWZ0SW5kZXggPCBsZWZ0TGVuZ3RoKSB7XG4gICAgICBhcmdzW2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgIH1cbiAgICB3aGlsZSAoYXJnc0xlbmd0aC0tKSB7XG4gICAgICBhcmdzW2xlZnRJbmRleCsrXSA9IGFyZ3VtZW50c1srK2FyZ3NJbmRleF07XG4gICAgfVxuICAgIHJldHVybiBhcHBseShmbiwgaXNCaW5kID8gdGhpc0FyZyA6IHRoaXMsIGFyZ3MpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBjb250aW51ZSBjdXJyeWluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwRnVuYyBUaGUgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBgZnVuY2Agd3JhcHBlci5cbiAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYywgYml0bWFzaywgd3JhcEZ1bmMsIHBsYWNlaG9sZGVyLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gIHZhciBpc0N1cnJ5ID0gYml0bWFzayAmIENVUlJZX0ZMQUcsXG4gICAgICBuZXdIb2xkZXJzID0gaXNDdXJyeSA/IGhvbGRlcnMgOiB1bmRlZmluZWQsXG4gICAgICBuZXdIb2xkZXJzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogaG9sZGVycyxcbiAgICAgIG5ld1BhcnRpYWxzID0gaXNDdXJyeSA/IHBhcnRpYWxzIDogdW5kZWZpbmVkLFxuICAgICAgbmV3UGFydGlhbHNSaWdodCA9IGlzQ3VycnkgPyB1bmRlZmluZWQgOiBwYXJ0aWFscztcblxuICBiaXRtYXNrIHw9IChpc0N1cnJ5ID8gUEFSVElBTF9GTEFHIDogUEFSVElBTF9SSUdIVF9GTEFHKTtcbiAgYml0bWFzayAmPSB+KGlzQ3VycnkgPyBQQVJUSUFMX1JJR0hUX0ZMQUcgOiBQQVJUSUFMX0ZMQUcpO1xuXG4gIGlmICghKGJpdG1hc2sgJiBDVVJSWV9CT1VORF9GTEFHKSkge1xuICAgIGJpdG1hc2sgJj0gfihCSU5EX0ZMQUcgfCBCSU5EX0tFWV9GTEFHKTtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSB3cmFwRnVuYyhmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBuZXdQYXJ0aWFscywgbmV3SG9sZGVycywgbmV3UGFydGlhbHNSaWdodCwgbmV3SG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHkpO1xuICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsIGZ1bmMsIGJpdG1hc2spO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGVpdGhlciBjdXJyaWVzIG9yIGludm9rZXMgYGZ1bmNgIHdpdGggb3B0aW9uYWxcbiAqIGB0aGlzYCBiaW5kaW5nIGFuZCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gKiAgVGhlIGJpdG1hc2sgbWF5IGJlIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6XG4gKiAgICAgMSAtIGBfLmJpbmRgXG4gKiAgICAgMiAtIGBfLmJpbmRLZXlgXG4gKiAgICAgNCAtIGBfLmN1cnJ5YCBvciBgXy5jdXJyeVJpZ2h0YCBvZiBhIGJvdW5kIGZ1bmN0aW9uXG4gKiAgICAgOCAtIGBfLmN1cnJ5YFxuICogICAgMTYgLSBgXy5jdXJyeVJpZ2h0YFxuICogICAgMzIgLSBgXy5wYXJ0aWFsYFxuICogICAgNjQgLSBgXy5wYXJ0aWFsUmlnaHRgXG4gKiAgIDEyOCAtIGBfLnJlYXJnYFxuICogICAyNTYgLSBgXy5hcnlgXG4gKiAgIDUxMiAtIGBfLmZsaXBgXG4gKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gIHZhciBpc0JpbmRLZXkgPSBiaXRtYXNrICYgQklORF9LRVlfRkxBRztcbiAgaWYgKCFpc0JpbmRLZXkgJiYgdHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB2YXIgbGVuZ3RoID0gcGFydGlhbHMgPyBwYXJ0aWFscy5sZW5ndGggOiAwO1xuICBpZiAoIWxlbmd0aCkge1xuICAgIGJpdG1hc2sgJj0gfihQQVJUSUFMX0ZMQUcgfCBQQVJUSUFMX1JJR0hUX0ZMQUcpO1xuICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgfVxuICBhcnkgPSBhcnkgPT09IHVuZGVmaW5lZCA/IGFyeSA6IG5hdGl2ZU1heCh0b0ludGVnZXIoYXJ5KSwgMCk7XG4gIGFyaXR5ID0gYXJpdHkgPT09IHVuZGVmaW5lZCA/IGFyaXR5IDogdG9JbnRlZ2VyKGFyaXR5KTtcbiAgbGVuZ3RoIC09IGhvbGRlcnMgPyBob2xkZXJzLmxlbmd0aCA6IDA7XG5cbiAgaWYgKGJpdG1hc2sgJiBQQVJUSUFMX1JJR0hUX0ZMQUcpIHtcbiAgICB2YXIgcGFydGlhbHNSaWdodCA9IHBhcnRpYWxzLFxuICAgICAgICBob2xkZXJzUmlnaHQgPSBob2xkZXJzO1xuXG4gICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIG5ld0RhdGEgPSBbXG4gICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCxcbiAgICBhcmdQb3MsIGFyeSwgYXJpdHlcbiAgXTtcblxuICBmdW5jID0gbmV3RGF0YVswXTtcbiAgYml0bWFzayA9IG5ld0RhdGFbMV07XG4gIHRoaXNBcmcgPSBuZXdEYXRhWzJdO1xuICBwYXJ0aWFscyA9IG5ld0RhdGFbM107XG4gIGhvbGRlcnMgPSBuZXdEYXRhWzRdO1xuICBhcml0eSA9IG5ld0RhdGFbOV0gPSBuZXdEYXRhWzldID09IG51bGxcbiAgICA/IChpc0JpbmRLZXkgPyAwIDogZnVuYy5sZW5ndGgpXG4gICAgOiBuYXRpdmVNYXgobmV3RGF0YVs5XSAtIGxlbmd0aCwgMCk7XG5cbiAgaWYgKCFhcml0eSAmJiBiaXRtYXNrICYgKENVUlJZX0ZMQUcgfCBDVVJSWV9SSUdIVF9GTEFHKSkge1xuICAgIGJpdG1hc2sgJj0gfihDVVJSWV9GTEFHIHwgQ1VSUllfUklHSFRfRkxBRyk7XG4gIH1cbiAgaWYgKCFiaXRtYXNrIHx8IGJpdG1hc2sgPT0gQklORF9GTEFHKSB7XG4gICAgdmFyIHJlc3VsdCA9IGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZyk7XG4gIH0gZWxzZSBpZiAoYml0bWFzayA9PSBDVVJSWV9GTEFHIHx8IGJpdG1hc2sgPT0gQ1VSUllfUklHSFRfRkxBRykge1xuICAgIHJlc3VsdCA9IGNyZWF0ZUN1cnJ5KGZ1bmMsIGJpdG1hc2ssIGFyaXR5KTtcbiAgfSBlbHNlIGlmICgoYml0bWFzayA9PSBQQVJUSUFMX0ZMQUcgfHwgYml0bWFzayA9PSAoQklORF9GTEFHIHwgUEFSVElBTF9GTEFHKSkgJiYgIWhvbGRlcnMubGVuZ3RoKSB7XG4gICAgcmVzdWx0ID0gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscyk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gY3JlYXRlSHlicmlkLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gIH1cbiAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsIGZ1bmMsIGJpdG1hc2spO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGFyZ3VtZW50IHBsYWNlaG9sZGVyIHZhbHVlIGZvciBgZnVuY2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldEhvbGRlcihmdW5jKSB7XG4gIHZhciBvYmplY3QgPSBmdW5jO1xuICByZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHdyYXBwZXIgZGV0YWlscyBmcm9tIHRoZSBgc291cmNlYCBib2R5IGNvbW1lbnQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3cmFwcGVyIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIGdldFdyYXBEZXRhaWxzKHNvdXJjZSkge1xuICB2YXIgbWF0Y2ggPSBzb3VyY2UubWF0Y2gocmVXcmFwRGV0YWlscyk7XG4gIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdLnNwbGl0KHJlU3BsaXREZXRhaWxzKSA6IFtdO1xufVxuXG4vKipcbiAqIEluc2VydHMgd3JhcHBlciBgZGV0YWlsc2AgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGBzb3VyY2VgIGJvZHkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBtb2RpZnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gaW5zZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbW9kaWZpZWQgc291cmNlLlxuICovXG5mdW5jdGlvbiBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIGRldGFpbHMpIHtcbiAgdmFyIGxlbmd0aCA9IGRldGFpbHMubGVuZ3RoLFxuICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICBkZXRhaWxzW2xhc3RJbmRleF0gPSAobGVuZ3RoID4gMSA/ICcmICcgOiAnJykgKyBkZXRhaWxzW2xhc3RJbmRleF07XG4gIGRldGFpbHMgPSBkZXRhaWxzLmpvaW4obGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICByZXR1cm4gc291cmNlLnJlcGxhY2UocmVXcmFwQ29tbWVudCwgJ3tcXG4vKiBbd3JhcHBlZCB3aXRoICcgKyBkZXRhaWxzICsgJ10gKi9cXG4nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAodHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IHJlSXNVaW50LnRlc3QodmFsdWUpKSAmJlxuICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7XG59XG5cbi8qKlxuICogUmVvcmRlciBgYXJyYXlgIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGluZGV4ZXMgd2hlcmUgdGhlIGVsZW1lbnQgYXRcbiAqIHRoZSBmaXJzdCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlIGVsZW1lbnQgYXRcbiAqIHRoZSBzZWNvbmQgaW5kZXggaXMgYXNzaWduZWQgYXMgdGhlIHNlY29uZCBlbGVtZW50LCBhbmQgc28gb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byByZW9yZGVyLlxuICogQHBhcmFtIHtBcnJheX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJyYXkgaW5kZXhlcy5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiByZW9yZGVyKGFycmF5LCBpbmRleGVzKSB7XG4gIHZhciBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICBsZW5ndGggPSBuYXRpdmVNaW4oaW5kZXhlcy5sZW5ndGgsIGFyckxlbmd0aCksXG4gICAgICBvbGRBcnJheSA9IGNvcHlBcnJheShhcnJheSk7XG5cbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdO1xuICAgIGFycmF5W2xlbmd0aF0gPSBpc0luZGV4KGluZGV4LCBhcnJMZW5ndGgpID8gb2xkQXJyYXlbaW5kZXhdIDogdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgd3JhcHBlcmAgdG8gbWltaWMgdGhlIHNvdXJjZSBvZiBgcmVmZXJlbmNlYFxuICogd2l0aCB3cmFwcGVyIGRldGFpbHMgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIHNvdXJjZSBib2R5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWZlcmVuY2UgVGhlIHJlZmVyZW5jZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYHdyYXBwZXJgLlxuICovXG52YXIgc2V0V3JhcFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbih3cmFwcGVyLCByZWZlcmVuY2UsIGJpdG1hc2spIHtcbiAgdmFyIHNvdXJjZSA9IChyZWZlcmVuY2UgKyAnJyk7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eSh3cmFwcGVyLCAndG9TdHJpbmcnLCB7XG4gICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAndmFsdWUnOiBjb25zdGFudChpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIHVwZGF0ZVdyYXBEZXRhaWxzKGdldFdyYXBEZXRhaWxzKHNvdXJjZSksIGJpdG1hc2spKSlcbiAgfSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogVXBkYXRlcyB3cmFwcGVyIGBkZXRhaWxzYCBiYXNlZCBvbiBgYml0bWFza2AgZmxhZ3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtBcnJheX0gZGV0YWlscyBUaGUgZGV0YWlscyB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkZXRhaWxzYC5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlV3JhcERldGFpbHMoZGV0YWlscywgYml0bWFzaykge1xuICBhcnJheUVhY2god3JhcEZsYWdzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgdmFyIHZhbHVlID0gJ18uJyArIHBhaXJbMF07XG4gICAgaWYgKChiaXRtYXNrICYgcGFpclsxXSkgJiYgIWFycmF5SW5jbHVkZXMoZGV0YWlscywgdmFsdWUpKSB7XG4gICAgICBkZXRhaWxzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkZXRhaWxzLnNvcnQoKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyZ3VtZW50cyBvZiBgZnVuY2AgYW5kIGVpdGhlciBpbnZva2VzXG4gKiBgZnVuY2AgcmV0dXJuaW5nIGl0cyByZXN1bHQsIGlmIGF0IGxlYXN0IGBhcml0eWAgbnVtYmVyIG9mIGFyZ3VtZW50cyBoYXZlXG4gKiBiZWVuIHByb3ZpZGVkLCBvciByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHRoZSByZW1haW5pbmcgYGZ1bmNgXG4gKiBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGBmdW5jYCBtYXkgYmUgc3BlY2lmaWVkIGlmIGBmdW5jLmxlbmd0aGBcbiAqIGlzIG5vdCBzdWZmaWNpZW50LlxuICpcbiAqIFRoZSBgXy5jdXJyeS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgY3VycmllZCBmdW5jdGlvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAqIH07XG4gKlxuICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5KGFiYyk7XG4gKlxuICogY3VycmllZCgxKSgyKSgzKTtcbiAqIC8vID0+IFsxLCAyLCAzXVxuICpcbiAqIGN1cnJpZWQoMSwgMikoMyk7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqXG4gKiBjdXJyaWVkKDEsIDIsIDMpO1xuICogLy8gPT4gWzEsIDIsIDNdXG4gKlxuICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAqIGN1cnJpZWQoMSkoXywgMykoMik7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqL1xuZnVuY3Rpb24gY3VycnkoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gIGFyaXR5ID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBhcml0eTtcbiAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgQ1VSUllfRkxBRywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFyaXR5KTtcbiAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnkucGxhY2Vob2xkZXI7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOC05IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5IGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBpc09iamVjdCh2YWx1ZSkgPyBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9JbnRlZ2VyKDMuMik7XG4gKiAvLyA9PiAzXG4gKlxuICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiAwXG4gKlxuICogXy50b0ludGVnZXIoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvSW50ZWdlcignMy4yJyk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICByZXR1cm4gcmVzdWx0ID09PSByZXN1bHQgPyAocmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0KSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKlxuICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIEFzc2lnbiBkZWZhdWx0IHBsYWNlaG9sZGVycy5cbmN1cnJ5LnBsYWNlaG9sZGVyID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gY3Vycnk7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIERhdGFWaWV3ID0gZ2V0TmF0aXZlKHJvb3QsICdEYXRhVmlldycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFWaWV3O1xuIiwidmFyIGhhc2hDbGVhciA9IHJlcXVpcmUoJy4vX2hhc2hDbGVhcicpLFxuICAgIGhhc2hEZWxldGUgPSByZXF1aXJlKCcuL19oYXNoRGVsZXRlJyksXG4gICAgaGFzaEdldCA9IHJlcXVpcmUoJy4vX2hhc2hHZXQnKSxcbiAgICBoYXNoSGFzID0gcmVxdWlyZSgnLi9faGFzaEhhcycpLFxuICAgIGhhc2hTZXQgPSByZXF1aXJlKCcuL19oYXNoU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG5IYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbkhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG5IYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2g7XG4iLCJ2YXIgbGlzdENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVDbGVhcicpLFxuICAgIGxpc3RDYWNoZURlbGV0ZSA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZURlbGV0ZScpLFxuICAgIGxpc3RDYWNoZUdldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUdldCcpLFxuICAgIGxpc3RDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUhhcycpLFxuICAgIGxpc3RDYWNoZVNldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xuTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbkxpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzO1xuTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTGlzdENhY2hlO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcDtcbiIsInZhciBtYXBDYWNoZUNsZWFyID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVDbGVhcicpLFxuICAgIG1hcENhY2hlRGVsZXRlID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVEZWxldGUnKSxcbiAgICBtYXBDYWNoZUdldCA9IHJlcXVpcmUoJy4vX21hcENhY2hlR2V0JyksXG4gICAgbWFwQ2FjaGVIYXMgPSByZXF1aXJlKCcuL19tYXBDYWNoZUhhcycpLFxuICAgIG1hcENhY2hlU2V0ID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC5cbk1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG5NYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XG5NYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7XG5NYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG5NYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFwQ2FjaGU7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFByb21pc2UgPSBnZXROYXRpdmUocm9vdCwgJ1Byb21pc2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBTZXQgPSBnZXROYXRpdmUocm9vdCwgJ1NldCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldDtcbiIsInZhciBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyksXG4gICAgc2V0Q2FjaGVBZGQgPSByZXF1aXJlKCcuL19zZXRDYWNoZUFkZCcpLFxuICAgIHNldENhY2hlSGFzID0gcmVxdWlyZSgnLi9fc2V0Q2FjaGVIYXMnKTtcblxuLyoqXG4gKlxuICogQ3JlYXRlcyBhbiBhcnJheSBjYWNoZSBvYmplY3QgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoO1xuXG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGU7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdGhpcy5hZGQodmFsdWVzW2luZGV4XSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFNldENhY2hlYC5cblNldENhY2hlLnByb3RvdHlwZS5hZGQgPSBTZXRDYWNoZS5wcm90b3R5cGUucHVzaCA9IHNldENhY2hlQWRkO1xuU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldENhY2hlO1xuIiwidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIHN0YWNrQ2xlYXIgPSByZXF1aXJlKCcuL19zdGFja0NsZWFyJyksXG4gICAgc3RhY2tEZWxldGUgPSByZXF1aXJlKCcuL19zdGFja0RlbGV0ZScpLFxuICAgIHN0YWNrR2V0ID0gcmVxdWlyZSgnLi9fc3RhY2tHZXQnKSxcbiAgICBzdGFja0hhcyA9IHJlcXVpcmUoJy4vX3N0YWNrSGFzJyksXG4gICAgc3RhY2tTZXQgPSByZXF1aXJlKCcuL19zdGFja1NldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzdGFjayBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFN0YWNrYC5cblN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG5TdGFjay5wcm90b3R5cGVbJ2RlbGV0ZSddID0gc3RhY2tEZWxldGU7XG5TdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7XG5TdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG5TdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gU3RhY2s7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFVpbnQ4QXJyYXkgPSByb290LlVpbnQ4QXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gVWludDhBcnJheTtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgV2Vha01hcCA9IGdldE5hdGl2ZShyb290LCAnV2Vha01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdlYWtNYXA7XG4iLCIvKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXBwbHk7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlFYWNoO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZmlsdGVyYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5RmlsdGVyO1xuIiwidmFyIGJhc2VJbmRleE9mID0gcmVxdWlyZSgnLi9fYmFzZUluZGV4T2YnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5jbHVkZXNgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUluY2x1ZGVzO1xuIiwiLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFycmF5SW5jbHVkZXNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlJbmNsdWRlc1dpdGgoYXJyYXksIHZhbHVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoY29tcGFyYXRvcih2YWx1ZSwgYXJyYXlbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiIsInZhciBiYXNlVGltZXMgPSByZXF1aXJlKCcuL19iYXNlVGltZXMnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksXG4gICAgICBpc0FyZyA9ICFpc0FyciAmJiBpc0FyZ3VtZW50cyh2YWx1ZSksXG4gICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgc2tpcEluZGV4ZXMgPSBpc0FyciB8fCBpc0FyZyB8fCBpc0J1ZmYgfHwgaXNUeXBlLFxuICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKFxuICAgICAgICAgICAvLyBTYWZhcmkgOSBoYXMgZW51bWVyYWJsZSBgYXJndW1lbnRzLmxlbmd0aGAgaW4gc3RyaWN0IG1vZGUuXG4gICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbiAgICAgICAgICAgKGlzQnVmZiAmJiAoa2V5ID09ICdvZmZzZXQnIHx8IGtleSA9PSAncGFyZW50JykpIHx8XG4gICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgKGlzVHlwZSAmJiAoa2V5ID09ICdidWZmZXInIHx8IGtleSA9PSAnYnl0ZUxlbmd0aCcgfHwga2V5ID09ICdieXRlT2Zmc2V0JykpIHx8XG4gICAgICAgICAgIC8vIFNraXAgaW5kZXggcHJvcGVydGllcy5cbiAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlMaWtlS2V5cztcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlNYXA7XG4iLCIvKipcbiAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlQdXNoO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleF07XG4gIH1cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5UmVkdWNlO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc29tZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5U29tZShhcnJheSwgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVNvbWU7XG4iLCJ2YXIgYmFzZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fYmFzZVByb3BlcnR5Jyk7XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBhbiBBU0NJSSBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xudmFyIGFzY2lpU2l6ZSA9IGJhc2VQcm9wZXJ0eSgnbGVuZ3RoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYXNjaWlTaXplO1xuIiwidmFyIGJhc2VBc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25WYWx1ZScpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXNzaWduVmFsdWVgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYXNzaWduXG4gKiBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fFxuICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc2lnbk1lcmdlVmFsdWU7XG4iLCJ2YXIgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQXNzaWducyBgdmFsdWVgIHRvIGBrZXlgIG9mIGBvYmplY3RgIGlmIHRoZSBleGlzdGluZyB2YWx1ZSBpcyBub3QgZXF1aXZhbGVudFxuICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV07XG4gIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxKG9ialZhbHVlLCB2YWx1ZSkpIHx8XG4gICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzaWduVmFsdWU7XG4iLCJ2YXIgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzb2NJbmRleE9mO1xuIiwidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUFzc2lnbjtcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXNzaWduSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ25JbihvYmplY3QsIHNvdXJjZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQXNzaWduSW47XG4iLCJ2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19kZWZpbmVQcm9wZXJ0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBhc3NpZ25WYWx1ZWAgYW5kIGBhc3NpZ25NZXJnZVZhbHVlYCB3aXRob3V0XG4gKiB2YWx1ZSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5ID09ICdfX3Byb3RvX18nICYmIGRlZmluZVByb3BlcnR5KSB7XG4gICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgJ2VudW1lcmFibGUnOiB0cnVlLFxuICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ25WYWx1ZTtcbiIsInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25WYWx1ZScpLFxuICAgIGJhc2VBc3NpZ24gPSByZXF1aXJlKCcuL19iYXNlQXNzaWduJyksXG4gICAgYmFzZUFzc2lnbkluID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnbkluJyksXG4gICAgY2xvbmVCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUJ1ZmZlcicpLFxuICAgIGNvcHlBcnJheSA9IHJlcXVpcmUoJy4vX2NvcHlBcnJheScpLFxuICAgIGNvcHlTeW1ib2xzID0gcmVxdWlyZSgnLi9fY29weVN5bWJvbHMnKSxcbiAgICBjb3B5U3ltYm9sc0luID0gcmVxdWlyZSgnLi9fY29weVN5bWJvbHNJbicpLFxuICAgIGdldEFsbEtleXMgPSByZXF1aXJlKCcuL19nZXRBbGxLZXlzJyksXG4gICAgZ2V0QWxsS2V5c0luID0gcmVxdWlyZSgnLi9fZ2V0QWxsS2V5c0luJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaW5pdENsb25lQXJyYXkgPSByZXF1aXJlKCcuL19pbml0Q2xvbmVBcnJheScpLFxuICAgIGluaXRDbG9uZUJ5VGFnID0gcmVxdWlyZSgnLi9faW5pdENsb25lQnlUYWcnKSxcbiAgICBpbml0Q2xvbmVPYmplY3QgPSByZXF1aXJlKCcuL19pbml0Q2xvbmVPYmplY3QnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNNYXAgPSByZXF1aXJlKCcuL2lzTWFwJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNTZXQgPSByZXF1aXJlKCcuL2lzU2V0JyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG52YXIgQ0xPTkVfREVFUF9GTEFHID0gMSxcbiAgICBDTE9ORV9GTEFUX0ZMQUcgPSAyLFxuICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IGBfLmNsb25lYC4gKi9cbnZhciBjbG9uZWFibGVUYWdzID0ge307XG5jbG9uZWFibGVUYWdzW2FyZ3NUYWddID0gY2xvbmVhYmxlVGFnc1thcnJheVRhZ10gPVxuY2xvbmVhYmxlVGFnc1thcnJheUJ1ZmZlclRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXSA9XG5jbG9uZWFibGVUYWdzW2Jvb2xUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRlVGFnXSA9XG5jbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWddID0gY2xvbmVhYmxlVGFnc1tmbG9hdDY0VGFnXSA9XG5jbG9uZWFibGVUYWdzW2ludDhUYWddID0gY2xvbmVhYmxlVGFnc1tpbnQxNlRhZ10gPVxuY2xvbmVhYmxlVGFnc1tpbnQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW21hcFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tudW1iZXJUYWddID0gY2xvbmVhYmxlVGFnc1tvYmplY3RUYWddID1cbmNsb25lYWJsZVRhZ3NbcmVnZXhwVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc2V0VGFnXSA9XG5jbG9uZWFibGVUYWdzW3N0cmluZ1RhZ10gPSBjbG9uZWFibGVUYWdzW3N5bWJvbFRhZ10gPVxuY2xvbmVhYmxlVGFnc1t1aW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPVxuY2xvbmVhYmxlVGFnc1t1aW50MTZUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbmNsb25lYWJsZVRhZ3NbZXJyb3JUYWddID0gY2xvbmVhYmxlVGFnc1tmdW5jVGFnXSA9XG5jbG9uZWFibGVUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xvbmVgIGFuZCBgXy5jbG9uZURlZXBgIHdoaWNoIHRyYWNrc1xuICogdHJhdmVyc2VkIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICogIDEgLSBEZWVwIGNsb25lXG4gKiAgMiAtIEZsYXR0ZW4gaW5oZXJpdGVkIHByb3BlcnRpZXNcbiAqICA0IC0gQ2xvbmUgc3ltYm9sc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSBUaGUga2V5IG9mIGB2YWx1ZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIHBhcmVudCBvYmplY3Qgb2YgYHZhbHVlYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBhbmQgdGhlaXIgY2xvbmUgY291bnRlcnBhcnRzLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIG9iamVjdCwgc3RhY2spIHtcbiAgdmFyIHJlc3VsdCxcbiAgICAgIGlzRGVlcCA9IGJpdG1hc2sgJiBDTE9ORV9ERUVQX0ZMQUcsXG4gICAgICBpc0ZsYXQgPSBiaXRtYXNrICYgQ0xPTkVfRkxBVF9GTEFHLFxuICAgICAgaXNGdWxsID0gYml0bWFzayAmIENMT05FX1NZTUJPTFNfRkxBRztcblxuICBpZiAoY3VzdG9taXplcikge1xuICAgIHJlc3VsdCA9IG9iamVjdCA/IGN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlKTtcbiAgfVxuICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpO1xuICBpZiAoaXNBcnIpIHtcbiAgICByZXN1bHQgPSBpbml0Q2xvbmVBcnJheSh2YWx1ZSk7XG4gICAgaWYgKCFpc0RlZXApIHtcbiAgICAgIHJldHVybiBjb3B5QXJyYXkodmFsdWUsIHJlc3VsdCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgICBpc0Z1bmMgPSB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnO1xuXG4gICAgaWYgKGlzQnVmZmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGNsb25lQnVmZmVyKHZhbHVlLCBpc0RlZXApO1xuICAgIH1cbiAgICBpZiAodGFnID09IG9iamVjdFRhZyB8fCB0YWcgPT0gYXJnc1RhZyB8fCAoaXNGdW5jICYmICFvYmplY3QpKSB7XG4gICAgICByZXN1bHQgPSAoaXNGbGF0IHx8IGlzRnVuYykgPyB7fSA6IGluaXRDbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICByZXR1cm4gaXNGbGF0XG4gICAgICAgICAgPyBjb3B5U3ltYm9sc0luKHZhbHVlLCBiYXNlQXNzaWduSW4ocmVzdWx0LCB2YWx1ZSkpXG4gICAgICAgICAgOiBjb3B5U3ltYm9scyh2YWx1ZSwgYmFzZUFzc2lnbihyZXN1bHQsIHZhbHVlKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2xvbmVhYmxlVGFnc1t0YWddKSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPyB2YWx1ZSA6IHt9O1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gaW5pdENsb25lQnlUYWcodmFsdWUsIHRhZywgaXNEZWVwKTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyBjbG9uZS5cbiAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQodmFsdWUpO1xuICBpZiAoc3RhY2tlZCkge1xuICAgIHJldHVybiBzdGFja2VkO1xuICB9XG4gIHN0YWNrLnNldCh2YWx1ZSwgcmVzdWx0KTtcblxuICBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSkge1xuICAgICAgcmVzdWx0LmFkZChiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN1YlZhbHVlLCB2YWx1ZSwgc3RhY2spKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc01hcCh2YWx1ZSkpIHtcbiAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdC5zZXQoa2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgfSk7XG4gIH1cblxuICB2YXIga2V5c0Z1bmMgPSBpc0Z1bGxcbiAgICA/IChpc0ZsYXQgPyBnZXRBbGxLZXlzSW4gOiBnZXRBbGxLZXlzKVxuICAgIDogKGlzRmxhdCA/IGtleXNJbiA6IGtleXMpO1xuXG4gIHZhciBwcm9wcyA9IGlzQXJyID8gdW5kZWZpbmVkIDoga2V5c0Z1bmModmFsdWUpO1xuICBhcnJheUVhY2gocHJvcHMgfHwgdmFsdWUsIGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIGtleSA9IHN1YlZhbHVlO1xuICAgICAgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBwb3B1bGF0ZSBjbG9uZSAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VDbG9uZTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0Q3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gKiBwcm9wZXJ0aWVzIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xudmFyIGJhc2VDcmVhdGUgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIG9iamVjdCgpIHt9XG4gIHJldHVybiBmdW5jdGlvbihwcm90bykge1xuICAgIGlmICghaXNPYmplY3QocHJvdG8pKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGlmIChvYmplY3RDcmVhdGUpIHtcbiAgICAgIHJldHVybiBvYmplY3RDcmVhdGUocHJvdG8pO1xuICAgIH1cbiAgICBvYmplY3QucHJvdG90eXBlID0gcHJvdG87XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBvYmplY3Q7XG4gICAgb2JqZWN0LnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQ3JlYXRlO1xuIiwidmFyIGJhc2VGb3JPd24gPSByZXF1aXJlKCcuL19iYXNlRm9yT3duJyksXG4gICAgY3JlYXRlQmFzZUVhY2ggPSByZXF1aXJlKCcuL19jcmVhdGVCYXNlRWFjaCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICovXG52YXIgYmFzZUVhY2ggPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRWFjaDtcbiIsInZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8ubWF4YCBhbmQgYF8ubWluYCB3aGljaCBhY2NlcHRzIGFcbiAqIGBjb21wYXJhdG9yYCB0byBkZXRlcm1pbmUgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgdXNlZCB0byBjb21wYXJlIHZhbHVlcy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgY3VycmVudCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgIGlmIChjdXJyZW50ICE9IG51bGwgJiYgKGNvbXB1dGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IChjdXJyZW50ID09PSBjdXJyZW50ICYmICFpc1N5bWJvbChjdXJyZW50KSlcbiAgICAgICAgICA6IGNvbXBhcmF0b3IoY3VycmVudCwgY29tcHV0ZWQpXG4gICAgICAgICkpIHtcbiAgICAgIHZhciBjb21wdXRlZCA9IGN1cnJlbnQsXG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUV4dHJlbXVtO1xuIiwidmFyIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWx0ZXJgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGaWx0ZXI7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmluZEluZGV4O1xuIiwidmFyIGFycmF5UHVzaCA9IHJlcXVpcmUoJy4vX2FycmF5UHVzaCcpLFxuICAgIGlzRmxhdHRlbmFibGUgPSByZXF1aXJlKCcuL19pc0ZsYXR0ZW5hYmxlJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmxhdHRlbmAgd2l0aCBzdXBwb3J0IGZvciByZXN0cmljdGluZyBmbGF0dGVuaW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aCBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0XSBSZXN0cmljdCB0byB2YWx1ZXMgdGhhdCBwYXNzIGBwcmVkaWNhdGVgIGNoZWNrcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHQ9W11dIFRoZSBpbml0aWFsIHJlc3VsdCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZUZsYXR0ZW4oYXJyYXksIGRlcHRoLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgcHJlZGljYXRlIHx8IChwcmVkaWNhdGUgPSBpc0ZsYXR0ZW5hYmxlKTtcbiAgcmVzdWx0IHx8IChyZXN1bHQgPSBbXSk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKGRlcHRoID4gMCAmJiBwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICBpZiAoZGVwdGggPiAxKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGJhc2VGbGF0dGVuKHZhbHVlLCBkZXB0aCAtIDEsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheVB1c2gocmVzdWx0LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHtcbiAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGbGF0dGVuO1xuIiwidmFyIGNyZWF0ZUJhc2VGb3IgPSByZXF1aXJlKCcuL19jcmVhdGVCYXNlRm9yJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG52YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRm9yO1xuIiwidmFyIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93bmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZvck93bjtcbiIsInZhciBjYXN0UGF0aCA9IHJlcXVpcmUoJy4vX2Nhc3RQYXRoJyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHBhdGgpIHtcbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gMCxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gIHdoaWxlIChvYmplY3QgIT0gbnVsbCAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XG4gIH1cbiAgcmV0dXJuIChpbmRleCAmJiBpbmRleCA9PSBsZW5ndGgpID8gb2JqZWN0IDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXQ7XG4iLCJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlc1xuICogYGtleXNGdW5jYCBhbmQgYHN5bWJvbHNGdW5jYCB0byBnZXQgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3ltYm9sc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7XG4gIHZhciByZXN1bHQgPSBrZXlzRnVuYyhvYmplY3QpO1xuICByZXR1cm4gaXNBcnJheShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldEFsbEtleXM7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgZ2V0UmF3VGFnID0gcmVxdWlyZSgnLi9fZ2V0UmF3VGFnJyksXG4gICAgb2JqZWN0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19vYmplY3RUb1N0cmluZycpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICB9XG4gIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICA/IGdldFJhd1RhZyh2YWx1ZSlcbiAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0VGFnO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ndGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUd0KHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPiBvdGhlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR3Q7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc2Agd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUhhcyhvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUhhcztcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYga2V5IGluIE9iamVjdChvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VIYXNJbjtcbiIsInZhciBiYXNlRmluZEluZGV4ID0gcmVxdWlyZSgnLi9fYmFzZUZpbmRJbmRleCcpLFxuICAgIGJhc2VJc05hTiA9IHJlcXVpcmUoJy4vX2Jhc2VJc05hTicpLFxuICAgIHN0cmljdEluZGV4T2YgPSByZXF1aXJlKCcuL19zdHJpY3RJbmRleE9mJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICA/IHN0cmljdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpXG4gICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUluZGV4T2Y7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJndW1lbnRzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0FyZ3VtZW50cztcbiIsInZhciBiYXNlSXNFcXVhbERlZXAgPSByZXF1aXJlKCcuL19iYXNlSXNFcXVhbERlZXAnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRXF1YWxgIHdoaWNoIHN1cHBvcnRzIHBhcnRpYWwgY29tcGFyaXNvbnNcbiAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICogIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICogIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjtcbiAgfVxuICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgYmFzZUlzRXF1YWwsIHN0YWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNFcXVhbDtcbiIsInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgZXF1YWxBcnJheXMgPSByZXF1aXJlKCcuL19lcXVhbEFycmF5cycpLFxuICAgIGVxdWFsQnlUYWcgPSByZXF1aXJlKCcuL19lcXVhbEJ5VGFnJyksXG4gICAgZXF1YWxPYmplY3RzID0gcmVxdWlyZSgnLi9fZXF1YWxPYmplY3RzJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICogcmVmZXJlbmNlcyB0byBiZSBjb21wYXJlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIG9iaklzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgIG90aFRhZyA9IG90aElzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob3RoZXIpO1xuXG4gIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICB2YXIgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICBpZiAoaXNTYW1lVGFnICYmIGlzQnVmZmVyKG9iamVjdCkpIHtcbiAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgfVxuICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgcmV0dXJuIChvYmpJc0FyciB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KSlcbiAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICB9XG4gIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICBvdGhJc1dyYXBwZWQgPSBvdGhJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCAnX193cmFwcGVkX18nKTtcblxuICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgb3RoVW53cmFwcGVkID0gb3RoSXNXcmFwcGVkID8gb3RoZXIudmFsdWUoKSA6IG90aGVyO1xuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzU2FtZVRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICByZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0VxdWFsRGVlcDtcbiIsInZhciBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc01hcCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IG1hcFRhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNNYXA7XG4iLCJ2YXIgU3RhY2sgPSByZXF1aXJlKCcuL19TdGFjaycpLFxuICAgIGJhc2VJc0VxdWFsID0gcmVxdWlyZSgnLi9fYmFzZUlzRXF1YWwnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWF0Y2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICogQHBhcmFtIHtBcnJheX0gbWF0Y2hEYXRhIFRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSwgY3VzdG9taXplcikge1xuICB2YXIgaW5kZXggPSBtYXRjaERhdGEubGVuZ3RoLFxuICAgICAgbGVuZ3RoID0gaW5kZXgsXG4gICAgICBub0N1c3RvbWl6ZXIgPSAhY3VzdG9taXplcjtcblxuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gIWxlbmd0aDtcbiAgfVxuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICB2YXIgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgaWYgKChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSlcbiAgICAgICAgICA/IGRhdGFbMV0gIT09IG9iamVjdFtkYXRhWzBdXVxuICAgICAgICAgIDogIShkYXRhWzBdIGluIG9iamVjdClcbiAgICAgICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgdmFyIGtleSA9IGRhdGFbMF0sXG4gICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgIHNyY1ZhbHVlID0gZGF0YVsxXTtcblxuICAgIGlmIChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSkge1xuICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdGFjayA9IG5ldyBTdGFjaztcbiAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spO1xuICAgICAgfVxuICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgOiByZXN1bHRcbiAgICAgICAgICApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTWF0Y2g7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmFOYCB3aXRob3V0IHN1cHBvcnQgZm9yIG51bWJlciBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc05hTjtcbiIsInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNNYXNrZWQgPSByZXF1aXJlKCcuL19pc01hc2tlZCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqXG4gKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAqL1xudmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xudmFyIHJlSXNIb3N0Q3RvciA9IC9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC87XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNOYXRpdmU7XG4iLCJ2YXIgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzU2V0YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBzZXRUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzU2V0O1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNMZW5ndGggPSByZXF1aXJlKCcuL2lzTGVuZ3RoJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xudmFyIHR5cGVkQXJyYXlUYWdzID0ge307XG50eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbnR5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddID1cbnR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID1cbnR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID1cbnR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Z1bmNUYWddID1cbnR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPSB0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID1cbnR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID1cbnR5cGVkQXJyYXlUYWdzW3NldFRhZ10gPSB0eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddID1cbnR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiZcbiAgICBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc1R5cGVkQXJyYXk7XG4iLCJ2YXIgYmFzZU1hdGNoZXMgPSByZXF1aXJlKCcuL19iYXNlTWF0Y2hlcycpLFxuICAgIGJhc2VNYXRjaGVzUHJvcGVydHkgPSByZXF1aXJlKCcuL19iYXNlTWF0Y2hlc1Byb3BlcnR5JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIHByb3BlcnR5ID0gcmVxdWlyZSgnLi9wcm9wZXJ0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLml0ZXJhdGVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBbdmFsdWU9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGl0ZXJhdGVlLlxuICovXG5mdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpIHtcbiAgLy8gRG9uJ3Qgc3RvcmUgdGhlIGB0eXBlb2ZgIHJlc3VsdCBpbiBhIHZhcmlhYmxlIHRvIGF2b2lkIGEgSklUIGJ1ZyBpbiBTYWZhcmkgOS5cbiAgLy8gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTYwMzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gYmFzZU1hdGNoZXNQcm9wZXJ0eSh2YWx1ZVswXSwgdmFsdWVbMV0pXG4gICAgICA6IGJhc2VNYXRjaGVzKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gcHJvcGVydHkodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJdGVyYXRlZTtcbiIsInZhciBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgbmF0aXZlS2V5cyA9IHJlcXVpcmUoJy4vX25hdGl2ZUtleXMnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICBpZiAoIWlzUHJvdG90eXBlKG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VLZXlzO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBuYXRpdmVLZXlzSW4gPSByZXF1aXJlKCcuL19uYXRpdmVLZXlzSW4nKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzSW5gIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3QpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO1xuICB9XG4gIHZhciBpc1Byb3RvID0gaXNQcm90b3R5cGUob2JqZWN0KSxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoIShrZXkgPT0gJ2NvbnN0cnVjdG9yJyAmJiAoaXNQcm90byB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlS2V5c0luO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5sdGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUx0KHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPCBvdGhlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTHQ7XG4iLCJ2YXIgYmFzZUVhY2ggPSByZXF1aXJlKCcuL19iYXNlRWFjaCcpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hcGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlTWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gaXRlcmF0ZWUodmFsdWUsIGtleSwgY29sbGVjdGlvbik7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNYXA7XG4iLCJ2YXIgYmFzZUlzTWF0Y2ggPSByZXF1aXJlKCcuL19iYXNlSXNNYXRjaCcpLFxuICAgIGdldE1hdGNoRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hdGNoRGF0YScpLFxuICAgIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlID0gcmVxdWlyZSgnLi9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzYCB3aGljaCBkb2Vzbid0IGNsb25lIGBzb3VyY2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKSB7XG4gIHZhciBtYXRjaERhdGEgPSBnZXRNYXRjaERhdGEoc291cmNlKTtcbiAgaWYgKG1hdGNoRGF0YS5sZW5ndGggPT0gMSAmJiBtYXRjaERhdGFbMF1bMl0pIHtcbiAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLCBtYXRjaERhdGFbMF1bMV0pO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09PSBzb3VyY2UgfHwgYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZU1hdGNoZXM7XG4iLCJ2YXIgYmFzZUlzRXF1YWwgPSByZXF1aXJlKCcuL19iYXNlSXNFcXVhbCcpLFxuICAgIGdldCA9IHJlcXVpcmUoJy4vZ2V0JyksXG4gICAgaGFzSW4gPSByZXF1aXJlKCcuL2hhc0luJyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIGlzU3RyaWN0Q29tcGFyYWJsZSA9IHJlcXVpcmUoJy4vX2lzU3RyaWN0Q29tcGFyYWJsZScpLFxuICAgIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlID0gcmVxdWlyZSgnLi9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzUHJvcGVydHlgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNyY1ZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICBpZiAoaXNLZXkocGF0aCkgJiYgaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSkge1xuICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSwgc3JjVmFsdWUpO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIgb2JqVmFsdWUgPSBnZXQob2JqZWN0LCBwYXRoKTtcbiAgICByZXR1cm4gKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgb2JqVmFsdWUgPT09IHNyY1ZhbHVlKVxuICAgICAgPyBoYXNJbihvYmplY3QsIHBhdGgpXG4gICAgICA6IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWF0Y2hlc1Byb3BlcnR5O1xuIiwidmFyIFN0YWNrID0gcmVxdWlyZSgnLi9fU3RhY2snKSxcbiAgICBhc3NpZ25NZXJnZVZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduTWVyZ2VWYWx1ZScpLFxuICAgIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAgYmFzZU1lcmdlRGVlcCA9IHJlcXVpcmUoJy4vX2Jhc2VNZXJnZURlZXAnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpLFxuICAgIHNhZmVHZXQgPSByZXF1aXJlKCcuL19zYWZlR2V0Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAqICBjb3VudGVycGFydHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmIChvYmplY3QgPT09IHNvdXJjZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBiYXNlRm9yKHNvdXJjZSwgZnVuY3Rpb24oc3JjVmFsdWUsIGtleSkge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgYmFzZU1lcmdlLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgfVxuICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfSwga2V5c0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2U7XG4iLCJ2YXIgYXNzaWduTWVyZ2VWYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnbk1lcmdlVmFsdWUnKSxcbiAgICBjbG9uZUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQnVmZmVyJyksXG4gICAgY2xvbmVUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fY2xvbmVUeXBlZEFycmF5JyksXG4gICAgY29weUFycmF5ID0gcmVxdWlyZSgnLi9fY29weUFycmF5JyksXG4gICAgaW5pdENsb25lT2JqZWN0ID0gcmVxdWlyZSgnLi9faW5pdENsb25lT2JqZWN0JyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQXJyYXlMaWtlT2JqZWN0ID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZU9iamVjdCcpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi9pc1BsYWluT2JqZWN0JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKSxcbiAgICBzYWZlR2V0ID0gcmVxdWlyZSgnLi9fc2FmZUdldCcpLFxuICAgIHRvUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuL3RvUGxhaW5PYmplY3QnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VNZXJnZWAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBtZXJnZXMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAqIHJlZmVyZW5jZXMgdG8gYmUgbWVyZ2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBtZXJnZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXJnZUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1lcmdlIHZhbHVlcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gKiAgY291bnRlcnBhcnRzLlxuICovXG5mdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBtZXJnZUZ1bmMsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIHZhciBvYmpWYWx1ZSA9IHNhZmVHZXQob2JqZWN0LCBrZXkpLFxuICAgICAgc3JjVmFsdWUgPSBzYWZlR2V0KHNvdXJjZSwga2V5KSxcbiAgICAgIHN0YWNrZWQgPSBzdGFjay5nZXQoc3JjVmFsdWUpO1xuXG4gIGlmIChzdGFja2VkKSB7XG4gICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgc3RhY2tlZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgdmFyIGlzQ29tbW9uID0gbmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICBpZiAoaXNDb21tb24pIHtcbiAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHNyY1ZhbHVlKSxcbiAgICAgICAgaXNCdWZmID0gIWlzQXJyICYmIGlzQnVmZmVyKHNyY1ZhbHVlKSxcbiAgICAgICAgaXNUeXBlZCA9ICFpc0FyciAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheShzcmNWYWx1ZSk7XG5cbiAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgIGlmIChpc0FyciB8fCBpc0J1ZmYgfHwgaXNUeXBlZCkge1xuICAgICAgaWYgKGlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBjb3B5QXJyYXkob2JqVmFsdWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNCdWZmKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIG5ld1ZhbHVlID0gY2xvbmVCdWZmZXIoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNUeXBlZCkge1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBuZXdWYWx1ZSA9IGNsb25lVHlwZWRBcnJheShzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbmV3VmFsdWUgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChzcmNWYWx1ZSkgfHwgaXNBcmd1bWVudHMoc3JjVmFsdWUpKSB7XG4gICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgaWYgKGlzQXJndW1lbnRzKG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IHRvUGxhaW5PYmplY3Qob2JqVmFsdWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoIWlzT2JqZWN0KG9ialZhbHVlKSB8fCBpc0Z1bmN0aW9uKG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IGluaXRDbG9uZU9iamVjdChzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQ29tbW9uKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgbWVyZ2VGdW5jKG5ld1ZhbHVlLCBzcmNWYWx1ZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICBzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpO1xuICB9XG4gIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2VEZWVwO1xuIiwidmFyIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VNYXAgPSByZXF1aXJlKCcuL19iYXNlTWFwJyksXG4gICAgYmFzZVNvcnRCeSA9IHJlcXVpcmUoJy4vX2Jhc2VTb3J0QnknKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBjb21wYXJlTXVsdGlwbGUgPSByZXF1aXJlKCcuL19jb21wYXJlTXVsdGlwbGUnKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ub3JkZXJCeWAgd2l0aG91dCBwYXJhbSBndWFyZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gaXRlcmF0ZWVzIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAqIEBwYXJhbSB7c3RyaW5nW119IG9yZGVycyBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKSB7XG4gIGlmIChpdGVyYXRlZXMubGVuZ3RoKSB7XG4gICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgaWYgKGlzQXJyYXkoaXRlcmF0ZWUpKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBiYXNlR2V0KHZhbHVlLCBpdGVyYXRlZS5sZW5ndGggPT09IDEgPyBpdGVyYXRlZVswXSA6IGl0ZXJhdGVlKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVyYXRlZTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyYXRlZXMgPSBbaWRlbnRpdHldO1xuICB9XG5cbiAgdmFyIGluZGV4ID0gLTE7XG4gIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgYmFzZVVuYXJ5KGJhc2VJdGVyYXRlZSkpO1xuXG4gIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICB2YXIgY3JpdGVyaWEgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB7ICdjcml0ZXJpYSc6IGNyaXRlcmlhLCAnaW5kZXgnOiArK2luZGV4LCAndmFsdWUnOiB2YWx1ZSB9O1xuICB9KTtcblxuICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICByZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycyk7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VPcmRlckJ5O1xuIiwidmFyIGJhc2VQaWNrQnkgPSByZXF1aXJlKCcuL19iYXNlUGlja0J5JyksXG4gICAgaGFzSW4gPSByZXF1aXJlKCcuL2hhc0luJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucGlja2Agd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gKiBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LCBwYXRocykge1xuICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgIHJldHVybiBoYXNJbihvYmplY3QsIHBhdGgpO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUGljaztcbiIsInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpLFxuICAgIGJhc2VTZXQgPSByZXF1aXJlKCcuL19iYXNlU2V0JyksXG4gICAgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mICBgXy5waWNrQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0ge307XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgcGF0aCA9IHBhdGhzW2luZGV4XSxcbiAgICAgICAgdmFsdWUgPSBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG5cbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBwYXRoKSkge1xuICAgICAgYmFzZVNldChyZXN1bHQsIGNhc3RQYXRoKHBhdGgsIG9iamVjdCksIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUGlja0J5O1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eWAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUHJvcGVydHk7XG4iLCJ2YXIgYmFzZUdldCA9IHJlcXVpcmUoJy4vX2Jhc2VHZXQnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VQcm9wZXJ0eWAgd2hpY2ggc3VwcG9ydHMgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHJldHVybiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVByb3BlcnR5RGVlcDtcbiIsIi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVDZWlsID0gTWF0aC5jZWlsLFxuICAgIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmdlYCBhbmQgYF8ucmFuZ2VSaWdodGAgd2hpY2ggZG9lc24ndFxuICogY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAqL1xuZnVuY3Rpb24gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQgLSBzdGFydCkgLyAoc3RlcCB8fCAxKSksIDApLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICByZXN1bHRbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF0gPSBzdGFydDtcbiAgICBzdGFydCArPSBzdGVwO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVJhbmdlO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZWR1Y2VgIGFuZCBgXy5yZWR1Y2VSaWdodGAsIHdpdGhvdXQgc3VwcG9ydFxuICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gIHVzaW5nIGBlYWNoRnVuY2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtib29sZWFufSBpbml0QWNjdW0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3Qgb3IgbGFzdCBlbGVtZW50IG9mXG4gKiAgYGNvbGxlY3Rpb25gIGFzIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VSZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGVhY2hGdW5jKSB7XG4gIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgIGFjY3VtdWxhdG9yID0gaW5pdEFjY3VtXG4gICAgICA/IChpbml0QWNjdW0gPSBmYWxzZSwgdmFsdWUpXG4gICAgICA6IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICB9KTtcbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VSZWR1Y2U7XG4iLCJ2YXIgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgb3ZlclJlc3QgPSByZXF1aXJlKCcuL19vdmVyUmVzdCcpLFxuICAgIHNldFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fc2V0VG9TdHJpbmcnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXN0YCB3aGljaCBkb2Vzbid0IHZhbGlkYXRlIG9yIGNvZXJjZSBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVJlc3Q7XG4iLCJ2YXIgYXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25WYWx1ZScpLFxuICAgIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zZXRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIHBhdGggY3JlYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoLFxuICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMSxcbiAgICAgIG5lc3RlZCA9IG9iamVjdDtcblxuICB3aGlsZSAobmVzdGVkICE9IG51bGwgJiYgKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJyB8fCBrZXkgPT09ICdjb25zdHJ1Y3RvcicgfHwga2V5ID09PSAncHJvdG90eXBlJykge1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggIT0gbGFzdEluZGV4KSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3Qob2JqVmFsdWUpXG4gICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgIDogKGlzSW5kZXgocGF0aFtpbmRleCArIDFdKSA/IFtdIDoge30pO1xuICAgICAgfVxuICAgIH1cbiAgICBhc3NpZ25WYWx1ZShuZXN0ZWQsIGtleSwgbmV3VmFsdWUpO1xuICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldO1xuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNldDtcbiIsInZhciBjb25zdGFudCA9IHJlcXVpcmUoJy4vY29uc3RhbnQnKSxcbiAgICBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2RlZmluZVByb3BlcnR5JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldFRvU3RyaW5nYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIGJhc2VTZXRUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgc3RyaW5nKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7XG4gICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAndmFsdWUnOiBjb25zdGFudChzdHJpbmcpLFxuICAgICd3cml0YWJsZSc6IHRydWVcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VTZXRUb1N0cmluZztcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydEJ5YCB3aGljaCB1c2VzIGBjb21wYXJlcmAgdG8gZGVmaW5lIHRoZVxuICogc29ydCBvcmRlciBvZiBgYXJyYXlgIGFuZCByZXBsYWNlcyBjcml0ZXJpYSBvYmplY3RzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZ1xuICogdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc29ydC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmVyIFRoZSBmdW5jdGlvbiB0byBkZWZpbmUgc29ydCBvcmRlci5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBiYXNlU29ydEJ5KGFycmF5LCBjb21wYXJlcikge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIGFycmF5LnNvcnQoY29tcGFyZXIpO1xuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBhcnJheVtsZW5ndGhdID0gYXJyYXlbbGVuZ3RoXS52YWx1ZTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNvcnRCeTtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRpbWVzO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xudmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udG9TdHJpbmcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gIC8vIEV4aXQgZWFybHkgZm9yIHN0cmluZ3MgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSBoaXQgaW4gc29tZSBlbnZpcm9ubWVudHMuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgY29udmVydCB2YWx1ZXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICByZXR1cm4gYXJyYXlNYXAodmFsdWUsIGJhc2VUb1N0cmluZykgKyAnJztcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHN5bWJvbFRvU3RyaW5nID8gc3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRvU3RyaW5nO1xuIiwidmFyIHRyaW1tZWRFbmRJbmRleCA9IHJlcXVpcmUoJy4vX3RyaW1tZWRFbmRJbmRleCcpO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltU3RhcnQgPSAvXlxccysvO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRyaW1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVHJpbShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZ1xuICAgID8gc3RyaW5nLnNsaWNlKDAsIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpICsgMSkucmVwbGFjZShyZVRyaW1TdGFydCwgJycpXG4gICAgOiBzdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRyaW07XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVVuYXJ5O1xuIiwidmFyIFNldENhY2hlID0gcmVxdWlyZSgnLi9fU2V0Q2FjaGUnKSxcbiAgICBhcnJheUluY2x1ZGVzID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlcycpLFxuICAgIGFycmF5SW5jbHVkZXNXaXRoID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlc1dpdGgnKSxcbiAgICBjYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2NhY2hlSGFzJyksXG4gICAgY3JlYXRlU2V0ID0gcmVxdWlyZSgnLi9fY3JlYXRlU2V0JyksXG4gICAgc2V0VG9BcnJheSA9IHJlcXVpcmUoJy4vX3NldFRvQXJyYXknKTtcblxuLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG52YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuaXEoYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgcmVzdWx0ID0gW10sXG4gICAgICBzZWVuID0gcmVzdWx0O1xuXG4gIGlmIChjb21wYXJhdG9yKSB7XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICB9XG4gIGVsc2UgaWYgKGxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgdmFyIHNldCA9IGl0ZXJhdGVlID8gbnVsbCA6IGNyZWF0ZVNldChhcnJheSk7XG4gICAgaWYgKHNldCkge1xuICAgICAgcmV0dXJuIHNldFRvQXJyYXkoc2V0KTtcbiAgICB9XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgIHNlZW4gPSBuZXcgU2V0Q2FjaGU7XG4gIH1cbiAgZWxzZSB7XG4gICAgc2VlbiA9IGl0ZXJhdGVlID8gW10gOiByZXN1bHQ7XG4gIH1cbiAgb3V0ZXI6XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5sZW5ndGg7XG4gICAgICB3aGlsZSAoc2VlbkluZGV4LS0pIHtcbiAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgIGlmIChzZWVuICE9PSByZXN1bHQpIHtcbiAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVW5pcTtcbiIsInZhciBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICogb2YgYHByb3BzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VWYWx1ZXM7XG4iLCIvKipcbiAqIFRoaXMgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy56aXBPYmplY3RgIHdoaWNoIGFzc2lnbnMgdmFsdWVzIHVzaW5nIGBhc3NpZ25GdW5jYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25GdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVppcE9iamVjdChwcm9wcywgdmFsdWVzLCBhc3NpZ25GdW5jKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgdmFsc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICByZXN1bHQgPSB7fTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGluZGV4IDwgdmFsc0xlbmd0aCA/IHZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgYXNzaWduRnVuYyhyZXN1bHQsIHByb3BzW2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVppcE9iamVjdDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGEgYGNhY2hlYCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgVGhlIGNhY2hlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgcmV0dXJuIGNhY2hlLmhhcyhrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhY2hlSGFzO1xuIiwidmFyIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYGlkZW50aXR5YCBpZiBpdCdzIG5vdCBhIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGNhc3QgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNhc3RGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicgPyB2YWx1ZSA6IGlkZW50aXR5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RGdW5jdGlvbjtcbiIsInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIHN0cmluZ1RvUGF0aCA9IHJlcXVpcmUoJy4vX3N0cmluZ1RvUGF0aCcpLFxuICAgIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b1N0cmluZycpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYSBwYXRoIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RQYXRoO1xuIiwidmFyIFVpbnQ4QXJyYXkgPSByZXF1aXJlKCcuL19VaW50OEFycmF5Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheSBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBhcnJheUJ1ZmZlci5jb25zdHJ1Y3RvcihhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgbmV3IFVpbnQ4QXJyYXkocmVzdWx0KS5zZXQobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZUFycmF5QnVmZmVyO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkLFxuICAgIGFsbG9jVW5zYWZlID0gQnVmZmVyID8gQnVmZmVyLmFsbG9jVW5zYWZlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiAgYGJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBjbG9uZUJ1ZmZlcihidWZmZXIsIGlzRGVlcCkge1xuICBpZiAoaXNEZWVwKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgpO1xuICB9XG4gIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gYWxsb2NVbnNhZmUgPyBhbGxvY1Vuc2FmZShsZW5ndGgpIDogbmV3IGJ1ZmZlci5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gIGJ1ZmZlci5jb3B5KHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVCdWZmZXI7XG4iLCJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIGRhdGEgdmlldy5cbiAqL1xuZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldywgaXNEZWVwKSB7XG4gIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKGRhdGFWaWV3LmJ1ZmZlcikgOiBkYXRhVmlldy5idWZmZXI7XG4gIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZURhdGFWaWV3O1xuIiwiLyoqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVGbGFncyA9IC9cXHcqJC87XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGByZWdleHBgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcmVnZXhwIFRoZSByZWdleHAgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgcmVnZXhwLlxuICovXG5mdW5jdGlvbiBjbG9uZVJlZ0V4cChyZWdleHApIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSwgcmVGbGFncy5leGVjKHJlZ2V4cCkpO1xuICByZXN1bHQubGFzdEluZGV4ID0gcmVnZXhwLmxhc3RJbmRleDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZVJlZ0V4cDtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBgc3ltYm9sYCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzeW1ib2wgVGhlIHN5bWJvbCBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgc3ltYm9sIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKSB7XG4gIHJldHVybiBzeW1ib2xWYWx1ZU9mID8gT2JqZWN0KHN5bWJvbFZhbHVlT2YuY2FsbChzeW1ib2wpKSA6IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lU3ltYm9sO1xuIiwidmFyIGNsb25lQXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUFycmF5QnVmZmVyJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB0eXBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHR5cGVkQXJyYXksIGlzRGVlcCkge1xuICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcikgOiB0eXBlZEFycmF5LmJ1ZmZlcjtcbiAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVUeXBlZEFycmF5O1xuIiwidmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKipcbiAqIENvbXBhcmVzIHZhbHVlcyB0byBzb3J0IHRoZW0gaW4gYXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgdmFsdWVgLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICBpZiAodmFsdWUgIT09IG90aGVyKSB7XG4gICAgdmFyIHZhbElzRGVmaW5lZCA9IHZhbHVlICE9PSB1bmRlZmluZWQsXG4gICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICB2YWxJc1JlZmxleGl2ZSA9IHZhbHVlID09PSB2YWx1ZSxcbiAgICAgICAgdmFsSXNTeW1ib2wgPSBpc1N5bWJvbCh2YWx1ZSk7XG5cbiAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgb3RoSXNOdWxsID0gb3RoZXIgPT09IG51bGwsXG4gICAgICAgIG90aElzUmVmbGV4aXZlID0gb3RoZXIgPT09IG90aGVyLFxuICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgIGlmICgoIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wgJiYgIXZhbElzU3ltYm9sICYmIHZhbHVlID4gb3RoZXIpIHx8XG4gICAgICAgICh2YWxJc1N5bWJvbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUgJiYgIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wpIHx8XG4gICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAoIXZhbElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgIXZhbElzUmVmbGV4aXZlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgaWYgKCghdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCAmJiAhb3RoSXNTeW1ib2wgJiYgdmFsdWUgPCBvdGhlcikgfHxcbiAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgKG90aElzTnVsbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICghb3RoSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZUFzY2VuZGluZztcbiIsInZhciBjb21wYXJlQXNjZW5kaW5nID0gcmVxdWlyZSgnLi9fY29tcGFyZUFzY2VuZGluZycpO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlclxuICogYW5kIHN0YWJsZSBzb3J0IHRoZW0uXG4gKlxuICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSxcbiAqIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXJcbiAqIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW5bXXxzdHJpbmdbXX0gb3JkZXJzIFRoZSBvcmRlciB0byBzb3J0IGJ5IGZvciBlYWNoIHByb3BlcnR5LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc29ydCBvcmRlciBpbmRpY2F0b3IgZm9yIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgb2JqQ3JpdGVyaWEgPSBvYmplY3QuY3JpdGVyaWEsXG4gICAgICBvdGhDcml0ZXJpYSA9IG90aGVyLmNyaXRlcmlhLFxuICAgICAgbGVuZ3RoID0gb2JqQ3JpdGVyaWEubGVuZ3RoLFxuICAgICAgb3JkZXJzTGVuZ3RoID0gb3JkZXJzLmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciByZXN1bHQgPSBjb21wYXJlQXNjZW5kaW5nKG9iakNyaXRlcmlhW2luZGV4XSwgb3RoQ3JpdGVyaWFbaW5kZXhdKTtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBpZiAoaW5kZXggPj0gb3JkZXJzTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgb3JkZXIgPSBvcmRlcnNbaW5kZXhdO1xuICAgICAgcmV0dXJuIHJlc3VsdCAqIChvcmRlciA9PSAnZGVzYycgPyAtMSA6IDEpO1xuICAgIH1cbiAgfVxuICAvLyBGaXhlcyBhbiBgQXJyYXkjc29ydGAgYnVnIGluIHRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgYXBwbGljYXRpb25zXG4gIC8vIHRoYXQgY2F1c2VzIGl0LCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWUgZm9yXG4gIC8vIGBvYmplY3RgIGFuZCBgb3RoZXJgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL3B1bGwvMTI0N1xuICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAvL1xuICAvLyBUaGlzIGFsc28gZW5zdXJlcyBhIHN0YWJsZSBzb3J0IGluIFY4IGFuZCBvdGhlciBlbmdpbmVzLlxuICAvLyBTZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9OTAgZm9yIG1vcmUgZGV0YWlscy5cbiAgcmV0dXJuIG9iamVjdC5pbmRleCAtIG90aGVyLmluZGV4O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVNdWx0aXBsZTtcbiIsIi8qKlxuICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgYHNvdXJjZWAgdG8gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuXG4gIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlBcnJheTtcbiIsInZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyk7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29waWVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLCBwcm9wcywgb2JqZWN0LCBjdXN0b21pemVyKSB7XG4gIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcblxuICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXdWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgICBpZiAoaXNOZXcpIHtcbiAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlPYmplY3Q7XG4iLCJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBnZXRTeW1ib2xzID0gcmVxdWlyZSgnLi9fZ2V0U3ltYm9scycpO1xuXG4vKipcbiAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLCBvYmplY3QpIHtcbiAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVN5bWJvbHM7XG4iLCJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBnZXRTeW1ib2xzSW4gPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzSW4nKTtcblxuLyoqXG4gKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2UsIG9iamVjdCkge1xuICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHNJbihzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlTeW1ib2xzSW47XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xudmFyIGNvcmVKc0RhdGEgPSByb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3JlSnNEYXRhO1xuIiwidmFyIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhc3NpZ25lciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA+IDEgPyBzb3VyY2VzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkLFxuICAgICAgICBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICA/IChsZW5ndGgtLSwgY3VzdG9taXplcilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiBjdXN0b21pemVyO1xuICAgICAgbGVuZ3RoID0gMTtcbiAgICB9XG4gICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgYXNzaWduZXIob2JqZWN0LCBzb3VyY2UsIGluZGV4LCBjdXN0b21pemVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQXNzaWduZXI7XG4iLCJ2YXIgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmFzZUVhY2goZWFjaEZ1bmMsIGZyb21SaWdodCkge1xuICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9XG4gICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgcmV0dXJuIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKTtcbiAgICB9XG4gICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IGZyb21SaWdodCA/IGxlbmd0aCA6IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChjb2xsZWN0aW9uKTtcblxuICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQmFzZUVhY2g7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSBiYXNlIGZ1bmN0aW9uIGZvciBtZXRob2RzIGxpa2UgYF8uZm9ySW5gIGFuZCBgXy5mb3JPd25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VGb3IoZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChvYmplY3QpLFxuICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCYXNlRm9yO1xuIiwidmFyIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYF8uZmluZGAgb3IgYF8uZmluZExhc3RgIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5kSW5kZXhGdW5jIFRoZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb2xsZWN0aW9uIGluZGV4LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmluZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgIHZhciBpdGVyYWJsZSA9IE9iamVjdChjb2xsZWN0aW9uKTtcbiAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgIGNvbGxlY3Rpb24gPSBrZXlzKGNvbGxlY3Rpb24pO1xuICAgICAgcHJlZGljYXRlID0gZnVuY3Rpb24oa2V5KSB7IHJldHVybiBpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKTsgfTtcbiAgICB9XG4gICAgdmFyIGluZGV4ID0gZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCk7XG4gICAgcmV0dXJuIGluZGV4ID4gLTEgPyBpdGVyYWJsZVtpdGVyYXRlZSA/IGNvbGxlY3Rpb25baW5kZXhdIDogaW5kZXhdIDogdW5kZWZpbmVkO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUZpbmQ7XG4iLCJ2YXIgYmFzZVJhbmdlID0gcmVxdWlyZSgnLi9fYmFzZVJhbmdlJyksXG4gICAgaXNJdGVyYXRlZUNhbGwgPSByZXF1aXJlKCcuL19pc0l0ZXJhdGVlQ2FsbCcpLFxuICAgIHRvRmluaXRlID0gcmVxdWlyZSgnLi90b0Zpbml0ZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgXy5yYW5nZWAgb3IgYF8ucmFuZ2VSaWdodGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmFuZ2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCkge1xuICByZXR1cm4gZnVuY3Rpb24oc3RhcnQsIGVuZCwgc3RlcCkge1xuICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICBlbmQgPSBzdGVwID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmQgPSBzdGFydDtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICB9XG4gICAgc3RlcCA9IHN0ZXAgPT09IHVuZGVmaW5lZCA/IChzdGFydCA8IGVuZCA/IDEgOiAtMSkgOiB0b0Zpbml0ZShzdGVwKTtcbiAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlUmFuZ2U7XG4iLCJ2YXIgU2V0ID0gcmVxdWlyZSgnLi9fU2V0JyksXG4gICAgbm9vcCA9IHJlcXVpcmUoJy4vbm9vcCcpLFxuICAgIHNldFRvQXJyYXkgPSByZXF1aXJlKCcuL19zZXRUb0FycmF5Jyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNldCBvYmplY3Qgb2YgYHZhbHVlc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IHNldC5cbiAqL1xudmFyIGNyZWF0ZVNldCA9ICEoU2V0ICYmICgxIC8gc2V0VG9BcnJheShuZXcgU2V0KFssLTBdKSlbMV0pID09IElORklOSVRZKSA/IG5vb3AgOiBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgcmV0dXJuIG5ldyBTZXQodmFsdWVzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlU2V0O1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTtcbiAgICBmdW5jKHt9LCAnJywge30pO1xuICAgIHJldHVybiBmdW5jO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWZpbmVQcm9wZXJ0eTtcbiIsInZhciBTZXRDYWNoZSA9IHJlcXVpcmUoJy4vX1NldENhY2hlJyksXG4gICAgYXJyYXlTb21lID0gcmVxdWlyZSgnLi9fYXJyYXlTb21lJyksXG4gICAgY2FjaGVIYXMgPSByZXF1aXJlKCcuL19jYWNoZUhhcycpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7QXJyYXl9IG90aGVyIFRoZSBvdGhlciBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICBpZiAoYXJyTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhKGlzUGFydGlhbCAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gIHZhciBhcnJTdGFja2VkID0gc3RhY2suZ2V0KGFycmF5KTtcbiAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICBpZiAoYXJyU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgcmV0dXJuIGFyclN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBhcnJheTtcbiAgfVxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IHRydWUsXG4gICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICBzdGFjay5zZXQoYXJyYXksIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBhcnJheSk7XG5cbiAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICB3aGlsZSAoKytpbmRleCA8IGFyckxlbmd0aCkge1xuICAgIHZhciBhcnJWYWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICA6IGN1c3RvbWl6ZXIoYXJyVmFsdWUsIG90aFZhbHVlLCBpbmRleCwgYXJyYXksIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29tcGFyZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmIChzZWVuKSB7XG4gICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICBpZiAoIWNhY2hlSGFzKHNlZW4sIG90aEluZGV4KSAmJlxuICAgICAgICAgICAgICAgIChhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKSkge1xuICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSkge1xuICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgIGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fFxuICAgICAgICAgICAgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spXG4gICAgICAgICkpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHN0YWNrWydkZWxldGUnXShhcnJheSk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxBcnJheXM7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgVWludDhBcnJheSA9IHJlcXVpcmUoJy4vX1VpbnQ4QXJyYXknKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKSxcbiAgICBlcXVhbEFycmF5cyA9IHJlcXVpcmUoJy4vX2VxdWFsQXJyYXlzJyksXG4gICAgbWFwVG9BcnJheSA9IHJlcXVpcmUoJy4vX21hcFRvQXJyYXknKSxcbiAgICBzZXRUb0FycmF5ID0gcmVxdWlyZSgnLi9fc2V0VG9BcnJheScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJztcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBjb21wYXJpbmcgb2JqZWN0cyBvZlxuICogdGhlIHNhbWUgYHRvU3RyaW5nVGFnYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNvbXBhcmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBvciBgU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0cyB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgdGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAob2JqZWN0LmJ5dGVPZmZzZXQgIT0gb3RoZXIuYnl0ZU9mZnNldCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gb2JqZWN0LmJ1ZmZlcjtcbiAgICAgIG90aGVyID0gb3RoZXIuYnVmZmVyO1xuXG4gICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAhZXF1YWxGdW5jKG5ldyBVaW50OEFycmF5KG9iamVjdCksIG5ldyBVaW50OEFycmF5KG90aGVyKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBjYXNlIGJvb2xUYWc6XG4gICAgY2FzZSBkYXRlVGFnOlxuICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgLy8gQ29lcmNlIGJvb2xlYW5zIHRvIGAxYCBvciBgMGAgYW5kIGRhdGVzIHRvIG1pbGxpc2Vjb25kcy5cbiAgICAgIC8vIEludmFsaWQgZGF0ZXMgYXJlIGNvZXJjZWQgdG8gYE5hTmAuXG4gICAgICByZXR1cm4gZXEoK29iamVjdCwgK290aGVyKTtcblxuICAgIGNhc2UgZXJyb3JUYWc6XG4gICAgICByZXR1cm4gb2JqZWN0Lm5hbWUgPT0gb3RoZXIubmFtZSAmJiBvYmplY3QubWVzc2FnZSA9PSBvdGhlci5tZXNzYWdlO1xuXG4gICAgY2FzZSByZWdleHBUYWc6XG4gICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAvLyBDb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzIGFuZCB0cmVhdCBzdHJpbmdzLCBwcmltaXRpdmVzIGFuZCBvYmplY3RzLFxuICAgICAgLy8gYXMgZXF1YWwuIFNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcmVnZXhwLnByb3RvdHlwZS50b3N0cmluZ1xuICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIHJldHVybiBvYmplY3QgPT0gKG90aGVyICsgJycpO1xuXG4gICAgY2FzZSBtYXBUYWc6XG4gICAgICB2YXIgY29udmVydCA9IG1hcFRvQXJyYXk7XG5cbiAgICBjYXNlIHNldFRhZzpcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUc7XG4gICAgICBjb252ZXJ0IHx8IChjb252ZXJ0ID0gc2V0VG9BcnJheSk7XG5cbiAgICAgIGlmIChvYmplY3Quc2l6ZSAhPSBvdGhlci5zaXplICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgIGlmIChzdGFja2VkKSB7XG4gICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgfVxuICAgICAgYml0bWFzayB8PSBDT01QQVJFX1VOT1JERVJFRF9GTEFHO1xuXG4gICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgIHZhciByZXN1bHQgPSBlcXVhbEFycmF5cyhjb252ZXJ0KG9iamVjdCksIGNvbnZlcnQob3RoZXIpLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgaWYgKHN5bWJvbFZhbHVlT2YpIHtcbiAgICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpID09IHN5bWJvbFZhbHVlT2YuY2FsbChvdGhlcik7XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxdWFsQnlUYWc7XG4iLCJ2YXIgZ2V0QWxsS2V5cyA9IHJlcXVpcmUoJy4vX2dldEFsbEtleXMnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3Igb2JqZWN0cyB3aXRoIHN1cHBvcnQgZm9yXG4gKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgb2JqUHJvcHMgPSBnZXRBbGxLZXlzKG9iamVjdCksXG4gICAgICBvYmpMZW5ndGggPSBvYmpQcm9wcy5sZW5ndGgsXG4gICAgICBvdGhQcm9wcyA9IGdldEFsbEtleXMob3RoZXIpLFxuICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoO1xuXG4gIGlmIChvYmpMZW5ndGggIT0gb3RoTGVuZ3RoICYmICFpc1BhcnRpYWwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGluZGV4ID0gb2JqTGVuZ3RoO1xuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgaWYgKCEoaXNQYXJ0aWFsID8ga2V5IGluIG90aGVyIDogaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwga2V5KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgdGhhdCBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgdmFyIG9ialN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICBpZiAob2JqU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgcmV0dXJuIG9ialN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBvYmplY3Q7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHRydWU7XG4gIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBvYmplY3QpO1xuXG4gIHZhciBza2lwQ3RvciA9IGlzUGFydGlhbDtcbiAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcbiAgICBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTtcblxuICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcbiAgICAgICAgOiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSwga2V5LCBvYmplY3QsIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmICghKGNvbXBhcmVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IChvYmpWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKG9ialZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKVxuICAgICAgICAgIDogY29tcGFyZWRcbiAgICAgICAgKSkge1xuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2tpcEN0b3IgfHwgKHNraXBDdG9yID0ga2V5ID09ICdjb25zdHJ1Y3RvcicpO1xuICB9XG4gIGlmIChyZXN1bHQgJiYgIXNraXBDdG9yKSB7XG4gICAgdmFyIG9iakN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLlxuICAgIGlmIChvYmpDdG9yICE9IG90aEN0b3IgJiZcbiAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJlxuICAgICAgICAgIHR5cGVvZiBvdGhDdG9yID09ICdmdW5jdGlvbicgJiYgb3RoQ3RvciBpbnN0YW5jZW9mIG90aEN0b3IpKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxPYmplY3RzO1xuIiwidmFyIGZsYXR0ZW4gPSByZXF1aXJlKCcuL2ZsYXR0ZW4nKSxcbiAgICBvdmVyUmVzdCA9IHJlcXVpcmUoJy4vX292ZXJSZXN0JyksXG4gICAgc2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19zZXRUb1N0cmluZycpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIGZsYXR0ZW5zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHVuZGVmaW5lZCwgZmxhdHRlbiksIGZ1bmMgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdFJlc3Q7XG4iLCIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG4iLCJ2YXIgYmFzZUdldEFsbEtleXMgPSByZXF1aXJlKCcuL19iYXNlR2V0QWxsS2V5cycpLFxuICAgIGdldFN5bWJvbHMgPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7XG4gIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXMsIGdldFN5bWJvbHMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEFsbEtleXM7XG4iLCJ2YXIgYmFzZUdldEFsbEtleXMgPSByZXF1aXJlKCcuL19iYXNlR2V0QWxsS2V5cycpLFxuICAgIGdldFN5bWJvbHNJbiA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHNJbicpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCkge1xuICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzSW4sIGdldFN5bWJvbHNJbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QWxsS2V5c0luO1xuIiwidmFyIGlzS2V5YWJsZSA9IHJlcXVpcmUoJy4vX2lzS2V5YWJsZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hcCBkYXRhLlxuICovXG5mdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XG4gIHZhciBkYXRhID0gbWFwLl9fZGF0YV9fO1xuICByZXR1cm4gaXNLZXlhYmxlKGtleSlcbiAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXVxuICAgIDogZGF0YS5tYXA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TWFwRGF0YTtcbiIsInZhciBpc1N0cmljdENvbXBhcmFibGUgPSByZXF1aXJlKCcuL19pc1N0cmljdENvbXBhcmFibGUnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3Mgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBvZiBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sXG4gICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICByZXN1bHRbbGVuZ3RoXSA9IFtrZXksIHZhbHVlLCBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE1hdGNoRGF0YTtcbiIsInZhciBiYXNlSXNOYXRpdmUgPSByZXF1aXJlKCcuL19iYXNlSXNOYXRpdmUnKSxcbiAgICBnZXRWYWx1ZSA9IHJlcXVpcmUoJy4vX2dldFZhbHVlJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TmF0aXZlO1xuIiwidmFyIG92ZXJBcmcgPSByZXF1aXJlKCcuL19vdmVyQXJnJyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFByb3RvdHlwZTtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFJhd1RhZztcbiIsInZhciBhcnJheUZpbHRlciA9IHJlcXVpcmUoJy4vX2FycmF5RmlsdGVyJyksXG4gICAgc3R1YkFycmF5ID0gcmVxdWlyZSgnLi9zdHViQXJyYXknKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy5cbiAqL1xudmFyIGdldFN5bWJvbHMgPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gIHJldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksIGZ1bmN0aW9uKHN5bWJvbCkge1xuICAgIHJldHVybiBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgc3ltYm9sKTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFN5bWJvbHM7XG4iLCJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgZ2V0U3ltYm9scyA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHMnKSxcbiAgICBzdHViQXJyYXkgPSByZXF1aXJlKCcuL3N0dWJBcnJheScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gKi9cbnZhciBnZXRTeW1ib2xzSW4gPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHdoaWxlIChvYmplY3QpIHtcbiAgICBhcnJheVB1c2gocmVzdWx0LCBnZXRTeW1ib2xzKG9iamVjdCkpO1xuICAgIG9iamVjdCA9IGdldFByb3RvdHlwZShvYmplY3QpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFN5bWJvbHNJbjtcbiIsInZhciBEYXRhVmlldyA9IHJlcXVpcmUoJy4vX0RhdGFWaWV3JyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyksXG4gICAgUHJvbWlzZSA9IHJlcXVpcmUoJy4vX1Byb21pc2UnKSxcbiAgICBTZXQgPSByZXF1aXJlKCcuL19TZXQnKSxcbiAgICBXZWFrTWFwID0gcmVxdWlyZSgnLi9fV2Vha01hcCcpLFxuICAgIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgdG9Tb3VyY2UgPSByZXF1aXJlKCcuL190b1NvdXJjZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcHJvbWlzZVRhZyA9ICdbb2JqZWN0IFByb21pc2VdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWFwcywgc2V0cywgYW5kIHdlYWttYXBzLiAqL1xudmFyIGRhdGFWaWV3Q3RvclN0cmluZyA9IHRvU291cmNlKERhdGFWaWV3KSxcbiAgICBtYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoTWFwKSxcbiAgICBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UpLFxuICAgIHNldEN0b3JTdHJpbmcgPSB0b1NvdXJjZShTZXQpLFxuICAgIHdlYWtNYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoV2Vha01hcCk7XG5cbi8qKlxuICogR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbnZhciBnZXRUYWcgPSBiYXNlR2V0VGFnO1xuXG4vLyBGYWxsYmFjayBmb3IgZGF0YSB2aWV3cywgbWFwcywgc2V0cywgYW5kIHdlYWsgbWFwcyBpbiBJRSAxMSBhbmQgcHJvbWlzZXMgaW4gTm9kZS5qcyA8IDYuXG5pZiAoKERhdGFWaWV3ICYmIGdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcpIHx8XG4gICAgKE1hcCAmJiBnZXRUYWcobmV3IE1hcCkgIT0gbWFwVGFnKSB8fFxuICAgIChQcm9taXNlICYmIGdldFRhZyhQcm9taXNlLnJlc29sdmUoKSkgIT0gcHJvbWlzZVRhZykgfHxcbiAgICAoU2V0ICYmIGdldFRhZyhuZXcgU2V0KSAhPSBzZXRUYWcpIHx8XG4gICAgKFdlYWtNYXAgJiYgZ2V0VGFnKG5ldyBXZWFrTWFwKSAhPSB3ZWFrTWFwVGFnKSkge1xuICBnZXRUYWcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciByZXN1bHQgPSBiYXNlR2V0VGFnKHZhbHVlKSxcbiAgICAgICAgQ3RvciA9IHJlc3VsdCA9PSBvYmplY3RUYWcgPyB2YWx1ZS5jb25zdHJ1Y3RvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgY3RvclN0cmluZyA9IEN0b3IgPyB0b1NvdXJjZShDdG9yKSA6ICcnO1xuXG4gICAgaWYgKGN0b3JTdHJpbmcpIHtcbiAgICAgIHN3aXRjaCAoY3RvclN0cmluZykge1xuICAgICAgICBjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzogcmV0dXJuIGRhdGFWaWV3VGFnO1xuICAgICAgICBjYXNlIG1hcEN0b3JTdHJpbmc6IHJldHVybiBtYXBUYWc7XG4gICAgICAgIGNhc2UgcHJvbWlzZUN0b3JTdHJpbmc6IHJldHVybiBwcm9taXNlVGFnO1xuICAgICAgICBjYXNlIHNldEN0b3JTdHJpbmc6IHJldHVybiBzZXRUYWc7XG4gICAgICAgIGNhc2Ugd2Vha01hcEN0b3JTdHJpbmc6IHJldHVybiB3ZWFrTWFwVGFnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFRhZztcbiIsIi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFZhbHVlO1xuIiwidmFyIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBleGlzdHMgb24gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBmYWxzZTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSk7XG4gICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gIH1cbiAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGlzTGVuZ3RoKGxlbmd0aCkgJiYgaXNJbmRleChrZXksIGxlbmd0aCkgJiZcbiAgICAoaXNBcnJheShvYmplY3QpIHx8IGlzQXJndW1lbnRzKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1BhdGg7XG4iLCIvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG52YXIgcnNBc3RyYWxSYW5nZSA9ICdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxcbiAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2FwdHVyZSBncm91cHMuICovXG52YXIgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3Mgd2l0aCBbemVyby13aWR0aCBqb2luZXJzIG9yIGNvZGUgcG9pbnRzIGZyb20gdGhlIGFzdHJhbCBwbGFuZXNdKGh0dHA6Ly9lZXYuZWUvYmxvZy8yMDE1LzA5LzEyL2RhcmstY29ybmVycy1vZi11bmljb2RlLykuICovXG52YXIgcmVIYXNVbmljb2RlID0gUmVnRXhwKCdbJyArIHJzWldKICsgcnNBc3RyYWxSYW5nZSAgKyByc0NvbWJvUmFuZ2UgKyByc1ZhclJhbmdlICsgJ10nKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHN5bWJvbCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykge1xuICByZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNVbmljb2RlO1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgSGFzaFxuICovXG5mdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoQ2xlYXI7XG4iLCIvKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge09iamVjdH0gaGFzaCBUaGUgaGFzaCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTtcbiAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hEZWxldGU7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoR2V0O1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaEhhcztcbiIsInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIFNldHMgdGhlIGhhc2ggYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBoYXNoU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICB0aGlzLnNpemUgKz0gdGhpcy5oYXMoa2V5KSA/IDAgOiAxO1xuICBkYXRhW2tleV0gPSAobmF0aXZlQ3JlYXRlICYmIHZhbHVlID09PSB1bmRlZmluZWQpID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaFNldDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBuZXcgYXJyYXkuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAvLyBBZGQgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgLlxuICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAnc3RyaW5nJyAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCAnaW5kZXgnKSkge1xuICAgIHJlc3VsdC5pbmRleCA9IGFycmF5LmluZGV4O1xuICAgIHJlc3VsdC5pbnB1dCA9IGFycmF5LmlucHV0O1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lQXJyYXk7XG4iLCJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKSxcbiAgICBjbG9uZURhdGFWaWV3ID0gcmVxdWlyZSgnLi9fY2xvbmVEYXRhVmlldycpLFxuICAgIGNsb25lUmVnRXhwID0gcmVxdWlyZSgnLi9fY2xvbmVSZWdFeHAnKSxcbiAgICBjbG9uZVN5bWJvbCA9IHJlcXVpcmUoJy4vX2Nsb25lU3ltYm9sJyksXG4gICAgY2xvbmVUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fY2xvbmVUeXBlZEFycmF5Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNsb25pbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBNYXBgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIGBTZXRgLCBvciBgU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICovXG5mdW5jdGlvbiBpbml0Q2xvbmVCeVRhZyhvYmplY3QsIHRhZywgaXNEZWVwKSB7XG4gIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO1xuXG4gICAgY2FzZSBib29sVGFnOlxuICAgIGNhc2UgZGF0ZVRhZzpcbiAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtcblxuICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICByZXR1cm4gY2xvbmVEYXRhVmlldyhvYmplY3QsIGlzRGVlcCk7XG5cbiAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzpcbiAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgY2FzZSB1aW50OFRhZzogY2FzZSB1aW50OENsYW1wZWRUYWc6IGNhc2UgdWludDE2VGFnOiBjYXNlIHVpbnQzMlRhZzpcbiAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgY2FzZSBtYXBUYWc6XG4gICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICBjYXNlIG51bWJlclRhZzpcbiAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgIHJldHVybiBuZXcgQ3RvcihvYmplY3QpO1xuXG4gICAgY2FzZSByZWdleHBUYWc6XG4gICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTtcblxuICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICByZXR1cm4gY2xvbmVTeW1ib2wob2JqZWN0KTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRDbG9uZUJ5VGFnO1xuIiwidmFyIGJhc2VDcmVhdGUgPSByZXF1aXJlKCcuL19iYXNlQ3JlYXRlJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2Ygb2JqZWN0LmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgIWlzUHJvdG90eXBlKG9iamVjdCkpXG4gICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgIDoge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lT2JqZWN0O1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ByZWFkYWJsZVN5bWJvbCA9IFN5bWJvbCA/IFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGUgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmbGF0dGVuYWJsZSBgYXJndW1lbnRzYCBvYmplY3Qgb3IgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZmxhdHRlbmFibGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNGbGF0dGVuYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpIHx8XG4gICAgISEoc3ByZWFkYWJsZVN5bWJvbCAmJiB2YWx1ZSAmJiB2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGbGF0dGVuYWJsZTtcbiIsIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG52YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuXG4gIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICh0eXBlID09ICdudW1iZXInIHx8XG4gICAgICAodHlwZSAhPSAnc3ltYm9sJyAmJiByZUlzVWludC50ZXN0KHZhbHVlKSkpICYmXG4gICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0luZGV4O1xuIiwidmFyIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIHZhbHVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgPyAoaXNBcnJheUxpa2Uob2JqZWN0KSAmJiBpc0luZGV4KGluZGV4LCBvYmplY3QubGVuZ3RoKSlcbiAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICApIHtcbiAgICByZXR1cm4gZXEob2JqZWN0W2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0l0ZXJhdGVlQ2FsbDtcbiIsInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgIHJlSXNQbGFpblByb3AgPSAvXlxcdyokLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleSh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgdmFsdWUgPT0gbnVsbCB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcmVJc1BsYWluUHJvcC50ZXN0KHZhbHVlKSB8fCAhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpIHx8XG4gICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyB1bmlxdWUgb2JqZWN0IGtleS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleWFibGUodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgPyAodmFsdWUgIT09ICdfX3Byb3RvX18nKVxuICAgIDogKHZhbHVlID09PSBudWxsKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleWFibGU7XG4iLCJ2YXIgY29yZUpzRGF0YSA9IHJlcXVpcmUoJy4vX2NvcmVKc0RhdGEnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbnZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG59KCkpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcbiAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc01hc2tlZDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1Byb3RvdHlwZTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlmIHN1aXRhYmxlIGZvciBzdHJpY3RcbiAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAhaXNPYmplY3QodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3RyaWN0Q29tcGFyYWJsZTtcbiIsIi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVDbGVhcjtcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICBpZiAoaW5kZXggPT0gbGFzdEluZGV4KSB7XG4gICAgZGF0YS5wb3AoKTtcbiAgfSBlbHNlIHtcbiAgICBzcGxpY2UuY2FsbChkYXRhLCBpbmRleCwgMSk7XG4gIH1cbiAgLS10aGlzLnNpemU7XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZURlbGV0ZTtcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVHZXQ7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXywga2V5KSA+IC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUhhcztcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICArK3RoaXMuc2l6ZTtcbiAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZVNldDtcbiIsInZhciBIYXNoID0gcmVxdWlyZSgnLi9fSGFzaCcpLFxuICAgIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkge1xuICB0aGlzLnNpemUgPSAwO1xuICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICdoYXNoJzogbmV3IEhhc2gsXG4gICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgJ3N0cmluZyc6IG5ldyBIYXNoXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVDbGVhcjtcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZURlbGV0ZTtcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVHZXQ7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBtYXAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUhhcztcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVTZXQ7XG4iLCIvKipcbiAqIENvbnZlcnRzIGBtYXBgIHRvIGl0cyBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gKi9cbmZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobWFwLnNpemUpO1xuXG4gIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcFRvQXJyYXk7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgbWF0Y2hlc1Byb3BlcnR5YCBmb3Igc291cmNlIHZhbHVlcyBzdWl0YWJsZVxuICogZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKGtleSwgc3JjVmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHNyY1ZhbHVlICYmXG4gICAgICAoc3JjVmFsdWUgIT09IHVuZGVmaW5lZCB8fCAoa2V5IGluIE9iamVjdChvYmplY3QpKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWF0Y2hlc1N0cmljdENvbXBhcmFibGU7XG4iLCJ2YXIgbWVtb2l6ZSA9IHJlcXVpcmUoJy4vbWVtb2l6ZScpO1xuXG4vKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG52YXIgTUFYX01FTU9JWkVfU0laRSA9IDUwMDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gKiBjYWNoZSB3aGVuIGl0IGV4Y2VlZHMgYE1BWF9NRU1PSVpFX1NJWkVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZUNhcHBlZChmdW5jKSB7XG4gIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkge1xuICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG4gICAgICBjYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9KTtcblxuICB2YXIgY2FjaGUgPSByZXN1bHQuY2FjaGU7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWVtb2l6ZUNhcHBlZDtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVDcmVhdGU7XG4iLCJ2YXIgb3ZlckFyZyA9IHJlcXVpcmUoJy4vX292ZXJBcmcnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUtleXM7XG4iLCIvKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZVxuICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChvYmplY3QgIT0gbnVsbCkge1xuICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVLZXlzSW47XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4vKiogVXNlZCB0byBhY2Nlc3MgZmFzdGVyIE5vZGUuanMgaGVscGVycy4gKi9cbnZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICAvLyBVc2UgYHV0aWwudHlwZXNgIGZvciBOb2RlLmpzIDEwKy5cbiAgICB2YXIgdHlwZXMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUucmVxdWlyZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUoJ3V0aWwnKS50eXBlcztcblxuICAgIGlmICh0eXBlcykge1xuICAgICAgcmV0dXJuIHR5cGVzO1xuICAgIH1cblxuICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcgJiYgZnJlZVByb2Nlc3MuYmluZGluZygndXRpbCcpO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBub2RlVXRpbDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9iamVjdFRvU3RyaW5nO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlckFyZztcbiIsInZhciBhcHBseSA9IHJlcXVpcmUoJy4vX2FwcGx5Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSByZXN0IGFycmF5IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyUmVzdChmdW5jLCBzdGFydCwgdHJhbnNmb3JtKSB7XG4gIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgIGFycmF5ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgIH1cbiAgICBpbmRleCA9IC0xO1xuICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgIHdoaWxlICgrK2luZGV4IDwgc3RhcnQpIHtcbiAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICB9XG4gICAgb3RoZXJBcmdzW3N0YXJ0XSA9IHRyYW5zZm9ybShhcnJheSk7XG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlclJlc3Q7XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG4iLCIvKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgLCB1bmxlc3MgYGtleWAgaXMgXCJfX3Byb3RvX19cIiBvciBcImNvbnN0cnVjdG9yXCIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBzYWZlR2V0KG9iamVjdCwga2V5KSB7XG4gIGlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicgJiYgdHlwZW9mIG9iamVjdFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGtleSA9PSAnX19wcm90b19fJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiBvYmplY3Rba2V5XTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzYWZlR2V0O1xuIiwiLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGFkZFxuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAYWxpYXMgcHVzaFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0Q2FjaGVBZGQ7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldENhY2hlSGFzO1xuIiwiLyoqXG4gKiBDb252ZXJ0cyBgc2V0YCB0byBhbiBhcnJheSBvZiBpdHMgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBzZXRUb0FycmF5KHNldCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUb0FycmF5O1xuIiwidmFyIGJhc2VTZXRUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VTZXRUb1N0cmluZycpLFxuICAgIHNob3J0T3V0ID0gcmVxdWlyZSgnLi9fc2hvcnRPdXQnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgZnVuY2AgdG8gcmV0dXJuIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIHNldFRvU3RyaW5nID0gc2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUb1N0cmluZztcbiIsIi8qKiBVc2VkIHRvIGRldGVjdCBob3QgZnVuY3Rpb25zIGJ5IG51bWJlciBvZiBjYWxscyB3aXRoaW4gYSBzcGFuIG9mIG1pbGxpc2Vjb25kcy4gKi9cbnZhciBIT1RfQ09VTlQgPSA4MDAsXG4gICAgSE9UX1NQQU4gPSAxNjtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU5vdyA9IERhdGUubm93O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0J2xsIHNob3J0IG91dCBhbmQgaW52b2tlIGBpZGVudGl0eWAgaW5zdGVhZFxuICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gXG4gKiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc2hvcnRhYmxlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7XG4gIHZhciBjb3VudCA9IDAsXG4gICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0YW1wID0gbmF0aXZlTm93KCksXG4gICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7XG5cbiAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgIGlmICgrK2NvdW50ID49IEhPVF9DT1VOVCkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb3VudCA9IDA7XG4gICAgfVxuICAgIHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG9ydE91dDtcbiIsInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBzdGFjay5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBTdGFja1xuICovXG5mdW5jdGlvbiBzdGFja0NsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0NsZWFyO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIHJlc3VsdCA9IGRhdGFbJ2RlbGV0ZSddKGtleSk7XG5cbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrRGVsZXRlO1xuIiwiLyoqXG4gKiBHZXRzIHRoZSBzdGFjayB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tHZXQoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmdldChrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrR2V0O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYSBzdGFjayB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0hhcztcbiIsInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBNYXAgPSByZXF1aXJlKCcuL19NYXAnKSxcbiAgICBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyk7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgc3RhY2sgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSkge1xuICAgIHZhciBwYWlycyA9IGRhdGEuX19kYXRhX187XG4gICAgaWYgKCFNYXAgfHwgKHBhaXJzLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSkge1xuICAgICAgcGFpcnMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgdGhpcy5zaXplID0gKytkYXRhLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xuICB9XG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrU2V0O1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmljdEluZGV4T2Y7XG4iLCJ2YXIgYXNjaWlTaXplID0gcmVxdWlyZSgnLi9fYXNjaWlTaXplJyksXG4gICAgaGFzVW5pY29kZSA9IHJlcXVpcmUoJy4vX2hhc1VuaWNvZGUnKSxcbiAgICB1bmljb2RlU2l6ZSA9IHJlcXVpcmUoJy4vX3VuaWNvZGVTaXplJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKSB7XG4gIHJldHVybiBoYXNVbmljb2RlKHN0cmluZylcbiAgICA/IHVuaWNvZGVTaXplKHN0cmluZylcbiAgICA6IGFzY2lpU2l6ZShzdHJpbmcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ1NpemU7XG4iLCJ2YXIgbWVtb2l6ZUNhcHBlZCA9IHJlcXVpcmUoJy4vX21lbW9pemVDYXBwZWQnKTtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlUHJvcE5hbWUgPSAvW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2c7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBtZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgfVxuICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ1RvUGF0aDtcbiIsInZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGtleSBpZiBpdCdzIG5vdCBhIHN0cmluZyBvciBzeW1ib2wuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICovXG5mdW5jdGlvbiB0b0tleSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9LZXk7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9Tb3VyY2U7XG4iLCIvKiogVXNlZCB0byBtYXRjaCBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4gKi9cbnZhciByZVdoaXRlc3BhY2UgPSAvXFxzLztcblxuLyoqXG4gKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlXG4gKiBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLlxuICovXG5mdW5jdGlvbiB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSB7XG4gIHZhciBpbmRleCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgd2hpbGUgKGluZGV4LS0gJiYgcmVXaGl0ZXNwYWNlLnRlc3Qoc3RyaW5nLmNoYXJBdChpbmRleCkpKSB7fVxuICByZXR1cm4gaW5kZXg7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdHJpbW1lZEVuZEluZGV4O1xuIiwiLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL1xudmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgcmVDb21ib0hhbGZNYXJrc1JhbmdlID0gJ1xcXFx1ZmUyMC1cXFxcdWZlMmYnLFxuICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xudmFyIHJzQXN0cmFsID0gJ1snICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc0NvbWJvID0gJ1snICsgcnNDb21ib1JhbmdlICsgJ10nLFxuICAgIHJzRml0eiA9ICdcXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0nLFxuICAgIHJzTW9kaWZpZXIgPSAnKD86JyArIHJzQ29tYm8gKyAnfCcgKyByc0ZpdHogKyAnKScsXG4gICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc1JlZ2lvbmFsID0gJyg/OlxcXFx1ZDgzY1tcXFxcdWRkZTYtXFxcXHVkZGZmXSl7Mn0nLFxuICAgIHJzU3VyclBhaXIgPSAnW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdJyxcbiAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbnZhciByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICByc09wdEpvaW4gPSAnKD86JyArIHJzWldKICsgJyg/OicgKyBbcnNOb25Bc3RyYWwsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzT3B0VmFyICsgcmVPcHRNb2QgKyAnKSonLFxuICAgIHJzU2VxID0gcnNPcHRWYXIgKyByZU9wdE1vZCArIHJzT3B0Sm9pbixcbiAgICByc1N5bWJvbCA9ICcoPzonICsgW3JzTm9uQXN0cmFsICsgcnNDb21ibyArICc/JywgcnNDb21ibywgcnNSZWdpb25hbCwgcnNTdXJyUGFpciwgcnNBc3RyYWxdLmpvaW4oJ3wnKSArICcpJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbnZhciByZVVuaWNvZGUgPSBSZWdFeHAocnNGaXR6ICsgJyg/PScgKyByc0ZpdHogKyAnKXwnICsgcnNTeW1ib2wgKyByc1NlcSwgJ2cnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBzaXplIG9mIGEgVW5pY29kZSBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xuZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKSB7XG4gIHZhciByZXN1bHQgPSByZVVuaWNvZGUubGFzdEluZGV4ID0gMDtcbiAgd2hpbGUgKHJlVW5pY29kZS50ZXN0KHN0cmluZykpIHtcbiAgICArK3Jlc3VsdDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVuaWNvZGVTaXplO1xuIiwidmFyIGJhc2VDbG9uZSA9IHJlcXVpcmUoJy4vX2Jhc2VDbG9uZScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYHZhbHVlYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGVcbiAqIFtzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobV0oaHR0cHM6Ly9tZG4uaW8vU3RydWN0dXJlZF9jbG9uZV9hbGdvcml0aG0pXG4gKiBhbmQgc3VwcG9ydHMgY2xvbmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLCBkYXRlIG9iamVjdHMsIG1hcHMsXG4gKiBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLCBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWRcbiAqIGFycmF5cy4gVGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYGFyZ3VtZW50c2Agb2JqZWN0cyBhcmUgY2xvbmVkXG4gKiBhcyBwbGFpbiBvYmplY3RzLiBBbiBlbXB0eSBvYmplY3QgaXMgcmV0dXJuZWQgZm9yIHVuY2xvbmVhYmxlIHZhbHVlcyBzdWNoXG4gKiBhcyBlcnJvciBvYmplY3RzLCBmdW5jdGlvbnMsIERPTSBub2RlcywgYW5kIFdlYWtNYXBzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gKiBAc2VlIF8uY2xvbmVEZWVwXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICpcbiAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShvYmplY3RzKTtcbiAqIGNvbnNvbGUubG9nKHNoYWxsb3dbMF0gPT09IG9iamVjdHNbMF0pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBjbG9uZSh2YWx1ZSkge1xuICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9TWU1CT0xTX0ZMQUcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lO1xuIiwidmFyIGJhc2VDbG9uZSA9IHJlcXVpcmUoJy4vX2Jhc2VDbG9uZScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX0RFRVBfRkxBRyA9IDEsXG4gICAgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZGVlcCBjbG9uZWQgdmFsdWUuXG4gKiBAc2VlIF8uY2xvbmVcbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbeyAnYSc6IDEgfSwgeyAnYic6IDIgfV07XG4gKlxuICogdmFyIGRlZXAgPSBfLmNsb25lRGVlcChvYmplY3RzKTtcbiAqIGNvbnNvbGUubG9nKGRlZXBbMF0gPT09IG9iamVjdHNbMF0pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlKSB7XG4gIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVEZWVwO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29uc3RhbnQ7XG4iLCJ2YXIgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEFzc2lnbnMgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2VcbiAqIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXMgdGhhdFxuICogcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICogT25jZSBhIHByb3BlcnR5IGlzIHNldCwgYWRkaXRpb25hbCB2YWx1ZXMgb2YgdGhlIHNhbWUgcHJvcGVydHkgYXJlIGlnbm9yZWQuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQHNlZSBfLmRlZmF1bHRzRGVlcFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gKi9cbnZhciBkZWZhdWx0cyA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMTtcbiAgdmFyIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoO1xuICB2YXIgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgbGVuZ3RoID0gMTtcbiAgfVxuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgIHZhciBwcm9wcyA9IGtleXNJbihzb3VyY2UpO1xuICAgIHZhciBwcm9wc0luZGV4ID0gLTE7XG4gICAgdmFyIHByb3BzTGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsrcHJvcHNJbmRleCA8IHByb3BzTGVuZ3RoKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcHNbcHJvcHNJbmRleF07XG4gICAgICB2YXIgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAoZXEodmFsdWUsIG9iamVjdFByb3RvW2tleV0pICYmICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpIHtcbiAgICAgICAgb2JqZWN0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmYXVsdHM7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZm9yRWFjaCcpO1xuIiwiLyoqXG4gKiBQZXJmb3JtcyBhXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICpcbiAqIF8uZXEob2JqZWN0LCBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoJ2EnLCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEoJ2EnLCBPYmplY3QoJ2EnKSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoTmFOLCBOYU4pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXE7XG4iLCJ2YXIgYXJyYXlGaWx0ZXIgPSByZXF1aXJlKCcuL19hcnJheUZpbHRlcicpLFxuICAgIGJhc2VGaWx0ZXIgPSByZXF1aXJlKCcuL19iYXNlRmlsdGVyJyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgYWxsIGVsZW1lbnRzXG4gKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiAqKk5vdGU6KiogVW5saWtlIGBfLnJlbW92ZWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICogQHNlZSBfLnJlamVjdFxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAqIF07XG4gKlxuICogXy5maWx0ZXIodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbHRlcih1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmlsdGVyKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maWx0ZXIodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAqXG4gKiAvLyBDb21iaW5pbmcgc2V2ZXJhbCBwcmVkaWNhdGVzIHVzaW5nIGBfLm92ZXJFdmVyeWAgb3IgYF8ub3ZlclNvbWVgLlxuICogXy5maWx0ZXIodXNlcnMsIF8ub3ZlclNvbWUoW3sgJ2FnZSc6IDM2IH0sIFsnYWdlJywgNDBdXSkpO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ2Jhcm5leSddXG4gKi9cbmZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmlsdGVyO1xuIiwidmFyIGNyZWF0ZUZpbmQgPSByZXF1aXJlKCcuL19jcmVhdGVGaW5kJyksXG4gICAgZmluZEluZGV4ID0gcmVxdWlyZSgnLi9maW5kSW5kZXgnKTtcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIHRoZSBmaXJzdCBlbGVtZW50XG4gKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAqIF07XG4gKlxuICogXy5maW5kKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAqIC8vID0+IG9iamVjdCBmb3IgJ3BlYmJsZXMnXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiBvYmplY3QgZm9yICdmcmVkJ1xuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kKHVzZXJzLCAnYWN0aXZlJyk7XG4gKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknXG4gKi9cbnZhciBmaW5kID0gY3JlYXRlRmluZChmaW5kSW5kZXgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbmQ7XG4iLCJ2YXIgYmFzZUZpbmRJbmRleCA9IHJlcXVpcmUoJy4vX2Jhc2VGaW5kSW5kZXgnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICB0b0ludGVnZXIgPSByZXF1aXJlKCcuL3RvSW50ZWdlcicpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3RcbiAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMS4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICogXTtcbiAqXG4gKiBfLmZpbmRJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdiYXJuZXknOyB9KTtcbiAqIC8vID0+IDBcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kSW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnZnJlZCcsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAqIC8vID0+IDFcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmRJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICogLy8gPT4gMFxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kSW5kZXgodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+IDJcbiAqL1xuZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgaW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApO1xuICB9XG4gIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbmRJbmRleDtcbiIsInZhciBiYXNlRmxhdHRlbiA9IHJlcXVpcmUoJy4vX2Jhc2VGbGF0dGVuJyk7XG5cbi8qKlxuICogRmxhdHRlbnMgYGFycmF5YCBhIHNpbmdsZSBsZXZlbCBkZWVwLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZmxhdHRlbihbMSwgWzIsIFszLCBbNF1dLCA1XV0pO1xuICogLy8gPT4gWzEsIDIsIFszLCBbNF1dLCA1XVxuICovXG5mdW5jdGlvbiBmbGF0dGVuKGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCAxKSA6IFtdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZsYXR0ZW47XG4iLCJ2YXIgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYmFzZUVhY2ggPSByZXF1aXJlKCcuL19iYXNlRWFjaCcpLFxuICAgIGNhc3RGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2Nhc3RGdW5jdGlvbicpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqICoqTm90ZToqKiBBcyB3aXRoIG90aGVyIFwiQ29sbGVjdGlvbnNcIiBtZXRob2RzLCBvYmplY3RzIHdpdGggYSBcImxlbmd0aFwiXG4gKiBwcm9wZXJ0eSBhcmUgaXRlcmF0ZWQgbGlrZSBhcnJheXMuIFRvIGF2b2lkIHRoaXMgYmVoYXZpb3IgdXNlIGBfLmZvckluYFxuICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAYWxpYXMgZWFjaFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gKiBAc2VlIF8uZm9yRWFjaFJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZm9yRWFjaChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gKiAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAqIH0pO1xuICogLy8gPT4gTG9ncyBgMWAgdGhlbiBgMmAuXG4gKlxuICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICogICBjb25zb2xlLmxvZyhrZXkpO1xuICogfSk7XG4gKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2ggOiBiYXNlRWFjaDtcbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgY2FzdEZ1bmN0aW9uKGl0ZXJhdGVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZm9yRWFjaDtcbiIsInZhciBiYXNlRm9yID0gcmVxdWlyZSgnLi9fYmFzZUZvcicpLFxuICAgIGNhc3RGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2Nhc3RGdW5jdGlvbicpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuXG4gKiBvYmplY3QgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0XG4gKiBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQHNlZSBfLmZvckluUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5mb3JJbihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gKiB9KTtcbiAqIC8vID0+IExvZ3MgJ2EnLCAnYicsIHRoZW4gJ2MnIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICovXG5mdW5jdGlvbiBmb3JJbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbFxuICAgID8gb2JqZWN0XG4gICAgOiBiYXNlRm9yKG9iamVjdCwgY2FzdEZ1bmN0aW9uKGl0ZXJhdGVlKSwga2V5c0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmb3JJbjtcbiIsInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpO1xuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzXG4gKiBgdW5kZWZpbmVkYCwgdGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGluIGl0cyBwbGFjZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuNy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAqXG4gKiBfLmdldChvYmplY3QsICdhWzBdLmIuYycpO1xuICogLy8gPT4gM1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICogLy8gPT4gM1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgJ2EuYi5jJywgJ2RlZmF1bHQnKTtcbiAqIC8vID0+ICdkZWZhdWx0J1xuICovXG5mdW5jdGlvbiBnZXQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0O1xuIiwidmFyIGJhc2VIYXMgPSByZXF1aXJlKCcuL19iYXNlSGFzJyksXG4gICAgaGFzUGF0aCA9IHJlcXVpcmUoJy4vX2hhc1BhdGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiB7ICdiJzogMiB9IH07XG4gKiB2YXIgb3RoZXIgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gKlxuICogXy5oYXMob2JqZWN0LCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzKG9iamVjdCwgJ2EuYicpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzKG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXMob3RoZXIsICdhJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBoYXMob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzO1xuIiwidmFyIGJhc2VIYXNJbiA9IHJlcXVpcmUoJy4vX2Jhc2VIYXNJbicpLFxuICAgIGhhc1BhdGggPSByZXF1aXJlKCcuL19oYXNQYXRoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYS5iJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsIFsnYScsICdiJ10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYicpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaGFzSW4ob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNJbjtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKlxuICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHk7XG4iLCJ2YXIgYmFzZUlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9fYmFzZUlzQXJndW1lbnRzJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcmd1bWVudHM7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5O1xuIiwidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2U7XG4iLCJ2YXIgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gKiBpcyBhbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXlMaWtlT2JqZWN0O1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290JyksXG4gICAgc3R1YkZhbHNlID0gcmVxdWlyZSgnLi9zdHViRmFsc2UnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gcm9vdC5CdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBCdWZmZXIoMikpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IFVpbnQ4QXJyYXkoMikpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQnVmZmVyID0gbmF0aXZlSXNCdWZmZXIgfHwgc3R1YkZhbHNlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQnVmZmVyO1xuIiwidmFyIGJhc2VLZXlzID0gcmVxdWlyZSgnLi9fYmFzZUtleXMnKSxcbiAgICBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBlbXB0eSBvYmplY3QsIGNvbGxlY3Rpb24sIG1hcCwgb3Igc2V0LlxuICpcbiAqIE9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIG5vIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZFxuICogcHJvcGVydGllcy5cbiAqXG4gKiBBcnJheS1saWtlIHZhbHVlcyBzdWNoIGFzIGBhcmd1bWVudHNgIG9iamVjdHMsIGFycmF5cywgYnVmZmVycywgc3RyaW5ncywgb3JcbiAqIGpRdWVyeS1saWtlIGNvbGxlY3Rpb25zIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBsZW5ndGhgIG9mIGAwYC5cbiAqIFNpbWlsYXJseSwgbWFwcyBhbmQgc2V0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgc2l6ZWAgb2YgYDBgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGVtcHR5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNFbXB0eShudWxsKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRW1wdHkodHJ1ZSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0VtcHR5KDEpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFbXB0eShbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzRW1wdHkoeyAnYSc6IDEgfSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSAmJlxuICAgICAgKGlzQXJyYXkodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUuc3BsaWNlID09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgaXNCdWZmZXIodmFsdWUpIHx8IGlzVHlwZWRBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpKSkge1xuICAgIHJldHVybiAhdmFsdWUubGVuZ3RoO1xuICB9XG4gIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpO1xuICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgcmV0dXJuICF2YWx1ZS5zaXplO1xuICB9XG4gIGlmIChpc1Byb3RvdHlwZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gIWJhc2VLZXlzKHZhbHVlKS5sZW5ndGg7XG4gIH1cbiAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNFbXB0eTtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheXMgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRnVuY3Rpb247XG4iLCIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNMZW5ndGgoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNMZW5ndGg7XG4iLCJ2YXIgYmFzZUlzTWFwID0gcmVxdWlyZSgnLi9fYmFzZUlzTWFwJyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc01hcCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzTWFwO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTWFwYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc01hcChuZXcgTWFwKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTWFwKG5ldyBXZWFrTWFwKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc01hcCA9IG5vZGVJc01hcCA/IGJhc2VVbmFyeShub2RlSXNNYXApIDogYmFzZUlzTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTWFwO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3Q7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdExpa2U7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC44LjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqIH1cbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8IGJhc2VHZXRUYWcodmFsdWUpICE9IG9iamVjdFRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5LmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09IG9iamVjdEN0b3JTdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQbGFpbk9iamVjdDtcbiIsInZhciBiYXNlSXNTZXQgPSByZXF1aXJlKCcuL19iYXNlSXNTZXQnKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBub2RlVXRpbCA9IHJlcXVpcmUoJy4vX25vZGVVdGlsJyk7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzU2V0ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNTZXQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTZXRgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU2V0KG5ldyBTZXQpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTZXQobmV3IFdlYWtTZXQpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzU2V0ID0gbm9kZUlzU2V0ID8gYmFzZVVuYXJ5KG5vZGVJc1NldCkgOiBiYXNlSXNTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTZXQ7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3RyaW5nLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTdHJpbmcoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTdHJpbmcoMSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8XG4gICAgKCFpc0FycmF5KHZhbHVlKSAmJiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN0cmluZ1RhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTdHJpbmc7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTeW1ib2w7XG4iLCJ2YXIgYmFzZUlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vX2Jhc2VJc1R5cGVkQXJyYXknKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBub2RlVXRpbCA9IHJlcXVpcmUoJy4vX25vZGVVdGlsJyk7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzVHlwZWRBcnJheSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzVHlwZWRBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShuZXcgVWludDhBcnJheSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkoW10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzVHlwZWRBcnJheSA9IG5vZGVJc1R5cGVkQXJyYXkgPyBiYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSkgOiBiYXNlSXNUeXBlZEFycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVHlwZWRBcnJheTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1VuZGVmaW5lZCh2b2lkIDApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNVbmRlZmluZWQobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1VuZGVmaW5lZDtcbiIsInZhciBhcnJheUxpa2VLZXlzID0gcmVxdWlyZSgnLi9fYXJyYXlMaWtlS2V5cycpLFxuICAgIGJhc2VLZXlzID0gcmVxdWlyZSgnLi9fYmFzZUtleXMnKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4gU2VlIHRoZVxuICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXMobmV3IEZvbyk7XG4gKiAvLyA9PiBbJ2EnLCAnYiddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy5rZXlzKCdoaScpO1xuICogLy8gPT4gWycwJywgJzEnXVxuICovXG5mdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0KSA6IGJhc2VLZXlzKG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ga2V5cztcbiIsInZhciBhcnJheUxpa2VLZXlzID0gcmVxdWlyZSgnLi9fYXJyYXlMaWtlS2V5cycpLFxuICAgIGJhc2VLZXlzSW4gPSByZXF1aXJlKCcuL19iYXNlS2V5c0luJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXNJbihuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNJbjtcbiIsIi8qKlxuICogR2V0cyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ubGFzdChbMSwgMiwgM10pO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuIGxlbmd0aCA/IGFycmF5W2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxhc3Q7XG4iLCJ2YXIgYXJyYXlNYXAgPSByZXF1aXJlKCcuL19hcnJheU1hcCcpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VNYXAgPSByZXF1aXJlKCcuL19iYXNlTWFwJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1XG4gKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiBNYW55IGxvZGFzaCBtZXRob2RzIGFyZSBndWFyZGVkIHRvIHdvcmsgYXMgaXRlcmF0ZWVzIGZvciBtZXRob2RzIGxpa2VcbiAqIGBfLmV2ZXJ5YCwgYF8uZmlsdGVyYCwgYF8ubWFwYCwgYF8ubWFwVmFsdWVzYCwgYF8ucmVqZWN0YCwgYW5kIGBfLnNvbWVgLlxuICpcbiAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICogYGFyeWAsIGBjaHVua2AsIGBjdXJyeWAsIGBjdXJyeVJpZ2h0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGV2ZXJ5YCxcbiAqIGBmaWxsYCwgYGludmVydGAsIGBwYXJzZUludGAsIGByYW5kb21gLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZXBlYXRgLFxuICogYHNhbXBsZVNpemVgLCBgc2xpY2VgLCBgc29tZWAsIGBzb3J0QnlgLCBgc3BsaXRgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLFxuICogYHRlbXBsYXRlYCwgYHRyaW1gLCBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBhbmQgYHdvcmRzYFxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAqICAgcmV0dXJuIG4gKiBuO1xuICogfVxuICpcbiAqIF8ubWFwKFs0LCA4XSwgc3F1YXJlKTtcbiAqIC8vID0+IFsxNiwgNjRdXG4gKlxuICogXy5tYXAoeyAnYSc6IDQsICdiJzogOCB9LCBzcXVhcmUpO1xuICogLy8gPT4gWzE2LCA2NF0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JyB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnIH1cbiAqIF07XG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLm1hcCh1c2VycywgJ3VzZXInKTtcbiAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICovXG5mdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlNYXAgOiBiYXNlTWFwO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXA7XG4iLCJ2YXIgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyksXG4gICAgYmFzZUZvck93biA9IHJlcXVpcmUoJy4vX2Jhc2VGb3JPd24nKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYXMgYG9iamVjdGAgYW5kIHZhbHVlcyBnZW5lcmF0ZWRcbiAqIGJ5IHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydVxuICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gKiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC5cbiAqIEBzZWUgXy5tYXBLZXlzXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IHtcbiAqICAgJ2ZyZWQnOiAgICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAqICAgJ3BlYmJsZXMnOiB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gKiB9O1xuICpcbiAqIF8ubWFwVmFsdWVzKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZTsgfSk7XG4gKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLm1hcFZhbHVlcyh1c2VycywgJ2FnZScpO1xuICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiBtYXBWYWx1ZXMob2JqZWN0LCBpdGVyYXRlZSkge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGl0ZXJhdGVlID0gYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCAzKTtcblxuICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwVmFsdWVzO1xuIiwidmFyIGJhc2VFeHRyZW11bSA9IHJlcXVpcmUoJy4vX2Jhc2VFeHRyZW11bScpLFxuICAgIGJhc2VHdCA9IHJlcXVpcmUoJy4vX2Jhc2VHdCcpLFxuICAgIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5tYXgoWzQsIDIsIDgsIDZdKTtcbiAqIC8vID0+IDhcbiAqXG4gKiBfLm1heChbXSk7XG4gKiAvLyA9PiB1bmRlZmluZWRcbiAqL1xuZnVuY3Rpb24gbWF4KGFycmF5KSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUd0KVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1heDtcbiIsInZhciBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyk7XG5cbi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbWVtb2l6ZXMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuIElmIGByZXNvbHZlcmAgaXNcbiAqIHByb3ZpZGVkLCBpdCBkZXRlcm1pbmVzIHRoZSBjYWNoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdCBiYXNlZCBvbiB0aGVcbiAqIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBhcmd1bWVudFxuICogcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIG1hcCBjYWNoZSBrZXkuIFRoZSBgZnVuY2BcbiAqIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIG1lbW9pemVkIGZ1bmN0aW9uLlxuICpcbiAqICoqTm90ZToqKiBUaGUgY2FjaGUgaXMgZXhwb3NlZCBhcyB0aGUgYGNhY2hlYCBwcm9wZXJ0eSBvbiB0aGUgbWVtb2l6ZWRcbiAqIGZ1bmN0aW9uLiBJdHMgY3JlYXRpb24gbWF5IGJlIGN1c3RvbWl6ZWQgYnkgcmVwbGFjaW5nIHRoZSBgXy5tZW1vaXplLkNhY2hlYFxuICogY29uc3RydWN0b3Igd2l0aCBvbmUgd2hvc2UgaW5zdGFuY2VzIGltcGxlbWVudCB0aGVcbiAqIFtgTWFwYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtbWFwLXByb3RvdHlwZS1vYmplY3QpXG4gKiBtZXRob2QgaW50ZXJmYWNlIG9mIGBjbGVhcmAsIGBkZWxldGVgLCBgZ2V0YCwgYGhhc2AsIGFuZCBgc2V0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXNvbHZlcl0gVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgdGhlIGNhY2hlIGtleS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICogdmFyIG90aGVyID0geyAnYyc6IDMsICdkJzogNCB9O1xuICpcbiAqIHZhciB2YWx1ZXMgPSBfLm1lbW9pemUoXy52YWx1ZXMpO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiB2YWx1ZXMob3RoZXIpO1xuICogLy8gPT4gWzMsIDRdXG4gKlxuICogb2JqZWN0LmEgPSAyO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiAvLyBNb2RpZnkgdGhlIHJlc3VsdCBjYWNoZS5cbiAqIHZhbHVlcy5jYWNoZS5zZXQob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWydhJywgJ2InXVxuICpcbiAqIC8vIFJlcGxhY2UgYF8ubWVtb2l6ZS5DYWNoZWAuXG4gKiBfLm1lbW9pemUuQ2FjaGUgPSBXZWFrTWFwO1xuICovXG5mdW5jdGlvbiBtZW1vaXplKGZ1bmMsIHJlc29sdmVyKSB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nIHx8IChyZXNvbHZlciAhPSBudWxsICYmIHR5cGVvZiByZXNvbHZlciAhPSAnZnVuY3Rpb24nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAga2V5ID0gcmVzb2x2ZXIgPyByZXNvbHZlci5hcHBseSh0aGlzLCBhcmdzKSA6IGFyZ3NbMF0sXG4gICAgICAgIGNhY2hlID0gbWVtb2l6ZWQuY2FjaGU7XG5cbiAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5KTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgbWVtb2l6ZWQuY2FjaGUgPSBjYWNoZS5zZXQoa2V5LCByZXN1bHQpIHx8IGNhY2hlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIG1lbW9pemVkLmNhY2hlID0gbmV3IChtZW1vaXplLkNhY2hlIHx8IE1hcENhY2hlKTtcbiAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG4vLyBFeHBvc2UgYE1hcENhY2hlYC5cbm1lbW9pemUuQ2FjaGUgPSBNYXBDYWNoZTtcblxubW9kdWxlLmV4cG9ydHMgPSBtZW1vaXplO1xuIiwidmFyIGJhc2VNZXJnZSA9IHJlcXVpcmUoJy4vX2Jhc2VNZXJnZScpLFxuICAgIGNyZWF0ZUFzc2lnbmVyID0gcmVxdWlyZSgnLi9fY3JlYXRlQXNzaWduZXInKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgbWVyZ2VzIG93biBhbmRcbiAqIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIGludG8gdGhlXG4gKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBhcmVcbiAqIHNraXBwZWQgaWYgYSBkZXN0aW5hdGlvbiB2YWx1ZSBleGlzdHMuIEFycmF5IGFuZCBwbGFpbiBvYmplY3QgcHJvcGVydGllc1xuICogYXJlIG1lcmdlZCByZWN1cnNpdmVseS4gT3RoZXIgb2JqZWN0cyBhbmQgdmFsdWUgdHlwZXMgYXJlIG92ZXJyaWRkZW4gYnlcbiAqIGFzc2lnbm1lbnQuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC4gU3Vic2VxdWVudFxuICogc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuNS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7XG4gKiAgICdhJzogW3sgJ2InOiAyIH0sIHsgJ2QnOiA0IH1dXG4gKiB9O1xuICpcbiAqIHZhciBvdGhlciA9IHtcbiAqICAgJ2EnOiBbeyAnYyc6IDMgfSwgeyAnZSc6IDUgfV1cbiAqIH07XG4gKlxuICogXy5tZXJnZShvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IDIsICdjJzogMyB9LCB7ICdkJzogNCwgJ2UnOiA1IH1dIH1cbiAqL1xudmFyIG1lcmdlID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KSB7XG4gIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbWVyZ2U7XG4iLCJ2YXIgYmFzZUV4dHJlbXVtID0gcmVxdWlyZSgnLi9fYmFzZUV4dHJlbXVtJyksXG4gICAgYmFzZUx0ID0gcmVxdWlyZSgnLi9fYmFzZUx0JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksXG4gKiBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTWF0aFxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLm1pbihbNCwgMiwgOCwgNl0pO1xuICogLy8gPT4gMlxuICpcbiAqIF8ubWluKFtdKTtcbiAqIC8vID0+IHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiBtaW4oYXJyYXkpIHtcbiAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGlkZW50aXR5LCBiYXNlTHQpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWluO1xuIiwidmFyIGJhc2VFeHRyZW11bSA9IHJlcXVpcmUoJy4vX2Jhc2VFeHRyZW11bScpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VMdCA9IHJlcXVpcmUoJy4vX2Jhc2VMdCcpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWluYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICpcbiAqIF8ubWluQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAqIC8vID0+IHsgJ24nOiAxIH1cbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8ubWluQnkob2JqZWN0cywgJ24nKTtcbiAqIC8vID0+IHsgJ24nOiAxIH1cbiAqL1xuZnVuY3Rpb24gbWluQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlTHQpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWluQnk7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLm5vb3ApO1xuICogLy8gPT4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICovXG5mdW5jdGlvbiBub29wKCkge1xuICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5vb3A7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBEYXRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAqIH0sIF8ubm93KCkpO1xuICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAqL1xudmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcm9vdC5EYXRlLm5vdygpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBub3c7XG4iLCJ2YXIgYmFzZVBpY2sgPSByZXF1aXJlKCcuL19iYXNlUGljaycpLFxuICAgIGZsYXRSZXN0ID0gcmVxdWlyZSgnLi9fZmxhdFJlc3QnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgcGlja2VkIGBvYmplY3RgIHByb3BlcnRpZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAqXG4gKiBfLnBpY2sob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICovXG52YXIgcGljayA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8ge30gOiBiYXNlUGljayhvYmplY3QsIHBhdGhzKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBpY2s7XG4iLCJ2YXIgYmFzZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fYmFzZVByb3BlcnR5JyksXG4gICAgYmFzZVByb3BlcnR5RGVlcCA9IHJlcXVpcmUoJy4vX2Jhc2VQcm9wZXJ0eURlZXAnKSxcbiAgICBpc0tleSA9IHJlcXVpcmUoJy4vX2lzS2V5JyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBhIGdpdmVuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IFtcbiAqICAgeyAnYSc6IHsgJ2InOiAyIH0gfSxcbiAqICAgeyAnYSc6IHsgJ2InOiAxIH0gfVxuICogXTtcbiAqXG4gKiBfLm1hcChvYmplY3RzLCBfLnByb3BlcnR5KCdhLmInKSk7XG4gKiAvLyA9PiBbMiwgMV1cbiAqXG4gKiBfLm1hcChfLnNvcnRCeShvYmplY3RzLCBfLnByb3BlcnR5KFsnYScsICdiJ10pKSwgJ2EuYicpO1xuICogLy8gPT4gWzEsIDJdXG4gKi9cbmZ1bmN0aW9uIHByb3BlcnR5KHBhdGgpIHtcbiAgcmV0dXJuIGlzS2V5KHBhdGgpID8gYmFzZVByb3BlcnR5KHRvS2V5KHBhdGgpKSA6IGJhc2VQcm9wZXJ0eURlZXAocGF0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcHJvcGVydHk7XG4iLCJ2YXIgY3JlYXRlUmFuZ2UgPSByZXF1aXJlKCcuL19jcmVhdGVSYW5nZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyAocG9zaXRpdmUgYW5kL29yIG5lZ2F0aXZlKSBwcm9ncmVzc2luZyBmcm9tXG4gKiBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIEEgc3RlcCBvZiBgLTFgIGlzIHVzZWQgaWYgYSBuZWdhdGl2ZVxuICogYHN0YXJ0YCBpcyBzcGVjaWZpZWQgd2l0aG91dCBhbiBgZW5kYCBvciBgc3RlcGAuIElmIGBlbmRgIGlzIG5vdCBzcGVjaWZpZWQsXG4gKiBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gKlxuICogKipOb3RlOioqIEphdmFTY3JpcHQgZm9sbG93cyB0aGUgSUVFRS03NTQgc3RhbmRhcmQgZm9yIHJlc29sdmluZ1xuICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAqIEBzZWUgXy5pblJhbmdlLCBfLnJhbmdlUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogXy5yYW5nZSg0KTtcbiAqIC8vID0+IFswLCAxLCAyLCAzXVxuICpcbiAqIF8ucmFuZ2UoLTQpO1xuICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdXG4gKlxuICogXy5yYW5nZSgxLCA1KTtcbiAqIC8vID0+IFsxLCAyLCAzLCA0XVxuICpcbiAqIF8ucmFuZ2UoMCwgMjAsIDUpO1xuICogLy8gPT4gWzAsIDUsIDEwLCAxNV1cbiAqXG4gKiBfLnJhbmdlKDAsIC00LCAtMSk7XG4gKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAqXG4gKiBfLnJhbmdlKDEsIDQsIDApO1xuICogLy8gPT4gWzEsIDEsIDFdXG4gKlxuICogXy5yYW5nZSgwKTtcbiAqIC8vID0+IFtdXG4gKi9cbnZhciByYW5nZSA9IGNyZWF0ZVJhbmdlKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmFuZ2U7XG4iLCJ2YXIgYXJyYXlSZWR1Y2UgPSByZXF1aXJlKCcuL19hcnJheVJlZHVjZScpLFxuICAgIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBiYXNlUmVkdWNlID0gcmVxdWlyZSgnLi9fYmFzZVJlZHVjZScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBSZWR1Y2VzIGBjb2xsZWN0aW9uYCB0byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZ1xuICogZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAsIHdoZXJlIGVhY2ggc3VjY2Vzc2l2ZVxuICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYFxuICogaXMgbm90IGdpdmVuLCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbFxuICogdmFsdWUuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6XG4gKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICpcbiAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC5cbiAqXG4gKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYG9yZGVyQnlgLFxuICogYW5kIGBzb3J0QnlgXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQHNlZSBfLnJlZHVjZVJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ucmVkdWNlKFsxLCAyXSwgZnVuY3Rpb24oc3VtLCBuKSB7XG4gKiAgIHJldHVybiBzdW0gKyBuO1xuICogfSwgMCk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICogICByZXR1cm4gcmVzdWx0O1xuICogfSwge30pO1xuICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlIDogYmFzZVJlZHVjZSxcbiAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWR1Y2U7XG4iLCJ2YXIgYmFzZUtleXMgPSByZXF1aXJlKCcuL19iYXNlS2V5cycpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzU3RyaW5nID0gcmVxdWlyZSgnLi9pc1N0cmluZycpLFxuICAgIHN0cmluZ1NpemUgPSByZXF1aXJlKCcuL19zdHJpbmdTaXplJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcblxuLyoqXG4gKiBHZXRzIHRoZSBzaXplIG9mIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgaXRzIGxlbmd0aCBmb3IgYXJyYXktbGlrZVxuICogdmFsdWVzIG9yIHRoZSBudW1iZXIgb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgZm9yIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBzaXplLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnNpemUoWzEsIDIsIDNdKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAqIC8vID0+IDJcbiAqXG4gKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAqIC8vID0+IDdcbiAqL1xuZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICByZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbikgPyBzdHJpbmdTaXplKGNvbGxlY3Rpb24pIDogY29sbGVjdGlvbi5sZW5ndGg7XG4gIH1cbiAgdmFyIHRhZyA9IGdldFRhZyhjb2xsZWN0aW9uKTtcbiAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgIHJldHVybiBjb2xsZWN0aW9uLnNpemU7XG4gIH1cbiAgcmV0dXJuIGJhc2VLZXlzKGNvbGxlY3Rpb24pLmxlbmd0aDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaXplO1xuIiwidmFyIGJhc2VGbGF0dGVuID0gcmVxdWlyZSgnLi9fYmFzZUZsYXR0ZW4nKSxcbiAgICBiYXNlT3JkZXJCeSA9IHJlcXVpcmUoJy4vX2Jhc2VPcmRlckJ5JyksXG4gICAgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mXG4gKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhydSBlYWNoIGl0ZXJhdGVlLiBUaGlzIG1ldGhvZFxuICogcGVyZm9ybXMgYSBzdGFibGUgc29ydCwgdGhhdCBpcywgaXQgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBzb3J0IG9yZGVyIG9mXG4gKiBlcXVhbCBlbGVtZW50cy4gVGhlIGl0ZXJhdGVlcyBhcmUgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiAzMCB9LFxuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9XG4gKiBdO1xuICpcbiAqIF8uc29ydEJ5KHVzZXJzLCBbZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyOyB9XSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNl0sIFsnYmFybmV5JywgMzRdLCBbJ2ZyZWQnLCA0OF0sIFsnZnJlZCcsIDMwXV1cbiAqXG4gKiBfLnNvcnRCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM0XSwgWydiYXJuZXknLCAzNl0sIFsnZnJlZCcsIDMwXSwgWydmcmVkJywgNDhdXVxuICovXG52YXIgc29ydEJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWVzKSB7XG4gIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIGxlbmd0aCA9IGl0ZXJhdGVlcy5sZW5ndGg7XG4gIGlmIChsZW5ndGggPiAxICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdKSkge1xuICAgIGl0ZXJhdGVlcyA9IFtdO1xuICB9IGVsc2UgaWYgKGxlbmd0aCA+IDIgJiYgaXNJdGVyYXRlZUNhbGwoaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0sIGl0ZXJhdGVlc1syXSkpIHtcbiAgICBpdGVyYXRlZXMgPSBbaXRlcmF0ZWVzWzBdXTtcbiAgfVxuICByZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgYmFzZUZsYXR0ZW4oaXRlcmF0ZWVzLCAxKSwgW10pO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc29ydEJ5O1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhcnJheXMgPSBfLnRpbWVzKDIsIF8uc3R1YkFycmF5KTtcbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheXMpO1xuICogLy8gPT4gW1tdLCBbXV1cbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheXNbMF0gPT09IGFycmF5c1sxXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBzdHViQXJyYXkoKSB7XG4gIHJldHVybiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViQXJyYXk7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAqL1xuZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R1YkZhbHNlO1xuIiwidmFyIHRvTnVtYmVyID0gcmVxdWlyZSgnLi90b051bWJlcicpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDg7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIGZpbml0ZSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEyLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0Zpbml0ZSgzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9GaW5pdGUoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvRmluaXRlKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b0Zpbml0ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiAwO1xuICB9XG4gIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICBpZiAodmFsdWUgPT09IElORklOSVRZIHx8IHZhbHVlID09PSAtSU5GSU5JVFkpIHtcbiAgICB2YXIgc2lnbiA9ICh2YWx1ZSA8IDAgPyAtMSA6IDEpO1xuICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gIH1cbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/IHZhbHVlIDogMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0Zpbml0ZTtcbiIsInZhciB0b0Zpbml0ZSA9IHJlcXVpcmUoJy4vdG9GaW5pdGUnKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9JbnRlZ2VyYF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvaW50ZWdlcikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0ludGVnZXIoMy4yKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDBcbiAqXG4gKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSB0b0Zpbml0ZSh2YWx1ZSksXG4gICAgICByZW1haW5kZXIgPSByZXN1bHQgJSAxO1xuXG4gIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0ludGVnZXI7XG4iLCJ2YXIgYmFzZVRyaW0gPSByZXF1aXJlKCcuL19iYXNlVHJpbScpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBOQU4gPSAwIC8gMDtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gYmFzZVRyaW0odmFsdWUpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b051bWJlcjtcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHBsYWluIG9iamVjdCBmbGF0dGVuaW5nIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZ1xuICoga2V5ZWQgcHJvcGVydGllcyBvZiBgdmFsdWVgIHRvIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBwbGFpbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmFzc2lnbih7ICdhJzogMSB9LCBuZXcgRm9vKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICpcbiAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIF8udG9QbGFpbk9iamVjdChuZXcgRm9vKSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfVxuICovXG5mdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBjb3B5T2JqZWN0KHZhbHVlLCBrZXlzSW4odmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1BsYWluT2JqZWN0O1xuIiwidmFyIGJhc2VUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VUb1N0cmluZycpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9TdHJpbmcobnVsbCk7XG4gKiAvLyA9PiAnJ1xuICpcbiAqIF8udG9TdHJpbmcoLTApO1xuICogLy8gPT4gJy0wJ1xuICpcbiAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAqIC8vID0+ICcxLDIsMydcbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9TdHJpbmc7XG4iLCJ2YXIgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYmFzZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX2Jhc2VDcmVhdGUnKSxcbiAgICBiYXNlRm9yT3duID0gcmVxdWlyZSgnLi9fYmFzZUZvck93bicpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGdldFByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2dldFByb3RvdHlwZScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqXG4gKiBBbiBhbHRlcm5hdGl2ZSB0byBgXy5yZWR1Y2VgOyB0aGlzIG1ldGhvZCB0cmFuc2Zvcm1zIGBvYmplY3RgIHRvIGEgbmV3XG4gKiBgYWNjdW11bGF0b3JgIG9iamVjdCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgZWFjaCBvZiBpdHMgb3duXG4gKiBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIHRocnUgYGl0ZXJhdGVlYCwgd2l0aCBlYWNoIGludm9jYXRpb25cbiAqIHBvdGVudGlhbGx5IG11dGF0aW5nIHRoZSBgYWNjdW11bGF0b3JgIG9iamVjdC4gSWYgYGFjY3VtdWxhdG9yYCBpcyBub3RcbiAqIHByb3ZpZGVkLCBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBgW1tQcm90b3R5cGVdXWAgd2lsbCBiZSB1c2VkLiBUaGVcbiAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czogKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5LCBvYmplY3QpLlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMS4zLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgY3VzdG9tIGFjY3VtdWxhdG9yIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRyYW5zZm9ybShbMiwgMywgNF0sIGZ1bmN0aW9uKHJlc3VsdCwgbikge1xuICogICByZXN1bHQucHVzaChuICo9IG4pO1xuICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAqIH0sIFtdKTtcbiAqIC8vID0+IFs0LCA5XVxuICpcbiAqIF8udHJhbnNmb3JtKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAqIH0sIHt9KTtcbiAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH1cbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtKG9iamVjdCwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgIGlzQXJyTGlrZSA9IGlzQXJyIHx8IGlzQnVmZmVyKG9iamVjdCkgfHwgaXNUeXBlZEFycmF5KG9iamVjdCk7XG5cbiAgaXRlcmF0ZWUgPSBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDQpO1xuICBpZiAoYWNjdW11bGF0b3IgPT0gbnVsbCkge1xuICAgIHZhciBDdG9yID0gb2JqZWN0ICYmIG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoaXNBcnJMaWtlKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGlzQXJyID8gbmV3IEN0b3IgOiBbXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgYWNjdW11bGF0b3IgPSBpc0Z1bmN0aW9uKEN0b3IpID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSkgOiB7fTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBhY2N1bXVsYXRvciA9IHt9O1xuICAgIH1cbiAgfVxuICAoaXNBcnJMaWtlID8gYXJyYXlFYWNoIDogYmFzZUZvck93bikob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgIHJldHVybiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBvYmplY3QpO1xuICB9KTtcbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRyYW5zZm9ybTtcbiIsInZhciBiYXNlRmxhdHRlbiA9IHJlcXVpcmUoJy4vX2Jhc2VGbGF0dGVuJyksXG4gICAgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGJhc2VVbmlxID0gcmVxdWlyZSgnLi9fYmFzZVVuaXEnKSxcbiAgICBpc0FycmF5TGlrZU9iamVjdCA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2VPYmplY3QnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBnaXZlbiBhcnJheXMgdXNpbmdcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udW5pb24oWzJdLCBbMSwgMl0pO1xuICogLy8gPT4gWzIsIDFdXG4gKi9cbnZhciB1bmlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pb247XG4iLCJ2YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cbi8qKiBVc2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMuICovXG52YXIgaWRDb3VudGVyID0gMDtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIElmIGBwcmVmaXhgIGlzIGdpdmVuLCB0aGUgSUQgaXMgYXBwZW5kZWQgdG8gaXQuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4PScnXSBUaGUgdmFsdWUgdG8gcHJlZml4IHRoZSBJRCB3aXRoLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpO1xuICogLy8gPT4gJ2NvbnRhY3RfMTA0J1xuICpcbiAqIF8udW5pcXVlSWQoKTtcbiAqIC8vID0+ICcxMDUnXG4gKi9cbmZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICB2YXIgaWQgPSArK2lkQ291bnRlcjtcbiAgcmV0dXJuIHRvU3RyaW5nKHByZWZpeCkgKyBpZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmlxdWVJZDtcbiIsInZhciBiYXNlVmFsdWVzID0gcmVxdWlyZSgnLi9fYmFzZVZhbHVlcycpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLnZhbHVlcyhuZXcgRm9vKTtcbiAqIC8vID0+IFsxLCAyXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8udmFsdWVzKCdoaScpO1xuICogLy8gPT4gWydoJywgJ2knXVxuICovXG5mdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsdWVzO1xuIiwidmFyIGFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduVmFsdWUnKSxcbiAgICBiYXNlWmlwT2JqZWN0ID0gcmVxdWlyZSgnLi9fYmFzZVppcE9iamVjdCcpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZnJvbVBhaXJzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIHR3byBhcnJheXMsXG4gKiBvbmUgb2YgcHJvcGVydHkgaWRlbnRpZmllcnMgYW5kIG9uZSBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuNC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wcz1bXV0gVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uemlwT2JqZWN0KFsnYScsICdiJ10sIFsxLCAyXSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAqL1xuZnVuY3Rpb24gemlwT2JqZWN0KHByb3BzLCB2YWx1ZXMpIHtcbiAgcmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHMgfHwgW10sIHZhbHVlcyB8fCBbXSwgYXNzaWduVmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHppcE9iamVjdDtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuIiwiZXhwb3J0IGZ1bmN0aW9uIHl1djJyZ2IoeXV2KSB7XG4gIHZhciB5ID0geXV2WzBdLFxuICAgICAgdSA9IHl1dlsxXSxcbiAgICAgIHYgPSB5dXZbMl07XG4gIHZhciByLCBnLCBiO1xuICByID0geSAqIDEgKyB1ICogMCArIHYgKiAxLjEzOTgzO1xuICBnID0geSAqIDEgKyB1ICogLTAuMzk0NjUgKyB2ICogLTAuNTgwNjtcbiAgYiA9IHkgKiAxICsgdSAqIDIuMDIzMTEgKyB2ICogMDtcbiAgciA9IE1hdGgubWluKE1hdGgubWF4KDAsIHIpLCAxKTtcbiAgZyA9IE1hdGgubWluKE1hdGgubWF4KDAsIGcpLCAxKTtcbiAgYiA9IE1hdGgubWluKE1hdGgubWF4KDAsIGIpLCAxKTtcbiAgcmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZ2IyeXV2KHJnYikge1xuICB2YXIgciA9IHJnYlswXSAvIDI1NSxcbiAgICAgIGcgPSByZ2JbMV0gLyAyNTUsXG4gICAgICBiID0gcmdiWzJdIC8gMjU1O1xuICB2YXIgeSA9IHIgKiAwLjI5OSArIGcgKiAwLjU4NyArIGIgKiAwLjExNDtcbiAgdmFyIHUgPSByICogLTAuMTQ3MTMgKyBnICogLTAuMjg4ODYgKyBiICogMC40MzY7XG4gIHZhciB2ID0gciAqIDAuNjE1ICsgZyAqIC0wLjUxNDk5ICsgYiAqIC0wLjEwMDAxO1xuICByZXR1cm4gW3ksIHUsIHZdO1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0ICogYXMgYmFzZTE2IGZyb20gJ2Jhc2UxNic7XG5pbXBvcnQgQ29sb3IgZnJvbSAnY29sb3InO1xuaW1wb3J0IGN1cnJ5IGZyb20gJ2xvZGFzaC5jdXJyeSc7XG5pbXBvcnQgeyB5dXYycmdiLCByZ2IyeXV2IH0gZnJvbSAnLi9jb2xvckNvbnZlcnRlcnMnO1xudmFyIERFRkFVTFRfQkFTRTE2ID0gYmFzZTE2LmRlZmF1bHQ7XG52YXIgQkFTRTE2X0tFWVMgPSBPYmplY3Qua2V5cyhERUZBVUxUX0JBU0UxNik7IC8vIHdlIG5lZWQgYSBjb3JyZWN0aW5nIGZhY3Rvciwgc28gdGhhdCBhIGRhcmssIGJ1dCBub3QgYmxhY2sgYmFja2dyb3VuZCBjb2xvclxuLy8gY29udmVydHMgdG8gYnJpZ2h0IGVub3VnaCBpbnZlcnNlZCBjb2xvclxuXG52YXIgZmxpcCA9IGZ1bmN0aW9uIGZsaXAoeCkge1xuICByZXR1cm4geCA8IDAuMjUgPyAxIDogeCA8IDAuNSA/IDAuOSAtIHggOiAxLjEgLSB4O1xufTtcblxudmFyIGludmVydENvbG9yID0gZnVuY3Rpb24gaW52ZXJ0Q29sb3IoaGV4U3RyaW5nKSB7XG4gIHZhciBjb2xvciA9IENvbG9yKGhleFN0cmluZyk7XG5cbiAgdmFyIF9yZ2IyeXV2ID0gcmdiMnl1dihjb2xvci5hcnJheSgpKSxcbiAgICAgIF9yZ2IyeXV2MiA9IF9zbGljZWRUb0FycmF5KF9yZ2IyeXV2LCAzKSxcbiAgICAgIHkgPSBfcmdiMnl1djJbMF0sXG4gICAgICB1ID0gX3JnYjJ5dXYyWzFdLFxuICAgICAgdiA9IF9yZ2IyeXV2MlsyXTtcblxuICB2YXIgZmxpcHBlZFl1diA9IFtmbGlwKHkpLCB1LCB2XTtcbiAgdmFyIHJnYiA9IHl1djJyZ2IoZmxpcHBlZFl1dik7XG4gIHJldHVybiBDb2xvci5yZ2IocmdiKS5oZXgoKTtcbn07XG5cbnZhciBtZXJnZXIgPSBmdW5jdGlvbiBtZXJnZXIoc3R5bGluZykge1xuICByZXR1cm4gZnVuY3Rpb24gKHByZXZTdHlsaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzTmFtZTogW3ByZXZTdHlsaW5nLmNsYXNzTmFtZSwgc3R5bGluZy5jbGFzc05hbWVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyksXG4gICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3R5bGluZy5zdHlsZSB8fCB7fSksIHN0eWxpbmcuc3R5bGUgfHwge30pXG4gICAgfTtcbiAgfTtcbn07XG5cbnZhciBtZXJnZVN0eWxpbmcgPSBmdW5jdGlvbiBtZXJnZVN0eWxpbmcoY3VzdG9tU3R5bGluZywgZGVmYXVsdFN0eWxpbmcpIHtcbiAgaWYgKGN1c3RvbVN0eWxpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBkZWZhdWx0U3R5bGluZztcbiAgfVxuXG4gIGlmIChkZWZhdWx0U3R5bGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0eWxpbmc7XG4gIH1cblxuICB2YXIgY3VzdG9tVHlwZSA9IF90eXBlb2YoY3VzdG9tU3R5bGluZyk7XG5cbiAgdmFyIGRlZmF1bHRUeXBlID0gX3R5cGVvZihkZWZhdWx0U3R5bGluZyk7XG5cbiAgc3dpdGNoIChjdXN0b21UeXBlKSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHN3aXRjaCAoZGVmYXVsdFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICByZXR1cm4gW2RlZmF1bHRTdHlsaW5nLCBjdXN0b21TdHlsaW5nXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuXG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgcmV0dXJuIG1lcmdlcih7XG4gICAgICAgICAgICBjbGFzc05hbWU6IGN1c3RvbVN0eWxpbmcsXG4gICAgICAgICAgICBzdHlsZTogZGVmYXVsdFN0eWxpbmdcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdHlsaW5nKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VyKHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjdXN0b21TdHlsaW5nXG4gICAgICAgICAgICB9KShkZWZhdWx0U3R5bGluZy5hcHBseSh2b2lkIDAsIFtzdHlsaW5nXS5jb25jYXQoYXJncykpKTtcbiAgICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICBzd2l0Y2ggKGRlZmF1bHRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgcmV0dXJuIG1lcmdlcih7XG4gICAgICAgICAgICBjbGFzc05hbWU6IGRlZmF1bHRTdHlsaW5nLFxuICAgICAgICAgICAgc3R5bGU6IGN1c3RvbVN0eWxpbmdcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRlZmF1bHRTdHlsaW5nKSwgY3VzdG9tU3R5bGluZyk7XG5cbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc3R5bGluZykge1xuICAgICAgICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlcih7XG4gICAgICAgICAgICAgIHN0eWxlOiBjdXN0b21TdHlsaW5nXG4gICAgICAgICAgICB9KShkZWZhdWx0U3R5bGluZy5hcHBseSh2b2lkIDAsIFtzdHlsaW5nXS5jb25jYXQoYXJncykpKTtcbiAgICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHN3aXRjaCAoZGVmYXVsdFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHN0eWxpbmcpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMyA+IDEgPyBfbGVuMyAtIDEgOiAwKSwgX2tleTMgPSAxOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2tleTMgLSAxXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjdXN0b21TdHlsaW5nLmFwcGx5KHZvaWQgMCwgW21lcmdlcihzdHlsaW5nKSh7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogZGVmYXVsdFN0eWxpbmdcbiAgICAgICAgICAgIH0pXS5jb25jYXQoYXJncykpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHN0eWxpbmcpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuNCA+IDEgPyBfbGVuNCAtIDEgOiAwKSwgX2tleTQgPSAxOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2tleTQgLSAxXSA9IGFyZ3VtZW50c1tfa2V5NF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjdXN0b21TdHlsaW5nLmFwcGx5KHZvaWQgMCwgW21lcmdlcihzdHlsaW5nKSh7XG4gICAgICAgICAgICAgIHN0eWxlOiBkZWZhdWx0U3R5bGluZ1xuICAgICAgICAgICAgfSldLmNvbmNhdChhcmdzKSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdHlsaW5nKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuNSA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjUgPiAxID8gX2xlbjUgLSAxIDogMCksIF9rZXk1ID0gMTsgX2tleTUgPCBfbGVuNTsgX2tleTUrKykge1xuICAgICAgICAgICAgICBhcmdzW19rZXk1IC0gMV0gPSBhcmd1bWVudHNbX2tleTVdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY3VzdG9tU3R5bGluZy5hcHBseSh2b2lkIDAsIFtkZWZhdWx0U3R5bGluZy5hcHBseSh2b2lkIDAsIFtzdHlsaW5nXS5jb25jYXQoYXJncykpXS5jb25jYXQoYXJncykpO1xuICAgICAgICAgIH07XG4gICAgICB9XG5cbiAgfVxufTtcblxudmFyIG1lcmdlU3R5bGluZ3MgPSBmdW5jdGlvbiBtZXJnZVN0eWxpbmdzKGN1c3RvbVN0eWxpbmdzLCBkZWZhdWx0U3R5bGluZ3MpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhkZWZhdWx0U3R5bGluZ3MpO1xuXG4gIGZvciAodmFyIGtleSBpbiBjdXN0b21TdHlsaW5ncykge1xuICAgIGlmIChrZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIGtleXMucHVzaChrZXkpO1xuICB9XG5cbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChtZXJnZWRTdHlsaW5nLCBrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkU3R5bGluZ1trZXldID0gbWVyZ2VTdHlsaW5nKGN1c3RvbVN0eWxpbmdzW2tleV0sIGRlZmF1bHRTdHlsaW5nc1trZXldKSwgbWVyZ2VkU3R5bGluZztcbiAgfSwge30pO1xufTtcblxudmFyIGdldFN0eWxpbmdCeUtleXMgPSBmdW5jdGlvbiBnZXRTdHlsaW5nQnlLZXlzKG1lcmdlZFN0eWxpbmcsIGtleXMpIHtcbiAgZm9yICh2YXIgX2xlbjYgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW42ID4gMiA/IF9sZW42IC0gMiA6IDApLCBfa2V5NiA9IDI7IF9rZXk2IDwgX2xlbjY7IF9rZXk2KyspIHtcbiAgICBhcmdzW19rZXk2IC0gMl0gPSBhcmd1bWVudHNbX2tleTZdO1xuICB9XG5cbiAgaWYgKGtleXMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbWVyZ2VkU3R5bGluZztcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgIGtleXMgPSBba2V5c107XG4gIH1cblxuICB2YXIgc3R5bGVzID0ga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBtZXJnZWRTdHlsaW5nW2tleV07XG4gIH0pLmZpbHRlcihCb29sZWFuKTtcbiAgdmFyIHByb3BzID0gc3R5bGVzLnJlZHVjZShmdW5jdGlvbiAob2JqLCBzKSB7XG4gICAgaWYgKHR5cGVvZiBzID09PSAnc3RyaW5nJykge1xuICAgICAgb2JqLmNsYXNzTmFtZSA9IFtvYmouY2xhc3NOYW1lLCBzXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIH0gZWxzZSBpZiAoX3R5cGVvZihzKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG9iai5zdHlsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb2JqLnN0eWxlKSwgcyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb2JqID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvYmopLCBzLmFwcGx5KHZvaWQgMCwgW29ial0uY29uY2F0KGFyZ3MpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbiAgfSwge1xuICAgIGNsYXNzTmFtZTogJycsXG4gICAgc3R5bGU6IHt9XG4gIH0pO1xuXG4gIGlmICghcHJvcHMuY2xhc3NOYW1lKSB7XG4gICAgZGVsZXRlIHByb3BzLmNsYXNzTmFtZTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhwcm9wcy5zdHlsZSkubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIHByb3BzLnN0eWxlO1xuICB9XG5cbiAgcmV0dXJuIHByb3BzO1xufTtcblxuZXhwb3J0IHZhciBpbnZlcnRCYXNlMTZUaGVtZSA9IGZ1bmN0aW9uIGludmVydEJhc2UxNlRoZW1lKGJhc2UxNlRoZW1lKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhiYXNlMTZUaGVtZSkucmVkdWNlKGZ1bmN0aW9uICh0LCBrZXkpIHtcbiAgICByZXR1cm4gdFtrZXldID0gL15iYXNlLy50ZXN0KGtleSkgPyBpbnZlcnRDb2xvcihiYXNlMTZUaGVtZVtrZXldKSA6IGtleSA9PT0gJ3NjaGVtZScgPyBiYXNlMTZUaGVtZVtrZXldICsgJzppbnZlcnRlZCcgOiBiYXNlMTZUaGVtZVtrZXldLCB0O1xuICB9LCB7fSk7XG59O1xuZXhwb3J0IHZhciBjcmVhdGVTdHlsaW5nID0gY3VycnkoZnVuY3Rpb24gKGdldFN0eWxpbmdGcm9tQmFzZTE2KSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIHRoZW1lT3JTdHlsaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgdmFyIF9vcHRpb25zJGRlZmF1bHRCYXNlID0gb3B0aW9ucy5kZWZhdWx0QmFzZTE2LFxuICAgICAgZGVmYXVsdEJhc2UxNiA9IF9vcHRpb25zJGRlZmF1bHRCYXNlID09PSB2b2lkIDAgPyBERUZBVUxUX0JBU0UxNiA6IF9vcHRpb25zJGRlZmF1bHRCYXNlLFxuICAgICAgX29wdGlvbnMkYmFzZTE2VGhlbWVzID0gb3B0aW9ucy5iYXNlMTZUaGVtZXMsXG4gICAgICBiYXNlMTZUaGVtZXMgPSBfb3B0aW9ucyRiYXNlMTZUaGVtZXMgPT09IHZvaWQgMCA/IG51bGwgOiBfb3B0aW9ucyRiYXNlMTZUaGVtZXM7XG4gIHZhciBiYXNlMTZUaGVtZSA9IGdldEJhc2UxNlRoZW1lKHRoZW1lT3JTdHlsaW5nLCBiYXNlMTZUaGVtZXMpO1xuXG4gIGlmIChiYXNlMTZUaGVtZSkge1xuICAgIHRoZW1lT3JTdHlsaW5nID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBiYXNlMTZUaGVtZSksIHRoZW1lT3JTdHlsaW5nKTtcbiAgfVxuXG4gIHZhciB0aGVtZSA9IEJBU0UxNl9LRVlTLnJlZHVjZShmdW5jdGlvbiAodCwga2V5KSB7XG4gICAgcmV0dXJuIHRba2V5XSA9IHRoZW1lT3JTdHlsaW5nW2tleV0gfHwgZGVmYXVsdEJhc2UxNltrZXldLCB0O1xuICB9LCB7fSk7XG4gIHZhciBjdXN0b21TdHlsaW5nID0gT2JqZWN0LmtleXModGhlbWVPclN0eWxpbmcpLnJlZHVjZShmdW5jdGlvbiAocywga2V5KSB7XG4gICAgcmV0dXJuIEJBU0UxNl9LRVlTLmluZGV4T2Yoa2V5KSA9PT0gLTEgPyAoc1trZXldID0gdGhlbWVPclN0eWxpbmdba2V5XSwgcykgOiBzO1xuICB9LCB7fSk7XG4gIHZhciBkZWZhdWx0U3R5bGluZyA9IGdldFN0eWxpbmdGcm9tQmFzZTE2KHRoZW1lKTtcbiAgdmFyIG1lcmdlZFN0eWxpbmcgPSBtZXJnZVN0eWxpbmdzKGN1c3RvbVN0eWxpbmcsIGRlZmF1bHRTdHlsaW5nKTtcblxuICBmb3IgKHZhciBfbGVuNyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjcgPiAzID8gX2xlbjcgLSAzIDogMCksIF9rZXk3ID0gMzsgX2tleTcgPCBfbGVuNzsgX2tleTcrKykge1xuICAgIGFyZ3NbX2tleTcgLSAzXSA9IGFyZ3VtZW50c1tfa2V5N107XG4gIH1cblxuICByZXR1cm4gY3VycnkoZ2V0U3R5bGluZ0J5S2V5cywgMikuYXBwbHkodm9pZCAwLCBbbWVyZ2VkU3R5bGluZ10uY29uY2F0KGFyZ3MpKTtcbn0sIDMpO1xuXG52YXIgaXNTdHlsaW5nQ29uZmlnID0gZnVuY3Rpb24gaXNTdHlsaW5nQ29uZmlnKHRoZW1lKSB7XG4gIHJldHVybiAhIXRoZW1lLmV4dGVuZDtcbn07XG5cbmV4cG9ydCB2YXIgZ2V0QmFzZTE2VGhlbWUgPSBmdW5jdGlvbiBnZXRCYXNlMTZUaGVtZSh0aGVtZSwgYmFzZTE2VGhlbWVzKSB7XG4gIGlmICh0aGVtZSAmJiBpc1N0eWxpbmdDb25maWcodGhlbWUpICYmIHRoZW1lLmV4dGVuZCkge1xuICAgIHRoZW1lID0gdGhlbWUuZXh0ZW5kO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0aGVtZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgX3RoZW1lJHNwbGl0ID0gdGhlbWUuc3BsaXQoJzonKSxcbiAgICAgICAgX3RoZW1lJHNwbGl0MiA9IF9zbGljZWRUb0FycmF5KF90aGVtZSRzcGxpdCwgMiksXG4gICAgICAgIF90aGVtZU5hbWUgPSBfdGhlbWUkc3BsaXQyWzBdLFxuICAgICAgICBtb2RpZmllciA9IF90aGVtZSRzcGxpdDJbMV07XG5cbiAgICBpZiAoYmFzZTE2VGhlbWVzKSB7XG4gICAgICB0aGVtZSA9IGJhc2UxNlRoZW1lc1tfdGhlbWVOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhlbWUgPSBiYXNlMTZbX3RoZW1lTmFtZV07XG4gICAgfVxuXG4gICAgaWYgKG1vZGlmaWVyID09PSAnaW52ZXJ0ZWQnKSB7XG4gICAgICB0aGVtZSA9IGludmVydEJhc2UxNlRoZW1lKHRoZW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhlbWUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoZW1lLCAnYmFzZTAwJykgPyB0aGVtZSA6IHVuZGVmaW5lZDtcbn07XG5leHBvcnQgdmFyIGludmVydFRoZW1lID0gZnVuY3Rpb24gaW52ZXJ0VGhlbWUodGhlbWUpIHtcbiAgaWYgKHR5cGVvZiB0aGVtZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQodGhlbWUsIFwiOmludmVydGVkXCIpO1xuICB9XG5cbiAgaWYgKHRoZW1lICYmIGlzU3R5bGluZ0NvbmZpZyh0aGVtZSkgJiYgdGhlbWUuZXh0ZW5kKSB7XG4gICAgaWYgKHR5cGVvZiB0aGVtZS5leHRlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0aGVtZSksIHt9LCB7XG4gICAgICAgIGV4dGVuZDogXCJcIi5jb25jYXQodGhlbWUuZXh0ZW5kLCBcIjppbnZlcnRlZFwiKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhlbWUpLCB7fSwge1xuICAgICAgZXh0ZW5kOiBpbnZlcnRCYXNlMTZUaGVtZSh0aGVtZS5leHRlbmQpXG4gICAgfSk7XG4gIH1cblxuICBpZiAodGhlbWUpIHtcbiAgICByZXR1cm4gaW52ZXJ0QmFzZTE2VGhlbWUodGhlbWUpO1xuICB9XG5cbiAgcmV0dXJuIHRoZW1lO1xufTtcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnOyIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBoYXNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIDogMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJykgOiAweGVhY2E7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50JykgOiAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJykgOiAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJykgOiAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJykgOiAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpIDogMHhlYWNlOyAvLyBUT0RPOiBXZSBkb24ndCB1c2UgQXN5bmNNb2RlIG9yIENvbmN1cnJlbnRNb2RlIGFueW1vcmUuIFRoZXkgd2VyZSB0ZW1wb3Jhcnlcbi8vICh1bnN0YWJsZSkgQVBJcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLiBDYW4gd2UgcmVtb3ZlIHRoZSBzeW1ib2xzP1xuXG52YXIgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYXN5bmNfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29uY3VycmVudF9tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJykgOiAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJykgOiAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpIDogMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKSA6IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5JykgOiAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmJsb2NrJykgOiAweGVhZDk7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJykgOiAweGVhZDU7XG52YXIgUkVBQ1RfUkVTUE9OREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5yZXNwb25kZXInKSA6IDB4ZWFkNjtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKSA6IDB4ZWFkNztcblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCAvLyBOb3RlOiBpdHMgdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgaWYgaXQncyBhIHBvbHlmaWxsLlxuICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUkVTUE9OREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfU0NPUEVfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFKTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59IC8vIEFzeW5jTW9kZSBpcyBkZXByZWNhdGVkIGFsb25nIHdpdGggaXNBc3luY01vZGVcblxudmFyIEFzeW5jTW9kZSA9IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbnZhciBDb25jdXJyZW50TW9kZSA9IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxNysuIFVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlICcgKyAnUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgaW5zdGVhZC4gSXQgaGFzIHRoZSBleGFjdCBzYW1lIEFQSS4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHx8IHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuXG5leHBvcnRzLkFzeW5jTW9kZSA9IEFzeW5jTW9kZTtcbmV4cG9ydHMuQ29uY3VycmVudE1vZGUgPSBDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiO1xuaW1wb3J0IF9nZXRQcm90b3R5cGVPZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgSlNPTkFycm93IGZyb20gJy4vSlNPTkFycm93JztcblxudmFyIEl0ZW1SYW5nZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoSXRlbVJhbmdlLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEl0ZW1SYW5nZSk7XG5cbiAgZnVuY3Rpb24gSXRlbVJhbmdlKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEl0ZW1SYW5nZSk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJoYW5kbGVDbGlja1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGV4cGFuZGVkOiAhX3RoaXMuc3RhdGUuZXhwYW5kZWRcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBleHBhbmRlZDogZmFsc2VcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhJdGVtUmFuZ2UsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHN0eWxpbmcgPSBfdGhpcyRwcm9wcy5zdHlsaW5nLFxuICAgICAgICAgIGZyb20gPSBfdGhpcyRwcm9wcy5mcm9tLFxuICAgICAgICAgIHRvID0gX3RoaXMkcHJvcHMudG8sXG4gICAgICAgICAgcmVuZGVyQ2hpbGROb2RlcyA9IF90aGlzJHByb3BzLnJlbmRlckNoaWxkTm9kZXMsXG4gICAgICAgICAgbm9kZVR5cGUgPSBfdGhpcyRwcm9wcy5ub2RlVHlwZTtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlLmV4cGFuZGVkID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgc3R5bGluZygnaXRlbVJhbmdlJywgdGhpcy5zdGF0ZS5leHBhbmRlZCksIHJlbmRlckNoaWxkTm9kZXModGhpcy5wcm9wcywgZnJvbSwgdG8pKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBzdHlsaW5nKCdpdGVtUmFuZ2UnLCB0aGlzLnN0YXRlLmV4cGFuZGVkKSwge1xuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTkFycm93LCB7XG4gICAgICAgIG5vZGVUeXBlOiBub2RlVHlwZSxcbiAgICAgICAgc3R5bGluZzogc3R5bGluZyxcbiAgICAgICAgZXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrLFxuICAgICAgICBhcnJvd1N0eWxlOiBcImRvdWJsZVwiXG4gICAgICB9KSwgXCJcIi5jb25jYXQoZnJvbSwgXCIgLi4uIFwiKS5jb25jYXQodG8pKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSXRlbVJhbmdlO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5fZGVmaW5lUHJvcGVydHkoSXRlbVJhbmdlLCBcInByb3BUeXBlc1wiLCB7XG4gIHN0eWxpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGZyb206IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgdG86IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgcmVuZGVyQ2hpbGROb2RlczogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgbm9kZVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxufSk7XG5cbmV4cG9ydCB7IEl0ZW1SYW5nZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJkYXRhXCJdO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgSlNPTk5lc3RlZE5vZGUgZnJvbSAnLi9KU09OTmVzdGVkTm9kZSc7XG5cbi8vIFJldHVybnMgdGhlIFwibiBJdGVtc1wiIHN0cmluZyBmb3IgdGhpcyBub2RlLFxuLy8gZ2VuZXJhdGluZyBhbmQgY2FjaGluZyBpdCBpZiBpdCBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldC5cbmZ1bmN0aW9uIGNyZWF0ZUl0ZW1TdHJpbmcoZGF0YSkge1xuICByZXR1cm4gXCJcIi5jb25jYXQoZGF0YS5sZW5ndGgsIFwiIFwiKS5jb25jYXQoZGF0YS5sZW5ndGggIT09IDEgPyAnaXRlbXMnIDogJ2l0ZW0nKTtcbn1cblxuLy8gQ29uZmlndXJlcyA8SlNPTk5lc3RlZE5vZGU+IHRvIHJlbmRlciBhbiBBcnJheVxudmFyIEpTT05BcnJheU5vZGUgPSBmdW5jdGlvbiBKU09OQXJyYXlOb2RlKF9yZWYpIHtcbiAgdmFyIGRhdGEgPSBfcmVmLmRhdGEsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OTmVzdGVkTm9kZSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgZGF0YTogZGF0YSxcbiAgICBub2RlVHlwZTogXCJBcnJheVwiLFxuICAgIG5vZGVUeXBlSW5kaWNhdG9yOiBcIltdXCIsXG4gICAgY3JlYXRlSXRlbVN0cmluZzogY3JlYXRlSXRlbVN0cmluZyxcbiAgICBleHBhbmRhYmxlOiBkYXRhLmxlbmd0aCA+IDBcbiAgfSkpO1xufTtcblxuSlNPTkFycmF5Tm9kZS5wcm9wVHlwZXMgPSB7XG4gIGRhdGE6IFByb3BUeXBlcy5hcnJheVxufTtcbmV4cG9ydCBkZWZhdWx0IEpTT05BcnJheU5vZGU7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG52YXIgSlNPTkFycm93ID0gZnVuY3Rpb24gSlNPTkFycm93KF9yZWYpIHtcbiAgdmFyIHN0eWxpbmcgPSBfcmVmLnN0eWxpbmcsXG4gICAgICBhcnJvd1N0eWxlID0gX3JlZi5hcnJvd1N0eWxlLFxuICAgICAgZXhwYW5kZWQgPSBfcmVmLmV4cGFuZGVkLFxuICAgICAgbm9kZVR5cGUgPSBfcmVmLm5vZGVUeXBlLFxuICAgICAgb25DbGljayA9IF9yZWYub25DbGljaztcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBzdHlsaW5nKCdhcnJvd0NvbnRhaW5lcicsIGFycm93U3R5bGUpLCB7XG4gICAgb25DbGljazogb25DbGlja1xuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgc3R5bGluZyhbJ2Fycm93JywgJ2Fycm93U2lnbiddLCBub2RlVHlwZSwgZXhwYW5kZWQsIGFycm93U3R5bGUpLCBcIlxcdTI1QjZcIiwgYXJyb3dTdHlsZSA9PT0gJ2RvdWJsZScgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgc3R5bGluZyhbJ2Fycm93U2lnbicsICdhcnJvd1NpZ25Jbm5lciddKSwgXCJcXHUyNUI2XCIpKSk7XG59O1xuXG5KU09OQXJyb3cucHJvcFR5cGVzID0ge1xuICBzdHlsaW5nOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBhcnJvd1N0eWxlOiBQcm9wVHlwZXMub25lT2YoWydzaW5nbGUnLCAnZG91YmxlJ10pLFxuICBleHBhbmRlZDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgbm9kZVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxufTtcbkpTT05BcnJvdy5kZWZhdWx0UHJvcHMgPSB7XG4gIGFycm93U3R5bGU6ICdzaW5nbGUnXG59O1xuZXhwb3J0IGRlZmF1bHQgSlNPTkFycm93OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdOyBpZiAoIWl0KSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IGl0LmNhbGwobyk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXQucmV0dXJuICE9IG51bGwpIGl0LnJldHVybigpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBKU09OTmVzdGVkTm9kZSBmcm9tICcuL0pTT05OZXN0ZWROb2RlJztcblxuLy8gUmV0dXJucyB0aGUgXCJuIEl0ZW1zXCIgc3RyaW5nIGZvciB0aGlzIG5vZGUsXG4vLyBnZW5lcmF0aW5nIGFuZCBjYWNoaW5nIGl0IGlmIGl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LlxuZnVuY3Rpb24gY3JlYXRlSXRlbVN0cmluZyhkYXRhLCBsaW1pdCkge1xuICB2YXIgY291bnQgPSAwO1xuICB2YXIgaGFzTW9yZSA9IGZhbHNlO1xuXG4gIGlmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihkYXRhLnNpemUpKSB7XG4gICAgY291bnQgPSBkYXRhLnNpemU7XG4gIH0gZWxzZSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGRhdGEpLFxuICAgICAgICBfc3RlcDtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICB2YXIgZW50cnkgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICBpZiAobGltaXQgJiYgY291bnQgKyAxID4gbGltaXQpIHtcbiAgICAgICAgICBoYXNNb3JlID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvdW50ICs9IDE7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IuZigpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBcIlwiLmNvbmNhdChoYXNNb3JlID8gJz4nIDogJycpLmNvbmNhdChjb3VudCwgXCIgXCIpLmNvbmNhdChjb3VudCAhPT0gMSA/ICdlbnRyaWVzJyA6ICdlbnRyeScpO1xufVxuXG4vLyBDb25maWd1cmVzIDxKU09OTmVzdGVkTm9kZT4gdG8gcmVuZGVyIGFuIGl0ZXJhYmxlXG52YXIgSlNPTkl0ZXJhYmxlTm9kZSA9IGZ1bmN0aW9uIEpTT05JdGVyYWJsZU5vZGUoX3JlZikge1xuICB2YXIgcHJvcHMgPSBfZXh0ZW5kcyh7fSwgX3JlZik7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05OZXN0ZWROb2RlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBub2RlVHlwZTogXCJJdGVyYWJsZVwiLFxuICAgIG5vZGVUeXBlSW5kaWNhdG9yOiBcIigpXCIsXG4gICAgY3JlYXRlSXRlbVN0cmluZzogY3JlYXRlSXRlbVN0cmluZ1xuICB9KSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBKU09OSXRlcmFibGVOb2RlOyIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBKU09OQXJyb3cgZnJvbSAnLi9KU09OQXJyb3cnO1xuaW1wb3J0IGdldENvbGxlY3Rpb25FbnRyaWVzIGZyb20gJy4vZ2V0Q29sbGVjdGlvbkVudHJpZXMnO1xuaW1wb3J0IEpTT05Ob2RlIGZyb20gJy4vSlNPTk5vZGUnO1xuaW1wb3J0IEl0ZW1SYW5nZSBmcm9tICcuL0l0ZW1SYW5nZSc7XG5cbmZ1bmN0aW9uIGlzUmFuZ2UocmFuZ2VPckVudHJ5KSB7XG4gIHJldHVybiByYW5nZU9yRW50cnkudG8gIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyQ2hpbGROb2Rlcyhwcm9wcywgZnJvbSwgdG8pIHtcbiAgdmFyIG5vZGVUeXBlID0gcHJvcHMubm9kZVR5cGUsXG4gICAgICBkYXRhID0gcHJvcHMuZGF0YSxcbiAgICAgIGNvbGxlY3Rpb25MaW1pdCA9IHByb3BzLmNvbGxlY3Rpb25MaW1pdCxcbiAgICAgIGNpcmN1bGFyQ2FjaGUgPSBwcm9wcy5jaXJjdWxhckNhY2hlLFxuICAgICAga2V5UGF0aCA9IHByb3BzLmtleVBhdGgsXG4gICAgICBwb3N0cHJvY2Vzc1ZhbHVlID0gcHJvcHMucG9zdHByb2Nlc3NWYWx1ZSxcbiAgICAgIHNvcnRPYmplY3RLZXlzID0gcHJvcHMuc29ydE9iamVjdEtleXM7XG4gIHZhciBjaGlsZE5vZGVzID0gW107XG4gIGdldENvbGxlY3Rpb25FbnRyaWVzKG5vZGVUeXBlLCBkYXRhLCBzb3J0T2JqZWN0S2V5cywgY29sbGVjdGlvbkxpbWl0LCBmcm9tLCB0bykuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICBpZiAoaXNSYW5nZShlbnRyeSkpIHtcbiAgICAgIGNoaWxkTm9kZXMucHVzaCggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSXRlbVJhbmdlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAga2V5OiBcIkl0ZW1SYW5nZS0tXCIuY29uY2F0KGVudHJ5LmZyb20sIFwiLVwiKS5jb25jYXQoZW50cnkudG8pLFxuICAgICAgICBmcm9tOiBlbnRyeS5mcm9tLFxuICAgICAgICB0bzogZW50cnkudG8sXG4gICAgICAgIHJlbmRlckNoaWxkTm9kZXM6IHJlbmRlckNoaWxkTm9kZXNcbiAgICAgIH0pKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBrZXkgPSBlbnRyeS5rZXksXG4gICAgICAgICAgdmFsdWUgPSBlbnRyeS52YWx1ZTtcbiAgICAgIHZhciBpc0NpcmN1bGFyID0gY2lyY3VsYXJDYWNoZS5pbmRleE9mKHZhbHVlKSAhPT0gLTE7XG4gICAgICBjaGlsZE5vZGVzLnB1c2goIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05Ob2RlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAgcG9zdHByb2Nlc3NWYWx1ZTogcG9zdHByb2Nlc3NWYWx1ZSxcbiAgICAgICAgY29sbGVjdGlvbkxpbWl0OiBjb2xsZWN0aW9uTGltaXQsXG4gICAgICAgIGtleTogXCJOb2RlLS1cIi5jb25jYXQoa2V5KSxcbiAgICAgICAga2V5UGF0aDogW2tleV0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShrZXlQYXRoKSksXG4gICAgICAgIHZhbHVlOiBwb3N0cHJvY2Vzc1ZhbHVlKHZhbHVlKSxcbiAgICAgICAgY2lyY3VsYXJDYWNoZTogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShjaXJjdWxhckNhY2hlKSwgW3ZhbHVlXSksXG4gICAgICAgIGlzQ2lyY3VsYXI6IGlzQ2lyY3VsYXIsXG4gICAgICAgIGhpZGVSb290OiBmYWxzZVxuICAgICAgfSkpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY2hpbGROb2Rlcztcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdGVGcm9tUHJvcHMocHJvcHMpIHtcbiAgLy8gY2FsY3VsYXRlIGluZGl2aWR1YWwgbm9kZSBleHBhbnNpb24gaWYgbmVjZXNzYXJ5XG4gIHZhciBleHBhbmRlZCA9ICFwcm9wcy5pc0NpcmN1bGFyID8gcHJvcHMuc2hvdWxkRXhwYW5kTm9kZShwcm9wcy5rZXlQYXRoLCBwcm9wcy5kYXRhLCBwcm9wcy5sZXZlbCkgOiBmYWxzZTtcbiAgcmV0dXJuIHtcbiAgICBleHBhbmRlZDogZXhwYW5kZWRcbiAgfTtcbn1cblxudmFyIEpTT05OZXN0ZWROb2RlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhKU09OTmVzdGVkTm9kZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihKU09OTmVzdGVkTm9kZSk7XG5cbiAgZnVuY3Rpb24gSlNPTk5lc3RlZE5vZGUocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSlNPTk5lc3RlZE5vZGUpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlQ2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnByb3BzLmV4cGFuZGFibGUpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGV4cGFuZGVkOiAhX3RoaXMuc3RhdGUuZXhwYW5kZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfdGhpcy5zdGF0ZSA9IGdldFN0YXRlRnJvbVByb3BzKHByb3BzKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoSlNPTk5lc3RlZE5vZGUsIFt7XG4gICAga2V5OiBcIlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgdmFyIG5leHRTdGF0ZSA9IGdldFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcyk7XG5cbiAgICAgIGlmIChnZXRTdGF0ZUZyb21Qcm9wcyh0aGlzLnByb3BzKS5leHBhbmRlZCAhPT0gbmV4dFN0YXRlLmV4cGFuZGVkKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUobmV4dFN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hvdWxkQ29tcG9uZW50VXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHJldHVybiAhIU9iamVjdC5rZXlzKG5leHRQcm9wcykuZmluZChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgIT09ICdjaXJjdWxhckNhY2hlJyAmJiAoa2V5ID09PSAna2V5UGF0aCcgPyBuZXh0UHJvcHNba2V5XS5qb2luKCcvJykgIT09IF90aGlzMi5wcm9wc1trZXldLmpvaW4oJy8nKSA6IG5leHRQcm9wc1trZXldICE9PSBfdGhpczIucHJvcHNba2V5XSk7XG4gICAgICB9KSB8fCBuZXh0U3RhdGUuZXhwYW5kZWQgIT09IHRoaXMuc3RhdGUuZXhwYW5kZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGdldEl0ZW1TdHJpbmcgPSBfdGhpcyRwcm9wcy5nZXRJdGVtU3RyaW5nLFxuICAgICAgICAgIG5vZGVUeXBlSW5kaWNhdG9yID0gX3RoaXMkcHJvcHMubm9kZVR5cGVJbmRpY2F0b3IsXG4gICAgICAgICAgbm9kZVR5cGUgPSBfdGhpcyRwcm9wcy5ub2RlVHlwZSxcbiAgICAgICAgICBkYXRhID0gX3RoaXMkcHJvcHMuZGF0YSxcbiAgICAgICAgICBoaWRlUm9vdCA9IF90aGlzJHByb3BzLmhpZGVSb290LFxuICAgICAgICAgIGNyZWF0ZUl0ZW1TdHJpbmcgPSBfdGhpcyRwcm9wcy5jcmVhdGVJdGVtU3RyaW5nLFxuICAgICAgICAgIHN0eWxpbmcgPSBfdGhpcyRwcm9wcy5zdHlsaW5nLFxuICAgICAgICAgIGNvbGxlY3Rpb25MaW1pdCA9IF90aGlzJHByb3BzLmNvbGxlY3Rpb25MaW1pdCxcbiAgICAgICAgICBrZXlQYXRoID0gX3RoaXMkcHJvcHMua2V5UGF0aCxcbiAgICAgICAgICBsYWJlbFJlbmRlcmVyID0gX3RoaXMkcHJvcHMubGFiZWxSZW5kZXJlcixcbiAgICAgICAgICBleHBhbmRhYmxlID0gX3RoaXMkcHJvcHMuZXhwYW5kYWJsZTtcbiAgICAgIHZhciBleHBhbmRlZCA9IHRoaXMuc3RhdGUuZXhwYW5kZWQ7XG4gICAgICB2YXIgcmVuZGVyZWRDaGlsZHJlbiA9IGV4cGFuZGVkIHx8IGhpZGVSb290ICYmIHRoaXMucHJvcHMubGV2ZWwgPT09IDAgPyByZW5kZXJDaGlsZE5vZGVzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhpcy5wcm9wcyksIHt9LCB7XG4gICAgICAgIGxldmVsOiB0aGlzLnByb3BzLmxldmVsICsgMVxuICAgICAgfSkpIDogbnVsbDtcbiAgICAgIHZhciBpdGVtVHlwZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBzdHlsaW5nKCduZXN0ZWROb2RlSXRlbVR5cGUnLCBleHBhbmRlZCksIG5vZGVUeXBlSW5kaWNhdG9yKTtcbiAgICAgIHZhciByZW5kZXJlZEl0ZW1TdHJpbmcgPSBnZXRJdGVtU3RyaW5nKG5vZGVUeXBlLCBkYXRhLCBpdGVtVHlwZSwgY3JlYXRlSXRlbVN0cmluZyhkYXRhLCBjb2xsZWN0aW9uTGltaXQpLCBrZXlQYXRoKTtcbiAgICAgIHZhciBzdHlsaW5nQXJncyA9IFtrZXlQYXRoLCBub2RlVHlwZSwgZXhwYW5kZWQsIGV4cGFuZGFibGVdO1xuICAgICAgcmV0dXJuIGhpZGVSb290ID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBzdHlsaW5nLmFwcGx5KHZvaWQgMCwgWydyb290Tm9kZSddLmNvbmNhdChzdHlsaW5nQXJncykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHN0eWxpbmcuYXBwbHkodm9pZCAwLCBbJ3Jvb3ROb2RlQ2hpbGRyZW4nXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwgcmVuZGVyZWRDaGlsZHJlbikpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBzdHlsaW5nLmFwcGx5KHZvaWQgMCwgWyduZXN0ZWROb2RlJ10uY29uY2F0KHN0eWxpbmdBcmdzKSksIGV4cGFuZGFibGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTkFycm93LCB7XG4gICAgICAgIHN0eWxpbmc6IHN0eWxpbmcsXG4gICAgICAgIG5vZGVUeXBlOiBub2RlVHlwZSxcbiAgICAgICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCBfZXh0ZW5kcyh7fSwgc3R5bGluZy5hcHBseSh2b2lkIDAsIFtbJ2xhYmVsJywgJ25lc3RlZE5vZGVMYWJlbCddXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwge1xuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgbGFiZWxSZW5kZXJlci5hcHBseSh2b2lkIDAsIHN0eWxpbmdBcmdzKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBfZXh0ZW5kcyh7fSwgc3R5bGluZy5hcHBseSh2b2lkIDAsIFsnbmVzdGVkTm9kZUl0ZW1TdHJpbmcnXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwge1xuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgcmVuZGVyZWRJdGVtU3RyaW5nKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBzdHlsaW5nLmFwcGx5KHZvaWQgMCwgWyduZXN0ZWROb2RlQ2hpbGRyZW4nXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwgcmVuZGVyZWRDaGlsZHJlbikpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBKU09OTmVzdGVkTm9kZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuX2RlZmluZVByb3BlcnR5KEpTT05OZXN0ZWROb2RlLCBcInByb3BUeXBlc1wiLCB7XG4gIGdldEl0ZW1TdHJpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG5vZGVUeXBlSW5kaWNhdG9yOiBQcm9wVHlwZXMuYW55LFxuICBub2RlVHlwZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBkYXRhOiBQcm9wVHlwZXMuYW55LFxuICBoaWRlUm9vdDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgY3JlYXRlSXRlbVN0cmluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgc3R5bGluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgY29sbGVjdGlvbkxpbWl0OiBQcm9wVHlwZXMubnVtYmVyLFxuICBrZXlQYXRoOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSkpLmlzUmVxdWlyZWQsXG4gIGxhYmVsUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHNob3VsZEV4cGFuZE5vZGU6IFByb3BUeXBlcy5mdW5jLFxuICBsZXZlbDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBzb3J0T2JqZWN0S2V5czogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIFByb3BUeXBlcy5ib29sXSksXG4gIGlzQ2lyY3VsYXI6IFByb3BUeXBlcy5ib29sLFxuICBleHBhbmRhYmxlOiBQcm9wVHlwZXMuYm9vbFxufSk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKU09OTmVzdGVkTm9kZSwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBkYXRhOiBbXSxcbiAgY2lyY3VsYXJDYWNoZTogW10sXG4gIGxldmVsOiAwLFxuICBleHBhbmRhYmxlOiB0cnVlXG59KTtcblxuZXhwb3J0IHsgSlNPTk5lc3RlZE5vZGUgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiZ2V0SXRlbVN0cmluZ1wiLCBcImtleVBhdGhcIiwgXCJsYWJlbFJlbmRlcmVyXCIsIFwic3R5bGluZ1wiLCBcInZhbHVlXCIsIFwidmFsdWVSZW5kZXJlclwiLCBcImlzQ3VzdG9tTm9kZVwiXTtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgb2JqVHlwZSBmcm9tICcuL29ialR5cGUnO1xuaW1wb3J0IEpTT05PYmplY3ROb2RlIGZyb20gJy4vSlNPTk9iamVjdE5vZGUnO1xuaW1wb3J0IEpTT05BcnJheU5vZGUgZnJvbSAnLi9KU09OQXJyYXlOb2RlJztcbmltcG9ydCBKU09OSXRlcmFibGVOb2RlIGZyb20gJy4vSlNPTkl0ZXJhYmxlTm9kZSc7XG5pbXBvcnQgSlNPTlZhbHVlTm9kZSBmcm9tICcuL0pTT05WYWx1ZU5vZGUnO1xuXG52YXIgSlNPTk5vZGUgPSBmdW5jdGlvbiBKU09OTm9kZShfcmVmKSB7XG4gIHZhciBnZXRJdGVtU3RyaW5nID0gX3JlZi5nZXRJdGVtU3RyaW5nLFxuICAgICAga2V5UGF0aCA9IF9yZWYua2V5UGF0aCxcbiAgICAgIGxhYmVsUmVuZGVyZXIgPSBfcmVmLmxhYmVsUmVuZGVyZXIsXG4gICAgICBzdHlsaW5nID0gX3JlZi5zdHlsaW5nLFxuICAgICAgdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgICAgdmFsdWVSZW5kZXJlciA9IF9yZWYudmFsdWVSZW5kZXJlcixcbiAgICAgIGlzQ3VzdG9tTm9kZSA9IF9yZWYuaXNDdXN0b21Ob2RlLFxuICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIHZhciBub2RlVHlwZSA9IGlzQ3VzdG9tTm9kZSh2YWx1ZSkgPyAnQ3VzdG9tJyA6IG9ialR5cGUodmFsdWUpO1xuICB2YXIgc2ltcGxlTm9kZVByb3BzID0ge1xuICAgIGdldEl0ZW1TdHJpbmc6IGdldEl0ZW1TdHJpbmcsXG4gICAga2V5OiBrZXlQYXRoWzBdLFxuICAgIGtleVBhdGg6IGtleVBhdGgsXG4gICAgbGFiZWxSZW5kZXJlcjogbGFiZWxSZW5kZXJlcixcbiAgICBub2RlVHlwZTogbm9kZVR5cGUsXG4gICAgc3R5bGluZzogc3R5bGluZyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgdmFsdWVSZW5kZXJlcjogdmFsdWVSZW5kZXJlclxuICB9O1xuXG4gIHZhciBuZXN0ZWROb2RlUHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcmVzdCksIHNpbXBsZU5vZGVQcm9wcyksIHt9LCB7XG4gICAgZGF0YTogdmFsdWUsXG4gICAgaXNDdXN0b21Ob2RlOiBpc0N1c3RvbU5vZGVcbiAgfSk7XG5cbiAgc3dpdGNoIChub2RlVHlwZSkge1xuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgY2FzZSAnRXJyb3InOlxuICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05PYmplY3ROb2RlLCBuZXN0ZWROb2RlUHJvcHMpO1xuXG4gICAgY2FzZSAnQXJyYXknOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05BcnJheU5vZGUsIG5lc3RlZE5vZGVQcm9wcyk7XG5cbiAgICBjYXNlICdJdGVyYWJsZSc6XG4gICAgY2FzZSAnTWFwJzpcbiAgICBjYXNlICdTZXQnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05JdGVyYWJsZU5vZGUsIG5lc3RlZE5vZGVQcm9wcyk7XG5cbiAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKHJhdykge1xuICAgICAgICAgIHJldHVybiBcIlxcXCJcIi5jb25jYXQocmF3LCBcIlxcXCJcIik7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ051bWJlcic6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgc2ltcGxlTm9kZVByb3BzKTtcblxuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKHJhdykge1xuICAgICAgICAgIHJldHVybiByYXcgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICBjYXNlICdEYXRlJzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OVmFsdWVOb2RlLCBfZXh0ZW5kcyh7fSwgc2ltcGxlTm9kZVByb3BzLCB7XG4gICAgICAgIHZhbHVlR2V0dGVyOiBmdW5jdGlvbiB2YWx1ZUdldHRlcihyYXcpIHtcbiAgICAgICAgICByZXR1cm4gcmF3LnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ051bGwnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKCkge1xuICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ1VuZGVmaW5lZCc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgX2V4dGVuZHMoe30sIHNpbXBsZU5vZGVQcm9wcywge1xuICAgICAgICB2YWx1ZUdldHRlcjogZnVuY3Rpb24gdmFsdWVHZXR0ZXIoKSB7XG4gICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICBjYXNlICdGdW5jdGlvbic6XG4gICAgY2FzZSAnU3ltYm9sJzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OVmFsdWVOb2RlLCBfZXh0ZW5kcyh7fSwgc2ltcGxlTm9kZVByb3BzLCB7XG4gICAgICAgIHZhbHVlR2V0dGVyOiBmdW5jdGlvbiB2YWx1ZUdldHRlcihyYXcpIHtcbiAgICAgICAgICByZXR1cm4gcmF3LnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ0N1c3RvbSc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgc2ltcGxlTm9kZVByb3BzKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgX2V4dGVuZHMoe30sIHNpbXBsZU5vZGVQcm9wcywge1xuICAgICAgICB2YWx1ZUdldHRlcjogZnVuY3Rpb24gdmFsdWVHZXR0ZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIFwiPFwiLmNvbmNhdChub2RlVHlwZSwgXCI+XCIpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gIH1cbn07XG5cbkpTT05Ob2RlLnByb3BUeXBlcyA9IHtcbiAgZ2V0SXRlbVN0cmluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAga2V5UGF0aDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLmlzUmVxdWlyZWQpLmlzUmVxdWlyZWQsXG4gIGxhYmVsUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHN0eWxpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHZhbHVlOiBQcm9wVHlwZXMuYW55LFxuICB2YWx1ZVJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBpc0N1c3RvbU5vZGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn07XG5leHBvcnQgZGVmYXVsdCBKU09OTm9kZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImRhdGFcIl07XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBKU09OTmVzdGVkTm9kZSBmcm9tICcuL0pTT05OZXN0ZWROb2RlJztcblxuLy8gUmV0dXJucyB0aGUgXCJuIEl0ZW1zXCIgc3RyaW5nIGZvciB0aGlzIG5vZGUsXG4vLyBnZW5lcmF0aW5nIGFuZCBjYWNoaW5nIGl0IGlmIGl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LlxuZnVuY3Rpb24gY3JlYXRlSXRlbVN0cmluZyhkYXRhKSB7XG4gIHZhciBsZW4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkYXRhKS5sZW5ndGg7XG4gIHJldHVybiBcIlwiLmNvbmNhdChsZW4sIFwiIFwiKS5jb25jYXQobGVuICE9PSAxID8gJ2tleXMnIDogJ2tleScpO1xufVxuXG4vLyBDb25maWd1cmVzIDxKU09OTmVzdGVkTm9kZT4gdG8gcmVuZGVyIGFuIE9iamVjdFxudmFyIEpTT05PYmplY3ROb2RlID0gZnVuY3Rpb24gSlNPTk9iamVjdE5vZGUoX3JlZikge1xuICB2YXIgZGF0YSA9IF9yZWYuZGF0YSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05OZXN0ZWROb2RlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBkYXRhOiBkYXRhLFxuICAgIG5vZGVUeXBlOiBcIk9iamVjdFwiLFxuICAgIG5vZGVUeXBlSW5kaWNhdG9yOiBwcm9wcy5ub2RlVHlwZSA9PT0gJ0Vycm9yJyA/ICdFcnJvcigpJyA6ICd7fScsXG4gICAgY3JlYXRlSXRlbVN0cmluZzogY3JlYXRlSXRlbVN0cmluZyxcbiAgICBleHBhbmRhYmxlOiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkYXRhKS5sZW5ndGggPiAwXG4gIH0pKTtcbn07XG5cbkpTT05PYmplY3ROb2RlLnByb3BUeXBlcyA9IHtcbiAgZGF0YTogUHJvcFR5cGVzLm9iamVjdCxcbiAgbm9kZVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxufTtcbmV4cG9ydCBkZWZhdWx0IEpTT05PYmplY3ROb2RlOyIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG52YXIgSlNPTlZhbHVlTm9kZSA9IGZ1bmN0aW9uIEpTT05WYWx1ZU5vZGUoX3JlZikge1xuICB2YXIgbm9kZVR5cGUgPSBfcmVmLm5vZGVUeXBlLFxuICAgICAgc3R5bGluZyA9IF9yZWYuc3R5bGluZyxcbiAgICAgIGxhYmVsUmVuZGVyZXIgPSBfcmVmLmxhYmVsUmVuZGVyZXIsXG4gICAgICBrZXlQYXRoID0gX3JlZi5rZXlQYXRoLFxuICAgICAgdmFsdWVSZW5kZXJlciA9IF9yZWYudmFsdWVSZW5kZXJlcixcbiAgICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICAgIF9yZWYkdmFsdWVHZXR0ZXIgPSBfcmVmLnZhbHVlR2V0dGVyLFxuICAgICAgdmFsdWVHZXR0ZXIgPSBfcmVmJHZhbHVlR2V0dGVyID09PSB2b2lkIDAgPyBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gOiBfcmVmJHZhbHVlR2V0dGVyO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBzdHlsaW5nKCd2YWx1ZScsIG5vZGVUeXBlLCBrZXlQYXRoKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCBzdHlsaW5nKFsnbGFiZWwnLCAndmFsdWVMYWJlbCddLCBub2RlVHlwZSwga2V5UGF0aCksIGxhYmVsUmVuZGVyZXIoa2V5UGF0aCwgbm9kZVR5cGUsIGZhbHNlLCBmYWxzZSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgc3R5bGluZygndmFsdWVUZXh0Jywgbm9kZVR5cGUsIGtleVBhdGgpLCB2YWx1ZVJlbmRlcmVyLmFwcGx5KHZvaWQgMCwgW3ZhbHVlR2V0dGVyKHZhbHVlKSwgdmFsdWVdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoa2V5UGF0aCkpKSkpO1xufTtcblxuSlNPTlZhbHVlTm9kZS5wcm9wVHlwZXMgPSB7XG4gIG5vZGVUeXBlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIHN0eWxpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGxhYmVsUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGtleVBhdGg6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKS5pc1JlcXVpcmVkKS5pc1JlcXVpcmVkLFxuICB2YWx1ZVJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICB2YWx1ZTogUHJvcFR5cGVzLmFueSxcbiAgdmFsdWVHZXR0ZXI6IFByb3BUeXBlcy5mdW5jXG59O1xuZXhwb3J0IGRlZmF1bHQgSlNPTlZhbHVlTm9kZTsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IGNyZWF0ZVN0eWxpbmcgfSBmcm9tICdyZWFjdC1iYXNlMTYtc3R5bGluZyc7XG5pbXBvcnQgc29sYXJpemVkIGZyb20gJy4vdGhlbWVzL3NvbGFyaXplZCc7XG5cbnZhciBjb2xvck1hcCA9IGZ1bmN0aW9uIGNvbG9yTWFwKHRoZW1lKSB7XG4gIHJldHVybiB7XG4gICAgQkFDS0dST1VORF9DT0xPUjogdGhlbWUuYmFzZTAwLFxuICAgIFRFWFRfQ09MT1I6IHRoZW1lLmJhc2UwNyxcbiAgICBTVFJJTkdfQ09MT1I6IHRoZW1lLmJhc2UwQixcbiAgICBEQVRFX0NPTE9SOiB0aGVtZS5iYXNlMEIsXG4gICAgTlVNQkVSX0NPTE9SOiB0aGVtZS5iYXNlMDksXG4gICAgQk9PTEVBTl9DT0xPUjogdGhlbWUuYmFzZTA5LFxuICAgIE5VTExfQ09MT1I6IHRoZW1lLmJhc2UwOCxcbiAgICBVTkRFRklORURfQ09MT1I6IHRoZW1lLmJhc2UwOCxcbiAgICBGVU5DVElPTl9DT0xPUjogdGhlbWUuYmFzZTA4LFxuICAgIFNZTUJPTF9DT0xPUjogdGhlbWUuYmFzZTA4LFxuICAgIExBQkVMX0NPTE9SOiB0aGVtZS5iYXNlMEQsXG4gICAgQVJST1dfQ09MT1I6IHRoZW1lLmJhc2UwRCxcbiAgICBJVEVNX1NUUklOR19DT0xPUjogdGhlbWUuYmFzZTBCLFxuICAgIElURU1fU1RSSU5HX0VYUEFOREVEX0NPTE9SOiB0aGVtZS5iYXNlMDNcbiAgfTtcbn07XG5cbnZhciB2YWx1ZUNvbG9yTWFwID0gZnVuY3Rpb24gdmFsdWVDb2xvck1hcChjb2xvcnMpIHtcbiAgcmV0dXJuIHtcbiAgICBTdHJpbmc6IGNvbG9ycy5TVFJJTkdfQ09MT1IsXG4gICAgRGF0ZTogY29sb3JzLkRBVEVfQ09MT1IsXG4gICAgTnVtYmVyOiBjb2xvcnMuTlVNQkVSX0NPTE9SLFxuICAgIEJvb2xlYW46IGNvbG9ycy5CT09MRUFOX0NPTE9SLFxuICAgIE51bGw6IGNvbG9ycy5OVUxMX0NPTE9SLFxuICAgIFVuZGVmaW5lZDogY29sb3JzLlVOREVGSU5FRF9DT0xPUixcbiAgICBGdW5jdGlvbjogY29sb3JzLkZVTkNUSU9OX0NPTE9SLFxuICAgIFN5bWJvbDogY29sb3JzLlNZTUJPTF9DT0xPUlxuICB9O1xufTtcblxudmFyIGdldERlZmF1bHRUaGVtZVN0eWxpbmcgPSBmdW5jdGlvbiBnZXREZWZhdWx0VGhlbWVTdHlsaW5nKHRoZW1lKSB7XG4gIHZhciBjb2xvcnMgPSBjb2xvck1hcCh0aGVtZSk7XG4gIHJldHVybiB7XG4gICAgdHJlZToge1xuICAgICAgYm9yZGVyOiAwLFxuICAgICAgcGFkZGluZzogMCxcbiAgICAgIG1hcmdpblRvcDogJzAuNWVtJyxcbiAgICAgIG1hcmdpbkJvdHRvbTogJzAuNWVtJyxcbiAgICAgIG1hcmdpbkxlZnQ6ICcwLjEyNWVtJyxcbiAgICAgIG1hcmdpblJpZ2h0OiAwLFxuICAgICAgbGlzdFN0eWxlOiAnbm9uZScsXG4gICAgICBNb3pVc2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICBXZWJraXRVc2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9ycy5CQUNLR1JPVU5EX0NPTE9SXG4gICAgfSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoX3JlZiwgbm9kZVR5cGUsIGtleVBhdGgpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWYuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgcGFkZGluZ1RvcDogJzAuMjVlbScsXG4gICAgICAgICAgcGFkZGluZ1JpZ2h0OiAwLFxuICAgICAgICAgIG1hcmdpbkxlZnQ6ICcwLjg3NWVtJyxcbiAgICAgICAgICBXZWJraXRVc2VyU2VsZWN0OiAndGV4dCcsXG4gICAgICAgICAgTW96VXNlclNlbGVjdDogJ3RleHQnLFxuICAgICAgICAgIHdvcmRXcmFwOiAnYnJlYWstd29yZCcsXG4gICAgICAgICAgcGFkZGluZ0xlZnQ6IGtleVBhdGgubGVuZ3RoID4gMSA/ICcyLjEyNWVtJyA6ICcxLjI1ZW0nLFxuICAgICAgICAgIHRleHRJbmRlbnQ6ICctMC41ZW0nLFxuICAgICAgICAgIHdvcmRCcmVhazogJ2JyZWFrLWFsbCdcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBsYWJlbDoge1xuICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICBjb2xvcjogY29sb3JzLkxBQkVMX0NPTE9SXG4gICAgfSxcbiAgICB2YWx1ZUxhYmVsOiB7XG4gICAgICBtYXJnaW46ICcwIDAuNWVtIDAgMCdcbiAgICB9LFxuICAgIHZhbHVlVGV4dDogZnVuY3Rpb24gdmFsdWVUZXh0KF9yZWYyLCBub2RlVHlwZSkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjIuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgY29sb3I6IHZhbHVlQ29sb3JNYXAoY29sb3JzKVtub2RlVHlwZV1cbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBpdGVtUmFuZ2U6IGZ1bmN0aW9uIGl0ZW1SYW5nZShzdHlsaW5nLCBleHBhbmRlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBwYWRkaW5nVG9wOiBleHBhbmRlZCA/IDAgOiAnMC4yNWVtJyxcbiAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICBjb2xvcjogY29sb3JzLkxBQkVMX0NPTE9SXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICBhcnJvdzogZnVuY3Rpb24gYXJyb3coX3JlZjMsIG5vZGVUeXBlLCBleHBhbmRlZCkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjMuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgbWFyZ2luTGVmdDogMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAnMTUwbXMnLFxuICAgICAgICAgIFdlYmtpdFRyYW5zaXRpb246ICcxNTBtcycsXG4gICAgICAgICAgTW96VHJhbnNpdGlvbjogJzE1MG1zJyxcbiAgICAgICAgICBXZWJraXRUcmFuc2Zvcm06IGV4cGFuZGVkID8gJ3JvdGF0ZVooOTBkZWcpJyA6ICdyb3RhdGVaKDBkZWcpJyxcbiAgICAgICAgICBNb3pUcmFuc2Zvcm06IGV4cGFuZGVkID8gJ3JvdGF0ZVooOTBkZWcpJyA6ICdyb3RhdGVaKDBkZWcpJyxcbiAgICAgICAgICB0cmFuc2Zvcm06IGV4cGFuZGVkID8gJ3JvdGF0ZVooOTBkZWcpJyA6ICdyb3RhdGVaKDBkZWcpJyxcbiAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICc0NSUgNTAlJyxcbiAgICAgICAgICBXZWJraXRUcmFuc2Zvcm1PcmlnaW46ICc0NSUgNTAlJyxcbiAgICAgICAgICBNb3pUcmFuc2Zvcm1PcmlnaW46ICc0NSUgNTAlJyxcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICBsaW5lSGVpZ2h0OiAnMS4xZW0nLFxuICAgICAgICAgIGZvbnRTaXplOiAnMC43NWVtJ1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIGFycm93Q29udGFpbmVyOiBmdW5jdGlvbiBhcnJvd0NvbnRhaW5lcihfcmVmNCwgYXJyb3dTdHlsZSkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjQuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgcGFkZGluZ1JpZ2h0OiAnMC41ZW0nLFxuICAgICAgICAgIHBhZGRpbmdMZWZ0OiBhcnJvd1N0eWxlID09PSAnZG91YmxlJyA/ICcxZW0nIDogMCxcbiAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIGFycm93U2lnbjoge1xuICAgICAgY29sb3I6IGNvbG9ycy5BUlJPV19DT0xPUlxuICAgIH0sXG4gICAgYXJyb3dTaWduSW5uZXI6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdG9wOiAwLFxuICAgICAgbGVmdDogJy0wLjRlbSdcbiAgICB9LFxuICAgIG5lc3RlZE5vZGU6IGZ1bmN0aW9uIG5lc3RlZE5vZGUoX3JlZjUsIGtleVBhdGgsIG5vZGVUeXBlLCBleHBhbmRlZCwgZXhwYW5kYWJsZSkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjUuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgcGFkZGluZ1RvcDogJzAuMjVlbScsXG4gICAgICAgICAgbWFyZ2luTGVmdDoga2V5UGF0aC5sZW5ndGggPiAxID8gJzAuODc1ZW0nIDogMCxcbiAgICAgICAgICBwYWRkaW5nTGVmdDogIWV4cGFuZGFibGUgPyAnMS4xMjVlbScgOiAwXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sXG4gICAgcm9vdE5vZGU6IHtcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBtYXJnaW46IDBcbiAgICB9LFxuICAgIG5lc3RlZE5vZGVMYWJlbDogZnVuY3Rpb24gbmVzdGVkTm9kZUxhYmVsKF9yZWY2LCBrZXlQYXRoLCBub2RlVHlwZSwgZXhwYW5kZWQsIGV4cGFuZGFibGUpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWY2LnN0eWxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgIFdlYmtpdFVzZXJTZWxlY3Q6IGV4cGFuZGFibGUgPyAnaW5oZXJpdCcgOiAndGV4dCcsXG4gICAgICAgICAgTW96VXNlclNlbGVjdDogZXhwYW5kYWJsZSA/ICdpbmhlcml0JyA6ICd0ZXh0JyxcbiAgICAgICAgICBjdXJzb3I6IGV4cGFuZGFibGUgPyAncG9pbnRlcicgOiAnZGVmYXVsdCdcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBuZXN0ZWROb2RlSXRlbVN0cmluZzogZnVuY3Rpb24gbmVzdGVkTm9kZUl0ZW1TdHJpbmcoX3JlZjcsIGtleVBhdGgsIG5vZGVUeXBlLCBleHBhbmRlZCkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjcuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgcGFkZGluZ0xlZnQ6ICcwLjVlbScsXG4gICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCcsXG4gICAgICAgICAgY29sb3I6IGV4cGFuZGVkID8gY29sb3JzLklURU1fU1RSSU5HX0VYUEFOREVEX0NPTE9SIDogY29sb3JzLklURU1fU1RSSU5HX0NPTE9SXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sXG4gICAgbmVzdGVkTm9kZUl0ZW1UeXBlOiB7XG4gICAgICBtYXJnaW5MZWZ0OiAnMC4zZW0nLFxuICAgICAgbWFyZ2luUmlnaHQ6ICcwLjNlbSdcbiAgICB9LFxuICAgIG5lc3RlZE5vZGVDaGlsZHJlbjogZnVuY3Rpb24gbmVzdGVkTm9kZUNoaWxkcmVuKF9yZWY4LCBub2RlVHlwZSwgZXhwYW5kZWQpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWY4LnN0eWxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICAgIGxpc3RTdHlsZTogJ25vbmUnLFxuICAgICAgICAgIGRpc3BsYXk6IGV4cGFuZGVkID8gJ2Jsb2NrJyA6ICdub25lJ1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIHJvb3ROb2RlQ2hpbGRyZW46IHtcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBtYXJnaW46IDAsXG4gICAgICBsaXN0U3R5bGU6ICdub25lJ1xuICAgIH1cbiAgfTtcbn07XG5cbnZhciBjcmVhdGVTdHlsaW5nRnJvbVRoZW1lID0gY3JlYXRlU3R5bGluZyhnZXREZWZhdWx0VGhlbWVTdHlsaW5nLCB7XG4gIGRlZmF1bHRCYXNlMTY6IHNvbGFyaXplZFxufSk7XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVTdHlsaW5nRnJvbVRoZW1lOyIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIjtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0ID0gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0gfHwgb1tcIkBAaXRlcmF0b3JcIl07IGlmICghaXQpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gaXQuY2FsbChvKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdC5yZXR1cm4gIT0gbnVsbCkgaXQucmV0dXJuKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBnZXRMZW5ndGgodHlwZSwgY29sbGVjdGlvbikge1xuICBpZiAodHlwZSA9PT0gJ09iamVjdCcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb2xsZWN0aW9uKS5sZW5ndGg7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0FycmF5Jykge1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBJbmZpbml0eTtcbn1cblxuZnVuY3Rpb24gaXNJdGVyYWJsZU1hcChjb2xsZWN0aW9uKSB7XG4gIHJldHVybiB0eXBlb2YgY29sbGVjdGlvbi5zZXQgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGdldEVudHJpZXModHlwZSwgY29sbGVjdGlvbiwgc29ydE9iamVjdEtleXMpIHtcbiAgdmFyIGZyb20gPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IDA7XG4gIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogSW5maW5pdHk7XG4gIHZhciByZXM7XG5cbiAgaWYgKHR5cGUgPT09ICdPYmplY3QnKSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjb2xsZWN0aW9uKTtcblxuICAgIGlmIChzb3J0T2JqZWN0S2V5cykge1xuICAgICAga2V5cy5zb3J0KHNvcnRPYmplY3RLZXlzID09PSB0cnVlID8gdW5kZWZpbmVkIDogc29ydE9iamVjdEtleXMpO1xuICAgIH1cblxuICAgIGtleXMgPSBrZXlzLnNsaWNlKGZyb20sIHRvICsgMSk7XG4gICAgcmVzID0ge1xuICAgICAgZW50cmllczoga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHZhbHVlOiBjb2xsZWN0aW9uW2tleV1cbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnQXJyYXknKSB7XG4gICAgcmVzID0ge1xuICAgICAgZW50cmllczogY29sbGVjdGlvbi5zbGljZShmcm9tLCB0byArIDEpLm1hcChmdW5jdGlvbiAodmFsLCBpZHgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBrZXk6IGlkeCArIGZyb20sXG4gICAgICAgICAgdmFsdWU6IHZhbFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHZhciBpZHggPSAwO1xuICAgIHZhciBlbnRyaWVzID0gW107XG4gICAgdmFyIGRvbmUgPSB0cnVlO1xuICAgIHZhciBpc01hcCA9IGlzSXRlcmFibGVNYXAoY29sbGVjdGlvbik7XG5cbiAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoY29sbGVjdGlvbiksXG4gICAgICAgIF9zdGVwO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBpdGVtID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgaWYgKGlkeCA+IHRvKSB7XG4gICAgICAgICAgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyb20gPD0gaWR4KSB7XG4gICAgICAgICAgaWYgKGlzTWFwICYmIEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbVswXSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGl0ZW1bMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiBpdGVtWzBdLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtWzFdXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiW2VudHJ5IFwiLmNvbmNhdChpZHgsIFwiXVwiKSxcbiAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgJ1trZXldJzogaXRlbVswXSxcbiAgICAgICAgICAgICAgICAgICdbdmFsdWVdJzogaXRlbVsxXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgICAgIGtleTogaWR4LFxuICAgICAgICAgICAgICB2YWx1ZTogaXRlbVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWR4Kys7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IuZigpO1xuICAgIH1cblxuICAgIHJlcyA9IHtcbiAgICAgIGhhc01vcmU6ICFkb25lLFxuICAgICAgZW50cmllczogZW50cmllc1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBnZXRSYW5nZXMoZnJvbSwgdG8sIGxpbWl0KSB7XG4gIHZhciByYW5nZXMgPSBbXTtcblxuICB3aGlsZSAodG8gLSBmcm9tID4gbGltaXQgKiBsaW1pdCkge1xuICAgIGxpbWl0ID0gbGltaXQgKiBsaW1pdDtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSBmcm9tOyBpIDw9IHRvOyBpICs9IGxpbWl0KSB7XG4gICAgcmFuZ2VzLnB1c2goe1xuICAgICAgZnJvbTogaSxcbiAgICAgIHRvOiBNYXRoLm1pbih0bywgaSArIGxpbWl0IC0gMSlcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByYW5nZXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbGxlY3Rpb25FbnRyaWVzKHR5cGUsIGNvbGxlY3Rpb24sIHNvcnRPYmplY3RLZXlzLCBsaW1pdCkge1xuICB2YXIgZnJvbSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogMDtcbiAgdmFyIHRvID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiBJbmZpbml0eTtcbiAgdmFyIGdldEVudHJpZXNCb3VuZCA9IGdldEVudHJpZXMuYmluZChudWxsLCB0eXBlLCBjb2xsZWN0aW9uLCBzb3J0T2JqZWN0S2V5cyk7XG5cbiAgaWYgKCFsaW1pdCkge1xuICAgIHJldHVybiBnZXRFbnRyaWVzQm91bmQoKS5lbnRyaWVzO1xuICB9XG5cbiAgdmFyIGlzU3Vic2V0ID0gdG8gPCBJbmZpbml0eTtcbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKHRvIC0gZnJvbSwgZ2V0TGVuZ3RoKHR5cGUsIGNvbGxlY3Rpb24pKTtcblxuICBpZiAodHlwZSAhPT0gJ0l0ZXJhYmxlJykge1xuICAgIGlmIChsZW5ndGggPD0gbGltaXQgfHwgbGltaXQgPCA3KSB7XG4gICAgICByZXR1cm4gZ2V0RW50cmllc0JvdW5kKGZyb20sIHRvKS5lbnRyaWVzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAobGVuZ3RoIDw9IGxpbWl0ICYmICFpc1N1YnNldCkge1xuICAgICAgcmV0dXJuIGdldEVudHJpZXNCb3VuZChmcm9tLCB0bykuZW50cmllcztcbiAgICB9XG4gIH1cblxuICB2YXIgbGltaXRlZEVudHJpZXM7XG5cbiAgaWYgKHR5cGUgPT09ICdJdGVyYWJsZScpIHtcbiAgICB2YXIgX2dldEVudHJpZXNCb3VuZCA9IGdldEVudHJpZXNCb3VuZChmcm9tLCBmcm9tICsgbGltaXQgLSAxKSxcbiAgICAgICAgaGFzTW9yZSA9IF9nZXRFbnRyaWVzQm91bmQuaGFzTW9yZSxcbiAgICAgICAgZW50cmllcyA9IF9nZXRFbnRyaWVzQm91bmQuZW50cmllcztcblxuICAgIGxpbWl0ZWRFbnRyaWVzID0gaGFzTW9yZSA/IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZW50cmllcyksIF90b0NvbnN1bWFibGVBcnJheShnZXRSYW5nZXMoZnJvbSArIGxpbWl0LCBmcm9tICsgMiAqIGxpbWl0IC0gMSwgbGltaXQpKSkgOiBlbnRyaWVzO1xuICB9IGVsc2Uge1xuICAgIGxpbWl0ZWRFbnRyaWVzID0gaXNTdWJzZXQgPyBnZXRSYW5nZXMoZnJvbSwgdG8sIGxpbWl0KSA6IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZ2V0RW50cmllc0JvdW5kKDAsIGxpbWl0IC0gNSkuZW50cmllcyksIF90b0NvbnN1bWFibGVBcnJheShnZXRSYW5nZXMobGltaXQgLSA0LCBsZW5ndGggLSA1LCBsaW1pdCkpLCBfdG9Db25zdW1hYmxlQXJyYXkoZ2V0RW50cmllc0JvdW5kKGxlbmd0aCAtIDQsIGxlbmd0aCAtIDEpLmVudHJpZXMpKTtcbiAgfVxuXG4gIHJldHVybiBsaW1pdGVkRW50cmllcztcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiZGF0YVwiLCBcImtleVBhdGhcIiwgXCJwb3N0cHJvY2Vzc1ZhbHVlXCIsIFwiaGlkZVJvb3RcIiwgXCJ0aGVtZVwiLCBcImludmVydFRoZW1lXCJdO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuLy8gRVM2ICsgaW5saW5lIHN0eWxlIHBvcnQgb2YgSlNPTlZpZXdlciBodHRwczovL2JpdGJ1Y2tldC5vcmcvZGF2ZXZlZGRlci9yZWFjdC1qc29uLXZpZXdlci9cbi8vIGFsbCBjcmVkaXRzIGFuZCBvcmlnaW5hbCBjb2RlIHRvIHRoZSBhdXRob3Jcbi8vIERhdmUgVmVkZGVyIDx2ZWRkZXJtYXRpY0BnbWFpbC5jb20+IGh0dHA6Ly93d3cuZXNraW1vc3B5LmNvbS9cbi8vIHBvcnQgYnkgRGFuaWVsZSBaYW5ub3R0aSBodHRwOi8vd3d3LmdpdGh1Yi5jb20vZHphbm5vdHRpIDxkemFubm90dGlAbWUuY29tPlxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgSlNPTk5vZGUgZnJvbSAnLi9KU09OTm9kZSc7XG5pbXBvcnQgY3JlYXRlU3R5bGluZ0Zyb21UaGVtZSBmcm9tICcuL2NyZWF0ZVN0eWxpbmdGcm9tVGhlbWUnO1xuaW1wb3J0IHsgaW52ZXJ0VGhlbWUgfSBmcm9tICdyZWFjdC1iYXNlMTYtc3R5bGluZyc7XG5cbnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbnZhciBleHBhbmRSb290Tm9kZSA9IGZ1bmN0aW9uIGV4cGFuZFJvb3ROb2RlKGtleVBhdGgsIGRhdGEsIGxldmVsKSB7XG4gIHJldHVybiBsZXZlbCA9PT0gMDtcbn07XG5cbnZhciBkZWZhdWx0SXRlbVN0cmluZyA9IGZ1bmN0aW9uIGRlZmF1bHRJdGVtU3RyaW5nKHR5cGUsIGRhdGEsIGl0ZW1UeXBlLCBpdGVtU3RyaW5nKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgaXRlbVR5cGUsIFwiIFwiLCBpdGVtU3RyaW5nKTtcbn07XG5cbnZhciBkZWZhdWx0TGFiZWxSZW5kZXJlciA9IGZ1bmN0aW9uIGRlZmF1bHRMYWJlbFJlbmRlcmVyKF9yZWYpIHtcbiAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMSksXG4gICAgICBsYWJlbCA9IF9yZWYyWzBdO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgbGFiZWwsIFwiOlwiKTtcbn07XG5cbnZhciBub0N1c3RvbU5vZGUgPSBmdW5jdGlvbiBub0N1c3RvbU5vZGUoKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIGNoZWNrTGVnYWN5VGhlbWluZyh0aGVtZSwgcHJvcHMpIHtcbiAgdmFyIGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kc01hcCA9IHtcbiAgICBnZXRBcnJvd1N0eWxlOiAnYXJyb3cnLFxuICAgIGdldExpc3RTdHlsZTogJ25lc3RlZE5vZGVDaGlsZHJlbicsXG4gICAgZ2V0SXRlbVN0cmluZ1N0eWxlOiAnbmVzdGVkTm9kZUl0ZW1TdHJpbmcnLFxuICAgIGdldExhYmVsU3R5bGU6ICdsYWJlbCcsXG4gICAgZ2V0VmFsdWVTdHlsZTogJ3ZhbHVlVGV4dCdcbiAgfTtcbiAgdmFyIGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kcyA9IE9iamVjdC5rZXlzKGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kc01hcCkuZmlsdGVyKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHByb3BzW25hbWVdO1xuICB9KTtcblxuICBpZiAoZGVwcmVjYXRlZFN0eWxpbmdNZXRob2RzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAodHlwZW9mIHRoZW1lID09PSAnc3RyaW5nJykge1xuICAgICAgdGhlbWUgPSB7XG4gICAgICAgIGV4dGVuZDogdGhlbWVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoZW1lID0gX29iamVjdFNwcmVhZCh7fSwgdGhlbWUpO1xuICAgIH1cblxuICAgIGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihcIlN0eWxpbmcgbWV0aG9kIFxcXCJcIi5jb25jYXQobmFtZSwgXCJcXFwiIGlzIGRlcHJlY2F0ZWQsIHVzZSBcXFwidGhlbWVcXFwiIHByb3BlcnR5IGluc3RlYWRcIikpO1xuXG4gICAgICB0aGVtZVtkZXByZWNhdGVkU3R5bGluZ01ldGhvZHNNYXBbbmFtZV1dID0gZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgIHZhciBzdHlsZSA9IF9yZWYzLnN0eWxlO1xuXG4gICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCBwcm9wc1tuYW1lXS5hcHBseShwcm9wcywgYXJncykpXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRoZW1lO1xufVxuXG5mdW5jdGlvbiBnZXRTdGF0ZUZyb21Qcm9wcyhwcm9wcykge1xuICB2YXIgdGhlbWUgPSBjaGVja0xlZ2FjeVRoZW1pbmcocHJvcHMudGhlbWUsIHByb3BzKTtcblxuICBpZiAocHJvcHMuaW52ZXJ0VGhlbWUpIHtcbiAgICB0aGVtZSA9IGludmVydFRoZW1lKHRoZW1lKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3R5bGluZzogY3JlYXRlU3R5bGluZ0Zyb21UaGVtZSh0aGVtZSlcbiAgfTtcbn1cblxuZXhwb3J0IHZhciBKU09OVHJlZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoSlNPTlRyZWUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoSlNPTlRyZWUpO1xuXG4gIGZ1bmN0aW9uIEpTT05UcmVlKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEpTT05UcmVlKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuICAgIF90aGlzLnN0YXRlID0gZ2V0U3RhdGVGcm9tUHJvcHMocHJvcHMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhKU09OVHJlZSwgW3tcbiAgICBrZXk6IFwiVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKFsndGhlbWUnLCAnaW52ZXJ0VGhlbWUnXS5maW5kKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldHVybiBuZXh0UHJvcHNba10gIT09IF90aGlzMi5wcm9wc1trXTtcbiAgICAgIH0pKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoZ2V0U3RhdGVGcm9tUHJvcHMobmV4dFByb3BzKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgcmV0dXJuICEhT2JqZWN0LmtleXMobmV4dFByb3BzKS5maW5kKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldHVybiBrID09PSAna2V5UGF0aCcgPyBuZXh0UHJvcHNba10uam9pbignLycpICE9PSBfdGhpczMucHJvcHNba10uam9pbignLycpIDogbmV4dFByb3BzW2tdICE9PSBfdGhpczMucHJvcHNba107XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wcy5kYXRhLFxuICAgICAgICAgIGtleVBhdGggPSBfdGhpcyRwcm9wcy5rZXlQYXRoLFxuICAgICAgICAgIHBvc3Rwcm9jZXNzVmFsdWUgPSBfdGhpcyRwcm9wcy5wb3N0cHJvY2Vzc1ZhbHVlLFxuICAgICAgICAgIGhpZGVSb290ID0gX3RoaXMkcHJvcHMuaGlkZVJvb3QsXG4gICAgICAgICAgdGhlbWUgPSBfdGhpcyRwcm9wcy50aGVtZSxcbiAgICAgICAgICBfID0gX3RoaXMkcHJvcHMuaW52ZXJ0VGhlbWUsXG4gICAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdGhpcyRwcm9wcywgX2V4Y2x1ZGVkKTtcblxuICAgICAgdmFyIHN0eWxpbmcgPSB0aGlzLnN0YXRlLnN0eWxpbmc7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBzdHlsaW5nKCd0cmVlJyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05Ob2RlLCBfZXh0ZW5kcyh7fSwgX29iamVjdFNwcmVhZCh7XG4gICAgICAgIHBvc3Rwcm9jZXNzVmFsdWU6IHBvc3Rwcm9jZXNzVmFsdWUsXG4gICAgICAgIGhpZGVSb290OiBoaWRlUm9vdCxcbiAgICAgICAgc3R5bGluZzogc3R5bGluZ1xuICAgICAgfSwgcmVzdCksIHtcbiAgICAgICAga2V5UGF0aDogaGlkZVJvb3QgPyBbXSA6IGtleVBhdGgsXG4gICAgICAgIHZhbHVlOiBwb3N0cHJvY2Vzc1ZhbHVlKHZhbHVlKVxuICAgICAgfSkpKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSlNPTlRyZWU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKU09OVHJlZSwgXCJwcm9wVHlwZXNcIiwge1xuICBkYXRhOiBQcm9wVHlwZXMuYW55LFxuICBoaWRlUm9vdDogUHJvcFR5cGVzLmJvb2wsXG4gIHRoZW1lOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuc3RyaW5nXSksXG4gIGludmVydFRoZW1lOiBQcm9wVHlwZXMuYm9vbCxcbiAga2V5UGF0aDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pKSxcbiAgcG9zdHByb2Nlc3NWYWx1ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIHNvcnRPYmplY3RLZXlzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLmJvb2xdKVxufSk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKU09OVHJlZSwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBzaG91bGRFeHBhbmROb2RlOiBleHBhbmRSb290Tm9kZSxcbiAgaGlkZVJvb3Q6IGZhbHNlLFxuICBrZXlQYXRoOiBbJ3Jvb3QnXSxcbiAgZ2V0SXRlbVN0cmluZzogZGVmYXVsdEl0ZW1TdHJpbmcsXG4gIGxhYmVsUmVuZGVyZXI6IGRlZmF1bHRMYWJlbFJlbmRlcmVyLFxuICB2YWx1ZVJlbmRlcmVyOiBpZGVudGl0eSxcbiAgcG9zdHByb2Nlc3NWYWx1ZTogaWRlbnRpdHksXG4gIGlzQ3VzdG9tTm9kZTogbm9DdXN0b21Ob2RlLFxuICBjb2xsZWN0aW9uTGltaXQ6IDUwLFxuICBpbnZlcnRUaGVtZTogdHJ1ZVxufSk7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb2JqVHlwZShvYmopIHtcbiAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKS5zbGljZSg4LCAtMSk7XG5cbiAgaWYgKHR5cGUgPT09ICdPYmplY3QnICYmIHR5cGVvZiBvYmpbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiAnSXRlcmFibGUnO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09ICdDdXN0b20nICYmIG9iai5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIG9iaiBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgIC8vIEZvciBwcm9qZWN0cyBpbXBsZW1lbnRpbmcgb2JqZWN0cyBvdmVycmlkaW5nIGAucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ11gXG4gICAgcmV0dXJuICdPYmplY3QnO1xuICB9XG5cbiAgcmV0dXJuIHR5cGU7XG59IiwiZXhwb3J0IGRlZmF1bHQge1xuICBzY2hlbWU6ICdzb2xhcml6ZWQnLFxuICBhdXRob3I6ICdldGhhbiBzY2hvb25vdmVyIChodHRwOi8vZXRoYW5zY2hvb25vdmVyLmNvbS9zb2xhcml6ZWQpJyxcbiAgYmFzZTAwOiAnIzAwMmIzNicsXG4gIGJhc2UwMTogJyMwNzM2NDInLFxuICBiYXNlMDI6ICcjNTg2ZTc1JyxcbiAgYmFzZTAzOiAnIzY1N2I4MycsXG4gIGJhc2UwNDogJyM4Mzk0OTYnLFxuICBiYXNlMDU6ICcjOTNhMWExJyxcbiAgYmFzZTA2OiAnI2VlZThkNScsXG4gIGJhc2UwNzogJyNmZGY2ZTMnLFxuICBiYXNlMDg6ICcjZGMzMjJmJyxcbiAgYmFzZTA5OiAnI2NiNGIxNicsXG4gIGJhc2UwQTogJyNiNTg5MDAnLFxuICBiYXNlMEI6ICcjODU5OTAwJyxcbiAgYmFzZTBDOiAnIzJhYTE5OCcsXG4gIGJhc2UwRDogJyMyNjhiZDInLFxuICBiYXNlMEU6ICcjNmM3MWM0JyxcbiAgYmFzZTBGOiAnI2QzMzY4Midcbn07IiwiaW1wb3J0IGludmFyaWFudCBmcm9tICdpbnZhcmlhbnQnO1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi91dGlscy9pc0Z1bmN0aW9uJztcbmltcG9ydCBpZGVudGl0eSBmcm9tICcuL3V0aWxzL2lkZW50aXR5JztcbmltcG9ydCBpc051bGwgZnJvbSAnLi91dGlscy9pc051bGwnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlQWN0aW9uKHR5cGUsIHBheWxvYWRDcmVhdG9yLCBtZXRhQ3JlYXRvcikge1xuICBpZiAocGF5bG9hZENyZWF0b3IgPT09IHZvaWQgMCkge1xuICAgIHBheWxvYWRDcmVhdG9yID0gaWRlbnRpdHk7XG4gIH1cblxuICBpbnZhcmlhbnQoaXNGdW5jdGlvbihwYXlsb2FkQ3JlYXRvcikgfHwgaXNOdWxsKHBheWxvYWRDcmVhdG9yKSwgJ0V4cGVjdGVkIHBheWxvYWRDcmVhdG9yIHRvIGJlIGEgZnVuY3Rpb24sIHVuZGVmaW5lZCBvciBudWxsJyk7XG4gIHZhciBmaW5hbFBheWxvYWRDcmVhdG9yID0gaXNOdWxsKHBheWxvYWRDcmVhdG9yKSB8fCBwYXlsb2FkQ3JlYXRvciA9PT0gaWRlbnRpdHkgPyBpZGVudGl0eSA6IGZ1bmN0aW9uIChoZWFkKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWQgaW5zdGFuY2VvZiBFcnJvciA/IGhlYWQgOiBwYXlsb2FkQ3JlYXRvci5hcHBseSh2b2lkIDAsIFtoZWFkXS5jb25jYXQoYXJncykpO1xuICB9O1xuICB2YXIgaGFzTWV0YSA9IGlzRnVuY3Rpb24obWV0YUNyZWF0b3IpO1xuICB2YXIgdHlwZVN0cmluZyA9IHR5cGUudG9TdHJpbmcoKTtcblxuICB2YXIgYWN0aW9uQ3JlYXRvciA9IGZ1bmN0aW9uIGFjdGlvbkNyZWF0b3IoKSB7XG4gICAgdmFyIHBheWxvYWQgPSBmaW5hbFBheWxvYWRDcmVhdG9yLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICB2YXIgYWN0aW9uID0ge1xuICAgICAgdHlwZTogdHlwZVxuICAgIH07XG5cbiAgICBpZiAocGF5bG9hZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBhY3Rpb24uZXJyb3IgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwYXlsb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFjdGlvbi5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICB9XG5cbiAgICBpZiAoaGFzTWV0YSkge1xuICAgICAgYWN0aW9uLm1ldGEgPSBtZXRhQ3JlYXRvci5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvbjtcbiAgfTtcblxuICBhY3Rpb25DcmVhdG9yLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0eXBlU3RyaW5nO1xuICB9O1xuXG4gIHJldHVybiBhY3Rpb25DcmVhdG9yO1xufSIsImV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufSk7IiwiZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufSk7IiwiZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG59KTsiLCIvKiogQSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBwb3RlbnRpYWwgXCJleHRyYSBhcmd1bWVudFwiIHZhbHVlIHRvIGJlIGluamVjdGVkIGxhdGVyLFxyXG4gKiBhbmQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgdGh1bmsgbWlkZGxld2FyZSB0aGF0IHVzZXMgdGhhdCB2YWx1ZVxyXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVRodW5rTWlkZGxld2FyZShleHRyYUFyZ3VtZW50KSB7XG4gIC8vIFN0YW5kYXJkIFJlZHV4IG1pZGRsZXdhcmUgZGVmaW5pdGlvbiBwYXR0ZXJuOlxuICAvLyBTZWU6IGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI3dyaXRpbmctY3VzdG9tLW1pZGRsZXdhcmVcbiAgdmFyIG1pZGRsZXdhcmUgPSBmdW5jdGlvbiBtaWRkbGV3YXJlKF9yZWYpIHtcbiAgICB2YXIgZGlzcGF0Y2ggPSBfcmVmLmRpc3BhdGNoLFxuICAgICAgICBnZXRTdGF0ZSA9IF9yZWYuZ2V0U3RhdGU7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICAvLyBUaGUgdGh1bmsgbWlkZGxld2FyZSBsb29rcyBmb3IgYW55IGZ1bmN0aW9ucyB0aGF0IHdlcmUgcGFzc2VkIHRvIGBzdG9yZS5kaXNwYXRjaGAuXG4gICAgICAgIC8vIElmIHRoaXMgXCJhY3Rpb25cIiBpcyByZWFsbHkgYSBmdW5jdGlvbiwgY2FsbCBpdCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuXG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gSW5qZWN0IHRoZSBzdG9yZSdzIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgbWV0aG9kcywgYXMgd2VsbCBhcyBhbnkgXCJleHRyYSBhcmdcIlxuICAgICAgICAgIHJldHVybiBhY3Rpb24oZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYUFyZ3VtZW50KTtcbiAgICAgICAgfSAvLyBPdGhlcndpc2UsIHBhc3MgdGhlIGFjdGlvbiBkb3duIHRoZSBtaWRkbGV3YXJlIGNoYWluIGFzIHVzdWFsXG5cblxuICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiBtaWRkbGV3YXJlO1xufVxuXG52YXIgdGh1bmsgPSBjcmVhdGVUaHVua01pZGRsZXdhcmUoKTsgLy8gQXR0YWNoIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIHNvIHVzZXJzIGNhbiBjcmVhdGUgYSBjdXN0b21pemVkIHZlcnNpb25cbi8vIHdpdGggd2hhdGV2ZXIgXCJleHRyYSBhcmdcIiB0aGV5IHdhbnQgdG8gaW5qZWN0IGludG8gdGhlaXIgdGh1bmtzXG5cbnRodW5rLndpdGhFeHRyYUFyZ3VtZW50ID0gY3JlYXRlVGh1bmtNaWRkbGV3YXJlO1xuZXhwb3J0IGRlZmF1bHQgdGh1bms7IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMic7XG5cbi8qKlxuICogQWRhcHRlZCBmcm9tIFJlYWN0OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2hhcmVkL2Zvcm1hdFByb2RFcnJvck1lc3NhZ2UuanNcbiAqXG4gKiBEbyBub3QgcmVxdWlyZSB0aGlzIG1vZHVsZSBkaXJlY3RseSEgVXNlIG5vcm1hbCB0aHJvdyBlcnJvciBjYWxscy4gVGhlc2UgbWVzc2FnZXMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGVycm9yIGNvZGVzXG4gKiBkdXJpbmcgYnVpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gY29kZVxuICovXG5mdW5jdGlvbiBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKGNvZGUpIHtcbiAgcmV0dXJuIFwiTWluaWZpZWQgUmVkdXggZXJyb3IgI1wiICsgY29kZSArIFwiOyB2aXNpdCBodHRwczovL3JlZHV4LmpzLm9yZy9FcnJvcnM/Y29kZT1cIiArIGNvZGUgKyBcIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciBcIiArICd1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzLiAnO1xufVxuXG4vLyBJbmxpbmVkIHZlcnNpb24gb2YgdGhlIGBzeW1ib2wtb2JzZXJ2YWJsZWAgcG9seWZpbGxcbnZhciAkJG9ic2VydmFibGUgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wub2JzZXJ2YWJsZSB8fCAnQEBvYnNlcnZhYmxlJztcbn0pKCk7XG5cbi8qKlxuICogVGhlc2UgYXJlIHByaXZhdGUgYWN0aW9uIHR5cGVzIHJlc2VydmVkIGJ5IFJlZHV4LlxuICogRm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqIElmIHRoZSBjdXJyZW50IHN0YXRlIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLlxuICogRG8gbm90IHJlZmVyZW5jZSB0aGVzZSBhY3Rpb24gdHlwZXMgZGlyZWN0bHkgaW4geW91ciBjb2RlLlxuICovXG52YXIgcmFuZG9tU3RyaW5nID0gZnVuY3Rpb24gcmFuZG9tU3RyaW5nKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyk7XG59O1xuXG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6IFwiQEByZWR1eC9JTklUXCIgKyByYW5kb21TdHJpbmcoKSxcbiAgUkVQTEFDRTogXCJAQHJlZHV4L1JFUExBQ0VcIiArIHJhbmRvbVN0cmluZygpLFxuICBQUk9CRV9VTktOT1dOX0FDVElPTjogZnVuY3Rpb24gUFJPQkVfVU5LTk9XTl9BQ1RJT04oKSB7XG4gICAgcmV0dXJuIFwiQEByZWR1eC9QUk9CRV9VTktOT1dOX0FDVElPTlwiICsgcmFuZG9tU3RyaW5nKCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICB2YXIgcHJvdG8gPSBvYmo7XG5cbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IHByb3RvO1xufVxuXG4vLyBJbmxpbmVkIC8gc2hvcnRlbmVkIHZlcnNpb24gb2YgYGtpbmRPZmAgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9raW5kLW9mXG5mdW5jdGlvbiBtaW5pS2luZE9mKHZhbCkge1xuICBpZiAodmFsID09PSB2b2lkIDApIHJldHVybiAndW5kZWZpbmVkJztcbiAgaWYgKHZhbCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzeW1ib2wnOlxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gJ2FycmF5JztcbiAgaWYgKGlzRGF0ZSh2YWwpKSByZXR1cm4gJ2RhdGUnO1xuICBpZiAoaXNFcnJvcih2YWwpKSByZXR1cm4gJ2Vycm9yJztcbiAgdmFyIGNvbnN0cnVjdG9yTmFtZSA9IGN0b3JOYW1lKHZhbCk7XG5cbiAgc3dpdGNoIChjb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICBjYXNlICdTeW1ib2wnOlxuICAgIGNhc2UgJ1Byb21pc2UnOlxuICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgIGNhc2UgJ01hcCc6XG4gICAgY2FzZSAnU2V0JzpcbiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck5hbWU7XG4gIH0gLy8gb3RoZXJcblxuXG4gIHJldHVybiB0eXBlLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGN0b3JOYW1lKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyA/IHZhbC5jb25zdHJ1Y3Rvci5uYW1lIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNFcnJvcih2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiB2YWwubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgdmFsLmNvbnN0cnVjdG9yICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3Iuc3RhY2tUcmFjZUxpbWl0ID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiB0eXBlb2YgdmFsLnRvRGF0ZVN0cmluZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsLmdldERhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbC5zZXREYXRlID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBraW5kT2YodmFsKSB7XG4gIHZhciB0eXBlT2ZWYWwgPSB0eXBlb2YgdmFsO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdHlwZU9mVmFsID0gbWluaUtpbmRPZih2YWwpO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVPZlZhbDtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICpcbiAqICoqV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBgY29uZmlndXJlU3RvcmVgIG1ldGhvZFxuICogb2YgdGhlIGBAcmVkdXhqcy90b29sa2l0YCBwYWNrYWdlKiosIHdoaWNoIHJlcGxhY2VzIGBjcmVhdGVTdG9yZWAuXG4gKlxuICogUmVkdXggVG9vbGtpdCBpcyBvdXIgcmVjb21tZW5kZWQgYXBwcm9hY2ggZm9yIHdyaXRpbmcgUmVkdXggbG9naWMgdG9kYXksXG4gKiBpbmNsdWRpbmcgc3RvcmUgc2V0dXAsIHJlZHVjZXJzLCBkYXRhIGZldGNoaW5nLCBhbmQgbW9yZS5cbiAqXG4gKiAqKkZvciBtb3JlIGRldGFpbHMsIHBsZWFzZSByZWFkIHRoaXMgUmVkdXggZG9jcyBwYWdlOioqXG4gKiAqKmh0dHBzOi8vcmVkdXguanMub3JnL2ludHJvZHVjdGlvbi93aHktcnRrLWlzLXJlZHV4LXRvZGF5KipcbiAqXG4gKiBgY29uZmlndXJlU3RvcmVgIGZyb20gUmVkdXggVG9vbGtpdCBpcyBhbiBpbXByb3ZlZCB2ZXJzaW9uIG9mIGBjcmVhdGVTdG9yZWAgdGhhdFxuICogc2ltcGxpZmllcyBzZXR1cCBhbmQgaGVscHMgYXZvaWQgY29tbW9uIGJ1Z3MuXG4gKlxuICogWW91IHNob3VsZCBub3QgYmUgdXNpbmcgdGhlIGByZWR1eGAgY29yZSBwYWNrYWdlIGJ5IGl0c2VsZiB0b2RheSwgZXhjZXB0IGZvciBsZWFybmluZyBwdXJwb3Nlcy5cbiAqIFRoZSBgY3JlYXRlU3RvcmVgIG1ldGhvZCBmcm9tIHRoZSBjb3JlIGByZWR1eGAgcGFja2FnZSB3aWxsIG5vdCBiZSByZW1vdmVkLCBidXQgd2UgZW5jb3VyYWdlXG4gKiBhbGwgdXNlcnMgdG8gbWlncmF0ZSB0byB1c2luZyBSZWR1eCBUb29sa2l0IGZvciBhbGwgUmVkdXggY29kZS5cbiAqXG4gKiBJZiB5b3Ugd2FudCB0byB1c2UgYGNyZWF0ZVN0b3JlYCB3aXRob3V0IHRoaXMgdmlzdWFsIGRlcHJlY2F0aW9uIHdhcm5pbmcsIHVzZVxuICogdGhlIGBsZWdhY3lfY3JlYXRlU3RvcmVgIGltcG9ydCBpbnN0ZWFkOlxuICpcbiAqIGBpbXBvcnQgeyBsZWdhY3lfY3JlYXRlU3RvcmUgYXMgY3JlYXRlU3RvcmV9IGZyb20gJ3JlZHV4J2BcbiAqXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIHZhciBfcmVmMjtcblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZW5oYW5jZXIgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDApIDogJ0l0IGxvb2tzIGxpa2UgeW91IGFyZSBwYXNzaW5nIHNldmVyYWwgc3RvcmUgZW5oYW5jZXJzIHRvICcgKyAnY3JlYXRlU3RvcmUoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBjb21wb3NlIHRoZW0gJyArICd0b2dldGhlciB0byBhIHNpbmdsZSBmdW5jdGlvbi4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI2NyZWF0aW5nLWEtc3RvcmUtd2l0aC1lbmhhbmNlcnMgZm9yIGFuIGV4YW1wbGUuJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBlbmhhbmNlciA9IHByZWxvYWRlZFN0YXRlO1xuICAgIHByZWxvYWRlZFN0YXRlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxKSA6IFwiRXhwZWN0ZWQgdGhlIGVuaGFuY2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YoZW5oYW5jZXIpICsgXCInXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlcihjcmVhdGVTdG9yZSkocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMikgOiBcIkV4cGVjdGVkIHRoZSByb290IHJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihyZWR1Y2VyKSArIFwiJ1wiKTtcbiAgfVxuXG4gIHZhciBjdXJyZW50UmVkdWNlciA9IHJlZHVjZXI7XG4gIHZhciBjdXJyZW50U3RhdGUgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgdmFyIGN1cnJlbnRMaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzO1xuICB2YXIgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAvKipcbiAgICogVGhpcyBtYWtlcyBhIHNoYWxsb3cgY29weSBvZiBjdXJyZW50TGlzdGVuZXJzIHNvIHdlIGNhbiB1c2VcbiAgICogbmV4dExpc3RlbmVycyBhcyBhIHRlbXBvcmFyeSBsaXN0IHdoaWxlIGRpc3BhdGNoaW5nLlxuICAgKlxuICAgKiBUaGlzIHByZXZlbnRzIGFueSBidWdzIGFyb3VuZCBjb25zdW1lcnMgY2FsbGluZ1xuICAgKiBzdWJzY3JpYmUvdW5zdWJzY3JpYmUgaW4gdGhlIG1pZGRsZSBvZiBhIGRpc3BhdGNoLlxuICAgKi9cblxuICBmdW5jdGlvbiBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCkge1xuICAgIGlmIChuZXh0TGlzdGVuZXJzID09PSBjdXJyZW50TGlzdGVuZXJzKSB7XG4gICAgICBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycy5zbGljZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVhZHMgdGhlIHN0YXRlIHRyZWUgbWFuYWdlZCBieSB0aGUgc3RvcmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSBjdXJyZW50IHN0YXRlIHRyZWUgb2YgeW91ciBhcHBsaWNhdGlvbi5cbiAgICovXG5cblxuICBmdW5jdGlvbiBnZXRTdGF0ZSgpIHtcbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMykgOiAnWW91IG1heSBub3QgY2FsbCBzdG9yZS5nZXRTdGF0ZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdUaGUgcmVkdWNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCB0aGUgc3RhdGUgYXMgYW4gYXJndW1lbnQuICcgKyAnUGFzcyBpdCBkb3duIGZyb20gdGhlIHRvcCByZWR1Y2VyIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tIHRoZSBzdG9yZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFN0YXRlO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgY2hhbmdlIGxpc3RlbmVyLiBJdCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSBhbiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCxcbiAgICogYW5kIHNvbWUgcGFydCBvZiB0aGUgc3RhdGUgdHJlZSBtYXkgcG90ZW50aWFsbHkgaGF2ZSBjaGFuZ2VkLiBZb3UgbWF5IHRoZW5cbiAgICogY2FsbCBgZ2V0U3RhdGUoKWAgdG8gcmVhZCB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFlvdSBtYXkgY2FsbCBgZGlzcGF0Y2goKWAgZnJvbSBhIGNoYW5nZSBsaXN0ZW5lciwgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAqIGNhdmVhdHM6XG4gICAqXG4gICAqIDEuIFRoZSBzdWJzY3JpcHRpb25zIGFyZSBzbmFwc2hvdHRlZCBqdXN0IGJlZm9yZSBldmVyeSBgZGlzcGF0Y2goKWAgY2FsbC5cbiAgICogSWYgeW91IHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSB3aGlsZSB0aGUgbGlzdGVuZXJzIGFyZSBiZWluZyBpbnZva2VkLCB0aGlzXG4gICAqIHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdCBvbiB0aGUgYGRpc3BhdGNoKClgIHRoYXQgaXMgY3VycmVudGx5IGluIHByb2dyZXNzLlxuICAgKiBIb3dldmVyLCB0aGUgbmV4dCBgZGlzcGF0Y2goKWAgY2FsbCwgd2hldGhlciBuZXN0ZWQgb3Igbm90LCB3aWxsIHVzZSBhIG1vcmVcbiAgICogcmVjZW50IHNuYXBzaG90IG9mIHRoZSBzdWJzY3JpcHRpb24gbGlzdC5cbiAgICpcbiAgICogMi4gVGhlIGxpc3RlbmVyIHNob3VsZCBub3QgZXhwZWN0IHRvIHNlZSBhbGwgc3RhdGUgY2hhbmdlcywgYXMgdGhlIHN0YXRlXG4gICAqIG1pZ2h0IGhhdmUgYmVlbiB1cGRhdGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBhIG5lc3RlZCBgZGlzcGF0Y2goKWAgYmVmb3JlXG4gICAqIHRoZSBsaXN0ZW5lciBpcyBjYWxsZWQuIEl0IGlzLCBob3dldmVyLCBndWFyYW50ZWVkIHRoYXQgYWxsIHN1YnNjcmliZXJzXG4gICAqIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBgZGlzcGF0Y2goKWAgc3RhcnRlZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBsYXRlc3RcbiAgICogc3RhdGUgYnkgdGhlIHRpbWUgaXQgZXhpdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBvbiBldmVyeSBkaXNwYXRjaC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGlzIGNoYW5nZSBsaXN0ZW5lci5cbiAgICovXG5cblxuICBmdW5jdGlvbiBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0KSA6IFwiRXhwZWN0ZWQgdGhlIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YobGlzdGVuZXIpICsgXCInXCIpO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg1KSA6ICdZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLnN1YnNjcmliZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdJZiB5b3Ugd291bGQgbGlrZSB0byBiZSBub3RpZmllZCBhZnRlciB0aGUgc3RvcmUgaGFzIGJlZW4gdXBkYXRlZCwgc3Vic2NyaWJlIGZyb20gYSAnICsgJ2NvbXBvbmVudCBhbmQgaW52b2tlIHN0b3JlLmdldFN0YXRlKCkgaW4gdGhlIGNhbGxiYWNrIHRvIGFjY2VzcyB0aGUgbGF0ZXN0IHN0YXRlLiAnICsgJ1NlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGkvc3RvcmUjc3Vic2NyaWJlbGlzdGVuZXIgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICB9XG5cbiAgICB2YXIgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgbmV4dExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICBpZiAoIWlzU3Vic2NyaWJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDYpIDogJ1lvdSBtYXkgbm90IHVuc3Vic2NyaWJlIGZyb20gYSBzdG9yZSBsaXN0ZW5lciB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICAgICAgfVxuXG4gICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICAgIHZhciBpbmRleCA9IG5leHRMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICBuZXh0TGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBjdXJyZW50TGlzdGVuZXJzID0gbnVsbDtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGFjdGlvbi4gSXQgaXMgdGhlIG9ubHkgd2F5IHRvIHRyaWdnZXIgYSBzdGF0ZSBjaGFuZ2UuXG4gICAqXG4gICAqIFRoZSBgcmVkdWNlcmAgZnVuY3Rpb24sIHVzZWQgdG8gY3JlYXRlIHRoZSBzdG9yZSwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcbiAgICogY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgZ2l2ZW4gYGFjdGlvbmAuIEl0cyByZXR1cm4gdmFsdWUgd2lsbFxuICAgKiBiZSBjb25zaWRlcmVkIHRoZSAqKm5leHQqKiBzdGF0ZSBvZiB0aGUgdHJlZSwgYW5kIHRoZSBjaGFuZ2UgbGlzdGVuZXJzXG4gICAqIHdpbGwgYmUgbm90aWZpZWQuXG4gICAqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgcGxhaW4gb2JqZWN0IGFjdGlvbnMuIElmIHlvdSB3YW50IHRvXG4gICAqIGRpc3BhdGNoIGEgUHJvbWlzZSwgYW4gT2JzZXJ2YWJsZSwgYSB0aHVuaywgb3Igc29tZXRoaW5nIGVsc2UsIHlvdSBuZWVkIHRvXG4gICAqIHdyYXAgeW91ciBzdG9yZSBjcmVhdGluZyBmdW5jdGlvbiBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIG1pZGRsZXdhcmUuIEZvclxuICAgKiBleGFtcGxlLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UuIEV2ZW4gdGhlXG4gICAqIG1pZGRsZXdhcmUgd2lsbCBldmVudHVhbGx5IGRpc3BhdGNoIHBsYWluIG9iamVjdCBhY3Rpb25zIHVzaW5nIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIEEgcGxhaW4gb2JqZWN0IHJlcHJlc2VudGluZyDigJx3aGF0IGNoYW5nZWTigJ0uIEl0IGlzXG4gICAqIGEgZ29vZCBpZGVhIHRvIGtlZXAgYWN0aW9ucyBzZXJpYWxpemFibGUgc28geW91IGNhbiByZWNvcmQgYW5kIHJlcGxheSB1c2VyXG4gICAqIHNlc3Npb25zLCBvciB1c2UgdGhlIHRpbWUgdHJhdmVsbGluZyBgcmVkdXgtZGV2dG9vbHNgLiBBbiBhY3Rpb24gbXVzdCBoYXZlXG4gICAqIGEgYHR5cGVgIHByb3BlcnR5IHdoaWNoIG1heSBub3QgYmUgYHVuZGVmaW5lZGAuIEl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZVxuICAgKiBzdHJpbmcgY29uc3RhbnRzIGZvciBhY3Rpb24gdHlwZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEZvciBjb252ZW5pZW5jZSwgdGhlIHNhbWUgYWN0aW9uIG9iamVjdCB5b3UgZGlzcGF0Y2hlZC5cbiAgICpcbiAgICogTm90ZSB0aGF0LCBpZiB5b3UgdXNlIGEgY3VzdG9tIG1pZGRsZXdhcmUsIGl0IG1heSB3cmFwIGBkaXNwYXRjaCgpYCB0b1xuICAgKiByZXR1cm4gc29tZXRoaW5nIGVsc2UgKGZvciBleGFtcGxlLCBhIFByb21pc2UgeW91IGNhbiBhd2FpdCkuXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDcpIDogXCJBY3Rpb25zIG11c3QgYmUgcGxhaW4gb2JqZWN0cy4gSW5zdGVhZCwgdGhlIGFjdHVhbCB0eXBlIHdhczogJ1wiICsga2luZE9mKGFjdGlvbikgKyBcIicuIFlvdSBtYXkgbmVlZCB0byBhZGQgbWlkZGxld2FyZSB0byB5b3VyIHN0b3JlIHNldHVwIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBvdGhlciB2YWx1ZXMsIHN1Y2ggYXMgJ3JlZHV4LXRodW5rJyB0byBoYW5kbGUgZGlzcGF0Y2hpbmcgZnVuY3Rpb25zLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTQtc3RvcmUjbWlkZGxld2FyZSBhbmQgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTYtYXN5bmMtbG9naWMjdXNpbmctdGhlLXJlZHV4LXRodW5rLW1pZGRsZXdhcmUgZm9yIGV4YW1wbGVzLlwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOCkgOiAnQWN0aW9ucyBtYXkgbm90IGhhdmUgYW4gdW5kZWZpbmVkIFwidHlwZVwiIHByb3BlcnR5LiBZb3UgbWF5IGhhdmUgbWlzc3BlbGxlZCBhbiBhY3Rpb24gdHlwZSBzdHJpbmcgY29uc3RhbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDkpIDogJ1JlZHVjZXJzIG1heSBub3QgZGlzcGF0Y2ggYWN0aW9ucy4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IHRydWU7XG4gICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50UmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycyA9IG5leHRMaXN0ZW5lcnM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgbGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgcmVkdWNlciBjdXJyZW50bHkgdXNlZCBieSB0aGUgc3RvcmUgdG8gY2FsY3VsYXRlIHRoZSBzdGF0ZS5cbiAgICpcbiAgICogWW91IG1pZ2h0IG5lZWQgdGhpcyBpZiB5b3VyIGFwcCBpbXBsZW1lbnRzIGNvZGUgc3BsaXR0aW5nIGFuZCB5b3Ugd2FudCB0b1xuICAgKiBsb2FkIHNvbWUgb2YgdGhlIHJlZHVjZXJzIGR5bmFtaWNhbGx5LiBZb3UgbWlnaHQgYWxzbyBuZWVkIHRoaXMgaWYgeW91XG4gICAqIGltcGxlbWVudCBhIGhvdCByZWxvYWRpbmcgbWVjaGFuaXNtIGZvciBSZWR1eC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dFJlZHVjZXIgVGhlIHJlZHVjZXIgZm9yIHRoZSBzdG9yZSB0byB1c2UgaW5zdGVhZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMCkgOiBcIkV4cGVjdGVkIHRoZSBuZXh0UmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKG5leHRSZWR1Y2VyKSk7XG4gICAgfVxuXG4gICAgY3VycmVudFJlZHVjZXIgPSBuZXh0UmVkdWNlcjsgLy8gVGhpcyBhY3Rpb24gaGFzIGEgc2ltaWxpYXIgZWZmZWN0IHRvIEFjdGlvblR5cGVzLklOSVQuXG4gICAgLy8gQW55IHJlZHVjZXJzIHRoYXQgZXhpc3RlZCBpbiBib3RoIHRoZSBuZXcgYW5kIG9sZCByb290UmVkdWNlclxuICAgIC8vIHdpbGwgcmVjZWl2ZSB0aGUgcHJldmlvdXMgc3RhdGUuIFRoaXMgZWZmZWN0aXZlbHkgcG9wdWxhdGVzXG4gICAgLy8gdGhlIG5ldyBzdGF0ZSB0cmVlIHdpdGggYW55IHJlbGV2YW50IGRhdGEgZnJvbSB0aGUgb2xkIG9uZS5cblxuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLlJFUExBQ0VcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogSW50ZXJvcGVyYWJpbGl0eSBwb2ludCBmb3Igb2JzZXJ2YWJsZS9yZWFjdGl2ZSBsaWJyYXJpZXMuXG4gICAqIEByZXR1cm5zIHtvYnNlcnZhYmxlfSBBIG1pbmltYWwgb2JzZXJ2YWJsZSBvZiBzdGF0ZSBjaGFuZ2VzLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBvYnNlcnZhYmxlIHByb3Bvc2FsOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYnNlcnZhYmxlXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBvdXRlclN1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICByZXR1cm4gX3JlZiA9IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG1pbmltYWwgb2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24gbWV0aG9kLlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVyIEFueSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBvYnNlcnZlci5cbiAgICAgICAqIFRoZSBvYnNlcnZlciBvYmplY3Qgc2hvdWxkIGhhdmUgYSBgbmV4dGAgbWV0aG9kLlxuICAgICAgICogQHJldHVybnMge3N1YnNjcmlwdGlvbn0gQW4gb2JqZWN0IHdpdGggYW4gYHVuc3Vic2NyaWJlYCBtZXRob2QgdGhhdCBjYW5cbiAgICAgICAqIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgZnJvbSB0aGUgc3RvcmUsIGFuZCBwcmV2ZW50IGZ1cnRoZXJcbiAgICAgICAqIGVtaXNzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBvYnNlcnZhYmxlLlxuICAgICAgICovXG4gICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgICAgICBpZiAodHlwZW9mIG9ic2VydmVyICE9PSAnb2JqZWN0JyB8fCBvYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDExKSA6IFwiRXhwZWN0ZWQgdGhlIG9ic2VydmVyIHRvIGJlIGFuIG9iamVjdC4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihvYnNlcnZlcikgKyBcIidcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvYnNlcnZlU3RhdGUoKSB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLm5leHQpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZVN0YXRlKCk7XG4gICAgICAgIHZhciB1bnN1YnNjcmliZSA9IG91dGVyU3Vic2NyaWJlKG9ic2VydmVTdGF0ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdW5zdWJzY3JpYmU6IHVuc3Vic2NyaWJlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwgX3JlZlskJG9ic2VydmFibGVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgX3JlZjtcbiAgfSAvLyBXaGVuIGEgc3RvcmUgaXMgY3JlYXRlZCwgYW4gXCJJTklUXCIgYWN0aW9uIGlzIGRpc3BhdGNoZWQgc28gdGhhdCBldmVyeVxuICAvLyByZWR1Y2VyIHJldHVybnMgdGhlaXIgaW5pdGlhbCBzdGF0ZS4gVGhpcyBlZmZlY3RpdmVseSBwb3B1bGF0ZXNcbiAgLy8gdGhlIGluaXRpYWwgc3RhdGUgdHJlZS5cblxuXG4gIGRpc3BhdGNoKHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5JTklUXG4gIH0pO1xuICByZXR1cm4gX3JlZjIgPSB7XG4gICAgZGlzcGF0Y2g6IGRpc3BhdGNoLFxuICAgIHN1YnNjcmliZTogc3Vic2NyaWJlLFxuICAgIGdldFN0YXRlOiBnZXRTdGF0ZSxcbiAgICByZXBsYWNlUmVkdWNlcjogcmVwbGFjZVJlZHVjZXJcbiAgfSwgX3JlZjJbJCRvYnNlcnZhYmxlXSA9IG9ic2VydmFibGUsIF9yZWYyO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgUmVkdXggc3RvcmUgdGhhdCBob2xkcyB0aGUgc3RhdGUgdHJlZS5cbiAqXG4gKiAqKldlIHJlY29tbWVuZCB1c2luZyBgY29uZmlndXJlU3RvcmVgIGZyb20gdGhlXG4gKiBgQHJlZHV4anMvdG9vbGtpdGAgcGFja2FnZSoqLCB3aGljaCByZXBsYWNlcyBgY3JlYXRlU3RvcmVgOlxuICogKipodHRwczovL3JlZHV4LmpzLm9yZy9pbnRyb2R1Y3Rpb24vd2h5LXJ0ay1pcy1yZWR1eC10b2RheSoqXG4gKlxuICogVGhlIG9ubHkgd2F5IHRvIGNoYW5nZSB0aGUgZGF0YSBpbiB0aGUgc3RvcmUgaXMgdG8gY2FsbCBgZGlzcGF0Y2goKWAgb24gaXQuXG4gKlxuICogVGhlcmUgc2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUgc3RvcmUgaW4geW91ciBhcHAuIFRvIHNwZWNpZnkgaG93IGRpZmZlcmVudFxuICogcGFydHMgb2YgdGhlIHN0YXRlIHRyZWUgcmVzcG9uZCB0byBhY3Rpb25zLCB5b3UgbWF5IGNvbWJpbmUgc2V2ZXJhbCByZWR1Y2Vyc1xuICogaW50byBhIHNpbmdsZSByZWR1Y2VyIGZ1bmN0aW9uIGJ5IHVzaW5nIGBjb21iaW5lUmVkdWNlcnNgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZHVjZXIgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG5leHQgc3RhdGUgdHJlZSwgZ2l2ZW5cbiAqIHRoZSBjdXJyZW50IHN0YXRlIHRyZWUgYW5kIHRoZSBhY3Rpb24gdG8gaGFuZGxlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBbcHJlbG9hZGVkU3RhdGVdIFRoZSBpbml0aWFsIHN0YXRlLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gaHlkcmF0ZSB0aGUgc3RhdGUgZnJvbSB0aGUgc2VydmVyIGluIHVuaXZlcnNhbCBhcHBzLCBvciB0byByZXN0b3JlIGFcbiAqIHByZXZpb3VzbHkgc2VyaWFsaXplZCB1c2VyIHNlc3Npb24uXG4gKiBJZiB5b3UgdXNlIGBjb21iaW5lUmVkdWNlcnNgIHRvIHByb2R1Y2UgdGhlIHJvb3QgcmVkdWNlciBmdW5jdGlvbiwgdGhpcyBtdXN0IGJlXG4gKiBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyBgY29tYmluZVJlZHVjZXJzYCBrZXlzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtlbmhhbmNlcl0gVGhlIHN0b3JlIGVuaGFuY2VyLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gZW5oYW5jZSB0aGUgc3RvcmUgd2l0aCB0aGlyZC1wYXJ0eSBjYXBhYmlsaXRpZXMgc3VjaCBhcyBtaWRkbGV3YXJlLFxuICogdGltZSB0cmF2ZWwsIHBlcnNpc3RlbmNlLCBldGMuIFRoZSBvbmx5IHN0b3JlIGVuaGFuY2VyIHRoYXQgc2hpcHMgd2l0aCBSZWR1eFxuICogaXMgYGFwcGx5TWlkZGxld2FyZSgpYC5cbiAqXG4gKiBAcmV0dXJucyB7U3RvcmV9IEEgUmVkdXggc3RvcmUgdGhhdCBsZXRzIHlvdSByZWFkIHRoZSBzdGF0ZSwgZGlzcGF0Y2ggYWN0aW9uc1xuICogYW5kIHN1YnNjcmliZSB0byBjaGFuZ2VzLlxuICovXG5cbnZhciBsZWdhY3lfY3JlYXRlU3RvcmUgPSBjcmVhdGVTdG9yZTtcblxuLyoqXG4gKiBQcmludHMgYSB3YXJuaW5nIGluIHRoZSBjb25zb2xlIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuXG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IGlmIHlvdSBlbmFibGVcbiAgICAvLyBcImJyZWFrIG9uIGFsbCBleGNlcHRpb25zXCIgaW4geW91ciBjb25zb2xlLFxuICAgIC8vIGl0IHdvdWxkIHBhdXNlIHRoZSBleGVjdXRpb24gYXQgdGhpcyBsaW5lLlxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfSBjYXRjaCAoZSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuXG59XG5cbmZ1bmN0aW9uIGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2UoaW5wdXRTdGF0ZSwgcmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKSB7XG4gIHZhciByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgdmFyIGFyZ3VtZW50TmFtZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZXMuSU5JVCA/ICdwcmVsb2FkZWRTdGF0ZSBhcmd1bWVudCBwYXNzZWQgdG8gY3JlYXRlU3RvcmUnIDogJ3ByZXZpb3VzIHN0YXRlIHJlY2VpdmVkIGJ5IHRoZSByZWR1Y2VyJztcblxuICBpZiAocmVkdWNlcktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdTdG9yZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgcmVkdWNlci4gTWFrZSBzdXJlIHRoZSBhcmd1bWVudCBwYXNzZWQgJyArICd0byBjb21iaW5lUmVkdWNlcnMgaXMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgcmVkdWNlcnMuJztcbiAgfVxuXG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dFN0YXRlKSkge1xuICAgIHJldHVybiBcIlRoZSBcIiArIGFyZ3VtZW50TmFtZSArIFwiIGhhcyB1bmV4cGVjdGVkIHR5cGUgb2YgXFxcIlwiICsga2luZE9mKGlucHV0U3RhdGUpICsgXCJcXFwiLiBFeHBlY3RlZCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIFwiICsgKFwia2V5czogXFxcIlwiICsgcmVkdWNlcktleXMuam9pbignXCIsIFwiJykgKyBcIlxcXCJcIik7XG4gIH1cblxuICB2YXIgdW5leHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dFN0YXRlKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhcmVkdWNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdW5leHBlY3RlZEtleUNhY2hlW2tleV07XG4gIH0pO1xuICB1bmV4cGVjdGVkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XSA9IHRydWU7XG4gIH0pO1xuICBpZiAoYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlcy5SRVBMQUNFKSByZXR1cm47XG5cbiAgaWYgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gXCJVbmV4cGVjdGVkIFwiICsgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDEgPyAna2V5cycgOiAna2V5JykgKyBcIiBcIiArIChcIlxcXCJcIiArIHVuZXhwZWN0ZWRLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiIGZvdW5kIGluIFwiICsgYXJndW1lbnROYW1lICsgXCIuIFwiKSArIFwiRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIga2V5cyBpbnN0ZWFkOiBcIiArIChcIlxcXCJcIiArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiLiBVbmV4cGVjdGVkIGtleXMgd2lsbCBiZSBpZ25vcmVkLlwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRSZWR1Y2VyU2hhcGUocmVkdWNlcnMpIHtcbiAgT2JqZWN0LmtleXMocmVkdWNlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciByZWR1Y2VyID0gcmVkdWNlcnNba2V5XTtcbiAgICB2YXIgaW5pdGlhbFN0YXRlID0gcmVkdWNlcih1bmRlZmluZWQsIHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLklOSVRcbiAgICB9KTtcblxuICAgIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTIpIDogXCJUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBcIiArIFwiSWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgcmVkdWNlciBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IFwiICsgXCJleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IFwiICsgXCJub3QgYmUgdW5kZWZpbmVkLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCBcIiArIFwieW91IGNhbiB1c2UgbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5cIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZWR1Y2VyKHVuZGVmaW5lZCwge1xuICAgICAgdHlwZTogQWN0aW9uVHlwZXMuUFJPQkVfVU5LTk9XTl9BQ1RJT04oKVxuICAgIH0pID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTMpIDogXCJUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBwcm9iZWQgd2l0aCBhIHJhbmRvbSB0eXBlLiBcIiArIChcIkRvbid0IHRyeSB0byBoYW5kbGUgJ1wiICsgQWN0aW9uVHlwZXMuSU5JVCArIFwiJyBvciBvdGhlciBhY3Rpb25zIGluIFxcXCJyZWR1eC8qXFxcIiBcIikgKyBcIm5hbWVzcGFjZS4gVGhleSBhcmUgY29uc2lkZXJlZCBwcml2YXRlLiBJbnN0ZWFkLCB5b3UgbXVzdCByZXR1cm4gdGhlIFwiICsgXCJjdXJyZW50IHN0YXRlIGZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB1bmxlc3MgaXQgaXMgdW5kZWZpbmVkLCBcIiArIFwiaW4gd2hpY2ggY2FzZSB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIFwiICsgXCJhY3Rpb24gdHlwZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQsIGJ1dCBjYW4gYmUgbnVsbC5cIik7XG4gICAgfVxuICB9KTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgZGlmZmVyZW50IHJlZHVjZXIgZnVuY3Rpb25zLCBpbnRvIGEgc2luZ2xlXG4gKiByZWR1Y2VyIGZ1bmN0aW9uLiBJdCB3aWxsIGNhbGwgZXZlcnkgY2hpbGQgcmVkdWNlciwgYW5kIGdhdGhlciB0aGVpciByZXN1bHRzXG4gKiBpbnRvIGEgc2luZ2xlIHN0YXRlIG9iamVjdCwgd2hvc2Uga2V5cyBjb3JyZXNwb25kIHRvIHRoZSBrZXlzIG9mIHRoZSBwYXNzZWRcbiAqIHJlZHVjZXIgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWR1Y2VycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50XG4gKiByZWR1Y2VyIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgY29tYmluZWQgaW50byBvbmUuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluXG4gKiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhcyByZWR1Y2Vyc2Agc3ludGF4LiBUaGUgcmVkdWNlcnMgbWF5IG5ldmVyIHJldHVyblxuICogdW5kZWZpbmVkIGZvciBhbnkgYWN0aW9uLiBJbnN0ZWFkLCB0aGV5IHNob3VsZCByZXR1cm4gdGhlaXIgaW5pdGlhbCBzdGF0ZVxuICogaWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGVtIHdhcyB1bmRlZmluZWQsIGFuZCB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYW55XG4gKiB1bnJlY29nbml6ZWQgYWN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSByZWR1Y2VyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBldmVyeSByZWR1Y2VyIGluc2lkZSB0aGVcbiAqIHBhc3NlZCBvYmplY3QsIGFuZCBidWlsZHMgYSBzdGF0ZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2Vycykge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBmaW5hbFJlZHVjZXJzID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSByZWR1Y2VyS2V5c1tpXTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdhcm5pbmcoXCJObyByZWR1Y2VyIHByb3ZpZGVkIGZvciBrZXkgXFxcIlwiICsga2V5ICsgXCJcXFwiXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZmluYWxSZWR1Y2Vyc1trZXldID0gcmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmluYWxSZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKGZpbmFsUmVkdWNlcnMpOyAvLyBUaGlzIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHdhcm4gYWJvdXQgdGhlIHNhbWVcbiAgLy8ga2V5cyBtdWx0aXBsZSB0aW1lcy5cblxuICB2YXIgdW5leHBlY3RlZEtleUNhY2hlO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlID0ge307XG4gIH1cblxuICB2YXIgc2hhcGVBc3NlcnRpb25FcnJvcjtcblxuICB0cnkge1xuICAgIGFzc2VydFJlZHVjZXJTaGFwZShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNoYXBlQXNzZXJ0aW9uRXJyb3IgPSBlO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbWJpbmF0aW9uKHN0YXRlLCBhY3Rpb24pIHtcbiAgICBpZiAoc3RhdGUgPT09IHZvaWQgMCkge1xuICAgICAgc3RhdGUgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoc2hhcGVBc3NlcnRpb25FcnJvcikge1xuICAgICAgdGhyb3cgc2hhcGVBc3NlcnRpb25FcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHdhcm5pbmdNZXNzYWdlID0gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShzdGF0ZSwgZmluYWxSZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpO1xuXG4gICAgICBpZiAod2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgd2FybmluZyh3YXJuaW5nTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgbmV4dFN0YXRlID0ge307XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfa2V5ID0gZmluYWxSZWR1Y2VyS2V5c1tfaV07XG4gICAgICB2YXIgcmVkdWNlciA9IGZpbmFsUmVkdWNlcnNbX2tleV07XG4gICAgICB2YXIgcHJldmlvdXNTdGF0ZUZvcktleSA9IHN0YXRlW19rZXldO1xuICAgICAgdmFyIG5leHRTdGF0ZUZvcktleSA9IHJlZHVjZXIocHJldmlvdXNTdGF0ZUZvcktleSwgYWN0aW9uKTtcblxuICAgICAgaWYgKHR5cGVvZiBuZXh0U3RhdGVGb3JLZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBhY3Rpb25UeXBlID0gYWN0aW9uICYmIGFjdGlvbi50eXBlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNCkgOiBcIldoZW4gY2FsbGVkIHdpdGggYW4gYWN0aW9uIG9mIHR5cGUgXCIgKyAoYWN0aW9uVHlwZSA/IFwiXFxcIlwiICsgU3RyaW5nKGFjdGlvblR5cGUpICsgXCJcXFwiXCIgOiAnKHVua25vd24gdHlwZSknKSArIFwiLCB0aGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIF9rZXkgKyBcIlxcXCIgcmV0dXJuZWQgdW5kZWZpbmVkLiBcIiArIFwiVG8gaWdub3JlIGFuIGFjdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXRlLiBcIiArIFwiSWYgeW91IHdhbnQgdGhpcyByZWR1Y2VyIHRvIGhvbGQgbm8gdmFsdWUsIHlvdSBjYW4gcmV0dXJuIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICBuZXh0U3RhdGVbX2tleV0gPSBuZXh0U3RhdGVGb3JLZXk7XG4gICAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBuZXh0U3RhdGVGb3JLZXkgIT09IHByZXZpb3VzU3RhdGVGb3JLZXk7XG4gICAgfVxuXG4gICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKHN0YXRlKS5sZW5ndGg7XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQgPyBuZXh0U3RhdGUgOiBzdGF0ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgYWN0aW9uIGNyZWF0b3JzLCBpbnRvIGFuIG9iamVjdCB3aXRoIHRoZVxuICogc2FtZSBrZXlzLCBidXQgd2l0aCBldmVyeSBmdW5jdGlvbiB3cmFwcGVkIGludG8gYSBgZGlzcGF0Y2hgIGNhbGwgc28gdGhleVxuICogbWF5IGJlIGludm9rZWQgZGlyZWN0bHkuIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIG1ldGhvZCwgYXMgeW91IGNhbiBjYWxsXG4gKiBgc3RvcmUuZGlzcGF0Y2goTXlBY3Rpb25DcmVhdG9ycy5kb1NvbWV0aGluZygpKWAgeW91cnNlbGYganVzdCBmaW5lLlxuICpcbiAqIEZvciBjb252ZW5pZW5jZSwgeW91IGNhbiBhbHNvIHBhc3MgYW4gYWN0aW9uIGNyZWF0b3IgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LFxuICogYW5kIGdldCBhIGRpc3BhdGNoIHdyYXBwZWQgZnVuY3Rpb24gaW4gcmV0dXJuLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBhY3Rpb25DcmVhdG9ycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSBhY3Rpb25cbiAqIGNyZWF0b3IgZnVuY3Rpb25zLiBPbmUgaGFuZHkgd2F5IHRvIG9idGFpbiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhc2BcbiAqIHN5bnRheC4gWW91IG1heSBhbHNvIHBhc3MgYSBzaW5nbGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZGlzcGF0Y2ggVGhlIGBkaXNwYXRjaGAgZnVuY3Rpb24gYXZhaWxhYmxlIG9uIHlvdXIgUmVkdXhcbiAqIHN0b3JlLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbnxPYmplY3R9IFRoZSBvYmplY3QgbWltaWNraW5nIHRoZSBvcmlnaW5hbCBvYmplY3QsIGJ1dCB3aXRoXG4gKiBldmVyeSBhY3Rpb24gY3JlYXRvciB3cmFwcGVkIGludG8gdGhlIGBkaXNwYXRjaGAgY2FsbC4gSWYgeW91IHBhc3NlZCBhXG4gKiBmdW5jdGlvbiBhcyBgYWN0aW9uQ3JlYXRvcnNgLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYWxzbyBiZSBhIHNpbmdsZVxuICogZnVuY3Rpb24uXG4gKi9cblxuXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgIT09ICdvYmplY3QnIHx8IGFjdGlvbkNyZWF0b3JzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTYpIDogXCJiaW5kQWN0aW9uQ3JlYXRvcnMgZXhwZWN0ZWQgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24sIGJ1dCBpbnN0ZWFkIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YoYWN0aW9uQ3JlYXRvcnMpICsgXCInLiBcIiArIFwiRGlkIHlvdSB3cml0ZSBcXFwiaW1wb3J0IEFjdGlvbkNyZWF0b3JzIGZyb21cXFwiIGluc3RlYWQgb2YgXFxcImltcG9ydCAqIGFzIEFjdGlvbkNyZWF0b3JzIGZyb21cXFwiP1wiKTtcbiAgfVxuXG4gIHZhciBib3VuZEFjdGlvbkNyZWF0b3JzID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIGFjdGlvbkNyZWF0b3JzKSB7XG4gICAgdmFyIGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59XG5cbi8qKlxuICogQ29tcG9zZXMgc2luZ2xlLWFyZ3VtZW50IGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuIFRoZSByaWdodG1vc3RcbiAqIGZ1bmN0aW9uIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cyBhcyBpdCBwcm92aWRlcyB0aGUgc2lnbmF0dXJlIGZvclxuICogdGhlIHJlc3VsdGluZyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gZnVuY3MgVGhlIGZ1bmN0aW9ucyB0byBjb21wb3NlLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIG9idGFpbmVkIGJ5IGNvbXBvc2luZyB0aGUgYXJndW1lbnQgZnVuY3Rpb25zXG4gKiBmcm9tIHJpZ2h0IHRvIGxlZnQuIEZvciBleGFtcGxlLCBjb21wb3NlKGYsIGcsIGgpIGlzIGlkZW50aWNhbCB0byBkb2luZ1xuICogKC4uLmFyZ3MpID0+IGYoZyhoKC4uLmFyZ3MpKSkuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2UoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBmdW5jcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBmdW5jc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICB9XG5cbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBmdW5jc1swXTtcbiAgfVxuXG4gIHJldHVybiBmdW5jcy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGEoYi5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cykpO1xuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdG9yZSBlbmhhbmNlciB0aGF0IGFwcGxpZXMgbWlkZGxld2FyZSB0byB0aGUgZGlzcGF0Y2ggbWV0aG9kXG4gKiBvZiB0aGUgUmVkdXggc3RvcmUuIFRoaXMgaXMgaGFuZHkgZm9yIGEgdmFyaWV0eSBvZiB0YXNrcywgc3VjaCBhcyBleHByZXNzaW5nXG4gKiBhc3luY2hyb25vdXMgYWN0aW9ucyBpbiBhIGNvbmNpc2UgbWFubmVyLCBvciBsb2dnaW5nIGV2ZXJ5IGFjdGlvbiBwYXlsb2FkLlxuICpcbiAqIFNlZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UgYXMgYW4gZXhhbXBsZSBvZiB0aGUgUmVkdXggbWlkZGxld2FyZS5cbiAqXG4gKiBCZWNhdXNlIG1pZGRsZXdhcmUgaXMgcG90ZW50aWFsbHkgYXN5bmNocm9ub3VzLCB0aGlzIHNob3VsZCBiZSB0aGUgZmlyc3RcbiAqIHN0b3JlIGVuaGFuY2VyIGluIHRoZSBjb21wb3NpdGlvbiBjaGFpbi5cbiAqXG4gKiBOb3RlIHRoYXQgZWFjaCBtaWRkbGV3YXJlIHdpbGwgYmUgZ2l2ZW4gdGhlIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgZnVuY3Rpb25zXG4gKiBhcyBuYW1lZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gbWlkZGxld2FyZXMgVGhlIG1pZGRsZXdhcmUgY2hhaW4gdG8gYmUgYXBwbGllZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBzdG9yZSBlbmhhbmNlciBhcHBseWluZyB0aGUgbWlkZGxld2FyZS5cbiAqL1xuXG5mdW5jdGlvbiBhcHBseU1pZGRsZXdhcmUoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBtaWRkbGV3YXJlcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBtaWRkbGV3YXJlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoY3JlYXRlU3RvcmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0b3JlID0gY3JlYXRlU3RvcmUuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuXG4gICAgICB2YXIgX2Rpc3BhdGNoID0gZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE1KSA6ICdEaXNwYXRjaGluZyB3aGlsZSBjb25zdHJ1Y3RpbmcgeW91ciBtaWRkbGV3YXJlIGlzIG5vdCBhbGxvd2VkLiAnICsgJ090aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC4nKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBtaWRkbGV3YXJlQVBJID0ge1xuICAgICAgICBnZXRTdGF0ZTogc3RvcmUuZ2V0U3RhdGUsXG4gICAgICAgIGRpc3BhdGNoOiBmdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgICAgICAgICByZXR1cm4gX2Rpc3BhdGNoLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBjaGFpbiA9IG1pZGRsZXdhcmVzLm1hcChmdW5jdGlvbiAobWlkZGxld2FyZSkge1xuICAgICAgICByZXR1cm4gbWlkZGxld2FyZShtaWRkbGV3YXJlQVBJKTtcbiAgICAgIH0pO1xuICAgICAgX2Rpc3BhdGNoID0gY29tcG9zZS5hcHBseSh2b2lkIDAsIGNoYWluKShzdG9yZS5kaXNwYXRjaCk7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdG9yZSksIHt9LCB7XG4gICAgICAgIGRpc3BhdGNoOiBfZGlzcGF0Y2hcbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB7IEFjdGlvblR5cGVzIGFzIF9fRE9fTk9UX1VTRV9fQWN0aW9uVHlwZXMsIGFwcGx5TWlkZGxld2FyZSwgYmluZEFjdGlvbkNyZWF0b3JzLCBjb21iaW5lUmVkdWNlcnMsIGNvbXBvc2UsIGNyZWF0ZVN0b3JlLCBsZWdhY3lfY3JlYXRlU3RvcmUgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGlzQXJyYXlpc2ggPSByZXF1aXJlKCdpcy1hcnJheWlzaCcpO1xuXG52YXIgY29uY2F0ID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdDtcbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxudmFyIHN3aXp6bGUgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHN3aXp6bGUoYXJncykge1xuXHR2YXIgcmVzdWx0cyA9IFtdO1xuXG5cdGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0dmFyIGFyZyA9IGFyZ3NbaV07XG5cblx0XHRpZiAoaXNBcnJheWlzaChhcmcpKSB7XG5cdFx0XHQvLyBodHRwOi8vanNwZXJmLmNvbS9qYXZhc2NyaXB0LWFycmF5LWNvbmNhdC12cy1wdXNoLzk4XG5cdFx0XHRyZXN1bHRzID0gY29uY2F0LmNhbGwocmVzdWx0cywgc2xpY2UuY2FsbChhcmcpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0cy5wdXNoKGFyZyk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG5zd2l6emxlLndyYXAgPSBmdW5jdGlvbiAoZm4pIHtcblx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gZm4oc3dpenpsZShhcmd1bWVudHMpKTtcblx0fTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXJyYXlpc2gob2JqKSB7XG5cdGlmICghb2JqIHx8IHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIG9iaiBpbnN0YW5jZW9mIEFycmF5IHx8IEFycmF5LmlzQXJyYXkob2JqKSB8fFxuXHRcdChvYmoubGVuZ3RoID49IDAgJiYgKG9iai5zcGxpY2UgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fFxuXHRcdFx0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCAob2JqLmxlbmd0aCAtIDEpKSAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPT0gJ1N0cmluZycpKSk7XG59O1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL1Rvb2xiYXIuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9Ub29sYmFyLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9DYWxsYmFja0dyYXBoQ29udGFpbmVyLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vRnJvbnRFbmRFcnJvci5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0Zyb250RW5kRXJyb3IuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL1BlcmN5LmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vUGVyY3kuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0RlYnVnTWVudS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0RlYnVnTWVudS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vUGxvdGx5Q2xvdWQuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9QbG90bHlDbG91ZC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vVmVyc2lvbkluZm8uY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9WZXJzaW9uSW5mby5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdXBkYXRlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHVzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0uZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcblxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG4vKipcbiAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICovXG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIHJldHVybiB4ID09PSB5ICYmICh4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSkgfHwgeCAhPT0geCAmJiB5ICE9PSB5IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIDtcbn1cblxudmFyIG9iamVjdElzID0gdHlwZW9mIE9iamVjdC5pcyA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdC5pcyA6IGlzO1xuXG4vLyBkaXNwYXRjaCBmb3IgQ29tbW9uSlMgaW50ZXJvcCBuYW1lZCBpbXBvcnRzLlxuXG52YXIgdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSxcbiAgICB1c2VFZmZlY3QgPSBSZWFjdC51c2VFZmZlY3QsXG4gICAgdXNlTGF5b3V0RWZmZWN0ID0gUmVhY3QudXNlTGF5b3V0RWZmZWN0LFxuICAgIHVzZURlYnVnVmFsdWUgPSBSZWFjdC51c2VEZWJ1Z1ZhbHVlO1xudmFyIGRpZFdhcm5PbGQxOEFscGhhID0gZmFsc2U7XG52YXIgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSBmYWxzZTsgLy8gRGlzY2xhaW1lcjogVGhpcyBzaGltIGJyZWFrcyBtYW55IG9mIHRoZSBydWxlcyBvZiBSZWFjdCwgYW5kIG9ubHkgd29ya3Ncbi8vIGJlY2F1c2Ugb2YgYSB2ZXJ5IHBhcnRpY3VsYXIgc2V0IG9mIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYW5kIGFzc3VtcHRpb25zXG4vLyAtLSBjaGFuZ2UgYW55IG9uZSBvZiB0aGVtIGFuZCBpdCB3aWxsIGJyZWFrLiBUaGUgbW9zdCBpbXBvcnRhbnQgYXNzdW1wdGlvblxuLy8gaXMgdGhhdCB1cGRhdGVzIGFyZSBhbHdheXMgc3luY2hyb25vdXMsIGJlY2F1c2UgY29uY3VycmVudCByZW5kZXJpbmcgaXNcbi8vIG9ubHkgYXZhaWxhYmxlIGluIHZlcnNpb25zIG9mIFJlYWN0IHRoYXQgYWxzbyBoYXZlIGEgYnVpbHQtaW5cbi8vIHVzZVN5bmNFeHRlcm5hbFN0b3JlIEFQSS4gQW5kIHdlIG9ubHkgdXNlIHRoaXMgc2hpbSB3aGVuIHRoZSBidWlsdC1pbiBBUElcbi8vIGRvZXMgbm90IGV4aXN0LlxuLy9cbi8vIERvIG5vdCBhc3N1bWUgdGhhdCB0aGUgY2xldmVyIGhhY2tzIHVzZWQgYnkgdGhpcyBob29rIGFsc28gd29yayBpbiBnZW5lcmFsLlxuLy8gVGhlIHBvaW50IG9mIHRoaXMgc2hpbSBpcyB0byByZXBsYWNlIHRoZSBuZWVkIGZvciBoYWNrcyBieSBvdGhlciBsaWJyYXJpZXMuXG5cbmZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIC8vIE5vdGU6IFRoZSBzaGltIGRvZXMgbm90IHVzZSBnZXRTZXJ2ZXJTbmFwc2hvdCwgYmVjYXVzZSBwcmUtMTggdmVyc2lvbnMgb2Zcbi8vIFJlYWN0IGRvIG5vdCBleHBvc2UgYSB3YXkgdG8gY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nLiBTbyB1c2VycyBvZiB0aGUgc2hpbVxuLy8gd2lsbCBuZWVkIHRvIHRyYWNrIHRoYXQgdGhlbXNlbHZlcyBhbmQgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlXG4vLyBmcm9tIGBnZXRTbmFwc2hvdGAuXG5nZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICB7XG4gICAgaWYgKCFkaWRXYXJuT2xkMThBbHBoYSkge1xuICAgICAgaWYgKFJlYWN0LnN0YXJ0VHJhbnNpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRpZFdhcm5PbGQxOEFscGhhID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignWW91IGFyZSB1c2luZyBhbiBvdXRkYXRlZCwgcHJlLXJlbGVhc2UgYWxwaGEgb2YgUmVhY3QgMTggdGhhdCAnICsgJ2RvZXMgbm90IHN1cHBvcnQgdXNlU3luY0V4dGVybmFsU3RvcmUuIFRoZSAnICsgJ3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlIHNoaW0gd2lsbCBub3Qgd29yayBjb3JyZWN0bHkuIFVwZ3JhZGUgJyArICd0byBhIG5ld2VyIHByZS1yZWxlYXNlLicpO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBSZWFkIHRoZSBjdXJyZW50IHNuYXBzaG90IGZyb20gdGhlIHN0b3JlIG9uIGV2ZXJ5IHJlbmRlci4gQWdhaW4sIHRoaXNcbiAgLy8gYnJlYWtzIHRoZSBydWxlcyBvZiBSZWFjdCwgYW5kIG9ubHkgd29ya3MgaGVyZSBiZWNhdXNlIG9mIHNwZWNpZmljXG4gIC8vIGltcGxlbWVudGF0aW9uIGRldGFpbHMsIG1vc3QgaW1wb3J0YW50bHkgdGhhdCB1cGRhdGVzIGFyZVxuICAvLyBhbHdheXMgc3luY2hyb25vdXMuXG5cblxuICB2YXIgdmFsdWUgPSBnZXRTbmFwc2hvdCgpO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90KSB7XG4gICAgICB2YXIgY2FjaGVkVmFsdWUgPSBnZXRTbmFwc2hvdCgpO1xuXG4gICAgICBpZiAoIW9iamVjdElzKHZhbHVlLCBjYWNoZWRWYWx1ZSkpIHtcbiAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBCZWNhdXNlIHVwZGF0ZXMgYXJlIHN5bmNocm9ub3VzLCB3ZSBkb24ndCBxdWV1ZSB0aGVtLiBJbnN0ZWFkIHdlIGZvcmNlIGFcbiAgLy8gcmUtcmVuZGVyIHdoZW5ldmVyIHRoZSBzdWJzY3JpYmVkIHN0YXRlIGNoYW5nZXMgYnkgdXBkYXRpbmcgYW4gc29tZVxuICAvLyBhcmJpdHJhcnkgdXNlU3RhdGUgaG9vay4gVGhlbiwgZHVyaW5nIHJlbmRlciwgd2UgY2FsbCBnZXRTbmFwc2hvdCB0byByZWFkXG4gIC8vIHRoZSBjdXJyZW50IHZhbHVlLlxuICAvL1xuICAvLyBCZWNhdXNlIHdlIGRvbid0IGFjdHVhbGx5IHVzZSB0aGUgc3RhdGUgcmV0dXJuZWQgYnkgdGhlIHVzZVN0YXRlIGhvb2ssIHdlXG4gIC8vIGNhbiBzYXZlIGEgYml0IG9mIG1lbW9yeSBieSBzdG9yaW5nIG90aGVyIHN0dWZmIGluIHRoYXQgc2xvdC5cbiAgLy9cbiAgLy8gVG8gaW1wbGVtZW50IHRoZSBlYXJseSBiYWlsb3V0LCB3ZSBuZWVkIHRvIHRyYWNrIHNvbWUgdGhpbmdzIG9uIGEgbXV0YWJsZVxuICAvLyBvYmplY3QuIFVzdWFsbHksIHdlIHdvdWxkIHB1dCB0aGF0IGluIGEgdXNlUmVmIGhvb2ssIGJ1dCB3ZSBjYW4gc3Rhc2ggaXQgaW5cbiAgLy8gb3VyIHVzZVN0YXRlIGhvb2sgaW5zdGVhZC5cbiAgLy9cbiAgLy8gVG8gZm9yY2UgYSByZS1yZW5kZXIsIHdlIGNhbGwgZm9yY2VVcGRhdGUoe2luc3R9KS4gVGhhdCB3b3JrcyBiZWNhdXNlIHRoZVxuICAvLyBuZXcgb2JqZWN0IGFsd2F5cyBmYWlscyBhbiBlcXVhbGl0eSBjaGVjay5cblxuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSh7XG4gICAgaW5zdDoge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZ2V0U25hcHNob3Q6IGdldFNuYXBzaG90XG4gICAgfVxuICB9KSxcbiAgICAgIGluc3QgPSBfdXNlU3RhdGVbMF0uaW5zdCxcbiAgICAgIGZvcmNlVXBkYXRlID0gX3VzZVN0YXRlWzFdOyAvLyBUcmFjayB0aGUgbGF0ZXN0IGdldFNuYXBzaG90IGZ1bmN0aW9uIHdpdGggYSByZWYuIFRoaXMgbmVlZHMgdG8gYmUgdXBkYXRlZFxuICAvLyBpbiB0aGUgbGF5b3V0IHBoYXNlIHNvIHdlIGNhbiBhY2Nlc3MgaXQgZHVyaW5nIHRoZSB0ZWFyaW5nIGNoZWNrIHRoYXRcbiAgLy8gaGFwcGVucyBvbiBzdWJzY3JpYmUuXG5cblxuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGluc3QudmFsdWUgPSB2YWx1ZTtcbiAgICBpbnN0LmdldFNuYXBzaG90ID0gZ2V0U25hcHNob3Q7IC8vIFdoZW5ldmVyIGdldFNuYXBzaG90IG9yIHN1YnNjcmliZSBjaGFuZ2VzLCB3ZSBuZWVkIHRvIGNoZWNrIGluIHRoZVxuICAgIC8vIGNvbW1pdCBwaGFzZSBpZiB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgbXV0YXRpb24uIEluIGNvbmN1cnJlbnQgbW9kZVxuICAgIC8vIHRoaXMgY2FuIGhhcHBlbiBhbGwgdGhlIHRpbWUsIGJ1dCBldmVuIGluIHN5bmNocm9ub3VzIG1vZGUsIGFuIGVhcmxpZXJcbiAgICAvLyBlZmZlY3QgbWF5IGhhdmUgbXV0YXRlZCB0aGUgc3RvcmUuXG5cbiAgICBpZiAoY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSkge1xuICAgICAgLy8gRm9yY2UgYSByZS1yZW5kZXIuXG4gICAgICBmb3JjZVVwZGF0ZSh7XG4gICAgICAgIGluc3Q6IGluc3RcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW3N1YnNjcmliZSwgdmFsdWUsIGdldFNuYXBzaG90XSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gQ2hlY2sgZm9yIGNoYW5nZXMgcmlnaHQgYmVmb3JlIHN1YnNjcmliaW5nLiBTdWJzZXF1ZW50IGNoYW5nZXMgd2lsbCBiZVxuICAgIC8vIGRldGVjdGVkIGluIHRoZSBzdWJzY3JpcHRpb24gaGFuZGxlci5cbiAgICBpZiAoY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSkge1xuICAgICAgLy8gRm9yY2UgYSByZS1yZW5kZXIuXG4gICAgICBmb3JjZVVwZGF0ZSh7XG4gICAgICAgIGluc3Q6IGluc3RcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBoYW5kbGVTdG9yZUNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRPRE86IEJlY2F1c2UgdGhlcmUgaXMgbm8gY3Jvc3MtcmVuZGVyZXIgQVBJIGZvciBiYXRjaGluZyB1cGRhdGVzLCBpdCdzXG4gICAgICAvLyB1cCB0byB0aGUgY29uc3VtZXIgb2YgdGhpcyBsaWJyYXJ5IHRvIHdyYXAgdGhlaXIgc3Vic2NyaXB0aW9uIGV2ZW50XG4gICAgICAvLyB3aXRoIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzLiBTaG91bGQgd2UgdHJ5IHRvIGRldGVjdCB3aGVuIHRoaXMgaXNuJ3RcbiAgICAgIC8vIHRoZSBjYXNlIGFuZCBwcmludCBhIHdhcm5pbmcgaW4gZGV2ZWxvcG1lbnQ/XG4gICAgICAvLyBUaGUgc3RvcmUgY2hhbmdlZC4gQ2hlY2sgaWYgdGhlIHNuYXBzaG90IGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZVxuICAgICAgLy8gcmVhZCBmcm9tIHRoZSBzdG9yZS5cbiAgICAgIGlmIChjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpKSB7XG4gICAgICAgIC8vIEZvcmNlIGEgcmUtcmVuZGVyLlxuICAgICAgICBmb3JjZVVwZGF0ZSh7XG4gICAgICAgICAgaW5zdDogaW5zdFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9OyAvLyBTdWJzY3JpYmUgdG8gdGhlIHN0b3JlIGFuZCByZXR1cm4gYSBjbGVhbi11cCBmdW5jdGlvbi5cblxuXG4gICAgcmV0dXJuIHN1YnNjcmliZShoYW5kbGVTdG9yZUNoYW5nZSk7XG4gIH0sIFtzdWJzY3JpYmVdKTtcbiAgdXNlRGVidWdWYWx1ZSh2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSB7XG4gIHZhciBsYXRlc3RHZXRTbmFwc2hvdCA9IGluc3QuZ2V0U25hcHNob3Q7XG4gIHZhciBwcmV2VmFsdWUgPSBpbnN0LnZhbHVlO1xuXG4gIHRyeSB7XG4gICAgdmFyIG5leHRWYWx1ZSA9IGxhdGVzdEdldFNuYXBzaG90KCk7XG4gICAgcmV0dXJuICFvYmplY3RJcyhwcmV2VmFsdWUsIG5leHRWYWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXNlU3luY0V4dGVybmFsU3RvcmUkMShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAvLyBOb3RlOiBUaGUgc2hpbSBkb2VzIG5vdCB1c2UgZ2V0U2VydmVyU25hcHNob3QsIGJlY2F1c2UgcHJlLTE4IHZlcnNpb25zIG9mXG4gIC8vIFJlYWN0IGRvIG5vdCBleHBvc2UgYSB3YXkgdG8gY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nLiBTbyB1c2VycyBvZiB0aGUgc2hpbVxuICAvLyB3aWxsIG5lZWQgdG8gdHJhY2sgdGhhdCB0aGVtc2VsdmVzIGFuZCByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWVcbiAgLy8gZnJvbSBgZ2V0U25hcHNob3RgLlxuICByZXR1cm4gZ2V0U25hcHNob3QoKTtcbn1cblxudmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpO1xuXG52YXIgaXNTZXJ2ZXJFbnZpcm9ubWVudCA9ICFjYW5Vc2VET007XG5cbnZhciBzaGltID0gaXNTZXJ2ZXJFbnZpcm9ubWVudCA/IHVzZVN5bmNFeHRlcm5hbFN0b3JlJDEgOiB1c2VTeW5jRXh0ZXJuYWxTdG9yZTtcbnZhciB1c2VTeW5jRXh0ZXJuYWxTdG9yZSQyID0gUmVhY3QudXNlU3luY0V4dGVybmFsU3RvcmUgIT09IHVuZGVmaW5lZCA/IFJlYWN0LnVzZVN5bmNFeHRlcm5hbFN0b3JlIDogc2hpbTtcblxuZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlJDI7XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHVzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0vd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG52YXIgc2hpbSA9IHJlcXVpcmUoJ3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL3NoaW0nKTtcblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICByZXR1cm4geCA9PT0geSAmJiAoeCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkpIHx8IHggIT09IHggJiYgeSAhPT0geSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICA7XG59XG5cbnZhciBvYmplY3RJcyA9IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBpcztcblxudmFyIHVzZVN5bmNFeHRlcm5hbFN0b3JlID0gc2hpbS51c2VTeW5jRXh0ZXJuYWxTdG9yZTtcblxuLy8gZm9yIENvbW1vbkpTIGludGVyb3AuXG5cbnZhciB1c2VSZWYgPSBSZWFjdC51c2VSZWYsXG4gICAgdXNlRWZmZWN0ID0gUmVhY3QudXNlRWZmZWN0LFxuICAgIHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vLFxuICAgIHVzZURlYnVnVmFsdWUgPSBSZWFjdC51c2VEZWJ1Z1ZhbHVlOyAvLyBTYW1lIGFzIHVzZVN5bmNFeHRlcm5hbFN0b3JlLCBidXQgc3VwcG9ydHMgc2VsZWN0b3IgYW5kIGlzRXF1YWwgYXJndW1lbnRzLlxuXG5mdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvcihzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCwgc2VsZWN0b3IsIGlzRXF1YWwpIHtcbiAgLy8gVXNlIHRoaXMgdG8gdHJhY2sgdGhlIHJlbmRlcmVkIHNuYXBzaG90LlxuICB2YXIgaW5zdFJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGluc3Q7XG5cbiAgaWYgKGluc3RSZWYuY3VycmVudCA9PT0gbnVsbCkge1xuICAgIGluc3QgPSB7XG4gICAgICBoYXNWYWx1ZTogZmFsc2UsXG4gICAgICB2YWx1ZTogbnVsbFxuICAgIH07XG4gICAgaW5zdFJlZi5jdXJyZW50ID0gaW5zdDtcbiAgfSBlbHNlIHtcbiAgICBpbnN0ID0gaW5zdFJlZi5jdXJyZW50O1xuICB9XG5cbiAgdmFyIF91c2VNZW1vID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gVHJhY2sgdGhlIG1lbW9pemVkIHN0YXRlIHVzaW5nIGNsb3N1cmUgdmFyaWFibGVzIHRoYXQgYXJlIGxvY2FsIHRvIHRoaXNcbiAgICAvLyBtZW1vaXplZCBpbnN0YW5jZSBvZiBhIGdldFNuYXBzaG90IGZ1bmN0aW9uLiBJbnRlbnRpb25hbGx5IG5vdCB1c2luZyBhXG4gICAgLy8gdXNlUmVmIGhvb2ssIGJlY2F1c2UgdGhhdCBzdGF0ZSB3b3VsZCBiZSBzaGFyZWQgYWNyb3NzIGFsbCBjb25jdXJyZW50XG4gICAgLy8gY29waWVzIG9mIHRoZSBob29rL2NvbXBvbmVudC5cbiAgICB2YXIgaGFzTWVtbyA9IGZhbHNlO1xuICAgIHZhciBtZW1vaXplZFNuYXBzaG90O1xuICAgIHZhciBtZW1vaXplZFNlbGVjdGlvbjtcblxuICAgIHZhciBtZW1vaXplZFNlbGVjdG9yID0gZnVuY3Rpb24gKG5leHRTbmFwc2hvdCkge1xuICAgICAgaWYgKCFoYXNNZW1vKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCB0aW1lIHRoZSBob29rIGlzIGNhbGxlZCwgdGhlcmUgaXMgbm8gbWVtb2l6ZWQgcmVzdWx0LlxuICAgICAgICBoYXNNZW1vID0gdHJ1ZTtcbiAgICAgICAgbWVtb2l6ZWRTbmFwc2hvdCA9IG5leHRTbmFwc2hvdDtcblxuICAgICAgICB2YXIgX25leHRTZWxlY3Rpb24gPSBzZWxlY3RvcihuZXh0U25hcHNob3QpO1xuXG4gICAgICAgIGlmIChpc0VxdWFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBFdmVuIGlmIHRoZSBzZWxlY3RvciBoYXMgY2hhbmdlZCwgdGhlIGN1cnJlbnRseSByZW5kZXJlZCBzZWxlY3Rpb25cbiAgICAgICAgICAvLyBtYXkgYmUgZXF1YWwgdG8gdGhlIG5ldyBzZWxlY3Rpb24uIFdlIHNob3VsZCBhdHRlbXB0IHRvIHJldXNlIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgdmFsdWUgaWYgcG9zc2libGUsIHRvIHByZXNlcnZlIGRvd25zdHJlYW0gbWVtb2l6YXRpb25zLlxuICAgICAgICAgIGlmIChpbnN0Lmhhc1ZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFNlbGVjdGlvbiA9IGluc3QudmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChpc0VxdWFsKGN1cnJlbnRTZWxlY3Rpb24sIF9uZXh0U2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgICBtZW1vaXplZFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb247XG4gICAgICAgICAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG1lbW9pemVkU2VsZWN0aW9uID0gX25leHRTZWxlY3Rpb247XG4gICAgICAgIHJldHVybiBfbmV4dFNlbGVjdGlvbjtcbiAgICAgIH0gLy8gV2UgbWF5IGJlIGFibGUgdG8gcmV1c2UgdGhlIHByZXZpb3VzIGludm9jYXRpb24ncyByZXN1bHQuXG5cblxuICAgICAgLy8gV2UgbWF5IGJlIGFibGUgdG8gcmV1c2UgdGhlIHByZXZpb3VzIGludm9jYXRpb24ncyByZXN1bHQuXG4gICAgICB2YXIgcHJldlNuYXBzaG90ID0gbWVtb2l6ZWRTbmFwc2hvdDtcbiAgICAgIHZhciBwcmV2U2VsZWN0aW9uID0gbWVtb2l6ZWRTZWxlY3Rpb247XG5cbiAgICAgIGlmIChvYmplY3RJcyhwcmV2U25hcHNob3QsIG5leHRTbmFwc2hvdCkpIHtcbiAgICAgICAgLy8gVGhlIHNuYXBzaG90IGlzIHRoZSBzYW1lIGFzIGxhc3QgdGltZS4gUmV1c2UgdGhlIHByZXZpb3VzIHNlbGVjdGlvbi5cbiAgICAgICAgcmV0dXJuIHByZXZTZWxlY3Rpb247XG4gICAgICB9IC8vIFRoZSBzbmFwc2hvdCBoYXMgY2hhbmdlZCwgc28gd2UgbmVlZCB0byBjb21wdXRlIGEgbmV3IHNlbGVjdGlvbi5cblxuXG4gICAgICAvLyBUaGUgc25hcHNob3QgaGFzIGNoYW5nZWQsIHNvIHdlIG5lZWQgdG8gY29tcHV0ZSBhIG5ldyBzZWxlY3Rpb24uXG4gICAgICB2YXIgbmV4dFNlbGVjdGlvbiA9IHNlbGVjdG9yKG5leHRTbmFwc2hvdCk7IC8vIElmIGEgY3VzdG9tIGlzRXF1YWwgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIHVzZSB0aGF0IHRvIGNoZWNrIGlmIHRoZSBkYXRhXG4gICAgICAvLyBoYXMgY2hhbmdlZC4gSWYgaXQgaGFzbid0LCByZXR1cm4gdGhlIHByZXZpb3VzIHNlbGVjdGlvbi4gVGhhdCBzaWduYWxzXG4gICAgICAvLyB0byBSZWFjdCB0aGF0IHRoZSBzZWxlY3Rpb25zIGFyZSBjb25jZXB0dWFsbHkgZXF1YWwsIGFuZCB3ZSBjYW4gYmFpbFxuICAgICAgLy8gb3V0IG9mIHJlbmRlcmluZy5cblxuICAgICAgLy8gSWYgYSBjdXN0b20gaXNFcXVhbCBmdW5jdGlvbiBpcyBwcm92aWRlZCwgdXNlIHRoYXQgdG8gY2hlY2sgaWYgdGhlIGRhdGFcbiAgICAgIC8vIGhhcyBjaGFuZ2VkLiBJZiBpdCBoYXNuJ3QsIHJldHVybiB0aGUgcHJldmlvdXMgc2VsZWN0aW9uLiBUaGF0IHNpZ25hbHNcbiAgICAgIC8vIHRvIFJlYWN0IHRoYXQgdGhlIHNlbGVjdGlvbnMgYXJlIGNvbmNlcHR1YWxseSBlcXVhbCwgYW5kIHdlIGNhbiBiYWlsXG4gICAgICAvLyBvdXQgb2YgcmVuZGVyaW5nLlxuICAgICAgaWYgKGlzRXF1YWwgIT09IHVuZGVmaW5lZCAmJiBpc0VxdWFsKHByZXZTZWxlY3Rpb24sIG5leHRTZWxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBwcmV2U2VsZWN0aW9uO1xuICAgICAgfVxuXG4gICAgICBtZW1vaXplZFNuYXBzaG90ID0gbmV4dFNuYXBzaG90O1xuICAgICAgbWVtb2l6ZWRTZWxlY3Rpb24gPSBuZXh0U2VsZWN0aW9uO1xuICAgICAgcmV0dXJuIG5leHRTZWxlY3Rpb247XG4gICAgfTsgLy8gQXNzaWduaW5nIHRoaXMgdG8gYSBjb25zdGFudCBzbyB0aGF0IEZsb3cga25vd3MgaXQgY2FuJ3QgY2hhbmdlLlxuXG5cbiAgICAvLyBBc3NpZ25pbmcgdGhpcyB0byBhIGNvbnN0YW50IHNvIHRoYXQgRmxvdyBrbm93cyBpdCBjYW4ndCBjaGFuZ2UuXG4gICAgdmFyIG1heWJlR2V0U2VydmVyU25hcHNob3QgPSBnZXRTZXJ2ZXJTbmFwc2hvdCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGdldFNlcnZlclNuYXBzaG90O1xuXG4gICAgdmFyIGdldFNuYXBzaG90V2l0aFNlbGVjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG1lbW9pemVkU2VsZWN0b3IoZ2V0U25hcHNob3QoKSk7XG4gICAgfTtcblxuICAgIHZhciBnZXRTZXJ2ZXJTbmFwc2hvdFdpdGhTZWxlY3RvciA9IG1heWJlR2V0U2VydmVyU25hcHNob3QgPT09IG51bGwgPyB1bmRlZmluZWQgOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbWVtb2l6ZWRTZWxlY3RvcihtYXliZUdldFNlcnZlclNuYXBzaG90KCkpO1xuICAgIH07XG4gICAgcmV0dXJuIFtnZXRTbmFwc2hvdFdpdGhTZWxlY3RvciwgZ2V0U2VydmVyU25hcHNob3RXaXRoU2VsZWN0b3JdO1xuICB9LCBbZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90LCBzZWxlY3RvciwgaXNFcXVhbF0pLFxuICAgICAgZ2V0U2VsZWN0aW9uID0gX3VzZU1lbW9bMF0sXG4gICAgICBnZXRTZXJ2ZXJTZWxlY3Rpb24gPSBfdXNlTWVtb1sxXTtcblxuICB2YXIgdmFsdWUgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNlbGVjdGlvbiwgZ2V0U2VydmVyU2VsZWN0aW9uKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpbnN0Lmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICBpbnN0LnZhbHVlID0gdmFsdWU7XG4gIH0sIFt2YWx1ZV0pO1xuICB1c2VEZWJ1Z1ZhbHVlKHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnRzLnVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yID0gdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3I7XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltL3dpdGgtc2VsZWN0b3IucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0vd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSB3aW5kb3dbXCJQcm9wVHlwZXNcIl07IiwibW9kdWxlLmV4cG9ydHMgPSB3aW5kb3dbXCJSZWFjdFwiXTsiLCJtb2R1bGUuZXhwb3J0cyA9IHdpbmRvd1tcIlJlYWN0RE9NXCJdOyIsImZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KHIsIGEpIHtcbiAgKG51bGwgPT0gYSB8fCBhID4gci5sZW5ndGgpICYmIChhID0gci5sZW5ndGgpO1xuICBmb3IgKHZhciBlID0gMCwgbiA9IEFycmF5KGEpOyBlIDwgYTsgZSsrKSBuW2VdID0gcltlXTtcbiAgcmV0dXJuIG47XG59XG5leHBvcnQgeyBfYXJyYXlMaWtlVG9BcnJheSBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKHIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocikpIHJldHVybiByO1xufVxuZXhwb3J0IHsgX2FycmF5V2l0aEhvbGVzIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgYXJyYXlMaWtlVG9BcnJheSBmcm9tIFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCI7XG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMocikge1xuICBpZiAoQXJyYXkuaXNBcnJheShyKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkocik7XG59XG5leHBvcnQgeyBfYXJyYXlXaXRob3V0SG9sZXMgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoZSkge1xuICBpZiAodm9pZCAwID09PSBlKSB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIHJldHVybiBlO1xufVxuZXhwb3J0IHsgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGEsIG4pIHtcbiAgaWYgKCEoYSBpbnN0YW5jZW9mIG4pKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xufVxuZXhwb3J0IHsgX2NsYXNzQ2FsbENoZWNrIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgdG9Qcm9wZXJ0eUtleSBmcm9tIFwiLi90b1Byb3BlcnR5S2V5LmpzXCI7XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyhlLCByKSB7XG4gIGZvciAodmFyIHQgPSAwOyB0IDwgci5sZW5ndGg7IHQrKykge1xuICAgIHZhciBvID0gclt0XTtcbiAgICBvLmVudW1lcmFibGUgPSBvLmVudW1lcmFibGUgfHwgITEsIG8uY29uZmlndXJhYmxlID0gITAsIFwidmFsdWVcIiBpbiBvICYmIChvLndyaXRhYmxlID0gITApLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdG9Qcm9wZXJ0eUtleShvLmtleSksIG8pO1xuICB9XG59XG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoZSwgciwgdCkge1xuICByZXR1cm4gciAmJiBfZGVmaW5lUHJvcGVydGllcyhlLnByb3RvdHlwZSwgciksIHQgJiYgX2RlZmluZVByb3BlcnRpZXMoZSwgdCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6ICExXG4gIH0pLCBlO1xufVxuZXhwb3J0IHsgX2NyZWF0ZUNsYXNzIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgdG9Qcm9wZXJ0eUtleSBmcm9tIFwiLi90b1Byb3BlcnR5S2V5LmpzXCI7XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkoZSwgciwgdCkge1xuICByZXR1cm4gKHIgPSB0b1Byb3BlcnR5S2V5KHIpKSBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIHtcbiAgICB2YWx1ZTogdCxcbiAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICBjb25maWd1cmFibGU6ICEwLFxuICAgIHdyaXRhYmxlOiAhMFxuICB9KSA6IGVbcl0gPSB0LCBlO1xufVxuZXhwb3J0IHsgX2RlZmluZVByb3BlcnR5IGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHtcbiAgICBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykge1xuICAgICAgdmFyIHQgPSBhcmd1bWVudHNbZV07XG4gICAgICBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbiAgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cbmV4cG9ydCB7IF9leHRlbmRzIGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCkge1xuICByZXR1cm4gX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtcbiAgfSwgX2dldFByb3RvdHlwZU9mKHQpO1xufVxuZXhwb3J0IHsgX2dldFByb3RvdHlwZU9mIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgc2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vc2V0UHJvdG90eXBlT2YuanNcIjtcbmZ1bmN0aW9uIF9pbmhlcml0cyh0LCBlKSB7XG4gIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUgJiYgbnVsbCAhPT0gZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogdCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICB9XG4gIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiAhMVxuICB9KSwgZSAmJiBzZXRQcm90b3R5cGVPZih0LCBlKTtcbn1cbmV4cG9ydCB7IF9pbmhlcml0cyBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShyKSB7XG4gIGlmIChcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgbnVsbCAhPSByW1N5bWJvbC5pdGVyYXRvcl0gfHwgbnVsbCAhPSByW1wiQEBpdGVyYXRvclwiXSkgcmV0dXJuIEFycmF5LmZyb20ocik7XG59XG5leHBvcnQgeyBfaXRlcmFibGVUb0FycmF5IGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQociwgbCkge1xuICB2YXIgdCA9IG51bGwgPT0gciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgcltTeW1ib2wuaXRlcmF0b3JdIHx8IHJbXCJAQGl0ZXJhdG9yXCJdO1xuICBpZiAobnVsbCAhPSB0KSB7XG4gICAgdmFyIGUsXG4gICAgICBuLFxuICAgICAgaSxcbiAgICAgIHUsXG4gICAgICBhID0gW10sXG4gICAgICBmID0gITAsXG4gICAgICBvID0gITE7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChpID0gKHQgPSB0LmNhbGwocikpLm5leHQsIDAgPT09IGwpIHtcbiAgICAgICAgaWYgKE9iamVjdCh0KSAhPT0gdCkgcmV0dXJuO1xuICAgICAgICBmID0gITE7XG4gICAgICB9IGVsc2UgZm9yICg7ICEoZiA9IChlID0gaS5jYWxsKHQpKS5kb25lKSAmJiAoYS5wdXNoKGUudmFsdWUpLCBhLmxlbmd0aCAhPT0gbCk7IGYgPSAhMCk7XG4gICAgfSBjYXRjaCAocikge1xuICAgICAgbyA9ICEwLCBuID0gcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFmICYmIG51bGwgIT0gdFtcInJldHVyblwiXSAmJiAodSA9IHRbXCJyZXR1cm5cIl0oKSwgT2JqZWN0KHUpICE9PSB1KSkgcmV0dXJuO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKG8pIHRocm93IG47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhO1xuICB9XG59XG5leHBvcnQgeyBfaXRlcmFibGVUb0FycmF5TGltaXQgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5leHBvcnQgeyBfbm9uSXRlcmFibGVSZXN0IGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuZXhwb3J0IHsgX25vbkl0ZXJhYmxlU3ByZWFkIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgZGVmaW5lUHJvcGVydHkgZnJvbSBcIi4vZGVmaW5lUHJvcGVydHkuanNcIjtcbmZ1bmN0aW9uIG93bktleXMoZSwgcikge1xuICB2YXIgdCA9IE9iamVjdC5rZXlzKGUpO1xuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtcbiAgICByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7XG4gICAgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7XG4gIH1cbiAgcmV0dXJuIHQ7XG59XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMihlKSB7XG4gIGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7XG4gICAgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9O1xuICAgIHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eShlLCByLCB0W3JdKTtcbiAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIpKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZTtcbn1cbmV4cG9ydCB7IF9vYmplY3RTcHJlYWQyIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBmcm9tIFwiLi9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzXCI7XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoZSwgdCkge1xuICBpZiAobnVsbCA9PSBlKSByZXR1cm4ge307XG4gIHZhciBvLFxuICAgIHIsXG4gICAgaSA9IG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoZSwgdCk7XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIG4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO1xuICAgIGZvciAociA9IDA7IHIgPCBuLmxlbmd0aDsgcisrKSBvID0gbltyXSwgLTEgPT09IHQuaW5kZXhPZihvKSAmJiB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIG8pICYmIChpW29dID0gZVtvXSk7XG4gIH1cbiAgcmV0dXJuIGk7XG59XG5leHBvcnQgeyBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHIsIGUpIHtcbiAgaWYgKG51bGwgPT0gcikgcmV0dXJuIHt9O1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBuIGluIHIpIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIG4pKSB7XG4gICAgaWYgKC0xICE9PSBlLmluZGV4T2YobikpIGNvbnRpbnVlO1xuICAgIHRbbl0gPSByW25dO1xuICB9XG4gIHJldHVybiB0O1xufVxuZXhwb3J0IHsgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuaW1wb3J0IGFzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiLi9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanNcIjtcbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQsIGUpIHtcbiAgaWYgKGUgJiYgKFwib2JqZWN0XCIgPT0gX3R5cGVvZihlKSB8fCBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGUpKSByZXR1cm4gZTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpO1xuICByZXR1cm4gYXNzZXJ0VGhpc0luaXRpYWxpemVkKHQpO1xufVxuZXhwb3J0IHsgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LCBlKSB7XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICByZXR1cm4gdC5fX3Byb3RvX18gPSBlLCB0O1xuICB9LCBfc2V0UHJvdG90eXBlT2YodCwgZSk7XG59XG5leHBvcnQgeyBfc2V0UHJvdG90eXBlT2YgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBhcnJheVdpdGhIb2xlcyBmcm9tIFwiLi9hcnJheVdpdGhIb2xlcy5qc1wiO1xuaW1wb3J0IGl0ZXJhYmxlVG9BcnJheUxpbWl0IGZyb20gXCIuL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzXCI7XG5pbXBvcnQgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCBub25JdGVyYWJsZVJlc3QgZnJvbSBcIi4vbm9uSXRlcmFibGVSZXN0LmpzXCI7XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShyLCBlKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhyKSB8fCBpdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBlKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBlKSB8fCBub25JdGVyYWJsZVJlc3QoKTtcbn1cbmV4cG9ydCB7IF9zbGljZWRUb0FycmF5IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgYXJyYXlXaXRob3V0SG9sZXMgZnJvbSBcIi4vYXJyYXlXaXRob3V0SG9sZXMuanNcIjtcbmltcG9ydCBpdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vaXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCBub25JdGVyYWJsZVNwcmVhZCBmcm9tIFwiLi9ub25JdGVyYWJsZVNwcmVhZC5qc1wiO1xuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KHIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKHIpIHx8IGl0ZXJhYmxlVG9BcnJheShyKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuZXhwb3J0IHsgX3RvQ29uc3VtYWJsZUFycmF5IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmZ1bmN0aW9uIHRvUHJpbWl0aXZlKHQsIHIpIHtcbiAgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7XG4gIHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdO1xuICBpZiAodm9pZCAwICE9PSBlKSB7XG4gICAgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7XG4gICAgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpO1xuICB9XG4gIHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7XG59XG5leHBvcnQgeyB0b1ByaW1pdGl2ZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5pbXBvcnQgdG9QcmltaXRpdmUgZnJvbSBcIi4vdG9QcmltaXRpdmUuanNcIjtcbmZ1bmN0aW9uIHRvUHJvcGVydHlLZXkodCkge1xuICB2YXIgaSA9IHRvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpO1xuICByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiO1xufVxuZXhwb3J0IHsgdG9Qcm9wZXJ0eUtleSBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvO1xuICB9IDogZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbztcbiAgfSwgX3R5cGVvZihvKTtcbn1cbmV4cG9ydCB7IF90eXBlb2YgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBhcnJheUxpa2VUb0FycmF5IGZyb20gXCIuL2FycmF5TGlrZVRvQXJyYXkuanNcIjtcbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBhKSB7XG4gIGlmIChyKSB7XG4gICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHIpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KHIsIGEpO1xuICAgIHZhciB0ID0ge30udG9TdHJpbmcuY2FsbChyKS5zbGljZSg4LCAtMSk7XG4gICAgcmV0dXJuIFwiT2JqZWN0XCIgPT09IHQgJiYgci5jb25zdHJ1Y3RvciAmJiAodCA9IHIuY29uc3RydWN0b3IubmFtZSksIFwiTWFwXCIgPT09IHQgfHwgXCJTZXRcIiA9PT0gdCA/IEFycmF5LmZyb20ocikgOiBcIkFyZ3VtZW50c1wiID09PSB0IHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHQpID8gYXJyYXlMaWtlVG9BcnJheShyLCBhKSA6IHZvaWQgMDtcbiAgfVxufVxuZXhwb3J0IHsgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX3hhbGwgZnJvbSBcIi4vaW50ZXJuYWwvX3hhbGwuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgb2YgdGhlIGxpc3QgbWF0Y2ggdGhlIHByZWRpY2F0ZSwgYGZhbHNlYCBpZlxuICogdGhlcmUgYXJlIGFueSB0aGF0IGRvbid0LlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBhbGxgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIHByZWRpY2F0ZSBpcyBzYXRpc2ZpZWQgYnkgZXZlcnkgZWxlbWVudCwgYGZhbHNlYFxuICogICAgICAgICBvdGhlcndpc2UuXG4gKiBAc2VlIFIuYW55LCBSLm5vbmUsIFIudHJhbnNkdWNlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZXF1YWxzMyA9IFIuZXF1YWxzKDMpO1xuICogICAgICBSLmFsbChlcXVhbHMzKShbMywgMywgMywgM10pOyAvLz0+IHRydWVcbiAqICAgICAgUi5hbGwoZXF1YWxzMykoWzMsIDMsIDEsIDNdKTsgLy89PiBmYWxzZVxuICovXG52YXIgYWxsID0gLyojX19QVVJFX18qL19jdXJyeTIoIC8qI19fUFVSRV9fKi9fZGlzcGF0Y2hhYmxlKFsnYWxsJ10sIF94YWxsLCBmdW5jdGlvbiBhbGwoZm4sIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgIGlmICghZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IGFsbDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIGdpdmVuIHZhbHVlLiBOb3RlIHRoYXQgZm9yXG4gKiBub24tcHJpbWl0aXZlcyB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHZhbHVlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMga25vd24gYXMgYGNvbnN0YCwgYGNvbnN0YW50YCwgb3IgYEtgIChmb3IgSyBjb21iaW5hdG9yKSBpblxuICogb3RoZXIgbGFuZ3VhZ2VzIGFuZCBsaWJyYXJpZXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgYSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHdyYXAgaW4gYSBmdW5jdGlvblxuICogQHJldHVybiB7RnVuY3Rpb259IEEgRnVuY3Rpb24gOjogKiAtPiB2YWwuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgdCA9IFIuYWx3YXlzKCdUZWUnKTtcbiAqICAgICAgdCgpOyAvLz0+ICdUZWUnXG4gKi9cbnZhciBhbHdheXMgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBhbHdheXModmFsKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgYWx3YXlzOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeGFueSBmcm9tIFwiLi9pbnRlcm5hbC9feGFueS5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGxpc3QgbWF0Y2ggdGhlIHByZWRpY2F0ZSxcbiAqIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBhbnlgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIHByZWRpY2F0ZSBpcyBzYXRpc2ZpZWQgYnkgYXQgbGVhc3Qgb25lIGVsZW1lbnQsIGBmYWxzZWBcbiAqICAgICAgICAgb3RoZXJ3aXNlLlxuICogQHNlZSBSLmFsbCwgUi5ub25lLCBSLnRyYW5zZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGxlc3NUaGFuMCA9IFIuZmxpcChSLmx0KSgwKTtcbiAqICAgICAgY29uc3QgbGVzc1RoYW4yID0gUi5mbGlwKFIubHQpKDIpO1xuICogICAgICBSLmFueShsZXNzVGhhbjApKFsxLCAyXSk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5hbnkobGVzc1RoYW4yKShbMSwgMl0pOyAvLz0+IHRydWVcbiAqL1xudmFyIGFueSA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbJ2FueSddLCBfeGFueSwgZnVuY3Rpb24gYW55KGZuLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IGFueTsiLCJpbXBvcnQgX2NvbmNhdCBmcm9tIFwiLi9pbnRlcm5hbC9fY29uY2F0LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX3JlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9fcmVkdWNlLmpzXCI7XG5pbXBvcnQgbWFwIGZyb20gXCIuL21hcC5qc1wiO1xuXG4vKipcbiAqIGFwIGFwcGxpZXMgYSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBhIGxpc3Qgb2YgdmFsdWVzLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBhcGAgbWV0aG9kIG9mIHRoZSBmaXJzdCBhcmd1bWVudCwgaWYgcHJlc2VudC4gQWxzb1xuICogdHJlYXRzIGN1cnJpZWQgZnVuY3Rpb25zIGFzIGFwcGxpY2F0aXZlcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4zLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBbYSAtPiBiXSAtPiBbYV0gLT4gW2JdXG4gKiBAc2lnIEFwcGx5IGYgPT4gZiAoYSAtPiBiKSAtPiBmIGEgLT4gZiBiXG4gKiBAc2lnIChyIC0+IGEgLT4gYikgLT4gKHIgLT4gYSkgLT4gKHIgLT4gYilcbiAqIEBwYXJhbSB7Kn0gYXBwbHlGXG4gKiBAcGFyYW0geyp9IGFwcGx5WFxuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFwKFtSLm11bHRpcGx5KDIpLCBSLmFkZCgzKV0sIFsxLDIsM10pOyAvLz0+IFsyLCA0LCA2LCA0LCA1LCA2XVxuICogICAgICBSLmFwKFtSLmNvbmNhdCgndGFzdHkgJyksIFIudG9VcHBlcl0sIFsncGl6emEnLCAnc2FsYWQnXSk7IC8vPT4gW1widGFzdHkgcGl6emFcIiwgXCJ0YXN0eSBzYWxhZFwiLCBcIlBJWlpBXCIsIFwiU0FMQURcIl1cbiAqXG4gKiAgICAgIC8vIFIuYXAgY2FuIGFsc28gYmUgdXNlZCBhcyBTIGNvbWJpbmF0b3JcbiAqICAgICAgLy8gd2hlbiBvbmx5IHR3byBmdW5jdGlvbnMgYXJlIHBhc3NlZFxuICogICAgICBSLmFwKFIuY29uY2F0LCBSLnRvVXBwZXIpKCdSYW1kYScpIC8vPT4gJ1JhbWRhUkFNREEnXG4gKiBAc3ltYiBSLmFwKFtmLCBnXSwgW2EsIGJdKSA9IFtmKGEpLCBmKGIpLCBnKGEpLCBnKGIpXVxuICovXG52YXIgYXAgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBhcChhcHBseUYsIGFwcGx5WCkge1xuICByZXR1cm4gdHlwZW9mIGFwcGx5WFsnZmFudGFzeS1sYW5kL2FwJ10gPT09ICdmdW5jdGlvbicgPyBhcHBseVhbJ2ZhbnRhc3ktbGFuZC9hcCddKGFwcGx5RikgOiB0eXBlb2YgYXBwbHlGLmFwID09PSAnZnVuY3Rpb24nID8gYXBwbHlGLmFwKGFwcGx5WCkgOiB0eXBlb2YgYXBwbHlGID09PSAnZnVuY3Rpb24nID8gZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gYXBwbHlGKHgpKGFwcGx5WCh4KSk7XG4gIH0gOiBfcmVkdWNlKGZ1bmN0aW9uIChhY2MsIGYpIHtcbiAgICByZXR1cm4gX2NvbmNhdChhY2MsIG1hcChmLCBhcHBseVgpKTtcbiAgfSwgW10sIGFwcGx5Rik7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGFwOyIsImltcG9ydCBfY29uY2F0IGZyb20gXCIuL2ludGVybmFsL19jb25jYXQuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGxpc3QsIGZvbGxvd2VkIGJ5XG4gKiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIGEgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHsqfSBlbCBUaGUgZWxlbWVudCB0byBhZGQgdG8gdGhlIGVuZCBvZiB0aGUgbmV3IGxpc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IG9mIGVsZW1lbnRzIHRvIGFkZCBhIG5ldyBpdGVtIHRvLlxuICogICAgICAgIGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgb2xkIGxpc3QgZm9sbG93ZWQgYnkgYGVsYC5cbiAqIEBzZWUgUi5wcmVwZW5kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5hcHBlbmQoJ3Rlc3RzJywgWyd3cml0ZScsICdtb3JlJ10pOyAvLz0+IFsnd3JpdGUnLCAnbW9yZScsICd0ZXN0cyddXG4gKiAgICAgIFIuYXBwZW5kKCd0ZXN0cycsIFtdKTsgLy89PiBbJ3Rlc3RzJ11cbiAqICAgICAgUi5hcHBlbmQoWyd0ZXN0cyddLCBbJ3dyaXRlJywgJ21vcmUnXSk7IC8vPT4gWyd3cml0ZScsICdtb3JlJywgWyd0ZXN0cyddXVxuICovXG52YXIgYXBwZW5kID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gYXBwZW5kKGVsLCBsaXN0KSB7XG4gIHJldHVybiBfY29uY2F0KGxpc3QsIFtlbF0pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBhcHBlbmQ7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IGFzc29jUGF0aCBmcm9tIFwiLi9hc3NvY1BhdGguanNcIjtcblxuLyoqXG4gKiBNYWtlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYW4gb2JqZWN0LCBzZXR0aW5nIG9yIG92ZXJyaWRpbmcgdGhlIHNwZWNpZmllZFxuICogcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuIE5vdGUgdGhhdCB0aGlzIGNvcGllcyBhbmQgZmxhdHRlbnMgcHJvdG90eXBlXG4gKiBwcm9wZXJ0aWVzIG9udG8gdGhlIG5ldyBvYmplY3QgYXMgd2VsbC4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllcyBhcmVcbiAqIGNvcGllZCBieSByZWZlcmVuY2UuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50XG4gKiBAc2lnIElkeCAtPiBhIC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gcHJvcCBUaGUgcHJvcGVydHkgbmFtZSB0byBzZXRcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSBuZXcgdmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3QgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwgZXhjZXB0IGZvciB0aGUgY2hhbmdlZCBwcm9wZXJ0eS5cbiAqIEBzZWUgUi5kaXNzb2MsIFIucGlja1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYXNzb2MoJ2MnLCAzLCB7YTogMSwgYjogMn0pOyAvLz0+IHthOiAxLCBiOiAyLCBjOiAzfVxuICovXG52YXIgYXNzb2MgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBhc3NvYyhwcm9wLCB2YWwsIG9iaikge1xuICByZXR1cm4gYXNzb2NQYXRoKFtwcm9wXSwgdmFsLCBvYmopO1xufSk7XG5leHBvcnQgZGVmYXVsdCBhc3NvYzsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwiLi9pbnRlcm5hbC9faGFzLmpzXCI7XG5pbXBvcnQgX2lzSW50ZWdlciBmcm9tIFwiLi9pbnRlcm5hbC9faXNJbnRlZ2VyLmpzXCI7XG5pbXBvcnQgX2Fzc29jIGZyb20gXCIuL2ludGVybmFsL19hc3NvYy5qc1wiO1xuaW1wb3J0IGlzTmlsIGZyb20gXCIuL2lzTmlsLmpzXCI7XG5cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdCwgc2V0dGluZyBvciBvdmVycmlkaW5nIHRoZSBub2RlcyByZXF1aXJlZFxuICogdG8gY3JlYXRlIHRoZSBnaXZlbiBwYXRoLCBhbmQgcGxhY2luZyB0aGUgc3BlY2lmaWMgdmFsdWUgYXQgdGhlIHRhaWwgZW5kIG9mXG4gKiB0aGF0IHBhdGguIE5vdGUgdGhhdCB0aGlzIGNvcGllcyBhbmQgZmxhdHRlbnMgcHJvdG90eXBlIHByb3BlcnRpZXMgb250byB0aGVcbiAqIG5ldyBvYmplY3QgYXMgd2VsbC4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllcyBhcmUgY29waWVkIGJ5IHJlZmVyZW5jZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgW0lkeF0gLT4gYSAtPiB7YX0gLT4ge2F9XG4gKiBAcGFyYW0ge0FycmF5fSBwYXRoIHRoZSBwYXRoIHRvIHNldFxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG5ldyB2YWx1ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbCBleGNlcHQgYWxvbmcgdGhlIHNwZWNpZmllZCBwYXRoLlxuICogQHNlZSBSLmRpc3NvY1BhdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFzc29jUGF0aChbJ2EnLCAnYicsICdjJ10sIDQyLCB7YToge2I6IHtjOiAwfX19KTsgLy89PiB7YToge2I6IHtjOiA0Mn19fVxuICpcbiAqICAgICAgLy8gQW55IG1pc3Npbmcgb3Igbm9uLW9iamVjdCBrZXlzIGluIHBhdGggd2lsbCBiZSBvdmVycmlkZGVuXG4gKiAgICAgIFIuYXNzb2NQYXRoKFsnYScsICdiJywgJ2MnXSwgNDIsIHthOiA1fSk7IC8vPT4ge2E6IHtiOiB7YzogNDJ9fX1cbiAqL1xudmFyIGFzc29jUGF0aCA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIGFzc29jUGF0aChwYXRoLCB2YWwsIG9iaikge1xuICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHZhciBpZHggPSBwYXRoWzBdO1xuICBpZiAocGF0aC5sZW5ndGggPiAxKSB7XG4gICAgdmFyIG5leHRPYmogPSAhaXNOaWwob2JqKSAmJiBfaGFzKGlkeCwgb2JqKSAmJiB0eXBlb2Ygb2JqW2lkeF0gPT09ICdvYmplY3QnID8gb2JqW2lkeF0gOiBfaXNJbnRlZ2VyKHBhdGhbMV0pID8gW10gOiB7fTtcbiAgICB2YWwgPSBhc3NvY1BhdGgoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocGF0aCwgMSksIHZhbCwgbmV4dE9iaik7XG4gIH1cbiAgcmV0dXJuIF9hc3NvYyhpZHgsIHZhbCwgb2JqKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgYXNzb2NQYXRoOyIsImltcG9ydCBfYXJpdHkgZnJvbSBcIi4vaW50ZXJuYWwvX2FyaXR5LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgYm91bmQgdG8gYSBjb250ZXh0LlxuICogTm90ZTogYFIuYmluZGAgZG9lcyBub3QgcHJvdmlkZSB0aGUgYWRkaXRpb25hbCBhcmd1bWVudC1iaW5kaW5nIGNhcGFiaWxpdGllcyBvZlxuICogW0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9GdW5jdGlvbi9iaW5kKS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC42LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKiAtPiAqKSAtPiB7Kn0gLT4gKCogLT4gKilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBiaW5kIHRvIGNvbnRleHRcbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzT2JqIFRoZSBjb250ZXh0IHRvIGJpbmQgYGZuYCB0b1xuICogQHJldHVybiB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCB3aWxsIGV4ZWN1dGUgaW4gdGhlIGNvbnRleHQgb2YgYHRoaXNPYmpgLlxuICogQHNlZSBSLnBhcnRpYWxcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBsb2cgPSBSLmJpbmQoY29uc29sZS5sb2csIGNvbnNvbGUpO1xuICogICAgICBSLnBpcGUoUi5hc3NvYygnYScsIDIpLCBSLnRhcChsb2cpLCBSLmFzc29jKCdhJywgMykpKHthOiAxfSk7IC8vPT4ge2E6IDN9XG4gKiAgICAgIC8vIGxvZ3Mge2E6IDJ9XG4gKiBAc3ltYiBSLmJpbmQoZiwgbykoYSwgYikgPSBmLmNhbGwobywgYSwgYilcbiAqL1xudmFyIGJpbmQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBiaW5kKGZuLCB0aGlzT2JqKSB7XG4gIHJldHVybiBfYXJpdHkoZm4ubGVuZ3RoLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNPYmosIGFyZ3VtZW50cyk7XG4gIH0pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBiaW5kOyIsImltcG9ydCBfY2xvbmUgZnJvbSBcIi4vaW50ZXJuYWwvX2Nsb25lLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlZXAgY29weSBvZiB0aGUgc291cmNlIHRoYXQgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIHNvdXJjZVxuICogb2JqZWN0IHdpdGhvdXQgcmV0YWluaW5nIGFueSByZWZlcmVuY2VzIHRvIGl0LlxuICogVGhlIHNvdXJjZSBvYmplY3QgbWF5IGNvbnRhaW4gKG5lc3RlZCkgYEFycmF5YHMgYW5kIGBPYmplY3RgcyxcbiAqIGBOdW1iZXJgcywgYFN0cmluZ2BzLCBgQm9vbGVhbmBzIGFuZCBgRGF0ZWBzLlxuICogYEZ1bmN0aW9uYHMgYXJlIGFzc2lnbmVkIGJ5IHJlZmVyZW5jZSByYXRoZXIgdGhhbiBjb3BpZWQuXG4gKlxuICogRGlzcGF0Y2hlcyB0byBhIGBjbG9uZWAgbWV0aG9kIGlmIHByZXNlbnQuXG4gKlxuICogTm90ZSB0aGF0IGlmIHRoZSBzb3VyY2Ugb2JqZWN0IGhhcyBtdWx0aXBsZSBub2RlcyB0aGF0IHNoYXJlIGEgcmVmZXJlbmNlLFxuICogdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGhhdmUgdGhlIHNhbWUgc3RydWN0dXJlLCBidXQgdGhlIHJlZmVyZW5jZXMgd2lsbFxuICogYmUgcG9pbnRlZCB0byB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBjbG9uZWQgdmFsdWUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHsqfSAtPiB7Kn1cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIG9iamVjdCBvciBhcnJheSB0byBjbG9uZVxuICogQHJldHVybiB7Kn0gQSBkZWVwbHkgY2xvbmVkIGNvcHkgb2YgYHZhbGBcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBvYmplY3RzID0gW3t9LCB7fSwge31dO1xuICogICAgICBjb25zdCBvYmplY3RzQ2xvbmUgPSBSLmNsb25lKG9iamVjdHMpO1xuICogICAgICBvYmplY3RzID09PSBvYmplY3RzQ2xvbmU7IC8vPT4gZmFsc2VcbiAqICAgICAgb2JqZWN0c1swXSA9PT0gb2JqZWN0c0Nsb25lWzBdOyAvLz0+IGZhbHNlXG4gKi9cbnZhciBjbG9uZSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGNsb25lKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZS5jbG9uZSA9PT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLmNsb25lKCkgOiBfY2xvbmUodmFsdWUsIHRydWUpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBjbG9uZTsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5cbi8qKlxuICogTWFrZXMgYSBjb21wYXJhdG9yIGZ1bmN0aW9uIG91dCBvZiBhIGZ1bmN0aW9uIHRoYXQgcmVwb3J0cyB3aGV0aGVyIHRoZSBmaXJzdFxuICogZWxlbWVudCBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKGEsIGIpIC0+IEJvb2xlYW4pIC0+ICgoYSwgYikgLT4gTnVtYmVyKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCBBIHByZWRpY2F0ZSBmdW5jdGlvbiBvZiBhcml0eSB0d28gd2hpY2ggd2lsbCByZXR1cm4gYHRydWVgIGlmIHRoZSBmaXJzdCBhcmd1bWVudFxuICogaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBGdW5jdGlvbiA6OiBhIC0+IGIgLT4gSW50IHRoYXQgcmV0dXJucyBgLTFgIGlmIGEgPCBiLCBgMWAgaWYgYiA8IGEsIG90aGVyd2lzZSBgMGBcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBieUFnZSA9IFIuY29tcGFyYXRvcigoYSwgYikgPT4gYS5hZ2UgPCBiLmFnZSk7XG4gKiAgICAgIGNvbnN0IHBlb3BsZSA9IFtcbiAqICAgICAgICB7IG5hbWU6ICdFbW1hJywgYWdlOiA3MCB9LFxuICogICAgICAgIHsgbmFtZTogJ1BldGVyJywgYWdlOiA3OCB9LFxuICogICAgICAgIHsgbmFtZTogJ01pa2hhaWwnLCBhZ2U6IDYyIH0sXG4gKiAgICAgIF07XG4gKiAgICAgIGNvbnN0IHBlb3BsZUJ5SW5jcmVhc2luZ0FnZSA9IFIuc29ydChieUFnZSwgcGVvcGxlKTtcbiAqICAgICAgICAvLz0+IFt7IG5hbWU6ICdNaWtoYWlsJywgYWdlOiA2MiB9LHsgbmFtZTogJ0VtbWEnLCBhZ2U6IDcwIH0sIHsgbmFtZTogJ1BldGVyJywgYWdlOiA3OCB9XVxuICovXG52YXIgY29tcGFyYXRvciA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGNvbXBhcmF0b3IocHJlZCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gcHJlZChhLCBiKSA/IC0xIDogcHJlZChiLCBhKSA/IDEgOiAwO1xuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBjb21wYXJhdG9yOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9pbnRlcm5hbC9faXNBcnJheS5qc1wiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCIuL2ludGVybmFsL19pc0Z1bmN0aW9uLmpzXCI7XG5pbXBvcnQgX2lzU3RyaW5nIGZyb20gXCIuL2ludGVybmFsL19pc1N0cmluZy5qc1wiO1xuaW1wb3J0IHRvU3RyaW5nIGZyb20gXCIuL3RvU3RyaW5nLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbmNhdGVuYXRpbmcgdGhlIGdpdmVuIGxpc3RzIG9yIHN0cmluZ3MuXG4gKlxuICogTm90ZTogYFIuY29uY2F0YCBleHBlY3RzIGJvdGggYXJndW1lbnRzIHRvIGJlIG9mIHRoZSBzYW1lIHR5cGUsXG4gKiB1bmxpa2UgdGhlIG5hdGl2ZSBgQXJyYXkucHJvdG90eXBlLmNvbmNhdGAgbWV0aG9kLiBJdCB3aWxsIHRocm93XG4gKiBhbiBlcnJvciBpZiB5b3UgYGNvbmNhdGAgYW4gQXJyYXkgd2l0aCBhIG5vbi1BcnJheSB2YWx1ZS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgY29uY2F0YCBtZXRob2Qgb2YgdGhlIGZpcnN0IGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICogQ2FuIGFsc28gY29uY2F0ZW5hdGUgdHdvIG1lbWJlcnMgb2YgYSBbZmFudGFzeS1sYW5kXG4gKiBjb21wYXRpYmxlIHNlbWlncm91cF0oaHR0cHM6Ly9naXRodWIuY29tL2ZhbnRhc3lsYW5kL2ZhbnRhc3ktbGFuZCNzZW1pZ3JvdXApLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFthXSAtPiBbYV1cbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBmaXJzdExpc3QgVGhlIGZpcnN0IGxpc3RcbiAqIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBzZWNvbmRMaXN0IFRoZSBzZWNvbmQgbGlzdFxuICogQHJldHVybiB7QXJyYXl8U3RyaW5nfSBBIGxpc3QgY29uc2lzdGluZyBvZiB0aGUgZWxlbWVudHMgb2YgYGZpcnN0TGlzdGAgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzIG9mXG4gKiBgc2Vjb25kTGlzdGAuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuY29uY2F0KCdBQkMnLCAnREVGJyk7IC8vICdBQkNERUYnXG4gKiAgICAgIFIuY29uY2F0KFs0LCA1LCA2XSwgWzEsIDIsIDNdKTsgLy89PiBbNCwgNSwgNiwgMSwgMiwgM11cbiAqICAgICAgUi5jb25jYXQoW10sIFtdKTsgLy89PiBbXVxuICovXG52YXIgY29uY2F0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gY29uY2F0KGEsIGIpIHtcbiAgaWYgKF9pc0FycmF5KGEpKSB7XG4gICAgaWYgKF9pc0FycmF5KGIpKSB7XG4gICAgICByZXR1cm4gYS5jb25jYXQoYik7XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IodG9TdHJpbmcoYikgKyAnIGlzIG5vdCBhbiBhcnJheScpO1xuICB9XG4gIGlmIChfaXNTdHJpbmcoYSkpIHtcbiAgICBpZiAoX2lzU3RyaW5nKGIpKSB7XG4gICAgICByZXR1cm4gYSArIGI7XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IodG9TdHJpbmcoYikgKyAnIGlzIG5vdCBhIHN0cmluZycpO1xuICB9XG4gIGlmIChhICE9IG51bGwgJiYgX2lzRnVuY3Rpb24oYVsnZmFudGFzeS1sYW5kL2NvbmNhdCddKSkge1xuICAgIHJldHVybiBhWydmYW50YXN5LWxhbmQvY29uY2F0J10oYik7XG4gIH1cbiAgaWYgKGEgIT0gbnVsbCAmJiBfaXNGdW5jdGlvbihhLmNvbmNhdCkpIHtcbiAgICByZXR1cm4gYS5jb25jYXQoYik7XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcih0b1N0cmluZyhhKSArICcgZG9lcyBub3QgaGF2ZSBhIG1ldGhvZCBuYW1lZCBcImNvbmNhdFwiIG9yIFwiZmFudGFzeS1sYW5kL2NvbmNhdFwiJyk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGNvbmNhdDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwiLi9pbnRlcm5hbC9fbWFwLmpzXCI7XG5pbXBvcnQgY3VycnlOIGZyb20gXCIuL2N1cnJ5Ti5qc1wiO1xuaW1wb3J0IG1heCBmcm9tIFwiLi9tYXguanNcIjtcbmltcG9ydCBwbHVjayBmcm9tIFwiLi9wbHVjay5qc1wiO1xuaW1wb3J0IHJlZHVjZSBmcm9tIFwiLi9yZWR1Y2UuanNcIjtcblxuLyoqXG4gKiBBY2NlcHRzIGEgY29udmVyZ2luZyBmdW5jdGlvbiBhbmQgYSBsaXN0IG9mIGJyYW5jaGluZyBmdW5jdGlvbnMgYW5kIHJldHVybnNcbiAqIGEgbmV3IGZ1bmN0aW9uLiBUaGUgYXJpdHkgb2YgdGhlIG5ldyBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgYXJpdHkgb2ZcbiAqIHRoZSBsb25nZXN0IGJyYW5jaGluZyBmdW5jdGlvbi4gV2hlbiBpbnZva2VkLCB0aGlzIG5ldyBmdW5jdGlvbiBpcyBhcHBsaWVkXG4gKiB0byBzb21lIGFyZ3VtZW50cywgYW5kIGVhY2ggYnJhbmNoaW5nIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gdGhvc2Ugc2FtZVxuICogYXJndW1lbnRzLiBUaGUgcmVzdWx0cyBvZiBlYWNoIGJyYW5jaGluZyBmdW5jdGlvbiBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50c1xuICogdG8gdGhlIGNvbnZlcmdpbmcgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgcmV0dXJuIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjQuMlxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgoeDEsIHgyLCAuLi4pIC0+IHopIC0+IFsoKGEsIGIsIC4uLikgLT4geDEpLCAoKGEsIGIsIC4uLikgLT4geDIpLCAuLi5dIC0+IChhIC0+IGIgLT4gLi4uIC0+IHopXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZnRlciBBIGZ1bmN0aW9uLiBgYWZ0ZXJgIHdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSByZXR1cm4gdmFsdWVzIG9mXG4gKiAgICAgICAgYGZuMWAgYW5kIGBmbjJgIGFzIGl0cyBhcmd1bWVudHMuXG4gKiBAcGFyYW0ge0FycmF5fSBmdW5jdGlvbnMgQSBsaXN0IG9mIGZ1bmN0aW9ucy5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldyBmdW5jdGlvbi5cbiAqIEBzZWUgUi51c2VXaXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYXZlcmFnZSA9IFIuY29udmVyZ2UoUi5kaXZpZGUsIFtSLnN1bSwgUi5sZW5ndGhdKVxuICogICAgICBhdmVyYWdlKFsxLCAyLCAzLCA0LCA1LCA2LCA3XSkgLy89PiA0XG4gKlxuICogICAgICBjb25zdCBzdHJhbmdlQ29uY2F0ID0gUi5jb252ZXJnZShSLmNvbmNhdCwgW1IudG9VcHBlciwgUi50b0xvd2VyXSlcbiAqICAgICAgc3RyYW5nZUNvbmNhdChcIllvZGVsXCIpIC8vPT4gXCJZT0RFTHlvZGVsXCJcbiAqXG4gKiBAc3ltYiBSLmNvbnZlcmdlKGYsIFtnLCBoXSkoYSwgYikgPSBmKGcoYSwgYiksIGgoYSwgYikpXG4gKi9cbnZhciBjb252ZXJnZSA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGNvbnZlcmdlKGFmdGVyLCBmbnMpIHtcbiAgcmV0dXJuIGN1cnJ5TihyZWR1Y2UobWF4LCAwLCBwbHVjaygnbGVuZ3RoJywgZm5zKSksIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgcmV0dXJuIGFmdGVyLmFwcGx5KGNvbnRleHQsIF9tYXAoZnVuY3Rpb24gKGZuKSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgfSwgZm5zKSk7XG4gIH0pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBjb252ZXJnZTsiLCJpbXBvcnQgX2FyaXR5IGZyb20gXCIuL2ludGVybmFsL19hcml0eS5qc1wiO1xuaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9jdXJyeU4gZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Ti5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBjdXJyaWVkIGVxdWl2YWxlbnQgb2YgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLCB3aXRoIHRoZSBzcGVjaWZpZWRcbiAqIGFyaXR5LiBUaGUgY3VycmllZCBmdW5jdGlvbiBoYXMgdHdvIHVudXN1YWwgY2FwYWJpbGl0aWVzLiBGaXJzdCwgaXRzXG4gKiBhcmd1bWVudHMgbmVlZG4ndCBiZSBwcm92aWRlZCBvbmUgYXQgYSB0aW1lLiBJZiBgZ2AgaXMgYFIuY3VycnlOKDMsIGYpYCwgdGhlXG4gKiBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEpKDIpKDMpYFxuICogICAtIGBnKDEpKDIsIDMpYFxuICogICAtIGBnKDEsIDIpKDMpYFxuICogICAtIGBnKDEsIDIsIDMpYFxuICpcbiAqIFNlY29uZGx5LCB0aGUgc3BlY2lhbCBwbGFjZWhvbGRlciB2YWx1ZSBbYFIuX19gXSgjX18pIG1heSBiZSB1c2VkIHRvIHNwZWNpZnlcbiAqIFwiZ2Fwc1wiLCBhbGxvd2luZyBwYXJ0aWFsIGFwcGxpY2F0aW9uIG9mIGFueSBjb21iaW5hdGlvbiBvZiBhcmd1bWVudHMsXG4gKiByZWdhcmRsZXNzIG9mIHRoZWlyIHBvc2l0aW9ucy4gSWYgYGdgIGlzIGFzIGFib3ZlIGFuZCBgX2AgaXMgW2BSLl9fYF0oI19fKSxcbiAqIHRoZSBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEsIDIsIDMpYFxuICogICAtIGBnKF8sIDIsIDMpKDEpYFxuICogICAtIGBnKF8sIF8sIDMpKDEpKDIpYFxuICogICAtIGBnKF8sIF8sIDMpKDEsIDIpYFxuICogICAtIGBnKF8sIDIpKDEpKDMpYFxuICogICAtIGBnKF8sIDIpKDEsIDMpYFxuICogICAtIGBnKF8sIDIpKF8sIDMpKDEpYFxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjUuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIE51bWJlciAtPiAoKiAtPiBhKSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgYXJpdHkgZm9yIHRoZSByZXR1cm5lZCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldywgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBzZWUgUi5jdXJyeVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHN1bUFyZ3MgPSAoLi4uYXJncykgPT4gUi5zdW0oYXJncyk7XG4gKlxuICogICAgICBjb25zdCBjdXJyaWVkQWRkRm91ck51bWJlcnMgPSBSLmN1cnJ5Tig0LCBzdW1BcmdzKTtcbiAqICAgICAgY29uc3QgZiA9IGN1cnJpZWRBZGRGb3VyTnVtYmVycygxLCAyKTtcbiAqICAgICAgY29uc3QgZyA9IGYoMyk7XG4gKiAgICAgIGcoNCk7IC8vPT4gMTBcbiAqL1xudmFyIGN1cnJ5TiA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGN1cnJ5TihsZW5ndGgsIGZuKSB7XG4gIGlmIChsZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gX2N1cnJ5MShmbik7XG4gIH1cbiAgcmV0dXJuIF9hcml0eShsZW5ndGgsIF9jdXJyeU4obGVuZ3RoLCBbXSwgZm4pKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgY3VycnlOOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzZWNvbmQgYXJndW1lbnQgaWYgaXQgaXMgbm90IGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYE5hTmA7XG4gKiBvdGhlcndpc2UgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEwLjBcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHNpZyBhIC0+IGIgLT4gYSB8IGJcbiAqIEBwYXJhbSB7YX0gZGVmYXVsdCBUaGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEBwYXJhbSB7Yn0gdmFsIGB2YWxgIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCBvZiBgZGVmYXVsdGAgdW5sZXNzIGB2YWxgIGlzIGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYE5hTmAuXG4gKiBAcmV0dXJuIHsqfSBUaGUgc2Vjb25kIHZhbHVlIGlmIGl0IGlzIG5vdCBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGBOYU5gLCBvdGhlcndpc2UgdGhlIGRlZmF1bHQgdmFsdWVcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBkZWZhdWx0VG80MiA9IFIuZGVmYXVsdFRvKDQyKTtcbiAqXG4gKiAgICAgIGRlZmF1bHRUbzQyKG51bGwpOyAgLy89PiA0MlxuICogICAgICBkZWZhdWx0VG80Mih1bmRlZmluZWQpOyAgLy89PiA0MlxuICogICAgICBkZWZhdWx0VG80MihmYWxzZSk7ICAvLz0+IGZhbHNlXG4gKiAgICAgIGRlZmF1bHRUbzQyKCdSYW1kYScpOyAgLy89PiAnUmFtZGEnXG4gKiAgICAgIC8vIHBhcnNlSW50KCdzdHJpbmcnKSByZXN1bHRzIGluIE5hTlxuICogICAgICBkZWZhdWx0VG80MihwYXJzZUludCgnc3RyaW5nJykpOyAvLz0+IDQyXG4gKi9cbnZhciBkZWZhdWx0VG8gPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBkZWZhdWx0VG8oZCwgdikge1xuICByZXR1cm4gdiA9PSBudWxsIHx8IHYgIT09IHYgPyBkIDogdjtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgZGVmYXVsdFRvOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfU2V0IGZyb20gXCIuL2ludGVybmFsL19TZXQuanNcIjtcblxuLyoqXG4gKiBGaW5kcyB0aGUgc2V0IChpLmUuIG5vIGR1cGxpY2F0ZXMpIG9mIGFsbCBlbGVtZW50cyBpbiB0aGUgZmlyc3QgbGlzdCBub3RcbiAqIGNvbnRhaW5lZCBpbiB0aGUgc2Vjb25kIGxpc3QuIE9iamVjdHMgYW5kIEFycmF5cyBhcmUgY29tcGFyZWQgaW4gdGVybXMgb2ZcbiAqIHZhbHVlIGVxdWFsaXR5LCBub3QgcmVmZXJlbmNlIGVxdWFsaXR5LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIFsqXSAtPiBbKl0gLT4gWypdXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QyIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgZWxlbWVudHMgaW4gYGxpc3QxYCB0aGF0IGFyZSBub3QgaW4gYGxpc3QyYC5cbiAqIEBzZWUgUi5kaWZmZXJlbmNlV2l0aCwgUi5zeW1tZXRyaWNEaWZmZXJlbmNlLCBSLnN5bW1ldHJpY0RpZmZlcmVuY2VXaXRoLCBSLndpdGhvdXRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmRpZmZlcmVuY2UoWzEsMiwzLDRdLCBbNyw2LDUsNCwzXSk7IC8vPT4gWzEsMl1cbiAqICAgICAgUi5kaWZmZXJlbmNlKFs3LDYsNSw0LDNdLCBbMSwyLDMsNF0pOyAvLz0+IFs3LDYsNV1cbiAqICAgICAgUi5kaWZmZXJlbmNlKFt7YTogMX0sIHtiOiAyfV0sIFt7YTogMX0sIHtjOiAzfV0pIC8vPT4gW3tiOiAyfV1cbiAqL1xudmFyIGRpZmZlcmVuY2UgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBkaWZmZXJlbmNlKGZpcnN0LCBzZWNvbmQpIHtcbiAgdmFyIG91dCA9IFtdO1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGZpcnN0TGVuID0gZmlyc3QubGVuZ3RoO1xuICB2YXIgc2Vjb25kTGVuID0gc2Vjb25kLmxlbmd0aDtcbiAgdmFyIHRvRmlsdGVyT3V0ID0gbmV3IF9TZXQoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWNvbmRMZW47IGkgKz0gMSkge1xuICAgIHRvRmlsdGVyT3V0LmFkZChzZWNvbmRbaV0pO1xuICB9XG4gIHdoaWxlIChpZHggPCBmaXJzdExlbikge1xuICAgIGlmICh0b0ZpbHRlck91dC5hZGQoZmlyc3RbaWR4XSkpIHtcbiAgICAgIG91dFtvdXQubGVuZ3RoXSA9IGZpcnN0W2lkeF07XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBvdXQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGRpZmZlcmVuY2U7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGRpc3NvY1BhdGggZnJvbSBcIi4vZGlzc29jUGF0aC5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgZG9lcyBub3QgY29udGFpbiBhIGBwcm9wYCBwcm9wZXJ0eS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIFN0cmluZyAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcCBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZGlzc29jaWF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbCBidXQgd2l0aG91dCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5XG4gKiBAc2VlIFIuYXNzb2MsIFIub21pdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZGlzc29jKCdiJywge2E6IDEsIGI6IDIsIGM6IDN9KTsgLy89PiB7YTogMSwgYzogM31cbiAqL1xudmFyIGRpc3NvYyA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGRpc3NvYyhwcm9wLCBvYmopIHtcbiAgcmV0dXJuIGRpc3NvY1BhdGgoW3Byb3BdLCBvYmopO1xufSk7XG5leHBvcnQgZGVmYXVsdCBkaXNzb2M7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNzb2MgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3NvYy5qc1wiO1xuaW1wb3J0IF9pc0ludGVnZXIgZnJvbSBcIi4vaW50ZXJuYWwvX2lzSW50ZWdlci5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL2ludGVybmFsL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgYXNzb2MgZnJvbSBcIi4vYXNzb2MuanNcIjtcblxuLyoqXG4gKiBNYWtlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYW4gb2JqZWN0LiBOb3RlIHRoYXQgdGhpcyBjb3BpZXMgYW5kIGZsYXR0ZW5zXG4gKiBwcm90b3R5cGUgcHJvcGVydGllcyBvbnRvIHRoZSBuZXcgb2JqZWN0IGFzIHdlbGwuIEFsbCBub24tcHJpbWl0aXZlXG4gKiBwcm9wZXJ0aWVzIGFyZSBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ3xJbnRlZ2VyfSBwcm9wIFRoZSBwcm9wIG9wZXJhdGluZ1xuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R8QXJyYXl9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbC5cbiAqL1xuZnVuY3Rpb24gX3NoYWxsb3dDbG9uZU9iamVjdChwcm9wLCBvYmopIHtcbiAgaWYgKF9pc0ludGVnZXIocHJvcCkgJiYgX2lzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBbXS5jb25jYXQob2JqKTtcbiAgfVxuICB2YXIgcmVzdWx0ID0ge307XG4gIGZvciAodmFyIHAgaW4gb2JqKSB7XG4gICAgcmVzdWx0W3BdID0gb2JqW3BdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdCwgb21pdHRpbmcgdGhlIHByb3BlcnR5IGF0IHRoZSBnaXZlbiBwYXRoLlxuICogTm90ZSB0aGF0IHRoaXMgY29waWVzIGFuZCBmbGF0dGVucyBwcm90b3R5cGUgcHJvcGVydGllcyBvbnRvIHRoZSBuZXcgb2JqZWN0XG4gKiBhcyB3ZWxsLiBBbGwgbm9uLXByaW1pdGl2ZSBwcm9wZXJ0aWVzIGFyZSBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjExLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgW0lkeF0gLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byB0aGUgdmFsdWUgdG8gb21pdFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRob3V0IHRoZSBwcm9wZXJ0eSBhdCBwYXRoXG4gKiBAc2VlIFIuYXNzb2NQYXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5kaXNzb2NQYXRoKFsnYScsICdiJywgJ2MnXSwge2E6IHtiOiB7YzogNDJ9fX0pOyAvLz0+IHthOiB7Yjoge319fVxuICovXG52YXIgZGlzc29jUGF0aCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGRpc3NvY1BhdGgocGF0aCwgb2JqKSB7XG4gIGlmIChvYmogPT0gbnVsbCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgc3dpdGNoIChwYXRoLmxlbmd0aCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBvYmo7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIF9kaXNzb2MocGF0aFswXSwgb2JqKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdmFyIGhlYWQgPSBwYXRoWzBdO1xuICAgICAgdmFyIHRhaWwgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChwYXRoLCAxKTtcbiAgICAgIGlmIChvYmpbaGVhZF0gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gX3NoYWxsb3dDbG9uZU9iamVjdChoZWFkLCBvYmopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFzc29jKGhlYWQsIGRpc3NvY1BhdGgodGFpbCwgb2JqW2hlYWRdKSwgb2JqKTtcbiAgICAgIH1cbiAgfVxufSk7XG5leHBvcnQgZGVmYXVsdCBkaXNzb2NQYXRoOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaXNBcmd1bWVudHMgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJndW1lbnRzLmpzXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJyYXkuanNcIjtcbmltcG9ydCBfaXNPYmplY3QgZnJvbSBcIi4vaW50ZXJuYWwvX2lzT2JqZWN0LmpzXCI7XG5pbXBvcnQgX2lzU3RyaW5nIGZyb20gXCIuL2ludGVybmFsL19pc1N0cmluZy5qc1wiO1xuaW1wb3J0IF9pc1R5cGVkQXJyYXkgZnJvbSBcIi4vaW50ZXJuYWwvX2lzVHlwZWRBcnJheS5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGVtcHR5IHZhbHVlIG9mIGl0cyBhcmd1bWVudCdzIHR5cGUuIFJhbWRhIGRlZmluZXMgdGhlIGVtcHR5XG4gKiB2YWx1ZSBvZiBBcnJheSAoYFtdYCksIE9iamVjdCAoYHt9YCksIFN0cmluZyAoYCcnYCksXG4gKiBUeXBlZEFycmF5IChgVWludDhBcnJheSBbXWAsIGBGbG9hdDMyQXJyYXkgW11gLCBldGMpLCBhbmQgQXJndW1lbnRzLiBPdGhlclxuICogdHlwZXMgYXJlIHN1cHBvcnRlZCBpZiB0aGV5IGRlZmluZSBgPFR5cGU+LmVtcHR5YCxcbiAqIGA8VHlwZT4ucHJvdG90eXBlLmVtcHR5YCBvciBpbXBsZW1lbnQgdGhlXG4gKiBbRmFudGFzeUxhbmQgTW9ub2lkIHNwZWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjbW9ub2lkKS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgZW1wdHlgIG1ldGhvZCBvZiB0aGUgZmlyc3QgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMy4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgYSAtPiBhXG4gKiBAcGFyYW0geyp9IHhcbiAqIEByZXR1cm4geyp9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5lbXB0eShKdXN0KDQyKSk7ICAgICAgICAgICAgICAgLy89PiBOb3RoaW5nKClcbiAqICAgICAgUi5lbXB0eShbMSwgMiwgM10pOyAgICAgICAgICAgICAgLy89PiBbXVxuICogICAgICBSLmVtcHR5KCd1bmljb3JucycpOyAgICAgICAgICAgICAvLz0+ICcnXG4gKiAgICAgIFIuZW1wdHkoe3g6IDEsIHk6IDJ9KTsgICAgICAgICAgIC8vPT4ge31cbiAqICAgICAgUi5lbXB0eShVaW50OEFycmF5LmZyb20oJzEyMycpKTsgLy89PiBVaW50OEFycmF5IFtdXG4gKi9cbnZhciBlbXB0eSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGVtcHR5KHgpIHtcbiAgcmV0dXJuIHggIT0gbnVsbCAmJiB0eXBlb2YgeFsnZmFudGFzeS1sYW5kL2VtcHR5J10gPT09ICdmdW5jdGlvbicgPyB4WydmYW50YXN5LWxhbmQvZW1wdHknXSgpIDogeCAhPSBudWxsICYmIHguY29uc3RydWN0b3IgIT0gbnVsbCAmJiB0eXBlb2YgeC5jb25zdHJ1Y3RvclsnZmFudGFzeS1sYW5kL2VtcHR5J10gPT09ICdmdW5jdGlvbicgPyB4LmNvbnN0cnVjdG9yWydmYW50YXN5LWxhbmQvZW1wdHknXSgpIDogeCAhPSBudWxsICYmIHR5cGVvZiB4LmVtcHR5ID09PSAnZnVuY3Rpb24nID8geC5lbXB0eSgpIDogeCAhPSBudWxsICYmIHguY29uc3RydWN0b3IgIT0gbnVsbCAmJiB0eXBlb2YgeC5jb25zdHJ1Y3Rvci5lbXB0eSA9PT0gJ2Z1bmN0aW9uJyA/IHguY29uc3RydWN0b3IuZW1wdHkoKSA6IF9pc0FycmF5KHgpID8gW10gOiBfaXNTdHJpbmcoeCkgPyAnJyA6IF9pc09iamVjdCh4KSA/IHt9IDogX2lzQXJndW1lbnRzKHgpID8gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBhcmd1bWVudHM7XG4gIH0oKSA6IF9pc1R5cGVkQXJyYXkoeCkgPyB4LmNvbnN0cnVjdG9yLmZyb20oJycpIDogdm9pZCAwIC8vIGVsc2VcbiAgO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGVtcHR5OyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZXF1YWxzIGZyb20gXCIuL2ludGVybmFsL19lcXVhbHMuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBpdHMgYXJndW1lbnRzIGFyZSBlcXVpdmFsZW50LCBgZmFsc2VgIG90aGVyd2lzZS4gSGFuZGxlc1xuICogY3ljbGljYWwgZGF0YSBzdHJ1Y3R1cmVzLlxuICpcbiAqIERpc3BhdGNoZXMgc3ltbWV0cmljYWxseSB0byB0aGUgYGVxdWFsc2AgbWV0aG9kcyBvZiBib3RoIGFyZ3VtZW50cywgaWZcbiAqIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTUuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIGEgLT4gYiAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmVxdWFscygxLCAxKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuZXF1YWxzKDEsICcxJyk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5lcXVhbHMoWzEsIDIsIDNdLCBbMSwgMiwgM10pOyAvLz0+IHRydWVcbiAqXG4gKiAgICAgIGNvbnN0IGEgPSB7fTsgYS52ID0gYTtcbiAqICAgICAgY29uc3QgYiA9IHt9OyBiLnYgPSBiO1xuICogICAgICBSLmVxdWFscyhhLCBiKTsgLy89PiB0cnVlXG4gKi9cbnZhciBlcXVhbHMgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICByZXR1cm4gX2VxdWFscyhhLCBiLCBbXSwgW10pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBlcXVhbHM7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL2ludGVybmFsL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgX2lzT2JqZWN0IGZyb20gXCIuL2ludGVybmFsL19pc09iamVjdC5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IGJ5IHJlY3Vyc2l2ZWx5IGV2b2x2aW5nIGEgc2hhbGxvdyBjb3B5IG9mIGBvYmplY3RgLFxuICogYWNjb3JkaW5nIHRvIHRoZSBgdHJhbnNmb3JtYXRpb25gIGZ1bmN0aW9ucy4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllc1xuICogYXJlIGNvcGllZCBieSByZWZlcmVuY2UuXG4gKlxuICogQSBgdHJhbnNmb3JtYXRpb25gIGZ1bmN0aW9uIHdpbGwgbm90IGJlIGludm9rZWQgaWYgaXRzIGNvcnJlc3BvbmRpbmcga2V5XG4gKiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZXZvbHZlZCBvYmplY3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtrOiAodiAtPiB2KX0gLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtPYmplY3R9IHRyYW5zZm9ybWF0aW9ucyBUaGUgb2JqZWN0IHNwZWNpZnlpbmcgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zIHRvIGFwcGx5XG4gKiAgICAgICAgdG8gdGhlIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSB0cmFuc2Zvcm1lZC5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHRyYW5zZm9ybWVkIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB0b21hdG8gPSB7Zmlyc3ROYW1lOiAnICBUb21hdG8gJywgZGF0YToge2VsYXBzZWQ6IDEwMCwgcmVtYWluaW5nOiAxNDAwfSwgaWQ6MTIzfTtcbiAqICAgICAgY29uc3QgdHJhbnNmb3JtYXRpb25zID0ge1xuICogICAgICAgIGZpcnN0TmFtZTogUi50cmltLFxuICogICAgICAgIGxhc3ROYW1lOiBSLnRyaW0sIC8vIFdpbGwgbm90IGdldCBpbnZva2VkLlxuICogICAgICAgIGRhdGE6IHtlbGFwc2VkOiBSLmFkZCgxKSwgcmVtYWluaW5nOiBSLmFkZCgtMSl9XG4gKiAgICAgIH07XG4gKiAgICAgIFIuZXZvbHZlKHRyYW5zZm9ybWF0aW9ucywgdG9tYXRvKTsgLy89PiB7Zmlyc3ROYW1lOiAnVG9tYXRvJywgZGF0YToge2VsYXBzZWQ6IDEwMSwgcmVtYWluaW5nOiAxMzk5fSwgaWQ6MTIzfVxuICovXG52YXIgZXZvbHZlID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gZXZvbHZlKHRyYW5zZm9ybWF0aW9ucywgb2JqZWN0KSB7XG4gIGlmICghX2lzT2JqZWN0KG9iamVjdCkgJiYgIV9pc0FycmF5KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0O1xuICB9XG4gIHZhciByZXN1bHQgPSBvYmplY3QgaW5zdGFuY2VvZiBBcnJheSA/IFtdIDoge307XG4gIHZhciB0cmFuc2Zvcm1hdGlvbiwga2V5LCB0eXBlO1xuICBmb3IgKGtleSBpbiBvYmplY3QpIHtcbiAgICB0cmFuc2Zvcm1hdGlvbiA9IHRyYW5zZm9ybWF0aW9uc1trZXldO1xuICAgIHR5cGUgPSB0eXBlb2YgdHJhbnNmb3JtYXRpb247XG4gICAgcmVzdWx0W2tleV0gPSB0eXBlID09PSAnZnVuY3Rpb24nID8gdHJhbnNmb3JtYXRpb24ob2JqZWN0W2tleV0pIDogdHJhbnNmb3JtYXRpb24gJiYgdHlwZSA9PT0gJ29iamVjdCcgPyBldm9sdmUodHJhbnNmb3JtYXRpb24sIG9iamVjdFtrZXldKSA6IG9iamVjdFtrZXldO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGV2b2x2ZTsiLCJpbXBvcnQgX2FycmF5UmVkdWNlIGZyb20gXCIuL2ludGVybmFsL19hcnJheVJlZHVjZS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF9maWx0ZXIgZnJvbSBcIi4vaW50ZXJuYWwvX2ZpbHRlci5qc1wiO1xuaW1wb3J0IF9pc09iamVjdCBmcm9tIFwiLi9pbnRlcm5hbC9faXNPYmplY3QuanNcIjtcbmltcG9ydCBfeGZpbHRlciBmcm9tIFwiLi9pbnRlcm5hbC9feGZpbHRlci5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4va2V5cy5qc1wiO1xuXG4vKipcbiAqIFRha2VzIGEgcHJlZGljYXRlIGFuZCBhIGBGaWx0ZXJhYmxlYCwgYW5kIHJldHVybnMgYSBuZXcgZmlsdGVyYWJsZSBvZiB0aGVcbiAqIHNhbWUgdHlwZSBjb250YWluaW5nIHRoZSBtZW1iZXJzIG9mIHRoZSBnaXZlbiBmaWx0ZXJhYmxlIHdoaWNoIHNhdGlzZnkgdGhlXG4gKiBnaXZlbiBwcmVkaWNhdGUuIEZpbHRlcmFibGUgb2JqZWN0cyBpbmNsdWRlIHBsYWluIG9iamVjdHMgb3IgYW55IG9iamVjdFxuICogdGhhdCBoYXMgYSBmaWx0ZXIgbWV0aG9kIHN1Y2ggYXMgYEFycmF5YC5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgZmlsdGVyYCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBGaWx0ZXJhYmxlIGYgPT4gKGEgLT4gQm9vbGVhbikgLT4gZiBhIC0+IGYgYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZFxuICogQHBhcmFtIHtBcnJheX0gZmlsdGVyYWJsZVxuICogQHJldHVybiB7QXJyYXl9IEZpbHRlcmFibGVcbiAqIEBzZWUgUi5yZWplY3QsIFIudHJhbnNkdWNlLCBSLmFkZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgaXNFdmVuID0gbiA9PiBuICUgMiA9PT0gMDtcbiAqXG4gKiAgICAgIFIuZmlsdGVyKGlzRXZlbiwgWzEsIDIsIDMsIDRdKTsgLy89PiBbMiwgNF1cbiAqXG4gKiAgICAgIFIuZmlsdGVyKGlzRXZlbiwge2E6IDEsIGI6IDIsIGM6IDMsIGQ6IDR9KTsgLy89PiB7YjogMiwgZDogNH1cbiAqL1xudmFyIGZpbHRlciA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbJ2ZhbnRhc3ktbGFuZC9maWx0ZXInLCAnZmlsdGVyJ10sIF94ZmlsdGVyLCBmdW5jdGlvbiAocHJlZCwgZmlsdGVyYWJsZSkge1xuICByZXR1cm4gX2lzT2JqZWN0KGZpbHRlcmFibGUpID8gX2FycmF5UmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgIGlmIChwcmVkKGZpbHRlcmFibGVba2V5XSkpIHtcbiAgICAgIGFjY1trZXldID0gZmlsdGVyYWJsZVtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSwga2V5cyhmaWx0ZXJhYmxlKSkgOlxuICAvLyBlbHNlXG4gIF9maWx0ZXIocHJlZCwgZmlsdGVyYWJsZSk7XG59KSk7XG5leHBvcnQgZGVmYXVsdCBmaWx0ZXI7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94ZmluZCBmcm9tIFwiLi9pbnRlcm5hbC9feGZpbmQuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0IHdoaWNoIG1hdGNoZXMgdGhlIHByZWRpY2F0ZSwgb3JcbiAqIGB1bmRlZmluZWRgIGlmIG5vIGVsZW1lbnQgbWF0Y2hlcy5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgZmluZGAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IGEgfCB1bmRlZmluZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGVsZW1lbnQgaXMgdGhlXG4gKiAgICAgICAgZGVzaXJlZCBvbmUuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIGVsZW1lbnQgZm91bmQsIG9yIGB1bmRlZmluZWRgLlxuICogQHNlZSBSLnRyYW5zZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhzID0gW3thOiAxfSwge2E6IDJ9LCB7YTogM31dO1xuICogICAgICBSLmZpbmQoUi5wcm9wRXEoMiwgJ2EnKSkoeHMpOyAvLz0+IHthOiAyfVxuICogICAgICBSLmZpbmQoUi5wcm9wRXEoNCwgJ2EnKSkoeHMpOyAvLz0+IHVuZGVmaW5lZFxuICovXG52YXIgZmluZCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbJ2ZpbmQnXSwgX3hmaW5kLCBmdW5jdGlvbiBmaW5kKGZuLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIGxpc3RbaWR4XTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbn0pKTtcbmV4cG9ydCBkZWZhdWx0IGZpbmQ7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94ZmluZEluZGV4IGZyb20gXCIuL2ludGVybmFsL194ZmluZEluZGV4LmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3Qgd2hpY2ggbWF0Y2hlcyB0aGVcbiAqIHByZWRpY2F0ZSwgb3IgYC0xYCBpZiBubyBlbGVtZW50IG1hdGNoZXMuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMVxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IE51bWJlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgZWxlbWVudCBpcyB0aGVcbiAqIGRlc2lyZWQgb25lLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBmb3VuZCwgb3IgYC0xYC5cbiAqIEBzZWUgUi50cmFuc2R1Y2UsIFIuaW5kZXhPZlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhzID0gW3thOiAxfSwge2E6IDJ9LCB7YTogM31dO1xuICogICAgICBSLmZpbmRJbmRleChSLnByb3BFcSgyLCAnYScpKSh4cyk7IC8vPT4gMVxuICogICAgICBSLmZpbmRJbmRleChSLnByb3BFcSg0LCAnYScpKSh4cyk7IC8vPT4gLTFcbiAqL1xudmFyIGZpbmRJbmRleCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbXSwgX3hmaW5kSW5kZXgsIGZ1bmN0aW9uIGZpbmRJbmRleChmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgaWYgKGZuKGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiAtMTtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IGZpbmRJbmRleDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX21ha2VGbGF0IGZyb20gXCIuL2ludGVybmFsL19tYWtlRmxhdC5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBieSBwdWxsaW5nIGV2ZXJ5IGl0ZW0gb3V0IG9mIGl0IChhbmQgYWxsIGl0cyBzdWItYXJyYXlzKVxuICogYW5kIHB1dHRpbmcgdGhlbSBpbiBhIG5ldyBhcnJheSwgZGVwdGgtZmlyc3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2JdXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgZmxhdHRlbmVkIGxpc3QuXG4gKiBAc2VlIFIudW5uZXN0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5mbGF0dGVuKFsxLCAyLCBbMywgNF0sIDUsIFs2LCBbNywgOCwgWzksIFsxMCwgMTFdLCAxMl1dXV0pO1xuICogICAgICAvLz0+IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyXVxuICovXG52YXIgZmxhdHRlbiA9IC8qI19fUFVSRV9fKi9fY3VycnkxKCAvKiNfX1BVUkVfXyovX21ha2VGbGF0KHRydWUpKTtcbmV4cG9ydCBkZWZhdWx0IGZsYXR0ZW47IiwiaW1wb3J0IF9jaGVja0Zvck1ldGhvZCBmcm9tIFwiLi9pbnRlcm5hbC9fY2hlY2tGb3JNZXRob2QuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gaW5wdXQgYGxpc3RgLCBjYWxsaW5nIGEgcHJvdmlkZWQgZnVuY3Rpb24gYGZuYCBmb3IgZWFjaFxuICogZWxlbWVudCBpbiB0aGUgbGlzdC5cbiAqXG4gKiBgZm5gIHJlY2VpdmVzIG9uZSBhcmd1bWVudDogKih2YWx1ZSkqLlxuICpcbiAqIE5vdGU6IGBSLmZvckVhY2hgIGRvZXMgbm90IHNraXAgZGVsZXRlZCBvciB1bmFzc2lnbmVkIGluZGljZXMgKHNwYXJzZVxuICogYXJyYXlzKSwgdW5saWtlIHRoZSBuYXRpdmUgYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCBtZXRob2QuIEZvciBtb3JlXG4gKiBkZXRhaWxzIG9uIHRoaXMgYmVoYXZpb3IsIHNlZTpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZvckVhY2gjRGVzY3JpcHRpb25cbiAqXG4gKiBBbHNvIG5vdGUgdGhhdCwgdW5saWtlIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAsIFJhbWRhJ3MgYGZvckVhY2hgIHJldHVybnNcbiAqIHRoZSBvcmlnaW5hbCBhcnJheS4gSW4gc29tZSBsaWJyYXJpZXMgdGhpcyBmdW5jdGlvbiBpcyBuYW1lZCBgZWFjaGAuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGZvckVhY2hgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMVxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gKikgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGludm9rZS4gUmVjZWl2ZXMgb25lIGFyZ3VtZW50LCBgdmFsdWVgLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIG9yaWdpbmFsIGxpc3QuXG4gKiBAc2VlIFIuYWRkSW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBwcmludFhQbHVzRml2ZSA9IHggPT4gY29uc29sZS5sb2coeCArIDUpO1xuICogICAgICBSLmZvckVhY2gocHJpbnRYUGx1c0ZpdmUsIFsxLCAyLCAzXSk7IC8vPT4gWzEsIDIsIDNdXG4gKiAgICAgIC8vIGxvZ3MgNlxuICogICAgICAvLyBsb2dzIDdcbiAqICAgICAgLy8gbG9ncyA4XG4gKiBAc3ltYiBSLmZvckVhY2goZiwgW2EsIGIsIGNdKSA9IFthLCBiLCBjXVxuICovXG52YXIgZm9yRWFjaCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2NoZWNrRm9yTWV0aG9kKCdmb3JFYWNoJywgZnVuY3Rpb24gZm9yRWFjaChmbiwgbGlzdCkge1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgZm4obGlzdFtpZHhdKTtcbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gbGlzdDtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IGZvckVhY2g7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4va2V5cy5qc1wiO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBpbnB1dCBgb2JqZWN0YCwgY2FsbGluZyBhIHByb3ZpZGVkIGZ1bmN0aW9uIGBmbmAgZm9yIGVhY2hcbiAqIGtleSBhbmQgdmFsdWUgaW4gdGhlIG9iamVjdC5cbiAqXG4gKiBgZm5gIHJlY2VpdmVzIHRocmVlIGFyZ3VtZW50OiAqKHZhbHVlLCBrZXksIG9iaikqLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIzLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKChhLCBTdHJpbmcsIFN0ck1hcCBhKSAtPiBBbnkpIC0+IFN0ck1hcCBhIC0+IFN0ck1hcCBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLiBSZWNlaXZlcyB0aHJlZSBhcmd1bWVudCwgYHZhbHVlYCwgYGtleWAsIGBvYmpgLlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIG9yaWdpbmFsIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBwcmludEtleUNvbmNhdFZhbHVlID0gKHZhbHVlLCBrZXkpID0+IGNvbnNvbGUubG9nKGtleSArICc6JyArIHZhbHVlKTtcbiAqICAgICAgUi5mb3JFYWNoT2JqSW5kZXhlZChwcmludEtleUNvbmNhdFZhbHVlLCB7eDogMSwgeTogMn0pOyAvLz0+IHt4OiAxLCB5OiAyfVxuICogICAgICAvLyBsb2dzIHg6MVxuICogICAgICAvLyBsb2dzIHk6MlxuICogQHN5bWIgUi5mb3JFYWNoT2JqSW5kZXhlZChmLCB7eDogYSwgeTogYn0pID0ge3g6IGEsIHk6IGJ9XG4gKi9cbnZhciBmb3JFYWNoT2JqSW5kZXhlZCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGZvckVhY2hPYmpJbmRleGVkKGZuLCBvYmopIHtcbiAgdmFyIGtleUxpc3QgPSBrZXlzKG9iaik7XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwga2V5TGlzdC5sZW5ndGgpIHtcbiAgICB2YXIga2V5ID0ga2V5TGlzdFtpZHhdO1xuICAgIGZuKG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgZm9yRWFjaE9iakluZGV4ZWQ7IiwiaW1wb3J0IF9jaGVja0Zvck1ldGhvZCBmcm9tIFwiLi9pbnRlcm5hbC9fY2hlY2tGb3JNZXRob2QuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCByZWR1Y2VCeSBmcm9tIFwiLi9yZWR1Y2VCeS5qc1wiO1xuXG4vKipcbiAqIFNwbGl0cyBhIGxpc3QgaW50byBzdWItbGlzdHMgc3RvcmVkIGluIGFuIG9iamVjdCwgYmFzZWQgb24gdGhlIHJlc3VsdCBvZlxuICogY2FsbGluZyBhIGtleS1yZXR1cm5pbmcgZnVuY3Rpb24gb24gZWFjaCBlbGVtZW50LCBhbmQgZ3JvdXBpbmcgdGhlXG4gKiByZXN1bHRzIGFjY29yZGluZyB0byB2YWx1ZXMgcmV0dXJuZWQuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGdyb3VwQnlgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50IHwgU3ltYm9sXG4gKiBAc2lnIElkeCBhID0+IChiIC0+IGEpIC0+IFtiXSAtPiB7YTogW2JdfVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gOjogYSAtPiBJZHhcbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGdyb3VwXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCB3aXRoIHRoZSBvdXRwdXQgb2YgYGZuYCBmb3Iga2V5cywgbWFwcGVkIHRvIGFycmF5cyBvZiBlbGVtZW50c1xuICogICAgICAgICB0aGF0IHByb2R1Y2VkIHRoYXQga2V5IHdoZW4gcGFzc2VkIHRvIGBmbmAuXG4gKiBAc2VlIFIucmVkdWNlQnksIFIudHJhbnNkdWNlLCBSLmluZGV4QnksIFIuY29sbGVjdEJ5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYnlHcmFkZSA9IFIuZ3JvdXBCeShmdW5jdGlvbihzdHVkZW50KSB7XG4gKiAgICAgICAgY29uc3Qgc2NvcmUgPSBzdHVkZW50LnNjb3JlO1xuICogICAgICAgIHJldHVybiBzY29yZSA8IDY1ID8gJ0YnIDpcbiAqICAgICAgICAgICAgICAgc2NvcmUgPCA3MCA/ICdEJyA6XG4gKiAgICAgICAgICAgICAgIHNjb3JlIDwgODAgPyAnQycgOlxuICogICAgICAgICAgICAgICBzY29yZSA8IDkwID8gJ0InIDogJ0EnO1xuICogICAgICB9KTtcbiAqICAgICAgY29uc3Qgc3R1ZGVudHMgPSBbe25hbWU6ICdBYmJ5Jywgc2NvcmU6IDg0fSxcbiAqICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOiAnRWRkeScsIHNjb3JlOiA1OH0sXG4gKiAgICAgICAgICAgICAgICAgICAgICAvLyAuLi5cbiAqICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOiAnSmFjaycsIHNjb3JlOiA2OX1dO1xuICogICAgICBieUdyYWRlKHN0dWRlbnRzKTtcbiAqICAgICAgLy8ge1xuICogICAgICAvLyAgICdBJzogW3tuYW1lOiAnRGlhbm5lJywgc2NvcmU6IDk5fV0sXG4gKiAgICAgIC8vICAgJ0InOiBbe25hbWU6ICdBYmJ5Jywgc2NvcmU6IDg0fV1cbiAqICAgICAgLy8gICAvLyAuLi4sXG4gKiAgICAgIC8vICAgJ0YnOiBbe25hbWU6ICdFZGR5Jywgc2NvcmU6IDU4fV1cbiAqICAgICAgLy8gfVxuICovXG52YXIgZ3JvdXBCeSA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2NoZWNrRm9yTWV0aG9kKCdncm91cEJ5JywgLyojX19QVVJFX18qL3JlZHVjZUJ5KGZ1bmN0aW9uIChhY2MsIGl0ZW0pIHtcbiAgYWNjLnB1c2goaXRlbSk7XG4gIHJldHVybiBhY2M7XG59LCBbXSkpKTtcbmV4cG9ydCBkZWZhdWx0IGdyb3VwQnk7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGhhc1BhdGggZnJvbSBcIi4vaGFzUGF0aC5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgYW4gb2JqZWN0IGhhcyBhbiBvd24gcHJvcGVydHkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVcbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC43LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgcyAtPiB7czogeH0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtTdHJpbmd9IHByb3AgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNoZWNrIGZvci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgdGhlIHByb3BlcnR5IGV4aXN0cy5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBoYXNOYW1lID0gUi5oYXMoJ25hbWUnKTtcbiAqICAgICAgaGFzTmFtZSh7bmFtZTogJ2FsaWNlJ30pOyAgIC8vPT4gdHJ1ZVxuICogICAgICBoYXNOYW1lKHtuYW1lOiAnYm9iJ30pOyAgICAgLy89PiB0cnVlXG4gKiAgICAgIGhhc05hbWUoe30pOyAgICAgICAgICAgICAgICAvLz0+IGZhbHNlXG4gKlxuICogICAgICBjb25zdCBwb2ludCA9IHt4OiAwLCB5OiAwfTtcbiAqICAgICAgY29uc3QgcG9pbnRIYXMgPSBSLmhhcyhSLl9fLCBwb2ludCk7XG4gKiAgICAgIHBvaW50SGFzKCd4Jyk7ICAvLz0+IHRydWVcbiAqICAgICAgcG9pbnRIYXMoJ3knKTsgIC8vPT4gdHJ1ZVxuICogICAgICBwb2ludEhhcygneicpOyAgLy89PiBmYWxzZVxuICovXG52YXIgaGFzID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gaGFzKHByb3AsIG9iaikge1xuICByZXR1cm4gaGFzUGF0aChbcHJvcF0sIG9iaik7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGhhczsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwiLi9pbnRlcm5hbC9faGFzLmpzXCI7XG5pbXBvcnQgaXNOaWwgZnJvbSBcIi4vaXNOaWwuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGEgcGF0aCBleGlzdHMgaW4gYW4gb2JqZWN0LiBPbmx5IHRoZSBvYmplY3Qnc1xuICogb3duIHByb3BlcnRpZXMgYXJlIGNoZWNrZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjYuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludCB8IFN5bWJvbFxuICogQHNpZyBbSWR4XSAtPiB7YX0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byB1c2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2sgdGhlIHBhdGggaW4uXG4gKiBAcmV0dXJuIHtCb29sZWFufSBXaGV0aGVyIHRoZSBwYXRoIGV4aXN0cy5cbiAqIEBzZWUgUi5oYXNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmhhc1BhdGgoWydhJywgJ2InXSwge2E6IHtiOiAyfX0pOyAgICAgICAgIC8vID0+IHRydWVcbiAqICAgICAgUi5oYXNQYXRoKFsnYScsICdiJ10sIHthOiB7YjogdW5kZWZpbmVkfX0pOyAvLyA9PiB0cnVlXG4gKiAgICAgIFIuaGFzUGF0aChbJ2EnLCAnYiddLCB7YToge2M6IDJ9fSk7ICAgICAgICAgLy8gPT4gZmFsc2VcbiAqICAgICAgUi5oYXNQYXRoKFsnYScsICdiJ10sIHt9KTsgICAgICAgICAgICAgICAgICAvLyA9PiBmYWxzZVxuICovXG52YXIgaGFzUGF0aCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGhhc1BhdGgoX3BhdGgsIG9iaikge1xuICBpZiAoX3BhdGgubGVuZ3RoID09PSAwIHx8IGlzTmlsKG9iaikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHZhbCA9IG9iajtcbiAgdmFyIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBfcGF0aC5sZW5ndGgpIHtcbiAgICBpZiAoIWlzTmlsKHZhbCkgJiYgX2hhcyhfcGF0aFtpZHhdLCB2YWwpKSB7XG4gICAgICB2YWwgPSB2YWxbX3BhdGhbaWR4XV07XG4gICAgICBpZHggKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgaGFzUGF0aDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX2lkZW50aXR5IGZyb20gXCIuL2ludGVybmFsL19pZGVudGl0eS5qc1wiO1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHJldHVybiB0aGUgcGFyYW1ldGVyIHN1cHBsaWVkIHRvIGl0LiBHb29kXG4gKiBhcyBhIGRlZmF1bHQgb3IgcGxhY2Vob2xkZXIgZnVuY3Rpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgYSAtPiBhXG4gKiBAcGFyYW0geyp9IHggVGhlIHZhbHVlIHRvIHJldHVybi5cbiAqIEByZXR1cm4geyp9IFRoZSBpbnB1dCB2YWx1ZSwgYHhgLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaWRlbnRpdHkoMSk7IC8vPT4gMVxuICpcbiAqICAgICAgY29uc3Qgb2JqID0ge307XG4gKiAgICAgIFIuaWRlbnRpdHkob2JqKSA9PT0gb2JqOyAvLz0+IHRydWVcbiAqIEBzeW1iIFIuaWRlbnRpdHkoYSkgPSBhXG4gKi9cbnZhciBpZGVudGl0eSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKF9pZGVudGl0eSk7XG5leHBvcnQgZGVmYXVsdCBpZGVudGl0eTsiLCJpbXBvcnQgX2luY2x1ZGVzIGZyb20gXCIuL2ludGVybmFsL19pbmNsdWRlcy5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgZXF1YWwsIGluIFtgUi5lcXVhbHNgXSgjZXF1YWxzKVxuICogdGVybXMsIHRvIGF0IGxlYXN0IG9uZSBlbGVtZW50IG9mIHRoZSBnaXZlbiBsaXN0OyBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEFsc28gd29ya3Mgd2l0aCBzdHJpbmdzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI2LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIGEgLT4gW2FdIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBpdGVtIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGFuIGVxdWl2YWxlbnQgaXRlbSBpcyBpbiB0aGUgbGlzdCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBAc2VlIFIuYW55XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pbmNsdWRlcygzLCBbMSwgMiwgM10pOyAvLz0+IHRydWVcbiAqICAgICAgUi5pbmNsdWRlcyg0LCBbMSwgMiwgM10pOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaW5jbHVkZXMoeyBuYW1lOiAnRnJlZCcgfSwgW3sgbmFtZTogJ0ZyZWQnIH1dKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaW5jbHVkZXMoWzQyXSwgW1s0Ml1dKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaW5jbHVkZXMoJ2JhJywgJ2JhbmFuYScpOyAvLz0+dHJ1ZVxuICovXG52YXIgaW5jbHVkZXMgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihfaW5jbHVkZXMpO1xuZXhwb3J0IGRlZmF1bHQgaW5jbHVkZXM7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pbmRleE9mIGZyb20gXCIuL2ludGVybmFsL19pbmRleE9mLmpzXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJyYXkuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbiBpdGVtIGluIGFuIGFycmF5LCBvciAtMVxuICogaWYgdGhlIGl0ZW0gaXMgbm90IGluY2x1ZGVkIGluIHRoZSBhcnJheS4gW2BSLmVxdWFsc2BdKCNlcXVhbHMpIGlzIHVzZWQgdG9cbiAqIGRldGVybWluZSBlcXVhbGl0eS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIGEgLT4gW2FdIC0+IE51bWJlclxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIGl0ZW0gdG8gZmluZC5cbiAqIEBwYXJhbSB7QXJyYXl9IHhzIFRoZSBhcnJheSB0byBzZWFyY2ggaW4uXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBpbmRleCBvZiB0aGUgdGFyZ2V0LCBvciAtMSBpZiB0aGUgdGFyZ2V0IGlzIG5vdCBmb3VuZC5cbiAqIEBzZWUgUi5sYXN0SW5kZXhPZiwgUi5maW5kSW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmluZGV4T2YoMywgWzEsMiwzLDRdKTsgLy89PiAyXG4gKiAgICAgIFIuaW5kZXhPZigxMCwgWzEsMiwzLDRdKTsgLy89PiAtMVxuICovXG52YXIgaW5kZXhPZiA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGluZGV4T2YodGFyZ2V0LCB4cykge1xuICByZXR1cm4gdHlwZW9mIHhzLmluZGV4T2YgPT09ICdmdW5jdGlvbicgJiYgIV9pc0FycmF5KHhzKSA/IHhzLmluZGV4T2YodGFyZ2V0KSA6IF9pbmRleE9mKHhzLCB0YXJnZXQsIDApO1xufSk7XG5leHBvcnQgZGVmYXVsdCBpbmRleE9mOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcblxuLyoqXG4gKiBJbnNlcnRzIHRoZSBzdXBwbGllZCBlbGVtZW50IGludG8gdGhlIGxpc3QsIGF0IHRoZSBzcGVjaWZpZWQgYGluZGV4YC4gX05vdGUgdGhhdFxuXG4gKiB0aGlzIGlzIG5vdCBkZXN0cnVjdGl2ZV86IGl0IHJldHVybnMgYSBjb3B5IG9mIHRoZSBsaXN0IHdpdGggdGhlIGNoYW5nZXMuXG4gKiA8c21hbGw+Tm8gbGlzdHMgaGF2ZSBiZWVuIGhhcm1lZCBpbiB0aGUgYXBwbGljYXRpb24gb2YgdGhpcyBmdW5jdGlvbi48L3NtYWxsPlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIuMlxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgTnVtYmVyIC0+IGEgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4IFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSB7Kn0gZWx0IFRoZSBlbGVtZW50IHRvIGluc2VydCBpbnRvIHRoZSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBpbnNlcnQgaW50b1xuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IEFycmF5IHdpdGggYGVsdGAgaW5zZXJ0ZWQgYXQgYGluZGV4YC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmluc2VydCgyLCAneCcsIFsxLDIsMyw0XSk7IC8vPT4gWzEsMiwneCcsMyw0XVxuICovXG52YXIgaW5zZXJ0ID0gLyojX19QVVJFX18qL19jdXJyeTMoZnVuY3Rpb24gaW5zZXJ0KGlkeCwgZWx0LCBsaXN0KSB7XG4gIGlkeCA9IGlkeCA8IGxpc3QubGVuZ3RoICYmIGlkeCA+PSAwID8gaWR4IDogbGlzdC5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCAwKTtcbiAgcmVzdWx0LnNwbGljZShpZHgsIDAsIGVsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGluc2VydDsiLCJpbXBvcnQgX2luY2x1ZGVzIGZyb20gXCIuL19pbmNsdWRlcy5qc1wiO1xudmFyIF9TZXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBfU2V0KCkge1xuICAgIC8qIGdsb2JhbHMgU2V0ICovXG4gICAgdGhpcy5fbmF0aXZlU2V0ID0gdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBTZXQoKSA6IG51bGw7XG4gICAgdGhpcy5faXRlbXMgPSB7fTtcbiAgfVxuICAvLyB1bnRpbCB3ZSBmaWd1cmUgb3V0IHdoeSBqc2RvYyBjaG9rZXMgb24gdGhpc1xuICAvLyBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byBhZGQgdG8gdGhlIFNldFxuICAvLyBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaXRlbSBkaWQgbm90IGV4aXN0IHByaW9yLCBvdGhlcndpc2UgZmFsc2VcbiAgLy9cbiAgX1NldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICByZXR1cm4gIWhhc09yQWRkKGl0ZW0sIHRydWUsIHRoaXMpO1xuICB9O1xuXG4gIC8vXG4gIC8vIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRvIGNoZWNrIGZvciBleGlzdGVuY2UgaW4gdGhlIFNldFxuICAvLyBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaXRlbSBleGlzdHMgaW4gdGhlIFNldCwgb3RoZXJ3aXNlIGZhbHNlXG4gIC8vXG4gIF9TZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmV0dXJuIGhhc09yQWRkKGl0ZW0sIGZhbHNlLCB0aGlzKTtcbiAgfTtcblxuICAvL1xuICAvLyBDb21iaW5lcyB0aGUgbG9naWMgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gaXRlbSBpcyBhIG1lbWJlciBvZiB0aGUgc2V0IGFuZFxuICAvLyBmb3IgYWRkaW5nIGEgbmV3IGl0ZW0gdG8gdGhlIHNldC5cbiAgLy9cbiAgLy8gQHBhcmFtIGl0ZW0gICAgICAgVGhlIGl0ZW0gdG8gY2hlY2sgb3IgYWRkIHRvIHRoZSBTZXQgaW5zdGFuY2UuXG4gIC8vIEBwYXJhbSBzaG91bGRBZGQgIElmIHRydWUsIHRoZSBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNldCBpZiBpdCBkb2Vzbid0XG4gIC8vICAgICAgICAgICAgICAgICAgIGFscmVhZHkgZXhpc3QuXG4gIC8vIEBwYXJhbSBzZXQgICAgICAgIFRoZSBzZXQgaW5zdGFuY2UgdG8gY2hlY2sgb3IgYWRkIHRvLlxuICAvLyBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBpdGVtIGFscmVhZHkgZXhpc3RlZCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAvL1xuICByZXR1cm4gX1NldDtcbn0oKTtcbmZ1bmN0aW9uIGhhc09yQWRkKGl0ZW0sIHNob3VsZEFkZCwgc2V0KSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGl0ZW07XG4gIHZhciBwcmV2U2l6ZSwgbmV3U2l6ZTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiArMCBhbmQgLTBcbiAgICAgIGlmIChpdGVtID09PSAwICYmIDEgLyBpdGVtID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgaWYgKHNldC5faXRlbXNbJy0wJ10pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBzZXQuX2l0ZW1zWyctMCddID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyB0aGVzZSB0eXBlcyBjYW4gYWxsIHV0aWxpc2UgdGhlIG5hdGl2ZSBTZXRcbiAgICAgIGlmIChzZXQuX25hdGl2ZVNldCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgcHJldlNpemUgPSBzZXQuX25hdGl2ZVNldC5zaXplO1xuICAgICAgICAgIHNldC5fbmF0aXZlU2V0LmFkZChpdGVtKTtcbiAgICAgICAgICBuZXdTaXplID0gc2V0Ll9uYXRpdmVTZXQuc2l6ZTtcbiAgICAgICAgICByZXR1cm4gbmV3U2l6ZSA9PT0gcHJldlNpemU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHNldC5fbmF0aXZlU2V0LmhhcyhpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEodHlwZSBpbiBzZXQuX2l0ZW1zKSkge1xuICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0gPSB7fTtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV1baXRlbV0gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbiBzZXQuX2l0ZW1zW3R5cGVdKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXVtpdGVtXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgLy8gc2V0Ll9pdGVtc1snYm9vbGVhbiddIGhvbGRzIGEgdHdvIGVsZW1lbnQgYXJyYXlcbiAgICAgIC8vIHJlcHJlc2VudGluZyBbIGZhbHNlRXhpc3RzLCB0cnVlRXhpc3RzIF1cbiAgICAgIGlmICh0eXBlIGluIHNldC5faXRlbXMpIHtcbiAgICAgICAgdmFyIGJJZHggPSBpdGVtID8gMSA6IDA7XG4gICAgICAgIGlmIChzZXQuX2l0ZW1zW3R5cGVdW2JJZHhdKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXVtiSWR4XSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0gPSBpdGVtID8gW2ZhbHNlLCB0cnVlXSA6IFt0cnVlLCBmYWxzZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIC8vIGNvbXBhcmUgZnVuY3Rpb25zIGZvciByZWZlcmVuY2UgZXF1YWxpdHlcbiAgICAgIGlmIChzZXQuX25hdGl2ZVNldCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgcHJldlNpemUgPSBzZXQuX25hdGl2ZVNldC5zaXplO1xuICAgICAgICAgIHNldC5fbmF0aXZlU2V0LmFkZChpdGVtKTtcbiAgICAgICAgICBuZXdTaXplID0gc2V0Ll9uYXRpdmVTZXQuc2l6ZTtcbiAgICAgICAgICByZXR1cm4gbmV3U2l6ZSA9PT0gcHJldlNpemU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHNldC5fbmF0aXZlU2V0LmhhcyhpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEodHlwZSBpbiBzZXQuX2l0ZW1zKSkge1xuICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0gPSBbaXRlbV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIV9pbmNsdWRlcyhpdGVtLCBzZXQuX2l0ZW1zW3R5cGVdKSkge1xuICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0ucHVzaChpdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICBpZiAoc2V0Ll9pdGVtc1t0eXBlXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIGlmIChpdGVtID09PSBudWxsKSB7XG4gICAgICAgIGlmICghc2V0Ll9pdGVtc1snbnVsbCddKSB7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgc2V0Ll9pdGVtc1snbnVsbCddID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gcmVkdWNlIHRoZSBzZWFyY2ggc2l6ZSBvZiBoZXRlcm9nZW5lb3VzIHNldHMgYnkgY3JlYXRpbmcgYnVja2V0c1xuICAgICAgLy8gZm9yIGVhY2ggdHlwZS5cbiAgICAgIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlbSk7XG4gICAgICBpZiAoISh0eXBlIGluIHNldC5faXRlbXMpKSB7XG4gICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0gW2l0ZW1dO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIHNjYW4gdGhyb3VnaCBhbGwgcHJldmlvdXNseSBhcHBsaWVkIGl0ZW1zXG4gICAgICBpZiAoIV9pbmNsdWRlcyhpdGVtLCBzZXQuX2l0ZW1zW3R5cGVdKSkge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXS5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8vIEEgc2ltcGxlIFNldCB0eXBlIHRoYXQgaG9ub3VycyBSLmVxdWFscyBzZW1hbnRpY3NcbmV4cG9ydCBkZWZhdWx0IF9TZXQ7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FyaXR5KG4sIGZuKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4gIHN3aXRjaCAobikge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSwgYTIsIGEzKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSwgYTIsIGEzLCBhNCkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDg6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSA5OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDEwOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmlyc3QgYXJndW1lbnQgdG8gX2FyaXR5IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciBubyBncmVhdGVyIHRoYW4gdGVuJyk7XG4gIH1cbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfYXJyYXlGcm9tSXRlcmF0b3IoaXRlcikge1xuICB2YXIgbGlzdCA9IFtdO1xuICB2YXIgbmV4dDtcbiAgd2hpbGUgKCEobmV4dCA9IGl0ZXIubmV4dCgpKS5kb25lKSB7XG4gICAgbGlzdC5wdXNoKG5leHQudmFsdWUpO1xuICB9XG4gIHJldHVybiBsaXN0O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hcnJheVJlZHVjZShyZWR1Y2VyLCBhY2MsIGxpc3QpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBhY2MgPSByZWR1Y2VyKGFjYywgbGlzdFtpbmRleF0pO1xuICAgIGluZGV4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIGFjYztcbn0iLCJpbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vX2lzQXJyYXkuanNcIjtcbmltcG9ydCBfaXNJbnRlZ2VyIGZyb20gXCIuL19pc0ludGVnZXIuanNcIjtcblxuLyoqXG4gKiBNYWtlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYW4gb2JqZWN0LCBzZXR0aW5nIG9yIG92ZXJyaWRpbmcgdGhlIHNwZWNpZmllZFxuICogcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuIE5vdGUgdGhhdCB0aGlzIGNvcGllcyBhbmQgZmxhdHRlbnMgcHJvdG90eXBlXG4gKiBwcm9wZXJ0aWVzIG9udG8gdGhlIG5ldyBvYmplY3QgYXMgd2VsbC4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllcyBhcmVcbiAqIGNvcGllZCBieSByZWZlcmVuY2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gcHJvcCBUaGUgcHJvcGVydHkgbmFtZSB0byBzZXRcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSBuZXcgdmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fEFycmF5fSBBIG5ldyBvYmplY3QgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwgZXhjZXB0IGZvciB0aGUgY2hhbmdlZCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Fzc29jKHByb3AsIHZhbCwgb2JqKSB7XG4gIGlmIChfaXNJbnRlZ2VyKHByb3ApICYmIF9pc0FycmF5KG9iaikpIHtcbiAgICB2YXIgYXJyID0gW10uY29uY2F0KG9iaik7XG4gICAgYXJyW3Byb3BdID0gdmFsO1xuICAgIHJldHVybiBhcnI7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIG9iaikge1xuICAgIHJlc3VsdFtwXSA9IG9ialtwXTtcbiAgfVxuICByZXN1bHRbcHJvcF0gPSB2YWw7XG4gIHJldHVybiByZXN1bHQ7XG59IiwiaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL19pc0FycmF5LmpzXCI7XG5cbi8qKlxuICogVGhpcyBjaGVja3Mgd2hldGhlciBhIGZ1bmN0aW9uIGhhcyBhIFttZXRob2RuYW1lXSBmdW5jdGlvbi4gSWYgaXQgaXNuJ3QgYW5cbiAqIGFycmF5IGl0IHdpbGwgZXhlY3V0ZSB0aGF0IGZ1bmN0aW9uIG90aGVyd2lzZSBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIHJhbWRhXG4gKiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gcmFtZGEgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2RuYW1lIHByb3BlcnR5IHRvIGNoZWNrIGZvciBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvblxuICogQHJldHVybiB7T2JqZWN0fSBXaGF0ZXZlciB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBtZXRob2QgaXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jaGVja0Zvck1ldGhvZChtZXRob2RuYW1lLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cbiAgICB2YXIgb2JqID0gYXJndW1lbnRzW2xlbmd0aCAtIDFdO1xuICAgIHJldHVybiBfaXNBcnJheShvYmopIHx8IHR5cGVvZiBvYmpbbWV0aG9kbmFtZV0gIT09ICdmdW5jdGlvbicgPyBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogb2JqW21ldGhvZG5hbWVdLmFwcGx5KG9iaiwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCBsZW5ndGggLSAxKSk7XG4gIH07XG59IiwiaW1wb3J0IF9jbG9uZVJlZ0V4cCBmcm9tIFwiLi9fY2xvbmVSZWdFeHAuanNcIjtcbmltcG9ydCB0eXBlIGZyb20gXCIuLi90eXBlLmpzXCI7XG5cbi8qKlxuICogQ29waWVzIGFuIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgY29waWVkXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXAgV2hldGhlciBvciBub3QgdG8gcGVyZm9ybSBkZWVwIGNsb25pbmcuXG4gKiBAcmV0dXJuIHsqfSBUaGUgY29waWVkIHZhbHVlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xvbmUodmFsdWUsIGRlZXAsIG1hcCkge1xuICBtYXAgfHwgKG1hcCA9IG5ldyBfT2JqZWN0TWFwKCkpO1xuXG4gIC8vIHRoaXMgYXZvaWRzIHRoZSBzbG93ZXIgc3dpdGNoIHdpdGggYSBxdWljayBpZiBkZWNpc2lvbiByZW1vdmluZyBzb21lIG1pbGxpc2Vjb25kcyBpbiBlYWNoIHJ1bi5cbiAgaWYgKF9pc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdmFyIGNvcHkgPSBmdW5jdGlvbiBjb3B5KGNvcGllZFZhbHVlKSB7XG4gICAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIGFuZCBzYW1lIHJlZmVyZW5jZXMgb24gdGhlIG9iamVjdCBncmFwaCBhbmQgcmV0dXJuIGl0cyBjb3JyZXNwb25kaW5nIGNsb25lLlxuICAgIHZhciBjYWNoZWRDb3B5ID0gbWFwLmdldCh2YWx1ZSk7XG4gICAgaWYgKGNhY2hlZENvcHkpIHtcbiAgICAgIHJldHVybiBjYWNoZWRDb3B5O1xuICAgIH1cbiAgICBtYXAuc2V0KHZhbHVlLCBjb3BpZWRWYWx1ZSk7XG4gICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSB7XG4gICAgICAgIGNvcGllZFZhbHVlW2tleV0gPSBkZWVwID8gX2Nsb25lKHZhbHVlW2tleV0sIHRydWUsIG1hcCkgOiB2YWx1ZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29waWVkVmFsdWU7XG4gIH07XG4gIHN3aXRjaCAodHlwZSh2YWx1ZSkpIHtcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuIGNvcHkoT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpKSk7XG4gICAgY2FzZSAnQXJyYXknOlxuICAgICAgcmV0dXJuIGNvcHkoQXJyYXkodmFsdWUubGVuZ3RoKSk7XG4gICAgY2FzZSAnRGF0ZSc6XG4gICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUudmFsdWVPZigpKTtcbiAgICBjYXNlICdSZWdFeHAnOlxuICAgICAgcmV0dXJuIF9jbG9uZVJlZ0V4cCh2YWx1ZSk7XG4gICAgY2FzZSAnSW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OENsYW1wZWRBcnJheSc6XG4gICAgY2FzZSAnSW50MTZBcnJheSc6XG4gICAgY2FzZSAnVWludDE2QXJyYXknOlxuICAgIGNhc2UgJ0ludDMyQXJyYXknOlxuICAgIGNhc2UgJ1VpbnQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0NjRBcnJheSc6XG4gICAgY2FzZSAnQmlnSW50NjRBcnJheSc6XG4gICAgY2FzZSAnQmlnVWludDY0QXJyYXknOlxuICAgICAgcmV0dXJuIHZhbHVlLnNsaWNlKCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gX2lzUHJpbWl0aXZlKHBhcmFtKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHBhcmFtO1xuICByZXR1cm4gcGFyYW0gPT0gbnVsbCB8fCB0eXBlICE9ICdvYmplY3QnICYmIHR5cGUgIT0gJ2Z1bmN0aW9uJztcbn1cbnZhciBfT2JqZWN0TWFwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gX09iamVjdE1hcCgpIHtcbiAgICB0aGlzLm1hcCA9IHt9O1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgfVxuICBfT2JqZWN0TWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIHZhciBoYXNoZWRLZXkgPSB0aGlzLmhhc2goa2V5KTtcbiAgICB2YXIgYnVja2V0ID0gdGhpcy5tYXBbaGFzaGVkS2V5XTtcbiAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgdGhpcy5tYXBbaGFzaGVkS2V5XSA9IGJ1Y2tldCA9IFtdO1xuICAgIH1cbiAgICBidWNrZXQucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgIHRoaXMubGVuZ3RoICs9IDE7XG4gIH07XG4gIF9PYmplY3RNYXAucHJvdG90eXBlLmhhc2ggPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGhhc2hlZEtleSA9IFtdO1xuICAgIGZvciAodmFyIHZhbHVlIGluIGtleSkge1xuICAgICAgaGFzaGVkS2V5LnB1c2goT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGtleVt2YWx1ZV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc2hlZEtleS5qb2luKCk7XG4gIH07XG4gIF9PYmplY3RNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAvKipcbiAgICAgKiBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBvYmplY3RzIHRvIGJlIGNsb25lZCBpcyBmYXN0ZXIgdG8ganVzdCBpdGVyYXRlIG92ZXIgdGhlIGl0ZW1zIGluIHRoZSBtYXAganVzdCBiZWNhdXNlIHRoZSBoYXNoIGZ1bmN0aW9uIGlzIHNvIGNvc3RseSxcbiAgICAgKiBvbiBteSB0ZXN0cyB0aGlzIG51bWJlciBpcyAxODAsIGFueXRoaW5nIGFib3ZlIHRoYXQgdXNpbmcgdGhlIGhhc2ggZnVuY3Rpb24gaXMgZmFzdGVyLlxuICAgICAqL1xuICAgIGlmICh0aGlzLmxlbmd0aCA8PSAxODApIHtcbiAgICAgIGZvciAodmFyIHAgaW4gdGhpcy5tYXApIHtcbiAgICAgICAgdmFyIGJ1Y2tldCA9IHRoaXMubWFwW3BdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Y2tldC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIHZhciBlbGVtZW50ID0gYnVja2V0W2ldO1xuICAgICAgICAgIGlmIChlbGVtZW50WzBdID09PSBrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50WzFdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaGFzaGVkS2V5ID0gdGhpcy5oYXNoKGtleSk7XG4gICAgdmFyIGJ1Y2tldCA9IHRoaXMubWFwW2hhc2hlZEtleV07XG4gICAgaWYgKCFidWNrZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWNrZXQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHZhciBlbGVtZW50ID0gYnVja2V0W2ldO1xuICAgICAgaWYgKGVsZW1lbnRbMF0gPT09IGtleSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudFsxXTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBfT2JqZWN0TWFwO1xufSgpOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jbG9uZVJlZ0V4cChwYXR0ZXJuKSB7XG4gIHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4uc291cmNlLCBwYXR0ZXJuLmZsYWdzID8gcGF0dGVybi5mbGFncyA6IChwYXR0ZXJuLmdsb2JhbCA/ICdnJyA6ICcnKSArIChwYXR0ZXJuLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgKyAocGF0dGVybi5tdWx0aWxpbmUgPyAnbScgOiAnJykgKyAocGF0dGVybi5zdGlja3kgPyAneScgOiAnJykgKyAocGF0dGVybi51bmljb2RlID8gJ3UnIDogJycpICsgKHBhdHRlcm4uZG90QWxsID8gJ3MnIDogJycpKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY29tcGxlbWVudChmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICFmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59IiwiLyoqXG4gKiBQcml2YXRlIGBjb25jYXRgIGZ1bmN0aW9uIHRvIG1lcmdlIHR3byBhcnJheS1saWtlIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8QXJndW1lbnRzfSBbc2V0MT1bXV0gQW4gYXJyYXktbGlrZSBvYmplY3QuXG4gKiBAcGFyYW0ge0FycmF5fEFyZ3VtZW50c30gW3NldDI9W11dIEFuIGFycmF5LWxpa2Ugb2JqZWN0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3LCBtZXJnZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgX2NvbmNhdChbNCwgNSwgNl0sIFsxLCAyLCAzXSk7IC8vPT4gWzQsIDUsIDYsIDEsIDIsIDNdXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jb25jYXQoc2V0MSwgc2V0Mikge1xuICBzZXQxID0gc2V0MSB8fCBbXTtcbiAgc2V0MiA9IHNldDIgfHwgW107XG4gIHZhciBpZHg7XG4gIHZhciBsZW4xID0gc2V0MS5sZW5ndGg7XG4gIHZhciBsZW4yID0gc2V0Mi5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxlbjEpIHtcbiAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBzZXQxW2lkeF07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxlbjIpIHtcbiAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBzZXQyW2lkeF07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJpbXBvcnQgX2lzQXJyYXlMaWtlIGZyb20gXCIuL19pc0FycmF5TGlrZS5qc1wiO1xudmFyIHN5bUl0ZXJhdG9yID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgPyBTeW1ib2wuaXRlcmF0b3IgOiAnQEBpdGVyYXRvcic7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY3JlYXRlUmVkdWNlKGFycmF5UmVkdWNlLCBtZXRob2RSZWR1Y2UsIGl0ZXJhYmxlUmVkdWNlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBfcmVkdWNlKHhmLCBhY2MsIGxpc3QpIHtcbiAgICBpZiAoX2lzQXJyYXlMaWtlKGxpc3QpKSB7XG4gICAgICByZXR1cm4gYXJyYXlSZWR1Y2UoeGYsIGFjYywgbGlzdCk7XG4gICAgfVxuICAgIGlmIChsaXN0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGlzdFsnZmFudGFzeS1sYW5kL3JlZHVjZSddID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbWV0aG9kUmVkdWNlKHhmLCBhY2MsIGxpc3QsICdmYW50YXN5LWxhbmQvcmVkdWNlJyk7XG4gICAgfVxuICAgIGlmIChsaXN0W3N5bUl0ZXJhdG9yXSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gaXRlcmFibGVSZWR1Y2UoeGYsIGFjYywgbGlzdFtzeW1JdGVyYXRvcl0oKSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGlzdC5uZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaXRlcmFibGVSZWR1Y2UoeGYsIGFjYywgbGlzdCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGlzdC5yZWR1Y2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBtZXRob2RSZWR1Y2UoeGYsIGFjYywgbGlzdCwgJ3JlZHVjZScpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWR1Y2U6IGxpc3QgbXVzdCBiZSBhcnJheSBvciBpdGVyYWJsZScpO1xuICB9O1xufSIsImltcG9ydCBfaXNQbGFjZWhvbGRlciBmcm9tIFwiLi9faXNQbGFjZWhvbGRlci5qc1wiO1xuXG4vKipcbiAqIE9wdGltaXplZCBpbnRlcm5hbCBvbmUtYXJpdHkgY3VycnkgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBjdXJyaWVkIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY3VycnkxKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmMShhKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDAgfHwgX2lzUGxhY2Vob2xkZXIoYSkpIHtcbiAgICAgIHJldHVybiBmMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9O1xufSIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaXNQbGFjZWhvbGRlciBmcm9tIFwiLi9faXNQbGFjZWhvbGRlci5qc1wiO1xuXG4vKipcbiAqIE9wdGltaXplZCBpbnRlcm5hbCB0d28tYXJpdHkgY3VycnkgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBjdXJyaWVkIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY3VycnkyKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmMihhLCBiKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiBmMjtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpID8gZjIgOiBfY3VycnkxKGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgIHJldHVybiBmbihhLCBfYik7XG4gICAgICAgIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGIpID8gZjIgOiBfaXNQbGFjZWhvbGRlcihhKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKF9hLCBiKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iKTtcbiAgICAgICAgfSkgOiBmbihhLCBiKTtcbiAgICB9XG4gIH07XG59IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pc1BsYWNlaG9sZGVyIGZyb20gXCIuL19pc1BsYWNlaG9sZGVyLmpzXCI7XG5cbi8qKlxuICogT3B0aW1pemVkIGludGVybmFsIHRocmVlLWFyaXR5IGN1cnJ5IGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2N1cnJ5Myhmbikge1xuICByZXR1cm4gZnVuY3Rpb24gZjMoYSwgYiwgYykge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gZjM7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSA/IGYzIDogX2N1cnJ5MihmdW5jdGlvbiAoX2IsIF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iLCBfYyk7XG4gICAgICAgIH0pO1xuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYikgPyBmMyA6IF9pc1BsYWNlaG9sZGVyKGEpID8gX2N1cnJ5MihmdW5jdGlvbiAoX2EsIF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKF9hLCBiLCBfYyk7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkyKGZ1bmN0aW9uIChfYiwgX2MpIHtcbiAgICAgICAgICByZXR1cm4gZm4oYSwgX2IsIF9jKTtcbiAgICAgICAgfSkgOiBfY3VycnkxKGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgIHJldHVybiBmbihhLCBiLCBfYyk7XG4gICAgICAgIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGIpICYmIF9pc1BsYWNlaG9sZGVyKGMpID8gZjMgOiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTIoZnVuY3Rpb24gKF9hLCBfYikge1xuICAgICAgICAgIHJldHVybiBmbihfYSwgX2IsIGMpO1xuICAgICAgICB9KSA6IF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGMpID8gX2N1cnJ5MihmdW5jdGlvbiAoX2EsIF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKF9hLCBiLCBfYyk7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYikgJiYgX2lzUGxhY2Vob2xkZXIoYykgPyBfY3VycnkyKGZ1bmN0aW9uIChfYiwgX2MpIHtcbiAgICAgICAgICByZXR1cm4gZm4oYSwgX2IsIF9jKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihhKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKF9hLCBiLCBjKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iLCBjKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihjKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIGIsIF9jKTtcbiAgICAgICAgfSkgOiBmbihhLCBiLCBjKTtcbiAgICB9XG4gIH07XG59IiwiaW1wb3J0IF9hcml0eSBmcm9tIFwiLi9fYXJpdHkuanNcIjtcbmltcG9ydCBfaXNQbGFjZWhvbGRlciBmcm9tIFwiLi9faXNQbGFjZWhvbGRlci5qc1wiO1xuXG4vKipcbiAqIEludGVybmFsIGN1cnJ5TiBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gbGVuZ3RoIFRoZSBhcml0eSBvZiB0aGUgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IHJlY2VpdmVkIEFuIGFycmF5IG9mIGFyZ3VtZW50cyByZWNlaXZlZCB0aHVzIGZhci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2N1cnJ5TihsZW5ndGgsIHJlY2VpdmVkLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb21iaW5lZCA9IFtdO1xuICAgIHZhciBhcmdzSWR4ID0gMDtcbiAgICB2YXIgbGVmdCA9IGxlbmd0aDtcbiAgICB2YXIgY29tYmluZWRJZHggPSAwO1xuICAgIHZhciBoYXNQbGFjZWhvbGRlciA9IGZhbHNlO1xuICAgIHdoaWxlIChjb21iaW5lZElkeCA8IHJlY2VpdmVkLmxlbmd0aCB8fCBhcmdzSWR4IDwgYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIGlmIChjb21iaW5lZElkeCA8IHJlY2VpdmVkLmxlbmd0aCAmJiAoIV9pc1BsYWNlaG9sZGVyKHJlY2VpdmVkW2NvbWJpbmVkSWR4XSkgfHwgYXJnc0lkeCA+PSBhcmd1bWVudHMubGVuZ3RoKSkge1xuICAgICAgICByZXN1bHQgPSByZWNlaXZlZFtjb21iaW5lZElkeF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBhcmd1bWVudHNbYXJnc0lkeF07XG4gICAgICAgIGFyZ3NJZHggKz0gMTtcbiAgICAgIH1cbiAgICAgIGNvbWJpbmVkW2NvbWJpbmVkSWR4XSA9IHJlc3VsdDtcbiAgICAgIGlmICghX2lzUGxhY2Vob2xkZXIocmVzdWx0KSkge1xuICAgICAgICBsZWZ0IC09IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYXNQbGFjZWhvbGRlciA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb21iaW5lZElkeCArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gIWhhc1BsYWNlaG9sZGVyICYmIGxlZnQgPD0gMCA/IGZuLmFwcGx5KHRoaXMsIGNvbWJpbmVkKSA6IF9hcml0eShNYXRoLm1heCgwLCBsZWZ0KSwgX2N1cnJ5TihsZW5ndGgsIGNvbWJpbmVkLCBmbikpO1xuICB9O1xufSIsImltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9faXNBcnJheS5qc1wiO1xuaW1wb3J0IF9pc1RyYW5zZm9ybWVyIGZyb20gXCIuL19pc1RyYW5zZm9ybWVyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgZGlzcGF0Y2hlcyB3aXRoIGRpZmZlcmVudCBzdHJhdGVnaWVzIGJhc2VkIG9uIHRoZVxuICogb2JqZWN0IGluIGxpc3QgcG9zaXRpb24gKGxhc3QgYXJndW1lbnQpLiBJZiBpdCBpcyBhbiBhcnJheSwgZXhlY3V0ZXMgW2ZuXS5cbiAqIE90aGVyd2lzZSwgaWYgaXQgaGFzIGEgZnVuY3Rpb24gd2l0aCBvbmUgb2YgdGhlIGdpdmVuIG1ldGhvZCBuYW1lcywgaXQgd2lsbFxuICogZXhlY3V0ZSB0aGF0IGZ1bmN0aW9uIChmdW5jdG9yIGNhc2UpLiBPdGhlcndpc2UsIGlmIGl0IGlzIGEgdHJhbnNmb3JtZXIsXG4gKiB1c2VzIHRyYW5zZHVjZXIgY3JlYXRlZCBieSBbdHJhbnNkdWNlckNyZWF0b3JdIHRvIHJldHVybiBhIG5ldyB0cmFuc2Zvcm1lclxuICogKHRyYW5zZHVjZXIgY2FzZSkuXG4gKiBPdGhlcndpc2UsIGl0IHdpbGwgZGVmYXVsdCB0byBleGVjdXRpbmcgW2ZuXS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gbWV0aG9kTmFtZXMgcHJvcGVydGllcyB0byBjaGVjayBmb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZHVjZXJDcmVhdG9yIHRyYW5zZHVjZXIgZmFjdG9yeSBpZiBvYmplY3QgaXMgdHJhbnNmb3JtZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIGRlZmF1bHQgcmFtZGEgaW1wbGVtZW50YXRpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgZGlzcGF0Y2hlcyBvbiBvYmplY3QgaW4gbGlzdCBwb3NpdGlvblxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZGlzcGF0Y2hhYmxlKG1ldGhvZE5hbWVzLCB0cmFuc2R1Y2VyQ3JlYXRvciwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfVxuICAgIHZhciBvYmogPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgIGlmICghX2lzQXJyYXkob2JqKSkge1xuICAgICAgdmFyIGlkeCA9IDA7XG4gICAgICB3aGlsZSAoaWR4IDwgbWV0aG9kTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW21ldGhvZE5hbWVzW2lkeF1dID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIG9ialttZXRob2ROYW1lc1tpZHhdXS5hcHBseShvYmosIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgLTEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZHggKz0gMTtcbiAgICAgIH1cbiAgICAgIGlmIChfaXNUcmFuc2Zvcm1lcihvYmopKSB7XG4gICAgICAgIHZhciB0cmFuc2R1Y2VyID0gdHJhbnNkdWNlckNyZWF0b3IuYXBwbHkobnVsbCwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSkpO1xuICAgICAgICByZXR1cm4gdHJhbnNkdWNlcihvYmopO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0iLCJpbXBvcnQgX2lzSW50ZWdlciBmcm9tIFwiLi9faXNJbnRlZ2VyLmpzXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vX2lzQXJyYXkuanNcIjtcbmltcG9ydCByZW1vdmUgZnJvbSBcIi4uL3JlbW92ZS5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgZG9lcyBub3QgY29udGFpbiBhIGBwcm9wYCBwcm9wZXJ0eS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBwcm9wIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBkaXNzb2NpYXRlXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gY2xvbmVcbiAqIEByZXR1cm4ge09iamVjdH0gQSBuZXcgb2JqZWN0IGVxdWl2YWxlbnQgdG8gdGhlIG9yaWdpbmFsIGJ1dCB3aXRob3V0IHRoZSBzcGVjaWZpZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Rpc3NvYyhwcm9wLCBvYmopIHtcbiAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICBpZiAoX2lzSW50ZWdlcihwcm9wKSAmJiBfaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIHJlbW92ZShwcm9wLCAxLCBvYmopO1xuICB9XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBvYmopIHtcbiAgICByZXN1bHRbcF0gPSBvYmpbcF07XG4gIH1cbiAgZGVsZXRlIHJlc3VsdFtwcm9wXTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJpbXBvcnQgX2FycmF5RnJvbUl0ZXJhdG9yIGZyb20gXCIuL19hcnJheUZyb21JdGVyYXRvci5qc1wiO1xuaW1wb3J0IF9pbmNsdWRlc1dpdGggZnJvbSBcIi4vX2luY2x1ZGVzV2l0aC5qc1wiO1xuaW1wb3J0IF9mdW5jdGlvbk5hbWUgZnJvbSBcIi4vX2Z1bmN0aW9uTmFtZS5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vX2hhcy5qc1wiO1xuaW1wb3J0IF9vYmplY3RJcyBmcm9tIFwiLi9fb2JqZWN0SXMuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuLi9rZXlzLmpzXCI7XG5pbXBvcnQgdHlwZSBmcm9tIFwiLi4vdHlwZS5qc1wiO1xuXG4vKipcbiAqIHByaXZhdGUgX3VuaXFDb250ZW50RXF1YWxzIGZ1bmN0aW9uLlxuICogVGhhdCBmdW5jdGlvbiBpcyBjaGVja2luZyBlcXVhbGl0eSBvZiAyIGl0ZXJhdG9yIGNvbnRlbnRzIHdpdGggMiBhc3N1bXB0aW9uc1xuICogLSBpdGVyYXRvcnMgbGVuZ3RocyBhcmUgdGhlIHNhbWVcbiAqIC0gaXRlcmF0b3JzIHZhbHVlcyBhcmUgdW5pcXVlXG4gKlxuICogZmFsc2UtcG9zaXRpdmUgcmVzdWx0IHdpbGwgYmUgcmV0dXJuZWQgZm9yIGNvbXBhcmlzb24gb2YsIGUuZy5cbiAqIC0gWzEsMiwzXSBhbmQgWzEsMiwzLDRdXG4gKiAtIFsxLDEsMV0gYW5kIFsxLDIsM11cbiAqICovXG5cbmZ1bmN0aW9uIF91bmlxQ29udGVudEVxdWFscyhhSXRlcmF0b3IsIGJJdGVyYXRvciwgc3RhY2tBLCBzdGFja0IpIHtcbiAgdmFyIGEgPSBfYXJyYXlGcm9tSXRlcmF0b3IoYUl0ZXJhdG9yKTtcbiAgdmFyIGIgPSBfYXJyYXlGcm9tSXRlcmF0b3IoYkl0ZXJhdG9yKTtcbiAgZnVuY3Rpb24gZXEoX2EsIF9iKSB7XG4gICAgcmV0dXJuIF9lcXVhbHMoX2EsIF9iLCBzdGFja0Euc2xpY2UoKSwgc3RhY2tCLnNsaWNlKCkpO1xuICB9XG5cbiAgLy8gaWYgKmEqIGFycmF5IGNvbnRhaW5zIGFueSBlbGVtZW50IHRoYXQgaXMgbm90IGluY2x1ZGVkIGluICpiKlxuICByZXR1cm4gIV9pbmNsdWRlc1dpdGgoZnVuY3Rpb24gKGIsIGFJdGVtKSB7XG4gICAgcmV0dXJuICFfaW5jbHVkZXNXaXRoKGVxLCBhSXRlbSwgYik7XG4gIH0sIGIsIGEpO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2VxdWFscyhhLCBiLCBzdGFja0EsIHN0YWNrQikge1xuICBpZiAoX29iamVjdElzKGEsIGIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIHR5cGVBID0gdHlwZShhKTtcbiAgaWYgKHR5cGVBICE9PSB0eXBlKGIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgYVsnZmFudGFzeS1sYW5kL2VxdWFscyddID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBiWydmYW50YXN5LWxhbmQvZXF1YWxzJ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZW9mIGFbJ2ZhbnRhc3ktbGFuZC9lcXVhbHMnXSA9PT0gJ2Z1bmN0aW9uJyAmJiBhWydmYW50YXN5LWxhbmQvZXF1YWxzJ10oYikgJiYgdHlwZW9mIGJbJ2ZhbnRhc3ktbGFuZC9lcXVhbHMnXSA9PT0gJ2Z1bmN0aW9uJyAmJiBiWydmYW50YXN5LWxhbmQvZXF1YWxzJ10oYSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBhLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgYi5lcXVhbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZW9mIGEuZXF1YWxzID09PSAnZnVuY3Rpb24nICYmIGEuZXF1YWxzKGIpICYmIHR5cGVvZiBiLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJyAmJiBiLmVxdWFscyhhKTtcbiAgfVxuICBzd2l0Y2ggKHR5cGVBKSB7XG4gICAgY2FzZSAnQXJndW1lbnRzJzpcbiAgICBjYXNlICdBcnJheSc6XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIGlmICh0eXBlb2YgYS5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyAmJiBfZnVuY3Rpb25OYW1lKGEuY29uc3RydWN0b3IpID09PSAnUHJvbWlzZScpIHtcbiAgICAgICAgcmV0dXJuIGEgPT09IGI7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdCb29sZWFuJzpcbiAgICBjYXNlICdOdW1iZXInOlxuICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICBpZiAoISh0eXBlb2YgYSA9PT0gdHlwZW9mIGIgJiYgX29iamVjdElzKGEudmFsdWVPZigpLCBiLnZhbHVlT2YoKSkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgaWYgKCFfb2JqZWN0SXMoYS52YWx1ZU9mKCksIGIudmFsdWVPZigpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdFcnJvcic6XG4gICAgICByZXR1cm4gYS5uYW1lID09PSBiLm5hbWUgJiYgYS5tZXNzYWdlID09PSBiLm1lc3NhZ2U7XG4gICAgY2FzZSAnUmVnRXhwJzpcbiAgICAgIGlmICghKGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiYgYS5pZ25vcmVDYXNlID09PSBiLmlnbm9yZUNhc2UgJiYgYS5tdWx0aWxpbmUgPT09IGIubXVsdGlsaW5lICYmIGEuc3RpY2t5ID09PSBiLnN0aWNreSAmJiBhLnVuaWNvZGUgPT09IGIudW5pY29kZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cbiAgdmFyIGlkeCA9IHN0YWNrQS5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICBpZiAoc3RhY2tBW2lkeF0gPT09IGEpIHtcbiAgICAgIHJldHVybiBzdGFja0JbaWR4XSA9PT0gYjtcbiAgICB9XG4gICAgaWR4IC09IDE7XG4gIH1cbiAgc3dpdGNoICh0eXBlQSkge1xuICAgIGNhc2UgJ01hcCc6XG4gICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF91bmlxQ29udGVudEVxdWFscyhhLmVudHJpZXMoKSwgYi5lbnRyaWVzKCksIHN0YWNrQS5jb25jYXQoW2FdKSwgc3RhY2tCLmNvbmNhdChbYl0pKTtcbiAgICBjYXNlICdTZXQnOlxuICAgICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfdW5pcUNvbnRlbnRFcXVhbHMoYS52YWx1ZXMoKSwgYi52YWx1ZXMoKSwgc3RhY2tBLmNvbmNhdChbYV0pLCBzdGFja0IuY29uY2F0KFtiXSkpO1xuICAgIGNhc2UgJ0FyZ3VtZW50cyc6XG4gICAgY2FzZSAnQXJyYXknOlxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgY2FzZSAnQm9vbGVhbic6XG4gICAgY2FzZSAnTnVtYmVyJzpcbiAgICBjYXNlICdTdHJpbmcnOlxuICAgIGNhc2UgJ0RhdGUnOlxuICAgIGNhc2UgJ0Vycm9yJzpcbiAgICBjYXNlICdSZWdFeHAnOlxuICAgIGNhc2UgJ0ludDhBcnJheSc6XG4gICAgY2FzZSAnVWludDhBcnJheSc6XG4gICAgY2FzZSAnVWludDhDbGFtcGVkQXJyYXknOlxuICAgIGNhc2UgJ0ludDE2QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQxNkFycmF5JzpcbiAgICBjYXNlICdJbnQzMkFycmF5JzpcbiAgICBjYXNlICdVaW50MzJBcnJheSc6XG4gICAgY2FzZSAnRmxvYXQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDY0QXJyYXknOlxuICAgIGNhc2UgJ0FycmF5QnVmZmVyJzpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBWYWx1ZXMgb2Ygb3RoZXIgdHlwZXMgYXJlIG9ubHkgZXF1YWwgaWYgaWRlbnRpY2FsLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBrZXlzQSA9IGtleXMoYSk7XG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXMoYikubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBleHRlbmRlZFN0YWNrQSA9IHN0YWNrQS5jb25jYXQoW2FdKTtcbiAgdmFyIGV4dGVuZGVkU3RhY2tCID0gc3RhY2tCLmNvbmNhdChbYl0pO1xuICBpZHggPSBrZXlzQS5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICB2YXIga2V5ID0ga2V5c0FbaWR4XTtcbiAgICBpZiAoIShfaGFzKGtleSwgYikgJiYgX2VxdWFscyhiW2tleV0sIGFba2V5XSwgZXh0ZW5kZWRTdGFja0EsIGV4dGVuZGVkU3RhY2tCKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWR4IC09IDE7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2ZpbHRlcihmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gbGlzdFtpZHhdO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9mdW5jdGlvbk5hbWUoZikge1xuICAvLyBTdHJpbmcoeCA9PiB4KSBldmFsdWF0ZXMgdG8gXCJ4ID0+IHhcIiwgc28gdGhlIHBhdHRlcm4gbWF5IG5vdCBtYXRjaC5cbiAgdmFyIG1hdGNoID0gU3RyaW5nKGYpLm1hdGNoKC9eZnVuY3Rpb24gKFxcdyopLyk7XG4gIHJldHVybiBtYXRjaCA9PSBudWxsID8gJycgOiBtYXRjaFsxXTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaGFzKHByb3AsIG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lkZW50aXR5KHgpIHtcbiAgcmV0dXJuIHg7XG59IiwiaW1wb3J0IF9pbmRleE9mIGZyb20gXCIuL19pbmRleE9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5jbHVkZXMoYSwgbGlzdCkge1xuICByZXR1cm4gX2luZGV4T2YobGlzdCwgYSwgMCkgPj0gMDtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5jbHVkZXNXaXRoKHByZWQsIHgsIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGlmIChwcmVkKHgsIGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59IiwiaW1wb3J0IGVxdWFscyBmcm9tIFwiLi4vZXF1YWxzLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5kZXhPZihsaXN0LCBhLCBpZHgpIHtcbiAgdmFyIGluZiwgaXRlbTtcbiAgLy8gQXJyYXkucHJvdG90eXBlLmluZGV4T2YgZG9lc24ndCBleGlzdCBiZWxvdyBJRTlcbiAgaWYgKHR5cGVvZiBsaXN0LmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBhKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpZiAoYSA9PT0gMCkge1xuICAgICAgICAgIC8vIG1hbnVhbGx5IGNyYXdsIHRoZSBsaXN0IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gKzAgYW5kIC0wXG4gICAgICAgICAgaW5mID0gMSAvIGE7XG4gICAgICAgICAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICBpdGVtID0gbGlzdFtpZHhdO1xuICAgICAgICAgICAgaWYgKGl0ZW0gPT09IDAgJiYgMSAvIGl0ZW0gPT09IGluZikge1xuICAgICAgICAgICAgICByZXR1cm4gaWR4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWR4ICs9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfSBlbHNlIGlmIChhICE9PSBhKSB7XG4gICAgICAgICAgLy8gTmFOXG4gICAgICAgICAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICBpdGVtID0gbGlzdFtpZHhdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJyAmJiBpdGVtICE9PSBpdGVtKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpZHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZHggKz0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vbi16ZXJvIG51bWJlcnMgY2FuIHV0aWxpc2UgU2V0XG4gICAgICAgIHJldHVybiBsaXN0LmluZGV4T2YoYSwgaWR4KTtcblxuICAgICAgLy8gYWxsIHRoZXNlIHR5cGVzIGNhbiB1dGlsaXNlIFNldFxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgcmV0dXJuIGxpc3QuaW5kZXhPZihhLCBpZHgpO1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgaWYgKGEgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBudWxsIGNhbiB1dGlsaXNlIFNldFxuICAgICAgICAgIHJldHVybiBsaXN0LmluZGV4T2YoYSwgaWR4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBhbnl0aGluZyBlbHNlIG5vdCBjb3ZlcmVkIGFib3ZlLCBkZWZlciB0byBSLmVxdWFsc1xuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpZiAoZXF1YWxzKGxpc3RbaWR4XSwgYSkpIHtcbiAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiAtMTtcbn0iLCJpbXBvcnQgX2hhcyBmcm9tIFwiLi9faGFzLmpzXCI7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIF9pc0FyZ3VtZW50cyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFyZ3VtZW50cykgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nID8gZnVuY3Rpb24gX2lzQXJndW1lbnRzKHgpIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG4gIH0gOiBmdW5jdGlvbiBfaXNBcmd1bWVudHMoeCkge1xuICAgIHJldHVybiBfaGFzKCdjYWxsZWUnLCB4KTtcbiAgfTtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IF9pc0FyZ3VtZW50czsiLCIvKipcbiAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IGFuIG9iamVjdCBpcyBhbiBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG9iamVjdCB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB2YWxgIGlzIGFuIGFycmF5LCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBfaXNBcnJheShbXSk7IC8vPT4gdHJ1ZVxuICogICAgICBfaXNBcnJheShudWxsKTsgLy89PiBmYWxzZVxuICogICAgICBfaXNBcnJheSh7fSk7IC8vPT4gZmFsc2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBfaXNBcnJheSh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbC5sZW5ndGggPj0gMCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn07IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgX2lzU3RyaW5nIGZyb20gXCIuL19pc1N0cmluZy5qc1wiO1xuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IGFuIG9iamVjdCBpcyBzaW1pbGFyIHRvIGFuIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgVHlwZVxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKiAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IHggVGhlIG9iamVjdCB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB4YCBoYXMgYSBudW1lcmljIGxlbmd0aCBwcm9wZXJ0eSBhbmQgZXh0cmVtZSBpbmRpY2VzIGRlZmluZWQ7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIF9pc0FycmF5TGlrZShbXSk7IC8vPT4gdHJ1ZVxuICogICAgICBfaXNBcnJheUxpa2UodHJ1ZSk7IC8vPT4gZmFsc2VcbiAqICAgICAgX2lzQXJyYXlMaWtlKHt9KTsgLy89PiBmYWxzZVxuICogICAgICBfaXNBcnJheUxpa2Uoe2xlbmd0aDogMTB9KTsgLy89PiBmYWxzZVxuICogICAgICBfaXNBcnJheUxpa2UoezA6ICd6ZXJvJywgOTogJ25pbmUnLCBsZW5ndGg6IDEwfSk7IC8vPT4gdHJ1ZVxuICogICAgICBfaXNBcnJheUxpa2Uoe25vZGVUeXBlOiAxLCBsZW5ndGg6IDF9KSAvLyA9PiBmYWxzZVxuICovXG52YXIgX2lzQXJyYXlMaWtlID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gaXNBcnJheUxpa2UoeCkge1xuICBpZiAoX2lzQXJyYXkoeCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIXgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoX2lzU3RyaW5nKHgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh4Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh4Lmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4geC5oYXNPd25Qcm9wZXJ0eSgwKSAmJiB4Lmhhc093blByb3BlcnR5KHgubGVuZ3RoIC0gMSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSk7XG5leHBvcnQgZGVmYXVsdCBfaXNBcnJheUxpa2U7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lzRnVuY3Rpb24oeCkge1xuICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KTtcbiAgcmV0dXJuIHR5cGUgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgQXN5bmNHZW5lcmF0b3JGdW5jdGlvbl0nO1xufSIsIi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBwYXNzZWQgYXJndW1lbnQgaXMgYW4gaW50ZWdlci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBuXG4gKiBAY2F0ZWdvcnkgVHlwZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgTnVtYmVyLmlzSW50ZWdlciB8fCBmdW5jdGlvbiBfaXNJbnRlZ2VyKG4pIHtcbiAgcmV0dXJuIG4gPDwgMCA9PT0gbjtcbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lzT2JqZWN0KHgpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lzUGxhY2Vob2xkZXIoYSkge1xuICByZXR1cm4gYSAhPSBudWxsICYmIHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiBhWydAQGZ1bmN0aW9uYWwvcGxhY2Vob2xkZXInXSA9PT0gdHJ1ZTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNTdHJpbmcoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBTdHJpbmddJztcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNUcmFuc2Zvcm1lcihvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIHR5cGVvZiBvYmpbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPT09ICdmdW5jdGlvbic7XG59IiwiLyoqXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCBhbiBvYmplY3QgaXMgYSB0eXBlZCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG9iamVjdCB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB2YWxgIGlzIGEgdHlwZWQgYXJyYXksIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIF9pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkoW10pKTsgLy89PiB0cnVlXG4gKiAgICAgIF9pc1R5cGVkQXJyYXkobmV3IEZsb2F0MzJBcnJheShbXSkpOyAvLz0+IHRydWVcbiAqICAgICAgX2lzVHlwZWRBcnJheShbXSk7IC8vPT4gZmFsc2VcbiAqICAgICAgX2lzVHlwZWRBcnJheShudWxsKTsgLy89PiBmYWxzZVxuICogICAgICBfaXNUeXBlZEFycmF5KHt9KTsgLy89PiBmYWxzZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNUeXBlZEFycmF5KHZhbCkge1xuICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpO1xuICByZXR1cm4gdHlwZSA9PT0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBJbnQ4QXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBVaW50OEFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgSW50MTZBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IFVpbnQxNkFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgSW50MzJBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IFVpbnQzMkFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgQmlnSW50NjRBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEJpZ1VpbnQ2NEFycmF5XSc7XG59IiwiaW1wb3J0IF9pc0FycmF5TGlrZSBmcm9tIFwiLi9faXNBcnJheUxpa2UuanNcIjtcblxuLyoqXG4gKiBgX21ha2VGbGF0YCBpcyBhIGhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBvbmUtbGV2ZWwgb3IgZnVsbHkgcmVjdXJzaXZlXG4gKiBmdW5jdGlvbiBiYXNlZCBvbiB0aGUgZmxhZyBwYXNzZWQgaW4uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX21ha2VGbGF0KHJlY3Vyc2l2ZSkge1xuICByZXR1cm4gZnVuY3Rpb24gZmxhdHQobGlzdCkge1xuICAgIHZhciB2YWx1ZSwgamxlbiwgajtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGlkeCA9IDA7XG4gICAgdmFyIGlsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgICB3aGlsZSAoaWR4IDwgaWxlbikge1xuICAgICAgaWYgKF9pc0FycmF5TGlrZShsaXN0W2lkeF0pKSB7XG4gICAgICAgIHZhbHVlID0gcmVjdXJzaXZlID8gZmxhdHQobGlzdFtpZHhdKSA6IGxpc3RbaWR4XTtcbiAgICAgICAgaiA9IDA7XG4gICAgICAgIGpsZW4gPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgIHdoaWxlIChqIDwgamxlbikge1xuICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlW2pdO1xuICAgICAgICAgIGogKz0gMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gbGlzdFtpZHhdO1xuICAgICAgfVxuICAgICAgaWR4ICs9IDE7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX21hcChmbiwgZnVuY3Rvcikge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGZ1bmN0b3IubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuKTtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIHJlc3VsdFtpZHhdID0gZm4oZnVuY3RvcltpZHhdKTtcbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSIsImltcG9ydCBfaXNTdHJpbmcgZnJvbSBcIi4vX2lzU3RyaW5nLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfbnRoKG9mZnNldCwgbGlzdCkge1xuICB2YXIgaWR4ID0gb2Zmc2V0IDwgMCA/IGxpc3QubGVuZ3RoICsgb2Zmc2V0IDogb2Zmc2V0O1xuICByZXR1cm4gX2lzU3RyaW5nKGxpc3QpID8gbGlzdC5jaGFyQXQoaWR4KSA6IGxpc3RbaWR4XTtcbn0iLCJpbXBvcnQgX2hhcyBmcm9tIFwiLi9faGFzLmpzXCI7XG5cbi8vIEJhc2VkIG9uIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ25cbmZ1bmN0aW9uIF9vYmplY3RBc3NpZ24odGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICB9XG4gIHZhciBvdXRwdXQgPSBPYmplY3QodGFyZ2V0KTtcbiAgdmFyIGlkeCA9IDE7XG4gIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB3aGlsZSAoaWR4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpZHhdO1xuICAgIGlmIChzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgZm9yICh2YXIgbmV4dEtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKF9oYXMobmV4dEtleSwgc291cmNlKSkge1xuICAgICAgICAgIG91dHB1dFtuZXh0S2V5XSA9IHNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuZXhwb3J0IGRlZmF1bHQgdHlwZW9mIE9iamVjdC5hc3NpZ24gPT09ICdmdW5jdGlvbicgPyBPYmplY3QuYXNzaWduIDogX29iamVjdEFzc2lnbjsiLCIvLyBCYXNlZCBvbiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbmZ1bmN0aW9uIF9vYmplY3RJcyhhLCBiKSB7XG4gIC8vIFNhbWVWYWx1ZSBhbGdvcml0aG1cbiAgaWYgKGEgPT09IGIpIHtcbiAgICAvLyBTdGVwcyAxLTUsIDctMTBcbiAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgIHJldHVybiBhICE9PSAwIHx8IDEgLyBhID09PSAxIC8gYjtcbiAgfSBlbHNlIHtcbiAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgIHJldHVybiBhICE9PSBhICYmIGIgIT09IGI7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBfb2JqZWN0SXM7IiwiaW1wb3J0IF9pc0ludGVnZXIgZnJvbSBcIi4vX2lzSW50ZWdlci5qc1wiO1xuaW1wb3J0IF9udGggZnJvbSBcIi4vX250aC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3BhdGgocGF0aEFyLCBvYmopIHtcbiAgdmFyIHZhbCA9IG9iajtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoQXIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhciBwID0gcGF0aEFyW2ldO1xuICAgIGlmIChfaXNJbnRlZ2VyKHApKSB7XG4gICAgICB2YWwgPSBfbnRoKHAsIHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbCA9IHZhbFtwXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfcXVvdGUocykge1xuICB2YXIgZXNjYXBlZCA9IHMucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKS5yZXBsYWNlKC9bXFxiXS9nLCAnXFxcXGInKSAvLyBcXGIgbWF0Y2hlcyB3b3JkIGJvdW5kYXJ5OyBbXFxiXSBtYXRjaGVzIGJhY2tzcGFjZVxuICAucmVwbGFjZSgvXFxmL2csICdcXFxcZicpLnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKS5yZXBsYWNlKC9cXHIvZywgJ1xcXFxyJykucmVwbGFjZSgvXFx0L2csICdcXFxcdCcpLnJlcGxhY2UoL1xcdi9nLCAnXFxcXHYnKS5yZXBsYWNlKC9cXDAvZywgJ1xcXFwwJyk7XG4gIHJldHVybiAnXCInICsgZXNjYXBlZC5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykgKyAnXCInO1xufSIsImltcG9ydCBfYXJyYXlSZWR1Y2UgZnJvbSBcIi4vX2FycmF5UmVkdWNlLmpzXCI7XG5pbXBvcnQgX2NyZWF0ZVJlZHVjZSBmcm9tIFwiLi9fY3JlYXRlUmVkdWNlLmpzXCI7XG5mdW5jdGlvbiBfaXRlcmFibGVSZWR1Y2UocmVkdWNlciwgYWNjLCBpdGVyKSB7XG4gIHZhciBzdGVwID0gaXRlci5uZXh0KCk7XG4gIHdoaWxlICghc3RlcC5kb25lKSB7XG4gICAgYWNjID0gcmVkdWNlcihhY2MsIHN0ZXAudmFsdWUpO1xuICAgIHN0ZXAgPSBpdGVyLm5leHQoKTtcbiAgfVxuICByZXR1cm4gYWNjO1xufVxuZnVuY3Rpb24gX21ldGhvZFJlZHVjZShyZWR1Y2VyLCBhY2MsIG9iaiwgbWV0aG9kTmFtZSkge1xuICByZXR1cm4gb2JqW21ldGhvZE5hbWVdKHJlZHVjZXIsIGFjYyk7XG59XG52YXIgX3JlZHVjZSA9IC8qI19fUFVSRV9fKi9fY3JlYXRlUmVkdWNlKF9hcnJheVJlZHVjZSwgX21ldGhvZFJlZHVjZSwgX2l0ZXJhYmxlUmVkdWNlKTtcbmV4cG9ydCBkZWZhdWx0IF9yZWR1Y2U7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3JlZHVjZWQoeCkge1xuICByZXR1cm4geCAmJiB4WydAQHRyYW5zZHVjZXIvcmVkdWNlZCddID8geCA6IHtcbiAgICAnQEB0cmFuc2R1Y2VyL3ZhbHVlJzogeCxcbiAgICAnQEB0cmFuc2R1Y2VyL3JlZHVjZWQnOiB0cnVlXG4gIH07XG59IiwiLyoqXG4gKiBQb2x5ZmlsbCBmcm9tIDxodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlL3RvSVNPU3RyaW5nPi5cbiAqL1xudmFyIHBhZCA9IGZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiAobiA8IDEwID8gJzAnIDogJycpICsgbjtcbn07XG52YXIgX3RvSVNPU3RyaW5nID0gdHlwZW9mIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID09PSAnZnVuY3Rpb24nID8gZnVuY3Rpb24gX3RvSVNPU3RyaW5nKGQpIHtcbiAgcmV0dXJuIGQudG9JU09TdHJpbmcoKTtcbn0gOiBmdW5jdGlvbiBfdG9JU09TdHJpbmcoZCkge1xuICByZXR1cm4gZC5nZXRVVENGdWxsWWVhcigpICsgJy0nICsgcGFkKGQuZ2V0VVRDTW9udGgoKSArIDEpICsgJy0nICsgcGFkKGQuZ2V0VVRDRGF0ZSgpKSArICdUJyArIHBhZChkLmdldFVUQ0hvdXJzKCkpICsgJzonICsgcGFkKGQuZ2V0VVRDTWludXRlcygpKSArICc6JyArIHBhZChkLmdldFVUQ1NlY29uZHMoKSkgKyAnLicgKyAoZC5nZXRVVENNaWxsaXNlY29uZHMoKSAvIDEwMDApLnRvRml4ZWQoMykuc2xpY2UoMiwgNSkgKyAnWic7XG59O1xuZXhwb3J0IGRlZmF1bHQgX3RvSVNPU3RyaW5nOyIsImltcG9ydCBfaW5jbHVkZXMgZnJvbSBcIi4vX2luY2x1ZGVzLmpzXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwiLi9fbWFwLmpzXCI7XG5pbXBvcnQgX3F1b3RlIGZyb20gXCIuL19xdW90ZS5qc1wiO1xuaW1wb3J0IF90b0lTT1N0cmluZyBmcm9tIFwiLi9fdG9JU09TdHJpbmcuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuLi9rZXlzLmpzXCI7XG5pbXBvcnQgcmVqZWN0IGZyb20gXCIuLi9yZWplY3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90b1N0cmluZyh4LCBzZWVuKSB7XG4gIHZhciByZWN1ciA9IGZ1bmN0aW9uIHJlY3VyKHkpIHtcbiAgICB2YXIgeHMgPSBzZWVuLmNvbmNhdChbeF0pO1xuICAgIHJldHVybiBfaW5jbHVkZXMoeSwgeHMpID8gJzxDaXJjdWxhcj4nIDogX3RvU3RyaW5nKHksIHhzKTtcbiAgfTtcblxuICAvLyAgbWFwUGFpcnMgOjogKE9iamVjdCwgW1N0cmluZ10pIC0+IFtTdHJpbmddXG4gIHZhciBtYXBQYWlycyA9IGZ1bmN0aW9uIChvYmosIGtleXMpIHtcbiAgICByZXR1cm4gX21hcChmdW5jdGlvbiAoaykge1xuICAgICAgcmV0dXJuIF9xdW90ZShrKSArICc6ICcgKyByZWN1cihvYmpba10pO1xuICAgIH0sIGtleXMuc2xpY2UoKS5zb3J0KCkpO1xuICB9O1xuICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSkge1xuICAgIGNhc2UgJ1tvYmplY3QgQXJndW1lbnRzXSc6XG4gICAgICByZXR1cm4gJyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgnICsgX21hcChyZWN1ciwgeCkuam9pbignLCAnKSArICcpKSc7XG4gICAgY2FzZSAnW29iamVjdCBBcnJheV0nOlxuICAgICAgcmV0dXJuICdbJyArIF9tYXAocmVjdXIsIHgpLmNvbmNhdChtYXBQYWlycyh4LCByZWplY3QoZnVuY3Rpb24gKGspIHtcbiAgICAgICAgcmV0dXJuIC9eXFxkKyQvLnRlc3Qoayk7XG4gICAgICB9LCBrZXlzKHgpKSkpLmpvaW4oJywgJykgKyAnXSc7XG4gICAgY2FzZSAnW29iamVjdCBCb29sZWFuXSc6XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdvYmplY3QnID8gJ25ldyBCb29sZWFuKCcgKyByZWN1cih4LnZhbHVlT2YoKSkgKyAnKScgOiB4LnRvU3RyaW5nKCk7XG4gICAgY2FzZSAnW29iamVjdCBEYXRlXSc6XG4gICAgICByZXR1cm4gJ25ldyBEYXRlKCcgKyAoaXNOYU4oeC52YWx1ZU9mKCkpID8gcmVjdXIoTmFOKSA6IF9xdW90ZShfdG9JU09TdHJpbmcoeCkpKSArICcpJztcbiAgICBjYXNlICdbb2JqZWN0IE1hcF0nOlxuICAgICAgcmV0dXJuICduZXcgTWFwKCcgKyByZWN1cihBcnJheS5mcm9tKHgpKSArICcpJztcbiAgICBjYXNlICdbb2JqZWN0IE51bGxdJzpcbiAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgY2FzZSAnW29iamVjdCBOdW1iZXJdJzpcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgPyAnbmV3IE51bWJlcignICsgcmVjdXIoeC52YWx1ZU9mKCkpICsgJyknIDogMSAvIHggPT09IC1JbmZpbml0eSA/ICctMCcgOiB4LnRvU3RyaW5nKDEwKTtcbiAgICBjYXNlICdbb2JqZWN0IFNldF0nOlxuICAgICAgcmV0dXJuICduZXcgU2V0KCcgKyByZWN1cihBcnJheS5mcm9tKHgpLnNvcnQoKSkgKyAnKSc7XG4gICAgY2FzZSAnW29iamVjdCBTdHJpbmddJzpcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgPyAnbmV3IFN0cmluZygnICsgcmVjdXIoeC52YWx1ZU9mKCkpICsgJyknIDogX3F1b3RlKHgpO1xuICAgIGNhc2UgJ1tvYmplY3QgVW5kZWZpbmVkXSc6XG4gICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgeC50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgcmVwciA9IHgudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKHJlcHIgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICAgICAgcmV0dXJuIHJlcHI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAneycgKyBtYXBQYWlycyh4LCBrZXlzKHgpKS5qb2luKCcsICcpICsgJ30nO1xuICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hBcnJheVJlZHVjZSh4ZiwgYWNjLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBhY2MgPSB4ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShhY2MsIGxpc3RbaWR4XSk7XG4gICAgaWYgKGFjYyAmJiBhY2NbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10pIHtcbiAgICAgIGFjYyA9IGFjY1snQEB0cmFuc2R1Y2VyL3ZhbHVlJ107XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10oYWNjKTtcbn0iLCJpbXBvcnQgX2NyZWF0ZVJlZHVjZSBmcm9tIFwiLi9fY3JlYXRlUmVkdWNlLmpzXCI7XG5pbXBvcnQgX3hBcnJheVJlZHVjZSBmcm9tIFwiLi9feEFycmF5UmVkdWNlLmpzXCI7XG5pbXBvcnQgYmluZCBmcm9tIFwiLi4vYmluZC5qc1wiO1xuZnVuY3Rpb24gX3hJdGVyYWJsZVJlZHVjZSh4ZiwgYWNjLCBpdGVyKSB7XG4gIHZhciBzdGVwID0gaXRlci5uZXh0KCk7XG4gIHdoaWxlICghc3RlcC5kb25lKSB7XG4gICAgYWNjID0geGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10oYWNjLCBzdGVwLnZhbHVlKTtcbiAgICBpZiAoYWNjICYmIGFjY1snQEB0cmFuc2R1Y2VyL3JlZHVjZWQnXSkge1xuICAgICAgYWNjID0gYWNjWydAQHRyYW5zZHVjZXIvdmFsdWUnXTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzdGVwID0gaXRlci5uZXh0KCk7XG4gIH1cbiAgcmV0dXJuIHhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10oYWNjKTtcbn1cbmZ1bmN0aW9uIF94TWV0aG9kUmVkdWNlKHhmLCBhY2MsIG9iaiwgbWV0aG9kTmFtZSkge1xuICByZXR1cm4geGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShvYmpbbWV0aG9kTmFtZV0oYmluZCh4ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSwgeGYpLCBhY2MpKTtcbn1cbnZhciBfeFJlZHVjZSA9IC8qI19fUFVSRV9fKi9fY3JlYXRlUmVkdWNlKF94QXJyYXlSZWR1Y2UsIF94TWV0aG9kUmVkdWNlLCBfeEl0ZXJhYmxlUmVkdWNlKTtcbmV4cG9ydCBkZWZhdWx0IF94UmVkdWNlOyIsImltcG9ydCBfcmVkdWNlZCBmcm9tIFwiLi9fcmVkdWNlZC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhBbGwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYQWxsKGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5hbGwgPSB0cnVlO1xuICB9XG4gIFhBbGwucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYQWxsLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGlmICh0aGlzLmFsbCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG4gIFhBbGwucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAoIXRoaXMuZihpbnB1dCkpIHtcbiAgICAgIHRoaXMuYWxsID0gZmFsc2U7XG4gICAgICByZXN1bHQgPSBfcmVkdWNlZCh0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgZmFsc2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIFhBbGw7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeGFsbChmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhBbGwoZiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfcmVkdWNlZCBmcm9tIFwiLi9fcmVkdWNlZC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhBbnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYQW55KGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5hbnkgPSBmYWxzZTtcbiAgfVxuICBYQW55LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWEFueS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICBpZiAoIXRoaXMuYW55KSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG4gIFhBbnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAodGhpcy5mKGlucHV0KSkge1xuICAgICAgdGhpcy5hbnkgPSB0cnVlO1xuICAgICAgcmVzdWx0ID0gX3JlZHVjZWQodGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHRydWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIFhBbnk7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeGFueShmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhBbnkoZiwgeGYpO1xuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvaW5pdCddKCk7XG4gIH0sXG4gIHJlc3VsdDogZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ocmVzdWx0KTtcbiAgfVxufTsiLCJpbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG52YXIgWEZpbHRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhGaWx0ZXIoZiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5mID0gZjtcbiAgfVxuICBYRmlsdGVyLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWEZpbHRlci5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IF94ZkJhc2UucmVzdWx0O1xuICBYRmlsdGVyLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgcmV0dXJuIHRoaXMuZihpbnB1dCkgPyB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgaW5wdXQpIDogcmVzdWx0O1xuICB9O1xuICByZXR1cm4gWEZpbHRlcjtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94ZmlsdGVyKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWEZpbHRlcihmLCB4Zik7XG4gIH07XG59IiwiaW1wb3J0IF9yZWR1Y2VkIGZyb20gXCIuL19yZWR1Y2VkLmpzXCI7XG5pbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG52YXIgWEZpbmQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYRmluZChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICAgIHRoaXMuZm91bmQgPSBmYWxzZTtcbiAgfVxuICBYRmluZC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhGaW5kLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGlmICghdGhpcy5mb3VuZCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHZvaWQgMCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ocmVzdWx0KTtcbiAgfTtcbiAgWEZpbmQucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAodGhpcy5mKGlucHV0KSkge1xuICAgICAgdGhpcy5mb3VuZCA9IHRydWU7XG4gICAgICByZXN1bHQgPSBfcmVkdWNlZCh0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgaW5wdXQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIFhGaW5kO1xufSgpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hmaW5kKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWEZpbmQoZiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfcmVkdWNlZCBmcm9tIFwiLi9fcmVkdWNlZC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhGaW5kSW5kZXggPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYRmluZEluZGV4KGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5pZHggPSAtMTtcbiAgICB0aGlzLmZvdW5kID0gZmFsc2U7XG4gIH1cbiAgWEZpbmRJbmRleC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhGaW5kSW5kZXgucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgaWYgKCF0aGlzLmZvdW5kKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgLTEpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG4gIFhGaW5kSW5kZXgucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICB0aGlzLmlkeCArPSAxO1xuICAgIGlmICh0aGlzLmYoaW5wdXQpKSB7XG4gICAgICB0aGlzLmZvdW5kID0gdHJ1ZTtcbiAgICAgIHJlc3VsdCA9IF9yZWR1Y2VkKHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB0aGlzLmlkeCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICByZXR1cm4gWEZpbmRJbmRleDtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94ZmluZEluZGV4KGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWEZpbmRJbmRleChmLCB4Zik7XG4gIH07XG59IiwiaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhNYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYTWFwKGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gIH1cbiAgWE1hcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhNYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcbiAgWE1hcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdGhpcy5mKGlucHV0KSk7XG4gIH07XG4gIHJldHVybiBYTWFwO1xufSgpO1xudmFyIF94bWFwID0gZnVuY3Rpb24gX3htYXAoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYTWFwKGYsIHhmKTtcbiAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCBfeG1hcDsiLCJpbXBvcnQgX2Nsb25lIGZyb20gXCIuL19jbG9uZS5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vX2hhcy5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhSZWR1Y2VCeSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhSZWR1Y2VCeSh2YWx1ZUZuLCB2YWx1ZUFjYywga2V5Rm4sIHhmKSB7XG4gICAgdGhpcy52YWx1ZUZuID0gdmFsdWVGbjtcbiAgICB0aGlzLnZhbHVlQWNjID0gdmFsdWVBY2M7XG4gICAgdGhpcy5rZXlGbiA9IGtleUZuO1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmlucHV0cyA9IHt9O1xuICB9XG4gIFhSZWR1Y2VCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhSZWR1Y2VCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICB2YXIga2V5O1xuICAgIGZvciAoa2V5IGluIHRoaXMuaW5wdXRzKSB7XG4gICAgICBpZiAoX2hhcyhrZXksIHRoaXMuaW5wdXRzKSkge1xuICAgICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdGhpcy5pbnB1dHNba2V5XSk7XG4gICAgICAgIGlmIChyZXN1bHRbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10pIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHRbJ0BAdHJhbnNkdWNlci92YWx1ZSddO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaW5wdXRzID0gbnVsbDtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG4gIFhSZWR1Y2VCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHZhciBrZXkgPSB0aGlzLmtleUZuKGlucHV0KTtcbiAgICB0aGlzLmlucHV0c1trZXldID0gdGhpcy5pbnB1dHNba2V5XSB8fCBba2V5LCBfY2xvbmUodGhpcy52YWx1ZUFjYywgZmFsc2UpXTtcbiAgICB0aGlzLmlucHV0c1trZXldWzFdID0gdGhpcy52YWx1ZUZuKHRoaXMuaW5wdXRzW2tleV1bMV0sIGlucHV0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICByZXR1cm4gWFJlZHVjZUJ5O1xufSgpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hyZWR1Y2VCeSh2YWx1ZUZuLCB2YWx1ZUFjYywga2V5Rm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWFJlZHVjZUJ5KHZhbHVlRm4sIHZhbHVlQWNjLCBrZXlGbiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfcmVkdWNlZCBmcm9tIFwiLi9fcmVkdWNlZC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhUYWtlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWFRha2UobiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5uID0gbjtcbiAgICB0aGlzLmkgPSAwO1xuICB9XG4gIFhUYWtlLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWFRha2UucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcbiAgWFRha2UucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICB0aGlzLmkgKz0gMTtcbiAgICB2YXIgcmV0ID0gdGhpcy5uID09PSAwID8gcmVzdWx0IDogdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KTtcbiAgICByZXR1cm4gdGhpcy5uID49IDAgJiYgdGhpcy5pID49IHRoaXMubiA/IF9yZWR1Y2VkKHJldCkgOiByZXQ7XG4gIH07XG4gIHJldHVybiBYVGFrZTtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94dGFrZShuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhUYWtlKG4sIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX1NldCBmcm9tIFwiLi9fU2V0LmpzXCI7XG5pbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG52YXIgWFVuaXFCeSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhVbmlxQnkoZiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5mID0gZjtcbiAgICB0aGlzLnNldCA9IG5ldyBfU2V0KCk7XG4gIH1cbiAgWFVuaXFCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhVbmlxQnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcbiAgWFVuaXFCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLnNldC5hZGQodGhpcy5mKGlucHV0KSkgPyB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgaW5wdXQpIDogcmVzdWx0O1xuICB9O1xuICByZXR1cm4gWFVuaXFCeTtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94dW5pcUJ5KGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWFVuaXFCeShmLCB4Zik7XG4gIH07XG59IiwidmFyIFhXcmFwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWFdyYXAoZm4pIHtcbiAgICB0aGlzLmYgPSBmbjtcbiAgfVxuICBYV3JhcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbml0IG5vdCBpbXBsZW1lbnRlZCBvbiBYV3JhcCcpO1xuICB9O1xuICBYV3JhcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChhY2MpIHtcbiAgICByZXR1cm4gYWNjO1xuICB9O1xuICBYV3JhcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAoYWNjLCB4KSB7XG4gICAgcmV0dXJuIHRoaXMuZihhY2MsIHgpO1xuICB9O1xuICByZXR1cm4gWFdyYXA7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeHdyYXAoZm4pIHtcbiAgcmV0dXJuIG5ldyBYV3JhcChmbik7XG59IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9maWx0ZXIgZnJvbSBcIi4vaW50ZXJuYWwvX2ZpbHRlci5qc1wiO1xuaW1wb3J0IF9TZXQgZnJvbSBcIi4vaW50ZXJuYWwvX1NldC5qc1wiO1xuaW1wb3J0IHVuaXEgZnJvbSBcIi4vdW5pcS5qc1wiO1xuXG4vKipcbiAqIENvbWJpbmVzIHR3byBsaXN0cyBpbnRvIGEgc2V0IChpLmUuIG5vIGR1cGxpY2F0ZXMpIGNvbXBvc2VkIG9mIHRob3NlXG4gKiBlbGVtZW50cyBjb21tb24gdG8gYm90aCBsaXN0cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBbKl0gLT4gWypdIC0+IFsqXVxuICogQHBhcmFtIHtBcnJheX0gbGlzdDEgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MiBUaGUgc2Vjb25kIGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGxpc3Qgb2YgZWxlbWVudHMgZm91bmQgaW4gYm90aCBgbGlzdDFgIGFuZCBgbGlzdDJgLlxuICogQHNlZSBSLmlubmVySm9pblxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaW50ZXJzZWN0aW9uKFsxLDIsMyw0XSwgWzcsNiw1LDQsM10pOyAvLz0+IFs0LCAzXVxuICovXG52YXIgaW50ZXJzZWN0aW9uID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gaW50ZXJzZWN0aW9uKGxpc3QxLCBsaXN0Mikge1xuICB2YXIgdG9LZWVwID0gbmV3IF9TZXQoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0MS5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHRvS2VlcC5hZGQobGlzdDFbaV0pO1xuICB9XG4gIHJldHVybiB1bmlxKF9maWx0ZXIodG9LZWVwLmhhcy5iaW5kKHRvS2VlcCksIGxpc3QyKSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGludGVyc2VjdGlvbjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2lzRnVuY3Rpb24gZnJvbSBcIi4vaW50ZXJuYWwvX2lzRnVuY3Rpb24uanNcIjtcbmltcG9ydCBjdXJyeU4gZnJvbSBcIi4vY3VycnlOLmpzXCI7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSBcIi4vdG9TdHJpbmcuanNcIjtcblxuLyoqXG4gKiBHaXZlbiBhbiBgYXJpdHlgIChOdW1iZXIpIGFuZCBhIGBuYW1lYCAoU3RyaW5nKSB0aGUgYGludm9rZXJgIGZ1bmN0aW9uXG4gKiByZXR1cm5zIGEgY3VycmllZCBmdW5jdGlvbiB0aGF0IHRha2VzIGBhcml0eWAgYXJndW1lbnRzIGFuZCBhIGBjb250ZXh0YFxuICogb2JqZWN0LiBJdCB3aWxsIFwiaW52b2tlXCIgdGhlIGBuYW1lYCdkIGZ1bmN0aW9uIChhIG1ldGhvZCkgb24gdGhlIGBjb250ZXh0YFxuICogb2JqZWN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIE51bWJlciAtPiBTdHJpbmcgLT4gKGEgLT4gYiAtPiAuLi4gLT4gbiAtPiBPYmplY3QgLT4gKilcbiAqIEBwYXJhbSB7TnVtYmVyfSBhcml0eSBOdW1iZXIgb2YgYXJndW1lbnRzIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBzaG91bGQgdGFrZVxuICogICAgICAgIGJlZm9yZSB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2QgTmFtZSBvZiBhbnkgb2YgdGhlIHRhcmdldCBvYmplY3QncyBtZXRob2RzIHRvIGNhbGwuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBzZWUgUi5jb25zdHJ1Y3RcbiAqIEBleGFtcGxlXG4gKiAgICAgIC8vIEEgZnVuY3Rpb24gd2l0aCBubyBhcmd1bWVudHNcbiAqICAgICAgY29uc3QgYXNKc29uID0gaW52b2tlcigwLCBcImpzb25cIilcbiAqICAgICAgLy8gSnVzdCBsaWtlIGNhbGxpbmcgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5qc29uKCkpXG4gKiAgICAgIGZldGNoKFwiaHR0cDovL2V4YW1wbGUuY29tL2luZGV4Lmpzb25cIikudGhlbihhc0pzb24pXG4gKlxuICogICAgICAvLyBBIGZ1bmN0aW9uIHdpdGggb25lIGFyZ3VtZW50XG4gKiAgICAgIGNvbnN0IHNsaWNlRnJvbSA9IGludm9rZXIoMSwgJ3NsaWNlJyk7XG4gKiAgICAgIHNsaWNlRnJvbSg2LCAnYWJjZGVmZ2hpamtsbScpOyAvLz0+ICdnaGlqa2xtJ1xuICpcbiAqICAgICAgLy8gQSBmdW5jdGlvbiB3aXRoIHR3byBhcmd1bWVudHNcbiAqICAgICAgY29uc3Qgc2xpY2VGcm9tNiA9IGludm9rZXIoMiwgJ3NsaWNlJykoNik7XG4gKiAgICAgIHNsaWNlRnJvbTYoOCwgJ2FiY2RlZmdoaWprbG0nKTsgLy89PiAnZ2gnXG4gKlxuICogICAgICAvLyBOT1RFOiBZb3UgY2FuJ3Qgc2ltcGx5IHBhc3Mgc29tZSBvZiB0aGUgYXJndW1lbnRzIHRvIHRoZSBpbml0aWFsIGludm9rZXIgZnVuY3Rpb24uXG4gKiAgICAgIGNvbnN0IGZpcnN0Q3JlZGl0Q2FyZFNlY3Rpb24gPSBpbnZva2VyKDIsIFwic2xpY2VcIiwgMCwgNClcbiAqICAgICAgZmlyc3RDcmVkaXRDYXJkU2VjdGlvbihcIjQyNDIgNDI0MiA0MjQyIDQyNDJcIikgLy8gPT4gRnVuY3Rpb248Li4uPlxuICpcbiAqICAgICAgLy8gU2luY2UgaW52b2tlciByZXR1cm5zIGEgY3VycmllZCBmdW5jdGlvbiwgeW91IG1heSBwYXJ0aWFsbHkgYXBwbHkgaXQgdG8gY3JlYXRlIHRoZSBmdW5jdGlvbiB5b3UgbmVlZC5cbiAqICAgICAgY29uc3QgZmlyc3RDcmVkaXRDYXJkU2VjdGlvbiA9IGludm9rZXIoMiwgXCJzbGljZVwiKSgwLCA0KVxuICogICAgICBmaXJzdENyZWRpdENhcmRTZWN0aW9uKFwiNDI0MiA0MjQyIDQyNDIgNDI0MlwiKSAvLyA9PiBcIjQyNDJcIlxuICpcbiAqIEBzeW1iIFIuaW52b2tlcigwLCAnbWV0aG9kJykobykgPSBvWydtZXRob2QnXSgpXG4gKiBAc3ltYiBSLmludm9rZXIoMSwgJ21ldGhvZCcpKGEsIG8pID0gb1snbWV0aG9kJ10oYSlcbiAqIEBzeW1iIFIuaW52b2tlcigyLCAnbWV0aG9kJykoYSwgYiwgbykgPSBvWydtZXRob2QnXShhLCBiKVxuICovXG52YXIgaW52b2tlciA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGludm9rZXIoYXJpdHksIG1ldGhvZCkge1xuICByZXR1cm4gY3VycnlOKGFyaXR5ICsgMSwgZnVuY3Rpb24gKCkge1xuICAgIHZhciB0YXJnZXQgPSBhcmd1bWVudHNbYXJpdHldO1xuICAgIGlmICh0YXJnZXQgIT0gbnVsbCAmJiBfaXNGdW5jdGlvbih0YXJnZXRbbWV0aG9kXSkpIHtcbiAgICAgIHJldHVybiB0YXJnZXRbbWV0aG9kXS5hcHBseSh0YXJnZXQsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgYXJpdHkpKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcih0b1N0cmluZyh0YXJnZXQpICsgJyBkb2VzIG5vdCBoYXZlIGEgbWV0aG9kIG5hbWVkIFwiJyArIG1ldGhvZCArICdcIicpO1xuICB9KTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgaW52b2tlcjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogU2VlIGlmIGFuIG9iamVjdCAoaS5lLiBgdmFsYCkgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN1cHBsaWVkIGNvbnN0cnVjdG9yLiBUaGlzXG4gKiBmdW5jdGlvbiB3aWxsIGNoZWNrIHVwIHRoZSBpbmhlcml0YW5jZSBjaGFpbiwgaWYgYW55LlxuICogSWYgYHZhbGAgd2FzIGNyZWF0ZWQgdXNpbmcgYE9iamVjdC5jcmVhdGVgLCBgUi5pcyhPYmplY3QsIHZhbCkgPT09IHRydWVgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IFR5cGVcbiAqIEBzaWcgKCogLT4geyp9KSAtPiBhIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjdG9yIEEgY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaXMoT2JqZWN0LCB7fSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzKE51bWJlciwgMSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzKE9iamVjdCwgMSk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5pcyhTdHJpbmcsICdzJyk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzKFN0cmluZywgbmV3IFN0cmluZygnJykpOyAvLz0+IHRydWVcbiAqICAgICAgUi5pcyhPYmplY3QsIG5ldyBTdHJpbmcoJycpKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXMoT2JqZWN0LCAncycpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXMoTnVtYmVyLCB7fSk7IC8vPT4gZmFsc2VcbiAqL1xudmFyIGlzID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gaXMoQ3RvciwgdmFsKSB7XG4gIHJldHVybiB2YWwgaW5zdGFuY2VvZiBDdG9yIHx8IHZhbCAhPSBudWxsICYmICh2YWwuY29uc3RydWN0b3IgPT09IEN0b3IgfHwgQ3Rvci5uYW1lID09PSAnT2JqZWN0JyAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jyk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGlzOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBlbXB0eSBmcm9tIFwiLi9lbXB0eS5qc1wiO1xuaW1wb3J0IGVxdWFscyBmcm9tIFwiLi9lcXVhbHMuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgaXRzIHR5cGUncyBlbXB0eSB2YWx1ZTsgYGZhbHNlYFxuICogb3RoZXJ3aXNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExvZ2ljXG4gKiBAc2lnIGEgLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSB4XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHNlZSBSLmVtcHR5LCBSLmlzTm90RW1wdHlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmlzRW1wdHkoWzEsIDIsIDNdKTsgICAgICAgICAgIC8vPT4gZmFsc2VcbiAqICAgICAgUi5pc0VtcHR5KFtdKTsgICAgICAgICAgICAgICAgICAvLz0+IHRydWVcbiAqICAgICAgUi5pc0VtcHR5KCcnKTsgICAgICAgICAgICAgICAgICAvLz0+IHRydWVcbiAqICAgICAgUi5pc0VtcHR5KG51bGwpOyAgICAgICAgICAgICAgICAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXNFbXB0eSh7fSk7ICAgICAgICAgICAgICAgICAgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNFbXB0eSh7bGVuZ3RoOiAwfSk7ICAgICAgICAgLy89PiBmYWxzZVxuICogICAgICBSLmlzRW1wdHkoVWludDhBcnJheS5mcm9tKCcnKSk7IC8vPT4gdHJ1ZVxuICovXG52YXIgaXNFbXB0eSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGlzRW1wdHkoeCkge1xuICByZXR1cm4geCAhPSBudWxsICYmIGVxdWFscyh4LCBlbXB0eSh4KSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGlzRW1wdHk7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgaW5wdXQgdmFsdWUgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjkuMFxuICogQGNhdGVnb3J5IFR5cGVcbiAqIEBzaWcgKiAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IHggVGhlIHZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgYHhgIGlzIGB1bmRlZmluZWRgIG9yIGBudWxsYCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pc05pbChudWxsKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNOaWwodW5kZWZpbmVkKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNOaWwoMCk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5pc05pbChbXSk7IC8vPT4gZmFsc2VcbiAqL1xudmFyIGlzTmlsID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gaXNOaWwoeCkge1xuICByZXR1cm4geCA9PSBudWxsO1xufSk7XG5leHBvcnQgZGVmYXVsdCBpc05pbDsiLCJpbXBvcnQgaW52b2tlciBmcm9tIFwiLi9pbnZva2VyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyBtYWRlIGJ5IGluc2VydGluZyB0aGUgYHNlcGFyYXRvcmAgYmV0d2VlbiBlYWNoIGVsZW1lbnQgYW5kXG4gKiBjb25jYXRlbmF0aW5nIGFsbCB0aGUgZWxlbWVudHMgaW50byBhIHNpbmdsZSBzdHJpbmcuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBTdHJpbmcgLT4gW2FdIC0+IFN0cmluZ1xuICogQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBzZXBhcmF0b3IgVGhlIHN0cmluZyB1c2VkIHRvIHNlcGFyYXRlIHRoZSBlbGVtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXl9IHhzIFRoZSBlbGVtZW50cyB0byBqb2luIGludG8gYSBzdHJpbmcuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIG1hZGUgYnkgY29uY2F0ZW5hdGluZyBgeHNgIHdpdGggYHNlcGFyYXRvcmAuXG4gKiBAc2VlIFIuc3BsaXRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBzcGFjZXIgPSBSLmpvaW4oJyAnKTtcbiAqICAgICAgc3BhY2VyKFsnYScsIDIsIDMuNF0pOyAgIC8vPT4gJ2EgMiAzLjQnXG4gKiAgICAgIFIuam9pbignfCcsIFsxLCAyLCAzXSk7ICAgIC8vPT4gJzF8MnwzJ1xuICovXG52YXIgam9pbiA9IC8qI19fUFVSRV9fKi9pbnZva2VyKDEsICdqb2luJyk7XG5leHBvcnQgZGVmYXVsdCBqb2luOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBjb252ZXJnZSBmcm9tIFwiLi9jb252ZXJnZS5qc1wiO1xuXG4vKipcbiAqIGp1eHQgYXBwbGllcyBhIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIGEgbGlzdCBvZiB2YWx1ZXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIFsoYSwgYiwgLi4uLCBtKSAtPiBuXSAtPiAoKGEsIGIsIC4uLiwgbSkgLT4gW25dKVxuICogQHBhcmFtIHtBcnJheX0gZm5zIEFuIGFycmF5IG9mIGZ1bmN0aW9uc1xuICogQHJldHVybiB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbGlzdCBvZiB2YWx1ZXMgYWZ0ZXIgYXBwbHlpbmcgZWFjaCBvZiB0aGUgb3JpZ2luYWwgYGZuc2AgdG8gaXRzIHBhcmFtZXRlcnMuXG4gKiBAc2VlIFIuYXBwbHlTcGVjXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZ2V0UmFuZ2UgPSBSLmp1eHQoW01hdGgubWluLCBNYXRoLm1heF0pO1xuICogICAgICBnZXRSYW5nZSgzLCA0LCA5LCAtMyk7IC8vPT4gWy0zLCA5XVxuICogQHN5bWIgUi5qdXh0KFtmLCBnLCBoXSkoYSwgYikgPSBbZihhLCBiKSwgZyhhLCBiKSwgaChhLCBiKV1cbiAqL1xudmFyIGp1eHQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBqdXh0KGZucykge1xuICByZXR1cm4gY29udmVyZ2UoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICB9LCBmbnMpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBqdXh0OyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcbmltcG9ydCBfaXNBcmd1bWVudHMgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJndW1lbnRzLmpzXCI7XG5cbi8vIGNvdmVyIElFIDwgOSBrZXlzIGlzc3Vlc1xudmFyIGhhc0VudW1CdWcgPSAhIC8qI19fUFVSRV9fKi97XG4gIHRvU3RyaW5nOiBudWxsXG59LnByb3BlcnR5SXNFbnVtZXJhYmxlKCd0b1N0cmluZycpO1xudmFyIG5vbkVudW1lcmFibGVQcm9wcyA9IFsnY29uc3RydWN0b3InLCAndmFsdWVPZicsICdpc1Byb3RvdHlwZU9mJywgJ3RvU3RyaW5nJywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJ2hhc093blByb3BlcnR5JywgJ3RvTG9jYWxlU3RyaW5nJ107XG4vLyBTYWZhcmkgYnVnXG52YXIgaGFzQXJnc0VudW1CdWcgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5wcm9wZXJ0eUlzRW51bWVyYWJsZSgnbGVuZ3RoJyk7XG59KCk7XG52YXIgY29udGFpbnMgPSBmdW5jdGlvbiBjb250YWlucyhsaXN0LCBpdGVtKSB7XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpZiAobGlzdFtpZHhdID09PSBpdGVtKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgb2ZcbiAqIHRoZSBzdXBwbGllZCBvYmplY3QuXG4gKiBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBvdXRwdXQgYXJyYXkgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29uc2lzdGVudFxuICogYWNyb3NzIGRpZmZlcmVudCBKUyBwbGF0Zm9ybXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtrOiB2fSAtPiBba11cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBleHRyYWN0IHByb3BlcnRpZXMgZnJvbVxuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHRoZSBvYmplY3QncyBvd24gcHJvcGVydGllcy5cbiAqIEBzZWUgUi5rZXlzSW4sIFIudmFsdWVzLCBSLnRvUGFpcnNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmtleXMoe2E6IDEsIGI6IDIsIGM6IDN9KTsgLy89PiBbJ2EnLCAnYicsICdjJ11cbiAqL1xudmFyIGtleXMgPSB0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgIWhhc0FyZ3NFbnVtQnVnID8gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24ga2V5cyhvYmopIHtcbiAgcmV0dXJuIE9iamVjdChvYmopICE9PSBvYmogPyBbXSA6IE9iamVjdC5rZXlzKG9iaik7XG59KSA6IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGtleXMob2JqKSB7XG4gIGlmIChPYmplY3Qob2JqKSAhPT0gb2JqKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBwcm9wLCBuSWR4O1xuICB2YXIga3MgPSBbXTtcbiAgdmFyIGNoZWNrQXJnc0xlbmd0aCA9IGhhc0FyZ3NFbnVtQnVnICYmIF9pc0FyZ3VtZW50cyhvYmopO1xuICBmb3IgKHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKF9oYXMocHJvcCwgb2JqKSAmJiAoIWNoZWNrQXJnc0xlbmd0aCB8fCBwcm9wICE9PSAnbGVuZ3RoJykpIHtcbiAgICAgIGtzW2tzLmxlbmd0aF0gPSBwcm9wO1xuICAgIH1cbiAgfVxuICBpZiAoaGFzRW51bUJ1Zykge1xuICAgIG5JZHggPSBub25FbnVtZXJhYmxlUHJvcHMubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAobklkeCA+PSAwKSB7XG4gICAgICBwcm9wID0gbm9uRW51bWVyYWJsZVByb3BzW25JZHhdO1xuICAgICAgaWYgKF9oYXMocHJvcCwgb2JqKSAmJiAhY29udGFpbnMoa3MsIHByb3ApKSB7XG4gICAgICAgIGtzW2tzLmxlbmd0aF0gPSBwcm9wO1xuICAgICAgfVxuICAgICAgbklkeCAtPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4ga3M7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGtleXM7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IG1hcCBmcm9tIFwiLi9tYXAuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbGVucyBmb3IgdGhlIGdpdmVuIGdldHRlciBhbmQgc2V0dGVyIGZ1bmN0aW9ucy4gVGhlIGdldHRlciBcImdldHNcIlxuICogdGhlIHZhbHVlIG9mIHRoZSBmb2N1czsgdGhlIHNldHRlciBcInNldHNcIiB0aGUgdmFsdWUgb2YgdGhlIGZvY3VzLiBUaGUgc2V0dGVyXG4gKiBzaG91bGQgbm90IG11dGF0ZSB0aGUgZGF0YSBzdHJ1Y3R1cmUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gTGVucyBzIGEgPSBGdW5jdG9yIGYgPT4gKGEgLT4gZiBhKSAtPiBzIC0+IGYgc1xuICogQHNpZyAocyAtPiBhKSAtPiAoKGEsIHMpIC0+IHMpIC0+IExlbnMgcyBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXR0ZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlclxuICogQHJldHVybiB7TGVuc31cbiAqIEBzZWUgUi52aWV3LCBSLnNldCwgUi5vdmVyLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhMZW5zID0gUi5sZW5zKFIucHJvcCgneCcpLCBSLmFzc29jKCd4JykpO1xuICpcbiAqICAgICAgUi52aWV3KHhMZW5zLCB7eDogMSwgeTogMn0pOyAgICAgICAgICAgIC8vPT4gMVxuICogICAgICBSLnNldCh4TGVucywgNCwge3g6IDEsIHk6IDJ9KTsgICAgICAgICAgLy89PiB7eDogNCwgeTogMn1cbiAqICAgICAgUi5vdmVyKHhMZW5zLCBSLm5lZ2F0ZSwge3g6IDEsIHk6IDJ9KTsgIC8vPT4ge3g6IC0xLCB5OiAyfVxuICovXG52YXIgbGVucyA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGxlbnMoZ2V0dGVyLCBzZXR0ZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0b0Z1bmN0b3JGbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICByZXR1cm4gbWFwKGZ1bmN0aW9uIChmb2N1cykge1xuICAgICAgICByZXR1cm4gc2V0dGVyKGZvY3VzLCB0YXJnZXQpO1xuICAgICAgfSwgdG9GdW5jdG9yRm4oZ2V0dGVyKHRhcmdldCkpKTtcbiAgICB9O1xuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBsZW5zOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBhc3NvY1BhdGggZnJvbSBcIi4vYXNzb2NQYXRoLmpzXCI7XG5pbXBvcnQgbGVucyBmcm9tIFwiLi9sZW5zLmpzXCI7XG5pbXBvcnQgX3BhdGggZnJvbSBcIi4vaW50ZXJuYWwvX3BhdGguanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbGVucyB3aG9zZSBmb2N1cyBpcyB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludCB8IFN5bWJvbFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgW0lkeF0gLT4gTGVucyBzIGFcbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gdXNlLlxuICogQHJldHVybiB7TGVuc31cbiAqIEBzZWUgUi52aWV3LCBSLnNldCwgUi5vdmVyXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgeEhlYWRZTGVucyA9IFIubGVuc1BhdGgoWyd4JywgMCwgJ3knXSk7XG4gKlxuICogICAgICBSLnZpZXcoeEhlYWRZTGVucywge3g6IFt7eTogMiwgejogM30sIHt5OiA0LCB6OiA1fV19KTtcbiAqICAgICAgLy89PiAyXG4gKiAgICAgIFIuc2V0KHhIZWFkWUxlbnMsIDEsIHt4OiBbe3k6IDIsIHo6IDN9LCB7eTogNCwgejogNX1dfSk7XG4gKiAgICAgIC8vPT4ge3g6IFt7eTogMSwgejogM30sIHt5OiA0LCB6OiA1fV19XG4gKiAgICAgIFIub3Zlcih4SGVhZFlMZW5zLCBSLm5lZ2F0ZSwge3g6IFt7eTogMiwgejogM30sIHt5OiA0LCB6OiA1fV19KTtcbiAqICAgICAgLy89PiB7eDogW3t5OiAtMiwgejogM30sIHt5OiA0LCB6OiA1fV19XG4gKi9cblxudmFyIGxlbnNQYXRoID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gbGVuc1BhdGgocCkge1xuICByZXR1cm4gbGVucyhmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIF9wYXRoKHAsIHZhbCk7XG4gIH0sIGFzc29jUGF0aChwKSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGxlbnNQYXRoOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQ7IGBmYWxzZWBcbiAqIG90aGVyd2lzZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBPcmQgYSA9PiBhIC0+IGEgLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSBhXG4gKiBAcGFyYW0geyp9IGJcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAc2VlIFIuZ3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmx0KDIsIDEpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIubHQoMiwgMik7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5sdCgyLCAzKTsgLy89PiB0cnVlXG4gKiAgICAgIFIubHQoJ2EnLCAneicpOyAvLz0+IHRydWVcbiAqICAgICAgUi5sdCgneicsICdhJyk7IC8vPT4gZmFsc2VcbiAqL1xudmFyIGx0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gbHQoYSwgYikge1xuICByZXR1cm4gYSA8IGI7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGx0OyIsImltcG9ydCBfYXJyYXlSZWR1Y2UgZnJvbSBcIi4vaW50ZXJuYWwvX2FycmF5UmVkdWNlLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwiLi9pbnRlcm5hbC9fbWFwLmpzXCI7XG5pbXBvcnQgX3htYXAgZnJvbSBcIi4vaW50ZXJuYWwvX3htYXAuanNcIjtcbmltcG9ydCBjdXJyeU4gZnJvbSBcIi4vY3VycnlOLmpzXCI7XG5pbXBvcnQga2V5cyBmcm9tIFwiLi9rZXlzLmpzXCI7XG5cbi8qKlxuICogVGFrZXMgYSBmdW5jdGlvbiBhbmRcbiAqIGEgW2Z1bmN0b3JdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjZnVuY3RvciksXG4gKiBhcHBsaWVzIHRoZSBmdW5jdGlvbiB0byBlYWNoIG9mIHRoZSBmdW5jdG9yJ3MgdmFsdWVzLCBhbmQgcmV0dXJuc1xuICogYSBmdW5jdG9yIG9mIHRoZSBzYW1lIHNoYXBlLlxuICpcbiAqIFJhbWRhIHByb3ZpZGVzIHN1aXRhYmxlIGBtYXBgIGltcGxlbWVudGF0aW9ucyBmb3IgYEFycmF5YCBhbmQgYE9iamVjdGAsXG4gKiBzbyB0aGlzIGZ1bmN0aW9uIG1heSBiZSBhcHBsaWVkIHRvIGBbMSwgMiwgM11gIG9yIGB7eDogMSwgeTogMiwgejogM31gLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBtYXBgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBBbHNvIHRyZWF0cyBmdW5jdGlvbnMgYXMgZnVuY3RvcnMgYW5kIHdpbGwgY29tcG9zZSB0aGVtIHRvZ2V0aGVyLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgRnVuY3RvciBmID0+IChhIC0+IGIpIC0+IGYgYSAtPiBmIGJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gZXZlcnkgZWxlbWVudCBvZiB0aGUgaW5wdXQgYGxpc3RgLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBiZSBpdGVyYXRlZCBvdmVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBuZXcgbGlzdC5cbiAqIEBzZWUgUi50cmFuc2R1Y2UsIFIuYWRkSW5kZXgsIFIucGx1Y2ssIFIucHJvamVjdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGRvdWJsZSA9IHggPT4geCAqIDI7XG4gKlxuICogICAgICBSLm1hcChkb3VibGUsIFsxLCAyLCAzXSk7IC8vPT4gWzIsIDQsIDZdXG4gKlxuICogICAgICBSLm1hcChkb3VibGUsIHt4OiAxLCB5OiAyLCB6OiAzfSk7IC8vPT4ge3g6IDIsIHk6IDQsIHo6IDZ9XG4gKiBAc3ltYiBSLm1hcChmLCBbYSwgYl0pID0gW2YoYSksIGYoYildXG4gKiBAc3ltYiBSLm1hcChmLCB7IHg6IGEsIHk6IGIgfSkgPSB7IHg6IGYoYSksIHk6IGYoYikgfVxuICogQHN5bWIgUi5tYXAoZiwgZnVuY3Rvcl9vKSA9IGZ1bmN0b3Jfby5tYXAoZilcbiAqL1xudmFyIG1hcCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbJ2ZhbnRhc3ktbGFuZC9tYXAnLCAnbWFwJ10sIF94bWFwLCBmdW5jdGlvbiBtYXAoZm4sIGZ1bmN0b3IpIHtcbiAgc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZnVuY3RvcikpIHtcbiAgICBjYXNlICdbb2JqZWN0IEZ1bmN0aW9uXSc6XG4gICAgICByZXR1cm4gY3VycnlOKGZ1bmN0b3IubGVuZ3RoLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGZ1bmN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgICB9KTtcbiAgICBjYXNlICdbb2JqZWN0IE9iamVjdF0nOlxuICAgICAgcmV0dXJuIF9hcnJheVJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgYWNjW2tleV0gPSBmbihmdW5jdG9yW2tleV0pO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30sIGtleXMoZnVuY3RvcikpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gX21hcChmbiwgZnVuY3Rvcik7XG4gIH1cbn0pKTtcbmV4cG9ydCBkZWZhdWx0IG1hcDsiLCJpbXBvcnQgX2FycmF5UmVkdWNlIGZyb20gXCIuL2ludGVybmFsL19hcnJheVJlZHVjZS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4va2V5cy5qc1wiO1xuXG4vKipcbiAqIEFuIE9iamVjdC1zcGVjaWZpYyB2ZXJzaW9uIG9mIFtgbWFwYF0oI21hcCkuIFRoZSBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRocmVlXG4gKiBhcmd1bWVudHM6ICoodmFsdWUsIGtleSwgb2JqKSouIElmIG9ubHkgdGhlIHZhbHVlIGlzIHNpZ25pZmljYW50LCB1c2VcbiAqIFtgbWFwYF0oI21hcCkgaW5zdGVhZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKCgqLCBTdHJpbmcsIE9iamVjdCkgLT4gKikgLT4gT2JqZWN0IC0+IE9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tYXBcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB4eXogPSB7IHg6IDEsIHk6IDIsIHo6IDMgfTtcbiAqICAgICAgY29uc3QgcHJlcGVuZEtleUFuZERvdWJsZSA9IChudW0sIGtleSwgb2JqKSA9PiBrZXkgKyAobnVtICogMik7XG4gKlxuICogICAgICBSLm1hcE9iakluZGV4ZWQocHJlcGVuZEtleUFuZERvdWJsZSwgeHl6KTsgLy89PiB7IHg6ICd4MicsIHk6ICd5NCcsIHo6ICd6NicgfVxuICovXG52YXIgbWFwT2JqSW5kZXhlZCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIG1hcE9iakluZGV4ZWQoZm4sIG9iaikge1xuICByZXR1cm4gX2FycmF5UmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgIGFjY1trZXldID0gZm4ob2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSwga2V5cyhvYmopKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWFwT2JqSW5kZXhlZDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSBcIi4vdG9TdHJpbmcuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXJnZXIgb2YgaXRzIHR3byBhcmd1bWVudHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgT3JkIGEgPT4gYSAtPiBhIC0+IGFcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLm1heEJ5LCBSLm1pblxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubWF4KDc4OSwgMTIzKTsgLy89PiA3ODlcbiAqICAgICAgUi5tYXgoJ2EnLCAnYicpOyAvLz0+ICdiJ1xuICovXG52YXIgbWF4ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gbWF4KGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gYjtcbiAgfVxuICBmdW5jdGlvbiBzYWZlTWF4KHgsIHkpIHtcbiAgICBpZiAoeCA+IHkgIT09IHkgPiB4KSB7XG4gICAgICByZXR1cm4geSA+IHggPyB5IDogeDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB2YXIgbWF4QnlWYWx1ZSA9IHNhZmVNYXgoYSwgYik7XG4gIGlmIChtYXhCeVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbWF4QnlWYWx1ZTtcbiAgfVxuICB2YXIgbWF4QnlUeXBlID0gc2FmZU1heCh0eXBlb2YgYSwgdHlwZW9mIGIpO1xuICBpZiAobWF4QnlUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbWF4QnlUeXBlID09PSB0eXBlb2YgYSA/IGEgOiBiO1xuICB9XG4gIHZhciBzdHJpbmdBID0gdG9TdHJpbmcoYSk7XG4gIHZhciBtYXhCeVN0cmluZ1ZhbHVlID0gc2FmZU1heChzdHJpbmdBLCB0b1N0cmluZyhiKSk7XG4gIGlmIChtYXhCeVN0cmluZ1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbWF4QnlTdHJpbmdWYWx1ZSA9PT0gc3RyaW5nQSA/IGEgOiBiO1xuICB9XG4gIHJldHVybiBiO1xufSk7XG5leHBvcnQgZGVmYXVsdCBtYXg7IiwiaW1wb3J0IF9hcml0eSBmcm9tIFwiLi9pbnRlcm5hbC9fYXJpdHkuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcblxuLyoqXG4gKiBUYWtlcyBhIHN0cmluZy1yZXR1cm5pbmcgZnVuY3Rpb24gYGtleUdlbmAgYW5kIGEgZnVuY3Rpb24gYGZuYCBhbmQgcmV0dXJuc1xuICogYSBuZXcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGNhY2hlZCByZXN1bHRzIGZvciBzdWJzZXF1ZW50XG4gKiBjYWxscyB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cy5cbiAqXG4gKiBXaGVuIHRoZSBmdW5jdGlvbiBpcyBpbnZva2VkLCBga2V5R2VuYCBpcyBhcHBsaWVkIHRvIHRoZSBzYW1lIGFyZ3VtZW50c1xuICogYW5kIGl0cyByZXN1bHQgYmVjb21lcyB0aGUgY2FjaGUga2V5LiBJZiB0aGUgY2FjaGUgY29udGFpbnMgc29tZXRoaW5nXG4gKiB1bmRlciB0aGF0IGtleSwgdGhlIGZ1bmN0aW9uIHNpbXBseSByZXR1cm5zIGl0IGFuZCBkb2VzIG5vdCBpbnZva2UgYGZuYCBhdCBhbGwuXG4gKlxuICogT3RoZXJ3aXNlIGBmbmAgaXMgYXBwbGllZCB0byB0aGUgc2FtZSBhcmd1bWVudHMgYW5kIGl0cyByZXR1cm4gdmFsdWVcbiAqIGlzIGNhY2hlZCB1bmRlciB0aGF0IGtleSBhbmQgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLlxuICpcbiAqIENhcmUgbXVzdCBiZSB0YWtlbiB3aGVuIGltcGxlbWVudGluZyBga2V5R2VuYCB0byBhdm9pZCBrZXkgY29sbGlzaW9uLFxuICogb3IgaWYgdHJhY2tpbmcgcmVmZXJlbmNlcywgbWVtb3J5IGxlYWtzIGFuZCBtdXRhdGluZyBhcmd1bWVudHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjQuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgqLi4uIC0+IFN0cmluZykgLT4gKCouLi4gLT4gYSkgLT4gKCouLi4gLT4gYSlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleUdlbiBUaGUgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIGNhY2hlIGtleS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtZW1vaXplLlxuICogQHJldHVybiB7RnVuY3Rpb259IE1lbW9pemVkIHZlcnNpb24gb2YgYGZuYC5cbiAqIEBleGFtcGxlXG4gKiAgICAgIGNvbnN0IHdpdGhBZ2UgPSBtZW1vaXplV2l0aChvID0+IGAke28uYmlydGh9LyR7by5kZWF0aH1gLCAoe2JpcnRoLCBkZWF0aH0pID0+IHtcbiAqICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4gIF5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuICogICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAga2V5R2VuICAgICAgICAgICAgICAgICAgICAgICAgZm5cbiAqICAgICAgICBjb25zb2xlLmxvZyhgY29tcHV0aW5nIGFnZSBmb3IgJHtiaXJ0aH0vJHtkZWF0aH1gKTtcbiAqICAgICAgICByZXR1cm4gKHtiaXJ0aCwgZGVhdGgsIGFnZTogZGVhdGggLSBiaXJ0aH0pO1xuICogICAgICB9KTtcbiAqXG4gKiAgICAgIHdpdGhBZ2Uoe2JpcnRoOiAxOTIxLCBkZWF0aDogMTk5OX0pO1xuICogICAgICAvLz0+IExPRzogY29tcHV0aW5nIGFnZSBmb3IgMTkyMS8xOTk5XG4gKiAgICAgIC8vPT4ge2JpcnRoOiAxOTIxLCBkZWF0aDogMTk5OSwgYWdlOiA3OH0gKHJldHVybmVkIGZyb20gZm4pXG4gKlxuICogICAgICB3aXRoQWdlKHtiaXJ0aDogMTkyMSwgZGVhdGg6IDE5OTl9KTtcbiAqICAgICAgLy89PiB7YmlydGg6IDE5MjEsIGRlYXRoOiAxOTk5LCBhZ2U6IDc4fSAocmV0dXJuZWQgZnJvbSBjYWNoZSlcbiAqL1xudmFyIG1lbW9pemVXaXRoID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gbWVtb2l6ZVdpdGgoa2V5R2VuLCBmbikge1xuICB2YXIgY2FjaGUgPSB7fTtcbiAgcmV0dXJuIF9hcml0eShmbi5sZW5ndGgsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIga2V5ID0ga2V5R2VuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKCFfaGFzKGtleSwgY2FjaGUpKSB7XG4gICAgICBjYWNoZVtrZXldID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlW2tleV07XG4gIH0pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBtZW1vaXplV2l0aDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgbWVyZ2VEZWVwV2l0aEtleSBmcm9tIFwiLi9tZXJnZURlZXBXaXRoS2V5LmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIGZpcnN0IG9iamVjdCBtZXJnZWQgd2l0aFxuICogdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBzZWNvbmQgb2JqZWN0LiBJZiBhIGtleSBleGlzdHMgaW4gYm90aCBvYmplY3RzOlxuICogLSBhbmQgYm90aCB2YWx1ZXMgYXJlIG9iamVjdHMsIHRoZSB0d28gdmFsdWVzIHdpbGwgYmUgcmVjdXJzaXZlbHkgbWVyZ2VkXG4gKiAtIG90aGVyd2lzZSB0aGUgdmFsdWUgZnJvbSB0aGUgc2Vjb25kIG9iamVjdCB3aWxsIGJlIHVzZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjQuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7YX0gLT4ge2F9IC0+IHthfVxuICogQHBhcmFtIHtPYmplY3R9IGxPYmpcbiAqIEBwYXJhbSB7T2JqZWN0fSByT2JqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWVyZ2UsIFIubWVyZ2VEZWVwTGVmdCwgUi5tZXJnZURlZXBXaXRoLCBSLm1lcmdlRGVlcFdpdGhLZXlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1lcmdlRGVlcFJpZ2h0KHsgbmFtZTogJ2ZyZWQnLCBhZ2U6IDEwLCBjb250YWN0OiB7IGVtYWlsOiAnbW9vQGV4YW1wbGUuY29tJyB9fSxcbiAqICAgICAgICAgICAgICAgICAgICAgICB7IGFnZTogNDAsIGNvbnRhY3Q6IHsgZW1haWw6ICdiYWFAZXhhbXBsZS5jb20nIH19KTtcbiAqICAgICAgLy89PiB7IG5hbWU6ICdmcmVkJywgYWdlOiA0MCwgY29udGFjdDogeyBlbWFpbDogJ2JhYUBleGFtcGxlLmNvbScgfX1cbiAqL1xudmFyIG1lcmdlRGVlcFJpZ2h0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gbWVyZ2VEZWVwUmlnaHQobE9iaiwgck9iaikge1xuICByZXR1cm4gbWVyZ2VEZWVwV2l0aEtleShmdW5jdGlvbiAoaywgbFZhbCwgclZhbCkge1xuICAgIHJldHVybiByVmFsO1xuICB9LCBsT2JqLCByT2JqKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWVyZ2VEZWVwUmlnaHQ7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IF9pc09iamVjdCBmcm9tIFwiLi9pbnRlcm5hbC9faXNPYmplY3QuanNcIjtcbmltcG9ydCBtZXJnZVdpdGhLZXkgZnJvbSBcIi4vbWVyZ2VXaXRoS2V5LmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIHR3byBwcm92aWRlZCBvYmplY3RzLlxuICogSWYgYSBrZXkgZXhpc3RzIGluIGJvdGggb2JqZWN0czpcbiAqIC0gYW5kIGJvdGggYXNzb2NpYXRlZCB2YWx1ZXMgYXJlIGFsc28gb2JqZWN0cyB0aGVuIHRoZSB2YWx1ZXMgd2lsbCBiZVxuICogICByZWN1cnNpdmVseSBtZXJnZWQuXG4gKiAtIG90aGVyd2lzZSB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gaXMgYXBwbGllZCB0byB0aGUga2V5IGFuZCBhc3NvY2lhdGVkIHZhbHVlc1xuICogICB1c2luZyB0aGUgcmVzdWx0aW5nIHZhbHVlIGFzIHRoZSBuZXcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuXG4gKiBJZiBhIGtleSBvbmx5IGV4aXN0cyBpbiBvbmUgb2JqZWN0LCB0aGUgdmFsdWUgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleVxuICogb2YgdGhlIHJlc3VsdGluZyBvYmplY3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjQuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKFN0cmluZywgYSwgYSkgLT4gYSkgLT4ge2F9IC0+IHthfSAtPiB7YX1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gbE9ialxuICogQHBhcmFtIHtPYmplY3R9IHJPYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tZXJnZVdpdGhLZXksIFIubWVyZ2VEZWVwV2l0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGxldCBjb25jYXRWYWx1ZXMgPSAoaywgbCwgcikgPT4gayA9PSAndmFsdWVzJyA/IFIuY29uY2F0KGwsIHIpIDogclxuICogICAgICBSLm1lcmdlRGVlcFdpdGhLZXkoY29uY2F0VmFsdWVzLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgeyBhOiB0cnVlLCBjOiB7IHRoaW5nOiAnZm9vJywgdmFsdWVzOiBbMTAsIDIwXSB9fSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIHsgYjogdHJ1ZSwgYzogeyB0aGluZzogJ2JhcicsIHZhbHVlczogWzE1LCAzNV0gfX0pO1xuICogICAgICAvLz0+IHsgYTogdHJ1ZSwgYjogdHJ1ZSwgYzogeyB0aGluZzogJ2JhcicsIHZhbHVlczogWzEwLCAyMCwgMTUsIDM1XSB9fVxuICovXG52YXIgbWVyZ2VEZWVwV2l0aEtleSA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIG1lcmdlRGVlcFdpdGhLZXkoZm4sIGxPYmosIHJPYmopIHtcbiAgcmV0dXJuIG1lcmdlV2l0aEtleShmdW5jdGlvbiAoaywgbFZhbCwgclZhbCkge1xuICAgIGlmIChfaXNPYmplY3QobFZhbCkgJiYgX2lzT2JqZWN0KHJWYWwpKSB7XG4gICAgICByZXR1cm4gbWVyZ2VEZWVwV2l0aEtleShmbiwgbFZhbCwgclZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmbihrLCBsVmFsLCByVmFsKTtcbiAgICB9XG4gIH0sIGxPYmosIHJPYmopO1xufSk7XG5leHBvcnQgZGVmYXVsdCBtZXJnZURlZXBXaXRoS2V5OyIsImltcG9ydCBfb2JqZWN0QXNzaWduIGZyb20gXCIuL2ludGVybmFsL19vYmplY3RBc3NpZ24uanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBmaXJzdCBvYmplY3QgbWVyZ2VkIHdpdGhcbiAqIHRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgc2Vjb25kIG9iamVjdC4gSWYgYSBrZXkgZXhpc3RzIGluIGJvdGggb2JqZWN0cyxcbiAqIHRoZSB2YWx1ZSBmcm9tIHRoZSBmaXJzdCBvYmplY3Qgd2lsbCBiZSB1c2VkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge2s6IHZ9IC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7T2JqZWN0fSBsXG4gKiBAcGFyYW0ge09iamVjdH0gclxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHNlZSBSLm1lcmdlUmlnaHQsIFIubWVyZ2VEZWVwTGVmdCwgUi5tZXJnZVdpdGgsIFIubWVyZ2VXaXRoS2V5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tZXJnZUxlZnQoeyAnYWdlJzogNDAgfSwgeyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDEwIH0pO1xuICogICAgICAvLz0+IHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCB9XG4gKlxuICogICAgICBjb25zdCByZXNldFRvRGVmYXVsdCA9IFIubWVyZ2VMZWZ0KHt4OiAwfSk7XG4gKiAgICAgIHJlc2V0VG9EZWZhdWx0KHt4OiA1LCB5OiAyfSk7IC8vPT4ge3g6IDAsIHk6IDJ9XG4gKiBAc3ltYiBSLm1lcmdlTGVmdChhLCBiKSA9IHsuLi5iLCAuLi5hfVxuICovXG52YXIgbWVyZ2VMZWZ0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gbWVyZ2VMZWZ0KGwsIHIpIHtcbiAgcmV0dXJuIF9vYmplY3RBc3NpZ24oe30sIHIsIGwpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBtZXJnZUxlZnQ7IiwiaW1wb3J0IF9vYmplY3RBc3NpZ24gZnJvbSBcIi4vaW50ZXJuYWwvX29iamVjdEFzc2lnbi5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIGZpcnN0IG9iamVjdCBtZXJnZWQgd2l0aFxuICogdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBzZWNvbmQgb2JqZWN0LiBJZiBhIGtleSBleGlzdHMgaW4gYm90aCBvYmplY3RzLFxuICogdGhlIHZhbHVlIGZyb20gdGhlIHNlY29uZCBvYmplY3Qgd2lsbCBiZSB1c2VkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge2s6IHZ9IC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7T2JqZWN0fSBsXG4gKiBAcGFyYW0ge09iamVjdH0gclxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHNlZSBSLm1lcmdlTGVmdCwgUi5tZXJnZURlZXBSaWdodCwgUi5tZXJnZVdpdGgsIFIubWVyZ2VXaXRoS2V5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tZXJnZVJpZ2h0KHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiAxMCB9LCB7ICdhZ2UnOiA0MCB9KTtcbiAqICAgICAgLy89PiB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfVxuICpcbiAqICAgICAgY29uc3Qgd2l0aERlZmF1bHRzID0gUi5tZXJnZVJpZ2h0KHt4OiAwLCB5OiAwfSk7XG4gKiAgICAgIHdpdGhEZWZhdWx0cyh7eTogMn0pOyAvLz0+IHt4OiAwLCB5OiAyfVxuICogQHN5bWIgUi5tZXJnZVJpZ2h0KGEsIGIpID0gey4uLmEsIC4uLmJ9XG4gKi9cbnZhciBtZXJnZVJpZ2h0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gbWVyZ2VSaWdodChsLCByKSB7XG4gIHJldHVybiBfb2JqZWN0QXNzaWduKHt9LCBsLCByKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWVyZ2VSaWdodDsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgbWVyZ2VXaXRoS2V5IGZyb20gXCIuL21lcmdlV2l0aEtleS5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSB0d28gcHJvdmlkZWQgb2JqZWN0cy4gSWZcbiAqIGEga2V5IGV4aXN0cyBpbiBib3RoIG9iamVjdHMsIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRoZSB2YWx1ZXNcbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIGVhY2ggb2JqZWN0LCB3aXRoIHRoZSByZXN1bHQgYmVpbmcgdXNlZCBhcyB0aGVcbiAqIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBvYmplY3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKGEsIGEpIC0+IGEpIC0+IHthfSAtPiB7YX0gLT4ge2F9XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtPYmplY3R9IGxcbiAqIEBwYXJhbSB7T2JqZWN0fSByXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWVyZ2VEZWVwV2l0aCwgUi5tZXJnZSwgUi5tZXJnZVdpdGhLZXlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1lcmdlV2l0aChSLmNvbmNhdCxcbiAqICAgICAgICAgICAgICAgICAgeyBhOiB0cnVlLCB2YWx1ZXM6IFsxMCwgMjBdIH0sXG4gKiAgICAgICAgICAgICAgICAgIHsgYjogdHJ1ZSwgdmFsdWVzOiBbMTUsIDM1XSB9KTtcbiAqICAgICAgLy89PiB7IGE6IHRydWUsIGI6IHRydWUsIHZhbHVlczogWzEwLCAyMCwgMTUsIDM1XSB9XG4gKi9cbnZhciBtZXJnZVdpdGggPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBtZXJnZVdpdGgoZm4sIGwsIHIpIHtcbiAgcmV0dXJuIG1lcmdlV2l0aEtleShmdW5jdGlvbiAoXywgX2wsIF9yKSB7XG4gICAgcmV0dXJuIGZuKF9sLCBfcik7XG4gIH0sIGwsIHIpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBtZXJnZVdpdGg7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vaW50ZXJuYWwvX2hhcy5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSB0d28gcHJvdmlkZWQgb2JqZWN0cy4gSWZcbiAqIGEga2V5IGV4aXN0cyBpbiBib3RoIG9iamVjdHMsIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRoZSBrZXlcbiAqIGFuZCB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIGVhY2ggb2JqZWN0LCB3aXRoIHRoZSByZXN1bHQgYmVpbmdcbiAqIHVzZWQgYXMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBvYmplY3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKFN0cmluZywgYSwgYSkgLT4gYSkgLT4ge2F9IC0+IHthfSAtPiB7YX1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gbFxuICogQHBhcmFtIHtPYmplY3R9IHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tZXJnZURlZXBXaXRoS2V5LCBSLm1lcmdlLCBSLm1lcmdlV2l0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGxldCBjb25jYXRWYWx1ZXMgPSAoaywgbCwgcikgPT4gayA9PSAndmFsdWVzJyA/IFIuY29uY2F0KGwsIHIpIDogclxuICogICAgICBSLm1lcmdlV2l0aEtleShjb25jYXRWYWx1ZXMsXG4gKiAgICAgICAgICAgICAgICAgICAgIHsgYTogdHJ1ZSwgdGhpbmc6ICdmb28nLCB2YWx1ZXM6IFsxMCwgMjBdIH0sXG4gKiAgICAgICAgICAgICAgICAgICAgIHsgYjogdHJ1ZSwgdGhpbmc6ICdiYXInLCB2YWx1ZXM6IFsxNSwgMzVdIH0pO1xuICogICAgICAvLz0+IHsgYTogdHJ1ZSwgYjogdHJ1ZSwgdGhpbmc6ICdiYXInLCB2YWx1ZXM6IFsxMCwgMjAsIDE1LCAzNV0gfVxuICogQHN5bWIgUi5tZXJnZVdpdGhLZXkoZiwgeyB4OiAxLCB5OiAyIH0sIHsgeTogNSwgejogMyB9KSA9IHsgeDogMSwgeTogZigneScsIDIsIDUpLCB6OiAzIH1cbiAqL1xudmFyIG1lcmdlV2l0aEtleSA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIG1lcmdlV2l0aEtleShmbiwgbCwgcikge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIHZhciBrO1xuICBsID0gbCB8fCB7fTtcbiAgciA9IHIgfHwge307XG4gIGZvciAoayBpbiBsKSB7XG4gICAgaWYgKF9oYXMoaywgbCkpIHtcbiAgICAgIHJlc3VsdFtrXSA9IF9oYXMoaywgcikgPyBmbihrLCBsW2tdLCByW2tdKSA6IGxba107XG4gICAgfVxuICB9XG4gIGZvciAoayBpbiByKSB7XG4gICAgaWYgKF9oYXMoaywgcikgJiYgIV9oYXMoaywgcmVzdWx0KSkge1xuICAgICAgcmVzdWx0W2tdID0gcltrXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWVyZ2VXaXRoS2V5OyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcGFydGlhbCBjb3B5IG9mIGFuIG9iamVjdCBvbWl0dGluZyB0aGUga2V5cyBzcGVjaWZpZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIFtTdHJpbmddIC0+IHtTdHJpbmc6ICp9IC0+IHtTdHJpbmc6ICp9XG4gKiBAcGFyYW0ge0FycmF5fSBuYW1lcyBhbiBhcnJheSBvZiBTdHJpbmcgcHJvcGVydHkgbmFtZXMgdG8gb21pdCBmcm9tIHRoZSBuZXcgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY29weSBmcm9tXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRoIHByb3BlcnRpZXMgZnJvbSBgbmFtZXNgIG5vdCBvbiBpdC5cbiAqIEBzZWUgUi5waWNrXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5vbWl0KFsnYScsICdkJ10sIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2I6IDIsIGM6IDN9XG4gKi9cbnZhciBvbWl0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gb21pdChuYW1lcywgb2JqKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgdmFyIGluZGV4ID0ge307XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgaW5kZXhbbmFtZXNbaWR4XV0gPSAxO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKCFpbmRleC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgcmVzdWx0W3Byb3BdID0gb2JqW3Byb3BdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5leHBvcnQgZGVmYXVsdCBvbWl0OyIsImltcG9ydCBfYXJpdHkgZnJvbSBcIi4vaW50ZXJuYWwvX2FyaXR5LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5cbi8qKlxuICogQWNjZXB0cyBhIGZ1bmN0aW9uIGBmbmAgYW5kIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGd1YXJkcyBpbnZvY2F0aW9uIG9mXG4gKiBgZm5gIHN1Y2ggdGhhdCBgZm5gIGNhbiBvbmx5IGV2ZXIgYmUgY2FsbGVkIG9uY2UsIG5vIG1hdHRlciBob3cgbWFueSB0aW1lc1xuICogdGhlIHJldHVybmVkIGZ1bmN0aW9uIGlzIGludm9rZWQuIFRoZSBmaXJzdCB2YWx1ZSBjYWxjdWxhdGVkIGlzIHJldHVybmVkIGluXG4gKiBzdWJzZXF1ZW50IGludm9jYXRpb25zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIChhLi4uIC0+IGIpIC0+IChhLi4uIC0+IGIpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gd3JhcCBpbiBhIGNhbGwtb25seS1vbmNlIHdyYXBwZXIuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIHdyYXBwZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYWRkT25lT25jZSA9IFIub25jZSh4ID0+IHggKyAxKTtcbiAqICAgICAgYWRkT25lT25jZSgxMCk7IC8vPT4gMTFcbiAqICAgICAgYWRkT25lT25jZShhZGRPbmVPbmNlKDUwKSk7IC8vPT4gMTFcbiAqL1xudmFyIG9uY2UgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBvbmNlKGZuKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgdmFyIHJlc3VsdDtcbiAgcmV0dXJuIF9hcml0eShmbi5sZW5ndGgsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2FsbGVkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjYWxsZWQgPSB0cnVlO1xuICAgIHJlc3VsdCA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IG9uY2U7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuXG4vLyBgSWRlbnRpdHlgIGlzIGEgZnVuY3RvciB0aGF0IGhvbGRzIGEgc2luZ2xlIHZhbHVlLCB3aGVyZSBgbWFwYCBzaW1wbHlcbi8vIHRyYW5zZm9ybXMgdGhlIGhlbGQgdmFsdWUgd2l0aCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uXG52YXIgSWRlbnRpdHkgPSBmdW5jdGlvbiAoeCkge1xuICByZXR1cm4ge1xuICAgIHZhbHVlOiB4LFxuICAgIG1hcDogZnVuY3Rpb24gKGYpIHtcbiAgICAgIHJldHVybiBJZGVudGl0eShmKHgpKTtcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBcInNldHRpbmdcIiB0aGUgcG9ydGlvbiBvZiB0aGUgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmVcbiAqIGZvY3VzZWQgYnkgdGhlIGdpdmVuIGxlbnMgdG8gdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG9cbiAqIHRoZSBmb2N1c2VkIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIExlbnMgcyBhIC0+IChhIC0+IGEpIC0+IHMgLT4gc1xuICogQHBhcmFtIHtMZW5zfSBsZW5zXG4gKiBAcGFyYW0geyp9IHZcbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi52aWV3LCBSLnNldCwgUi5sZW5zLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcCwgUi5sZW5zUGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGhlYWRMZW5zID0gUi5sZW5zSW5kZXgoMCk7XG4gKlxuICogICAgICBSLm92ZXIoaGVhZExlbnMsIFIudG9VcHBlciwgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbJ0ZPTycsICdiYXInLCAnYmF6J11cbiAqL1xudmFyIG92ZXIgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBvdmVyKGxlbnMsIGYsIHgpIHtcbiAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBnZXR0ZXIgZnVuY3Rpb24gaXMgZmlyc3QgdHJhbnNmb3JtZWQgd2l0aCBgZmAsXG4gIC8vIHRoZW4gc2V0IGFzIHRoZSB2YWx1ZSBvZiBhbiBgSWRlbnRpdHlgLiBUaGlzIGlzIHRoZW4gbWFwcGVkIG92ZXIgd2l0aCB0aGVcbiAgLy8gc2V0dGVyIGZ1bmN0aW9uIG9mIHRoZSBsZW5zLlxuICByZXR1cm4gbGVucyhmdW5jdGlvbiAoeSkge1xuICAgIHJldHVybiBJZGVudGl0eShmKHkpKTtcbiAgfSkoeCkudmFsdWU7XG59KTtcbmV4cG9ydCBkZWZhdWx0IG92ZXI7IiwiaW1wb3J0IGZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCBqdXh0IGZyb20gXCIuL2p1eHQuanNcIjtcbmltcG9ydCByZWplY3QgZnJvbSBcIi4vcmVqZWN0LmpzXCI7XG5cbi8qKlxuICogVGFrZXMgYSBwcmVkaWNhdGUgYW5kIGEgbGlzdCBvciBvdGhlciBgRmlsdGVyYWJsZWAgb2JqZWN0IGFuZCByZXR1cm5zIHRoZVxuICogcGFpciBvZiBmaWx0ZXJhYmxlIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBvZiBlbGVtZW50cyB3aGljaCBkbyBhbmQgZG8gbm90XG4gKiBzYXRpc2Z5LCB0aGUgcHJlZGljYXRlLCByZXNwZWN0aXZlbHkuIEZpbHRlcmFibGUgb2JqZWN0cyBpbmNsdWRlIHBsYWluIG9iamVjdHMgb3IgYW55IG9iamVjdFxuICogdGhhdCBoYXMgYSBmaWx0ZXIgbWV0aG9kIHN1Y2ggYXMgYEFycmF5YC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjRcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIEZpbHRlcmFibGUgZiA9PiAoYSAtPiBCb29sZWFuKSAtPiBmIGEgLT4gW2YgYSwgZiBhXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCBBIHByZWRpY2F0ZSB0byBkZXRlcm1pbmUgd2hpY2ggc2lkZSB0aGUgZWxlbWVudCBiZWxvbmdzIHRvLlxuICogQHBhcmFtIHtBcnJheX0gZmlsdGVyYWJsZSB0aGUgbGlzdCAob3Igb3RoZXIgZmlsdGVyYWJsZSkgdG8gcGFydGl0aW9uLlxuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5LCBjb250YWluaW5nIGZpcnN0IHRoZSBzdWJzZXQgb2YgZWxlbWVudHMgdGhhdCBzYXRpc2Z5IHRoZVxuICogICAgICAgICBwcmVkaWNhdGUsIGFuZCBzZWNvbmQgdGhlIHN1YnNldCBvZiBlbGVtZW50cyB0aGF0IGRvIG5vdCBzYXRpc2Z5LlxuICogQHNlZSBSLmZpbHRlciwgUi5yZWplY3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnBhcnRpdGlvbihSLmluY2x1ZGVzKCdzJyksIFsnc3NzJywgJ3R0dCcsICdmb28nLCAnYmFycyddKTtcbiAqICAgICAgLy8gPT4gWyBbICdzc3MnLCAnYmFycycgXSwgIFsgJ3R0dCcsICdmb28nIF0gXVxuICpcbiAqICAgICAgUi5wYXJ0aXRpb24oUi5pbmNsdWRlcygncycpLCB7IGE6ICdzc3MnLCBiOiAndHR0JywgZm9vOiAnYmFycycgfSk7XG4gKiAgICAgIC8vID0+IFsgeyBhOiAnc3NzJywgZm9vOiAnYmFycycgfSwgeyBiOiAndHR0JyB9ICBdXG4gKi9cbnZhciBwYXJ0aXRpb24gPSAvKiNfX1BVUkVfXyovanV4dChbZmlsdGVyLCByZWplY3RdKTtcbmV4cG9ydCBkZWZhdWx0IHBhcnRpdGlvbjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX3BhdGggZnJvbSBcIi4vaW50ZXJuYWwvX3BhdGguanNcIjtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIGF0IGEgZ2l2ZW4gcGF0aC4gVGhlIG5vZGVzIG9mIHRoZSBwYXRoIGNhbiBiZSBhcmJpdHJhcnkgc3RyaW5ncyBvciBub24tbmVnYXRpdmUgaW50ZWdlcnMuXG4gKiBGb3IgYW55dGhpbmcgZWxzZSwgdGhlIHZhbHVlIGlzIHVuc3BlY2lmaWVkLiBJbnRlZ2VyIHBhdGhzIGFyZSBtZWFudCB0byBpbmRleCBhcnJheXMsIHN0cmluZ3MgYXJlIG1lYW50IGZvciBvYmplY3RzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludCB8IFN5bWJvbFxuICogQHNpZyBbSWR4XSAtPiB7YX0gLT4gYSB8IFVuZGVmaW5lZFxuICogQHNpZyBJZHggPSBTdHJpbmcgfCBOb25OZWdhdGl2ZUludFxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byB1c2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gcmV0cmlldmUgdGhlIG5lc3RlZCBwcm9wZXJ0eSBmcm9tLlxuICogQHJldHVybiB7Kn0gVGhlIGRhdGEgYXQgYHBhdGhgLlxuICogQHNlZSBSLnByb3AsIFIubnRoLCBSLmFzc29jUGF0aCwgUi5kaXNzb2NQYXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wYXRoKFsnYScsICdiJ10sIHthOiB7YjogMn19KTsgLy89PiAyXG4gKiAgICAgIFIucGF0aChbJ2EnLCAnYiddLCB7Yzoge2I6IDJ9fSk7IC8vPT4gdW5kZWZpbmVkXG4gKiAgICAgIFIucGF0aChbJ2EnLCAnYicsIDBdLCB7YToge2I6IFsxLCAyLCAzXX19KTsgLy89PiAxXG4gKiAgICAgIFIucGF0aChbJ2EnLCAnYicsIC0yXSwge2E6IHtiOiBbMSwgMiwgM119fSk7IC8vPT4gMlxuICogICAgICBSLnBhdGgoWzJdLCB7JzInOiAyfSk7IC8vPT4gMlxuICogICAgICBSLnBhdGgoWy0yXSwgeyctMic6ICdhJ30pOyAvLz0+IHVuZGVmaW5lZFxuICovXG5cbnZhciBwYXRoID0gLyojX19QVVJFX18qL19jdXJyeTIoX3BhdGgpO1xuZXhwb3J0IGRlZmF1bHQgcGF0aDsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgX3BhdGggZnJvbSBcIi4vaW50ZXJuYWwvX3BhdGguanNcIjtcbmltcG9ydCBkZWZhdWx0VG8gZnJvbSBcIi4vZGVmYXVsdFRvLmpzXCI7XG5cbi8qKlxuICogSWYgdGhlIGdpdmVuLCBub24tbnVsbCBvYmplY3QgaGFzIGEgdmFsdWUgYXQgdGhlIGdpdmVuIHBhdGgsIHJldHVybnMgdGhlXG4gKiB2YWx1ZSBhdCB0aGF0IHBhdGguIE90aGVyd2lzZSByZXR1cm5zIHRoZSBwcm92aWRlZCBkZWZhdWx0IHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE4LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgYSAtPiBbSWR4XSAtPiB7YX0gLT4gYVxuICogQHBhcmFtIHsqfSBkIFRoZSBkZWZhdWx0IHZhbHVlLlxuICogQHBhcmFtIHtBcnJheX0gcCBUaGUgcGF0aCB0byB1c2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcmV0cmlldmUgdGhlIG5lc3RlZCBwcm9wZXJ0eSBmcm9tLlxuICogQHJldHVybiB7Kn0gVGhlIGRhdGEgYXQgYHBhdGhgIG9mIHRoZSBzdXBwbGllZCBvYmplY3Qgb3IgdGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wYXRoT3IoJ04vQScsIFsnYScsICdiJ10sIHthOiB7YjogMn19KTsgLy89PiAyXG4gKiAgICAgIFIucGF0aE9yKCdOL0EnLCBbJ2EnLCAnYiddLCB7Yzoge2I6IDJ9fSk7IC8vPT4gXCJOL0FcIlxuICovXG52YXIgcGF0aE9yID0gLyojX19QVVJFX18qL19jdXJyeTMoZnVuY3Rpb24gcGF0aE9yKGQsIHAsIG9iaikge1xuICByZXR1cm4gZGVmYXVsdFRvKGQsIF9wYXRoKHAsIG9iaikpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBwYXRoT3I7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBwYXJ0aWFsIGNvcHkgb2YgYW4gb2JqZWN0IGNvbnRhaW5pbmcgb25seSB0aGUga2V5cyBzcGVjaWZpZWQuIElmXG4gKiB0aGUga2V5IGRvZXMgbm90IGV4aXN0LCB0aGUgcHJvcGVydHkgaXMgaWdub3JlZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgW2tdIC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7QXJyYXl9IG5hbWVzIGFuIGFycmF5IG9mIFN0cmluZyBwcm9wZXJ0eSBuYW1lcyB0byBjb3B5IG9udG8gYSBuZXcgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY29weSBmcm9tXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRoIG9ubHkgcHJvcGVydGllcyBmcm9tIGBuYW1lc2Agb24gaXQuXG4gKiBAc2VlIFIub21pdCwgUi5wcm9wc1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucGljayhbJ2EnLCAnZCddLCB7YTogMSwgYjogMiwgYzogMywgZDogNH0pOyAvLz0+IHthOiAxLCBkOiA0fVxuICogICAgICBSLnBpY2soWydhJywgJ2UnLCAnZiddLCB7YTogMSwgYjogMiwgYzogMywgZDogNH0pOyAvLz0+IHthOiAxfVxuICovXG52YXIgcGljayA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHBpY2sobmFtZXMsIG9iaikge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbmFtZXMubGVuZ3RoKSB7XG4gICAgaWYgKG5hbWVzW2lkeF0gaW4gb2JqKSB7XG4gICAgICByZXN1bHRbbmFtZXNbaWR4XV0gPSBvYmpbbmFtZXNbaWR4XV07XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHBpY2s7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBwYXJ0aWFsIGNvcHkgb2YgYW4gb2JqZWN0IGNvbnRhaW5pbmcgb25seSB0aGUga2V5cyB0aGF0IHNhdGlzZnlcbiAqIHRoZSBzdXBwbGllZCBwcmVkaWNhdGUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnICgodiwgaykgLT4gQm9vbGVhbikgLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCBBIHByZWRpY2F0ZSB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgYSBrZXlcbiAqICAgICAgICBzaG91bGQgYmUgaW5jbHVkZWQgb24gdGhlIG91dHB1dCBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY29weSBmcm9tXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRoIG9ubHkgcHJvcGVydGllcyB0aGF0IHNhdGlzZnkgYHByZWRgXG4gKiAgICAgICAgIG9uIGl0LlxuICogQHNlZSBSLnBpY2ssIFIuZmlsdGVyXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgaXNVcHBlckNhc2UgPSAodmFsLCBrZXkpID0+IGtleS50b1VwcGVyQ2FzZSgpID09PSBrZXk7XG4gKiAgICAgIFIucGlja0J5KGlzVXBwZXJDYXNlLCB7YTogMSwgYjogMiwgQTogMywgQjogNH0pOyAvLz0+IHtBOiAzLCBCOiA0fVxuICovXG52YXIgcGlja0J5ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gcGlja0J5KHRlc3QsIG9iaikge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKHRlc3Qob2JqW3Byb3BdLCBwcm9wLCBvYmopKSB7XG4gICAgICByZXN1bHRbcHJvcF0gPSBvYmpbcHJvcF07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHBpY2tCeTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgbWFwIGZyb20gXCIuL21hcC5qc1wiO1xuaW1wb3J0IHByb3AgZnJvbSBcIi4vcHJvcC5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBieSBwbHVja2luZyB0aGUgc2FtZSBuYW1lZCBwcm9wZXJ0eSBvZmYgYWxsIG9iamVjdHMgaW5cbiAqIHRoZSBsaXN0IHN1cHBsaWVkLlxuICpcbiAqIGBwbHVja2Agd2lsbCB3b3JrIG9uXG4gKiBhbnkgW2Z1bmN0b3JdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjZnVuY3RvcikgaW5cbiAqIGFkZGl0aW9uIHRvIGFycmF5cywgYXMgaXQgaXMgZXF1aXZhbGVudCB0byBgUi5tYXAoUi5wcm9wKGspLCBmKWAuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBGdW5jdG9yIGYgPT4gayAtPiBmIHtrOiB2fSAtPiBmIHZcbiAqIEBwYXJhbSB7TnVtYmVyfFN0cmluZ30ga2V5IFRoZSBrZXkgbmFtZSB0byBwbHVjayBvZmYgb2YgZWFjaCBvYmplY3QuXG4gKiBAcGFyYW0ge0FycmF5fSBmIFRoZSBhcnJheSBvciBmdW5jdG9yIHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGtleS5cbiAqIEBzZWUgUi5wcm9qZWN0LCBSLnByb3AsIFIucHJvcHNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgZ2V0QWdlcyA9IFIucGx1Y2soJ2FnZScpO1xuICogICAgICBnZXRBZ2VzKFt7bmFtZTogJ2ZyZWQnLCBhZ2U6IDI5fSwge25hbWU6ICd3aWxtYScsIGFnZTogMjd9XSk7IC8vPT4gWzI5LCAyN11cbiAqXG4gKiAgICAgIFIucGx1Y2soMCwgW1sxLCAyXSwgWzMsIDRdXSk7ICAgICAgICAgICAgICAgLy89PiBbMSwgM11cbiAqICAgICAgUi5wbHVjaygndmFsJywge2E6IHt2YWw6IDN9LCBiOiB7dmFsOiA1fX0pOyAvLz0+IHthOiAzLCBiOiA1fVxuICogQHN5bWIgUi5wbHVjaygneCcsIFt7eDogMSwgeTogMn0sIHt4OiAzLCB5OiA0fSwge3g6IDUsIHk6IDZ9XSkgPSBbMSwgMywgNV1cbiAqIEBzeW1iIFIucGx1Y2soMCwgW1sxLCAyXSwgWzMsIDRdLCBbNSwgNl1dKSA9IFsxLCAzLCA1XVxuICovXG52YXIgcGx1Y2sgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBwbHVjayhwLCBsaXN0KSB7XG4gIHJldHVybiBtYXAocHJvcChwKSwgbGlzdCk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHBsdWNrOyIsImltcG9ydCBfY29uY2F0IGZyb20gXCIuL2ludGVybmFsL19jb25jYXQuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3Qgd2l0aCB0aGUgZ2l2ZW4gZWxlbWVudCBhdCB0aGUgZnJvbnQsIGZvbGxvd2VkIGJ5IHRoZVxuICogY29udGVudHMgb2YgdGhlIGxpc3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7Kn0gZWwgVGhlIGl0ZW0gdG8gYWRkIHRvIHRoZSBoZWFkIG9mIHRoZSBvdXRwdXQgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGFkZCB0byB0aGUgdGFpbCBvZiB0aGUgb3V0cHV0IGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgYXJyYXkuXG4gKiBAc2VlIFIuYXBwZW5kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wcmVwZW5kKCdmZWUnLCBbJ2ZpJywgJ2ZvJywgJ2Z1bSddKTsgLy89PiBbJ2ZlZScsICdmaScsICdmbycsICdmdW0nXVxuICovXG52YXIgcHJlcGVuZCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHByZXBlbmQoZWwsIGxpc3QpIHtcbiAgcmV0dXJuIF9jb25jYXQoW2VsXSwgbGlzdCk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHByZXBlbmQ7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pc0ludGVnZXIgZnJvbSBcIi4vaW50ZXJuYWwvX2lzSW50ZWdlci5qc1wiO1xuaW1wb3J0IF9udGggZnJvbSBcIi4vaW50ZXJuYWwvX250aC5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdoZW4gc3VwcGxpZWQgYW4gb2JqZWN0IHJldHVybnMgdGhlIGluZGljYXRlZFxuICogcHJvcGVydHkgb2YgdGhhdCBvYmplY3QsIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgSWR4IC0+IHtzOiBhfSAtPiBhIHwgVW5kZWZpbmVkXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHAgVGhlIHByb3BlcnR5IG5hbWUgb3IgYXJyYXkgaW5kZXhcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBxdWVyeVxuICogQHJldHVybiB7Kn0gVGhlIHZhbHVlIGF0IGBvYmoucGAuXG4gKiBAc2VlIFIucGF0aCwgUi5wcm9wcywgUi5wbHVjaywgUi5wcm9qZWN0LCBSLm50aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucHJvcCgneCcsIHt4OiAxMDB9KTsgLy89PiAxMDBcbiAqICAgICAgUi5wcm9wKCd4Jywge30pOyAvLz0+IHVuZGVmaW5lZFxuICogICAgICBSLnByb3AoMCwgWzEwMF0pOyAvLz0+IDEwMFxuICogICAgICBSLmNvbXBvc2UoUi5pbmMsIFIucHJvcCgneCcpKSh7IHg6IDMgfSkgLy89PiA0XG4gKi9cblxudmFyIHByb3AgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBwcm9wKHAsIG9iaikge1xuICBpZiAob2JqID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmV0dXJuIF9pc0ludGVnZXIocCkgPyBfbnRoKHAsIG9iaikgOiBvYmpbcF07XG59KTtcbmV4cG9ydCBkZWZhdWx0IHByb3A7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IHByb3AgZnJvbSBcIi4vcHJvcC5qc1wiO1xuaW1wb3J0IGVxdWFscyBmcm9tIFwiLi9lcXVhbHMuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcm9wZXJ0eSBpcyBlcXVhbCwgaW5cbiAqIFtgUi5lcXVhbHNgXSgjZXF1YWxzKSB0ZXJtcywgdG8gdGhlIGdpdmVuIHZhbHVlOyBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIFlvdSBjYW4gdGVzdCBtdWx0aXBsZSBwcm9wZXJ0aWVzIHdpdGggW2BSLndoZXJlRXFgXSgjd2hlcmVFcSksXG4gKiBhbmQgdGVzdCBuZXN0ZWQgcGF0aCBwcm9wZXJ0eSB3aXRoIFtgUi5wYXRoRXFgXSgjcGF0aEVxKS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBhIC0+IFN0cmluZyAtPiBPYmplY3QgLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIGNvbXBhcmUgdGhlIHByb3BlcnR5IHdpdGhcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByb3BlcnR5J3Mga2V5XG4gKiBAcGFyYW0geyp9IG9iaiBUaGUgb2JqZWN0IHRvIGNoZWNrIHRoZSBwcm9wZXJ0eSBpblxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSB2YWx1ZSBlcXVhbHMgdGhlIHNwZWNpZmllZCBvYmplY3QgcHJvcGVydHksXG4gKiAgICAgICAgIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQHNlZSBSLndoZXJlRXEsIFIucGF0aEVxLCBSLnByb3BTYXRpc2ZpZXMsIFIuZXF1YWxzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYWJieSA9IHtuYW1lOiAnQWJieScsIGFnZTogNywgaGFpcjogJ2Jsb25kJ307XG4gKiAgICAgIGNvbnN0IGZyZWQgPSB7bmFtZTogJ0ZyZWQnLCBhZ2U6IDEyLCBoYWlyOiAnYnJvd24nfTtcbiAqICAgICAgY29uc3QgcnVzdHkgPSB7bmFtZTogJ1J1c3R5JywgYWdlOiAxMCwgaGFpcjogJ2Jyb3duJ307XG4gKiAgICAgIGNvbnN0IGFsb2lzID0ge25hbWU6ICdBbG9pcycsIGFnZTogMTUsIGRpc3Bvc2l0aW9uOiAnc3VybHknfTtcbiAqICAgICAgY29uc3Qga2lkcyA9IFthYmJ5LCBmcmVkLCBydXN0eSwgYWxvaXNdO1xuICogICAgICBjb25zdCBoYXNCcm93bkhhaXIgPSBSLnByb3BFcSgnYnJvd24nLCAnaGFpcicpO1xuICogICAgICBSLmZpbHRlcihoYXNCcm93bkhhaXIsIGtpZHMpOyAvLz0+IFtmcmVkLCBydXN0eV1cbiAqL1xudmFyIHByb3BFcSA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIHByb3BFcSh2YWwsIG5hbWUsIG9iaikge1xuICByZXR1cm4gZXF1YWxzKHZhbCwgcHJvcChuYW1lLCBvYmopKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgcHJvcEVxOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBwcm9wIGZyb20gXCIuL3Byb3AuanNcIjtcblxuLyoqXG4gKiBBY3RzIGFzIG11bHRpcGxlIGBwcm9wYDogYXJyYXkgb2Yga2V5cyBpbiwgYXJyYXkgb2YgdmFsdWVzIG91dC4gUHJlc2VydmVzXG4gKiBvcmRlci5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgW2tdIC0+IHtrOiB2fSAtPiBbdl1cbiAqIEBwYXJhbSB7QXJyYXl9IHBzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBmZXRjaFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHF1ZXJ5XG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIG9yIHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLlxuICogQHNlZSBSLnByb3AsIFIucGx1Y2ssIFIucHJvamVjdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucHJvcHMoWyd4JywgJ3knXSwge3g6IDEsIHk6IDJ9KTsgLy89PiBbMSwgMl1cbiAqICAgICAgUi5wcm9wcyhbJ2MnLCAnYScsICdiJ10sIHtiOiAyLCBhOiAxfSk7IC8vPT4gW3VuZGVmaW5lZCwgMSwgMl1cbiAqXG4gKiAgICAgIGNvbnN0IGZ1bGxOYW1lID0gUi5jb21wb3NlKFIuam9pbignICcpLCBSLnByb3BzKFsnZmlyc3QnLCAnbGFzdCddKSk7XG4gKiAgICAgIGZ1bGxOYW1lKHtsYXN0OiAnQnVsbGV0LVRvb3RoJywgYWdlOiAzMywgZmlyc3Q6ICdUb255J30pOyAvLz0+ICdUb255IEJ1bGxldC1Ub290aCdcbiAqL1xudmFyIHByb3BzID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gcHJvcHMocHMsIG9iaikge1xuICByZXR1cm4gcHMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIHByb3AocCwgb2JqKTtcbiAgfSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHByb3BzOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBfeFJlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9feFJlZHVjZS5qc1wiO1xuaW1wb3J0IF94d3JhcCBmcm9tIFwiLi9pbnRlcm5hbC9feHdyYXAuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGxpc3QsIHN1Y2Nlc3NpdmVseSBjYWxsaW5nXG4gKiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gYW5kIHBhc3NpbmcgaXQgYW4gYWNjdW11bGF0b3IgdmFsdWUgYW5kIHRoZSBjdXJyZW50XG4gKiB2YWx1ZSBmcm9tIHRoZSBhcnJheSwgYW5kIHRoZW4gcGFzc2luZyB0aGUgcmVzdWx0IHRvIHRoZSBuZXh0IGNhbGwuXG4gKlxuICogVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHJlY2VpdmVzIHR3byB2YWx1ZXM6ICooYWNjLCB2YWx1ZSkqLiBJdCBtYXkgdXNlXG4gKiBbYFIucmVkdWNlZGBdKCNyZWR1Y2VkKSB0byBzaG9ydGN1dCB0aGUgaXRlcmF0aW9uLlxuICpcbiAqIFRoZSBhcmd1bWVudHMnIG9yZGVyIG9mIFtgcmVkdWNlUmlnaHRgXSgjcmVkdWNlUmlnaHQpJ3MgaXRlcmF0b3IgZnVuY3Rpb25cbiAqIGlzICoodmFsdWUsIGFjYykqLlxuICpcbiAqIE5vdGU6IGBSLnJlZHVjZWAgZG9lcyBub3Qgc2tpcCBkZWxldGVkIG9yIHVuYXNzaWduZWQgaW5kaWNlcyAoc3BhcnNlXG4gKiBhcnJheXMpLCB1bmxpa2UgdGhlIG5hdGl2ZSBgQXJyYXkucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kLiBGb3IgbW9yZSBkZXRhaWxzXG4gKiBvbiB0aGlzIGJlaGF2aW9yLCBzZWU6XG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9yZWR1Y2UjRGVzY3JpcHRpb25cbiAqXG4gKiBCZSBjYXV0aW91cyBvZiBtdXRhdGluZyBhbmQgcmV0dXJuaW5nIHRoZSBhY2N1bXVsYXRvci4gSWYgeW91IHJldXNlIGl0IGFjcm9zc1xuICogaW52b2NhdGlvbnMsIGl0IHdpbGwgY29udGludWUgdG8gYWNjdW11bGF0ZSBvbnRvIHRoZSBzYW1lIHZhbHVlLiBUaGUgZ2VuZXJhbFxuICogcmVjb21tZW5kYXRpb24gaXMgdG8gYWx3YXlzIHJldHVybiBhIG5ldyB2YWx1ZS4gSWYgeW91IGNhbid0IGRvIHNvIGZvclxuICogcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlbiBiZSBzdXJlIHRvIHJlaW5pdGlhbGl6ZSB0aGUgYWNjdW11bGF0b3Igb24gZWFjaFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgcmVkdWNlYCBtZXRob2Qgb2YgdGhlIHRoaXJkIGFyZ3VtZW50LCBpZiBwcmVzZW50LiBXaGVuXG4gKiBkb2luZyBzbywgaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gaGFuZGxlIHRoZSBbYFIucmVkdWNlZGBdKCNyZWR1Y2VkKVxuICogc2hvcnRjdXRpbmcsIGFzIHRoaXMgaXMgbm90IGltcGxlbWVudGVkIGJ5IGByZWR1Y2VgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKChhLCBiKSAtPiBhKSAtPiBhIC0+IFtiXSAtPiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgaXRlcmF0b3IgZnVuY3Rpb24uIFJlY2VpdmVzIHR3byB2YWx1ZXMsIHRoZSBhY2N1bXVsYXRvciBhbmQgdGhlXG4gKiAgICAgICAgY3VycmVudCBlbGVtZW50IGZyb20gdGhlIGFycmF5LlxuICogQHBhcmFtIHsqfSBhY2MgVGhlIGFjY3VtdWxhdG9yIHZhbHVlLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHsqfSBUaGUgZmluYWwsIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQHNlZSBSLnJlZHVjZWQsIFIuYWRkSW5kZXgsIFIucmVkdWNlUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnJlZHVjZShSLnN1YnRyYWN0LCAwLCBbMSwgMiwgMywgNF0pIC8vID0+ICgoKCgwIC0gMSkgLSAyKSAtIDMpIC0gNCkgPSAtMTBcbiAqICAgICAgLy8gICAgICAgICAgLSAgICAgICAgICAgICAgIC0xMFxuICogICAgICAvLyAgICAgICAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgLy8gICAgICAgIC0gICA0ICAgICAgICAgICAtNiAgIDRcbiAqICAgICAgLy8gICAgICAgLyBcXCAgICAgICAgICAgICAgLyBcXFxuICogICAgICAvLyAgICAgIC0gICAzICAgPT0+ICAgICAtMyAgIDNcbiAqICAgICAgLy8gICAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgLy8gICAgLSAgIDIgICAgICAgICAgIC0xICAgMlxuICogICAgICAvLyAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgLy8gIDAgICAxICAgICAgICAgICAgMCAgIDFcbiAqXG4gKiBAc3ltYiBSLnJlZHVjZShmLCBhLCBbYiwgYywgZF0pID0gZihmKGYoYSwgYiksIGMpLCBkKVxuICovXG52YXIgcmVkdWNlID0gLyojX19QVVJFX18qL19jdXJyeTMoZnVuY3Rpb24gKHhmLCBhY2MsIGxpc3QpIHtcbiAgcmV0dXJuIF94UmVkdWNlKHR5cGVvZiB4ZiA9PT0gJ2Z1bmN0aW9uJyA/IF94d3JhcCh4ZikgOiB4ZiwgYWNjLCBsaXN0KTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgcmVkdWNlOyIsImltcG9ydCBfY2xvbmUgZnJvbSBcIi4vaW50ZXJuYWwvX2Nsb25lLmpzXCI7XG5pbXBvcnQgX2N1cnJ5TiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnlOLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwiLi9pbnRlcm5hbC9faGFzLmpzXCI7XG5pbXBvcnQgX3JlZHVjZWQgZnJvbSBcIi4vaW50ZXJuYWwvX3JlZHVjZWQuanNcIjtcbmltcG9ydCBfeFJlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9feFJlZHVjZS5qc1wiO1xuaW1wb3J0IF94cmVkdWNlQnkgZnJvbSBcIi4vaW50ZXJuYWwvX3hyZWR1Y2VCeS5qc1wiO1xuaW1wb3J0IF94d3JhcCBmcm9tIFwiLi9pbnRlcm5hbC9feHdyYXAuanNcIjtcblxuLyoqXG4gKiBHcm91cHMgdGhlIGVsZW1lbnRzIG9mIHRoZSBsaXN0IGFjY29yZGluZyB0byB0aGUgcmVzdWx0IG9mIGNhbGxpbmdcbiAqIHRoZSBTdHJpbmctcmV0dXJuaW5nIGZ1bmN0aW9uIGBrZXlGbmAgb24gZWFjaCBlbGVtZW50IGFuZCByZWR1Y2VzIHRoZSBlbGVtZW50c1xuICogb2YgZWFjaCBncm91cCB0byBhIHNpbmdsZSB2YWx1ZSB2aWEgdGhlIHJlZHVjZXIgZnVuY3Rpb24gYHZhbHVlRm5gLlxuICpcbiAqIFRoZSB2YWx1ZSBmdW5jdGlvbiByZWNlaXZlcyB0d28gdmFsdWVzOiAqKGFjYywgdmFsdWUpKi4gSXQgbWF5IHVzZVxuICogW2BSLnJlZHVjZWRgXSgjcmVkdWNlZCkgdG8gc2hvcnQgY2lyY3VpdCB0aGUgaXRlcmF0aW9uLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGEgbW9yZSBnZW5lcmFsIFtgZ3JvdXBCeWBdKCNncm91cEJ5KSBmdW5jdGlvbi5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjAuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKChhLCBiKSAtPiBhKSAtPiBhIC0+IChiIC0+IFN0cmluZykgLT4gW2JdIC0+IHtTdHJpbmc6IGF9XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB2YWx1ZUZuIFRoZSBmdW5jdGlvbiB0aGF0IHJlZHVjZXMgdGhlIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXAgdG8gYSBzaW5nbGVcbiAqICAgICAgICB2YWx1ZS4gUmVjZWl2ZXMgdHdvIHZhbHVlcywgYWNjdW11bGF0b3IgZm9yIGEgcGFydGljdWxhciBncm91cCBhbmQgdGhlIGN1cnJlbnQgZWxlbWVudC5cbiAqIEBwYXJhbSB7Kn0gYWNjIFRoZSAoaW5pdGlhbCkgYWNjdW11bGF0b3IgdmFsdWUgZm9yIGVhY2ggZ3JvdXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlGbiBUaGUgZnVuY3Rpb24gdGhhdCBtYXBzIHRoZSBsaXN0J3MgZWxlbWVudCBpbnRvIGEga2V5LlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gZ3JvdXAuXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCB3aXRoIHRoZSBvdXRwdXQgb2YgYGtleUZuYCBmb3Iga2V5cywgbWFwcGVkIHRvIHRoZSBvdXRwdXQgb2ZcbiAqICAgICAgICAgYHZhbHVlRm5gIGZvciBlbGVtZW50cyB3aGljaCBwcm9kdWNlZCB0aGF0IGtleSB3aGVuIHBhc3NlZCB0byBga2V5Rm5gLlxuICogQHNlZSBSLmdyb3VwQnksIFIucmVkdWNlLCBSLnJlZHVjZWRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBncm91cE5hbWVzID0gKGFjYywge25hbWV9KSA9PiBhY2MuY29uY2F0KG5hbWUpXG4gKiAgICAgIGNvbnN0IHRvR3JhZGUgPSAoe3Njb3JlfSkgPT5cbiAqICAgICAgICBzY29yZSA8IDY1ID8gJ0YnIDpcbiAqICAgICAgICBzY29yZSA8IDcwID8gJ0QnIDpcbiAqICAgICAgICBzY29yZSA8IDgwID8gJ0MnIDpcbiAqICAgICAgICBzY29yZSA8IDkwID8gJ0InIDogJ0EnXG4gKlxuICogICAgICB2YXIgc3R1ZGVudHMgPSBbXG4gKiAgICAgICAge25hbWU6ICdBYmJ5Jywgc2NvcmU6IDgzfSxcbiAqICAgICAgICB7bmFtZTogJ0JhcnQnLCBzY29yZTogNjJ9LFxuICogICAgICAgIHtuYW1lOiAnQ3VydCcsIHNjb3JlOiA4OH0sXG4gKiAgICAgICAge25hbWU6ICdEb3JhJywgc2NvcmU6IDkyfSxcbiAqICAgICAgXVxuICpcbiAqICAgICAgcmVkdWNlQnkoZ3JvdXBOYW1lcywgW10sIHRvR3JhZGUsIHN0dWRlbnRzKVxuICogICAgICAvLz0+IHtcIkFcIjogW1wiRG9yYVwiXSwgXCJCXCI6IFtcIkFiYnlcIiwgXCJDdXJ0XCJdLCBcIkZcIjogW1wiQmFydFwiXX1cbiAqL1xudmFyIHJlZHVjZUJ5ID0gLyojX19QVVJFX18qL19jdXJyeU4oNCwgW10sIC8qI19fUFVSRV9fKi9fZGlzcGF0Y2hhYmxlKFtdLCBfeHJlZHVjZUJ5LCBmdW5jdGlvbiByZWR1Y2VCeSh2YWx1ZUZuLCB2YWx1ZUFjYywga2V5Rm4sIGxpc3QpIHtcbiAgdmFyIHhmID0gX3h3cmFwKGZ1bmN0aW9uIChhY2MsIGVsdCkge1xuICAgIHZhciBrZXkgPSBrZXlGbihlbHQpO1xuICAgIHZhciB2YWx1ZSA9IHZhbHVlRm4oX2hhcyhrZXksIGFjYykgPyBhY2Nba2V5XSA6IF9jbG9uZSh2YWx1ZUFjYywgZmFsc2UpLCBlbHQpO1xuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZVsnQEB0cmFuc2R1Y2VyL3JlZHVjZWQnXSkge1xuICAgICAgcmV0dXJuIF9yZWR1Y2VkKGFjYyk7XG4gICAgfVxuICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGFjYztcbiAgfSk7XG4gIHJldHVybiBfeFJlZHVjZSh4Ziwge30sIGxpc3QpO1xufSkpO1xuZXhwb3J0IGRlZmF1bHQgcmVkdWNlQnk7IiwiaW1wb3J0IF9jb21wbGVtZW50IGZyb20gXCIuL2ludGVybmFsL19jb21wbGVtZW50LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgZmlsdGVyIGZyb20gXCIuL2ZpbHRlci5qc1wiO1xuXG4vKipcbiAqIFRoZSBjb21wbGVtZW50IG9mIFtgZmlsdGVyYF0oI2ZpbHRlcikuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLiBGaWx0ZXJhYmxlXG4gKiBvYmplY3RzIGluY2x1ZGUgcGxhaW4gb2JqZWN0cyBvciBhbnkgb2JqZWN0IHRoYXQgaGFzIGEgZmlsdGVyIG1ldGhvZCBzdWNoXG4gKiBhcyBgQXJyYXlgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgRmlsdGVyYWJsZSBmID0+IChhIC0+IEJvb2xlYW4pIC0+IGYgYSAtPiBmIGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlcmFibGVcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHNlZSBSLmZpbHRlciwgUi50cmFuc2R1Y2UsIFIuYWRkSW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBpc09kZCA9IChuKSA9PiBuICUgMiAhPT0gMDtcbiAqXG4gKiAgICAgIFIucmVqZWN0KGlzT2RkLCBbMSwgMiwgMywgNF0pOyAvLz0+IFsyLCA0XVxuICpcbiAqICAgICAgUi5yZWplY3QoaXNPZGQsIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2I6IDIsIGQ6IDR9XG4gKi9cbnZhciByZWplY3QgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiByZWplY3QocHJlZCwgZmlsdGVyYWJsZSkge1xuICByZXR1cm4gZmlsdGVyKF9jb21wbGVtZW50KHByZWQpLCBmaWx0ZXJhYmxlKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgcmVqZWN0OyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBzdWItbGlzdCBvZiBgbGlzdGAgc3RhcnRpbmcgYXQgaW5kZXggYHN0YXJ0YCBhbmQgY29udGFpbmluZ1xuICogYGNvdW50YCBlbGVtZW50cy4gX05vdGUgdGhhdCB0aGlzIGlzIG5vdCBkZXN0cnVjdGl2ZV86IGl0IHJldHVybnMgYSBjb3B5IG9mXG4gKiB0aGUgbGlzdCB3aXRoIHRoZSBjaGFuZ2VzLlxuICogPHNtYWxsPk5vIGxpc3RzIGhhdmUgYmVlbiBoYXJtZWQgaW4gdGhlIGFwcGxpY2F0aW9uIG9mIHRoaXMgZnVuY3Rpb24uPC9zbWFsbD5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yLjJcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0IFRoZSBwb3NpdGlvbiB0byBzdGFydCByZW1vdmluZyBlbGVtZW50c1xuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVtb3ZlXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIHJlbW92ZSBmcm9tXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgQXJyYXkgd2l0aCBgY291bnRgIGVsZW1lbnRzIGZyb20gYHN0YXJ0YCByZW1vdmVkLlxuICogQHNlZSBSLndpdGhvdXRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnJlbW92ZSgyLCAzLCBbMSwyLDMsNCw1LDYsNyw4XSk7IC8vPT4gWzEsMiw2LDcsOF1cbiAqL1xudmFyIHJlbW92ZSA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIHJlbW92ZShzdGFydCwgY291bnQsIGxpc3QpIHtcbiAgdmFyIHJlc3VsdCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIDApO1xuICByZXN1bHQuc3BsaWNlKHN0YXJ0LCBjb3VudCk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHJlbW92ZTsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX2lzU3RyaW5nIGZyb20gXCIuL2ludGVybmFsL19pc1N0cmluZy5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBvciBzdHJpbmcgd2l0aCB0aGUgZWxlbWVudHMgb3IgY2hhcmFjdGVycyBpbiByZXZlcnNlXG4gKiBvcmRlci5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYV1cbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IGxpc3RcbiAqIEByZXR1cm4ge0FycmF5fFN0cmluZ31cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnJldmVyc2UoWzEsIDIsIDNdKTsgIC8vPT4gWzMsIDIsIDFdXG4gKiAgICAgIFIucmV2ZXJzZShbMSwgMl0pOyAgICAgLy89PiBbMiwgMV1cbiAqICAgICAgUi5yZXZlcnNlKFsxXSk7ICAgICAgICAvLz0+IFsxXVxuICogICAgICBSLnJldmVyc2UoW10pOyAgICAgICAgIC8vPT4gW11cbiAqXG4gKiAgICAgIFIucmV2ZXJzZSgnYWJjJyk7ICAgICAgLy89PiAnY2JhJ1xuICogICAgICBSLnJldmVyc2UoJ2FiJyk7ICAgICAgIC8vPT4gJ2JhJ1xuICogICAgICBSLnJldmVyc2UoJ2EnKTsgICAgICAgIC8vPT4gJ2EnXG4gKiAgICAgIFIucmV2ZXJzZSgnJyk7ICAgICAgICAgLy89PiAnJ1xuICovXG52YXIgcmV2ZXJzZSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIHJldmVyc2UobGlzdCkge1xuICByZXR1cm4gX2lzU3RyaW5nKGxpc3QpID8gbGlzdC5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpIDogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCwgMCkucmV2ZXJzZSgpO1xufSk7XG5leHBvcnQgZGVmYXVsdCByZXZlcnNlOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBhbHdheXMgZnJvbSBcIi4vYWx3YXlzLmpzXCI7XG5pbXBvcnQgb3ZlciBmcm9tIFwiLi9vdmVyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIFwic2V0dGluZ1wiIHRoZSBwb3J0aW9uIG9mIHRoZSBnaXZlbiBkYXRhIHN0cnVjdHVyZVxuICogZm9jdXNlZCBieSB0aGUgZ2l2ZW4gbGVucyB0byB0aGUgZ2l2ZW4gdmFsdWUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTYuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgTGVucyBzIGEgLT4gYSAtPiBzIC0+IHNcbiAqIEBwYXJhbSB7TGVuc30gbGVuc1xuICogQHBhcmFtIHsqfSB2XG4gKiBAcGFyYW0geyp9IHhcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIudmlldywgUi5vdmVyLCBSLmxlbnMsIFIubGVuc0luZGV4LCBSLmxlbnNQcm9wLCBSLmxlbnNQYXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgeExlbnMgPSBSLmxlbnNQcm9wKCd4Jyk7XG4gKlxuICogICAgICBSLnNldCh4TGVucywgNCwge3g6IDEsIHk6IDJ9KTsgIC8vPT4ge3g6IDQsIHk6IDJ9XG4gKiAgICAgIFIuc2V0KHhMZW5zLCA4LCB7eDogMSwgeTogMn0pOyAgLy89PiB7eDogOCwgeTogMn1cbiAqL1xudmFyIHNldCA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIHNldChsZW5zLCB2LCB4KSB7XG4gIHJldHVybiBvdmVyKGxlbnMsIGFsd2F5cyh2KSwgeCk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHNldDsiLCJpbXBvcnQgX2NoZWNrRm9yTWV0aG9kIGZyb20gXCIuL2ludGVybmFsL19jaGVja0Zvck1ldGhvZC5qc1wiO1xuaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBsaXN0IG9yIHN0cmluZyAob3Igb2JqZWN0IHdpdGggYSBgc2xpY2VgXG4gKiBtZXRob2QpIGZyb20gYGZyb21JbmRleGAgKGluY2x1c2l2ZSkgdG8gYHRvSW5kZXhgIChleGNsdXNpdmUpLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBzbGljZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjRcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBmcm9tSW5kZXggVGhlIHN0YXJ0IGluZGV4IChpbmNsdXNpdmUpLlxuICogQHBhcmFtIHtOdW1iZXJ9IHRvSW5kZXggVGhlIGVuZCBpbmRleCAoZXhjbHVzaXZlKS5cbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnNsaWNlKDEsIDMsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAgIC8vPT4gWydiJywgJ2MnXVxuICogICAgICBSLnNsaWNlKDEsIEluZmluaXR5LCBbJ2EnLCAnYicsICdjJywgJ2QnXSk7IC8vPT4gWydiJywgJ2MnLCAnZCddXG4gKiAgICAgIFIuc2xpY2UoMCwgLTEsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAgLy89PiBbJ2EnLCAnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgtMywgLTEsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAvLz0+IFsnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgwLCAzLCAncmFtZGEnKTsgICAgICAgICAgICAgICAgICAgICAvLz0+ICdyYW0nXG4gKi9cbnZhciBzbGljZSA9IC8qI19fUFVSRV9fKi9fY3VycnkzKCAvKiNfX1BVUkVfXyovX2NoZWNrRm9yTWV0aG9kKCdzbGljZScsIGZ1bmN0aW9uIHNsaWNlKGZyb21JbmRleCwgdG9JbmRleCwgbGlzdCkge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCwgZnJvbUluZGV4LCB0b0luZGV4KTtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IHNsaWNlOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgbGlzdCwgc29ydGVkIGFjY29yZGluZyB0byB0aGUgY29tcGFyYXRvciBmdW5jdGlvbixcbiAqIHdoaWNoIHNob3VsZCBhY2NlcHQgdHdvIHZhbHVlcyBhdCBhIHRpbWUgYW5kIHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGVcbiAqIGZpcnN0IHZhbHVlIGlzIHNtYWxsZXIsIGEgcG9zaXRpdmUgbnVtYmVyIGlmIGl0J3MgbGFyZ2VyLCBhbmQgemVybyBpZiB0aGV5XG4gKiBhcmUgZXF1YWwuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBpcyBhICoqY29weSoqIG9mIHRoZSBsaXN0LiBJdCBkb2VzIG5vdFxuICogbW9kaWZ5IHRoZSBvcmlnaW5hbC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYSwgYSkgLT4gTnVtYmVyKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIEEgc29ydGluZyBmdW5jdGlvbiA6OiBhIC0+IGIgLT4gSW50XG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIHNvcnRcbiAqIEByZXR1cm4ge0FycmF5fSBhIG5ldyBhcnJheSB3aXRoIGl0cyBlbGVtZW50cyBzb3J0ZWQgYnkgdGhlIGNvbXBhcmF0b3IgZnVuY3Rpb24uXG4gKiBAc2VlIFIuYXNjZW5kLCBSLmRlc2NlbmRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBkaWZmID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gYSAtIGI7IH07XG4gKiAgICAgIFIuc29ydChkaWZmLCBbNCwyLDcsNV0pOyAvLz0+IFsyLCA0LCA1LCA3XVxuICovXG52YXIgc29ydCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHNvcnQoY29tcGFyYXRvciwgbGlzdCkge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCwgMCkuc29ydChjb21wYXJhdG9yKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgc29ydDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgZXF1YWxzIGZyb20gXCIuL2VxdWFscy5qc1wiO1xuaW1wb3J0IHRha2UgZnJvbSBcIi4vdGFrZS5qc1wiO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGxpc3Qgc3RhcnRzIHdpdGggdGhlIHByb3ZpZGVkIHN1Ymxpc3QuXG4gKlxuICogU2ltaWxhcmx5LCBjaGVja3MgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIHByb3ZpZGVkIHN1YnN0cmluZy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNC4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2FdIC0+IEJvb2xlYW5cbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZyAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IHByZWZpeFxuICogQHBhcmFtIHsqfSBsaXN0XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHNlZSBSLmVuZHNXaXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5zdGFydHNXaXRoKCdhJywgJ2FiYycpICAgICAgICAgICAgICAgIC8vPT4gdHJ1ZVxuICogICAgICBSLnN0YXJ0c1dpdGgoJ2InLCAnYWJjJykgICAgICAgICAgICAgICAgLy89PiBmYWxzZVxuICogICAgICBSLnN0YXJ0c1dpdGgoWydhJ10sIFsnYScsICdiJywgJ2MnXSkgICAgLy89PiB0cnVlXG4gKiAgICAgIFIuc3RhcnRzV2l0aChbJ2InXSwgWydhJywgJ2InLCAnYyddKSAgICAvLz0+IGZhbHNlXG4gKi9cbnZhciBzdGFydHNXaXRoID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gKHByZWZpeCwgbGlzdCkge1xuICByZXR1cm4gZXF1YWxzKHRha2UocHJlZml4Lmxlbmd0aCwgbGlzdCksIHByZWZpeCk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0c1dpdGg7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94dGFrZSBmcm9tIFwiLi9pbnRlcm5hbC9feHRha2UuanNcIjtcbmltcG9ydCBzbGljZSBmcm9tIFwiLi9zbGljZS5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGBuYCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gbGlzdCwgc3RyaW5nLCBvclxuICogdHJhbnNkdWNlci90cmFuc2Zvcm1lciAob3Igb2JqZWN0IHdpdGggYSBgdGFrZWAgbWV0aG9kKS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgdGFrZWAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHNpZyBOdW1iZXIgLT4gU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5kcm9wXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50YWtlKDEsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nXVxuICogICAgICBSLnRha2UoMiwgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbJ2ZvbycsICdiYXInXVxuICogICAgICBSLnRha2UoMywgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbJ2ZvbycsICdiYXInLCAnYmF6J11cbiAqICAgICAgUi50YWtlKDQsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nLCAnYmFyJywgJ2JheiddXG4gKiAgICAgIFIudGFrZSgzLCAncmFtZGEnKTsgICAgICAgICAgICAgICAvLz0+ICdyYW0nXG4gKlxuICogICAgICBjb25zdCBwZXJzb25uZWwgPSBbXG4gKiAgICAgICAgJ0RhdmUgQnJ1YmVjaycsXG4gKiAgICAgICAgJ1BhdWwgRGVzbW9uZCcsXG4gKiAgICAgICAgJ0V1Z2VuZSBXcmlnaHQnLFxuICogICAgICAgICdKb2UgTW9yZWxsbycsXG4gKiAgICAgICAgJ0dlcnJ5IE11bGxpZ2FuJyxcbiAqICAgICAgICAnQm9iIEJhdGVzJyxcbiAqICAgICAgICAnSm9lIERvZGdlJyxcbiAqICAgICAgICAnUm9uIENyb3R0eSdcbiAqICAgICAgXTtcbiAqXG4gKiAgICAgIGNvbnN0IHRha2VGaXZlID0gUi50YWtlKDUpO1xuICogICAgICB0YWtlRml2ZShwZXJzb25uZWwpO1xuICogICAgICAvLz0+IFsnRGF2ZSBCcnViZWNrJywgJ1BhdWwgRGVzbW9uZCcsICdFdWdlbmUgV3JpZ2h0JywgJ0pvZSBNb3JlbGxvJywgJ0dlcnJ5IE11bGxpZ2FuJ11cbiAqIEBzeW1iIFIudGFrZSgtMSwgW2EsIGJdKSA9IFthLCBiXVxuICogQHN5bWIgUi50YWtlKDAsIFthLCBiXSkgPSBbXVxuICogQHN5bWIgUi50YWtlKDEsIFthLCBiXSkgPSBbYV1cbiAqIEBzeW1iIFIudGFrZSgyLCBbYSwgYl0pID0gW2EsIGJdXG4gKi9cbnZhciB0YWtlID0gLyojX19QVVJFX18qL19jdXJyeTIoIC8qI19fUFVSRV9fKi9fZGlzcGF0Y2hhYmxlKFsndGFrZSddLCBfeHRha2UsIGZ1bmN0aW9uIHRha2UobiwgeHMpIHtcbiAgcmV0dXJuIHNsaWNlKDAsIG4gPCAwID8gSW5maW5pdHkgOiBuLCB4cyk7XG59KSk7XG5leHBvcnQgZGVmYXVsdCB0YWtlOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3QgaW50byBhbiBhcnJheSBvZiBrZXksIHZhbHVlIGFycmF5cy4gT25seSB0aGUgb2JqZWN0J3NcbiAqIG93biBwcm9wZXJ0aWVzIGFyZSB1c2VkLlxuICogTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0IGFycmF5IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnRcbiAqIGFjcm9zcyBkaWZmZXJlbnQgSlMgcGxhdGZvcm1zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjQuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7U3RyaW5nOiAqfSAtPiBbW1N0cmluZywqXV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBleHRyYWN0IGZyb21cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBrZXksIHZhbHVlIGFycmF5cyBmcm9tIHRoZSBvYmplY3QncyBvd24gcHJvcGVydGllcy5cbiAqIEBzZWUgUi5mcm9tUGFpcnMsIFIua2V5cywgUi52YWx1ZXNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnRvUGFpcnMoe2E6IDEsIGI6IDIsIGM6IDN9KTsgLy89PiBbWydhJywgMV0sIFsnYicsIDJdLCBbJ2MnLCAzXV1cbiAqL1xudmFyIHRvUGFpcnMgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiB0b1BhaXJzKG9iaikge1xuICB2YXIgcGFpcnMgPSBbXTtcbiAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHtcbiAgICBpZiAoX2hhcyhwcm9wLCBvYmopKSB7XG4gICAgICBwYWlyc1twYWlycy5sZW5ndGhdID0gW3Byb3AsIG9ialtwcm9wXV07XG4gICAgfVxuICB9XG4gIHJldHVybiBwYWlycztcbn0pO1xuZXhwb3J0IGRlZmF1bHQgdG9QYWlyczsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX3RvU3RyaW5nIGZyb20gXCIuL2ludGVybmFsL190b1N0cmluZy5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdmFsdWUuIGBldmFsYCdpbmcgdGhlIG91dHB1dFxuICogc2hvdWxkIHJlc3VsdCBpbiBhIHZhbHVlIGVxdWl2YWxlbnQgdG8gdGhlIGlucHV0IHZhbHVlLiBNYW55IG9mIHRoZSBidWlsdC1pblxuICogYHRvU3RyaW5nYCBtZXRob2RzIGRvIG5vdCBzYXRpc2Z5IHRoaXMgcmVxdWlyZW1lbnQuXG4gKlxuICogSWYgdGhlIGdpdmVuIHZhbHVlIGlzIGFuIGBbb2JqZWN0IE9iamVjdF1gIHdpdGggYSBgdG9TdHJpbmdgIG1ldGhvZCBvdGhlclxuICogdGhhbiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AsIHRoaXMgbWV0aG9kIGlzIGludm9rZWQgd2l0aCBubyBhcmd1bWVudHNcbiAqIHRvIHByb2R1Y2UgdGhlIHJldHVybiB2YWx1ZS4gVGhpcyBtZWFucyB1c2VyLWRlZmluZWQgY29uc3RydWN0b3IgZnVuY3Rpb25zXG4gKiBjYW4gcHJvdmlkZSBhIHN1aXRhYmxlIGB0b1N0cmluZ2AgbWV0aG9kLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgZnVuY3Rpb24gUG9pbnQoeCwgeSkge1xuICogICAgICAgdGhpcy54ID0geDtcbiAqICAgICAgIHRoaXMueSA9IHk7XG4gKiAgICAgfVxuICpcbiAqICAgICBQb2ludC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAqICAgICAgIHJldHVybiAnbmV3IFBvaW50KCcgKyB0aGlzLnggKyAnLCAnICsgdGhpcy55ICsgJyknO1xuICogICAgIH07XG4gKlxuICogICAgIFIudG9TdHJpbmcobmV3IFBvaW50KDEsIDIpKTsgLy89PiAnbmV3IFBvaW50KDEsIDIpJ1xuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE0LjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBzaWcgKiAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50b1N0cmluZyg0Mik7IC8vPT4gJzQyJ1xuICogICAgICBSLnRvU3RyaW5nKCdhYmMnKTsgLy89PiAnXCJhYmNcIidcbiAqICAgICAgUi50b1N0cmluZyhbMSwgMiwgM10pOyAvLz0+ICdbMSwgMiwgM10nXG4gKiAgICAgIFIudG9TdHJpbmcoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9KTsgLy89PiAne1wiYmFyXCI6IDIsIFwiYmF6XCI6IDMsIFwiZm9vXCI6IDF9J1xuICogICAgICBSLnRvU3RyaW5nKG5ldyBEYXRlKCcyMDAxLTAyLTAzVDA0OjA1OjA2WicpKTsgLy89PiAnbmV3IERhdGUoXCIyMDAxLTAyLTAzVDA0OjA1OjA2LjAwMFpcIiknXG4gKi9cbnZhciB0b1N0cmluZyA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIHRvU3RyaW5nKHZhbCkge1xuICByZXR1cm4gX3RvU3RyaW5nKHZhbCwgW10pO1xufSk7XG5leHBvcnQgZGVmYXVsdCB0b1N0cmluZzsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5cbi8qKlxuICogR2l2ZXMgYSBzaW5nbGUtd29yZCBzdHJpbmcgZGVzY3JpcHRpb24gb2YgdGhlIChuYXRpdmUpIHR5cGUgb2YgYSB2YWx1ZSxcbiAqIHJldHVybmluZyBzdWNoIGFuc3dlcnMgYXMgJ09iamVjdCcsICdOdW1iZXInLCAnQXJyYXknLCBvciAnTnVsbCcuIERvZXMgbm90XG4gKiBhdHRlbXB0IHRvIGRpc3Rpbmd1aXNoIHVzZXIgT2JqZWN0IHR5cGVzIGFueSBmdXJ0aGVyLCByZXBvcnRpbmcgdGhlbSBhbGwgYXNcbiAqICdPYmplY3QnLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjguMFxuICogQGNhdGVnb3J5IFR5cGVcbiAqIEBzaWcgKiAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50eXBlKHt9KTsgLy89PiBcIk9iamVjdFwiXG4gKiAgICAgIFIudHlwZSgxKTsgLy89PiBcIk51bWJlclwiXG4gKiAgICAgIFIudHlwZShmYWxzZSk7IC8vPT4gXCJCb29sZWFuXCJcbiAqICAgICAgUi50eXBlKCdzJyk7IC8vPT4gXCJTdHJpbmdcIlxuICogICAgICBSLnR5cGUobnVsbCk7IC8vPT4gXCJOdWxsXCJcbiAqICAgICAgUi50eXBlKFtdKTsgLy89PiBcIkFycmF5XCJcbiAqICAgICAgUi50eXBlKC9bQS16XS8pOyAvLz0+IFwiUmVnRXhwXCJcbiAqICAgICAgUi50eXBlKCgpID0+IHt9KTsgLy89PiBcIkZ1bmN0aW9uXCJcbiAqICAgICAgUi50eXBlKGFzeW5jICgpID0+IHt9KTsgLy89PiBcIkFzeW5jRnVuY3Rpb25cIlxuICogICAgICBSLnR5cGUodW5kZWZpbmVkKTsgLy89PiBcIlVuZGVmaW5lZFwiXG4gKiAgICAgIFIudHlwZShCaWdJbnQoMTIzKSk7IC8vPT4gXCJCaWdJbnRcIlxuICovXG52YXIgdHlwZSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIHR5cGUodmFsKSB7XG4gIHJldHVybiB2YWwgPT09IG51bGwgPyAnTnVsbCcgOiB2YWwgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkuc2xpY2UoOCwgLTEpO1xufSk7XG5leHBvcnQgZGVmYXVsdCB0eXBlOyIsImltcG9ydCBpZGVudGl0eSBmcm9tIFwiLi9pZGVudGl0eS5qc1wiO1xuaW1wb3J0IHVuaXFCeSBmcm9tIFwiLi91bmlxQnkuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyBvbmx5IG9uZSBjb3B5IG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAqIGxpc3QuIFtgUi5lcXVhbHNgXSgjZXF1YWxzKSBpcyB1c2VkIHRvIGRldGVybWluZSBlcXVhbGl0eS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIHVuaXF1ZSBpdGVtcy5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnVuaXEoWzEsIDEsIDIsIDFdKTsgLy89PiBbMSwgMl1cbiAqICAgICAgUi51bmlxKFsxLCAnMSddKTsgICAgIC8vPT4gWzEsICcxJ11cbiAqICAgICAgUi51bmlxKFtbNDJdLCBbNDJdXSk7IC8vPT4gW1s0Ml1dXG4gKi9cbnZhciB1bmlxID0gLyojX19QVVJFX18qL3VuaXFCeShpZGVudGl0eSk7XG5leHBvcnQgZGVmYXVsdCB1bmlxOyIsImltcG9ydCBfU2V0IGZyb20gXCIuL2ludGVybmFsL19TZXQuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeHVuaXFCeSBmcm9tIFwiLi9pbnRlcm5hbC9feHVuaXFCeS5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIG9ubHkgb25lIGNvcHkgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBvcmlnaW5hbFxuICogbGlzdCwgYmFzZWQgdXBvbiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgYXBwbHlpbmcgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIHRvXG4gKiBlYWNoIGxpc3QgZWxlbWVudC4gUHJlZmVycyB0aGUgZmlyc3QgaXRlbSBpZiB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gcHJvZHVjZXNcbiAqIHRoZSBzYW1lIHZhbHVlIG9uIHR3byBpdGVtcy4gW2BSLmVxdWFsc2BdKCNlcXVhbHMpIGlzIHVzZWQgZm9yIGNvbXBhcmlzb24uXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IGIpIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEEgZnVuY3Rpb24gdXNlZCB0byBwcm9kdWNlIGEgdmFsdWUgdG8gdXNlIGR1cmluZyBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIHVuaXF1ZSBpdGVtcy5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnVuaXFCeShNYXRoLmFicywgWy0xLCAtNSwgMiwgMTAsIDEsIDJdKTsgLy89PiBbLTEsIC01LCAyLCAxMF1cbiAqL1xudmFyIHVuaXFCeSA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbXSwgX3h1bmlxQnksIGZ1bmN0aW9uIChmbiwgbGlzdCkge1xuICB2YXIgc2V0ID0gbmV3IF9TZXQoKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGFwcGxpZWRJdGVtLCBpdGVtO1xuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpdGVtID0gbGlzdFtpZHhdO1xuICAgIGFwcGxpZWRJdGVtID0gZm4oaXRlbSk7XG4gICAgaWYgKHNldC5hZGQoYXBwbGllZEl0ZW0pKSB7XG4gICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IHVuaXFCeTsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQga2V5cyBmcm9tIFwiLi9rZXlzLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBzdXBwbGllZCBvYmplY3QuXG4gKiBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBvdXRwdXQgYXJyYXkgaXMgbm90IGd1YXJhbnRlZWQgYWNyb3NzIGRpZmZlcmVudFxuICogSlMgcGxhdGZvcm1zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7azogdn0gLT4gW3ZdXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gZXh0cmFjdCB2YWx1ZXMgZnJvbVxuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHRoZSB2YWx1ZXMgb2YgdGhlIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzLlxuICogQHNlZSBSLnZhbHVlc0luLCBSLmtleXMsIFIudG9QYWlyc1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudmFsdWVzKHthOiAxLCBiOiAyLCBjOiAzfSk7IC8vPT4gWzEsIDIsIDNdXG4gKi9cbnZhciB2YWx1ZXMgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiB2YWx1ZXMob2JqKSB7XG4gIHZhciBwcm9wcyA9IGtleXMob2JqKTtcbiAgdmFyIGxlbiA9IHByb3BzLmxlbmd0aDtcbiAgdmFyIHZhbHMgPSBbXTtcbiAgdmFyIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICB2YWxzW2lkeF0gPSBvYmpbcHJvcHNbaWR4XV07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHZhbHM7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHZhbHVlczsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8vIGBDb25zdGAgaXMgYSBmdW5jdG9yIHRoYXQgZWZmZWN0aXZlbHkgaWdub3JlcyB0aGUgZnVuY3Rpb24gZ2l2ZW4gdG8gYG1hcGAuXG52YXIgQ29uc3QgPSBmdW5jdGlvbiAoeCkge1xuICByZXR1cm4ge1xuICAgIHZhbHVlOiB4LFxuICAgICdmYW50YXN5LWxhbmQvbWFwJzogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgXCJ2aWV3XCIgb2YgdGhlIGdpdmVuIGRhdGEgc3RydWN0dXJlLCBkZXRlcm1pbmVkIGJ5IHRoZSBnaXZlbiBsZW5zLlxuICogVGhlIGxlbnMncyBmb2N1cyBkZXRlcm1pbmVzIHdoaWNoIHBvcnRpb24gb2YgdGhlIGRhdGEgc3RydWN0dXJlIGlzIHZpc2libGUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTYuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgTGVucyBzIGEgLT4gcyAtPiBhXG4gKiBAcGFyYW0ge0xlbnN9IGxlbnNcbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5zZXQsIFIub3ZlciwgUi5sZW5zLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcCwgUi5sZW5zUGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhMZW5zID0gUi5sZW5zUHJvcCgneCcpO1xuICpcbiAqICAgICAgUi52aWV3KHhMZW5zLCB7eDogMSwgeTogMn0pOyAgLy89PiAxXG4gKiAgICAgIFIudmlldyh4TGVucywge3g6IDQsIHk6IDJ9KTsgIC8vPT4gNFxuICovXG52YXIgdmlldyA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHZpZXcobGVucywgeCkge1xuICAvLyBVc2luZyBgQ29uc3RgIGVmZmVjdGl2ZWx5IGlnbm9yZXMgdGhlIHNldHRlciBmdW5jdGlvbiBvZiB0aGUgYGxlbnNgLFxuICAvLyBsZWF2aW5nIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgZ2V0dGVyIGZ1bmN0aW9uIHVubW9kaWZpZWQuXG4gIHJldHVybiBsZW5zKENvbnN0KSh4KS52YWx1ZTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgdmlldzsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBsaXN0IG91dCBvZiB0aGUgdHdvIHN1cHBsaWVkIGJ5IHBhaXJpbmcgdXAgZXF1YWxseS1wb3NpdGlvbmVkXG4gKiBpdGVtcyBmcm9tIGJvdGggbGlzdHMuIFRoZSByZXR1cm5lZCBsaXN0IGlzIHRydW5jYXRlZCB0byB0aGUgbGVuZ3RoIG9mIHRoZVxuICogc2hvcnRlciBvZiB0aGUgdHdvIGlucHV0IGxpc3RzLlxuICogTm90ZTogYHppcGAgaXMgZXF1aXZhbGVudCB0byBgemlwV2l0aChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBbYSwgYl0gfSlgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFtiXSAtPiBbW2EsYl1dXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MSBUaGUgZmlyc3QgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MiBUaGUgc2Vjb25kIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG1hZGUgYnkgcGFpcmluZyB1cCBzYW1lLWluZGV4ZWQgZWxlbWVudHMgb2YgYGxpc3QxYCBhbmQgYGxpc3QyYC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnppcChbMSwgMiwgM10sIFsnYScsICdiJywgJ2MnXSk7IC8vPT4gW1sxLCAnYSddLCBbMiwgJ2InXSwgWzMsICdjJ11dXG4gKiBAc3ltYiBSLnppcChbYSwgYiwgY10sIFtkLCBlLCBmXSkgPSBbW2EsIGRdLCBbYiwgZV0sIFtjLCBmXV1cbiAqL1xudmFyIHppcCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHppcChhLCBiKSB7XG4gIHZhciBsZW4gPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICB2YXIgcnYgPSBBcnJheShsZW4pO1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIHJ2W2lkeF0gPSBbYVtpZHhdLCBiW2lkeF1dO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBydjtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgemlwOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG9iamVjdCBvdXQgb2YgYSBsaXN0IG9mIGtleXMgYW5kIGEgbGlzdCBvZiB2YWx1ZXMuXG4gKiBLZXkvdmFsdWUgcGFpcmluZyBpcyB0cnVuY2F0ZWQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlciBvZiB0aGUgdHdvIGxpc3RzLlxuICogTm90ZTogYHppcE9iamAgaXMgZXF1aXZhbGVudCB0byBgcGlwZSh6aXAsIGZyb21QYWlycylgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW1N0cmluZ10gLT4gWypdIC0+IHtTdHJpbmc6ICp9XG4gKiBAcGFyYW0ge0FycmF5fSBrZXlzIFRoZSBhcnJheSB0aGF0IHdpbGwgYmUgcHJvcGVydGllcyBvbiB0aGUgb3V0cHV0IG9iamVjdC5cbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgbGlzdCBvZiB2YWx1ZXMgb24gdGhlIG91dHB1dCBvYmplY3QuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBvYmplY3QgbWFkZSBieSBwYWlyaW5nIHVwIHNhbWUtaW5kZXhlZCBlbGVtZW50cyBvZiBga2V5c2AgYW5kIGB2YWx1ZXNgLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuemlwT2JqKFsnYScsICdiJywgJ2MnXSwgWzEsIDIsIDNdKTsgLy89PiB7YTogMSwgYjogMiwgYzogM31cbiAqL1xudmFyIHppcE9iaiA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHppcE9iaihrZXlzLCB2YWx1ZXMpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBNYXRoLm1pbihrZXlzLmxlbmd0aCwgdmFsdWVzLmxlbmd0aCk7XG4gIHZhciBvdXQgPSB7fTtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIG91dFtrZXlzW2lkeF1dID0gdmFsdWVzW2lkeF07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgemlwT2JqOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMjQsIFRoZSBDeXRvc2NhcGUgQ29uc29ydGl1bS5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mXG4gKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSDigJxTb2Z0d2FyZeKAnSksIHRvIGRlYWwgaW5cbiAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG9cbiAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzXG4gKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG9cbiAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIOKAnEFTIElT4oCdLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gIH0gOiBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgfSwgX3R5cGVvZihvYmopO1xufVxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eSQxKG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7XG4gIHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7XG59XG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG59XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIHZhciBfaSA9IGFyciA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKF9pID09IG51bGwpIHJldHVybjtcbiAgdmFyIF9hcnIgPSBbXTtcbiAgdmFyIF9uID0gdHJ1ZTtcbiAgdmFyIF9kID0gZmFsc2U7XG4gIHZhciBfcywgX2U7XG4gIHRyeSB7XG4gICAgZm9yIChfaSA9IF9pLmNhbGwoYXJyKTsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gX2Fycjtcbn1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG4gIHJldHVybiBhcnIyO1xufVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7XG4gIHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdO1xuICBpZiAoIWl0KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKGl0KSBvID0gaXQ7XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICB2YXIgRiA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgczogRixcbiAgICAgICAgbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IG9baSsrXVxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIGU6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfSxcbiAgICAgICAgZjogRlxuICAgICAgfTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xuICB9XG4gIHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSxcbiAgICBkaWRFcnIgPSBmYWxzZSxcbiAgICBlcnI7XG4gIHJldHVybiB7XG4gICAgczogZnVuY3Rpb24gKCkge1xuICAgICAgaXQgPSBpdC5jYWxsKG8pO1xuICAgIH0sXG4gICAgbjogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7XG4gICAgICBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lO1xuICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgfSxcbiAgICBlOiBmdW5jdGlvbiAoZSkge1xuICAgICAgZGlkRXJyID0gdHJ1ZTtcbiAgICAgIGVyciA9IGU7XG4gICAgfSxcbiAgICBmOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXQucmV0dXJuICE9IG51bGwpIGl0LnJldHVybigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGRpZEVycikgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxudmFyIF93aW5kb3cgPSB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiB3aW5kb3c7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxudmFyIG5hdmlnYXRvciA9IF93aW5kb3cgPyBfd2luZG93Lm5hdmlnYXRvciA6IG51bGw7XG5fd2luZG93ID8gX3dpbmRvdy5kb2N1bWVudCA6IG51bGw7XG52YXIgdHlwZW9mc3RyID0gX3R5cGVvZignJyk7XG52YXIgdHlwZW9mb2JqID0gX3R5cGVvZih7fSk7XG52YXIgdHlwZW9mZm4gPSBfdHlwZW9mKGZ1bmN0aW9uICgpIHt9KTtcbnZhciB0eXBlb2ZodG1sZWxlID0gdHlwZW9mIEhUTUxFbGVtZW50ID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YoSFRNTEVsZW1lbnQpO1xudmFyIGluc3RhbmNlU3RyID0gZnVuY3Rpb24gaW5zdGFuY2VTdHIob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLmluc3RhbmNlU3RyaW5nICYmIGZuJDYob2JqLmluc3RhbmNlU3RyaW5nKSA/IG9iai5pbnN0YW5jZVN0cmluZygpIDogbnVsbDtcbn07XG5cbnZhciBzdHJpbmcgPSBmdW5jdGlvbiBzdHJpbmcob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiBfdHlwZW9mKG9iaikgPT0gdHlwZW9mc3RyO1xufTtcbnZhciBmbiQ2ID0gZnVuY3Rpb24gZm4ob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiBfdHlwZW9mKG9iaikgPT09IHR5cGVvZmZuO1xufTtcbnZhciBhcnJheSA9IGZ1bmN0aW9uIGFycmF5KG9iaikge1xuICByZXR1cm4gIWVsZW1lbnRPckNvbGxlY3Rpb24ob2JqKSAmJiAoQXJyYXkuaXNBcnJheSA/IEFycmF5LmlzQXJyYXkob2JqKSA6IG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIEFycmF5KTtcbn07XG52YXIgcGxhaW5PYmplY3QgPSBmdW5jdGlvbiBwbGFpbk9iamVjdChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PT0gdHlwZW9mb2JqICYmICFhcnJheShvYmopICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0O1xufTtcbnZhciBvYmplY3QgPSBmdW5jdGlvbiBvYmplY3Qob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiBfdHlwZW9mKG9iaikgPT09IHR5cGVvZm9iajtcbn07XG52YXIgbnVtYmVyJDEgPSBmdW5jdGlvbiBudW1iZXIob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiBfdHlwZW9mKG9iaikgPT09IF90eXBlb2YoMSkgJiYgIWlzTmFOKG9iaik7XG59O1xudmFyIGludGVnZXIgPSBmdW5jdGlvbiBpbnRlZ2VyKG9iaikge1xuICByZXR1cm4gbnVtYmVyJDEob2JqKSAmJiBNYXRoLmZsb29yKG9iaikgPT09IG9iajtcbn07XG52YXIgaHRtbEVsZW1lbnQgPSBmdW5jdGlvbiBodG1sRWxlbWVudChvYmopIHtcbiAgaWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2ZodG1sZWxlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbCAhPSBvYmogJiYgb2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG4gIH1cbn07XG52YXIgZWxlbWVudE9yQ29sbGVjdGlvbiA9IGZ1bmN0aW9uIGVsZW1lbnRPckNvbGxlY3Rpb24ob2JqKSB7XG4gIHJldHVybiBlbGVtZW50KG9iaikgfHwgY29sbGVjdGlvbihvYmopO1xufTtcbnZhciBlbGVtZW50ID0gZnVuY3Rpb24gZWxlbWVudChvYmopIHtcbiAgcmV0dXJuIGluc3RhbmNlU3RyKG9iaikgPT09ICdjb2xsZWN0aW9uJyAmJiBvYmouX3ByaXZhdGUuc2luZ2xlO1xufTtcbnZhciBjb2xsZWN0aW9uID0gZnVuY3Rpb24gY29sbGVjdGlvbihvYmopIHtcbiAgcmV0dXJuIGluc3RhbmNlU3RyKG9iaikgPT09ICdjb2xsZWN0aW9uJyAmJiAhb2JqLl9wcml2YXRlLnNpbmdsZTtcbn07XG52YXIgY29yZSA9IGZ1bmN0aW9uIGNvcmUob2JqKSB7XG4gIHJldHVybiBpbnN0YW5jZVN0cihvYmopID09PSAnY29yZSc7XG59O1xudmFyIHN0eWxlc2hlZXQgPSBmdW5jdGlvbiBzdHlsZXNoZWV0KG9iaikge1xuICByZXR1cm4gaW5zdGFuY2VTdHIob2JqKSA9PT0gJ3N0eWxlc2hlZXQnO1xufTtcbnZhciBldmVudCA9IGZ1bmN0aW9uIGV2ZW50KG9iaikge1xuICByZXR1cm4gaW5zdGFuY2VTdHIob2JqKSA9PT0gJ2V2ZW50Jztcbn07XG52YXIgZW1wdHlTdHJpbmcgPSBmdW5jdGlvbiBlbXB0eVN0cmluZyhvYmopIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkIHx8IG9iaiA9PT0gbnVsbCkge1xuICAgIC8vIG51bGwgaXMgZW1wdHlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChvYmogPT09ICcnIHx8IG9iai5tYXRjaCgvXlxccyskLykpIHtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gZW1wdHkgc3RyaW5nIGlzIGVtcHR5XG4gIH1cblxuICByZXR1cm4gZmFsc2U7IC8vIG90aGVyd2lzZSwgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3ZlIGdvdFxufTtcbnZhciBkb21FbGVtZW50ID0gZnVuY3Rpb24gZG9tRWxlbWVudChvYmopIHtcbiAgaWYgKHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIHdlJ3JlIG5vdCBpbiBhIGJyb3dzZXIgc28gaXQgZG9lc24ndCBtYXR0ZXJcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG4gIH1cbn07XG52YXIgYm91bmRpbmdCb3ggPSBmdW5jdGlvbiBib3VuZGluZ0JveChvYmopIHtcbiAgcmV0dXJuIHBsYWluT2JqZWN0KG9iaikgJiYgbnVtYmVyJDEob2JqLngxKSAmJiBudW1iZXIkMShvYmoueDIpICYmIG51bWJlciQxKG9iai55MSkgJiYgbnVtYmVyJDEob2JqLnkyKTtcbn07XG52YXIgcHJvbWlzZSA9IGZ1bmN0aW9uIHByb21pc2Uob2JqKSB7XG4gIHJldHVybiBvYmplY3Qob2JqKSAmJiBmbiQ2KG9iai50aGVuKTtcbn07XG52YXIgbXMgPSBmdW5jdGlvbiBtcygpIHtcbiAgcmV0dXJuIG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9tc2llfHRyaWRlbnR8ZWRnZS9pKTtcbn07IC8vIHByb2JhYmx5IGEgYmV0dGVyIHdheSB0byBkZXRlY3QgdGhpcy4uLlxuXG52YXIgbWVtb2l6ZSQxID0gZnVuY3Rpb24gbWVtb2l6ZShmbiwga2V5Rm4pIHtcbiAgaWYgKCFrZXlGbikge1xuICAgIGtleUZuID0gZnVuY3Rpb24ga2V5Rm4oKSB7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICAgIH1cbiAgICAgIHZhciBhcmdzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcmdzLmpvaW4oJyQnKTtcbiAgICB9O1xuICB9XG4gIHZhciBtZW1vaXplZEZuID0gZnVuY3Rpb24gbWVtb2l6ZWRGbigpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIHJldDtcbiAgICB2YXIgayA9IGtleUZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIHZhciBjYWNoZSA9IG1lbW9pemVkRm4uY2FjaGU7XG4gICAgaWYgKCEocmV0ID0gY2FjaGVba10pKSB7XG4gICAgICByZXQgPSBjYWNoZVtrXSA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9O1xuICBtZW1vaXplZEZuLmNhY2hlID0ge307XG4gIHJldHVybiBtZW1vaXplZEZuO1xufTtcblxudmFyIGNhbWVsMmRhc2ggPSBtZW1vaXplJDEoZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbQS1aXSkvZywgZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gJy0nICsgdi50b0xvd2VyQ2FzZSgpO1xuICB9KTtcbn0pO1xudmFyIGRhc2gyY2FtZWwgPSBtZW1vaXplJDEoZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLygtXFx3KS9nLCBmdW5jdGlvbiAodikge1xuICAgIHJldHVybiB2WzFdLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufSk7XG52YXIgcHJlcGVuZENhbWVsID0gbWVtb2l6ZSQxKGZ1bmN0aW9uIChwcmVmaXgsIHN0cikge1xuICByZXR1cm4gcHJlZml4ICsgc3RyWzBdLnRvVXBwZXJDYXNlKCkgKyBzdHIuc3Vic3RyaW5nKDEpO1xufSwgZnVuY3Rpb24gKHByZWZpeCwgc3RyKSB7XG4gIHJldHVybiBwcmVmaXggKyAnJCcgKyBzdHI7XG59KTtcbnZhciBjYXBpdGFsaXplID0gZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHIpIHtcbiAgaWYgKGVtcHR5U3RyaW5nKHN0cikpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc3Vic3RyaW5nKDEpO1xufTtcblxudmFyIG51bWJlciA9ICcoPzpbLStdPyg/Oig/OlxcXFxkK3xcXFxcZCpcXFxcLlxcXFxkKykoPzpbRWVdWystXT9cXFxcZCspPykpJztcbnZhciByZ2JhID0gJ3JnYlthXT9cXFxcKCgnICsgbnVtYmVyICsgJ1slXT8pXFxcXHMqLFxcXFxzKignICsgbnVtYmVyICsgJ1slXT8pXFxcXHMqLFxcXFxzKignICsgbnVtYmVyICsgJ1slXT8pKD86XFxcXHMqLFxcXFxzKignICsgbnVtYmVyICsgJykpP1xcXFwpJztcbnZhciByZ2JhTm9CYWNrUmVmcyA9ICdyZ2JbYV0/XFxcXCgoPzonICsgbnVtYmVyICsgJ1slXT8pXFxcXHMqLFxcXFxzKig/OicgKyBudW1iZXIgKyAnWyVdPylcXFxccyosXFxcXHMqKD86JyArIG51bWJlciArICdbJV0/KSg/OlxcXFxzKixcXFxccyooPzonICsgbnVtYmVyICsgJykpP1xcXFwpJztcbnZhciBoc2xhID0gJ2hzbFthXT9cXFxcKCgnICsgbnVtYmVyICsgJylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIgKyAnWyVdKVxcXFxzKixcXFxccyooJyArIG51bWJlciArICdbJV0pKD86XFxcXHMqLFxcXFxzKignICsgbnVtYmVyICsgJykpP1xcXFwpJztcbnZhciBoc2xhTm9CYWNrUmVmcyA9ICdoc2xbYV0/XFxcXCgoPzonICsgbnVtYmVyICsgJylcXFxccyosXFxcXHMqKD86JyArIG51bWJlciArICdbJV0pXFxcXHMqLFxcXFxzKig/OicgKyBudW1iZXIgKyAnWyVdKSg/OlxcXFxzKixcXFxccyooPzonICsgbnVtYmVyICsgJykpP1xcXFwpJztcbnZhciBoZXgzID0gJ1xcXFwjWzAtOWEtZkEtRl17M30nO1xudmFyIGhleDYgPSAnXFxcXCNbMC05YS1mQS1GXXs2fSc7XG5cbnZhciBhc2NlbmRpbmcgPSBmdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICBpZiAoYSA8IGIpIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSBpZiAoYSA+IGIpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcbnZhciBkZXNjZW5kaW5nID0gZnVuY3Rpb24gZGVzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiAtMSAqIGFzY2VuZGluZyhhLCBiKTtcbn07XG5cbnZhciBleHRlbmQgPSBPYmplY3QuYXNzaWduICE9IG51bGwgPyBPYmplY3QuYXNzaWduLmJpbmQoT2JqZWN0KSA6IGZ1bmN0aW9uICh0Z3QpIHtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBvYmogPSBhcmdzW2ldO1xuICAgIGlmIChvYmogPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGtleXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBrID0ga2V5c1tqXTtcbiAgICAgIHRndFtrXSA9IG9ialtrXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRndDtcbn07XG5cbi8vIGdldCBbciwgZywgYl0gZnJvbSAjYWJjIG9yICNhYWJiY2NcbnZhciBoZXgydHVwbGUgPSBmdW5jdGlvbiBoZXgydHVwbGUoaGV4KSB7XG4gIGlmICghKGhleC5sZW5ndGggPT09IDQgfHwgaGV4Lmxlbmd0aCA9PT0gNykgfHwgaGV4WzBdICE9PSAnIycpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHNob3J0SGV4ID0gaGV4Lmxlbmd0aCA9PT0gNDtcbiAgdmFyIHIsIGcsIGI7XG4gIHZhciBiYXNlID0gMTY7XG4gIGlmIChzaG9ydEhleCkge1xuICAgIHIgPSBwYXJzZUludChoZXhbMV0gKyBoZXhbMV0sIGJhc2UpO1xuICAgIGcgPSBwYXJzZUludChoZXhbMl0gKyBoZXhbMl0sIGJhc2UpO1xuICAgIGIgPSBwYXJzZUludChoZXhbM10gKyBoZXhbM10sIGJhc2UpO1xuICB9IGVsc2Uge1xuICAgIHIgPSBwYXJzZUludChoZXhbMV0gKyBoZXhbMl0sIGJhc2UpO1xuICAgIGcgPSBwYXJzZUludChoZXhbM10gKyBoZXhbNF0sIGJhc2UpO1xuICAgIGIgPSBwYXJzZUludChoZXhbNV0gKyBoZXhbNl0sIGJhc2UpO1xuICB9XG4gIHJldHVybiBbciwgZywgYl07XG59O1xuXG4vLyBnZXQgW3IsIGcsIGIsIGFdIGZyb20gaHNsKDAsIDAsIDApIG9yIGhzbGEoMCwgMCwgMCwgMClcbnZhciBoc2wydHVwbGUgPSBmdW5jdGlvbiBoc2wydHVwbGUoaHNsKSB7XG4gIHZhciByZXQ7XG4gIHZhciBoLCBzLCBsLCBhLCByLCBnLCBiO1xuICBmdW5jdGlvbiBodWUycmdiKHAsIHEsIHQpIHtcbiAgICBpZiAodCA8IDApIHQgKz0gMTtcbiAgICBpZiAodCA+IDEpIHQgLT0gMTtcbiAgICBpZiAodCA8IDEgLyA2KSByZXR1cm4gcCArIChxIC0gcCkgKiA2ICogdDtcbiAgICBpZiAodCA8IDEgLyAyKSByZXR1cm4gcTtcbiAgICBpZiAodCA8IDIgLyAzKSByZXR1cm4gcCArIChxIC0gcCkgKiAoMiAvIDMgLSB0KSAqIDY7XG4gICAgcmV0dXJuIHA7XG4gIH1cbiAgdmFyIG0gPSBuZXcgUmVnRXhwKCdeJyArIGhzbGEgKyAnJCcpLmV4ZWMoaHNsKTtcbiAgaWYgKG0pIHtcbiAgICAvLyBnZXQgaHVlXG4gICAgaCA9IHBhcnNlSW50KG1bMV0pO1xuICAgIGlmIChoIDwgMCkge1xuICAgICAgaCA9ICgzNjAgLSAtMSAqIGggJSAzNjApICUgMzYwO1xuICAgIH0gZWxzZSBpZiAoaCA+IDM2MCkge1xuICAgICAgaCA9IGggJSAzNjA7XG4gICAgfVxuICAgIGggLz0gMzYwOyAvLyBub3JtYWxpc2Ugb24gWzAsIDFdXG5cbiAgICBzID0gcGFyc2VGbG9hdChtWzJdKTtcbiAgICBpZiAocyA8IDAgfHwgcyA+IDEwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gc2F0dXJhdGlvbiBpcyBbMCwgMTAwXVxuICAgIHMgPSBzIC8gMTAwOyAvLyBub3JtYWxpc2Ugb24gWzAsIDFdXG5cbiAgICBsID0gcGFyc2VGbG9hdChtWzNdKTtcbiAgICBpZiAobCA8IDAgfHwgbCA+IDEwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gbGlnaHRuZXNzIGlzIFswLCAxMDBdXG4gICAgbCA9IGwgLyAxMDA7IC8vIG5vcm1hbGlzZSBvbiBbMCwgMV1cblxuICAgIGEgPSBtWzRdO1xuICAgIGlmIChhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGEgPSBwYXJzZUZsb2F0KGEpO1xuICAgICAgaWYgKGEgPCAwIHx8IGEgPiAxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gYWxwaGEgaXMgWzAsIDFdXG4gICAgfVxuXG4gICAgLy8gbm93LCBjb252ZXJ0IHRvIHJnYlxuICAgIC8vIGNvZGUgZnJvbSBodHRwOi8vbWppamFja3Nvbi5jb20vMjAwOC8wMi9yZ2ItdG8taHNsLWFuZC1yZ2ItdG8taHN2LWNvbG9yLW1vZGVsLWNvbnZlcnNpb24tYWxnb3JpdGhtcy1pbi1qYXZhc2NyaXB0XG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgIHIgPSBnID0gYiA9IE1hdGgucm91bmQobCAqIDI1NSk7IC8vIGFjaHJvbWF0aWNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHEgPSBsIDwgMC41ID8gbCAqICgxICsgcykgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgdmFyIHAgPSAyICogbCAtIHE7XG4gICAgICByID0gTWF0aC5yb3VuZCgyNTUgKiBodWUycmdiKHAsIHEsIGggKyAxIC8gMykpO1xuICAgICAgZyA9IE1hdGgucm91bmQoMjU1ICogaHVlMnJnYihwLCBxLCBoKSk7XG4gICAgICBiID0gTWF0aC5yb3VuZCgyNTUgKiBodWUycmdiKHAsIHEsIGggLSAxIC8gMykpO1xuICAgIH1cbiAgICByZXQgPSBbciwgZywgYiwgYV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vIGdldCBbciwgZywgYiwgYV0gZnJvbSByZ2IoMCwgMCwgMCkgb3IgcmdiYSgwLCAwLCAwLCAwKVxudmFyIHJnYjJ0dXBsZSA9IGZ1bmN0aW9uIHJnYjJ0dXBsZShyZ2IpIHtcbiAgdmFyIHJldDtcbiAgdmFyIG0gPSBuZXcgUmVnRXhwKCdeJyArIHJnYmEgKyAnJCcpLmV4ZWMocmdiKTtcbiAgaWYgKG0pIHtcbiAgICByZXQgPSBbXTtcbiAgICB2YXIgaXNQY3QgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8PSAzOyBpKyspIHtcbiAgICAgIHZhciBjaGFubmVsID0gbVtpXTtcbiAgICAgIGlmIChjaGFubmVsW2NoYW5uZWwubGVuZ3RoIC0gMV0gPT09ICclJykge1xuICAgICAgICBpc1BjdFtpXSA9IHRydWU7XG4gICAgICB9XG4gICAgICBjaGFubmVsID0gcGFyc2VGbG9hdChjaGFubmVsKTtcbiAgICAgIGlmIChpc1BjdFtpXSkge1xuICAgICAgICBjaGFubmVsID0gY2hhbm5lbCAvIDEwMCAqIDI1NTsgLy8gbm9ybWFsaXNlIHRvIFswLCAyNTVdXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFubmVsIDwgMCB8fCBjaGFubmVsID4gMjU1KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gaW52YWxpZCBjaGFubmVsIHZhbHVlXG5cbiAgICAgIHJldC5wdXNoKE1hdGguZmxvb3IoY2hhbm5lbCkpO1xuICAgIH1cbiAgICB2YXIgYXRMZWFzdE9uZUlzUGN0ID0gaXNQY3RbMV0gfHwgaXNQY3RbMl0gfHwgaXNQY3RbM107XG4gICAgdmFyIGFsbEFyZVBjdCA9IGlzUGN0WzFdICYmIGlzUGN0WzJdICYmIGlzUGN0WzNdO1xuICAgIGlmIChhdExlYXN0T25lSXNQY3QgJiYgIWFsbEFyZVBjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gbXVzdCBhbGwgYmUgcGVyY2VudCB2YWx1ZXMgaWYgb25lIGlzXG5cbiAgICB2YXIgYWxwaGEgPSBtWzRdO1xuICAgIGlmIChhbHBoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhbHBoYSA9IHBhcnNlRmxvYXQoYWxwaGEpO1xuICAgICAgaWYgKGFscGhhIDwgMCB8fCBhbHBoYSA+IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBpbnZhbGlkIGFscGhhIHZhbHVlXG5cbiAgICAgIHJldC5wdXNoKGFscGhhKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG52YXIgY29sb3JuYW1lMnR1cGxlID0gZnVuY3Rpb24gY29sb3JuYW1lMnR1cGxlKGNvbG9yKSB7XG4gIHJldHVybiBjb2xvcnNbY29sb3IudG9Mb3dlckNhc2UoKV07XG59O1xudmFyIGNvbG9yMnR1cGxlID0gZnVuY3Rpb24gY29sb3IydHVwbGUoY29sb3IpIHtcbiAgcmV0dXJuIChhcnJheShjb2xvcikgPyBjb2xvciA6IG51bGwpIHx8IGNvbG9ybmFtZTJ0dXBsZShjb2xvcikgfHwgaGV4MnR1cGxlKGNvbG9yKSB8fCByZ2IydHVwbGUoY29sb3IpIHx8IGhzbDJ0dXBsZShjb2xvcik7XG59O1xudmFyIGNvbG9ycyA9IHtcbiAgLy8gc3BlY2lhbCBjb2xvdXIgbmFtZXNcbiAgdHJhbnNwYXJlbnQ6IFswLCAwLCAwLCAwXSxcbiAgLy8gTkIgYWxwaGEgPT09IDBcblxuICAvLyByZWd1bGFyIGNvbG91cnNcbiAgYWxpY2VibHVlOiBbMjQwLCAyNDgsIDI1NV0sXG4gIGFudGlxdWV3aGl0ZTogWzI1MCwgMjM1LCAyMTVdLFxuICBhcXVhOiBbMCwgMjU1LCAyNTVdLFxuICBhcXVhbWFyaW5lOiBbMTI3LCAyNTUsIDIxMl0sXG4gIGF6dXJlOiBbMjQwLCAyNTUsIDI1NV0sXG4gIGJlaWdlOiBbMjQ1LCAyNDUsIDIyMF0sXG4gIGJpc3F1ZTogWzI1NSwgMjI4LCAxOTZdLFxuICBibGFjazogWzAsIDAsIDBdLFxuICBibGFuY2hlZGFsbW9uZDogWzI1NSwgMjM1LCAyMDVdLFxuICBibHVlOiBbMCwgMCwgMjU1XSxcbiAgYmx1ZXZpb2xldDogWzEzOCwgNDMsIDIyNl0sXG4gIGJyb3duOiBbMTY1LCA0MiwgNDJdLFxuICBidXJseXdvb2Q6IFsyMjIsIDE4NCwgMTM1XSxcbiAgY2FkZXRibHVlOiBbOTUsIDE1OCwgMTYwXSxcbiAgY2hhcnRyZXVzZTogWzEyNywgMjU1LCAwXSxcbiAgY2hvY29sYXRlOiBbMjEwLCAxMDUsIDMwXSxcbiAgY29yYWw6IFsyNTUsIDEyNywgODBdLFxuICBjb3JuZmxvd2VyYmx1ZTogWzEwMCwgMTQ5LCAyMzddLFxuICBjb3Juc2lsazogWzI1NSwgMjQ4LCAyMjBdLFxuICBjcmltc29uOiBbMjIwLCAyMCwgNjBdLFxuICBjeWFuOiBbMCwgMjU1LCAyNTVdLFxuICBkYXJrYmx1ZTogWzAsIDAsIDEzOV0sXG4gIGRhcmtjeWFuOiBbMCwgMTM5LCAxMzldLFxuICBkYXJrZ29sZGVucm9kOiBbMTg0LCAxMzQsIDExXSxcbiAgZGFya2dyYXk6IFsxNjksIDE2OSwgMTY5XSxcbiAgZGFya2dyZWVuOiBbMCwgMTAwLCAwXSxcbiAgZGFya2dyZXk6IFsxNjksIDE2OSwgMTY5XSxcbiAgZGFya2toYWtpOiBbMTg5LCAxODMsIDEwN10sXG4gIGRhcmttYWdlbnRhOiBbMTM5LCAwLCAxMzldLFxuICBkYXJrb2xpdmVncmVlbjogWzg1LCAxMDcsIDQ3XSxcbiAgZGFya29yYW5nZTogWzI1NSwgMTQwLCAwXSxcbiAgZGFya29yY2hpZDogWzE1MywgNTAsIDIwNF0sXG4gIGRhcmtyZWQ6IFsxMzksIDAsIDBdLFxuICBkYXJrc2FsbW9uOiBbMjMzLCAxNTAsIDEyMl0sXG4gIGRhcmtzZWFncmVlbjogWzE0MywgMTg4LCAxNDNdLFxuICBkYXJrc2xhdGVibHVlOiBbNzIsIDYxLCAxMzldLFxuICBkYXJrc2xhdGVncmF5OiBbNDcsIDc5LCA3OV0sXG4gIGRhcmtzbGF0ZWdyZXk6IFs0NywgNzksIDc5XSxcbiAgZGFya3R1cnF1b2lzZTogWzAsIDIwNiwgMjA5XSxcbiAgZGFya3Zpb2xldDogWzE0OCwgMCwgMjExXSxcbiAgZGVlcHBpbms6IFsyNTUsIDIwLCAxNDddLFxuICBkZWVwc2t5Ymx1ZTogWzAsIDE5MSwgMjU1XSxcbiAgZGltZ3JheTogWzEwNSwgMTA1LCAxMDVdLFxuICBkaW1ncmV5OiBbMTA1LCAxMDUsIDEwNV0sXG4gIGRvZGdlcmJsdWU6IFszMCwgMTQ0LCAyNTVdLFxuICBmaXJlYnJpY2s6IFsxNzgsIDM0LCAzNF0sXG4gIGZsb3JhbHdoaXRlOiBbMjU1LCAyNTAsIDI0MF0sXG4gIGZvcmVzdGdyZWVuOiBbMzQsIDEzOSwgMzRdLFxuICBmdWNoc2lhOiBbMjU1LCAwLCAyNTVdLFxuICBnYWluc2Jvcm86IFsyMjAsIDIyMCwgMjIwXSxcbiAgZ2hvc3R3aGl0ZTogWzI0OCwgMjQ4LCAyNTVdLFxuICBnb2xkOiBbMjU1LCAyMTUsIDBdLFxuICBnb2xkZW5yb2Q6IFsyMTgsIDE2NSwgMzJdLFxuICBncmF5OiBbMTI4LCAxMjgsIDEyOF0sXG4gIGdyZXk6IFsxMjgsIDEyOCwgMTI4XSxcbiAgZ3JlZW46IFswLCAxMjgsIDBdLFxuICBncmVlbnllbGxvdzogWzE3MywgMjU1LCA0N10sXG4gIGhvbmV5ZGV3OiBbMjQwLCAyNTUsIDI0MF0sXG4gIGhvdHBpbms6IFsyNTUsIDEwNSwgMTgwXSxcbiAgaW5kaWFucmVkOiBbMjA1LCA5MiwgOTJdLFxuICBpbmRpZ286IFs3NSwgMCwgMTMwXSxcbiAgaXZvcnk6IFsyNTUsIDI1NSwgMjQwXSxcbiAga2hha2k6IFsyNDAsIDIzMCwgMTQwXSxcbiAgbGF2ZW5kZXI6IFsyMzAsIDIzMCwgMjUwXSxcbiAgbGF2ZW5kZXJibHVzaDogWzI1NSwgMjQwLCAyNDVdLFxuICBsYXduZ3JlZW46IFsxMjQsIDI1MiwgMF0sXG4gIGxlbW9uY2hpZmZvbjogWzI1NSwgMjUwLCAyMDVdLFxuICBsaWdodGJsdWU6IFsxNzMsIDIxNiwgMjMwXSxcbiAgbGlnaHRjb3JhbDogWzI0MCwgMTI4LCAxMjhdLFxuICBsaWdodGN5YW46IFsyMjQsIDI1NSwgMjU1XSxcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IFsyNTAsIDI1MCwgMjEwXSxcbiAgbGlnaHRncmF5OiBbMjExLCAyMTEsIDIxMV0sXG4gIGxpZ2h0Z3JlZW46IFsxNDQsIDIzOCwgMTQ0XSxcbiAgbGlnaHRncmV5OiBbMjExLCAyMTEsIDIxMV0sXG4gIGxpZ2h0cGluazogWzI1NSwgMTgyLCAxOTNdLFxuICBsaWdodHNhbG1vbjogWzI1NSwgMTYwLCAxMjJdLFxuICBsaWdodHNlYWdyZWVuOiBbMzIsIDE3OCwgMTcwXSxcbiAgbGlnaHRza3libHVlOiBbMTM1LCAyMDYsIDI1MF0sXG4gIGxpZ2h0c2xhdGVncmF5OiBbMTE5LCAxMzYsIDE1M10sXG4gIGxpZ2h0c2xhdGVncmV5OiBbMTE5LCAxMzYsIDE1M10sXG4gIGxpZ2h0c3RlZWxibHVlOiBbMTc2LCAxOTYsIDIyMl0sXG4gIGxpZ2h0eWVsbG93OiBbMjU1LCAyNTUsIDIyNF0sXG4gIGxpbWU6IFswLCAyNTUsIDBdLFxuICBsaW1lZ3JlZW46IFs1MCwgMjA1LCA1MF0sXG4gIGxpbmVuOiBbMjUwLCAyNDAsIDIzMF0sXG4gIG1hZ2VudGE6IFsyNTUsIDAsIDI1NV0sXG4gIG1hcm9vbjogWzEyOCwgMCwgMF0sXG4gIG1lZGl1bWFxdWFtYXJpbmU6IFsxMDIsIDIwNSwgMTcwXSxcbiAgbWVkaXVtYmx1ZTogWzAsIDAsIDIwNV0sXG4gIG1lZGl1bW9yY2hpZDogWzE4NiwgODUsIDIxMV0sXG4gIG1lZGl1bXB1cnBsZTogWzE0NywgMTEyLCAyMTldLFxuICBtZWRpdW1zZWFncmVlbjogWzYwLCAxNzksIDExM10sXG4gIG1lZGl1bXNsYXRlYmx1ZTogWzEyMywgMTA0LCAyMzhdLFxuICBtZWRpdW1zcHJpbmdncmVlbjogWzAsIDI1MCwgMTU0XSxcbiAgbWVkaXVtdHVycXVvaXNlOiBbNzIsIDIwOSwgMjA0XSxcbiAgbWVkaXVtdmlvbGV0cmVkOiBbMTk5LCAyMSwgMTMzXSxcbiAgbWlkbmlnaHRibHVlOiBbMjUsIDI1LCAxMTJdLFxuICBtaW50Y3JlYW06IFsyNDUsIDI1NSwgMjUwXSxcbiAgbWlzdHlyb3NlOiBbMjU1LCAyMjgsIDIyNV0sXG4gIG1vY2Nhc2luOiBbMjU1LCAyMjgsIDE4MV0sXG4gIG5hdmFqb3doaXRlOiBbMjU1LCAyMjIsIDE3M10sXG4gIG5hdnk6IFswLCAwLCAxMjhdLFxuICBvbGRsYWNlOiBbMjUzLCAyNDUsIDIzMF0sXG4gIG9saXZlOiBbMTI4LCAxMjgsIDBdLFxuICBvbGl2ZWRyYWI6IFsxMDcsIDE0MiwgMzVdLFxuICBvcmFuZ2U6IFsyNTUsIDE2NSwgMF0sXG4gIG9yYW5nZXJlZDogWzI1NSwgNjksIDBdLFxuICBvcmNoaWQ6IFsyMTgsIDExMiwgMjE0XSxcbiAgcGFsZWdvbGRlbnJvZDogWzIzOCwgMjMyLCAxNzBdLFxuICBwYWxlZ3JlZW46IFsxNTIsIDI1MSwgMTUyXSxcbiAgcGFsZXR1cnF1b2lzZTogWzE3NSwgMjM4LCAyMzhdLFxuICBwYWxldmlvbGV0cmVkOiBbMjE5LCAxMTIsIDE0N10sXG4gIHBhcGF5YXdoaXA6IFsyNTUsIDIzOSwgMjEzXSxcbiAgcGVhY2hwdWZmOiBbMjU1LCAyMTgsIDE4NV0sXG4gIHBlcnU6IFsyMDUsIDEzMywgNjNdLFxuICBwaW5rOiBbMjU1LCAxOTIsIDIwM10sXG4gIHBsdW06IFsyMjEsIDE2MCwgMjIxXSxcbiAgcG93ZGVyYmx1ZTogWzE3NiwgMjI0LCAyMzBdLFxuICBwdXJwbGU6IFsxMjgsIDAsIDEyOF0sXG4gIHJlZDogWzI1NSwgMCwgMF0sXG4gIHJvc3licm93bjogWzE4OCwgMTQzLCAxNDNdLFxuICByb3lhbGJsdWU6IFs2NSwgMTA1LCAyMjVdLFxuICBzYWRkbGVicm93bjogWzEzOSwgNjksIDE5XSxcbiAgc2FsbW9uOiBbMjUwLCAxMjgsIDExNF0sXG4gIHNhbmR5YnJvd246IFsyNDQsIDE2NCwgOTZdLFxuICBzZWFncmVlbjogWzQ2LCAxMzksIDg3XSxcbiAgc2Vhc2hlbGw6IFsyNTUsIDI0NSwgMjM4XSxcbiAgc2llbm5hOiBbMTYwLCA4MiwgNDVdLFxuICBzaWx2ZXI6IFsxOTIsIDE5MiwgMTkyXSxcbiAgc2t5Ymx1ZTogWzEzNSwgMjA2LCAyMzVdLFxuICBzbGF0ZWJsdWU6IFsxMDYsIDkwLCAyMDVdLFxuICBzbGF0ZWdyYXk6IFsxMTIsIDEyOCwgMTQ0XSxcbiAgc2xhdGVncmV5OiBbMTEyLCAxMjgsIDE0NF0sXG4gIHNub3c6IFsyNTUsIDI1MCwgMjUwXSxcbiAgc3ByaW5nZ3JlZW46IFswLCAyNTUsIDEyN10sXG4gIHN0ZWVsYmx1ZTogWzcwLCAxMzAsIDE4MF0sXG4gIHRhbjogWzIxMCwgMTgwLCAxNDBdLFxuICB0ZWFsOiBbMCwgMTI4LCAxMjhdLFxuICB0aGlzdGxlOiBbMjE2LCAxOTEsIDIxNl0sXG4gIHRvbWF0bzogWzI1NSwgOTksIDcxXSxcbiAgdHVycXVvaXNlOiBbNjQsIDIyNCwgMjA4XSxcbiAgdmlvbGV0OiBbMjM4LCAxMzAsIDIzOF0sXG4gIHdoZWF0OiBbMjQ1LCAyMjIsIDE3OV0sXG4gIHdoaXRlOiBbMjU1LCAyNTUsIDI1NV0sXG4gIHdoaXRlc21va2U6IFsyNDUsIDI0NSwgMjQ1XSxcbiAgeWVsbG93OiBbMjU1LCAyNTUsIDBdLFxuICB5ZWxsb3dncmVlbjogWzE1NCwgMjA1LCA1MF1cbn07XG5cbi8vIHNldHMgdGhlIHZhbHVlIGluIGEgbWFwIChtYXAgbWF5IG5vdCBiZSBidWlsdClcbnZhciBzZXRNYXAgPSBmdW5jdGlvbiBzZXRNYXAob3B0aW9ucykge1xuICB2YXIgb2JqID0gb3B0aW9ucy5tYXA7XG4gIHZhciBrZXlzID0gb3B0aW9ucy5rZXlzO1xuICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmIChwbGFpbk9iamVjdChrZXkpKSB7XG4gICAgICB0aHJvdyBFcnJvcignVHJpZWQgdG8gc2V0IG1hcCB3aXRoIG9iamVjdCBrZXknKTtcbiAgICB9XG4gICAgaWYgKGkgPCBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgIC8vIGV4dGVuZCB0aGUgbWFwIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKG9ialtrZXldID09IG51bGwpIHtcbiAgICAgICAgb2JqW2tleV0gPSB7fTtcbiAgICAgIH1cbiAgICAgIG9iaiA9IG9ialtrZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzZXQgdGhlIHZhbHVlXG4gICAgICBvYmpba2V5XSA9IG9wdGlvbnMudmFsdWU7XG4gICAgfVxuICB9XG59O1xuXG4vLyBnZXRzIHRoZSB2YWx1ZSBpbiBhIG1hcCBldmVuIGlmIGl0J3Mgbm90IGJ1aWx0IGluIHBsYWNlc1xudmFyIGdldE1hcCA9IGZ1bmN0aW9uIGdldE1hcChvcHRpb25zKSB7XG4gIHZhciBvYmogPSBvcHRpb25zLm1hcDtcbiAgdmFyIGtleXMgPSBvcHRpb25zLmtleXM7XG4gIHZhciBsID0ga2V5cy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgaWYgKHBsYWluT2JqZWN0KGtleSkpIHtcbiAgICAgIHRocm93IEVycm9yKCdUcmllZCB0byBnZXQgbWFwIHdpdGggb2JqZWN0IGtleScpO1xuICAgIH1cbiAgICBvYmogPSBvYmpba2V5XTtcbiAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxudmFyIGlzT2JqZWN0XzEgPSBpc09iamVjdDtcblxudmFyIGNvbW1vbmpzR2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDoge307XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZuLCBtb2R1bGUpIHtcblx0cmV0dXJuIG1vZHVsZSA9IHsgZXhwb3J0czoge30gfSwgZm4obW9kdWxlLCBtb2R1bGUuZXhwb3J0cyksIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgY29tbW9uanNHbG9iYWwgPT0gJ29iamVjdCcgJiYgY29tbW9uanNHbG9iYWwgJiYgY29tbW9uanNHbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgY29tbW9uanNHbG9iYWw7XG5cbnZhciBfZnJlZUdsb2JhbCA9IGZyZWVHbG9iYWw7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IF9mcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbnZhciBfcm9vdCA9IHJvb3Q7XG5cbi8qKlxuICogR2V0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlXG4gKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgRGF0ZVxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gKiB9LCBfLm5vdygpKTtcbiAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gKi9cbnZhciBub3cgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIF9yb290LkRhdGUubm93KCk7XG59O1xuXG52YXIgbm93XzEgPSBub3c7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGEgc2luZ2xlIHdoaXRlc3BhY2UgY2hhcmFjdGVyLiAqL1xudmFyIHJlV2hpdGVzcGFjZSA9IC9cXHMvO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1FbmRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2VcbiAqIGNoYXJhY3RlciBvZiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIuXG4gKi9cbmZ1bmN0aW9uIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpIHtcbiAgdmFyIGluZGV4ID0gc3RyaW5nLmxlbmd0aDtcblxuICB3aGlsZSAoaW5kZXgtLSAmJiByZVdoaXRlc3BhY2UudGVzdChzdHJpbmcuY2hhckF0KGluZGV4KSkpIHt9XG4gIHJldHVybiBpbmRleDtcbn1cblxudmFyIF90cmltbWVkRW5kSW5kZXggPSB0cmltbWVkRW5kSW5kZXg7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW1TdGFydCA9IC9eXFxzKy87XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udHJpbWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byB0cmltLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUcmltKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nXG4gICAgPyBzdHJpbmcuc2xpY2UoMCwgX3RyaW1tZWRFbmRJbmRleChzdHJpbmcpICsgMSkucmVwbGFjZShyZVRyaW1TdGFydCwgJycpXG4gICAgOiBzdHJpbmc7XG59XG5cbnZhciBfYmFzZVRyaW0gPSBiYXNlVHJpbTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sJDEgPSBfcm9vdC5TeW1ib2w7XG5cbnZhciBfU3ltYm9sID0gU3ltYm9sJDE7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byQ1ID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkkNCA9IG9iamVjdFByb3RvJDUuaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyQxID0gb2JqZWN0UHJvdG8kNS50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWckMSA9IF9TeW1ib2wgPyBfU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eSQ0LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnJDEpLFxuICAgICAgdGFnID0gdmFsdWVbc3ltVG9TdHJpbmdUYWckMV07XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZyQxXSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZyQxLmNhbGwodmFsdWUpO1xuICBpZiAodW5tYXNrZWQpIHtcbiAgICBpZiAoaXNPd24pIHtcbiAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnJDFdID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWckMV07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbnZhciBfZ2V0UmF3VGFnID0gZ2V0UmF3VGFnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8kNCA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvJDQudG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG59XG5cbnZhciBfb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RUb1N0cmluZztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXSc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gX1N5bWJvbCA/IF9TeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICB9XG4gIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICA/IF9nZXRSYXdUYWcodmFsdWUpXG4gICAgOiBfb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufVxuXG52YXIgX2Jhc2VHZXRUYWcgPSBiYXNlR2V0VGFnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxudmFyIGlzT2JqZWN0TGlrZV8xID0gaXNPYmplY3RMaWtlO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2VfMSh2YWx1ZSkgJiYgX2Jhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbnZhciBpc1N5bWJvbF8xID0gaXNTeW1ib2w7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbF8xKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0XzEodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3RfMShvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSBfYmFzZVRyaW0odmFsdWUpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxudmFyIHRvTnVtYmVyXzEgPSB0b051bWJlcjtcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCQxID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcbiAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG4gKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICpcbiAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICpcbiAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG4gKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gKlxuICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gKiAgICdsZWFkaW5nJzogdHJ1ZSxcbiAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAqIH0pKTtcbiAqXG4gKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsYXN0QXJncyxcbiAgICAgIGxhc3RUaGlzLFxuICAgICAgbWF4V2FpdCxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHRpbWVySWQsXG4gICAgICBsYXN0Q2FsbFRpbWUsXG4gICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICBtYXhpbmcgPSBmYWxzZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUJDEpO1xuICB9XG4gIHdhaXQgPSB0b051bWJlcl8xKHdhaXQpIHx8IDA7XG4gIGlmIChpc09iamVjdF8xKG9wdGlvbnMpKSB7XG4gICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXJfMShvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzO1xuXG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkge1xuICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICB0aW1lV2FpdGluZyA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgIHJldHVybiBtYXhpbmdcbiAgICAgID8gbmF0aXZlTWluKHRpbWVXYWl0aW5nLCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSlcbiAgICAgIDogdGltZVdhaXRpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgIHZhciB0aW1lID0gbm93XzEoKTtcbiAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICByZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO1xuICAgIH1cbiAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHJlbWFpbmluZ1dhaXQodGltZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICB0aW1lcklkID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gT25seSBpbnZva2UgaWYgd2UgaGF2ZSBgbGFzdEFyZ3NgIHdoaWNoIG1lYW5zIGBmdW5jYCBoYXMgYmVlblxuICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykge1xuICAgICAgcmV0dXJuIGludm9rZUZ1bmModGltZSk7XG4gICAgfVxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgfVxuICAgIGxhc3RJbnZva2VUaW1lID0gMDtcbiAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93XzEoKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3dfMSgpLFxuICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRlYm91bmNlZC5jYW5jZWwgPSBjYW5jZWw7XG4gIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICByZXR1cm4gZGVib3VuY2VkO1xufVxuXG52YXIgZGVib3VuY2VfMSA9IGRlYm91bmNlO1xuXG52YXIgcGVyZm9ybWFuY2UgPSBfd2luZG93ID8gX3dpbmRvdy5wZXJmb3JtYW5jZSA6IG51bGw7XG52YXIgcG5vdyA9IHBlcmZvcm1hbmNlICYmIHBlcmZvcm1hbmNlLm5vdyA/IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xufSA6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIERhdGUubm93KCk7XG59O1xudmFyIHJhZiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKF93aW5kb3cpIHtcbiAgICBpZiAoX3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgX3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKF93aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIF93aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChfd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgICAgICBfd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoX3dpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgICAgICBfd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBmbihwbm93KCkpO1xuICAgICAgfSwgMTAwMCAvIDYwKTtcbiAgICB9XG4gIH07XG59KCk7XG52YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKSB7XG4gIHJldHVybiByYWYoZm4pO1xufTtcbnZhciBwZXJmb3JtYW5jZU5vdyA9IHBub3c7XG5cbnZhciBERUZBVUxUX0hBU0hfU0VFRCA9IDkyNjE7XG52YXIgSyA9IDY1NTk5OyAvLyAzNyBhbHNvIHdvcmtzIHByZXR0eSB3ZWxsXG52YXIgREVGQVVMVF9IQVNIX1NFRURfQUxUID0gNTM4MTtcbnZhciBoYXNoSXRlcmFibGVJbnRzID0gZnVuY3Rpb24gaGFzaEl0ZXJhYmxlSW50cyhpdGVyYXRvcikge1xuICB2YXIgc2VlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogREVGQVVMVF9IQVNIX1NFRUQ7XG4gIC8vIHNkYm0vc3RyaW5nLWhhc2hcbiAgdmFyIGhhc2ggPSBzZWVkO1xuICB2YXIgZW50cnk7XG4gIGZvciAoOzspIHtcbiAgICBlbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICBpZiAoZW50cnkuZG9uZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGhhc2ggPSBoYXNoICogSyArIGVudHJ5LnZhbHVlIHwgMDtcbiAgfVxuICByZXR1cm4gaGFzaDtcbn07XG52YXIgaGFzaEludCA9IGZ1bmN0aW9uIGhhc2hJbnQobnVtKSB7XG4gIHZhciBzZWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBERUZBVUxUX0hBU0hfU0VFRDtcbiAgLy8gc2RibS9zdHJpbmctaGFzaFxuICByZXR1cm4gc2VlZCAqIEsgKyBudW0gfCAwO1xufTtcbnZhciBoYXNoSW50QWx0ID0gZnVuY3Rpb24gaGFzaEludEFsdChudW0pIHtcbiAgdmFyIHNlZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IERFRkFVTFRfSEFTSF9TRUVEX0FMVDtcbiAgLy8gZGpiMi9zdHJpbmctaGFzaFxuICByZXR1cm4gKHNlZWQgPDwgNSkgKyBzZWVkICsgbnVtIHwgMDtcbn07XG52YXIgY29tYmluZUhhc2hlcyA9IGZ1bmN0aW9uIGNvbWJpbmVIYXNoZXMoaGFzaDEsIGhhc2gyKSB7XG4gIHJldHVybiBoYXNoMSAqIDB4MjAwMDAwICsgaGFzaDI7XG59O1xudmFyIGNvbWJpbmVIYXNoZXNBcnJheSA9IGZ1bmN0aW9uIGNvbWJpbmVIYXNoZXNBcnJheShoYXNoZXMpIHtcbiAgcmV0dXJuIGhhc2hlc1swXSAqIDB4MjAwMDAwICsgaGFzaGVzWzFdO1xufTtcbnZhciBoYXNoQXJyYXlzID0gZnVuY3Rpb24gaGFzaEFycmF5cyhoYXNoZXMxLCBoYXNoZXMyKSB7XG4gIHJldHVybiBbaGFzaEludChoYXNoZXMxWzBdLCBoYXNoZXMyWzBdKSwgaGFzaEludEFsdChoYXNoZXMxWzFdLCBoYXNoZXMyWzFdKV07XG59O1xudmFyIGhhc2hJbnRzQXJyYXkgPSBmdW5jdGlvbiBoYXNoSW50c0FycmF5KGludHMsIHNlZWQpIHtcbiAgdmFyIGVudHJ5ID0ge1xuICAgIHZhbHVlOiAwLFxuICAgIGRvbmU6IGZhbHNlXG4gIH07XG4gIHZhciBpID0gMDtcbiAgdmFyIGxlbmd0aCA9IGludHMubGVuZ3RoO1xuICB2YXIgaXRlcmF0b3IgPSB7XG4gICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgIGVudHJ5LnZhbHVlID0gaW50c1tpKytdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cnkuZG9uZSA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGFzaEl0ZXJhYmxlSW50cyhpdGVyYXRvciwgc2VlZCk7XG59O1xudmFyIGhhc2hTdHJpbmcgPSBmdW5jdGlvbiBoYXNoU3RyaW5nKHN0ciwgc2VlZCkge1xuICB2YXIgZW50cnkgPSB7XG4gICAgdmFsdWU6IDAsXG4gICAgZG9uZTogZmFsc2VcbiAgfTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbGVuZ3RoID0gc3RyLmxlbmd0aDtcbiAgdmFyIGl0ZXJhdG9yID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICBlbnRyeS52YWx1ZSA9IHN0ci5jaGFyQ29kZUF0KGkrKyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnRyeS5kb25lID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBoYXNoSXRlcmFibGVJbnRzKGl0ZXJhdG9yLCBzZWVkKTtcbn07XG52YXIgaGFzaFN0cmluZ3MgPSBmdW5jdGlvbiBoYXNoU3RyaW5ncygpIHtcbiAgcmV0dXJuIGhhc2hTdHJpbmdzQXJyYXkoYXJndW1lbnRzKTtcbn07XG52YXIgaGFzaFN0cmluZ3NBcnJheSA9IGZ1bmN0aW9uIGhhc2hTdHJpbmdzQXJyYXkoc3Rycykge1xuICB2YXIgaGFzaDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHN0ciA9IHN0cnNbaV07XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIGhhc2ggPSBoYXNoU3RyaW5nKHN0cik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc2ggPSBoYXNoU3RyaW5nKHN0ciwgaGFzaCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBoYXNoO1xufTtcblxuLypnbG9iYWwgY29uc29sZSAqL1xudmFyIHdhcm5pbmdzRW5hYmxlZCA9IHRydWU7XG52YXIgd2FyblN1cHBvcnRlZCA9IGNvbnNvbGUud2FybiAhPSBudWxsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbnZhciB0cmFjZVN1cHBvcnRlZCA9IGNvbnNvbGUudHJhY2UgIT0gbnVsbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG5cbnZhciBNQVhfSU5UJDEgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCA5MDA3MTk5MjU0NzQwOTkxO1xudmFyIHRydWVpZnkgPSBmdW5jdGlvbiB0cnVlaWZ5KCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgZmFsc2lmeSA9IGZ1bmN0aW9uIGZhbHNpZnkoKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG52YXIgemVyb2lmeSA9IGZ1bmN0aW9uIHplcm9pZnkoKSB7XG4gIHJldHVybiAwO1xufTtcbnZhciBub29wJDEgPSBmdW5jdGlvbiBub29wKCkge307XG52YXIgZXJyb3IgPSBmdW5jdGlvbiBlcnJvcihtc2cpIHtcbiAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG59O1xudmFyIHdhcm5pbmdzID0gZnVuY3Rpb24gd2FybmluZ3MoZW5hYmxlZCkge1xuICBpZiAoZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgd2FybmluZ3NFbmFibGVkID0gISFlbmFibGVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB3YXJuaW5nc0VuYWJsZWQ7XG4gIH1cbn07XG52YXIgd2FybiA9IGZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgaWYgKCF3YXJuaW5ncygpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh3YXJuU3VwcG9ydGVkKSB7XG4gICAgY29uc29sZS53YXJuKG1zZyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2cobXNnKTtcbiAgICBpZiAodHJhY2VTdXBwb3J0ZWQpIHtcbiAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICB9XG4gIH1cbn07IC8qIGVzbGludC1lbmFibGUgKi9cblxudmFyIGNsb25lID0gZnVuY3Rpb24gY2xvbmUob2JqKSB7XG4gIHJldHVybiBleHRlbmQoe30sIG9iaik7XG59O1xuXG4vLyBnZXRzIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBhcmd1bWVudFxudmFyIGNvcHkgPSBmdW5jdGlvbiBjb3B5KG9iaikge1xuICBpZiAob2JqID09IG51bGwpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIGlmIChhcnJheShvYmopKSB7XG4gICAgcmV0dXJuIG9iai5zbGljZSgpO1xuICB9IGVsc2UgaWYgKHBsYWluT2JqZWN0KG9iaikpIHtcbiAgICByZXR1cm4gY2xvbmUob2JqKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG59O1xudmFyIGNvcHlBcnJheSQxID0gZnVuY3Rpb24gY29weUFycmF5KGFycikge1xuICByZXR1cm4gYXJyLnNsaWNlKCk7XG59O1xudmFyIHV1aWQgPSBmdW5jdGlvbiB1dWlkKGEsIGIgLyogcGxhY2Vob2xkZXJzICovKSB7XG4gIGZvciAoXG4gIC8vIGxvb3AgOilcbiAgYiA9IGEgPSAnJztcbiAgLy8gYiAtIHJlc3VsdCAsIGEgLSBudW1lcmljIGxldGlhYmxlXG4gIGErKyA8IDM2O1xuICAvL1xuICBiICs9IGEgKiA1MSAmIDUyIC8vIGlmIFwiYVwiIGlzIG5vdCA5IG9yIDE0IG9yIDE5IG9yIDI0XG4gID9cbiAgLy8gIHJldHVybiBhIHJhbmRvbSBudW1iZXIgb3IgNFxuICAoYSBeIDE1IC8vIGlmIFwiYVwiIGlzIG5vdCAxNVxuICA/XG4gIC8vIGdlbmVyYXRlIGEgcmFuZG9tIG51bWJlciBmcm9tIDAgdG8gMTVcbiAgOCBeIE1hdGgucmFuZG9tKCkgKiAoYSBeIDIwID8gMTYgOiA0KSAvLyB1bmxlc3MgXCJhXCIgaXMgMjAsIGluIHdoaWNoIGNhc2UgYSByYW5kb20gbnVtYmVyIGZyb20gOCB0byAxMVxuICA6IDQgLy8gIG90aGVyd2lzZSA0XG4gICkudG9TdHJpbmcoMTYpIDogJy0nIC8vICBpbiBvdGhlciBjYXNlcyAoaWYgXCJhXCIgaXMgOSwxNCwxOSwyNCkgaW5zZXJ0IFwiLVwiXG4gICkge1xuICB9XG4gIHJldHVybiBiO1xufTtcbnZhciBfc3RhdGljRW1wdHlPYmplY3QgPSB7fTtcbnZhciBzdGF0aWNFbXB0eU9iamVjdCA9IGZ1bmN0aW9uIHN0YXRpY0VtcHR5T2JqZWN0KCkge1xuICByZXR1cm4gX3N0YXRpY0VtcHR5T2JqZWN0O1xufTtcbnZhciBkZWZhdWx0cyRnID0gZnVuY3Rpb24gZGVmYXVsdHMoX2RlZmF1bHRzKSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoX2RlZmF1bHRzKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgdmFyIGZpbGxlZE9wdHMgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgdmFyIG9wdFZhbCA9IG9wdHMgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9wdHNba2V5XTtcbiAgICAgIGZpbGxlZE9wdHNba2V5XSA9IG9wdFZhbCA9PT0gdW5kZWZpbmVkID8gX2RlZmF1bHRzW2tleV0gOiBvcHRWYWw7XG4gICAgfVxuICAgIHJldHVybiBmaWxsZWRPcHRzO1xuICB9O1xufTtcbnZhciByZW1vdmVGcm9tQXJyYXkgPSBmdW5jdGlvbiByZW1vdmVGcm9tQXJyYXkoYXJyLCBlbGUsIG9uZUNvcHkpIHtcbiAgZm9yICh2YXIgaSA9IGFyci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChhcnJbaV0gPT09IGVsZSkge1xuICAgICAgYXJyLnNwbGljZShpLCAxKTtcbiAgICAgIGlmIChvbmVDb3B5KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbnZhciBjbGVhckFycmF5ID0gZnVuY3Rpb24gY2xlYXJBcnJheShhcnIpIHtcbiAgYXJyLnNwbGljZSgwLCBhcnIubGVuZ3RoKTtcbn07XG52YXIgcHVzaCA9IGZ1bmN0aW9uIHB1c2goYXJyLCBvdGhlckFycikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG90aGVyQXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsID0gb3RoZXJBcnJbaV07XG4gICAgYXJyLnB1c2goZWwpO1xuICB9XG59O1xudmFyIGdldFByZWZpeGVkUHJvcGVydHkgPSBmdW5jdGlvbiBnZXRQcmVmaXhlZFByb3BlcnR5KG9iaiwgcHJvcE5hbWUsIHByZWZpeCkge1xuICBpZiAocHJlZml4KSB7XG4gICAgcHJvcE5hbWUgPSBwcmVwZW5kQ2FtZWwocHJlZml4LCBwcm9wTmFtZSk7IC8vIGUuZy4gKGxhYmVsV2lkdGgsIHNvdXJjZSkgPT4gc291cmNlTGFiZWxXaWR0aFxuICB9XG5cbiAgcmV0dXJuIG9ialtwcm9wTmFtZV07XG59O1xudmFyIHNldFByZWZpeGVkUHJvcGVydHkgPSBmdW5jdGlvbiBzZXRQcmVmaXhlZFByb3BlcnR5KG9iaiwgcHJvcE5hbWUsIHByZWZpeCwgdmFsdWUpIHtcbiAgaWYgKHByZWZpeCkge1xuICAgIHByb3BOYW1lID0gcHJlcGVuZENhbWVsKHByZWZpeCwgcHJvcE5hbWUpOyAvLyBlLmcuIChsYWJlbFdpZHRoLCBzb3VyY2UpID0+IHNvdXJjZUxhYmVsV2lkdGhcbiAgfVxuXG4gIG9ialtwcm9wTmFtZV0gPSB2YWx1ZTtcbn07XG5cbi8qIGdsb2JhbCBNYXAgKi9cbnZhciBPYmplY3RNYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBPYmplY3RNYXAoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE9iamVjdE1hcCk7XG4gICAgdGhpcy5fb2JqID0ge307XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKE9iamVjdE1hcCwgW3tcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChrZXksIHZhbCkge1xuICAgICAgdGhpcy5fb2JqW2tleV0gPSB2YWw7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWxldGUoa2V5KSB7XG4gICAgICB0aGlzLl9vYmpba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbGVhclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHRoaXMuX29iaiA9IHt9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX29ialtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fb2JqW2tleV07XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBPYmplY3RNYXA7XG59KCk7XG52YXIgTWFwJDIgPSB0eXBlb2YgTWFwICE9PSAndW5kZWZpbmVkJyA/IE1hcCA6IE9iamVjdE1hcDtcblxuLyogZ2xvYmFsIFNldCAqL1xuXG52YXIgdW5kZWYgPSBcInVuZGVmaW5lZFwiIDtcbnZhciBPYmplY3RTZXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBPYmplY3RTZXQoYXJyYXlPck9iamVjdFNldCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBPYmplY3RTZXQpO1xuICAgIHRoaXMuX29iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5zaXplID0gMDtcbiAgICBpZiAoYXJyYXlPck9iamVjdFNldCAhPSBudWxsKSB7XG4gICAgICB2YXIgYXJyO1xuICAgICAgaWYgKGFycmF5T3JPYmplY3RTZXQuaW5zdGFuY2VTdHJpbmcgIT0gbnVsbCAmJiBhcnJheU9yT2JqZWN0U2V0Lmluc3RhbmNlU3RyaW5nKCkgPT09IHRoaXMuaW5zdGFuY2VTdHJpbmcoKSkge1xuICAgICAgICBhcnIgPSBhcnJheU9yT2JqZWN0U2V0LnRvQXJyYXkoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFyciA9IGFycmF5T3JPYmplY3RTZXQ7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmFkZChhcnJbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfY3JlYXRlQ2xhc3MoT2JqZWN0U2V0LCBbe1xuICAgIGtleTogXCJpbnN0YW5jZVN0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnN0YW5jZVN0cmluZygpIHtcbiAgICAgIHJldHVybiAnc2V0JztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZCh2YWwpIHtcbiAgICAgIHZhciBvID0gdGhpcy5fb2JqO1xuICAgICAgaWYgKG9bdmFsXSAhPT0gMSkge1xuICAgICAgICBvW3ZhbF0gPSAxO1xuICAgICAgICB0aGlzLnNpemUrKztcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWxldGUodmFsKSB7XG4gICAgICB2YXIgbyA9IHRoaXMuX29iajtcbiAgICAgIGlmIChvW3ZhbF0gPT09IDEpIHtcbiAgICAgICAgb1t2YWxdID0gMDtcbiAgICAgICAgdGhpcy5zaXplLS07XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNsZWFyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgdGhpcy5fb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhcyh2YWwpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vYmpbdmFsXSA9PT0gMTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9BcnJheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0FycmF5KCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9vYmopLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5oYXMoa2V5KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb3JFYWNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvQXJyYXkoKS5mb3JFYWNoKGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIE9iamVjdFNldDtcbn0oKTtcbnZhciBTZXQkMSA9ICh0eXBlb2YgU2V0ID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YoU2V0KSkgIT09IHVuZGVmID8gU2V0IDogT2JqZWN0U2V0O1xuXG4vLyByZXByZXNlbnRzIGEgbm9kZSBvciBhbiBlZGdlXG52YXIgRWxlbWVudCA9IGZ1bmN0aW9uIEVsZW1lbnQoY3ksIHBhcmFtcykge1xuICB2YXIgcmVzdG9yZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcbiAgaWYgKGN5ID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSB1bmRlZmluZWQgfHwgIWNvcmUoY3kpKSB7XG4gICAgZXJyb3IoJ0FuIGVsZW1lbnQgbXVzdCBoYXZlIGEgY29yZSByZWZlcmVuY2UgYW5kIHBhcmFtZXRlcnMgc2V0Jyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBncm91cCA9IHBhcmFtcy5ncm91cDtcblxuICAvLyB0cnkgdG8gYXV0b21hdGljYWxseSBpbmZlciB0aGUgZ3JvdXAgaWYgdW5zcGVjaWZpZWRcbiAgaWYgKGdyb3VwID09IG51bGwpIHtcbiAgICBpZiAocGFyYW1zLmRhdGEgJiYgcGFyYW1zLmRhdGEuc291cmNlICE9IG51bGwgJiYgcGFyYW1zLmRhdGEudGFyZ2V0ICE9IG51bGwpIHtcbiAgICAgIGdyb3VwID0gJ2VkZ2VzJztcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JvdXAgPSAnbm9kZXMnO1xuICAgIH1cbiAgfVxuXG4gIC8vIHZhbGlkYXRlIGdyb3VwXG4gIGlmIChncm91cCAhPT0gJ25vZGVzJyAmJiBncm91cCAhPT0gJ2VkZ2VzJykge1xuICAgIGVycm9yKCdBbiBlbGVtZW50IG11c3QgYmUgb2YgdHlwZSBgbm9kZXNgIG9yIGBlZGdlc2A7IHlvdSBzcGVjaWZpZWQgYCcgKyBncm91cCArICdgJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gbWFrZSB0aGUgZWxlbWVudCBhcnJheS1saWtlLCBqdXN0IGxpa2UgYSBjb2xsZWN0aW9uXG4gIHRoaXMubGVuZ3RoID0gMTtcbiAgdGhpc1swXSA9IHRoaXM7XG5cbiAgLy8gTk9URTogd2hlbiBzb21ldGhpbmcgaXMgYWRkZWQgaGVyZSwgYWRkIGFsc28gdG8gZWxlLmpzb24oKVxuICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlID0ge1xuICAgIGN5OiBjeSxcbiAgICBzaW5nbGU6IHRydWUsXG4gICAgLy8gaW5kaWNhdGVzIHRoaXMgaXMgYW4gZWxlbWVudFxuICAgIGRhdGE6IHBhcmFtcy5kYXRhIHx8IHt9LFxuICAgIC8vIGRhdGEgb2JqZWN0XG4gICAgcG9zaXRpb246IHBhcmFtcy5wb3NpdGlvbiB8fCB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH0sXG4gICAgLy8gKHgsIHkpIHBvc2l0aW9uIHBhaXJcbiAgICBhdXRvV2lkdGg6IHVuZGVmaW5lZCxcbiAgICAvLyB3aWR0aCBhbmQgaGVpZ2h0IG9mIG5vZGVzIGNhbGN1bGF0ZWQgYnkgdGhlIHJlbmRlcmVyIHdoZW4gc2V0IHRvIHNwZWNpYWwgJ2F1dG8nIHZhbHVlXG4gICAgYXV0b0hlaWdodDogdW5kZWZpbmVkLFxuICAgIGF1dG9QYWRkaW5nOiB1bmRlZmluZWQsXG4gICAgY29tcG91bmRCb3VuZHNDbGVhbjogZmFsc2UsXG4gICAgLy8gd2hldGhlciB0aGUgY29tcG91bmQgZGltZW5zaW9ucyBuZWVkIHRvIGJlIHJlY2FsY3VsYXRlZCB0aGUgbmV4dCB0aW1lIGRpbWVuc2lvbnMgYXJlIHJlYWRcbiAgICBsaXN0ZW5lcnM6IFtdLFxuICAgIC8vIGFycmF5IG9mIGJvdW5kIGxpc3RlbmVyc1xuICAgIGdyb3VwOiBncm91cCxcbiAgICAvLyBzdHJpbmc7ICdub2Rlcycgb3IgJ2VkZ2VzJ1xuICAgIHN0eWxlOiB7fSxcbiAgICAvLyBwcm9wZXJ0aWVzIGFzIHNldCBieSB0aGUgc3R5bGVcbiAgICByc3R5bGU6IHt9LFxuICAgIC8vIHByb3BlcnRpZXMgZm9yIHN0eWxlIHNlbnQgZnJvbSB0aGUgcmVuZGVyZXIgdG8gdGhlIGNvcmVcbiAgICBzdHlsZUN4dHM6IFtdLFxuICAgIC8vIGFwcGxpZWQgc3R5bGUgY29udGV4dHMgZnJvbSB0aGUgc3R5bGVyXG4gICAgc3R5bGVLZXlzOiB7fSxcbiAgICAvLyBwZXItZ3JvdXAga2V5cyBvZiBzdHlsZSBwcm9wZXJ0eSB2YWx1ZXNcbiAgICByZW1vdmVkOiB0cnVlLFxuICAgIC8vIHdoZXRoZXIgaXQncyBpbnNpZGUgdGhlIHZpczsgdHJ1ZSBpZiByZW1vdmVkIChzZXQgdHJ1ZSBoZXJlIHNpbmNlIHdlIGNhbGwgcmVzdG9yZSlcbiAgICBzZWxlY3RlZDogcGFyYW1zLnNlbGVjdGVkID8gdHJ1ZSA6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgaXQncyBzZWxlY3RlZFxuICAgIHNlbGVjdGFibGU6IHBhcmFtcy5zZWxlY3RhYmxlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcGFyYW1zLnNlbGVjdGFibGUgPyB0cnVlIDogZmFsc2UsXG4gICAgLy8gd2hldGhlciBpdCdzIHNlbGVjdGFibGVcbiAgICBsb2NrZWQ6IHBhcmFtcy5sb2NrZWQgPyB0cnVlIDogZmFsc2UsXG4gICAgLy8gd2hldGhlciB0aGUgZWxlbWVudCBpcyBsb2NrZWQgKGNhbm5vdCBiZSBtb3ZlZClcbiAgICBncmFiYmVkOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGdyYWJiZWQgYnkgdGhlIG1vdXNlOyByZW5kZXJlciBzZXRzIHRoaXMgcHJpdmF0ZWx5XG4gICAgZ3JhYmJhYmxlOiBwYXJhbXMuZ3JhYmJhYmxlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcGFyYW1zLmdyYWJiYWJsZSA/IHRydWUgOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHRoZSBlbGVtZW50IGNhbiBiZSBncmFiYmVkXG4gICAgcGFubmFibGU6IHBhcmFtcy5wYW5uYWJsZSA9PT0gdW5kZWZpbmVkID8gZ3JvdXAgPT09ICdlZGdlcycgPyB0cnVlIDogZmFsc2UgOiBwYXJhbXMucGFubmFibGUgPyB0cnVlIDogZmFsc2UsXG4gICAgLy8gd2hldGhlciB0aGUgZWxlbWVudCBoYXMgcGFzc3Rocm91Z2ggcGFubmluZyBlbmFibGVkXG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGFjdGl2ZSBmcm9tIHVzZXIgaW50ZXJhY3Rpb25cbiAgICBjbGFzc2VzOiBuZXcgU2V0JDEoKSxcbiAgICAvLyBtYXAgKCBjbGFzc05hbWUgPT4gdHJ1ZSApXG4gICAgYW5pbWF0aW9uOiB7XG4gICAgICAvLyBvYmplY3QgZm9yIGN1cnJlbnRseS1ydW5uaW5nIGFuaW1hdGlvbnNcbiAgICAgIGN1cnJlbnQ6IFtdLFxuICAgICAgcXVldWU6IFtdXG4gICAgfSxcbiAgICByc2NyYXRjaDoge30sXG4gICAgLy8gb2JqZWN0IGluIHdoaWNoIHRoZSByZW5kZXJlciBjYW4gc3RvcmUgaW5mb3JtYXRpb25cbiAgICBzY3JhdGNoOiBwYXJhbXMuc2NyYXRjaCB8fCB7fSxcbiAgICAvLyBzY3JhdGNoIG9iamVjdHNcbiAgICBlZGdlczogW10sXG4gICAgLy8gYXJyYXkgb2YgY29ubmVjdGVkIGVkZ2VzXG4gICAgY2hpbGRyZW46IFtdLFxuICAgIC8vIGFycmF5IG9mIGNoaWxkcmVuXG4gICAgcGFyZW50OiBwYXJhbXMucGFyZW50ICYmIHBhcmFtcy5wYXJlbnQuaXNOb2RlKCkgPyBwYXJhbXMucGFyZW50IDogbnVsbCxcbiAgICAvLyBwYXJlbnQgcmVmXG4gICAgdHJhdmVyc2FsQ2FjaGU6IHt9LFxuICAgIC8vIGNhY2hlIG9mIG91dHB1dCBvZiB0cmF2ZXJzYWwgZnVuY3Rpb25zXG4gICAgYmFja2dyb3VuZGluZzogZmFsc2UsXG4gICAgLy8gd2hldGhlciBiYWNrZ3JvdW5kIGltYWdlcyBhcmUgbG9hZGluZ1xuICAgIGJiQ2FjaGU6IG51bGwsXG4gICAgLy8gY2FjaGUgb2YgdGhlIGN1cnJlbnQgYm91bmRpbmcgYm94XG4gICAgYmJDYWNoZVNoaWZ0OiB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH0sXG4gICAgLy8gc2hpZnQgYXBwbGllZCB0byBjYWNoZWQgYmIgdG8gYmUgYXBwbGllZCBvbiBuZXh0IGdldFxuICAgIGJvZHlCb3VuZHM6IG51bGwsXG4gICAgLy8gYm91bmRzIGNhY2hlIG9mIGVsZW1lbnQgYm9keSwgdy9vIG92ZXJsYXlcbiAgICBvdmVybGF5Qm91bmRzOiBudWxsLFxuICAgIC8vIGJvdW5kcyBjYWNoZSBvZiBlbGVtZW50IGJvZHksIGluY2x1ZGluZyBvdmVybGF5XG4gICAgbGFiZWxCb3VuZHM6IHtcbiAgICAgIC8vIGJvdW5kcyBjYWNoZSBvZiBsYWJlbHNcbiAgICAgIGFsbDogbnVsbCxcbiAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgIHRhcmdldDogbnVsbCxcbiAgICAgIG1haW46IG51bGxcbiAgICB9LFxuICAgIGFycm93Qm91bmRzOiB7XG4gICAgICAvLyBib3VuZHMgY2FjaGUgb2YgZWRnZSBhcnJvd3NcbiAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgIHRhcmdldDogbnVsbCxcbiAgICAgICdtaWQtc291cmNlJzogbnVsbCxcbiAgICAgICdtaWQtdGFyZ2V0JzogbnVsbFxuICAgIH1cbiAgfTtcbiAgaWYgKF9wLnBvc2l0aW9uLnggPT0gbnVsbCkge1xuICAgIF9wLnBvc2l0aW9uLnggPSAwO1xuICB9XG4gIGlmIChfcC5wb3NpdGlvbi55ID09IG51bGwpIHtcbiAgICBfcC5wb3NpdGlvbi55ID0gMDtcbiAgfVxuXG4gIC8vIHJlbmRlcmVkUG9zaXRpb24gb3ZlcnJpZGVzIGlmIHNwZWNpZmllZFxuICBpZiAocGFyYW1zLnJlbmRlcmVkUG9zaXRpb24pIHtcbiAgICB2YXIgcnBvcyA9IHBhcmFtcy5yZW5kZXJlZFBvc2l0aW9uO1xuICAgIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICBfcC5wb3NpdGlvbiA9IHtcbiAgICAgIHg6IChycG9zLnggLSBwYW4ueCkgLyB6b29tLFxuICAgICAgeTogKHJwb3MueSAtIHBhbi55KSAvIHpvb21cbiAgICB9O1xuICB9XG4gIHZhciBjbGFzc2VzID0gW107XG4gIGlmIChhcnJheShwYXJhbXMuY2xhc3NlcykpIHtcbiAgICBjbGFzc2VzID0gcGFyYW1zLmNsYXNzZXM7XG4gIH0gZWxzZSBpZiAoc3RyaW5nKHBhcmFtcy5jbGFzc2VzKSkge1xuICAgIGNsYXNzZXMgPSBwYXJhbXMuY2xhc3Nlcy5zcGxpdCgvXFxzKy8pO1xuICB9XG4gIGZvciAodmFyIGkgPSAwLCBsID0gY2xhc3Nlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIgY2xzID0gY2xhc3Nlc1tpXTtcbiAgICBpZiAoIWNscyB8fCBjbHMgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgX3AuY2xhc3Nlcy5hZGQoY2xzKTtcbiAgfVxuICB0aGlzLmNyZWF0ZUVtaXR0ZXIoKTtcbiAgdmFyIGJ5cGFzcyA9IHBhcmFtcy5zdHlsZSB8fCBwYXJhbXMuY3NzO1xuICBpZiAoYnlwYXNzKSB7XG4gICAgd2FybignU2V0dGluZyBhIGBzdHlsZWAgYnlwYXNzIGF0IGVsZW1lbnQgY3JlYXRpb24gc2hvdWxkIGJlIGRvbmUgb25seSB3aGVuIGFic29sdXRlbHkgbmVjZXNzYXJ5LiAgVHJ5IHRvIHVzZSB0aGUgc3R5bGVzaGVldCBpbnN0ZWFkLicpO1xuICAgIHRoaXMuc3R5bGUoYnlwYXNzKTtcbiAgfVxuICBpZiAocmVzdG9yZSA9PT0gdW5kZWZpbmVkIHx8IHJlc3RvcmUpIHtcbiAgICB0aGlzLnJlc3RvcmUoKTtcbiAgfVxufTtcblxudmFyIGRlZmluZVNlYXJjaCA9IGZ1bmN0aW9uIGRlZmluZVNlYXJjaChwYXJhbXMpIHtcbiAgcGFyYW1zID0ge1xuICAgIGJmczogcGFyYW1zLmJmcyB8fCAhcGFyYW1zLmRmcyxcbiAgICBkZnM6IHBhcmFtcy5kZnMgfHwgIXBhcmFtcy5iZnNcbiAgfTtcblxuICAvLyBmcm9tIHBzZXVkb2NvZGUgb24gd2lraXBlZGlhXG4gIHJldHVybiBmdW5jdGlvbiBzZWFyY2hGbihyb290cywgZm4sIGRpcmVjdGVkKSB7XG4gICAgdmFyIG9wdGlvbnM7XG4gICAgaWYgKHBsYWluT2JqZWN0KHJvb3RzKSAmJiAhZWxlbWVudE9yQ29sbGVjdGlvbihyb290cykpIHtcbiAgICAgIG9wdGlvbnMgPSByb290cztcbiAgICAgIHJvb3RzID0gb3B0aW9ucy5yb290cyB8fCBvcHRpb25zLnJvb3Q7XG4gICAgICBmbiA9IG9wdGlvbnMudmlzaXQ7XG4gICAgICBkaXJlY3RlZCA9IG9wdGlvbnMuZGlyZWN0ZWQ7XG4gICAgfVxuICAgIGRpcmVjdGVkID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMiAmJiAhZm4kNihmbikgPyBmbiA6IGRpcmVjdGVkO1xuICAgIGZuID0gZm4kNihmbikgPyBmbiA6IGZ1bmN0aW9uICgpIHt9O1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgdmFyIHYgPSByb290cyA9IHN0cmluZyhyb290cykgPyB0aGlzLmZpbHRlcihyb290cykgOiByb290cztcbiAgICB2YXIgUSA9IFtdO1xuICAgIHZhciBjb25uZWN0ZWROb2RlcyA9IFtdO1xuICAgIHZhciBjb25uZWN0ZWRCeSA9IHt9O1xuICAgIHZhciBpZDJkZXB0aCA9IHt9O1xuICAgIHZhciBWID0ge307XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBmb3VuZDtcbiAgICB2YXIgX3RoaXMkYnlHcm91cCA9IHRoaXMuYnlHcm91cCgpLFxuICAgICAgbm9kZXMgPSBfdGhpcyRieUdyb3VwLm5vZGVzLFxuICAgICAgZWRnZXMgPSBfdGhpcyRieUdyb3VwLmVkZ2VzO1xuXG4gICAgLy8gZW5xdWV1ZSB2XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmkgPSB2W2ldO1xuICAgICAgdmFyIHZpSWQgPSB2aS5pZCgpO1xuICAgICAgaWYgKHZpLmlzTm9kZSgpKSB7XG4gICAgICAgIFEudW5zaGlmdCh2aSk7XG4gICAgICAgIGlmIChwYXJhbXMuYmZzKSB7XG4gICAgICAgICAgVlt2aUlkXSA9IHRydWU7XG4gICAgICAgICAgY29ubmVjdGVkTm9kZXMucHVzaCh2aSk7XG4gICAgICAgIH1cbiAgICAgICAgaWQyZGVwdGhbdmlJZF0gPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcCgpIHtcbiAgICAgIHZhciB2ID0gcGFyYW1zLmJmcyA/IFEuc2hpZnQoKSA6IFEucG9wKCk7XG4gICAgICB2YXIgdklkID0gdi5pZCgpO1xuICAgICAgaWYgKHBhcmFtcy5kZnMpIHtcbiAgICAgICAgaWYgKFZbdklkXSkge1xuICAgICAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XG4gICAgICAgIH1cbiAgICAgICAgVlt2SWRdID0gdHJ1ZTtcbiAgICAgICAgY29ubmVjdGVkTm9kZXMucHVzaCh2KTtcbiAgICAgIH1cbiAgICAgIHZhciBkZXB0aCA9IGlkMmRlcHRoW3ZJZF07XG4gICAgICB2YXIgcHJldkVkZ2UgPSBjb25uZWN0ZWRCeVt2SWRdO1xuICAgICAgdmFyIHNyYyA9IHByZXZFZGdlICE9IG51bGwgPyBwcmV2RWRnZS5zb3VyY2UoKSA6IG51bGw7XG4gICAgICB2YXIgdGd0ID0gcHJldkVkZ2UgIT0gbnVsbCA/IHByZXZFZGdlLnRhcmdldCgpIDogbnVsbDtcbiAgICAgIHZhciBwcmV2Tm9kZSA9IHByZXZFZGdlID09IG51bGwgPyB1bmRlZmluZWQgOiB2LnNhbWUoc3JjKSA/IHRndFswXSA6IHNyY1swXTtcbiAgICAgIHZhciByZXQgPSB2b2lkIDA7XG4gICAgICByZXQgPSBmbih2LCBwcmV2RWRnZSwgcHJldk5vZGUsIGorKywgZGVwdGgpO1xuICAgICAgaWYgKHJldCA9PT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZCA9IHY7XG4gICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICB9XG4gICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gXCJicmVha1wiO1xuICAgICAgfVxuICAgICAgdmFyIHZ3RWRnZXMgPSB2LmNvbm5lY3RlZEVkZ2VzKCkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiAoIWRpcmVjdGVkIHx8IGUuc291cmNlKCkuc2FtZSh2KSkgJiYgZWRnZXMuaGFzKGUpO1xuICAgICAgfSk7XG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCB2d0VkZ2VzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgdmFyIGUgPSB2d0VkZ2VzW19pMl07XG4gICAgICAgIHZhciB3ID0gZS5jb25uZWN0ZWROb2RlcygpLmZpbHRlcihmdW5jdGlvbiAobikge1xuICAgICAgICAgIHJldHVybiAhbi5zYW1lKHYpICYmIG5vZGVzLmhhcyhuKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB3SWQgPSB3LmlkKCk7XG4gICAgICAgIGlmICh3Lmxlbmd0aCAhPT0gMCAmJiAhVlt3SWRdKSB7XG4gICAgICAgICAgdyA9IHdbMF07XG4gICAgICAgICAgUS5wdXNoKHcpO1xuICAgICAgICAgIGlmIChwYXJhbXMuYmZzKSB7XG4gICAgICAgICAgICBWW3dJZF0gPSB0cnVlO1xuICAgICAgICAgICAgY29ubmVjdGVkTm9kZXMucHVzaCh3KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29ubmVjdGVkQnlbd0lkXSA9IGU7XG4gICAgICAgICAgaWQyZGVwdGhbd0lkXSA9IGlkMmRlcHRoW3ZJZF0gKyAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB3aGlsZSAoUS5sZW5ndGggIT09IDApIHtcbiAgICAgIHZhciBfcmV0ID0gX2xvb3AoKTtcbiAgICAgIGlmIChfcmV0ID09PSBcImNvbnRpbnVlXCIpIGNvbnRpbnVlO1xuICAgICAgaWYgKF9yZXQgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgfVxuICAgIHZhciBjb25uZWN0ZWRFbGVzID0gY3kuY29sbGVjdGlvbigpO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBjb25uZWN0ZWROb2Rlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBub2RlID0gY29ubmVjdGVkTm9kZXNbX2ldO1xuICAgICAgdmFyIGVkZ2UgPSBjb25uZWN0ZWRCeVtub2RlLmlkKCldO1xuICAgICAgaWYgKGVkZ2UgIT0gbnVsbCkge1xuICAgICAgICBjb25uZWN0ZWRFbGVzLnB1c2goZWRnZSk7XG4gICAgICB9XG4gICAgICBjb25uZWN0ZWRFbGVzLnB1c2gobm9kZSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBwYXRoOiBjeS5jb2xsZWN0aW9uKGNvbm5lY3RlZEVsZXMpLFxuICAgICAgZm91bmQ6IGN5LmNvbGxlY3Rpb24oZm91bmQpXG4gICAgfTtcbiAgfTtcbn07XG5cbi8vIHNlYXJjaCwgc3Bhbm5pbmcgdHJlZXMsIGV0Y1xudmFyIGVsZXNmbiR2ID0ge1xuICBicmVhZHRoRmlyc3RTZWFyY2g6IGRlZmluZVNlYXJjaCh7XG4gICAgYmZzOiB0cnVlXG4gIH0pLFxuICBkZXB0aEZpcnN0U2VhcmNoOiBkZWZpbmVTZWFyY2goe1xuICAgIGRmczogdHJ1ZVxuICB9KVxufTtcblxuLy8gbmljZSwgc2hvcnQgbWF0aGVtYXRpY2FsIGFsaWFzXG5lbGVzZm4kdi5iZnMgPSBlbGVzZm4kdi5icmVhZHRoRmlyc3RTZWFyY2g7XG5lbGVzZm4kdi5kZnMgPSBlbGVzZm4kdi5kZXB0aEZpcnN0U2VhcmNoO1xuXG52YXIgaGVhcCQxID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjguMFxuKGZ1bmN0aW9uKCkge1xuICB2YXIgSGVhcCwgZGVmYXVsdENtcCwgZmxvb3IsIGhlYXBpZnksIGhlYXBwb3AsIGhlYXBwdXNoLCBoZWFwcHVzaHBvcCwgaGVhcHJlcGxhY2UsIGluc29ydCwgbWluLCBubGFyZ2VzdCwgbnNtYWxsZXN0LCB1cGRhdGVJdGVtLCBfc2lmdGRvd24sIF9zaWZ0dXA7XG5cbiAgZmxvb3IgPSBNYXRoLmZsb29yLCBtaW4gPSBNYXRoLm1pbjtcblxuXG4gIC8qXG4gIERlZmF1bHQgY29tcGFyaXNvbiBmdW5jdGlvbiB0byBiZSB1c2VkXG4gICAqL1xuXG4gIGRlZmF1bHRDbXAgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgaWYgKHggPCB5KSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGlmICh4ID4geSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9O1xuXG5cbiAgLypcbiAgSW5zZXJ0IGl0ZW0geCBpbiBsaXN0IGEsIGFuZCBrZWVwIGl0IHNvcnRlZCBhc3N1bWluZyBhIGlzIHNvcnRlZC5cbiAgXG4gIElmIHggaXMgYWxyZWFkeSBpbiBhLCBpbnNlcnQgaXQgdG8gdGhlIHJpZ2h0IG9mIHRoZSByaWdodG1vc3QgeC5cbiAgXG4gIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGEubGVuZ3RoKSBib3VuZCB0aGUgc2xpY2VcbiAgb2YgYSB0byBiZSBzZWFyY2hlZC5cbiAgICovXG5cbiAgaW5zb3J0ID0gZnVuY3Rpb24oYSwgeCwgbG8sIGhpLCBjbXApIHtcbiAgICB2YXIgbWlkO1xuICAgIGlmIChsbyA9PSBudWxsKSB7XG4gICAgICBsbyA9IDA7XG4gICAgfVxuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgaWYgKGxvIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpO1xuICAgIH1cbiAgICBpZiAoaGkgPT0gbnVsbCkge1xuICAgICAgaGkgPSBhLmxlbmd0aDtcbiAgICB9XG4gICAgd2hpbGUgKGxvIDwgaGkpIHtcbiAgICAgIG1pZCA9IGZsb29yKChsbyArIGhpKSAvIDIpO1xuICAgICAgaWYgKGNtcCh4LCBhW21pZF0pIDwgMCkge1xuICAgICAgICBoaSA9IG1pZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvID0gbWlkICsgMTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChbXS5zcGxpY2UuYXBwbHkoYSwgW2xvLCBsbyAtIGxvXS5jb25jYXQoeCkpLCB4KTtcbiAgfTtcblxuXG4gIC8qXG4gIFB1c2ggaXRlbSBvbnRvIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC5cbiAgICovXG5cbiAgaGVhcHB1c2ggPSBmdW5jdGlvbihhcnJheSwgaXRlbSwgY21wKSB7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBhcnJheS5wdXNoKGl0ZW0pO1xuICAgIHJldHVybiBfc2lmdGRvd24oYXJyYXksIDAsIGFycmF5Lmxlbmd0aCAtIDEsIGNtcCk7XG4gIH07XG5cblxuICAvKlxuICBQb3AgdGhlIHNtYWxsZXN0IGl0ZW0gb2ZmIHRoZSBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuXG4gICAqL1xuXG4gIGhlYXBwb3AgPSBmdW5jdGlvbihhcnJheSwgY21wKSB7XG4gICAgdmFyIGxhc3RlbHQsIHJldHVybml0ZW07XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBsYXN0ZWx0ID0gYXJyYXkucG9wKCk7XG4gICAgaWYgKGFycmF5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuaXRlbSA9IGFycmF5WzBdO1xuICAgICAgYXJyYXlbMF0gPSBsYXN0ZWx0O1xuICAgICAgX3NpZnR1cChhcnJheSwgMCwgY21wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuaXRlbSA9IGxhc3RlbHQ7XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5pdGVtO1xuICB9O1xuXG5cbiAgLypcbiAgUG9wIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgc21hbGxlc3QgdmFsdWUsIGFuZCBhZGQgdGhlIG5ldyBpdGVtLlxuICBcbiAgVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGhlYXBwb3AoKSBmb2xsb3dlZCBieSBoZWFwcHVzaCgpLCBhbmQgY2FuIGJlXG4gIG1vcmUgYXBwcm9wcmlhdGUgd2hlbiB1c2luZyBhIGZpeGVkIHNpemUgaGVhcC4gTm90ZSB0aGF0IHRoZSB2YWx1ZVxuICByZXR1cm5lZCBtYXkgYmUgbGFyZ2VyIHRoYW4gaXRlbSEgVGhhdCBjb25zdHJhaW5zIHJlYXNvbmFibGUgdXNlIG9mXG4gIHRoaXMgcm91dGluZSB1bmxlc3Mgd3JpdHRlbiBhcyBwYXJ0IG9mIGEgY29uZGl0aW9uYWwgcmVwbGFjZW1lbnQ6XG4gICAgICBpZiBpdGVtID4gYXJyYXlbMF1cbiAgICAgICAgaXRlbSA9IGhlYXByZXBsYWNlKGFycmF5LCBpdGVtKVxuICAgKi9cblxuICBoZWFwcmVwbGFjZSA9IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBjbXApIHtcbiAgICB2YXIgcmV0dXJuaXRlbTtcbiAgICBpZiAoY21wID09IG51bGwpIHtcbiAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG4gICAgfVxuICAgIHJldHVybml0ZW0gPSBhcnJheVswXTtcbiAgICBhcnJheVswXSA9IGl0ZW07XG4gICAgX3NpZnR1cChhcnJheSwgMCwgY21wKTtcbiAgICByZXR1cm4gcmV0dXJuaXRlbTtcbiAgfTtcblxuXG4gIC8qXG4gIEZhc3QgdmVyc2lvbiBvZiBhIGhlYXBwdXNoIGZvbGxvd2VkIGJ5IGEgaGVhcHBvcC5cbiAgICovXG5cbiAgaGVhcHB1c2hwb3AgPSBmdW5jdGlvbihhcnJheSwgaXRlbSwgY21wKSB7XG4gICAgdmFyIF9yZWY7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBpZiAoYXJyYXkubGVuZ3RoICYmIGNtcChhcnJheVswXSwgaXRlbSkgPCAwKSB7XG4gICAgICBfcmVmID0gW2FycmF5WzBdLCBpdGVtXSwgaXRlbSA9IF9yZWZbMF0sIGFycmF5WzBdID0gX3JlZlsxXTtcbiAgICAgIF9zaWZ0dXAoYXJyYXksIDAsIGNtcCk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xuICB9O1xuXG5cbiAgLypcbiAgVHJhbnNmb3JtIGxpc3QgaW50byBhIGhlYXAsIGluLXBsYWNlLCBpbiBPKGFycmF5Lmxlbmd0aCkgdGltZS5cbiAgICovXG5cbiAgaGVhcGlmeSA9IGZ1bmN0aW9uKGFycmF5LCBjbXApIHtcbiAgICB2YXIgaSwgX2ksIF9sZW4sIF9yZWYxLCBfcmVzdWx0cywgX3Jlc3VsdHMxO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgX3JlZjEgPSAoZnVuY3Rpb24oKSB7XG4gICAgICBfcmVzdWx0czEgPSBbXTtcbiAgICAgIGZvciAodmFyIF9qID0gMCwgX3JlZiA9IGZsb29yKGFycmF5Lmxlbmd0aCAvIDIpOyAwIDw9IF9yZWYgPyBfaiA8IF9yZWYgOiBfaiA+IF9yZWY7IDAgPD0gX3JlZiA/IF9qKysgOiBfai0tKXsgX3Jlc3VsdHMxLnB1c2goX2opOyB9XG4gICAgICByZXR1cm4gX3Jlc3VsdHMxO1xuICAgIH0pLmFwcGx5KHRoaXMpLnJldmVyc2UoKTtcbiAgICBfcmVzdWx0cyA9IFtdO1xuICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgIGkgPSBfcmVmMVtfaV07XG4gICAgICBfcmVzdWx0cy5wdXNoKF9zaWZ0dXAoYXJyYXksIGksIGNtcCkpO1xuICAgIH1cbiAgICByZXR1cm4gX3Jlc3VsdHM7XG4gIH07XG5cblxuICAvKlxuICBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBnaXZlbiBpdGVtIGluIHRoZSBoZWFwLlxuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZXZlcnkgdGltZSB0aGUgaXRlbSBpcyBiZWluZyBtb2RpZmllZC5cbiAgICovXG5cbiAgdXBkYXRlSXRlbSA9IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBjbXApIHtcbiAgICB2YXIgcG9zO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgcG9zID0gYXJyYXkuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAocG9zID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBfc2lmdGRvd24oYXJyYXksIDAsIHBvcywgY21wKTtcbiAgICByZXR1cm4gX3NpZnR1cChhcnJheSwgcG9zLCBjbXApO1xuICB9O1xuXG5cbiAgLypcbiAgRmluZCB0aGUgbiBsYXJnZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cbiAgICovXG5cbiAgbmxhcmdlc3QgPSBmdW5jdGlvbihhcnJheSwgbiwgY21wKSB7XG4gICAgdmFyIGVsZW0sIHJlc3VsdCwgX2ksIF9sZW4sIF9yZWY7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICByZXN1bHQgPSBhcnJheS5zbGljZSgwLCBuKTtcbiAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGhlYXBpZnkocmVzdWx0LCBjbXApO1xuICAgIF9yZWYgPSBhcnJheS5zbGljZShuKTtcbiAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgIGVsZW0gPSBfcmVmW19pXTtcbiAgICAgIGhlYXBwdXNocG9wKHJlc3VsdCwgZWxlbSwgY21wKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KGNtcCkucmV2ZXJzZSgpO1xuICB9O1xuXG5cbiAgLypcbiAgRmluZCB0aGUgbiBzbWFsbGVzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuXG4gICAqL1xuXG4gIG5zbWFsbGVzdCA9IGZ1bmN0aW9uKGFycmF5LCBuLCBjbXApIHtcbiAgICB2YXIgZWxlbSwgbG9zLCByZXN1bHQsIF9pLCBfaiwgX2xlbiwgX3JlZiwgX3JlZjEsIF9yZXN1bHRzO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgaWYgKG4gKiAxMCA8PSBhcnJheS5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdCA9IGFycmF5LnNsaWNlKDAsIG4pLnNvcnQoY21wKTtcbiAgICAgIGlmICghcmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgbG9zID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgIF9yZWYgPSBhcnJheS5zbGljZShuKTtcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICBlbGVtID0gX3JlZltfaV07XG4gICAgICAgIGlmIChjbXAoZWxlbSwgbG9zKSA8IDApIHtcbiAgICAgICAgICBpbnNvcnQocmVzdWx0LCBlbGVtLCAwLCBudWxsLCBjbXApO1xuICAgICAgICAgIHJlc3VsdC5wb3AoKTtcbiAgICAgICAgICBsb3MgPSByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBoZWFwaWZ5KGFycmF5LCBjbXApO1xuICAgIF9yZXN1bHRzID0gW107XG4gICAgZm9yIChfaiA9IDAsIF9yZWYxID0gbWluKG4sIGFycmF5Lmxlbmd0aCk7IDAgPD0gX3JlZjEgPyBfaiA8IF9yZWYxIDogX2ogPiBfcmVmMTsgMCA8PSBfcmVmMSA/ICsrX2ogOiAtLV9qKSB7XG4gICAgICBfcmVzdWx0cy5wdXNoKGhlYXBwb3AoYXJyYXksIGNtcCkpO1xuICAgIH1cbiAgICByZXR1cm4gX3Jlc3VsdHM7XG4gIH07XG5cbiAgX3NpZnRkb3duID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0cG9zLCBwb3MsIGNtcCkge1xuICAgIHZhciBuZXdpdGVtLCBwYXJlbnQsIHBhcmVudHBvcztcbiAgICBpZiAoY21wID09IG51bGwpIHtcbiAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG4gICAgfVxuICAgIG5ld2l0ZW0gPSBhcnJheVtwb3NdO1xuICAgIHdoaWxlIChwb3MgPiBzdGFydHBvcykge1xuICAgICAgcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDE7XG4gICAgICBwYXJlbnQgPSBhcnJheVtwYXJlbnRwb3NdO1xuICAgICAgaWYgKGNtcChuZXdpdGVtLCBwYXJlbnQpIDwgMCkge1xuICAgICAgICBhcnJheVtwb3NdID0gcGFyZW50O1xuICAgICAgICBwb3MgPSBwYXJlbnRwb3M7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBhcnJheVtwb3NdID0gbmV3aXRlbTtcbiAgfTtcblxuICBfc2lmdHVwID0gZnVuY3Rpb24oYXJyYXksIHBvcywgY21wKSB7XG4gICAgdmFyIGNoaWxkcG9zLCBlbmRwb3MsIG5ld2l0ZW0sIHJpZ2h0cG9zLCBzdGFydHBvcztcbiAgICBpZiAoY21wID09IG51bGwpIHtcbiAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG4gICAgfVxuICAgIGVuZHBvcyA9IGFycmF5Lmxlbmd0aDtcbiAgICBzdGFydHBvcyA9IHBvcztcbiAgICBuZXdpdGVtID0gYXJyYXlbcG9zXTtcbiAgICBjaGlsZHBvcyA9IDIgKiBwb3MgKyAxO1xuICAgIHdoaWxlIChjaGlsZHBvcyA8IGVuZHBvcykge1xuICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDE7XG4gICAgICBpZiAocmlnaHRwb3MgPCBlbmRwb3MgJiYgIShjbXAoYXJyYXlbY2hpbGRwb3NdLCBhcnJheVtyaWdodHBvc10pIDwgMCkpIHtcbiAgICAgICAgY2hpbGRwb3MgPSByaWdodHBvcztcbiAgICAgIH1cbiAgICAgIGFycmF5W3Bvc10gPSBhcnJheVtjaGlsZHBvc107XG4gICAgICBwb3MgPSBjaGlsZHBvcztcbiAgICAgIGNoaWxkcG9zID0gMiAqIHBvcyArIDE7XG4gICAgfVxuICAgIGFycmF5W3Bvc10gPSBuZXdpdGVtO1xuICAgIHJldHVybiBfc2lmdGRvd24oYXJyYXksIHN0YXJ0cG9zLCBwb3MsIGNtcCk7XG4gIH07XG5cbiAgSGVhcCA9IChmdW5jdGlvbigpIHtcbiAgICBIZWFwLnB1c2ggPSBoZWFwcHVzaDtcblxuICAgIEhlYXAucG9wID0gaGVhcHBvcDtcblxuICAgIEhlYXAucmVwbGFjZSA9IGhlYXByZXBsYWNlO1xuXG4gICAgSGVhcC5wdXNocG9wID0gaGVhcHB1c2hwb3A7XG5cbiAgICBIZWFwLmhlYXBpZnkgPSBoZWFwaWZ5O1xuXG4gICAgSGVhcC51cGRhdGVJdGVtID0gdXBkYXRlSXRlbTtcblxuICAgIEhlYXAubmxhcmdlc3QgPSBubGFyZ2VzdDtcblxuICAgIEhlYXAubnNtYWxsZXN0ID0gbnNtYWxsZXN0O1xuXG4gICAgZnVuY3Rpb24gSGVhcChjbXApIHtcbiAgICAgIHRoaXMuY21wID0gY21wICE9IG51bGwgPyBjbXAgOiBkZWZhdWx0Q21wO1xuICAgICAgdGhpcy5ub2RlcyA9IFtdO1xuICAgIH1cblxuICAgIEhlYXAucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gaGVhcHB1c2godGhpcy5ub2RlcywgeCwgdGhpcy5jbXApO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBoZWFwcG9wKHRoaXMubm9kZXMsIHRoaXMuY21wKTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXNbMF07XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXMuaW5kZXhPZih4KSAhPT0gLTE7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLnJlcGxhY2UgPSBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gaGVhcHJlcGxhY2UodGhpcy5ub2RlcywgeCwgdGhpcy5jbXApO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5wdXNocG9wID0gZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIGhlYXBwdXNocG9wKHRoaXMubm9kZXMsIHgsIHRoaXMuY21wKTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUuaGVhcGlmeSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGhlYXBpZnkodGhpcy5ub2RlcywgdGhpcy5jbXApO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS51cGRhdGVJdGVtID0gZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIHVwZGF0ZUl0ZW0odGhpcy5ub2RlcywgeCwgdGhpcy5jbXApO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXMgPSBbXTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUuZW1wdHkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzLmxlbmd0aCA9PT0gMDtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXMubGVuZ3RoO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGhlYXA7XG4gICAgICBoZWFwID0gbmV3IEhlYXAoKTtcbiAgICAgIGhlYXAubm9kZXMgPSB0aGlzLm5vZGVzLnNsaWNlKDApO1xuICAgICAgcmV0dXJuIGhlYXA7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzLnNsaWNlKDApO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5pbnNlcnQgPSBIZWFwLnByb3RvdHlwZS5wdXNoO1xuXG4gICAgSGVhcC5wcm90b3R5cGUudG9wID0gSGVhcC5wcm90b3R5cGUucGVlaztcblxuICAgIEhlYXAucHJvdG90eXBlLmZyb250ID0gSGVhcC5wcm90b3R5cGUucGVlaztcblxuICAgIEhlYXAucHJvdG90eXBlLmhhcyA9IEhlYXAucHJvdG90eXBlLmNvbnRhaW5zO1xuXG4gICAgSGVhcC5wcm90b3R5cGUuY29weSA9IEhlYXAucHJvdG90eXBlLmNsb25lO1xuXG4gICAgcmV0dXJuIEhlYXA7XG5cbiAgfSkoKTtcblxuICAoZnVuY3Rpb24ocm9vdCwgZmFjdG9yeSkge1xuICAgIHtcbiAgICAgIHJldHVybiBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9XG4gIH0pKHRoaXMsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBIZWFwO1xuICB9KTtcblxufSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcblxudmFyIGhlYXAgPSBoZWFwJDE7XG5cbnZhciBkaWprc3RyYURlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIHJvb3Q6IG51bGwsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgZGlyZWN0ZWQ6IGZhbHNlXG59KTtcbnZhciBlbGVzZm4kdSA9IHtcbiAgZGlqa3N0cmE6IGZ1bmN0aW9uIGRpamtzdHJhKG9wdGlvbnMpIHtcbiAgICBpZiAoIXBsYWluT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgIHJvb3Q6IGFyZ3NbMF0sXG4gICAgICAgIHdlaWdodDogYXJnc1sxXSxcbiAgICAgICAgZGlyZWN0ZWQ6IGFyZ3NbMl1cbiAgICAgIH07XG4gICAgfVxuICAgIHZhciBfZGlqa3N0cmFEZWZhdWx0cyA9IGRpamtzdHJhRGVmYXVsdHMob3B0aW9ucyksXG4gICAgICByb290ID0gX2RpamtzdHJhRGVmYXVsdHMucm9vdCxcbiAgICAgIHdlaWdodCA9IF9kaWprc3RyYURlZmF1bHRzLndlaWdodCxcbiAgICAgIGRpcmVjdGVkID0gX2RpamtzdHJhRGVmYXVsdHMuZGlyZWN0ZWQ7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciB3ZWlnaHRGbiA9IHdlaWdodDtcbiAgICB2YXIgc291cmNlID0gc3RyaW5nKHJvb3QpID8gdGhpcy5maWx0ZXIocm9vdClbMF0gOiByb290WzBdO1xuICAgIHZhciBkaXN0ID0ge307XG4gICAgdmFyIHByZXYgPSB7fTtcbiAgICB2YXIga25vd25EaXN0ID0ge307XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcyxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcbiAgICBlZGdlcy51bm1lcmdlQnkoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc0xvb3AoKTtcbiAgICB9KTtcbiAgICB2YXIgZ2V0RGlzdCA9IGZ1bmN0aW9uIGdldERpc3Qobm9kZSkge1xuICAgICAgcmV0dXJuIGRpc3Rbbm9kZS5pZCgpXTtcbiAgICB9O1xuICAgIHZhciBzZXREaXN0ID0gZnVuY3Rpb24gc2V0RGlzdChub2RlLCBkKSB7XG4gICAgICBkaXN0W25vZGUuaWQoKV0gPSBkO1xuICAgICAgUS51cGRhdGVJdGVtKG5vZGUpO1xuICAgIH07XG4gICAgdmFyIFEgPSBuZXcgaGVhcChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGdldERpc3QoYSkgLSBnZXREaXN0KGIpO1xuICAgIH0pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICBkaXN0W25vZGUuaWQoKV0gPSBub2RlLnNhbWUoc291cmNlKSA/IDAgOiBJbmZpbml0eTtcbiAgICAgIFEucHVzaChub2RlKTtcbiAgICB9XG4gICAgdmFyIGRpc3RCZXR3ZWVuID0gZnVuY3Rpb24gZGlzdEJldHdlZW4odSwgdikge1xuICAgICAgdmFyIHV2cyA9IChkaXJlY3RlZCA/IHUuZWRnZXNUbyh2KSA6IHUuZWRnZXNXaXRoKHYpKS5pbnRlcnNlY3QoZWRnZXMpO1xuICAgICAgdmFyIHNtYWxsZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICAgIHZhciBzbWFsbGVzdEVkZ2U7XG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdXZzLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgZWRnZSA9IHV2c1tfaV07XG4gICAgICAgIHZhciBfd2VpZ2h0ID0gd2VpZ2h0Rm4oZWRnZSk7XG4gICAgICAgIGlmIChfd2VpZ2h0IDwgc21hbGxlc3REaXN0YW5jZSB8fCAhc21hbGxlc3RFZGdlKSB7XG4gICAgICAgICAgc21hbGxlc3REaXN0YW5jZSA9IF93ZWlnaHQ7XG4gICAgICAgICAgc21hbGxlc3RFZGdlID0gZWRnZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWRnZTogc21hbGxlc3RFZGdlLFxuICAgICAgICBkaXN0OiBzbWFsbGVzdERpc3RhbmNlXG4gICAgICB9O1xuICAgIH07XG4gICAgd2hpbGUgKFEuc2l6ZSgpID4gMCkge1xuICAgICAgdmFyIHUgPSBRLnBvcCgpO1xuICAgICAgdmFyIHNtYWxsZXRzRGlzdCA9IGdldERpc3QodSk7XG4gICAgICB2YXIgdWlkID0gdS5pZCgpO1xuICAgICAga25vd25EaXN0W3VpZF0gPSBzbWFsbGV0c0Rpc3Q7XG4gICAgICBpZiAoc21hbGxldHNEaXN0ID09PSBJbmZpbml0eSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBuZWlnaGJvcnMgPSB1Lm5laWdoYm9yaG9vZCgpLmludGVyc2VjdChub2Rlcyk7XG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBuZWlnaGJvcnMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICB2YXIgdiA9IG5laWdoYm9yc1tfaTJdO1xuICAgICAgICB2YXIgdmlkID0gdi5pZCgpO1xuICAgICAgICB2YXIgdkRpc3QgPSBkaXN0QmV0d2Vlbih1LCB2KTtcbiAgICAgICAgdmFyIGFsdCA9IHNtYWxsZXRzRGlzdCArIHZEaXN0LmRpc3Q7XG4gICAgICAgIGlmIChhbHQgPCBnZXREaXN0KHYpKSB7XG4gICAgICAgICAgc2V0RGlzdCh2LCBhbHQpO1xuICAgICAgICAgIHByZXZbdmlkXSA9IHtcbiAgICAgICAgICAgIG5vZGU6IHUsXG4gICAgICAgICAgICBlZGdlOiB2RGlzdC5lZGdlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBmb3JcbiAgICB9IC8vIHdoaWxlXG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlzdGFuY2VUbzogZnVuY3Rpb24gZGlzdGFuY2VUbyhub2RlKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBzdHJpbmcobm9kZSkgPyBub2Rlcy5maWx0ZXIobm9kZSlbMF0gOiBub2RlWzBdO1xuICAgICAgICByZXR1cm4ga25vd25EaXN0W3RhcmdldC5pZCgpXTtcbiAgICAgIH0sXG4gICAgICBwYXRoVG86IGZ1bmN0aW9uIHBhdGhUbyhub2RlKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBzdHJpbmcobm9kZSkgPyBub2Rlcy5maWx0ZXIobm9kZSlbMF0gOiBub2RlWzBdO1xuICAgICAgICB2YXIgUyA9IFtdO1xuICAgICAgICB2YXIgdSA9IHRhcmdldDtcbiAgICAgICAgdmFyIHVpZCA9IHUuaWQoKTtcbiAgICAgICAgaWYgKHRhcmdldC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgUy51bnNoaWZ0KHRhcmdldCk7XG4gICAgICAgICAgd2hpbGUgKHByZXZbdWlkXSkge1xuICAgICAgICAgICAgdmFyIHAgPSBwcmV2W3VpZF07XG4gICAgICAgICAgICBTLnVuc2hpZnQocC5lZGdlKTtcbiAgICAgICAgICAgIFMudW5zaGlmdChwLm5vZGUpO1xuICAgICAgICAgICAgdSA9IHAubm9kZTtcbiAgICAgICAgICAgIHVpZCA9IHUuaWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZXMuc3Bhd24oUyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcblxudmFyIGVsZXNmbiR0ID0ge1xuICAvLyBrcnVza2FsJ3MgYWxnb3JpdGhtIChmaW5kcyBtaW4gc3Bhbm5pbmcgdHJlZSwgYXNzdW1pbmcgdW5kaXJlY3RlZCBncmFwaClcbiAgLy8gaW1wbGVtZW50ZWQgZnJvbSBwc2V1ZG9jb2RlIGZyb20gd2lraXBlZGlhXG4gIGtydXNrYWw6IGZ1bmN0aW9uIGtydXNrYWwod2VpZ2h0Rm4pIHtcbiAgICB3ZWlnaHRGbiA9IHdlaWdodEZuIHx8IGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9O1xuICAgIHZhciBfdGhpcyRieUdyb3VwID0gdGhpcy5ieUdyb3VwKCksXG4gICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXMsXG4gICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXM7XG4gICAgdmFyIG51bU5vZGVzID0gbm9kZXMubGVuZ3RoO1xuICAgIHZhciBmb3Jlc3QgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuICAgIHZhciBBID0gbm9kZXM7IC8vIGFzc3VtZXMgYnlHcm91cCgpIGNyZWF0ZXMgbmV3IGNvbGxlY3Rpb25zIHRoYXQgY2FuIGJlIHNhZmVseSBtdXRhdGVkXG5cbiAgICB2YXIgZmluZFNldEluZGV4ID0gZnVuY3Rpb24gZmluZFNldEluZGV4KGVsZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3Jlc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZXMgPSBmb3Jlc3RbaV07XG4gICAgICAgIGlmIChlbGVzLmhhcyhlbGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gc3RhcnQgd2l0aCBvbmUgZm9yZXN0IHBlciBub2RlXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1Ob2RlczsgaSsrKSB7XG4gICAgICBmb3Jlc3RbaV0gPSB0aGlzLnNwYXduKG5vZGVzW2ldKTtcbiAgICB9XG4gICAgdmFyIFMgPSBlZGdlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gd2VpZ2h0Rm4oYSkgLSB3ZWlnaHRGbihiKTtcbiAgICB9KTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgUy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBlZGdlID0gU1tfaV07XG4gICAgICB2YXIgdSA9IGVkZ2Uuc291cmNlKClbMF07XG4gICAgICB2YXIgdiA9IGVkZ2UudGFyZ2V0KClbMF07XG4gICAgICB2YXIgc2V0VUluZGV4ID0gZmluZFNldEluZGV4KHUpO1xuICAgICAgdmFyIHNldFZJbmRleCA9IGZpbmRTZXRJbmRleCh2KTtcbiAgICAgIHZhciBzZXRVID0gZm9yZXN0W3NldFVJbmRleF07XG4gICAgICB2YXIgc2V0ViA9IGZvcmVzdFtzZXRWSW5kZXhdO1xuICAgICAgaWYgKHNldFVJbmRleCAhPT0gc2V0VkluZGV4KSB7XG4gICAgICAgIEEubWVyZ2UoZWRnZSk7XG5cbiAgICAgICAgLy8gY29tYmluZSBmb3Jlc3RzIGZvciB1IGFuZCB2XG4gICAgICAgIHNldFUubWVyZ2Uoc2V0Vik7XG4gICAgICAgIGZvcmVzdC5zcGxpY2Uoc2V0VkluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEE7XG4gIH1cbn07XG5cbnZhciBhU3RhckRlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIHJvb3Q6IG51bGwsXG4gIGdvYWw6IG51bGwsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgaGV1cmlzdGljOiBmdW5jdGlvbiBoZXVyaXN0aWMoZWRnZSkge1xuICAgIHJldHVybiAwO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2Vcbn0pO1xudmFyIGVsZXNmbiRzID0ge1xuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHBzZXVkb2NvZGUgZnJvbSB3aWtpcGVkaWFcbiAgYVN0YXI6IGZ1bmN0aW9uIGFTdGFyKG9wdGlvbnMpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIF9hU3RhckRlZmF1bHRzID0gYVN0YXJEZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgIHJvb3QgPSBfYVN0YXJEZWZhdWx0cy5yb290LFxuICAgICAgZ29hbCA9IF9hU3RhckRlZmF1bHRzLmdvYWwsXG4gICAgICBoZXVyaXN0aWMgPSBfYVN0YXJEZWZhdWx0cy5oZXVyaXN0aWMsXG4gICAgICBkaXJlY3RlZCA9IF9hU3RhckRlZmF1bHRzLmRpcmVjdGVkLFxuICAgICAgd2VpZ2h0ID0gX2FTdGFyRGVmYXVsdHMud2VpZ2h0O1xuICAgIHJvb3QgPSBjeS5jb2xsZWN0aW9uKHJvb3QpWzBdO1xuICAgIGdvYWwgPSBjeS5jb2xsZWN0aW9uKGdvYWwpWzBdO1xuICAgIHZhciBzaWQgPSByb290LmlkKCk7XG4gICAgdmFyIHRpZCA9IGdvYWwuaWQoKTtcbiAgICB2YXIgZ1Njb3JlID0ge307XG4gICAgdmFyIGZTY29yZSA9IHt9O1xuICAgIHZhciBjbG9zZWRTZXRJZHMgPSB7fTtcbiAgICB2YXIgb3BlblNldCA9IG5ldyBoZWFwKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZlNjb3JlW2EuaWQoKV0gLSBmU2NvcmVbYi5pZCgpXTtcbiAgICB9KTtcbiAgICB2YXIgb3BlblNldElkcyA9IG5ldyBTZXQkMSgpO1xuICAgIHZhciBjYW1lRnJvbSA9IHt9O1xuICAgIHZhciBjYW1lRnJvbUVkZ2UgPSB7fTtcbiAgICB2YXIgYWRkVG9PcGVuU2V0ID0gZnVuY3Rpb24gYWRkVG9PcGVuU2V0KGVsZSwgaWQpIHtcbiAgICAgIG9wZW5TZXQucHVzaChlbGUpO1xuICAgICAgb3BlblNldElkcy5hZGQoaWQpO1xuICAgIH07XG4gICAgdmFyIGNNaW4sIGNNaW5JZDtcbiAgICB2YXIgcG9wRnJvbU9wZW5TZXQgPSBmdW5jdGlvbiBwb3BGcm9tT3BlblNldCgpIHtcbiAgICAgIGNNaW4gPSBvcGVuU2V0LnBvcCgpO1xuICAgICAgY01pbklkID0gY01pbi5pZCgpO1xuICAgICAgb3BlblNldElkc1tcImRlbGV0ZVwiXShjTWluSWQpO1xuICAgIH07XG4gICAgdmFyIGlzSW5PcGVuU2V0ID0gZnVuY3Rpb24gaXNJbk9wZW5TZXQoaWQpIHtcbiAgICAgIHJldHVybiBvcGVuU2V0SWRzLmhhcyhpZCk7XG4gICAgfTtcbiAgICBhZGRUb09wZW5TZXQocm9vdCwgc2lkKTtcbiAgICBnU2NvcmVbc2lkXSA9IDA7XG4gICAgZlNjb3JlW3NpZF0gPSBoZXVyaXN0aWMocm9vdCk7XG5cbiAgICAvLyBDb3VudGVyXG4gICAgdmFyIHN0ZXBzID0gMDtcblxuICAgIC8vIE1haW4gbG9vcFxuICAgIHdoaWxlIChvcGVuU2V0LnNpemUoKSA+IDApIHtcbiAgICAgIHBvcEZyb21PcGVuU2V0KCk7XG4gICAgICBzdGVwcysrO1xuXG4gICAgICAvLyBJZiB3ZSd2ZSBmb3VuZCBvdXIgZ29hbCwgdGhlbiB3ZSBhcmUgZG9uZVxuICAgICAgaWYgKGNNaW5JZCA9PT0gdGlkKSB7XG4gICAgICAgIHZhciBwYXRoID0gW107XG4gICAgICAgIHZhciBwYXRoTm9kZSA9IGdvYWw7XG4gICAgICAgIHZhciBwYXRoTm9kZUlkID0gdGlkO1xuICAgICAgICB2YXIgcGF0aEVkZ2UgPSBjYW1lRnJvbUVkZ2VbcGF0aE5vZGVJZF07XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBwYXRoLnVuc2hpZnQocGF0aE5vZGUpO1xuICAgICAgICAgIGlmIChwYXRoRWRnZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBwYXRoLnVuc2hpZnQocGF0aEVkZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRoTm9kZSA9IGNhbWVGcm9tW3BhdGhOb2RlSWRdO1xuICAgICAgICAgIGlmIChwYXRoTm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcGF0aE5vZGVJZCA9IHBhdGhOb2RlLmlkKCk7XG4gICAgICAgICAgcGF0aEVkZ2UgPSBjYW1lRnJvbUVkZ2VbcGF0aE5vZGVJZF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmb3VuZDogdHJ1ZSxcbiAgICAgICAgICBkaXN0YW5jZTogZ1Njb3JlW2NNaW5JZF0sXG4gICAgICAgICAgcGF0aDogdGhpcy5zcGF3bihwYXRoKSxcbiAgICAgICAgICBzdGVwczogc3RlcHNcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGNNaW4gdG8gcHJvY2Vzc2VkIG5vZGVzXG4gICAgICBjbG9zZWRTZXRJZHNbY01pbklkXSA9IHRydWU7XG5cbiAgICAgIC8vIFVwZGF0ZSBzY29yZXMgZm9yIG5laWdoYm9ycyBvZiBjTWluXG4gICAgICAvLyBUYWtlIGludG8gYWNjb3VudCBpZiBncmFwaCBpcyBkaXJlY3RlZCBvciBub3RcbiAgICAgIHZhciB2d0VkZ2VzID0gY01pbi5fcHJpdmF0ZS5lZGdlcztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdndFZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZSA9IHZ3RWRnZXNbaV07XG5cbiAgICAgICAgLy8gZWRnZSBtdXN0IGJlIGluIHNldCBvZiBjYWxsaW5nIGVsZXNcbiAgICAgICAgaWYgKCF0aGlzLmhhc0VsZW1lbnRXaXRoSWQoZS5pZCgpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY01pbiBtdXN0IGJlIHRoZSBzb3VyY2Ugb2YgZWRnZSBpZiBkaXJlY3RlZFxuICAgICAgICBpZiAoZGlyZWN0ZWQgJiYgZS5kYXRhKCdzb3VyY2UnKSAhPT0gY01pbklkKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdTcmMgPSBlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgd1RndCA9IGUudGFyZ2V0KCk7XG4gICAgICAgIHZhciB3ID0gd1NyYy5pZCgpICE9PSBjTWluSWQgPyB3U3JjIDogd1RndDtcbiAgICAgICAgdmFyIHdpZCA9IHcuaWQoKTtcblxuICAgICAgICAvLyBub2RlIG11c3QgYmUgaW4gc2V0IG9mIGNhbGxpbmcgZWxlc1xuICAgICAgICBpZiAoIXRoaXMuaGFzRWxlbWVudFdpdGhJZCh3aWQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBub2RlIGlzIGluIGNsb3NlZFNldCwgaWdub3JlIGl0XG4gICAgICAgIGlmIChjbG9zZWRTZXRJZHNbd2lkXSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTmV3IHRlbnRhdGl2ZSBzY29yZSBmb3Igbm9kZSB3XG4gICAgICAgIHZhciB0ZW1wU2NvcmUgPSBnU2NvcmVbY01pbklkXSArIHdlaWdodChlKTtcblxuICAgICAgICAvLyBVcGRhdGUgZ1Njb3JlIGZvciBub2RlIHcgaWY6XG4gICAgICAgIC8vICAgdyBub3QgcHJlc2VudCBpbiBvcGVuU2V0XG4gICAgICAgIC8vIE9SXG4gICAgICAgIC8vICAgdGVudGF0aXZlIGdTY29yZSBpcyBsZXNzIHRoYW4gcHJldmlvdXMgdmFsdWVcblxuICAgICAgICAvLyB3IG5vdCBpbiBvcGVuU2V0XG4gICAgICAgIGlmICghaXNJbk9wZW5TZXQod2lkKSkge1xuICAgICAgICAgIGdTY29yZVt3aWRdID0gdGVtcFNjb3JlO1xuICAgICAgICAgIGZTY29yZVt3aWRdID0gdGVtcFNjb3JlICsgaGV1cmlzdGljKHcpO1xuICAgICAgICAgIGFkZFRvT3BlblNldCh3LCB3aWQpO1xuICAgICAgICAgIGNhbWVGcm9tW3dpZF0gPSBjTWluO1xuICAgICAgICAgIGNhbWVGcm9tRWRnZVt3aWRdID0gZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHcgYWxyZWFkeSBpbiBvcGVuU2V0LCBidXQgd2l0aCBncmVhdGVyIGdTY29yZVxuICAgICAgICBpZiAodGVtcFNjb3JlIDwgZ1Njb3JlW3dpZF0pIHtcbiAgICAgICAgICBnU2NvcmVbd2lkXSA9IHRlbXBTY29yZTtcbiAgICAgICAgICBmU2NvcmVbd2lkXSA9IHRlbXBTY29yZSArIGhldXJpc3RpYyh3KTtcbiAgICAgICAgICBjYW1lRnJvbVt3aWRdID0gY01pbjtcbiAgICAgICAgICBjYW1lRnJvbUVkZ2Vbd2lkXSA9IGU7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gRW5kIG9mIG5laWdoYm9ycyB1cGRhdGVcbiAgICB9IC8vIEVuZCBvZiBtYWluIGxvb3BcblxuICAgIC8vIElmIHdlJ3ZlIHJlYWNoZWQgaGVyZSwgdGhlbiB3ZSd2ZSBub3QgcmVhY2hlZCBvdXIgZ29hbFxuICAgIHJldHVybiB7XG4gICAgICBmb3VuZDogZmFsc2UsXG4gICAgICBkaXN0YW5jZTogdW5kZWZpbmVkLFxuICAgICAgcGF0aDogdW5kZWZpbmVkLFxuICAgICAgc3RlcHM6IHN0ZXBzXG4gICAgfTtcbiAgfVxufTsgLy8gZWxlc2ZuXG5cbnZhciBmbG95ZFdhcnNoYWxsRGVmYXVsdHMgPSBkZWZhdWx0cyRnKHtcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2Vcbn0pO1xudmFyIGVsZXNmbiRyID0ge1xuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHBzZXVkb2NvZGUgZnJvbSB3aWtpcGVkaWFcbiAgZmxveWRXYXJzaGFsbDogZnVuY3Rpb24gZmxveWRXYXJzaGFsbChvcHRpb25zKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBfZmxveWRXYXJzaGFsbERlZmF1bHQgPSBmbG95ZFdhcnNoYWxsRGVmYXVsdHMob3B0aW9ucyksXG4gICAgICB3ZWlnaHQgPSBfZmxveWRXYXJzaGFsbERlZmF1bHQud2VpZ2h0LFxuICAgICAgZGlyZWN0ZWQgPSBfZmxveWRXYXJzaGFsbERlZmF1bHQuZGlyZWN0ZWQ7XG4gICAgdmFyIHdlaWdodEZuID0gd2VpZ2h0O1xuICAgIHZhciBfdGhpcyRieUdyb3VwID0gdGhpcy5ieUdyb3VwKCksXG4gICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXMsXG4gICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXM7XG4gICAgdmFyIE4gPSBub2Rlcy5sZW5ndGg7XG4gICAgdmFyIE5zcSA9IE4gKiBOO1xuICAgIHZhciBpbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZihub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZXMuaW5kZXhPZihub2RlKTtcbiAgICB9O1xuICAgIHZhciBhdEluZGV4ID0gZnVuY3Rpb24gYXRJbmRleChpKSB7XG4gICAgICByZXR1cm4gbm9kZXNbaV07XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgZGlzdGFuY2UgbWF0cml4XG4gICAgdmFyIGRpc3QgPSBuZXcgQXJyYXkoTnNxKTtcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IE5zcTsgbisrKSB7XG4gICAgICB2YXIgaiA9IG4gJSBOO1xuICAgICAgdmFyIGkgPSAobiAtIGopIC8gTjtcbiAgICAgIGlmIChpID09PSBqKSB7XG4gICAgICAgIGRpc3Rbbl0gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzdFtuXSA9IEluZmluaXR5O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgbWF0cml4IHVzZWQgZm9yIHBhdGggcmVjb25zdHJ1Y3Rpb25cbiAgICAvLyBJbml0aWFsaXplIGRpc3RhbmNlIG1hdHJpeFxuICAgIHZhciBuZXh0ID0gbmV3IEFycmF5KE5zcSk7XG4gICAgdmFyIGVkZ2VOZXh0ID0gbmV3IEFycmF5KE5zcSk7XG5cbiAgICAvLyBQcm9jZXNzIGVkZ2VzXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGVkZ2VzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tfaV07XG4gICAgICB2YXIgc3JjID0gZWRnZS5zb3VyY2UoKVswXTtcbiAgICAgIHZhciB0Z3QgPSBlZGdlLnRhcmdldCgpWzBdO1xuICAgICAgaWYgKHNyYyA9PT0gdGd0KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBleGNsdWRlIGxvb3BzXG5cbiAgICAgIHZhciBzID0gaW5kZXhPZihzcmMpO1xuICAgICAgdmFyIHQgPSBpbmRleE9mKHRndCk7XG4gICAgICB2YXIgc3QgPSBzICogTiArIHQ7IC8vIHNvdXJjZSB0byB0YXJnZXQgaW5kZXhcbiAgICAgIHZhciBfd2VpZ2h0ID0gd2VpZ2h0Rm4oZWRnZSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgcHJvY2VzcyBhbm90aGVyIGVkZ2UgYmV0d2VlbiBzYW1lIDIgbm9kZXNcbiAgICAgIGlmIChkaXN0W3N0XSA+IF93ZWlnaHQpIHtcbiAgICAgICAgZGlzdFtzdF0gPSBfd2VpZ2h0O1xuICAgICAgICBuZXh0W3N0XSA9IHQ7XG4gICAgICAgIGVkZ2VOZXh0W3N0XSA9IGVkZ2U7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHVuZGlyZWN0ZWQgZ3JhcGgsIHByb2Nlc3MgJ3JldmVyc2VkJyBlZGdlXG4gICAgICBpZiAoIWRpcmVjdGVkKSB7XG4gICAgICAgIHZhciB0cyA9IHQgKiBOICsgczsgLy8gdGFyZ2V0IHRvIHNvdXJjZSBpbmRleFxuXG4gICAgICAgIGlmICghZGlyZWN0ZWQgJiYgZGlzdFt0c10gPiBfd2VpZ2h0KSB7XG4gICAgICAgICAgZGlzdFt0c10gPSBfd2VpZ2h0O1xuICAgICAgICAgIG5leHRbdHNdID0gcztcbiAgICAgICAgICBlZGdlTmV4dFt0c10gPSBlZGdlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWFpbiBsb29wXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBOOyBrKyspIHtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IE47IF9pMisrKSB7XG4gICAgICAgIHZhciBpayA9IF9pMiAqIE4gKyBrO1xuICAgICAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgTjsgX2orKykge1xuICAgICAgICAgIHZhciBpaiA9IF9pMiAqIE4gKyBfajtcbiAgICAgICAgICB2YXIga2ogPSBrICogTiArIF9qO1xuICAgICAgICAgIGlmIChkaXN0W2lrXSArIGRpc3Rba2pdIDwgZGlzdFtpal0pIHtcbiAgICAgICAgICAgIGRpc3RbaWpdID0gZGlzdFtpa10gKyBkaXN0W2tqXTtcbiAgICAgICAgICAgIG5leHRbaWpdID0gbmV4dFtpa107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBnZXRBcmdFbGUgPSBmdW5jdGlvbiBnZXRBcmdFbGUoZWxlKSB7XG4gICAgICByZXR1cm4gKHN0cmluZyhlbGUpID8gY3kuZmlsdGVyKGVsZSkgOiBlbGUpWzBdO1xuICAgIH07XG4gICAgdmFyIGluZGV4T2ZBcmdFbGUgPSBmdW5jdGlvbiBpbmRleE9mQXJnRWxlKGVsZSkge1xuICAgICAgcmV0dXJuIGluZGV4T2YoZ2V0QXJnRWxlKGVsZSkpO1xuICAgIH07XG4gICAgdmFyIHJlcyA9IHtcbiAgICAgIGRpc3RhbmNlOiBmdW5jdGlvbiBkaXN0YW5jZShmcm9tLCB0bykge1xuICAgICAgICB2YXIgaSA9IGluZGV4T2ZBcmdFbGUoZnJvbSk7XG4gICAgICAgIHZhciBqID0gaW5kZXhPZkFyZ0VsZSh0byk7XG4gICAgICAgIHJldHVybiBkaXN0W2kgKiBOICsgal07XG4gICAgICB9LFxuICAgICAgcGF0aDogZnVuY3Rpb24gcGF0aChmcm9tLCB0bykge1xuICAgICAgICB2YXIgaSA9IGluZGV4T2ZBcmdFbGUoZnJvbSk7XG4gICAgICAgIHZhciBqID0gaW5kZXhPZkFyZ0VsZSh0byk7XG4gICAgICAgIHZhciBmcm9tTm9kZSA9IGF0SW5kZXgoaSk7XG4gICAgICAgIGlmIChpID09PSBqKSB7XG4gICAgICAgICAgcmV0dXJuIGZyb21Ob2RlLmNvbGxlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV4dFtpICogTiArIGpdID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXRoID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICB2YXIgcHJldiA9IGk7XG4gICAgICAgIHZhciBlZGdlO1xuICAgICAgICBwYXRoLm1lcmdlKGZyb21Ob2RlKTtcbiAgICAgICAgd2hpbGUgKGkgIT09IGopIHtcbiAgICAgICAgICBwcmV2ID0gaTtcbiAgICAgICAgICBpID0gbmV4dFtpICogTiArIGpdO1xuICAgICAgICAgIGVkZ2UgPSBlZGdlTmV4dFtwcmV2ICogTiArIGldO1xuICAgICAgICAgIHBhdGgubWVyZ2UoZWRnZSk7XG4gICAgICAgICAgcGF0aC5tZXJnZShhdEluZGV4KGkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiByZXM7XG4gIH0gLy8gZmxveWRXYXJzaGFsbFxufTsgLy8gZWxlc2ZuXG5cbnZhciBiZWxsbWFuRm9yZERlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgZGlyZWN0ZWQ6IGZhbHNlLFxuICByb290OiBudWxsXG59KTtcbnZhciBlbGVzZm4kcSA9IHtcbiAgLy8gSW1wbGVtZW50ZWQgZnJvbSBwc2V1ZG9jb2RlIGZyb20gd2lraXBlZGlhXG4gIGJlbGxtYW5Gb3JkOiBmdW5jdGlvbiBiZWxsbWFuRm9yZChvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB2YXIgX2JlbGxtYW5Gb3JkRGVmYXVsdHMgPSBiZWxsbWFuRm9yZERlZmF1bHRzKG9wdGlvbnMpLFxuICAgICAgd2VpZ2h0ID0gX2JlbGxtYW5Gb3JkRGVmYXVsdHMud2VpZ2h0LFxuICAgICAgZGlyZWN0ZWQgPSBfYmVsbG1hbkZvcmREZWZhdWx0cy5kaXJlY3RlZCxcbiAgICAgIHJvb3QgPSBfYmVsbG1hbkZvcmREZWZhdWx0cy5yb290O1xuICAgIHZhciB3ZWlnaHRGbiA9IHdlaWdodDtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBfdGhpcyRieUdyb3VwID0gdGhpcy5ieUdyb3VwKCksXG4gICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXMsXG4gICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXM7XG4gICAgdmFyIG51bU5vZGVzID0gbm9kZXMubGVuZ3RoO1xuICAgIHZhciBpbmZvTWFwID0gbmV3IE1hcCQyKCk7XG4gICAgdmFyIGhhc05lZ2F0aXZlV2VpZ2h0Q3ljbGUgPSBmYWxzZTtcbiAgICB2YXIgbmVnYXRpdmVXZWlnaHRDeWNsZXMgPSBbXTtcbiAgICByb290ID0gY3kuY29sbGVjdGlvbihyb290KVswXTsgLy8gaW4gY2FzZSBzZWxlY3RvciBwYXNzZWRcblxuICAgIGVkZ2VzLnVubWVyZ2VCeShmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgcmV0dXJuIGVkZ2UuaXNMb29wKCk7XG4gICAgfSk7XG4gICAgdmFyIG51bUVkZ2VzID0gZWRnZXMubGVuZ3RoO1xuICAgIHZhciBnZXRJbmZvID0gZnVuY3Rpb24gZ2V0SW5mbyhub2RlKSB7XG4gICAgICB2YXIgb2JqID0gaW5mb01hcC5nZXQobm9kZS5pZCgpKTtcbiAgICAgIGlmICghb2JqKSB7XG4gICAgICAgIG9iaiA9IHt9O1xuICAgICAgICBpbmZvTWFwLnNldChub2RlLmlkKCksIG9iaik7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH07XG4gICAgdmFyIGdldE5vZGVGcm9tVG8gPSBmdW5jdGlvbiBnZXROb2RlRnJvbVRvKHRvKSB7XG4gICAgICByZXR1cm4gKHN0cmluZyh0bykgPyBjeS4kKHRvKSA6IHRvKVswXTtcbiAgICB9O1xuICAgIHZhciBkaXN0YW5jZVRvID0gZnVuY3Rpb24gZGlzdGFuY2VUbyh0bykge1xuICAgICAgcmV0dXJuIGdldEluZm8oZ2V0Tm9kZUZyb21Ubyh0bykpLmRpc3Q7XG4gICAgfTtcbiAgICB2YXIgcGF0aFRvID0gZnVuY3Rpb24gcGF0aFRvKHRvKSB7XG4gICAgICB2YXIgdGhpc1N0YXJ0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiByb290O1xuICAgICAgdmFyIGVuZCA9IGdldE5vZGVGcm9tVG8odG8pO1xuICAgICAgdmFyIHBhdGggPSBbXTtcbiAgICAgIHZhciBub2RlID0gZW5kO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLnNwYXduKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9nZXRJbmZvID0gZ2V0SW5mbyhub2RlKSxcbiAgICAgICAgICBlZGdlID0gX2dldEluZm8uZWRnZSxcbiAgICAgICAgICBwcmVkID0gX2dldEluZm8ucHJlZDtcbiAgICAgICAgcGF0aC51bnNoaWZ0KG5vZGVbMF0pO1xuICAgICAgICBpZiAobm9kZS5zYW1lKHRoaXNTdGFydCkgJiYgcGF0aC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVkZ2UgIT0gbnVsbCkge1xuICAgICAgICAgIHBhdGgudW5zaGlmdChlZGdlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gcHJlZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGVzLnNwYXduKHBhdGgpO1xuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXphdGlvbnMgeyBkaXN0LCBwcmVkLCBlZGdlIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bU5vZGVzOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICB2YXIgaW5mbyA9IGdldEluZm8obm9kZSk7XG4gICAgICBpZiAobm9kZS5zYW1lKHJvb3QpKSB7XG4gICAgICAgIGluZm8uZGlzdCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmZvLmRpc3QgPSBJbmZpbml0eTtcbiAgICAgIH1cbiAgICAgIGluZm8ucHJlZCA9IG51bGw7XG4gICAgICBpbmZvLmVkZ2UgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIEVkZ2VzIHJlbGF4YXRpb25cbiAgICB2YXIgcmVwbGFjZWRFZGdlID0gZmFsc2U7XG4gICAgdmFyIGNoZWNrRm9yRWRnZVJlcGxhY2VtZW50ID0gZnVuY3Rpb24gY2hlY2tGb3JFZGdlUmVwbGFjZW1lbnQobm9kZTEsIG5vZGUyLCBlZGdlLCBpbmZvMSwgaW5mbzIsIHdlaWdodCkge1xuICAgICAgdmFyIGRpc3QgPSBpbmZvMS5kaXN0ICsgd2VpZ2h0O1xuICAgICAgaWYgKGRpc3QgPCBpbmZvMi5kaXN0ICYmICFlZGdlLnNhbWUoaW5mbzEuZWRnZSkpIHtcbiAgICAgICAgaW5mbzIuZGlzdCA9IGRpc3Q7XG4gICAgICAgIGluZm8yLnByZWQgPSBub2RlMTtcbiAgICAgICAgaW5mbzIuZWRnZSA9IGVkZ2U7XG4gICAgICAgIHJlcGxhY2VkRWRnZSA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgbnVtTm9kZXM7IF9pKyspIHtcbiAgICAgIHJlcGxhY2VkRWRnZSA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgZSA9IDA7IGUgPCBudW1FZGdlczsgZSsrKSB7XG4gICAgICAgIHZhciBlZGdlID0gZWRnZXNbZV07XG4gICAgICAgIHZhciBzcmMgPSBlZGdlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgdGd0ID0gZWRnZS50YXJnZXQoKTtcbiAgICAgICAgdmFyIF93ZWlnaHQgPSB3ZWlnaHRGbihlZGdlKTtcbiAgICAgICAgdmFyIHNyY0luZm8gPSBnZXRJbmZvKHNyYyk7XG4gICAgICAgIHZhciB0Z3RJbmZvID0gZ2V0SW5mbyh0Z3QpO1xuICAgICAgICBjaGVja0ZvckVkZ2VSZXBsYWNlbWVudChzcmMsIHRndCwgZWRnZSwgc3JjSW5mbywgdGd0SW5mbywgX3dlaWdodCk7XG5cbiAgICAgICAgLy8gSWYgdW5kaXJlY3RlZCBncmFwaCwgd2UgbmVlZCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgJ3JldmVyc2UnIGVkZ2VcbiAgICAgICAgaWYgKCFkaXJlY3RlZCkge1xuICAgICAgICAgIGNoZWNrRm9yRWRnZVJlcGxhY2VtZW50KHRndCwgc3JjLCBlZGdlLCB0Z3RJbmZvLCBzcmNJbmZvLCBfd2VpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFyZXBsYWNlZEVkZ2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXBsYWNlZEVkZ2UpIHtcbiAgICAgIC8vIENoZWNrIGZvciBuZWdhdGl2ZSB3ZWlnaHQgY3ljbGVzXG4gICAgICB2YXIgbmVnYXRpdmVXZWlnaHRDeWNsZUlkcyA9IFtdO1xuICAgICAgZm9yICh2YXIgX2UgPSAwOyBfZSA8IG51bUVkZ2VzOyBfZSsrKSB7XG4gICAgICAgIHZhciBfZWRnZSA9IGVkZ2VzW19lXTtcbiAgICAgICAgdmFyIF9zcmMgPSBfZWRnZS5zb3VyY2UoKTtcbiAgICAgICAgdmFyIF90Z3QgPSBfZWRnZS50YXJnZXQoKTtcbiAgICAgICAgdmFyIF93ZWlnaHQyID0gd2VpZ2h0Rm4oX2VkZ2UpO1xuICAgICAgICB2YXIgc3JjRGlzdCA9IGdldEluZm8oX3NyYykuZGlzdDtcbiAgICAgICAgdmFyIHRndERpc3QgPSBnZXRJbmZvKF90Z3QpLmRpc3Q7XG4gICAgICAgIGlmIChzcmNEaXN0ICsgX3dlaWdodDIgPCB0Z3REaXN0IHx8ICFkaXJlY3RlZCAmJiB0Z3REaXN0ICsgX3dlaWdodDIgPCBzcmNEaXN0KSB7XG4gICAgICAgICAgaWYgKCFoYXNOZWdhdGl2ZVdlaWdodEN5Y2xlKSB7XG4gICAgICAgICAgICB3YXJuKCdHcmFwaCBjb250YWlucyBhIG5lZ2F0aXZlIHdlaWdodCBjeWNsZSBmb3IgQmVsbG1hbi1Gb3JkJyk7XG4gICAgICAgICAgICBoYXNOZWdhdGl2ZVdlaWdodEN5Y2xlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9wdGlvbnMuZmluZE5lZ2F0aXZlV2VpZ2h0Q3ljbGVzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdmFyIG5lZ2F0aXZlTm9kZXMgPSBbXTtcbiAgICAgICAgICAgIGlmIChzcmNEaXN0ICsgX3dlaWdodDIgPCB0Z3REaXN0KSB7XG4gICAgICAgICAgICAgIG5lZ2F0aXZlTm9kZXMucHVzaChfc3JjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZGlyZWN0ZWQgJiYgdGd0RGlzdCArIF93ZWlnaHQyIDwgc3JjRGlzdCkge1xuICAgICAgICAgICAgICBuZWdhdGl2ZU5vZGVzLnB1c2goX3RndCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbnVtTmVnYXRpdmVOb2RlcyA9IG5lZ2F0aXZlTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBudW1OZWdhdGl2ZU5vZGVzOyBuKyspIHtcbiAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gbmVnYXRpdmVOb2Rlc1tuXTtcbiAgICAgICAgICAgICAgdmFyIGN5Y2xlID0gW3N0YXJ0XTtcbiAgICAgICAgICAgICAgY3ljbGUucHVzaChnZXRJbmZvKHN0YXJ0KS5lZGdlKTtcbiAgICAgICAgICAgICAgdmFyIF9ub2RlID0gZ2V0SW5mbyhzdGFydCkucHJlZDtcbiAgICAgICAgICAgICAgd2hpbGUgKGN5Y2xlLmluZGV4T2YoX25vZGUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGN5Y2xlLnB1c2goX25vZGUpO1xuICAgICAgICAgICAgICAgIGN5Y2xlLnB1c2goZ2V0SW5mbyhfbm9kZSkuZWRnZSk7XG4gICAgICAgICAgICAgICAgX25vZGUgPSBnZXRJbmZvKF9ub2RlKS5wcmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGN5Y2xlID0gY3ljbGUuc2xpY2UoY3ljbGUuaW5kZXhPZihfbm9kZSkpO1xuICAgICAgICAgICAgICB2YXIgc21hbGxlc3RJZCA9IGN5Y2xlWzBdLmlkKCk7XG4gICAgICAgICAgICAgIHZhciBzbWFsbGVzdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgZm9yICh2YXIgYyA9IDI7IGMgPCBjeWNsZS5sZW5ndGg7IGMgKz0gMikge1xuICAgICAgICAgICAgICAgIGlmIChjeWNsZVtjXS5pZCgpIDwgc21hbGxlc3RJZCkge1xuICAgICAgICAgICAgICAgICAgc21hbGxlc3RJZCA9IGN5Y2xlW2NdLmlkKCk7XG4gICAgICAgICAgICAgICAgICBzbWFsbGVzdEluZGV4ID0gYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY3ljbGUgPSBjeWNsZS5zbGljZShzbWFsbGVzdEluZGV4KS5jb25jYXQoY3ljbGUuc2xpY2UoMCwgc21hbGxlc3RJbmRleCkpO1xuICAgICAgICAgICAgICBjeWNsZS5wdXNoKGN5Y2xlWzBdKTtcbiAgICAgICAgICAgICAgdmFyIGN5Y2xlSWQgPSBjeWNsZS5tYXAoZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsLmlkKCk7XG4gICAgICAgICAgICAgIH0pLmpvaW4oXCIsXCIpO1xuICAgICAgICAgICAgICBpZiAobmVnYXRpdmVXZWlnaHRDeWNsZUlkcy5pbmRleE9mKGN5Y2xlSWQpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG5lZ2F0aXZlV2VpZ2h0Q3ljbGVzLnB1c2goZWxlcy5zcGF3bihjeWNsZSkpO1xuICAgICAgICAgICAgICAgIG5lZ2F0aXZlV2VpZ2h0Q3ljbGVJZHMucHVzaChjeWNsZUlkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3RhbmNlVG86IGRpc3RhbmNlVG8sXG4gICAgICBwYXRoVG86IHBhdGhUbyxcbiAgICAgIGhhc05lZ2F0aXZlV2VpZ2h0Q3ljbGU6IGhhc05lZ2F0aXZlV2VpZ2h0Q3ljbGUsXG4gICAgICBuZWdhdGl2ZVdlaWdodEN5Y2xlczogbmVnYXRpdmVXZWlnaHRDeWNsZXNcbiAgICB9O1xuICB9IC8vIGJlbGxtYW5Gb3JkXG59OyAvLyBlbGVzZm5cblxudmFyIHNxcnQyID0gTWF0aC5zcXJ0KDIpO1xuXG4vLyBGdW5jdGlvbiB3aGljaCBjb2xhcHNlcyAyIChtZXRhKSBub2RlcyBpbnRvIG9uZVxuLy8gVXBkYXRlcyB0aGUgcmVtYWluaW5nIGVkZ2UgbGlzdHNcbi8vIFJlY2VpdmVzIGFzIGEgcGFyYW1hdGVyIHRoZSBlZGdlIHdoaWNoIGNhdXNlcyB0aGUgY29sbGFwc2VcbnZhciBjb2xsYXBzZSA9IGZ1bmN0aW9uIGNvbGxhcHNlKGVkZ2VJbmRleCwgbm9kZU1hcCwgcmVtYWluaW5nRWRnZXMpIHtcbiAgaWYgKHJlbWFpbmluZ0VkZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGVycm9yKFwiS2FyZ2VyLVN0ZWluIG11c3QgYmUgcnVuIG9uIGEgY29ubmVjdGVkIChzdWIpZ3JhcGhcIik7XG4gIH1cbiAgdmFyIGVkZ2VJbmZvID0gcmVtYWluaW5nRWRnZXNbZWRnZUluZGV4XTtcbiAgdmFyIHNvdXJjZUluID0gZWRnZUluZm9bMV07XG4gIHZhciB0YXJnZXRJbiA9IGVkZ2VJbmZvWzJdO1xuICB2YXIgcGFydGl0aW9uMSA9IG5vZGVNYXBbc291cmNlSW5dO1xuICB2YXIgcGFydGl0aW9uMiA9IG5vZGVNYXBbdGFyZ2V0SW5dO1xuICB2YXIgbmV3RWRnZXMgPSByZW1haW5pbmdFZGdlczsgLy8gcmUtdXNlIGFycmF5XG5cbiAgLy8gRGVsZXRlIGFsbCBlZGdlcyBiZXR3ZWVuIHBhcnRpdGlvbjEgYW5kIHBhcnRpdGlvbjJcbiAgZm9yICh2YXIgaSA9IG5ld0VkZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGVkZ2UgPSBuZXdFZGdlc1tpXTtcbiAgICB2YXIgc3JjID0gZWRnZVsxXTtcbiAgICB2YXIgdGd0ID0gZWRnZVsyXTtcbiAgICBpZiAobm9kZU1hcFtzcmNdID09PSBwYXJ0aXRpb24xICYmIG5vZGVNYXBbdGd0XSA9PT0gcGFydGl0aW9uMiB8fCBub2RlTWFwW3NyY10gPT09IHBhcnRpdGlvbjIgJiYgbm9kZU1hcFt0Z3RdID09PSBwYXJ0aXRpb24xKSB7XG4gICAgICBuZXdFZGdlcy5zcGxpY2UoaSwgMSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWxsIGVkZ2VzIHBvaW50aW5nIHRvIHBhcnRpdGlvbjIgc2hvdWxkIG5vdyBwb2ludCB0byBwYXJ0aXRpb24xXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBuZXdFZGdlcy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgX2VkZ2UgPSBuZXdFZGdlc1tfaV07XG4gICAgaWYgKF9lZGdlWzFdID09PSBwYXJ0aXRpb24yKSB7XG4gICAgICAvLyBDaGVjayBzb3VyY2VcbiAgICAgIG5ld0VkZ2VzW19pXSA9IF9lZGdlLnNsaWNlKCk7IC8vIGNvcHlcbiAgICAgIG5ld0VkZ2VzW19pXVsxXSA9IHBhcnRpdGlvbjE7XG4gICAgfSBlbHNlIGlmIChfZWRnZVsyXSA9PT0gcGFydGl0aW9uMikge1xuICAgICAgLy8gQ2hlY2sgdGFyZ2V0XG4gICAgICBuZXdFZGdlc1tfaV0gPSBfZWRnZS5zbGljZSgpOyAvLyBjb3B5XG4gICAgICBuZXdFZGdlc1tfaV1bMl0gPSBwYXJ0aXRpb24xO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1vdmUgYWxsIG5vZGVzIGZyb20gcGFydGl0aW9uMiB0byBwYXJ0aXRpb24xXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG5vZGVNYXAubGVuZ3RoOyBfaTIrKykge1xuICAgIGlmIChub2RlTWFwW19pMl0gPT09IHBhcnRpdGlvbjIpIHtcbiAgICAgIG5vZGVNYXBbX2kyXSA9IHBhcnRpdGlvbjE7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdFZGdlcztcbn07XG5cbi8vIENvbnRyYWN0cyBhIGdyYXBoIHVudGlsIHdlIHJlYWNoIGEgY2VydGFpbiBudW1iZXIgb2YgbWV0YSBub2Rlc1xudmFyIGNvbnRyYWN0VW50aWwgPSBmdW5jdGlvbiBjb250cmFjdFVudGlsKG1ldGFOb2RlTWFwLCByZW1haW5pbmdFZGdlcywgc2l6ZSwgc2l6ZUxpbWl0KSB7XG4gIHdoaWxlIChzaXplID4gc2l6ZUxpbWl0KSB7XG4gICAgLy8gQ2hvb3NlIGFuIGVkZ2UgcmFuZG9tbHlcbiAgICB2YXIgZWRnZUluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcmVtYWluaW5nRWRnZXMubGVuZ3RoKTtcblxuICAgIC8vIENvbGxhcHNlIGdyYXBoIGJhc2VkIG9uIGVkZ2VcbiAgICByZW1haW5pbmdFZGdlcyA9IGNvbGxhcHNlKGVkZ2VJbmRleCwgbWV0YU5vZGVNYXAsIHJlbWFpbmluZ0VkZ2VzKTtcbiAgICBzaXplLS07XG4gIH1cbiAgcmV0dXJuIHJlbWFpbmluZ0VkZ2VzO1xufTtcbnZhciBlbGVzZm4kcCA9IHtcbiAgLy8gQ29tcHV0ZXMgdGhlIG1pbmltdW0gY3V0IG9mIGFuIHVuZGlyZWN0ZWQgZ3JhcGhcbiAgLy8gUmV0dXJucyB0aGUgY29ycmVjdCBhbnN3ZXIgd2l0aCBoaWdoIHByb2JhYmlsaXR5XG4gIGthcmdlclN0ZWluOiBmdW5jdGlvbiBrYXJnZXJTdGVpbigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBfdGhpcyRieUdyb3VwID0gdGhpcy5ieUdyb3VwKCksXG4gICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXMsXG4gICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXM7XG4gICAgZWRnZXMudW5tZXJnZUJ5KGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICByZXR1cm4gZWRnZS5pc0xvb3AoKTtcbiAgICB9KTtcbiAgICB2YXIgbnVtTm9kZXMgPSBub2Rlcy5sZW5ndGg7XG4gICAgdmFyIG51bUVkZ2VzID0gZWRnZXMubGVuZ3RoO1xuICAgIHZhciBudW1JdGVyID0gTWF0aC5jZWlsKE1hdGgucG93KE1hdGgubG9nKG51bU5vZGVzKSAvIE1hdGguTE4yLCAyKSk7XG4gICAgdmFyIHN0b3BTaXplID0gTWF0aC5mbG9vcihudW1Ob2RlcyAvIHNxcnQyKTtcbiAgICBpZiAobnVtTm9kZXMgPCAyKSB7XG4gICAgICBlcnJvcignQXQgbGVhc3QgMiBub2RlcyBhcmUgcmVxdWlyZWQgZm9yIEthcmdlci1TdGVpbiBhbGdvcml0aG0nKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gTm93IHN0b3JlIGVkZ2UgZGVzdGluYXRpb24gYXMgaW5kZXhlc1xuICAgIC8vIEZvcm1hdCBmb3IgZWFjaCBlZGdlIChlZGdlIGluZGV4LCBzb3VyY2Ugbm9kZSBpbmRleCwgdGFyZ2V0IG5vZGUgaW5kZXgpXG4gICAgdmFyIGVkZ2VJbmRleGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1FZGdlczsgaSsrKSB7XG4gICAgICB2YXIgZSA9IGVkZ2VzW2ldO1xuICAgICAgZWRnZUluZGV4ZXMucHVzaChbaSwgbm9kZXMuaW5kZXhPZihlLnNvdXJjZSgpKSwgbm9kZXMuaW5kZXhPZihlLnRhcmdldCgpKV0pO1xuICAgIH1cblxuICAgIC8vIFdlIHdpbGwgc3RvcmUgdGhlIGJlc3QgY3V0IGZvdW5kIGhlcmVcbiAgICB2YXIgbWluQ3V0U2l6ZSA9IEluZmluaXR5O1xuICAgIHZhciBtaW5DdXRFZGdlSW5kZXhlcyA9IFtdO1xuICAgIHZhciBtaW5DdXROb2RlTWFwID0gbmV3IEFycmF5KG51bU5vZGVzKTtcblxuICAgIC8vIEluaXRpYWwgbWV0YSBub2RlIHBhcnRpdGlvblxuICAgIHZhciBtZXRhTm9kZU1hcCA9IG5ldyBBcnJheShudW1Ob2Rlcyk7XG4gICAgdmFyIG1ldGFOb2RlTWFwMiA9IG5ldyBBcnJheShudW1Ob2Rlcyk7XG4gICAgdmFyIGNvcHlOb2Rlc01hcCA9IGZ1bmN0aW9uIGNvcHlOb2Rlc01hcChmcm9tLCB0bykge1xuICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbnVtTm9kZXM7IF9pMysrKSB7XG4gICAgICAgIHRvW19pM10gPSBmcm9tW19pM107XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIE1haW4gbG9vcFxuICAgIGZvciAodmFyIGl0ZXIgPSAwOyBpdGVyIDw9IG51bUl0ZXI7IGl0ZXIrKykge1xuICAgICAgLy8gUmVzZXQgbWV0YSBub2RlIHBhcnRpdGlvblxuICAgICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgbnVtTm9kZXM7IF9pNCsrKSB7XG4gICAgICAgIG1ldGFOb2RlTWFwW19pNF0gPSBfaTQ7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnRyYWN0IHVudGlsIHN0b3AgcG9pbnQgKHN0b3BTaXplIG5vZGVzKVxuICAgICAgdmFyIGVkZ2VzU3RhdGUgPSBjb250cmFjdFVudGlsKG1ldGFOb2RlTWFwLCBlZGdlSW5kZXhlcy5zbGljZSgpLCBudW1Ob2Rlcywgc3RvcFNpemUpO1xuICAgICAgdmFyIGVkZ2VzU3RhdGUyID0gZWRnZXNTdGF0ZS5zbGljZSgpOyAvLyBjb3B5XG5cbiAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGNvbGFwc2VkIG5vZGVzIHN0YXRlXG4gICAgICBjb3B5Tm9kZXNNYXAobWV0YU5vZGVNYXAsIG1ldGFOb2RlTWFwMik7XG5cbiAgICAgIC8vIFJ1biAyIGl0ZXJhdGlvbnMgc3RhcnRpbmcgaW4gdGhlIHN0b3Agc3RhdGVcbiAgICAgIHZhciByZXMxID0gY29udHJhY3RVbnRpbChtZXRhTm9kZU1hcCwgZWRnZXNTdGF0ZSwgc3RvcFNpemUsIDIpO1xuICAgICAgdmFyIHJlczIgPSBjb250cmFjdFVudGlsKG1ldGFOb2RlTWFwMiwgZWRnZXNTdGF0ZTIsIHN0b3BTaXplLCAyKTtcblxuICAgICAgLy8gSXMgYW55IG9mIHRoZSAyIHJlc3VsdHMgdGhlIGJlc3QgY3V0IHNvIGZhcj9cbiAgICAgIGlmIChyZXMxLmxlbmd0aCA8PSByZXMyLmxlbmd0aCAmJiByZXMxLmxlbmd0aCA8IG1pbkN1dFNpemUpIHtcbiAgICAgICAgbWluQ3V0U2l6ZSA9IHJlczEubGVuZ3RoO1xuICAgICAgICBtaW5DdXRFZGdlSW5kZXhlcyA9IHJlczE7XG4gICAgICAgIGNvcHlOb2Rlc01hcChtZXRhTm9kZU1hcCwgbWluQ3V0Tm9kZU1hcCk7XG4gICAgICB9IGVsc2UgaWYgKHJlczIubGVuZ3RoIDw9IHJlczEubGVuZ3RoICYmIHJlczIubGVuZ3RoIDwgbWluQ3V0U2l6ZSkge1xuICAgICAgICBtaW5DdXRTaXplID0gcmVzMi5sZW5ndGg7XG4gICAgICAgIG1pbkN1dEVkZ2VJbmRleGVzID0gcmVzMjtcbiAgICAgICAgY29weU5vZGVzTWFwKG1ldGFOb2RlTWFwMiwgbWluQ3V0Tm9kZU1hcCk7XG4gICAgICB9XG4gICAgfSAvLyBlbmQgb2YgbWFpbiBsb29wXG5cbiAgICAvLyBDb25zdHJ1Y3QgcmVzdWx0XG4gICAgdmFyIGN1dCA9IHRoaXMuc3Bhd24obWluQ3V0RWRnZUluZGV4ZXMubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZWRnZXNbZVswXV07XG4gICAgfSkpO1xuICAgIHZhciBwYXJ0aXRpb24xID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciBwYXJ0aXRpb24yID0gdGhpcy5zcGF3bigpO1xuXG4gICAgLy8gdHJhdmVyc2UgbWV0YU5vZGVNYXAgZm9yIGJlc3QgY3V0XG4gICAgdmFyIHdpdG5lc3NOb2RlUGFydGl0aW9uID0gbWluQ3V0Tm9kZU1hcFswXTtcbiAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBtaW5DdXROb2RlTWFwLmxlbmd0aDsgX2k1KyspIHtcbiAgICAgIHZhciBwYXJ0aXRpb25JZCA9IG1pbkN1dE5vZGVNYXBbX2k1XTtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbX2k1XTtcbiAgICAgIGlmIChwYXJ0aXRpb25JZCA9PT0gd2l0bmVzc05vZGVQYXJ0aXRpb24pIHtcbiAgICAgICAgcGFydGl0aW9uMS5tZXJnZShub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnRpdGlvbjIubWVyZ2Uobm9kZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc3RydWN0IGNvbXBvbmVudHMgY29ycmVzcG9uZGluZyB0byBlYWNoIGRpc2pvaW50IHN1YnNldCBvZiBub2Rlc1xuICAgIHZhciBjb25zdHJ1Y3RDb21wb25lbnQgPSBmdW5jdGlvbiBjb25zdHJ1Y3RDb21wb25lbnQoc3Vic2V0KSB7XG4gICAgICB2YXIgY29tcG9uZW50ID0gX3RoaXMuc3Bhd24oKTtcbiAgICAgIHN1YnNldC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGNvbXBvbmVudC5tZXJnZShub2RlKTtcbiAgICAgICAgbm9kZS5jb25uZWN0ZWRFZGdlcygpLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgICAvLyBlbnN1cmUgZWRnZSBpcyB3aXRoaW4gY2FsbGluZyBjb2xsZWN0aW9uIGFuZCBlZGdlIGlzIG5vdCBpbiBjdXRcbiAgICAgICAgICBpZiAoX3RoaXMuY29udGFpbnMoZWRnZSkgJiYgIWN1dC5jb250YWlucyhlZGdlKSkge1xuICAgICAgICAgICAgY29tcG9uZW50Lm1lcmdlKGVkZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfTtcbiAgICB2YXIgY29tcG9uZW50cyA9IFtjb25zdHJ1Y3RDb21wb25lbnQocGFydGl0aW9uMSksIGNvbnN0cnVjdENvbXBvbmVudChwYXJ0aXRpb24yKV07XG4gICAgdmFyIHJldCA9IHtcbiAgICAgIGN1dDogY3V0LFxuICAgICAgY29tcG9uZW50czogY29tcG9uZW50cyxcbiAgICAgIC8vIG4uYi4gcGFydGl0aW9ucyBhcmUgaW5jbHVkZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBvbGQgYXBpIHNwZWNcbiAgICAgIC8vIChjb3VsZCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHZlcnNpb24pXG4gICAgICBwYXJ0aXRpb24xOiBwYXJ0aXRpb24xLFxuICAgICAgcGFydGl0aW9uMjogcGFydGl0aW9uMlxuICAgIH07XG4gICAgcmV0dXJuIHJldDtcbiAgfVxufTsgLy8gZWxlc2ZuXG5cbnZhciBjb3B5UG9zaXRpb24gPSBmdW5jdGlvbiBjb3B5UG9zaXRpb24ocCkge1xuICByZXR1cm4ge1xuICAgIHg6IHAueCxcbiAgICB5OiBwLnlcbiAgfTtcbn07XG52YXIgbW9kZWxUb1JlbmRlcmVkUG9zaXRpb24gPSBmdW5jdGlvbiBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbihwLCB6b29tLCBwYW4pIHtcbiAgcmV0dXJuIHtcbiAgICB4OiBwLnggKiB6b29tICsgcGFuLngsXG4gICAgeTogcC55ICogem9vbSArIHBhbi55XG4gIH07XG59O1xudmFyIHJlbmRlcmVkVG9Nb2RlbFBvc2l0aW9uID0gZnVuY3Rpb24gcmVuZGVyZWRUb01vZGVsUG9zaXRpb24ocCwgem9vbSwgcGFuKSB7XG4gIHJldHVybiB7XG4gICAgeDogKHAueCAtIHBhbi54KSAvIHpvb20sXG4gICAgeTogKHAueSAtIHBhbi55KSAvIHpvb21cbiAgfTtcbn07XG52YXIgYXJyYXkycG9pbnQgPSBmdW5jdGlvbiBhcnJheTJwb2ludChhcnIpIHtcbiAgcmV0dXJuIHtcbiAgICB4OiBhcnJbMF0sXG4gICAgeTogYXJyWzFdXG4gIH07XG59O1xudmFyIG1pbiA9IGZ1bmN0aW9uIG1pbihhcnIpIHtcbiAgdmFyIGJlZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBhcnIubGVuZ3RoO1xuICB2YXIgbWluID0gSW5maW5pdHk7XG4gIGZvciAodmFyIGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7XG4gICAgdmFyIHZhbCA9IGFycltpXTtcbiAgICBpZiAoaXNGaW5pdGUodmFsKSkge1xuICAgICAgbWluID0gTWF0aC5taW4odmFsLCBtaW4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWluO1xufTtcbnZhciBtYXggPSBmdW5jdGlvbiBtYXgoYXJyKSB7XG4gIHZhciBiZWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogYXJyLmxlbmd0aDtcbiAgdmFyIG1heCA9IC1JbmZpbml0eTtcbiAgZm9yICh2YXIgaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHtcbiAgICB2YXIgdmFsID0gYXJyW2ldO1xuICAgIGlmIChpc0Zpbml0ZSh2YWwpKSB7XG4gICAgICBtYXggPSBNYXRoLm1heCh2YWwsIG1heCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXg7XG59O1xudmFyIG1lYW4gPSBmdW5jdGlvbiBtZWFuKGFycikge1xuICB2YXIgYmVnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIHZhciBlbmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGFyci5sZW5ndGg7XG4gIHZhciB0b3RhbCA9IDA7XG4gIHZhciBuID0gMDtcbiAgZm9yICh2YXIgaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHtcbiAgICB2YXIgdmFsID0gYXJyW2ldO1xuICAgIGlmIChpc0Zpbml0ZSh2YWwpKSB7XG4gICAgICB0b3RhbCArPSB2YWw7XG4gICAgICBuKys7XG4gICAgfVxuICB9XG4gIHJldHVybiB0b3RhbCAvIG47XG59O1xudmFyIG1lZGlhbiA9IGZ1bmN0aW9uIG1lZGlhbihhcnIpIHtcbiAgdmFyIGJlZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBhcnIubGVuZ3RoO1xuICB2YXIgY29weSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogdHJ1ZTtcbiAgdmFyIHNvcnQgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHRydWU7XG4gIHZhciBpbmNsdWRlSG9sZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IHRydWU7XG4gIGlmIChjb3B5KSB7XG4gICAgYXJyID0gYXJyLnNsaWNlKGJlZ2luLCBlbmQpO1xuICB9IGVsc2Uge1xuICAgIGlmIChlbmQgPCBhcnIubGVuZ3RoKSB7XG4gICAgICBhcnIuc3BsaWNlKGVuZCwgYXJyLmxlbmd0aCAtIGVuZCk7XG4gICAgfVxuICAgIGlmIChiZWdpbiA+IDApIHtcbiAgICAgIGFyci5zcGxpY2UoMCwgYmVnaW4pO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFsbCBub24gZmluaXRlIChlLmcuIEluZmluaXR5LCBOYU4pIGVsZW1lbnRzIG11c3QgYmUgLUluZmluaXR5IHNvIHRoZXkgZ28gdG8gdGhlIHN0YXJ0XG4gIHZhciBvZmYgPSAwOyAvLyBvZmZzZXQgZnJvbSBub24tZmluaXRlIHZhbHVlc1xuICBmb3IgKHZhciBpID0gYXJyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIHYgPSBhcnJbaV07XG4gICAgaWYgKGluY2x1ZGVIb2xlcykge1xuICAgICAgaWYgKCFpc0Zpbml0ZSh2KSkge1xuICAgICAgICBhcnJbaV0gPSAtSW5maW5pdHk7XG4gICAgICAgIG9mZisrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBqdXN0IHJlbW92ZSBpdCBpZiB3ZSBkb24ndCB3YW50IHRvIGNvbnNpZGVyIGhvbGVzXG4gICAgICBhcnIuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxuICBpZiAoc29ydCkge1xuICAgIGFyci5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgfSk7IC8vIHJlcXVpcmVzIGNvcHkgPSB0cnVlIGlmIHlvdSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUgb3JpZ1xuICB9XG5cbiAgdmFyIGxlbiA9IGFyci5sZW5ndGg7XG4gIHZhciBtaWQgPSBNYXRoLmZsb29yKGxlbiAvIDIpO1xuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHJldHVybiBhcnJbbWlkICsgMSArIG9mZl07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChhcnJbbWlkIC0gMSArIG9mZl0gKyBhcnJbbWlkICsgb2ZmXSkgLyAyO1xuICB9XG59O1xudmFyIGRlZzJyYWQgPSBmdW5jdGlvbiBkZWcycmFkKGRlZykge1xuICByZXR1cm4gTWF0aC5QSSAqIGRlZyAvIDE4MDtcbn07XG52YXIgZ2V0QW5nbGVGcm9tRGlzcCA9IGZ1bmN0aW9uIGdldEFuZ2xlRnJvbURpc3AoZGlzcFgsIGRpc3BZKSB7XG4gIHJldHVybiBNYXRoLmF0YW4yKGRpc3BZLCBkaXNwWCkgLSBNYXRoLlBJIC8gMjtcbn07XG52YXIgbG9nMiA9IE1hdGgubG9nMiB8fCBmdW5jdGlvbiAobikge1xuICByZXR1cm4gTWF0aC5sb2cobikgLyBNYXRoLmxvZygyKTtcbn07XG52YXIgc2lnbnVtID0gZnVuY3Rpb24gc2lnbnVtKHgpIHtcbiAgaWYgKHggPiAwKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSBpZiAoeCA8IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG52YXIgZGlzdCA9IGZ1bmN0aW9uIGRpc3QocDEsIHAyKSB7XG4gIHJldHVybiBNYXRoLnNxcnQoc3FkaXN0KHAxLCBwMikpO1xufTtcbnZhciBzcWRpc3QgPSBmdW5jdGlvbiBzcWRpc3QocDEsIHAyKSB7XG4gIHZhciBkeCA9IHAyLnggLSBwMS54O1xuICB2YXIgZHkgPSBwMi55IC0gcDEueTtcbiAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xufTtcbnZhciBpblBsYWNlU3VtTm9ybWFsaXplID0gZnVuY3Rpb24gaW5QbGFjZVN1bU5vcm1hbGl6ZSh2KSB7XG4gIHZhciBsZW5ndGggPSB2Lmxlbmd0aDtcblxuICAvLyBGaXJzdCwgZ2V0IHN1bSBvZiBhbGwgZWxlbWVudHNcbiAgdmFyIHRvdGFsID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIHRvdGFsICs9IHZbaV07XG4gIH1cblxuICAvLyBOb3csIGRpdmlkZSBlYWNoIGJ5IHRoZSBzdW0gb2YgYWxsIGVsZW1lbnRzXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBsZW5ndGg7IF9pKyspIHtcbiAgICB2W19pXSA9IHZbX2ldIC8gdG90YWw7XG4gIH1cbiAgcmV0dXJuIHY7XG59O1xuXG4vLyBmcm9tIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQsOpemllcl9jdXJ2ZSNRdWFkcmF0aWNfY3VydmVzXG52YXIgcWJlemllckF0ID0gZnVuY3Rpb24gcWJlemllckF0KHAwLCBwMSwgcDIsIHQpIHtcbiAgcmV0dXJuICgxIC0gdCkgKiAoMSAtIHQpICogcDAgKyAyICogKDEgLSB0KSAqIHQgKiBwMSArIHQgKiB0ICogcDI7XG59O1xudmFyIHFiZXppZXJQdEF0ID0gZnVuY3Rpb24gcWJlemllclB0QXQocDAsIHAxLCBwMiwgdCkge1xuICByZXR1cm4ge1xuICAgIHg6IHFiZXppZXJBdChwMC54LCBwMS54LCBwMi54LCB0KSxcbiAgICB5OiBxYmV6aWVyQXQocDAueSwgcDEueSwgcDIueSwgdClcbiAgfTtcbn07XG52YXIgbGluZUF0ID0gZnVuY3Rpb24gbGluZUF0KHAwLCBwMSwgdCwgZCkge1xuICB2YXIgdmVjID0ge1xuICAgIHg6IHAxLnggLSBwMC54LFxuICAgIHk6IHAxLnkgLSBwMC55XG4gIH07XG4gIHZhciB2ZWNEaXN0ID0gZGlzdChwMCwgcDEpO1xuICB2YXIgbm9ybVZlYyA9IHtcbiAgICB4OiB2ZWMueCAvIHZlY0Rpc3QsXG4gICAgeTogdmVjLnkgLyB2ZWNEaXN0XG4gIH07XG4gIHQgPSB0ID09IG51bGwgPyAwIDogdDtcbiAgZCA9IGQgIT0gbnVsbCA/IGQgOiB0ICogdmVjRGlzdDtcbiAgcmV0dXJuIHtcbiAgICB4OiBwMC54ICsgbm9ybVZlYy54ICogZCxcbiAgICB5OiBwMC55ICsgbm9ybVZlYy55ICogZFxuICB9O1xufTtcbnZhciBib3VuZCA9IGZ1bmN0aW9uIGJvdW5kKG1pbiwgdmFsLCBtYXgpIHtcbiAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWwpKTtcbn07XG5cbi8vIG1ha2VzIGEgZnVsbCBiYiAoeDEsIHkxLCB4MiwgeTIsIHcsIGgpIGZyb20gaW1wbGljaXQgcGFyYW1zXG52YXIgbWFrZUJvdW5kaW5nQm94ID0gZnVuY3Rpb24gbWFrZUJvdW5kaW5nQm94KGJiKSB7XG4gIGlmIChiYiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHgxOiBJbmZpbml0eSxcbiAgICAgIHkxOiBJbmZpbml0eSxcbiAgICAgIHgyOiAtSW5maW5pdHksXG4gICAgICB5MjogLUluZmluaXR5LFxuICAgICAgdzogMCxcbiAgICAgIGg6IDBcbiAgICB9O1xuICB9IGVsc2UgaWYgKGJiLngxICE9IG51bGwgJiYgYmIueTEgIT0gbnVsbCkge1xuICAgIGlmIChiYi54MiAhPSBudWxsICYmIGJiLnkyICE9IG51bGwgJiYgYmIueDIgPj0gYmIueDEgJiYgYmIueTIgPj0gYmIueTEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHgxOiBiYi54MSxcbiAgICAgICAgeTE6IGJiLnkxLFxuICAgICAgICB4MjogYmIueDIsXG4gICAgICAgIHkyOiBiYi55MixcbiAgICAgICAgdzogYmIueDIgLSBiYi54MSxcbiAgICAgICAgaDogYmIueTIgLSBiYi55MVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGJiLncgIT0gbnVsbCAmJiBiYi5oICE9IG51bGwgJiYgYmIudyA+PSAwICYmIGJiLmggPj0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDE6IGJiLngxLFxuICAgICAgICB5MTogYmIueTEsXG4gICAgICAgIHgyOiBiYi54MSArIGJiLncsXG4gICAgICAgIHkyOiBiYi55MSArIGJiLmgsXG4gICAgICAgIHc6IGJiLncsXG4gICAgICAgIGg6IGJiLmhcbiAgICAgIH07XG4gICAgfVxuICB9XG59O1xudmFyIGNvcHlCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGNvcHlCb3VuZGluZ0JveChiYikge1xuICByZXR1cm4ge1xuICAgIHgxOiBiYi54MSxcbiAgICB4MjogYmIueDIsXG4gICAgdzogYmIudyxcbiAgICB5MTogYmIueTEsXG4gICAgeTI6IGJiLnkyLFxuICAgIGg6IGJiLmhcbiAgfTtcbn07XG52YXIgY2xlYXJCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGNsZWFyQm91bmRpbmdCb3goYmIpIHtcbiAgYmIueDEgPSBJbmZpbml0eTtcbiAgYmIueTEgPSBJbmZpbml0eTtcbiAgYmIueDIgPSAtSW5maW5pdHk7XG4gIGJiLnkyID0gLUluZmluaXR5O1xuICBiYi53ID0gMDtcbiAgYmIuaCA9IDA7XG59O1xudmFyIHNoaWZ0Qm91bmRpbmdCb3ggPSBmdW5jdGlvbiBzaGlmdEJvdW5kaW5nQm94KGJiLCBkeCwgZHkpIHtcbiAgcmV0dXJuIHtcbiAgICB4MTogYmIueDEgKyBkeCxcbiAgICB4MjogYmIueDIgKyBkeCxcbiAgICB5MTogYmIueTEgKyBkeSxcbiAgICB5MjogYmIueTIgKyBkeSxcbiAgICB3OiBiYi53LFxuICAgIGg6IGJiLmhcbiAgfTtcbn07XG52YXIgdXBkYXRlQm91bmRpbmdCb3ggPSBmdW5jdGlvbiB1cGRhdGVCb3VuZGluZ0JveChiYjEsIGJiMikge1xuICAvLyB1cGRhdGUgYmIxIHdpdGggYmIyIGJvdW5kc1xuXG4gIGJiMS54MSA9IE1hdGgubWluKGJiMS54MSwgYmIyLngxKTtcbiAgYmIxLngyID0gTWF0aC5tYXgoYmIxLngyLCBiYjIueDIpO1xuICBiYjEudyA9IGJiMS54MiAtIGJiMS54MTtcbiAgYmIxLnkxID0gTWF0aC5taW4oYmIxLnkxLCBiYjIueTEpO1xuICBiYjEueTIgPSBNYXRoLm1heChiYjEueTIsIGJiMi55Mik7XG4gIGJiMS5oID0gYmIxLnkyIC0gYmIxLnkxO1xufTtcbnZhciBleHBhbmRCb3VuZGluZ0JveEJ5UG9pbnQgPSBmdW5jdGlvbiBleHBhbmRCb3VuZGluZ0JveEJ5UG9pbnQoYmIsIHgsIHkpIHtcbiAgYmIueDEgPSBNYXRoLm1pbihiYi54MSwgeCk7XG4gIGJiLngyID0gTWF0aC5tYXgoYmIueDIsIHgpO1xuICBiYi53ID0gYmIueDIgLSBiYi54MTtcbiAgYmIueTEgPSBNYXRoLm1pbihiYi55MSwgeSk7XG4gIGJiLnkyID0gTWF0aC5tYXgoYmIueTIsIHkpO1xuICBiYi5oID0gYmIueTIgLSBiYi55MTtcbn07XG52YXIgZXhwYW5kQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBleHBhbmRCb3VuZGluZ0JveChiYikge1xuICB2YXIgcGFkZGluZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgYmIueDEgLT0gcGFkZGluZztcbiAgYmIueDIgKz0gcGFkZGluZztcbiAgYmIueTEgLT0gcGFkZGluZztcbiAgYmIueTIgKz0gcGFkZGluZztcbiAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gIGJiLmggPSBiYi55MiAtIGJiLnkxO1xuICByZXR1cm4gYmI7XG59O1xudmFyIGV4cGFuZEJvdW5kaW5nQm94U2lkZXMgPSBmdW5jdGlvbiBleHBhbmRCb3VuZGluZ0JveFNpZGVzKGJiKSB7XG4gIHZhciBwYWRkaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbMF07XG4gIHZhciB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQ7XG4gIGlmIChwYWRkaW5nLmxlbmd0aCA9PT0gMSkge1xuICAgIHRvcCA9IHJpZ2h0ID0gYm90dG9tID0gbGVmdCA9IHBhZGRpbmdbMF07XG4gIH0gZWxzZSBpZiAocGFkZGluZy5sZW5ndGggPT09IDIpIHtcbiAgICB0b3AgPSBib3R0b20gPSBwYWRkaW5nWzBdO1xuICAgIGxlZnQgPSByaWdodCA9IHBhZGRpbmdbMV07XG4gIH0gZWxzZSBpZiAocGFkZGluZy5sZW5ndGggPT09IDQpIHtcbiAgICB2YXIgX3BhZGRpbmcgPSBfc2xpY2VkVG9BcnJheShwYWRkaW5nLCA0KTtcbiAgICB0b3AgPSBfcGFkZGluZ1swXTtcbiAgICByaWdodCA9IF9wYWRkaW5nWzFdO1xuICAgIGJvdHRvbSA9IF9wYWRkaW5nWzJdO1xuICAgIGxlZnQgPSBfcGFkZGluZ1szXTtcbiAgfVxuICBiYi54MSAtPSBsZWZ0O1xuICBiYi54MiArPSByaWdodDtcbiAgYmIueTEgLT0gdG9wO1xuICBiYi55MiArPSBib3R0b207XG4gIGJiLncgPSBiYi54MiAtIGJiLngxO1xuICBiYi5oID0gYmIueTIgLSBiYi55MTtcbiAgcmV0dXJuIGJiO1xufTtcblxuLy8gYXNzaWduIHRoZSB2YWx1ZXMgb2YgYmIyIGludG8gYmIxXG52YXIgYXNzaWduQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBhc3NpZ25Cb3VuZGluZ0JveChiYjEsIGJiMikge1xuICBiYjEueDEgPSBiYjIueDE7XG4gIGJiMS55MSA9IGJiMi55MTtcbiAgYmIxLngyID0gYmIyLngyO1xuICBiYjEueTIgPSBiYjIueTI7XG4gIGJiMS53ID0gYmIxLngyIC0gYmIxLngxO1xuICBiYjEuaCA9IGJiMS55MiAtIGJiMS55MTtcbn07XG52YXIgYm91bmRpbmdCb3hlc0ludGVyc2VjdCA9IGZ1bmN0aW9uIGJvdW5kaW5nQm94ZXNJbnRlcnNlY3QoYmIxLCBiYjIpIHtcbiAgLy8gY2FzZTogb25lIGJiIHRvIHJpZ2h0IG9mIG90aGVyXG4gIGlmIChiYjEueDEgPiBiYjIueDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGJiMi54MSA+IGJiMS54Mikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGNhc2U6IG9uZSBiYiB0byBsZWZ0IG9mIG90aGVyXG4gIGlmIChiYjEueDIgPCBiYjIueDEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGJiMi54MiA8IGJiMS54MSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGNhc2U6IG9uZSBiYiBhYm92ZSBvdGhlclxuICBpZiAoYmIxLnkyIDwgYmIyLnkxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChiYjIueTIgPCBiYjEueTEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBjYXNlOiBvbmUgYmIgYmVsb3cgb3RoZXJcbiAgaWYgKGJiMS55MSA+IGJiMi55Mikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoYmIyLnkxID4gYmIxLnkyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gb3RoZXJ3aXNlLCBtdXN0IGhhdmUgc29tZSBvdmVybGFwXG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBpbkJvdW5kaW5nQm94ID0gZnVuY3Rpb24gaW5Cb3VuZGluZ0JveChiYiwgeCwgeSkge1xuICByZXR1cm4gYmIueDEgPD0geCAmJiB4IDw9IGJiLngyICYmIGJiLnkxIDw9IHkgJiYgeSA8PSBiYi55Mjtcbn07XG52YXIgcG9pbnRJbkJvdW5kaW5nQm94ID0gZnVuY3Rpb24gcG9pbnRJbkJvdW5kaW5nQm94KGJiLCBwdCkge1xuICByZXR1cm4gaW5Cb3VuZGluZ0JveChiYiwgcHQueCwgcHQueSk7XG59O1xudmFyIGJvdW5kaW5nQm94SW5Cb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGJvdW5kaW5nQm94SW5Cb3VuZGluZ0JveChiYjEsIGJiMikge1xuICByZXR1cm4gaW5Cb3VuZGluZ0JveChiYjEsIGJiMi54MSwgYmIyLnkxKSAmJiBpbkJvdW5kaW5nQm94KGJiMSwgYmIyLngyLCBiYjIueTIpO1xufTtcbnZhciByb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUgPSBmdW5jdGlvbiByb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUoeCwgeSwgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nKSB7XG4gIHZhciByYWRpdXMgPSBhcmd1bWVudHMubGVuZ3RoID4gNyAmJiBhcmd1bWVudHNbN10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s3XSA6ICdhdXRvJztcbiAgdmFyIGNvcm5lclJhZGl1cyA9IHJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCkgOiByYWRpdXM7XG4gIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgY29ybmVyUmFkaXVzID0gTWF0aC5taW4oY29ybmVyUmFkaXVzLCBoYWxmV2lkdGgsIGhhbGZIZWlnaHQpO1xuICB2YXIgZG9XaWR0aCA9IGNvcm5lclJhZGl1cyAhPT0gaGFsZldpZHRoLFxuICAgIGRvSGVpZ2h0ID0gY29ybmVyUmFkaXVzICE9PSBoYWxmSGVpZ2h0O1xuXG4gIC8vIENoZWNrIGludGVyc2VjdGlvbnMgd2l0aCBzdHJhaWdodCBsaW5lIHNlZ21lbnRzXG4gIHZhciBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuXG4gIC8vIFRvcCBzZWdtZW50LCBsZWZ0IHRvIHJpZ2h0XG4gIGlmIChkb1dpZHRoKSB7XG4gICAgdmFyIHRvcFN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICB2YXIgdG9wU3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0IC0gcGFkZGluZztcbiAgICB2YXIgdG9wRW5kWCA9IG5vZGVYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcbiAgICB2YXIgdG9wRW5kWSA9IHRvcFN0YXJ0WTtcbiAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgbm9kZVgsIG5vZGVZLCB0b3BTdGFydFgsIHRvcFN0YXJ0WSwgdG9wRW5kWCwgdG9wRW5kWSwgZmFsc2UpO1xuICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJpZ2h0IHNlZ21lbnQsIHRvcCB0byBib3R0b21cbiAgaWYgKGRvSGVpZ2h0KSB7XG4gICAgdmFyIHJpZ2h0U3RhcnRYID0gbm9kZVggKyBoYWxmV2lkdGggKyBwYWRkaW5nO1xuICAgIHZhciByaWdodFN0YXJ0WSA9IG5vZGVZIC0gaGFsZkhlaWdodCArIGNvcm5lclJhZGl1cyAtIHBhZGRpbmc7XG4gICAgdmFyIHJpZ2h0RW5kWCA9IHJpZ2h0U3RhcnRYO1xuICAgIHZhciByaWdodEVuZFkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBub2RlWCwgbm9kZVksIHJpZ2h0U3RhcnRYLCByaWdodFN0YXJ0WSwgcmlnaHRFbmRYLCByaWdodEVuZFksIGZhbHNlKTtcbiAgICBpZiAoc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgICB9XG4gIH1cblxuICAvLyBCb3R0b20gc2VnbWVudCwgbGVmdCB0byByaWdodFxuICBpZiAoZG9XaWR0aCkge1xuICAgIHZhciBib3R0b21TdGFydFggPSBub2RlWCAtIGhhbGZXaWR0aCArIGNvcm5lclJhZGl1cyAtIHBhZGRpbmc7XG4gICAgdmFyIGJvdHRvbVN0YXJ0WSA9IG5vZGVZICsgaGFsZkhlaWdodCArIHBhZGRpbmc7XG4gICAgdmFyIGJvdHRvbUVuZFggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG4gICAgdmFyIGJvdHRvbUVuZFkgPSBib3R0b21TdGFydFk7XG4gICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IGZpbml0ZUxpbmVzSW50ZXJzZWN0KHgsIHksIG5vZGVYLCBub2RlWSwgYm90dG9tU3RhcnRYLCBib3R0b21TdGFydFksIGJvdHRvbUVuZFgsIGJvdHRvbUVuZFksIGZhbHNlKTtcbiAgICBpZiAoc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgICB9XG4gIH1cblxuICAvLyBMZWZ0IHNlZ21lbnQsIHRvcCB0byBib3R0b21cbiAgaWYgKGRvSGVpZ2h0KSB7XG4gICAgdmFyIGxlZnRTdGFydFggPSBub2RlWCAtIGhhbGZXaWR0aCAtIHBhZGRpbmc7XG4gICAgdmFyIGxlZnRTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXMgLSBwYWRkaW5nO1xuICAgIHZhciBsZWZ0RW5kWCA9IGxlZnRTdGFydFg7XG4gICAgdmFyIGxlZnRFbmRZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcbiAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgbm9kZVgsIG5vZGVZLCBsZWZ0U3RhcnRYLCBsZWZ0U3RhcnRZLCBsZWZ0RW5kWCwgbGVmdEVuZFksIGZhbHNlKTtcbiAgICBpZiAoc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBpbnRlcnNlY3Rpb25zIHdpdGggYXJjIHNlZ21lbnRzXG4gIHZhciBhcmNJbnRlcnNlY3Rpb25zO1xuXG4gIC8vIFRvcCBMZWZ0XG4gIHtcbiAgICB2YXIgdG9wTGVmdENlbnRlclggPSBub2RlWCAtIGhhbGZXaWR0aCArIGNvcm5lclJhZGl1cztcbiAgICB2YXIgdG9wTGVmdENlbnRlclkgPSBub2RlWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXM7XG4gICAgYXJjSW50ZXJzZWN0aW9ucyA9IGludGVyc2VjdExpbmVDaXJjbGUoeCwgeSwgbm9kZVgsIG5vZGVZLCB0b3BMZWZ0Q2VudGVyWCwgdG9wTGVmdENlbnRlclksIGNvcm5lclJhZGl1cyArIHBhZGRpbmcpO1xuXG4gICAgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG4gICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMCAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdIDw9IHRvcExlZnRDZW50ZXJYICYmIGFyY0ludGVyc2VjdGlvbnNbMV0gPD0gdG9wTGVmdENlbnRlclkpIHtcbiAgICAgIHJldHVybiBbYXJjSW50ZXJzZWN0aW9uc1swXSwgYXJjSW50ZXJzZWN0aW9uc1sxXV07XG4gICAgfVxuICB9XG5cbiAgLy8gVG9wIFJpZ2h0XG4gIHtcbiAgICB2YXIgdG9wUmlnaHRDZW50ZXJYID0gbm9kZVggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXM7XG4gICAgdmFyIHRvcFJpZ2h0Q2VudGVyWSA9IG5vZGVZIC0gaGFsZkhlaWdodCArIGNvcm5lclJhZGl1cztcbiAgICBhcmNJbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0TGluZUNpcmNsZSh4LCB5LCBub2RlWCwgbm9kZVksIHRvcFJpZ2h0Q2VudGVyWCwgdG9wUmlnaHRDZW50ZXJZLCBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nKTtcblxuICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgIGlmIChhcmNJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDAgJiYgYXJjSW50ZXJzZWN0aW9uc1swXSA+PSB0b3BSaWdodENlbnRlclggJiYgYXJjSW50ZXJzZWN0aW9uc1sxXSA8PSB0b3BSaWdodENlbnRlclkpIHtcbiAgICAgIHJldHVybiBbYXJjSW50ZXJzZWN0aW9uc1swXSwgYXJjSW50ZXJzZWN0aW9uc1sxXV07XG4gICAgfVxuICB9XG5cbiAgLy8gQm90dG9tIFJpZ2h0XG4gIHtcbiAgICB2YXIgYm90dG9tUmlnaHRDZW50ZXJYID0gbm9kZVggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXM7XG4gICAgdmFyIGJvdHRvbVJpZ2h0Q2VudGVyWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cztcbiAgICBhcmNJbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0TGluZUNpcmNsZSh4LCB5LCBub2RlWCwgbm9kZVksIGJvdHRvbVJpZ2h0Q2VudGVyWCwgYm90dG9tUmlnaHRDZW50ZXJZLCBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nKTtcblxuICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgIGlmIChhcmNJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDAgJiYgYXJjSW50ZXJzZWN0aW9uc1swXSA+PSBib3R0b21SaWdodENlbnRlclggJiYgYXJjSW50ZXJzZWN0aW9uc1sxXSA+PSBib3R0b21SaWdodENlbnRlclkpIHtcbiAgICAgIHJldHVybiBbYXJjSW50ZXJzZWN0aW9uc1swXSwgYXJjSW50ZXJzZWN0aW9uc1sxXV07XG4gICAgfVxuICB9XG5cbiAgLy8gQm90dG9tIExlZnRcbiAge1xuICAgIHZhciBib3R0b21MZWZ0Q2VudGVyWCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzO1xuICAgIHZhciBib3R0b21MZWZ0Q2VudGVyWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cztcbiAgICBhcmNJbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0TGluZUNpcmNsZSh4LCB5LCBub2RlWCwgbm9kZVksIGJvdHRvbUxlZnRDZW50ZXJYLCBib3R0b21MZWZ0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7XG5cbiAgICAvLyBFbnN1cmUgdGhlIGludGVyc2VjdGlvbiBpcyBvbiB0aGUgZGVzaXJlZCBxdWFydGVyIG9mIHRoZSBjaXJjbGVcbiAgICBpZiAoYXJjSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwICYmIGFyY0ludGVyc2VjdGlvbnNbMF0gPD0gYm90dG9tTGVmdENlbnRlclggJiYgYXJjSW50ZXJzZWN0aW9uc1sxXSA+PSBib3R0b21MZWZ0Q2VudGVyWSkge1xuICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdOyAvLyBpZiBub3RoaW5nXG59O1xuXG52YXIgaW5MaW5lVmljaW5pdHkgPSBmdW5jdGlvbiBpbkxpbmVWaWNpbml0eSh4LCB5LCBseDEsIGx5MSwgbHgyLCBseTIsIHRvbGVyYW5jZSkge1xuICB2YXIgdCA9IHRvbGVyYW5jZTtcbiAgdmFyIHgxID0gTWF0aC5taW4obHgxLCBseDIpO1xuICB2YXIgeDIgPSBNYXRoLm1heChseDEsIGx4Mik7XG4gIHZhciB5MSA9IE1hdGgubWluKGx5MSwgbHkyKTtcbiAgdmFyIHkyID0gTWF0aC5tYXgobHkxLCBseTIpO1xuICByZXR1cm4geDEgLSB0IDw9IHggJiYgeCA8PSB4MiArIHQgJiYgeTEgLSB0IDw9IHkgJiYgeSA8PSB5MiArIHQ7XG59O1xudmFyIGluQmV6aWVyVmljaW5pdHkgPSBmdW5jdGlvbiBpbkJlemllclZpY2luaXR5KHgsIHksIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHRvbGVyYW5jZSkge1xuICB2YXIgYmIgPSB7XG4gICAgeDE6IE1hdGgubWluKHgxLCB4MywgeDIpIC0gdG9sZXJhbmNlLFxuICAgIHgyOiBNYXRoLm1heCh4MSwgeDMsIHgyKSArIHRvbGVyYW5jZSxcbiAgICB5MTogTWF0aC5taW4oeTEsIHkzLCB5MikgLSB0b2xlcmFuY2UsXG4gICAgeTI6IE1hdGgubWF4KHkxLCB5MywgeTIpICsgdG9sZXJhbmNlXG4gIH07XG5cbiAgLy8gaWYgb3V0c2lkZSB0aGUgcm91Z2ggYm91bmRpbmcgYm94IGZvciB0aGUgYmV6aWVyLCB0aGVuIGl0IGNhbid0IGJlIGEgaGl0XG4gIGlmICh4IDwgYmIueDEgfHwgeCA+IGJiLngyIHx8IHkgPCBiYi55MSB8fCB5ID4gYmIueTIpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnYmV6aWVyIG91dCBvZiByb3VnaCBiYicpXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIC8vIGNvbnNvbGUubG9nKCdkbyBtb3JlIGV4cGVuc2l2ZSBjaGVjaycpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xudmFyIHNvbHZlUXVhZHJhdGljID0gZnVuY3Rpb24gc29sdmVRdWFkcmF0aWMoYSwgYiwgYywgdmFsKSB7XG4gIGMgLT0gdmFsO1xuICB2YXIgciA9IGIgKiBiIC0gNCAqIGEgKiBjO1xuICBpZiAociA8IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIHNxcnRSID0gTWF0aC5zcXJ0KHIpO1xuICB2YXIgZGVub20gPSAyICogYTtcbiAgdmFyIHJvb3QxID0gKC1iICsgc3FydFIpIC8gZGVub207XG4gIHZhciByb290MiA9ICgtYiAtIHNxcnRSKSAvIGRlbm9tO1xuICByZXR1cm4gW3Jvb3QxLCByb290Ml07XG59O1xudmFyIHNvbHZlQ3ViaWMgPSBmdW5jdGlvbiBzb2x2ZUN1YmljKGEsIGIsIGMsIGQsIHJlc3VsdCkge1xuICAvLyBTb2x2ZXMgYSBjdWJpYyBmdW5jdGlvbiwgcmV0dXJucyByb290IGluIGZvcm0gW3IxLCBpMSwgcjIsIGkyLCByMywgaTNdLCB3aGVyZVxuICAvLyByIGlzIHRoZSByZWFsIGNvbXBvbmVudCwgaSBpcyB0aGUgaW1hZ2luYXJ5IGNvbXBvbmVudFxuXG4gIC8vIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDYXJkYW5vIG1ldGhvZCBmcm9tIHRoZSB5ZWFyIDE1NDVcbiAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DdWJpY19mdW5jdGlvbiNUaGVfbmF0dXJlX29mX3RoZV9yb290c1xuXG4gIHZhciBlcHNpbG9uID0gMC4wMDAwMTtcblxuICAvLyBhdm9pZCBkaXZpc2lvbiBieSB6ZXJvIHdoaWxlIGtlZXBpbmcgdGhlIG92ZXJhbGwgZXhwcmVzc2lvbiBjbG9zZSBpbiB2YWx1ZVxuICBpZiAoYSA9PT0gMCkge1xuICAgIGEgPSBlcHNpbG9uO1xuICB9XG4gIGIgLz0gYTtcbiAgYyAvPSBhO1xuICBkIC89IGE7XG4gIHZhciBkaXNjcmltaW5hbnQsIHEsIHIsIGR1bTEsIHMsIHQsIHRlcm0xLCByMTM7XG4gIHEgPSAoMy4wICogYyAtIGIgKiBiKSAvIDkuMDtcbiAgciA9IC0oMjcuMCAqIGQpICsgYiAqICg5LjAgKiBjIC0gMi4wICogKGIgKiBiKSk7XG4gIHIgLz0gNTQuMDtcbiAgZGlzY3JpbWluYW50ID0gcSAqIHEgKiBxICsgciAqIHI7XG4gIHJlc3VsdFsxXSA9IDA7XG4gIHRlcm0xID0gYiAvIDMuMDtcbiAgaWYgKGRpc2NyaW1pbmFudCA+IDApIHtcbiAgICBzID0gciArIE1hdGguc3FydChkaXNjcmltaW5hbnQpO1xuICAgIHMgPSBzIDwgMCA/IC1NYXRoLnBvdygtcywgMS4wIC8gMy4wKSA6IE1hdGgucG93KHMsIDEuMCAvIDMuMCk7XG4gICAgdCA9IHIgLSBNYXRoLnNxcnQoZGlzY3JpbWluYW50KTtcbiAgICB0ID0gdCA8IDAgPyAtTWF0aC5wb3coLXQsIDEuMCAvIDMuMCkgOiBNYXRoLnBvdyh0LCAxLjAgLyAzLjApO1xuICAgIHJlc3VsdFswXSA9IC10ZXJtMSArIHMgKyB0O1xuICAgIHRlcm0xICs9IChzICsgdCkgLyAyLjA7XG4gICAgcmVzdWx0WzRdID0gcmVzdWx0WzJdID0gLXRlcm0xO1xuICAgIHRlcm0xID0gTWF0aC5zcXJ0KDMuMCkgKiAoLXQgKyBzKSAvIDI7XG4gICAgcmVzdWx0WzNdID0gdGVybTE7XG4gICAgcmVzdWx0WzVdID0gLXRlcm0xO1xuICAgIHJldHVybjtcbiAgfVxuICByZXN1bHRbNV0gPSByZXN1bHRbM10gPSAwO1xuICBpZiAoZGlzY3JpbWluYW50ID09PSAwKSB7XG4gICAgcjEzID0gciA8IDAgPyAtTWF0aC5wb3coLXIsIDEuMCAvIDMuMCkgOiBNYXRoLnBvdyhyLCAxLjAgLyAzLjApO1xuICAgIHJlc3VsdFswXSA9IC10ZXJtMSArIDIuMCAqIHIxMztcbiAgICByZXN1bHRbNF0gPSByZXN1bHRbMl0gPSAtKHIxMyArIHRlcm0xKTtcbiAgICByZXR1cm47XG4gIH1cbiAgcSA9IC1xO1xuICBkdW0xID0gcSAqIHEgKiBxO1xuICBkdW0xID0gTWF0aC5hY29zKHIgLyBNYXRoLnNxcnQoZHVtMSkpO1xuICByMTMgPSAyLjAgKiBNYXRoLnNxcnQocSk7XG4gIHJlc3VsdFswXSA9IC10ZXJtMSArIHIxMyAqIE1hdGguY29zKGR1bTEgLyAzLjApO1xuICByZXN1bHRbMl0gPSAtdGVybTEgKyByMTMgKiBNYXRoLmNvcygoZHVtMSArIDIuMCAqIE1hdGguUEkpIC8gMy4wKTtcbiAgcmVzdWx0WzRdID0gLXRlcm0xICsgcjEzICogTWF0aC5jb3MoKGR1bTEgKyA0LjAgKiBNYXRoLlBJKSAvIDMuMCk7XG4gIHJldHVybjtcbn07XG52YXIgc3FkaXN0VG9RdWFkcmF0aWNCZXppZXIgPSBmdW5jdGlvbiBzcWRpc3RUb1F1YWRyYXRpY0Jlemllcih4LCB5LCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSB7XG4gIC8vIEZpbmQgbWluaW11bSBkaXN0YW5jZSBieSB1c2luZyB0aGUgbWluaW11bSBvZiB0aGUgZGlzdGFuY2VcbiAgLy8gZnVuY3Rpb24gYmV0d2VlbiB0aGUgZ2l2ZW4gcG9pbnQgYW5kIHRoZSBjdXJ2ZVxuXG4gIC8vIFRoaXMgZ2l2ZXMgdGhlIGNvZWZmaWNpZW50cyBvZiB0aGUgcmVzdWx0aW5nIGN1YmljIGVxdWF0aW9uXG4gIC8vIHdob3NlIHJvb3RzIHRlbGwgdXMgd2hlcmUgYSBwb3NzaWJsZSBtaW5pbXVtIGlzXG4gIC8vIChDb2VmZmljaWVudHMgYXJlIGRpdmlkZWQgYnkgNClcblxuICB2YXIgYSA9IDEuMCAqIHgxICogeDEgLSA0ICogeDEgKiB4MiArIDIgKiB4MSAqIHgzICsgNCAqIHgyICogeDIgLSA0ICogeDIgKiB4MyArIHgzICogeDMgKyB5MSAqIHkxIC0gNCAqIHkxICogeTIgKyAyICogeTEgKiB5MyArIDQgKiB5MiAqIHkyIC0gNCAqIHkyICogeTMgKyB5MyAqIHkzO1xuICB2YXIgYiA9IDEuMCAqIDkgKiB4MSAqIHgyIC0gMyAqIHgxICogeDEgLSAzICogeDEgKiB4MyAtIDYgKiB4MiAqIHgyICsgMyAqIHgyICogeDMgKyA5ICogeTEgKiB5MiAtIDMgKiB5MSAqIHkxIC0gMyAqIHkxICogeTMgLSA2ICogeTIgKiB5MiArIDMgKiB5MiAqIHkzO1xuICB2YXIgYyA9IDEuMCAqIDMgKiB4MSAqIHgxIC0gNiAqIHgxICogeDIgKyB4MSAqIHgzIC0geDEgKiB4ICsgMiAqIHgyICogeDIgKyAyICogeDIgKiB4IC0geDMgKiB4ICsgMyAqIHkxICogeTEgLSA2ICogeTEgKiB5MiArIHkxICogeTMgLSB5MSAqIHkgKyAyICogeTIgKiB5MiArIDIgKiB5MiAqIHkgLSB5MyAqIHk7XG4gIHZhciBkID0gMS4wICogeDEgKiB4MiAtIHgxICogeDEgKyB4MSAqIHggLSB4MiAqIHggKyB5MSAqIHkyIC0geTEgKiB5MSArIHkxICogeSAtIHkyICogeTtcblxuICAvLyBkZWJ1ZyhcImNvZWZmaWNpZW50czogXCIgKyBhIC8gYSArIFwiLCBcIiArIGIgLyBhICsgXCIsIFwiICsgYyAvIGEgKyBcIiwgXCIgKyBkIC8gYSk7XG5cbiAgdmFyIHJvb3RzID0gW107XG5cbiAgLy8gVXNlIHRoZSBjdWJpYyBzb2x2aW5nIGFsZ29yaXRobVxuICBzb2x2ZUN1YmljKGEsIGIsIGMsIGQsIHJvb3RzKTtcbiAgdmFyIHplcm9UaHJlc2hvbGQgPSAwLjAwMDAwMDE7XG4gIHZhciBwYXJhbXMgPSBbXTtcbiAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IDY7IGluZGV4ICs9IDIpIHtcbiAgICBpZiAoTWF0aC5hYnMocm9vdHNbaW5kZXggKyAxXSkgPCB6ZXJvVGhyZXNob2xkICYmIHJvb3RzW2luZGV4XSA+PSAwICYmIHJvb3RzW2luZGV4XSA8PSAxLjApIHtcbiAgICAgIHBhcmFtcy5wdXNoKHJvb3RzW2luZGV4XSk7XG4gICAgfVxuICB9XG4gIHBhcmFtcy5wdXNoKDEuMCk7XG4gIHBhcmFtcy5wdXNoKDAuMCk7XG4gIHZhciBtaW5EaXN0YW5jZVNxdWFyZWQgPSAtMTtcbiAgdmFyIGN1clgsIGN1clksIGRpc3RTcXVhcmVkO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgIGN1clggPSBNYXRoLnBvdygxLjAgLSBwYXJhbXNbaV0sIDIuMCkgKiB4MSArIDIuMCAqICgxIC0gcGFyYW1zW2ldKSAqIHBhcmFtc1tpXSAqIHgyICsgcGFyYW1zW2ldICogcGFyYW1zW2ldICogeDM7XG4gICAgY3VyWSA9IE1hdGgucG93KDEgLSBwYXJhbXNbaV0sIDIuMCkgKiB5MSArIDIgKiAoMS4wIC0gcGFyYW1zW2ldKSAqIHBhcmFtc1tpXSAqIHkyICsgcGFyYW1zW2ldICogcGFyYW1zW2ldICogeTM7XG4gICAgZGlzdFNxdWFyZWQgPSBNYXRoLnBvdyhjdXJYIC0geCwgMikgKyBNYXRoLnBvdyhjdXJZIC0geSwgMik7XG4gICAgLy8gZGVidWcoJ2Rpc3RhbmNlIGZvciBwYXJhbSAnICsgcGFyYW1zW2ldICsgXCI6IFwiICsgTWF0aC5zcXJ0KGRpc3RTcXVhcmVkKSk7XG4gICAgaWYgKG1pbkRpc3RhbmNlU3F1YXJlZCA+PSAwKSB7XG4gICAgICBpZiAoZGlzdFNxdWFyZWQgPCBtaW5EaXN0YW5jZVNxdWFyZWQpIHtcbiAgICAgICAgbWluRGlzdGFuY2VTcXVhcmVkID0gZGlzdFNxdWFyZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1pbkRpc3RhbmNlU3F1YXJlZCA9IGRpc3RTcXVhcmVkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWluRGlzdGFuY2VTcXVhcmVkO1xufTtcbnZhciBzcWRpc3RUb0Zpbml0ZUxpbmUgPSBmdW5jdGlvbiBzcWRpc3RUb0Zpbml0ZUxpbmUoeCwgeSwgeDEsIHkxLCB4MiwgeTIpIHtcbiAgdmFyIG9mZnNldCA9IFt4IC0geDEsIHkgLSB5MV07XG4gIHZhciBsaW5lID0gW3gyIC0geDEsIHkyIC0geTFdO1xuICB2YXIgbGluZVNxID0gbGluZVswXSAqIGxpbmVbMF0gKyBsaW5lWzFdICogbGluZVsxXTtcbiAgdmFyIGh5cFNxID0gb2Zmc2V0WzBdICogb2Zmc2V0WzBdICsgb2Zmc2V0WzFdICogb2Zmc2V0WzFdO1xuICB2YXIgZG90UHJvZHVjdCA9IG9mZnNldFswXSAqIGxpbmVbMF0gKyBvZmZzZXRbMV0gKiBsaW5lWzFdO1xuICB2YXIgYWRqU3EgPSBkb3RQcm9kdWN0ICogZG90UHJvZHVjdCAvIGxpbmVTcTtcbiAgaWYgKGRvdFByb2R1Y3QgPCAwKSB7XG4gICAgcmV0dXJuIGh5cFNxO1xuICB9XG4gIGlmIChhZGpTcSA+IGxpbmVTcSkge1xuICAgIHJldHVybiAoeCAtIHgyKSAqICh4IC0geDIpICsgKHkgLSB5MikgKiAoeSAtIHkyKTtcbiAgfVxuICByZXR1cm4gaHlwU3EgLSBhZGpTcTtcbn07XG52YXIgcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzID0gZnVuY3Rpb24gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIHBvaW50cykge1xuICB2YXIgeDEsIHkxLCB4MiwgeTI7XG4gIHZhciB5MztcblxuICAvLyBJbnRlcnNlY3Qgd2l0aCB2ZXJ0aWNhbCBsaW5lIHRocm91Z2ggKHgsIHkpXG4gIHZhciB1cCA9IDA7XG4gIC8vIGxldCBkb3duID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgeDEgPSBwb2ludHNbaSAqIDJdO1xuICAgIHkxID0gcG9pbnRzW2kgKiAyICsgMV07XG4gICAgaWYgKGkgKyAxIDwgcG9pbnRzLmxlbmd0aCAvIDIpIHtcbiAgICAgIHgyID0gcG9pbnRzWyhpICsgMSkgKiAyXTtcbiAgICAgIHkyID0gcG9pbnRzWyhpICsgMSkgKiAyICsgMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHgyID0gcG9pbnRzWyhpICsgMSAtIHBvaW50cy5sZW5ndGggLyAyKSAqIDJdO1xuICAgICAgeTIgPSBwb2ludHNbKGkgKyAxIC0gcG9pbnRzLmxlbmd0aCAvIDIpICogMiArIDFdO1xuICAgIH1cbiAgICBpZiAoeDEgPT0geCAmJiB4MiA9PSB4KSA7IGVsc2UgaWYgKHgxID49IHggJiYgeCA+PSB4MiB8fCB4MSA8PSB4ICYmIHggPD0geDIpIHtcbiAgICAgIHkzID0gKHggLSB4MSkgLyAoeDIgLSB4MSkgKiAoeTIgLSB5MSkgKyB5MTtcbiAgICAgIGlmICh5MyA+IHkpIHtcbiAgICAgICAgdXArKztcbiAgICAgIH1cblxuICAgICAgLy8gaWYoIHkzIDwgeSApe1xuICAgICAgLy8gZG93bisrO1xuICAgICAgLy8gfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gIH1cbiAgaWYgKHVwICUgMiA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbnZhciBwb2ludEluc2lkZVBvbHlnb24gPSBmdW5jdGlvbiBwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgYmFzZVBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgZGlyZWN0aW9uLCBwYWRkaW5nKSB7XG4gIHZhciB0cmFuc2Zvcm1lZFBvaW50cyA9IG5ldyBBcnJheShiYXNlUG9pbnRzLmxlbmd0aCk7XG5cbiAgLy8gR2l2ZXMgbmVnYXRpdmUgYW5nbGVcbiAgdmFyIGFuZ2xlO1xuICBpZiAoZGlyZWN0aW9uWzBdICE9IG51bGwpIHtcbiAgICBhbmdsZSA9IE1hdGguYXRhbihkaXJlY3Rpb25bMV0gLyBkaXJlY3Rpb25bMF0pO1xuICAgIGlmIChkaXJlY3Rpb25bMF0gPCAwKSB7XG4gICAgICBhbmdsZSA9IGFuZ2xlICsgTWF0aC5QSSAvIDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFuZ2xlID0gLWFuZ2xlIC0gTWF0aC5QSSAvIDI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGFuZ2xlID0gZGlyZWN0aW9uO1xuICB9XG4gIHZhciBjb3MgPSBNYXRoLmNvcygtYW5nbGUpO1xuICB2YXIgc2luID0gTWF0aC5zaW4oLWFuZ2xlKTtcblxuICAvLyAgICBjb25zb2xlLmxvZyhcImJhc2U6IFwiICsgYmFzZVBvaW50cyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhbnNmb3JtZWRQb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgdHJhbnNmb3JtZWRQb2ludHNbaSAqIDJdID0gd2lkdGggLyAyICogKGJhc2VQb2ludHNbaSAqIDJdICogY29zIC0gYmFzZVBvaW50c1tpICogMiArIDFdICogc2luKTtcbiAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMiArIDFdID0gaGVpZ2h0IC8gMiAqIChiYXNlUG9pbnRzW2kgKiAyICsgMV0gKiBjb3MgKyBiYXNlUG9pbnRzW2kgKiAyXSAqIHNpbik7XG4gICAgdHJhbnNmb3JtZWRQb2ludHNbaSAqIDJdICs9IGNlbnRlclg7XG4gICAgdHJhbnNmb3JtZWRQb2ludHNbaSAqIDIgKyAxXSArPSBjZW50ZXJZO1xuICB9XG4gIHZhciBwb2ludHM7XG4gIGlmIChwYWRkaW5nID4gMCkge1xuICAgIHZhciBleHBhbmRlZExpbmVTZXQgPSBleHBhbmRQb2x5Z29uKHRyYW5zZm9ybWVkUG9pbnRzLCAtcGFkZGluZyk7XG4gICAgcG9pbnRzID0gam9pbkxpbmVzKGV4cGFuZGVkTGluZVNldCk7XG4gIH0gZWxzZSB7XG4gICAgcG9pbnRzID0gdHJhbnNmb3JtZWRQb2ludHM7XG4gIH1cbiAgcmV0dXJuIHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBwb2ludHMpO1xufTtcbnZhciBwb2ludEluc2lkZVJvdW5kUG9seWdvbiA9IGZ1bmN0aW9uIHBvaW50SW5zaWRlUm91bmRQb2x5Z29uKHgsIHksIGJhc2VQb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lcnMpIHtcbiAgdmFyIGN1dFBvbHlnb25Qb2ludHMgPSBuZXcgQXJyYXkoYmFzZVBvaW50cy5sZW5ndGggKiAyKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3JuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNvcm5lciA9IGNvcm5lcnNbaV07XG4gICAgY3V0UG9seWdvblBvaW50c1tpICogNCArIDBdID0gY29ybmVyLnN0YXJ0WDtcbiAgICBjdXRQb2x5Z29uUG9pbnRzW2kgKiA0ICsgMV0gPSBjb3JuZXIuc3RhcnRZO1xuICAgIGN1dFBvbHlnb25Qb2ludHNbaSAqIDQgKyAyXSA9IGNvcm5lci5zdG9wWDtcbiAgICBjdXRQb2x5Z29uUG9pbnRzW2kgKiA0ICsgM10gPSBjb3JuZXIuc3RvcFk7XG4gICAgdmFyIHNxdWFyZWREaXN0YW5jZSA9IE1hdGgucG93KGNvcm5lci5jeCAtIHgsIDIpICsgTWF0aC5wb3coY29ybmVyLmN5IC0geSwgMik7XG4gICAgaWYgKHNxdWFyZWREaXN0YW5jZSA8PSBNYXRoLnBvdyhjb3JuZXIucmFkaXVzLCAyKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgY3V0UG9seWdvblBvaW50cyk7XG59O1xudmFyIGpvaW5MaW5lcyA9IGZ1bmN0aW9uIGpvaW5MaW5lcyhsaW5lU2V0KSB7XG4gIHZhciB2ZXJ0aWNlcyA9IG5ldyBBcnJheShsaW5lU2V0Lmxlbmd0aCAvIDIpO1xuICB2YXIgY3VycmVudExpbmVTdGFydFgsIGN1cnJlbnRMaW5lU3RhcnRZLCBjdXJyZW50TGluZUVuZFgsIGN1cnJlbnRMaW5lRW5kWTtcbiAgdmFyIG5leHRMaW5lU3RhcnRYLCBuZXh0TGluZVN0YXJ0WSwgbmV4dExpbmVFbmRYLCBuZXh0TGluZUVuZFk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZVNldC5sZW5ndGggLyA0OyBpKyspIHtcbiAgICBjdXJyZW50TGluZVN0YXJ0WCA9IGxpbmVTZXRbaSAqIDRdO1xuICAgIGN1cnJlbnRMaW5lU3RhcnRZID0gbGluZVNldFtpICogNCArIDFdO1xuICAgIGN1cnJlbnRMaW5lRW5kWCA9IGxpbmVTZXRbaSAqIDQgKyAyXTtcbiAgICBjdXJyZW50TGluZUVuZFkgPSBsaW5lU2V0W2kgKiA0ICsgM107XG4gICAgaWYgKGkgPCBsaW5lU2V0Lmxlbmd0aCAvIDQgLSAxKSB7XG4gICAgICBuZXh0TGluZVN0YXJ0WCA9IGxpbmVTZXRbKGkgKyAxKSAqIDRdO1xuICAgICAgbmV4dExpbmVTdGFydFkgPSBsaW5lU2V0WyhpICsgMSkgKiA0ICsgMV07XG4gICAgICBuZXh0TGluZUVuZFggPSBsaW5lU2V0WyhpICsgMSkgKiA0ICsgMl07XG4gICAgICBuZXh0TGluZUVuZFkgPSBsaW5lU2V0WyhpICsgMSkgKiA0ICsgM107XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRMaW5lU3RhcnRYID0gbGluZVNldFswXTtcbiAgICAgIG5leHRMaW5lU3RhcnRZID0gbGluZVNldFsxXTtcbiAgICAgIG5leHRMaW5lRW5kWCA9IGxpbmVTZXRbMl07XG4gICAgICBuZXh0TGluZUVuZFkgPSBsaW5lU2V0WzNdO1xuICAgIH1cbiAgICB2YXIgaW50ZXJzZWN0aW9uID0gZmluaXRlTGluZXNJbnRlcnNlY3QoY3VycmVudExpbmVTdGFydFgsIGN1cnJlbnRMaW5lU3RhcnRZLCBjdXJyZW50TGluZUVuZFgsIGN1cnJlbnRMaW5lRW5kWSwgbmV4dExpbmVTdGFydFgsIG5leHRMaW5lU3RhcnRZLCBuZXh0TGluZUVuZFgsIG5leHRMaW5lRW5kWSwgdHJ1ZSk7XG4gICAgdmVydGljZXNbaSAqIDJdID0gaW50ZXJzZWN0aW9uWzBdO1xuICAgIHZlcnRpY2VzW2kgKiAyICsgMV0gPSBpbnRlcnNlY3Rpb25bMV07XG4gIH1cbiAgcmV0dXJuIHZlcnRpY2VzO1xufTtcbnZhciBleHBhbmRQb2x5Z29uID0gZnVuY3Rpb24gZXhwYW5kUG9seWdvbihwb2ludHMsIHBhZCkge1xuICB2YXIgZXhwYW5kZWRMaW5lU2V0ID0gbmV3IEFycmF5KHBvaW50cy5sZW5ndGggKiAyKTtcbiAgdmFyIGN1cnJlbnRQb2ludFgsIGN1cnJlbnRQb2ludFksIG5leHRQb2ludFgsIG5leHRQb2ludFk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aCAvIDI7IGkrKykge1xuICAgIGN1cnJlbnRQb2ludFggPSBwb2ludHNbaSAqIDJdO1xuICAgIGN1cnJlbnRQb2ludFkgPSBwb2ludHNbaSAqIDIgKyAxXTtcbiAgICBpZiAoaSA8IHBvaW50cy5sZW5ndGggLyAyIC0gMSkge1xuICAgICAgbmV4dFBvaW50WCA9IHBvaW50c1soaSArIDEpICogMl07XG4gICAgICBuZXh0UG9pbnRZID0gcG9pbnRzWyhpICsgMSkgKiAyICsgMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRQb2ludFggPSBwb2ludHNbMF07XG4gICAgICBuZXh0UG9pbnRZID0gcG9pbnRzWzFdO1xuICAgIH1cblxuICAgIC8vIEN1cnJlbnQgbGluZTogW2N1cnJlbnRQb2ludFgsIGN1cnJlbnRQb2ludFldIHRvIFtuZXh0UG9pbnRYLCBuZXh0UG9pbnRZXVxuXG4gICAgLy8gQXNzdW1lIENDVyBwb2x5Z29uIHdpbmRpbmdcblxuICAgIHZhciBvZmZzZXRYID0gbmV4dFBvaW50WSAtIGN1cnJlbnRQb2ludFk7XG4gICAgdmFyIG9mZnNldFkgPSAtKG5leHRQb2ludFggLSBjdXJyZW50UG9pbnRYKTtcblxuICAgIC8vIE5vcm1hbGl6ZVxuICAgIHZhciBvZmZzZXRMZW5ndGggPSBNYXRoLnNxcnQob2Zmc2V0WCAqIG9mZnNldFggKyBvZmZzZXRZICogb2Zmc2V0WSk7XG4gICAgdmFyIG5vcm1hbGl6ZWRPZmZzZXRYID0gb2Zmc2V0WCAvIG9mZnNldExlbmd0aDtcbiAgICB2YXIgbm9ybWFsaXplZE9mZnNldFkgPSBvZmZzZXRZIC8gb2Zmc2V0TGVuZ3RoO1xuICAgIGV4cGFuZGVkTGluZVNldFtpICogNF0gPSBjdXJyZW50UG9pbnRYICsgbm9ybWFsaXplZE9mZnNldFggKiBwYWQ7XG4gICAgZXhwYW5kZWRMaW5lU2V0W2kgKiA0ICsgMV0gPSBjdXJyZW50UG9pbnRZICsgbm9ybWFsaXplZE9mZnNldFkgKiBwYWQ7XG4gICAgZXhwYW5kZWRMaW5lU2V0W2kgKiA0ICsgMl0gPSBuZXh0UG9pbnRYICsgbm9ybWFsaXplZE9mZnNldFggKiBwYWQ7XG4gICAgZXhwYW5kZWRMaW5lU2V0W2kgKiA0ICsgM10gPSBuZXh0UG9pbnRZICsgbm9ybWFsaXplZE9mZnNldFkgKiBwYWQ7XG4gIH1cbiAgcmV0dXJuIGV4cGFuZGVkTGluZVNldDtcbn07XG52YXIgaW50ZXJzZWN0TGluZUVsbGlwc2UgPSBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lRWxsaXBzZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCBlbGxpcHNlV3JhZGl1cywgZWxsaXBzZUhyYWRpdXMpIHtcbiAgdmFyIGRpc3BYID0gY2VudGVyWCAtIHg7XG4gIHZhciBkaXNwWSA9IGNlbnRlclkgLSB5O1xuICBkaXNwWCAvPSBlbGxpcHNlV3JhZGl1cztcbiAgZGlzcFkgLz0gZWxsaXBzZUhyYWRpdXM7XG4gIHZhciBsZW4gPSBNYXRoLnNxcnQoZGlzcFggKiBkaXNwWCArIGRpc3BZICogZGlzcFkpO1xuICB2YXIgbmV3TGVuZ3RoID0gbGVuIC0gMTtcbiAgaWYgKG5ld0xlbmd0aCA8IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIGxlblByb3BvcnRpb24gPSBuZXdMZW5ndGggLyBsZW47XG4gIHJldHVybiBbKGNlbnRlclggLSB4KSAqIGxlblByb3BvcnRpb24gKyB4LCAoY2VudGVyWSAtIHkpICogbGVuUHJvcG9ydGlvbiArIHldO1xufTtcbnZhciBjaGVja0luRWxsaXBzZSA9IGZ1bmN0aW9uIGNoZWNrSW5FbGxpcHNlKHgsIHksIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIHBhZGRpbmcpIHtcbiAgeCAtPSBjZW50ZXJYO1xuICB5IC09IGNlbnRlclk7XG4gIHggLz0gd2lkdGggLyAyICsgcGFkZGluZztcbiAgeSAvPSBoZWlnaHQgLyAyICsgcGFkZGluZztcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgPD0gMTtcbn07XG5cbi8vIFJldHVybnMgaW50ZXJzZWN0aW9ucyBvZiBpbmNyZWFzaW5nIGRpc3RhbmNlIGZyb20gbGluZSdzIHN0YXJ0IHBvaW50XG52YXIgaW50ZXJzZWN0TGluZUNpcmNsZSA9IGZ1bmN0aW9uIGludGVyc2VjdExpbmVDaXJjbGUoeDEsIHkxLCB4MiwgeTIsIGNlbnRlclgsIGNlbnRlclksIHJhZGl1cykge1xuICAvLyBDYWxjdWxhdGUgZCwgZGlyZWN0aW9uIHZlY3RvciBvZiBsaW5lXG4gIHZhciBkID0gW3gyIC0geDEsIHkyIC0geTFdOyAvLyBEaXJlY3Rpb24gdmVjdG9yIG9mIGxpbmVcbiAgdmFyIGYgPSBbeDEgLSBjZW50ZXJYLCB5MSAtIGNlbnRlclldO1xuICB2YXIgYSA9IGRbMF0gKiBkWzBdICsgZFsxXSAqIGRbMV07XG4gIHZhciBiID0gMiAqIChmWzBdICogZFswXSArIGZbMV0gKiBkWzFdKTtcbiAgdmFyIGMgPSBmWzBdICogZlswXSArIGZbMV0gKiBmWzFdIC0gcmFkaXVzICogcmFkaXVzO1xuICB2YXIgZGlzY3JpbWluYW50ID0gYiAqIGIgLSA0ICogYSAqIGM7XG4gIGlmIChkaXNjcmltaW5hbnQgPCAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciB0MSA9ICgtYiArIE1hdGguc3FydChkaXNjcmltaW5hbnQpKSAvICgyICogYSk7XG4gIHZhciB0MiA9ICgtYiAtIE1hdGguc3FydChkaXNjcmltaW5hbnQpKSAvICgyICogYSk7XG4gIHZhciB0TWluID0gTWF0aC5taW4odDEsIHQyKTtcbiAgdmFyIHRNYXggPSBNYXRoLm1heCh0MSwgdDIpO1xuICB2YXIgaW5SYW5nZVBhcmFtcyA9IFtdO1xuICBpZiAodE1pbiA+PSAwICYmIHRNaW4gPD0gMSkge1xuICAgIGluUmFuZ2VQYXJhbXMucHVzaCh0TWluKTtcbiAgfVxuICBpZiAodE1heCA+PSAwICYmIHRNYXggPD0gMSkge1xuICAgIGluUmFuZ2VQYXJhbXMucHVzaCh0TWF4KTtcbiAgfVxuICBpZiAoaW5SYW5nZVBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIG5lYXJJbnRlcnNlY3Rpb25YID0gaW5SYW5nZVBhcmFtc1swXSAqIGRbMF0gKyB4MTtcbiAgdmFyIG5lYXJJbnRlcnNlY3Rpb25ZID0gaW5SYW5nZVBhcmFtc1swXSAqIGRbMV0gKyB5MTtcbiAgaWYgKGluUmFuZ2VQYXJhbXMubGVuZ3RoID4gMSkge1xuICAgIGlmIChpblJhbmdlUGFyYW1zWzBdID09IGluUmFuZ2VQYXJhbXNbMV0pIHtcbiAgICAgIHJldHVybiBbbmVhckludGVyc2VjdGlvblgsIG5lYXJJbnRlcnNlY3Rpb25ZXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZhckludGVyc2VjdGlvblggPSBpblJhbmdlUGFyYW1zWzFdICogZFswXSArIHgxO1xuICAgICAgdmFyIGZhckludGVyc2VjdGlvblkgPSBpblJhbmdlUGFyYW1zWzFdICogZFsxXSArIHkxO1xuICAgICAgcmV0dXJuIFtuZWFySW50ZXJzZWN0aW9uWCwgbmVhckludGVyc2VjdGlvblksIGZhckludGVyc2VjdGlvblgsIGZhckludGVyc2VjdGlvblldO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW25lYXJJbnRlcnNlY3Rpb25YLCBuZWFySW50ZXJzZWN0aW9uWV07XG4gIH1cbn07XG52YXIgbWlkT2ZUaHJlZSA9IGZ1bmN0aW9uIG1pZE9mVGhyZWUoYSwgYiwgYykge1xuICBpZiAoYiA8PSBhICYmIGEgPD0gYyB8fCBjIDw9IGEgJiYgYSA8PSBiKSB7XG4gICAgcmV0dXJuIGE7XG4gIH0gZWxzZSBpZiAoYSA8PSBiICYmIGIgPD0gYyB8fCBjIDw9IGIgJiYgYiA8PSBhKSB7XG4gICAgcmV0dXJuIGI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGM7XG4gIH1cbn07XG5cbi8vICh4MSx5MSk9Pih4Mix5MikgaW50ZXJzZWN0IHdpdGggKHgzLHkzKT0+KHg0LHk0KVxudmFyIGZpbml0ZUxpbmVzSW50ZXJzZWN0ID0gZnVuY3Rpb24gZmluaXRlTGluZXNJbnRlcnNlY3QoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0LCBpbmZpbml0ZUxpbmVzKSB7XG4gIHZhciBkeDEzID0geDEgLSB4MztcbiAgdmFyIGR4MjEgPSB4MiAtIHgxO1xuICB2YXIgZHg0MyA9IHg0IC0geDM7XG4gIHZhciBkeTEzID0geTEgLSB5MztcbiAgdmFyIGR5MjEgPSB5MiAtIHkxO1xuICB2YXIgZHk0MyA9IHk0IC0geTM7XG4gIHZhciB1YV90ID0gZHg0MyAqIGR5MTMgLSBkeTQzICogZHgxMztcbiAgdmFyIHViX3QgPSBkeDIxICogZHkxMyAtIGR5MjEgKiBkeDEzO1xuICB2YXIgdV9iID0gZHk0MyAqIGR4MjEgLSBkeDQzICogZHkyMTtcbiAgaWYgKHVfYiAhPT0gMCkge1xuICAgIHZhciB1YSA9IHVhX3QgLyB1X2I7XG4gICAgdmFyIHViID0gdWJfdCAvIHVfYjtcbiAgICB2YXIgZmxwdFRocmVzaG9sZCA9IDAuMDAxO1xuICAgIHZhciBfbWluID0gMCAtIGZscHRUaHJlc2hvbGQ7XG4gICAgdmFyIF9tYXggPSAxICsgZmxwdFRocmVzaG9sZDtcbiAgICBpZiAoX21pbiA8PSB1YSAmJiB1YSA8PSBfbWF4ICYmIF9taW4gPD0gdWIgJiYgdWIgPD0gX21heCkge1xuICAgICAgcmV0dXJuIFt4MSArIHVhICogZHgyMSwgeTEgKyB1YSAqIGR5MjFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWluZmluaXRlTGluZXMpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFt4MSArIHVhICogZHgyMSwgeTEgKyB1YSAqIGR5MjFdO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodWFfdCA9PT0gMCB8fCB1Yl90ID09PSAwKSB7XG4gICAgICAvLyBQYXJhbGxlbCwgY29pbmNpZGVudCBsaW5lcy4gQ2hlY2sgaWYgb3ZlcmxhcFxuXG4gICAgICAvLyBDaGVjayBlbmRwb2ludCBvZiBzZWNvbmQgbGluZVxuICAgICAgaWYgKG1pZE9mVGhyZWUoeDEsIHgyLCB4NCkgPT09IHg0KSB7XG4gICAgICAgIHJldHVybiBbeDQsIHk0XTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgc3RhcnQgcG9pbnQgb2Ygc2Vjb25kIGxpbmVcbiAgICAgIGlmIChtaWRPZlRocmVlKHgxLCB4MiwgeDMpID09PSB4Mykge1xuICAgICAgICByZXR1cm4gW3gzLCB5M107XG4gICAgICB9XG5cbiAgICAgIC8vIEVuZHBvaW50IG9mIGZpcnN0IGxpbmVcbiAgICAgIGlmIChtaWRPZlRocmVlKHgzLCB4NCwgeDIpID09PSB4Mikge1xuICAgICAgICByZXR1cm4gW3gyLCB5Ml07XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBhcmFsbGVsLCBub24tY29pbmNpZGVudFxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxufTtcblxuLy8gbWF0aC5wb2x5Z29uSW50ZXJzZWN0TGluZSggeCwgeSwgYmFzZVBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZyApXG4vLyBpbnRlcnNlY3QgYSBub2RlIHBvbHlnb24gKHB0cyB0cmFuc2Zvcm1lZClcbi8vXG4vLyBtYXRoLnBvbHlnb25JbnRlcnNlY3RMaW5lKCB4LCB5LCBiYXNlUG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZIClcbi8vIGludGVyc2VjdCB0aGUgcG9pbnRzIChubyB0cmFuc2Zvcm0pXG52YXIgcG9seWdvbkludGVyc2VjdExpbmUgPSBmdW5jdGlvbiBwb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCBiYXNlUG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nKSB7XG4gIHZhciBpbnRlcnNlY3Rpb25zID0gW107XG4gIHZhciBpbnRlcnNlY3Rpb247XG4gIHZhciB0cmFuc2Zvcm1lZFBvaW50cyA9IG5ldyBBcnJheShiYXNlUG9pbnRzLmxlbmd0aCk7XG4gIHZhciBkb1RyYW5zZm9ybSA9IHRydWU7XG4gIGlmICh3aWR0aCA9PSBudWxsKSB7XG4gICAgZG9UcmFuc2Zvcm0gPSBmYWxzZTtcbiAgfVxuICB2YXIgcG9pbnRzO1xuICBpZiAoZG9UcmFuc2Zvcm0pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYW5zZm9ybWVkUG9pbnRzLmxlbmd0aCAvIDI7IGkrKykge1xuICAgICAgdHJhbnNmb3JtZWRQb2ludHNbaSAqIDJdID0gYmFzZVBvaW50c1tpICogMl0gKiB3aWR0aCArIGNlbnRlclg7XG4gICAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMiArIDFdID0gYmFzZVBvaW50c1tpICogMiArIDFdICogaGVpZ2h0ICsgY2VudGVyWTtcbiAgICB9XG4gICAgaWYgKHBhZGRpbmcgPiAwKSB7XG4gICAgICB2YXIgZXhwYW5kZWRMaW5lU2V0ID0gZXhwYW5kUG9seWdvbih0cmFuc2Zvcm1lZFBvaW50cywgLXBhZGRpbmcpO1xuICAgICAgcG9pbnRzID0gam9pbkxpbmVzKGV4cGFuZGVkTGluZVNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvaW50cyA9IHRyYW5zZm9ybWVkUG9pbnRzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBwb2ludHMgPSBiYXNlUG9pbnRzO1xuICB9XG4gIHZhciBjdXJyZW50WCwgY3VycmVudFksIG5leHRYLCBuZXh0WTtcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgcG9pbnRzLmxlbmd0aCAvIDI7IF9pMisrKSB7XG4gICAgY3VycmVudFggPSBwb2ludHNbX2kyICogMl07XG4gICAgY3VycmVudFkgPSBwb2ludHNbX2kyICogMiArIDFdO1xuICAgIGlmIChfaTIgPCBwb2ludHMubGVuZ3RoIC8gMiAtIDEpIHtcbiAgICAgIG5leHRYID0gcG9pbnRzWyhfaTIgKyAxKSAqIDJdO1xuICAgICAgbmV4dFkgPSBwb2ludHNbKF9pMiArIDEpICogMiArIDFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0WCA9IHBvaW50c1swXTtcbiAgICAgIG5leHRZID0gcG9pbnRzWzFdO1xuICAgIH1cbiAgICBpbnRlcnNlY3Rpb24gPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCBjdXJyZW50WCwgY3VycmVudFksIG5leHRYLCBuZXh0WSk7XG4gICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggIT09IDApIHtcbiAgICAgIGludGVyc2VjdGlvbnMucHVzaChpbnRlcnNlY3Rpb25bMF0sIGludGVyc2VjdGlvblsxXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbnRlcnNlY3Rpb25zO1xufTtcbnZhciByb3VuZFBvbHlnb25JbnRlcnNlY3RMaW5lID0gZnVuY3Rpb24gcm91bmRQb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCBiYXNlUG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nLCBjb3JuZXJzKSB7XG4gIHZhciBpbnRlcnNlY3Rpb25zID0gW107XG4gIHZhciBpbnRlcnNlY3Rpb247XG4gIHZhciBsaW5lcyA9IG5ldyBBcnJheShiYXNlUG9pbnRzLmxlbmd0aCAqIDIpO1xuICBjb3JuZXJzLmZvckVhY2goZnVuY3Rpb24gKGNvcm5lciwgaSkge1xuICAgIGlmIChpID09PSAwKSB7XG4gICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAyXSA9IGNvcm5lci5zdGFydFg7XG4gICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9IGNvcm5lci5zdGFydFk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVzW2kgKiA0IC0gMl0gPSBjb3JuZXIuc3RhcnRYO1xuICAgICAgbGluZXNbaSAqIDQgLSAxXSA9IGNvcm5lci5zdGFydFk7XG4gICAgfVxuICAgIGxpbmVzW2kgKiA0XSA9IGNvcm5lci5zdG9wWDtcbiAgICBsaW5lc1tpICogNCArIDFdID0gY29ybmVyLnN0b3BZO1xuICAgIGludGVyc2VjdGlvbiA9IGludGVyc2VjdExpbmVDaXJjbGUoeCwgeSwgY2VudGVyWCwgY2VudGVyWSwgY29ybmVyLmN4LCBjb3JuZXIuY3ksIGNvcm5lci5yYWRpdXMpO1xuICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoICE9PSAwKSB7XG4gICAgICBpbnRlcnNlY3Rpb25zLnB1c2goaW50ZXJzZWN0aW9uWzBdLCBpbnRlcnNlY3Rpb25bMV0pO1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoIC8gNDsgaSsrKSB7XG4gICAgaW50ZXJzZWN0aW9uID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgY2VudGVyWCwgY2VudGVyWSwgbGluZXNbaSAqIDRdLCBsaW5lc1tpICogNCArIDFdLCBsaW5lc1tpICogNCArIDJdLCBsaW5lc1tpICogNCArIDNdLCBmYWxzZSk7XG4gICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggIT09IDApIHtcbiAgICAgIGludGVyc2VjdGlvbnMucHVzaChpbnRlcnNlY3Rpb25bMF0sIGludGVyc2VjdGlvblsxXSk7XG4gICAgfVxuICB9XG4gIGlmIChpbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDIpIHtcbiAgICB2YXIgbG93ZXN0SW50ZXJzZWN0aW9uID0gW2ludGVyc2VjdGlvbnNbMF0sIGludGVyc2VjdGlvbnNbMV1dO1xuICAgIHZhciBsb3dlc3RTcXVhcmVkRGlzdGFuY2UgPSBNYXRoLnBvdyhsb3dlc3RJbnRlcnNlY3Rpb25bMF0gLSB4LCAyKSArIE1hdGgucG93KGxvd2VzdEludGVyc2VjdGlvblsxXSAtIHksIDIpO1xuICAgIGZvciAodmFyIF9pMyA9IDE7IF9pMyA8IGludGVyc2VjdGlvbnMubGVuZ3RoIC8gMjsgX2kzKyspIHtcbiAgICAgIHZhciBzcXVhcmVkRGlzdGFuY2UgPSBNYXRoLnBvdyhpbnRlcnNlY3Rpb25zW19pMyAqIDJdIC0geCwgMikgKyBNYXRoLnBvdyhpbnRlcnNlY3Rpb25zW19pMyAqIDIgKyAxXSAtIHksIDIpO1xuICAgICAgaWYgKHNxdWFyZWREaXN0YW5jZSA8PSBsb3dlc3RTcXVhcmVkRGlzdGFuY2UpIHtcbiAgICAgICAgbG93ZXN0SW50ZXJzZWN0aW9uWzBdID0gaW50ZXJzZWN0aW9uc1tfaTMgKiAyXTtcbiAgICAgICAgbG93ZXN0SW50ZXJzZWN0aW9uWzFdID0gaW50ZXJzZWN0aW9uc1tfaTMgKiAyICsgMV07XG4gICAgICAgIGxvd2VzdFNxdWFyZWREaXN0YW5jZSA9IHNxdWFyZWREaXN0YW5jZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxvd2VzdEludGVyc2VjdGlvbjtcbiAgfVxuICByZXR1cm4gaW50ZXJzZWN0aW9ucztcbn07XG52YXIgc2hvcnRlbkludGVyc2VjdGlvbiA9IGZ1bmN0aW9uIHNob3J0ZW5JbnRlcnNlY3Rpb24oaW50ZXJzZWN0aW9uLCBvZmZzZXQsIGFtb3VudCkge1xuICB2YXIgZGlzcCA9IFtpbnRlcnNlY3Rpb25bMF0gLSBvZmZzZXRbMF0sIGludGVyc2VjdGlvblsxXSAtIG9mZnNldFsxXV07XG4gIHZhciBsZW5ndGggPSBNYXRoLnNxcnQoZGlzcFswXSAqIGRpc3BbMF0gKyBkaXNwWzFdICogZGlzcFsxXSk7XG4gIHZhciBsZW5SYXRpbyA9IChsZW5ndGggLSBhbW91bnQpIC8gbGVuZ3RoO1xuICBpZiAobGVuUmF0aW8gPCAwKSB7XG4gICAgbGVuUmF0aW8gPSAwLjAwMDAxO1xuICB9XG4gIHJldHVybiBbb2Zmc2V0WzBdICsgbGVuUmF0aW8gKiBkaXNwWzBdLCBvZmZzZXRbMV0gKyBsZW5SYXRpbyAqIGRpc3BbMV1dO1xufTtcbnZhciBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUgPSBmdW5jdGlvbiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoc2lkZXMsIHJvdGF0aW9uUmFkaWFucykge1xuICB2YXIgcG9pbnRzID0gZ2VuZXJhdGVVbml0TmdvblBvaW50cyhzaWRlcywgcm90YXRpb25SYWRpYW5zKTtcbiAgcG9pbnRzID0gZml0UG9seWdvblRvU3F1YXJlKHBvaW50cyk7XG4gIHJldHVybiBwb2ludHM7XG59O1xudmFyIGZpdFBvbHlnb25Ub1NxdWFyZSA9IGZ1bmN0aW9uIGZpdFBvbHlnb25Ub1NxdWFyZShwb2ludHMpIHtcbiAgdmFyIHgsIHk7XG4gIHZhciBzaWRlcyA9IHBvaW50cy5sZW5ndGggLyAyO1xuICB2YXIgbWluWCA9IEluZmluaXR5LFxuICAgIG1pblkgPSBJbmZpbml0eSxcbiAgICBtYXhYID0gLUluZmluaXR5LFxuICAgIG1heFkgPSAtSW5maW5pdHk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2lkZXM7IGkrKykge1xuICAgIHggPSBwb2ludHNbMiAqIGldO1xuICAgIHkgPSBwb2ludHNbMiAqIGkgKyAxXTtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCk7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHgpO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5KTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSk7XG4gIH1cblxuICAvLyBzdHJldGNoIGZhY3RvcnNcbiAgdmFyIHN4ID0gMiAvIChtYXhYIC0gbWluWCk7XG4gIHZhciBzeSA9IDIgLyAobWF4WSAtIG1pblkpO1xuICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBzaWRlczsgX2k0KyspIHtcbiAgICB4ID0gcG9pbnRzWzIgKiBfaTRdID0gcG9pbnRzWzIgKiBfaTRdICogc3g7XG4gICAgeSA9IHBvaW50c1syICogX2k0ICsgMV0gPSBwb2ludHNbMiAqIF9pNCArIDFdICogc3k7XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIHgpO1xuICAgIG1heFggPSBNYXRoLm1heChtYXhYLCB4KTtcbiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgeSk7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHkpO1xuICB9XG4gIGlmIChtaW5ZIDwgLTEpIHtcbiAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBzaWRlczsgX2k1KyspIHtcbiAgICAgIHkgPSBwb2ludHNbMiAqIF9pNSArIDFdID0gcG9pbnRzWzIgKiBfaTUgKyAxXSArICgtMSAtIG1pblkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcG9pbnRzO1xufTtcbnZhciBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVVbml0TmdvblBvaW50cyhzaWRlcywgcm90YXRpb25SYWRpYW5zKSB7XG4gIHZhciBpbmNyZW1lbnQgPSAxLjAgLyBzaWRlcyAqIDIgKiBNYXRoLlBJO1xuICB2YXIgc3RhcnRBbmdsZSA9IHNpZGVzICUgMiA9PT0gMCA/IE1hdGguUEkgLyAyLjAgKyBpbmNyZW1lbnQgLyAyLjAgOiBNYXRoLlBJIC8gMi4wO1xuICBzdGFydEFuZ2xlICs9IHJvdGF0aW9uUmFkaWFucztcbiAgdmFyIHBvaW50cyA9IG5ldyBBcnJheShzaWRlcyAqIDIpO1xuICB2YXIgY3VycmVudEFuZ2xlO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZGVzOyBpKyspIHtcbiAgICBjdXJyZW50QW5nbGUgPSBpICogaW5jcmVtZW50ICsgc3RhcnRBbmdsZTtcbiAgICBwb2ludHNbMiAqIGldID0gTWF0aC5jb3MoY3VycmVudEFuZ2xlKTsgLy8geFxuICAgIHBvaW50c1syICogaSArIDFdID0gTWF0aC5zaW4oLWN1cnJlbnRBbmdsZSk7IC8vIHlcbiAgfVxuXG4gIHJldHVybiBwb2ludHM7XG59O1xuXG4vLyBTZXQgdGhlIGRlZmF1bHQgcmFkaXVzLCB1bmxlc3MgaGFsZiBvZiB3aWR0aCBvciBoZWlnaHQgaXMgc21hbGxlciB0aGFuIGRlZmF1bHRcbnZhciBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyA9IGZ1bmN0aW9uIGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpIHtcbiAgcmV0dXJuIE1hdGgubWluKHdpZHRoIC8gNCwgaGVpZ2h0IC8gNCwgOCk7XG59O1xuXG4vLyBTZXQgdGhlIGRlZmF1bHQgcmFkaXVzXG52YXIgZ2V0Um91bmRQb2x5Z29uUmFkaXVzID0gZnVuY3Rpb24gZ2V0Um91bmRQb2x5Z29uUmFkaXVzKHdpZHRoLCBoZWlnaHQpIHtcbiAgcmV0dXJuIE1hdGgubWluKHdpZHRoIC8gMTAsIGhlaWdodCAvIDEwLCA4KTtcbn07XG52YXIgZ2V0Q3V0UmVjdGFuZ2xlQ29ybmVyTGVuZ3RoID0gZnVuY3Rpb24gZ2V0Q3V0UmVjdGFuZ2xlQ29ybmVyTGVuZ3RoKCkge1xuICByZXR1cm4gODtcbn07XG52YXIgYmV6aWVyUHRzVG9RdWFkQ29lZmYgPSBmdW5jdGlvbiBiZXppZXJQdHNUb1F1YWRDb2VmZihwMCwgcDEsIHAyKSB7XG4gIHJldHVybiBbcDAgLSAyICogcDEgKyBwMiwgMiAqIChwMSAtIHAwKSwgcDBdO1xufTtcblxuLy8gZ2V0IGN1cnZlIHdpZHRoLCBoZWlnaHQsIGFuZCBjb250cm9sIHBvaW50IHBvc2l0aW9uIG9mZnNldHMgYXMgYSBwZXJjZW50YWdlIG9mIG5vZGUgaGVpZ2h0IC8gd2lkdGhcbnZhciBnZXRCYXJyZWxDdXJ2ZUNvbnN0YW50cyA9IGZ1bmN0aW9uIGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzKHdpZHRoLCBoZWlnaHQpIHtcbiAgcmV0dXJuIHtcbiAgICBoZWlnaHRPZmZzZXQ6IE1hdGgubWluKDE1LCAwLjA1ICogaGVpZ2h0KSxcbiAgICB3aWR0aE9mZnNldDogTWF0aC5taW4oMTAwLCAwLjI1ICogd2lkdGgpLFxuICAgIGN0cmxQdE9mZnNldFBjdDogMC4wNVxuICB9O1xufTtcblxudmFyIHBhZ2VSYW5rRGVmYXVsdHMgPSBkZWZhdWx0cyRnKHtcbiAgZGFtcGluZ0ZhY3RvcjogMC44LFxuICBwcmVjaXNpb246IDAuMDAwMDAxLFxuICBpdGVyYXRpb25zOiAyMDAsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxufSk7XG52YXIgZWxlc2ZuJG8gPSB7XG4gIHBhZ2VSYW5rOiBmdW5jdGlvbiBwYWdlUmFuayhvcHRpb25zKSB7XG4gICAgdmFyIF9wYWdlUmFua0RlZmF1bHRzID0gcGFnZVJhbmtEZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgIGRhbXBpbmdGYWN0b3IgPSBfcGFnZVJhbmtEZWZhdWx0cy5kYW1waW5nRmFjdG9yLFxuICAgICAgcHJlY2lzaW9uID0gX3BhZ2VSYW5rRGVmYXVsdHMucHJlY2lzaW9uLFxuICAgICAgaXRlcmF0aW9ucyA9IF9wYWdlUmFua0RlZmF1bHRzLml0ZXJhdGlvbnMsXG4gICAgICB3ZWlnaHQgPSBfcGFnZVJhbmtEZWZhdWx0cy53ZWlnaHQ7XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgICB2YXIgX3RoaXMkYnlHcm91cCA9IHRoaXMuYnlHcm91cCgpLFxuICAgICAgbm9kZXMgPSBfdGhpcyRieUdyb3VwLm5vZGVzLFxuICAgICAgZWRnZXMgPSBfdGhpcyRieUdyb3VwLmVkZ2VzO1xuICAgIHZhciBudW1Ob2RlcyA9IG5vZGVzLmxlbmd0aDtcbiAgICB2YXIgbnVtTm9kZXNTcWQgPSBudW1Ob2RlcyAqIG51bU5vZGVzO1xuICAgIHZhciBudW1FZGdlcyA9IGVkZ2VzLmxlbmd0aDtcblxuICAgIC8vIENvbnN0cnVjdCB0cmFuc3Bvc2VkIGFkamFjZW5jeSBtYXRyaXhcbiAgICAvLyBGaXJzdCBsZXRzIGhhdmUgYSB6ZXJvZWQgbWF0cml4IG9mIHRoZSByaWdodCBzaXplXG4gICAgLy8gV2UnbGwgYWxzbyBrZWVwIHRyYWNrIG9mIHRoZSBzdW0gb2YgZWFjaCBjb2x1bW5cbiAgICB2YXIgbWF0cml4ID0gbmV3IEFycmF5KG51bU5vZGVzU3FkKTtcbiAgICB2YXIgY29sdW1uU3VtID0gbmV3IEFycmF5KG51bU5vZGVzKTtcbiAgICB2YXIgYWRkaXRpb25hbFByb2IgPSAoMSAtIGRhbXBpbmdGYWN0b3IpIC8gbnVtTm9kZXM7XG5cbiAgICAvLyBDcmVhdGUgbnVsbCBtYXRyaXhcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bU5vZGVzOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbnVtTm9kZXM7IGorKykge1xuICAgICAgICB2YXIgbiA9IGkgKiBudW1Ob2RlcyArIGo7XG4gICAgICAgIG1hdHJpeFtuXSA9IDA7XG4gICAgICB9XG4gICAgICBjb2x1bW5TdW1baV0gPSAwO1xuICAgIH1cblxuICAgIC8vIE5vdywgcHJvY2VzcyBlZGdlc1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBudW1FZGdlczsgX2krKykge1xuICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tfaV07XG4gICAgICB2YXIgc3JjSWQgPSBlZGdlLmRhdGEoJ3NvdXJjZScpO1xuICAgICAgdmFyIHRndElkID0gZWRnZS5kYXRhKCd0YXJnZXQnKTtcblxuICAgICAgLy8gRG9uJ3QgaW5jbHVkZSBsb29wcyBpbiB0aGUgbWF0cml4XG4gICAgICBpZiAoc3JjSWQgPT09IHRndElkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIHMgPSBub2Rlcy5pbmRleE9mSWQoc3JjSWQpO1xuICAgICAgdmFyIHQgPSBub2Rlcy5pbmRleE9mSWQodGd0SWQpO1xuICAgICAgdmFyIHcgPSB3ZWlnaHQoZWRnZSk7XG4gICAgICB2YXIgX24gPSB0ICogbnVtTm9kZXMgKyBzO1xuXG4gICAgICAvLyBVcGRhdGUgbWF0cml4XG4gICAgICBtYXRyaXhbX25dICs9IHc7XG5cbiAgICAgIC8vIFVwZGF0ZSBjb2x1bW4gc3VtXG4gICAgICBjb2x1bW5TdW1bc10gKz0gdztcbiAgICB9XG5cbiAgICAvLyBBZGQgYWRkaXRpb25hbCBwcm9iYWJpbGl0eSBiYXNlZCBvbiBkYW1waW5nIGZhY3RvclxuICAgIC8vIEFsc28sIHRha2UgaW50byBhY2NvdW50IGNvbHVtbnMgdGhhdCBoYXZlIHN1bSA9IDBcbiAgICB2YXIgcCA9IDEuMCAvIG51bU5vZGVzICsgYWRkaXRpb25hbFByb2I7IC8vIFNob3J0aGFuZFxuXG4gICAgLy8gVHJhdmVyc2UgbWF0cml4LCBjb2x1bW4gYnkgY29sdW1uXG4gICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IG51bU5vZGVzOyBfaisrKSB7XG4gICAgICBpZiAoY29sdW1uU3VtW19qXSA9PT0gMCkge1xuICAgICAgICAvLyBObyAnbGlua3MnIG91dCBmcm9tIG5vZGUganRoLCBhc3N1bWUgZXF1YWwgcHJvYmFiaWxpdHkgZm9yIGVhY2ggcG9zc2libGUgbm9kZVxuICAgICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBudW1Ob2RlczsgX2kyKyspIHtcbiAgICAgICAgICB2YXIgX24yID0gX2kyICogbnVtTm9kZXMgKyBfajtcbiAgICAgICAgICBtYXRyaXhbX24yXSA9IHA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vZGUganRoIGhhcyBvdXRnb2luZyBsaW5rLCBjb21wdXRlIG5vcm1hbGl6ZWQgcHJvYmFiaWxpdGllc1xuICAgICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBudW1Ob2RlczsgX2kzKyspIHtcbiAgICAgICAgICB2YXIgX24zID0gX2kzICogbnVtTm9kZXMgKyBfajtcbiAgICAgICAgICBtYXRyaXhbX24zXSA9IG1hdHJpeFtfbjNdIC8gY29sdW1uU3VtW19qXSArIGFkZGl0aW9uYWxQcm9iO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29tcHV0ZSBkb21pbmFudCBlaWdlbnZlY3RvciB1c2luZyBwb3dlciBtZXRob2RcbiAgICB2YXIgZWlnZW52ZWN0b3IgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuICAgIHZhciB0ZW1wID0gbmV3IEFycmF5KG51bU5vZGVzKTtcbiAgICB2YXIgcHJldmlvdXM7XG5cbiAgICAvLyBTdGFydCB3aXRoIGEgdmVjdG9yIG9mIGFsbCAxJ3NcbiAgICAvLyBBbHNvLCBpbml0aWFsaXplIGEgbnVsbCB2ZWN0b3Igd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHNob3J0aGFuZFxuICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG51bU5vZGVzOyBfaTQrKykge1xuICAgICAgZWlnZW52ZWN0b3JbX2k0XSA9IDE7XG4gICAgfVxuICAgIGZvciAodmFyIGl0ZXIgPSAwOyBpdGVyIDwgaXRlcmF0aW9uczsgaXRlcisrKSB7XG4gICAgICAvLyBUZW1wIGFycmF5IHdpdGggYWxsIDAnc1xuICAgICAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgbnVtTm9kZXM7IF9pNSsrKSB7XG4gICAgICAgIHRlbXBbX2k1XSA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIE11bHRpcGx5IG1hdHJpeCB3aXRoIHByZXZpb3VzIHJlc3VsdFxuICAgICAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgbnVtTm9kZXM7IF9pNisrKSB7XG4gICAgICAgIGZvciAodmFyIF9qMiA9IDA7IF9qMiA8IG51bU5vZGVzOyBfajIrKykge1xuICAgICAgICAgIHZhciBfbjQgPSBfaTYgKiBudW1Ob2RlcyArIF9qMjtcbiAgICAgICAgICB0ZW1wW19pNl0gKz0gbWF0cml4W19uNF0gKiBlaWdlbnZlY3RvcltfajJdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpblBsYWNlU3VtTm9ybWFsaXplKHRlbXApO1xuICAgICAgcHJldmlvdXMgPSBlaWdlbnZlY3RvcjtcbiAgICAgIGVpZ2VudmVjdG9yID0gdGVtcDtcbiAgICAgIHRlbXAgPSBwcmV2aW91cztcbiAgICAgIHZhciBkaWZmID0gMDtcbiAgICAgIC8vIENvbXB1dGUgZGlmZmVyZW5jZSAoc3F1YXJlZCBtb2R1bGUpIG9mIGJvdGggdmVjdG9yc1xuICAgICAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgbnVtTm9kZXM7IF9pNysrKSB7XG4gICAgICAgIHZhciBkZWx0YSA9IHByZXZpb3VzW19pN10gLSBlaWdlbnZlY3RvcltfaTddO1xuICAgICAgICBkaWZmICs9IGRlbHRhICogZGVsdGE7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGRpZmZlcmVuY2UgaXMgbGVzcyB0aGFuIHRoZSBkZXNpcmVkIHRocmVzaG9sZCwgc3RvcCBpdGVyYXRpbmdcbiAgICAgIGlmIChkaWZmIDwgcHJlY2lzaW9uKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbnN0cnVjdCByZXN1bHRcbiAgICB2YXIgcmVzID0ge1xuICAgICAgcmFuazogZnVuY3Rpb24gcmFuayhub2RlKSB7XG4gICAgICAgIG5vZGUgPSBjeS5jb2xsZWN0aW9uKG5vZGUpWzBdO1xuICAgICAgICByZXR1cm4gZWlnZW52ZWN0b3Jbbm9kZXMuaW5kZXhPZihub2RlKV07XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gcmVzO1xuICB9IC8vIHBhZ2VSYW5rXG59OyAvLyBlbGVzZm5cblxudmFyIGRlZmF1bHRzJGYgPSBkZWZhdWx0cyRnKHtcbiAgcm9vdDogbnVsbCxcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2UsXG4gIGFscGhhOiAwXG59KTtcbnZhciBlbGVzZm4kbiA9IHtcbiAgZGVncmVlQ2VudHJhbGl0eU5vcm1hbGl6ZWQ6IGZ1bmN0aW9uIGRlZ3JlZUNlbnRyYWxpdHlOb3JtYWxpemVkKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gZGVmYXVsdHMkZihvcHRpb25zKTtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICAgIHZhciBudW1Ob2RlcyA9IG5vZGVzLmxlbmd0aDtcbiAgICBpZiAoIW9wdGlvbnMuZGlyZWN0ZWQpIHtcbiAgICAgIHZhciBkZWdyZWVzID0ge307XG4gICAgICB2YXIgbWF4RGVncmVlID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTm9kZXM7IGkrKykge1xuICAgICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuXG4gICAgICAgIC8vIGFkZCBjdXJyZW50IG5vZGUgdG8gdGhlIGN1cnJlbnQgb3B0aW9ucyBvYmplY3QgYW5kIGNhbGwgZGVncmVlQ2VudHJhbGl0eVxuICAgICAgICBvcHRpb25zLnJvb3QgPSBub2RlO1xuICAgICAgICB2YXIgY3VyckRlZ3JlZSA9IHRoaXMuZGVncmVlQ2VudHJhbGl0eShvcHRpb25zKTtcbiAgICAgICAgaWYgKG1heERlZ3JlZSA8IGN1cnJEZWdyZWUuZGVncmVlKSB7XG4gICAgICAgICAgbWF4RGVncmVlID0gY3VyckRlZ3JlZS5kZWdyZWU7XG4gICAgICAgIH1cbiAgICAgICAgZGVncmVlc1tub2RlLmlkKCldID0gY3VyckRlZ3JlZS5kZWdyZWU7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZWdyZWU6IGZ1bmN0aW9uIGRlZ3JlZShub2RlKSB7XG4gICAgICAgICAgaWYgKG1heERlZ3JlZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdHJpbmcobm9kZSkpIHtcbiAgICAgICAgICAgIC8vIGZyb20gaXMgYSBzZWxlY3RvciBzdHJpbmdcbiAgICAgICAgICAgIG5vZGUgPSBjeS5maWx0ZXIobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkZWdyZWVzW25vZGUuaWQoKV0gLyBtYXhEZWdyZWU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpbmRlZ3JlZXMgPSB7fTtcbiAgICAgIHZhciBvdXRkZWdyZWVzID0ge307XG4gICAgICB2YXIgbWF4SW5kZWdyZWUgPSAwO1xuICAgICAgdmFyIG1heE91dGRlZ3JlZSA9IDA7XG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbnVtTm9kZXM7IF9pKyspIHtcbiAgICAgICAgdmFyIF9ub2RlID0gbm9kZXNbX2ldO1xuICAgICAgICB2YXIgaWQgPSBfbm9kZS5pZCgpO1xuXG4gICAgICAgIC8vIGFkZCBjdXJyZW50IG5vZGUgdG8gdGhlIGN1cnJlbnQgb3B0aW9ucyBvYmplY3QgYW5kIGNhbGwgZGVncmVlQ2VudHJhbGl0eVxuICAgICAgICBvcHRpb25zLnJvb3QgPSBfbm9kZTtcbiAgICAgICAgdmFyIF9jdXJyRGVncmVlID0gdGhpcy5kZWdyZWVDZW50cmFsaXR5KG9wdGlvbnMpO1xuICAgICAgICBpZiAobWF4SW5kZWdyZWUgPCBfY3VyckRlZ3JlZS5pbmRlZ3JlZSkgbWF4SW5kZWdyZWUgPSBfY3VyckRlZ3JlZS5pbmRlZ3JlZTtcbiAgICAgICAgaWYgKG1heE91dGRlZ3JlZSA8IF9jdXJyRGVncmVlLm91dGRlZ3JlZSkgbWF4T3V0ZGVncmVlID0gX2N1cnJEZWdyZWUub3V0ZGVncmVlO1xuICAgICAgICBpbmRlZ3JlZXNbaWRdID0gX2N1cnJEZWdyZWUuaW5kZWdyZWU7XG4gICAgICAgIG91dGRlZ3JlZXNbaWRdID0gX2N1cnJEZWdyZWUub3V0ZGVncmVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5kZWdyZWU6IGZ1bmN0aW9uIGluZGVncmVlKG5vZGUpIHtcbiAgICAgICAgICBpZiAobWF4SW5kZWdyZWUgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdHJpbmcobm9kZSkpIHtcbiAgICAgICAgICAgIC8vIGZyb20gaXMgYSBzZWxlY3RvciBzdHJpbmdcbiAgICAgICAgICAgIG5vZGUgPSBjeS5maWx0ZXIobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpbmRlZ3JlZXNbbm9kZS5pZCgpXSAvIG1heEluZGVncmVlO1xuICAgICAgICB9LFxuICAgICAgICBvdXRkZWdyZWU6IGZ1bmN0aW9uIG91dGRlZ3JlZShub2RlKSB7XG4gICAgICAgICAgaWYgKG1heE91dGRlZ3JlZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdHJpbmcobm9kZSkpIHtcbiAgICAgICAgICAgIC8vIGZyb20gaXMgYSBzZWxlY3RvciBzdHJpbmdcbiAgICAgICAgICAgIG5vZGUgPSBjeS5maWx0ZXIobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXRkZWdyZWVzW25vZGUuaWQoKV0gLyBtYXhPdXRkZWdyZWU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9LFxuICAvLyBkZWdyZWVDZW50cmFsaXR5Tm9ybWFsaXplZFxuXG4gIC8vIEltcGxlbWVudGVkIGZyb20gdGhlIGFsZ29yaXRobSBpbiBPcHNhaGwncyBwYXBlclxuICAvLyBcIk5vZGUgY2VudHJhbGl0eSBpbiB3ZWlnaHRlZCBuZXR3b3JrczogR2VuZXJhbGl6aW5nIGRlZ3JlZSBhbmQgc2hvcnRlc3QgcGF0aHNcIlxuICAvLyBjaGVjayB0aGUgaGVhZGluZyAyIFwiRGVncmVlXCJcbiAgZGVncmVlQ2VudHJhbGl0eTogZnVuY3Rpb24gZGVncmVlQ2VudHJhbGl0eShvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IGRlZmF1bHRzJGYob3B0aW9ucyk7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBjYWxsaW5nRWxlcyA9IHRoaXM7XG4gICAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIHJvb3QgPSBfb3B0aW9ucy5yb290LFxuICAgICAgd2VpZ2h0ID0gX29wdGlvbnMud2VpZ2h0LFxuICAgICAgZGlyZWN0ZWQgPSBfb3B0aW9ucy5kaXJlY3RlZCxcbiAgICAgIGFscGhhID0gX29wdGlvbnMuYWxwaGE7XG4gICAgcm9vdCA9IGN5LmNvbGxlY3Rpb24ocm9vdClbMF07XG4gICAgaWYgKCFkaXJlY3RlZCkge1xuICAgICAgdmFyIGNvbm5FZGdlcyA9IHJvb3QuY29ubmVjdGVkRWRnZXMoKS5pbnRlcnNlY3Rpb24oY2FsbGluZ0VsZXMpO1xuICAgICAgdmFyIGsgPSBjb25uRWRnZXMubGVuZ3RoO1xuICAgICAgdmFyIHMgPSAwO1xuXG4gICAgICAvLyBOb3csIHN1bSBlZGdlIHdlaWdodHNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubkVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHMgKz0gd2VpZ2h0KGNvbm5FZGdlc1tpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZWdyZWU6IE1hdGgucG93KGssIDEgLSBhbHBoYSkgKiBNYXRoLnBvdyhzLCBhbHBoYSlcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlZGdlcyA9IHJvb3QuY29ubmVjdGVkRWRnZXMoKTtcbiAgICAgIHZhciBpbmNvbWluZyA9IGVkZ2VzLmZpbHRlcihmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICByZXR1cm4gZWRnZS50YXJnZXQoKS5zYW1lKHJvb3QpICYmIGNhbGxpbmdFbGVzLmhhcyhlZGdlKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIG91dGdvaW5nID0gZWRnZXMuZmlsdGVyKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgIHJldHVybiBlZGdlLnNvdXJjZSgpLnNhbWUocm9vdCkgJiYgY2FsbGluZ0VsZXMuaGFzKGVkZ2UpO1xuICAgICAgfSk7XG4gICAgICB2YXIga19pbiA9IGluY29taW5nLmxlbmd0aDtcbiAgICAgIHZhciBrX291dCA9IG91dGdvaW5nLmxlbmd0aDtcbiAgICAgIHZhciBzX2luID0gMDtcbiAgICAgIHZhciBzX291dCA9IDA7XG5cbiAgICAgIC8vIE5vdywgc3VtIGluY29taW5nIGVkZ2Ugd2VpZ2h0c1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgaW5jb21pbmcubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICBzX2luICs9IHdlaWdodChpbmNvbWluZ1tfaTJdKTtcbiAgICAgIH1cblxuICAgICAgLy8gTm93LCBzdW0gb3V0Z29pbmcgZWRnZSB3ZWlnaHRzXG4gICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBvdXRnb2luZy5sZW5ndGg7IF9pMysrKSB7XG4gICAgICAgIHNfb3V0ICs9IHdlaWdodChvdXRnb2luZ1tfaTNdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGluZGVncmVlOiBNYXRoLnBvdyhrX2luLCAxIC0gYWxwaGEpICogTWF0aC5wb3coc19pbiwgYWxwaGEpLFxuICAgICAgICBvdXRkZWdyZWU6IE1hdGgucG93KGtfb3V0LCAxIC0gYWxwaGEpICogTWF0aC5wb3coc19vdXQsIGFscGhhKVxuICAgICAgfTtcbiAgICB9XG4gIH0gLy8gZGVncmVlQ2VudHJhbGl0eVxufTsgLy8gZWxlc2ZuXG5cbi8vIG5pY2UsIHNob3J0IG1hdGhlbWF0aWNhbCBhbGlhc1xuZWxlc2ZuJG4uZGMgPSBlbGVzZm4kbi5kZWdyZWVDZW50cmFsaXR5O1xuZWxlc2ZuJG4uZGNuID0gZWxlc2ZuJG4uZGVncmVlQ2VudHJhbGl0eU5vcm1hbGlzZWQgPSBlbGVzZm4kbi5kZWdyZWVDZW50cmFsaXR5Tm9ybWFsaXplZDtcblxudmFyIGRlZmF1bHRzJGUgPSBkZWZhdWx0cyRnKHtcbiAgaGFybW9uaWM6IHRydWUsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KCkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2UsXG4gIHJvb3Q6IG51bGxcbn0pO1xudmFyIGVsZXNmbiRtID0ge1xuICBjbG9zZW5lc3NDZW50cmFsaXR5Tm9ybWFsaXplZDogZnVuY3Rpb24gY2xvc2VuZXNzQ2VudHJhbGl0eU5vcm1hbGl6ZWQob3B0aW9ucykge1xuICAgIHZhciBfZGVmYXVsdHMgPSBkZWZhdWx0cyRlKG9wdGlvbnMpLFxuICAgICAgaGFybW9uaWMgPSBfZGVmYXVsdHMuaGFybW9uaWMsXG4gICAgICB3ZWlnaHQgPSBfZGVmYXVsdHMud2VpZ2h0LFxuICAgICAgZGlyZWN0ZWQgPSBfZGVmYXVsdHMuZGlyZWN0ZWQ7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBjbG9zZW5lc3NlcyA9IHt9O1xuICAgIHZhciBtYXhDbG9zZW5lc3MgPSAwO1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgICB2YXIgZncgPSB0aGlzLmZsb3lkV2Fyc2hhbGwoe1xuICAgICAgd2VpZ2h0OiB3ZWlnaHQsXG4gICAgICBkaXJlY3RlZDogZGlyZWN0ZWRcbiAgICB9KTtcblxuICAgIC8vIENvbXB1dGUgY2xvc2VuZXNzIGZvciBldmVyeSBub2RlIGFuZCBmaW5kIHRoZSBtYXhpbXVtIGNsb3NlbmVzc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjdXJyQ2xvc2VuZXNzID0gMDtcbiAgICAgIHZhciBub2RlX2kgPSBub2Rlc1tpXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbm9kZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKGkgIT09IGopIHtcbiAgICAgICAgICB2YXIgZCA9IGZ3LmRpc3RhbmNlKG5vZGVfaSwgbm9kZXNbal0pO1xuICAgICAgICAgIGlmIChoYXJtb25pYykge1xuICAgICAgICAgICAgY3VyckNsb3NlbmVzcyArPSAxIC8gZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VyckNsb3NlbmVzcyArPSBkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFoYXJtb25pYykge1xuICAgICAgICBjdXJyQ2xvc2VuZXNzID0gMSAvIGN1cnJDbG9zZW5lc3M7XG4gICAgICB9XG4gICAgICBpZiAobWF4Q2xvc2VuZXNzIDwgY3VyckNsb3NlbmVzcykge1xuICAgICAgICBtYXhDbG9zZW5lc3MgPSBjdXJyQ2xvc2VuZXNzO1xuICAgICAgfVxuICAgICAgY2xvc2VuZXNzZXNbbm9kZV9pLmlkKCldID0gY3VyckNsb3NlbmVzcztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsb3NlbmVzczogZnVuY3Rpb24gY2xvc2VuZXNzKG5vZGUpIHtcbiAgICAgICAgaWYgKG1heENsb3NlbmVzcyA9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cmluZyhub2RlKSkge1xuICAgICAgICAgIC8vIGZyb20gaXMgYSBzZWxlY3RvciBzdHJpbmdcbiAgICAgICAgICBub2RlID0gY3kuZmlsdGVyKG5vZGUpWzBdLmlkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZnJvbSBpcyBhIG5vZGVcbiAgICAgICAgICBub2RlID0gbm9kZS5pZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9zZW5lc3Nlc1tub2RlXSAvIG1heENsb3NlbmVzcztcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHBzZXVkb2NvZGUgZnJvbSB3aWtpcGVkaWFcbiAgY2xvc2VuZXNzQ2VudHJhbGl0eTogZnVuY3Rpb24gY2xvc2VuZXNzQ2VudHJhbGl0eShvcHRpb25zKSB7XG4gICAgdmFyIF9kZWZhdWx0czIgPSBkZWZhdWx0cyRlKG9wdGlvbnMpLFxuICAgICAgcm9vdCA9IF9kZWZhdWx0czIucm9vdCxcbiAgICAgIHdlaWdodCA9IF9kZWZhdWx0czIud2VpZ2h0LFxuICAgICAgZGlyZWN0ZWQgPSBfZGVmYXVsdHMyLmRpcmVjdGVkLFxuICAgICAgaGFybW9uaWMgPSBfZGVmYXVsdHMyLmhhcm1vbmljO1xuICAgIHJvb3QgPSB0aGlzLmZpbHRlcihyb290KVswXTtcblxuICAgIC8vIHdlIG5lZWQgZGlzdGFuY2UgZnJvbSB0aGlzIG5vZGUgdG8gZXZlcnkgb3RoZXIgbm9kZVxuICAgIHZhciBkaWprc3RyYSA9IHRoaXMuZGlqa3N0cmEoe1xuICAgICAgcm9vdDogcm9vdCxcbiAgICAgIHdlaWdodDogd2VpZ2h0LFxuICAgICAgZGlyZWN0ZWQ6IGRpcmVjdGVkXG4gICAgfSk7XG4gICAgdmFyIHRvdGFsRGlzdGFuY2UgPSAwO1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbiA9IG5vZGVzW2ldO1xuICAgICAgaWYgKCFuLnNhbWUocm9vdCkpIHtcbiAgICAgICAgdmFyIGQgPSBkaWprc3RyYS5kaXN0YW5jZVRvKG4pO1xuICAgICAgICBpZiAoaGFybW9uaWMpIHtcbiAgICAgICAgICB0b3RhbERpc3RhbmNlICs9IDEgLyBkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvdGFsRGlzdGFuY2UgKz0gZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFybW9uaWMgPyB0b3RhbERpc3RhbmNlIDogMSAvIHRvdGFsRGlzdGFuY2U7XG4gIH0gLy8gY2xvc2VuZXNzQ2VudHJhbGl0eVxufTsgLy8gZWxlc2ZuXG5cbi8vIG5pY2UsIHNob3J0IG1hdGhlbWF0aWNhbCBhbGlhc1xuZWxlc2ZuJG0uY2MgPSBlbGVzZm4kbS5jbG9zZW5lc3NDZW50cmFsaXR5O1xuZWxlc2ZuJG0uY2NuID0gZWxlc2ZuJG0uY2xvc2VuZXNzQ2VudHJhbGl0eU5vcm1hbGlzZWQgPSBlbGVzZm4kbS5jbG9zZW5lc3NDZW50cmFsaXR5Tm9ybWFsaXplZDtcblxudmFyIGRlZmF1bHRzJGQgPSBkZWZhdWx0cyRnKHtcbiAgd2VpZ2h0OiBudWxsLFxuICBkaXJlY3RlZDogZmFsc2Vcbn0pO1xudmFyIGVsZXNmbiRsID0ge1xuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHRoZSBhbGdvcml0aG0gaW4gdGhlIHBhcGVyIFwiT24gVmFyaWFudHMgb2YgU2hvcnRlc3QtUGF0aCBCZXR3ZWVubmVzcyBDZW50cmFsaXR5IGFuZCB0aGVpciBHZW5lcmljIENvbXB1dGF0aW9uXCIgYnkgVWxyaWsgQnJhbmRlc1xuICBiZXR3ZWVubmVzc0NlbnRyYWxpdHk6IGZ1bmN0aW9uIGJldHdlZW5uZXNzQ2VudHJhbGl0eShvcHRpb25zKSB7XG4gICAgdmFyIF9kZWZhdWx0cyA9IGRlZmF1bHRzJGQob3B0aW9ucyksXG4gICAgICBkaXJlY3RlZCA9IF9kZWZhdWx0cy5kaXJlY3RlZCxcbiAgICAgIHdlaWdodCA9IF9kZWZhdWx0cy53ZWlnaHQ7XG4gICAgdmFyIHdlaWdodGVkID0gd2VpZ2h0ICE9IG51bGw7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuXG4gICAgLy8gc3RhcnRpbmdcbiAgICB2YXIgViA9IHRoaXMubm9kZXMoKTtcbiAgICB2YXIgQSA9IHt9O1xuICAgIHZhciBfQyA9IHt9O1xuICAgIHZhciBtYXggPSAwO1xuICAgIHZhciBDID0ge1xuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWwpIHtcbiAgICAgICAgX0Nba2V5XSA9IHZhbDtcbiAgICAgICAgaWYgKHZhbCA+IG1heCkge1xuICAgICAgICAgIG1heCA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgICByZXR1cm4gX0Nba2V5XTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQSBjb250YWlucyB0aGUgbmVpZ2hib3Job29kcyBvZiBldmVyeSBub2RlXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBWLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdiA9IFZbaV07XG4gICAgICB2YXIgdmlkID0gdi5pZCgpO1xuICAgICAgaWYgKGRpcmVjdGVkKSB7XG4gICAgICAgIEFbdmlkXSA9IHYub3V0Z29lcnMoKS5ub2RlcygpOyAvLyBnZXQgb3V0Z29lcnMgb2YgZXZlcnkgbm9kZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQVt2aWRdID0gdi5vcGVuTmVpZ2hib3Job29kKCkubm9kZXMoKTsgLy8gZ2V0IG5laWdoYm9ycyBvZiBldmVyeSBub2RlXG4gICAgICB9XG5cbiAgICAgIEMuc2V0KHZpZCwgMCk7XG4gICAgfVxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKHMpIHtcbiAgICAgIHZhciBzaWQgPSBWW3NdLmlkKCk7XG4gICAgICB2YXIgUyA9IFtdOyAvLyBzdGFja1xuICAgICAgdmFyIFAgPSB7fTtcbiAgICAgIHZhciBnID0ge307XG4gICAgICB2YXIgZCA9IHt9O1xuICAgICAgdmFyIFEgPSBuZXcgaGVhcChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gZFthXSAtIGRbYl07XG4gICAgICB9KTsgLy8gcXVldWVcblxuICAgICAgLy8gaW5pdCBkaWN0aW9uYXJpZXNcbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBWLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgX3ZpZCA9IFZbX2ldLmlkKCk7XG4gICAgICAgIFBbX3ZpZF0gPSBbXTtcbiAgICAgICAgZ1tfdmlkXSA9IDA7XG4gICAgICAgIGRbX3ZpZF0gPSBJbmZpbml0eTtcbiAgICAgIH1cbiAgICAgIGdbc2lkXSA9IDE7IC8vIHNpZ21hXG4gICAgICBkW3NpZF0gPSAwOyAvLyBkaXN0YW5jZSB0byBzXG5cbiAgICAgIFEucHVzaChzaWQpO1xuICAgICAgd2hpbGUgKCFRLmVtcHR5KCkpIHtcbiAgICAgICAgdmFyIF92ID0gUS5wb3AoKTtcbiAgICAgICAgUy5wdXNoKF92KTtcbiAgICAgICAgaWYgKHdlaWdodGVkKSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBBW192XS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHcgPSBBW192XVtqXTtcbiAgICAgICAgICAgIHZhciB2RWxlID0gY3kuZ2V0RWxlbWVudEJ5SWQoX3YpO1xuICAgICAgICAgICAgdmFyIGVkZ2UgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAodkVsZS5lZGdlc1RvKHcpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgZWRnZSA9IHZFbGUuZWRnZXNUbyh3KVswXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVkZ2UgPSB3LmVkZ2VzVG8odkVsZSlbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZWRnZVdlaWdodCA9IHdlaWdodChlZGdlKTtcbiAgICAgICAgICAgIHcgPSB3LmlkKCk7XG4gICAgICAgICAgICBpZiAoZFt3XSA+IGRbX3ZdICsgZWRnZVdlaWdodCkge1xuICAgICAgICAgICAgICBkW3ddID0gZFtfdl0gKyBlZGdlV2VpZ2h0O1xuICAgICAgICAgICAgICBpZiAoUS5ub2Rlcy5pbmRleE9mKHcpIDwgMCkge1xuICAgICAgICAgICAgICAgIC8vaWYgdyBpcyBub3QgaW4gUVxuICAgICAgICAgICAgICAgIFEucHVzaCh3KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgcG9zaXRpb24gaWYgdyBpcyBpbiBRXG4gICAgICAgICAgICAgICAgUS51cGRhdGVJdGVtKHcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGdbd10gPSAwO1xuICAgICAgICAgICAgICBQW3ddID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZFt3XSA9PSBkW192XSArIGVkZ2VXZWlnaHQpIHtcbiAgICAgICAgICAgICAgZ1t3XSA9IGdbd10gKyBnW192XTtcbiAgICAgICAgICAgICAgUFt3XS5wdXNoKF92KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IEFbX3ZdLmxlbmd0aDsgX2orKykge1xuICAgICAgICAgICAgdmFyIF93ID0gQVtfdl1bX2pdLmlkKCk7XG4gICAgICAgICAgICBpZiAoZFtfd10gPT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgICAgUS5wdXNoKF93KTtcbiAgICAgICAgICAgICAgZFtfd10gPSBkW192XSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZFtfd10gPT0gZFtfdl0gKyAxKSB7XG4gICAgICAgICAgICAgIGdbX3ddID0gZ1tfd10gKyBnW192XTtcbiAgICAgICAgICAgICAgUFtfd10ucHVzaChfdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgZSA9IHt9O1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgVi5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIGVbVltfaTJdLmlkKCldID0gMDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChTLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIF93MiA9IFMucG9wKCk7XG4gICAgICAgIGZvciAodmFyIF9qMiA9IDA7IF9qMiA8IFBbX3cyXS5sZW5ndGg7IF9qMisrKSB7XG4gICAgICAgICAgdmFyIF92MiA9IFBbX3cyXVtfajJdO1xuICAgICAgICAgIGVbX3YyXSA9IGVbX3YyXSArIGdbX3YyXSAvIGdbX3cyXSAqICgxICsgZVtfdzJdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX3cyICE9IFZbc10uaWQoKSkge1xuICAgICAgICAgIEMuc2V0KF93MiwgQy5nZXQoX3cyKSArIGVbX3cyXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGZvciAodmFyIHMgPSAwOyBzIDwgVi5sZW5ndGg7IHMrKykge1xuICAgICAgX2xvb3Aocyk7XG4gICAgfVxuICAgIHZhciByZXQgPSB7XG4gICAgICBiZXR3ZWVubmVzczogZnVuY3Rpb24gYmV0d2Vlbm5lc3Mobm9kZSkge1xuICAgICAgICB2YXIgaWQgPSBjeS5jb2xsZWN0aW9uKG5vZGUpLmlkKCk7XG4gICAgICAgIHJldHVybiBDLmdldChpZCk7XG4gICAgICB9LFxuICAgICAgYmV0d2Vlbm5lc3NOb3JtYWxpemVkOiBmdW5jdGlvbiBiZXR3ZWVubmVzc05vcm1hbGl6ZWQobm9kZSkge1xuICAgICAgICBpZiAobWF4ID09IDApIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaWQgPSBjeS5jb2xsZWN0aW9uKG5vZGUpLmlkKCk7XG4gICAgICAgIHJldHVybiBDLmdldChpZCkgLyBtYXg7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIGFsaWFzXG4gICAgcmV0LmJldHdlZW5uZXNzTm9ybWFsaXNlZCA9IHJldC5iZXR3ZWVubmVzc05vcm1hbGl6ZWQ7XG4gICAgcmV0dXJuIHJldDtcbiAgfSAvLyBiZXR3ZWVubmVzc0NlbnRyYWxpdHlcbn07IC8vIGVsZXNmblxuXG4vLyBuaWNlLCBzaG9ydCBtYXRoZW1hdGljYWwgYWxpYXNcbmVsZXNmbiRsLmJjID0gZWxlc2ZuJGwuYmV0d2Vlbm5lc3NDZW50cmFsaXR5O1xuXG4vLyBJbXBsZW1lbnRlZCBieSBab2UgWGkgQHpvZXhpIGZvciBHU09DIDIwMTZcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBkZWZhdWx0cyRjID0gZGVmYXVsdHMkZyh7XG4gIGV4cGFuZEZhY3RvcjogMixcbiAgLy8gYWZmZWN0cyB0aW1lIG9mIGNvbXB1dGF0aW9uIGFuZCBjbHVzdGVyIGdyYW51bGFyaXR5IHRvIHNvbWUgZXh0ZW50OiBNICogTVxuICBpbmZsYXRlRmFjdG9yOiAyLFxuICAvLyBhZmZlY3RzIGNsdXN0ZXIgZ3JhbnVsYXJpdHkgKHRoZSBncmVhdGVyIHRoZSB2YWx1ZSwgdGhlIG1vcmUgY2x1c3RlcnMpOiBNKGksaikgLyBFKGopXG4gIG11bHRGYWN0b3I6IDEsXG4gIC8vIG9wdGlvbmFsIHNlbGYgbG9vcHMgZm9yIGVhY2ggbm9kZS4gVXNlIGEgbmV1dHJhbCB2YWx1ZSB0byBpbXByb3ZlIGNsdXN0ZXIgY29tcHV0YXRpb25zLlxuICBtYXhJdGVyYXRpb25zOiAyMCxcbiAgLy8gbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBvZiB0aGUgTUNMIGFsZ29yaXRobSBpbiBhIHNpbmdsZSBydW5cbiAgYXR0cmlidXRlczogW1xuICAvLyBhdHRyaWJ1dGVzL2ZlYXR1cmVzIHVzZWQgdG8gZ3JvdXAgbm9kZXMsIGllLiBzaW1pbGFyaXR5IHZhbHVlcyBiZXR3ZWVuIG5vZGVzXG4gIGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1dXG59KTtcbi8qIGVzbGludC1lbmFibGUgKi9cblxudmFyIHNldE9wdGlvbnMkMyA9IGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuICByZXR1cm4gZGVmYXVsdHMkYyhvcHRpb25zKTtcbn07XG4vKiBlc2xpbnQtZW5hYmxlICovXG5cbnZhciBnZXRTaW1pbGFyaXR5JDEgPSBmdW5jdGlvbiBnZXRTaW1pbGFyaXR5KGVkZ2UsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIHRvdGFsID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdG90YWwgKz0gYXR0cmlidXRlc1tpXShlZGdlKTtcbiAgfVxuICByZXR1cm4gdG90YWw7XG59O1xudmFyIGFkZExvb3BzID0gZnVuY3Rpb24gYWRkTG9vcHMoTSwgbiwgdmFsKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgTVtpICogbiArIGldID0gdmFsO1xuICB9XG59O1xudmFyIG5vcm1hbGl6ZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZShNLCBuKSB7XG4gIHZhciBzdW07XG4gIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG47IGNvbCsrKSB7XG4gICAgc3VtID0gMDtcbiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBuOyByb3crKykge1xuICAgICAgc3VtICs9IE1bcm93ICogbiArIGNvbF07XG4gICAgfVxuICAgIGZvciAodmFyIF9yb3cgPSAwOyBfcm93IDwgbjsgX3JvdysrKSB7XG4gICAgICBNW19yb3cgKiBuICsgY29sXSA9IE1bX3JvdyAqIG4gKyBjb2xdIC8gc3VtO1xuICAgIH1cbiAgfVxufTtcblxuLy8gVE9ETzogYmxvY2tlZCBtYXRyaXggbXVsdGlwbGljYXRpb24/XG52YXIgbW11bHQgPSBmdW5jdGlvbiBtbXVsdChBLCBCLCBuKSB7XG4gIHZhciBDID0gbmV3IEFycmF5KG4gKiBuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgQ1tpICogbiArIGpdID0gMDtcbiAgICB9XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBuOyBrKyspIHtcbiAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBuOyBfaisrKSB7XG4gICAgICAgIENbaSAqIG4gKyBfal0gKz0gQVtpICogbiArIGtdICogQltrICogbiArIF9qXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIEM7XG59O1xudmFyIGV4cGFuZCA9IGZ1bmN0aW9uIGV4cGFuZChNLCBuLCBleHBhbmRGYWN0b3IgLyoqIHBvd2VyICoqLykge1xuICB2YXIgX00gPSBNLnNsaWNlKDApO1xuICBmb3IgKHZhciBwID0gMTsgcCA8IGV4cGFuZEZhY3RvcjsgcCsrKSB7XG4gICAgTSA9IG1tdWx0KE0sIF9NLCBuKTtcbiAgfVxuICByZXR1cm4gTTtcbn07XG52YXIgaW5mbGF0ZSA9IGZ1bmN0aW9uIGluZmxhdGUoTSwgbiwgaW5mbGF0ZUZhY3RvciAvKiogciAqKi8pIHtcbiAgdmFyIF9NID0gbmV3IEFycmF5KG4gKiBuKTtcblxuICAvLyBNKGksaikgXiBpbmZsYXRlUG93ZXJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuICogbjsgaSsrKSB7XG4gICAgX01baV0gPSBNYXRoLnBvdyhNW2ldLCBpbmZsYXRlRmFjdG9yKTtcbiAgfVxuICBub3JtYWxpemUoX00sIG4pO1xuICByZXR1cm4gX007XG59O1xudmFyIGhhc0NvbnZlcmdlZCA9IGZ1bmN0aW9uIGhhc0NvbnZlcmdlZChNLCBfTSwgbjIsIHJvdW5kRmFjdG9yKSB7XG4gIC8vIENoZWNrIHRoYXQgYm90aCBtYXRyaWNlcyBoYXZlIHRoZSBzYW1lIGVsZW1lbnRzIChpLGopXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjI7IGkrKykge1xuICAgIHZhciB2MSA9IE1hdGgucm91bmQoTVtpXSAqIE1hdGgucG93KDEwLCByb3VuZEZhY3RvcikpIC8gTWF0aC5wb3coMTAsIHJvdW5kRmFjdG9yKTsgLy8gdHJ1bmNhdGUgdG8gJ3JvdW5kRmFjdG9yJyBkZWNpbWFsIHBsYWNlc1xuICAgIHZhciB2MiA9IE1hdGgucm91bmQoX01baV0gKiBNYXRoLnBvdygxMCwgcm91bmRGYWN0b3IpKSAvIE1hdGgucG93KDEwLCByb3VuZEZhY3Rvcik7XG4gICAgaWYgKHYxICE9PSB2Mikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgYXNzaWduJDIgPSBmdW5jdGlvbiBhc3NpZ24oTSwgbiwgbm9kZXMsIGN5KSB7XG4gIHZhciBjbHVzdGVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIHZhciBjbHVzdGVyID0gW107XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHtcbiAgICAgIC8vIFJvdy13aXNlIGF0dHJhY3RvcnMgYW5kIGVsZW1lbnRzIHRoYXQgdGhleSBhdHRyYWN0IGJlbG9uZyBpbiBzYW1lIGNsdXN0ZXJcbiAgICAgIGlmIChNYXRoLnJvdW5kKE1baSAqIG4gKyBqXSAqIDEwMDApIC8gMTAwMCA+IDApIHtcbiAgICAgICAgY2x1c3Rlci5wdXNoKG5vZGVzW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNsdXN0ZXIubGVuZ3RoICE9PSAwKSB7XG4gICAgICBjbHVzdGVycy5wdXNoKGN5LmNvbGxlY3Rpb24oY2x1c3RlcikpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIGlzRHVwbGljYXRlID0gZnVuY3Rpb24gaXNEdXBsaWNhdGUoYzEsIGMyKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYzEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWMyW2ldIHx8IGMxW2ldLmlkKCkgIT09IGMyW2ldLmlkKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIHJlbW92ZUR1cGxpY2F0ZXMgPSBmdW5jdGlvbiByZW1vdmVEdXBsaWNhdGVzKGNsdXN0ZXJzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNsdXN0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoaSAhPSBqICYmIGlzRHVwbGljYXRlKGNsdXN0ZXJzW2ldLCBjbHVzdGVyc1tqXSkpIHtcbiAgICAgICAgY2x1c3RlcnMuc3BsaWNlKGosIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIG1hcmtvdkNsdXN0ZXJpbmcgPSBmdW5jdGlvbiBtYXJrb3ZDbHVzdGVyaW5nKG9wdGlvbnMpIHtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgZWRnZXMgPSB0aGlzLmVkZ2VzKCk7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICAvLyBTZXQgcGFyYW1ldGVycyBvZiBhbGdvcml0aG06XG4gIHZhciBvcHRzID0gc2V0T3B0aW9ucyQzKG9wdGlvbnMpO1xuXG4gIC8vIE1hcCBlYWNoIG5vZGUgdG8gaXRzIHBvc2l0aW9uIGluIG5vZGUgYXJyYXlcbiAgdmFyIGlkMnBvc2l0aW9uID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZDJwb3NpdGlvbltub2Rlc1tpXS5pZCgpXSA9IGk7XG4gIH1cblxuICAvLyBHZW5lcmF0ZSBzdG9jaGFzdGljIG1hdHJpeCBNIGZyb20gaW5wdXQgZ3JhcGggRyAoc2hvdWxkIGJlIHN5bW1ldHJpYy91bmRpcmVjdGVkKVxuICB2YXIgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICBuMiA9IG4gKiBuO1xuICB2YXIgTSA9IG5ldyBBcnJheShuMiksXG4gICAgX007XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBuMjsgX2krKykge1xuICAgIE1bX2ldID0gMDtcbiAgfVxuICBmb3IgKHZhciBlID0gMDsgZSA8IGVkZ2VzLmxlbmd0aDsgZSsrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tlXTtcbiAgICB2YXIgX2kyID0gaWQycG9zaXRpb25bZWRnZS5zb3VyY2UoKS5pZCgpXTtcbiAgICB2YXIgaiA9IGlkMnBvc2l0aW9uW2VkZ2UudGFyZ2V0KCkuaWQoKV07XG4gICAgdmFyIHNpbSA9IGdldFNpbWlsYXJpdHkkMShlZGdlLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgIE1bX2kyICogbiArIGpdICs9IHNpbTsgLy8gRyBzaG91bGQgYmUgc3ltbWV0cmljIGFuZCB1bmRpcmVjdGVkXG4gICAgTVtqICogbiArIF9pMl0gKz0gc2ltO1xuICB9XG5cbiAgLy8gQmVnaW4gTWFya292IGNsdXN0ZXIgYWxnb3JpdGhtXG5cbiAgLy8gU3RlcCAxOiBBZGQgc2VsZiBsb29wcyB0byBlYWNoIG5vZGUsIGllLiBhZGQgbXVsdEZhY3RvciB0byBtYXRyaXggZGlhZ29uYWxcbiAgYWRkTG9vcHMoTSwgbiwgb3B0cy5tdWx0RmFjdG9yKTtcblxuICAvLyBTdGVwIDI6IE0gPSBub3JtYWxpemUoIE0gKTtcbiAgbm9ybWFsaXplKE0sIG4pO1xuICB2YXIgaXNTdGlsbE1vdmluZyA9IHRydWU7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgd2hpbGUgKGlzU3RpbGxNb3ZpbmcgJiYgaXRlcmF0aW9ucyA8IG9wdHMubWF4SXRlcmF0aW9ucykge1xuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTtcblxuICAgIC8vIFN0ZXAgMzpcbiAgICBfTSA9IGV4cGFuZChNLCBuLCBvcHRzLmV4cGFuZEZhY3Rvcik7XG5cbiAgICAvLyBTdGVwIDQ6XG4gICAgTSA9IGluZmxhdGUoX00sIG4sIG9wdHMuaW5mbGF0ZUZhY3Rvcik7XG5cbiAgICAvLyBTdGVwIDU6IGNoZWNrIHRvIHNlZSBpZiB+c3RlYWR5IHN0YXRlIGhhcyBiZWVuIHJlYWNoZWRcbiAgICBpZiAoIWhhc0NvbnZlcmdlZChNLCBfTSwgbjIsIDQpKSB7XG4gICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgaXRlcmF0aW9ucysrO1xuICB9XG5cbiAgLy8gQnVpbGQgY2x1c3RlcnMgZnJvbSBtYXRyaXhcbiAgdmFyIGNsdXN0ZXJzID0gYXNzaWduJDIoTSwgbiwgbm9kZXMsIGN5KTtcblxuICAvLyBSZW1vdmUgZHVwbGljYXRlIGNsdXN0ZXJzIGR1ZSB0byBzeW1tZXRyeSBvZiBncmFwaCBhbmQgTSBtYXRyaXhcbiAgY2x1c3RlcnMgPSByZW1vdmVEdXBsaWNhdGVzKGNsdXN0ZXJzKTtcbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciBtYXJrb3ZDbHVzdGVyaW5nJDEgPSB7XG4gIG1hcmtvdkNsdXN0ZXJpbmc6IG1hcmtvdkNsdXN0ZXJpbmcsXG4gIG1jbDogbWFya292Q2x1c3RlcmluZ1xufTtcblxuLy8gQ29tbW9uIGRpc3RhbmNlIG1ldHJpY3MgZm9yIGNsdXN0ZXJpbmcgYWxnb3JpdGhtc1xudmFyIGlkZW50aXR5ID0gZnVuY3Rpb24gaWRlbnRpdHkoeCkge1xuICByZXR1cm4geDtcbn07XG52YXIgYWJzRGlmZiA9IGZ1bmN0aW9uIGFic0RpZmYocCwgcSkge1xuICByZXR1cm4gTWF0aC5hYnMocSAtIHApO1xufTtcbnZhciBhZGRBYnNEaWZmID0gZnVuY3Rpb24gYWRkQWJzRGlmZih0b3RhbCwgcCwgcSkge1xuICByZXR1cm4gdG90YWwgKyBhYnNEaWZmKHAsIHEpO1xufTtcbnZhciBhZGRTcXVhcmVkRGlmZiA9IGZ1bmN0aW9uIGFkZFNxdWFyZWREaWZmKHRvdGFsLCBwLCBxKSB7XG4gIHJldHVybiB0b3RhbCArIE1hdGgucG93KHEgLSBwLCAyKTtcbn07XG52YXIgc3FydCA9IGZ1bmN0aW9uIHNxcnQoeCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHgpO1xufTtcbnZhciBtYXhBYnNEaWZmID0gZnVuY3Rpb24gbWF4QWJzRGlmZihjdXJyZW50TWF4LCBwLCBxKSB7XG4gIHJldHVybiBNYXRoLm1heChjdXJyZW50TWF4LCBhYnNEaWZmKHAsIHEpKTtcbn07XG52YXIgZ2V0RGlzdGFuY2UgPSBmdW5jdGlvbiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIGluaXQsIHZpc2l0KSB7XG4gIHZhciBwb3N0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiBpZGVudGl0eTtcbiAgdmFyIHJldCA9IGluaXQ7XG4gIHZhciBwLCBxO1xuICBmb3IgKHZhciBkaW0gPSAwOyBkaW0gPCBsZW5ndGg7IGRpbSsrKSB7XG4gICAgcCA9IGdldFAoZGltKTtcbiAgICBxID0gZ2V0UShkaW0pO1xuICAgIHJldCA9IHZpc2l0KHJldCwgcCwgcSk7XG4gIH1cbiAgcmV0dXJuIHBvc3QocmV0KTtcbn07XG52YXIgZGlzdGFuY2VzID0ge1xuICBldWNsaWRlYW46IGZ1bmN0aW9uIGV1Y2xpZGVhbihsZW5ndGgsIGdldFAsIGdldFEpIHtcbiAgICBpZiAobGVuZ3RoID49IDIpIHtcbiAgICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIDAsIGFkZFNxdWFyZWREaWZmLCBzcXJ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZm9yIHNpbmdsZSBhdHRyIGNhc2UsIG1vcmUgZWZmaWNpZW50IHRvIGF2b2lkIHNxcnRcbiAgICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIDAsIGFkZEFic0RpZmYpO1xuICAgIH1cbiAgfSxcbiAgc3F1YXJlZEV1Y2xpZGVhbjogZnVuY3Rpb24gc3F1YXJlZEV1Y2xpZGVhbihsZW5ndGgsIGdldFAsIGdldFEpIHtcbiAgICByZXR1cm4gZ2V0RGlzdGFuY2UobGVuZ3RoLCBnZXRQLCBnZXRRLCAwLCBhZGRTcXVhcmVkRGlmZik7XG4gIH0sXG4gIG1hbmhhdHRhbjogZnVuY3Rpb24gbWFuaGF0dGFuKGxlbmd0aCwgZ2V0UCwgZ2V0USkge1xuICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIDAsIGFkZEFic0RpZmYpO1xuICB9LFxuICBtYXg6IGZ1bmN0aW9uIG1heChsZW5ndGgsIGdldFAsIGdldFEpIHtcbiAgICByZXR1cm4gZ2V0RGlzdGFuY2UobGVuZ3RoLCBnZXRQLCBnZXRRLCAtSW5maW5pdHksIG1heEFic0RpZmYpO1xuICB9XG59O1xuXG4vLyBpbiBjYXNlIHRoZSB1c2VyIGFjY2lkZW50YWxseSBkb2Vzbid0IHVzZSBjYW1lbCBjYXNlXG5kaXN0YW5jZXNbJ3NxdWFyZWQtZXVjbGlkZWFuJ10gPSBkaXN0YW5jZXNbJ3NxdWFyZWRFdWNsaWRlYW4nXTtcbmRpc3RhbmNlc1snc3F1YXJlZGV1Y2xpZGVhbiddID0gZGlzdGFuY2VzWydzcXVhcmVkRXVjbGlkZWFuJ107XG5mdW5jdGlvbiBjbHVzdGVyaW5nRGlzdGFuY2UgKG1ldGhvZCwgbGVuZ3RoLCBnZXRQLCBnZXRRLCBub2RlUCwgbm9kZVEpIHtcbiAgdmFyIGltcGw7XG4gIGlmIChmbiQ2KG1ldGhvZCkpIHtcbiAgICBpbXBsID0gbWV0aG9kO1xuICB9IGVsc2Uge1xuICAgIGltcGwgPSBkaXN0YW5jZXNbbWV0aG9kXSB8fCBkaXN0YW5jZXMuZXVjbGlkZWFuO1xuICB9XG4gIGlmIChsZW5ndGggPT09IDAgJiYgZm4kNihtZXRob2QpKSB7XG4gICAgcmV0dXJuIGltcGwobm9kZVAsIG5vZGVRKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW1wbChsZW5ndGgsIGdldFAsIGdldFEsIG5vZGVQLCBub2RlUSk7XG4gIH1cbn1cblxudmFyIGRlZmF1bHRzJGIgPSBkZWZhdWx0cyRnKHtcbiAgazogMixcbiAgbTogMixcbiAgc2Vuc2l0aXZpdHlUaHJlc2hvbGQ6IDAuMDAwMSxcbiAgZGlzdGFuY2U6ICdldWNsaWRlYW4nLFxuICBtYXhJdGVyYXRpb25zOiAxMCxcbiAgYXR0cmlidXRlczogW10sXG4gIHRlc3RNb2RlOiBmYWxzZSxcbiAgdGVzdENlbnRyb2lkczogbnVsbFxufSk7XG52YXIgc2V0T3B0aW9ucyQyID0gZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIHJldHVybiBkZWZhdWx0cyRiKG9wdGlvbnMpO1xufTtcblxudmFyIGdldERpc3QgPSBmdW5jdGlvbiBnZXREaXN0KHR5cGUsIG5vZGUsIGNlbnRyb2lkLCBhdHRyaWJ1dGVzLCBtb2RlKSB7XG4gIHZhciBub05vZGVQID0gbW9kZSAhPT0gJ2tNZWRvaWRzJztcbiAgdmFyIGdldFAgPSBub05vZGVQID8gZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gY2VudHJvaWRbaV07XG4gIH0gOiBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBhdHRyaWJ1dGVzW2ldKGNlbnRyb2lkKTtcbiAgfTtcbiAgdmFyIGdldFEgPSBmdW5jdGlvbiBnZXRRKGkpIHtcbiAgICByZXR1cm4gYXR0cmlidXRlc1tpXShub2RlKTtcbiAgfTtcbiAgdmFyIG5vZGVQID0gY2VudHJvaWQ7XG4gIHZhciBub2RlUSA9IG5vZGU7XG4gIHJldHVybiBjbHVzdGVyaW5nRGlzdGFuY2UodHlwZSwgYXR0cmlidXRlcy5sZW5ndGgsIGdldFAsIGdldFEsIG5vZGVQLCBub2RlUSk7XG59O1xudmFyIHJhbmRvbUNlbnRyb2lkcyA9IGZ1bmN0aW9uIHJhbmRvbUNlbnRyb2lkcyhub2RlcywgaywgYXR0cmlidXRlcykge1xuICB2YXIgbmRpbSA9IGF0dHJpYnV0ZXMubGVuZ3RoO1xuICB2YXIgbWluID0gbmV3IEFycmF5KG5kaW0pO1xuICB2YXIgbWF4ID0gbmV3IEFycmF5KG5kaW0pO1xuICB2YXIgY2VudHJvaWRzID0gbmV3IEFycmF5KGspO1xuICB2YXIgY2VudHJvaWQgPSBudWxsO1xuXG4gIC8vIEZpbmQgbWluLCBtYXggdmFsdWVzIGZvciBlYWNoIGF0dHJpYnV0ZSBkaW1lbnNpb25cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZGltOyBpKyspIHtcbiAgICBtaW5baV0gPSBub2Rlcy5taW4oYXR0cmlidXRlc1tpXSkudmFsdWU7XG4gICAgbWF4W2ldID0gbm9kZXMubWF4KGF0dHJpYnV0ZXNbaV0pLnZhbHVlO1xuICB9XG5cbiAgLy8gQnVpbGQgayBjZW50cm9pZHMsIGVhY2ggcmVwcmVzZW50ZWQgYXMgYW4gbi1kaW0gZmVhdHVyZSB2ZWN0b3JcbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBrOyBjKyspIHtcbiAgICBjZW50cm9pZCA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBuZGltOyBfaSsrKSB7XG4gICAgICBjZW50cm9pZFtfaV0gPSBNYXRoLnJhbmRvbSgpICogKG1heFtfaV0gLSBtaW5bX2ldKSArIG1pbltfaV07IC8vIHJhbmRvbSBpbml0aWFsIHZhbHVlXG4gICAgfVxuXG4gICAgY2VudHJvaWRzW2NdID0gY2VudHJvaWQ7XG4gIH1cbiAgcmV0dXJuIGNlbnRyb2lkcztcbn07XG52YXIgY2xhc3NpZnkgPSBmdW5jdGlvbiBjbGFzc2lmeShub2RlLCBjZW50cm9pZHMsIGRpc3RhbmNlLCBhdHRyaWJ1dGVzLCB0eXBlKSB7XG4gIHZhciBtaW4gPSBJbmZpbml0eTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjZW50cm9pZHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGlzdCA9IGdldERpc3QoZGlzdGFuY2UsIG5vZGUsIGNlbnRyb2lkc1tpXSwgYXR0cmlidXRlcywgdHlwZSk7XG4gICAgaWYgKGRpc3QgPCBtaW4pIHtcbiAgICAgIG1pbiA9IGRpc3Q7XG4gICAgICBpbmRleCA9IGk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmRleDtcbn07XG52YXIgYnVpbGRDbHVzdGVyID0gZnVuY3Rpb24gYnVpbGRDbHVzdGVyKGNlbnRyb2lkLCBub2RlcywgYXNzaWdubWVudCkge1xuICB2YXIgY2x1c3RlciA9IFtdO1xuICB2YXIgbm9kZSA9IG51bGw7XG4gIGZvciAodmFyIG4gPSAwOyBuIDwgbm9kZXMubGVuZ3RoOyBuKyspIHtcbiAgICBub2RlID0gbm9kZXNbbl07XG4gICAgaWYgKGFzc2lnbm1lbnRbbm9kZS5pZCgpXSA9PT0gY2VudHJvaWQpIHtcbiAgICAgIC8vY29uc29sZS5sb2coXCJOb2RlIFwiICsgbm9kZS5pZCgpICsgXCIgaXMgYXNzb2NpYXRlZCB3aXRoIG1lZG9pZCAjOiBcIiArIG0pO1xuICAgICAgY2x1c3Rlci5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2x1c3Rlcjtcbn07XG52YXIgaGF2ZVZhbHVlc0NvbnZlcmdlZCA9IGZ1bmN0aW9uIGhhdmVWYWx1ZXNDb252ZXJnZWQodjEsIHYyLCBzZW5zaXRpdml0eVRocmVzaG9sZCkge1xuICByZXR1cm4gTWF0aC5hYnModjIgLSB2MSkgPD0gc2Vuc2l0aXZpdHlUaHJlc2hvbGQ7XG59O1xudmFyIGhhdmVNYXRyaWNlc0NvbnZlcmdlZCA9IGZ1bmN0aW9uIGhhdmVNYXRyaWNlc0NvbnZlcmdlZCh2MSwgdjIsIHNlbnNpdGl2aXR5VGhyZXNob2xkKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdjEubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHYxW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgZGlmZiA9IE1hdGguYWJzKHYxW2ldW2pdIC0gdjJbaV1bal0pO1xuICAgICAgaWYgKGRpZmYgPiBzZW5zaXRpdml0eVRocmVzaG9sZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBzZWVuQmVmb3JlID0gZnVuY3Rpb24gc2VlbkJlZm9yZShub2RlLCBtZWRvaWRzLCBuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgaWYgKG5vZGUgPT09IG1lZG9pZHNbaV0pIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG52YXIgcmFuZG9tTWVkb2lkcyA9IGZ1bmN0aW9uIHJhbmRvbU1lZG9pZHMobm9kZXMsIGspIHtcbiAgdmFyIG1lZG9pZHMgPSBuZXcgQXJyYXkoayk7XG5cbiAgLy8gRm9yIHNtYWxsIGRhdGEgc2V0cywgdGhlIHByb2JhYmlsaXR5IG9mIG1lZG9pZCBjb25mbGljdCBpcyBncmVhdGVyLFxuICAvLyBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gb3IgY2hvc2UgdGhpcyBub2RlIGJlZm9yZS5cbiAgaWYgKG5vZGVzLmxlbmd0aCA8IDUwKSB7XG4gICAgLy8gUmFuZG9tbHkgc2VsZWN0IGsgbWVkb2lkcyBmcm9tIHRoZSBuIG5vZGVzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbm9kZXMubGVuZ3RoKV07XG5cbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgY2hvc2VuIHRoaXMgbm9kZSB0byBiZSBhIG1lZG9pZCwgZG9uJ3QgY2hvb3NlIGl0IGFnYWluIChmb3Igc21hbGwgZGF0YSBzZXRzKS5cbiAgICAgIC8vIEluc3RlYWQgY2hvb3NlIGEgZGlmZmVyZW50IHJhbmRvbSBub2RlLlxuICAgICAgd2hpbGUgKHNlZW5CZWZvcmUobm9kZSwgbWVkb2lkcywgaSkpIHtcbiAgICAgICAgbm9kZSA9IG5vZGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vZGVzLmxlbmd0aCldO1xuICAgICAgfVxuICAgICAgbWVkb2lkc1tpXSA9IG5vZGU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFJlbGF0aXZlbHkgbGFyZ2UgZGF0YSBzZXQsIHNvIHByZXR0eSBzYWZlIHRvIG5vdCBjaGVjayBhbmQganVzdCBzZWxlY3QgcmFuZG9tIG5vZGVzXG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgazsgX2kyKyspIHtcbiAgICAgIG1lZG9pZHNbX2kyXSA9IG5vZGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vZGVzLmxlbmd0aCldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWVkb2lkcztcbn07XG52YXIgZmluZENvc3QgPSBmdW5jdGlvbiBmaW5kQ29zdChwb3RlbnRpYWxOZXdNZWRvaWQsIGNsdXN0ZXIsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIGNvc3QgPSAwO1xuICBmb3IgKHZhciBuID0gMDsgbiA8IGNsdXN0ZXIubGVuZ3RoOyBuKyspIHtcbiAgICBjb3N0ICs9IGdldERpc3QoJ21hbmhhdHRhbicsIGNsdXN0ZXJbbl0sIHBvdGVudGlhbE5ld01lZG9pZCwgYXR0cmlidXRlcywgJ2tNZWRvaWRzJyk7XG4gIH1cbiAgcmV0dXJuIGNvc3Q7XG59O1xudmFyIGtNZWFucyA9IGZ1bmN0aW9uIGtNZWFucyhvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgbm9kZSA9IG51bGw7XG5cbiAgLy8gU2V0IHBhcmFtZXRlcnMgb2YgYWxnb3JpdGhtOiAjIG9mIGNsdXN0ZXJzLCBkaXN0YW5jZSBtZXRyaWMsIGV0Yy5cbiAgdmFyIG9wdHMgPSBzZXRPcHRpb25zJDIob3B0aW9ucyk7XG5cbiAgLy8gQmVnaW4gay1tZWFucyBhbGdvcml0aG1cbiAgdmFyIGNsdXN0ZXJzID0gbmV3IEFycmF5KG9wdHMuayk7XG4gIHZhciBhc3NpZ25tZW50ID0ge307XG4gIHZhciBjZW50cm9pZHM7XG5cbiAgLy8gU3RlcCAxOiBJbml0aWFsaXplIGNlbnRyb2lkIHBvc2l0aW9uc1xuICBpZiAob3B0cy50ZXN0TW9kZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0cy50ZXN0Q2VudHJvaWRzID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVE9ETzogaW1wbGVtZW50IGEgc2VlZGVkIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLlxuICAgICAgb3B0cy50ZXN0Q2VudHJvaWRzO1xuICAgICAgY2VudHJvaWRzID0gcmFuZG9tQ2VudHJvaWRzKG5vZGVzLCBvcHRzLmssIG9wdHMuYXR0cmlidXRlcyk7XG4gICAgfSBlbHNlIGlmIChfdHlwZW9mKG9wdHMudGVzdENlbnRyb2lkcykgPT09ICdvYmplY3QnKSB7XG4gICAgICBjZW50cm9pZHMgPSBvcHRzLnRlc3RDZW50cm9pZHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNlbnRyb2lkcyA9IHJhbmRvbUNlbnRyb2lkcyhub2Rlcywgb3B0cy5rLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjZW50cm9pZHMgPSByYW5kb21DZW50cm9pZHMobm9kZXMsIG9wdHMuaywgb3B0cy5hdHRyaWJ1dGVzKTtcbiAgfVxuICB2YXIgaXNTdGlsbE1vdmluZyA9IHRydWU7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgd2hpbGUgKGlzU3RpbGxNb3ZpbmcgJiYgaXRlcmF0aW9ucyA8IG9wdHMubWF4SXRlcmF0aW9ucykge1xuICAgIC8vIFN0ZXAgMjogQXNzaWduIG5vZGVzIHRvIHRoZSBuZWFyZXN0IGNlbnRyb2lkXG4gICAgZm9yICh2YXIgbiA9IDA7IG4gPCBub2Rlcy5sZW5ndGg7IG4rKykge1xuICAgICAgbm9kZSA9IG5vZGVzW25dO1xuICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGNsdXN0ZXIgdGhpcyBub2RlIGJlbG9uZ3MgdG86IG5vZGUgaWQgPT4gY2x1c3RlciAjXG4gICAgICBhc3NpZ25tZW50W25vZGUuaWQoKV0gPSBjbGFzc2lmeShub2RlLCBjZW50cm9pZHMsIG9wdHMuZGlzdGFuY2UsIG9wdHMuYXR0cmlidXRlcywgJ2tNZWFucycpO1xuICAgIH1cblxuICAgIC8vIFN0ZXAgMzogRm9yIGVhY2ggb2YgdGhlIGsgY2x1c3RlcnMsIHVwZGF0ZSBpdHMgY2VudHJvaWRcbiAgICBpc1N0aWxsTW92aW5nID0gZmFsc2U7XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBvcHRzLms7IGMrKykge1xuICAgICAgLy8gR2V0IGFsbCBub2RlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGNsdXN0ZXJcbiAgICAgIHZhciBjbHVzdGVyID0gYnVpbGRDbHVzdGVyKGMsIG5vZGVzLCBhc3NpZ25tZW50KTtcbiAgICAgIGlmIChjbHVzdGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBJZiBjbHVzdGVyIGlzIGVtcHR5LCBicmVhayBvdXQgZWFybHkgJiBtb3ZlIHRvIG5leHQgY2x1c3RlclxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGNlbnRyb2lkcyBieSBjYWxjdWxhdGluZyBhdmcgb2YgYWxsIG5vZGVzIHdpdGhpbiB0aGUgY2x1c3Rlci5cbiAgICAgIHZhciBuZGltID0gb3B0cy5hdHRyaWJ1dGVzLmxlbmd0aDtcbiAgICAgIHZhciBjZW50cm9pZCA9IGNlbnRyb2lkc1tjXTsgLy8gWyBkaW1fMSwgZGltXzIsIGRpbV8zLCAuLi4gLCBkaW1fbiBdXG4gICAgICB2YXIgbmV3Q2VudHJvaWQgPSBuZXcgQXJyYXkobmRpbSk7XG4gICAgICB2YXIgc3VtID0gbmV3IEFycmF5KG5kaW0pO1xuICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBuZGltOyBkKyspIHtcbiAgICAgICAgc3VtW2RdID0gMC4wO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsdXN0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBub2RlID0gY2x1c3RlcltpXTtcbiAgICAgICAgICBzdW1bZF0gKz0gb3B0cy5hdHRyaWJ1dGVzW2RdKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIG5ld0NlbnRyb2lkW2RdID0gc3VtW2RdIC8gY2x1c3Rlci5sZW5ndGg7XG5cbiAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGFsZ29yaXRobSBoYXMgY29udmVyZ2VkLCBpLmUuIHdoZW4gY2VudHJvaWRzIG5vIGxvbmdlciBjaGFuZ2VcbiAgICAgICAgaWYgKCFoYXZlVmFsdWVzQ29udmVyZ2VkKG5ld0NlbnRyb2lkW2RdLCBjZW50cm9pZFtkXSwgb3B0cy5zZW5zaXRpdml0eVRocmVzaG9sZCkpIHtcbiAgICAgICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2VudHJvaWRzW2NdID0gbmV3Q2VudHJvaWQ7XG4gICAgICBjbHVzdGVyc1tjXSA9IGN5LmNvbGxlY3Rpb24oY2x1c3Rlcik7XG4gICAgfVxuICAgIGl0ZXJhdGlvbnMrKztcbiAgfVxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIGtNZWRvaWRzID0gZnVuY3Rpb24ga01lZG9pZHMob3B0aW9ucykge1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgdmFyIG5vZGUgPSBudWxsO1xuICB2YXIgb3B0cyA9IHNldE9wdGlvbnMkMihvcHRpb25zKTtcblxuICAvLyBCZWdpbiBrLW1lZG9pZHMgYWxnb3JpdGhtXG4gIHZhciBjbHVzdGVycyA9IG5ldyBBcnJheShvcHRzLmspO1xuICB2YXIgbWVkb2lkcztcbiAgdmFyIGFzc2lnbm1lbnQgPSB7fTtcbiAgdmFyIGN1ckNvc3Q7XG4gIHZhciBtaW5Db3N0cyA9IG5ldyBBcnJheShvcHRzLmspOyAvLyBtaW5pbXVtIGNvc3QgY29uZmlndXJhdGlvbiBmb3IgZWFjaCBjbHVzdGVyXG5cbiAgLy8gU3RlcCAxOiBJbml0aWFsaXplIGsgbWVkb2lkc1xuICBpZiAob3B0cy50ZXN0TW9kZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0cy50ZXN0Q2VudHJvaWRzID09PSAnbnVtYmVyJykgOyBlbHNlIGlmIChfdHlwZW9mKG9wdHMudGVzdENlbnRyb2lkcykgPT09ICdvYmplY3QnKSB7XG4gICAgICBtZWRvaWRzID0gb3B0cy50ZXN0Q2VudHJvaWRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZWRvaWRzID0gcmFuZG9tTWVkb2lkcyhub2Rlcywgb3B0cy5rKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbWVkb2lkcyA9IHJhbmRvbU1lZG9pZHMobm9kZXMsIG9wdHMuayk7XG4gIH1cbiAgdmFyIGlzU3RpbGxNb3ZpbmcgPSB0cnVlO1xuICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gIHdoaWxlIChpc1N0aWxsTW92aW5nICYmIGl0ZXJhdGlvbnMgPCBvcHRzLm1heEl0ZXJhdGlvbnMpIHtcbiAgICAvLyBTdGVwIDI6IEFzc2lnbiBub2RlcyB0byB0aGUgbmVhcmVzdCBtZWRvaWRcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgICBub2RlID0gbm9kZXNbbl07XG4gICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggY2x1c3RlciB0aGlzIG5vZGUgYmVsb25ncyB0bzogbm9kZSBpZCA9PiBjbHVzdGVyICNcbiAgICAgIGFzc2lnbm1lbnRbbm9kZS5pZCgpXSA9IGNsYXNzaWZ5KG5vZGUsIG1lZG9pZHMsIG9wdHMuZGlzdGFuY2UsIG9wdHMuYXR0cmlidXRlcywgJ2tNZWRvaWRzJyk7XG4gICAgfVxuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTtcbiAgICAvLyBTdGVwIDM6IEZvciBlYWNoIG1lZG9pZCBtLCBhbmQgZm9yIGVhY2ggbm9kZSBhc3NvY2lhdGVkIHdpdGggbWVkaW9kIG0sXG4gICAgLy8gc2VsZWN0IHRoZSBub2RlIHdpdGggdGhlIGxvd2VzdCBjb25maWd1cmF0aW9uIGNvc3QgYXMgbmV3IG1lZG9pZC5cbiAgICBmb3IgKHZhciBtID0gMDsgbSA8IG1lZG9pZHMubGVuZ3RoOyBtKyspIHtcbiAgICAgIC8vIEdldCBhbGwgbm9kZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBtZWRvaWRcbiAgICAgIHZhciBjbHVzdGVyID0gYnVpbGRDbHVzdGVyKG0sIG5vZGVzLCBhc3NpZ25tZW50KTtcbiAgICAgIGlmIChjbHVzdGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBJZiBjbHVzdGVyIGlzIGVtcHR5LCBicmVhayBvdXQgZWFybHkgJiBtb3ZlIHRvIG5leHQgY2x1c3RlclxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG1pbkNvc3RzW21dID0gZmluZENvc3QobWVkb2lkc1ttXSwgY2x1c3Rlciwgb3B0cy5hdHRyaWJ1dGVzKTsgLy8gb3JpZ2luYWwgY29zdFxuXG4gICAgICAvLyBTZWxlY3QgZGlmZmVyZW50IG1lZG9pZCBpZiBpdHMgY29uZmlndXJhdGlvbiBoYXMgdGhlIGxvd2VzdCBjb3N0XG4gICAgICBmb3IgKHZhciBfbiA9IDA7IF9uIDwgY2x1c3Rlci5sZW5ndGg7IF9uKyspIHtcbiAgICAgICAgY3VyQ29zdCA9IGZpbmRDb3N0KGNsdXN0ZXJbX25dLCBjbHVzdGVyLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgICAgICBpZiAoY3VyQ29zdCA8IG1pbkNvc3RzW21dKSB7XG4gICAgICAgICAgbWluQ29zdHNbbV0gPSBjdXJDb3N0O1xuICAgICAgICAgIG1lZG9pZHNbbV0gPSBjbHVzdGVyW19uXTtcbiAgICAgICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2x1c3RlcnNbbV0gPSBjeS5jb2xsZWN0aW9uKGNsdXN0ZXIpO1xuICAgIH1cbiAgICBpdGVyYXRpb25zKys7XG4gIH1cbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciB1cGRhdGVDZW50cm9pZHMgPSBmdW5jdGlvbiB1cGRhdGVDZW50cm9pZHMoY2VudHJvaWRzLCBub2RlcywgVSwgd2VpZ2h0LCBvcHRzKSB7XG4gIHZhciBudW1lcmF0b3IsIGRlbm9taW5hdG9yO1xuICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjZW50cm9pZHMubGVuZ3RoOyBjKyspIHtcbiAgICAgIHdlaWdodFtuXVtjXSA9IE1hdGgucG93KFVbbl1bY10sIG9wdHMubSk7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIF9jID0gMDsgX2MgPCBjZW50cm9pZHMubGVuZ3RoOyBfYysrKSB7XG4gICAgZm9yICh2YXIgZGltID0gMDsgZGltIDwgb3B0cy5hdHRyaWJ1dGVzLmxlbmd0aDsgZGltKyspIHtcbiAgICAgIG51bWVyYXRvciA9IDA7XG4gICAgICBkZW5vbWluYXRvciA9IDA7XG4gICAgICBmb3IgKHZhciBfbjIgPSAwOyBfbjIgPCBub2Rlcy5sZW5ndGg7IF9uMisrKSB7XG4gICAgICAgIG51bWVyYXRvciArPSB3ZWlnaHRbX24yXVtfY10gKiBvcHRzLmF0dHJpYnV0ZXNbZGltXShub2Rlc1tfbjJdKTtcbiAgICAgICAgZGVub21pbmF0b3IgKz0gd2VpZ2h0W19uMl1bX2NdO1xuICAgICAgfVxuICAgICAgY2VudHJvaWRzW19jXVtkaW1dID0gbnVtZXJhdG9yIC8gZGVub21pbmF0b3I7XG4gICAgfVxuICB9XG59O1xudmFyIHVwZGF0ZU1lbWJlcnNoaXAgPSBmdW5jdGlvbiB1cGRhdGVNZW1iZXJzaGlwKFUsIF9VLCBjZW50cm9pZHMsIG5vZGVzLCBvcHRzKSB7XG4gIC8vIFNhdmUgcHJldmlvdXMgc3RlcFxuICBmb3IgKHZhciBpID0gMDsgaSA8IFUubGVuZ3RoOyBpKyspIHtcbiAgICBfVVtpXSA9IFVbaV0uc2xpY2UoKTtcbiAgfVxuICB2YXIgc3VtLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yO1xuICB2YXIgcG93ID0gMiAvIChvcHRzLm0gLSAxKTtcbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBjZW50cm9pZHMubGVuZ3RoOyBjKyspIHtcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgICBzdW0gPSAwO1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBjZW50cm9pZHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgLy8gYWdhaW5zdCBhbGwgb3RoZXIgY2VudHJvaWRzXG4gICAgICAgIG51bWVyYXRvciA9IGdldERpc3Qob3B0cy5kaXN0YW5jZSwgbm9kZXNbbl0sIGNlbnRyb2lkc1tjXSwgb3B0cy5hdHRyaWJ1dGVzLCAnY21lYW5zJyk7XG4gICAgICAgIGRlbm9taW5hdG9yID0gZ2V0RGlzdChvcHRzLmRpc3RhbmNlLCBub2Rlc1tuXSwgY2VudHJvaWRzW2tdLCBvcHRzLmF0dHJpYnV0ZXMsICdjbWVhbnMnKTtcbiAgICAgICAgc3VtICs9IE1hdGgucG93KG51bWVyYXRvciAvIGRlbm9taW5hdG9yLCBwb3cpO1xuICAgICAgfVxuICAgICAgVVtuXVtjXSA9IDEgLyBzdW07XG4gICAgfVxuICB9XG59O1xudmFyIGFzc2lnbiQxID0gZnVuY3Rpb24gYXNzaWduKG5vZGVzLCBVLCBvcHRzLCBjeSkge1xuICB2YXIgY2x1c3RlcnMgPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBjbHVzdGVycy5sZW5ndGg7IGMrKykge1xuICAgIGNsdXN0ZXJzW2NdID0gW107XG4gIH1cbiAgdmFyIG1heDtcbiAgdmFyIGluZGV4O1xuICBmb3IgKHZhciBuID0gMDsgbiA8IFUubGVuZ3RoOyBuKyspIHtcbiAgICAvLyBmb3IgZWFjaCBub2RlIChVIGlzIE4geCBDIG1hdHJpeClcbiAgICBtYXggPSAtSW5maW5pdHk7XG4gICAgaW5kZXggPSAtMTtcbiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggY2x1c3RlciB0aGUgbm9kZSBpcyBtb3N0IGxpa2VseSB0byBiZWxvbmcgaW5cbiAgICBmb3IgKHZhciBfYzIgPSAwOyBfYzIgPCBVWzBdLmxlbmd0aDsgX2MyKyspIHtcbiAgICAgIGlmIChVW25dW19jMl0gPiBtYXgpIHtcbiAgICAgICAgbWF4ID0gVVtuXVtfYzJdO1xuICAgICAgICBpbmRleCA9IF9jMjtcbiAgICAgIH1cbiAgICB9XG4gICAgY2x1c3RlcnNbaW5kZXhdLnB1c2gobm9kZXNbbl0pO1xuICB9XG5cbiAgLy8gVHVybiBldmVyeSBhcnJheSBpbnRvIGEgY29sbGVjdGlvbiBvZiBub2Rlc1xuICBmb3IgKHZhciBfYzMgPSAwOyBfYzMgPCBjbHVzdGVycy5sZW5ndGg7IF9jMysrKSB7XG4gICAgY2x1c3RlcnNbX2MzXSA9IGN5LmNvbGxlY3Rpb24oY2x1c3RlcnNbX2MzXSk7XG4gIH1cbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciBmdXp6eUNNZWFucyA9IGZ1bmN0aW9uIGZ1enp5Q01lYW5zKG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gIHZhciBvcHRzID0gc2V0T3B0aW9ucyQyKG9wdGlvbnMpO1xuXG4gIC8vIEJlZ2luIGZ1enp5IGMtbWVhbnMgYWxnb3JpdGhtXG4gIHZhciBjbHVzdGVycztcbiAgdmFyIGNlbnRyb2lkcztcbiAgdmFyIFU7XG4gIHZhciBfVTtcbiAgdmFyIHdlaWdodDtcblxuICAvLyBTdGVwIDE6IEluaXRpYWxpemUgbGV0aWFibGVzLlxuICBfVSA9IG5ldyBBcnJheShub2Rlcy5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTiB4IEMgbWF0cml4XG4gICAgX1VbaV0gPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgfVxuICBVID0gbmV3IEFycmF5KG5vZGVzLmxlbmd0aCk7XG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IG5vZGVzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAvLyBOIHggQyBtYXRyaXhcbiAgICBVW19pM10gPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgfVxuICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBub2Rlcy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgdmFyIHRvdGFsID0gMDtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9wdHMuazsgaisrKSB7XG4gICAgICBVW19pNF1bal0gPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgdG90YWwgKz0gVVtfaTRdW2pdO1xuICAgIH1cbiAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgb3B0cy5rOyBfaisrKSB7XG4gICAgICBVW19pNF1bX2pdID0gVVtfaTRdW19qXSAvIHRvdGFsO1xuICAgIH1cbiAgfVxuICBjZW50cm9pZHMgPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgb3B0cy5rOyBfaTUrKykge1xuICAgIGNlbnRyb2lkc1tfaTVdID0gbmV3IEFycmF5KG9wdHMuYXR0cmlidXRlcy5sZW5ndGgpO1xuICB9XG4gIHdlaWdodCA9IG5ldyBBcnJheShub2Rlcy5sZW5ndGgpO1xuICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBub2Rlcy5sZW5ndGg7IF9pNisrKSB7XG4gICAgLy8gTiB4IEMgbWF0cml4XG4gICAgd2VpZ2h0W19pNl0gPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgfVxuICAvLyBlbmQgaW5pdCBGQ01cblxuICB2YXIgaXNTdGlsbE1vdmluZyA9IHRydWU7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgd2hpbGUgKGlzU3RpbGxNb3ZpbmcgJiYgaXRlcmF0aW9ucyA8IG9wdHMubWF4SXRlcmF0aW9ucykge1xuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTtcblxuICAgIC8vIFN0ZXAgMjogQ2FsY3VsYXRlIHRoZSBjZW50cm9pZHMgZm9yIGVhY2ggc3RlcC5cbiAgICB1cGRhdGVDZW50cm9pZHMoY2VudHJvaWRzLCBub2RlcywgVSwgd2VpZ2h0LCBvcHRzKTtcblxuICAgIC8vIFN0ZXAgMzogVXBkYXRlIHRoZSBwYXJ0aXRpb24gbWF0cml4IFUuXG4gICAgdXBkYXRlTWVtYmVyc2hpcChVLCBfVSwgY2VudHJvaWRzLCBub2Rlcywgb3B0cyk7XG5cbiAgICAvLyBTdGVwIDQ6IENoZWNrIGZvciBjb252ZXJnZW5jZS5cbiAgICBpZiAoIWhhdmVNYXRyaWNlc0NvbnZlcmdlZChVLCBfVSwgb3B0cy5zZW5zaXRpdml0eVRocmVzaG9sZCkpIHtcbiAgICAgIGlzU3RpbGxNb3ZpbmcgPSB0cnVlO1xuICAgIH1cbiAgICBpdGVyYXRpb25zKys7XG4gIH1cblxuICAvLyBBc3NpZ24gbm9kZXMgdG8gY2x1c3RlcnMgd2l0aCBoaWdoZXN0IHByb2JhYmlsaXR5LlxuICBjbHVzdGVycyA9IGFzc2lnbiQxKG5vZGVzLCBVLCBvcHRzLCBjeSk7XG4gIHJldHVybiB7XG4gICAgY2x1c3RlcnM6IGNsdXN0ZXJzLFxuICAgIGRlZ3JlZU9mTWVtYmVyc2hpcDogVVxuICB9O1xufTtcbnZhciBrQ2x1c3RlcmluZyA9IHtcbiAga01lYW5zOiBrTWVhbnMsXG4gIGtNZWRvaWRzOiBrTWVkb2lkcyxcbiAgZnV6enlDTWVhbnM6IGZ1enp5Q01lYW5zLFxuICBmY206IGZ1enp5Q01lYW5zXG59O1xuXG4vLyBJbXBsZW1lbnRlZCBieSBab2UgWGkgQHpvZXhpIGZvciBHU09DIDIwMTZcbnZhciBkZWZhdWx0cyRhID0gZGVmYXVsdHMkZyh7XG4gIGRpc3RhbmNlOiAnZXVjbGlkZWFuJyxcbiAgLy8gZGlzdGFuY2UgbWV0cmljIHRvIGNvbXBhcmUgbm9kZXNcbiAgbGlua2FnZTogJ21pbicsXG4gIC8vIGxpbmthZ2UgY3JpdGVyaW9uIDogaG93IHRvIGRldGVybWluZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiBjbHVzdGVycyBvZiBub2Rlc1xuICBtb2RlOiAndGhyZXNob2xkJyxcbiAgLy8gbW9kZTondGhyZXNob2xkJyA9PiBjbHVzdGVycyBtdXN0IGJlIHRocmVzaG9sZCBkaXN0YW5jZSBhcGFydFxuICB0aHJlc2hvbGQ6IEluZmluaXR5LFxuICAvLyB0aGUgZGlzdGFuY2UgdGhyZXNob2xkXG4gIC8vIG1vZGU6J2RlbmRyb2dyYW0nID0+IHRoZSBub2RlcyBhcmUgb3JnYW5pc2VkIGFzIGxlYXZlcyBpbiBhIHRyZWUgKHNpYmxpbmdzIGFyZSBjbG9zZSksIG1lcmdpbmcgbWFrZXMgY2x1c3RlcnNcbiAgYWRkRGVuZHJvZ3JhbTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gYWRkIHRoZSBkZW5kcm9ncmFtIHRvIHRoZSBncmFwaCBmb3Igdml6XG4gIGRlbmRyb2dyYW1EZXB0aDogMCxcbiAgLy8gZGVwdGggYXQgd2hpY2ggZGVuZHJvZ3JhbSBicmFuY2hlcyBhcmUgbWVyZ2VkIGludG8gdGhlIHJldHVybmVkIGNsdXN0ZXJzXG4gIGF0dHJpYnV0ZXM6IFtdIC8vIGFycmF5IG9mIGF0dHIgZnVuY3Rpb25zXG59KTtcblxudmFyIGxpbmthZ2VBbGlhc2VzID0ge1xuICAnc2luZ2xlJzogJ21pbicsXG4gICdjb21wbGV0ZSc6ICdtYXgnXG59O1xudmFyIHNldE9wdGlvbnMkMSA9IGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuICB2YXIgb3B0cyA9IGRlZmF1bHRzJGEob3B0aW9ucyk7XG4gIHZhciBwcmVmZXJyZWRBbGlhcyA9IGxpbmthZ2VBbGlhc2VzW29wdHMubGlua2FnZV07XG4gIGlmIChwcmVmZXJyZWRBbGlhcyAhPSBudWxsKSB7XG4gICAgb3B0cy5saW5rYWdlID0gcHJlZmVycmVkQWxpYXM7XG4gIH1cbiAgcmV0dXJuIG9wdHM7XG59O1xudmFyIG1lcmdlQ2xvc2VzdCA9IGZ1bmN0aW9uIG1lcmdlQ2xvc2VzdChjbHVzdGVycywgaW5kZXgsIGRpc3RzLCBtaW5zLCBvcHRzKSB7XG4gIC8vIEZpbmQgdHdvIGNsb3Nlc3QgY2x1c3RlcnMgZnJvbSBjYWNoZWQgbWluc1xuICB2YXIgbWluS2V5ID0gMDtcbiAgdmFyIG1pbiA9IEluZmluaXR5O1xuICB2YXIgZGlzdDtcbiAgdmFyIGF0dHJzID0gb3B0cy5hdHRyaWJ1dGVzO1xuICB2YXIgZ2V0RGlzdCA9IGZ1bmN0aW9uIGdldERpc3QobjEsIG4yKSB7XG4gICAgcmV0dXJuIGNsdXN0ZXJpbmdEaXN0YW5jZShvcHRzLmRpc3RhbmNlLCBhdHRycy5sZW5ndGgsIGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gYXR0cnNbaV0objEpO1xuICAgIH0sIGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gYXR0cnNbaV0objIpO1xuICAgIH0sIG4xLCBuMik7XG4gIH07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gY2x1c3RlcnNbaV0ua2V5O1xuICAgIHZhciBfZGlzdCA9IGRpc3RzW2tleV1bbWluc1trZXldXTtcbiAgICBpZiAoX2Rpc3QgPCBtaW4pIHtcbiAgICAgIG1pbktleSA9IGtleTtcbiAgICAgIG1pbiA9IF9kaXN0O1xuICAgIH1cbiAgfVxuICBpZiAob3B0cy5tb2RlID09PSAndGhyZXNob2xkJyAmJiBtaW4gPj0gb3B0cy50aHJlc2hvbGQgfHwgb3B0cy5tb2RlID09PSAnZGVuZHJvZ3JhbScgJiYgY2x1c3RlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBjMSA9IGluZGV4W21pbktleV07XG4gIHZhciBjMiA9IGluZGV4W21pbnNbbWluS2V5XV07XG4gIHZhciBtZXJnZWQ7XG5cbiAgLy8gTWVyZ2UgdHdvIGNsb3Nlc3QgY2x1c3RlcnNcbiAgaWYgKG9wdHMubW9kZSA9PT0gJ2RlbmRyb2dyYW0nKSB7XG4gICAgbWVyZ2VkID0ge1xuICAgICAgbGVmdDogYzEsXG4gICAgICByaWdodDogYzIsXG4gICAgICBrZXk6IGMxLmtleVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgbWVyZ2VkID0ge1xuICAgICAgdmFsdWU6IGMxLnZhbHVlLmNvbmNhdChjMi52YWx1ZSksXG4gICAgICBrZXk6IGMxLmtleVxuICAgIH07XG4gIH1cbiAgY2x1c3RlcnNbYzEuaW5kZXhdID0gbWVyZ2VkO1xuICBjbHVzdGVycy5zcGxpY2UoYzIuaW5kZXgsIDEpO1xuICBpbmRleFtjMS5rZXldID0gbWVyZ2VkO1xuXG4gIC8vIFVwZGF0ZSBkaXN0YW5jZXMgd2l0aCBuZXcgbWVyZ2VkIGNsdXN0ZXJcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGNsdXN0ZXJzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBjdXIgPSBjbHVzdGVyc1tfaV07XG4gICAgaWYgKGMxLmtleSA9PT0gY3VyLmtleSkge1xuICAgICAgZGlzdCA9IEluZmluaXR5O1xuICAgIH0gZWxzZSBpZiAob3B0cy5saW5rYWdlID09PSAnbWluJykge1xuICAgICAgZGlzdCA9IGRpc3RzW2MxLmtleV1bY3VyLmtleV07XG4gICAgICBpZiAoZGlzdHNbYzEua2V5XVtjdXIua2V5XSA+IGRpc3RzW2MyLmtleV1bY3VyLmtleV0pIHtcbiAgICAgICAgZGlzdCA9IGRpc3RzW2MyLmtleV1bY3VyLmtleV07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRzLmxpbmthZ2UgPT09ICdtYXgnKSB7XG4gICAgICBkaXN0ID0gZGlzdHNbYzEua2V5XVtjdXIua2V5XTtcbiAgICAgIGlmIChkaXN0c1tjMS5rZXldW2N1ci5rZXldIDwgZGlzdHNbYzIua2V5XVtjdXIua2V5XSkge1xuICAgICAgICBkaXN0ID0gZGlzdHNbYzIua2V5XVtjdXIua2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdHMubGlua2FnZSA9PT0gJ21lYW4nKSB7XG4gICAgICBkaXN0ID0gKGRpc3RzW2MxLmtleV1bY3VyLmtleV0gKiBjMS5zaXplICsgZGlzdHNbYzIua2V5XVtjdXIua2V5XSAqIGMyLnNpemUpIC8gKGMxLnNpemUgKyBjMi5zaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdHMubW9kZSA9PT0gJ2RlbmRyb2dyYW0nKSBkaXN0ID0gZ2V0RGlzdChjdXIudmFsdWUsIGMxLnZhbHVlKTtlbHNlIGRpc3QgPSBnZXREaXN0KGN1ci52YWx1ZVswXSwgYzEudmFsdWVbMF0pO1xuICAgIH1cbiAgICBkaXN0c1tjMS5rZXldW2N1ci5rZXldID0gZGlzdHNbY3VyLmtleV1bYzEua2V5XSA9IGRpc3Q7IC8vIGRpc3RhbmNlIG1hdHJpeCBpcyBzeW1tZXRyaWNcbiAgfVxuXG4gIC8vIFVwZGF0ZSBjYWNoZWQgbWluc1xuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBjbHVzdGVycy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIGtleTEgPSBjbHVzdGVyc1tfaTJdLmtleTtcbiAgICBpZiAobWluc1trZXkxXSA9PT0gYzEua2V5IHx8IG1pbnNba2V5MV0gPT09IGMyLmtleSkge1xuICAgICAgdmFyIF9taW4gPSBrZXkxO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjbHVzdGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIga2V5MiA9IGNsdXN0ZXJzW2pdLmtleTtcbiAgICAgICAgaWYgKGRpc3RzW2tleTFdW2tleTJdIDwgZGlzdHNba2V5MV1bX21pbl0pIHtcbiAgICAgICAgICBfbWluID0ga2V5MjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWluc1trZXkxXSA9IF9taW47XG4gICAgfVxuICAgIGNsdXN0ZXJzW19pMl0uaW5kZXggPSBfaTI7XG4gIH1cblxuICAvLyBDbGVhbiB1cCBtZXRhIGRhdGEgdXNlZCBmb3IgY2x1c3RlcmluZ1xuICBjMS5rZXkgPSBjMi5rZXkgPSBjMS5pbmRleCA9IGMyLmluZGV4ID0gbnVsbDtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIGdldEFsbENoaWxkcmVuID0gZnVuY3Rpb24gZ2V0QWxsQ2hpbGRyZW4ocm9vdCwgYXJyLCBjeSkge1xuICBpZiAoIXJvb3QpIHJldHVybjtcbiAgaWYgKHJvb3QudmFsdWUpIHtcbiAgICBhcnIucHVzaChyb290LnZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAocm9vdC5sZWZ0KSBnZXRBbGxDaGlsZHJlbihyb290LmxlZnQsIGFycik7XG4gICAgaWYgKHJvb3QucmlnaHQpIGdldEFsbENoaWxkcmVuKHJvb3QucmlnaHQsIGFycik7XG4gIH1cbn07XG52YXIgYnVpbGREZW5kcm9ncmFtID0gZnVuY3Rpb24gYnVpbGREZW5kcm9ncmFtKHJvb3QsIGN5KSB7XG4gIGlmICghcm9vdCkgcmV0dXJuICcnO1xuICBpZiAocm9vdC5sZWZ0ICYmIHJvb3QucmlnaHQpIHtcbiAgICB2YXIgbGVmdFN0ciA9IGJ1aWxkRGVuZHJvZ3JhbShyb290LmxlZnQsIGN5KTtcbiAgICB2YXIgcmlnaHRTdHIgPSBidWlsZERlbmRyb2dyYW0ocm9vdC5yaWdodCwgY3kpO1xuICAgIHZhciBub2RlID0gY3kuYWRkKHtcbiAgICAgIGdyb3VwOiAnbm9kZXMnLFxuICAgICAgZGF0YToge1xuICAgICAgICBpZDogbGVmdFN0ciArICcsJyArIHJpZ2h0U3RyXG4gICAgICB9XG4gICAgfSk7XG4gICAgY3kuYWRkKHtcbiAgICAgIGdyb3VwOiAnZWRnZXMnLFxuICAgICAgZGF0YToge1xuICAgICAgICBzb3VyY2U6IGxlZnRTdHIsXG4gICAgICAgIHRhcmdldDogbm9kZS5pZCgpXG4gICAgICB9XG4gICAgfSk7XG4gICAgY3kuYWRkKHtcbiAgICAgIGdyb3VwOiAnZWRnZXMnLFxuICAgICAgZGF0YToge1xuICAgICAgICBzb3VyY2U6IHJpZ2h0U3RyLFxuICAgICAgICB0YXJnZXQ6IG5vZGUuaWQoKVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBub2RlLmlkKCk7XG4gIH0gZWxzZSBpZiAocm9vdC52YWx1ZSkge1xuICAgIHJldHVybiByb290LnZhbHVlLmlkKCk7XG4gIH1cbn07XG52YXIgYnVpbGRDbHVzdGVyc0Zyb21UcmVlID0gZnVuY3Rpb24gYnVpbGRDbHVzdGVyc0Zyb21UcmVlKHJvb3QsIGssIGN5KSB7XG4gIGlmICghcm9vdCkgcmV0dXJuIFtdO1xuICB2YXIgbGVmdCA9IFtdLFxuICAgIHJpZ2h0ID0gW10sXG4gICAgbGVhdmVzID0gW107XG4gIGlmIChrID09PSAwKSB7XG4gICAgLy8gZG9uJ3QgY3V0IHRyZWUsIHNpbXBseSByZXR1cm4gYWxsIG5vZGVzIGFzIDEgc2luZ2xlIGNsdXN0ZXJcbiAgICBpZiAocm9vdC5sZWZ0KSBnZXRBbGxDaGlsZHJlbihyb290LmxlZnQsIGxlZnQpO1xuICAgIGlmIChyb290LnJpZ2h0KSBnZXRBbGxDaGlsZHJlbihyb290LnJpZ2h0LCByaWdodCk7XG4gICAgbGVhdmVzID0gbGVmdC5jb25jYXQocmlnaHQpO1xuICAgIHJldHVybiBbY3kuY29sbGVjdGlvbihsZWF2ZXMpXTtcbiAgfSBlbHNlIGlmIChrID09PSAxKSB7XG4gICAgLy8gY3V0IGF0IHJvb3RcblxuICAgIGlmIChyb290LnZhbHVlKSB7XG4gICAgICAvLyBsZWFmIG5vZGVcbiAgICAgIHJldHVybiBbY3kuY29sbGVjdGlvbihyb290LnZhbHVlKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyb290LmxlZnQpIGdldEFsbENoaWxkcmVuKHJvb3QubGVmdCwgbGVmdCk7XG4gICAgICBpZiAocm9vdC5yaWdodCkgZ2V0QWxsQ2hpbGRyZW4ocm9vdC5yaWdodCwgcmlnaHQpO1xuICAgICAgcmV0dXJuIFtjeS5jb2xsZWN0aW9uKGxlZnQpLCBjeS5jb2xsZWN0aW9uKHJpZ2h0KV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChyb290LnZhbHVlKSB7XG4gICAgICByZXR1cm4gW2N5LmNvbGxlY3Rpb24ocm9vdC52YWx1ZSldO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocm9vdC5sZWZ0KSBsZWZ0ID0gYnVpbGRDbHVzdGVyc0Zyb21UcmVlKHJvb3QubGVmdCwgayAtIDEsIGN5KTtcbiAgICAgIGlmIChyb290LnJpZ2h0KSByaWdodCA9IGJ1aWxkQ2x1c3RlcnNGcm9tVHJlZShyb290LnJpZ2h0LCBrIC0gMSwgY3kpO1xuICAgICAgcmV0dXJuIGxlZnQuY29uY2F0KHJpZ2h0KTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBoaWVyYXJjaGljYWxDbHVzdGVyaW5nID0gZnVuY3Rpb24gaGllcmFyY2hpY2FsQ2x1c3RlcmluZyhvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuXG4gIC8vIFNldCBwYXJhbWV0ZXJzIG9mIGFsZ29yaXRobTogbGlua2FnZSB0eXBlLCBkaXN0YW5jZSBtZXRyaWMsIGV0Yy5cbiAgdmFyIG9wdHMgPSBzZXRPcHRpb25zJDEob3B0aW9ucyk7XG4gIHZhciBhdHRycyA9IG9wdHMuYXR0cmlidXRlcztcbiAgdmFyIGdldERpc3QgPSBmdW5jdGlvbiBnZXREaXN0KG4xLCBuMikge1xuICAgIHJldHVybiBjbHVzdGVyaW5nRGlzdGFuY2Uob3B0cy5kaXN0YW5jZSwgYXR0cnMubGVuZ3RoLCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGF0dHJzW2ldKG4xKTtcbiAgICB9LCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGF0dHJzW2ldKG4yKTtcbiAgICB9LCBuMSwgbjIpO1xuICB9O1xuXG4gIC8vIEJlZ2luIGhpZXJhcmNoaWNhbCBhbGdvcml0aG1cbiAgdmFyIGNsdXN0ZXJzID0gW107XG4gIHZhciBkaXN0cyA9IFtdOyAvLyBkaXN0YW5jZXMgYmV0d2VlbiBlYWNoIHBhaXIgb2YgY2x1c3RlcnNcbiAgdmFyIG1pbnMgPSBbXTsgLy8gY2xvc2VzdCBjbHVzdGVyIGZvciBlYWNoIGNsdXN0ZXJcbiAgdmFyIGluZGV4ID0gW107IC8vIGhhc2ggb2YgYWxsIGNsdXN0ZXJzIGJ5IGtleVxuXG4gIC8vIEluIGFnZ2xvbWVyYXRpdmUgKGJvdHRvbS11cCkgY2x1c3RlcmluZywgZWFjaCBub2RlIHN0YXJ0cyBhcyBpdHMgb3duIGNsdXN0ZXJcbiAgZm9yICh2YXIgbiA9IDA7IG4gPCBub2Rlcy5sZW5ndGg7IG4rKykge1xuICAgIHZhciBjbHVzdGVyID0ge1xuICAgICAgdmFsdWU6IG9wdHMubW9kZSA9PT0gJ2RlbmRyb2dyYW0nID8gbm9kZXNbbl0gOiBbbm9kZXNbbl1dLFxuICAgICAga2V5OiBuLFxuICAgICAgaW5kZXg6IG5cbiAgICB9O1xuICAgIGNsdXN0ZXJzW25dID0gY2x1c3RlcjtcbiAgICBpbmRleFtuXSA9IGNsdXN0ZXI7XG4gICAgZGlzdHNbbl0gPSBbXTtcbiAgICBtaW5zW25dID0gMDtcbiAgfVxuXG4gIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiBlYWNoIHBhaXIgb2YgY2x1c3RlcnNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDw9IGk7IGorKykge1xuICAgICAgdmFyIGRpc3QgPSB2b2lkIDA7XG4gICAgICBpZiAob3B0cy5tb2RlID09PSAnZGVuZHJvZ3JhbScpIHtcbiAgICAgICAgLy8gbW9kZXMgc3RvcmUgY2x1c3RlciB2YWx1ZXMgZGlmZmVyZW50bHlcbiAgICAgICAgZGlzdCA9IGkgPT09IGogPyBJbmZpbml0eSA6IGdldERpc3QoY2x1c3RlcnNbaV0udmFsdWUsIGNsdXN0ZXJzW2pdLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3QgPSBpID09PSBqID8gSW5maW5pdHkgOiBnZXREaXN0KGNsdXN0ZXJzW2ldLnZhbHVlWzBdLCBjbHVzdGVyc1tqXS52YWx1ZVswXSk7XG4gICAgICB9XG4gICAgICBkaXN0c1tpXVtqXSA9IGRpc3Q7XG4gICAgICBkaXN0c1tqXVtpXSA9IGRpc3Q7XG4gICAgICBpZiAoZGlzdCA8IGRpc3RzW2ldW21pbnNbaV1dKSB7XG4gICAgICAgIG1pbnNbaV0gPSBqOyAvLyBDYWNoZSBtaW5zOiBjbG9zZXN0IGNsdXN0ZXIgdG8gY2x1c3RlciBpIGlzIGNsdXN0ZXIgalxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmQgdGhlIGNsb3Nlc3QgcGFpciBvZiBjbHVzdGVycyBhbmQgbWVyZ2UgdGhlbSBpbnRvIGEgc2luZ2xlIGNsdXN0ZXIuXG4gIC8vIFVwZGF0ZSBkaXN0YW5jZXMgYmV0d2VlbiBuZXcgY2x1c3RlciBhbmQgZWFjaCBvZiB0aGUgb2xkIGNsdXN0ZXJzLCBhbmQgbG9vcCB1bnRpbCB0aHJlc2hvbGQgcmVhY2hlZC5cbiAgdmFyIG1lcmdlZCA9IG1lcmdlQ2xvc2VzdChjbHVzdGVycywgaW5kZXgsIGRpc3RzLCBtaW5zLCBvcHRzKTtcbiAgd2hpbGUgKG1lcmdlZCkge1xuICAgIG1lcmdlZCA9IG1lcmdlQ2xvc2VzdChjbHVzdGVycywgaW5kZXgsIGRpc3RzLCBtaW5zLCBvcHRzKTtcbiAgfVxuICB2YXIgcmV0Q2x1c3RlcnM7XG5cbiAgLy8gRGVuZHJvZ3JhbSBtb2RlIGJ1aWxkcyB0aGUgaGllcmFyY2h5IGFuZCBhZGRzIGludGVybWVkaWFyeSBub2RlcyArIGVkZ2VzXG4gIC8vIGluIGFkZGl0aW9uIHRvIHJldHVybmluZyB0aGUgY2x1c3RlcnMuXG4gIGlmIChvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJykge1xuICAgIHJldENsdXN0ZXJzID0gYnVpbGRDbHVzdGVyc0Zyb21UcmVlKGNsdXN0ZXJzWzBdLCBvcHRzLmRlbmRyb2dyYW1EZXB0aCwgY3kpO1xuICAgIGlmIChvcHRzLmFkZERlbmRyb2dyYW0pIGJ1aWxkRGVuZHJvZ3JhbShjbHVzdGVyc1swXSwgY3kpO1xuICB9IGVsc2Uge1xuICAgIC8vIFJlZ3VsYXIgbW9kZSBzaW1wbHkgcmV0dXJucyB0aGUgY2x1c3RlcnNcblxuICAgIHJldENsdXN0ZXJzID0gbmV3IEFycmF5KGNsdXN0ZXJzLmxlbmd0aCk7XG4gICAgY2x1c3RlcnMuZm9yRWFjaChmdW5jdGlvbiAoY2x1c3RlciwgaSkge1xuICAgICAgLy8gQ2xlYW4gdXAgbWV0YSBkYXRhIHVzZWQgZm9yIGNsdXN0ZXJpbmdcbiAgICAgIGNsdXN0ZXIua2V5ID0gY2x1c3Rlci5pbmRleCA9IG51bGw7XG4gICAgICByZXRDbHVzdGVyc1tpXSA9IGN5LmNvbGxlY3Rpb24oY2x1c3Rlci52YWx1ZSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJldENsdXN0ZXJzO1xufTtcbnZhciBoaWVyYXJjaGljYWxDbHVzdGVyaW5nJDEgPSB7XG4gIGhpZXJhcmNoaWNhbENsdXN0ZXJpbmc6IGhpZXJhcmNoaWNhbENsdXN0ZXJpbmcsXG4gIGhjYTogaGllcmFyY2hpY2FsQ2x1c3RlcmluZ1xufTtcblxuLy8gSW1wbGVtZW50ZWQgYnkgWm9lIFhpIEB6b2V4aSBmb3IgR1NPQyAyMDE2XG52YXIgZGVmYXVsdHMkOSA9IGRlZmF1bHRzJGcoe1xuICBkaXN0YW5jZTogJ2V1Y2xpZGVhbicsXG4gIC8vIGRpc3RhbmNlIG1ldHJpYyB0byBjb21wYXJlIGF0dHJpYnV0ZXMgYmV0d2VlbiB0d28gbm9kZXNcbiAgcHJlZmVyZW5jZTogJ21lZGlhbicsXG4gIC8vIHN1aXRhYmlsaXR5IG9mIGEgZGF0YSBwb2ludCB0byBzZXJ2ZSBhcyBhbiBleGVtcGxhclxuICBkYW1waW5nOiAwLjgsXG4gIC8vIGRhbXBpbmcgZmFjdG9yIGJldHdlZW4gWzAuNSwgMSlcbiAgbWF4SXRlcmF0aW9uczogMTAwMCxcbiAgLy8gbWF4IG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHJ1blxuICBtaW5JdGVyYXRpb25zOiAxMDAsXG4gIC8vIG1pbiBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBydW4gaW4gb3JkZXIgZm9yIGNsdXN0ZXJpbmcgdG8gc3RvcFxuICBhdHRyaWJ1dGVzOiBbLy8gZnVuY3Rpb25zIHRvIHF1YW50aWZ5IHRoZSBzaW1pbGFyaXR5IGJldHdlZW4gYW55IHR3byBwb2ludHNcbiAgICAvLyBlLmcuIG5vZGUgPT4gbm9kZS5kYXRhKCd3ZWlnaHQnKVxuICBdXG59KTtcbnZhciBzZXRPcHRpb25zID0gZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIHZhciBkbXAgPSBvcHRpb25zLmRhbXBpbmc7XG4gIHZhciBwcmVmID0gb3B0aW9ucy5wcmVmZXJlbmNlO1xuICBpZiAoISgwLjUgPD0gZG1wICYmIGRtcCA8IDEpKSB7XG4gICAgZXJyb3IoXCJEYW1waW5nIG11c3QgcmFuZ2Ugb24gWzAuNSwgMSkuICBHb3Q6IFwiLmNvbmNhdChkbXApKTtcbiAgfVxuICB2YXIgdmFsaWRQcmVmcyA9IFsnbWVkaWFuJywgJ21lYW4nLCAnbWluJywgJ21heCddO1xuICBpZiAoISh2YWxpZFByZWZzLnNvbWUoZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gdiA9PT0gcHJlZjtcbiAgfSkgfHwgbnVtYmVyJDEocHJlZikpKSB7XG4gICAgZXJyb3IoXCJQcmVmZXJlbmNlIG11c3QgYmUgb25lIG9mIFtcIi5jb25jYXQodmFsaWRQcmVmcy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICAgIHJldHVybiBcIidcIi5jb25jYXQocCwgXCInXCIpO1xuICAgIH0pLmpvaW4oJywgJyksIFwiXSBvciBhIG51bWJlci4gIEdvdDogXCIpLmNvbmNhdChwcmVmKSk7XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRzJDkob3B0aW9ucyk7XG59O1xuXG52YXIgZ2V0U2ltaWxhcml0eSA9IGZ1bmN0aW9uIGdldFNpbWlsYXJpdHkodHlwZSwgbjEsIG4yLCBhdHRyaWJ1dGVzKSB7XG4gIHZhciBhdHRyID0gZnVuY3Rpb24gYXR0cihuLCBpKSB7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXNbaV0obik7XG4gIH07XG5cbiAgLy8gbmIgbmVnYXRpdmUgYmVjYXVzZSBzaW1pbGFyaXR5IHNob3VsZCBoYXZlIGFuIGludmVyc2UgcmVsYXRpb25zaGlwIHRvIGRpc3RhbmNlXG4gIHJldHVybiAtY2x1c3RlcmluZ0Rpc3RhbmNlKHR5cGUsIGF0dHJpYnV0ZXMubGVuZ3RoLCBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBhdHRyKG4xLCBpKTtcbiAgfSwgZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gYXR0cihuMiwgaSk7XG4gIH0sIG4xLCBuMik7XG59O1xudmFyIGdldFByZWZlcmVuY2UgPSBmdW5jdGlvbiBnZXRQcmVmZXJlbmNlKFMsIHByZWZlcmVuY2UpIHtcbiAgLy8gbGFyZ2VyIHByZWZlcmVuY2UgPSBncmVhdGVyICMgb2YgY2x1c3RlcnNcbiAgdmFyIHAgPSBudWxsO1xuICBpZiAocHJlZmVyZW5jZSA9PT0gJ21lZGlhbicpIHtcbiAgICBwID0gbWVkaWFuKFMpO1xuICB9IGVsc2UgaWYgKHByZWZlcmVuY2UgPT09ICdtZWFuJykge1xuICAgIHAgPSBtZWFuKFMpO1xuICB9IGVsc2UgaWYgKHByZWZlcmVuY2UgPT09ICdtaW4nKSB7XG4gICAgcCA9IG1pbihTKTtcbiAgfSBlbHNlIGlmIChwcmVmZXJlbmNlID09PSAnbWF4Jykge1xuICAgIHAgPSBtYXgoUyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ3VzdG9tIHByZWZlcmVuY2UgbnVtYmVyLCBhcyBzZXQgYnkgdXNlclxuICAgIHAgPSBwcmVmZXJlbmNlO1xuICB9XG4gIHJldHVybiBwO1xufTtcbnZhciBmaW5kRXhlbXBsYXJzID0gZnVuY3Rpb24gZmluZEV4ZW1wbGFycyhuLCBSLCBBKSB7XG4gIHZhciBpbmRpY2VzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgaWYgKFJbaSAqIG4gKyBpXSArIEFbaSAqIG4gKyBpXSA+IDApIHtcbiAgICAgIGluZGljZXMucHVzaChpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluZGljZXM7XG59O1xudmFyIGFzc2lnbkNsdXN0ZXJzID0gZnVuY3Rpb24gYXNzaWduQ2x1c3RlcnMobiwgUywgZXhlbXBsYXJzKSB7XG4gIHZhciBjbHVzdGVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIHZhciBpbmRleCA9IC0xO1xuICAgIHZhciBtYXggPSAtSW5maW5pdHk7XG4gICAgZm9yICh2YXIgZWkgPSAwOyBlaSA8IGV4ZW1wbGFycy5sZW5ndGg7IGVpKyspIHtcbiAgICAgIHZhciBlID0gZXhlbXBsYXJzW2VpXTtcbiAgICAgIGlmIChTW2kgKiBuICsgZV0gPiBtYXgpIHtcbiAgICAgICAgaW5kZXggPSBlO1xuICAgICAgICBtYXggPSBTW2kgKiBuICsgZV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgIGNsdXN0ZXJzLnB1c2goaW5kZXgpO1xuICAgIH1cbiAgfVxuICBmb3IgKHZhciBfZWkgPSAwOyBfZWkgPCBleGVtcGxhcnMubGVuZ3RoOyBfZWkrKykge1xuICAgIGNsdXN0ZXJzW2V4ZW1wbGFyc1tfZWldXSA9IGV4ZW1wbGFyc1tfZWldO1xuICB9XG4gIHJldHVybiBjbHVzdGVycztcbn07XG52YXIgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduKG4sIFMsIGV4ZW1wbGFycykge1xuICB2YXIgY2x1c3RlcnMgPSBhc3NpZ25DbHVzdGVycyhuLCBTLCBleGVtcGxhcnMpO1xuICBmb3IgKHZhciBlaSA9IDA7IGVpIDwgZXhlbXBsYXJzLmxlbmd0aDsgZWkrKykge1xuICAgIHZhciBpaSA9IFtdO1xuICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY2x1c3RlcnMubGVuZ3RoOyBjKyspIHtcbiAgICAgIGlmIChjbHVzdGVyc1tjXSA9PT0gZXhlbXBsYXJzW2VpXSkge1xuICAgICAgICBpaS5wdXNoKGMpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgbWF4SSA9IC0xO1xuICAgIHZhciBtYXhTdW0gPSAtSW5maW5pdHk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpaS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGlpLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHN1bSArPSBTW2lpW2pdICogbiArIGlpW2ldXTtcbiAgICAgIH1cbiAgICAgIGlmIChzdW0gPiBtYXhTdW0pIHtcbiAgICAgICAgbWF4SSA9IGk7XG4gICAgICAgIG1heFN1bSA9IHN1bTtcbiAgICAgIH1cbiAgICB9XG4gICAgZXhlbXBsYXJzW2VpXSA9IGlpW21heEldO1xuICB9XG4gIGNsdXN0ZXJzID0gYXNzaWduQ2x1c3RlcnMobiwgUywgZXhlbXBsYXJzKTtcbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciBhZmZpbml0eVByb3BhZ2F0aW9uID0gZnVuY3Rpb24gYWZmaW5pdHlQcm9wYWdhdGlvbihvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgb3B0cyA9IHNldE9wdGlvbnMob3B0aW9ucyk7XG5cbiAgLy8gTWFwIGVhY2ggbm9kZSB0byBpdHMgcG9zaXRpb24gaW4gbm9kZSBhcnJheVxuICB2YXIgaWQycG9zaXRpb24gPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGlkMnBvc2l0aW9uW25vZGVzW2ldLmlkKCldID0gaTtcbiAgfVxuXG4gIC8vIEJlZ2luIGFmZmluaXR5IHByb3BhZ2F0aW9uIGFsZ29yaXRobVxuXG4gIHZhciBuOyAvLyBudW1iZXIgb2YgZGF0YSBwb2ludHNcbiAgdmFyIG4yOyAvLyBzaXplIG9mIG1hdHJpY2VzXG4gIHZhciBTOyAvLyBzaW1pbGFyaXR5IG1hdHJpeCAoMUQgYXJyYXkpXG4gIHZhciBwOyAvLyBwcmVmZXJlbmNlL3N1aXRhYmlsaXR5IG9mIGEgZGF0YSBwb2ludCB0byBzZXJ2ZSBhcyBhbiBleGVtcGxhclxuICB2YXIgUjsgLy8gcmVzcG9uc2liaWxpdHkgbWF0cml4ICgxRCBhcnJheSlcbiAgdmFyIEE7IC8vIGF2YWlsYWJpbGl0eSBtYXRyaXggKDFEIGFycmF5KVxuXG4gIG4gPSBub2Rlcy5sZW5ndGg7XG4gIG4yID0gbiAqIG47XG5cbiAgLy8gSW5pdGlhbGl6ZSBhbmQgYnVpbGQgUyBzaW1pbGFyaXR5IG1hdHJpeFxuICBTID0gbmV3IEFycmF5KG4yKTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG4yOyBfaSsrKSB7XG4gICAgU1tfaV0gPSAtSW5maW5pdHk7IC8vIGZvciBjYXNlcyB3aGVyZSB0d28gZGF0YSBwb2ludHMgc2hvdWxkbid0IGJlIGxpbmtlZCB0b2dldGhlclxuICB9XG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbjsgX2kyKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgaWYgKF9pMiAhPT0gaikge1xuICAgICAgICBTW19pMiAqIG4gKyBqXSA9IGdldFNpbWlsYXJpdHkob3B0cy5kaXN0YW5jZSwgbm9kZXNbX2kyXSwgbm9kZXNbal0sIG9wdHMuYXR0cmlidXRlcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUGxhY2UgcHJlZmVyZW5jZXMgb24gdGhlIGRpYWdvbmFsIG9mIFNcbiAgcCA9IGdldFByZWZlcmVuY2UoUywgb3B0cy5wcmVmZXJlbmNlKTtcbiAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbjsgX2kzKyspIHtcbiAgICBTW19pMyAqIG4gKyBfaTNdID0gcDtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgUiByZXNwb25zaWJpbGl0eSBtYXRyaXhcbiAgUiA9IG5ldyBBcnJheShuMik7XG4gIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG4yOyBfaTQrKykge1xuICAgIFJbX2k0XSA9IDAuMDtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgQSBhdmFpbGFiaWxpdHkgbWF0cml4XG4gIEEgPSBuZXcgQXJyYXkobjIpO1xuICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBuMjsgX2k1KyspIHtcbiAgICBBW19pNV0gPSAwLjA7XG4gIH1cbiAgdmFyIG9sZCA9IG5ldyBBcnJheShuKTtcbiAgdmFyIFJwID0gbmV3IEFycmF5KG4pO1xuICB2YXIgc2UgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IG47IF9pNisrKSB7XG4gICAgb2xkW19pNl0gPSAwLjA7XG4gICAgUnBbX2k2XSA9IDAuMDtcbiAgICBzZVtfaTZdID0gMDtcbiAgfVxuICB2YXIgZSA9IG5ldyBBcnJheShuICogb3B0cy5taW5JdGVyYXRpb25zKTtcbiAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgZS5sZW5ndGg7IF9pNysrKSB7XG4gICAgZVtfaTddID0gMDtcbiAgfVxuICB2YXIgaXRlcjtcbiAgZm9yIChpdGVyID0gMDsgaXRlciA8IG9wdHMubWF4SXRlcmF0aW9uczsgaXRlcisrKSB7XG4gICAgLy8gbWFpbiBhbGdvcml0aG1pYyBsb29wXG5cbiAgICAvLyBVcGRhdGUgUiByZXNwb25zaWJpbGl0eSBtYXRyaXhcbiAgICBmb3IgKHZhciBfaTggPSAwOyBfaTggPCBuOyBfaTgrKykge1xuICAgICAgdmFyIG1heCA9IC1JbmZpbml0eSxcbiAgICAgICAgbWF4MiA9IC1JbmZpbml0eSxcbiAgICAgICAgbWF4SSA9IC0xLFxuICAgICAgICBBUyA9IDAuMDtcbiAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBuOyBfaisrKSB7XG4gICAgICAgIG9sZFtfal0gPSBSW19pOCAqIG4gKyBfal07XG4gICAgICAgIEFTID0gQVtfaTggKiBuICsgX2pdICsgU1tfaTggKiBuICsgX2pdO1xuICAgICAgICBpZiAoQVMgPj0gbWF4KSB7XG4gICAgICAgICAgbWF4MiA9IG1heDtcbiAgICAgICAgICBtYXggPSBBUztcbiAgICAgICAgICBtYXhJID0gX2o7XG4gICAgICAgIH0gZWxzZSBpZiAoQVMgPiBtYXgyKSB7XG4gICAgICAgICAgbWF4MiA9IEFTO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBfajIgPSAwOyBfajIgPCBuOyBfajIrKykge1xuICAgICAgICBSW19pOCAqIG4gKyBfajJdID0gKDEgLSBvcHRzLmRhbXBpbmcpICogKFNbX2k4ICogbiArIF9qMl0gLSBtYXgpICsgb3B0cy5kYW1waW5nICogb2xkW19qMl07XG4gICAgICB9XG4gICAgICBSW19pOCAqIG4gKyBtYXhJXSA9ICgxIC0gb3B0cy5kYW1waW5nKSAqIChTW19pOCAqIG4gKyBtYXhJXSAtIG1heDIpICsgb3B0cy5kYW1waW5nICogb2xkW21heEldO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBBIGF2YWlsYWJpbGl0eSBtYXRyaXhcbiAgICBmb3IgKHZhciBfaTkgPSAwOyBfaTkgPCBuOyBfaTkrKykge1xuICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICBmb3IgKHZhciBfajMgPSAwOyBfajMgPCBuOyBfajMrKykge1xuICAgICAgICBvbGRbX2ozXSA9IEFbX2ozICogbiArIF9pOV07XG4gICAgICAgIFJwW19qM10gPSBNYXRoLm1heCgwLCBSW19qMyAqIG4gKyBfaTldKTtcbiAgICAgICAgc3VtICs9IFJwW19qM107XG4gICAgICB9XG4gICAgICBzdW0gLT0gUnBbX2k5XTtcbiAgICAgIFJwW19pOV0gPSBSW19pOSAqIG4gKyBfaTldO1xuICAgICAgc3VtICs9IFJwW19pOV07XG4gICAgICBmb3IgKHZhciBfajQgPSAwOyBfajQgPCBuOyBfajQrKykge1xuICAgICAgICBBW19qNCAqIG4gKyBfaTldID0gKDEgLSBvcHRzLmRhbXBpbmcpICogTWF0aC5taW4oMCwgc3VtIC0gUnBbX2o0XSkgKyBvcHRzLmRhbXBpbmcgKiBvbGRbX2o0XTtcbiAgICAgIH1cbiAgICAgIEFbX2k5ICogbiArIF9pOV0gPSAoMSAtIG9wdHMuZGFtcGluZykgKiAoc3VtIC0gUnBbX2k5XSkgKyBvcHRzLmRhbXBpbmcgKiBvbGRbX2k5XTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgY29udmVyZ2VuY2VcbiAgICB2YXIgSyA9IDA7XG4gICAgZm9yICh2YXIgX2kxMCA9IDA7IF9pMTAgPCBuOyBfaTEwKyspIHtcbiAgICAgIHZhciBFID0gQVtfaTEwICogbiArIF9pMTBdICsgUltfaTEwICogbiArIF9pMTBdID4gMCA/IDEgOiAwO1xuICAgICAgZVtpdGVyICUgb3B0cy5taW5JdGVyYXRpb25zICogbiArIF9pMTBdID0gRTtcbiAgICAgIEsgKz0gRTtcbiAgICB9XG4gICAgaWYgKEsgPiAwICYmIChpdGVyID49IG9wdHMubWluSXRlcmF0aW9ucyAtIDEgfHwgaXRlciA9PSBvcHRzLm1heEl0ZXJhdGlvbnMgLSAxKSkge1xuICAgICAgdmFyIF9zdW0gPSAwO1xuICAgICAgZm9yICh2YXIgX2kxMSA9IDA7IF9pMTEgPCBuOyBfaTExKyspIHtcbiAgICAgICAgc2VbX2kxMV0gPSAwO1xuICAgICAgICBmb3IgKHZhciBfajUgPSAwOyBfajUgPCBvcHRzLm1pbkl0ZXJhdGlvbnM7IF9qNSsrKSB7XG4gICAgICAgICAgc2VbX2kxMV0gKz0gZVtfajUgKiBuICsgX2kxMV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlW19pMTFdID09PSAwIHx8IHNlW19pMTFdID09PSBvcHRzLm1pbkl0ZXJhdGlvbnMpIHtcbiAgICAgICAgICBfc3VtKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChfc3VtID09PSBuKSB7XG4gICAgICAgIC8vIHRoZW4gd2UgaGF2ZSBjb252ZXJnZW5jZVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBJZGVudGlmeSBleGVtcGxhcnMgKGNsdXN0ZXIgY2VudGVycylcbiAgdmFyIGV4ZW1wbGFyc0luZGljZXMgPSBmaW5kRXhlbXBsYXJzKG4sIFIsIEEpO1xuXG4gIC8vIEFzc2lnbiBub2RlcyB0byBjbHVzdGVyc1xuICB2YXIgY2x1c3RlckluZGljZXMgPSBhc3NpZ24obiwgUywgZXhlbXBsYXJzSW5kaWNlcyk7XG4gIHZhciBjbHVzdGVycyA9IHt9O1xuICBmb3IgKHZhciBjID0gMDsgYyA8IGV4ZW1wbGFyc0luZGljZXMubGVuZ3RoOyBjKyspIHtcbiAgICBjbHVzdGVyc1tleGVtcGxhcnNJbmRpY2VzW2NdXSA9IFtdO1xuICB9XG4gIGZvciAodmFyIF9pMTIgPSAwOyBfaTEyIDwgbm9kZXMubGVuZ3RoOyBfaTEyKyspIHtcbiAgICB2YXIgcG9zID0gaWQycG9zaXRpb25bbm9kZXNbX2kxMl0uaWQoKV07XG4gICAgdmFyIGNsdXN0ZXJJbmRleCA9IGNsdXN0ZXJJbmRpY2VzW3Bvc107XG4gICAgaWYgKGNsdXN0ZXJJbmRleCAhPSBudWxsKSB7XG4gICAgICAvLyB0aGUgbm9kZSBtYXkgaGF2ZSBub3QgYmVlbiBhc3NpZ25lZCBhIGNsdXN0ZXIgaWYgbm8gdmFsaWQgYXR0cmlidXRlcyB3ZXJlIHNwZWNpZmllZFxuICAgICAgY2x1c3RlcnNbY2x1c3RlckluZGV4XS5wdXNoKG5vZGVzW19pMTJdKTtcbiAgICB9XG4gIH1cbiAgdmFyIHJldENsdXN0ZXJzID0gbmV3IEFycmF5KGV4ZW1wbGFyc0luZGljZXMubGVuZ3RoKTtcbiAgZm9yICh2YXIgX2MgPSAwOyBfYyA8IGV4ZW1wbGFyc0luZGljZXMubGVuZ3RoOyBfYysrKSB7XG4gICAgcmV0Q2x1c3RlcnNbX2NdID0gY3kuY29sbGVjdGlvbihjbHVzdGVyc1tleGVtcGxhcnNJbmRpY2VzW19jXV0pO1xuICB9XG4gIHJldHVybiByZXRDbHVzdGVycztcbn07XG52YXIgYWZmaW5pdHlQcm9wYWdhdGlvbiQxID0ge1xuICBhZmZpbml0eVByb3BhZ2F0aW9uOiBhZmZpbml0eVByb3BhZ2F0aW9uLFxuICBhcDogYWZmaW5pdHlQcm9wYWdhdGlvblxufTtcblxudmFyIGhpZXJob2x6ZXJEZWZhdWx0cyA9IGRlZmF1bHRzJGcoe1xuICByb290OiB1bmRlZmluZWQsXG4gIGRpcmVjdGVkOiBmYWxzZVxufSk7XG52YXIgZWxlc2ZuJGsgPSB7XG4gIGhpZXJob2x6ZXI6IGZ1bmN0aW9uIGhpZXJob2x6ZXIob3B0aW9ucykge1xuICAgIGlmICghcGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgcm9vdDogYXJnc1swXSxcbiAgICAgICAgZGlyZWN0ZWQ6IGFyZ3NbMV1cbiAgICAgIH07XG4gICAgfVxuICAgIHZhciBfaGllcmhvbHplckRlZmF1bHRzID0gaGllcmhvbHplckRlZmF1bHRzKG9wdGlvbnMpLFxuICAgICAgcm9vdCA9IF9oaWVyaG9semVyRGVmYXVsdHMucm9vdCxcbiAgICAgIGRpcmVjdGVkID0gX2hpZXJob2x6ZXJEZWZhdWx0cy5kaXJlY3RlZDtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIGRmbGFnID0gZmFsc2U7XG4gICAgdmFyIG9kZEluO1xuICAgIHZhciBvZGRPdXQ7XG4gICAgdmFyIHN0YXJ0VmVydGV4O1xuICAgIGlmIChyb290KSBzdGFydFZlcnRleCA9IHN0cmluZyhyb290KSA/IHRoaXMuZmlsdGVyKHJvb3QpWzBdLmlkKCkgOiByb290WzBdLmlkKCk7XG4gICAgdmFyIG5vZGVzID0ge307XG4gICAgdmFyIGVkZ2VzID0ge307XG4gICAgaWYgKGRpcmVjdGVkKSB7XG4gICAgICBlbGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICAgICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgICAgIHZhciBpbmQgPSBlbGUuaW5kZWdyZWUodHJ1ZSk7XG4gICAgICAgICAgdmFyIG91dGQgPSBlbGUub3V0ZGVncmVlKHRydWUpO1xuICAgICAgICAgIHZhciBkMSA9IGluZCAtIG91dGQ7XG4gICAgICAgICAgdmFyIGQyID0gb3V0ZCAtIGluZDtcbiAgICAgICAgICBpZiAoZDEgPT0gMSkge1xuICAgICAgICAgICAgaWYgKG9kZEluKSBkZmxhZyA9IHRydWU7ZWxzZSBvZGRJbiA9IGlkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZDIgPT0gMSkge1xuICAgICAgICAgICAgaWYgKG9kZE91dCkgZGZsYWcgPSB0cnVlO2Vsc2Ugb2RkT3V0ID0gaWQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChkMiA+IDEgfHwgZDEgPiAxKSB7XG4gICAgICAgICAgICBkZmxhZyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGVzW2lkXSA9IFtdO1xuICAgICAgICAgIGVsZS5vdXRnb2VycygpLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGlmIChlLmlzRWRnZSgpKSBub2Rlc1tpZF0ucHVzaChlLmlkKCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVkZ2VzW2lkXSA9IFt1bmRlZmluZWQsIGVsZS50YXJnZXQoKS5pZCgpXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgICAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgICAgdmFyIGQgPSBlbGUuZGVncmVlKHRydWUpO1xuICAgICAgICAgIGlmIChkICUgMikge1xuICAgICAgICAgICAgaWYgKCFvZGRJbikgb2RkSW4gPSBpZDtlbHNlIGlmICghb2RkT3V0KSBvZGRPdXQgPSBpZDtlbHNlIGRmbGFnID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZXNbaWRdID0gW107XG4gICAgICAgICAgZWxlLmNvbm5lY3RlZEVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVzW2lkXS5wdXNoKGUuaWQoKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWRnZXNbaWRdID0gW2VsZS5zb3VyY2UoKS5pZCgpLCBlbGUudGFyZ2V0KCkuaWQoKV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgZm91bmQ6IGZhbHNlLFxuICAgICAgdHJhaWw6IHVuZGVmaW5lZFxuICAgIH07XG4gICAgaWYgKGRmbGFnKSByZXR1cm4gcmVzdWx0O2Vsc2UgaWYgKG9kZE91dCAmJiBvZGRJbikge1xuICAgICAgaWYgKGRpcmVjdGVkKSB7XG4gICAgICAgIGlmIChzdGFydFZlcnRleCAmJiBvZGRPdXQgIT0gc3RhcnRWZXJ0ZXgpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0VmVydGV4ID0gb2RkT3V0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHN0YXJ0VmVydGV4ICYmIG9kZE91dCAhPSBzdGFydFZlcnRleCAmJiBvZGRJbiAhPSBzdGFydFZlcnRleCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoIXN0YXJ0VmVydGV4KSB7XG4gICAgICAgICAgc3RhcnRWZXJ0ZXggPSBvZGRPdXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFzdGFydFZlcnRleCkgc3RhcnRWZXJ0ZXggPSBlbGVzWzBdLmlkKCk7XG4gICAgfVxuICAgIHZhciB3YWxrID0gZnVuY3Rpb24gd2Fsayh2KSB7XG4gICAgICB2YXIgY3VycmVudE5vZGUgPSB2O1xuICAgICAgdmFyIHN1YnRvdXIgPSBbdl07XG4gICAgICB2YXIgYWRqLCBhZGpUYWlsLCBhZGpIZWFkO1xuICAgICAgd2hpbGUgKG5vZGVzW2N1cnJlbnROb2RlXS5sZW5ndGgpIHtcbiAgICAgICAgYWRqID0gbm9kZXNbY3VycmVudE5vZGVdLnNoaWZ0KCk7XG4gICAgICAgIGFkalRhaWwgPSBlZGdlc1thZGpdWzBdO1xuICAgICAgICBhZGpIZWFkID0gZWRnZXNbYWRqXVsxXTtcbiAgICAgICAgaWYgKGN1cnJlbnROb2RlICE9IGFkakhlYWQpIHtcbiAgICAgICAgICBub2Rlc1thZGpIZWFkXSA9IG5vZGVzW2FkakhlYWRdLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGUgIT0gYWRqO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGN1cnJlbnROb2RlID0gYWRqSGVhZDtcbiAgICAgICAgfSBlbHNlIGlmICghZGlyZWN0ZWQgJiYgY3VycmVudE5vZGUgIT0gYWRqVGFpbCkge1xuICAgICAgICAgIG5vZGVzW2FkalRhaWxdID0gbm9kZXNbYWRqVGFpbF0uZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZSAhPSBhZGo7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY3VycmVudE5vZGUgPSBhZGpUYWlsO1xuICAgICAgICB9XG4gICAgICAgIHN1YnRvdXIudW5zaGlmdChhZGopO1xuICAgICAgICBzdWJ0b3VyLnVuc2hpZnQoY3VycmVudE5vZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1YnRvdXI7XG4gICAgfTtcbiAgICB2YXIgdHJhaWwgPSBbXTtcbiAgICB2YXIgc3VidG91ciA9IFtdO1xuICAgIHN1YnRvdXIgPSB3YWxrKHN0YXJ0VmVydGV4KTtcbiAgICB3aGlsZSAoc3VidG91ci5sZW5ndGggIT0gMSkge1xuICAgICAgaWYgKG5vZGVzW3N1YnRvdXJbMF1dLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHRyYWlsLnVuc2hpZnQoZWxlcy5nZXRFbGVtZW50QnlJZChzdWJ0b3VyLnNoaWZ0KCkpKTtcbiAgICAgICAgdHJhaWwudW5zaGlmdChlbGVzLmdldEVsZW1lbnRCeUlkKHN1YnRvdXIuc2hpZnQoKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3VidG91ciA9IHdhbGsoc3VidG91ci5zaGlmdCgpKS5jb25jYXQoc3VidG91cik7XG4gICAgICB9XG4gICAgfVxuICAgIHRyYWlsLnVuc2hpZnQoZWxlcy5nZXRFbGVtZW50QnlJZChzdWJ0b3VyLnNoaWZ0KCkpKTsgLy8gZmluYWwgbm9kZVxuXG4gICAgZm9yICh2YXIgZCBpbiBub2Rlcykge1xuICAgICAgaWYgKG5vZGVzW2RdLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQuZm91bmQgPSB0cnVlO1xuICAgIHJlc3VsdC50cmFpbCA9IHRoaXMuc3Bhd24odHJhaWwsIHRydWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbnZhciBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkID0gZnVuY3Rpb24gaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZCgpIHtcbiAgdmFyIGVsZXMgPSB0aGlzO1xuICB2YXIgbm9kZXMgPSB7fTtcbiAgdmFyIGlkID0gMDtcbiAgdmFyIGVkZ2VDb3VudCA9IDA7XG4gIHZhciBjb21wb25lbnRzID0gW107XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgdmlzaXRlZEVkZ2VzID0ge307XG4gIHZhciBidWlsZENvbXBvbmVudCA9IGZ1bmN0aW9uIGJ1aWxkQ29tcG9uZW50KHgsIHkpIHtcbiAgICB2YXIgaSA9IHN0YWNrLmxlbmd0aCAtIDE7XG4gICAgdmFyIGN1dHNldCA9IFtdO1xuICAgIHZhciBjb21wb25lbnQgPSBlbGVzLnNwYXduKCk7XG4gICAgd2hpbGUgKHN0YWNrW2ldLnggIT0geCB8fCBzdGFja1tpXS55ICE9IHkpIHtcbiAgICAgIGN1dHNldC5wdXNoKHN0YWNrLnBvcCgpLmVkZ2UpO1xuICAgICAgaS0tO1xuICAgIH1cbiAgICBjdXRzZXQucHVzaChzdGFjay5wb3AoKS5lZGdlKTtcbiAgICBjdXRzZXQuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgdmFyIGNvbm5lY3RlZE5vZGVzID0gZWRnZS5jb25uZWN0ZWROb2RlcygpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICAgIGNvbXBvbmVudC5tZXJnZShlZGdlKTtcbiAgICAgIGNvbm5lY3RlZE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIG5vZGVJZCA9IG5vZGUuaWQoKTtcbiAgICAgICAgdmFyIGNvbm5lY3RlZEVkZ2VzID0gbm9kZS5jb25uZWN0ZWRFZGdlcygpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICAgICAgY29tcG9uZW50Lm1lcmdlKG5vZGUpO1xuICAgICAgICBpZiAoIW5vZGVzW25vZGVJZF0uY3V0VmVydGV4KSB7XG4gICAgICAgICAgY29tcG9uZW50Lm1lcmdlKGNvbm5lY3RlZEVkZ2VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wb25lbnQubWVyZ2UoY29ubmVjdGVkRWRnZXMuZmlsdGVyKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgICByZXR1cm4gZWRnZS5pc0xvb3AoKTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICB9O1xuICB2YXIgYmljb25uZWN0ZWRTZWFyY2ggPSBmdW5jdGlvbiBiaWNvbm5lY3RlZFNlYXJjaChyb290LCBjdXJyZW50Tm9kZSwgcGFyZW50KSB7XG4gICAgaWYgKHJvb3QgPT09IHBhcmVudCkgZWRnZUNvdW50ICs9IDE7XG4gICAgbm9kZXNbY3VycmVudE5vZGVdID0ge1xuICAgICAgaWQ6IGlkLFxuICAgICAgbG93OiBpZCsrLFxuICAgICAgY3V0VmVydGV4OiBmYWxzZVxuICAgIH07XG4gICAgdmFyIGVkZ2VzID0gZWxlcy5nZXRFbGVtZW50QnlJZChjdXJyZW50Tm9kZSkuY29ubmVjdGVkRWRnZXMoKS5pbnRlcnNlY3Rpb24oZWxlcyk7XG4gICAgaWYgKGVkZ2VzLnNpemUoKSA9PT0gMCkge1xuICAgICAgY29tcG9uZW50cy5wdXNoKGVsZXMuc3Bhd24oZWxlcy5nZXRFbGVtZW50QnlJZChjdXJyZW50Tm9kZSkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNvdXJjZUlkLCB0YXJnZXRJZCwgb3RoZXJOb2RlSWQsIGVkZ2VJZDtcbiAgICAgIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgc291cmNlSWQgPSBlZGdlLnNvdXJjZSgpLmlkKCk7XG4gICAgICAgIHRhcmdldElkID0gZWRnZS50YXJnZXQoKS5pZCgpO1xuICAgICAgICBvdGhlck5vZGVJZCA9IHNvdXJjZUlkID09PSBjdXJyZW50Tm9kZSA/IHRhcmdldElkIDogc291cmNlSWQ7XG4gICAgICAgIGlmIChvdGhlck5vZGVJZCAhPT0gcGFyZW50KSB7XG4gICAgICAgICAgZWRnZUlkID0gZWRnZS5pZCgpO1xuICAgICAgICAgIGlmICghdmlzaXRlZEVkZ2VzW2VkZ2VJZF0pIHtcbiAgICAgICAgICAgIHZpc2l0ZWRFZGdlc1tlZGdlSWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICB4OiBjdXJyZW50Tm9kZSxcbiAgICAgICAgICAgICAgeTogb3RoZXJOb2RlSWQsXG4gICAgICAgICAgICAgIGVkZ2U6IGVkZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIShvdGhlck5vZGVJZCBpbiBub2RlcykpIHtcbiAgICAgICAgICAgIGJpY29ubmVjdGVkU2VhcmNoKHJvb3QsIG90aGVyTm9kZUlkLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICBub2Rlc1tjdXJyZW50Tm9kZV0ubG93ID0gTWF0aC5taW4obm9kZXNbY3VycmVudE5vZGVdLmxvdywgbm9kZXNbb3RoZXJOb2RlSWRdLmxvdyk7XG4gICAgICAgICAgICBpZiAobm9kZXNbY3VycmVudE5vZGVdLmlkIDw9IG5vZGVzW290aGVyTm9kZUlkXS5sb3cpIHtcbiAgICAgICAgICAgICAgbm9kZXNbY3VycmVudE5vZGVdLmN1dFZlcnRleCA9IHRydWU7XG4gICAgICAgICAgICAgIGJ1aWxkQ29tcG9uZW50KGN1cnJlbnROb2RlLCBvdGhlck5vZGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGVzW2N1cnJlbnROb2RlXS5sb3cgPSBNYXRoLm1pbihub2Rlc1tjdXJyZW50Tm9kZV0ubG93LCBub2Rlc1tvdGhlck5vZGVJZF0uaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICBlbGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIHZhciBub2RlSWQgPSBlbGUuaWQoKTtcbiAgICAgIGlmICghKG5vZGVJZCBpbiBub2RlcykpIHtcbiAgICAgICAgZWRnZUNvdW50ID0gMDtcbiAgICAgICAgYmljb25uZWN0ZWRTZWFyY2gobm9kZUlkLCBub2RlSWQpO1xuICAgICAgICBub2Rlc1tub2RlSWRdLmN1dFZlcnRleCA9IGVkZ2VDb3VudCA+IDE7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdmFyIGN1dFZlcnRpY2VzID0gT2JqZWN0LmtleXMobm9kZXMpLmZpbHRlcihmdW5jdGlvbiAoaWQpIHtcbiAgICByZXR1cm4gbm9kZXNbaWRdLmN1dFZlcnRleDtcbiAgfSkubWFwKGZ1bmN0aW9uIChpZCkge1xuICAgIHJldHVybiBlbGVzLmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgY3V0OiBlbGVzLnNwYXduKGN1dFZlcnRpY2VzKSxcbiAgICBjb21wb25lbnRzOiBjb21wb25lbnRzXG4gIH07XG59O1xudmFyIGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWQkMSA9IHtcbiAgaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZDogaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZCxcbiAgaHRiYzogaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZCxcbiAgaHRiOiBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkLFxuICBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkQ29tcG9uZW50czogaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZFxufTtcblxudmFyIHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkID0gZnVuY3Rpb24gdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQoKSB7XG4gIHZhciBlbGVzID0gdGhpcztcbiAgdmFyIG5vZGVzID0ge307XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBjb21wb25lbnRzID0gW107XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgY3V0ID0gZWxlcy5zcGF3bihlbGVzKTtcbiAgdmFyIHN0cm9uZ2x5Q29ubmVjdGVkU2VhcmNoID0gZnVuY3Rpb24gc3Ryb25nbHlDb25uZWN0ZWRTZWFyY2goc291cmNlTm9kZUlkKSB7XG4gICAgc3RhY2sucHVzaChzb3VyY2VOb2RlSWQpO1xuICAgIG5vZGVzW3NvdXJjZU5vZGVJZF0gPSB7XG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBsb3c6IGluZGV4KyssXG4gICAgICBleHBsb3JlZDogZmFsc2VcbiAgICB9O1xuICAgIHZhciBjb25uZWN0ZWRFZGdlcyA9IGVsZXMuZ2V0RWxlbWVudEJ5SWQoc291cmNlTm9kZUlkKS5jb25uZWN0ZWRFZGdlcygpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICBjb25uZWN0ZWRFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICB2YXIgdGFyZ2V0Tm9kZUlkID0gZWRnZS50YXJnZXQoKS5pZCgpO1xuICAgICAgaWYgKHRhcmdldE5vZGVJZCAhPT0gc291cmNlTm9kZUlkKSB7XG4gICAgICAgIGlmICghKHRhcmdldE5vZGVJZCBpbiBub2RlcykpIHtcbiAgICAgICAgICBzdHJvbmdseUNvbm5lY3RlZFNlYXJjaCh0YXJnZXROb2RlSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbm9kZXNbdGFyZ2V0Tm9kZUlkXS5leHBsb3JlZCkge1xuICAgICAgICAgIG5vZGVzW3NvdXJjZU5vZGVJZF0ubG93ID0gTWF0aC5taW4obm9kZXNbc291cmNlTm9kZUlkXS5sb3csIG5vZGVzW3RhcmdldE5vZGVJZF0ubG93KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChub2Rlc1tzb3VyY2VOb2RlSWRdLmluZGV4ID09PSBub2Rlc1tzb3VyY2VOb2RlSWRdLmxvdykge1xuICAgICAgdmFyIGNvbXBvbmVudE5vZGVzID0gZWxlcy5zcGF3bigpO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICB2YXIgbm9kZUlkID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGNvbXBvbmVudE5vZGVzLm1lcmdlKGVsZXMuZ2V0RWxlbWVudEJ5SWQobm9kZUlkKSk7XG4gICAgICAgIG5vZGVzW25vZGVJZF0ubG93ID0gbm9kZXNbc291cmNlTm9kZUlkXS5pbmRleDtcbiAgICAgICAgbm9kZXNbbm9kZUlkXS5leHBsb3JlZCA9IHRydWU7XG4gICAgICAgIGlmIChub2RlSWQgPT09IHNvdXJjZU5vZGVJZCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgY29tcG9uZW50RWRnZXMgPSBjb21wb25lbnROb2Rlcy5lZGdlc1dpdGgoY29tcG9uZW50Tm9kZXMpO1xuICAgICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudE5vZGVzLm1lcmdlKGNvbXBvbmVudEVkZ2VzKTtcbiAgICAgIGNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgICAgY3V0ID0gY3V0LmRpZmZlcmVuY2UoY29tcG9uZW50KTtcbiAgICB9XG4gIH07XG4gIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgdmFyIG5vZGVJZCA9IGVsZS5pZCgpO1xuICAgICAgaWYgKCEobm9kZUlkIGluIG5vZGVzKSkge1xuICAgICAgICBzdHJvbmdseUNvbm5lY3RlZFNlYXJjaChub2RlSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiB7XG4gICAgY3V0OiBjdXQsXG4gICAgY29tcG9uZW50czogY29tcG9uZW50c1xuICB9O1xufTtcbnZhciB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCQxID0ge1xuICB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZDogdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQsXG4gIHRzYzogdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQsXG4gIHRzY2M6IHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkLFxuICB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZENvbXBvbmVudHM6IHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkXG59O1xuXG52YXIgZWxlc2ZuJGogPSB7fTtcbltlbGVzZm4kdiwgZWxlc2ZuJHUsIGVsZXNmbiR0LCBlbGVzZm4kcywgZWxlc2ZuJHIsIGVsZXNmbiRxLCBlbGVzZm4kcCwgZWxlc2ZuJG8sIGVsZXNmbiRuLCBlbGVzZm4kbSwgZWxlc2ZuJGwsIG1hcmtvdkNsdXN0ZXJpbmckMSwga0NsdXN0ZXJpbmcsIGhpZXJhcmNoaWNhbENsdXN0ZXJpbmckMSwgYWZmaW5pdHlQcm9wYWdhdGlvbiQxLCBlbGVzZm4kaywgaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZCQxLCB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCQxXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoZWxlc2ZuJGosIHByb3BzKTtcbn0pO1xuXG4vKiFcbkVtYmVkZGFibGUgTWluaW11bSBTdHJpY3RseS1Db21wbGlhbnQgUHJvbWlzZXMvQSsgMS4xLjEgVGhlbmFibGVcbkNvcHlyaWdodCAoYykgMjAxMy0yMDE0IFJhbGYgUy4gRW5nZWxzY2hhbGwgKGh0dHA6Ly9lbmdlbHNjaGFsbC5jb20pXG5MaWNlbnNlZCB1bmRlciBUaGUgTUlUIExpY2Vuc2UgKGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQpXG4qL1xuXG4vKiAgcHJvbWlzZSBzdGF0ZXMgW1Byb21pc2VzL0ErIDIuMV0gICovXG52YXIgU1RBVEVfUEVORElORyA9IDA7IC8qICBbUHJvbWlzZXMvQSsgMi4xLjFdICAqL1xudmFyIFNUQVRFX0ZVTEZJTExFRCA9IDE7IC8qICBbUHJvbWlzZXMvQSsgMi4xLjJdICAqL1xudmFyIFNUQVRFX1JFSkVDVEVEID0gMjsgLyogIFtQcm9taXNlcy9BKyAyLjEuM10gICovXG5cbi8qICBwcm9taXNlIG9iamVjdCBjb25zdHJ1Y3RvciAgKi9cbnZhciBhcGkgPSBmdW5jdGlvbiBhcGkoZXhlY3V0b3IpIHtcbiAgLyogIG9wdGlvbmFsbHkgc3VwcG9ydCBub24tY29uc3RydWN0b3IvcGxhaW4tZnVuY3Rpb24gY2FsbCAgKi9cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIGFwaSkpIHJldHVybiBuZXcgYXBpKGV4ZWN1dG9yKTtcblxuICAvKiAgaW5pdGlhbGl6ZSBvYmplY3QgICovXG4gIHRoaXMuaWQgPSAnVGhlbmFibGUvMS4wLjcnO1xuICB0aGlzLnN0YXRlID0gU1RBVEVfUEVORElORzsgLyogIGluaXRpYWwgc3RhdGUgICovXG4gIHRoaXMuZnVsZmlsbFZhbHVlID0gdW5kZWZpbmVkOyAvKiAgaW5pdGlhbCB2YWx1ZSAgKi8gLyogIFtQcm9taXNlcy9BKyAxLjMsIDIuMS4yLjJdICAqL1xuICB0aGlzLnJlamVjdFJlYXNvbiA9IHVuZGVmaW5lZDsgLyogIGluaXRpYWwgcmVhc29uICovIC8qICBbUHJvbWlzZXMvQSsgMS41LCAyLjEuMy4yXSAgKi9cbiAgdGhpcy5vbkZ1bGZpbGxlZCA9IFtdOyAvKiAgaW5pdGlhbCBoYW5kbGVycyAgKi9cbiAgdGhpcy5vblJlamVjdGVkID0gW107IC8qICBpbml0aWFsIGhhbmRsZXJzICAqL1xuXG4gIC8qICBwcm92aWRlIG9wdGlvbmFsIGluZm9ybWF0aW9uLWhpZGluZyBwcm94eSAgKi9cbiAgdGhpcy5wcm94eSA9IHtcbiAgICB0aGVuOiB0aGlzLnRoZW4uYmluZCh0aGlzKVxuICB9O1xuXG4gIC8qICBzdXBwb3J0IG9wdGlvbmFsIGV4ZWN1dG9yIGZ1bmN0aW9uICAqL1xuICBpZiAodHlwZW9mIGV4ZWN1dG9yID09PSAnZnVuY3Rpb24nKSBleGVjdXRvci5jYWxsKHRoaXMsIHRoaXMuZnVsZmlsbC5iaW5kKHRoaXMpLCB0aGlzLnJlamVjdC5iaW5kKHRoaXMpKTtcbn07XG5cbi8qICBwcm9taXNlIEFQSSBtZXRob2RzICAqL1xuYXBpLnByb3RvdHlwZSA9IHtcbiAgLyogIHByb21pc2UgcmVzb2x2aW5nIG1ldGhvZHMgICovXG4gIGZ1bGZpbGw6IGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHtcbiAgICByZXR1cm4gZGVsaXZlcih0aGlzLCBTVEFURV9GVUxGSUxMRUQsICdmdWxmaWxsVmFsdWUnLCB2YWx1ZSk7XG4gIH0sXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIGRlbGl2ZXIodGhpcywgU1RBVEVfUkVKRUNURUQsICdyZWplY3RSZWFzb24nLCB2YWx1ZSk7XG4gIH0sXG4gIC8qICBcIlRoZSB0aGVuIE1ldGhvZFwiIFtQcm9taXNlcy9BKyAxLjEsIDEuMiwgMi4yXSAgKi9cbiAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgIHZhciBjdXJyID0gdGhpcztcbiAgICB2YXIgbmV4dCA9IG5ldyBhcGkoKTsgLyogIFtQcm9taXNlcy9BKyAyLjIuN10gICovXG4gICAgY3Vyci5vbkZ1bGZpbGxlZC5wdXNoKHJlc29sdmVyKG9uRnVsZmlsbGVkLCBuZXh0LCAnZnVsZmlsbCcpKTsgLyogIFtQcm9taXNlcy9BKyAyLjIuMi8yLjIuNl0gICovXG4gICAgY3Vyci5vblJlamVjdGVkLnB1c2gocmVzb2x2ZXIob25SZWplY3RlZCwgbmV4dCwgJ3JlamVjdCcpKTsgLyogIFtQcm9taXNlcy9BKyAyLjIuMy8yLjIuNl0gICovXG4gICAgZXhlY3V0ZShjdXJyKTtcbiAgICByZXR1cm4gbmV4dC5wcm94eTsgLyogIFtQcm9taXNlcy9BKyAyLjIuNywgMy4zXSAgKi9cbiAgfVxufTtcblxuLyogIGRlbGl2ZXIgYW4gYWN0aW9uICAqL1xudmFyIGRlbGl2ZXIgPSBmdW5jdGlvbiBkZWxpdmVyKGN1cnIsIHN0YXRlLCBuYW1lLCB2YWx1ZSkge1xuICBpZiAoY3Vyci5zdGF0ZSA9PT0gU1RBVEVfUEVORElORykge1xuICAgIGN1cnIuc3RhdGUgPSBzdGF0ZTsgLyogIFtQcm9taXNlcy9BKyAyLjEuMi4xLCAyLjEuMy4xXSAgKi9cbiAgICBjdXJyW25hbWVdID0gdmFsdWU7IC8qICBbUHJvbWlzZXMvQSsgMi4xLjIuMiwgMi4xLjMuMl0gICovXG4gICAgZXhlY3V0ZShjdXJyKTtcbiAgfVxuICByZXR1cm4gY3Vycjtcbn07XG5cbi8qICBleGVjdXRlIGFsbCBoYW5kbGVycyAgKi9cbnZhciBleGVjdXRlID0gZnVuY3Rpb24gZXhlY3V0ZShjdXJyKSB7XG4gIGlmIChjdXJyLnN0YXRlID09PSBTVEFURV9GVUxGSUxMRUQpIGV4ZWN1dGVfaGFuZGxlcnMoY3VyciwgJ29uRnVsZmlsbGVkJywgY3Vyci5mdWxmaWxsVmFsdWUpO2Vsc2UgaWYgKGN1cnIuc3RhdGUgPT09IFNUQVRFX1JFSkVDVEVEKSBleGVjdXRlX2hhbmRsZXJzKGN1cnIsICdvblJlamVjdGVkJywgY3Vyci5yZWplY3RSZWFzb24pO1xufTtcblxuLyogIGV4ZWN1dGUgcGFydGljdWxhciBzZXQgb2YgaGFuZGxlcnMgICovXG52YXIgZXhlY3V0ZV9oYW5kbGVycyA9IGZ1bmN0aW9uIGV4ZWN1dGVfaGFuZGxlcnMoY3VyciwgbmFtZSwgdmFsdWUpIHtcbiAgLyogZ2xvYmFsIHNldEltbWVkaWF0ZTogdHJ1ZSAqL1xuICAvKiBnbG9iYWwgc2V0VGltZW91dDogdHJ1ZSAqL1xuXG4gIC8qICBzaG9ydC1jaXJjdWl0IHByb2Nlc3NpbmcgICovXG4gIGlmIChjdXJyW25hbWVdLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIC8qICBpdGVyYXRlIG92ZXIgYWxsIGhhbmRsZXJzLCBleGFjdGx5IG9uY2UgICovXG4gIHZhciBoYW5kbGVycyA9IGN1cnJbbmFtZV07XG4gIGN1cnJbbmFtZV0gPSBbXTsgLyogIFtQcm9taXNlcy9BKyAyLjIuMi4zLCAyLjIuMy4zXSAgKi9cbiAgdmFyIGZ1bmMgPSBmdW5jdGlvbiBmdW5jKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGhhbmRsZXJzW2ldKHZhbHVlKTtcbiAgICB9IC8qICBbUHJvbWlzZXMvQSsgMi4yLjVdICAqL1xuICB9O1xuXG4gIC8qICBleGVjdXRlIHByb2NlZHVyZSBhc3luY2hyb25vdXNseSAgKi8gLyogIFtQcm9taXNlcy9BKyAyLjIuNCwgMy4xXSAgKi9cbiAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHNldEltbWVkaWF0ZShmdW5jKTtlbHNlIHNldFRpbWVvdXQoZnVuYywgMCk7XG59O1xuXG4vKiAgZ2VuZXJhdGUgYSByZXNvbHZlciBmdW5jdGlvbiAgKi9cbnZhciByZXNvbHZlciA9IGZ1bmN0aW9uIHJlc29sdmVyKGNiLCBuZXh0LCBtZXRob2QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIC8qICBbUHJvbWlzZXMvQSsgMi4yLjEsIDIuMi43LjMsIDIuMi43LjRdICAqL1xuICAgICAgbmV4dFttZXRob2RdLmNhbGwobmV4dCwgdmFsdWUpOyAvKiAgW1Byb21pc2VzL0ErIDIuMi43LjMsIDIuMi43LjRdICAqL2Vsc2Uge1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGNiKHZhbHVlKTtcbiAgICAgIH0gLyogIFtQcm9taXNlcy9BKyAyLjIuMi4xLCAyLjIuMy4xLCAyLjIuNSwgMy4yXSAgKi8gY2F0Y2ggKGUpIHtcbiAgICAgICAgbmV4dC5yZWplY3QoZSk7IC8qICBbUHJvbWlzZXMvQSsgMi4yLjcuMl0gICovXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUobmV4dCwgcmVzdWx0KTsgLyogIFtQcm9taXNlcy9BKyAyLjIuNy4xXSAgKi9cbiAgICB9XG4gIH07XG59O1xuXG4vKiAgXCJQcm9taXNlIFJlc29sdXRpb24gUHJvY2VkdXJlXCIgICovIC8qICBbUHJvbWlzZXMvQSsgMi4zXSAgKi9cbnZhciByZXNvbHZlID0gZnVuY3Rpb24gcmVzb2x2ZShwcm9taXNlLCB4KSB7XG4gIC8qICBzYW5pdHkgY2hlY2sgYXJndW1lbnRzICAqLyAvKiAgW1Byb21pc2VzL0ErIDIuMy4xXSAgKi9cbiAgaWYgKHByb21pc2UgPT09IHggfHwgcHJvbWlzZS5wcm94eSA9PT0geCkge1xuICAgIHByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ2Nhbm5vdCByZXNvbHZlIHByb21pc2Ugd2l0aCBpdHNlbGYnKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogIHN1cmdpY2FsbHkgY2hlY2sgZm9yIGEgXCJ0aGVuXCIgbWV0aG9kXG4gICAgKG1haW5seSB0byBqdXN0IGNhbGwgdGhlIFwiZ2V0dGVyXCIgb2YgXCJ0aGVuXCIgb25seSBvbmNlKSAgKi9cbiAgdmFyIHRoZW47XG4gIGlmIChfdHlwZW9mKHgpID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsIHx8IHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoZW4gPSB4LnRoZW47XG4gICAgfSAvKiAgW1Byb21pc2VzL0ErIDIuMy4zLjEsIDMuNV0gICovIGNhdGNoIChlKSB7XG4gICAgICBwcm9taXNlLnJlamVjdChlKTsgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4yXSAgKi9cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvKiAgaGFuZGxlIG93biBUaGVuYWJsZXMgICAgW1Byb21pc2VzL0ErIDIuMy4yXVxuICAgIGFuZCBzaW1pbGFyIFwidGhlbmFibGVzXCIgW1Byb21pc2VzL0ErIDIuMy4zXSAgKi9cbiAgaWYgKHR5cGVvZiB0aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHJlc29sdmVkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIC8qICBjYWxsIHJldHJpZXZlZCBcInRoZW5cIiBtZXRob2QgKi8gLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zXSAgKi9cbiAgICAgIHRoZW4uY2FsbCh4LCAvKiAgcmVzb2x2ZVByb21pc2UgICovIC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMy4xXSAgKi9cbiAgICAgIGZ1bmN0aW9uICh5KSB7XG4gICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICByZXNvbHZlZCA9IHRydWU7IC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMy4zXSAgKi9cbiAgICAgICAgaWYgKHkgPT09IHgpIC8qICBbUHJvbWlzZXMvQSsgMy42XSAgKi9cbiAgICAgICAgICBwcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKCdjaXJjdWxhciB0aGVuYWJsZSBjaGFpbicpKTtlbHNlIHJlc29sdmUocHJvbWlzZSwgeSk7XG4gICAgICB9LCAvKiAgcmVqZWN0UHJvbWlzZSAgKi8gLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjJdICAqL1xuICAgICAgZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgIHJlc29sdmVkID0gdHJ1ZTsgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjNdICAqL1xuICAgICAgICBwcm9taXNlLnJlamVjdChyKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghcmVzb2x2ZWQpIC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMy4zXSAgKi9cbiAgICAgICAgcHJvbWlzZS5yZWplY3QoZSk7IC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMy40XSAgKi9cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICAvKiAgaGFuZGxlIG90aGVyIHZhbHVlcyAgKi9cbiAgcHJvbWlzZS5mdWxmaWxsKHgpOyAvKiAgW1Byb21pc2VzL0ErIDIuMy40LCAyLjMuMy40XSAgKi9cbn07XG5cbi8vIHNvIHdlIGFsd2F5cyBoYXZlIFByb21pc2UuYWxsKClcbmFwaS5hbGwgPSBmdW5jdGlvbiAocHMpIHtcbiAgcmV0dXJuIG5ldyBhcGkoZnVuY3Rpb24gKHJlc29sdmVBbGwsIHJlamVjdEFsbCkge1xuICAgIHZhciB2YWxzID0gbmV3IEFycmF5KHBzLmxlbmd0aCk7XG4gICAgdmFyIGRvbmVDb3VudCA9IDA7XG4gICAgdmFyIGZ1bGZpbGwgPSBmdW5jdGlvbiBmdWxmaWxsKGksIHZhbCkge1xuICAgICAgdmFsc1tpXSA9IHZhbDtcbiAgICAgIGRvbmVDb3VudCsrO1xuICAgICAgaWYgKGRvbmVDb3VudCA9PT0gcHMubGVuZ3RoKSB7XG4gICAgICAgIHJlc29sdmVBbGwodmFscyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgdmFyIHAgPSBwc1tpXTtcbiAgICAgICAgdmFyIGlzUHJvbWlzZSA9IHAgIT0gbnVsbCAmJiBwLnRoZW4gIT0gbnVsbDtcbiAgICAgICAgaWYgKGlzUHJvbWlzZSkge1xuICAgICAgICAgIHAudGhlbihmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICBmdWxmaWxsKGksIHZhbCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgcmVqZWN0QWxsKGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHZhbCA9IHA7XG4gICAgICAgICAgZnVsZmlsbChpLCB2YWwpO1xuICAgICAgICB9XG4gICAgICB9KShpKTtcbiAgICB9XG4gIH0pO1xufTtcbmFwaS5yZXNvbHZlID0gZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4gbmV3IGFwaShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgcmVzb2x2ZSh2YWwpO1xuICB9KTtcbn07XG5hcGkucmVqZWN0ID0gZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4gbmV3IGFwaShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgcmVqZWN0KHZhbCk7XG4gIH0pO1xufTtcbnZhciBQcm9taXNlJDEgPSB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgPyBQcm9taXNlIDogYXBpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbnZhciBBbmltYXRpb24gPSBmdW5jdGlvbiBBbmltYXRpb24odGFyZ2V0LCBvcHRzLCBvcHRzMikge1xuICB2YXIgaXNDb3JlID0gY29yZSh0YXJnZXQpO1xuICB2YXIgaXNFbGUgPSAhaXNDb3JlO1xuICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlID0gZXh0ZW5kKHtcbiAgICBkdXJhdGlvbjogMTAwMFxuICB9LCBvcHRzLCBvcHRzMik7XG4gIF9wLnRhcmdldCA9IHRhcmdldDtcbiAgX3Auc3R5bGUgPSBfcC5zdHlsZSB8fCBfcC5jc3M7XG4gIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgX3AucGxheWluZyA9IGZhbHNlO1xuICBfcC5ob29rZWQgPSBmYWxzZTtcbiAgX3AuYXBwbHlpbmcgPSBmYWxzZTtcbiAgX3AucHJvZ3Jlc3MgPSAwO1xuICBfcC5jb21wbGV0ZXMgPSBbXTtcbiAgX3AuZnJhbWVzID0gW107XG4gIGlmIChfcC5jb21wbGV0ZSAmJiBmbiQ2KF9wLmNvbXBsZXRlKSkge1xuICAgIF9wLmNvbXBsZXRlcy5wdXNoKF9wLmNvbXBsZXRlKTtcbiAgfVxuICBpZiAoaXNFbGUpIHtcbiAgICB2YXIgcG9zID0gdGFyZ2V0LnBvc2l0aW9uKCk7XG4gICAgX3Auc3RhcnRQb3NpdGlvbiA9IF9wLnN0YXJ0UG9zaXRpb24gfHwge1xuICAgICAgeDogcG9zLngsXG4gICAgICB5OiBwb3MueVxuICAgIH07XG4gICAgX3Auc3RhcnRTdHlsZSA9IF9wLnN0YXJ0U3R5bGUgfHwgdGFyZ2V0LmN5KCkuc3R5bGUoKS5nZXRBbmltYXRpb25TdGFydFN0eWxlKHRhcmdldCwgX3Auc3R5bGUpO1xuICB9XG4gIGlmIChpc0NvcmUpIHtcbiAgICB2YXIgcGFuID0gdGFyZ2V0LnBhbigpO1xuICAgIF9wLnN0YXJ0UGFuID0ge1xuICAgICAgeDogcGFuLngsXG4gICAgICB5OiBwYW4ueVxuICAgIH07XG4gICAgX3Auc3RhcnRab29tID0gdGFyZ2V0Lnpvb20oKTtcbiAgfVxuXG4gIC8vIGZvciBmdXR1cmUgdGltZWxpbmUvYW5pbWF0aW9ucyBpbXBsXG4gIHRoaXMubGVuZ3RoID0gMTtcbiAgdGhpc1swXSA9IHRoaXM7XG59O1xudmFyIGFuaWZuID0gQW5pbWF0aW9uLnByb3RvdHlwZTtcbmV4dGVuZChhbmlmbiwge1xuICBpbnN0YW5jZVN0cmluZzogZnVuY3Rpb24gaW5zdGFuY2VTdHJpbmcoKSB7XG4gICAgcmV0dXJuICdhbmltYXRpb24nO1xuICB9LFxuICBob29rOiBmdW5jdGlvbiBob29rKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgaWYgKCFfcC5ob29rZWQpIHtcbiAgICAgIC8vIGFkZCB0byB0YXJnZXQncyBhbmltYXRpb24gcXVldWVcbiAgICAgIHZhciBxO1xuICAgICAgdmFyIHRBbmkgPSBfcC50YXJnZXQuX3ByaXZhdGUuYW5pbWF0aW9uO1xuICAgICAgaWYgKF9wLnF1ZXVlKSB7XG4gICAgICAgIHEgPSB0QW5pLnF1ZXVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcSA9IHRBbmkuY3VycmVudDtcbiAgICAgIH1cbiAgICAgIHEucHVzaCh0aGlzKTtcblxuICAgICAgLy8gYWRkIHRvIHRoZSBhbmltYXRpb24gbG9vcCBwb29sXG4gICAgICBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihfcC50YXJnZXQpKSB7XG4gICAgICAgIF9wLnRhcmdldC5jeSgpLmFkZFRvQW5pbWF0aW9uUG9vbChfcC50YXJnZXQpO1xuICAgICAgfVxuICAgICAgX3AuaG9va2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHBsYXk6IGZ1bmN0aW9uIHBsYXkoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcblxuICAgIC8vIGF1dG9yZXdpbmRcbiAgICBpZiAoX3AucHJvZ3Jlc3MgPT09IDEpIHtcbiAgICAgIF9wLnByb2dyZXNzID0gMDtcbiAgICB9XG4gICAgX3AucGxheWluZyA9IHRydWU7XG4gICAgX3Auc3RhcnRlZCA9IGZhbHNlOyAvLyBuZWVkcyB0byBiZSBzdGFydGVkIGJ5IGFuaW1hdGlvbiBsb29wXG4gICAgX3Auc3RvcHBlZCA9IGZhbHNlO1xuICAgIHRoaXMuaG9vaygpO1xuXG4gICAgLy8gdGhlIGFuaW1hdGlvbiBsb29wIHdpbGwgc3RhcnQgdGhlIGFuaW1hdGlvbi4uLlxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHBsYXlpbmc6IGZ1bmN0aW9uIHBsYXlpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUucGxheWluZztcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgX3AuYXBwbHlpbmcgPSB0cnVlO1xuICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTsgLy8gbmVlZHMgdG8gYmUgc3RhcnRlZCBieSBhbmltYXRpb24gbG9vcFxuICAgIF9wLnN0b3BwZWQgPSBmYWxzZTtcbiAgICB0aGlzLmhvb2soKTtcblxuICAgIC8vIHRoZSBhbmltYXRpb24gbG9vcCB3aWxsIGFwcGx5IHRoZSBhbmltYXRpb24gYXQgdGhpcyBwcm9ncmVzc1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGFwcGx5aW5nOiBmdW5jdGlvbiBhcHBseWluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5hcHBseWluZztcbiAgfSxcbiAgcGF1c2U6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgX3AucGxheWluZyA9IGZhbHNlO1xuICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIF9wLnBsYXlpbmcgPSBmYWxzZTtcbiAgICBfcC5zdGFydGVkID0gZmFsc2U7XG4gICAgX3Auc3RvcHBlZCA9IHRydWU7IC8vIHRvIGJlIHJlbW92ZWQgZnJvbSBhbmltYXRpb24gcXVldWVzXG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmV3aW5kOiBmdW5jdGlvbiByZXdpbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3MoMCk7XG4gIH0sXG4gIGZhc3Rmb3J3YXJkOiBmdW5jdGlvbiBmYXN0Zm9yd2FyZCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmVzcygxKTtcbiAgfSxcbiAgdGltZTogZnVuY3Rpb24gdGltZSh0KSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gX3AucHJvZ3Jlc3MgKiBfcC5kdXJhdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3ModCAvIF9wLmR1cmF0aW9uKTtcbiAgICB9XG4gIH0sXG4gIHByb2dyZXNzOiBmdW5jdGlvbiBwcm9ncmVzcyhwKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgd2FzUGxheWluZyA9IF9wLnBsYXlpbmc7XG4gICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIF9wLnByb2dyZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgICB9XG4gICAgICBfcC5wcm9ncmVzcyA9IHA7XG4gICAgICBfcC5zdGFydGVkID0gZmFsc2U7XG4gICAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgICB0aGlzLnBsYXkoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGNvbXBsZXRlZDogZnVuY3Rpb24gY29tcGxldGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnByb2dyZXNzID09PSAxO1xuICB9LFxuICByZXZlcnNlOiBmdW5jdGlvbiByZXZlcnNlKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgdmFyIHdhc1BsYXlpbmcgPSBfcC5wbGF5aW5nO1xuICAgIGlmICh3YXNQbGF5aW5nKSB7XG4gICAgICB0aGlzLnBhdXNlKCk7XG4gICAgfVxuICAgIF9wLnByb2dyZXNzID0gMSAtIF9wLnByb2dyZXNzO1xuICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB2YXIgc3dhcCA9IGZ1bmN0aW9uIHN3YXAoYSwgYikge1xuICAgICAgdmFyIF9wYSA9IF9wW2FdO1xuICAgICAgaWYgKF9wYSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIF9wW2FdID0gX3BbYl07XG4gICAgICBfcFtiXSA9IF9wYTtcbiAgICB9O1xuICAgIHN3YXAoJ3pvb20nLCAnc3RhcnRab29tJyk7XG4gICAgc3dhcCgncGFuJywgJ3N0YXJ0UGFuJyk7XG4gICAgc3dhcCgncG9zaXRpb24nLCAnc3RhcnRQb3NpdGlvbicpO1xuXG4gICAgLy8gc3dhcCBzdHlsZXNcbiAgICBpZiAoX3Auc3R5bGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3Auc3R5bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHByb3AgPSBfcC5zdHlsZVtpXTtcbiAgICAgICAgdmFyIG5hbWUgPSBwcm9wLm5hbWU7XG4gICAgICAgIHZhciBzdGFydFN0eWxlUHJvcCA9IF9wLnN0YXJ0U3R5bGVbbmFtZV07XG4gICAgICAgIF9wLnN0YXJ0U3R5bGVbbmFtZV0gPSBwcm9wO1xuICAgICAgICBfcC5zdHlsZVtpXSA9IHN0YXJ0U3R5bGVQcm9wO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgdGhpcy5wbGF5KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBwcm9taXNlOiBmdW5jdGlvbiBwcm9taXNlKHR5cGUpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciBhcnI7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdmcmFtZSc6XG4gICAgICAgIGFyciA9IF9wLmZyYW1lcztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgY2FzZSAnY29tcGxldGUnOlxuICAgICAgY2FzZSAnY29tcGxldGVkJzpcbiAgICAgICAgYXJyID0gX3AuY29tcGxldGVzO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBhcnIucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59KTtcbmFuaWZuLmNvbXBsZXRlID0gYW5pZm4uY29tcGxldGVkO1xuYW5pZm4ucnVuID0gYW5pZm4ucGxheTtcbmFuaWZuLnJ1bm5pbmcgPSBhbmlmbi5wbGF5aW5nO1xuXG52YXIgZGVmaW5lJDMgPSB7XG4gIGFuaW1hdGVkOiBmdW5jdGlvbiBhbmltYXRlZCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gYW5pbWF0ZWRJbXBsKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlbGZJc0FycmF5TGlrZSA9IHNlbGYubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgYWxsID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZiA6IFtzZWxmXTsgLy8gcHV0IGluIGFycmF5IGlmIG5vdCBhcnJheS1saWtlXG4gICAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5IHx8IHRoaXM7XG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBlbGUgPSBhbGxbMF07XG4gICAgICBpZiAoZWxlKSB7XG4gICAgICAgIHJldHVybiBlbGUuX3ByaXZhdGUuYW5pbWF0aW9uLmN1cnJlbnQubGVuZ3RoID4gMDtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICAvLyBhbmltYXRlZFxuXG4gIGNsZWFyUXVldWU6IGZ1bmN0aW9uIGNsZWFyUXVldWUoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGNsZWFyUXVldWVJbXBsKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlbGZJc0FycmF5TGlrZSA9IHNlbGYubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgYWxsID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZiA6IFtzZWxmXTsgLy8gcHV0IGluIGFycmF5IGlmIG5vdCBhcnJheS1saWtlXG4gICAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5IHx8IHRoaXM7XG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGFsbFtpXTtcbiAgICAgICAgZWxlLl9wcml2YXRlLmFuaW1hdGlvbi5xdWV1ZSA9IFtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfSxcbiAgLy8gY2xlYXJRdWV1ZVxuXG4gIGRlbGF5OiBmdW5jdGlvbiBkZWxheSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gZGVsYXlJbXBsKHRpbWUsIGNvbXBsZXRlKSB7XG4gICAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5IHx8IHRoaXM7XG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0ZSh7XG4gICAgICAgIGRlbGF5OiB0aW1lLFxuICAgICAgICBkdXJhdGlvbjogdGltZSxcbiAgICAgICAgY29tcGxldGU6IGNvbXBsZXRlXG4gICAgICB9KTtcbiAgICB9O1xuICB9LFxuICAvLyBkZWxheVxuXG4gIGRlbGF5QW5pbWF0aW9uOiBmdW5jdGlvbiBkZWxheUFuaW1hdGlvbigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gZGVsYXlBbmltYXRpb25JbXBsKHRpbWUsIGNvbXBsZXRlKSB7XG4gICAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5IHx8IHRoaXM7XG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0aW9uKHtcbiAgICAgICAgZGVsYXk6IHRpbWUsXG4gICAgICAgIGR1cmF0aW9uOiB0aW1lLFxuICAgICAgICBjb21wbGV0ZTogY29tcGxldGVcbiAgICAgIH0pO1xuICAgIH07XG4gIH0sXG4gIC8vIGRlbGF5XG5cbiAgYW5pbWF0aW9uOiBmdW5jdGlvbiBhbmltYXRpb24oKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGFuaW1hdGlvbkltcGwocHJvcGVydGllcywgcGFyYW1zKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIHZhciBpc0NvcmUgPSAhc2VsZklzQXJyYXlMaWtlO1xuICAgICAgdmFyIGlzRWxlcyA9ICFpc0NvcmU7XG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgICAgIHByb3BlcnRpZXMgPSBleHRlbmQoe30sIHByb3BlcnRpZXMsIHBhcmFtcyk7XG4gICAgICB2YXIgcHJvcGVydGllc0VtcHR5ID0gT2JqZWN0LmtleXMocHJvcGVydGllcykubGVuZ3RoID09PSAwO1xuICAgICAgaWYgKHByb3BlcnRpZXNFbXB0eSkge1xuICAgICAgICByZXR1cm4gbmV3IEFuaW1hdGlvbihhbGxbMF0sIHByb3BlcnRpZXMpOyAvLyBub3RoaW5nIHRvIGFuaW1hdGVcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BlcnRpZXMuZHVyYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wZXJ0aWVzLmR1cmF0aW9uID0gNDAwO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChwcm9wZXJ0aWVzLmR1cmF0aW9uKSB7XG4gICAgICAgIGNhc2UgJ3Nsb3cnOlxuICAgICAgICAgIHByb3BlcnRpZXMuZHVyYXRpb24gPSA2MDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Zhc3QnOlxuICAgICAgICAgIHByb3BlcnRpZXMuZHVyYXRpb24gPSAyMDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaXNFbGVzKSB7XG4gICAgICAgIHByb3BlcnRpZXMuc3R5bGUgPSBzdHlsZS5nZXRQcm9wc0xpc3QocHJvcGVydGllcy5zdHlsZSB8fCBwcm9wZXJ0aWVzLmNzcyk7XG4gICAgICAgIHByb3BlcnRpZXMuY3NzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKGlzRWxlcyAmJiBwcm9wZXJ0aWVzLnJlbmRlcmVkUG9zaXRpb24gIT0gbnVsbCkge1xuICAgICAgICB2YXIgcnBvcyA9IHByb3BlcnRpZXMucmVuZGVyZWRQb3NpdGlvbjtcbiAgICAgICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgICAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICAgICAgcHJvcGVydGllcy5wb3NpdGlvbiA9IHJlbmRlcmVkVG9Nb2RlbFBvc2l0aW9uKHJwb3MsIHpvb20sIHBhbik7XG4gICAgICB9XG5cbiAgICAgIC8vIG92ZXJyaWRlIHBhbiB3LyBwYW5CeSBpZiBzZXRcbiAgICAgIGlmIChpc0NvcmUgJiYgcHJvcGVydGllcy5wYW5CeSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBwYW5CeSA9IHByb3BlcnRpZXMucGFuQnk7XG4gICAgICAgIHZhciBjeVBhbiA9IGN5LnBhbigpO1xuICAgICAgICBwcm9wZXJ0aWVzLnBhbiA9IHtcbiAgICAgICAgICB4OiBjeVBhbi54ICsgcGFuQnkueCxcbiAgICAgICAgICB5OiBjeVBhbi55ICsgcGFuQnkueVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBvdmVycmlkZSBwYW4gdy8gY2VudGVyIGlmIHNldFxuICAgICAgdmFyIGNlbnRlciA9IHByb3BlcnRpZXMuY2VudGVyIHx8IHByb3BlcnRpZXMuY2VudHJlO1xuICAgICAgaWYgKGlzQ29yZSAmJiBjZW50ZXIgIT0gbnVsbCkge1xuICAgICAgICB2YXIgY2VudGVyUGFuID0gY3kuZ2V0Q2VudGVyUGFuKGNlbnRlci5lbGVzLCBwcm9wZXJ0aWVzLnpvb20pO1xuICAgICAgICBpZiAoY2VudGVyUGFuICE9IG51bGwpIHtcbiAgICAgICAgICBwcm9wZXJ0aWVzLnBhbiA9IGNlbnRlclBhbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBvdmVycmlkZSBwYW4gJiB6b29tIHcvIGZpdCBpZiBzZXRcbiAgICAgIGlmIChpc0NvcmUgJiYgcHJvcGVydGllcy5maXQgIT0gbnVsbCkge1xuICAgICAgICB2YXIgZml0ID0gcHJvcGVydGllcy5maXQ7XG4gICAgICAgIHZhciBmaXRWcCA9IGN5LmdldEZpdFZpZXdwb3J0KGZpdC5lbGVzIHx8IGZpdC5ib3VuZGluZ0JveCwgZml0LnBhZGRpbmcpO1xuICAgICAgICBpZiAoZml0VnAgIT0gbnVsbCkge1xuICAgICAgICAgIHByb3BlcnRpZXMucGFuID0gZml0VnAucGFuO1xuICAgICAgICAgIHByb3BlcnRpZXMuem9vbSA9IGZpdFZwLnpvb207XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gb3ZlcnJpZGUgem9vbSAoJiBwb3RlbnRpYWxseSBwYW4pIHcvIHpvb20gb2JqIGlmIHNldFxuICAgICAgaWYgKGlzQ29yZSAmJiBwbGFpbk9iamVjdChwcm9wZXJ0aWVzLnpvb20pKSB7XG4gICAgICAgIHZhciB2cCA9IGN5LmdldFpvb21lZFZpZXdwb3J0KHByb3BlcnRpZXMuem9vbSk7XG4gICAgICAgIGlmICh2cCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHZwLnpvb21lZCkge1xuICAgICAgICAgICAgcHJvcGVydGllcy56b29tID0gdnAuem9vbTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZwLnBhbm5lZCkge1xuICAgICAgICAgICAgcHJvcGVydGllcy5wYW4gPSB2cC5wYW47XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BlcnRpZXMuem9vbSA9IG51bGw7IC8vIGFuIGluYXZhbGlkIHpvb20gKGUuZy4gbm8gZGVsdGEpIGdldHMgYXV0b21hdGljYWxseSBkZXN0cm95ZWRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEFuaW1hdGlvbihhbGxbMF0sIHByb3BlcnRpZXMpO1xuICAgIH07XG4gIH0sXG4gIC8vIGFuaW1hdGVcblxuICBhbmltYXRlOiBmdW5jdGlvbiBhbmltYXRlKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBhbmltYXRlSW1wbChwcm9wZXJ0aWVzLCBwYXJhbXMpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzZWxmSXNBcnJheUxpa2UgPSBzZWxmLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGFsbCA9IHNlbGZJc0FycmF5TGlrZSA/IHNlbGYgOiBbc2VsZl07IC8vIHB1dCBpbiBhcnJheSBpZiBub3QgYXJyYXktbGlrZVxuICAgICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeSB8fCB0aGlzO1xuICAgICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgcHJvcGVydGllcyA9IGV4dGVuZCh7fSwgcHJvcGVydGllcywgcGFyYW1zKTtcbiAgICAgIH1cblxuICAgICAgLy8gbWFudWFsbHkgaG9vayBhbmQgcnVuIHRoZSBhbmltYXRpb25cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBhbGxbaV07XG4gICAgICAgIHZhciBxdWV1ZSA9IGVsZS5hbmltYXRlZCgpICYmIChwcm9wZXJ0aWVzLnF1ZXVlID09PSB1bmRlZmluZWQgfHwgcHJvcGVydGllcy5xdWV1ZSk7XG4gICAgICAgIHZhciBhbmkgPSBlbGUuYW5pbWF0aW9uKHByb3BlcnRpZXMsIHF1ZXVlID8ge1xuICAgICAgICAgIHF1ZXVlOiB0cnVlXG4gICAgICAgIH0gOiB1bmRlZmluZWQpO1xuICAgICAgICBhbmkucGxheSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gICAgfTtcbiAgfSxcblxuICAvLyBhbmltYXRlXG5cbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gc3RvcEltcGwoY2xlYXJRdWV1ZSwganVtcFRvRW5kKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gYWxsW2ldO1xuICAgICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICAgIHZhciBhbmlzID0gX3AuYW5pbWF0aW9uLmN1cnJlbnQ7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYW5pcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHZhciBhbmkgPSBhbmlzW2pdO1xuICAgICAgICAgIHZhciBhbmlfcCA9IGFuaS5fcHJpdmF0ZTtcbiAgICAgICAgICBpZiAoanVtcFRvRW5kKSB7XG4gICAgICAgICAgICAvLyBuZXh0IGl0ZXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGxvb3AsIHRoZSBhbmltYXRpb25cbiAgICAgICAgICAgIC8vIHdpbGwgZ28gc3RyYWlnaHQgdG8gdGhlIGVuZCBhbmQgYmUgcmVtb3ZlZFxuICAgICAgICAgICAgYW5pX3AuZHVyYXRpb24gPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNsZWFyIHRoZSBxdWV1ZSBvZiBmdXR1cmUgYW5pbWF0aW9uc1xuICAgICAgICBpZiAoY2xlYXJRdWV1ZSkge1xuICAgICAgICAgIF9wLmFuaW1hdGlvbi5xdWV1ZSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghanVtcFRvRW5kKSB7XG4gICAgICAgICAgX3AuYW5pbWF0aW9uLmN1cnJlbnQgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyB3ZSBoYXZlIHRvIG5vdGlmeSAodGhlIGFuaW1hdGlvbiBsb29wIGRvZXNuJ3QgZG8gaXQgZm9yIHVzIG9uIGBzdG9wYClcbiAgICAgIGN5Lm5vdGlmeSgnZHJhdycpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfSAvLyBzdG9wXG59OyAvLyBkZWZpbmVcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbnZhciBpc0FycmF5XzEgPSBpc0FycmF5O1xuXG4vKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVJc0RlZXBQcm9wID0gL1xcLnxcXFsoPzpbXltcXF1dKnwoW1wiJ10pKD86KD8hXFwxKVteXFxcXF18XFxcXC4pKj9cXDEpXFxdLyxcbiAgICByZUlzUGxhaW5Qcm9wID0gL15cXHcqJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lIGFuZCBub3QgYSBwcm9wZXJ0eSBwYXRoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkge1xuICBpZiAoaXNBcnJheV8xKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgdmFsdWUgPT0gbnVsbCB8fCBpc1N5bWJvbF8xKHZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpIHx8ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcbiAgICAob2JqZWN0ICE9IG51bGwgJiYgdmFsdWUgaW4gT2JqZWN0KG9iamVjdCkpO1xufVxuXG52YXIgX2lzS2V5ID0gaXNLZXk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhc3luY1RhZyA9ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHByb3h5VGFnID0gJ1tvYmplY3QgUHJveHldJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdF8xKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBfYmFzZUdldFRhZyh2YWx1ZSk7XG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG59XG5cbnZhciBpc0Z1bmN0aW9uXzEgPSBpc0Z1bmN0aW9uO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG52YXIgY29yZUpzRGF0YSA9IF9yb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxudmFyIF9jb3JlSnNEYXRhID0gY29yZUpzRGF0YTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbnZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhfY29yZUpzRGF0YSAmJiBfY29yZUpzRGF0YS5rZXlzICYmIF9jb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG59KCkpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcbiAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbn1cblxudmFyIF9pc01hc2tlZCA9IGlzTWFza2VkO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvJDEgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmckMSA9IGZ1bmNQcm90byQxLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmckMS5jYWxsKGZ1bmMpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoZnVuYyArICcnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG4gIHJldHVybiAnJztcbn1cblxudmFyIF90b1NvdXJjZSA9IHRvU291cmNlO1xuXG4vKipcbiAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICovXG52YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG52YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byQzID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkkMyA9IG9iamVjdFByb3RvJDMuaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG52YXIgcmVJc05hdGl2ZSA9IFJlZ0V4cCgnXicgK1xuICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSQzKS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJ1xuKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdF8xKHZhbHVlKSB8fCBfaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbl8xKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gIHJldHVybiBwYXR0ZXJuLnRlc3QoX3RvU291cmNlKHZhbHVlKSk7XG59XG5cbnZhciBfYmFzZUlzTmF0aXZlID0gYmFzZUlzTmF0aXZlO1xuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZSQxKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xufVxuXG52YXIgX2dldFZhbHVlID0gZ2V0VmFsdWUkMTtcblxuLyoqXG4gKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBpZiBpdCdzIG5hdGl2ZSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gIHZhciB2YWx1ZSA9IF9nZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gIHJldHVybiBfYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG52YXIgX2dldE5hdGl2ZSA9IGdldE5hdGl2ZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIG5hdGl2ZUNyZWF0ZSA9IF9nZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XG5cbnZhciBfbmF0aXZlQ3JlYXRlID0gbmF0aXZlQ3JlYXRlO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgSGFzaFxuICovXG5mdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBfbmF0aXZlQ3JlYXRlID8gX25hdGl2ZUNyZWF0ZShudWxsKSA6IHt9O1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG52YXIgX2hhc2hDbGVhciA9IGhhc2hDbGVhcjtcblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIF9oYXNoRGVsZXRlID0gaGFzaERlbGV0ZTtcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEJDEgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byQyID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkkMiA9IG9iamVjdFByb3RvJDIuaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogR2V0cyB0aGUgaGFzaCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIGlmIChfbmF0aXZlQ3JlYXRlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5XTtcbiAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCQxID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICB9XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eSQyLmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxudmFyIF9oYXNoR2V0ID0gaGFzaEdldDtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvJDEgPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSQxID0gb2JqZWN0UHJvdG8kMS5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHJldHVybiBfbmF0aXZlQ3JlYXRlID8gKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkKSA6IGhhc093blByb3BlcnR5JDEuY2FsbChkYXRhLCBrZXkpO1xufVxuXG52YXIgX2hhc2hIYXMgPSBoYXNoSGFzO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKlxuICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHRoaXMuc2l6ZSArPSB0aGlzLmhhcyhrZXkpID8gMCA6IDE7XG4gIGRhdGFba2V5XSA9IChfbmF0aXZlQ3JlYXRlICYmIHZhbHVlID09PSB1bmRlZmluZWQpID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbnZhciBfaGFzaFNldCA9IGhhc2hTZXQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBfaGFzaENsZWFyO1xuSGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddID0gX2hhc2hEZWxldGU7XG5IYXNoLnByb3RvdHlwZS5nZXQgPSBfaGFzaEdldDtcbkhhc2gucHJvdG90eXBlLmhhcyA9IF9oYXNoSGFzO1xuSGFzaC5wcm90b3R5cGUuc2V0ID0gX2hhc2hTZXQ7XG5cbnZhciBfSGFzaCA9IEhhc2g7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxudmFyIF9saXN0Q2FjaGVDbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xuXG4vKipcbiAqIFBlcmZvcm1zIGFcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gKlxuICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcSgnYScsICdhJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcShOYU4sIE5hTik7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPT09IG90aGVyIHx8ICh2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyKTtcbn1cblxudmFyIGVxXzEgPSBlcTtcblxuLyoqXG4gKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSBrZXkgVGhlIGtleSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LCBrZXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgaWYgKGVxXzEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xuICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG52YXIgX2Fzc29jSW5kZXhPZiA9IGFzc29jSW5kZXhPZjtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gX2Fzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgaWYgKGluZGV4ID09IGxhc3RJbmRleCkge1xuICAgIGRhdGEucG9wKCk7XG4gIH0gZWxzZSB7XG4gICAgc3BsaWNlLmNhbGwoZGF0YSwgaW5kZXgsIDEpO1xuICB9XG4gIC0tdGhpcy5zaXplO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxudmFyIF9saXN0Q2FjaGVEZWxldGUgPSBsaXN0Q2FjaGVEZWxldGU7XG5cbi8qKlxuICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBfYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IGRhdGFbaW5kZXhdWzFdO1xufVxuXG52YXIgX2xpc3RDYWNoZUdldCA9IGxpc3RDYWNoZUdldDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIF9hc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXywga2V5KSA+IC0xO1xufVxuXG52YXIgX2xpc3RDYWNoZUhhcyA9IGxpc3RDYWNoZUhhcztcblxuLyoqXG4gKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IF9hc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgKyt0aGlzLnNpemU7XG4gICAgZGF0YS5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0gZWxzZSB7XG4gICAgZGF0YVtpbmRleF1bMV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxudmFyIF9saXN0Q2FjaGVTZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG5MaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gX2xpc3RDYWNoZUNsZWFyO1xuTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBfbGlzdENhY2hlRGVsZXRlO1xuTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBfbGlzdENhY2hlR2V0O1xuTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBfbGlzdENhY2hlSGFzO1xuTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBfbGlzdENhY2hlU2V0O1xuXG52YXIgX0xpc3RDYWNoZSA9IExpc3RDYWNoZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIE1hcCQxID0gX2dldE5hdGl2ZShfcm9vdCwgJ01hcCcpO1xuXG52YXIgX01hcCA9IE1hcCQxO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkge1xuICB0aGlzLnNpemUgPSAwO1xuICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICdoYXNoJzogbmV3IF9IYXNoLFxuICAgICdtYXAnOiBuZXcgKF9NYXAgfHwgX0xpc3RDYWNoZSksXG4gICAgJ3N0cmluZyc6IG5ldyBfSGFzaFxuICB9O1xufVxuXG52YXIgX21hcENhY2hlQ2xlYXIgPSBtYXBDYWNoZUNsZWFyO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgdW5pcXVlIG9iamVjdCBrZXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuICAgID8gKHZhbHVlICE9PSAnX19wcm90b19fJylcbiAgICA6ICh2YWx1ZSA9PT0gbnVsbCk7XG59XG5cbnZhciBfaXNLZXlhYmxlID0gaXNLZXlhYmxlO1xuXG4vKipcbiAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hcCBkYXRhLlxuICovXG5mdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XG4gIHZhciBkYXRhID0gbWFwLl9fZGF0YV9fO1xuICByZXR1cm4gX2lzS2V5YWJsZShrZXkpXG4gICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICA6IGRhdGEubWFwO1xufVxuXG52YXIgX2dldE1hcERhdGEgPSBnZXRNYXBEYXRhO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSBfZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbnZhciBfbWFwQ2FjaGVEZWxldGUgPSBtYXBDYWNoZURlbGV0ZTtcblxuLyoqXG4gKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuICByZXR1cm4gX2dldE1hcERhdGEodGhpcywga2V5KS5nZXQoa2V5KTtcbn1cblxudmFyIF9tYXBDYWNoZUdldCA9IG1hcENhY2hlR2V0O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gX2dldE1hcERhdGEodGhpcywga2V5KS5oYXMoa2V5KTtcbn1cblxudmFyIF9tYXBDYWNoZUhhcyA9IG1hcENhY2hlSGFzO1xuXG4vKipcbiAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSBfZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLFxuICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgdGhpcy5zaXplICs9IGRhdGEuc2l6ZSA9PSBzaXplID8gMCA6IDE7XG4gIHJldHVybiB0aGlzO1xufVxuXG52YXIgX21hcENhY2hlU2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hcCBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBNYXBDYWNoZWAuXG5NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBfbWFwQ2FjaGVDbGVhcjtcbk1hcENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBfbWFwQ2FjaGVEZWxldGU7XG5NYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gX21hcENhY2hlR2V0O1xuTWFwQ2FjaGUucHJvdG90eXBlLmhhcyA9IF9tYXBDYWNoZUhhcztcbk1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBfbWFwQ2FjaGVTZXQ7XG5cbnZhciBfTWFwQ2FjaGUgPSBNYXBDYWNoZTtcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBtZW1vaXplcyB0aGUgcmVzdWx0IG9mIGBmdW5jYC4gSWYgYHJlc29sdmVyYCBpc1xuICogcHJvdmlkZWQsIGl0IGRldGVybWluZXMgdGhlIGNhY2hlIGtleSBmb3Igc3RvcmluZyB0aGUgcmVzdWx0IGJhc2VkIG9uIHRoZVxuICogYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGFyZ3VtZW50XG4gKiBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgbWFwIGNhY2hlIGtleS4gVGhlIGBmdW5jYFxuICogaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKlxuICogKipOb3RlOioqIFRoZSBjYWNoZSBpcyBleHBvc2VkIGFzIHRoZSBgY2FjaGVgIHByb3BlcnR5IG9uIHRoZSBtZW1vaXplZFxuICogZnVuY3Rpb24uIEl0cyBjcmVhdGlvbiBtYXkgYmUgY3VzdG9taXplZCBieSByZXBsYWNpbmcgdGhlIGBfLm1lbW9pemUuQ2FjaGVgXG4gKiBjb25zdHJ1Y3RvciB3aXRoIG9uZSB3aG9zZSBpbnN0YW5jZXMgaW1wbGVtZW50IHRoZVxuICogW2BNYXBgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1tYXAtcHJvdG90eXBlLW9iamVjdClcbiAqIG1ldGhvZCBpbnRlcmZhY2Ugb2YgYGNsZWFyYCwgYGRlbGV0ZWAsIGBnZXRgLCBgaGFzYCwgYW5kIGBzZXRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdjJzogMywgJ2QnOiA0IH07XG4gKlxuICogdmFyIHZhbHVlcyA9IF8ubWVtb2l6ZShfLnZhbHVlcyk7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsxLCAyXVxuICpcbiAqIHZhbHVlcyhvdGhlcik7XG4gKiAvLyA9PiBbMywgNF1cbiAqXG4gKiBvYmplY3QuYSA9IDI7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsxLCAyXVxuICpcbiAqIC8vIE1vZGlmeSB0aGUgcmVzdWx0IGNhY2hlLlxuICogdmFsdWVzLmNhY2hlLnNldChvYmplY3QsIFsnYScsICdiJ10pO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbJ2EnLCAnYiddXG4gKlxuICogLy8gUmVwbGFjZSBgXy5tZW1vaXplLkNhY2hlYC5cbiAqIF8ubWVtb2l6ZS5DYWNoZSA9IFdlYWtNYXA7XG4gKi9cbmZ1bmN0aW9uIG1lbW9pemUoZnVuYywgcmVzb2x2ZXIpIHtcbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicgfHwgKHJlc29sdmVyICE9IG51bGwgJiYgdHlwZW9mIHJlc29sdmVyICE9ICdmdW5jdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBrZXkgPSByZXNvbHZlciA/IHJlc29sdmVyLmFwcGx5KHRoaXMsIGFyZ3MpIDogYXJnc1swXSxcbiAgICAgICAgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcblxuICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXkpO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBtZW1vaXplZC5jYWNoZSA9IGNhY2hlLnNldChrZXksIHJlc3VsdCkgfHwgY2FjaGU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgbWVtb2l6ZWQuY2FjaGUgPSBuZXcgKG1lbW9pemUuQ2FjaGUgfHwgX01hcENhY2hlKTtcbiAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG4vLyBFeHBvc2UgYE1hcENhY2hlYC5cbm1lbW9pemUuQ2FjaGUgPSBfTWFwQ2FjaGU7XG5cbnZhciBtZW1vaXplXzEgPSBtZW1vaXplO1xuXG4vKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG52YXIgTUFYX01FTU9JWkVfU0laRSA9IDUwMDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gKiBjYWNoZSB3aGVuIGl0IGV4Y2VlZHMgYE1BWF9NRU1PSVpFX1NJWkVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZUNhcHBlZChmdW5jKSB7XG4gIHZhciByZXN1bHQgPSBtZW1vaXplXzEoZnVuYywgZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKGNhY2hlLnNpemUgPT09IE1BWF9NRU1PSVpFX1NJWkUpIHtcbiAgICAgIGNhY2hlLmNsZWFyKCk7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH0pO1xuXG4gIHZhciBjYWNoZSA9IHJlc3VsdC5jYWNoZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIF9tZW1vaXplQ2FwcGVkID0gbWVtb2l6ZUNhcHBlZDtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlUHJvcE5hbWUgPSAvW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2c7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBfbWVtb2l6ZUNhcHBlZChmdW5jdGlvbihzdHJpbmcpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpZiAoc3RyaW5nLmNoYXJDb2RlQXQoMCkgPT09IDQ2IC8qIC4gKi8pIHtcbiAgICByZXN1bHQucHVzaCgnJyk7XG4gIH1cbiAgc3RyaW5nLnJlcGxhY2UocmVQcm9wTmFtZSwgZnVuY3Rpb24obWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuICAgIHJlc3VsdC5wdXNoKHF1b3RlID8gc3ViU3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCAnJDEnKSA6IChudW1iZXIgfHwgbWF0Y2gpKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxudmFyIF9zdHJpbmdUb1BhdGggPSBzdHJpbmdUb1BhdGg7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbnZhciBfYXJyYXlNYXAgPSBhcnJheU1hcDtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkkMSA9IDEgLyAwO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbnZhciBzeW1ib2xQcm90byA9IF9TeW1ib2wgPyBfU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udG9TdHJpbmcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gIC8vIEV4aXQgZWFybHkgZm9yIHN0cmluZ3MgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSBoaXQgaW4gc29tZSBlbnZpcm9ubWVudHMuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzQXJyYXlfMSh2YWx1ZSkpIHtcbiAgICAvLyBSZWN1cnNpdmVseSBjb252ZXJ0IHZhbHVlcyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIHJldHVybiBfYXJyYXlNYXAodmFsdWUsIGJhc2VUb1N0cmluZykgKyAnJztcbiAgfVxuICBpZiAoaXNTeW1ib2xfMSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkkMSkgPyAnLTAnIDogcmVzdWx0O1xufVxuXG52YXIgX2Jhc2VUb1N0cmluZyA9IGJhc2VUb1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nLiBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgZm9yIGBudWxsYFxuICogYW5kIGB1bmRlZmluZWRgIHZhbHVlcy4gVGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvU3RyaW5nKG51bGwpO1xuICogLy8gPT4gJydcbiAqXG4gKiBfLnRvU3RyaW5nKC0wKTtcbiAqIC8vID0+ICctMCdcbiAqXG4gKiBfLnRvU3RyaW5nKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiAnMSwyLDMnXG4gKi9cbmZ1bmN0aW9uIHRvU3RyaW5nJDEodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IF9iYXNlVG9TdHJpbmcodmFsdWUpO1xufVxuXG52YXIgdG9TdHJpbmdfMSA9IHRvU3RyaW5nJDE7XG5cbi8qKlxuICogQ2FzdHMgYHZhbHVlYCB0byBhIHBhdGggYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICovXG5mdW5jdGlvbiBjYXN0UGF0aCh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5XzEodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBfaXNLZXkodmFsdWUsIG9iamVjdCkgPyBbdmFsdWVdIDogX3N0cmluZ1RvUGF0aCh0b1N0cmluZ18xKHZhbHVlKSk7XG59XG5cbnZhciBfY2FzdFBhdGggPSBjYXN0UGF0aDtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGtleSBpZiBpdCdzIG5vdCBhIHN0cmluZyBvciBzeW1ib2wuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICovXG5mdW5jdGlvbiB0b0tleSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sXzEodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxudmFyIF90b0tleSA9IHRvS2V5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHBhdGgpIHtcbiAgcGF0aCA9IF9jYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IDAsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICB3aGlsZSAob2JqZWN0ICE9IG51bGwgJiYgaW5kZXggPCBsZW5ndGgpIHtcbiAgICBvYmplY3QgPSBvYmplY3RbX3RvS2V5KHBhdGhbaW5kZXgrK10pXTtcbiAgfVxuICByZXR1cm4gKGluZGV4ICYmIGluZGV4ID09IGxlbmd0aCkgPyBvYmplY3QgOiB1bmRlZmluZWQ7XG59XG5cbnZhciBfYmFzZUdldCA9IGJhc2VHZXQ7XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXNcbiAqIGB1bmRlZmluZWRgLCB0aGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaW4gaXRzIHBsYWNlLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy43LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgJ2FbMF0uYi5jJyk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5nZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5nZXQob2JqZWN0LCAnYS5iLmMnLCAnZGVmYXVsdCcpO1xuICogLy8gPT4gJ2RlZmF1bHQnXG4gKi9cbmZ1bmN0aW9uIGdldChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBfYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG59XG5cbnZhciBnZXRfMSA9IGdldDtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIHZhciBmdW5jID0gX2dldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpO1xuICAgIGZ1bmMoe30sICcnLCB7fSk7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGFzc2lnblZhbHVlYCBhbmQgYGFzc2lnbk1lcmdlVmFsdWVgIHdpdGhvdXRcbiAqIHZhbHVlIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgPT0gJ19fcHJvdG9fXycgJiYgX2RlZmluZVByb3BlcnR5KSB7XG4gICAgX2RlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7XG4gICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICdlbnVtZXJhYmxlJzogdHJ1ZSxcbiAgICAgICd2YWx1ZSc6IHZhbHVlLFxuICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIH1cbn1cblxudmFyIF9iYXNlQXNzaWduVmFsdWUgPSBiYXNlQXNzaWduVmFsdWU7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQXNzaWducyBgdmFsdWVgIHRvIGBrZXlgIG9mIGBvYmplY3RgIGlmIHRoZSBleGlzdGluZyB2YWx1ZSBpcyBub3QgZXF1aXZhbGVudFxuICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV07XG4gIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxXzEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgX2Jhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICB9XG59XG5cbnZhciBfYXNzaWduVmFsdWUgPSBhc3NpZ25WYWx1ZTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGUgPT0gJ251bWJlcicgfHxcbiAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG52YXIgX2lzSW5kZXggPSBpc0luZGV4O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNldGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikge1xuICBpZiAoIWlzT2JqZWN0XzEob2JqZWN0KSkge1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cbiAgcGF0aCA9IF9jYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxLFxuICAgICAgbmVzdGVkID0gb2JqZWN0O1xuXG4gIHdoaWxlIChuZXN0ZWQgIT0gbnVsbCAmJiArK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IF90b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJyB8fCBrZXkgPT09ICdjb25zdHJ1Y3RvcicgfHwga2V5ID09PSAncHJvdG90eXBlJykge1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggIT0gbGFzdEluZGV4KSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3RfMShvYmpWYWx1ZSlcbiAgICAgICAgICA/IG9ialZhbHVlXG4gICAgICAgICAgOiAoX2lzSW5kZXgocGF0aFtpbmRleCArIDFdKSA/IFtdIDoge30pO1xuICAgICAgfVxuICAgIH1cbiAgICBfYXNzaWduVmFsdWUobmVzdGVkLCBrZXksIG5ld1ZhbHVlKTtcbiAgICBuZXN0ZWQgPSBuZXN0ZWRba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG52YXIgX2Jhc2VTZXQgPSBiYXNlU2V0O1xuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgYSBwb3J0aW9uIG9mIGBwYXRoYCBkb2Vzbid0IGV4aXN0LFxuICogaXQncyBjcmVhdGVkLiBBcnJheXMgYXJlIGNyZWF0ZWQgZm9yIG1pc3NpbmcgaW5kZXggcHJvcGVydGllcyB3aGlsZSBvYmplY3RzXG4gKiBhcmUgY3JlYXRlZCBmb3IgYWxsIG90aGVyIG1pc3NpbmcgcHJvcGVydGllcy4gVXNlIGBfLnNldFdpdGhgIHRvIGN1c3RvbWl6ZVxuICogYHBhdGhgIGNyZWF0aW9uLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy43LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAqXG4gKiBfLnNldChvYmplY3QsICdhWzBdLmIuYycsIDQpO1xuICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcbiAqIC8vID0+IDRcbiAqXG4gKiBfLnNldChvYmplY3QsIFsneCcsICcwJywgJ3knLCAneiddLCA1KTtcbiAqIGNvbnNvbGUubG9nKG9iamVjdC54WzBdLnkueik7XG4gKiAvLyA9PiA1XG4gKi9cbmZ1bmN0aW9uIHNldChvYmplY3QsIHBhdGgsIHZhbHVlKSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IF9iYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpO1xufVxuXG52YXIgc2V0XzEgPSBzZXQ7XG5cbi8qKlxuICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgYHNvdXJjZWAgdG8gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuXG4gIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG52YXIgX2NvcHlBcnJheSA9IGNvcHlBcnJheTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9QYXRoKCdhLmIuYycpO1xuICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gKlxuICogXy50b1BhdGgoJ2FbMF0uYi5jJyk7XG4gKiAvLyA9PiBbJ2EnLCAnMCcsICdiJywgJ2MnXVxuICovXG5mdW5jdGlvbiB0b1BhdGgodmFsdWUpIHtcbiAgaWYgKGlzQXJyYXlfMSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gX2FycmF5TWFwKHZhbHVlLCBfdG9LZXkpO1xuICB9XG4gIHJldHVybiBpc1N5bWJvbF8xKHZhbHVlKSA/IFt2YWx1ZV0gOiBfY29weUFycmF5KF9zdHJpbmdUb1BhdGgodG9TdHJpbmdfMSh2YWx1ZSkpKTtcbn1cblxudmFyIHRvUGF0aF8xID0gdG9QYXRoO1xuXG52YXIgZGVmaW5lJDIgPSB7XG4gIC8vIGFjY2VzcyBkYXRhIGZpZWxkXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEocGFyYW1zKSB7XG4gICAgdmFyIGRlZmF1bHRzID0ge1xuICAgICAgZmllbGQ6ICdkYXRhJyxcbiAgICAgIGJpbmRpbmdFdmVudDogJ2RhdGEnLFxuICAgICAgYWxsb3dCaW5kaW5nOiBmYWxzZSxcbiAgICAgIGFsbG93U2V0dGluZzogZmFsc2UsXG4gICAgICBhbGxvd0dldHRpbmc6IGZhbHNlLFxuICAgICAgc2V0dGluZ0V2ZW50OiAnZGF0YScsXG4gICAgICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogZmFsc2UsXG4gICAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgICBpbW11dGFibGVLZXlzOiB7fSxcbiAgICAgIC8vIGtleSA9PiB0cnVlIGlmIGltbXV0YWJsZVxuICAgICAgdXBkYXRlU3R5bGU6IGZhbHNlLFxuICAgICAgYmVmb3JlR2V0OiBmdW5jdGlvbiBiZWZvcmVHZXQoc2VsZikge30sXG4gICAgICBiZWZvcmVTZXQ6IGZ1bmN0aW9uIGJlZm9yZVNldChzZWxmLCBvYmopIHt9LFxuICAgICAgb25TZXQ6IGZ1bmN0aW9uIG9uU2V0KHNlbGYpIHt9LFxuICAgICAgY2FuU2V0OiBmdW5jdGlvbiBjYW5TZXQoc2VsZikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHBhcmFtcyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIHBhcmFtcyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGRhdGFJbXBsKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgcCA9IHBhcmFtcztcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzZWxmSXNBcnJheUxpa2UgPSBzZWxmLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGFsbCA9IHNlbGZJc0FycmF5TGlrZSA/IHNlbGYgOiBbc2VsZl07IC8vIHB1dCBpbiBhcnJheSBpZiBub3QgYXJyYXktbGlrZVxuICAgICAgdmFyIHNpbmdsZSA9IHNlbGZJc0FycmF5TGlrZSA/IHNlbGZbMF0gOiBzZWxmO1xuXG4gICAgICAvLyAuZGF0YSgnZm9vJywgLi4uKVxuICAgICAgaWYgKHN0cmluZyhuYW1lKSkge1xuICAgICAgICAvLyBzZXQgb3IgZ2V0IHByb3BlcnR5XG4gICAgICAgIHZhciBpc1BhdGhMaWtlID0gbmFtZS5pbmRleE9mKCcuJykgIT09IC0xOyAvLyB0aGVyZSBtaWdodCBiZSBhIG5vcm1hbCBmaWVsZCB3aXRoIGEgZG90IFxuICAgICAgICB2YXIgcGF0aCA9IGlzUGF0aExpa2UgJiYgdG9QYXRoXzEobmFtZSk7XG5cbiAgICAgICAgLy8gLmRhdGEoJ2ZvbycpXG4gICAgICAgIGlmIChwLmFsbG93R2V0dGluZyAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gZ2V0XG5cbiAgICAgICAgICB2YXIgcmV0O1xuICAgICAgICAgIGlmIChzaW5nbGUpIHtcbiAgICAgICAgICAgIHAuYmVmb3JlR2V0KHNpbmdsZSk7XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgcGF0aCBhbmQgYSBmaWVsZCB3aXRoIHRoZSBzYW1lIG5hbWUgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgaWYgKHBhdGggJiYgc2luZ2xlLl9wcml2YXRlW3AuZmllbGRdW25hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0ID0gZ2V0XzEoc2luZ2xlLl9wcml2YXRlW3AuZmllbGRdLCBwYXRoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldCA9IHNpbmdsZS5fcHJpdmF0ZVtwLmZpZWxkXVtuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJldDtcblxuICAgICAgICAgIC8vIC5kYXRhKCdmb28nLCAnYmFyJylcbiAgICAgICAgfSBlbHNlIGlmIChwLmFsbG93U2V0dGluZyAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gc2V0XG4gICAgICAgICAgdmFyIHZhbGlkID0gIXAuaW1tdXRhYmxlS2V5c1tuYW1lXTtcbiAgICAgICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgICAgIHZhciBjaGFuZ2UgPSBfZGVmaW5lUHJvcGVydHkkMSh7fSwgbmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgcC5iZWZvcmVTZXQoc2VsZiwgY2hhbmdlKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gYWxsLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICB2YXIgZWxlID0gYWxsW2ldO1xuICAgICAgICAgICAgICBpZiAocC5jYW5TZXQoZWxlKSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXRoICYmIHNpbmdsZS5fcHJpdmF0ZVtwLmZpZWxkXVtuYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBzZXRfMShlbGUuX3ByaXZhdGVbcC5maWVsZF0sIHBhdGgsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZWxlLl9wcml2YXRlW3AuZmllbGRdW25hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSBtYXBwZXJzIGlmIGFza2VkXG4gICAgICAgICAgICBpZiAocC51cGRhdGVTdHlsZSkge1xuICAgICAgICAgICAgICBzZWxmLnVwZGF0ZVN0eWxlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNhbGwgb25TZXQgY2FsbGJhY2tcbiAgICAgICAgICAgIHAub25TZXQoc2VsZik7XG4gICAgICAgICAgICBpZiAocC5zZXR0aW5nVHJpZ2dlcnNFdmVudCkge1xuICAgICAgICAgICAgICBzZWxmW3AudHJpZ2dlckZuTmFtZV0ocC5zZXR0aW5nRXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC5kYXRhKHsgJ2Zvbyc6ICdiYXInIH0pXG4gICAgICB9IGVsc2UgaWYgKHAuYWxsb3dTZXR0aW5nICYmIHBsYWluT2JqZWN0KG5hbWUpKSB7XG4gICAgICAgIC8vIGV4dGVuZFxuICAgICAgICB2YXIgb2JqID0gbmFtZTtcbiAgICAgICAgdmFyIGssIHY7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgcC5iZWZvcmVTZXQoc2VsZiwgb2JqKTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGtleXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgayA9IGtleXNbX2ldO1xuICAgICAgICAgIHYgPSBvYmpba107XG4gICAgICAgICAgdmFyIF92YWxpZCA9ICFwLmltbXV0YWJsZUtleXNba107XG4gICAgICAgICAgaWYgKF92YWxpZCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhbGwubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgdmFyIF9lbGUgPSBhbGxbal07XG4gICAgICAgICAgICAgIGlmIChwLmNhblNldChfZWxlKSkge1xuICAgICAgICAgICAgICAgIF9lbGUuX3ByaXZhdGVbcC5maWVsZF1ba10gPSB2O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXBkYXRlIG1hcHBlcnMgaWYgYXNrZWRcbiAgICAgICAgaWYgKHAudXBkYXRlU3R5bGUpIHtcbiAgICAgICAgICBzZWxmLnVwZGF0ZVN0eWxlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjYWxsIG9uU2V0IGNhbGxiYWNrXG4gICAgICAgIHAub25TZXQoc2VsZik7XG4gICAgICAgIGlmIChwLnNldHRpbmdUcmlnZ2Vyc0V2ZW50KSB7XG4gICAgICAgICAgc2VsZltwLnRyaWdnZXJGbk5hbWVdKHAuc2V0dGluZ0V2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC5kYXRhKGZ1bmN0aW9uKCl7IC4uLiB9KVxuICAgICAgfSBlbHNlIGlmIChwLmFsbG93QmluZGluZyAmJiBmbiQ2KG5hbWUpKSB7XG4gICAgICAgIC8vIGJpbmQgdG8gZXZlbnRcbiAgICAgICAgdmFyIGZuID0gbmFtZTtcbiAgICAgICAgc2VsZi5vbihwLmJpbmRpbmdFdmVudCwgZm4pO1xuXG4gICAgICAgIC8vIC5kYXRhKClcbiAgICAgIH0gZWxzZSBpZiAocC5hbGxvd0dldHRpbmcgJiYgbmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGdldCB3aG9sZSBvYmplY3RcbiAgICAgICAgdmFyIF9yZXQ7XG4gICAgICAgIGlmIChzaW5nbGUpIHtcbiAgICAgICAgICBwLmJlZm9yZUdldChzaW5nbGUpO1xuICAgICAgICAgIF9yZXQgPSBzaW5nbGUuX3ByaXZhdGVbcC5maWVsZF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9yZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZjsgLy8gbWFpbnRhaW4gY2hhaW5hYmlsaXR5XG4gICAgfTsgLy8gZnVuY3Rpb25cbiAgfSxcblxuICAvLyBkYXRhXG5cbiAgLy8gcmVtb3ZlIGRhdGEgZmllbGRcbiAgcmVtb3ZlRGF0YTogZnVuY3Rpb24gcmVtb3ZlRGF0YShwYXJhbXMpIHtcbiAgICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgICBmaWVsZDogJ2RhdGEnLFxuICAgICAgZXZlbnQ6ICdkYXRhJyxcbiAgICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICAgIHRyaWdnZXJFdmVudDogZmFsc2UsXG4gICAgICBpbW11dGFibGVLZXlzOiB7fSAvLyBrZXkgPT4gdHJ1ZSBpZiBpbW11dGFibGVcbiAgICB9O1xuXG4gICAgcGFyYW1zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgcGFyYW1zKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gcmVtb3ZlRGF0YUltcGwobmFtZXMpIHtcbiAgICAgIHZhciBwID0gcGFyYW1zO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlbGZJc0FycmF5TGlrZSA9IHNlbGYubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgYWxsID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZiA6IFtzZWxmXTsgLy8gcHV0IGluIGFycmF5IGlmIG5vdCBhcnJheS1saWtlXG5cbiAgICAgIC8vIC5yZW1vdmVEYXRhKCdmb28gYmFyJylcbiAgICAgIGlmIChzdHJpbmcobmFtZXMpKSB7XG4gICAgICAgIC8vIHRoZW4gZ2V0IHRoZSBsaXN0IG9mIGtleXMsIGFuZCBkZWxldGUgdGhlbVxuICAgICAgICB2YXIga2V5cyA9IG5hbWVzLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIHZhciBsID0ga2V5cy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgLy8gZGVsZXRlIGVhY2ggbm9uLWVtcHR5IGtleVxuICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmIChlbXB0eVN0cmluZyhrZXkpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHZhbGlkID0gIXAuaW1tdXRhYmxlS2V5c1trZXldOyAvLyBub3QgdmFsaWQgaWYgaW1tdXRhYmxlXG4gICAgICAgICAgaWYgKHZhbGlkKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpX2EgPSAwLCBsX2EgPSBhbGwubGVuZ3RoOyBpX2EgPCBsX2E7IGlfYSsrKSB7XG4gICAgICAgICAgICAgIGFsbFtpX2FdLl9wcml2YXRlW3AuZmllbGRdW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwLnRyaWdnZXJFdmVudCkge1xuICAgICAgICAgIHNlbGZbcC50cmlnZ2VyRm5OYW1lXShwLmV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC5yZW1vdmVEYXRhKClcbiAgICAgIH0gZWxzZSBpZiAobmFtZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyB0aGVuIGRlbGV0ZSBhbGwga2V5c1xuXG4gICAgICAgIGZvciAodmFyIF9pX2EgPSAwLCBfbF9hID0gYWxsLmxlbmd0aDsgX2lfYSA8IF9sX2E7IF9pX2ErKykge1xuICAgICAgICAgIHZhciBfcHJpdmF0ZUZpZWxkcyA9IGFsbFtfaV9hXS5fcHJpdmF0ZVtwLmZpZWxkXTtcbiAgICAgICAgICB2YXIgX2tleXMgPSBPYmplY3Qua2V5cyhfcHJpdmF0ZUZpZWxkcyk7XG4gICAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgX2tleXMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICAgICAgdmFyIF9rZXkgPSBfa2V5c1tfaTJdO1xuICAgICAgICAgICAgdmFyIHZhbGlkS2V5VG9EZWxldGUgPSAhcC5pbW11dGFibGVLZXlzW19rZXldO1xuICAgICAgICAgICAgaWYgKHZhbGlkS2V5VG9EZWxldGUpIHtcbiAgICAgICAgICAgICAgX3ByaXZhdGVGaWVsZHNbX2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwLnRyaWdnZXJFdmVudCkge1xuICAgICAgICAgIHNlbGZbcC50cmlnZ2VyRm5OYW1lXShwLmV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHNlbGY7IC8vIG1haW50YWluIGNoYWluaW5nXG4gICAgfTsgLy8gZnVuY3Rpb25cbiAgfSAvLyByZW1vdmVEYXRhXG59OyAvLyBkZWZpbmVcblxudmFyIGRlZmluZSQxID0ge1xuICBldmVudEFsaWFzZXNPbjogZnVuY3Rpb24gZXZlbnRBbGlhc2VzT24ocHJvdG8pIHtcbiAgICB2YXIgcCA9IHByb3RvO1xuICAgIHAuYWRkTGlzdGVuZXIgPSBwLmxpc3RlbiA9IHAuYmluZCA9IHAub247XG4gICAgcC51bmxpc3RlbiA9IHAudW5iaW5kID0gcC5vZmYgPSBwLnJlbW92ZUxpc3RlbmVyO1xuICAgIHAudHJpZ2dlciA9IHAuZW1pdDtcblxuICAgIC8vIHRoaXMgaXMganVzdCBhIHdyYXBwZXIgYWxpYXMgb2YgLm9uKClcbiAgICBwLnBvbiA9IHAucHJvbWlzZU9uID0gZnVuY3Rpb24gKGV2ZW50cywgc2VsZWN0b3IpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soZSkge1xuICAgICAgICAgIHNlbGYub2ZmLmFwcGx5KHNlbGYsIG9mZkFyZ3MpO1xuICAgICAgICAgIHJlc29sdmUoZSk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBvbkFyZ3MgPSBhcmdzLmNvbmNhdChbY2FsbGJhY2tdKTtcbiAgICAgICAgdmFyIG9mZkFyZ3MgPSBvbkFyZ3MuY29uY2F0KFtdKTtcbiAgICAgICAgc2VsZi5vbi5hcHBseShzZWxmLCBvbkFyZ3MpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxufTsgLy8gZGVmaW5lXG5cbi8vIHVzZSB0aGlzIG1vZHVsZSB0byBjaGVycnkgcGljayBmdW5jdGlvbnMgaW50byB5b3VyIHByb3RvdHlwZVxudmFyIGRlZmluZSA9IHt9O1xuW2RlZmluZSQzLCBkZWZpbmUkMiwgZGVmaW5lJDFdLmZvckVhY2goZnVuY3Rpb24gKG0pIHtcbiAgZXh0ZW5kKGRlZmluZSwgbSk7XG59KTtcblxudmFyIGVsZXNmbiRpID0ge1xuICBhbmltYXRlOiBkZWZpbmUuYW5pbWF0ZSgpLFxuICBhbmltYXRpb246IGRlZmluZS5hbmltYXRpb24oKSxcbiAgYW5pbWF0ZWQ6IGRlZmluZS5hbmltYXRlZCgpLFxuICBjbGVhclF1ZXVlOiBkZWZpbmUuY2xlYXJRdWV1ZSgpLFxuICBkZWxheTogZGVmaW5lLmRlbGF5KCksXG4gIGRlbGF5QW5pbWF0aW9uOiBkZWZpbmUuZGVsYXlBbmltYXRpb24oKSxcbiAgc3RvcDogZGVmaW5lLnN0b3AoKVxufTtcblxudmFyIGVsZXNmbiRoID0ge1xuICBjbGFzc2VzOiBmdW5jdGlvbiBjbGFzc2VzKF9jbGFzc2VzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChfY2xhc3NlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgcmV0ID0gW107XG4gICAgICBzZWxmWzBdLl9wcml2YXRlLmNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xzKSB7XG4gICAgICAgIHJldHVybiByZXQucHVzaChjbHMpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0gZWxzZSBpZiAoIWFycmF5KF9jbGFzc2VzKSkge1xuICAgICAgLy8gZXh0cmFjdCBjbGFzc2VzIGZyb20gc3RyaW5nXG4gICAgICBfY2xhc3NlcyA9IChfY2xhc3NlcyB8fCAnJykubWF0Y2goL1xcUysvZykgfHwgW107XG4gICAgfVxuICAgIHZhciBjaGFuZ2VkID0gW107XG4gICAgdmFyIGNsYXNzZXNTZXQgPSBuZXcgU2V0JDEoX2NsYXNzZXMpO1xuXG4gICAgLy8gY2hlY2sgYW5kIHVwZGF0ZSBlYWNoIGVsZVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VsZi5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGVsZSA9IHNlbGZbal07XG4gICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICB2YXIgZWxlQ2xhc3NlcyA9IF9wLmNsYXNzZXM7XG4gICAgICB2YXIgY2hhbmdlZEVsZSA9IGZhbHNlO1xuXG4gICAgICAvLyBjaGVjayBpZiBlbGUgaGFzIGFsbCBvZiB0aGUgcGFzc2VkIGNsYXNzZXNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX2NsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNscyA9IF9jbGFzc2VzW2ldO1xuICAgICAgICB2YXIgZWxlSGFzQ2xhc3MgPSBlbGVDbGFzc2VzLmhhcyhjbHMpO1xuICAgICAgICBpZiAoIWVsZUhhc0NsYXNzKSB7XG4gICAgICAgICAgY2hhbmdlZEVsZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gY2hlY2sgaWYgZWxlIGhhcyBjbGFzc2VzIG91dHNpZGUgb2YgdGhvc2UgcGFzc2VkXG4gICAgICBpZiAoIWNoYW5nZWRFbGUpIHtcbiAgICAgICAgY2hhbmdlZEVsZSA9IGVsZUNsYXNzZXMuc2l6ZSAhPT0gX2NsYXNzZXMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZWRFbGUpIHtcbiAgICAgICAgX3AuY2xhc3NlcyA9IGNsYXNzZXNTZXQ7XG4gICAgICAgIGNoYW5nZWQucHVzaChlbGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRyaWdnZXIgdXBkYXRlIHN0eWxlIG9uIHRob3NlIGVsZXMgdGhhdCBoYWQgY2xhc3MgY2hhbmdlc1xuICAgIGlmIChjaGFuZ2VkLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc3Bhd24oY2hhbmdlZCkudXBkYXRlU3R5bGUoKS5lbWl0KCdjbGFzcycpO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZjtcbiAgfSxcbiAgYWRkQ2xhc3M6IGZ1bmN0aW9uIGFkZENsYXNzKGNsYXNzZXMpIHtcbiAgICByZXR1cm4gdGhpcy50b2dnbGVDbGFzcyhjbGFzc2VzLCB0cnVlKTtcbiAgfSxcbiAgaGFzQ2xhc3M6IGZ1bmN0aW9uIGhhc0NsYXNzKGNsYXNzTmFtZSkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHJldHVybiBlbGUgIT0gbnVsbCAmJiBlbGUuX3ByaXZhdGUuY2xhc3Nlcy5oYXMoY2xhc3NOYW1lKTtcbiAgfSxcbiAgdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uIHRvZ2dsZUNsYXNzKGNsYXNzZXMsIHRvZ2dsZSkge1xuICAgIGlmICghYXJyYXkoY2xhc3NlcykpIHtcbiAgICAgIC8vIGV4dHJhY3QgY2xhc3NlcyBmcm9tIHN0cmluZ1xuICAgICAgY2xhc3NlcyA9IGNsYXNzZXMubWF0Y2goL1xcUysvZykgfHwgW107XG4gICAgfVxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgdG9nZ2xlVW5kZWZkID0gdG9nZ2xlID09PSB1bmRlZmluZWQ7XG4gICAgdmFyIGNoYW5nZWQgPSBbXTsgLy8gZWxlcyB3aG8gaGFkIGNsYXNzZXMgY2hhbmdlZFxuXG4gICAgZm9yICh2YXIgaSA9IDAsIGlsID0gc2VsZi5sZW5ndGg7IGkgPCBpbDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gc2VsZltpXTtcbiAgICAgIHZhciBlbGVDbGFzc2VzID0gZWxlLl9wcml2YXRlLmNsYXNzZXM7XG4gICAgICB2YXIgY2hhbmdlZEVsZSA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjbGFzc2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBjbHMgPSBjbGFzc2VzW2pdO1xuICAgICAgICB2YXIgaGFzQ2xhc3MgPSBlbGVDbGFzc2VzLmhhcyhjbHMpO1xuICAgICAgICB2YXIgY2hhbmdlZE5vdyA9IGZhbHNlO1xuICAgICAgICBpZiAodG9nZ2xlIHx8IHRvZ2dsZVVuZGVmZCAmJiAhaGFzQ2xhc3MpIHtcbiAgICAgICAgICBlbGVDbGFzc2VzLmFkZChjbHMpO1xuICAgICAgICAgIGNoYW5nZWROb3cgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCF0b2dnbGUgfHwgdG9nZ2xlVW5kZWZkICYmIGhhc0NsYXNzKSB7XG4gICAgICAgICAgZWxlQ2xhc3Nlc1tcImRlbGV0ZVwiXShjbHMpO1xuICAgICAgICAgIGNoYW5nZWROb3cgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hhbmdlZEVsZSAmJiBjaGFuZ2VkTm93KSB7XG4gICAgICAgICAgY2hhbmdlZC5wdXNoKGVsZSk7XG4gICAgICAgICAgY2hhbmdlZEVsZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gZm9yIGogY2xhc3Nlc1xuICAgIH0gLy8gZm9yIGkgZWxlc1xuXG4gICAgLy8gdHJpZ2dlciB1cGRhdGUgc3R5bGUgb24gdGhvc2UgZWxlcyB0aGF0IGhhZCBjbGFzcyBjaGFuZ2VzXG4gICAgaWYgKGNoYW5nZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zcGF3bihjaGFuZ2VkKS51cGRhdGVTdHlsZSgpLmVtaXQoJ2NsYXNzJyk7XG4gICAgfVxuICAgIHJldHVybiBzZWxmO1xuICB9LFxuICByZW1vdmVDbGFzczogZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoY2xhc3Nlcykge1xuICAgIHJldHVybiB0aGlzLnRvZ2dsZUNsYXNzKGNsYXNzZXMsIGZhbHNlKTtcbiAgfSxcbiAgZmxhc2hDbGFzczogZnVuY3Rpb24gZmxhc2hDbGFzcyhjbGFzc2VzLCBkdXJhdGlvbikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoZHVyYXRpb24gPT0gbnVsbCkge1xuICAgICAgZHVyYXRpb24gPSAyNTA7XG4gICAgfSBlbHNlIGlmIChkdXJhdGlvbiA9PT0gMCkge1xuICAgICAgcmV0dXJuIHNlbGY7IC8vIG5vdGhpbmcgdG8gZG8gcmVhbGx5XG4gICAgfVxuXG4gICAgc2VsZi5hZGRDbGFzcyhjbGFzc2VzKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYucmVtb3ZlQ2xhc3MoY2xhc3Nlcyk7XG4gICAgfSwgZHVyYXRpb24pO1xuICAgIHJldHVybiBzZWxmO1xuICB9XG59O1xuZWxlc2ZuJGguY2xhc3NOYW1lID0gZWxlc2ZuJGguY2xhc3NOYW1lcyA9IGVsZXNmbiRoLmNsYXNzZXM7XG5cbi8vIHRva2VucyBpbiB0aGUgcXVlcnkgbGFuZ3VhZ2VcbnZhciB0b2tlbnMgPSB7XG4gIG1ldGFDaGFyOiAnW1xcXFwhXFxcXFwiXFxcXCNcXFxcJFxcXFwlXFxcXCZcXFxcXFwnXFxcXChcXFxcKVxcXFwqXFxcXCtcXFxcLFxcXFwuXFxcXC9cXFxcOlxcXFw7XFxcXDxcXFxcPVxcXFw+XFxcXD9cXFxcQFxcXFxbXFxcXF1cXFxcXlxcXFxgXFxcXHtcXFxcfFxcXFx9XFxcXH5dJyxcbiAgLy8gY2hhcnMgd2UgbmVlZCB0byBlc2NhcGUgaW4gbGV0IG5hbWVzLCBldGNcbiAgY29tcGFyYXRvck9wOiAnPXxcXFxcIT18Pnw+PXw8fDw9fFxcXFwkPXxcXFxcXj18XFxcXCo9JyxcbiAgLy8gYmluYXJ5IGNvbXBhcmlzb24gb3AgKHVzZWQgaW4gZGF0YSBzZWxlY3RvcnMpXG4gIGJvb2xPcDogJ1xcXFw/fFxcXFwhfFxcXFxeJyxcbiAgLy8gYm9vbGVhbiAodW5hcnkpIG9wZXJhdG9ycyAodXNlZCBpbiBkYXRhIHNlbGVjdG9ycylcbiAgc3RyaW5nOiAnXCIoPzpcXFxcXFxcXFwifFteXCJdKSpcIicgKyAnfCcgKyBcIicoPzpcXFxcXFxcXCd8W14nXSkqJ1wiLFxuICAvLyBzdHJpbmcgbGl0ZXJhbHMgKHVzZWQgaW4gZGF0YSBzZWxlY3RvcnMpIC0tIGRvdWJsZXF1b3RlcyB8IHNpbmdsZXF1b3Rlc1xuICBudW1iZXI6IG51bWJlcixcbiAgLy8gbnVtYmVyIGxpdGVyYWwgKHVzZWQgaW4gZGF0YSBzZWxlY3RvcnMpIC0tLSBlLmcuIDAuMTIzNCwgMTIzNCwgMTJlMTIzXG4gIG1ldGE6ICdkZWdyZWV8aW5kZWdyZWV8b3V0ZGVncmVlJyxcbiAgLy8gYWxsb3dlZCBtZXRhZGF0YSBmaWVsZHMgKGkuZS4gYWxsb3dlZCBmdW5jdGlvbnMgdG8gdXNlIGZyb20gQ29sbGVjdGlvbilcbiAgc2VwYXJhdG9yOiAnXFxcXHMqLFxcXFxzKicsXG4gIC8vIHF1ZXJpZXMgYXJlIHNlcGFyYXRlZCBieSBjb21tYXMsIGUuZy4gZWRnZVtmb28gPSAnYmFyJ10sIG5vZGUuc29tZUNsYXNzXG4gIGRlc2NlbmRhbnQ6ICdcXFxccysnLFxuICBjaGlsZDogJ1xcXFxzKz5cXFxccysnLFxuICBzdWJqZWN0OiAnXFxcXCQnLFxuICBncm91cDogJ25vZGV8ZWRnZXxcXFxcKicsXG4gIGRpcmVjdGVkRWRnZTogJ1xcXFxzKy0+XFxcXHMrJyxcbiAgdW5kaXJlY3RlZEVkZ2U6ICdcXFxccys8LT5cXFxccysnXG59O1xudG9rZW5zLnZhcmlhYmxlID0gJyg/OltcXFxcdy0uXXwoPzpcXFxcXFxcXCcgKyB0b2tlbnMubWV0YUNoYXIgKyAnKSkrJzsgLy8gYSB2YXJpYWJsZSBuYW1lIGNhbiBoYXZlIGxldHRlcnMsIG51bWJlcnMsIGRhc2hlcywgYW5kIHBlcmlvZHNcbnRva2Vucy5jbGFzc05hbWUgPSAnKD86W1xcXFx3LV18KD86XFxcXFxcXFwnICsgdG9rZW5zLm1ldGFDaGFyICsgJykpKyc7IC8vIGEgY2xhc3MgbmFtZSBoYXMgdGhlIHNhbWUgcnVsZXMgYXMgYSB2YXJpYWJsZSBleGNlcHQgaXQgY2FuJ3QgaGF2ZSBhICcuJyBpbiB0aGUgbmFtZVxudG9rZW5zLnZhbHVlID0gdG9rZW5zLnN0cmluZyArICd8JyArIHRva2Vucy5udW1iZXI7IC8vIGEgdmFsdWUgbGl0ZXJhbCwgZWl0aGVyIGEgc3RyaW5nIG9yIG51bWJlclxudG9rZW5zLmlkID0gdG9rZW5zLnZhcmlhYmxlOyAvLyBhbiBlbGVtZW50IGlkIChmb2xsb3dzIHZhcmlhYmxlIGNvbnZlbnRpb25zKVxuXG4oZnVuY3Rpb24gKCkge1xuICB2YXIgb3BzLCBvcCwgaTtcblxuICAvLyBhZGQgQCB2YXJpYW50cyB0byBjb21wYXJhdG9yT3BcbiAgb3BzID0gdG9rZW5zLmNvbXBhcmF0b3JPcC5zcGxpdCgnfCcpO1xuICBmb3IgKGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3AgPSBvcHNbaV07XG4gICAgdG9rZW5zLmNvbXBhcmF0b3JPcCArPSAnfEAnICsgb3A7XG4gIH1cblxuICAvLyBhZGQgISB2YXJpYW50cyB0byBjb21wYXJhdG9yT3BcbiAgb3BzID0gdG9rZW5zLmNvbXBhcmF0b3JPcC5zcGxpdCgnfCcpO1xuICBmb3IgKGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3AgPSBvcHNbaV07XG4gICAgaWYgKG9wLmluZGV4T2YoJyEnKSA+PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIHNraXAgb3BzIHRoYXQgZXhwbGljaXRseSBjb250YWluICFcbiAgICBpZiAob3AgPT09ICc9Jykge1xuICAgICAgY29udGludWU7XG4gICAgfSAvLyBza2lwID0gYi9jICE9IGlzIGV4cGxpY2l0bHkgZGVmaW5lZFxuXG4gICAgdG9rZW5zLmNvbXBhcmF0b3JPcCArPSAnfFxcXFwhJyArIG9wO1xuICB9XG59KSgpO1xuXG4vKipcbiAqIE1ha2UgYSBuZXcgcXVlcnkgb2JqZWN0XG4gKlxuICogQHByb3AgdHlwZSB7VHlwZX0gVGhlIHR5cGUgZW51bSAoaW50KSBvZiB0aGUgcXVlcnlcbiAqIEBwcm9wIGNoZWNrcyBMaXN0IG9mIGNoZWNrcyB0byBtYWtlIGFnYWluc3QgYW4gZWxlIHRvIHRlc3QgZm9yIGEgbWF0Y2hcbiAqL1xudmFyIG5ld1F1ZXJ5ID0gZnVuY3Rpb24gbmV3UXVlcnkoKSB7XG4gIHJldHVybiB7XG4gICAgY2hlY2tzOiBbXVxuICB9O1xufTtcblxuLyoqXG4gKiBBIGNoZWNrIHR5cGUgZW51bS1saWtlIG9iamVjdC4gIFVzZXMgaW50ZWdlciB2YWx1ZXMgZm9yIGZhc3QgbWF0Y2goKSBsb29rdXAuXG4gKiBUaGUgb3JkZXJpbmcgZG9lcyBub3QgbWF0dGVyIGFzIGxvbmcgYXMgdGhlIGludHMgYXJlIHVuaXF1ZS5cbiAqL1xudmFyIFR5cGUgPSB7XG4gIC8qKiBFLmcuIG5vZGUgKi9cbiAgR1JPVVA6IDAsXG4gIC8qKiBBIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgKi9cbiAgQ09MTEVDVElPTjogMSxcbiAgLyoqIEEgZmlsdGVyKGVsZSkgZnVuY3Rpb24gKi9cbiAgRklMVEVSOiAyLFxuICAvKiogRS5nLiBbZm9vID4gMV0gKi9cbiAgREFUQV9DT01QQVJFOiAzLFxuICAvKiogRS5nLiBbZm9vXSAqL1xuICBEQVRBX0VYSVNUOiA0LFxuICAvKiogRS5nLiBbP2Zvb10gKi9cbiAgREFUQV9CT09MOiA1LFxuICAvKiogRS5nLiBbW2RlZ3JlZSA+IDJdXSAqL1xuICBNRVRBX0NPTVBBUkU6IDYsXG4gIC8qKiBFLmcuIDpzZWxlY3RlZCAqL1xuICBTVEFURTogNyxcbiAgLyoqIEUuZy4gI2ZvbyAqL1xuICBJRDogOCxcbiAgLyoqIEUuZy4gLmZvbyAqL1xuICBDTEFTUzogOSxcbiAgLyoqIEUuZy4gI2ZvbyA8LT4gI2JhciAqL1xuICBVTkRJUkVDVEVEX0VER0U6IDEwLFxuICAvKiogRS5nLiAjZm9vIC0+ICNiYXIgKi9cbiAgRElSRUNURURfRURHRTogMTEsXG4gIC8qKiBFLmcuICQjZm9vIC0+ICNiYXIgKi9cbiAgTk9ERV9TT1VSQ0U6IDEyLFxuICAvKiogRS5nLiAjZm9vIC0+ICQjYmFyICovXG4gIE5PREVfVEFSR0VUOiAxMyxcbiAgLyoqIEUuZy4gJCNmb28gPC0+ICNiYXIgKi9cbiAgTk9ERV9ORUlHSEJPUjogMTQsXG4gIC8qKiBFLmcuICNmb28gPiAjYmFyICovXG4gIENISUxEOiAxNSxcbiAgLyoqIEUuZy4gI2ZvbyAjYmFyICovXG4gIERFU0NFTkRBTlQ6IDE2LFxuICAvKiogRS5nLiAkI2ZvbyA+ICNiYXIgKi9cbiAgUEFSRU5UOiAxNyxcbiAgLyoqIEUuZy4gJCNmb28gI2JhciAqL1xuICBBTkNFU1RPUjogMTgsXG4gIC8qKiBFLmcuICNmb28gPiAkYmFyID4gI2JheiAqL1xuICBDT01QT1VORF9TUExJVDogMTksXG4gIC8qKiBBbHdheXMgbWF0Y2hlcywgdXNlZnVsIHBsYWNlaG9sZGVyIGZvciBzdWJqZWN0IGluIGBDT01QT1VORF9TUExJVGAgKi9cbiAgVFJVRTogMjBcbn07XG5cbnZhciBzdGF0ZVNlbGVjdG9ycyA9IFt7XG4gIHNlbGVjdG9yOiAnOnNlbGVjdGVkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLnNlbGVjdGVkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6dW5zZWxlY3RlZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuc2VsZWN0ZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpzZWxlY3RhYmxlJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLnNlbGVjdGFibGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzp1bnNlbGVjdGFibGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLnNlbGVjdGFibGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpsb2NrZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUubG9ja2VkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6dW5sb2NrZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLmxvY2tlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnZpc2libGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUudmlzaWJsZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmhpZGRlbicsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUudmlzaWJsZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnRyYW5zcGFyZW50JyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLnRyYW5zcGFyZW50KCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6Z3JhYmJlZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5ncmFiYmVkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6ZnJlZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuZ3JhYmJlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnJlbW92ZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUucmVtb3ZlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmluc2lkZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUucmVtb3ZlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmdyYWJiYWJsZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5ncmFiYmFibGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzp1bmdyYWJiYWJsZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuZ3JhYmJhYmxlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6YW5pbWF0ZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuYW5pbWF0ZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzp1bmFuaW1hdGVkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5hbmltYXRlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnBhcmVudCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc1BhcmVudCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmNoaWxkbGVzcycsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc0NoaWxkbGVzcygpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmNoaWxkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmlzQ2hpbGQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpvcnBoYW4nLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNPcnBoYW4oKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpub25vcnBoYW4nLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNDaGlsZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmNvbXBvdW5kJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICByZXR1cm4gZWxlLmlzUGFyZW50KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGUuc291cmNlKCkuaXNQYXJlbnQoKSB8fCBlbGUudGFyZ2V0KCkuaXNQYXJlbnQoKTtcbiAgICB9XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6bG9vcCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc0xvb3AoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpzaW1wbGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNTaW1wbGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzphY3RpdmUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuYWN0aXZlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6aW5hY3RpdmUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLmFjdGl2ZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmJhY2tncm91bmRpbmcnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuYmFja2dyb3VuZGluZygpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOm5vbmJhY2tncm91bmRpbmcnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLmJhY2tncm91bmRpbmcoKTtcbiAgfVxufV0uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAvLyBuLmIuIHNlbGVjdG9ycyB0aGF0IGFyZSBzdGFydGluZyBzdWJzdHJpbmdzIG9mIG90aGVycyBtdXN0IGhhdmUgdGhlIGxvbmdlciBvbmVzIGZpcnN0XG4gIHJldHVybiBkZXNjZW5kaW5nKGEuc2VsZWN0b3IsIGIuc2VsZWN0b3IpO1xufSk7XG52YXIgbG9va3VwID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsVG9GbiA9IHt9O1xuICB2YXIgcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZVNlbGVjdG9ycy5sZW5ndGg7IGkrKykge1xuICAgIHMgPSBzdGF0ZVNlbGVjdG9yc1tpXTtcbiAgICBzZWxUb0ZuW3Muc2VsZWN0b3JdID0gcy5tYXRjaGVzO1xuICB9XG4gIHJldHVybiBzZWxUb0ZuO1xufSgpO1xudmFyIHN0YXRlU2VsZWN0b3JNYXRjaGVzID0gZnVuY3Rpb24gc3RhdGVTZWxlY3Rvck1hdGNoZXMoc2VsLCBlbGUpIHtcbiAgcmV0dXJuIGxvb2t1cFtzZWxdKGVsZSk7XG59O1xudmFyIHN0YXRlU2VsZWN0b3JSZWdleCA9ICcoJyArIHN0YXRlU2VsZWN0b3JzLm1hcChmdW5jdGlvbiAocykge1xuICByZXR1cm4gcy5zZWxlY3Rvcjtcbn0pLmpvaW4oJ3wnKSArICcpJztcblxuLy8gd2hlbiBhIHRva2VuIGxpa2UgYSB2YXJpYWJsZSBoYXMgZXNjYXBlZCBtZXRhIGNoYXJhY3RlcnMsIHdlIG5lZWQgdG8gY2xlYW4gdGhlIGJhY2tzbGFzaGVzIG91dFxuLy8gc28gdGhhdCB2YWx1ZXMgZ2V0IGNvbXBhcmVkIHByb3Blcmx5IGluIFNlbGVjdG9yLmZpbHRlcigpXG52YXIgY2xlYW5NZXRhQ2hhcnMgPSBmdW5jdGlvbiBjbGVhbk1ldGFDaGFycyhzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFxcXFxcKCcgKyB0b2tlbnMubWV0YUNoYXIgKyAnKScsICdnJyksIGZ1bmN0aW9uIChtYXRjaCwgJDEpIHtcbiAgICByZXR1cm4gJDE7XG4gIH0pO1xufTtcbnZhciByZXBsYWNlTGFzdFF1ZXJ5ID0gZnVuY3Rpb24gcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgZXhhbWluaW5nUXVlcnksIHJlcGxhY2VtZW50UXVlcnkpIHtcbiAgc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV0gPSByZXBsYWNlbWVudFF1ZXJ5O1xufTtcblxuLy8gTk9URTogYWRkIG5ldyBleHByZXNzaW9uIHN5bnRheCBoZXJlIHRvIGhhdmUgaXQgcmVjb2duaXNlZCBieSB0aGUgcGFyc2VyO1xuLy8gLSBhIHF1ZXJ5IGNvbnRhaW5zIGFsbCBhZGphY2VudCAoaS5lLiBubyBzZXBhcmF0b3IgaW4gYmV0d2VlbikgZXhwcmVzc2lvbnM7XG4vLyAtIHRoZSBjdXJyZW50IHF1ZXJ5IGlzIHN0b3JlZCBpbiBzZWxlY3RvcltpXVxuLy8gLSB5b3UgbmVlZCB0byBjaGVjayB0aGUgcXVlcnkgb2JqZWN0cyBpbiBtYXRjaCgpIGZvciBpdCBhY3R1YWxseSBmaWx0ZXIgcHJvcGVybHksIGJ1dCB0aGF0J3MgcHJldHR5IHN0cmFpZ2h0IGZvcndhcmRcbnZhciBleHBycyA9IFt7XG4gIG5hbWU6ICdncm91cCcsXG4gIC8vIGp1c3QgdXNlZCBmb3IgaWRlbnRpZnlpbmcgd2hlbiBkZWJ1Z2dpbmdcbiAgcXVlcnk6IHRydWUsXG4gIHJlZ2V4OiAnKCcgKyB0b2tlbnMuZ3JvdXAgKyAnKScsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWYpIHtcbiAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAxKSxcbiAgICAgIGdyb3VwID0gX3JlZjJbMF07XG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5HUk9VUCxcbiAgICAgIHZhbHVlOiBncm91cCA9PT0gJyonID8gZ3JvdXAgOiBncm91cCArICdzJ1xuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdzdGF0ZScsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogc3RhdGVTZWxlY3RvclJlZ2V4LFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5LCBfcmVmMykge1xuICAgIHZhciBfcmVmNCA9IF9zbGljZWRUb0FycmF5KF9yZWYzLCAxKSxcbiAgICAgIHN0YXRlID0gX3JlZjRbMF07XG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5TVEFURSxcbiAgICAgIHZhbHVlOiBzdGF0ZVxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdpZCcsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFwjKCcgKyB0b2tlbnMuaWQgKyAnKScsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWY1KSB7XG4gICAgdmFyIF9yZWY2ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjUsIDEpLFxuICAgICAgaWQgPSBfcmVmNlswXTtcbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLklELFxuICAgICAgdmFsdWU6IGNsZWFuTWV0YUNoYXJzKGlkKVxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdjbGFzc05hbWUnLFxuICBxdWVyeTogdHJ1ZSxcbiAgcmVnZXg6ICdcXFxcLignICsgdG9rZW5zLmNsYXNzTmFtZSArICcpJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZjcpIHtcbiAgICB2YXIgX3JlZjggPSBfc2xpY2VkVG9BcnJheShfcmVmNywgMSksXG4gICAgICBjbGFzc05hbWUgPSBfcmVmOFswXTtcbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLkNMQVNTLFxuICAgICAgdmFsdWU6IGNsZWFuTWV0YUNoYXJzKGNsYXNzTmFtZSlcbiAgICB9KTtcbiAgfVxufSwge1xuICBuYW1lOiAnZGF0YUV4aXN0cycsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFxbXFxcXHMqKCcgKyB0b2tlbnMudmFyaWFibGUgKyAnKVxcXFxzKlxcXFxdJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZjkpIHtcbiAgICB2YXIgX3JlZjEwID0gX3NsaWNlZFRvQXJyYXkoX3JlZjksIDEpLFxuICAgICAgdmFyaWFibGUgPSBfcmVmMTBbMF07XG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5EQVRBX0VYSVNULFxuICAgICAgZmllbGQ6IGNsZWFuTWV0YUNoYXJzKHZhcmlhYmxlKVxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdkYXRhQ29tcGFyZScsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFxbXFxcXHMqKCcgKyB0b2tlbnMudmFyaWFibGUgKyAnKVxcXFxzKignICsgdG9rZW5zLmNvbXBhcmF0b3JPcCArICcpXFxcXHMqKCcgKyB0b2tlbnMudmFsdWUgKyAnKVxcXFxzKlxcXFxdJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZjExKSB7XG4gICAgdmFyIF9yZWYxMiA9IF9zbGljZWRUb0FycmF5KF9yZWYxMSwgMyksXG4gICAgICB2YXJpYWJsZSA9IF9yZWYxMlswXSxcbiAgICAgIGNvbXBhcmF0b3JPcCA9IF9yZWYxMlsxXSxcbiAgICAgIHZhbHVlID0gX3JlZjEyWzJdO1xuICAgIHZhciB2YWx1ZUlzU3RyaW5nID0gbmV3IFJlZ0V4cCgnXicgKyB0b2tlbnMuc3RyaW5nICsgJyQnKS5leGVjKHZhbHVlKSAhPSBudWxsO1xuICAgIGlmICh2YWx1ZUlzU3RyaW5nKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGggLSAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICB9XG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5EQVRBX0NPTVBBUkUsXG4gICAgICBmaWVsZDogY2xlYW5NZXRhQ2hhcnModmFyaWFibGUpLFxuICAgICAgb3BlcmF0b3I6IGNvbXBhcmF0b3JPcCxcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdkYXRhQm9vbCcsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFxbXFxcXHMqKCcgKyB0b2tlbnMuYm9vbE9wICsgJylcXFxccyooJyArIHRva2Vucy52YXJpYWJsZSArICcpXFxcXHMqXFxcXF0nLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5LCBfcmVmMTMpIHtcbiAgICB2YXIgX3JlZjE0ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjEzLCAyKSxcbiAgICAgIGJvb2xPcCA9IF9yZWYxNFswXSxcbiAgICAgIHZhcmlhYmxlID0gX3JlZjE0WzFdO1xuICAgIHF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgIHR5cGU6IFR5cGUuREFUQV9CT09MLFxuICAgICAgZmllbGQ6IGNsZWFuTWV0YUNoYXJzKHZhcmlhYmxlKSxcbiAgICAgIG9wZXJhdG9yOiBib29sT3BcbiAgICB9KTtcbiAgfVxufSwge1xuICBuYW1lOiAnbWV0YUNvbXBhcmUnLFxuICBxdWVyeTogdHJ1ZSxcbiAgcmVnZXg6ICdcXFxcW1xcXFxbXFxcXHMqKCcgKyB0b2tlbnMubWV0YSArICcpXFxcXHMqKCcgKyB0b2tlbnMuY29tcGFyYXRvck9wICsgJylcXFxccyooJyArIHRva2Vucy5udW1iZXIgKyAnKVxcXFxzKlxcXFxdXFxcXF0nLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5LCBfcmVmMTUpIHtcbiAgICB2YXIgX3JlZjE2ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjE1LCAzKSxcbiAgICAgIG1ldGEgPSBfcmVmMTZbMF0sXG4gICAgICBjb21wYXJhdG9yT3AgPSBfcmVmMTZbMV0sXG4gICAgICBudW1iZXIgPSBfcmVmMTZbMl07XG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5NRVRBX0NPTVBBUkUsXG4gICAgICBmaWVsZDogY2xlYW5NZXRhQ2hhcnMobWV0YSksXG4gICAgICBvcGVyYXRvcjogY29tcGFyYXRvck9wLFxuICAgICAgdmFsdWU6IHBhcnNlRmxvYXQobnVtYmVyKVxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICduZXh0UXVlcnknLFxuICBzZXBhcmF0b3I6IHRydWUsXG4gIHJlZ2V4OiB0b2tlbnMuc2VwYXJhdG9yLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5KSB7XG4gICAgdmFyIGN1cnJlbnRTdWJqZWN0ID0gc2VsZWN0b3IuY3VycmVudFN1YmplY3Q7XG4gICAgdmFyIGVkZ2VDb3VudCA9IHNlbGVjdG9yLmVkZ2VDb3VudDtcbiAgICB2YXIgY29tcG91bmRDb3VudCA9IHNlbGVjdG9yLmNvbXBvdW5kQ291bnQ7XG4gICAgdmFyIGxhc3RRID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV07XG4gICAgaWYgKGN1cnJlbnRTdWJqZWN0ICE9IG51bGwpIHtcbiAgICAgIGxhc3RRLnN1YmplY3QgPSBjdXJyZW50U3ViamVjdDtcbiAgICAgIHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID0gbnVsbDtcbiAgICB9XG4gICAgbGFzdFEuZWRnZUNvdW50ID0gZWRnZUNvdW50O1xuICAgIGxhc3RRLmNvbXBvdW5kQ291bnQgPSBjb21wb3VuZENvdW50O1xuICAgIHNlbGVjdG9yLmVkZ2VDb3VudCA9IDA7XG4gICAgc2VsZWN0b3IuY29tcG91bmRDb3VudCA9IDA7XG5cbiAgICAvLyBnbyBvbiB0byBuZXh0IHF1ZXJ5XG4gICAgdmFyIG5leHRRdWVyeSA9IHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCsrXSA9IG5ld1F1ZXJ5KCk7XG4gICAgcmV0dXJuIG5leHRRdWVyeTsgLy8gdGhpcyBpcyB0aGUgbmV3IHF1ZXJ5IHRvIGJlIGZpbGxlZCBieSB0aGUgZm9sbG93aW5nIGV4cHJzXG4gIH1cbn0sIHtcbiAgbmFtZTogJ2RpcmVjdGVkRWRnZScsXG4gIHNlcGFyYXRvcjogdHJ1ZSxcbiAgcmVnZXg6IHRva2Vucy5kaXJlY3RlZEVkZ2UsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPT0gbnVsbCkge1xuICAgICAgLy8gdW5kaXJlY3RlZCBlZGdlXG4gICAgICB2YXIgZWRnZVF1ZXJ5ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBzb3VyY2UgPSBxdWVyeTtcbiAgICAgIHZhciB0YXJnZXQgPSBuZXdRdWVyeSgpO1xuICAgICAgZWRnZVF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5ESVJFQ1RFRF9FREdFLFxuICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICAgIH0pO1xuXG4gICAgICAvLyB0aGUgcXVlcnkgaW4gdGhlIHNlbGVjdG9yIHNob3VsZCBiZSB0aGUgZWRnZSByYXRoZXIgdGhhbiB0aGUgc291cmNlXG4gICAgICByZXBsYWNlTGFzdFF1ZXJ5KHNlbGVjdG9yLCBxdWVyeSwgZWRnZVF1ZXJ5KTtcbiAgICAgIHNlbGVjdG9yLmVkZ2VDb3VudCsrO1xuXG4gICAgICAvLyB3ZSdyZSBub3cgcG9wdWxhdGluZyB0aGUgdGFyZ2V0IHF1ZXJ5IHdpdGggZXhwcmVzc2lvbnMgdGhhdCBmb2xsb3dcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNvdXJjZS90YXJnZXRcbiAgICAgIHZhciBzcmNUZ3RRID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBfc291cmNlID0gcXVlcnk7XG4gICAgICB2YXIgX3RhcmdldCA9IG5ld1F1ZXJ5KCk7XG4gICAgICBzcmNUZ3RRLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5OT0RFX1NPVVJDRSxcbiAgICAgICAgc291cmNlOiBfc291cmNlLFxuICAgICAgICB0YXJnZXQ6IF90YXJnZXRcbiAgICAgIH0pO1xuXG4gICAgICAvLyB0aGUgcXVlcnkgaW4gdGhlIHNlbGVjdG9yIHNob3VsZCBiZSB0aGUgbmVpZ2hib3VyaG9vZCByYXRoZXIgdGhhbiB0aGUgbm9kZVxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIHNyY1RndFEpO1xuICAgICAgc2VsZWN0b3IuZWRnZUNvdW50Kys7XG4gICAgICByZXR1cm4gX3RhcmdldDsgLy8gbm93IHBvcHVsYXRpbmcgdGhlIHRhcmdldCB3aXRoIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbnNcbiAgICB9XG4gIH1cbn0sIHtcbiAgbmFtZTogJ3VuZGlyZWN0ZWRFZGdlJyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLnVuZGlyZWN0ZWRFZGdlLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5KSB7XG4gICAgaWYgKHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID09IG51bGwpIHtcbiAgICAgIC8vIHVuZGlyZWN0ZWQgZWRnZVxuICAgICAgdmFyIGVkZ2VRdWVyeSA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgc291cmNlID0gcXVlcnk7XG4gICAgICB2YXIgdGFyZ2V0ID0gbmV3UXVlcnkoKTtcbiAgICAgIGVkZ2VRdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuVU5ESVJFQ1RFRF9FREdFLFxuICAgICAgICBub2RlczogW3NvdXJjZSwgdGFyZ2V0XVxuICAgICAgfSk7XG5cbiAgICAgIC8vIHRoZSBxdWVyeSBpbiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIHRoZSBlZGdlIHJhdGhlciB0aGFuIHRoZSBzb3VyY2VcbiAgICAgIHJlcGxhY2VMYXN0UXVlcnkoc2VsZWN0b3IsIHF1ZXJ5LCBlZGdlUXVlcnkpO1xuICAgICAgc2VsZWN0b3IuZWRnZUNvdW50Kys7XG5cbiAgICAgIC8vIHdlJ3JlIG5vdyBwb3B1bGF0aW5nIHRoZSB0YXJnZXQgcXVlcnkgd2l0aCBleHByZXNzaW9ucyB0aGF0IGZvbGxvd1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbmVpZ2hib3VyaG9vZFxuICAgICAgdmFyIG5ob29kUSA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgbm9kZSA9IHF1ZXJ5O1xuICAgICAgdmFyIG5laWdoYm9yID0gbmV3UXVlcnkoKTtcbiAgICAgIG5ob29kUS5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuTk9ERV9ORUlHSEJPUixcbiAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgbmVpZ2hib3I6IG5laWdoYm9yXG4gICAgICB9KTtcblxuICAgICAgLy8gdGhlIHF1ZXJ5IGluIHRoZSBzZWxlY3RvciBzaG91bGQgYmUgdGhlIG5laWdoYm91cmhvb2QgcmF0aGVyIHRoYW4gdGhlIG5vZGVcbiAgICAgIHJlcGxhY2VMYXN0UXVlcnkoc2VsZWN0b3IsIHF1ZXJ5LCBuaG9vZFEpO1xuICAgICAgcmV0dXJuIG5laWdoYm9yOyAvLyBub3cgcG9wdWxhdGluZyB0aGUgbmVpZ2hib3Igd2l0aCBmb2xsb3dpbmcgZXhwcmVzc2lvbnNcbiAgICB9XG4gIH1cbn0sIHtcbiAgbmFtZTogJ2NoaWxkJyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLmNoaWxkLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5KSB7XG4gICAgaWYgKHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID09IG51bGwpIHtcbiAgICAgIC8vIGRlZmF1bHQ6IGNoaWxkIHF1ZXJ5XG4gICAgICB2YXIgcGFyZW50Q2hpbGRRdWVyeSA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgY2hpbGQgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCAtIDFdO1xuICAgICAgcGFyZW50Q2hpbGRRdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuQ0hJTEQsXG4gICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICBjaGlsZDogY2hpbGRcbiAgICAgIH0pO1xuXG4gICAgICAvLyB0aGUgcXVlcnkgaW4gdGhlIHNlbGVjdG9yIHNob3VsZCBiZSB0aGUgJz4nIGl0c2VsZlxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIHBhcmVudENoaWxkUXVlcnkpO1xuICAgICAgc2VsZWN0b3IuY29tcG91bmRDb3VudCsrO1xuXG4gICAgICAvLyB3ZSdyZSBub3cgcG9wdWxhdGluZyB0aGUgY2hpbGQgcXVlcnkgd2l0aCBleHByZXNzaW9ucyB0aGF0IGZvbGxvd1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPT09IHF1ZXJ5KSB7XG4gICAgICAvLyBjb21wb3VuZCBzcGxpdCBxdWVyeVxuICAgICAgdmFyIGNvbXBvdW5kID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBsZWZ0ID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV07XG4gICAgICB2YXIgcmlnaHQgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIHN1YmplY3QgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIF9jaGlsZCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgX3BhcmVudCA9IG5ld1F1ZXJ5KCk7XG5cbiAgICAgIC8vIHNldCB1cCB0aGUgcm9vdCBjb21wb3VuZCBxXG4gICAgICBjb21wb3VuZC5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuQ09NUE9VTkRfU1BMSVQsXG4gICAgICAgIGxlZnQ6IGxlZnQsXG4gICAgICAgIHJpZ2h0OiByaWdodCxcbiAgICAgICAgc3ViamVjdDogc3ViamVjdFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHBvcHVsYXRlIHRoZSBzdWJqZWN0IGFuZCByZXBsYWNlIHRoZSBxIGF0IHRoZSBvbGQgc3BvdCAod2l0aGluIGxlZnQpIHdpdGggVFJVRVxuICAgICAgc3ViamVjdC5jaGVja3MgPSBxdWVyeS5jaGVja3M7IC8vIHRha2UgdGhlIGNoZWNrcyBmcm9tIHRoZSBsZWZ0XG4gICAgICBxdWVyeS5jaGVja3MgPSBbe1xuICAgICAgICB0eXBlOiBUeXBlLlRSVUVcbiAgICAgIH1dOyAvLyBjaGVja3MgdW5kZXIgbGVmdCByZWZzIHRoZSBzdWJqZWN0IGltcGxpY2l0bHlcblxuICAgICAgLy8gc2V0IHVwIHRoZSByaWdodCBxXG4gICAgICBfcGFyZW50LmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5UUlVFXG4gICAgICB9KTsgLy8gcGFyZW50IGltcGxpY2l0bHkgcmVmcyB0aGUgc3ViamVjdFxuICAgICAgcmlnaHQuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLlBBUkVOVCxcbiAgICAgICAgLy8gdHlwZSBpcyBzd2FwcGVkIG9uIHJpZ2h0IHNpZGUgcXVlcmllc1xuICAgICAgICBwYXJlbnQ6IF9wYXJlbnQsXG4gICAgICAgIGNoaWxkOiBfY2hpbGQgLy8gZW1wdHkgZm9yIG5vd1xuICAgICAgfSk7XG5cbiAgICAgIHJlcGxhY2VMYXN0UXVlcnkoc2VsZWN0b3IsIGxlZnQsIGNvbXBvdW5kKTtcblxuICAgICAgLy8gdXBkYXRlIHRoZSByZWYgc2luY2Ugd2UgbW92ZWQgdGhpbmdzIGFyb3VuZCBmb3IgYHF1ZXJ5YFxuICAgICAgc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPSBzdWJqZWN0O1xuICAgICAgc2VsZWN0b3IuY29tcG91bmRDb3VudCsrO1xuICAgICAgcmV0dXJuIF9jaGlsZDsgLy8gbm93IHBvcHVsYXRpbmcgdGhlIHJpZ2h0IHNpZGUncyBjaGlsZFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBwYXJlbnQgcXVlcnlcbiAgICAgIC8vIGluZm8gZm9yIHBhcmVudCBxdWVyeVxuICAgICAgdmFyIF9wYXJlbnQyID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBfY2hpbGQyID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBwY1FDaGVja3MgPSBbe1xuICAgICAgICB0eXBlOiBUeXBlLlBBUkVOVCxcbiAgICAgICAgcGFyZW50OiBfcGFyZW50MixcbiAgICAgICAgY2hpbGQ6IF9jaGlsZDJcbiAgICAgIH1dO1xuXG4gICAgICAvLyB0aGUgcGFyZW50LWNoaWxkIHF1ZXJ5IHRha2VzIHRoZSBwbGFjZSBvZiB0aGUgcXVlcnkgcHJldmlvdXNseSBiZWluZyBwb3B1bGF0ZWRcbiAgICAgIF9wYXJlbnQyLmNoZWNrcyA9IHF1ZXJ5LmNoZWNrczsgLy8gdGhlIHByZXZpb3VzIHF1ZXJ5IGNvbnRhaW5zIHRoZSBjaGVja3MgZm9yIHRoZSBwYXJlbnRcbiAgICAgIHF1ZXJ5LmNoZWNrcyA9IHBjUUNoZWNrczsgLy8gcGMgcXVlcnkgdGFrZXMgb3ZlclxuXG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7XG4gICAgICByZXR1cm4gX2NoaWxkMjsgLy8gd2UncmUgbm93IHBvcHVsYXRpbmcgdGhlIGNoaWxkXG4gICAgfVxuICB9XG59LCB7XG4gIG5hbWU6ICdkZXNjZW5kYW50JyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLmRlc2NlbmRhbnQsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPT0gbnVsbCkge1xuICAgICAgLy8gZGVmYXVsdDogZGVzY2VuZGFudCBxdWVyeVxuICAgICAgdmFyIGFuY0NoUXVlcnkgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGRlc2NlbmRhbnQgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGFuY2VzdG9yID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV07XG4gICAgICBhbmNDaFF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5ERVNDRU5EQU5ULFxuICAgICAgICBhbmNlc3RvcjogYW5jZXN0b3IsXG4gICAgICAgIGRlc2NlbmRhbnQ6IGRlc2NlbmRhbnRcbiAgICAgIH0pO1xuXG4gICAgICAvLyB0aGUgcXVlcnkgaW4gdGhlIHNlbGVjdG9yIHNob3VsZCBiZSB0aGUgJz4nIGl0c2VsZlxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIGFuY0NoUXVlcnkpO1xuICAgICAgc2VsZWN0b3IuY29tcG91bmRDb3VudCsrO1xuXG4gICAgICAvLyB3ZSdyZSBub3cgcG9wdWxhdGluZyB0aGUgZGVzY2VuZGFudCBxdWVyeSB3aXRoIGV4cHJlc3Npb25zIHRoYXQgZm9sbG93XG4gICAgICByZXR1cm4gZGVzY2VuZGFudDtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID09PSBxdWVyeSkge1xuICAgICAgLy8gY29tcG91bmQgc3BsaXQgcXVlcnlcbiAgICAgIHZhciBjb21wb3VuZCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgbGVmdCA9IHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIHJpZ2h0ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBzdWJqZWN0ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBfZGVzY2VuZGFudCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgX2FuY2VzdG9yID0gbmV3UXVlcnkoKTtcblxuICAgICAgLy8gc2V0IHVwIHRoZSByb290IGNvbXBvdW5kIHFcbiAgICAgIGNvbXBvdW5kLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5DT01QT1VORF9TUExJVCxcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgICBzdWJqZWN0OiBzdWJqZWN0XG4gICAgICB9KTtcblxuICAgICAgLy8gcG9wdWxhdGUgdGhlIHN1YmplY3QgYW5kIHJlcGxhY2UgdGhlIHEgYXQgdGhlIG9sZCBzcG90ICh3aXRoaW4gbGVmdCkgd2l0aCBUUlVFXG4gICAgICBzdWJqZWN0LmNoZWNrcyA9IHF1ZXJ5LmNoZWNrczsgLy8gdGFrZSB0aGUgY2hlY2tzIGZyb20gdGhlIGxlZnRcbiAgICAgIHF1ZXJ5LmNoZWNrcyA9IFt7XG4gICAgICAgIHR5cGU6IFR5cGUuVFJVRVxuICAgICAgfV07IC8vIGNoZWNrcyB1bmRlciBsZWZ0IHJlZnMgdGhlIHN1YmplY3QgaW1wbGljaXRseVxuXG4gICAgICAvLyBzZXQgdXAgdGhlIHJpZ2h0IHFcbiAgICAgIF9hbmNlc3Rvci5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuVFJVRVxuICAgICAgfSk7IC8vIGFuY2VzdG9yIGltcGxpY2l0bHkgcmVmcyB0aGUgc3ViamVjdFxuICAgICAgcmlnaHQuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLkFOQ0VTVE9SLFxuICAgICAgICAvLyB0eXBlIGlzIHN3YXBwZWQgb24gcmlnaHQgc2lkZSBxdWVyaWVzXG4gICAgICAgIGFuY2VzdG9yOiBfYW5jZXN0b3IsXG4gICAgICAgIGRlc2NlbmRhbnQ6IF9kZXNjZW5kYW50IC8vIGVtcHR5IGZvciBub3dcbiAgICAgIH0pO1xuXG4gICAgICByZXBsYWNlTGFzdFF1ZXJ5KHNlbGVjdG9yLCBsZWZ0LCBjb21wb3VuZCk7XG5cbiAgICAgIC8vIHVwZGF0ZSB0aGUgcmVmIHNpbmNlIHdlIG1vdmVkIHRoaW5ncyBhcm91bmQgZm9yIGBxdWVyeWBcbiAgICAgIHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID0gc3ViamVjdDtcbiAgICAgIHNlbGVjdG9yLmNvbXBvdW5kQ291bnQrKztcbiAgICAgIHJldHVybiBfZGVzY2VuZGFudDsgLy8gbm93IHBvcHVsYXRpbmcgdGhlIHJpZ2h0IHNpZGUncyBkZXNjZW5kYW50XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFuY2VzdG9yIHF1ZXJ5XG4gICAgICAvLyBpbmZvIGZvciBwYXJlbnQgcXVlcnlcbiAgICAgIHZhciBfYW5jZXN0b3IyID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBfZGVzY2VuZGFudDIgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGFkUUNoZWNrcyA9IFt7XG4gICAgICAgIHR5cGU6IFR5cGUuQU5DRVNUT1IsXG4gICAgICAgIGFuY2VzdG9yOiBfYW5jZXN0b3IyLFxuICAgICAgICBkZXNjZW5kYW50OiBfZGVzY2VuZGFudDJcbiAgICAgIH1dO1xuXG4gICAgICAvLyB0aGUgcGFyZW50LWNoaWxkIHF1ZXJ5IHRha2VzIHRoZSBwbGFjZSBvZiB0aGUgcXVlcnkgcHJldmlvdXNseSBiZWluZyBwb3B1bGF0ZWRcbiAgICAgIF9hbmNlc3RvcjIuY2hlY2tzID0gcXVlcnkuY2hlY2tzOyAvLyB0aGUgcHJldmlvdXMgcXVlcnkgY29udGFpbnMgdGhlIGNoZWNrcyBmb3IgdGhlIHBhcmVudFxuICAgICAgcXVlcnkuY2hlY2tzID0gYWRRQ2hlY2tzOyAvLyBwYyBxdWVyeSB0YWtlcyBvdmVyXG5cbiAgICAgIHNlbGVjdG9yLmNvbXBvdW5kQ291bnQrKztcbiAgICAgIHJldHVybiBfZGVzY2VuZGFudDI7IC8vIHdlJ3JlIG5vdyBwb3B1bGF0aW5nIHRoZSBjaGlsZFxuICAgIH1cbiAgfVxufSwge1xuICBuYW1lOiAnc3ViamVjdCcsXG4gIG1vZGlmaWVyOiB0cnVlLFxuICByZWdleDogdG9rZW5zLnN1YmplY3QsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgIT0gbnVsbCAmJiBzZWxlY3Rvci5jdXJyZW50U3ViamVjdCAhPT0gcXVlcnkpIHtcbiAgICAgIHdhcm4oJ1JlZGVmaW5pdGlvbiBvZiBzdWJqZWN0IGluIHNlbGVjdG9yIGAnICsgc2VsZWN0b3IudG9TdHJpbmcoKSArICdgJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID0gcXVlcnk7XG4gICAgdmFyIHRvcFEgPSBzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGggLSAxXTtcbiAgICB2YXIgdG9wQ2hrID0gdG9wUS5jaGVja3NbMF07XG4gICAgdmFyIHRvcFR5cGUgPSB0b3BDaGsgPT0gbnVsbCA/IG51bGwgOiB0b3BDaGsudHlwZTtcbiAgICBpZiAodG9wVHlwZSA9PT0gVHlwZS5ESVJFQ1RFRF9FREdFKSB7XG4gICAgICAvLyBkaXJlY3RlZCBlZGdlIHdpdGggc3ViamVjdCBvbiB0aGUgdGFyZ2V0XG5cbiAgICAgIC8vIGNoYW5nZSB0byB0YXJnZXQgbm9kZSBjaGVja1xuICAgICAgdG9wQ2hrLnR5cGUgPSBUeXBlLk5PREVfVEFSR0VUO1xuICAgIH0gZWxzZSBpZiAodG9wVHlwZSA9PT0gVHlwZS5VTkRJUkVDVEVEX0VER0UpIHtcbiAgICAgIC8vIHVuZGlyZWN0ZWQgZWRnZSB3aXRoIHN1YmplY3Qgb24gdGhlIHNlY29uZCBub2RlXG5cbiAgICAgIC8vIGNoYW5nZSB0byBuZWlnaGJvciBjaGVja1xuICAgICAgdG9wQ2hrLnR5cGUgPSBUeXBlLk5PREVfTkVJR0hCT1I7XG4gICAgICB0b3BDaGsubm9kZSA9IHRvcENoay5ub2Rlc1sxXTsgLy8gc2Vjb25kIG5vZGUgaXMgc3ViamVjdFxuICAgICAgdG9wQ2hrLm5laWdoYm9yID0gdG9wQ2hrLm5vZGVzWzBdO1xuXG4gICAgICAvLyBjbGVhbiB1cCB1bnVzZWQgZmllbGRzIGZvciBuZXcgdHlwZVxuICAgICAgdG9wQ2hrLm5vZGVzID0gbnVsbDtcbiAgICB9XG4gIH1cbn1dO1xuZXhwcnMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICByZXR1cm4gZS5yZWdleE9iaiA9IG5ldyBSZWdFeHAoJ14nICsgZS5yZWdleCk7XG59KTtcblxuLyoqXG4gKiBPZiBhbGwgdGhlIGV4cHJlc3Npb25zLCBmaW5kIHRoZSBmaXJzdCBtYXRjaCBpbiB0aGUgcmVtYWluaW5nIHRleHQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtYWluaW5nIFRoZSByZW1haW5pbmcgdGV4dCB0byBwYXJzZVxuICogQHJldHVybnMgVGhlIG1hdGNoZWQgZXhwcmVzc2lvbiBhbmQgdGhlIG5ld2x5IHJlbWFpbmluZyB0ZXh0IGB7IGV4cHIsIG1hdGNoLCBuYW1lLCByZW1haW5pbmcgfWBcbiAqL1xudmFyIGNvbnN1bWVFeHByID0gZnVuY3Rpb24gY29uc3VtZUV4cHIocmVtYWluaW5nKSB7XG4gIHZhciBleHByO1xuICB2YXIgbWF0Y2g7XG4gIHZhciBuYW1lO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IGV4cHJzLmxlbmd0aDsgaisrKSB7XG4gICAgdmFyIGUgPSBleHByc1tqXTtcbiAgICB2YXIgbiA9IGUubmFtZTtcbiAgICB2YXIgbSA9IHJlbWFpbmluZy5tYXRjaChlLnJlZ2V4T2JqKTtcbiAgICBpZiAobSAhPSBudWxsKSB7XG4gICAgICBtYXRjaCA9IG07XG4gICAgICBleHByID0gZTtcbiAgICAgIG5hbWUgPSBuO1xuICAgICAgdmFyIGNvbnN1bWVkID0gbVswXTtcbiAgICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZy5zdWJzdHJpbmcoY29uc3VtZWQubGVuZ3RoKTtcbiAgICAgIGJyZWFrOyAvLyB3ZSd2ZSBjb25zdW1lZCBvbmUgZXhwciwgc28gd2UgY2FuIHJldHVybiBub3dcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGV4cHI6IGV4cHIsXG4gICAgbWF0Y2g6IG1hdGNoLFxuICAgIG5hbWU6IG5hbWUsXG4gICAgcmVtYWluaW5nOiByZW1haW5pbmdcbiAgfTtcbn07XG5cbi8qKlxuICogQ29uc3VtZSBhbGwgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbWFpbmluZyBUaGUgdGV4dCB0byBjb25zdW1lXG4gKiBAcmV0dXJucyBUaGUgdGV4dCB3aXRoIHRoZSBsZWFkaW5nIHdoaXRlc3BhY2UgcmVtb3ZlZFxuICovXG52YXIgY29uc3VtZVdoaXRlc3BhY2UgPSBmdW5jdGlvbiBjb25zdW1lV2hpdGVzcGFjZShyZW1haW5pbmcpIHtcbiAgdmFyIG1hdGNoID0gcmVtYWluaW5nLm1hdGNoKC9eXFxzKy8pO1xuICBpZiAobWF0Y2gpIHtcbiAgICB2YXIgY29uc3VtZWQgPSBtYXRjaFswXTtcbiAgICByZW1haW5pbmcgPSByZW1haW5pbmcuc3Vic3RyaW5nKGNvbnN1bWVkLmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIHJlbWFpbmluZztcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIHN0cmluZyBhbmQgc3RvcmUgdGhlIHBhcnNlZCByZXByZXNlbnRhdGlvbiBpbiB0aGUgU2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHN0cmluZ1xuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBzZWxlY3RvciB3YXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwgYGZhbHNlYCBvdGhlcndpc2VcbiAqL1xudmFyIHBhcnNlID0gZnVuY3Rpb24gcGFyc2Uoc2VsZWN0b3IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcmVtYWluaW5nID0gc2VsZi5pbnB1dFRleHQgPSBzZWxlY3RvcjtcbiAgdmFyIGN1cnJlbnRRdWVyeSA9IHNlbGZbMF0gPSBuZXdRdWVyeSgpO1xuICBzZWxmLmxlbmd0aCA9IDE7XG4gIHJlbWFpbmluZyA9IGNvbnN1bWVXaGl0ZXNwYWNlKHJlbWFpbmluZyk7IC8vIGdldCByaWQgb2YgbGVhZGluZyB3aGl0ZXNwYWNlXG5cbiAgZm9yICg7Oykge1xuICAgIHZhciBleHBySW5mbyA9IGNvbnN1bWVFeHByKHJlbWFpbmluZyk7XG4gICAgaWYgKGV4cHJJbmZvLmV4cHIgPT0gbnVsbCkge1xuICAgICAgd2FybignVGhlIHNlbGVjdG9yIGAnICsgc2VsZWN0b3IgKyAnYGlzIGludmFsaWQnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyZ3MgPSBleHBySW5mby5tYXRjaC5zbGljZSgxKTtcblxuICAgICAgLy8gbGV0IHRoZSB0b2tlbiBwb3B1bGF0ZSB0aGUgc2VsZWN0b3Igb2JqZWN0IGluIGN1cnJlbnRRdWVyeVxuICAgICAgdmFyIHJldCA9IGV4cHJJbmZvLmV4cHIucG9wdWxhdGUoc2VsZiwgY3VycmVudFF1ZXJ5LCBhcmdzKTtcbiAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gZXhpdCBpZiBwb3B1bGF0aW9uIGZhaWxlZFxuICAgICAgfSBlbHNlIGlmIChyZXQgIT0gbnVsbCkge1xuICAgICAgICBjdXJyZW50UXVlcnkgPSByZXQ7IC8vIGNoYW5nZSB0aGUgY3VycmVudCBxdWVyeSB0byBiZSBmaWxsZWQgaWYgdGhlIGV4cHIgc3BlY2lmaWVzXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVtYWluaW5nID0gZXhwckluZm8ucmVtYWluaW5nO1xuXG4gICAgLy8gd2UncmUgZG9uZSB3aGVuIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIHBhcnNlXG4gICAgaWYgKHJlbWFpbmluZy5tYXRjaCgvXlxccyokLykpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB2YXIgbGFzdFEgPSBzZWxmW3NlbGYubGVuZ3RoIC0gMV07XG4gIGlmIChzZWxmLmN1cnJlbnRTdWJqZWN0ICE9IG51bGwpIHtcbiAgICBsYXN0US5zdWJqZWN0ID0gc2VsZi5jdXJyZW50U3ViamVjdDtcbiAgfVxuICBsYXN0US5lZGdlQ291bnQgPSBzZWxmLmVkZ2VDb3VudDtcbiAgbGFzdFEuY29tcG91bmRDb3VudCA9IHNlbGYuY29tcG91bmRDb3VudDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHEgPSBzZWxmW2ldO1xuXG4gICAgLy8gaW4gZnV0dXJlLCB0aGlzIGNvdWxkIHBvdGVudGlhbGx5IGJlIGFsbG93ZWQgaWYgdGhlcmUgd2VyZSBvcGVyYXRvciBwcmVjZWRlbmNlIGFuZCBkZXRlY3Rpb24gb2YgaW52YWxpZCBjb21iaW5hdGlvbnNcbiAgICBpZiAocS5jb21wb3VuZENvdW50ID4gMCAmJiBxLmVkZ2VDb3VudCA+IDApIHtcbiAgICAgIHdhcm4oJ1RoZSBzZWxlY3RvciBgJyArIHNlbGVjdG9yICsgJ2AgaXMgaW52YWxpZCBiZWNhdXNlIGl0IHVzZXMgYm90aCBhIGNvbXBvdW5kIHNlbGVjdG9yIGFuZCBhbiBlZGdlIHNlbGVjdG9yJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChxLmVkZ2VDb3VudCA+IDEpIHtcbiAgICAgIHdhcm4oJ1RoZSBzZWxlY3RvciBgJyArIHNlbGVjdG9yICsgJ2AgaXMgaW52YWxpZCBiZWNhdXNlIGl0IHVzZXMgbXVsdGlwbGUgZWRnZSBzZWxlY3RvcnMnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHEuZWRnZUNvdW50ID09PSAxKSB7XG4gICAgICB3YXJuKCdUaGUgc2VsZWN0b3IgYCcgKyBzZWxlY3RvciArICdgIGlzIGRlcHJlY2F0ZWQuICBFZGdlIHNlbGVjdG9ycyBkbyBub3QgdGFrZSBlZmZlY3Qgb24gY2hhbmdlcyB0byBzb3VyY2UgYW5kIHRhcmdldCBub2RlcyBhZnRlciBhbiBlZGdlIGlzIGFkZGVkLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gIFVzZSBhIGNsYXNzIG9yIGRhdGEgc2VsZWN0b3Igb24gZWRnZXMgaW5zdGVhZCwgdXBkYXRpbmcgdGhlIGNsYXNzIG9yIGRhdGEgb2YgYW4gZWRnZSB3aGVuIHlvdXIgYXBwIGRldGVjdHMgYSBjaGFuZ2UgaW4gc291cmNlIG9yIHRhcmdldCBub2Rlcy4nKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7IC8vIHN1Y2Nlc3Ncbn07XG5cbi8qKlxuICogR2V0IHRoZSBzZWxlY3RvciByZXByZXNlbnRlZCBhcyBhIHN0cmluZy4gIFRoaXMgdmFsdWUgdXNlcyBkZWZhdWx0IGZvcm1hdHRpbmcsXG4gKiBzbyB0aGluZ3MgbGlrZSBzcGFjaW5nIG1heSBkaWZmZXIgZnJvbSB0aGUgaW5wdXQgdGV4dCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbGVjdG9yIHN0cmluZ1xuICovXG52YXIgdG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgaWYgKHRoaXMudG9TdHJpbmdDYWNoZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMudG9TdHJpbmdDYWNoZTtcbiAgfVxuICB2YXIgY2xlYW4gPSBmdW5jdGlvbiBjbGVhbihvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gIH07XG4gIHZhciBjbGVhblZhbCA9IGZ1bmN0aW9uIGNsZWFuVmFsKHZhbCkge1xuICAgIGlmIChzdHJpbmcodmFsKSkge1xuICAgICAgcmV0dXJuICdcIicgKyB2YWwgKyAnXCInO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY2xlYW4odmFsKTtcbiAgICB9XG4gIH07XG4gIHZhciBzcGFjZSA9IGZ1bmN0aW9uIHNwYWNlKHZhbCkge1xuICAgIHJldHVybiAnICcgKyB2YWwgKyAnICc7XG4gIH07XG4gIHZhciBjaGVja1RvU3RyaW5nID0gZnVuY3Rpb24gY2hlY2tUb1N0cmluZyhjaGVjaywgc3ViamVjdCkge1xuICAgIHZhciB0eXBlID0gY2hlY2sudHlwZSxcbiAgICAgIHZhbHVlID0gY2hlY2sudmFsdWU7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFR5cGUuR1JPVVA6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgZ3JvdXAgPSBjbGVhbih2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGdyb3VwLnN1YnN0cmluZygwLCBncm91cC5sZW5ndGggLSAxKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLkRBVEFfQ09NUEFSRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBmaWVsZCA9IGNoZWNrLmZpZWxkLFxuICAgICAgICAgICAgb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcjtcbiAgICAgICAgICByZXR1cm4gJ1snICsgZmllbGQgKyBzcGFjZShjbGVhbihvcGVyYXRvcikpICsgY2xlYW5WYWwodmFsdWUpICsgJ10nO1xuICAgICAgICB9XG4gICAgICBjYXNlIFR5cGUuREFUQV9CT09MOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9vcGVyYXRvciA9IGNoZWNrLm9wZXJhdG9yLFxuICAgICAgICAgICAgX2ZpZWxkID0gY2hlY2suZmllbGQ7XG4gICAgICAgICAgcmV0dXJuICdbJyArIGNsZWFuKF9vcGVyYXRvcikgKyBfZmllbGQgKyAnXSc7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHlwZS5EQVRBX0VYSVNUOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9maWVsZDIgPSBjaGVjay5maWVsZDtcbiAgICAgICAgICByZXR1cm4gJ1snICsgX2ZpZWxkMiArICddJztcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLk1FVEFfQ09NUEFSRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfb3BlcmF0b3IyID0gY2hlY2sub3BlcmF0b3IsXG4gICAgICAgICAgICBfZmllbGQzID0gY2hlY2suZmllbGQ7XG4gICAgICAgICAgcmV0dXJuICdbWycgKyBfZmllbGQzICsgc3BhY2UoY2xlYW4oX29wZXJhdG9yMikpICsgY2xlYW5WYWwodmFsdWUpICsgJ11dJztcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLlNUQVRFOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICBjYXNlIFR5cGUuSUQ6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gJyMnICsgdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHlwZS5DTEFTUzpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiAnLicgKyB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLlBBUkVOVDpcbiAgICAgIGNhc2UgVHlwZS5DSElMRDpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBxdWVyeVRvU3RyaW5nKGNoZWNrLnBhcmVudCwgc3ViamVjdCkgKyBzcGFjZSgnPicpICsgcXVlcnlUb1N0cmluZyhjaGVjay5jaGlsZCwgc3ViamVjdCk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHlwZS5BTkNFU1RPUjpcbiAgICAgIGNhc2UgVHlwZS5ERVNDRU5EQU5UOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHF1ZXJ5VG9TdHJpbmcoY2hlY2suYW5jZXN0b3IsIHN1YmplY3QpICsgJyAnICsgcXVlcnlUb1N0cmluZyhjaGVjay5kZXNjZW5kYW50LCBzdWJqZWN0KTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLkNPTVBPVU5EX1NQTElUOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxocyA9IHF1ZXJ5VG9TdHJpbmcoY2hlY2subGVmdCwgc3ViamVjdCk7XG4gICAgICAgICAgdmFyIHN1YiA9IHF1ZXJ5VG9TdHJpbmcoY2hlY2suc3ViamVjdCwgc3ViamVjdCk7XG4gICAgICAgICAgdmFyIHJocyA9IHF1ZXJ5VG9TdHJpbmcoY2hlY2sucmlnaHQsIHN1YmplY3QpO1xuICAgICAgICAgIHJldHVybiBsaHMgKyAobGhzLmxlbmd0aCA+IDAgPyAnICcgOiAnJykgKyBzdWIgKyByaHM7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHlwZS5UUlVFOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgcXVlcnlUb1N0cmluZyA9IGZ1bmN0aW9uIHF1ZXJ5VG9TdHJpbmcocXVlcnksIHN1YmplY3QpIHtcbiAgICByZXR1cm4gcXVlcnkuY2hlY2tzLnJlZHVjZShmdW5jdGlvbiAoc3RyLCBjaGssIGkpIHtcbiAgICAgIHJldHVybiBzdHIgKyAoc3ViamVjdCA9PT0gcXVlcnkgJiYgaSA9PT0gMCA/ICckJyA6ICcnKSArIGNoZWNrVG9TdHJpbmcoY2hrLCBzdWJqZWN0KTtcbiAgICB9LCAnJyk7XG4gIH07XG4gIHZhciBzdHIgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHF1ZXJ5ID0gdGhpc1tpXTtcbiAgICBzdHIgKz0gcXVlcnlUb1N0cmluZyhxdWVyeSwgcXVlcnkuc3ViamVjdCk7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMSAmJiBpIDwgdGhpcy5sZW5ndGggLSAxKSB7XG4gICAgICBzdHIgKz0gJywgJztcbiAgICB9XG4gIH1cbiAgdGhpcy50b1N0cmluZ0NhY2hlID0gc3RyO1xuICByZXR1cm4gc3RyO1xufTtcbnZhciBwYXJzZSQxID0ge1xuICBwYXJzZTogcGFyc2UsXG4gIHRvU3RyaW5nOiB0b1N0cmluZ1xufTtcblxudmFyIHZhbENtcCA9IGZ1bmN0aW9uIHZhbENtcChmaWVsZFZhbCwgb3BlcmF0b3IsIHZhbHVlKSB7XG4gIHZhciBtYXRjaGVzO1xuICB2YXIgaXNGaWVsZFN0ciA9IHN0cmluZyhmaWVsZFZhbCk7XG4gIHZhciBpc0ZpZWxkTnVtID0gbnVtYmVyJDEoZmllbGRWYWwpO1xuICB2YXIgaXNWYWxTdHIgPSBzdHJpbmcodmFsdWUpO1xuICB2YXIgZmllbGRTdHIsIHZhbFN0cjtcbiAgdmFyIGNhc2VJbnNlbnNpdGl2ZSA9IGZhbHNlO1xuICB2YXIgbm90RXhwciA9IGZhbHNlO1xuICB2YXIgaXNJbmVxQ21wID0gZmFsc2U7XG4gIGlmIChvcGVyYXRvci5pbmRleE9mKCchJykgPj0gMCkge1xuICAgIG9wZXJhdG9yID0gb3BlcmF0b3IucmVwbGFjZSgnIScsICcnKTtcbiAgICBub3RFeHByID0gdHJ1ZTtcbiAgfVxuICBpZiAob3BlcmF0b3IuaW5kZXhPZignQCcpID49IDApIHtcbiAgICBvcGVyYXRvciA9IG9wZXJhdG9yLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgY2FzZUluc2Vuc2l0aXZlID0gdHJ1ZTtcbiAgfVxuICBpZiAoaXNGaWVsZFN0ciB8fCBpc1ZhbFN0ciB8fCBjYXNlSW5zZW5zaXRpdmUpIHtcbiAgICBmaWVsZFN0ciA9ICFpc0ZpZWxkU3RyICYmICFpc0ZpZWxkTnVtID8gJycgOiAnJyArIGZpZWxkVmFsO1xuICAgIHZhbFN0ciA9ICcnICsgdmFsdWU7XG4gIH1cblxuICAvLyBpZiB3ZSdyZSBkb2luZyBhIGNhc2UgaW5zZW5zaXRpdmUgY29tcGFyaXNvbiwgdGhlbiB3ZSdyZSB1c2luZyBhIFNUUklORyBjb21wYXJpc29uXG4gIC8vIGV2ZW4gaWYgd2UncmUgY29tcGFyaW5nIG51bWJlcnNcbiAgaWYgKGNhc2VJbnNlbnNpdGl2ZSkge1xuICAgIGZpZWxkVmFsID0gZmllbGRTdHIgPSBmaWVsZFN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbHVlID0gdmFsU3RyID0gdmFsU3RyLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgIGNhc2UgJyo9JzpcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFN0ci5pbmRleE9mKHZhbFN0cikgPj0gMDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJyQ9JzpcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFN0ci5pbmRleE9mKHZhbFN0ciwgZmllbGRTdHIubGVuZ3RoIC0gdmFsU3RyLmxlbmd0aCkgPj0gMDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ149JzpcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFN0ci5pbmRleE9mKHZhbFN0cikgPT09IDA7XG4gICAgICBicmVhaztcbiAgICBjYXNlICc9JzpcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFZhbCA9PT0gdmFsdWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlICc+JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPiB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJz49JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPj0gdmFsdWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlICc8JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPCB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJzw9JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPD0gdmFsdWU7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgbWF0Y2hlcyA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICAvLyBhcHBseSB0aGUgbm90IG9wLCBidXQgbnVsbCB2YWxzIGZvciBpbmVxdWFsaXRpZXMgc2hvdWxkIGFsd2F5cyBzdGF5IG5vbi1tYXRjaGluZ1xuICBpZiAobm90RXhwciAmJiAoZmllbGRWYWwgIT0gbnVsbCB8fCAhaXNJbmVxQ21wKSkge1xuICAgIG1hdGNoZXMgPSAhbWF0Y2hlcztcbiAgfVxuICByZXR1cm4gbWF0Y2hlcztcbn07XG52YXIgYm9vbENtcCA9IGZ1bmN0aW9uIGJvb2xDbXAoZmllbGRWYWwsIG9wZXJhdG9yKSB7XG4gIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICBjYXNlICc/JzpcbiAgICAgIHJldHVybiBmaWVsZFZhbCA/IHRydWUgOiBmYWxzZTtcbiAgICBjYXNlICchJzpcbiAgICAgIHJldHVybiBmaWVsZFZhbCA/IGZhbHNlIDogdHJ1ZTtcbiAgICBjYXNlICdeJzpcbiAgICAgIHJldHVybiBmaWVsZFZhbCA9PT0gdW5kZWZpbmVkO1xuICB9XG59O1xudmFyIGV4aXN0Q21wID0gZnVuY3Rpb24gZXhpc3RDbXAoZmllbGRWYWwpIHtcbiAgcmV0dXJuIGZpZWxkVmFsICE9PSB1bmRlZmluZWQ7XG59O1xudmFyIGRhdGEkMSA9IGZ1bmN0aW9uIGRhdGEoZWxlLCBmaWVsZCkge1xuICByZXR1cm4gZWxlLmRhdGEoZmllbGQpO1xufTtcbnZhciBtZXRhID0gZnVuY3Rpb24gbWV0YShlbGUsIGZpZWxkKSB7XG4gIHJldHVybiBlbGVbZmllbGRdKCk7XG59O1xuXG4vKiogQSBsb29rdXAgb2YgYG1hdGNoKGNoZWNrLCBlbGUpYCBmdW5jdGlvbnMgYnkgYFR5cGVgIGludCAqL1xudmFyIG1hdGNoID0gW107XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBxdWVyeSBtYXRjaGVzIGZvciB0aGUgZWxlbWVudFxuICogQHBhcmFtIHF1ZXJ5IFRoZSBgeyB0eXBlLCB2YWx1ZSwgLi4uIH1gIHF1ZXJ5IG9iamVjdFxuICogQHBhcmFtIGVsZSBUaGUgZWxlbWVudCB0byBjb21wYXJlIGFnYWluc3RcbiovXG52YXIgbWF0Y2hlcyQxID0gZnVuY3Rpb24gbWF0Y2hlcyhxdWVyeSwgZWxlKSB7XG4gIHJldHVybiBxdWVyeS5jaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoaykge1xuICAgIHJldHVybiBtYXRjaFtjaGsudHlwZV0oY2hrLCBlbGUpO1xuICB9KTtcbn07XG5tYXRjaFtUeXBlLkdST1VQXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBncm91cCA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gZ3JvdXAgPT09ICcqJyB8fCBncm91cCA9PT0gZWxlLmdyb3VwKCk7XG59O1xubWF0Y2hbVHlwZS5TVEFURV0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICB2YXIgc3RhdGVTZWxlY3RvciA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gc3RhdGVTZWxlY3Rvck1hdGNoZXMoc3RhdGVTZWxlY3RvciwgZWxlKTtcbn07XG5tYXRjaFtUeXBlLklEXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBpZCA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gZWxlLmlkKCkgPT09IGlkO1xufTtcbm1hdGNoW1R5cGUuQ0xBU1NdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGNscyA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gZWxlLmhhc0NsYXNzKGNscyk7XG59O1xubWF0Y2hbVHlwZS5NRVRBX0NPTVBBUkVdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGZpZWxkID0gY2hlY2suZmllbGQsXG4gICAgb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcixcbiAgICB2YWx1ZSA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gdmFsQ21wKG1ldGEoZWxlLCBmaWVsZCksIG9wZXJhdG9yLCB2YWx1ZSk7XG59O1xubWF0Y2hbVHlwZS5EQVRBX0NPTVBBUkVdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGZpZWxkID0gY2hlY2suZmllbGQsXG4gICAgb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcixcbiAgICB2YWx1ZSA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gdmFsQ21wKGRhdGEkMShlbGUsIGZpZWxkKSwgb3BlcmF0b3IsIHZhbHVlKTtcbn07XG5tYXRjaFtUeXBlLkRBVEFfQk9PTF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICB2YXIgZmllbGQgPSBjaGVjay5maWVsZCxcbiAgICBvcGVyYXRvciA9IGNoZWNrLm9wZXJhdG9yO1xuICByZXR1cm4gYm9vbENtcChkYXRhJDEoZWxlLCBmaWVsZCksIG9wZXJhdG9yKTtcbn07XG5tYXRjaFtUeXBlLkRBVEFfRVhJU1RdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGZpZWxkID0gY2hlY2suZmllbGQ7XG4gICAgY2hlY2sub3BlcmF0b3I7XG4gIHJldHVybiBleGlzdENtcChkYXRhJDEoZWxlLCBmaWVsZCkpO1xufTtcbm1hdGNoW1R5cGUuVU5ESVJFQ1RFRF9FREdFXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBxQSA9IGNoZWNrLm5vZGVzWzBdO1xuICB2YXIgcUIgPSBjaGVjay5ub2Rlc1sxXTtcbiAgdmFyIHNyYyA9IGVsZS5zb3VyY2UoKTtcbiAgdmFyIHRndCA9IGVsZS50YXJnZXQoKTtcbiAgcmV0dXJuIG1hdGNoZXMkMShxQSwgc3JjKSAmJiBtYXRjaGVzJDEocUIsIHRndCkgfHwgbWF0Y2hlcyQxKHFCLCBzcmMpICYmIG1hdGNoZXMkMShxQSwgdGd0KTtcbn07XG5tYXRjaFtUeXBlLk5PREVfTkVJR0hCT1JdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgcmV0dXJuIG1hdGNoZXMkMShjaGVjay5ub2RlLCBlbGUpICYmIGVsZS5uZWlnaGJvcmhvb2QoKS5zb21lKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuIG4uaXNOb2RlKCkgJiYgbWF0Y2hlcyQxKGNoZWNrLm5laWdoYm9yLCBuKTtcbiAgfSk7XG59O1xubWF0Y2hbVHlwZS5ESVJFQ1RFRF9FREdFXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzJDEoY2hlY2suc291cmNlLCBlbGUuc291cmNlKCkpICYmIG1hdGNoZXMkMShjaGVjay50YXJnZXQsIGVsZS50YXJnZXQoKSk7XG59O1xubWF0Y2hbVHlwZS5OT0RFX1NPVVJDRV0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLnNvdXJjZSwgZWxlKSAmJiBlbGUub3V0Z29lcnMoKS5zb21lKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuIG4uaXNOb2RlKCkgJiYgbWF0Y2hlcyQxKGNoZWNrLnRhcmdldCwgbik7XG4gIH0pO1xufTtcbm1hdGNoW1R5cGUuTk9ERV9UQVJHRVRdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgcmV0dXJuIG1hdGNoZXMkMShjaGVjay50YXJnZXQsIGVsZSkgJiYgZWxlLmluY29tZXJzKCkuc29tZShmdW5jdGlvbiAobikge1xuICAgIHJldHVybiBuLmlzTm9kZSgpICYmIG1hdGNoZXMkMShjaGVjay5zb3VyY2UsIG4pO1xuICB9KTtcbn07XG5tYXRjaFtUeXBlLkNISUxEXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzJDEoY2hlY2suY2hpbGQsIGVsZSkgJiYgbWF0Y2hlcyQxKGNoZWNrLnBhcmVudCwgZWxlLnBhcmVudCgpKTtcbn07XG5tYXRjaFtUeXBlLlBBUkVOVF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLnBhcmVudCwgZWxlKSAmJiBlbGUuY2hpbGRyZW4oKS5zb21lKGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuIG1hdGNoZXMkMShjaGVjay5jaGlsZCwgYyk7XG4gIH0pO1xufTtcbm1hdGNoW1R5cGUuREVTQ0VOREFOVF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLmRlc2NlbmRhbnQsIGVsZSkgJiYgZWxlLmFuY2VzdG9ycygpLnNvbWUoZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLmFuY2VzdG9yLCBhKTtcbiAgfSk7XG59O1xubWF0Y2hbVHlwZS5BTkNFU1RPUl0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLmFuY2VzdG9yLCBlbGUpICYmIGVsZS5kZXNjZW5kYW50cygpLnNvbWUoZnVuY3Rpb24gKGQpIHtcbiAgICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLmRlc2NlbmRhbnQsIGQpO1xuICB9KTtcbn07XG5tYXRjaFtUeXBlLkNPTVBPVU5EX1NQTElUXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzJDEoY2hlY2suc3ViamVjdCwgZWxlKSAmJiBtYXRjaGVzJDEoY2hlY2subGVmdCwgZWxlKSAmJiBtYXRjaGVzJDEoY2hlY2sucmlnaHQsIGVsZSk7XG59O1xubWF0Y2hbVHlwZS5UUlVFXSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xubWF0Y2hbVHlwZS5DT0xMRUNUSU9OXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBjb2xsZWN0aW9uID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiBjb2xsZWN0aW9uLmhhcyhlbGUpO1xufTtcbm1hdGNoW1R5cGUuRklMVEVSXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBmaWx0ZXIgPSBjaGVjay52YWx1ZTtcbiAgcmV0dXJuIGZpbHRlcihlbGUpO1xufTtcblxuLy8gZmlsdGVyIGFuIGV4aXN0aW5nIGNvbGxlY3Rpb25cbnZhciBmaWx0ZXIgPSBmdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgLy8gZm9yIDEgaWQgI2ZvbyBxdWVyaWVzLCBqdXN0IGdldCB0aGUgZWxlbWVudFxuICBpZiAoc2VsZi5sZW5ndGggPT09IDEgJiYgc2VsZlswXS5jaGVja3MubGVuZ3RoID09PSAxICYmIHNlbGZbMF0uY2hlY2tzWzBdLnR5cGUgPT09IFR5cGUuSUQpIHtcbiAgICByZXR1cm4gY29sbGVjdGlvbi5nZXRFbGVtZW50QnlJZChzZWxmWzBdLmNoZWNrc1swXS52YWx1ZSkuY29sbGVjdGlvbigpO1xuICB9XG4gIHZhciBzZWxlY3RvckZ1bmN0aW9uID0gZnVuY3Rpb24gc2VsZWN0b3JGdW5jdGlvbihlbGVtZW50KSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWxmLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgcXVlcnkgPSBzZWxmW2pdO1xuICAgICAgaWYgKG1hdGNoZXMkMShxdWVyeSwgZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgaWYgKHNlbGYudGV4dCgpID09IG51bGwpIHtcbiAgICBzZWxlY3RvckZ1bmN0aW9uID0gZnVuY3Rpb24gc2VsZWN0b3JGdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGNvbGxlY3Rpb24uZmlsdGVyKHNlbGVjdG9yRnVuY3Rpb24pO1xufTsgLy8gZmlsdGVyXG5cbi8vIGRvZXMgc2VsZWN0b3IgbWF0Y2ggYSBzaW5nbGUgZWxlbWVudD9cbnZhciBtYXRjaGVzID0gZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IHNlbGYubGVuZ3RoOyBqKyspIHtcbiAgICB2YXIgcXVlcnkgPSBzZWxmW2pdO1xuICAgIGlmIChtYXRjaGVzJDEocXVlcnksIGVsZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59OyAvLyBtYXRjaGVzXG5cbnZhciBtYXRjaGluZyA9IHtcbiAgbWF0Y2hlczogbWF0Y2hlcyxcbiAgZmlsdGVyOiBmaWx0ZXJcbn07XG5cbnZhciBTZWxlY3RvciA9IGZ1bmN0aW9uIFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIHRoaXMuaW5wdXRUZXh0ID0gc2VsZWN0b3I7XG4gIHRoaXMuY3VycmVudFN1YmplY3QgPSBudWxsO1xuICB0aGlzLmNvbXBvdW5kQ291bnQgPSAwO1xuICB0aGlzLmVkZ2VDb3VudCA9IDA7XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgaWYgKHNlbGVjdG9yID09IG51bGwgfHwgc3RyaW5nKHNlbGVjdG9yKSAmJiBzZWxlY3Rvci5tYXRjaCgvXlxccyokLykpIDsgZWxzZSBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihzZWxlY3RvcikpIHtcbiAgICB0aGlzLmFkZFF1ZXJ5KHtcbiAgICAgIGNoZWNrczogW3tcbiAgICAgICAgdHlwZTogVHlwZS5DT0xMRUNUSU9OLFxuICAgICAgICB2YWx1ZTogc2VsZWN0b3IuY29sbGVjdGlvbigpXG4gICAgICB9XVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGZuJDYoc2VsZWN0b3IpKSB7XG4gICAgdGhpcy5hZGRRdWVyeSh7XG4gICAgICBjaGVja3M6IFt7XG4gICAgICAgIHR5cGU6IFR5cGUuRklMVEVSLFxuICAgICAgICB2YWx1ZTogc2VsZWN0b3JcbiAgICAgIH1dXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoc3RyaW5nKHNlbGVjdG9yKSkge1xuICAgIGlmICghdGhpcy5wYXJzZShzZWxlY3RvcikpIHtcbiAgICAgIHRoaXMuaW52YWxpZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGVycm9yKCdBIHNlbGVjdG9yIG11c3QgYmUgY3JlYXRlZCBmcm9tIGEgc3RyaW5nOyBmb3VuZCAnKTtcbiAgfVxufTtcbnZhciBzZWxmbiA9IFNlbGVjdG9yLnByb3RvdHlwZTtcbltwYXJzZSQxLCBtYXRjaGluZ10uZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICByZXR1cm4gZXh0ZW5kKHNlbGZuLCBwKTtcbn0pO1xuc2VsZm4udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuaW5wdXRUZXh0O1xufTtcbnNlbGZuLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxlbmd0aDtcbn07XG5zZWxmbi5lcSA9IGZ1bmN0aW9uIChpKSB7XG4gIHJldHVybiB0aGlzW2ldO1xufTtcbnNlbGZuLnNhbWVUZXh0ID0gZnVuY3Rpb24gKG90aGVyU2VsKSB7XG4gIHJldHVybiAhdGhpcy5pbnZhbGlkICYmICFvdGhlclNlbC5pbnZhbGlkICYmIHRoaXMudGV4dCgpID09PSBvdGhlclNlbC50ZXh0KCk7XG59O1xuc2VsZm4uYWRkUXVlcnkgPSBmdW5jdGlvbiAocSkge1xuICB0aGlzW3RoaXMubGVuZ3RoKytdID0gcTtcbn07XG5zZWxmbi5zZWxlY3RvciA9IHNlbGZuLnRvU3RyaW5nO1xuXG52YXIgZWxlc2ZuJGcgPSB7XG4gIGFsbEFyZTogZnVuY3Rpb24gYWxsQXJlKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbE9iaiA9IG5ldyBTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgcmV0dXJuIHRoaXMuZXZlcnkoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIHNlbE9iai5tYXRjaGVzKGVsZSk7XG4gICAgfSk7XG4gIH0sXG4gIGlzOiBmdW5jdGlvbiBpcyhzZWxlY3Rvcikge1xuICAgIHZhciBzZWxPYmogPSBuZXcgU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIHJldHVybiB0aGlzLnNvbWUoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIHNlbE9iai5tYXRjaGVzKGVsZSk7XG4gICAgfSk7XG4gIH0sXG4gIHNvbWU6IGZ1bmN0aW9uIHNvbWUoZm4sIHRoaXNBcmcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZXQgPSAhdGhpc0FyZyA/IGZuKHRoaXNbaV0sIGksIHRoaXMpIDogZm4uYXBwbHkodGhpc0FyZywgW3RoaXNbaV0sIGksIHRoaXNdKTtcbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGZuLCB0aGlzQXJnKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmV0ID0gIXRoaXNBcmcgPyBmbih0aGlzW2ldLCBpLCB0aGlzKSA6IGZuLmFwcGx5KHRoaXNBcmcsIFt0aGlzW2ldLCBpLCB0aGlzXSk7XG4gICAgICBpZiAoIXJldCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBzYW1lOiBmdW5jdGlvbiBzYW1lKGNvbGxlY3Rpb24pIHtcbiAgICAvLyBjaGVhcCBjb2xsZWN0aW9uIHJlZiBjaGVja1xuICAgIGlmICh0aGlzID09PSBjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29sbGVjdGlvbiA9IHRoaXMuY3koKS5jb2xsZWN0aW9uKGNvbGxlY3Rpb24pO1xuICAgIHZhciB0aGlzTGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgdmFyIGNvbGxlY3Rpb25MZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblxuICAgIC8vIGNoZWFwIGxlbmd0aCBjaGVja1xuICAgIGlmICh0aGlzTGVuZ3RoICE9PSBjb2xsZWN0aW9uTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gY2hlYXAgZWxlbWVudCByZWYgY2hlY2tcbiAgICBpZiAodGhpc0xlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXNbMF0gPT09IGNvbGxlY3Rpb25bMF07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV2ZXJ5KGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uLmhhc0VsZW1lbnRXaXRoSWQoZWxlLmlkKCkpO1xuICAgIH0pO1xuICB9LFxuICBhbnlTYW1lOiBmdW5jdGlvbiBhbnlTYW1lKGNvbGxlY3Rpb24pIHtcbiAgICBjb2xsZWN0aW9uID0gdGhpcy5jeSgpLmNvbGxlY3Rpb24oY29sbGVjdGlvbik7XG4gICAgcmV0dXJuIHRoaXMuc29tZShmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbi5oYXNFbGVtZW50V2l0aElkKGVsZS5pZCgpKTtcbiAgICB9KTtcbiAgfSxcbiAgYWxsQXJlTmVpZ2hib3JzOiBmdW5jdGlvbiBhbGxBcmVOZWlnaGJvcnMoY29sbGVjdGlvbikge1xuICAgIGNvbGxlY3Rpb24gPSB0aGlzLmN5KCkuY29sbGVjdGlvbihjb2xsZWN0aW9uKTtcbiAgICB2YXIgbmhvb2QgPSB0aGlzLm5laWdoYm9yaG9vZCgpO1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmV2ZXJ5KGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBuaG9vZC5oYXNFbGVtZW50V2l0aElkKGVsZS5pZCgpKTtcbiAgICB9KTtcbiAgfSxcbiAgY29udGFpbnM6IGZ1bmN0aW9uIGNvbnRhaW5zKGNvbGxlY3Rpb24pIHtcbiAgICBjb2xsZWN0aW9uID0gdGhpcy5jeSgpLmNvbGxlY3Rpb24oY29sbGVjdGlvbik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmV2ZXJ5KGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBzZWxmLmhhc0VsZW1lbnRXaXRoSWQoZWxlLmlkKCkpO1xuICAgIH0pO1xuICB9XG59O1xuZWxlc2ZuJGcuYWxsQXJlTmVpZ2hib3VycyA9IGVsZXNmbiRnLmFsbEFyZU5laWdoYm9ycztcbmVsZXNmbiRnLmhhcyA9IGVsZXNmbiRnLmNvbnRhaW5zO1xuZWxlc2ZuJGcuZXF1YWwgPSBlbGVzZm4kZy5lcXVhbHMgPSBlbGVzZm4kZy5zYW1lO1xuXG52YXIgY2FjaGUgPSBmdW5jdGlvbiBjYWNoZShmbiwgbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gdHJhdmVyc2FsQ2FjaGUoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCkge1xuICAgIHZhciBzZWxlY3Rvck9yRWxlcyA9IGFyZzE7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciBrZXk7XG4gICAgaWYgKHNlbGVjdG9yT3JFbGVzID09IG51bGwpIHtcbiAgICAgIGtleSA9ICcnO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihzZWxlY3Rvck9yRWxlcykgJiYgc2VsZWN0b3JPckVsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBrZXkgPSBzZWxlY3Rvck9yRWxlcy5pZCgpO1xuICAgIH1cbiAgICBpZiAoZWxlcy5sZW5ndGggPT09IDEgJiYga2V5KSB7XG4gICAgICB2YXIgX3AgPSBlbGVzWzBdLl9wcml2YXRlO1xuICAgICAgdmFyIHRjaCA9IF9wLnRyYXZlcnNhbENhY2hlID0gX3AudHJhdmVyc2FsQ2FjaGUgfHwge307XG4gICAgICB2YXIgY2ggPSB0Y2hbbmFtZV0gPSB0Y2hbbmFtZV0gfHwgW107XG4gICAgICB2YXIgaGFzaCA9IGhhc2hTdHJpbmcoa2V5KTtcbiAgICAgIHZhciBjYWNoZUhpdCA9IGNoW2hhc2hdO1xuICAgICAgaWYgKGNhY2hlSGl0KSB7XG4gICAgICAgIHJldHVybiBjYWNoZUhpdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjaFtoYXNoXSA9IGZuLmNhbGwoZWxlcywgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKGVsZXMsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpO1xuICAgIH1cbiAgfTtcbn07XG5cbnZhciBlbGVzZm4kZiA9IHtcbiAgcGFyZW50OiBmdW5jdGlvbiBwYXJlbnQoc2VsZWN0b3IpIHtcbiAgICB2YXIgcGFyZW50cyA9IFtdO1xuXG4gICAgLy8gb3B0aW1pc2F0aW9uIGZvciBzaW5nbGUgZWxlIGNhbGxcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzWzBdLl9wcml2YXRlLnBhcmVudDtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIHZhciBfcGFyZW50ID0gZWxlLl9wcml2YXRlLnBhcmVudDtcbiAgICAgIGlmIChfcGFyZW50KSB7XG4gICAgICAgIHBhcmVudHMucHVzaChfcGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocGFyZW50cywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgcGFyZW50czogZnVuY3Rpb24gcGFyZW50cyhzZWxlY3Rvcikge1xuICAgIHZhciBwYXJlbnRzID0gW107XG4gICAgdmFyIGVsZXMgPSB0aGlzLnBhcmVudCgpO1xuICAgIHdoaWxlIChlbGVzLm5vbmVtcHR5KCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgcGFyZW50cy5wdXNoKGVsZSk7XG4gICAgICB9XG4gICAgICBlbGVzID0gZWxlcy5wYXJlbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocGFyZW50cywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgY29tbW9uQW5jZXN0b3JzOiBmdW5jdGlvbiBjb21tb25BbmNlc3RvcnMoc2VsZWN0b3IpIHtcbiAgICB2YXIgYW5jZXN0b3JzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICB2YXIgcGFyZW50cyA9IGVsZS5wYXJlbnRzKCk7XG4gICAgICBhbmNlc3RvcnMgPSBhbmNlc3RvcnMgfHwgcGFyZW50cztcbiAgICAgIGFuY2VzdG9ycyA9IGFuY2VzdG9ycy5pbnRlcnNlY3QocGFyZW50cyk7IC8vIGN1cnJlbnQgbGlzdCBtdXN0IGJlIGNvbW1vbiB3aXRoIGN1cnJlbnQgZWxlIHBhcmVudHMgc2V0XG4gICAgfVxuXG4gICAgcmV0dXJuIGFuY2VzdG9ycy5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICBvcnBoYW5zOiBmdW5jdGlvbiBvcnBoYW5zKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RkRmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNPcnBoYW4oKTtcbiAgICB9KS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICBub25vcnBoYW5zOiBmdW5jdGlvbiBub25vcnBoYW5zKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RkRmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNDaGlsZCgpO1xuICAgIH0pLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sXG4gIGNoaWxkcmVuOiBjYWNoZShmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgdmFyIGVsZUNoaWxkcmVuID0gZWxlLl9wcml2YXRlLmNoaWxkcmVuO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlbGVDaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGVsZUNoaWxkcmVuW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oY2hpbGRyZW4sIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sICdjaGlsZHJlbicpLFxuICBzaWJsaW5nczogZnVuY3Rpb24gc2libGluZ3Moc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQoKS5jaGlsZHJlbigpLm5vdCh0aGlzKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICBpc1BhcmVudDogZnVuY3Rpb24gaXNQYXJlbnQoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKSAmJiBlbGUuX3ByaXZhdGUuY2hpbGRyZW4ubGVuZ3RoICE9PSAwO1xuICAgIH1cbiAgfSxcbiAgaXNDaGlsZGxlc3M6IGZ1bmN0aW9uIGlzQ2hpbGRsZXNzKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCkgJiYgZWxlLl9wcml2YXRlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gIH0sXG4gIGlzQ2hpbGQ6IGZ1bmN0aW9uIGlzQ2hpbGQoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKSAmJiBlbGUuX3ByaXZhdGUucGFyZW50ICE9IG51bGw7XG4gICAgfVxuICB9LFxuICBpc09ycGhhbjogZnVuY3Rpb24gaXNPcnBoYW4oKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKSAmJiBlbGUuX3ByaXZhdGUucGFyZW50ID09IG51bGw7XG4gICAgfVxuICB9LFxuICBkZXNjZW5kYW50czogZnVuY3Rpb24gZGVzY2VuZGFudHMoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgICBmdW5jdGlvbiBhZGQoZWxlcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgICBlbGVtZW50cy5wdXNoKGVsZSk7XG4gICAgICAgIGlmIChlbGUuY2hpbGRyZW4oKS5ub25lbXB0eSgpKSB7XG4gICAgICAgICAgYWRkKGVsZS5jaGlsZHJlbigpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBhZGQodGhpcy5jaGlsZHJlbigpKTtcbiAgICByZXR1cm4gdGhpcy5zcGF3bihlbGVtZW50cywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGZvckVhY2hDb21wb3VuZChlbGVzLCBmbiwgaW5jbHVkZVNlbGYsIHJlY3Vyc2l2ZVN0ZXApIHtcbiAgdmFyIHEgPSBbXTtcbiAgdmFyIGRpZCA9IG5ldyBTZXQkMSgpO1xuICB2YXIgY3kgPSBlbGVzLmN5KCk7XG4gIHZhciBoYXNDb21wb3VuZHMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIGlmIChpbmNsdWRlU2VsZikge1xuICAgICAgcS5wdXNoKGVsZSk7XG4gICAgfSBlbHNlIGlmIChoYXNDb21wb3VuZHMpIHtcbiAgICAgIHJlY3Vyc2l2ZVN0ZXAocSwgZGlkLCBlbGUpO1xuICAgIH1cbiAgfVxuICB3aGlsZSAocS5sZW5ndGggPiAwKSB7XG4gICAgdmFyIF9lbGUgPSBxLnNoaWZ0KCk7XG4gICAgZm4oX2VsZSk7XG4gICAgZGlkLmFkZChfZWxlLmlkKCkpO1xuICAgIGlmIChoYXNDb21wb3VuZHMpIHtcbiAgICAgIHJlY3Vyc2l2ZVN0ZXAocSwgZGlkLCBfZWxlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVsZXM7XG59XG5mdW5jdGlvbiBhZGRDaGlsZHJlbihxLCBkaWQsIGVsZSkge1xuICBpZiAoZWxlLmlzUGFyZW50KCkpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBlbGUuX3ByaXZhdGUuY2hpbGRyZW47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBpZiAoIWRpZC5oYXMoY2hpbGQuaWQoKSkpIHtcbiAgICAgICAgcS5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gdmVyeSBlZmZpY2llbnQgdmVyc2lvbiBvZiBlbGVzLmFkZCggZWxlcy5kZXNjZW5kYW50cygpICkuZm9yRWFjaCgpXG4vLyBmb3IgaW50ZXJuYWwgdXNlXG5lbGVzZm4kZi5mb3JFYWNoRG93biA9IGZ1bmN0aW9uIChmbikge1xuICB2YXIgaW5jbHVkZVNlbGYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gIHJldHVybiBmb3JFYWNoQ29tcG91bmQodGhpcywgZm4sIGluY2x1ZGVTZWxmLCBhZGRDaGlsZHJlbik7XG59O1xuZnVuY3Rpb24gYWRkUGFyZW50KHEsIGRpZCwgZWxlKSB7XG4gIGlmIChlbGUuaXNDaGlsZCgpKSB7XG4gICAgdmFyIHBhcmVudCA9IGVsZS5fcHJpdmF0ZS5wYXJlbnQ7XG4gICAgaWYgKCFkaWQuaGFzKHBhcmVudC5pZCgpKSkge1xuICAgICAgcS5wdXNoKHBhcmVudCk7XG4gICAgfVxuICB9XG59XG5lbGVzZm4kZi5mb3JFYWNoVXAgPSBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIGluY2x1ZGVTZWxmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICByZXR1cm4gZm9yRWFjaENvbXBvdW5kKHRoaXMsIGZuLCBpbmNsdWRlU2VsZiwgYWRkUGFyZW50KTtcbn07XG5mdW5jdGlvbiBhZGRQYXJlbnRBbmRDaGlsZHJlbihxLCBkaWQsIGVsZSkge1xuICBhZGRQYXJlbnQocSwgZGlkLCBlbGUpO1xuICBhZGRDaGlsZHJlbihxLCBkaWQsIGVsZSk7XG59XG5lbGVzZm4kZi5mb3JFYWNoVXBBbmREb3duID0gZnVuY3Rpb24gKGZuKSB7XG4gIHZhciBpbmNsdWRlU2VsZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgcmV0dXJuIGZvckVhY2hDb21wb3VuZCh0aGlzLCBmbiwgaW5jbHVkZVNlbGYsIGFkZFBhcmVudEFuZENoaWxkcmVuKTtcbn07XG5cbi8vIGFsaWFzZXNcbmVsZXNmbiRmLmFuY2VzdG9ycyA9IGVsZXNmbiRmLnBhcmVudHM7XG5cbnZhciBmbiQ1LCBlbGVzZm4kZTtcbmZuJDUgPSBlbGVzZm4kZSA9IHtcbiAgZGF0YTogZGVmaW5lLmRhdGEoe1xuICAgIGZpZWxkOiAnZGF0YScsXG4gICAgYmluZGluZ0V2ZW50OiAnZGF0YScsXG4gICAgYWxsb3dCaW5kaW5nOiB0cnVlLFxuICAgIGFsbG93U2V0dGluZzogdHJ1ZSxcbiAgICBzZXR0aW5nRXZlbnQ6ICdkYXRhJyxcbiAgICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogdHJ1ZSxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgYWxsb3dHZXR0aW5nOiB0cnVlLFxuICAgIGltbXV0YWJsZUtleXM6IHtcbiAgICAgICdpZCc6IHRydWUsXG4gICAgICAnc291cmNlJzogdHJ1ZSxcbiAgICAgICd0YXJnZXQnOiB0cnVlLFxuICAgICAgJ3BhcmVudCc6IHRydWVcbiAgICB9LFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pLFxuICByZW1vdmVEYXRhOiBkZWZpbmUucmVtb3ZlRGF0YSh7XG4gICAgZmllbGQ6ICdkYXRhJyxcbiAgICBldmVudDogJ2RhdGEnLFxuICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICB0cmlnZ2VyRXZlbnQ6IHRydWUsXG4gICAgaW1tdXRhYmxlS2V5czoge1xuICAgICAgJ2lkJzogdHJ1ZSxcbiAgICAgICdzb3VyY2UnOiB0cnVlLFxuICAgICAgJ3RhcmdldCc6IHRydWUsXG4gICAgICAncGFyZW50JzogdHJ1ZVxuICAgIH0sXG4gICAgdXBkYXRlU3R5bGU6IHRydWVcbiAgfSksXG4gIHNjcmF0Y2g6IGRlZmluZS5kYXRhKHtcbiAgICBmaWVsZDogJ3NjcmF0Y2gnLFxuICAgIGJpbmRpbmdFdmVudDogJ3NjcmF0Y2gnLFxuICAgIGFsbG93QmluZGluZzogdHJ1ZSxcbiAgICBhbGxvd1NldHRpbmc6IHRydWUsXG4gICAgc2V0dGluZ0V2ZW50OiAnc2NyYXRjaCcsXG4gICAgc2V0dGluZ1RyaWdnZXJzRXZlbnQ6IHRydWUsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIGFsbG93R2V0dGluZzogdHJ1ZSxcbiAgICB1cGRhdGVTdHlsZTogdHJ1ZVxuICB9KSxcbiAgcmVtb3ZlU2NyYXRjaDogZGVmaW5lLnJlbW92ZURhdGEoe1xuICAgIGZpZWxkOiAnc2NyYXRjaCcsXG4gICAgZXZlbnQ6ICdzY3JhdGNoJyxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgdHJpZ2dlckV2ZW50OiB0cnVlLFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pLFxuICByc2NyYXRjaDogZGVmaW5lLmRhdGEoe1xuICAgIGZpZWxkOiAncnNjcmF0Y2gnLFxuICAgIGFsbG93QmluZGluZzogZmFsc2UsXG4gICAgYWxsb3dTZXR0aW5nOiB0cnVlLFxuICAgIHNldHRpbmdUcmlnZ2Vyc0V2ZW50OiBmYWxzZSxcbiAgICBhbGxvd0dldHRpbmc6IHRydWVcbiAgfSksXG4gIHJlbW92ZVJzY3JhdGNoOiBkZWZpbmUucmVtb3ZlRGF0YSh7XG4gICAgZmllbGQ6ICdyc2NyYXRjaCcsXG4gICAgdHJpZ2dlckV2ZW50OiBmYWxzZVxuICB9KSxcbiAgaWQ6IGZ1bmN0aW9uIGlkKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICB9XG4gIH1cbn07XG5cbi8vIGFsaWFzZXNcbmZuJDUuYXR0ciA9IGZuJDUuZGF0YTtcbmZuJDUucmVtb3ZlQXR0ciA9IGZuJDUucmVtb3ZlRGF0YTtcbnZhciBkYXRhID0gZWxlc2ZuJGU7XG5cbnZhciBlbGVzZm4kZCA9IHt9O1xuZnVuY3Rpb24gZGVmaW5lRGVncmVlRnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpbmNsdWRlTG9vcHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKGluY2x1ZGVMb29wcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpbmNsdWRlTG9vcHMgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoc2VsZi5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNlbGYuaXNOb2RlKCkgJiYgIXNlbGYucmVtb3ZlZCgpKSB7XG4gICAgICB2YXIgZGVncmVlID0gMDtcbiAgICAgIHZhciBub2RlID0gc2VsZlswXTtcbiAgICAgIHZhciBjb25uZWN0ZWRFZGdlcyA9IG5vZGUuX3ByaXZhdGUuZWRnZXM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3RlZEVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlZGdlID0gY29ubmVjdGVkRWRnZXNbaV07XG4gICAgICAgIGlmICghaW5jbHVkZUxvb3BzICYmIGVkZ2UuaXNMb29wKCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBkZWdyZWUgKz0gY2FsbGJhY2sobm9kZSwgZWRnZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVncmVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9O1xufVxuZXh0ZW5kKGVsZXNmbiRkLCB7XG4gIGRlZ3JlZTogZGVmaW5lRGVncmVlRnVuY3Rpb24oZnVuY3Rpb24gKG5vZGUsIGVkZ2UpIHtcbiAgICBpZiAoZWRnZS5zb3VyY2UoKS5zYW1lKGVkZ2UudGFyZ2V0KCkpKSB7XG4gICAgICByZXR1cm4gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9KSxcbiAgaW5kZWdyZWU6IGRlZmluZURlZ3JlZUZ1bmN0aW9uKGZ1bmN0aW9uIChub2RlLCBlZGdlKSB7XG4gICAgaWYgKGVkZ2UudGFyZ2V0KCkuc2FtZShub2RlKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSksXG4gIG91dGRlZ3JlZTogZGVmaW5lRGVncmVlRnVuY3Rpb24oZnVuY3Rpb24gKG5vZGUsIGVkZ2UpIHtcbiAgICBpZiAoZWRnZS5zb3VyY2UoKS5zYW1lKG5vZGUpKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9KVxufSk7XG5mdW5jdGlvbiBkZWZpbmVEZWdyZWVCb3VuZHNGdW5jdGlvbihkZWdyZWVGbiwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpbmNsdWRlTG9vcHMpIHtcbiAgICB2YXIgcmV0O1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gbm9kZXNbaV07XG4gICAgICB2YXIgZGVncmVlID0gZWxlW2RlZ3JlZUZuXShpbmNsdWRlTG9vcHMpO1xuICAgICAgaWYgKGRlZ3JlZSAhPT0gdW5kZWZpbmVkICYmIChyZXQgPT09IHVuZGVmaW5lZCB8fCBjYWxsYmFjayhkZWdyZWUsIHJldCkpKSB7XG4gICAgICAgIHJldCA9IGRlZ3JlZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcbn1cbmV4dGVuZChlbGVzZm4kZCwge1xuICBtaW5EZWdyZWU6IGRlZmluZURlZ3JlZUJvdW5kc0Z1bmN0aW9uKCdkZWdyZWUnLCBmdW5jdGlvbiAoZGVncmVlLCBtaW4pIHtcbiAgICByZXR1cm4gZGVncmVlIDwgbWluO1xuICB9KSxcbiAgbWF4RGVncmVlOiBkZWZpbmVEZWdyZWVCb3VuZHNGdW5jdGlvbignZGVncmVlJywgZnVuY3Rpb24gKGRlZ3JlZSwgbWF4KSB7XG4gICAgcmV0dXJuIGRlZ3JlZSA+IG1heDtcbiAgfSksXG4gIG1pbkluZGVncmVlOiBkZWZpbmVEZWdyZWVCb3VuZHNGdW5jdGlvbignaW5kZWdyZWUnLCBmdW5jdGlvbiAoZGVncmVlLCBtaW4pIHtcbiAgICByZXR1cm4gZGVncmVlIDwgbWluO1xuICB9KSxcbiAgbWF4SW5kZWdyZWU6IGRlZmluZURlZ3JlZUJvdW5kc0Z1bmN0aW9uKCdpbmRlZ3JlZScsIGZ1bmN0aW9uIChkZWdyZWUsIG1heCkge1xuICAgIHJldHVybiBkZWdyZWUgPiBtYXg7XG4gIH0pLFxuICBtaW5PdXRkZWdyZWU6IGRlZmluZURlZ3JlZUJvdW5kc0Z1bmN0aW9uKCdvdXRkZWdyZWUnLCBmdW5jdGlvbiAoZGVncmVlLCBtaW4pIHtcbiAgICByZXR1cm4gZGVncmVlIDwgbWluO1xuICB9KSxcbiAgbWF4T3V0ZGVncmVlOiBkZWZpbmVEZWdyZWVCb3VuZHNGdW5jdGlvbignb3V0ZGVncmVlJywgZnVuY3Rpb24gKGRlZ3JlZSwgbWF4KSB7XG4gICAgcmV0dXJuIGRlZ3JlZSA+IG1heDtcbiAgfSlcbn0pO1xuZXh0ZW5kKGVsZXNmbiRkLCB7XG4gIHRvdGFsRGVncmVlOiBmdW5jdGlvbiB0b3RhbERlZ3JlZShpbmNsdWRlTG9vcHMpIHtcbiAgICB2YXIgdG90YWwgPSAwO1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0b3RhbCArPSBub2Rlc1tpXS5kZWdyZWUoaW5jbHVkZUxvb3BzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRvdGFsO1xuICB9XG59KTtcblxudmFyIGZuJDQsIGVsZXNmbiRjO1xudmFyIGJlZm9yZVBvc2l0aW9uU2V0ID0gZnVuY3Rpb24gYmVmb3JlUG9zaXRpb25TZXQoZWxlcywgbmV3UG9zLCBzaWxlbnQpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgaWYgKCFlbGUubG9ja2VkKCkpIHtcbiAgICAgIHZhciBvbGRQb3MgPSBlbGUuX3ByaXZhdGUucG9zaXRpb247XG4gICAgICB2YXIgZGVsdGEgPSB7XG4gICAgICAgIHg6IG5ld1Bvcy54ICE9IG51bGwgPyBuZXdQb3MueCAtIG9sZFBvcy54IDogMCxcbiAgICAgICAgeTogbmV3UG9zLnkgIT0gbnVsbCA/IG5ld1Bvcy55IC0gb2xkUG9zLnkgOiAwXG4gICAgICB9O1xuICAgICAgaWYgKGVsZS5pc1BhcmVudCgpICYmICEoZGVsdGEueCA9PT0gMCAmJiBkZWx0YS55ID09PSAwKSkge1xuICAgICAgICBlbGUuY2hpbGRyZW4oKS5zaGlmdChkZWx0YSwgc2lsZW50KTtcbiAgICAgIH1cbiAgICAgIGVsZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgICB9XG4gIH1cbn07XG52YXIgcG9zaXRpb25EZWYgPSB7XG4gIGZpZWxkOiAncG9zaXRpb24nLFxuICBiaW5kaW5nRXZlbnQ6ICdwb3NpdGlvbicsXG4gIGFsbG93QmluZGluZzogdHJ1ZSxcbiAgYWxsb3dTZXR0aW5nOiB0cnVlLFxuICBzZXR0aW5nRXZlbnQ6ICdwb3NpdGlvbicsXG4gIHNldHRpbmdUcmlnZ2Vyc0V2ZW50OiB0cnVlLFxuICB0cmlnZ2VyRm5OYW1lOiAnZW1pdEFuZE5vdGlmeScsXG4gIGFsbG93R2V0dGluZzogdHJ1ZSxcbiAgdmFsaWRLZXlzOiBbJ3gnLCAneSddLFxuICBiZWZvcmVHZXQ6IGZ1bmN0aW9uIGJlZm9yZUdldChlbGUpIHtcbiAgICBlbGUudXBkYXRlQ29tcG91bmRCb3VuZHMoKTtcbiAgfSxcbiAgYmVmb3JlU2V0OiBmdW5jdGlvbiBiZWZvcmVTZXQoZWxlcywgbmV3UG9zKSB7XG4gICAgYmVmb3JlUG9zaXRpb25TZXQoZWxlcywgbmV3UG9zLCBmYWxzZSk7XG4gIH0sXG4gIG9uU2V0OiBmdW5jdGlvbiBvblNldChlbGVzKSB7XG4gICAgZWxlcy5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKTtcbiAgfSxcbiAgY2FuU2V0OiBmdW5jdGlvbiBjYW5TZXQoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUubG9ja2VkKCk7XG4gIH1cbn07XG5mbiQ0ID0gZWxlc2ZuJGMgPSB7XG4gIHBvc2l0aW9uOiBkZWZpbmUuZGF0YShwb3NpdGlvbkRlZiksXG4gIC8vIHBvc2l0aW9uIGJ1dCBubyBub3RpZmljYXRpb24gdG8gcmVuZGVyZXJcbiAgc2lsZW50UG9zaXRpb246IGRlZmluZS5kYXRhKGV4dGVuZCh7fSwgcG9zaXRpb25EZWYsIHtcbiAgICBhbGxvd0JpbmRpbmc6IGZhbHNlLFxuICAgIGFsbG93U2V0dGluZzogdHJ1ZSxcbiAgICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogZmFsc2UsXG4gICAgYWxsb3dHZXR0aW5nOiBmYWxzZSxcbiAgICBiZWZvcmVTZXQ6IGZ1bmN0aW9uIGJlZm9yZVNldChlbGVzLCBuZXdQb3MpIHtcbiAgICAgIGJlZm9yZVBvc2l0aW9uU2V0KGVsZXMsIG5ld1BvcywgdHJ1ZSk7XG4gICAgfSxcbiAgICBvblNldDogZnVuY3Rpb24gb25TZXQoZWxlcykge1xuICAgICAgZWxlcy5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKTtcbiAgICB9XG4gIH0pKSxcbiAgcG9zaXRpb25zOiBmdW5jdGlvbiBwb3NpdGlvbnMocG9zLCBzaWxlbnQpIHtcbiAgICBpZiAocGxhaW5PYmplY3QocG9zKSkge1xuICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICB0aGlzLnNpbGVudFBvc2l0aW9uKHBvcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvc2l0aW9uKHBvcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmbiQ2KHBvcykpIHtcbiAgICAgIHZhciBfZm4gPSBwb3M7XG4gICAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgICBjeS5zdGFydEJhdGNoKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICAgIHZhciBfcG9zID0gdm9pZCAwO1xuICAgICAgICBpZiAoX3BvcyA9IF9mbihlbGUsIGkpKSB7XG4gICAgICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICAgICAgZWxlLnNpbGVudFBvc2l0aW9uKF9wb3MpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbGUucG9zaXRpb24oX3Bvcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjeS5lbmRCYXRjaCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICBzaWxlbnRQb3NpdGlvbnM6IGZ1bmN0aW9uIHNpbGVudFBvc2l0aW9ucyhwb3MpIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbnMocG9zLCB0cnVlKTtcbiAgfSxcbiAgc2hpZnQ6IGZ1bmN0aW9uIHNoaWZ0KGRpbSwgdmFsLCBzaWxlbnQpIHtcbiAgICB2YXIgZGVsdGE7XG4gICAgaWYgKHBsYWluT2JqZWN0KGRpbSkpIHtcbiAgICAgIGRlbHRhID0ge1xuICAgICAgICB4OiBudW1iZXIkMShkaW0ueCkgPyBkaW0ueCA6IDAsXG4gICAgICAgIHk6IG51bWJlciQxKGRpbS55KSA/IGRpbS55IDogMFxuICAgICAgfTtcbiAgICAgIHNpbGVudCA9IHZhbDtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyhkaW0pICYmIG51bWJlciQxKHZhbCkpIHtcbiAgICAgIGRlbHRhID0ge1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwXG4gICAgICB9O1xuICAgICAgZGVsdGFbZGltXSA9IHZhbDtcbiAgICB9XG4gICAgaWYgKGRlbHRhICE9IG51bGwpIHtcbiAgICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICAgIGN5LnN0YXJ0QmF0Y2goKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gdGhpc1tpXTtcblxuICAgICAgICAvLyBleGNsdWRlIGFueSBub2RlIHRoYXQgaXMgYSBkZXNjZW5kYW50IG9mIHRoZSBjYWxsaW5nIGNvbGxlY3Rpb25cbiAgICAgICAgaWYgKGN5Lmhhc0NvbXBvdW5kTm9kZXMoKSAmJiBlbGUuaXNDaGlsZCgpICYmIGVsZS5hbmNlc3RvcnMoKS5hbnlTYW1lKHRoaXMpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBvcyA9IGVsZS5wb3NpdGlvbigpO1xuICAgICAgICB2YXIgbmV3UG9zID0ge1xuICAgICAgICAgIHg6IHBvcy54ICsgZGVsdGEueCxcbiAgICAgICAgICB5OiBwb3MueSArIGRlbHRhLnlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICAgIGVsZS5zaWxlbnRQb3NpdGlvbihuZXdQb3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZS5wb3NpdGlvbihuZXdQb3MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjeS5lbmRCYXRjaCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgc2lsZW50U2hpZnQ6IGZ1bmN0aW9uIHNpbGVudFNoaWZ0KGRpbSwgdmFsKSB7XG4gICAgaWYgKHBsYWluT2JqZWN0KGRpbSkpIHtcbiAgICAgIHRoaXMuc2hpZnQoZGltLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyhkaW0pICYmIG51bWJlciQxKHZhbCkpIHtcbiAgICAgIHRoaXMuc2hpZnQoZGltLCB2YWwsIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgLy8gZ2V0L3NldCB0aGUgcmVuZGVyZWQgKGkuZS4gb24gc2NyZWVuKSBwb3NpdG9uIG9mIHRoZSBlbGVtZW50XG4gIHJlbmRlcmVkUG9zaXRpb246IGZ1bmN0aW9uIHJlbmRlcmVkUG9zaXRpb24oZGltLCB2YWwpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgIHZhciBycG9zID0gcGxhaW5PYmplY3QoZGltKSA/IGRpbSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgc2V0dGluZyA9IHJwb3MgIT09IHVuZGVmaW5lZCB8fCB2YWwgIT09IHVuZGVmaW5lZCAmJiBzdHJpbmcoZGltKTtcbiAgICBpZiAoZWxlICYmIGVsZS5pc05vZGUoKSkge1xuICAgICAgLy8gbXVzdCBoYXZlIGFuIGVsZW1lbnQgYW5kIG11c3QgYmUgYSBub2RlIHRvIHJldHVybiBwb3NpdGlvblxuICAgICAgaWYgKHNldHRpbmcpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIF9lbGUgPSB0aGlzW2ldO1xuICAgICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gc2V0IG9uZSBkaW1lbnNpb25cbiAgICAgICAgICAgIF9lbGUucG9zaXRpb24oZGltLCAodmFsIC0gcGFuW2RpbV0pIC8gem9vbSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChycG9zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHNldCB3aG9sZSBwb3NpdGlvblxuICAgICAgICAgICAgX2VsZS5wb3NpdGlvbihyZW5kZXJlZFRvTW9kZWxQb3NpdGlvbihycG9zLCB6b29tLCBwYW4pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGdldHRpbmdcbiAgICAgICAgdmFyIHBvcyA9IGVsZS5wb3NpdGlvbigpO1xuICAgICAgICBycG9zID0gbW9kZWxUb1JlbmRlcmVkUG9zaXRpb24ocG9zLCB6b29tLCBwYW4pO1xuICAgICAgICBpZiAoZGltID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyB0aGVuIHJldHVybiB0aGUgd2hvbGUgcmVuZGVyZWQgcG9zaXRpb25cbiAgICAgICAgICByZXR1cm4gcnBvcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0aGVuIHJldHVybiB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvblxuICAgICAgICAgIHJldHVybiBycG9zW2RpbV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFzZXR0aW5nKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBmb3IgZW1wdHkgY29sbGVjdGlvbiBjYXNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgLy8gZ2V0L3NldCB0aGUgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHBhcmVudFxuICByZWxhdGl2ZVBvc2l0aW9uOiBmdW5jdGlvbiByZWxhdGl2ZVBvc2l0aW9uKGRpbSwgdmFsKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBwcG9zID0gcGxhaW5PYmplY3QoZGltKSA/IGRpbSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgc2V0dGluZyA9IHBwb3MgIT09IHVuZGVmaW5lZCB8fCB2YWwgIT09IHVuZGVmaW5lZCAmJiBzdHJpbmcoZGltKTtcbiAgICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgICBpZiAoZWxlICYmIGVsZS5pc05vZGUoKSkge1xuICAgICAgLy8gbXVzdCBoYXZlIGFuIGVsZW1lbnQgYW5kIG11c3QgYmUgYSBub2RlIHRvIHJldHVybiBwb3NpdGlvblxuICAgICAgaWYgKHNldHRpbmcpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIF9lbGUyID0gdGhpc1tpXTtcbiAgICAgICAgICB2YXIgcGFyZW50ID0gaGFzQ29tcG91bmROb2RlcyA/IF9lbGUyLnBhcmVudCgpIDogbnVsbDtcbiAgICAgICAgICB2YXIgaGFzUGFyZW50ID0gcGFyZW50ICYmIHBhcmVudC5sZW5ndGggPiAwO1xuICAgICAgICAgIHZhciByZWxhdGl2ZVRvUGFyZW50ID0gaGFzUGFyZW50O1xuICAgICAgICAgIGlmIChoYXNQYXJlbnQpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudFswXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG9yaWdpbiA9IHJlbGF0aXZlVG9QYXJlbnQgPyBwYXJlbnQucG9zaXRpb24oKSA6IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHNldCBvbmUgZGltZW5zaW9uXG4gICAgICAgICAgICBfZWxlMi5wb3NpdGlvbihkaW0sIHZhbCArIG9yaWdpbltkaW1dKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBwb3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gc2V0IHdob2xlIHBvc2l0aW9uXG4gICAgICAgICAgICBfZWxlMi5wb3NpdGlvbih7XG4gICAgICAgICAgICAgIHg6IHBwb3MueCArIG9yaWdpbi54LFxuICAgICAgICAgICAgICB5OiBwcG9zLnkgKyBvcmlnaW4ueVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBnZXR0aW5nXG4gICAgICAgIHZhciBwb3MgPSBlbGUucG9zaXRpb24oKTtcbiAgICAgICAgdmFyIF9wYXJlbnQgPSBoYXNDb21wb3VuZE5vZGVzID8gZWxlLnBhcmVudCgpIDogbnVsbDtcbiAgICAgICAgdmFyIF9oYXNQYXJlbnQgPSBfcGFyZW50ICYmIF9wYXJlbnQubGVuZ3RoID4gMDtcbiAgICAgICAgdmFyIF9yZWxhdGl2ZVRvUGFyZW50ID0gX2hhc1BhcmVudDtcbiAgICAgICAgaWYgKF9oYXNQYXJlbnQpIHtcbiAgICAgICAgICBfcGFyZW50ID0gX3BhcmVudFswXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX29yaWdpbiA9IF9yZWxhdGl2ZVRvUGFyZW50ID8gX3BhcmVudC5wb3NpdGlvbigpIDoge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9O1xuICAgICAgICBwcG9zID0ge1xuICAgICAgICAgIHg6IHBvcy54IC0gX29yaWdpbi54LFxuICAgICAgICAgIHk6IHBvcy55IC0gX29yaWdpbi55XG4gICAgICAgIH07XG4gICAgICAgIGlmIChkaW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSB3aG9sZSByZW5kZXJlZCBwb3NpdGlvblxuICAgICAgICAgIHJldHVybiBwcG9zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSBzcGVjaWZpZWQgZGltZW5zaW9uXG4gICAgICAgICAgcmV0dXJuIHBwb3NbZGltXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXNldHRpbmcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIGZvciBlbXB0eSBjb2xsZWN0aW9uIGNhc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfVxufTtcblxuLy8gYWxpYXNlc1xuZm4kNC5tb2RlbFBvc2l0aW9uID0gZm4kNC5wb2ludCA9IGZuJDQucG9zaXRpb247XG5mbiQ0Lm1vZGVsUG9zaXRpb25zID0gZm4kNC5wb2ludHMgPSBmbiQ0LnBvc2l0aW9ucztcbmZuJDQucmVuZGVyZWRQb2ludCA9IGZuJDQucmVuZGVyZWRQb3NpdGlvbjtcbmZuJDQucmVsYXRpdmVQb2ludCA9IGZuJDQucmVsYXRpdmVQb3NpdGlvbjtcbnZhciBwb3NpdGlvbiA9IGVsZXNmbiRjO1xuXG52YXIgZm4kMywgZWxlc2ZuJGI7XG5mbiQzID0gZWxlc2ZuJGIgPSB7fTtcbmVsZXNmbiRiLnJlbmRlcmVkQm91bmRpbmdCb3ggPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB2YXIgYmIgPSB0aGlzLmJvdW5kaW5nQm94KG9wdGlvbnMpO1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIHZhciB6b29tID0gY3kuem9vbSgpO1xuICB2YXIgcGFuID0gY3kucGFuKCk7XG4gIHZhciB4MSA9IGJiLngxICogem9vbSArIHBhbi54O1xuICB2YXIgeDIgPSBiYi54MiAqIHpvb20gKyBwYW4ueDtcbiAgdmFyIHkxID0gYmIueTEgKiB6b29tICsgcGFuLnk7XG4gIHZhciB5MiA9IGJiLnkyICogem9vbSArIHBhbi55O1xuICByZXR1cm4ge1xuICAgIHgxOiB4MSxcbiAgICB4MjogeDIsXG4gICAgeTE6IHkxLFxuICAgIHkyOiB5MixcbiAgICB3OiB4MiAtIHgxLFxuICAgIGg6IHkyIC0geTFcbiAgfTtcbn07XG5lbGVzZm4kYi5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzaWxlbnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIGlmICghY3kuc3R5bGVFbmFibGVkKCkgfHwgIWN5Lmhhc0NvbXBvdW5kTm9kZXMoKSkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHRoaXMuZm9yRWFjaFVwKGZ1bmN0aW9uIChlbGUpIHtcbiAgICBpZiAoZWxlLmlzUGFyZW50KCkpIHtcbiAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgIF9wLmNvbXBvdW5kQm91bmRzQ2xlYW4gPSBmYWxzZTtcbiAgICAgIF9wLmJiQ2FjaGUgPSBudWxsO1xuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgZWxlLmVtaXRBbmROb3RpZnkoJ2JvdW5kcycpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcbmVsZXNmbiRiLnVwZGF0ZUNvbXBvdW5kQm91bmRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZm9yY2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG5cbiAgLy8gbm90IHBvc3NpYmxlIHRvIGRvIG9uIG5vbi1jb21wb3VuZCBncmFwaHMgb3Igd2l0aCB0aGUgc3R5bGUgZGlzYWJsZWRcbiAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSB8fCAhY3kuaGFzQ29tcG91bmROb2RlcygpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzYXZlIGN5Y2xlcyB3aGVuIGJhdGNoaW5nIC0tIGJ1dCBib3VuZHMgd2lsbCBiZSBzdGFsZSAob3Igbm90IGV4aXN0IHlldClcbiAgaWYgKCFmb3JjZSAmJiBjeS5iYXRjaGluZygpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlKHBhcmVudCkge1xuICAgIGlmICghcGFyZW50LmlzUGFyZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIF9wID0gcGFyZW50Ll9wcml2YXRlO1xuICAgIHZhciBjaGlsZHJlbiA9IHBhcmVudC5jaGlsZHJlbigpO1xuICAgIHZhciBpbmNsdWRlTGFiZWxzID0gcGFyZW50LnBzdHlsZSgnY29tcG91bmQtc2l6aW5nLXdydC1sYWJlbHMnKS52YWx1ZSA9PT0gJ2luY2x1ZGUnO1xuICAgIHZhciBtaW4gPSB7XG4gICAgICB3aWR0aDoge1xuICAgICAgICB2YWw6IHBhcmVudC5wc3R5bGUoJ21pbi13aWR0aCcpLnBmVmFsdWUsXG4gICAgICAgIGxlZnQ6IHBhcmVudC5wc3R5bGUoJ21pbi13aWR0aC1iaWFzLWxlZnQnKSxcbiAgICAgICAgcmlnaHQ6IHBhcmVudC5wc3R5bGUoJ21pbi13aWR0aC1iaWFzLXJpZ2h0JylcbiAgICAgIH0sXG4gICAgICBoZWlnaHQ6IHtcbiAgICAgICAgdmFsOiBwYXJlbnQucHN0eWxlKCdtaW4taGVpZ2h0JykucGZWYWx1ZSxcbiAgICAgICAgdG9wOiBwYXJlbnQucHN0eWxlKCdtaW4taGVpZ2h0LWJpYXMtdG9wJyksXG4gICAgICAgIGJvdHRvbTogcGFyZW50LnBzdHlsZSgnbWluLWhlaWdodC1iaWFzLWJvdHRvbScpXG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgYmIgPSBjaGlsZHJlbi5ib3VuZGluZ0JveCh7XG4gICAgICBpbmNsdWRlTGFiZWxzOiBpbmNsdWRlTGFiZWxzLFxuICAgICAgaW5jbHVkZU92ZXJsYXlzOiBmYWxzZSxcbiAgICAgIC8vIHVwZGF0aW5nIHRoZSBjb21wb3VuZCBib3VuZHMgaGFwcGVucyBvdXRzaWRlIG9mIHRoZSByZWd1bGFyXG4gICAgICAvLyBjYWNoZSBjeWNsZSAoaS5lLiBiZWZvcmUgZmlyZWQgZXZlbnRzKVxuICAgICAgdXNlQ2FjaGU6IGZhbHNlXG4gICAgfSk7XG4gICAgdmFyIHBvcyA9IF9wLnBvc2l0aW9uO1xuXG4gICAgLy8gaWYgY2hpbGRyZW4gdGFrZSB1cCB6ZXJvIGFyZWEgdGhlbiBrZWVwIHBvc2l0aW9uIGFuZCBmYWxsIGJhY2sgb24gc3R5bGVzaGVldCB3L2hcbiAgICBpZiAoYmIudyA9PT0gMCB8fCBiYi5oID09PSAwKSB7XG4gICAgICBiYiA9IHtcbiAgICAgICAgdzogcGFyZW50LnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlLFxuICAgICAgICBoOiBwYXJlbnQucHN0eWxlKCdoZWlnaHQnKS5wZlZhbHVlXG4gICAgICB9O1xuICAgICAgYmIueDEgPSBwb3MueCAtIGJiLncgLyAyO1xuICAgICAgYmIueDIgPSBwb3MueCArIGJiLncgLyAyO1xuICAgICAgYmIueTEgPSBwb3MueSAtIGJiLmggLyAyO1xuICAgICAgYmIueTIgPSBwb3MueSArIGJiLmggLyAyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21wdXRlQmlhc1ZhbHVlcyhwcm9wRGlmZiwgcHJvcEJpYXMsIHByb3BCaWFzQ29tcGxlbWVudCkge1xuICAgICAgdmFyIGJpYXNEaWZmID0gMDtcbiAgICAgIHZhciBiaWFzQ29tcGxlbWVudERpZmYgPSAwO1xuICAgICAgdmFyIGJpYXNUb3RhbCA9IHByb3BCaWFzICsgcHJvcEJpYXNDb21wbGVtZW50O1xuICAgICAgaWYgKHByb3BEaWZmID4gMCAmJiBiaWFzVG90YWwgPiAwKSB7XG4gICAgICAgIGJpYXNEaWZmID0gcHJvcEJpYXMgLyBiaWFzVG90YWwgKiBwcm9wRGlmZjtcbiAgICAgICAgYmlhc0NvbXBsZW1lbnREaWZmID0gcHJvcEJpYXNDb21wbGVtZW50IC8gYmlhc1RvdGFsICogcHJvcERpZmY7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiaWFzRGlmZjogYmlhc0RpZmYsXG4gICAgICAgIGJpYXNDb21wbGVtZW50RGlmZjogYmlhc0NvbXBsZW1lbnREaWZmXG4gICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21wdXRlUGFkZGluZ1ZhbHVlcyh3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nT2JqZWN0LCByZWxhdGl2ZVRvKSB7XG4gICAgICAvLyBBc3N1bWluZyBwZXJjZW50YWdlIGlzIG51bWJlciBmcm9tIDAgdG8gMVxuICAgICAgaWYgKHBhZGRpbmdPYmplY3QudW5pdHMgPT09ICclJykge1xuICAgICAgICBzd2l0Y2ggKHJlbGF0aXZlVG8pIHtcbiAgICAgICAgICBjYXNlICd3aWR0aCc6XG4gICAgICAgICAgICByZXR1cm4gd2lkdGggPiAwID8gcGFkZGluZ09iamVjdC5wZlZhbHVlICogd2lkdGggOiAwO1xuICAgICAgICAgIGNhc2UgJ2hlaWdodCc6XG4gICAgICAgICAgICByZXR1cm4gaGVpZ2h0ID4gMCA/IHBhZGRpbmdPYmplY3QucGZWYWx1ZSAqIGhlaWdodCA6IDA7XG4gICAgICAgICAgY2FzZSAnYXZlcmFnZSc6XG4gICAgICAgICAgICByZXR1cm4gd2lkdGggPiAwICYmIGhlaWdodCA+IDAgPyBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiAod2lkdGggKyBoZWlnaHQpIC8gMiA6IDA7XG4gICAgICAgICAgY2FzZSAnbWluJzpcbiAgICAgICAgICAgIHJldHVybiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCA/IHdpZHRoID4gaGVpZ2h0ID8gcGFkZGluZ09iamVjdC5wZlZhbHVlICogaGVpZ2h0IDogcGFkZGluZ09iamVjdC5wZlZhbHVlICogd2lkdGggOiAwO1xuICAgICAgICAgIGNhc2UgJ21heCc6XG4gICAgICAgICAgICByZXR1cm4gd2lkdGggPiAwICYmIGhlaWdodCA+IDAgPyB3aWR0aCA+IGhlaWdodCA/IHBhZGRpbmdPYmplY3QucGZWYWx1ZSAqIHdpZHRoIDogcGFkZGluZ09iamVjdC5wZlZhbHVlICogaGVpZ2h0IDogMDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocGFkZGluZ09iamVjdC51bml0cyA9PT0gJ3B4Jykge1xuICAgICAgICByZXR1cm4gcGFkZGluZ09iamVjdC5wZlZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBsZWZ0VmFsID0gbWluLndpZHRoLmxlZnQudmFsdWU7XG4gICAgaWYgKG1pbi53aWR0aC5sZWZ0LnVuaXRzID09PSAncHgnICYmIG1pbi53aWR0aC52YWwgPiAwKSB7XG4gICAgICBsZWZ0VmFsID0gbGVmdFZhbCAqIDEwMCAvIG1pbi53aWR0aC52YWw7XG4gICAgfVxuICAgIHZhciByaWdodFZhbCA9IG1pbi53aWR0aC5yaWdodC52YWx1ZTtcbiAgICBpZiAobWluLndpZHRoLnJpZ2h0LnVuaXRzID09PSAncHgnICYmIG1pbi53aWR0aC52YWwgPiAwKSB7XG4gICAgICByaWdodFZhbCA9IHJpZ2h0VmFsICogMTAwIC8gbWluLndpZHRoLnZhbDtcbiAgICB9XG4gICAgdmFyIHRvcFZhbCA9IG1pbi5oZWlnaHQudG9wLnZhbHVlO1xuICAgIGlmIChtaW4uaGVpZ2h0LnRvcC51bml0cyA9PT0gJ3B4JyAmJiBtaW4uaGVpZ2h0LnZhbCA+IDApIHtcbiAgICAgIHRvcFZhbCA9IHRvcFZhbCAqIDEwMCAvIG1pbi5oZWlnaHQudmFsO1xuICAgIH1cbiAgICB2YXIgYm90dG9tVmFsID0gbWluLmhlaWdodC5ib3R0b20udmFsdWU7XG4gICAgaWYgKG1pbi5oZWlnaHQuYm90dG9tLnVuaXRzID09PSAncHgnICYmIG1pbi5oZWlnaHQudmFsID4gMCkge1xuICAgICAgYm90dG9tVmFsID0gYm90dG9tVmFsICogMTAwIC8gbWluLmhlaWdodC52YWw7XG4gICAgfVxuICAgIHZhciB3aWR0aEJpYXNEaWZmcyA9IGNvbXB1dGVCaWFzVmFsdWVzKG1pbi53aWR0aC52YWwgLSBiYi53LCBsZWZ0VmFsLCByaWdodFZhbCk7XG4gICAgdmFyIGRpZmZMZWZ0ID0gd2lkdGhCaWFzRGlmZnMuYmlhc0RpZmY7XG4gICAgdmFyIGRpZmZSaWdodCA9IHdpZHRoQmlhc0RpZmZzLmJpYXNDb21wbGVtZW50RGlmZjtcbiAgICB2YXIgaGVpZ2h0Qmlhc0RpZmZzID0gY29tcHV0ZUJpYXNWYWx1ZXMobWluLmhlaWdodC52YWwgLSBiYi5oLCB0b3BWYWwsIGJvdHRvbVZhbCk7XG4gICAgdmFyIGRpZmZUb3AgPSBoZWlnaHRCaWFzRGlmZnMuYmlhc0RpZmY7XG4gICAgdmFyIGRpZmZCb3R0b20gPSBoZWlnaHRCaWFzRGlmZnMuYmlhc0NvbXBsZW1lbnREaWZmO1xuICAgIF9wLmF1dG9QYWRkaW5nID0gY29tcHV0ZVBhZGRpbmdWYWx1ZXMoYmIudywgYmIuaCwgcGFyZW50LnBzdHlsZSgncGFkZGluZycpLCBwYXJlbnQucHN0eWxlKCdwYWRkaW5nLXJlbGF0aXZlLXRvJykudmFsdWUpO1xuICAgIF9wLmF1dG9XaWR0aCA9IE1hdGgubWF4KGJiLncsIG1pbi53aWR0aC52YWwpO1xuICAgIHBvcy54ID0gKC1kaWZmTGVmdCArIGJiLngxICsgYmIueDIgKyBkaWZmUmlnaHQpIC8gMjtcbiAgICBfcC5hdXRvSGVpZ2h0ID0gTWF0aC5tYXgoYmIuaCwgbWluLmhlaWdodC52YWwpO1xuICAgIHBvcy55ID0gKC1kaWZmVG9wICsgYmIueTEgKyBiYi55MiArIGRpZmZCb3R0b20pIC8gMjtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgaWYgKCFfcC5jb21wb3VuZEJvdW5kc0NsZWFuIHx8IGZvcmNlKSB7XG4gICAgICB1cGRhdGUoZWxlKTtcbiAgICAgIGlmICghY3kuYmF0Y2hpbmcoKSkge1xuICAgICAgICBfcC5jb21wb3VuZEJvdW5kc0NsZWFuID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xudmFyIG5vbmluZiA9IGZ1bmN0aW9uIG5vbmluZih4KSB7XG4gIGlmICh4ID09PSBJbmZpbml0eSB8fCB4ID09PSAtSW5maW5pdHkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4geDtcbn07XG52YXIgdXBkYXRlQm91bmRzID0gZnVuY3Rpb24gdXBkYXRlQm91bmRzKGIsIHgxLCB5MSwgeDIsIHkyKSB7XG4gIC8vIGRvbid0IHVwZGF0ZSB3aXRoIHplcm8gYXJlYSBib3hlc1xuICBpZiAoeDIgLSB4MSA9PT0gMCB8fCB5MiAtIHkxID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gZG9uJ3QgdXBkYXRlIHdpdGggbnVsbCBkaW1cbiAgaWYgKHgxID09IG51bGwgfHwgeTEgPT0gbnVsbCB8fCB4MiA9PSBudWxsIHx8IHkyID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYi54MSA9IHgxIDwgYi54MSA/IHgxIDogYi54MTtcbiAgYi54MiA9IHgyID4gYi54MiA/IHgyIDogYi54MjtcbiAgYi55MSA9IHkxIDwgYi55MSA/IHkxIDogYi55MTtcbiAgYi55MiA9IHkyID4gYi55MiA/IHkyIDogYi55MjtcbiAgYi53ID0gYi54MiAtIGIueDE7XG4gIGIuaCA9IGIueTIgLSBiLnkxO1xufTtcbnZhciB1cGRhdGVCb3VuZHNGcm9tQm94ID0gZnVuY3Rpb24gdXBkYXRlQm91bmRzRnJvbUJveChiLCBiMikge1xuICBpZiAoYjIgPT0gbnVsbCkge1xuICAgIHJldHVybiBiO1xuICB9XG4gIHJldHVybiB1cGRhdGVCb3VuZHMoYiwgYjIueDEsIGIyLnkxLCBiMi54MiwgYjIueTIpO1xufTtcbnZhciBwcmVmaXhlZFByb3BlcnR5ID0gZnVuY3Rpb24gcHJlZml4ZWRQcm9wZXJ0eShvYmosIGZpZWxkLCBwcmVmaXgpIHtcbiAgcmV0dXJuIGdldFByZWZpeGVkUHJvcGVydHkob2JqLCBmaWVsZCwgcHJlZml4KTtcbn07XG52YXIgdXBkYXRlQm91bmRzRnJvbUFycm93ID0gZnVuY3Rpb24gdXBkYXRlQm91bmRzRnJvbUFycm93KGJvdW5kcywgZWxlLCBwcmVmaXgpIHtcbiAgaWYgKGVsZS5jeSgpLmhlYWRsZXNzKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcnN0eWxlID0gX3AucnN0eWxlO1xuICB2YXIgaGFsZkFyVyA9IHJzdHlsZS5hcnJvd1dpZHRoIC8gMjtcbiAgdmFyIGFycm93VHlwZSA9IGVsZS5wc3R5bGUocHJlZml4ICsgJy1hcnJvdy1zaGFwZScpLnZhbHVlO1xuICB2YXIgeDtcbiAgdmFyIHk7XG4gIGlmIChhcnJvd1R5cGUgIT09ICdub25lJykge1xuICAgIGlmIChwcmVmaXggPT09ICdzb3VyY2UnKSB7XG4gICAgICB4ID0gcnN0eWxlLnNyY1g7XG4gICAgICB5ID0gcnN0eWxlLnNyY1k7XG4gICAgfSBlbHNlIGlmIChwcmVmaXggPT09ICd0YXJnZXQnKSB7XG4gICAgICB4ID0gcnN0eWxlLnRndFg7XG4gICAgICB5ID0gcnN0eWxlLnRndFk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHggPSByc3R5bGUubWlkWDtcbiAgICAgIHkgPSByc3R5bGUubWlkWTtcbiAgICB9XG5cbiAgICAvLyBhbHdheXMgc3RvcmUgdGhlIGluZGl2aWR1YWwgYXJyb3cgYm91bmRzXG4gICAgdmFyIGJicyA9IF9wLmFycm93Qm91bmRzID0gX3AuYXJyb3dCb3VuZHMgfHwge307XG4gICAgdmFyIGJiID0gYmJzW3ByZWZpeF0gPSBiYnNbcHJlZml4XSB8fCB7fTtcbiAgICBiYi54MSA9IHggLSBoYWxmQXJXO1xuICAgIGJiLnkxID0geSAtIGhhbGZBclc7XG4gICAgYmIueDIgPSB4ICsgaGFsZkFyVztcbiAgICBiYi55MiA9IHkgKyBoYWxmQXJXO1xuICAgIGJiLncgPSBiYi54MiAtIGJiLngxO1xuICAgIGJiLmggPSBiYi55MiAtIGJiLnkxO1xuICAgIGV4cGFuZEJvdW5kaW5nQm94KGJiLCAxKTtcbiAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBiYi54MSwgYmIueTEsIGJiLngyLCBiYi55Mik7XG4gIH1cbn07XG52YXIgdXBkYXRlQm91bmRzRnJvbUxhYmVsID0gZnVuY3Rpb24gdXBkYXRlQm91bmRzRnJvbUxhYmVsKGJvdW5kcywgZWxlLCBwcmVmaXgpIHtcbiAgaWYgKGVsZS5jeSgpLmhlYWRsZXNzKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHByZWZpeERhc2g7XG4gIGlmIChwcmVmaXgpIHtcbiAgICBwcmVmaXhEYXNoID0gcHJlZml4ICsgJy0nO1xuICB9IGVsc2Uge1xuICAgIHByZWZpeERhc2ggPSAnJztcbiAgfVxuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciByc3R5bGUgPSBfcC5yc3R5bGU7XG4gIHZhciBsYWJlbCA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICdsYWJlbCcpLnN0clZhbHVlO1xuICBpZiAobGFiZWwpIHtcbiAgICB2YXIgaGFsaWduID0gZWxlLnBzdHlsZSgndGV4dC1oYWxpZ24nKTtcbiAgICB2YXIgdmFsaWduID0gZWxlLnBzdHlsZSgndGV4dC12YWxpZ24nKTtcbiAgICB2YXIgbGFiZWxXaWR0aCA9IHByZWZpeGVkUHJvcGVydHkocnN0eWxlLCAnbGFiZWxXaWR0aCcsIHByZWZpeCk7XG4gICAgdmFyIGxhYmVsSGVpZ2h0ID0gcHJlZml4ZWRQcm9wZXJ0eShyc3R5bGUsICdsYWJlbEhlaWdodCcsIHByZWZpeCk7XG4gICAgdmFyIGxhYmVsWCA9IHByZWZpeGVkUHJvcGVydHkocnN0eWxlLCAnbGFiZWxYJywgcHJlZml4KTtcbiAgICB2YXIgbGFiZWxZID0gcHJlZml4ZWRQcm9wZXJ0eShyc3R5bGUsICdsYWJlbFknLCBwcmVmaXgpO1xuICAgIHZhciBtYXJnaW5YID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ3RleHQtbWFyZ2luLXgnKS5wZlZhbHVlO1xuICAgIHZhciBtYXJnaW5ZID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ3RleHQtbWFyZ2luLXknKS5wZlZhbHVlO1xuICAgIHZhciBpc0VkZ2UgPSBlbGUuaXNFZGdlKCk7XG4gICAgdmFyIHJvdGF0aW9uID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ3RleHQtcm90YXRpb24nKTtcbiAgICB2YXIgb3V0bGluZVdpZHRoID0gZWxlLnBzdHlsZSgndGV4dC1vdXRsaW5lLXdpZHRoJykucGZWYWx1ZTtcbiAgICB2YXIgYm9yZGVyV2lkdGggPSBlbGUucHN0eWxlKCd0ZXh0LWJvcmRlci13aWR0aCcpLnBmVmFsdWU7XG4gICAgdmFyIGhhbGZCb3JkZXJXaWR0aCA9IGJvcmRlcldpZHRoIC8gMjtcbiAgICB2YXIgcGFkZGluZyA9IGVsZS5wc3R5bGUoJ3RleHQtYmFja2dyb3VuZC1wYWRkaW5nJykucGZWYWx1ZTtcbiAgICB2YXIgbWFyZ2luT2ZFcnJvciA9IDI7IC8vIGV4cGFuZCB0byB3b3JrIGFyb3VuZCBicm93c2VyIGRpbWVuc2lvbiBpbmFjY3VyYWNpZXNcblxuICAgIHZhciBsaCA9IGxhYmVsSGVpZ2h0O1xuICAgIHZhciBsdyA9IGxhYmVsV2lkdGg7XG4gICAgdmFyIGx3XzIgPSBsdyAvIDI7XG4gICAgdmFyIGxoXzIgPSBsaCAvIDI7XG4gICAgdmFyIGx4MSwgbHgyLCBseTEsIGx5MjtcbiAgICBpZiAoaXNFZGdlKSB7XG4gICAgICBseDEgPSBsYWJlbFggLSBsd18yO1xuICAgICAgbHgyID0gbGFiZWxYICsgbHdfMjtcbiAgICAgIGx5MSA9IGxhYmVsWSAtIGxoXzI7XG4gICAgICBseTIgPSBsYWJlbFkgKyBsaF8yO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKGhhbGlnbi52YWx1ZSkge1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBseDEgPSBsYWJlbFggLSBsdztcbiAgICAgICAgICBseDIgPSBsYWJlbFg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgbHgxID0gbGFiZWxYIC0gbHdfMjtcbiAgICAgICAgICBseDIgPSBsYWJlbFggKyBsd18yO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgbHgxID0gbGFiZWxYO1xuICAgICAgICAgIGx4MiA9IGxhYmVsWCArIGx3O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh2YWxpZ24udmFsdWUpIHtcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICBseTEgPSBsYWJlbFkgLSBsaDtcbiAgICAgICAgICBseTIgPSBsYWJlbFk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgbHkxID0gbGFiZWxZIC0gbGhfMjtcbiAgICAgICAgICBseTIgPSBsYWJlbFkgKyBsaF8yO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIGx5MSA9IGxhYmVsWTtcbiAgICAgICAgICBseTIgPSBsYWJlbFkgKyBsaDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzaGlmdCBieSBtYXJnaW4gYW5kIGV4cGFuZCBieSBvdXRsaW5lIGFuZCBib3JkZXJcbiAgICBseDEgKz0gbWFyZ2luWCAtIE1hdGgubWF4KG91dGxpbmVXaWR0aCwgaGFsZkJvcmRlcldpZHRoKSAtIHBhZGRpbmcgLSBtYXJnaW5PZkVycm9yO1xuICAgIGx4MiArPSBtYXJnaW5YICsgTWF0aC5tYXgob3V0bGluZVdpZHRoLCBoYWxmQm9yZGVyV2lkdGgpICsgcGFkZGluZyArIG1hcmdpbk9mRXJyb3I7XG4gICAgbHkxICs9IG1hcmdpblkgLSBNYXRoLm1heChvdXRsaW5lV2lkdGgsIGhhbGZCb3JkZXJXaWR0aCkgLSBwYWRkaW5nIC0gbWFyZ2luT2ZFcnJvcjtcbiAgICBseTIgKz0gbWFyZ2luWSArIE1hdGgubWF4KG91dGxpbmVXaWR0aCwgaGFsZkJvcmRlcldpZHRoKSArIHBhZGRpbmcgKyBtYXJnaW5PZkVycm9yO1xuXG4gICAgLy8gYWx3YXlzIHN0b3JlIHRoZSB1bnJvdGF0ZWQgbGFiZWwgYm91bmRzIHNlcGFyYXRlbHlcbiAgICB2YXIgYmJQcmVmaXggPSBwcmVmaXggfHwgJ21haW4nO1xuICAgIHZhciBiYnMgPSBfcC5sYWJlbEJvdW5kcztcbiAgICB2YXIgYmIgPSBiYnNbYmJQcmVmaXhdID0gYmJzW2JiUHJlZml4XSB8fCB7fTtcbiAgICBiYi54MSA9IGx4MTtcbiAgICBiYi55MSA9IGx5MTtcbiAgICBiYi54MiA9IGx4MjtcbiAgICBiYi55MiA9IGx5MjtcbiAgICBiYi53ID0gbHgyIC0gbHgxO1xuICAgIGJiLmggPSBseTIgLSBseTE7XG4gICAgdmFyIGlzQXV0b3JvdGF0ZSA9IGlzRWRnZSAmJiByb3RhdGlvbi5zdHJWYWx1ZSA9PT0gJ2F1dG9yb3RhdGUnO1xuICAgIHZhciBpc1BmVmFsdWUgPSByb3RhdGlvbi5wZlZhbHVlICE9IG51bGwgJiYgcm90YXRpb24ucGZWYWx1ZSAhPT0gMDtcbiAgICBpZiAoaXNBdXRvcm90YXRlIHx8IGlzUGZWYWx1ZSkge1xuICAgICAgdmFyIHRoZXRhID0gaXNBdXRvcm90YXRlID8gcHJlZml4ZWRQcm9wZXJ0eShfcC5yc3R5bGUsICdsYWJlbEFuZ2xlJywgcHJlZml4KSA6IHJvdGF0aW9uLnBmVmFsdWU7XG4gICAgICB2YXIgY29zID0gTWF0aC5jb3ModGhldGEpO1xuICAgICAgdmFyIHNpbiA9IE1hdGguc2luKHRoZXRhKTtcblxuICAgICAgLy8gcm90YXRpb24gcG9pbnQgKGRlZmF1bHQgdmFsdWUgZm9yIGNlbnRlci1jZW50ZXIpXG4gICAgICB2YXIgeG8gPSAobHgxICsgbHgyKSAvIDI7XG4gICAgICB2YXIgeW8gPSAobHkxICsgbHkyKSAvIDI7XG4gICAgICBpZiAoIWlzRWRnZSkge1xuICAgICAgICBzd2l0Y2ggKGhhbGlnbi52YWx1ZSkge1xuICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgeG8gPSBseDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICB4byA9IGx4MTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodmFsaWduLnZhbHVlKSB7XG4gICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgIHlvID0gbHkyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgIHlvID0gbHkxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciByb3RhdGUgPSBmdW5jdGlvbiByb3RhdGUoeCwgeSkge1xuICAgICAgICB4ID0geCAtIHhvO1xuICAgICAgICB5ID0geSAtIHlvO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IHggKiBjb3MgLSB5ICogc2luICsgeG8sXG4gICAgICAgICAgeTogeCAqIHNpbiArIHkgKiBjb3MgKyB5b1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIHZhciBweDF5MSA9IHJvdGF0ZShseDEsIGx5MSk7XG4gICAgICB2YXIgcHgxeTIgPSByb3RhdGUobHgxLCBseTIpO1xuICAgICAgdmFyIHB4MnkxID0gcm90YXRlKGx4MiwgbHkxKTtcbiAgICAgIHZhciBweDJ5MiA9IHJvdGF0ZShseDIsIGx5Mik7XG4gICAgICBseDEgPSBNYXRoLm1pbihweDF5MS54LCBweDF5Mi54LCBweDJ5MS54LCBweDJ5Mi54KTtcbiAgICAgIGx4MiA9IE1hdGgubWF4KHB4MXkxLngsIHB4MXkyLngsIHB4MnkxLngsIHB4MnkyLngpO1xuICAgICAgbHkxID0gTWF0aC5taW4ocHgxeTEueSwgcHgxeTIueSwgcHgyeTEueSwgcHgyeTIueSk7XG4gICAgICBseTIgPSBNYXRoLm1heChweDF5MS55LCBweDF5Mi55LCBweDJ5MS55LCBweDJ5Mi55KTtcbiAgICB9XG4gICAgdmFyIGJiUHJlZml4Um90ID0gYmJQcmVmaXggKyAnUm90JztcbiAgICB2YXIgYmJSb3QgPSBiYnNbYmJQcmVmaXhSb3RdID0gYmJzW2JiUHJlZml4Um90XSB8fCB7fTtcbiAgICBiYlJvdC54MSA9IGx4MTtcbiAgICBiYlJvdC55MSA9IGx5MTtcbiAgICBiYlJvdC54MiA9IGx4MjtcbiAgICBiYlJvdC55MiA9IGx5MjtcbiAgICBiYlJvdC53ID0gbHgyIC0gbHgxO1xuICAgIGJiUm90LmggPSBseTIgLSBseTE7XG4gICAgdXBkYXRlQm91bmRzKGJvdW5kcywgbHgxLCBseTEsIGx4MiwgbHkyKTtcbiAgICB1cGRhdGVCb3VuZHMoX3AubGFiZWxCb3VuZHMuYWxsLCBseDEsIGx5MSwgbHgyLCBseTIpO1xuICB9XG4gIHJldHVybiBib3VuZHM7XG59O1xudmFyIHVwZGF0ZUJvdW5kc0Zyb21PdXRsaW5lID0gZnVuY3Rpb24gdXBkYXRlQm91bmRzRnJvbU91dGxpbmUoYm91bmRzLCBlbGUpIHtcbiAgaWYgKGVsZS5jeSgpLmhlYWRsZXNzKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG91dGxpbmVPcGFjaXR5ID0gZWxlLnBzdHlsZSgnb3V0bGluZS1vcGFjaXR5JykudmFsdWU7XG4gIHZhciBvdXRsaW5lV2lkdGggPSBlbGUucHN0eWxlKCdvdXRsaW5lLXdpZHRoJykudmFsdWU7XG4gIGlmIChvdXRsaW5lT3BhY2l0eSA+IDAgJiYgb3V0bGluZVdpZHRoID4gMCkge1xuICAgIHZhciBvdXRsaW5lT2Zmc2V0ID0gZWxlLnBzdHlsZSgnb3V0bGluZS1vZmZzZXQnKS52YWx1ZTtcbiAgICB2YXIgbm9kZVNoYXBlID0gZWxlLnBzdHlsZSgnc2hhcGUnKS52YWx1ZTtcbiAgICB2YXIgb3V0bGluZVNpemUgPSBvdXRsaW5lV2lkdGggKyBvdXRsaW5lT2Zmc2V0O1xuICAgIHZhciBzY2FsZVggPSAoYm91bmRzLncgKyBvdXRsaW5lU2l6ZSAqIDIpIC8gYm91bmRzLnc7XG4gICAgdmFyIHNjYWxlWSA9IChib3VuZHMuaCArIG91dGxpbmVTaXplICogMikgLyBib3VuZHMuaDtcbiAgICB2YXIgeE9mZnNldCA9IDA7XG4gICAgdmFyIHlPZmZzZXQgPSAwO1xuICAgIGlmIChbXCJkaWFtb25kXCIsIFwicGVudGFnb25cIiwgXCJyb3VuZC10cmlhbmdsZVwiXS5pbmNsdWRlcyhub2RlU2hhcGUpKSB7XG4gICAgICBzY2FsZVggPSAoYm91bmRzLncgKyBvdXRsaW5lU2l6ZSAqIDIuNCkgLyBib3VuZHMudztcbiAgICAgIHlPZmZzZXQgPSAtb3V0bGluZVNpemUgLyAzLjY7XG4gICAgfSBlbHNlIGlmIChbXCJjb25jYXZlLWhleGFnb25cIiwgXCJyaG9tYm9pZFwiLCBcInJpZ2h0LXJob21ib2lkXCJdLmluY2x1ZGVzKG5vZGVTaGFwZSkpIHtcbiAgICAgIHNjYWxlWCA9IChib3VuZHMudyArIG91dGxpbmVTaXplICogMi40KSAvIGJvdW5kcy53O1xuICAgIH0gZWxzZSBpZiAobm9kZVNoYXBlID09PSBcInN0YXJcIikge1xuICAgICAgc2NhbGVYID0gKGJvdW5kcy53ICsgb3V0bGluZVNpemUgKiAyLjgpIC8gYm91bmRzLnc7XG4gICAgICBzY2FsZVkgPSAoYm91bmRzLmggKyBvdXRsaW5lU2l6ZSAqIDIuNikgLyBib3VuZHMuaDtcbiAgICAgIHlPZmZzZXQgPSAtb3V0bGluZVNpemUgLyAzLjg7XG4gICAgfSBlbHNlIGlmIChub2RlU2hhcGUgPT09IFwidHJpYW5nbGVcIikge1xuICAgICAgc2NhbGVYID0gKGJvdW5kcy53ICsgb3V0bGluZVNpemUgKiAyLjgpIC8gYm91bmRzLnc7XG4gICAgICBzY2FsZVkgPSAoYm91bmRzLmggKyBvdXRsaW5lU2l6ZSAqIDIuNCkgLyBib3VuZHMuaDtcbiAgICAgIHlPZmZzZXQgPSAtb3V0bGluZVNpemUgLyAxLjQ7XG4gICAgfSBlbHNlIGlmIChub2RlU2hhcGUgPT09IFwidmVlXCIpIHtcbiAgICAgIHNjYWxlWCA9IChib3VuZHMudyArIG91dGxpbmVTaXplICogNC40KSAvIGJvdW5kcy53O1xuICAgICAgc2NhbGVZID0gKGJvdW5kcy5oICsgb3V0bGluZVNpemUgKiAzLjgpIC8gYm91bmRzLmg7XG4gICAgICB5T2Zmc2V0ID0gLW91dGxpbmVTaXplICogLjU7XG4gICAgfVxuICAgIHZhciBoRGVsdGEgPSBib3VuZHMuaCAqIHNjYWxlWSAtIGJvdW5kcy5oO1xuICAgIHZhciB3RGVsdGEgPSBib3VuZHMudyAqIHNjYWxlWCAtIGJvdW5kcy53O1xuICAgIGV4cGFuZEJvdW5kaW5nQm94U2lkZXMoYm91bmRzLCBbTWF0aC5jZWlsKGhEZWx0YSAvIDIpLCBNYXRoLmNlaWwod0RlbHRhIC8gMildKTtcbiAgICBpZiAoeE9mZnNldCAhPSAwIHx8IHlPZmZzZXQgIT09IDApIHtcbiAgICAgIHZhciBvQm91bmRzID0gc2hpZnRCb3VuZGluZ0JveChib3VuZHMsIHhPZmZzZXQsIHlPZmZzZXQpO1xuICAgICAgdXBkYXRlQm91bmRpbmdCb3goYm91bmRzLCBvQm91bmRzKTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIGdldCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBlbGVtZW50cyAoaW4gcmF3IG1vZGVsIHBvc2l0aW9uKVxudmFyIGJvdW5kaW5nQm94SW1wbCA9IGZ1bmN0aW9uIGJvdW5kaW5nQm94SW1wbChlbGUsIG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gZWxlLl9wcml2YXRlLmN5O1xuICB2YXIgc3R5bGVFbmFibGVkID0gY3kuc3R5bGVFbmFibGVkKCk7XG4gIHZhciBoZWFkbGVzcyA9IGN5LmhlYWRsZXNzKCk7XG4gIHZhciBib3VuZHMgPSBtYWtlQm91bmRpbmdCb3goKTtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgaXNOb2RlID0gZWxlLmlzTm9kZSgpO1xuICB2YXIgaXNFZGdlID0gZWxlLmlzRWRnZSgpO1xuICB2YXIgZXgxLCBleDIsIGV5MSwgZXkyOyAvLyBleHRyZW1hIG9mIGJvZHkgLyBsaW5lc1xuICB2YXIgeCwgeTsgLy8gbm9kZSBwb3NcbiAgdmFyIHJzdHlsZSA9IF9wLnJzdHlsZTtcbiAgdmFyIG1hbnVhbEV4cGFuc2lvbiA9IGlzTm9kZSAmJiBzdHlsZUVuYWJsZWQgPyBlbGUucHN0eWxlKCdib3VuZHMtZXhwYW5zaW9uJykucGZWYWx1ZSA6IFswXTtcblxuICAvLyBtdXN0IHVzZSBgZGlzcGxheWAgcHJvcCBvbmx5LCBhcyByZWFkaW5nIGBjb21wb3VuZC53aWR0aCgpYCBjYXVzZXMgcmVjdXJzaW9uXG4gIC8vIChvdGhlciBmYWN0b3JzIGxpa2Ugd2lkdGggdmFsdWVzIHdpbGwgYmUgY29uc2lkZXJlZCBsYXRlciBpbiB0aGlzIGZ1bmN0aW9uIGFueXdheSlcbiAgdmFyIGlzRGlzcGxheWVkID0gZnVuY3Rpb24gaXNEaXNwbGF5ZWQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5wc3R5bGUoJ2Rpc3BsYXknKS52YWx1ZSAhPT0gJ25vbmUnO1xuICB9O1xuICB2YXIgZGlzcGxheWVkID0gIXN0eWxlRW5hYmxlZCB8fCBpc0Rpc3BsYXllZChlbGUpXG5cbiAgLy8gbXVzdCB0YWtlIGludG8gYWNjb3VudCBjb25uZWN0ZWQgbm9kZXMgYi9jIG9mIGltcGxpY2l0IGVkZ2UgaGlkaW5nIG9uIGRpc3BsYXk6bm9uZSBub2RlXG4gICYmICghaXNFZGdlIHx8IGlzRGlzcGxheWVkKGVsZS5zb3VyY2UoKSkgJiYgaXNEaXNwbGF5ZWQoZWxlLnRhcmdldCgpKSk7XG4gIGlmIChkaXNwbGF5ZWQpIHtcbiAgICAvLyBkaXNwbGF5ZWQgc3VmZmljZXMsIHNpbmNlIHdlIHdpbGwgZmluZCB6ZXJvIGFyZWEgZWxlcyBhbnl3YXlcbiAgICB2YXIgb3ZlcmxheU9wYWNpdHkgPSAwO1xuICAgIHZhciBvdmVybGF5UGFkZGluZyA9IDA7XG4gICAgaWYgKHN0eWxlRW5hYmxlZCAmJiBvcHRpb25zLmluY2x1ZGVPdmVybGF5cykge1xuICAgICAgb3ZlcmxheU9wYWNpdHkgPSBlbGUucHN0eWxlKCdvdmVybGF5LW9wYWNpdHknKS52YWx1ZTtcbiAgICAgIGlmIChvdmVybGF5T3BhY2l0eSAhPT0gMCkge1xuICAgICAgICBvdmVybGF5UGFkZGluZyA9IGVsZS5wc3R5bGUoJ292ZXJsYXktcGFkZGluZycpLnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgdW5kZXJsYXlPcGFjaXR5ID0gMDtcbiAgICB2YXIgdW5kZXJsYXlQYWRkaW5nID0gMDtcbiAgICBpZiAoc3R5bGVFbmFibGVkICYmIG9wdGlvbnMuaW5jbHVkZVVuZGVybGF5cykge1xuICAgICAgdW5kZXJsYXlPcGFjaXR5ID0gZWxlLnBzdHlsZSgndW5kZXJsYXktb3BhY2l0eScpLnZhbHVlO1xuICAgICAgaWYgKHVuZGVybGF5T3BhY2l0eSAhPT0gMCkge1xuICAgICAgICB1bmRlcmxheVBhZGRpbmcgPSBlbGUucHN0eWxlKCd1bmRlcmxheS1wYWRkaW5nJykudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBwYWRkaW5nID0gTWF0aC5tYXgob3ZlcmxheVBhZGRpbmcsIHVuZGVybGF5UGFkZGluZyk7XG4gICAgdmFyIHcgPSAwO1xuICAgIHZhciB3SGFsZiA9IDA7XG4gICAgaWYgKHN0eWxlRW5hYmxlZCkge1xuICAgICAgdyA9IGVsZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgICAgIHdIYWxmID0gdyAvIDI7XG4gICAgfVxuICAgIGlmIChpc05vZGUgJiYgb3B0aW9ucy5pbmNsdWRlTm9kZXMpIHtcbiAgICAgIHZhciBwb3MgPSBlbGUucG9zaXRpb24oKTtcbiAgICAgIHggPSBwb3MueDtcbiAgICAgIHkgPSBwb3MueTtcbiAgICAgIHZhciBfdyA9IGVsZS5vdXRlcldpZHRoKCk7XG4gICAgICB2YXIgaGFsZlcgPSBfdyAvIDI7XG4gICAgICB2YXIgaCA9IGVsZS5vdXRlckhlaWdodCgpO1xuICAgICAgdmFyIGhhbGZIID0gaCAvIDI7XG5cbiAgICAgIC8vIGhhbmRsZSBub2RlIGRpbWVuc2lvbnNcbiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgZXgxID0geCAtIGhhbGZXO1xuICAgICAgZXgyID0geCArIGhhbGZXO1xuICAgICAgZXkxID0geSAtIGhhbGZIO1xuICAgICAgZXkyID0geSArIGhhbGZIO1xuICAgICAgdXBkYXRlQm91bmRzKGJvdW5kcywgZXgxLCBleTEsIGV4MiwgZXkyKTtcbiAgICAgIGlmIChzdHlsZUVuYWJsZWQgJiYgb3B0aW9ucy5pbmNsdWRlT3V0bGluZXMpIHtcbiAgICAgICAgdXBkYXRlQm91bmRzRnJvbU91dGxpbmUoYm91bmRzLCBlbGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNFZGdlICYmIG9wdGlvbnMuaW5jbHVkZUVkZ2VzKSB7XG4gICAgICBpZiAoc3R5bGVFbmFibGVkICYmICFoZWFkbGVzcykge1xuICAgICAgICB2YXIgY3VydmVTdHlsZSA9IGVsZS5wc3R5bGUoJ2N1cnZlLXN0eWxlJykuc3RyVmFsdWU7XG5cbiAgICAgICAgLy8gaGFuZGxlIGVkZ2UgZGltZW5zaW9ucyAocm91Z2ggYm94IGVzdGltYXRlKVxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgZXgxID0gTWF0aC5taW4ocnN0eWxlLnNyY1gsIHJzdHlsZS5taWRYLCByc3R5bGUudGd0WCk7XG4gICAgICAgIGV4MiA9IE1hdGgubWF4KHJzdHlsZS5zcmNYLCByc3R5bGUubWlkWCwgcnN0eWxlLnRndFgpO1xuICAgICAgICBleTEgPSBNYXRoLm1pbihyc3R5bGUuc3JjWSwgcnN0eWxlLm1pZFksIHJzdHlsZS50Z3RZKTtcbiAgICAgICAgZXkyID0gTWF0aC5tYXgocnN0eWxlLnNyY1ksIHJzdHlsZS5taWRZLCByc3R5bGUudGd0WSk7XG5cbiAgICAgICAgLy8gdGFrZSBpbnRvIGFjY291bnQgZWRnZSB3aWR0aFxuICAgICAgICBleDEgLT0gd0hhbGY7XG4gICAgICAgIGV4MiArPSB3SGFsZjtcbiAgICAgICAgZXkxIC09IHdIYWxmO1xuICAgICAgICBleTIgKz0gd0hhbGY7XG4gICAgICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGV4MSwgZXkxLCBleDIsIGV5Mik7XG5cbiAgICAgICAgLy8gcHJlY2lzZSBlZGdlc1xuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgaWYgKGN1cnZlU3R5bGUgPT09ICdoYXlzdGFjaycpIHtcbiAgICAgICAgICB2YXIgaHB0cyA9IHJzdHlsZS5oYXlzdGFja1B0cztcbiAgICAgICAgICBpZiAoaHB0cyAmJiBocHRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgZXgxID0gaHB0c1swXS54O1xuICAgICAgICAgICAgZXkxID0gaHB0c1swXS55O1xuICAgICAgICAgICAgZXgyID0gaHB0c1sxXS54O1xuICAgICAgICAgICAgZXkyID0gaHB0c1sxXS55O1xuICAgICAgICAgICAgaWYgKGV4MSA+IGV4Mikge1xuICAgICAgICAgICAgICB2YXIgdGVtcCA9IGV4MTtcbiAgICAgICAgICAgICAgZXgxID0gZXgyO1xuICAgICAgICAgICAgICBleDIgPSB0ZW1wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV5MSA+IGV5Mikge1xuICAgICAgICAgICAgICB2YXIgX3RlbXAgPSBleTE7XG4gICAgICAgICAgICAgIGV5MSA9IGV5MjtcbiAgICAgICAgICAgICAgZXkyID0gX3RlbXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEgLSB3SGFsZiwgZXkxIC0gd0hhbGYsIGV4MiArIHdIYWxmLCBleTIgKyB3SGFsZik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGN1cnZlU3R5bGUgPT09ICdiZXppZXInIHx8IGN1cnZlU3R5bGUgPT09ICd1bmJ1bmRsZWQtYmV6aWVyJyB8fCBjdXJ2ZVN0eWxlLmVuZHNXaXRoKCdzZWdtZW50cycpIHx8IGN1cnZlU3R5bGUuZW5kc1dpdGgoJ3RheGknKSkge1xuICAgICAgICAgIHZhciBwdHM7XG4gICAgICAgICAgc3dpdGNoIChjdXJ2ZVN0eWxlKSB7XG4gICAgICAgICAgICBjYXNlICdiZXppZXInOlxuICAgICAgICAgICAgY2FzZSAndW5idW5kbGVkLWJlemllcic6XG4gICAgICAgICAgICAgIHB0cyA9IHJzdHlsZS5iZXppZXJQdHM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2VnbWVudHMnOlxuICAgICAgICAgICAgY2FzZSAndGF4aSc6XG4gICAgICAgICAgICBjYXNlICdyb3VuZC1zZWdtZW50cyc6XG4gICAgICAgICAgICBjYXNlICdyb3VuZC10YXhpJzpcbiAgICAgICAgICAgICAgcHRzID0gcnN0eWxlLmxpbmVQdHM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgIHZhciBwdCA9IHB0c1tqXTtcbiAgICAgICAgICAgICAgZXgxID0gcHQueCAtIHdIYWxmO1xuICAgICAgICAgICAgICBleDIgPSBwdC54ICsgd0hhbGY7XG4gICAgICAgICAgICAgIGV5MSA9IHB0LnkgLSB3SGFsZjtcbiAgICAgICAgICAgICAgZXkyID0gcHQueSArIHdIYWxmO1xuICAgICAgICAgICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEsIGV5MSwgZXgyLCBleTIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBiZXppZXItbGlrZSBvciBzZWdtZW50LWxpa2UgZWRnZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaGVhZGxlc3Mgb3Igc3R5bGUgZGlzYWJsZWRcblxuICAgICAgICAvLyBmYWxsYmFjayBvbiBzb3VyY2UgYW5kIHRhcmdldCBwb3NpdGlvbnNcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgdmFyIG4xID0gZWxlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgbjFwb3MgPSBuMS5wb3NpdGlvbigpO1xuICAgICAgICB2YXIgbjIgPSBlbGUudGFyZ2V0KCk7XG4gICAgICAgIHZhciBuMnBvcyA9IG4yLnBvc2l0aW9uKCk7XG4gICAgICAgIGV4MSA9IG4xcG9zLng7XG4gICAgICAgIGV4MiA9IG4ycG9zLng7XG4gICAgICAgIGV5MSA9IG4xcG9zLnk7XG4gICAgICAgIGV5MiA9IG4ycG9zLnk7XG4gICAgICAgIGlmIChleDEgPiBleDIpIHtcbiAgICAgICAgICB2YXIgX3RlbXAyID0gZXgxO1xuICAgICAgICAgIGV4MSA9IGV4MjtcbiAgICAgICAgICBleDIgPSBfdGVtcDI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV5MSA+IGV5Mikge1xuICAgICAgICAgIHZhciBfdGVtcDMgPSBleTE7XG4gICAgICAgICAgZXkxID0gZXkyO1xuICAgICAgICAgIGV5MiA9IF90ZW1wMztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRha2UgaW50byBhY2NvdW50IGVkZ2Ugd2lkdGhcbiAgICAgICAgZXgxIC09IHdIYWxmO1xuICAgICAgICBleDIgKz0gd0hhbGY7XG4gICAgICAgIGV5MSAtPSB3SGFsZjtcbiAgICAgICAgZXkyICs9IHdIYWxmO1xuICAgICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEsIGV5MSwgZXgyLCBleTIpO1xuICAgICAgfSAvLyBoZWFkbGVzcyBvciBzdHlsZSBkaXNhYmxlZFxuICAgIH0gLy8gZWRnZXNcblxuICAgIC8vIGhhbmRsZSBlZGdlIGFycm93IHNpemVcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBpZiAoc3R5bGVFbmFibGVkICYmIG9wdGlvbnMuaW5jbHVkZUVkZ2VzICYmIGlzRWRnZSkge1xuICAgICAgdXBkYXRlQm91bmRzRnJvbUFycm93KGJvdW5kcywgZWxlLCAnbWlkLXNvdXJjZScpO1xuICAgICAgdXBkYXRlQm91bmRzRnJvbUFycm93KGJvdW5kcywgZWxlLCAnbWlkLXRhcmdldCcpO1xuICAgICAgdXBkYXRlQm91bmRzRnJvbUFycm93KGJvdW5kcywgZWxlLCAnc291cmNlJyk7XG4gICAgICB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsICd0YXJnZXQnKTtcbiAgICB9XG5cbiAgICAvLyBnaG9zdFxuICAgIC8vLy8vLy8vXG5cbiAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICB2YXIgZ2hvc3QgPSBlbGUucHN0eWxlKCdnaG9zdCcpLnZhbHVlID09PSAneWVzJztcbiAgICAgIGlmIChnaG9zdCkge1xuICAgICAgICB2YXIgZ3ggPSBlbGUucHN0eWxlKCdnaG9zdC1vZmZzZXQteCcpLnBmVmFsdWU7XG4gICAgICAgIHZhciBneSA9IGVsZS5wc3R5bGUoJ2dob3N0LW9mZnNldC15JykucGZWYWx1ZTtcbiAgICAgICAgdXBkYXRlQm91bmRzKGJvdW5kcywgYm91bmRzLngxICsgZ3gsIGJvdW5kcy55MSArIGd5LCBib3VuZHMueDIgKyBneCwgYm91bmRzLnkyICsgZ3kpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFsd2F5cyBzdG9yZSB0aGUgYm9keSBib3VuZHMgc2VwYXJhdGVseSBmcm9tIHRoZSBsYWJlbHNcbiAgICB2YXIgYmJCb2R5ID0gX3AuYm9keUJvdW5kcyA9IF9wLmJvZHlCb3VuZHMgfHwge307XG4gICAgYXNzaWduQm91bmRpbmdCb3goYmJCb2R5LCBib3VuZHMpO1xuICAgIGV4cGFuZEJvdW5kaW5nQm94U2lkZXMoYmJCb2R5LCBtYW51YWxFeHBhbnNpb24pO1xuICAgIGV4cGFuZEJvdW5kaW5nQm94KGJiQm9keSwgMSk7IC8vIGV4cGFuZCB0byB3b3JrIGFyb3VuZCBicm93c2VyIGRpbWVuc2lvbiBpbmFjY3VyYWNpZXNcblxuICAgIC8vIG92ZXJsYXlcbiAgICAvLy8vLy8vLy8vXG5cbiAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICBleDEgPSBib3VuZHMueDE7XG4gICAgICBleDIgPSBib3VuZHMueDI7XG4gICAgICBleTEgPSBib3VuZHMueTE7XG4gICAgICBleTIgPSBib3VuZHMueTI7XG4gICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEgLSBwYWRkaW5nLCBleTEgLSBwYWRkaW5nLCBleDIgKyBwYWRkaW5nLCBleTIgKyBwYWRkaW5nKTtcbiAgICB9XG5cbiAgICAvLyBhbHdheXMgc3RvcmUgdGhlIGJvZHkgYm91bmRzIHNlcGFyYXRlbHkgZnJvbSB0aGUgbGFiZWxzXG4gICAgdmFyIGJiT3ZlcmxheSA9IF9wLm92ZXJsYXlCb3VuZHMgPSBfcC5vdmVybGF5Qm91bmRzIHx8IHt9O1xuICAgIGFzc2lnbkJvdW5kaW5nQm94KGJiT3ZlcmxheSwgYm91bmRzKTtcbiAgICBleHBhbmRCb3VuZGluZ0JveFNpZGVzKGJiT3ZlcmxheSwgbWFudWFsRXhwYW5zaW9uKTtcbiAgICBleHBhbmRCb3VuZGluZ0JveChiYk92ZXJsYXksIDEpOyAvLyBleHBhbmQgdG8gd29yayBhcm91bmQgYnJvd3NlciBkaW1lbnNpb24gaW5hY2N1cmFjaWVzXG5cbiAgICAvLyBoYW5kbGUgbGFiZWwgZGltZW5zaW9uc1xuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICB2YXIgYmJMYWJlbHMgPSBfcC5sYWJlbEJvdW5kcyA9IF9wLmxhYmVsQm91bmRzIHx8IHt9O1xuICAgIGlmIChiYkxhYmVscy5hbGwgIT0gbnVsbCkge1xuICAgICAgY2xlYXJCb3VuZGluZ0JveChiYkxhYmVscy5hbGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYkxhYmVscy5hbGwgPSBtYWtlQm91bmRpbmdCb3goKTtcbiAgICB9XG4gICAgaWYgKHN0eWxlRW5hYmxlZCAmJiBvcHRpb25zLmluY2x1ZGVMYWJlbHMpIHtcbiAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVNYWluTGFiZWxzKSB7XG4gICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21MYWJlbChib3VuZHMsIGVsZSwgbnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNFZGdlKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVTb3VyY2VMYWJlbHMpIHtcbiAgICAgICAgICB1cGRhdGVCb3VuZHNGcm9tTGFiZWwoYm91bmRzLCBlbGUsICdzb3VyY2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlVGFyZ2V0TGFiZWxzKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRzRnJvbUxhYmVsKGJvdW5kcywgZWxlLCAndGFyZ2V0Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIHN0eWxlIGVuYWJsZWQgZm9yIGxhYmVsc1xuICB9IC8vIGlmIGRpc3BsYXllZFxuXG4gIGJvdW5kcy54MSA9IG5vbmluZihib3VuZHMueDEpO1xuICBib3VuZHMueTEgPSBub25pbmYoYm91bmRzLnkxKTtcbiAgYm91bmRzLngyID0gbm9uaW5mKGJvdW5kcy54Mik7XG4gIGJvdW5kcy55MiA9IG5vbmluZihib3VuZHMueTIpO1xuICBib3VuZHMudyA9IG5vbmluZihib3VuZHMueDIgLSBib3VuZHMueDEpO1xuICBib3VuZHMuaCA9IG5vbmluZihib3VuZHMueTIgLSBib3VuZHMueTEpO1xuICBpZiAoYm91bmRzLncgPiAwICYmIGJvdW5kcy5oID4gMCAmJiBkaXNwbGF5ZWQpIHtcbiAgICBleHBhbmRCb3VuZGluZ0JveFNpZGVzKGJvdW5kcywgbWFudWFsRXhwYW5zaW9uKTtcblxuICAgIC8vIGV4cGFuZCBib3VuZHMgYnkgMSBiZWNhdXNlIGFudGlhbGlhc2luZyBjYW4gaW5jcmVhc2UgdGhlIHZpc3VhbC9lZmZlY3RpdmUgc2l6ZSBieSAxIG9uIGFsbCBzaWRlc1xuICAgIGV4cGFuZEJvdW5kaW5nQm94KGJvdW5kcywgMSk7XG4gIH1cbiAgcmV0dXJuIGJvdW5kcztcbn07XG52YXIgZ2V0S2V5ID0gZnVuY3Rpb24gZ2V0S2V5KG9wdHMpIHtcbiAgdmFyIGkgPSAwO1xuICB2YXIgdGYgPSBmdW5jdGlvbiB0Zih2YWwpIHtcbiAgICByZXR1cm4gKHZhbCA/IDEgOiAwKSA8PCBpKys7XG4gIH07XG4gIHZhciBrZXkgPSAwO1xuICBrZXkgKz0gdGYob3B0cy5pbmN1ZGVOb2Rlcyk7XG4gIGtleSArPSB0ZihvcHRzLmluY2x1ZGVFZGdlcyk7XG4gIGtleSArPSB0ZihvcHRzLmluY2x1ZGVMYWJlbHMpO1xuICBrZXkgKz0gdGYob3B0cy5pbmNsdWRlTWFpbkxhYmVscyk7XG4gIGtleSArPSB0ZihvcHRzLmluY2x1ZGVTb3VyY2VMYWJlbHMpO1xuICBrZXkgKz0gdGYob3B0cy5pbmNsdWRlVGFyZ2V0TGFiZWxzKTtcbiAga2V5ICs9IHRmKG9wdHMuaW5jbHVkZU92ZXJsYXlzKTtcbiAga2V5ICs9IHRmKG9wdHMuaW5jbHVkZU91dGxpbmVzKTtcbiAgcmV0dXJuIGtleTtcbn07XG52YXIgZ2V0Qm91bmRpbmdCb3hQb3NLZXkgPSBmdW5jdGlvbiBnZXRCb3VuZGluZ0JveFBvc0tleShlbGUpIHtcbiAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgIHZhciBwMSA9IGVsZS5zb3VyY2UoKS5wb3NpdGlvbigpO1xuICAgIHZhciBwMiA9IGVsZS50YXJnZXQoKS5wb3NpdGlvbigpO1xuICAgIHZhciByID0gZnVuY3Rpb24gcih4KSB7XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZCh4KTtcbiAgICB9O1xuICAgIHJldHVybiBoYXNoSW50c0FycmF5KFtyKHAxLngpLCByKHAxLnkpLCByKHAyLngpLCByKHAyLnkpXSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG52YXIgY2FjaGVkQm91bmRpbmdCb3hJbXBsID0gZnVuY3Rpb24gY2FjaGVkQm91bmRpbmdCb3hJbXBsKGVsZSwgb3B0cykge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBiYjtcbiAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgdmFyIGtleSA9IG9wdHMgPT0gbnVsbCA/IGRlZkJiT3B0c0tleSA6IGdldEtleShvcHRzKTtcbiAgdmFyIHVzaW5nRGVmT3B0cyA9IGtleSA9PT0gZGVmQmJPcHRzS2V5O1xuICB2YXIgY3VyclBvc0tleSA9IGdldEJvdW5kaW5nQm94UG9zS2V5KGVsZSk7XG4gIHZhciBpc1Bvc0tleVNhbWUgPSBfcC5iYkNhY2hlUG9zS2V5ID09PSBjdXJyUG9zS2V5O1xuICB2YXIgdXNlQ2FjaGUgPSBvcHRzLnVzZUNhY2hlICYmIGlzUG9zS2V5U2FtZTtcbiAgdmFyIGlzRGlydHkgPSBmdW5jdGlvbiBpc0RpcnR5KGVsZSkge1xuICAgIHJldHVybiBlbGUuX3ByaXZhdGUuYmJDYWNoZSA9PSBudWxsIHx8IGVsZS5fcHJpdmF0ZS5zdHlsZURpcnR5O1xuICB9O1xuICB2YXIgbmVlZFJlY2FsYyA9ICF1c2VDYWNoZSB8fCBpc0RpcnR5KGVsZSkgfHwgaXNFZGdlICYmIGlzRGlydHkoZWxlLnNvdXJjZSgpKSB8fCBpc0RpcnR5KGVsZS50YXJnZXQoKSk7XG4gIGlmIChuZWVkUmVjYWxjKSB7XG4gICAgaWYgKCFpc1Bvc0tleVNhbWUpIHtcbiAgICAgIGVsZS5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUodXNlQ2FjaGUpO1xuICAgIH1cbiAgICBiYiA9IGJvdW5kaW5nQm94SW1wbChlbGUsIGRlZkJiT3B0cyk7XG4gICAgX3AuYmJDYWNoZSA9IGJiO1xuICAgIF9wLmJiQ2FjaGVQb3NLZXkgPSBjdXJyUG9zS2V5O1xuICB9IGVsc2Uge1xuICAgIGJiID0gX3AuYmJDYWNoZTtcbiAgfVxuXG4gIC8vIG5vdCB1c2luZyBkZWYgb3B0cyA9PiBuZWVkIHRvIGJ1aWxkIHVwIGJiIGZyb20gY29tYmluYXRpb24gb2Ygc3ViIGJic1xuICBpZiAoIXVzaW5nRGVmT3B0cykge1xuICAgIHZhciBpc05vZGUgPSBlbGUuaXNOb2RlKCk7XG4gICAgYmIgPSBtYWtlQm91bmRpbmdCb3goKTtcbiAgICBpZiAob3B0cy5pbmNsdWRlTm9kZXMgJiYgaXNOb2RlIHx8IG9wdHMuaW5jbHVkZUVkZ2VzICYmICFpc05vZGUpIHtcbiAgICAgIGlmIChvcHRzLmluY2x1ZGVPdmVybGF5cykge1xuICAgICAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJiLCBfcC5vdmVybGF5Qm91bmRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYmIsIF9wLmJvZHlCb3VuZHMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3B0cy5pbmNsdWRlTGFiZWxzKSB7XG4gICAgICBpZiAob3B0cy5pbmNsdWRlTWFpbkxhYmVscyAmJiAoIWlzRWRnZSB8fCBvcHRzLmluY2x1ZGVTb3VyY2VMYWJlbHMgJiYgb3B0cy5pbmNsdWRlVGFyZ2V0TGFiZWxzKSkge1xuICAgICAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJiLCBfcC5sYWJlbEJvdW5kcy5hbGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9wdHMuaW5jbHVkZU1haW5MYWJlbHMpIHtcbiAgICAgICAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJiLCBfcC5sYWJlbEJvdW5kcy5tYWluUm90KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5pbmNsdWRlU291cmNlTGFiZWxzKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRzRnJvbUJveChiYiwgX3AubGFiZWxCb3VuZHMuc291cmNlUm90KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5pbmNsdWRlVGFyZ2V0TGFiZWxzKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRzRnJvbUJveChiYiwgX3AubGFiZWxCb3VuZHMudGFyZ2V0Um90KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBiYi53ID0gYmIueDIgLSBiYi54MTtcbiAgICBiYi5oID0gYmIueTIgLSBiYi55MTtcbiAgfVxuICByZXR1cm4gYmI7XG59O1xudmFyIGRlZkJiT3B0cyA9IHtcbiAgaW5jbHVkZU5vZGVzOiB0cnVlLFxuICBpbmNsdWRlRWRnZXM6IHRydWUsXG4gIGluY2x1ZGVMYWJlbHM6IHRydWUsXG4gIGluY2x1ZGVNYWluTGFiZWxzOiB0cnVlLFxuICBpbmNsdWRlU291cmNlTGFiZWxzOiB0cnVlLFxuICBpbmNsdWRlVGFyZ2V0TGFiZWxzOiB0cnVlLFxuICBpbmNsdWRlT3ZlcmxheXM6IHRydWUsXG4gIGluY2x1ZGVVbmRlcmxheXM6IHRydWUsXG4gIGluY2x1ZGVPdXRsaW5lczogdHJ1ZSxcbiAgdXNlQ2FjaGU6IHRydWVcbn07XG52YXIgZGVmQmJPcHRzS2V5ID0gZ2V0S2V5KGRlZkJiT3B0cyk7XG52YXIgZmlsbGVkQmJPcHRzID0gZGVmYXVsdHMkZyhkZWZCYk9wdHMpO1xuZWxlc2ZuJGIuYm91bmRpbmdCb3ggPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB2YXIgYm91bmRzO1xuXG4gIC8vIHRoZSBtYWluIHVzZWNhc2UgaXMgZWxlLmJvdW5kaW5nQm94KCkgZm9yIGEgc2luZ2xlIGVsZW1lbnQgd2l0aCBuby9kZWYgb3B0aW9uc1xuICAvLyBzcGVjaWZpZWQgcy50LiB0aGUgY2FjaGUgaXMgdXNlZCwgc28gY2hlY2sgZm9yIHRoaXMgY2FzZSB0byBtYWtlIGl0IGZhc3RlciBieVxuICAvLyBhdm9pZGluZyB0aGUgb3ZlcmhlYWQgb2YgdGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uXG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzWzBdLl9wcml2YXRlLmJiQ2FjaGUgIT0gbnVsbCAmJiAhdGhpc1swXS5fcHJpdmF0ZS5zdHlsZURpcnR5ICYmIChvcHRpb25zID09PSB1bmRlZmluZWQgfHwgb3B0aW9ucy51c2VDYWNoZSA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMudXNlQ2FjaGUgPT09IHRydWUpKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucyA9IGRlZkJiT3B0cztcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IGZpbGxlZEJiT3B0cyhvcHRpb25zKTtcbiAgICB9XG4gICAgYm91bmRzID0gY2FjaGVkQm91bmRpbmdCb3hJbXBsKHRoaXNbMF0sIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIGJvdW5kcyA9IG1ha2VCb3VuZGluZ0JveCgpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IGRlZkJiT3B0cztcbiAgICB2YXIgb3B0cyA9IGZpbGxlZEJiT3B0cyhvcHRpb25zKTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIGN5ID0gZWxlcy5jeSgpO1xuICAgIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5zdHlsZUVuYWJsZWQoKTtcbiAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgICAgdmFyIGN1cnJQb3NLZXkgPSBnZXRCb3VuZGluZ0JveFBvc0tleShlbGUpO1xuICAgICAgICB2YXIgaXNQb3NLZXlTYW1lID0gX3AuYmJDYWNoZVBvc0tleSA9PT0gY3VyclBvc0tleTtcbiAgICAgICAgdmFyIHVzZUNhY2hlID0gb3B0cy51c2VDYWNoZSAmJiBpc1Bvc0tleVNhbWUgJiYgIV9wLnN0eWxlRGlydHk7XG4gICAgICAgIGVsZS5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUodXNlQ2FjaGUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNvbXBvdW5kQm91bmRzKCFvcHRpb25zLnVzZUNhY2hlKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZWxlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfZWxlID0gZWxlc1tfaV07XG4gICAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJvdW5kcywgY2FjaGVkQm91bmRpbmdCb3hJbXBsKF9lbGUsIG9wdHMpKTtcbiAgICB9XG4gIH1cbiAgYm91bmRzLngxID0gbm9uaW5mKGJvdW5kcy54MSk7XG4gIGJvdW5kcy55MSA9IG5vbmluZihib3VuZHMueTEpO1xuICBib3VuZHMueDIgPSBub25pbmYoYm91bmRzLngyKTtcbiAgYm91bmRzLnkyID0gbm9uaW5mKGJvdW5kcy55Mik7XG4gIGJvdW5kcy53ID0gbm9uaW5mKGJvdW5kcy54MiAtIGJvdW5kcy54MSk7XG4gIGJvdW5kcy5oID0gbm9uaW5mKGJvdW5kcy55MiAtIGJvdW5kcy55MSk7XG4gIHJldHVybiBib3VuZHM7XG59O1xuZWxlc2ZuJGIuZGlydHlCb3VuZGluZ0JveENhY2hlID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX3AgPSB0aGlzW2ldLl9wcml2YXRlO1xuICAgIF9wLmJiQ2FjaGUgPSBudWxsO1xuICAgIF9wLmJiQ2FjaGVQb3NLZXkgPSBudWxsO1xuICAgIF9wLmJvZHlCb3VuZHMgPSBudWxsO1xuICAgIF9wLm92ZXJsYXlCb3VuZHMgPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLmFsbCA9IG51bGw7XG4gICAgX3AubGFiZWxCb3VuZHMuc291cmNlID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy50YXJnZXQgPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLm1haW4gPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLnNvdXJjZVJvdCA9IG51bGw7XG4gICAgX3AubGFiZWxCb3VuZHMudGFyZ2V0Um90ID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy5tYWluUm90ID0gbnVsbDtcbiAgICBfcC5hcnJvd0JvdW5kcy5zb3VyY2UgPSBudWxsO1xuICAgIF9wLmFycm93Qm91bmRzLnRhcmdldCA9IG51bGw7XG4gICAgX3AuYXJyb3dCb3VuZHNbJ21pZC1zb3VyY2UnXSA9IG51bGw7XG4gICAgX3AuYXJyb3dCb3VuZHNbJ21pZC10YXJnZXQnXSA9IG51bGw7XG4gIH1cbiAgdGhpcy5lbWl0QW5kTm90aWZ5KCdib3VuZHMnKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBwcml2YXRlIGhlbHBlciB0byBnZXQgYm91bmRpbmcgYm94IGZvciBjdXN0b20gbm9kZSBwb3NpdGlvbnNcbi8vIC0gZ29vZCBmb3IgcGVyZiBpbiBjZXJ0YWluIGNhc2VzIGJ1dCBjdXJyZW50bHkgcmVxdWlyZXMgZGlydHlpbmcgdGhlIHJlbmRlcmVkIHN0eWxlXG4vLyAtIHdvdWxkIGJlIGJldHRlciB0byBub3QgbW9kaWZ5IHRoZSBub2RlcyBidXQgdGhlIG5vZGVzIGFyZSByZWFkIGRpcmVjdGx5IGV2ZXJ5d2hlcmUgaW4gdGhlIHJlbmRlcmVyLi4uXG4vLyAtIHRyeSB0byB1c2UgZm9yIG9ubHkgdGhpbmdzIGxpa2UgZGlzY3JldGUgbGF5b3V0cyB3aGVyZSB0aGUgbm9kZSBwb3NpdGlvbiB3b3VsZCBjaGFuZ2UgYW55d2F5XG5lbGVzZm4kYi5ib3VuZGluZ0JveEF0ID0gZnVuY3Rpb24gKGZuKSB7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgdmFyIHBhcmVudHMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gIGlmIChoYXNDb21wb3VuZE5vZGVzKSB7XG4gICAgcGFyZW50cyA9IG5vZGVzLmZpbHRlcihmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUuaXNQYXJlbnQoKTtcbiAgICB9KTtcbiAgICBub2RlcyA9IG5vZGVzLm5vdChwYXJlbnRzKTtcbiAgfVxuICBpZiAocGxhaW5PYmplY3QoZm4pKSB7XG4gICAgdmFyIG9iaiA9IGZuO1xuICAgIGZuID0gZnVuY3Rpb24gZm4oKSB7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH07XG4gIH1cbiAgdmFyIHN0b3JlT2xkUG9zID0gZnVuY3Rpb24gc3RvcmVPbGRQb3Mobm9kZSwgaSkge1xuICAgIHJldHVybiBub2RlLl9wcml2YXRlLmJiQXRPbGRQb3MgPSBmbihub2RlLCBpKTtcbiAgfTtcbiAgdmFyIGdldE9sZFBvcyA9IGZ1bmN0aW9uIGdldE9sZFBvcyhub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuX3ByaXZhdGUuYmJBdE9sZFBvcztcbiAgfTtcbiAgY3kuc3RhcnRCYXRjaCgpO1xuICBub2Rlcy5mb3JFYWNoKHN0b3JlT2xkUG9zKS5zaWxlbnRQb3NpdGlvbnMoZm4pO1xuICBpZiAoaGFzQ29tcG91bmROb2Rlcykge1xuICAgIHBhcmVudHMuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG4gICAgcGFyZW50cy5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgICBwYXJlbnRzLnVwZGF0ZUNvbXBvdW5kQm91bmRzKHRydWUpOyAvLyBmb3JjZSB1cGRhdGUgYi9jIHdlJ3JlIGluc2lkZSBhIGJhdGNoIGN5Y2xlXG4gIH1cblxuICB2YXIgYmIgPSBjb3B5Qm91bmRpbmdCb3godGhpcy5ib3VuZGluZ0JveCh7XG4gICAgdXNlQ2FjaGU6IGZhbHNlXG4gIH0pKTtcbiAgbm9kZXMuc2lsZW50UG9zaXRpb25zKGdldE9sZFBvcyk7XG4gIGlmIChoYXNDb21wb3VuZE5vZGVzKSB7XG4gICAgcGFyZW50cy5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKTtcbiAgICBwYXJlbnRzLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgIHBhcmVudHMudXBkYXRlQ29tcG91bmRCb3VuZHModHJ1ZSk7IC8vIGZvcmNlIHVwZGF0ZSBiL2Mgd2UncmUgaW5zaWRlIGEgYmF0Y2ggY3ljbGVcbiAgfVxuXG4gIGN5LmVuZEJhdGNoKCk7XG4gIHJldHVybiBiYjtcbn07XG5mbiQzLmJvdW5kaW5nYm94ID0gZm4kMy5iYiA9IGZuJDMuYm91bmRpbmdCb3g7XG5mbiQzLnJlbmRlcmVkQm91bmRpbmdib3ggPSBmbiQzLnJlbmRlcmVkQm91bmRpbmdCb3g7XG52YXIgYm91bmRzID0gZWxlc2ZuJGI7XG5cbnZhciBmbiQyLCBlbGVzZm4kYTtcbmZuJDIgPSBlbGVzZm4kYSA9IHt9O1xudmFyIGRlZmluZURpbUZucyA9IGZ1bmN0aW9uIGRlZmluZURpbUZucyhvcHRzKSB7XG4gIG9wdHMudXBwZXJjYXNlTmFtZSA9IGNhcGl0YWxpemUob3B0cy5uYW1lKTtcbiAgb3B0cy5hdXRvTmFtZSA9ICdhdXRvJyArIG9wdHMudXBwZXJjYXNlTmFtZTtcbiAgb3B0cy5sYWJlbE5hbWUgPSAnbGFiZWwnICsgb3B0cy51cHBlcmNhc2VOYW1lO1xuICBvcHRzLm91dGVyTmFtZSA9ICdvdXRlcicgKyBvcHRzLnVwcGVyY2FzZU5hbWU7XG4gIG9wdHMudXBwZXJjYXNlT3V0ZXJOYW1lID0gY2FwaXRhbGl6ZShvcHRzLm91dGVyTmFtZSk7XG4gIGZuJDJbb3B0cy5uYW1lXSA9IGZ1bmN0aW9uIGRpbUltcGwoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciBjeSA9IF9wLmN5O1xuICAgIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5fcHJpdmF0ZS5zdHlsZUVuYWJsZWQ7XG4gICAgaWYgKGVsZSkge1xuICAgICAgaWYgKHN0eWxlRW5hYmxlZCkge1xuICAgICAgICBpZiAoZWxlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICBlbGUudXBkYXRlQ29tcG91bmRCb3VuZHMoKTtcbiAgICAgICAgICByZXR1cm4gX3Bbb3B0cy5hdXRvTmFtZV0gfHwgMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZCA9IGVsZS5wc3R5bGUob3B0cy5uYW1lKTtcbiAgICAgICAgc3dpdGNoIChkLnN0clZhbHVlKSB7XG4gICAgICAgICAgY2FzZSAnbGFiZWwnOlxuICAgICAgICAgICAgZWxlLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSgpO1xuICAgICAgICAgICAgcmV0dXJuIF9wLnJzdHlsZVtvcHRzLmxhYmVsTmFtZV0gfHwgMDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGQucGZWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBmbiQyWydvdXRlcicgKyBvcHRzLnVwcGVyY2FzZU5hbWVdID0gZnVuY3Rpb24gb3V0ZXJEaW1JbXBsKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgY3kgPSBfcC5jeTtcbiAgICB2YXIgc3R5bGVFbmFibGVkID0gY3kuX3ByaXZhdGUuc3R5bGVFbmFibGVkO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIGlmIChzdHlsZUVuYWJsZWQpIHtcbiAgICAgICAgdmFyIGRpbSA9IGVsZVtvcHRzLm5hbWVdKCk7XG4gICAgICAgIHZhciBib3JkZXIgPSBlbGUucHN0eWxlKCdib3JkZXItd2lkdGgnKS5wZlZhbHVlOyAvLyBuLmIuIDEvMiBlYWNoIHNpZGVcbiAgICAgICAgdmFyIHBhZGRpbmcgPSAyICogZWxlLnBhZGRpbmcoKTtcbiAgICAgICAgcmV0dXJuIGRpbSArIGJvcmRlciArIHBhZGRpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGZuJDJbJ3JlbmRlcmVkJyArIG9wdHMudXBwZXJjYXNlTmFtZV0gPSBmdW5jdGlvbiByZW5kZXJlZERpbUltcGwoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgdmFyIGQgPSBlbGVbb3B0cy5uYW1lXSgpO1xuICAgICAgcmV0dXJuIGQgKiB0aGlzLmN5KCkuem9vbSgpO1xuICAgIH1cbiAgfTtcbiAgZm4kMlsncmVuZGVyZWQnICsgb3B0cy51cHBlcmNhc2VPdXRlck5hbWVdID0gZnVuY3Rpb24gcmVuZGVyZWRPdXRlckRpbUltcGwoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgdmFyIG9kID0gZWxlW29wdHMub3V0ZXJOYW1lXSgpO1xuICAgICAgcmV0dXJuIG9kICogdGhpcy5jeSgpLnpvb20oKTtcbiAgICB9XG4gIH07XG59O1xuZGVmaW5lRGltRm5zKHtcbiAgbmFtZTogJ3dpZHRoJ1xufSk7XG5kZWZpbmVEaW1GbnMoe1xuICBuYW1lOiAnaGVpZ2h0J1xufSk7XG5lbGVzZm4kYS5wYWRkaW5nID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICBpZiAoZWxlLmlzUGFyZW50KCkpIHtcbiAgICBlbGUudXBkYXRlQ29tcG91bmRCb3VuZHMoKTtcbiAgICBpZiAoX3AuYXV0b1BhZGRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIF9wLmF1dG9QYWRkaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlLnBzdHlsZSgncGFkZGluZycpLnBmVmFsdWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBlbGUucHN0eWxlKCdwYWRkaW5nJykucGZWYWx1ZTtcbiAgfVxufTtcbmVsZXNmbiRhLnBhZGRlZEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIHJldHVybiBlbGUuaGVpZ2h0KCkgKyAyICogZWxlLnBhZGRpbmcoKTtcbn07XG5lbGVzZm4kYS5wYWRkZWRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIHJldHVybiBlbGUud2lkdGgoKSArIDIgKiBlbGUucGFkZGluZygpO1xufTtcbnZhciB3aWR0aEhlaWdodCA9IGVsZXNmbiRhO1xuXG52YXIgaWZFZGdlID0gZnVuY3Rpb24gaWZFZGdlKGVsZSwgZ2V0VmFsdWUpIHtcbiAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgIHJldHVybiBnZXRWYWx1ZShlbGUpO1xuICB9XG59O1xudmFyIGlmRWRnZVJlbmRlcmVkUG9zaXRpb24gPSBmdW5jdGlvbiBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9uKGVsZSwgZ2V0UG9pbnQpIHtcbiAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgIHZhciBjeSA9IGVsZS5jeSgpO1xuICAgIHJldHVybiBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbihnZXRQb2ludChlbGUpLCBjeS56b29tKCksIGN5LnBhbigpKTtcbiAgfVxufTtcbnZhciBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9ucyA9IGZ1bmN0aW9uIGlmRWRnZVJlbmRlcmVkUG9zaXRpb25zKGVsZSwgZ2V0UG9pbnRzKSB7XG4gIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICB2YXIgY3kgPSBlbGUuY3koKTtcbiAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgcmV0dXJuIGdldFBvaW50cyhlbGUpLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgcmV0dXJuIG1vZGVsVG9SZW5kZXJlZFBvc2l0aW9uKHAsIHpvb20sIHBhbik7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgY29udHJvbFBvaW50cyA9IGZ1bmN0aW9uIGNvbnRyb2xQb2ludHMoZWxlKSB7XG4gIHJldHVybiBlbGUucmVuZGVyZXIoKS5nZXRDb250cm9sUG9pbnRzKGVsZSk7XG59O1xudmFyIHNlZ21lbnRQb2ludHMgPSBmdW5jdGlvbiBzZWdtZW50UG9pbnRzKGVsZSkge1xuICByZXR1cm4gZWxlLnJlbmRlcmVyKCkuZ2V0U2VnbWVudFBvaW50cyhlbGUpO1xufTtcbnZhciBzb3VyY2VFbmRwb2ludCA9IGZ1bmN0aW9uIHNvdXJjZUVuZHBvaW50KGVsZSkge1xuICByZXR1cm4gZWxlLnJlbmRlcmVyKCkuZ2V0U291cmNlRW5kcG9pbnQoZWxlKTtcbn07XG52YXIgdGFyZ2V0RW5kcG9pbnQgPSBmdW5jdGlvbiB0YXJnZXRFbmRwb2ludChlbGUpIHtcbiAgcmV0dXJuIGVsZS5yZW5kZXJlcigpLmdldFRhcmdldEVuZHBvaW50KGVsZSk7XG59O1xudmFyIG1pZHBvaW50ID0gZnVuY3Rpb24gbWlkcG9pbnQoZWxlKSB7XG4gIHJldHVybiBlbGUucmVuZGVyZXIoKS5nZXRFZGdlTWlkcG9pbnQoZWxlKTtcbn07XG52YXIgcHRzID0ge1xuICBjb250cm9sUG9pbnRzOiB7XG4gICAgZ2V0OiBjb250cm9sUG9pbnRzLFxuICAgIG11bHQ6IHRydWVcbiAgfSxcbiAgc2VnbWVudFBvaW50czoge1xuICAgIGdldDogc2VnbWVudFBvaW50cyxcbiAgICBtdWx0OiB0cnVlXG4gIH0sXG4gIHNvdXJjZUVuZHBvaW50OiB7XG4gICAgZ2V0OiBzb3VyY2VFbmRwb2ludFxuICB9LFxuICB0YXJnZXRFbmRwb2ludDoge1xuICAgIGdldDogdGFyZ2V0RW5kcG9pbnRcbiAgfSxcbiAgbWlkcG9pbnQ6IHtcbiAgICBnZXQ6IG1pZHBvaW50XG4gIH1cbn07XG52YXIgcmVuZGVyZWROYW1lID0gZnVuY3Rpb24gcmVuZGVyZWROYW1lKG5hbWUpIHtcbiAgcmV0dXJuICdyZW5kZXJlZCcgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnN1YnN0cigxKTtcbn07XG52YXIgZWRnZVBvaW50cyA9IE9iamVjdC5rZXlzKHB0cykucmVkdWNlKGZ1bmN0aW9uIChvYmosIG5hbWUpIHtcbiAgdmFyIHNwZWMgPSBwdHNbbmFtZV07XG4gIHZhciByTmFtZSA9IHJlbmRlcmVkTmFtZShuYW1lKTtcbiAgb2JqW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpZkVkZ2UodGhpcywgc3BlYy5nZXQpO1xuICB9O1xuICBpZiAoc3BlYy5tdWx0KSB7XG4gICAgb2JqW3JOYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9ucyh0aGlzLCBzcGVjLmdldCk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBvYmpbck5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGlmRWRnZVJlbmRlcmVkUG9zaXRpb24odGhpcywgc3BlYy5nZXQpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn0sIHt9KTtcblxudmFyIGRpbWVuc2lvbnMgPSBleHRlbmQoe30sIHBvc2l0aW9uLCBib3VuZHMsIHdpZHRoSGVpZ2h0LCBlZGdlUG9pbnRzKTtcblxuLyohXG5FdmVudCBvYmplY3QgYmFzZWQgb24galF1ZXJ5IGV2ZW50cywgTUlUIGxpY2Vuc2VcblxuaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2UvXG5odHRwczovL3RsZHJsZWdhbC5jb20vbGljZW5zZS9taXQtbGljZW5zZVxuaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvYmxvYi9tYXN0ZXIvc3JjL2V2ZW50LmpzXG4qL1xuXG52YXIgRXZlbnQgPSBmdW5jdGlvbiBFdmVudChzcmMsIHByb3BzKSB7XG4gIHRoaXMucmVjeWNsZShzcmMsIHByb3BzKTtcbn07XG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbFxuRXZlbnQucHJvdG90eXBlID0ge1xuICBpbnN0YW5jZVN0cmluZzogZnVuY3Rpb24gaW5zdGFuY2VTdHJpbmcoKSB7XG4gICAgcmV0dXJuICdldmVudCc7XG4gIH0sXG4gIHJlY3ljbGU6IGZ1bmN0aW9uIHJlY3ljbGUoc3JjLCBwcm9wcykge1xuICAgIHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5GYWxzZTtcbiAgICBpZiAoc3JjICE9IG51bGwgJiYgc3JjLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAvLyBCcm93c2VyIEV2ZW50IG9iamVjdFxuICAgICAgdGhpcy50eXBlID0gc3JjLnR5cGU7XG5cbiAgICAgIC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkXG4gICAgICAvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgPyByZXR1cm5UcnVlIDogcmV0dXJuRmFsc2U7XG4gICAgfSBlbHNlIGlmIChzcmMgIT0gbnVsbCAmJiBzcmMudHlwZSkge1xuICAgICAgLy8gUGxhaW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIGV2ZW50IGRldGFpbHNcbiAgICAgIHByb3BzID0gc3JjO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFdmVudCBzdHJpbmdcbiAgICAgIHRoaXMudHlwZSA9IHNyYztcbiAgICB9XG5cbiAgICAvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdFxuICAgIGlmIChwcm9wcyAhPSBudWxsKSB7XG4gICAgICAvLyBtb3JlIGVmZmljaWVudCB0byBtYW51YWxseSBjb3B5IGZpZWxkcyB3ZSB1c2VcbiAgICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IHByb3BzLm9yaWdpbmFsRXZlbnQ7XG4gICAgICB0aGlzLnR5cGUgPSBwcm9wcy50eXBlICE9IG51bGwgPyBwcm9wcy50eXBlIDogdGhpcy50eXBlO1xuICAgICAgdGhpcy5jeSA9IHByb3BzLmN5O1xuICAgICAgdGhpcy50YXJnZXQgPSBwcm9wcy50YXJnZXQ7XG4gICAgICB0aGlzLnBvc2l0aW9uID0gcHJvcHMucG9zaXRpb247XG4gICAgICB0aGlzLnJlbmRlcmVkUG9zaXRpb24gPSBwcm9wcy5yZW5kZXJlZFBvc2l0aW9uO1xuICAgICAgdGhpcy5uYW1lc3BhY2UgPSBwcm9wcy5uYW1lc3BhY2U7XG4gICAgICB0aGlzLmxheW91dCA9IHByb3BzLmxheW91dDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3kgIT0gbnVsbCAmJiB0aGlzLnBvc2l0aW9uICE9IG51bGwgJiYgdGhpcy5yZW5kZXJlZFBvc2l0aW9uID09IG51bGwpIHtcbiAgICAgIC8vIGNyZWF0ZSBhIHJlbmRlcmVkIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSBwYXNzZWQgcG9zaXRpb25cbiAgICAgIHZhciBwb3MgPSB0aGlzLnBvc2l0aW9uO1xuICAgICAgdmFyIHpvb20gPSB0aGlzLmN5Lnpvb20oKTtcbiAgICAgIHZhciBwYW4gPSB0aGlzLmN5LnBhbigpO1xuICAgICAgdGhpcy5yZW5kZXJlZFBvc2l0aW9uID0ge1xuICAgICAgICB4OiBwb3MueCAqIHpvb20gKyBwYW4ueCxcbiAgICAgICAgeTogcG9zLnkgKiB6b29tICsgcGFuLnlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmVcbiAgICB0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gIH0sXG4gIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7XG4gICAgdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG4gICAgaWYgKCFlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgcHJldmVudERlZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnRcbiAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSxcbiAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oKSB7XG4gICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG4gICAgdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG4gICAgaWYgKCFlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50XG4gICAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfSxcbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbiBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSB7XG4gICAgdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG4gICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfSxcbiAgaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSxcbiAgaXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuICBpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2Vcbn07XG5cbnZhciBldmVudFJlZ2V4ID0gL14oW14uXSspKFxcLig/OlteLl0rKSk/JC87IC8vIHJlZ2V4IGZvciBtYXRjaGluZyBldmVudCBzdHJpbmdzIChlLmcuIFwiY2xpY2submFtZXNwYWNlXCIpXG52YXIgdW5pdmVyc2FsTmFtZXNwYWNlID0gJy4qJzsgLy8gbWF0Y2hlcyBhcyBpZiBubyBuYW1lc3BhY2Ugc3BlY2lmaWVkIGFuZCBwcmV2ZW50cyB1c2VycyBmcm9tIHVuYmluZGluZyBhY2NpZGVudGFsbHlcblxudmFyIGRlZmF1bHRzJDggPSB7XG4gIHF1YWxpZmllckNvbXBhcmU6IGZ1bmN0aW9uIHF1YWxpZmllckNvbXBhcmUocTEsIHEyKSB7XG4gICAgcmV0dXJuIHExID09PSBxMjtcbiAgfSxcbiAgZXZlbnRNYXRjaGVzOiBmdW5jdGlvbiBldmVudE1hdGNoZXMoIC8qY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqKi9cbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGFkZEV2ZW50RmllbGRzOiBmdW5jdGlvbiBhZGRFdmVudEZpZWxkcyggLypjb250ZXh0LCBldnQqL1xuICApIHt9LFxuICBjYWxsYmFja0NvbnRleHQ6IGZ1bmN0aW9uIGNhbGxiYWNrQ29udGV4dChjb250ZXh0IC8qLCBsaXN0ZW5lciwgZXZlbnRPYmoqLykge1xuICAgIHJldHVybiBjb250ZXh0O1xuICB9LFxuICBiZWZvcmVFbWl0OiBmdW5jdGlvbiBiZWZvcmVFbWl0KCAvKiBjb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmogKi9cbiAgKSB7fSxcbiAgYWZ0ZXJFbWl0OiBmdW5jdGlvbiBhZnRlckVtaXQoIC8qIGNvbnRleHQsIGxpc3RlbmVyLCBldmVudE9iaiAqL1xuICApIHt9LFxuICBidWJibGU6IGZ1bmN0aW9uIGJ1YmJsZSggLypjb250ZXh0Ki9cbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBwYXJlbnQ6IGZ1bmN0aW9uIHBhcmVudCggLypjb250ZXh0Ki9cbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIGNvbnRleHQ6IG51bGxcbn07XG52YXIgZGVmYXVsdHNLZXlzID0gT2JqZWN0LmtleXMoZGVmYXVsdHMkOCk7XG52YXIgZW1wdHlPcHRzID0ge307XG5mdW5jdGlvbiBFbWl0dGVyKCkge1xuICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZW1wdHlPcHRzO1xuICB2YXIgY29udGV4dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAvLyBtaWNyby1vcHRpbWlzYXRpb24gdnMgT2JqZWN0LmFzc2lnbigpIC0tIHJlZHVjZXMgRWxlbWVudCBpbnN0YW50aWF0aW9uIHRpbWVcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWZhdWx0c0tleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gZGVmYXVsdHNLZXlzW2ldO1xuICAgIHRoaXNba2V5XSA9IG9wdHNba2V5XSB8fCBkZWZhdWx0cyQ4W2tleV07XG4gIH1cbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dCB8fCB0aGlzLmNvbnRleHQ7XG4gIHRoaXMubGlzdGVuZXJzID0gW107XG4gIHRoaXMuZW1pdHRpbmcgPSAwO1xufVxudmFyIHAgPSBFbWl0dGVyLnByb3RvdHlwZTtcbnZhciBmb3JFYWNoRXZlbnQgPSBmdW5jdGlvbiBmb3JFYWNoRXZlbnQoc2VsZiwgaGFuZGxlciwgZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mLCBjb25mT3ZlcnJpZGVzKSB7XG4gIGlmIChmbiQ2KHF1YWxpZmllcikpIHtcbiAgICBjYWxsYmFjayA9IHF1YWxpZmllcjtcbiAgICBxdWFsaWZpZXIgPSBudWxsO1xuICB9XG4gIGlmIChjb25mT3ZlcnJpZGVzKSB7XG4gICAgaWYgKGNvbmYgPT0gbnVsbCkge1xuICAgICAgY29uZiA9IGNvbmZPdmVycmlkZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmYgPSBleHRlbmQoe30sIGNvbmYsIGNvbmZPdmVycmlkZXMpO1xuICAgIH1cbiAgfVxuICB2YXIgZXZlbnRMaXN0ID0gYXJyYXkoZXZlbnRzKSA/IGV2ZW50cyA6IGV2ZW50cy5zcGxpdCgvXFxzKy8pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBldnQgPSBldmVudExpc3RbaV07XG4gICAgaWYgKGVtcHR5U3RyaW5nKGV2dCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgbWF0Y2ggPSBldnQubWF0Y2goZXZlbnRSZWdleCk7IC8vIHR5cGVbLm5hbWVzcGFjZV1cblxuICAgIGlmIChtYXRjaCkge1xuICAgICAgdmFyIHR5cGUgPSBtYXRjaFsxXTtcbiAgICAgIHZhciBuYW1lc3BhY2UgPSBtYXRjaFsyXSA/IG1hdGNoWzJdIDogbnVsbDtcbiAgICAgIHZhciByZXQgPSBoYW5kbGVyKHNlbGYsIGV2dCwgdHlwZSwgbmFtZXNwYWNlLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKTtcbiAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyBhbGxvdyBleGl0aW5nIGVhcmx5XG4gICAgfVxuICB9XG59O1xuXG52YXIgbWFrZUV2ZW50T2JqID0gZnVuY3Rpb24gbWFrZUV2ZW50T2JqKHNlbGYsIG9iaikge1xuICBzZWxmLmFkZEV2ZW50RmllbGRzKHNlbGYuY29udGV4dCwgb2JqKTtcbiAgcmV0dXJuIG5ldyBFdmVudChvYmoudHlwZSwgb2JqKTtcbn07XG52YXIgZm9yRWFjaEV2ZW50T2JqID0gZnVuY3Rpb24gZm9yRWFjaEV2ZW50T2JqKHNlbGYsIGhhbmRsZXIsIGV2ZW50cykge1xuICBpZiAoZXZlbnQoZXZlbnRzKSkge1xuICAgIGhhbmRsZXIoc2VsZiwgZXZlbnRzKTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAocGxhaW5PYmplY3QoZXZlbnRzKSkge1xuICAgIGhhbmRsZXIoc2VsZiwgbWFrZUV2ZW50T2JqKHNlbGYsIGV2ZW50cykpO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZXZlbnRMaXN0ID0gYXJyYXkoZXZlbnRzKSA/IGV2ZW50cyA6IGV2ZW50cy5zcGxpdCgvXFxzKy8pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBldnQgPSBldmVudExpc3RbaV07XG4gICAgaWYgKGVtcHR5U3RyaW5nKGV2dCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgbWF0Y2ggPSBldnQubWF0Y2goZXZlbnRSZWdleCk7IC8vIHR5cGVbLm5hbWVzcGFjZV1cblxuICAgIGlmIChtYXRjaCkge1xuICAgICAgdmFyIHR5cGUgPSBtYXRjaFsxXTtcbiAgICAgIHZhciBuYW1lc3BhY2UgPSBtYXRjaFsyXSA/IG1hdGNoWzJdIDogbnVsbDtcbiAgICAgIHZhciBldmVudE9iaiA9IG1ha2VFdmVudE9iaihzZWxmLCB7XG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgICB0YXJnZXQ6IHNlbGYuY29udGV4dFxuICAgICAgfSk7XG4gICAgICBoYW5kbGVyKHNlbGYsIGV2ZW50T2JqKTtcbiAgICB9XG4gIH1cbn07XG5wLm9uID0gcC5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudHMsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYsIGNvbmZPdmVycmlkZXMpIHtcbiAgZm9yRWFjaEV2ZW50KHRoaXMsIGZ1bmN0aW9uIChzZWxmLCBldmVudCwgdHlwZSwgbmFtZXNwYWNlLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKSB7XG4gICAgaWYgKGZuJDYoY2FsbGJhY2spKSB7XG4gICAgICBzZWxmLmxpc3RlbmVycy5wdXNoKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAvLyBmdWxsIGV2ZW50IHN0cmluZ1xuICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICAgIC8vIGNhbGxiYWNrIHRvIHJ1blxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAvLyB0aGUgZXZlbnQgdHlwZSAoZS5nLiAnY2xpY2snKVxuICAgICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgICAgLy8gdGhlIGV2ZW50IG5hbWVzcGFjZSAoZS5nLiBcIi5mb29cIilcbiAgICAgICAgcXVhbGlmaWVyOiBxdWFsaWZpZXIsXG4gICAgICAgIC8vIGEgcmVzdHJpY3Rpb24gb24gd2hldGhlciB0byBtYXRjaCB0aGlzIGVtaXR0ZXJcbiAgICAgICAgY29uZjogY29uZiAvLyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mLCBjb25mT3ZlcnJpZGVzKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xucC5vbmUgPSBmdW5jdGlvbiAoZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKSB7XG4gIHJldHVybiB0aGlzLm9uKGV2ZW50cywgcXVhbGlmaWVyLCBjYWxsYmFjaywgY29uZiwge1xuICAgIG9uZTogdHJ1ZVxuICB9KTtcbn07XG5wLnJlbW92ZUxpc3RlbmVyID0gcC5vZmYgPSBmdW5jdGlvbiAoZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIGlmICh0aGlzLmVtaXR0aW5nICE9PSAwKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMgPSBjb3B5QXJyYXkkMSh0aGlzLmxpc3RlbmVycyk7XG4gIH1cbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzO1xuICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChpKSB7XG4gICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgIGZvckVhY2hFdmVudChfdGhpcywgZnVuY3Rpb24gKHNlbGYsIGV2ZW50LCB0eXBlLCBuYW1lc3BhY2UsIHF1YWxpZmllciwgY2FsbGJhY2sgLyosIGNvbmYqLykge1xuICAgICAgaWYgKChsaXN0ZW5lci50eXBlID09PSB0eXBlIHx8IGV2ZW50cyA9PT0gJyonKSAmJiAoIW5hbWVzcGFjZSAmJiBsaXN0ZW5lci5uYW1lc3BhY2UgIT09ICcuKicgfHwgbGlzdGVuZXIubmFtZXNwYWNlID09PSBuYW1lc3BhY2UpICYmICghcXVhbGlmaWVyIHx8IHNlbGYucXVhbGlmaWVyQ29tcGFyZShsaXN0ZW5lci5xdWFsaWZpZXIsIHF1YWxpZmllcikpICYmICghY2FsbGJhY2sgfHwgbGlzdGVuZXIuY2FsbGJhY2sgPT09IGNhbGxiYWNrKSkge1xuICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSwgZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKTtcbiAgfTtcbiAgZm9yICh2YXIgaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIF9sb29wKGkpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcbnAucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZW1vdmVMaXN0ZW5lcignKicpO1xufTtcbnAuZW1pdCA9IHAudHJpZ2dlciA9IGZ1bmN0aW9uIChldmVudHMsIGV4dHJhUGFyYW1zLCBtYW51YWxDYWxsYmFjaykge1xuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnM7XG4gIHZhciBudW1MaXN0ZW5lcnNCZWZvcmVFbWl0ID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgdGhpcy5lbWl0dGluZysrO1xuICBpZiAoIWFycmF5KGV4dHJhUGFyYW1zKSkge1xuICAgIGV4dHJhUGFyYW1zID0gW2V4dHJhUGFyYW1zXTtcbiAgfVxuICBmb3JFYWNoRXZlbnRPYmoodGhpcywgZnVuY3Rpb24gKHNlbGYsIGV2ZW50T2JqKSB7XG4gICAgaWYgKG1hbnVhbENhbGxiYWNrICE9IG51bGwpIHtcbiAgICAgIGxpc3RlbmVycyA9IFt7XG4gICAgICAgIGV2ZW50OiBldmVudE9iai5ldmVudCxcbiAgICAgICAgdHlwZTogZXZlbnRPYmoudHlwZSxcbiAgICAgICAgbmFtZXNwYWNlOiBldmVudE9iai5uYW1lc3BhY2UsXG4gICAgICAgIGNhbGxiYWNrOiBtYW51YWxDYWxsYmFja1xuICAgICAgfV07XG4gICAgICBudW1MaXN0ZW5lcnNCZWZvcmVFbWl0ID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgICB9XG4gICAgdmFyIF9sb29wMiA9IGZ1bmN0aW9uIF9sb29wMihpKSB7XG4gICAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07XG4gICAgICBpZiAobGlzdGVuZXIudHlwZSA9PT0gZXZlbnRPYmoudHlwZSAmJiAoIWxpc3RlbmVyLm5hbWVzcGFjZSB8fCBsaXN0ZW5lci5uYW1lc3BhY2UgPT09IGV2ZW50T2JqLm5hbWVzcGFjZSB8fCBsaXN0ZW5lci5uYW1lc3BhY2UgPT09IHVuaXZlcnNhbE5hbWVzcGFjZSkgJiYgc2VsZi5ldmVudE1hdGNoZXMoc2VsZi5jb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmopKSB7XG4gICAgICAgIHZhciBhcmdzID0gW2V2ZW50T2JqXTtcbiAgICAgICAgaWYgKGV4dHJhUGFyYW1zICE9IG51bGwpIHtcbiAgICAgICAgICBwdXNoKGFyZ3MsIGV4dHJhUGFyYW1zKTtcbiAgICAgICAgfVxuICAgICAgICBzZWxmLmJlZm9yZUVtaXQoc2VsZi5jb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmopO1xuICAgICAgICBpZiAobGlzdGVuZXIuY29uZiAmJiBsaXN0ZW5lci5jb25mLm9uZSkge1xuICAgICAgICAgIHNlbGYubGlzdGVuZXJzID0gc2VsZi5saXN0ZW5lcnMuZmlsdGVyKGZ1bmN0aW9uIChsKSB7XG4gICAgICAgICAgICByZXR1cm4gbCAhPT0gbGlzdGVuZXI7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRleHQgPSBzZWxmLmNhbGxiYWNrQ29udGV4dChzZWxmLmNvbnRleHQsIGxpc3RlbmVyLCBldmVudE9iaik7XG4gICAgICAgIHZhciByZXQgPSBsaXN0ZW5lci5jYWxsYmFjay5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgc2VsZi5hZnRlckVtaXQoc2VsZi5jb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmopO1xuICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgIGV2ZW50T2JqLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGV2ZW50T2JqLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gaWYgbGlzdGVuZXIgbWF0Y2hlc1xuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1MaXN0ZW5lcnNCZWZvcmVFbWl0OyBpKyspIHtcbiAgICAgIF9sb29wMihpKTtcbiAgICB9IC8vIGZvciBsaXN0ZW5lclxuXG4gICAgaWYgKHNlbGYuYnViYmxlKHNlbGYuY29udGV4dCkgJiYgIWV2ZW50T2JqLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgIHNlbGYucGFyZW50KHNlbGYuY29udGV4dCkuZW1pdChldmVudE9iaiwgZXh0cmFQYXJhbXMpO1xuICAgIH1cbiAgfSwgZXZlbnRzKTtcbiAgdGhpcy5lbWl0dGluZy0tO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnZhciBlbWl0dGVyT3B0aW9ucyQxID0ge1xuICBxdWFsaWZpZXJDb21wYXJlOiBmdW5jdGlvbiBxdWFsaWZpZXJDb21wYXJlKHNlbGVjdG9yMSwgc2VsZWN0b3IyKSB7XG4gICAgaWYgKHNlbGVjdG9yMSA9PSBudWxsIHx8IHNlbGVjdG9yMiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3IxID09IG51bGwgJiYgc2VsZWN0b3IyID09IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzZWxlY3RvcjEuc2FtZVRleHQoc2VsZWN0b3IyKTtcbiAgICB9XG4gIH0sXG4gIGV2ZW50TWF0Y2hlczogZnVuY3Rpb24gZXZlbnRNYXRjaGVzKGVsZSwgbGlzdGVuZXIsIGV2ZW50T2JqKSB7XG4gICAgdmFyIHNlbGVjdG9yID0gbGlzdGVuZXIucXVhbGlmaWVyO1xuICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZWxlICE9PSBldmVudE9iai50YXJnZXQgJiYgZWxlbWVudChldmVudE9iai50YXJnZXQpICYmIHNlbGVjdG9yLm1hdGNoZXMoZXZlbnRPYmoudGFyZ2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGFkZEV2ZW50RmllbGRzOiBmdW5jdGlvbiBhZGRFdmVudEZpZWxkcyhlbGUsIGV2dCkge1xuICAgIGV2dC5jeSA9IGVsZS5jeSgpO1xuICAgIGV2dC50YXJnZXQgPSBlbGU7XG4gIH0sXG4gIGNhbGxiYWNrQ29udGV4dDogZnVuY3Rpb24gY2FsbGJhY2tDb250ZXh0KGVsZSwgbGlzdGVuZXIsIGV2ZW50T2JqKSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyLnF1YWxpZmllciAhPSBudWxsID8gZXZlbnRPYmoudGFyZ2V0IDogZWxlO1xuICB9LFxuICBiZWZvcmVFbWl0OiBmdW5jdGlvbiBiZWZvcmVFbWl0KGNvbnRleHQsIGxpc3RlbmVyIC8qLCBldmVudE9iaiovKSB7XG4gICAgaWYgKGxpc3RlbmVyLmNvbmYgJiYgbGlzdGVuZXIuY29uZi5vbmNlKSB7XG4gICAgICBsaXN0ZW5lci5jb25mLm9uY2VDb2xsZWN0aW9uLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmV2ZW50LCBsaXN0ZW5lci5xdWFsaWZpZXIsIGxpc3RlbmVyLmNhbGxiYWNrKTtcbiAgICB9XG4gIH0sXG4gIGJ1YmJsZTogZnVuY3Rpb24gYnViYmxlKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBwYXJlbnQ6IGZ1bmN0aW9uIHBhcmVudChlbGUpIHtcbiAgICByZXR1cm4gZWxlLmlzQ2hpbGQoKSA/IGVsZS5wYXJlbnQoKSA6IGVsZS5jeSgpO1xuICB9XG59O1xudmFyIGFyZ1NlbGVjdG9yJDEgPSBmdW5jdGlvbiBhcmdTZWxlY3RvcihhcmcpIHtcbiAgaWYgKHN0cmluZyhhcmcpKSB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3RvcihhcmcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhcmc7XG4gIH1cbn07XG52YXIgZWxlc2ZuJDkgPSB7XG4gIGNyZWF0ZUVtaXR0ZXI6IGZ1bmN0aW9uIGNyZWF0ZUVtaXR0ZXIoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgIGlmICghX3AuZW1pdHRlcikge1xuICAgICAgICBfcC5lbWl0dGVyID0gbmV3IEVtaXR0ZXIoZW1pdHRlck9wdGlvbnMkMSwgZWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGVtaXR0ZXI6IGZ1bmN0aW9uIGVtaXR0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZW1pdHRlcjtcbiAgfSxcbiAgb246IGZ1bmN0aW9uIG9uKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGFyZ1NlbCA9IGFyZ1NlbGVjdG9yJDEoc2VsZWN0b3IpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBlbGUuZW1pdHRlcigpLm9uKGV2ZW50cywgYXJnU2VsLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB2YXIgYXJnU2VsID0gYXJnU2VsZWN0b3IkMShzZWxlY3Rvcik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkucmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBhcmdTZWwsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHJlbW92ZUFsbExpc3RlbmVyczogZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBlbGUuZW1pdHRlcigpLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgb25lOiBmdW5jdGlvbiBvbmUoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB2YXIgYXJnU2VsID0gYXJnU2VsZWN0b3IkMShzZWxlY3Rvcik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkub25lKGV2ZW50cywgYXJnU2VsLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBvbmNlOiBmdW5jdGlvbiBvbmNlKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGFyZ1NlbCA9IGFyZ1NlbGVjdG9yJDEoc2VsZWN0b3IpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBlbGUuZW1pdHRlcigpLm9uKGV2ZW50cywgYXJnU2VsLCBjYWxsYmFjaywge1xuICAgICAgICBvbmNlOiB0cnVlLFxuICAgICAgICBvbmNlQ29sbGVjdGlvbjogdGhpc1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICBlbWl0OiBmdW5jdGlvbiBlbWl0KGV2ZW50cywgZXh0cmFQYXJhbXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgZWxlLmVtaXR0ZXIoKS5lbWl0KGV2ZW50cywgZXh0cmFQYXJhbXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZW1pdEFuZE5vdGlmeTogZnVuY3Rpb24gZW1pdEFuZE5vdGlmeShldmVudCwgZXh0cmFQYXJhbXMpIHtcbiAgICAvLyBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGVtcHR5IGNvbGxlY3Rpb25zIGRvbid0IG5lZWQgdG8gbm90aWZ5IGFueXRoaW5nXG5cbiAgICAvLyBub3RpZnkgcmVuZGVyZXJcbiAgICB0aGlzLmN5KCkubm90aWZ5KGV2ZW50LCB0aGlzKTtcbiAgICB0aGlzLmVtaXQoZXZlbnQsIGV4dHJhUGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufTtcbmRlZmluZS5ldmVudEFsaWFzZXNPbihlbGVzZm4kOSk7XG5cbnZhciBlbGVzZm4kOCA9IHtcbiAgbm9kZXM6IGZ1bmN0aW9uIG5vZGVzKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCk7XG4gICAgfSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgZWRnZXM6IGZ1bmN0aW9uIGVkZ2VzKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNFZGdlKCk7XG4gICAgfSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgLy8gaW50ZXJuYWwgaGVscGVyIHRvIGdldCBub2RlcyBhbmQgZWRnZXMgYXMgc2VwYXJhdGUgY29sbGVjdGlvbnMgd2l0aCBzaW5nbGUgaXRlcmF0aW9uIG92ZXIgZWxlbWVudHNcbiAgYnlHcm91cDogZnVuY3Rpb24gYnlHcm91cCgpIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIGVkZ2VzID0gdGhpcy5zcGF3bigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgIG5vZGVzLnB1c2goZWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVkZ2VzLnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGVzOiBub2RlcyxcbiAgICAgIGVkZ2VzOiBlZGdlc1xuICAgIH07XG4gIH0sXG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKF9maWx0ZXIsIHRoaXNBcmcpIHtcbiAgICBpZiAoX2ZpbHRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBjaGVjayB0aGlzIGZpcnN0IGIvYyBpdCdzIHRoZSBtb3N0IGNvbW1vbi9wZXJmb3JtYW50IGNhc2VcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nKF9maWx0ZXIpIHx8IGVsZW1lbnRPckNvbGxlY3Rpb24oX2ZpbHRlcikpIHtcbiAgICAgIHJldHVybiBuZXcgU2VsZWN0b3IoX2ZpbHRlcikuZmlsdGVyKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoZm4kNihfZmlsdGVyKSkge1xuICAgICAgdmFyIGZpbHRlckVsZXMgPSB0aGlzLnNwYXduKCk7XG4gICAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgIHZhciBpbmNsdWRlID0gdGhpc0FyZyA/IF9maWx0ZXIuYXBwbHkodGhpc0FyZywgW2VsZSwgaSwgZWxlc10pIDogX2ZpbHRlcihlbGUsIGksIGVsZXMpO1xuICAgICAgICBpZiAoaW5jbHVkZSkge1xuICAgICAgICAgIGZpbHRlckVsZXMucHVzaChlbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmlsdGVyRWxlcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oKTsgLy8gaWYgbm90IGhhbmRsZWQgYnkgYWJvdmUsIGdpdmUgJ2VtIGFuIGVtcHR5IGNvbGxlY3Rpb25cbiAgfSxcblxuICBub3Q6IGZ1bmN0aW9uIG5vdCh0b1JlbW92ZSkge1xuICAgIGlmICghdG9SZW1vdmUpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RyaW5nKHRvUmVtb3ZlKSkge1xuICAgICAgICB0b1JlbW92ZSA9IHRoaXMuZmlsdGVyKHRvUmVtb3ZlKTtcbiAgICAgIH1cbiAgICAgIHZhciBlbGVtZW50cyA9IHRoaXMuc3Bhd24oKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXNbaV07XG4gICAgICAgIHZhciByZW1vdmUgPSB0b1JlbW92ZS5oYXMoZWxlbWVudCk7XG4gICAgICAgIGlmICghcmVtb3ZlKSB7XG4gICAgICAgICAgZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVsZW1lbnRzO1xuICAgIH1cbiAgfSxcbiAgYWJzb2x1dGVDb21wbGVtZW50OiBmdW5jdGlvbiBhYnNvbHV0ZUNvbXBsZW1lbnQoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHJldHVybiBjeS5tdXRhYmxlRWxlbWVudHMoKS5ub3QodGhpcyk7XG4gIH0sXG4gIGludGVyc2VjdDogZnVuY3Rpb24gaW50ZXJzZWN0KG90aGVyKSB7XG4gICAgLy8gaWYgYSBzZWxlY3RvciBpcyBzcGVjaWZpZWQsIHRoZW4gZmlsdGVyIGJ5IGl0IGluc3RlYWRcbiAgICBpZiAoc3RyaW5nKG90aGVyKSkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gb3RoZXI7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH1cbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIGNvbDEgPSB0aGlzO1xuICAgIHZhciBjb2wyID0gb3RoZXI7XG4gICAgdmFyIGNvbDFTbWFsbGVyID0gdGhpcy5sZW5ndGggPCBvdGhlci5sZW5ndGg7XG4gICAgdmFyIGNvbFMgPSBjb2wxU21hbGxlciA/IGNvbDEgOiBjb2wyO1xuICAgIHZhciBjb2xMID0gY29sMVNtYWxsZXIgPyBjb2wyIDogY29sMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbFMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBjb2xTW2ldO1xuICAgICAgaWYgKGNvbEwuaGFzKGVsZSkpIHtcbiAgICAgICAgZWxlbWVudHMucHVzaChlbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHM7XG4gIH0sXG4gIHhvcjogZnVuY3Rpb24geG9yKG90aGVyKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgICBpZiAoc3RyaW5nKG90aGVyKSkge1xuICAgICAgb3RoZXIgPSBjeS4kKG90aGVyKTtcbiAgICB9XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciBjb2wxID0gdGhpcztcbiAgICB2YXIgY29sMiA9IG90aGVyO1xuICAgIHZhciBhZGQgPSBmdW5jdGlvbiBhZGQoY29sLCBvdGhlcikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2wubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGNvbFtpXTtcbiAgICAgICAgdmFyIGlkID0gZWxlLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgICAgIHZhciBpbk90aGVyID0gb3RoZXIuaGFzRWxlbWVudFdpdGhJZChpZCk7XG4gICAgICAgIGlmICghaW5PdGhlcikge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgYWRkKGNvbDEsIGNvbDIpO1xuICAgIGFkZChjb2wyLCBjb2wxKTtcbiAgICByZXR1cm4gZWxlbWVudHM7XG4gIH0sXG4gIGRpZmY6IGZ1bmN0aW9uIGRpZmYob3RoZXIpIHtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICAgIGlmIChzdHJpbmcob3RoZXIpKSB7XG4gICAgICBvdGhlciA9IGN5LiQob3RoZXIpO1xuICAgIH1cbiAgICB2YXIgbGVmdCA9IHRoaXMuc3Bhd24oKTtcbiAgICB2YXIgcmlnaHQgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIGJvdGggPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIGNvbDEgPSB0aGlzO1xuICAgIHZhciBjb2wyID0gb3RoZXI7XG4gICAgdmFyIGFkZCA9IGZ1bmN0aW9uIGFkZChjb2wsIG90aGVyLCByZXRFbGVzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gY29sW2ldO1xuICAgICAgICB2YXIgaWQgPSBlbGUuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgICAgdmFyIGluT3RoZXIgPSBvdGhlci5oYXNFbGVtZW50V2l0aElkKGlkKTtcbiAgICAgICAgaWYgKGluT3RoZXIpIHtcbiAgICAgICAgICBib3RoLm1lcmdlKGVsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0RWxlcy5wdXNoKGVsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGFkZChjb2wxLCBjb2wyLCBsZWZ0KTtcbiAgICBhZGQoY29sMiwgY29sMSwgcmlnaHQpO1xuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgYm90aDogYm90aFxuICAgIH07XG4gIH0sXG4gIGFkZDogZnVuY3Rpb24gYWRkKHRvQWRkKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgICBpZiAoIXRvQWRkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHN0cmluZyh0b0FkZCkpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IHRvQWRkO1xuICAgICAgdG9BZGQgPSBjeS5tdXRhYmxlRWxlbWVudHMoKS5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH1cbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLnNwYXduU2VsZigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9BZGQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0b0FkZFtpXTtcbiAgICAgIHZhciBhZGQgPSAhdGhpcy5oYXMoZWxlKTtcbiAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgZWxlbWVudHMucHVzaChlbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHM7XG4gIH0sXG4gIC8vIGluIHBsYWNlIG1lcmdlIG9uIGNhbGxpbmcgY29sbGVjdGlvblxuICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UodG9BZGQpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciBjeSA9IF9wLmN5O1xuICAgIGlmICghdG9BZGQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAodG9BZGQgJiYgc3RyaW5nKHRvQWRkKSkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gdG9BZGQ7XG4gICAgICB0b0FkZCA9IGN5Lm11dGFibGVFbGVtZW50cygpLmZpbHRlcihzZWxlY3Rvcik7XG4gICAgfVxuICAgIHZhciBtYXAgPSBfcC5tYXA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b0FkZC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRvQWRkRWxlID0gdG9BZGRbaV07XG4gICAgICB2YXIgaWQgPSB0b0FkZEVsZS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgICAgdmFyIGFkZCA9ICFtYXAuaGFzKGlkKTtcbiAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5sZW5ndGgrKztcbiAgICAgICAgdGhpc1tpbmRleF0gPSB0b0FkZEVsZTtcbiAgICAgICAgbWFwLnNldChpZCwge1xuICAgICAgICAgIGVsZTogdG9BZGRFbGUsXG4gICAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICB1bm1lcmdlQXQ6IGZ1bmN0aW9uIHVubWVyZ2VBdChpKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgbWFwID0gX3AubWFwO1xuXG4gICAgLy8gcmVtb3ZlIGVsZVxuICAgIHRoaXNbaV0gPSB1bmRlZmluZWQ7XG4gICAgbWFwW1wiZGVsZXRlXCJdKGlkKTtcbiAgICB2YXIgdW5tZXJnZWRMYXN0RWxlID0gaSA9PT0gdGhpcy5sZW5ndGggLSAxO1xuXG4gICAgLy8gcmVwbGFjZSBlbXB0eSBzcG90IHdpdGggbGFzdCBlbGUgaW4gY29sbGVjdGlvblxuICAgIGlmICh0aGlzLmxlbmd0aCA+IDEgJiYgIXVubWVyZ2VkTGFzdEVsZSkge1xuICAgICAgdmFyIGxhc3RFbGVJID0gdGhpcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGxhc3RFbGUgPSB0aGlzW2xhc3RFbGVJXTtcbiAgICAgIHZhciBsYXN0RWxlSWQgPSBsYXN0RWxlLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgICB0aGlzW2xhc3RFbGVJXSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXNbaV0gPSBsYXN0RWxlO1xuICAgICAgbWFwLnNldChsYXN0RWxlSWQsIHtcbiAgICAgICAgZWxlOiBsYXN0RWxlLFxuICAgICAgICBpbmRleDogaVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gdGhlIGNvbGxlY3Rpb24gaXMgbm93IDEgZWxlIHNtYWxsZXJcbiAgICB0aGlzLmxlbmd0aC0tO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICAvLyByZW1vdmUgc2luZ2xlIGVsZSBpbiBwbGFjZSBpbiBjYWxsaW5nIGNvbGxlY3Rpb25cbiAgdW5tZXJnZU9uZTogZnVuY3Rpb24gdW5tZXJnZU9uZShlbGUpIHtcbiAgICBlbGUgPSBlbGVbMF07XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgaWQgPSBlbGUuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICB2YXIgbWFwID0gX3AubWFwO1xuICAgIHZhciBlbnRyeSA9IG1hcC5nZXQoaWQpO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIHJldHVybiB0aGlzOyAvLyBubyBuZWVkIHRvIHJlbW92ZVxuICAgIH1cblxuICAgIHZhciBpID0gZW50cnkuaW5kZXg7XG4gICAgdGhpcy51bm1lcmdlQXQoaSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIC8vIHJlbW92ZSBlbGVzIGluIHBsYWNlIG9uIGNhbGxpbmcgY29sbGVjdGlvblxuICB1bm1lcmdlOiBmdW5jdGlvbiB1bm1lcmdlKHRvUmVtb3ZlKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgICBpZiAoIXRvUmVtb3ZlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHRvUmVtb3ZlICYmIHN0cmluZyh0b1JlbW92ZSkpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IHRvUmVtb3ZlO1xuICAgICAgdG9SZW1vdmUgPSBjeS5tdXRhYmxlRWxlbWVudHMoKS5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnVubWVyZ2VPbmUodG9SZW1vdmVbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICB1bm1lcmdlQnk6IGZ1bmN0aW9uIHVubWVyZ2VCeSh0b1JtRm4pIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBpZiAodG9SbUZuKGVsZSkpIHtcbiAgICAgICAgdGhpcy51bm1lcmdlQXQoaSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBtYXA6IGZ1bmN0aW9uIG1hcChtYXBGbiwgdGhpc0FyZykge1xuICAgIHZhciBhcnIgPSBbXTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgIHZhciByZXQgPSB0aGlzQXJnID8gbWFwRm4uYXBwbHkodGhpc0FyZywgW2VsZSwgaSwgZWxlc10pIDogbWFwRm4oZWxlLCBpLCBlbGVzKTtcbiAgICAgIGFyci5wdXNoKHJldCk7XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG4gIH0sXG4gIHJlZHVjZTogZnVuY3Rpb24gcmVkdWNlKGZuLCBpbml0aWFsVmFsdWUpIHtcbiAgICB2YXIgdmFsID0gaW5pdGlhbFZhbHVlO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbCA9IGZuKHZhbCwgZWxlc1tpXSwgaSwgZWxlcyk7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH0sXG4gIG1heDogZnVuY3Rpb24gbWF4KHZhbEZuLCB0aGlzQXJnKSB7XG4gICAgdmFyIG1heCA9IC1JbmZpbml0eTtcbiAgICB2YXIgbWF4RWxlO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgdmFyIHZhbCA9IHRoaXNBcmcgPyB2YWxGbi5hcHBseSh0aGlzQXJnLCBbZWxlLCBpLCBlbGVzXSkgOiB2YWxGbihlbGUsIGksIGVsZXMpO1xuICAgICAgaWYgKHZhbCA+IG1heCkge1xuICAgICAgICBtYXggPSB2YWw7XG4gICAgICAgIG1heEVsZSA9IGVsZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBtYXgsXG4gICAgICBlbGU6IG1heEVsZVxuICAgIH07XG4gIH0sXG4gIG1pbjogZnVuY3Rpb24gbWluKHZhbEZuLCB0aGlzQXJnKSB7XG4gICAgdmFyIG1pbiA9IEluZmluaXR5O1xuICAgIHZhciBtaW5FbGU7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICB2YXIgdmFsID0gdGhpc0FyZyA/IHZhbEZuLmFwcGx5KHRoaXNBcmcsIFtlbGUsIGksIGVsZXNdKSA6IHZhbEZuKGVsZSwgaSwgZWxlcyk7XG4gICAgICBpZiAodmFsIDwgbWluKSB7XG4gICAgICAgIG1pbiA9IHZhbDtcbiAgICAgICAgbWluRWxlID0gZWxlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IG1pbixcbiAgICAgIGVsZTogbWluRWxlXG4gICAgfTtcbiAgfVxufTtcblxuLy8gYWxpYXNlc1xudmFyIGZuJDEgPSBlbGVzZm4kODtcbmZuJDFbJ3UnXSA9IGZuJDFbJ3wnXSA9IGZuJDFbJysnXSA9IGZuJDEudW5pb24gPSBmbiQxLm9yID0gZm4kMS5hZGQ7XG5mbiQxWydcXFxcJ10gPSBmbiQxWychJ10gPSBmbiQxWyctJ10gPSBmbiQxLmRpZmZlcmVuY2UgPSBmbiQxLnJlbGF0aXZlQ29tcGxlbWVudCA9IGZuJDEuc3VidHJhY3QgPSBmbiQxLm5vdDtcbmZuJDFbJ24nXSA9IGZuJDFbJyYnXSA9IGZuJDFbJy4nXSA9IGZuJDEuYW5kID0gZm4kMS5pbnRlcnNlY3Rpb24gPSBmbiQxLmludGVyc2VjdDtcbmZuJDFbJ14nXSA9IGZuJDFbJygrKSddID0gZm4kMVsnKC0pJ10gPSBmbiQxLnN5bW1ldHJpY0RpZmZlcmVuY2UgPSBmbiQxLnN5bWRpZmYgPSBmbiQxLnhvcjtcbmZuJDEuZm5GaWx0ZXIgPSBmbiQxLmZpbHRlckZuID0gZm4kMS5zdGRGaWx0ZXIgPSBmbiQxLmZpbHRlcjtcbmZuJDEuY29tcGxlbWVudCA9IGZuJDEuYWJzY29tcCA9IGZuJDEuYWJzb2x1dGVDb21wbGVtZW50O1xuXG52YXIgZWxlc2ZuJDcgPSB7XG4gIGlzTm9kZTogZnVuY3Rpb24gaXNOb2RlKCkge1xuICAgIHJldHVybiB0aGlzLmdyb3VwKCkgPT09ICdub2Rlcyc7XG4gIH0sXG4gIGlzRWRnZTogZnVuY3Rpb24gaXNFZGdlKCkge1xuICAgIHJldHVybiB0aGlzLmdyb3VwKCkgPT09ICdlZGdlcyc7XG4gIH0sXG4gIGlzTG9vcDogZnVuY3Rpb24gaXNMb29wKCkge1xuICAgIHJldHVybiB0aGlzLmlzRWRnZSgpICYmIHRoaXMuc291cmNlKClbMF0gPT09IHRoaXMudGFyZ2V0KClbMF07XG4gIH0sXG4gIGlzU2ltcGxlOiBmdW5jdGlvbiBpc1NpbXBsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0VkZ2UoKSAmJiB0aGlzLnNvdXJjZSgpWzBdICE9PSB0aGlzLnRhcmdldCgpWzBdO1xuICB9LFxuICBncm91cDogZnVuY3Rpb24gZ3JvdXAoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5ncm91cDtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogIEVsZW1lbnRzIGFyZSBkcmF3biBpbiBhIHNwZWNpZmljIG9yZGVyIGJhc2VkIG9uIGNvbXBvdW5kIGRlcHRoIChsb3cgdG8gaGlnaCksIHRoZSBlbGVtZW50IHR5cGUgKG5vZGVzIGFib3ZlIGVkZ2VzKSxcbiAqICBhbmQgei1pbmRleCAobG93IHRvIGhpZ2gpLiAgVGhlc2Ugc3R5bGVzIGFmZmVjdCBob3cgdGhpcyBhcHBsaWVzOlxuICpcbiAqICB6LWNvbXBvdW5kLWRlcHRoOiBNYXkgYmUgYGJvdHRvbSB8IG9ycGhhbiB8IGF1dG8gfCB0b3BgLiAgVGhlIGZpcnN0IGRyYXduIGlzIGBib3R0b21gLCB0aGVuIGBvcnBoYW5gIHdoaWNoIGlzIHRoZVxuICogICAgICBzYW1lIGRlcHRoIGFzIHRoZSByb290IG9mIHRoZSBjb21wb3VuZCBncmFwaCwgZm9sbG93ZWQgYnkgdGhlIGRlZmF1bHQgdmFsdWUgYGF1dG9gIHdoaWNoIGRyYXdzIGluIG9yZGVyIGZyb21cbiAqICAgICAgcm9vdCB0byBsZWF2ZXMgb2YgdGhlIGNvbXBvdW5kIGdyYXBoLiAgVGhlIGxhc3QgZHJhd24gaXMgYHRvcGAuXG4gKiAgei1pbmRleC1jb21wYXJlOiBNYXkgYmUgYGF1dG8gfCBtYW51YWxgLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGF1dG9gIHdoaWNoIGFsd2F5cyBkcmF3cyBlZGdlcyB1bmRlciBub2Rlcy5cbiAqICAgICAgYG1hbnVhbGAgaWdub3JlcyB0aGlzIGNvbnZlbnRpb24gYW5kIGRyYXdzIGJhc2VkIG9uIHRoZSBgei1pbmRleGAgdmFsdWUgc2V0dGluZy5cbiAqICB6LWluZGV4OiBBbiBpbnRlZ2VyIHZhbHVlIHRoYXQgYWZmZWN0cyB0aGUgcmVsYXRpdmUgZHJhdyBvcmRlciBvZiBlbGVtZW50cy4gIEluIGdlbmVyYWwsIGFuIGVsZW1lbnQgd2l0aCBhIGhpZ2hlclxuICogICAgICBgei1pbmRleGAgd2lsbCBiZSBkcmF3biBvbiB0b3Agb2YgYW4gZWxlbWVudCB3aXRoIGEgbG93ZXIgYHotaW5kZXhgLlxuICovXG52YXIgekluZGV4U29ydCA9IGZ1bmN0aW9uIHpJbmRleFNvcnQoYSwgYikge1xuICB2YXIgY3kgPSBhLmN5KCk7XG4gIHZhciBoYXNDb21wb3VuZE5vZGVzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICBmdW5jdGlvbiBnZXREZXB0aChlbGUpIHtcbiAgICB2YXIgc3R5bGUgPSBlbGUucHN0eWxlKCd6LWNvbXBvdW5kLWRlcHRoJyk7XG4gICAgaWYgKHN0eWxlLnZhbHVlID09PSAnYXV0bycpIHtcbiAgICAgIHJldHVybiBoYXNDb21wb3VuZE5vZGVzID8gZWxlLnpEZXB0aCgpIDogMDtcbiAgICB9IGVsc2UgaWYgKHN0eWxlLnZhbHVlID09PSAnYm90dG9tJykge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gZWxzZSBpZiAoc3R5bGUudmFsdWUgPT09ICd0b3AnKSB7XG4gICAgICByZXR1cm4gTUFYX0lOVCQxO1xuICAgIH1cbiAgICAvLyAnb3JwaGFuJ1xuICAgIHJldHVybiAwO1xuICB9XG4gIHZhciBkZXB0aERpZmYgPSBnZXREZXB0aChhKSAtIGdldERlcHRoKGIpO1xuICBpZiAoZGVwdGhEaWZmICE9PSAwKSB7XG4gICAgcmV0dXJuIGRlcHRoRGlmZjtcbiAgfVxuICBmdW5jdGlvbiBnZXRFbGVEZXB0aChlbGUpIHtcbiAgICB2YXIgc3R5bGUgPSBlbGUucHN0eWxlKCd6LWluZGV4LWNvbXBhcmUnKTtcbiAgICBpZiAoc3R5bGUudmFsdWUgPT09ICdhdXRvJykge1xuICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKSA/IDEgOiAwO1xuICAgIH1cbiAgICAvLyAnbWFudWFsJ1xuICAgIHJldHVybiAwO1xuICB9XG4gIHZhciBlbGVEaWZmID0gZ2V0RWxlRGVwdGgoYSkgLSBnZXRFbGVEZXB0aChiKTtcbiAgaWYgKGVsZURpZmYgIT09IDApIHtcbiAgICByZXR1cm4gZWxlRGlmZjtcbiAgfVxuICB2YXIgekRpZmYgPSBhLnBzdHlsZSgnei1pbmRleCcpLnZhbHVlIC0gYi5wc3R5bGUoJ3otaW5kZXgnKS52YWx1ZTtcbiAgaWYgKHpEaWZmICE9PSAwKSB7XG4gICAgcmV0dXJuIHpEaWZmO1xuICB9XG4gIC8vIGNvbXBhcmUgaW5kaWNlcyBpbiB0aGUgY29yZSAob3JkZXIgYWRkZWQgdG8gZ3JhcGggdy8gbGFzdCBvbiB0b3ApXG4gIHJldHVybiBhLnBvb2xJbmRleCgpIC0gYi5wb29sSW5kZXgoKTtcbn07XG5cbnZhciBlbGVzZm4kNiA9IHtcbiAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChmbiwgdGhpc0FyZykge1xuICAgIGlmIChmbiQ2KGZuKSkge1xuICAgICAgdmFyIE4gPSB0aGlzLmxlbmd0aDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgICB2YXIgcmV0ID0gdGhpc0FyZyA/IGZuLmFwcGx5KHRoaXNBcmcsIFtlbGUsIGksIHRoaXNdKSA6IGZuKGVsZSwgaSwgdGhpcyk7XG4gICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gLy8gZXhpdCBlYWNoIGVhcmx5IG9uIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICB0b0FycmF5OiBmdW5jdGlvbiB0b0FycmF5KCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJyYXkucHVzaCh0aGlzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9LFxuICBzbGljZTogZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIHZhciB0aGlzU2l6ZSA9IHRoaXMubGVuZ3RoO1xuICAgIGlmIChlbmQgPT0gbnVsbCkge1xuICAgICAgZW5kID0gdGhpc1NpemU7XG4gICAgfVxuICAgIGlmIChzdGFydCA9PSBudWxsKSB7XG4gICAgICBzdGFydCA9IDA7XG4gICAgfVxuICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgIHN0YXJ0ID0gdGhpc1NpemUgKyBzdGFydDtcbiAgICB9XG4gICAgaWYgKGVuZCA8IDApIHtcbiAgICAgIGVuZCA9IHRoaXNTaXplICsgZW5kO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPj0gMCAmJiBpIDwgZW5kICYmIGkgPCB0aGlzU2l6ZTsgaSsrKSB7XG4gICAgICBhcnJheS5wdXNoKHRoaXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bihhcnJheSk7XG4gIH0sXG4gIHNpemU6IGZ1bmN0aW9uIHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoO1xuICB9LFxuICBlcTogZnVuY3Rpb24gZXEoaSkge1xuICAgIHJldHVybiB0aGlzW2ldIHx8IHRoaXMuc3Bhd24oKTtcbiAgfSxcbiAgZmlyc3Q6IGZ1bmN0aW9uIGZpcnN0KCkge1xuICAgIHJldHVybiB0aGlzWzBdIHx8IHRoaXMuc3Bhd24oKTtcbiAgfSxcbiAgbGFzdDogZnVuY3Rpb24gbGFzdCgpIHtcbiAgICByZXR1cm4gdGhpc1t0aGlzLmxlbmd0aCAtIDFdIHx8IHRoaXMuc3Bhd24oKTtcbiAgfSxcbiAgZW1wdHk6IGZ1bmN0aW9uIGVtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMDtcbiAgfSxcbiAgbm9uZW1wdHk6IGZ1bmN0aW9uIG5vbmVtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy5lbXB0eSgpO1xuICB9LFxuICBzb3J0OiBmdW5jdGlvbiBzb3J0KHNvcnRGbikge1xuICAgIGlmICghZm4kNihzb3J0Rm4pKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdmFyIHNvcnRlZCA9IHRoaXMudG9BcnJheSgpLnNvcnQoc29ydEZuKTtcbiAgICByZXR1cm4gdGhpcy5zcGF3bihzb3J0ZWQpO1xuICB9LFxuICBzb3J0QnlaSW5kZXg6IGZ1bmN0aW9uIHNvcnRCeVpJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0KHpJbmRleFNvcnQpO1xuICB9LFxuICB6RGVwdGg6IGZ1bmN0aW9uIHpEZXB0aCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoIWVsZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBsZXQgY3kgPSBlbGUuY3koKTtcbiAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgdmFyIGdyb3VwID0gX3AuZ3JvdXA7XG4gICAgaWYgKGdyb3VwID09PSAnbm9kZXMnKSB7XG4gICAgICB2YXIgZGVwdGggPSBfcC5kYXRhLnBhcmVudCA/IGVsZS5wYXJlbnRzKCkuc2l6ZSgpIDogMDtcbiAgICAgIGlmICghZWxlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgcmV0dXJuIE1BWF9JTlQkMSAtIDE7IC8vIGNoaWxkbGVzcyBub2RlcyBhbHdheXMgb24gdG9wXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZXB0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNyYyA9IF9wLnNvdXJjZTtcbiAgICAgIHZhciB0Z3QgPSBfcC50YXJnZXQ7XG4gICAgICB2YXIgc3JjRGVwdGggPSBzcmMuekRlcHRoKCk7XG4gICAgICB2YXIgdGd0RGVwdGggPSB0Z3QuekRlcHRoKCk7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoc3JjRGVwdGgsIHRndERlcHRoLCAwKTsgLy8gZGVwdGggb2YgZGVlcGVzdCBwYXJlbnRcbiAgICB9XG4gIH1cbn07XG5cbmVsZXNmbiQ2LmVhY2ggPSBlbGVzZm4kNi5mb3JFYWNoO1xudmFyIGRlZmluZVN5bWJvbEl0ZXJhdG9yID0gZnVuY3Rpb24gZGVmaW5lU3ltYm9sSXRlcmF0b3IoKSB7XG4gIHZhciB0eXBlb2ZVbmRlZiA9IFwidW5kZWZpbmVkXCIgO1xuICB2YXIgaXNJdGVyYXRvclN1cHBvcnRlZCA9ICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YoU3ltYm9sKSkgIT0gdHlwZW9mVW5kZWYgJiYgX3R5cGVvZihTeW1ib2wuaXRlcmF0b3IpICE9IHR5cGVvZlVuZGVmOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgaWYgKGlzSXRlcmF0b3JTdXBwb3J0ZWQpIHtcbiAgICBlbGVzZm4kNltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICAgIHZhciBlbnRyeSA9IHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgIH07XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgICByZXR1cm4gX2RlZmluZVByb3BlcnR5JDEoe1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBlbnRyeS52YWx1ZSA9IF90aGlzW2krK107XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgZW50cnkuZG9uZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBlbnRyeTtcbiAgICAgICAgfVxuICAgICAgfSwgU3ltYm9sLml0ZXJhdG9yLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG59O1xuZGVmaW5lU3ltYm9sSXRlcmF0b3IoKTtcblxudmFyIGdldExheW91dERpbWVuc2lvbk9wdGlvbnMgPSBkZWZhdWx0cyRnKHtcbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzOiBmYWxzZVxufSk7XG52YXIgZWxlc2ZuJDUgPSB7XG4gIC8vIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgbm9kZSBkaW1lbnNpb25zIHsgeCwgeSB9IGJhc2VkIG9uIG9wdGlvbnMgZ2l2ZW5cbiAgbGF5b3V0RGltZW5zaW9uczogZnVuY3Rpb24gbGF5b3V0RGltZW5zaW9ucyhvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IGdldExheW91dERpbWVuc2lvbk9wdGlvbnMob3B0aW9ucyk7XG4gICAgdmFyIGRpbXM7XG4gICAgaWYgKCF0aGlzLnRha2VzVXBTcGFjZSgpKSB7XG4gICAgICBkaW1zID0ge1xuICAgICAgICB3OiAwLFxuICAgICAgICBoOiAwXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5ub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHMpIHtcbiAgICAgIHZhciBiYkRpbSA9IHRoaXMuYm91bmRpbmdCb3goKTtcbiAgICAgIGRpbXMgPSB7XG4gICAgICAgIHc6IGJiRGltLncsXG4gICAgICAgIGg6IGJiRGltLmhcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpbXMgPSB7XG4gICAgICAgIHc6IHRoaXMub3V0ZXJXaWR0aCgpLFxuICAgICAgICBoOiB0aGlzLm91dGVySGVpZ2h0KClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gc2FuaXRpc2UgdGhlIGRpbWVuc2lvbnMgZm9yIGV4dGVybmFsIGxheW91dHMgKGF2b2lkIGRpdmlzaW9uIGJ5IHplcm8pXG4gICAgaWYgKGRpbXMudyA9PT0gMCB8fCBkaW1zLmggPT09IDApIHtcbiAgICAgIGRpbXMudyA9IGRpbXMuaCA9IDE7XG4gICAgfVxuICAgIHJldHVybiBkaW1zO1xuICB9LFxuICAvLyB1c2luZyBzdGFuZGFyZCBsYXlvdXQgb3B0aW9ucywgYXBwbHkgcG9zaXRpb24gZnVuY3Rpb24gKHcvIG9yIHcvbyBhbmltYXRpb24pXG4gIGxheW91dFBvc2l0aW9uczogZnVuY3Rpb24gbGF5b3V0UG9zaXRpb25zKGxheW91dCwgb3B0aW9ucywgZm4pIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCkuZmlsdGVyKGZ1bmN0aW9uIChuKSB7XG4gICAgICByZXR1cm4gIW4uaXNQYXJlbnQoKTtcbiAgICB9KTtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIGxheW91dEVsZXMgPSBvcHRpb25zLmVsZXM7IC8vIG5vZGVzICYgZWRnZXNcbiAgICB2YXIgZ2V0TWVtb2l6ZUtleSA9IGZ1bmN0aW9uIGdldE1lbW9pemVLZXkobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUuaWQoKTtcbiAgICB9O1xuICAgIHZhciBmbk1lbSA9IG1lbW9pemUkMShmbiwgZ2V0TWVtb2l6ZUtleSk7IC8vIG1lbW9pemVkIHZlcnNpb24gb2YgcG9zaXRpb24gZnVuY3Rpb25cblxuICAgIGxheW91dC5lbWl0KHtcbiAgICAgIHR5cGU6ICdsYXlvdXRzdGFydCcsXG4gICAgICBsYXlvdXQ6IGxheW91dFxuICAgIH0pO1xuICAgIGxheW91dC5hbmltYXRpb25zID0gW107XG4gICAgdmFyIGNhbGN1bGF0ZVNwYWNpbmcgPSBmdW5jdGlvbiBjYWxjdWxhdGVTcGFjaW5nKHNwYWNpbmcsIG5vZGVzQmIsIHBvcykge1xuICAgICAgdmFyIGNlbnRlciA9IHtcbiAgICAgICAgeDogbm9kZXNCYi54MSArIG5vZGVzQmIudyAvIDIsXG4gICAgICAgIHk6IG5vZGVzQmIueTEgKyBub2Rlc0JiLmggLyAyXG4gICAgICB9O1xuICAgICAgdmFyIHNwYWNpbmdWZWN0b3IgPSB7XG4gICAgICAgIC8vIHNjYWxlIGZyb20gY2VudGVyIG9mIGJvdW5kaW5nIGJveCAobm90IG5lY2Vzc2FyaWx5IDAsMClcbiAgICAgICAgeDogKHBvcy54IC0gY2VudGVyLngpICogc3BhY2luZyxcbiAgICAgICAgeTogKHBvcy55IC0gY2VudGVyLnkpICogc3BhY2luZ1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGNlbnRlci54ICsgc3BhY2luZ1ZlY3Rvci54LFxuICAgICAgICB5OiBjZW50ZXIueSArIHNwYWNpbmdWZWN0b3IueVxuICAgICAgfTtcbiAgICB9O1xuICAgIHZhciB1c2VTcGFjaW5nRmFjdG9yID0gb3B0aW9ucy5zcGFjaW5nRmFjdG9yICYmIG9wdGlvbnMuc3BhY2luZ0ZhY3RvciAhPT0gMTtcbiAgICB2YXIgc3BhY2luZ0JiID0gZnVuY3Rpb24gc3BhY2luZ0JiKCkge1xuICAgICAgaWYgKCF1c2VTcGFjaW5nRmFjdG9yKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHZhciBwb3MgPSBmbk1lbShub2RlLCBpKTtcbiAgICAgICAgZXhwYW5kQm91bmRpbmdCb3hCeVBvaW50KGJiLCBwb3MueCwgcG9zLnkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJiO1xuICAgIH07XG4gICAgdmFyIGJiID0gc3BhY2luZ0JiKCk7XG4gICAgdmFyIGdldEZpbmFsUG9zID0gbWVtb2l6ZSQxKGZ1bmN0aW9uIChub2RlLCBpKSB7XG4gICAgICB2YXIgbmV3UG9zID0gZm5NZW0obm9kZSwgaSk7XG4gICAgICBpZiAodXNlU3BhY2luZ0ZhY3Rvcikge1xuICAgICAgICB2YXIgc3BhY2luZyA9IE1hdGguYWJzKG9wdGlvbnMuc3BhY2luZ0ZhY3Rvcik7XG4gICAgICAgIG5ld1BvcyA9IGNhbGN1bGF0ZVNwYWNpbmcoc3BhY2luZywgYmIsIG5ld1Bvcyk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy50cmFuc2Zvcm0gIT0gbnVsbCkge1xuICAgICAgICBuZXdQb3MgPSBvcHRpb25zLnRyYW5zZm9ybShub2RlLCBuZXdQb3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld1BvcztcbiAgICB9LCBnZXRNZW1vaXplS2V5KTtcbiAgICBpZiAob3B0aW9ucy5hbmltYXRlKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHZhciBuZXdQb3MgPSBnZXRGaW5hbFBvcyhub2RlLCBpKTtcbiAgICAgICAgdmFyIGFuaW1hdGVOb2RlID0gb3B0aW9ucy5hbmltYXRlRmlsdGVyID09IG51bGwgfHwgb3B0aW9ucy5hbmltYXRlRmlsdGVyKG5vZGUsIGkpO1xuICAgICAgICBpZiAoYW5pbWF0ZU5vZGUpIHtcbiAgICAgICAgICB2YXIgYW5pID0gbm9kZS5hbmltYXRpb24oe1xuICAgICAgICAgICAgcG9zaXRpb246IG5ld1BvcyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBvcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgICAgICAgZWFzaW5nOiBvcHRpb25zLmFuaW1hdGlvbkVhc2luZ1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGxheW91dC5hbmltYXRpb25zLnB1c2goYW5pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlLnBvc2l0aW9uKG5ld1Bvcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLmZpdCkge1xuICAgICAgICB2YXIgZml0QW5pID0gY3kuYW5pbWF0aW9uKHtcbiAgICAgICAgICBmaXQ6IHtcbiAgICAgICAgICAgIGJvdW5kaW5nQm94OiBsYXlvdXRFbGVzLmJvdW5kaW5nQm94QXQoZ2V0RmluYWxQb3MpLFxuICAgICAgICAgICAgcGFkZGluZzogb3B0aW9ucy5wYWRkaW5nXG4gICAgICAgICAgfSxcbiAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbixcbiAgICAgICAgICBlYXNpbmc6IG9wdGlvbnMuYW5pbWF0aW9uRWFzaW5nXG4gICAgICAgIH0pO1xuICAgICAgICBsYXlvdXQuYW5pbWF0aW9ucy5wdXNoKGZpdEFuaSk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuem9vbSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMucGFuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIHpvb21QYW5BbmkgPSBjeS5hbmltYXRpb24oe1xuICAgICAgICAgIHpvb206IG9wdGlvbnMuem9vbSxcbiAgICAgICAgICBwYW46IG9wdGlvbnMucGFuLFxuICAgICAgICAgIGR1cmF0aW9uOiBvcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgICAgIGVhc2luZzogb3B0aW9ucy5hbmltYXRpb25FYXNpbmdcbiAgICAgICAgfSk7XG4gICAgICAgIGxheW91dC5hbmltYXRpb25zLnB1c2goem9vbVBhbkFuaSk7XG4gICAgICB9XG4gICAgICBsYXlvdXQuYW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChhbmkpIHtcbiAgICAgICAgcmV0dXJuIGFuaS5wbGF5KCk7XG4gICAgICB9KTtcbiAgICAgIGxheW91dC5vbmUoJ2xheW91dHJlYWR5Jywgb3B0aW9ucy5yZWFkeSk7XG4gICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdsYXlvdXRyZWFkeScsXG4gICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICB9KTtcbiAgICAgIFByb21pc2UkMS5hbGwobGF5b3V0LmFuaW1hdGlvbnMubWFwKGZ1bmN0aW9uIChhbmkpIHtcbiAgICAgICAgcmV0dXJuIGFuaS5wcm9taXNlKCk7XG4gICAgICB9KSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxheW91dC5vbmUoJ2xheW91dHN0b3AnLCBvcHRpb25zLnN0b3ApO1xuICAgICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgICAgdHlwZTogJ2xheW91dHN0b3AnLFxuICAgICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVzLnBvc2l0aW9ucyhnZXRGaW5hbFBvcyk7XG4gICAgICBpZiAob3B0aW9ucy5maXQpIHtcbiAgICAgICAgY3kuZml0KG9wdGlvbnMuZWxlcywgb3B0aW9ucy5wYWRkaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnpvb20gIT0gbnVsbCkge1xuICAgICAgICBjeS56b29tKG9wdGlvbnMuem9vbSk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5wYW4pIHtcbiAgICAgICAgY3kucGFuKG9wdGlvbnMucGFuKTtcbiAgICAgIH1cbiAgICAgIGxheW91dC5vbmUoJ2xheW91dHJlYWR5Jywgb3B0aW9ucy5yZWFkeSk7XG4gICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdsYXlvdXRyZWFkeScsXG4gICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICB9KTtcbiAgICAgIGxheW91dC5vbmUoJ2xheW91dHN0b3AnLCBvcHRpb25zLnN0b3ApO1xuICAgICAgbGF5b3V0LmVtaXQoe1xuICAgICAgICB0eXBlOiAnbGF5b3V0c3RvcCcsXG4gICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgbGF5b3V0OiBmdW5jdGlvbiBsYXlvdXQob3B0aW9ucykge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICByZXR1cm4gY3kubWFrZUxheW91dChleHRlbmQoe30sIG9wdGlvbnMsIHtcbiAgICAgIGVsZXM6IHRoaXNcbiAgICB9KSk7XG4gIH1cbn07XG5cbi8vIGFsaWFzZXM6XG5lbGVzZm4kNS5jcmVhdGVMYXlvdXQgPSBlbGVzZm4kNS5tYWtlTGF5b3V0ID0gZWxlc2ZuJDUubGF5b3V0O1xuXG5mdW5jdGlvbiBzdHlsZUNhY2hlKGtleSwgZm4sIGVsZSkge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBjYWNoZSA9IF9wLnN0eWxlQ2FjaGUgPSBfcC5zdHlsZUNhY2hlIHx8IFtdO1xuICB2YXIgdmFsO1xuICBpZiAoKHZhbCA9IGNhY2hlW2tleV0pICE9IG51bGwpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9IGVsc2Uge1xuICAgIHZhbCA9IGNhY2hlW2tleV0gPSBmbihlbGUpO1xuICAgIHJldHVybiB2YWw7XG4gIH1cbn1cbmZ1bmN0aW9uIGNhY2hlU3R5bGVGdW5jdGlvbihrZXksIGZuKSB7XG4gIGtleSA9IGhhc2hTdHJpbmcoa2V5KTtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNhY2hlZFN0eWxlRnVuY3Rpb24oZWxlKSB7XG4gICAgcmV0dXJuIHN0eWxlQ2FjaGUoa2V5LCBmbiwgZWxlKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNhY2hlUHJvdG90eXBlU3R5bGVGdW5jdGlvbihrZXksIGZuKSB7XG4gIGtleSA9IGhhc2hTdHJpbmcoa2V5KTtcbiAgdmFyIHNlbGZGbiA9IGZ1bmN0aW9uIHNlbGZGbihlbGUpIHtcbiAgICByZXR1cm4gZm4uY2FsbChlbGUpO1xuICB9O1xuICByZXR1cm4gZnVuY3Rpb24gY2FjaGVkUHJvdG90eXBlU3R5bGVGdW5jdGlvbigpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gc3R5bGVDYWNoZShrZXksIHNlbGZGbiwgZWxlKTtcbiAgICB9XG4gIH07XG59XG52YXIgZWxlc2ZuJDQgPSB7XG4gIHJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZTogZnVuY3Rpb24gcmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKHVzZUNhY2hlKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciByZW5kZXJlciA9IGN5LnJlbmRlcmVyKCk7XG4gICAgdmFyIHN0eWxlRW5hYmxlZCA9IGN5LnN0eWxlRW5hYmxlZCgpO1xuICAgIGlmIChyZW5kZXJlciAmJiBzdHlsZUVuYWJsZWQpIHtcbiAgICAgIHJlbmRlcmVyLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSh0aGlzLCB1c2VDYWNoZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBkaXJ0eVN0eWxlQ2FjaGU6IGZ1bmN0aW9uIGRpcnR5U3R5bGVDYWNoZSgpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIGRpcnR5ID0gZnVuY3Rpb24gZGlydHkoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLl9wcml2YXRlLnN0eWxlQ2FjaGUgPSBudWxsO1xuICAgIH07XG4gICAgaWYgKGN5Lmhhc0NvbXBvdW5kTm9kZXMoKSkge1xuICAgICAgdmFyIGVsZXM7XG4gICAgICBlbGVzID0gdGhpcy5zcGF3blNlbGYoKS5tZXJnZSh0aGlzLmRlc2NlbmRhbnRzKCkpLm1lcmdlKHRoaXMucGFyZW50cygpKTtcbiAgICAgIGVsZXMubWVyZ2UoZWxlcy5jb25uZWN0ZWRFZGdlcygpKTtcbiAgICAgIGVsZXMuZm9yRWFjaChkaXJ0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIGRpcnR5KGVsZSk7XG4gICAgICAgIGVsZS5jb25uZWN0ZWRFZGdlcygpLmZvckVhY2goZGlydHkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICAvLyBmdWxseSB1cGRhdGVzIChyZWNhbGN1bGF0ZXMpIHRoZSBzdHlsZSBmb3IgdGhlIGVsZW1lbnRzXG4gIHVwZGF0ZVN0eWxlOiBmdW5jdGlvbiB1cGRhdGVTdHlsZShub3RpZnlSZW5kZXJlcikge1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmIChjeS5iYXRjaGluZygpKSB7XG4gICAgICB2YXIgYkVsZXMgPSBjeS5fcHJpdmF0ZS5iYXRjaFN0eWxlRWxlcztcbiAgICAgIGJFbGVzLm1lcmdlKHRoaXMpO1xuICAgICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nIGFuZCBleGl0IGVhcmx5IHdoZW4gYmF0Y2hpbmdcbiAgICB9XG5cbiAgICB2YXIgaGFzQ29tcG91bmRzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICAgIHZhciB1cGRhdGVkRWxlcyA9IHRoaXM7XG4gICAgbm90aWZ5UmVuZGVyZXIgPSBub3RpZnlSZW5kZXJlciB8fCBub3RpZnlSZW5kZXJlciA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGZhbHNlO1xuICAgIGlmIChoYXNDb21wb3VuZHMpIHtcbiAgICAgIC8vIHRoZW4gYWRkIGV2ZXJ5dGhpbmcgdXAgYW5kIGRvd24gZm9yIGNvbXBvdW5kIHNlbGVjdG9yIGNoZWNrc1xuICAgICAgdXBkYXRlZEVsZXMgPSB0aGlzLnNwYXduU2VsZigpLm1lcmdlKHRoaXMuZGVzY2VuZGFudHMoKSkubWVyZ2UodGhpcy5wYXJlbnRzKCkpO1xuICAgIH1cblxuICAgIC8vIGxldCBjaGFuZ2VkRWxlcyA9IHN0eWxlLmFwcGx5KCB1cGRhdGVkRWxlcyApO1xuICAgIHZhciBjaGFuZ2VkRWxlcyA9IHVwZGF0ZWRFbGVzO1xuICAgIGlmIChub3RpZnlSZW5kZXJlcikge1xuICAgICAgY2hhbmdlZEVsZXMuZW1pdEFuZE5vdGlmeSgnc3R5bGUnKTsgLy8gbGV0IHJlbmRlcmVyIGtub3cgd2UgY2hhbmdlZCBzdHlsZVxuICAgIH0gZWxzZSB7XG4gICAgICBjaGFuZ2VkRWxlcy5lbWl0KCdzdHlsZScpOyAvLyBqdXN0IGZpcmUgdGhlIGV2ZW50XG4gICAgfVxuXG4gICAgdXBkYXRlZEVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLl9wcml2YXRlLnN0eWxlRGlydHkgPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIC8vIHByaXZhdGU6IGNsZWFycyBkaXJ0eSBmbGFnIGFuZCByZWNhbGN1bGF0ZXMgc3R5bGVcbiAgY2xlYW5TdHlsZTogZnVuY3Rpb24gY2xlYW5TdHlsZSgpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgaWYgKGVsZS5fcHJpdmF0ZS5zdHlsZURpcnR5KSB7XG4gICAgICAgIC8vIG4uYi4gdGhpcyBmbGFnIHNob3VsZCBiZSBzZXQgYmVmb3JlIGFwcGx5KCkgdG8gYXZvaWQgcG90ZW50aWFsIGluZmluaXRlIHJlY3Vyc2lvblxuICAgICAgICBlbGUuX3ByaXZhdGUuc3R5bGVEaXJ0eSA9IGZhbHNlO1xuICAgICAgICBjeS5zdHlsZSgpLmFwcGx5KGVsZSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvLyBnZXQgdGhlIGludGVybmFsIHBhcnNlZCBzdHlsZSBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlcbiAgcGFyc2VkU3R5bGU6IGZ1bmN0aW9uIHBhcnNlZFN0eWxlKHByb3BlcnR5KSB7XG4gICAgdmFyIGluY2x1ZGVOb25EZWZhdWx0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBjeSA9IGVsZS5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVsZSkge1xuICAgICAgdGhpcy5jbGVhblN0eWxlKCk7XG4gICAgICB2YXIgb3ZlcnJpZGRlblN0eWxlID0gZWxlLl9wcml2YXRlLnN0eWxlW3Byb3BlcnR5XTtcbiAgICAgIGlmIChvdmVycmlkZGVuU3R5bGUgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGRlblN0eWxlO1xuICAgICAgfSBlbHNlIGlmIChpbmNsdWRlTm9uRGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gY3kuc3R5bGUoKS5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBudW1lcmljU3R5bGU6IGZ1bmN0aW9uIG51bWVyaWNTdHlsZShwcm9wZXJ0eSkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmICghZWxlLmN5KCkuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVsZSkge1xuICAgICAgdmFyIHBzdHlsZSA9IGVsZS5wc3R5bGUocHJvcGVydHkpO1xuICAgICAgcmV0dXJuIHBzdHlsZS5wZlZhbHVlICE9PSB1bmRlZmluZWQgPyBwc3R5bGUucGZWYWx1ZSA6IHBzdHlsZS52YWx1ZTtcbiAgICB9XG4gIH0sXG4gIG51bWVyaWNTdHlsZVVuaXRzOiBmdW5jdGlvbiBudW1lcmljU3R5bGVVbml0cyhwcm9wZXJ0eSkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmICghZWxlLmN5KCkuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5wc3R5bGUocHJvcGVydHkpLnVuaXRzO1xuICAgIH1cbiAgfSxcbiAgLy8gZ2V0IHRoZSBzcGVjaWZpZWQgY3NzIHByb3BlcnR5IGFzIGEgcmVuZGVyZWQgdmFsdWUgKGkuZS4gb24tc2NyZWVuIHZhbHVlKVxuICAvLyBvciBnZXQgdGhlIHdob2xlIHJlbmRlcmVkIHN0eWxlIGlmIG5vIHByb3BlcnR5IHNwZWNpZmllZCAoTkIgZG9lc24ndCBhbGxvdyBzZXR0aW5nKVxuICByZW5kZXJlZFN0eWxlOiBmdW5jdGlvbiByZW5kZXJlZFN0eWxlKHByb3BlcnR5KSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gY3kuc3R5bGUoKS5nZXRSZW5kZXJlZFN0eWxlKGVsZSwgcHJvcGVydHkpO1xuICAgIH1cbiAgfSxcbiAgLy8gcmVhZCB0aGUgY2FsY3VsYXRlZCBjc3Mgc3R5bGUgb2YgdGhlIGVsZW1lbnQgb3Igb3ZlcnJpZGUgdGhlIHN0eWxlICh2aWEgYSBieXBhc3MpXG4gIHN0eWxlOiBmdW5jdGlvbiBzdHlsZShuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdmFyIHVwZGF0ZVRyYW5zaXRpb25zID0gZmFsc2U7XG4gICAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgICBpZiAocGxhaW5PYmplY3QobmFtZSkpIHtcbiAgICAgIC8vIHRoZW4gZXh0ZW5kIHRoZSBieXBhc3NcbiAgICAgIHZhciBwcm9wcyA9IG5hbWU7XG4gICAgICBzdHlsZS5hcHBseUJ5cGFzcyh0aGlzLCBwcm9wcywgdXBkYXRlVHJhbnNpdGlvbnMpO1xuICAgICAgdGhpcy5lbWl0QW5kTm90aWZ5KCdzdHlsZScpOyAvLyBsZXQgdGhlIHJlbmRlcmVyIGtub3cgd2UndmUgdXBkYXRlZCBzdHlsZVxuICAgIH0gZWxzZSBpZiAoc3RyaW5nKG5hbWUpKSB7XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyB0aGVuIGdldCB0aGUgcHJvcGVydHkgZnJvbSB0aGUgc3R5bGVcbiAgICAgICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgICAgIGlmIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gc3R5bGUuZ2V0U3R5bGVQcm9wZXJ0eVZhbHVlKGVsZSwgbmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZW1wdHkgY29sbGVjdGlvbiA9PiBjYW4ndCBnZXQgYW55IHZhbHVlXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGVuIHNldCB0aGUgYnlwYXNzIHdpdGggdGhlIHByb3BlcnR5IHZhbHVlXG4gICAgICAgIHN0eWxlLmFwcGx5QnlwYXNzKHRoaXMsIG5hbWUsIHZhbHVlLCB1cGRhdGVUcmFuc2l0aW9ucyk7XG4gICAgICAgIHRoaXMuZW1pdEFuZE5vdGlmeSgnc3R5bGUnKTsgLy8gbGV0IHRoZSByZW5kZXJlciBrbm93IHdlJ3ZlIHVwZGF0ZWQgc3R5bGVcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIF9lbGUgPSB0aGlzWzBdO1xuICAgICAgaWYgKF9lbGUpIHtcbiAgICAgICAgcmV0dXJuIHN0eWxlLmdldFJhd1N0eWxlKF9lbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZW1wdHkgY29sbGVjdGlvbiA9PiBjYW4ndCBnZXQgYW55IHZhbHVlXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgcmVtb3ZlU3R5bGU6IGZ1bmN0aW9uIHJlbW92ZVN0eWxlKG5hbWVzKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2YXIgdXBkYXRlVHJhbnNpdGlvbnMgPSBmYWxzZTtcbiAgICB2YXIgc3R5bGUgPSBjeS5zdHlsZSgpO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICBpZiAobmFtZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgICBzdHlsZS5yZW1vdmVBbGxCeXBhc3NlcyhlbGUsIHVwZGF0ZVRyYW5zaXRpb25zKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZXMgPSBuYW1lcy5zcGxpdCgvXFxzKy8pO1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGVsZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBfZWxlMiA9IGVsZXNbX2ldO1xuICAgICAgICBzdHlsZS5yZW1vdmVCeXBhc3NlcyhfZWxlMiwgbmFtZXMsIHVwZGF0ZVRyYW5zaXRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5lbWl0QW5kTm90aWZ5KCdzdHlsZScpOyAvLyBsZXQgdGhlIHJlbmRlcmVyIGtub3cgd2UndmUgdXBkYXRlZCBzdHlsZVxuXG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcbiAgICB0aGlzLmNzcygnZGlzcGxheScsICdlbGVtZW50Jyk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgaGlkZTogZnVuY3Rpb24gaGlkZSgpIHtcbiAgICB0aGlzLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgZWZmZWN0aXZlT3BhY2l0eTogZnVuY3Rpb24gZWZmZWN0aXZlT3BhY2l0eSgpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHZhciBoYXNDb21wb3VuZE5vZGVzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgIHZhciBwYXJlbnRPcGFjaXR5ID0gZWxlLnBzdHlsZSgnb3BhY2l0eScpLnZhbHVlO1xuICAgICAgaWYgKCFoYXNDb21wb3VuZE5vZGVzKSB7XG4gICAgICAgIHJldHVybiBwYXJlbnRPcGFjaXR5O1xuICAgICAgfVxuICAgICAgdmFyIHBhcmVudHMgPSAhX3AuZGF0YS5wYXJlbnQgPyBudWxsIDogZWxlLnBhcmVudHMoKTtcbiAgICAgIGlmIChwYXJlbnRzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2ldO1xuICAgICAgICAgIHZhciBvcGFjaXR5ID0gcGFyZW50LnBzdHlsZSgnb3BhY2l0eScpLnZhbHVlO1xuICAgICAgICAgIHBhcmVudE9wYWNpdHkgPSBvcGFjaXR5ICogcGFyZW50T3BhY2l0eTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcmVudE9wYWNpdHk7XG4gICAgfVxuICB9LFxuICB0cmFuc3BhcmVudDogZnVuY3Rpb24gdHJhbnNwYXJlbnQoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBlbGUuY3koKS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gICAgaWYgKGVsZSkge1xuICAgICAgaWYgKCFoYXNDb21wb3VuZE5vZGVzKSB7XG4gICAgICAgIHJldHVybiBlbGUucHN0eWxlKCdvcGFjaXR5JykudmFsdWUgPT09IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWxlLmVmZmVjdGl2ZU9wYWNpdHkoKSA9PT0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGJhY2tncm91bmRpbmc6IGZ1bmN0aW9uIGJhY2tncm91bmRpbmcoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5iYWNrZ3JvdW5kaW5nID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG59O1xuZnVuY3Rpb24gY2hlY2tDb21wb3VuZChlbGUsIHBhcmVudE9rKSB7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHBhcmVudHMgPSBfcC5kYXRhLnBhcmVudCA/IGVsZS5wYXJlbnRzKCkgOiBudWxsO1xuICBpZiAocGFyZW50cykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhcmVudCA9IHBhcmVudHNbaV07XG4gICAgICBpZiAoIXBhcmVudE9rKHBhcmVudCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGRlZmluZURlcml2ZWRTdGF0ZUZ1bmN0aW9uKHNwZWNzKSB7XG4gIHZhciBvayA9IHNwZWNzLm9rO1xuICB2YXIgZWRnZU9rVmlhTm9kZSA9IHNwZWNzLmVkZ2VPa1ZpYU5vZGUgfHwgc3BlY3Mub2s7XG4gIHZhciBwYXJlbnRPayA9IHNwZWNzLnBhcmVudE9rIHx8IHNwZWNzLm9rO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gICAgaWYgKGVsZSkge1xuICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgaWYgKCFvayhlbGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgICAgcmV0dXJuICFoYXNDb21wb3VuZE5vZGVzIHx8IGNoZWNrQ29tcG91bmQoZWxlLCBwYXJlbnRPayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgc3JjID0gX3Auc291cmNlO1xuICAgICAgICB2YXIgdGd0ID0gX3AudGFyZ2V0O1xuICAgICAgICByZXR1cm4gZWRnZU9rVmlhTm9kZShzcmMpICYmICghaGFzQ29tcG91bmROb2RlcyB8fCBjaGVja0NvbXBvdW5kKHNyYywgZWRnZU9rVmlhTm9kZSkpICYmIChzcmMgPT09IHRndCB8fCBlZGdlT2tWaWFOb2RlKHRndCkgJiYgKCFoYXNDb21wb3VuZE5vZGVzIHx8IGNoZWNrQ29tcG91bmQodGd0LCBlZGdlT2tWaWFOb2RlKSkpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbnZhciBlbGVUYWtlc1VwU3BhY2UgPSBjYWNoZVN0eWxlRnVuY3Rpb24oJ2VsZVRha2VzVXBTcGFjZScsIGZ1bmN0aW9uIChlbGUpIHtcbiAgcmV0dXJuIGVsZS5wc3R5bGUoJ2Rpc3BsYXknKS52YWx1ZSA9PT0gJ2VsZW1lbnQnICYmIGVsZS53aWR0aCgpICE9PSAwICYmIChlbGUuaXNOb2RlKCkgPyBlbGUuaGVpZ2h0KCkgIT09IDAgOiB0cnVlKTtcbn0pO1xuZWxlc2ZuJDQudGFrZXNVcFNwYWNlID0gY2FjaGVQcm90b3R5cGVTdHlsZUZ1bmN0aW9uKCd0YWtlc1VwU3BhY2UnLCBkZWZpbmVEZXJpdmVkU3RhdGVGdW5jdGlvbih7XG4gIG9rOiBlbGVUYWtlc1VwU3BhY2Vcbn0pKTtcbnZhciBlbGVJbnRlcmFjdGl2ZSA9IGNhY2hlU3R5bGVGdW5jdGlvbignZWxlSW50ZXJhY3RpdmUnLCBmdW5jdGlvbiAoZWxlKSB7XG4gIHJldHVybiBlbGUucHN0eWxlKCdldmVudHMnKS52YWx1ZSA9PT0gJ3llcycgJiYgZWxlLnBzdHlsZSgndmlzaWJpbGl0eScpLnZhbHVlID09PSAndmlzaWJsZScgJiYgZWxlVGFrZXNVcFNwYWNlKGVsZSk7XG59KTtcbnZhciBwYXJlbnRJbnRlcmFjdGl2ZSA9IGNhY2hlU3R5bGVGdW5jdGlvbigncGFyZW50SW50ZXJhY3RpdmUnLCBmdW5jdGlvbiAocGFyZW50KSB7XG4gIHJldHVybiBwYXJlbnQucHN0eWxlKCd2aXNpYmlsaXR5JykudmFsdWUgPT09ICd2aXNpYmxlJyAmJiBlbGVUYWtlc1VwU3BhY2UocGFyZW50KTtcbn0pO1xuZWxlc2ZuJDQuaW50ZXJhY3RpdmUgPSBjYWNoZVByb3RvdHlwZVN0eWxlRnVuY3Rpb24oJ2ludGVyYWN0aXZlJywgZGVmaW5lRGVyaXZlZFN0YXRlRnVuY3Rpb24oe1xuICBvazogZWxlSW50ZXJhY3RpdmUsXG4gIHBhcmVudE9rOiBwYXJlbnRJbnRlcmFjdGl2ZSxcbiAgZWRnZU9rVmlhTm9kZTogZWxlVGFrZXNVcFNwYWNlXG59KSk7XG5lbGVzZm4kNC5ub25pbnRlcmFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIGlmIChlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5pbnRlcmFjdGl2ZSgpO1xuICB9XG59O1xudmFyIGVsZVZpc2libGUgPSBjYWNoZVN0eWxlRnVuY3Rpb24oJ2VsZVZpc2libGUnLCBmdW5jdGlvbiAoZWxlKSB7XG4gIHJldHVybiBlbGUucHN0eWxlKCd2aXNpYmlsaXR5JykudmFsdWUgPT09ICd2aXNpYmxlJyAmJiBlbGUucHN0eWxlKCdvcGFjaXR5JykucGZWYWx1ZSAhPT0gMCAmJiBlbGVUYWtlc1VwU3BhY2UoZWxlKTtcbn0pO1xudmFyIGVkZ2VWaXNpYmxlVmlhTm9kZSA9IGVsZVRha2VzVXBTcGFjZTtcbmVsZXNmbiQ0LnZpc2libGUgPSBjYWNoZVByb3RvdHlwZVN0eWxlRnVuY3Rpb24oJ3Zpc2libGUnLCBkZWZpbmVEZXJpdmVkU3RhdGVGdW5jdGlvbih7XG4gIG9rOiBlbGVWaXNpYmxlLFxuICBlZGdlT2tWaWFOb2RlOiBlZGdlVmlzaWJsZVZpYU5vZGVcbn0pKTtcbmVsZXNmbiQ0LmhpZGRlbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIGlmIChlbGUpIHtcbiAgICByZXR1cm4gIWVsZS52aXNpYmxlKCk7XG4gIH1cbn07XG5lbGVzZm4kNC5pc0J1bmRsZWRCZXppZXIgPSBjYWNoZVByb3RvdHlwZVN0eWxlRnVuY3Rpb24oJ2lzQnVuZGxlZEJlemllcicsIGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLmN5KCkuc3R5bGVFbmFibGVkKCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuICF0aGlzLnJlbW92ZWQoKSAmJiB0aGlzLnBzdHlsZSgnY3VydmUtc3R5bGUnKS52YWx1ZSA9PT0gJ2JlemllcicgJiYgdGhpcy50YWtlc1VwU3BhY2UoKTtcbn0pO1xuZWxlc2ZuJDQuYnlwYXNzID0gZWxlc2ZuJDQuY3NzID0gZWxlc2ZuJDQuc3R5bGU7XG5lbGVzZm4kNC5yZW5kZXJlZENzcyA9IGVsZXNmbiQ0LnJlbmRlcmVkU3R5bGU7XG5lbGVzZm4kNC5yZW1vdmVCeXBhc3MgPSBlbGVzZm4kNC5yZW1vdmVDc3MgPSBlbGVzZm4kNC5yZW1vdmVTdHlsZTtcbmVsZXNmbiQ0LnBzdHlsZSA9IGVsZXNmbiQ0LnBhcnNlZFN0eWxlO1xuXG52YXIgZWxlc2ZuJDMgPSB7fTtcbmZ1bmN0aW9uIGRlZmluZVN3aXRjaEZ1bmN0aW9uKHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHZhciBjaGFuZ2VkRWxlcyA9IFtdO1xuXG4gICAgLy8gZS5nLiBjeS5ub2RlcygpLnNlbGVjdCggZGF0YSwgaGFuZGxlciApXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICB2YXIgZGF0YSA9IGFyZ3NbMF07XG4gICAgICB2YXIgaGFuZGxlciA9IGFyZ3NbMV07XG4gICAgICB0aGlzLm9uKHBhcmFtcy5ldmVudCwgZGF0YSwgaGFuZGxlcik7XG4gICAgfVxuXG4gICAgLy8gZS5nLiBjeS5ub2RlcygpLnNlbGVjdCggaGFuZGxlciApXG4gICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgZm4kNihhcmdzWzBdKSkge1xuICAgICAgdmFyIF9oYW5kbGVyID0gYXJnc1swXTtcbiAgICAgIHRoaXMub24ocGFyYW1zLmV2ZW50LCBfaGFuZGxlcik7XG4gICAgfVxuXG4gICAgLy8gZS5nLiBjeS5ub2RlcygpLnNlbGVjdCgpXG4gICAgLy8gZS5nLiAocHJpdmF0ZSkgY3kubm9kZXMoKS5zZWxlY3QoWyd0YXBzZWxlY3QnXSlcbiAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMCB8fCBhcmdzLmxlbmd0aCA9PT0gMSAmJiBhcnJheShhcmdzWzBdKSkge1xuICAgICAgdmFyIGFkZGxFdmVudHMgPSBhcmdzLmxlbmd0aCA9PT0gMSA/IGFyZ3NbMF0gOiBudWxsO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgICB2YXIgYWJsZSA9ICFwYXJhbXMuYWJsZUZpZWxkIHx8IGVsZS5fcHJpdmF0ZVtwYXJhbXMuYWJsZUZpZWxkXTtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBlbGUuX3ByaXZhdGVbcGFyYW1zLmZpZWxkXSAhPSBwYXJhbXMudmFsdWU7XG4gICAgICAgIGlmIChwYXJhbXMub3ZlcnJpZGVBYmxlKSB7XG4gICAgICAgICAgdmFyIG92ZXJyaWRlQWJsZSA9IHBhcmFtcy5vdmVycmlkZUFibGUoZWxlKTtcbiAgICAgICAgICBpZiAob3ZlcnJpZGVBYmxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFibGUgPSBvdmVycmlkZUFibGU7XG4gICAgICAgICAgICBpZiAoIW92ZXJyaWRlQWJsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0gLy8gdG8gc2F2ZSBjeWNsZXMgYXNzdW1lIG5vdCBhYmxlIGZvciBhbGwgb24gb3ZlcnJpZGVcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWJsZSkge1xuICAgICAgICAgIGVsZS5fcHJpdmF0ZVtwYXJhbXMuZmllbGRdID0gcGFyYW1zLnZhbHVlO1xuICAgICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICBjaGFuZ2VkRWxlcy5wdXNoKGVsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgY2hhbmdlZENvbGwgPSB0aGlzLnNwYXduKGNoYW5nZWRFbGVzKTtcbiAgICAgIGNoYW5nZWRDb2xsLnVwZGF0ZVN0eWxlKCk7IC8vIGNoYW5nZSBvZiBzdGF0ZSA9PiBwb3NzaWJsZSBjaGFuZ2Ugb2Ygc3R5bGVcbiAgICAgIGNoYW5nZWRDb2xsLmVtaXQocGFyYW1zLmV2ZW50KTtcbiAgICAgIGlmIChhZGRsRXZlbnRzKSB7XG4gICAgICAgIGNoYW5nZWRDb2xsLmVtaXQoYWRkbEV2ZW50cyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuZnVuY3Rpb24gZGVmaW5lU3dpdGNoU2V0KHBhcmFtcykge1xuICBlbGVzZm4kM1twYXJhbXMuZmllbGRdID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIGlmIChwYXJhbXMub3ZlcnJpZGVGaWVsZCkge1xuICAgICAgICB2YXIgdmFsID0gcGFyYW1zLm92ZXJyaWRlRmllbGQoZWxlKTtcbiAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVsZS5fcHJpdmF0ZVtwYXJhbXMuZmllbGRdO1xuICAgIH1cbiAgfTtcbiAgZWxlc2ZuJDNbcGFyYW1zLm9uXSA9IGRlZmluZVN3aXRjaEZ1bmN0aW9uKHtcbiAgICBldmVudDogcGFyYW1zLm9uLFxuICAgIGZpZWxkOiBwYXJhbXMuZmllbGQsXG4gICAgYWJsZUZpZWxkOiBwYXJhbXMuYWJsZUZpZWxkLFxuICAgIG92ZXJyaWRlQWJsZTogcGFyYW1zLm92ZXJyaWRlQWJsZSxcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZWxlc2ZuJDNbcGFyYW1zLm9mZl0gPSBkZWZpbmVTd2l0Y2hGdW5jdGlvbih7XG4gICAgZXZlbnQ6IHBhcmFtcy5vZmYsXG4gICAgZmllbGQ6IHBhcmFtcy5maWVsZCxcbiAgICBhYmxlRmllbGQ6IHBhcmFtcy5hYmxlRmllbGQsXG4gICAgb3ZlcnJpZGVBYmxlOiBwYXJhbXMub3ZlcnJpZGVBYmxlLFxuICAgIHZhbHVlOiBmYWxzZVxuICB9KTtcbn1cbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAnbG9ja2VkJyxcbiAgb3ZlcnJpZGVGaWVsZDogZnVuY3Rpb24gb3ZlcnJpZGVGaWVsZChlbGUpIHtcbiAgICByZXR1cm4gZWxlLmN5KCkuYXV0b2xvY2soKSA/IHRydWUgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIG9uOiAnbG9jaycsXG4gIG9mZjogJ3VubG9jaydcbn0pO1xuZGVmaW5lU3dpdGNoU2V0KHtcbiAgZmllbGQ6ICdncmFiYmFibGUnLFxuICBvdmVycmlkZUZpZWxkOiBmdW5jdGlvbiBvdmVycmlkZUZpZWxkKGVsZSkge1xuICAgIHJldHVybiBlbGUuY3koKS5hdXRvdW5ncmFiaWZ5KCkgfHwgZWxlLnBhbm5hYmxlKCkgPyBmYWxzZSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgb246ICdncmFiaWZ5JyxcbiAgb2ZmOiAndW5ncmFiaWZ5J1xufSk7XG5kZWZpbmVTd2l0Y2hTZXQoe1xuICBmaWVsZDogJ3NlbGVjdGVkJyxcbiAgYWJsZUZpZWxkOiAnc2VsZWN0YWJsZScsXG4gIG92ZXJyaWRlQWJsZTogZnVuY3Rpb24gb3ZlcnJpZGVBYmxlKGVsZSkge1xuICAgIHJldHVybiBlbGUuY3koKS5hdXRvdW5zZWxlY3RpZnkoKSA/IGZhbHNlIDogdW5kZWZpbmVkO1xuICB9LFxuICBvbjogJ3NlbGVjdCcsXG4gIG9mZjogJ3Vuc2VsZWN0J1xufSk7XG5kZWZpbmVTd2l0Y2hTZXQoe1xuICBmaWVsZDogJ3NlbGVjdGFibGUnLFxuICBvdmVycmlkZUZpZWxkOiBmdW5jdGlvbiBvdmVycmlkZUZpZWxkKGVsZSkge1xuICAgIHJldHVybiBlbGUuY3koKS5hdXRvdW5zZWxlY3RpZnkoKSA/IGZhbHNlIDogdW5kZWZpbmVkO1xuICB9LFxuICBvbjogJ3NlbGVjdGlmeScsXG4gIG9mZjogJ3Vuc2VsZWN0aWZ5J1xufSk7XG5lbGVzZm4kMy5kZXNlbGVjdCA9IGVsZXNmbiQzLnVuc2VsZWN0O1xuZWxlc2ZuJDMuZ3JhYmJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIGlmIChlbGUpIHtcbiAgICByZXR1cm4gZWxlLl9wcml2YXRlLmdyYWJiZWQ7XG4gIH1cbn07XG5kZWZpbmVTd2l0Y2hTZXQoe1xuICBmaWVsZDogJ2FjdGl2ZScsXG4gIG9uOiAnYWN0aXZhdGUnLFxuICBvZmY6ICd1bmFjdGl2YXRlJ1xufSk7XG5kZWZpbmVTd2l0Y2hTZXQoe1xuICBmaWVsZDogJ3Bhbm5hYmxlJyxcbiAgb246ICdwYW5pZnknLFxuICBvZmY6ICd1bnBhbmlmeSdcbn0pO1xuZWxlc2ZuJDMuaW5hY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICBpZiAoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuX3ByaXZhdGUuYWN0aXZlO1xuICB9XG59O1xuXG52YXIgZWxlc2ZuJDIgPSB7fTtcblxuLy8gREFHIGZ1bmN0aW9uc1xuLy8vLy8vLy8vLy8vLy8vL1xuXG52YXIgZGVmaW5lRGFnRXh0cmVtaXR5ID0gZnVuY3Rpb24gZGVmaW5lRGFnRXh0cmVtaXR5KHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24gZGFnRXh0cmVtaXR5SW1wbChzZWxlY3Rvcikge1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgcmV0ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgIGlmICghZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGRpc3F1YWxpZmllZCA9IGZhbHNlO1xuICAgICAgdmFyIGVkZ2VzID0gZWxlLmNvbm5lY3RlZEVkZ2VzKCk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVkZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlZGdlID0gZWRnZXNbal07XG4gICAgICAgIHZhciBzcmMgPSBlZGdlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgdGd0ID0gZWRnZS50YXJnZXQoKTtcbiAgICAgICAgaWYgKHBhcmFtcy5ub0luY29taW5nRWRnZXMgJiYgdGd0ID09PSBlbGUgJiYgc3JjICE9PSBlbGUgfHwgcGFyYW1zLm5vT3V0Z29pbmdFZGdlcyAmJiBzcmMgPT09IGVsZSAmJiB0Z3QgIT09IGVsZSkge1xuICAgICAgICAgIGRpc3F1YWxpZmllZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZGlzcXVhbGlmaWVkKSB7XG4gICAgICAgIHJldC5wdXNoKGVsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKHJldCwgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfTtcbn07XG52YXIgZGVmaW5lRGFnT25lSG9wID0gZnVuY3Rpb24gZGVmaW5lRGFnT25lSG9wKHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciBvRWxlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICBpZiAoIWVsZS5pc05vZGUoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBlZGdlcyA9IGVsZS5jb25uZWN0ZWRFZGdlcygpO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlZGdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZWRnZSA9IGVkZ2VzW2pdO1xuICAgICAgICB2YXIgc3JjID0gZWRnZS5zb3VyY2UoKTtcbiAgICAgICAgdmFyIHRndCA9IGVkZ2UudGFyZ2V0KCk7XG4gICAgICAgIGlmIChwYXJhbXMub3V0Z29pbmcgJiYgc3JjID09PSBlbGUpIHtcbiAgICAgICAgICBvRWxlcy5wdXNoKGVkZ2UpO1xuICAgICAgICAgIG9FbGVzLnB1c2godGd0KTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMuaW5jb21pbmcgJiYgdGd0ID09PSBlbGUpIHtcbiAgICAgICAgICBvRWxlcy5wdXNoKGVkZ2UpO1xuICAgICAgICAgIG9FbGVzLnB1c2goc3JjKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bihvRWxlcywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfTtcbn07XG52YXIgZGVmaW5lRGFnQWxsSG9wcyA9IGZ1bmN0aW9uIGRlZmluZURhZ0FsbEhvcHMocGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIHNFbGVzID0gW107XG4gICAgdmFyIHNFbGVzSWRzID0ge307XG4gICAgZm9yICg7Oykge1xuICAgICAgdmFyIG5leHQgPSBwYXJhbXMub3V0Z29pbmcgPyBlbGVzLm91dGdvZXJzKCkgOiBlbGVzLmluY29tZXJzKCk7XG4gICAgICBpZiAobmV4dC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIGRvbmUgaWYgbm9uZSBsZWZ0XG5cbiAgICAgIHZhciBuZXdOZXh0ID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5leHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG4gPSBuZXh0W2ldO1xuICAgICAgICB2YXIgbmlkID0gbi5pZCgpO1xuICAgICAgICBpZiAoIXNFbGVzSWRzW25pZF0pIHtcbiAgICAgICAgICBzRWxlc0lkc1tuaWRdID0gdHJ1ZTtcbiAgICAgICAgICBzRWxlcy5wdXNoKG4pO1xuICAgICAgICAgIG5ld05leHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIW5ld05leHQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIGRvbmUgaWYgdG91Y2hlZCBhbGwgb3V0Z29lcnMgYWxyZWFkeVxuXG4gICAgICBlbGVzID0gbmV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oc0VsZXMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH07XG59O1xuZWxlc2ZuJDIuY2xlYXJUcmF2ZXJzYWxDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpc1tpXS5fcHJpdmF0ZS50cmF2ZXJzYWxDYWNoZSA9IG51bGw7XG4gIH1cbn07XG5leHRlbmQoZWxlc2ZuJDIsIHtcbiAgLy8gZ2V0IHRoZSByb290IG5vZGVzIGluIHRoZSBEQUdcbiAgcm9vdHM6IGRlZmluZURhZ0V4dHJlbWl0eSh7XG4gICAgbm9JbmNvbWluZ0VkZ2VzOiB0cnVlXG4gIH0pLFxuICAvLyBnZXQgdGhlIGxlYWYgbm9kZXMgaW4gdGhlIERBR1xuICBsZWF2ZXM6IGRlZmluZURhZ0V4dHJlbWl0eSh7XG4gICAgbm9PdXRnb2luZ0VkZ2VzOiB0cnVlXG4gIH0pLFxuICAvLyBub3JtYWxseSBjYWxsZWQgY2hpbGRyZW4gaW4gZ3JhcGggdGhlb3J5XG4gIC8vIHRoZXNlIG5vZGVzID1lZGdlcz0+IG91dGdvaW5nIG5vZGVzXG4gIG91dGdvZXJzOiBjYWNoZShkZWZpbmVEYWdPbmVIb3Aoe1xuICAgIG91dGdvaW5nOiB0cnVlXG4gIH0pLCAnb3V0Z29lcnMnKSxcbiAgLy8gYWthIERBRyBkZXNjZW5kYW50c1xuICBzdWNjZXNzb3JzOiBkZWZpbmVEYWdBbGxIb3BzKHtcbiAgICBvdXRnb2luZzogdHJ1ZVxuICB9KSxcbiAgLy8gbm9ybWFsbHkgY2FsbGVkIHBhcmVudHMgaW4gZ3JhcGggdGhlb3J5XG4gIC8vIHRoZXNlIG5vZGVzIDw9ZWRnZXM9IGluY29taW5nIG5vZGVzXG4gIGluY29tZXJzOiBjYWNoZShkZWZpbmVEYWdPbmVIb3Aoe1xuICAgIGluY29taW5nOiB0cnVlXG4gIH0pLCAnaW5jb21lcnMnKSxcbiAgLy8gYWthIERBRyBhbmNlc3RvcnNcbiAgcHJlZGVjZXNzb3JzOiBkZWZpbmVEYWdBbGxIb3BzKHtcbiAgICBpbmNvbWluZzogdHJ1ZVxuICB9KVxufSk7XG5cbi8vIE5laWdoYm91cmhvb2QgZnVuY3Rpb25zXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5leHRlbmQoZWxlc2ZuJDIsIHtcbiAgbmVpZ2hib3Job29kOiBjYWNoZShmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gZm9yIGFsbCBub2Rlc1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIHZhciBjb25uZWN0ZWRFZGdlcyA9IG5vZGUuY29ubmVjdGVkRWRnZXMoKTtcblxuICAgICAgLy8gZm9yIGVhY2ggY29ubmVjdGVkIGVkZ2UsIGFkZCB0aGUgZWRnZSBhbmQgdGhlIG90aGVyIG5vZGVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29ubmVjdGVkRWRnZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBjb25uZWN0ZWRFZGdlc1tqXTtcbiAgICAgICAgdmFyIHNyYyA9IGVkZ2Uuc291cmNlKCk7XG4gICAgICAgIHZhciB0Z3QgPSBlZGdlLnRhcmdldCgpO1xuICAgICAgICB2YXIgb3RoZXJOb2RlID0gbm9kZSA9PT0gc3JjID8gdGd0IDogc3JjO1xuXG4gICAgICAgIC8vIG5lZWQgY2hlY2sgaW4gY2FzZSBvZiBsb29wXG4gICAgICAgIGlmIChvdGhlck5vZGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2gob3RoZXJOb2RlWzBdKTsgLy8gYWRkIG5vZGUgMSBob3AgYXdheVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIGNvbm5lY3RlZCBlZGdlXG4gICAgICAgIGVsZW1lbnRzLnB1c2goZWRnZVswXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKGVsZW1lbnRzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LCAnbmVpZ2hib3Job29kJyksXG4gIGNsb3NlZE5laWdoYm9yaG9vZDogZnVuY3Rpb24gY2xvc2VkTmVpZ2hib3Job29kKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMubmVpZ2hib3Job29kKCkuYWRkKHRoaXMpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sXG4gIG9wZW5OZWlnaGJvcmhvb2Q6IGZ1bmN0aW9uIG9wZW5OZWlnaGJvcmhvb2Qoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5uZWlnaGJvcmhvb2Qoc2VsZWN0b3IpO1xuICB9XG59KTtcblxuLy8gYWxpYXNlc1xuZWxlc2ZuJDIubmVpZ2hib3VyaG9vZCA9IGVsZXNmbiQyLm5laWdoYm9yaG9vZDtcbmVsZXNmbiQyLmNsb3NlZE5laWdoYm91cmhvb2QgPSBlbGVzZm4kMi5jbG9zZWROZWlnaGJvcmhvb2Q7XG5lbGVzZm4kMi5vcGVuTmVpZ2hib3VyaG9vZCA9IGVsZXNmbiQyLm9wZW5OZWlnaGJvcmhvb2Q7XG5cbi8vIEVkZ2UgZnVuY3Rpb25zXG4vLy8vLy8vLy8vLy8vLy8vL1xuXG5leHRlbmQoZWxlc2ZuJDIsIHtcbiAgc291cmNlOiBjYWNoZShmdW5jdGlvbiBzb3VyY2VJbXBsKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIHNyYztcbiAgICBpZiAoZWxlKSB7XG4gICAgICBzcmMgPSBlbGUuX3ByaXZhdGUuc291cmNlIHx8IGVsZS5jeSgpLmNvbGxlY3Rpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIHNyYyAmJiBzZWxlY3RvciA/IHNyYy5maWx0ZXIoc2VsZWN0b3IpIDogc3JjO1xuICB9LCAnc291cmNlJyksXG4gIHRhcmdldDogY2FjaGUoZnVuY3Rpb24gdGFyZ2V0SW1wbChzZWxlY3Rvcikge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciB0Z3Q7XG4gICAgaWYgKGVsZSkge1xuICAgICAgdGd0ID0gZWxlLl9wcml2YXRlLnRhcmdldCB8fCBlbGUuY3koKS5jb2xsZWN0aW9uKCk7XG4gICAgfVxuICAgIHJldHVybiB0Z3QgJiYgc2VsZWN0b3IgPyB0Z3QuZmlsdGVyKHNlbGVjdG9yKSA6IHRndDtcbiAgfSwgJ3RhcmdldCcpLFxuICBzb3VyY2VzOiBkZWZpbmVTb3VyY2VGdW5jdGlvbih7XG4gICAgYXR0cjogJ3NvdXJjZSdcbiAgfSksXG4gIHRhcmdldHM6IGRlZmluZVNvdXJjZUZ1bmN0aW9uKHtcbiAgICBhdHRyOiAndGFyZ2V0J1xuICB9KVxufSk7XG5mdW5jdGlvbiBkZWZpbmVTb3VyY2VGdW5jdGlvbihwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNvdXJjZUltcGwoc2VsZWN0b3IpIHtcbiAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICB2YXIgc3JjID0gZWxlLl9wcml2YXRlW3BhcmFtcy5hdHRyXTtcbiAgICAgIGlmIChzcmMpIHtcbiAgICAgICAgc291cmNlcy5wdXNoKHNyYyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKHNvdXJjZXMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH07XG59XG5leHRlbmQoZWxlc2ZuJDIsIHtcbiAgZWRnZXNXaXRoOiBjYWNoZShkZWZpbmVFZGdlc1dpdGhGdW5jdGlvbigpLCAnZWRnZXNXaXRoJyksXG4gIGVkZ2VzVG86IGNhY2hlKGRlZmluZUVkZ2VzV2l0aEZ1bmN0aW9uKHtcbiAgICB0aGlzSXNTcmM6IHRydWVcbiAgfSksICdlZGdlc1RvJylcbn0pO1xuZnVuY3Rpb24gZGVmaW5lRWRnZXNXaXRoRnVuY3Rpb24ocGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbiBlZGdlc1dpdGhJbXBsKG90aGVyTm9kZXMpIHtcbiAgICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICAgIHZhciBwID0gcGFyYW1zIHx8IHt9O1xuXG4gICAgLy8gZ2V0IGVsZW1lbnRzIGlmIGEgc2VsZWN0b3IgaXMgc3BlY2lmaWVkXG4gICAgaWYgKHN0cmluZyhvdGhlck5vZGVzKSkge1xuICAgICAgb3RoZXJOb2RlcyA9IGN5LiQob3RoZXJOb2Rlcyk7XG4gICAgfVxuICAgIGZvciAodmFyIGggPSAwOyBoIDwgb3RoZXJOb2Rlcy5sZW5ndGg7IGgrKykge1xuICAgICAgdmFyIGVkZ2VzID0gb3RoZXJOb2Rlc1toXS5fcHJpdmF0ZS5lZGdlcztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcbiAgICAgICAgdmFyIGVkZ2VEYXRhID0gZWRnZS5fcHJpdmF0ZS5kYXRhO1xuICAgICAgICB2YXIgdGhpc1RvT3RoZXIgPSB0aGlzLmhhc0VsZW1lbnRXaXRoSWQoZWRnZURhdGEuc291cmNlKSAmJiBvdGhlck5vZGVzLmhhc0VsZW1lbnRXaXRoSWQoZWRnZURhdGEudGFyZ2V0KTtcbiAgICAgICAgdmFyIG90aGVyVG9UaGlzID0gb3RoZXJOb2Rlcy5oYXNFbGVtZW50V2l0aElkKGVkZ2VEYXRhLnNvdXJjZSkgJiYgdGhpcy5oYXNFbGVtZW50V2l0aElkKGVkZ2VEYXRhLnRhcmdldCk7XG4gICAgICAgIHZhciBlZGdlQ29ubmVjdHNUaGlzQW5kT3RoZXIgPSB0aGlzVG9PdGhlciB8fCBvdGhlclRvVGhpcztcbiAgICAgICAgaWYgKCFlZGdlQ29ubmVjdHNUaGlzQW5kT3RoZXIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocC50aGlzSXNTcmMgfHwgcC50aGlzSXNUZ3QpIHtcbiAgICAgICAgICBpZiAocC50aGlzSXNTcmMgJiYgIXRoaXNUb090aGVyKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHAudGhpc0lzVGd0ICYmICFvdGhlclRvVGhpcykge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzLnB1c2goZWRnZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKGVsZW1lbnRzLCB0cnVlKTtcbiAgfTtcbn1cbmV4dGVuZChlbGVzZm4kMiwge1xuICBjb25uZWN0ZWRFZGdlczogY2FjaGUoZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgdmFyIHJldEVsZXMgPSBbXTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IGVsZXNbaV07XG4gICAgICBpZiAoIW5vZGUuaXNOb2RlKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgZWRnZXMgPSBub2RlLl9wcml2YXRlLmVkZ2VzO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlZGdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZWRnZSA9IGVkZ2VzW2pdO1xuICAgICAgICByZXRFbGVzLnB1c2goZWRnZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKHJldEVsZXMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sICdjb25uZWN0ZWRFZGdlcycpLFxuICBjb25uZWN0ZWROb2RlczogY2FjaGUoZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgdmFyIHJldEVsZXMgPSBbXTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWRnZSA9IGVsZXNbaV07XG4gICAgICBpZiAoIWVkZ2UuaXNFZGdlKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXRFbGVzLnB1c2goZWRnZS5zb3VyY2UoKVswXSk7XG4gICAgICByZXRFbGVzLnB1c2goZWRnZS50YXJnZXQoKVswXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKHJldEVsZXMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sICdjb25uZWN0ZWROb2RlcycpLFxuICBwYXJhbGxlbEVkZ2VzOiBjYWNoZShkZWZpbmVQYXJhbGxlbEVkZ2VzRnVuY3Rpb24oKSwgJ3BhcmFsbGVsRWRnZXMnKSxcbiAgY29kaXJlY3RlZEVkZ2VzOiBjYWNoZShkZWZpbmVQYXJhbGxlbEVkZ2VzRnVuY3Rpb24oe1xuICAgIGNvZGlyZWN0ZWQ6IHRydWVcbiAgfSksICdjb2RpcmVjdGVkRWRnZXMnKVxufSk7XG5mdW5jdGlvbiBkZWZpbmVQYXJhbGxlbEVkZ2VzRnVuY3Rpb24ocGFyYW1zKSB7XG4gIHZhciBkZWZhdWx0cyA9IHtcbiAgICBjb2RpcmVjdGVkOiBmYWxzZVxuICB9O1xuICBwYXJhbXMgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBwYXJhbXMpO1xuICByZXR1cm4gZnVuY3Rpb24gcGFyYWxsZWxFZGdlc0ltcGwoc2VsZWN0b3IpIHtcbiAgICAvLyBtaWNyby1vcHRpbWlzZWQgZm9yIHJlbmRlcmVyXG4gICAgdmFyIGVsZW1lbnRzID0gW107XG4gICAgdmFyIGVkZ2VzID0gdGhpcy5lZGdlcygpO1xuICAgIHZhciBwID0gcGFyYW1zO1xuXG4gICAgLy8gbG9vayBhdCBhbGwgdGhlIGVkZ2VzIGluIHRoZSBjb2xsZWN0aW9uXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVkZ2UxID0gZWRnZXNbaV07XG4gICAgICB2YXIgZWRnZTFfcCA9IGVkZ2UxLl9wcml2YXRlO1xuICAgICAgdmFyIHNyYzEgPSBlZGdlMV9wLnNvdXJjZTtcbiAgICAgIHZhciBzcmNpZDEgPSBzcmMxLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgICB2YXIgdGd0aWQxID0gZWRnZTFfcC5kYXRhLnRhcmdldDtcbiAgICAgIHZhciBzcmNFZGdlczEgPSBzcmMxLl9wcml2YXRlLmVkZ2VzO1xuXG4gICAgICAvLyBsb29rIGF0IGVkZ2VzIGNvbm5lY3RlZCB0byB0aGUgc3JjIG5vZGUgb2YgdGhpcyBlZGdlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNyY0VkZ2VzMS5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZWRnZTIgPSBzcmNFZGdlczFbal07XG4gICAgICAgIHZhciBlZGdlMmRhdGEgPSBlZGdlMi5fcHJpdmF0ZS5kYXRhO1xuICAgICAgICB2YXIgdGd0aWQyID0gZWRnZTJkYXRhLnRhcmdldDtcbiAgICAgICAgdmFyIHNyY2lkMiA9IGVkZ2UyZGF0YS5zb3VyY2U7XG4gICAgICAgIHZhciBjb2RpcmVjdGVkID0gdGd0aWQyID09PSB0Z3RpZDEgJiYgc3JjaWQyID09PSBzcmNpZDE7XG4gICAgICAgIHZhciBvcHBkaXJlY3RlZCA9IHNyY2lkMSA9PT0gdGd0aWQyICYmIHRndGlkMSA9PT0gc3JjaWQyO1xuICAgICAgICBpZiAocC5jb2RpcmVjdGVkICYmIGNvZGlyZWN0ZWQgfHwgIXAuY29kaXJlY3RlZCAmJiAoY29kaXJlY3RlZCB8fCBvcHBkaXJlY3RlZCkpIHtcbiAgICAgICAgICBlbGVtZW50cy5wdXNoKGVkZ2UyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bihlbGVtZW50cywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuLy8gTWlzYyBmdW5jdGlvbnNcbi8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4dGVuZChlbGVzZm4kMiwge1xuICBjb21wb25lbnRzOiBmdW5jdGlvbiBjb21wb25lbnRzKHJvb3QpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGN5ID0gc2VsZi5jeSgpO1xuICAgIHZhciB2aXNpdGVkID0gY3kuY29sbGVjdGlvbigpO1xuICAgIHZhciB1bnZpc2l0ZWQgPSByb290ID09IG51bGwgPyBzZWxmLm5vZGVzKCkgOiByb290Lm5vZGVzKCk7XG4gICAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgICBpZiAocm9vdCAhPSBudWxsICYmIHVudmlzaXRlZC5lbXB0eSgpKSB7XG4gICAgICAvLyByb290IG1heSBjb250YWluIG9ubHkgZWRnZXNcbiAgICAgIHVudmlzaXRlZCA9IHJvb3Quc291cmNlcygpOyAvLyBkb2Vzbid0IG1hdHRlciB3aGljaCBub2RlIHRvIHVzZSAodW5kaXJlY3RlZCksIHNvIGp1c3QgdXNlIHRoZSBzb3VyY2Ugc2lkZXNcbiAgICB9XG5cbiAgICB2YXIgdmlzaXRJbkNvbXBvbmVudCA9IGZ1bmN0aW9uIHZpc2l0SW5Db21wb25lbnQobm9kZSwgY29tcG9uZW50KSB7XG4gICAgICB2aXNpdGVkLm1lcmdlKG5vZGUpO1xuICAgICAgdW52aXNpdGVkLnVubWVyZ2Uobm9kZSk7XG4gICAgICBjb21wb25lbnQubWVyZ2Uobm9kZSk7XG4gICAgfTtcbiAgICBpZiAodW52aXNpdGVkLmVtcHR5KCkpIHtcbiAgICAgIHJldHVybiBzZWxmLnNwYXduKCk7XG4gICAgfVxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgICAgLy8gZWFjaCBpdGVyYXRpb24geWllbGRzIGEgY29tcG9uZW50XG4gICAgICB2YXIgY21wdCA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgIGNvbXBvbmVudHMucHVzaChjbXB0KTtcbiAgICAgIHZhciByb290ID0gdW52aXNpdGVkWzBdO1xuICAgICAgdmlzaXRJbkNvbXBvbmVudChyb290LCBjbXB0KTtcbiAgICAgIHNlbGYuYmZzKHtcbiAgICAgICAgZGlyZWN0ZWQ6IGZhbHNlLFxuICAgICAgICByb290czogcm9vdCxcbiAgICAgICAgdmlzaXQ6IGZ1bmN0aW9uIHZpc2l0KHYpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRJbkNvbXBvbmVudCh2LCBjbXB0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjbXB0LmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgbm9kZS5jb25uZWN0ZWRFZGdlcygpLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAvLyBjb25uZWN0ZWRFZGdlcygpIHVzdWFsbHkgY2FjaGVkXG4gICAgICAgICAgaWYgKHNlbGYuaGFzKGUpICYmIGNtcHQuaGFzKGUuc291cmNlKCkpICYmIGNtcHQuaGFzKGUudGFyZ2V0KCkpKSB7XG4gICAgICAgICAgICAvLyBoYXMoKSBpcyBjaGVhcFxuICAgICAgICAgICAgY21wdC5tZXJnZShlKTsgLy8gZm9yRWFjaCgpIG9ubHkgY29uc2lkZXJzIG5vZGVzIC0tIHNldHMgTiBhdCBjYWxsIHRpbWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBkbyB7XG4gICAgICBfbG9vcCgpO1xuICAgIH0gd2hpbGUgKHVudmlzaXRlZC5sZW5ndGggPiAwKTtcbiAgICByZXR1cm4gY29tcG9uZW50cztcbiAgfSxcbiAgY29tcG9uZW50OiBmdW5jdGlvbiBjb21wb25lbnQoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgcmV0dXJuIGVsZS5jeSgpLm11dGFibGVFbGVtZW50cygpLmNvbXBvbmVudHMoZWxlKVswXTtcbiAgfVxufSk7XG5lbGVzZm4kMi5jb21wb25lbnRzT2YgPSBlbGVzZm4kMi5jb21wb25lbnRzO1xuXG4vLyByZXByZXNlbnRzIGEgc2V0IG9mIG5vZGVzLCBlZGdlcywgb3IgYm90aCB0b2dldGhlclxudmFyIENvbGxlY3Rpb24gPSBmdW5jdGlvbiBDb2xsZWN0aW9uKGN5LCBlbGVtZW50cykge1xuICB2YXIgdW5pcXVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgdmFyIHJlbW92ZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuICBpZiAoY3kgPT09IHVuZGVmaW5lZCkge1xuICAgIGVycm9yKCdBIGNvbGxlY3Rpb24gbXVzdCBoYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBjb3JlJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXAgPSBuZXcgTWFwJDIoKTtcbiAgdmFyIGNyZWF0ZWRFbGVtZW50cyA9IGZhbHNlO1xuICBpZiAoIWVsZW1lbnRzKSB7XG4gICAgZWxlbWVudHMgPSBbXTtcbiAgfSBlbHNlIGlmIChlbGVtZW50cy5sZW5ndGggPiAwICYmIHBsYWluT2JqZWN0KGVsZW1lbnRzWzBdKSAmJiAhZWxlbWVudChlbGVtZW50c1swXSkpIHtcbiAgICBjcmVhdGVkRWxlbWVudHMgPSB0cnVlO1xuXG4gICAgLy8gbWFrZSBlbGVtZW50cyBmcm9tIGpzb24gYW5kIHJlc3RvcmUgYWxsIGF0IG9uY2UgbGF0ZXJcbiAgICB2YXIgZWxlcyA9IFtdO1xuICAgIHZhciBlbGVzSWRzID0gbmV3IFNldCQxKCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBqc29uID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoanNvbi5kYXRhID09IG51bGwpIHtcbiAgICAgICAganNvbi5kYXRhID0ge307XG4gICAgICB9XG4gICAgICB2YXIgX2RhdGEgPSBqc29uLmRhdGE7XG5cbiAgICAgIC8vIG1ha2Ugc3VyZSBuZXdseSBjcmVhdGVkIGVsZW1lbnRzIGhhdmUgdmFsaWQgaWRzXG4gICAgICBpZiAoX2RhdGEuaWQgPT0gbnVsbCkge1xuICAgICAgICBfZGF0YS5pZCA9IHV1aWQoKTtcbiAgICAgIH0gZWxzZSBpZiAoY3kuaGFzRWxlbWVudFdpdGhJZChfZGF0YS5pZCkgfHwgZWxlc0lkcy5oYXMoX2RhdGEuaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBjYW4ndCBjcmVhdGUgZWxlbWVudCBpZiBwcmlvciBpZCBhbHJlYWR5IGV4aXN0c1xuICAgICAgfVxuXG4gICAgICB2YXIgZWxlID0gbmV3IEVsZW1lbnQoY3ksIGpzb24sIGZhbHNlKTtcbiAgICAgIGVsZXMucHVzaChlbGUpO1xuICAgICAgZWxlc0lkcy5hZGQoX2RhdGEuaWQpO1xuICAgIH1cbiAgICBlbGVtZW50cyA9IGVsZXM7XG4gIH1cbiAgdGhpcy5sZW5ndGggPSAwO1xuICBmb3IgKHZhciBfaSA9IDAsIF9sID0gZWxlbWVudHMubGVuZ3RoOyBfaSA8IF9sOyBfaSsrKSB7XG4gICAgdmFyIGVsZW1lbnQkMSA9IGVsZW1lbnRzW19pXVswXTsgLy8gWzBdIGluIGNhc2UgZWxlbWVudHMgaXMgYW4gYXJyYXkgb2YgY29sbGVjdGlvbnMsIHJhdGhlciB0aGFuIGFycmF5IG9mIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnQkMSA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGlkID0gZWxlbWVudCQxLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgaWYgKCF1bmlxdWUgfHwgIW1hcC5oYXMoaWQpKSB7XG4gICAgICBpZiAodW5pcXVlKSB7XG4gICAgICAgIG1hcC5zZXQoaWQsIHtcbiAgICAgICAgICBpbmRleDogdGhpcy5sZW5ndGgsXG4gICAgICAgICAgZWxlOiBlbGVtZW50JDFcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzW3RoaXMubGVuZ3RoXSA9IGVsZW1lbnQkMTtcbiAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgfVxuICB9XG4gIHRoaXMuX3ByaXZhdGUgPSB7XG4gICAgZWxlczogdGhpcyxcbiAgICBjeTogY3ksXG4gICAgZ2V0IG1hcCgpIHtcbiAgICAgIGlmICh0aGlzLmxhenlNYXAgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlYnVpbGRNYXAoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmxhenlNYXA7XG4gICAgfSxcbiAgICBzZXQgbWFwKG0pIHtcbiAgICAgIHRoaXMubGF6eU1hcCA9IG07XG4gICAgfSxcbiAgICByZWJ1aWxkTWFwOiBmdW5jdGlvbiByZWJ1aWxkTWFwKCkge1xuICAgICAgdmFyIG0gPSB0aGlzLmxhenlNYXAgPSBuZXcgTWFwJDIoKTtcbiAgICAgIHZhciBlbGVzID0gdGhpcy5lbGVzO1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgZWxlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIHZhciBfZWxlID0gZWxlc1tfaTJdO1xuICAgICAgICBtLnNldChfZWxlLmlkKCksIHtcbiAgICAgICAgICBpbmRleDogX2kyLFxuICAgICAgICAgIGVsZTogX2VsZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGlmICh1bmlxdWUpIHtcbiAgICB0aGlzLl9wcml2YXRlLm1hcCA9IG1hcDtcbiAgfVxuXG4gIC8vIHJlc3RvcmUgdGhlIGVsZW1lbnRzIGlmIHdlIGNyZWF0ZWQgdGhlbSBmcm9tIGpzb25cbiAgaWYgKGNyZWF0ZWRFbGVtZW50cyAmJiAhcmVtb3ZlZCkge1xuICAgIHRoaXMucmVzdG9yZSgpO1xuICB9XG59O1xuXG4vLyBGdW5jdGlvbnNcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLy8ga2VlcCB0aGUgcHJvdG90eXBlcyBpbiBzeW5jIChhbiBlbGVtZW50IGhhcyB0aGUgc2FtZSBmdW5jdGlvbnMgYXMgYSBjb2xsZWN0aW9uKVxuLy8gYW5kIHVzZSBlbGVmbiBhbmQgZWxlc2ZuIGFzIHNob3J0aGFuZHMgdG8gdGhlIHByb3RvdHlwZXNcbnZhciBlbGVzZm4kMSA9IEVsZW1lbnQucHJvdG90eXBlID0gQ29sbGVjdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFycmF5LnByb3RvdHlwZSk7XG5lbGVzZm4kMS5pbnN0YW5jZVN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdjb2xsZWN0aW9uJztcbn07XG5lbGVzZm4kMS5zcGF3biA9IGZ1bmN0aW9uIChlbGVzLCB1bmlxdWUpIHtcbiAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKHRoaXMuY3koKSwgZWxlcywgdW5pcXVlKTtcbn07XG5lbGVzZm4kMS5zcGF3blNlbGYgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnNwYXduKHRoaXMpO1xufTtcbmVsZXNmbiQxLmN5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5jeTtcbn07XG5lbGVzZm4kMS5yZW5kZXJlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuY3kucmVuZGVyZXIoKTtcbn07XG5lbGVzZm4kMS5lbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpc1swXTtcbn07XG5lbGVzZm4kMS5jb2xsZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICBpZiAoY29sbGVjdGlvbih0aGlzKSkge1xuICAgIHJldHVybiB0aGlzO1xuICB9IGVsc2Uge1xuICAgIC8vIGFuIGVsZW1lbnRcbiAgICByZXR1cm4gbmV3IENvbGxlY3Rpb24odGhpcy5fcHJpdmF0ZS5jeSwgW3RoaXNdKTtcbiAgfVxufTtcbmVsZXNmbiQxLnVuaXF1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKHRoaXMuX3ByaXZhdGUuY3ksIHRoaXMsIHRydWUpO1xufTtcbmVsZXNmbiQxLmhhc0VsZW1lbnRXaXRoSWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgaWQgPSAnJyArIGlkOyAvLyBpZCBtdXN0IGJlIHN0cmluZ1xuXG4gIHJldHVybiB0aGlzLl9wcml2YXRlLm1hcC5oYXMoaWQpO1xufTtcbmVsZXNmbiQxLmdldEVsZW1lbnRCeUlkID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlkID0gJycgKyBpZDsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcblxuICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICB2YXIgZW50cnkgPSB0aGlzLl9wcml2YXRlLm1hcC5nZXQoaWQpO1xuICByZXR1cm4gZW50cnkgPyBlbnRyeS5lbGUgOiBuZXcgQ29sbGVjdGlvbihjeSk7IC8vIGdldCBlbGUgb3IgZW1wdHkgY29sbGVjdGlvblxufTtcblxuZWxlc2ZuJDEuJGlkID0gZWxlc2ZuJDEuZ2V0RWxlbWVudEJ5SWQ7XG5lbGVzZm4kMS5wb29sSW5kZXggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gIHZhciBlbGVzID0gY3kuX3ByaXZhdGUuZWxlbWVudHM7XG4gIHZhciBpZCA9IHRoaXNbMF0uX3ByaXZhdGUuZGF0YS5pZDtcbiAgcmV0dXJuIGVsZXMuX3ByaXZhdGUubWFwLmdldChpZCkuaW5kZXg7XG59O1xuZWxlc2ZuJDEuaW5kZXhPZiA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdmFyIGlkID0gZWxlWzBdLl9wcml2YXRlLmRhdGEuaWQ7XG4gIHJldHVybiB0aGlzLl9wcml2YXRlLm1hcC5nZXQoaWQpLmluZGV4O1xufTtcbmVsZXNmbiQxLmluZGV4T2ZJZCA9IGZ1bmN0aW9uIChpZCkge1xuICBpZCA9ICcnICsgaWQ7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG5cbiAgcmV0dXJuIHRoaXMuX3ByaXZhdGUubWFwLmdldChpZCkuaW5kZXg7XG59O1xuZWxlc2ZuJDEuanNvbiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGVsZSA9IHRoaXMuZWxlbWVudCgpO1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIGlmIChlbGUgPT0gbnVsbCAmJiBvYmopIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSAvLyBjYW4ndCBzZXQgdG8gbm8gZWxlc1xuXG4gIGlmIChlbGUgPT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gLy8gY2FuJ3QgZ2V0IGZyb20gbm8gZWxlc1xuXG4gIHZhciBwID0gZWxlLl9wcml2YXRlO1xuICBpZiAocGxhaW5PYmplY3Qob2JqKSkge1xuICAgIC8vIHNldFxuXG4gICAgY3kuc3RhcnRCYXRjaCgpO1xuICAgIGlmIChvYmouZGF0YSkge1xuICAgICAgZWxlLmRhdGEob2JqLmRhdGEpO1xuICAgICAgdmFyIF9kYXRhMiA9IHAuZGF0YTtcbiAgICAgIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICAgICAgLy8gc291cmNlIGFuZCB0YXJnZXQgYXJlIGltbXV0YWJsZSB2aWEgZGF0YSgpXG4gICAgICAgIHZhciBtb3ZlID0gZmFsc2U7XG4gICAgICAgIHZhciBzcGVjID0ge307XG4gICAgICAgIHZhciBzcmMgPSBvYmouZGF0YS5zb3VyY2U7XG4gICAgICAgIHZhciB0Z3QgPSBvYmouZGF0YS50YXJnZXQ7XG4gICAgICAgIGlmIChzcmMgIT0gbnVsbCAmJiBzcmMgIT0gX2RhdGEyLnNvdXJjZSkge1xuICAgICAgICAgIHNwZWMuc291cmNlID0gJycgKyBzcmM7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG4gICAgICAgICAgbW92ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRndCAhPSBudWxsICYmIHRndCAhPSBfZGF0YTIudGFyZ2V0KSB7XG4gICAgICAgICAgc3BlYy50YXJnZXQgPSAnJyArIHRndDsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcbiAgICAgICAgICBtb3ZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW92ZSkge1xuICAgICAgICAgIGVsZSA9IGVsZS5tb3ZlKHNwZWMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBwYXJlbnQgaXMgaW1tdXRhYmxlIHZpYSBkYXRhKClcbiAgICAgICAgdmFyIG5ld1BhcmVudFZhbFNwZWNkID0gKCdwYXJlbnQnIGluIG9iai5kYXRhKTtcbiAgICAgICAgdmFyIHBhcmVudCA9IG9iai5kYXRhLnBhcmVudDtcbiAgICAgICAgaWYgKG5ld1BhcmVudFZhbFNwZWNkICYmIChwYXJlbnQgIT0gbnVsbCB8fCBfZGF0YTIucGFyZW50ICE9IG51bGwpICYmIHBhcmVudCAhPSBfZGF0YTIucGFyZW50KSB7XG4gICAgICAgICAgaWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBjYW4ndCBzZXQgdW5kZWZpbmVkIGltcGVyYXRpdmVseSwgc28gdXNlIG51bGxcbiAgICAgICAgICAgIHBhcmVudCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcGFyZW50ID0gJycgKyBwYXJlbnQ7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZWxlID0gZWxlLm1vdmUoe1xuICAgICAgICAgICAgcGFyZW50OiBwYXJlbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAob2JqLnBvc2l0aW9uKSB7XG4gICAgICBlbGUucG9zaXRpb24ob2JqLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBpZ25vcmUgZ3JvdXAgLS0gaW1tdXRhYmxlXG5cbiAgICB2YXIgY2hlY2tTd2l0Y2ggPSBmdW5jdGlvbiBjaGVja1N3aXRjaChrLCB0cnVlRm5OYW1lLCBmYWxzZUZuTmFtZSkge1xuICAgICAgdmFyIG9ial9rID0gb2JqW2tdO1xuICAgICAgaWYgKG9ial9rICE9IG51bGwgJiYgb2JqX2sgIT09IHBba10pIHtcbiAgICAgICAgaWYgKG9ial9rKSB7XG4gICAgICAgICAgZWxlW3RydWVGbk5hbWVdKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlW2ZhbHNlRm5OYW1lXSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBjaGVja1N3aXRjaCgncmVtb3ZlZCcsICdyZW1vdmUnLCAncmVzdG9yZScpO1xuICAgIGNoZWNrU3dpdGNoKCdzZWxlY3RlZCcsICdzZWxlY3QnLCAndW5zZWxlY3QnKTtcbiAgICBjaGVja1N3aXRjaCgnc2VsZWN0YWJsZScsICdzZWxlY3RpZnknLCAndW5zZWxlY3RpZnknKTtcbiAgICBjaGVja1N3aXRjaCgnbG9ja2VkJywgJ2xvY2snLCAndW5sb2NrJyk7XG4gICAgY2hlY2tTd2l0Y2goJ2dyYWJiYWJsZScsICdncmFiaWZ5JywgJ3VuZ3JhYmlmeScpO1xuICAgIGNoZWNrU3dpdGNoKCdwYW5uYWJsZScsICdwYW5pZnknLCAndW5wYW5pZnknKTtcbiAgICBpZiAob2JqLmNsYXNzZXMgIT0gbnVsbCkge1xuICAgICAgZWxlLmNsYXNzZXMob2JqLmNsYXNzZXMpO1xuICAgIH1cbiAgICBjeS5lbmRCYXRjaCgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9IGVsc2UgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gZ2V0XG5cbiAgICB2YXIganNvbiA9IHtcbiAgICAgIGRhdGE6IGNvcHkocC5kYXRhKSxcbiAgICAgIHBvc2l0aW9uOiBjb3B5KHAucG9zaXRpb24pLFxuICAgICAgZ3JvdXA6IHAuZ3JvdXAsXG4gICAgICByZW1vdmVkOiBwLnJlbW92ZWQsXG4gICAgICBzZWxlY3RlZDogcC5zZWxlY3RlZCxcbiAgICAgIHNlbGVjdGFibGU6IHAuc2VsZWN0YWJsZSxcbiAgICAgIGxvY2tlZDogcC5sb2NrZWQsXG4gICAgICBncmFiYmFibGU6IHAuZ3JhYmJhYmxlLFxuICAgICAgcGFubmFibGU6IHAucGFubmFibGUsXG4gICAgICBjbGFzc2VzOiBudWxsXG4gICAgfTtcbiAgICBqc29uLmNsYXNzZXMgPSAnJztcbiAgICB2YXIgaSA9IDA7XG4gICAgcC5jbGFzc2VzLmZvckVhY2goZnVuY3Rpb24gKGNscykge1xuICAgICAgcmV0dXJuIGpzb24uY2xhc3NlcyArPSBpKysgPT09IDAgPyBjbHMgOiAnICcgKyBjbHM7XG4gICAgfSk7XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbn07XG5lbGVzZm4kMS5qc29ucyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGpzb25zID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgIHZhciBqc29uID0gZWxlLmpzb24oKTtcbiAgICBqc29ucy5wdXNoKGpzb24pO1xuICB9XG4gIHJldHVybiBqc29ucztcbn07XG5lbGVzZm4kMS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgZWxlc0FyciA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICB2YXIganNvbiA9IGVsZS5qc29uKCk7XG4gICAgdmFyIGNsb25lID0gbmV3IEVsZW1lbnQoY3ksIGpzb24sIGZhbHNlKTsgLy8gTkIgbm8gcmVzdG9yZVxuXG4gICAgZWxlc0Fyci5wdXNoKGNsb25lKTtcbiAgfVxuICByZXR1cm4gbmV3IENvbGxlY3Rpb24oY3ksIGVsZXNBcnIpO1xufTtcbmVsZXNmbiQxLmNvcHkgPSBlbGVzZm4kMS5jbG9uZTtcbmVsZXNmbiQxLnJlc3RvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBub3RpZnlSZW5kZXJlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcbiAgdmFyIGFkZFRvUG9vbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY3kgPSBzZWxmLmN5KCk7XG4gIHZhciBjeV9wID0gY3kuX3ByaXZhdGU7XG5cbiAgLy8gY3JlYXRlIGFycmF5cyBvZiBub2RlcyBhbmQgZWRnZXMsIHNpbmNlIHdlIG5lZWQgdG9cbiAgLy8gcmVzdG9yZSB0aGUgbm9kZXMgZmlyc3RcbiAgdmFyIG5vZGVzID0gW107XG4gIHZhciBlZGdlcyA9IFtdO1xuICB2YXIgZWxlbWVudHM7XG4gIGZvciAodmFyIF9pMyA9IDAsIGwgPSBzZWxmLmxlbmd0aDsgX2kzIDwgbDsgX2kzKyspIHtcbiAgICB2YXIgZWxlID0gc2VsZltfaTNdO1xuICAgIGlmIChhZGRUb1Bvb2wgJiYgIWVsZS5yZW1vdmVkKCkpIHtcbiAgICAgIC8vIGRvbid0IG5lZWQgdG8gaGFuZGxlIHRoaXMgZWxlXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBrZWVwIG5vZGVzIGZpcnN0IGluIHRoZSBhcnJheSBhbmQgZWRnZXMgYWZ0ZXJcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAvLyBwdXQgdG8gZnJvbnQgb2YgYXJyYXkgaWYgbm9kZVxuICAgICAgbm9kZXMucHVzaChlbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBwdXQgdG8gZW5kIG9mIGFycmF5IGlmIGVkZ2VcbiAgICAgIGVkZ2VzLnB1c2goZWxlKTtcbiAgICB9XG4gIH1cbiAgZWxlbWVudHMgPSBub2Rlcy5jb25jYXQoZWRnZXMpO1xuICB2YXIgaTtcbiAgdmFyIHJlbW92ZUZyb21FbGVtZW50cyA9IGZ1bmN0aW9uIHJlbW92ZUZyb21FbGVtZW50cygpIHtcbiAgICBlbGVtZW50cy5zcGxpY2UoaSwgMSk7XG4gICAgaS0tO1xuICB9O1xuXG4gIC8vIG5vdywgcmVzdG9yZSBlYWNoIGVsZW1lbnRcbiAgZm9yIChpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9lbGUyID0gZWxlbWVudHNbaV07XG4gICAgdmFyIF9wcml2YXRlID0gX2VsZTIuX3ByaXZhdGU7XG4gICAgdmFyIF9kYXRhMyA9IF9wcml2YXRlLmRhdGE7XG5cbiAgICAvLyB0aGUgdHJhdmVyc2FsIGNhY2hlIHNob3VsZCBzdGFydCBmcmVzaCB3aGVuIGVsZSBpcyBhZGRlZFxuICAgIF9lbGUyLmNsZWFyVHJhdmVyc2FsQ2FjaGUoKTtcblxuICAgIC8vIHNldCBpZCBhbmQgdmFsaWRhdGVcbiAgICBpZiAoIWFkZFRvUG9vbCAmJiAhX3ByaXZhdGUucmVtb3ZlZCkgOyBlbHNlIGlmIChfZGF0YTMuaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgX2RhdGEzLmlkID0gdXVpZCgpO1xuICAgIH0gZWxzZSBpZiAobnVtYmVyJDEoX2RhdGEzLmlkKSkge1xuICAgICAgX2RhdGEzLmlkID0gJycgKyBfZGF0YTMuaWQ7IC8vIG5vdyBpdCdzIGEgc3RyaW5nXG4gICAgfSBlbHNlIGlmIChlbXB0eVN0cmluZyhfZGF0YTMuaWQpIHx8ICFzdHJpbmcoX2RhdGEzLmlkKSkge1xuICAgICAgZXJyb3IoJ0NhbiBub3QgY3JlYXRlIGVsZW1lbnQgd2l0aCBpbnZhbGlkIHN0cmluZyBJRCBgJyArIF9kYXRhMy5pZCArICdgJyk7XG5cbiAgICAgIC8vIGNhbid0IGNyZWF0ZSBlbGVtZW50IGlmIGl0IGhhcyBlbXB0eSBzdHJpbmcgYXMgaWQgb3Igbm9uLXN0cmluZyBpZFxuICAgICAgcmVtb3ZlRnJvbUVsZW1lbnRzKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKGN5Lmhhc0VsZW1lbnRXaXRoSWQoX2RhdGEzLmlkKSkge1xuICAgICAgZXJyb3IoJ0NhbiBub3QgY3JlYXRlIHNlY29uZCBlbGVtZW50IHdpdGggSUQgYCcgKyBfZGF0YTMuaWQgKyAnYCcpO1xuXG4gICAgICAvLyBjYW4ndCBjcmVhdGUgZWxlbWVudCBpZiBvbmUgYWxyZWFkeSBoYXMgdGhhdCBpZFxuICAgICAgcmVtb3ZlRnJvbUVsZW1lbnRzKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGlkID0gX2RhdGEzLmlkOyAvLyBpZCBpcyBmaW5hbGlzZWQsIG5vdyBsZXQncyBrZWVwIGEgcmVmXG5cbiAgICBpZiAoX2VsZTIuaXNOb2RlKCkpIHtcbiAgICAgIC8vIGV4dHJhIGNoZWNrcyBmb3Igbm9kZXNcbiAgICAgIHZhciBwb3MgPSBfcHJpdmF0ZS5wb3NpdGlvbjtcblxuICAgICAgLy8gbWFrZSBzdXJlIHRoZSBub2RlcyBoYXZlIGEgZGVmaW5lZCBwb3NpdGlvblxuXG4gICAgICBpZiAocG9zLnggPT0gbnVsbCkge1xuICAgICAgICBwb3MueCA9IDA7XG4gICAgICB9XG4gICAgICBpZiAocG9zLnkgPT0gbnVsbCkge1xuICAgICAgICBwb3MueSA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChfZWxlMi5pc0VkZ2UoKSkge1xuICAgICAgLy8gZXh0cmEgY2hlY2tzIGZvciBlZGdlc1xuXG4gICAgICB2YXIgZWRnZSA9IF9lbGUyO1xuICAgICAgdmFyIGZpZWxkcyA9IFsnc291cmNlJywgJ3RhcmdldCddO1xuICAgICAgdmFyIGZpZWxkc0xlbmd0aCA9IGZpZWxkcy5sZW5ndGg7XG4gICAgICB2YXIgYmFkU291cmNlT3JUYXJnZXQgPSBmYWxzZTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZmllbGRzTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2pdO1xuICAgICAgICB2YXIgdmFsID0gX2RhdGEzW2ZpZWxkXTtcbiAgICAgICAgaWYgKG51bWJlciQxKHZhbCkpIHtcbiAgICAgICAgICB2YWwgPSBfZGF0YTNbZmllbGRdID0gJycgKyBfZGF0YTNbZmllbGRdOyAvLyBub3cgc3RyaW5nXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09PSAnJykge1xuICAgICAgICAgIC8vIGNhbid0IGNyZWF0ZSBpZiBzb3VyY2Ugb3IgdGFyZ2V0IGlzIG5vdCBkZWZpbmVkIHByb3Blcmx5XG4gICAgICAgICAgZXJyb3IoJ0NhbiBub3QgY3JlYXRlIGVkZ2UgYCcgKyBpZCArICdgIHdpdGggdW5zcGVjaWZpZWQgJyArIGZpZWxkKTtcbiAgICAgICAgICBiYWRTb3VyY2VPclRhcmdldCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIWN5Lmhhc0VsZW1lbnRXaXRoSWQodmFsKSkge1xuICAgICAgICAgIC8vIGNhbid0IGNyZWF0ZSBlZGdlIGlmIG9uZSBvZiBpdHMgbm9kZXMgZG9lc24ndCBleGlzdFxuICAgICAgICAgIGVycm9yKCdDYW4gbm90IGNyZWF0ZSBlZGdlIGAnICsgaWQgKyAnYCB3aXRoIG5vbmV4aXN0YW50ICcgKyBmaWVsZCArICcgYCcgKyB2YWwgKyAnYCcpO1xuICAgICAgICAgIGJhZFNvdXJjZU9yVGFyZ2V0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGJhZFNvdXJjZU9yVGFyZ2V0KSB7XG4gICAgICAgIHJlbW92ZUZyb21FbGVtZW50cygpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gY2FuJ3QgY3JlYXRlIHRoaXNcblxuICAgICAgdmFyIHNyYyA9IGN5LmdldEVsZW1lbnRCeUlkKF9kYXRhMy5zb3VyY2UpO1xuICAgICAgdmFyIHRndCA9IGN5LmdldEVsZW1lbnRCeUlkKF9kYXRhMy50YXJnZXQpO1xuXG4gICAgICAvLyBvbmx5IG9uZSBlZGdlIGluIG5vZGUgaWYgbG9vcFxuICAgICAgaWYgKHNyYy5zYW1lKHRndCkpIHtcbiAgICAgICAgc3JjLl9wcml2YXRlLmVkZ2VzLnB1c2goZWRnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcmMuX3ByaXZhdGUuZWRnZXMucHVzaChlZGdlKTtcbiAgICAgICAgdGd0Ll9wcml2YXRlLmVkZ2VzLnB1c2goZWRnZSk7XG4gICAgICB9XG4gICAgICBlZGdlLl9wcml2YXRlLnNvdXJjZSA9IHNyYztcbiAgICAgIGVkZ2UuX3ByaXZhdGUudGFyZ2V0ID0gdGd0O1xuICAgIH0gLy8gaWYgaXMgZWRnZVxuXG4gICAgLy8gY3JlYXRlIG1vY2sgaWRzIC8gaW5kZXhlcyBtYXBzIGZvciBlbGVtZW50IHNvIGl0IGNhbiBiZSB1c2VkIGxpa2UgY29sbGVjdGlvbnNcbiAgICBfcHJpdmF0ZS5tYXAgPSBuZXcgTWFwJDIoKTtcbiAgICBfcHJpdmF0ZS5tYXAuc2V0KGlkLCB7XG4gICAgICBlbGU6IF9lbGUyLFxuICAgICAgaW5kZXg6IDBcbiAgICB9KTtcbiAgICBfcHJpdmF0ZS5yZW1vdmVkID0gZmFsc2U7XG4gICAgaWYgKGFkZFRvUG9vbCkge1xuICAgICAgY3kuYWRkVG9Qb29sKF9lbGUyKTtcbiAgICB9XG4gIH0gLy8gZm9yIGVhY2ggZWxlbWVudFxuXG4gIC8vIGRvIGNvbXBvdW5kIG5vZGUgc2FuaXR5IGNoZWNrc1xuICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBub2Rlcy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgLy8gZWFjaCBub2RlXG4gICAgdmFyIG5vZGUgPSBub2Rlc1tfaTRdO1xuICAgIHZhciBfZGF0YTQgPSBub2RlLl9wcml2YXRlLmRhdGE7XG4gICAgaWYgKG51bWJlciQxKF9kYXRhNC5wYXJlbnQpKSB7XG4gICAgICAvLyB0aGVuIGF1dG9tYWtlIHN0cmluZ1xuICAgICAgX2RhdGE0LnBhcmVudCA9ICcnICsgX2RhdGE0LnBhcmVudDtcbiAgICB9XG4gICAgdmFyIHBhcmVudElkID0gX2RhdGE0LnBhcmVudDtcbiAgICB2YXIgc3BlY2lmaWVkUGFyZW50ID0gcGFyZW50SWQgIT0gbnVsbDtcbiAgICBpZiAoc3BlY2lmaWVkUGFyZW50IHx8IG5vZGUuX3ByaXZhdGUucGFyZW50KSB7XG4gICAgICB2YXIgcGFyZW50ID0gbm9kZS5fcHJpdmF0ZS5wYXJlbnQgPyBjeS5jb2xsZWN0aW9uKCkubWVyZ2Uobm9kZS5fcHJpdmF0ZS5wYXJlbnQpIDogY3kuZ2V0RWxlbWVudEJ5SWQocGFyZW50SWQpO1xuICAgICAgaWYgKHBhcmVudC5lbXB0eSgpKSB7XG4gICAgICAgIC8vIG5vbi1leGlzdGFudCBwYXJlbnQ7IGp1c3QgcmVtb3ZlIGl0XG4gICAgICAgIF9kYXRhNC5wYXJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2UgaWYgKHBhcmVudFswXS5yZW1vdmVkKCkpIHtcbiAgICAgICAgd2FybignTm9kZSBhZGRlZCB3aXRoIG1pc3NpbmcgcGFyZW50LCByZWZlcmVuY2UgdG8gcGFyZW50IHJlbW92ZWQnKTtcbiAgICAgICAgX2RhdGE0LnBhcmVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgbm9kZS5fcHJpdmF0ZS5wYXJlbnQgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNlbGZBc1BhcmVudCA9IGZhbHNlO1xuICAgICAgICB2YXIgYW5jZXN0b3IgPSBwYXJlbnQ7XG4gICAgICAgIHdoaWxlICghYW5jZXN0b3IuZW1wdHkoKSkge1xuICAgICAgICAgIGlmIChub2RlLnNhbWUoYW5jZXN0b3IpKSB7XG4gICAgICAgICAgICAvLyBtYXJrIHNlbGYgYXMgcGFyZW50IGFuZCByZW1vdmUgZnJvbSBkYXRhXG4gICAgICAgICAgICBzZWxmQXNQYXJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgX2RhdGE0LnBhcmVudCA9IHVuZGVmaW5lZDsgLy8gcmVtb3ZlIHBhcmVudCByZWZlcmVuY2VcblxuICAgICAgICAgICAgLy8gZXhpdCBvciB3ZSBsb29wIGZvcmV2ZXJcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2VsZkFzUGFyZW50KSB7XG4gICAgICAgICAgLy8gY29ubmVjdCB3aXRoIGNoaWxkcmVuXG4gICAgICAgICAgcGFyZW50WzBdLl9wcml2YXRlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICAgICAgbm9kZS5fcHJpdmF0ZS5wYXJlbnQgPSBwYXJlbnRbMF07XG5cbiAgICAgICAgICAvLyBsZXQgdGhlIGNvcmUga25vdyB3ZSBoYXZlIGEgY29tcG91bmQgZ3JhcGhcbiAgICAgICAgICBjeV9wLmhhc0NvbXBvdW5kTm9kZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IC8vIGVsc2VcbiAgICB9IC8vIGlmIHNwZWNpZmllZCBwYXJlbnRcbiAgfSAvLyBmb3IgZWFjaCBub2RlXG5cbiAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgcmVzdG9yZWQgPSBlbGVtZW50cy5sZW5ndGggPT09IHNlbGYubGVuZ3RoID8gc2VsZiA6IG5ldyBDb2xsZWN0aW9uKGN5LCBlbGVtZW50cyk7XG4gICAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgcmVzdG9yZWQubGVuZ3RoOyBfaTUrKykge1xuICAgICAgdmFyIF9lbGUzID0gcmVzdG9yZWRbX2k1XTtcbiAgICAgIGlmIChfZWxlMy5pc05vZGUoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkaW5nIGFuIGVkZ2UgaW52YWxpZGF0ZXMgdGhlIHRyYXZlcnNhbCBjYWNoZXMgZm9yIHRoZSBwYXJhbGxlbCBlZGdlc1xuICAgICAgX2VsZTMucGFyYWxsZWxFZGdlcygpLmNsZWFyVHJhdmVyc2FsQ2FjaGUoKTtcblxuICAgICAgLy8gYWRkaW5nIGFuIGVkZ2UgaW52YWxpZGF0ZXMgdGhlIHRyYXZlcnNhbCBjYWNoZSBmb3IgdGhlIGNvbm5lY3RlZCBub2Rlc1xuICAgICAgX2VsZTMuc291cmNlKCkuY2xlYXJUcmF2ZXJzYWxDYWNoZSgpO1xuICAgICAgX2VsZTMudGFyZ2V0KCkuY2xlYXJUcmF2ZXJzYWxDYWNoZSgpO1xuICAgIH1cbiAgICB2YXIgdG9VcGRhdGVTdHlsZTtcbiAgICBpZiAoY3lfcC5oYXNDb21wb3VuZE5vZGVzKSB7XG4gICAgICB0b1VwZGF0ZVN0eWxlID0gY3kuY29sbGVjdGlvbigpLm1lcmdlKHJlc3RvcmVkKS5tZXJnZShyZXN0b3JlZC5jb25uZWN0ZWROb2RlcygpKS5tZXJnZShyZXN0b3JlZC5wYXJlbnQoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRvVXBkYXRlU3R5bGUgPSByZXN0b3JlZDtcbiAgICB9XG4gICAgdG9VcGRhdGVTdHlsZS5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKS51cGRhdGVTdHlsZShub3RpZnlSZW5kZXJlcik7XG4gICAgaWYgKG5vdGlmeVJlbmRlcmVyKSB7XG4gICAgICByZXN0b3JlZC5lbWl0QW5kTm90aWZ5KCdhZGQnKTtcbiAgICB9IGVsc2UgaWYgKGFkZFRvUG9vbCkge1xuICAgICAgcmVzdG9yZWQuZW1pdCgnYWRkJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzZWxmOyAvLyBjaGFpbmFiaWxpdHlcbn07XG5cbmVsZXNmbiQxLnJlbW92ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICByZXR1cm4gZWxlICYmIGVsZS5fcHJpdmF0ZS5yZW1vdmVkO1xufTtcbmVsZXNmbiQxLmluc2lkZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIHJldHVybiBlbGUgJiYgIWVsZS5fcHJpdmF0ZS5yZW1vdmVkO1xufTtcbmVsZXNmbiQxLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vdGlmeVJlbmRlcmVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICB2YXIgcmVtb3ZlRnJvbVBvb2wgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGVsZXNUb1JlbW92ZSA9IFtdO1xuICB2YXIgZWxlc1RvUmVtb3ZlSWRzID0ge307XG4gIHZhciBjeSA9IHNlbGYuX3ByaXZhdGUuY3k7XG5cbiAgLy8gYWRkIGNvbm5lY3RlZCBlZGdlc1xuICBmdW5jdGlvbiBhZGRDb25uZWN0ZWRFZGdlcyhub2RlKSB7XG4gICAgdmFyIGVkZ2VzID0gbm9kZS5fcHJpdmF0ZS5lZGdlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhZGQoZWRnZXNbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFkZCBkZXNjZW5kYW50IG5vZGVzXG4gIGZ1bmN0aW9uIGFkZENoaWxkcmVuKG5vZGUpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLl9wcml2YXRlLmNoaWxkcmVuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFkZChjaGlsZHJlbltpXSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGFkZChlbGUpIHtcbiAgICB2YXIgYWxyZWFkeUFkZGVkID0gZWxlc1RvUmVtb3ZlSWRzW2VsZS5pZCgpXTtcbiAgICBpZiAocmVtb3ZlRnJvbVBvb2wgJiYgZWxlLnJlbW92ZWQoKSB8fCBhbHJlYWR5QWRkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlc1RvUmVtb3ZlSWRzW2VsZS5pZCgpXSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIGVsZXNUb1JlbW92ZS5wdXNoKGVsZSk7IC8vIG5vZGVzIGFyZSByZW1vdmVkIGxhc3RcblxuICAgICAgYWRkQ29ubmVjdGVkRWRnZXMoZWxlKTtcbiAgICAgIGFkZENoaWxkcmVuKGVsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZXNUb1JlbW92ZS51bnNoaWZ0KGVsZSk7IC8vIGVkZ2VzIGFyZSByZW1vdmVkIGZpcnN0XG4gICAgfVxuICB9XG5cbiAgLy8gbWFrZSB0aGUgbGlzdCBvZiBlbGVtZW50cyB0byByZW1vdmVcbiAgLy8gKG1heSBiZSByZW1vdmluZyBtb3JlIHRoYW4gc3BlY2lmaWVkIGR1ZSB0byBjb25uZWN0ZWQgZWRnZXMgZXRjKVxuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gc2VsZi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIgZWxlID0gc2VsZltpXTtcbiAgICBhZGQoZWxlKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVFZGdlUmVmKG5vZGUsIGVkZ2UpIHtcbiAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLl9wcml2YXRlLmVkZ2VzO1xuICAgIHJlbW92ZUZyb21BcnJheShjb25uZWN0ZWRFZGdlcywgZWRnZSk7XG5cbiAgICAvLyByZW1vdmluZyBhbiBlZGdlcyBpbnZhbGlkYXRlcyB0aGUgdHJhdmVyc2FsIGNhY2hlIGZvciBpdHMgbm9kZXNcbiAgICBub2RlLmNsZWFyVHJhdmVyc2FsQ2FjaGUoKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVQYXJhbGxlbFJlZihwbGxFZGdlKSB7XG4gICAgLy8gcmVtb3ZpbmcgYW4gZWRnZSBpbnZhbGlkYXRlcyB0aGUgdHJhdmVyc2FsIGNhY2hlcyBmb3IgdGhlIHBhcmFsbGVsIGVkZ2VzXG4gICAgcGxsRWRnZS5jbGVhclRyYXZlcnNhbENhY2hlKCk7XG4gIH1cbiAgdmFyIGFsdGVyZWRQYXJlbnRzID0gW107XG4gIGFsdGVyZWRQYXJlbnRzLmlkcyA9IHt9O1xuICBmdW5jdGlvbiByZW1vdmVDaGlsZFJlZihwYXJlbnQsIGVsZSkge1xuICAgIGVsZSA9IGVsZVswXTtcbiAgICBwYXJlbnQgPSBwYXJlbnRbMF07XG4gICAgdmFyIGNoaWxkcmVuID0gcGFyZW50Ll9wcml2YXRlLmNoaWxkcmVuO1xuICAgIHZhciBwaWQgPSBwYXJlbnQuaWQoKTtcbiAgICByZW1vdmVGcm9tQXJyYXkoY2hpbGRyZW4sIGVsZSk7IC8vIHJlbW92ZSBwYXJlbnQgPT4gY2hpbGQgcmVmXG5cbiAgICBlbGUuX3ByaXZhdGUucGFyZW50ID0gbnVsbDsgLy8gcmVtb3ZlIGNoaWxkID0+IHBhcmVudCByZWZcblxuICAgIGlmICghYWx0ZXJlZFBhcmVudHMuaWRzW3BpZF0pIHtcbiAgICAgIGFsdGVyZWRQYXJlbnRzLmlkc1twaWRdID0gdHJ1ZTtcbiAgICAgIGFsdGVyZWRQYXJlbnRzLnB1c2gocGFyZW50KTtcbiAgICB9XG4gIH1cbiAgc2VsZi5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKTtcbiAgaWYgKHJlbW92ZUZyb21Qb29sKSB7XG4gICAgY3kucmVtb3ZlRnJvbVBvb2woZWxlc1RvUmVtb3ZlKTsgLy8gcmVtb3ZlIGZyb20gY29yZSBwb29sXG4gIH1cblxuICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBlbGVzVG9SZW1vdmUubGVuZ3RoOyBfaTYrKykge1xuICAgIHZhciBfZWxlNCA9IGVsZXNUb1JlbW92ZVtfaTZdO1xuICAgIGlmIChfZWxlNC5pc0VkZ2UoKSkge1xuICAgICAgLy8gcmVtb3ZlIHJlZmVyZW5jZXMgdG8gdGhpcyBlZGdlIGluIGl0cyBjb25uZWN0ZWQgbm9kZXNcbiAgICAgIHZhciBzcmMgPSBfZWxlNC5zb3VyY2UoKVswXTtcbiAgICAgIHZhciB0Z3QgPSBfZWxlNC50YXJnZXQoKVswXTtcbiAgICAgIHJlbW92ZUVkZ2VSZWYoc3JjLCBfZWxlNCk7XG4gICAgICByZW1vdmVFZGdlUmVmKHRndCwgX2VsZTQpO1xuICAgICAgdmFyIHBsbEVkZ2VzID0gX2VsZTQucGFyYWxsZWxFZGdlcygpO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwbGxFZGdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgcGxsRWRnZSA9IHBsbEVkZ2VzW2pdO1xuICAgICAgICByZW1vdmVQYXJhbGxlbFJlZihwbGxFZGdlKTtcbiAgICAgICAgaWYgKHBsbEVkZ2UuaXNCdW5kbGVkQmV6aWVyKCkpIHtcbiAgICAgICAgICBwbGxFZGdlLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJlbW92ZSByZWZlcmVuY2UgdG8gcGFyZW50XG4gICAgICB2YXIgcGFyZW50ID0gX2VsZTQucGFyZW50KCk7XG4gICAgICBpZiAocGFyZW50Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICByZW1vdmVDaGlsZFJlZihwYXJlbnQsIF9lbGU0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlbW92ZUZyb21Qb29sKSB7XG4gICAgICAvLyBtYXJrIGFzIHJlbW92ZWRcbiAgICAgIF9lbGU0Ll9wcml2YXRlLnJlbW92ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgY29tcG91bmQgZ3JhcGggb3Igbm90XG4gIHZhciBlbGVzU3RpbGxJbnNpZGUgPSBjeS5fcHJpdmF0ZS5lbGVtZW50cztcbiAgY3kuX3ByaXZhdGUuaGFzQ29tcG91bmROb2RlcyA9IGZhbHNlO1xuICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCBlbGVzU3RpbGxJbnNpZGUubGVuZ3RoOyBfaTcrKykge1xuICAgIHZhciBfZWxlNSA9IGVsZXNTdGlsbEluc2lkZVtfaTddO1xuICAgIGlmIChfZWxlNS5pc1BhcmVudCgpKSB7XG4gICAgICBjeS5fcHJpdmF0ZS5oYXNDb21wb3VuZE5vZGVzID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB2YXIgcmVtb3ZlZEVsZW1lbnRzID0gbmV3IENvbGxlY3Rpb24odGhpcy5jeSgpLCBlbGVzVG9SZW1vdmUpO1xuICBpZiAocmVtb3ZlZEVsZW1lbnRzLnNpemUoKSA+IDApIHtcbiAgICAvLyBtdXN0IG1hbnVhbGx5IG5vdGlmeSBzaW5jZSB0cmlnZ2VyIHdvbid0IGRvIHRoaXMgYXV0b21hdGljYWxseSBvbmNlIHJlbW92ZWRcblxuICAgIGlmIChub3RpZnlSZW5kZXJlcikge1xuICAgICAgcmVtb3ZlZEVsZW1lbnRzLmVtaXRBbmROb3RpZnkoJ3JlbW92ZScpO1xuICAgIH0gZWxzZSBpZiAocmVtb3ZlRnJvbVBvb2wpIHtcbiAgICAgIHJlbW92ZWRFbGVtZW50cy5lbWl0KCdyZW1vdmUnKTtcbiAgICB9XG4gIH1cblxuICAvLyB0aGUgcGFyZW50cyB3aG8gd2VyZSBtb2RpZmllZCBieSB0aGUgcmVtb3ZhbCBuZWVkIHRoZWlyIHN0eWxlIHVwZGF0ZWRcbiAgZm9yICh2YXIgX2k4ID0gMDsgX2k4IDwgYWx0ZXJlZFBhcmVudHMubGVuZ3RoOyBfaTgrKykge1xuICAgIHZhciBfZWxlNiA9IGFsdGVyZWRQYXJlbnRzW19pOF07XG4gICAgaWYgKCFyZW1vdmVGcm9tUG9vbCB8fCAhX2VsZTYucmVtb3ZlZCgpKSB7XG4gICAgICBfZWxlNi51cGRhdGVTdHlsZSgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVtb3ZlZEVsZW1lbnRzO1xufTtcbmVsZXNmbiQxLm1vdmUgPSBmdW5jdGlvbiAoc3RydWN0KSB7XG4gIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gIHZhciBlbGVzID0gdGhpcztcblxuICAvLyBqdXN0IGNsZWFuIHVwIHJlZnMsIGNhY2hlcywgZXRjLiBpbiB0aGUgc2FtZSB3YXkgYXMgd2hlbiByZW1vdmluZyBhbmQgdGhlbiByZXN0b3JpbmdcbiAgLy8gKG91ciBjYWxscyB0byByZW1vdmUvcmVzdG9yZSBkbyBub3QgcmVtb3ZlIGZyb20gdGhlIGdyYXBoIG9yIG1ha2UgZXZlbnRzKVxuICB2YXIgbm90aWZ5UmVuZGVyZXIgPSBmYWxzZTtcbiAgdmFyIG1vZGlmeVBvb2wgPSBmYWxzZTtcbiAgdmFyIHRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoaWQpIHtcbiAgICByZXR1cm4gaWQgPT0gbnVsbCA/IGlkIDogJycgKyBpZDtcbiAgfTsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcblxuICBpZiAoc3RydWN0LnNvdXJjZSAhPT0gdW5kZWZpbmVkIHx8IHN0cnVjdC50YXJnZXQgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBzcmNJZCA9IHRvU3RyaW5nKHN0cnVjdC5zb3VyY2UpO1xuICAgIHZhciB0Z3RJZCA9IHRvU3RyaW5nKHN0cnVjdC50YXJnZXQpO1xuICAgIHZhciBzcmNFeGlzdHMgPSBzcmNJZCAhPSBudWxsICYmIGN5Lmhhc0VsZW1lbnRXaXRoSWQoc3JjSWQpO1xuICAgIHZhciB0Z3RFeGlzdHMgPSB0Z3RJZCAhPSBudWxsICYmIGN5Lmhhc0VsZW1lbnRXaXRoSWQodGd0SWQpO1xuICAgIGlmIChzcmNFeGlzdHMgfHwgdGd0RXhpc3RzKSB7XG4gICAgICBjeS5iYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGF2b2lkIGR1cGxpY2F0ZSBzdHlsZSB1cGRhdGVzXG4gICAgICAgIGVsZXMucmVtb3ZlKG5vdGlmeVJlbmRlcmVyLCBtb2RpZnlQb29sKTsgLy8gY2xlYW4gdXAgcmVmcyBldGMuXG4gICAgICAgIGVsZXMuZW1pdEFuZE5vdGlmeSgnbW92ZW91dCcpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgICB2YXIgX2RhdGE1ID0gZWxlLl9wcml2YXRlLmRhdGE7XG4gICAgICAgICAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgICAgICAgICAgaWYgKHNyY0V4aXN0cykge1xuICAgICAgICAgICAgICBfZGF0YTUuc291cmNlID0gc3JjSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGd0RXhpc3RzKSB7XG4gICAgICAgICAgICAgIF9kYXRhNS50YXJnZXQgPSB0Z3RJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxlcy5yZXN0b3JlKG5vdGlmeVJlbmRlcmVyLCBtb2RpZnlQb29sKTsgLy8gbWFrZSBuZXcgcmVmcywgc3R5bGUsIGV0Yy5cbiAgICAgIH0pO1xuXG4gICAgICBlbGVzLmVtaXRBbmROb3RpZnkoJ21vdmUnKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc3RydWN0LnBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gbW92ZSBub2RlIHRvIG5ldyBwYXJlbnRcbiAgICB2YXIgcGFyZW50SWQgPSB0b1N0cmluZyhzdHJ1Y3QucGFyZW50KTtcbiAgICB2YXIgcGFyZW50RXhpc3RzID0gcGFyZW50SWQgPT09IG51bGwgfHwgY3kuaGFzRWxlbWVudFdpdGhJZChwYXJlbnRJZCk7XG4gICAgaWYgKHBhcmVudEV4aXN0cykge1xuICAgICAgdmFyIHBpZFRvQXNzaWduID0gcGFyZW50SWQgPT09IG51bGwgPyB1bmRlZmluZWQgOiBwYXJlbnRJZDtcbiAgICAgIGN5LmJhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gYXZvaWQgZHVwbGljYXRlIHN0eWxlIHVwZGF0ZXNcbiAgICAgICAgdmFyIHVwZGF0ZWQgPSBlbGVzLnJlbW92ZShub3RpZnlSZW5kZXJlciwgbW9kaWZ5UG9vbCk7IC8vIGNsZWFuIHVwIHJlZnMgZXRjLlxuICAgICAgICB1cGRhdGVkLmVtaXRBbmROb3RpZnkoJ21vdmVvdXQnKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgICAgdmFyIF9kYXRhNiA9IGVsZS5fcHJpdmF0ZS5kYXRhO1xuICAgICAgICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgICAgICAgIF9kYXRhNi5wYXJlbnQgPSBwaWRUb0Fzc2lnbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlZC5yZXN0b3JlKG5vdGlmeVJlbmRlcmVyLCBtb2RpZnlQb29sKTsgLy8gbWFrZSBuZXcgcmVmcywgc3R5bGUsIGV0Yy5cbiAgICAgIH0pO1xuXG4gICAgICBlbGVzLmVtaXRBbmROb3RpZnkoJ21vdmUnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuW2VsZXNmbiRqLCBlbGVzZm4kaSwgZWxlc2ZuJGgsIGVsZXNmbiRnLCBlbGVzZm4kZiwgZGF0YSwgZWxlc2ZuJGQsIGRpbWVuc2lvbnMsIGVsZXNmbiQ5LCBlbGVzZm4kOCwgZWxlc2ZuJDcsIGVsZXNmbiQ2LCBlbGVzZm4kNSwgZWxlc2ZuJDQsIGVsZXNmbiQzLCBlbGVzZm4kMl0uZm9yRWFjaChmdW5jdGlvbiAocHJvcHMpIHtcbiAgZXh0ZW5kKGVsZXNmbiQxLCBwcm9wcyk7XG59KTtcblxudmFyIGNvcmVmbiQ5ID0ge1xuICBhZGQ6IGZ1bmN0aW9uIGFkZChvcHRzKSB7XG4gICAgdmFyIGVsZW1lbnRzO1xuICAgIHZhciBjeSA9IHRoaXM7XG5cbiAgICAvLyBhZGQgdGhlIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnRPckNvbGxlY3Rpb24ob3B0cykpIHtcbiAgICAgIHZhciBlbGVzID0gb3B0cztcbiAgICAgIGlmIChlbGVzLl9wcml2YXRlLmN5ID09PSBjeSkge1xuICAgICAgICAvLyBzYW1lIGluc3RhbmNlID0+IGp1c3QgcmVzdG9yZVxuICAgICAgICBlbGVtZW50cyA9IGVsZXMucmVzdG9yZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBjb3B5IGZyb20ganNvblxuICAgICAgICB2YXIganNvbnMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgICAganNvbnMucHVzaChlbGUuanNvbigpKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50cyA9IG5ldyBDb2xsZWN0aW9uKGN5LCBqc29ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc3BlY2lmeSBhbiBhcnJheSBvZiBvcHRpb25zXG4gICAgZWxzZSBpZiAoYXJyYXkob3B0cykpIHtcbiAgICAgIHZhciBfanNvbnMgPSBvcHRzO1xuICAgICAgZWxlbWVudHMgPSBuZXcgQ29sbGVjdGlvbihjeSwgX2pzb25zKTtcbiAgICB9XG5cbiAgICAvLyBzcGVjaWZ5IHZpYSBvcHRzLm5vZGVzIGFuZCBvcHRzLmVkZ2VzXG4gICAgZWxzZSBpZiAocGxhaW5PYmplY3Qob3B0cykgJiYgKGFycmF5KG9wdHMubm9kZXMpIHx8IGFycmF5KG9wdHMuZWRnZXMpKSkge1xuICAgICAgdmFyIGVsZXNCeUdyb3VwID0gb3B0cztcbiAgICAgIHZhciBfanNvbnMyID0gW107XG4gICAgICB2YXIgZ3JzID0gWydub2RlcycsICdlZGdlcyddO1xuICAgICAgZm9yICh2YXIgX2kgPSAwLCBpbCA9IGdycy5sZW5ndGg7IF9pIDwgaWw7IF9pKyspIHtcbiAgICAgICAgdmFyIGdyb3VwID0gZ3JzW19pXTtcbiAgICAgICAgdmFyIGVsZXNBcnJheSA9IGVsZXNCeUdyb3VwW2dyb3VwXTtcbiAgICAgICAgaWYgKGFycmF5KGVsZXNBcnJheSkpIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMCwgamwgPSBlbGVzQXJyYXkubGVuZ3RoOyBqIDwgamw7IGorKykge1xuICAgICAgICAgICAgdmFyIGpzb24gPSBleHRlbmQoe1xuICAgICAgICAgICAgICBncm91cDogZ3JvdXBcbiAgICAgICAgICAgIH0sIGVsZXNBcnJheVtqXSk7XG4gICAgICAgICAgICBfanNvbnMyLnB1c2goanNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbGVtZW50cyA9IG5ldyBDb2xsZWN0aW9uKGN5LCBfanNvbnMyKTtcbiAgICB9XG5cbiAgICAvLyBzcGVjaWZ5IG9wdGlvbnMgZm9yIG9uZSBlbGVtZW50XG4gICAgZWxzZSB7XG4gICAgICB2YXIgX2pzb24gPSBvcHRzO1xuICAgICAgZWxlbWVudHMgPSBuZXcgRWxlbWVudChjeSwgX2pzb24pLmNvbGxlY3Rpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LFxuICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShjb2xsZWN0aW9uKSB7XG4gICAgaWYgKGVsZW1lbnRPckNvbGxlY3Rpb24oY29sbGVjdGlvbikpIDsgZWxzZSBpZiAoc3RyaW5nKGNvbGxlY3Rpb24pKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBjb2xsZWN0aW9uO1xuICAgICAgY29sbGVjdGlvbiA9IHRoaXMuJChzZWxlY3Rvcik7XG4gICAgfVxuICAgIHJldHVybiBjb2xsZWN0aW9uLnJlbW92ZSgpO1xuICB9XG59O1xuXG4vKiBnbG9iYWwgRmxvYXQzMkFycmF5ICovXG5cbi8qISBCZXppZXIgY3VydmUgZnVuY3Rpb24gZ2VuZXJhdG9yLiBDb3B5cmlnaHQgR2FldGFuIFJlbmF1ZGVhdS4gTUlUIExpY2Vuc2U6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTUlUX0xpY2Vuc2UgKi9cbmZ1bmN0aW9uIGdlbmVyYXRlQ3ViaWNCZXppZXIobVgxLCBtWTEsIG1YMiwgbVkyKSB7XG4gIHZhciBORVdUT05fSVRFUkFUSU9OUyA9IDQsXG4gICAgTkVXVE9OX01JTl9TTE9QRSA9IDAuMDAxLFxuICAgIFNVQkRJVklTSU9OX1BSRUNJU0lPTiA9IDAuMDAwMDAwMSxcbiAgICBTVUJESVZJU0lPTl9NQVhfSVRFUkFUSU9OUyA9IDEwLFxuICAgIGtTcGxpbmVUYWJsZVNpemUgPSAxMSxcbiAgICBrU2FtcGxlU3RlcFNpemUgPSAxLjAgLyAoa1NwbGluZVRhYmxlU2l6ZSAtIDEuMCksXG4gICAgZmxvYXQzMkFycmF5U3VwcG9ydGVkID0gdHlwZW9mIEZsb2F0MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCc7XG5cbiAgLyogTXVzdCBjb250YWluIGZvdXIgYXJndW1lbnRzLiAqL1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gNCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qIEFyZ3VtZW50cyBtdXN0IGJlIG51bWJlcnMuICovXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbaV0gIT09IFwibnVtYmVyXCIgfHwgaXNOYU4oYXJndW1lbnRzW2ldKSB8fCAhaXNGaW5pdGUoYXJndW1lbnRzW2ldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qIFggdmFsdWVzIG11c3QgYmUgaW4gdGhlIFswLCAxXSByYW5nZS4gKi9cbiAgbVgxID0gTWF0aC5taW4obVgxLCAxKTtcbiAgbVgyID0gTWF0aC5taW4obVgyLCAxKTtcbiAgbVgxID0gTWF0aC5tYXgobVgxLCAwKTtcbiAgbVgyID0gTWF0aC5tYXgobVgyLCAwKTtcbiAgdmFyIG1TYW1wbGVWYWx1ZXMgPSBmbG9hdDMyQXJyYXlTdXBwb3J0ZWQgPyBuZXcgRmxvYXQzMkFycmF5KGtTcGxpbmVUYWJsZVNpemUpIDogbmV3IEFycmF5KGtTcGxpbmVUYWJsZVNpemUpO1xuICBmdW5jdGlvbiBBKGFBMSwgYUEyKSB7XG4gICAgcmV0dXJuIDEuMCAtIDMuMCAqIGFBMiArIDMuMCAqIGFBMTtcbiAgfVxuICBmdW5jdGlvbiBCKGFBMSwgYUEyKSB7XG4gICAgcmV0dXJuIDMuMCAqIGFBMiAtIDYuMCAqIGFBMTtcbiAgfVxuICBmdW5jdGlvbiBDKGFBMSkge1xuICAgIHJldHVybiAzLjAgKiBhQTE7XG4gIH1cbiAgZnVuY3Rpb24gY2FsY0JlemllcihhVCwgYUExLCBhQTIpIHtcbiAgICByZXR1cm4gKChBKGFBMSwgYUEyKSAqIGFUICsgQihhQTEsIGFBMikpICogYVQgKyBDKGFBMSkpICogYVQ7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0U2xvcGUoYVQsIGFBMSwgYUEyKSB7XG4gICAgcmV0dXJuIDMuMCAqIEEoYUExLCBhQTIpICogYVQgKiBhVCArIDIuMCAqIEIoYUExLCBhQTIpICogYVQgKyBDKGFBMSk7XG4gIH1cbiAgZnVuY3Rpb24gbmV3dG9uUmFwaHNvbkl0ZXJhdGUoYVgsIGFHdWVzc1QpIHtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgTkVXVE9OX0lURVJBVElPTlM7ICsrX2kpIHtcbiAgICAgIHZhciBjdXJyZW50U2xvcGUgPSBnZXRTbG9wZShhR3Vlc3NULCBtWDEsIG1YMik7XG4gICAgICBpZiAoY3VycmVudFNsb3BlID09PSAwLjApIHtcbiAgICAgICAgcmV0dXJuIGFHdWVzc1Q7XG4gICAgICB9XG4gICAgICB2YXIgY3VycmVudFggPSBjYWxjQmV6aWVyKGFHdWVzc1QsIG1YMSwgbVgyKSAtIGFYO1xuICAgICAgYUd1ZXNzVCAtPSBjdXJyZW50WCAvIGN1cnJlbnRTbG9wZTtcbiAgICB9XG4gICAgcmV0dXJuIGFHdWVzc1Q7XG4gIH1cbiAgZnVuY3Rpb24gY2FsY1NhbXBsZVZhbHVlcygpIHtcbiAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBrU3BsaW5lVGFibGVTaXplOyArK19pMikge1xuICAgICAgbVNhbXBsZVZhbHVlc1tfaTJdID0gY2FsY0JlemllcihfaTIgKiBrU2FtcGxlU3RlcFNpemUsIG1YMSwgbVgyKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gYmluYXJ5U3ViZGl2aWRlKGFYLCBhQSwgYUIpIHtcbiAgICB2YXIgY3VycmVudFgsXG4gICAgICBjdXJyZW50VCxcbiAgICAgIGkgPSAwO1xuICAgIGRvIHtcbiAgICAgIGN1cnJlbnRUID0gYUEgKyAoYUIgLSBhQSkgLyAyLjA7XG4gICAgICBjdXJyZW50WCA9IGNhbGNCZXppZXIoY3VycmVudFQsIG1YMSwgbVgyKSAtIGFYO1xuICAgICAgaWYgKGN1cnJlbnRYID4gMC4wKSB7XG4gICAgICAgIGFCID0gY3VycmVudFQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhQSA9IGN1cnJlbnRUO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKE1hdGguYWJzKGN1cnJlbnRYKSA+IFNVQkRJVklTSU9OX1BSRUNJU0lPTiAmJiArK2kgPCBTVUJESVZJU0lPTl9NQVhfSVRFUkFUSU9OUyk7XG4gICAgcmV0dXJuIGN1cnJlbnRUO1xuICB9XG4gIGZ1bmN0aW9uIGdldFRGb3JYKGFYKSB7XG4gICAgdmFyIGludGVydmFsU3RhcnQgPSAwLjAsXG4gICAgICBjdXJyZW50U2FtcGxlID0gMSxcbiAgICAgIGxhc3RTYW1wbGUgPSBrU3BsaW5lVGFibGVTaXplIC0gMTtcbiAgICBmb3IgKDsgY3VycmVudFNhbXBsZSAhPT0gbGFzdFNhbXBsZSAmJiBtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGVdIDw9IGFYOyArK2N1cnJlbnRTYW1wbGUpIHtcbiAgICAgIGludGVydmFsU3RhcnQgKz0ga1NhbXBsZVN0ZXBTaXplO1xuICAgIH1cbiAgICAtLWN1cnJlbnRTYW1wbGU7XG4gICAgdmFyIGRpc3QgPSAoYVggLSBtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGVdKSAvIChtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGUgKyAxXSAtIG1TYW1wbGVWYWx1ZXNbY3VycmVudFNhbXBsZV0pLFxuICAgICAgZ3Vlc3NGb3JUID0gaW50ZXJ2YWxTdGFydCArIGRpc3QgKiBrU2FtcGxlU3RlcFNpemUsXG4gICAgICBpbml0aWFsU2xvcGUgPSBnZXRTbG9wZShndWVzc0ZvclQsIG1YMSwgbVgyKTtcbiAgICBpZiAoaW5pdGlhbFNsb3BlID49IE5FV1RPTl9NSU5fU0xPUEUpIHtcbiAgICAgIHJldHVybiBuZXd0b25SYXBoc29uSXRlcmF0ZShhWCwgZ3Vlc3NGb3JUKTtcbiAgICB9IGVsc2UgaWYgKGluaXRpYWxTbG9wZSA9PT0gMC4wKSB7XG4gICAgICByZXR1cm4gZ3Vlc3NGb3JUO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYmluYXJ5U3ViZGl2aWRlKGFYLCBpbnRlcnZhbFN0YXJ0LCBpbnRlcnZhbFN0YXJ0ICsga1NhbXBsZVN0ZXBTaXplKTtcbiAgICB9XG4gIH1cbiAgdmFyIF9wcmVjb21wdXRlZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBwcmVjb21wdXRlKCkge1xuICAgIF9wcmVjb21wdXRlZCA9IHRydWU7XG4gICAgaWYgKG1YMSAhPT0gbVkxIHx8IG1YMiAhPT0gbVkyKSB7XG4gICAgICBjYWxjU2FtcGxlVmFsdWVzKCk7XG4gICAgfVxuICB9XG4gIHZhciBmID0gZnVuY3Rpb24gZihhWCkge1xuICAgIGlmICghX3ByZWNvbXB1dGVkKSB7XG4gICAgICBwcmVjb21wdXRlKCk7XG4gICAgfVxuICAgIGlmIChtWDEgPT09IG1ZMSAmJiBtWDIgPT09IG1ZMikge1xuICAgICAgcmV0dXJuIGFYO1xuICAgIH1cbiAgICBpZiAoYVggPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAoYVggPT09IDEpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gY2FsY0JlemllcihnZXRURm9yWChhWCksIG1ZMSwgbVkyKTtcbiAgfTtcbiAgZi5nZXRDb250cm9sUG9pbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBbe1xuICAgICAgeDogbVgxLFxuICAgICAgeTogbVkxXG4gICAgfSwge1xuICAgICAgeDogbVgyLFxuICAgICAgeTogbVkyXG4gICAgfV07XG4gIH07XG4gIHZhciBzdHIgPSBcImdlbmVyYXRlQmV6aWVyKFwiICsgW21YMSwgbVkxLCBtWDIsIG1ZMl0gKyBcIilcIjtcbiAgZi50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9O1xuICByZXR1cm4gZjtcbn1cblxuLyohIFJ1bmdlLUt1dHRhIHNwcmluZyBwaHlzaWNzIGZ1bmN0aW9uIGdlbmVyYXRvci4gQWRhcHRlZCBmcm9tIEZyYW1lci5qcywgY29weXJpZ2h0IEtvZW4gQm9rLiBNSVQgTGljZW5zZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NSVRfTGljZW5zZSAqL1xuLyogR2l2ZW4gYSB0ZW5zaW9uLCBmcmljdGlvbiwgYW5kIGR1cmF0aW9uLCBhIHNpbXVsYXRpb24gYXQgNjBGUFMgd2lsbCBmaXJzdCBydW4gd2l0aG91dCBhIGRlZmluZWQgZHVyYXRpb24gaW4gb3JkZXIgdG8gY2FsY3VsYXRlIHRoZSBmdWxsIHBhdGguIEEgc2Vjb25kIHBhc3NcbiAgIHRoZW4gYWRqdXN0cyB0aGUgdGltZSBkZWx0YSAtLSB1c2luZyB0aGUgcmVsYXRpb24gYmV0d2VlbiBhY3R1YWwgdGltZSBhbmQgZHVyYXRpb24gLS0gdG8gY2FsY3VsYXRlIHRoZSBwYXRoIGZvciB0aGUgZHVyYXRpb24tY29uc3RyYWluZWQgYW5pbWF0aW9uLiAqL1xudmFyIGdlbmVyYXRlU3ByaW5nUks0ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBzcHJpbmdBY2NlbGVyYXRpb25Gb3JTdGF0ZShzdGF0ZSkge1xuICAgIHJldHVybiAtc3RhdGUudGVuc2lvbiAqIHN0YXRlLnggLSBzdGF0ZS5mcmljdGlvbiAqIHN0YXRlLnY7XG4gIH1cbiAgZnVuY3Rpb24gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKGluaXRpYWxTdGF0ZSwgZHQsIGRlcml2YXRpdmUpIHtcbiAgICB2YXIgc3RhdGUgPSB7XG4gICAgICB4OiBpbml0aWFsU3RhdGUueCArIGRlcml2YXRpdmUuZHggKiBkdCxcbiAgICAgIHY6IGluaXRpYWxTdGF0ZS52ICsgZGVyaXZhdGl2ZS5kdiAqIGR0LFxuICAgICAgdGVuc2lvbjogaW5pdGlhbFN0YXRlLnRlbnNpb24sXG4gICAgICBmcmljdGlvbjogaW5pdGlhbFN0YXRlLmZyaWN0aW9uXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgZHg6IHN0YXRlLnYsXG4gICAgICBkdjogc3ByaW5nQWNjZWxlcmF0aW9uRm9yU3RhdGUoc3RhdGUpXG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBzcHJpbmdJbnRlZ3JhdGVTdGF0ZShzdGF0ZSwgZHQpIHtcbiAgICB2YXIgYSA9IHtcbiAgICAgICAgZHg6IHN0YXRlLnYsXG4gICAgICAgIGR2OiBzcHJpbmdBY2NlbGVyYXRpb25Gb3JTdGF0ZShzdGF0ZSlcbiAgICAgIH0sXG4gICAgICBiID0gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKHN0YXRlLCBkdCAqIDAuNSwgYSksXG4gICAgICBjID0gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKHN0YXRlLCBkdCAqIDAuNSwgYiksXG4gICAgICBkID0gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKHN0YXRlLCBkdCwgYyksXG4gICAgICBkeGR0ID0gMS4wIC8gNi4wICogKGEuZHggKyAyLjAgKiAoYi5keCArIGMuZHgpICsgZC5keCksXG4gICAgICBkdmR0ID0gMS4wIC8gNi4wICogKGEuZHYgKyAyLjAgKiAoYi5kdiArIGMuZHYpICsgZC5kdik7XG4gICAgc3RhdGUueCA9IHN0YXRlLnggKyBkeGR0ICogZHQ7XG4gICAgc3RhdGUudiA9IHN0YXRlLnYgKyBkdmR0ICogZHQ7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBzcHJpbmdSSzRGYWN0b3J5KHRlbnNpb24sIGZyaWN0aW9uLCBkdXJhdGlvbikge1xuICAgIHZhciBpbml0U3RhdGUgPSB7XG4gICAgICAgIHg6IC0xLFxuICAgICAgICB2OiAwLFxuICAgICAgICB0ZW5zaW9uOiBudWxsLFxuICAgICAgICBmcmljdGlvbjogbnVsbFxuICAgICAgfSxcbiAgICAgIHBhdGggPSBbMF0sXG4gICAgICB0aW1lX2xhcHNlZCA9IDAsXG4gICAgICB0b2xlcmFuY2UgPSAxIC8gMTAwMDAsXG4gICAgICBEVCA9IDE2IC8gMTAwMCxcbiAgICAgIGhhdmVfZHVyYXRpb24sXG4gICAgICBkdCxcbiAgICAgIGxhc3Rfc3RhdGU7XG4gICAgdGVuc2lvbiA9IHBhcnNlRmxvYXQodGVuc2lvbikgfHwgNTAwO1xuICAgIGZyaWN0aW9uID0gcGFyc2VGbG9hdChmcmljdGlvbikgfHwgMjA7XG4gICAgZHVyYXRpb24gPSBkdXJhdGlvbiB8fCBudWxsO1xuICAgIGluaXRTdGF0ZS50ZW5zaW9uID0gdGVuc2lvbjtcbiAgICBpbml0U3RhdGUuZnJpY3Rpb24gPSBmcmljdGlvbjtcbiAgICBoYXZlX2R1cmF0aW9uID0gZHVyYXRpb24gIT09IG51bGw7XG5cbiAgICAvKiBDYWxjdWxhdGUgdGhlIGFjdHVhbCB0aW1lIGl0IHRha2VzIGZvciB0aGlzIGFuaW1hdGlvbiB0byBjb21wbGV0ZSB3aXRoIHRoZSBwcm92aWRlZCBjb25kaXRpb25zLiAqL1xuICAgIGlmIChoYXZlX2R1cmF0aW9uKSB7XG4gICAgICAvKiBSdW4gdGhlIHNpbXVsYXRpb24gd2l0aG91dCBhIGR1cmF0aW9uLiAqL1xuICAgICAgdGltZV9sYXBzZWQgPSBzcHJpbmdSSzRGYWN0b3J5KHRlbnNpb24sIGZyaWN0aW9uKTtcbiAgICAgIC8qIENvbXB1dGUgdGhlIGFkanVzdGVkIHRpbWUgZGVsdGEuICovXG4gICAgICBkdCA9IHRpbWVfbGFwc2VkIC8gZHVyYXRpb24gKiBEVDtcbiAgICB9IGVsc2Uge1xuICAgICAgZHQgPSBEVDtcbiAgICB9XG4gICAgZm9yICg7Oykge1xuICAgICAgLyogTmV4dC9zdGVwIGZ1bmN0aW9uIC4qL1xuICAgICAgbGFzdF9zdGF0ZSA9IHNwcmluZ0ludGVncmF0ZVN0YXRlKGxhc3Rfc3RhdGUgfHwgaW5pdFN0YXRlLCBkdCk7XG4gICAgICAvKiBTdG9yZSB0aGUgcG9zaXRpb24uICovXG4gICAgICBwYXRoLnB1c2goMSArIGxhc3Rfc3RhdGUueCk7XG4gICAgICB0aW1lX2xhcHNlZCArPSAxNjtcbiAgICAgIC8qIElmIHRoZSBjaGFuZ2UgdGhyZXNob2xkIGlzIHJlYWNoZWQsIGJyZWFrLiAqL1xuICAgICAgaWYgKCEoTWF0aC5hYnMobGFzdF9zdGF0ZS54KSA+IHRvbGVyYW5jZSAmJiBNYXRoLmFicyhsYXN0X3N0YXRlLnYpID4gdG9sZXJhbmNlKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJZiBkdXJhdGlvbiBpcyBub3QgZGVmaW5lZCwgcmV0dXJuIHRoZSBhY3R1YWwgdGltZSByZXF1aXJlZCBmb3IgY29tcGxldGluZyB0aGlzIGFuaW1hdGlvbi4gT3RoZXJ3aXNlLCByZXR1cm4gYSBjbG9zdXJlIHRoYXQgaG9sZHMgdGhlXG4gICAgICAgY29tcHV0ZWQgcGF0aCBhbmQgcmV0dXJucyBhIHNuYXBzaG90IG9mIHRoZSBwb3NpdGlvbiBhY2NvcmRpbmcgdG8gYSBnaXZlbiBwZXJjZW50Q29tcGxldGUuICovXG4gICAgcmV0dXJuICFoYXZlX2R1cmF0aW9uID8gdGltZV9sYXBzZWQgOiBmdW5jdGlvbiAocGVyY2VudENvbXBsZXRlKSB7XG4gICAgICByZXR1cm4gcGF0aFtwZXJjZW50Q29tcGxldGUgKiAocGF0aC5sZW5ndGggLSAxKSB8IDBdO1xuICAgIH07XG4gIH07XG59KCk7XG5cbnZhciBjdWJpY0JlemllciA9IGZ1bmN0aW9uIGN1YmljQmV6aWVyKHQxLCBwMSwgdDIsIHAyKSB7XG4gIHZhciBiZXppZXIgPSBnZW5lcmF0ZUN1YmljQmV6aWVyKHQxLCBwMSwgdDIsIHAyKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzdGFydCwgZW5kLCBwZXJjZW50KSB7XG4gICAgcmV0dXJuIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIGJlemllcihwZXJjZW50KTtcbiAgfTtcbn07XG52YXIgZWFzaW5ncyA9IHtcbiAgJ2xpbmVhcic6IGZ1bmN0aW9uIGxpbmVhcihzdGFydCwgZW5kLCBwZXJjZW50KSB7XG4gICAgcmV0dXJuIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIHBlcmNlbnQ7XG4gIH0sXG4gIC8vIGRlZmF1bHQgZWFzaW5nc1xuICAnZWFzZSc6IGN1YmljQmV6aWVyKDAuMjUsIDAuMSwgMC4yNSwgMSksXG4gICdlYXNlLWluJzogY3ViaWNCZXppZXIoMC40MiwgMCwgMSwgMSksXG4gICdlYXNlLW91dCc6IGN1YmljQmV6aWVyKDAsIDAsIDAuNTgsIDEpLFxuICAnZWFzZS1pbi1vdXQnOiBjdWJpY0JlemllcigwLjQyLCAwLCAwLjU4LCAxKSxcbiAgLy8gc2luZVxuICAnZWFzZS1pbi1zaW5lJzogY3ViaWNCZXppZXIoMC40NywgMCwgMC43NDUsIDAuNzE1KSxcbiAgJ2Vhc2Utb3V0LXNpbmUnOiBjdWJpY0JlemllcigwLjM5LCAwLjU3NSwgMC41NjUsIDEpLFxuICAnZWFzZS1pbi1vdXQtc2luZSc6IGN1YmljQmV6aWVyKDAuNDQ1LCAwLjA1LCAwLjU1LCAwLjk1KSxcbiAgLy8gcXVhZFxuICAnZWFzZS1pbi1xdWFkJzogY3ViaWNCZXppZXIoMC41NSwgMC4wODUsIDAuNjgsIDAuNTMpLFxuICAnZWFzZS1vdXQtcXVhZCc6IGN1YmljQmV6aWVyKDAuMjUsIDAuNDYsIDAuNDUsIDAuOTQpLFxuICAnZWFzZS1pbi1vdXQtcXVhZCc6IGN1YmljQmV6aWVyKDAuNDU1LCAwLjAzLCAwLjUxNSwgMC45NTUpLFxuICAvLyBjdWJpY1xuICAnZWFzZS1pbi1jdWJpYyc6IGN1YmljQmV6aWVyKDAuNTUsIDAuMDU1LCAwLjY3NSwgMC4xOSksXG4gICdlYXNlLW91dC1jdWJpYyc6IGN1YmljQmV6aWVyKDAuMjE1LCAwLjYxLCAwLjM1NSwgMSksXG4gICdlYXNlLWluLW91dC1jdWJpYyc6IGN1YmljQmV6aWVyKDAuNjQ1LCAwLjA0NSwgMC4zNTUsIDEpLFxuICAvLyBxdWFydFxuICAnZWFzZS1pbi1xdWFydCc6IGN1YmljQmV6aWVyKDAuODk1LCAwLjAzLCAwLjY4NSwgMC4yMiksXG4gICdlYXNlLW91dC1xdWFydCc6IGN1YmljQmV6aWVyKDAuMTY1LCAwLjg0LCAwLjQ0LCAxKSxcbiAgJ2Vhc2UtaW4tb3V0LXF1YXJ0JzogY3ViaWNCZXppZXIoMC43NywgMCwgMC4xNzUsIDEpLFxuICAvLyBxdWludFxuICAnZWFzZS1pbi1xdWludCc6IGN1YmljQmV6aWVyKDAuNzU1LCAwLjA1LCAwLjg1NSwgMC4wNiksXG4gICdlYXNlLW91dC1xdWludCc6IGN1YmljQmV6aWVyKDAuMjMsIDEsIDAuMzIsIDEpLFxuICAnZWFzZS1pbi1vdXQtcXVpbnQnOiBjdWJpY0JlemllcigwLjg2LCAwLCAwLjA3LCAxKSxcbiAgLy8gZXhwb1xuICAnZWFzZS1pbi1leHBvJzogY3ViaWNCZXppZXIoMC45NSwgMC4wNSwgMC43OTUsIDAuMDM1KSxcbiAgJ2Vhc2Utb3V0LWV4cG8nOiBjdWJpY0JlemllcigwLjE5LCAxLCAwLjIyLCAxKSxcbiAgJ2Vhc2UtaW4tb3V0LWV4cG8nOiBjdWJpY0JlemllcigxLCAwLCAwLCAxKSxcbiAgLy8gY2lyY1xuICAnZWFzZS1pbi1jaXJjJzogY3ViaWNCZXppZXIoMC42LCAwLjA0LCAwLjk4LCAwLjMzNSksXG4gICdlYXNlLW91dC1jaXJjJzogY3ViaWNCZXppZXIoMC4wNzUsIDAuODIsIDAuMTY1LCAxKSxcbiAgJ2Vhc2UtaW4tb3V0LWNpcmMnOiBjdWJpY0JlemllcigwLjc4NSwgMC4xMzUsIDAuMTUsIDAuODYpLFxuICAvLyB1c2VyIHBhcmFtIGVhc2luZ3MuLi5cblxuICAnc3ByaW5nJzogZnVuY3Rpb24gc3ByaW5nKHRlbnNpb24sIGZyaWN0aW9uLCBkdXJhdGlvbikge1xuICAgIGlmIChkdXJhdGlvbiA9PT0gMCkge1xuICAgICAgLy8gY2FuJ3QgZ2V0IGEgc3ByaW5nIHcvIGR1cmF0aW9uIDBcbiAgICAgIHJldHVybiBlYXNpbmdzLmxpbmVhcjsgLy8gZHVyYXRpb24gMCA9PiBqdW1wIHRvIGVuZCBzbyBpbXBsIGRvZXNuJ3QgbWF0dGVyXG4gICAgfVxuXG4gICAgdmFyIHNwcmluZyA9IGdlbmVyYXRlU3ByaW5nUks0KHRlbnNpb24sIGZyaWN0aW9uLCBkdXJhdGlvbik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGFydCwgZW5kLCBwZXJjZW50KSB7XG4gICAgICByZXR1cm4gc3RhcnQgKyAoZW5kIC0gc3RhcnQpICogc3ByaW5nKHBlcmNlbnQpO1xuICAgIH07XG4gIH0sXG4gICdjdWJpYy1iZXppZXInOiBjdWJpY0JlemllclxufTtcblxuZnVuY3Rpb24gZ2V0RWFzZWRWYWx1ZSh0eXBlLCBzdGFydCwgZW5kLCBwZXJjZW50LCBlYXNpbmdGbikge1xuICBpZiAocGVyY2VudCA9PT0gMSkge1xuICAgIHJldHVybiBlbmQ7XG4gIH1cbiAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcbiAgICByZXR1cm4gZW5kO1xuICB9XG4gIHZhciB2YWwgPSBlYXNpbmdGbihzdGFydCwgZW5kLCBwZXJjZW50KTtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgaWYgKHR5cGUucm91bmRWYWx1ZSB8fCB0eXBlLmNvbG9yKSB7XG4gICAgdmFsID0gTWF0aC5yb3VuZCh2YWwpO1xuICB9XG4gIGlmICh0eXBlLm1pbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsID0gTWF0aC5tYXgodmFsLCB0eXBlLm1pbik7XG4gIH1cbiAgaWYgKHR5cGUubWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWwgPSBNYXRoLm1pbih2YWwsIHR5cGUubWF4KTtcbiAgfVxuICByZXR1cm4gdmFsO1xufVxuZnVuY3Rpb24gZ2V0VmFsdWUocHJvcCwgc3BlYykge1xuICBpZiAocHJvcC5wZlZhbHVlICE9IG51bGwgfHwgcHJvcC52YWx1ZSAhPSBudWxsKSB7XG4gICAgaWYgKHByb3AucGZWYWx1ZSAhPSBudWxsICYmIChzcGVjID09IG51bGwgfHwgc3BlYy50eXBlLnVuaXRzICE9PSAnJScpKSB7XG4gICAgICByZXR1cm4gcHJvcC5wZlZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJvcC52YWx1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHByb3A7XG4gIH1cbn1cbmZ1bmN0aW9uIGVhc2Uoc3RhcnRQcm9wLCBlbmRQcm9wLCBwZXJjZW50LCBlYXNpbmdGbiwgcHJvcFNwZWMpIHtcbiAgdmFyIHR5cGUgPSBwcm9wU3BlYyAhPSBudWxsID8gcHJvcFNwZWMudHlwZSA6IG51bGw7XG4gIGlmIChwZXJjZW50IDwgMCkge1xuICAgIHBlcmNlbnQgPSAwO1xuICB9IGVsc2UgaWYgKHBlcmNlbnQgPiAxKSB7XG4gICAgcGVyY2VudCA9IDE7XG4gIH1cbiAgdmFyIHN0YXJ0ID0gZ2V0VmFsdWUoc3RhcnRQcm9wLCBwcm9wU3BlYyk7XG4gIHZhciBlbmQgPSBnZXRWYWx1ZShlbmRQcm9wLCBwcm9wU3BlYyk7XG4gIGlmIChudW1iZXIkMShzdGFydCkgJiYgbnVtYmVyJDEoZW5kKSkge1xuICAgIHJldHVybiBnZXRFYXNlZFZhbHVlKHR5cGUsIHN0YXJ0LCBlbmQsIHBlcmNlbnQsIGVhc2luZ0ZuKTtcbiAgfSBlbHNlIGlmIChhcnJheShzdGFydCkgJiYgYXJyYXkoZW5kKSkge1xuICAgIHZhciBlYXNlZEFyciA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5kLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2kgPSBzdGFydFtpXTtcbiAgICAgIHZhciBlaSA9IGVuZFtpXTtcbiAgICAgIGlmIChzaSAhPSBudWxsICYmIGVpICE9IG51bGwpIHtcbiAgICAgICAgdmFyIHZhbCA9IGdldEVhc2VkVmFsdWUodHlwZSwgc2ksIGVpLCBwZXJjZW50LCBlYXNpbmdGbik7XG4gICAgICAgIGVhc2VkQXJyLnB1c2godmFsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVhc2VkQXJyLnB1c2goZWkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWFzZWRBcnI7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RlcCQxKHNlbGYsIGFuaSwgbm93LCBpc0NvcmUpIHtcbiAgdmFyIGlzRWxlcyA9ICFpc0NvcmU7XG4gIHZhciBfcCA9IHNlbGYuX3ByaXZhdGU7XG4gIHZhciBhbmlfcCA9IGFuaS5fcHJpdmF0ZTtcbiAgdmFyIHBFYXNpbmcgPSBhbmlfcC5lYXNpbmc7XG4gIHZhciBzdGFydFRpbWUgPSBhbmlfcC5zdGFydFRpbWU7XG4gIHZhciBjeSA9IGlzQ29yZSA/IHNlbGYgOiBzZWxmLmN5KCk7XG4gIHZhciBzdHlsZSA9IGN5LnN0eWxlKCk7XG4gIGlmICghYW5pX3AuZWFzaW5nSW1wbCkge1xuICAgIGlmIChwRWFzaW5nID09IG51bGwpIHtcbiAgICAgIC8vIHVzZSBkZWZhdWx0XG4gICAgICBhbmlfcC5lYXNpbmdJbXBsID0gZWFzaW5nc1snbGluZWFyJ107XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZW4gZGVmaW5lIHcvIG5hbWVcbiAgICAgIHZhciBlYXNpbmdWYWxzO1xuICAgICAgaWYgKHN0cmluZyhwRWFzaW5nKSkge1xuICAgICAgICB2YXIgZWFzaW5nUHJvcCA9IHN0eWxlLnBhcnNlKCd0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbicsIHBFYXNpbmcpO1xuICAgICAgICBlYXNpbmdWYWxzID0gZWFzaW5nUHJvcC52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRoZW4gYXNzdW1lIHByZXBhcnNlZCBhcnJheVxuICAgICAgICBlYXNpbmdWYWxzID0gcEVhc2luZztcbiAgICAgIH1cbiAgICAgIHZhciBuYW1lLCBhcmdzO1xuICAgICAgaWYgKHN0cmluZyhlYXNpbmdWYWxzKSkge1xuICAgICAgICBuYW1lID0gZWFzaW5nVmFscztcbiAgICAgICAgYXJncyA9IFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmFtZSA9IGVhc2luZ1ZhbHNbMV07XG4gICAgICAgIGFyZ3MgPSBlYXNpbmdWYWxzLnNsaWNlKDIpLm1hcChmdW5jdGlvbiAobikge1xuICAgICAgICAgIHJldHVybiArbjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIGNyZWF0ZSB3aXRoIGFyZ3NcbiAgICAgICAgaWYgKG5hbWUgPT09ICdzcHJpbmcnKSB7XG4gICAgICAgICAgYXJncy5wdXNoKGFuaV9wLmR1cmF0aW9uKTsgLy8gbmVlZCBkdXJhdGlvbiB0byBnZW5lcmF0ZSBzcHJpbmdcbiAgICAgICAgfVxuXG4gICAgICAgIGFuaV9wLmVhc2luZ0ltcGwgPSBlYXNpbmdzW25hbWVdLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc3RhdGljIGltcGwgYnkgbmFtZVxuICAgICAgICBhbmlfcC5lYXNpbmdJbXBsID0gZWFzaW5nc1tuYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIGVhc2luZyA9IGFuaV9wLmVhc2luZ0ltcGw7XG4gIHZhciBwZXJjZW50O1xuICBpZiAoYW5pX3AuZHVyYXRpb24gPT09IDApIHtcbiAgICBwZXJjZW50ID0gMTtcbiAgfSBlbHNlIHtcbiAgICBwZXJjZW50ID0gKG5vdyAtIHN0YXJ0VGltZSkgLyBhbmlfcC5kdXJhdGlvbjtcbiAgfVxuICBpZiAoYW5pX3AuYXBwbHlpbmcpIHtcbiAgICBwZXJjZW50ID0gYW5pX3AucHJvZ3Jlc3M7XG4gIH1cbiAgaWYgKHBlcmNlbnQgPCAwKSB7XG4gICAgcGVyY2VudCA9IDA7XG4gIH0gZWxzZSBpZiAocGVyY2VudCA+IDEpIHtcbiAgICBwZXJjZW50ID0gMTtcbiAgfVxuICBpZiAoYW5pX3AuZGVsYXkgPT0gbnVsbCkge1xuICAgIC8vIHRoZW4gdXBkYXRlXG5cbiAgICB2YXIgc3RhcnRQb3MgPSBhbmlfcC5zdGFydFBvc2l0aW9uO1xuICAgIHZhciBlbmRQb3MgPSBhbmlfcC5wb3NpdGlvbjtcbiAgICBpZiAoZW5kUG9zICYmIGlzRWxlcyAmJiAhc2VsZi5sb2NrZWQoKSkge1xuICAgICAgdmFyIG5ld1BvcyA9IHt9O1xuICAgICAgaWYgKHZhbGlkKHN0YXJ0UG9zLngsIGVuZFBvcy54KSkge1xuICAgICAgICBuZXdQb3MueCA9IGVhc2Uoc3RhcnRQb3MueCwgZW5kUG9zLngsIHBlcmNlbnQsIGVhc2luZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsaWQoc3RhcnRQb3MueSwgZW5kUG9zLnkpKSB7XG4gICAgICAgIG5ld1Bvcy55ID0gZWFzZShzdGFydFBvcy55LCBlbmRQb3MueSwgcGVyY2VudCwgZWFzaW5nKTtcbiAgICAgIH1cbiAgICAgIHNlbGYucG9zaXRpb24obmV3UG9zKTtcbiAgICB9XG4gICAgdmFyIHN0YXJ0UGFuID0gYW5pX3Auc3RhcnRQYW47XG4gICAgdmFyIGVuZFBhbiA9IGFuaV9wLnBhbjtcbiAgICB2YXIgcGFuID0gX3AucGFuO1xuICAgIHZhciBhbmltYXRpbmdQYW4gPSBlbmRQYW4gIT0gbnVsbCAmJiBpc0NvcmU7XG4gICAgaWYgKGFuaW1hdGluZ1Bhbikge1xuICAgICAgaWYgKHZhbGlkKHN0YXJ0UGFuLngsIGVuZFBhbi54KSkge1xuICAgICAgICBwYW4ueCA9IGVhc2Uoc3RhcnRQYW4ueCwgZW5kUGFuLngsIHBlcmNlbnQsIGVhc2luZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsaWQoc3RhcnRQYW4ueSwgZW5kUGFuLnkpKSB7XG4gICAgICAgIHBhbi55ID0gZWFzZShzdGFydFBhbi55LCBlbmRQYW4ueSwgcGVyY2VudCwgZWFzaW5nKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuZW1pdCgncGFuJyk7XG4gICAgfVxuICAgIHZhciBzdGFydFpvb20gPSBhbmlfcC5zdGFydFpvb207XG4gICAgdmFyIGVuZFpvb20gPSBhbmlfcC56b29tO1xuICAgIHZhciBhbmltYXRpbmdab29tID0gZW5kWm9vbSAhPSBudWxsICYmIGlzQ29yZTtcbiAgICBpZiAoYW5pbWF0aW5nWm9vbSkge1xuICAgICAgaWYgKHZhbGlkKHN0YXJ0Wm9vbSwgZW5kWm9vbSkpIHtcbiAgICAgICAgX3Auem9vbSA9IGJvdW5kKF9wLm1pblpvb20sIGVhc2Uoc3RhcnRab29tLCBlbmRab29tLCBwZXJjZW50LCBlYXNpbmcpLCBfcC5tYXhab29tKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuZW1pdCgnem9vbScpO1xuICAgIH1cbiAgICBpZiAoYW5pbWF0aW5nUGFuIHx8IGFuaW1hdGluZ1pvb20pIHtcbiAgICAgIHNlbGYuZW1pdCgndmlld3BvcnQnKTtcbiAgICB9XG4gICAgdmFyIHByb3BzID0gYW5pX3Auc3R5bGU7XG4gICAgaWYgKHByb3BzICYmIHByb3BzLmxlbmd0aCA+IDAgJiYgaXNFbGVzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwcm9wID0gcHJvcHNbaV07XG4gICAgICAgIHZhciBfbmFtZSA9IHByb3AubmFtZTtcbiAgICAgICAgdmFyIGVuZCA9IHByb3A7XG4gICAgICAgIHZhciBzdGFydCA9IGFuaV9wLnN0YXJ0U3R5bGVbX25hbWVdO1xuICAgICAgICB2YXIgcHJvcFNwZWMgPSBzdHlsZS5wcm9wZXJ0aWVzW3N0YXJ0Lm5hbWVdO1xuICAgICAgICB2YXIgZWFzZWRWYWwgPSBlYXNlKHN0YXJ0LCBlbmQsIHBlcmNlbnQsIGVhc2luZywgcHJvcFNwZWMpO1xuICAgICAgICBzdHlsZS5vdmVycmlkZUJ5cGFzcyhzZWxmLCBfbmFtZSwgZWFzZWRWYWwpO1xuICAgICAgfSAvLyBmb3IgcHJvcHNcblxuICAgICAgc2VsZi5lbWl0KCdzdHlsZScpO1xuICAgIH0gLy8gaWZcbiAgfVxuXG4gIGFuaV9wLnByb2dyZXNzID0gcGVyY2VudDtcbiAgcmV0dXJuIHBlcmNlbnQ7XG59XG5mdW5jdGlvbiB2YWxpZChzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PSBudWxsIHx8IGVuZCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChudW1iZXIkMShzdGFydCkgJiYgbnVtYmVyJDEoZW5kKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKHN0YXJ0ICYmIGVuZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gc3RhcnRBbmltYXRpb24oc2VsZiwgYW5pLCBub3csIGlzQ29yZSkge1xuICB2YXIgYW5pX3AgPSBhbmkuX3ByaXZhdGU7XG4gIGFuaV9wLnN0YXJ0ZWQgPSB0cnVlO1xuICBhbmlfcC5zdGFydFRpbWUgPSBub3cgLSBhbmlfcC5wcm9ncmVzcyAqIGFuaV9wLmR1cmF0aW9uO1xufVxuXG5mdW5jdGlvbiBzdGVwQWxsKG5vdywgY3kpIHtcbiAgdmFyIGVsZXMgPSBjeS5fcHJpdmF0ZS5hbmlFbGVzO1xuICB2YXIgZG9uZUVsZXMgPSBbXTtcbiAgZnVuY3Rpb24gc3RlcE9uZShlbGUsIGlzQ29yZSkge1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgY3VycmVudCA9IF9wLmFuaW1hdGlvbi5jdXJyZW50O1xuICAgIHZhciBxdWV1ZSA9IF9wLmFuaW1hdGlvbi5xdWV1ZTtcbiAgICB2YXIgcmFuQW5pcyA9IGZhbHNlO1xuXG4gICAgLy8gaWYgbm90aGluZyBjdXJyZW50bHkgYW5pbWF0aW5nLCBnZXQgc29tZXRoaW5nIGZyb20gdGhlIHF1ZXVlXG4gICAgaWYgKGN1cnJlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICB2YXIgbmV4dCA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICBpZiAobmV4dCkge1xuICAgICAgICBjdXJyZW50LnB1c2gobmV4dCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBjYWxsYmFja3MgPSBmdW5jdGlvbiBjYWxsYmFja3MoX2NhbGxiYWNrcykge1xuICAgICAgZm9yICh2YXIgaiA9IF9jYWxsYmFja3MubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgdmFyIGNiID0gX2NhbGxiYWNrc1tqXTtcbiAgICAgICAgY2IoKTtcbiAgICAgIH1cbiAgICAgIF9jYWxsYmFja3Muc3BsaWNlKDAsIF9jYWxsYmFja3MubGVuZ3RoKTtcbiAgICB9O1xuXG4gICAgLy8gc3RlcCBhbmQgcmVtb3ZlIGlmIGRvbmVcbiAgICBmb3IgKHZhciBpID0gY3VycmVudC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGFuaSA9IGN1cnJlbnRbaV07XG4gICAgICB2YXIgYW5pX3AgPSBhbmkuX3ByaXZhdGU7XG4gICAgICBpZiAoYW5pX3Auc3RvcHBlZCkge1xuICAgICAgICBjdXJyZW50LnNwbGljZShpLCAxKTtcbiAgICAgICAgYW5pX3AuaG9va2VkID0gZmFsc2U7XG4gICAgICAgIGFuaV9wLnBsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgYW5pX3Auc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICBjYWxsYmFja3MoYW5pX3AuZnJhbWVzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIWFuaV9wLnBsYXlpbmcgJiYgIWFuaV9wLmFwcGx5aW5nKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBhbiBhcHBseSgpIHdoaWxlIHBsYXlpbmcgc2hvdWxkbid0IGRvIGFueXRoaW5nXG4gICAgICBpZiAoYW5pX3AucGxheWluZyAmJiBhbmlfcC5hcHBseWluZykge1xuICAgICAgICBhbmlfcC5hcHBseWluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCFhbmlfcC5zdGFydGVkKSB7XG4gICAgICAgIHN0YXJ0QW5pbWF0aW9uKGVsZSwgYW5pLCBub3cpO1xuICAgICAgfVxuICAgICAgc3RlcCQxKGVsZSwgYW5pLCBub3csIGlzQ29yZSk7XG4gICAgICBpZiAoYW5pX3AuYXBwbHlpbmcpIHtcbiAgICAgICAgYW5pX3AuYXBwbHlpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrcyhhbmlfcC5mcmFtZXMpO1xuICAgICAgaWYgKGFuaV9wLnN0ZXAgIT0gbnVsbCkge1xuICAgICAgICBhbmlfcC5zdGVwKG5vdyk7XG4gICAgICB9XG4gICAgICBpZiAoYW5pLmNvbXBsZXRlZCgpKSB7XG4gICAgICAgIGN1cnJlbnQuc3BsaWNlKGksIDEpO1xuICAgICAgICBhbmlfcC5ob29rZWQgPSBmYWxzZTtcbiAgICAgICAgYW5pX3AucGxheWluZyA9IGZhbHNlO1xuICAgICAgICBhbmlfcC5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIGNhbGxiYWNrcyhhbmlfcC5jb21wbGV0ZXMpO1xuICAgICAgfVxuICAgICAgcmFuQW5pcyA9IHRydWU7XG4gICAgfVxuICAgIGlmICghaXNDb3JlICYmIGN1cnJlbnQubGVuZ3RoID09PSAwICYmIHF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZG9uZUVsZXMucHVzaChlbGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmFuQW5pcztcbiAgfSAvLyBzdGVwRWxlbWVudFxuXG4gIC8vIGhhbmRsZSBhbGwgZWxlc1xuICB2YXIgcmFuRWxlQW5pID0gZmFsc2U7XG4gIGZvciAodmFyIGUgPSAwOyBlIDwgZWxlcy5sZW5ndGg7IGUrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2VdO1xuICAgIHZhciBoYW5kbGVkVGhpc0VsZSA9IHN0ZXBPbmUoZWxlKTtcbiAgICByYW5FbGVBbmkgPSByYW5FbGVBbmkgfHwgaGFuZGxlZFRoaXNFbGU7XG4gIH0gLy8gZWFjaCBlbGVtZW50XG5cbiAgdmFyIHJhbkNvcmVBbmkgPSBzdGVwT25lKGN5LCB0cnVlKTtcblxuICAvLyBub3RpZnkgcmVuZGVyZXJcbiAgaWYgKHJhbkVsZUFuaSB8fCByYW5Db3JlQW5pKSB7XG4gICAgaWYgKGVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgY3kubm90aWZ5KCdkcmF3JywgZWxlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN5Lm5vdGlmeSgnZHJhdycpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlbW92ZSBlbGVtZW50cyBmcm9tIGxpc3Qgb2YgY3VycmVudGx5IGFuaW1hdGluZyBpZiBpdHMgcXVldWVzIGFyZSBlbXB0eVxuICBlbGVzLnVubWVyZ2UoZG9uZUVsZXMpO1xuICBjeS5lbWl0KCdzdGVwJyk7XG59IC8vIHN0ZXBBbGxcblxudmFyIGNvcmVmbiQ4ID0ge1xuICAvLyBwdWxsIGluIGFuaW1hdGlvbiBmdW5jdGlvbnNcbiAgYW5pbWF0ZTogZGVmaW5lLmFuaW1hdGUoKSxcbiAgYW5pbWF0aW9uOiBkZWZpbmUuYW5pbWF0aW9uKCksXG4gIGFuaW1hdGVkOiBkZWZpbmUuYW5pbWF0ZWQoKSxcbiAgY2xlYXJRdWV1ZTogZGVmaW5lLmNsZWFyUXVldWUoKSxcbiAgZGVsYXk6IGRlZmluZS5kZWxheSgpLFxuICBkZWxheUFuaW1hdGlvbjogZGVmaW5lLmRlbGF5QW5pbWF0aW9uKCksXG4gIHN0b3A6IGRlZmluZS5zdG9wKCksXG4gIGFkZFRvQW5pbWF0aW9uUG9vbDogZnVuY3Rpb24gYWRkVG9BbmltYXRpb25Qb29sKGVsZXMpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIHNhdmUgY3ljbGVzIHdoZW4gbm8gc3R5bGUgdXNlZFxuXG4gICAgY3kuX3ByaXZhdGUuYW5pRWxlcy5tZXJnZShlbGVzKTtcbiAgfSxcbiAgc3RvcEFuaW1hdGlvbkxvb3A6IGZ1bmN0aW9uIHN0b3BBbmltYXRpb25Mb29wKCkge1xuICAgIHRoaXMuX3ByaXZhdGUuYW5pbWF0aW9uc1J1bm5pbmcgPSBmYWxzZTtcbiAgfSxcbiAgc3RhcnRBbmltYXRpb25Mb29wOiBmdW5jdGlvbiBzdGFydEFuaW1hdGlvbkxvb3AoKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICBjeS5fcHJpdmF0ZS5hbmltYXRpb25zUnVubmluZyA9IHRydWU7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gc2F2ZSBjeWNsZXMgd2hlbiBubyBzdHlsZSB1c2VkXG5cbiAgICAvLyBOQiB0aGUgYW5pbWF0aW9uIGxvb3Agd2lsbCBleGVjIGluIGhlYWRsZXNzIGVudmlyb25tZW50cyBpZiBzdHlsZSBlbmFibGVkXG4gICAgLy8gYW5kIGV4cGxpY2l0IGN5LmRlc3Ryb3koKSBpcyBuZWNlc3NhcnkgdG8gc3RvcCB0aGUgbG9vcFxuXG4gICAgZnVuY3Rpb24gaGVhZGxlc3NTdGVwKCkge1xuICAgICAgaWYgKCFjeS5fcHJpdmF0ZS5hbmltYXRpb25zUnVubmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gYW5pbWF0aW9uU3RlcChub3cpIHtcbiAgICAgICAgc3RlcEFsbChub3csIGN5KTtcbiAgICAgICAgaGVhZGxlc3NTdGVwKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIHJlbmRlcmVyID0gY3kucmVuZGVyZXIoKTtcbiAgICBpZiAocmVuZGVyZXIgJiYgcmVuZGVyZXIuYmVmb3JlUmVuZGVyKSB7XG4gICAgICAvLyBsZXQgdGhlIHJlbmRlcmVyIHNjaGVkdWxlIGFuaW1hdGlvbnNcbiAgICAgIHJlbmRlcmVyLmJlZm9yZVJlbmRlcihmdW5jdGlvbiByZW5kZXJlckFuaW1hdGlvblN0ZXAod2lsbERyYXcsIG5vdykge1xuICAgICAgICBzdGVwQWxsKG5vdywgY3kpO1xuICAgICAgfSwgcmVuZGVyZXIuYmVmb3JlUmVuZGVyUHJpb3JpdGllcy5hbmltYXRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbWFuYWdlIHRoZSBhbmltYXRpb24gbG9vcCBvdXJzZWx2ZXNcbiAgICAgIGhlYWRsZXNzU3RlcCgpOyAvLyBmaXJzdCBjYWxsXG4gICAgfVxuICB9XG59O1xuXG52YXIgZW1pdHRlck9wdGlvbnMgPSB7XG4gIHF1YWxpZmllckNvbXBhcmU6IGZ1bmN0aW9uIHF1YWxpZmllckNvbXBhcmUoc2VsZWN0b3IxLCBzZWxlY3RvcjIpIHtcbiAgICBpZiAoc2VsZWN0b3IxID09IG51bGwgfHwgc2VsZWN0b3IyID09IG51bGwpIHtcbiAgICAgIHJldHVybiBzZWxlY3RvcjEgPT0gbnVsbCAmJiBzZWxlY3RvcjIgPT0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNlbGVjdG9yMS5zYW1lVGV4dChzZWxlY3RvcjIpO1xuICAgIH1cbiAgfSxcbiAgZXZlbnRNYXRjaGVzOiBmdW5jdGlvbiBldmVudE1hdGNoZXMoY3ksIGxpc3RlbmVyLCBldmVudE9iaikge1xuICAgIHZhciBzZWxlY3RvciA9IGxpc3RlbmVyLnF1YWxpZmllcjtcbiAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGN5ICE9PSBldmVudE9iai50YXJnZXQgJiYgZWxlbWVudChldmVudE9iai50YXJnZXQpICYmIHNlbGVjdG9yLm1hdGNoZXMoZXZlbnRPYmoudGFyZ2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGFkZEV2ZW50RmllbGRzOiBmdW5jdGlvbiBhZGRFdmVudEZpZWxkcyhjeSwgZXZ0KSB7XG4gICAgZXZ0LmN5ID0gY3k7XG4gICAgZXZ0LnRhcmdldCA9IGN5O1xuICB9LFxuICBjYWxsYmFja0NvbnRleHQ6IGZ1bmN0aW9uIGNhbGxiYWNrQ29udGV4dChjeSwgbGlzdGVuZXIsIGV2ZW50T2JqKSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyLnF1YWxpZmllciAhPSBudWxsID8gZXZlbnRPYmoudGFyZ2V0IDogY3k7XG4gIH1cbn07XG52YXIgYXJnU2VsZWN0b3IgPSBmdW5jdGlvbiBhcmdTZWxlY3RvcihhcmcpIHtcbiAgaWYgKHN0cmluZyhhcmcpKSB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3RvcihhcmcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhcmc7XG4gIH1cbn07XG52YXIgZWxlc2ZuID0ge1xuICBjcmVhdGVFbWl0dGVyOiBmdW5jdGlvbiBjcmVhdGVFbWl0dGVyKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgaWYgKCFfcC5lbWl0dGVyKSB7XG4gICAgICBfcC5lbWl0dGVyID0gbmV3IEVtaXR0ZXIoZW1pdHRlck9wdGlvbnMsIHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZW1pdHRlcjogZnVuY3Rpb24gZW1pdHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbWl0dGVyO1xuICB9LFxuICBvbjogZnVuY3Rpb24gb24oZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5vbihldmVudHMsIGFyZ1NlbGVjdG9yKHNlbGVjdG9yKSwgY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5yZW1vdmVMaXN0ZW5lcihldmVudHMsIGFyZ1NlbGVjdG9yKHNlbGVjdG9yKSwgY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW1vdmVBbGxMaXN0ZW5lcnM6IGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycygpIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgb25lOiBmdW5jdGlvbiBvbmUoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5vbmUoZXZlbnRzLCBhcmdTZWxlY3RvcihzZWxlY3RvciksIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgb25jZTogZnVuY3Rpb24gb25jZShldmVudHMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIHRoaXMuZW1pdHRlcigpLm9uZShldmVudHMsIGFyZ1NlbGVjdG9yKHNlbGVjdG9yKSwgY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBlbWl0OiBmdW5jdGlvbiBlbWl0KGV2ZW50cywgZXh0cmFQYXJhbXMpIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5lbWl0KGV2ZW50cywgZXh0cmFQYXJhbXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBlbWl0QW5kTm90aWZ5OiBmdW5jdGlvbiBlbWl0QW5kTm90aWZ5KGV2ZW50LCBlbGVzKSB7XG4gICAgdGhpcy5lbWl0KGV2ZW50KTtcbiAgICB0aGlzLm5vdGlmeShldmVudCwgZWxlcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn07XG5kZWZpbmUuZXZlbnRBbGlhc2VzT24oZWxlc2ZuKTtcblxudmFyIGNvcmVmbiQ3ID0ge1xuICBwbmc6IGZ1bmN0aW9uIHBuZyhvcHRpb25zKSB7XG4gICAgdmFyIHJlbmRlcmVyID0gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlcjtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gcmVuZGVyZXIucG5nKG9wdGlvbnMpO1xuICB9LFxuICBqcGc6IGZ1bmN0aW9uIGpwZyhvcHRpb25zKSB7XG4gICAgdmFyIHJlbmRlcmVyID0gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlcjtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLmJnID0gb3B0aW9ucy5iZyB8fCAnI2ZmZic7XG4gICAgcmV0dXJuIHJlbmRlcmVyLmpwZyhvcHRpb25zKTtcbiAgfVxufTtcbmNvcmVmbiQ3LmpwZWcgPSBjb3JlZm4kNy5qcGc7XG5cbnZhciBjb3JlZm4kNiA9IHtcbiAgbGF5b3V0OiBmdW5jdGlvbiBsYXlvdXQob3B0aW9ucykge1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0xheW91dCBvcHRpb25zIG11c3QgYmUgc3BlY2lmaWVkIHRvIG1ha2UgYSBsYXlvdXQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubmFtZSA9PSBudWxsKSB7XG4gICAgICBlcnJvcignQSBgbmFtZWAgbXVzdCBiZSBzcGVjaWZpZWQgdG8gbWFrZSBhIGxheW91dCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgICB2YXIgTGF5b3V0ID0gY3kuZXh0ZW5zaW9uKCdsYXlvdXQnLCBuYW1lKTtcbiAgICBpZiAoTGF5b3V0ID09IG51bGwpIHtcbiAgICAgIGVycm9yKCdObyBzdWNoIGxheW91dCBgJyArIG5hbWUgKyAnYCBmb3VuZC4gIERpZCB5b3UgZm9yZ2V0IHRvIGltcG9ydCBpdCBhbmQgYGN5dG9zY2FwZS51c2UoKWAgaXQ/Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBlbGVzO1xuICAgIGlmIChzdHJpbmcob3B0aW9ucy5lbGVzKSkge1xuICAgICAgZWxlcyA9IGN5LiQob3B0aW9ucy5lbGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlcyA9IG9wdGlvbnMuZWxlcyAhPSBudWxsID8gb3B0aW9ucy5lbGVzIDogY3kuJCgpO1xuICAgIH1cbiAgICB2YXIgbGF5b3V0ID0gbmV3IExheW91dChleHRlbmQoe30sIG9wdGlvbnMsIHtcbiAgICAgIGN5OiBjeSxcbiAgICAgIGVsZXM6IGVsZXNcbiAgICB9KSk7XG4gICAgcmV0dXJuIGxheW91dDtcbiAgfVxufTtcbmNvcmVmbiQ2LmNyZWF0ZUxheW91dCA9IGNvcmVmbiQ2Lm1ha2VMYXlvdXQgPSBjb3JlZm4kNi5sYXlvdXQ7XG5cbnZhciBjb3JlZm4kNSA9IHtcbiAgbm90aWZ5OiBmdW5jdGlvbiBub3RpZnkoZXZlbnROYW1lLCBldmVudEVsZXMpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmICh0aGlzLmJhdGNoaW5nKCkpIHtcbiAgICAgIF9wLmJhdGNoTm90aWZpY2F0aW9ucyA9IF9wLmJhdGNoTm90aWZpY2F0aW9ucyB8fCB7fTtcbiAgICAgIHZhciBlbGVzID0gX3AuYmF0Y2hOb3RpZmljYXRpb25zW2V2ZW50TmFtZV0gPSBfcC5iYXRjaE5vdGlmaWNhdGlvbnNbZXZlbnROYW1lXSB8fCB0aGlzLmNvbGxlY3Rpb24oKTtcbiAgICAgIGlmIChldmVudEVsZXMgIT0gbnVsbCkge1xuICAgICAgICBlbGVzLm1lcmdlKGV2ZW50RWxlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm47IC8vIG5vdGlmaWNhdGlvbnMgYXJlIGRpc2FibGVkIGR1cmluZyBiYXRjaGluZ1xuICAgIH1cblxuICAgIGlmICghX3Aubm90aWZpY2F0aW9uc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGV4aXQgb24gZGlzYWJsZWRcblxuICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXIoKTtcblxuICAgIC8vIGV4aXQgaWYgZGVzdHJveSgpIGNhbGxlZCBvbiBjb3JlIG9yIHJlbmRlcmVyIGluIGJldHdlZW4gZnJhbWVzICMxNDk5ICMxNTI4XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkKCkgfHwgIXJlbmRlcmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlbmRlcmVyLm5vdGlmeShldmVudE5hbWUsIGV2ZW50RWxlcyk7XG4gIH0sXG4gIG5vdGlmaWNhdGlvbnM6IGZ1bmN0aW9uIG5vdGlmaWNhdGlvbnMoYm9vbCkge1xuICAgIHZhciBwID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAoYm9vbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcC5ub3RpZmljYXRpb25zRW5hYmxlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcC5ub3RpZmljYXRpb25zRW5hYmxlZCA9IGJvb2wgPyB0cnVlIDogZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBub05vdGlmaWNhdGlvbnM6IGZ1bmN0aW9uIG5vTm90aWZpY2F0aW9ucyhjYWxsYmFjaykge1xuICAgIHRoaXMubm90aWZpY2F0aW9ucyhmYWxzZSk7XG4gICAgY2FsbGJhY2soKTtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnModHJ1ZSk7XG4gIH0sXG4gIGJhdGNoaW5nOiBmdW5jdGlvbiBiYXRjaGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5iYXRjaENvdW50ID4gMDtcbiAgfSxcbiAgc3RhcnRCYXRjaDogZnVuY3Rpb24gc3RhcnRCYXRjaCgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmIChfcC5iYXRjaENvdW50ID09IG51bGwpIHtcbiAgICAgIF9wLmJhdGNoQ291bnQgPSAwO1xuICAgIH1cbiAgICBpZiAoX3AuYmF0Y2hDb3VudCA9PT0gMCkge1xuICAgICAgX3AuYmF0Y2hTdHlsZUVsZXMgPSB0aGlzLmNvbGxlY3Rpb24oKTtcbiAgICAgIF9wLmJhdGNoTm90aWZpY2F0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBfcC5iYXRjaENvdW50Kys7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGVuZEJhdGNoOiBmdW5jdGlvbiBlbmRCYXRjaCgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmIChfcC5iYXRjaENvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgX3AuYmF0Y2hDb3VudC0tO1xuICAgIGlmIChfcC5iYXRjaENvdW50ID09PSAwKSB7XG4gICAgICAvLyB1cGRhdGUgc3R5bGUgZm9yIGRpcnR5IGVsZXNcbiAgICAgIF9wLmJhdGNoU3R5bGVFbGVzLnVwZGF0ZVN0eWxlKCk7XG4gICAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyKCk7XG5cbiAgICAgIC8vIG5vdGlmeSB0aGUgcmVuZGVyZXIgb2YgcXVldWVkIGVsZXMgYW5kIGV2ZW50IHR5cGVzXG4gICAgICBPYmplY3Qua2V5cyhfcC5iYXRjaE5vdGlmaWNhdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICB2YXIgZWxlcyA9IF9wLmJhdGNoTm90aWZpY2F0aW9uc1tldmVudE5hbWVdO1xuICAgICAgICBpZiAoZWxlcy5lbXB0eSgpKSB7XG4gICAgICAgICAgcmVuZGVyZXIubm90aWZ5KGV2ZW50TmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVuZGVyZXIubm90aWZ5KGV2ZW50TmFtZSwgZWxlcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgYmF0Y2g6IGZ1bmN0aW9uIGJhdGNoKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5zdGFydEJhdGNoKCk7XG4gICAgY2FsbGJhY2soKTtcbiAgICB0aGlzLmVuZEJhdGNoKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICBiYXRjaERhdGE6IGZ1bmN0aW9uIGJhdGNoRGF0YShtYXApIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIHJldHVybiB0aGlzLmJhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpZHMgPSBPYmplY3Qua2V5cyhtYXApO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGlkID0gaWRzW2ldO1xuICAgICAgICB2YXIgZGF0YSA9IG1hcFtpZF07XG4gICAgICAgIHZhciBlbGUgPSBjeS5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICAgIGVsZS5kYXRhKGRhdGEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xuXG52YXIgcmVuZGVyZXJEZWZhdWx0cyA9IGRlZmF1bHRzJGcoe1xuICBoaWRlRWRnZXNPblZpZXdwb3J0OiBmYWxzZSxcbiAgdGV4dHVyZU9uVmlld3BvcnQ6IGZhbHNlLFxuICBtb3Rpb25CbHVyOiBmYWxzZSxcbiAgbW90aW9uQmx1ck9wYWNpdHk6IDAuMDUsXG4gIHBpeGVsUmF0aW86IHVuZGVmaW5lZCxcbiAgZGVza3RvcFRhcFRocmVzaG9sZDogNCxcbiAgdG91Y2hUYXBUaHJlc2hvbGQ6IDgsXG4gIHdoZWVsU2Vuc2l0aXZpdHk6IDEsXG4gIGRlYnVnOiBmYWxzZSxcbiAgc2hvd0ZwczogZmFsc2Vcbn0pO1xudmFyIGNvcmVmbiQ0ID0ge1xuICByZW5kZXJUbzogZnVuY3Rpb24gcmVuZGVyVG8oY29udGV4dCwgem9vbSwgcGFuLCBweFJhdGlvKSB7XG4gICAgdmFyIHIgPSB0aGlzLl9wcml2YXRlLnJlbmRlcmVyO1xuICAgIHIucmVuZGVyVG8oY29udGV4dCwgem9vbSwgcGFuLCBweFJhdGlvKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmVuZGVyZXI6IGZ1bmN0aW9uIHJlbmRlcmVyKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnJlbmRlcmVyO1xuICB9LFxuICBmb3JjZVJlbmRlcjogZnVuY3Rpb24gZm9yY2VSZW5kZXIoKSB7XG4gICAgdGhpcy5ub3RpZnkoJ2RyYXcnKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmVzaXplOiBmdW5jdGlvbiByZXNpemUoKSB7XG4gICAgdGhpcy5pbnZhbGlkYXRlU2l6ZSgpO1xuICAgIHRoaXMuZW1pdEFuZE5vdGlmeSgncmVzaXplJyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGluaXRSZW5kZXJlcjogZnVuY3Rpb24gaW5pdFJlbmRlcmVyKG9wdGlvbnMpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIHZhciBSZW5kZXJlclByb3RvID0gY3kuZXh0ZW5zaW9uKCdyZW5kZXJlcicsIG9wdGlvbnMubmFtZSk7XG4gICAgaWYgKFJlbmRlcmVyUHJvdG8gPT0gbnVsbCkge1xuICAgICAgZXJyb3IoXCJDYW4gbm90IGluaXRpYWxpc2U6IE5vIHN1Y2ggcmVuZGVyZXIgYFwiLmNvbmNhdChvcHRpb25zLm5hbWUsIFwiYCBmb3VuZC4gRGlkIHlvdSBmb3JnZXQgdG8gaW1wb3J0IGl0IGFuZCBgY3l0b3NjYXBlLnVzZSgpYCBpdD9cIikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy53aGVlbFNlbnNpdGl2aXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHdhcm4oXCJZb3UgaGF2ZSBzZXQgYSBjdXN0b20gd2hlZWwgc2Vuc2l0aXZpdHkuICBUaGlzIHdpbGwgbWFrZSB5b3VyIGFwcCB6b29tIHVubmF0dXJhbGx5IHdoZW4gdXNpbmcgbWFpbnN0cmVhbSBtaWNlLiAgWW91IHNob3VsZCBjaGFuZ2UgdGhpcyB2YWx1ZSBmcm9tIHRoZSBkZWZhdWx0IG9ubHkgaWYgeW91IGNhbiBndWFyYW50ZWUgdGhhdCBhbGwgeW91ciB1c2VycyB3aWxsIHVzZSB0aGUgc2FtZSBoYXJkd2FyZSBhbmQgT1MgY29uZmlndXJhdGlvbiBhcyB5b3VyIGN1cnJlbnQgbWFjaGluZS5cIik7XG4gICAgfVxuICAgIHZhciByT3B0cyA9IHJlbmRlcmVyRGVmYXVsdHMob3B0aW9ucyk7XG4gICAgck9wdHMuY3kgPSBjeTtcbiAgICBjeS5fcHJpdmF0ZS5yZW5kZXJlciA9IG5ldyBSZW5kZXJlclByb3RvKHJPcHRzKTtcbiAgICB0aGlzLm5vdGlmeSgnaW5pdCcpO1xuICB9LFxuICBkZXN0cm95UmVuZGVyZXI6IGZ1bmN0aW9uIGRlc3Ryb3lSZW5kZXJlcigpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIGN5Lm5vdGlmeSgnZGVzdHJveScpOyAvLyBkZXN0cm95IHRoZSByZW5kZXJlclxuXG4gICAgdmFyIGRvbUVsZSA9IGN5LmNvbnRhaW5lcigpO1xuICAgIGlmIChkb21FbGUpIHtcbiAgICAgIGRvbUVsZS5fY3lyZWcgPSBudWxsO1xuICAgICAgd2hpbGUgKGRvbUVsZS5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZG9tRWxlLnJlbW92ZUNoaWxkKGRvbUVsZS5jaGlsZE5vZGVzWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY3kuX3ByaXZhdGUucmVuZGVyZXIgPSBudWxsOyAvLyB0byBiZSBleHRyYSBzYWZlLCByZW1vdmUgdGhlIHJlZlxuICAgIGN5Lm11dGFibGVFbGVtZW50cygpLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgX3AucnNjcmF0Y2ggPSB7fTtcbiAgICAgIF9wLnJzdHlsZSA9IHt9O1xuICAgICAgX3AuYW5pbWF0aW9uLmN1cnJlbnQgPSBbXTtcbiAgICAgIF9wLmFuaW1hdGlvbi5xdWV1ZSA9IFtdO1xuICAgIH0pO1xuICB9LFxuICBvblJlbmRlcjogZnVuY3Rpb24gb25SZW5kZXIoZm4pIHtcbiAgICByZXR1cm4gdGhpcy5vbigncmVuZGVyJywgZm4pO1xuICB9LFxuICBvZmZSZW5kZXI6IGZ1bmN0aW9uIG9mZlJlbmRlcihmbikge1xuICAgIHJldHVybiB0aGlzLm9mZigncmVuZGVyJywgZm4pO1xuICB9XG59O1xuY29yZWZuJDQuaW52YWxpZGF0ZURpbWVuc2lvbnMgPSBjb3JlZm4kNC5yZXNpemU7XG5cbnZhciBjb3JlZm4kMyA9IHtcbiAgLy8gZ2V0IGEgY29sbGVjdGlvblxuICAvLyAtIGVtcHR5IGNvbGxlY3Rpb24gb24gbm8gYXJnc1xuICAvLyAtIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgaW4gdGhlIGdyYXBoIG9uIHNlbGVjdG9yIGFyZ1xuICAvLyAtIGd1YXJhbnRlZSBhIHJldHVybmVkIGNvbGxlY3Rpb24gd2hlbiBlbGVtZW50cyBvciBjb2xsZWN0aW9uIHNwZWNpZmllZFxuICBjb2xsZWN0aW9uOiBmdW5jdGlvbiBjb2xsZWN0aW9uKGVsZXMsIG9wdHMpIHtcbiAgICBpZiAoc3RyaW5nKGVsZXMpKSB7XG4gICAgICByZXR1cm4gdGhpcy4kKGVsZXMpO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihlbGVzKSkge1xuICAgICAgcmV0dXJuIGVsZXMuY29sbGVjdGlvbigpO1xuICAgIH0gZWxzZSBpZiAoYXJyYXkoZWxlcykpIHtcbiAgICAgIGlmICghb3B0cykge1xuICAgICAgICBvcHRzID0ge307XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IENvbGxlY3Rpb24odGhpcywgZWxlcywgb3B0cy51bmlxdWUsIG9wdHMucmVtb3ZlZCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzKTtcbiAgfSxcbiAgbm9kZXM6IGZ1bmN0aW9uIG5vZGVzKHNlbGVjdG9yKSB7XG4gICAgdmFyIG5vZGVzID0gdGhpcy4kKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCk7XG4gICAgfSk7XG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gbm9kZXMuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGVzO1xuICB9LFxuICBlZGdlczogZnVuY3Rpb24gZWRnZXMoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWRnZXMgPSB0aGlzLiQoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc0VkZ2UoKTtcbiAgICB9KTtcbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBlZGdlcy5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gZWRnZXM7XG4gIH0sXG4gIC8vIHNlYXJjaCB0aGUgZ3JhcGggbGlrZSBqUXVlcnlcbiAgJDogZnVuY3Rpb24gJChzZWxlY3Rvcikge1xuICAgIHZhciBlbGVzID0gdGhpcy5fcHJpdmF0ZS5lbGVtZW50cztcbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBlbGVzLmZpbHRlcihzZWxlY3Rvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGVzLnNwYXduU2VsZigpO1xuICAgIH1cbiAgfSxcbiAgbXV0YWJsZUVsZW1lbnRzOiBmdW5jdGlvbiBtdXRhYmxlRWxlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZWxlbWVudHM7XG4gIH1cbn07XG5cbi8vIGFsaWFzZXNcbmNvcmVmbiQzLmVsZW1lbnRzID0gY29yZWZuJDMuZmlsdGVyID0gY29yZWZuJDMuJDtcblxudmFyIHN0eWZuJDggPSB7fTtcblxuLy8ga2V5cyBmb3Igc3R5bGUgYmxvY2tzLCBlLmcuIHR0ZmZ0dFxudmFyIFRSVUUgPSAndCc7XG52YXIgRkFMU0UgPSAnZic7XG5cbi8vIChwb3RlbnRpYWxseSBleHBlbnNpdmUgY2FsY3VsYXRpb24pXG4vLyBhcHBseSB0aGUgc3R5bGUgdG8gdGhlIGVsZW1lbnQgYmFzZWQgb25cbi8vIC0gaXRzIGJ5cGFzc1xuLy8gLSB3aGF0IHNlbGVjdG9ycyBtYXRjaCBpdFxuc3R5Zm4kOC5hcHBseSA9IGZ1bmN0aW9uIChlbGVzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIF9wID0gc2VsZi5fcHJpdmF0ZTtcbiAgdmFyIGN5ID0gX3AuY3k7XG4gIHZhciB1cGRhdGVkRWxlcyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgZm9yICh2YXIgaWUgPSAwOyBpZSA8IGVsZXMubGVuZ3RoOyBpZSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaWVdO1xuICAgIHZhciBjeHRNZXRhID0gc2VsZi5nZXRDb250ZXh0TWV0YShlbGUpO1xuICAgIGlmIChjeHRNZXRhLmVtcHR5KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGN4dFN0eWxlID0gc2VsZi5nZXRDb250ZXh0U3R5bGUoY3h0TWV0YSk7XG4gICAgdmFyIGFwcCA9IHNlbGYuYXBwbHlDb250ZXh0U3R5bGUoY3h0TWV0YSwgY3h0U3R5bGUsIGVsZSk7XG4gICAgaWYgKGVsZS5fcHJpdmF0ZS5hcHBsaWVkSW5pdFN0eWxlKSB7XG4gICAgICBzZWxmLnVwZGF0ZVRyYW5zaXRpb25zKGVsZSwgYXBwLmRpZmZQcm9wcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZS5fcHJpdmF0ZS5hcHBsaWVkSW5pdFN0eWxlID0gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIGhpbnRzRGlmZiA9IHNlbGYudXBkYXRlU3R5bGVIaW50cyhlbGUpO1xuICAgIGlmIChoaW50c0RpZmYpIHtcbiAgICAgIHVwZGF0ZWRFbGVzLnB1c2goZWxlKTtcbiAgICB9XG4gIH0gLy8gZm9yIGVsZW1lbnRzXG5cbiAgcmV0dXJuIHVwZGF0ZWRFbGVzO1xufTtcbnN0eWZuJDguZ2V0UHJvcGVydGllc0RpZmYgPSBmdW5jdGlvbiAob2xkQ3h0S2V5LCBuZXdDeHRLZXkpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY2FjaGUgPSBzZWxmLl9wcml2YXRlLnByb3BEaWZmcyA9IHNlbGYuX3ByaXZhdGUucHJvcERpZmZzIHx8IHt9O1xuICB2YXIgZHVhbEN4dEtleSA9IG9sZEN4dEtleSArICctJyArIG5ld0N4dEtleTtcbiAgdmFyIGNhY2hlZFZhbCA9IGNhY2hlW2R1YWxDeHRLZXldO1xuICBpZiAoY2FjaGVkVmFsKSB7XG4gICAgcmV0dXJuIGNhY2hlZFZhbDtcbiAgfVxuICB2YXIgZGlmZlByb3BzID0gW107XG4gIHZhciBhZGRlZFByb3AgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN4dCA9IHNlbGZbaV07XG4gICAgdmFyIG9sZEhhc0N4dCA9IG9sZEN4dEtleVtpXSA9PT0gVFJVRTtcbiAgICB2YXIgbmV3SGFzQ3h0ID0gbmV3Q3h0S2V5W2ldID09PSBUUlVFO1xuICAgIHZhciBjeHRIYXNEaWZmZWQgPSBvbGRIYXNDeHQgIT09IG5ld0hhc0N4dDtcbiAgICB2YXIgY3h0SGFzTWFwcGVkUHJvcHMgPSBjeHQubWFwcGVkUHJvcGVydGllcy5sZW5ndGggPiAwO1xuICAgIGlmIChjeHRIYXNEaWZmZWQgfHwgbmV3SGFzQ3h0ICYmIGN4dEhhc01hcHBlZFByb3BzKSB7XG4gICAgICB2YXIgcHJvcHMgPSB2b2lkIDA7XG4gICAgICBpZiAoY3h0SGFzRGlmZmVkICYmIGN4dEhhc01hcHBlZFByb3BzKSB7XG4gICAgICAgIHByb3BzID0gY3h0LnByb3BlcnRpZXM7IC8vIHN1ZmZpY2VzIGIvYyBtYXBwZWRQcm9wZXJ0aWVzIGlzIGEgc3Vic2V0IG9mIHByb3BlcnRpZXNcbiAgICAgIH0gZWxzZSBpZiAoY3h0SGFzRGlmZmVkKSB7XG4gICAgICAgIHByb3BzID0gY3h0LnByb3BlcnRpZXM7IC8vIG5lZWQgdG8gY2hlY2sgdGhlbSBhbGxcbiAgICAgIH0gZWxzZSBpZiAoY3h0SGFzTWFwcGVkUHJvcHMpIHtcbiAgICAgICAgcHJvcHMgPSBjeHQubWFwcGVkUHJvcGVydGllczsgLy8gb25seSBuZWVkIHRvIGNoZWNrIG1hcHBlZFxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByb3BzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBwcm9wID0gcHJvcHNbal07XG4gICAgICAgIHZhciBuYW1lID0gcHJvcC5uYW1lO1xuXG4gICAgICAgIC8vIGlmIGEgbGF0ZXIgY29udGV4dCBvdmVycmlkZXMgdGhpcyBwcm9wZXJ0eSwgdGhlbiB0aGUgZmFjdCB0aGF0IHRoaXMgY29udGV4dCBoYXMgc3dpdGNoZWQvZGlmZmVkIGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgIC8vIChzZW1pIGV4cGVuc2l2ZSBjaGVjayBzaW5jZSBpdCBtYWtlcyB0aGlzIGZ1bmN0aW9uIE8obl4yKSBvbiBjb250ZXh0IGxlbmd0aCwgYnV0IHdvcnRoIGl0IHNpbmNlIG92ZXJhbGwgcmVzdWx0XG4gICAgICAgIC8vIGlzIGNhY2hlZClcbiAgICAgICAgdmFyIGxhdGVyQ3h0T3ZlcnJpZGVzID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGsgPSBpICsgMTsgayA8IHNlbGYubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICB2YXIgbGF0ZXJDeHQgPSBzZWxmW2tdO1xuICAgICAgICAgIHZhciBoYXNMYXRlckN4dCA9IG5ld0N4dEtleVtrXSA9PT0gVFJVRTtcbiAgICAgICAgICBpZiAoIWhhc0xhdGVyQ3h0KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IC8vIGNhbid0IG92ZXJyaWRlIHVubGVzcyB0aGUgY29udGV4dCBpcyBhY3RpdmVcblxuICAgICAgICAgIGxhdGVyQ3h0T3ZlcnJpZGVzID0gbGF0ZXJDeHQucHJvcGVydGllc1twcm9wLm5hbWVdICE9IG51bGw7XG4gICAgICAgICAgaWYgKGxhdGVyQ3h0T3ZlcnJpZGVzKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9IC8vIGV4aXQgZWFybHkgYXMgbG9uZyBhcyBvbmUgbGF0ZXIgY29udGV4dCBvdmVycmlkZXNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYWRkZWRQcm9wW25hbWVdICYmICFsYXRlckN4dE92ZXJyaWRlcykge1xuICAgICAgICAgIGFkZGVkUHJvcFtuYW1lXSA9IHRydWU7XG4gICAgICAgICAgZGlmZlByb3BzLnB1c2gobmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gZm9yIHByb3BzXG4gICAgfSAvLyBpZlxuICB9IC8vIGZvciBjb250ZXh0c1xuXG4gIGNhY2hlW2R1YWxDeHRLZXldID0gZGlmZlByb3BzO1xuICByZXR1cm4gZGlmZlByb3BzO1xufTtcbnN0eWZuJDguZ2V0Q29udGV4dE1ldGEgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGN4dEtleSA9ICcnO1xuICB2YXIgZGlmZlByb3BzO1xuICB2YXIgcHJldktleSA9IGVsZS5fcHJpdmF0ZS5zdHlsZUN4dEtleSB8fCAnJztcblxuICAvLyBnZXQgdGhlIGN4dCBrZXlcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNvbnRleHQgPSBzZWxmW2ldO1xuICAgIHZhciBjb250ZXh0U2VsZWN0b3JNYXRjaGVzID0gY29udGV4dC5zZWxlY3RvciAmJiBjb250ZXh0LnNlbGVjdG9yLm1hdGNoZXMoZWxlKTsgLy8gTkI6IGNvbnRleHQuc2VsZWN0b3IgbWF5IGJlIG51bGwgZm9yICdjb3JlJ1xuXG4gICAgaWYgKGNvbnRleHRTZWxlY3Rvck1hdGNoZXMpIHtcbiAgICAgIGN4dEtleSArPSBUUlVFO1xuICAgIH0gZWxzZSB7XG4gICAgICBjeHRLZXkgKz0gRkFMU0U7XG4gICAgfVxuICB9IC8vIGZvciBjb250ZXh0XG5cbiAgZGlmZlByb3BzID0gc2VsZi5nZXRQcm9wZXJ0aWVzRGlmZihwcmV2S2V5LCBjeHRLZXkpO1xuICBlbGUuX3ByaXZhdGUuc3R5bGVDeHRLZXkgPSBjeHRLZXk7XG4gIHJldHVybiB7XG4gICAga2V5OiBjeHRLZXksXG4gICAgZGlmZlByb3BOYW1lczogZGlmZlByb3BzLFxuICAgIGVtcHR5OiBkaWZmUHJvcHMubGVuZ3RoID09PSAwXG4gIH07XG59O1xuXG4vLyBnZXRzIGEgY29tcHV0ZWQgZWxlIHN0eWxlIG9iamVjdCBiYXNlZCBvbiBtYXRjaGVkIGNvbnRleHRzXG5zdHlmbiQ4LmdldENvbnRleHRTdHlsZSA9IGZ1bmN0aW9uIChjeHRNZXRhKSB7XG4gIHZhciBjeHRLZXkgPSBjeHRNZXRhLmtleTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY3h0U3R5bGVzID0gdGhpcy5fcHJpdmF0ZS5jb250ZXh0U3R5bGVzID0gdGhpcy5fcHJpdmF0ZS5jb250ZXh0U3R5bGVzIHx8IHt9O1xuXG4gIC8vIGlmIGFscmVhZHkgY29tcHV0ZWQgc3R5bGUsIHJldHVybmVkIGNhY2hlZCBjb3B5XG4gIGlmIChjeHRTdHlsZXNbY3h0S2V5XSkge1xuICAgIHJldHVybiBjeHRTdHlsZXNbY3h0S2V5XTtcbiAgfVxuICB2YXIgc3R5bGUgPSB7XG4gICAgX3ByaXZhdGU6IHtcbiAgICAgIGtleTogY3h0S2V5XG4gICAgfVxuICB9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY3h0ID0gc2VsZltpXTtcbiAgICB2YXIgaGFzQ3h0ID0gY3h0S2V5W2ldID09PSBUUlVFO1xuICAgIGlmICghaGFzQ3h0KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBjeHQucHJvcGVydGllcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIHByb3AgPSBjeHQucHJvcGVydGllc1tqXTtcbiAgICAgIHN0eWxlW3Byb3AubmFtZV0gPSBwcm9wO1xuICAgIH1cbiAgfVxuICBjeHRTdHlsZXNbY3h0S2V5XSA9IHN0eWxlO1xuICByZXR1cm4gc3R5bGU7XG59O1xuc3R5Zm4kOC5hcHBseUNvbnRleHRTdHlsZSA9IGZ1bmN0aW9uIChjeHRNZXRhLCBjeHRTdHlsZSwgZWxlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGRpZmZQcm9wcyA9IGN4dE1ldGEuZGlmZlByb3BOYW1lcztcbiAgdmFyIHJldERpZmZQcm9wcyA9IHt9O1xuICB2YXIgdHlwZXMgPSBzZWxmLnR5cGVzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGRpZmZQcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkaWZmUHJvcE5hbWUgPSBkaWZmUHJvcHNbaV07XG4gICAgdmFyIGN4dFByb3AgPSBjeHRTdHlsZVtkaWZmUHJvcE5hbWVdO1xuICAgIHZhciBlbGVQcm9wID0gZWxlLnBzdHlsZShkaWZmUHJvcE5hbWUpO1xuICAgIGlmICghY3h0UHJvcCkge1xuICAgICAgLy8gbm8gY29udGV4dCBwcm9wIG1lYW5zIGRlbGV0ZVxuICAgICAgaWYgKCFlbGVQcm9wKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBubyBleGlzdGluZyBwcm9wIG1lYW5zIG5vdGhpbmcgbmVlZHMgdG8gYmUgcmVtb3ZlZFxuICAgICAgICAvLyBuYiBhZmZlY3RzIGluaXRpYWwgYXBwbGljYXRpb24gb24gbWFwcGVkIHZhbHVlcyBsaWtlIGNvbnRyb2wtcG9pbnQtZGlzdGFuY2VzXG4gICAgICB9IGVsc2UgaWYgKGVsZVByb3AuYnlwYXNzKSB7XG4gICAgICAgIGN4dFByb3AgPSB7XG4gICAgICAgICAgbmFtZTogZGlmZlByb3BOYW1lLFxuICAgICAgICAgIGRlbGV0ZUJ5cGFzc2VkOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjeHRQcm9wID0ge1xuICAgICAgICAgIG5hbWU6IGRpZmZQcm9wTmFtZSxcbiAgICAgICAgICBcImRlbGV0ZVwiOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2F2ZSBjeWNsZXMgd2hlbiB0aGUgY29udGV4dCBwcm9wIGRvZXNuJ3QgbmVlZCB0byBiZSBhcHBsaWVkXG4gICAgaWYgKGVsZVByb3AgPT09IGN4dFByb3ApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIHNhdmUgY3ljbGVzIHdoZW4gYSBtYXBwZWQgY29udGV4dCBwcm9wIGRvZXNuJ3QgbmVlZCB0byBiZSBhcHBsaWVkXG4gICAgaWYgKGN4dFByb3AubWFwcGVkID09PSB0eXBlcy5mbiAvLyBjb250ZXh0IHByb3AgaXMgZnVuY3Rpb24gbWFwcGVyXG4gICAgJiYgZWxlUHJvcCAhPSBudWxsIC8vIHNvbWUgcHJvcHMgY2FuIGJlIG51bGwgZXZlbiBieSBkZWZhdWx0IChlLmcuIGEgcHJvcCB0aGF0IG92ZXJyaWRlcyBhbm90aGVyIG9uZSlcbiAgICAmJiBlbGVQcm9wLm1hcHBpbmcgIT0gbnVsbCAvLyBlbGUgcHJvcCBpcyBhIGNvbmNyZXRlIHZhbHVlIGZyb20gZnJvbSBhIG1hcHBlclxuICAgICYmIGVsZVByb3AubWFwcGluZy52YWx1ZSA9PT0gY3h0UHJvcC52YWx1ZSAvLyB0aGUgY3VycmVudCBwcm9wIG9uIHRoZSBlbGUgaXMgYSBmbGF0IHByb3AgdmFsdWUgZm9yIHRoZSBmdW5jdGlvbiBtYXBwZXJcbiAgICApIHtcbiAgICAgIC8vIE5CIGRvbid0IHdyaXRlIHRvIGN4dFByb3AsIGFzIGl0J3Mgc2hhcmVkIGFtb25nIGVsZXMgKHN0b3JlZCBpbiBzdHlsZXNoZWV0KVxuICAgICAgdmFyIG1hcHBpbmcgPSBlbGVQcm9wLm1hcHBpbmc7IC8vIGNhbiB3cml0ZSB0byBtYXBwaW5nLCBhcyBpdCdzIGEgcGVyLWVsZSBjb3B5XG4gICAgICB2YXIgZm5WYWx1ZSA9IG1hcHBpbmcuZm5WYWx1ZSA9IGN4dFByb3AudmFsdWUoZWxlKTsgLy8gdGVtcG9yYXJpbHkgY2FjaGUgdGhlIHZhbHVlIGluIGNhc2Ugb2YgYSBtaXNzXG5cbiAgICAgIGlmIChmblZhbHVlID09PSBtYXBwaW5nLnByZXZGblZhbHVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgcmV0RGlmZlByb3AgPSByZXREaWZmUHJvcHNbZGlmZlByb3BOYW1lXSA9IHtcbiAgICAgIHByZXY6IGVsZVByb3BcbiAgICB9O1xuICAgIHNlbGYuYXBwbHlQYXJzZWRQcm9wZXJ0eShlbGUsIGN4dFByb3ApO1xuICAgIHJldERpZmZQcm9wLm5leHQgPSBlbGUucHN0eWxlKGRpZmZQcm9wTmFtZSk7XG4gICAgaWYgKHJldERpZmZQcm9wLm5leHQgJiYgcmV0RGlmZlByb3AubmV4dC5ieXBhc3MpIHtcbiAgICAgIHJldERpZmZQcm9wLm5leHQgPSByZXREaWZmUHJvcC5uZXh0LmJ5cGFzc2VkO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGRpZmZQcm9wczogcmV0RGlmZlByb3BzXG4gIH07XG59O1xuc3R5Zm4kOC51cGRhdGVTdHlsZUhpbnRzID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHByb3BOYW1lcyA9IHNlbGYucHJvcGVydHlHcm91cE5hbWVzO1xuICB2YXIgcHJvcEdyS2V5cyA9IHNlbGYucHJvcGVydHlHcm91cEtleXM7XG4gIHZhciBwcm9wSGFzaCA9IGZ1bmN0aW9uIHByb3BIYXNoKGVsZSwgcHJvcE5hbWVzLCBzZWVkS2V5KSB7XG4gICAgcmV0dXJuIHNlbGYuZ2V0UHJvcGVydGllc0hhc2goZWxlLCBwcm9wTmFtZXMsIHNlZWRLZXkpO1xuICB9O1xuICB2YXIgb2xkU3R5bGVLZXkgPSBfcC5zdHlsZUtleTtcbiAgaWYgKGVsZS5yZW1vdmVkKCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGlzTm9kZSA9IF9wLmdyb3VwID09PSAnbm9kZXMnO1xuXG4gIC8vIGdldCB0aGUgc3R5bGUga2V5IGhhc2hlcyBwZXIgcHJvcCBncm91cFxuICAvLyBidXQgbGF6aWx5IC0tIG9ubHkgdXNlIG5vbi1kZWZhdWx0IHByb3AgdmFsdWVzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGhhc2hlc1xuICAvL1xuXG4gIHZhciBvdmVycmlkZGVuU3R5bGVzID0gZWxlLl9wcml2YXRlLnN0eWxlO1xuICBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhvdmVycmlkZGVuU3R5bGVzKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wR3JLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGdyS2V5ID0gcHJvcEdyS2V5c1tpXTtcbiAgICBfcC5zdHlsZUtleXNbZ3JLZXldID0gW0RFRkFVTFRfSEFTSF9TRUVELCBERUZBVUxUX0hBU0hfU0VFRF9BTFRdO1xuICB9XG4gIHZhciB1cGRhdGVHcktleTEgPSBmdW5jdGlvbiB1cGRhdGVHcktleTEodmFsLCBncktleSkge1xuICAgIHJldHVybiBfcC5zdHlsZUtleXNbZ3JLZXldWzBdID0gaGFzaEludCh2YWwsIF9wLnN0eWxlS2V5c1tncktleV1bMF0pO1xuICB9O1xuICB2YXIgdXBkYXRlR3JLZXkyID0gZnVuY3Rpb24gdXBkYXRlR3JLZXkyKHZhbCwgZ3JLZXkpIHtcbiAgICByZXR1cm4gX3Auc3R5bGVLZXlzW2dyS2V5XVsxXSA9IGhhc2hJbnRBbHQodmFsLCBfcC5zdHlsZUtleXNbZ3JLZXldWzFdKTtcbiAgfTtcbiAgdmFyIHVwZGF0ZUdyS2V5ID0gZnVuY3Rpb24gdXBkYXRlR3JLZXkodmFsLCBncktleSkge1xuICAgIHVwZGF0ZUdyS2V5MSh2YWwsIGdyS2V5KTtcbiAgICB1cGRhdGVHcktleTIodmFsLCBncktleSk7XG4gIH07XG4gIHZhciB1cGRhdGVHcktleVdTdHIgPSBmdW5jdGlvbiB1cGRhdGVHcktleVdTdHIoc3RyVmFsLCBncktleSkge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3RyVmFsLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgY2ggPSBzdHJWYWwuY2hhckNvZGVBdChqKTtcbiAgICAgIHVwZGF0ZUdyS2V5MShjaCwgZ3JLZXkpO1xuICAgICAgdXBkYXRlR3JLZXkyKGNoLCBncktleSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIC0gaGFzaGluZyB3b3JrcyBvbiAzMiBiaXQgaW50cyBiL2Mgd2UgdXNlIGJpdHdpc2Ugb3BzXG4gIC8vIC0gc21hbGwgbnVtYmVycyBnZXQgY3V0IG9mZiAoZS5nLiAwLjEyMyBpcyBzZWVuIGFzIDAgYnkgdGhlIGhhc2hpbmcgZnVuY3Rpb24pXG4gIC8vIC0gcmFpc2UgdXAgc21hbGwgbnVtYmVycyBzbyBtb3JlIHNpZ25pZmljYW50IGRpZ2l0cyBhcmUgc2VlbiBieSBoYXNoaW5nXG4gIC8vIC0gbWFrZSBzbWFsbCBudW1iZXJzIGxhcmdlciB0aGFuIGEgbm9ybWFsIHZhbHVlIHRvIGF2b2lkIGNvbGxpc2lvbnNcbiAgLy8gLSB3b3JrcyBpbiBwcmFjdGljZSBhbmQgaXQncyByZWxhdGl2ZWx5IGNoZWFwXG4gIHZhciBOID0gMjAwMDAwMDAwMDtcbiAgdmFyIGNsZWFuTnVtID0gZnVuY3Rpb24gY2xlYW5OdW0odmFsKSB7XG4gICAgcmV0dXJuIC0xMjggPCB2YWwgJiYgdmFsIDwgMTI4ICYmIE1hdGguZmxvb3IodmFsKSAhPT0gdmFsID8gTiAtICh2YWwgKiAxMDI0IHwgMCkgOiB2YWw7XG4gIH07XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBwcm9wTmFtZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIG5hbWUgPSBwcm9wTmFtZXNbX2ldO1xuICAgIHZhciBwYXJzZWRQcm9wID0gb3ZlcnJpZGRlblN0eWxlc1tuYW1lXTtcbiAgICBpZiAocGFyc2VkUHJvcCA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIHByb3BJbmZvID0gdGhpcy5wcm9wZXJ0aWVzW25hbWVdO1xuICAgIHZhciB0eXBlID0gcHJvcEluZm8udHlwZTtcbiAgICB2YXIgX2dyS2V5ID0gcHJvcEluZm8uZ3JvdXBLZXk7XG4gICAgdmFyIG5vcm1hbGl6ZWROdW1iZXJWYWwgPSB2b2lkIDA7XG4gICAgaWYgKHByb3BJbmZvLmhhc2hPdmVycmlkZSAhPSBudWxsKSB7XG4gICAgICBub3JtYWxpemVkTnVtYmVyVmFsID0gcHJvcEluZm8uaGFzaE92ZXJyaWRlKGVsZSwgcGFyc2VkUHJvcCk7XG4gICAgfSBlbHNlIGlmIChwYXJzZWRQcm9wLnBmVmFsdWUgIT0gbnVsbCkge1xuICAgICAgbm9ybWFsaXplZE51bWJlclZhbCA9IHBhcnNlZFByb3AucGZWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBtaWdodCBub3QgYmUgYSBudW1iZXIgaWYgaXQgYWxsb3dzIGVudW1zXG4gICAgdmFyIG51bWJlclZhbCA9IHByb3BJbmZvLmVudW1zID09IG51bGwgPyBwYXJzZWRQcm9wLnZhbHVlIDogbnVsbDtcbiAgICB2YXIgaGF2ZU5vcm1OdW0gPSBub3JtYWxpemVkTnVtYmVyVmFsICE9IG51bGw7XG4gICAgdmFyIGhhdmVVbml0ZWROdW0gPSBudW1iZXJWYWwgIT0gbnVsbDtcbiAgICB2YXIgaGF2ZU51bSA9IGhhdmVOb3JtTnVtIHx8IGhhdmVVbml0ZWROdW07XG4gICAgdmFyIHVuaXRzID0gcGFyc2VkUHJvcC51bml0cztcblxuICAgIC8vIG51bWJlcnMgYXJlIGNoZWFwZXIgdG8gaGFzaCB0aGFuIHN0cmluZ3NcbiAgICAvLyAxIGhhc2ggb3AgdnMgbiBoYXNoIG9wcyAoZm9yIGxlbmd0aCBuIHN0cmluZylcbiAgICBpZiAodHlwZS5udW1iZXIgJiYgaGF2ZU51bSAmJiAhdHlwZS5tdWx0aXBsZSkge1xuICAgICAgdmFyIHYgPSBoYXZlTm9ybU51bSA/IG5vcm1hbGl6ZWROdW1iZXJWYWwgOiBudW1iZXJWYWw7XG4gICAgICB1cGRhdGVHcktleShjbGVhbk51bSh2KSwgX2dyS2V5KTtcbiAgICAgIGlmICghaGF2ZU5vcm1OdW0gJiYgdW5pdHMgIT0gbnVsbCkge1xuICAgICAgICB1cGRhdGVHcktleVdTdHIodW5pdHMsIF9ncktleSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwZGF0ZUdyS2V5V1N0cihwYXJzZWRQcm9wLnN0clZhbHVlLCBfZ3JLZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIG92ZXJhbGwgc3R5bGUga2V5XG4gIC8vXG5cbiAgdmFyIGhhc2ggPSBbREVGQVVMVF9IQVNIX1NFRUQsIERFRkFVTFRfSEFTSF9TRUVEX0FMVF07XG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHByb3BHcktleXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBfZ3JLZXkyID0gcHJvcEdyS2V5c1tfaTJdO1xuICAgIHZhciBnckhhc2ggPSBfcC5zdHlsZUtleXNbX2dyS2V5Ml07XG4gICAgaGFzaFswXSA9IGhhc2hJbnQoZ3JIYXNoWzBdLCBoYXNoWzBdKTtcbiAgICBoYXNoWzFdID0gaGFzaEludEFsdChnckhhc2hbMV0sIGhhc2hbMV0pO1xuICB9XG4gIF9wLnN0eWxlS2V5ID0gY29tYmluZUhhc2hlcyhoYXNoWzBdLCBoYXNoWzFdKTtcblxuICAvLyBsYWJlbCBkaW1zXG4gIC8vXG5cbiAgdmFyIHNrID0gX3Auc3R5bGVLZXlzO1xuICBfcC5sYWJlbERpbXNLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkoc2subGFiZWxEaW1lbnNpb25zKTtcbiAgdmFyIGxhYmVsS2V5cyA9IHByb3BIYXNoKGVsZSwgWydsYWJlbCddLCBzay5sYWJlbERpbWVuc2lvbnMpO1xuICBfcC5sYWJlbEtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShsYWJlbEtleXMpO1xuICBfcC5sYWJlbFN0eWxlS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KGhhc2hBcnJheXMoc2suY29tbW9uTGFiZWwsIGxhYmVsS2V5cykpO1xuICBpZiAoIWlzTm9kZSkge1xuICAgIHZhciBzb3VyY2VMYWJlbEtleXMgPSBwcm9wSGFzaChlbGUsIFsnc291cmNlLWxhYmVsJ10sIHNrLmxhYmVsRGltZW5zaW9ucyk7XG4gICAgX3Auc291cmNlTGFiZWxLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkoc291cmNlTGFiZWxLZXlzKTtcbiAgICBfcC5zb3VyY2VMYWJlbFN0eWxlS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KGhhc2hBcnJheXMoc2suY29tbW9uTGFiZWwsIHNvdXJjZUxhYmVsS2V5cykpO1xuICAgIHZhciB0YXJnZXRMYWJlbEtleXMgPSBwcm9wSGFzaChlbGUsIFsndGFyZ2V0LWxhYmVsJ10sIHNrLmxhYmVsRGltZW5zaW9ucyk7XG4gICAgX3AudGFyZ2V0TGFiZWxLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkodGFyZ2V0TGFiZWxLZXlzKTtcbiAgICBfcC50YXJnZXRMYWJlbFN0eWxlS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KGhhc2hBcnJheXMoc2suY29tbW9uTGFiZWwsIHRhcmdldExhYmVsS2V5cykpO1xuICB9XG5cbiAgLy8gbm9kZVxuICAvL1xuXG4gIGlmIChpc05vZGUpIHtcbiAgICB2YXIgX3Akc3R5bGVLZXlzID0gX3Auc3R5bGVLZXlzLFxuICAgICAgbm9kZUJvZHkgPSBfcCRzdHlsZUtleXMubm9kZUJvZHksXG4gICAgICBub2RlQm9yZGVyID0gX3Akc3R5bGVLZXlzLm5vZGVCb3JkZXIsXG4gICAgICBub2RlT3V0bGluZSA9IF9wJHN0eWxlS2V5cy5ub2RlT3V0bGluZSxcbiAgICAgIGJhY2tncm91bmRJbWFnZSA9IF9wJHN0eWxlS2V5cy5iYWNrZ3JvdW5kSW1hZ2UsXG4gICAgICBjb21wb3VuZCA9IF9wJHN0eWxlS2V5cy5jb21wb3VuZCxcbiAgICAgIHBpZSA9IF9wJHN0eWxlS2V5cy5waWU7XG4gICAgdmFyIG5vZGVLZXlzID0gW25vZGVCb2R5LCBub2RlQm9yZGVyLCBub2RlT3V0bGluZSwgYmFja2dyb3VuZEltYWdlLCBjb21wb3VuZCwgcGllXS5maWx0ZXIoZnVuY3Rpb24gKGspIHtcbiAgICAgIHJldHVybiBrICE9IG51bGw7XG4gICAgfSkucmVkdWNlKGhhc2hBcnJheXMsIFtERUZBVUxUX0hBU0hfU0VFRCwgREVGQVVMVF9IQVNIX1NFRURfQUxUXSk7XG4gICAgX3Aubm9kZUtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShub2RlS2V5cyk7XG4gICAgX3AuaGFzUGllID0gcGllICE9IG51bGwgJiYgcGllWzBdICE9PSBERUZBVUxUX0hBU0hfU0VFRCAmJiBwaWVbMV0gIT09IERFRkFVTFRfSEFTSF9TRUVEX0FMVDtcbiAgfVxuICByZXR1cm4gb2xkU3R5bGVLZXkgIT09IF9wLnN0eWxlS2V5O1xufTtcbnN0eWZuJDguY2xlYXJTdHlsZUhpbnRzID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIF9wLnN0eWxlQ3h0S2V5ID0gJyc7XG4gIF9wLnN0eWxlS2V5cyA9IHt9O1xuICBfcC5zdHlsZUtleSA9IG51bGw7XG4gIF9wLmxhYmVsS2V5ID0gbnVsbDtcbiAgX3AubGFiZWxTdHlsZUtleSA9IG51bGw7XG4gIF9wLnNvdXJjZUxhYmVsS2V5ID0gbnVsbDtcbiAgX3Auc291cmNlTGFiZWxTdHlsZUtleSA9IG51bGw7XG4gIF9wLnRhcmdldExhYmVsS2V5ID0gbnVsbDtcbiAgX3AudGFyZ2V0TGFiZWxTdHlsZUtleSA9IG51bGw7XG4gIF9wLm5vZGVLZXkgPSBudWxsO1xuICBfcC5oYXNQaWUgPSBudWxsO1xufTtcblxuLy8gYXBwbHkgYSBwcm9wZXJ0eSB0byB0aGUgc3R5bGUgKGZvciBpbnRlcm5hbCB1c2UpXG4vLyByZXR1cm5zIHdoZXRoZXIgYXBwbGljYXRpb24gd2FzIHN1Y2Nlc3NmdWxcbi8vXG4vLyBub3csIHRoaXMgZnVuY3Rpb24gZmxhdHRlbnMgdGhlIHByb3BlcnR5LCBhbmQgaGVyZSdzIGhvdzpcbi8vXG4vLyBmb3IgcGFyc2VkUHJvcDp7IGJ5cGFzczogdHJ1ZSwgZGVsZXRlQnlwYXNzOiB0cnVlIH1cbi8vIG5vIHByb3BlcnR5IGlzIGdlbmVyYXRlZCwgaW5zdGVhZCB0aGUgYnlwYXNzIHByb3BlcnR5IGluIHRoZVxuLy8gZWxlbWVudCdzIHN0eWxlIGlzIHJlcGxhY2VkIGJ5IHdoYXQncyBwb2ludGVkIHRvIGJ5IHRoZSBgYnlwYXNzZWRgXG4vLyBmaWVsZCBpbiB0aGUgYnlwYXNzIHByb3BlcnR5IChpLmUuIHJlc3RvcmluZyB0aGUgcHJvcGVydHkgdGhlXG4vLyBieXBhc3Mgd2FzIG92ZXJyaWRpbmcpXG4vL1xuLy8gZm9yIHBhcnNlZFByb3A6eyBtYXBwZWQ6IHRydXRoeSB9XG4vLyB0aGUgZ2VuZXJhdGVkIGZsYXR0ZW5lZFByb3A6eyBtYXBwaW5nOiBwcm9wIH1cbi8vXG4vLyBmb3IgcGFyc2VkUHJvcDp7IGJ5cGFzczogdHJ1ZSB9XG4vLyB0aGUgZ2VuZXJhdGVkIGZsYXR0ZW5lZFByb3A6eyBieXBhc3NlZDogcGFyc2VkUHJvcCB9XG5zdHlmbiQ4LmFwcGx5UGFyc2VkUHJvcGVydHkgPSBmdW5jdGlvbiAoZWxlLCBwYXJzZWRQcm9wKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHByb3AgPSBwYXJzZWRQcm9wO1xuICB2YXIgc3R5bGUgPSBlbGUuX3ByaXZhdGUuc3R5bGU7XG4gIHZhciBmbGF0UHJvcDtcbiAgdmFyIHR5cGVzID0gc2VsZi50eXBlcztcbiAgdmFyIHR5cGUgPSBzZWxmLnByb3BlcnRpZXNbcHJvcC5uYW1lXS50eXBlO1xuICB2YXIgcHJvcElzQnlwYXNzID0gcHJvcC5ieXBhc3M7XG4gIHZhciBvcmlnUHJvcCA9IHN0eWxlW3Byb3AubmFtZV07XG4gIHZhciBvcmlnUHJvcElzQnlwYXNzID0gb3JpZ1Byb3AgJiYgb3JpZ1Byb3AuYnlwYXNzO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBmbGF0UHJvcE1hcHBpbmcgPSAnbWFwcGluZyc7XG4gIHZhciBnZXRWYWwgPSBmdW5jdGlvbiBnZXRWYWwocCkge1xuICAgIGlmIChwID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAocC5wZlZhbHVlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBwLnBmVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwLnZhbHVlO1xuICAgIH1cbiAgfTtcbiAgdmFyIGNoZWNrVHJpZ2dlcnMgPSBmdW5jdGlvbiBjaGVja1RyaWdnZXJzKCkge1xuICAgIHZhciBmcm9tVmFsID0gZ2V0VmFsKG9yaWdQcm9wKTtcbiAgICB2YXIgdG9WYWwgPSBnZXRWYWwocHJvcCk7XG4gICAgc2VsZi5jaGVja1RyaWdnZXJzKGVsZSwgcHJvcC5uYW1lLCBmcm9tVmFsLCB0b1ZhbCk7XG4gIH07XG5cbiAgLy8gZWRnZSBzYW5pdHkgY2hlY2tzIHRvIHByZXZlbnQgdGhlIGNsaWVudCBmcm9tIG1ha2luZyBzZXJpb3VzIG1pc3Rha2VzXG4gIGlmIChwYXJzZWRQcm9wLm5hbWUgPT09ICdjdXJ2ZS1zdHlsZScgJiYgZWxlLmlzRWRnZSgpICYmIChcbiAgLy8gbG9vcHMgbXVzdCBiZSBidW5kbGVkIGJlemllcnNcbiAgcGFyc2VkUHJvcC52YWx1ZSAhPT0gJ2JlemllcicgJiYgZWxlLmlzTG9vcCgpIHx8XG4gIC8vIGVkZ2VzIGNvbm5lY3RlZCB0byBjb21wb3VuZCBub2RlcyBjYW4gbm90IGJlIGhheXN0YWNrc1xuICBwYXJzZWRQcm9wLnZhbHVlID09PSAnaGF5c3RhY2snICYmIChlbGUuc291cmNlKCkuaXNQYXJlbnQoKSB8fCBlbGUudGFyZ2V0KCkuaXNQYXJlbnQoKSkpKSB7XG4gICAgcHJvcCA9IHBhcnNlZFByb3AgPSB0aGlzLnBhcnNlKHBhcnNlZFByb3AubmFtZSwgJ2JlemllcicsIHByb3BJc0J5cGFzcyk7XG4gIH1cbiAgaWYgKHByb3BbXCJkZWxldGVcIl0pIHtcbiAgICAvLyBkZWxldGUgdGhlIHByb3BlcnR5IGFuZCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgb24gZmFsc2V5IHZhbHVlXG4gICAgc3R5bGVbcHJvcC5uYW1lXSA9IHVuZGVmaW5lZDtcbiAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHByb3AuZGVsZXRlQnlwYXNzZWQpIHtcbiAgICAvLyBkZWxldGUgdGhlIHByb3BlcnR5IHRoYXQgdGhlXG4gICAgaWYgKCFvcmlnUHJvcCkge1xuICAgICAgY2hlY2tUcmlnZ2VycygpO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIGNhbid0IGRlbGV0ZSBpZiBubyBwcm9wXG4gICAgfSBlbHNlIGlmIChvcmlnUHJvcC5ieXBhc3MpIHtcbiAgICAgIC8vIGRlbGV0ZSBieXBhc3NlZFxuICAgICAgb3JpZ1Byb3AuYnlwYXNzZWQgPSB1bmRlZmluZWQ7XG4gICAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyB3ZSdyZSB1bnN1Y2Nlc3NmdWwgZGVsZXRpbmcgdGhlIGJ5cGFzc2VkXG4gICAgfVxuICB9XG5cbiAgLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBkZWxldGUgdGhlIGN1cnJlbnQgYnlwYXNzXG4gIGlmIChwcm9wLmRlbGV0ZUJ5cGFzcykge1xuICAgIC8vIHRoZW4gdGhpcyBwcm9wZXJ0eSBpcyBqdXN0IGhlcmUgdG8gaW5kaWNhdGUgd2UgbmVlZCB0byBkZWxldGVcbiAgICBpZiAoIW9yaWdQcm9wKSB7XG4gICAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gcHJvcGVydHkgaXMgYWxyZWFkeSBub3QgZGVmaW5lZFxuICAgIH0gZWxzZSBpZiAob3JpZ1Byb3AuYnlwYXNzKSB7XG4gICAgICAvLyB0aGVuIHJlcGxhY2UgdGhlIGJ5cGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBvcmlnaW5hbFxuICAgICAgLy8gYmVjYXVzZSB0aGUgYnlwYXNzZWQgcHJvcGVydHkgd2FzIGFscmVhZHkgYXBwbGllZCAoYW5kIHRoZXJlZm9yZSBwYXJzZWQpLCB3ZSBjYW4ganVzdCByZXBsYWNlIGl0IChubyByZWFwcGx5aW5nIG5lY2Vzc2FyeSlcbiAgICAgIHN0eWxlW3Byb3AubmFtZV0gPSBvcmlnUHJvcC5ieXBhc3NlZDtcbiAgICAgIGNoZWNrVHJpZ2dlcnMoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIHdlJ3JlIHVuc3VjY2Vzc2Z1bCBkZWxldGluZyB0aGUgYnlwYXNzXG4gICAgfVxuICB9XG5cbiAgdmFyIHByaW50TWFwcGluZ0VyciA9IGZ1bmN0aW9uIHByaW50TWFwcGluZ0VycigpIHtcbiAgICB3YXJuKCdEbyBub3QgYXNzaWduIG1hcHBpbmdzIHRvIGVsZW1lbnRzIHdpdGhvdXQgY29ycmVzcG9uZGluZyBkYXRhIChpLmUuIGVsZSBgJyArIGVsZS5pZCgpICsgJ2AgaGFzIG5vIG1hcHBpbmcgZm9yIHByb3BlcnR5IGAnICsgcHJvcC5uYW1lICsgJ2Agd2l0aCBkYXRhIGZpZWxkIGAnICsgcHJvcC5maWVsZCArICdgKTsgdHJ5IGEgYFsnICsgcHJvcC5maWVsZCArICddYCBzZWxlY3RvciB0byBsaW1pdCBzY29wZSB0byBlbGVtZW50cyB3aXRoIGAnICsgcHJvcC5maWVsZCArICdgIGRlZmluZWQnKTtcbiAgfTtcblxuICAvLyBwdXQgdGhlIHByb3BlcnR5IGluIHRoZSBzdHlsZSBvYmplY3RzXG4gIHN3aXRjaCAocHJvcC5tYXBwZWQpIHtcbiAgICAvLyBmbGF0dGVuIHRoZSBwcm9wZXJ0eSBpZiBtYXBwZWRcbiAgICBjYXNlIHR5cGVzLm1hcERhdGE6XG4gICAgICB7XG4gICAgICAgIC8vIGZsYXR0ZW4gdGhlIGZpZWxkIChlLmcuIGRhdGEuZm9vLmJhcilcbiAgICAgICAgdmFyIGZpZWxkcyA9IHByb3AuZmllbGQuc3BsaXQoJy4nKTtcbiAgICAgICAgdmFyIGZpZWxkVmFsID0gX3AuZGF0YTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoICYmIGZpZWxkVmFsOyBpKyspIHtcbiAgICAgICAgICB2YXIgZmllbGQgPSBmaWVsZHNbaV07XG4gICAgICAgICAgZmllbGRWYWwgPSBmaWVsZFZhbFtmaWVsZF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpZWxkVmFsID09IG51bGwpIHtcbiAgICAgICAgICBwcmludE1hcHBpbmdFcnIoKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBlcmNlbnQ7XG4gICAgICAgIGlmICghbnVtYmVyJDEoZmllbGRWYWwpKSB7XG4gICAgICAgICAgLy8gdGhlbiBkb24ndCBhcHBseSBhbmQgZmFsbCBiYWNrIG9uIHRoZSBleGlzdGluZyBzdHlsZVxuICAgICAgICAgIHdhcm4oJ0RvIG5vdCB1c2UgY29udGludW91cyBtYXBwZXJzIHdpdGhvdXQgc3BlY2lmeWluZyBudW1lcmljIGRhdGEgKGkuZS4gYCcgKyBwcm9wLmZpZWxkICsgJzogJyArIGZpZWxkVmFsICsgJ2AgZm9yIGAnICsgZWxlLmlkKCkgKyAnYCBpcyBub24tbnVtZXJpYyknKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGZpZWxkV2lkdGggPSBwcm9wLmZpZWxkTWF4IC0gcHJvcC5maWVsZE1pbjtcbiAgICAgICAgICBpZiAoZmllbGRXaWR0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gc2FmZXR5IGNoZWNrIC0tIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkgYXMgbm8gcHJvcHMgb2YgemVybyByYW5nZSBzaG91bGQgYmUgcGFzc2VkIGhlcmVcbiAgICAgICAgICAgIHBlcmNlbnQgPSAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZXJjZW50ID0gKGZpZWxkVmFsIC0gcHJvcC5maWVsZE1pbikgLyBmaWVsZFdpZHRoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0byBib3VuZCBwZXJjZW50IHZhbHVlXG4gICAgICAgIGlmIChwZXJjZW50IDwgMCkge1xuICAgICAgICAgIHBlcmNlbnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHBlcmNlbnQgPiAxKSB7XG4gICAgICAgICAgcGVyY2VudCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUuY29sb3IpIHtcbiAgICAgICAgICB2YXIgcjEgPSBwcm9wLnZhbHVlTWluWzBdO1xuICAgICAgICAgIHZhciByMiA9IHByb3AudmFsdWVNYXhbMF07XG4gICAgICAgICAgdmFyIGcxID0gcHJvcC52YWx1ZU1pblsxXTtcbiAgICAgICAgICB2YXIgZzIgPSBwcm9wLnZhbHVlTWF4WzFdO1xuICAgICAgICAgIHZhciBiMSA9IHByb3AudmFsdWVNaW5bMl07XG4gICAgICAgICAgdmFyIGIyID0gcHJvcC52YWx1ZU1heFsyXTtcbiAgICAgICAgICB2YXIgYTEgPSBwcm9wLnZhbHVlTWluWzNdID09IG51bGwgPyAxIDogcHJvcC52YWx1ZU1pblszXTtcbiAgICAgICAgICB2YXIgYTIgPSBwcm9wLnZhbHVlTWF4WzNdID09IG51bGwgPyAxIDogcHJvcC52YWx1ZU1heFszXTtcbiAgICAgICAgICB2YXIgY2xyID0gW01hdGgucm91bmQocjEgKyAocjIgLSByMSkgKiBwZXJjZW50KSwgTWF0aC5yb3VuZChnMSArIChnMiAtIGcxKSAqIHBlcmNlbnQpLCBNYXRoLnJvdW5kKGIxICsgKGIyIC0gYjEpICogcGVyY2VudCksIE1hdGgucm91bmQoYTEgKyAoYTIgLSBhMSkgKiBwZXJjZW50KV07XG4gICAgICAgICAgZmxhdFByb3AgPSB7XG4gICAgICAgICAgICAvLyBjb2xvdXJzIGFyZSBzaW1wbGUsIHNvIGp1c3QgY3JlYXRlIHRoZSBmbGF0IHByb3BlcnR5IGluc3RlYWQgb2YgZXhwZW5zaXZlIHN0cmluZyBwYXJzaW5nXG4gICAgICAgICAgICBieXBhc3M6IHByb3AuYnlwYXNzLFxuICAgICAgICAgICAgLy8gd2UncmUgYSBieXBhc3MgaWYgdGhlIG1hcHBpbmcgcHJvcGVydHkgaXMgYSBieXBhc3NcbiAgICAgICAgICAgIG5hbWU6IHByb3AubmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiBjbHIsXG4gICAgICAgICAgICBzdHJWYWx1ZTogJ3JnYignICsgY2xyWzBdICsgJywgJyArIGNsclsxXSArICcsICcgKyBjbHJbMl0gKyAnKSdcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUubnVtYmVyKSB7XG4gICAgICAgICAgdmFyIGNhbGNWYWx1ZSA9IHByb3AudmFsdWVNaW4gKyAocHJvcC52YWx1ZU1heCAtIHByb3AudmFsdWVNaW4pICogcGVyY2VudDtcbiAgICAgICAgICBmbGF0UHJvcCA9IHRoaXMucGFyc2UocHJvcC5uYW1lLCBjYWxjVmFsdWUsIHByb3AuYnlwYXNzLCBmbGF0UHJvcE1hcHBpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gY2FuIG9ubHkgbWFwIHRvIGNvbG91cnMgYW5kIG51bWJlcnNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmxhdFByb3ApIHtcbiAgICAgICAgICAvLyBpZiB3ZSBjYW4ndCBmbGF0dGVuIHRoZSBwcm9wZXJ0eSwgdGhlbiBkb24ndCBhcHBseSB0aGUgcHJvcGVydHkgYW5kIGZhbGwgYmFjayBvbiB0aGUgZXhpc3Rpbmcgc3R5bGVcbiAgICAgICAgICBwcmludE1hcHBpbmdFcnIoKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZmxhdFByb3AubWFwcGluZyA9IHByb3A7IC8vIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIG1hcHBpbmdcbiAgICAgICAgcHJvcCA9IGZsYXRQcm9wOyAvLyB0aGUgZmxhdHRlbmVkIChtYXBwZWQpIHByb3BlcnR5IGlzIHRoZSBvbmUgd2Ugd2FudFxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgLy8gZGlyZWN0IG1hcHBpbmdcbiAgICBjYXNlIHR5cGVzLmRhdGE6XG4gICAgICB7XG4gICAgICAgIC8vIGZsYXR0ZW4gdGhlIGZpZWxkIChlLmcuIGRhdGEuZm9vLmJhcilcbiAgICAgICAgdmFyIF9maWVsZHMgPSBwcm9wLmZpZWxkLnNwbGl0KCcuJyk7XG4gICAgICAgIHZhciBfZmllbGRWYWwgPSBfcC5kYXRhO1xuICAgICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBfZmllbGRzLmxlbmd0aCAmJiBfZmllbGRWYWw7IF9pMysrKSB7XG4gICAgICAgICAgdmFyIF9maWVsZCA9IF9maWVsZHNbX2kzXTtcbiAgICAgICAgICBfZmllbGRWYWwgPSBfZmllbGRWYWxbX2ZpZWxkXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2ZpZWxkVmFsICE9IG51bGwpIHtcbiAgICAgICAgICBmbGF0UHJvcCA9IHRoaXMucGFyc2UocHJvcC5uYW1lLCBfZmllbGRWYWwsIHByb3AuYnlwYXNzLCBmbGF0UHJvcE1hcHBpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZmxhdFByb3ApIHtcbiAgICAgICAgICAvLyBpZiB3ZSBjYW4ndCBmbGF0dGVuIHRoZSBwcm9wZXJ0eSwgdGhlbiBkb24ndCBhcHBseSBhbmQgZmFsbCBiYWNrIG9uIHRoZSBleGlzdGluZyBzdHlsZVxuICAgICAgICAgIHByaW50TWFwcGluZ0VycigpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmbGF0UHJvcC5tYXBwaW5nID0gcHJvcDsgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgbWFwcGluZ1xuICAgICAgICBwcm9wID0gZmxhdFByb3A7IC8vIHRoZSBmbGF0dGVuZWQgKG1hcHBlZCkgcHJvcGVydHkgaXMgdGhlIG9uZSB3ZSB3YW50XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgY2FzZSB0eXBlcy5mbjpcbiAgICAgIHtcbiAgICAgICAgdmFyIGZuID0gcHJvcC52YWx1ZTtcbiAgICAgICAgdmFyIGZuUmV0VmFsID0gcHJvcC5mblZhbHVlICE9IG51bGwgPyBwcm9wLmZuVmFsdWUgOiBmbihlbGUpOyAvLyBjaGVjayBmb3IgY2FjaGVkIHZhbHVlIGJlZm9yZSBjYWxsaW5nIGZ1bmN0aW9uXG5cbiAgICAgICAgcHJvcC5wcmV2Rm5WYWx1ZSA9IGZuUmV0VmFsO1xuICAgICAgICBpZiAoZm5SZXRWYWwgPT0gbnVsbCkge1xuICAgICAgICAgIHdhcm4oJ0N1c3RvbSBmdW5jdGlvbiBtYXBwZXJzIG1heSBub3QgcmV0dXJuIG51bGwgKGkuZS4gYCcgKyBwcm9wLm5hbWUgKyAnYCBmb3IgZWxlIGAnICsgZWxlLmlkKCkgKyAnYCBpcyBudWxsKScpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmbGF0UHJvcCA9IHRoaXMucGFyc2UocHJvcC5uYW1lLCBmblJldFZhbCwgcHJvcC5ieXBhc3MsIGZsYXRQcm9wTWFwcGluZyk7XG4gICAgICAgIGlmICghZmxhdFByb3ApIHtcbiAgICAgICAgICB3YXJuKCdDdXN0b20gZnVuY3Rpb24gbWFwcGVycyBtYXkgbm90IHJldHVybiBpbnZhbGlkIHZhbHVlcyBmb3IgdGhlIHByb3BlcnR5IHR5cGUgKGkuZS4gYCcgKyBwcm9wLm5hbWUgKyAnYCBmb3IgZWxlIGAnICsgZWxlLmlkKCkgKyAnYCBpcyBpbnZhbGlkKScpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmbGF0UHJvcC5tYXBwaW5nID0gY29weShwcm9wKTsgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgbWFwcGluZ1xuICAgICAgICBwcm9wID0gZmxhdFByb3A7IC8vIHRoZSBmbGF0dGVuZWQgKG1hcHBlZCkgcHJvcGVydHkgaXMgdGhlIG9uZSB3ZSB3YW50XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICBicmVhaztcbiAgICAvLyBqdXN0IHNldCB0aGUgcHJvcGVydHlcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gbm90IGEgdmFsaWQgbWFwcGluZ1xuICB9XG5cbiAgLy8gaWYgdGhlIHByb3BlcnR5IGlzIGEgYnlwYXNzIHByb3BlcnR5LCB0aGVuIGxpbmsgdGhlIHJlc3VsdGFudCBwcm9wZXJ0eSB0byB0aGUgb3JpZ2luYWwgb25lXG4gIGlmIChwcm9wSXNCeXBhc3MpIHtcbiAgICBpZiAob3JpZ1Byb3BJc0J5cGFzcykge1xuICAgICAgLy8gdGhlbiB0aGlzIGJ5cGFzcyBvdmVycmlkZXMgdGhlIGV4aXN0aW5nIG9uZVxuICAgICAgcHJvcC5ieXBhc3NlZCA9IG9yaWdQcm9wLmJ5cGFzc2VkOyAvLyBzdGVhbCBieXBhc3NlZCBwcm9wIGZyb20gb2xkIGJ5cGFzc1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGVuIGxpbmsgdGhlIG9yaWcgcHJvcCB0byB0aGUgbmV3IGJ5cGFzc1xuICAgICAgcHJvcC5ieXBhc3NlZCA9IG9yaWdQcm9wO1xuICAgIH1cbiAgICBzdHlsZVtwcm9wLm5hbWVdID0gcHJvcDsgLy8gYW5kIHNldFxuICB9IGVsc2Uge1xuICAgIC8vIHByb3AgaXMgbm90IGJ5cGFzc1xuICAgIGlmIChvcmlnUHJvcElzQnlwYXNzKSB7XG4gICAgICAvLyB0aGVuIGtlZXAgdGhlIG9yaWcgcHJvcCAoc2luY2UgaXQncyBhIGJ5cGFzcykgYW5kIGxpbmsgdG8gdGhlIG5ldyBwcm9wXG4gICAgICBvcmlnUHJvcC5ieXBhc3NlZCA9IHByb3A7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZW4ganVzdCByZXBsYWNlIHRoZSBvbGQgcHJvcCB3aXRoIHRoZSBuZXcgb25lXG4gICAgICBzdHlsZVtwcm9wLm5hbWVdID0gcHJvcDtcbiAgICB9XG4gIH1cbiAgY2hlY2tUcmlnZ2VycygpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5zdHlmbiQ4LmNsZWFuRWxlbWVudHMgPSBmdW5jdGlvbiAoZWxlcywga2VlcEJ5cGFzc2VzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHRoaXMuY2xlYXJTdHlsZUhpbnRzKGVsZSk7XG4gICAgZWxlLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpO1xuICAgIGVsZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgICBpZiAoIWtlZXBCeXBhc3Nlcykge1xuICAgICAgZWxlLl9wcml2YXRlLnN0eWxlID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdHlsZSA9IGVsZS5fcHJpdmF0ZS5zdHlsZTtcbiAgICAgIHZhciBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhzdHlsZSk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByb3BOYW1lcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgcHJvcE5hbWUgPSBwcm9wTmFtZXNbal07XG4gICAgICAgIHZhciBlbGVQcm9wID0gc3R5bGVbcHJvcE5hbWVdO1xuICAgICAgICBpZiAoZWxlUHJvcCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKGVsZVByb3AuYnlwYXNzKSB7XG4gICAgICAgICAgICBlbGVQcm9wLmJ5cGFzc2VkID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3R5bGVbcHJvcE5hbWVdID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbi8vIHVwZGF0ZXMgdGhlIHZpc3VhbCBzdHlsZSBmb3IgYWxsIGVsZW1lbnRzICh1c2VmdWwgZm9yIG1hbnVhbCBzdHlsZSBtb2RpZmljYXRpb24gYWZ0ZXIgaW5pdClcbnN0eWZuJDgudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICB2YXIgZWxlcyA9IGN5Lm11dGFibGVFbGVtZW50cygpO1xuICBlbGVzLnVwZGF0ZVN0eWxlKCk7XG59O1xuXG4vLyBkaWZmUHJvcHMgOiB7IG5hbWUgPT4geyBwcmV2LCBuZXh0IH0gfVxuc3R5Zm4kOC51cGRhdGVUcmFuc2l0aW9ucyA9IGZ1bmN0aW9uIChlbGUsIGRpZmZQcm9wcykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHByb3BzID0gZWxlLnBzdHlsZSgndHJhbnNpdGlvbi1wcm9wZXJ0eScpLnZhbHVlO1xuICB2YXIgZHVyYXRpb24gPSBlbGUucHN0eWxlKCd0cmFuc2l0aW9uLWR1cmF0aW9uJykucGZWYWx1ZTtcbiAgdmFyIGRlbGF5ID0gZWxlLnBzdHlsZSgndHJhbnNpdGlvbi1kZWxheScpLnBmVmFsdWU7XG4gIGlmIChwcm9wcy5sZW5ndGggPiAwICYmIGR1cmF0aW9uID4gMCkge1xuICAgIHZhciBzdHlsZSA9IHt9O1xuXG4gICAgLy8gYnVpbGQgdXAgdGhlIHN0eWxlIHRvIGFuaW1hdGUgdG93YXJkc1xuICAgIHZhciBhbnlQcmV2ID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wc1tpXTtcbiAgICAgIHZhciBzdHlQcm9wID0gZWxlLnBzdHlsZShwcm9wKTtcbiAgICAgIHZhciBkaWZmUHJvcCA9IGRpZmZQcm9wc1twcm9wXTtcbiAgICAgIGlmICghZGlmZlByb3ApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgcHJldlByb3AgPSBkaWZmUHJvcC5wcmV2O1xuICAgICAgdmFyIGZyb21Qcm9wID0gcHJldlByb3A7XG4gICAgICB2YXIgdG9Qcm9wID0gZGlmZlByb3AubmV4dCAhPSBudWxsID8gZGlmZlByb3AubmV4dCA6IHN0eVByb3A7XG4gICAgICB2YXIgZGlmZiA9IGZhbHNlO1xuICAgICAgdmFyIGluaXRWYWwgPSB2b2lkIDA7XG4gICAgICB2YXIgaW5pdER0ID0gMC4wMDAwMDE7IC8vIGRlbHRhIHRpbWUgJSB2YWx1ZSBmb3IgaW5pdFZhbCAoYWxsb3dzIGFuaW1hdGluZyBvdXQgb2YgaW5pdCB6ZXJvIG9wYWNpdHkpXG5cbiAgICAgIGlmICghZnJvbVByb3ApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnNpZGVyIHB4IHZhbHVlc1xuICAgICAgaWYgKG51bWJlciQxKGZyb21Qcm9wLnBmVmFsdWUpICYmIG51bWJlciQxKHRvUHJvcC5wZlZhbHVlKSkge1xuICAgICAgICBkaWZmID0gdG9Qcm9wLnBmVmFsdWUgLSBmcm9tUHJvcC5wZlZhbHVlOyAvLyBub256ZXJvIGlzIHRydXRoeVxuICAgICAgICBpbml0VmFsID0gZnJvbVByb3AucGZWYWx1ZSArIGluaXREdCAqIGRpZmY7XG5cbiAgICAgICAgLy8gY29uc2lkZXIgbnVtZXJpY2FsIHZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChudW1iZXIkMShmcm9tUHJvcC52YWx1ZSkgJiYgbnVtYmVyJDEodG9Qcm9wLnZhbHVlKSkge1xuICAgICAgICBkaWZmID0gdG9Qcm9wLnZhbHVlIC0gZnJvbVByb3AudmFsdWU7IC8vIG5vbnplcm8gaXMgdHJ1dGh5XG4gICAgICAgIGluaXRWYWwgPSBmcm9tUHJvcC52YWx1ZSArIGluaXREdCAqIGRpZmY7XG5cbiAgICAgICAgLy8gY29uc2lkZXIgY29sb3VyIHZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChhcnJheShmcm9tUHJvcC52YWx1ZSkgJiYgYXJyYXkodG9Qcm9wLnZhbHVlKSkge1xuICAgICAgICBkaWZmID0gZnJvbVByb3AudmFsdWVbMF0gIT09IHRvUHJvcC52YWx1ZVswXSB8fCBmcm9tUHJvcC52YWx1ZVsxXSAhPT0gdG9Qcm9wLnZhbHVlWzFdIHx8IGZyb21Qcm9wLnZhbHVlWzJdICE9PSB0b1Byb3AudmFsdWVbMl07XG4gICAgICAgIGluaXRWYWwgPSBmcm9tUHJvcC5zdHJWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdGhlIHByZXZpb3VzIHZhbHVlIGlzIGdvb2QgZm9yIGFuIGFuaW1hdGlvbiBvbmx5IGlmIGl0J3MgZGlmZmVyZW50XG4gICAgICBpZiAoZGlmZikge1xuICAgICAgICBzdHlsZVtwcm9wXSA9IHRvUHJvcC5zdHJWYWx1ZTsgLy8gdG8gdmFsXG4gICAgICAgIHRoaXMuYXBwbHlCeXBhc3MoZWxlLCBwcm9wLCBpbml0VmFsKTsgLy8gZnJvbSB2YWxcbiAgICAgICAgYW55UHJldiA9IHRydWU7XG4gICAgICB9XG4gICAgfSAvLyBlbmQgaWYgcHJvcHMgYWxsb3cgYW5pXG5cbiAgICAvLyBjYW4ndCB0cmFuc2l0aW9uIGlmIHRoZXJlJ3Mgbm90aGluZyBwcmV2aW91cyB0byB0cmFuc2l0aW9uIGZyb21cbiAgICBpZiAoIWFueVByZXYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgX3AudHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgICBlbGUuZGVsYXlBbmltYXRpb24oZGVsYXkpLnBsYXkoKS5wcm9taXNlKCkudGhlbihyZXNvbHZlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBlbGUuYW5pbWF0aW9uKHtcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgIGVhc2luZzogZWxlLnBzdHlsZSgndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nKS52YWx1ZSxcbiAgICAgICAgcXVldWU6IGZhbHNlXG4gICAgICB9KS5wbGF5KCkucHJvbWlzZSgpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgLy8gaWYoICFpc0J5cGFzcyApe1xuICAgICAgc2VsZi5yZW1vdmVCeXBhc3NlcyhlbGUsIHByb3BzKTtcbiAgICAgIGVsZS5lbWl0QW5kTm90aWZ5KCdzdHlsZScpO1xuICAgICAgLy8gfVxuXG4gICAgICBfcC50cmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoX3AudHJhbnNpdGlvbmluZykge1xuICAgIHRoaXMucmVtb3ZlQnlwYXNzZXMoZWxlLCBwcm9wcyk7XG4gICAgZWxlLmVtaXRBbmROb3RpZnkoJ3N0eWxlJyk7XG4gICAgX3AudHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICB9XG59O1xuc3R5Zm4kOC5jaGVja1RyaWdnZXIgPSBmdW5jdGlvbiAoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUsIGdldFRyaWdnZXIsIG9uVHJpZ2dlcikge1xuICB2YXIgcHJvcCA9IHRoaXMucHJvcGVydGllc1tuYW1lXTtcbiAgdmFyIHRyaWdnZXJDaGVjayA9IGdldFRyaWdnZXIocHJvcCk7XG4gIGlmICh0cmlnZ2VyQ2hlY2sgIT0gbnVsbCAmJiB0cmlnZ2VyQ2hlY2soZnJvbVZhbHVlLCB0b1ZhbHVlKSkge1xuICAgIG9uVHJpZ2dlcihwcm9wKTtcbiAgfVxufTtcbnN0eWZuJDguY2hlY2taT3JkZXJUcmlnZ2VyID0gZnVuY3Rpb24gKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIHRoaXMuY2hlY2tUcmlnZ2VyKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlLCBmdW5jdGlvbiAocHJvcCkge1xuICAgIHJldHVybiBwcm9wLnRyaWdnZXJzWk9yZGVyO1xuICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMuX3ByaXZhdGUuY3kubm90aWZ5KCd6b3JkZXInLCBlbGUpO1xuICB9KTtcbn07XG5zdHlmbiQ4LmNoZWNrQm91bmRzVHJpZ2dlciA9IGZ1bmN0aW9uIChlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSkge1xuICB0aGlzLmNoZWNrVHJpZ2dlcihlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSwgZnVuY3Rpb24gKHByb3ApIHtcbiAgICByZXR1cm4gcHJvcC50cmlnZ2Vyc0JvdW5kcztcbiAgfSwgZnVuY3Rpb24gKHByb3ApIHtcbiAgICBlbGUuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG4gICAgZWxlLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuXG4gICAgLy8gaWYgdGhlIHByb3AgY2hhbmdlIG1ha2VzIHRoZSBiYiBvZiBwbGwgYmV6aWVyIGVkZ2VzIGludmFsaWQsXG4gICAgLy8gdGhlbiBkaXJ0eSB0aGUgcGxsIGVkZ2UgYmIgY2FjaGUgYXMgd2VsbFxuICAgIGlmIChcbiAgICAvLyBvbmx5IGZvciBiZXppZXJzIC0tIHNvIHBlcmZvcm1hbmNlIG9mIG90aGVyIGVkZ2VzIGlzbid0IGFmZmVjdGVkXG4gICAgcHJvcC50cmlnZ2Vyc0JvdW5kc09mUGFyYWxsZWxCZXppZXJzICYmIG5hbWUgPT09ICdjdXJ2ZS1zdHlsZScgJiYgKGZyb21WYWx1ZSA9PT0gJ2JlemllcicgfHwgdG9WYWx1ZSA9PT0gJ2JlemllcicpKSB7XG4gICAgICBlbGUucGFyYWxsZWxFZGdlcygpLmZvckVhY2goZnVuY3Rpb24gKHBsbEVkZ2UpIHtcbiAgICAgICAgaWYgKHBsbEVkZ2UuaXNCdW5kbGVkQmV6aWVyKCkpIHtcbiAgICAgICAgICBwbGxFZGdlLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHByb3AudHJpZ2dlcnNCb3VuZHNPZkNvbm5lY3RlZEVkZ2VzICYmIG5hbWUgPT09ICdkaXNwbGF5JyAmJiAoZnJvbVZhbHVlID09PSAnbm9uZScgfHwgdG9WYWx1ZSA9PT0gJ25vbmUnKSkge1xuICAgICAgZWxlLmNvbm5lY3RlZEVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICBlZGdlLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn07XG5zdHlmbiQ4LmNoZWNrVHJpZ2dlcnMgPSBmdW5jdGlvbiAoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUpIHtcbiAgZWxlLmRpcnR5U3R5bGVDYWNoZSgpO1xuICB0aGlzLmNoZWNrWk9yZGVyVHJpZ2dlcihlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSk7XG4gIHRoaXMuY2hlY2tCb3VuZHNUcmlnZ2VyKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlKTtcbn07XG5cbnZhciBzdHlmbiQ3ID0ge307XG5cbi8vIGJ5cGFzc2VzIGFyZSBhcHBsaWVkIHRvIGFuIGV4aXN0aW5nIHN0eWxlIG9uIGFuIGVsZW1lbnQsIGFuZCBqdXN0IHRhY2tlZCBvbiB0ZW1wb3JhcmlseVxuLy8gcmV0dXJucyB0cnVlIGlmZiBhcHBsaWNhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBmb3IgYXQgbGVhc3QgMSBzcGVjaWZpZWQgcHJvcGVydHlcbnN0eWZuJDcuYXBwbHlCeXBhc3MgPSBmdW5jdGlvbiAoZWxlcywgbmFtZSwgdmFsdWUsIHVwZGF0ZVRyYW5zaXRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHByb3BzID0gW107XG4gIHZhciBpc0J5cGFzcyA9IHRydWU7XG5cbiAgLy8gcHV0IGFsbCB0aGUgcHJvcGVydGllcyAoY2FuIHNwZWNpZnkgb25lIG9yIG1hbnkpIGluIGFuIGFycmF5IGFmdGVyIHBhcnNpbmcgdGhlbVxuICBpZiAobmFtZSA9PT0gJyonIHx8IG5hbWUgPT09ICcqKicpIHtcbiAgICAvLyBhcHBseSB0byBhbGwgcHJvcGVydHkgbmFtZXNcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcHJvcCA9IHNlbGYucHJvcGVydGllc1tpXTtcbiAgICAgICAgdmFyIF9uYW1lID0gcHJvcC5uYW1lO1xuICAgICAgICB2YXIgcGFyc2VkUHJvcCA9IHRoaXMucGFyc2UoX25hbWUsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgaWYgKHBhcnNlZFByb3ApIHtcbiAgICAgICAgICBwcm9wcy5wdXNoKHBhcnNlZFByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHN0cmluZyhuYW1lKSkge1xuICAgIC8vIHRoZW4gcGFyc2UgdGhlIHNpbmdsZSBwcm9wZXJ0eVxuICAgIHZhciBfcGFyc2VkUHJvcCA9IHRoaXMucGFyc2UobmFtZSwgdmFsdWUsIHRydWUpO1xuICAgIGlmIChfcGFyc2VkUHJvcCkge1xuICAgICAgcHJvcHMucHVzaChfcGFyc2VkUHJvcCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHBsYWluT2JqZWN0KG5hbWUpKSB7XG4gICAgLy8gdGhlbiBwYXJzZSBlYWNoIHByb3BlcnR5XG4gICAgdmFyIHNwZWNpZmllZFByb3BzID0gbmFtZTtcbiAgICB1cGRhdGVUcmFuc2l0aW9ucyA9IHZhbHVlO1xuICAgIHZhciBuYW1lcyA9IE9iamVjdC5rZXlzKHNwZWNpZmllZFByb3BzKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbmFtZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX25hbWUyID0gbmFtZXNbX2ldO1xuICAgICAgdmFyIF92YWx1ZSA9IHNwZWNpZmllZFByb3BzW19uYW1lMl07XG4gICAgICBpZiAoX3ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdHJ5IGNhbWVsIGNhc2UgbmFtZSB0b29cbiAgICAgICAgX3ZhbHVlID0gc3BlY2lmaWVkUHJvcHNbZGFzaDJjYW1lbChfbmFtZTIpXTtcbiAgICAgIH1cbiAgICAgIGlmIChfdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgX3BhcnNlZFByb3AyID0gdGhpcy5wYXJzZShfbmFtZTIsIF92YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIGlmIChfcGFyc2VkUHJvcDIpIHtcbiAgICAgICAgICBwcm9wcy5wdXNoKF9wYXJzZWRQcm9wMik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gY2FuJ3QgZG8gYW55dGhpbmcgd2l0aG91dCB3ZWxsIGRlZmluZWQgcHJvcGVydGllc1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHdlJ3ZlIGZhaWxlZCBpZiB0aGVyZSBhcmUgbm8gdmFsaWQgcHJvcGVydGllc1xuICBpZiAocHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gbm93LCBhcHBseSB0aGUgYnlwYXNzIHByb3BlcnRpZXMgb24gdGhlIGVsZW1lbnRzXG4gIHZhciByZXQgPSBmYWxzZTsgLy8gcmV0dXJuIHRydWUgaWYgYXQgbGVhc3Qgb25lIHN1Y2Nlc2Z1bCBieXBhc3MgYXBwbGllZFxuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBlbGVzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAvLyBmb3IgZWFjaCBlbGVcbiAgICB2YXIgZWxlID0gZWxlc1tfaTJdO1xuICAgIHZhciBkaWZmUHJvcHMgPSB7fTtcbiAgICB2YXIgZGlmZlByb3AgPSB2b2lkIDA7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgICAgLy8gZm9yIGVhY2ggcHJvcFxuICAgICAgdmFyIF9wcm9wID0gcHJvcHNbal07XG4gICAgICBpZiAodXBkYXRlVHJhbnNpdGlvbnMpIHtcbiAgICAgICAgdmFyIHByZXZQcm9wID0gZWxlLnBzdHlsZShfcHJvcC5uYW1lKTtcbiAgICAgICAgZGlmZlByb3AgPSBkaWZmUHJvcHNbX3Byb3AubmFtZV0gPSB7XG4gICAgICAgICAgcHJldjogcHJldlByb3BcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldCA9IHRoaXMuYXBwbHlQYXJzZWRQcm9wZXJ0eShlbGUsIGNvcHkoX3Byb3ApKSB8fCByZXQ7XG4gICAgICBpZiAodXBkYXRlVHJhbnNpdGlvbnMpIHtcbiAgICAgICAgZGlmZlByb3AubmV4dCA9IGVsZS5wc3R5bGUoX3Byb3AubmFtZSk7XG4gICAgICB9XG4gICAgfSAvLyBmb3IgcHJvcHNcblxuICAgIGlmIChyZXQpIHtcbiAgICAgIHRoaXMudXBkYXRlU3R5bGVIaW50cyhlbGUpO1xuICAgIH1cbiAgICBpZiAodXBkYXRlVHJhbnNpdGlvbnMpIHtcbiAgICAgIHRoaXMudXBkYXRlVHJhbnNpdGlvbnMoZWxlLCBkaWZmUHJvcHMsIGlzQnlwYXNzKTtcbiAgICB9XG4gIH0gLy8gZm9yIGVsZXNcblxuICByZXR1cm4gcmV0O1xufTtcblxuLy8gb25seSB1c2VmdWwgaW4gc3BlY2lmaWMgY2FzZXMgbGlrZSBhbmltYXRpb25cbnN0eWZuJDcub3ZlcnJpZGVCeXBhc3MgPSBmdW5jdGlvbiAoZWxlcywgbmFtZSwgdmFsdWUpIHtcbiAgbmFtZSA9IGNhbWVsMmRhc2gobmFtZSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHZhciBwcm9wID0gZWxlLl9wcml2YXRlLnN0eWxlW25hbWVdO1xuICAgIHZhciB0eXBlID0gdGhpcy5wcm9wZXJ0aWVzW25hbWVdLnR5cGU7XG4gICAgdmFyIGlzQ29sb3IgPSB0eXBlLmNvbG9yO1xuICAgIHZhciBpc011bHRpID0gdHlwZS5tdXRpcGxlO1xuICAgIHZhciBvbGRWYWx1ZSA9ICFwcm9wID8gbnVsbCA6IHByb3AucGZWYWx1ZSAhPSBudWxsID8gcHJvcC5wZlZhbHVlIDogcHJvcC52YWx1ZTtcbiAgICBpZiAoIXByb3AgfHwgIXByb3AuYnlwYXNzKSB7XG4gICAgICAvLyBuZWVkIGEgYnlwYXNzIGlmIG9uZSBkb2Vzbid0IGV4aXN0XG4gICAgICB0aGlzLmFwcGx5QnlwYXNzKGVsZSwgbmFtZSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wLnZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAocHJvcC5wZlZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgcHJvcC5wZlZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNDb2xvcikge1xuICAgICAgICBwcm9wLnN0clZhbHVlID0gJ3JnYignICsgdmFsdWUuam9pbignLCcpICsgJyknO1xuICAgICAgfSBlbHNlIGlmIChpc011bHRpKSB7XG4gICAgICAgIHByb3Auc3RyVmFsdWUgPSB2YWx1ZS5qb2luKCcgJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wLnN0clZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlU3R5bGVIaW50cyhlbGUpO1xuICAgIH1cbiAgICB0aGlzLmNoZWNrVHJpZ2dlcnMoZWxlLCBuYW1lLCBvbGRWYWx1ZSwgdmFsdWUpO1xuICB9XG59O1xuc3R5Zm4kNy5yZW1vdmVBbGxCeXBhc3NlcyA9IGZ1bmN0aW9uIChlbGVzLCB1cGRhdGVUcmFuc2l0aW9ucykge1xuICByZXR1cm4gdGhpcy5yZW1vdmVCeXBhc3NlcyhlbGVzLCB0aGlzLnByb3BlcnR5TmFtZXMsIHVwZGF0ZVRyYW5zaXRpb25zKTtcbn07XG5zdHlmbiQ3LnJlbW92ZUJ5cGFzc2VzID0gZnVuY3Rpb24gKGVsZXMsIHByb3BzLCB1cGRhdGVUcmFuc2l0aW9ucykge1xuICB2YXIgaXNCeXBhc3MgPSB0cnVlO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IGVsZXMubGVuZ3RoOyBqKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tqXTtcbiAgICB2YXIgZGlmZlByb3BzID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBwcm9wc1tpXTtcbiAgICAgIHZhciBwcm9wID0gdGhpcy5wcm9wZXJ0aWVzW25hbWVdO1xuICAgICAgdmFyIHByZXZQcm9wID0gZWxlLnBzdHlsZShwcm9wLm5hbWUpO1xuICAgICAgaWYgKCFwcmV2UHJvcCB8fCAhcHJldlByb3AuYnlwYXNzKSB7XG4gICAgICAgIC8vIGlmIGEgYnlwYXNzIGRvZXNuJ3QgZXhpc3QgZm9yIHRoZSBwcm9wLCBub3RoaW5nIG5lZWRzIHRvIGJlIHJlbW92ZWRcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSAnJzsgLy8gZW1wdHkgPT4gcmVtb3ZlIGJ5cGFzc1xuICAgICAgdmFyIHBhcnNlZFByb3AgPSB0aGlzLnBhcnNlKG5hbWUsIHZhbHVlLCB0cnVlKTtcbiAgICAgIHZhciBkaWZmUHJvcCA9IGRpZmZQcm9wc1twcm9wLm5hbWVdID0ge1xuICAgICAgICBwcmV2OiBwcmV2UHJvcFxuICAgICAgfTtcbiAgICAgIHRoaXMuYXBwbHlQYXJzZWRQcm9wZXJ0eShlbGUsIHBhcnNlZFByb3ApO1xuICAgICAgZGlmZlByb3AubmV4dCA9IGVsZS5wc3R5bGUocHJvcC5uYW1lKTtcbiAgICB9IC8vIGZvciBwcm9wc1xuXG4gICAgdGhpcy51cGRhdGVTdHlsZUhpbnRzKGVsZSk7XG4gICAgaWYgKHVwZGF0ZVRyYW5zaXRpb25zKSB7XG4gICAgICB0aGlzLnVwZGF0ZVRyYW5zaXRpb25zKGVsZSwgZGlmZlByb3BzLCBpc0J5cGFzcyk7XG4gICAgfVxuICB9IC8vIGZvciBlbGVzXG59O1xuXG52YXIgc3R5Zm4kNiA9IHt9O1xuXG4vLyBnZXRzIHdoYXQgYW4gZW0gc2l6ZSBjb3JyZXNwb25kcyB0byBpbiBwaXhlbHMgcmVsYXRpdmUgdG8gYSBkb20gZWxlbWVudFxuc3R5Zm4kNi5nZXRFbVNpemVJblBpeGVscyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHB4ID0gdGhpcy5jb250YWluZXJDc3MoJ2ZvbnQtc2l6ZScpO1xuICBpZiAocHggIT0gbnVsbCkge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHB4KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMTsgLy8gZm9yIGhlYWRsZXNzXG4gIH1cbn07XG5cbi8vIGdldHMgY3NzIHByb3BlcnR5IGZyb20gdGhlIGNvcmUgY29udGFpbmVyXG5zdHlmbiQ2LmNvbnRhaW5lckNzcyA9IGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICB2YXIgZG9tRWxlbWVudCA9IGN5LmNvbnRhaW5lcigpO1xuICB2YXIgY29udGFpbmVyV2luZG93ID0gY3kud2luZG93KCk7XG4gIGlmIChjb250YWluZXJXaW5kb3cgJiYgZG9tRWxlbWVudCAmJiBjb250YWluZXJXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSkge1xuICAgIHJldHVybiBjb250YWluZXJXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb21FbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKHByb3BOYW1lKTtcbiAgfVxufTtcblxudmFyIHN0eWZuJDUgPSB7fTtcblxuLy8gZ2V0cyB0aGUgcmVuZGVyZWQgc3R5bGUgZm9yIGFuIGVsZW1lbnRcbnN0eWZuJDUuZ2V0UmVuZGVyZWRTdHlsZSA9IGZ1bmN0aW9uIChlbGUsIHByb3ApIHtcbiAgaWYgKHByb3ApIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHlsZVByb3BlcnR5VmFsdWUoZWxlLCBwcm9wLCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSYXdTdHlsZShlbGUsIHRydWUpO1xuICB9XG59O1xuXG4vLyBnZXRzIHRoZSByYXcgc3R5bGUgZm9yIGFuIGVsZW1lbnRcbnN0eWZuJDUuZ2V0UmF3U3R5bGUgPSBmdW5jdGlvbiAoZWxlLCBpc1JlbmRlcmVkVmFsKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgZWxlID0gZWxlWzBdOyAvLyBpbnN1cmUgaXQncyBhbiBlbGVtZW50XG5cbiAgaWYgKGVsZSkge1xuICAgIHZhciByc3R5bGUgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBzZWxmLnByb3BlcnRpZXNbaV07XG4gICAgICB2YXIgdmFsID0gc2VsZi5nZXRTdHlsZVByb3BlcnR5VmFsdWUoZWxlLCBwcm9wLm5hbWUsIGlzUmVuZGVyZWRWYWwpO1xuICAgICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICAgIHJzdHlsZVtwcm9wLm5hbWVdID0gdmFsO1xuICAgICAgICByc3R5bGVbZGFzaDJjYW1lbChwcm9wLm5hbWUpXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJzdHlsZTtcbiAgfVxufTtcbnN0eWZuJDUuZ2V0SW5kZXhlZFN0eWxlID0gZnVuY3Rpb24gKGVsZSwgcHJvcGVydHksIHN1YnByb3BlcnR5LCBpbmRleCkge1xuICB2YXIgcHN0eWxlID0gZWxlLnBzdHlsZShwcm9wZXJ0eSlbc3VicHJvcGVydHldW2luZGV4XTtcbiAgcmV0dXJuIHBzdHlsZSAhPSBudWxsID8gcHN0eWxlIDogZWxlLmN5KCkuc3R5bGUoKS5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHkpW3N1YnByb3BlcnR5XVswXTtcbn07XG5zdHlmbiQ1LmdldFN0eWxlUHJvcGVydHlWYWx1ZSA9IGZ1bmN0aW9uIChlbGUsIHByb3BOYW1lLCBpc1JlbmRlcmVkVmFsKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgZWxlID0gZWxlWzBdOyAvLyBpbnN1cmUgaXQncyBhbiBlbGVtZW50XG5cbiAgaWYgKGVsZSkge1xuICAgIHZhciBwcm9wID0gc2VsZi5wcm9wZXJ0aWVzW3Byb3BOYW1lXTtcbiAgICBpZiAocHJvcC5hbGlhcykge1xuICAgICAgcHJvcCA9IHByb3AucG9pbnRzVG87XG4gICAgfVxuICAgIHZhciB0eXBlID0gcHJvcC50eXBlO1xuICAgIHZhciBzdHlsZVByb3AgPSBlbGUucHN0eWxlKHByb3AubmFtZSk7XG4gICAgaWYgKHN0eWxlUHJvcCkge1xuICAgICAgdmFyIHZhbHVlID0gc3R5bGVQcm9wLnZhbHVlLFxuICAgICAgICB1bml0cyA9IHN0eWxlUHJvcC51bml0cyxcbiAgICAgICAgc3RyVmFsdWUgPSBzdHlsZVByb3Auc3RyVmFsdWU7XG4gICAgICBpZiAoaXNSZW5kZXJlZFZhbCAmJiB0eXBlLm51bWJlciAmJiB2YWx1ZSAhPSBudWxsICYmIG51bWJlciQxKHZhbHVlKSkge1xuICAgICAgICB2YXIgem9vbSA9IGVsZS5jeSgpLnpvb20oKTtcbiAgICAgICAgdmFyIGdldFJlbmRlcmVkVmFsdWUgPSBmdW5jdGlvbiBnZXRSZW5kZXJlZFZhbHVlKHZhbCkge1xuICAgICAgICAgIHJldHVybiB2YWwgKiB6b29tO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgZ2V0VmFsdWVTdHJpbmdXaXRoVW5pdHMgPSBmdW5jdGlvbiBnZXRWYWx1ZVN0cmluZ1dpdGhVbml0cyh2YWwsIHVuaXRzKSB7XG4gICAgICAgICAgcmV0dXJuIGdldFJlbmRlcmVkVmFsdWUodmFsKSArIHVuaXRzO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgaXNBcnJheVZhbHVlID0gYXJyYXkodmFsdWUpO1xuICAgICAgICB2YXIgaGF2ZVVuaXRzID0gaXNBcnJheVZhbHVlID8gdW5pdHMuZXZlcnkoZnVuY3Rpb24gKHUpIHtcbiAgICAgICAgICByZXR1cm4gdSAhPSBudWxsO1xuICAgICAgICB9KSA6IHVuaXRzICE9IG51bGw7XG4gICAgICAgIGlmIChoYXZlVW5pdHMpIHtcbiAgICAgICAgICBpZiAoaXNBcnJheVZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKGZ1bmN0aW9uICh2LCBpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZVN0cmluZ1dpdGhVbml0cyh2LCB1bml0c1tpXSk7XG4gICAgICAgICAgICB9KS5qb2luKCcgJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZVN0cmluZ1dpdGhVbml0cyh2YWx1ZSwgdW5pdHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaXNBcnJheVZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgIHJldHVybiBzdHJpbmcodikgPyB2IDogJycgKyBnZXRSZW5kZXJlZFZhbHVlKHYpO1xuICAgICAgICAgICAgfSkuam9pbignICcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJycgKyBnZXRSZW5kZXJlZFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RyVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3RyVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuc3R5Zm4kNS5nZXRBbmltYXRpb25TdGFydFN0eWxlID0gZnVuY3Rpb24gKGVsZSwgYW5pUHJvcHMpIHtcbiAgdmFyIHJzdHlsZSA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFuaVByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGFuaVByb3AgPSBhbmlQcm9wc1tpXTtcbiAgICB2YXIgbmFtZSA9IGFuaVByb3AubmFtZTtcbiAgICB2YXIgc3R5bGVQcm9wID0gZWxlLnBzdHlsZShuYW1lKTtcbiAgICBpZiAoc3R5bGVQcm9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHRoZW4gbWFrZSBhIHByb3Agb2YgaXRcbiAgICAgIGlmIChwbGFpbk9iamVjdChzdHlsZVByb3ApKSB7XG4gICAgICAgIHN0eWxlUHJvcCA9IHRoaXMucGFyc2UobmFtZSwgc3R5bGVQcm9wLnN0clZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0eWxlUHJvcCA9IHRoaXMucGFyc2UobmFtZSwgc3R5bGVQcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0eWxlUHJvcCkge1xuICAgICAgcnN0eWxlW25hbWVdID0gc3R5bGVQcm9wO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcnN0eWxlO1xufTtcbnN0eWZuJDUuZ2V0UHJvcHNMaXN0ID0gZnVuY3Rpb24gKHByb3BzT2JqKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHJzdHlsZSA9IFtdO1xuICB2YXIgc3R5bGUgPSBwcm9wc09iajtcbiAgdmFyIHByb3BzID0gc2VsZi5wcm9wZXJ0aWVzO1xuICBpZiAoc3R5bGUpIHtcbiAgICB2YXIgbmFtZXMgPSBPYmplY3Qua2V5cyhzdHlsZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgIHZhciB2YWwgPSBzdHlsZVtuYW1lXTtcbiAgICAgIHZhciBwcm9wID0gcHJvcHNbbmFtZV0gfHwgcHJvcHNbY2FtZWwyZGFzaChuYW1lKV07XG4gICAgICB2YXIgc3R5bGVQcm9wID0gdGhpcy5wYXJzZShwcm9wLm5hbWUsIHZhbCk7XG4gICAgICBpZiAoc3R5bGVQcm9wKSB7XG4gICAgICAgIHJzdHlsZS5wdXNoKHN0eWxlUHJvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByc3R5bGU7XG59O1xuc3R5Zm4kNS5nZXROb25EZWZhdWx0UHJvcGVydGllc0hhc2ggPSBmdW5jdGlvbiAoZWxlLCBwcm9wTmFtZXMsIHNlZWQpIHtcbiAgdmFyIGhhc2ggPSBzZWVkLnNsaWNlKCk7XG4gIHZhciBuYW1lLCB2YWwsIHN0clZhbCwgY2hWYWw7XG4gIHZhciBpLCBqO1xuICBmb3IgKGkgPSAwOyBpIDwgcHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbmFtZSA9IHByb3BOYW1lc1tpXTtcbiAgICB2YWwgPSBlbGUucHN0eWxlKG5hbWUsIGZhbHNlKTtcbiAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAodmFsLnBmVmFsdWUgIT0gbnVsbCkge1xuICAgICAgaGFzaFswXSA9IGhhc2hJbnQoY2hWYWwsIGhhc2hbMF0pO1xuICAgICAgaGFzaFsxXSA9IGhhc2hJbnRBbHQoY2hWYWwsIGhhc2hbMV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJWYWwgPSB2YWwuc3RyVmFsdWU7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgc3RyVmFsLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNoVmFsID0gc3RyVmFsLmNoYXJDb2RlQXQoaik7XG4gICAgICAgIGhhc2hbMF0gPSBoYXNoSW50KGNoVmFsLCBoYXNoWzBdKTtcbiAgICAgICAgaGFzaFsxXSA9IGhhc2hJbnRBbHQoY2hWYWwsIGhhc2hbMV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gaGFzaDtcbn07XG5zdHlmbiQ1LmdldFByb3BlcnRpZXNIYXNoID0gc3R5Zm4kNS5nZXROb25EZWZhdWx0UHJvcGVydGllc0hhc2g7XG5cbnZhciBzdHlmbiQ0ID0ge307XG5zdHlmbiQ0LmFwcGVuZEZyb21Kc29uID0gZnVuY3Rpb24gKGpzb24pIHtcbiAgdmFyIHN0eWxlID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBqc29uLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNvbnRleHQgPSBqc29uW2ldO1xuICAgIHZhciBzZWxlY3RvciA9IGNvbnRleHQuc2VsZWN0b3I7XG4gICAgdmFyIHByb3BzID0gY29udGV4dC5zdHlsZSB8fCBjb250ZXh0LmNzcztcbiAgICB2YXIgbmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XG4gICAgc3R5bGUuc2VsZWN0b3Ioc2VsZWN0b3IpOyAvLyBhcHBseSBzZWxlY3RvclxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBuYW1lcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIG5hbWUgPSBuYW1lc1tqXTtcbiAgICAgIHZhciB2YWx1ZSA9IHByb3BzW25hbWVdO1xuICAgICAgc3R5bGUuY3NzKG5hbWUsIHZhbHVlKTsgLy8gYXBwbHkgcHJvcGVydHlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3R5bGU7XG59O1xuXG4vLyBhY2Nlc3NpYmxlIGN5LnN0eWxlKCkgZnVuY3Rpb25cbnN0eWZuJDQuZnJvbUpzb24gPSBmdW5jdGlvbiAoanNvbikge1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICBzdHlsZS5yZXNldFRvRGVmYXVsdCgpO1xuICBzdHlsZS5hcHBlbmRGcm9tSnNvbihqc29uKTtcbiAgcmV0dXJuIHN0eWxlO1xufTtcblxuLy8gZ2V0IGpzb24gZnJvbSBjeS5zdHlsZSgpIGFwaVxuc3R5Zm4kNC5qc29uID0gZnVuY3Rpb24gKCkge1xuICB2YXIganNvbiA9IFtdO1xuICBmb3IgKHZhciBpID0gdGhpcy5kZWZhdWx0TGVuZ3RoOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjeHQgPSB0aGlzW2ldO1xuICAgIHZhciBzZWxlY3RvciA9IGN4dC5zZWxlY3RvcjtcbiAgICB2YXIgcHJvcHMgPSBjeHQucHJvcGVydGllcztcbiAgICB2YXIgY3NzID0ge307XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wc1tqXTtcbiAgICAgIGNzc1twcm9wLm5hbWVdID0gcHJvcC5zdHJWYWx1ZTtcbiAgICB9XG4gICAganNvbi5wdXNoKHtcbiAgICAgIHNlbGVjdG9yOiAhc2VsZWN0b3IgPyAnY29yZScgOiBzZWxlY3Rvci50b1N0cmluZygpLFxuICAgICAgc3R5bGU6IGNzc1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBqc29uO1xufTtcblxudmFyIHN0eWZuJDMgPSB7fTtcbnN0eWZuJDMuYXBwZW5kRnJvbVN0cmluZyA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICB2YXIgcmVtYWluaW5nID0gJycgKyBzdHJpbmc7XG4gIHZhciBzZWxBbmRCbG9ja1N0cjtcbiAgdmFyIGJsb2NrUmVtO1xuICB2YXIgcHJvcEFuZFZhbFN0cjtcblxuICAvLyByZW1vdmUgY29tbWVudHMgZnJvbSB0aGUgc3R5bGUgc3RyaW5nXG4gIHJlbWFpbmluZyA9IHJlbWFpbmluZy5yZXBsYWNlKC9bL11bKl0oXFxzfC4pKz9bKl1bL10vZywgJycpO1xuICBmdW5jdGlvbiByZW1vdmVTZWxBbmRCbG9ja0Zyb21SZW1haW5pbmcoKSB7XG4gICAgLy8gcmVtb3ZlIHRoZSBwYXJzZWQgc2VsZWN0b3IgYW5kIGJsb2NrIGZyb20gdGhlIHJlbWFpbmluZyB0ZXh0IHRvIHBhcnNlXG4gICAgaWYgKHJlbWFpbmluZy5sZW5ndGggPiBzZWxBbmRCbG9ja1N0ci5sZW5ndGgpIHtcbiAgICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZy5zdWJzdHIoc2VsQW5kQmxvY2tTdHIubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVtYWluaW5nID0gJyc7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHJlbW92ZVByb3BBbmRWYWxGcm9tUmVtKCkge1xuICAgIC8vIHJlbW92ZSB0aGUgcGFyc2VkIHByb3BlcnR5IGFuZCB2YWx1ZSBmcm9tIHRoZSByZW1haW5pbmcgYmxvY2sgdGV4dCB0byBwYXJzZVxuICAgIGlmIChibG9ja1JlbS5sZW5ndGggPiBwcm9wQW5kVmFsU3RyLmxlbmd0aCkge1xuICAgICAgYmxvY2tSZW0gPSBibG9ja1JlbS5zdWJzdHIocHJvcEFuZFZhbFN0ci5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBibG9ja1JlbSA9ICcnO1xuICAgIH1cbiAgfVxuICBmb3IgKDs7KSB7XG4gICAgdmFyIG5vdGhpbmdMZWZ0VG9QYXJzZSA9IHJlbWFpbmluZy5tYXRjaCgvXlxccyokLyk7XG4gICAgaWYgKG5vdGhpbmdMZWZ0VG9QYXJzZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBzZWxBbmRCbG9jayA9IHJlbWFpbmluZy5tYXRjaCgvXlxccyooKD86LnxcXHMpKz8pXFxzKlxceygoPzoufFxccykrPylcXH0vKTtcbiAgICBpZiAoIXNlbEFuZEJsb2NrKSB7XG4gICAgICB3YXJuKCdIYWx0aW5nIHN0eWxlc2hlZXQgcGFyc2luZzogU3RyaW5nIHN0eWxlc2hlZXQgY29udGFpbnMgbW9yZSB0byBwYXJzZSBidXQgbm8gc2VsZWN0b3IgYW5kIGJsb2NrIGZvdW5kIGluOiAnICsgcmVtYWluaW5nKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzZWxBbmRCbG9ja1N0ciA9IHNlbEFuZEJsb2NrWzBdO1xuXG4gICAgLy8gcGFyc2UgdGhlIHNlbGVjdG9yXG4gICAgdmFyIHNlbGVjdG9yU3RyID0gc2VsQW5kQmxvY2tbMV07XG4gICAgaWYgKHNlbGVjdG9yU3RyICE9PSAnY29yZScpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IG5ldyBTZWxlY3RvcihzZWxlY3RvclN0cik7XG4gICAgICBpZiAoc2VsZWN0b3IuaW52YWxpZCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwYXJzaW5nIG9mIGJsb2NrOiBJbnZhbGlkIHNlbGVjdG9yIGZvdW5kIGluIHN0cmluZyBzdHlsZXNoZWV0OiAnICsgc2VsZWN0b3JTdHIpO1xuXG4gICAgICAgIC8vIHNraXAgdGhpcyBzZWxlY3RvciBhbmQgYmxvY2tcbiAgICAgICAgcmVtb3ZlU2VsQW5kQmxvY2tGcm9tUmVtYWluaW5nKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHBhcnNlIHRoZSBibG9jayBvZiBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcbiAgICB2YXIgYmxvY2tTdHIgPSBzZWxBbmRCbG9ja1syXTtcbiAgICB2YXIgaW52YWxpZEJsb2NrID0gZmFsc2U7XG4gICAgYmxvY2tSZW0gPSBibG9ja1N0cjtcbiAgICB2YXIgcHJvcHMgPSBbXTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICB2YXIgX25vdGhpbmdMZWZ0VG9QYXJzZSA9IGJsb2NrUmVtLm1hdGNoKC9eXFxzKiQvKTtcbiAgICAgIGlmIChfbm90aGluZ0xlZnRUb1BhcnNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BBbmRWYWwgPSBibG9ja1JlbS5tYXRjaCgvXlxccyooLis/KVxccyo6XFxzKiguKz8pKD86XFxzKjt8XFxzKiQpLyk7XG4gICAgICBpZiAoIXByb3BBbmRWYWwpIHtcbiAgICAgICAgd2FybignU2tpcHBpbmcgcGFyc2luZyBvZiBibG9jazogSW52YWxpZCBmb3JtYXR0aW5nIG9mIHN0eWxlIHByb3BlcnR5IGFuZCB2YWx1ZSBkZWZpbml0aW9ucyBmb3VuZCBpbjonICsgYmxvY2tTdHIpO1xuICAgICAgICBpbnZhbGlkQmxvY2sgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHByb3BBbmRWYWxTdHIgPSBwcm9wQW5kVmFsWzBdO1xuICAgICAgdmFyIHByb3BTdHIgPSBwcm9wQW5kVmFsWzFdO1xuICAgICAgdmFyIHZhbFN0ciA9IHByb3BBbmRWYWxbMl07XG4gICAgICB2YXIgcHJvcCA9IHNlbGYucHJvcGVydGllc1twcm9wU3RyXTtcbiAgICAgIGlmICghcHJvcCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwcm9wZXJ0eTogSW52YWxpZCBwcm9wZXJ0eSBuYW1lIGluOiAnICsgcHJvcEFuZFZhbFN0cik7XG5cbiAgICAgICAgLy8gc2tpcCB0aGlzIHByb3BlcnR5IGluIHRoZSBibG9ja1xuICAgICAgICByZW1vdmVQcm9wQW5kVmFsRnJvbVJlbSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBwYXJzZWRQcm9wID0gc3R5bGUucGFyc2UocHJvcFN0ciwgdmFsU3RyKTtcbiAgICAgIGlmICghcGFyc2VkUHJvcCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwcm9wZXJ0eTogSW52YWxpZCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluOiAnICsgcHJvcEFuZFZhbFN0cik7XG5cbiAgICAgICAgLy8gc2tpcCB0aGlzIHByb3BlcnR5IGluIHRoZSBibG9ja1xuICAgICAgICByZW1vdmVQcm9wQW5kVmFsRnJvbVJlbSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHByb3BzLnB1c2goe1xuICAgICAgICBuYW1lOiBwcm9wU3RyLFxuICAgICAgICB2YWw6IHZhbFN0clxuICAgICAgfSk7XG4gICAgICByZW1vdmVQcm9wQW5kVmFsRnJvbVJlbSgpO1xuICAgIH1cbiAgICBpZiAoaW52YWxpZEJsb2NrKSB7XG4gICAgICByZW1vdmVTZWxBbmRCbG9ja0Zyb21SZW1haW5pbmcoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIHB1dCB0aGUgcGFyc2VkIGJsb2NrIGluIHRoZSBzdHlsZVxuICAgIHN0eWxlLnNlbGVjdG9yKHNlbGVjdG9yU3RyKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgX3Byb3AgPSBwcm9wc1tpXTtcbiAgICAgIHN0eWxlLmNzcyhfcHJvcC5uYW1lLCBfcHJvcC52YWwpO1xuICAgIH1cbiAgICByZW1vdmVTZWxBbmRCbG9ja0Zyb21SZW1haW5pbmcoKTtcbiAgfVxuICByZXR1cm4gc3R5bGU7XG59O1xuc3R5Zm4kMy5mcm9tU3RyaW5nID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICBzdHlsZS5yZXNldFRvRGVmYXVsdCgpO1xuICBzdHlsZS5hcHBlbmRGcm9tU3RyaW5nKHN0cmluZyk7XG4gIHJldHVybiBzdHlsZTtcbn07XG5cbnZhciBzdHlmbiQyID0ge307XG4oZnVuY3Rpb24gKCkge1xuICB2YXIgbnVtYmVyJDEgPSBudW1iZXI7XG4gIHZhciByZ2JhID0gcmdiYU5vQmFja1JlZnM7XG4gIHZhciBoc2xhID0gaHNsYU5vQmFja1JlZnM7XG4gIHZhciBoZXgzJDEgPSBoZXgzO1xuICB2YXIgaGV4NiQxID0gaGV4NjtcbiAgdmFyIGRhdGEgPSBmdW5jdGlvbiBkYXRhKHByZWZpeCkge1xuICAgIHJldHVybiAnXicgKyBwcmVmaXggKyAnXFxcXHMqXFxcXChcXFxccyooW1xcXFx3XFxcXC5dKylcXFxccypcXFxcKSQnO1xuICB9O1xuICB2YXIgbWFwRGF0YSA9IGZ1bmN0aW9uIG1hcERhdGEocHJlZml4KSB7XG4gICAgdmFyIG1hcEFyZyA9IG51bWJlciQxICsgJ3xcXFxcdyt8JyArIHJnYmEgKyAnfCcgKyBoc2xhICsgJ3wnICsgaGV4MyQxICsgJ3wnICsgaGV4NiQxO1xuICAgIHJldHVybiAnXicgKyBwcmVmaXggKyAnXFxcXHMqXFxcXCgoW1xcXFx3XFxcXC5dKylcXFxccypcXFxcLFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKlxcXFwsXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqLFxcXFxzKignICsgbWFwQXJnICsgJylcXFxccypcXFxcLFxcXFxzKignICsgbWFwQXJnICsgJylcXFxcKSQnO1xuICB9O1xuICB2YXIgdXJsUmVnZXhlcyA9IFsnXnVybFxcXFxzKlxcXFwoXFxcXHMqW1xcJ1wiXT8oLis/KVtcXCdcIl0/XFxcXHMqXFxcXCkkJywgJ14obm9uZSkkJywgJ14oLispJCddO1xuXG4gIC8vIGVhY2ggdmlzdWFsIHN0eWxlIHByb3BlcnR5IGhhcyBhIHR5cGUgYW5kIG5lZWRzIHRvIGJlIHZhbGlkYXRlZCBhY2NvcmRpbmcgdG8gaXRcbiAgc3R5Zm4kMi50eXBlcyA9IHtcbiAgICB0aW1lOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICB1bml0czogJ3N8bXMnLFxuICAgICAgaW1wbGljaXRVbml0czogJ21zJ1xuICAgIH0sXG4gICAgcGVyY2VudDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxMDAsXG4gICAgICB1bml0czogJyUnLFxuICAgICAgaW1wbGljaXRVbml0czogJyUnXG4gICAgfSxcbiAgICBwZXJjZW50YWdlczoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxMDAsXG4gICAgICB1bml0czogJyUnLFxuICAgICAgaW1wbGljaXRVbml0czogJyUnLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIHplcm9PbmVOdW1iZXI6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogMSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICB6ZXJvT25lTnVtYmVyczoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxLFxuICAgICAgdW5pdGxlc3M6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgbk9uZU9uZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAtMSxcbiAgICAgIG1heDogMSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBub25OZWdhdGl2ZUludDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgaW50ZWdlcjogdHJ1ZSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBub25OZWdhdGl2ZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIHBvc2l0aW9uOiB7XG4gICAgICBlbnVtczogWydwYXJlbnQnLCAnb3JpZ2luJ11cbiAgICB9LFxuICAgIG5vZGVTaXplOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBlbnVtczogWydsYWJlbCddXG4gICAgfSxcbiAgICBudW1iZXI6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBudW1iZXJzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICB1bml0bGVzczogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBwb3NpdGl2ZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgdW5pdGxlc3M6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBzdHJpY3RNaW46IHRydWVcbiAgICB9LFxuICAgIHNpemU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMFxuICAgIH0sXG4gICAgYmlkaXJlY3Rpb25hbFNpemU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgYmlkaXJlY3Rpb25hbFNpemVNYXliZVBlcmNlbnQ6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIGFsbG93UGVyY2VudDogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgYmlkaXJlY3Rpb25hbFNpemVzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgc2l6ZU1heWJlUGVyY2VudDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgYWxsb3dQZXJjZW50OiB0cnVlXG4gICAgfSxcbiAgICBheGlzRGlyZWN0aW9uOiB7XG4gICAgICBlbnVtczogWydob3Jpem9udGFsJywgJ2xlZnR3YXJkJywgJ3JpZ2h0d2FyZCcsICd2ZXJ0aWNhbCcsICd1cHdhcmQnLCAnZG93bndhcmQnLCAnYXV0byddXG4gICAgfSxcbiAgICBwYWRkaW5nUmVsYXRpdmVUbzoge1xuICAgICAgZW51bXM6IFsnd2lkdGgnLCAnaGVpZ2h0JywgJ2F2ZXJhZ2UnLCAnbWluJywgJ21heCddXG4gICAgfSxcbiAgICBiZ1dIOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBhbGxvd1BlcmNlbnQ6IHRydWUsXG4gICAgICBlbnVtczogWydhdXRvJ10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdQb3M6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIGFsbG93UGVyY2VudDogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBiZ1JlbGF0aXZlVG86IHtcbiAgICAgIGVudW1zOiBbJ2lubmVyJywgJ2luY2x1ZGUtcGFkZGluZyddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnUmVwZWF0OiB7XG4gICAgICBlbnVtczogWydyZXBlYXQnLCAncmVwZWF0LXgnLCAncmVwZWF0LXknLCAnbm8tcmVwZWF0J10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdGaXQ6IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAnY29udGFpbicsICdjb3ZlciddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnQ3Jvc3NPcmlnaW46IHtcbiAgICAgIGVudW1zOiBbJ2Fub255bW91cycsICd1c2UtY3JlZGVudGlhbHMnLCAnbnVsbCddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnQ2xpcDoge1xuICAgICAgZW51bXM6IFsnbm9uZScsICdub2RlJ10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdDb250YWlubWVudDoge1xuICAgICAgZW51bXM6IFsnaW5zaWRlJywgJ292ZXInXSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBjb2xvcjoge1xuICAgICAgY29sb3I6IHRydWVcbiAgICB9LFxuICAgIGNvbG9yczoge1xuICAgICAgY29sb3I6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgZmlsbDoge1xuICAgICAgZW51bXM6IFsnc29saWQnLCAnbGluZWFyLWdyYWRpZW50JywgJ3JhZGlhbC1ncmFkaWVudCddXG4gICAgfSxcbiAgICBib29sOiB7XG4gICAgICBlbnVtczogWyd5ZXMnLCAnbm8nXVxuICAgIH0sXG4gICAgYm9vbHM6IHtcbiAgICAgIGVudW1zOiBbJ3llcycsICdubyddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGxpbmVTdHlsZToge1xuICAgICAgZW51bXM6IFsnc29saWQnLCAnZG90dGVkJywgJ2Rhc2hlZCddXG4gICAgfSxcbiAgICBsaW5lQ2FwOiB7XG4gICAgICBlbnVtczogWydidXR0JywgJ3JvdW5kJywgJ3NxdWFyZSddXG4gICAgfSxcbiAgICBsaW5lUG9zaXRpb246IHtcbiAgICAgIGVudW1zOiBbJ2NlbnRlcicsICdpbnNpZGUnLCAnb3V0c2lkZSddXG4gICAgfSxcbiAgICBsaW5lSm9pbjoge1xuICAgICAgZW51bXM6IFsncm91bmQnLCAnYmV2ZWwnLCAnbWl0ZXInXVxuICAgIH0sXG4gICAgYm9yZGVyU3R5bGU6IHtcbiAgICAgIGVudW1zOiBbJ3NvbGlkJywgJ2RvdHRlZCcsICdkYXNoZWQnLCAnZG91YmxlJ11cbiAgICB9LFxuICAgIGN1cnZlU3R5bGU6IHtcbiAgICAgIGVudW1zOiBbJ2JlemllcicsICd1bmJ1bmRsZWQtYmV6aWVyJywgJ2hheXN0YWNrJywgJ3NlZ21lbnRzJywgJ3N0cmFpZ2h0JywgJ3N0cmFpZ2h0LXRyaWFuZ2xlJywgJ3RheGknLCAncm91bmQtc2VnbWVudHMnLCAncm91bmQtdGF4aSddXG4gICAgfSxcbiAgICByYWRpdXNUeXBlOiB7XG4gICAgICBlbnVtczogWydhcmMtcmFkaXVzJywgJ2luZmx1ZW5jZS1yYWRpdXMnXSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBmb250RmFtaWx5OiB7XG4gICAgICByZWdleDogJ14oW1xcXFx3LSBcXFxcXCJdKyg/OlxcXFxzKixcXFxccypbXFxcXHctIFxcXFxcIl0rKSopJCdcbiAgICB9LFxuICAgIGZvbnRTdHlsZToge1xuICAgICAgZW51bXM6IFsnaXRhbGljJywgJ25vcm1hbCcsICdvYmxpcXVlJ11cbiAgICB9LFxuICAgIGZvbnRXZWlnaHQ6IHtcbiAgICAgIGVudW1zOiBbJ25vcm1hbCcsICdib2xkJywgJ2JvbGRlcicsICdsaWdodGVyJywgJzEwMCcsICcyMDAnLCAnMzAwJywgJzQwMCcsICc1MDAnLCAnNjAwJywgJzgwMCcsICc5MDAnLCAxMDAsIDIwMCwgMzAwLCA0MDAsIDUwMCwgNjAwLCA3MDAsIDgwMCwgOTAwXVxuICAgIH0sXG4gICAgdGV4dERlY29yYXRpb246IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAndW5kZXJsaW5lJywgJ292ZXJsaW5lJywgJ2xpbmUtdGhyb3VnaCddXG4gICAgfSxcbiAgICB0ZXh0VHJhbnNmb3JtOiB7XG4gICAgICBlbnVtczogWydub25lJywgJ3VwcGVyY2FzZScsICdsb3dlcmNhc2UnXVxuICAgIH0sXG4gICAgdGV4dFdyYXA6IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAnd3JhcCcsICdlbGxpcHNpcyddXG4gICAgfSxcbiAgICB0ZXh0T3ZlcmZsb3dXcmFwOiB7XG4gICAgICBlbnVtczogWyd3aGl0ZXNwYWNlJywgJ2FueXdoZXJlJ11cbiAgICB9LFxuICAgIHRleHRCYWNrZ3JvdW5kU2hhcGU6IHtcbiAgICAgIGVudW1zOiBbJ3JlY3RhbmdsZScsICdyb3VuZHJlY3RhbmdsZScsICdyb3VuZC1yZWN0YW5nbGUnXVxuICAgIH0sXG4gICAgbm9kZVNoYXBlOiB7XG4gICAgICBlbnVtczogWydyZWN0YW5nbGUnLCAncm91bmRyZWN0YW5nbGUnLCAncm91bmQtcmVjdGFuZ2xlJywgJ2N1dHJlY3RhbmdsZScsICdjdXQtcmVjdGFuZ2xlJywgJ2JvdHRvbXJvdW5kcmVjdGFuZ2xlJywgJ2JvdHRvbS1yb3VuZC1yZWN0YW5nbGUnLCAnYmFycmVsJywgJ2VsbGlwc2UnLCAndHJpYW5nbGUnLCAncm91bmQtdHJpYW5nbGUnLCAnc3F1YXJlJywgJ3BlbnRhZ29uJywgJ3JvdW5kLXBlbnRhZ29uJywgJ2hleGFnb24nLCAncm91bmQtaGV4YWdvbicsICdjb25jYXZlaGV4YWdvbicsICdjb25jYXZlLWhleGFnb24nLCAnaGVwdGFnb24nLCAncm91bmQtaGVwdGFnb24nLCAnb2N0YWdvbicsICdyb3VuZC1vY3RhZ29uJywgJ3RhZycsICdyb3VuZC10YWcnLCAnc3RhcicsICdkaWFtb25kJywgJ3JvdW5kLWRpYW1vbmQnLCAndmVlJywgJ3Job21ib2lkJywgJ3JpZ2h0LXJob21ib2lkJywgJ3BvbHlnb24nXVxuICAgIH0sXG4gICAgb3ZlcmxheVNoYXBlOiB7XG4gICAgICBlbnVtczogWydyb3VuZHJlY3RhbmdsZScsICdyb3VuZC1yZWN0YW5nbGUnLCAnZWxsaXBzZSddXG4gICAgfSxcbiAgICBjb3JuZXJSYWRpdXM6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMCxcbiAgICAgIHVuaXRzOiAncHh8ZW0nLFxuICAgICAgaW1wbGljaXRVbml0czogJ3B4JyxcbiAgICAgIGVudW1zOiBbJ2F1dG8nXVxuICAgIH0sXG4gICAgY29tcG91bmRJbmNsdWRlTGFiZWxzOiB7XG4gICAgICBlbnVtczogWydpbmNsdWRlJywgJ2V4Y2x1ZGUnXVxuICAgIH0sXG4gICAgYXJyb3dTaGFwZToge1xuICAgICAgZW51bXM6IFsndGVlJywgJ3RyaWFuZ2xlJywgJ3RyaWFuZ2xlLXRlZScsICdjaXJjbGUtdHJpYW5nbGUnLCAndHJpYW5nbGUtY3Jvc3MnLCAndHJpYW5nbGUtYmFja2N1cnZlJywgJ3ZlZScsICdzcXVhcmUnLCAnY2lyY2xlJywgJ2RpYW1vbmQnLCAnY2hldnJvbicsICdub25lJ11cbiAgICB9LFxuICAgIGFycm93RmlsbDoge1xuICAgICAgZW51bXM6IFsnZmlsbGVkJywgJ2hvbGxvdyddXG4gICAgfSxcbiAgICBhcnJvd1dpZHRoOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICB1bml0czogJyV8cHh8ZW0nLFxuICAgICAgaW1wbGljaXRVbml0czogJ3B4JyxcbiAgICAgIGVudW1zOiBbJ21hdGNoLWxpbmUnXVxuICAgIH0sXG4gICAgZGlzcGxheToge1xuICAgICAgZW51bXM6IFsnZWxlbWVudCcsICdub25lJ11cbiAgICB9LFxuICAgIHZpc2liaWxpdHk6IHtcbiAgICAgIGVudW1zOiBbJ2hpZGRlbicsICd2aXNpYmxlJ11cbiAgICB9LFxuICAgIHpDb21wb3VuZERlcHRoOiB7XG4gICAgICBlbnVtczogWydib3R0b20nLCAnb3JwaGFuJywgJ2F1dG8nLCAndG9wJ11cbiAgICB9LFxuICAgIHpJbmRleENvbXBhcmU6IHtcbiAgICAgIGVudW1zOiBbJ2F1dG8nLCAnbWFudWFsJ11cbiAgICB9LFxuICAgIHZhbGlnbjoge1xuICAgICAgZW51bXM6IFsndG9wJywgJ2NlbnRlcicsICdib3R0b20nXVxuICAgIH0sXG4gICAgaGFsaWduOiB7XG4gICAgICBlbnVtczogWydsZWZ0JywgJ2NlbnRlcicsICdyaWdodCddXG4gICAgfSxcbiAgICBqdXN0aWZpY2F0aW9uOiB7XG4gICAgICBlbnVtczogWydsZWZ0JywgJ2NlbnRlcicsICdyaWdodCcsICdhdXRvJ11cbiAgICB9LFxuICAgIHRleHQ6IHtcbiAgICAgIHN0cmluZzogdHJ1ZVxuICAgIH0sXG4gICAgZGF0YToge1xuICAgICAgbWFwcGluZzogdHJ1ZSxcbiAgICAgIHJlZ2V4OiBkYXRhKCdkYXRhJylcbiAgICB9LFxuICAgIGxheW91dERhdGE6IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICByZWdleDogZGF0YSgnbGF5b3V0RGF0YScpXG4gICAgfSxcbiAgICBzY3JhdGNoOiB7XG4gICAgICBtYXBwaW5nOiB0cnVlLFxuICAgICAgcmVnZXg6IGRhdGEoJ3NjcmF0Y2gnKVxuICAgIH0sXG4gICAgbWFwRGF0YToge1xuICAgICAgbWFwcGluZzogdHJ1ZSxcbiAgICAgIHJlZ2V4OiBtYXBEYXRhKCdtYXBEYXRhJylcbiAgICB9LFxuICAgIG1hcExheW91dERhdGE6IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICByZWdleDogbWFwRGF0YSgnbWFwTGF5b3V0RGF0YScpXG4gICAgfSxcbiAgICBtYXBTY3JhdGNoOiB7XG4gICAgICBtYXBwaW5nOiB0cnVlLFxuICAgICAgcmVnZXg6IG1hcERhdGEoJ21hcFNjcmF0Y2gnKVxuICAgIH0sXG4gICAgZm46IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICBmbjogdHJ1ZVxuICAgIH0sXG4gICAgdXJsOiB7XG4gICAgICByZWdleGVzOiB1cmxSZWdleGVzLFxuICAgICAgc2luZ2xlUmVnZXhNYXRjaFZhbHVlOiB0cnVlXG4gICAgfSxcbiAgICB1cmxzOiB7XG4gICAgICByZWdleGVzOiB1cmxSZWdleGVzLFxuICAgICAgc2luZ2xlUmVnZXhNYXRjaFZhbHVlOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIHByb3BMaXN0OiB7XG4gICAgICBwcm9wTGlzdDogdHJ1ZVxuICAgIH0sXG4gICAgYW5nbGU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIHVuaXRzOiAnZGVnfHJhZCcsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAncmFkJ1xuICAgIH0sXG4gICAgdGV4dFJvdGF0aW9uOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICB1bml0czogJ2RlZ3xyYWQnLFxuICAgICAgaW1wbGljaXRVbml0czogJ3JhZCcsXG4gICAgICBlbnVtczogWydub25lJywgJ2F1dG9yb3RhdGUnXVxuICAgIH0sXG4gICAgcG9seWdvblBvaW50TGlzdDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBldmVuTXVsdGlwbGU6IHRydWUsXG4gICAgICBtaW46IC0xLFxuICAgICAgbWF4OiAxLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIGVkZ2VEaXN0YW5jZXM6IHtcbiAgICAgIGVudW1zOiBbJ2ludGVyc2VjdGlvbicsICdub2RlLXBvc2l0aW9uJywgJ2VuZHBvaW50cyddXG4gICAgfSxcbiAgICBlZGdlRW5kcG9pbnQ6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgdW5pdHM6ICclfHB4fGVtfGRlZ3xyYWQnLFxuICAgICAgaW1wbGljaXRVbml0czogJ3B4JyxcbiAgICAgIGVudW1zOiBbJ2luc2lkZS10by1ub2RlJywgJ291dHNpZGUtdG8tbm9kZScsICdvdXRzaWRlLXRvLW5vZGUtb3ItbGFiZWwnLCAnb3V0c2lkZS10by1saW5lJywgJ291dHNpZGUtdG8tbGluZS1vci1sYWJlbCddLFxuICAgICAgc2luZ2xlRW51bTogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSh2YWxBcnIsIHVuaXRzQXJyKSB7XG4gICAgICAgIHN3aXRjaCAodmFsQXJyLmxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIC8vIGNhbiBiZSAlIG9yIHB4IG9ubHlcbiAgICAgICAgICAgIHJldHVybiB1bml0c0FyclswXSAhPT0gJ2RlZycgJiYgdW5pdHNBcnJbMF0gIT09ICdyYWQnICYmIHVuaXRzQXJyWzFdICE9PSAnZGVnJyAmJiB1bml0c0FyclsxXSAhPT0gJ3JhZCc7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgLy8gY2FuIGJlIGVudW0sIGRlZywgb3IgcmFkIG9ubHlcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcodmFsQXJyWzBdKSB8fCB1bml0c0FyclswXSA9PT0gJ2RlZycgfHwgdW5pdHNBcnJbMF0gPT09ICdyYWQnO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGVhc2luZzoge1xuICAgICAgcmVnZXhlczogWydeKHNwcmluZylcXFxccypcXFxcKFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKixcXFxccyooJyArIG51bWJlciQxICsgJylcXFxccypcXFxcKSQnLCAnXihjdWJpYy1iZXppZXIpXFxcXHMqXFxcXChcXFxccyooJyArIG51bWJlciQxICsgJylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqLFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKixcXFxccyooJyArIG51bWJlciQxICsgJylcXFxccypcXFxcKSQnXSxcbiAgICAgIGVudW1zOiBbJ2xpbmVhcicsICdlYXNlJywgJ2Vhc2UtaW4nLCAnZWFzZS1vdXQnLCAnZWFzZS1pbi1vdXQnLCAnZWFzZS1pbi1zaW5lJywgJ2Vhc2Utb3V0LXNpbmUnLCAnZWFzZS1pbi1vdXQtc2luZScsICdlYXNlLWluLXF1YWQnLCAnZWFzZS1vdXQtcXVhZCcsICdlYXNlLWluLW91dC1xdWFkJywgJ2Vhc2UtaW4tY3ViaWMnLCAnZWFzZS1vdXQtY3ViaWMnLCAnZWFzZS1pbi1vdXQtY3ViaWMnLCAnZWFzZS1pbi1xdWFydCcsICdlYXNlLW91dC1xdWFydCcsICdlYXNlLWluLW91dC1xdWFydCcsICdlYXNlLWluLXF1aW50JywgJ2Vhc2Utb3V0LXF1aW50JywgJ2Vhc2UtaW4tb3V0LXF1aW50JywgJ2Vhc2UtaW4tZXhwbycsICdlYXNlLW91dC1leHBvJywgJ2Vhc2UtaW4tb3V0LWV4cG8nLCAnZWFzZS1pbi1jaXJjJywgJ2Vhc2Utb3V0LWNpcmMnLCAnZWFzZS1pbi1vdXQtY2lyYyddXG4gICAgfSxcbiAgICBncmFkaWVudERpcmVjdGlvbjoge1xuICAgICAgZW51bXM6IFsndG8tYm90dG9tJywgJ3RvLXRvcCcsICd0by1sZWZ0JywgJ3RvLXJpZ2h0JywgJ3RvLWJvdHRvbS1yaWdodCcsICd0by1ib3R0b20tbGVmdCcsICd0by10b3AtcmlnaHQnLCAndG8tdG9wLWxlZnQnLCAndG8tcmlnaHQtYm90dG9tJywgJ3RvLWxlZnQtYm90dG9tJywgJ3RvLXJpZ2h0LXRvcCcsICd0by1sZWZ0LXRvcCcgLy8gZGlmZmVyZW50IG9yZGVyXG4gICAgICBdXG4gICAgfSxcblxuICAgIGJvdW5kc0V4cGFuc2lvbjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICB2YWxpZGF0ZTogZnVuY3Rpb24gdmFsaWRhdGUodmFsQXJyKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSB2YWxBcnIubGVuZ3RoO1xuICAgICAgICByZXR1cm4gbGVuZ3RoID09PSAxIHx8IGxlbmd0aCA9PT0gMiB8fCBsZW5ndGggPT09IDQ7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgZGlmZiA9IHtcbiAgICB6ZXJvTm9uWmVybzogZnVuY3Rpb24gemVyb05vblplcm8odmFsMSwgdmFsMikge1xuICAgICAgaWYgKCh2YWwxID09IG51bGwgfHwgdmFsMiA9PSBudWxsKSAmJiB2YWwxICE9PSB2YWwyKSB7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBudWxsIGNhc2VzIGNvdWxkIHJlcHJlc2VudCBhbnkgdmFsdWVcbiAgICAgIH1cbiAgICAgIGlmICh2YWwxID09IDAgJiYgdmFsMiAhPSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmICh2YWwxICE9IDAgJiYgdmFsMiA9PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0sXG4gICAgYW55OiBmdW5jdGlvbiBhbnkodmFsMSwgdmFsMikge1xuICAgICAgcmV0dXJuIHZhbDEgIT0gdmFsMjtcbiAgICB9LFxuICAgIGVtcHR5Tm9uRW1wdHk6IGZ1bmN0aW9uIGVtcHR5Tm9uRW1wdHkoc3RyMSwgc3RyMikge1xuICAgICAgdmFyIGVtcHR5MSA9IGVtcHR5U3RyaW5nKHN0cjEpO1xuICAgICAgdmFyIGVtcHR5MiA9IGVtcHR5U3RyaW5nKHN0cjIpO1xuICAgICAgcmV0dXJuIGVtcHR5MSAmJiAhZW1wdHkyIHx8ICFlbXB0eTEgJiYgZW1wdHkyO1xuICAgIH1cbiAgfTtcblxuICAvLyBkZWZpbmUgdmlzdWFsIHN0eWxlIHByb3BlcnRpZXNcbiAgLy9cbiAgLy8gLSBuLmIuIGFkZGluZyBhIG5ldyBncm91cCBvZiBwcm9wcyBtYXkgcmVxdWlyZSB1cGRhdGVzIHRvIHVwZGF0ZVN0eWxlSGludHMoKVxuICAvLyAtIGFkZGluZyBuZXcgcHJvcHMgdG8gYW4gZXhpc3RpbmcgZ3JvdXAgZ2V0cyBoYW5kbGVkIGF1dG9tYXRpY2FsbHlcblxuICB2YXIgdCA9IHN0eWZuJDIudHlwZXM7XG4gIHZhciBtYWluTGFiZWwgPSBbe1xuICAgIG5hbWU6ICdsYWJlbCcsXG4gICAgdHlwZTogdC50ZXh0LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueSxcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5lbXB0eU5vbkVtcHR5XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1yb3RhdGlvbicsXG4gICAgdHlwZTogdC50ZXh0Um90YXRpb24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1tYXJnaW4teCcsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW1hcmdpbi15JyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIHNvdXJjZUxhYmVsID0gW3tcbiAgICBuYW1lOiAnc291cmNlLWxhYmVsJyxcbiAgICB0eXBlOiB0LnRleHQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc291cmNlLXRleHQtcm90YXRpb24nLFxuICAgIHR5cGU6IHQudGV4dFJvdGF0aW9uLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NvdXJjZS10ZXh0LW1hcmdpbi14JyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NvdXJjZS10ZXh0LW1hcmdpbi15JyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NvdXJjZS10ZXh0LW9mZnNldCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIHRhcmdldExhYmVsID0gW3tcbiAgICBuYW1lOiAndGFyZ2V0LWxhYmVsJyxcbiAgICB0eXBlOiB0LnRleHQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGFyZ2V0LXRleHQtcm90YXRpb24nLFxuICAgIHR5cGU6IHQudGV4dFJvdGF0aW9uLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RhcmdldC10ZXh0LW1hcmdpbi14JyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RhcmdldC10ZXh0LW1hcmdpbi15JyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RhcmdldC10ZXh0LW9mZnNldCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIGxhYmVsRGltZW5zaW9ucyA9IFt7XG4gICAgbmFtZTogJ2ZvbnQtZmFtaWx5JyxcbiAgICB0eXBlOiB0LmZvbnRGYW1pbHksXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZm9udC1zdHlsZScsXG4gICAgdHlwZTogdC5mb250U3R5bGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZm9udC13ZWlnaHQnLFxuICAgIHR5cGU6IHQuZm9udFdlaWdodCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdmb250LXNpemUnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LXRyYW5zZm9ybScsXG4gICAgdHlwZTogdC50ZXh0VHJhbnNmb3JtLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtd3JhcCcsXG4gICAgdHlwZTogdC50ZXh0V3JhcCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW92ZXJmbG93LXdyYXAnLFxuICAgIHR5cGU6IHQudGV4dE92ZXJmbG93V3JhcCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW1heC13aWR0aCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtb3V0bGluZS13aWR0aCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtaGVpZ2h0JyxcbiAgICB0eXBlOiB0LnBvc2l0aXZlTnVtYmVyLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIGNvbW1vbkxhYmVsID0gW3tcbiAgICBuYW1lOiAndGV4dC12YWxpZ24nLFxuICAgIHR5cGU6IHQudmFsaWduLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtaGFsaWduJyxcbiAgICB0eXBlOiB0LmhhbGlnbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdjb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtb3V0bGluZS1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtb3V0bGluZS1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWJhY2tncm91bmQtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWJhY2tncm91bmQtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1iYWNrZ3JvdW5kLXBhZGRpbmcnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWJvcmRlci1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWJvcmRlci1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYm9yZGVyLXdpZHRoJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1ib3JkZXItc3R5bGUnLFxuICAgIHR5cGU6IHQuYm9yZGVyU3R5bGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1iYWNrZ3JvdW5kLXNoYXBlJyxcbiAgICB0eXBlOiB0LnRleHRCYWNrZ3JvdW5kU2hhcGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1qdXN0aWZpY2F0aW9uJyxcbiAgICB0eXBlOiB0Lmp1c3RpZmljYXRpb25cbiAgfV07XG4gIHZhciBiZWhhdmlvciA9IFt7XG4gICAgbmFtZTogJ2V2ZW50cycsXG4gICAgdHlwZTogdC5ib29sLFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtZXZlbnRzJyxcbiAgICB0eXBlOiB0LmJvb2wsXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgdmlzaWJpbGl0eSA9IFt7XG4gICAgbmFtZTogJ2Rpc3BsYXknLFxuICAgIHR5cGU6IHQuZGlzcGxheSxcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5hbnksXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55LFxuICAgIHRyaWdnZXJzQm91bmRzT2ZDb25uZWN0ZWRFZGdlczogdHJ1ZVxuICB9LCB7XG4gICAgbmFtZTogJ3Zpc2liaWxpdHknLFxuICAgIHR5cGU6IHQudmlzaWJpbGl0eSxcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdvcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXIsXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuemVyb05vblplcm9cbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ21pbi16b29tZWQtZm9udC1zaXplJyxcbiAgICB0eXBlOiB0LnNpemVcbiAgfSwge1xuICAgIG5hbWU6ICd6LWNvbXBvdW5kLWRlcHRoJyxcbiAgICB0eXBlOiB0LnpDb21wb3VuZERlcHRoLFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3otaW5kZXgtY29tcGFyZScsXG4gICAgdHlwZTogdC56SW5kZXhDb21wYXJlLFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3otaW5kZXgnLFxuICAgIHR5cGU6IHQubnVtYmVyLFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIG92ZXJsYXkgPSBbe1xuICAgIG5hbWU6ICdvdmVybGF5LXBhZGRpbmcnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdvdmVybGF5LWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnb3ZlcmxheS1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXIsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuemVyb05vblplcm9cbiAgfSwge1xuICAgIG5hbWU6ICdvdmVybGF5LXNoYXBlJyxcbiAgICB0eXBlOiB0Lm92ZXJsYXlTaGFwZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdvdmVybGF5LWNvcm5lci1yYWRpdXMnLFxuICAgIHR5cGU6IHQuY29ybmVyUmFkaXVzXG4gIH1dO1xuICB2YXIgdW5kZXJsYXkgPSBbe1xuICAgIG5hbWU6ICd1bmRlcmxheS1wYWRkaW5nJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndW5kZXJsYXktY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICd1bmRlcmxheS1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXIsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuemVyb05vblplcm9cbiAgfSwge1xuICAgIG5hbWU6ICd1bmRlcmxheS1zaGFwZScsXG4gICAgdHlwZTogdC5vdmVybGF5U2hhcGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndW5kZXJsYXktY29ybmVyLXJhZGl1cycsXG4gICAgdHlwZTogdC5jb3JuZXJSYWRpdXNcbiAgfV07XG4gIHZhciB0cmFuc2l0aW9uID0gW3tcbiAgICBuYW1lOiAndHJhbnNpdGlvbi1wcm9wZXJ0eScsXG4gICAgdHlwZTogdC5wcm9wTGlzdFxuICB9LCB7XG4gICAgbmFtZTogJ3RyYW5zaXRpb24tZHVyYXRpb24nLFxuICAgIHR5cGU6IHQudGltZVxuICB9LCB7XG4gICAgbmFtZTogJ3RyYW5zaXRpb24tZGVsYXknLFxuICAgIHR5cGU6IHQudGltZVxuICB9LCB7XG4gICAgbmFtZTogJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJyxcbiAgICB0eXBlOiB0LmVhc2luZ1xuICB9XTtcbiAgdmFyIG5vZGVTaXplSGFzaE92ZXJyaWRlID0gZnVuY3Rpb24gbm9kZVNpemVIYXNoT3ZlcnJpZGUoZWxlLCBwYXJzZWRQcm9wKSB7XG4gICAgaWYgKHBhcnNlZFByb3AudmFsdWUgPT09ICdsYWJlbCcpIHtcbiAgICAgIHJldHVybiAtZWxlLnBvb2xJbmRleCgpOyAvLyBubyBoYXNoIGtleSBoaXRzIGlzIHVzaW5nIGxhYmVsIHNpemUgKGhpdHJhdGUgZm9yIHBlcmYgcHJvYmFibHkgbG93IGFueXdheSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhcnNlZFByb3AucGZWYWx1ZTtcbiAgICB9XG4gIH07XG4gIHZhciBub2RlQm9keSA9IFt7XG4gICAgbmFtZTogJ2hlaWdodCcsXG4gICAgdHlwZTogdC5ub2RlU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnksXG4gICAgaGFzaE92ZXJyaWRlOiBub2RlU2l6ZUhhc2hPdmVycmlkZVxuICB9LCB7XG4gICAgbmFtZTogJ3dpZHRoJyxcbiAgICB0eXBlOiB0Lm5vZGVTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueSxcbiAgICBoYXNoT3ZlcnJpZGU6IG5vZGVTaXplSGFzaE92ZXJyaWRlXG4gIH0sIHtcbiAgICBuYW1lOiAnc2hhcGUnLFxuICAgIHR5cGU6IHQubm9kZVNoYXBlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NoYXBlLXBvbHlnb24tcG9pbnRzJyxcbiAgICB0eXBlOiB0LnBvbHlnb25Qb2ludExpc3QsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnY29ybmVyLXJhZGl1cycsXG4gICAgdHlwZTogdC5jb3JuZXJSYWRpdXNcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1maWxsJyxcbiAgICB0eXBlOiB0LmZpbGxcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtYmxhY2tlbicsXG4gICAgdHlwZTogdC5uT25lT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1ncmFkaWVudC1zdG9wLWNvbG9ycycsXG4gICAgdHlwZTogdC5jb2xvcnNcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJyxcbiAgICB0eXBlOiB0LnBlcmNlbnRhZ2VzXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1ncmFkaWVudC1kaXJlY3Rpb24nLFxuICAgIHR5cGU6IHQuZ3JhZGllbnREaXJlY3Rpb25cbiAgfSwge1xuICAgIG5hbWU6ICdwYWRkaW5nJyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZy1yZWxhdGl2ZS10bycsXG4gICAgdHlwZTogdC5wYWRkaW5nUmVsYXRpdmVUbyxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdib3VuZHMtZXhwYW5zaW9uJyxcbiAgICB0eXBlOiB0LmJvdW5kc0V4cGFuc2lvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBub2RlQm9yZGVyID0gW3tcbiAgICBuYW1lOiAnYm9yZGVyLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnYm9yZGVyLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci13aWR0aCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci1zdHlsZScsXG4gICAgdHlwZTogdC5ib3JkZXJTdHlsZVxuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci1jYXAnLFxuICAgIHR5cGU6IHQubGluZUNhcFxuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci1qb2luJyxcbiAgICB0eXBlOiB0LmxpbmVKb2luXG4gIH0sIHtcbiAgICBuYW1lOiAnYm9yZGVyLWRhc2gtcGF0dGVybicsXG4gICAgdHlwZTogdC5udW1iZXJzXG4gIH0sIHtcbiAgICBuYW1lOiAnYm9yZGVyLWRhc2gtb2Zmc2V0JyxcbiAgICB0eXBlOiB0Lm51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci1wb3NpdGlvbicsXG4gICAgdHlwZTogdC5saW5lUG9zaXRpb25cbiAgfV07XG4gIHZhciBub2RlT3V0bGluZSA9IFt7XG4gICAgbmFtZTogJ291dGxpbmUtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdvdXRsaW5lLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ291dGxpbmUtd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdvdXRsaW5lLXN0eWxlJyxcbiAgICB0eXBlOiB0LmJvcmRlclN0eWxlXG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0bGluZS1vZmZzZXQnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBiYWNrZ3JvdW5kSW1hZ2UgPSBbe1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWltYWdlJyxcbiAgICB0eXBlOiB0LnVybHNcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWltYWdlLWNyb3Nzb3JpZ2luJyxcbiAgICB0eXBlOiB0LmJnQ3Jvc3NPcmlnaW5cbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWltYWdlLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlcnNcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWltYWdlLWNvbnRhaW5tZW50JyxcbiAgICB0eXBlOiB0LmJnQ29udGFpbm1lbnRcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWltYWdlLXNtb290aGluZycsXG4gICAgdHlwZTogdC5ib29sc1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtcG9zaXRpb24teCcsXG4gICAgdHlwZTogdC5iZ1Bvc1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtcG9zaXRpb24teScsXG4gICAgdHlwZTogdC5iZ1Bvc1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtd2lkdGgtcmVsYXRpdmUtdG8nLFxuICAgIHR5cGU6IHQuYmdSZWxhdGl2ZVRvXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1oZWlnaHQtcmVsYXRpdmUtdG8nLFxuICAgIHR5cGU6IHQuYmdSZWxhdGl2ZVRvXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1yZXBlYXQnLFxuICAgIHR5cGU6IHQuYmdSZXBlYXRcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWZpdCcsXG4gICAgdHlwZTogdC5iZ0ZpdFxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtY2xpcCcsXG4gICAgdHlwZTogdC5iZ0NsaXBcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLXdpZHRoJyxcbiAgICB0eXBlOiB0LmJnV0hcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWhlaWdodCcsXG4gICAgdHlwZTogdC5iZ1dIXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1vZmZzZXQteCcsXG4gICAgdHlwZTogdC5iZ1Bvc1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtb2Zmc2V0LXknLFxuICAgIHR5cGU6IHQuYmdQb3NcbiAgfV07XG4gIHZhciBjb21wb3VuZCA9IFt7XG4gICAgbmFtZTogJ3Bvc2l0aW9uJyxcbiAgICB0eXBlOiB0LnBvc2l0aW9uLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2NvbXBvdW5kLXNpemluZy13cnQtbGFiZWxzJyxcbiAgICB0eXBlOiB0LmNvbXBvdW5kSW5jbHVkZUxhYmVscyxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdtaW4td2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdtaW4td2lkdGgtYmlhcy1sZWZ0JyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLXdpZHRoLWJpYXMtcmlnaHQnLFxuICAgIHR5cGU6IHQuc2l6ZU1heWJlUGVyY2VudCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdtaW4taGVpZ2h0JyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLWhlaWdodC1iaWFzLXRvcCcsXG4gICAgdHlwZTogdC5zaXplTWF5YmVQZXJjZW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ21pbi1oZWlnaHQtYmlhcy1ib3R0b20nLFxuICAgIHR5cGU6IHQuc2l6ZU1heWJlUGVyY2VudCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBlZGdlTGluZSA9IFt7XG4gICAgbmFtZTogJ2xpbmUtc3R5bGUnLFxuICAgIHR5cGU6IHQubGluZVN0eWxlXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtZmlsbCcsXG4gICAgdHlwZTogdC5maWxsXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1jYXAnLFxuICAgIHR5cGU6IHQubGluZUNhcFxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1kYXNoLXBhdHRlcm4nLFxuICAgIHR5cGU6IHQubnVtYmVyc1xuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtZGFzaC1vZmZzZXQnLFxuICAgIHR5cGU6IHQubnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1ncmFkaWVudC1zdG9wLWNvbG9ycycsXG4gICAgdHlwZTogdC5jb2xvcnNcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJyxcbiAgICB0eXBlOiB0LnBlcmNlbnRhZ2VzXG4gIH0sIHtcbiAgICBuYW1lOiAnY3VydmUtc3R5bGUnLFxuICAgIHR5cGU6IHQuY3VydmVTdHlsZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnksXG4gICAgdHJpZ2dlcnNCb3VuZHNPZlBhcmFsbGVsQmV6aWVyczogdHJ1ZVxuICB9LCB7XG4gICAgbmFtZTogJ2hheXN0YWNrLXJhZGl1cycsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NvdXJjZS1lbmRwb2ludCcsXG4gICAgdHlwZTogdC5lZGdlRW5kcG9pbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGFyZ2V0LWVuZHBvaW50JyxcbiAgICB0eXBlOiB0LmVkZ2VFbmRwb2ludCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdjb250cm9sLXBvaW50LXN0ZXAtc2l6ZScsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2VzJyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplcyxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdjb250cm9sLXBvaW50LXdlaWdodHMnLFxuICAgIHR5cGU6IHQubnVtYmVycyxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzZWdtZW50LWRpc3RhbmNlcycsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZXMsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc2VnbWVudC13ZWlnaHRzJyxcbiAgICB0eXBlOiB0Lm51bWJlcnMsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc2VnbWVudC1yYWRpaScsXG4gICAgdHlwZTogdC5udW1iZXJzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3JhZGl1cy10eXBlJyxcbiAgICB0eXBlOiB0LnJhZGl1c1R5cGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGF4aS10dXJuJyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplTWF5YmVQZXJjZW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RheGktdHVybi1taW4tZGlzdGFuY2UnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXhpLWRpcmVjdGlvbicsXG4gICAgdHlwZTogdC5heGlzRGlyZWN0aW9uLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RheGktcmFkaXVzJyxcbiAgICB0eXBlOiB0Lm51bWJlcixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdlZGdlLWRpc3RhbmNlcycsXG4gICAgdHlwZTogdC5lZGdlRGlzdGFuY2VzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2Fycm93LXNjYWxlJyxcbiAgICB0eXBlOiB0LnBvc2l0aXZlTnVtYmVyLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2xvb3AtZGlyZWN0aW9uJyxcbiAgICB0eXBlOiB0LmFuZ2xlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2xvb3Atc3dlZXAnLFxuICAgIHR5cGU6IHQuYW5nbGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc291cmNlLWRpc3RhbmNlLWZyb20tbm9kZScsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RhcmdldC1kaXN0YW5jZS1mcm9tLW5vZGUnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBnaG9zdCA9IFt7XG4gICAgbmFtZTogJ2dob3N0JyxcbiAgICB0eXBlOiB0LmJvb2wsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZ2hvc3Qtb2Zmc2V0LXgnLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZ2hvc3Qtb2Zmc2V0LXknLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZ2hvc3Qtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH1dO1xuICB2YXIgY29yZSA9IFt7XG4gICAgbmFtZTogJ3NlbGVjdGlvbi1ib3gtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdzZWxlY3Rpb24tYm94LW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnc2VsZWN0aW9uLWJveC1ib3JkZXItd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZVxuICB9LCB7XG4gICAgbmFtZTogJ2FjdGl2ZS1iZy1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2FjdGl2ZS1iZy1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdhY3RpdmUtYmctc2l6ZScsXG4gICAgdHlwZTogdC5zaXplXG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0c2lkZS10ZXh0dXJlLWJnLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0c2lkZS10ZXh0dXJlLWJnLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9XTtcblxuICAvLyBwaWUgYmFja2dyb3VuZHMgZm9yIG5vZGVzXG4gIHZhciBwaWUgPSBbXTtcbiAgc3R5Zm4kMi5waWVCYWNrZ3JvdW5kTiA9IDE2OyAvLyBiZWNhdXNlIHRoZSBwaWUgcHJvcGVydGllcyBhcmUgbnVtYmVyZWQsIGdpdmUgYWNjZXNzIHRvIGEgY29uc3RhbnQgTiAoZm9yIHJlbmRlcmVyIHVzZSlcbiAgcGllLnB1c2goe1xuICAgIG5hbWU6ICdwaWUtc2l6ZScsXG4gICAgdHlwZTogdC5zaXplTWF5YmVQZXJjZW50XG4gIH0pO1xuICBmb3IgKHZhciBpID0gMTsgaSA8PSBzdHlmbiQyLnBpZUJhY2tncm91bmROOyBpKyspIHtcbiAgICBwaWUucHVzaCh7XG4gICAgICBuYW1lOiAncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLWNvbG9yJyxcbiAgICAgIHR5cGU6IHQuY29sb3JcbiAgICB9KTtcbiAgICBwaWUucHVzaCh7XG4gICAgICBuYW1lOiAncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLXNpemUnLFxuICAgICAgdHlwZTogdC5wZXJjZW50XG4gICAgfSk7XG4gICAgcGllLnB1c2goe1xuICAgICAgbmFtZTogJ3BpZS0nICsgaSArICctYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICAgIH0pO1xuICB9XG5cbiAgLy8gZWRnZSBhcnJvd3NcbiAgdmFyIGVkZ2VBcnJvdyA9IFtdO1xuICB2YXIgYXJyb3dQcmVmaXhlcyA9IHN0eWZuJDIuYXJyb3dQcmVmaXhlcyA9IFsnc291cmNlJywgJ21pZC1zb3VyY2UnLCAndGFyZ2V0JywgJ21pZC10YXJnZXQnXTtcbiAgW3tcbiAgICBuYW1lOiAnYXJyb3ctc2hhcGUnLFxuICAgIHR5cGU6IHQuYXJyb3dTaGFwZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdhcnJvdy1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2Fycm93LWZpbGwnLFxuICAgIHR5cGU6IHQuYXJyb3dGaWxsXG4gIH0sIHtcbiAgICBuYW1lOiAnYXJyb3ctd2lkdGgnLFxuICAgIHR5cGU6IHQuYXJyb3dXaWR0aFxuICB9XS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgYXJyb3dQcmVmaXhlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICAgIHZhciBuYW1lID0gcHJlZml4ICsgJy0nICsgcHJvcC5uYW1lO1xuICAgICAgdmFyIHR5cGUgPSBwcm9wLnR5cGUsXG4gICAgICAgIHRyaWdnZXJzQm91bmRzID0gcHJvcC50cmlnZ2Vyc0JvdW5kcztcbiAgICAgIGVkZ2VBcnJvdy5wdXNoKHtcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgdHJpZ2dlcnNCb3VuZHM6IHRyaWdnZXJzQm91bmRzXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSwge30pO1xuICB2YXIgcHJvcHMgPSBzdHlmbiQyLnByb3BlcnRpZXMgPSBbXS5jb25jYXQoYmVoYXZpb3IsIHRyYW5zaXRpb24sIHZpc2liaWxpdHksIG92ZXJsYXksIHVuZGVybGF5LCBnaG9zdCwgY29tbW9uTGFiZWwsIGxhYmVsRGltZW5zaW9ucywgbWFpbkxhYmVsLCBzb3VyY2VMYWJlbCwgdGFyZ2V0TGFiZWwsIG5vZGVCb2R5LCBub2RlQm9yZGVyLCBub2RlT3V0bGluZSwgYmFja2dyb3VuZEltYWdlLCBwaWUsIGNvbXBvdW5kLCBlZGdlTGluZSwgZWRnZUFycm93LCBjb3JlKTtcbiAgdmFyIHByb3BHcm91cHMgPSBzdHlmbiQyLnByb3BlcnR5R3JvdXBzID0ge1xuICAgIC8vIGNvbW1vbiB0byBhbGwgZWxlc1xuICAgIGJlaGF2aW9yOiBiZWhhdmlvcixcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uLFxuICAgIHZpc2liaWxpdHk6IHZpc2liaWxpdHksXG4gICAgb3ZlcmxheTogb3ZlcmxheSxcbiAgICB1bmRlcmxheTogdW5kZXJsYXksXG4gICAgZ2hvc3Q6IGdob3N0LFxuICAgIC8vIGxhYmVsc1xuICAgIGNvbW1vbkxhYmVsOiBjb21tb25MYWJlbCxcbiAgICBsYWJlbERpbWVuc2lvbnM6IGxhYmVsRGltZW5zaW9ucyxcbiAgICBtYWluTGFiZWw6IG1haW5MYWJlbCxcbiAgICBzb3VyY2VMYWJlbDogc291cmNlTGFiZWwsXG4gICAgdGFyZ2V0TGFiZWw6IHRhcmdldExhYmVsLFxuICAgIC8vIG5vZGUgcHJvcHNcbiAgICBub2RlQm9keTogbm9kZUJvZHksXG4gICAgbm9kZUJvcmRlcjogbm9kZUJvcmRlcixcbiAgICBub2RlT3V0bGluZTogbm9kZU91dGxpbmUsXG4gICAgYmFja2dyb3VuZEltYWdlOiBiYWNrZ3JvdW5kSW1hZ2UsXG4gICAgcGllOiBwaWUsXG4gICAgY29tcG91bmQ6IGNvbXBvdW5kLFxuICAgIC8vIGVkZ2UgcHJvcHNcbiAgICBlZGdlTGluZTogZWRnZUxpbmUsXG4gICAgZWRnZUFycm93OiBlZGdlQXJyb3csXG4gICAgY29yZTogY29yZVxuICB9O1xuICB2YXIgcHJvcEdyb3VwTmFtZXMgPSBzdHlmbiQyLnByb3BlcnR5R3JvdXBOYW1lcyA9IHt9O1xuICB2YXIgcHJvcEdyb3VwS2V5cyA9IHN0eWZuJDIucHJvcGVydHlHcm91cEtleXMgPSBPYmplY3Qua2V5cyhwcm9wR3JvdXBzKTtcbiAgcHJvcEdyb3VwS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBwcm9wR3JvdXBOYW1lc1trZXldID0gcHJvcEdyb3Vwc1trZXldLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgcmV0dXJuIHByb3AubmFtZTtcbiAgICB9KTtcbiAgICBwcm9wR3JvdXBzW2tleV0uZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgcmV0dXJuIHByb3AuZ3JvdXBLZXkgPSBrZXk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIGRlZmluZSBhbGlhc2VzXG4gIHZhciBhbGlhc2VzID0gc3R5Zm4kMi5hbGlhc2VzID0gW3tcbiAgICBuYW1lOiAnY29udGVudCcsXG4gICAgcG9pbnRzVG86ICdsYWJlbCdcbiAgfSwge1xuICAgIG5hbWU6ICdjb250cm9sLXBvaW50LWRpc3RhbmNlJyxcbiAgICBwb2ludHNUbzogJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2VzJ1xuICB9LCB7XG4gICAgbmFtZTogJ2NvbnRyb2wtcG9pbnQtd2VpZ2h0JyxcbiAgICBwb2ludHNUbzogJ2NvbnRyb2wtcG9pbnQtd2VpZ2h0cydcbiAgfSwge1xuICAgIG5hbWU6ICdzZWdtZW50LWRpc3RhbmNlJyxcbiAgICBwb2ludHNUbzogJ3NlZ21lbnQtZGlzdGFuY2VzJ1xuICB9LCB7XG4gICAgbmFtZTogJ3NlZ21lbnQtd2VpZ2h0JyxcbiAgICBwb2ludHNUbzogJ3NlZ21lbnQtd2VpZ2h0cydcbiAgfSwge1xuICAgIG5hbWU6ICdzZWdtZW50LXJhZGl1cycsXG4gICAgcG9pbnRzVG86ICdzZWdtZW50LXJhZGlpJ1xuICB9LCB7XG4gICAgbmFtZTogJ2VkZ2UtdGV4dC1yb3RhdGlvbicsXG4gICAgcG9pbnRzVG86ICd0ZXh0LXJvdGF0aW9uJ1xuICB9LCB7XG4gICAgbmFtZTogJ3BhZGRpbmctbGVmdCcsXG4gICAgcG9pbnRzVG86ICdwYWRkaW5nJ1xuICB9LCB7XG4gICAgbmFtZTogJ3BhZGRpbmctcmlnaHQnLFxuICAgIHBvaW50c1RvOiAncGFkZGluZydcbiAgfSwge1xuICAgIG5hbWU6ICdwYWRkaW5nLXRvcCcsXG4gICAgcG9pbnRzVG86ICdwYWRkaW5nJ1xuICB9LCB7XG4gICAgbmFtZTogJ3BhZGRpbmctYm90dG9tJyxcbiAgICBwb2ludHNUbzogJ3BhZGRpbmcnXG4gIH1dO1xuXG4gIC8vIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXNcbiAgc3R5Zm4kMi5wcm9wZXJ0eU5hbWVzID0gcHJvcHMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIHAubmFtZTtcbiAgfSk7XG5cbiAgLy8gYWxsb3cgYWNjZXNzIG9mIHByb3BlcnRpZXMgYnkgbmFtZSAoIGUuZy4gc3R5bGUucHJvcGVydGllcy5oZWlnaHQgKVxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgcHJvcHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIHByb3AgPSBwcm9wc1tfaV07XG4gICAgcHJvcHNbcHJvcC5uYW1lXSA9IHByb3A7IC8vIGFsbG93IGxvb2t1cCBieSBuYW1lXG4gIH1cblxuICAvLyBtYXAgYWxpYXNlc1xuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBhbGlhc2VzLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIgYWxpYXMgPSBhbGlhc2VzW19pMl07XG4gICAgdmFyIHBvaW50c1RvUHJvcCA9IHByb3BzW2FsaWFzLnBvaW50c1RvXTtcbiAgICB2YXIgYWxpYXNQcm9wID0ge1xuICAgICAgbmFtZTogYWxpYXMubmFtZSxcbiAgICAgIGFsaWFzOiB0cnVlLFxuICAgICAgcG9pbnRzVG86IHBvaW50c1RvUHJvcFxuICAgIH07XG5cbiAgICAvLyBhZGQgYWxpYXMgcHJvcCBmb3IgcGFyc2luZ1xuICAgIHByb3BzLnB1c2goYWxpYXNQcm9wKTtcbiAgICBwcm9wc1thbGlhcy5uYW1lXSA9IGFsaWFzUHJvcDsgLy8gYWxsb3cgbG9va3VwIGJ5IG5hbWVcbiAgfVxufSkoKTtcblxuc3R5Zm4kMi5nZXREZWZhdWx0UHJvcGVydHkgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gdGhpcy5nZXREZWZhdWx0UHJvcGVydGllcygpW25hbWVdO1xufTtcbnN0eWZuJDIuZ2V0RGVmYXVsdFByb3BlcnRpZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gIGlmIChfcC5kZWZhdWx0UHJvcGVydGllcyAhPSBudWxsKSB7XG4gICAgcmV0dXJuIF9wLmRlZmF1bHRQcm9wZXJ0aWVzO1xuICB9XG4gIHZhciByYXdQcm9wcyA9IGV4dGVuZCh7XG4gICAgLy8gY29yZSBwcm9wc1xuICAgICdzZWxlY3Rpb24tYm94LWNvbG9yJzogJyNkZGQnLFxuICAgICdzZWxlY3Rpb24tYm94LW9wYWNpdHknOiAwLjY1LFxuICAgICdzZWxlY3Rpb24tYm94LWJvcmRlci1jb2xvcic6ICcjYWFhJyxcbiAgICAnc2VsZWN0aW9uLWJveC1ib3JkZXItd2lkdGgnOiAxLFxuICAgICdhY3RpdmUtYmctY29sb3InOiAnYmxhY2snLFxuICAgICdhY3RpdmUtYmctb3BhY2l0eSc6IDAuMTUsXG4gICAgJ2FjdGl2ZS1iZy1zaXplJzogMzAsXG4gICAgJ291dHNpZGUtdGV4dHVyZS1iZy1jb2xvcic6ICcjMDAwJyxcbiAgICAnb3V0c2lkZS10ZXh0dXJlLWJnLW9wYWNpdHknOiAwLjEyNSxcbiAgICAvLyBjb21tb24gbm9kZS9lZGdlIHByb3BzXG4gICAgJ2V2ZW50cyc6ICd5ZXMnLFxuICAgICd0ZXh0LWV2ZW50cyc6ICdubycsXG4gICAgJ3RleHQtdmFsaWduJzogJ3RvcCcsXG4gICAgJ3RleHQtaGFsaWduJzogJ2NlbnRlcicsXG4gICAgJ3RleHQtanVzdGlmaWNhdGlvbic6ICdhdXRvJyxcbiAgICAnbGluZS1oZWlnaHQnOiAxLFxuICAgICdjb2xvcic6ICcjMDAwJyxcbiAgICAndGV4dC1vdXRsaW5lLWNvbG9yJzogJyMwMDAnLFxuICAgICd0ZXh0LW91dGxpbmUtd2lkdGgnOiAwLFxuICAgICd0ZXh0LW91dGxpbmUtb3BhY2l0eSc6IDEsXG4gICAgJ3RleHQtb3BhY2l0eSc6IDEsXG4gICAgJ3RleHQtZGVjb3JhdGlvbic6ICdub25lJyxcbiAgICAndGV4dC10cmFuc2Zvcm0nOiAnbm9uZScsXG4gICAgJ3RleHQtd3JhcCc6ICdub25lJyxcbiAgICAndGV4dC1vdmVyZmxvdy13cmFwJzogJ3doaXRlc3BhY2UnLFxuICAgICd0ZXh0LW1heC13aWR0aCc6IDk5OTksXG4gICAgJ3RleHQtYmFja2dyb3VuZC1jb2xvcic6ICcjMDAwJyxcbiAgICAndGV4dC1iYWNrZ3JvdW5kLW9wYWNpdHknOiAwLFxuICAgICd0ZXh0LWJhY2tncm91bmQtc2hhcGUnOiAncmVjdGFuZ2xlJyxcbiAgICAndGV4dC1iYWNrZ3JvdW5kLXBhZGRpbmcnOiAwLFxuICAgICd0ZXh0LWJvcmRlci1vcGFjaXR5JzogMCxcbiAgICAndGV4dC1ib3JkZXItd2lkdGgnOiAwLFxuICAgICd0ZXh0LWJvcmRlci1zdHlsZSc6ICdzb2xpZCcsXG4gICAgJ3RleHQtYm9yZGVyLWNvbG9yJzogJyMwMDAnLFxuICAgICdmb250LWZhbWlseSc6ICdIZWx2ZXRpY2EgTmV1ZSwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmJyxcbiAgICAnZm9udC1zdHlsZSc6ICdub3JtYWwnLFxuICAgICdmb250LXdlaWdodCc6ICdub3JtYWwnLFxuICAgICdmb250LXNpemUnOiAxNixcbiAgICAnbWluLXpvb21lZC1mb250LXNpemUnOiAwLFxuICAgICd0ZXh0LXJvdGF0aW9uJzogJ25vbmUnLFxuICAgICdzb3VyY2UtdGV4dC1yb3RhdGlvbic6ICdub25lJyxcbiAgICAndGFyZ2V0LXRleHQtcm90YXRpb24nOiAnbm9uZScsXG4gICAgJ3Zpc2liaWxpdHknOiAndmlzaWJsZScsXG4gICAgJ2Rpc3BsYXknOiAnZWxlbWVudCcsXG4gICAgJ29wYWNpdHknOiAxLFxuICAgICd6LWNvbXBvdW5kLWRlcHRoJzogJ2F1dG8nLFxuICAgICd6LWluZGV4LWNvbXBhcmUnOiAnYXV0bycsXG4gICAgJ3otaW5kZXgnOiAwLFxuICAgICdsYWJlbCc6ICcnLFxuICAgICd0ZXh0LW1hcmdpbi14JzogMCxcbiAgICAndGV4dC1tYXJnaW4teSc6IDAsXG4gICAgJ3NvdXJjZS1sYWJlbCc6ICcnLFxuICAgICdzb3VyY2UtdGV4dC1vZmZzZXQnOiAwLFxuICAgICdzb3VyY2UtdGV4dC1tYXJnaW4teCc6IDAsXG4gICAgJ3NvdXJjZS10ZXh0LW1hcmdpbi15JzogMCxcbiAgICAndGFyZ2V0LWxhYmVsJzogJycsXG4gICAgJ3RhcmdldC10ZXh0LW9mZnNldCc6IDAsXG4gICAgJ3RhcmdldC10ZXh0LW1hcmdpbi14JzogMCxcbiAgICAndGFyZ2V0LXRleHQtbWFyZ2luLXknOiAwLFxuICAgICdvdmVybGF5LW9wYWNpdHknOiAwLFxuICAgICdvdmVybGF5LWNvbG9yJzogJyMwMDAnLFxuICAgICdvdmVybGF5LXBhZGRpbmcnOiAxMCxcbiAgICAnb3ZlcmxheS1zaGFwZSc6ICdyb3VuZC1yZWN0YW5nbGUnLFxuICAgICdvdmVybGF5LWNvcm5lci1yYWRpdXMnOiAnYXV0bycsXG4gICAgJ3VuZGVybGF5LW9wYWNpdHknOiAwLFxuICAgICd1bmRlcmxheS1jb2xvcic6ICcjMDAwJyxcbiAgICAndW5kZXJsYXktcGFkZGluZyc6IDEwLFxuICAgICd1bmRlcmxheS1zaGFwZSc6ICdyb3VuZC1yZWN0YW5nbGUnLFxuICAgICd1bmRlcmxheS1jb3JuZXItcmFkaXVzJzogJ2F1dG8nLFxuICAgICd0cmFuc2l0aW9uLXByb3BlcnR5JzogJ25vbmUnLFxuICAgICd0cmFuc2l0aW9uLWR1cmF0aW9uJzogMCxcbiAgICAndHJhbnNpdGlvbi1kZWxheSc6IDAsXG4gICAgJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJzogJ2xpbmVhcicsXG4gICAgLy8gbm9kZSBwcm9wc1xuICAgICdiYWNrZ3JvdW5kLWJsYWNrZW4nOiAwLFxuICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyM5OTknLFxuICAgICdiYWNrZ3JvdW5kLWZpbGwnOiAnc29saWQnLFxuICAgICdiYWNrZ3JvdW5kLW9wYWNpdHknOiAxLFxuICAgICdiYWNrZ3JvdW5kLWltYWdlJzogJ25vbmUnLFxuICAgICdiYWNrZ3JvdW5kLWltYWdlLWNyb3Nzb3JpZ2luJzogJ2Fub255bW91cycsXG4gICAgJ2JhY2tncm91bmQtaW1hZ2Utb3BhY2l0eSc6IDEsXG4gICAgJ2JhY2tncm91bmQtaW1hZ2UtY29udGFpbm1lbnQnOiAnaW5zaWRlJyxcbiAgICAnYmFja2dyb3VuZC1pbWFnZS1zbW9vdGhpbmcnOiAneWVzJyxcbiAgICAnYmFja2dyb3VuZC1wb3NpdGlvbi14JzogJzUwJScsXG4gICAgJ2JhY2tncm91bmQtcG9zaXRpb24teSc6ICc1MCUnLFxuICAgICdiYWNrZ3JvdW5kLW9mZnNldC14JzogMCxcbiAgICAnYmFja2dyb3VuZC1vZmZzZXQteSc6IDAsXG4gICAgJ2JhY2tncm91bmQtd2lkdGgtcmVsYXRpdmUtdG8nOiAnaW5jbHVkZS1wYWRkaW5nJyxcbiAgICAnYmFja2dyb3VuZC1oZWlnaHQtcmVsYXRpdmUtdG8nOiAnaW5jbHVkZS1wYWRkaW5nJyxcbiAgICAnYmFja2dyb3VuZC1yZXBlYXQnOiAnbm8tcmVwZWF0JyxcbiAgICAnYmFja2dyb3VuZC1maXQnOiAnbm9uZScsXG4gICAgJ2JhY2tncm91bmQtY2xpcCc6ICdub2RlJyxcbiAgICAnYmFja2dyb3VuZC13aWR0aCc6ICdhdXRvJyxcbiAgICAnYmFja2dyb3VuZC1oZWlnaHQnOiAnYXV0bycsXG4gICAgJ2JvcmRlci1jb2xvcic6ICcjMDAwJyxcbiAgICAnYm9yZGVyLW9wYWNpdHknOiAxLFxuICAgICdib3JkZXItd2lkdGgnOiAwLFxuICAgICdib3JkZXItc3R5bGUnOiAnc29saWQnLFxuICAgICdib3JkZXItZGFzaC1wYXR0ZXJuJzogWzQsIDJdLFxuICAgICdib3JkZXItZGFzaC1vZmZzZXQnOiAwLFxuICAgICdib3JkZXItY2FwJzogJ2J1dHQnLFxuICAgICdib3JkZXItam9pbic6ICdtaXRlcicsXG4gICAgJ2JvcmRlci1wb3NpdGlvbic6ICdjZW50ZXInLFxuICAgICdvdXRsaW5lLWNvbG9yJzogJyM5OTknLFxuICAgICdvdXRsaW5lLW9wYWNpdHknOiAxLFxuICAgICdvdXRsaW5lLXdpZHRoJzogMCxcbiAgICAnb3V0bGluZS1vZmZzZXQnOiAwLFxuICAgICdvdXRsaW5lLXN0eWxlJzogJ3NvbGlkJyxcbiAgICAnaGVpZ2h0JzogMzAsXG4gICAgJ3dpZHRoJzogMzAsXG4gICAgJ3NoYXBlJzogJ2VsbGlwc2UnLFxuICAgICdzaGFwZS1wb2x5Z29uLXBvaW50cyc6ICctMSwgLTEsICAgMSwgLTEsICAgMSwgMSwgICAtMSwgMScsXG4gICAgJ2Nvcm5lci1yYWRpdXMnOiAnYXV0bycsXG4gICAgJ2JvdW5kcy1leHBhbnNpb24nOiAwLFxuICAgIC8vIG5vZGUgZ3JhZGllbnRcbiAgICAnYmFja2dyb3VuZC1ncmFkaWVudC1kaXJlY3Rpb24nOiAndG8tYm90dG9tJyxcbiAgICAnYmFja2dyb3VuZC1ncmFkaWVudC1zdG9wLWNvbG9ycyc6ICcjOTk5JyxcbiAgICAnYmFja2dyb3VuZC1ncmFkaWVudC1zdG9wLXBvc2l0aW9ucyc6ICcwJScsXG4gICAgLy8gZ2hvc3QgcHJvcHNcbiAgICAnZ2hvc3QnOiAnbm8nLFxuICAgICdnaG9zdC1vZmZzZXQteSc6IDAsXG4gICAgJ2dob3N0LW9mZnNldC14JzogMCxcbiAgICAnZ2hvc3Qtb3BhY2l0eSc6IDAsXG4gICAgLy8gY29tcG91bmQgcHJvcHNcbiAgICAncGFkZGluZyc6IDAsXG4gICAgJ3BhZGRpbmctcmVsYXRpdmUtdG8nOiAnd2lkdGgnLFxuICAgICdwb3NpdGlvbic6ICdvcmlnaW4nLFxuICAgICdjb21wb3VuZC1zaXppbmctd3J0LWxhYmVscyc6ICdpbmNsdWRlJyxcbiAgICAnbWluLXdpZHRoJzogMCxcbiAgICAnbWluLXdpZHRoLWJpYXMtbGVmdCc6IDAsXG4gICAgJ21pbi13aWR0aC1iaWFzLXJpZ2h0JzogMCxcbiAgICAnbWluLWhlaWdodCc6IDAsXG4gICAgJ21pbi1oZWlnaHQtYmlhcy10b3AnOiAwLFxuICAgICdtaW4taGVpZ2h0LWJpYXMtYm90dG9tJzogMFxuICB9LCB7XG4gICAgLy8gbm9kZSBwaWUgYmdcbiAgICAncGllLXNpemUnOiAnMTAwJSdcbiAgfSwgW3tcbiAgICBuYW1lOiAncGllLXt7aX19LWJhY2tncm91bmQtY29sb3InLFxuICAgIHZhbHVlOiAnYmxhY2snXG4gIH0sIHtcbiAgICBuYW1lOiAncGllLXt7aX19LWJhY2tncm91bmQtc2l6ZScsXG4gICAgdmFsdWU6ICcwJSdcbiAgfSwge1xuICAgIG5hbWU6ICdwaWUte3tpfX0tYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICB2YWx1ZTogMVxuICB9XS5yZWR1Y2UoZnVuY3Rpb24gKGNzcywgcHJvcCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IHN0eWZuJDIucGllQmFja2dyb3VuZE47IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBwcm9wLm5hbWUucmVwbGFjZSgne3tpfX0nLCBpKTtcbiAgICAgIHZhciB2YWwgPSBwcm9wLnZhbHVlO1xuICAgICAgY3NzW25hbWVdID0gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gY3NzO1xuICB9LCB7fSksIHtcbiAgICAvLyBlZGdlIHByb3BzXG4gICAgJ2xpbmUtc3R5bGUnOiAnc29saWQnLFxuICAgICdsaW5lLWNvbG9yJzogJyM5OTknLFxuICAgICdsaW5lLWZpbGwnOiAnc29saWQnLFxuICAgICdsaW5lLWNhcCc6ICdidXR0JyxcbiAgICAnbGluZS1vcGFjaXR5JzogMSxcbiAgICAnbGluZS1ncmFkaWVudC1zdG9wLWNvbG9ycyc6ICcjOTk5JyxcbiAgICAnbGluZS1ncmFkaWVudC1zdG9wLXBvc2l0aW9ucyc6ICcwJScsXG4gICAgJ2NvbnRyb2wtcG9pbnQtc3RlcC1zaXplJzogNDAsXG4gICAgJ2NvbnRyb2wtcG9pbnQtd2VpZ2h0cyc6IDAuNSxcbiAgICAnc2VnbWVudC13ZWlnaHRzJzogMC41LFxuICAgICdzZWdtZW50LWRpc3RhbmNlcyc6IDIwLFxuICAgICdzZWdtZW50LXJhZGlpJzogMTUsXG4gICAgJ3JhZGl1cy10eXBlJzogJ2FyYy1yYWRpdXMnLFxuICAgICd0YXhpLXR1cm4nOiAnNTAlJyxcbiAgICAndGF4aS1yYWRpdXMnOiAxNSxcbiAgICAndGF4aS10dXJuLW1pbi1kaXN0YW5jZSc6IDEwLFxuICAgICd0YXhpLWRpcmVjdGlvbic6ICdhdXRvJyxcbiAgICAnZWRnZS1kaXN0YW5jZXMnOiAnaW50ZXJzZWN0aW9uJyxcbiAgICAnY3VydmUtc3R5bGUnOiAnaGF5c3RhY2snLFxuICAgICdoYXlzdGFjay1yYWRpdXMnOiAwLFxuICAgICdhcnJvdy1zY2FsZSc6IDEsXG4gICAgJ2xvb3AtZGlyZWN0aW9uJzogJy00NWRlZycsXG4gICAgJ2xvb3Atc3dlZXAnOiAnLTkwZGVnJyxcbiAgICAnc291cmNlLWRpc3RhbmNlLWZyb20tbm9kZSc6IDAsXG4gICAgJ3RhcmdldC1kaXN0YW5jZS1mcm9tLW5vZGUnOiAwLFxuICAgICdzb3VyY2UtZW5kcG9pbnQnOiAnb3V0c2lkZS10by1ub2RlJyxcbiAgICAndGFyZ2V0LWVuZHBvaW50JzogJ291dHNpZGUtdG8tbm9kZScsXG4gICAgJ2xpbmUtZGFzaC1wYXR0ZXJuJzogWzYsIDNdLFxuICAgICdsaW5lLWRhc2gtb2Zmc2V0JzogMFxuICB9LCBbe1xuICAgIG5hbWU6ICdhcnJvdy1zaGFwZScsXG4gICAgdmFsdWU6ICdub25lJ1xuICB9LCB7XG4gICAgbmFtZTogJ2Fycm93LWNvbG9yJyxcbiAgICB2YWx1ZTogJyM5OTknXG4gIH0sIHtcbiAgICBuYW1lOiAnYXJyb3ctZmlsbCcsXG4gICAgdmFsdWU6ICdmaWxsZWQnXG4gIH0sIHtcbiAgICBuYW1lOiAnYXJyb3ctd2lkdGgnLFxuICAgIHZhbHVlOiAxXG4gIH1dLnJlZHVjZShmdW5jdGlvbiAoY3NzLCBwcm9wKSB7XG4gICAgc3R5Zm4kMi5hcnJvd1ByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkge1xuICAgICAgdmFyIG5hbWUgPSBwcmVmaXggKyAnLScgKyBwcm9wLm5hbWU7XG4gICAgICB2YXIgdmFsID0gcHJvcC52YWx1ZTtcbiAgICAgIGNzc1tuYW1lXSA9IHZhbDtcbiAgICB9KTtcbiAgICByZXR1cm4gY3NzO1xuICB9LCB7fSkpO1xuICB2YXIgcGFyc2VkUHJvcHMgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHJvcCA9IHRoaXMucHJvcGVydGllc1tpXTtcbiAgICBpZiAocHJvcC5wb2ludHNUbykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBuYW1lID0gcHJvcC5uYW1lO1xuICAgIHZhciB2YWwgPSByYXdQcm9wc1tuYW1lXTtcbiAgICB2YXIgcGFyc2VkUHJvcCA9IHRoaXMucGFyc2UobmFtZSwgdmFsKTtcbiAgICBwYXJzZWRQcm9wc1tuYW1lXSA9IHBhcnNlZFByb3A7XG4gIH1cbiAgX3AuZGVmYXVsdFByb3BlcnRpZXMgPSBwYXJzZWRQcm9wcztcbiAgcmV0dXJuIF9wLmRlZmF1bHRQcm9wZXJ0aWVzO1xufTtcbnN0eWZuJDIuYWRkRGVmYXVsdFN0eWxlc2hlZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2VsZWN0b3IoJzpwYXJlbnQnKS5jc3Moe1xuICAgICdzaGFwZSc6ICdyZWN0YW5nbGUnLFxuICAgICdwYWRkaW5nJzogMTAsXG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnI2VlZScsXG4gICAgJ2JvcmRlci1jb2xvcic6ICcjY2NjJyxcbiAgICAnYm9yZGVyLXdpZHRoJzogMVxuICB9KS5zZWxlY3RvcignZWRnZScpLmNzcyh7XG4gICAgJ3dpZHRoJzogM1xuICB9KS5zZWxlY3RvcignOmxvb3AnKS5jc3Moe1xuICAgICdjdXJ2ZS1zdHlsZSc6ICdiZXppZXInXG4gIH0pLnNlbGVjdG9yKCdlZGdlOmNvbXBvdW5kJykuY3NzKHtcbiAgICAnY3VydmUtc3R5bGUnOiAnYmV6aWVyJyxcbiAgICAnc291cmNlLWVuZHBvaW50JzogJ291dHNpZGUtdG8tbGluZScsXG4gICAgJ3RhcmdldC1lbmRwb2ludCc6ICdvdXRzaWRlLXRvLWxpbmUnXG4gIH0pLnNlbGVjdG9yKCc6c2VsZWN0ZWQnKS5jc3Moe1xuICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyMwMTY5RDknLFxuICAgICdsaW5lLWNvbG9yJzogJyMwMTY5RDknLFxuICAgICdzb3VyY2UtYXJyb3ctY29sb3InOiAnIzAxNjlEOScsXG4gICAgJ3RhcmdldC1hcnJvdy1jb2xvcic6ICcjMDE2OUQ5JyxcbiAgICAnbWlkLXNvdXJjZS1hcnJvdy1jb2xvcic6ICcjMDE2OUQ5JyxcbiAgICAnbWlkLXRhcmdldC1hcnJvdy1jb2xvcic6ICcjMDE2OUQ5J1xuICB9KS5zZWxlY3RvcignOnBhcmVudDpzZWxlY3RlZCcpLmNzcyh7XG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnI0NDRTFGOScsXG4gICAgJ2JvcmRlci1jb2xvcic6ICcjYWVjOGU1J1xuICB9KS5zZWxlY3RvcignOmFjdGl2ZScpLmNzcyh7XG4gICAgJ292ZXJsYXktY29sb3InOiAnYmxhY2snLFxuICAgICdvdmVybGF5LXBhZGRpbmcnOiAxMCxcbiAgICAnb3ZlcmxheS1vcGFjaXR5JzogMC4yNVxuICB9KTtcbiAgdGhpcy5kZWZhdWx0TGVuZ3RoID0gdGhpcy5sZW5ndGg7XG59O1xuXG52YXIgc3R5Zm4kMSA9IHt9O1xuXG4vLyBhIGNhY2hpbmcgbGF5ZXIgZm9yIHByb3BlcnR5IHBhcnNpbmdcbnN0eWZuJDEucGFyc2UgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgLy8gZnVuY3Rpb24gdmFsdWVzIGNhbid0IGJlIGNhY2hlZCBpbiBhbGwgY2FzZXMsIGFuZCB0aGVyZSBpc24ndCBtdWNoIGJlbmVmaXQgb2YgY2FjaGluZyB0aGVtIGFueXdheVxuICBpZiAoZm4kNih2YWx1ZSkpIHtcbiAgICByZXR1cm4gc2VsZi5wYXJzZUltcGxXYXJuKG5hbWUsIHZhbHVlLCBwcm9wSXNCeXBhc3MsIHByb3BJc0ZsYXQpO1xuICB9XG4gIHZhciBmbGF0S2V5ID0gcHJvcElzRmxhdCA9PT0gJ21hcHBpbmcnIHx8IHByb3BJc0ZsYXQgPT09IHRydWUgfHwgcHJvcElzRmxhdCA9PT0gZmFsc2UgfHwgcHJvcElzRmxhdCA9PSBudWxsID8gJ2RvbnRjYXJlJyA6IHByb3BJc0ZsYXQ7XG4gIHZhciBieXBhc3NLZXkgPSBwcm9wSXNCeXBhc3MgPyAndCcgOiAnZic7XG4gIHZhciB2YWx1ZUtleSA9ICcnICsgdmFsdWU7XG4gIHZhciBhcmdIYXNoID0gaGFzaFN0cmluZ3MobmFtZSwgdmFsdWVLZXksIGJ5cGFzc0tleSwgZmxhdEtleSk7XG4gIHZhciBwcm9wQ2FjaGUgPSBzZWxmLnByb3BDYWNoZSA9IHNlbGYucHJvcENhY2hlIHx8IFtdO1xuICB2YXIgcmV0O1xuICBpZiAoIShyZXQgPSBwcm9wQ2FjaGVbYXJnSGFzaF0pKSB7XG4gICAgcmV0ID0gcHJvcENhY2hlW2FyZ0hhc2hdID0gc2VsZi5wYXJzZUltcGxXYXJuKG5hbWUsIHZhbHVlLCBwcm9wSXNCeXBhc3MsIHByb3BJc0ZsYXQpO1xuICB9XG5cbiAgLy8gLSBieXBhc3NlcyBjYW4ndCBiZSBzaGFyZWQgYi9jIHRoZSB2YWx1ZSBjYW4gYmUgY2hhbmdlZCBieSBhbmltYXRpb25zIG9yIG90aGVyd2lzZSBvdmVycmlkZGVuXG4gIC8vIC0gbWFwcGluZ3MgY2FuJ3QgYmUgc2hhcmVkIGIvYyBtYXBwaW5ncyBhcmUgcGVyLWVsZW1lbnRcbiAgaWYgKHByb3BJc0J5cGFzcyB8fCBwcm9wSXNGbGF0ID09PSAnbWFwcGluZycpIHtcbiAgICAvLyBuZWVkIGEgY29weSBzaW5jZSBwcm9wcyBhcmUgbXV0YXRlZCBsYXRlciBpbiB0aGVpciBsaWZlY3ljbGVzXG4gICAgcmV0ID0gY29weShyZXQpO1xuICAgIGlmIChyZXQpIHtcbiAgICAgIHJldC52YWx1ZSA9IGNvcHkocmV0LnZhbHVlKTsgLy8gYmVjYXVzZSBpdCBjb3VsZCBiZSBhbiBhcnJheSwgZS5nLiBjb2xvdXJcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcbnN0eWZuJDEucGFyc2VJbXBsV2FybiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgcHJvcElzQnlwYXNzLCBwcm9wSXNGbGF0KSB7XG4gIHZhciBwcm9wID0gdGhpcy5wYXJzZUltcGwobmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCk7XG4gIGlmICghcHJvcCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgd2FybihcIlRoZSBzdHlsZSBwcm9wZXJ0eSBgXCIuY29uY2F0KG5hbWUsIFwiOiBcIikuY29uY2F0KHZhbHVlLCBcImAgaXMgaW52YWxpZFwiKSk7XG4gIH1cbiAgaWYgKHByb3AgJiYgKHByb3AubmFtZSA9PT0gJ3dpZHRoJyB8fCBwcm9wLm5hbWUgPT09ICdoZWlnaHQnKSAmJiB2YWx1ZSA9PT0gJ2xhYmVsJykge1xuICAgIHdhcm4oJ1RoZSBzdHlsZSB2YWx1ZSBvZiBgbGFiZWxgIGlzIGRlcHJlY2F0ZWQgZm9yIGAnICsgcHJvcC5uYW1lICsgJ2AnKTtcbiAgfVxuICByZXR1cm4gcHJvcDtcbn07XG5cbi8vIHBhcnNlIGEgcHJvcGVydHk7IHJldHVybiBudWxsIG9uIGludmFsaWQ7IHJldHVybiBwYXJzZWQgcHJvcGVydHkgb3RoZXJ3aXNlXG4vLyBmaWVsZHMgOlxuLy8gLSBuYW1lIDogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5XG4vLyAtIHZhbHVlIDogdGhlIHBhcnNlZCwgbmF0aXZlLXR5cGVkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eVxuLy8gLSBzdHJWYWx1ZSA6IGEgc3RyaW5nIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvcGVydHkgdmFsdWUgaW4gdmFsaWQgY3NzXG4vLyAtIGJ5cGFzcyA6IHRydWUgaWZmIHRoZSBwcm9wZXJ0eSBpcyBhIGJ5cGFzcyBwcm9wZXJ0eVxuc3R5Zm4kMS5wYXJzZUltcGwgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIG5hbWUgPSBjYW1lbDJkYXNoKG5hbWUpOyAvLyBtYWtlIHN1cmUgdGhlIHByb3BlcnR5IG5hbWUgaXMgaW4gZGFzaCBmb3JtIChlLmcuICdwcm9wZXJ0eS1uYW1lJyBub3QgJ3Byb3BlcnR5TmFtZScpXG5cbiAgdmFyIHByb3BlcnR5ID0gc2VsZi5wcm9wZXJ0aWVzW25hbWVdO1xuICB2YXIgcGFzc2VkVmFsdWUgPSB2YWx1ZTtcbiAgdmFyIHR5cGVzID0gc2VsZi50eXBlcztcbiAgaWYgKCFwcm9wZXJ0eSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIHJldHVybiBudWxsIG9uIHByb3BlcnR5IG9mIHVua25vd24gbmFtZVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIGNhbid0IGFzc2lnbiB1bmRlZmluZWRcblxuICAvLyB0aGUgcHJvcGVydHkgbWF5IGJlIGFuIGFsaWFzXG4gIGlmIChwcm9wZXJ0eS5hbGlhcykge1xuICAgIHByb3BlcnR5ID0gcHJvcGVydHkucG9pbnRzVG87XG4gICAgbmFtZSA9IHByb3BlcnR5Lm5hbWU7XG4gIH1cbiAgdmFyIHZhbHVlSXNTdHJpbmcgPSBzdHJpbmcodmFsdWUpO1xuICBpZiAodmFsdWVJc1N0cmluZykge1xuICAgIC8vIHRyaW0gdGhlIHZhbHVlIHRvIG1ha2UgcGFyc2luZyBlYXNpZXJcbiAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcbiAgfVxuICB2YXIgdHlwZSA9IHByb3BlcnR5LnR5cGU7XG4gIGlmICghdHlwZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIG5vIHR5cGUsIG5vIGx1Y2tcblxuICAvLyBjaGVjayBpZiBieXBhc3MgaXMgbnVsbCBvciBlbXB0eSBzdHJpbmcgKGkuZS4gaW5kaWNhdGlvbiB0byBkZWxldGUgYnlwYXNzIHByb3BlcnR5KVxuICBpZiAocHJvcElzQnlwYXNzICYmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBieXBhc3M6IHRydWUsXG4gICAgICBkZWxldGVCeXBhc3M6IHRydWVcbiAgICB9O1xuICB9XG5cbiAgLy8gY2hlY2sgaWYgdmFsdWUgaXMgYSBmdW5jdGlvbiB1c2VkIGFzIGEgbWFwcGVyXG4gIGlmIChmbiQ2KHZhbHVlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgc3RyVmFsdWU6ICdmbicsXG4gICAgICBtYXBwZWQ6IHR5cGVzLmZuLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuICB9XG5cbiAgLy8gY2hlY2sgaWYgdmFsdWUgaXMgbWFwcGVkXG4gIHZhciBkYXRhLCBtYXBEYXRhO1xuICBpZiAoIXZhbHVlSXNTdHJpbmcgfHwgcHJvcElzRmxhdCB8fCB2YWx1ZS5sZW5ndGggPCA3IHx8IHZhbHVlWzFdICE9PSAnYScpIDsgZWxzZSBpZiAodmFsdWUubGVuZ3RoID49IDcgJiYgdmFsdWVbMF0gPT09ICdkJyAmJiAoZGF0YSA9IG5ldyBSZWdFeHAodHlwZXMuZGF0YS5yZWdleCkuZXhlYyh2YWx1ZSkpKSB7XG4gICAgaWYgKHByb3BJc0J5cGFzcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gbWFwcGVycyBub3QgYWxsb3dlZCBpbiBieXBhc3NcblxuICAgIHZhciBtYXBwZWQgPSB0eXBlcy5kYXRhO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgIG1hcHBlZDogbWFwcGVkLFxuICAgICAgZmllbGQ6IGRhdGFbMV0sXG4gICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgIH07XG4gIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID49IDEwICYmIHZhbHVlWzBdID09PSAnbScgJiYgKG1hcERhdGEgPSBuZXcgUmVnRXhwKHR5cGVzLm1hcERhdGEucmVnZXgpLmV4ZWModmFsdWUpKSkge1xuICAgIGlmIChwcm9wSXNCeXBhc3MpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIG1hcHBlcnMgbm90IGFsbG93ZWQgaW4gYnlwYXNzXG4gICAgaWYgKHR5cGUubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIGltcG9zc2libGUgdG8gbWFwIHRvIG51bVxuXG4gICAgdmFyIF9tYXBwZWQgPSB0eXBlcy5tYXBEYXRhO1xuXG4gICAgLy8gd2UgY2FuIG1hcCBvbmx5IGlmIHRoZSB0eXBlIGlzIGEgY29sb3VyIG9yIGEgbnVtYmVyXG4gICAgaWYgKCEodHlwZS5jb2xvciB8fCB0eXBlLm51bWJlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHZhbHVlTWluID0gdGhpcy5wYXJzZShuYW1lLCBtYXBEYXRhWzRdKTsgLy8gcGFyc2UgdG8gdmFsaWRhdGVcbiAgICBpZiAoIXZhbHVlTWluIHx8IHZhbHVlTWluLm1hcHBlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gY2FuJ3QgYmUgaW52YWxpZCBvciBtYXBwZWRcblxuICAgIHZhciB2YWx1ZU1heCA9IHRoaXMucGFyc2UobmFtZSwgbWFwRGF0YVs1XSk7IC8vIHBhcnNlIHRvIHZhbGlkYXRlXG4gICAgaWYgKCF2YWx1ZU1heCB8fCB2YWx1ZU1heC5tYXBwZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIGNhbid0IGJlIGludmFsaWQgb3IgbWFwcGVkXG5cbiAgICAvLyBjaGVjayBpZiB2YWx1ZU1pbiBhbmQgdmFsdWVNYXggYXJlIHRoZSBzYW1lXG4gICAgaWYgKHZhbHVlTWluLnBmVmFsdWUgPT09IHZhbHVlTWF4LnBmVmFsdWUgfHwgdmFsdWVNaW4uc3RyVmFsdWUgPT09IHZhbHVlTWF4LnN0clZhbHVlKSB7XG4gICAgICB3YXJuKCdgJyArIG5hbWUgKyAnOiAnICsgdmFsdWUgKyAnYCBpcyBub3QgYSB2YWxpZCBtYXBwZXIgYmVjYXVzZSB0aGUgb3V0cHV0IHJhbmdlIGlzIHplcm87IGNvbnZlcnRpbmcgdG8gYCcgKyBuYW1lICsgJzogJyArIHZhbHVlTWluLnN0clZhbHVlICsgJ2AnKTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlKG5hbWUsIHZhbHVlTWluLnN0clZhbHVlKTsgLy8gY2FuJ3QgbWFrZSBtdWNoIG9mIGEgbWFwcGVyIHdpdGhvdXQgYSByYW5nZVxuICAgIH0gZWxzZSBpZiAodHlwZS5jb2xvcikge1xuICAgICAgdmFyIGMxID0gdmFsdWVNaW4udmFsdWU7XG4gICAgICB2YXIgYzIgPSB2YWx1ZU1heC52YWx1ZTtcbiAgICAgIHZhciBzYW1lID0gYzFbMF0gPT09IGMyWzBdIC8vIHJlZFxuICAgICAgJiYgYzFbMV0gPT09IGMyWzFdIC8vIGdyZWVuXG4gICAgICAmJiBjMVsyXSA9PT0gYzJbMl0gLy8gYmx1ZVxuICAgICAgJiYgKFxuICAgICAgLy8gb3B0aW9uYWwgYWxwaGFcbiAgICAgIGMxWzNdID09PSBjMlszXSAvLyBzYW1lIGFscGhhIG91dHJpZ2h0XG4gICAgICB8fCAoYzFbM10gPT0gbnVsbCB8fCBjMVszXSA9PT0gMSAvLyBmdWxsIG9wYWNpdHkgZm9yIGNvbG91ciAxP1xuICAgICAgKSAmJiAoYzJbM10gPT0gbnVsbCB8fCBjMlszXSA9PT0gMSkgLy8gZnVsbCBvcGFjaXR5IGZvciBjb2xvdXIgMj9cbiAgICAgICk7XG5cbiAgICAgIGlmIChzYW1lKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gLy8gY2FuJ3QgbWFrZSBhIG1hcHBlciB3aXRob3V0IGEgcmFuZ2VcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiBtYXBEYXRhLFxuICAgICAgc3RyVmFsdWU6ICcnICsgdmFsdWUsXG4gICAgICBtYXBwZWQ6IF9tYXBwZWQsXG4gICAgICBmaWVsZDogbWFwRGF0YVsxXSxcbiAgICAgIGZpZWxkTWluOiBwYXJzZUZsb2F0KG1hcERhdGFbMl0pLFxuICAgICAgLy8gbWluICYgbWF4IGFyZSBudW1lcmljXG4gICAgICBmaWVsZE1heDogcGFyc2VGbG9hdChtYXBEYXRhWzNdKSxcbiAgICAgIHZhbHVlTWluOiB2YWx1ZU1pbi52YWx1ZSxcbiAgICAgIHZhbHVlTWF4OiB2YWx1ZU1heC52YWx1ZSxcbiAgICAgIGJ5cGFzczogcHJvcElzQnlwYXNzXG4gICAgfTtcbiAgfVxuICBpZiAodHlwZS5tdWx0aXBsZSAmJiBwcm9wSXNGbGF0ICE9PSAnbXVsdGlwbGUnKSB7XG4gICAgdmFyIHZhbHM7XG4gICAgaWYgKHZhbHVlSXNTdHJpbmcpIHtcbiAgICAgIHZhbHMgPSB2YWx1ZS5zcGxpdCgvXFxzKy8pO1xuICAgIH0gZWxzZSBpZiAoYXJyYXkodmFsdWUpKSB7XG4gICAgICB2YWxzID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHMgPSBbdmFsdWVdO1xuICAgIH1cbiAgICBpZiAodHlwZS5ldmVuTXVsdGlwbGUgJiYgdmFscy5sZW5ndGggJSAyICE9PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHZhbEFyciA9IFtdO1xuICAgIHZhciB1bml0c0FyciA9IFtdO1xuICAgIHZhciBwZlZhbEFyciA9IFtdO1xuICAgIHZhciBzdHJWYWwgPSAnJztcbiAgICB2YXIgaGFzRW51bSA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHAgPSBzZWxmLnBhcnNlKG5hbWUsIHZhbHNbaV0sIHByb3BJc0J5cGFzcywgJ211bHRpcGxlJyk7XG4gICAgICBoYXNFbnVtID0gaGFzRW51bSB8fCBzdHJpbmcocC52YWx1ZSk7XG4gICAgICB2YWxBcnIucHVzaChwLnZhbHVlKTtcbiAgICAgIHBmVmFsQXJyLnB1c2gocC5wZlZhbHVlICE9IG51bGwgPyBwLnBmVmFsdWUgOiBwLnZhbHVlKTtcbiAgICAgIHVuaXRzQXJyLnB1c2gocC51bml0cyk7XG4gICAgICBzdHJWYWwgKz0gKGkgPiAwID8gJyAnIDogJycpICsgcC5zdHJWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGUudmFsaWRhdGUgJiYgIXR5cGUudmFsaWRhdGUodmFsQXJyLCB1bml0c0FycikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodHlwZS5zaW5nbGVFbnVtICYmIGhhc0VudW0pIHtcbiAgICAgIGlmICh2YWxBcnIubGVuZ3RoID09PSAxICYmIHN0cmluZyh2YWxBcnJbMF0pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICB2YWx1ZTogdmFsQXJyWzBdLFxuICAgICAgICAgIHN0clZhbHVlOiB2YWxBcnJbMF0sXG4gICAgICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiB2YWxBcnIsXG4gICAgICBwZlZhbHVlOiBwZlZhbEFycixcbiAgICAgIHN0clZhbHVlOiBzdHJWYWwsXG4gICAgICBieXBhc3M6IHByb3BJc0J5cGFzcyxcbiAgICAgIHVuaXRzOiB1bml0c0FyclxuICAgIH07XG4gIH1cblxuICAvLyBzZXZlcmFsIHR5cGVzIGFsc28gYWxsb3cgZW51bXNcbiAgdmFyIGNoZWNrRW51bXMgPSBmdW5jdGlvbiBjaGVja0VudW1zKCkge1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCB0eXBlLmVudW1zLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIGVuID0gdHlwZS5lbnVtc1tfaV07XG4gICAgICBpZiAoZW4gPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgc3RyVmFsdWU6ICcnICsgdmFsdWUsXG4gICAgICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgLy8gY2hlY2sgdGhlIHR5cGUgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgb2JqZWN0XG4gIGlmICh0eXBlLm51bWJlcikge1xuICAgIHZhciB1bml0cztcbiAgICB2YXIgaW1wbGljaXRVbml0cyA9ICdweCc7IC8vIG5vdCBzZXQgPT4gcHhcblxuICAgIGlmICh0eXBlLnVuaXRzKSB7XG4gICAgICAvLyB1c2Ugc3BlY2lmaWVkIHVuaXRzIGlmIHNldFxuICAgICAgdW5pdHMgPSB0eXBlLnVuaXRzO1xuICAgIH1cbiAgICBpZiAodHlwZS5pbXBsaWNpdFVuaXRzKSB7XG4gICAgICBpbXBsaWNpdFVuaXRzID0gdHlwZS5pbXBsaWNpdFVuaXRzO1xuICAgIH1cbiAgICBpZiAoIXR5cGUudW5pdGxlc3MpIHtcbiAgICAgIGlmICh2YWx1ZUlzU3RyaW5nKSB7XG4gICAgICAgIHZhciB1bml0c1JlZ2V4ID0gJ3B4fGVtJyArICh0eXBlLmFsbG93UGVyY2VudCA/ICd8XFxcXCUnIDogJycpO1xuICAgICAgICBpZiAodW5pdHMpIHtcbiAgICAgICAgICB1bml0c1JlZ2V4ID0gdW5pdHM7XG4gICAgICAgIH0gLy8gb25seSBhbGxvdyBleHBsaWNpdCB1bml0cyBpZiBzbyBzZXRcbiAgICAgICAgdmFyIG1hdGNoID0gdmFsdWUubWF0Y2goJ14oJyArIG51bWJlciArICcpKCcgKyB1bml0c1JlZ2V4ICsgJyk/JyArICckJyk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHZhbHVlID0gbWF0Y2hbMV07XG4gICAgICAgICAgdW5pdHMgPSBtYXRjaFsyXSB8fCBpbXBsaWNpdFVuaXRzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCF1bml0cyB8fCB0eXBlLmltcGxpY2l0VW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBpbXBsaWNpdFVuaXRzOyAvLyBpbXBsaWNpdGx5IHB4IGlmIHVuc3BlY2lmaWVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcblxuICAgIC8vIGlmIG5vdCBhIG51bWJlciBhbmQgZW51bXMgbm90IGFsbG93ZWQsIHRoZW4gdGhlIHZhbHVlIGlzIGludmFsaWRcbiAgICBpZiAoaXNOYU4odmFsdWUpICYmIHR5cGUuZW51bXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhpcyBudW1iZXIgdHlwZSBhbHNvIGFjY2VwdHMgc3BlY2lhbCBrZXl3b3JkcyBpbiBwbGFjZSBvZiBudW1iZXJzXG4gICAgLy8gKGkuZS4gYGxlZnRgLCBgYXV0b2AsIGV0YylcbiAgICBpZiAoaXNOYU4odmFsdWUpICYmIHR5cGUuZW51bXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWUgPSBwYXNzZWRWYWx1ZTtcbiAgICAgIHJldHVybiBjaGVja0VudW1zKCk7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdmFsdWUgbXVzdCBiZSBhbiBpbnRlZ2VyXG4gICAgaWYgKHR5cGUuaW50ZWdlciAmJiAhaW50ZWdlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIHZhbHVlIGlzIHdpdGhpbiByYW5nZVxuICAgIGlmICh0eXBlLm1pbiAhPT0gdW5kZWZpbmVkICYmICh2YWx1ZSA8IHR5cGUubWluIHx8IHR5cGUuc3RyaWN0TWluICYmIHZhbHVlID09PSB0eXBlLm1pbikgfHwgdHlwZS5tYXggIT09IHVuZGVmaW5lZCAmJiAodmFsdWUgPiB0eXBlLm1heCB8fCB0eXBlLnN0cmljdE1heCAmJiB2YWx1ZSA9PT0gdHlwZS5tYXgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHJldCA9IHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSArICh1bml0cyA/IHVuaXRzIDogJycpLFxuICAgICAgdW5pdHM6IHVuaXRzLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuXG4gICAgLy8gbm9ybWFsaXNlIHZhbHVlIGluIHBpeGVsc1xuICAgIGlmICh0eXBlLnVuaXRsZXNzIHx8IHVuaXRzICE9PSAncHgnICYmIHVuaXRzICE9PSAnZW0nKSB7XG4gICAgICByZXQucGZWYWx1ZSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXQucGZWYWx1ZSA9IHVuaXRzID09PSAncHgnIHx8ICF1bml0cyA/IHZhbHVlIDogdGhpcy5nZXRFbVNpemVJblBpeGVscygpICogdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gbm9ybWFsaXNlIHZhbHVlIGluIG1zXG4gICAgaWYgKHVuaXRzID09PSAnbXMnIHx8IHVuaXRzID09PSAncycpIHtcbiAgICAgIHJldC5wZlZhbHVlID0gdW5pdHMgPT09ICdtcycgPyB2YWx1ZSA6IDEwMDAgKiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBub3JtYWxpc2UgdmFsdWUgaW4gcmFkXG4gICAgaWYgKHVuaXRzID09PSAnZGVnJyB8fCB1bml0cyA9PT0gJ3JhZCcpIHtcbiAgICAgIHJldC5wZlZhbHVlID0gdW5pdHMgPT09ICdyYWQnID8gdmFsdWUgOiBkZWcycmFkKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBub3JtYWxpemUgdmFsdWUgaW4gJVxuICAgIGlmICh1bml0cyA9PT0gJyUnKSB7XG4gICAgICByZXQucGZWYWx1ZSA9IHZhbHVlIC8gMTAwO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9IGVsc2UgaWYgKHR5cGUucHJvcExpc3QpIHtcbiAgICB2YXIgcHJvcHMgPSBbXTtcbiAgICB2YXIgcHJvcHNTdHIgPSAnJyArIHZhbHVlO1xuICAgIGlmIChwcm9wc1N0ciA9PT0gJ25vbmUnKSA7IGVsc2Uge1xuICAgICAgLy8gZ28gb3ZlciBlYWNoIHByb3BcblxuICAgICAgdmFyIHByb3BzU3BsaXQgPSBwcm9wc1N0ci5zcGxpdCgvXFxzKixcXHMqfFxccysvKTtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHByb3BzU3BsaXQubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICB2YXIgcHJvcE5hbWUgPSBwcm9wc1NwbGl0W19pMl0udHJpbSgpO1xuICAgICAgICBpZiAoc2VsZi5wcm9wZXJ0aWVzW3Byb3BOYW1lXSkge1xuICAgICAgICAgIHByb3BzLnB1c2gocHJvcE5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhcm4oJ2AnICsgcHJvcE5hbWUgKyAnYCBpcyBub3QgYSB2YWxpZCBwcm9wZXJ0eSBuYW1lJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHByb3BzLFxuICAgICAgc3RyVmFsdWU6IHByb3BzLmxlbmd0aCA9PT0gMCA/ICdub25lJyA6IHByb3BzLmpvaW4oJyAnKSxcbiAgICAgIGJ5cGFzczogcHJvcElzQnlwYXNzXG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlLmNvbG9yKSB7XG4gICAgdmFyIHR1cGxlID0gY29sb3IydHVwbGUodmFsdWUpO1xuICAgIGlmICghdHVwbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiB0dXBsZSxcbiAgICAgIHBmVmFsdWU6IHR1cGxlLFxuICAgICAgc3RyVmFsdWU6ICdyZ2IoJyArIHR1cGxlWzBdICsgJywnICsgdHVwbGVbMV0gKyAnLCcgKyB0dXBsZVsyXSArICcpJyxcbiAgICAgIC8vIG4uYi4gbm8gc3BhY2VzIGIvYyBvZiBtdWx0aXBsZSBzdXBwb3J0XG4gICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZS5yZWdleCB8fCB0eXBlLnJlZ2V4ZXMpIHtcbiAgICAvLyBmaXJzdCBjaGVjayBlbnVtc1xuICAgIGlmICh0eXBlLmVudW1zKSB7XG4gICAgICB2YXIgZW51bVByb3AgPSBjaGVja0VudW1zKCk7XG4gICAgICBpZiAoZW51bVByb3ApIHtcbiAgICAgICAgcmV0dXJuIGVudW1Qcm9wO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgcmVnZXhlcyA9IHR5cGUucmVnZXhlcyA/IHR5cGUucmVnZXhlcyA6IFt0eXBlLnJlZ2V4XTtcbiAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCByZWdleGVzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAocmVnZXhlc1tfaTNdKTsgLy8gbWFrZSBhIHJlZ2V4IGZyb20gdGhlIHR5cGUgc3RyaW5nXG4gICAgICB2YXIgbSA9IHJlZ2V4LmV4ZWModmFsdWUpO1xuICAgICAgaWYgKG0pIHtcbiAgICAgICAgLy8gcmVnZXggbWF0Y2hlc1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgdmFsdWU6IHR5cGUuc2luZ2xlUmVnZXhNYXRjaFZhbHVlID8gbVsxXSA6IG0sXG4gICAgICAgICAgc3RyVmFsdWU6ICcnICsgdmFsdWUsXG4gICAgICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7IC8vIGRpZG4ndCBtYXRjaCBhbnlcbiAgfSBlbHNlIGlmICh0eXBlLnN0cmluZykge1xuICAgIC8vIGp1c3QgcmV0dXJuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgIHN0clZhbHVlOiAnJyArIHZhbHVlLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGUuZW51bXMpIHtcbiAgICAvLyBjaGVjayBlbnVtcyBsYXN0IGJlY2F1c2UgaXQncyBhIGNvbWJvIHR5cGUgaW4gb3RoZXJzXG4gICAgcmV0dXJuIGNoZWNrRW51bXMoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDsgLy8gbm90IGEgdHlwZSB3ZSBjYW4gaGFuZGxlXG4gIH1cbn07XG5cbnZhciBTdHlsZSA9IGZ1bmN0aW9uIFN0eWxlKGN5KSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTdHlsZSkpIHtcbiAgICByZXR1cm4gbmV3IFN0eWxlKGN5KTtcbiAgfVxuICBpZiAoIWNvcmUoY3kpKSB7XG4gICAgZXJyb3IoJ0Egc3R5bGUgbXVzdCBoYXZlIGEgY29yZSByZWZlcmVuY2UnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5fcHJpdmF0ZSA9IHtcbiAgICBjeTogY3ksXG4gICAgY29yZVN0eWxlOiB7fVxuICB9O1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucmVzZXRUb0RlZmF1bHQoKTtcbn07XG52YXIgc3R5Zm4gPSBTdHlsZS5wcm90b3R5cGU7XG5zdHlmbi5pbnN0YW5jZVN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdzdHlsZSc7XG59O1xuXG4vLyByZW1vdmUgYWxsIGNvbnRleHRzXG5zdHlmbi5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgdmFyIGN5ID0gX3AuY3k7XG4gIHZhciBlbGVzID0gY3kuZWxlbWVudHMoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpc1tpXSA9IHVuZGVmaW5lZDtcbiAgfVxuICB0aGlzLmxlbmd0aCA9IDA7XG4gIF9wLmNvbnRleHRTdHlsZXMgPSB7fTtcbiAgX3AucHJvcERpZmZzID0ge307XG4gIHRoaXMuY2xlYW5FbGVtZW50cyhlbGVzLCB0cnVlKTtcbiAgZWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICB2YXIgZWxlX3AgPSBlbGVbMF0uX3ByaXZhdGU7XG4gICAgZWxlX3Auc3R5bGVEaXJ0eSA9IHRydWU7XG4gICAgZWxlX3AuYXBwbGllZEluaXRTdHlsZSA9IGZhbHNlO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG5zdHlmbi5yZXNldFRvRGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jbGVhcigpO1xuICB0aGlzLmFkZERlZmF1bHRTdHlsZXNoZWV0KCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gYnVpbGRzIGEgc3R5bGUgb2JqZWN0IGZvciB0aGUgJ2NvcmUnIHNlbGVjdG9yXG5zdHlmbi5jb3JlID0gZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gIHJldHVybiB0aGlzLl9wcml2YXRlLmNvcmVTdHlsZVtwcm9wTmFtZV0gfHwgdGhpcy5nZXREZWZhdWx0UHJvcGVydHkocHJvcE5hbWUpO1xufTtcblxuLy8gY3JlYXRlIGEgbmV3IGNvbnRleHQgZnJvbSB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yIHN0cmluZyBhbmQgc3dpdGNoIHRvIHRoYXQgY29udGV4dFxuc3R5Zm4uc2VsZWN0b3IgPSBmdW5jdGlvbiAoc2VsZWN0b3JTdHIpIHtcbiAgLy8gJ2NvcmUnIGlzIGEgc3BlY2lhbCBjYXNlIGFuZCBkb2VzIG5vdCBuZWVkIGEgc2VsZWN0b3JcbiAgdmFyIHNlbGVjdG9yID0gc2VsZWN0b3JTdHIgPT09ICdjb3JlJyA/IG51bGwgOiBuZXcgU2VsZWN0b3Ioc2VsZWN0b3JTdHIpO1xuICB2YXIgaSA9IHRoaXMubGVuZ3RoKys7IC8vIG5ldyBjb250ZXh0IG1lYW5zIG5ldyBpbmRleFxuICB0aGlzW2ldID0ge1xuICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICBwcm9wZXJ0aWVzOiBbXSxcbiAgICBtYXBwZWRQcm9wZXJ0aWVzOiBbXSxcbiAgICBpbmRleDogaVxuICB9O1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbi8vIGFkZCBvbmUgb3IgbWFueSBjc3MgcnVsZXMgdG8gdGhlIGN1cnJlbnQgY29udGV4dFxuc3R5Zm4uY3NzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICB2YXIgbWFwID0gYXJnc1swXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBzZWxmLnByb3BlcnRpZXNbaV07XG4gICAgICB2YXIgbWFwVmFsID0gbWFwW3Byb3AubmFtZV07XG4gICAgICBpZiAobWFwVmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWFwVmFsID0gbWFwW2Rhc2gyY2FtZWwocHJvcC5uYW1lKV07XG4gICAgICB9XG4gICAgICBpZiAobWFwVmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jc3NSdWxlKHByb3AubmFtZSwgbWFwVmFsKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICB0aGlzLmNzc1J1bGUoYXJnc1swXSwgYXJnc1sxXSk7XG4gIH1cblxuICAvLyBkbyBub3RoaW5nIGlmIGFyZ3MgYXJlIGludmFsaWRcblxuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbnN0eWZuLnN0eWxlID0gc3R5Zm4uY3NzO1xuXG4vLyBhZGQgYSBzaW5nbGUgY3NzIHJ1bGUgdG8gdGhlIGN1cnJlbnQgY29udGV4dFxuc3R5Zm4uY3NzUnVsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAvLyBuYW1lLXZhbHVlIHBhaXJcbiAgdmFyIHByb3BlcnR5ID0gdGhpcy5wYXJzZShuYW1lLCB2YWx1ZSk7XG5cbiAgLy8gYWRkIHByb3BlcnR5IHRvIGN1cnJlbnQgY29udGV4dCBpZiB2YWxpZFxuICBpZiAocHJvcGVydHkpIHtcbiAgICB2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTtcbiAgICB0aGlzW2ldLnByb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7XG4gICAgdGhpc1tpXS5wcm9wZXJ0aWVzW3Byb3BlcnR5Lm5hbWVdID0gcHJvcGVydHk7IC8vIGFsbG93IGFjY2VzcyBieSBuYW1lIGFzIHdlbGxcblxuICAgIGlmIChwcm9wZXJ0eS5uYW1lLm1hdGNoKC9waWUtKFxcZCspLWJhY2tncm91bmQtc2l6ZS8pICYmIHByb3BlcnR5LnZhbHVlKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmhhc1BpZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChwcm9wZXJ0eS5tYXBwZWQpIHtcbiAgICAgIHRoaXNbaV0ubWFwcGVkUHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICAvLyBhZGQgdG8gY29yZSBzdHlsZSBpZiBuZWNlc3NhcnlcbiAgICB2YXIgY3VycmVudFNlbGVjdG9ySXNDb3JlID0gIXRoaXNbaV0uc2VsZWN0b3I7XG4gICAgaWYgKGN1cnJlbnRTZWxlY3RvcklzQ29yZSkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5jb3JlU3R5bGVbcHJvcGVydHkubmFtZV0gPSBwcm9wZXJ0eTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG5zdHlmbi5hcHBlbmQgPSBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgaWYgKHN0eWxlc2hlZXQoc3R5bGUpKSB7XG4gICAgc3R5bGUuYXBwZW5kVG9TdHlsZSh0aGlzKTtcbiAgfSBlbHNlIGlmIChhcnJheShzdHlsZSkpIHtcbiAgICB0aGlzLmFwcGVuZEZyb21Kc29uKHN0eWxlKTtcbiAgfSBlbHNlIGlmIChzdHJpbmcoc3R5bGUpKSB7XG4gICAgdGhpcy5hcHBlbmRGcm9tU3RyaW5nKHN0eWxlKTtcbiAgfSAvLyB5b3UgcHJvYmFibHkgd291bGRuJ3Qgd2FudCB0byBhcHBlbmQgYSBTdHlsZSwgc2luY2UgeW91J2QgZHVwbGljYXRlIHRoZSBkZWZhdWx0IHBhcnRzXG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzdGF0aWMgZnVuY3Rpb25cblN0eWxlLmZyb21Kc29uID0gZnVuY3Rpb24gKGN5LCBqc29uKSB7XG4gIHZhciBzdHlsZSA9IG5ldyBTdHlsZShjeSk7XG4gIHN0eWxlLmZyb21Kc29uKGpzb24pO1xuICByZXR1cm4gc3R5bGU7XG59O1xuU3R5bGUuZnJvbVN0cmluZyA9IGZ1bmN0aW9uIChjeSwgc3RyaW5nKSB7XG4gIHJldHVybiBuZXcgU3R5bGUoY3kpLmZyb21TdHJpbmcoc3RyaW5nKTtcbn07XG5bc3R5Zm4kOCwgc3R5Zm4kNywgc3R5Zm4kNiwgc3R5Zm4kNSwgc3R5Zm4kNCwgc3R5Zm4kMywgc3R5Zm4kMiwgc3R5Zm4kMV0uZm9yRWFjaChmdW5jdGlvbiAocHJvcHMpIHtcbiAgZXh0ZW5kKHN0eWZuLCBwcm9wcyk7XG59KTtcblN0eWxlLnR5cGVzID0gc3R5Zm4udHlwZXM7XG5TdHlsZS5wcm9wZXJ0aWVzID0gc3R5Zm4ucHJvcGVydGllcztcblN0eWxlLnByb3BlcnR5R3JvdXBzID0gc3R5Zm4ucHJvcGVydHlHcm91cHM7XG5TdHlsZS5wcm9wZXJ0eUdyb3VwTmFtZXMgPSBzdHlmbi5wcm9wZXJ0eUdyb3VwTmFtZXM7XG5TdHlsZS5wcm9wZXJ0eUdyb3VwS2V5cyA9IHN0eWZuLnByb3BlcnR5R3JvdXBLZXlzO1xuXG52YXIgY29yZWZuJDIgPSB7XG4gIHN0eWxlOiBmdW5jdGlvbiBzdHlsZShuZXdTdHlsZSkge1xuICAgIGlmIChuZXdTdHlsZSkge1xuICAgICAgdmFyIHMgPSB0aGlzLnNldFN0eWxlKG5ld1N0eWxlKTtcbiAgICAgIHMudXBkYXRlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnN0eWxlO1xuICB9LFxuICBzZXRTdHlsZTogZnVuY3Rpb24gc2V0U3R5bGUoc3R5bGUpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmIChzdHlsZXNoZWV0KHN0eWxlKSkge1xuICAgICAgX3Auc3R5bGUgPSBzdHlsZS5nZW5lcmF0ZVN0eWxlKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoYXJyYXkoc3R5bGUpKSB7XG4gICAgICBfcC5zdHlsZSA9IFN0eWxlLmZyb21Kc29uKHRoaXMsIHN0eWxlKTtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyhzdHlsZSkpIHtcbiAgICAgIF9wLnN0eWxlID0gU3R5bGUuZnJvbVN0cmluZyh0aGlzLCBzdHlsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9wLnN0eWxlID0gU3R5bGUodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiBfcC5zdHlsZTtcbiAgfSxcbiAgLy8gZS5nLiBjeS5kYXRhKCkgY2hhbmdlZCA9PiByZWNhbGMgZWxlIG1hcHBlcnNcbiAgdXBkYXRlU3R5bGU6IGZ1bmN0aW9uIHVwZGF0ZVN0eWxlKCkge1xuICAgIHRoaXMubXV0YWJsZUVsZW1lbnRzKCkudXBkYXRlU3R5bGUoKTsgLy8ganVzdCBzZW5kIHRvIGFsbCBlbGVzXG4gIH1cbn07XG5cbnZhciBkZWZhdWx0U2VsZWN0aW9uVHlwZSA9ICdzaW5nbGUnO1xudmFyIGNvcmVmbiQxID0ge1xuICBhdXRvbG9jazogZnVuY3Rpb24gYXV0b2xvY2soYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUuYXV0b2xvY2sgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5hdXRvbG9jaztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgYXV0b3VuZ3JhYmlmeTogZnVuY3Rpb24gYXV0b3VuZ3JhYmlmeShib29sKSB7XG4gICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5hdXRvdW5ncmFiaWZ5ID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuYXV0b3VuZ3JhYmlmeTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgYXV0b3Vuc2VsZWN0aWZ5OiBmdW5jdGlvbiBhdXRvdW5zZWxlY3RpZnkoYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUuYXV0b3Vuc2VsZWN0aWZ5ID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuYXV0b3Vuc2VsZWN0aWZ5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICBzZWxlY3Rpb25UeXBlOiBmdW5jdGlvbiBzZWxlY3Rpb25UeXBlKHNlbFR5cGUpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmIChfcC5zZWxlY3Rpb25UeXBlID09IG51bGwpIHtcbiAgICAgIF9wLnNlbGVjdGlvblR5cGUgPSBkZWZhdWx0U2VsZWN0aW9uVHlwZTtcbiAgICB9XG4gICAgaWYgKHNlbFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHNlbFR5cGUgPT09ICdhZGRpdGl2ZScgfHwgc2VsVHlwZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgX3Auc2VsZWN0aW9uVHlwZSA9IHNlbFR5cGU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBfcC5zZWxlY3Rpb25UeXBlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcGFubmluZ0VuYWJsZWQ6IGZ1bmN0aW9uIHBhbm5pbmdFbmFibGVkKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUucGFubmluZ0VuYWJsZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIHVzZXJQYW5uaW5nRW5hYmxlZDogZnVuY3Rpb24gdXNlclBhbm5pbmdFbmFibGVkKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLnVzZXJQYW5uaW5nRW5hYmxlZCA9IGJvb2wgPyB0cnVlIDogZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnVzZXJQYW5uaW5nRW5hYmxlZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgem9vbWluZ0VuYWJsZWQ6IGZ1bmN0aW9uIHpvb21pbmdFbmFibGVkKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLnpvb21pbmdFbmFibGVkID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuem9vbWluZ0VuYWJsZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIHVzZXJab29taW5nRW5hYmxlZDogZnVuY3Rpb24gdXNlclpvb21pbmdFbmFibGVkKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLnVzZXJab29taW5nRW5hYmxlZCA9IGJvb2wgPyB0cnVlIDogZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnVzZXJab29taW5nRW5hYmxlZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgYm94U2VsZWN0aW9uRW5hYmxlZDogZnVuY3Rpb24gYm94U2VsZWN0aW9uRW5hYmxlZChib29sKSB7XG4gICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5ib3hTZWxlY3Rpb25FbmFibGVkID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuYm94U2VsZWN0aW9uRW5hYmxlZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgcGFuOiBmdW5jdGlvbiBwYW4oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIHBhbiA9IHRoaXMuX3ByaXZhdGUucGFuO1xuICAgIHZhciBkaW0sIHZhbCwgZGltcywgeCwgeTtcbiAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIC8vIC5wYW4oKVxuICAgICAgICByZXR1cm4gcGFuO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBpZiAoc3RyaW5nKGFyZ3NbMF0pKSB7XG4gICAgICAgICAgLy8gLnBhbigneCcpXG4gICAgICAgICAgZGltID0gYXJnc1swXTtcbiAgICAgICAgICByZXR1cm4gcGFuW2RpbV07XG4gICAgICAgIH0gZWxzZSBpZiAocGxhaW5PYmplY3QoYXJnc1swXSkpIHtcbiAgICAgICAgICAvLyAucGFuKHsgeDogMCwgeTogMTAwIH0pXG4gICAgICAgICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGltcyA9IGFyZ3NbMF07XG4gICAgICAgICAgeCA9IGRpbXMueDtcbiAgICAgICAgICB5ID0gZGltcy55O1xuICAgICAgICAgIGlmIChudW1iZXIkMSh4KSkge1xuICAgICAgICAgICAgcGFuLnggPSB4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobnVtYmVyJDEoeSkpIHtcbiAgICAgICAgICAgIHBhbi55ID0geTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5lbWl0KCdwYW4gdmlld3BvcnQnKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgLy8gLnBhbigneCcsIDEwMClcbiAgICAgICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZGltID0gYXJnc1swXTtcbiAgICAgICAgdmFsID0gYXJnc1sxXTtcbiAgICAgICAgaWYgKChkaW0gPT09ICd4JyB8fCBkaW0gPT09ICd5JykgJiYgbnVtYmVyJDEodmFsKSkge1xuICAgICAgICAgIHBhbltkaW1dID0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdCgncGFuIHZpZXdwb3J0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gaW52YWxpZFxuICAgIH1cblxuICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIHBhbkJ5OiBmdW5jdGlvbiBwYW5CeShhcmcwLCBhcmcxKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIHBhbiA9IHRoaXMuX3ByaXZhdGUucGFuO1xuICAgIHZhciBkaW0sIHZhbCwgZGltcywgeCwgeTtcbiAgICBpZiAoIXRoaXMuX3ByaXZhdGUucGFubmluZ0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIGlmIChwbGFpbk9iamVjdChhcmcwKSkge1xuICAgICAgICAgIC8vIC5wYW5CeSh7IHg6IDAsIHk6IDEwMCB9KVxuICAgICAgICAgIGRpbXMgPSBhcmdzWzBdO1xuICAgICAgICAgIHggPSBkaW1zLng7XG4gICAgICAgICAgeSA9IGRpbXMueTtcbiAgICAgICAgICBpZiAobnVtYmVyJDEoeCkpIHtcbiAgICAgICAgICAgIHBhbi54ICs9IHg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChudW1iZXIkMSh5KSkge1xuICAgICAgICAgICAgcGFuLnkgKz0geTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5lbWl0KCdwYW4gdmlld3BvcnQnKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgLy8gLnBhbkJ5KCd4JywgMTAwKVxuICAgICAgICBkaW0gPSBhcmcwO1xuICAgICAgICB2YWwgPSBhcmcxO1xuICAgICAgICBpZiAoKGRpbSA9PT0gJ3gnIHx8IGRpbSA9PT0gJ3knKSAmJiBudW1iZXIkMSh2YWwpKSB7XG4gICAgICAgICAgcGFuW2RpbV0gKz0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdCgncGFuIHZpZXdwb3J0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gaW52YWxpZFxuICAgIH1cblxuICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIGZpdDogZnVuY3Rpb24gZml0KGVsZW1lbnRzLCBwYWRkaW5nKSB7XG4gICAgdmFyIHZpZXdwb3J0U3RhdGUgPSB0aGlzLmdldEZpdFZpZXdwb3J0KGVsZW1lbnRzLCBwYWRkaW5nKTtcbiAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICAgIF9wLnpvb20gPSB2aWV3cG9ydFN0YXRlLnpvb207XG4gICAgICBfcC5wYW4gPSB2aWV3cG9ydFN0YXRlLnBhbjtcbiAgICAgIHRoaXMuZW1pdCgncGFuIHpvb20gdmlld3BvcnQnKTtcbiAgICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICBnZXRGaXRWaWV3cG9ydDogZnVuY3Rpb24gZ2V0Rml0Vmlld3BvcnQoZWxlbWVudHMsIHBhZGRpbmcpIHtcbiAgICBpZiAobnVtYmVyJDEoZWxlbWVudHMpICYmIHBhZGRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZWxlbWVudHMgaXMgb3B0aW9uYWxcbiAgICAgIHBhZGRpbmcgPSBlbGVtZW50cztcbiAgICAgIGVsZW1lbnRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3ByaXZhdGUucGFubmluZ0VuYWJsZWQgfHwgIXRoaXMuX3ByaXZhdGUuem9vbWluZ0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGJiO1xuICAgIGlmIChzdHJpbmcoZWxlbWVudHMpKSB7XG4gICAgICB2YXIgc2VsID0gZWxlbWVudHM7XG4gICAgICBlbGVtZW50cyA9IHRoaXMuJChzZWwpO1xuICAgIH0gZWxzZSBpZiAoYm91bmRpbmdCb3goZWxlbWVudHMpKSB7XG4gICAgICAvLyBhc3N1bWUgYmJcbiAgICAgIHZhciBiYmUgPSBlbGVtZW50cztcbiAgICAgIGJiID0ge1xuICAgICAgICB4MTogYmJlLngxLFxuICAgICAgICB5MTogYmJlLnkxLFxuICAgICAgICB4MjogYmJlLngyLFxuICAgICAgICB5MjogYmJlLnkyXG4gICAgICB9O1xuICAgICAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gICAgICBiYi5oID0gYmIueTIgLSBiYi55MTtcbiAgICB9IGVsc2UgaWYgKCFlbGVtZW50T3JDb2xsZWN0aW9uKGVsZW1lbnRzKSkge1xuICAgICAgZWxlbWVudHMgPSB0aGlzLm11dGFibGVFbGVtZW50cygpO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihlbGVtZW50cykgJiYgZWxlbWVudHMuZW1wdHkoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gY2FuJ3QgZml0IHRvIG5vdGhpbmdcblxuICAgIGJiID0gYmIgfHwgZWxlbWVudHMuYm91bmRpbmdCb3goKTtcbiAgICB2YXIgdyA9IHRoaXMud2lkdGgoKTtcbiAgICB2YXIgaCA9IHRoaXMuaGVpZ2h0KCk7XG4gICAgdmFyIHpvb207XG4gICAgcGFkZGluZyA9IG51bWJlciQxKHBhZGRpbmcpID8gcGFkZGluZyA6IDA7XG4gICAgaWYgKCFpc05hTih3KSAmJiAhaXNOYU4oaCkgJiYgdyA+IDAgJiYgaCA+IDAgJiYgIWlzTmFOKGJiLncpICYmICFpc05hTihiYi5oKSAmJiBiYi53ID4gMCAmJiBiYi5oID4gMCkge1xuICAgICAgem9vbSA9IE1hdGgubWluKCh3IC0gMiAqIHBhZGRpbmcpIC8gYmIudywgKGggLSAyICogcGFkZGluZykgLyBiYi5oKTtcblxuICAgICAgLy8gY3JvcCB6b29tXG4gICAgICB6b29tID0gem9vbSA+IHRoaXMuX3ByaXZhdGUubWF4Wm9vbSA/IHRoaXMuX3ByaXZhdGUubWF4Wm9vbSA6IHpvb207XG4gICAgICB6b29tID0gem9vbSA8IHRoaXMuX3ByaXZhdGUubWluWm9vbSA/IHRoaXMuX3ByaXZhdGUubWluWm9vbSA6IHpvb207XG4gICAgICB2YXIgcGFuID0ge1xuICAgICAgICAvLyBub3cgcGFuIHRvIG1pZGRsZVxuICAgICAgICB4OiAodyAtIHpvb20gKiAoYmIueDEgKyBiYi54MikpIC8gMixcbiAgICAgICAgeTogKGggLSB6b29tICogKGJiLnkxICsgYmIueTIpKSAvIDJcbiAgICAgIH07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB6b29tOiB6b29tLFxuICAgICAgICBwYW46IHBhblxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9LFxuICB6b29tUmFuZ2U6IGZ1bmN0aW9uIHpvb21SYW5nZShtaW4sIG1heCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgaWYgKG1heCA9PSBudWxsKSB7XG4gICAgICB2YXIgb3B0cyA9IG1pbjtcbiAgICAgIG1pbiA9IG9wdHMubWluO1xuICAgICAgbWF4ID0gb3B0cy5tYXg7XG4gICAgfVxuICAgIGlmIChudW1iZXIkMShtaW4pICYmIG51bWJlciQxKG1heCkgJiYgbWluIDw9IG1heCkge1xuICAgICAgX3AubWluWm9vbSA9IG1pbjtcbiAgICAgIF9wLm1heFpvb20gPSBtYXg7XG4gICAgfSBlbHNlIGlmIChudW1iZXIkMShtaW4pICYmIG1heCA9PT0gdW5kZWZpbmVkICYmIG1pbiA8PSBfcC5tYXhab29tKSB7XG4gICAgICBfcC5taW5ab29tID0gbWluO1xuICAgIH0gZWxzZSBpZiAobnVtYmVyJDEobWF4KSAmJiBtaW4gPT09IHVuZGVmaW5lZCAmJiBtYXggPj0gX3AubWluWm9vbSkge1xuICAgICAgX3AubWF4Wm9vbSA9IG1heDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIG1pblpvb206IGZ1bmN0aW9uIG1pblpvb20oem9vbSkge1xuICAgIGlmICh6b29tID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLm1pblpvb207XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnpvb21SYW5nZSh7XG4gICAgICAgIG1pbjogem9vbVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICBtYXhab29tOiBmdW5jdGlvbiBtYXhab29tKHpvb20pIHtcbiAgICBpZiAoem9vbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5tYXhab29tO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy56b29tUmFuZ2Uoe1xuICAgICAgICBtYXg6IHpvb21cbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgZ2V0Wm9vbWVkVmlld3BvcnQ6IGZ1bmN0aW9uIGdldFpvb21lZFZpZXdwb3J0KHBhcmFtcykge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgdmFyIGN1cnJlbnRQYW4gPSBfcC5wYW47XG4gICAgdmFyIGN1cnJlbnRab29tID0gX3Auem9vbTtcbiAgICB2YXIgcG9zOyAvLyBpbiByZW5kZXJlZCBweFxuICAgIHZhciB6b29tO1xuICAgIHZhciBiYWlsID0gZmFsc2U7XG4gICAgaWYgKCFfcC56b29taW5nRW5hYmxlZCkge1xuICAgICAgLy8gem9vbWluZyBkaXNhYmxlZFxuICAgICAgYmFpbCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChudW1iZXIkMShwYXJhbXMpKSB7XG4gICAgICAvLyB0aGVuIHNldCB0aGUgem9vbVxuICAgICAgem9vbSA9IHBhcmFtcztcbiAgICB9IGVsc2UgaWYgKHBsYWluT2JqZWN0KHBhcmFtcykpIHtcbiAgICAgIC8vIHRoZW4gem9vbSBhYm91dCBhIHBvaW50XG4gICAgICB6b29tID0gcGFyYW1zLmxldmVsO1xuICAgICAgaWYgKHBhcmFtcy5wb3NpdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIHBvcyA9IG1vZGVsVG9SZW5kZXJlZFBvc2l0aW9uKHBhcmFtcy5wb3NpdGlvbiwgY3VycmVudFpvb20sIGN1cnJlbnRQYW4pO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMucmVuZGVyZWRQb3NpdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIHBvcyA9IHBhcmFtcy5yZW5kZXJlZFBvc2l0aW9uO1xuICAgICAgfVxuICAgICAgaWYgKHBvcyAhPSBudWxsICYmICFfcC5wYW5uaW5nRW5hYmxlZCkge1xuICAgICAgICAvLyBwYW5uaW5nIGRpc2FibGVkXG4gICAgICAgIGJhaWwgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNyb3Agem9vbVxuICAgIHpvb20gPSB6b29tID4gX3AubWF4Wm9vbSA/IF9wLm1heFpvb20gOiB6b29tO1xuICAgIHpvb20gPSB6b29tIDwgX3AubWluWm9vbSA/IF9wLm1pblpvb20gOiB6b29tO1xuXG4gICAgLy8gY2FuJ3Qgem9vbSB3aXRoIGludmFsaWQgcGFyYW1zXG4gICAgaWYgKGJhaWwgfHwgIW51bWJlciQxKHpvb20pIHx8IHpvb20gPT09IGN1cnJlbnRab29tIHx8IHBvcyAhPSBudWxsICYmICghbnVtYmVyJDEocG9zLngpIHx8ICFudW1iZXIkMShwb3MueSkpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHBvcyAhPSBudWxsKSB7XG4gICAgICAvLyBzZXQgem9vbSBhYm91dCBwb3NpdGlvblxuICAgICAgdmFyIHBhbjEgPSBjdXJyZW50UGFuO1xuICAgICAgdmFyIHpvb20xID0gY3VycmVudFpvb207XG4gICAgICB2YXIgem9vbTIgPSB6b29tO1xuICAgICAgdmFyIHBhbjIgPSB7XG4gICAgICAgIHg6IC16b29tMiAvIHpvb20xICogKHBvcy54IC0gcGFuMS54KSArIHBvcy54LFxuICAgICAgICB5OiAtem9vbTIgLyB6b29tMSAqIChwb3MueSAtIHBhbjEueSkgKyBwb3MueVxuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHpvb21lZDogdHJ1ZSxcbiAgICAgICAgcGFubmVkOiB0cnVlLFxuICAgICAgICB6b29tOiB6b29tMixcbiAgICAgICAgcGFuOiBwYW4yXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBqdXN0IHNldCB0aGUgem9vbVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgem9vbWVkOiB0cnVlLFxuICAgICAgICBwYW5uZWQ6IGZhbHNlLFxuICAgICAgICB6b29tOiB6b29tLFxuICAgICAgICBwYW46IGN1cnJlbnRQYW5cbiAgICAgIH07XG4gICAgfVxuICB9LFxuICB6b29tOiBmdW5jdGlvbiB6b29tKHBhcmFtcykge1xuICAgIGlmIChwYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZ2V0XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS56b29tO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzZXRcbiAgICAgIHZhciB2cCA9IHRoaXMuZ2V0Wm9vbWVkVmlld3BvcnQocGFyYW1zKTtcbiAgICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgICBpZiAodnAgPT0gbnVsbCB8fCAhdnAuem9vbWVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgX3Auem9vbSA9IHZwLnpvb207XG4gICAgICBpZiAodnAucGFubmVkKSB7XG4gICAgICAgIF9wLnBhbi54ID0gdnAucGFuLng7XG4gICAgICAgIF9wLnBhbi55ID0gdnAucGFuLnk7XG4gICAgICB9XG4gICAgICB0aGlzLmVtaXQoJ3pvb20nICsgKHZwLnBhbm5lZCA/ICcgcGFuJyA6ICcnKSArICcgdmlld3BvcnQnKTtcbiAgICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gICAgfVxuICB9LFxuXG4gIHZpZXdwb3J0OiBmdW5jdGlvbiB2aWV3cG9ydChvcHRzKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgem9vbURlZmQgPSB0cnVlO1xuICAgIHZhciBwYW5EZWZkID0gdHJ1ZTtcbiAgICB2YXIgZXZlbnRzID0gW107IC8vIHRvIHRyaWdnZXJcbiAgICB2YXIgem9vbUZhaWxlZCA9IGZhbHNlO1xuICAgIHZhciBwYW5GYWlsZWQgPSBmYWxzZTtcbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAoIW51bWJlciQxKG9wdHMuem9vbSkpIHtcbiAgICAgIHpvb21EZWZkID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICghcGxhaW5PYmplY3Qob3B0cy5wYW4pKSB7XG4gICAgICBwYW5EZWZkID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICghem9vbURlZmQgJiYgIXBhbkRlZmQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAoem9vbURlZmQpIHtcbiAgICAgIHZhciB6ID0gb3B0cy56b29tO1xuICAgICAgaWYgKHogPCBfcC5taW5ab29tIHx8IHogPiBfcC5tYXhab29tIHx8ICFfcC56b29taW5nRW5hYmxlZCkge1xuICAgICAgICB6b29tRmFpbGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9wLnpvb20gPSB6O1xuICAgICAgICBldmVudHMucHVzaCgnem9vbScpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocGFuRGVmZCAmJiAoIXpvb21GYWlsZWQgfHwgIW9wdHMuY2FuY2VsT25GYWlsZWRab29tKSAmJiBfcC5wYW5uaW5nRW5hYmxlZCkge1xuICAgICAgdmFyIHAgPSBvcHRzLnBhbjtcbiAgICAgIGlmIChudW1iZXIkMShwLngpKSB7XG4gICAgICAgIF9wLnBhbi54ID0gcC54O1xuICAgICAgICBwYW5GYWlsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChudW1iZXIkMShwLnkpKSB7XG4gICAgICAgIF9wLnBhbi55ID0gcC55O1xuICAgICAgICBwYW5GYWlsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghcGFuRmFpbGVkKSB7XG4gICAgICAgIGV2ZW50cy5wdXNoKCdwYW4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBldmVudHMucHVzaCgndmlld3BvcnQnKTtcbiAgICAgIHRoaXMuZW1pdChldmVudHMuam9pbignICcpKTtcbiAgICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICBjZW50ZXI6IGZ1bmN0aW9uIGNlbnRlcihlbGVtZW50cykge1xuICAgIHZhciBwYW4gPSB0aGlzLmdldENlbnRlclBhbihlbGVtZW50cyk7XG4gICAgaWYgKHBhbikge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5wYW4gPSBwYW47XG4gICAgICB0aGlzLmVtaXQoJ3BhbiB2aWV3cG9ydCcpO1xuICAgICAgdGhpcy5ub3RpZnkoJ3ZpZXdwb3J0Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIGdldENlbnRlclBhbjogZnVuY3Rpb24gZ2V0Q2VudGVyUGFuKGVsZW1lbnRzLCB6b29tKSB7XG4gICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdHJpbmcoZWxlbWVudHMpKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBlbGVtZW50cztcbiAgICAgIGVsZW1lbnRzID0gdGhpcy5tdXRhYmxlRWxlbWVudHMoKS5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH0gZWxzZSBpZiAoIWVsZW1lbnRPckNvbGxlY3Rpb24oZWxlbWVudHMpKSB7XG4gICAgICBlbGVtZW50cyA9IHRoaXMubXV0YWJsZUVsZW1lbnRzKCk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGNhbid0IGNlbnRyZSBwYW4gdG8gbm90aGluZ1xuXG4gICAgdmFyIGJiID0gZWxlbWVudHMuYm91bmRpbmdCb3goKTtcbiAgICB2YXIgdyA9IHRoaXMud2lkdGgoKTtcbiAgICB2YXIgaCA9IHRoaXMuaGVpZ2h0KCk7XG4gICAgem9vbSA9IHpvb20gPT09IHVuZGVmaW5lZCA/IHRoaXMuX3ByaXZhdGUuem9vbSA6IHpvb207XG4gICAgdmFyIHBhbiA9IHtcbiAgICAgIC8vIG1pZGRsZVxuICAgICAgeDogKHcgLSB6b29tICogKGJiLngxICsgYmIueDIpKSAvIDIsXG4gICAgICB5OiAoaCAtIHpvb20gKiAoYmIueTEgKyBiYi55MikpIC8gMlxuICAgIH07XG4gICAgcmV0dXJuIHBhbjtcbiAgfSxcbiAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgIGlmICghdGhpcy5fcHJpdmF0ZS5wYW5uaW5nRW5hYmxlZCB8fCAhdGhpcy5fcHJpdmF0ZS56b29taW5nRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMudmlld3BvcnQoe1xuICAgICAgcGFuOiB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDBcbiAgICAgIH0sXG4gICAgICB6b29tOiAxXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgaW52YWxpZGF0ZVNpemU6IGZ1bmN0aW9uIGludmFsaWRhdGVTaXplKCkge1xuICAgIHRoaXMuX3ByaXZhdGUuc2l6ZUNhY2hlID0gbnVsbDtcbiAgfSxcbiAgc2l6ZTogZnVuY3Rpb24gc2l6ZSgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciBjb250YWluZXIgPSBfcC5jb250YWluZXI7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICByZXR1cm4gX3Auc2l6ZUNhY2hlID0gX3Auc2l6ZUNhY2hlIHx8IChjb250YWluZXIgPyBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3R5bGUgPSBjeS53aW5kb3coKS5nZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lcik7XG4gICAgICB2YXIgdmFsID0gZnVuY3Rpb24gdmFsKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKSk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGg6IGNvbnRhaW5lci5jbGllbnRXaWR0aCAtIHZhbCgncGFkZGluZy1sZWZ0JykgLSB2YWwoJ3BhZGRpbmctcmlnaHQnKSxcbiAgICAgICAgaGVpZ2h0OiBjb250YWluZXIuY2xpZW50SGVpZ2h0IC0gdmFsKCdwYWRkaW5nLXRvcCcpIC0gdmFsKCdwYWRkaW5nLWJvdHRvbScpXG4gICAgICB9O1xuICAgIH0oKSA6IHtcbiAgICAgIC8vIGZhbGxiYWNrIGlmIG5vIGNvbnRhaW5lciAobm90IDAgYi9jIGNhbiBiZSB1c2VkIGZvciBkaXZpZGluZyBldGMpXG4gICAgICB3aWR0aDogMSxcbiAgICAgIGhlaWdodDogMVxuICAgIH0pO1xuICB9LFxuICB3aWR0aDogZnVuY3Rpb24gd2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZSgpLndpZHRoO1xuICB9LFxuICBoZWlnaHQ6IGZ1bmN0aW9uIGhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5zaXplKCkuaGVpZ2h0O1xuICB9LFxuICBleHRlbnQ6IGZ1bmN0aW9uIGV4dGVudCgpIHtcbiAgICB2YXIgcGFuID0gdGhpcy5fcHJpdmF0ZS5wYW47XG4gICAgdmFyIHpvb20gPSB0aGlzLl9wcml2YXRlLnpvb207XG4gICAgdmFyIHJiID0gdGhpcy5yZW5kZXJlZEV4dGVudCgpO1xuICAgIHZhciBiID0ge1xuICAgICAgeDE6IChyYi54MSAtIHBhbi54KSAvIHpvb20sXG4gICAgICB4MjogKHJiLngyIC0gcGFuLngpIC8gem9vbSxcbiAgICAgIHkxOiAocmIueTEgLSBwYW4ueSkgLyB6b29tLFxuICAgICAgeTI6IChyYi55MiAtIHBhbi55KSAvIHpvb21cbiAgICB9O1xuICAgIGIudyA9IGIueDIgLSBiLngxO1xuICAgIGIuaCA9IGIueTIgLSBiLnkxO1xuICAgIHJldHVybiBiO1xuICB9LFxuICByZW5kZXJlZEV4dGVudDogZnVuY3Rpb24gcmVuZGVyZWRFeHRlbnQoKSB7XG4gICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCgpO1xuICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgIHJldHVybiB7XG4gICAgICB4MTogMCxcbiAgICAgIHkxOiAwLFxuICAgICAgeDI6IHdpZHRoLFxuICAgICAgeTI6IGhlaWdodCxcbiAgICAgIHc6IHdpZHRoLFxuICAgICAgaDogaGVpZ2h0XG4gICAgfTtcbiAgfSxcbiAgbXVsdGlDbGlja0RlYm91bmNlVGltZTogZnVuY3Rpb24gbXVsdGlDbGlja0RlYm91bmNlVGltZShfaW50KSB7XG4gICAgaWYgKF9pbnQpIHRoaXMuX3ByaXZhdGUubXVsdGlDbGlja0RlYm91bmNlVGltZSA9IF9pbnQ7ZWxzZSByZXR1cm4gdGhpcy5fcHJpdmF0ZS5tdWx0aUNsaWNrRGVib3VuY2VUaW1lO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9XG59O1xuXG4vLyBhbGlhc2VzXG5jb3JlZm4kMS5jZW50cmUgPSBjb3JlZm4kMS5jZW50ZXI7XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5jb3JlZm4kMS5hdXRvbG9ja05vZGVzID0gY29yZWZuJDEuYXV0b2xvY2s7XG5jb3JlZm4kMS5hdXRvdW5ncmFiaWZ5Tm9kZXMgPSBjb3JlZm4kMS5hdXRvdW5ncmFiaWZ5O1xuXG52YXIgZm4gPSB7XG4gIGRhdGE6IGRlZmluZS5kYXRhKHtcbiAgICBmaWVsZDogJ2RhdGEnLFxuICAgIGJpbmRpbmdFdmVudDogJ2RhdGEnLFxuICAgIGFsbG93QmluZGluZzogdHJ1ZSxcbiAgICBhbGxvd1NldHRpbmc6IHRydWUsXG4gICAgc2V0dGluZ0V2ZW50OiAnZGF0YScsXG4gICAgc2V0dGluZ1RyaWdnZXJzRXZlbnQ6IHRydWUsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIGFsbG93R2V0dGluZzogdHJ1ZSxcbiAgICB1cGRhdGVTdHlsZTogdHJ1ZVxuICB9KSxcbiAgcmVtb3ZlRGF0YTogZGVmaW5lLnJlbW92ZURhdGEoe1xuICAgIGZpZWxkOiAnZGF0YScsXG4gICAgZXZlbnQ6ICdkYXRhJyxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgdHJpZ2dlckV2ZW50OiB0cnVlLFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pLFxuICBzY3JhdGNoOiBkZWZpbmUuZGF0YSh7XG4gICAgZmllbGQ6ICdzY3JhdGNoJyxcbiAgICBiaW5kaW5nRXZlbnQ6ICdzY3JhdGNoJyxcbiAgICBhbGxvd0JpbmRpbmc6IHRydWUsXG4gICAgYWxsb3dTZXR0aW5nOiB0cnVlLFxuICAgIHNldHRpbmdFdmVudDogJ3NjcmF0Y2gnLFxuICAgIHNldHRpbmdUcmlnZ2Vyc0V2ZW50OiB0cnVlLFxuICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICBhbGxvd0dldHRpbmc6IHRydWUsXG4gICAgdXBkYXRlU3R5bGU6IHRydWVcbiAgfSksXG4gIHJlbW92ZVNjcmF0Y2g6IGRlZmluZS5yZW1vdmVEYXRhKHtcbiAgICBmaWVsZDogJ3NjcmF0Y2gnLFxuICAgIGV2ZW50OiAnc2NyYXRjaCcsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIHRyaWdnZXJFdmVudDogdHJ1ZSxcbiAgICB1cGRhdGVTdHlsZTogdHJ1ZVxuICB9KVxufTtcblxuLy8gYWxpYXNlc1xuZm4uYXR0ciA9IGZuLmRhdGE7XG5mbi5yZW1vdmVBdHRyID0gZm4ucmVtb3ZlRGF0YTtcblxudmFyIENvcmUgPSBmdW5jdGlvbiBDb3JlKG9wdHMpIHtcbiAgdmFyIGN5ID0gdGhpcztcbiAgb3B0cyA9IGV4dGVuZCh7fSwgb3B0cyk7XG4gIHZhciBjb250YWluZXIgPSBvcHRzLmNvbnRhaW5lcjtcblxuICAvLyBhbGxvdyBmb3IgcGFzc2luZyBhIHdyYXBwZWQganF1ZXJ5IG9iamVjdFxuICAvLyBlLmcuIGN5dG9zY2FwZSh7IGNvbnRhaW5lcjogJCgnI2N5JykgfSlcbiAgaWYgKGNvbnRhaW5lciAmJiAhaHRtbEVsZW1lbnQoY29udGFpbmVyKSAmJiBodG1sRWxlbWVudChjb250YWluZXJbMF0pKSB7XG4gICAgY29udGFpbmVyID0gY29udGFpbmVyWzBdO1xuICB9XG4gIHZhciByZWcgPSBjb250YWluZXIgPyBjb250YWluZXIuX2N5cmVnIDogbnVsbDsgLy8gZS5nLiBhbHJlYWR5IHJlZ2lzdGVyZWQgc29tZSBpbmZvIChlLmcuIHJlYWRpZXMpIHZpYSBqcXVlcnlcbiAgcmVnID0gcmVnIHx8IHt9O1xuICBpZiAocmVnICYmIHJlZy5jeSkge1xuICAgIHJlZy5jeS5kZXN0cm95KCk7XG4gICAgcmVnID0ge307IC8vIG9sZCBpbnN0YW5jZSA9PiByZXBsYWNlIHJlZyBjb21wbGV0ZWx5XG4gIH1cblxuICB2YXIgcmVhZGllcyA9IHJlZy5yZWFkaWVzID0gcmVnLnJlYWRpZXMgfHwgW107XG4gIGlmIChjb250YWluZXIpIHtcbiAgICBjb250YWluZXIuX2N5cmVnID0gcmVnO1xuICB9IC8vIG1ha2Ugc3VyZSBjb250YWluZXIgYXNzb2MnZCByZWcgcG9pbnRzIHRvIHRoaXMgY3lcbiAgcmVnLmN5ID0gY3k7XG4gIHZhciBoZWFkID0gX3dpbmRvdyAhPT0gdW5kZWZpbmVkICYmIGNvbnRhaW5lciAhPT0gdW5kZWZpbmVkICYmICFvcHRzLmhlYWRsZXNzO1xuICB2YXIgb3B0aW9ucyA9IG9wdHM7XG4gIG9wdGlvbnMubGF5b3V0ID0gZXh0ZW5kKHtcbiAgICBuYW1lOiBoZWFkID8gJ2dyaWQnIDogJ251bGwnXG4gIH0sIG9wdGlvbnMubGF5b3V0KTtcbiAgb3B0aW9ucy5yZW5kZXJlciA9IGV4dGVuZCh7XG4gICAgbmFtZTogaGVhZCA/ICdjYW52YXMnIDogJ251bGwnXG4gIH0sIG9wdGlvbnMucmVuZGVyZXIpO1xuICB2YXIgZGVmVmFsID0gZnVuY3Rpb24gZGVmVmFsKGRlZiwgdmFsLCBhbHRWYWwpIHtcbiAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfSBlbHNlIGlmIChhbHRWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGFsdFZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRlZjtcbiAgICB9XG4gIH07XG4gIHZhciBfcCA9IHRoaXMuX3ByaXZhdGUgPSB7XG4gICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgLy8gaHRtbCBkb20gZWxlIGNvbnRhaW5lclxuICAgIHJlYWR5OiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHJlYWR5IGhhcyBiZWVuIHRyaWdnZXJlZFxuICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgLy8gY2FjaGVkIG9wdGlvbnNcbiAgICBlbGVtZW50czogbmV3IENvbGxlY3Rpb24odGhpcyksXG4gICAgLy8gZWxlbWVudHMgaW4gdGhlIGdyYXBoXG4gICAgbGlzdGVuZXJzOiBbXSxcbiAgICAvLyBsaXN0IG9mIGxpc3RlbmVyc1xuICAgIGFuaUVsZXM6IG5ldyBDb2xsZWN0aW9uKHRoaXMpLFxuICAgIC8vIGVsZW1lbnRzIGJlaW5nIGFuaW1hdGVkXG4gICAgZGF0YTogb3B0aW9ucy5kYXRhIHx8IHt9LFxuICAgIC8vIGRhdGEgZm9yIHRoZSBjb3JlXG4gICAgc2NyYXRjaDoge30sXG4gICAgLy8gc2NyYXRjaCBvYmplY3QgZm9yIGNvcmVcbiAgICBsYXlvdXQ6IG51bGwsXG4gICAgcmVuZGVyZXI6IG51bGwsXG4gICAgZGVzdHJveWVkOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIGRlc3Ryb3kgd2FzIGNhbGxlZFxuICAgIG5vdGlmaWNhdGlvbnNFbmFibGVkOiB0cnVlLFxuICAgIC8vIHdoZXRoZXIgbm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byB0aGUgcmVuZGVyZXJcbiAgICBtaW5ab29tOiAxZS01MCxcbiAgICBtYXhab29tOiAxZTUwLFxuICAgIHpvb21pbmdFbmFibGVkOiBkZWZWYWwodHJ1ZSwgb3B0aW9ucy56b29taW5nRW5hYmxlZCksXG4gICAgdXNlclpvb21pbmdFbmFibGVkOiBkZWZWYWwodHJ1ZSwgb3B0aW9ucy51c2VyWm9vbWluZ0VuYWJsZWQpLFxuICAgIHBhbm5pbmdFbmFibGVkOiBkZWZWYWwodHJ1ZSwgb3B0aW9ucy5wYW5uaW5nRW5hYmxlZCksXG4gICAgdXNlclBhbm5pbmdFbmFibGVkOiBkZWZWYWwodHJ1ZSwgb3B0aW9ucy51c2VyUGFubmluZ0VuYWJsZWQpLFxuICAgIGJveFNlbGVjdGlvbkVuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLmJveFNlbGVjdGlvbkVuYWJsZWQpLFxuICAgIGF1dG9sb2NrOiBkZWZWYWwoZmFsc2UsIG9wdGlvbnMuYXV0b2xvY2ssIG9wdGlvbnMuYXV0b2xvY2tOb2RlcyksXG4gICAgYXV0b3VuZ3JhYmlmeTogZGVmVmFsKGZhbHNlLCBvcHRpb25zLmF1dG91bmdyYWJpZnksIG9wdGlvbnMuYXV0b3VuZ3JhYmlmeU5vZGVzKSxcbiAgICBhdXRvdW5zZWxlY3RpZnk6IGRlZlZhbChmYWxzZSwgb3B0aW9ucy5hdXRvdW5zZWxlY3RpZnkpLFxuICAgIHN0eWxlRW5hYmxlZDogb3B0aW9ucy5zdHlsZUVuYWJsZWQgPT09IHVuZGVmaW5lZCA/IGhlYWQgOiBvcHRpb25zLnN0eWxlRW5hYmxlZCxcbiAgICB6b29tOiBudW1iZXIkMShvcHRpb25zLnpvb20pID8gb3B0aW9ucy56b29tIDogMSxcbiAgICBwYW46IHtcbiAgICAgIHg6IHBsYWluT2JqZWN0KG9wdGlvbnMucGFuKSAmJiBudW1iZXIkMShvcHRpb25zLnBhbi54KSA/IG9wdGlvbnMucGFuLnggOiAwLFxuICAgICAgeTogcGxhaW5PYmplY3Qob3B0aW9ucy5wYW4pICYmIG51bWJlciQxKG9wdGlvbnMucGFuLnkpID8gb3B0aW9ucy5wYW4ueSA6IDBcbiAgICB9LFxuICAgIGFuaW1hdGlvbjoge1xuICAgICAgLy8gb2JqZWN0IGZvciBjdXJyZW50bHktcnVubmluZyBhbmltYXRpb25zXG4gICAgICBjdXJyZW50OiBbXSxcbiAgICAgIHF1ZXVlOiBbXVxuICAgIH0sXG4gICAgaGFzQ29tcG91bmROb2RlczogZmFsc2UsXG4gICAgbXVsdGlDbGlja0RlYm91bmNlVGltZTogZGVmVmFsKDI1MCwgb3B0aW9ucy5tdWx0aUNsaWNrRGVib3VuY2VUaW1lKVxuICB9O1xuICB0aGlzLmNyZWF0ZUVtaXR0ZXIoKTtcblxuICAvLyBzZXQgc2VsZWN0aW9uIHR5cGVcbiAgdGhpcy5zZWxlY3Rpb25UeXBlKG9wdGlvbnMuc2VsZWN0aW9uVHlwZSk7XG5cbiAgLy8gaW5pdCB6b29tIGJvdW5kc1xuICB0aGlzLnpvb21SYW5nZSh7XG4gICAgbWluOiBvcHRpb25zLm1pblpvb20sXG4gICAgbWF4OiBvcHRpb25zLm1heFpvb21cbiAgfSk7XG4gIHZhciBsb2FkRXh0RGF0YSA9IGZ1bmN0aW9uIGxvYWRFeHREYXRhKGV4dERhdGEsIG5leHQpIHtcbiAgICB2YXIgYW55SXNQcm9taXNlID0gZXh0RGF0YS5zb21lKHByb21pc2UpO1xuICAgIGlmIChhbnlJc1Byb21pc2UpIHtcbiAgICAgIHJldHVybiBQcm9taXNlJDEuYWxsKGV4dERhdGEpLnRoZW4obmV4dCk7IC8vIGxvYWQgYWxsIGRhdGEgYXN5bmNocm9ub3VzbHksIHRoZW4gZXhlYyByZXN0IG9mIGluaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dChleHREYXRhKTsgLy8gZXhlYyBzeW5jaHJvbm91c2x5IGZvciBjb252ZW5pZW5jZVxuICAgIH1cbiAgfTtcblxuICAvLyBzdGFydCB3aXRoIHRoZSBkZWZhdWx0IHN0eWxlc2hlZXQgc28gd2UgaGF2ZSBzb21ldGhpbmcgYmVmb3JlIGxvYWRpbmcgYW4gZXh0ZXJuYWwgc3R5bGVzaGVldFxuICBpZiAoX3Auc3R5bGVFbmFibGVkKSB7XG4gICAgY3kuc2V0U3R5bGUoW10pO1xuICB9XG5cbiAgLy8gY3JlYXRlIHRoZSByZW5kZXJlclxuICB2YXIgcmVuZGVyZXJPcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zLCBvcHRpb25zLnJlbmRlcmVyKTsgLy8gYWxsb3cgcmVuZGVyaW5nIGhpbnRzIGluIHRvcCBsZXZlbCBvcHRpb25zXG4gIGN5LmluaXRSZW5kZXJlcihyZW5kZXJlck9wdGlvbnMpO1xuICB2YXIgc2V0RWxlc0FuZExheW91dCA9IGZ1bmN0aW9uIHNldEVsZXNBbmRMYXlvdXQoZWxlbWVudHMsIG9ubG9hZCwgb25kb25lKSB7XG4gICAgY3kubm90aWZpY2F0aW9ucyhmYWxzZSk7XG5cbiAgICAvLyByZW1vdmUgb2xkIGVsZW1lbnRzXG4gICAgdmFyIG9sZEVsZXMgPSBjeS5tdXRhYmxlRWxlbWVudHMoKTtcbiAgICBpZiAob2xkRWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBvbGRFbGVzLnJlbW92ZSgpO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudHMgIT0gbnVsbCkge1xuICAgICAgaWYgKHBsYWluT2JqZWN0KGVsZW1lbnRzKSB8fCBhcnJheShlbGVtZW50cykpIHtcbiAgICAgICAgY3kuYWRkKGVsZW1lbnRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY3kub25lKCdsYXlvdXRyZWFkeScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBjeS5ub3RpZmljYXRpb25zKHRydWUpO1xuICAgICAgY3kuZW1pdChlKTsgLy8gd2UgbWlzc2VkIHRoaXMgZXZlbnQgYnkgdHVybmluZyBub3RpZmljYXRpb25zIG9mZiwgc28gcGFzcyBpdCBvblxuXG4gICAgICBjeS5vbmUoJ2xvYWQnLCBvbmxvYWQpO1xuICAgICAgY3kuZW1pdEFuZE5vdGlmeSgnbG9hZCcpO1xuICAgIH0pLm9uZSgnbGF5b3V0c3RvcCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGN5Lm9uZSgnZG9uZScsIG9uZG9uZSk7XG4gICAgICBjeS5lbWl0KCdkb25lJyk7XG4gICAgfSk7XG4gICAgdmFyIGxheW91dE9wdHMgPSBleHRlbmQoe30sIGN5Ll9wcml2YXRlLm9wdGlvbnMubGF5b3V0KTtcbiAgICBsYXlvdXRPcHRzLmVsZXMgPSBjeS5lbGVtZW50cygpO1xuICAgIGN5LmxheW91dChsYXlvdXRPcHRzKS5ydW4oKTtcbiAgfTtcbiAgbG9hZEV4dERhdGEoW29wdGlvbnMuc3R5bGUsIG9wdGlvbnMuZWxlbWVudHNdLCBmdW5jdGlvbiAodGhlbnMpIHtcbiAgICB2YXIgaW5pdFN0eWxlID0gdGhlbnNbMF07XG4gICAgdmFyIGluaXRFbGVzID0gdGhlbnNbMV07XG5cbiAgICAvLyBpbml0IHN0eWxlXG4gICAgaWYgKF9wLnN0eWxlRW5hYmxlZCkge1xuICAgICAgY3kuc3R5bGUoKS5hcHBlbmQoaW5pdFN0eWxlKTtcbiAgICB9XG5cbiAgICAvLyBpbml0aWFsIGxvYWRcbiAgICBzZXRFbGVzQW5kTGF5b3V0KGluaXRFbGVzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBvbnJlYWR5XG4gICAgICBjeS5zdGFydEFuaW1hdGlvbkxvb3AoKTtcbiAgICAgIF9wLnJlYWR5ID0gdHJ1ZTtcblxuICAgICAgLy8gaWYgYSByZWFkeSBjYWxsYmFjayBpcyBzcGVjaWZpZWQgYXMgYW4gb3B0aW9uLCB0aGUgYmluZCBpdFxuICAgICAgaWYgKGZuJDYob3B0aW9ucy5yZWFkeSkpIHtcbiAgICAgICAgY3kub24oJ3JlYWR5Jywgb3B0aW9ucy5yZWFkeSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGJpbmQgYWxsIHRoZSByZWFkeSBoYW5kbGVycyByZWdpc3RlcmVkIGJlZm9yZSBjcmVhdGluZyB0aGlzIGluc3RhbmNlXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlYWRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZuID0gcmVhZGllc1tpXTtcbiAgICAgICAgY3kub24oJ3JlYWR5JywgZm4pO1xuICAgICAgfVxuICAgICAgaWYgKHJlZykge1xuICAgICAgICByZWcucmVhZGllcyA9IFtdO1xuICAgICAgfSAvLyBjbGVhciBiL2Mgd2UndmUgYm91bmQgdGhlbSBhbGwgYW5kIGRvbid0IHdhbnQgdG8ga2VlcCBpdCBhcm91bmQgaW4gY2FzZSBhIG5ldyBjb3JlIHVzZXMgdGhlIHNhbWUgZGl2IGV0Y1xuXG4gICAgICBjeS5lbWl0KCdyZWFkeScpO1xuICAgIH0sIG9wdGlvbnMuZG9uZSk7XG4gIH0pO1xufTtcbnZhciBjb3JlZm4gPSBDb3JlLnByb3RvdHlwZTsgLy8gc2hvcnQgYWxpYXNcblxuZXh0ZW5kKGNvcmVmbiwge1xuICBpbnN0YW5jZVN0cmluZzogZnVuY3Rpb24gaW5zdGFuY2VTdHJpbmcoKSB7XG4gICAgcmV0dXJuICdjb3JlJztcbiAgfSxcbiAgaXNSZWFkeTogZnVuY3Rpb24gaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5yZWFkeTtcbiAgfSxcbiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZGVzdHJveWVkO1xuICB9LFxuICByZWFkeTogZnVuY3Rpb24gcmVhZHkoZm4pIHtcbiAgICBpZiAodGhpcy5pc1JlYWR5KCkpIHtcbiAgICAgIHRoaXMuZW1pdHRlcigpLmVtaXQoJ3JlYWR5JywgW10sIGZuKTsgLy8ganVzdCBjYWxscyBmbiBhcyB0aG91Z2ggdHJpZ2dlcmVkIHZpYSByZWFkeSBldmVudFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uKCdyZWFkeScsIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICBpZiAoY3kuZGVzdHJveWVkKCkpIHJldHVybjtcbiAgICBjeS5zdG9wQW5pbWF0aW9uTG9vcCgpO1xuICAgIGN5LmRlc3Ryb3lSZW5kZXJlcigpO1xuICAgIHRoaXMuZW1pdCgnZGVzdHJveScpO1xuICAgIGN5Ll9wcml2YXRlLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgcmV0dXJuIGN5O1xuICB9LFxuICBoYXNFbGVtZW50V2l0aElkOiBmdW5jdGlvbiBoYXNFbGVtZW50V2l0aElkKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZWxlbWVudHMuaGFzRWxlbWVudFdpdGhJZChpZCk7XG4gIH0sXG4gIGdldEVsZW1lbnRCeUlkOiBmdW5jdGlvbiBnZXRFbGVtZW50QnlJZChpZCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmVsZW1lbnRzLmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgfSxcbiAgaGFzQ29tcG91bmROb2RlczogZnVuY3Rpb24gaGFzQ29tcG91bmROb2RlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5oYXNDb21wb3VuZE5vZGVzO1xuICB9LFxuICBoZWFkbGVzczogZnVuY3Rpb24gaGVhZGxlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUucmVuZGVyZXIuaXNIZWFkbGVzcygpO1xuICB9LFxuICBzdHlsZUVuYWJsZWQ6IGZ1bmN0aW9uIHN0eWxlRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5zdHlsZUVuYWJsZWQ7XG4gIH0sXG4gIGFkZFRvUG9vbDogZnVuY3Rpb24gYWRkVG9Qb29sKGVsZXMpIHtcbiAgICB0aGlzLl9wcml2YXRlLmVsZW1lbnRzLm1lcmdlKGVsZXMpO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIHJlbW92ZUZyb21Qb29sOiBmdW5jdGlvbiByZW1vdmVGcm9tUG9vbChlbGVzKSB7XG4gICAgdGhpcy5fcHJpdmF0ZS5lbGVtZW50cy51bm1lcmdlKGVsZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjb250YWluZXI6IGZ1bmN0aW9uIGNvbnRhaW5lcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5jb250YWluZXIgfHwgbnVsbDtcbiAgfSxcbiAgd2luZG93OiBmdW5jdGlvbiB3aW5kb3coKSB7XG4gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX3ByaXZhdGUuY29udGFpbmVyO1xuICAgIGlmIChjb250YWluZXIgPT0gbnVsbCkgcmV0dXJuIF93aW5kb3c7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSB0aGlzLl9wcml2YXRlLmNvbnRhaW5lci5vd25lckRvY3VtZW50O1xuICAgIGlmIChvd25lckRvY3VtZW50ID09PSB1bmRlZmluZWQgfHwgb3duZXJEb2N1bWVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gX3dpbmRvdztcbiAgICB9XG4gICAgcmV0dXJuIG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgX3dpbmRvdztcbiAgfSxcbiAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KGNvbnRhaW5lcikge1xuICAgIGlmIChjb250YWluZXIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIHZhciBfcCA9IGN5Ll9wcml2YXRlO1xuICAgIHZhciBvcHRpb25zID0gX3Aub3B0aW9ucztcbiAgICBpZiAoIWh0bWxFbGVtZW50KGNvbnRhaW5lcikgJiYgaHRtbEVsZW1lbnQoY29udGFpbmVyWzBdKSkge1xuICAgICAgY29udGFpbmVyID0gY29udGFpbmVyWzBdO1xuICAgIH1cbiAgICBjeS5zdG9wQW5pbWF0aW9uTG9vcCgpO1xuICAgIGN5LmRlc3Ryb3lSZW5kZXJlcigpO1xuICAgIF9wLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICBfcC5zdHlsZUVuYWJsZWQgPSB0cnVlO1xuICAgIGN5LmludmFsaWRhdGVTaXplKCk7XG4gICAgY3kuaW5pdFJlbmRlcmVyKGV4dGVuZCh7fSwgb3B0aW9ucywgb3B0aW9ucy5yZW5kZXJlciwge1xuICAgICAgLy8gYWxsb3cgY3VzdG9tIHJlbmRlcmVyIG5hbWUgdG8gYmUgcmUtdXNlZCwgb3RoZXJ3aXNlIHVzZSBjYW52YXNcbiAgICAgIG5hbWU6IG9wdGlvbnMucmVuZGVyZXIubmFtZSA9PT0gJ251bGwnID8gJ2NhbnZhcycgOiBvcHRpb25zLnJlbmRlcmVyLm5hbWVcbiAgICB9KSk7XG4gICAgY3kuc3RhcnRBbmltYXRpb25Mb29wKCk7XG4gICAgY3kuc3R5bGUob3B0aW9ucy5zdHlsZSk7XG4gICAgY3kuZW1pdCgnbW91bnQnKTtcbiAgICByZXR1cm4gY3k7XG4gIH0sXG4gIHVubW91bnQ6IGZ1bmN0aW9uIHVubW91bnQoKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICBjeS5zdG9wQW5pbWF0aW9uTG9vcCgpO1xuICAgIGN5LmRlc3Ryb3lSZW5kZXJlcigpO1xuICAgIGN5LmluaXRSZW5kZXJlcih7XG4gICAgICBuYW1lOiAnbnVsbCdcbiAgICB9KTtcbiAgICBjeS5lbWl0KCd1bm1vdW50Jyk7XG4gICAgcmV0dXJuIGN5O1xuICB9LFxuICBvcHRpb25zOiBmdW5jdGlvbiBvcHRpb25zKCkge1xuICAgIHJldHVybiBjb3B5KHRoaXMuX3ByaXZhdGUub3B0aW9ucyk7XG4gIH0sXG4gIGpzb246IGZ1bmN0aW9uIGpzb24ob2JqKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICB2YXIgX3AgPSBjeS5fcHJpdmF0ZTtcbiAgICB2YXIgZWxlcyA9IGN5Lm11dGFibGVFbGVtZW50cygpO1xuICAgIHZhciBnZXRGcmVzaFJlZiA9IGZ1bmN0aW9uIGdldEZyZXNoUmVmKGVsZSkge1xuICAgICAgcmV0dXJuIGN5LmdldEVsZW1lbnRCeUlkKGVsZS5pZCgpKTtcbiAgICB9O1xuICAgIGlmIChwbGFpbk9iamVjdChvYmopKSB7XG4gICAgICAvLyBzZXRcblxuICAgICAgY3kuc3RhcnRCYXRjaCgpO1xuICAgICAgaWYgKG9iai5lbGVtZW50cykge1xuICAgICAgICB2YXIgaWRJbkpzb24gPSB7fTtcbiAgICAgICAgdmFyIHVwZGF0ZUVsZXMgPSBmdW5jdGlvbiB1cGRhdGVFbGVzKGpzb25zLCBncikge1xuICAgICAgICAgIHZhciB0b0FkZCA9IFtdO1xuICAgICAgICAgIHZhciB0b01vZCA9IFtdO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwganNvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBqc29uID0ganNvbnNbaV07XG4gICAgICAgICAgICBpZiAoIWpzb24uZGF0YS5pZCkge1xuICAgICAgICAgICAgICB3YXJuKCdjeS5qc29uKCkgY2Fubm90IGhhbmRsZSBlbGVtZW50cyB3aXRob3V0IGFuIElEIGF0dHJpYnV0ZScpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBpZCA9ICcnICsganNvbi5kYXRhLmlkOyAvLyBpZCBtdXN0IGJlIHN0cmluZ1xuICAgICAgICAgICAgdmFyIGVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgICAgIGlkSW5Kc29uW2lkXSA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZWxlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAvLyBleGlzdGluZyBlbGVtZW50IHNob3VsZCBiZSB1cGRhdGVkXG4gICAgICAgICAgICAgIHRvTW9kLnB1c2goe1xuICAgICAgICAgICAgICAgIGVsZTogZWxlLFxuICAgICAgICAgICAgICAgIGpzb246IGpzb25cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBvdGhlcndpc2Ugc2hvdWxkIGJlIGFkZGVkXG4gICAgICAgICAgICAgIGlmIChncikge1xuICAgICAgICAgICAgICAgIGpzb24uZ3JvdXAgPSBncjtcbiAgICAgICAgICAgICAgICB0b0FkZC5wdXNoKGpzb24pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRvQWRkLnB1c2goanNvbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY3kuYWRkKHRvQWRkKTtcbiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdG9Nb2QubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgX3RvTW9kJF9pID0gdG9Nb2RbX2ldLFxuICAgICAgICAgICAgICBfZWxlID0gX3RvTW9kJF9pLmVsZSxcbiAgICAgICAgICAgICAgX2pzb24gPSBfdG9Nb2QkX2kuanNvbjtcbiAgICAgICAgICAgIF9lbGUuanNvbihfanNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoYXJyYXkob2JqLmVsZW1lbnRzKSkge1xuICAgICAgICAgIC8vIGVsZW1lbnRzOiBbXVxuICAgICAgICAgIHVwZGF0ZUVsZXMob2JqLmVsZW1lbnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBlbGVtZW50czogeyBub2RlczogW10sIGVkZ2VzOiBbXSB9XG4gICAgICAgICAgdmFyIGdycyA9IFsnbm9kZXMnLCAnZWRnZXMnXTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGdyID0gZ3JzW2ldO1xuICAgICAgICAgICAgdmFyIGVsZW1lbnRzID0gb2JqLmVsZW1lbnRzW2dyXTtcbiAgICAgICAgICAgIGlmIChhcnJheShlbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgdXBkYXRlRWxlcyhlbGVtZW50cywgZ3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50c1RvUmVtb3ZlID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICBlbGVzLmZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgcmV0dXJuICFpZEluSnNvbltlbGUuaWQoKV07XG4gICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgIGlmIChlbGUuaXNQYXJlbnQoKSkge1xuICAgICAgICAgICAgcGFyZW50c1RvUmVtb3ZlLm1lcmdlKGVsZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZS5yZW1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHNvIHRoYXQgY2hpbGRyZW4gYXJlIG5vdCByZW1vdmVkIHcvcGFyZW50XG4gICAgICAgIHBhcmVudHNUb1JlbW92ZS5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlLmNoaWxkcmVuKCkubW92ZSh7XG4gICAgICAgICAgICBwYXJlbnQ6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gaW50ZXJtZWRpYXRlIHBhcmVudHMgbWF5IGJlIG1vdmVkIGJ5IHByaW9yIGxpbmUsIHNvIG1ha2Ugc3VyZSB3ZSByZW1vdmUgYnkgZnJlc2ggcmVmc1xuICAgICAgICBwYXJlbnRzVG9SZW1vdmUuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGdldEZyZXNoUmVmKGVsZSkucmVtb3ZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKG9iai5zdHlsZSkge1xuICAgICAgICBjeS5zdHlsZShvYmouc3R5bGUpO1xuICAgICAgfVxuICAgICAgaWYgKG9iai56b29tICE9IG51bGwgJiYgb2JqLnpvb20gIT09IF9wLnpvb20pIHtcbiAgICAgICAgY3kuem9vbShvYmouem9vbSk7XG4gICAgICB9XG4gICAgICBpZiAob2JqLnBhbikge1xuICAgICAgICBpZiAob2JqLnBhbi54ICE9PSBfcC5wYW4ueCB8fCBvYmoucGFuLnkgIT09IF9wLnBhbi55KSB7XG4gICAgICAgICAgY3kucGFuKG9iai5wYW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob2JqLmRhdGEpIHtcbiAgICAgICAgY3kuZGF0YShvYmouZGF0YSk7XG4gICAgICB9XG4gICAgICB2YXIgZmllbGRzID0gWydtaW5ab29tJywgJ21heFpvb20nLCAnem9vbWluZ0VuYWJsZWQnLCAndXNlclpvb21pbmdFbmFibGVkJywgJ3Bhbm5pbmdFbmFibGVkJywgJ3VzZXJQYW5uaW5nRW5hYmxlZCcsICdib3hTZWxlY3Rpb25FbmFibGVkJywgJ2F1dG9sb2NrJywgJ2F1dG91bmdyYWJpZnknLCAnYXV0b3Vuc2VsZWN0aWZ5JywgJ211bHRpQ2xpY2tEZWJvdW5jZVRpbWUnXTtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGZpZWxkcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIHZhciBmID0gZmllbGRzW19pMl07XG4gICAgICAgIGlmIChvYmpbZl0gIT0gbnVsbCkge1xuICAgICAgICAgIGN5W2ZdKG9ialtmXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN5LmVuZEJhdGNoKCk7XG4gICAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZ2V0XG4gICAgICB2YXIgZmxhdCA9ICEhb2JqO1xuICAgICAgdmFyIGpzb24gPSB7fTtcbiAgICAgIGlmIChmbGF0KSB7XG4gICAgICAgIGpzb24uZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzKCkubWFwKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlLmpzb24oKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uLmVsZW1lbnRzID0ge307XG4gICAgICAgIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgdmFyIGdyb3VwID0gZWxlLmdyb3VwKCk7XG4gICAgICAgICAgaWYgKCFqc29uLmVsZW1lbnRzW2dyb3VwXSkge1xuICAgICAgICAgICAganNvbi5lbGVtZW50c1tncm91cF0gPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAganNvbi5lbGVtZW50c1tncm91cF0ucHVzaChlbGUuanNvbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fcHJpdmF0ZS5zdHlsZUVuYWJsZWQpIHtcbiAgICAgICAganNvbi5zdHlsZSA9IGN5LnN0eWxlKCkuanNvbigpO1xuICAgICAgfVxuICAgICAganNvbi5kYXRhID0gY29weShjeS5kYXRhKCkpO1xuICAgICAgdmFyIG9wdGlvbnMgPSBfcC5vcHRpb25zO1xuICAgICAganNvbi56b29taW5nRW5hYmxlZCA9IF9wLnpvb21pbmdFbmFibGVkO1xuICAgICAganNvbi51c2VyWm9vbWluZ0VuYWJsZWQgPSBfcC51c2VyWm9vbWluZ0VuYWJsZWQ7XG4gICAgICBqc29uLnpvb20gPSBfcC56b29tO1xuICAgICAganNvbi5taW5ab29tID0gX3AubWluWm9vbTtcbiAgICAgIGpzb24ubWF4Wm9vbSA9IF9wLm1heFpvb207XG4gICAgICBqc29uLnBhbm5pbmdFbmFibGVkID0gX3AucGFubmluZ0VuYWJsZWQ7XG4gICAgICBqc29uLnVzZXJQYW5uaW5nRW5hYmxlZCA9IF9wLnVzZXJQYW5uaW5nRW5hYmxlZDtcbiAgICAgIGpzb24ucGFuID0gY29weShfcC5wYW4pO1xuICAgICAganNvbi5ib3hTZWxlY3Rpb25FbmFibGVkID0gX3AuYm94U2VsZWN0aW9uRW5hYmxlZDtcbiAgICAgIGpzb24ucmVuZGVyZXIgPSBjb3B5KG9wdGlvbnMucmVuZGVyZXIpO1xuICAgICAganNvbi5oaWRlRWRnZXNPblZpZXdwb3J0ID0gb3B0aW9ucy5oaWRlRWRnZXNPblZpZXdwb3J0O1xuICAgICAganNvbi50ZXh0dXJlT25WaWV3cG9ydCA9IG9wdGlvbnMudGV4dHVyZU9uVmlld3BvcnQ7XG4gICAgICBqc29uLndoZWVsU2Vuc2l0aXZpdHkgPSBvcHRpb25zLndoZWVsU2Vuc2l0aXZpdHk7XG4gICAgICBqc29uLm1vdGlvbkJsdXIgPSBvcHRpb25zLm1vdGlvbkJsdXI7XG4gICAgICBqc29uLm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUgPSBvcHRpb25zLm11bHRpQ2xpY2tEZWJvdW5jZVRpbWU7XG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gIH1cbn0pO1xuY29yZWZuLiRpZCA9IGNvcmVmbi5nZXRFbGVtZW50QnlJZDtcbltjb3JlZm4kOSwgY29yZWZuJDgsIGVsZXNmbiwgY29yZWZuJDcsIGNvcmVmbiQ2LCBjb3JlZm4kNSwgY29yZWZuJDQsIGNvcmVmbiQzLCBjb3JlZm4kMiwgY29yZWZuJDEsIGZuXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoY29yZWZuLCBwcm9wcyk7XG59KTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBkZWZhdWx0cyQ3ID0ge1xuICBmaXQ6IHRydWUsXG4gIC8vIHdoZXRoZXIgdG8gZml0IHRoZSB2aWV3cG9ydCB0byB0aGUgZ3JhcGhcbiAgZGlyZWN0ZWQ6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRoZSB0cmVlIGlzIGRpcmVjdGVkIGRvd253YXJkcyAob3IgZWRnZXMgY2FuIHBvaW50IGluIGFueSBkaXJlY3Rpb24gaWYgZmFsc2UpXG4gIHBhZGRpbmc6IDMwLFxuICAvLyBwYWRkaW5nIG9uIGZpdFxuICBjaXJjbGU6IGZhbHNlLFxuICAvLyBwdXQgZGVwdGhzIGluIGNvbmNlbnRyaWMgY2lyY2xlcyBpZiB0cnVlLCBwdXQgZGVwdGhzIHRvcCBkb3duIGlmIGZhbHNlXG4gIGdyaWQ6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIGNyZWF0ZSBhbiBldmVuIGdyaWQgaW50byB3aGljaCB0aGUgREFHIGlzIHBsYWNlZCAoY2lyY2xlOmZhbHNlIG9ubHkpXG4gIHNwYWNpbmdGYWN0b3I6IDEuNzUsXG4gIC8vIHBvc2l0aXZlIHNwYWNpbmcgZmFjdG9yLCBsYXJnZXIgPT4gbW9yZSBzcGFjZSBiZXR3ZWVuIG5vZGVzIChOLkIuIG4vYSBpZiBjYXVzZXMgb3ZlcmxhcClcbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIGF2b2lkT3ZlcmxhcDogdHJ1ZSxcbiAgLy8gcHJldmVudHMgbm9kZSBvdmVybGFwLCBtYXkgb3ZlcmZsb3cgYm91bmRpbmdCb3ggaWYgbm90IGVub3VnaCBzcGFjZVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxuICByb290czogdW5kZWZpbmVkLFxuICAvLyB0aGUgcm9vdHMgb2YgdGhlIHRyZWVzXG4gIGRlcHRoU29ydDogdW5kZWZpbmVkLFxuICAvLyBhIHNvcnRpbmcgZnVuY3Rpb24gdG8gb3JkZXIgbm9kZXMgYXQgZXF1YWwgZGVwdGguIGUuZy4gZnVuY3Rpb24oYSwgYil7IHJldHVybiBhLmRhdGEoJ3dlaWdodCcpIC0gYi5kYXRhKCd3ZWlnaHQnKSB9XG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWQsXG4gIGFuaW1hdGVGaWx0ZXI6IGZ1bmN0aW9uIGFuaW1hdGVGaWx0ZXIobm9kZSwgaSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyBhIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSBhbmltYXRlZC4gIEFsbCBub2RlcyBhbmltYXRlZCBieSBkZWZhdWx0IG9uIGFuaW1hdGUgZW5hYmxlZC4gIE5vbi1hbmltYXRlZCBub2RlcyBhcmUgcG9zaXRpb25lZCBpbW1lZGlhdGVseSB3aGVuIHRoZSBsYXlvdXQgc3RhcnRzXG4gIHJlYWR5OiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHJlYWR5XG4gIHN0b3A6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0c3RvcFxuICB0cmFuc2Zvcm06IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlLCBwb3NpdGlvbikge1xuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfSAvLyB0cmFuc2Zvcm0gYSBnaXZlbiBub2RlIHBvc2l0aW9uLiBVc2VmdWwgZm9yIGNoYW5naW5nIGZsb3cgZGlyZWN0aW9uIGluIGRpc2NyZXRlIGxheW91dHNcbn07XG5cbnZhciBkZXByZWNhdGVkT3B0aW9uRGVmYXVsdHMgPSB7XG4gIG1heGltYWw6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHNoaWZ0IG5vZGVzIGRvd24gdGhlaXIgbmF0dXJhbCBCRlMgZGVwdGhzIGluIG9yZGVyIHRvIGF2b2lkIHVwd2FyZHMgZWRnZXMgKERBR1Mgb25seSk7IHNldHRpbmcgYWN5Y2xpYyB0byB0cnVlIHNldHMgbWF4aW1hbCB0byB0cnVlIGFsc29cbiAgYWN5Y2xpYzogZmFsc2UgLy8gd2hldGhlciB0aGUgdHJlZSBpcyBhY3ljbGljIGFuZCB0aHVzIGEgbm9kZSBjb3VsZCBiZSBzaGlmdGVkIChkdWUgdG8gdGhlIG1heGltYWwgb3B0aW9uKSBtdWx0aXBsZSB0aW1lcyB3aXRob3V0IGNhdXNpbmcgYW4gaW5maW5pdGUgbG9vcDsgc2V0dGluZyB0byB0cnVlIHNldHMgbWF4aW1hbCB0byB0cnVlIGFsc287IGlmIHlvdSBhcmUgdW5jZXJ0YWluIHdoZXRoZXIgYSB0cmVlIGlzIGFjeWNsaWMsIHNldCB0byBmYWxzZSB0byBhdm9pZCBwb3RlbnRpYWwgaW5maW5pdGUgbG9vcHNcbn07XG5cbi8qIGVzbGludC1lbmFibGUgKi9cblxudmFyIGdldEluZm8gPSBmdW5jdGlvbiBnZXRJbmZvKGVsZSkge1xuICByZXR1cm4gZWxlLnNjcmF0Y2goJ2JyZWFkdGhmaXJzdCcpO1xufTtcbnZhciBzZXRJbmZvID0gZnVuY3Rpb24gc2V0SW5mbyhlbGUsIG9iaikge1xuICByZXR1cm4gZWxlLnNjcmF0Y2goJ2JyZWFkdGhmaXJzdCcsIG9iaik7XG59O1xuZnVuY3Rpb24gQnJlYWR0aEZpcnN0TGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cyQ3LCBkZXByZWNhdGVkT3B0aW9uRGVmYXVsdHMsIG9wdGlvbnMpO1xufVxuQnJlYWR0aEZpcnN0TGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwYXJhbXMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBvcHRpb25zID0gcGFyYW1zO1xuICB2YXIgY3kgPSBwYXJhbXMuY3k7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCkuZmlsdGVyKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuICFuLmlzUGFyZW50KCk7XG4gIH0pO1xuICB2YXIgZ3JhcGggPSBlbGVzO1xuICB2YXIgZGlyZWN0ZWQgPSBvcHRpb25zLmRpcmVjdGVkO1xuICB2YXIgbWF4aW1hbCA9IG9wdGlvbnMuYWN5Y2xpYyB8fCBvcHRpb25zLm1heGltYWwgfHwgb3B0aW9ucy5tYXhpbWFsQWRqdXN0bWVudHMgPiAwOyAvLyBtYXhpbWFsQWRqdXN0bWVudHMgZm9yIGNvbXBhdC4gdy8gb2xkIGNvZGU7IGFsc28sIHNldHRpbmcgYWN5Y2xpYyB0byB0cnVlIHNldHMgbWF4aW1hbCB0byB0cnVlXG5cbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG4gIHZhciByb290cztcbiAgaWYgKGVsZW1lbnRPckNvbGxlY3Rpb24ob3B0aW9ucy5yb290cykpIHtcbiAgICByb290cyA9IG9wdGlvbnMucm9vdHM7XG4gIH0gZWxzZSBpZiAoYXJyYXkob3B0aW9ucy5yb290cykpIHtcbiAgICB2YXIgcm9vdHNBcnJheSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0aW9ucy5yb290cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkID0gb3B0aW9ucy5yb290c1tpXTtcbiAgICAgIHZhciBlbGUgPSBjeS5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICByb290c0FycmF5LnB1c2goZWxlKTtcbiAgICB9XG4gICAgcm9vdHMgPSBjeS5jb2xsZWN0aW9uKHJvb3RzQXJyYXkpO1xuICB9IGVsc2UgaWYgKHN0cmluZyhvcHRpb25zLnJvb3RzKSkge1xuICAgIHJvb3RzID0gY3kuJChvcHRpb25zLnJvb3RzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoZGlyZWN0ZWQpIHtcbiAgICAgIHJvb3RzID0gbm9kZXMucm9vdHMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNvbXBvbmVudHMgPSBlbGVzLmNvbXBvbmVudHMoKTtcbiAgICAgIHJvb3RzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoX2kpIHtcbiAgICAgICAgdmFyIGNvbXAgPSBjb21wb25lbnRzW19pXTtcbiAgICAgICAgdmFyIG1heERlZ3JlZSA9IGNvbXAubWF4RGVncmVlKGZhbHNlKTtcbiAgICAgICAgdmFyIGNvbXBSb290cyA9IGNvbXAuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlLmRlZ3JlZShmYWxzZSkgPT09IG1heERlZ3JlZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJvb3RzID0gcm9vdHMuYWRkKGNvbXBSb290cyk7XG4gICAgICB9O1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIF9sb29wKF9pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIGRlcHRocyA9IFtdO1xuICB2YXIgZm91bmRCeUJmcyA9IHt9O1xuICB2YXIgYWRkVG9EZXB0aCA9IGZ1bmN0aW9uIGFkZFRvRGVwdGgoZWxlLCBkKSB7XG4gICAgaWYgKGRlcHRoc1tkXSA9PSBudWxsKSB7XG4gICAgICBkZXB0aHNbZF0gPSBbXTtcbiAgICB9XG4gICAgdmFyIGkgPSBkZXB0aHNbZF0ubGVuZ3RoO1xuICAgIGRlcHRoc1tkXS5wdXNoKGVsZSk7XG4gICAgc2V0SW5mbyhlbGUsIHtcbiAgICAgIGluZGV4OiBpLFxuICAgICAgZGVwdGg6IGRcbiAgICB9KTtcbiAgfTtcbiAgdmFyIGNoYW5nZURlcHRoID0gZnVuY3Rpb24gY2hhbmdlRGVwdGgoZWxlLCBuZXdEZXB0aCkge1xuICAgIHZhciBfZ2V0SW5mbyA9IGdldEluZm8oZWxlKSxcbiAgICAgIGRlcHRoID0gX2dldEluZm8uZGVwdGgsXG4gICAgICBpbmRleCA9IF9nZXRJbmZvLmluZGV4O1xuICAgIGRlcHRoc1tkZXB0aF1baW5kZXhdID0gbnVsbDtcbiAgICBhZGRUb0RlcHRoKGVsZSwgbmV3RGVwdGgpO1xuICB9O1xuXG4gIC8vIGZpbmQgdGhlIGRlcHRocyBvZiB0aGUgbm9kZXNcbiAgZ3JhcGguYmZzKHtcbiAgICByb290czogcm9vdHMsXG4gICAgZGlyZWN0ZWQ6IG9wdGlvbnMuZGlyZWN0ZWQsXG4gICAgdmlzaXQ6IGZ1bmN0aW9uIHZpc2l0KG5vZGUsIGVkZ2UsIHBOb2RlLCBpLCBkZXB0aCkge1xuICAgICAgdmFyIGVsZSA9IG5vZGVbMF07XG4gICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICAgIGFkZFRvRGVwdGgoZWxlLCBkZXB0aCk7XG4gICAgICBmb3VuZEJ5QmZzW2lkXSA9IHRydWU7XG4gICAgfVxuICB9KTtcblxuICAvLyBjaGVjayBmb3Igbm9kZXMgbm90IGZvdW5kIGJ5IGJmc1xuICB2YXIgb3JwaGFuTm9kZXMgPSBbXTtcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBfZWxlID0gbm9kZXNbX2kyXTtcbiAgICBpZiAoZm91bmRCeUJmc1tfZWxlLmlkKCldKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3JwaGFuTm9kZXMucHVzaChfZWxlKTtcbiAgICB9XG4gIH1cblxuICAvLyBhc3NpZ24gdGhlIG5vZGVzIGEgZGVwdGggYW5kIGluZGV4XG5cbiAgdmFyIGFzc2lnbkRlcHRoc0F0ID0gZnVuY3Rpb24gYXNzaWduRGVwdGhzQXQoaSkge1xuICAgIHZhciBlbGVzID0gZGVwdGhzW2ldO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWxlcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIF9lbGUyID0gZWxlc1tqXTtcbiAgICAgIGlmIChfZWxlMiA9PSBudWxsKSB7XG4gICAgICAgIGVsZXMuc3BsaWNlKGosIDEpO1xuICAgICAgICBqLS07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgc2V0SW5mbyhfZWxlMiwge1xuICAgICAgICBkZXB0aDogaSxcbiAgICAgICAgaW5kZXg6IGpcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgdmFyIGFzc2lnbkRlcHRocyA9IGZ1bmN0aW9uIGFzc2lnbkRlcHRocygpIHtcbiAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBkZXB0aHMubGVuZ3RoOyBfaTMrKykge1xuICAgICAgYXNzaWduRGVwdGhzQXQoX2kzKTtcbiAgICB9XG4gIH07XG4gIHZhciBhZGp1c3RNYXhpbWFsbHkgPSBmdW5jdGlvbiBhZGp1c3RNYXhpbWFsbHkoZWxlLCBzaGlmdGVkKSB7XG4gICAgdmFyIGVJbmZvID0gZ2V0SW5mbyhlbGUpO1xuICAgIHZhciBpbmNvbWVycyA9IGVsZS5pbmNvbWVycygpLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcbiAgICAgIHJldHVybiBlbC5pc05vZGUoKSAmJiBlbGVzLmhhcyhlbCk7XG4gICAgfSk7XG4gICAgdmFyIG1heERlcHRoID0gLTE7XG4gICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBpbmNvbWVycy5sZW5ndGg7IGsrKykge1xuICAgICAgdmFyIGluY21yID0gaW5jb21lcnNba107XG4gICAgICB2YXIgaUluZm8gPSBnZXRJbmZvKGluY21yKTtcbiAgICAgIG1heERlcHRoID0gTWF0aC5tYXgobWF4RGVwdGgsIGlJbmZvLmRlcHRoKTtcbiAgICB9XG4gICAgaWYgKGVJbmZvLmRlcHRoIDw9IG1heERlcHRoKSB7XG4gICAgICBpZiAoIW9wdGlvbnMuYWN5Y2xpYyAmJiBzaGlmdGVkW2lkXSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBuZXdEZXB0aCA9IG1heERlcHRoICsgMTtcbiAgICAgIGNoYW5nZURlcHRoKGVsZSwgbmV3RGVwdGgpO1xuICAgICAgc2hpZnRlZFtpZF0gPSBuZXdEZXB0aDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLy8gZm9yIHRoZSBkaXJlY3RlZCBjYXNlLCB0cnkgdG8gbWFrZSB0aGUgZWRnZXMgYWxsIGdvIGRvd24gKGkuZS4gZGVwdGggaSA9PiBkZXB0aCBpICsgMSlcbiAgaWYgKGRpcmVjdGVkICYmIG1heGltYWwpIHtcbiAgICB2YXIgUSA9IFtdO1xuICAgIHZhciBzaGlmdGVkID0ge307XG4gICAgdmFyIGVucXVldWUgPSBmdW5jdGlvbiBlbnF1ZXVlKG4pIHtcbiAgICAgIHJldHVybiBRLnB1c2gobik7XG4gICAgfTtcbiAgICB2YXIgZGVxdWV1ZSA9IGZ1bmN0aW9uIGRlcXVldWUoKSB7XG4gICAgICByZXR1cm4gUS5zaGlmdCgpO1xuICAgIH07XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgcmV0dXJuIFEucHVzaChuKTtcbiAgICB9KTtcbiAgICB3aGlsZSAoUS5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgX2VsZTMgPSBkZXF1ZXVlKCk7XG4gICAgICB2YXIgZGlkU2hpZnQgPSBhZGp1c3RNYXhpbWFsbHkoX2VsZTMsIHNoaWZ0ZWQpO1xuICAgICAgaWYgKGRpZFNoaWZ0KSB7XG4gICAgICAgIF9lbGUzLm91dGdvZXJzKCkuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIHJldHVybiBlbC5pc05vZGUoKSAmJiBlbGVzLmhhcyhlbCk7XG4gICAgICAgIH0pLmZvckVhY2goZW5xdWV1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGRpZFNoaWZ0ID09PSBudWxsKSB7XG4gICAgICAgIHdhcm4oJ0RldGVjdGVkIGRvdWJsZSBtYXhpbWFsIHNoaWZ0IGZvciBub2RlIGAnICsgX2VsZTMuaWQoKSArICdgLiAgQmFpbGluZyBtYXhpbWFsIGFkanVzdG1lbnQgZHVlIHRvIGN5Y2xlLiAgVXNlIGBvcHRpb25zLm1heGltYWw6IHRydWVgIG9ubHkgb24gREFHcy4nKTtcbiAgICAgICAgYnJlYWs7IC8vIGV4aXQgb24gZmFpbHVyZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzc2lnbkRlcHRocygpOyAvLyBjbGVhciBob2xlc1xuXG4gIC8vIGZpbmQgbWluIGRpc3RhbmNlIHdlIG5lZWQgdG8gbGVhdmUgYmV0d2VlbiBub2Rlc1xuICB2YXIgbWluRGlzdGFuY2UgPSAwO1xuICBpZiAob3B0aW9ucy5hdm9pZE92ZXJsYXApIHtcbiAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBub2Rlcy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgICB2YXIgbiA9IG5vZGVzW19pNF07XG4gICAgICB2YXIgbmJiID0gbi5sYXlvdXREaW1lbnNpb25zKG9wdGlvbnMpO1xuICAgICAgdmFyIHcgPSBuYmIudztcbiAgICAgIHZhciBoID0gbmJiLmg7XG4gICAgICBtaW5EaXN0YW5jZSA9IE1hdGgubWF4KG1pbkRpc3RhbmNlLCB3LCBoKTtcbiAgICB9XG4gIH1cblxuICAvLyBnZXQgdGhlIHdlaWdodGVkIHBlcmNlbnQgZm9yIGFuIGVsZW1lbnQgYmFzZWQgb24gaXRzIGNvbm5lY3Rpdml0eSB0byBvdGhlciBsZXZlbHNcbiAgdmFyIGNhY2hlZFdlaWdodGVkUGVyY2VudCA9IHt9O1xuICB2YXIgZ2V0V2VpZ2h0ZWRQZXJjZW50ID0gZnVuY3Rpb24gZ2V0V2VpZ2h0ZWRQZXJjZW50KGVsZSkge1xuICAgIGlmIChjYWNoZWRXZWlnaHRlZFBlcmNlbnRbZWxlLmlkKCldKSB7XG4gICAgICByZXR1cm4gY2FjaGVkV2VpZ2h0ZWRQZXJjZW50W2VsZS5pZCgpXTtcbiAgICB9XG4gICAgdmFyIGVsZURlcHRoID0gZ2V0SW5mbyhlbGUpLmRlcHRoO1xuICAgIHZhciBuZWlnaGJvcnMgPSBlbGUubmVpZ2hib3Job29kKCk7XG4gICAgdmFyIHBlcmNlbnQgPSAwO1xuICAgIHZhciBzYW1wbGVzID0gMDtcbiAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBuZWlnaGJvcnMubGVuZ3RoOyBfaTUrKykge1xuICAgICAgdmFyIG5laWdoYm9yID0gbmVpZ2hib3JzW19pNV07XG4gICAgICBpZiAobmVpZ2hib3IuaXNFZGdlKCkgfHwgbmVpZ2hib3IuaXNQYXJlbnQoKSB8fCAhbm9kZXMuaGFzKG5laWdoYm9yKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBiZiA9IGdldEluZm8obmVpZ2hib3IpO1xuICAgICAgaWYgKGJmID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBiZi5pbmRleDtcbiAgICAgIHZhciBkZXB0aCA9IGJmLmRlcHRoO1xuXG4gICAgICAvLyB1bmFzc2lnbmVkIG5laWdoYm91cnMgc2hvdWxkbid0IGFmZmVjdCB0aGUgb3JkZXJpbmdcbiAgICAgIGlmIChpbmRleCA9PSBudWxsIHx8IGRlcHRoID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgbkRlcHRoID0gZGVwdGhzW2RlcHRoXS5sZW5ndGg7XG4gICAgICBpZiAoZGVwdGggPCBlbGVEZXB0aCkge1xuICAgICAgICAvLyBvbmx5IGdldCBpbmZsdWVuY2VkIGJ5IGVsZW1lbnRzIGFib3ZlXG4gICAgICAgIHBlcmNlbnQgKz0gaW5kZXggLyBuRGVwdGg7XG4gICAgICAgIHNhbXBsZXMrKztcbiAgICAgIH1cbiAgICB9XG4gICAgc2FtcGxlcyA9IE1hdGgubWF4KDEsIHNhbXBsZXMpO1xuICAgIHBlcmNlbnQgPSBwZXJjZW50IC8gc2FtcGxlcztcbiAgICBpZiAoc2FtcGxlcyA9PT0gMCkge1xuICAgICAgLy8gcHV0IGxvbmUgbm9kZXMgYXQgdGhlIHN0YXJ0XG4gICAgICBwZXJjZW50ID0gMDtcbiAgICB9XG4gICAgY2FjaGVkV2VpZ2h0ZWRQZXJjZW50W2VsZS5pZCgpXSA9IHBlcmNlbnQ7XG4gICAgcmV0dXJuIHBlcmNlbnQ7XG4gIH07XG5cbiAgLy8gcmVhcnJhbmdlIHRoZSBpbmRpY2VzIGluIGVhY2ggZGVwdGggbGV2ZWwgYmFzZWQgb24gY29ubmVjdGl2aXR5XG5cbiAgdmFyIHNvcnRGbiA9IGZ1bmN0aW9uIHNvcnRGbihhLCBiKSB7XG4gICAgdmFyIGFwY3QgPSBnZXRXZWlnaHRlZFBlcmNlbnQoYSk7XG4gICAgdmFyIGJwY3QgPSBnZXRXZWlnaHRlZFBlcmNlbnQoYik7XG4gICAgdmFyIGRpZmYgPSBhcGN0IC0gYnBjdDtcbiAgICBpZiAoZGlmZiA9PT0gMCkge1xuICAgICAgcmV0dXJuIGFzY2VuZGluZyhhLmlkKCksIGIuaWQoKSk7IC8vIG1ha2Ugc3VyZSBzb3J0IGRvZXNuJ3QgaGF2ZSBkb24ndC1jYXJlIGNvbXBhcmlzb25zXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkaWZmO1xuICAgIH1cbiAgfTtcbiAgaWYgKG9wdGlvbnMuZGVwdGhTb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBzb3J0Rm4gPSBvcHRpb25zLmRlcHRoU29ydDtcbiAgfVxuXG4gIC8vIHNvcnQgZWFjaCBsZXZlbCB0byBtYWtlIGNvbm5lY3RlZCBub2RlcyBjbG9zZXJcbiAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgZGVwdGhzLmxlbmd0aDsgX2k2KyspIHtcbiAgICBkZXB0aHNbX2k2XS5zb3J0KHNvcnRGbik7XG4gICAgYXNzaWduRGVwdGhzQXQoX2k2KTtcbiAgfVxuXG4gIC8vIGFzc2lnbiBvcnBoYW4gbm9kZXMgdG8gYSBuZXcgdG9wLWxldmVsIGRlcHRoXG4gIHZhciBvcnBoYW5EZXB0aCA9IFtdO1xuICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCBvcnBoYW5Ob2Rlcy5sZW5ndGg7IF9pNysrKSB7XG4gICAgb3JwaGFuRGVwdGgucHVzaChvcnBoYW5Ob2Rlc1tfaTddKTtcbiAgfVxuICBkZXB0aHMudW5zaGlmdChvcnBoYW5EZXB0aCk7XG4gIGFzc2lnbkRlcHRocygpO1xuICB2YXIgYmlnZ2VzdERlcHRoU2l6ZSA9IDA7XG4gIGZvciAodmFyIF9pOCA9IDA7IF9pOCA8IGRlcHRocy5sZW5ndGg7IF9pOCsrKSB7XG4gICAgYmlnZ2VzdERlcHRoU2l6ZSA9IE1hdGgubWF4KGRlcHRoc1tfaThdLmxlbmd0aCwgYmlnZ2VzdERlcHRoU2l6ZSk7XG4gIH1cbiAgdmFyIGNlbnRlciA9IHtcbiAgICB4OiBiYi54MSArIGJiLncgLyAyLFxuICAgIHk6IGJiLngxICsgYmIuaCAvIDJcbiAgfTtcbiAgdmFyIG1heERlcHRoU2l6ZSA9IGRlcHRocy5yZWR1Y2UoZnVuY3Rpb24gKG1heCwgZWxlcykge1xuICAgIHJldHVybiBNYXRoLm1heChtYXgsIGVsZXMubGVuZ3RoKTtcbiAgfSwgMCk7XG4gIHZhciBnZXRQb3NpdGlvbiA9IGZ1bmN0aW9uIGdldFBvc2l0aW9uKGVsZSkge1xuICAgIHZhciBfZ2V0SW5mbzIgPSBnZXRJbmZvKGVsZSksXG4gICAgICBkZXB0aCA9IF9nZXRJbmZvMi5kZXB0aCxcbiAgICAgIGluZGV4ID0gX2dldEluZm8yLmluZGV4O1xuICAgIHZhciBkZXB0aFNpemUgPSBkZXB0aHNbZGVwdGhdLmxlbmd0aDtcbiAgICB2YXIgZGlzdGFuY2VYID0gTWF0aC5tYXgoYmIudyAvICgob3B0aW9ucy5ncmlkID8gbWF4RGVwdGhTaXplIDogZGVwdGhTaXplKSArIDEpLCBtaW5EaXN0YW5jZSk7XG4gICAgdmFyIGRpc3RhbmNlWSA9IE1hdGgubWF4KGJiLmggLyAoZGVwdGhzLmxlbmd0aCArIDEpLCBtaW5EaXN0YW5jZSk7XG4gICAgdmFyIHJhZGl1c1N0ZXBTaXplID0gTWF0aC5taW4oYmIudyAvIDIgLyBkZXB0aHMubGVuZ3RoLCBiYi5oIC8gMiAvIGRlcHRocy5sZW5ndGgpO1xuICAgIHJhZGl1c1N0ZXBTaXplID0gTWF0aC5tYXgocmFkaXVzU3RlcFNpemUsIG1pbkRpc3RhbmNlKTtcbiAgICBpZiAoIW9wdGlvbnMuY2lyY2xlKSB7XG4gICAgICB2YXIgZXBvcyA9IHtcbiAgICAgICAgeDogY2VudGVyLnggKyAoaW5kZXggKyAxIC0gKGRlcHRoU2l6ZSArIDEpIC8gMikgKiBkaXN0YW5jZVgsXG4gICAgICAgIHk6IChkZXB0aCArIDEpICogZGlzdGFuY2VZXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGVwb3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByYWRpdXMgPSByYWRpdXNTdGVwU2l6ZSAqIGRlcHRoICsgcmFkaXVzU3RlcFNpemUgLSAoZGVwdGhzLmxlbmd0aCA+IDAgJiYgZGVwdGhzWzBdLmxlbmd0aCA8PSAzID8gcmFkaXVzU3RlcFNpemUgLyAyIDogMCk7XG4gICAgICB2YXIgdGhldGEgPSAyICogTWF0aC5QSSAvIGRlcHRoc1tkZXB0aF0ubGVuZ3RoICogaW5kZXg7XG4gICAgICBpZiAoZGVwdGggPT09IDAgJiYgZGVwdGhzWzBdLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByYWRpdXMgPSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogY2VudGVyLnggKyByYWRpdXMgKiBNYXRoLmNvcyh0aGV0YSksXG4gICAgICAgIHk6IGNlbnRlci55ICsgcmFkaXVzICogTWF0aC5zaW4odGhldGEpXG4gICAgICB9O1xuICAgIH1cbiAgfTtcbiAgZWxlcy5ub2RlcygpLmxheW91dFBvc2l0aW9ucyh0aGlzLCBvcHRpb25zLCBnZXRQb3NpdGlvbik7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxudmFyIGRlZmF1bHRzJDYgPSB7XG4gIGZpdDogdHJ1ZSxcbiAgLy8gd2hldGhlciB0byBmaXQgdGhlIHZpZXdwb3J0IHRvIHRoZSBncmFwaFxuICBwYWRkaW5nOiAzMCxcbiAgLy8gdGhlIHBhZGRpbmcgb24gZml0XG4gIGJvdW5kaW5nQm94OiB1bmRlZmluZWQsXG4gIC8vIGNvbnN0cmFpbiBsYXlvdXQgYm91bmRzOyB7IHgxLCB5MSwgeDIsIHkyIH0gb3IgeyB4MSwgeTEsIHcsIGggfVxuICBhdm9pZE92ZXJsYXA6IHRydWUsXG4gIC8vIHByZXZlbnRzIG5vZGUgb3ZlcmxhcCwgbWF5IG92ZXJmbG93IGJvdW5kaW5nQm94IGFuZCByYWRpdXMgaWYgbm90IGVub3VnaCBzcGFjZVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxuICBzcGFjaW5nRmFjdG9yOiB1bmRlZmluZWQsXG4gIC8vIEFwcGxpZXMgYSBtdWx0aXBsaWNhdGl2ZSBmYWN0b3IgKD4wKSB0byBleHBhbmQgb3IgY29tcHJlc3MgdGhlIG92ZXJhbGwgYXJlYSB0aGF0IHRoZSBub2RlcyB0YWtlIHVwXG4gIHJhZGl1czogdW5kZWZpbmVkLFxuICAvLyB0aGUgcmFkaXVzIG9mIHRoZSBjaXJjbGVcbiAgc3RhcnRBbmdsZTogMyAvIDIgKiBNYXRoLlBJLFxuICAvLyB3aGVyZSBub2RlcyBzdGFydCBpbiByYWRpYW5zXG4gIHN3ZWVwOiB1bmRlZmluZWQsXG4gIC8vIGhvdyBtYW55IHJhZGlhbnMgc2hvdWxkIGJlIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGUgKGRlZmF1bHRzIHRvIGZ1bGwgY2lyY2xlKVxuICBjbG9ja3dpc2U6IHRydWUsXG4gIC8vIHdoZXRoZXIgdGhlIGxheW91dCBzaG91bGQgZ28gY2xvY2t3aXNlICh0cnVlKSBvciBjb3VudGVyY2xvY2t3aXNlL2FudGljbG9ja3dpc2UgKGZhbHNlKVxuICBzb3J0OiB1bmRlZmluZWQsXG4gIC8vIGEgc29ydGluZyBmdW5jdGlvbiB0byBvcmRlciB0aGUgbm9kZXM7IGUuZy4gZnVuY3Rpb24oYSwgYil7IHJldHVybiBhLmRhdGEoJ3dlaWdodCcpIC0gYi5kYXRhKCd3ZWlnaHQnKSB9XG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0cyBcbn07XG5cbmZ1bmN0aW9uIENpcmNsZUxheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMkNiwgb3B0aW9ucyk7XG59XG5DaXJjbGVMYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHBhcmFtcyA9IHRoaXMub3B0aW9ucztcbiAgdmFyIG9wdGlvbnMgPSBwYXJhbXM7XG4gIHZhciBjeSA9IHBhcmFtcy5jeTtcbiAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG4gIHZhciBjbG9ja3dpc2UgPSBvcHRpb25zLmNvdW50ZXJjbG9ja3dpc2UgIT09IHVuZGVmaW5lZCA/ICFvcHRpb25zLmNvdW50ZXJjbG9ja3dpc2UgOiBvcHRpb25zLmNsb2Nrd2lzZTtcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpLm5vdCgnOnBhcmVudCcpO1xuICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgbm9kZXMgPSBub2Rlcy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gIH1cbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG4gIHZhciBjZW50ZXIgPSB7XG4gICAgeDogYmIueDEgKyBiYi53IC8gMixcbiAgICB5OiBiYi55MSArIGJiLmggLyAyXG4gIH07XG4gIHZhciBzd2VlcCA9IG9wdGlvbnMuc3dlZXAgPT09IHVuZGVmaW5lZCA/IDIgKiBNYXRoLlBJIC0gMiAqIE1hdGguUEkgLyBub2Rlcy5sZW5ndGggOiBvcHRpb25zLnN3ZWVwO1xuICB2YXIgZFRoZXRhID0gc3dlZXAgLyBNYXRoLm1heCgxLCBub2Rlcy5sZW5ndGggLSAxKTtcbiAgdmFyIHI7XG4gIHZhciBtaW5EaXN0YW5jZSA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbiA9IG5vZGVzW2ldO1xuICAgIHZhciBuYmIgPSBuLmxheW91dERpbWVuc2lvbnMob3B0aW9ucyk7XG4gICAgdmFyIHcgPSBuYmIudztcbiAgICB2YXIgaCA9IG5iYi5oO1xuICAgIG1pbkRpc3RhbmNlID0gTWF0aC5tYXgobWluRGlzdGFuY2UsIHcsIGgpO1xuICB9XG4gIGlmIChudW1iZXIkMShvcHRpb25zLnJhZGl1cykpIHtcbiAgICByID0gb3B0aW9ucy5yYWRpdXM7XG4gIH0gZWxzZSBpZiAobm9kZXMubGVuZ3RoIDw9IDEpIHtcbiAgICByID0gMDtcbiAgfSBlbHNlIHtcbiAgICByID0gTWF0aC5taW4oYmIuaCwgYmIudykgLyAyIC0gbWluRGlzdGFuY2U7XG4gIH1cblxuICAvLyBjYWxjdWxhdGUgdGhlIHJhZGl1c1xuICBpZiAobm9kZXMubGVuZ3RoID4gMSAmJiBvcHRpb25zLmF2b2lkT3ZlcmxhcCkge1xuICAgIC8vIGJ1dCBvbmx5IGlmIG1vcmUgdGhhbiBvbmUgbm9kZSAoY2FuJ3Qgb3ZlcmxhcClcbiAgICBtaW5EaXN0YW5jZSAqPSAxLjc1OyAvLyBqdXN0IHRvIGhhdmUgc29tZSBuaWNlIHNwYWNpbmdcblxuICAgIHZhciBkY29zID0gTWF0aC5jb3MoZFRoZXRhKSAtIE1hdGguY29zKDApO1xuICAgIHZhciBkc2luID0gTWF0aC5zaW4oZFRoZXRhKSAtIE1hdGguc2luKDApO1xuICAgIHZhciByTWluID0gTWF0aC5zcXJ0KG1pbkRpc3RhbmNlICogbWluRGlzdGFuY2UgLyAoZGNvcyAqIGRjb3MgKyBkc2luICogZHNpbikpOyAvLyBzLnQuIG5vIG5vZGVzIG92ZXJsYXBwaW5nXG4gICAgciA9IE1hdGgubWF4KHJNaW4sIHIpO1xuICB9XG4gIHZhciBnZXRQb3MgPSBmdW5jdGlvbiBnZXRQb3MoZWxlLCBpKSB7XG4gICAgdmFyIHRoZXRhID0gb3B0aW9ucy5zdGFydEFuZ2xlICsgaSAqIGRUaGV0YSAqIChjbG9ja3dpc2UgPyAxIDogLTEpO1xuICAgIHZhciByeCA9IHIgKiBNYXRoLmNvcyh0aGV0YSk7XG4gICAgdmFyIHJ5ID0gciAqIE1hdGguc2luKHRoZXRhKTtcbiAgICB2YXIgcG9zID0ge1xuICAgICAgeDogY2VudGVyLnggKyByeCxcbiAgICAgIHk6IGNlbnRlci55ICsgcnlcbiAgICB9O1xuICAgIHJldHVybiBwb3M7XG4gIH07XG4gIGVsZXMubm9kZXMoKS5sYXlvdXRQb3NpdGlvbnModGhpcywgb3B0aW9ucywgZ2V0UG9zKTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG52YXIgZGVmYXVsdHMkNSA9IHtcbiAgZml0OiB0cnVlLFxuICAvLyB3aGV0aGVyIHRvIGZpdCB0aGUgdmlld3BvcnQgdG8gdGhlIGdyYXBoXG4gIHBhZGRpbmc6IDMwLFxuICAvLyB0aGUgcGFkZGluZyBvbiBmaXRcbiAgc3RhcnRBbmdsZTogMyAvIDIgKiBNYXRoLlBJLFxuICAvLyB3aGVyZSBub2RlcyBzdGFydCBpbiByYWRpYW5zXG4gIHN3ZWVwOiB1bmRlZmluZWQsXG4gIC8vIGhvdyBtYW55IHJhZGlhbnMgc2hvdWxkIGJlIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGUgKGRlZmF1bHRzIHRvIGZ1bGwgY2lyY2xlKVxuICBjbG9ja3dpc2U6IHRydWUsXG4gIC8vIHdoZXRoZXIgdGhlIGxheW91dCBzaG91bGQgZ28gY2xvY2t3aXNlICh0cnVlKSBvciBjb3VudGVyY2xvY2t3aXNlL2FudGljbG9ja3dpc2UgKGZhbHNlKVxuICBlcXVpZGlzdGFudDogZmFsc2UsXG4gIC8vIHdoZXRoZXIgbGV2ZWxzIGhhdmUgYW4gZXF1YWwgcmFkaWFsIGRpc3RhbmNlIGJldHdlbiB0aGVtLCBtYXkgY2F1c2UgYm91bmRpbmcgYm94IG92ZXJmbG93XG4gIG1pbk5vZGVTcGFjaW5nOiAxMCxcbiAgLy8gbWluIHNwYWNpbmcgYmV0d2VlbiBvdXRzaWRlIG9mIG5vZGVzICh1c2VkIGZvciByYWRpdXMgYWRqdXN0bWVudClcbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIGF2b2lkT3ZlcmxhcDogdHJ1ZSxcbiAgLy8gcHJldmVudHMgbm9kZSBvdmVybGFwLCBtYXkgb3ZlcmZsb3cgYm91bmRpbmdCb3ggaWYgbm90IGVub3VnaCBzcGFjZVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxuICBoZWlnaHQ6IHVuZGVmaW5lZCxcbiAgLy8gaGVpZ2h0IG9mIGxheW91dCBhcmVhIChvdmVycmlkZXMgY29udGFpbmVyIGhlaWdodClcbiAgd2lkdGg6IHVuZGVmaW5lZCxcbiAgLy8gd2lkdGggb2YgbGF5b3V0IGFyZWEgKG92ZXJyaWRlcyBjb250YWluZXIgd2lkdGgpXG4gIHNwYWNpbmdGYWN0b3I6IHVuZGVmaW5lZCxcbiAgLy8gQXBwbGllcyBhIG11bHRpcGxpY2F0aXZlIGZhY3RvciAoPjApIHRvIGV4cGFuZCBvciBjb21wcmVzcyB0aGUgb3ZlcmFsbCBhcmVhIHRoYXQgdGhlIG5vZGVzIHRha2UgdXBcbiAgY29uY2VudHJpYzogZnVuY3Rpb24gY29uY2VudHJpYyhub2RlKSB7XG4gICAgLy8gcmV0dXJucyBudW1lcmljIHZhbHVlIGZvciBlYWNoIG5vZGUsIHBsYWNpbmcgaGlnaGVyIG5vZGVzIGluIGxldmVscyB0b3dhcmRzIHRoZSBjZW50cmVcbiAgICByZXR1cm4gbm9kZS5kZWdyZWUoKTtcbiAgfSxcbiAgbGV2ZWxXaWR0aDogZnVuY3Rpb24gbGV2ZWxXaWR0aChub2Rlcykge1xuICAgIC8vIHRoZSB2YXJpYXRpb24gb2YgY29uY2VudHJpYyB2YWx1ZXMgaW4gZWFjaCBsZXZlbFxuICAgIHJldHVybiBub2Rlcy5tYXhEZWdyZWUoKSAvIDQ7XG4gIH0sXG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0c1xufTtcblxuZnVuY3Rpb24gQ29uY2VudHJpY0xheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMkNSwgb3B0aW9ucyk7XG59XG5Db25jZW50cmljTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwYXJhbXMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBvcHRpb25zID0gcGFyYW1zO1xuICB2YXIgY2xvY2t3aXNlID0gb3B0aW9ucy5jb3VudGVyY2xvY2t3aXNlICE9PSB1bmRlZmluZWQgPyAhb3B0aW9ucy5jb3VudGVyY2xvY2t3aXNlIDogb3B0aW9ucy5jbG9ja3dpc2U7XG4gIHZhciBjeSA9IHBhcmFtcy5jeTtcbiAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG4gIHZhciBub2RlcyA9IGVsZXMubm9kZXMoKS5ub3QoJzpwYXJlbnQnKTtcbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG4gIHZhciBjZW50ZXIgPSB7XG4gICAgeDogYmIueDEgKyBiYi53IC8gMixcbiAgICB5OiBiYi55MSArIGJiLmggLyAyXG4gIH07XG4gIHZhciBub2RlVmFsdWVzID0gW107IC8vIHsgbm9kZSwgdmFsdWUgfVxuICB2YXIgbWF4Tm9kZVNpemUgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICB2YXIgdmFsdWUgPSB2b2lkIDA7XG5cbiAgICAvLyBjYWxjdWxhdGUgdGhlIG5vZGUgdmFsdWVcbiAgICB2YWx1ZSA9IG9wdGlvbnMuY29uY2VudHJpYyhub2RlKTtcbiAgICBub2RlVmFsdWVzLnB1c2goe1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgbm9kZTogbm9kZVxuICAgIH0pO1xuXG4gICAgLy8gZm9yIHN0eWxlIG1hcHBpbmdcbiAgICBub2RlLl9wcml2YXRlLnNjcmF0Y2guY29uY2VudHJpYyA9IHZhbHVlO1xuICB9XG5cbiAgLy8gaW4gY2FzZSB3ZSB1c2VkIHRoZSBgY29uY2VudHJpY2AgaW4gc3R5bGVcbiAgbm9kZXMudXBkYXRlU3R5bGUoKTtcblxuICAvLyBjYWxjdWxhdGUgbWF4IHNpemUgbm93IGJhc2VkIG9uIHBvdGVudGlhbGx5IHVwZGF0ZWQgbWFwcGVyc1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbm9kZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIF9ub2RlID0gbm9kZXNbX2ldO1xuICAgIHZhciBuYmIgPSBfbm9kZS5sYXlvdXREaW1lbnNpb25zKG9wdGlvbnMpO1xuICAgIG1heE5vZGVTaXplID0gTWF0aC5tYXgobWF4Tm9kZVNpemUsIG5iYi53LCBuYmIuaCk7XG4gIH1cblxuICAvLyBzb3J0IG5vZGUgdmFsdWVzIGluIGRlc2NyZWFzaW5nIG9yZGVyXG4gIG5vZGVWYWx1ZXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLnZhbHVlIC0gYS52YWx1ZTtcbiAgfSk7XG4gIHZhciBsZXZlbFdpZHRoID0gb3B0aW9ucy5sZXZlbFdpZHRoKG5vZGVzKTtcblxuICAvLyBwdXQgdGhlIHZhbHVlcyBpbnRvIGxldmVsc1xuICB2YXIgbGV2ZWxzID0gW1tdXTtcbiAgdmFyIGN1cnJlbnRMZXZlbCA9IGxldmVsc1swXTtcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZVZhbHVlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIHZhbCA9IG5vZGVWYWx1ZXNbX2kyXTtcbiAgICBpZiAoY3VycmVudExldmVsLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBkaWZmID0gTWF0aC5hYnMoY3VycmVudExldmVsWzBdLnZhbHVlIC0gdmFsLnZhbHVlKTtcbiAgICAgIGlmIChkaWZmID49IGxldmVsV2lkdGgpIHtcbiAgICAgICAgY3VycmVudExldmVsID0gW107XG4gICAgICAgIGxldmVscy5wdXNoKGN1cnJlbnRMZXZlbCk7XG4gICAgICB9XG4gICAgfVxuICAgIGN1cnJlbnRMZXZlbC5wdXNoKHZhbCk7XG4gIH1cblxuICAvLyBjcmVhdGUgcG9zaXRpb25zIGZyb20gbGV2ZWxzXG5cbiAgdmFyIG1pbkRpc3QgPSBtYXhOb2RlU2l6ZSArIG9wdGlvbnMubWluTm9kZVNwYWNpbmc7IC8vIG1pbiBkaXN0IGJldHdlZW4gbm9kZXNcblxuICBpZiAoIW9wdGlvbnMuYXZvaWRPdmVybGFwKSB7XG4gICAgLy8gdGhlbiBzdHJpY3RseSBjb25zdHJhaW4gdG8gYmJcbiAgICB2YXIgZmlyc3RMdmxIYXNNdWx0aSA9IGxldmVscy5sZW5ndGggPiAwICYmIGxldmVsc1swXS5sZW5ndGggPiAxO1xuICAgIHZhciBtYXhSID0gTWF0aC5taW4oYmIudywgYmIuaCkgLyAyIC0gbWluRGlzdDtcbiAgICB2YXIgclN0ZXAgPSBtYXhSIC8gKGxldmVscy5sZW5ndGggKyBmaXJzdEx2bEhhc011bHRpID8gMSA6IDApO1xuICAgIG1pbkRpc3QgPSBNYXRoLm1pbihtaW5EaXN0LCByU3RlcCk7XG4gIH1cblxuICAvLyBmaW5kIHRoZSBtZXRyaWNzIGZvciBlYWNoIGxldmVsXG4gIHZhciByID0gMDtcbiAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbGV2ZWxzLmxlbmd0aDsgX2kzKyspIHtcbiAgICB2YXIgbGV2ZWwgPSBsZXZlbHNbX2kzXTtcbiAgICB2YXIgc3dlZXAgPSBvcHRpb25zLnN3ZWVwID09PSB1bmRlZmluZWQgPyAyICogTWF0aC5QSSAtIDIgKiBNYXRoLlBJIC8gbGV2ZWwubGVuZ3RoIDogb3B0aW9ucy5zd2VlcDtcbiAgICB2YXIgZFRoZXRhID0gbGV2ZWwuZFRoZXRhID0gc3dlZXAgLyBNYXRoLm1heCgxLCBsZXZlbC5sZW5ndGggLSAxKTtcblxuICAgIC8vIGNhbGN1bGF0ZSB0aGUgcmFkaXVzXG4gICAgaWYgKGxldmVsLmxlbmd0aCA+IDEgJiYgb3B0aW9ucy5hdm9pZE92ZXJsYXApIHtcbiAgICAgIC8vIGJ1dCBvbmx5IGlmIG1vcmUgdGhhbiBvbmUgbm9kZSAoY2FuJ3Qgb3ZlcmxhcClcbiAgICAgIHZhciBkY29zID0gTWF0aC5jb3MoZFRoZXRhKSAtIE1hdGguY29zKDApO1xuICAgICAgdmFyIGRzaW4gPSBNYXRoLnNpbihkVGhldGEpIC0gTWF0aC5zaW4oMCk7XG4gICAgICB2YXIgck1pbiA9IE1hdGguc3FydChtaW5EaXN0ICogbWluRGlzdCAvIChkY29zICogZGNvcyArIGRzaW4gKiBkc2luKSk7IC8vIHMudC4gbm8gbm9kZXMgb3ZlcmxhcHBpbmdcblxuICAgICAgciA9IE1hdGgubWF4KHJNaW4sIHIpO1xuICAgIH1cbiAgICBsZXZlbC5yID0gcjtcbiAgICByICs9IG1pbkRpc3Q7XG4gIH1cbiAgaWYgKG9wdGlvbnMuZXF1aWRpc3RhbnQpIHtcbiAgICB2YXIgckRlbHRhTWF4ID0gMDtcbiAgICB2YXIgX3IgPSAwO1xuICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IGxldmVscy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgICB2YXIgX2xldmVsID0gbGV2ZWxzW19pNF07XG4gICAgICB2YXIgckRlbHRhID0gX2xldmVsLnIgLSBfcjtcbiAgICAgIHJEZWx0YU1heCA9IE1hdGgubWF4KHJEZWx0YU1heCwgckRlbHRhKTtcbiAgICB9XG4gICAgX3IgPSAwO1xuICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IGxldmVscy5sZW5ndGg7IF9pNSsrKSB7XG4gICAgICB2YXIgX2xldmVsMiA9IGxldmVsc1tfaTVdO1xuICAgICAgaWYgKF9pNSA9PT0gMCkge1xuICAgICAgICBfciA9IF9sZXZlbDIucjtcbiAgICAgIH1cbiAgICAgIF9sZXZlbDIuciA9IF9yO1xuICAgICAgX3IgKz0gckRlbHRhTWF4O1xuICAgIH1cbiAgfVxuXG4gIC8vIGNhbGN1bGF0ZSB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgdmFyIHBvcyA9IHt9OyAvLyBpZCA9PiBwb3NpdGlvblxuICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBsZXZlbHMubGVuZ3RoOyBfaTYrKykge1xuICAgIHZhciBfbGV2ZWwzID0gbGV2ZWxzW19pNl07XG4gICAgdmFyIF9kVGhldGEgPSBfbGV2ZWwzLmRUaGV0YTtcbiAgICB2YXIgX3IyID0gX2xldmVsMy5yO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgX2xldmVsMy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIF92YWwgPSBfbGV2ZWwzW2pdO1xuICAgICAgdmFyIHRoZXRhID0gb3B0aW9ucy5zdGFydEFuZ2xlICsgKGNsb2Nrd2lzZSA/IDEgOiAtMSkgKiBfZFRoZXRhICogajtcbiAgICAgIHZhciBwID0ge1xuICAgICAgICB4OiBjZW50ZXIueCArIF9yMiAqIE1hdGguY29zKHRoZXRhKSxcbiAgICAgICAgeTogY2VudGVyLnkgKyBfcjIgKiBNYXRoLnNpbih0aGV0YSlcbiAgICAgIH07XG4gICAgICBwb3NbX3ZhbC5ub2RlLmlkKCldID0gcDtcbiAgICB9XG4gIH1cblxuICAvLyBwb3NpdGlvbiB0aGUgbm9kZXNcbiAgZWxlcy5ub2RlcygpLmxheW91dFBvc2l0aW9ucyh0aGlzLCBvcHRpb25zLCBmdW5jdGlvbiAoZWxlKSB7XG4gICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgcmV0dXJuIHBvc1tpZF07XG4gIH0pO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbi8qXG5UaGUgQ29TRSBsYXlvdXQgd2FzIHdyaXR0ZW4gYnkgR2VyYXJkbyBIdWNrLlxuaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL2luL2dlcmFyZG9odWNrL1xuXG5CYXNlZCBvbiB0aGUgZm9sbG93aW5nIGFydGljbGU6XG5odHRwOi8vZGwuYWNtLm9yZy9jaXRhdGlvbi5jZm0/aWQ9MTQ5ODA0N1xuXG5Nb2RpZmljYXRpb25zIHRyYWNrZWQgb24gR2l0aHViLlxuKi9cbnZhciBERUJVRztcblxuLyoqXG4gKiBAYnJpZWYgOiAgZGVmYXVsdCBsYXlvdXQgb3B0aW9uc1xuICovXG52YXIgZGVmYXVsdHMkNCA9IHtcbiAgLy8gQ2FsbGVkIG9uIGBsYXlvdXRyZWFkeWBcbiAgcmVhZHk6IGZ1bmN0aW9uIHJlYWR5KCkge30sXG4gIC8vIENhbGxlZCBvbiBgbGF5b3V0c3RvcGBcbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHt9LFxuICAvLyBXaGV0aGVyIHRvIGFuaW1hdGUgd2hpbGUgcnVubmluZyB0aGUgbGF5b3V0XG4gIC8vIHRydWUgOiBBbmltYXRlIGNvbnRpbnVvdXNseSBhcyB0aGUgbGF5b3V0IGlzIHJ1bm5pbmdcbiAgLy8gZmFsc2UgOiBKdXN0IHNob3cgdGhlIGVuZCByZXN1bHRcbiAgLy8gJ2VuZCcgOiBBbmltYXRlIHdpdGggdGhlIGVuZCByZXN1bHQsIGZyb20gdGhlIGluaXRpYWwgcG9zaXRpb25zIHRvIHRoZSBlbmQgcG9zaXRpb25zXG4gIGFuaW1hdGU6IHRydWUsXG4gIC8vIEVhc2luZyBvZiB0aGUgYW5pbWF0aW9uIGZvciBhbmltYXRlOidlbmQnXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBUaGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBmb3IgYW5pbWF0ZTonZW5kJ1xuICBhbmltYXRpb25EdXJhdGlvbjogdW5kZWZpbmVkLFxuICAvLyBBIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSBhbmltYXRlZFxuICAvLyBBbGwgbm9kZXMgYW5pbWF0ZWQgYnkgZGVmYXVsdCBvbiBhbmltYXRlIGVuYWJsZWRcbiAgLy8gTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIFRoZSBsYXlvdXQgYW5pbWF0ZXMgb25seSBhZnRlciB0aGlzIG1hbnkgbWlsbGlzZWNvbmRzIGZvciBhbmltYXRlOnRydWVcbiAgLy8gKHByZXZlbnRzIGZsYXNoaW5nIG9uIGZhc3QgcnVucylcbiAgYW5pbWF0aW9uVGhyZXNob2xkOiAyNTAsXG4gIC8vIE51bWJlciBvZiBpdGVyYXRpb25zIGJldHdlZW4gY29uc2VjdXRpdmUgc2NyZWVuIHBvc2l0aW9ucyB1cGRhdGVcbiAgcmVmcmVzaDogMjAsXG4gIC8vIFdoZXRoZXIgdG8gZml0IHRoZSBuZXR3b3JrIHZpZXcgYWZ0ZXIgd2hlbiBkb25lXG4gIGZpdDogdHJ1ZSxcbiAgLy8gUGFkZGluZyBvbiBmaXRcbiAgcGFkZGluZzogMzAsXG4gIC8vIENvbnN0cmFpbiBsYXlvdXQgYm91bmRzOyB7IHgxLCB5MSwgeDIsIHkyIH0gb3IgeyB4MSwgeTEsIHcsIGggfVxuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBSYW5kb21pemUgdGhlIGluaXRpYWwgcG9zaXRpb25zIG9mIHRoZSBub2RlcyAodHJ1ZSkgb3IgdXNlIGV4aXN0aW5nIHBvc2l0aW9ucyAoZmFsc2UpXG4gIHJhbmRvbWl6ZTogZmFsc2UsXG4gIC8vIEV4dHJhIHNwYWNpbmcgYmV0d2VlbiBjb21wb25lbnRzIGluIG5vbi1jb21wb3VuZCBncmFwaHNcbiAgY29tcG9uZW50U3BhY2luZzogNDAsXG4gIC8vIE5vZGUgcmVwdWxzaW9uIChub24gb3ZlcmxhcHBpbmcpIG11bHRpcGxpZXJcbiAgbm9kZVJlcHVsc2lvbjogZnVuY3Rpb24gbm9kZVJlcHVsc2lvbihub2RlKSB7XG4gICAgcmV0dXJuIDIwNDg7XG4gIH0sXG4gIC8vIE5vZGUgcmVwdWxzaW9uIChvdmVybGFwcGluZykgbXVsdGlwbGllclxuICBub2RlT3ZlcmxhcDogNCxcbiAgLy8gSWRlYWwgZWRnZSAobm9uIG5lc3RlZCkgbGVuZ3RoXG4gIGlkZWFsRWRnZUxlbmd0aDogZnVuY3Rpb24gaWRlYWxFZGdlTGVuZ3RoKGVkZ2UpIHtcbiAgICByZXR1cm4gMzI7XG4gIH0sXG4gIC8vIERpdmlzb3IgdG8gY29tcHV0ZSBlZGdlIGZvcmNlc1xuICBlZGdlRWxhc3RpY2l0eTogZnVuY3Rpb24gZWRnZUVsYXN0aWNpdHkoZWRnZSkge1xuICAgIHJldHVybiAzMjtcbiAgfSxcbiAgLy8gTmVzdGluZyBmYWN0b3IgKG11bHRpcGxpZXIpIHRvIGNvbXB1dGUgaWRlYWwgZWRnZSBsZW5ndGggZm9yIG5lc3RlZCBlZGdlc1xuICBuZXN0aW5nRmFjdG9yOiAxLjIsXG4gIC8vIEdyYXZpdHkgZm9yY2UgKGNvbnN0YW50KVxuICBncmF2aXR5OiAxLFxuICAvLyBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHBlcmZvcm1cbiAgbnVtSXRlcjogMTAwMCxcbiAgLy8gSW5pdGlhbCB0ZW1wZXJhdHVyZSAobWF4aW11bSBub2RlIGRpc3BsYWNlbWVudClcbiAgaW5pdGlhbFRlbXA6IDEwMDAsXG4gIC8vIENvb2xpbmcgZmFjdG9yIChob3cgdGhlIHRlbXBlcmF0dXJlIGlzIHJlZHVjZWQgYmV0d2VlbiBjb25zZWN1dGl2ZSBpdGVyYXRpb25zXG4gIGNvb2xpbmdGYWN0b3I6IDAuOTksXG4gIC8vIExvd2VyIHRlbXBlcmF0dXJlIHRocmVzaG9sZCAoYmVsb3cgdGhpcyBwb2ludCB0aGUgbGF5b3V0IHdpbGwgZW5kKVxuICBtaW5UZW1wOiAxLjBcbn07XG5cbi8qKlxuICogQGJyaWVmICAgICAgIDogY29uc3RydWN0b3JcbiAqIEBhcmcgb3B0aW9ucyA6IG9iamVjdCBjb250YWluaW5nIGxheW91dCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIENvc2VMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzJDQsIG9wdGlvbnMpO1xuICB0aGlzLm9wdGlvbnMubGF5b3V0ID0gdGhpcztcblxuICAvLyBFeGNsdWRlIGFueSBlZGdlIHRoYXQgaGFzIGEgc291cmNlIG9yIHRhcmdldCBub2RlIHRoYXQgaXMgbm90IGluIHRoZSBzZXQgb2YgcGFzc2VkLWluIG5vZGVzXG4gIHZhciBub2RlcyA9IHRoaXMub3B0aW9ucy5lbGVzLm5vZGVzKCk7XG4gIHZhciBlZGdlcyA9IHRoaXMub3B0aW9ucy5lbGVzLmVkZ2VzKCk7XG4gIHZhciBub3RFZGdlcyA9IGVkZ2VzLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgIHZhciBzb3VyY2VJZCA9IGUuc291cmNlKCkuZGF0YSgnaWQnKTtcbiAgICB2YXIgdGFyZ2V0SWQgPSBlLnRhcmdldCgpLmRhdGEoJ2lkJyk7XG4gICAgdmFyIGhhc1NvdXJjZSA9IG5vZGVzLnNvbWUoZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJldHVybiBuLmRhdGEoJ2lkJykgPT09IHNvdXJjZUlkO1xuICAgIH0pO1xuICAgIHZhciBoYXNUYXJnZXQgPSBub2Rlcy5zb21lKGZ1bmN0aW9uIChuKSB7XG4gICAgICByZXR1cm4gbi5kYXRhKCdpZCcpID09PSB0YXJnZXRJZDtcbiAgICB9KTtcbiAgICByZXR1cm4gIWhhc1NvdXJjZSB8fCAhaGFzVGFyZ2V0O1xuICB9KTtcbiAgdGhpcy5vcHRpb25zLmVsZXMgPSB0aGlzLm9wdGlvbnMuZWxlcy5ub3Qobm90RWRnZXMpO1xufVxuXG4vKipcbiAqIEBicmllZiA6IHJ1bnMgdGhlIGxheW91dFxuICovXG5Db3NlTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgbGF5b3V0ID0gdGhpcztcbiAgbGF5b3V0LnN0b3BwZWQgPSBmYWxzZTtcbiAgaWYgKG9wdGlvbnMuYW5pbWF0ZSA9PT0gdHJ1ZSB8fCBvcHRpb25zLmFuaW1hdGUgPT09IGZhbHNlKSB7XG4gICAgbGF5b3V0LmVtaXQoe1xuICAgICAgdHlwZTogJ2xheW91dHN0YXJ0JyxcbiAgICAgIGxheW91dDogbGF5b3V0XG4gICAgfSk7XG4gIH1cblxuICAvLyBTZXQgREVCVUcgLSBHbG9iYWwgdmFyaWFibGVcbiAgaWYgKHRydWUgPT09IG9wdGlvbnMuZGVidWcpIHtcbiAgICBERUJVRyA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgREVCVUcgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgbGF5b3V0IGluZm9cbiAgdmFyIGxheW91dEluZm8gPSBjcmVhdGVMYXlvdXRJbmZvKGN5LCBsYXlvdXQsIG9wdGlvbnMpO1xuXG4gIC8vIFNob3cgTGF5b3V0SW5mbyBjb250ZW50cyBpZiBkZWJ1Z2dpbmdcbiAgaWYgKERFQlVHKSB7XG4gICAgcHJpbnRMYXlvdXRJbmZvKGxheW91dEluZm8pO1xuICB9XG5cbiAgLy8gSWYgcmVxdWlyZWQsIHJhbmRvbWl6ZSBub2RlIHBvc2l0aW9uc1xuICBpZiAob3B0aW9ucy5yYW5kb21pemUpIHtcbiAgICByYW5kb21pemVQb3NpdGlvbnMobGF5b3V0SW5mbyk7XG4gIH1cbiAgdmFyIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gIHZhciByZWZyZXNoID0gZnVuY3Rpb24gcmVmcmVzaCgpIHtcbiAgICByZWZyZXNoUG9zaXRpb25zKGxheW91dEluZm8sIGN5LCBvcHRpb25zKTtcblxuICAgIC8vIEZpdCB0aGUgZ3JhcGggaWYgbmVjZXNzYXJ5XG4gICAgaWYgKHRydWUgPT09IG9wdGlvbnMuZml0KSB7XG4gICAgICBjeS5maXQob3B0aW9ucy5wYWRkaW5nKTtcbiAgICB9XG4gIH07XG4gIHZhciBtYWluTG9vcCA9IGZ1bmN0aW9uIG1haW5Mb29wKGkpIHtcbiAgICBpZiAobGF5b3V0LnN0b3BwZWQgfHwgaSA+PSBvcHRpb25zLm51bUl0ZXIpIHtcbiAgICAgIC8vIGxvZ0RlYnVnKFwiTGF5b3V0IG1hbnVhbGx5IHN0b3BwZWQuIFN0b3BwaW5nIGNvbXB1dGF0aW9uIGluIHN0ZXAgXCIgKyBpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBEbyBvbmUgc3RlcCBpbiB0aGUgcGhpc2ljYWwgc2ltdWxhdGlvblxuICAgIHN0ZXAobGF5b3V0SW5mbywgb3B0aW9ucyk7XG5cbiAgICAvLyBVcGRhdGUgdGVtcGVyYXR1cmVcbiAgICBsYXlvdXRJbmZvLnRlbXBlcmF0dXJlID0gbGF5b3V0SW5mby50ZW1wZXJhdHVyZSAqIG9wdGlvbnMuY29vbGluZ0ZhY3RvcjtcbiAgICAvLyBsb2dEZWJ1ZyhcIk5ldyB0ZW1wZXJhdHVyZTogXCIgKyBsYXlvdXRJbmZvLnRlbXBlcmF0dXJlKTtcblxuICAgIGlmIChsYXlvdXRJbmZvLnRlbXBlcmF0dXJlIDwgb3B0aW9ucy5taW5UZW1wKSB7XG4gICAgICAvLyBsb2dEZWJ1ZyhcIlRlbXBlcmF0dXJlIGRyb3AgYmVsb3cgbWluaW11bSB0aHJlc2hvbGQuIFN0b3BwaW5nIGNvbXB1dGF0aW9uIGluIHN0ZXAgXCIgKyBpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIHZhciBkb25lID0gZnVuY3Rpb24gZG9uZSgpIHtcbiAgICBpZiAob3B0aW9ucy5hbmltYXRlID09PSB0cnVlIHx8IG9wdGlvbnMuYW5pbWF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJlZnJlc2goKTtcblxuICAgICAgLy8gTGF5b3V0IGhhcyBmaW5pc2hlZFxuICAgICAgbGF5b3V0Lm9uZSgnbGF5b3V0c3RvcCcsIG9wdGlvbnMuc3RvcCk7XG4gICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdsYXlvdXRzdG9wJyxcbiAgICAgICAgbGF5b3V0OiBsYXlvdXRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbm9kZXMgPSBvcHRpb25zLmVsZXMubm9kZXMoKTtcbiAgICAgIHZhciBnZXRTY2FsZWRQb3MgPSBnZXRTY2FsZUluQm91bmRzRm4obGF5b3V0SW5mbywgb3B0aW9ucywgbm9kZXMpO1xuICAgICAgbm9kZXMubGF5b3V0UG9zaXRpb25zKGxheW91dCwgb3B0aW9ucywgZ2V0U2NhbGVkUG9zKTtcbiAgICB9XG4gIH07XG4gIHZhciBpID0gMDtcbiAgdmFyIGxvb3BSZXQgPSB0cnVlO1xuICBpZiAob3B0aW9ucy5hbmltYXRlID09PSB0cnVlKSB7XG4gICAgdmFyIGZyYW1lID0gZnVuY3Rpb24gZnJhbWUoKSB7XG4gICAgICB2YXIgZiA9IDA7XG4gICAgICB3aGlsZSAobG9vcFJldCAmJiBmIDwgb3B0aW9ucy5yZWZyZXNoKSB7XG4gICAgICAgIGxvb3BSZXQgPSBtYWluTG9vcChpKTtcbiAgICAgICAgaSsrO1xuICAgICAgICBmKys7XG4gICAgICB9XG4gICAgICBpZiAoIWxvb3BSZXQpIHtcbiAgICAgICAgLy8gaXQncyBkb25lXG4gICAgICAgIHNlcGFyYXRlQ29tcG9uZW50cyhsYXlvdXRJbmZvLCBvcHRpb25zKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5vdyA9IHBlcmZvcm1hbmNlTm93KCk7XG4gICAgICAgIGlmIChub3cgLSBzdGFydFRpbWUgPj0gb3B0aW9ucy5hbmltYXRpb25UaHJlc2hvbGQpIHtcbiAgICAgICAgICByZWZyZXNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZyYW1lKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZyYW1lKCk7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKGxvb3BSZXQpIHtcbiAgICAgIGxvb3BSZXQgPSBtYWluTG9vcChpKTtcbiAgICAgIGkrKztcbiAgICB9XG4gICAgc2VwYXJhdGVDb21wb25lbnRzKGxheW91dEluZm8sIG9wdGlvbnMpO1xuICAgIGRvbmUoKTtcbiAgfVxuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbi8qKlxuICogQGJyaWVmIDogY2FsbGVkIG9uIGNvbnRpbnVvdXMgbGF5b3V0cyB0byBzdG9wIHRoZW0gYmVmb3JlIHRoZXkgZmluaXNoXG4gKi9cbkNvc2VMYXlvdXQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc3RvcHBlZCA9IHRydWU7XG4gIGlmICh0aGlzLnRocmVhZCkge1xuICAgIHRoaXMudGhyZWFkLnN0b3AoKTtcbiAgfVxuICB0aGlzLmVtaXQoJ2xheW91dHN0b3AnKTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG5Db3NlTGF5b3V0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy50aHJlYWQpIHtcbiAgICB0aGlzLnRocmVhZC5zdG9wKCk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG4vKipcbiAqIEBicmllZiAgICAgOiBDcmVhdGVzIGFuIG9iamVjdCB3aGljaCBpcyBjb250YWlucyBhbGwgdGhlIGRhdGFcbiAqICAgICAgICAgICAgICB1c2VkIGluIHRoZSBsYXlvdXQgcHJvY2Vzc1xuICogQGFyZyBjeSAgICA6IGN5dG9zY2FwZS5qcyBvYmplY3RcbiAqIEByZXR1cm4gICAgOiBsYXlvdXRJbmZvIG9iamVjdCBpbml0aWFsaXplZFxuICovXG52YXIgY3JlYXRlTGF5b3V0SW5mbyA9IGZ1bmN0aW9uIGNyZWF0ZUxheW91dEluZm8oY3ksIGxheW91dCwgb3B0aW9ucykge1xuICAvLyBTaG9ydGN1dFxuICB2YXIgZWRnZXMgPSBvcHRpb25zLmVsZXMuZWRnZXMoKTtcbiAgdmFyIG5vZGVzID0gb3B0aW9ucy5lbGVzLm5vZGVzKCk7XG4gIHZhciBiYiA9IG1ha2VCb3VuZGluZ0JveChvcHRpb25zLmJvdW5kaW5nQm94ID8gb3B0aW9ucy5ib3VuZGluZ0JveCA6IHtcbiAgICB4MTogMCxcbiAgICB5MTogMCxcbiAgICB3OiBjeS53aWR0aCgpLFxuICAgIGg6IGN5LmhlaWdodCgpXG4gIH0pO1xuICB2YXIgbGF5b3V0SW5mbyA9IHtcbiAgICBpc0NvbXBvdW5kOiBjeS5oYXNDb21wb3VuZE5vZGVzKCksXG4gICAgbGF5b3V0Tm9kZXM6IFtdLFxuICAgIGlkVG9JbmRleDoge30sXG4gICAgbm9kZVNpemU6IG5vZGVzLnNpemUoKSxcbiAgICBncmFwaFNldDogW10sXG4gICAgaW5kZXhUb0dyYXBoOiBbXSxcbiAgICBsYXlvdXRFZGdlczogW10sXG4gICAgZWRnZVNpemU6IGVkZ2VzLnNpemUoKSxcbiAgICB0ZW1wZXJhdHVyZTogb3B0aW9ucy5pbml0aWFsVGVtcCxcbiAgICBjbGllbnRXaWR0aDogYmIudyxcbiAgICBjbGllbnRIZWlnaHQ6IGJiLmgsXG4gICAgYm91bmRpbmdCb3g6IGJiXG4gIH07XG4gIHZhciBjb21wb25lbnRzID0gb3B0aW9ucy5lbGVzLmNvbXBvbmVudHMoKTtcbiAgdmFyIGlkMmNtcHRJZCA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tpXTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbXBvbmVudC5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIG5vZGUgPSBjb21wb25lbnRbal07XG4gICAgICBpZDJjbXB0SWRbbm9kZS5pZCgpXSA9IGk7XG4gICAgfVxuICB9XG5cbiAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBub2RlcywgY3JlYXRpbmcgbGF5b3V0IG5vZGVzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ub2RlU2l6ZTsgaSsrKSB7XG4gICAgdmFyIG4gPSBub2Rlc1tpXTtcbiAgICB2YXIgbmJiID0gbi5sYXlvdXREaW1lbnNpb25zKG9wdGlvbnMpO1xuICAgIHZhciB0ZW1wTm9kZSA9IHt9O1xuICAgIHRlbXBOb2RlLmlzTG9ja2VkID0gbi5sb2NrZWQoKTtcbiAgICB0ZW1wTm9kZS5pZCA9IG4uZGF0YSgnaWQnKTtcbiAgICB0ZW1wTm9kZS5wYXJlbnRJZCA9IG4uZGF0YSgncGFyZW50Jyk7XG4gICAgdGVtcE5vZGUuY21wdElkID0gaWQyY21wdElkW24uaWQoKV07XG4gICAgdGVtcE5vZGUuY2hpbGRyZW4gPSBbXTtcbiAgICB0ZW1wTm9kZS5wb3NpdGlvblggPSBuLnBvc2l0aW9uKCd4Jyk7XG4gICAgdGVtcE5vZGUucG9zaXRpb25ZID0gbi5wb3NpdGlvbigneScpO1xuICAgIHRlbXBOb2RlLm9mZnNldFggPSAwO1xuICAgIHRlbXBOb2RlLm9mZnNldFkgPSAwO1xuICAgIHRlbXBOb2RlLmhlaWdodCA9IG5iYi53O1xuICAgIHRlbXBOb2RlLndpZHRoID0gbmJiLmg7XG4gICAgdGVtcE5vZGUubWF4WCA9IHRlbXBOb2RlLnBvc2l0aW9uWCArIHRlbXBOb2RlLndpZHRoIC8gMjtcbiAgICB0ZW1wTm9kZS5taW5YID0gdGVtcE5vZGUucG9zaXRpb25YIC0gdGVtcE5vZGUud2lkdGggLyAyO1xuICAgIHRlbXBOb2RlLm1heFkgPSB0ZW1wTm9kZS5wb3NpdGlvblkgKyB0ZW1wTm9kZS5oZWlnaHQgLyAyO1xuICAgIHRlbXBOb2RlLm1pblkgPSB0ZW1wTm9kZS5wb3NpdGlvblkgLSB0ZW1wTm9kZS5oZWlnaHQgLyAyO1xuICAgIHRlbXBOb2RlLnBhZExlZnQgPSBwYXJzZUZsb2F0KG4uc3R5bGUoJ3BhZGRpbmcnKSk7XG4gICAgdGVtcE5vZGUucGFkUmlnaHQgPSBwYXJzZUZsb2F0KG4uc3R5bGUoJ3BhZGRpbmcnKSk7XG4gICAgdGVtcE5vZGUucGFkVG9wID0gcGFyc2VGbG9hdChuLnN0eWxlKCdwYWRkaW5nJykpO1xuICAgIHRlbXBOb2RlLnBhZEJvdHRvbSA9IHBhcnNlRmxvYXQobi5zdHlsZSgncGFkZGluZycpKTtcblxuICAgIC8vIGZvcmNlc1xuICAgIHRlbXBOb2RlLm5vZGVSZXB1bHNpb24gPSBmbiQ2KG9wdGlvbnMubm9kZVJlcHVsc2lvbikgPyBvcHRpb25zLm5vZGVSZXB1bHNpb24obikgOiBvcHRpb25zLm5vZGVSZXB1bHNpb247XG5cbiAgICAvLyBBZGQgbmV3IG5vZGVcbiAgICBsYXlvdXRJbmZvLmxheW91dE5vZGVzLnB1c2godGVtcE5vZGUpO1xuICAgIC8vIEFkZCBlbnRyeSB0byBpZC1pbmRleCBtYXBcbiAgICBsYXlvdXRJbmZvLmlkVG9JbmRleFt0ZW1wTm9kZS5pZF0gPSBpO1xuICB9XG5cbiAgLy8gSW5saW5lIGltcGxlbWVudGF0aW9uIG9mIGEgcXVldWUsIHVzZWQgZm9yIHRyYXZlcnNpbmcgdGhlIGdyYXBoIGluIEJGUyBvcmRlclxuICB2YXIgcXVldWUgPSBbXTtcbiAgdmFyIHN0YXJ0ID0gMDsgLy8gUG9pbnRzIHRvIHRoZSBzdGFydCB0aGUgcXVldWVcbiAgdmFyIGVuZCA9IC0xOyAvLyBQb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcblxuICB2YXIgdGVtcEdyYXBoID0gW107XG5cbiAgLy8gU2Vjb25kIHBhc3MgdG8gYWRkIGNoaWxkIGluZm9ybWF0aW9uIGFuZFxuICAvLyBpbml0aWFsaXplIHF1ZXVlIGZvciBoaWVyYXJjaGljYWwgdHJhdmVyc2FsXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ub2RlU2l6ZTsgaSsrKSB7XG4gICAgdmFyIG4gPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2ldO1xuICAgIHZhciBwX2lkID0gbi5wYXJlbnRJZDtcbiAgICAvLyBDaGVjayBpZiBub2RlIG4gaGFzIGEgcGFyZW50IG5vZGVcbiAgICBpZiAobnVsbCAhPSBwX2lkKSB7XG4gICAgICAvLyBBZGQgbm9kZSBJZCB0byBwYXJlbnQncyBsaXN0IG9mIGNoaWxkcmVuXG4gICAgICBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W3BfaWRdXS5jaGlsZHJlbi5wdXNoKG4uaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBhIG5vZGUgZG9lc24ndCBoYXZlIGEgcGFyZW50LCB0aGVuIGl0J3MgaW4gdGhlIHJvb3QgZ3JhcGhcbiAgICAgIHF1ZXVlWysrZW5kXSA9IG4uaWQ7XG4gICAgICB0ZW1wR3JhcGgucHVzaChuLmlkKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgcm9vdCBncmFwaCB0byBncmFwaFNldFxuICBsYXlvdXRJbmZvLmdyYXBoU2V0LnB1c2godGVtcEdyYXBoKTtcblxuICAvLyBUcmF2ZXJzZSB0aGUgZ3JhcGgsIGxldmVsIGJ5IGxldmVsLFxuICB3aGlsZSAoc3RhcnQgPD0gZW5kKSB7XG4gICAgLy8gR2V0IHRoZSBub2RlIHRvIHZpc2l0IGFuZCByZW1vdmUgaXQgZnJvbSBxdWV1ZVxuICAgIHZhciBub2RlX2lkID0gcXVldWVbc3RhcnQrK107XG4gICAgdmFyIG5vZGVfaXggPSBsYXlvdXRJbmZvLmlkVG9JbmRleFtub2RlX2lkXTtcbiAgICB2YXIgbm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbm9kZV9peF07XG4gICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQWRkIGNoaWxkcmVuIG5vZGVzIGFzIGEgbmV3IGdyYXBoIHRvIGdyYXBoIHNldFxuICAgICAgbGF5b3V0SW5mby5ncmFwaFNldC5wdXNoKGNoaWxkcmVuKTtcbiAgICAgIC8vIEFkZCBjaGlsZHJlbiB0byBxdWUgcXVldWUgdG8gYmUgdmlzaXRlZFxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBxdWV1ZVsrK2VuZF0gPSBjaGlsZHJlbltpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDcmVhdGUgaW5kZXhUb0dyYXBoIG1hcFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8uZ3JhcGhTZXQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZ3JhcGggPSBsYXlvdXRJbmZvLmdyYXBoU2V0W2ldO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ3JhcGgubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBpbmRleCA9IGxheW91dEluZm8uaWRUb0luZGV4W2dyYXBoW2pdXTtcbiAgICAgIGxheW91dEluZm8uaW5kZXhUb0dyYXBoW2luZGV4XSA9IGk7XG4gICAgfVxuICB9XG5cbiAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBlZGdlcywgY3JlYXRpbmcgTGF5b3V0IEVkZ2VzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5lZGdlU2l6ZTsgaSsrKSB7XG4gICAgdmFyIGUgPSBlZGdlc1tpXTtcbiAgICB2YXIgdGVtcEVkZ2UgPSB7fTtcbiAgICB0ZW1wRWRnZS5pZCA9IGUuZGF0YSgnaWQnKTtcbiAgICB0ZW1wRWRnZS5zb3VyY2VJZCA9IGUuZGF0YSgnc291cmNlJyk7XG4gICAgdGVtcEVkZ2UudGFyZ2V0SWQgPSBlLmRhdGEoJ3RhcmdldCcpO1xuXG4gICAgLy8gQ29tcHV0ZSBpZGVhbCBsZW5ndGhcbiAgICB2YXIgaWRlYWxMZW5ndGggPSBmbiQ2KG9wdGlvbnMuaWRlYWxFZGdlTGVuZ3RoKSA/IG9wdGlvbnMuaWRlYWxFZGdlTGVuZ3RoKGUpIDogb3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGg7XG4gICAgdmFyIGVsYXN0aWNpdHkgPSBmbiQ2KG9wdGlvbnMuZWRnZUVsYXN0aWNpdHkpID8gb3B0aW9ucy5lZGdlRWxhc3RpY2l0eShlKSA6IG9wdGlvbnMuZWRnZUVsYXN0aWNpdHk7XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGFuIGludGVyIGdyYXBoIGVkZ2VcbiAgICB2YXIgc291cmNlSXggPSBsYXlvdXRJbmZvLmlkVG9JbmRleFt0ZW1wRWRnZS5zb3VyY2VJZF07XG4gICAgdmFyIHRhcmdldEl4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbdGVtcEVkZ2UudGFyZ2V0SWRdO1xuICAgIHZhciBzb3VyY2VHcmFwaCA9IGxheW91dEluZm8uaW5kZXhUb0dyYXBoW3NvdXJjZUl4XTtcbiAgICB2YXIgdGFyZ2V0R3JhcGggPSBsYXlvdXRJbmZvLmluZGV4VG9HcmFwaFt0YXJnZXRJeF07XG4gICAgaWYgKHNvdXJjZUdyYXBoICE9IHRhcmdldEdyYXBoKSB7XG4gICAgICAvLyBGaW5kIGxvd2VzdCBjb21tb24gZ3JhcGggYW5jZXN0b3JcbiAgICAgIHZhciBsY2EgPSBmaW5kTENBKHRlbXBFZGdlLnNvdXJjZUlkLCB0ZW1wRWRnZS50YXJnZXRJZCwgbGF5b3V0SW5mbyk7XG5cbiAgICAgIC8vIENvbXB1dGUgc3VtIG9mIG5vZGUgZGVwdGhzLCByZWxhdGl2ZSB0byBsY2EgZ3JhcGhcbiAgICAgIHZhciBsY2FHcmFwaCA9IGxheW91dEluZm8uZ3JhcGhTZXRbbGNhXTtcbiAgICAgIHZhciBkZXB0aCA9IDA7XG5cbiAgICAgIC8vIFNvdXJjZSBkZXB0aFxuICAgICAgdmFyIHRlbXBOb2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tzb3VyY2VJeF07XG4gICAgICB3aGlsZSAoLTEgPT09IGxjYUdyYXBoLmluZGV4T2YodGVtcE5vZGUuaWQpKSB7XG4gICAgICAgIHRlbXBOb2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFt0ZW1wTm9kZS5wYXJlbnRJZF1dO1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuXG4gICAgICAvLyBUYXJnZXQgZGVwdGhcbiAgICAgIHRlbXBOb2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1t0YXJnZXRJeF07XG4gICAgICB3aGlsZSAoLTEgPT09IGxjYUdyYXBoLmluZGV4T2YodGVtcE5vZGUuaWQpKSB7XG4gICAgICAgIHRlbXBOb2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFt0ZW1wTm9kZS5wYXJlbnRJZF1dO1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuXG4gICAgICAvLyBsb2dEZWJ1ZygnTENBIG9mIG5vZGVzICcgKyB0ZW1wRWRnZS5zb3VyY2VJZCArICcgYW5kICcgKyB0ZW1wRWRnZS50YXJnZXRJZCArXG4gICAgICAvLyAgXCIuIEluZGV4OiBcIiArIGxjYSArIFwiIENvbnRlbnRzOiBcIiArIGxjYUdyYXBoLnRvU3RyaW5nKCkgK1xuICAgICAgLy8gIFwiLiBEZXB0aDogXCIgKyBkZXB0aCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBpZGVhbExlbmd0aFxuICAgICAgaWRlYWxMZW5ndGggKj0gZGVwdGggKiBvcHRpb25zLm5lc3RpbmdGYWN0b3I7XG4gICAgfVxuICAgIHRlbXBFZGdlLmlkZWFsTGVuZ3RoID0gaWRlYWxMZW5ndGg7XG4gICAgdGVtcEVkZ2UuZWxhc3RpY2l0eSA9IGVsYXN0aWNpdHk7XG4gICAgbGF5b3V0SW5mby5sYXlvdXRFZGdlcy5wdXNoKHRlbXBFZGdlKTtcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHJldHVybiBsYXlvdXRJbmZvIG9iamVjdFxuICByZXR1cm4gbGF5b3V0SW5mbztcbn07XG5cbi8qKlxuICogQGJyaWVmIDogVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgaW5kZXggb2YgdGhlIGxvd2VzdCBjb21tb25cbiAqICAgICAgICAgIGdyYXBoIGFuY2VzdG9yIGJldHdlZW4gMiBub2RlcyBpbiB0aGUgc3VidHJlZVxuICogICAgICAgICAgKGZyb20gdGhlIGdyYXBoIGhpZXJhcmNoeSBpbmR1Y2VkIHRyZWUpIHdob3NlXG4gKiAgICAgICAgICByb290IGlzIGdyYXBoSXhcbiAqXG4gKiBAYXJnIG5vZGUxOiBub2RlMSdzIElEXG4gKiBAYXJnIG5vZGUyOiBub2RlMidzIElEXG4gKiBAYXJnIGxheW91dEluZm86IGxheW91dEluZm8gb2JqZWN0XG4gKlxuICovXG52YXIgZmluZExDQSA9IGZ1bmN0aW9uIGZpbmRMQ0Eobm9kZTEsIG5vZGUyLCBsYXlvdXRJbmZvKSB7XG4gIC8vIEZpbmQgdGhlaXIgY29tbW9uIGFuY2VzdGVyLCBzdGFydGluZyBmcm9tIHRoZSByb290IGdyYXBoXG4gIHZhciByZXMgPSBmaW5kTENBX2F1eChub2RlMSwgbm9kZTIsIDAsIGxheW91dEluZm8pO1xuICBpZiAoMiA+IHJlcy5jb3VudCkge1xuICAgIC8vIElmIGF1eCBmdW5jdGlvbiBjb3VsZG4ndCBmaW5kIHRoZSBjb21tb24gYW5jZXN0ZXIsXG4gICAgLy8gdGhlbiBpdCBpcyB0aGUgcm9vdCBncmFwaFxuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXMuZ3JhcGg7XG4gIH1cbn07XG5cbi8qKlxuICogQGJyaWVmICAgICAgICAgIDogQXV4aWxpYXJ5IGZ1bmN0aW9uIHVzZWQgZm9yIExDQSBjb21wdXRhdGlvblxuICpcbiAqIEBhcmcgbm9kZTEgICAgICA6IG5vZGUxJ3MgSURcbiAqIEBhcmcgbm9kZTIgICAgICA6IG5vZGUyJ3MgSURcbiAqIEBhcmcgZ3JhcGhJeCAgICA6IHN1YmdyYXBoIGluZGV4XG4gKiBAYXJnIGxheW91dEluZm8gOiBsYXlvdXRJbmZvIG9iamVjdFxuICpcbiAqIEByZXR1cm4gICAgICAgICA6IG9iamVjdCBvZiB0aGUgZm9ybSB7Y291bnQ6IFgsIGdyYXBoOiBZfSwgd2hlcmU6XG4gKiAgICAgICAgICAgICAgICAgICBYIGlzIHRoZSBudW1iZXIgb2YgYW5jZXN0b3JzIChtYXg6IDIpIGZvdW5kIGluXG4gKiAgICAgICAgICAgICAgICAgICBncmFwaEl4IChhbmQgaXQncyBzdWJncmFwaHMpLFxuICogICAgICAgICAgICAgICAgICAgWSBpcyB0aGUgZ3JhcGggaW5kZXggb2YgdGhlIGxvd2VzdCBncmFwaCBjb250YWluaW5nXG4gKiAgICAgICAgICAgICAgICAgICBhbGwgWCBub2Rlc1xuICovXG52YXIgZmluZExDQV9hdXggPSBmdW5jdGlvbiBmaW5kTENBX2F1eChub2RlMSwgbm9kZTIsIGdyYXBoSXgsIGxheW91dEluZm8pIHtcbiAgdmFyIGdyYXBoID0gbGF5b3V0SW5mby5ncmFwaFNldFtncmFwaEl4XTtcbiAgLy8gSWYgYm90aCBub2RlcyBiZWxvbmdzIHRvIGdyYXBoSXhcbiAgaWYgKC0xIDwgZ3JhcGguaW5kZXhPZihub2RlMSkgJiYgLTEgPCBncmFwaC5pbmRleE9mKG5vZGUyKSkge1xuICAgIHJldHVybiB7XG4gICAgICBjb3VudDogMixcbiAgICAgIGdyYXBoOiBncmFwaEl4XG4gICAgfTtcbiAgfVxuXG4gIC8vIE1ha2UgcmVjdXJzaXZlIGNhbGxzIGZvciBhbGwgc3ViZ3JhcGhzXG4gIHZhciBjID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBncmFwaC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlSWQgPSBncmFwaFtpXTtcbiAgICB2YXIgbm9kZUl4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbbm9kZUlkXTtcbiAgICB2YXIgY2hpbGRyZW4gPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW25vZGVJeF0uY2hpbGRyZW47XG5cbiAgICAvLyBJZiB0aGUgbm9kZSBoYXMgbm8gY2hpbGQsIHNraXAgaXRcbiAgICBpZiAoMCA9PT0gY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGNoaWxkR3JhcGhJeCA9IGxheW91dEluZm8uaW5kZXhUb0dyYXBoW2xheW91dEluZm8uaWRUb0luZGV4W2NoaWxkcmVuWzBdXV07XG4gICAgdmFyIHJlc3VsdCA9IGZpbmRMQ0FfYXV4KG5vZGUxLCBub2RlMiwgY2hpbGRHcmFwaEl4LCBsYXlvdXRJbmZvKTtcbiAgICBpZiAoMCA9PT0gcmVzdWx0LmNvdW50KSB7XG4gICAgICAvLyBOZWl0aGVyIG5vZGUxIG5vciBub2RlMiBhcmUgcHJlc2VudCBpbiB0aGlzIHN1YmdyYXBoXG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKDEgPT09IHJlc3VsdC5jb3VudCkge1xuICAgICAgLy8gT25lIG9mIChub2RlMSwgbm9kZTIpIGlzIHByZXNlbnQgaW4gdGhpcyBzdWJncmFwaFxuICAgICAgYysrO1xuICAgICAgaWYgKDIgPT09IGMpIHtcbiAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBmb3VuZCBib3RoIG5vZGVzLCBubyBuZWVkIHRvIGtlZXAgc2VhcmNoaW5nXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCb3RoIG5vZGVzIGFyZSBwcmVzZW50IGluIHRoaXMgc3ViZ3JhcGhcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgY291bnQ6IGMsXG4gICAgZ3JhcGg6IGdyYXBoSXhcbiAgfTtcbn07XG5cbi8qKlxuICogQGJyaWVmOiBwcmludHNMYXlvdXRJbmZvIGludG8ganMgY29uc29sZVxuICogICAgICAgICBPbmx5IHVzZWQgZm9yIGRlYmJ1Z2luZ1xuICovXG52YXIgcHJpbnRMYXlvdXRJbmZvOyBcblxuLyoqXG4gKiBAYnJpZWYgOiBSYW5kb21pemVzIHRoZSBwb3NpdGlvbiBvZiBhbGwgbm9kZXNcbiAqL1xudmFyIHJhbmRvbWl6ZVBvc2l0aW9ucyA9IGZ1bmN0aW9uIHJhbmRvbWl6ZVBvc2l0aW9ucyhsYXlvdXRJbmZvLCBjeSkge1xuICB2YXIgd2lkdGggPSBsYXlvdXRJbmZvLmNsaWVudFdpZHRoO1xuICB2YXIgaGVpZ2h0ID0gbGF5b3V0SW5mby5jbGllbnRIZWlnaHQ7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ub2RlU2l6ZTsgaSsrKSB7XG4gICAgdmFyIG4gPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2ldO1xuXG4gICAgLy8gTm8gbmVlZCB0byByYW5kb21pemUgY29tcG91bmQgbm9kZXMgb3IgbG9ja2VkIG5vZGVzXG4gICAgaWYgKDAgPT09IG4uY2hpbGRyZW4ubGVuZ3RoICYmICFuLmlzTG9ja2VkKSB7XG4gICAgICBuLnBvc2l0aW9uWCA9IE1hdGgucmFuZG9tKCkgKiB3aWR0aDtcbiAgICAgIG4ucG9zaXRpb25ZID0gTWF0aC5yYW5kb20oKSAqIGhlaWdodDtcbiAgICB9XG4gIH1cbn07XG52YXIgZ2V0U2NhbGVJbkJvdW5kc0ZuID0gZnVuY3Rpb24gZ2V0U2NhbGVJbkJvdW5kc0ZuKGxheW91dEluZm8sIG9wdGlvbnMsIG5vZGVzKSB7XG4gIHZhciBiYiA9IGxheW91dEluZm8uYm91bmRpbmdCb3g7XG4gIHZhciBjb3NlQkIgPSB7XG4gICAgeDE6IEluZmluaXR5LFxuICAgIHgyOiAtSW5maW5pdHksXG4gICAgeTE6IEluZmluaXR5LFxuICAgIHkyOiAtSW5maW5pdHlcbiAgfTtcbiAgaWYgKG9wdGlvbnMuYm91bmRpbmdCb3gpIHtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICB2YXIgbG5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W25vZGUuZGF0YSgnaWQnKV1dO1xuICAgICAgY29zZUJCLngxID0gTWF0aC5taW4oY29zZUJCLngxLCBsbm9kZS5wb3NpdGlvblgpO1xuICAgICAgY29zZUJCLngyID0gTWF0aC5tYXgoY29zZUJCLngyLCBsbm9kZS5wb3NpdGlvblgpO1xuICAgICAgY29zZUJCLnkxID0gTWF0aC5taW4oY29zZUJCLnkxLCBsbm9kZS5wb3NpdGlvblkpO1xuICAgICAgY29zZUJCLnkyID0gTWF0aC5tYXgoY29zZUJCLnkyLCBsbm9kZS5wb3NpdGlvblkpO1xuICAgIH0pO1xuICAgIGNvc2VCQi53ID0gY29zZUJCLngyIC0gY29zZUJCLngxO1xuICAgIGNvc2VCQi5oID0gY29zZUJCLnkyIC0gY29zZUJCLnkxO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoZWxlLCBpKSB7XG4gICAgdmFyIGxub2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtlbGUuZGF0YSgnaWQnKV1dO1xuICAgIGlmIChvcHRpb25zLmJvdW5kaW5nQm94KSB7XG4gICAgICAvLyB0aGVuIGFkZCBleHRyYSBib3VuZGluZyBib3ggY29uc3RyYWludFxuICAgICAgdmFyIHBjdFggPSAobG5vZGUucG9zaXRpb25YIC0gY29zZUJCLngxKSAvIGNvc2VCQi53O1xuICAgICAgdmFyIHBjdFkgPSAobG5vZGUucG9zaXRpb25ZIC0gY29zZUJCLnkxKSAvIGNvc2VCQi5oO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogYmIueDEgKyBwY3RYICogYmIudyxcbiAgICAgICAgeTogYmIueTEgKyBwY3RZICogYmIuaFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogbG5vZGUucG9zaXRpb25YLFxuICAgICAgICB5OiBsbm9kZS5wb3NpdGlvbllcbiAgICAgIH07XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBAYnJpZWYgICAgICAgICAgOiBVcGRhdGVzIHRoZSBwb3NpdGlvbnMgb2Ygbm9kZXMgaW4gdGhlIG5ldHdvcmtcbiAqIEBhcmcgbGF5b3V0SW5mbyA6IExheW91dEluZm8gb2JqZWN0XG4gKiBAYXJnIGN5ICAgICAgICAgOiBDeXRvc2NhcGUgb2JqZWN0XG4gKiBAYXJnIG9wdGlvbnMgICAgOiBMYXlvdXQgb3B0aW9uc1xuICovXG52YXIgcmVmcmVzaFBvc2l0aW9ucyA9IGZ1bmN0aW9uIHJlZnJlc2hQb3NpdGlvbnMobGF5b3V0SW5mbywgY3ksIG9wdGlvbnMpIHtcbiAgLy8gdmFyIHMgPSAnUmVmcmVzaGluZyBwb3NpdGlvbnMnO1xuICAvLyBsb2dEZWJ1ZyhzKTtcblxuICB2YXIgbGF5b3V0ID0gb3B0aW9ucy5sYXlvdXQ7XG4gIHZhciBub2RlcyA9IG9wdGlvbnMuZWxlcy5ub2RlcygpO1xuICB2YXIgZ2V0U2NhbGVkUG9zID0gZ2V0U2NhbGVJbkJvdW5kc0ZuKGxheW91dEluZm8sIG9wdGlvbnMsIG5vZGVzKTtcbiAgbm9kZXMucG9zaXRpb25zKGdldFNjYWxlZFBvcyk7XG5cbiAgLy8gVHJpZ2dlciBsYXlvdXRSZWFkeSBvbmx5IG9uIGZpcnN0IGNhbGxcbiAgaWYgKHRydWUgIT09IGxheW91dEluZm8ucmVhZHkpIHtcbiAgICAvLyBzID0gJ1RyaWdnZXJpbmcgbGF5b3V0cmVhZHknO1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuICAgIGxheW91dEluZm8ucmVhZHkgPSB0cnVlO1xuICAgIGxheW91dC5vbmUoJ2xheW91dHJlYWR5Jywgb3B0aW9ucy5yZWFkeSk7XG4gICAgbGF5b3V0LmVtaXQoe1xuICAgICAgdHlwZTogJ2xheW91dHJlYWR5JyxcbiAgICAgIGxheW91dDogdGhpc1xuICAgIH0pO1xuICB9XG59O1xuXG4vKipcbiAqIEBicmllZiA6IExvZ3MgYSBkZWJ1ZyBtZXNzYWdlIGluIEpTIGNvbnNvbGUsIGlmIERFQlVHIGlzIE9OXG4gKi9cbi8vIHZhciBsb2dEZWJ1ZyA9IGZ1bmN0aW9uKHRleHQpIHtcbi8vICAgaWYgKERFQlVHKSB7XG4vLyAgICAgY29uc29sZS5kZWJ1Zyh0ZXh0KTtcbi8vICAgfVxuLy8gfTtcblxuLyoqXG4gKiBAYnJpZWYgICAgICAgICAgOiBQZXJmb3JtcyBvbmUgaXRlcmF0aW9uIG9mIHRoZSBwaHlzaWNhbCBzaW11bGF0aW9uXG4gKiBAYXJnIGxheW91dEluZm8gOiBMYXlvdXRJbmZvIG9iamVjdCBhbHJlYWR5IGluaXRpYWxpemVkXG4gKiBAYXJnIGN5ICAgICAgICAgOiBDeXRvc2NhcGUgb2JqZWN0XG4gKiBAYXJnIG9wdGlvbnMgICAgOiBMYXlvdXQgb3B0aW9uc1xuICovXG52YXIgc3RlcCA9IGZ1bmN0aW9uIHN0ZXAobGF5b3V0SW5mbywgb3B0aW9ucywgX3N0ZXApIHtcbiAgLy8gdmFyIHMgPSBcIlxcblxcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcIjtcbiAgLy8gcyArPSBcIlxcblNURVA6IFwiICsgc3RlcDtcbiAgLy8gcyArPSBcIlxcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcXG5cIjtcbiAgLy8gbG9nRGVidWcocyk7XG5cbiAgLy8gQ2FsY3VsYXRlIG5vZGUgcmVwdWxzaW9uc1xuICBjYWxjdWxhdGVOb2RlRm9yY2VzKGxheW91dEluZm8sIG9wdGlvbnMpO1xuICAvLyBDYWxjdWxhdGUgZWRnZSBmb3JjZXNcbiAgY2FsY3VsYXRlRWRnZUZvcmNlcyhsYXlvdXRJbmZvKTtcbiAgLy8gQ2FsY3VsYXRlIGdyYXZpdHkgZm9yY2VzXG4gIGNhbGN1bGF0ZUdyYXZpdHlGb3JjZXMobGF5b3V0SW5mbywgb3B0aW9ucyk7XG4gIC8vIFByb3BhZ2F0ZSBmb3JjZXMgZnJvbSBwYXJlbnQgdG8gY2hpbGRcbiAgcHJvcGFnYXRlRm9yY2VzKGxheW91dEluZm8pO1xuICAvLyBVcGRhdGUgcG9zaXRpb25zIGJhc2VkIG9uIGNhbGN1bGF0ZWQgZm9yY2VzXG4gIHVwZGF0ZVBvc2l0aW9ucyhsYXlvdXRJbmZvKTtcbn07XG5cbi8qKlxuICogQGJyaWVmIDogQ29tcHV0ZXMgdGhlIG5vZGUgcmVwdWxzaW9uIGZvcmNlc1xuICovXG52YXIgY2FsY3VsYXRlTm9kZUZvcmNlcyA9IGZ1bmN0aW9uIGNhbGN1bGF0ZU5vZGVGb3JjZXMobGF5b3V0SW5mbywgb3B0aW9ucykge1xuICAvLyBHbyB0aHJvdWdoIGVhY2ggb2YgdGhlIGdyYXBocyBpbiBncmFwaFNldFxuICAvLyBOb2RlcyBvbmx5IHJlcGVsIGVhY2ggb3RoZXIgaWYgdGhleSBiZWxvbmcgdG8gdGhlIHNhbWUgZ3JhcGhcbiAgLy8gdmFyIHMgPSAnY2FsY3VsYXRlTm9kZUZvcmNlcyc7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8uZ3JhcGhTZXQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZ3JhcGggPSBsYXlvdXRJbmZvLmdyYXBoU2V0W2ldO1xuICAgIHZhciBudW1Ob2RlcyA9IGdyYXBoLmxlbmd0aDtcblxuICAgIC8vIHMgPSBcIlNldDogXCIgKyBncmFwaC50b1N0cmluZygpO1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuXG4gICAgLy8gTm93IGdldCBhbGwgdGhlIHBhaXJzIG9mIG5vZGVzXG4gICAgLy8gT25seSBnZXQgZWFjaCBwYWlyIG9uY2UsIChBLCBCKSA9IChCLCBBKVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbnVtTm9kZXM7IGorKykge1xuICAgICAgdmFyIG5vZGUxID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtncmFwaFtqXV1dO1xuICAgICAgZm9yICh2YXIgayA9IGogKyAxOyBrIDwgbnVtTm9kZXM7IGsrKykge1xuICAgICAgICB2YXIgbm9kZTIgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2dyYXBoW2tdXV07XG4gICAgICAgIG5vZGVSZXB1bHNpb24obm9kZTEsIG5vZGUyLCBsYXlvdXRJbmZvLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG52YXIgcmFuZG9tRGlzdGFuY2UgPSBmdW5jdGlvbiByYW5kb21EaXN0YW5jZShtYXgpIHtcbiAgcmV0dXJuIC1tYXggKyAyICogbWF4ICogTWF0aC5yYW5kb20oKTtcbn07XG5cbi8qKlxuICogQGJyaWVmIDogQ29tcHV0ZSB0aGUgbm9kZSByZXB1bHNpb24gZm9yY2VzIGJldHdlZW4gYSBwYWlyIG9mIG5vZGVzXG4gKi9cbnZhciBub2RlUmVwdWxzaW9uID0gZnVuY3Rpb24gbm9kZVJlcHVsc2lvbihub2RlMSwgbm9kZTIsIGxheW91dEluZm8sIG9wdGlvbnMpIHtcbiAgLy8gdmFyIHMgPSBcIk5vZGUgcmVwdWxzaW9uLiBOb2RlMTogXCIgKyBub2RlMS5pZCArIFwiIE5vZGUyOiBcIiArIG5vZGUyLmlkO1xuXG4gIHZhciBjbXB0SWQxID0gbm9kZTEuY21wdElkO1xuICB2YXIgY21wdElkMiA9IG5vZGUyLmNtcHRJZDtcbiAgaWYgKGNtcHRJZDEgIT09IGNtcHRJZDIgJiYgIWxheW91dEluZm8uaXNDb21wb3VuZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEdldCBkaXJlY3Rpb24gb2YgbGluZSBjb25uZWN0aW5nIGJvdGggbm9kZSBjZW50ZXJzXG4gIHZhciBkaXJlY3Rpb25YID0gbm9kZTIucG9zaXRpb25YIC0gbm9kZTEucG9zaXRpb25YO1xuICB2YXIgZGlyZWN0aW9uWSA9IG5vZGUyLnBvc2l0aW9uWSAtIG5vZGUxLnBvc2l0aW9uWTtcbiAgdmFyIG1heFJhbmREaXN0ID0gMTtcbiAgLy8gcyArPSBcIlxcbmRpcmVjdGlvblg6IFwiICsgZGlyZWN0aW9uWCArIFwiLCBkaXJlY3Rpb25ZOiBcIiArIGRpcmVjdGlvblk7XG5cbiAgLy8gSWYgYm90aCBjZW50ZXJzIGFyZSB0aGUgc2FtZSwgYXBwbHkgYSByYW5kb20gZm9yY2VcbiAgaWYgKDAgPT09IGRpcmVjdGlvblggJiYgMCA9PT0gZGlyZWN0aW9uWSkge1xuICAgIGRpcmVjdGlvblggPSByYW5kb21EaXN0YW5jZShtYXhSYW5kRGlzdCk7XG4gICAgZGlyZWN0aW9uWSA9IHJhbmRvbURpc3RhbmNlKG1heFJhbmREaXN0KTtcbiAgfVxuICB2YXIgb3ZlcmxhcCA9IG5vZGVzT3ZlcmxhcChub2RlMSwgbm9kZTIsIGRpcmVjdGlvblgsIGRpcmVjdGlvblkpO1xuICBpZiAob3ZlcmxhcCA+IDApIHtcbiAgICAvLyBzICs9IFwiXFxuTm9kZXMgRE8gb3ZlcmxhcC5cIjtcbiAgICAvLyBzICs9IFwiXFxuT3ZlcmxhcDogXCIgKyBvdmVybGFwO1xuICAgIC8vIElmIG5vZGVzIG92ZXJsYXAsIHJlcHVsc2lvbiBmb3JjZSBpcyBwcm9wb3J0aW9uYWxcbiAgICAvLyB0byB0aGUgb3ZlcmxhcFxuICAgIHZhciBmb3JjZSA9IG9wdGlvbnMubm9kZU92ZXJsYXAgKiBvdmVybGFwO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgbW9kdWxlIGFuZCBjb21wb25lbnRzIG9mIHRoZSBmb3JjZSB2ZWN0b3JcbiAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGlyZWN0aW9uWCAqIGRpcmVjdGlvblggKyBkaXJlY3Rpb25ZICogZGlyZWN0aW9uWSk7XG4gICAgLy8gcyArPSBcIlxcbkRpc3RhbmNlOiBcIiArIGRpc3RhbmNlO1xuICAgIHZhciBmb3JjZVggPSBmb3JjZSAqIGRpcmVjdGlvblggLyBkaXN0YW5jZTtcbiAgICB2YXIgZm9yY2VZID0gZm9yY2UgKiBkaXJlY3Rpb25ZIC8gZGlzdGFuY2U7XG4gIH0gZWxzZSB7XG4gICAgLy8gcyArPSBcIlxcbk5vZGVzIGRvIE5PVCBvdmVybGFwLlwiO1xuICAgIC8vIElmIHRoZXJlJ3Mgbm8gb3ZlcmxhcCwgZm9yY2UgaXMgaW52ZXJzZWx5IHByb3BvcnRpb25hbFxuICAgIC8vIHRvIHNxdWFyZWQgZGlzdGFuY2VcblxuICAgIC8vIEdldCBjbGlwcGluZyBwb2ludHMgZm9yIGJvdGggbm9kZXNcbiAgICB2YXIgcG9pbnQxID0gZmluZENsaXBwaW5nUG9pbnQobm9kZTEsIGRpcmVjdGlvblgsIGRpcmVjdGlvblkpO1xuICAgIHZhciBwb2ludDIgPSBmaW5kQ2xpcHBpbmdQb2ludChub2RlMiwgLTEgKiBkaXJlY3Rpb25YLCAtMSAqIGRpcmVjdGlvblkpO1xuXG4gICAgLy8gVXNlIGNsaXBwaW5nIHBvaW50cyB0byBjb21wdXRlIGRpc3RhbmNlXG4gICAgdmFyIGRpc3RhbmNlWCA9IHBvaW50Mi54IC0gcG9pbnQxLng7XG4gICAgdmFyIGRpc3RhbmNlWSA9IHBvaW50Mi55IC0gcG9pbnQxLnk7XG4gICAgdmFyIGRpc3RhbmNlU3FyID0gZGlzdGFuY2VYICogZGlzdGFuY2VYICsgZGlzdGFuY2VZICogZGlzdGFuY2VZO1xuICAgIHZhciBkaXN0YW5jZSA9IE1hdGguc3FydChkaXN0YW5jZVNxcik7XG4gICAgLy8gcyArPSBcIlxcbkRpc3RhbmNlOiBcIiArIGRpc3RhbmNlO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgbW9kdWxlIGFuZCBjb21wb25lbnRzIG9mIHRoZSBmb3JjZSB2ZWN0b3JcbiAgICB2YXIgZm9yY2UgPSAobm9kZTEubm9kZVJlcHVsc2lvbiArIG5vZGUyLm5vZGVSZXB1bHNpb24pIC8gZGlzdGFuY2VTcXI7XG4gICAgdmFyIGZvcmNlWCA9IGZvcmNlICogZGlzdGFuY2VYIC8gZGlzdGFuY2U7XG4gICAgdmFyIGZvcmNlWSA9IGZvcmNlICogZGlzdGFuY2VZIC8gZGlzdGFuY2U7XG4gIH1cblxuICAvLyBBcHBseSBmb3JjZVxuICBpZiAoIW5vZGUxLmlzTG9ja2VkKSB7XG4gICAgbm9kZTEub2Zmc2V0WCAtPSBmb3JjZVg7XG4gICAgbm9kZTEub2Zmc2V0WSAtPSBmb3JjZVk7XG4gIH1cbiAgaWYgKCFub2RlMi5pc0xvY2tlZCkge1xuICAgIG5vZGUyLm9mZnNldFggKz0gZm9yY2VYO1xuICAgIG5vZGUyLm9mZnNldFkgKz0gZm9yY2VZO1xuICB9XG5cbiAgLy8gcyArPSBcIlxcbkZvcmNlWDogXCIgKyBmb3JjZVggKyBcIiBGb3JjZVk6IFwiICsgZm9yY2VZO1xuICAvLyBsb2dEZWJ1ZyhzKTtcblxuICByZXR1cm47XG59O1xuXG4vKipcbiAqIEBicmllZiAgOiBEZXRlcm1pbmVzIHdoZXRoZXIgdHdvIG5vZGVzIG92ZXJsYXAgb3Igbm90XG4gKiBAcmV0dXJuIDogQW1vdW50IG9mIG92ZXJsYXBwaW5nICgwID0+IG5vIG92ZXJsYXApXG4gKi9cbnZhciBub2Rlc092ZXJsYXAgPSBmdW5jdGlvbiBub2Rlc092ZXJsYXAobm9kZTEsIG5vZGUyLCBkWCwgZFkpIHtcbiAgaWYgKGRYID4gMCkge1xuICAgIHZhciBvdmVybGFwWCA9IG5vZGUxLm1heFggLSBub2RlMi5taW5YO1xuICB9IGVsc2Uge1xuICAgIHZhciBvdmVybGFwWCA9IG5vZGUyLm1heFggLSBub2RlMS5taW5YO1xuICB9XG4gIGlmIChkWSA+IDApIHtcbiAgICB2YXIgb3ZlcmxhcFkgPSBub2RlMS5tYXhZIC0gbm9kZTIubWluWTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgb3ZlcmxhcFkgPSBub2RlMi5tYXhZIC0gbm9kZTEubWluWTtcbiAgfVxuICBpZiAob3ZlcmxhcFggPj0gMCAmJiBvdmVybGFwWSA+PSAwKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydChvdmVybGFwWCAqIG92ZXJsYXBYICsgb3ZlcmxhcFkgKiBvdmVybGFwWSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbi8qKlxuICogQGJyaWVmIDogRmluZHMgdGhlIHBvaW50IGluIHdoaWNoIGFuIGVkZ2UgKGRpcmVjdGlvbiBkWCwgZFkpIGludGVyc2VjdHNcbiAqICAgICAgICAgIHRoZSByZWN0YW5ndWxhciBib3VuZGluZyBib3ggb2YgaXQncyBzb3VyY2UvdGFyZ2V0IG5vZGVcbiAqL1xudmFyIGZpbmRDbGlwcGluZ1BvaW50ID0gZnVuY3Rpb24gZmluZENsaXBwaW5nUG9pbnQobm9kZSwgZFgsIGRZKSB7XG4gIC8vIFNob3JjdXRzXG4gIHZhciBYID0gbm9kZS5wb3NpdGlvblg7XG4gIHZhciBZID0gbm9kZS5wb3NpdGlvblk7XG4gIHZhciBIID0gbm9kZS5oZWlnaHQgfHwgMTtcbiAgdmFyIFcgPSBub2RlLndpZHRoIHx8IDE7XG4gIHZhciBkaXJTbG9wZSA9IGRZIC8gZFg7XG4gIHZhciBub2RlU2xvcGUgPSBIIC8gVztcblxuICAvLyB2YXIgcyA9ICdDb21wdXRpbmcgY2xpcHBpbmcgcG9pbnQgb2Ygbm9kZSAnICsgbm9kZS5pZCArXG4gIC8vICAgXCIgLiBIZWlnaHQ6ICBcIiArIEggKyBcIiwgV2lkdGg6IFwiICsgVyArXG4gIC8vICAgXCJcXG5EaXJlY3Rpb24gXCIgKyBkWCArIFwiLCBcIiArIGRZO1xuICAvL1xuICAvLyBDb21wdXRlIGludGVyc2VjdGlvblxuICB2YXIgcmVzID0ge307XG5cbiAgLy8gQ2FzZTogVmVydGljYWwgZGlyZWN0aW9uICh1cClcbiAgaWYgKDAgPT09IGRYICYmIDAgPCBkWSkge1xuICAgIHJlcy54ID0gWDtcbiAgICAvLyBzICs9IFwiXFxuVXAgZGlyZWN0aW9uXCI7XG4gICAgcmVzLnkgPSBZICsgSCAvIDI7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIENhc2U6IFZlcnRpY2FsIGRpcmVjdGlvbiAoZG93bilcbiAgaWYgKDAgPT09IGRYICYmIDAgPiBkWSkge1xuICAgIHJlcy54ID0gWDtcbiAgICByZXMueSA9IFkgKyBIIC8gMjtcbiAgICAvLyBzICs9IFwiXFxuRG93biBkaXJlY3Rpb25cIjtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvLyBDYXNlOiBJbnRlcnNlY3RzIHRoZSByaWdodCBib3JkZXJcbiAgaWYgKDAgPCBkWCAmJiAtMSAqIG5vZGVTbG9wZSA8PSBkaXJTbG9wZSAmJiBkaXJTbG9wZSA8PSBub2RlU2xvcGUpIHtcbiAgICByZXMueCA9IFggKyBXIC8gMjtcbiAgICByZXMueSA9IFkgKyBXICogZFkgLyAyIC8gZFg7XG4gICAgLy8gcyArPSBcIlxcblJpZ2h0Ym9yZGVyXCI7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLy8gQ2FzZTogSW50ZXJzZWN0cyB0aGUgbGVmdCBib3JkZXJcbiAgaWYgKDAgPiBkWCAmJiAtMSAqIG5vZGVTbG9wZSA8PSBkaXJTbG9wZSAmJiBkaXJTbG9wZSA8PSBub2RlU2xvcGUpIHtcbiAgICByZXMueCA9IFggLSBXIC8gMjtcbiAgICByZXMueSA9IFkgLSBXICogZFkgLyAyIC8gZFg7XG4gICAgLy8gcyArPSBcIlxcbkxlZnRib3JkZXJcIjtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvLyBDYXNlOiBJbnRlcnNlY3RzIHRoZSB0b3AgYm9yZGVyXG4gIGlmICgwIDwgZFkgJiYgKGRpclNsb3BlIDw9IC0xICogbm9kZVNsb3BlIHx8IGRpclNsb3BlID49IG5vZGVTbG9wZSkpIHtcbiAgICByZXMueCA9IFggKyBIICogZFggLyAyIC8gZFk7XG4gICAgcmVzLnkgPSBZICsgSCAvIDI7XG4gICAgLy8gcyArPSBcIlxcblRvcCBib3JkZXJcIjtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvLyBDYXNlOiBJbnRlcnNlY3RzIHRoZSBib3R0b20gYm9yZGVyXG4gIGlmICgwID4gZFkgJiYgKGRpclNsb3BlIDw9IC0xICogbm9kZVNsb3BlIHx8IGRpclNsb3BlID49IG5vZGVTbG9wZSkpIHtcbiAgICByZXMueCA9IFggLSBIICogZFggLyAyIC8gZFk7XG4gICAgcmVzLnkgPSBZIC0gSCAvIDI7XG4gICAgLy8gcyArPSBcIlxcbkJvdHRvbSBib3JkZXJcIjtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvLyBzICs9IFwiXFxuQ2xpcHBpbmcgcG9pbnQgZm91bmQgYXQgXCIgKyByZXMueCArIFwiLCBcIiArIHJlcy55O1xuICAvLyBsb2dEZWJ1ZyhzKTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbi8qKlxuICogQGJyaWVmIDogQ2FsY3VsYXRlcyBhbGwgZWRnZSBmb3JjZXNcbiAqL1xudmFyIGNhbGN1bGF0ZUVkZ2VGb3JjZXMgPSBmdW5jdGlvbiBjYWxjdWxhdGVFZGdlRm9yY2VzKGxheW91dEluZm8sIG9wdGlvbnMpIHtcbiAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBlZGdlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8uZWRnZVNpemU7IGkrKykge1xuICAgIC8vIEdldCBlZGdlLCBzb3VyY2UgJiB0YXJnZXQgbm9kZXNcbiAgICB2YXIgZWRnZSA9IGxheW91dEluZm8ubGF5b3V0RWRnZXNbaV07XG4gICAgdmFyIHNvdXJjZUl4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbZWRnZS5zb3VyY2VJZF07XG4gICAgdmFyIHNvdXJjZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbc291cmNlSXhdO1xuICAgIHZhciB0YXJnZXRJeCA9IGxheW91dEluZm8uaWRUb0luZGV4W2VkZ2UudGFyZ2V0SWRdO1xuICAgIHZhciB0YXJnZXQgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW3RhcmdldEl4XTtcblxuICAgIC8vIEdldCBkaXJlY3Rpb24gb2YgbGluZSBjb25uZWN0aW5nIGJvdGggbm9kZSBjZW50ZXJzXG4gICAgdmFyIGRpcmVjdGlvblggPSB0YXJnZXQucG9zaXRpb25YIC0gc291cmNlLnBvc2l0aW9uWDtcbiAgICB2YXIgZGlyZWN0aW9uWSA9IHRhcmdldC5wb3NpdGlvblkgLSBzb3VyY2UucG9zaXRpb25ZO1xuXG4gICAgLy8gSWYgYm90aCBjZW50ZXJzIGFyZSB0aGUgc2FtZSwgZG8gbm90aGluZy5cbiAgICAvLyBBIHJhbmRvbSBmb3JjZSBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQgYXMgbm9kZSByZXB1bHNpb25cbiAgICBpZiAoMCA9PT0gZGlyZWN0aW9uWCAmJiAwID09PSBkaXJlY3Rpb25ZKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgY2xpcHBpbmcgcG9pbnRzIGZvciBib3RoIG5vZGVzXG4gICAgdmFyIHBvaW50MSA9IGZpbmRDbGlwcGluZ1BvaW50KHNvdXJjZSwgZGlyZWN0aW9uWCwgZGlyZWN0aW9uWSk7XG4gICAgdmFyIHBvaW50MiA9IGZpbmRDbGlwcGluZ1BvaW50KHRhcmdldCwgLTEgKiBkaXJlY3Rpb25YLCAtMSAqIGRpcmVjdGlvblkpO1xuICAgIHZhciBseCA9IHBvaW50Mi54IC0gcG9pbnQxLng7XG4gICAgdmFyIGx5ID0gcG9pbnQyLnkgLSBwb2ludDEueTtcbiAgICB2YXIgbCA9IE1hdGguc3FydChseCAqIGx4ICsgbHkgKiBseSk7XG4gICAgdmFyIGZvcmNlID0gTWF0aC5wb3coZWRnZS5pZGVhbExlbmd0aCAtIGwsIDIpIC8gZWRnZS5lbGFzdGljaXR5O1xuICAgIGlmICgwICE9PSBsKSB7XG4gICAgICB2YXIgZm9yY2VYID0gZm9yY2UgKiBseCAvIGw7XG4gICAgICB2YXIgZm9yY2VZID0gZm9yY2UgKiBseSAvIGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmb3JjZVggPSAwO1xuICAgICAgdmFyIGZvcmNlWSA9IDA7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoaXMgZm9yY2UgdG8gdGFyZ2V0IGFuZCBzb3VyY2Ugbm9kZXNcbiAgICBpZiAoIXNvdXJjZS5pc0xvY2tlZCkge1xuICAgICAgc291cmNlLm9mZnNldFggKz0gZm9yY2VYO1xuICAgICAgc291cmNlLm9mZnNldFkgKz0gZm9yY2VZO1xuICAgIH1cbiAgICBpZiAoIXRhcmdldC5pc0xvY2tlZCkge1xuICAgICAgdGFyZ2V0Lm9mZnNldFggLT0gZm9yY2VYO1xuICAgICAgdGFyZ2V0Lm9mZnNldFkgLT0gZm9yY2VZO1xuICAgIH1cblxuICAgIC8vIHZhciBzID0gJ0VkZ2UgZm9yY2UgYmV0d2VlbiBub2RlcyAnICsgc291cmNlLmlkICsgJyBhbmQgJyArIHRhcmdldC5pZDtcbiAgICAvLyBzICs9IFwiXFxuRGlzdGFuY2U6IFwiICsgbCArIFwiIEZvcmNlOiAoXCIgKyBmb3JjZVggKyBcIiwgXCIgKyBmb3JjZVkgKyBcIilcIjtcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBDb21wdXRlcyBncmF2aXR5IGZvcmNlcyBmb3IgYWxsIG5vZGVzXG4gKi9cbnZhciBjYWxjdWxhdGVHcmF2aXR5Rm9yY2VzID0gZnVuY3Rpb24gY2FsY3VsYXRlR3Jhdml0eUZvcmNlcyhsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLmdyYXZpdHkgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGRpc3RUaHJlc2hvbGQgPSAxO1xuXG4gIC8vIHZhciBzID0gJ2NhbGN1bGF0ZUdyYXZpdHlGb3JjZXMnO1xuICAvLyBsb2dEZWJ1ZyhzKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLmdyYXBoU2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGdyYXBoID0gbGF5b3V0SW5mby5ncmFwaFNldFtpXTtcbiAgICB2YXIgbnVtTm9kZXMgPSBncmFwaC5sZW5ndGg7XG5cbiAgICAvLyBzID0gXCJTZXQ6IFwiICsgZ3JhcGgudG9TdHJpbmcoKTtcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcblxuICAgIC8vIENvbXB1dGUgZ3JhcGggY2VudGVyXG4gICAgaWYgKDAgPT09IGkpIHtcbiAgICAgIHZhciBjZW50ZXJYID0gbGF5b3V0SW5mby5jbGllbnRIZWlnaHQgLyAyO1xuICAgICAgdmFyIGNlbnRlclkgPSBsYXlvdXRJbmZvLmNsaWVudFdpZHRoIC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gR2V0IFBhcmVudCBub2RlIGZvciB0aGlzIGdyYXBoLCBhbmQgdXNlIGl0cyBwb3NpdGlvbiBhcyBjZW50ZXJcbiAgICAgIHZhciB0ZW1wID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtncmFwaFswXV1dO1xuICAgICAgdmFyIHBhcmVudCA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbdGVtcC5wYXJlbnRJZF1dO1xuICAgICAgdmFyIGNlbnRlclggPSBwYXJlbnQucG9zaXRpb25YO1xuICAgICAgdmFyIGNlbnRlclkgPSBwYXJlbnQucG9zaXRpb25ZO1xuICAgIH1cbiAgICAvLyBzID0gXCJDZW50ZXIgZm91bmQgYXQ6IFwiICsgY2VudGVyWCArIFwiLCBcIiArIGNlbnRlclk7XG4gICAgLy8gbG9nRGVidWcocyk7XG5cbiAgICAvLyBBcHBseSBmb3JjZSB0byBhbGwgbm9kZXMgaW4gZ3JhcGhcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG51bU5vZGVzOyBqKyspIHtcbiAgICAgIHZhciBub2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtncmFwaFtqXV1dO1xuICAgICAgLy8gcyA9IFwiTm9kZTogXCIgKyBub2RlLmlkO1xuXG4gICAgICBpZiAobm9kZS5pc0xvY2tlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBkeCA9IGNlbnRlclggLSBub2RlLnBvc2l0aW9uWDtcbiAgICAgIHZhciBkeSA9IGNlbnRlclkgLSBub2RlLnBvc2l0aW9uWTtcbiAgICAgIHZhciBkID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcbiAgICAgIGlmIChkID4gZGlzdFRocmVzaG9sZCkge1xuICAgICAgICB2YXIgZnggPSBvcHRpb25zLmdyYXZpdHkgKiBkeCAvIGQ7XG4gICAgICAgIHZhciBmeSA9IG9wdGlvbnMuZ3Jhdml0eSAqIGR5IC8gZDtcbiAgICAgICAgbm9kZS5vZmZzZXRYICs9IGZ4O1xuICAgICAgICBub2RlLm9mZnNldFkgKz0gZnk7XG4gICAgICAgIC8vIHMgKz0gXCI6IEFwcGxpZWQgZm9yY2U6IFwiICsgZnggKyBcIiwgXCIgKyBmeTtcbiAgICAgIH1cbiAgICAgIC8vIGxvZ0RlYnVnKHMpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBAYnJpZWYgICAgICAgICAgOiBUaGlzIGZ1bmN0aW9uIHByb3BhZ2F0ZXMgdGhlIGV4aXN0aW5nIG9mZnNldHMgZnJvbVxuICogICAgICAgICAgICAgICAgICAgcGFyZW50IG5vZGVzIHRvIGl0cyBkZXNjZW5kZW50cy5cbiAqIEBhcmcgbGF5b3V0SW5mbyA6IGxheW91dEluZm8gT2JqZWN0XG4gKiBAYXJnIGN5ICAgICAgICAgOiBjeXRvc2NhcGUgT2JqZWN0XG4gKiBAYXJnIG9wdGlvbnMgICAgOiBMYXlvdXQgb3B0aW9uc1xuICovXG52YXIgcHJvcGFnYXRlRm9yY2VzID0gZnVuY3Rpb24gcHJvcGFnYXRlRm9yY2VzKGxheW91dEluZm8sIG9wdGlvbnMpIHtcbiAgLy8gSW5saW5lIGltcGxlbWVudGF0aW9uIG9mIGEgcXVldWUsIHVzZWQgZm9yIHRyYXZlcnNpbmcgdGhlIGdyYXBoIGluIEJGUyBvcmRlclxuICB2YXIgcXVldWUgPSBbXTtcbiAgdmFyIHN0YXJ0ID0gMDsgLy8gUG9pbnRzIHRvIHRoZSBzdGFydCB0aGUgcXVldWVcbiAgdmFyIGVuZCA9IC0xOyAvLyBQb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcblxuICAvLyBsb2dEZWJ1ZygncHJvcGFnYXRlRm9yY2VzJyk7XG5cbiAgLy8gU3RhcnQgYnkgdmlzaXRpbmcgdGhlIG5vZGVzIGluIHRoZSByb290IGdyYXBoXG4gIHF1ZXVlLnB1c2guYXBwbHkocXVldWUsIGxheW91dEluZm8uZ3JhcGhTZXRbMF0pO1xuICBlbmQgKz0gbGF5b3V0SW5mby5ncmFwaFNldFswXS5sZW5ndGg7XG5cbiAgLy8gVHJhdmVyc2UgdGhlIGdyYXBoLCBsZXZlbCBieSBsZXZlbCxcbiAgd2hpbGUgKHN0YXJ0IDw9IGVuZCkge1xuICAgIC8vIEdldCB0aGUgbm9kZSB0byB2aXNpdCBhbmQgcmVtb3ZlIGl0IGZyb20gcXVldWVcbiAgICB2YXIgbm9kZUlkID0gcXVldWVbc3RhcnQrK107XG4gICAgdmFyIG5vZGVJbmRleCA9IGxheW91dEluZm8uaWRUb0luZGV4W25vZGVJZF07XG4gICAgdmFyIG5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW25vZGVJbmRleF07XG4gICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcblxuICAgIC8vIFdlIG9ubHkgbmVlZCB0byBwcm9jZXNzIHRoZSBub2RlIGlmIGl0J3MgY29tcG91bmRcbiAgICBpZiAoMCA8IGNoaWxkcmVuLmxlbmd0aCAmJiAhbm9kZS5pc0xvY2tlZCkge1xuICAgICAgdmFyIG9mZlggPSBub2RlLm9mZnNldFg7XG4gICAgICB2YXIgb2ZmWSA9IG5vZGUub2Zmc2V0WTtcblxuICAgICAgLy8gdmFyIHMgPSBcIlByb3BhZ2F0aW5nIG9mZnNldCBmcm9tIHBhcmVudCBub2RlIDogXCIgKyBub2RlLmlkICtcbiAgICAgIC8vICAgXCIuIE9mZnNldFg6IFwiICsgb2ZmWCArIFwiLiBPZmZzZXRZOiBcIiArIG9mZlk7XG4gICAgICAvLyBzICs9IFwiXFxuIENoaWxkcmVuOiBcIiArIGNoaWxkcmVuLnRvU3RyaW5nKCk7XG4gICAgICAvLyBsb2dEZWJ1ZyhzKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGROb2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtjaGlsZHJlbltpXV1dO1xuICAgICAgICAvLyBQcm9wYWdhdGUgb2Zmc2V0XG4gICAgICAgIGNoaWxkTm9kZS5vZmZzZXRYICs9IG9mZlg7XG4gICAgICAgIGNoaWxkTm9kZS5vZmZzZXRZICs9IG9mZlk7XG4gICAgICAgIC8vIEFkZCBjaGlsZHJlbiB0byBxdWV1ZSB0byBiZSB2aXNpdGVkXG4gICAgICAgIHF1ZXVlWysrZW5kXSA9IGNoaWxkcmVuW2ldO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNldCBwYXJlbnQgb2Zmc2V0c1xuICAgICAgbm9kZS5vZmZzZXRYID0gMDtcbiAgICAgIG5vZGUub2Zmc2V0WSA9IDA7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEBicmllZiA6IFVwZGF0ZXMgdGhlIGxheW91dCBtb2RlbCBwb3NpdGlvbnMsIGJhc2VkIG9uXG4gKiAgICAgICAgICB0aGUgYWNjdW11bGF0ZWQgZm9yY2VzXG4gKi9cbnZhciB1cGRhdGVQb3NpdGlvbnMgPSBmdW5jdGlvbiB1cGRhdGVQb3NpdGlvbnMobGF5b3V0SW5mbywgb3B0aW9ucykge1xuICAvLyB2YXIgcyA9ICdVcGRhdGluZyBwb3NpdGlvbnMnO1xuICAvLyBsb2dEZWJ1ZyhzKTtcblxuICAvLyBSZXNldCBib3VuZGFyaWVzIGZvciBjb21wb3VuZCBub2Rlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8ubm9kZVNpemU7IGkrKykge1xuICAgIHZhciBuID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tpXTtcbiAgICBpZiAoMCA8IG4uY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAvLyBsb2dEZWJ1ZyhcIlJlc2V0dGluZyBib3VuZGFyaWVzIG9mIGNvbXBvdW5kIG5vZGU6IFwiICsgbi5pZCk7XG4gICAgICBuLm1heFggPSB1bmRlZmluZWQ7XG4gICAgICBuLm1pblggPSB1bmRlZmluZWQ7XG4gICAgICBuLm1heFkgPSB1bmRlZmluZWQ7XG4gICAgICBuLm1pblkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ub2RlU2l6ZTsgaSsrKSB7XG4gICAgdmFyIG4gPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2ldO1xuICAgIGlmICgwIDwgbi5jaGlsZHJlbi5sZW5ndGggfHwgbi5pc0xvY2tlZCkge1xuICAgICAgLy8gTm8gbmVlZCB0byBzZXQgY29tcG91bmQgb3IgbG9ja2VkIG5vZGUgcG9zaXRpb25cbiAgICAgIC8vIGxvZ0RlYnVnKFwiU2tpcHBpbmcgcG9zaXRpb24gdXBkYXRlIG9mIG5vZGU6IFwiICsgbi5pZCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gcyA9IFwiTm9kZTogXCIgKyBuLmlkICsgXCIgUHJldmlvdXMgcG9zaXRpb246IChcIiArXG4gICAgLy8gbi5wb3NpdGlvblggKyBcIiwgXCIgKyBuLnBvc2l0aW9uWSArIFwiKS5cIjtcblxuICAgIC8vIExpbWl0IGRpc3BsYWNlbWVudCBpbiBvcmRlciB0byBpbXByb3ZlIHN0YWJpbGl0eVxuICAgIHZhciB0ZW1wRm9yY2UgPSBsaW1pdEZvcmNlKG4ub2Zmc2V0WCwgbi5vZmZzZXRZLCBsYXlvdXRJbmZvLnRlbXBlcmF0dXJlKTtcbiAgICBuLnBvc2l0aW9uWCArPSB0ZW1wRm9yY2UueDtcbiAgICBuLnBvc2l0aW9uWSArPSB0ZW1wRm9yY2UueTtcbiAgICBuLm9mZnNldFggPSAwO1xuICAgIG4ub2Zmc2V0WSA9IDA7XG4gICAgbi5taW5YID0gbi5wb3NpdGlvblggLSBuLndpZHRoO1xuICAgIG4ubWF4WCA9IG4ucG9zaXRpb25YICsgbi53aWR0aDtcbiAgICBuLm1pblkgPSBuLnBvc2l0aW9uWSAtIG4uaGVpZ2h0O1xuICAgIG4ubWF4WSA9IG4ucG9zaXRpb25ZICsgbi5oZWlnaHQ7XG4gICAgLy8gcyArPSBcIiBOZXcgUG9zaXRpb246IChcIiArIG4ucG9zaXRpb25YICsgXCIsIFwiICsgbi5wb3NpdGlvblkgKyBcIikuXCI7XG4gICAgLy8gbG9nRGVidWcocyk7XG5cbiAgICAvLyBVcGRhdGUgYW5jZXN0cnkgYm91ZGFyaWVzXG4gICAgdXBkYXRlQW5jZXN0cnlCb3VuZGFyaWVzKG4sIGxheW91dEluZm8pO1xuICB9XG5cbiAgLy8gVXBkYXRlIHNpemUsIHBvc2l0aW9uIG9mIGNvbXB1bmQgbm9kZXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLm5vZGVTaXplOyBpKyspIHtcbiAgICB2YXIgbiA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbaV07XG4gICAgaWYgKDAgPCBuLmNoaWxkcmVuLmxlbmd0aCAmJiAhbi5pc0xvY2tlZCkge1xuICAgICAgbi5wb3NpdGlvblggPSAobi5tYXhYICsgbi5taW5YKSAvIDI7XG4gICAgICBuLnBvc2l0aW9uWSA9IChuLm1heFkgKyBuLm1pblkpIC8gMjtcbiAgICAgIG4ud2lkdGggPSBuLm1heFggLSBuLm1pblg7XG4gICAgICBuLmhlaWdodCA9IG4ubWF4WSAtIG4ubWluWTtcbiAgICAgIC8vIHMgPSBcIlVwZGF0aW5nIHBvc2l0aW9uLCBzaXplIG9mIGNvbXBvdW5kIG5vZGUgXCIgKyBuLmlkO1xuICAgICAgLy8gcyArPSBcIlxcblBvc2l0aW9uWDogXCIgKyBuLnBvc2l0aW9uWCArIFwiLCBQb3NpdGlvblk6IFwiICsgbi5wb3NpdGlvblk7XG4gICAgICAvLyBzICs9IFwiXFxuV2lkdGg6IFwiICsgbi53aWR0aCArIFwiLCBIZWlnaHQ6IFwiICsgbi5oZWlnaHQ7XG4gICAgICAvLyBsb2dEZWJ1ZyhzKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQGJyaWVmIDogTGltaXRzIGEgZm9yY2UgKGZvcmNlWCwgZm9yY2VZKSB0byBiZSBub3RcbiAqICAgICAgICAgIGdyZWF0ZXIgKGluIG1vZHVsbykgdGhhbiBtYXguXG4gOCAgICAgICAgICBQcmVzZXJ2ZXMgZm9yY2UgZGlyZWN0aW9uLlxuICAqL1xudmFyIGxpbWl0Rm9yY2UgPSBmdW5jdGlvbiBsaW1pdEZvcmNlKGZvcmNlWCwgZm9yY2VZLCBtYXgpIHtcbiAgLy8gdmFyIHMgPSBcIkxpbWl0aW5nIGZvcmNlOiAoXCIgKyBmb3JjZVggKyBcIiwgXCIgKyBmb3JjZVkgKyBcIikuIE1heDogXCIgKyBtYXg7XG4gIHZhciBmb3JjZSA9IE1hdGguc3FydChmb3JjZVggKiBmb3JjZVggKyBmb3JjZVkgKiBmb3JjZVkpO1xuICBpZiAoZm9yY2UgPiBtYXgpIHtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgeDogbWF4ICogZm9yY2VYIC8gZm9yY2UsXG4gICAgICB5OiBtYXggKiBmb3JjZVkgLyBmb3JjZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdmFyIHJlcyA9IHtcbiAgICAgIHg6IGZvcmNlWCxcbiAgICAgIHk6IGZvcmNlWVxuICAgIH07XG4gIH1cblxuICAvLyBzICs9IFwiLlxcblJlc3VsdDogKFwiICsgcmVzLnggKyBcIiwgXCIgKyByZXMueSArIFwiKVwiO1xuICAvLyBsb2dEZWJ1ZyhzKTtcblxuICByZXR1cm4gcmVzO1xufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBGdW5jdGlvbiB1c2VkIGZvciBrZWVwaW5nIHRyYWNrIG9mIGNvbXBvdW5kIG5vZGVcbiAqICAgICAgICAgIHNpemVzLCBzaW5jZSB0aGV5IHNob3VsZCBib3VuZCBhbGwgdGhlaXIgc3Vibm9kZXMuXG4gKi9cbnZhciB1cGRhdGVBbmNlc3RyeUJvdW5kYXJpZXMgPSBmdW5jdGlvbiB1cGRhdGVBbmNlc3RyeUJvdW5kYXJpZXMobm9kZSwgbGF5b3V0SW5mbykge1xuICAvLyB2YXIgcyA9IFwiUHJvcGFnYXRpbmcgbmV3IHBvc2l0aW9uL3NpemUgb2Ygbm9kZSBcIiArIG5vZGUuaWQ7XG4gIHZhciBwYXJlbnRJZCA9IG5vZGUucGFyZW50SWQ7XG4gIGlmIChudWxsID09IHBhcmVudElkKSB7XG4gICAgLy8gSWYgdGhlcmUncyBubyBwYXJlbnQsIHdlIGFyZSBkb25lXG4gICAgLy8gcyArPSBcIi4gTm8gcGFyZW50IG5vZGUuXCI7XG4gICAgLy8gbG9nRGVidWcocyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gR2V0IFBhcmVudCBOb2RlXG4gIHZhciBwID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtwYXJlbnRJZF1dO1xuICB2YXIgZmxhZyA9IGZhbHNlO1xuXG4gIC8vIE1heFhcbiAgaWYgKG51bGwgPT0gcC5tYXhYIHx8IG5vZGUubWF4WCArIHAucGFkUmlnaHQgPiBwLm1heFgpIHtcbiAgICBwLm1heFggPSBub2RlLm1heFggKyBwLnBhZFJpZ2h0O1xuICAgIGZsYWcgPSB0cnVlO1xuICAgIC8vIHMgKz0gXCJcXG5OZXcgbWF4WCBmb3IgcGFyZW50IG5vZGUgXCIgKyBwLmlkICsgXCI6IFwiICsgcC5tYXhYO1xuICB9XG5cbiAgLy8gTWluWFxuICBpZiAobnVsbCA9PSBwLm1pblggfHwgbm9kZS5taW5YIC0gcC5wYWRMZWZ0IDwgcC5taW5YKSB7XG4gICAgcC5taW5YID0gbm9kZS5taW5YIC0gcC5wYWRMZWZ0O1xuICAgIGZsYWcgPSB0cnVlO1xuICAgIC8vIHMgKz0gXCJcXG5OZXcgbWluWCBmb3IgcGFyZW50IG5vZGUgXCIgKyBwLmlkICsgXCI6IFwiICsgcC5taW5YO1xuICB9XG5cbiAgLy8gTWF4WVxuICBpZiAobnVsbCA9PSBwLm1heFkgfHwgbm9kZS5tYXhZICsgcC5wYWRCb3R0b20gPiBwLm1heFkpIHtcbiAgICBwLm1heFkgPSBub2RlLm1heFkgKyBwLnBhZEJvdHRvbTtcbiAgICBmbGFnID0gdHJ1ZTtcbiAgICAvLyBzICs9IFwiXFxuTmV3IG1heFkgZm9yIHBhcmVudCBub2RlIFwiICsgcC5pZCArIFwiOiBcIiArIHAubWF4WTtcbiAgfVxuXG4gIC8vIE1pbllcbiAgaWYgKG51bGwgPT0gcC5taW5ZIHx8IG5vZGUubWluWSAtIHAucGFkVG9wIDwgcC5taW5ZKSB7XG4gICAgcC5taW5ZID0gbm9kZS5taW5ZIC0gcC5wYWRUb3A7XG4gICAgZmxhZyA9IHRydWU7XG4gICAgLy8gcyArPSBcIlxcbk5ldyBtaW5ZIGZvciBwYXJlbnQgbm9kZSBcIiArIHAuaWQgKyBcIjogXCIgKyBwLm1pblk7XG4gIH1cblxuICAvLyBJZiB1cGRhdGVkIGJvdW5kYXJpZXMsIHByb3BhZ2F0ZSBjaGFuZ2VzIHVwd2FyZFxuICBpZiAoZmxhZykge1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuICAgIHJldHVybiB1cGRhdGVBbmNlc3RyeUJvdW5kYXJpZXMocCwgbGF5b3V0SW5mbyk7XG4gIH1cblxuICAvLyBzICs9IFwiLiBObyBjaGFuZ2VzIGluIGJvdW5kYXJpZXMvcG9zaXRpb24gb2YgcGFyZW50IG5vZGUgXCIgKyBwLmlkO1xuICAvLyBsb2dEZWJ1ZyhzKTtcbiAgcmV0dXJuO1xufTtcbnZhciBzZXBhcmF0ZUNvbXBvbmVudHMgPSBmdW5jdGlvbiBzZXBhcmF0ZUNvbXBvbmVudHMobGF5b3V0SW5mbywgb3B0aW9ucykge1xuICB2YXIgbm9kZXMgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzO1xuICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICB2YXIgY2lkID0gbm9kZS5jbXB0SWQ7XG4gICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbY2lkXSA9IGNvbXBvbmVudHNbY2lkXSB8fCBbXTtcbiAgICBjb21wb25lbnQucHVzaChub2RlKTtcbiAgfVxuICB2YXIgdG90YWxBID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGMgPSBjb21wb25lbnRzW2ldO1xuICAgIGlmICghYykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGMueDEgPSBJbmZpbml0eTtcbiAgICBjLngyID0gLUluZmluaXR5O1xuICAgIGMueTEgPSBJbmZpbml0eTtcbiAgICBjLnkyID0gLUluZmluaXR5O1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgYy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIG4gPSBjW2pdO1xuICAgICAgYy54MSA9IE1hdGgubWluKGMueDEsIG4ucG9zaXRpb25YIC0gbi53aWR0aCAvIDIpO1xuICAgICAgYy54MiA9IE1hdGgubWF4KGMueDIsIG4ucG9zaXRpb25YICsgbi53aWR0aCAvIDIpO1xuICAgICAgYy55MSA9IE1hdGgubWluKGMueTEsIG4ucG9zaXRpb25ZIC0gbi5oZWlnaHQgLyAyKTtcbiAgICAgIGMueTIgPSBNYXRoLm1heChjLnkyLCBuLnBvc2l0aW9uWSArIG4uaGVpZ2h0IC8gMik7XG4gICAgfVxuICAgIGMudyA9IGMueDIgLSBjLngxO1xuICAgIGMuaCA9IGMueTIgLSBjLnkxO1xuICAgIHRvdGFsQSArPSBjLncgKiBjLmg7XG4gIH1cbiAgY29tcG9uZW50cy5zb3J0KGZ1bmN0aW9uIChjMSwgYzIpIHtcbiAgICByZXR1cm4gYzIudyAqIGMyLmggLSBjMS53ICogYzEuaDtcbiAgfSk7XG4gIHZhciB4ID0gMDtcbiAgdmFyIHkgPSAwO1xuICB2YXIgdXNlZFcgPSAwO1xuICB2YXIgcm93SCA9IDA7XG4gIHZhciBtYXhSb3dXID0gTWF0aC5zcXJ0KHRvdGFsQSkgKiBsYXlvdXRJbmZvLmNsaWVudFdpZHRoIC8gbGF5b3V0SW5mby5jbGllbnRIZWlnaHQ7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjID0gY29tcG9uZW50c1tpXTtcbiAgICBpZiAoIWMpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBuID0gY1tqXTtcbiAgICAgIGlmICghbi5pc0xvY2tlZCkge1xuICAgICAgICBuLnBvc2l0aW9uWCArPSB4IC0gYy54MTtcbiAgICAgICAgbi5wb3NpdGlvblkgKz0geSAtIGMueTE7XG4gICAgICB9XG4gICAgfVxuICAgIHggKz0gYy53ICsgb3B0aW9ucy5jb21wb25lbnRTcGFjaW5nO1xuICAgIHVzZWRXICs9IGMudyArIG9wdGlvbnMuY29tcG9uZW50U3BhY2luZztcbiAgICByb3dIID0gTWF0aC5tYXgocm93SCwgYy5oKTtcbiAgICBpZiAodXNlZFcgPiBtYXhSb3dXKSB7XG4gICAgICB5ICs9IHJvd0ggKyBvcHRpb25zLmNvbXBvbmVudFNwYWNpbmc7XG4gICAgICB4ID0gMDtcbiAgICAgIHVzZWRXID0gMDtcbiAgICAgIHJvd0ggPSAwO1xuICAgIH1cbiAgfVxufTtcblxudmFyIGRlZmF1bHRzJDMgPSB7XG4gIGZpdDogdHJ1ZSxcbiAgLy8gd2hldGhlciB0byBmaXQgdGhlIHZpZXdwb3J0IHRvIHRoZSBncmFwaFxuICBwYWRkaW5nOiAzMCxcbiAgLy8gcGFkZGluZyB1c2VkIG9uIGZpdFxuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgYXZvaWRPdmVybGFwOiB0cnVlLFxuICAvLyBwcmV2ZW50cyBub2RlIG92ZXJsYXAsIG1heSBvdmVyZmxvdyBib3VuZGluZ0JveCBpZiBub3QgZW5vdWdoIHNwYWNlXG4gIGF2b2lkT3ZlcmxhcFBhZGRpbmc6IDEwLFxuICAvLyBleHRyYSBzcGFjaW5nIGFyb3VuZCBub2RlcyB3aGVuIGF2b2lkT3ZlcmxhcDogdHJ1ZVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxuICBzcGFjaW5nRmFjdG9yOiB1bmRlZmluZWQsXG4gIC8vIEFwcGxpZXMgYSBtdWx0aXBsaWNhdGl2ZSBmYWN0b3IgKD4wKSB0byBleHBhbmQgb3IgY29tcHJlc3MgdGhlIG92ZXJhbGwgYXJlYSB0aGF0IHRoZSBub2RlcyB0YWtlIHVwXG4gIGNvbmRlbnNlOiBmYWxzZSxcbiAgLy8gdXNlcyBhbGwgYXZhaWxhYmxlIHNwYWNlIG9uIGZhbHNlLCB1c2VzIG1pbmltYWwgc3BhY2Ugb24gdHJ1ZVxuICByb3dzOiB1bmRlZmluZWQsXG4gIC8vIGZvcmNlIG51bSBvZiByb3dzIGluIHRoZSBncmlkXG4gIGNvbHM6IHVuZGVmaW5lZCxcbiAgLy8gZm9yY2UgbnVtIG9mIGNvbHVtbnMgaW4gdGhlIGdyaWRcbiAgcG9zaXRpb246IGZ1bmN0aW9uIHBvc2l0aW9uKG5vZGUpIHt9LFxuICAvLyByZXR1cm5zIHsgcm93LCBjb2wgfSBmb3IgZWxlbWVudFxuICBzb3J0OiB1bmRlZmluZWQsXG4gIC8vIGEgc29ydGluZyBmdW5jdGlvbiB0byBvcmRlciB0aGUgbm9kZXM7IGUuZy4gZnVuY3Rpb24oYSwgYil7IHJldHVybiBhLmRhdGEoJ3dlaWdodCcpIC0gYi5kYXRhKCd3ZWlnaHQnKSB9XG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0cyBcbn07XG5cbmZ1bmN0aW9uIEdyaWRMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzJDMsIG9wdGlvbnMpO1xufVxuR3JpZExheW91dC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcGFyYW1zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgb3B0aW9ucyA9IHBhcmFtcztcbiAgdmFyIGN5ID0gcGFyYW1zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpLm5vdCgnOnBhcmVudCcpO1xuICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgbm9kZXMgPSBub2Rlcy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gIH1cbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG4gIGlmIChiYi5oID09PSAwIHx8IGJiLncgPT09IDApIHtcbiAgICBlbGVzLm5vZGVzKCkubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGJiLngxLFxuICAgICAgICB5OiBiYi55MVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICAvLyB3aWR0aC9oZWlnaHQgKiBzcGxpdHNeMiA9IGNlbGxzIHdoZXJlIHNwbGl0cyBpcyBudW1iZXIgb2YgdGltZXMgdG8gc3BsaXQgd2lkdGhcbiAgICB2YXIgY2VsbHMgPSBub2Rlcy5zaXplKCk7XG4gICAgdmFyIHNwbGl0cyA9IE1hdGguc3FydChjZWxscyAqIGJiLmggLyBiYi53KTtcbiAgICB2YXIgcm93cyA9IE1hdGgucm91bmQoc3BsaXRzKTtcbiAgICB2YXIgY29scyA9IE1hdGgucm91bmQoYmIudyAvIGJiLmggKiBzcGxpdHMpO1xuICAgIHZhciBzbWFsbCA9IGZ1bmN0aW9uIHNtYWxsKHZhbCkge1xuICAgICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1pbihyb3dzLCBjb2xzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBtaW4gPSBNYXRoLm1pbihyb3dzLCBjb2xzKTtcbiAgICAgICAgaWYgKG1pbiA9PSByb3dzKSB7XG4gICAgICAgICAgcm93cyA9IHZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2xzID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgbGFyZ2UgPSBmdW5jdGlvbiBsYXJnZSh2YWwpIHtcbiAgICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgocm93cywgY29scyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbWF4ID0gTWF0aC5tYXgocm93cywgY29scyk7XG4gICAgICAgIGlmIChtYXggPT0gcm93cykge1xuICAgICAgICAgIHJvd3MgPSB2YWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29scyA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdmFyIG9Sb3dzID0gb3B0aW9ucy5yb3dzO1xuICAgIHZhciBvQ29scyA9IG9wdGlvbnMuY29scyAhPSBudWxsID8gb3B0aW9ucy5jb2xzIDogb3B0aW9ucy5jb2x1bW5zO1xuXG4gICAgLy8gaWYgcm93cyBvciBjb2x1bW5zIHdlcmUgc2V0IGluIG9wdGlvbnMsIHVzZSB0aG9zZSB2YWx1ZXNcbiAgICBpZiAob1Jvd3MgIT0gbnVsbCAmJiBvQ29scyAhPSBudWxsKSB7XG4gICAgICByb3dzID0gb1Jvd3M7XG4gICAgICBjb2xzID0gb0NvbHM7XG4gICAgfSBlbHNlIGlmIChvUm93cyAhPSBudWxsICYmIG9Db2xzID09IG51bGwpIHtcbiAgICAgIHJvd3MgPSBvUm93cztcbiAgICAgIGNvbHMgPSBNYXRoLmNlaWwoY2VsbHMgLyByb3dzKTtcbiAgICB9IGVsc2UgaWYgKG9Sb3dzID09IG51bGwgJiYgb0NvbHMgIT0gbnVsbCkge1xuICAgICAgY29scyA9IG9Db2xzO1xuICAgICAgcm93cyA9IE1hdGguY2VpbChjZWxscyAvIGNvbHMpO1xuICAgIH1cblxuICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIGF1dG9tYXRpYyB2YWx1ZXMgYW5kIGFkanVzdCBhY2NvcmRpbmdseVxuXG4gICAgLy8gaWYgcm91bmRpbmcgd2FzIHVwLCBzZWUgaWYgd2UgY2FuIHJlZHVjZSByb3dzIG9yIGNvbHVtbnNcbiAgICBlbHNlIGlmIChjb2xzICogcm93cyA+IGNlbGxzKSB7XG4gICAgICB2YXIgc20gPSBzbWFsbCgpO1xuICAgICAgdmFyIGxnID0gbGFyZ2UoKTtcblxuICAgICAgLy8gcmVkdWNpbmcgdGhlIHNtYWxsIHNpZGUgdGFrZXMgYXdheSB0aGUgbW9zdCBjZWxscywgc28gdHJ5IGl0IGZpcnN0XG4gICAgICBpZiAoKHNtIC0gMSkgKiBsZyA+PSBjZWxscykge1xuICAgICAgICBzbWFsbChzbSAtIDEpO1xuICAgICAgfSBlbHNlIGlmICgobGcgLSAxKSAqIHNtID49IGNlbGxzKSB7XG4gICAgICAgIGxhcmdlKGxnIC0gMSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIHJvdW5kaW5nIHdhcyB0b28gbG93LCBhZGQgcm93cyBvciBjb2x1bW5zXG4gICAgICB3aGlsZSAoY29scyAqIHJvd3MgPCBjZWxscykge1xuICAgICAgICB2YXIgX3NtID0gc21hbGwoKTtcbiAgICAgICAgdmFyIF9sZyA9IGxhcmdlKCk7XG5cbiAgICAgICAgLy8gdHJ5IHRvIGFkZCB0byBsYXJnZXIgc2lkZSBmaXJzdCAoYWRkcyBsZXNzIGluIG11bHRpcGxpY2F0aW9uKVxuICAgICAgICBpZiAoKF9sZyArIDEpICogX3NtID49IGNlbGxzKSB7XG4gICAgICAgICAgbGFyZ2UoX2xnICsgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc21hbGwoX3NtICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGNlbGxXaWR0aCA9IGJiLncgLyBjb2xzO1xuICAgIHZhciBjZWxsSGVpZ2h0ID0gYmIuaCAvIHJvd3M7XG4gICAgaWYgKG9wdGlvbnMuY29uZGVuc2UpIHtcbiAgICAgIGNlbGxXaWR0aCA9IDA7XG4gICAgICBjZWxsSGVpZ2h0ID0gMDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuYXZvaWRPdmVybGFwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHZhciBwb3MgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uO1xuICAgICAgICBpZiAocG9zLnggPT0gbnVsbCB8fCBwb3MueSA9PSBudWxsKSB7XG4gICAgICAgICAgLy8gZm9yIGJiXG4gICAgICAgICAgcG9zLnggPSAwO1xuICAgICAgICAgIHBvcy55ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmJiID0gbm9kZS5sYXlvdXREaW1lbnNpb25zKG9wdGlvbnMpO1xuICAgICAgICB2YXIgcCA9IG9wdGlvbnMuYXZvaWRPdmVybGFwUGFkZGluZztcbiAgICAgICAgdmFyIHcgPSBuYmIudyArIHA7XG4gICAgICAgIHZhciBoID0gbmJiLmggKyBwO1xuICAgICAgICBjZWxsV2lkdGggPSBNYXRoLm1heChjZWxsV2lkdGgsIHcpO1xuICAgICAgICBjZWxsSGVpZ2h0ID0gTWF0aC5tYXgoY2VsbEhlaWdodCwgaCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBjZWxsVXNlZCA9IHt9OyAvLyBlLmcuICdjLTAtMicgPT4gdHJ1ZVxuXG4gICAgdmFyIHVzZWQgPSBmdW5jdGlvbiB1c2VkKHJvdywgY29sKSB7XG4gICAgICByZXR1cm4gY2VsbFVzZWRbJ2MtJyArIHJvdyArICctJyArIGNvbF0gPyB0cnVlIDogZmFsc2U7XG4gICAgfTtcbiAgICB2YXIgdXNlID0gZnVuY3Rpb24gdXNlKHJvdywgY29sKSB7XG4gICAgICBjZWxsVXNlZFsnYy0nICsgcm93ICsgJy0nICsgY29sXSA9IHRydWU7XG4gICAgfTtcblxuICAgIC8vIHRvIGtlZXAgdHJhY2sgb2YgY3VycmVudCBjZWxsIHBvc2l0aW9uXG4gICAgdmFyIHJvdyA9IDA7XG4gICAgdmFyIGNvbCA9IDA7XG4gICAgdmFyIG1vdmVUb05leHRDZWxsID0gZnVuY3Rpb24gbW92ZVRvTmV4dENlbGwoKSB7XG4gICAgICBjb2wrKztcbiAgICAgIGlmIChjb2wgPj0gY29scykge1xuICAgICAgICBjb2wgPSAwO1xuICAgICAgICByb3crKztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gZ2V0IGEgY2FjaGUgb2YgYWxsIHRoZSBtYW51YWwgcG9zaXRpb25zXG4gICAgdmFyIGlkMm1hblBvcyA9IHt9O1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBub2Rlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfbm9kZSA9IG5vZGVzW19pXTtcbiAgICAgIHZhciByY1BvcyA9IG9wdGlvbnMucG9zaXRpb24oX25vZGUpO1xuICAgICAgaWYgKHJjUG9zICYmIChyY1Bvcy5yb3cgIT09IHVuZGVmaW5lZCB8fCByY1Bvcy5jb2wgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLy8gbXVzdCBoYXZlIGF0IGxlYXN0IHJvdyBvciBjb2wgZGVmJ2RcbiAgICAgICAgdmFyIF9wb3MgPSB7XG4gICAgICAgICAgcm93OiByY1Bvcy5yb3csXG4gICAgICAgICAgY29sOiByY1Bvcy5jb2xcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKF9wb3MuY29sID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBmaW5kIHVudXNlZCBjb2xcbiAgICAgICAgICBfcG9zLmNvbCA9IDA7XG4gICAgICAgICAgd2hpbGUgKHVzZWQoX3Bvcy5yb3csIF9wb3MuY29sKSkge1xuICAgICAgICAgICAgX3Bvcy5jb2wrKztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoX3Bvcy5yb3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIGZpbmQgdW51c2VkIHJvd1xuICAgICAgICAgIF9wb3Mucm93ID0gMDtcbiAgICAgICAgICB3aGlsZSAodXNlZChfcG9zLnJvdywgX3Bvcy5jb2wpKSB7XG4gICAgICAgICAgICBfcG9zLnJvdysrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZDJtYW5Qb3NbX25vZGUuaWQoKV0gPSBfcG9zO1xuICAgICAgICB1c2UoX3Bvcy5yb3csIF9wb3MuY29sKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGdldFBvcyA9IGZ1bmN0aW9uIGdldFBvcyhlbGVtZW50LCBpKSB7XG4gICAgICB2YXIgeCwgeTtcbiAgICAgIGlmIChlbGVtZW50LmxvY2tlZCgpIHx8IGVsZW1lbnQuaXNQYXJlbnQoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIHNlZSBpZiB3ZSBoYXZlIGEgbWFudWFsIHBvc2l0aW9uIHNldFxuICAgICAgdmFyIHJjUG9zID0gaWQybWFuUG9zW2VsZW1lbnQuaWQoKV07XG4gICAgICBpZiAocmNQb3MpIHtcbiAgICAgICAgeCA9IHJjUG9zLmNvbCAqIGNlbGxXaWR0aCArIGNlbGxXaWR0aCAvIDIgKyBiYi54MTtcbiAgICAgICAgeSA9IHJjUG9zLnJvdyAqIGNlbGxIZWlnaHQgKyBjZWxsSGVpZ2h0IC8gMiArIGJiLnkxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIHNldCBhdXRvbWF0aWNhbGx5XG5cbiAgICAgICAgd2hpbGUgKHVzZWQocm93LCBjb2wpKSB7XG4gICAgICAgICAgbW92ZVRvTmV4dENlbGwoKTtcbiAgICAgICAgfVxuICAgICAgICB4ID0gY29sICogY2VsbFdpZHRoICsgY2VsbFdpZHRoIC8gMiArIGJiLngxO1xuICAgICAgICB5ID0gcm93ICogY2VsbEhlaWdodCArIGNlbGxIZWlnaHQgLyAyICsgYmIueTE7XG4gICAgICAgIHVzZShyb3csIGNvbCk7XG4gICAgICAgIG1vdmVUb05leHRDZWxsKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5XG4gICAgICB9O1xuICAgIH07XG4gICAgbm9kZXMubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGdldFBvcyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG4vLyBkZWZhdWx0IGxheW91dCBvcHRpb25zXG52YXIgZGVmYXVsdHMkMiA9IHtcbiAgcmVhZHk6IGZ1bmN0aW9uIHJlYWR5KCkge30sXG4gIC8vIG9uIGxheW91dHJlYWR5XG4gIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7fSAvLyBvbiBsYXlvdXRzdG9wXG59O1xuXG4vLyBjb25zdHJ1Y3RvclxuLy8gb3B0aW9ucyA6IG9iamVjdCBjb250YWluaW5nIGxheW91dCBvcHRpb25zXG5mdW5jdGlvbiBOdWxsTGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cyQyLCBvcHRpb25zKTtcbn1cblxuLy8gcnVucyB0aGUgbGF5b3V0XG5OdWxsTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlczsgLy8gZWxlbWVudHMgdG8gY29uc2lkZXIgaW4gdGhlIGxheW91dFxuICB2YXIgbGF5b3V0ID0gdGhpcztcblxuICAvLyBjeSBpcyBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlZCBmb3IgdXMgaW4gdGhlIGNvbnN0cnVjdG9yXG4gIC8vIChkaXNhYmxlIGVzbGludCBmb3IgbmV4dCBsaW5lIGFzIHRoaXMgc2VydmVzIGFzIGV4YW1wbGUgbGF5b3V0IGNvZGUgdG8gZXh0ZXJuYWwgZGV2ZWxvcGVycylcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIG9wdGlvbnMuY3k7XG4gIGxheW91dC5lbWl0KCdsYXlvdXRzdGFydCcpO1xuXG4gIC8vIHB1dHMgYWxsIG5vZGVzIGF0ICgwLCAwKVxuICAvLyBuLmIuIG1vc3QgbGF5b3V0cyB3b3VsZCB1c2UgbGF5b3V0UG9zaXRpb25zKCksIGluc3RlYWQgb2YgcG9zaXRpb25zKCkgYW5kIG1hbnVhbCBldmVudHNcbiAgZWxlcy5ub2RlcygpLnBvc2l0aW9ucyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gdHJpZ2dlciBsYXlvdXRyZWFkeSB3aGVuIGVhY2ggbm9kZSBoYXMgaGFkIGl0cyBwb3NpdGlvbiBzZXQgYXQgbGVhc3Qgb25jZVxuICBsYXlvdXQub25lKCdsYXlvdXRyZWFkeScsIG9wdGlvbnMucmVhZHkpO1xuICBsYXlvdXQuZW1pdCgnbGF5b3V0cmVhZHknKTtcblxuICAvLyB0cmlnZ2VyIGxheW91dHN0b3Agd2hlbiB0aGUgbGF5b3V0IHN0b3BzIChlLmcuIGZpbmlzaGVzKVxuICBsYXlvdXQub25lKCdsYXlvdXRzdG9wJywgb3B0aW9ucy5zdG9wKTtcbiAgbGF5b3V0LmVtaXQoJ2xheW91dHN0b3AnKTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG4vLyBjYWxsZWQgb24gY29udGludW91cyBsYXlvdXRzIHRvIHN0b3AgdGhlbSBiZWZvcmUgdGhleSBmaW5pc2hcbk51bGxMYXlvdXQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxudmFyIGRlZmF1bHRzJDEgPSB7XG4gIHBvc2l0aW9uczogdW5kZWZpbmVkLFxuICAvLyBtYXAgb2YgKG5vZGUgaWQpID0+IChwb3NpdGlvbiBvYmopOyBvciBmdW5jdGlvbihub2RlKXsgcmV0dXJuIHNvbVBvczsgfVxuICB6b29tOiB1bmRlZmluZWQsXG4gIC8vIHRoZSB6b29tIGxldmVsIHRvIHNldCAocHJvYiB3YW50IGZpdCA9IGZhbHNlIGlmIHNldClcbiAgcGFuOiB1bmRlZmluZWQsXG4gIC8vIHRoZSBwYW4gbGV2ZWwgdG8gc2V0IChwcm9iIHdhbnQgZml0ID0gZmFsc2UgaWYgc2V0KVxuICBmaXQ6IHRydWUsXG4gIC8vIHdoZXRoZXIgdG8gZml0IHRvIHZpZXdwb3J0XG4gIHBhZGRpbmc6IDMwLFxuICAvLyBwYWRkaW5nIG9uIGZpdFxuICBzcGFjaW5nRmFjdG9yOiB1bmRlZmluZWQsXG4gIC8vIEFwcGxpZXMgYSBtdWx0aXBsaWNhdGl2ZSBmYWN0b3IgKD4wKSB0byBleHBhbmQgb3IgY29tcHJlc3MgdGhlIG92ZXJhbGwgYXJlYSB0aGF0IHRoZSBub2RlcyB0YWtlIHVwXG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0c1xufTtcblxuZnVuY3Rpb24gUHJlc2V0TGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cyQxLCBvcHRpb25zKTtcbn1cblByZXNldExheW91dC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG4gIHZhciBub2RlcyA9IGVsZXMubm9kZXMoKTtcbiAgdmFyIHBvc0lzRm4gPSBmbiQ2KG9wdGlvbnMucG9zaXRpb25zKTtcbiAgZnVuY3Rpb24gZ2V0UG9zaXRpb24obm9kZSkge1xuICAgIGlmIChvcHRpb25zLnBvc2l0aW9ucyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY29weVBvc2l0aW9uKG5vZGUucG9zaXRpb24oKSk7XG4gICAgfVxuICAgIGlmIChwb3NJc0ZuKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5wb3NpdGlvbnMobm9kZSk7XG4gICAgfVxuICAgIHZhciBwb3MgPSBvcHRpb25zLnBvc2l0aW9uc1tub2RlLl9wcml2YXRlLmRhdGEuaWRdO1xuICAgIGlmIChwb3MgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBwb3M7XG4gIH1cbiAgbm9kZXMubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGZ1bmN0aW9uIChub2RlLCBpKSB7XG4gICAgdmFyIHBvc2l0aW9uID0gZ2V0UG9zaXRpb24obm9kZSk7XG4gICAgaWYgKG5vZGUubG9ja2VkKCkgfHwgcG9zaXRpb24gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH0pO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgZml0OiB0cnVlLFxuICAvLyB3aGV0aGVyIHRvIGZpdCB0byB2aWV3cG9ydFxuICBwYWRkaW5nOiAzMCxcbiAgLy8gZml0IHBhZGRpbmdcbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0cyBcbn07XG5cbmZ1bmN0aW9uIFJhbmRvbUxheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xufVxuUmFuZG9tTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG4gIHZhciBnZXRQb3MgPSBmdW5jdGlvbiBnZXRQb3Mobm9kZSwgaSkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBiYi54MSArIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIGJiLncpLFxuICAgICAgeTogYmIueTEgKyBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiBiYi5oKVxuICAgIH07XG4gIH07XG4gIGVsZXMubm9kZXMoKS5sYXlvdXRQb3NpdGlvbnModGhpcywgb3B0aW9ucywgZ2V0UG9zKTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG52YXIgbGF5b3V0ID0gW3tcbiAgbmFtZTogJ2JyZWFkdGhmaXJzdCcsXG4gIGltcGw6IEJyZWFkdGhGaXJzdExheW91dFxufSwge1xuICBuYW1lOiAnY2lyY2xlJyxcbiAgaW1wbDogQ2lyY2xlTGF5b3V0XG59LCB7XG4gIG5hbWU6ICdjb25jZW50cmljJyxcbiAgaW1wbDogQ29uY2VudHJpY0xheW91dFxufSwge1xuICBuYW1lOiAnY29zZScsXG4gIGltcGw6IENvc2VMYXlvdXRcbn0sIHtcbiAgbmFtZTogJ2dyaWQnLFxuICBpbXBsOiBHcmlkTGF5b3V0XG59LCB7XG4gIG5hbWU6ICdudWxsJyxcbiAgaW1wbDogTnVsbExheW91dFxufSwge1xuICBuYW1lOiAncHJlc2V0JyxcbiAgaW1wbDogUHJlc2V0TGF5b3V0XG59LCB7XG4gIG5hbWU6ICdyYW5kb20nLFxuICBpbXBsOiBSYW5kb21MYXlvdXRcbn1dO1xuXG5mdW5jdGlvbiBOdWxsUmVuZGVyZXIob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB0aGlzLm5vdGlmaWNhdGlvbnMgPSAwOyAvLyBmb3IgdGVzdGluZ1xufVxuXG52YXIgbm9vcCA9IGZ1bmN0aW9uIG5vb3AoKSB7fTtcbnZhciB0aHJvd0ltZ0VyciA9IGZ1bmN0aW9uIHRocm93SW1nRXJyKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0EgaGVhZGxlc3MgaW5zdGFuY2UgY2FuIG5vdCByZW5kZXIgaW1hZ2VzJyk7XG59O1xuTnVsbFJlbmRlcmVyLnByb3RvdHlwZSA9IHtcbiAgcmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlOiBub29wLFxuICBub3RpZnk6IGZ1bmN0aW9uIG5vdGlmeSgpIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMrKztcbiAgfSxcbiAgaW5pdDogbm9vcCxcbiAgaXNIZWFkbGVzczogZnVuY3Rpb24gaXNIZWFkbGVzcygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgcG5nOiB0aHJvd0ltZ0VycixcbiAganBnOiB0aHJvd0ltZ0VyclxufTtcblxudmFyIEJScCRmID0ge307XG5CUnAkZi5hcnJvd1NoYXBlV2lkdGggPSAwLjM7XG5CUnAkZi5yZWdpc3RlckFycm93U2hhcGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgYXJyb3dTaGFwZXMgPSB0aGlzLmFycm93U2hhcGVzID0ge307XG4gIHZhciByZW5kZXJlciA9IHRoaXM7XG5cbiAgLy8gQ29udHJhY3QgZm9yIGFycm93IHNoYXBlczpcbiAgLy8gMCwgMCBpcyBhcnJvdyB0aXBcbiAgLy8gKDAsIDEpIGlzIGRpcmVjdGlvbiB0b3dhcmRzIG5vZGVcbiAgLy8gKDEsIDApIGlzIHJpZ2h0XG4gIC8vXG4gIC8vIGZ1bmN0aW9uYWwgYXBpOlxuICAvLyBjb2xsaWRlOiBjaGVjayB4LCB5IGluIHNoYXBlXG4gIC8vIHJvdWdoQ29sbGlkZTogY2FsbGVkIGJlZm9yZSBjb2xsaWRlLCBubyBmYWxzZSBuZWdhdGl2ZXNcbiAgLy8gZHJhdzogZHJhd1xuICAvLyBzcGFjaW5nOiBkaXN0KGFycm93VGlwLCBub2RlQm91bmRhcnkpXG4gIC8vIGdhcDogZGlzdChlZGdlVGlwLCBub2RlQm91bmRhcnkpLCBlZGdlVGlwIG1heSAhPSBhcnJvd1RpcFxuXG4gIHZhciBiYkNvbGxpZGUgPSBmdW5jdGlvbiBiYkNvbGxpZGUoeCwgeSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgsIHBhZGRpbmcpIHtcbiAgICB2YXIgeDEgPSB0cmFuc2xhdGlvbi54IC0gc2l6ZSAvIDIgLSBwYWRkaW5nO1xuICAgIHZhciB4MiA9IHRyYW5zbGF0aW9uLnggKyBzaXplIC8gMiArIHBhZGRpbmc7XG4gICAgdmFyIHkxID0gdHJhbnNsYXRpb24ueSAtIHNpemUgLyAyIC0gcGFkZGluZztcbiAgICB2YXIgeTIgPSB0cmFuc2xhdGlvbi55ICsgc2l6ZSAvIDIgKyBwYWRkaW5nO1xuICAgIHZhciBpbnNpZGUgPSB4MSA8PSB4ICYmIHggPD0geDIgJiYgeTEgPD0geSAmJiB5IDw9IHkyO1xuICAgIHJldHVybiBpbnNpZGU7XG4gIH07XG4gIHZhciB0cmFuc2Zvcm0gPSBmdW5jdGlvbiB0cmFuc2Zvcm0oeCwgeSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uKSB7XG4gICAgdmFyIHhSb3RhdGVkID0geCAqIE1hdGguY29zKGFuZ2xlKSAtIHkgKiBNYXRoLnNpbihhbmdsZSk7XG4gICAgdmFyIHlSb3RhdGVkID0geCAqIE1hdGguc2luKGFuZ2xlKSArIHkgKiBNYXRoLmNvcyhhbmdsZSk7XG4gICAgdmFyIHhTY2FsZWQgPSB4Um90YXRlZCAqIHNpemU7XG4gICAgdmFyIHlTY2FsZWQgPSB5Um90YXRlZCAqIHNpemU7XG4gICAgdmFyIHhUcmFuc2xhdGVkID0geFNjYWxlZCArIHRyYW5zbGF0aW9uLng7XG4gICAgdmFyIHlUcmFuc2xhdGVkID0geVNjYWxlZCArIHRyYW5zbGF0aW9uLnk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHhUcmFuc2xhdGVkLFxuICAgICAgeTogeVRyYW5zbGF0ZWRcbiAgICB9O1xuICB9O1xuICB2YXIgdHJhbnNmb3JtUG9pbnRzID0gZnVuY3Rpb24gdHJhbnNmb3JtUG9pbnRzKHB0cywgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uKSB7XG4gICAgdmFyIHJldFB0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICB2YXIgeCA9IHB0c1tpXTtcbiAgICAgIHZhciB5ID0gcHRzW2kgKyAxXTtcbiAgICAgIHJldFB0cy5wdXNoKHRyYW5zZm9ybSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldFB0cztcbiAgfTtcbiAgdmFyIHBvaW50c1RvQXJyID0gZnVuY3Rpb24gcG9pbnRzVG9BcnIocHRzKSB7XG4gICAgdmFyIHJldCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcCA9IHB0c1tpXTtcbiAgICAgIHJldC5wdXNoKHAueCwgcC55KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcbiAgdmFyIHN0YW5kYXJkR2FwID0gZnVuY3Rpb24gc3RhbmRhcmRHYXAoZWRnZSkge1xuICAgIHJldHVybiBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlICogZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykucGZWYWx1ZSAqIDI7XG4gIH07XG4gIHZhciBkZWZpbmVBcnJvd1NoYXBlID0gZnVuY3Rpb24gZGVmaW5lQXJyb3dTaGFwZShuYW1lLCBkZWZuKSB7XG4gICAgaWYgKHN0cmluZyhkZWZuKSkge1xuICAgICAgZGVmbiA9IGFycm93U2hhcGVzW2RlZm5dO1xuICAgIH1cbiAgICBhcnJvd1NoYXBlc1tuYW1lXSA9IGV4dGVuZCh7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgcG9pbnRzOiBbLTAuMTUsIC0wLjMsIDAuMTUsIC0wLjMsIDAuMTUsIDAuMywgLTAuMTUsIDAuM10sXG4gICAgICBjb2xsaWRlOiBmdW5jdGlvbiBjb2xsaWRlKHgsIHksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgcGFkZGluZykge1xuICAgICAgICB2YXIgcG9pbnRzID0gcG9pbnRzVG9BcnIodHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplICsgMiAqIHBhZGRpbmcsIGFuZ2xlLCB0cmFuc2xhdGlvbikpO1xuICAgICAgICB2YXIgaW5zaWRlID0gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIHBvaW50cyk7XG4gICAgICAgIHJldHVybiBpbnNpZGU7XG4gICAgICB9LFxuICAgICAgcm91Z2hDb2xsaWRlOiBiYkNvbGxpZGUsXG4gICAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbikge1xuICAgICAgICB2YXIgcG9pbnRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCgncG9seWdvbicpKGNvbnRleHQsIHBvaW50cyk7XG4gICAgICB9LFxuICAgICAgc3BhY2luZzogZnVuY3Rpb24gc3BhY2luZyhlZGdlKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSxcbiAgICAgIGdhcDogc3RhbmRhcmRHYXBcbiAgICB9LCBkZWZuKTtcbiAgfTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnbm9uZScsIHtcbiAgICBjb2xsaWRlOiBmYWxzaWZ5LFxuICAgIHJvdWdoQ29sbGlkZTogZmFsc2lmeSxcbiAgICBkcmF3OiBub29wJDEsXG4gICAgc3BhY2luZzogemVyb2lmeSxcbiAgICBnYXA6IHplcm9pZnlcbiAgfSk7XG4gIGRlZmluZUFycm93U2hhcGUoJ3RyaWFuZ2xlJywge1xuICAgIHBvaW50czogWy0wLjE1LCAtMC4zLCAwLCAwLCAwLjE1LCAtMC4zXVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnYXJyb3cnLCAndHJpYW5nbGUnKTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndHJpYW5nbGUtYmFja2N1cnZlJywge1xuICAgIHBvaW50czogYXJyb3dTaGFwZXNbJ3RyaWFuZ2xlJ10ucG9pbnRzLFxuICAgIGNvbnRyb2xQb2ludDogWzAsIC0wLjE1XSxcbiAgICByb3VnaENvbGxpZGU6IGJiQ29sbGlkZSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKSB7XG4gICAgICB2YXIgcHRzVHJhbnMgPSB0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICB2YXIgY3RybFB0ID0gdGhpcy5jb250cm9sUG9pbnQ7XG4gICAgICB2YXIgY3RybFB0VHJhbnMgPSB0cmFuc2Zvcm0oY3RybFB0WzBdLCBjdHJsUHRbMV0sIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCh0aGlzLm5hbWUpKGNvbnRleHQsIHB0c1RyYW5zLCBjdHJsUHRUcmFucyk7XG4gICAgfSxcbiAgICBnYXA6IGZ1bmN0aW9uIGdhcChlZGdlKSB7XG4gICAgICByZXR1cm4gc3RhbmRhcmRHYXAoZWRnZSkgKiAwLjg7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndHJpYW5nbGUtdGVlJywge1xuICAgIHBvaW50czogWzAsIDAsIDAuMTUsIC0wLjMsIC0wLjE1LCAtMC4zLCAwLCAwXSxcbiAgICBwb2ludHNUZWU6IFstMC4xNSwgLTAuNCwgLTAuMTUsIC0wLjUsIDAuMTUsIC0wLjUsIDAuMTUsIC0wLjRdLFxuICAgIGNvbGxpZGU6IGZ1bmN0aW9uIGNvbGxpZGUoeCwgeSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgsIHBhZGRpbmcpIHtcbiAgICAgIHZhciB0cmlQdHMgPSBwb2ludHNUb0Fycih0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUgKyAyICogcGFkZGluZywgYW5nbGUsIHRyYW5zbGF0aW9uKSk7XG4gICAgICB2YXIgdGVlUHRzID0gcG9pbnRzVG9BcnIodHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzVGVlLCBzaXplICsgMiAqIHBhZGRpbmcsIGFuZ2xlLCB0cmFuc2xhdGlvbikpO1xuICAgICAgdmFyIGluc2lkZSA9IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCB0cmlQdHMpIHx8IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCB0ZWVQdHMpO1xuICAgICAgcmV0dXJuIGluc2lkZTtcbiAgICB9LFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgpIHtcbiAgICAgIHZhciB0cmlQdHMgPSB0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICB2YXIgdGVlUHRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzVGVlLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwodGhpcy5uYW1lKShjb250ZXh0LCB0cmlQdHMsIHRlZVB0cyk7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnY2lyY2xlLXRyaWFuZ2xlJywge1xuICAgIHJhZGl1czogMC4xNSxcbiAgICBwb2ludHNUcjogWzAsIC0wLjE1LCAwLjE1LCAtMC40NSwgLTAuMTUsIC0wLjQ1LCAwLCAtMC4xNV0sXG4gICAgY29sbGlkZTogZnVuY3Rpb24gY29sbGlkZSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCwgcGFkZGluZykge1xuICAgICAgdmFyIHQgPSB0cmFuc2xhdGlvbjtcbiAgICAgIHZhciBjaXJjbGVJbnNpZGUgPSBNYXRoLnBvdyh0LnggLSB4LCAyKSArIE1hdGgucG93KHQueSAtIHksIDIpIDw9IE1hdGgucG93KChzaXplICsgMiAqIHBhZGRpbmcpICogdGhpcy5yYWRpdXMsIDIpO1xuICAgICAgdmFyIHRyaVB0cyA9IHBvaW50c1RvQXJyKHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50cywgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgIHJldHVybiBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgdHJpUHRzKSB8fCBjaXJjbGVJbnNpZGU7XG4gICAgfSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKSB7XG4gICAgICB2YXIgdHJpUHRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzVHIsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCh0aGlzLm5hbWUpKGNvbnRleHQsIHRyaVB0cywgdHJhbnNsYXRpb24ueCwgdHJhbnNsYXRpb24ueSwgdGhpcy5yYWRpdXMgKiBzaXplKTtcbiAgICB9LFxuICAgIHNwYWNpbmc6IGZ1bmN0aW9uIHNwYWNpbmcoZWRnZSkge1xuICAgICAgcmV0dXJuIHJlbmRlcmVyLmdldEFycm93V2lkdGgoZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZSwgZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWUpICogdGhpcy5yYWRpdXM7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndHJpYW5nbGUtY3Jvc3MnLCB7XG4gICAgcG9pbnRzOiBbMCwgMCwgMC4xNSwgLTAuMywgLTAuMTUsIC0wLjMsIDAsIDBdLFxuICAgIGJhc2VDcm9zc0xpbmVQdHM6IFstMC4xNSwgLTAuNCxcbiAgICAvLyBmaXJzdCBoYWxmIG9mIHRoZSByZWN0YW5nbGVcbiAgICAtMC4xNSwgLTAuNCwgMC4xNSwgLTAuNCxcbiAgICAvLyBzZWNvbmQgaGFsZiBvZiB0aGUgcmVjdGFuZ2xlXG4gICAgMC4xNSwgLTAuNF0sXG4gICAgY3Jvc3NMaW5lUHRzOiBmdW5jdGlvbiBjcm9zc0xpbmVQdHMoc2l6ZSwgZWRnZVdpZHRoKSB7XG4gICAgICAvLyBzaGlmdCBwb2ludHMgc28gdGhhdCB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgY3Jvc3MgcG9pbnRzIG1hdGNoZXMgZWRnZSB3aWR0aFxuICAgICAgdmFyIHAgPSB0aGlzLmJhc2VDcm9zc0xpbmVQdHMuc2xpY2UoKTtcbiAgICAgIHZhciBzaGlmdEZhY3RvciA9IGVkZ2VXaWR0aCAvIHNpemU7XG4gICAgICB2YXIgeTAgPSAzO1xuICAgICAgdmFyIHkxID0gNTtcbiAgICAgIHBbeTBdID0gcFt5MF0gLSBzaGlmdEZhY3RvcjtcbiAgICAgIHBbeTFdID0gcFt5MV0gLSBzaGlmdEZhY3RvcjtcbiAgICAgIHJldHVybiBwO1xuICAgIH0sXG4gICAgY29sbGlkZTogZnVuY3Rpb24gY29sbGlkZSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCwgcGFkZGluZykge1xuICAgICAgdmFyIHRyaVB0cyA9IHBvaW50c1RvQXJyKHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50cywgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgIHZhciB0ZWVQdHMgPSBwb2ludHNUb0Fycih0cmFuc2Zvcm1Qb2ludHModGhpcy5jcm9zc0xpbmVQdHMoc2l6ZSwgZWRnZVdpZHRoKSwgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgIHZhciBpbnNpZGUgPSBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgdHJpUHRzKSB8fCBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgdGVlUHRzKTtcbiAgICAgIHJldHVybiBpbnNpZGU7XG4gICAgfSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKSB7XG4gICAgICB2YXIgdHJpUHRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgdmFyIGNyb3NzTGluZVB0cyA9IHRyYW5zZm9ybVBvaW50cyh0aGlzLmNyb3NzTGluZVB0cyhzaXplLCBlZGdlV2lkdGgpLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwodGhpcy5uYW1lKShjb250ZXh0LCB0cmlQdHMsIGNyb3NzTGluZVB0cyk7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndmVlJywge1xuICAgIHBvaW50czogWy0wLjE1LCAtMC4zLCAwLCAwLCAwLjE1LCAtMC4zLCAwLCAtMC4xNV0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIHN0YW5kYXJkR2FwKGVkZ2UpICogMC41MjU7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnY2lyY2xlJywge1xuICAgIHJhZGl1czogMC4xNSxcbiAgICBjb2xsaWRlOiBmdW5jdGlvbiBjb2xsaWRlKHgsIHksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoLCBwYWRkaW5nKSB7XG4gICAgICB2YXIgdCA9IHRyYW5zbGF0aW9uO1xuICAgICAgdmFyIGluc2lkZSA9IE1hdGgucG93KHQueCAtIHgsIDIpICsgTWF0aC5wb3codC55IC0geSwgMikgPD0gTWF0aC5wb3coKHNpemUgKyAyICogcGFkZGluZykgKiB0aGlzLnJhZGl1cywgMik7XG4gICAgICByZXR1cm4gaW5zaWRlO1xuICAgIH0sXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCkge1xuICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwodGhpcy5uYW1lKShjb250ZXh0LCB0cmFuc2xhdGlvbi54LCB0cmFuc2xhdGlvbi55LCB0aGlzLnJhZGl1cyAqIHNpemUpO1xuICAgIH0sXG4gICAgc3BhY2luZzogZnVuY3Rpb24gc3BhY2luZyhlZGdlKSB7XG4gICAgICByZXR1cm4gcmVuZGVyZXIuZ2V0QXJyb3dXaWR0aChlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlLCBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZSkgKiB0aGlzLnJhZGl1cztcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCd0ZWUnLCB7XG4gICAgcG9pbnRzOiBbLTAuMTUsIDAsIC0wLjE1LCAtMC4xLCAwLjE1LCAtMC4xLCAwLjE1LCAwXSxcbiAgICBzcGFjaW5nOiBmdW5jdGlvbiBzcGFjaW5nKGVkZ2UpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnc3F1YXJlJywge1xuICAgIHBvaW50czogWy0wLjE1LCAwLjAwLCAwLjE1LCAwLjAwLCAwLjE1LCAtMC4zLCAtMC4xNSwgLTAuM11cbiAgfSk7XG4gIGRlZmluZUFycm93U2hhcGUoJ2RpYW1vbmQnLCB7XG4gICAgcG9pbnRzOiBbLTAuMTUsIC0wLjE1LCAwLCAtMC4zLCAwLjE1LCAtMC4xNSwgMCwgMF0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWUgKiBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZTtcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCdjaGV2cm9uJywge1xuICAgIHBvaW50czogWzAsIDAsIC0wLjE1LCAtMC4xNSwgLTAuMSwgLTAuMiwgMCwgLTAuMSwgMC4xLCAtMC4yLCAwLjE1LCAtMC4xNV0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIDAuOTUgKiBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlICogZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWU7XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBCUnAkZSA9IHt9O1xuXG4vLyBQcm9qZWN0IG1vdXNlXG5CUnAkZS5wcm9qZWN0SW50b1ZpZXdwb3J0ID0gZnVuY3Rpb24gKGNsaWVudFgsIGNsaWVudFkpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeTtcbiAgdmFyIG9mZnNldHMgPSB0aGlzLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMoKTtcbiAgdmFyIG9mZnNldExlZnQgPSBvZmZzZXRzWzBdO1xuICB2YXIgb2Zmc2V0VG9wID0gb2Zmc2V0c1sxXTtcbiAgdmFyIHNjYWxlID0gb2Zmc2V0c1s0XTtcbiAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgdmFyIHggPSAoKGNsaWVudFggLSBvZmZzZXRMZWZ0KSAvIHNjYWxlIC0gcGFuLngpIC8gem9vbTtcbiAgdmFyIHkgPSAoKGNsaWVudFkgLSBvZmZzZXRUb3ApIC8gc2NhbGUgLSBwYW4ueSkgLyB6b29tO1xuICByZXR1cm4gW3gsIHldO1xufTtcbkJScCRlLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmNvbnRhaW5lckJCKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyQkI7XG4gIH1cbiAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyO1xuICB2YXIgcmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHN0eWxlID0gdGhpcy5jeS53aW5kb3coKS5nZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lcik7XG4gIHZhciBzdHlsZVZhbHVlID0gZnVuY3Rpb24gc3R5bGVWYWx1ZShuYW1lKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKSk7XG4gIH07XG4gIHZhciBwYWRkaW5nID0ge1xuICAgIGxlZnQ6IHN0eWxlVmFsdWUoJ3BhZGRpbmctbGVmdCcpLFxuICAgIHJpZ2h0OiBzdHlsZVZhbHVlKCdwYWRkaW5nLXJpZ2h0JyksXG4gICAgdG9wOiBzdHlsZVZhbHVlKCdwYWRkaW5nLXRvcCcpLFxuICAgIGJvdHRvbTogc3R5bGVWYWx1ZSgncGFkZGluZy1ib3R0b20nKVxuICB9O1xuICB2YXIgYm9yZGVyID0ge1xuICAgIGxlZnQ6IHN0eWxlVmFsdWUoJ2JvcmRlci1sZWZ0LXdpZHRoJyksXG4gICAgcmlnaHQ6IHN0eWxlVmFsdWUoJ2JvcmRlci1yaWdodC13aWR0aCcpLFxuICAgIHRvcDogc3R5bGVWYWx1ZSgnYm9yZGVyLXRvcC13aWR0aCcpLFxuICAgIGJvdHRvbTogc3R5bGVWYWx1ZSgnYm9yZGVyLWJvdHRvbS13aWR0aCcpXG4gIH07XG4gIHZhciBjbGllbnRXaWR0aCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aDtcbiAgdmFyIGNsaWVudEhlaWdodCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XG4gIHZhciBwYWRkaW5nSG9yID0gcGFkZGluZy5sZWZ0ICsgcGFkZGluZy5yaWdodDtcbiAgdmFyIHBhZGRpbmdWZXIgPSBwYWRkaW5nLnRvcCArIHBhZGRpbmcuYm90dG9tO1xuICB2YXIgYm9yZGVySG9yID0gYm9yZGVyLmxlZnQgKyBib3JkZXIucmlnaHQ7XG4gIHZhciBzY2FsZSA9IHJlY3Qud2lkdGggLyAoY2xpZW50V2lkdGggKyBib3JkZXJIb3IpO1xuICB2YXIgdW5zY2FsZWRXID0gY2xpZW50V2lkdGggLSBwYWRkaW5nSG9yO1xuICB2YXIgdW5zY2FsZWRIID0gY2xpZW50SGVpZ2h0IC0gcGFkZGluZ1ZlcjtcbiAgdmFyIGxlZnQgPSByZWN0LmxlZnQgKyBwYWRkaW5nLmxlZnQgKyBib3JkZXIubGVmdDtcbiAgdmFyIHRvcCA9IHJlY3QudG9wICsgcGFkZGluZy50b3AgKyBib3JkZXIudG9wO1xuICByZXR1cm4gdGhpcy5jb250YWluZXJCQiA9IFtsZWZ0LCB0b3AsIHVuc2NhbGVkVywgdW5zY2FsZWRILCBzY2FsZV07XG59O1xuQlJwJGUuaW52YWxpZGF0ZUNvbnRhaW5lckNsaWVudENvb3Jkc0NhY2hlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNvbnRhaW5lckJCID0gbnVsbDtcbn07XG5CUnAkZS5maW5kTmVhcmVzdEVsZW1lbnQgPSBmdW5jdGlvbiAoeCwgeSwgaW50ZXJhY3RpdmVFbGVtZW50c09ubHksIGlzVG91Y2gpIHtcbiAgcmV0dXJuIHRoaXMuZmluZE5lYXJlc3RFbGVtZW50cyh4LCB5LCBpbnRlcmFjdGl2ZUVsZW1lbnRzT25seSwgaXNUb3VjaClbMF07XG59O1xuQlJwJGUuZmluZE5lYXJlc3RFbGVtZW50cyA9IGZ1bmN0aW9uICh4LCB5LCBpbnRlcmFjdGl2ZUVsZW1lbnRzT25seSwgaXNUb3VjaCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGVsZXMgPSByLmdldENhY2hlZFpTb3J0ZWRFbGVzKCk7XG4gIHZhciBuZWFyID0gW107IC8vIDEgbm9kZSBtYXgsIDEgZWRnZSBtYXhcbiAgdmFyIHpvb20gPSByLmN5Lnpvb20oKTtcbiAgdmFyIGhhc0NvbXBvdW5kcyA9IHIuY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICB2YXIgZWRnZVRocmVzaG9sZCA9IChpc1RvdWNoID8gMjQgOiA4KSAvIHpvb207XG4gIHZhciBub2RlVGhyZXNob2xkID0gKGlzVG91Y2ggPyA4IDogMikgLyB6b29tO1xuICB2YXIgbGFiZWxUaHJlc2hvbGQgPSAoaXNUb3VjaCA/IDggOiAyKSAvIHpvb207XG4gIHZhciBtaW5TcURpc3QgPSBJbmZpbml0eTtcbiAgdmFyIG5lYXJFZGdlO1xuICB2YXIgbmVhck5vZGU7XG4gIGlmIChpbnRlcmFjdGl2ZUVsZW1lbnRzT25seSkge1xuICAgIGVsZXMgPSBlbGVzLmludGVyYWN0aXZlO1xuICB9XG4gIGZ1bmN0aW9uIGFkZEVsZShlbGUsIHNxRGlzdCkge1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIGlmIChuZWFyTm9kZSkge1xuICAgICAgICByZXR1cm47IC8vIGNhbid0IHJlcGxhY2Ugbm9kZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmVhck5vZGUgPSBlbGU7XG4gICAgICAgIG5lYXIucHVzaChlbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWxlLmlzRWRnZSgpICYmIChzcURpc3QgPT0gbnVsbCB8fCBzcURpc3QgPCBtaW5TcURpc3QpKSB7XG4gICAgICBpZiAobmVhckVkZ2UpIHtcbiAgICAgICAgLy8gdGhlbiByZXBsYWNlIGV4aXN0aW5nIGVkZ2VcbiAgICAgICAgLy8gY2FuIHJlcGxhY2Ugb25seSBpZiBzYW1lIHotaW5kZXhcbiAgICAgICAgaWYgKG5lYXJFZGdlLnBzdHlsZSgnei1jb21wb3VuZC1kZXB0aCcpLnZhbHVlID09PSBlbGUucHN0eWxlKCd6LWNvbXBvdW5kLWRlcHRoJykudmFsdWUgJiYgbmVhckVkZ2UucHN0eWxlKCd6LWNvbXBvdW5kLWRlcHRoJykudmFsdWUgPT09IGVsZS5wc3R5bGUoJ3otY29tcG91bmQtZGVwdGgnKS52YWx1ZSkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVhci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5lYXJbaV0uaXNFZGdlKCkpIHtcbiAgICAgICAgICAgICAgbmVhcltpXSA9IGVsZTtcbiAgICAgICAgICAgICAgbmVhckVkZ2UgPSBlbGU7XG4gICAgICAgICAgICAgIG1pblNxRGlzdCA9IHNxRGlzdCAhPSBudWxsID8gc3FEaXN0IDogbWluU3FEaXN0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5lYXIucHVzaChlbGUpO1xuICAgICAgICBuZWFyRWRnZSA9IGVsZTtcbiAgICAgICAgbWluU3FEaXN0ID0gc3FEaXN0ICE9IG51bGwgPyBzcURpc3QgOiBtaW5TcURpc3Q7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGNoZWNrTm9kZShub2RlKSB7XG4gICAgdmFyIHdpZHRoID0gbm9kZS5vdXRlcldpZHRoKCkgKyAyICogbm9kZVRocmVzaG9sZDtcbiAgICB2YXIgaGVpZ2h0ID0gbm9kZS5vdXRlckhlaWdodCgpICsgMiAqIG5vZGVUaHJlc2hvbGQ7XG4gICAgdmFyIGh3ID0gd2lkdGggLyAyO1xuICAgIHZhciBoaCA9IGhlaWdodCAvIDI7XG4gICAgdmFyIHBvcyA9IG5vZGUucG9zaXRpb24oKTtcbiAgICB2YXIgY29ybmVyUmFkaXVzID0gbm9kZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZSA9PT0gJ2F1dG8nID8gJ2F1dG8nIDogbm9kZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS5wZlZhbHVlO1xuICAgIHZhciBycyA9IG5vZGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgaWYgKHBvcy54IC0gaHcgPD0geCAmJiB4IDw9IHBvcy54ICsgaHcgLy8gYmIgY2hlY2sgeFxuICAgICYmIHBvcy55IC0gaGggPD0geSAmJiB5IDw9IHBvcy55ICsgaGggLy8gYmIgY2hlY2sgeVxuICAgICkge1xuICAgICAgdmFyIHNoYXBlID0gci5ub2RlU2hhcGVzW3NlbGYuZ2V0Tm9kZVNoYXBlKG5vZGUpXTtcbiAgICAgIGlmIChzaGFwZS5jaGVja1BvaW50KHgsIHksIDAsIHdpZHRoLCBoZWlnaHQsIHBvcy54LCBwb3MueSwgY29ybmVyUmFkaXVzLCBycykpIHtcbiAgICAgICAgYWRkRWxlKG5vZGUsIDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gY2hlY2tFZGdlKGVkZ2UpIHtcbiAgICB2YXIgX3AgPSBlZGdlLl9wcml2YXRlO1xuICAgIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuICAgIHZhciBzdHlsZVdpZHRoID0gZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgICB2YXIgc2NhbGUgPSBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZTtcbiAgICB2YXIgd2lkdGggPSBzdHlsZVdpZHRoIC8gMiArIGVkZ2VUaHJlc2hvbGQ7IC8vIG1vcmUgbGlrZSBhIGRpc3RhbmNlIHJhZGl1cyBmcm9tIGNlbnRyZVxuICAgIHZhciB3aWR0aFNxID0gd2lkdGggKiB3aWR0aDtcbiAgICB2YXIgd2lkdGgyID0gd2lkdGggKiAyO1xuICAgIHZhciBzcmMgPSBfcC5zb3VyY2U7XG4gICAgdmFyIHRndCA9IF9wLnRhcmdldDtcbiAgICB2YXIgc3FEaXN0O1xuICAgIGlmIChycy5lZGdlVHlwZSA9PT0gJ3NlZ21lbnRzJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3N0cmFpZ2h0JyB8fCBycy5lZGdlVHlwZSA9PT0gJ2hheXN0YWNrJykge1xuICAgICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpICsgMyA8IHB0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBpZiAoaW5MaW5lVmljaW5pdHkoeCwgeSwgcHRzW2ldLCBwdHNbaSArIDFdLCBwdHNbaSArIDJdLCBwdHNbaSArIDNdLCB3aWR0aDIpICYmIHdpZHRoU3EgPiAoc3FEaXN0ID0gc3FkaXN0VG9GaW5pdGVMaW5lKHgsIHksIHB0c1tpXSwgcHRzW2kgKyAxXSwgcHRzW2kgKyAyXSwgcHRzW2kgKyAzXSkpKSB7XG4gICAgICAgICAgYWRkRWxlKGVkZ2UsIHNxRGlzdCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJzLmVkZ2VUeXBlID09PSAnYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ211bHRpYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3NlbGYnIHx8IHJzLmVkZ2VUeXBlID09PSAnY29tcG91bmQnKSB7XG4gICAgICB2YXIgcHRzID0gcnMuYWxscHRzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgKyA1IDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGlmIChpbkJlemllclZpY2luaXR5KHgsIHksIHB0c1tpXSwgcHRzW2kgKyAxXSwgcHRzW2kgKyAyXSwgcHRzW2kgKyAzXSwgcHRzW2kgKyA0XSwgcHRzW2kgKyA1XSwgd2lkdGgyKSAmJiB3aWR0aFNxID4gKHNxRGlzdCA9IHNxZGlzdFRvUXVhZHJhdGljQmV6aWVyKHgsIHksIHB0c1tpXSwgcHRzW2kgKyAxXSwgcHRzW2kgKyAyXSwgcHRzW2kgKyAzXSwgcHRzW2kgKyA0XSwgcHRzW2kgKyA1XSkpKSB7XG4gICAgICAgICAgYWRkRWxlKGVkZ2UsIHNxRGlzdCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB3ZSdyZSBjbG9zZSB0byB0aGUgZWRnZSBidXQgZGlkbid0IGhpdCBpdCwgbWF5YmUgd2UgaGl0IGl0cyBhcnJvd3NcblxuICAgIHZhciBzcmMgPSBzcmMgfHwgX3Auc291cmNlO1xuICAgIHZhciB0Z3QgPSB0Z3QgfHwgX3AudGFyZ2V0O1xuICAgIHZhciBhclNpemUgPSBzZWxmLmdldEFycm93V2lkdGgoc3R5bGVXaWR0aCwgc2NhbGUpO1xuICAgIHZhciBhcnJvd3MgPSBbe1xuICAgICAgbmFtZTogJ3NvdXJjZScsXG4gICAgICB4OiBycy5hcnJvd1N0YXJ0WCxcbiAgICAgIHk6IHJzLmFycm93U3RhcnRZLFxuICAgICAgYW5nbGU6IHJzLnNyY0Fycm93QW5nbGVcbiAgICB9LCB7XG4gICAgICBuYW1lOiAndGFyZ2V0JyxcbiAgICAgIHg6IHJzLmFycm93RW5kWCxcbiAgICAgIHk6IHJzLmFycm93RW5kWSxcbiAgICAgIGFuZ2xlOiBycy50Z3RBcnJvd0FuZ2xlXG4gICAgfSwge1xuICAgICAgbmFtZTogJ21pZC1zb3VyY2UnLFxuICAgICAgeDogcnMubWlkWCxcbiAgICAgIHk6IHJzLm1pZFksXG4gICAgICBhbmdsZTogcnMubWlkc3JjQXJyb3dBbmdsZVxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdtaWQtdGFyZ2V0JyxcbiAgICAgIHg6IHJzLm1pZFgsXG4gICAgICB5OiBycy5taWRZLFxuICAgICAgYW5nbGU6IHJzLm1pZHRndEFycm93QW5nbGVcbiAgICB9XTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGFyID0gYXJyb3dzW2ldO1xuICAgICAgdmFyIHNoYXBlID0gci5hcnJvd1NoYXBlc1tlZGdlLnBzdHlsZShhci5uYW1lICsgJy1hcnJvdy1zaGFwZScpLnZhbHVlXTtcbiAgICAgIHZhciBlZGdlV2lkdGggPSBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICAgICAgaWYgKHNoYXBlLnJvdWdoQ29sbGlkZSh4LCB5LCBhclNpemUsIGFyLmFuZ2xlLCB7XG4gICAgICAgIHg6IGFyLngsXG4gICAgICAgIHk6IGFyLnlcbiAgICAgIH0sIGVkZ2VXaWR0aCwgZWRnZVRocmVzaG9sZCkgJiYgc2hhcGUuY29sbGlkZSh4LCB5LCBhclNpemUsIGFyLmFuZ2xlLCB7XG4gICAgICAgIHg6IGFyLngsXG4gICAgICAgIHk6IGFyLnlcbiAgICAgIH0sIGVkZ2VXaWR0aCwgZWRnZVRocmVzaG9sZCkpIHtcbiAgICAgICAgYWRkRWxlKGVkZ2UpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmb3IgY29tcG91bmQgZ3JhcGhzLCBoaXR0aW5nIGVkZ2UgbWF5IGFjdHVhbGx5IHdhbnQgYSBjb25uZWN0ZWQgbm9kZSBpbnN0ZWFkIChiL2MgZWRnZSBtYXkgaGF2ZSBncmVhdGVyIHotaW5kZXggcHJlY2VkZW5jZSlcbiAgICBpZiAoaGFzQ29tcG91bmRzICYmIG5lYXIubGVuZ3RoID4gMCkge1xuICAgICAgY2hlY2tOb2RlKHNyYyk7XG4gICAgICBjaGVja05vZGUodGd0KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHJlcHJvcChvYmosIG5hbWUsIHByZSkge1xuICAgIHJldHVybiBnZXRQcmVmaXhlZFByb3BlcnR5KG9iaiwgbmFtZSwgcHJlKTtcbiAgfVxuICBmdW5jdGlvbiBjaGVja0xhYmVsKGVsZSwgcHJlZml4KSB7XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciB0aCA9IGxhYmVsVGhyZXNob2xkO1xuICAgIHZhciBwcmVmaXhEYXNoO1xuICAgIGlmIChwcmVmaXgpIHtcbiAgICAgIHByZWZpeERhc2ggPSBwcmVmaXggKyAnLSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpeERhc2ggPSAnJztcbiAgICB9XG4gICAgZWxlLmJvdW5kaW5nQm94KCk7XG4gICAgdmFyIGJiID0gX3AubGFiZWxCb3VuZHNbcHJlZml4IHx8ICdtYWluJ107XG4gICAgdmFyIHRleHQgPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAnbGFiZWwnKS52YWx1ZTtcbiAgICB2YXIgZXZlbnRzRW5hYmxlZCA9IGVsZS5wc3R5bGUoJ3RleHQtZXZlbnRzJykuc3RyVmFsdWUgPT09ICd5ZXMnO1xuICAgIGlmICghZXZlbnRzRW5hYmxlZCB8fCAhdGV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbHggPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxYJywgcHJlZml4KTtcbiAgICB2YXIgbHkgPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxZJywgcHJlZml4KTtcbiAgICB2YXIgdGhldGEgPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxBbmdsZScsIHByZWZpeCk7XG4gICAgdmFyIG94ID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ3RleHQtbWFyZ2luLXgnKS5wZlZhbHVlO1xuICAgIHZhciBveSA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICd0ZXh0LW1hcmdpbi15JykucGZWYWx1ZTtcbiAgICB2YXIgbHgxID0gYmIueDEgLSB0aCAtIG94OyAvLyAoLW94LCAtb3kpIGFzIGJiIGFscmVhZHkgaW5jbHVkZXMgbWFyZ2luXG4gICAgdmFyIGx4MiA9IGJiLngyICsgdGggLSBveDsgLy8gYW5kIHJvdGF0aW9uIGlzIGFib3V0IChseCwgbHkpXG4gICAgdmFyIGx5MSA9IGJiLnkxIC0gdGggLSBveTtcbiAgICB2YXIgbHkyID0gYmIueTIgKyB0aCAtIG95O1xuICAgIGlmICh0aGV0YSkge1xuICAgICAgdmFyIGNvcyA9IE1hdGguY29zKHRoZXRhKTtcbiAgICAgIHZhciBzaW4gPSBNYXRoLnNpbih0aGV0YSk7XG4gICAgICB2YXIgcm90YXRlID0gZnVuY3Rpb24gcm90YXRlKHgsIHkpIHtcbiAgICAgICAgeCA9IHggLSBseDtcbiAgICAgICAgeSA9IHkgLSBseTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiB4ICogY29zIC0geSAqIHNpbiArIGx4LFxuICAgICAgICAgIHk6IHggKiBzaW4gKyB5ICogY29zICsgbHlcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICB2YXIgcHgxeTEgPSByb3RhdGUobHgxLCBseTEpO1xuICAgICAgdmFyIHB4MXkyID0gcm90YXRlKGx4MSwgbHkyKTtcbiAgICAgIHZhciBweDJ5MSA9IHJvdGF0ZShseDIsIGx5MSk7XG4gICAgICB2YXIgcHgyeTIgPSByb3RhdGUobHgyLCBseTIpO1xuICAgICAgdmFyIHBvaW50cyA9IFtcbiAgICAgIC8vIHdpdGggdGhlIG1hcmdpbiBhZGRlZCBhZnRlciB0aGUgcm90YXRpb24gaXMgYXBwbGllZFxuICAgICAgcHgxeTEueCArIG94LCBweDF5MS55ICsgb3ksIHB4MnkxLnggKyBveCwgcHgyeTEueSArIG95LCBweDJ5Mi54ICsgb3gsIHB4MnkyLnkgKyBveSwgcHgxeTIueCArIG94LCBweDF5Mi55ICsgb3ldO1xuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBwb2ludHMpKSB7XG4gICAgICAgIGFkZEVsZShlbGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZG8gYSBjaGVhcGVyIGJiIGNoZWNrXG4gICAgICBpZiAoaW5Cb3VuZGluZ0JveChiYiwgeCwgeSkpIHtcbiAgICAgICAgYWRkRWxlKGVsZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmb3IgKHZhciBpID0gZWxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIC8vIHJldmVyc2Ugb3JkZXIgZm9yIHByZWNlZGVuY2VcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICBjaGVja05vZGUoZWxlKSB8fCBjaGVja0xhYmVsKGVsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZW4gZWRnZVxuICAgICAgY2hlY2tFZGdlKGVsZSkgfHwgY2hlY2tMYWJlbChlbGUpIHx8IGNoZWNrTGFiZWwoZWxlLCAnc291cmNlJykgfHwgY2hlY2tMYWJlbChlbGUsICd0YXJnZXQnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lYXI7XG59O1xuXG4vLyAnR2l2ZSBtZSBldmVyeXRoaW5nIGZyb20gdGhpcyBib3gnXG5CUnAkZS5nZXRBbGxJbkJveCA9IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5Mikge1xuICB2YXIgZWxlcyA9IHRoaXMuZ2V0Q2FjaGVkWlNvcnRlZEVsZXMoKS5pbnRlcmFjdGl2ZTtcbiAgdmFyIGJveCA9IFtdO1xuICB2YXIgeDFjID0gTWF0aC5taW4oeDEsIHgyKTtcbiAgdmFyIHgyYyA9IE1hdGgubWF4KHgxLCB4Mik7XG4gIHZhciB5MWMgPSBNYXRoLm1pbih5MSwgeTIpO1xuICB2YXIgeTJjID0gTWF0aC5tYXgoeTEsIHkyKTtcbiAgeDEgPSB4MWM7XG4gIHgyID0geDJjO1xuICB5MSA9IHkxYztcbiAgeTIgPSB5MmM7XG4gIHZhciBib3hCYiA9IG1ha2VCb3VuZGluZ0JveCh7XG4gICAgeDE6IHgxLFxuICAgIHkxOiB5MSxcbiAgICB4MjogeDIsXG4gICAgeTI6IHkyXG4gIH0pO1xuICBmb3IgKHZhciBlID0gMDsgZSA8IGVsZXMubGVuZ3RoOyBlKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tlXTtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICB2YXIgbm9kZSA9IGVsZTtcbiAgICAgIHZhciBub2RlQmIgPSBub2RlLmJvdW5kaW5nQm94KHtcbiAgICAgICAgaW5jbHVkZU5vZGVzOiB0cnVlLFxuICAgICAgICBpbmNsdWRlRWRnZXM6IGZhbHNlLFxuICAgICAgICBpbmNsdWRlTGFiZWxzOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBpZiAoYm91bmRpbmdCb3hlc0ludGVyc2VjdChib3hCYiwgbm9kZUJiKSAmJiAhYm91bmRpbmdCb3hJbkJvdW5kaW5nQm94KG5vZGVCYiwgYm94QmIpKSB7XG4gICAgICAgIGJveC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZWRnZSA9IGVsZTtcbiAgICAgIHZhciBfcCA9IGVkZ2UuX3ByaXZhdGU7XG4gICAgICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgICAgIGlmIChycy5zdGFydFggIT0gbnVsbCAmJiBycy5zdGFydFkgIT0gbnVsbCAmJiAhaW5Cb3VuZGluZ0JveChib3hCYiwgcnMuc3RhcnRYLCBycy5zdGFydFkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHJzLmVuZFggIT0gbnVsbCAmJiBycy5lbmRZICE9IG51bGwgJiYgIWluQm91bmRpbmdCb3goYm94QmIsIHJzLmVuZFgsIHJzLmVuZFkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHJzLmVkZ2VUeXBlID09PSAnYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ211bHRpYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3NlbGYnIHx8IHJzLmVkZ2VUeXBlID09PSAnY29tcG91bmQnIHx8IHJzLmVkZ2VUeXBlID09PSAnc2VnbWVudHMnIHx8IHJzLmVkZ2VUeXBlID09PSAnaGF5c3RhY2snKSB7XG4gICAgICAgIHZhciBwdHMgPSBfcC5yc3R5bGUuYmV6aWVyUHRzIHx8IF9wLnJzdHlsZS5saW5lUHRzIHx8IF9wLnJzdHlsZS5oYXlzdGFja1B0cztcbiAgICAgICAgdmFyIGFsbEluc2lkZSA9IHRydWU7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFwb2ludEluQm91bmRpbmdCb3goYm94QmIsIHB0c1tpXSkpIHtcbiAgICAgICAgICAgIGFsbEluc2lkZSA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhbGxJbnNpZGUpIHtcbiAgICAgICAgICBib3gucHVzaChlZGdlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChycy5lZGdlVHlwZSA9PT0gJ2hheXN0YWNrJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3N0cmFpZ2h0Jykge1xuICAgICAgICBib3gucHVzaChlZGdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJveDtcbn07XG5cbnZhciBCUnAkZCA9IHt9O1xuQlJwJGQuY2FsY3VsYXRlQXJyb3dBbmdsZXMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgaXNIYXlzdGFjayA9IHJzLmVkZ2VUeXBlID09PSAnaGF5c3RhY2snO1xuICB2YXIgaXNCZXppZXIgPSBycy5lZGdlVHlwZSA9PT0gJ2Jlemllcic7XG4gIHZhciBpc011bHRpYmV6aWVyID0gcnMuZWRnZVR5cGUgPT09ICdtdWx0aWJlemllcic7XG4gIHZhciBpc1NlZ21lbnRzID0gcnMuZWRnZVR5cGUgPT09ICdzZWdtZW50cyc7XG4gIHZhciBpc0NvbXBvdW5kID0gcnMuZWRnZVR5cGUgPT09ICdjb21wb3VuZCc7XG4gIHZhciBpc1NlbGYgPSBycy5lZGdlVHlwZSA9PT0gJ3NlbGYnO1xuXG4gIC8vIERpc3BsYWNlbWVudCBnaXZlcyBkaXJlY3Rpb24gZm9yIGFycm93aGVhZCBvcmllbnRhdGlvblxuICB2YXIgZGlzcFgsIGRpc3BZO1xuICB2YXIgc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIG1pZFgsIG1pZFk7XG4gIGlmIChpc0hheXN0YWNrKSB7XG4gICAgc3RhcnRYID0gcnMuaGF5c3RhY2tQdHNbMF07XG4gICAgc3RhcnRZID0gcnMuaGF5c3RhY2tQdHNbMV07XG4gICAgZW5kWCA9IHJzLmhheXN0YWNrUHRzWzJdO1xuICAgIGVuZFkgPSBycy5oYXlzdGFja1B0c1szXTtcbiAgfSBlbHNlIHtcbiAgICBzdGFydFggPSBycy5hcnJvd1N0YXJ0WDtcbiAgICBzdGFydFkgPSBycy5hcnJvd1N0YXJ0WTtcbiAgICBlbmRYID0gcnMuYXJyb3dFbmRYO1xuICAgIGVuZFkgPSBycy5hcnJvd0VuZFk7XG4gIH1cbiAgbWlkWCA9IHJzLm1pZFg7XG4gIG1pZFkgPSBycy5taWRZO1xuXG4gIC8vIHNvdXJjZVxuICAvL1xuXG4gIGlmIChpc1NlZ21lbnRzKSB7XG4gICAgZGlzcFggPSBzdGFydFggLSBycy5zZWdwdHNbMF07XG4gICAgZGlzcFkgPSBzdGFydFkgLSBycy5zZWdwdHNbMV07XG4gIH0gZWxzZSBpZiAoaXNNdWx0aWJlemllciB8fCBpc0NvbXBvdW5kIHx8IGlzU2VsZiB8fCBpc0Jlemllcikge1xuICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG4gICAgdmFyIGJYID0gcWJlemllckF0KHB0c1swXSwgcHRzWzJdLCBwdHNbNF0sIDAuMSk7XG4gICAgdmFyIGJZID0gcWJlemllckF0KHB0c1sxXSwgcHRzWzNdLCBwdHNbNV0sIDAuMSk7XG4gICAgZGlzcFggPSBzdGFydFggLSBiWDtcbiAgICBkaXNwWSA9IHN0YXJ0WSAtIGJZO1xuICB9IGVsc2Uge1xuICAgIGRpc3BYID0gc3RhcnRYIC0gbWlkWDtcbiAgICBkaXNwWSA9IHN0YXJ0WSAtIG1pZFk7XG4gIH1cbiAgcnMuc3JjQXJyb3dBbmdsZSA9IGdldEFuZ2xlRnJvbURpc3AoZGlzcFgsIGRpc3BZKTtcblxuICAvLyBtaWQgdGFyZ2V0XG4gIC8vXG5cbiAgdmFyIG1pZFggPSBycy5taWRYO1xuICB2YXIgbWlkWSA9IHJzLm1pZFk7XG4gIGlmIChpc0hheXN0YWNrKSB7XG4gICAgbWlkWCA9IChzdGFydFggKyBlbmRYKSAvIDI7XG4gICAgbWlkWSA9IChzdGFydFkgKyBlbmRZKSAvIDI7XG4gIH1cbiAgZGlzcFggPSBlbmRYIC0gc3RhcnRYO1xuICBkaXNwWSA9IGVuZFkgLSBzdGFydFk7XG4gIGlmIChpc1NlZ21lbnRzKSB7XG4gICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcbiAgICBpZiAocHRzLmxlbmd0aCAvIDIgJSAyID09PSAwKSB7XG4gICAgICB2YXIgaTIgPSBwdHMubGVuZ3RoIC8gMjtcbiAgICAgIHZhciBpMSA9IGkyIC0gMjtcbiAgICAgIGRpc3BYID0gcHRzW2kyXSAtIHB0c1tpMV07XG4gICAgICBkaXNwWSA9IHB0c1tpMiArIDFdIC0gcHRzW2kxICsgMV07XG4gICAgfSBlbHNlIGlmIChycy5pc1JvdW5kKSB7XG4gICAgICBkaXNwWCA9IHJzLm1pZFZlY3RvclsxXTtcbiAgICAgIGRpc3BZID0gLXJzLm1pZFZlY3RvclswXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGkyID0gcHRzLmxlbmd0aCAvIDIgLSAxO1xuICAgICAgdmFyIGkxID0gaTIgLSAyO1xuICAgICAgZGlzcFggPSBwdHNbaTJdIC0gcHRzW2kxXTtcbiAgICAgIGRpc3BZID0gcHRzW2kyICsgMV0gLSBwdHNbaTEgKyAxXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNNdWx0aWJlemllciB8fCBpc0NvbXBvdW5kIHx8IGlzU2VsZikge1xuICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG4gICAgdmFyIGNwdHMgPSBycy5jdHJscHRzO1xuICAgIHZhciBicDB4LCBicDB5O1xuICAgIHZhciBicDF4LCBicDF5O1xuICAgIGlmIChjcHRzLmxlbmd0aCAvIDIgJSAyID09PSAwKSB7XG4gICAgICB2YXIgcDAgPSBwdHMubGVuZ3RoIC8gMiAtIDE7IC8vIHN0YXJ0cHRcbiAgICAgIHZhciBpYyA9IHAwICsgMjtcbiAgICAgIHZhciBwMSA9IGljICsgMjtcbiAgICAgIGJwMHggPSBxYmV6aWVyQXQocHRzW3AwXSwgcHRzW2ljXSwgcHRzW3AxXSwgMC4wKTtcbiAgICAgIGJwMHkgPSBxYmV6aWVyQXQocHRzW3AwICsgMV0sIHB0c1tpYyArIDFdLCBwdHNbcDEgKyAxXSwgMC4wKTtcbiAgICAgIGJwMXggPSBxYmV6aWVyQXQocHRzW3AwXSwgcHRzW2ljXSwgcHRzW3AxXSwgMC4wMDAxKTtcbiAgICAgIGJwMXkgPSBxYmV6aWVyQXQocHRzW3AwICsgMV0sIHB0c1tpYyArIDFdLCBwdHNbcDEgKyAxXSwgMC4wMDAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGljID0gcHRzLmxlbmd0aCAvIDIgLSAxOyAvLyBjdHJwdFxuICAgICAgdmFyIHAwID0gaWMgLSAyOyAvLyBzdGFydHB0XG4gICAgICB2YXIgcDEgPSBpYyArIDI7IC8vIGVuZHB0XG5cbiAgICAgIGJwMHggPSBxYmV6aWVyQXQocHRzW3AwXSwgcHRzW2ljXSwgcHRzW3AxXSwgMC40OTk5KTtcbiAgICAgIGJwMHkgPSBxYmV6aWVyQXQocHRzW3AwICsgMV0sIHB0c1tpYyArIDFdLCBwdHNbcDEgKyAxXSwgMC40OTk5KTtcbiAgICAgIGJwMXggPSBxYmV6aWVyQXQocHRzW3AwXSwgcHRzW2ljXSwgcHRzW3AxXSwgMC41KTtcbiAgICAgIGJwMXkgPSBxYmV6aWVyQXQocHRzW3AwICsgMV0sIHB0c1tpYyArIDFdLCBwdHNbcDEgKyAxXSwgMC41KTtcbiAgICB9XG4gICAgZGlzcFggPSBicDF4IC0gYnAweDtcbiAgICBkaXNwWSA9IGJwMXkgLSBicDB5O1xuICB9XG4gIHJzLm1pZHRndEFycm93QW5nbGUgPSBnZXRBbmdsZUZyb21EaXNwKGRpc3BYLCBkaXNwWSk7XG4gIHJzLm1pZERpc3BYID0gZGlzcFg7XG4gIHJzLm1pZERpc3BZID0gZGlzcFk7XG5cbiAgLy8gbWlkIHNvdXJjZVxuICAvL1xuXG4gIGRpc3BYICo9IC0xO1xuICBkaXNwWSAqPSAtMTtcbiAgaWYgKGlzU2VnbWVudHMpIHtcbiAgICB2YXIgcHRzID0gcnMuYWxscHRzO1xuICAgIGlmIChwdHMubGVuZ3RoIC8gMiAlIDIgPT09IDApIDsgZWxzZSBpZiAoIXJzLmlzUm91bmQpIHtcbiAgICAgIHZhciBpMiA9IHB0cy5sZW5ndGggLyAyIC0gMTtcbiAgICAgIHZhciBpMyA9IGkyICsgMjtcbiAgICAgIGRpc3BYID0gLShwdHNbaTNdIC0gcHRzW2kyXSk7XG4gICAgICBkaXNwWSA9IC0ocHRzW2kzICsgMV0gLSBwdHNbaTIgKyAxXSk7XG4gICAgfVxuICB9XG4gIHJzLm1pZHNyY0Fycm93QW5nbGUgPSBnZXRBbmdsZUZyb21EaXNwKGRpc3BYLCBkaXNwWSk7XG5cbiAgLy8gdGFyZ2V0XG4gIC8vXG5cbiAgaWYgKGlzU2VnbWVudHMpIHtcbiAgICBkaXNwWCA9IGVuZFggLSBycy5zZWdwdHNbcnMuc2VncHRzLmxlbmd0aCAtIDJdO1xuICAgIGRpc3BZID0gZW5kWSAtIHJzLnNlZ3B0c1tycy5zZWdwdHMubGVuZ3RoIC0gMV07XG4gIH0gZWxzZSBpZiAoaXNNdWx0aWJlemllciB8fCBpc0NvbXBvdW5kIHx8IGlzU2VsZiB8fCBpc0Jlemllcikge1xuICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG4gICAgdmFyIGwgPSBwdHMubGVuZ3RoO1xuICAgIHZhciBiWCA9IHFiZXppZXJBdChwdHNbbCAtIDZdLCBwdHNbbCAtIDRdLCBwdHNbbCAtIDJdLCAwLjkpO1xuICAgIHZhciBiWSA9IHFiZXppZXJBdChwdHNbbCAtIDVdLCBwdHNbbCAtIDNdLCBwdHNbbCAtIDFdLCAwLjkpO1xuICAgIGRpc3BYID0gZW5kWCAtIGJYO1xuICAgIGRpc3BZID0gZW5kWSAtIGJZO1xuICB9IGVsc2Uge1xuICAgIGRpc3BYID0gZW5kWCAtIG1pZFg7XG4gICAgZGlzcFkgPSBlbmRZIC0gbWlkWTtcbiAgfVxuICBycy50Z3RBcnJvd0FuZ2xlID0gZ2V0QW5nbGVGcm9tRGlzcChkaXNwWCwgZGlzcFkpO1xufTtcbkJScCRkLmdldEFycm93V2lkdGggPSBCUnAkZC5nZXRBcnJvd0hlaWdodCA9IGZ1bmN0aW9uIChlZGdlV2lkdGgsIHNjYWxlKSB7XG4gIHZhciBjYWNoZSA9IHRoaXMuYXJyb3dXaWR0aENhY2hlID0gdGhpcy5hcnJvd1dpZHRoQ2FjaGUgfHwge307XG4gIHZhciBjYWNoZWRWYWwgPSBjYWNoZVtlZGdlV2lkdGggKyAnLCAnICsgc2NhbGVdO1xuICBpZiAoY2FjaGVkVmFsKSB7XG4gICAgcmV0dXJuIGNhY2hlZFZhbDtcbiAgfVxuICBjYWNoZWRWYWwgPSBNYXRoLm1heChNYXRoLnBvdyhlZGdlV2lkdGggKiAxMy4zNywgMC45KSwgMjkpICogc2NhbGU7XG4gIGNhY2hlW2VkZ2VXaWR0aCArICcsICcgKyBzY2FsZV0gPSBjYWNoZWRWYWw7XG4gIHJldHVybiBjYWNoZWRWYWw7XG59O1xuXG4vKipcbiAqIEV4cGxhaW5lZCBieSBCbGluZG1hbjY3IGF0IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NDg1NjkyNS8xMTAyODgyOFxuICovXG5cbi8vIERlY2xhcmUgcmV1c2VkIHZhcmlhYmxlIHRvIGF2b2lkIHJlYWxsb2NhdGluZyB2YXJpYWJsZXMgZXZlcnkgdGltZSB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkXG52YXIgeCxcbiAgeSxcbiAgdjEgPSB7fSxcbiAgdjIgPSB7fSxcbiAgc2luQSxcbiAgc2luQTkwLFxuICByYWREaXJlY3Rpb24sXG4gIGRyYXdEaXJlY3Rpb24sXG4gIGFuZ2xlLFxuICBoYWxmQW5nbGUsXG4gIGNSYWRpdXMsXG4gIGxlbk91dCxcbiAgcmFkaXVzLFxuICBsaW1pdDtcbnZhciBzdGFydFgsIHN0YXJ0WSwgc3RvcFgsIHN0b3BZO1xudmFyIGxhc3RQb2ludDtcblxuLy8gY29udmVydCAyIHBvaW50cyBpbnRvIHZlY3RvciBmb3JtLCBwb2xhciBmb3JtLCBhbmQgbm9ybWFsaXNlZFxudmFyIGFzVmVjID0gZnVuY3Rpb24gYXNWZWMocCwgcHAsIHYpIHtcbiAgdi54ID0gcHAueCAtIHAueDtcbiAgdi55ID0gcHAueSAtIHAueTtcbiAgdi5sZW4gPSBNYXRoLnNxcnQodi54ICogdi54ICsgdi55ICogdi55KTtcbiAgdi5ueCA9IHYueCAvIHYubGVuO1xuICB2Lm55ID0gdi55IC8gdi5sZW47XG4gIHYuYW5nID0gTWF0aC5hdGFuMih2Lm55LCB2Lm54KTtcbn07XG52YXIgaW52ZXJ0VmVjID0gZnVuY3Rpb24gaW52ZXJ0VmVjKG9yaWdpbmFsViwgaW52ZXJ0ZWRWKSB7XG4gIGludmVydGVkVi54ID0gb3JpZ2luYWxWLnggKiAtMTtcbiAgaW52ZXJ0ZWRWLnkgPSBvcmlnaW5hbFYueSAqIC0xO1xuICBpbnZlcnRlZFYubnggPSBvcmlnaW5hbFYubnggKiAtMTtcbiAgaW52ZXJ0ZWRWLm55ID0gb3JpZ2luYWxWLm55ICogLTE7XG4gIGludmVydGVkVi5hbmcgPSBvcmlnaW5hbFYuYW5nID4gMCA/IC0oTWF0aC5QSSAtIG9yaWdpbmFsVi5hbmcpIDogTWF0aC5QSSArIG9yaWdpbmFsVi5hbmc7XG59O1xudmFyIGNhbGNDb3JuZXJBcmMgPSBmdW5jdGlvbiBjYWxjQ29ybmVyQXJjKHByZXZpb3VzUG9pbnQsIGN1cnJlbnRQb2ludCwgbmV4dFBvaW50LCByYWRpdXNNYXgsIGlzQXJjUmFkaXVzKSB7XG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUGFydCAxXG4gIHByZXZpb3VzUG9pbnQgIT09IGxhc3RQb2ludCA/IGFzVmVjKGN1cnJlbnRQb2ludCwgcHJldmlvdXNQb2ludCwgdjEpIDogaW52ZXJ0VmVjKHYyLCB2MSk7IC8vIEF2b2lkIHJlY2FsY3VsYXRpbmcgdmVjIGlmIGl0IGlzIHRoZSBpbnZlcnQgb2YgdGhlIGxhc3Qgb25lIGNhbGN1bGF0ZWRcbiAgYXNWZWMoY3VycmVudFBvaW50LCBuZXh0UG9pbnQsIHYyKTtcbiAgc2luQSA9IHYxLm54ICogdjIubnkgLSB2MS5ueSAqIHYyLm54O1xuICBzaW5BOTAgPSB2MS5ueCAqIHYyLm54IC0gdjEubnkgKiAtdjIubnk7XG4gIGFuZ2xlID0gTWF0aC5hc2luKE1hdGgubWF4KC0xLCBNYXRoLm1pbigxLCBzaW5BKSkpO1xuICBpZiAoTWF0aC5hYnMoYW5nbGUpIDwgMWUtNikge1xuICAgIHggPSBjdXJyZW50UG9pbnQueDtcbiAgICB5ID0gY3VycmVudFBvaW50Lnk7XG4gICAgY1JhZGl1cyA9IHJhZGl1cyA9IDA7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgcmFkRGlyZWN0aW9uID0gMTtcbiAgZHJhd0RpcmVjdGlvbiA9IGZhbHNlO1xuICBpZiAoc2luQTkwIDwgMCkge1xuICAgIGlmIChhbmdsZSA8IDApIHtcbiAgICAgIGFuZ2xlID0gTWF0aC5QSSArIGFuZ2xlO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbmdsZSA9IE1hdGguUEkgLSBhbmdsZTtcbiAgICAgIHJhZERpcmVjdGlvbiA9IC0xO1xuICAgICAgZHJhd0RpcmVjdGlvbiA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChhbmdsZSA+IDApIHtcbiAgICAgIHJhZERpcmVjdGlvbiA9IC0xO1xuICAgICAgZHJhd0RpcmVjdGlvbiA9IHRydWU7XG4gICAgfVxuICB9XG4gIGlmIChjdXJyZW50UG9pbnQucmFkaXVzICE9PSB1bmRlZmluZWQpIHtcbiAgICByYWRpdXMgPSBjdXJyZW50UG9pbnQucmFkaXVzO1xuICB9IGVsc2Uge1xuICAgIHJhZGl1cyA9IHJhZGl1c01heDtcbiAgfVxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFBhcnQgMlxuICBoYWxmQW5nbGUgPSBhbmdsZSAvIDI7XG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBsaW1pdCA9IE1hdGgubWluKHYxLmxlbiAvIDIsIHYyLmxlbiAvIDIpO1xuICBpZiAoaXNBcmNSYWRpdXMpIHtcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUGFydCAzXG4gICAgbGVuT3V0ID0gTWF0aC5hYnMoTWF0aC5jb3MoaGFsZkFuZ2xlKSAqIHJhZGl1cyAvIE1hdGguc2luKGhhbGZBbmdsZSkpO1xuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFNwZWNpYWwgcGFydCBBXG4gICAgaWYgKGxlbk91dCA+IGxpbWl0KSB7XG4gICAgICBsZW5PdXQgPSBsaW1pdDtcbiAgICAgIGNSYWRpdXMgPSBNYXRoLmFicyhsZW5PdXQgKiBNYXRoLnNpbihoYWxmQW5nbGUpIC8gTWF0aC5jb3MoaGFsZkFuZ2xlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNSYWRpdXMgPSByYWRpdXM7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxlbk91dCA9IE1hdGgubWluKGxpbWl0LCByYWRpdXMpO1xuICAgIGNSYWRpdXMgPSBNYXRoLmFicyhsZW5PdXQgKiBNYXRoLnNpbihoYWxmQW5nbGUpIC8gTWF0aC5jb3MoaGFsZkFuZ2xlKSk7XG4gIH1cbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUGFydCA0XG4gIHN0b3BYID0gY3VycmVudFBvaW50LnggKyB2Mi5ueCAqIGxlbk91dDtcbiAgc3RvcFkgPSBjdXJyZW50UG9pbnQueSArIHYyLm55ICogbGVuT3V0O1xuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFBhcnQgNVxuICB4ID0gc3RvcFggLSB2Mi5ueSAqIGNSYWRpdXMgKiByYWREaXJlY3Rpb247XG4gIHkgPSBzdG9wWSArIHYyLm54ICogY1JhZGl1cyAqIHJhZERpcmVjdGlvbjtcbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBBZGRpdGlvbmFsIFBhcnQgOiBjYWxjdWxhdGUgc3RhcnQgcG9pbnQgRVxuICBzdGFydFggPSBjdXJyZW50UG9pbnQueCArIHYxLm54ICogbGVuT3V0O1xuICBzdGFydFkgPSBjdXJyZW50UG9pbnQueSArIHYxLm55ICogbGVuT3V0O1xuXG4gIC8vIFNhdmUgbGFzdCBwb2ludCB0byBhdm9pZCByZWNhbGN1bGF0aW5nIHZlY3RvciB3aGVuIG5vdCBuZWVkZWRcbiAgbGFzdFBvaW50ID0gY3VycmVudFBvaW50O1xufTtcblxuLyoqXG4gKiBEcmF3IGNvcm5lciBwcm92aWRlZCBieSB7QGxpbmsgZ2V0Um91bmRDb3JuZXJ9XG4gKlxuICogQHBhcmFtIGN0eCA6Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gKiBAcGFyYW0gcm91bmRDb3JuZXIge3tjeDpudW1iZXIsIGN5Om51bWJlciwgcmFkaXVzOm51bWJlciwgZW5kQW5nbGU6IG51bWJlciwgc3RhcnRBbmdsZTogbnVtYmVyLCBjb3VudGVyQ2xvY2t3aXNlOiBib29sZWFufX1cbiAqL1xuZnVuY3Rpb24gZHJhd1ByZXBhcmVkUm91bmRDb3JuZXIoY3R4LCByb3VuZENvcm5lcikge1xuICBpZiAocm91bmRDb3JuZXIucmFkaXVzID09PSAwKSBjdHgubGluZVRvKHJvdW5kQ29ybmVyLmN4LCByb3VuZENvcm5lci5jeSk7ZWxzZSBjdHguYXJjKHJvdW5kQ29ybmVyLmN4LCByb3VuZENvcm5lci5jeSwgcm91bmRDb3JuZXIucmFkaXVzLCByb3VuZENvcm5lci5zdGFydEFuZ2xlLCByb3VuZENvcm5lci5lbmRBbmdsZSwgcm91bmRDb3JuZXIuY291bnRlckNsb2Nrd2lzZSk7XG59XG5cbi8qKlxuICogR2V0IHJvdW5kIGNvcm5lciBmcm9tIGEgcG9pbnQgYW5kIGl0cyBwcmV2aW91cyBhbmQgbmV4dCBuZWlnaGJvdXJzIGluIGEgcGF0aFxuICpcbiAqIEBwYXJhbSBwcmV2aW91c1BvaW50IHt7eDogbnVtYmVyLCB5Om51bWJlciwgcmFkaXVzOiBudW1iZXI/fX1cbiAqIEBwYXJhbSBjdXJyZW50UG9pbnQge3t4OiBudW1iZXIsIHk6bnVtYmVyLCByYWRpdXM6IG51bWJlcj99fVxuICogQHBhcmFtIG5leHRQb2ludCB7e3g6IG51bWJlciwgeTpudW1iZXIsIHJhZGl1czogbnVtYmVyP319XG4gKiBAcGFyYW0gcmFkaXVzTWF4IDpudW1iZXJcbiAqIEBwYXJhbSBpc0FyY1JhZGl1cyA6Ym9vbGVhblxuICogQHJldHVybiB7e1xuICogY3g6bnVtYmVyLCBjeTpudW1iZXIsIHJhZGl1czpudW1iZXIsXG4gKiBzdGFydFg6bnVtYmVyLCBzdGFydFk6bnVtYmVyLFxuICogc3RvcFg6bnVtYmVyLCBzdG9wWTogbnVtYmVyLFxuICogZW5kQW5nbGU6IG51bWJlciwgc3RhcnRBbmdsZTogbnVtYmVyLCBjb3VudGVyQ2xvY2t3aXNlOiBib29sZWFuXG4gKiB9fVxuICovXG5mdW5jdGlvbiBnZXRSb3VuZENvcm5lcihwcmV2aW91c1BvaW50LCBjdXJyZW50UG9pbnQsIG5leHRQb2ludCwgcmFkaXVzTWF4KSB7XG4gIHZhciBpc0FyY1JhZGl1cyA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgaWYgKHJhZGl1c01heCA9PT0gMCB8fCBjdXJyZW50UG9pbnQucmFkaXVzID09PSAwKSByZXR1cm4ge1xuICAgIGN4OiBjdXJyZW50UG9pbnQueCxcbiAgICBjeTogY3VycmVudFBvaW50LnksXG4gICAgcmFkaXVzOiAwLFxuICAgIHN0YXJ0WDogY3VycmVudFBvaW50LngsXG4gICAgc3RhcnRZOiBjdXJyZW50UG9pbnQueSxcbiAgICBzdG9wWDogY3VycmVudFBvaW50LngsXG4gICAgc3RvcFk6IGN1cnJlbnRQb2ludC55LFxuICAgIHN0YXJ0QW5nbGU6IHVuZGVmaW5lZCxcbiAgICBlbmRBbmdsZTogdW5kZWZpbmVkLFxuICAgIGNvdW50ZXJDbG9ja3dpc2U6IHVuZGVmaW5lZFxuICB9O1xuICBjYWxjQ29ybmVyQXJjKHByZXZpb3VzUG9pbnQsIGN1cnJlbnRQb2ludCwgbmV4dFBvaW50LCByYWRpdXNNYXgsIGlzQXJjUmFkaXVzKTtcbiAgcmV0dXJuIHtcbiAgICBjeDogeCxcbiAgICBjeTogeSxcbiAgICByYWRpdXM6IGNSYWRpdXMsXG4gICAgc3RhcnRYOiBzdGFydFgsXG4gICAgc3RhcnRZOiBzdGFydFksXG4gICAgc3RvcFg6IHN0b3BYLFxuICAgIHN0b3BZOiBzdG9wWSxcbiAgICBzdGFydEFuZ2xlOiB2MS5hbmcgKyBNYXRoLlBJIC8gMiAqIHJhZERpcmVjdGlvbixcbiAgICBlbmRBbmdsZTogdjIuYW5nIC0gTWF0aC5QSSAvIDIgKiByYWREaXJlY3Rpb24sXG4gICAgY291bnRlckNsb2Nrd2lzZTogZHJhd0RpcmVjdGlvblxuICB9O1xufVxuXG52YXIgQlJwJGMgPSB7fTtcbkJScCRjLmZpbmRNaWRwdFB0c0V0YyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbykge1xuICB2YXIgcG9zUHRzID0gcGFpckluZm8ucG9zUHRzLFxuICAgIGludGVyc2VjdGlvblB0cyA9IHBhaXJJbmZvLmludGVyc2VjdGlvblB0cyxcbiAgICB2ZWN0b3JOb3JtSW52ZXJzZSA9IHBhaXJJbmZvLnZlY3Rvck5vcm1JbnZlcnNlO1xuICB2YXIgbWlkcHRQdHM7XG5cbiAgLy8gbi5iLiBhc3N1bWVzIGFsbCBlZGdlcyBpbiBiZXppZXIgYnVuZGxlIGhhdmUgc2FtZSBlbmRwb2ludHMgc3BlY2lmaWVkXG4gIHZhciBzcmNNYW5FbmRwdCA9IGVkZ2UucHN0eWxlKCdzb3VyY2UtZW5kcG9pbnQnKTtcbiAgdmFyIHRndE1hbkVuZHB0ID0gZWRnZS5wc3R5bGUoJ3RhcmdldC1lbmRwb2ludCcpO1xuICB2YXIgaGF2ZU1hbnVhbEVuZFB0cyA9IHNyY01hbkVuZHB0LnVuaXRzICE9IG51bGwgJiYgdGd0TWFuRW5kcHQudW5pdHMgIT0gbnVsbDtcbiAgdmFyIHJlY2FsY1ZlY3Rvck5vcm1JbnZlcnNlID0gZnVuY3Rpb24gcmVjYWxjVmVjdG9yTm9ybUludmVyc2UoeDEsIHkxLCB4MiwgeTIpIHtcbiAgICB2YXIgZHkgPSB5MiAtIHkxO1xuICAgIHZhciBkeCA9IHgyIC0geDE7XG4gICAgdmFyIGwgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgIHJldHVybiB7XG4gICAgICB4OiAtZHkgLyBsLFxuICAgICAgeTogZHggLyBsXG4gICAgfTtcbiAgfTtcbiAgdmFyIGVkZ2VEaXN0YW5jZXMgPSBlZGdlLnBzdHlsZSgnZWRnZS1kaXN0YW5jZXMnKS52YWx1ZTtcbiAgc3dpdGNoIChlZGdlRGlzdGFuY2VzKSB7XG4gICAgY2FzZSAnbm9kZS1wb3NpdGlvbic6XG4gICAgICBtaWRwdFB0cyA9IHBvc1B0cztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ludGVyc2VjdGlvbic6XG4gICAgICBtaWRwdFB0cyA9IGludGVyc2VjdGlvblB0cztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2VuZHBvaW50cyc6XG4gICAgICB7XG4gICAgICAgIGlmIChoYXZlTWFudWFsRW5kUHRzKSB7XG4gICAgICAgICAgdmFyIF90aGlzJG1hbnVhbEVuZHB0VG9QeCA9IHRoaXMubWFudWFsRW5kcHRUb1B4KGVkZ2Uuc291cmNlKClbMF0sIHNyY01hbkVuZHB0KSxcbiAgICAgICAgICAgIF90aGlzJG1hbnVhbEVuZHB0VG9QeDIgPSBfc2xpY2VkVG9BcnJheShfdGhpcyRtYW51YWxFbmRwdFRvUHgsIDIpLFxuICAgICAgICAgICAgeDEgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHgyWzBdLFxuICAgICAgICAgICAgeTEgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHgyWzFdO1xuICAgICAgICAgIHZhciBfdGhpcyRtYW51YWxFbmRwdFRvUHgzID0gdGhpcy5tYW51YWxFbmRwdFRvUHgoZWRnZS50YXJnZXQoKVswXSwgdGd0TWFuRW5kcHQpLFxuICAgICAgICAgICAgX3RoaXMkbWFudWFsRW5kcHRUb1B4NCA9IF9zbGljZWRUb0FycmF5KF90aGlzJG1hbnVhbEVuZHB0VG9QeDMsIDIpLFxuICAgICAgICAgICAgeDIgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHg0WzBdLFxuICAgICAgICAgICAgeTIgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHg0WzFdO1xuICAgICAgICAgIHZhciBlbmRQdHMgPSB7XG4gICAgICAgICAgICB4MTogeDEsXG4gICAgICAgICAgICB5MTogeTEsXG4gICAgICAgICAgICB4MjogeDIsXG4gICAgICAgICAgICB5MjogeTJcbiAgICAgICAgICB9O1xuICAgICAgICAgIHZlY3Rvck5vcm1JbnZlcnNlID0gcmVjYWxjVmVjdG9yTm9ybUludmVyc2UoeDEsIHkxLCB4MiwgeTIpO1xuICAgICAgICAgIG1pZHB0UHRzID0gZW5kUHRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhcm4oXCJFZGdlIFwiLmNvbmNhdChlZGdlLmlkKCksIFwiIGhhcyBlZGdlLWRpc3RhbmNlczplbmRwb2ludHMgc3BlY2lmaWVkIHdpdGhvdXQgbWFudWFsIGVuZHBvaW50cyBzcGVjaWZpZWQgdmlhIHNvdXJjZS1lbmRwb2ludCBhbmQgdGFyZ2V0LWVuZHBvaW50LiAgRmFsbGluZyBiYWNrIG9uIGVkZ2UtZGlzdGFuY2VzOmludGVyc2VjdGlvbiAoZGVmYXVsdCkuXCIpKTtcbiAgICAgICAgICBtaWRwdFB0cyA9IGludGVyc2VjdGlvblB0czsgLy8gYmFjayB0byBkZWZhdWx0XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIG1pZHB0UHRzOiBtaWRwdFB0cyxcbiAgICB2ZWN0b3JOb3JtSW52ZXJzZTogdmVjdG9yTm9ybUludmVyc2VcbiAgfTtcbn07XG5CUnAkYy5maW5kSGF5c3RhY2tQb2ludHMgPSBmdW5jdGlvbiAoZWRnZXMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgICBpZiAoIXJzLmhheXN0YWNrKSB7XG4gICAgICB2YXIgYW5nbGUgPSBNYXRoLnJhbmRvbSgpICogMiAqIE1hdGguUEk7XG4gICAgICBycy5zb3VyY2UgPSB7XG4gICAgICAgIHg6IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgeTogTWF0aC5zaW4oYW5nbGUpXG4gICAgICB9O1xuICAgICAgYW5nbGUgPSBNYXRoLnJhbmRvbSgpICogMiAqIE1hdGguUEk7XG4gICAgICBycy50YXJnZXQgPSB7XG4gICAgICAgIHg6IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgeTogTWF0aC5zaW4oYW5nbGUpXG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgc3JjID0gX3Auc291cmNlO1xuICAgIHZhciB0Z3QgPSBfcC50YXJnZXQ7XG4gICAgdmFyIHNyY1BvcyA9IHNyYy5wb3NpdGlvbigpO1xuICAgIHZhciB0Z3RQb3MgPSB0Z3QucG9zaXRpb24oKTtcbiAgICB2YXIgc3JjVyA9IHNyYy53aWR0aCgpO1xuICAgIHZhciB0Z3RXID0gdGd0LndpZHRoKCk7XG4gICAgdmFyIHNyY0ggPSBzcmMuaGVpZ2h0KCk7XG4gICAgdmFyIHRndEggPSB0Z3QuaGVpZ2h0KCk7XG4gICAgdmFyIHJhZGl1cyA9IGVkZ2UucHN0eWxlKCdoYXlzdGFjay1yYWRpdXMnKS52YWx1ZTtcbiAgICB2YXIgaGFsZlJhZGl1cyA9IHJhZGl1cyAvIDI7IC8vIGIvYyBoYXZlIHRvIGhhbGYgd2lkdGgvaGVpZ2h0XG5cbiAgICBycy5oYXlzdGFja1B0cyA9IHJzLmFsbHB0cyA9IFtycy5zb3VyY2UueCAqIHNyY1cgKiBoYWxmUmFkaXVzICsgc3JjUG9zLngsIHJzLnNvdXJjZS55ICogc3JjSCAqIGhhbGZSYWRpdXMgKyBzcmNQb3MueSwgcnMudGFyZ2V0LnggKiB0Z3RXICogaGFsZlJhZGl1cyArIHRndFBvcy54LCBycy50YXJnZXQueSAqIHRndEggKiBoYWxmUmFkaXVzICsgdGd0UG9zLnldO1xuICAgIHJzLm1pZFggPSAocnMuYWxscHRzWzBdICsgcnMuYWxscHRzWzJdKSAvIDI7XG4gICAgcnMubWlkWSA9IChycy5hbGxwdHNbMV0gKyBycy5hbGxwdHNbM10pIC8gMjtcblxuICAgIC8vIGFsd2F5cyBvdmVycmlkZSBhcyBoYXlzdGFjayBpbiBjYXNlIHNldCB0byBkaWZmZXJlbnQgdHlwZSBwcmV2aW91c2x5XG4gICAgcnMuZWRnZVR5cGUgPSAnaGF5c3RhY2snO1xuICAgIHJzLmhheXN0YWNrID0gdHJ1ZTtcbiAgICB0aGlzLnN0b3JlRWRnZVByb2plY3Rpb25zKGVkZ2UpO1xuICAgIHRoaXMuY2FsY3VsYXRlQXJyb3dBbmdsZXMoZWRnZSk7XG4gICAgdGhpcy5yZWNhbGN1bGF0ZUVkZ2VMYWJlbFByb2plY3Rpb25zKGVkZ2UpO1xuICAgIHRoaXMuY2FsY3VsYXRlTGFiZWxBbmdsZXMoZWRnZSk7XG4gIH1cbn07XG5CUnAkYy5maW5kU2VnbWVudHNQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSwgcGFpckluZm8pIHtcbiAgLy8gU2VnbWVudHMgKG11bHRpcGxlIHN0cmFpZ2h0IGxpbmVzKVxuXG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBzZWdtZW50V3MgPSBlZGdlLnBzdHlsZSgnc2VnbWVudC13ZWlnaHRzJyk7XG4gIHZhciBzZWdtZW50RHMgPSBlZGdlLnBzdHlsZSgnc2VnbWVudC1kaXN0YW5jZXMnKTtcbiAgdmFyIHNlZ21lbnRScyA9IGVkZ2UucHN0eWxlKCdzZWdtZW50LXJhZGlpJyk7XG4gIHZhciBzZWdtZW50VHMgPSBlZGdlLnBzdHlsZSgncmFkaXVzLXR5cGUnKTtcbiAgdmFyIHNlZ21lbnRzTiA9IE1hdGgubWluKHNlZ21lbnRXcy5wZlZhbHVlLmxlbmd0aCwgc2VnbWVudERzLnBmVmFsdWUubGVuZ3RoKTtcbiAgdmFyIGxhc3RSYWRpdXMgPSBzZWdtZW50UnMucGZWYWx1ZVtzZWdtZW50UnMucGZWYWx1ZS5sZW5ndGggLSAxXTtcbiAgdmFyIGxhc3RSYWRpdXNUeXBlID0gc2VnbWVudFRzLnBmVmFsdWVbc2VnbWVudFRzLnBmVmFsdWUubGVuZ3RoIC0gMV07XG4gIHJzLmVkZ2VUeXBlID0gJ3NlZ21lbnRzJztcbiAgcnMuc2VncHRzID0gW107XG4gIHJzLnJhZGlpID0gW107XG4gIHJzLmlzQXJjUmFkaXVzID0gW107XG4gIGZvciAodmFyIHMgPSAwOyBzIDwgc2VnbWVudHNOOyBzKyspIHtcbiAgICB2YXIgdyA9IHNlZ21lbnRXcy5wZlZhbHVlW3NdO1xuICAgIHZhciBkID0gc2VnbWVudERzLnBmVmFsdWVbc107XG4gICAgdmFyIHcxID0gMSAtIHc7XG4gICAgdmFyIHcyID0gdztcbiAgICB2YXIgX3RoaXMkZmluZE1pZHB0UHRzRXRjID0gdGhpcy5maW5kTWlkcHRQdHNFdGMoZWRnZSwgcGFpckluZm8pLFxuICAgICAgbWlkcHRQdHMgPSBfdGhpcyRmaW5kTWlkcHRQdHNFdGMubWlkcHRQdHMsXG4gICAgICB2ZWN0b3JOb3JtSW52ZXJzZSA9IF90aGlzJGZpbmRNaWRwdFB0c0V0Yy52ZWN0b3JOb3JtSW52ZXJzZTtcbiAgICB2YXIgYWRqdXN0ZWRNaWRwdCA9IHtcbiAgICAgIHg6IG1pZHB0UHRzLngxICogdzEgKyBtaWRwdFB0cy54MiAqIHcyLFxuICAgICAgeTogbWlkcHRQdHMueTEgKiB3MSArIG1pZHB0UHRzLnkyICogdzJcbiAgICB9O1xuICAgIHJzLnNlZ3B0cy5wdXNoKGFkanVzdGVkTWlkcHQueCArIHZlY3Rvck5vcm1JbnZlcnNlLnggKiBkLCBhZGp1c3RlZE1pZHB0LnkgKyB2ZWN0b3JOb3JtSW52ZXJzZS55ICogZCk7XG4gICAgcnMucmFkaWkucHVzaChzZWdtZW50UnMucGZWYWx1ZVtzXSAhPT0gdW5kZWZpbmVkID8gc2VnbWVudFJzLnBmVmFsdWVbc10gOiBsYXN0UmFkaXVzKTtcbiAgICBycy5pc0FyY1JhZGl1cy5wdXNoKChzZWdtZW50VHMucGZWYWx1ZVtzXSAhPT0gdW5kZWZpbmVkID8gc2VnbWVudFRzLnBmVmFsdWVbc10gOiBsYXN0UmFkaXVzVHlwZSkgPT09ICdhcmMtcmFkaXVzJyk7XG4gIH1cbn07XG5CUnAkYy5maW5kTG9vcFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbywgaSwgZWRnZUlzVW5idW5kbGVkKSB7XG4gIC8vIFNlbGYtZWRnZVxuXG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBkaXJDb3VudHMgPSBwYWlySW5mby5kaXJDb3VudHMsXG4gICAgc3JjUG9zID0gcGFpckluZm8uc3JjUG9zO1xuICB2YXIgY3RybHB0RGlzdHMgPSBlZGdlLnBzdHlsZSgnY29udHJvbC1wb2ludC1kaXN0YW5jZXMnKTtcbiAgdmFyIGN0cmxwdERpc3QgPSBjdHJscHREaXN0cyA/IGN0cmxwdERpc3RzLnBmVmFsdWVbMF0gOiB1bmRlZmluZWQ7XG4gIHZhciBsb29wRGlyID0gZWRnZS5wc3R5bGUoJ2xvb3AtZGlyZWN0aW9uJykucGZWYWx1ZTtcbiAgdmFyIGxvb3BTd3AgPSBlZGdlLnBzdHlsZSgnbG9vcC1zd2VlcCcpLnBmVmFsdWU7XG4gIHZhciBzdGVwU2l6ZSA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LXN0ZXAtc2l6ZScpLnBmVmFsdWU7XG4gIHJzLmVkZ2VUeXBlID0gJ3NlbGYnO1xuICB2YXIgaiA9IGk7XG4gIHZhciBsb29wRGlzdCA9IHN0ZXBTaXplO1xuICBpZiAoZWRnZUlzVW5idW5kbGVkKSB7XG4gICAgaiA9IDA7XG4gICAgbG9vcERpc3QgPSBjdHJscHREaXN0O1xuICB9XG4gIHZhciBsb29wQW5nbGUgPSBsb29wRGlyIC0gTWF0aC5QSSAvIDI7XG4gIHZhciBvdXRBbmdsZSA9IGxvb3BBbmdsZSAtIGxvb3BTd3AgLyAyO1xuICB2YXIgaW5BbmdsZSA9IGxvb3BBbmdsZSArIGxvb3BTd3AgLyAyO1xuXG4gIC8vIGluY3JlYXNlIGJ5IHN0ZXAgc2l6ZSBmb3Igb3ZlcmxhcHBpbmcgbG9vcHMsIGtleWVkIG9uIGRpcmVjdGlvbiBhbmQgc3dlZXAgdmFsdWVzXG4gIHZhciBkYyA9IFN0cmluZyhsb29wRGlyICsgJ18nICsgbG9vcFN3cCk7XG4gIGogPSBkaXJDb3VudHNbZGNdID09PSB1bmRlZmluZWQgPyBkaXJDb3VudHNbZGNdID0gMCA6ICsrZGlyQ291bnRzW2RjXTtcbiAgcnMuY3RybHB0cyA9IFtzcmNQb3MueCArIE1hdGguY29zKG91dEFuZ2xlKSAqIDEuNCAqIGxvb3BEaXN0ICogKGogLyAzICsgMSksIHNyY1Bvcy55ICsgTWF0aC5zaW4ob3V0QW5nbGUpICogMS40ICogbG9vcERpc3QgKiAoaiAvIDMgKyAxKSwgc3JjUG9zLnggKyBNYXRoLmNvcyhpbkFuZ2xlKSAqIDEuNCAqIGxvb3BEaXN0ICogKGogLyAzICsgMSksIHNyY1Bvcy55ICsgTWF0aC5zaW4oaW5BbmdsZSkgKiAxLjQgKiBsb29wRGlzdCAqIChqIC8gMyArIDEpXTtcbn07XG5CUnAkYy5maW5kQ29tcG91bmRMb29wUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UsIHBhaXJJbmZvLCBpLCBlZGdlSXNVbmJ1bmRsZWQpIHtcbiAgLy8gQ29tcG91bmQgZWRnZVxuXG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHJzLmVkZ2VUeXBlID0gJ2NvbXBvdW5kJztcbiAgdmFyIHNyY1BvcyA9IHBhaXJJbmZvLnNyY1BvcyxcbiAgICB0Z3RQb3MgPSBwYWlySW5mby50Z3RQb3MsXG4gICAgc3JjVyA9IHBhaXJJbmZvLnNyY1csXG4gICAgc3JjSCA9IHBhaXJJbmZvLnNyY0gsXG4gICAgdGd0VyA9IHBhaXJJbmZvLnRndFcsXG4gICAgdGd0SCA9IHBhaXJJbmZvLnRndEg7XG4gIHZhciBzdGVwU2l6ZSA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LXN0ZXAtc2l6ZScpLnBmVmFsdWU7XG4gIHZhciBjdHJscHREaXN0cyA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LWRpc3RhbmNlcycpO1xuICB2YXIgY3RybHB0RGlzdCA9IGN0cmxwdERpc3RzID8gY3RybHB0RGlzdHMucGZWYWx1ZVswXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGogPSBpO1xuICB2YXIgbG9vcERpc3QgPSBzdGVwU2l6ZTtcbiAgaWYgKGVkZ2VJc1VuYnVuZGxlZCkge1xuICAgIGogPSAwO1xuICAgIGxvb3BEaXN0ID0gY3RybHB0RGlzdDtcbiAgfVxuICB2YXIgbG9vcFcgPSA1MDtcbiAgdmFyIGxvb3BhUG9zID0ge1xuICAgIHg6IHNyY1Bvcy54IC0gc3JjVyAvIDIsXG4gICAgeTogc3JjUG9zLnkgLSBzcmNIIC8gMlxuICB9O1xuICB2YXIgbG9vcGJQb3MgPSB7XG4gICAgeDogdGd0UG9zLnggLSB0Z3RXIC8gMixcbiAgICB5OiB0Z3RQb3MueSAtIHRndEggLyAyXG4gIH07XG4gIHZhciBsb29wUG9zID0ge1xuICAgIHg6IE1hdGgubWluKGxvb3BhUG9zLngsIGxvb3BiUG9zLngpLFxuICAgIHk6IE1hdGgubWluKGxvb3BhUG9zLnksIGxvb3BiUG9zLnkpXG4gIH07XG5cbiAgLy8gYXZvaWRzIGNhc2VzIHdpdGggaW1wb3NzaWJsZSBiZXppZXJzXG4gIHZhciBtaW5Db21wb3VuZFN0cmV0Y2ggPSAwLjU7XG4gIHZhciBjb21wb3VuZFN0cmV0Y2hBID0gTWF0aC5tYXgobWluQ29tcG91bmRTdHJldGNoLCBNYXRoLmxvZyhzcmNXICogMC4wMSkpO1xuICB2YXIgY29tcG91bmRTdHJldGNoQiA9IE1hdGgubWF4KG1pbkNvbXBvdW5kU3RyZXRjaCwgTWF0aC5sb2codGd0VyAqIDAuMDEpKTtcbiAgcnMuY3RybHB0cyA9IFtsb29wUG9zLngsIGxvb3BQb3MueSAtICgxICsgTWF0aC5wb3cobG9vcFcsIDEuMTIpIC8gMTAwKSAqIGxvb3BEaXN0ICogKGogLyAzICsgMSkgKiBjb21wb3VuZFN0cmV0Y2hBLCBsb29wUG9zLnggLSAoMSArIE1hdGgucG93KGxvb3BXLCAxLjEyKSAvIDEwMCkgKiBsb29wRGlzdCAqIChqIC8gMyArIDEpICogY29tcG91bmRTdHJldGNoQiwgbG9vcFBvcy55XTtcbn07XG5CUnAkYy5maW5kU3RyYWlnaHRFZGdlUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgLy8gU3RyYWlnaHQgZWRnZSB3aXRoaW4gYnVuZGxlXG5cbiAgZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaC5lZGdlVHlwZSA9ICdzdHJhaWdodCc7XG59O1xuQlJwJGMuZmluZEJlemllclBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbywgaSwgZWRnZUlzVW5idW5kbGVkLCBlZGdlSXNTd2FwcGVkKSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBzdGVwU2l6ZSA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LXN0ZXAtc2l6ZScpLnBmVmFsdWU7XG4gIHZhciBjdHJscHREaXN0cyA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LWRpc3RhbmNlcycpO1xuICB2YXIgY3RybHB0V3MgPSBlZGdlLnBzdHlsZSgnY29udHJvbC1wb2ludC13ZWlnaHRzJyk7XG4gIHZhciBiZXppZXJOID0gY3RybHB0RGlzdHMgJiYgY3RybHB0V3MgPyBNYXRoLm1pbihjdHJscHREaXN0cy52YWx1ZS5sZW5ndGgsIGN0cmxwdFdzLnZhbHVlLmxlbmd0aCkgOiAxO1xuICB2YXIgY3RybHB0RGlzdCA9IGN0cmxwdERpc3RzID8gY3RybHB0RGlzdHMucGZWYWx1ZVswXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGN0cmxwdFdlaWdodCA9IGN0cmxwdFdzLnZhbHVlWzBdO1xuXG4gIC8vIChNdWx0aSliZXppZXJcblxuICB2YXIgbXVsdGkgPSBlZGdlSXNVbmJ1bmRsZWQ7XG4gIHJzLmVkZ2VUeXBlID0gbXVsdGkgPyAnbXVsdGliZXppZXInIDogJ2Jlemllcic7XG4gIHJzLmN0cmxwdHMgPSBbXTtcbiAgZm9yICh2YXIgYiA9IDA7IGIgPCBiZXppZXJOOyBiKyspIHtcbiAgICB2YXIgbm9ybWN0cmxwdERpc3QgPSAoMC41IC0gcGFpckluZm8uZWxlcy5sZW5ndGggLyAyICsgaSkgKiBzdGVwU2l6ZSAqIChlZGdlSXNTd2FwcGVkID8gLTEgOiAxKTtcbiAgICB2YXIgbWFuY3RybHB0RGlzdCA9IHZvaWQgMDtcbiAgICB2YXIgc2lnbiA9IHNpZ251bShub3JtY3RybHB0RGlzdCk7XG4gICAgaWYgKG11bHRpKSB7XG4gICAgICBjdHJscHREaXN0ID0gY3RybHB0RGlzdHMgPyBjdHJscHREaXN0cy5wZlZhbHVlW2JdIDogc3RlcFNpemU7IC8vIGZhbGwgYmFjayBvbiBzdGVwIHNpemVcbiAgICAgIGN0cmxwdFdlaWdodCA9IGN0cmxwdFdzLnZhbHVlW2JdO1xuICAgIH1cbiAgICBpZiAoZWRnZUlzVW5idW5kbGVkKSB7XG4gICAgICAvLyBtdWx0aSBvciBzaW5nbGUgdW5idW5kbGVkXG4gICAgICBtYW5jdHJscHREaXN0ID0gY3RybHB0RGlzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFuY3RybHB0RGlzdCA9IGN0cmxwdERpc3QgIT09IHVuZGVmaW5lZCA/IHNpZ24gKiBjdHJscHREaXN0IDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YXIgZGlzdGFuY2VGcm9tTWlkcG9pbnQgPSBtYW5jdHJscHREaXN0ICE9PSB1bmRlZmluZWQgPyBtYW5jdHJscHREaXN0IDogbm9ybWN0cmxwdERpc3Q7XG4gICAgdmFyIHcxID0gMSAtIGN0cmxwdFdlaWdodDtcbiAgICB2YXIgdzIgPSBjdHJscHRXZWlnaHQ7XG4gICAgdmFyIF90aGlzJGZpbmRNaWRwdFB0c0V0YzIgPSB0aGlzLmZpbmRNaWRwdFB0c0V0YyhlZGdlLCBwYWlySW5mbyksXG4gICAgICBtaWRwdFB0cyA9IF90aGlzJGZpbmRNaWRwdFB0c0V0YzIubWlkcHRQdHMsXG4gICAgICB2ZWN0b3JOb3JtSW52ZXJzZSA9IF90aGlzJGZpbmRNaWRwdFB0c0V0YzIudmVjdG9yTm9ybUludmVyc2U7XG4gICAgdmFyIGFkanVzdGVkTWlkcHQgPSB7XG4gICAgICB4OiBtaWRwdFB0cy54MSAqIHcxICsgbWlkcHRQdHMueDIgKiB3MixcbiAgICAgIHk6IG1pZHB0UHRzLnkxICogdzEgKyBtaWRwdFB0cy55MiAqIHcyXG4gICAgfTtcbiAgICBycy5jdHJscHRzLnB1c2goYWRqdXN0ZWRNaWRwdC54ICsgdmVjdG9yTm9ybUludmVyc2UueCAqIGRpc3RhbmNlRnJvbU1pZHBvaW50LCBhZGp1c3RlZE1pZHB0LnkgKyB2ZWN0b3JOb3JtSW52ZXJzZS55ICogZGlzdGFuY2VGcm9tTWlkcG9pbnQpO1xuICB9XG59O1xuQlJwJGMuZmluZFRheGlQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSwgcGFpckluZm8pIHtcbiAgLy8gVGF4aWNhYiBnZW9tZXRyeSB3aXRoIHR3byB0dXJucyBtYXhpbXVtXG5cbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgcnMuZWRnZVR5cGUgPSAnc2VnbWVudHMnO1xuICB2YXIgVkVSVElDQUwgPSAndmVydGljYWwnO1xuICB2YXIgSE9SSVpPTlRBTCA9ICdob3Jpem9udGFsJztcbiAgdmFyIExFRlRXQVJEID0gJ2xlZnR3YXJkJztcbiAgdmFyIFJJR0hUV0FSRCA9ICdyaWdodHdhcmQnO1xuICB2YXIgRE9XTldBUkQgPSAnZG93bndhcmQnO1xuICB2YXIgVVBXQVJEID0gJ3Vwd2FyZCc7XG4gIHZhciBBVVRPID0gJ2F1dG8nO1xuICB2YXIgcG9zUHRzID0gcGFpckluZm8ucG9zUHRzLFxuICAgIHNyY1cgPSBwYWlySW5mby5zcmNXLFxuICAgIHNyY0ggPSBwYWlySW5mby5zcmNILFxuICAgIHRndFcgPSBwYWlySW5mby50Z3RXLFxuICAgIHRndEggPSBwYWlySW5mby50Z3RIO1xuICB2YXIgZWRnZURpc3RhbmNlcyA9IGVkZ2UucHN0eWxlKCdlZGdlLWRpc3RhbmNlcycpLnZhbHVlO1xuICB2YXIgZEluY2x1ZGVzTm9kZUJvZHkgPSBlZGdlRGlzdGFuY2VzICE9PSAnbm9kZS1wb3NpdGlvbic7XG4gIHZhciB0YXhpRGlyID0gZWRnZS5wc3R5bGUoJ3RheGktZGlyZWN0aW9uJykudmFsdWU7XG4gIHZhciByYXdUYXhpRGlyID0gdGF4aURpcjsgLy8gdW5wcm9jZXNzZWQgdmFsdWVcbiAgdmFyIHRheGlUdXJuID0gZWRnZS5wc3R5bGUoJ3RheGktdHVybicpO1xuICB2YXIgdHVybklzUGVyY2VudCA9IHRheGlUdXJuLnVuaXRzID09PSAnJSc7XG4gIHZhciB0YXhpVHVyblBmVmFsID0gdGF4aVR1cm4ucGZWYWx1ZTtcbiAgdmFyIHR1cm5Jc05lZ2F0aXZlID0gdGF4aVR1cm5QZlZhbCA8IDA7IC8vIGkuZS4gZnJvbSB0YXJnZXQgc2lkZVxuICB2YXIgbWluRCA9IGVkZ2UucHN0eWxlKCd0YXhpLXR1cm4tbWluLWRpc3RhbmNlJykucGZWYWx1ZTtcbiAgdmFyIGR3ID0gZEluY2x1ZGVzTm9kZUJvZHkgPyAoc3JjVyArIHRndFcpIC8gMiA6IDA7XG4gIHZhciBkaCA9IGRJbmNsdWRlc05vZGVCb2R5ID8gKHNyY0ggKyB0Z3RIKSAvIDIgOiAwO1xuICB2YXIgcGR4ID0gcG9zUHRzLngyIC0gcG9zUHRzLngxO1xuICB2YXIgcGR5ID0gcG9zUHRzLnkyIC0gcG9zUHRzLnkxO1xuXG4gIC8vIHRha2UgYXdheSB0aGUgZWZmZWN0aXZlIHcvaCBmcm9tIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGRlbHRhIHZhbHVlXG4gIHZhciBzdWJEV0ggPSBmdW5jdGlvbiBzdWJEV0goZHh5LCBkd2gpIHtcbiAgICBpZiAoZHh5ID4gMCkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KGR4eSAtIGR3aCwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbihkeHkgKyBkd2gsIDApO1xuICAgIH1cbiAgfTtcbiAgdmFyIGR4ID0gc3ViRFdIKHBkeCwgZHcpO1xuICB2YXIgZHkgPSBzdWJEV0gocGR5LCBkaCk7XG4gIHZhciBpc0V4cGxpY2l0RGlyID0gZmFsc2U7XG4gIGlmIChyYXdUYXhpRGlyID09PSBBVVRPKSB7XG4gICAgdGF4aURpciA9IE1hdGguYWJzKGR4KSA+IE1hdGguYWJzKGR5KSA/IEhPUklaT05UQUwgOiBWRVJUSUNBTDtcbiAgfSBlbHNlIGlmIChyYXdUYXhpRGlyID09PSBVUFdBUkQgfHwgcmF3VGF4aURpciA9PT0gRE9XTldBUkQpIHtcbiAgICB0YXhpRGlyID0gVkVSVElDQUw7XG4gICAgaXNFeHBsaWNpdERpciA9IHRydWU7XG4gIH0gZWxzZSBpZiAocmF3VGF4aURpciA9PT0gTEVGVFdBUkQgfHwgcmF3VGF4aURpciA9PT0gUklHSFRXQVJEKSB7XG4gICAgdGF4aURpciA9IEhPUklaT05UQUw7XG4gICAgaXNFeHBsaWNpdERpciA9IHRydWU7XG4gIH1cbiAgdmFyIGlzVmVydCA9IHRheGlEaXIgPT09IFZFUlRJQ0FMO1xuICB2YXIgbCA9IGlzVmVydCA/IGR5IDogZHg7XG4gIHZhciBwbCA9IGlzVmVydCA/IHBkeSA6IHBkeDtcbiAgdmFyIHNnbkwgPSBzaWdudW0ocGwpO1xuICB2YXIgZm9yY2VkRGlyID0gZmFsc2U7XG4gIGlmICghKGlzRXhwbGljaXREaXIgJiYgKHR1cm5Jc1BlcmNlbnQgfHwgdHVybklzTmVnYXRpdmUpKSAvLyBmb3JjaW5nIGluIHRoaXMgY2FzZSB3b3VsZCBjYXVzZSB3ZWlyZCBncm93aW5nIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb25cbiAgJiYgKHJhd1RheGlEaXIgPT09IERPV05XQVJEICYmIHBsIDwgMCB8fCByYXdUYXhpRGlyID09PSBVUFdBUkQgJiYgcGwgPiAwIHx8IHJhd1RheGlEaXIgPT09IExFRlRXQVJEICYmIHBsID4gMCB8fCByYXdUYXhpRGlyID09PSBSSUdIVFdBUkQgJiYgcGwgPCAwKSkge1xuICAgIHNnbkwgKj0gLTE7XG4gICAgbCA9IHNnbkwgKiBNYXRoLmFicyhsKTtcbiAgICBmb3JjZWREaXIgPSB0cnVlO1xuICB9XG4gIHZhciBkO1xuICBpZiAodHVybklzUGVyY2VudCkge1xuICAgIHZhciBwID0gdGF4aVR1cm5QZlZhbCA8IDAgPyAxICsgdGF4aVR1cm5QZlZhbCA6IHRheGlUdXJuUGZWYWw7XG4gICAgZCA9IHAgKiBsO1xuICB9IGVsc2Uge1xuICAgIHZhciBrID0gdGF4aVR1cm5QZlZhbCA8IDAgPyBsIDogMDtcbiAgICBkID0gayArIHRheGlUdXJuUGZWYWwgKiBzZ25MO1xuICB9XG4gIHZhciBnZXRJc1Rvb0Nsb3NlID0gZnVuY3Rpb24gZ2V0SXNUb29DbG9zZShkKSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKGQpIDwgbWluRCB8fCBNYXRoLmFicyhkKSA+PSBNYXRoLmFicyhsKTtcbiAgfTtcbiAgdmFyIGlzVG9vQ2xvc2VTcmMgPSBnZXRJc1Rvb0Nsb3NlKGQpO1xuICB2YXIgaXNUb29DbG9zZVRndCA9IGdldElzVG9vQ2xvc2UoTWF0aC5hYnMobCkgLSBNYXRoLmFicyhkKSk7XG4gIHZhciBpc1Rvb0Nsb3NlID0gaXNUb29DbG9zZVNyYyB8fCBpc1Rvb0Nsb3NlVGd0O1xuICBpZiAoaXNUb29DbG9zZSAmJiAhZm9yY2VkRGlyKSB7XG4gICAgLy8gbm9uLWlkZWFsIHJvdXRpbmdcbiAgICBpZiAoaXNWZXJ0KSB7XG4gICAgICAvLyB2ZXJ0aWNhbCBmYWxsYmFja3NcbiAgICAgIHZhciBsU2hhcGVJbnNpZGVTcmMgPSBNYXRoLmFicyhwbCkgPD0gc3JjSCAvIDI7XG4gICAgICB2YXIgbFNoYXBlSW5zaWRlVGd0ID0gTWF0aC5hYnMocGR4KSA8PSB0Z3RXIC8gMjtcbiAgICAgIGlmIChsU2hhcGVJbnNpZGVTcmMpIHtcbiAgICAgICAgLy8gaG9yaXpvbnRhbCBaLXNoYXBlIChkaXJlY3Rpb24gbm90IHJlc3BlY3RlZClcbiAgICAgICAgdmFyIHggPSAocG9zUHRzLngxICsgcG9zUHRzLngyKSAvIDI7XG4gICAgICAgIHZhciB5MSA9IHBvc1B0cy55MSxcbiAgICAgICAgICB5MiA9IHBvc1B0cy55MjtcbiAgICAgICAgcnMuc2VncHRzID0gW3gsIHkxLCB4LCB5Ml07XG4gICAgICB9IGVsc2UgaWYgKGxTaGFwZUluc2lkZVRndCkge1xuICAgICAgICAvLyB2ZXJ0aWNhbCBaLXNoYXBlIChkaXN0YW5jZSBub3QgcmVzcGVjdGVkKVxuICAgICAgICB2YXIgeSA9IChwb3NQdHMueTEgKyBwb3NQdHMueTIpIC8gMjtcbiAgICAgICAgdmFyIHgxID0gcG9zUHRzLngxLFxuICAgICAgICAgIHgyID0gcG9zUHRzLngyO1xuICAgICAgICBycy5zZWdwdHMgPSBbeDEsIHksIHgyLCB5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEwtc2hhcGUgZmFsbGJhY2sgKHR1cm4gZGlzdGFuY2Ugbm90IHJlc3BlY3RlZCwgYnV0IHdvcmtzIHdlbGwgd2l0aCB0cmVlIHNpYmxpbmdzKVxuICAgICAgICBycy5zZWdwdHMgPSBbcG9zUHRzLngxLCBwb3NQdHMueTJdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBob3Jpem9udGFsIGZhbGxiYWNrc1xuICAgICAgdmFyIF9sU2hhcGVJbnNpZGVTcmMgPSBNYXRoLmFicyhwbCkgPD0gc3JjVyAvIDI7XG4gICAgICB2YXIgX2xTaGFwZUluc2lkZVRndCA9IE1hdGguYWJzKHBkeSkgPD0gdGd0SCAvIDI7XG4gICAgICBpZiAoX2xTaGFwZUluc2lkZVNyYykge1xuICAgICAgICAvLyB2ZXJ0aWNhbCBaLXNoYXBlIChkaXJlY3Rpb24gbm90IHJlc3BlY3RlZClcbiAgICAgICAgdmFyIF95ID0gKHBvc1B0cy55MSArIHBvc1B0cy55MikgLyAyO1xuICAgICAgICB2YXIgX3ggPSBwb3NQdHMueDEsXG4gICAgICAgICAgX3gyID0gcG9zUHRzLngyO1xuICAgICAgICBycy5zZWdwdHMgPSBbX3gsIF95LCBfeDIsIF95XTtcbiAgICAgIH0gZWxzZSBpZiAoX2xTaGFwZUluc2lkZVRndCkge1xuICAgICAgICAvLyBob3Jpem9udGFsIFotc2hhcGUgKHR1cm4gZGlzdGFuY2Ugbm90IHJlc3BlY3RlZClcbiAgICAgICAgdmFyIF94MyA9IChwb3NQdHMueDEgKyBwb3NQdHMueDIpIC8gMjtcbiAgICAgICAgdmFyIF95MiA9IHBvc1B0cy55MSxcbiAgICAgICAgICBfeTMgPSBwb3NQdHMueTI7XG4gICAgICAgIHJzLnNlZ3B0cyA9IFtfeDMsIF95MiwgX3gzLCBfeTNdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTC1zaGFwZSAodHVybiBkaXN0YW5jZSBub3QgcmVzcGVjdGVkLCBidXQgd29ya3Mgd2VsbCBmb3IgdHJlZSBzaWJsaW5ncylcbiAgICAgICAgcnMuc2VncHRzID0gW3Bvc1B0cy54MiwgcG9zUHRzLnkxXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gaWRlYWwgcm91dGluZ1xuICAgIGlmIChpc1ZlcnQpIHtcbiAgICAgIHZhciBfeTQgPSBwb3NQdHMueTEgKyBkICsgKGRJbmNsdWRlc05vZGVCb2R5ID8gc3JjSCAvIDIgKiBzZ25MIDogMCk7XG4gICAgICB2YXIgX3g0ID0gcG9zUHRzLngxLFxuICAgICAgICBfeDUgPSBwb3NQdHMueDI7XG4gICAgICBycy5zZWdwdHMgPSBbX3g0LCBfeTQsIF94NSwgX3k0XTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaG9yaXpvbnRhbFxuICAgICAgdmFyIF94NiA9IHBvc1B0cy54MSArIGQgKyAoZEluY2x1ZGVzTm9kZUJvZHkgPyBzcmNXIC8gMiAqIHNnbkwgOiAwKTtcbiAgICAgIHZhciBfeTUgPSBwb3NQdHMueTEsXG4gICAgICAgIF95NiA9IHBvc1B0cy55MjtcbiAgICAgIHJzLnNlZ3B0cyA9IFtfeDYsIF95NSwgX3g2LCBfeTZdO1xuICAgIH1cbiAgfVxuICBpZiAocnMuaXNSb3VuZCkge1xuICAgIHZhciByYWRpdXMgPSBlZGdlLnBzdHlsZSgndGF4aS1yYWRpdXMnKS52YWx1ZTtcbiAgICB2YXIgaXNBcmNSYWRpdXMgPSBlZGdlLnBzdHlsZSgncmFkaXVzLXR5cGUnKS52YWx1ZVswXSA9PT0gJ2FyYy1yYWRpdXMnO1xuICAgIHJzLnJhZGlpID0gbmV3IEFycmF5KHJzLnNlZ3B0cy5sZW5ndGggLyAyKS5maWxsKHJhZGl1cyk7XG4gICAgcnMuaXNBcmNSYWRpdXMgPSBuZXcgQXJyYXkocnMuc2VncHRzLmxlbmd0aCAvIDIpLmZpbGwoaXNBcmNSYWRpdXMpO1xuICB9XG59O1xuQlJwJGMudHJ5VG9Db3JyZWN0SW52YWxpZFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbykge1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuXG4gIC8vIGNhbiBvbmx5IGNvcnJlY3QgYmV6aWVycyBmb3Igbm93Li4uXG4gIGlmIChycy5lZGdlVHlwZSA9PT0gJ2JlemllcicpIHtcbiAgICB2YXIgc3JjUG9zID0gcGFpckluZm8uc3JjUG9zLFxuICAgICAgdGd0UG9zID0gcGFpckluZm8udGd0UG9zLFxuICAgICAgc3JjVyA9IHBhaXJJbmZvLnNyY1csXG4gICAgICBzcmNIID0gcGFpckluZm8uc3JjSCxcbiAgICAgIHRndFcgPSBwYWlySW5mby50Z3RXLFxuICAgICAgdGd0SCA9IHBhaXJJbmZvLnRndEgsXG4gICAgICBzcmNTaGFwZSA9IHBhaXJJbmZvLnNyY1NoYXBlLFxuICAgICAgdGd0U2hhcGUgPSBwYWlySW5mby50Z3RTaGFwZSxcbiAgICAgIHNyY0Nvcm5lclJhZGl1cyA9IHBhaXJJbmZvLnNyY0Nvcm5lclJhZGl1cyxcbiAgICAgIHRndENvcm5lclJhZGl1cyA9IHBhaXJJbmZvLnRndENvcm5lclJhZGl1cyxcbiAgICAgIHNyY1JzID0gcGFpckluZm8uc3JjUnMsXG4gICAgICB0Z3RScyA9IHBhaXJJbmZvLnRndFJzO1xuICAgIHZhciBiYWRTdGFydCA9ICFudW1iZXIkMShycy5zdGFydFgpIHx8ICFudW1iZXIkMShycy5zdGFydFkpO1xuICAgIHZhciBiYWRBU3RhcnQgPSAhbnVtYmVyJDEocnMuYXJyb3dTdGFydFgpIHx8ICFudW1iZXIkMShycy5hcnJvd1N0YXJ0WSk7XG4gICAgdmFyIGJhZEVuZCA9ICFudW1iZXIkMShycy5lbmRYKSB8fCAhbnVtYmVyJDEocnMuZW5kWSk7XG4gICAgdmFyIGJhZEFFbmQgPSAhbnVtYmVyJDEocnMuYXJyb3dFbmRYKSB8fCAhbnVtYmVyJDEocnMuYXJyb3dFbmRZKTtcbiAgICB2YXIgbWluQ3BBRGlzdEZhY3RvciA9IDM7XG4gICAgdmFyIGFycm93VyA9IHRoaXMuZ2V0QXJyb3dXaWR0aChlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlLCBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZSkgKiB0aGlzLmFycm93U2hhcGVXaWR0aDtcbiAgICB2YXIgbWluQ3BBRGlzdCA9IG1pbkNwQURpc3RGYWN0b3IgKiBhcnJvd1c7XG4gICAgdmFyIHN0YXJ0QUNwRGlzdCA9IGRpc3Qoe1xuICAgICAgeDogcnMuY3RybHB0c1swXSxcbiAgICAgIHk6IHJzLmN0cmxwdHNbMV1cbiAgICB9LCB7XG4gICAgICB4OiBycy5zdGFydFgsXG4gICAgICB5OiBycy5zdGFydFlcbiAgICB9KTtcbiAgICB2YXIgY2xvc2VTdGFydEFDcCA9IHN0YXJ0QUNwRGlzdCA8IG1pbkNwQURpc3Q7XG4gICAgdmFyIGVuZEFDcERpc3QgPSBkaXN0KHtcbiAgICAgIHg6IHJzLmN0cmxwdHNbMF0sXG4gICAgICB5OiBycy5jdHJscHRzWzFdXG4gICAgfSwge1xuICAgICAgeDogcnMuZW5kWCxcbiAgICAgIHk6IHJzLmVuZFlcbiAgICB9KTtcbiAgICB2YXIgY2xvc2VFbmRBQ3AgPSBlbmRBQ3BEaXN0IDwgbWluQ3BBRGlzdDtcbiAgICB2YXIgb3ZlcmxhcHBpbmcgPSBmYWxzZTtcbiAgICBpZiAoYmFkU3RhcnQgfHwgYmFkQVN0YXJ0IHx8IGNsb3NlU3RhcnRBQ3ApIHtcbiAgICAgIG92ZXJsYXBwaW5nID0gdHJ1ZTtcblxuICAgICAgLy8gcHJvamVjdCBjb250cm9sIHBvaW50IGFsb25nIGxpbmUgZnJvbSBzcmMgY2VudHJlIHRvIG91dHNpZGUgdGhlIHNyYyBzaGFwZVxuICAgICAgLy8gKG90aGVyd2lzZSBpbnRlcnNlY3Rpb24gd2lsbCB5aWVsZCBub3RoaW5nKVxuICAgICAgdmFyIGNwRCA9IHtcbiAgICAgICAgLy8gZGVsdGFcbiAgICAgICAgeDogcnMuY3RybHB0c1swXSAtIHNyY1Bvcy54LFxuICAgICAgICB5OiBycy5jdHJscHRzWzFdIC0gc3JjUG9zLnlcbiAgICAgIH07XG4gICAgICB2YXIgY3BMID0gTWF0aC5zcXJ0KGNwRC54ICogY3BELnggKyBjcEQueSAqIGNwRC55KTsgLy8gbGVuZ3RoIG9mIGxpbmVcbiAgICAgIHZhciBjcE0gPSB7XG4gICAgICAgIC8vIG5vcm1hbGlzZWQgZGVsdGFcbiAgICAgICAgeDogY3BELnggLyBjcEwsXG4gICAgICAgIHk6IGNwRC55IC8gY3BMXG4gICAgICB9O1xuICAgICAgdmFyIHJhZGl1cyA9IE1hdGgubWF4KHNyY1csIHNyY0gpO1xuICAgICAgdmFyIGNwUHJvaiA9IHtcbiAgICAgICAgLy8gKjIgcmFkaXVzIGd1YXJhbnRlZXMgb3V0c2lkZSBzaGFwZVxuICAgICAgICB4OiBycy5jdHJscHRzWzBdICsgY3BNLnggKiAyICogcmFkaXVzLFxuICAgICAgICB5OiBycy5jdHJscHRzWzFdICsgY3BNLnkgKiAyICogcmFkaXVzXG4gICAgICB9O1xuICAgICAgdmFyIHNyY0N0cmxQdEludG4gPSBzcmNTaGFwZS5pbnRlcnNlY3RMaW5lKHNyY1Bvcy54LCBzcmNQb3MueSwgc3JjVywgc3JjSCwgY3BQcm9qLngsIGNwUHJvai55LCAwLCBzcmNDb3JuZXJSYWRpdXMsIHNyY1JzKTtcbiAgICAgIGlmIChjbG9zZVN0YXJ0QUNwKSB7XG4gICAgICAgIHJzLmN0cmxwdHNbMF0gPSBycy5jdHJscHRzWzBdICsgY3BNLnggKiAobWluQ3BBRGlzdCAtIHN0YXJ0QUNwRGlzdCk7XG4gICAgICAgIHJzLmN0cmxwdHNbMV0gPSBycy5jdHJscHRzWzFdICsgY3BNLnkgKiAobWluQ3BBRGlzdCAtIHN0YXJ0QUNwRGlzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBycy5jdHJscHRzWzBdID0gc3JjQ3RybFB0SW50blswXSArIGNwTS54ICogbWluQ3BBRGlzdDtcbiAgICAgICAgcnMuY3RybHB0c1sxXSA9IHNyY0N0cmxQdEludG5bMV0gKyBjcE0ueSAqIG1pbkNwQURpc3Q7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChiYWRFbmQgfHwgYmFkQUVuZCB8fCBjbG9zZUVuZEFDcCkge1xuICAgICAgb3ZlcmxhcHBpbmcgPSB0cnVlO1xuXG4gICAgICAvLyBwcm9qZWN0IGNvbnRyb2wgcG9pbnQgYWxvbmcgbGluZSBmcm9tIHRndCBjZW50cmUgdG8gb3V0c2lkZSB0aGUgdGd0IHNoYXBlXG4gICAgICAvLyAob3RoZXJ3aXNlIGludGVyc2VjdGlvbiB3aWxsIHlpZWxkIG5vdGhpbmcpXG4gICAgICB2YXIgX2NwRCA9IHtcbiAgICAgICAgLy8gZGVsdGFcbiAgICAgICAgeDogcnMuY3RybHB0c1swXSAtIHRndFBvcy54LFxuICAgICAgICB5OiBycy5jdHJscHRzWzFdIC0gdGd0UG9zLnlcbiAgICAgIH07XG4gICAgICB2YXIgX2NwTCA9IE1hdGguc3FydChfY3BELnggKiBfY3BELnggKyBfY3BELnkgKiBfY3BELnkpOyAvLyBsZW5ndGggb2YgbGluZVxuICAgICAgdmFyIF9jcE0gPSB7XG4gICAgICAgIC8vIG5vcm1hbGlzZWQgZGVsdGFcbiAgICAgICAgeDogX2NwRC54IC8gX2NwTCxcbiAgICAgICAgeTogX2NwRC55IC8gX2NwTFxuICAgICAgfTtcbiAgICAgIHZhciBfcmFkaXVzID0gTWF0aC5tYXgoc3JjVywgc3JjSCk7XG4gICAgICB2YXIgX2NwUHJvaiA9IHtcbiAgICAgICAgLy8gKjIgcmFkaXVzIGd1YXJhbnRlZXMgb3V0c2lkZSBzaGFwZVxuICAgICAgICB4OiBycy5jdHJscHRzWzBdICsgX2NwTS54ICogMiAqIF9yYWRpdXMsXG4gICAgICAgIHk6IHJzLmN0cmxwdHNbMV0gKyBfY3BNLnkgKiAyICogX3JhZGl1c1xuICAgICAgfTtcbiAgICAgIHZhciB0Z3RDdHJsUHRJbnRuID0gdGd0U2hhcGUuaW50ZXJzZWN0TGluZSh0Z3RQb3MueCwgdGd0UG9zLnksIHRndFcsIHRndEgsIF9jcFByb2oueCwgX2NwUHJvai55LCAwLCB0Z3RDb3JuZXJSYWRpdXMsIHRndFJzKTtcbiAgICAgIGlmIChjbG9zZUVuZEFDcCkge1xuICAgICAgICBycy5jdHJscHRzWzBdID0gcnMuY3RybHB0c1swXSArIF9jcE0ueCAqIChtaW5DcEFEaXN0IC0gZW5kQUNwRGlzdCk7XG4gICAgICAgIHJzLmN0cmxwdHNbMV0gPSBycy5jdHJscHRzWzFdICsgX2NwTS55ICogKG1pbkNwQURpc3QgLSBlbmRBQ3BEaXN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJzLmN0cmxwdHNbMF0gPSB0Z3RDdHJsUHRJbnRuWzBdICsgX2NwTS54ICogbWluQ3BBRGlzdDtcbiAgICAgICAgcnMuY3RybHB0c1sxXSA9IHRndEN0cmxQdEludG5bMV0gKyBfY3BNLnkgKiBtaW5DcEFEaXN0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3ZlcmxhcHBpbmcpIHtcbiAgICAgIC8vIHJlY2FsYyBlbmRwdHNcbiAgICAgIHRoaXMuZmluZEVuZHBvaW50cyhlZGdlKTtcbiAgICB9XG4gIH1cbn07XG5CUnAkYy5zdG9yZUFsbHB0cyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIGlmIChycy5lZGdlVHlwZSA9PT0gJ211bHRpYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ2JlemllcicgfHwgcnMuZWRnZVR5cGUgPT09ICdzZWxmJyB8fCBycy5lZGdlVHlwZSA9PT0gJ2NvbXBvdW5kJykge1xuICAgIHJzLmFsbHB0cyA9IFtdO1xuICAgIHJzLmFsbHB0cy5wdXNoKHJzLnN0YXJ0WCwgcnMuc3RhcnRZKTtcbiAgICBmb3IgKHZhciBiID0gMDsgYiArIDEgPCBycy5jdHJscHRzLmxlbmd0aDsgYiArPSAyKSB7XG4gICAgICAvLyBjdHJsIHB0IGl0c2VsZlxuICAgICAgcnMuYWxscHRzLnB1c2gocnMuY3RybHB0c1tiXSwgcnMuY3RybHB0c1tiICsgMV0pO1xuXG4gICAgICAvLyB0aGUgbWlkcHQgYmV0d2VlbiBjdHJscHRzIGFzIGludGVybWVkaWF0ZSBkZXN0aW5hdGlvbiBwdHNcbiAgICAgIGlmIChiICsgMyA8IHJzLmN0cmxwdHMubGVuZ3RoKSB7XG4gICAgICAgIHJzLmFsbHB0cy5wdXNoKChycy5jdHJscHRzW2JdICsgcnMuY3RybHB0c1tiICsgMl0pIC8gMiwgKHJzLmN0cmxwdHNbYiArIDFdICsgcnMuY3RybHB0c1tiICsgM10pIC8gMik7XG4gICAgICB9XG4gICAgfVxuICAgIHJzLmFsbHB0cy5wdXNoKHJzLmVuZFgsIHJzLmVuZFkpO1xuICAgIHZhciBtLCBtdDtcbiAgICBpZiAocnMuY3RybHB0cy5sZW5ndGggLyAyICUgMiA9PT0gMCkge1xuICAgICAgbSA9IHJzLmFsbHB0cy5sZW5ndGggLyAyIC0gMTtcbiAgICAgIHJzLm1pZFggPSBycy5hbGxwdHNbbV07XG4gICAgICBycy5taWRZID0gcnMuYWxscHRzW20gKyAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHJzLmFsbHB0cy5sZW5ndGggLyAyIC0gMztcbiAgICAgIG10ID0gMC41O1xuICAgICAgcnMubWlkWCA9IHFiZXppZXJBdChycy5hbGxwdHNbbV0sIHJzLmFsbHB0c1ttICsgMl0sIHJzLmFsbHB0c1ttICsgNF0sIG10KTtcbiAgICAgIHJzLm1pZFkgPSBxYmV6aWVyQXQocnMuYWxscHRzW20gKyAxXSwgcnMuYWxscHRzW20gKyAzXSwgcnMuYWxscHRzW20gKyA1XSwgbXQpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChycy5lZGdlVHlwZSA9PT0gJ3N0cmFpZ2h0Jykge1xuICAgIC8vIG5lZWQgdG8gY2FsYyB0aGVzZSBhZnRlciBlbmRwdHNcbiAgICBycy5hbGxwdHMgPSBbcnMuc3RhcnRYLCBycy5zdGFydFksIHJzLmVuZFgsIHJzLmVuZFldO1xuXG4gICAgLy8gZGVmYXVsdCBtaWRwdCBmb3IgbGFiZWxzIGV0Y1xuICAgIHJzLm1pZFggPSAocnMuc3RhcnRYICsgcnMuZW5kWCArIHJzLmFycm93U3RhcnRYICsgcnMuYXJyb3dFbmRYKSAvIDQ7XG4gICAgcnMubWlkWSA9IChycy5zdGFydFkgKyBycy5lbmRZICsgcnMuYXJyb3dTdGFydFkgKyBycy5hcnJvd0VuZFkpIC8gNDtcbiAgfSBlbHNlIGlmIChycy5lZGdlVHlwZSA9PT0gJ3NlZ21lbnRzJykge1xuICAgIHJzLmFsbHB0cyA9IFtdO1xuICAgIHJzLmFsbHB0cy5wdXNoKHJzLnN0YXJ0WCwgcnMuc3RhcnRZKTtcbiAgICBycy5hbGxwdHMucHVzaC5hcHBseShycy5hbGxwdHMsIHJzLnNlZ3B0cyk7XG4gICAgcnMuYWxscHRzLnB1c2gocnMuZW5kWCwgcnMuZW5kWSk7XG4gICAgaWYgKHJzLmlzUm91bmQpIHtcbiAgICAgIHJzLnJvdW5kQ29ybmVycyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDI7IGkgKyAzIDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHZhciByYWRpdXMgPSBycy5yYWRpaVtpIC8gMiAtIDFdO1xuICAgICAgICB2YXIgaXNBcmNSYWRpdXMgPSBycy5pc0FyY1JhZGl1c1tpIC8gMiAtIDFdO1xuICAgICAgICBycy5yb3VuZENvcm5lcnMucHVzaChnZXRSb3VuZENvcm5lcih7XG4gICAgICAgICAgeDogcnMuYWxscHRzW2kgLSAyXSxcbiAgICAgICAgICB5OiBycy5hbGxwdHNbaSAtIDFdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBycy5hbGxwdHNbaV0sXG4gICAgICAgICAgeTogcnMuYWxscHRzW2kgKyAxXSxcbiAgICAgICAgICByYWRpdXM6IHJhZGl1c1xuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcnMuYWxscHRzW2kgKyAyXSxcbiAgICAgICAgICB5OiBycy5hbGxwdHNbaSArIDNdXG4gICAgICAgIH0sIHJhZGl1cywgaXNBcmNSYWRpdXMpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJzLnNlZ3B0cy5sZW5ndGggJSA0ID09PSAwKSB7XG4gICAgICB2YXIgaTIgPSBycy5zZWdwdHMubGVuZ3RoIC8gMjtcbiAgICAgIHZhciBpMSA9IGkyIC0gMjtcbiAgICAgIHJzLm1pZFggPSAocnMuc2VncHRzW2kxXSArIHJzLnNlZ3B0c1tpMl0pIC8gMjtcbiAgICAgIHJzLm1pZFkgPSAocnMuc2VncHRzW2kxICsgMV0gKyBycy5zZWdwdHNbaTIgKyAxXSkgLyAyO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2kgPSBycy5zZWdwdHMubGVuZ3RoIC8gMiAtIDE7XG4gICAgICBpZiAoIXJzLmlzUm91bmQpIHtcbiAgICAgICAgcnMubWlkWCA9IHJzLnNlZ3B0c1tfaV07XG4gICAgICAgIHJzLm1pZFkgPSBycy5zZWdwdHNbX2kgKyAxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwb2ludCA9IHtcbiAgICAgICAgICB4OiBycy5zZWdwdHNbX2ldLFxuICAgICAgICAgIHk6IHJzLnNlZ3B0c1tfaSArIDFdXG4gICAgICAgIH07XG4gICAgICAgIHZhciBjb3JuZXIgPSBycy5yb3VuZENvcm5lcnNbX2kgLyAyXTtcbiAgICAgICAgdmFyIHYgPSBbcG9pbnQueCAtIGNvcm5lci5jeCwgcG9pbnQueSAtIGNvcm5lci5jeV07XG4gICAgICAgIHZhciBmYWN0b3IgPSBjb3JuZXIucmFkaXVzIC8gTWF0aC5zcXJ0KE1hdGgucG93KHZbMF0sIDIpICsgTWF0aC5wb3codlsxXSwgMikpO1xuICAgICAgICB2ID0gdi5tYXAoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICByZXR1cm4gYyAqIGZhY3RvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJzLm1pZFggPSBjb3JuZXIuY3ggKyB2WzBdO1xuICAgICAgICBycy5taWRZID0gY29ybmVyLmN5ICsgdlsxXTtcbiAgICAgICAgcnMubWlkVmVjdG9yID0gdjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5CUnAkYy5jaGVja0ZvckludmFsaWRFZGdlV2FybmluZyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2VbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gIGlmIChycy5ub2Rlc092ZXJsYXAgfHwgbnVtYmVyJDEocnMuc3RhcnRYKSAmJiBudW1iZXIkMShycy5zdGFydFkpICYmIG51bWJlciQxKHJzLmVuZFgpICYmIG51bWJlciQxKHJzLmVuZFkpKSB7XG4gICAgcnMubG9nZ2VkRXJyID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFycy5sb2dnZWRFcnIpIHtcbiAgICAgIHJzLmxvZ2dlZEVyciA9IHRydWU7XG4gICAgICB3YXJuKCdFZGdlIGAnICsgZWRnZS5pZCgpICsgJ2AgaGFzIGludmFsaWQgZW5kcG9pbnRzIGFuZCBzbyBpdCBpcyBpbXBvc3NpYmxlIHRvIGRyYXcuICBBZGp1c3QgeW91ciBlZGdlIHN0eWxlIChlLmcuIGNvbnRyb2wgcG9pbnRzKSBhY2NvcmRpbmdseSBvciB1c2UgYW4gYWx0ZXJuYXRpdmUgZWRnZSB0eXBlLiAgVGhpcyBpcyBleHBlY3RlZCBiZWhhdmlvdXIgd2hlbiB0aGUgc291cmNlIG5vZGUgYW5kIHRoZSB0YXJnZXQgbm9kZSBvdmVybGFwLicpO1xuICAgIH1cbiAgfVxufTtcbkJScCRjLmZpbmRFZGdlQ29udHJvbFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlcykge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICBpZiAoIWVkZ2VzIHx8IGVkZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjeSA9IHIuY3k7XG4gIHZhciBoYXNDb21wb3VuZHMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gIHZhciBoYXNoVGFibGUgPSB7XG4gICAgbWFwOiBuZXcgTWFwJDIoKSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldChwYWlySWQpIHtcbiAgICAgIHZhciBtYXAyID0gdGhpcy5tYXAuZ2V0KHBhaXJJZFswXSk7XG4gICAgICBpZiAobWFwMiAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBtYXAyLmdldChwYWlySWRbMV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChwYWlySWQsIHZhbCkge1xuICAgICAgdmFyIG1hcDIgPSB0aGlzLm1hcC5nZXQocGFpcklkWzBdKTtcbiAgICAgIGlmIChtYXAyID09IG51bGwpIHtcbiAgICAgICAgbWFwMiA9IG5ldyBNYXAkMigpO1xuICAgICAgICB0aGlzLm1hcC5zZXQocGFpcklkWzBdLCBtYXAyKTtcbiAgICAgIH1cbiAgICAgIG1hcDIuc2V0KHBhaXJJZFsxXSwgdmFsKTtcbiAgICB9XG4gIH07XG4gIHZhciBwYWlySWRzID0gW107XG4gIHZhciBoYXlzdGFja0VkZ2VzID0gW107XG5cbiAgLy8gY3JlYXRlIGEgdGFibGUgb2YgZWRnZSAoc3JjLCB0Z3QpID0+IGxpc3Qgb2YgZWRnZXMgYmV0d2VlbiB0aGVtXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWRnZSA9IGVkZ2VzW2ldO1xuICAgIHZhciBfcCA9IGVkZ2UuX3ByaXZhdGU7XG4gICAgdmFyIGN1cnZlU3R5bGUgPSBlZGdlLnBzdHlsZSgnY3VydmUtc3R5bGUnKS52YWx1ZTtcblxuICAgIC8vIGlnbm9yZSBlZGdlcyB3aG8gYXJlIG5vdCB0byBiZSBkaXNwbGF5ZWRcbiAgICAvLyB0aGV5IHNob3VsZG4ndCB0YWtlIHVwIHNwYWNlXG4gICAgaWYgKGVkZ2UucmVtb3ZlZCgpIHx8ICFlZGdlLnRha2VzVXBTcGFjZSgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGN1cnZlU3R5bGUgPT09ICdoYXlzdGFjaycpIHtcbiAgICAgIGhheXN0YWNrRWRnZXMucHVzaChlZGdlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgZWRnZUlzVW5idW5kbGVkID0gY3VydmVTdHlsZSA9PT0gJ3VuYnVuZGxlZC1iZXppZXInIHx8IGN1cnZlU3R5bGUuZW5kc1dpdGgoJ3NlZ21lbnRzJykgfHwgY3VydmVTdHlsZSA9PT0gJ3N0cmFpZ2h0JyB8fCBjdXJ2ZVN0eWxlID09PSAnc3RyYWlnaHQtdHJpYW5nbGUnIHx8IGN1cnZlU3R5bGUuZW5kc1dpdGgoJ3RheGknKTtcbiAgICB2YXIgZWRnZUlzQmV6aWVyID0gY3VydmVTdHlsZSA9PT0gJ3VuYnVuZGxlZC1iZXppZXInIHx8IGN1cnZlU3R5bGUgPT09ICdiZXppZXInO1xuICAgIHZhciBzcmMgPSBfcC5zb3VyY2U7XG4gICAgdmFyIHRndCA9IF9wLnRhcmdldDtcbiAgICB2YXIgc3JjSW5kZXggPSBzcmMucG9vbEluZGV4KCk7XG4gICAgdmFyIHRndEluZGV4ID0gdGd0LnBvb2xJbmRleCgpO1xuICAgIHZhciBwYWlySWQgPSBbc3JjSW5kZXgsIHRndEluZGV4XS5zb3J0KCk7XG4gICAgdmFyIHRhYmxlRW50cnkgPSBoYXNoVGFibGUuZ2V0KHBhaXJJZCk7XG4gICAgaWYgKHRhYmxlRW50cnkgPT0gbnVsbCkge1xuICAgICAgdGFibGVFbnRyeSA9IHtcbiAgICAgICAgZWxlczogW11cbiAgICAgIH07XG4gICAgICBoYXNoVGFibGUuc2V0KHBhaXJJZCwgdGFibGVFbnRyeSk7XG4gICAgICBwYWlySWRzLnB1c2gocGFpcklkKTtcbiAgICB9XG4gICAgdGFibGVFbnRyeS5lbGVzLnB1c2goZWRnZSk7XG4gICAgaWYgKGVkZ2VJc1VuYnVuZGxlZCkge1xuICAgICAgdGFibGVFbnRyeS5oYXNVbmJ1bmRsZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoZWRnZUlzQmV6aWVyKSB7XG4gICAgICB0YWJsZUVudHJ5Lmhhc0JlemllciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gZm9yIGVhY2ggcGFpciAoc3JjLCB0Z3QpLCBjcmVhdGUgdGhlIGN0cmwgcHRzXG4gIC8vIE5lc3RlZCBmb3IgbG9vcCBpcyBPSzsgdG90YWwgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIGJvdGggbG9vcHMgPSBlZGdlQ291bnRcbiAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AocCkge1xuICAgIHZhciBwYWlySWQgPSBwYWlySWRzW3BdO1xuICAgIHZhciBwYWlySW5mbyA9IGhhc2hUYWJsZS5nZXQocGFpcklkKTtcbiAgICB2YXIgc3dhcHBlZHBhaXJJbmZvID0gdm9pZCAwO1xuICAgIGlmICghcGFpckluZm8uaGFzVW5idW5kbGVkKSB7XG4gICAgICB2YXIgcGxsRWRnZXMgPSBwYWlySW5mby5lbGVzWzBdLnBhcmFsbGVsRWRnZXMoKS5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUuaXNCdW5kbGVkQmV6aWVyKCk7XG4gICAgICB9KTtcbiAgICAgIGNsZWFyQXJyYXkocGFpckluZm8uZWxlcyk7XG4gICAgICBwbGxFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgIHJldHVybiBwYWlySW5mby5lbGVzLnB1c2goZWRnZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gZm9yIGVhY2ggcGFpciBpZCwgdGhlIGVkZ2VzIHNob3VsZCBiZSBzb3J0ZWQgYnkgaW5kZXhcbiAgICAgIHBhaXJJbmZvLmVsZXMuc29ydChmdW5jdGlvbiAoZWRnZTEsIGVkZ2UyKSB7XG4gICAgICAgIHJldHVybiBlZGdlMS5wb29sSW5kZXgoKSAtIGVkZ2UyLnBvb2xJbmRleCgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciBmaXJzdEVkZ2UgPSBwYWlySW5mby5lbGVzWzBdO1xuICAgIHZhciBzcmMgPSBmaXJzdEVkZ2Uuc291cmNlKCk7XG4gICAgdmFyIHRndCA9IGZpcnN0RWRnZS50YXJnZXQoKTtcblxuICAgIC8vIG1ha2Ugc3VyZSBzcmMvdGd0IGRpc3RpbmN0aW9uIGlzIGNvbnNpc3RlbnQgdy5yLnQuIHBhaXJJZFxuICAgIGlmIChzcmMucG9vbEluZGV4KCkgPiB0Z3QucG9vbEluZGV4KCkpIHtcbiAgICAgIHZhciB0ZW1wID0gc3JjO1xuICAgICAgc3JjID0gdGd0O1xuICAgICAgdGd0ID0gdGVtcDtcbiAgICB9XG4gICAgdmFyIHNyY1BvcyA9IHBhaXJJbmZvLnNyY1BvcyA9IHNyYy5wb3NpdGlvbigpO1xuICAgIHZhciB0Z3RQb3MgPSBwYWlySW5mby50Z3RQb3MgPSB0Z3QucG9zaXRpb24oKTtcbiAgICB2YXIgc3JjVyA9IHBhaXJJbmZvLnNyY1cgPSBzcmMub3V0ZXJXaWR0aCgpO1xuICAgIHZhciBzcmNIID0gcGFpckluZm8uc3JjSCA9IHNyYy5vdXRlckhlaWdodCgpO1xuICAgIHZhciB0Z3RXID0gcGFpckluZm8udGd0VyA9IHRndC5vdXRlcldpZHRoKCk7XG4gICAgdmFyIHRndEggPSBwYWlySW5mby50Z3RIID0gdGd0Lm91dGVySGVpZ2h0KCk7XG4gICAgdmFyIHNyY1NoYXBlID0gcGFpckluZm8uc3JjU2hhcGUgPSByLm5vZGVTaGFwZXNbX3RoaXMuZ2V0Tm9kZVNoYXBlKHNyYyldO1xuICAgIHZhciB0Z3RTaGFwZSA9IHBhaXJJbmZvLnRndFNoYXBlID0gci5ub2RlU2hhcGVzW190aGlzLmdldE5vZGVTaGFwZSh0Z3QpXTtcbiAgICB2YXIgc3JjQ29ybmVyUmFkaXVzID0gcGFpckluZm8uc3JjQ29ybmVyUmFkaXVzID0gc3JjLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnZhbHVlID09PSAnYXV0bycgPyAnYXV0bycgOiBzcmMucHN0eWxlKCdjb3JuZXItcmFkaXVzJykucGZWYWx1ZTtcbiAgICB2YXIgdGd0Q29ybmVyUmFkaXVzID0gcGFpckluZm8udGd0Q29ybmVyUmFkaXVzID0gdGd0LnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnZhbHVlID09PSAnYXV0bycgPyAnYXV0bycgOiB0Z3QucHN0eWxlKCdjb3JuZXItcmFkaXVzJykucGZWYWx1ZTtcbiAgICB2YXIgdGd0UnMgPSBwYWlySW5mby50Z3RScyA9IHRndC5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICB2YXIgc3JjUnMgPSBwYWlySW5mby5zcmNScyA9IHNyYy5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICBwYWlySW5mby5kaXJDb3VudHMgPSB7XG4gICAgICAnbm9ydGgnOiAwLFxuICAgICAgJ3dlc3QnOiAwLFxuICAgICAgJ3NvdXRoJzogMCxcbiAgICAgICdlYXN0JzogMCxcbiAgICAgICdub3J0aHdlc3QnOiAwLFxuICAgICAgJ3NvdXRod2VzdCc6IDAsXG4gICAgICAnbm9ydGhlYXN0JzogMCxcbiAgICAgICdzb3V0aGVhc3QnOiAwXG4gICAgfTtcbiAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBwYWlySW5mby5lbGVzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgIHZhciBfZWRnZSA9IHBhaXJJbmZvLmVsZXNbX2kyXTtcbiAgICAgIHZhciBycyA9IF9lZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgICAgdmFyIF9jdXJ2ZVN0eWxlID0gX2VkZ2UucHN0eWxlKCdjdXJ2ZS1zdHlsZScpLnZhbHVlO1xuICAgICAgdmFyIF9lZGdlSXNVbmJ1bmRsZWQgPSBfY3VydmVTdHlsZSA9PT0gJ3VuYnVuZGxlZC1iZXppZXInIHx8IF9jdXJ2ZVN0eWxlLmVuZHNXaXRoKCdzZWdtZW50cycpIHx8IF9jdXJ2ZVN0eWxlLmVuZHNXaXRoKCd0YXhpJyk7XG5cbiAgICAgIC8vIHdoZXRoZXIgdGhlIG5vcm1hbGlzZWQgcGFpciBvcmRlciBpcyB0aGUgcmV2ZXJzZSBvZiB0aGUgZWRnZSdzIHNyYy10Z3Qgb3JkZXJcbiAgICAgIHZhciBlZGdlSXNTd2FwcGVkID0gIXNyYy5zYW1lKF9lZGdlLnNvdXJjZSgpKTtcbiAgICAgIGlmICghcGFpckluZm8uY2FsY3VsYXRlZEludGVyc2VjdGlvbiAmJiBzcmMgIT09IHRndCAmJiAocGFpckluZm8uaGFzQmV6aWVyIHx8IHBhaXJJbmZvLmhhc1VuYnVuZGxlZCkpIHtcbiAgICAgICAgcGFpckluZm8uY2FsY3VsYXRlZEludGVyc2VjdGlvbiA9IHRydWU7XG5cbiAgICAgICAgLy8gcHQgb3V0c2lkZSBzcmMgc2hhcGUgdG8gY2FsYyBkaXN0YW5jZS9kaXNwbGFjZW1lbnQgZnJvbSBzcmMgdG8gdGd0XG4gICAgICAgIHZhciBzcmNPdXRzaWRlID0gc3JjU2hhcGUuaW50ZXJzZWN0TGluZShzcmNQb3MueCwgc3JjUG9zLnksIHNyY1csIHNyY0gsIHRndFBvcy54LCB0Z3RQb3MueSwgMCwgc3JjQ29ybmVyUmFkaXVzLCBzcmNScyk7XG4gICAgICAgIHZhciBzcmNJbnRuID0gcGFpckluZm8uc3JjSW50biA9IHNyY091dHNpZGU7XG5cbiAgICAgICAgLy8gcHQgb3V0c2lkZSB0Z3Qgc2hhcGUgdG8gY2FsYyBkaXN0YW5jZS9kaXNwbGFjZW1lbnQgZnJvbSBzcmMgdG8gdGd0XG4gICAgICAgIHZhciB0Z3RPdXRzaWRlID0gdGd0U2hhcGUuaW50ZXJzZWN0TGluZSh0Z3RQb3MueCwgdGd0UG9zLnksIHRndFcsIHRndEgsIHNyY1Bvcy54LCBzcmNQb3MueSwgMCwgdGd0Q29ybmVyUmFkaXVzLCB0Z3RScyk7XG4gICAgICAgIHZhciB0Z3RJbnRuID0gcGFpckluZm8udGd0SW50biA9IHRndE91dHNpZGU7XG4gICAgICAgIHZhciBpbnRlcnNlY3Rpb25QdHMgPSBwYWlySW5mby5pbnRlcnNlY3Rpb25QdHMgPSB7XG4gICAgICAgICAgeDE6IHNyY091dHNpZGVbMF0sXG4gICAgICAgICAgeDI6IHRndE91dHNpZGVbMF0sXG4gICAgICAgICAgeTE6IHNyY091dHNpZGVbMV0sXG4gICAgICAgICAgeTI6IHRndE91dHNpZGVbMV1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHBvc1B0cyA9IHBhaXJJbmZvLnBvc1B0cyA9IHtcbiAgICAgICAgICB4MTogc3JjUG9zLngsXG4gICAgICAgICAgeDI6IHRndFBvcy54LFxuICAgICAgICAgIHkxOiBzcmNQb3MueSxcbiAgICAgICAgICB5MjogdGd0UG9zLnlcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGR5ID0gdGd0T3V0c2lkZVsxXSAtIHNyY091dHNpZGVbMV07XG4gICAgICAgIHZhciBkeCA9IHRndE91dHNpZGVbMF0gLSBzcmNPdXRzaWRlWzBdO1xuICAgICAgICB2YXIgbCA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgICAgIHZhciB2ZWN0b3IgPSBwYWlySW5mby52ZWN0b3IgPSB7XG4gICAgICAgICAgeDogZHgsXG4gICAgICAgICAgeTogZHlcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHZlY3Rvck5vcm0gPSBwYWlySW5mby52ZWN0b3JOb3JtID0ge1xuICAgICAgICAgIHg6IHZlY3Rvci54IC8gbCxcbiAgICAgICAgICB5OiB2ZWN0b3IueSAvIGxcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHZlY3Rvck5vcm1JbnZlcnNlID0ge1xuICAgICAgICAgIHg6IC12ZWN0b3JOb3JtLnksXG4gICAgICAgICAgeTogdmVjdG9yTm9ybS54XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gaWYgbm9kZSBzaGFwZXMgb3ZlcmxhcCwgdGhlbiBubyBjdHJsIHB0cyB0byBkcmF3XG4gICAgICAgIHBhaXJJbmZvLm5vZGVzT3ZlcmxhcCA9ICFudW1iZXIkMShsKSB8fCB0Z3RTaGFwZS5jaGVja1BvaW50KHNyY091dHNpZGVbMF0sIHNyY091dHNpZGVbMV0sIDAsIHRndFcsIHRndEgsIHRndFBvcy54LCB0Z3RQb3MueSwgdGd0Q29ybmVyUmFkaXVzLCB0Z3RScykgfHwgc3JjU2hhcGUuY2hlY2tQb2ludCh0Z3RPdXRzaWRlWzBdLCB0Z3RPdXRzaWRlWzFdLCAwLCBzcmNXLCBzcmNILCBzcmNQb3MueCwgc3JjUG9zLnksIHNyY0Nvcm5lclJhZGl1cywgc3JjUnMpO1xuICAgICAgICBwYWlySW5mby52ZWN0b3JOb3JtSW52ZXJzZSA9IHZlY3Rvck5vcm1JbnZlcnNlO1xuICAgICAgICBzd2FwcGVkcGFpckluZm8gPSB7XG4gICAgICAgICAgbm9kZXNPdmVybGFwOiBwYWlySW5mby5ub2Rlc092ZXJsYXAsXG4gICAgICAgICAgZGlyQ291bnRzOiBwYWlySW5mby5kaXJDb3VudHMsXG4gICAgICAgICAgY2FsY3VsYXRlZEludGVyc2VjdGlvbjogdHJ1ZSxcbiAgICAgICAgICBoYXNCZXppZXI6IHBhaXJJbmZvLmhhc0JlemllcixcbiAgICAgICAgICBoYXNVbmJ1bmRsZWQ6IHBhaXJJbmZvLmhhc1VuYnVuZGxlZCxcbiAgICAgICAgICBlbGVzOiBwYWlySW5mby5lbGVzLFxuICAgICAgICAgIHNyY1BvczogdGd0UG9zLFxuICAgICAgICAgIHRndFBvczogc3JjUG9zLFxuICAgICAgICAgIHNyY1c6IHRndFcsXG4gICAgICAgICAgc3JjSDogdGd0SCxcbiAgICAgICAgICB0Z3RXOiBzcmNXLFxuICAgICAgICAgIHRndEg6IHNyY0gsXG4gICAgICAgICAgc3JjSW50bjogdGd0SW50bixcbiAgICAgICAgICB0Z3RJbnRuOiBzcmNJbnRuLFxuICAgICAgICAgIHNyY1NoYXBlOiB0Z3RTaGFwZSxcbiAgICAgICAgICB0Z3RTaGFwZTogc3JjU2hhcGUsXG4gICAgICAgICAgcG9zUHRzOiB7XG4gICAgICAgICAgICB4MTogcG9zUHRzLngyLFxuICAgICAgICAgICAgeTE6IHBvc1B0cy55MixcbiAgICAgICAgICAgIHgyOiBwb3NQdHMueDEsXG4gICAgICAgICAgICB5MjogcG9zUHRzLnkxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbnRlcnNlY3Rpb25QdHM6IHtcbiAgICAgICAgICAgIHgxOiBpbnRlcnNlY3Rpb25QdHMueDIsXG4gICAgICAgICAgICB5MTogaW50ZXJzZWN0aW9uUHRzLnkyLFxuICAgICAgICAgICAgeDI6IGludGVyc2VjdGlvblB0cy54MSxcbiAgICAgICAgICAgIHkyOiBpbnRlcnNlY3Rpb25QdHMueTFcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZlY3Rvcjoge1xuICAgICAgICAgICAgeDogLXZlY3Rvci54LFxuICAgICAgICAgICAgeTogLXZlY3Rvci55XG4gICAgICAgICAgfSxcbiAgICAgICAgICB2ZWN0b3JOb3JtOiB7XG4gICAgICAgICAgICB4OiAtdmVjdG9yTm9ybS54LFxuICAgICAgICAgICAgeTogLXZlY3Rvck5vcm0ueVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmVjdG9yTm9ybUludmVyc2U6IHtcbiAgICAgICAgICAgIHg6IC12ZWN0b3JOb3JtSW52ZXJzZS54LFxuICAgICAgICAgICAgeTogLXZlY3Rvck5vcm1JbnZlcnNlLnlcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgcGFzc2VkUGFpckluZm8gPSBlZGdlSXNTd2FwcGVkID8gc3dhcHBlZHBhaXJJbmZvIDogcGFpckluZm87XG4gICAgICBycy5ub2Rlc092ZXJsYXAgPSBwYXNzZWRQYWlySW5mby5ub2Rlc092ZXJsYXA7XG4gICAgICBycy5zcmNJbnRuID0gcGFzc2VkUGFpckluZm8uc3JjSW50bjtcbiAgICAgIHJzLnRndEludG4gPSBwYXNzZWRQYWlySW5mby50Z3RJbnRuO1xuICAgICAgcnMuaXNSb3VuZCA9IF9jdXJ2ZVN0eWxlLnN0YXJ0c1dpdGgoJ3JvdW5kJyk7XG4gICAgICBpZiAoaGFzQ29tcG91bmRzICYmIChzcmMuaXNQYXJlbnQoKSB8fCBzcmMuaXNDaGlsZCgpIHx8IHRndC5pc1BhcmVudCgpIHx8IHRndC5pc0NoaWxkKCkpICYmIChzcmMucGFyZW50cygpLmFueVNhbWUodGd0KSB8fCB0Z3QucGFyZW50cygpLmFueVNhbWUoc3JjKSB8fCBzcmMuc2FtZSh0Z3QpICYmIHNyYy5pc1BhcmVudCgpKSkge1xuICAgICAgICBfdGhpcy5maW5kQ29tcG91bmRMb29wUG9pbnRzKF9lZGdlLCBwYXNzZWRQYWlySW5mbywgX2kyLCBfZWRnZUlzVW5idW5kbGVkKTtcbiAgICAgIH0gZWxzZSBpZiAoc3JjID09PSB0Z3QpIHtcbiAgICAgICAgX3RoaXMuZmluZExvb3BQb2ludHMoX2VkZ2UsIHBhc3NlZFBhaXJJbmZvLCBfaTIsIF9lZGdlSXNVbmJ1bmRsZWQpO1xuICAgICAgfSBlbHNlIGlmIChfY3VydmVTdHlsZS5lbmRzV2l0aCgnc2VnbWVudHMnKSkge1xuICAgICAgICBfdGhpcy5maW5kU2VnbWVudHNQb2ludHMoX2VkZ2UsIHBhc3NlZFBhaXJJbmZvKTtcbiAgICAgIH0gZWxzZSBpZiAoX2N1cnZlU3R5bGUuZW5kc1dpdGgoJ3RheGknKSkge1xuICAgICAgICBfdGhpcy5maW5kVGF4aVBvaW50cyhfZWRnZSwgcGFzc2VkUGFpckluZm8pO1xuICAgICAgfSBlbHNlIGlmIChfY3VydmVTdHlsZSA9PT0gJ3N0cmFpZ2h0JyB8fCAhX2VkZ2VJc1VuYnVuZGxlZCAmJiBwYWlySW5mby5lbGVzLmxlbmd0aCAlIDIgPT09IDEgJiYgX2kyID09PSBNYXRoLmZsb29yKHBhaXJJbmZvLmVsZXMubGVuZ3RoIC8gMikpIHtcbiAgICAgICAgX3RoaXMuZmluZFN0cmFpZ2h0RWRnZVBvaW50cyhfZWRnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5maW5kQmV6aWVyUG9pbnRzKF9lZGdlLCBwYXNzZWRQYWlySW5mbywgX2kyLCBfZWRnZUlzVW5idW5kbGVkLCBlZGdlSXNTd2FwcGVkKTtcbiAgICAgIH1cbiAgICAgIF90aGlzLmZpbmRFbmRwb2ludHMoX2VkZ2UpO1xuICAgICAgX3RoaXMudHJ5VG9Db3JyZWN0SW52YWxpZFBvaW50cyhfZWRnZSwgcGFzc2VkUGFpckluZm8pO1xuICAgICAgX3RoaXMuY2hlY2tGb3JJbnZhbGlkRWRnZVdhcm5pbmcoX2VkZ2UpO1xuICAgICAgX3RoaXMuc3RvcmVBbGxwdHMoX2VkZ2UpO1xuICAgICAgX3RoaXMuc3RvcmVFZGdlUHJvamVjdGlvbnMoX2VkZ2UpO1xuICAgICAgX3RoaXMuY2FsY3VsYXRlQXJyb3dBbmdsZXMoX2VkZ2UpO1xuICAgICAgX3RoaXMucmVjYWxjdWxhdGVFZGdlTGFiZWxQcm9qZWN0aW9ucyhfZWRnZSk7XG4gICAgICBfdGhpcy5jYWxjdWxhdGVMYWJlbEFuZ2xlcyhfZWRnZSk7XG4gICAgfSAvLyBmb3IgcGFpciBlZGdlc1xuICB9O1xuICBmb3IgKHZhciBwID0gMDsgcCA8IHBhaXJJZHMubGVuZ3RoOyBwKyspIHtcbiAgICBfbG9vcChwKTtcbiAgfSAvLyBmb3IgcGFpciBpZHNcblxuICAvLyBoYXlzdGFja3MgYXZvaWQgdGhlIGV4cGVuc2Ugb2YgcGFpckluZm8gc3R1ZmYgKGludGVyc2VjdGlvbnMgZXRjLilcbiAgdGhpcy5maW5kSGF5c3RhY2tQb2ludHMoaGF5c3RhY2tFZGdlcyk7XG59O1xuZnVuY3Rpb24gZ2V0UHRzKHB0cykge1xuICB2YXIgcmV0UHRzID0gW107XG4gIGlmIChwdHMgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHB0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciB4ID0gcHRzW2ldO1xuICAgIHZhciB5ID0gcHRzW2kgKyAxXTtcbiAgICByZXRQdHMucHVzaCh7XG4gICAgICB4OiB4LFxuICAgICAgeTogeVxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXRQdHM7XG59XG5CUnAkYy5nZXRTZWdtZW50UG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIHR5cGUgPSBycy5lZGdlVHlwZTtcbiAgaWYgKHR5cGUgPT09ICdzZWdtZW50cycpIHtcbiAgICB0aGlzLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZShlZGdlKTtcbiAgICByZXR1cm4gZ2V0UHRzKHJzLnNlZ3B0cyk7XG4gIH1cbn07XG5CUnAkYy5nZXRDb250cm9sUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIHR5cGUgPSBycy5lZGdlVHlwZTtcbiAgaWYgKHR5cGUgPT09ICdiZXppZXInIHx8IHR5cGUgPT09ICdtdWx0aWJlemllcicgfHwgdHlwZSA9PT0gJ3NlbGYnIHx8IHR5cGUgPT09ICdjb21wb3VuZCcpIHtcbiAgICB0aGlzLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZShlZGdlKTtcbiAgICByZXR1cm4gZ2V0UHRzKHJzLmN0cmxwdHMpO1xuICB9XG59O1xuQlJwJGMuZ2V0RWRnZU1pZHBvaW50ID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdGhpcy5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUoZWRnZSk7XG4gIHJldHVybiB7XG4gICAgeDogcnMubWlkWCxcbiAgICB5OiBycy5taWRZXG4gIH07XG59O1xuXG52YXIgQlJwJGIgPSB7fTtcbkJScCRiLm1hbnVhbEVuZHB0VG9QeCA9IGZ1bmN0aW9uIChub2RlLCBwcm9wKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIG5wb3MgPSBub2RlLnBvc2l0aW9uKCk7XG4gIHZhciB3ID0gbm9kZS5vdXRlcldpZHRoKCk7XG4gIHZhciBoID0gbm9kZS5vdXRlckhlaWdodCgpO1xuICB2YXIgcnMgPSBub2RlLl9wcml2YXRlLnJzY3JhdGNoO1xuICBpZiAocHJvcC52YWx1ZS5sZW5ndGggPT09IDIpIHtcbiAgICB2YXIgcCA9IFtwcm9wLnBmVmFsdWVbMF0sIHByb3AucGZWYWx1ZVsxXV07XG4gICAgaWYgKHByb3AudW5pdHNbMF0gPT09ICclJykge1xuICAgICAgcFswXSA9IHBbMF0gKiB3O1xuICAgIH1cbiAgICBpZiAocHJvcC51bml0c1sxXSA9PT0gJyUnKSB7XG4gICAgICBwWzFdID0gcFsxXSAqIGg7XG4gICAgfVxuICAgIHBbMF0gKz0gbnBvcy54O1xuICAgIHBbMV0gKz0gbnBvcy55O1xuICAgIHJldHVybiBwO1xuICB9IGVsc2Uge1xuICAgIHZhciBhbmdsZSA9IHByb3AucGZWYWx1ZVswXTtcbiAgICBhbmdsZSA9IC1NYXRoLlBJIC8gMiArIGFuZ2xlOyAvLyBzdGFydCBhdCAxMiBvJ2Nsb2NrXG5cbiAgICB2YXIgbCA9IDIgKiBNYXRoLm1heCh3LCBoKTtcbiAgICB2YXIgX3AgPSBbbnBvcy54ICsgTWF0aC5jb3MoYW5nbGUpICogbCwgbnBvcy55ICsgTWF0aC5zaW4oYW5nbGUpICogbF07XG4gICAgcmV0dXJuIHIubm9kZVNoYXBlc1t0aGlzLmdldE5vZGVTaGFwZShub2RlKV0uaW50ZXJzZWN0TGluZShucG9zLngsIG5wb3MueSwgdywgaCwgX3BbMF0sIF9wWzFdLCAwLCBub2RlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnZhbHVlID09PSAnYXV0bycgPyAnYXV0bycgOiBub2RlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWUsIHJzKTtcbiAgfVxufTtcbkJScCRiLmZpbmRFbmRwb2ludHMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBpbnRlcnNlY3Q7XG4gIHZhciBzb3VyY2UgPSBlZGdlLnNvdXJjZSgpWzBdO1xuICB2YXIgdGFyZ2V0ID0gZWRnZS50YXJnZXQoKVswXTtcbiAgdmFyIHNyY1BvcyA9IHNvdXJjZS5wb3NpdGlvbigpO1xuICB2YXIgdGd0UG9zID0gdGFyZ2V0LnBvc2l0aW9uKCk7XG4gIHZhciB0Z3RBclNoYXBlID0gZWRnZS5wc3R5bGUoJ3RhcmdldC1hcnJvdy1zaGFwZScpLnZhbHVlO1xuICB2YXIgc3JjQXJTaGFwZSA9IGVkZ2UucHN0eWxlKCdzb3VyY2UtYXJyb3ctc2hhcGUnKS52YWx1ZTtcbiAgdmFyIHRndERpc3QgPSBlZGdlLnBzdHlsZSgndGFyZ2V0LWRpc3RhbmNlLWZyb20tbm9kZScpLnBmVmFsdWU7XG4gIHZhciBzcmNEaXN0ID0gZWRnZS5wc3R5bGUoJ3NvdXJjZS1kaXN0YW5jZS1mcm9tLW5vZGUnKS5wZlZhbHVlO1xuICB2YXIgc3JjUnMgPSBzb3VyY2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciB0Z3RScyA9IHRhcmdldC5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIGN1cnZlU3R5bGUgPSBlZGdlLnBzdHlsZSgnY3VydmUtc3R5bGUnKS52YWx1ZTtcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIGV0ID0gcnMuZWRnZVR5cGU7XG4gIHZhciB0YXhpID0gY3VydmVTdHlsZSA9PT0gJ3RheGknO1xuICB2YXIgc2VsZiA9IGV0ID09PSAnc2VsZicgfHwgZXQgPT09ICdjb21wb3VuZCc7XG4gIHZhciBiZXppZXIgPSBldCA9PT0gJ2JlemllcicgfHwgZXQgPT09ICdtdWx0aWJlemllcicgfHwgc2VsZjtcbiAgdmFyIG11bHRpID0gZXQgIT09ICdiZXppZXInO1xuICB2YXIgbGluZXMgPSBldCA9PT0gJ3N0cmFpZ2h0JyB8fCBldCA9PT0gJ3NlZ21lbnRzJztcbiAgdmFyIHNlZ21lbnRzID0gZXQgPT09ICdzZWdtZW50cyc7XG4gIHZhciBoYXNFbmRwdHMgPSBiZXppZXIgfHwgbXVsdGkgfHwgbGluZXM7XG4gIHZhciBvdmVycmlkZUVuZHB0cyA9IHNlbGYgfHwgdGF4aTtcbiAgdmFyIHNyY01hbkVuZHB0ID0gZWRnZS5wc3R5bGUoJ3NvdXJjZS1lbmRwb2ludCcpO1xuICB2YXIgc3JjTWFuRW5kcHRWYWwgPSBvdmVycmlkZUVuZHB0cyA/ICdvdXRzaWRlLXRvLW5vZGUnIDogc3JjTWFuRW5kcHQudmFsdWU7XG4gIHZhciBzcmNDb3JuZXJSYWRpdXMgPSBzb3VyY2UucHN0eWxlKCdjb3JuZXItcmFkaXVzJykudmFsdWUgPT09ICdhdXRvJyA/ICdhdXRvJyA6IHNvdXJjZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS5wZlZhbHVlO1xuICB2YXIgdGd0TWFuRW5kcHQgPSBlZGdlLnBzdHlsZSgndGFyZ2V0LWVuZHBvaW50Jyk7XG4gIHZhciB0Z3RNYW5FbmRwdFZhbCA9IG92ZXJyaWRlRW5kcHRzID8gJ291dHNpZGUtdG8tbm9kZScgOiB0Z3RNYW5FbmRwdC52YWx1ZTtcbiAgdmFyIHRndENvcm5lclJhZGl1cyA9IHRhcmdldC5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZSA9PT0gJ2F1dG8nID8gJ2F1dG8nIDogdGFyZ2V0LnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWU7XG4gIHJzLnNyY01hbkVuZHB0ID0gc3JjTWFuRW5kcHQ7XG4gIHJzLnRndE1hbkVuZHB0ID0gdGd0TWFuRW5kcHQ7XG4gIHZhciBwMTsgLy8gbGFzdCBrbm93biBwb2ludCBvZiBlZGdlIG9uIHRhcmdldCBzaWRlXG4gIHZhciBwMjsgLy8gbGFzdCBrbm93biBwb2ludCBvZiBlZGdlIG9uIHNvdXJjZSBzaWRlXG5cbiAgdmFyIHAxX2k7IC8vIHBvaW50IHRvIGludGVyc2VjdCB3aXRoIHRhcmdldCBzaGFwZVxuICB2YXIgcDJfaTsgLy8gcG9pbnQgdG8gaW50ZXJzZWN0IHdpdGggc291cmNlIHNoYXBlXG5cbiAgaWYgKGJlemllcikge1xuICAgIHZhciBjcFN0YXJ0ID0gW3JzLmN0cmxwdHNbMF0sIHJzLmN0cmxwdHNbMV1dO1xuICAgIHZhciBjcEVuZCA9IG11bHRpID8gW3JzLmN0cmxwdHNbcnMuY3RybHB0cy5sZW5ndGggLSAyXSwgcnMuY3RybHB0c1tycy5jdHJscHRzLmxlbmd0aCAtIDFdXSA6IGNwU3RhcnQ7XG4gICAgcDEgPSBjcEVuZDtcbiAgICBwMiA9IGNwU3RhcnQ7XG4gIH0gZWxzZSBpZiAobGluZXMpIHtcbiAgICB2YXIgc3JjQXJyb3dGcm9tUHQgPSAhc2VnbWVudHMgPyBbdGd0UG9zLngsIHRndFBvcy55XSA6IHJzLnNlZ3B0cy5zbGljZSgwLCAyKTtcbiAgICB2YXIgdGd0QXJyb3dGcm9tUHQgPSAhc2VnbWVudHMgPyBbc3JjUG9zLngsIHNyY1Bvcy55XSA6IHJzLnNlZ3B0cy5zbGljZShycy5zZWdwdHMubGVuZ3RoIC0gMik7XG4gICAgcDEgPSB0Z3RBcnJvd0Zyb21QdDtcbiAgICBwMiA9IHNyY0Fycm93RnJvbVB0O1xuICB9XG4gIGlmICh0Z3RNYW5FbmRwdFZhbCA9PT0gJ2luc2lkZS10by1ub2RlJykge1xuICAgIGludGVyc2VjdCA9IFt0Z3RQb3MueCwgdGd0UG9zLnldO1xuICB9IGVsc2UgaWYgKHRndE1hbkVuZHB0LnVuaXRzKSB7XG4gICAgaW50ZXJzZWN0ID0gdGhpcy5tYW51YWxFbmRwdFRvUHgodGFyZ2V0LCB0Z3RNYW5FbmRwdCk7XG4gIH0gZWxzZSBpZiAodGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUnKSB7XG4gICAgaW50ZXJzZWN0ID0gcnMudGd0SW50bjsgLy8gdXNlIGNhY2hlZCB2YWx1ZSBmcm9tIGN0cmxwdCBjYWxjXG4gIH0gZWxzZSB7XG4gICAgaWYgKHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1ub2RlJyB8fCB0Z3RNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbm9kZS1vci1sYWJlbCcpIHtcbiAgICAgIHAxX2kgPSBwMTtcbiAgICB9IGVsc2UgaWYgKHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lJyB8fCB0Z3RNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZS1vci1sYWJlbCcpIHtcbiAgICAgIHAxX2kgPSBbc3JjUG9zLngsIHNyY1Bvcy55XTtcbiAgICB9XG4gICAgaW50ZXJzZWN0ID0gci5ub2RlU2hhcGVzW3RoaXMuZ2V0Tm9kZVNoYXBlKHRhcmdldCldLmludGVyc2VjdExpbmUodGd0UG9zLngsIHRndFBvcy55LCB0YXJnZXQub3V0ZXJXaWR0aCgpLCB0YXJnZXQub3V0ZXJIZWlnaHQoKSwgcDFfaVswXSwgcDFfaVsxXSwgMCwgdGd0Q29ybmVyUmFkaXVzLCB0Z3RScyk7XG4gICAgaWYgKHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1ub2RlLW9yLWxhYmVsJyB8fCB0Z3RNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZS1vci1sYWJlbCcpIHtcbiAgICAgIHZhciB0cnMgPSB0YXJnZXQuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgICB2YXIgbHcgPSB0cnMubGFiZWxXaWR0aDtcbiAgICAgIHZhciBsaCA9IHRycy5sYWJlbEhlaWdodDtcbiAgICAgIHZhciBseCA9IHRycy5sYWJlbFg7XG4gICAgICB2YXIgbHkgPSB0cnMubGFiZWxZO1xuICAgICAgdmFyIGx3MiA9IGx3IC8gMjtcbiAgICAgIHZhciBsaDIgPSBsaCAvIDI7XG4gICAgICB2YXIgdmEgPSB0YXJnZXQucHN0eWxlKCd0ZXh0LXZhbGlnbicpLnZhbHVlO1xuICAgICAgaWYgKHZhID09PSAndG9wJykge1xuICAgICAgICBseSAtPSBsaDI7XG4gICAgICB9IGVsc2UgaWYgKHZhID09PSAnYm90dG9tJykge1xuICAgICAgICBseSArPSBsaDI7XG4gICAgICB9XG4gICAgICB2YXIgaGEgPSB0YXJnZXQucHN0eWxlKCd0ZXh0LWhhbGlnbicpLnZhbHVlO1xuICAgICAgaWYgKGhhID09PSAnbGVmdCcpIHtcbiAgICAgICAgbHggLT0gbHcyO1xuICAgICAgfSBlbHNlIGlmIChoYSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICBseCArPSBsdzI7XG4gICAgICB9XG4gICAgICB2YXIgbGFiZWxJbnRlcnNlY3QgPSBwb2x5Z29uSW50ZXJzZWN0TGluZShwMV9pWzBdLCBwMV9pWzFdLCBbbHggLSBsdzIsIGx5IC0gbGgyLCBseCArIGx3MiwgbHkgLSBsaDIsIGx4ICsgbHcyLCBseSArIGxoMiwgbHggLSBsdzIsIGx5ICsgbGgyXSwgdGd0UG9zLngsIHRndFBvcy55KTtcbiAgICAgIGlmIChsYWJlbEludGVyc2VjdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciByZWZQdCA9IHNyY1BvcztcbiAgICAgICAgdmFyIGludFNxZGlzdCA9IHNxZGlzdChyZWZQdCwgYXJyYXkycG9pbnQoaW50ZXJzZWN0KSk7XG4gICAgICAgIHZhciBsYWJJbnRTcWRpc3QgPSBzcWRpc3QocmVmUHQsIGFycmF5MnBvaW50KGxhYmVsSW50ZXJzZWN0KSk7XG4gICAgICAgIHZhciBtaW5TcURpc3QgPSBpbnRTcWRpc3Q7XG4gICAgICAgIGlmIChsYWJJbnRTcWRpc3QgPCBpbnRTcWRpc3QpIHtcbiAgICAgICAgICBpbnRlcnNlY3QgPSBsYWJlbEludGVyc2VjdDtcbiAgICAgICAgICBtaW5TcURpc3QgPSBsYWJJbnRTcWRpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhYmVsSW50ZXJzZWN0Lmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICB2YXIgbGFiSW50MlNxRGlzdCA9IHNxZGlzdChyZWZQdCwge1xuICAgICAgICAgICAgeDogbGFiZWxJbnRlcnNlY3RbMl0sXG4gICAgICAgICAgICB5OiBsYWJlbEludGVyc2VjdFszXVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChsYWJJbnQyU3FEaXN0IDwgbWluU3FEaXN0KSB7XG4gICAgICAgICAgICBpbnRlcnNlY3QgPSBbbGFiZWxJbnRlcnNlY3RbMl0sIGxhYmVsSW50ZXJzZWN0WzNdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIGFycm93RW5kID0gc2hvcnRlbkludGVyc2VjdGlvbihpbnRlcnNlY3QsIHAxLCByLmFycm93U2hhcGVzW3RndEFyU2hhcGVdLnNwYWNpbmcoZWRnZSkgKyB0Z3REaXN0KTtcbiAgdmFyIGVkZ2VFbmQgPSBzaG9ydGVuSW50ZXJzZWN0aW9uKGludGVyc2VjdCwgcDEsIHIuYXJyb3dTaGFwZXNbdGd0QXJTaGFwZV0uZ2FwKGVkZ2UpICsgdGd0RGlzdCk7XG4gIHJzLmVuZFggPSBlZGdlRW5kWzBdO1xuICBycy5lbmRZID0gZWRnZUVuZFsxXTtcbiAgcnMuYXJyb3dFbmRYID0gYXJyb3dFbmRbMF07XG4gIHJzLmFycm93RW5kWSA9IGFycm93RW5kWzFdO1xuICBpZiAoc3JjTWFuRW5kcHRWYWwgPT09ICdpbnNpZGUtdG8tbm9kZScpIHtcbiAgICBpbnRlcnNlY3QgPSBbc3JjUG9zLngsIHNyY1Bvcy55XTtcbiAgfSBlbHNlIGlmIChzcmNNYW5FbmRwdC51bml0cykge1xuICAgIGludGVyc2VjdCA9IHRoaXMubWFudWFsRW5kcHRUb1B4KHNvdXJjZSwgc3JjTWFuRW5kcHQpO1xuICB9IGVsc2UgaWYgKHNyY01hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lJykge1xuICAgIGludGVyc2VjdCA9IHJzLnNyY0ludG47IC8vIHVzZSBjYWNoZWQgdmFsdWUgZnJvbSBjdHJscHQgY2FsY1xuICB9IGVsc2Uge1xuICAgIGlmIChzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbm9kZScgfHwgc3JjTWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLW5vZGUtb3ItbGFiZWwnKSB7XG4gICAgICBwMl9pID0gcDI7XG4gICAgfSBlbHNlIGlmIChzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZScgfHwgc3JjTWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUtb3ItbGFiZWwnKSB7XG4gICAgICBwMl9pID0gW3RndFBvcy54LCB0Z3RQb3MueV07XG4gICAgfVxuICAgIGludGVyc2VjdCA9IHIubm9kZVNoYXBlc1t0aGlzLmdldE5vZGVTaGFwZShzb3VyY2UpXS5pbnRlcnNlY3RMaW5lKHNyY1Bvcy54LCBzcmNQb3MueSwgc291cmNlLm91dGVyV2lkdGgoKSwgc291cmNlLm91dGVySGVpZ2h0KCksIHAyX2lbMF0sIHAyX2lbMV0sIDAsIHNyY0Nvcm5lclJhZGl1cywgc3JjUnMpO1xuICAgIGlmIChzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbm9kZS1vci1sYWJlbCcgfHwgc3JjTWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUtb3ItbGFiZWwnKSB7XG4gICAgICB2YXIgc3JzID0gc291cmNlLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgICAgdmFyIF9sdyA9IHNycy5sYWJlbFdpZHRoO1xuICAgICAgdmFyIF9saCA9IHNycy5sYWJlbEhlaWdodDtcbiAgICAgIHZhciBfbHggPSBzcnMubGFiZWxYO1xuICAgICAgdmFyIF9seSA9IHNycy5sYWJlbFk7XG4gICAgICB2YXIgX2x3MiA9IF9sdyAvIDI7XG4gICAgICB2YXIgX2xoMiA9IF9saCAvIDI7XG4gICAgICB2YXIgX3ZhID0gc291cmNlLnBzdHlsZSgndGV4dC12YWxpZ24nKS52YWx1ZTtcbiAgICAgIGlmIChfdmEgPT09ICd0b3AnKSB7XG4gICAgICAgIF9seSAtPSBfbGgyO1xuICAgICAgfSBlbHNlIGlmIChfdmEgPT09ICdib3R0b20nKSB7XG4gICAgICAgIF9seSArPSBfbGgyO1xuICAgICAgfVxuICAgICAgdmFyIF9oYSA9IHNvdXJjZS5wc3R5bGUoJ3RleHQtaGFsaWduJykudmFsdWU7XG4gICAgICBpZiAoX2hhID09PSAnbGVmdCcpIHtcbiAgICAgICAgX2x4IC09IF9sdzI7XG4gICAgICB9IGVsc2UgaWYgKF9oYSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICBfbHggKz0gX2x3MjtcbiAgICAgIH1cbiAgICAgIHZhciBfbGFiZWxJbnRlcnNlY3QgPSBwb2x5Z29uSW50ZXJzZWN0TGluZShwMl9pWzBdLCBwMl9pWzFdLCBbX2x4IC0gX2x3MiwgX2x5IC0gX2xoMiwgX2x4ICsgX2x3MiwgX2x5IC0gX2xoMiwgX2x4ICsgX2x3MiwgX2x5ICsgX2xoMiwgX2x4IC0gX2x3MiwgX2x5ICsgX2xoMl0sIHNyY1Bvcy54LCBzcmNQb3MueSk7XG4gICAgICBpZiAoX2xhYmVsSW50ZXJzZWN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIF9yZWZQdCA9IHRndFBvcztcbiAgICAgICAgdmFyIF9pbnRTcWRpc3QgPSBzcWRpc3QoX3JlZlB0LCBhcnJheTJwb2ludChpbnRlcnNlY3QpKTtcbiAgICAgICAgdmFyIF9sYWJJbnRTcWRpc3QgPSBzcWRpc3QoX3JlZlB0LCBhcnJheTJwb2ludChfbGFiZWxJbnRlcnNlY3QpKTtcbiAgICAgICAgdmFyIF9taW5TcURpc3QgPSBfaW50U3FkaXN0O1xuICAgICAgICBpZiAoX2xhYkludFNxZGlzdCA8IF9pbnRTcWRpc3QpIHtcbiAgICAgICAgICBpbnRlcnNlY3QgPSBbX2xhYmVsSW50ZXJzZWN0WzBdLCBfbGFiZWxJbnRlcnNlY3RbMV1dO1xuICAgICAgICAgIF9taW5TcURpc3QgPSBfbGFiSW50U3FkaXN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChfbGFiZWxJbnRlcnNlY3QubGVuZ3RoID4gMikge1xuICAgICAgICAgIHZhciBfbGFiSW50MlNxRGlzdCA9IHNxZGlzdChfcmVmUHQsIHtcbiAgICAgICAgICAgIHg6IF9sYWJlbEludGVyc2VjdFsyXSxcbiAgICAgICAgICAgIHk6IF9sYWJlbEludGVyc2VjdFszXVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChfbGFiSW50MlNxRGlzdCA8IF9taW5TcURpc3QpIHtcbiAgICAgICAgICAgIGludGVyc2VjdCA9IFtfbGFiZWxJbnRlcnNlY3RbMl0sIF9sYWJlbEludGVyc2VjdFszXV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHZhciBhcnJvd1N0YXJ0ID0gc2hvcnRlbkludGVyc2VjdGlvbihpbnRlcnNlY3QsIHAyLCByLmFycm93U2hhcGVzW3NyY0FyU2hhcGVdLnNwYWNpbmcoZWRnZSkgKyBzcmNEaXN0KTtcbiAgdmFyIGVkZ2VTdGFydCA9IHNob3J0ZW5JbnRlcnNlY3Rpb24oaW50ZXJzZWN0LCBwMiwgci5hcnJvd1NoYXBlc1tzcmNBclNoYXBlXS5nYXAoZWRnZSkgKyBzcmNEaXN0KTtcbiAgcnMuc3RhcnRYID0gZWRnZVN0YXJ0WzBdO1xuICBycy5zdGFydFkgPSBlZGdlU3RhcnRbMV07XG4gIHJzLmFycm93U3RhcnRYID0gYXJyb3dTdGFydFswXTtcbiAgcnMuYXJyb3dTdGFydFkgPSBhcnJvd1N0YXJ0WzFdO1xuICBpZiAoaGFzRW5kcHRzKSB7XG4gICAgaWYgKCFudW1iZXIkMShycy5zdGFydFgpIHx8ICFudW1iZXIkMShycy5zdGFydFkpIHx8ICFudW1iZXIkMShycy5lbmRYKSB8fCAhbnVtYmVyJDEocnMuZW5kWSkpIHtcbiAgICAgIHJzLmJhZExpbmUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBycy5iYWRMaW5lID0gZmFsc2U7XG4gICAgfVxuICB9XG59O1xuQlJwJGIuZ2V0U291cmNlRW5kcG9pbnQgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICB0aGlzLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZShlZGdlKTtcbiAgc3dpdGNoIChycy5lZGdlVHlwZSkge1xuICAgIGNhc2UgJ2hheXN0YWNrJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHJzLmhheXN0YWNrUHRzWzBdLFxuICAgICAgICB5OiBycy5oYXlzdGFja1B0c1sxXVxuICAgICAgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogcnMuYXJyb3dTdGFydFgsXG4gICAgICAgIHk6IHJzLmFycm93U3RhcnRZXG4gICAgICB9O1xuICB9XG59O1xuQlJwJGIuZ2V0VGFyZ2V0RW5kcG9pbnQgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICB0aGlzLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZShlZGdlKTtcbiAgc3dpdGNoIChycy5lZGdlVHlwZSkge1xuICAgIGNhc2UgJ2hheXN0YWNrJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHJzLmhheXN0YWNrUHRzWzJdLFxuICAgICAgICB5OiBycy5oYXlzdGFja1B0c1szXVxuICAgICAgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogcnMuYXJyb3dFbmRYLFxuICAgICAgICB5OiBycy5hcnJvd0VuZFlcbiAgICAgIH07XG4gIH1cbn07XG5cbnZhciBCUnAkYSA9IHt9O1xuZnVuY3Rpb24gcHVzaEJlemllclB0cyhyLCBlZGdlLCBwdHMpIHtcbiAgdmFyIHFiZXppZXJBdCQxID0gZnVuY3Rpb24gcWJlemllckF0JDEocDEsIHAyLCBwMywgdCkge1xuICAgIHJldHVybiBxYmV6aWVyQXQocDEsIHAyLCBwMywgdCk7XG4gIH07XG4gIHZhciBfcCA9IGVkZ2UuX3ByaXZhdGU7XG4gIHZhciBicHRzID0gX3AucnN0eWxlLmJlemllclB0cztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByLmJlemllclByb2pQY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHAgPSByLmJlemllclByb2pQY3RzW2ldO1xuICAgIGJwdHMucHVzaCh7XG4gICAgICB4OiBxYmV6aWVyQXQkMShwdHNbMF0sIHB0c1syXSwgcHRzWzRdLCBwKSxcbiAgICAgIHk6IHFiZXppZXJBdCQxKHB0c1sxXSwgcHRzWzNdLCBwdHNbNV0sIHApXG4gICAgfSk7XG4gIH1cbn1cbkJScCRhLnN0b3JlRWRnZVByb2plY3Rpb25zID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHZhciBldCA9IHJzLmVkZ2VUeXBlO1xuXG4gIC8vIGNsZWFyIHRoZSBjYWNoZWQgcG9pbnRzIHN0YXRlXG4gIF9wLnJzdHlsZS5iZXppZXJQdHMgPSBudWxsO1xuICBfcC5yc3R5bGUubGluZVB0cyA9IG51bGw7XG4gIF9wLnJzdHlsZS5oYXlzdGFja1B0cyA9IG51bGw7XG4gIGlmIChldCA9PT0gJ211bHRpYmV6aWVyJyB8fCBldCA9PT0gJ2JlemllcicgfHwgZXQgPT09ICdzZWxmJyB8fCBldCA9PT0gJ2NvbXBvdW5kJykge1xuICAgIF9wLnJzdHlsZS5iZXppZXJQdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSArIDUgPCBycy5hbGxwdHMubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgIHB1c2hCZXppZXJQdHModGhpcywgZWRnZSwgcnMuYWxscHRzLnNsaWNlKGksIGkgKyA2KSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGV0ID09PSAnc2VnbWVudHMnKSB7XG4gICAgdmFyIGxwdHMgPSBfcC5yc3R5bGUubGluZVB0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpICsgMSA8IHJzLmFsbHB0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgbHB0cy5wdXNoKHtcbiAgICAgICAgeDogcnMuYWxscHRzW2ldLFxuICAgICAgICB5OiBycy5hbGxwdHNbaSArIDFdXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXQgPT09ICdoYXlzdGFjaycpIHtcbiAgICB2YXIgaHB0cyA9IHJzLmhheXN0YWNrUHRzO1xuICAgIF9wLnJzdHlsZS5oYXlzdGFja1B0cyA9IFt7XG4gICAgICB4OiBocHRzWzBdLFxuICAgICAgeTogaHB0c1sxXVxuICAgIH0sIHtcbiAgICAgIHg6IGhwdHNbMl0sXG4gICAgICB5OiBocHRzWzNdXG4gICAgfV07XG4gIH1cbiAgX3AucnN0eWxlLmFycm93V2lkdGggPSB0aGlzLmdldEFycm93V2lkdGgoZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZSwgZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWUpICogdGhpcy5hcnJvd1NoYXBlV2lkdGg7XG59O1xuQlJwJGEucmVjYWxjdWxhdGVFZGdlUHJvamVjdGlvbnMgPSBmdW5jdGlvbiAoZWRnZXMpIHtcbiAgdGhpcy5maW5kRWRnZUNvbnRyb2xQb2ludHMoZWRnZXMpO1xufTtcblxuLyogZ2xvYmFsIGRvY3VtZW50ICovXG5cbnZhciBCUnAkOSA9IHt9O1xuQlJwJDkucmVjYWxjdWxhdGVOb2RlTGFiZWxQcm9qZWN0aW9uID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIGNvbnRlbnQgPSBub2RlLnBzdHlsZSgnbGFiZWwnKS5zdHJWYWx1ZTtcbiAgaWYgKGVtcHR5U3RyaW5nKGNvbnRlbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciB0ZXh0WCwgdGV4dFk7XG4gIHZhciBfcCA9IG5vZGUuX3ByaXZhdGU7XG4gIHZhciBub2RlV2lkdGggPSBub2RlLndpZHRoKCk7XG4gIHZhciBub2RlSGVpZ2h0ID0gbm9kZS5oZWlnaHQoKTtcbiAgdmFyIHBhZGRpbmcgPSBub2RlLnBhZGRpbmcoKTtcbiAgdmFyIG5vZGVQb3MgPSBub2RlLnBvc2l0aW9uKCk7XG4gIHZhciB0ZXh0SGFsaWduID0gbm9kZS5wc3R5bGUoJ3RleHQtaGFsaWduJykuc3RyVmFsdWU7XG4gIHZhciB0ZXh0VmFsaWduID0gbm9kZS5wc3R5bGUoJ3RleHQtdmFsaWduJykuc3RyVmFsdWU7XG4gIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuICB2YXIgcnN0eWxlID0gX3AucnN0eWxlO1xuICBzd2l0Y2ggKHRleHRIYWxpZ24pIHtcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIHRleHRYID0gbm9kZVBvcy54IC0gbm9kZVdpZHRoIC8gMiAtIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyaWdodCc6XG4gICAgICB0ZXh0WCA9IG5vZGVQb3MueCArIG5vZGVXaWR0aCAvIDIgKyBwYWRkaW5nO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGUuZy4gY2VudGVyXG4gICAgICB0ZXh0WCA9IG5vZGVQb3MueDtcbiAgfVxuICBzd2l0Y2ggKHRleHRWYWxpZ24pIHtcbiAgICBjYXNlICd0b3AnOlxuICAgICAgdGV4dFkgPSBub2RlUG9zLnkgLSBub2RlSGVpZ2h0IC8gMiAtIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdib3R0b20nOlxuICAgICAgdGV4dFkgPSBub2RlUG9zLnkgKyBub2RlSGVpZ2h0IC8gMiArIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gZS5nLiBtaWRkbGVcbiAgICAgIHRleHRZID0gbm9kZVBvcy55O1xuICB9XG4gIHJzLmxhYmVsWCA9IHRleHRYO1xuICBycy5sYWJlbFkgPSB0ZXh0WTtcbiAgcnN0eWxlLmxhYmVsWCA9IHRleHRYO1xuICByc3R5bGUubGFiZWxZID0gdGV4dFk7XG4gIHRoaXMuY2FsY3VsYXRlTGFiZWxBbmdsZXMobm9kZSk7XG4gIHRoaXMuYXBwbHlMYWJlbERpbWVuc2lvbnMobm9kZSk7XG59O1xudmFyIGxpbmVBbmdsZUZyb21EZWx0YSA9IGZ1bmN0aW9uIGxpbmVBbmdsZUZyb21EZWx0YShkeCwgZHkpIHtcbiAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuKGR5IC8gZHgpO1xuICBpZiAoZHggPT09IDAgJiYgYW5nbGUgPCAwKSB7XG4gICAgYW5nbGUgPSBhbmdsZSAqIC0xO1xuICB9XG4gIHJldHVybiBhbmdsZTtcbn07XG52YXIgbGluZUFuZ2xlID0gZnVuY3Rpb24gbGluZUFuZ2xlKHAwLCBwMSkge1xuICB2YXIgZHggPSBwMS54IC0gcDAueDtcbiAgdmFyIGR5ID0gcDEueSAtIHAwLnk7XG4gIHJldHVybiBsaW5lQW5nbGVGcm9tRGVsdGEoZHgsIGR5KTtcbn07XG52YXIgYmV6aWVyQW5nbGUgPSBmdW5jdGlvbiBiZXppZXJBbmdsZShwMCwgcDEsIHAyLCB0KSB7XG4gIHZhciB0MCA9IGJvdW5kKDAsIHQgLSAwLjAwMSwgMSk7XG4gIHZhciB0MSA9IGJvdW5kKDAsIHQgKyAwLjAwMSwgMSk7XG4gIHZhciBscDAgPSBxYmV6aWVyUHRBdChwMCwgcDEsIHAyLCB0MCk7XG4gIHZhciBscDEgPSBxYmV6aWVyUHRBdChwMCwgcDEsIHAyLCB0MSk7XG4gIHJldHVybiBsaW5lQW5nbGUobHAwLCBscDEpO1xufTtcbkJScCQ5LnJlY2FsY3VsYXRlRWRnZUxhYmVsUHJvamVjdGlvbnMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcDtcbiAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGNvbnRlbnQgPSB7XG4gICAgbWlkOiBlZGdlLnBzdHlsZSgnbGFiZWwnKS5zdHJWYWx1ZSxcbiAgICBzb3VyY2U6IGVkZ2UucHN0eWxlKCdzb3VyY2UtbGFiZWwnKS5zdHJWYWx1ZSxcbiAgICB0YXJnZXQ6IGVkZ2UucHN0eWxlKCd0YXJnZXQtbGFiZWwnKS5zdHJWYWx1ZVxuICB9O1xuICBpZiAoY29udGVudC5taWQgfHwgY29udGVudC5zb3VyY2UgfHwgY29udGVudC50YXJnZXQpIDsgZWxzZSB7XG4gICAgcmV0dXJuOyAvLyBubyBsYWJlbHMgPT4gbm8gY2FsY3NcbiAgfVxuXG4gIC8vIGFkZCBjZW50ZXIgcG9pbnQgdG8gc3R5bGUgc28gYm91bmRpbmcgYm94IGNhbGN1bGF0aW9ucyBjYW4gdXNlIGl0XG4gIC8vXG4gIHAgPSB7XG4gICAgeDogcnMubWlkWCxcbiAgICB5OiBycy5taWRZXG4gIH07XG4gIHZhciBzZXRScyA9IGZ1bmN0aW9uIHNldFJzKHByb3BOYW1lLCBwcmVmaXgsIHZhbHVlKSB7XG4gICAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgcHJvcE5hbWUsIHByZWZpeCwgdmFsdWUpO1xuICAgIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnN0eWxlLCBwcm9wTmFtZSwgcHJlZml4LCB2YWx1ZSk7XG4gIH07XG4gIHNldFJzKCdsYWJlbFgnLCBudWxsLCBwLngpO1xuICBzZXRScygnbGFiZWxZJywgbnVsbCwgcC55KTtcbiAgdmFyIG1pZEFuZ2xlID0gbGluZUFuZ2xlRnJvbURlbHRhKHJzLm1pZERpc3BYLCBycy5taWREaXNwWSk7XG4gIHNldFJzKCdsYWJlbEF1dG9BbmdsZScsIG51bGwsIG1pZEFuZ2xlKTtcbiAgdmFyIGNyZWF0ZUNvbnRyb2xQb2ludEluZm8gPSBmdW5jdGlvbiBjcmVhdGVDb250cm9sUG9pbnRJbmZvKCkge1xuICAgIGlmIChjcmVhdGVDb250cm9sUG9pbnRJbmZvLmNhY2hlKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQ29udHJvbFBvaW50SW5mby5jYWNoZTtcbiAgICB9IC8vIHVzZSBjYWNoZSBzbyBvbmx5IDF4IHBlciBlZGdlXG5cbiAgICB2YXIgY3RybHB0cyA9IFtdO1xuXG4gICAgLy8gc3RvcmUgZWFjaCBjdHJscHQgaW5mbyBpbml0XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgKyA1IDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICB2YXIgcDAgPSB7XG4gICAgICAgIHg6IHJzLmFsbHB0c1tpXSxcbiAgICAgICAgeTogcnMuYWxscHRzW2kgKyAxXVxuICAgICAgfTtcbiAgICAgIHZhciBwMSA9IHtcbiAgICAgICAgeDogcnMuYWxscHRzW2kgKyAyXSxcbiAgICAgICAgeTogcnMuYWxscHRzW2kgKyAzXVxuICAgICAgfTsgLy8gY3RybHB0XG4gICAgICB2YXIgcDIgPSB7XG4gICAgICAgIHg6IHJzLmFsbHB0c1tpICsgNF0sXG4gICAgICAgIHk6IHJzLmFsbHB0c1tpICsgNV1cbiAgICAgIH07XG4gICAgICBjdHJscHRzLnB1c2goe1xuICAgICAgICBwMDogcDAsXG4gICAgICAgIHAxOiBwMSxcbiAgICAgICAgcDI6IHAyLFxuICAgICAgICBzdGFydERpc3Q6IDAsXG4gICAgICAgIGxlbmd0aDogMCxcbiAgICAgICAgc2VnbWVudHM6IFtdXG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIGJwdHMgPSBfcC5yc3R5bGUuYmV6aWVyUHRzO1xuICAgIHZhciBuUHJvanMgPSByLmJlemllclByb2pQY3RzLmxlbmd0aDtcbiAgICBmdW5jdGlvbiBhZGRTZWdtZW50KGNwLCBwMCwgcDEsIHQwLCB0MSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGRpc3QocDAsIHAxKTtcbiAgICAgIHZhciBwcmV2U2VnbWVudCA9IGNwLnNlZ21lbnRzW2NwLnNlZ21lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIHNlZ21lbnQgPSB7XG4gICAgICAgIHAwOiBwMCxcbiAgICAgICAgcDE6IHAxLFxuICAgICAgICB0MDogdDAsXG4gICAgICAgIHQxOiB0MSxcbiAgICAgICAgc3RhcnREaXN0OiBwcmV2U2VnbWVudCA/IHByZXZTZWdtZW50LnN0YXJ0RGlzdCArIHByZXZTZWdtZW50Lmxlbmd0aCA6IDAsXG4gICAgICAgIGxlbmd0aDogbGVuZ3RoXG4gICAgICB9O1xuICAgICAgY3Auc2VnbWVudHMucHVzaChzZWdtZW50KTtcbiAgICAgIGNwLmxlbmd0aCArPSBsZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGVhY2ggY3RybHB0IHdpdGggc2VnbWVudCBpbmZvXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGN0cmxwdHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgY3AgPSBjdHJscHRzW19pXTtcbiAgICAgIHZhciBwcmV2Q3AgPSBjdHJscHRzW19pIC0gMV07XG4gICAgICBpZiAocHJldkNwKSB7XG4gICAgICAgIGNwLnN0YXJ0RGlzdCA9IHByZXZDcC5zdGFydERpc3QgKyBwcmV2Q3AubGVuZ3RoO1xuICAgICAgfVxuICAgICAgYWRkU2VnbWVudChjcCwgY3AucDAsIGJwdHNbX2kgKiBuUHJvanNdLCAwLCByLmJlemllclByb2pQY3RzWzBdKTsgLy8gZmlyc3RcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuUHJvanMgLSAxOyBqKyspIHtcbiAgICAgICAgYWRkU2VnbWVudChjcCwgYnB0c1tfaSAqIG5Qcm9qcyArIGpdLCBicHRzW19pICogblByb2pzICsgaiArIDFdLCByLmJlemllclByb2pQY3RzW2pdLCByLmJlemllclByb2pQY3RzW2ogKyAxXSk7XG4gICAgICB9XG4gICAgICBhZGRTZWdtZW50KGNwLCBicHRzW19pICogblByb2pzICsgblByb2pzIC0gMV0sIGNwLnAyLCByLmJlemllclByb2pQY3RzW25Qcm9qcyAtIDFdLCAxKTsgLy8gbGFzdFxuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVDb250cm9sUG9pbnRJbmZvLmNhY2hlID0gY3RybHB0cztcbiAgfTtcbiAgdmFyIGNhbGN1bGF0ZUVuZFByb2plY3Rpb24gPSBmdW5jdGlvbiBjYWxjdWxhdGVFbmRQcm9qZWN0aW9uKHByZWZpeCkge1xuICAgIHZhciBhbmdsZTtcbiAgICB2YXIgaXNTcmMgPSBwcmVmaXggPT09ICdzb3VyY2UnO1xuICAgIGlmICghY29udGVudFtwcmVmaXhdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBvZmZzZXQgPSBlZGdlLnBzdHlsZShwcmVmaXggKyAnLXRleHQtb2Zmc2V0JykucGZWYWx1ZTtcbiAgICBzd2l0Y2ggKHJzLmVkZ2VUeXBlKSB7XG4gICAgICBjYXNlICdzZWxmJzpcbiAgICAgIGNhc2UgJ2NvbXBvdW5kJzpcbiAgICAgIGNhc2UgJ2Jlemllcic6XG4gICAgICBjYXNlICdtdWx0aWJlemllcic6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgY3BzID0gY3JlYXRlQ29udHJvbFBvaW50SW5mbygpO1xuICAgICAgICAgIHZhciBzZWxlY3RlZDtcbiAgICAgICAgICB2YXIgc3RhcnREaXN0ID0gMDtcbiAgICAgICAgICB2YXIgdG90YWxEaXN0ID0gMDtcblxuICAgICAgICAgIC8vIGZpbmQgdGhlIHNlZ21lbnQgd2UncmUgb25cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIF9jcCA9IGNwc1tpc1NyYyA/IGkgOiBjcHMubGVuZ3RoIC0gMSAtIGldO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBfY3Auc2VnbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgdmFyIF9zZWcgPSBfY3Auc2VnbWVudHNbaXNTcmMgPyBqIDogX2NwLnNlZ21lbnRzLmxlbmd0aCAtIDEgLSBqXTtcbiAgICAgICAgICAgICAgdmFyIGxhc3RTZWcgPSBpID09PSBjcHMubGVuZ3RoIC0gMSAmJiBqID09PSBfY3Auc2VnbWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgc3RhcnREaXN0ID0gdG90YWxEaXN0O1xuICAgICAgICAgICAgICB0b3RhbERpc3QgKz0gX3NlZy5sZW5ndGg7XG4gICAgICAgICAgICAgIGlmICh0b3RhbERpc3QgPj0gb2Zmc2V0IHx8IGxhc3RTZWcpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHtcbiAgICAgICAgICAgICAgICAgIGNwOiBfY3AsXG4gICAgICAgICAgICAgICAgICBzZWdtZW50OiBfc2VnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgY3AgPSBzZWxlY3RlZC5jcDtcbiAgICAgICAgICB2YXIgc2VnID0gc2VsZWN0ZWQuc2VnbWVudDtcbiAgICAgICAgICB2YXIgdFNlZ21lbnQgPSAob2Zmc2V0IC0gc3RhcnREaXN0KSAvIHNlZy5sZW5ndGg7XG4gICAgICAgICAgdmFyIHNlZ0R0ID0gc2VnLnQxIC0gc2VnLnQwO1xuICAgICAgICAgIHZhciB0ID0gaXNTcmMgPyBzZWcudDAgKyBzZWdEdCAqIHRTZWdtZW50IDogc2VnLnQxIC0gc2VnRHQgKiB0U2VnbWVudDtcbiAgICAgICAgICB0ID0gYm91bmQoMCwgdCwgMSk7XG4gICAgICAgICAgcCA9IHFiZXppZXJQdEF0KGNwLnAwLCBjcC5wMSwgY3AucDIsIHQpO1xuICAgICAgICAgIGFuZ2xlID0gYmV6aWVyQW5nbGUoY3AucDAsIGNwLnAxLCBjcC5wMiwgdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmFpZ2h0JzpcbiAgICAgIGNhc2UgJ3NlZ21lbnRzJzpcbiAgICAgIGNhc2UgJ2hheXN0YWNrJzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBkID0gMCxcbiAgICAgICAgICAgIGRpLFxuICAgICAgICAgICAgZDA7XG4gICAgICAgICAgdmFyIHAwLCBwMTtcbiAgICAgICAgICB2YXIgbCA9IHJzLmFsbHB0cy5sZW5ndGg7XG4gICAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyICsgMyA8IGw7IF9pMiArPSAyKSB7XG4gICAgICAgICAgICBpZiAoaXNTcmMpIHtcbiAgICAgICAgICAgICAgcDAgPSB7XG4gICAgICAgICAgICAgICAgeDogcnMuYWxscHRzW19pMl0sXG4gICAgICAgICAgICAgICAgeTogcnMuYWxscHRzW19pMiArIDFdXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHAxID0ge1xuICAgICAgICAgICAgICAgIHg6IHJzLmFsbHB0c1tfaTIgKyAyXSxcbiAgICAgICAgICAgICAgICB5OiBycy5hbGxwdHNbX2kyICsgM11cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHAwID0ge1xuICAgICAgICAgICAgICAgIHg6IHJzLmFsbHB0c1tsIC0gMiAtIF9pMl0sXG4gICAgICAgICAgICAgICAgeTogcnMuYWxscHRzW2wgLSAxIC0gX2kyXVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBwMSA9IHtcbiAgICAgICAgICAgICAgICB4OiBycy5hbGxwdHNbbCAtIDQgLSBfaTJdLFxuICAgICAgICAgICAgICAgIHk6IHJzLmFsbHB0c1tsIC0gMyAtIF9pMl1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpID0gZGlzdChwMCwgcDEpO1xuICAgICAgICAgICAgZDAgPSBkO1xuICAgICAgICAgICAgZCArPSBkaTtcbiAgICAgICAgICAgIGlmIChkID49IG9mZnNldCkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHBEID0gb2Zmc2V0IC0gZDA7XG4gICAgICAgICAgdmFyIF90ID0gcEQgLyBkaTtcbiAgICAgICAgICBfdCA9IGJvdW5kKDAsIF90LCAxKTtcbiAgICAgICAgICBwID0gbGluZUF0KHAwLCBwMSwgX3QpO1xuICAgICAgICAgIGFuZ2xlID0gbGluZUFuZ2xlKHAwLCBwMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0UnMoJ2xhYmVsWCcsIHByZWZpeCwgcC54KTtcbiAgICBzZXRScygnbGFiZWxZJywgcHJlZml4LCBwLnkpO1xuICAgIHNldFJzKCdsYWJlbEF1dG9BbmdsZScsIHByZWZpeCwgYW5nbGUpO1xuICB9O1xuICBjYWxjdWxhdGVFbmRQcm9qZWN0aW9uKCdzb3VyY2UnKTtcbiAgY2FsY3VsYXRlRW5kUHJvamVjdGlvbigndGFyZ2V0Jyk7XG4gIHRoaXMuYXBwbHlMYWJlbERpbWVuc2lvbnMoZWRnZSk7XG59O1xuQlJwJDkuYXBwbHlMYWJlbERpbWVuc2lvbnMgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHRoaXMuYXBwbHlQcmVmaXhlZExhYmVsRGltZW5zaW9ucyhlbGUpO1xuICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgdGhpcy5hcHBseVByZWZpeGVkTGFiZWxEaW1lbnNpb25zKGVsZSwgJ3NvdXJjZScpO1xuICAgIHRoaXMuYXBwbHlQcmVmaXhlZExhYmVsRGltZW5zaW9ucyhlbGUsICd0YXJnZXQnKTtcbiAgfVxufTtcbkJScCQ5LmFwcGx5UHJlZml4ZWRMYWJlbERpbWVuc2lvbnMgPSBmdW5jdGlvbiAoZWxlLCBwcmVmaXgpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgdGV4dCA9IHRoaXMuZ2V0TGFiZWxUZXh0KGVsZSwgcHJlZml4KTtcbiAgdmFyIGxhYmVsRGltcyA9IHRoaXMuY2FsY3VsYXRlTGFiZWxEaW1lbnNpb25zKGVsZSwgdGV4dCk7XG4gIHZhciBsaW5lSGVpZ2h0ID0gZWxlLnBzdHlsZSgnbGluZS1oZWlnaHQnKS5wZlZhbHVlO1xuICB2YXIgdGV4dFdyYXAgPSBlbGUucHN0eWxlKCd0ZXh0LXdyYXAnKS5zdHJWYWx1ZTtcbiAgdmFyIGxpbmVzID0gZ2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgJ2xhYmVsV3JhcENhY2hlZExpbmVzJywgcHJlZml4KSB8fCBbXTtcbiAgdmFyIG51bUxpbmVzID0gdGV4dFdyYXAgIT09ICd3cmFwJyA/IDEgOiBNYXRoLm1heChsaW5lcy5sZW5ndGgsIDEpO1xuICB2YXIgbm9ybVBlckxpbmVIZWlnaHQgPSBsYWJlbERpbXMuaGVpZ2h0IC8gbnVtTGluZXM7XG4gIHZhciBsYWJlbExpbmVIZWlnaHQgPSBub3JtUGVyTGluZUhlaWdodCAqIGxpbmVIZWlnaHQ7XG4gIHZhciB3aWR0aCA9IGxhYmVsRGltcy53aWR0aDtcbiAgdmFyIGhlaWdodCA9IGxhYmVsRGltcy5oZWlnaHQgKyAobnVtTGluZXMgLSAxKSAqIChsaW5lSGVpZ2h0IC0gMSkgKiBub3JtUGVyTGluZUhlaWdodDtcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc3R5bGUsICdsYWJlbFdpZHRoJywgcHJlZml4LCB3aWR0aCk7XG4gIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnNjcmF0Y2gsICdsYWJlbFdpZHRoJywgcHJlZml4LCB3aWR0aCk7XG4gIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnN0eWxlLCAnbGFiZWxIZWlnaHQnLCBwcmVmaXgsIGhlaWdodCk7XG4gIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnNjcmF0Y2gsICdsYWJlbEhlaWdodCcsIHByZWZpeCwgaGVpZ2h0KTtcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgJ2xhYmVsTGluZUhlaWdodCcsIHByZWZpeCwgbGFiZWxMaW5lSGVpZ2h0KTtcbn07XG5CUnAkOS5nZXRMYWJlbFRleHQgPSBmdW5jdGlvbiAoZWxlLCBwcmVmaXgpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcGZkID0gcHJlZml4ID8gcHJlZml4ICsgJy0nIDogJyc7XG4gIHZhciB0ZXh0ID0gZWxlLnBzdHlsZShwZmQgKyAnbGFiZWwnKS5zdHJWYWx1ZTtcbiAgdmFyIHRleHRUcmFuc2Zvcm0gPSBlbGUucHN0eWxlKCd0ZXh0LXRyYW5zZm9ybScpLnZhbHVlO1xuICB2YXIgcnNjcmF0Y2ggPSBmdW5jdGlvbiByc2NyYXRjaChwcm9wTmFtZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnNjcmF0Y2gsIHByb3BOYW1lLCBwcmVmaXgsIHZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldFByZWZpeGVkUHJvcGVydHkoX3AucnNjcmF0Y2gsIHByb3BOYW1lLCBwcmVmaXgpO1xuICAgIH1cbiAgfTtcblxuICAvLyBmb3IgZW1wdHkgdGV4dCwgc2tpcCBhbGwgcHJvY2Vzc2luZ1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgaWYgKHRleHRUcmFuc2Zvcm0gPT0gJ25vbmUnKSA7IGVsc2UgaWYgKHRleHRUcmFuc2Zvcm0gPT0gJ3VwcGVyY2FzZScpIHtcbiAgICB0ZXh0ID0gdGV4dC50b1VwcGVyQ2FzZSgpO1xuICB9IGVsc2UgaWYgKHRleHRUcmFuc2Zvcm0gPT0gJ2xvd2VyY2FzZScpIHtcbiAgICB0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHZhciB3cmFwU3R5bGUgPSBlbGUucHN0eWxlKCd0ZXh0LXdyYXAnKS52YWx1ZTtcbiAgaWYgKHdyYXBTdHlsZSA9PT0gJ3dyYXAnKSB7XG4gICAgdmFyIGxhYmVsS2V5ID0gcnNjcmF0Y2goJ2xhYmVsS2V5Jyk7XG5cbiAgICAvLyBzYXZlIHJlY2FsYyBpZiB0aGUgbGFiZWwgaXMgdGhlIHNhbWUgYXMgYmVmb3JlXG4gICAgaWYgKGxhYmVsS2V5ICE9IG51bGwgJiYgcnNjcmF0Y2goJ2xhYmVsV3JhcEtleScpID09PSBsYWJlbEtleSkge1xuICAgICAgcmV0dXJuIHJzY3JhdGNoKCdsYWJlbFdyYXBDYWNoZWRUZXh0Jyk7XG4gICAgfVxuICAgIHZhciB6d3NwID0gXCJcXHUyMDBCXCI7XG4gICAgdmFyIGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgdmFyIG1heFcgPSBlbGUucHN0eWxlKCd0ZXh0LW1heC13aWR0aCcpLnBmVmFsdWU7XG4gICAgdmFyIG92ZXJmbG93ID0gZWxlLnBzdHlsZSgndGV4dC1vdmVyZmxvdy13cmFwJykudmFsdWU7XG4gICAgdmFyIG92ZXJmbG93QW55ID0gb3ZlcmZsb3cgPT09ICdhbnl3aGVyZSc7XG4gICAgdmFyIHdyYXBwZWRMaW5lcyA9IFtdO1xuICAgIHZhciB3b3Jkc1JlZ2V4ID0gL1tcXHNcXHUyMDBiXSsvO1xuICAgIHZhciB3b3JkU2VwYXJhdG9yID0gb3ZlcmZsb3dBbnkgPyAnJyA6ICcgJztcbiAgICBmb3IgKHZhciBsID0gMDsgbCA8IGxpbmVzLmxlbmd0aDsgbCsrKSB7XG4gICAgICB2YXIgbGluZSA9IGxpbmVzW2xdO1xuICAgICAgdmFyIGxpbmVEaW1zID0gdGhpcy5jYWxjdWxhdGVMYWJlbERpbWVuc2lvbnMoZWxlLCBsaW5lKTtcbiAgICAgIHZhciBsaW5lVyA9IGxpbmVEaW1zLndpZHRoO1xuICAgICAgaWYgKG92ZXJmbG93QW55KSB7XG4gICAgICAgIHZhciBwcm9jZXNzZWRMaW5lID0gbGluZS5zcGxpdCgnJykuam9pbih6d3NwKTtcbiAgICAgICAgbGluZSA9IHByb2Nlc3NlZExpbmU7XG4gICAgICB9XG4gICAgICBpZiAobGluZVcgPiBtYXhXKSB7XG4gICAgICAgIC8vIGxpbmUgaXMgdG9vIGxvbmdcbiAgICAgICAgdmFyIHdvcmRzID0gbGluZS5zcGxpdCh3b3Jkc1JlZ2V4KTtcbiAgICAgICAgdmFyIHN1YmxpbmUgPSAnJztcbiAgICAgICAgZm9yICh2YXIgdyA9IDA7IHcgPCB3b3Jkcy5sZW5ndGg7IHcrKykge1xuICAgICAgICAgIHZhciB3b3JkID0gd29yZHNbd107XG4gICAgICAgICAgdmFyIHRlc3RMaW5lID0gc3VibGluZS5sZW5ndGggPT09IDAgPyB3b3JkIDogc3VibGluZSArIHdvcmRTZXBhcmF0b3IgKyB3b3JkO1xuICAgICAgICAgIHZhciB0ZXN0RGltcyA9IHRoaXMuY2FsY3VsYXRlTGFiZWxEaW1lbnNpb25zKGVsZSwgdGVzdExpbmUpO1xuICAgICAgICAgIHZhciB0ZXN0VyA9IHRlc3REaW1zLndpZHRoO1xuICAgICAgICAgIGlmICh0ZXN0VyA8PSBtYXhXKSB7XG4gICAgICAgICAgICAvLyB3b3JkIGZpdHMgb24gY3VycmVudCBsaW5lXG4gICAgICAgICAgICBzdWJsaW5lICs9IHdvcmQgKyB3b3JkU2VwYXJhdG9yO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB3b3JkIHN0YXJ0cyBuZXcgbGluZVxuICAgICAgICAgICAgaWYgKHN1YmxpbmUpIHtcbiAgICAgICAgICAgICAgd3JhcHBlZExpbmVzLnB1c2goc3VibGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWJsaW5lID0gd29yZCArIHdvcmRTZXBhcmF0b3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgdGhlcmUncyByZW1haW5pbmcgdGV4dCwgcHV0IGl0IGluIGEgd3JhcHBlZCBsaW5lXG4gICAgICAgIGlmICghc3VibGluZS5tYXRjaCgvXltcXHNcXHUyMDBiXSskLykpIHtcbiAgICAgICAgICB3cmFwcGVkTGluZXMucHVzaChzdWJsaW5lKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbGluZSBpcyBhbHJlYWR5IHNob3J0IGVub3VnaFxuICAgICAgICB3cmFwcGVkTGluZXMucHVzaChsaW5lKTtcbiAgICAgIH1cbiAgICB9IC8vIGZvclxuXG4gICAgcnNjcmF0Y2goJ2xhYmVsV3JhcENhY2hlZExpbmVzJywgd3JhcHBlZExpbmVzKTtcbiAgICB0ZXh0ID0gcnNjcmF0Y2goJ2xhYmVsV3JhcENhY2hlZFRleHQnLCB3cmFwcGVkTGluZXMuam9pbignXFxuJykpO1xuICAgIHJzY3JhdGNoKCdsYWJlbFdyYXBLZXknLCBsYWJlbEtleSk7XG4gIH0gZWxzZSBpZiAod3JhcFN0eWxlID09PSAnZWxsaXBzaXMnKSB7XG4gICAgdmFyIF9tYXhXID0gZWxlLnBzdHlsZSgndGV4dC1tYXgtd2lkdGgnKS5wZlZhbHVlO1xuICAgIHZhciBlbGxpcHNpemVkID0gJyc7XG4gICAgdmFyIGVsbGlwc2lzID0gXCJcXHUyMDI2XCI7XG4gICAgdmFyIGluY0xhc3RDaCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyhlbGUsIHRleHQpLndpZHRoIDwgX21heFcpIHtcbiAgICAgIC8vIHRoZSBsYWJlbCBhbHJlYWR5IGZpdHNcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3aWR0aFdpdGhOZXh0Q2ggPSB0aGlzLmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyhlbGUsIGVsbGlwc2l6ZWQgKyB0ZXh0W2ldICsgZWxsaXBzaXMpLndpZHRoO1xuICAgICAgaWYgKHdpZHRoV2l0aE5leHRDaCA+IF9tYXhXKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZWxsaXBzaXplZCArPSB0ZXh0W2ldO1xuICAgICAgaWYgKGkgPT09IHRleHQubGVuZ3RoIC0gMSkge1xuICAgICAgICBpbmNMYXN0Q2ggPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWluY0xhc3RDaCkge1xuICAgICAgZWxsaXBzaXplZCArPSBlbGxpcHNpcztcbiAgICB9XG4gICAgcmV0dXJuIGVsbGlwc2l6ZWQ7XG4gIH0gLy8gaWYgZWxsaXBzaXplXG5cbiAgcmV0dXJuIHRleHQ7XG59O1xuQlJwJDkuZ2V0TGFiZWxKdXN0aWZpY2F0aW9uID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIganVzdGlmaWNhdGlvbiA9IGVsZS5wc3R5bGUoJ3RleHQtanVzdGlmaWNhdGlvbicpLnN0clZhbHVlO1xuICB2YXIgdGV4dEhhbGlnbiA9IGVsZS5wc3R5bGUoJ3RleHQtaGFsaWduJykuc3RyVmFsdWU7XG4gIGlmIChqdXN0aWZpY2F0aW9uID09PSAnYXV0bycpIHtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICBzd2l0Y2ggKHRleHRIYWxpZ24pIHtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICByZXR1cm4gJ2xlZnQnO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAnY2VudGVyJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdjZW50ZXInO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ganVzdGlmaWNhdGlvbjtcbiAgfVxufTtcbkJScCQ5LmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyA9IGZ1bmN0aW9uIChlbGUsIHRleHQpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgY2FjaGVLZXkgPSBoYXNoU3RyaW5nKHRleHQsIGVsZS5fcHJpdmF0ZS5sYWJlbERpbXNLZXkpO1xuICB2YXIgY2FjaGUgPSByLmxhYmVsRGltQ2FjaGUgfHwgKHIubGFiZWxEaW1DYWNoZSA9IFtdKTtcbiAgdmFyIGV4aXN0aW5nVmFsID0gY2FjaGVbY2FjaGVLZXldO1xuICBpZiAoZXhpc3RpbmdWYWwgIT0gbnVsbCkge1xuICAgIHJldHVybiBleGlzdGluZ1ZhbDtcbiAgfVxuICB2YXIgcGFkZGluZyA9IDA7IC8vIGFkZCBwYWRkaW5nIGFyb3VuZCB0ZXh0IGRpbXMsIGFzIHRoZSBtZWFzdXJlbWVudCBpc24ndCB0aGF0IGFjY3VyYXRlXG4gIHZhciBmU3R5bGUgPSBlbGUucHN0eWxlKCdmb250LXN0eWxlJykuc3RyVmFsdWU7XG4gIHZhciBzaXplID0gZWxlLnBzdHlsZSgnZm9udC1zaXplJykucGZWYWx1ZTtcbiAgdmFyIGZhbWlseSA9IGVsZS5wc3R5bGUoJ2ZvbnQtZmFtaWx5Jykuc3RyVmFsdWU7XG4gIHZhciB3ZWlnaHQgPSBlbGUucHN0eWxlKCdmb250LXdlaWdodCcpLnN0clZhbHVlO1xuICB2YXIgY2FudmFzID0gdGhpcy5sYWJlbENhbGNDYW52YXM7XG4gIHZhciBjMmQgPSB0aGlzLmxhYmVsQ2FsY0NhbnZhc0NvbnRleHQ7XG4gIGlmICghY2FudmFzKSB7XG4gICAgY2FudmFzID0gdGhpcy5sYWJlbENhbGNDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjMmQgPSB0aGlzLmxhYmVsQ2FsY0NhbnZhc0NvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICB2YXIgZHMgPSBjYW52YXMuc3R5bGU7XG4gICAgZHMucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGRzLmxlZnQgPSAnLTk5OTlweCc7XG4gICAgZHMudG9wID0gJy05OTk5cHgnO1xuICAgIGRzLnpJbmRleCA9ICctMSc7XG4gICAgZHMudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgIGRzLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gIH1cbiAgYzJkLmZvbnQgPSBcIlwiLmNvbmNhdChmU3R5bGUsIFwiIFwiKS5jb25jYXQod2VpZ2h0LCBcIiBcIikuY29uY2F0KHNpemUsIFwicHggXCIpLmNvbmNhdChmYW1pbHkpO1xuICB2YXIgd2lkdGggPSAwO1xuICB2YXIgaGVpZ2h0ID0gMDtcbiAgdmFyIGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbGluZSA9IGxpbmVzW2ldO1xuICAgIHZhciBtZXRyaWNzID0gYzJkLm1lYXN1cmVUZXh0KGxpbmUpO1xuICAgIHZhciB3ID0gTWF0aC5jZWlsKG1ldHJpY3Mud2lkdGgpO1xuICAgIHZhciBoID0gc2l6ZTtcbiAgICB3aWR0aCA9IE1hdGgubWF4KHcsIHdpZHRoKTtcbiAgICBoZWlnaHQgKz0gaDtcbiAgfVxuICB3aWR0aCArPSBwYWRkaW5nO1xuICBoZWlnaHQgKz0gcGFkZGluZztcbiAgcmV0dXJuIGNhY2hlW2NhY2hlS2V5XSA9IHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn07XG5CUnAkOS5jYWxjdWxhdGVMYWJlbEFuZ2xlID0gZnVuY3Rpb24gKGVsZSwgcHJlZml4KSB7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHZhciBpc0VkZ2UgPSBlbGUuaXNFZGdlKCk7XG4gIHZhciBwcmVmaXhEYXNoID0gcHJlZml4ID8gcHJlZml4ICsgJy0nIDogJyc7XG4gIHZhciByb3QgPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1yb3RhdGlvbicpO1xuICB2YXIgcm90U3RyID0gcm90LnN0clZhbHVlO1xuICBpZiAocm90U3RyID09PSAnbm9uZScpIHtcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIGlmIChpc0VkZ2UgJiYgcm90U3RyID09PSAnYXV0b3JvdGF0ZScpIHtcbiAgICByZXR1cm4gcnMubGFiZWxBdXRvQW5nbGU7XG4gIH0gZWxzZSBpZiAocm90U3RyID09PSAnYXV0b3JvdGF0ZScpIHtcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcm90LnBmVmFsdWU7XG4gIH1cbn07XG5CUnAkOS5jYWxjdWxhdGVMYWJlbEFuZ2xlcyA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgaXNFZGdlID0gZWxlLmlzRWRnZSgpO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuICBycy5sYWJlbEFuZ2xlID0gci5jYWxjdWxhdGVMYWJlbEFuZ2xlKGVsZSk7XG4gIGlmIChpc0VkZ2UpIHtcbiAgICBycy5zb3VyY2VMYWJlbEFuZ2xlID0gci5jYWxjdWxhdGVMYWJlbEFuZ2xlKGVsZSwgJ3NvdXJjZScpO1xuICAgIHJzLnRhcmdldExhYmVsQW5nbGUgPSByLmNhbGN1bGF0ZUxhYmVsQW5nbGUoZWxlLCAndGFyZ2V0Jyk7XG4gIH1cbn07XG5cbnZhciBCUnAkOCA9IHt9O1xudmFyIFRPT19TTUFMTF9DVVRfUkVDVCA9IDI4O1xudmFyIHdhcm5lZEN1dFJlY3QgPSBmYWxzZTtcbkJScCQ4LmdldE5vZGVTaGFwZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIHNoYXBlID0gbm9kZS5wc3R5bGUoJ3NoYXBlJykudmFsdWU7XG4gIGlmIChzaGFwZSA9PT0gJ2N1dHJlY3RhbmdsZScgJiYgKG5vZGUud2lkdGgoKSA8IFRPT19TTUFMTF9DVVRfUkVDVCB8fCBub2RlLmhlaWdodCgpIDwgVE9PX1NNQUxMX0NVVF9SRUNUKSkge1xuICAgIGlmICghd2FybmVkQ3V0UmVjdCkge1xuICAgICAgd2FybignVGhlIGBjdXRyZWN0YW5nbGVgIG5vZGUgc2hhcGUgY2FuIG5vdCBiZSB1c2VkIGF0IHNtYWxsIHNpemVzIHNvIGByZWN0YW5nbGVgIGlzIHVzZWQgaW5zdGVhZCcpO1xuICAgICAgd2FybmVkQ3V0UmVjdCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiAncmVjdGFuZ2xlJztcbiAgfVxuICBpZiAobm9kZS5pc1BhcmVudCgpKSB7XG4gICAgaWYgKHNoYXBlID09PSAncmVjdGFuZ2xlJyB8fCBzaGFwZSA9PT0gJ3JvdW5kcmVjdGFuZ2xlJyB8fCBzaGFwZSA9PT0gJ3JvdW5kLXJlY3RhbmdsZScgfHwgc2hhcGUgPT09ICdjdXRyZWN0YW5nbGUnIHx8IHNoYXBlID09PSAnY3V0LXJlY3RhbmdsZScgfHwgc2hhcGUgPT09ICdiYXJyZWwnKSB7XG4gICAgICByZXR1cm4gc2hhcGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAncmVjdGFuZ2xlJztcbiAgICB9XG4gIH1cbiAgaWYgKHNoYXBlID09PSAncG9seWdvbicpIHtcbiAgICB2YXIgcG9pbnRzID0gbm9kZS5wc3R5bGUoJ3NoYXBlLXBvbHlnb24tcG9pbnRzJykudmFsdWU7XG4gICAgcmV0dXJuIHIubm9kZVNoYXBlcy5tYWtlUG9seWdvbihwb2ludHMpLm5hbWU7XG4gIH1cbiAgcmV0dXJuIHNoYXBlO1xufTtcblxudmFyIEJScCQ3ID0ge307XG5CUnAkNy5yZWdpc3RlckNhbGN1bGF0aW9uTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY3kgPSB0aGlzLmN5O1xuICB2YXIgZWxlc1RvVXBkYXRlID0gY3kuY29sbGVjdGlvbigpO1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBlbnF1ZXVlID0gZnVuY3Rpb24gZW5xdWV1ZShlbGVzKSB7XG4gICAgdmFyIGRpcnR5U3R5bGVDYWNoZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gICAgZWxlc1RvVXBkYXRlLm1lcmdlKGVsZXMpO1xuICAgIGlmIChkaXJ0eVN0eWxlQ2FjaGVzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgICAgdmFyIHJzdHlsZSA9IF9wLnJzdHlsZTtcbiAgICAgICAgcnN0eWxlLmNsZWFuID0gZmFsc2U7XG4gICAgICAgIHJzdHlsZS5jbGVhbkNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgci5iaW5kZXIoY3kpLm9uKCdib3VuZHMuKiBkaXJ0eS4qJywgZnVuY3Rpb24gb25EaXJ0eUJvdW5kcyhlKSB7XG4gICAgdmFyIGVsZSA9IGUudGFyZ2V0O1xuICAgIGVucXVldWUoZWxlKTtcbiAgfSkub24oJ3N0eWxlLiogYmFja2dyb3VuZC4qJywgZnVuY3Rpb24gb25EaXJ0eVN0eWxlKGUpIHtcbiAgICB2YXIgZWxlID0gZS50YXJnZXQ7XG4gICAgZW5xdWV1ZShlbGUsIGZhbHNlKTtcbiAgfSk7XG4gIHZhciB1cGRhdGVFbGVDYWxjcyA9IGZ1bmN0aW9uIHVwZGF0ZUVsZUNhbGNzKHdpbGxEcmF3KSB7XG4gICAgaWYgKHdpbGxEcmF3KSB7XG4gICAgICB2YXIgZm5zID0gci5vblVwZGF0ZUVsZUNhbGNzRm5zO1xuXG4gICAgICAvLyBiZWNhdXNlIHdlIG5lZWQgdG8gaGF2ZSB1cC10by1kYXRlIHN0eWxlIChlLmcuIHN0eWxlc2hlZXQgbWFwcGVycylcbiAgICAgIC8vIGJlZm9yZSBjYWxjdWxhdGluZyByZW5kZXJlZCBzdHlsZSAoYW5kIHBzdHlsZSBtaWdodCBub3QgYmUgY2FsbGVkIHlldClcbiAgICAgIGVsZXNUb1VwZGF0ZS5jbGVhblN0eWxlKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXNUb1VwZGF0ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1RvVXBkYXRlW2ldO1xuICAgICAgICB2YXIgcnN0eWxlID0gZWxlLl9wcml2YXRlLnJzdHlsZTtcbiAgICAgICAgaWYgKGVsZS5pc05vZGUoKSAmJiAhcnN0eWxlLmNsZWFuQ29ubmVjdGVkKSB7XG4gICAgICAgICAgZW5xdWV1ZShlbGUuY29ubmVjdGVkRWRnZXMoKSk7XG4gICAgICAgICAgcnN0eWxlLmNsZWFuQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZucykge1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZm5zLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgIHZhciBmbiA9IGZuc1tfaV07XG4gICAgICAgICAgZm4od2lsbERyYXcsIGVsZXNUb1VwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHIucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVsZXNUb1VwZGF0ZSk7XG4gICAgICBlbGVzVG9VcGRhdGUgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgfVxuICB9O1xuICByLmZsdXNoUmVuZGVyZWRTdHlsZVF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgIHVwZGF0ZUVsZUNhbGNzKHRydWUpO1xuICB9O1xuICByLmJlZm9yZVJlbmRlcih1cGRhdGVFbGVDYWxjcywgci5iZWZvcmVSZW5kZXJQcmlvcml0aWVzLmVsZUNhbGNzKTtcbn07XG5CUnAkNy5vblVwZGF0ZUVsZUNhbGNzID0gZnVuY3Rpb24gKGZuKSB7XG4gIHZhciBmbnMgPSB0aGlzLm9uVXBkYXRlRWxlQ2FsY3NGbnMgPSB0aGlzLm9uVXBkYXRlRWxlQ2FsY3NGbnMgfHwgW107XG4gIGZucy5wdXNoKGZuKTtcbn07XG5CUnAkNy5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUgPSBmdW5jdGlvbiAoZWxlcywgdXNlQ2FjaGUpIHtcbiAgdmFyIGlzQ2xlYW5Db25uZWN0ZWQgPSBmdW5jdGlvbiBpc0NsZWFuQ29ubmVjdGVkKGVsZSkge1xuICAgIHJldHVybiBlbGUuX3ByaXZhdGUucnN0eWxlLmNsZWFuQ29ubmVjdGVkO1xuICB9O1xuICB2YXIgZWRnZXMgPSBbXTtcbiAgdmFyIG5vZGVzID0gW107XG5cbiAgLy8gdGhlIHJlbmRlcmVyIGNhbid0IGJlIHVzZWQgZm9yIGNhbGNzIHdoZW4gZGVzdHJveWVkLCBlLmcuIGVsZS5ib3VuZGluZ0JveCgpXG4gIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHVzZSBjYWNoZSBieSBkZWZhdWx0IGZvciBwZXJmXG4gIGlmICh1c2VDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdXNlQ2FjaGUgPSB0cnVlO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgcnN0eWxlID0gX3AucnN0eWxlO1xuXG4gICAgLy8gYW4gZWRnZSBtYXkgYmUgaW1wbGljaXRseSBkaXJ0eSBiL2Mgb2Ygb25lIG9mIGl0cyBjb25uZWN0ZWQgbm9kZXNcbiAgICAvLyAoYW5kIGEgcmVxdWVzdCBmb3IgcmVjYWxjIG1heSBjb21lIGluIGJldHdlZW4gZnJhbWVzKVxuICAgIGlmIChlbGUuaXNFZGdlKCkgJiYgKCFpc0NsZWFuQ29ubmVjdGVkKGVsZS5zb3VyY2UoKSkgfHwgIWlzQ2xlYW5Db25uZWN0ZWQoZWxlLnRhcmdldCgpKSkpIHtcbiAgICAgIHJzdHlsZS5jbGVhbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIG9ubHkgdXBkYXRlIGlmIGRpcnR5IGFuZCBpbiBncmFwaFxuICAgIGlmICh1c2VDYWNoZSAmJiByc3R5bGUuY2xlYW4gfHwgZWxlLnJlbW92ZWQoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gb25seSB1cGRhdGUgaWYgbm90IGRpc3BsYXk6IG5vbmVcbiAgICBpZiAoZWxlLnBzdHlsZSgnZGlzcGxheScpLnZhbHVlID09PSAnbm9uZScpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoX3AuZ3JvdXAgPT09ICdub2RlcycpIHtcbiAgICAgIG5vZGVzLnB1c2goZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZWRnZXNcbiAgICAgIGVkZ2VzLnB1c2goZWxlKTtcbiAgICB9XG4gICAgcnN0eWxlLmNsZWFuID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIHVwZGF0ZSBub2RlIGRhdGEgZnJvbSBwcm9qZWN0aW9uc1xuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBub2Rlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIF9lbGUgPSBub2Rlc1tfaTJdO1xuICAgIHZhciBfcDIgPSBfZWxlLl9wcml2YXRlO1xuICAgIHZhciBfcnN0eWxlID0gX3AyLnJzdHlsZTtcbiAgICB2YXIgcG9zID0gX2VsZS5wb3NpdGlvbigpO1xuICAgIHRoaXMucmVjYWxjdWxhdGVOb2RlTGFiZWxQcm9qZWN0aW9uKF9lbGUpO1xuICAgIF9yc3R5bGUubm9kZVggPSBwb3MueDtcbiAgICBfcnN0eWxlLm5vZGVZID0gcG9zLnk7XG4gICAgX3JzdHlsZS5ub2RlVyA9IF9lbGUucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWU7XG4gICAgX3JzdHlsZS5ub2RlSCA9IF9lbGUucHN0eWxlKCdoZWlnaHQnKS5wZlZhbHVlO1xuICB9XG4gIHRoaXMucmVjYWxjdWxhdGVFZGdlUHJvamVjdGlvbnMoZWRnZXMpO1xuXG4gIC8vIHVwZGF0ZSBlZGdlIGRhdGEgZnJvbSBwcm9qZWN0aW9uc1xuICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBlZGdlcy5sZW5ndGg7IF9pMysrKSB7XG4gICAgdmFyIF9lbGUyID0gZWRnZXNbX2kzXTtcbiAgICB2YXIgX3AzID0gX2VsZTIuX3ByaXZhdGU7XG4gICAgdmFyIF9yc3R5bGUyID0gX3AzLnJzdHlsZTtcbiAgICB2YXIgcnMgPSBfcDMucnNjcmF0Y2g7XG5cbiAgICAvLyB1cGRhdGUgcnN0eWxlIHBvc2l0aW9uc1xuICAgIF9yc3R5bGUyLnNyY1ggPSBycy5hcnJvd1N0YXJ0WDtcbiAgICBfcnN0eWxlMi5zcmNZID0gcnMuYXJyb3dTdGFydFk7XG4gICAgX3JzdHlsZTIudGd0WCA9IHJzLmFycm93RW5kWDtcbiAgICBfcnN0eWxlMi50Z3RZID0gcnMuYXJyb3dFbmRZO1xuICAgIF9yc3R5bGUyLm1pZFggPSBycy5taWRYO1xuICAgIF9yc3R5bGUyLm1pZFkgPSBycy5taWRZO1xuICAgIF9yc3R5bGUyLmxhYmVsQW5nbGUgPSBycy5sYWJlbEFuZ2xlO1xuICAgIF9yc3R5bGUyLnNvdXJjZUxhYmVsQW5nbGUgPSBycy5zb3VyY2VMYWJlbEFuZ2xlO1xuICAgIF9yc3R5bGUyLnRhcmdldExhYmVsQW5nbGUgPSBycy50YXJnZXRMYWJlbEFuZ2xlO1xuICB9XG59O1xuXG52YXIgQlJwJDYgPSB7fTtcbkJScCQ2LnVwZGF0ZUNhY2hlZEdyYWJiZWRFbGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlcyA9IHRoaXMuY2FjaGVkWlNvcnRlZEVsZXM7XG4gIGlmICghZWxlcykge1xuICAgIC8vIGp1c3QgbGV0IHRoaXMgYmUgcmVjYWxjdWxhdGVkIG9uIHRoZSBuZXh0IHogc29ydCB0aWNrXG4gICAgcmV0dXJuO1xuICB9XG4gIGVsZXMuZHJhZyA9IFtdO1xuICBlbGVzLm5vbmRyYWcgPSBbXTtcbiAgdmFyIGdyYWJUYXJnZXRzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHZhciBycyA9IGVsZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICBpZiAoZWxlLmdyYWJiZWQoKSAmJiAhZWxlLmlzUGFyZW50KCkpIHtcbiAgICAgIGdyYWJUYXJnZXRzLnB1c2goZWxlKTtcbiAgICB9IGVsc2UgaWYgKHJzLmluRHJhZ0xheWVyKSB7XG4gICAgICBlbGVzLmRyYWcucHVzaChlbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVzLm5vbmRyYWcucHVzaChlbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHB1dCB0aGUgZ3JhYiB0YXJnZXQgbm9kZXMgbGFzdCBzbyBpdCdzIG9uIHRvcCBvZiBpdHMgbmVpZ2hib3VyaG9vZFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGdyYWJUYXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGdyYWJUYXJnZXRzW2ldO1xuICAgIGVsZXMuZHJhZy5wdXNoKGVsZSk7XG4gIH1cbn07XG5CUnAkNi5pbnZhbGlkYXRlQ2FjaGVkWlNvcnRlZEVsZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuY2FjaGVkWlNvcnRlZEVsZXMgPSBudWxsO1xufTtcbkJScCQ2LmdldENhY2hlZFpTb3J0ZWRFbGVzID0gZnVuY3Rpb24gKGZvcmNlUmVjYWxjKSB7XG4gIGlmIChmb3JjZVJlY2FsYyB8fCAhdGhpcy5jYWNoZWRaU29ydGVkRWxlcykge1xuICAgIHZhciBlbGVzID0gdGhpcy5jeS5tdXRhYmxlRWxlbWVudHMoKS50b0FycmF5KCk7XG4gICAgZWxlcy5zb3J0KHpJbmRleFNvcnQpO1xuICAgIGVsZXMuaW50ZXJhY3RpdmUgPSBlbGVzLmZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmludGVyYWN0aXZlKCk7XG4gICAgfSk7XG4gICAgdGhpcy5jYWNoZWRaU29ydGVkRWxlcyA9IGVsZXM7XG4gICAgdGhpcy51cGRhdGVDYWNoZWRHcmFiYmVkRWxlcygpO1xuICB9IGVsc2Uge1xuICAgIGVsZXMgPSB0aGlzLmNhY2hlZFpTb3J0ZWRFbGVzO1xuICB9XG4gIHJldHVybiBlbGVzO1xufTtcblxudmFyIEJScCQ1ID0ge307XG5bQlJwJGUsIEJScCRkLCBCUnAkYywgQlJwJGIsIEJScCRhLCBCUnAkOSwgQlJwJDgsIEJScCQ3LCBCUnAkNl0uZm9yRWFjaChmdW5jdGlvbiAocHJvcHMpIHtcbiAgZXh0ZW5kKEJScCQ1LCBwcm9wcyk7XG59KTtcblxudmFyIEJScCQ0ID0ge307XG5CUnAkNC5nZXRDYWNoZWRJbWFnZSA9IGZ1bmN0aW9uICh1cmwsIGNyb3NzT3JpZ2luLCBvbkxvYWQpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgaW1hZ2VDYWNoZSA9IHIuaW1hZ2VDYWNoZSA9IHIuaW1hZ2VDYWNoZSB8fCB7fTtcbiAgdmFyIGNhY2hlID0gaW1hZ2VDYWNoZVt1cmxdO1xuICBpZiAoY2FjaGUpIHtcbiAgICBpZiAoIWNhY2hlLmltYWdlLmNvbXBsZXRlKSB7XG4gICAgICBjYWNoZS5pbWFnZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlLmltYWdlO1xuICB9IGVsc2Uge1xuICAgIGNhY2hlID0gaW1hZ2VDYWNoZVt1cmxdID0gaW1hZ2VDYWNoZVt1cmxdIHx8IHt9O1xuICAgIHZhciBpbWFnZSA9IGNhY2hlLmltYWdlID0gbmV3IEltYWdlKCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICAgIGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpO1xuICAgIGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgaW1hZ2UuZXJyb3IgPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgLy8gIzE1ODIgc2FmYXJpIGRvZXNuJ3QgbG9hZCBkYXRhIHVyaXMgd2l0aCBjcm9zc09yaWdpbiBwcm9wZXJseVxuICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjM5NzhcbiAgICB2YXIgZGF0YVVyaVByZWZpeCA9ICdkYXRhOic7XG4gICAgdmFyIGlzRGF0YVVyaSA9IHVybC5zdWJzdHJpbmcoMCwgZGF0YVVyaVByZWZpeC5sZW5ndGgpLnRvTG93ZXJDYXNlKCkgPT09IGRhdGFVcmlQcmVmaXg7XG4gICAgaWYgKCFpc0RhdGFVcmkpIHtcbiAgICAgIC8vIGlmIGNyb3Nzb3JpZ2luIGlzICdudWxsJyhzdHJpbmdpZmllZCksIHRoZW4gbWFudWFsbHkgc2V0IGl0IHRvIG51bGwgXG4gICAgICBjcm9zc09yaWdpbiA9IGNyb3NzT3JpZ2luID09PSAnbnVsbCcgPyBudWxsIDogY3Jvc3NPcmlnaW47XG4gICAgICBpbWFnZS5jcm9zc09yaWdpbiA9IGNyb3NzT3JpZ2luOyAvLyBwcmV2ZW50IHRhaW50ZWQgY2FudmFzXG4gICAgfVxuXG4gICAgaW1hZ2Uuc3JjID0gdXJsO1xuICAgIHJldHVybiBpbWFnZTtcbiAgfVxufTtcblxudmFyIEJScCQzID0ge307XG5cbi8qIGdsb2JhbCBkb2N1bWVudCwgd2luZG93LCBSZXNpemVPYnNlcnZlciwgTXV0YXRpb25PYnNlcnZlciAqL1xuXG5CUnAkMy5yZWdpc3RlckJpbmRpbmcgPSBmdW5jdGlvbiAodGFyZ2V0LCBldmVudCwgaGFuZGxlciwgdXNlQ2FwdHVyZSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cywgWzFdKTsgLy8gY29weVxuICB2YXIgYiA9IHRoaXMuYmluZGVyKHRhcmdldCk7XG4gIHJldHVybiBiLm9uLmFwcGx5KGIsIGFyZ3MpO1xufTtcbkJScCQzLmJpbmRlciA9IGZ1bmN0aW9uICh0Z3QpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgY29udGFpbmVyV2luZG93ID0gci5jeS53aW5kb3coKTtcbiAgdmFyIHRndElzRG9tID0gdGd0ID09PSBjb250YWluZXJXaW5kb3cgfHwgdGd0ID09PSBjb250YWluZXJXaW5kb3cuZG9jdW1lbnQgfHwgdGd0ID09PSBjb250YWluZXJXaW5kb3cuZG9jdW1lbnQuYm9keSB8fCBkb21FbGVtZW50KHRndCk7XG4gIGlmIChyLnN1cHBvcnRzUGFzc2l2ZUV2ZW50cyA9PSBudWxsKSB7XG4gICAgLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vV0lDRy9FdmVudExpc3RlbmVyT3B0aW9ucy9ibG9iL2doLXBhZ2VzL2V4cGxhaW5lci5tZCNmZWF0dXJlLWRldGVjdGlvblxuICAgIHZhciBzdXBwb3J0c1Bhc3NpdmUgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgdmFyIG9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnRhaW5lcldpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBub3Qgc3VwcG9ydGVkXG4gICAgfVxuICAgIHIuc3VwcG9ydHNQYXNzaXZlRXZlbnRzID0gc3VwcG9ydHNQYXNzaXZlO1xuICB9XG4gIHZhciBvbiA9IGZ1bmN0aW9uIG9uKGV2ZW50LCBoYW5kbGVyLCB1c2VDYXB0dXJlKSB7XG4gICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIGlmICh0Z3RJc0RvbSAmJiByLnN1cHBvcnRzUGFzc2l2ZUV2ZW50cykge1xuICAgICAgLy8gcmVwbGFjZSB1c2VDYXB0dXJlIHcvIG9wdHMgb2JqXG4gICAgICBhcmdzWzJdID0ge1xuICAgICAgICBjYXB0dXJlOiB1c2VDYXB0dXJlICE9IG51bGwgPyB1c2VDYXB0dXJlIDogZmFsc2UsXG4gICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgICBvbmNlOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgci5iaW5kaW5ncy5wdXNoKHtcbiAgICAgIHRhcmdldDogdGd0LFxuICAgICAgYXJnczogYXJnc1xuICAgIH0pO1xuICAgICh0Z3QuYWRkRXZlbnRMaXN0ZW5lciB8fCB0Z3Qub24pLmFwcGx5KHRndCwgYXJncyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIHJldHVybiB7XG4gICAgb246IG9uLFxuICAgIGFkZEV2ZW50TGlzdGVuZXI6IG9uLFxuICAgIGFkZExpc3RlbmVyOiBvbixcbiAgICBiaW5kOiBvblxuICB9O1xufTtcbkJScCQzLm5vZGVJc0RyYWdnYWJsZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHJldHVybiBub2RlICYmIG5vZGUuaXNOb2RlKCkgJiYgIW5vZGUubG9ja2VkKCkgJiYgbm9kZS5ncmFiYmFibGUoKTtcbn07XG5CUnAkMy5ub2RlSXNHcmFiYmFibGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICByZXR1cm4gdGhpcy5ub2RlSXNEcmFnZ2FibGUobm9kZSkgJiYgbm9kZS5pbnRlcmFjdGl2ZSgpO1xufTtcbkJScCQzLmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGNvbnRhaW5lcldpbmRvdyA9IHIuY3kud2luZG93KCk7XG4gIHZhciBpc1NlbGVjdGVkID0gZnVuY3Rpb24gaXNTZWxlY3RlZChlbGUpIHtcbiAgICByZXR1cm4gZWxlLnNlbGVjdGVkKCk7XG4gIH07XG4gIHZhciB0cmlnZ2VyRXZlbnRzID0gZnVuY3Rpb24gdHJpZ2dlckV2ZW50cyh0YXJnZXQsIG5hbWVzLCBlLCBwb3NpdGlvbikge1xuICAgIGlmICh0YXJnZXQgPT0gbnVsbCkge1xuICAgICAgdGFyZ2V0ID0gci5jeTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgIHRhcmdldC5lbWl0KHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdHlwZTogbmFtZSxcbiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIHZhciBpc011bHRTZWxLZXlEb3duID0gZnVuY3Rpb24gaXNNdWx0U2VsS2V5RG93bihlKSB7XG4gICAgcmV0dXJuIGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IGUuY3RybEtleTsgLy8gbWF5YmUgZS5hbHRLZXlcbiAgfTtcblxuICB2YXIgYWxsb3dQYW5uaW5nUGFzc3Rocm91Z2ggPSBmdW5jdGlvbiBhbGxvd1Bhbm5pbmdQYXNzdGhyb3VnaChkb3duLCBkb3ducykge1xuICAgIHZhciBhbGxvd1Bhc3N0aHJvdWdoID0gdHJ1ZTtcbiAgICBpZiAoci5jeS5oYXNDb21wb3VuZE5vZGVzKCkgJiYgZG93biAmJiBkb3duLnBhbm5hYmxlKCkpIHtcbiAgICAgIC8vIGEgZ3JhYmJhYmxlIGNvbXBvdW5kIG5vZGUgYmVsb3cgdGhlIGVsZSA9PiBubyBwYXNzdGhyb3VnaCBwYW5uaW5nXG4gICAgICBmb3IgKHZhciBpID0gMDsgZG93bnMgJiYgaSA8IGRvd25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBkb3duID0gZG93bnNbaV07XG5cbiAgICAgICAgLy9pZiBhbnkgcGFyZW50IG5vZGUgaW4gZXZlbnQgaGllcmFyY2h5IGlzbid0IHBhbm5hYmxlLCByZWplY3QgcGFzc3Rocm91Z2hcbiAgICAgICAgaWYgKGRvd24uaXNOb2RlKCkgJiYgZG93bi5pc1BhcmVudCgpICYmICFkb3duLnBhbm5hYmxlKCkpIHtcbiAgICAgICAgICBhbGxvd1Bhc3N0aHJvdWdoID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYWxsb3dQYXNzdGhyb3VnaCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBhbGxvd1Bhc3N0aHJvdWdoO1xuICB9O1xuICB2YXIgc2V0R3JhYmJlZCA9IGZ1bmN0aW9uIHNldEdyYWJiZWQoZWxlKSB7XG4gICAgZWxlWzBdLl9wcml2YXRlLmdyYWJiZWQgPSB0cnVlO1xuICB9O1xuICB2YXIgc2V0RnJlZWQgPSBmdW5jdGlvbiBzZXRGcmVlZChlbGUpIHtcbiAgICBlbGVbMF0uX3ByaXZhdGUuZ3JhYmJlZCA9IGZhbHNlO1xuICB9O1xuICB2YXIgc2V0SW5EcmFnTGF5ZXIgPSBmdW5jdGlvbiBzZXRJbkRyYWdMYXllcihlbGUpIHtcbiAgICBlbGVbMF0uX3ByaXZhdGUucnNjcmF0Y2guaW5EcmFnTGF5ZXIgPSB0cnVlO1xuICB9O1xuICB2YXIgc2V0T3V0RHJhZ0xheWVyID0gZnVuY3Rpb24gc2V0T3V0RHJhZ0xheWVyKGVsZSkge1xuICAgIGVsZVswXS5fcHJpdmF0ZS5yc2NyYXRjaC5pbkRyYWdMYXllciA9IGZhbHNlO1xuICB9O1xuICB2YXIgc2V0R3JhYlRhcmdldCA9IGZ1bmN0aW9uIHNldEdyYWJUYXJnZXQoZWxlKSB7XG4gICAgZWxlWzBdLl9wcml2YXRlLnJzY3JhdGNoLmlzR3JhYlRhcmdldCA9IHRydWU7XG4gIH07XG4gIHZhciByZW1vdmVHcmFiVGFyZ2V0ID0gZnVuY3Rpb24gcmVtb3ZlR3JhYlRhcmdldChlbGUpIHtcbiAgICBlbGVbMF0uX3ByaXZhdGUucnNjcmF0Y2guaXNHcmFiVGFyZ2V0ID0gZmFsc2U7XG4gIH07XG4gIHZhciBhZGRUb0RyYWdMaXN0ID0gZnVuY3Rpb24gYWRkVG9EcmFnTGlzdChlbGUsIG9wdHMpIHtcbiAgICB2YXIgbGlzdCA9IG9wdHMuYWRkVG9MaXN0O1xuICAgIHZhciBsaXN0SGFzRWxlID0gbGlzdC5oYXMoZWxlKTtcbiAgICBpZiAoIWxpc3RIYXNFbGUgJiYgZWxlLmdyYWJiYWJsZSgpICYmICFlbGUubG9ja2VkKCkpIHtcbiAgICAgIGxpc3QubWVyZ2UoZWxlKTtcbiAgICAgIHNldEdyYWJiZWQoZWxlKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBjaGlsZCBub2RlcyBhbmQgaW5uZXIgZWRnZXNcbiAgLy8gb2YgYSBjb21wb3VuZCBub2RlIHRvIGJlIGRyYWdnZWQgYXMgd2VsbCBhcyB0aGUgZ3JhYmJlZCBhbmQgc2VsZWN0ZWQgbm9kZXNcbiAgdmFyIGFkZERlc2NlbmRhbnRzVG9EcmFnID0gZnVuY3Rpb24gYWRkRGVzY2VuZGFudHNUb0RyYWcobm9kZSwgb3B0cykge1xuICAgIGlmICghbm9kZS5jeSgpLmhhc0NvbXBvdW5kTm9kZXMoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob3B0cy5pbkRyYWdMYXllciA9PSBudWxsICYmIG9wdHMuYWRkVG9MaXN0ID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIG5vdGhpbmcgdG8gZG9cblxuICAgIHZhciBpbm5lck5vZGVzID0gbm9kZS5kZXNjZW5kYW50cygpO1xuICAgIGlmIChvcHRzLmluRHJhZ0xheWVyKSB7XG4gICAgICBpbm5lck5vZGVzLmZvckVhY2goc2V0SW5EcmFnTGF5ZXIpO1xuICAgICAgaW5uZXJOb2Rlcy5jb25uZWN0ZWRFZGdlcygpLmZvckVhY2goc2V0SW5EcmFnTGF5ZXIpO1xuICAgIH1cbiAgICBpZiAob3B0cy5hZGRUb0xpc3QpIHtcbiAgICAgIGFkZFRvRHJhZ0xpc3QoaW5uZXJOb2Rlcywgb3B0cyk7XG4gICAgfVxuICB9O1xuXG4gIC8vIGFkZHMgdGhlIGdpdmVuIG5vZGVzIGFuZCBpdHMgbmVpZ2hib3VyaG9vZCB0byB0aGUgZHJhZyBsYXllclxuICB2YXIgYWRkTm9kZXNUb0RyYWcgPSBmdW5jdGlvbiBhZGROb2Rlc1RvRHJhZyhub2Rlcywgb3B0cykge1xuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIHZhciBoYXNDb21wb3VuZE5vZGVzID0gbm9kZXMuY3koKS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gICAgaWYgKG9wdHMuaW5EcmFnTGF5ZXIpIHtcbiAgICAgIG5vZGVzLmZvckVhY2goc2V0SW5EcmFnTGF5ZXIpO1xuICAgICAgbm9kZXMubmVpZ2hib3Job29kKCkuc3RkRmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgcmV0dXJuICFoYXNDb21wb3VuZE5vZGVzIHx8IGVsZS5pc0VkZ2UoKTtcbiAgICAgIH0pLmZvckVhY2goc2V0SW5EcmFnTGF5ZXIpO1xuICAgIH1cbiAgICBpZiAob3B0cy5hZGRUb0xpc3QpIHtcbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICBhZGRUb0RyYWdMaXN0KGVsZSwgb3B0cyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgYWRkRGVzY2VuZGFudHNUb0RyYWcobm9kZXMsIG9wdHMpOyAvLyBhbHdheXMgYWRkIHRvIGRyYWdcblxuICAgIC8vIGFsc28gYWRkIG5vZGVzIGFuZCBlZGdlcyByZWxhdGVkIHRvIHRoZSB0b3Btb3N0IGFuY2VzdG9yXG4gICAgdXBkYXRlQW5jZXN0b3JzSW5EcmFnTGF5ZXIobm9kZXMsIHtcbiAgICAgIGluRHJhZ0xheWVyOiBvcHRzLmluRHJhZ0xheWVyXG4gICAgfSk7XG4gICAgci51cGRhdGVDYWNoZWRHcmFiYmVkRWxlcygpO1xuICB9O1xuICB2YXIgYWRkTm9kZVRvRHJhZyA9IGFkZE5vZGVzVG9EcmFnO1xuICB2YXIgZnJlZURyYWdnZWRFbGVtZW50cyA9IGZ1bmN0aW9uIGZyZWVEcmFnZ2VkRWxlbWVudHMoZ3JhYmJlZEVsZXMpIHtcbiAgICBpZiAoIWdyYWJiZWRFbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8ganVzdCBnbyBvdmVyIGFsbCBlbGVtZW50cyByYXRoZXIgdGhhbiBkb2luZyBhIGJ1bmNoIG9mIChwb3NzaWJseSBleHBlbnNpdmUpIHRyYXZlcnNhbHNcbiAgICByLmdldENhY2hlZFpTb3J0ZWRFbGVzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICBzZXRGcmVlZChlbGUpO1xuICAgICAgc2V0T3V0RHJhZ0xheWVyKGVsZSk7XG4gICAgICByZW1vdmVHcmFiVGFyZ2V0KGVsZSk7XG4gICAgfSk7XG4gICAgci51cGRhdGVDYWNoZWRHcmFiYmVkRWxlcygpO1xuICB9O1xuXG4gIC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggYW5jZXN0b3Igbm9kZXMgYW5kIGVkZ2VzIHNob3VsZCBnb1xuICAvLyB0byB0aGUgZHJhZyBsYXllciAob3Igc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBkcmFnIGxheWVyKS5cbiAgdmFyIHVwZGF0ZUFuY2VzdG9yc0luRHJhZ0xheWVyID0gZnVuY3Rpb24gdXBkYXRlQW5jZXN0b3JzSW5EcmFnTGF5ZXIobm9kZSwgb3B0cykge1xuICAgIGlmIChvcHRzLmluRHJhZ0xheWVyID09IG51bGwgJiYgb3B0cy5hZGRUb0xpc3QgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gbm90aGluZyB0byBkb1xuXG4gICAgaWYgKCFub2RlLmN5KCkuaGFzQ29tcG91bmROb2RlcygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZmluZCB0b3AtbGV2ZWwgcGFyZW50XG4gICAgdmFyIHBhcmVudCA9IG5vZGUuYW5jZXN0b3JzKCkub3JwaGFucygpO1xuXG4gICAgLy8gbm8gcGFyZW50IG5vZGU6IG5vIG5vZGVzIHRvIGFkZCB0byB0aGUgZHJhZyBsYXllclxuICAgIGlmIChwYXJlbnQuc2FtZShub2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbm9kZXMgPSBwYXJlbnQuZGVzY2VuZGFudHMoKS5zcGF3blNlbGYoKS5tZXJnZShwYXJlbnQpLnVubWVyZ2Uobm9kZSkudW5tZXJnZShub2RlLmRlc2NlbmRhbnRzKCkpO1xuICAgIHZhciBlZGdlcyA9IG5vZGVzLmNvbm5lY3RlZEVkZ2VzKCk7XG4gICAgaWYgKG9wdHMuaW5EcmFnTGF5ZXIpIHtcbiAgICAgIGVkZ2VzLmZvckVhY2goc2V0SW5EcmFnTGF5ZXIpO1xuICAgICAgbm9kZXMuZm9yRWFjaChzZXRJbkRyYWdMYXllcik7XG4gICAgfVxuICAgIGlmIChvcHRzLmFkZFRvTGlzdCkge1xuICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIGFkZFRvRHJhZ0xpc3QoZWxlLCBvcHRzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgdmFyIGJsdXJBY3RpdmVEb21FbGVtZW50ID0gZnVuY3Rpb24gYmx1ckFjdGl2ZURvbUVsZW1lbnQoKSB7XG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIgIT0gbnVsbCkge1xuICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgfVxuICB9O1xuICB2YXIgaGF2ZU11dGF0aW9uc0FwaSA9IHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAndW5kZWZpbmVkJztcbiAgdmFyIGhhdmVSZXNpemVPYnNlcnZlckFwaSA9IHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCc7XG5cbiAgLy8gd2F0Y2ggZm9yIHdoZW4gdGhlIGN5IGNvbnRhaW5lciBpcyByZW1vdmVkIGZyb20gdGhlIGRvbVxuICBpZiAoaGF2ZU11dGF0aW9uc0FwaSkge1xuICAgIHIucmVtb3ZlT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAobXV0bnMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXV0bnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG11dG4gPSBtdXRuc1tpXTtcbiAgICAgICAgdmFyIHJOb2RlcyA9IG11dG4ucmVtb3ZlZE5vZGVzO1xuICAgICAgICBpZiAock5vZGVzKSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByTm9kZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciByTm9kZSA9IHJOb2Rlc1tqXTtcbiAgICAgICAgICAgIGlmIChyTm9kZSA9PT0gci5jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgci5kZXN0cm95KCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChyLmNvbnRhaW5lci5wYXJlbnROb2RlKSB7XG4gICAgICByLnJlbW92ZU9ic2VydmVyLm9ic2VydmUoci5jb250YWluZXIucGFyZW50Tm9kZSwge1xuICAgICAgICBjaGlsZExpc3Q6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ0RPTU5vZGVSZW1vdmVkJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHIuZGVzdHJveSgpO1xuICAgIH0pO1xuICB9XG4gIHZhciBvblJlc2l6ZSA9IGRlYm91bmNlXzEoZnVuY3Rpb24gKCkge1xuICAgIHIuY3kucmVzaXplKCk7XG4gIH0sIDEwMCk7XG4gIGlmIChoYXZlTXV0YXRpb25zQXBpKSB7XG4gICAgci5zdHlsZU9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIob25SZXNpemUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgICByLnN0eWxlT2JzZXJ2ZXIub2JzZXJ2ZShyLmNvbnRhaW5lciwge1xuICAgICAgYXR0cmlidXRlczogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgLy8gYXV0byByZXNpemVcbiAgci5yZWdpc3RlckJpbmRpbmcoY29udGFpbmVyV2luZG93LCAncmVzaXplJywgb25SZXNpemUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgaWYgKGhhdmVSZXNpemVPYnNlcnZlckFwaSkge1xuICAgIHIucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIob25SZXNpemUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgICByLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoci5jb250YWluZXIpO1xuICB9XG4gIHZhciBmb3JFYWNoVXAgPSBmdW5jdGlvbiBmb3JFYWNoVXAoZG9tRWxlLCBmbikge1xuICAgIHdoaWxlIChkb21FbGUgIT0gbnVsbCkge1xuICAgICAgZm4oZG9tRWxlKTtcbiAgICAgIGRvbUVsZSA9IGRvbUVsZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgfTtcbiAgdmFyIGludmFsaWRhdGVDb29yZHMgPSBmdW5jdGlvbiBpbnZhbGlkYXRlQ29vcmRzKCkge1xuICAgIHIuaW52YWxpZGF0ZUNvbnRhaW5lckNsaWVudENvb3Jkc0NhY2hlKCk7XG4gIH07XG4gIGZvckVhY2hVcChyLmNvbnRhaW5lciwgZnVuY3Rpb24gKGRvbUVsZSkge1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKGRvbUVsZSwgJ3RyYW5zaXRpb25lbmQnLCBpbnZhbGlkYXRlQ29vcmRzKTtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhkb21FbGUsICdhbmltYXRpb25lbmQnLCBpbnZhbGlkYXRlQ29vcmRzKTtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhkb21FbGUsICdzY3JvbGwnLCBpbnZhbGlkYXRlQ29vcmRzKTtcbiAgfSk7XG5cbiAgLy8gc3RvcCByaWdodCBjbGljayBtZW51IGZyb20gYXBwZWFyaW5nIG9uIGN5XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnY29udGV4dG1lbnUnLCBmdW5jdGlvbiAoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG4gIHZhciBpbkJveFNlbGVjdGlvbiA9IGZ1bmN0aW9uIGluQm94U2VsZWN0aW9uKCkge1xuICAgIHJldHVybiByLnNlbGVjdGlvbls0XSAhPT0gMDtcbiAgfTtcbiAgdmFyIGV2ZW50SW5Db250YWluZXIgPSBmdW5jdGlvbiBldmVudEluQ29udGFpbmVyKGUpIHtcbiAgICAvLyBzYXZlIGN5Y2xlcyBpZiBtb3VzZSBldmVudHMgYXJlbid0IHRvIGJlIGNhcHR1cmVkXG4gICAgdmFyIGNvbnRhaW5lclBhZ2VDb29yZHMgPSByLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMoKTtcbiAgICB2YXIgeCA9IGNvbnRhaW5lclBhZ2VDb29yZHNbMF07XG4gICAgdmFyIHkgPSBjb250YWluZXJQYWdlQ29vcmRzWzFdO1xuICAgIHZhciB3aWR0aCA9IGNvbnRhaW5lclBhZ2VDb29yZHNbMl07XG4gICAgdmFyIGhlaWdodCA9IGNvbnRhaW5lclBhZ2VDb29yZHNbM107XG4gICAgdmFyIHBvc2l0aW9ucyA9IGUudG91Y2hlcyA/IGUudG91Y2hlcyA6IFtlXTtcbiAgICB2YXIgYXRMZWFzdE9uZVBvc0luc2lkZSA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcCA9IHBvc2l0aW9uc1tpXTtcbiAgICAgIGlmICh4IDw9IHAuY2xpZW50WCAmJiBwLmNsaWVudFggPD0geCArIHdpZHRoICYmIHkgPD0gcC5jbGllbnRZICYmIHAuY2xpZW50WSA8PSB5ICsgaGVpZ2h0KSB7XG4gICAgICAgIGF0TGVhc3RPbmVQb3NJbnNpZGUgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFhdExlYXN0T25lUG9zSW5zaWRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBjb250YWluZXIgPSByLmNvbnRhaW5lcjtcbiAgICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgdmFyIHRQYXJlbnQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICB2YXIgY29udGFpbmVySXNUYXJnZXQgPSBmYWxzZTtcbiAgICB3aGlsZSAodFBhcmVudCkge1xuICAgICAgaWYgKHRQYXJlbnQgPT09IGNvbnRhaW5lcikge1xuICAgICAgICBjb250YWluZXJJc1RhcmdldCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdFBhcmVudCA9IHRQYXJlbnQucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgaWYgKCFjb250YWluZXJJc1RhcmdldCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gaWYgdGFyZ2V0IGlzIG91dGlzZGUgY3kgY29udGFpbmVyLCB0aGVuIHRoaXMgZXZlbnQgaXMgbm90IGZvciB1c1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLy8gUHJpbWFyeSBrZXlcbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdtb3VzZWRvd24nLCBmdW5jdGlvbiBtb3VzZWRvd25IYW5kbGVyKGUpIHtcbiAgICBpZiAoIWV2ZW50SW5Db250YWluZXIoZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGJsdXJBY3RpdmVEb21FbGVtZW50KCk7XG4gICAgci5ob3ZlckRhdGEuY2FwdHVyZSA9IHRydWU7XG4gICAgci5ob3ZlckRhdGEud2hpY2ggPSBlLndoaWNoO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIGdwb3MgPSBbZS5jbGllbnRYLCBlLmNsaWVudFldO1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZ3Bvc1swXSwgZ3Bvc1sxXSk7XG4gICAgdmFyIHNlbGVjdCA9IHIuc2VsZWN0aW9uO1xuICAgIHZhciBuZWFycyA9IHIuZmluZE5lYXJlc3RFbGVtZW50cyhwb3NbMF0sIHBvc1sxXSwgdHJ1ZSwgZmFsc2UpO1xuICAgIHZhciBuZWFyID0gbmVhcnNbMF07XG4gICAgdmFyIGRyYWdnZWRFbGVtZW50cyA9IHIuZHJhZ0RhdGEucG9zc2libGVEcmFnRWxlbWVudHM7XG4gICAgci5ob3ZlckRhdGEubWRvd25Qb3MgPSBwb3M7XG4gICAgci5ob3ZlckRhdGEubWRvd25HUG9zID0gZ3BvcztcbiAgICB2YXIgY2hlY2tGb3JUYXBob2xkID0gZnVuY3Rpb24gY2hlY2tGb3JUYXBob2xkKCkge1xuICAgICAgci5ob3ZlckRhdGEudGFwaG9sZENhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgY2xlYXJUaW1lb3V0KHIuaG92ZXJEYXRhLnRhcGhvbGRUaW1lb3V0KTtcbiAgICAgIHIuaG92ZXJEYXRhLnRhcGhvbGRUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChyLmhvdmVyRGF0YS50YXBob2xkQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBlbGUgPSByLmhvdmVyRGF0YS5kb3duO1xuICAgICAgICAgIGlmIChlbGUpIHtcbiAgICAgICAgICAgIGVsZS5lbWl0KHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgICAgdHlwZTogJ3RhcGhvbGQnLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN5LmVtaXQoe1xuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICB0eXBlOiAndGFwaG9sZCcsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIHIudGFwaG9sZER1cmF0aW9uKTtcbiAgICB9O1xuXG4gICAgLy8gUmlnaHQgY2xpY2sgYnV0dG9uXG4gICAgaWYgKGUud2hpY2ggPT0gMykge1xuICAgICAgci5ob3ZlckRhdGEuY3h0U3RhcnRlZCA9IHRydWU7XG4gICAgICB2YXIgY3h0RXZ0ID0ge1xuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0eXBlOiAnY3h0dGFwc3RhcnQnLFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChuZWFyKSB7XG4gICAgICAgIG5lYXIuYWN0aXZhdGUoKTtcbiAgICAgICAgbmVhci5lbWl0KGN4dEV2dCk7XG4gICAgICAgIHIuaG92ZXJEYXRhLmRvd24gPSBuZWFyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3kuZW1pdChjeHRFdnQpO1xuICAgICAgfVxuICAgICAgci5ob3ZlckRhdGEuZG93blRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgIHIuaG92ZXJEYXRhLmN4dERyYWdnZWQgPSBmYWxzZTtcblxuICAgICAgLy8gUHJpbWFyeSBidXR0b25cbiAgICB9IGVsc2UgaWYgKGUud2hpY2ggPT0gMSkge1xuICAgICAgaWYgKG5lYXIpIHtcbiAgICAgICAgbmVhci5hY3RpdmF0ZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbGVtZW50IGRyYWdnaW5nXG4gICAgICB7XG4gICAgICAgIC8vIElmIHNvbWV0aGluZyBpcyB1bmRlciB0aGUgY3Vyc29yIGFuZCBpdCBpcyBkcmFnZ2FibGUsIHByZXBhcmUgdG8gZ3JhYiBpdFxuICAgICAgICBpZiAobmVhciAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHIubm9kZUlzR3JhYmJhYmxlKG5lYXIpKSB7XG4gICAgICAgICAgICB2YXIgbWFrZUV2ZW50ID0gZnVuY3Rpb24gbWFrZUV2ZW50KHR5cGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgdHJpZ2dlckdyYWIgPSBmdW5jdGlvbiB0cmlnZ2VyR3JhYihlbGUpIHtcbiAgICAgICAgICAgICAgZWxlLmVtaXQobWFrZUV2ZW50KCdncmFiJykpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNldEdyYWJUYXJnZXQobmVhcik7XG4gICAgICAgICAgICBpZiAoIW5lYXIuc2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMgPSByLmRyYWdEYXRhLnBvc3NpYmxlRHJhZ0VsZW1lbnRzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICAgICAgICBhZGROb2RlVG9EcmFnKG5lYXIsIHtcbiAgICAgICAgICAgICAgICBhZGRUb0xpc3Q6IGRyYWdnZWRFbGVtZW50c1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgbmVhci5lbWl0KG1ha2VFdmVudCgnZ3JhYm9uJykpLmVtaXQobWFrZUV2ZW50KCdncmFiJykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZHJhZ2dlZEVsZW1lbnRzID0gci5kcmFnRGF0YS5wb3NzaWJsZURyYWdFbGVtZW50cyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkTm9kZXMgPSBjeS4kKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlLmlzTm9kZSgpICYmIGVsZS5zZWxlY3RlZCgpICYmIHIubm9kZUlzR3JhYmJhYmxlKGVsZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBhZGROb2Rlc1RvRHJhZyhzZWxlY3RlZE5vZGVzLCB7XG4gICAgICAgICAgICAgICAgYWRkVG9MaXN0OiBkcmFnZ2VkRWxlbWVudHNcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIG5lYXIuZW1pdChtYWtlRXZlbnQoJ2dyYWJvbicpKTtcbiAgICAgICAgICAgICAgc2VsZWN0ZWROb2Rlcy5mb3JFYWNoKHRyaWdnZXJHcmFiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHIuaG92ZXJEYXRhLmRvd24gPSBuZWFyO1xuICAgICAgICByLmhvdmVyRGF0YS5kb3ducyA9IG5lYXJzO1xuICAgICAgICByLmhvdmVyRGF0YS5kb3duVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50cyhuZWFyLCBbJ21vdXNlZG93bicsICd0YXBzdGFydCcsICd2bW91c2Vkb3duJ10sIGUsIHtcbiAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICB5OiBwb3NbMV1cbiAgICAgIH0pO1xuICAgICAgaWYgKG5lYXIgPT0gbnVsbCkge1xuICAgICAgICBzZWxlY3RbNF0gPSAxO1xuICAgICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB7XG4gICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICB9O1xuICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICByLnJlZHJhdygpO1xuICAgICAgfSBlbHNlIGlmIChuZWFyLnBhbm5hYmxlKCkpIHtcbiAgICAgICAgc2VsZWN0WzRdID0gMTsgLy8gZm9yIGZ1dHVyZSBwYW5cbiAgICAgIH1cblxuICAgICAgY2hlY2tGb3JUYXBob2xkKCk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBzZWxlY3Rpb24gYm94IGNvb3JkaW5hdGVzXG4gICAgc2VsZWN0WzBdID0gc2VsZWN0WzJdID0gcG9zWzBdO1xuICAgIHNlbGVjdFsxXSA9IHNlbGVjdFszXSA9IHBvc1sxXTtcbiAgfSwgZmFsc2UpO1xuICByLnJlZ2lzdGVyQmluZGluZyhjb250YWluZXJXaW5kb3csICdtb3VzZW1vdmUnLCBmdW5jdGlvbiBtb3VzZW1vdmVIYW5kbGVyKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgdmFyIGNhcHR1cmUgPSByLmhvdmVyRGF0YS5jYXB0dXJlO1xuICAgIGlmICghY2FwdHVyZSAmJiAhZXZlbnRJbkNvbnRhaW5lcihlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICB2YXIgY3kgPSByLmN5O1xuICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgIHZhciBncG9zID0gW2UuY2xpZW50WCwgZS5jbGllbnRZXTtcbiAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGdwb3NbMF0sIGdwb3NbMV0pO1xuICAgIHZhciBtZG93blBvcyA9IHIuaG92ZXJEYXRhLm1kb3duUG9zO1xuICAgIHZhciBtZG93bkdQb3MgPSByLmhvdmVyRGF0YS5tZG93bkdQb3M7XG4gICAgdmFyIHNlbGVjdCA9IHIuc2VsZWN0aW9uO1xuICAgIHZhciBuZWFyID0gbnVsbDtcbiAgICBpZiAoIXIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyAmJiAhci5ob3ZlckRhdGEuZHJhZ2dpbmcgJiYgIXIuaG92ZXJEYXRhLnNlbGVjdGluZykge1xuICAgICAgbmVhciA9IHIuZmluZE5lYXJlc3RFbGVtZW50KHBvc1swXSwgcG9zWzFdLCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuICAgIHZhciBsYXN0ID0gci5ob3ZlckRhdGEubGFzdDtcbiAgICB2YXIgZG93biA9IHIuaG92ZXJEYXRhLmRvd247XG4gICAgdmFyIGRpc3AgPSBbcG9zWzBdIC0gc2VsZWN0WzJdLCBwb3NbMV0gLSBzZWxlY3RbM11dO1xuICAgIHZhciBkcmFnZ2VkRWxlbWVudHMgPSByLmRyYWdEYXRhLnBvc3NpYmxlRHJhZ0VsZW1lbnRzO1xuICAgIHZhciBpc092ZXJUaHJlc2hvbGREcmFnO1xuICAgIGlmIChtZG93bkdQb3MpIHtcbiAgICAgIHZhciBkeCA9IGdwb3NbMF0gLSBtZG93bkdQb3NbMF07XG4gICAgICB2YXIgZHgyID0gZHggKiBkeDtcbiAgICAgIHZhciBkeSA9IGdwb3NbMV0gLSBtZG93bkdQb3NbMV07XG4gICAgICB2YXIgZHkyID0gZHkgKiBkeTtcbiAgICAgIHZhciBkaXN0MiA9IGR4MiArIGR5MjtcbiAgICAgIHIuaG92ZXJEYXRhLmlzT3ZlclRocmVzaG9sZERyYWcgPSBpc092ZXJUaHJlc2hvbGREcmFnID0gZGlzdDIgPj0gci5kZXNrdG9wVGFwVGhyZXNob2xkMjtcbiAgICB9XG4gICAgdmFyIG11bHRTZWxLZXlEb3duID0gaXNNdWx0U2VsS2V5RG93bihlKTtcbiAgICBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgci5ob3ZlckRhdGEudGFwaG9sZENhbmNlbGxlZCA9IHRydWU7XG4gICAgfVxuICAgIHZhciB1cGRhdGVEcmFnRGVsdGEgPSBmdW5jdGlvbiB1cGRhdGVEcmFnRGVsdGEoKSB7XG4gICAgICB2YXIgZHJhZ0RlbHRhID0gci5ob3ZlckRhdGEuZHJhZ0RlbHRhID0gci5ob3ZlckRhdGEuZHJhZ0RlbHRhIHx8IFtdO1xuICAgICAgaWYgKGRyYWdEZWx0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZHJhZ0RlbHRhLnB1c2goZGlzcFswXSk7XG4gICAgICAgIGRyYWdEZWx0YS5wdXNoKGRpc3BbMV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJhZ0RlbHRhWzBdICs9IGRpc3BbMF07XG4gICAgICAgIGRyYWdEZWx0YVsxXSArPSBkaXNwWzFdO1xuICAgICAgfVxuICAgIH07XG4gICAgcHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgIHRyaWdnZXJFdmVudHMobmVhciwgWydtb3VzZW1vdmUnLCAndm1vdXNlbW92ZScsICd0YXBkcmFnJ10sIGUsIHtcbiAgICAgIHg6IHBvc1swXSxcbiAgICAgIHk6IHBvc1sxXVxuICAgIH0pO1xuICAgIHZhciBnb0ludG9Cb3hNb2RlID0gZnVuY3Rpb24gZ29JbnRvQm94TW9kZSgpIHtcbiAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIGlmICghci5ob3ZlckRhdGEuc2VsZWN0aW5nKSB7XG4gICAgICAgIGN5LmVtaXQoe1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgdHlwZTogJ2JveHN0YXJ0JyxcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHNlbGVjdFs0XSA9IDE7XG4gICAgICByLmhvdmVyRGF0YS5zZWxlY3RpbmcgPSB0cnVlO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIHIucmVkcmF3KCk7XG4gICAgfTtcblxuICAgIC8vIHRyaWdnZXIgY29udGV4dCBkcmFnIGlmIHJtb3VzZSBkb3duXG4gICAgaWYgKHIuaG92ZXJEYXRhLndoaWNoID09PSAzKSB7XG4gICAgICAvLyBidXQgb25seSBpZiBvdmVyIHRocmVzaG9sZFxuICAgICAgaWYgKGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgdmFyIGN4dEV2dCA9IHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHR5cGU6ICdjeHRkcmFnJyxcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoZG93bikge1xuICAgICAgICAgIGRvd24uZW1pdChjeHRFdnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN5LmVtaXQoY3h0RXZ0KTtcbiAgICAgICAgfVxuICAgICAgICByLmhvdmVyRGF0YS5jeHREcmFnZ2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFyLmhvdmVyRGF0YS5jeHRPdmVyIHx8IG5lYXIgIT09IHIuaG92ZXJEYXRhLmN4dE92ZXIpIHtcbiAgICAgICAgICBpZiAoci5ob3ZlckRhdGEuY3h0T3Zlcikge1xuICAgICAgICAgICAgci5ob3ZlckRhdGEuY3h0T3Zlci5lbWl0KHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgICAgdHlwZTogJ2N4dGRyYWdvdXQnLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHIuaG92ZXJEYXRhLmN4dE92ZXIgPSBuZWFyO1xuICAgICAgICAgIGlmIChuZWFyKSB7XG4gICAgICAgICAgICBuZWFyLmVtaXQoe1xuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICB0eXBlOiAnY3h0ZHJhZ292ZXInLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSBkcmFnIHBhbm5pbmcgdGhlIGVudGlyZSBncmFwaFxuICAgIH0gZWxzZSBpZiAoci5ob3ZlckRhdGEuZHJhZ2dpbmcpIHtcbiAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgIGlmIChjeS5wYW5uaW5nRW5hYmxlZCgpICYmIGN5LnVzZXJQYW5uaW5nRW5hYmxlZCgpKSB7XG4gICAgICAgIHZhciBkZWx0YVA7XG4gICAgICAgIGlmIChyLmhvdmVyRGF0YS5qdXN0U3RhcnRlZFBhbikge1xuICAgICAgICAgIHZhciBtZFBvcyA9IHIuaG92ZXJEYXRhLm1kb3duUG9zO1xuICAgICAgICAgIGRlbHRhUCA9IHtcbiAgICAgICAgICAgIHg6IChwb3NbMF0gLSBtZFBvc1swXSkgKiB6b29tLFxuICAgICAgICAgICAgeTogKHBvc1sxXSAtIG1kUG9zWzFdKSAqIHpvb21cbiAgICAgICAgICB9O1xuICAgICAgICAgIHIuaG92ZXJEYXRhLmp1c3RTdGFydGVkUGFuID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsdGFQID0ge1xuICAgICAgICAgICAgeDogZGlzcFswXSAqIHpvb20sXG4gICAgICAgICAgICB5OiBkaXNwWzFdICogem9vbVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY3kucGFuQnkoZGVsdGFQKTtcbiAgICAgICAgY3kuZW1pdCgnZHJhZ3BhbicpO1xuICAgICAgICByLmhvdmVyRGF0YS5kcmFnZ2VkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gTmVlZHMgcmVwcm9qZWN0IGR1ZSB0byBwYW4gY2hhbmdpbmcgdmlld3BvcnRcbiAgICAgIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG5cbiAgICAgIC8vIENoZWNrcyBwcmltYXJ5IGJ1dHRvbiBkb3duICYgb3V0IG9mIHRpbWUgJiBtb3VzZSBub3QgbW92ZWQgbXVjaFxuICAgIH0gZWxzZSBpZiAoc2VsZWN0WzRdID09IDEgJiYgKGRvd24gPT0gbnVsbCB8fCBkb3duLnBhbm5hYmxlKCkpKSB7XG4gICAgICBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgICBpZiAoIXIuaG92ZXJEYXRhLmRyYWdnaW5nICYmIGN5LmJveFNlbGVjdGlvbkVuYWJsZWQoKSAmJiAobXVsdFNlbEtleURvd24gfHwgIWN5LnBhbm5pbmdFbmFibGVkKCkgfHwgIWN5LnVzZXJQYW5uaW5nRW5hYmxlZCgpKSkge1xuICAgICAgICAgIGdvSW50b0JveE1vZGUoKTtcbiAgICAgICAgfSBlbHNlIGlmICghci5ob3ZlckRhdGEuc2VsZWN0aW5nICYmIGN5LnBhbm5pbmdFbmFibGVkKCkgJiYgY3kudXNlclBhbm5pbmdFbmFibGVkKCkpIHtcbiAgICAgICAgICB2YXIgYWxsb3dQYXNzdGhyb3VnaCA9IGFsbG93UGFubmluZ1Bhc3N0aHJvdWdoKGRvd24sIHIuaG92ZXJEYXRhLmRvd25zKTtcbiAgICAgICAgICBpZiAoYWxsb3dQYXNzdGhyb3VnaCkge1xuICAgICAgICAgICAgci5ob3ZlckRhdGEuZHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgci5ob3ZlckRhdGEuanVzdFN0YXJ0ZWRQYW4gPSB0cnVlO1xuICAgICAgICAgICAgc2VsZWN0WzRdID0gMDtcbiAgICAgICAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IGFycmF5MnBvaW50KG1kb3duUG9zKTtcbiAgICAgICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgICAgICByLnJlZHJhdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZG93biAmJiBkb3duLnBhbm5hYmxlKCkgJiYgZG93bi5hY3RpdmUoKSkge1xuICAgICAgICAgIGRvd24udW5hY3RpdmF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkb3duICYmIGRvd24ucGFubmFibGUoKSAmJiBkb3duLmFjdGl2ZSgpKSB7XG4gICAgICAgIGRvd24udW5hY3RpdmF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKCghZG93biB8fCAhZG93bi5ncmFiYmVkKCkpICYmIG5lYXIgIT0gbGFzdCkge1xuICAgICAgICBpZiAobGFzdCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudHMobGFzdCwgWydtb3VzZW91dCcsICd0YXBkcmFnb3V0J10sIGUsIHtcbiAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZWFyKSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50cyhuZWFyLCBbJ21vdXNlb3ZlcicsICd0YXBkcmFnb3ZlciddLCBlLCB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByLmhvdmVyRGF0YS5sYXN0ID0gbmVhcjtcbiAgICAgIH1cbiAgICAgIGlmIChkb3duKSB7XG4gICAgICAgIGlmIChpc092ZXJUaHJlc2hvbGREcmFnKSB7XG4gICAgICAgICAgLy8gdGhlbiB3ZSBjYW4gdGFrZSBhY3Rpb25cblxuICAgICAgICAgIGlmIChjeS5ib3hTZWxlY3Rpb25FbmFibGVkKCkgJiYgbXVsdFNlbEtleURvd24pIHtcbiAgICAgICAgICAgIC8vIHRoZW4gc2VsZWN0aW9uIG92ZXJyaWRlc1xuICAgICAgICAgICAgaWYgKGRvd24gJiYgZG93bi5ncmFiYmVkKCkpIHtcbiAgICAgICAgICAgICAgZnJlZURyYWdnZWRFbGVtZW50cyhkcmFnZ2VkRWxlbWVudHMpO1xuICAgICAgICAgICAgICBkb3duLmVtaXQoJ2ZyZWVvbicpO1xuICAgICAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMuZW1pdCgnZnJlZScpO1xuICAgICAgICAgICAgICBpZiAoci5kcmFnRGF0YS5kaWREcmFnKSB7XG4gICAgICAgICAgICAgICAgZG93bi5lbWl0KCdkcmFnZnJlZW9uJyk7XG4gICAgICAgICAgICAgICAgZHJhZ2dlZEVsZW1lbnRzLmVtaXQoJ2RyYWdmcmVlJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdvSW50b0JveE1vZGUoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGRvd24gJiYgZG93bi5ncmFiYmVkKCkgJiYgci5ub2RlSXNEcmFnZ2FibGUoZG93bikpIHtcbiAgICAgICAgICAgIC8vIGRyYWcgbm9kZVxuICAgICAgICAgICAgdmFyIGp1c3RTdGFydGVkRHJhZyA9ICFyLmRyYWdEYXRhLmRpZERyYWc7XG4gICAgICAgICAgICBpZiAoanVzdFN0YXJ0ZWREcmFnKSB7XG4gICAgICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgci5kcmFnRGF0YS5kaWREcmFnID0gdHJ1ZTsgLy8gaW5kaWNhdGUgdGhhdCB3ZSBhY3R1YWxseSBkaWQgZHJhZyB0aGUgbm9kZVxuXG4gICAgICAgICAgICAvLyBub3csIGFkZCB0aGUgZWxlbWVudHMgdG8gdGhlIGRyYWcgbGF5ZXIgaWYgbm90IGRvbmUgYWxyZWFkeVxuICAgICAgICAgICAgaWYgKCFyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMpIHtcbiAgICAgICAgICAgICAgYWRkTm9kZXNUb0RyYWcoZHJhZ2dlZEVsZW1lbnRzLCB7XG4gICAgICAgICAgICAgICAgaW5EcmFnTGF5ZXI6IHRydWVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdG90YWxTaGlmdCA9IHtcbiAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgeTogMFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChudW1iZXIkMShkaXNwWzBdKSAmJiBudW1iZXIkMShkaXNwWzFdKSkge1xuICAgICAgICAgICAgICB0b3RhbFNoaWZ0LnggKz0gZGlzcFswXTtcbiAgICAgICAgICAgICAgdG90YWxTaGlmdC55ICs9IGRpc3BbMV07XG4gICAgICAgICAgICAgIGlmIChqdXN0U3RhcnRlZERyYWcpIHtcbiAgICAgICAgICAgICAgICB2YXIgZHJhZ0RlbHRhID0gci5ob3ZlckRhdGEuZHJhZ0RlbHRhO1xuICAgICAgICAgICAgICAgIGlmIChkcmFnRGVsdGEgJiYgbnVtYmVyJDEoZHJhZ0RlbHRhWzBdKSAmJiBudW1iZXIkMShkcmFnRGVsdGFbMV0pKSB7XG4gICAgICAgICAgICAgICAgICB0b3RhbFNoaWZ0LnggKz0gZHJhZ0RlbHRhWzBdO1xuICAgICAgICAgICAgICAgICAgdG90YWxTaGlmdC55ICs9IGRyYWdEZWx0YVsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyA9IHRydWU7XG4gICAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMuc2lsZW50U2hpZnQodG90YWxTaGlmdCkuZW1pdCgncG9zaXRpb24gZHJhZycpO1xuICAgICAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgICAgICByLnJlZHJhdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBvdGhlcndpc2Ugc2F2ZSBkcmFnIGRlbHRhIGZvciB3aGVuIHdlIGFjdHVhbGx5IHN0YXJ0IGRyYWdnaW5nIHNvIHRoZSByZWxhdGl2ZSBncmFiIHBvcyBpcyBjb25zdGFudFxuICAgICAgICAgIHVwZGF0ZURyYWdEZWx0YSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHByZXZlbnQgdGhlIGRyYWdnaW5nIGZyb20gdHJpZ2dlcmluZyB0ZXh0IHNlbGVjdGlvbiBvbiB0aGUgcGFnZVxuICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgIH1cbiAgICBzZWxlY3RbMl0gPSBwb3NbMF07XG4gICAgc2VsZWN0WzNdID0gcG9zWzFdO1xuICAgIGlmIChwcmV2ZW50RGVmYXVsdCkge1xuICAgICAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKGUucHJldmVudERlZmF1bHQpIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbiAgdmFyIGNsaWNrVGltZW91dCwgZGlkRG91YmxlQ2xpY2ssIHByZXZDbGlja1RpbWVTdGFtcDtcbiAgci5yZWdpc3RlckJpbmRpbmcoY29udGFpbmVyV2luZG93LCAnbW91c2V1cCcsIGZ1bmN0aW9uIG1vdXNldXBIYW5kbGVyKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgdmFyIGNhcHR1cmUgPSByLmhvdmVyRGF0YS5jYXB0dXJlO1xuICAgIGlmICghY2FwdHVyZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByLmhvdmVyRGF0YS5jYXB0dXJlID0gZmFsc2U7XG4gICAgdmFyIGN5ID0gci5jeTtcbiAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICB2YXIgc2VsZWN0ID0gci5zZWxlY3Rpb247XG4gICAgdmFyIG5lYXIgPSByLmZpbmROZWFyZXN0RWxlbWVudChwb3NbMF0sIHBvc1sxXSwgdHJ1ZSwgZmFsc2UpO1xuICAgIHZhciBkcmFnZ2VkRWxlbWVudHMgPSByLmRyYWdEYXRhLnBvc3NpYmxlRHJhZ0VsZW1lbnRzO1xuICAgIHZhciBkb3duID0gci5ob3ZlckRhdGEuZG93bjtcbiAgICB2YXIgbXVsdFNlbEtleURvd24gPSBpc011bHRTZWxLZXlEb3duKGUpO1xuICAgIGlmIChyLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24pIHtcbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICByLnJlZHJhdygpO1xuICAgIH1cbiAgICByLmhvdmVyRGF0YS50YXBob2xkQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7IC8vIG5vdCBhY3RpdmUgYmcgbm93XG5cbiAgICBpZiAoZG93bikge1xuICAgICAgZG93bi51bmFjdGl2YXRlKCk7XG4gICAgfVxuICAgIGlmIChyLmhvdmVyRGF0YS53aGljaCA9PT0gMykge1xuICAgICAgdmFyIGN4dEV2dCA9IHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdHlwZTogJ2N4dHRhcGVuZCcsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKGRvd24pIHtcbiAgICAgICAgZG93bi5lbWl0KGN4dEV2dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjeS5lbWl0KGN4dEV2dCk7XG4gICAgICB9XG4gICAgICBpZiAoIXIuaG92ZXJEYXRhLmN4dERyYWdnZWQpIHtcbiAgICAgICAgdmFyIGN4dFRhcCA9IHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHR5cGU6ICdjeHR0YXAnLFxuICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChkb3duKSB7XG4gICAgICAgICAgZG93bi5lbWl0KGN4dFRhcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3kuZW1pdChjeHRUYXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByLmhvdmVyRGF0YS5jeHREcmFnZ2VkID0gZmFsc2U7XG4gICAgICByLmhvdmVyRGF0YS53aGljaCA9IG51bGw7XG4gICAgfSBlbHNlIGlmIChyLmhvdmVyRGF0YS53aGljaCA9PT0gMSkge1xuICAgICAgdHJpZ2dlckV2ZW50cyhuZWFyLCBbJ21vdXNldXAnLCAndGFwZW5kJywgJ3Ztb3VzZXVwJ10sIGUsIHtcbiAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICB5OiBwb3NbMV1cbiAgICAgIH0pO1xuICAgICAgaWYgKCFyLmRyYWdEYXRhLmRpZERyYWcgJiZcbiAgICAgIC8vIGRpZG4ndCBtb3ZlIGEgbm9kZSBhcm91bmRcbiAgICAgICFyLmhvdmVyRGF0YS5kcmFnZ2VkICYmXG4gICAgICAvLyBkaWRuJ3QgcGFuXG4gICAgICAhci5ob3ZlckRhdGEuc2VsZWN0aW5nICYmXG4gICAgICAvLyBub3QgYm94IHNlbGVjdGlvblxuICAgICAgIXIuaG92ZXJEYXRhLmlzT3ZlclRocmVzaG9sZERyYWcgLy8gZGlkbid0IG1vdmUgdG9vIG11Y2hcbiAgICAgICkge1xuICAgICAgICB0cmlnZ2VyRXZlbnRzKGRvd24sIFtcImNsaWNrXCIsIFwidGFwXCIsIFwidmNsaWNrXCJdLCBlLCB7XG4gICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICB9KTtcbiAgICAgICAgZGlkRG91YmxlQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgaWYgKGUudGltZVN0YW1wIC0gcHJldkNsaWNrVGltZVN0YW1wIDw9IGN5Lm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUoKSkge1xuICAgICAgICAgIGNsaWNrVGltZW91dCAmJiBjbGVhclRpbWVvdXQoY2xpY2tUaW1lb3V0KTtcbiAgICAgICAgICBkaWREb3VibGVDbGljayA9IHRydWU7XG4gICAgICAgICAgcHJldkNsaWNrVGltZVN0YW1wID0gbnVsbDtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnRzKGRvd24sIFtcImRibGNsaWNrXCIsIFwiZGJsdGFwXCIsIFwidmRibGNsaWNrXCJdLCBlLCB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbGlja1RpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChkaWREb3VibGVDbGljaykgcmV0dXJuO1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50cyhkb3duLCBbXCJvbmVjbGlja1wiLCBcIm9uZXRhcFwiLCBcInZvbmVjbGlja1wiXSwgZSwge1xuICAgICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSwgY3kubXVsdGlDbGlja0RlYm91bmNlVGltZSgpKTtcbiAgICAgICAgICBwcmV2Q2xpY2tUaW1lU3RhbXAgPSBlLnRpbWVTdGFtcDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEZXNlbGVjdCBhbGwgZWxlbWVudHMgaWYgbm90aGluZyBpcyBjdXJyZW50bHkgdW5kZXIgdGhlIG1vdXNlIGN1cnNvciBhbmQgd2UgYXJlbid0IGRyYWdnaW5nIHNvbWV0aGluZ1xuICAgICAgaWYgKGRvd24gPT0gbnVsbCAvLyBub3QgbW91c2Vkb3duIG9uIG5vZGVcbiAgICAgICYmICFyLmRyYWdEYXRhLmRpZERyYWcgLy8gZGlkbid0IG1vdmUgdGhlIG5vZGUgYXJvdW5kXG4gICAgICAmJiAhci5ob3ZlckRhdGEuc2VsZWN0aW5nIC8vIG5vdCBib3ggc2VsZWN0aW9uXG4gICAgICAmJiAhci5ob3ZlckRhdGEuZHJhZ2dlZCAvLyBkaWRuJ3QgcGFuXG4gICAgICAmJiAhaXNNdWx0U2VsS2V5RG93bihlKSkge1xuICAgICAgICBjeS4kKGlzU2VsZWN0ZWQpLnVuc2VsZWN0KFsndGFwdW5zZWxlY3QnXSk7XG4gICAgICAgIGlmIChkcmFnZ2VkRWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHIuZHJhZ0RhdGEucG9zc2libGVEcmFnRWxlbWVudHMgPSBkcmFnZ2VkRWxlbWVudHMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNpbmdsZSBzZWxlY3Rpb25cbiAgICAgIGlmIChuZWFyID09IGRvd24gJiYgIXIuZHJhZ0RhdGEuZGlkRHJhZyAmJiAhci5ob3ZlckRhdGEuc2VsZWN0aW5nKSB7XG4gICAgICAgIGlmIChuZWFyICE9IG51bGwgJiYgbmVhci5fcHJpdmF0ZS5zZWxlY3RhYmxlKSB7XG4gICAgICAgICAgaWYgKHIuaG92ZXJEYXRhLmRyYWdnaW5nKSA7IGVsc2UgaWYgKGN5LnNlbGVjdGlvblR5cGUoKSA9PT0gJ2FkZGl0aXZlJyB8fCBtdWx0U2VsS2V5RG93bikge1xuICAgICAgICAgICAgaWYgKG5lYXIuc2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgICBuZWFyLnVuc2VsZWN0KFsndGFwdW5zZWxlY3QnXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBuZWFyLnNlbGVjdChbJ3RhcHNlbGVjdCddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFtdWx0U2VsS2V5RG93bikge1xuICAgICAgICAgICAgICBjeS4kKGlzU2VsZWN0ZWQpLnVubWVyZ2UobmVhcikudW5zZWxlY3QoWyd0YXB1bnNlbGVjdCddKTtcbiAgICAgICAgICAgICAgbmVhci5zZWxlY3QoWyd0YXBzZWxlY3QnXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoci5ob3ZlckRhdGEuc2VsZWN0aW5nKSB7XG4gICAgICAgIHZhciBib3ggPSBjeS5jb2xsZWN0aW9uKHIuZ2V0QWxsSW5Cb3goc2VsZWN0WzBdLCBzZWxlY3RbMV0sIHNlbGVjdFsyXSwgc2VsZWN0WzNdKSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgIGlmIChib3gubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGN5LmVtaXQoe1xuICAgICAgICAgIHR5cGU6ICdib3hlbmQnLFxuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBlbGVXb3VsZEJlU2VsZWN0ZWQgPSBmdW5jdGlvbiBlbGVXb3VsZEJlU2VsZWN0ZWQoZWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZS5zZWxlY3RhYmxlKCkgJiYgIWVsZS5zZWxlY3RlZCgpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoY3kuc2VsZWN0aW9uVHlwZSgpID09PSAnYWRkaXRpdmUnKSB7XG4gICAgICAgICAgYm94LmVtaXQoJ2JveCcpLnN0ZEZpbHRlcihlbGVXb3VsZEJlU2VsZWN0ZWQpLnNlbGVjdCgpLmVtaXQoJ2JveHNlbGVjdCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghbXVsdFNlbEtleURvd24pIHtcbiAgICAgICAgICAgIGN5LiQoaXNTZWxlY3RlZCkudW5tZXJnZShib3gpLnVuc2VsZWN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJveC5lbWl0KCdib3gnKS5zdGRGaWx0ZXIoZWxlV291bGRCZVNlbGVjdGVkKS5zZWxlY3QoKS5lbWl0KCdib3hzZWxlY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFsd2F5cyBuZWVkIHJlZHJhdyBpbiBjYXNlIGVsZXMgdW5zZWxlY3RhYmxlXG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbmNlbCBkcmFnIHBhblxuICAgICAgaWYgKHIuaG92ZXJEYXRhLmRyYWdnaW5nKSB7XG4gICAgICAgIHIuaG92ZXJEYXRhLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICByLnJlZHJhdygpO1xuICAgICAgfVxuICAgICAgaWYgKCFzZWxlY3RbNF0pIHtcbiAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICB2YXIgZG93bldhc0dyYWJiZWQgPSBkb3duICYmIGRvd24uZ3JhYmJlZCgpO1xuICAgICAgICBmcmVlRHJhZ2dlZEVsZW1lbnRzKGRyYWdnZWRFbGVtZW50cyk7XG4gICAgICAgIGlmIChkb3duV2FzR3JhYmJlZCkge1xuICAgICAgICAgIGRvd24uZW1pdCgnZnJlZW9uJyk7XG4gICAgICAgICAgZHJhZ2dlZEVsZW1lbnRzLmVtaXQoJ2ZyZWUnKTtcbiAgICAgICAgICBpZiAoci5kcmFnRGF0YS5kaWREcmFnKSB7XG4gICAgICAgICAgICBkb3duLmVtaXQoJ2RyYWdmcmVlb24nKTtcbiAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50cy5lbWl0KCdkcmFnZnJlZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gZWxzZSBub3QgcmlnaHQgbW91c2VcblxuICAgIHNlbGVjdFs0XSA9IDA7XG4gICAgci5ob3ZlckRhdGEuZG93biA9IG51bGw7XG4gICAgci5ob3ZlckRhdGEuY3h0U3RhcnRlZCA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLnNlbGVjdGluZyA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLmlzT3ZlclRocmVzaG9sZERyYWcgPSBmYWxzZTtcbiAgICByLmRyYWdEYXRhLmRpZERyYWcgPSBmYWxzZTtcbiAgICByLmhvdmVyRGF0YS5kcmFnZ2VkID0gZmFsc2U7XG4gICAgci5ob3ZlckRhdGEuZHJhZ0RlbHRhID0gW107XG4gICAgci5ob3ZlckRhdGEubWRvd25Qb3MgPSBudWxsO1xuICAgIHIuaG92ZXJEYXRhLm1kb3duR1BvcyA9IG51bGw7XG4gIH0sIGZhbHNlKTtcbiAgdmFyIHdoZWVsSGFuZGxlciA9IGZ1bmN0aW9uIHdoZWVsSGFuZGxlcihlKSB7XG4gICAgaWYgKHIuc2Nyb2xsaW5nUGFnZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gd2hpbGUgc2Nyb2xsaW5nLCBpZ25vcmUgd2hlZWwtdG8tem9vbVxuXG4gICAgdmFyIGN5ID0gci5jeTtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgdmFyIHJwb3MgPSBbcG9zWzBdICogem9vbSArIHBhbi54LCBwb3NbMV0gKiB6b29tICsgcGFuLnldO1xuICAgIGlmIChyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgfHwgci5ob3ZlckRhdGEuZHJhZ2dpbmcgfHwgci5ob3ZlckRhdGEuY3h0U3RhcnRlZCB8fCBpbkJveFNlbGVjdGlvbigpKSB7XG4gICAgICAvLyBpZiBwYW4gZHJhZ2dpbmcgb3IgY3h0IGRyYWdnaW5nLCB3aGVlbCBtb3ZlbWVudHMgbWFrZSBubyB6b29tXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjeS5wYW5uaW5nRW5hYmxlZCgpICYmIGN5LnVzZXJQYW5uaW5nRW5hYmxlZCgpICYmIGN5Lnpvb21pbmdFbmFibGVkKCkgJiYgY3kudXNlclpvb21pbmdFbmFibGVkKCkpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHIuZGF0YS53aGVlbFpvb21pbmcgPSB0cnVlO1xuICAgICAgY2xlYXJUaW1lb3V0KHIuZGF0YS53aGVlbFRpbWVvdXQpO1xuICAgICAgci5kYXRhLndoZWVsVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICByLmRhdGEud2hlZWxab29taW5nID0gZmFsc2U7XG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICByLnJlZHJhdygpO1xuICAgICAgfSwgMTUwKTtcbiAgICAgIHZhciBkaWZmO1xuICAgICAgaWYgKGUuZGVsdGFZICE9IG51bGwpIHtcbiAgICAgICAgZGlmZiA9IGUuZGVsdGFZIC8gLTI1MDtcbiAgICAgIH0gZWxzZSBpZiAoZS53aGVlbERlbHRhWSAhPSBudWxsKSB7XG4gICAgICAgIGRpZmYgPSBlLndoZWVsRGVsdGFZIC8gMTAwMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpZmYgPSBlLndoZWVsRGVsdGEgLyAxMDAwO1xuICAgICAgfVxuICAgICAgZGlmZiA9IGRpZmYgKiByLndoZWVsU2Vuc2l0aXZpdHk7XG4gICAgICB2YXIgbmVlZHNXaGVlbEZpeCA9IGUuZGVsdGFNb2RlID09PSAxO1xuICAgICAgaWYgKG5lZWRzV2hlZWxGaXgpIHtcbiAgICAgICAgLy8gZml4ZXMgc2xvdyB3aGVlbCBldmVudHMgb24gZmYvbGludXggYW5kIGZmL3dpbmRvd3NcbiAgICAgICAgZGlmZiAqPSAzMztcbiAgICAgIH1cbiAgICAgIHZhciBuZXdab29tID0gY3kuem9vbSgpICogTWF0aC5wb3coMTAsIGRpZmYpO1xuICAgICAgaWYgKGUudHlwZSA9PT0gJ2dlc3R1cmVjaGFuZ2UnKSB7XG4gICAgICAgIG5ld1pvb20gPSByLmdlc3R1cmVTdGFydFpvb20gKiBlLnNjYWxlO1xuICAgICAgfVxuICAgICAgY3kuem9vbSh7XG4gICAgICAgIGxldmVsOiBuZXdab29tLFxuICAgICAgICByZW5kZXJlZFBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogcnBvc1swXSxcbiAgICAgICAgICB5OiBycG9zWzFdXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY3kuZW1pdChlLnR5cGUgPT09ICdnZXN0dXJlY2hhbmdlJyA/ICdwaW5jaHpvb20nIDogJ3Njcm9sbHpvb20nKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gRnVuY3Rpb25zIHRvIGhlbHAgd2l0aCB3aGV0aGVyIG1vdXNlIHdoZWVsIHNob3VsZCB0cmlnZ2VyIHpvb21pbmdcbiAgLy8gLS1cbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICd3aGVlbCcsIHdoZWVsSGFuZGxlciwgdHJ1ZSk7XG5cbiAgLy8gZGlzYWJsZSBub25zdGFuZGFyZCB3aGVlbCBldmVudHNcbiAgLy8gci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdtb3VzZXdoZWVsJywgd2hlZWxIYW5kbGVyLCB0cnVlKTtcbiAgLy8gci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdET01Nb3VzZVNjcm9sbCcsIHdoZWVsSGFuZGxlciwgdHJ1ZSk7XG4gIC8vIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnTW96TW91c2VQaXhlbFNjcm9sbCcsIHdoZWVsSGFuZGxlciwgdHJ1ZSk7IC8vIG9sZGVyIGZpcmVmb3hcblxuICByLnJlZ2lzdGVyQmluZGluZyhjb250YWluZXJXaW5kb3csICdzY3JvbGwnLCBmdW5jdGlvbiBzY3JvbGxIYW5kbGVyKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgci5zY3JvbGxpbmdQYWdlID0gdHJ1ZTtcbiAgICBjbGVhclRpbWVvdXQoci5zY3JvbGxpbmdQYWdlVGltZW91dCk7XG4gICAgci5zY3JvbGxpbmdQYWdlVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgci5zY3JvbGxpbmdQYWdlID0gZmFsc2U7XG4gICAgfSwgMjUwKTtcbiAgfSwgdHJ1ZSk7XG5cbiAgLy8gZGVza3RvcCBzYWZhcmkgcGluY2ggdG8gem9vbSBzdGFydFxuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ2dlc3R1cmVzdGFydCcsIGZ1bmN0aW9uIGdlc3R1cmVTdGFydEhhbmRsZXIoZSkge1xuICAgIHIuZ2VzdHVyZVN0YXJ0Wm9vbSA9IHIuY3kuem9vbSgpO1xuICAgIGlmICghci5oYXNUb3VjaFN0YXJ0ZWQpIHtcbiAgICAgIC8vIGRvbid0IGFmZmVjdCB0b3VjaCBkZXZpY2VzIGxpa2UgaXBob25lXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9LCB0cnVlKTtcbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdnZXN0dXJlY2hhbmdlJywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoIXIuaGFzVG91Y2hTdGFydGVkKSB7XG4gICAgICAvLyBkb24ndCBhZmZlY3QgdG91Y2ggZGV2aWNlcyBsaWtlIGlwaG9uZVxuICAgICAgd2hlZWxIYW5kbGVyKGUpO1xuICAgIH1cbiAgfSwgdHJ1ZSk7XG5cbiAgLy8gRnVuY3Rpb25zIHRvIGhlbHAgd2l0aCBoYW5kbGluZyBtb3VzZW91dC9tb3VzZW92ZXIgb24gdGhlIEN5dG9zY2FwZSBjb250YWluZXJcbiAgLy8gSGFuZGxlIG1vdXNlb3V0IG9uIEN5dG9zY2FwZSBjb250YWluZXJcbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdtb3VzZW91dCcsIGZ1bmN0aW9uIG1vdXNlT3V0SGFuZGxlcihlKSB7XG4gICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgci5jeS5lbWl0KHtcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICB0eXBlOiAnbW91c2VvdXQnLFxuICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICB5OiBwb3NbMV1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgZmFsc2UpO1xuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ21vdXNlb3ZlcicsIGZ1bmN0aW9uIG1vdXNlT3ZlckhhbmRsZXIoZSkge1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIHIuY3kuZW1pdCh7XG4gICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgdHlwZTogJ21vdXNlb3ZlcicsXG4gICAgICBwb3NpdGlvbjoge1xuICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgIHk6IHBvc1sxXVxuICAgICAgfVxuICAgIH0pO1xuICB9LCBmYWxzZSk7XG4gIHZhciBmMXgxLCBmMXkxLCBmMngxLCBmMnkxOyAvLyBzdGFydGluZyBwb2ludHMgZm9yIHBpbmNoLXRvLXpvb21cbiAgdmFyIGRpc3RhbmNlMSwgZGlzdGFuY2UxU3E7IC8vIGluaXRpYWwgZGlzdGFuY2UgYmV0d2VlbiBmaW5nZXIgMSBhbmQgZmluZ2VyIDIgZm9yIHBpbmNoLXRvLXpvb21cbiAgdmFyIGNlbnRlcjEsIG1vZGVsQ2VudGVyMTsgLy8gY2VudGVyIHBvaW50IG9uIHN0YXJ0IHBpbmNoIHRvIHpvb21cbiAgdmFyIG9mZnNldExlZnQsIG9mZnNldFRvcDtcbiAgdmFyIGNvbnRhaW5lcldpZHRoLCBjb250YWluZXJIZWlnaHQ7XG4gIHZhciB0d29GaW5nZXJzU3RhcnRJbnNpZGU7XG4gIHZhciBkaXN0YW5jZSA9IGZ1bmN0aW9uIGRpc3RhbmNlKHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCgoeDIgLSB4MSkgKiAoeDIgLSB4MSkgKyAoeTIgLSB5MSkgKiAoeTIgLSB5MSkpO1xuICB9O1xuICB2YXIgZGlzdGFuY2VTcSA9IGZ1bmN0aW9uIGRpc3RhbmNlU3EoeDEsIHkxLCB4MiwgeTIpIHtcbiAgICByZXR1cm4gKHgyIC0geDEpICogKHgyIC0geDEpICsgKHkyIC0geTEpICogKHkyIC0geTEpO1xuICB9O1xuICB2YXIgdG91Y2hzdGFydEhhbmRsZXI7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAndG91Y2hzdGFydCcsIHRvdWNoc3RhcnRIYW5kbGVyID0gZnVuY3Rpb24gdG91Y2hzdGFydEhhbmRsZXIoZSkge1xuICAgIHIuaGFzVG91Y2hTdGFydGVkID0gdHJ1ZTtcbiAgICBpZiAoIWV2ZW50SW5Db250YWluZXIoZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYmx1ckFjdGl2ZURvbUVsZW1lbnQoKTtcbiAgICByLnRvdWNoRGF0YS5jYXB0dXJlID0gdHJ1ZTtcbiAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgdmFyIGN5ID0gci5jeTtcbiAgICB2YXIgbm93ID0gci50b3VjaERhdGEubm93O1xuICAgIHZhciBlYXJsaWVyID0gci50b3VjaERhdGEuZWFybGllcjtcbiAgICBpZiAoZS50b3VjaGVzWzBdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICBub3dbMF0gPSBwb3NbMF07XG4gICAgICBub3dbMV0gPSBwb3NbMV07XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMV0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzFdLmNsaWVudFgsIGUudG91Y2hlc1sxXS5jbGllbnRZKTtcbiAgICAgIG5vd1syXSA9IHBvc1swXTtcbiAgICAgIG5vd1szXSA9IHBvc1sxXTtcbiAgICB9XG4gICAgaWYgKGUudG91Y2hlc1syXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMl0uY2xpZW50WCwgZS50b3VjaGVzWzJdLmNsaWVudFkpO1xuICAgICAgbm93WzRdID0gcG9zWzBdO1xuICAgICAgbm93WzVdID0gcG9zWzFdO1xuICAgIH1cblxuICAgIC8vIHJlY29yZCBzdGFydGluZyBwb2ludHMgZm9yIHBpbmNoLXRvLXpvb21cbiAgICBpZiAoZS50b3VjaGVzWzFdKSB7XG4gICAgICByLnRvdWNoRGF0YS5zaW5nbGVUb3VjaE1vdmVkID0gdHJ1ZTtcbiAgICAgIGZyZWVEcmFnZ2VkRWxlbWVudHMoci5kcmFnRGF0YS50b3VjaERyYWdFbGVzKTtcbiAgICAgIHZhciBvZmZzZXRzID0gci5maW5kQ29udGFpbmVyQ2xpZW50Q29vcmRzKCk7XG4gICAgICBvZmZzZXRMZWZ0ID0gb2Zmc2V0c1swXTtcbiAgICAgIG9mZnNldFRvcCA9IG9mZnNldHNbMV07XG4gICAgICBjb250YWluZXJXaWR0aCA9IG9mZnNldHNbMl07XG4gICAgICBjb250YWluZXJIZWlnaHQgPSBvZmZzZXRzWzNdO1xuICAgICAgZjF4MSA9IGUudG91Y2hlc1swXS5jbGllbnRYIC0gb2Zmc2V0TGVmdDtcbiAgICAgIGYxeTEgPSBlLnRvdWNoZXNbMF0uY2xpZW50WSAtIG9mZnNldFRvcDtcbiAgICAgIGYyeDEgPSBlLnRvdWNoZXNbMV0uY2xpZW50WCAtIG9mZnNldExlZnQ7XG4gICAgICBmMnkxID0gZS50b3VjaGVzWzFdLmNsaWVudFkgLSBvZmZzZXRUb3A7XG4gICAgICB0d29GaW5nZXJzU3RhcnRJbnNpZGUgPSAwIDw9IGYxeDEgJiYgZjF4MSA8PSBjb250YWluZXJXaWR0aCAmJiAwIDw9IGYyeDEgJiYgZjJ4MSA8PSBjb250YWluZXJXaWR0aCAmJiAwIDw9IGYxeTEgJiYgZjF5MSA8PSBjb250YWluZXJIZWlnaHQgJiYgMCA8PSBmMnkxICYmIGYyeTEgPD0gY29udGFpbmVySGVpZ2h0O1xuICAgICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgICBkaXN0YW5jZTEgPSBkaXN0YW5jZShmMXgxLCBmMXkxLCBmMngxLCBmMnkxKTtcbiAgICAgIGRpc3RhbmNlMVNxID0gZGlzdGFuY2VTcShmMXgxLCBmMXkxLCBmMngxLCBmMnkxKTtcbiAgICAgIGNlbnRlcjEgPSBbKGYxeDEgKyBmMngxKSAvIDIsIChmMXkxICsgZjJ5MSkgLyAyXTtcbiAgICAgIG1vZGVsQ2VudGVyMSA9IFsoY2VudGVyMVswXSAtIHBhbi54KSAvIHpvb20sIChjZW50ZXIxWzFdIC0gcGFuLnkpIC8gem9vbV07XG5cbiAgICAgIC8vIGNvbnNpZGVyIGNvbnRleHQgdGFwXG4gICAgICB2YXIgY3h0RGlzdFRocmVzaG9sZCA9IDIwMDtcbiAgICAgIHZhciBjeHREaXN0VGhyZXNob2xkU3EgPSBjeHREaXN0VGhyZXNob2xkICogY3h0RGlzdFRocmVzaG9sZDtcbiAgICAgIGlmIChkaXN0YW5jZTFTcSA8IGN4dERpc3RUaHJlc2hvbGRTcSAmJiAhZS50b3VjaGVzWzJdKSB7XG4gICAgICAgIHZhciBuZWFyMSA9IHIuZmluZE5lYXJlc3RFbGVtZW50KG5vd1swXSwgbm93WzFdLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdmFyIG5lYXIyID0gci5maW5kTmVhcmVzdEVsZW1lbnQobm93WzJdLCBub3dbM10sIHRydWUsIHRydWUpO1xuICAgICAgICBpZiAobmVhcjEgJiYgbmVhcjEuaXNOb2RlKCkpIHtcbiAgICAgICAgICBuZWFyMS5hY3RpdmF0ZSgpLmVtaXQoe1xuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgIHR5cGU6ICdjeHR0YXBzdGFydCcsXG4gICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0ID0gbmVhcjE7XG4gICAgICAgIH0gZWxzZSBpZiAobmVhcjIgJiYgbmVhcjIuaXNOb2RlKCkpIHtcbiAgICAgICAgICBuZWFyMi5hY3RpdmF0ZSgpLmVtaXQoe1xuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgIHR5cGU6ICdjeHR0YXBzdGFydCcsXG4gICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0ID0gbmVhcjI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3kuZW1pdCh7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgdHlwZTogJ2N4dHRhcHN0YXJ0JyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIudG91Y2hEYXRhLnN0YXJ0KSB7XG4gICAgICAgICAgci50b3VjaERhdGEuc3RhcnQuX3ByaXZhdGUuZ3JhYmJlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHIudG91Y2hEYXRhLmN4dCA9IHRydWU7XG4gICAgICAgIHIudG91Y2hEYXRhLmN4dERyYWdnZWQgPSBmYWxzZTtcbiAgICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICByLnJlZHJhdygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIC8vIGlnbm9yZVxuXG4gICAgICAvLyBzYWZhcmkgb24gaW9zIHBhbnMgdGhlIHBhZ2Ugb3RoZXJ3aXNlIChub3JtYWxseSB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gcHJldmVudGRlZmF1bHQgb24gdG91Y2htb3ZlLi4uKVxuICAgICAgaWYgKGN5LmJveFNlbGVjdGlvbkVuYWJsZWQoKSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlLnRvdWNoZXNbMV0pIDsgZWxzZSBpZiAoZS50b3VjaGVzWzBdKSB7XG4gICAgICB2YXIgbmVhcnMgPSByLmZpbmROZWFyZXN0RWxlbWVudHMobm93WzBdLCBub3dbMV0sIHRydWUsIHRydWUpO1xuICAgICAgdmFyIG5lYXIgPSBuZWFyc1swXTtcbiAgICAgIGlmIChuZWFyICE9IG51bGwpIHtcbiAgICAgICAgbmVhci5hY3RpdmF0ZSgpO1xuICAgICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG5lYXI7XG4gICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0cyA9IG5lYXJzO1xuICAgICAgICBpZiAoci5ub2RlSXNHcmFiYmFibGUobmVhcikpIHtcbiAgICAgICAgICB2YXIgZHJhZ2dlZEVsZXMgPSByLmRyYWdEYXRhLnRvdWNoRHJhZ0VsZXMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgICAgdmFyIHNlbGVjdGVkTm9kZXMgPSBudWxsO1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICAgIGlmIChuZWFyLnNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIC8vIHJlc2V0IGRyYWcgZWxlbWVudHMsIHNpbmNlIG5lYXIgd2lsbCBiZSBhZGRlZCBhZ2FpblxuXG4gICAgICAgICAgICBzZWxlY3RlZE5vZGVzID0gY3kuJChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbGUuc2VsZWN0ZWQoKSAmJiByLm5vZGVJc0dyYWJiYWJsZShlbGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhZGROb2Rlc1RvRHJhZyhzZWxlY3RlZE5vZGVzLCB7XG4gICAgICAgICAgICAgIGFkZFRvTGlzdDogZHJhZ2dlZEVsZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZGROb2RlVG9EcmFnKG5lYXIsIHtcbiAgICAgICAgICAgICAgYWRkVG9MaXN0OiBkcmFnZ2VkRWxlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldEdyYWJUYXJnZXQobmVhcik7XG4gICAgICAgICAgdmFyIG1ha2VFdmVudCA9IGZ1bmN0aW9uIG1ha2VFdmVudCh0eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIG5lYXIuZW1pdChtYWtlRXZlbnQoJ2dyYWJvbicpKTtcbiAgICAgICAgICBpZiAoc2VsZWN0ZWROb2Rlcykge1xuICAgICAgICAgICAgc2VsZWN0ZWROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICAgIG4uZW1pdChtYWtlRXZlbnQoJ2dyYWInKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmVhci5lbWl0KG1ha2VFdmVudCgnZ3JhYicpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudHMobmVhciwgWyd0b3VjaHN0YXJ0JywgJ3RhcHN0YXJ0JywgJ3Ztb3VzZWRvd24nXSwgZSwge1xuICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgIHk6IG5vd1sxXVxuICAgICAgfSk7XG4gICAgICBpZiAobmVhciA9PSBudWxsKSB7XG4gICAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHtcbiAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgIH07XG4gICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRhcCwgdGFwaG9sZFxuICAgICAgLy8gLS0tLS1cblxuICAgICAgci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCA9IGZhbHNlO1xuICAgICAgci50b3VjaERhdGEuc2luZ2xlVG91Y2hTdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICAgIGNsZWFyVGltZW91dChyLnRvdWNoRGF0YS50YXBob2xkVGltZW91dCk7XG4gICAgICByLnRvdWNoRGF0YS50YXBob2xkVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCA9PT0gZmFsc2UgJiYgIXIucGluY2hpbmcgLy8gaWYgcGluY2hpbmcsIHRoZW4gdGFwaG9sZCB1bnNlbGVjdCBzaG91bGRuJ3QgdGFrZSBlZmZlY3RcbiAgICAgICAgJiYgIXIudG91Y2hEYXRhLnNlbGVjdGluZyAvLyBib3ggc2VsZWN0aW9uIHNob3VsZG4ndCBhbGxvdyB0YXBob2xkIHRocm91Z2hcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50cyhyLnRvdWNoRGF0YS5zdGFydCwgWyd0YXBob2xkJ10sIGUsIHtcbiAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCByLnRhcGhvbGREdXJhdGlvbik7XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID49IDEpIHtcbiAgICAgIHZhciBzUG9zID0gci50b3VjaERhdGEuc3RhcnRQb3NpdGlvbiA9IFtudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNQb3NbaV0gPSBlYXJsaWVyW2ldID0gbm93W2ldO1xuICAgICAgfVxuICAgICAgdmFyIHRvdWNoMCA9IGUudG91Y2hlc1swXTtcbiAgICAgIHIudG91Y2hEYXRhLnN0YXJ0R1Bvc2l0aW9uID0gW3RvdWNoMC5jbGllbnRYLCB0b3VjaDAuY2xpZW50WV07XG4gICAgfVxuICB9LCBmYWxzZSk7XG4gIHZhciB0b3VjaG1vdmVIYW5kbGVyO1xuICByLnJlZ2lzdGVyQmluZGluZyh3aW5kb3csICd0b3VjaG1vdmUnLCB0b3VjaG1vdmVIYW5kbGVyID0gZnVuY3Rpb24gdG91Y2htb3ZlSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIHZhciBjYXB0dXJlID0gci50b3VjaERhdGEuY2FwdHVyZTtcbiAgICBpZiAoIWNhcHR1cmUgJiYgIWV2ZW50SW5Db250YWluZXIoZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHNlbGVjdCA9IHIuc2VsZWN0aW9uO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIG5vdyA9IHIudG91Y2hEYXRhLm5vdztcbiAgICB2YXIgZWFybGllciA9IHIudG91Y2hEYXRhLmVhcmxpZXI7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgaWYgKGUudG91Y2hlc1swXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFkpO1xuICAgICAgbm93WzBdID0gcG9zWzBdO1xuICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgIH1cbiAgICBpZiAoZS50b3VjaGVzWzFdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1sxXS5jbGllbnRYLCBlLnRvdWNoZXNbMV0uY2xpZW50WSk7XG4gICAgICBub3dbMl0gPSBwb3NbMF07XG4gICAgICBub3dbM10gPSBwb3NbMV07XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzJdLmNsaWVudFgsIGUudG91Y2hlc1syXS5jbGllbnRZKTtcbiAgICAgIG5vd1s0XSA9IHBvc1swXTtcbiAgICAgIG5vd1s1XSA9IHBvc1sxXTtcbiAgICB9XG4gICAgdmFyIHN0YXJ0R1BvcyA9IHIudG91Y2hEYXRhLnN0YXJ0R1Bvc2l0aW9uO1xuICAgIHZhciBpc092ZXJUaHJlc2hvbGREcmFnO1xuICAgIGlmIChjYXB0dXJlICYmIGUudG91Y2hlc1swXSAmJiBzdGFydEdQb3MpIHtcbiAgICAgIHZhciBkaXNwID0gW107XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5vdy5sZW5ndGg7IGorKykge1xuICAgICAgICBkaXNwW2pdID0gbm93W2pdIC0gZWFybGllcltqXTtcbiAgICAgIH1cbiAgICAgIHZhciBkeCA9IGUudG91Y2hlc1swXS5jbGllbnRYIC0gc3RhcnRHUG9zWzBdO1xuICAgICAgdmFyIGR4MiA9IGR4ICogZHg7XG4gICAgICB2YXIgZHkgPSBlLnRvdWNoZXNbMF0uY2xpZW50WSAtIHN0YXJ0R1Bvc1sxXTtcbiAgICAgIHZhciBkeTIgPSBkeSAqIGR5O1xuICAgICAgdmFyIGRpc3QyID0gZHgyICsgZHkyO1xuICAgICAgaXNPdmVyVGhyZXNob2xkRHJhZyA9IGRpc3QyID49IHIudG91Y2hUYXBUaHJlc2hvbGQyO1xuICAgIH1cblxuICAgIC8vIGNvbnRleHQgc3dpcGUgY2FuY2VsbGluZ1xuICAgIGlmIChjYXB0dXJlICYmIHIudG91Y2hEYXRhLmN4dCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdmFyIGYxeDIgPSBlLnRvdWNoZXNbMF0uY2xpZW50WCAtIG9mZnNldExlZnQsXG4gICAgICAgIGYxeTIgPSBlLnRvdWNoZXNbMF0uY2xpZW50WSAtIG9mZnNldFRvcDtcbiAgICAgIHZhciBmMngyID0gZS50b3VjaGVzWzFdLmNsaWVudFggLSBvZmZzZXRMZWZ0LFxuICAgICAgICBmMnkyID0gZS50b3VjaGVzWzFdLmNsaWVudFkgLSBvZmZzZXRUb3A7XG4gICAgICAvLyB2YXIgZGlzdGFuY2UyID0gZGlzdGFuY2UoIGYxeDIsIGYxeTIsIGYyeDIsIGYyeTIgKTtcbiAgICAgIHZhciBkaXN0YW5jZTJTcSA9IGRpc3RhbmNlU3EoZjF4MiwgZjF5MiwgZjJ4MiwgZjJ5Mik7XG4gICAgICB2YXIgZmFjdG9yU3EgPSBkaXN0YW5jZTJTcSAvIGRpc3RhbmNlMVNxO1xuICAgICAgdmFyIGRpc3RUaHJlc2hvbGQgPSAxNTA7XG4gICAgICB2YXIgZGlzdFRocmVzaG9sZFNxID0gZGlzdFRocmVzaG9sZCAqIGRpc3RUaHJlc2hvbGQ7XG4gICAgICB2YXIgZmFjdG9yVGhyZXNob2xkID0gMS41O1xuICAgICAgdmFyIGZhY3RvclRocmVzaG9sZFNxID0gZmFjdG9yVGhyZXNob2xkICogZmFjdG9yVGhyZXNob2xkO1xuXG4gICAgICAvLyBjYW5jZWwgY3R4IGdlc3R1cmVzIGlmIHRoZSBkaXN0YW5jZSBiL3QgdGhlIGZpbmdlcnMgaW5jcmVhc2VzXG4gICAgICBpZiAoZmFjdG9yU3EgPj0gZmFjdG9yVGhyZXNob2xkU3EgfHwgZGlzdGFuY2UyU3EgPj0gZGlzdFRocmVzaG9sZFNxKSB7XG4gICAgICAgIHIudG91Y2hEYXRhLmN4dCA9IGZhbHNlO1xuICAgICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgIHZhciBjeHRFdnQgPSB7XG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICB0eXBlOiAnY3h0dGFwZW5kJyxcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoci50b3VjaERhdGEuc3RhcnQpIHtcbiAgICAgICAgICByLnRvdWNoRGF0YS5zdGFydC51bmFjdGl2YXRlKCkuZW1pdChjeHRFdnQpO1xuICAgICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0ID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjeS5lbWl0KGN4dEV2dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb250ZXh0IHN3aXBlXG4gICAgaWYgKGNhcHR1cmUgJiYgci50b3VjaERhdGEuY3h0KSB7XG4gICAgICB2YXIgY3h0RXZ0ID0ge1xuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0eXBlOiAnY3h0ZHJhZycsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIGlmIChyLnRvdWNoRGF0YS5zdGFydCkge1xuICAgICAgICByLnRvdWNoRGF0YS5zdGFydC5lbWl0KGN4dEV2dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjeS5lbWl0KGN4dEV2dCk7XG4gICAgICB9XG4gICAgICBpZiAoci50b3VjaERhdGEuc3RhcnQpIHtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQuX3ByaXZhdGUuZ3JhYmJlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgci50b3VjaERhdGEuY3h0RHJhZ2dlZCA9IHRydWU7XG4gICAgICB2YXIgbmVhciA9IHIuZmluZE5lYXJlc3RFbGVtZW50KG5vd1swXSwgbm93WzFdLCB0cnVlLCB0cnVlKTtcbiAgICAgIGlmICghci50b3VjaERhdGEuY3h0T3ZlciB8fCBuZWFyICE9PSByLnRvdWNoRGF0YS5jeHRPdmVyKSB7XG4gICAgICAgIGlmIChyLnRvdWNoRGF0YS5jeHRPdmVyKSB7XG4gICAgICAgICAgci50b3VjaERhdGEuY3h0T3Zlci5lbWl0KHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICB0eXBlOiAnY3h0ZHJhZ291dCcsXG4gICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHIudG91Y2hEYXRhLmN4dE92ZXIgPSBuZWFyO1xuICAgICAgICBpZiAobmVhcikge1xuICAgICAgICAgIG5lYXIuZW1pdCh7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgdHlwZTogJ2N4dGRyYWdvdmVyJyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gYm94IHNlbGVjdGlvblxuICAgIH0gZWxzZSBpZiAoY2FwdHVyZSAmJiBlLnRvdWNoZXNbMl0gJiYgY3kuYm94U2VsZWN0aW9uRW5hYmxlZCgpKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmxhc3RUaHJlZVRvdWNoID0gK25ldyBEYXRlKCk7XG4gICAgICBpZiAoIXIudG91Y2hEYXRhLnNlbGVjdGluZykge1xuICAgICAgICBjeS5lbWl0KHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHR5cGU6ICdib3hzdGFydCcsXG4gICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByLnRvdWNoRGF0YS5zZWxlY3RpbmcgPSB0cnVlO1xuICAgICAgci50b3VjaERhdGEuZGlkU2VsZWN0ID0gdHJ1ZTtcbiAgICAgIHNlbGVjdFs0XSA9IDE7XG4gICAgICBpZiAoIXNlbGVjdCB8fCBzZWxlY3QubGVuZ3RoID09PSAwIHx8IHNlbGVjdFswXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNlbGVjdFswXSA9IChub3dbMF0gKyBub3dbMl0gKyBub3dbNF0pIC8gMztcbiAgICAgICAgc2VsZWN0WzFdID0gKG5vd1sxXSArIG5vd1szXSArIG5vd1s1XSkgLyAzO1xuICAgICAgICBzZWxlY3RbMl0gPSAobm93WzBdICsgbm93WzJdICsgbm93WzRdKSAvIDMgKyAxO1xuICAgICAgICBzZWxlY3RbM10gPSAobm93WzFdICsgbm93WzNdICsgbm93WzVdKSAvIDMgKyAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0WzJdID0gKG5vd1swXSArIG5vd1syXSArIG5vd1s0XSkgLyAzO1xuICAgICAgICBzZWxlY3RbM10gPSAobm93WzFdICsgbm93WzNdICsgbm93WzVdKSAvIDM7XG4gICAgICB9XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcblxuICAgICAgLy8gcGluY2ggdG8gem9vbVxuICAgIH0gZWxzZSBpZiAoY2FwdHVyZSAmJiBlLnRvdWNoZXNbMV0gJiYgIXIudG91Y2hEYXRhLmRpZFNlbGVjdCAvLyBkb24ndCBhbGxvdyBib3ggc2VsZWN0aW9uIHRvIGRlZ3JhZGUgdG8gcGluY2gtdG8tem9vbVxuICAgICYmIGN5Lnpvb21pbmdFbmFibGVkKCkgJiYgY3kucGFubmluZ0VuYWJsZWQoKSAmJiBjeS51c2VyWm9vbWluZ0VuYWJsZWQoKSAmJiBjeS51c2VyUGFubmluZ0VuYWJsZWQoKSkge1xuICAgICAgLy8gdHdvIGZpbmdlcnMgPT4gcGluY2ggdG8gem9vbVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIHZhciBkcmFnZ2VkRWxlcyA9IHIuZHJhZ0RhdGEudG91Y2hEcmFnRWxlcztcbiAgICAgIGlmIChkcmFnZ2VkRWxlcykge1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkcmFnZ2VkRWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBkZV9wID0gZHJhZ2dlZEVsZXNbaV0uX3ByaXZhdGU7XG4gICAgICAgICAgZGVfcC5ncmFiYmVkID0gZmFsc2U7XG4gICAgICAgICAgZGVfcC5yc2NyYXRjaC5pbkRyYWdMYXllciA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgX3N0YXJ0ID0gci50b3VjaERhdGEuc3RhcnQ7XG5cbiAgICAgIC8vICh4MiwgeTIpIGZvciBmaW5nZXJzIDEgYW5kIDJcbiAgICAgIHZhciBmMXgyID0gZS50b3VjaGVzWzBdLmNsaWVudFggLSBvZmZzZXRMZWZ0LFxuICAgICAgICBmMXkyID0gZS50b3VjaGVzWzBdLmNsaWVudFkgLSBvZmZzZXRUb3A7XG4gICAgICB2YXIgZjJ4MiA9IGUudG91Y2hlc1sxXS5jbGllbnRYIC0gb2Zmc2V0TGVmdCxcbiAgICAgICAgZjJ5MiA9IGUudG91Y2hlc1sxXS5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuICAgICAgdmFyIGRpc3RhbmNlMiA9IGRpc3RhbmNlKGYxeDIsIGYxeTIsIGYyeDIsIGYyeTIpO1xuICAgICAgLy8gdmFyIGRpc3RhbmNlMlNxID0gZGlzdGFuY2VTcSggZjF4MiwgZjF5MiwgZjJ4MiwgZjJ5MiApO1xuICAgICAgLy8gdmFyIGZhY3RvciA9IE1hdGguc3FydCggZGlzdGFuY2UyU3EgKSAvIE1hdGguc3FydCggZGlzdGFuY2UxU3EgKTtcbiAgICAgIHZhciBmYWN0b3IgPSBkaXN0YW5jZTIgLyBkaXN0YW5jZTE7XG4gICAgICBpZiAodHdvRmluZ2Vyc1N0YXJ0SW5zaWRlKSB7XG4gICAgICAgIC8vIGRlbHRhIGZpbmdlcjFcbiAgICAgICAgdmFyIGRmMXggPSBmMXgyIC0gZjF4MTtcbiAgICAgICAgdmFyIGRmMXkgPSBmMXkyIC0gZjF5MTtcblxuICAgICAgICAvLyBkZWx0YSBmaW5nZXIgMlxuICAgICAgICB2YXIgZGYyeCA9IGYyeDIgLSBmMngxO1xuICAgICAgICB2YXIgZGYyeSA9IGYyeTIgLSBmMnkxO1xuXG4gICAgICAgIC8vIHRyYW5zbGF0aW9uIGlzIHRoZSBub3JtYWxpc2VkIHZlY3RvciBvZiB0aGUgdHdvIGZpbmdlcnMgbW92ZW1lbnRcbiAgICAgICAgLy8gaS5lLiBzbyBwaW5jaGluZyBjYW5jZWxzIG91dCBhbmQgbW92aW5nIHRvZ2V0aGVyIHBhbnNcbiAgICAgICAgdmFyIHR4ID0gKGRmMXggKyBkZjJ4KSAvIDI7XG4gICAgICAgIHZhciB0eSA9IChkZjF5ICsgZGYyeSkgLyAyO1xuXG4gICAgICAgIC8vIG5vdyBjYWxjdWxhdGUgdGhlIHpvb21cbiAgICAgICAgdmFyIHpvb20xID0gY3kuem9vbSgpO1xuICAgICAgICB2YXIgem9vbTIgPSB6b29tMSAqIGZhY3RvcjtcbiAgICAgICAgdmFyIHBhbjEgPSBjeS5wYW4oKTtcblxuICAgICAgICAvLyB0aGUgbW9kZWwgY2VudGVyIHBvaW50IGNvbnZlcnRlZCB0byB0aGUgY3VycmVudCByZW5kZXJlZCBwb3NcbiAgICAgICAgdmFyIGN0cnggPSBtb2RlbENlbnRlcjFbMF0gKiB6b29tMSArIHBhbjEueDtcbiAgICAgICAgdmFyIGN0cnkgPSBtb2RlbENlbnRlcjFbMV0gKiB6b29tMSArIHBhbjEueTtcbiAgICAgICAgdmFyIHBhbjIgPSB7XG4gICAgICAgICAgeDogLXpvb20yIC8gem9vbTEgKiAoY3RyeCAtIHBhbjEueCAtIHR4KSArIGN0cngsXG4gICAgICAgICAgeTogLXpvb20yIC8gem9vbTEgKiAoY3RyeSAtIHBhbjEueSAtIHR5KSArIGN0cnlcbiAgICAgICAgfTtcblxuICAgICAgICAvLyByZW1vdmUgZHJhZ2dlZCBlbGVzXG4gICAgICAgIGlmIChfc3RhcnQgJiYgX3N0YXJ0LmFjdGl2ZSgpKSB7XG4gICAgICAgICAgdmFyIGRyYWdnZWRFbGVzID0gci5kcmFnRGF0YS50b3VjaERyYWdFbGVzO1xuICAgICAgICAgIGZyZWVEcmFnZ2VkRWxlbWVudHMoZHJhZ2dlZEVsZXMpO1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICAgIF9zdGFydC51bmFjdGl2YXRlKCkuZW1pdCgnZnJlZW9uJyk7XG4gICAgICAgICAgZHJhZ2dlZEVsZXMuZW1pdCgnZnJlZScpO1xuICAgICAgICAgIGlmIChyLmRyYWdEYXRhLmRpZERyYWcpIHtcbiAgICAgICAgICAgIF9zdGFydC5lbWl0KCdkcmFnZnJlZW9uJyk7XG4gICAgICAgICAgICBkcmFnZ2VkRWxlcy5lbWl0KCdkcmFnZnJlZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjeS52aWV3cG9ydCh7XG4gICAgICAgICAgem9vbTogem9vbTIsXG4gICAgICAgICAgcGFuOiBwYW4yLFxuICAgICAgICAgIGNhbmNlbE9uRmFpbGVkWm9vbTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgY3kuZW1pdCgncGluY2h6b29tJyk7XG4gICAgICAgIGRpc3RhbmNlMSA9IGRpc3RhbmNlMjtcbiAgICAgICAgZjF4MSA9IGYxeDI7XG4gICAgICAgIGYxeTEgPSBmMXkyO1xuICAgICAgICBmMngxID0gZjJ4MjtcbiAgICAgICAgZjJ5MSA9IGYyeTI7XG4gICAgICAgIHIucGluY2hpbmcgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZS1wcm9qZWN0XG4gICAgICBpZiAoZS50b3VjaGVzWzBdKSB7XG4gICAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzBdLmNsaWVudFgsIGUudG91Y2hlc1swXS5jbGllbnRZKTtcbiAgICAgICAgbm93WzBdID0gcG9zWzBdO1xuICAgICAgICBub3dbMV0gPSBwb3NbMV07XG4gICAgICB9XG4gICAgICBpZiAoZS50b3VjaGVzWzFdKSB7XG4gICAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzFdLmNsaWVudFgsIGUudG91Y2hlc1sxXS5jbGllbnRZKTtcbiAgICAgICAgbm93WzJdID0gcG9zWzBdO1xuICAgICAgICBub3dbM10gPSBwb3NbMV07XG4gICAgICB9XG4gICAgICBpZiAoZS50b3VjaGVzWzJdKSB7XG4gICAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzJdLmNsaWVudFgsIGUudG91Y2hlc1syXS5jbGllbnRZKTtcbiAgICAgICAgbm93WzRdID0gcG9zWzBdO1xuICAgICAgICBub3dbNV0gPSBwb3NbMV07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlLnRvdWNoZXNbMF0gJiYgIXIudG91Y2hEYXRhLmRpZFNlbGVjdCAvLyBkb24ndCBhbGxvdyBib3ggc2VsZWN0aW9uIHRvIGRlZ3JhZGUgdG8gc2luZ2xlIGZpbmdlciBldmVudHMgbGlrZSBwYW5uaW5nXG4gICAgKSB7XG4gICAgICB2YXIgc3RhcnQgPSByLnRvdWNoRGF0YS5zdGFydDtcbiAgICAgIHZhciBsYXN0ID0gci50b3VjaERhdGEubGFzdDtcbiAgICAgIHZhciBuZWFyO1xuICAgICAgaWYgKCFyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgJiYgIXIuc3dpcGVQYW5uaW5nKSB7XG4gICAgICAgIG5lYXIgPSByLmZpbmROZWFyZXN0RWxlbWVudChub3dbMF0sIG5vd1sxXSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoY2FwdHVyZSAmJiBzdGFydCAhPSBudWxsKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gZHJhZ2dpbmcgbm9kZXNcbiAgICAgIGlmIChjYXB0dXJlICYmIHN0YXJ0ICE9IG51bGwgJiYgci5ub2RlSXNEcmFnZ2FibGUoc3RhcnQpKSB7XG4gICAgICAgIGlmIChpc092ZXJUaHJlc2hvbGREcmFnKSB7XG4gICAgICAgICAgLy8gdGhlbiBkcmFnZ2luZyBjYW4gaGFwcGVuXG4gICAgICAgICAgdmFyIGRyYWdnZWRFbGVzID0gci5kcmFnRGF0YS50b3VjaERyYWdFbGVzO1xuICAgICAgICAgIHZhciBqdXN0U3RhcnRlZERyYWcgPSAhci5kcmFnRGF0YS5kaWREcmFnO1xuICAgICAgICAgIGlmIChqdXN0U3RhcnRlZERyYWcpIHtcbiAgICAgICAgICAgIGFkZE5vZGVzVG9EcmFnKGRyYWdnZWRFbGVzLCB7XG4gICAgICAgICAgICAgIGluRHJhZ0xheWVyOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgci5kcmFnRGF0YS5kaWREcmFnID0gdHJ1ZTtcbiAgICAgICAgICB2YXIgdG90YWxTaGlmdCA9IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAobnVtYmVyJDEoZGlzcFswXSkgJiYgbnVtYmVyJDEoZGlzcFsxXSkpIHtcbiAgICAgICAgICAgIHRvdGFsU2hpZnQueCArPSBkaXNwWzBdO1xuICAgICAgICAgICAgdG90YWxTaGlmdC55ICs9IGRpc3BbMV07XG4gICAgICAgICAgICBpZiAoanVzdFN0YXJ0ZWREcmFnKSB7XG4gICAgICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICAgICAgICB2YXIgZHJhZ0RlbHRhID0gci50b3VjaERhdGEuZHJhZ0RlbHRhO1xuICAgICAgICAgICAgICBpZiAoZHJhZ0RlbHRhICYmIG51bWJlciQxKGRyYWdEZWx0YVswXSkgJiYgbnVtYmVyJDEoZHJhZ0RlbHRhWzFdKSkge1xuICAgICAgICAgICAgICAgIHRvdGFsU2hpZnQueCArPSBkcmFnRGVsdGFbMF07XG4gICAgICAgICAgICAgICAgdG90YWxTaGlmdC55ICs9IGRyYWdEZWx0YVsxXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgPSB0cnVlO1xuICAgICAgICAgIGRyYWdnZWRFbGVzLnNpbGVudFNoaWZ0KHRvdGFsU2hpZnQpLmVtaXQoJ3Bvc2l0aW9uIGRyYWcnKTtcbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICAgICAgICBpZiAoci50b3VjaERhdGEuc3RhcnRQb3NpdGlvblswXSA9PSBlYXJsaWVyWzBdICYmIHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb25bMV0gPT0gZWFybGllclsxXSkge1xuICAgICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHIucmVkcmF3KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gb3RoZXJ3aXNlIGtlZXAgdHJhY2sgb2YgZHJhZyBkZWx0YSBmb3IgbGF0ZXJcbiAgICAgICAgICB2YXIgZHJhZ0RlbHRhID0gci50b3VjaERhdGEuZHJhZ0RlbHRhID0gci50b3VjaERhdGEuZHJhZ0RlbHRhIHx8IFtdO1xuICAgICAgICAgIGlmIChkcmFnRGVsdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBkcmFnRGVsdGEucHVzaChkaXNwWzBdKTtcbiAgICAgICAgICAgIGRyYWdEZWx0YS5wdXNoKGRpc3BbMV0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkcmFnRGVsdGFbMF0gKz0gZGlzcFswXTtcbiAgICAgICAgICAgIGRyYWdEZWx0YVsxXSArPSBkaXNwWzFdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyB0b3VjaG1vdmVcbiAgICAgIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50cyhzdGFydCB8fCBuZWFyLCBbJ3RvdWNobW92ZScsICd0YXBkcmFnJywgJ3Ztb3VzZW1vdmUnXSwgZSwge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICgoIXN0YXJ0IHx8ICFzdGFydC5ncmFiYmVkKCkpICYmIG5lYXIgIT0gbGFzdCkge1xuICAgICAgICAgIGlmIChsYXN0KSB7XG4gICAgICAgICAgICBsYXN0LmVtaXQoe1xuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICB0eXBlOiAndGFwZHJhZ291dCcsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5lYXIpIHtcbiAgICAgICAgICAgIG5lYXIuZW1pdCh7XG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICAgIHR5cGU6ICd0YXBkcmFnb3ZlcicsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgci50b3VjaERhdGEubGFzdCA9IG5lYXI7XG4gICAgICB9XG5cbiAgICAgIC8vIGNoZWNrIHRvIGNhbmNlbCB0YXBob2xkXG4gICAgICBpZiAoY2FwdHVyZSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vdy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChub3dbaV0gJiYgci50b3VjaERhdGEuc3RhcnRQb3NpdGlvbltpXSAmJiBpc092ZXJUaHJlc2hvbGREcmFnKSB7XG4gICAgICAgICAgICByLnRvdWNoRGF0YS5zaW5nbGVUb3VjaE1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gcGFubmluZ1xuICAgICAgaWYgKGNhcHR1cmUgJiYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQucGFubmFibGUoKSkgJiYgY3kucGFubmluZ0VuYWJsZWQoKSAmJiBjeS51c2VyUGFubmluZ0VuYWJsZWQoKSkge1xuICAgICAgICB2YXIgYWxsb3dQYXNzdGhyb3VnaCA9IGFsbG93UGFubmluZ1Bhc3N0aHJvdWdoKHN0YXJ0LCByLnRvdWNoRGF0YS5zdGFydHMpO1xuICAgICAgICBpZiAoYWxsb3dQYXNzdGhyb3VnaCkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBpZiAoIXIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbikge1xuICAgICAgICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gYXJyYXkycG9pbnQoci50b3VjaERhdGEuc3RhcnRQb3NpdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyLnN3aXBlUGFubmluZykge1xuICAgICAgICAgICAgY3kucGFuQnkoe1xuICAgICAgICAgICAgICB4OiBkaXNwWzBdICogem9vbSxcbiAgICAgICAgICAgICAgeTogZGlzcFsxXSAqIHpvb21cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY3kuZW1pdCgnZHJhZ3BhbicpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgICAgICAgci5zd2lwZVBhbm5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgY3kucGFuQnkoe1xuICAgICAgICAgICAgICB4OiBkeCAqIHpvb20sXG4gICAgICAgICAgICAgIHk6IGR5ICogem9vbVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjeS5lbWl0KCdkcmFncGFuJyk7XG4gICAgICAgICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgICAgICAgc3RhcnQudW5hY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICAgICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmUtcHJvamVjdFxuICAgICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICAgIG5vd1swXSA9IHBvc1swXTtcbiAgICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5vdy5sZW5ndGg7IGorKykge1xuICAgICAgZWFybGllcltqXSA9IG5vd1tqXTtcbiAgICB9XG5cbiAgICAvLyB0aGUgYWN0aXZlIGJnIGluZGljYXRvciBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIG1ha2luZyBhIHN3aXBlIHRoYXQgaXMgbmVpdGhlciBmb3IgZHJhZ2dpbmcgbm9kZXMgb3IgcGFubmluZ1xuICAgIGlmIChjYXB0dXJlICYmIGUudG91Y2hlcy5sZW5ndGggPiAwICYmICFyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgJiYgIXIuc3dpcGVQYW5uaW5nICYmIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiAhPSBudWxsKSB7XG4gICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbiAgdmFyIHRvdWNoY2FuY2VsSGFuZGxlcjtcbiAgci5yZWdpc3RlckJpbmRpbmcoY29udGFpbmVyV2luZG93LCAndG91Y2hjYW5jZWwnLCB0b3VjaGNhbmNlbEhhbmRsZXIgPSBmdW5jdGlvbiB0b3VjaGNhbmNlbEhhbmRsZXIoZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgc3RhcnQgPSByLnRvdWNoRGF0YS5zdGFydDtcbiAgICByLnRvdWNoRGF0YS5jYXB0dXJlID0gZmFsc2U7XG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICBzdGFydC51bmFjdGl2YXRlKCk7XG4gICAgfVxuICB9KTtcbiAgdmFyIHRvdWNoZW5kSGFuZGxlciwgZGlkRG91YmxlVG91Y2gsIHRvdWNoVGltZW91dCwgcHJldlRvdWNoVGltZVN0YW1wO1xuICByLnJlZ2lzdGVyQmluZGluZyhjb250YWluZXJXaW5kb3csICd0b3VjaGVuZCcsIHRvdWNoZW5kSGFuZGxlciA9IGZ1bmN0aW9uIHRvdWNoZW5kSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciBzdGFydCA9IHIudG91Y2hEYXRhLnN0YXJ0O1xuICAgIHZhciBjYXB0dXJlID0gci50b3VjaERhdGEuY2FwdHVyZTtcbiAgICBpZiAoY2FwdHVyZSkge1xuICAgICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgci50b3VjaERhdGEuY2FwdHVyZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBzZWxlY3QgPSByLnNlbGVjdGlvbjtcbiAgICByLnN3aXBlUGFubmluZyA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyA9IGZhbHNlO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgdmFyIG5vdyA9IHIudG91Y2hEYXRhLm5vdztcbiAgICB2YXIgZWFybGllciA9IHIudG91Y2hEYXRhLmVhcmxpZXI7XG4gICAgaWYgKGUudG91Y2hlc1swXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFkpO1xuICAgICAgbm93WzBdID0gcG9zWzBdO1xuICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgIH1cbiAgICBpZiAoZS50b3VjaGVzWzFdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1sxXS5jbGllbnRYLCBlLnRvdWNoZXNbMV0uY2xpZW50WSk7XG4gICAgICBub3dbMl0gPSBwb3NbMF07XG4gICAgICBub3dbM10gPSBwb3NbMV07XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzJdLmNsaWVudFgsIGUudG91Y2hlc1syXS5jbGllbnRZKTtcbiAgICAgIG5vd1s0XSA9IHBvc1swXTtcbiAgICAgIG5vd1s1XSA9IHBvc1sxXTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICBzdGFydC51bmFjdGl2YXRlKCk7XG4gICAgfVxuICAgIHZhciBjdHhUYXBlbmQ7XG4gICAgaWYgKHIudG91Y2hEYXRhLmN4dCkge1xuICAgICAgY3R4VGFwZW5kID0ge1xuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0eXBlOiAnY3h0dGFwZW5kJyxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgeTogbm93WzFdXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgc3RhcnQuZW1pdChjdHhUYXBlbmQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3kuZW1pdChjdHhUYXBlbmQpO1xuICAgICAgfVxuICAgICAgaWYgKCFyLnRvdWNoRGF0YS5jeHREcmFnZ2VkKSB7XG4gICAgICAgIHZhciBjdHhUYXAgPSB7XG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICB0eXBlOiAnY3h0dGFwJyxcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgICBzdGFydC5lbWl0KGN0eFRhcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3kuZW1pdChjdHhUYXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoci50b3VjaERhdGEuc3RhcnQpIHtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQuX3ByaXZhdGUuZ3JhYmJlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgci50b3VjaERhdGEuY3h0ID0gZmFsc2U7XG4gICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG51bGw7XG4gICAgICByLnJlZHJhdygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG5vIG1vcmUgYm94IHNlbGVjdGlvbiBpZiB3ZSBkb24ndCBoYXZlIHRocmVlIGZpbmdlcnNcbiAgICBpZiAoIWUudG91Y2hlc1syXSAmJiBjeS5ib3hTZWxlY3Rpb25FbmFibGVkKCkgJiYgci50b3VjaERhdGEuc2VsZWN0aW5nKSB7XG4gICAgICByLnRvdWNoRGF0YS5zZWxlY3RpbmcgPSBmYWxzZTtcbiAgICAgIHZhciBib3ggPSBjeS5jb2xsZWN0aW9uKHIuZ2V0QWxsSW5Cb3goc2VsZWN0WzBdLCBzZWxlY3RbMV0sIHNlbGVjdFsyXSwgc2VsZWN0WzNdKSk7XG4gICAgICBzZWxlY3RbMF0gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbMV0gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbMl0gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbM10gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbNF0gPSAwO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIGN5LmVtaXQoe1xuICAgICAgICB0eXBlOiAnYm94ZW5kJyxcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgeTogbm93WzFdXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdmFyIGVsZVdvdWxkQmVTZWxlY3RlZCA9IGZ1bmN0aW9uIGVsZVdvdWxkQmVTZWxlY3RlZChlbGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZS5zZWxlY3RhYmxlKCkgJiYgIWVsZS5zZWxlY3RlZCgpO1xuICAgICAgfTtcbiAgICAgIGJveC5lbWl0KCdib3gnKS5zdGRGaWx0ZXIoZWxlV291bGRCZVNlbGVjdGVkKS5zZWxlY3QoKS5lbWl0KCdib3hzZWxlY3QnKTtcbiAgICAgIGlmIChib3gubm9uZW1wdHkoKSkge1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHIucmVkcmF3KCk7XG4gICAgfVxuICAgIGlmIChzdGFydCAhPSBudWxsKSB7XG4gICAgICBzdGFydC51bmFjdGl2YXRlKCk7XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChlLnRvdWNoZXNbMV0pIDsgZWxzZSBpZiAoZS50b3VjaGVzWzBdKSA7IGVsc2UgaWYgKCFlLnRvdWNoZXNbMF0pIHtcbiAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICB2YXIgZHJhZ2dlZEVsZXMgPSByLmRyYWdEYXRhLnRvdWNoRHJhZ0VsZXM7XG4gICAgICBpZiAoc3RhcnQgIT0gbnVsbCkge1xuICAgICAgICB2YXIgc3RhcnRXYXNHcmFiYmVkID0gc3RhcnQuX3ByaXZhdGUuZ3JhYmJlZDtcbiAgICAgICAgZnJlZURyYWdnZWRFbGVtZW50cyhkcmFnZ2VkRWxlcyk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgaWYgKHN0YXJ0V2FzR3JhYmJlZCkge1xuICAgICAgICAgIHN0YXJ0LmVtaXQoJ2ZyZWVvbicpO1xuICAgICAgICAgIGRyYWdnZWRFbGVzLmVtaXQoJ2ZyZWUnKTtcbiAgICAgICAgICBpZiAoci5kcmFnRGF0YS5kaWREcmFnKSB7XG4gICAgICAgICAgICBzdGFydC5lbWl0KCdkcmFnZnJlZW9uJyk7XG4gICAgICAgICAgICBkcmFnZ2VkRWxlcy5lbWl0KCdkcmFnZnJlZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnRzKHN0YXJ0LCBbJ3RvdWNoZW5kJywgJ3RhcGVuZCcsICd2bW91c2V1cCcsICd0YXBkcmFnb3V0J10sIGUsIHtcbiAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgeTogbm93WzFdXG4gICAgICAgIH0pO1xuICAgICAgICBzdGFydC51bmFjdGl2YXRlKCk7XG4gICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0ID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBuZWFyID0gci5maW5kTmVhcmVzdEVsZW1lbnQobm93WzBdLCBub3dbMV0sIHRydWUsIHRydWUpO1xuICAgICAgICB0cmlnZ2VyRXZlbnRzKG5lYXIsIFsndG91Y2hlbmQnLCAndGFwZW5kJywgJ3Ztb3VzZXVwJywgJ3RhcGRyYWdvdXQnXSwgZSwge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB2YXIgZHggPSByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uWzBdIC0gbm93WzBdO1xuICAgICAgdmFyIGR4MiA9IGR4ICogZHg7XG4gICAgICB2YXIgZHkgPSByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uWzFdIC0gbm93WzFdO1xuICAgICAgdmFyIGR5MiA9IGR5ICogZHk7XG4gICAgICB2YXIgZGlzdDIgPSBkeDIgKyBkeTI7XG4gICAgICB2YXIgcmRpc3QyID0gZGlzdDIgKiB6b29tICogem9vbTtcblxuICAgICAgLy8gVGFwIGV2ZW50LCByb3VnaGx5IHNhbWUgYXMgbW91c2UgY2xpY2sgZXZlbnQgZm9yIHRvdWNoXG4gICAgICBpZiAoIXIudG91Y2hEYXRhLnNpbmdsZVRvdWNoTW92ZWQpIHtcbiAgICAgICAgaWYgKCFzdGFydCkge1xuICAgICAgICAgIGN5LiQoJzpzZWxlY3RlZCcpLnVuc2VsZWN0KFsndGFwdW5zZWxlY3QnXSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50cyhzdGFydCwgWyd0YXAnLCAndmNsaWNrJ10sIGUsIHtcbiAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgeTogbm93WzFdXG4gICAgICAgIH0pO1xuICAgICAgICBkaWREb3VibGVUb3VjaCA9IGZhbHNlO1xuICAgICAgICBpZiAoZS50aW1lU3RhbXAgLSBwcmV2VG91Y2hUaW1lU3RhbXAgPD0gY3kubXVsdGlDbGlja0RlYm91bmNlVGltZSgpKSB7XG4gICAgICAgICAgdG91Y2hUaW1lb3V0ICYmIGNsZWFyVGltZW91dCh0b3VjaFRpbWVvdXQpO1xuICAgICAgICAgIGRpZERvdWJsZVRvdWNoID0gdHJ1ZTtcbiAgICAgICAgICBwcmV2VG91Y2hUaW1lU3RhbXAgPSBudWxsO1xuICAgICAgICAgIHRyaWdnZXJFdmVudHMoc3RhcnQsIFsnZGJsdGFwJywgJ3ZkYmxjbGljayddLCBlLCB7XG4gICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b3VjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChkaWREb3VibGVUb3VjaCkgcmV0dXJuO1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50cyhzdGFydCwgWydvbmV0YXAnLCAndm9uZWNsaWNrJ10sIGUsIHtcbiAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIGN5Lm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUoKSk7XG4gICAgICAgICAgcHJldlRvdWNoVGltZVN0YW1wID0gZS50aW1lU3RhbXA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUHJlcGFyZSB0byBzZWxlY3QgdGhlIGN1cnJlbnRseSB0b3VjaGVkIG5vZGUsIG9ubHkgaWYgaXQgaGFzbid0IGJlZW4gZHJhZ2dlZCBwYXN0IGEgY2VydGFpbiBkaXN0YW5jZVxuICAgICAgaWYgKHN0YXJ0ICE9IG51bGwgJiYgIXIuZHJhZ0RhdGEuZGlkRHJhZyAvLyBkaWRuJ3QgZHJhZyBub2RlcyBhcm91bmRcbiAgICAgICYmIHN0YXJ0Ll9wcml2YXRlLnNlbGVjdGFibGUgJiYgcmRpc3QyIDwgci50b3VjaFRhcFRocmVzaG9sZDIgJiYgIXIucGluY2hpbmcgLy8gcGluY2ggdG8gem9vbSBzaG91bGQgbm90IGFmZmVjdCBzZWxlY3Rpb25cbiAgICAgICkge1xuICAgICAgICBpZiAoY3kuc2VsZWN0aW9uVHlwZSgpID09PSAnc2luZ2xlJykge1xuICAgICAgICAgIGN5LiQoaXNTZWxlY3RlZCkudW5tZXJnZShzdGFydCkudW5zZWxlY3QoWyd0YXB1bnNlbGVjdCddKTtcbiAgICAgICAgICBzdGFydC5zZWxlY3QoWyd0YXBzZWxlY3QnXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHN0YXJ0LnNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHN0YXJ0LnVuc2VsZWN0KFsndGFwdW5zZWxlY3QnXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0LnNlbGVjdChbJ3RhcHNlbGVjdCddKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICByLnRvdWNoRGF0YS5zaW5nbGVUb3VjaE1vdmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBub3cubGVuZ3RoOyBqKyspIHtcbiAgICAgIGVhcmxpZXJbal0gPSBub3dbal07XG4gICAgfVxuICAgIHIuZHJhZ0RhdGEuZGlkRHJhZyA9IGZhbHNlOyAvLyByZXNldCBmb3IgbmV4dCB0b3VjaHN0YXJ0XG5cbiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgci50b3VjaERhdGEuZHJhZ0RlbHRhID0gW107XG4gICAgICByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uID0gW251bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGxdO1xuICAgICAgci50b3VjaERhdGEuc3RhcnRHUG9zaXRpb24gPSBudWxsO1xuICAgICAgci50b3VjaERhdGEuZGlkU2VsZWN0ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoIDwgMikge1xuICAgICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gdGhlIG9sZCBzdGFydCBnbG9iYWwgcG9zJ24gbWF5IG5vdCBiZSB0aGUgc2FtZSBmaW5nZXIgdGhhdCByZW1haW5zXG4gICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0R1Bvc2l0aW9uID0gW2UudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WV07XG4gICAgICB9XG4gICAgICByLnBpbmNoaW5nID0gZmFsc2U7XG4gICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgIHIucmVkcmF3KCk7XG4gICAgfVxuXG4gICAgLy9yLnJlZHJhdygpO1xuICB9LCBmYWxzZSk7XG5cbiAgLy8gZmFsbGJhY2sgY29tcGF0aWJpbGl0eSBsYXllciBmb3IgbXMgcG9pbnRlciBldmVudHNcbiAgaWYgKHR5cGVvZiBUb3VjaEV2ZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgIHZhciBwb2ludGVycyA9IFtdO1xuICAgIHZhciBtYWtlVG91Y2ggPSBmdW5jdGlvbiBtYWtlVG91Y2goZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2xpZW50WDogZS5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiBlLmNsaWVudFksXG4gICAgICAgIGZvcmNlOiAxLFxuICAgICAgICBpZGVudGlmaWVyOiBlLnBvaW50ZXJJZCxcbiAgICAgICAgcGFnZVg6IGUucGFnZVgsXG4gICAgICAgIHBhZ2VZOiBlLnBhZ2VZLFxuICAgICAgICByYWRpdXNYOiBlLndpZHRoIC8gMixcbiAgICAgICAgcmFkaXVzWTogZS5oZWlnaHQgLyAyLFxuICAgICAgICBzY3JlZW5YOiBlLnNjcmVlblgsXG4gICAgICAgIHNjcmVlblk6IGUuc2NyZWVuWSxcbiAgICAgICAgdGFyZ2V0OiBlLnRhcmdldFxuICAgICAgfTtcbiAgICB9O1xuICAgIHZhciBtYWtlUG9pbnRlciA9IGZ1bmN0aW9uIG1ha2VQb2ludGVyKGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV2ZW50OiBlLFxuICAgICAgICB0b3VjaDogbWFrZVRvdWNoKGUpXG4gICAgICB9O1xuICAgIH07XG4gICAgdmFyIGFkZFBvaW50ZXIgPSBmdW5jdGlvbiBhZGRQb2ludGVyKGUpIHtcbiAgICAgIHBvaW50ZXJzLnB1c2gobWFrZVBvaW50ZXIoZSkpO1xuICAgIH07XG4gICAgdmFyIHJlbW92ZVBvaW50ZXIgPSBmdW5jdGlvbiByZW1vdmVQb2ludGVyKGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHAgPSBwb2ludGVyc1tpXTtcbiAgICAgICAgaWYgKHAuZXZlbnQucG9pbnRlcklkID09PSBlLnBvaW50ZXJJZCkge1xuICAgICAgICAgIHBvaW50ZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciB1cGRhdGVQb2ludGVyID0gZnVuY3Rpb24gdXBkYXRlUG9pbnRlcihlKSB7XG4gICAgICB2YXIgcCA9IHBvaW50ZXJzLmZpbHRlcihmdW5jdGlvbiAocCkge1xuICAgICAgICByZXR1cm4gcC5ldmVudC5wb2ludGVySWQgPT09IGUucG9pbnRlcklkO1xuICAgICAgfSlbMF07XG4gICAgICBwLmV2ZW50ID0gZTtcbiAgICAgIHAudG91Y2ggPSBtYWtlVG91Y2goZSk7XG4gICAgfTtcbiAgICB2YXIgYWRkVG91Y2hlc1RvRXZlbnQgPSBmdW5jdGlvbiBhZGRUb3VjaGVzVG9FdmVudChlKSB7XG4gICAgICBlLnRvdWNoZXMgPSBwb2ludGVycy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcmV0dXJuIHAudG91Y2g7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHZhciBwb2ludGVySXNNb3VzZSA9IGZ1bmN0aW9uIHBvaW50ZXJJc01vdXNlKGUpIHtcbiAgICAgIHJldHVybiBlLnBvaW50ZXJUeXBlID09PSAnbW91c2UnIHx8IGUucG9pbnRlclR5cGUgPT09IDQ7XG4gICAgfTtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ3BvaW50ZXJkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChwb2ludGVySXNNb3VzZShlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIG1vdXNlIGFscmVhZHkgaGFuZGxlZFxuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBhZGRQb2ludGVyKGUpO1xuICAgICAgYWRkVG91Y2hlc1RvRXZlbnQoZSk7XG4gICAgICB0b3VjaHN0YXJ0SGFuZGxlcihlKTtcbiAgICB9KTtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ3BvaW50ZXJ1cCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAocG9pbnRlcklzTW91c2UoZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBtb3VzZSBhbHJlYWR5IGhhbmRsZWRcblxuICAgICAgcmVtb3ZlUG9pbnRlcihlKTtcbiAgICAgIGFkZFRvdWNoZXNUb0V2ZW50KGUpO1xuICAgICAgdG91Y2hlbmRIYW5kbGVyKGUpO1xuICAgIH0pO1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAncG9pbnRlcmNhbmNlbCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAocG9pbnRlcklzTW91c2UoZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBtb3VzZSBhbHJlYWR5IGhhbmRsZWRcblxuICAgICAgcmVtb3ZlUG9pbnRlcihlKTtcbiAgICAgIGFkZFRvdWNoZXNUb0V2ZW50KGUpO1xuICAgICAgdG91Y2hjYW5jZWxIYW5kbGVyKGUpO1xuICAgIH0pO1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAncG9pbnRlcm1vdmUnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKHBvaW50ZXJJc01vdXNlKGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gbW91c2UgYWxyZWFkeSBoYW5kbGVkXG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHVwZGF0ZVBvaW50ZXIoZSk7XG4gICAgICBhZGRUb3VjaGVzVG9FdmVudChlKTtcbiAgICAgIHRvdWNobW92ZUhhbmRsZXIoZSk7XG4gICAgfSk7XG4gIH1cbn07XG5cbnZhciBCUnAkMiA9IHt9O1xuQlJwJDIuZ2VuZXJhdGVQb2x5Z29uID0gZnVuY3Rpb24gKG5hbWUsIHBvaW50cykge1xuICByZXR1cm4gdGhpcy5ub2RlU2hhcGVzW25hbWVdID0ge1xuICAgIHJlbmRlcmVyOiB0aGlzLFxuICAgIG5hbWU6IG5hbWUsXG4gICAgcG9pbnRzOiBwb2ludHMsXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCgncG9seWdvbicsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHRoaXMucG9pbnRzKTtcbiAgICB9LFxuICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIGludGVyc2VjdExpbmUobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHJldHVybiBwb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCB0aGlzLnBvaW50cywgbm9kZVgsIG5vZGVZLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIsIHBhZGRpbmcpO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHJldHVybiBwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIFswLCAtMV0sIHBhZGRpbmcpO1xuICAgIH1cbiAgfTtcbn07XG5CUnAkMi5nZW5lcmF0ZUVsbGlwc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbJ2VsbGlwc2UnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAnZWxsaXBzZScsXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCh0aGlzLm5hbWUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpO1xuICAgIH0sXG4gICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gaW50ZXJzZWN0TGluZShub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcsIGNvcm5lclJhZGl1cykge1xuICAgICAgcmV0dXJuIGludGVyc2VjdExpbmVFbGxpcHNlKHgsIHksIG5vZGVYLCBub2RlWSwgd2lkdGggLyAyICsgcGFkZGluZywgaGVpZ2h0IC8gMiArIHBhZGRpbmcpO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHJldHVybiBjaGVja0luRWxsaXBzZSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBwYWRkaW5nKTtcbiAgICB9XG4gIH07XG59O1xuQlJwJDIuZ2VuZXJhdGVSb3VuZFBvbHlnb24gPSBmdW5jdGlvbiAobmFtZSwgcG9pbnRzKSB7XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbbmFtZV0gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogbmFtZSxcbiAgICBwb2ludHM6IHBvaW50cyxcbiAgICBnZXRPckNyZWF0ZUNvcm5lcnM6IGZ1bmN0aW9uIGdldE9yQ3JlYXRlQ29ybmVycyhjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzLCBmaWVsZCkge1xuICAgICAgaWYgKHJzW2ZpZWxkXSAhPT0gdW5kZWZpbmVkICYmIHJzW2ZpZWxkICsgJy1jeCddID09PSBjZW50ZXJYICYmIHJzW2ZpZWxkICsgJy1jeSddID09PSBjZW50ZXJZKSB7XG4gICAgICAgIHJldHVybiByc1tmaWVsZF07XG4gICAgICB9XG4gICAgICByc1tmaWVsZF0gPSBuZXcgQXJyYXkocG9pbnRzLmxlbmd0aCAvIDIpO1xuICAgICAgcnNbZmllbGQgKyAnLWN4J10gPSBjZW50ZXJYO1xuICAgICAgcnNbZmllbGQgKyAnLWN5J10gPSBjZW50ZXJZO1xuICAgICAgdmFyIGhhbGZXID0gd2lkdGggLyAyO1xuICAgICAgdmFyIGhhbGZIID0gaGVpZ2h0IC8gMjtcbiAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRQb2x5Z29uUmFkaXVzKHdpZHRoLCBoZWlnaHQpIDogY29ybmVyUmFkaXVzO1xuICAgICAgdmFyIHAgPSBuZXcgQXJyYXkocG9pbnRzLmxlbmd0aCAvIDIpO1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHBvaW50cy5sZW5ndGggLyAyOyBfaSsrKSB7XG4gICAgICAgIHBbX2ldID0ge1xuICAgICAgICAgIHg6IGNlbnRlclggKyBoYWxmVyAqIHBvaW50c1tfaSAqIDJdLFxuICAgICAgICAgIHk6IGNlbnRlclkgKyBoYWxmSCAqIHBvaW50c1tfaSAqIDIgKyAxXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIGksXG4gICAgICAgIHAxLFxuICAgICAgICBwMixcbiAgICAgICAgcDMsXG4gICAgICAgIGxlbiA9IHAubGVuZ3RoO1xuICAgICAgcDEgPSBwW2xlbiAtIDFdO1xuICAgICAgLy8gZm9yIGVhY2ggcG9pbnRcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBwMiA9IHBbaSAlIGxlbl07XG4gICAgICAgIHAzID0gcFsoaSArIDEpICUgbGVuXTtcbiAgICAgICAgcnNbZmllbGRdW2ldID0gZ2V0Um91bmRDb3JuZXIocDEsIHAyLCBwMywgY29ybmVyUmFkaXVzKTtcbiAgICAgICAgcDEgPSBwMjtcbiAgICAgICAgcDIgPSBwMztcbiAgICAgIH1cbiAgICAgIHJldHVybiByc1tmaWVsZF07XG4gICAgfSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cywgcnMpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCgncm91bmQtcG9seWdvbicsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHRoaXMucG9pbnRzLCB0aGlzLmdldE9yQ3JlYXRlQ29ybmVycyhjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzLCAnZHJhd0Nvcm5lcnMnKSk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZywgY29ybmVyUmFkaXVzLCBycykge1xuICAgICAgcmV0dXJuIHJvdW5kUG9seWdvbkludGVyc2VjdExpbmUoeCwgeSwgdGhpcy5wb2ludHMsIG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZywgdGhpcy5nZXRPckNyZWF0ZUNvcm5lcnMobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzLCAnY29ybmVycycpKTtcbiAgICB9LFxuICAgIGNoZWNrUG9pbnQ6IGZ1bmN0aW9uIGNoZWNrUG9pbnQoeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSwgY29ybmVyUmFkaXVzLCBycykge1xuICAgICAgcmV0dXJuIHBvaW50SW5zaWRlUm91bmRQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB0aGlzLmdldE9yQ3JlYXRlQ29ybmVycyhjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzLCAnY29ybmVycycpKTtcbiAgICB9XG4gIH07XG59O1xuQlJwJDIuZ2VuZXJhdGVSb3VuZFJlY3RhbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1sncm91bmQtcmVjdGFuZ2xlJ10gPSB0aGlzLm5vZGVTaGFwZXNbJ3JvdW5kcmVjdGFuZ2xlJ10gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogJ3JvdW5kLXJlY3RhbmdsZScsXG4gICAgcG9pbnRzOiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCksXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCh0aGlzLm5hbWUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHRoaXMucG9pbnRzLCBjb3JuZXJSYWRpdXMpO1xuICAgIH0sXG4gICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gaW50ZXJzZWN0TGluZShub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcsIGNvcm5lclJhZGl1cykge1xuICAgICAgcmV0dXJuIHJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSh4LCB5LCBub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcsIGNvcm5lclJhZGl1cyk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIGNvcm5lclJhZGl1cykge1xuICAgICAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCkgOiBjb3JuZXJSYWRpdXM7XG4gICAgICBjb3JuZXJSYWRpdXMgPSBNYXRoLm1pbihoYWxmV2lkdGgsIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyk7XG4gICAgICB2YXIgZGlhbSA9IGNvcm5lclJhZGl1cyAqIDI7XG5cbiAgICAgIC8vIENoZWNrIGhCb3hcbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQgLSBkaWFtLCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSBkaWFtLCBoZWlnaHQsIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayB0b3AgbGVmdCBxdWFydGVyIGNpcmNsZVxuICAgICAgaWYgKGNoZWNrSW5FbGxpcHNlKHgsIHksIGRpYW0sIGRpYW0sIGNlbnRlclggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXMsIGNlbnRlclkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdG9wIHJpZ2h0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cywgY2VudGVyWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBib3R0b20gcmlnaHQgcXVhcnRlciBjaXJjbGVcbiAgICAgIGlmIChjaGVja0luRWxsaXBzZSh4LCB5LCBkaWFtLCBkaWFtLCBjZW50ZXJYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzLCBjZW50ZXJZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cywgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGJvdHRvbSBsZWZ0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCAtIGhhbGZXaWR0aCArIGNvcm5lclJhZGl1cywgY2VudGVyWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbn07XG5CUnAkMi5nZW5lcmF0ZUN1dFJlY3RhbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1snY3V0LXJlY3RhbmdsZSddID0gdGhpcy5ub2RlU2hhcGVzWydjdXRyZWN0YW5nbGUnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAnY3V0LXJlY3RhbmdsZScsXG4gICAgY29ybmVyTGVuZ3RoOiBnZXRDdXRSZWN0YW5nbGVDb3JuZXJMZW5ndGgoKSxcbiAgICBwb2ludHM6IGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cykge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgbnVsbCwgY29ybmVyUmFkaXVzKTtcbiAgICB9LFxuICAgIGdlbmVyYXRlQ3V0VHJpYW5nbGVQdHM6IGZ1bmN0aW9uIGdlbmVyYXRlQ3V0VHJpYW5nbGVQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSwgY29ybmVyUmFkaXVzKSB7XG4gICAgICB2YXIgY2wgPSBjb3JuZXJSYWRpdXMgPT09ICdhdXRvJyA/IHRoaXMuY29ybmVyTGVuZ3RoIDogY29ybmVyUmFkaXVzO1xuICAgICAgdmFyIGhoID0gaGVpZ2h0IC8gMjtcbiAgICAgIHZhciBodyA9IHdpZHRoIC8gMjtcbiAgICAgIHZhciB4QmVnaW4gPSBjZW50ZXJYIC0gaHc7XG4gICAgICB2YXIgeEVuZCA9IGNlbnRlclggKyBodztcbiAgICAgIHZhciB5QmVnaW4gPSBjZW50ZXJZIC0gaGg7XG4gICAgICB2YXIgeUVuZCA9IGNlbnRlclkgKyBoaDtcblxuICAgICAgLy8gcG9pbnRzIGFyZSBpbiBjbG9ja3dpc2Ugb3JkZXIsIGlubmVyIChpbWFnaW5hcnkpIHRyaWFuZ2xlIHB0IG9uIFs0LCA1XVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9wTGVmdDogW3hCZWdpbiwgeUJlZ2luICsgY2wsIHhCZWdpbiArIGNsLCB5QmVnaW4sIHhCZWdpbiArIGNsLCB5QmVnaW4gKyBjbF0sXG4gICAgICAgIHRvcFJpZ2h0OiBbeEVuZCAtIGNsLCB5QmVnaW4sIHhFbmQsIHlCZWdpbiArIGNsLCB4RW5kIC0gY2wsIHlCZWdpbiArIGNsXSxcbiAgICAgICAgYm90dG9tUmlnaHQ6IFt4RW5kLCB5RW5kIC0gY2wsIHhFbmQgLSBjbCwgeUVuZCwgeEVuZCAtIGNsLCB5RW5kIC0gY2xdLFxuICAgICAgICBib3R0b21MZWZ0OiBbeEJlZ2luICsgY2wsIHlFbmQsIHhCZWdpbiwgeUVuZCAtIGNsLCB4QmVnaW4gKyBjbCwgeUVuZCAtIGNsXVxuICAgICAgfTtcbiAgICB9LFxuICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIGludGVyc2VjdExpbmUobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHZhciBjUHRzID0gdGhpcy5nZW5lcmF0ZUN1dFRyaWFuZ2xlUHRzKHdpZHRoICsgMiAqIHBhZGRpbmcsIGhlaWdodCArIDIgKiBwYWRkaW5nLCBub2RlWCwgbm9kZVksIGNvcm5lclJhZGl1cyk7XG4gICAgICB2YXIgcHRzID0gW10uY29uY2F0LmFwcGx5KFtdLCBbY1B0cy50b3BMZWZ0LnNwbGljZSgwLCA0KSwgY1B0cy50b3BSaWdodC5zcGxpY2UoMCwgNCksIGNQdHMuYm90dG9tUmlnaHQuc3BsaWNlKDAsIDQpLCBjUHRzLmJvdHRvbUxlZnQuc3BsaWNlKDAsIDQpXSk7XG4gICAgICByZXR1cm4gcG9seWdvbkludGVyc2VjdExpbmUoeCwgeSwgcHRzLCBub2RlWCwgbm9kZVkpO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHZhciBjbCA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gdGhpcy5jb3JuZXJMZW5ndGggOiBjb3JuZXJSYWRpdXM7XG4gICAgICAvLyBDaGVjayBoQm94XG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0IC0gMiAqIGNsLCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSAyICogY2wsIGhlaWdodCwgWzAsIC0xXSwgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICB2YXIgY3V0VHJpYW5nbGVQdHMgPSB0aGlzLmdlbmVyYXRlQ3V0VHJpYW5nbGVQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSk7XG4gICAgICByZXR1cm4gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIGN1dFRyaWFuZ2xlUHRzLnRvcExlZnQpIHx8IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBjdXRUcmlhbmdsZVB0cy50b3BSaWdodCkgfHwgcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIGN1dFRyaWFuZ2xlUHRzLmJvdHRvbVJpZ2h0KSB8fCBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgY3V0VHJpYW5nbGVQdHMuYm90dG9tTGVmdCk7XG4gICAgfVxuICB9O1xufTtcbkJScCQyLmdlbmVyYXRlQmFycmVsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ub2RlU2hhcGVzWydiYXJyZWwnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAnYmFycmVsJyxcbiAgICBwb2ludHM6IGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cykge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZywgY29ybmVyUmFkaXVzKSB7XG4gICAgICAvLyB1c2UgdHdvIGZpeGVkIHQgdmFsdWVzIGZvciB0aGUgYmV6aWVyIGN1cnZlIGFwcHJveGltYXRpb25cblxuICAgICAgdmFyIHQwID0gMC4xNTtcbiAgICAgIHZhciB0MSA9IDAuNTtcbiAgICAgIHZhciB0MiA9IDAuODU7XG4gICAgICB2YXIgYlB0cyA9IHRoaXMuZ2VuZXJhdGVCYXJyZWxCZXppZXJQdHMod2lkdGggKyAyICogcGFkZGluZywgaGVpZ2h0ICsgMiAqIHBhZGRpbmcsIG5vZGVYLCBub2RlWSk7XG4gICAgICB2YXIgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyA9IGZ1bmN0aW9uIGFwcHJveGltYXRlQmFycmVsQ3VydmVQdHMocHRzKSB7XG4gICAgICAgIC8vIGFwcHJveGltYXRlIGN1cnZlIHB0cyBiYXNlZCBvbiB0aGUgdHdvIHQgdmFsdWVzXG4gICAgICAgIHZhciBtMCA9IHFiZXppZXJQdEF0KHtcbiAgICAgICAgICB4OiBwdHNbMF0sXG4gICAgICAgICAgeTogcHRzWzFdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBwdHNbMl0sXG4gICAgICAgICAgeTogcHRzWzNdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBwdHNbNF0sXG4gICAgICAgICAgeTogcHRzWzVdXG4gICAgICAgIH0sIHQwKTtcbiAgICAgICAgdmFyIG0xID0gcWJlemllclB0QXQoe1xuICAgICAgICAgIHg6IHB0c1swXSxcbiAgICAgICAgICB5OiBwdHNbMV1cbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IHB0c1syXSxcbiAgICAgICAgICB5OiBwdHNbM11cbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IHB0c1s0XSxcbiAgICAgICAgICB5OiBwdHNbNV1cbiAgICAgICAgfSwgdDEpO1xuICAgICAgICB2YXIgbTIgPSBxYmV6aWVyUHRBdCh7XG4gICAgICAgICAgeDogcHRzWzBdLFxuICAgICAgICAgIHk6IHB0c1sxXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcHRzWzJdLFxuICAgICAgICAgIHk6IHB0c1szXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcHRzWzRdLFxuICAgICAgICAgIHk6IHB0c1s1XVxuICAgICAgICB9LCB0Mik7XG4gICAgICAgIHJldHVybiBbcHRzWzBdLCBwdHNbMV0sIG0wLngsIG0wLnksIG0xLngsIG0xLnksIG0yLngsIG0yLnksIHB0c1s0XSwgcHRzWzVdXTtcbiAgICAgIH07XG4gICAgICB2YXIgcHRzID0gW10uY29uY2F0KGFwcHJveGltYXRlQmFycmVsQ3VydmVQdHMoYlB0cy50b3BMZWZ0KSwgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyhiUHRzLnRvcFJpZ2h0KSwgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyhiUHRzLmJvdHRvbVJpZ2h0KSwgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyhiUHRzLmJvdHRvbUxlZnQpKTtcbiAgICAgIHJldHVybiBwb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCBwdHMsIG5vZGVYLCBub2RlWSk7XG4gICAgfSxcbiAgICBnZW5lcmF0ZUJhcnJlbEJlemllclB0czogZnVuY3Rpb24gZ2VuZXJhdGVCYXJyZWxCZXppZXJQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSkge1xuICAgICAgdmFyIGhoID0gaGVpZ2h0IC8gMjtcbiAgICAgIHZhciBodyA9IHdpZHRoIC8gMjtcbiAgICAgIHZhciB4QmVnaW4gPSBjZW50ZXJYIC0gaHc7XG4gICAgICB2YXIgeEVuZCA9IGNlbnRlclggKyBodztcbiAgICAgIHZhciB5QmVnaW4gPSBjZW50ZXJZIC0gaGg7XG4gICAgICB2YXIgeUVuZCA9IGNlbnRlclkgKyBoaDtcbiAgICAgIHZhciBjdXJ2ZUNvbnN0YW50cyA9IGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdmFyIGhPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy5oZWlnaHRPZmZzZXQ7XG4gICAgICB2YXIgd09mZnNldCA9IGN1cnZlQ29uc3RhbnRzLndpZHRoT2Zmc2V0O1xuICAgICAgdmFyIGN0cmxQdFhPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy5jdHJsUHRPZmZzZXRQY3QgKiB3aWR0aDtcblxuICAgICAgLy8gcG9pbnRzIGFyZSBpbiBjbG9ja3dpc2Ugb3JkZXIsIGlubmVyIChpbWFnaW5hcnkpIGNvbnRyb2wgcHQgb24gWzQsIDVdXG4gICAgICB2YXIgcHRzID0ge1xuICAgICAgICB0b3BMZWZ0OiBbeEJlZ2luLCB5QmVnaW4gKyBoT2Zmc2V0LCB4QmVnaW4gKyBjdHJsUHRYT2Zmc2V0LCB5QmVnaW4sIHhCZWdpbiArIHdPZmZzZXQsIHlCZWdpbl0sXG4gICAgICAgIHRvcFJpZ2h0OiBbeEVuZCAtIHdPZmZzZXQsIHlCZWdpbiwgeEVuZCAtIGN0cmxQdFhPZmZzZXQsIHlCZWdpbiwgeEVuZCwgeUJlZ2luICsgaE9mZnNldF0sXG4gICAgICAgIGJvdHRvbVJpZ2h0OiBbeEVuZCwgeUVuZCAtIGhPZmZzZXQsIHhFbmQgLSBjdHJsUHRYT2Zmc2V0LCB5RW5kLCB4RW5kIC0gd09mZnNldCwgeUVuZF0sXG4gICAgICAgIGJvdHRvbUxlZnQ6IFt4QmVnaW4gKyB3T2Zmc2V0LCB5RW5kLCB4QmVnaW4gKyBjdHJsUHRYT2Zmc2V0LCB5RW5kLCB4QmVnaW4sIHlFbmQgLSBoT2Zmc2V0XVxuICAgICAgfTtcbiAgICAgIHB0cy50b3BMZWZ0LmlzVG9wID0gdHJ1ZTtcbiAgICAgIHB0cy50b3BSaWdodC5pc1RvcCA9IHRydWU7XG4gICAgICBwdHMuYm90dG9tTGVmdC5pc0JvdHRvbSA9IHRydWU7XG4gICAgICBwdHMuYm90dG9tUmlnaHQuaXNCb3R0b20gPSB0cnVlO1xuICAgICAgcmV0dXJuIHB0cztcbiAgICB9LFxuICAgIGNoZWNrUG9pbnQ6IGZ1bmN0aW9uIGNoZWNrUG9pbnQoeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSwgY29ybmVyUmFkaXVzKSB7XG4gICAgICB2YXIgY3VydmVDb25zdGFudHMgPSBnZXRCYXJyZWxDdXJ2ZUNvbnN0YW50cyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHZhciBoT2Zmc2V0ID0gY3VydmVDb25zdGFudHMuaGVpZ2h0T2Zmc2V0O1xuICAgICAgdmFyIHdPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy53aWR0aE9mZnNldDtcblxuICAgICAgLy8gQ2hlY2sgaEJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCAtIDIgKiBoT2Zmc2V0LCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSAyICogd09mZnNldCwgaGVpZ2h0LCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBiYXJyZWxDdXJ2ZVB0cyA9IHRoaXMuZ2VuZXJhdGVCYXJyZWxCZXppZXJQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSk7XG4gICAgICB2YXIgZ2V0Q3VydmVUID0gZnVuY3Rpb24gZ2V0Q3VydmVUKHgsIHksIGN1cnZlUHRzKSB7XG4gICAgICAgIHZhciB4MCA9IGN1cnZlUHRzWzRdO1xuICAgICAgICB2YXIgeDEgPSBjdXJ2ZVB0c1syXTtcbiAgICAgICAgdmFyIHgyID0gY3VydmVQdHNbMF07XG4gICAgICAgIHZhciB5MCA9IGN1cnZlUHRzWzVdO1xuICAgICAgICAvLyB2YXIgeTEgPSBjdXJ2ZVB0c1sgMyBdO1xuICAgICAgICB2YXIgeTIgPSBjdXJ2ZVB0c1sxXTtcbiAgICAgICAgdmFyIHhNaW4gPSBNYXRoLm1pbih4MCwgeDIpO1xuICAgICAgICB2YXIgeE1heCA9IE1hdGgubWF4KHgwLCB4Mik7XG4gICAgICAgIHZhciB5TWluID0gTWF0aC5taW4oeTAsIHkyKTtcbiAgICAgICAgdmFyIHlNYXggPSBNYXRoLm1heCh5MCwgeTIpO1xuICAgICAgICBpZiAoeE1pbiA8PSB4ICYmIHggPD0geE1heCAmJiB5TWluIDw9IHkgJiYgeSA8PSB5TWF4KSB7XG4gICAgICAgICAgdmFyIGNvZWZmID0gYmV6aWVyUHRzVG9RdWFkQ29lZmYoeDAsIHgxLCB4Mik7XG4gICAgICAgICAgdmFyIHJvb3RzID0gc29sdmVRdWFkcmF0aWMoY29lZmZbMF0sIGNvZWZmWzFdLCBjb2VmZlsyXSwgeCk7XG4gICAgICAgICAgdmFyIHZhbGlkUm9vdHMgPSByb290cy5maWx0ZXIoZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICAgIHJldHVybiAwIDw9IHIgJiYgciA8PSAxO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICh2YWxpZFJvb3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZFJvb3RzWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICB2YXIgY3VydmVSZWdpb25zID0gT2JqZWN0LmtleXMoYmFycmVsQ3VydmVQdHMpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdXJ2ZVJlZ2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvcm5lciA9IGN1cnZlUmVnaW9uc1tpXTtcbiAgICAgICAgdmFyIGNvcm5lclB0cyA9IGJhcnJlbEN1cnZlUHRzW2Nvcm5lcl07XG4gICAgICAgIHZhciB0ID0gZ2V0Q3VydmVUKHgsIHksIGNvcm5lclB0cyk7XG4gICAgICAgIGlmICh0ID09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgeTAgPSBjb3JuZXJQdHNbNV07XG4gICAgICAgIHZhciB5MSA9IGNvcm5lclB0c1szXTtcbiAgICAgICAgdmFyIHkyID0gY29ybmVyUHRzWzFdO1xuICAgICAgICB2YXIgYmV6WSA9IHFiZXppZXJBdCh5MCwgeTEsIHkyLCB0KTtcbiAgICAgICAgaWYgKGNvcm5lclB0cy5pc1RvcCAmJiBiZXpZIDw9IHkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29ybmVyUHRzLmlzQm90dG9tICYmIHkgPD0gYmV6WSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xufTtcbkJScCQyLmdlbmVyYXRlQm90dG9tUm91bmRyZWN0YW5nbGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbJ2JvdHRvbS1yb3VuZC1yZWN0YW5nbGUnXSA9IHRoaXMubm9kZVNoYXBlc1snYm90dG9tcm91bmRyZWN0YW5nbGUnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAnYm90dG9tLXJvdW5kLXJlY3RhbmdsZScsXG4gICAgcG9pbnRzOiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCksXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCh0aGlzLm5hbWUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHRoaXMucG9pbnRzLCBjb3JuZXJSYWRpdXMpO1xuICAgIH0sXG4gICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gaW50ZXJzZWN0TGluZShub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcsIGNvcm5lclJhZGl1cykge1xuICAgICAgdmFyIHRvcFN0YXJ0WCA9IG5vZGVYIC0gKHdpZHRoIC8gMiArIHBhZGRpbmcpO1xuICAgICAgdmFyIHRvcFN0YXJ0WSA9IG5vZGVZIC0gKGhlaWdodCAvIDIgKyBwYWRkaW5nKTtcbiAgICAgIHZhciB0b3BFbmRZID0gdG9wU3RhcnRZO1xuICAgICAgdmFyIHRvcEVuZFggPSBub2RlWCArICh3aWR0aCAvIDIgKyBwYWRkaW5nKTtcbiAgICAgIHZhciB0b3BJbnRlcnNlY3Rpb25zID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgbm9kZVgsIG5vZGVZLCB0b3BTdGFydFgsIHRvcFN0YXJ0WSwgdG9wRW5kWCwgdG9wRW5kWSwgZmFsc2UpO1xuICAgICAgaWYgKHRvcEludGVyc2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gdG9wSW50ZXJzZWN0aW9ucztcbiAgICAgIH1cbiAgICAgIHJldHVybiByb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUoeCwgeSwgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nLCBjb3JuZXJSYWRpdXMpO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCkgOiBjb3JuZXJSYWRpdXM7XG4gICAgICB2YXIgZGlhbSA9IDIgKiBjb3JuZXJSYWRpdXM7XG5cbiAgICAgIC8vIENoZWNrIGhCb3hcbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQgLSBkaWFtLCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSBkaWFtLCBoZWlnaHQsIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBjaGVjayBub24tcm91bmRlZCB0b3Agc2lkZVxuICAgICAgdmFyIG91dGVyV2lkdGggPSB3aWR0aCAvIDIgKyAyICogcGFkZGluZztcbiAgICAgIHZhciBvdXRlckhlaWdodCA9IGhlaWdodCAvIDIgKyAyICogcGFkZGluZztcbiAgICAgIHZhciBwb2ludHMgPSBbY2VudGVyWCAtIG91dGVyV2lkdGgsIGNlbnRlclkgLSBvdXRlckhlaWdodCwgY2VudGVyWCAtIG91dGVyV2lkdGgsIGNlbnRlclksIGNlbnRlclggKyBvdXRlcldpZHRoLCBjZW50ZXJZLCBjZW50ZXJYICsgb3V0ZXJXaWR0aCwgY2VudGVyWSAtIG91dGVySGVpZ2h0XTtcbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgcG9pbnRzKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgYm90dG9tIHJpZ2h0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCArIHdpZHRoIC8gMiAtIGNvcm5lclJhZGl1cywgY2VudGVyWSArIGhlaWdodCAvIDIgLSBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBib3R0b20gbGVmdCBxdWFydGVyIGNpcmNsZVxuICAgICAgaWYgKGNoZWNrSW5FbGxpcHNlKHgsIHksIGRpYW0sIGRpYW0sIGNlbnRlclggLSB3aWR0aCAvIDIgKyBjb3JuZXJSYWRpdXMsIGNlbnRlclkgKyBoZWlnaHQgLyAyIC0gY29ybmVyUmFkaXVzLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG59O1xuQlJwJDIucmVnaXN0ZXJOb2RlU2hhcGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm9kZVNoYXBlcyA9IHRoaXMubm9kZVNoYXBlcyA9IHt9O1xuICB2YXIgcmVuZGVyZXIgPSB0aGlzO1xuICB0aGlzLmdlbmVyYXRlRWxsaXBzZSgpO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbigndHJpYW5nbGUnLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoMywgMCkpO1xuICB0aGlzLmdlbmVyYXRlUm91bmRQb2x5Z29uKCdyb3VuZC10cmlhbmdsZScsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSgzLCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdyZWN0YW5nbGUnLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCkpO1xuICBub2RlU2hhcGVzWydzcXVhcmUnXSA9IG5vZGVTaGFwZXNbJ3JlY3RhbmdsZSddO1xuICB0aGlzLmdlbmVyYXRlUm91bmRSZWN0YW5nbGUoKTtcbiAgdGhpcy5nZW5lcmF0ZUN1dFJlY3RhbmdsZSgpO1xuICB0aGlzLmdlbmVyYXRlQmFycmVsKCk7XG4gIHRoaXMuZ2VuZXJhdGVCb3R0b21Sb3VuZHJlY3RhbmdsZSgpO1xuICB7XG4gICAgdmFyIGRpYW1vbmRQb2ludHMgPSBbMCwgMSwgMSwgMCwgMCwgLTEsIC0xLCAwXTtcbiAgICB0aGlzLmdlbmVyYXRlUG9seWdvbignZGlhbW9uZCcsIGRpYW1vbmRQb2ludHMpO1xuICAgIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLWRpYW1vbmQnLCBkaWFtb25kUG9pbnRzKTtcbiAgfVxuICB0aGlzLmdlbmVyYXRlUG9seWdvbigncGVudGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNSwgMCkpO1xuICB0aGlzLmdlbmVyYXRlUm91bmRQb2x5Z29uKCdyb3VuZC1wZW50YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg1LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdoZXhhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDYsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVJvdW5kUG9seWdvbigncm91bmQtaGV4YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg2LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdoZXB0YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg3LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLWhlcHRhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDcsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ29jdGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoOCwgMCkpO1xuICB0aGlzLmdlbmVyYXRlUm91bmRQb2x5Z29uKCdyb3VuZC1vY3RhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDgsIDApKTtcbiAgdmFyIHN0YXI1UG9pbnRzID0gbmV3IEFycmF5KDIwKTtcbiAge1xuICAgIHZhciBvdXRlclBvaW50cyA9IGdlbmVyYXRlVW5pdE5nb25Qb2ludHMoNSwgMCk7XG4gICAgdmFyIGlubmVyUG9pbnRzID0gZ2VuZXJhdGVVbml0TmdvblBvaW50cyg1LCBNYXRoLlBJIC8gNSk7XG5cbiAgICAvLyBPdXRlciByYWRpdXMgaXMgMTsgaW5uZXIgcmFkaXVzIG9mIHN0YXIgaXMgc21hbGxlclxuICAgIHZhciBpbm5lclJhZGl1cyA9IDAuNSAqICgzIC0gTWF0aC5zcXJ0KDUpKTtcbiAgICBpbm5lclJhZGl1cyAqPSAxLjU3O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5uZXJQb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgICBpbm5lclBvaW50c1tpICogMl0gKj0gaW5uZXJSYWRpdXM7XG4gICAgICBpbm5lclBvaW50c1tpICogMiArIDFdICo9IGlubmVyUmFkaXVzO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDIwIC8gNDsgaSsrKSB7XG4gICAgICBzdGFyNVBvaW50c1tpICogNF0gPSBvdXRlclBvaW50c1tpICogMl07XG4gICAgICBzdGFyNVBvaW50c1tpICogNCArIDFdID0gb3V0ZXJQb2ludHNbaSAqIDIgKyAxXTtcbiAgICAgIHN0YXI1UG9pbnRzW2kgKiA0ICsgMl0gPSBpbm5lclBvaW50c1tpICogMl07XG4gICAgICBzdGFyNVBvaW50c1tpICogNCArIDNdID0gaW5uZXJQb2ludHNbaSAqIDIgKyAxXTtcbiAgICB9XG4gIH1cbiAgc3RhcjVQb2ludHMgPSBmaXRQb2x5Z29uVG9TcXVhcmUoc3RhcjVQb2ludHMpO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbignc3RhcicsIHN0YXI1UG9pbnRzKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3ZlZScsIFstMSwgLTEsIDAsIC0wLjMzMywgMSwgLTEsIDAsIDFdKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3Job21ib2lkJywgWy0xLCAtMSwgMC4zMzMsIC0xLCAxLCAxLCAtMC4zMzMsIDFdKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3JpZ2h0LXJob21ib2lkJywgWy0wLjMzMywgLTEsIDEsIC0xLCAwLjMzMywgMSwgLTEsIDFdKTtcbiAgdGhpcy5ub2RlU2hhcGVzWydjb25jYXZlaGV4YWdvbiddID0gdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ2NvbmNhdmUtaGV4YWdvbicsIFstMSwgLTAuOTUsIC0wLjc1LCAwLCAtMSwgMC45NSwgMSwgMC45NSwgMC43NSwgMCwgMSwgLTAuOTVdKTtcbiAge1xuICAgIHZhciB0YWdQb2ludHMgPSBbLTEsIC0xLCAwLjI1LCAtMSwgMSwgMCwgMC4yNSwgMSwgLTEsIDFdO1xuICAgIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCd0YWcnLCB0YWdQb2ludHMpO1xuICAgIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLXRhZycsIHRhZ1BvaW50cyk7XG4gIH1cbiAgbm9kZVNoYXBlcy5tYWtlUG9seWdvbiA9IGZ1bmN0aW9uIChwb2ludHMpIHtcbiAgICAvLyB1c2UgY2FjaGluZyBvbiB1c2VyLXNwZWNpZmllZCBwb2x5Z29ucyBzbyB0aGV5IGFyZSBhcyBmYXN0IGFzIG5hdGl2ZSBzaGFwZXNcblxuICAgIHZhciBrZXkgPSBwb2ludHMuam9pbignJCcpO1xuICAgIHZhciBuYW1lID0gJ3BvbHlnb24tJyArIGtleTtcbiAgICB2YXIgc2hhcGU7XG4gICAgaWYgKHNoYXBlID0gdGhpc1tuYW1lXSkge1xuICAgICAgLy8gZ290IGNhY2hlZCBzaGFwZVxuICAgICAgcmV0dXJuIHNoYXBlO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBhbmQgY2FjaGUgbmV3IHNoYXBlXG4gICAgcmV0dXJuIHJlbmRlcmVyLmdlbmVyYXRlUG9seWdvbihuYW1lLCBwb2ludHMpO1xuICB9O1xufTtcblxudmFyIEJScCQxID0ge307XG5CUnAkMS50aW1lVG9SZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlZHJhd1RvdGFsVGltZSAvIHRoaXMucmVkcmF3Q291bnQ7XG59O1xuQlJwJDEucmVkcmF3ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwgc3RhdGljRW1wdHlPYmplY3QoKTtcbiAgdmFyIHIgPSB0aGlzO1xuICBpZiAoci5hdmVyYWdlUmVkcmF3VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgci5hdmVyYWdlUmVkcmF3VGltZSA9IDA7XG4gIH1cbiAgaWYgKHIubGFzdFJlZHJhd1RpbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHIubGFzdFJlZHJhd1RpbWUgPSAwO1xuICB9XG4gIGlmIChyLmxhc3REcmF3VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgci5sYXN0RHJhd1RpbWUgPSAwO1xuICB9XG4gIHIucmVxdWVzdGVkRnJhbWUgPSB0cnVlO1xuICByLnJlbmRlck9wdGlvbnMgPSBvcHRpb25zO1xufTtcbkJScCQxLmJlZm9yZVJlbmRlciA9IGZ1bmN0aW9uIChmbiwgcHJpb3JpdHkpIHtcbiAgLy8gdGhlIHJlbmRlcmVyIGNhbid0IGFkZCB0aWNrIGNhbGxiYWNrcyB3aGVuIGRlc3Ryb3llZFxuICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHByaW9yaXR5ID09IG51bGwpIHtcbiAgICBlcnJvcignUHJpb3JpdHkgaXMgbm90IG9wdGlvbmFsIGZvciBiZWZvcmVSZW5kZXInKTtcbiAgfVxuICB2YXIgY2JzID0gdGhpcy5iZWZvcmVSZW5kZXJDYWxsYmFja3M7XG4gIGNicy5wdXNoKHtcbiAgICBmbjogZm4sXG4gICAgcHJpb3JpdHk6IHByaW9yaXR5XG4gIH0pO1xuXG4gIC8vIGhpZ2hlciBwcmlvcml0eSBjYWxsYmFja3MgZXhlY3V0ZWQgZmlyc3RcbiAgY2JzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYi5wcmlvcml0eSAtIGEucHJpb3JpdHk7XG4gIH0pO1xufTtcbnZhciBiZWZvcmVSZW5kZXJDYWxsYmFja3MgPSBmdW5jdGlvbiBiZWZvcmVSZW5kZXJDYWxsYmFja3Mociwgd2lsbERyYXcsIHN0YXJ0VGltZSkge1xuICB2YXIgY2JzID0gci5iZWZvcmVSZW5kZXJDYWxsYmFja3M7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2JzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2JzW2ldLmZuKHdpbGxEcmF3LCBzdGFydFRpbWUpO1xuICB9XG59O1xuQlJwJDEuc3RhcnRSZW5kZXJMb29wID0gZnVuY3Rpb24gKCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjeSA9IHIuY3k7XG4gIGlmIChyLnJlbmRlckxvb3BTdGFydGVkKSB7XG4gICAgcmV0dXJuO1xuICB9IGVsc2Uge1xuICAgIHIucmVuZGVyTG9vcFN0YXJ0ZWQgPSB0cnVlO1xuICB9XG4gIHZhciByZW5kZXJGbiA9IGZ1bmN0aW9uIHJlbmRlckZuKHJlcXVlc3RUaW1lKSB7XG4gICAgaWYgKHIuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjeS5iYXRjaGluZygpKSA7IGVsc2UgaWYgKHIucmVxdWVzdGVkRnJhbWUgJiYgIXIuc2tpcEZyYW1lKSB7XG4gICAgICBiZWZvcmVSZW5kZXJDYWxsYmFja3MociwgdHJ1ZSwgcmVxdWVzdFRpbWUpO1xuICAgICAgdmFyIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gICAgICByLnJlbmRlcihyLnJlbmRlck9wdGlvbnMpO1xuICAgICAgdmFyIGVuZFRpbWUgPSByLmxhc3REcmF3VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gICAgICBpZiAoci5hdmVyYWdlUmVkcmF3VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHIuYXZlcmFnZVJlZHJhd1RpbWUgPSBlbmRUaW1lIC0gc3RhcnRUaW1lO1xuICAgICAgfVxuICAgICAgaWYgKHIucmVkcmF3Q291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByLnJlZHJhd0NvdW50ID0gMDtcbiAgICAgIH1cbiAgICAgIHIucmVkcmF3Q291bnQrKztcbiAgICAgIGlmIChyLnJlZHJhd1RvdGFsVGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHIucmVkcmF3VG90YWxUaW1lID0gMDtcbiAgICAgIH1cbiAgICAgIHZhciBkdXJhdGlvbiA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgICByLnJlZHJhd1RvdGFsVGltZSArPSBkdXJhdGlvbjtcbiAgICAgIHIubGFzdFJlZHJhd1RpbWUgPSBkdXJhdGlvbjtcblxuICAgICAgLy8gdXNlIGEgd2VpZ2h0ZWQgYXZlcmFnZSB3aXRoIGEgYmlhcyBmcm9tIHRoZSBwcmV2aW91cyBhdmVyYWdlIHNvIHdlIGRvbid0IHNwaWtlIHNvIGVhc2lseVxuICAgICAgci5hdmVyYWdlUmVkcmF3VGltZSA9IHIuYXZlcmFnZVJlZHJhd1RpbWUgLyAyICsgZHVyYXRpb24gLyAyO1xuICAgICAgci5yZXF1ZXN0ZWRGcmFtZSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBiZWZvcmVSZW5kZXJDYWxsYmFja3MociwgZmFsc2UsIHJlcXVlc3RUaW1lKTtcbiAgICB9XG4gICAgci5za2lwRnJhbWUgPSBmYWxzZTtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVuZGVyRm4pO1xuICB9O1xuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVuZGVyRm4pO1xufTtcblxudmFyIEJhc2VSZW5kZXJlciA9IGZ1bmN0aW9uIEJhc2VSZW5kZXJlcihvcHRpb25zKSB7XG4gIHRoaXMuaW5pdChvcHRpb25zKTtcbn07XG52YXIgQlIgPSBCYXNlUmVuZGVyZXI7XG52YXIgQlJwID0gQlIucHJvdG90eXBlO1xuQlJwLmNsaWVudEZ1bmN0aW9ucyA9IFsncmVkcmF3SGludCcsICdyZW5kZXInLCAncmVuZGVyVG8nLCAnbWF0Y2hDYW52YXNTaXplJywgJ25vZGVTaGFwZUltcGwnLCAnYXJyb3dTaGFwZUltcGwnXTtcbkJScC5pbml0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICByLm9wdGlvbnMgPSBvcHRpb25zO1xuICByLmN5ID0gb3B0aW9ucy5jeTtcbiAgdmFyIGN0ciA9IHIuY29udGFpbmVyID0gb3B0aW9ucy5jeS5jb250YWluZXIoKTtcbiAgdmFyIGNvbnRhaW5lcldpbmRvdyA9IHIuY3kud2luZG93KCk7XG5cbiAgLy8gcHJlcGVuZCBhIHN0eWxlc2hlZXQgaW4gdGhlIGhlYWQgc3VjaCB0aGF0XG4gIGlmIChjb250YWluZXJXaW5kb3cpIHtcbiAgICB2YXIgZG9jdW1lbnQgPSBjb250YWluZXJXaW5kb3cuZG9jdW1lbnQ7XG4gICAgdmFyIGhlYWQgPSBkb2N1bWVudC5oZWFkO1xuICAgIHZhciBzdHlsZXNoZWV0SWQgPSAnX19fX19fX19fX2N5dG9zY2FwZV9zdHlsZXNoZWV0JztcbiAgICB2YXIgY2xhc3NOYW1lID0gJ19fX19fX19fX19jeXRvc2NhcGVfY29udGFpbmVyJztcbiAgICB2YXIgc3R5bGVzaGVldEFscmVhZHlFeGlzdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzdHlsZXNoZWV0SWQpICE9IG51bGw7XG4gICAgaWYgKGN0ci5jbGFzc05hbWUuaW5kZXhPZihjbGFzc05hbWUpIDwgMCkge1xuICAgICAgY3RyLmNsYXNzTmFtZSA9IChjdHIuY2xhc3NOYW1lIHx8ICcnKSArICcgJyArIGNsYXNzTmFtZTtcbiAgICB9XG4gICAgaWYgKCFzdHlsZXNoZWV0QWxyZWFkeUV4aXN0cykge1xuICAgICAgdmFyIHN0eWxlc2hlZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgc3R5bGVzaGVldC5pZCA9IHN0eWxlc2hlZXRJZDtcbiAgICAgIHN0eWxlc2hlZXQudGV4dENvbnRlbnQgPSAnLicgKyBjbGFzc05hbWUgKyAnIHsgcG9zaXRpb246IHJlbGF0aXZlOyB9JztcbiAgICAgIGhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlc2hlZXQsIGhlYWQuY2hpbGRyZW5bMF0pOyAvLyBmaXJzdCBzbyBsb3dlc3QgcHJpb3JpdHlcbiAgICB9XG5cbiAgICB2YXIgY29tcHV0ZWRTdHlsZSA9IGNvbnRhaW5lcldpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGN0cik7XG4gICAgdmFyIHBvc2l0aW9uID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwb3NpdGlvbicpO1xuICAgIGlmIChwb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIHdhcm4oJ0EgQ3l0b3NjYXBlIGNvbnRhaW5lciBoYXMgc3R5bGUgcG9zaXRpb246c3RhdGljIGFuZCBzbyBjYW4gbm90IHVzZSBVSSBleHRlbnNpb25zIHByb3Blcmx5Jyk7XG4gICAgfVxuICB9XG4gIHIuc2VsZWN0aW9uID0gW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF07IC8vIENvb3JkaW5hdGVzIGZvciBzZWxlY3Rpb24gYm94LCBwbHVzIGVuYWJsZWQgZmxhZ1xuXG4gIHIuYmV6aWVyUHJvalBjdHMgPSBbMC4wNSwgMC4yMjUsIDAuNCwgMC41LCAwLjYsIDAuNzc1LCAwLjk1XTtcblxuICAvLy0tUG9pbnRlci1yZWxhdGVkIGRhdGFcbiAgci5ob3ZlckRhdGEgPSB7XG4gICAgZG93bjogbnVsbCxcbiAgICBsYXN0OiBudWxsLFxuICAgIGRvd25UaW1lOiBudWxsLFxuICAgIHRyaWdnZXJNb2RlOiBudWxsLFxuICAgIGRyYWdnaW5nOiBmYWxzZSxcbiAgICBpbml0aWFsUGFuOiBbbnVsbCwgbnVsbF0sXG4gICAgY2FwdHVyZTogZmFsc2VcbiAgfTtcbiAgci5kcmFnRGF0YSA9IHtcbiAgICBwb3NzaWJsZURyYWdFbGVtZW50czogW11cbiAgfTtcbiAgci50b3VjaERhdGEgPSB7XG4gICAgc3RhcnQ6IG51bGwsXG4gICAgY2FwdHVyZTogZmFsc2UsXG4gICAgLy8gVGhlc2UgMyBmaWVsZHMgcmVsYXRlZCB0byB0YXAsIHRhcGhvbGQgZXZlbnRzXG4gICAgc3RhcnRQb3NpdGlvbjogW251bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGxdLFxuICAgIHNpbmdsZVRvdWNoU3RhcnRUaW1lOiBudWxsLFxuICAgIHNpbmdsZVRvdWNoTW92ZWQ6IHRydWUsXG4gICAgbm93OiBbbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbF0sXG4gICAgZWFybGllcjogW251bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGxdXG4gIH07XG4gIHIucmVkcmF3cyA9IDA7XG4gIHIuc2hvd0ZwcyA9IG9wdGlvbnMuc2hvd0ZwcztcbiAgci5kZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG4gIHIuaGlkZUVkZ2VzT25WaWV3cG9ydCA9IG9wdGlvbnMuaGlkZUVkZ2VzT25WaWV3cG9ydDtcbiAgci50ZXh0dXJlT25WaWV3cG9ydCA9IG9wdGlvbnMudGV4dHVyZU9uVmlld3BvcnQ7XG4gIHIud2hlZWxTZW5zaXRpdml0eSA9IG9wdGlvbnMud2hlZWxTZW5zaXRpdml0eTtcbiAgci5tb3Rpb25CbHVyRW5hYmxlZCA9IG9wdGlvbnMubW90aW9uQmx1cjsgLy8gb24gYnkgZGVmYXVsdFxuICByLmZvcmNlZFBpeGVsUmF0aW8gPSBudW1iZXIkMShvcHRpb25zLnBpeGVsUmF0aW8pID8gb3B0aW9ucy5waXhlbFJhdGlvIDogbnVsbDtcbiAgci5tb3Rpb25CbHVyID0gb3B0aW9ucy5tb3Rpb25CbHVyOyAvLyBmb3IgaW5pdGlhbCBraWNrIG9mZlxuICByLm1vdGlvbkJsdXJPcGFjaXR5ID0gb3B0aW9ucy5tb3Rpb25CbHVyT3BhY2l0eTtcbiAgci5tb3Rpb25CbHVyVHJhbnNwYXJlbmN5ID0gMSAtIHIubW90aW9uQmx1ck9wYWNpdHk7XG4gIHIubW90aW9uQmx1clB4UmF0aW8gPSAxO1xuICByLm1iUHhSQmx1cnJ5ID0gMTsgLy8wLjg7XG4gIHIubWluTWJMb3dRdWFsRnJhbWVzID0gNDtcbiAgci5mdWxsUXVhbGl0eU1iID0gZmFsc2U7XG4gIHIuY2xlYXJlZEZvck1vdGlvbkJsdXIgPSBbXTtcbiAgci5kZXNrdG9wVGFwVGhyZXNob2xkID0gb3B0aW9ucy5kZXNrdG9wVGFwVGhyZXNob2xkO1xuICByLmRlc2t0b3BUYXBUaHJlc2hvbGQyID0gb3B0aW9ucy5kZXNrdG9wVGFwVGhyZXNob2xkICogb3B0aW9ucy5kZXNrdG9wVGFwVGhyZXNob2xkO1xuICByLnRvdWNoVGFwVGhyZXNob2xkID0gb3B0aW9ucy50b3VjaFRhcFRocmVzaG9sZDtcbiAgci50b3VjaFRhcFRocmVzaG9sZDIgPSBvcHRpb25zLnRvdWNoVGFwVGhyZXNob2xkICogb3B0aW9ucy50b3VjaFRhcFRocmVzaG9sZDtcbiAgci50YXBob2xkRHVyYXRpb24gPSA1MDA7XG4gIHIuYmluZGluZ3MgPSBbXTtcbiAgci5iZWZvcmVSZW5kZXJDYWxsYmFja3MgPSBbXTtcbiAgci5iZWZvcmVSZW5kZXJQcmlvcml0aWVzID0ge1xuICAgIC8vIGhpZ2hlciBwcmlvcml0eSBleGVjcyBiZWZvcmUgbG93ZXIgb25lXG4gICAgYW5pbWF0aW9uczogNDAwLFxuICAgIGVsZUNhbGNzOiAzMDAsXG4gICAgZWxlVHhyRGVxOiAyMDAsXG4gICAgbHlyVHhyRGVxOiAxNTAsXG4gICAgbHlyVHhyU2tpcDogMTAwXG4gIH07XG4gIHIucmVnaXN0ZXJOb2RlU2hhcGVzKCk7XG4gIHIucmVnaXN0ZXJBcnJvd1NoYXBlcygpO1xuICByLnJlZ2lzdGVyQ2FsY3VsYXRpb25MaXN0ZW5lcnMoKTtcbn07XG5CUnAubm90aWZ5ID0gZnVuY3Rpb24gKGV2ZW50TmFtZSwgZWxlcykge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjeSA9IHIuY3k7XG5cbiAgLy8gdGhlIHJlbmRlcmVyIGNhbid0IGJlIG5vdGlmaWVkIGFmdGVyIGl0J3MgZGVzdHJveWVkXG4gIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZXZlbnROYW1lID09PSAnaW5pdCcpIHtcbiAgICByLmxvYWQoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGV2ZW50TmFtZSA9PT0gJ2Rlc3Ryb3knKSB7XG4gICAgci5kZXN0cm95KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChldmVudE5hbWUgPT09ICdhZGQnIHx8IGV2ZW50TmFtZSA9PT0gJ3JlbW92ZScgfHwgZXZlbnROYW1lID09PSAnbW92ZScgJiYgY3kuaGFzQ29tcG91bmROb2RlcygpIHx8IGV2ZW50TmFtZSA9PT0gJ2xvYWQnIHx8IGV2ZW50TmFtZSA9PT0gJ3pvcmRlcicgfHwgZXZlbnROYW1lID09PSAnbW91bnQnKSB7XG4gICAgci5pbnZhbGlkYXRlQ2FjaGVkWlNvcnRlZEVsZXMoKTtcbiAgfVxuICBpZiAoZXZlbnROYW1lID09PSAndmlld3BvcnQnKSB7XG4gICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgfVxuICBpZiAoZXZlbnROYW1lID09PSAnbG9hZCcgfHwgZXZlbnROYW1lID09PSAncmVzaXplJyB8fCBldmVudE5hbWUgPT09ICdtb3VudCcpIHtcbiAgICByLmludmFsaWRhdGVDb250YWluZXJDbGllbnRDb29yZHNDYWNoZSgpO1xuICAgIHIubWF0Y2hDYW52YXNTaXplKHIuY29udGFpbmVyKTtcbiAgfVxuICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gIHRoaXMuc3RhcnRSZW5kZXJMb29wKCk7XG4gIHRoaXMucmVkcmF3KCk7XG59O1xuQlJwLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByID0gdGhpcztcbiAgci5kZXN0cm95ZWQgPSB0cnVlO1xuICByLmN5LnN0b3BBbmltYXRpb25Mb29wKCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgci5iaW5kaW5ncy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBiaW5kaW5nID0gci5iaW5kaW5nc1tpXTtcbiAgICB2YXIgYiA9IGJpbmRpbmc7XG4gICAgdmFyIHRndCA9IGIudGFyZ2V0O1xuICAgICh0Z3Qub2ZmIHx8IHRndC5yZW1vdmVFdmVudExpc3RlbmVyKS5hcHBseSh0Z3QsIGIuYXJncyk7XG4gIH1cbiAgci5iaW5kaW5ncyA9IFtdO1xuICByLmJlZm9yZVJlbmRlckNhbGxiYWNrcyA9IFtdO1xuICByLm9uVXBkYXRlRWxlQ2FsY3NGbnMgPSBbXTtcbiAgaWYgKHIucmVtb3ZlT2JzZXJ2ZXIpIHtcbiAgICByLnJlbW92ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfVxuICBpZiAoci5zdHlsZU9ic2VydmVyKSB7XG4gICAgci5zdHlsZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfVxuICBpZiAoci5yZXNpemVPYnNlcnZlcikge1xuICAgIHIucmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9XG4gIGlmIChyLmxhYmVsQ2FsY0Rpdikge1xuICAgIHRyeSB7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHIubGFiZWxDYWxjRGl2KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGllMTAgaXNzdWUgIzEwMTRcbiAgICB9XG4gIH1cbn07XG5CUnAuaXNIZWFkbGVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufTtcbltCUnAkZiwgQlJwJDUsIEJScCQ0LCBCUnAkMywgQlJwJDIsIEJScCQxXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoQlJwLCBwcm9wcyk7XG59KTtcblxudmFyIGZ1bGxGcHNUaW1lID0gMTAwMCAvIDYwOyAvLyBhc3N1bWUgNjAgZnJhbWVzIHBlciBzZWNvbmRcblxudmFyIGRlZnMgPSB7XG4gIHNldHVwRGVxdWV1ZWluZzogZnVuY3Rpb24gc2V0dXBEZXF1ZXVlaW5nKG9wdHMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gc2V0dXBEZXF1ZXVlaW5nSW1wbCgpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciByID0gdGhpcy5yZW5kZXJlcjtcbiAgICAgIGlmIChzZWxmLmRlcXVldWVpbmdTZXR1cCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLmRlcXVldWVpbmdTZXR1cCA9IHRydWU7XG4gICAgICB9XG4gICAgICB2YXIgcXVldWVSZWRyYXcgPSBkZWJvdW5jZV8xKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICByLnJlZHJhdygpO1xuICAgICAgfSwgb3B0cy5kZXFSZWRyYXdUaHJlc2hvbGQpO1xuICAgICAgdmFyIGRlcXVldWUgPSBmdW5jdGlvbiBkZXF1ZXVlKHdpbGxEcmF3LCBmcmFtZVN0YXJ0VGltZSkge1xuICAgICAgICB2YXIgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgICAgICAgdmFyIGF2Z1JlbmRlclRpbWUgPSByLmF2ZXJhZ2VSZWRyYXdUaW1lO1xuICAgICAgICB2YXIgcmVuZGVyVGltZSA9IHIubGFzdFJlZHJhd1RpbWU7XG4gICAgICAgIHZhciBkZXFkID0gW107XG4gICAgICAgIHZhciBleHRlbnQgPSByLmN5LmV4dGVudCgpO1xuICAgICAgICB2YXIgcGl4ZWxSYXRpbyA9IHIuZ2V0UGl4ZWxSYXRpbygpO1xuXG4gICAgICAgIC8vIGlmIHdlIGFyZW4ndCBpbiBhIHRpY2sgdGhhdCBjYXVzZXMgYSBkcmF3LCB0aGVuIHRoZSByZW5kZXJlZCBzdHlsZVxuICAgICAgICAvLyBxdWV1ZSB3b24ndCBhdXRvbWF0aWNhbGx5IGJlIGZsdXNoZWQgYmVmb3JlIGRlcXVldWVpbmcgc3RhcnRzXG4gICAgICAgIGlmICghd2lsbERyYXcpIHtcbiAgICAgICAgICByLmZsdXNoUmVuZGVyZWRTdHlsZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuICAgICAgICAgIHZhciBub3cgPSBwZXJmb3JtYW5jZU5vdygpO1xuICAgICAgICAgIHZhciBkdXJhdGlvbiA9IG5vdyAtIHN0YXJ0VGltZTtcbiAgICAgICAgICB2YXIgZnJhbWVEdXJhdGlvbiA9IG5vdyAtIGZyYW1lU3RhcnRUaW1lO1xuICAgICAgICAgIGlmIChyZW5kZXJUaW1lIDwgZnVsbEZwc1RpbWUpIHtcbiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHJlbmRlcmluZyBmYXN0ZXIgdGhhbiB0aGUgaWRlYWwgZnBzLCB0aGVuIGRvIGRlcXVldWVpbmdcbiAgICAgICAgICAgIC8vIGR1cmluZyBhbGwgb2YgdGhlIHJlbWFpbmluZyBmcmFtZSB0aW1lXG5cbiAgICAgICAgICAgIHZhciB0aW1lQXZhaWxhYmxlID0gZnVsbEZwc1RpbWUgLSAod2lsbERyYXcgPyBhdmdSZW5kZXJUaW1lIDogMCk7XG4gICAgICAgICAgICBpZiAoZnJhbWVEdXJhdGlvbiA+PSBvcHRzLmRlcUZhc3RDb3N0ICogdGltZUF2YWlsYWJsZSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHdpbGxEcmF3KSB7XG4gICAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+PSBvcHRzLmRlcUNvc3QgKiByZW5kZXJUaW1lIHx8IGR1cmF0aW9uID49IG9wdHMuZGVxQXZnQ29zdCAqIGF2Z1JlbmRlclRpbWUpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChmcmFtZUR1cmF0aW9uID49IG9wdHMuZGVxTm9EcmF3Q29zdCAqIGZ1bGxGcHNUaW1lKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgdGhpc0RlcWQgPSBvcHRzLmRlcShzZWxmLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgICAgICAgIGlmICh0aGlzRGVxZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXNEZXFkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGRlcWQucHVzaCh0aGlzRGVxZFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNhbGxiYWNrcyBvbiBkZXF1ZXVlXG4gICAgICAgIGlmIChkZXFkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBvcHRzLm9uRGVxZChzZWxmLCBkZXFkKTtcbiAgICAgICAgICBpZiAoIXdpbGxEcmF3ICYmIG9wdHMuc2hvdWxkUmVkcmF3KHNlbGYsIGRlcWQsIHBpeGVsUmF0aW8sIGV4dGVudCkpIHtcbiAgICAgICAgICAgIHF1ZXVlUmVkcmF3KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIHByaW9yaXR5ID0gb3B0cy5wcmlvcml0eSB8fCBub29wJDE7XG4gICAgICByLmJlZm9yZVJlbmRlcihkZXF1ZXVlLCBwcmlvcml0eShzZWxmKSk7XG4gICAgfTtcbiAgfVxufTtcblxuLy8gQWxsb3dzIGxvb2t1cHMgZm9yIChlbGUsIGx2bCkgPT4gY2FjaGUuXG4vLyBVc2VzIGtleXMgc28gZWxlbWVudHMgbWF5IHNoYXJlIHRoZSBzYW1lIGNhY2hlLlxudmFyIEVsZW1lbnRUZXh0dXJlQ2FjaGVMb29rdXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBFbGVtZW50VGV4dHVyZUNhY2hlTG9va3VwKGdldEtleSkge1xuICAgIHZhciBkb2VzRWxlSW52YWxpZGF0ZUtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2lmeTtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cCk7XG4gICAgdGhpcy5pZHNCeUtleSA9IG5ldyBNYXAkMigpO1xuICAgIHRoaXMua2V5Rm9ySWQgPSBuZXcgTWFwJDIoKTtcbiAgICB0aGlzLmNhY2hlc0J5THZsID0gbmV3IE1hcCQyKCk7XG4gICAgdGhpcy5sdmxzID0gW107XG4gICAgdGhpcy5nZXRLZXkgPSBnZXRLZXk7XG4gICAgdGhpcy5kb2VzRWxlSW52YWxpZGF0ZUtleSA9IGRvZXNFbGVJbnZhbGlkYXRlS2V5O1xuICB9XG4gIF9jcmVhdGVDbGFzcyhFbGVtZW50VGV4dHVyZUNhY2hlTG9va3VwLCBbe1xuICAgIGtleTogXCJnZXRJZHNGb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0SWRzRm9yKGtleSkge1xuICAgICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICAgIGVycm9yKFwiQ2FuIG5vdCBnZXQgaWQgbGlzdCBmb3IgbnVsbCBrZXlcIik7XG4gICAgICB9XG4gICAgICB2YXIgaWRzQnlLZXkgPSB0aGlzLmlkc0J5S2V5O1xuICAgICAgdmFyIGlkcyA9IHRoaXMuaWRzQnlLZXkuZ2V0KGtleSk7XG4gICAgICBpZiAoIWlkcykge1xuICAgICAgICBpZHMgPSBuZXcgU2V0JDEoKTtcbiAgICAgICAgaWRzQnlLZXkuc2V0KGtleSwgaWRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpZHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZElkRm9yS2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZElkRm9yS2V5KGtleSwgaWQpIHtcbiAgICAgIGlmIChrZXkgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmdldElkc0ZvcihrZXkpLmFkZChpZCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZUlkRm9yS2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlbGV0ZUlkRm9yS2V5KGtleSwgaWQpIHtcbiAgICAgIGlmIChrZXkgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmdldElkc0ZvcihrZXkpW1wiZGVsZXRlXCJdKGlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TnVtYmVyT2ZJZHNGb3JLZXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TnVtYmVyT2ZJZHNGb3JLZXkoa2V5KSB7XG4gICAgICBpZiAoa2V5ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRJZHNGb3Ioa2V5KS5zaXplO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVLZXlNYXBwaW5nRm9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZUtleU1hcHBpbmdGb3IoZWxlKSB7XG4gICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICAgIHZhciBwcmV2S2V5ID0gdGhpcy5rZXlGb3JJZC5nZXQoaWQpO1xuICAgICAgdmFyIGN1cnJLZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICAgICAgdGhpcy5kZWxldGVJZEZvcktleShwcmV2S2V5LCBpZCk7XG4gICAgICB0aGlzLmFkZElkRm9yS2V5KGN1cnJLZXksIGlkKTtcbiAgICAgIHRoaXMua2V5Rm9ySWQuc2V0KGlkLCBjdXJyS2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlS2V5TWFwcGluZ0ZvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWxldGVLZXlNYXBwaW5nRm9yKGVsZSkge1xuICAgICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgICB2YXIgcHJldktleSA9IHRoaXMua2V5Rm9ySWQuZ2V0KGlkKTtcbiAgICAgIHRoaXMuZGVsZXRlSWRGb3JLZXkocHJldktleSwgaWQpO1xuICAgICAgdGhpcy5rZXlGb3JJZFtcImRlbGV0ZVwiXShpZCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImtleUhhc0NoYW5nZWRGb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24ga2V5SGFzQ2hhbmdlZEZvcihlbGUpIHtcbiAgICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgICAgdmFyIHByZXZLZXkgPSB0aGlzLmtleUZvcklkLmdldChpZCk7XG4gICAgICB2YXIgbmV3S2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHJldHVybiBwcmV2S2V5ICE9PSBuZXdLZXk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzSW52YWxpZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc0ludmFsaWQoZWxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5rZXlIYXNDaGFuZ2VkRm9yKGVsZSkgfHwgdGhpcy5kb2VzRWxlSW52YWxpZGF0ZUtleShlbGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDYWNoZXNBdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDYWNoZXNBdChsdmwpIHtcbiAgICAgIHZhciBjYWNoZXNCeUx2bCA9IHRoaXMuY2FjaGVzQnlMdmwsXG4gICAgICAgIGx2bHMgPSB0aGlzLmx2bHM7XG4gICAgICB2YXIgY2FjaGVzID0gY2FjaGVzQnlMdmwuZ2V0KGx2bCk7XG4gICAgICBpZiAoIWNhY2hlcykge1xuICAgICAgICBjYWNoZXMgPSBuZXcgTWFwJDIoKTtcbiAgICAgICAgY2FjaGVzQnlMdmwuc2V0KGx2bCwgY2FjaGVzKTtcbiAgICAgICAgbHZscy5wdXNoKGx2bCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FjaGVzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDYWNoZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDYWNoZShrZXksIGx2bCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVzQXQobHZsKS5nZXQoa2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChlbGUsIGx2bCkge1xuICAgICAgdmFyIGtleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gICAgICB2YXIgY2FjaGUgPSB0aGlzLmdldENhY2hlKGtleSwgbHZsKTtcblxuICAgICAgLy8gZ2V0dGluZyBmb3IgYW4gZWxlbWVudCBtYXkgbmVlZCB0byBhZGQgdG8gdGhlIGlkIGxpc3QgYi9jIGVsZXMgY2FuIHNoYXJlIGtleXNcbiAgICAgIGlmIChjYWNoZSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMudXBkYXRlS2V5TWFwcGluZ0ZvcihlbGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRGb3JDYWNoZWRLZXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Rm9yQ2FjaGVkS2V5KGVsZSwgbHZsKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5rZXlGb3JJZC5nZXQoZWxlLmlkKCkpOyAvLyBuLmIuIHVzZSBjYWNoZWQga2V5LCBub3QgbmV3bHkgY29tcHV0ZWQga2V5XG4gICAgICB2YXIgY2FjaGUgPSB0aGlzLmdldENhY2hlKGtleSwgbHZsKTtcbiAgICAgIHJldHVybiBjYWNoZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzQ2FjaGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzQ2FjaGUoa2V5LCBsdmwpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldENhY2hlc0F0KGx2bCkuaGFzKGtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXMoZWxlLCBsdmwpIHtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICAgICAgcmV0dXJuIHRoaXMuaGFzQ2FjaGUoa2V5LCBsdmwpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRDYWNoZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRDYWNoZShrZXksIGx2bCwgY2FjaGUpIHtcbiAgICAgIGNhY2hlLmtleSA9IGtleTtcbiAgICAgIHRoaXMuZ2V0Q2FjaGVzQXQobHZsKS5zZXQoa2V5LCBjYWNoZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoZWxlLCBsdmwsIGNhY2hlKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHRoaXMuc2V0Q2FjaGUoa2V5LCBsdmwsIGNhY2hlKTtcbiAgICAgIHRoaXMudXBkYXRlS2V5TWFwcGluZ0ZvcihlbGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWxldGVDYWNoZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWxldGVDYWNoZShrZXksIGx2bCkge1xuICAgICAgdGhpcy5nZXRDYWNoZXNBdChsdmwpW1wiZGVsZXRlXCJdKGtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVsZXRlKGVsZSwgbHZsKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHRoaXMuZGVsZXRlQ2FjaGUoa2V5LCBsdmwpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnZhbGlkYXRlS2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludmFsaWRhdGVLZXkoa2V5KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgdGhpcy5sdmxzLmZvckVhY2goZnVuY3Rpb24gKGx2bCkge1xuICAgICAgICByZXR1cm4gX3RoaXMuZGVsZXRlQ2FjaGUoa2V5LCBsdmwpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyB0cnVlIGlmIG5vIG90aGVyIGVsZXMgcmVmZXJlbmNlIHRoZSBpbnZhbGlkYXRlZCBjYWNoZSAobi5iLiBvdGhlciBlbGVzIG1heSBuZWVkIHRoZSBjYWNoZSB3aXRoIHRoZSBzYW1lIGtleSlcbiAgfSwge1xuICAgIGtleTogXCJpbnZhbGlkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludmFsaWRhdGUoZWxlKSB7XG4gICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmtleUZvcklkLmdldChpZCk7IC8vIG4uYi4gdXNlIHN0b3JlZCBrZXkgcmF0aGVyIHRoYW4gY3VycmVudCAocG90ZW50aWFsIGtleSlcblxuICAgICAgdGhpcy5kZWxldGVLZXlNYXBwaW5nRm9yKGVsZSk7XG4gICAgICB2YXIgZW50aXJlS2V5SW52YWxpZGF0ZWQgPSB0aGlzLmRvZXNFbGVJbnZhbGlkYXRlS2V5KGVsZSk7XG4gICAgICBpZiAoZW50aXJlS2V5SW52YWxpZGF0ZWQpIHtcbiAgICAgICAgLy8gY2xlYXIgbWFwcGluZyBmb3IgY3VycmVudCBrZXlcbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlS2V5KGtleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50aXJlS2V5SW52YWxpZGF0ZWQgfHwgdGhpcy5nZXROdW1iZXJPZklkc0ZvcktleShrZXkpID09PSAwO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cDtcbn0oKTtcblxudmFyIG1pblR4ckggPSAyNTsgLy8gdGhlIHNpemUgb2YgdGhlIHRleHR1cmUgY2FjaGUgZm9yIHNtYWxsIGhlaWdodCBlbGVzIChzcGVjaWFsIGNhc2UpXG52YXIgdHhyU3RlcEggPSA1MDsgLy8gdGhlIG1pbiBzaXplIG9mIHRoZSByZWd1bGFyIGNhY2hlLCBhbmQgdGhlIHNpemUgaXQgaW5jcmVhc2VzIHdpdGggZWFjaCBzdGVwIHVwXG52YXIgbWluTHZsJDEgPSAtNDsgLy8gd2hlbiBzY2FsaW5nIHNtYWxsZXIgdGhhbiB0aGF0IHdlIGRvbid0IG5lZWQgdG8gcmUtcmVuZGVyXG52YXIgbWF4THZsJDEgPSAzOyAvLyB3aGVuIGxhcmdlciB0aGFuIHRoaXMgc2NhbGUganVzdCByZW5kZXIgZGlyZWN0bHkgKGNhY2hpbmcgaXMgbm90IGhlbHBmdWwpXG52YXIgbWF4Wm9vbSQxID0gNy45OTsgLy8gYmV5b25kIHRoaXMgem9vbSBsZXZlbCwgbGF5ZXJlZCB0ZXh0dXJlcyBhcmUgbm90IHVzZWRcbnZhciBlbGVUeHJTcGFjaW5nID0gODsgLy8gc3BhY2luZyBiZXR3ZWVuIGVsZW1lbnRzIG9uIHRleHR1cmVzIHRvIGF2b2lkIGJsaXR0aW5nIG92ZXJsYXBzXG52YXIgZGVmVHhyV2lkdGggPSAxMDI0OyAvLyBkZWZhdWx0L21pbmltdW0gdGV4dHVyZSB3aWR0aFxudmFyIG1heFR4clcgPSAxMDI0OyAvLyB0aGUgbWF4aW11bSB3aWR0aCBvZiBhIHRleHR1cmVcbnZhciBtYXhUeHJIID0gMTAyNDsgLy8gdGhlIG1heGltdW0gaGVpZ2h0IG9mIGEgdGV4dHVyZVxudmFyIG1pblV0aWxpdHkgPSAwLjI7IC8vIGlmIHVzYWdlIG9mIHRleHR1cmUgaXMgbGVzcyB0aGFuIHRoaXMsIGl0IGlzIHJldGlyZWRcbnZhciBtYXhGdWxsbmVzcyA9IDAuODsgLy8gZnVsbG5lc3Mgb2YgdGV4dHVyZSBhZnRlciB3aGljaCBxdWV1ZSByZW1vdmFsIGlzIGNoZWNrZWRcbnZhciBtYXhGdWxsbmVzc0NoZWNrcyA9IDEwOyAvLyBkZXF1ZXVlZCBhZnRlciB0aGlzIG1hbnkgY2hlY2tzXG52YXIgZGVxQ29zdCQxID0gMC4xNTsgLy8gJSBvZiBhZGQnbCByZW5kZXJpbmcgY29zdCBhbGxvd2VkIGZvciBkZXF1ZXVpbmcgZWxlIGNhY2hlcyBlYWNoIGZyYW1lXG52YXIgZGVxQXZnQ29zdCQxID0gMC4xOyAvLyAlIG9mIGFkZCdsIHJlbmRlcmluZyBjb3N0IGNvbXBhcmVkIHRvIGF2ZXJhZ2Ugb3ZlcmFsbCByZWRyYXcgdGltZVxudmFyIGRlcU5vRHJhd0Nvc3QkMSA9IDAuOTsgLy8gJSBvZiBhdmcgZnJhbWUgdGltZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBkZXF1ZXVlaW5nIHdoZW4gbm90IGRyYXdpbmdcbnZhciBkZXFGYXN0Q29zdCQxID0gMC45OyAvLyAlIG9mIGZyYW1lIHRpbWUgdG8gYmUgdXNlZCB3aGVuID42MGZwc1xudmFyIGRlcVJlZHJhd1RocmVzaG9sZCQxID0gMTAwOyAvLyB0aW1lIHRvIGJhdGNoIHJlZHJhd3MgdG9nZXRoZXIgZnJvbSBkZXF1ZXVlaW5nIHRvIGFsbG93IG1vcmUgZGVxdWV1ZWluZyBjYWxjcyB0byBoYXBwZW4gaW4gdGhlIG1lYW53aGlsZVxudmFyIG1heERlcVNpemUkMSA9IDE7IC8vIG51bWJlciBvZiBlbGVzIHRvIGRlcXVldWUgYW5kIHJlbmRlciBhdCBoaWdoZXIgdGV4dHVyZSBpbiBlYWNoIGJhdGNoXG5cbnZhciBnZXRUeHJSZWFzb25zID0ge1xuICBkZXF1ZXVlOiAnZGVxdWV1ZScsXG4gIGRvd25zY2FsZTogJ2Rvd25zY2FsZScsXG4gIGhpZ2hRdWFsaXR5OiAnaGlnaFF1YWxpdHknXG59O1xudmFyIGluaXREZWZhdWx0cyA9IGRlZmF1bHRzJGcoe1xuICBnZXRLZXk6IG51bGwsXG4gIGRvZXNFbGVJbnZhbGlkYXRlS2V5OiBmYWxzaWZ5LFxuICBkcmF3RWxlbWVudDogbnVsbCxcbiAgZ2V0Qm91bmRpbmdCb3g6IG51bGwsXG4gIGdldFJvdGF0aW9uUG9pbnQ6IG51bGwsXG4gIGdldFJvdGF0aW9uT2Zmc2V0OiBudWxsLFxuICBpc1Zpc2libGU6IHRydWVpZnksXG4gIGFsbG93RWRnZVR4ckNhY2hpbmc6IHRydWUsXG4gIGFsbG93UGFyZW50VHhyQ2FjaGluZzogdHJ1ZVxufSk7XG52YXIgRWxlbWVudFRleHR1cmVDYWNoZSA9IGZ1bmN0aW9uIEVsZW1lbnRUZXh0dXJlQ2FjaGUocmVuZGVyZXIsIGluaXRPcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICBzZWxmLm9uRGVxdWV1ZXMgPSBbXTtcbiAgdmFyIG9wdHMgPSBpbml0RGVmYXVsdHMoaW5pdE9wdGlvbnMpO1xuICBleHRlbmQoc2VsZiwgb3B0cyk7XG4gIHNlbGYubG9va3VwID0gbmV3IEVsZW1lbnRUZXh0dXJlQ2FjaGVMb29rdXAob3B0cy5nZXRLZXksIG9wdHMuZG9lc0VsZUludmFsaWRhdGVLZXkpO1xuICBzZWxmLnNldHVwRGVxdWV1ZWluZygpO1xufTtcbnZhciBFVENwID0gRWxlbWVudFRleHR1cmVDYWNoZS5wcm90b3R5cGU7XG5FVENwLnJlYXNvbnMgPSBnZXRUeHJSZWFzb25zO1xuXG4vLyB0aGUgbGlzdCBvZiB0ZXh0dXJlcyBpbiB3aGljaCBuZXcgc3VidGV4dHVyZXMgZm9yIGVsZW1lbnRzIGNhbiBiZSBwbGFjZWRcbkVUQ3AuZ2V0VGV4dHVyZVF1ZXVlID0gZnVuY3Rpb24gKHR4ckgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmVsZUltZ0NhY2hlcyA9IHNlbGYuZWxlSW1nQ2FjaGVzIHx8IHt9O1xuICByZXR1cm4gc2VsZi5lbGVJbWdDYWNoZXNbdHhySF0gPSBzZWxmLmVsZUltZ0NhY2hlc1t0eHJIXSB8fCBbXTtcbn07XG5cbi8vIHRoZSBsaXN0IG9mIHVzdXNlZCB0ZXh0dXJlcyB3aGljaCBjYW4gYmUgcmVjeWNsZWQgKGluIHVzZSBpbiB0ZXh0dXJlIHF1ZXVlKVxuRVRDcC5nZXRSZXRpcmVkVGV4dHVyZVF1ZXVlID0gZnVuY3Rpb24gKHR4ckgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcnR4dHJRcyA9IHNlbGYuZWxlSW1nQ2FjaGVzLnJldGlyZWQgPSBzZWxmLmVsZUltZ0NhY2hlcy5yZXRpcmVkIHx8IHt9O1xuICB2YXIgcnR4dHJRID0gcnR4dHJRc1t0eHJIXSA9IHJ0eHRyUXNbdHhySF0gfHwgW107XG4gIHJldHVybiBydHh0clE7XG59O1xuXG4vLyBxdWV1ZSBvZiBlbGVtZW50IGRyYXcgcmVxdWVzdHMgYXQgZGlmZmVyZW50IHNjYWxlIGxldmVsc1xuRVRDcC5nZXRFbGVtZW50UXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHEgPSBzZWxmLmVsZUNhY2hlUXVldWUgPSBzZWxmLmVsZUNhY2hlUXVldWUgfHwgbmV3IGhlYXAoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYi5yZXFzIC0gYS5yZXFzO1xuICB9KTtcbiAgcmV0dXJuIHE7XG59O1xuXG4vLyBxdWV1ZSBvZiBlbGVtZW50IGRyYXcgcmVxdWVzdHMgYXQgZGlmZmVyZW50IHNjYWxlIGxldmVscyAoZWxlbWVudCBpZCBsb29rdXApXG5FVENwLmdldEVsZW1lbnRLZXlUb1F1ZXVlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBrMnEgPSBzZWxmLmVsZUtleVRvQ2FjaGVRdWV1ZSA9IHNlbGYuZWxlS2V5VG9DYWNoZVF1ZXVlIHx8IHt9O1xuICByZXR1cm4gazJxO1xufTtcbkVUQ3AuZ2V0RWxlbWVudCA9IGZ1bmN0aW9uIChlbGUsIGJiLCBweFJhdGlvLCBsdmwsIHJlYXNvbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByID0gdGhpcy5yZW5kZXJlcjtcbiAgdmFyIHpvb20gPSByLmN5Lnpvb20oKTtcbiAgdmFyIGxvb2t1cCA9IHRoaXMubG9va3VwO1xuICBpZiAoIWJiIHx8IGJiLncgPT09IDAgfHwgYmIuaCA9PT0gMCB8fCBpc05hTihiYi53KSB8fCBpc05hTihiYi5oKSB8fCAhZWxlLnZpc2libGUoKSB8fCBlbGUucmVtb3ZlZCgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKCFzZWxmLmFsbG93RWRnZVR4ckNhY2hpbmcgJiYgZWxlLmlzRWRnZSgpIHx8ICFzZWxmLmFsbG93UGFyZW50VHhyQ2FjaGluZyAmJiBlbGUuaXNQYXJlbnQoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChsdmwgPT0gbnVsbCkge1xuICAgIGx2bCA9IE1hdGguY2VpbChsb2cyKHpvb20gKiBweFJhdGlvKSk7XG4gIH1cbiAgaWYgKGx2bCA8IG1pbkx2bCQxKSB7XG4gICAgbHZsID0gbWluTHZsJDE7XG4gIH0gZWxzZSBpZiAoem9vbSA+PSBtYXhab29tJDEgfHwgbHZsID4gbWF4THZsJDEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgc2NhbGUgPSBNYXRoLnBvdygyLCBsdmwpO1xuICB2YXIgZWxlU2NhbGVkSCA9IGJiLmggKiBzY2FsZTtcbiAgdmFyIGVsZVNjYWxlZFcgPSBiYi53ICogc2NhbGU7XG4gIHZhciBzY2FsZWRMYWJlbFNob3duID0gci5lbGVUZXh0QmlnZ2VyVGhhbk1pbihlbGUsIHNjYWxlKTtcbiAgaWYgKCF0aGlzLmlzVmlzaWJsZShlbGUsIHNjYWxlZExhYmVsU2hvd24pKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGVsZUNhY2hlID0gbG9va3VwLmdldChlbGUsIGx2bCk7XG5cbiAgLy8gaWYgdGhpcyBnZXQgd2FzIG9uIGFuIHVudXNlZC9pbnZhbGlkYXRlZCBjYWNoZSwgdGhlbiByZXN0b3JlIHRoZSB0ZXh0dXJlIHVzYWdlIG1ldHJpY1xuICBpZiAoZWxlQ2FjaGUgJiYgZWxlQ2FjaGUuaW52YWxpZGF0ZWQpIHtcbiAgICBlbGVDYWNoZS5pbnZhbGlkYXRlZCA9IGZhbHNlO1xuICAgIGVsZUNhY2hlLnRleHR1cmUuaW52YWxpZGF0ZWRXaWR0aCAtPSBlbGVDYWNoZS53aWR0aDtcbiAgfVxuICBpZiAoZWxlQ2FjaGUpIHtcbiAgICByZXR1cm4gZWxlQ2FjaGU7XG4gIH1cbiAgdmFyIHR4ckg7IC8vIHdoaWNoIHRleHR1cmUgaGVpZ2h0IHRoaXMgZWxlIGJlbG9uZ3MgdG9cblxuICBpZiAoZWxlU2NhbGVkSCA8PSBtaW5UeHJIKSB7XG4gICAgdHhySCA9IG1pblR4ckg7XG4gIH0gZWxzZSBpZiAoZWxlU2NhbGVkSCA8PSB0eHJTdGVwSCkge1xuICAgIHR4ckggPSB0eHJTdGVwSDtcbiAgfSBlbHNlIHtcbiAgICB0eHJIID0gTWF0aC5jZWlsKGVsZVNjYWxlZEggLyB0eHJTdGVwSCkgKiB0eHJTdGVwSDtcbiAgfVxuICBpZiAoZWxlU2NhbGVkSCA+IG1heFR4ckggfHwgZWxlU2NhbGVkVyA+IG1heFR4clcpIHtcbiAgICByZXR1cm4gbnVsbDsgLy8gY2FjaGluZyBsYXJnZSBlbGVtZW50cyBpcyBub3QgZWZmaWNpZW50XG4gIH1cblxuICB2YXIgdHhyUSA9IHNlbGYuZ2V0VGV4dHVyZVF1ZXVlKHR4ckgpO1xuXG4gIC8vIGZpcnN0IHRyeSB0aGUgc2Vjb25kIGxhc3Qgb25lIGluIGNhc2UgaXQgaGFzIHNwYWNlIGF0IHRoZSBlbmRcbiAgdmFyIHR4ciA9IHR4clFbdHhyUS5sZW5ndGggLSAyXTtcbiAgdmFyIGFkZE5ld1R4ciA9IGZ1bmN0aW9uIGFkZE5ld1R4cigpIHtcbiAgICByZXR1cm4gc2VsZi5yZWN5Y2xlVGV4dHVyZSh0eHJILCBlbGVTY2FsZWRXKSB8fCBzZWxmLmFkZFRleHR1cmUodHhySCwgZWxlU2NhbGVkVyk7XG4gIH07XG5cbiAgLy8gdHJ5IHRoZSBsYXN0IG9uZSBpZiB0aGVyZSBpcyBubyBzZWNvbmQgbGFzdCBvbmVcbiAgaWYgKCF0eHIpIHtcbiAgICB0eHIgPSB0eHJRW3R4clEubGVuZ3RoIC0gMV07XG4gIH1cblxuICAvLyBpZiB0aGUgbGFzdCBvbmUgZG9lc24ndCBleGlzdCwgd2UgbmVlZCBhIGZpcnN0IG9uZVxuICBpZiAoIXR4cikge1xuICAgIHR4ciA9IGFkZE5ld1R4cigpO1xuICB9XG5cbiAgLy8gaWYgdGhlcmUncyBubyByb29tIGluIHRoZSBjdXJyZW50IHRleHR1cmUsIHdlIG5lZWQgYSBuZXcgb25lXG4gIGlmICh0eHIud2lkdGggLSB0eHIudXNlZFdpZHRoIDwgZWxlU2NhbGVkVykge1xuICAgIHR4ciA9IGFkZE5ld1R4cigpO1xuICB9XG4gIHZhciBzY2FsYWJsZUZyb20gPSBmdW5jdGlvbiBzY2FsYWJsZUZyb20ob3RoZXJDYWNoZSkge1xuICAgIHJldHVybiBvdGhlckNhY2hlICYmIG90aGVyQ2FjaGUuc2NhbGVkTGFiZWxTaG93biA9PT0gc2NhbGVkTGFiZWxTaG93bjtcbiAgfTtcbiAgdmFyIGRlcWluZyA9IHJlYXNvbiAmJiByZWFzb24gPT09IGdldFR4clJlYXNvbnMuZGVxdWV1ZTtcbiAgdmFyIGhpZ2hRdWFsaXR5UmVxID0gcmVhc29uICYmIHJlYXNvbiA9PT0gZ2V0VHhyUmVhc29ucy5oaWdoUXVhbGl0eTtcbiAgdmFyIGRvd25zY2FsZVJlcSA9IHJlYXNvbiAmJiByZWFzb24gPT09IGdldFR4clJlYXNvbnMuZG93bnNjYWxlO1xuICB2YXIgaGlnaGVyQ2FjaGU7IC8vIHRoZSBuZWFyZXN0IGNhY2hlIHdpdGggYSBoaWdoZXIgbGV2ZWxcbiAgZm9yICh2YXIgbCA9IGx2bCArIDE7IGwgPD0gbWF4THZsJDE7IGwrKykge1xuICAgIHZhciBjID0gbG9va3VwLmdldChlbGUsIGwpO1xuICAgIGlmIChjKSB7XG4gICAgICBoaWdoZXJDYWNoZSA9IGM7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdmFyIG9uZVVwQ2FjaGUgPSBoaWdoZXJDYWNoZSAmJiBoaWdoZXJDYWNoZS5sZXZlbCA9PT0gbHZsICsgMSA/IGhpZ2hlckNhY2hlIDogbnVsbDtcbiAgdmFyIGRvd25zY2FsZSA9IGZ1bmN0aW9uIGRvd25zY2FsZSgpIHtcbiAgICB0eHIuY29udGV4dC5kcmF3SW1hZ2Uob25lVXBDYWNoZS50ZXh0dXJlLmNhbnZhcywgb25lVXBDYWNoZS54LCAwLCBvbmVVcENhY2hlLndpZHRoLCBvbmVVcENhY2hlLmhlaWdodCwgdHhyLnVzZWRXaWR0aCwgMCwgZWxlU2NhbGVkVywgZWxlU2NhbGVkSCk7XG4gIH07XG5cbiAgLy8gcmVzZXQgZWxlIGFyZWEgaW4gdGV4dHVyZVxuICB0eHIuY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gIHR4ci5jb250ZXh0LmNsZWFyUmVjdCh0eHIudXNlZFdpZHRoLCAwLCBlbGVTY2FsZWRXLCB0eHJIKTtcbiAgaWYgKHNjYWxhYmxlRnJvbShvbmVVcENhY2hlKSkge1xuICAgIC8vIHRoZW4gd2UgY2FuIHJlbGF0aXZlbHkgY2hlYXBseSByZXNjYWxlIHRoZSBleGlzdGluZyBpbWFnZSB3L28gcmVyZW5kZXJpbmdcbiAgICBkb3duc2NhbGUoKTtcbiAgfSBlbHNlIGlmIChzY2FsYWJsZUZyb20oaGlnaGVyQ2FjaGUpKSB7XG4gICAgLy8gdGhlbiB1c2UgdGhlIGhpZ2hlciBjYWNoZSBmb3Igbm93IGFuZCBxdWV1ZSB0aGUgbmV4dCBsZXZlbCBkb3duXG4gICAgLy8gdG8gY2hlYXBseSBzY2FsZSB0b3dhcmRzIHRoZSBzbWFsbGVyIGxldmVsXG5cbiAgICBpZiAoaGlnaFF1YWxpdHlSZXEpIHtcbiAgICAgIGZvciAodmFyIF9sID0gaGlnaGVyQ2FjaGUubGV2ZWw7IF9sID4gbHZsOyBfbC0tKSB7XG4gICAgICAgIG9uZVVwQ2FjaGUgPSBzZWxmLmdldEVsZW1lbnQoZWxlLCBiYiwgcHhSYXRpbywgX2wsIGdldFR4clJlYXNvbnMuZG93bnNjYWxlKTtcbiAgICAgIH1cbiAgICAgIGRvd25zY2FsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnF1ZXVlRWxlbWVudChlbGUsIGhpZ2hlckNhY2hlLmxldmVsIC0gMSk7XG4gICAgICByZXR1cm4gaGlnaGVyQ2FjaGU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBsb3dlckNhY2hlOyAvLyB0aGUgbmVhcmVzdCBjYWNoZSB3aXRoIGEgbG93ZXIgbGV2ZWxcbiAgICBpZiAoIWRlcWluZyAmJiAhaGlnaFF1YWxpdHlSZXEgJiYgIWRvd25zY2FsZVJlcSkge1xuICAgICAgZm9yICh2YXIgX2wyID0gbHZsIC0gMTsgX2wyID49IG1pbkx2bCQxOyBfbDItLSkge1xuICAgICAgICB2YXIgX2MgPSBsb29rdXAuZ2V0KGVsZSwgX2wyKTtcbiAgICAgICAgaWYgKF9jKSB7XG4gICAgICAgICAgbG93ZXJDYWNoZSA9IF9jO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzY2FsYWJsZUZyb20obG93ZXJDYWNoZSkpIHtcbiAgICAgIC8vIHRoZW4gdXNlIHRoZSBsb3dlciBxdWFsaXR5IGNhY2hlIGZvciBub3cgYW5kIHF1ZXVlIHRoZSBiZXR0ZXIgb25lIGZvciBsYXRlclxuXG4gICAgICBzZWxmLnF1ZXVlRWxlbWVudChlbGUsIGx2bCk7XG4gICAgICByZXR1cm4gbG93ZXJDYWNoZTtcbiAgICB9XG4gICAgdHhyLmNvbnRleHQudHJhbnNsYXRlKHR4ci51c2VkV2lkdGgsIDApO1xuICAgIHR4ci5jb250ZXh0LnNjYWxlKHNjYWxlLCBzY2FsZSk7XG4gICAgdGhpcy5kcmF3RWxlbWVudCh0eHIuY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgZmFsc2UpO1xuICAgIHR4ci5jb250ZXh0LnNjYWxlKDEgLyBzY2FsZSwgMSAvIHNjYWxlKTtcbiAgICB0eHIuY29udGV4dC50cmFuc2xhdGUoLXR4ci51c2VkV2lkdGgsIDApO1xuICB9XG4gIGVsZUNhY2hlID0ge1xuICAgIHg6IHR4ci51c2VkV2lkdGgsXG4gICAgdGV4dHVyZTogdHhyLFxuICAgIGxldmVsOiBsdmwsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIHdpZHRoOiBlbGVTY2FsZWRXLFxuICAgIGhlaWdodDogZWxlU2NhbGVkSCxcbiAgICBzY2FsZWRMYWJlbFNob3duOiBzY2FsZWRMYWJlbFNob3duXG4gIH07XG4gIHR4ci51c2VkV2lkdGggKz0gTWF0aC5jZWlsKGVsZVNjYWxlZFcgKyBlbGVUeHJTcGFjaW5nKTtcbiAgdHhyLmVsZUNhY2hlcy5wdXNoKGVsZUNhY2hlKTtcbiAgbG9va3VwLnNldChlbGUsIGx2bCwgZWxlQ2FjaGUpO1xuICBzZWxmLmNoZWNrVGV4dHVyZUZ1bGxuZXNzKHR4cik7XG4gIHJldHVybiBlbGVDYWNoZTtcbn07XG5FVENwLmludmFsaWRhdGVFbGVtZW50cyA9IGZ1bmN0aW9uIChlbGVzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMuaW52YWxpZGF0ZUVsZW1lbnQoZWxlc1tpXSk7XG4gIH1cbn07XG5FVENwLmludmFsaWRhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBsb29rdXAgPSBzZWxmLmxvb2t1cDtcbiAgdmFyIGNhY2hlcyA9IFtdO1xuICB2YXIgaW52YWxpZCA9IGxvb2t1cC5pc0ludmFsaWQoZWxlKTtcbiAgaWYgKCFpbnZhbGlkKSB7XG4gICAgcmV0dXJuOyAvLyBvdmVycmlkZSB0aGUgaW52YWxpZGF0aW9uIHJlcXVlc3QgaWYgdGhlIGVsZW1lbnQga2V5IGhhcyBub3QgY2hhbmdlZFxuICB9XG5cbiAgZm9yICh2YXIgbHZsID0gbWluTHZsJDE7IGx2bCA8PSBtYXhMdmwkMTsgbHZsKyspIHtcbiAgICB2YXIgY2FjaGUgPSBsb29rdXAuZ2V0Rm9yQ2FjaGVkS2V5KGVsZSwgbHZsKTtcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlcy5wdXNoKGNhY2hlKTtcbiAgICB9XG4gIH1cbiAgdmFyIG5vT3RoZXJFbGVzVXNlQ2FjaGUgPSBsb29rdXAuaW52YWxpZGF0ZShlbGUpO1xuICBpZiAobm9PdGhlckVsZXNVc2VDYWNoZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgX2NhY2hlID0gY2FjaGVzW2ldO1xuICAgICAgdmFyIHR4ciA9IF9jYWNoZS50ZXh0dXJlO1xuXG4gICAgICAvLyByZW1vdmUgc3BhY2UgZnJvbSB0aGUgdGV4dHVyZSBpdCBiZWxvbmdzIHRvXG4gICAgICB0eHIuaW52YWxpZGF0ZWRXaWR0aCArPSBfY2FjaGUud2lkdGg7XG5cbiAgICAgIC8vIG1hcmsgdGhlIGNhY2hlIGFzIGludmFsaWRhdGVkXG4gICAgICBfY2FjaGUuaW52YWxpZGF0ZWQgPSB0cnVlO1xuXG4gICAgICAvLyByZXRpcmUgdGhlIHRleHR1cmUgaWYgaXRzIHV0aWxpdHkgaXMgbG93XG4gICAgICBzZWxmLmNoZWNrVGV4dHVyZVV0aWxpdHkodHhyKTtcbiAgICB9XG4gIH1cblxuICAvLyByZW1vdmUgZnJvbSBxdWV1ZSBzaW5jZSB0aGUgb2xkIHJlcSB3YXMgZm9yIHRoZSBvbGQgc3RhdGVcbiAgc2VsZi5yZW1vdmVGcm9tUXVldWUoZWxlKTtcbn07XG5FVENwLmNoZWNrVGV4dHVyZVV0aWxpdHkgPSBmdW5jdGlvbiAodHhyKSB7XG4gIC8vIGludmFsaWRhdGUgYWxsIGVudHJpZXMgaW4gdGhlIGNhY2hlIGlmIHRoZSBjYWNoZSBzaXplIGlzIHNtYWxsXG4gIGlmICh0eHIuaW52YWxpZGF0ZWRXaWR0aCA+PSBtaW5VdGlsaXR5ICogdHhyLndpZHRoKSB7XG4gICAgdGhpcy5yZXRpcmVUZXh0dXJlKHR4cik7XG4gIH1cbn07XG5FVENwLmNoZWNrVGV4dHVyZUZ1bGxuZXNzID0gZnVuY3Rpb24gKHR4cikge1xuICAvLyBpZiB0ZXh0dXJlIGhhcyBiZWVuIG1vc3RseSBmaWxsZWQgYW5kIHBhc3NlZCBvdmVyIHNldmVyYWwgdGltZXMsIHJlbW92ZVxuICAvLyBpdCBmcm9tIHRoZSBxdWV1ZSBzbyB3ZSBkb24ndCBuZWVkIHRvIHdhc3RlIHRpbWUgbG9va2luZyBhdCBpdCB0byBwdXQgbmV3IHRoaW5nc1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHR4clEgPSBzZWxmLmdldFRleHR1cmVRdWV1ZSh0eHIuaGVpZ2h0KTtcbiAgaWYgKHR4ci51c2VkV2lkdGggLyB0eHIud2lkdGggPiBtYXhGdWxsbmVzcyAmJiB0eHIuZnVsbG5lc3NDaGVja3MgPj0gbWF4RnVsbG5lc3NDaGVja3MpIHtcbiAgICByZW1vdmVGcm9tQXJyYXkodHhyUSwgdHhyKTtcbiAgfSBlbHNlIHtcbiAgICB0eHIuZnVsbG5lc3NDaGVja3MrKztcbiAgfVxufTtcbkVUQ3AucmV0aXJlVGV4dHVyZSA9IGZ1bmN0aW9uICh0eHIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgdHhySCA9IHR4ci5oZWlnaHQ7XG4gIHZhciB0eHJRID0gc2VsZi5nZXRUZXh0dXJlUXVldWUodHhySCk7XG4gIHZhciBsb29rdXAgPSB0aGlzLmxvb2t1cDtcblxuICAvLyByZXRpcmUgdGhlIHRleHR1cmUgZnJvbSB0aGUgYWN0aXZlIC8gc2VhcmNoYWJsZSBxdWV1ZTpcblxuICByZW1vdmVGcm9tQXJyYXkodHhyUSwgdHhyKTtcbiAgdHhyLnJldGlyZWQgPSB0cnVlO1xuXG4gIC8vIHJlbW92ZSB0aGUgcmVmcyBmcm9tIHRoZSBlbGVzIHRvIHRoZSBjYWNoZXM6XG5cbiAgdmFyIGVsZUNhY2hlcyA9IHR4ci5lbGVDYWNoZXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlQ2FjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZUNhY2hlID0gZWxlQ2FjaGVzW2ldO1xuICAgIGxvb2t1cC5kZWxldGVDYWNoZShlbGVDYWNoZS5rZXksIGVsZUNhY2hlLmxldmVsKTtcbiAgfVxuICBjbGVhckFycmF5KGVsZUNhY2hlcyk7XG5cbiAgLy8gYWRkIHRoZSB0ZXh0dXJlIHRvIGEgcmV0aXJlZCBxdWV1ZSBzbyBpdCBjYW4gYmUgcmVjeWNsZWQgaW4gZnV0dXJlOlxuXG4gIHZhciBydHh0clEgPSBzZWxmLmdldFJldGlyZWRUZXh0dXJlUXVldWUodHhySCk7XG4gIHJ0eHRyUS5wdXNoKHR4cik7XG59O1xuRVRDcC5hZGRUZXh0dXJlID0gZnVuY3Rpb24gKHR4ckgsIG1pblcpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgdHhyUSA9IHNlbGYuZ2V0VGV4dHVyZVF1ZXVlKHR4ckgpO1xuICB2YXIgdHhyID0ge307XG4gIHR4clEucHVzaCh0eHIpO1xuICB0eHIuZWxlQ2FjaGVzID0gW107XG4gIHR4ci5oZWlnaHQgPSB0eHJIO1xuICB0eHIud2lkdGggPSBNYXRoLm1heChkZWZUeHJXaWR0aCwgbWluVyk7XG4gIHR4ci51c2VkV2lkdGggPSAwO1xuICB0eHIuaW52YWxpZGF0ZWRXaWR0aCA9IDA7XG4gIHR4ci5mdWxsbmVzc0NoZWNrcyA9IDA7XG4gIHR4ci5jYW52YXMgPSBzZWxmLnJlbmRlcmVyLm1ha2VPZmZzY3JlZW5DYW52YXModHhyLndpZHRoLCB0eHIuaGVpZ2h0KTtcbiAgdHhyLmNvbnRleHQgPSB0eHIuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gIHJldHVybiB0eHI7XG59O1xuRVRDcC5yZWN5Y2xlVGV4dHVyZSA9IGZ1bmN0aW9uICh0eHJILCBtaW5XKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHR4clEgPSBzZWxmLmdldFRleHR1cmVRdWV1ZSh0eHJIKTtcbiAgdmFyIHJ0eHRyUSA9IHNlbGYuZ2V0UmV0aXJlZFRleHR1cmVRdWV1ZSh0eHJIKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBydHh0clEubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdHhyID0gcnR4dHJRW2ldO1xuICAgIGlmICh0eHIud2lkdGggPj0gbWluVykge1xuICAgICAgdHhyLnJldGlyZWQgPSBmYWxzZTtcbiAgICAgIHR4ci51c2VkV2lkdGggPSAwO1xuICAgICAgdHhyLmludmFsaWRhdGVkV2lkdGggPSAwO1xuICAgICAgdHhyLmZ1bGxuZXNzQ2hlY2tzID0gMDtcbiAgICAgIGNsZWFyQXJyYXkodHhyLmVsZUNhY2hlcyk7XG4gICAgICB0eHIuY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICB0eHIuY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdHhyLndpZHRoLCB0eHIuaGVpZ2h0KTtcbiAgICAgIHJlbW92ZUZyb21BcnJheShydHh0clEsIHR4cik7XG4gICAgICB0eHJRLnB1c2godHhyKTtcbiAgICAgIHJldHVybiB0eHI7XG4gICAgfVxuICB9XG59O1xuRVRDcC5xdWV1ZUVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlLCBsdmwpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcSA9IHNlbGYuZ2V0RWxlbWVudFF1ZXVlKCk7XG4gIHZhciBrMnEgPSBzZWxmLmdldEVsZW1lbnRLZXlUb1F1ZXVlKCk7XG4gIHZhciBrZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICB2YXIgZXhpc3RpbmdSZXEgPSBrMnFba2V5XTtcbiAgaWYgKGV4aXN0aW5nUmVxKSB7XG4gICAgLy8gdXNlIHRoZSBtYXggbHZsIGIvYyBpbiBiZXR3ZWVuIGx2bHMgYXJlIGNoZWFwIHRvIG1ha2VcbiAgICBleGlzdGluZ1JlcS5sZXZlbCA9IE1hdGgubWF4KGV4aXN0aW5nUmVxLmxldmVsLCBsdmwpO1xuICAgIGV4aXN0aW5nUmVxLmVsZXMubWVyZ2UoZWxlKTtcbiAgICBleGlzdGluZ1JlcS5yZXFzKys7XG4gICAgcS51cGRhdGVJdGVtKGV4aXN0aW5nUmVxKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcmVxID0ge1xuICAgICAgZWxlczogZWxlLnNwYXduKCkubWVyZ2UoZWxlKSxcbiAgICAgIGxldmVsOiBsdmwsXG4gICAgICByZXFzOiAxLFxuICAgICAga2V5OiBrZXlcbiAgICB9O1xuICAgIHEucHVzaChyZXEpO1xuICAgIGsycVtrZXldID0gcmVxO1xuICB9XG59O1xuRVRDcC5kZXF1ZXVlID0gZnVuY3Rpb24gKHB4UmF0aW8gLyosIGV4dGVudCovKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHEgPSBzZWxmLmdldEVsZW1lbnRRdWV1ZSgpO1xuICB2YXIgazJxID0gc2VsZi5nZXRFbGVtZW50S2V5VG9RdWV1ZSgpO1xuICB2YXIgZGVxdWV1ZWQgPSBbXTtcbiAgdmFyIGxvb2t1cCA9IHNlbGYubG9va3VwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1heERlcVNpemUkMTsgaSsrKSB7XG4gICAgaWYgKHEuc2l6ZSgpID4gMCkge1xuICAgICAgdmFyIHJlcSA9IHEucG9wKCk7XG4gICAgICB2YXIga2V5ID0gcmVxLmtleTtcbiAgICAgIHZhciBlbGUgPSByZXEuZWxlc1swXTsgLy8gYWxsIGVsZXMgaGF2ZSB0aGUgc2FtZSBrZXlcbiAgICAgIHZhciBjYWNoZUV4aXN0cyA9IGxvb2t1cC5oYXNDYWNoZShlbGUsIHJlcS5sZXZlbCk7XG5cbiAgICAgIC8vIGNsZWFyIG91dCB0aGUga2V5IHRvIHJlcSBsb29rdXBcbiAgICAgIGsycVtrZXldID0gbnVsbDtcblxuICAgICAgLy8gZGVxdWV1ZWluZyBpc24ndCBuZWNlc3Nhcnkgd2l0aCBhbiBleGlzdGluZyBjYWNoZVxuICAgICAgaWYgKGNhY2hlRXhpc3RzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZGVxdWV1ZWQucHVzaChyZXEpO1xuICAgICAgdmFyIGJiID0gc2VsZi5nZXRCb3VuZGluZ0JveChlbGUpO1xuICAgICAgc2VsZi5nZXRFbGVtZW50KGVsZSwgYmIsIHB4UmF0aW8sIHJlcS5sZXZlbCwgZ2V0VHhyUmVhc29ucy5kZXF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXF1ZXVlZDtcbn07XG5FVENwLnJlbW92ZUZyb21RdWV1ZSA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcSA9IHNlbGYuZ2V0RWxlbWVudFF1ZXVlKCk7XG4gIHZhciBrMnEgPSBzZWxmLmdldEVsZW1lbnRLZXlUb1F1ZXVlKCk7XG4gIHZhciBrZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICB2YXIgcmVxID0gazJxW2tleV07XG4gIGlmIChyZXEgIT0gbnVsbCkge1xuICAgIGlmIChyZXEuZWxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIHJlbW92ZSBpZiBsYXN0IGVsZSBpbiB0aGUgcmVxXG4gICAgICAvLyBicmluZyB0byBmcm9udCBvZiBxdWV1ZVxuICAgICAgcmVxLnJlcXMgPSBNQVhfSU5UJDE7XG4gICAgICBxLnVwZGF0ZUl0ZW0ocmVxKTtcbiAgICAgIHEucG9wKCk7IC8vIHJlbW92ZSBmcm9tIHF1ZXVlXG5cbiAgICAgIGsycVtrZXldID0gbnVsbDsgLy8gcmVtb3ZlIGZyb20gbG9va3VwIG1hcFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2UganVzdCByZW1vdmUgZWxlIGZyb20gcmVxXG4gICAgICByZXEuZWxlcy51bm1lcmdlKGVsZSk7XG4gICAgfVxuICB9XG59O1xuRVRDcC5vbkRlcXVldWUgPSBmdW5jdGlvbiAoZm4pIHtcbiAgdGhpcy5vbkRlcXVldWVzLnB1c2goZm4pO1xufTtcbkVUQ3Aub2ZmRGVxdWV1ZSA9IGZ1bmN0aW9uIChmbikge1xuICByZW1vdmVGcm9tQXJyYXkodGhpcy5vbkRlcXVldWVzLCBmbik7XG59O1xuRVRDcC5zZXR1cERlcXVldWVpbmcgPSBkZWZzLnNldHVwRGVxdWV1ZWluZyh7XG4gIGRlcVJlZHJhd1RocmVzaG9sZDogZGVxUmVkcmF3VGhyZXNob2xkJDEsXG4gIGRlcUNvc3Q6IGRlcUNvc3QkMSxcbiAgZGVxQXZnQ29zdDogZGVxQXZnQ29zdCQxLFxuICBkZXFOb0RyYXdDb3N0OiBkZXFOb0RyYXdDb3N0JDEsXG4gIGRlcUZhc3RDb3N0OiBkZXFGYXN0Q29zdCQxLFxuICBkZXE6IGZ1bmN0aW9uIGRlcShzZWxmLCBweFJhdGlvLCBleHRlbnQpIHtcbiAgICByZXR1cm4gc2VsZi5kZXF1ZXVlKHB4UmF0aW8sIGV4dGVudCk7XG4gIH0sXG4gIG9uRGVxZDogZnVuY3Rpb24gb25EZXFkKHNlbGYsIGRlcWQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYub25EZXF1ZXVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGZuID0gc2VsZi5vbkRlcXVldWVzW2ldO1xuICAgICAgZm4oZGVxZCk7XG4gICAgfVxuICB9LFxuICBzaG91bGRSZWRyYXc6IGZ1bmN0aW9uIHNob3VsZFJlZHJhdyhzZWxmLCBkZXFkLCBweFJhdGlvLCBleHRlbnQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGVzID0gZGVxZFtpXS5lbGVzO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlbGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBiYiA9IGVsZXNbal0uYm91bmRpbmdCb3goKTtcbiAgICAgICAgaWYgKGJvdW5kaW5nQm94ZXNJbnRlcnNlY3QoYmIsIGV4dGVudCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIHByaW9yaXR5OiBmdW5jdGlvbiBwcmlvcml0eShzZWxmKSB7XG4gICAgcmV0dXJuIHNlbGYucmVuZGVyZXIuYmVmb3JlUmVuZGVyUHJpb3JpdGllcy5lbGVUeHJEZXE7XG4gIH1cbn0pO1xuXG52YXIgZGVmTnVtTGF5ZXJzID0gMTsgLy8gZGVmYXVsdCBudW1iZXIgb2YgbGF5ZXJzIHRvIHVzZVxudmFyIG1pbkx2bCA9IC00OyAvLyB3aGVuIHNjYWxpbmcgc21hbGxlciB0aGFuIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byByZS1yZW5kZXJcbnZhciBtYXhMdmwgPSAyOyAvLyB3aGVuIGxhcmdlciB0aGFuIHRoaXMgc2NhbGUganVzdCByZW5kZXIgZGlyZWN0bHkgKGNhY2hpbmcgaXMgbm90IGhlbHBmdWwpXG52YXIgbWF4Wm9vbSA9IDMuOTk7IC8vIGJleW9uZCB0aGlzIHpvb20gbGV2ZWwsIGxheWVyZWQgdGV4dHVyZXMgYXJlIG5vdCB1c2VkXG52YXIgZGVxUmVkcmF3VGhyZXNob2xkID0gNTA7IC8vIHRpbWUgdG8gYmF0Y2ggcmVkcmF3cyB0b2dldGhlciBmcm9tIGRlcXVldWVpbmcgdG8gYWxsb3cgbW9yZSBkZXF1ZXVlaW5nIGNhbGNzIHRvIGhhcHBlbiBpbiB0aGUgbWVhbndoaWxlXG52YXIgcmVmaW5lRWxlRGVib3VuY2VUaW1lID0gNTA7IC8vIHRpbWUgdG8gZGVib3VuY2Ugc2hhcnBlciBlbGUgdGV4dHVyZSB1cGRhdGVzXG52YXIgZGVxQ29zdCA9IDAuMTU7IC8vICUgb2YgYWRkJ2wgcmVuZGVyaW5nIGNvc3QgYWxsb3dlZCBmb3IgZGVxdWV1aW5nIGVsZSBjYWNoZXMgZWFjaCBmcmFtZVxudmFyIGRlcUF2Z0Nvc3QgPSAwLjE7IC8vICUgb2YgYWRkJ2wgcmVuZGVyaW5nIGNvc3QgY29tcGFyZWQgdG8gYXZlcmFnZSBvdmVyYWxsIHJlZHJhdyB0aW1lXG52YXIgZGVxTm9EcmF3Q29zdCA9IDAuOTsgLy8gJSBvZiBhdmcgZnJhbWUgdGltZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBkZXF1ZXVlaW5nIHdoZW4gbm90IGRyYXdpbmdcbnZhciBkZXFGYXN0Q29zdCA9IDAuOTsgLy8gJSBvZiBmcmFtZSB0aW1lIHRvIGJlIHVzZWQgd2hlbiA+NjBmcHNcbnZhciBtYXhEZXFTaXplID0gMTsgLy8gbnVtYmVyIG9mIGVsZXMgdG8gZGVxdWV1ZSBhbmQgcmVuZGVyIGF0IGhpZ2hlciB0ZXh0dXJlIGluIGVhY2ggYmF0Y2hcbnZhciBpbnZhbGlkVGhyZXNob2xkID0gMjUwOyAvLyB0aW1lIHRocmVzaG9sZCBmb3IgZGlzYWJsaW5nIGIvYyBvZiBpbnZhbGlkYXRpb25zXG52YXIgbWF4TGF5ZXJBcmVhID0gNDAwMCAqIDQwMDA7IC8vIGxheWVycyBjYW4ndCBiZSBiaWdnZXIgdGhhbiB0aGlzXG52YXIgdXNlSGlnaFF1YWxpdHlFbGVUeHJSZXFzID0gdHJ1ZTsgLy8gd2hldGhlciB0byB1c2UgaGlnaCBxdWFsaXR5IGVsZSB0eHIgcmVxdWVzdHMgKGdlbmVyYWxseSBmYXN0ZXIgYW5kIGNoZWFwZXIgaW4gdGhlIGxvbmd0ZXJtKVxuXG4vLyB2YXIgbG9nID0gZnVuY3Rpb24oKXsgY29uc29sZS5sb2cuYXBwbHkoIGNvbnNvbGUsIGFyZ3VtZW50cyApOyB9O1xuXG52YXIgTGF5ZXJlZFRleHR1cmVDYWNoZSA9IGZ1bmN0aW9uIExheWVyZWRUZXh0dXJlQ2FjaGUocmVuZGVyZXIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgciA9IHNlbGYucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgdmFyIGN5ID0gci5jeTtcbiAgc2VsZi5sYXllcnNCeUxldmVsID0ge307IC8vIGUuZy4gMiA9PiBbIGxheWVyMSwgbGF5ZXIyLCAuLi4sIGxheWVyTiBdXG5cbiAgc2VsZi5maXJzdEdldCA9IHRydWU7XG4gIHNlbGYubGFzdEludmFsaWRhdGlvblRpbWUgPSBwZXJmb3JtYW5jZU5vdygpIC0gMiAqIGludmFsaWRUaHJlc2hvbGQ7XG4gIHNlbGYuc2tpcHBpbmcgPSBmYWxzZTtcbiAgc2VsZi5lbGVUeHJEZXFzID0gY3kuY29sbGVjdGlvbigpO1xuICBzZWxmLnNjaGVkdWxlRWxlbWVudFJlZmluZW1lbnQgPSBkZWJvdW5jZV8xKGZ1bmN0aW9uICgpIHtcbiAgICBzZWxmLnJlZmluZUVsZW1lbnRUZXh0dXJlcyhzZWxmLmVsZVR4ckRlcXMpO1xuICAgIHNlbGYuZWxlVHhyRGVxcy51bm1lcmdlKHNlbGYuZWxlVHhyRGVxcyk7XG4gIH0sIHJlZmluZUVsZURlYm91bmNlVGltZSk7XG4gIHIuYmVmb3JlUmVuZGVyKGZ1bmN0aW9uICh3aWxsRHJhdywgbm93KSB7XG4gICAgaWYgKG5vdyAtIHNlbGYubGFzdEludmFsaWRhdGlvblRpbWUgPD0gaW52YWxpZFRocmVzaG9sZCkge1xuICAgICAgc2VsZi5za2lwcGluZyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuc2tpcHBpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH0sIHIuYmVmb3JlUmVuZGVyUHJpb3JpdGllcy5seXJUeHJTa2lwKTtcbiAgdmFyIHFTb3J0ID0gZnVuY3Rpb24gcVNvcnQoYSwgYikge1xuICAgIHJldHVybiBiLnJlcXMgLSBhLnJlcXM7XG4gIH07XG4gIHNlbGYubGF5ZXJzUXVldWUgPSBuZXcgaGVhcChxU29ydCk7XG4gIHNlbGYuc2V0dXBEZXF1ZXVlaW5nKCk7XG59O1xudmFyIExUQ3AgPSBMYXllcmVkVGV4dHVyZUNhY2hlLnByb3RvdHlwZTtcbnZhciBsYXllcklkUG9vbCA9IDA7XG52YXIgTUFYX0lOVCA9IE1hdGgucG93KDIsIDUzKSAtIDE7XG5MVENwLm1ha2VMYXllciA9IGZ1bmN0aW9uIChiYiwgbHZsKSB7XG4gIHZhciBzY2FsZSA9IE1hdGgucG93KDIsIGx2bCk7XG4gIHZhciB3ID0gTWF0aC5jZWlsKGJiLncgKiBzY2FsZSk7XG4gIHZhciBoID0gTWF0aC5jZWlsKGJiLmggKiBzY2FsZSk7XG4gIHZhciBjYW52YXMgPSB0aGlzLnJlbmRlcmVyLm1ha2VPZmZzY3JlZW5DYW52YXModywgaCk7XG4gIHZhciBsYXllciA9IHtcbiAgICBpZDogbGF5ZXJJZFBvb2wgPSArK2xheWVySWRQb29sICUgTUFYX0lOVCxcbiAgICBiYjogYmIsXG4gICAgbGV2ZWw6IGx2bCxcbiAgICB3aWR0aDogdyxcbiAgICBoZWlnaHQ6IGgsXG4gICAgY2FudmFzOiBjYW52YXMsXG4gICAgY29udGV4dDogY2FudmFzLmdldENvbnRleHQoJzJkJyksXG4gICAgZWxlczogW10sXG4gICAgZWxlc1F1ZXVlOiBbXSxcbiAgICByZXFzOiAwXG4gIH07XG5cbiAgLy8gbG9nKCdtYWtlIGxheWVyICVzIHdpdGggdyAlcyBhbmQgaCAlcyBhbmQgbHZsICVzJywgbGF5ZXIuaWQsIGxheWVyLndpZHRoLCBsYXllci5oZWlnaHQsIGxheWVyLmxldmVsKTtcblxuICB2YXIgY3h0ID0gbGF5ZXIuY29udGV4dDtcbiAgdmFyIGR4ID0gLWxheWVyLmJiLngxO1xuICB2YXIgZHkgPSAtbGF5ZXIuYmIueTE7XG5cbiAgLy8gZG8gdGhlIHRyYW5zZm9ybSBvbiBjcmVhdGlvbiB0byBzYXZlIGN5Y2xlcyAoaXQncyB0aGUgc2FtZSBmb3IgYWxsIGVsZXMpXG4gIGN4dC5zY2FsZShzY2FsZSwgc2NhbGUpO1xuICBjeHQudHJhbnNsYXRlKGR4LCBkeSk7XG4gIHJldHVybiBsYXllcjtcbn07XG5MVENwLmdldExheWVycyA9IGZ1bmN0aW9uIChlbGVzLCBweFJhdGlvLCBsdmwpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgciA9IHNlbGYucmVuZGVyZXI7XG4gIHZhciBjeSA9IHIuY3k7XG4gIHZhciB6b29tID0gY3kuem9vbSgpO1xuICB2YXIgZmlyc3RHZXQgPSBzZWxmLmZpcnN0R2V0O1xuICBzZWxmLmZpcnN0R2V0ID0gZmFsc2U7XG5cbiAgLy8gbG9nKCctLVxcbmdldCBsYXllcnMgd2l0aCAlcyBlbGVzJywgZWxlcy5sZW5ndGgpO1xuICAvL2xvZyBlbGVzLm1hcChmdW5jdGlvbihlbGUpeyByZXR1cm4gZWxlLmlkKCkgfSkgKTtcblxuICBpZiAobHZsID09IG51bGwpIHtcbiAgICBsdmwgPSBNYXRoLmNlaWwobG9nMih6b29tICogcHhSYXRpbykpO1xuICAgIGlmIChsdmwgPCBtaW5MdmwpIHtcbiAgICAgIGx2bCA9IG1pbkx2bDtcbiAgICB9IGVsc2UgaWYgKHpvb20gPj0gbWF4Wm9vbSB8fCBsdmwgPiBtYXhMdmwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBzZWxmLnZhbGlkYXRlTGF5ZXJzRWxlc09yZGVyaW5nKGx2bCwgZWxlcyk7XG4gIHZhciBsYXllcnNCeUx2bCA9IHNlbGYubGF5ZXJzQnlMZXZlbDtcbiAgdmFyIHNjYWxlID0gTWF0aC5wb3coMiwgbHZsKTtcbiAgdmFyIGxheWVycyA9IGxheWVyc0J5THZsW2x2bF0gPSBsYXllcnNCeUx2bFtsdmxdIHx8IFtdO1xuICB2YXIgYmI7XG4gIHZhciBsdmxDb21wbGV0ZSA9IHNlbGYubGV2ZWxJc0NvbXBsZXRlKGx2bCwgZWxlcyk7XG4gIHZhciB0bXBMYXllcnM7XG4gIHZhciBjaGVja1RlbXBMZXZlbHMgPSBmdW5jdGlvbiBjaGVja1RlbXBMZXZlbHMoKSB7XG4gICAgdmFyIGNhblVzZUFzVG1wTHZsID0gZnVuY3Rpb24gY2FuVXNlQXNUbXBMdmwobCkge1xuICAgICAgc2VsZi52YWxpZGF0ZUxheWVyc0VsZXNPcmRlcmluZyhsLCBlbGVzKTtcbiAgICAgIGlmIChzZWxmLmxldmVsSXNDb21wbGV0ZShsLCBlbGVzKSkge1xuICAgICAgICB0bXBMYXllcnMgPSBsYXllcnNCeUx2bFtsXTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgY2hlY2tMdmxzID0gZnVuY3Rpb24gY2hlY2tMdmxzKGRpcikge1xuICAgICAgaWYgKHRtcExheWVycykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBsID0gbHZsICsgZGlyOyBtaW5MdmwgPD0gbCAmJiBsIDw9IG1heEx2bDsgbCArPSBkaXIpIHtcbiAgICAgICAgaWYgKGNhblVzZUFzVG1wTHZsKGwpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGNoZWNrTHZscygrMSk7XG4gICAgY2hlY2tMdmxzKC0xKTtcblxuICAgIC8vIHJlbW92ZSB0aGUgaW52YWxpZCBsYXllcnM7IHRoZXkgd2lsbCBiZSByZXBsYWNlZCBhcyBuZWVkZWQgbGF0ZXIgaW4gdGhpcyBmdW5jdGlvblxuICAgIGZvciAodmFyIGkgPSBsYXllcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBsYXllciA9IGxheWVyc1tpXTtcbiAgICAgIGlmIChsYXllci5pbnZhbGlkKSB7XG4gICAgICAgIHJlbW92ZUZyb21BcnJheShsYXllcnMsIGxheWVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGlmICghbHZsQ29tcGxldGUpIHtcbiAgICAvLyBpZiB0aGUgY3VycmVudCBsZXZlbCBpcyBpbmNvbXBsZXRlLCB0aGVuIHVzZSB0aGUgY2xvc2VzdCwgYmVzdCBxdWFsaXR5IGxheWVyc2V0IHRlbXBvcmFyaWx5XG4gICAgLy8gYW5kIGxhdGVyIHF1ZXVlIHRoZSBjdXJyZW50IGxheWVyc2V0IHNvIHdlIGNhbiBnZXQgdGhlIHByb3BlciBxdWFsaXR5IGxldmVsIHNvb25cblxuICAgIGNoZWNrVGVtcExldmVscygpO1xuICB9IGVsc2Uge1xuICAgIC8vIGxvZygnbGV2ZWwgY29tcGxldGUsIHVzaW5nIGV4aXN0aW5nIGxheWVyc1xcbi0tJyk7XG4gICAgcmV0dXJuIGxheWVycztcbiAgfVxuICB2YXIgZ2V0QmIgPSBmdW5jdGlvbiBnZXRCYigpIHtcbiAgICBpZiAoIWJiKSB7XG4gICAgICBiYiA9IG1ha2VCb3VuZGluZ0JveCgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHVwZGF0ZUJvdW5kaW5nQm94KGJiLCBlbGVzW2ldLmJvdW5kaW5nQm94KCkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmI7XG4gIH07XG4gIHZhciBtYWtlTGF5ZXIgPSBmdW5jdGlvbiBtYWtlTGF5ZXIob3B0cykge1xuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIHZhciBhZnRlciA9IG9wdHMuYWZ0ZXI7XG4gICAgZ2V0QmIoKTtcbiAgICB2YXIgYXJlYSA9IGJiLncgKiBzY2FsZSAqIChiYi5oICogc2NhbGUpO1xuICAgIGlmIChhcmVhID4gbWF4TGF5ZXJBcmVhKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIGxheWVyID0gc2VsZi5tYWtlTGF5ZXIoYmIsIGx2bCk7XG4gICAgaWYgKGFmdGVyICE9IG51bGwpIHtcbiAgICAgIHZhciBpbmRleCA9IGxheWVycy5pbmRleE9mKGFmdGVyKSArIDE7XG4gICAgICBsYXllcnMuc3BsaWNlKGluZGV4LCAwLCBsYXllcik7XG4gICAgfSBlbHNlIGlmIChvcHRzLmluc2VydCA9PT0gdW5kZWZpbmVkIHx8IG9wdHMuaW5zZXJ0KSB7XG4gICAgICAvLyBubyBhZnRlciBzcGVjaWZpZWQgPT4gZmlyc3QgbGF5ZXIgbWFkZSBzbyBwdXQgYXQgc3RhcnRcbiAgICAgIGxheWVycy51bnNoaWZ0KGxheWVyKTtcbiAgICB9XG5cbiAgICAvLyBpZiggdG1wTGF5ZXJzICl7XG4gICAgLy9zZWxmLnF1ZXVlTGF5ZXIoIGxheWVyICk7XG4gICAgLy8gfVxuXG4gICAgcmV0dXJuIGxheWVyO1xuICB9O1xuICBpZiAoc2VsZi5za2lwcGluZyAmJiAhZmlyc3RHZXQpIHtcbiAgICAvLyBsb2coJ3NraXAgbGF5ZXJzJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBsb2coJ2RvIGxheWVycycpO1xuXG4gIHZhciBsYXllciA9IG51bGw7XG4gIHZhciBtYXhFbGVzUGVyTGF5ZXIgPSBlbGVzLmxlbmd0aCAvIGRlZk51bUxheWVycztcbiAgdmFyIGFsbG93TGF6eVF1ZXVlaW5nID0gIWZpcnN0R2V0O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICB2YXIgcnMgPSBlbGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgdmFyIGNhY2hlcyA9IHJzLmltZ0xheWVyQ2FjaGVzID0gcnMuaW1nTGF5ZXJDYWNoZXMgfHwge307XG5cbiAgICAvLyBsb2coJ2xvb2sgYXQgZWxlJywgZWxlLmlkKCkpO1xuXG4gICAgdmFyIGV4aXN0aW5nTGF5ZXIgPSBjYWNoZXNbbHZsXTtcbiAgICBpZiAoZXhpc3RpbmdMYXllcikge1xuICAgICAgLy8gcmV1c2UgbGF5ZXIgZm9yIGxhdGVyIGVsZXNcbiAgICAgIC8vIGxvZygncmV1c2UgbGF5ZXIgZm9yJywgZWxlLmlkKCkpO1xuICAgICAgbGF5ZXIgPSBleGlzdGluZ0xheWVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghbGF5ZXIgfHwgbGF5ZXIuZWxlcy5sZW5ndGggPj0gbWF4RWxlc1BlckxheWVyIHx8ICFib3VuZGluZ0JveEluQm91bmRpbmdCb3gobGF5ZXIuYmIsIGVsZS5ib3VuZGluZ0JveCgpKSkge1xuICAgICAgLy8gbG9nKCdtYWtlIG5ldyBsYXllciBmb3IgZWxlICVzJywgZWxlLmlkKCkpO1xuXG4gICAgICBsYXllciA9IG1ha2VMYXllcih7XG4gICAgICAgIGluc2VydDogdHJ1ZSxcbiAgICAgICAgYWZ0ZXI6IGxheWVyXG4gICAgICB9KTtcblxuICAgICAgLy8gaWYgbm93IGxheWVyIGNhbiBiZSBidWlsdCB0aGVuIHdlIGNhbid0IHVzZSBsYXllcnMgYXQgdGhpcyBsZXZlbFxuICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gbG9nKCduZXcgbGF5ZXIgd2l0aCBpZCAlcycsIGxheWVyLmlkKTtcbiAgICB9XG5cbiAgICBpZiAodG1wTGF5ZXJzIHx8IGFsbG93TGF6eVF1ZXVlaW5nKSB7XG4gICAgICAvLyBsb2coJ3F1ZXVlIGVsZSAlcyBpbiBsYXllciAlcycsIGVsZS5pZCgpLCBsYXllci5pZCk7XG4gICAgICBzZWxmLnF1ZXVlTGF5ZXIobGF5ZXIsIGVsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGxvZygnZHJhdyBlbGUgJXMgaW4gbGF5ZXIgJXMnLCBlbGUuaWQoKSwgbGF5ZXIuaWQpO1xuICAgICAgc2VsZi5kcmF3RWxlSW5MYXllcihsYXllciwgZWxlLCBsdmwsIHB4UmF0aW8pO1xuICAgIH1cbiAgICBsYXllci5lbGVzLnB1c2goZWxlKTtcbiAgICBjYWNoZXNbbHZsXSA9IGxheWVyO1xuICB9XG5cbiAgLy8gbG9nKCctLScpO1xuXG4gIGlmICh0bXBMYXllcnMpIHtcbiAgICAvLyB0aGVuIHdlIG9ubHkgcXVldWVkIHRoZSBjdXJyZW50IGxheWVyc2V0IGFuZCBjYW4ndCBkcmF3IGl0IHlldFxuICAgIHJldHVybiB0bXBMYXllcnM7XG4gIH1cbiAgaWYgKGFsbG93TGF6eVF1ZXVlaW5nKSB7XG4gICAgLy8gbG9nKCdsYXp5IHF1ZXVlIGxldmVsJywgbHZsKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gbGF5ZXJzO1xufTtcblxuLy8gYSBsYXllciBtYXkgd2FudCB0byB1c2UgYW4gZWxlIGNhY2hlIG9mIGEgaGlnaGVyIGxldmVsIHRvIGF2b2lkIGJsdXJyaW5lc3Ncbi8vIHNvIHRoZSBsYXllciBsZXZlbCBtaWdodCBub3QgZXF1YWwgdGhlIGVsZSBsZXZlbFxuTFRDcC5nZXRFbGVMZXZlbEZvckxheWVyTGV2ZWwgPSBmdW5jdGlvbiAobHZsLCBweFJhdGlvKSB7XG4gIHJldHVybiBsdmw7XG59O1xuTFRDcC5kcmF3RWxlSW5MYXllciA9IGZ1bmN0aW9uIChsYXllciwgZWxlLCBsdmwsIHB4UmF0aW8pIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgciA9IHRoaXMucmVuZGVyZXI7XG4gIHZhciBjb250ZXh0ID0gbGF5ZXIuY29udGV4dDtcbiAgdmFyIGJiID0gZWxlLmJvdW5kaW5nQm94KCk7XG4gIGlmIChiYi53ID09PSAwIHx8IGJiLmggPT09IDAgfHwgIWVsZS52aXNpYmxlKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbHZsID0gc2VsZi5nZXRFbGVMZXZlbEZvckxheWVyTGV2ZWwobHZsLCBweFJhdGlvKTtcbiAge1xuICAgIHIuc2V0SW1nU21vb3RoaW5nKGNvbnRleHQsIGZhbHNlKTtcbiAgfVxuICB7XG4gICAgci5kcmF3Q2FjaGVkRWxlbWVudChjb250ZXh0LCBlbGUsIG51bGwsIG51bGwsIGx2bCwgdXNlSGlnaFF1YWxpdHlFbGVUeHJSZXFzKTtcbiAgfVxuICB7XG4gICAgci5zZXRJbWdTbW9vdGhpbmcoY29udGV4dCwgdHJ1ZSk7XG4gIH1cbn07XG5MVENwLmxldmVsSXNDb21wbGV0ZSA9IGZ1bmN0aW9uIChsdmwsIGVsZXMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgbGF5ZXJzID0gc2VsZi5sYXllcnNCeUxldmVsW2x2bF07XG4gIGlmICghbGF5ZXJzIHx8IGxheWVycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIG51bUVsZXNJbkxheWVycyA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxheWVyID0gbGF5ZXJzW2ldO1xuXG4gICAgLy8gaWYgdGhlcmUgYXJlIGFueSBlbGVzIG5lZWRlZCB0byBiZSBkcmF3biB5ZXQsIHRoZSBsZXZlbCBpcyBub3QgY29tcGxldGVcbiAgICBpZiAobGF5ZXIucmVxcyA+IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgbGF5ZXIgaXMgaW52YWxpZCwgdGhlIGxldmVsIGlzIG5vdCBjb21wbGV0ZVxuICAgIGlmIChsYXllci5pbnZhbGlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIG51bUVsZXNJbkxheWVycyArPSBsYXllci5lbGVzLmxlbmd0aDtcbiAgfVxuXG4gIC8vIHdlIHNob3VsZCBoYXZlIGV4YWN0bHkgdGhlIG51bWJlciBvZiBlbGVzIHBhc3NlZCBpbiB0byBiZSBjb21wbGV0ZVxuICBpZiAobnVtRWxlc0luTGF5ZXJzICE9PSBlbGVzLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5MVENwLnZhbGlkYXRlTGF5ZXJzRWxlc09yZGVyaW5nID0gZnVuY3Rpb24gKGx2bCwgZWxlcykge1xuICB2YXIgbGF5ZXJzID0gdGhpcy5sYXllcnNCeUxldmVsW2x2bF07XG4gIGlmICghbGF5ZXJzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gaWYgaW4gYSBsYXllciB0aGUgZWxlcyBhcmUgbm90IGluIHRoZSBzYW1lIG9yZGVyLCB0aGVuIHRoZSBsYXllciBpcyBpbnZhbGlkXG4gIC8vIChpLmUuIHRoZXJlIGlzIGFuIGVsZSBpbiBiZXR3ZWVuIHRoZSBlbGVzIGluIHRoZSBsYXllcilcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBsYXllciA9IGxheWVyc1tpXTtcbiAgICB2YXIgb2Zmc2V0ID0gLTE7XG5cbiAgICAvLyBmaW5kIHRoZSBvZmZzZXRcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChsYXllci5lbGVzWzBdID09PSBlbGVzW2pdKSB7XG4gICAgICAgIG9mZnNldCA9IGo7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgLy8gdGhlbiB0aGUgbGF5ZXIgaGFzIG5vbmV4aXN0ZW50IGVsZW1lbnRzIGFuZCBpcyBpbnZhbGlkXG4gICAgICB0aGlzLmludmFsaWRhdGVMYXllcihsYXllcik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyB0aGUgZWxlcyBpbiB0aGUgbGF5ZXIgbXVzdCBiZSBpbiB0aGUgc2FtZSBjb250aW51b3VzIG9yZGVyLCBlbHNlIHRoZSBsYXllciBpcyBpbnZhbGlkXG5cbiAgICB2YXIgbyA9IG9mZnNldDtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxheWVyLmVsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChsYXllci5lbGVzW2pdICE9PSBlbGVzW28gKyBqXSkge1xuICAgICAgICAvLyBsb2coJ2ludmFsaWRhdGUgYmFzZWQgb24gb3JkZXJpbmcnLCBsYXllci5pZCk7XG5cbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlTGF5ZXIobGF5ZXIpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5MVENwLnVwZGF0ZUVsZW1lbnRzSW5MYXllcnMgPSBmdW5jdGlvbiAoZWxlcywgdXBkYXRlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGlzRWxlcyA9IGVsZW1lbnQoZWxlc1swXSk7XG5cbiAgLy8gY29sbGVjdCB1ZHBhdGVkIGVsZW1lbnRzIChjYXNjYWRlZCBmcm9tIHRoZSBsYXllcnMpIGFuZCB1cGRhdGUgZWFjaFxuICAvLyBsYXllciBpdHNlbGYgYWxvbmcgdGhlIHdheVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmVxID0gaXNFbGVzID8gbnVsbCA6IGVsZXNbaV07XG4gICAgdmFyIGVsZSA9IGlzRWxlcyA/IGVsZXNbaV0gOiBlbGVzW2ldLmVsZTtcbiAgICB2YXIgcnMgPSBlbGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgdmFyIGNhY2hlcyA9IHJzLmltZ0xheWVyQ2FjaGVzID0gcnMuaW1nTGF5ZXJDYWNoZXMgfHwge307XG4gICAgZm9yICh2YXIgbCA9IG1pbkx2bDsgbCA8PSBtYXhMdmw7IGwrKykge1xuICAgICAgdmFyIGxheWVyID0gY2FjaGVzW2xdO1xuICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdXBkYXRlIGlzIGEgcmVxdWVzdCBmcm9tIHRoZSBlbGUgY2FjaGUsIHRoZW4gaXQgYWZmZWN0cyBvbmx5XG4gICAgICAvLyB0aGUgbWF0Y2hpbmcgbGV2ZWxcbiAgICAgIGlmIChyZXEgJiYgc2VsZi5nZXRFbGVMZXZlbEZvckxheWVyTGV2ZWwobGF5ZXIubGV2ZWwpICE9PSByZXEubGV2ZWwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB1cGRhdGUobGF5ZXIsIGVsZSwgcmVxKTtcbiAgICB9XG4gIH1cbn07XG5MVENwLmhhdmVMYXllcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGhhdmVMYXllcnMgPSBmYWxzZTtcbiAgZm9yICh2YXIgbCA9IG1pbkx2bDsgbCA8PSBtYXhMdmw7IGwrKykge1xuICAgIHZhciBsYXllcnMgPSBzZWxmLmxheWVyc0J5TGV2ZWxbbF07XG4gICAgaWYgKGxheWVycyAmJiBsYXllcnMubGVuZ3RoID4gMCkge1xuICAgICAgaGF2ZUxheWVycyA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhhdmVMYXllcnM7XG59O1xuTFRDcC5pbnZhbGlkYXRlRWxlbWVudHMgPSBmdW5jdGlvbiAoZWxlcykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmIChlbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBzZWxmLmxhc3RJbnZhbGlkYXRpb25UaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcblxuICAvLyBsb2coJ3VwZGF0ZSBpbnZhbGlkYXRlIGxheWVyIHRpbWUgZnJvbSBlbGVzJyk7XG5cbiAgaWYgKGVsZXMubGVuZ3RoID09PSAwIHx8ICFzZWxmLmhhdmVMYXllcnMoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBzZWxmLnVwZGF0ZUVsZW1lbnRzSW5MYXllcnMoZWxlcywgZnVuY3Rpb24gaW52YWxBc3NvY0xheWVycyhsYXllciwgZWxlLCByZXEpIHtcbiAgICBzZWxmLmludmFsaWRhdGVMYXllcihsYXllcik7XG4gIH0pO1xufTtcbkxUQ3AuaW52YWxpZGF0ZUxheWVyID0gZnVuY3Rpb24gKGxheWVyKSB7XG4gIC8vIGxvZygndXBkYXRlIGludmFsaWRhdGUgbGF5ZXIgdGltZScpO1xuXG4gIHRoaXMubGFzdEludmFsaWRhdGlvblRpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuICBpZiAobGF5ZXIuaW52YWxpZCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBzYXZlIGN5Y2xlc1xuXG4gIHZhciBsdmwgPSBsYXllci5sZXZlbDtcbiAgdmFyIGVsZXMgPSBsYXllci5lbGVzO1xuICB2YXIgbGF5ZXJzID0gdGhpcy5sYXllcnNCeUxldmVsW2x2bF07XG5cbiAgLy8gbG9nKCdpbnZhbGlkYXRlIGxheWVyJywgbGF5ZXIuaWQgKTtcblxuICByZW1vdmVGcm9tQXJyYXkobGF5ZXJzLCBsYXllcik7XG4gIC8vIGxheWVyLmVsZXMgPSBbXTtcblxuICBsYXllci5lbGVzUXVldWUgPSBbXTtcbiAgbGF5ZXIuaW52YWxpZCA9IHRydWU7XG4gIGlmIChsYXllci5yZXBsYWNlbWVudCkge1xuICAgIGxheWVyLnJlcGxhY2VtZW50LmludmFsaWQgPSB0cnVlO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjYWNoZXMgPSBlbGVzW2ldLl9wcml2YXRlLnJzY3JhdGNoLmltZ0xheWVyQ2FjaGVzO1xuICAgIGlmIChjYWNoZXMpIHtcbiAgICAgIGNhY2hlc1tsdmxdID0gbnVsbDtcbiAgICB9XG4gIH1cbn07XG5MVENwLnJlZmluZUVsZW1lbnRUZXh0dXJlcyA9IGZ1bmN0aW9uIChlbGVzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvLyBsb2coJ3JlZmluZScsIGVsZXMubGVuZ3RoKTtcblxuICBzZWxmLnVwZGF0ZUVsZW1lbnRzSW5MYXllcnMoZWxlcywgZnVuY3Rpb24gcmVmaW5lRWFjaEVsZShsYXllciwgZWxlLCByZXEpIHtcbiAgICB2YXIgckx5ciA9IGxheWVyLnJlcGxhY2VtZW50O1xuICAgIGlmICghckx5cikge1xuICAgICAgckx5ciA9IGxheWVyLnJlcGxhY2VtZW50ID0gc2VsZi5tYWtlTGF5ZXIobGF5ZXIuYmIsIGxheWVyLmxldmVsKTtcbiAgICAgIHJMeXIucmVwbGFjZXMgPSBsYXllcjtcbiAgICAgIHJMeXIuZWxlcyA9IGxheWVyLmVsZXM7XG5cbiAgICAgIC8vIGxvZygnbWFrZSByZXBsYWNlbWVudCBsYXllciAlcyBmb3IgJXMgd2l0aCBsZXZlbCAlcycsIHJMeXIuaWQsIGxheWVyLmlkLCByTHlyLmxldmVsKTtcbiAgICB9XG5cbiAgICBpZiAoIXJMeXIucmVxcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByTHlyLmVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2VsZi5xdWV1ZUxheWVyKHJMeXIsIHJMeXIuZWxlc1tpXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGxvZygncXVldWUgcmVwbGFjZW1lbnQgbGF5ZXIgcmVmaW5lbWVudCcsIHJMeXIuaWQpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5MVENwLmVucXVldWVFbGVtZW50UmVmaW5lbWVudCA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdGhpcy5lbGVUeHJEZXFzLm1lcmdlKGVsZSk7XG4gIHRoaXMuc2NoZWR1bGVFbGVtZW50UmVmaW5lbWVudCgpO1xufTtcbkxUQ3AucXVldWVMYXllciA9IGZ1bmN0aW9uIChsYXllciwgZWxlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHEgPSBzZWxmLmxheWVyc1F1ZXVlO1xuICB2YXIgZWxlc1EgPSBsYXllci5lbGVzUXVldWU7XG4gIHZhciBoYXNJZCA9IGVsZXNRLmhhc0lkID0gZWxlc1EuaGFzSWQgfHwge307XG5cbiAgLy8gaWYgYSBsYXllciBpcyBnb2luZyB0byBiZSByZXBsYWNlZCwgcXVldWluZyBpcyBhIHdhc3RlIG9mIHRpbWVcbiAgaWYgKGxheWVyLnJlcGxhY2VtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChlbGUpIHtcbiAgICBpZiAoaGFzSWRbZWxlLmlkKCldKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZXNRLnB1c2goZWxlKTtcbiAgICBoYXNJZFtlbGUuaWQoKV0gPSB0cnVlO1xuICB9XG4gIGlmIChsYXllci5yZXFzKSB7XG4gICAgbGF5ZXIucmVxcysrO1xuICAgIHEudXBkYXRlSXRlbShsYXllcik7XG4gIH0gZWxzZSB7XG4gICAgbGF5ZXIucmVxcyA9IDE7XG4gICAgcS5wdXNoKGxheWVyKTtcbiAgfVxufTtcbkxUQ3AuZGVxdWV1ZSA9IGZ1bmN0aW9uIChweFJhdGlvKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHEgPSBzZWxmLmxheWVyc1F1ZXVlO1xuICB2YXIgZGVxZCA9IFtdO1xuICB2YXIgZWxlRGVxcyA9IDA7XG4gIHdoaWxlIChlbGVEZXFzIDwgbWF4RGVxU2l6ZSkge1xuICAgIGlmIChxLnNpemUoKSA9PT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBsYXllciA9IHEucGVlaygpO1xuXG4gICAgLy8gaWYgYSBsYXllciBoYXMgYmVlbiBvciB3aWxsIGJlIHJlcGxhY2VkLCB0aGVuIGRvbid0IHdhc3RlIHRpbWUgd2l0aCBpdFxuICAgIGlmIChsYXllci5yZXBsYWNlbWVudCkge1xuICAgICAgLy8gbG9nKCdsYXllciAlcyBpbiBxdWV1ZSBza2lwcGVkIGIvYyBpdCBhbHJlYWR5IGhhcyBhIHJlcGxhY2VtZW50JywgbGF5ZXIuaWQpO1xuICAgICAgcS5wb3AoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGlmIHRoaXMgaXMgYSByZXBsYWNlbWVudCBsYXllciB0aGF0IGhhcyBiZWVuIHN1cGVyY2VkZWQsIHRoZW4gZm9yZ2V0IGl0XG4gICAgaWYgKGxheWVyLnJlcGxhY2VzICYmIGxheWVyICE9PSBsYXllci5yZXBsYWNlcy5yZXBsYWNlbWVudCkge1xuICAgICAgLy8gbG9nKCdsYXllciBpcyBubyBsb25nZXIgdGhlIG1vc3QgdXB0b2RhdGUgcmVwbGFjZW1lbnQ7IGRlcXVldWVkJywgbGF5ZXIuaWQpXG4gICAgICBxLnBvcCgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChsYXllci5pbnZhbGlkKSB7XG4gICAgICAvLyBsb2coJ3JlcGxhY2VtZW50IGxheWVyICVzIGlzIGludmFsaWQ7IGRlcXVldWVkJywgbGF5ZXIuaWQpO1xuICAgICAgcS5wb3AoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgZWxlID0gbGF5ZXIuZWxlc1F1ZXVlLnNoaWZ0KCk7XG4gICAgaWYgKGVsZSkge1xuICAgICAgLy8gbG9nKCdkZXF1ZXVlIGxheWVyICVzJywgbGF5ZXIuaWQpO1xuXG4gICAgICBzZWxmLmRyYXdFbGVJbkxheWVyKGxheWVyLCBlbGUsIGxheWVyLmxldmVsLCBweFJhdGlvKTtcbiAgICAgIGVsZURlcXMrKztcbiAgICB9XG4gICAgaWYgKGRlcWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyB3ZSBuZWVkIG9ubHkgb25lIGVudHJ5IGluIGRlcWQgdG8gcXVldWUgcmVkcmF3aW5nIGV0Y1xuICAgICAgZGVxZC5wdXNoKHRydWUpO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSBsYXllciBoYXMgYWxsIGl0cyBlbGVzIGRvbmUsIHRoZW4gcmVtb3ZlIGZyb20gdGhlIHF1ZXVlXG4gICAgaWYgKGxheWVyLmVsZXNRdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHEucG9wKCk7XG4gICAgICBsYXllci5yZXFzID0gMDtcblxuICAgICAgLy8gbG9nKCdkZXF1ZXVlIG9mIGxheWVyICVzIGNvbXBsZXRlJywgbGF5ZXIuaWQpO1xuXG4gICAgICAvLyB3aGVuIGEgcmVwbGFjZW1lbnQgbGF5ZXIgaXMgZGVxdWV1ZWQsIGl0IHJlcGxhY2VzIHRoZSBvbGQgbGF5ZXIgaW4gdGhlIGxldmVsXG4gICAgICBpZiAobGF5ZXIucmVwbGFjZXMpIHtcbiAgICAgICAgc2VsZi5hcHBseUxheWVyUmVwbGFjZW1lbnQobGF5ZXIpO1xuICAgICAgfVxuICAgICAgc2VsZi5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXFkO1xufTtcbkxUQ3AuYXBwbHlMYXllclJlcGxhY2VtZW50ID0gZnVuY3Rpb24gKGxheWVyKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGxheWVyc0luTGV2ZWwgPSBzZWxmLmxheWVyc0J5TGV2ZWxbbGF5ZXIubGV2ZWxdO1xuICB2YXIgcmVwbGFjZWQgPSBsYXllci5yZXBsYWNlcztcbiAgdmFyIGluZGV4ID0gbGF5ZXJzSW5MZXZlbC5pbmRleE9mKHJlcGxhY2VkKTtcblxuICAvLyBpZiB0aGUgcmVwbGFjZWQgbGF5ZXIgaXMgbm90IGluIHRoZSBhY3RpdmUgbGlzdCBmb3IgdGhlIGxldmVsLCB0aGVuIHJlcGxhY2luZ1xuICAvLyByZWZzIHdvdWxkIGJlIGEgbWlzdGFrZSAoaS5lLiBvdmVyd3JpdGluZyB0aGUgdHJ1ZSBhY3RpdmUgbGF5ZXIpXG4gIGlmIChpbmRleCA8IDAgfHwgcmVwbGFjZWQuaW52YWxpZCkge1xuICAgIC8vIGxvZygncmVwbGFjZW1lbnQgbGF5ZXIgd291bGQgaGF2ZSBubyBlZmZlY3QnLCBsYXllci5pZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxheWVyc0luTGV2ZWxbaW5kZXhdID0gbGF5ZXI7IC8vIHJlcGxhY2UgbGV2ZWwgcmVmXG5cbiAgLy8gcmVwbGFjZSByZWZzIGluIGVsZXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllci5lbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9wID0gbGF5ZXIuZWxlc1tpXS5fcHJpdmF0ZTtcbiAgICB2YXIgY2FjaGUgPSBfcC5pbWdMYXllckNhY2hlcyA9IF9wLmltZ0xheWVyQ2FjaGVzIHx8IHt9O1xuICAgIGlmIChjYWNoZSkge1xuICAgICAgY2FjaGVbbGF5ZXIubGV2ZWxdID0gbGF5ZXI7XG4gICAgfVxuICB9XG5cbiAgLy8gbG9nKCdhcHBseSByZXBsYWNlbWVudCBsYXllciAlcyBvdmVyICVzJywgbGF5ZXIuaWQsIHJlcGxhY2VkLmlkKTtcblxuICBzZWxmLnJlcXVlc3RSZWRyYXcoKTtcbn07XG5MVENwLnJlcXVlc3RSZWRyYXcgPSBkZWJvdW5jZV8xKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHIgPSB0aGlzLnJlbmRlcmVyO1xuICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gIHIucmVkcmF3KCk7XG59LCAxMDApO1xuTFRDcC5zZXR1cERlcXVldWVpbmcgPSBkZWZzLnNldHVwRGVxdWV1ZWluZyh7XG4gIGRlcVJlZHJhd1RocmVzaG9sZDogZGVxUmVkcmF3VGhyZXNob2xkLFxuICBkZXFDb3N0OiBkZXFDb3N0LFxuICBkZXFBdmdDb3N0OiBkZXFBdmdDb3N0LFxuICBkZXFOb0RyYXdDb3N0OiBkZXFOb0RyYXdDb3N0LFxuICBkZXFGYXN0Q29zdDogZGVxRmFzdENvc3QsXG4gIGRlcTogZnVuY3Rpb24gZGVxKHNlbGYsIHB4UmF0aW8pIHtcbiAgICByZXR1cm4gc2VsZi5kZXF1ZXVlKHB4UmF0aW8pO1xuICB9LFxuICBvbkRlcWQ6IG5vb3AkMSxcbiAgc2hvdWxkUmVkcmF3OiB0cnVlaWZ5LFxuICBwcmlvcml0eTogZnVuY3Rpb24gcHJpb3JpdHkoc2VsZikge1xuICAgIHJldHVybiBzZWxmLnJlbmRlcmVyLmJlZm9yZVJlbmRlclByaW9yaXRpZXMubHlyVHhyRGVxO1xuICB9XG59KTtcblxudmFyIENScCRhID0ge307XG52YXIgaW1wbDtcbmZ1bmN0aW9uIHBvbHlnb24oY29udGV4dCwgcG9pbnRzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHB0ID0gcG9pbnRzW2ldO1xuICAgIGNvbnRleHQubGluZVRvKHB0LngsIHB0LnkpO1xuICB9XG59XG5mdW5jdGlvbiB0cmlhbmdsZUJhY2tjdXJ2ZShjb250ZXh0LCBwb2ludHMsIGNvbnRyb2xQb2ludCkge1xuICB2YXIgZmlyc3RQdDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHQgPSBwb2ludHNbaV07XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIGZpcnN0UHQgPSBwdDtcbiAgICB9XG4gICAgY29udGV4dC5saW5lVG8ocHQueCwgcHQueSk7XG4gIH1cbiAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgZmlyc3RQdC54LCBmaXJzdFB0LnkpO1xufVxuZnVuY3Rpb24gdHJpYW5nbGVUZWUoY29udGV4dCwgdHJpYW5nbGVQb2ludHMsIHRlZVBvaW50cykge1xuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9XG4gIHZhciB0cmlQdHMgPSB0cmlhbmdsZVBvaW50cztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmlQdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHQgPSB0cmlQdHNbaV07XG4gICAgY29udGV4dC5saW5lVG8ocHQueCwgcHQueSk7XG4gIH1cbiAgdmFyIHRlZVB0cyA9IHRlZVBvaW50cztcbiAgdmFyIGZpcnN0VGVlUHQgPSB0ZWVQb2ludHNbMF07XG4gIGNvbnRleHQubW92ZVRvKGZpcnN0VGVlUHQueCwgZmlyc3RUZWVQdC55KTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCB0ZWVQdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHQgPSB0ZWVQdHNbaV07XG4gICAgY29udGV4dC5saW5lVG8ocHQueCwgcHQueSk7XG4gIH1cbiAgaWYgKGNvbnRleHQuY2xvc2VQYXRoKSB7XG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgfVxufVxuZnVuY3Rpb24gY2lyY2xlVHJpYW5nbGUoY29udGV4dCwgdHJpYW5nbGVQb2ludHMsIHJ4LCByeSwgcikge1xuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9XG4gIGNvbnRleHQuYXJjKHJ4LCByeSwgciwgMCwgTWF0aC5QSSAqIDIsIGZhbHNlKTtcbiAgdmFyIHRyaVB0cyA9IHRyaWFuZ2xlUG9pbnRzO1xuICB2YXIgZmlyc3RUclB0ID0gdHJpUHRzWzBdO1xuICBjb250ZXh0Lm1vdmVUbyhmaXJzdFRyUHQueCwgZmlyc3RUclB0LnkpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRyaVB0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwdCA9IHRyaVB0c1tpXTtcbiAgICBjb250ZXh0LmxpbmVUbyhwdC54LCBwdC55KTtcbiAgfVxuICBpZiAoY29udGV4dC5jbG9zZVBhdGgpIHtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICB9XG59XG5mdW5jdGlvbiBjaXJjbGUoY29udGV4dCwgcngsIHJ5LCByKSB7XG4gIGNvbnRleHQuYXJjKHJ4LCByeSwgciwgMCwgTWF0aC5QSSAqIDIsIGZhbHNlKTtcbn1cbkNScCRhLmFycm93U2hhcGVJbXBsID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIChpbXBsIHx8IChpbXBsID0ge1xuICAgICdwb2x5Z29uJzogcG9seWdvbixcbiAgICAndHJpYW5nbGUtYmFja2N1cnZlJzogdHJpYW5nbGVCYWNrY3VydmUsXG4gICAgJ3RyaWFuZ2xlLXRlZSc6IHRyaWFuZ2xlVGVlLFxuICAgICdjaXJjbGUtdHJpYW5nbGUnOiBjaXJjbGVUcmlhbmdsZSxcbiAgICAndHJpYW5nbGUtY3Jvc3MnOiB0cmlhbmdsZVRlZSxcbiAgICAnY2lyY2xlJzogY2lyY2xlXG4gIH0pKVtuYW1lXTtcbn07XG5cbnZhciBDUnAkOSA9IHt9O1xuQ1JwJDkuZHJhd0VsZW1lbnQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBzaGlmdFRvT3JpZ2luV2l0aEJiLCBzaG93TGFiZWwsIHNob3dPdmVybGF5LCBzaG93T3BhY2l0eSkge1xuICB2YXIgciA9IHRoaXM7XG4gIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICByLmRyYXdOb2RlKGNvbnRleHQsIGVsZSwgc2hpZnRUb09yaWdpbldpdGhCYiwgc2hvd0xhYmVsLCBzaG93T3ZlcmxheSwgc2hvd09wYWNpdHkpO1xuICB9IGVsc2Uge1xuICAgIHIuZHJhd0VkZ2UoY29udGV4dCwgZWxlLCBzaGlmdFRvT3JpZ2luV2l0aEJiLCBzaG93TGFiZWwsIHNob3dPdmVybGF5LCBzaG93T3BhY2l0eSk7XG4gIH1cbn07XG5DUnAkOS5kcmF3RWxlbWVudE92ZXJsYXkgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlKSB7XG4gIHZhciByID0gdGhpcztcbiAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgIHIuZHJhd05vZGVPdmVybGF5KGNvbnRleHQsIGVsZSk7XG4gIH0gZWxzZSB7XG4gICAgci5kcmF3RWRnZU92ZXJsYXkoY29udGV4dCwgZWxlKTtcbiAgfVxufTtcbkNScCQ5LmRyYXdFbGVtZW50VW5kZXJsYXkgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlKSB7XG4gIHZhciByID0gdGhpcztcbiAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgIHIuZHJhd05vZGVVbmRlcmxheShjb250ZXh0LCBlbGUpO1xuICB9IGVsc2Uge1xuICAgIHIuZHJhd0VkZ2VVbmRlcmxheShjb250ZXh0LCBlbGUpO1xuICB9XG59O1xuQ1JwJDkuZHJhd0NhY2hlZEVsZW1lbnRQb3J0aW9uID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgZWxlVHhyQ2FjaGUsIHB4UmF0aW8sIGx2bCwgcmVhc29uLCBnZXRSb3RhdGlvbiwgZ2V0T3BhY2l0eSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBiYiA9IGVsZVR4ckNhY2hlLmdldEJvdW5kaW5nQm94KGVsZSk7XG4gIGlmIChiYi53ID09PSAwIHx8IGJiLmggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH0gLy8gaWdub3JlIHplcm8gc2l6ZSBjYXNlXG5cbiAgdmFyIGVsZUNhY2hlID0gZWxlVHhyQ2FjaGUuZ2V0RWxlbWVudChlbGUsIGJiLCBweFJhdGlvLCBsdmwsIHJlYXNvbik7XG4gIGlmIChlbGVDYWNoZSAhPSBudWxsKSB7XG4gICAgdmFyIG9wYWNpdHkgPSBnZXRPcGFjaXR5KHIsIGVsZSk7XG4gICAgaWYgKG9wYWNpdHkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRoZXRhID0gZ2V0Um90YXRpb24ociwgZWxlKTtcbiAgICB2YXIgeDEgPSBiYi54MSxcbiAgICAgIHkxID0gYmIueTEsXG4gICAgICB3ID0gYmIudyxcbiAgICAgIGggPSBiYi5oO1xuICAgIHZhciB4LCB5LCBzeCwgc3ksIHNtb290aDtcbiAgICBpZiAodGhldGEgIT09IDApIHtcbiAgICAgIHZhciByb3RQdCA9IGVsZVR4ckNhY2hlLmdldFJvdGF0aW9uUG9pbnQoZWxlKTtcbiAgICAgIHN4ID0gcm90UHQueDtcbiAgICAgIHN5ID0gcm90UHQueTtcbiAgICAgIGNvbnRleHQudHJhbnNsYXRlKHN4LCBzeSk7XG4gICAgICBjb250ZXh0LnJvdGF0ZSh0aGV0YSk7XG4gICAgICBzbW9vdGggPSByLmdldEltZ1Ntb290aGluZyhjb250ZXh0KTtcbiAgICAgIGlmICghc21vb3RoKSB7XG4gICAgICAgIHIuc2V0SW1nU21vb3RoaW5nKGNvbnRleHQsIHRydWUpO1xuICAgICAgfVxuICAgICAgdmFyIG9mZiA9IGVsZVR4ckNhY2hlLmdldFJvdGF0aW9uT2Zmc2V0KGVsZSk7XG4gICAgICB4ID0gb2ZmLng7XG4gICAgICB5ID0gb2ZmLnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHggPSB4MTtcbiAgICAgIHkgPSB5MTtcbiAgICB9XG4gICAgdmFyIG9sZEdsb2JhbEFscGhhO1xuICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICBvbGRHbG9iYWxBbHBoYSA9IGNvbnRleHQuZ2xvYmFsQWxwaGE7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb2xkR2xvYmFsQWxwaGEgKiBvcGFjaXR5O1xuICAgIH1cbiAgICBjb250ZXh0LmRyYXdJbWFnZShlbGVDYWNoZS50ZXh0dXJlLmNhbnZhcywgZWxlQ2FjaGUueCwgMCwgZWxlQ2FjaGUud2lkdGgsIGVsZUNhY2hlLmhlaWdodCwgeCwgeSwgdywgaCk7XG4gICAgaWYgKG9wYWNpdHkgIT09IDEpIHtcbiAgICAgIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBvbGRHbG9iYWxBbHBoYTtcbiAgICB9XG4gICAgaWYgKHRoZXRhICE9PSAwKSB7XG4gICAgICBjb250ZXh0LnJvdGF0ZSgtdGhldGEpO1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoLXN4LCAtc3kpO1xuICAgICAgaWYgKCFzbW9vdGgpIHtcbiAgICAgICAgci5zZXRJbWdTbW9vdGhpbmcoY29udGV4dCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBlbGVUeHJDYWNoZS5kcmF3RWxlbWVudChjb250ZXh0LCBlbGUpOyAvLyBkaXJlY3QgZHJhdyBmYWxsYmFja1xuICB9XG59O1xuXG52YXIgZ2V0WmVyb1JvdGF0aW9uID0gZnVuY3Rpb24gZ2V0WmVyb1JvdGF0aW9uKCkge1xuICByZXR1cm4gMDtcbn07XG52YXIgZ2V0TGFiZWxSb3RhdGlvbiA9IGZ1bmN0aW9uIGdldExhYmVsUm90YXRpb24ociwgZWxlKSB7XG4gIHJldHVybiByLmdldFRleHRBbmdsZShlbGUsIG51bGwpO1xufTtcbnZhciBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uID0gZnVuY3Rpb24gZ2V0U291cmNlTGFiZWxSb3RhdGlvbihyLCBlbGUpIHtcbiAgcmV0dXJuIHIuZ2V0VGV4dEFuZ2xlKGVsZSwgJ3NvdXJjZScpO1xufTtcbnZhciBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uID0gZnVuY3Rpb24gZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvbihyLCBlbGUpIHtcbiAgcmV0dXJuIHIuZ2V0VGV4dEFuZ2xlKGVsZSwgJ3RhcmdldCcpO1xufTtcbnZhciBnZXRPcGFjaXR5ID0gZnVuY3Rpb24gZ2V0T3BhY2l0eShyLCBlbGUpIHtcbiAgcmV0dXJuIGVsZS5lZmZlY3RpdmVPcGFjaXR5KCk7XG59O1xudmFyIGdldFRleHRPcGFjaXR5ID0gZnVuY3Rpb24gZ2V0VGV4dE9wYWNpdHkoZSwgZWxlKSB7XG4gIHJldHVybiBlbGUucHN0eWxlKCd0ZXh0LW9wYWNpdHknKS5wZlZhbHVlICogZWxlLmVmZmVjdGl2ZU9wYWNpdHkoKTtcbn07XG5DUnAkOS5kcmF3Q2FjaGVkRWxlbWVudCA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIHB4UmF0aW8sIGV4dGVudCwgbHZsLCByZXF1ZXN0SGlnaFF1YWxpdHkpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgX3IkZGF0YSA9IHIuZGF0YSxcbiAgICBlbGVUeHJDYWNoZSA9IF9yJGRhdGEuZWxlVHhyQ2FjaGUsXG4gICAgbGJsVHhyQ2FjaGUgPSBfciRkYXRhLmxibFR4ckNhY2hlLFxuICAgIHNsYlR4ckNhY2hlID0gX3IkZGF0YS5zbGJUeHJDYWNoZSxcbiAgICB0bGJUeHJDYWNoZSA9IF9yJGRhdGEudGxiVHhyQ2FjaGU7XG4gIHZhciBiYiA9IGVsZS5ib3VuZGluZ0JveCgpO1xuICB2YXIgcmVhc29uID0gcmVxdWVzdEhpZ2hRdWFsaXR5ID09PSB0cnVlID8gZWxlVHhyQ2FjaGUucmVhc29ucy5oaWdoUXVhbGl0eSA6IG51bGw7XG4gIGlmIChiYi53ID09PSAwIHx8IGJiLmggPT09IDAgfHwgIWVsZS52aXNpYmxlKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFleHRlbnQgfHwgYm91bmRpbmdCb3hlc0ludGVyc2VjdChiYiwgZXh0ZW50KSkge1xuICAgIHZhciBpc0VkZ2UgPSBlbGUuaXNFZGdlKCk7XG4gICAgdmFyIGJhZExpbmUgPSBlbGUuZWxlbWVudCgpLl9wcml2YXRlLnJzY3JhdGNoLmJhZExpbmU7XG4gICAgci5kcmF3RWxlbWVudFVuZGVybGF5KGNvbnRleHQsIGVsZSk7XG4gICAgci5kcmF3Q2FjaGVkRWxlbWVudFBvcnRpb24oY29udGV4dCwgZWxlLCBlbGVUeHJDYWNoZSwgcHhSYXRpbywgbHZsLCByZWFzb24sIGdldFplcm9Sb3RhdGlvbiwgZ2V0T3BhY2l0eSk7XG4gICAgaWYgKCFpc0VkZ2UgfHwgIWJhZExpbmUpIHtcbiAgICAgIHIuZHJhd0NhY2hlZEVsZW1lbnRQb3J0aW9uKGNvbnRleHQsIGVsZSwgbGJsVHhyQ2FjaGUsIHB4UmF0aW8sIGx2bCwgcmVhc29uLCBnZXRMYWJlbFJvdGF0aW9uLCBnZXRUZXh0T3BhY2l0eSk7XG4gICAgfVxuICAgIGlmIChpc0VkZ2UgJiYgIWJhZExpbmUpIHtcbiAgICAgIHIuZHJhd0NhY2hlZEVsZW1lbnRQb3J0aW9uKGNvbnRleHQsIGVsZSwgc2xiVHhyQ2FjaGUsIHB4UmF0aW8sIGx2bCwgcmVhc29uLCBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uLCBnZXRUZXh0T3BhY2l0eSk7XG4gICAgICByLmRyYXdDYWNoZWRFbGVtZW50UG9ydGlvbihjb250ZXh0LCBlbGUsIHRsYlR4ckNhY2hlLCBweFJhdGlvLCBsdmwsIHJlYXNvbiwgZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvbiwgZ2V0VGV4dE9wYWNpdHkpO1xuICAgIH1cbiAgICByLmRyYXdFbGVtZW50T3ZlcmxheShjb250ZXh0LCBlbGUpO1xuICB9XG59O1xuQ1JwJDkuZHJhd0VsZW1lbnRzID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZXMpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICByLmRyYXdFbGVtZW50KGNvbnRleHQsIGVsZSk7XG4gIH1cbn07XG5DUnAkOS5kcmF3Q2FjaGVkRWxlbWVudHMgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlcywgcHhSYXRpbywgZXh0ZW50KSB7XG4gIHZhciByID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgci5kcmF3Q2FjaGVkRWxlbWVudChjb250ZXh0LCBlbGUsIHB4UmF0aW8sIGV4dGVudCk7XG4gIH1cbn07XG5DUnAkOS5kcmF3Q2FjaGVkTm9kZXMgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlcywgcHhSYXRpbywgZXh0ZW50KSB7XG4gIHZhciByID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgaWYgKCFlbGUuaXNOb2RlKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByLmRyYXdDYWNoZWRFbGVtZW50KGNvbnRleHQsIGVsZSwgcHhSYXRpbywgZXh0ZW50KTtcbiAgfVxufTtcbkNScCQ5LmRyYXdMYXllcmVkRWxlbWVudHMgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlcywgcHhSYXRpbywgZXh0ZW50KSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGxheWVycyA9IHIuZGF0YS5seXJUeHJDYWNoZS5nZXRMYXllcnMoZWxlcywgcHhSYXRpbyk7XG4gIGlmIChsYXllcnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxheWVyID0gbGF5ZXJzW2ldO1xuICAgICAgdmFyIGJiID0gbGF5ZXIuYmI7XG4gICAgICBpZiAoYmIudyA9PT0gMCB8fCBiYi5oID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29udGV4dC5kcmF3SW1hZ2UobGF5ZXIuY2FudmFzLCBiYi54MSwgYmIueTEsIGJiLncsIGJiLmgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBmYWxsIGJhY2sgb24gcGxhaW4gY2FjaGluZyBpZiBubyBsYXllcnNcbiAgICByLmRyYXdDYWNoZWRFbGVtZW50cyhjb250ZXh0LCBlbGVzLCBweFJhdGlvLCBleHRlbnQpO1xuICB9XG59O1xuXG52YXIgQ1JwJDggPSB7fTtcbkNScCQ4LmRyYXdFZGdlID0gZnVuY3Rpb24gKGNvbnRleHQsIGVkZ2UsIHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgdmFyIGRyYXdMYWJlbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogdHJ1ZTtcbiAgdmFyIHNob3VsZERyYXdPdmVybGF5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0cnVlO1xuICB2YXIgc2hvdWxkRHJhd09wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IHRydWU7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgaWYgKHNob3VsZERyYXdPcGFjaXR5ICYmICFlZGdlLnZpc2libGUoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGlmIGJlemllciBjdHJsIHB0cyBjYW4gbm90IGJlIGNhbGN1bGF0ZWQsIHRoZW4gZGllXG4gIGlmIChycy5iYWRMaW5lIHx8IHJzLmFsbHB0cyA9PSBudWxsIHx8IGlzTmFOKHJzLmFsbHB0c1swXSkpIHtcbiAgICAvLyBpc05hTiBpbiBjYXNlIGVkZ2UgaXMgaW1wb3NzaWJsZSBhbmQgYnJvd3NlciBidWdzIChlLmcuIHNhZmFyaSlcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGJiO1xuICBpZiAoc2hpZnRUb09yaWdpbldpdGhCYikge1xuICAgIGJiID0gc2hpZnRUb09yaWdpbldpdGhCYjtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgtYmIueDEsIC1iYi55MSk7XG4gIH1cbiAgdmFyIG9wYWNpdHkgPSBzaG91bGREcmF3T3BhY2l0eSA/IGVkZ2UucHN0eWxlKCdvcGFjaXR5JykudmFsdWUgOiAxO1xuICB2YXIgbGluZU9wYWNpdHkgPSBzaG91bGREcmF3T3BhY2l0eSA/IGVkZ2UucHN0eWxlKCdsaW5lLW9wYWNpdHknKS52YWx1ZSA6IDE7XG4gIHZhciBjdXJ2ZVN0eWxlID0gZWRnZS5wc3R5bGUoJ2N1cnZlLXN0eWxlJykudmFsdWU7XG4gIHZhciBsaW5lU3R5bGUgPSBlZGdlLnBzdHlsZSgnbGluZS1zdHlsZScpLnZhbHVlO1xuICB2YXIgZWRnZVdpZHRoID0gZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgdmFyIGxpbmVDYXAgPSBlZGdlLnBzdHlsZSgnbGluZS1jYXAnKS52YWx1ZTtcbiAgdmFyIGVmZmVjdGl2ZUxpbmVPcGFjaXR5ID0gb3BhY2l0eSAqIGxpbmVPcGFjaXR5O1xuICAvLyBzZXBhcmF0ZSBhcnJvdyBvcGFjaXR5IHdvdWxkIHJlcXVpcmUgYXJyb3ctb3BhY2l0eSBwcm9wZXJ0eVxuICB2YXIgZWZmZWN0aXZlQXJyb3dPcGFjaXR5ID0gb3BhY2l0eSAqIGxpbmVPcGFjaXR5O1xuICB2YXIgZHJhd0xpbmUgPSBmdW5jdGlvbiBkcmF3TGluZSgpIHtcbiAgICB2YXIgc3Ryb2tlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZWZmZWN0aXZlTGluZU9wYWNpdHk7XG4gICAgaWYgKGN1cnZlU3R5bGUgPT09ICdzdHJhaWdodC10cmlhbmdsZScpIHtcbiAgICAgIHIuZWxlU3Ryb2tlU3R5bGUoY29udGV4dCwgZWRnZSwgc3Ryb2tlT3BhY2l0eSk7XG4gICAgICByLmRyYXdFZGdlVHJpYW5nbGVQYXRoKGVkZ2UsIGNvbnRleHQsIHJzLmFsbHB0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gZWRnZVdpZHRoO1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gbGluZUNhcDtcbiAgICAgIHIuZWxlU3Ryb2tlU3R5bGUoY29udGV4dCwgZWRnZSwgc3Ryb2tlT3BhY2l0eSk7XG4gICAgICByLmRyYXdFZGdlUGF0aChlZGdlLCBjb250ZXh0LCBycy5hbGxwdHMsIGxpbmVTdHlsZSk7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSAnYnV0dCc7IC8vIHJlc2V0IGZvciBvdGhlciBkcmF3aW5nIGZ1bmN0aW9uc1xuICAgIH1cbiAgfTtcblxuICB2YXIgZHJhd092ZXJsYXkgPSBmdW5jdGlvbiBkcmF3T3ZlcmxheSgpIHtcbiAgICBpZiAoIXNob3VsZERyYXdPdmVybGF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHIuZHJhd0VkZ2VPdmVybGF5KGNvbnRleHQsIGVkZ2UpO1xuICB9O1xuICB2YXIgZHJhd1VuZGVybGF5ID0gZnVuY3Rpb24gZHJhd1VuZGVybGF5KCkge1xuICAgIGlmICghc2hvdWxkRHJhd092ZXJsYXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgci5kcmF3RWRnZVVuZGVybGF5KGNvbnRleHQsIGVkZ2UpO1xuICB9O1xuICB2YXIgZHJhd0Fycm93cyA9IGZ1bmN0aW9uIGRyYXdBcnJvd3MoKSB7XG4gICAgdmFyIGFycm93T3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZWZmZWN0aXZlQXJyb3dPcGFjaXR5O1xuICAgIHIuZHJhd0Fycm93aGVhZHMoY29udGV4dCwgZWRnZSwgYXJyb3dPcGFjaXR5KTtcbiAgfTtcbiAgdmFyIGRyYXdUZXh0ID0gZnVuY3Rpb24gZHJhd1RleHQoKSB7XG4gICAgci5kcmF3RWxlbWVudFRleHQoY29udGV4dCwgZWRnZSwgbnVsbCwgZHJhd0xhYmVsKTtcbiAgfTtcbiAgY29udGV4dC5saW5lSm9pbiA9ICdyb3VuZCc7XG4gIHZhciBnaG9zdCA9IGVkZ2UucHN0eWxlKCdnaG9zdCcpLnZhbHVlID09PSAneWVzJztcbiAgaWYgKGdob3N0KSB7XG4gICAgdmFyIGd4ID0gZWRnZS5wc3R5bGUoJ2dob3N0LW9mZnNldC14JykucGZWYWx1ZTtcbiAgICB2YXIgZ3kgPSBlZGdlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXknKS5wZlZhbHVlO1xuICAgIHZhciBnaG9zdE9wYWNpdHkgPSBlZGdlLnBzdHlsZSgnZ2hvc3Qtb3BhY2l0eScpLnZhbHVlO1xuICAgIHZhciBlZmZlY3RpdmVHaG9zdE9wYWNpdHkgPSBlZmZlY3RpdmVMaW5lT3BhY2l0eSAqIGdob3N0T3BhY2l0eTtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZShneCwgZ3kpO1xuICAgIGRyYXdMaW5lKGVmZmVjdGl2ZUdob3N0T3BhY2l0eSk7XG4gICAgZHJhd0Fycm93cyhlZmZlY3RpdmVHaG9zdE9wYWNpdHkpO1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC1neCwgLWd5KTtcbiAgfVxuICBkcmF3VW5kZXJsYXkoKTtcbiAgZHJhd0xpbmUoKTtcbiAgZHJhd0Fycm93cygpO1xuICBkcmF3T3ZlcmxheSgpO1xuICBkcmF3VGV4dCgpO1xuICBpZiAoc2hpZnRUb09yaWdpbldpdGhCYikge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKGJiLngxLCBiYi55MSk7XG4gIH1cbn07XG52YXIgZHJhd0VkZ2VPdmVybGF5VW5kZXJsYXkgPSBmdW5jdGlvbiBkcmF3RWRnZU92ZXJsYXlVbmRlcmxheShvdmVybGF5T3JVbmRlcmxheSkge1xuICBpZiAoIVsnb3ZlcmxheScsICd1bmRlcmxheSddLmluY2x1ZGVzKG92ZXJsYXlPclVuZGVybGF5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdGF0ZScpO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoY29udGV4dCwgZWRnZSkge1xuICAgIGlmICghZWRnZS52aXNpYmxlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG9wYWNpdHkgPSBlZGdlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItb3BhY2l0eVwiKSkudmFsdWU7XG4gICAgaWYgKG9wYWNpdHkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHIgPSB0aGlzO1xuICAgIHZhciB1c2VQYXRocyA9IHIudXNlUGF0aHMoKTtcbiAgICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgIHZhciBwYWRkaW5nID0gZWRnZS5wc3R5bGUoXCJcIi5jb25jYXQob3ZlcmxheU9yVW5kZXJsYXksIFwiLXBhZGRpbmdcIikpLnBmVmFsdWU7XG4gICAgdmFyIHdpZHRoID0gMiAqIHBhZGRpbmc7XG4gICAgdmFyIGNvbG9yID0gZWRnZS5wc3R5bGUoXCJcIi5jb25jYXQob3ZlcmxheU9yVW5kZXJsYXksIFwiLWNvbG9yXCIpKS52YWx1ZTtcbiAgICBjb250ZXh0LmxpbmVXaWR0aCA9IHdpZHRoO1xuICAgIGlmIChycy5lZGdlVHlwZSA9PT0gJ3NlbGYnICYmICF1c2VQYXRocykge1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gJ2J1dHQnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSAncm91bmQnO1xuICAgIH1cbiAgICByLmNvbG9yU3Ryb2tlU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gICAgci5kcmF3RWRnZVBhdGgoZWRnZSwgY29udGV4dCwgcnMuYWxscHRzLCAnc29saWQnKTtcbiAgfTtcbn07XG5DUnAkOC5kcmF3RWRnZU92ZXJsYXkgPSBkcmF3RWRnZU92ZXJsYXlVbmRlcmxheSgnb3ZlcmxheScpO1xuQ1JwJDguZHJhd0VkZ2VVbmRlcmxheSA9IGRyYXdFZGdlT3ZlcmxheVVuZGVybGF5KCd1bmRlcmxheScpO1xuQ1JwJDguZHJhd0VkZ2VQYXRoID0gZnVuY3Rpb24gKGVkZ2UsIGNvbnRleHQsIHB0cywgdHlwZSkge1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgY2FudmFzQ3h0ID0gY29udGV4dDtcbiAgdmFyIHBhdGg7XG4gIHZhciBwYXRoQ2FjaGVIaXQgPSBmYWxzZTtcbiAgdmFyIHVzZVBhdGhzID0gdGhpcy51c2VQYXRocygpO1xuICB2YXIgbGluZURhc2hQYXR0ZXJuID0gZWRnZS5wc3R5bGUoJ2xpbmUtZGFzaC1wYXR0ZXJuJykucGZWYWx1ZTtcbiAgdmFyIGxpbmVEYXNoT2Zmc2V0ID0gZWRnZS5wc3R5bGUoJ2xpbmUtZGFzaC1vZmZzZXQnKS5wZlZhbHVlO1xuICBpZiAodXNlUGF0aHMpIHtcbiAgICB2YXIgcGF0aENhY2hlS2V5ID0gcHRzLmpvaW4oJyQnKTtcbiAgICB2YXIga2V5TWF0Y2hlcyA9IHJzLnBhdGhDYWNoZUtleSAmJiBycy5wYXRoQ2FjaGVLZXkgPT09IHBhdGhDYWNoZUtleTtcbiAgICBpZiAoa2V5TWF0Y2hlcykge1xuICAgICAgcGF0aCA9IGNvbnRleHQgPSBycy5wYXRoQ2FjaGU7XG4gICAgICBwYXRoQ2FjaGVIaXQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoID0gY29udGV4dCA9IG5ldyBQYXRoMkQoKTtcbiAgICAgIHJzLnBhdGhDYWNoZUtleSA9IHBhdGhDYWNoZUtleTtcbiAgICAgIHJzLnBhdGhDYWNoZSA9IHBhdGg7XG4gICAgfVxuICB9XG4gIGlmIChjYW52YXNDeHQuc2V0TGluZURhc2gpIHtcbiAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2RvdHRlZCc6XG4gICAgICAgIGNhbnZhc0N4dC5zZXRMaW5lRGFzaChbMSwgMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Rhc2hlZCc6XG4gICAgICAgIGNhbnZhc0N4dC5zZXRMaW5lRGFzaChsaW5lRGFzaFBhdHRlcm4pO1xuICAgICAgICBjYW52YXNDeHQubGluZURhc2hPZmZzZXQgPSBsaW5lRGFzaE9mZnNldDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzb2xpZCc6XG4gICAgICAgIGNhbnZhc0N4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoIXBhdGhDYWNoZUhpdCAmJiAhcnMuYmFkTGluZSkge1xuICAgIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICB9XG4gICAgY29udGV4dC5tb3ZlVG8ocHRzWzBdLCBwdHNbMV0pO1xuICAgIHN3aXRjaCAocnMuZWRnZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2Jlemllcic6XG4gICAgICBjYXNlICdzZWxmJzpcbiAgICAgIGNhc2UgJ2NvbXBvdW5kJzpcbiAgICAgIGNhc2UgJ211bHRpYmV6aWVyJzpcbiAgICAgICAgZm9yICh2YXIgaSA9IDI7IGkgKyAzIDwgcHRzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgICAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKHB0c1tpXSwgcHRzW2kgKyAxXSwgcHRzW2kgKyAyXSwgcHRzW2kgKyAzXSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdHJhaWdodCc6XG4gICAgICBjYXNlICdoYXlzdGFjayc6XG4gICAgICAgIGZvciAodmFyIF9pID0gMjsgX2kgKyAxIDwgcHRzLmxlbmd0aDsgX2kgKz0gMikge1xuICAgICAgICAgIGNvbnRleHQubGluZVRvKHB0c1tfaV0sIHB0c1tfaSArIDFdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlZ21lbnRzJzpcbiAgICAgICAgaWYgKHJzLmlzUm91bmQpIHtcbiAgICAgICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIocnMucm91bmRDb3JuZXJzKSxcbiAgICAgICAgICAgIF9zdGVwO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICAgICAgICB2YXIgY29ybmVyID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgICAgIGRyYXdQcmVwYXJlZFJvdW5kQ29ybmVyKGNvbnRleHQsIGNvcm5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IuZigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250ZXh0LmxpbmVUbyhwdHNbcHRzLmxlbmd0aCAtIDJdLCBwdHNbcHRzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKHZhciBfaTIgPSAyOyBfaTIgKyAxIDwgcHRzLmxlbmd0aDsgX2kyICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnRleHQubGluZVRvKHB0c1tfaTJdLCBwdHNbX2kyICsgMV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgY29udGV4dCA9IGNhbnZhc0N4dDtcbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgY29udGV4dC5zdHJva2UocGF0aCk7XG4gIH0gZWxzZSB7XG4gICAgY29udGV4dC5zdHJva2UoKTtcbiAgfVxuXG4gIC8vIHJlc2V0IGFueSBsaW5lIGRhc2hlc1xuICBpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuICAgIC8vIGZvciB2ZXJ5IG91dG9mZGF0ZSBicm93c2Vyc1xuICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICB9XG59O1xuQ1JwJDguZHJhd0VkZ2VUcmlhbmdsZVBhdGggPSBmdW5jdGlvbiAoZWRnZSwgY29udGV4dCwgcHRzKSB7XG4gIC8vIHVzZSBsaW5lIHN0cm9rZSBzdHlsZSBmb3IgdHJpYW5nbGUgZmlsbCBzdHlsZVxuICBjb250ZXh0LmZpbGxTdHlsZSA9IGNvbnRleHQuc3Ryb2tlU3R5bGU7XG4gIHZhciBlZGdlV2lkdGggPSBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICBmb3IgKHZhciBpID0gMDsgaSArIDEgPCBwdHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgdmVjdG9yID0gW3B0c1tpICsgMl0gLSBwdHNbaV0sIHB0c1tpICsgM10gLSBwdHNbaSArIDFdXTtcbiAgICB2YXIgbGVuZ3RoID0gTWF0aC5zcXJ0KHZlY3RvclswXSAqIHZlY3RvclswXSArIHZlY3RvclsxXSAqIHZlY3RvclsxXSk7XG4gICAgdmFyIG5vcm1hbCA9IFt2ZWN0b3JbMV0gLyBsZW5ndGgsIC12ZWN0b3JbMF0gLyBsZW5ndGhdO1xuICAgIHZhciB0cmlhbmdsZUhlYWQgPSBbbm9ybWFsWzBdICogZWRnZVdpZHRoIC8gMiwgbm9ybWFsWzFdICogZWRnZVdpZHRoIC8gMl07XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0Lm1vdmVUbyhwdHNbaV0gLSB0cmlhbmdsZUhlYWRbMF0sIHB0c1tpICsgMV0gLSB0cmlhbmdsZUhlYWRbMV0pO1xuICAgIGNvbnRleHQubGluZVRvKHB0c1tpXSArIHRyaWFuZ2xlSGVhZFswXSwgcHRzW2kgKyAxXSArIHRyaWFuZ2xlSGVhZFsxXSk7XG4gICAgY29udGV4dC5saW5lVG8ocHRzW2kgKyAyXSwgcHRzW2kgKyAzXSk7XG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgfVxufTtcbkNScCQ4LmRyYXdBcnJvd2hlYWRzID0gZnVuY3Rpb24gKGNvbnRleHQsIGVkZ2UsIG9wYWNpdHkpIHtcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIGlzSGF5c3RhY2sgPSBycy5lZGdlVHlwZSA9PT0gJ2hheXN0YWNrJztcbiAgaWYgKCFpc0hheXN0YWNrKSB7XG4gICAgdGhpcy5kcmF3QXJyb3doZWFkKGNvbnRleHQsIGVkZ2UsICdzb3VyY2UnLCBycy5hcnJvd1N0YXJ0WCwgcnMuYXJyb3dTdGFydFksIHJzLnNyY0Fycm93QW5nbGUsIG9wYWNpdHkpO1xuICB9XG4gIHRoaXMuZHJhd0Fycm93aGVhZChjb250ZXh0LCBlZGdlLCAnbWlkLXRhcmdldCcsIHJzLm1pZFgsIHJzLm1pZFksIHJzLm1pZHRndEFycm93QW5nbGUsIG9wYWNpdHkpO1xuICB0aGlzLmRyYXdBcnJvd2hlYWQoY29udGV4dCwgZWRnZSwgJ21pZC1zb3VyY2UnLCBycy5taWRYLCBycy5taWRZLCBycy5taWRzcmNBcnJvd0FuZ2xlLCBvcGFjaXR5KTtcbiAgaWYgKCFpc0hheXN0YWNrKSB7XG4gICAgdGhpcy5kcmF3QXJyb3doZWFkKGNvbnRleHQsIGVkZ2UsICd0YXJnZXQnLCBycy5hcnJvd0VuZFgsIHJzLmFycm93RW5kWSwgcnMudGd0QXJyb3dBbmdsZSwgb3BhY2l0eSk7XG4gIH1cbn07XG5DUnAkOC5kcmF3QXJyb3doZWFkID0gZnVuY3Rpb24gKGNvbnRleHQsIGVkZ2UsIHByZWZpeCwgeCwgeSwgYW5nbGUsIG9wYWNpdHkpIHtcbiAgaWYgKGlzTmFOKHgpIHx8IHggPT0gbnVsbCB8fCBpc05hTih5KSB8fCB5ID09IG51bGwgfHwgaXNOYU4oYW5nbGUpIHx8IGFuZ2xlID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgYXJyb3dTaGFwZSA9IGVkZ2UucHN0eWxlKHByZWZpeCArICctYXJyb3ctc2hhcGUnKS52YWx1ZTtcbiAgaWYgKGFycm93U2hhcGUgPT09ICdub25lJykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgYXJyb3dDbGVhckZpbGwgPSBlZGdlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LWZpbGwnKS52YWx1ZSA9PT0gJ2hvbGxvdycgPyAnYm90aCcgOiAnZmlsbGVkJztcbiAgdmFyIGFycm93RmlsbCA9IGVkZ2UucHN0eWxlKHByZWZpeCArICctYXJyb3ctZmlsbCcpLnZhbHVlO1xuICB2YXIgZWRnZVdpZHRoID0gZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgdmFyIHBBcnJvd1dpZHRoID0gZWRnZS5wc3R5bGUocHJlZml4ICsgJy1hcnJvdy13aWR0aCcpO1xuICB2YXIgYXJyb3dXaWR0aCA9IHBBcnJvd1dpZHRoLnZhbHVlID09PSAnbWF0Y2gtbGluZScgPyBlZGdlV2lkdGggOiBwQXJyb3dXaWR0aC5wZlZhbHVlO1xuICBpZiAocEFycm93V2lkdGgudW5pdHMgPT09ICclJykgYXJyb3dXaWR0aCAqPSBlZGdlV2lkdGg7XG4gIHZhciBlZGdlT3BhY2l0eSA9IGVkZ2UucHN0eWxlKCdvcGFjaXR5JykudmFsdWU7XG4gIGlmIChvcGFjaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICBvcGFjaXR5ID0gZWRnZU9wYWNpdHk7XG4gIH1cbiAgdmFyIGdjbyA9IGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO1xuICBpZiAob3BhY2l0eSAhPT0gMSB8fCBhcnJvd0ZpbGwgPT09ICdob2xsb3cnKSB7XG4gICAgLy8gdGhlbiBleHRyYSBjbGVhciBpcyBuZWVkZWRcbiAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdkZXN0aW5hdGlvbi1vdXQnO1xuICAgIHNlbGYuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgMjU1LCAyNTUsIDI1NSwgMSk7XG4gICAgc2VsZi5jb2xvclN0cm9rZVN0eWxlKGNvbnRleHQsIDI1NSwgMjU1LCAyNTUsIDEpO1xuICAgIHNlbGYuZHJhd0Fycm93U2hhcGUoZWRnZSwgY29udGV4dCwgYXJyb3dDbGVhckZpbGwsIGVkZ2VXaWR0aCwgYXJyb3dTaGFwZSwgYXJyb3dXaWR0aCwgeCwgeSwgYW5nbGUpO1xuICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gZ2NvO1xuICB9IC8vIG90aGVyd2lzZSwgdGhlIG9wYXF1ZSBhcnJvdyBjbGVhcnMgaXQgZm9yIGZyZWUgOilcblxuICB2YXIgY29sb3IgPSBlZGdlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LWNvbG9yJykudmFsdWU7XG4gIHNlbGYuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gIHNlbGYuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgc2VsZi5kcmF3QXJyb3dTaGFwZShlZGdlLCBjb250ZXh0LCBhcnJvd0ZpbGwsIGVkZ2VXaWR0aCwgYXJyb3dTaGFwZSwgYXJyb3dXaWR0aCwgeCwgeSwgYW5nbGUpO1xufTtcbkNScCQ4LmRyYXdBcnJvd1NoYXBlID0gZnVuY3Rpb24gKGVkZ2UsIGNvbnRleHQsIGZpbGwsIGVkZ2VXaWR0aCwgc2hhcGUsIHNoYXBlV2lkdGgsIHgsIHksIGFuZ2xlKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIHVzZVBhdGhzID0gdGhpcy51c2VQYXRocygpICYmIHNoYXBlICE9PSAndHJpYW5nbGUtY3Jvc3MnO1xuICB2YXIgcGF0aENhY2hlSGl0ID0gZmFsc2U7XG4gIHZhciBwYXRoO1xuICB2YXIgY2FudmFzQ29udGV4dCA9IGNvbnRleHQ7XG4gIHZhciB0cmFuc2xhdGlvbiA9IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcbiAgdmFyIHNjYWxlID0gZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWU7XG4gIHZhciBzaXplID0gdGhpcy5nZXRBcnJvd1dpZHRoKGVkZ2VXaWR0aCwgc2NhbGUpO1xuICB2YXIgc2hhcGVJbXBsID0gci5hcnJvd1NoYXBlc1tzaGFwZV07XG4gIGlmICh1c2VQYXRocykge1xuICAgIHZhciBjYWNoZSA9IHIuYXJyb3dQYXRoQ2FjaGUgPSByLmFycm93UGF0aENhY2hlIHx8IFtdO1xuICAgIHZhciBrZXkgPSBoYXNoU3RyaW5nKHNoYXBlKTtcbiAgICB2YXIgY2FjaGVkUGF0aCA9IGNhY2hlW2tleV07XG4gICAgaWYgKGNhY2hlZFBhdGggIT0gbnVsbCkge1xuICAgICAgcGF0aCA9IGNvbnRleHQgPSBjYWNoZWRQYXRoO1xuICAgICAgcGF0aENhY2hlSGl0ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aCA9IGNvbnRleHQgPSBuZXcgUGF0aDJEKCk7XG4gICAgICBjYWNoZVtrZXldID0gcGF0aDtcbiAgICB9XG4gIH1cbiAgaWYgKCFwYXRoQ2FjaGVIaXQpIHtcbiAgICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgfVxuICAgIGlmICh1c2VQYXRocykge1xuICAgICAgLy8gc3RvcmUgaW4gdGhlIHBhdGggY2FjaGUgd2l0aCB2YWx1ZXMgZWFzaWx5IG1hbmlwdWxhdGVkIGxhdGVyXG4gICAgICBzaGFwZUltcGwuZHJhdyhjb250ZXh0LCAxLCAwLCB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDBcbiAgICAgIH0sIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaGFwZUltcGwuZHJhdyhjb250ZXh0LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCk7XG4gICAgfVxuICAgIGlmIChjb250ZXh0LmNsb3NlUGF0aCkge1xuICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB9XG4gIH1cbiAgY29udGV4dCA9IGNhbnZhc0NvbnRleHQ7XG4gIGlmICh1c2VQYXRocykge1xuICAgIC8vIHNldCB0cmFuc2Zvcm0gdG8gYXJyb3cgcG9zaXRpb24vb3JpZW50YXRpb25cbiAgICBjb250ZXh0LnRyYW5zbGF0ZSh4LCB5KTtcbiAgICBjb250ZXh0LnJvdGF0ZShhbmdsZSk7XG4gICAgY29udGV4dC5zY2FsZShzaXplLCBzaXplKTtcbiAgfVxuICBpZiAoZmlsbCA9PT0gJ2ZpbGxlZCcgfHwgZmlsbCA9PT0gJ2JvdGgnKSB7XG4gICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICBjb250ZXh0LmZpbGwocGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIH1cbiAgfVxuICBpZiAoZmlsbCA9PT0gJ2hvbGxvdycgfHwgZmlsbCA9PT0gJ2JvdGgnKSB7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSBzaGFwZVdpZHRoIC8gKHVzZVBhdGhzID8gc2l6ZSA6IDEpO1xuICAgIGNvbnRleHQubGluZUpvaW4gPSAnbWl0ZXInO1xuICAgIGlmICh1c2VQYXRocykge1xuICAgICAgY29udGV4dC5zdHJva2UocGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgfVxuICB9XG4gIGlmICh1c2VQYXRocykge1xuICAgIC8vIHJlc2V0IHRyYW5zZm9ybSBieSBhcHBseWluZyBpbnZlcnNlXG4gICAgY29udGV4dC5zY2FsZSgxIC8gc2l6ZSwgMSAvIHNpemUpO1xuICAgIGNvbnRleHQucm90YXRlKC1hbmdsZSk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLXgsIC15KTtcbiAgfVxufTtcblxudmFyIENScCQ3ID0ge307XG5DUnAkNy5zYWZlRHJhd0ltYWdlID0gZnVuY3Rpb24gKGNvbnRleHQsIGltZywgaXgsIGl5LCBpdywgaWgsIHgsIHksIHcsIGgpIHtcbiAgLy8gZGV0ZWN0IHByb2JsZW1hdGljIGNhc2VzIGZvciBvbGQgYnJvd3NlcnMgd2l0aCBiYWQgaW1hZ2VzIChjaGVhcGVyIHRoYW4gdHJ5LWNhdGNoKVxuICBpZiAoaXcgPD0gMCB8fCBpaCA8PSAwIHx8IHcgPD0gMCB8fCBoIDw9IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIGl4LCBpeSwgaXcsIGloLCB4LCB5LCB3LCBoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHdhcm4oZSk7XG4gIH1cbn07XG5DUnAkNy5kcmF3SW5zY3JpYmVkSW1hZ2UgPSBmdW5jdGlvbiAoY29udGV4dCwgaW1nLCBub2RlLCBpbmRleCwgbm9kZU9wYWNpdHkpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgcG9zID0gbm9kZS5wb3NpdGlvbigpO1xuICB2YXIgbm9kZVggPSBwb3MueDtcbiAgdmFyIG5vZGVZID0gcG9zLnk7XG4gIHZhciBzdHlsZU9iaiA9IG5vZGUuY3koKS5zdHlsZSgpO1xuICB2YXIgZ2V0SW5kZXhlZFN0eWxlID0gc3R5bGVPYmouZ2V0SW5kZXhlZFN0eWxlLmJpbmQoc3R5bGVPYmopO1xuICB2YXIgZml0ID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWZpdCcsICd2YWx1ZScsIGluZGV4KTtcbiAgdmFyIHJlcGVhdCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1yZXBlYXQnLCAndmFsdWUnLCBpbmRleCk7XG4gIHZhciBub2RlVyA9IG5vZGUud2lkdGgoKTtcbiAgdmFyIG5vZGVIID0gbm9kZS5oZWlnaHQoKTtcbiAgdmFyIHBhZGRpbmdYMiA9IG5vZGUucGFkZGluZygpICogMjtcbiAgdmFyIG5vZGVUVyA9IG5vZGVXICsgKGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC13aWR0aC1yZWxhdGl2ZS10bycsICd2YWx1ZScsIGluZGV4KSA9PT0gJ2lubmVyJyA/IDAgOiBwYWRkaW5nWDIpO1xuICB2YXIgbm9kZVRIID0gbm9kZUggKyAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWhlaWdodC1yZWxhdGl2ZS10bycsICd2YWx1ZScsIGluZGV4KSA9PT0gJ2lubmVyJyA/IDAgOiBwYWRkaW5nWDIpO1xuICB2YXIgcnMgPSBub2RlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgY2xpcCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1jbGlwJywgJ3ZhbHVlJywgaW5kZXgpO1xuICB2YXIgc2hvdWxkQ2xpcCA9IGNsaXAgPT09ICdub2RlJztcbiAgdmFyIGltZ09wYWNpdHkgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaW1hZ2Utb3BhY2l0eScsICd2YWx1ZScsIGluZGV4KSAqIG5vZGVPcGFjaXR5O1xuICB2YXIgc21vb3RoID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWltYWdlLXNtb290aGluZycsICd2YWx1ZScsIGluZGV4KTtcbiAgdmFyIGNvcm5lclJhZGl1cyA9IG5vZGUucHN0eWxlKCdjb3JuZXItcmFkaXVzJykudmFsdWU7XG4gIGlmIChjb3JuZXJSYWRpdXMgIT09ICdhdXRvJykgY29ybmVyUmFkaXVzID0gbm9kZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS5wZlZhbHVlO1xuICB2YXIgaW1nVyA9IGltZy53aWR0aCB8fCBpbWcuY2FjaGVkVztcbiAgdmFyIGltZ0ggPSBpbWcuaGVpZ2h0IHx8IGltZy5jYWNoZWRIO1xuXG4gIC8vIHdvcmthcm91bmQgZm9yIGJyb2tlbiBicm93c2VycyBsaWtlIGllXG4gIGlmIChudWxsID09IGltZ1cgfHwgbnVsbCA9PSBpbWdIKSB7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpbWcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgICBpbWdXID0gaW1nLmNhY2hlZFcgPSBpbWcud2lkdGggfHwgaW1nLm9mZnNldFdpZHRoO1xuICAgIGltZ0ggPSBpbWcuY2FjaGVkSCA9IGltZy5oZWlnaHQgfHwgaW1nLm9mZnNldEhlaWdodDtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGltZyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgfVxuXG4gIHZhciB3ID0gaW1nVztcbiAgdmFyIGggPSBpbWdIO1xuICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoJywgJ3ZhbHVlJywgaW5kZXgpICE9PSAnYXV0bycpIHtcbiAgICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoJywgJ3VuaXRzJywgaW5kZXgpID09PSAnJScpIHtcbiAgICAgIHcgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtd2lkdGgnLCAncGZWYWx1ZScsIGluZGV4KSAqIG5vZGVUVztcbiAgICB9IGVsc2Uge1xuICAgICAgdyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC13aWR0aCcsICdwZlZhbHVlJywgaW5kZXgpO1xuICAgIH1cbiAgfVxuICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWhlaWdodCcsICd2YWx1ZScsIGluZGV4KSAhPT0gJ2F1dG8nKSB7XG4gICAgaWYgKGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1oZWlnaHQnLCAndW5pdHMnLCBpbmRleCkgPT09ICclJykge1xuICAgICAgaCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1oZWlnaHQnLCAncGZWYWx1ZScsIGluZGV4KSAqIG5vZGVUSDtcbiAgICB9IGVsc2Uge1xuICAgICAgaCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1oZWlnaHQnLCAncGZWYWx1ZScsIGluZGV4KTtcbiAgICB9XG4gIH1cbiAgaWYgKHcgPT09IDAgfHwgaCA9PT0gMCkge1xuICAgIHJldHVybjsgLy8gbm8gcG9pbnQgaW4gZHJhd2luZyBlbXB0eSBpbWFnZSAoYW5kIGNocm9tZSBpcyBicm9rZW4gaW4gdGhpcyBjYXNlKVxuICB9XG5cbiAgaWYgKGZpdCA9PT0gJ2NvbnRhaW4nKSB7XG4gICAgdmFyIHNjYWxlID0gTWF0aC5taW4obm9kZVRXIC8gdywgbm9kZVRIIC8gaCk7XG4gICAgdyAqPSBzY2FsZTtcbiAgICBoICo9IHNjYWxlO1xuICB9IGVsc2UgaWYgKGZpdCA9PT0gJ2NvdmVyJykge1xuICAgIHZhciBzY2FsZSA9IE1hdGgubWF4KG5vZGVUVyAvIHcsIG5vZGVUSCAvIGgpO1xuICAgIHcgKj0gc2NhbGU7XG4gICAgaCAqPSBzY2FsZTtcbiAgfVxuICB2YXIgeCA9IG5vZGVYIC0gbm9kZVRXIC8gMjsgLy8gbGVmdFxuICB2YXIgcG9zWFVuaXRzID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXgnLCAndW5pdHMnLCBpbmRleCk7XG4gIHZhciBwb3NYUGZWYWwgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtcG9zaXRpb24teCcsICdwZlZhbHVlJywgaW5kZXgpO1xuICBpZiAocG9zWFVuaXRzID09PSAnJScpIHtcbiAgICB4ICs9IChub2RlVFcgLSB3KSAqIHBvc1hQZlZhbDtcbiAgfSBlbHNlIHtcbiAgICB4ICs9IHBvc1hQZlZhbDtcbiAgfVxuICB2YXIgb2ZmWFVuaXRzID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLW9mZnNldC14JywgJ3VuaXRzJywgaW5kZXgpO1xuICB2YXIgb2ZmWFBmVmFsID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLW9mZnNldC14JywgJ3BmVmFsdWUnLCBpbmRleCk7XG4gIGlmIChvZmZYVW5pdHMgPT09ICclJykge1xuICAgIHggKz0gKG5vZGVUVyAtIHcpICogb2ZmWFBmVmFsO1xuICB9IGVsc2Uge1xuICAgIHggKz0gb2ZmWFBmVmFsO1xuICB9XG4gIHZhciB5ID0gbm9kZVkgLSBub2RlVEggLyAyOyAvLyB0b3BcbiAgdmFyIHBvc1lVbml0cyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1wb3NpdGlvbi15JywgJ3VuaXRzJywgaW5kZXgpO1xuICB2YXIgcG9zWVBmVmFsID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXknLCAncGZWYWx1ZScsIGluZGV4KTtcbiAgaWYgKHBvc1lVbml0cyA9PT0gJyUnKSB7XG4gICAgeSArPSAobm9kZVRIIC0gaCkgKiBwb3NZUGZWYWw7XG4gIH0gZWxzZSB7XG4gICAgeSArPSBwb3NZUGZWYWw7XG4gIH1cbiAgdmFyIG9mZllVbml0cyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1vZmZzZXQteScsICd1bml0cycsIGluZGV4KTtcbiAgdmFyIG9mZllQZlZhbCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1vZmZzZXQteScsICdwZlZhbHVlJywgaW5kZXgpO1xuICBpZiAob2ZmWVVuaXRzID09PSAnJScpIHtcbiAgICB5ICs9IChub2RlVEggLSBoKSAqIG9mZllQZlZhbDtcbiAgfSBlbHNlIHtcbiAgICB5ICs9IG9mZllQZlZhbDtcbiAgfVxuICBpZiAocnMucGF0aENhY2hlKSB7XG4gICAgeCAtPSBub2RlWDtcbiAgICB5IC09IG5vZGVZO1xuICAgIG5vZGVYID0gMDtcbiAgICBub2RlWSA9IDA7XG4gIH1cbiAgdmFyIGdBbHBoYSA9IGNvbnRleHQuZ2xvYmFsQWxwaGE7XG4gIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBpbWdPcGFjaXR5O1xuICB2YXIgc21vb3RoaW5nRW5hYmxlZCA9IHIuZ2V0SW1nU21vb3RoaW5nKGNvbnRleHQpO1xuICB2YXIgaXNTbW9vdGhpbmdTd2l0Y2hlZCA9IGZhbHNlO1xuICBpZiAoc21vb3RoID09PSAnbm8nICYmIHNtb290aGluZ0VuYWJsZWQpIHtcbiAgICByLnNldEltZ1Ntb290aGluZyhjb250ZXh0LCBmYWxzZSk7XG4gICAgaXNTbW9vdGhpbmdTd2l0Y2hlZCA9IHRydWU7XG4gIH0gZWxzZSBpZiAoc21vb3RoID09PSAneWVzJyAmJiAhc21vb3RoaW5nRW5hYmxlZCkge1xuICAgIHIuc2V0SW1nU21vb3RoaW5nKGNvbnRleHQsIHRydWUpO1xuICAgIGlzU21vb3RoaW5nU3dpdGNoZWQgPSB0cnVlO1xuICB9XG4gIGlmIChyZXBlYXQgPT09ICduby1yZXBlYXQnKSB7XG4gICAgaWYgKHNob3VsZENsaXApIHtcbiAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgaWYgKHJzLnBhdGhDYWNoZSkge1xuICAgICAgICBjb250ZXh0LmNsaXAocnMucGF0aENhY2hlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHIubm9kZVNoYXBlc1tyLmdldE5vZGVTaGFwZShub2RlKV0uZHJhdyhjb250ZXh0LCBub2RlWCwgbm9kZVksIG5vZGVUVywgbm9kZVRILCBjb3JuZXJSYWRpdXMsIHJzKTtcbiAgICAgICAgY29udGV4dC5jbGlwKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHIuc2FmZURyYXdJbWFnZShjb250ZXh0LCBpbWcsIDAsIDAsIGltZ1csIGltZ0gsIHgsIHksIHcsIGgpO1xuICAgIGlmIChzaG91bGRDbGlwKSB7XG4gICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIHBhdHRlcm4gPSBjb250ZXh0LmNyZWF0ZVBhdHRlcm4oaW1nLCByZXBlYXQpO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gcGF0dGVybjtcbiAgICByLm5vZGVTaGFwZXNbci5nZXROb2RlU2hhcGUobm9kZSldLmRyYXcoY29udGV4dCwgbm9kZVgsIG5vZGVZLCBub2RlVFcsIG5vZGVUSCwgY29ybmVyUmFkaXVzLCBycyk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoeCwgeSk7XG4gICAgY29udGV4dC5maWxsKCk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLXgsIC15KTtcbiAgfVxuICBjb250ZXh0Lmdsb2JhbEFscGhhID0gZ0FscGhhO1xuICBpZiAoaXNTbW9vdGhpbmdTd2l0Y2hlZCkge1xuICAgIHIuc2V0SW1nU21vb3RoaW5nKGNvbnRleHQsIHNtb290aGluZ0VuYWJsZWQpO1xuICB9XG59O1xuXG52YXIgQ1JwJDYgPSB7fTtcbkNScCQ2LmVsZVRleHRCaWdnZXJUaGFuTWluID0gZnVuY3Rpb24gKGVsZSwgc2NhbGUpIHtcbiAgaWYgKCFzY2FsZSkge1xuICAgIHZhciB6b29tID0gZWxlLmN5KCkuem9vbSgpO1xuICAgIHZhciBweFJhdGlvID0gdGhpcy5nZXRQaXhlbFJhdGlvKCk7XG4gICAgdmFyIGx2bCA9IE1hdGguY2VpbChsb2cyKHpvb20gKiBweFJhdGlvKSk7IC8vIHRoZSBlZmZlY3RpdmUgdGV4dHVyZSBsZXZlbFxuXG4gICAgc2NhbGUgPSBNYXRoLnBvdygyLCBsdmwpO1xuICB9XG4gIHZhciBjb21wdXRlZFNpemUgPSBlbGUucHN0eWxlKCdmb250LXNpemUnKS5wZlZhbHVlICogc2NhbGU7XG4gIHZhciBtaW5TaXplID0gZWxlLnBzdHlsZSgnbWluLXpvb21lZC1mb250LXNpemUnKS5wZlZhbHVlO1xuICBpZiAoY29tcHV0ZWRTaXplIDwgbWluU2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5DUnAkNi5kcmF3RWxlbWVudFRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBzaGlmdFRvT3JpZ2luV2l0aEJiLCBmb3JjZSwgcHJlZml4KSB7XG4gIHZhciB1c2VFbGVPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiB0cnVlO1xuICB2YXIgciA9IHRoaXM7XG4gIGlmIChmb3JjZSA9PSBudWxsKSB7XG4gICAgaWYgKHVzZUVsZU9wYWNpdHkgJiYgIXIuZWxlVGV4dEJpZ2dlclRoYW5NaW4oZWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSBlbHNlIGlmIChmb3JjZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgIHZhciBsYWJlbCA9IGVsZS5wc3R5bGUoJ2xhYmVsJyk7XG4gICAgaWYgKCFsYWJlbCB8fCAhbGFiZWwudmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGp1c3RpZmljYXRpb24gPSByLmdldExhYmVsSnVzdGlmaWNhdGlvbihlbGUpO1xuICAgIGNvbnRleHQudGV4dEFsaWduID0ganVzdGlmaWNhdGlvbjtcbiAgICBjb250ZXh0LnRleHRCYXNlbGluZSA9ICdib3R0b20nO1xuICB9IGVsc2Uge1xuICAgIHZhciBiYWRMaW5lID0gZWxlLmVsZW1lbnQoKS5fcHJpdmF0ZS5yc2NyYXRjaC5iYWRMaW5lO1xuICAgIHZhciBfbGFiZWwgPSBlbGUucHN0eWxlKCdsYWJlbCcpO1xuICAgIHZhciBzcmNMYWJlbCA9IGVsZS5wc3R5bGUoJ3NvdXJjZS1sYWJlbCcpO1xuICAgIHZhciB0Z3RMYWJlbCA9IGVsZS5wc3R5bGUoJ3RhcmdldC1sYWJlbCcpO1xuICAgIGlmIChiYWRMaW5lIHx8ICghX2xhYmVsIHx8ICFfbGFiZWwudmFsdWUpICYmICghc3JjTGFiZWwgfHwgIXNyY0xhYmVsLnZhbHVlKSAmJiAoIXRndExhYmVsIHx8ICF0Z3RMYWJlbC52YWx1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29udGV4dC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICBjb250ZXh0LnRleHRCYXNlbGluZSA9ICdib3R0b20nO1xuICB9XG4gIHZhciBhcHBseVJvdGF0aW9uID0gIXNoaWZ0VG9PcmlnaW5XaXRoQmI7XG4gIHZhciBiYjtcbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBiYiA9IHNoaWZ0VG9PcmlnaW5XaXRoQmI7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWJiLngxLCAtYmIueTEpO1xuICB9XG4gIGlmIChwcmVmaXggPT0gbnVsbCkge1xuICAgIHIuZHJhd1RleHQoY29udGV4dCwgZWxlLCBudWxsLCBhcHBseVJvdGF0aW9uLCB1c2VFbGVPcGFjaXR5KTtcbiAgICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgICByLmRyYXdUZXh0KGNvbnRleHQsIGVsZSwgJ3NvdXJjZScsIGFwcGx5Um90YXRpb24sIHVzZUVsZU9wYWNpdHkpO1xuICAgICAgci5kcmF3VGV4dChjb250ZXh0LCBlbGUsICd0YXJnZXQnLCBhcHBseVJvdGF0aW9uLCB1c2VFbGVPcGFjaXR5KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgci5kcmF3VGV4dChjb250ZXh0LCBlbGUsIHByZWZpeCwgYXBwbHlSb3RhdGlvbiwgdXNlRWxlT3BhY2l0eSk7XG4gIH1cbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZShiYi54MSwgYmIueTEpO1xuICB9XG59O1xuQ1JwJDYuZ2V0Rm9udENhY2hlID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgdmFyIGNhY2hlO1xuICB0aGlzLmZvbnRDYWNoZXMgPSB0aGlzLmZvbnRDYWNoZXMgfHwgW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5mb250Q2FjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2FjaGUgPSB0aGlzLmZvbnRDYWNoZXNbaV07XG4gICAgaWYgKGNhY2hlLmNvbnRleHQgPT09IGNvbnRleHQpIHtcbiAgICAgIHJldHVybiBjYWNoZTtcbiAgICB9XG4gIH1cbiAgY2FjaGUgPSB7XG4gICAgY29udGV4dDogY29udGV4dFxuICB9O1xuICB0aGlzLmZvbnRDYWNoZXMucHVzaChjYWNoZSk7XG4gIHJldHVybiBjYWNoZTtcbn07XG5cbi8vIHNldCB1cCBjYW52YXMgY29udGV4dCB3aXRoIGZvbnRcbi8vIHJldHVybnMgdHJhbnNmb3JtZWQgdGV4dCBzdHJpbmdcbkNScCQ2LnNldHVwVGV4dFN0eWxlID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSkge1xuICB2YXIgdXNlRWxlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcbiAgLy8gRm9udCBzdHlsZVxuICB2YXIgbGFiZWxTdHlsZSA9IGVsZS5wc3R5bGUoJ2ZvbnQtc3R5bGUnKS5zdHJWYWx1ZTtcbiAgdmFyIGxhYmVsU2l6ZSA9IGVsZS5wc3R5bGUoJ2ZvbnQtc2l6ZScpLnBmVmFsdWUgKyAncHgnO1xuICB2YXIgbGFiZWxGYW1pbHkgPSBlbGUucHN0eWxlKCdmb250LWZhbWlseScpLnN0clZhbHVlO1xuICB2YXIgbGFiZWxXZWlnaHQgPSBlbGUucHN0eWxlKCdmb250LXdlaWdodCcpLnN0clZhbHVlO1xuICB2YXIgb3BhY2l0eSA9IHVzZUVsZU9wYWNpdHkgPyBlbGUuZWZmZWN0aXZlT3BhY2l0eSgpICogZWxlLnBzdHlsZSgndGV4dC1vcGFjaXR5JykudmFsdWUgOiAxO1xuICB2YXIgb3V0bGluZU9wYWNpdHkgPSBlbGUucHN0eWxlKCd0ZXh0LW91dGxpbmUtb3BhY2l0eScpLnZhbHVlICogb3BhY2l0eTtcbiAgdmFyIGNvbG9yID0gZWxlLnBzdHlsZSgnY29sb3InKS52YWx1ZTtcbiAgdmFyIG91dGxpbmVDb2xvciA9IGVsZS5wc3R5bGUoJ3RleHQtb3V0bGluZS1jb2xvcicpLnZhbHVlO1xuICBjb250ZXh0LmZvbnQgPSBsYWJlbFN0eWxlICsgJyAnICsgbGFiZWxXZWlnaHQgKyAnICcgKyBsYWJlbFNpemUgKyAnICcgKyBsYWJlbEZhbWlseTtcbiAgY29udGV4dC5saW5lSm9pbiA9ICdyb3VuZCc7IC8vIHNvIHRleHQgb3V0bGluZXMgYXJlbid0IGphZ2dlZFxuXG4gIHRoaXMuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gIHRoaXMuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBvdXRsaW5lQ29sb3JbMF0sIG91dGxpbmVDb2xvclsxXSwgb3V0bGluZUNvbG9yWzJdLCBvdXRsaW5lT3BhY2l0eSk7XG59O1xuXG4vLyBUT0RPIGVuc3VyZSByZS11c2VkXG5mdW5jdGlvbiByb3VuZFJlY3QoY3R4LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciByYWRpdXMgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IDU7XG4gIHZhciBzdHJva2UgPSBhcmd1bWVudHMubGVuZ3RoID4gNiA/IGFyZ3VtZW50c1s2XSA6IHVuZGVmaW5lZDtcbiAgY3R4LmJlZ2luUGF0aCgpO1xuICBjdHgubW92ZVRvKHggKyByYWRpdXMsIHkpO1xuICBjdHgubGluZVRvKHggKyB3aWR0aCAtIHJhZGl1cywgeSk7XG4gIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHggKyB3aWR0aCwgeSwgeCArIHdpZHRoLCB5ICsgcmFkaXVzKTtcbiAgY3R4LmxpbmVUbyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQgLSByYWRpdXMpO1xuICBjdHgucXVhZHJhdGljQ3VydmVUbyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHggKyB3aWR0aCAtIHJhZGl1cywgeSArIGhlaWdodCk7XG4gIGN0eC5saW5lVG8oeCArIHJhZGl1cywgeSArIGhlaWdodCk7XG4gIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHgsIHkgKyBoZWlnaHQsIHgsIHkgKyBoZWlnaHQgLSByYWRpdXMpO1xuICBjdHgubGluZVRvKHgsIHkgKyByYWRpdXMpO1xuICBjdHgucXVhZHJhdGljQ3VydmVUbyh4LCB5LCB4ICsgcmFkaXVzLCB5KTtcbiAgY3R4LmNsb3NlUGF0aCgpO1xuICBpZiAoc3Ryb2tlKSBjdHguc3Ryb2tlKCk7ZWxzZSBjdHguZmlsbCgpO1xufVxuQ1JwJDYuZ2V0VGV4dEFuZ2xlID0gZnVuY3Rpb24gKGVsZSwgcHJlZml4KSB7XG4gIHZhciB0aGV0YTtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcnNjcmF0Y2ggPSBfcC5yc2NyYXRjaDtcbiAgdmFyIHBkYXNoID0gcHJlZml4ID8gcHJlZml4ICsgJy0nIDogJyc7XG4gIHZhciByb3RhdGlvbiA9IGVsZS5wc3R5bGUocGRhc2ggKyAndGV4dC1yb3RhdGlvbicpO1xuICB2YXIgdGV4dEFuZ2xlID0gZ2V0UHJlZml4ZWRQcm9wZXJ0eShyc2NyYXRjaCwgJ2xhYmVsQW5nbGUnLCBwcmVmaXgpO1xuICBpZiAocm90YXRpb24uc3RyVmFsdWUgPT09ICdhdXRvcm90YXRlJykge1xuICAgIHRoZXRhID0gZWxlLmlzRWRnZSgpID8gdGV4dEFuZ2xlIDogMDtcbiAgfSBlbHNlIGlmIChyb3RhdGlvbi5zdHJWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgdGhldGEgPSAwO1xuICB9IGVsc2Uge1xuICAgIHRoZXRhID0gcm90YXRpb24ucGZWYWx1ZTtcbiAgfVxuICByZXR1cm4gdGhldGE7XG59O1xuQ1JwJDYuZHJhd1RleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBwcmVmaXgpIHtcbiAgdmFyIGFwcGx5Um90YXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHRydWU7XG4gIHZhciB1c2VFbGVPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0cnVlO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciByc2NyYXRjaCA9IF9wLnJzY3JhdGNoO1xuICB2YXIgcGFyZW50T3BhY2l0eSA9IHVzZUVsZU9wYWNpdHkgPyBlbGUuZWZmZWN0aXZlT3BhY2l0eSgpIDogMTtcbiAgaWYgKHVzZUVsZU9wYWNpdHkgJiYgKHBhcmVudE9wYWNpdHkgPT09IDAgfHwgZWxlLnBzdHlsZSgndGV4dC1vcGFjaXR5JykudmFsdWUgPT09IDApKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gdXNlICdtYWluJyBhcyBhbiBhbGlhcyBmb3IgdGhlIG1haW4gbGFiZWwgKGkuZS4gbnVsbCBwcmVmaXgpXG4gIGlmIChwcmVmaXggPT09ICdtYWluJykge1xuICAgIHByZWZpeCA9IG51bGw7XG4gIH1cbiAgdmFyIHRleHRYID0gZ2V0UHJlZml4ZWRQcm9wZXJ0eShyc2NyYXRjaCwgJ2xhYmVsWCcsIHByZWZpeCk7XG4gIHZhciB0ZXh0WSA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbFknLCBwcmVmaXgpO1xuICB2YXIgb3JnVGV4dFgsIG9yZ1RleHRZOyAvLyB1c2VkIGZvciByb3RhdGlvblxuICB2YXIgdGV4dCA9IHRoaXMuZ2V0TGFiZWxUZXh0KGVsZSwgcHJlZml4KTtcbiAgaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0ICE9PSAnJyAmJiAhaXNOYU4odGV4dFgpICYmICFpc05hTih0ZXh0WSkpIHtcbiAgICB0aGlzLnNldHVwVGV4dFN0eWxlKGNvbnRleHQsIGVsZSwgdXNlRWxlT3BhY2l0eSk7XG4gICAgdmFyIHBkYXNoID0gcHJlZml4ID8gcHJlZml4ICsgJy0nIDogJyc7XG4gICAgdmFyIHRleHRXID0gZ2V0UHJlZml4ZWRQcm9wZXJ0eShyc2NyYXRjaCwgJ2xhYmVsV2lkdGgnLCBwcmVmaXgpO1xuICAgIHZhciB0ZXh0SCA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbEhlaWdodCcsIHByZWZpeCk7XG4gICAgdmFyIG1hcmdpblggPSBlbGUucHN0eWxlKHBkYXNoICsgJ3RleHQtbWFyZ2luLXgnKS5wZlZhbHVlO1xuICAgIHZhciBtYXJnaW5ZID0gZWxlLnBzdHlsZShwZGFzaCArICd0ZXh0LW1hcmdpbi15JykucGZWYWx1ZTtcbiAgICB2YXIgaXNFZGdlID0gZWxlLmlzRWRnZSgpO1xuICAgIHZhciBoYWxpZ24gPSBlbGUucHN0eWxlKCd0ZXh0LWhhbGlnbicpLnZhbHVlO1xuICAgIHZhciB2YWxpZ24gPSBlbGUucHN0eWxlKCd0ZXh0LXZhbGlnbicpLnZhbHVlO1xuICAgIGlmIChpc0VkZ2UpIHtcbiAgICAgIGhhbGlnbiA9ICdjZW50ZXInO1xuICAgICAgdmFsaWduID0gJ2NlbnRlcic7XG4gICAgfVxuICAgIHRleHRYICs9IG1hcmdpblg7XG4gICAgdGV4dFkgKz0gbWFyZ2luWTtcbiAgICB2YXIgdGhldGE7XG4gICAgaWYgKCFhcHBseVJvdGF0aW9uKSB7XG4gICAgICB0aGV0YSA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoZXRhID0gdGhpcy5nZXRUZXh0QW5nbGUoZWxlLCBwcmVmaXgpO1xuICAgIH1cbiAgICBpZiAodGhldGEgIT09IDApIHtcbiAgICAgIG9yZ1RleHRYID0gdGV4dFg7XG4gICAgICBvcmdUZXh0WSA9IHRleHRZO1xuICAgICAgY29udGV4dC50cmFuc2xhdGUob3JnVGV4dFgsIG9yZ1RleHRZKTtcbiAgICAgIGNvbnRleHQucm90YXRlKHRoZXRhKTtcbiAgICAgIHRleHRYID0gMDtcbiAgICAgIHRleHRZID0gMDtcbiAgICB9XG4gICAgc3dpdGNoICh2YWxpZ24pIHtcbiAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgdGV4dFkgKz0gdGV4dEggLyAyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIHRleHRZICs9IHRleHRIO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIGJhY2tncm91bmRPcGFjaXR5ID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLW9wYWNpdHknKS52YWx1ZTtcbiAgICB2YXIgYm9yZGVyT3BhY2l0eSA9IGVsZS5wc3R5bGUoJ3RleHQtYm9yZGVyLW9wYWNpdHknKS52YWx1ZTtcbiAgICB2YXIgdGV4dEJvcmRlcldpZHRoID0gZWxlLnBzdHlsZSgndGV4dC1ib3JkZXItd2lkdGgnKS5wZlZhbHVlO1xuICAgIHZhciBiYWNrZ3JvdW5kUGFkZGluZyA9IGVsZS5wc3R5bGUoJ3RleHQtYmFja2dyb3VuZC1wYWRkaW5nJykucGZWYWx1ZTtcbiAgICB2YXIgc3R5bGVTaGFwZSA9IGVsZS5wc3R5bGUoJ3RleHQtYmFja2dyb3VuZC1zaGFwZScpLnN0clZhbHVlO1xuICAgIHZhciByb3VuZGVkID0gc3R5bGVTaGFwZS5pbmRleE9mKCdyb3VuZCcpID09PSAwO1xuICAgIHZhciByb3VuZFJhZGl1cyA9IDI7XG4gICAgaWYgKGJhY2tncm91bmRPcGFjaXR5ID4gMCB8fCB0ZXh0Qm9yZGVyV2lkdGggPiAwICYmIGJvcmRlck9wYWNpdHkgPiAwKSB7XG4gICAgICB2YXIgYmdYID0gdGV4dFggLSBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIHN3aXRjaCAoaGFsaWduKSB7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIGJnWCAtPSB0ZXh0VztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICBiZ1ggLT0gdGV4dFcgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFyIGJnWSA9IHRleHRZIC0gdGV4dEggLSBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIHZhciBiZ1cgPSB0ZXh0VyArIDIgKiBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIHZhciBiZ0ggPSB0ZXh0SCArIDIgKiBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIGlmIChiYWNrZ3JvdW5kT3BhY2l0eSA+IDApIHtcbiAgICAgICAgdmFyIHRleHRGaWxsID0gY29udGV4dC5maWxsU3R5bGU7XG4gICAgICAgIHZhciB0ZXh0QmFja2dyb3VuZENvbG9yID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLWNvbG9yJykudmFsdWU7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJ3JnYmEoJyArIHRleHRCYWNrZ3JvdW5kQ29sb3JbMF0gKyAnLCcgKyB0ZXh0QmFja2dyb3VuZENvbG9yWzFdICsgJywnICsgdGV4dEJhY2tncm91bmRDb2xvclsyXSArICcsJyArIGJhY2tncm91bmRPcGFjaXR5ICogcGFyZW50T3BhY2l0eSArICcpJztcbiAgICAgICAgaWYgKHJvdW5kZWQpIHtcbiAgICAgICAgICByb3VuZFJlY3QoY29udGV4dCwgYmdYLCBiZ1ksIGJnVywgYmdILCByb3VuZFJhZGl1cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5maWxsUmVjdChiZ1gsIGJnWSwgYmdXLCBiZ0gpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gdGV4dEZpbGw7XG4gICAgICB9XG4gICAgICBpZiAodGV4dEJvcmRlcldpZHRoID4gMCAmJiBib3JkZXJPcGFjaXR5ID4gMCkge1xuICAgICAgICB2YXIgdGV4dFN0cm9rZSA9IGNvbnRleHQuc3Ryb2tlU3R5bGU7XG4gICAgICAgIHZhciB0ZXh0TGluZVdpZHRoID0gY29udGV4dC5saW5lV2lkdGg7XG4gICAgICAgIHZhciB0ZXh0Qm9yZGVyQ29sb3IgPSBlbGUucHN0eWxlKCd0ZXh0LWJvcmRlci1jb2xvcicpLnZhbHVlO1xuICAgICAgICB2YXIgdGV4dEJvcmRlclN0eWxlID0gZWxlLnBzdHlsZSgndGV4dC1ib3JkZXItc3R5bGUnKS52YWx1ZTtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdyZ2JhKCcgKyB0ZXh0Qm9yZGVyQ29sb3JbMF0gKyAnLCcgKyB0ZXh0Qm9yZGVyQ29sb3JbMV0gKyAnLCcgKyB0ZXh0Qm9yZGVyQ29sb3JbMl0gKyAnLCcgKyBib3JkZXJPcGFjaXR5ICogcGFyZW50T3BhY2l0eSArICcpJztcbiAgICAgICAgY29udGV4dC5saW5lV2lkdGggPSB0ZXh0Qm9yZGVyV2lkdGg7XG4gICAgICAgIGlmIChjb250ZXh0LnNldExpbmVEYXNoKSB7XG4gICAgICAgICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgICAgICAgc3dpdGNoICh0ZXh0Qm9yZGVyU3R5bGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RvdHRlZCc6XG4gICAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goWzEsIDFdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkYXNoZWQnOlxuICAgICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFs0LCAyXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZG91YmxlJzpcbiAgICAgICAgICAgICAgY29udGV4dC5saW5lV2lkdGggPSB0ZXh0Qm9yZGVyV2lkdGggLyA0OyAvLyA1MCUgcmVzZXJ2ZWQgZm9yIHdoaXRlIGJldHdlZW4gdGhlIHR3byBib3JkZXJzXG4gICAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NvbGlkJzpcbiAgICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocm91bmRlZCkge1xuICAgICAgICAgIHJvdW5kUmVjdChjb250ZXh0LCBiZ1gsIGJnWSwgYmdXLCBiZ0gsIHJvdW5kUmFkaXVzLCAnc3Ryb2tlJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5zdHJva2VSZWN0KGJnWCwgYmdZLCBiZ1csIGJnSCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRleHRCb3JkZXJTdHlsZSA9PT0gJ2RvdWJsZScpIHtcbiAgICAgICAgICB2YXIgd2hpdGVXaWR0aCA9IHRleHRCb3JkZXJXaWR0aCAvIDI7XG4gICAgICAgICAgaWYgKHJvdW5kZWQpIHtcbiAgICAgICAgICAgIHJvdW5kUmVjdChjb250ZXh0LCBiZ1ggKyB3aGl0ZVdpZHRoLCBiZ1kgKyB3aGl0ZVdpZHRoLCBiZ1cgLSB3aGl0ZVdpZHRoICogMiwgYmdIIC0gd2hpdGVXaWR0aCAqIDIsIHJvdW5kUmFkaXVzLCAnc3Ryb2tlJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRleHQuc3Ryb2tlUmVjdChiZ1ggKyB3aGl0ZVdpZHRoLCBiZ1kgKyB3aGl0ZVdpZHRoLCBiZ1cgLSB3aGl0ZVdpZHRoICogMiwgYmdIIC0gd2hpdGVXaWR0aCAqIDIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAgIC8vIGZvciB2ZXJ5IG91dG9mZGF0ZSBicm93c2Vyc1xuICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQubGluZVdpZHRoID0gdGV4dExpbmVXaWR0aDtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHRleHRTdHJva2U7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBsaW5lV2lkdGggPSAyICogZWxlLnBzdHlsZSgndGV4dC1vdXRsaW5lLXdpZHRoJykucGZWYWx1ZTsgLy8gKjIgYi9jIHRoZSBzdHJva2UgaXMgZHJhd24gY2VudHJlZCBvbiB0aGUgbWlkZGxlXG5cbiAgICBpZiAobGluZVdpZHRoID4gMCkge1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG4gICAgfVxuICAgIGlmIChlbGUucHN0eWxlKCd0ZXh0LXdyYXAnKS52YWx1ZSA9PT0gJ3dyYXAnKSB7XG4gICAgICB2YXIgbGluZXMgPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxXcmFwQ2FjaGVkTGluZXMnLCBwcmVmaXgpO1xuICAgICAgdmFyIGxpbmVIZWlnaHQgPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxMaW5lSGVpZ2h0JywgcHJlZml4KTtcbiAgICAgIHZhciBoYWxmVGV4dFcgPSB0ZXh0VyAvIDI7XG4gICAgICB2YXIganVzdGlmaWNhdGlvbiA9IHRoaXMuZ2V0TGFiZWxKdXN0aWZpY2F0aW9uKGVsZSk7XG4gICAgICBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ2F1dG8nKSA7IGVsc2UgaWYgKGhhbGlnbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIC8vIGF1dG8ganVzdGlmaWNhdGlvbiA6IHJpZ2h0XG4gICAgICAgIGlmIChqdXN0aWZpY2F0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICB0ZXh0WCArPSAtdGV4dFc7XG4gICAgICAgIH0gZWxzZSBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICB0ZXh0WCArPSAtaGFsZlRleHRXO1xuICAgICAgICB9IC8vIGVsc2Ugc2FtZSBhcyBhdXRvXG4gICAgICB9IGVsc2UgaWYgKGhhbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgLy8gYXV0byBqdXN0ZmljYXRpb24gOiBjZW50ZXJcbiAgICAgICAgaWYgKGp1c3RpZmljYXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgIHRleHRYICs9IC1oYWxmVGV4dFc7XG4gICAgICAgIH0gZWxzZSBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIHRleHRYICs9IGhhbGZUZXh0VztcbiAgICAgICAgfSAvLyBlbHNlIHNhbWUgYXMgYXV0b1xuICAgICAgfSBlbHNlIGlmIChoYWxpZ24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgLy8gYXV0byBqdXN0aWZpY2F0aW9uIDogbGVmdFxuICAgICAgICBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICB0ZXh0WCArPSBoYWxmVGV4dFc7XG4gICAgICAgIH0gZWxzZSBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIHRleHRYICs9IHRleHRXO1xuICAgICAgICB9IC8vIGVsc2Ugc2FtZSBhcyBhdXRvXG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAodmFsaWduKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgdGV4dFkgLT0gKGxpbmVzLmxlbmd0aCAtIDEpICogbGluZUhlaWdodDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICB0ZXh0WSAtPSAobGluZXMubGVuZ3RoIC0gMSkgKiBsaW5lSGVpZ2h0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBsaW5lcy5sZW5ndGg7IGwrKykge1xuICAgICAgICBpZiAobGluZVdpZHRoID4gMCkge1xuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlVGV4dChsaW5lc1tsXSwgdGV4dFgsIHRleHRZKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmZpbGxUZXh0KGxpbmVzW2xdLCB0ZXh0WCwgdGV4dFkpO1xuICAgICAgICB0ZXh0WSArPSBsaW5lSGVpZ2h0O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobGluZVdpZHRoID4gMCkge1xuICAgICAgICBjb250ZXh0LnN0cm9rZVRleHQodGV4dCwgdGV4dFgsIHRleHRZKTtcbiAgICAgIH1cbiAgICAgIGNvbnRleHQuZmlsbFRleHQodGV4dCwgdGV4dFgsIHRleHRZKTtcbiAgICB9XG4gICAgaWYgKHRoZXRhICE9PSAwKSB7XG4gICAgICBjb250ZXh0LnJvdGF0ZSgtdGhldGEpO1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoLW9yZ1RleHRYLCAtb3JnVGV4dFkpO1xuICAgIH1cbiAgfVxufTtcblxuLyogZ2xvYmFsIFBhdGgyRCAqL1xudmFyIENScCQ1ID0ge307XG5DUnAkNS5kcmF3Tm9kZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBub2RlLCBzaGlmdFRvT3JpZ2luV2l0aEJiKSB7XG4gIHZhciBkcmF3TGFiZWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHRydWU7XG4gIHZhciBzaG91bGREcmF3T3ZlcmxheSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgdmFyIHNob3VsZERyYXdPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiB0cnVlO1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBub2RlV2lkdGgsIG5vZGVIZWlnaHQ7XG4gIHZhciBfcCA9IG5vZGUuX3ByaXZhdGU7XG4gIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuICB2YXIgcG9zID0gbm9kZS5wb3NpdGlvbigpO1xuICBpZiAoIW51bWJlciQxKHBvcy54KSB8fCAhbnVtYmVyJDEocG9zLnkpKSB7XG4gICAgcmV0dXJuOyAvLyBjYW4ndCBkcmF3IG5vZGUgd2l0aCB1bmRlZmluZWQgcG9zaXRpb25cbiAgfVxuXG4gIGlmIChzaG91bGREcmF3T3BhY2l0eSAmJiAhbm9kZS52aXNpYmxlKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGVsZU9wYWNpdHkgPSBzaG91bGREcmF3T3BhY2l0eSA/IG5vZGUuZWZmZWN0aXZlT3BhY2l0eSgpIDogMTtcbiAgdmFyIHVzZVBhdGhzID0gci51c2VQYXRocygpO1xuICB2YXIgcGF0aDtcbiAgdmFyIHBhdGhDYWNoZUhpdCA9IGZhbHNlO1xuICB2YXIgcGFkZGluZyA9IG5vZGUucGFkZGluZygpO1xuICBub2RlV2lkdGggPSBub2RlLndpZHRoKCkgKyAyICogcGFkZGluZztcbiAgbm9kZUhlaWdodCA9IG5vZGUuaGVpZ2h0KCkgKyAyICogcGFkZGluZztcblxuICAvL1xuICAvLyBzZXR1cCBzaGlmdFxuXG4gIHZhciBiYjtcbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBiYiA9IHNoaWZ0VG9PcmlnaW5XaXRoQmI7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWJiLngxLCAtYmIueTEpO1xuICB9XG5cbiAgLy9cbiAgLy8gbG9hZCBiZyBpbWFnZVxuXG4gIHZhciBiZ0ltZ1Byb3AgPSBub2RlLnBzdHlsZSgnYmFja2dyb3VuZC1pbWFnZScpO1xuICB2YXIgdXJscyA9IGJnSW1nUHJvcC52YWx1ZTtcbiAgdmFyIHVybERlZmluZWQgPSBuZXcgQXJyYXkodXJscy5sZW5ndGgpO1xuICB2YXIgaW1hZ2UgPSBuZXcgQXJyYXkodXJscy5sZW5ndGgpO1xuICB2YXIgbnVtSW1hZ2VzID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHVybCA9IHVybHNbaV07XG4gICAgdmFyIGRlZmQgPSB1cmxEZWZpbmVkW2ldID0gdXJsICE9IG51bGwgJiYgdXJsICE9PSAnbm9uZSc7XG4gICAgaWYgKGRlZmQpIHtcbiAgICAgIHZhciBiZ0ltZ0Nyb3NzT3JpZ2luID0gbm9kZS5jeSgpLnN0eWxlKCkuZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWltYWdlLWNyb3Nzb3JpZ2luJywgJ3ZhbHVlJywgaSk7XG4gICAgICBudW1JbWFnZXMrKztcblxuICAgICAgLy8gZ2V0IGltYWdlLCBhbmQgaWYgbm90IGxvYWRlZCB0aGVuIGFzayB0byByZWRyYXcgd2hlbiBsYXRlciBsb2FkZWRcbiAgICAgIGltYWdlW2ldID0gci5nZXRDYWNoZWRJbWFnZSh1cmwsIGJnSW1nQ3Jvc3NPcmlnaW4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3AuYmFja2dyb3VuZFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIG5vZGUuZW1pdEFuZE5vdGlmeSgnYmFja2dyb3VuZCcpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy9cbiAgLy8gc2V0dXAgc3R5bGVzXG5cbiAgdmFyIGRhcmtuZXNzID0gbm9kZS5wc3R5bGUoJ2JhY2tncm91bmQtYmxhY2tlbicpLnZhbHVlO1xuICB2YXIgYm9yZGVyV2lkdGggPSBub2RlLnBzdHlsZSgnYm9yZGVyLXdpZHRoJykucGZWYWx1ZTtcbiAgdmFyIGJnT3BhY2l0eSA9IG5vZGUucHN0eWxlKCdiYWNrZ3JvdW5kLW9wYWNpdHknKS52YWx1ZSAqIGVsZU9wYWNpdHk7XG4gIHZhciBib3JkZXJDb2xvciA9IG5vZGUucHN0eWxlKCdib3JkZXItY29sb3InKS52YWx1ZTtcbiAgdmFyIGJvcmRlclN0eWxlID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1zdHlsZScpLnZhbHVlO1xuICB2YXIgYm9yZGVySm9pbiA9IG5vZGUucHN0eWxlKCdib3JkZXItam9pbicpLnZhbHVlO1xuICB2YXIgYm9yZGVyQ2FwID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1jYXAnKS52YWx1ZTtcbiAgdmFyIGJvcmRlclBvc2l0aW9uID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1wb3NpdGlvbicpLnZhbHVlO1xuICB2YXIgYm9yZGVyUGF0dGVybiA9IG5vZGUucHN0eWxlKCdib3JkZXItZGFzaC1wYXR0ZXJuJykucGZWYWx1ZTtcbiAgdmFyIGJvcmRlck9mZnNldCA9IG5vZGUucHN0eWxlKCdib3JkZXItZGFzaC1vZmZzZXQnKS5wZlZhbHVlO1xuICB2YXIgYm9yZGVyT3BhY2l0eSA9IG5vZGUucHN0eWxlKCdib3JkZXItb3BhY2l0eScpLnZhbHVlICogZWxlT3BhY2l0eTtcbiAgdmFyIG91dGxpbmVXaWR0aCA9IG5vZGUucHN0eWxlKCdvdXRsaW5lLXdpZHRoJykucGZWYWx1ZTtcbiAgdmFyIG91dGxpbmVDb2xvciA9IG5vZGUucHN0eWxlKCdvdXRsaW5lLWNvbG9yJykudmFsdWU7XG4gIHZhciBvdXRsaW5lU3R5bGUgPSBub2RlLnBzdHlsZSgnb3V0bGluZS1zdHlsZScpLnZhbHVlO1xuICB2YXIgb3V0bGluZU9wYWNpdHkgPSBub2RlLnBzdHlsZSgnb3V0bGluZS1vcGFjaXR5JykudmFsdWUgKiBlbGVPcGFjaXR5O1xuICB2YXIgb3V0bGluZU9mZnNldCA9IG5vZGUucHN0eWxlKCdvdXRsaW5lLW9mZnNldCcpLnZhbHVlO1xuICB2YXIgY29ybmVyUmFkaXVzID0gbm9kZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZTtcbiAgaWYgKGNvcm5lclJhZGl1cyAhPT0gJ2F1dG8nKSBjb3JuZXJSYWRpdXMgPSBub2RlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWU7XG4gIHZhciBzZXR1cFNoYXBlQ29sb3IgPSBmdW5jdGlvbiBzZXR1cFNoYXBlQ29sb3IoKSB7XG4gICAgdmFyIGJnT3B5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBiZ09wYWNpdHk7XG4gICAgci5lbGVGaWxsU3R5bGUoY29udGV4dCwgbm9kZSwgYmdPcHkpO1xuICB9O1xuICB2YXIgc2V0dXBCb3JkZXJDb2xvciA9IGZ1bmN0aW9uIHNldHVwQm9yZGVyQ29sb3IoKSB7XG4gICAgdmFyIGJkck9weSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogYm9yZGVyT3BhY2l0eTtcbiAgICByLmNvbG9yU3Ryb2tlU3R5bGUoY29udGV4dCwgYm9yZGVyQ29sb3JbMF0sIGJvcmRlckNvbG9yWzFdLCBib3JkZXJDb2xvclsyXSwgYmRyT3B5KTtcbiAgfTtcbiAgdmFyIHNldHVwT3V0bGluZUNvbG9yID0gZnVuY3Rpb24gc2V0dXBPdXRsaW5lQ29sb3IoKSB7XG4gICAgdmFyIG90bG5PcHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG91dGxpbmVPcGFjaXR5O1xuICAgIHIuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBvdXRsaW5lQ29sb3JbMF0sIG91dGxpbmVDb2xvclsxXSwgb3V0bGluZUNvbG9yWzJdLCBvdGxuT3B5KTtcbiAgfTtcblxuICAvL1xuICAvLyBzZXR1cCBzaGFwZVxuXG4gIHZhciBnZXRQYXRoID0gZnVuY3Rpb24gZ2V0UGF0aCh3aWR0aCwgaGVpZ2h0LCBzaGFwZSwgcG9pbnRzKSB7XG4gICAgdmFyIHBhdGhDYWNoZSA9IHIubm9kZVBhdGhDYWNoZSA9IHIubm9kZVBhdGhDYWNoZSB8fCBbXTtcbiAgICB2YXIga2V5ID0gaGFzaFN0cmluZ3Moc2hhcGUgPT09ICdwb2x5Z29uJyA/IHNoYXBlICsgJywnICsgcG9pbnRzLmpvaW4oJywnKSA6IHNoYXBlLCAnJyArIGhlaWdodCwgJycgKyB3aWR0aCwgJycgKyBjb3JuZXJSYWRpdXMpO1xuICAgIHZhciBjYWNoZWRQYXRoID0gcGF0aENhY2hlW2tleV07XG4gICAgdmFyIHBhdGg7XG4gICAgdmFyIGNhY2hlSGl0ID0gZmFsc2U7XG4gICAgaWYgKGNhY2hlZFBhdGggIT0gbnVsbCkge1xuICAgICAgcGF0aCA9IGNhY2hlZFBhdGg7XG4gICAgICBjYWNoZUhpdCA9IHRydWU7XG4gICAgICBycy5wYXRoQ2FjaGUgPSBwYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoID0gbmV3IFBhdGgyRCgpO1xuICAgICAgcGF0aENhY2hlW2tleV0gPSBycy5wYXRoQ2FjaGUgPSBwYXRoO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogcGF0aCxcbiAgICAgIGNhY2hlSGl0OiBjYWNoZUhpdFxuICAgIH07XG4gIH07XG4gIHZhciBzdHlsZVNoYXBlID0gbm9kZS5wc3R5bGUoJ3NoYXBlJykuc3RyVmFsdWU7XG4gIHZhciBzaGFwZVB0cyA9IG5vZGUucHN0eWxlKCdzaGFwZS1wb2x5Z29uLXBvaW50cycpLnBmVmFsdWU7XG4gIGlmICh1c2VQYXRocykge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKHBvcy54LCBwb3MueSk7XG4gICAgdmFyIHNoYXBlUGF0aCA9IGdldFBhdGgobm9kZVdpZHRoLCBub2RlSGVpZ2h0LCBzdHlsZVNoYXBlLCBzaGFwZVB0cyk7XG4gICAgcGF0aCA9IHNoYXBlUGF0aC5wYXRoO1xuICAgIHBhdGhDYWNoZUhpdCA9IHNoYXBlUGF0aC5jYWNoZUhpdDtcbiAgfVxuICB2YXIgZHJhd1NoYXBlID0gZnVuY3Rpb24gZHJhd1NoYXBlKCkge1xuICAgIGlmICghcGF0aENhY2hlSGl0KSB7XG4gICAgICB2YXIgbnBvcyA9IHBvcztcbiAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICBucG9zID0ge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgci5ub2RlU2hhcGVzW3IuZ2V0Tm9kZVNoYXBlKG5vZGUpXS5kcmF3KHBhdGggfHwgY29udGV4dCwgbnBvcy54LCBucG9zLnksIG5vZGVXaWR0aCwgbm9kZUhlaWdodCwgY29ybmVyUmFkaXVzLCBycyk7XG4gICAgfVxuICAgIGlmICh1c2VQYXRocykge1xuICAgICAgY29udGV4dC5maWxsKHBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICB9XG4gIH07XG4gIHZhciBkcmF3SW1hZ2VzID0gZnVuY3Rpb24gZHJhd0ltYWdlcygpIHtcbiAgICB2YXIgbm9kZU9wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGVsZU9wYWNpdHk7XG4gICAgdmFyIGluc2lkZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICB2YXIgcHJldkJnaW5nID0gX3AuYmFja2dyb3VuZGluZztcbiAgICB2YXIgdG90YWxDb21wbGV0ZWQgPSAwO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBpbWFnZS5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBiZ0NvbnRhaW5tZW50ID0gbm9kZS5jeSgpLnN0eWxlKCkuZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWltYWdlLWNvbnRhaW5tZW50JywgJ3ZhbHVlJywgX2kpO1xuICAgICAgaWYgKGluc2lkZSAmJiBiZ0NvbnRhaW5tZW50ID09PSAnb3ZlcicgfHwgIWluc2lkZSAmJiBiZ0NvbnRhaW5tZW50ID09PSAnaW5zaWRlJykge1xuICAgICAgICB0b3RhbENvbXBsZXRlZCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh1cmxEZWZpbmVkW19pXSAmJiBpbWFnZVtfaV0uY29tcGxldGUgJiYgIWltYWdlW19pXS5lcnJvcikge1xuICAgICAgICB0b3RhbENvbXBsZXRlZCsrO1xuICAgICAgICByLmRyYXdJbnNjcmliZWRJbWFnZShjb250ZXh0LCBpbWFnZVtfaV0sIG5vZGUsIF9pLCBub2RlT3BhY2l0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIF9wLmJhY2tncm91bmRpbmcgPSAhKHRvdGFsQ29tcGxldGVkID09PSBudW1JbWFnZXMpO1xuICAgIGlmIChwcmV2QmdpbmcgIT09IF9wLmJhY2tncm91bmRpbmcpIHtcbiAgICAgIC8vIHVwZGF0ZSBzdHlsZSBiL2MgOmJhY2tncm91bmRpbmcgc3RhdGUgY2hhbmdlZFxuICAgICAgbm9kZS51cGRhdGVTdHlsZShmYWxzZSk7XG4gICAgfVxuICB9O1xuICB2YXIgZHJhd1BpZSA9IGZ1bmN0aW9uIGRyYXdQaWUoKSB7XG4gICAgdmFyIHJlZHJhd1NoYXBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICB2YXIgcGllT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZWxlT3BhY2l0eTtcbiAgICBpZiAoci5oYXNQaWUobm9kZSkpIHtcbiAgICAgIHIuZHJhd1BpZShjb250ZXh0LCBub2RlLCBwaWVPcGFjaXR5KTtcblxuICAgICAgLy8gcmVkcmF3L3Jlc3RvcmUgcGF0aCBpZiBzdGVwcyBhZnRlciBwaWUgbmVlZCBpdFxuICAgICAgaWYgKHJlZHJhd1NoYXBlKSB7XG4gICAgICAgIGlmICghdXNlUGF0aHMpIHtcbiAgICAgICAgICByLm5vZGVTaGFwZXNbci5nZXROb2RlU2hhcGUobm9kZSldLmRyYXcoY29udGV4dCwgcG9zLngsIHBvcy55LCBub2RlV2lkdGgsIG5vZGVIZWlnaHQsIGNvcm5lclJhZGl1cywgcnMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgZGFya2VuID0gZnVuY3Rpb24gZGFya2VuKCkge1xuICAgIHZhciBkYXJrZW5PcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBlbGVPcGFjaXR5O1xuICAgIHZhciBvcGFjaXR5ID0gKGRhcmtuZXNzID4gMCA/IGRhcmtuZXNzIDogLWRhcmtuZXNzKSAqIGRhcmtlbk9wYWNpdHk7XG4gICAgdmFyIGMgPSBkYXJrbmVzcyA+IDAgPyAwIDogMjU1O1xuICAgIGlmIChkYXJrbmVzcyAhPT0gMCkge1xuICAgICAgci5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBjLCBjLCBjLCBvcGFjaXR5KTtcbiAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICBjb250ZXh0LmZpbGwocGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHZhciBkcmF3Qm9yZGVyID0gZnVuY3Rpb24gZHJhd0JvcmRlcigpIHtcbiAgICBpZiAoYm9yZGVyV2lkdGggPiAwKSB7XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGJvcmRlcldpZHRoO1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gYm9yZGVyQ2FwO1xuICAgICAgY29udGV4dC5saW5lSm9pbiA9IGJvcmRlckpvaW47XG4gICAgICBpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICAgICAgc3dpdGNoIChib3JkZXJTdHlsZSkge1xuICAgICAgICAgIGNhc2UgJ2RvdHRlZCc6XG4gICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFsxLCAxXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdkYXNoZWQnOlxuICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChib3JkZXJQYXR0ZXJuKTtcbiAgICAgICAgICAgIGNvbnRleHQubGluZURhc2hPZmZzZXQgPSBib3JkZXJPZmZzZXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdzb2xpZCc6XG4gICAgICAgICAgY2FzZSAnZG91YmxlJzpcbiAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChib3JkZXJQb3NpdGlvbiAhPT0gJ2NlbnRlcicpIHtcbiAgICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICAgIGNvbnRleHQubGluZVdpZHRoICo9IDI7XG4gICAgICAgIGlmIChib3JkZXJQb3NpdGlvbiA9PT0gJ2luc2lkZScpIHtcbiAgICAgICAgICB1c2VQYXRocyA/IGNvbnRleHQuY2xpcChwYXRoKSA6IGNvbnRleHQuY2xpcCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciByZWdpb24gPSBuZXcgUGF0aDJEKCk7XG4gICAgICAgICAgcmVnaW9uLnJlY3QoLW5vZGVXaWR0aCAvIDIgLSBib3JkZXJXaWR0aCwgLW5vZGVIZWlnaHQgLyAyIC0gYm9yZGVyV2lkdGgsIG5vZGVXaWR0aCArIDIgKiBib3JkZXJXaWR0aCwgbm9kZUhlaWdodCArIDIgKiBib3JkZXJXaWR0aCk7XG4gICAgICAgICAgcmVnaW9uLmFkZFBhdGgocGF0aCk7XG4gICAgICAgICAgY29udGV4dC5jbGlwKHJlZ2lvbiwgJ2V2ZW5vZGQnKTtcbiAgICAgICAgfVxuICAgICAgICB1c2VQYXRocyA/IGNvbnRleHQuc3Ryb2tlKHBhdGgpIDogY29udGV4dC5zdHJva2UoKTtcbiAgICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1c2VQYXRocyA/IGNvbnRleHQuc3Ryb2tlKHBhdGgpIDogY29udGV4dC5zdHJva2UoKTtcbiAgICAgIH1cbiAgICAgIGlmIChib3JkZXJTdHlsZSA9PT0gJ2RvdWJsZScpIHtcbiAgICAgICAgY29udGV4dC5saW5lV2lkdGggPSBib3JkZXJXaWR0aCAvIDM7XG4gICAgICAgIHZhciBnY28gPSBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbjtcbiAgICAgICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnZGVzdGluYXRpb24tb3V0JztcbiAgICAgICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAgICAgY29udGV4dC5zdHJva2UocGF0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGdjbztcbiAgICAgIH1cblxuICAgICAgLy8gcmVzZXQgaW4gY2FzZSB3ZSBjaGFuZ2VkIHRoZSBib3JkZXIgc3R5bGVcbiAgICAgIGlmIChjb250ZXh0LnNldExpbmVEYXNoKSB7XG4gICAgICAgIC8vIGZvciB2ZXJ5IG91dG9mZGF0ZSBicm93c2Vyc1xuICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFtdKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHZhciBkcmF3T3V0bGluZSA9IGZ1bmN0aW9uIGRyYXdPdXRsaW5lKCkge1xuICAgIGlmIChvdXRsaW5lV2lkdGggPiAwKSB7XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IG91dGxpbmVXaWR0aDtcbiAgICAgIGNvbnRleHQubGluZUNhcCA9ICdidXR0JztcbiAgICAgIGlmIChjb250ZXh0LnNldExpbmVEYXNoKSB7XG4gICAgICAgIC8vIGZvciB2ZXJ5IG91dG9mZGF0ZSBicm93c2Vyc1xuICAgICAgICBzd2l0Y2ggKG91dGxpbmVTdHlsZSkge1xuICAgICAgICAgIGNhc2UgJ2RvdHRlZCc6XG4gICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFsxLCAxXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdkYXNoZWQnOlxuICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbNCwgMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnc29saWQnOlxuICAgICAgICAgIGNhc2UgJ2RvdWJsZSc6XG4gICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFtdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgbnBvcyA9IHBvcztcbiAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICBucG9zID0ge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIHNoYXBlID0gci5nZXROb2RlU2hhcGUobm9kZSk7XG4gICAgICB2YXIgYldpZHRoID0gYm9yZGVyV2lkdGg7XG4gICAgICBpZiAoYm9yZGVyUG9zaXRpb24gPT09ICdpbnNpZGUnKSBiV2lkdGggPSAwO1xuICAgICAgaWYgKGJvcmRlclBvc2l0aW9uID09PSAnb3V0c2lkZScpIGJXaWR0aCAqPSAyO1xuICAgICAgdmFyIHNjYWxlWCA9IChub2RlV2lkdGggKyBiV2lkdGggKyAob3V0bGluZVdpZHRoICsgb3V0bGluZU9mZnNldCkpIC8gbm9kZVdpZHRoO1xuICAgICAgdmFyIHNjYWxlWSA9IChub2RlSGVpZ2h0ICsgYldpZHRoICsgKG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQpKSAvIG5vZGVIZWlnaHQ7XG4gICAgICB2YXIgc1dpZHRoID0gbm9kZVdpZHRoICogc2NhbGVYO1xuICAgICAgdmFyIHNIZWlnaHQgPSBub2RlSGVpZ2h0ICogc2NhbGVZO1xuICAgICAgdmFyIHBvaW50cyA9IHIubm9kZVNoYXBlc1tzaGFwZV0ucG9pbnRzO1xuICAgICAgdmFyIF9wYXRoO1xuICAgICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAgIHZhciBvdXRsaW5lUGF0aCA9IGdldFBhdGgoc1dpZHRoLCBzSGVpZ2h0LCBzaGFwZSwgcG9pbnRzKTtcbiAgICAgICAgX3BhdGggPSBvdXRsaW5lUGF0aC5wYXRoO1xuICAgICAgfVxuXG4gICAgICAvLyBkcmF3IHRoZSBvdXRsaW5lIHBhdGgsIGVpdGhlciBieSB1c2luZyBleHBhbmRlZCBwb2ludHMgb3IgYnkgc2NhbGluZyBcbiAgICAgIC8vIHRoZSBkaW1lbnNpb25zLCBkZXBlbmRpbmcgb24gc2hhcGVcbiAgICAgIGlmIChzaGFwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICAgICAgci5kcmF3RWxsaXBzZVBhdGgoX3BhdGggfHwgY29udGV4dCwgbnBvcy54LCBucG9zLnksIHNXaWR0aCwgc0hlaWdodCk7XG4gICAgICB9IGVsc2UgaWYgKFsncm91bmQtZGlhbW9uZCcsICdyb3VuZC1oZXB0YWdvbicsICdyb3VuZC1oZXhhZ29uJywgJ3JvdW5kLW9jdGFnb24nLCAncm91bmQtcGVudGFnb24nLCAncm91bmQtcG9seWdvbicsICdyb3VuZC10cmlhbmdsZScsICdyb3VuZC10YWcnXS5pbmNsdWRlcyhzaGFwZSkpIHtcbiAgICAgICAgdmFyIHNNdWx0ID0gMDtcbiAgICAgICAgdmFyIG9mZnNldFggPSAwO1xuICAgICAgICB2YXIgb2Zmc2V0WSA9IDA7XG4gICAgICAgIGlmIChzaGFwZSA9PT0gJ3JvdW5kLWRpYW1vbmQnKSB7XG4gICAgICAgICAgc011bHQgPSAoYldpZHRoICsgb3V0bGluZU9mZnNldCArIG91dGxpbmVXaWR0aCkgKiAxLjQ7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdyb3VuZC1oZXB0YWdvbicpIHtcbiAgICAgICAgICBzTXVsdCA9IChiV2lkdGggKyBvdXRsaW5lT2Zmc2V0ICsgb3V0bGluZVdpZHRoKSAqIDEuMDc1O1xuICAgICAgICAgIG9mZnNldFkgPSAtKGJXaWR0aCAvIDIgKyBvdXRsaW5lT2Zmc2V0ICsgb3V0bGluZVdpZHRoKSAvIDM1O1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAncm91bmQtaGV4YWdvbicpIHtcbiAgICAgICAgICBzTXVsdCA9IChiV2lkdGggKyBvdXRsaW5lT2Zmc2V0ICsgb3V0bGluZVdpZHRoKSAqIDEuMTI7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdyb3VuZC1wZW50YWdvbicpIHtcbiAgICAgICAgICBzTXVsdCA9IChiV2lkdGggKyBvdXRsaW5lT2Zmc2V0ICsgb3V0bGluZVdpZHRoKSAqIDEuMTM7XG4gICAgICAgICAgb2Zmc2V0WSA9IC0oYldpZHRoIC8gMiArIG91dGxpbmVPZmZzZXQgKyBvdXRsaW5lV2lkdGgpIC8gMTU7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdyb3VuZC10YWcnKSB7XG4gICAgICAgICAgc011bHQgPSAoYldpZHRoICsgb3V0bGluZU9mZnNldCArIG91dGxpbmVXaWR0aCkgKiAxLjEyO1xuICAgICAgICAgIG9mZnNldFggPSAoYldpZHRoIC8gMiArIG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQpICogLjA3O1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAncm91bmQtdHJpYW5nbGUnKSB7XG4gICAgICAgICAgc011bHQgPSAoYldpZHRoICsgb3V0bGluZU9mZnNldCArIG91dGxpbmVXaWR0aCkgKiAoTWF0aC5QSSAvIDIpO1xuICAgICAgICAgIG9mZnNldFkgPSAtKGJXaWR0aCArIG91dGxpbmVPZmZzZXQgLyAyICsgb3V0bGluZVdpZHRoKSAvIE1hdGguUEk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNNdWx0ICE9PSAwKSB7XG4gICAgICAgICAgc2NhbGVYID0gKG5vZGVXaWR0aCArIHNNdWx0KSAvIG5vZGVXaWR0aDtcbiAgICAgICAgICBzV2lkdGggPSBub2RlV2lkdGggKiBzY2FsZVg7XG4gICAgICAgICAgaWYgKCFbJ3JvdW5kLWhleGFnb24nLCAncm91bmQtdGFnJ10uaW5jbHVkZXMoc2hhcGUpKSB7XG4gICAgICAgICAgICBzY2FsZVkgPSAobm9kZUhlaWdodCArIHNNdWx0KSAvIG5vZGVIZWlnaHQ7XG4gICAgICAgICAgICBzSGVpZ2h0ID0gbm9kZUhlaWdodCAqIHNjYWxlWTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29ybmVyUmFkaXVzID0gY29ybmVyUmFkaXVzID09PSAnYXV0bycgPyBnZXRSb3VuZFBvbHlnb25SYWRpdXMoc1dpZHRoLCBzSGVpZ2h0KSA6IGNvcm5lclJhZGl1cztcbiAgICAgICAgdmFyIGhhbGZXID0gc1dpZHRoIC8gMjtcbiAgICAgICAgdmFyIGhhbGZIID0gc0hlaWdodCAvIDI7XG4gICAgICAgIHZhciByYWRpdXMgPSBjb3JuZXJSYWRpdXMgKyAoYldpZHRoICsgb3V0bGluZVdpZHRoICsgb3V0bGluZU9mZnNldCkgLyAyO1xuICAgICAgICB2YXIgcCA9IG5ldyBBcnJheShwb2ludHMubGVuZ3RoIC8gMik7XG4gICAgICAgIHZhciBjb3JuZXJzID0gbmV3IEFycmF5KHBvaW50cy5sZW5ndGggLyAyKTtcbiAgICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgcG9pbnRzLmxlbmd0aCAvIDI7IF9pMysrKSB7XG4gICAgICAgICAgcFtfaTNdID0ge1xuICAgICAgICAgICAgeDogbnBvcy54ICsgb2Zmc2V0WCArIGhhbGZXICogcG9pbnRzW19pMyAqIDJdLFxuICAgICAgICAgICAgeTogbnBvcy55ICsgb2Zmc2V0WSArIGhhbGZIICogcG9pbnRzW19pMyAqIDIgKyAxXVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9pMixcbiAgICAgICAgICBwMSxcbiAgICAgICAgICBwMixcbiAgICAgICAgICBwMyxcbiAgICAgICAgICBsZW4gPSBwLmxlbmd0aDtcbiAgICAgICAgcDEgPSBwW2xlbiAtIDFdO1xuICAgICAgICAvLyBmb3IgZWFjaCBwb2ludFxuICAgICAgICBmb3IgKF9pMiA9IDA7IF9pMiA8IGxlbjsgX2kyKyspIHtcbiAgICAgICAgICBwMiA9IHBbX2kyICUgbGVuXTtcbiAgICAgICAgICBwMyA9IHBbKF9pMiArIDEpICUgbGVuXTtcbiAgICAgICAgICBjb3JuZXJzW19pMl0gPSBnZXRSb3VuZENvcm5lcihwMSwgcDIsIHAzLCByYWRpdXMpO1xuICAgICAgICAgIHAxID0gcDI7XG4gICAgICAgICAgcDIgPSBwMztcbiAgICAgICAgfVxuICAgICAgICByLmRyYXdSb3VuZFBvbHlnb25QYXRoKF9wYXRoIHx8IGNvbnRleHQsIG5wb3MueCArIG9mZnNldFgsIG5wb3MueSArIG9mZnNldFksIG5vZGVXaWR0aCAqIHNjYWxlWCwgbm9kZUhlaWdodCAqIHNjYWxlWSwgcG9pbnRzLCBjb3JuZXJzKTtcbiAgICAgIH0gZWxzZSBpZiAoWydyb3VuZHJlY3RhbmdsZScsICdyb3VuZC1yZWN0YW5nbGUnXS5pbmNsdWRlcyhzaGFwZSkpIHtcbiAgICAgICAgY29ybmVyUmFkaXVzID0gY29ybmVyUmFkaXVzID09PSAnYXV0bycgPyBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyhzV2lkdGgsIHNIZWlnaHQpIDogY29ybmVyUmFkaXVzO1xuICAgICAgICByLmRyYXdSb3VuZFJlY3RhbmdsZVBhdGgoX3BhdGggfHwgY29udGV4dCwgbnBvcy54LCBucG9zLnksIHNXaWR0aCwgc0hlaWdodCwgY29ybmVyUmFkaXVzICsgKGJXaWR0aCArIG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQpIC8gMik7XG4gICAgICB9IGVsc2UgaWYgKFsnY3V0cmVjdGFuZ2xlJywgJ2N1dC1yZWN0YW5nbGUnXS5pbmNsdWRlcyhzaGFwZSkpIHtcbiAgICAgICAgY29ybmVyUmFkaXVzID0gY29ybmVyUmFkaXVzID09PSAnYXV0bycgPyBnZXRDdXRSZWN0YW5nbGVDb3JuZXJMZW5ndGgoKSA6IGNvcm5lclJhZGl1cztcbiAgICAgICAgci5kcmF3Q3V0UmVjdGFuZ2xlUGF0aChfcGF0aCB8fCBjb250ZXh0LCBucG9zLngsIG5wb3MueSwgc1dpZHRoLCBzSGVpZ2h0LCBudWxsLCBjb3JuZXJSYWRpdXMgKyAoYldpZHRoICsgb3V0bGluZVdpZHRoICsgb3V0bGluZU9mZnNldCkgLyA0KTtcbiAgICAgIH0gZWxzZSBpZiAoWydib3R0b21yb3VuZHJlY3RhbmdsZScsICdib3R0b20tcm91bmQtcmVjdGFuZ2xlJ10uaW5jbHVkZXMoc2hhcGUpKSB7XG4gICAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMoc1dpZHRoLCBzSGVpZ2h0KSA6IGNvcm5lclJhZGl1cztcbiAgICAgICAgci5kcmF3Qm90dG9tUm91bmRSZWN0YW5nbGVQYXRoKF9wYXRoIHx8IGNvbnRleHQsIG5wb3MueCwgbnBvcy55LCBzV2lkdGgsIHNIZWlnaHQsIGNvcm5lclJhZGl1cyArIChiV2lkdGggKyBvdXRsaW5lV2lkdGggKyBvdXRsaW5lT2Zmc2V0KSAvIDIpO1xuICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gXCJiYXJyZWxcIikge1xuICAgICAgICByLmRyYXdCYXJyZWxQYXRoKF9wYXRoIHx8IGNvbnRleHQsIG5wb3MueCwgbnBvcy55LCBzV2lkdGgsIHNIZWlnaHQpO1xuICAgICAgfSBlbHNlIGlmIChzaGFwZS5zdGFydHNXaXRoKFwicG9seWdvblwiKSB8fCBbJ3Job21ib2lkJywgJ3JpZ2h0LXJob21ib2lkJywgJ3JvdW5kLXRhZycsICd0YWcnLCAndmVlJ10uaW5jbHVkZXMoc2hhcGUpKSB7XG4gICAgICAgIHZhciBwYWQgPSAoYldpZHRoICsgb3V0bGluZVdpZHRoICsgb3V0bGluZU9mZnNldCkgLyBub2RlV2lkdGg7XG4gICAgICAgIHBvaW50cyA9IGpvaW5MaW5lcyhleHBhbmRQb2x5Z29uKHBvaW50cywgcGFkKSk7XG4gICAgICAgIHIuZHJhd1BvbHlnb25QYXRoKF9wYXRoIHx8IGNvbnRleHQsIG5wb3MueCwgbnBvcy55LCBub2RlV2lkdGgsIG5vZGVIZWlnaHQsIHBvaW50cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgX3BhZCA9IChiV2lkdGggKyBvdXRsaW5lV2lkdGggKyBvdXRsaW5lT2Zmc2V0KSAvIG5vZGVXaWR0aDtcbiAgICAgICAgcG9pbnRzID0gam9pbkxpbmVzKGV4cGFuZFBvbHlnb24ocG9pbnRzLCAtX3BhZCkpO1xuICAgICAgICByLmRyYXdQb2x5Z29uUGF0aChfcGF0aCB8fCBjb250ZXh0LCBucG9zLngsIG5wb3MueSwgbm9kZVdpZHRoLCBub2RlSGVpZ2h0LCBwb2ludHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKF9wYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICB9XG4gICAgICBpZiAob3V0bGluZVN0eWxlID09PSAnZG91YmxlJykge1xuICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGJXaWR0aCAvIDM7XG4gICAgICAgIHZhciBnY28gPSBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbjtcbiAgICAgICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnZGVzdGluYXRpb24tb3V0JztcbiAgICAgICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAgICAgY29udGV4dC5zdHJva2UoX3BhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBnY287XG4gICAgICB9XG5cbiAgICAgIC8vIHJlc2V0IGluIGNhc2Ugd2UgY2hhbmdlZCB0aGUgYm9yZGVyIHN0eWxlXG4gICAgICBpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgZHJhd092ZXJsYXkgPSBmdW5jdGlvbiBkcmF3T3ZlcmxheSgpIHtcbiAgICBpZiAoc2hvdWxkRHJhd092ZXJsYXkpIHtcbiAgICAgIHIuZHJhd05vZGVPdmVybGF5KGNvbnRleHQsIG5vZGUsIHBvcywgbm9kZVdpZHRoLCBub2RlSGVpZ2h0KTtcbiAgICB9XG4gIH07XG4gIHZhciBkcmF3VW5kZXJsYXkgPSBmdW5jdGlvbiBkcmF3VW5kZXJsYXkoKSB7XG4gICAgaWYgKHNob3VsZERyYXdPdmVybGF5KSB7XG4gICAgICByLmRyYXdOb2RlVW5kZXJsYXkoY29udGV4dCwgbm9kZSwgcG9zLCBub2RlV2lkdGgsIG5vZGVIZWlnaHQpO1xuICAgIH1cbiAgfTtcbiAgdmFyIGRyYXdUZXh0ID0gZnVuY3Rpb24gZHJhd1RleHQoKSB7XG4gICAgci5kcmF3RWxlbWVudFRleHQoY29udGV4dCwgbm9kZSwgbnVsbCwgZHJhd0xhYmVsKTtcbiAgfTtcbiAgdmFyIGdob3N0ID0gbm9kZS5wc3R5bGUoJ2dob3N0JykudmFsdWUgPT09ICd5ZXMnO1xuICBpZiAoZ2hvc3QpIHtcbiAgICB2YXIgZ3ggPSBub2RlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXgnKS5wZlZhbHVlO1xuICAgIHZhciBneSA9IG5vZGUucHN0eWxlKCdnaG9zdC1vZmZzZXQteScpLnBmVmFsdWU7XG4gICAgdmFyIGdob3N0T3BhY2l0eSA9IG5vZGUucHN0eWxlKCdnaG9zdC1vcGFjaXR5JykudmFsdWU7XG4gICAgdmFyIGVmZkdob3N0T3BhY2l0eSA9IGdob3N0T3BhY2l0eSAqIGVsZU9wYWNpdHk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoZ3gsIGd5KTtcbiAgICBzZXR1cE91dGxpbmVDb2xvcigpO1xuICAgIGRyYXdPdXRsaW5lKCk7XG4gICAgc2V0dXBTaGFwZUNvbG9yKGdob3N0T3BhY2l0eSAqIGJnT3BhY2l0eSk7XG4gICAgZHJhd1NoYXBlKCk7XG4gICAgZHJhd0ltYWdlcyhlZmZHaG9zdE9wYWNpdHksIHRydWUpO1xuICAgIHNldHVwQm9yZGVyQ29sb3IoZ2hvc3RPcGFjaXR5ICogYm9yZGVyT3BhY2l0eSk7XG4gICAgZHJhd0JvcmRlcigpO1xuICAgIGRyYXdQaWUoZGFya25lc3MgIT09IDAgfHwgYm9yZGVyV2lkdGggIT09IDApO1xuICAgIGRyYXdJbWFnZXMoZWZmR2hvc3RPcGFjaXR5LCBmYWxzZSk7XG4gICAgZGFya2VuKGVmZkdob3N0T3BhY2l0eSk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWd4LCAtZ3kpO1xuICB9XG4gIGlmICh1c2VQYXRocykge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC1wb3MueCwgLXBvcy55KTtcbiAgfVxuICBkcmF3VW5kZXJsYXkoKTtcbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgY29udGV4dC50cmFuc2xhdGUocG9zLngsIHBvcy55KTtcbiAgfVxuICBzZXR1cE91dGxpbmVDb2xvcigpO1xuICBkcmF3T3V0bGluZSgpO1xuICBzZXR1cFNoYXBlQ29sb3IoKTtcbiAgZHJhd1NoYXBlKCk7XG4gIGRyYXdJbWFnZXMoZWxlT3BhY2l0eSwgdHJ1ZSk7XG4gIHNldHVwQm9yZGVyQ29sb3IoKTtcbiAgZHJhd0JvcmRlcigpO1xuICBkcmF3UGllKGRhcmtuZXNzICE9PSAwIHx8IGJvcmRlcldpZHRoICE9PSAwKTtcbiAgZHJhd0ltYWdlcyhlbGVPcGFjaXR5LCBmYWxzZSk7XG4gIGRhcmtlbigpO1xuICBpZiAodXNlUGF0aHMpIHtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgtcG9zLngsIC1wb3MueSk7XG4gIH1cbiAgZHJhd1RleHQoKTtcbiAgZHJhd092ZXJsYXkoKTtcblxuICAvL1xuICAvLyBjbGVhbiB1cCBzaGlmdFxuXG4gIGlmIChzaGlmdFRvT3JpZ2luV2l0aEJiKSB7XG4gICAgY29udGV4dC50cmFuc2xhdGUoYmIueDEsIGJiLnkxKTtcbiAgfVxufTtcbnZhciBkcmF3Tm9kZU92ZXJsYXlVbmRlcmxheSA9IGZ1bmN0aW9uIGRyYXdOb2RlT3ZlcmxheVVuZGVybGF5KG92ZXJsYXlPclVuZGVybGF5KSB7XG4gIGlmICghWydvdmVybGF5JywgJ3VuZGVybGF5J10uaW5jbHVkZXMob3ZlcmxheU9yVW5kZXJsYXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0YXRlJyk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIChjb250ZXh0LCBub2RlLCBwb3MsIG5vZGVXaWR0aCwgbm9kZUhlaWdodCkge1xuICAgIHZhciByID0gdGhpcztcbiAgICBpZiAoIW5vZGUudmlzaWJsZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBwYWRkaW5nID0gbm9kZS5wc3R5bGUoXCJcIi5jb25jYXQob3ZlcmxheU9yVW5kZXJsYXksIFwiLXBhZGRpbmdcIikpLnBmVmFsdWU7XG4gICAgdmFyIG9wYWNpdHkgPSBub2RlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItb3BhY2l0eVwiKSkudmFsdWU7XG4gICAgdmFyIGNvbG9yID0gbm9kZS5wc3R5bGUoXCJcIi5jb25jYXQob3ZlcmxheU9yVW5kZXJsYXksIFwiLWNvbG9yXCIpKS52YWx1ZTtcbiAgICB2YXIgc2hhcGUgPSBub2RlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItc2hhcGVcIikpLnZhbHVlO1xuICAgIHZhciByYWRpdXMgPSBub2RlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItY29ybmVyLXJhZGl1c1wiKSkudmFsdWU7XG4gICAgaWYgKG9wYWNpdHkgPiAwKSB7XG4gICAgICBwb3MgPSBwb3MgfHwgbm9kZS5wb3NpdGlvbigpO1xuICAgICAgaWYgKG5vZGVXaWR0aCA9PSBudWxsIHx8IG5vZGVIZWlnaHQgPT0gbnVsbCkge1xuICAgICAgICB2YXIgX3BhZGRpbmcgPSBub2RlLnBhZGRpbmcoKTtcbiAgICAgICAgbm9kZVdpZHRoID0gbm9kZS53aWR0aCgpICsgMiAqIF9wYWRkaW5nO1xuICAgICAgICBub2RlSGVpZ2h0ID0gbm9kZS5oZWlnaHQoKSArIDIgKiBfcGFkZGluZztcbiAgICAgIH1cbiAgICAgIHIuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gICAgICByLm5vZGVTaGFwZXNbc2hhcGVdLmRyYXcoY29udGV4dCwgcG9zLngsIHBvcy55LCBub2RlV2lkdGggKyBwYWRkaW5nICogMiwgbm9kZUhlaWdodCArIHBhZGRpbmcgKiAyLCByYWRpdXMpO1xuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgfVxuICB9O1xufTtcbkNScCQ1LmRyYXdOb2RlT3ZlcmxheSA9IGRyYXdOb2RlT3ZlcmxheVVuZGVybGF5KCdvdmVybGF5Jyk7XG5DUnAkNS5kcmF3Tm9kZVVuZGVybGF5ID0gZHJhd05vZGVPdmVybGF5VW5kZXJsYXkoJ3VuZGVybGF5Jyk7XG5cbi8vIGRvZXMgdGhlIG5vZGUgaGF2ZSBhdCBsZWFzdCBvbmUgcGllIHBpZWNlP1xuQ1JwJDUuaGFzUGllID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgbm9kZSA9IG5vZGVbMF07IC8vIGVuc3VyZSBlbGUgcmVmXG5cbiAgcmV0dXJuIG5vZGUuX3ByaXZhdGUuaGFzUGllO1xufTtcbkNScCQ1LmRyYXdQaWUgPSBmdW5jdGlvbiAoY29udGV4dCwgbm9kZSwgbm9kZU9wYWNpdHksIHBvcykge1xuICBub2RlID0gbm9kZVswXTsgLy8gZW5zdXJlIGVsZSByZWZcbiAgcG9zID0gcG9zIHx8IG5vZGUucG9zaXRpb24oKTtcbiAgdmFyIGN5U3R5bGUgPSBub2RlLmN5KCkuc3R5bGUoKTtcbiAgdmFyIHBpZVNpemUgPSBub2RlLnBzdHlsZSgncGllLXNpemUnKTtcbiAgdmFyIHggPSBwb3MueDtcbiAgdmFyIHkgPSBwb3MueTtcbiAgdmFyIG5vZGVXID0gbm9kZS53aWR0aCgpO1xuICB2YXIgbm9kZUggPSBub2RlLmhlaWdodCgpO1xuICB2YXIgcmFkaXVzID0gTWF0aC5taW4obm9kZVcsIG5vZGVIKSAvIDI7IC8vIG11c3QgZml0IGluIG5vZGVcbiAgdmFyIGxhc3RQZXJjZW50ID0gMDsgLy8gd2hhdCAlIHRvIGNvbnRpbnVlIGRyYXdpbmcgcGllIHNsaWNlcyBmcm9tIG9uIFswLCAxXVxuICB2YXIgdXNlUGF0aHMgPSB0aGlzLnVzZVBhdGhzKCk7XG4gIGlmICh1c2VQYXRocykge1xuICAgIHggPSAwO1xuICAgIHkgPSAwO1xuICB9XG4gIGlmIChwaWVTaXplLnVuaXRzID09PSAnJScpIHtcbiAgICByYWRpdXMgPSByYWRpdXMgKiBwaWVTaXplLnBmVmFsdWU7XG4gIH0gZWxzZSBpZiAocGllU2l6ZS5wZlZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByYWRpdXMgPSBwaWVTaXplLnBmVmFsdWUgLyAyO1xuICB9XG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IGN5U3R5bGUucGllQmFja2dyb3VuZE47IGkrKykge1xuICAgIC8vIDEuLk5cbiAgICB2YXIgc2l6ZSA9IG5vZGUucHN0eWxlKCdwaWUtJyArIGkgKyAnLWJhY2tncm91bmQtc2l6ZScpLnZhbHVlO1xuICAgIHZhciBjb2xvciA9IG5vZGUucHN0eWxlKCdwaWUtJyArIGkgKyAnLWJhY2tncm91bmQtY29sb3InKS52YWx1ZTtcbiAgICB2YXIgb3BhY2l0eSA9IG5vZGUucHN0eWxlKCdwaWUtJyArIGkgKyAnLWJhY2tncm91bmQtb3BhY2l0eScpLnZhbHVlICogbm9kZU9wYWNpdHk7XG4gICAgdmFyIHBlcmNlbnQgPSBzaXplIC8gMTAwOyAvLyBtYXAgaW50ZWdlciByYW5nZSBbMCwgMTAwXSB0byBbMCwgMV1cblxuICAgIC8vIHBlcmNlbnQgY2FuJ3QgcHVzaCBiZXlvbmQgMVxuICAgIGlmIChwZXJjZW50ICsgbGFzdFBlcmNlbnQgPiAxKSB7XG4gICAgICBwZXJjZW50ID0gMSAtIGxhc3RQZXJjZW50O1xuICAgIH1cbiAgICB2YXIgYW5nbGVTdGFydCA9IDEuNSAqIE1hdGguUEkgKyAyICogTWF0aC5QSSAqIGxhc3RQZXJjZW50OyAvLyBzdGFydCBhdCAxMiBvJ2Nsb2NrIGFuZCBnbyBjbG9ja3dpc2VcbiAgICB2YXIgYW5nbGVEZWx0YSA9IDIgKiBNYXRoLlBJICogcGVyY2VudDtcbiAgICB2YXIgYW5nbGVFbmQgPSBhbmdsZVN0YXJ0ICsgYW5nbGVEZWx0YTtcblxuICAgIC8vIGlnbm9yZSBpZlxuICAgIC8vIC0gemVybyBzaXplXG4gICAgLy8gLSB3ZSdyZSBhbHJlYWR5IGJleW9uZCB0aGUgZnVsbCBjaXJjbGVcbiAgICAvLyAtIGFkZGluZyB0aGUgY3VycmVudCBzbGljZSB3b3VsZCBnbyBiZXlvbmQgdGhlIGZ1bGwgY2lyY2xlXG4gICAgaWYgKHNpemUgPT09IDAgfHwgbGFzdFBlcmNlbnQgPj0gMSB8fCBsYXN0UGVyY2VudCArIHBlcmNlbnQgPiAxKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0Lm1vdmVUbyh4LCB5KTtcbiAgICBjb250ZXh0LmFyYyh4LCB5LCByYWRpdXMsIGFuZ2xlU3RhcnQsIGFuZ2xlRW5kKTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gICAgY29udGV4dC5maWxsKCk7XG4gICAgbGFzdFBlcmNlbnQgKz0gcGVyY2VudDtcbiAgfVxufTtcblxudmFyIENScCQ0ID0ge307XG52YXIgbW90aW9uQmx1ckRlbGF5ID0gMTAwO1xuXG4vLyB2YXIgaXNGaXJlZm94ID0gdHlwZW9mIEluc3RhbGxUcmlnZ2VyICE9PSAndW5kZWZpbmVkJztcblxuQ1JwJDQuZ2V0UGl4ZWxSYXRpbyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNvbnRleHQgPSB0aGlzLmRhdGEuY29udGV4dHNbMF07XG4gIGlmICh0aGlzLmZvcmNlZFBpeGVsUmF0aW8gIT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLmZvcmNlZFBpeGVsUmF0aW87XG4gIH1cbiAgdmFyIGJhY2tpbmdTdG9yZSA9IGNvbnRleHQuYmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjb250ZXh0LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY29udGV4dC5tb3pCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IGNvbnRleHQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IGNvbnRleHQub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY29udGV4dC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IDE7XG4gIHJldHVybiAod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSkgLyBiYWNraW5nU3RvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbn07XG5cbkNScCQ0LnBhaW50Q2FjaGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICB2YXIgY2FjaGVzID0gdGhpcy5wYWludENhY2hlcyA9IHRoaXMucGFpbnRDYWNoZXMgfHwgW107XG4gIHZhciBuZWVkVG9DcmVhdGVDYWNoZSA9IHRydWU7XG4gIHZhciBjYWNoZTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjYWNoZSA9IGNhY2hlc1tpXTtcbiAgICBpZiAoY2FjaGUuY29udGV4dCA9PT0gY29udGV4dCkge1xuICAgICAgbmVlZFRvQ3JlYXRlQ2FjaGUgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAobmVlZFRvQ3JlYXRlQ2FjaGUpIHtcbiAgICBjYWNoZSA9IHtcbiAgICAgIGNvbnRleHQ6IGNvbnRleHRcbiAgICB9O1xuICAgIGNhY2hlcy5wdXNoKGNhY2hlKTtcbiAgfVxuICByZXR1cm4gY2FjaGU7XG59O1xuQ1JwJDQuY3JlYXRlR3JhZGllbnRTdHlsZUZvciA9IGZ1bmN0aW9uIChjb250ZXh0LCBzaGFwZVN0eWxlTmFtZSwgZWxlLCBmaWxsLCBvcGFjaXR5KSB7XG4gIHZhciBncmFkaWVudFN0eWxlO1xuICB2YXIgdXNlUGF0aHMgPSB0aGlzLnVzZVBhdGhzKCk7XG4gIHZhciBjb2xvcnMgPSBlbGUucHN0eWxlKHNoYXBlU3R5bGVOYW1lICsgJy1ncmFkaWVudC1zdG9wLWNvbG9ycycpLnZhbHVlLFxuICAgIHBvc2l0aW9ucyA9IGVsZS5wc3R5bGUoc2hhcGVTdHlsZU5hbWUgKyAnLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJykucGZWYWx1ZTtcbiAgaWYgKGZpbGwgPT09ICdyYWRpYWwtZ3JhZGllbnQnKSB7XG4gICAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgICAgdmFyIHN0YXJ0ID0gZWxlLnNvdXJjZUVuZHBvaW50KCksXG4gICAgICAgIGVuZCA9IGVsZS50YXJnZXRFbmRwb2ludCgpLFxuICAgICAgICBtaWQgPSBlbGUubWlkcG9pbnQoKTtcbiAgICAgIHZhciBkMSA9IGRpc3Qoc3RhcnQsIG1pZCk7XG4gICAgICB2YXIgZDIgPSBkaXN0KGVuZCwgbWlkKTtcbiAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZVJhZGlhbEdyYWRpZW50KG1pZC54LCBtaWQueSwgMCwgbWlkLngsIG1pZC55LCBNYXRoLm1heChkMSwgZDIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHBvcyA9IHVzZVBhdGhzID8ge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9IDogZWxlLnBvc2l0aW9uKCksXG4gICAgICAgIHdpZHRoID0gZWxlLnBhZGRlZFdpZHRoKCksXG4gICAgICAgIGhlaWdodCA9IGVsZS5wYWRkZWRIZWlnaHQoKTtcbiAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZVJhZGlhbEdyYWRpZW50KHBvcy54LCBwb3MueSwgMCwgcG9zLngsIHBvcy55LCBNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICAgIHZhciBfc3RhcnQgPSBlbGUuc291cmNlRW5kcG9pbnQoKSxcbiAgICAgICAgX2VuZCA9IGVsZS50YXJnZXRFbmRwb2ludCgpO1xuICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3N0YXJ0LngsIF9zdGFydC55LCBfZW5kLngsIF9lbmQueSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfcG9zID0gdXNlUGF0aHMgPyB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH0gOiBlbGUucG9zaXRpb24oKSxcbiAgICAgICAgX3dpZHRoID0gZWxlLnBhZGRlZFdpZHRoKCksXG4gICAgICAgIF9oZWlnaHQgPSBlbGUucGFkZGVkSGVpZ2h0KCksXG4gICAgICAgIGhhbGZXaWR0aCA9IF93aWR0aCAvIDIsXG4gICAgICAgIGhhbGZIZWlnaHQgPSBfaGVpZ2h0IC8gMjtcbiAgICAgIHZhciBkaXJlY3Rpb24gPSBlbGUucHN0eWxlKCdiYWNrZ3JvdW5kLWdyYWRpZW50LWRpcmVjdGlvbicpLnZhbHVlO1xuICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgICAgY2FzZSAndG8tYm90dG9tJzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLngsIF9wb3MueSAtIGhhbGZIZWlnaHQsIF9wb3MueCwgX3Bvcy55ICsgaGFsZkhlaWdodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvLXRvcCc6XG4gICAgICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3Bvcy54LCBfcG9zLnkgKyBoYWxmSGVpZ2h0LCBfcG9zLngsIF9wb3MueSAtIGhhbGZIZWlnaHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0by1sZWZ0JzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSwgX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0by1yaWdodCc6XG4gICAgICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnksIF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG8tYm90dG9tLXJpZ2h0JzpcbiAgICAgICAgY2FzZSAndG8tcmlnaHQtYm90dG9tJzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggLSBoYWxmV2lkdGgsIF9wb3MueSAtIGhhbGZIZWlnaHQsIF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55ICsgaGFsZkhlaWdodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvLXRvcC1yaWdodCc6XG4gICAgICAgIGNhc2UgJ3RvLXJpZ2h0LXRvcCc6XG4gICAgICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkgKyBoYWxmSGVpZ2h0LCBfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSAtIGhhbGZIZWlnaHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0by1ib3R0b20tbGVmdCc6XG4gICAgICAgIGNhc2UgJ3RvLWxlZnQtYm90dG9tJzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSAtIGhhbGZIZWlnaHQsIF9wb3MueCAtIGhhbGZXaWR0aCwgX3Bvcy55ICsgaGFsZkhlaWdodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvLXRvcC1sZWZ0JzpcbiAgICAgICAgY2FzZSAndG8tbGVmdC10b3AnOlxuICAgICAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55ICsgaGFsZkhlaWdodCwgX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkgLSBoYWxmSGVpZ2h0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCFncmFkaWVudFN0eWxlKSByZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBncmFkaWVudCBzdHlsZVxuXG4gIHZhciBoYXNQb3NpdGlvbnMgPSBwb3NpdGlvbnMubGVuZ3RoID09PSBjb2xvcnMubGVuZ3RoO1xuICB2YXIgbGVuZ3RoID0gY29sb3JzLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGdyYWRpZW50U3R5bGUuYWRkQ29sb3JTdG9wKGhhc1Bvc2l0aW9ucyA/IHBvc2l0aW9uc1tpXSA6IGkgLyAobGVuZ3RoIC0gMSksICdyZ2JhKCcgKyBjb2xvcnNbaV1bMF0gKyAnLCcgKyBjb2xvcnNbaV1bMV0gKyAnLCcgKyBjb2xvcnNbaV1bMl0gKyAnLCcgKyBvcGFjaXR5ICsgJyknKTtcbiAgfVxuICByZXR1cm4gZ3JhZGllbnRTdHlsZTtcbn07XG5DUnAkNC5ncmFkaWVudEZpbGxTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIGZpbGwsIG9wYWNpdHkpIHtcbiAgdmFyIGdyYWRpZW50U3R5bGUgPSB0aGlzLmNyZWF0ZUdyYWRpZW50U3R5bGVGb3IoY29udGV4dCwgJ2JhY2tncm91bmQnLCBlbGUsIGZpbGwsIG9wYWNpdHkpO1xuICBpZiAoIWdyYWRpZW50U3R5bGUpIHJldHVybiBudWxsOyAvLyBlcnJvclxuICBjb250ZXh0LmZpbGxTdHlsZSA9IGdyYWRpZW50U3R5bGU7XG59O1xuQ1JwJDQuY29sb3JGaWxsU3R5bGUgPSBmdW5jdGlvbiAoY29udGV4dCwgciwgZywgYiwgYSkge1xuICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKCcgKyByICsgJywnICsgZyArICcsJyArIGIgKyAnLCcgKyBhICsgJyknO1xuICAvLyB0dXJuIG9mZiBmb3Igbm93LCBzZWVtcyBjb250ZXh0IGRvZXMgaXRzIG93biBjYWNoaW5nXG5cbiAgLy8gdmFyIGNhY2hlID0gdGhpcy5wYWludENhY2hlKGNvbnRleHQpO1xuXG4gIC8vIHZhciBmaWxsU3R5bGUgPSAncmdiYSgnICsgciArICcsJyArIGcgKyAnLCcgKyBiICsgJywnICsgYSArICcpJztcblxuICAvLyBpZiggY2FjaGUuZmlsbFN0eWxlICE9PSBmaWxsU3R5bGUgKXtcbiAgLy8gICBjb250ZXh0LmZpbGxTdHlsZSA9IGNhY2hlLmZpbGxTdHlsZSA9IGZpbGxTdHlsZTtcbiAgLy8gfVxufTtcblxuQ1JwJDQuZWxlRmlsbFN0eWxlID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgb3BhY2l0eSkge1xuICB2YXIgYmFja2dyb3VuZEZpbGwgPSBlbGUucHN0eWxlKCdiYWNrZ3JvdW5kLWZpbGwnKS52YWx1ZTtcbiAgaWYgKGJhY2tncm91bmRGaWxsID09PSAnbGluZWFyLWdyYWRpZW50JyB8fCBiYWNrZ3JvdW5kRmlsbCA9PT0gJ3JhZGlhbC1ncmFkaWVudCcpIHtcbiAgICB0aGlzLmdyYWRpZW50RmlsbFN0eWxlKGNvbnRleHQsIGVsZSwgYmFja2dyb3VuZEZpbGwsIG9wYWNpdHkpO1xuICB9IGVsc2Uge1xuICAgIHZhciBiYWNrZ3JvdW5kQ29sb3IgPSBlbGUucHN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJykudmFsdWU7XG4gICAgdGhpcy5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBiYWNrZ3JvdW5kQ29sb3JbMF0sIGJhY2tncm91bmRDb2xvclsxXSwgYmFja2dyb3VuZENvbG9yWzJdLCBvcGFjaXR5KTtcbiAgfVxufTtcbkNScCQ0LmdyYWRpZW50U3Ryb2tlU3R5bGUgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBmaWxsLCBvcGFjaXR5KSB7XG4gIHZhciBncmFkaWVudFN0eWxlID0gdGhpcy5jcmVhdGVHcmFkaWVudFN0eWxlRm9yKGNvbnRleHQsICdsaW5lJywgZWxlLCBmaWxsLCBvcGFjaXR5KTtcbiAgaWYgKCFncmFkaWVudFN0eWxlKSByZXR1cm4gbnVsbDsgLy8gZXJyb3JcbiAgY29udGV4dC5zdHJva2VTdHlsZSA9IGdyYWRpZW50U3R5bGU7XG59O1xuQ1JwJDQuY29sb3JTdHJva2VTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCByLCBnLCBiLCBhKSB7XG4gIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmdiYSgnICsgciArICcsJyArIGcgKyAnLCcgKyBiICsgJywnICsgYSArICcpJztcbiAgLy8gdHVybiBvZmYgZm9yIG5vdywgc2VlbXMgY29udGV4dCBkb2VzIGl0cyBvd24gY2FjaGluZ1xuXG4gIC8vIHZhciBjYWNoZSA9IHRoaXMucGFpbnRDYWNoZShjb250ZXh0KTtcblxuICAvLyB2YXIgc3Ryb2tlU3R5bGUgPSAncmdiYSgnICsgciArICcsJyArIGcgKyAnLCcgKyBiICsgJywnICsgYSArICcpJztcblxuICAvLyBpZiggY2FjaGUuc3Ryb2tlU3R5bGUgIT09IHN0cm9rZVN0eWxlICl7XG4gIC8vICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGNhY2hlLnN0cm9rZVN0eWxlID0gc3Ryb2tlU3R5bGU7XG4gIC8vIH1cbn07XG5cbkNScCQ0LmVsZVN0cm9rZVN0eWxlID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgb3BhY2l0eSkge1xuICB2YXIgbGluZUZpbGwgPSBlbGUucHN0eWxlKCdsaW5lLWZpbGwnKS52YWx1ZTtcbiAgaWYgKGxpbmVGaWxsID09PSAnbGluZWFyLWdyYWRpZW50JyB8fCBsaW5lRmlsbCA9PT0gJ3JhZGlhbC1ncmFkaWVudCcpIHtcbiAgICB0aGlzLmdyYWRpZW50U3Ryb2tlU3R5bGUoY29udGV4dCwgZWxlLCBsaW5lRmlsbCwgb3BhY2l0eSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxpbmVDb2xvciA9IGVsZS5wc3R5bGUoJ2xpbmUtY29sb3InKS52YWx1ZTtcbiAgICB0aGlzLmNvbG9yU3Ryb2tlU3R5bGUoY29udGV4dCwgbGluZUNvbG9yWzBdLCBsaW5lQ29sb3JbMV0sIGxpbmVDb2xvclsyXSwgb3BhY2l0eSk7XG4gIH1cbn07XG5cbi8vIFJlc2l6ZSBjYW52YXNcbkNScCQ0Lm1hdGNoQ2FudmFzU2l6ZSA9IGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgZGF0YSA9IHIuZGF0YTtcbiAgdmFyIGJiID0gci5maW5kQ29udGFpbmVyQ2xpZW50Q29vcmRzKCk7XG4gIHZhciB3aWR0aCA9IGJiWzJdO1xuICB2YXIgaGVpZ2h0ID0gYmJbM107XG4gIHZhciBwaXhlbFJhdGlvID0gci5nZXRQaXhlbFJhdGlvKCk7XG4gIHZhciBtYlB4UmF0aW8gPSByLm1vdGlvbkJsdXJQeFJhdGlvO1xuICBpZiAoY29udGFpbmVyID09PSByLmRhdGEuYnVmZmVyQ2FudmFzZXNbci5NT1RJT05CTFVSX0JVRkZFUl9OT0RFXSB8fCBjb250YWluZXIgPT09IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLk1PVElPTkJMVVJfQlVGRkVSX0RSQUddKSB7XG4gICAgcGl4ZWxSYXRpbyA9IG1iUHhSYXRpbztcbiAgfVxuICB2YXIgY2FudmFzV2lkdGggPSB3aWR0aCAqIHBpeGVsUmF0aW87XG4gIHZhciBjYW52YXNIZWlnaHQgPSBoZWlnaHQgKiBwaXhlbFJhdGlvO1xuICB2YXIgY2FudmFzO1xuICBpZiAoY2FudmFzV2lkdGggPT09IHIuY2FudmFzV2lkdGggJiYgY2FudmFzSGVpZ2h0ID09PSByLmNhbnZhc0hlaWdodCkge1xuICAgIHJldHVybjsgLy8gc2F2ZSBjeWNsZXMgaWYgc2FtZVxuICB9XG5cbiAgci5mb250Q2FjaGVzID0gbnVsbDsgLy8gcmVzaXppbmcgcmVzZXRzIHRoZSBzdHlsZVxuXG4gIHZhciBjYW52YXNDb250YWluZXIgPSBkYXRhLmNhbnZhc0NvbnRhaW5lcjtcbiAgY2FudmFzQ29udGFpbmVyLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuICBjYW52YXNDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByLkNBTlZBU19MQVlFUlM7IGkrKykge1xuICAgIGNhbnZhcyA9IGRhdGEuY2FudmFzZXNbaV07XG4gICAgY2FudmFzLndpZHRoID0gY2FudmFzV2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGNhbnZhc0hlaWdodDtcbiAgICBjYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByLkJVRkZFUl9DT1VOVDsgaSsrKSB7XG4gICAgY2FudmFzID0gZGF0YS5idWZmZXJDYW52YXNlc1tpXTtcbiAgICBjYW52YXMud2lkdGggPSBjYW52YXNXaWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gY2FudmFzSGVpZ2h0O1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgfVxuICByLnRleHR1cmVNdWx0ID0gMTtcbiAgaWYgKHBpeGVsUmF0aW8gPD0gMSkge1xuICAgIGNhbnZhcyA9IGRhdGEuYnVmZmVyQ2FudmFzZXNbci5URVhUVVJFX0JVRkZFUl07XG4gICAgci50ZXh0dXJlTXVsdCA9IDI7XG4gICAgY2FudmFzLndpZHRoID0gY2FudmFzV2lkdGggKiByLnRleHR1cmVNdWx0O1xuICAgIGNhbnZhcy5oZWlnaHQgPSBjYW52YXNIZWlnaHQgKiByLnRleHR1cmVNdWx0O1xuICB9XG4gIHIuY2FudmFzV2lkdGggPSBjYW52YXNXaWR0aDtcbiAgci5jYW52YXNIZWlnaHQgPSBjYW52YXNIZWlnaHQ7XG59O1xuQ1JwJDQucmVuZGVyVG8gPSBmdW5jdGlvbiAoY3h0LCB6b29tLCBwYW4sIHB4UmF0aW8pIHtcbiAgdGhpcy5yZW5kZXIoe1xuICAgIGZvcmNlZENvbnRleHQ6IGN4dCxcbiAgICBmb3JjZWRab29tOiB6b29tLFxuICAgIGZvcmNlZFBhbjogcGFuLFxuICAgIGRyYXdBbGxMYXllcnM6IHRydWUsXG4gICAgZm9yY2VkUHhSYXRpbzogcHhSYXRpb1xuICB9KTtcbn07XG5DUnAkNC5yZW5kZXIgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCBzdGF0aWNFbXB0eU9iamVjdCgpO1xuICB2YXIgZm9yY2VkQ29udGV4dCA9IG9wdGlvbnMuZm9yY2VkQ29udGV4dDtcbiAgdmFyIGRyYXdBbGxMYXllcnMgPSBvcHRpb25zLmRyYXdBbGxMYXllcnM7XG4gIHZhciBkcmF3T25seU5vZGVMYXllciA9IG9wdGlvbnMuZHJhd09ubHlOb2RlTGF5ZXI7XG4gIHZhciBmb3JjZWRab29tID0gb3B0aW9ucy5mb3JjZWRab29tO1xuICB2YXIgZm9yY2VkUGFuID0gb3B0aW9ucy5mb3JjZWRQYW47XG4gIHZhciByID0gdGhpcztcbiAgdmFyIHBpeGVsUmF0aW8gPSBvcHRpb25zLmZvcmNlZFB4UmF0aW8gPT09IHVuZGVmaW5lZCA/IHRoaXMuZ2V0UGl4ZWxSYXRpbygpIDogb3B0aW9ucy5mb3JjZWRQeFJhdGlvO1xuICB2YXIgY3kgPSByLmN5O1xuICB2YXIgZGF0YSA9IHIuZGF0YTtcbiAgdmFyIG5lZWREcmF3ID0gZGF0YS5jYW52YXNOZWVkc1JlZHJhdztcbiAgdmFyIHRleHR1cmVEcmF3ID0gci50ZXh0dXJlT25WaWV3cG9ydCAmJiAhZm9yY2VkQ29udGV4dCAmJiAoci5waW5jaGluZyB8fCByLmhvdmVyRGF0YS5kcmFnZ2luZyB8fCByLnN3aXBlUGFubmluZyB8fCByLmRhdGEud2hlZWxab29taW5nKTtcbiAgdmFyIG1vdGlvbkJsdXIgPSBvcHRpb25zLm1vdGlvbkJsdXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubW90aW9uQmx1ciA6IHIubW90aW9uQmx1cjtcbiAgdmFyIG1iUHhSYXRpbyA9IHIubW90aW9uQmx1clB4UmF0aW87XG4gIHZhciBoYXNDb21wb3VuZE5vZGVzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICB2YXIgaW5Ob2RlRHJhZ0dlc3R1cmUgPSByLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXM7XG4gIHZhciBpbkJveFNlbGVjdGlvbiA9IHIuaG92ZXJEYXRhLnNlbGVjdGluZyB8fCByLnRvdWNoRGF0YS5zZWxlY3RpbmcgPyB0cnVlIDogZmFsc2U7XG4gIG1vdGlvbkJsdXIgPSBtb3Rpb25CbHVyICYmICFmb3JjZWRDb250ZXh0ICYmIHIubW90aW9uQmx1ckVuYWJsZWQgJiYgIWluQm94U2VsZWN0aW9uO1xuICB2YXIgbW90aW9uQmx1ckZhZGVFZmZlY3QgPSBtb3Rpb25CbHVyO1xuICBpZiAoIWZvcmNlZENvbnRleHQpIHtcbiAgICBpZiAoci5wcmV2UHhSYXRpbyAhPT0gcGl4ZWxSYXRpbykge1xuICAgICAgci5pbnZhbGlkYXRlQ29udGFpbmVyQ2xpZW50Q29vcmRzQ2FjaGUoKTtcbiAgICAgIHIubWF0Y2hDYW52YXNTaXplKHIuY29udGFpbmVyKTtcbiAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgfVxuICAgIHIucHJldlB4UmF0aW8gPSBwaXhlbFJhdGlvO1xuICB9XG4gIGlmICghZm9yY2VkQ29udGV4dCAmJiByLm1vdGlvbkJsdXJUaW1lb3V0KSB7XG4gICAgY2xlYXJUaW1lb3V0KHIubW90aW9uQmx1clRpbWVvdXQpO1xuICB9XG4gIGlmIChtb3Rpb25CbHVyKSB7XG4gICAgaWYgKHIubWJGcmFtZXMgPT0gbnVsbCkge1xuICAgICAgci5tYkZyYW1lcyA9IDA7XG4gICAgfVxuICAgIHIubWJGcmFtZXMrKztcbiAgICBpZiAoci5tYkZyYW1lcyA8IDMpIHtcbiAgICAgIC8vIG5lZWQgc2V2ZXJhbCBmcmFtZXMgYmVmb3JlIGV2ZW4gaGlnaCBxdWFsaXR5IG1vdGlvbmJsdXJcbiAgICAgIG1vdGlvbkJsdXJGYWRlRWZmZWN0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gZ28gdG8gbG93ZXIgcXVhbGl0eSBibHVycnkgZnJhbWVzIHdoZW4gc2V2ZXJhbCBtL2IgZnJhbWVzIGhhdmUgYmVlbiByZW5kZXJlZCAoYXZvaWRzIGZsYXNoaW5nKVxuICAgIGlmIChyLm1iRnJhbWVzID4gci5taW5NYkxvd1F1YWxGcmFtZXMpIHtcbiAgICAgIC8vci5mdWxsUXVhbGl0eU1iID0gZmFsc2U7XG4gICAgICByLm1vdGlvbkJsdXJQeFJhdGlvID0gci5tYlB4UkJsdXJyeTtcbiAgICB9XG4gIH1cbiAgaWYgKHIuY2xlYXJpbmdNb3Rpb25CbHVyKSB7XG4gICAgci5tb3Rpb25CbHVyUHhSYXRpbyA9IDE7XG4gIH1cblxuICAvLyBiL2MgZHJhd1RvQ29udGV4dCgpIG1heSBiZSBhc3luYyB3LnIudC4gcmVkcmF3KCksIGtlZXAgdHJhY2sgb2YgbGFzdCB0ZXh0dXJlIGZyYW1lXG4gIC8vIGJlY2F1c2UgYSByb2d1ZSBhc3luYyB0ZXh0dXJlIGZyYW1lIHdvdWxkIGNsZWFyIG5lZWREcmF3XG4gIGlmIChyLnRleHR1cmVEcmF3TGFzdEZyYW1lICYmICF0ZXh0dXJlRHJhdykge1xuICAgIG5lZWREcmF3W3IuTk9ERV0gPSB0cnVlO1xuICAgIG5lZWREcmF3W3IuU0VMRUNUX0JPWF0gPSB0cnVlO1xuICB9XG4gIHZhciBzdHlsZSA9IGN5LnN0eWxlKCk7XG4gIHZhciB6b29tID0gY3kuem9vbSgpO1xuICB2YXIgZWZmZWN0aXZlWm9vbSA9IGZvcmNlZFpvb20gIT09IHVuZGVmaW5lZCA/IGZvcmNlZFpvb20gOiB6b29tO1xuICB2YXIgcGFuID0gY3kucGFuKCk7XG4gIHZhciBlZmZlY3RpdmVQYW4gPSB7XG4gICAgeDogcGFuLngsXG4gICAgeTogcGFuLnlcbiAgfTtcbiAgdmFyIHZwID0ge1xuICAgIHpvb206IHpvb20sXG4gICAgcGFuOiB7XG4gICAgICB4OiBwYW4ueCxcbiAgICAgIHk6IHBhbi55XG4gICAgfVxuICB9O1xuICB2YXIgcHJldlZwID0gci5wcmV2Vmlld3BvcnQ7XG4gIHZhciB2aWV3cG9ydElzRGlmZiA9IHByZXZWcCA9PT0gdW5kZWZpbmVkIHx8IHZwLnpvb20gIT09IHByZXZWcC56b29tIHx8IHZwLnBhbi54ICE9PSBwcmV2VnAucGFuLnggfHwgdnAucGFuLnkgIT09IHByZXZWcC5wYW4ueTtcblxuICAvLyB3ZSB3YW50IHRoZSBsb3cgcXVhbGl0eSBtb3Rpb25ibHVyIG9ubHkgd2hlbiB0aGUgdmlld3BvcnQgaXMgYmVpbmcgbWFuaXB1bGF0ZWQgZXRjICh3aGVyZSBpdCdzIG5vdCBub3RpY2VkKVxuICBpZiAoIXZpZXdwb3J0SXNEaWZmICYmICEoaW5Ob2RlRHJhZ0dlc3R1cmUgJiYgIWhhc0NvbXBvdW5kTm9kZXMpKSB7XG4gICAgci5tb3Rpb25CbHVyUHhSYXRpbyA9IDE7XG4gIH1cbiAgaWYgKGZvcmNlZFBhbikge1xuICAgIGVmZmVjdGl2ZVBhbiA9IGZvcmNlZFBhbjtcbiAgfVxuXG4gIC8vIGFwcGx5IHBpeGVsIHJhdGlvXG5cbiAgZWZmZWN0aXZlWm9vbSAqPSBwaXhlbFJhdGlvO1xuICBlZmZlY3RpdmVQYW4ueCAqPSBwaXhlbFJhdGlvO1xuICBlZmZlY3RpdmVQYW4ueSAqPSBwaXhlbFJhdGlvO1xuICB2YXIgZWxlcyA9IHIuZ2V0Q2FjaGVkWlNvcnRlZEVsZXMoKTtcbiAgZnVuY3Rpb24gbWJjbGVhcihjb250ZXh0LCB4LCB5LCB3LCBoKSB7XG4gICAgdmFyIGdjbyA9IGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO1xuICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW91dCc7XG4gICAgci5jb2xvckZpbGxTdHlsZShjb250ZXh0LCAyNTUsIDI1NSwgMjU1LCByLm1vdGlvbkJsdXJUcmFuc3BhcmVuY3kpO1xuICAgIGNvbnRleHQuZmlsbFJlY3QoeCwgeSwgdywgaCk7XG4gICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBnY287XG4gIH1cbiAgZnVuY3Rpb24gc2V0Q29udGV4dFRyYW5zZm9ybShjb250ZXh0LCBjbGVhcikge1xuICAgIHZhciBlUGFuLCBlWm9vbSwgdywgaDtcbiAgICBpZiAoIXIuY2xlYXJpbmdNb3Rpb25CbHVyICYmIChjb250ZXh0ID09PSBkYXRhLmJ1ZmZlckNvbnRleHRzW3IuTU9USU9OQkxVUl9CVUZGRVJfTk9ERV0gfHwgY29udGV4dCA9PT0gZGF0YS5idWZmZXJDb250ZXh0c1tyLk1PVElPTkJMVVJfQlVGRkVSX0RSQUddKSkge1xuICAgICAgZVBhbiA9IHtcbiAgICAgICAgeDogcGFuLnggKiBtYlB4UmF0aW8sXG4gICAgICAgIHk6IHBhbi55ICogbWJQeFJhdGlvXG4gICAgICB9O1xuICAgICAgZVpvb20gPSB6b29tICogbWJQeFJhdGlvO1xuICAgICAgdyA9IHIuY2FudmFzV2lkdGggKiBtYlB4UmF0aW87XG4gICAgICBoID0gci5jYW52YXNIZWlnaHQgKiBtYlB4UmF0aW87XG4gICAgfSBlbHNlIHtcbiAgICAgIGVQYW4gPSBlZmZlY3RpdmVQYW47XG4gICAgICBlWm9vbSA9IGVmZmVjdGl2ZVpvb207XG4gICAgICB3ID0gci5jYW52YXNXaWR0aDtcbiAgICAgIGggPSByLmNhbnZhc0hlaWdodDtcbiAgICB9XG4gICAgY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgaWYgKGNsZWFyID09PSAnbW90aW9uQmx1cicpIHtcbiAgICAgIG1iY2xlYXIoY29udGV4dCwgMCwgMCwgdywgaCk7XG4gICAgfSBlbHNlIGlmICghZm9yY2VkQ29udGV4dCAmJiAoY2xlYXIgPT09IHVuZGVmaW5lZCB8fCBjbGVhcikpIHtcbiAgICAgIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xuICAgIH1cbiAgICBpZiAoIWRyYXdBbGxMYXllcnMpIHtcbiAgICAgIGNvbnRleHQudHJhbnNsYXRlKGVQYW4ueCwgZVBhbi55KTtcbiAgICAgIGNvbnRleHQuc2NhbGUoZVpvb20sIGVab29tKTtcbiAgICB9XG4gICAgaWYgKGZvcmNlZFBhbikge1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoZm9yY2VkUGFuLngsIGZvcmNlZFBhbi55KTtcbiAgICB9XG4gICAgaWYgKGZvcmNlZFpvb20pIHtcbiAgICAgIGNvbnRleHQuc2NhbGUoZm9yY2VkWm9vbSwgZm9yY2VkWm9vbSk7XG4gICAgfVxuICB9XG4gIGlmICghdGV4dHVyZURyYXcpIHtcbiAgICByLnRleHR1cmVEcmF3TGFzdEZyYW1lID0gZmFsc2U7XG4gIH1cbiAgaWYgKHRleHR1cmVEcmF3KSB7XG4gICAgci50ZXh0dXJlRHJhd0xhc3RGcmFtZSA9IHRydWU7XG4gICAgaWYgKCFyLnRleHR1cmVDYWNoZSkge1xuICAgICAgci50ZXh0dXJlQ2FjaGUgPSB7fTtcbiAgICAgIHIudGV4dHVyZUNhY2hlLmJiID0gY3kubXV0YWJsZUVsZW1lbnRzKCkuYm91bmRpbmdCb3goKTtcbiAgICAgIHIudGV4dHVyZUNhY2hlLnRleHR1cmUgPSByLmRhdGEuYnVmZmVyQ2FudmFzZXNbci5URVhUVVJFX0JVRkZFUl07XG4gICAgICB2YXIgY3h0ID0gci5kYXRhLmJ1ZmZlckNvbnRleHRzW3IuVEVYVFVSRV9CVUZGRVJdO1xuICAgICAgY3h0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgIGN4dC5jbGVhclJlY3QoMCwgMCwgci5jYW52YXNXaWR0aCAqIHIudGV4dHVyZU11bHQsIHIuY2FudmFzSGVpZ2h0ICogci50ZXh0dXJlTXVsdCk7XG4gICAgICByLnJlbmRlcih7XG4gICAgICAgIGZvcmNlZENvbnRleHQ6IGN4dCxcbiAgICAgICAgZHJhd09ubHlOb2RlTGF5ZXI6IHRydWUsXG4gICAgICAgIGZvcmNlZFB4UmF0aW86IHBpeGVsUmF0aW8gKiByLnRleHR1cmVNdWx0XG4gICAgICB9KTtcbiAgICAgIHZhciB2cCA9IHIudGV4dHVyZUNhY2hlLnZpZXdwb3J0ID0ge1xuICAgICAgICB6b29tOiBjeS56b29tKCksXG4gICAgICAgIHBhbjogY3kucGFuKCksXG4gICAgICAgIHdpZHRoOiByLmNhbnZhc1dpZHRoLFxuICAgICAgICBoZWlnaHQ6IHIuY2FudmFzSGVpZ2h0XG4gICAgICB9O1xuICAgICAgdnAubXBhbiA9IHtcbiAgICAgICAgeDogKDAgLSB2cC5wYW4ueCkgLyB2cC56b29tLFxuICAgICAgICB5OiAoMCAtIHZwLnBhbi55KSAvIHZwLnpvb21cbiAgICAgIH07XG4gICAgfVxuICAgIG5lZWREcmF3W3IuRFJBR10gPSBmYWxzZTtcbiAgICBuZWVkRHJhd1tyLk5PREVdID0gZmFsc2U7XG4gICAgdmFyIGNvbnRleHQgPSBkYXRhLmNvbnRleHRzW3IuTk9ERV07XG4gICAgdmFyIHRleHR1cmUgPSByLnRleHR1cmVDYWNoZS50ZXh0dXJlO1xuICAgIHZhciB2cCA9IHIudGV4dHVyZUNhY2hlLnZpZXdwb3J0O1xuICAgIGNvbnRleHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgIGlmIChtb3Rpb25CbHVyKSB7XG4gICAgICBtYmNsZWFyKGNvbnRleHQsIDAsIDAsIHZwLndpZHRoLCB2cC5oZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB2cC53aWR0aCwgdnAuaGVpZ2h0KTtcbiAgICB9XG4gICAgdmFyIG91dHNpZGVCZ0NvbG9yID0gc3R5bGUuY29yZSgnb3V0c2lkZS10ZXh0dXJlLWJnLWNvbG9yJykudmFsdWU7XG4gICAgdmFyIG91dHNpZGVCZ09wYWNpdHkgPSBzdHlsZS5jb3JlKCdvdXRzaWRlLXRleHR1cmUtYmctb3BhY2l0eScpLnZhbHVlO1xuICAgIHIuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgb3V0c2lkZUJnQ29sb3JbMF0sIG91dHNpZGVCZ0NvbG9yWzFdLCBvdXRzaWRlQmdDb2xvclsyXSwgb3V0c2lkZUJnT3BhY2l0eSk7XG4gICAgY29udGV4dC5maWxsUmVjdCgwLCAwLCB2cC53aWR0aCwgdnAuaGVpZ2h0KTtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICBzZXRDb250ZXh0VHJhbnNmb3JtKGNvbnRleHQsIGZhbHNlKTtcbiAgICBjb250ZXh0LmNsZWFyUmVjdCh2cC5tcGFuLngsIHZwLm1wYW4ueSwgdnAud2lkdGggLyB2cC56b29tIC8gcGl4ZWxSYXRpbywgdnAuaGVpZ2h0IC8gdnAuem9vbSAvIHBpeGVsUmF0aW8pO1xuICAgIGNvbnRleHQuZHJhd0ltYWdlKHRleHR1cmUsIHZwLm1wYW4ueCwgdnAubXBhbi55LCB2cC53aWR0aCAvIHZwLnpvb20gLyBwaXhlbFJhdGlvLCB2cC5oZWlnaHQgLyB2cC56b29tIC8gcGl4ZWxSYXRpbyk7XG4gIH0gZWxzZSBpZiAoci50ZXh0dXJlT25WaWV3cG9ydCAmJiAhZm9yY2VkQ29udGV4dCkge1xuICAgIC8vIGNsZWFyIHRoZSBjYWNoZSBzaW5jZSB3ZSBkb24ndCBuZWVkIGl0XG4gICAgci50ZXh0dXJlQ2FjaGUgPSBudWxsO1xuICB9XG4gIHZhciBleHRlbnQgPSBjeS5leHRlbnQoKTtcbiAgdmFyIHZwTWFuaXAgPSByLnBpbmNoaW5nIHx8IHIuaG92ZXJEYXRhLmRyYWdnaW5nIHx8IHIuc3dpcGVQYW5uaW5nIHx8IHIuZGF0YS53aGVlbFpvb21pbmcgfHwgci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzIHx8IHIuY3kuYW5pbWF0ZWQoKTtcbiAgdmFyIGhpZGVFZGdlcyA9IHIuaGlkZUVkZ2VzT25WaWV3cG9ydCAmJiB2cE1hbmlwO1xuICB2YXIgbmVlZE1iQ2xlYXIgPSBbXTtcbiAgbmVlZE1iQ2xlYXJbci5OT0RFXSA9ICFuZWVkRHJhd1tyLk5PREVdICYmIG1vdGlvbkJsdXIgJiYgIXIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5OT0RFXSB8fCByLmNsZWFyaW5nTW90aW9uQmx1cjtcbiAgaWYgKG5lZWRNYkNsZWFyW3IuTk9ERV0pIHtcbiAgICByLmNsZWFyZWRGb3JNb3Rpb25CbHVyW3IuTk9ERV0gPSB0cnVlO1xuICB9XG4gIG5lZWRNYkNsZWFyW3IuRFJBR10gPSAhbmVlZERyYXdbci5EUkFHXSAmJiBtb3Rpb25CbHVyICYmICFyLmNsZWFyZWRGb3JNb3Rpb25CbHVyW3IuRFJBR10gfHwgci5jbGVhcmluZ01vdGlvbkJsdXI7XG4gIGlmIChuZWVkTWJDbGVhcltyLkRSQUddKSB7XG4gICAgci5jbGVhcmVkRm9yTW90aW9uQmx1cltyLkRSQUddID0gdHJ1ZTtcbiAgfVxuICBpZiAobmVlZERyYXdbci5OT0RFXSB8fCBkcmF3QWxsTGF5ZXJzIHx8IGRyYXdPbmx5Tm9kZUxheWVyIHx8IG5lZWRNYkNsZWFyW3IuTk9ERV0pIHtcbiAgICB2YXIgdXNlQnVmZmVyID0gbW90aW9uQmx1ciAmJiAhbmVlZE1iQ2xlYXJbci5OT0RFXSAmJiBtYlB4UmF0aW8gIT09IDE7XG4gICAgdmFyIGNvbnRleHQgPSBmb3JjZWRDb250ZXh0IHx8ICh1c2VCdWZmZXIgPyByLmRhdGEuYnVmZmVyQ29udGV4dHNbci5NT1RJT05CTFVSX0JVRkZFUl9OT0RFXSA6IGRhdGEuY29udGV4dHNbci5OT0RFXSk7XG4gICAgdmFyIGNsZWFyID0gbW90aW9uQmx1ciAmJiAhdXNlQnVmZmVyID8gJ21vdGlvbkJsdXInIDogdW5kZWZpbmVkO1xuICAgIHNldENvbnRleHRUcmFuc2Zvcm0oY29udGV4dCwgY2xlYXIpO1xuICAgIGlmIChoaWRlRWRnZXMpIHtcbiAgICAgIHIuZHJhd0NhY2hlZE5vZGVzKGNvbnRleHQsIGVsZXMubm9uZHJhZywgcGl4ZWxSYXRpbywgZXh0ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgci5kcmF3TGF5ZXJlZEVsZW1lbnRzKGNvbnRleHQsIGVsZXMubm9uZHJhZywgcGl4ZWxSYXRpbywgZXh0ZW50KTtcbiAgICB9XG4gICAgaWYgKHIuZGVidWcpIHtcbiAgICAgIHIuZHJhd0RlYnVnUG9pbnRzKGNvbnRleHQsIGVsZXMubm9uZHJhZyk7XG4gICAgfVxuICAgIGlmICghZHJhd0FsbExheWVycyAmJiAhbW90aW9uQmx1cikge1xuICAgICAgbmVlZERyYXdbci5OT0RFXSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoIWRyYXdPbmx5Tm9kZUxheWVyICYmIChuZWVkRHJhd1tyLkRSQUddIHx8IGRyYXdBbGxMYXllcnMgfHwgbmVlZE1iQ2xlYXJbci5EUkFHXSkpIHtcbiAgICB2YXIgdXNlQnVmZmVyID0gbW90aW9uQmx1ciAmJiAhbmVlZE1iQ2xlYXJbci5EUkFHXSAmJiBtYlB4UmF0aW8gIT09IDE7XG4gICAgdmFyIGNvbnRleHQgPSBmb3JjZWRDb250ZXh0IHx8ICh1c2VCdWZmZXIgPyByLmRhdGEuYnVmZmVyQ29udGV4dHNbci5NT1RJT05CTFVSX0JVRkZFUl9EUkFHXSA6IGRhdGEuY29udGV4dHNbci5EUkFHXSk7XG4gICAgc2V0Q29udGV4dFRyYW5zZm9ybShjb250ZXh0LCBtb3Rpb25CbHVyICYmICF1c2VCdWZmZXIgPyAnbW90aW9uQmx1cicgOiB1bmRlZmluZWQpO1xuICAgIGlmIChoaWRlRWRnZXMpIHtcbiAgICAgIHIuZHJhd0NhY2hlZE5vZGVzKGNvbnRleHQsIGVsZXMuZHJhZywgcGl4ZWxSYXRpbywgZXh0ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgci5kcmF3Q2FjaGVkRWxlbWVudHMoY29udGV4dCwgZWxlcy5kcmFnLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgIH1cbiAgICBpZiAoci5kZWJ1Zykge1xuICAgICAgci5kcmF3RGVidWdQb2ludHMoY29udGV4dCwgZWxlcy5kcmFnKTtcbiAgICB9XG4gICAgaWYgKCFkcmF3QWxsTGF5ZXJzICYmICFtb3Rpb25CbHVyKSB7XG4gICAgICBuZWVkRHJhd1tyLkRSQUddID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmIChyLnNob3dGcHMgfHwgIWRyYXdPbmx5Tm9kZUxheWVyICYmIG5lZWREcmF3W3IuU0VMRUNUX0JPWF0gJiYgIWRyYXdBbGxMYXllcnMpIHtcbiAgICB2YXIgY29udGV4dCA9IGZvcmNlZENvbnRleHQgfHwgZGF0YS5jb250ZXh0c1tyLlNFTEVDVF9CT1hdO1xuICAgIHNldENvbnRleHRUcmFuc2Zvcm0oY29udGV4dCk7XG4gICAgaWYgKHIuc2VsZWN0aW9uWzRdID09IDEgJiYgKHIuaG92ZXJEYXRhLnNlbGVjdGluZyB8fCByLnRvdWNoRGF0YS5zZWxlY3RpbmcpKSB7XG4gICAgICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICAgICAgdmFyIGJvcmRlcldpZHRoID0gc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1ib3JkZXItd2lkdGgnKS52YWx1ZSAvIHpvb207XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGJvcmRlcldpZHRoO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAncmdiYSgnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1jb2xvcicpLnZhbHVlWzBdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1jb2xvcicpLnZhbHVlWzFdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1jb2xvcicpLnZhbHVlWzJdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1vcGFjaXR5JykudmFsdWUgKyAnKSc7XG4gICAgICBjb250ZXh0LmZpbGxSZWN0KHIuc2VsZWN0aW9uWzBdLCByLnNlbGVjdGlvblsxXSwgci5zZWxlY3Rpb25bMl0gLSByLnNlbGVjdGlvblswXSwgci5zZWxlY3Rpb25bM10gLSByLnNlbGVjdGlvblsxXSk7XG4gICAgICBpZiAoYm9yZGVyV2lkdGggPiAwKSB7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmdiYSgnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1ib3JkZXItY29sb3InKS52YWx1ZVswXSArICcsJyArIHN0eWxlLmNvcmUoJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJykudmFsdWVbMV0gKyAnLCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LWJvcmRlci1jb2xvcicpLnZhbHVlWzJdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1vcGFjaXR5JykudmFsdWUgKyAnKSc7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlUmVjdChyLnNlbGVjdGlvblswXSwgci5zZWxlY3Rpb25bMV0sIHIuc2VsZWN0aW9uWzJdIC0gci5zZWxlY3Rpb25bMF0sIHIuc2VsZWN0aW9uWzNdIC0gci5zZWxlY3Rpb25bMV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiAmJiAhci5ob3ZlckRhdGEuc2VsZWN0aW5nKSB7XG4gICAgICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICAgICAgdmFyIHBvcyA9IGRhdGEuYmdBY3RpdmVQb3Npc3Rpb247XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKCcgKyBzdHlsZS5jb3JlKCdhY3RpdmUtYmctY29sb3InKS52YWx1ZVswXSArICcsJyArIHN0eWxlLmNvcmUoJ2FjdGl2ZS1iZy1jb2xvcicpLnZhbHVlWzFdICsgJywnICsgc3R5bGUuY29yZSgnYWN0aXZlLWJnLWNvbG9yJykudmFsdWVbMl0gKyAnLCcgKyBzdHlsZS5jb3JlKCdhY3RpdmUtYmctb3BhY2l0eScpLnZhbHVlICsgJyknO1xuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgIGNvbnRleHQuYXJjKHBvcy54LCBwb3MueSwgc3R5bGUuY29yZSgnYWN0aXZlLWJnLXNpemUnKS5wZlZhbHVlIC8gem9vbSwgMCwgMiAqIE1hdGguUEkpO1xuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgfVxuICAgIHZhciB0aW1lVG9SZW5kZXIgPSByLmxhc3RSZWRyYXdUaW1lO1xuICAgIGlmIChyLnNob3dGcHMgJiYgdGltZVRvUmVuZGVyKSB7XG4gICAgICB0aW1lVG9SZW5kZXIgPSBNYXRoLnJvdW5kKHRpbWVUb1JlbmRlcik7XG4gICAgICB2YXIgZnBzID0gTWF0aC5yb3VuZCgxMDAwIC8gdGltZVRvUmVuZGVyKTtcbiAgICAgIGNvbnRleHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAncmdiYSgyNTUsIDAsIDAsIDAuNzUpJztcbiAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmdiYSgyNTUsIDAsIDAsIDAuNzUpJztcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gMTtcbiAgICAgIGNvbnRleHQuZmlsbFRleHQoJzEgZnJhbWUgPSAnICsgdGltZVRvUmVuZGVyICsgJyBtcyA9ICcgKyBmcHMgKyAnIGZwcycsIDAsIDIwKTtcbiAgICAgIHZhciBtYXhGcHMgPSA2MDtcbiAgICAgIGNvbnRleHQuc3Ryb2tlUmVjdCgwLCAzMCwgMjUwLCAyMCk7XG4gICAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDMwLCAyNTAgKiBNYXRoLm1pbihmcHMgLyBtYXhGcHMsIDEpLCAyMCk7XG4gICAgfVxuICAgIGlmICghZHJhd0FsbExheWVycykge1xuICAgICAgbmVlZERyYXdbci5TRUxFQ1RfQk9YXSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIG1vdGlvbmJsdXI6IGJsaXQgcmVuZGVyZWQgYmx1cnJ5IGZyYW1lc1xuICBpZiAobW90aW9uQmx1ciAmJiBtYlB4UmF0aW8gIT09IDEpIHtcbiAgICB2YXIgY3h0Tm9kZSA9IGRhdGEuY29udGV4dHNbci5OT0RFXTtcbiAgICB2YXIgdHh0Tm9kZSA9IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLk1PVElPTkJMVVJfQlVGRkVSX05PREVdO1xuICAgIHZhciBjeHREcmFnID0gZGF0YS5jb250ZXh0c1tyLkRSQUddO1xuICAgIHZhciB0eHREcmFnID0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW3IuTU9USU9OQkxVUl9CVUZGRVJfRFJBR107XG4gICAgdmFyIGRyYXdNb3Rpb25CbHVyID0gZnVuY3Rpb24gZHJhd01vdGlvbkJsdXIoY3h0LCB0eHQsIG5lZWRDbGVhcikge1xuICAgICAgY3h0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgIGlmIChuZWVkQ2xlYXIgfHwgIW1vdGlvbkJsdXJGYWRlRWZmZWN0KSB7XG4gICAgICAgIGN4dC5jbGVhclJlY3QoMCwgMCwgci5jYW52YXNXaWR0aCwgci5jYW52YXNIZWlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWJjbGVhcihjeHQsIDAsIDAsIHIuY2FudmFzV2lkdGgsIHIuY2FudmFzSGVpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHZhciBweHIgPSBtYlB4UmF0aW87XG4gICAgICBjeHQuZHJhd0ltYWdlKHR4dCxcbiAgICAgIC8vIGltZ1xuICAgICAgMCwgMCxcbiAgICAgIC8vIHN4LCBzeVxuICAgICAgci5jYW52YXNXaWR0aCAqIHB4ciwgci5jYW52YXNIZWlnaHQgKiBweHIsXG4gICAgICAvLyBzdywgc2hcbiAgICAgIDAsIDAsXG4gICAgICAvLyB4LCB5XG4gICAgICByLmNhbnZhc1dpZHRoLCByLmNhbnZhc0hlaWdodCAvLyB3LCBoXG4gICAgICApO1xuICAgIH07XG5cbiAgICBpZiAobmVlZERyYXdbci5OT0RFXSB8fCBuZWVkTWJDbGVhcltyLk5PREVdKSB7XG4gICAgICBkcmF3TW90aW9uQmx1cihjeHROb2RlLCB0eHROb2RlLCBuZWVkTWJDbGVhcltyLk5PREVdKTtcbiAgICAgIG5lZWREcmF3W3IuTk9ERV0gPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5lZWREcmF3W3IuRFJBR10gfHwgbmVlZE1iQ2xlYXJbci5EUkFHXSkge1xuICAgICAgZHJhd01vdGlvbkJsdXIoY3h0RHJhZywgdHh0RHJhZywgbmVlZE1iQ2xlYXJbci5EUkFHXSk7XG4gICAgICBuZWVkRHJhd1tyLkRSQUddID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHIucHJldlZpZXdwb3J0ID0gdnA7XG4gIGlmIChyLmNsZWFyaW5nTW90aW9uQmx1cikge1xuICAgIHIuY2xlYXJpbmdNb3Rpb25CbHVyID0gZmFsc2U7XG4gICAgci5tb3Rpb25CbHVyQ2xlYXJlZCA9IHRydWU7XG4gICAgci5tb3Rpb25CbHVyID0gdHJ1ZTtcbiAgfVxuICBpZiAobW90aW9uQmx1cikge1xuICAgIHIubW90aW9uQmx1clRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHIubW90aW9uQmx1clRpbWVvdXQgPSBudWxsO1xuICAgICAgci5jbGVhcmVkRm9yTW90aW9uQmx1cltyLk5PREVdID0gZmFsc2U7XG4gICAgICByLmNsZWFyZWRGb3JNb3Rpb25CbHVyW3IuRFJBR10gPSBmYWxzZTtcbiAgICAgIHIubW90aW9uQmx1ciA9IGZhbHNlO1xuICAgICAgci5jbGVhcmluZ01vdGlvbkJsdXIgPSAhdGV4dHVyZURyYXc7XG4gICAgICByLm1iRnJhbWVzID0gMDtcbiAgICAgIG5lZWREcmF3W3IuTk9ERV0gPSB0cnVlO1xuICAgICAgbmVlZERyYXdbci5EUkFHXSA9IHRydWU7XG4gICAgICByLnJlZHJhdygpO1xuICAgIH0sIG1vdGlvbkJsdXJEZWxheSk7XG4gIH1cbiAgaWYgKCFmb3JjZWRDb250ZXh0KSB7XG4gICAgY3kuZW1pdCgncmVuZGVyJyk7XG4gIH1cbn07XG5cbnZhciBDUnAkMyA9IHt9O1xuXG4vLyBATyBQb2x5Z29uIGRyYXdpbmdcbkNScCQzLmRyYXdQb2x5Z29uUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMpIHtcbiAgdmFyIGhhbGZXID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkggPSBoZWlnaHQgLyAyO1xuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9XG4gIGNvbnRleHQubW92ZVRvKHggKyBoYWxmVyAqIHBvaW50c1swXSwgeSArIGhhbGZIICogcG9pbnRzWzFdKTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBwb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgY29udGV4dC5saW5lVG8oeCArIGhhbGZXICogcG9pbnRzW2kgKiAyXSwgeSArIGhhbGZIICogcG9pbnRzW2kgKiAyICsgMV0pO1xuICB9XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG59O1xuQ1JwJDMuZHJhd1JvdW5kUG9seWdvblBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzLCBjb3JuZXJzKSB7XG4gIGNvcm5lcnMuZm9yRWFjaChmdW5jdGlvbiAoY29ybmVyKSB7XG4gICAgcmV0dXJuIGRyYXdQcmVwYXJlZFJvdW5kQ29ybmVyKGNvbnRleHQsIGNvcm5lcik7XG4gIH0pO1xuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcblxuLy8gUm91bmQgcmVjdGFuZ2xlIGRyYXdpbmdcbkNScCQzLmRyYXdSb3VuZFJlY3RhbmdsZVBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzKSB7XG4gIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgdmFyIGNvcm5lclJhZGl1cyA9IHJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCkgOiBNYXRoLm1pbihyYWRpdXMsIGhhbGZIZWlnaHQsIGhhbGZXaWR0aCk7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cblxuICAvLyBTdGFydCBhdCB0b3AgbWlkZGxlXG4gIGNvbnRleHQubW92ZVRvKHgsIHkgLSBoYWxmSGVpZ2h0KTtcbiAgLy8gQXJjIGZyb20gbWlkZGxlIHRvcCB0byByaWdodCBzaWRlXG4gIGNvbnRleHQuYXJjVG8oeCArIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQsIHggKyBoYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyk7XG4gIC8vIEFyYyBmcm9tIHJpZ2h0IHNpZGUgdG8gYm90dG9tXG4gIGNvbnRleHQuYXJjVG8oeCArIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQsIHgsIHkgKyBoYWxmSGVpZ2h0LCBjb3JuZXJSYWRpdXMpO1xuICAvLyBBcmMgZnJvbSBib3R0b20gdG8gbGVmdCBzaWRlXG4gIGNvbnRleHQuYXJjVG8oeCAtIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQsIHggLSBoYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyk7XG4gIC8vIEFyYyBmcm9tIGxlZnQgc2lkZSB0byB0b3BCb3JkZXJcbiAgY29udGV4dC5hcmNUbyh4IC0gaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCwgeCwgeSAtIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyk7XG4gIC8vIEpvaW4gbGluZVxuICBjb250ZXh0LmxpbmVUbyh4LCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG59O1xuQ1JwJDMuZHJhd0JvdHRvbVJvdW5kUmVjdGFuZ2xlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpIHtcbiAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICB2YXIgY29ybmVyUmFkaXVzID0gcmFkaXVzID09PSAnYXV0bycgPyBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KSA6IHJhZGl1cztcbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuXG4gIC8vIFN0YXJ0IGF0IHRvcCBtaWRkbGVcbiAgY29udGV4dC5tb3ZlVG8oeCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQubGluZVRvKHggKyBoYWxmV2lkdGgsIHkpO1xuICBjb250ZXh0LmFyY1RvKHggKyBoYWxmV2lkdGgsIHkgKyBoYWxmSGVpZ2h0LCB4LCB5ICsgaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzKTtcbiAgY29udGV4dC5hcmNUbyh4IC0gaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCAtIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzKTtcbiAgY29udGV4dC5saW5lVG8oeCAtIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4LCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG59O1xuQ1JwJDMuZHJhd0N1dFJlY3RhbmdsZVBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzLCBjb3JuZXJzKSB7XG4gIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgdmFyIGNvcm5lckxlbmd0aCA9IGNvcm5lcnMgPT09ICdhdXRvJyA/IGdldEN1dFJlY3RhbmdsZUNvcm5lckxlbmd0aCgpIDogY29ybmVycztcbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuICBjb250ZXh0Lm1vdmVUbyh4IC0gaGFsZldpZHRoICsgY29ybmVyTGVuZ3RoLCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQubGluZVRvKHggKyBoYWxmV2lkdGggLSBjb3JuZXJMZW5ndGgsIHkgLSBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCArIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJMZW5ndGgpO1xuICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCAtIGNvcm5lckxlbmd0aCk7XG4gIGNvbnRleHQubGluZVRvKHggKyBoYWxmV2lkdGggLSBjb3JuZXJMZW5ndGgsIHkgKyBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCAtIGhhbGZXaWR0aCArIGNvcm5lckxlbmd0aCwgeSArIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4IC0gaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCAtIGNvcm5lckxlbmd0aCk7XG4gIGNvbnRleHQubGluZVRvKHggLSBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyTGVuZ3RoKTtcbiAgY29udGV4dC5jbG9zZVBhdGgoKTtcbn07XG5DUnAkMy5kcmF3QmFycmVsUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgdmFyIHhCZWdpbiA9IHggLSBoYWxmV2lkdGg7XG4gIHZhciB4RW5kID0geCArIGhhbGZXaWR0aDtcbiAgdmFyIHlCZWdpbiA9IHkgLSBoYWxmSGVpZ2h0O1xuICB2YXIgeUVuZCA9IHkgKyBoYWxmSGVpZ2h0O1xuICB2YXIgYmFycmVsQ3VydmVDb25zdGFudHMgPSBnZXRCYXJyZWxDdXJ2ZUNvbnN0YW50cyh3aWR0aCwgaGVpZ2h0KTtcbiAgdmFyIHdPZmZzZXQgPSBiYXJyZWxDdXJ2ZUNvbnN0YW50cy53aWR0aE9mZnNldDtcbiAgdmFyIGhPZmZzZXQgPSBiYXJyZWxDdXJ2ZUNvbnN0YW50cy5oZWlnaHRPZmZzZXQ7XG4gIHZhciBjdHJsUHRYT2Zmc2V0ID0gYmFycmVsQ3VydmVDb25zdGFudHMuY3RybFB0T2Zmc2V0UGN0ICogd09mZnNldDtcbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuICBjb250ZXh0Lm1vdmVUbyh4QmVnaW4sIHlCZWdpbiArIGhPZmZzZXQpO1xuICBjb250ZXh0LmxpbmVUbyh4QmVnaW4sIHlFbmQgLSBoT2Zmc2V0KTtcbiAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKHhCZWdpbiArIGN0cmxQdFhPZmZzZXQsIHlFbmQsIHhCZWdpbiArIHdPZmZzZXQsIHlFbmQpO1xuICBjb250ZXh0LmxpbmVUbyh4RW5kIC0gd09mZnNldCwgeUVuZCk7XG4gIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbyh4RW5kIC0gY3RybFB0WE9mZnNldCwgeUVuZCwgeEVuZCwgeUVuZCAtIGhPZmZzZXQpO1xuICBjb250ZXh0LmxpbmVUbyh4RW5kLCB5QmVnaW4gKyBoT2Zmc2V0KTtcbiAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKHhFbmQgLSBjdHJsUHRYT2Zmc2V0LCB5QmVnaW4sIHhFbmQgLSB3T2Zmc2V0LCB5QmVnaW4pO1xuICBjb250ZXh0LmxpbmVUbyh4QmVnaW4gKyB3T2Zmc2V0LCB5QmVnaW4pO1xuICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oeEJlZ2luICsgY3RybFB0WE9mZnNldCwgeUJlZ2luLCB4QmVnaW4sIHlCZWdpbiArIGhPZmZzZXQpO1xuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcbnZhciBzaW4wID0gTWF0aC5zaW4oMCk7XG52YXIgY29zMCA9IE1hdGguY29zKDApO1xudmFyIHNpbiA9IHt9O1xudmFyIGNvcyA9IHt9O1xudmFyIGVsbGlwc2VTdGVwU2l6ZSA9IE1hdGguUEkgLyA0MDtcbmZvciAodmFyIGkgPSAwICogTWF0aC5QSTsgaSA8IDIgKiBNYXRoLlBJOyBpICs9IGVsbGlwc2VTdGVwU2l6ZSkge1xuICBzaW5baV0gPSBNYXRoLnNpbihpKTtcbiAgY29zW2ldID0gTWF0aC5jb3MoaSk7XG59XG5DUnAkMy5kcmF3RWxsaXBzZVBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCkge1xuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9XG4gIGlmIChjb250ZXh0LmVsbGlwc2UpIHtcbiAgICBjb250ZXh0LmVsbGlwc2UoY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLyAyLCBoZWlnaHQgLyAyLCAwLCAwLCAyICogTWF0aC5QSSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHhQb3MsIHlQb3M7XG4gICAgdmFyIHJ3ID0gd2lkdGggLyAyO1xuICAgIHZhciByaCA9IGhlaWdodCAvIDI7XG4gICAgZm9yICh2YXIgaSA9IDAgKiBNYXRoLlBJOyBpIDwgMiAqIE1hdGguUEk7IGkgKz0gZWxsaXBzZVN0ZXBTaXplKSB7XG4gICAgICB4UG9zID0gY2VudGVyWCAtIHJ3ICogc2luW2ldICogc2luMCArIHJ3ICogY29zW2ldICogY29zMDtcbiAgICAgIHlQb3MgPSBjZW50ZXJZICsgcmggKiBjb3NbaV0gKiBzaW4wICsgcmggKiBzaW5baV0gKiBjb3MwO1xuICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgY29udGV4dC5tb3ZlVG8oeFBvcywgeVBvcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0LmxpbmVUbyh4UG9zLCB5UG9zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29udGV4dC5jbG9zZVBhdGgoKTtcbn07XG5cbi8qIGdsb2JhbCBhdG9iLCBBcnJheUJ1ZmZlciwgVWludDhBcnJheSwgQmxvYiAqL1xudmFyIENScCQyID0ge307XG5DUnAkMi5jcmVhdGVCdWZmZXIgPSBmdW5jdGlvbiAodywgaCkge1xuICB2YXIgYnVmZmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgYnVmZmVyLndpZHRoID0gdztcbiAgYnVmZmVyLmhlaWdodCA9IGg7XG4gIHJldHVybiBbYnVmZmVyLCBidWZmZXIuZ2V0Q29udGV4dCgnMmQnKV07XG59O1xuQ1JwJDIuYnVmZmVyQ2FudmFzSW1hZ2UgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB2YXIgY3kgPSB0aGlzLmN5O1xuICB2YXIgZWxlcyA9IGN5Lm11dGFibGVFbGVtZW50cygpO1xuICB2YXIgYmIgPSBlbGVzLmJvdW5kaW5nQm94KCk7XG4gIHZhciBjdHJSZWN0ID0gdGhpcy5maW5kQ29udGFpbmVyQ2xpZW50Q29vcmRzKCk7XG4gIHZhciB3aWR0aCA9IG9wdGlvbnMuZnVsbCA/IE1hdGguY2VpbChiYi53KSA6IGN0clJlY3RbMl07XG4gIHZhciBoZWlnaHQgPSBvcHRpb25zLmZ1bGwgPyBNYXRoLmNlaWwoYmIuaCkgOiBjdHJSZWN0WzNdO1xuICB2YXIgc3BlY2RNYXhEaW1zID0gbnVtYmVyJDEob3B0aW9ucy5tYXhXaWR0aCkgfHwgbnVtYmVyJDEob3B0aW9ucy5tYXhIZWlnaHQpO1xuICB2YXIgcHhSYXRpbyA9IHRoaXMuZ2V0UGl4ZWxSYXRpbygpO1xuICB2YXIgc2NhbGUgPSAxO1xuICBpZiAob3B0aW9ucy5zY2FsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgd2lkdGggKj0gb3B0aW9ucy5zY2FsZTtcbiAgICBoZWlnaHQgKj0gb3B0aW9ucy5zY2FsZTtcbiAgICBzY2FsZSA9IG9wdGlvbnMuc2NhbGU7XG4gIH0gZWxzZSBpZiAoc3BlY2RNYXhEaW1zKSB7XG4gICAgdmFyIG1heFNjYWxlVyA9IEluZmluaXR5O1xuICAgIHZhciBtYXhTY2FsZUggPSBJbmZpbml0eTtcbiAgICBpZiAobnVtYmVyJDEob3B0aW9ucy5tYXhXaWR0aCkpIHtcbiAgICAgIG1heFNjYWxlVyA9IHNjYWxlICogb3B0aW9ucy5tYXhXaWR0aCAvIHdpZHRoO1xuICAgIH1cbiAgICBpZiAobnVtYmVyJDEob3B0aW9ucy5tYXhIZWlnaHQpKSB7XG4gICAgICBtYXhTY2FsZUggPSBzY2FsZSAqIG9wdGlvbnMubWF4SGVpZ2h0IC8gaGVpZ2h0O1xuICAgIH1cbiAgICBzY2FsZSA9IE1hdGgubWluKG1heFNjYWxlVywgbWF4U2NhbGVIKTtcbiAgICB3aWR0aCAqPSBzY2FsZTtcbiAgICBoZWlnaHQgKj0gc2NhbGU7XG4gIH1cbiAgaWYgKCFzcGVjZE1heERpbXMpIHtcbiAgICB3aWR0aCAqPSBweFJhdGlvO1xuICAgIGhlaWdodCAqPSBweFJhdGlvO1xuICAgIHNjYWxlICo9IHB4UmF0aW87XG4gIH1cbiAgdmFyIGJ1ZmZDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gIGJ1ZmZDYW52YXMud2lkdGggPSB3aWR0aDtcbiAgYnVmZkNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIGJ1ZmZDYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gIGJ1ZmZDYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgdmFyIGJ1ZmZDeHQgPSBidWZmQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgLy8gUmFzdGVyaXplIHRoZSBsYXllcnMsIGJ1dCBvbmx5IGlmIGNvbnRhaW5lciBoYXMgbm9uemVybyBzaXplXG4gIGlmICh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkge1xuICAgIGJ1ZmZDeHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGJ1ZmZDeHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJztcbiAgICB2YXIgenNvcnRlZEVsZXMgPSB0aGlzLmdldENhY2hlZFpTb3J0ZWRFbGVzKCk7XG4gICAgaWYgKG9wdGlvbnMuZnVsbCkge1xuICAgICAgLy8gZHJhdyB0aGUgZnVsbCBib3VuZHMgb2YgdGhlIGdyYXBoXG4gICAgICBidWZmQ3h0LnRyYW5zbGF0ZSgtYmIueDEgKiBzY2FsZSwgLWJiLnkxICogc2NhbGUpO1xuICAgICAgYnVmZkN4dC5zY2FsZShzY2FsZSwgc2NhbGUpO1xuICAgICAgdGhpcy5kcmF3RWxlbWVudHMoYnVmZkN4dCwgenNvcnRlZEVsZXMpO1xuICAgICAgYnVmZkN4dC5zY2FsZSgxIC8gc2NhbGUsIDEgLyBzY2FsZSk7XG4gICAgICBidWZmQ3h0LnRyYW5zbGF0ZShiYi54MSAqIHNjYWxlLCBiYi55MSAqIHNjYWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZHJhdyB0aGUgY3VycmVudCB2aWV3XG4gICAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgICB2YXIgdHJhbnNsYXRpb24gPSB7XG4gICAgICAgIHg6IHBhbi54ICogc2NhbGUsXG4gICAgICAgIHk6IHBhbi55ICogc2NhbGVcbiAgICAgIH07XG4gICAgICBzY2FsZSAqPSBjeS56b29tKCk7XG4gICAgICBidWZmQ3h0LnRyYW5zbGF0ZSh0cmFuc2xhdGlvbi54LCB0cmFuc2xhdGlvbi55KTtcbiAgICAgIGJ1ZmZDeHQuc2NhbGUoc2NhbGUsIHNjYWxlKTtcbiAgICAgIHRoaXMuZHJhd0VsZW1lbnRzKGJ1ZmZDeHQsIHpzb3J0ZWRFbGVzKTtcbiAgICAgIGJ1ZmZDeHQuc2NhbGUoMSAvIHNjYWxlLCAxIC8gc2NhbGUpO1xuICAgICAgYnVmZkN4dC50cmFuc2xhdGUoLXRyYW5zbGF0aW9uLngsIC10cmFuc2xhdGlvbi55KTtcbiAgICB9XG5cbiAgICAvLyBuZWVkIHRvIGZpbGwgYmcgYXQgZW5kIGxpa2UgdGhpcyBpbiBvcmRlciB0byBmaWxsIGNsZWFyZWQgdHJhbnNwYXJlbnQgcGl4ZWxzIGluIGpwZ3NcbiAgICBpZiAob3B0aW9ucy5iZykge1xuICAgICAgYnVmZkN4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnZGVzdGluYXRpb24tb3Zlcic7XG4gICAgICBidWZmQ3h0LmZpbGxTdHlsZSA9IG9wdGlvbnMuYmc7XG4gICAgICBidWZmQ3h0LnJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBidWZmQ3h0LmZpbGwoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJ1ZmZDYW52YXM7XG59O1xuZnVuY3Rpb24gYjY0VG9CbG9iKGI2NCwgbWltZVR5cGUpIHtcbiAgdmFyIGJ5dGVzID0gYXRvYihiNjQpO1xuICB2YXIgYnVmZiA9IG5ldyBBcnJheUJ1ZmZlcihieXRlcy5sZW5ndGgpO1xuICB2YXIgYnVmZlVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBidWZmVWludDhbaV0gPSBieXRlcy5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBuZXcgQmxvYihbYnVmZl0sIHtcbiAgICB0eXBlOiBtaW1lVHlwZVxuICB9KTtcbn1cbmZ1bmN0aW9uIGI2NFVyaVRvQjY0KGI2NHVyaSkge1xuICB2YXIgaSA9IGI2NHVyaS5pbmRleE9mKCcsJyk7XG4gIHJldHVybiBiNjR1cmkuc3Vic3RyKGkgKyAxKTtcbn1cbmZ1bmN0aW9uIG91dHB1dChvcHRpb25zLCBjYW52YXMsIG1pbWVUeXBlKSB7XG4gIHZhciBnZXRCNjRVcmkgPSBmdW5jdGlvbiBnZXRCNjRVcmkoKSB7XG4gICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwobWltZVR5cGUsIG9wdGlvbnMucXVhbGl0eSk7XG4gIH07XG4gIHN3aXRjaCAob3B0aW9ucy5vdXRwdXQpIHtcbiAgICBjYXNlICdibG9iLXByb21pc2UnOlxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbnZhcy50b0Jsb2IoZnVuY3Rpb24gKGJsb2IpIHtcbiAgICAgICAgICAgIGlmIChibG9iICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShibG9iKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ2BjYW52YXMudG9CbG9iKClgIHNlbnQgYSBudWxsIHZhbHVlIGluIGl0cyBjYWxsYmFjaycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBtaW1lVHlwZSwgb3B0aW9ucy5xdWFsaXR5KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIGNhc2UgJ2Jsb2InOlxuICAgICAgcmV0dXJuIGI2NFRvQmxvYihiNjRVcmlUb0I2NChnZXRCNjRVcmkoKSksIG1pbWVUeXBlKTtcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgcmV0dXJuIGI2NFVyaVRvQjY0KGdldEI2NFVyaSgpKTtcbiAgICBjYXNlICdiYXNlNjR1cmknOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZ2V0QjY0VXJpKCk7XG4gIH1cbn1cbkNScCQyLnBuZyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHJldHVybiBvdXRwdXQob3B0aW9ucywgdGhpcy5idWZmZXJDYW52YXNJbWFnZShvcHRpb25zKSwgJ2ltYWdlL3BuZycpO1xufTtcbkNScCQyLmpwZyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHJldHVybiBvdXRwdXQob3B0aW9ucywgdGhpcy5idWZmZXJDYW52YXNJbWFnZShvcHRpb25zKSwgJ2ltYWdlL2pwZWcnKTtcbn07XG5cbnZhciBDUnAkMSA9IHt9O1xuQ1JwJDEubm9kZVNoYXBlSW1wbCA9IGZ1bmN0aW9uIChuYW1lLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMsIGNvcm5lcnMpIHtcbiAgc3dpdGNoIChuYW1lKSB7XG4gICAgY2FzZSAnZWxsaXBzZSc6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3RWxsaXBzZVBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgY2FzZSAncG9seWdvbic6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3UG9seWdvblBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzKTtcbiAgICBjYXNlICdyb3VuZC1wb2x5Z29uJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdSb3VuZFBvbHlnb25QYXRoKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBvaW50cywgY29ybmVycyk7XG4gICAgY2FzZSAncm91bmRyZWN0YW5nbGUnOlxuICAgIGNhc2UgJ3JvdW5kLXJlY3RhbmdsZSc6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3Um91bmRSZWN0YW5nbGVQYXRoKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lcnMpO1xuICAgIGNhc2UgJ2N1dHJlY3RhbmdsZSc6XG4gICAgY2FzZSAnY3V0LXJlY3RhbmdsZSc6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3Q3V0UmVjdGFuZ2xlUGF0aChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMsIGNvcm5lcnMpO1xuICAgIGNhc2UgJ2JvdHRvbXJvdW5kcmVjdGFuZ2xlJzpcbiAgICBjYXNlICdib3R0b20tcm91bmQtcmVjdGFuZ2xlJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdCb3R0b21Sb3VuZFJlY3RhbmdsZVBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgY29ybmVycyk7XG4gICAgY2FzZSAnYmFycmVsJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdCYXJyZWxQYXRoKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpO1xuICB9XG59O1xuXG52YXIgQ1IgPSBDYW52YXNSZW5kZXJlcjtcbnZhciBDUnAgPSBDYW52YXNSZW5kZXJlci5wcm90b3R5cGU7XG5DUnAuQ0FOVkFTX0xBWUVSUyA9IDM7XG4vL1xuQ1JwLlNFTEVDVF9CT1ggPSAwO1xuQ1JwLkRSQUcgPSAxO1xuQ1JwLk5PREUgPSAyO1xuQ1JwLkJVRkZFUl9DT1VOVCA9IDM7XG4vL1xuQ1JwLlRFWFRVUkVfQlVGRkVSID0gMDtcbkNScC5NT1RJT05CTFVSX0JVRkZFUl9OT0RFID0gMTtcbkNScC5NT1RJT05CTFVSX0JVRkZFUl9EUkFHID0gMjtcbmZ1bmN0aW9uIENhbnZhc1JlbmRlcmVyKG9wdGlvbnMpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICByLmRhdGEgPSB7XG4gICAgY2FudmFzZXM6IG5ldyBBcnJheShDUnAuQ0FOVkFTX0xBWUVSUyksXG4gICAgY29udGV4dHM6IG5ldyBBcnJheShDUnAuQ0FOVkFTX0xBWUVSUyksXG4gICAgY2FudmFzTmVlZHNSZWRyYXc6IG5ldyBBcnJheShDUnAuQ0FOVkFTX0xBWUVSUyksXG4gICAgYnVmZmVyQ2FudmFzZXM6IG5ldyBBcnJheShDUnAuQlVGRkVSX0NPVU5UKSxcbiAgICBidWZmZXJDb250ZXh0czogbmV3IEFycmF5KENScC5DQU5WQVNfTEFZRVJTKVxuICB9O1xuICB2YXIgdGFwSGxPZmZBdHRyID0gJy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcic7XG4gIHZhciB0YXBIbE9mZlN0eWxlID0gJ3JnYmEoMCwwLDAsMCknO1xuICByLmRhdGEuY2FudmFzQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgdmFyIGNvbnRhaW5lclN0eWxlID0gci5kYXRhLmNhbnZhc0NvbnRhaW5lci5zdHlsZTtcbiAgci5kYXRhLmNhbnZhc0NvbnRhaW5lci5zdHlsZVt0YXBIbE9mZkF0dHJdID0gdGFwSGxPZmZTdHlsZTtcbiAgY29udGFpbmVyU3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICBjb250YWluZXJTdHlsZS56SW5kZXggPSAnMCc7XG4gIGNvbnRhaW5lclN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gIHZhciBjb250YWluZXIgPSBvcHRpb25zLmN5LmNvbnRhaW5lcigpO1xuICBjb250YWluZXIuYXBwZW5kQ2hpbGQoci5kYXRhLmNhbnZhc0NvbnRhaW5lcik7XG4gIGNvbnRhaW5lci5zdHlsZVt0YXBIbE9mZkF0dHJdID0gdGFwSGxPZmZTdHlsZTtcbiAgdmFyIHN0eWxlTWFwID0ge1xuICAgICctd2Via2l0LXVzZXItc2VsZWN0JzogJ25vbmUnLFxuICAgICctbW96LXVzZXItc2VsZWN0JzogJy1tb3otbm9uZScsXG4gICAgJ3VzZXItc2VsZWN0JzogJ25vbmUnLFxuICAgICctd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3InOiAncmdiYSgwLDAsMCwwKScsXG4gICAgJ291dGxpbmUtc3R5bGUnOiAnbm9uZSdcbiAgfTtcbiAgaWYgKG1zKCkpIHtcbiAgICBzdHlsZU1hcFsnLW1zLXRvdWNoLWFjdGlvbiddID0gJ25vbmUnO1xuICAgIHN0eWxlTWFwWyd0b3VjaC1hY3Rpb24nXSA9ICdub25lJztcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IENScC5DQU5WQVNfTEFZRVJTOyBpKyspIHtcbiAgICB2YXIgY2FudmFzID0gci5kYXRhLmNhbnZhc2VzW2ldID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICByLmRhdGEuY29udGV4dHNbaV0gPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBPYmplY3Qua2V5cyhzdHlsZU1hcCkuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgY2FudmFzLnN0eWxlW2tdID0gc3R5bGVNYXBba107XG4gICAgfSk7XG4gICAgY2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBjYW52YXMuc2V0QXR0cmlidXRlKCdkYXRhLWlkJywgJ2xheWVyJyArIGkpO1xuICAgIGNhbnZhcy5zdHlsZS56SW5kZXggPSBTdHJpbmcoQ1JwLkNBTlZBU19MQVlFUlMgLSBpKTtcbiAgICByLmRhdGEuY2FudmFzQ29udGFpbmVyLmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgci5kYXRhLmNhbnZhc05lZWRzUmVkcmF3W2ldID0gZmFsc2U7XG4gIH1cbiAgci5kYXRhLnRvcENhbnZhcyA9IHIuZGF0YS5jYW52YXNlc1swXTtcbiAgci5kYXRhLmNhbnZhc2VzW0NScC5OT0RFXS5zZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnLCAnbGF5ZXInICsgQ1JwLk5PREUgKyAnLW5vZGUnKTtcbiAgci5kYXRhLmNhbnZhc2VzW0NScC5TRUxFQ1RfQk9YXS5zZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnLCAnbGF5ZXInICsgQ1JwLlNFTEVDVF9CT1ggKyAnLXNlbGVjdGJveCcpO1xuICByLmRhdGEuY2FudmFzZXNbQ1JwLkRSQUddLnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsICdsYXllcicgKyBDUnAuRFJBRyArICctZHJhZycpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IENScC5CVUZGRVJfQ09VTlQ7IGkrKykge1xuICAgIHIuZGF0YS5idWZmZXJDYW52YXNlc1tpXSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgci5kYXRhLmJ1ZmZlckNvbnRleHRzW2ldID0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldLmdldENvbnRleHQoJzJkJyk7XG4gICAgci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICByLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0uc2V0QXR0cmlidXRlKCdkYXRhLWlkJywgJ2J1ZmZlcicgKyBpKTtcbiAgICByLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0uc3R5bGUuekluZGV4ID0gU3RyaW5nKC1pIC0gMSk7XG4gICAgci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAvL3IuZGF0YS5jYW52YXNDb250YWluZXIuYXBwZW5kQ2hpbGQoci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldKTtcbiAgfVxuXG4gIHIucGF0aHNFbmFibGVkID0gdHJ1ZTtcbiAgdmFyIGVtcHR5QmIgPSBtYWtlQm91bmRpbmdCb3goKTtcbiAgdmFyIGdldEJveENlbnRlciA9IGZ1bmN0aW9uIGdldEJveENlbnRlcihiYikge1xuICAgIHJldHVybiB7XG4gICAgICB4OiAoYmIueDEgKyBiYi54MikgLyAyLFxuICAgICAgeTogKGJiLnkxICsgYmIueTIpIC8gMlxuICAgIH07XG4gIH07XG4gIHZhciBnZXRDZW50ZXJPZmZzZXQgPSBmdW5jdGlvbiBnZXRDZW50ZXJPZmZzZXQoYmIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogLWJiLncgLyAyLFxuICAgICAgeTogLWJiLmggLyAyXG4gICAgfTtcbiAgfTtcbiAgdmFyIGJhY2tncm91bmRUaW1lc3RhbXBIYXNDaGFuZ2VkID0gZnVuY3Rpb24gYmFja2dyb3VuZFRpbWVzdGFtcEhhc0NoYW5nZWQoZWxlKSB7XG4gICAgdmFyIF9wID0gZWxlWzBdLl9wcml2YXRlO1xuICAgIHZhciBzYW1lID0gX3Aub2xkQmFja2dyb3VuZFRpbWVzdGFtcCA9PT0gX3AuYmFja2dyb3VuZFRpbWVzdGFtcDtcbiAgICByZXR1cm4gIXNhbWU7XG4gIH07XG4gIHZhciBnZXRTdHlsZUtleSA9IGZ1bmN0aW9uIGdldFN0eWxlS2V5KGVsZSkge1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUubm9kZUtleTtcbiAgfTtcbiAgdmFyIGdldExhYmVsS2V5ID0gZnVuY3Rpb24gZ2V0TGFiZWxLZXkoZWxlKSB7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS5sYWJlbFN0eWxlS2V5O1xuICB9O1xuICB2YXIgZ2V0U291cmNlTGFiZWxLZXkgPSBmdW5jdGlvbiBnZXRTb3VyY2VMYWJlbEtleShlbGUpIHtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLnNvdXJjZUxhYmVsU3R5bGVLZXk7XG4gIH07XG4gIHZhciBnZXRUYXJnZXRMYWJlbEtleSA9IGZ1bmN0aW9uIGdldFRhcmdldExhYmVsS2V5KGVsZSkge1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUudGFyZ2V0TGFiZWxTdHlsZUtleTtcbiAgfTtcbiAgdmFyIGRyYXdFbGVtZW50ID0gZnVuY3Rpb24gZHJhd0VsZW1lbnQoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgdXNlRWxlT3BhY2l0eSkge1xuICAgIHJldHVybiByLmRyYXdFbGVtZW50KGNvbnRleHQsIGVsZSwgYmIsIGZhbHNlLCBmYWxzZSwgdXNlRWxlT3BhY2l0eSk7XG4gIH07XG4gIHZhciBkcmF3TGFiZWwgPSBmdW5jdGlvbiBkcmF3TGFiZWwoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgdXNlRWxlT3BhY2l0eSkge1xuICAgIHJldHVybiByLmRyYXdFbGVtZW50VGV4dChjb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCAnbWFpbicsIHVzZUVsZU9wYWNpdHkpO1xuICB9O1xuICB2YXIgZHJhd1NvdXJjZUxhYmVsID0gZnVuY3Rpb24gZHJhd1NvdXJjZUxhYmVsKGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sIHVzZUVsZU9wYWNpdHkpIHtcbiAgICByZXR1cm4gci5kcmF3RWxlbWVudFRleHQoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgJ3NvdXJjZScsIHVzZUVsZU9wYWNpdHkpO1xuICB9O1xuICB2YXIgZHJhd1RhcmdldExhYmVsID0gZnVuY3Rpb24gZHJhd1RhcmdldExhYmVsKGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sIHVzZUVsZU9wYWNpdHkpIHtcbiAgICByZXR1cm4gci5kcmF3RWxlbWVudFRleHQoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgJ3RhcmdldCcsIHVzZUVsZU9wYWNpdHkpO1xuICB9O1xuICB2YXIgZ2V0RWxlbWVudEJveCA9IGZ1bmN0aW9uIGdldEVsZW1lbnRCb3goZWxlKSB7XG4gICAgZWxlLmJvdW5kaW5nQm94KCk7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS5ib2R5Qm91bmRzO1xuICB9O1xuICB2YXIgZ2V0TGFiZWxCb3ggPSBmdW5jdGlvbiBnZXRMYWJlbEJveChlbGUpIHtcbiAgICBlbGUuYm91bmRpbmdCb3goKTtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLmxhYmVsQm91bmRzLm1haW4gfHwgZW1wdHlCYjtcbiAgfTtcbiAgdmFyIGdldFNvdXJjZUxhYmVsQm94ID0gZnVuY3Rpb24gZ2V0U291cmNlTGFiZWxCb3goZWxlKSB7XG4gICAgZWxlLmJvdW5kaW5nQm94KCk7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS5sYWJlbEJvdW5kcy5zb3VyY2UgfHwgZW1wdHlCYjtcbiAgfTtcbiAgdmFyIGdldFRhcmdldExhYmVsQm94ID0gZnVuY3Rpb24gZ2V0VGFyZ2V0TGFiZWxCb3goZWxlKSB7XG4gICAgZWxlLmJvdW5kaW5nQm94KCk7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS5sYWJlbEJvdW5kcy50YXJnZXQgfHwgZW1wdHlCYjtcbiAgfTtcbiAgdmFyIGlzTGFiZWxWaXNpYmxlQXRTY2FsZSA9IGZ1bmN0aW9uIGlzTGFiZWxWaXNpYmxlQXRTY2FsZShlbGUsIHNjYWxlZExhYmVsU2hvd24pIHtcbiAgICByZXR1cm4gc2NhbGVkTGFiZWxTaG93bjtcbiAgfTtcbiAgdmFyIGdldEVsZW1lbnRSb3RhdGlvblBvaW50ID0gZnVuY3Rpb24gZ2V0RWxlbWVudFJvdGF0aW9uUG9pbnQoZWxlKSB7XG4gICAgcmV0dXJuIGdldEJveENlbnRlcihnZXRFbGVtZW50Qm94KGVsZSkpO1xuICB9O1xuICB2YXIgYWRkVGV4dE1hcmdpbiA9IGZ1bmN0aW9uIGFkZFRleHRNYXJnaW4ocHJlZml4LCBwdCwgZWxlKSB7XG4gICAgdmFyIHByZSA9IHByZWZpeCA/IHByZWZpeCArICctJyA6ICcnO1xuICAgIHJldHVybiB7XG4gICAgICB4OiBwdC54ICsgZWxlLnBzdHlsZShwcmUgKyAndGV4dC1tYXJnaW4teCcpLnBmVmFsdWUsXG4gICAgICB5OiBwdC55ICsgZWxlLnBzdHlsZShwcmUgKyAndGV4dC1tYXJnaW4teScpLnBmVmFsdWVcbiAgICB9O1xuICB9O1xuICB2YXIgZ2V0UnNQdCA9IGZ1bmN0aW9uIGdldFJzUHQoZWxlLCB4LCB5KSB7XG4gICAgdmFyIHJzID0gZWxlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgIHJldHVybiB7XG4gICAgICB4OiByc1t4XSxcbiAgICAgIHk6IHJzW3ldXG4gICAgfTtcbiAgfTtcbiAgdmFyIGdldExhYmVsUm90YXRpb25Qb2ludCA9IGZ1bmN0aW9uIGdldExhYmVsUm90YXRpb25Qb2ludChlbGUpIHtcbiAgICByZXR1cm4gYWRkVGV4dE1hcmdpbignJywgZ2V0UnNQdChlbGUsICdsYWJlbFgnLCAnbGFiZWxZJyksIGVsZSk7XG4gIH07XG4gIHZhciBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uUG9pbnQgPSBmdW5jdGlvbiBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uUG9pbnQoZWxlKSB7XG4gICAgcmV0dXJuIGFkZFRleHRNYXJnaW4oJ3NvdXJjZScsIGdldFJzUHQoZWxlLCAnc291cmNlTGFiZWxYJywgJ3NvdXJjZUxhYmVsWScpLCBlbGUpO1xuICB9O1xuICB2YXIgZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvblBvaW50ID0gZnVuY3Rpb24gZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvblBvaW50KGVsZSkge1xuICAgIHJldHVybiBhZGRUZXh0TWFyZ2luKCd0YXJnZXQnLCBnZXRSc1B0KGVsZSwgJ3RhcmdldExhYmVsWCcsICd0YXJnZXRMYWJlbFknKSwgZWxlKTtcbiAgfTtcbiAgdmFyIGdldEVsZW1lbnRSb3RhdGlvbk9mZnNldCA9IGZ1bmN0aW9uIGdldEVsZW1lbnRSb3RhdGlvbk9mZnNldChlbGUpIHtcbiAgICByZXR1cm4gZ2V0Q2VudGVyT2Zmc2V0KGdldEVsZW1lbnRCb3goZWxlKSk7XG4gIH07XG4gIHZhciBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uT2Zmc2V0ID0gZnVuY3Rpb24gZ2V0U291cmNlTGFiZWxSb3RhdGlvbk9mZnNldChlbGUpIHtcbiAgICByZXR1cm4gZ2V0Q2VudGVyT2Zmc2V0KGdldFNvdXJjZUxhYmVsQm94KGVsZSkpO1xuICB9O1xuICB2YXIgZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvbk9mZnNldCA9IGZ1bmN0aW9uIGdldFRhcmdldExhYmVsUm90YXRpb25PZmZzZXQoZWxlKSB7XG4gICAgcmV0dXJuIGdldENlbnRlck9mZnNldChnZXRUYXJnZXRMYWJlbEJveChlbGUpKTtcbiAgfTtcbiAgdmFyIGdldExhYmVsUm90YXRpb25PZmZzZXQgPSBmdW5jdGlvbiBnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0KGVsZSkge1xuICAgIHZhciBiYiA9IGdldExhYmVsQm94KGVsZSk7XG4gICAgdmFyIHAgPSBnZXRDZW50ZXJPZmZzZXQoZ2V0TGFiZWxCb3goZWxlKSk7XG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgc3dpdGNoIChlbGUucHN0eWxlKCd0ZXh0LWhhbGlnbicpLnZhbHVlKSB7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIHAueCA9IC1iYi53O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgcC54ID0gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZWxlLnBzdHlsZSgndGV4dC12YWxpZ24nKS52YWx1ZSkge1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgIHAueSA9IC1iYi5oO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHAueSA9IDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9O1xuICB2YXIgZWxlVHhyQ2FjaGUgPSByLmRhdGEuZWxlVHhyQ2FjaGUgPSBuZXcgRWxlbWVudFRleHR1cmVDYWNoZShyLCB7XG4gICAgZ2V0S2V5OiBnZXRTdHlsZUtleSxcbiAgICBkb2VzRWxlSW52YWxpZGF0ZUtleTogYmFja2dyb3VuZFRpbWVzdGFtcEhhc0NoYW5nZWQsXG4gICAgZHJhd0VsZW1lbnQ6IGRyYXdFbGVtZW50LFxuICAgIGdldEJvdW5kaW5nQm94OiBnZXRFbGVtZW50Qm94LFxuICAgIGdldFJvdGF0aW9uUG9pbnQ6IGdldEVsZW1lbnRSb3RhdGlvblBvaW50LFxuICAgIGdldFJvdGF0aW9uT2Zmc2V0OiBnZXRFbGVtZW50Um90YXRpb25PZmZzZXQsXG4gICAgYWxsb3dFZGdlVHhyQ2FjaGluZzogZmFsc2UsXG4gICAgYWxsb3dQYXJlbnRUeHJDYWNoaW5nOiBmYWxzZVxuICB9KTtcbiAgdmFyIGxibFR4ckNhY2hlID0gci5kYXRhLmxibFR4ckNhY2hlID0gbmV3IEVsZW1lbnRUZXh0dXJlQ2FjaGUociwge1xuICAgIGdldEtleTogZ2V0TGFiZWxLZXksXG4gICAgZHJhd0VsZW1lbnQ6IGRyYXdMYWJlbCxcbiAgICBnZXRCb3VuZGluZ0JveDogZ2V0TGFiZWxCb3gsXG4gICAgZ2V0Um90YXRpb25Qb2ludDogZ2V0TGFiZWxSb3RhdGlvblBvaW50LFxuICAgIGdldFJvdGF0aW9uT2Zmc2V0OiBnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0LFxuICAgIGlzVmlzaWJsZTogaXNMYWJlbFZpc2libGVBdFNjYWxlXG4gIH0pO1xuICB2YXIgc2xiVHhyQ2FjaGUgPSByLmRhdGEuc2xiVHhyQ2FjaGUgPSBuZXcgRWxlbWVudFRleHR1cmVDYWNoZShyLCB7XG4gICAgZ2V0S2V5OiBnZXRTb3VyY2VMYWJlbEtleSxcbiAgICBkcmF3RWxlbWVudDogZHJhd1NvdXJjZUxhYmVsLFxuICAgIGdldEJvdW5kaW5nQm94OiBnZXRTb3VyY2VMYWJlbEJveCxcbiAgICBnZXRSb3RhdGlvblBvaW50OiBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uUG9pbnQsXG4gICAgZ2V0Um90YXRpb25PZmZzZXQ6IGdldFNvdXJjZUxhYmVsUm90YXRpb25PZmZzZXQsXG4gICAgaXNWaXNpYmxlOiBpc0xhYmVsVmlzaWJsZUF0U2NhbGVcbiAgfSk7XG4gIHZhciB0bGJUeHJDYWNoZSA9IHIuZGF0YS50bGJUeHJDYWNoZSA9IG5ldyBFbGVtZW50VGV4dHVyZUNhY2hlKHIsIHtcbiAgICBnZXRLZXk6IGdldFRhcmdldExhYmVsS2V5LFxuICAgIGRyYXdFbGVtZW50OiBkcmF3VGFyZ2V0TGFiZWwsXG4gICAgZ2V0Qm91bmRpbmdCb3g6IGdldFRhcmdldExhYmVsQm94LFxuICAgIGdldFJvdGF0aW9uUG9pbnQ6IGdldFRhcmdldExhYmVsUm90YXRpb25Qb2ludCxcbiAgICBnZXRSb3RhdGlvbk9mZnNldDogZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvbk9mZnNldCxcbiAgICBpc1Zpc2libGU6IGlzTGFiZWxWaXNpYmxlQXRTY2FsZVxuICB9KTtcbiAgdmFyIGx5clR4ckNhY2hlID0gci5kYXRhLmx5clR4ckNhY2hlID0gbmV3IExheWVyZWRUZXh0dXJlQ2FjaGUocik7XG4gIHIub25VcGRhdGVFbGVDYWxjcyhmdW5jdGlvbiBpbnZhbGlkYXRlVGV4dHVyZUNhY2hlcyh3aWxsRHJhdywgZWxlcykge1xuICAgIC8vIGVhY2ggY2FjaGUgc2hvdWxkIGNoZWNrIGZvciBzdWIta2V5IGRpZmYgdG8gc2VlIHRoYXQgdGhlIHVwZGF0ZSBhZmZlY3RzIHRoYXQgY2FjaGUgcGFydGljdWxhcmx5XG4gICAgZWxlVHhyQ2FjaGUuaW52YWxpZGF0ZUVsZW1lbnRzKGVsZXMpO1xuICAgIGxibFR4ckNhY2hlLmludmFsaWRhdGVFbGVtZW50cyhlbGVzKTtcbiAgICBzbGJUeHJDYWNoZS5pbnZhbGlkYXRlRWxlbWVudHMoZWxlcyk7XG4gICAgdGxiVHhyQ2FjaGUuaW52YWxpZGF0ZUVsZW1lbnRzKGVsZXMpO1xuXG4gICAgLy8gYW55IGNoYW5nZSBpbnZhbGlkYXRlcyB0aGUgbGF5ZXJzXG4gICAgbHlyVHhyQ2FjaGUuaW52YWxpZGF0ZUVsZW1lbnRzKGVsZXMpO1xuXG4gICAgLy8gdXBkYXRlIHRoZSBvbGQgYmcgdGltZXN0YW1wIHNvIGRpZmZzIGNhbiBiZSBkb25lIGluIHRoZSBlbGUgdHhyIGNhY2hlc1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBlbGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9wID0gZWxlc1tfaV0uX3ByaXZhdGU7XG4gICAgICBfcC5vbGRCYWNrZ3JvdW5kVGltZXN0YW1wID0gX3AuYmFja2dyb3VuZFRpbWVzdGFtcDtcbiAgICB9XG4gIH0pO1xuICB2YXIgcmVmaW5lSW5MYXllcnMgPSBmdW5jdGlvbiByZWZpbmVJbkxheWVycyhyZXFzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXFzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBseXJUeHJDYWNoZS5lbnF1ZXVlRWxlbWVudFJlZmluZW1lbnQocmVxc1tpXS5lbGUpO1xuICAgIH1cbiAgfTtcbiAgZWxlVHhyQ2FjaGUub25EZXF1ZXVlKHJlZmluZUluTGF5ZXJzKTtcbiAgbGJsVHhyQ2FjaGUub25EZXF1ZXVlKHJlZmluZUluTGF5ZXJzKTtcbiAgc2xiVHhyQ2FjaGUub25EZXF1ZXVlKHJlZmluZUluTGF5ZXJzKTtcbiAgdGxiVHhyQ2FjaGUub25EZXF1ZXVlKHJlZmluZUluTGF5ZXJzKTtcbn1cbkNScC5yZWRyYXdIaW50ID0gZnVuY3Rpb24gKGdyb3VwLCBib29sKSB7XG4gIHZhciByID0gdGhpcztcbiAgc3dpdGNoIChncm91cCkge1xuICAgIGNhc2UgJ2VsZXMnOlxuICAgICAgci5kYXRhLmNhbnZhc05lZWRzUmVkcmF3W0NScC5OT0RFXSA9IGJvb2w7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkcmFnJzpcbiAgICAgIHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tDUnAuRFJBR10gPSBib29sO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tDUnAuU0VMRUNUX0JPWF0gPSBib29sO1xuICAgICAgYnJlYWs7XG4gIH1cbn07XG5cbi8vIHdoZXRoZXIgdG8gdXNlIFBhdGgyRCBjYWNoaW5nIGZvciBkcmF3aW5nXG52YXIgcGF0aHNJbXBsZCA9IHR5cGVvZiBQYXRoMkQgIT09ICd1bmRlZmluZWQnO1xuQ1JwLnBhdGgyZEVuYWJsZWQgPSBmdW5jdGlvbiAob24pIHtcbiAgaWYgKG9uID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdGhpcy5wYXRoc0VuYWJsZWQ7XG4gIH1cbiAgdGhpcy5wYXRoc0VuYWJsZWQgPSBvbiA/IHRydWUgOiBmYWxzZTtcbn07XG5DUnAudXNlUGF0aHMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBwYXRoc0ltcGxkICYmIHRoaXMucGF0aHNFbmFibGVkO1xufTtcbkNScC5zZXRJbWdTbW9vdGhpbmcgPSBmdW5jdGlvbiAoY29udGV4dCwgYm9vbCkge1xuICBpZiAoY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgIT0gbnVsbCkge1xuICAgIGNvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gYm9vbDtcbiAgfSBlbHNlIHtcbiAgICBjb250ZXh0LndlYmtpdEltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGJvb2w7XG4gICAgY29udGV4dC5tb3pJbWFnZVNtb290aGluZ0VuYWJsZWQgPSBib29sO1xuICAgIGNvbnRleHQubXNJbWFnZVNtb290aGluZ0VuYWJsZWQgPSBib29sO1xuICB9XG59O1xuQ1JwLmdldEltZ1Ntb290aGluZyA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gIGlmIChjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIGNvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb250ZXh0LndlYmtpdEltYWdlU21vb3RoaW5nRW5hYmxlZCB8fCBjb250ZXh0Lm1vekltYWdlU21vb3RoaW5nRW5hYmxlZCB8fCBjb250ZXh0Lm1zSW1hZ2VTbW9vdGhpbmdFbmFibGVkO1xuICB9XG59O1xuQ1JwLm1ha2VPZmZzY3JlZW5DYW52YXMgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuICB2YXIgY2FudmFzO1xuICBpZiAoKHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihPZmZzY3JlZW5DYW52YXMpKSAhPT0gKFwidW5kZWZpbmVkXCIgKSkge1xuICAgIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7XG4gIH0gZWxzZSB7XG4gICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG4gIHJldHVybiBjYW52YXM7XG59O1xuW0NScCRhLCBDUnAkOSwgQ1JwJDgsIENScCQ3LCBDUnAkNiwgQ1JwJDUsIENScCQ0LCBDUnAkMywgQ1JwJDIsIENScCQxXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoQ1JwLCBwcm9wcyk7XG59KTtcblxudmFyIHJlbmRlcmVyID0gW3tcbiAgbmFtZTogJ251bGwnLFxuICBpbXBsOiBOdWxsUmVuZGVyZXJcbn0sIHtcbiAgbmFtZTogJ2Jhc2UnLFxuICBpbXBsOiBCUlxufSwge1xuICBuYW1lOiAnY2FudmFzJyxcbiAgaW1wbDogQ1Jcbn1dO1xuXG52YXIgaW5jRXh0cyA9IFt7XG4gIHR5cGU6ICdsYXlvdXQnLFxuICBleHRlbnNpb25zOiBsYXlvdXRcbn0sIHtcbiAgdHlwZTogJ3JlbmRlcmVyJyxcbiAgZXh0ZW5zaW9uczogcmVuZGVyZXJcbn1dO1xuXG4vLyByZWdpc3RlcmVkIGV4dGVuc2lvbnMgdG8gY3l0b3NjYXBlLCBpbmRleGVkIGJ5IG5hbWVcbnZhciBleHRlbnNpb25zID0ge307XG5cbi8vIHJlZ2lzdGVyZWQgbW9kdWxlcyBmb3IgZXh0ZW5zaW9ucywgaW5kZXhlZCBieSBuYW1lXG52YXIgbW9kdWxlcyA9IHt9O1xuZnVuY3Rpb24gc2V0RXh0ZW5zaW9uKHR5cGUsIG5hbWUsIHJlZ2lzdHJhbnQpIHtcbiAgdmFyIGV4dCA9IHJlZ2lzdHJhbnQ7XG4gIHZhciBvdmVycmlkZUVyciA9IGZ1bmN0aW9uIG92ZXJyaWRlRXJyKGZpZWxkKSB7XG4gICAgd2FybignQ2FuIG5vdCByZWdpc3RlciBgJyArIG5hbWUgKyAnYCBmb3IgYCcgKyB0eXBlICsgJ2Agc2luY2UgYCcgKyBmaWVsZCArICdgIGFscmVhZHkgZXhpc3RzIGluIHRoZSBwcm90b3R5cGUgYW5kIGNhbiBub3QgYmUgb3ZlcnJpZGRlbicpO1xuICB9O1xuICBpZiAodHlwZSA9PT0gJ2NvcmUnKSB7XG4gICAgaWYgKENvcmUucHJvdG90eXBlW25hbWVdKSB7XG4gICAgICByZXR1cm4gb3ZlcnJpZGVFcnIobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIENvcmUucHJvdG90eXBlW25hbWVdID0gcmVnaXN0cmFudDtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NvbGxlY3Rpb24nKSB7XG4gICAgaWYgKENvbGxlY3Rpb24ucHJvdG90eXBlW25hbWVdKSB7XG4gICAgICByZXR1cm4gb3ZlcnJpZGVFcnIobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIENvbGxlY3Rpb24ucHJvdG90eXBlW25hbWVdID0gcmVnaXN0cmFudDtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2xheW91dCcpIHtcbiAgICAvLyBmaWxsIGluIG1pc3NpbmcgbGF5b3V0IGZ1bmN0aW9ucyBpbiB0aGUgcHJvdG90eXBlXG5cbiAgICB2YXIgTGF5b3V0ID0gZnVuY3Rpb24gTGF5b3V0KG9wdGlvbnMpIHtcbiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICByZWdpc3RyYW50LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgICAgIC8vIG1ha2Ugc3VyZSBsYXlvdXQgaGFzIF9wcml2YXRlIGZvciB1c2Ugdy8gc3RkIGFwaXMgbGlrZSAub24oKVxuICAgICAgaWYgKCFwbGFpbk9iamVjdCh0aGlzLl9wcml2YXRlKSkge1xuICAgICAgICB0aGlzLl9wcml2YXRlID0ge307XG4gICAgICB9XG4gICAgICB0aGlzLl9wcml2YXRlLmN5ID0gb3B0aW9ucy5jeTtcbiAgICAgIHRoaXMuX3ByaXZhdGUubGlzdGVuZXJzID0gW107XG4gICAgICB0aGlzLmNyZWF0ZUVtaXR0ZXIoKTtcbiAgICB9O1xuICAgIHZhciBsYXlvdXRQcm90byA9IExheW91dC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHJlZ2lzdHJhbnQucHJvdG90eXBlKTtcbiAgICB2YXIgb3B0TGF5b3V0Rm5zID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRMYXlvdXRGbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBmbk5hbWUgPSBvcHRMYXlvdXRGbnNbaV07XG4gICAgICBsYXlvdXRQcm90b1tmbk5hbWVdID0gbGF5b3V0UHJvdG9bZm5OYW1lXSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBlaXRoZXIgLnN0YXJ0KCkgb3IgLnJ1bigpIGlzIGRlZmluZWQsIHNvIGF1dG9nZW4gdGhlIG90aGVyXG4gICAgaWYgKGxheW91dFByb3RvLnN0YXJ0ICYmICFsYXlvdXRQcm90by5ydW4pIHtcbiAgICAgIGxheW91dFByb3RvLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zdGFydCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICghbGF5b3V0UHJvdG8uc3RhcnQgJiYgbGF5b3V0UHJvdG8ucnVuKSB7XG4gICAgICBsYXlvdXRQcm90by5zdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ydW4oKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgcmVnU3RvcCA9IHJlZ2lzdHJhbnQucHJvdG90eXBlLnN0b3A7XG4gICAgbGF5b3V0UHJvdG8uc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBvcHRzID0gdGhpcy5vcHRpb25zO1xuICAgICAgaWYgKG9wdHMgJiYgb3B0cy5hbmltYXRlKSB7XG4gICAgICAgIHZhciBhbmlzID0gdGhpcy5hbmltYXRpb25zO1xuICAgICAgICBpZiAoYW5pcykge1xuICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhbmlzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYW5pc1tfaV0uc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlZ1N0b3ApIHtcbiAgICAgICAgcmVnU3RvcC5jYWxsKHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbWl0KCdsYXlvdXRzdG9wJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIGlmICghbGF5b3V0UHJvdG8uZGVzdHJveSkge1xuICAgICAgbGF5b3V0UHJvdG8uZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9O1xuICAgIH1cbiAgICBsYXlvdXRQcm90by5jeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmN5O1xuICAgIH07XG4gICAgdmFyIGdldEN5ID0gZnVuY3Rpb24gZ2V0Q3kobGF5b3V0KSB7XG4gICAgICByZXR1cm4gbGF5b3V0Ll9wcml2YXRlLmN5O1xuICAgIH07XG4gICAgdmFyIGVtaXR0ZXJPcHRzID0ge1xuICAgICAgYWRkRXZlbnRGaWVsZHM6IGZ1bmN0aW9uIGFkZEV2ZW50RmllbGRzKGxheW91dCwgZXZ0KSB7XG4gICAgICAgIGV2dC5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgICAgIGV2dC5jeSA9IGdldEN5KGxheW91dCk7XG4gICAgICAgIGV2dC50YXJnZXQgPSBsYXlvdXQ7XG4gICAgICB9LFxuICAgICAgYnViYmxlOiBmdW5jdGlvbiBidWJibGUoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIHBhcmVudDogZnVuY3Rpb24gcGFyZW50KGxheW91dCkge1xuICAgICAgICByZXR1cm4gZ2V0Q3kobGF5b3V0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGV4dGVuZChsYXlvdXRQcm90bywge1xuICAgICAgY3JlYXRlRW1pdHRlcjogZnVuY3Rpb24gY3JlYXRlRW1pdHRlcigpIHtcbiAgICAgICAgdGhpcy5fcHJpdmF0ZS5lbWl0dGVyID0gbmV3IEVtaXR0ZXIoZW1pdHRlck9wdHMsIHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBlbWl0dGVyOiBmdW5jdGlvbiBlbWl0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbWl0dGVyO1xuICAgICAgfSxcbiAgICAgIG9uOiBmdW5jdGlvbiBvbihldnQsIGNiKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLm9uKGV2dCwgY2IpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBvbmU6IGZ1bmN0aW9uIG9uZShldnQsIGNiKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLm9uZShldnQsIGNiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgb25jZTogZnVuY3Rpb24gb25jZShldnQsIGNiKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLm9uZShldnQsIGNiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlTGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2dCwgY2IpIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyKCkucmVtb3ZlTGlzdGVuZXIoZXZ0LCBjYik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZUFsbExpc3RlbmVyczogZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKCkge1xuICAgICAgICB0aGlzLmVtaXR0ZXIoKS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgZW1pdDogZnVuY3Rpb24gZW1pdChldnQsIHBhcmFtcykge1xuICAgICAgICB0aGlzLmVtaXR0ZXIoKS5lbWl0KGV2dCwgcGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZGVmaW5lLmV2ZW50QWxpYXNlc09uKGxheW91dFByb3RvKTtcbiAgICBleHQgPSBMYXlvdXQ7IC8vIHJlcGxhY2Ugd2l0aCBvdXIgd3JhcHBlZCBsYXlvdXRcbiAgfSBlbHNlIGlmICh0eXBlID09PSAncmVuZGVyZXInICYmIG5hbWUgIT09ICdudWxsJyAmJiBuYW1lICE9PSAnYmFzZScpIHtcbiAgICAvLyB1c2VyIHJlZ2lzdGVyZWQgcmVuZGVyZXJzIGluaGVyaXQgZnJvbSBiYXNlXG5cbiAgICB2YXIgQmFzZVJlbmRlcmVyID0gZ2V0RXh0ZW5zaW9uKCdyZW5kZXJlcicsICdiYXNlJyk7XG4gICAgdmFyIGJQcm90byA9IEJhc2VSZW5kZXJlci5wcm90b3R5cGU7XG4gICAgdmFyIFJlZ2lzdHJhbnRSZW5kZXJlciA9IHJlZ2lzdHJhbnQ7XG4gICAgdmFyIHJQcm90byA9IHJlZ2lzdHJhbnQucHJvdG90eXBlO1xuICAgIHZhciBSZW5kZXJlciA9IGZ1bmN0aW9uIFJlbmRlcmVyKCkge1xuICAgICAgQmFzZVJlbmRlcmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBSZWdpc3RyYW50UmVuZGVyZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIHZhciBwcm90byA9IFJlbmRlcmVyLnByb3RvdHlwZTtcbiAgICBmb3IgKHZhciBwTmFtZSBpbiBiUHJvdG8pIHtcbiAgICAgIHZhciBwVmFsID0gYlByb3RvW3BOYW1lXTtcbiAgICAgIHZhciBleGlzdHNJblIgPSByUHJvdG9bcE5hbWVdICE9IG51bGw7XG4gICAgICBpZiAoZXhpc3RzSW5SKSB7XG4gICAgICAgIHJldHVybiBvdmVycmlkZUVycihwTmFtZSk7XG4gICAgICB9XG4gICAgICBwcm90b1twTmFtZV0gPSBwVmFsOyAvLyB0YWtlIGltcGwgZnJvbSBiYXNlXG4gICAgfVxuXG4gICAgZm9yICh2YXIgX3BOYW1lIGluIHJQcm90bykge1xuICAgICAgcHJvdG9bX3BOYW1lXSA9IHJQcm90b1tfcE5hbWVdOyAvLyB0YWtlIGltcGwgZnJvbSByZWdpc3RyYW50XG4gICAgfVxuXG4gICAgYlByb3RvLmNsaWVudEZ1bmN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBwcm90b1tuYW1lXSA9IHByb3RvW25hbWVdIHx8IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXJyb3IoJ1JlbmRlcmVyIGRvZXMgbm90IGltcGxlbWVudCBgcmVuZGVyZXIuJyArIG5hbWUgKyAnKClgIG9uIGl0cyBwcm90b3R5cGUnKTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgZXh0ID0gUmVuZGVyZXI7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ19fcHJvdG9fXycgfHwgdHlwZSA9PT0gJ2NvbnN0cnVjdG9yJyB8fCB0eXBlID09PSAncHJvdG90eXBlJykge1xuICAgIC8vIHRvIGF2b2lkIHBvdGVudGlhbCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gICAgcmV0dXJuIGVycm9yKHR5cGUgKyAnIGlzIGFuIGlsbGVnYWwgdHlwZSB0byBiZSByZWdpc3RlcmVkLCBwb3NzaWJseSBsZWFkIHRvIHByb3RvdHlwZSBwb2xsdXRpb25zJyk7XG4gIH1cbiAgcmV0dXJuIHNldE1hcCh7XG4gICAgbWFwOiBleHRlbnNpb25zLFxuICAgIGtleXM6IFt0eXBlLCBuYW1lXSxcbiAgICB2YWx1ZTogZXh0XG4gIH0pO1xufVxuZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uKHR5cGUsIG5hbWUpIHtcbiAgcmV0dXJuIGdldE1hcCh7XG4gICAgbWFwOiBleHRlbnNpb25zLFxuICAgIGtleXM6IFt0eXBlLCBuYW1lXVxuICB9KTtcbn1cbmZ1bmN0aW9uIHNldE1vZHVsZSh0eXBlLCBuYW1lLCBtb2R1bGVUeXBlLCBtb2R1bGVOYW1lLCByZWdpc3RyYW50KSB7XG4gIHJldHVybiBzZXRNYXAoe1xuICAgIG1hcDogbW9kdWxlcyxcbiAgICBrZXlzOiBbdHlwZSwgbmFtZSwgbW9kdWxlVHlwZSwgbW9kdWxlTmFtZV0sXG4gICAgdmFsdWU6IHJlZ2lzdHJhbnRcbiAgfSk7XG59XG5mdW5jdGlvbiBnZXRNb2R1bGUodHlwZSwgbmFtZSwgbW9kdWxlVHlwZSwgbW9kdWxlTmFtZSkge1xuICByZXR1cm4gZ2V0TWFwKHtcbiAgICBtYXA6IG1vZHVsZXMsXG4gICAga2V5czogW3R5cGUsIG5hbWUsIG1vZHVsZVR5cGUsIG1vZHVsZU5hbWVdXG4gIH0pO1xufVxudmFyIGV4dGVuc2lvbiA9IGZ1bmN0aW9uIGV4dGVuc2lvbigpIHtcbiAgLy8gZS5nLiBleHRlbnNpb24oJ3JlbmRlcmVyJywgJ3N2ZycpXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gZS5nLiBleHRlbnNpb24oJ3JlbmRlcmVyJywgJ3N2ZycsIHsgLi4uIH0pXG4gIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICByZXR1cm4gc2V0RXh0ZW5zaW9uLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyBlLmcuIGV4dGVuc2lvbigncmVuZGVyZXInLCAnc3ZnJywgJ25vZGVTaGFwZScsICdlbGxpcHNlJylcbiAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCkge1xuICAgIHJldHVybiBnZXRNb2R1bGUuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIGUuZy4gZXh0ZW5zaW9uKCdyZW5kZXJlcicsICdzdmcnLCAnbm9kZVNoYXBlJywgJ2VsbGlwc2UnLCB7IC4uLiB9KVxuICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA1KSB7XG4gICAgcmV0dXJuIHNldE1vZHVsZS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9IGVsc2Uge1xuICAgIGVycm9yKCdJbnZhbGlkIGV4dGVuc2lvbiBhY2Nlc3Mgc3ludGF4Jyk7XG4gIH1cbn07XG5cbi8vIGFsbG93cyBhIGNvcmUgaW5zdGFuY2UgdG8gYWNjZXNzIGV4dGVuc2lvbnMgaW50ZXJuYWxseVxuQ29yZS5wcm90b3R5cGUuZXh0ZW5zaW9uID0gZXh0ZW5zaW9uO1xuXG4vLyBpbmNsdWRlZCBleHRlbnNpb25zXG5pbmNFeHRzLmZvckVhY2goZnVuY3Rpb24gKGdyb3VwKSB7XG4gIGdyb3VwLmV4dGVuc2lvbnMuZm9yRWFjaChmdW5jdGlvbiAoZXh0KSB7XG4gICAgc2V0RXh0ZW5zaW9uKGdyb3VwLnR5cGUsIGV4dC5uYW1lLCBleHQuaW1wbCk7XG4gIH0pO1xufSk7XG5cbi8vIGEgZHVtbXkgc3R5bGVzaGVldCBvYmplY3QgdGhhdCBkb2Vzbid0IG5lZWQgYSByZWZlcmVuY2UgdG8gdGhlIGNvcmVcbi8vICh1c2VmdWwgZm9yIGluaXQpXG52YXIgU3R5bGVzaGVldCA9IGZ1bmN0aW9uIFN0eWxlc2hlZXQoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTdHlsZXNoZWV0KSkge1xuICAgIHJldHVybiBuZXcgU3R5bGVzaGVldCgpO1xuICB9XG4gIHRoaXMubGVuZ3RoID0gMDtcbn07XG52YXIgc2hlZXRmbiA9IFN0eWxlc2hlZXQucHJvdG90eXBlO1xuc2hlZXRmbi5pbnN0YW5jZVN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdzdHlsZXNoZWV0Jztcbn07XG5cbi8vIGp1c3Qgc3RvcmUgdGhlIHNlbGVjdG9yIHRvIGJlIHBhcnNlZCBsYXRlclxuc2hlZXRmbi5zZWxlY3RvciA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICB2YXIgaSA9IHRoaXMubGVuZ3RoKys7XG4gIHRoaXNbaV0gPSB7XG4gICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgIHByb3BlcnRpZXM6IFtdXG4gIH07XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxuLy8ganVzdCBzdG9yZSB0aGUgcHJvcGVydHkgdG8gYmUgcGFyc2VkIGxhdGVyXG5zaGVldGZuLmNzcyA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICB2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTtcbiAgaWYgKHN0cmluZyhuYW1lKSkge1xuICAgIHRoaXNbaV0ucHJvcGVydGllcy5wdXNoKHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWVcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChwbGFpbk9iamVjdChuYW1lKSkge1xuICAgIHZhciBtYXAgPSBuYW1lO1xuICAgIHZhciBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhtYXApO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHJvcE5hbWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcE5hbWVzW2pdO1xuICAgICAgdmFyIG1hcFZhbCA9IG1hcFtrZXldO1xuICAgICAgaWYgKG1hcFZhbCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIHByb3AgPSBTdHlsZS5wcm9wZXJ0aWVzW2tleV0gfHwgU3R5bGUucHJvcGVydGllc1tkYXNoMmNhbWVsKGtleSldO1xuICAgICAgaWYgKHByb3AgPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBfbmFtZSA9IHByb3AubmFtZTtcbiAgICAgIHZhciBfdmFsdWUgPSBtYXBWYWw7XG4gICAgICB0aGlzW2ldLnByb3BlcnRpZXMucHVzaCh7XG4gICAgICAgIG5hbWU6IF9uYW1lLFxuICAgICAgICB2YWx1ZTogX3ZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG5zaGVldGZuLnN0eWxlID0gc2hlZXRmbi5jc3M7XG5cbi8vIGdlbmVyYXRlIGEgcmVhbCBzdHlsZSBvYmplY3QgZnJvbSB0aGUgZHVtbXkgc3R5bGVzaGVldFxuc2hlZXRmbi5nZW5lcmF0ZVN0eWxlID0gZnVuY3Rpb24gKGN5KSB7XG4gIHZhciBzdHlsZSA9IG5ldyBTdHlsZShjeSk7XG4gIHJldHVybiB0aGlzLmFwcGVuZFRvU3R5bGUoc3R5bGUpO1xufTtcblxuLy8gYXBwZW5kIGEgZHVtbXkgc3R5bGVzaGVldCBvYmplY3Qgb24gYSByZWFsIHN0eWxlIG9iamVjdFxuc2hlZXRmbi5hcHBlbmRUb1N0eWxlID0gZnVuY3Rpb24gKHN0eWxlKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjb250ZXh0ID0gdGhpc1tpXTtcbiAgICB2YXIgc2VsZWN0b3IgPSBjb250ZXh0LnNlbGVjdG9yO1xuICAgIHZhciBwcm9wcyA9IGNvbnRleHQucHJvcGVydGllcztcbiAgICBzdHlsZS5zZWxlY3RvcihzZWxlY3Rvcik7IC8vIGFwcGx5IHNlbGVjdG9yXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByb3BzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgcHJvcCA9IHByb3BzW2pdO1xuICAgICAgc3R5bGUuY3NzKHByb3AubmFtZSwgcHJvcC52YWx1ZSk7IC8vIGFwcGx5IHByb3BlcnR5XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0eWxlO1xufTtcblxudmFyIHZlcnNpb24gPSBcIjMuMjkuMlwiO1xuXG52YXIgY3l0b3NjYXBlID0gZnVuY3Rpb24gY3l0b3NjYXBlKG9wdGlvbnMpIHtcbiAgLy8gaWYgbm8gb3B0aW9ucyBzcGVjaWZpZWQsIHVzZSBkZWZhdWx0XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICAvLyBjcmVhdGUgaW5zdGFuY2VcbiAgaWYgKHBsYWluT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIG5ldyBDb3JlKG9wdGlvbnMpO1xuICB9XG5cbiAgLy8gYWxsb3cgZm9yIHJlZ2lzdHJhdGlvbiBvZiBleHRlbnNpb25zXG4gIGVsc2UgaWYgKHN0cmluZyhvcHRpb25zKSkge1xuICAgIHJldHVybiBleHRlbnNpb24uYXBwbHkoZXh0ZW5zaW9uLCBhcmd1bWVudHMpO1xuICB9XG59O1xuXG4vLyBlLmcuIGN5dG9zY2FwZS51c2UoIHJlcXVpcmUoJ2N5dG9zY2FwZS1mb28nKSwgYmFyIClcbmN5dG9zY2FwZS51c2UgPSBmdW5jdGlvbiAoZXh0KSB7XG4gIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsgLy8gYXJncyB0byBwYXNzIHRvIGV4dFxuXG4gIGFyZ3MudW5zaGlmdChjeXRvc2NhcGUpOyAvLyBjeXRvc2NhcGUgaXMgZmlyc3QgYXJnIHRvIGV4dFxuXG4gIGV4dC5hcHBseShudWxsLCBhcmdzKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuY3l0b3NjYXBlLndhcm5pbmdzID0gZnVuY3Rpb24gKGJvb2wpIHtcbiAgcmV0dXJuIHdhcm5pbmdzKGJvb2wpO1xufTtcblxuLy8gcmVwbGFjZWQgYnkgYnVpbGQgc3lzdGVtXG5jeXRvc2NhcGUudmVyc2lvbiA9IHZlcnNpb247XG5cbi8vIGV4cG9zZSBwdWJsaWMgYXBpcyAobW9zdGx5IGZvciBleHRlbnNpb25zKVxuY3l0b3NjYXBlLnN0eWxlc2hlZXQgPSBjeXRvc2NhcGUuU3R5bGVzaGVldCA9IFN0eWxlc2hlZXQ7XG5cbmV4cG9ydCB7IGN5dG9zY2FwZSBhcyBkZWZhdWx0IH07XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHRsb2FkZWQ6IGZhbHNlLFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdGlmICghKG1vZHVsZUlkIGluIF9fd2VicGFja19tb2R1bGVzX18pKSB7XG5cdFx0ZGVsZXRlIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgbW9kdWxlSWQgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubmMgPSB1bmRlZmluZWQ7IiwiLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zICovXG52YXIgZyA9XG4gICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsVGhpcykgfHxcbiAgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmKSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbCkgfHxcbiAge31cblxudmFyIHN1cHBvcnQgPSB7XG4gIHNlYXJjaFBhcmFtczogJ1VSTFNlYXJjaFBhcmFtcycgaW4gZyxcbiAgaXRlcmFibGU6ICdTeW1ib2wnIGluIGcgJiYgJ2l0ZXJhdG9yJyBpbiBTeW1ib2wsXG4gIGJsb2I6XG4gICAgJ0ZpbGVSZWFkZXInIGluIGcgJiZcbiAgICAnQmxvYicgaW4gZyAmJlxuICAgIChmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBCbG9iKClcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSkoKSxcbiAgZm9ybURhdGE6ICdGb3JtRGF0YScgaW4gZyxcbiAgYXJyYXlCdWZmZXI6ICdBcnJheUJ1ZmZlcicgaW4gZ1xufVxuXG5mdW5jdGlvbiBpc0RhdGFWaWV3KG9iaikge1xuICByZXR1cm4gb2JqICYmIERhdGFWaWV3LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG9iailcbn1cblxuaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIpIHtcbiAgdmFyIHZpZXdDbGFzc2VzID0gW1xuICAgICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50MzJBcnJheV0nLFxuICAgICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nXG4gIF1cblxuICB2YXIgaXNBcnJheUJ1ZmZlclZpZXcgPVxuICAgIEFycmF5QnVmZmVyLmlzVmlldyB8fFxuICAgIGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB2aWV3Q2xhc3Nlcy5pbmRleE9mKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopKSA+IC0xXG4gICAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOYW1lKG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgIG5hbWUgPSBTdHJpbmcobmFtZSlcbiAgfVxuICBpZiAoL1teYS16MC05XFwtIyQlJicqKy5eX2B8fiFdL2kudGVzdChuYW1lKSB8fCBuYW1lID09PSAnJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVyIGluIGhlYWRlciBmaWVsZCBuYW1lOiBcIicgKyBuYW1lICsgJ1wiJylcbiAgfVxuICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpXG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8vIEJ1aWxkIGEgZGVzdHJ1Y3RpdmUgaXRlcmF0b3IgZm9yIHRoZSB2YWx1ZSBsaXN0XG5mdW5jdGlvbiBpdGVyYXRvckZvcihpdGVtcykge1xuICB2YXIgaXRlcmF0b3IgPSB7XG4gICAgbmV4dDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdmFsdWUgPSBpdGVtcy5zaGlmdCgpXG4gICAgICByZXR1cm4ge2RvbmU6IHZhbHVlID09PSB1bmRlZmluZWQsIHZhbHVlOiB2YWx1ZX1cbiAgICB9XG4gIH1cblxuICBpZiAoc3VwcG9ydC5pdGVyYWJsZSkge1xuICAgIGl0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBpdGVyYXRvclxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpdGVyYXRvclxufVxuXG5leHBvcnQgZnVuY3Rpb24gSGVhZGVycyhoZWFkZXJzKSB7XG4gIHRoaXMubWFwID0ge31cblxuICBpZiAoaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgIHRoaXMuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgIH0sIHRoaXMpXG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbihoZWFkZXIpIHtcbiAgICAgIGlmIChoZWFkZXIubGVuZ3RoICE9IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSGVhZGVycyBjb25zdHJ1Y3RvcjogZXhwZWN0ZWQgbmFtZS92YWx1ZSBwYWlyIHRvIGJlIGxlbmd0aCAyLCBmb3VuZCcgKyBoZWFkZXIubGVuZ3RoKVxuICAgICAgfVxuICAgICAgdGhpcy5hcHBlbmQoaGVhZGVyWzBdLCBoZWFkZXJbMV0pXG4gICAgfSwgdGhpcylcbiAgfSBlbHNlIGlmIChoZWFkZXJzKSB7XG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICB0aGlzLmFwcGVuZChuYW1lLCBoZWFkZXJzW25hbWVdKVxuICAgIH0sIHRoaXMpXG4gIH1cbn1cblxuSGVhZGVycy5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSlcbiAgdmFsdWUgPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSlcbiAgdmFyIG9sZFZhbHVlID0gdGhpcy5tYXBbbmFtZV1cbiAgdGhpcy5tYXBbbmFtZV0gPSBvbGRWYWx1ZSA/IG9sZFZhbHVlICsgJywgJyArIHZhbHVlIDogdmFsdWVcbn1cblxuSGVhZGVycy5wcm90b3R5cGVbJ2RlbGV0ZSddID0gZnVuY3Rpb24obmFtZSkge1xuICBkZWxldGUgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV1cbn1cblxuSGVhZGVycy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24obmFtZSkge1xuICBuYW1lID0gbm9ybWFsaXplTmFtZShuYW1lKVxuICByZXR1cm4gdGhpcy5oYXMobmFtZSkgPyB0aGlzLm1hcFtuYW1lXSA6IG51bGxcbn1cblxuSGVhZGVycy5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gdGhpcy5tYXAuaGFzT3duUHJvcGVydHkobm9ybWFsaXplTmFtZShuYW1lKSlcbn1cblxuSGVhZGVycy5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSlcbn1cblxuSGVhZGVycy5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gIGZvciAodmFyIG5hbWUgaW4gdGhpcy5tYXApIHtcbiAgICBpZiAodGhpcy5tYXAuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpcy5tYXBbbmFtZV0sIG5hbWUsIHRoaXMpXG4gICAgfVxuICB9XG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgaXRlbXMucHVzaChuYW1lKVxuICB9KVxuICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXRlbXMgPSBbXVxuICB0aGlzLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpdGVtcy5wdXNoKHZhbHVlKVxuICB9KVxuICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgaXRlbXMucHVzaChbbmFtZSwgdmFsdWVdKVxuICB9KVxuICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG59XG5cbmlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7XG4gIEhlYWRlcnMucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBIZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzXG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVkKGJvZHkpIHtcbiAgaWYgKGJvZHkuX25vQm9keSkgcmV0dXJuXG4gIGlmIChib2R5LmJvZHlVc2VkKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpKVxuICB9XG4gIGJvZHkuYm9keVVzZWQgPSB0cnVlXG59XG5cbmZ1bmN0aW9uIGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlc29sdmUocmVhZGVyLnJlc3VsdClcbiAgICB9XG4gICAgcmVhZGVyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlamVjdChyZWFkZXIuZXJyb3IpXG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiByZWFkQmxvYkFzQXJyYXlCdWZmZXIoYmxvYikge1xuICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpXG4gIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKVxuICByZXR1cm4gcHJvbWlzZVxufVxuXG5mdW5jdGlvbiByZWFkQmxvYkFzVGV4dChibG9iKSB7XG4gIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXG4gIHZhciBwcm9taXNlID0gZmlsZVJlYWRlclJlYWR5KHJlYWRlcilcbiAgdmFyIG1hdGNoID0gL2NoYXJzZXQ9KFtBLVphLXowLTlfLV0rKS8uZXhlYyhibG9iLnR5cGUpXG4gIHZhciBlbmNvZGluZyA9IG1hdGNoID8gbWF0Y2hbMV0gOiAndXRmLTgnXG4gIHJlYWRlci5yZWFkQXNUZXh0KGJsb2IsIGVuY29kaW5nKVxuICByZXR1cm4gcHJvbWlzZVxufVxuXG5mdW5jdGlvbiByZWFkQXJyYXlCdWZmZXJBc1RleHQoYnVmKSB7XG4gIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKVxuICB2YXIgY2hhcnMgPSBuZXcgQXJyYXkodmlldy5sZW5ndGgpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aWV3Lmxlbmd0aDsgaSsrKSB7XG4gICAgY2hhcnNbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHZpZXdbaV0pXG4gIH1cbiAgcmV0dXJuIGNoYXJzLmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGJ1ZmZlckNsb25lKGJ1Zikge1xuICBpZiAoYnVmLnNsaWNlKSB7XG4gICAgcmV0dXJuIGJ1Zi5zbGljZSgwKVxuICB9IGVsc2Uge1xuICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ5dGVMZW5ndGgpXG4gICAgdmlldy5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmKSlcbiAgICByZXR1cm4gdmlldy5idWZmZXJcbiAgfVxufVxuXG5mdW5jdGlvbiBCb2R5KCkge1xuICB0aGlzLmJvZHlVc2VkID0gZmFsc2VcblxuICB0aGlzLl9pbml0Qm9keSA9IGZ1bmN0aW9uKGJvZHkpIHtcbiAgICAvKlxuICAgICAgZmV0Y2gtbW9jayB3cmFwcyB0aGUgUmVzcG9uc2Ugb2JqZWN0IGluIGFuIEVTNiBQcm94eSB0b1xuICAgICAgcHJvdmlkZSB1c2VmdWwgdGVzdCBoYXJuZXNzIGZlYXR1cmVzIHN1Y2ggYXMgZmx1c2guIEhvd2V2ZXIsIG9uXG4gICAgICBFUzUgYnJvd3NlcnMgd2l0aG91dCBmZXRjaCBvciBQcm94eSBzdXBwb3J0IHBvbGx5ZmlsbHMgbXVzdCBiZSB1c2VkO1xuICAgICAgdGhlIHByb3h5LXBvbGx5ZmlsbCBpcyB1bmFibGUgdG8gcHJveHkgYW4gYXR0cmlidXRlIHVubGVzcyBpdCBleGlzdHNcbiAgICAgIG9uIHRoZSBvYmplY3QgYmVmb3JlIHRoZSBQcm94eSBpcyBjcmVhdGVkLiBUaGlzIGNoYW5nZSBlbnN1cmVzXG4gICAgICBSZXNwb25zZS5ib2R5VXNlZCBleGlzdHMgb24gdGhlIGluc3RhbmNlLCB3aGlsZSBtYWludGFpbmluZyB0aGVcbiAgICAgIHNlbWFudGljIG9mIHNldHRpbmcgUmVxdWVzdC5ib2R5VXNlZCBpbiB0aGUgY29uc3RydWN0b3IgYmVmb3JlXG4gICAgICBfaW5pdEJvZHkgaXMgY2FsbGVkLlxuICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtYXNzaWduXG4gICAgdGhpcy5ib2R5VXNlZCA9IHRoaXMuYm9keVVzZWRcbiAgICB0aGlzLl9ib2R5SW5pdCA9IGJvZHlcbiAgICBpZiAoIWJvZHkpIHtcbiAgICAgIHRoaXMuX25vQm9keSA9IHRydWU7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9ICcnXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5ibG9iICYmIEJsb2IucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlCbG9iID0gYm9keVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5mb3JtRGF0YSAmJiBGb3JtRGF0YS5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgdGhpcy5fYm9keUZvcm1EYXRhID0gYm9keVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5zZWFyY2hQYXJhbXMgJiYgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkudG9TdHJpbmcoKVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlciAmJiBzdXBwb3J0LmJsb2IgJiYgaXNEYXRhVmlldyhib2R5KSkge1xuICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyID0gYnVmZmVyQ2xvbmUoYm9keS5idWZmZXIpXG4gICAgICAvLyBJRSAxMC0xMSBjYW4ndCBoYW5kbGUgYSBEYXRhVmlldyBib2R5LlxuICAgICAgdGhpcy5fYm9keUluaXQgPSBuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIgJiYgKEFycmF5QnVmZmVyLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpIHx8IGlzQXJyYXlCdWZmZXJWaWV3KGJvZHkpKSkge1xuICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyID0gYnVmZmVyQ2xvbmUoYm9keSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5ID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGJvZHkpXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSkge1xuICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAndGV4dC9wbGFpbjtjaGFyc2V0PVVURi04JylcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUJsb2IgJiYgdGhpcy5fYm9keUJsb2IudHlwZSkge1xuICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCB0aGlzLl9ib2R5QmxvYi50eXBlKVxuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LnNlYXJjaFBhcmFtcyAmJiBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04JylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc3VwcG9ydC5ibG9iKSB7XG4gICAgdGhpcy5ibG9iID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcmVqZWN0ZWQgPSBjb25zdW1lZCh0aGlzKVxuICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgIHJldHVybiByZWplY3RlZFxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fYm9keUJsb2IpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QmxvYilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5Rm9ybURhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIGJsb2InKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keVRleHRdKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0aGlzLmFycmF5QnVmZmVyID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgdmFyIGlzQ29uc3VtZWQgPSBjb25zdW1lZCh0aGlzKVxuICAgICAgaWYgKGlzQ29uc3VtZWQpIHtcbiAgICAgICAgcmV0dXJuIGlzQ29uc3VtZWRcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnVmZmVyLnNsaWNlKFxuICAgICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ5dGVPZmZzZXQsXG4gICAgICAgICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnl0ZU9mZnNldCArIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcilcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYmxvYikge1xuICAgICAgcmV0dXJuIHRoaXMuYmxvYigpLnRoZW4ocmVhZEJsb2JBc0FycmF5QnVmZmVyKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIGFzIEFycmF5QnVmZmVyJylcbiAgICB9XG4gIH1cblxuICB0aGlzLnRleHQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVqZWN0ZWQgPSBjb25zdW1lZCh0aGlzKVxuICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHJlamVjdGVkXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2JvZHlCbG9iKSB7XG4gICAgICByZXR1cm4gcmVhZEJsb2JBc1RleHQodGhpcy5fYm9keUJsb2IpXG4gICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVhZEFycmF5QnVmZmVyQXNUZXh0KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikpXG4gICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5Rm9ybURhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyB0ZXh0JylcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5VGV4dClcbiAgICB9XG4gIH1cblxuICBpZiAoc3VwcG9ydC5mb3JtRGF0YSkge1xuICAgIHRoaXMuZm9ybURhdGEgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKGRlY29kZSlcbiAgICB9XG4gIH1cblxuICB0aGlzLmpzb24gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSFRUUCBtZXRob2RzIHdob3NlIGNhcGl0YWxpemF0aW9uIHNob3VsZCBiZSBub3JtYWxpemVkXG52YXIgbWV0aG9kcyA9IFsnQ09OTkVDVCcsICdERUxFVEUnLCAnR0VUJywgJ0hFQUQnLCAnT1BUSU9OUycsICdQQVRDSCcsICdQT1NUJywgJ1BVVCcsICdUUkFDRSddXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZChtZXRob2QpIHtcbiAgdmFyIHVwY2FzZWQgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICByZXR1cm4gbWV0aG9kcy5pbmRleE9mKHVwY2FzZWQpID4gLTEgPyB1cGNhc2VkIDogbWV0aG9kXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXF1ZXN0KGlucHV0LCBvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZXF1ZXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BsZWFzZSB1c2UgdGhlIFwibmV3XCIgb3BlcmF0b3IsIHRoaXMgRE9NIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uJylcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIHZhciBib2R5ID0gb3B0aW9ucy5ib2R5XG5cbiAgaWYgKGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgIGlmIChpbnB1dC5ib2R5VXNlZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJylcbiAgICB9XG4gICAgdGhpcy51cmwgPSBpbnB1dC51cmxcbiAgICB0aGlzLmNyZWRlbnRpYWxzID0gaW5wdXQuY3JlZGVudGlhbHNcbiAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5wdXQuaGVhZGVycylcbiAgICB9XG4gICAgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2RcbiAgICB0aGlzLm1vZGUgPSBpbnB1dC5tb2RlXG4gICAgdGhpcy5zaWduYWwgPSBpbnB1dC5zaWduYWxcbiAgICBpZiAoIWJvZHkgJiYgaW5wdXQuX2JvZHlJbml0ICE9IG51bGwpIHtcbiAgICAgIGJvZHkgPSBpbnB1dC5fYm9keUluaXRcbiAgICAgIGlucHV0LmJvZHlVc2VkID0gdHJ1ZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLnVybCA9IFN0cmluZyhpbnB1dClcbiAgfVxuXG4gIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzIHx8IHRoaXMuY3JlZGVudGlhbHMgfHwgJ3NhbWUtb3JpZ2luJ1xuICBpZiAob3B0aW9ucy5oZWFkZXJzIHx8ICF0aGlzLmhlYWRlcnMpIHtcbiAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpXG4gIH1cbiAgdGhpcy5tZXRob2QgPSBub3JtYWxpemVNZXRob2Qob3B0aW9ucy5tZXRob2QgfHwgdGhpcy5tZXRob2QgfHwgJ0dFVCcpXG4gIHRoaXMubW9kZSA9IG9wdGlvbnMubW9kZSB8fCB0aGlzLm1vZGUgfHwgbnVsbFxuICB0aGlzLnNpZ25hbCA9IG9wdGlvbnMuc2lnbmFsIHx8IHRoaXMuc2lnbmFsIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCdBYm9ydENvbnRyb2xsZXInIGluIGcpIHtcbiAgICAgIHZhciBjdHJsID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgcmV0dXJuIGN0cmwuc2lnbmFsO1xuICAgIH1cbiAgfSgpKTtcbiAgdGhpcy5yZWZlcnJlciA9IG51bGxcblxuICBpZiAoKHRoaXMubWV0aG9kID09PSAnR0VUJyB8fCB0aGlzLm1ldGhvZCA9PT0gJ0hFQUQnKSAmJiBib2R5KSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9keSBub3QgYWxsb3dlZCBmb3IgR0VUIG9yIEhFQUQgcmVxdWVzdHMnKVxuICB9XG4gIHRoaXMuX2luaXRCb2R5KGJvZHkpXG5cbiAgaWYgKHRoaXMubWV0aG9kID09PSAnR0VUJyB8fCB0aGlzLm1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgaWYgKG9wdGlvbnMuY2FjaGUgPT09ICduby1zdG9yZScgfHwgb3B0aW9ucy5jYWNoZSA9PT0gJ25vLWNhY2hlJykge1xuICAgICAgLy8gU2VhcmNoIGZvciBhICdfJyBwYXJhbWV0ZXIgaW4gdGhlIHF1ZXJ5IHN0cmluZ1xuICAgICAgdmFyIHJlUGFyYW1TZWFyY2ggPSAvKFs/Jl0pXz1bXiZdKi9cbiAgICAgIGlmIChyZVBhcmFtU2VhcmNoLnRlc3QodGhpcy51cmwpKSB7XG4gICAgICAgIC8vIElmIGl0IGFscmVhZHkgZXhpc3RzIHRoZW4gc2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBjdXJyZW50IHRpbWVcbiAgICAgICAgdGhpcy51cmwgPSB0aGlzLnVybC5yZXBsYWNlKHJlUGFyYW1TZWFyY2gsICckMV89JyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT3RoZXJ3aXNlIGFkZCBhIG5ldyAnXycgcGFyYW1ldGVyIHRvIHRoZSBlbmQgd2l0aCB0aGUgY3VycmVudCB0aW1lXG4gICAgICAgIHZhciByZVF1ZXJ5U3RyaW5nID0gL1xcPy9cbiAgICAgICAgdGhpcy51cmwgKz0gKHJlUXVlcnlTdHJpbmcudGVzdCh0aGlzLnVybCkgPyAnJicgOiAnPycpICsgJ189JyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblJlcXVlc3QucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUmVxdWVzdCh0aGlzLCB7Ym9keTogdGhpcy5fYm9keUluaXR9KVxufVxuXG5mdW5jdGlvbiBkZWNvZGUoYm9keSkge1xuICB2YXIgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXG4gIGJvZHlcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KCcmJylcbiAgICAuZm9yRWFjaChmdW5jdGlvbihieXRlcykge1xuICAgICAgaWYgKGJ5dGVzKSB7XG4gICAgICAgIHZhciBzcGxpdCA9IGJ5dGVzLnNwbGl0KCc9JylcbiAgICAgICAgdmFyIG5hbWUgPSBzcGxpdC5zaGlmdCgpLnJlcGxhY2UoL1xcKy9nLCAnICcpXG4gICAgICAgIHZhciB2YWx1ZSA9IHNwbGl0LmpvaW4oJz0nKS5yZXBsYWNlKC9cXCsvZywgJyAnKVxuICAgICAgICBmb3JtLmFwcGVuZChkZWNvZGVVUklDb21wb25lbnQobmFtZSksIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpXG4gICAgICB9XG4gICAgfSlcbiAgcmV0dXJuIGZvcm1cbn1cblxuZnVuY3Rpb24gcGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpIHtcbiAgdmFyIGhlYWRlcnMgPSBuZXcgSGVhZGVycygpXG4gIC8vIFJlcGxhY2UgaW5zdGFuY2VzIG9mIFxcclxcbiBhbmQgXFxuIGZvbGxvd2VkIGJ5IGF0IGxlYXN0IG9uZSBzcGFjZSBvciBob3Jpem9udGFsIHRhYiB3aXRoIGEgc3BhY2VcbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjJcbiAgdmFyIHByZVByb2Nlc3NlZEhlYWRlcnMgPSByYXdIZWFkZXJzLnJlcGxhY2UoL1xccj9cXG5bXFx0IF0rL2csICcgJylcbiAgLy8gQXZvaWRpbmcgc3BsaXQgdmlhIHJlZ2V4IHRvIHdvcmsgYXJvdW5kIGEgY29tbW9uIElFMTEgYnVnIHdpdGggdGhlIGNvcmUtanMgMy42LjAgcmVnZXggcG9seWZpbGxcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dpdGh1Yi9mZXRjaC9pc3N1ZXMvNzQ4XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy83NTFcbiAgcHJlUHJvY2Vzc2VkSGVhZGVyc1xuICAgIC5zcGxpdCgnXFxyJylcbiAgICAubWFwKGZ1bmN0aW9uKGhlYWRlcikge1xuICAgICAgcmV0dXJuIGhlYWRlci5pbmRleE9mKCdcXG4nKSA9PT0gMCA/IGhlYWRlci5zdWJzdHIoMSwgaGVhZGVyLmxlbmd0aCkgOiBoZWFkZXJcbiAgICB9KVxuICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgIHZhciBwYXJ0cyA9IGxpbmUuc3BsaXQoJzonKVxuICAgICAgdmFyIGtleSA9IHBhcnRzLnNoaWZ0KCkudHJpbSgpXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHBhcnRzLmpvaW4oJzonKS50cmltKClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBoZWFkZXJzLmFwcGVuZChrZXksIHZhbHVlKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybignUmVzcG9uc2UgJyArIGVycm9yLm1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICByZXR1cm4gaGVhZGVyc1xufVxuXG5Cb2R5LmNhbGwoUmVxdWVzdC5wcm90b3R5cGUpXG5cbmV4cG9ydCBmdW5jdGlvbiBSZXNwb25zZShib2R5SW5pdCwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVzcG9uc2UpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGxlYXNlIHVzZSB0aGUgXCJuZXdcIiBvcGVyYXRvciwgdGhpcyBET00gb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi4nKVxuICB9XG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fVxuICB9XG5cbiAgdGhpcy50eXBlID0gJ2RlZmF1bHQnXG4gIHRoaXMuc3RhdHVzID0gb3B0aW9ucy5zdGF0dXMgPT09IHVuZGVmaW5lZCA/IDIwMCA6IG9wdGlvbnMuc3RhdHVzXG4gIGlmICh0aGlzLnN0YXR1cyA8IDIwMCB8fCB0aGlzLnN0YXR1cyA+IDU5OSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRmFpbGVkIHRvIGNvbnN0cnVjdCAnUmVzcG9uc2UnOiBUaGUgc3RhdHVzIHByb3ZpZGVkICgwKSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMjAwLCA1OTldLlwiKVxuICB9XG4gIHRoaXMub2sgPSB0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCAzMDBcbiAgdGhpcy5zdGF0dXNUZXh0ID0gb3B0aW9ucy5zdGF0dXNUZXh0ID09PSB1bmRlZmluZWQgPyAnJyA6ICcnICsgb3B0aW9ucy5zdGF0dXNUZXh0XG4gIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycylcbiAgdGhpcy51cmwgPSBvcHRpb25zLnVybCB8fCAnJ1xuICB0aGlzLl9pbml0Qm9keShib2R5SW5pdClcbn1cblxuQm9keS5jYWxsKFJlc3BvbnNlLnByb3RvdHlwZSlcblxuUmVzcG9uc2UucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5fYm9keUluaXQsIHtcbiAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgIHN0YXR1c1RleHQ6IHRoaXMuc3RhdHVzVGV4dCxcbiAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh0aGlzLmhlYWRlcnMpLFxuICAgIHVybDogdGhpcy51cmxcbiAgfSlcbn1cblxuUmVzcG9uc2UuZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKG51bGwsIHtzdGF0dXM6IDIwMCwgc3RhdHVzVGV4dDogJyd9KVxuICByZXNwb25zZS5vayA9IGZhbHNlXG4gIHJlc3BvbnNlLnN0YXR1cyA9IDBcbiAgcmVzcG9uc2UudHlwZSA9ICdlcnJvcidcbiAgcmV0dXJuIHJlc3BvbnNlXG59XG5cbnZhciByZWRpcmVjdFN0YXR1c2VzID0gWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XVxuXG5SZXNwb25zZS5yZWRpcmVjdCA9IGZ1bmN0aW9uKHVybCwgc3RhdHVzKSB7XG4gIGlmIChyZWRpcmVjdFN0YXR1c2VzLmluZGV4T2Yoc3RhdHVzKSA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCBzdGF0dXMgY29kZScpXG4gIH1cblxuICByZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHtzdGF0dXM6IHN0YXR1cywgaGVhZGVyczoge2xvY2F0aW9uOiB1cmx9fSlcbn1cblxuZXhwb3J0IHZhciBET01FeGNlcHRpb24gPSBnLkRPTUV4Y2VwdGlvblxudHJ5IHtcbiAgbmV3IERPTUV4Y2VwdGlvbigpXG59IGNhdGNoIChlcnIpIHtcbiAgRE9NRXhjZXB0aW9uID0gZnVuY3Rpb24obWVzc2FnZSwgbmFtZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2VcbiAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgdmFyIGVycm9yID0gRXJyb3IobWVzc2FnZSlcbiAgICB0aGlzLnN0YWNrID0gZXJyb3Iuc3RhY2tcbiAgfVxuICBET01FeGNlcHRpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpXG4gIERPTUV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBET01FeGNlcHRpb25cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZldGNoKGlucHV0LCBpbml0KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGlucHV0LCBpbml0KVxuXG4gICAgaWYgKHJlcXVlc3Quc2lnbmFsICYmIHJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIHJldHVybiByZWplY3QobmV3IERPTUV4Y2VwdGlvbignQWJvcnRlZCcsICdBYm9ydEVycm9yJykpXG4gICAgfVxuXG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG5cbiAgICBmdW5jdGlvbiBhYm9ydFhocigpIHtcbiAgICAgIHhoci5hYm9ydCgpXG4gICAgfVxuXG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIHN0YXR1c1RleHQ6IHhoci5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiBwYXJzZUhlYWRlcnMoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpIHx8ICcnKVxuICAgICAgfVxuICAgICAgLy8gVGhpcyBjaGVjayBpZiBzcGVjaWZpY2FsbHkgZm9yIHdoZW4gYSB1c2VyIGZldGNoZXMgYSBmaWxlIGxvY2FsbHkgZnJvbSB0aGUgZmlsZSBzeXN0ZW1cbiAgICAgIC8vIE9ubHkgaWYgdGhlIHN0YXR1cyBpcyBvdXQgb2YgYSBub3JtYWwgcmFuZ2VcbiAgICAgIGlmIChyZXF1ZXN0LnVybC5pbmRleE9mKCdmaWxlOi8vJykgPT09IDAgJiYgKHhoci5zdGF0dXMgPCAyMDAgfHwgeGhyLnN0YXR1cyA+IDU5OSkpIHtcbiAgICAgICAgb3B0aW9ucy5zdGF0dXMgPSAyMDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zLnN0YXR1cyA9IHhoci5zdGF0dXM7XG4gICAgICB9XG4gICAgICBvcHRpb25zLnVybCA9ICdyZXNwb25zZVVSTCcgaW4geGhyID8geGhyLnJlc3BvbnNlVVJMIDogb3B0aW9ucy5oZWFkZXJzLmdldCgnWC1SZXF1ZXN0LVVSTCcpXG4gICAgICB2YXIgYm9keSA9ICdyZXNwb25zZScgaW4geGhyID8geGhyLnJlc3BvbnNlIDogeGhyLnJlc3BvbnNlVGV4dFxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoYm9keSwgb3B0aW9ucykpXG4gICAgICB9LCAwKVxuICAgIH1cblxuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcignTmV0d29yayByZXF1ZXN0IGZhaWxlZCcpKVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcignTmV0d29yayByZXF1ZXN0IHRpbWVkIG91dCcpKVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBET01FeGNlcHRpb24oJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmaXhVcmwodXJsKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXJsID09PSAnJyAmJiBnLmxvY2F0aW9uLmhyZWYgPyBnLmxvY2F0aW9uLmhyZWYgOiB1cmxcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHVybFxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vcGVuKHJlcXVlc3QubWV0aG9kLCBmaXhVcmwocmVxdWVzdC51cmwpLCB0cnVlKVxuXG4gICAgaWYgKHJlcXVlc3QuY3JlZGVudGlhbHMgPT09ICdpbmNsdWRlJykge1xuICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWVcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3QuY3JlZGVudGlhbHMgPT09ICdvbWl0Jykge1xuICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKCdyZXNwb25zZVR5cGUnIGluIHhocikge1xuICAgICAgaWYgKHN1cHBvcnQuYmxvYikge1xuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2Jsb2InXG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBzdXBwb3J0LmFycmF5QnVmZmVyXG4gICAgICApIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcidcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5pdCAmJiB0eXBlb2YgaW5pdC5oZWFkZXJzID09PSAnb2JqZWN0JyAmJiAhKGluaXQuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMgfHwgKGcuSGVhZGVycyAmJiBpbml0LmhlYWRlcnMgaW5zdGFuY2VvZiBnLkhlYWRlcnMpKSkge1xuICAgICAgdmFyIG5hbWVzID0gW107XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbml0LmhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgICBuYW1lcy5wdXNoKG5vcm1hbGl6ZU5hbWUobmFtZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIG5vcm1hbGl6ZVZhbHVlKGluaXQuaGVhZGVyc1tuYW1lXSkpXG4gICAgICB9KVxuICAgICAgcmVxdWVzdC5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgaWYgKG5hbWVzLmluZGV4T2YobmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5zaWduYWwpIHtcbiAgICAgIHJlcXVlc3Quc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRYaHIpXG5cbiAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gRE9ORSAoc3VjY2VzcyBvciBmYWlsdXJlKVxuICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICByZXF1ZXN0LnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0WGhyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgeGhyLnNlbmQodHlwZW9mIHJlcXVlc3QuX2JvZHlJbml0ID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiByZXF1ZXN0Ll9ib2R5SW5pdClcbiAgfSlcbn1cblxuZmV0Y2gucG9seWZpbGwgPSB0cnVlXG5cbmlmICghZy5mZXRjaCkge1xuICBnLmZldGNoID0gZmV0Y2hcbiAgZy5IZWFkZXJzID0gSGVhZGVyc1xuICBnLlJlcXVlc3QgPSBSZXF1ZXN0XG4gIGcuUmVzcG9uc2UgPSBSZXNwb25zZVxufVxuIiwiaW1wb3J0IHtEYXNoUmVuZGVyZXJ9IGZyb20gJy4vRGFzaFJlbmRlcmVyJztcbmltcG9ydCAnLi91dGlscy9jbGllbnRzaWRlRnVuY3Rpb25zJztcblxuLy8gbWFrZSBEYXNoUmVuZGVyZXIgZ2xvYmFsbHkgYXZhaWxhYmxlXG53aW5kb3cuRGFzaFJlbmRlcmVyID0gRGFzaFJlbmRlcmVyO1xuIl0sIm5hbWVzIjpbIlByb3BUeXBlcyIsIlJlYWN0IiwidXNlU3RhdGUiLCJ1c2VFZmZlY3QiLCJQcm92aWRlciIsIlN0b3JlIiwiQXBwQ29udGFpbmVyIiwiZ2V0Q29uZmlnRnJvbURPTSIsImluaXRpYWxpemVXZWJTb2NrZXQiLCJkaXNjb25uZWN0V2ViU29ja2V0IiwiQXBwUHJvdmlkZXIiLCJfcmVmIiwiX3JlZiRob29rcyIsImhvb2tzIiwibGF5b3V0X3ByZSIsImxheW91dF9wb3N0IiwicmVxdWVzdF9wcmUiLCJyZXF1ZXN0X3Bvc3QiLCJjYWxsYmFja19yZXNvbHZlZCIsInJlcXVlc3RfcmVmcmVzaF9qd3QiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJzdG9yZSIsIl9jb25maWckd2Vic29ja2V0IiwiX2NvbmZpZyR3ZWJzb2NrZXQyIiwiX2NvbmZpZyR3ZWJzb2NrZXQzIiwiY29uZmlnIiwid2Vic29ja2V0IiwiZW5hYmxlZCIsInVybCIsIndvcmtlcl91cmwiLCJmdWxsQ29uZmlnIiwiX29iamVjdFNwcmVhZCIsImZldGNoIiwiY3JlZGVudGlhbHMiLCJoZWFkZXJzIiwiQWNjZXB0IiwiY3JlYXRlRWxlbWVudCIsInByb3BUeXBlcyIsInNoYXBlIiwiZnVuYyIsImFueSIsImZpbHRlciIsIm1hcCIsInBhdGgiLCJTdG9yZU9ic2VydmVyIiwiY29uc3RydWN0b3IiLCJfZGVmaW5lUHJvcGVydHkiLCJvYnNlcnZlciIsImlucHV0cyIsIkFycmF5IiwiaXNBcnJheSIsIkVycm9yIiwiYWRkIiwicmVtb3ZlIiwiX19maW5hbGl6ZV9fIiwiX19pbml0X18iLCJfdGhpcyRfdW5zdWJzY3JpYmUiLCJfdW5zdWJzY3JpYmUiLCJjYWxsIiwiX3N0b3JlIiwic3Vic2NyaWJlIiwibm90aWZ5IiwiX29ic2VydmVycyIsImZvckVhY2giLCJvIiwibGFzdFN0YXRlIiwicHVzaCIsImlucHV0UGF0aHMiLCJwIiwic3BsaXQiLCJ0cmlnZ2VyZWQiLCJzdGF0ZSIsImdldFN0YXRlIiwiaSIsInNwbGljZSIsImZpbmRJbmRleCIsImUiLCJ0IiwiciIsIlN5bWJvbCIsIm4iLCJpdGVyYXRvciIsInRvU3RyaW5nVGFnIiwiYyIsInByb3RvdHlwZSIsIkdlbmVyYXRvciIsInUiLCJPYmplY3QiLCJjcmVhdGUiLCJfcmVnZW5lcmF0b3JEZWZpbmUyIiwiZiIsInkiLCJHIiwidiIsImEiLCJkIiwiYmluZCIsImxlbmd0aCIsImwiLCJUeXBlRXJyb3IiLCJkb25lIiwidmFsdWUiLCJyZXR1cm4iLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImRpc3BsYXlOYW1lIiwiX3JlZ2VuZXJhdG9yIiwidyIsIm0iLCJkZWZpbmVQcm9wZXJ0eSIsIl9yZWdlbmVyYXRvckRlZmluZSIsIl9pbnZva2UiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3VtZW50cyIsImFwcGx5IiwiX25leHQiLCJfdGhyb3ciLCJfYXJyYXlXaXRoSG9sZXMiLCJfaXRlcmFibGVUb0FycmF5TGltaXQiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVSZXN0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwibmFtZSIsImZyb20iLCJ0ZXN0IiwibmV4dCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfdG9Qcm9wZXJ0eUtleSIsIl90b1ByaW1pdGl2ZSIsInRvUHJpbWl0aXZlIiwiU3RyaW5nIiwiTnVtYmVyIiwiY29uY2F0IiwiZmxhdHRlbiIsImludGVyc2VjdGlvbiIsIm1lcmdlRGVlcFJpZ2h0IiwicGljayIsInBsdWNrIiwidmFsdWVzIiwidG9QYWlycyIsInppcCIsImFzc29jUGF0aCIsIlNUQVRVUyIsIkpXVF9FWFBJUkVEX01FU1NBR0UiLCJNQVhfQVVUSF9SRVRSSUVTIiwiQ2FsbGJhY2tBY3Rpb25UeXBlIiwiQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlIiwiaXNNdWx0aVZhbHVlZCIsInN0cmluZ2lmeUlkIiwiaXNNdWx0aU91dHB1dFByb3AiLCJ1cmxCYXNlIiwiZ2V0Q1NSRkhlYWRlciIsImRpc3BhdGNoRXJyb3IiLCJzZXRQYXRocyIsImNyZWF0ZUFjdGlvbiIsImFkZEh0dHBIZWFkZXJzIiwibm90aWZ5T2JzZXJ2ZXJzIiwidXBkYXRlUHJvcHMiLCJwYXJzZVBhdGNoUHJvcHMiLCJjb21wdXRlUGF0aHMiLCJnZXRQYXRoIiwicmVxdWVzdERlcGVuZGVuY2llcyIsImxvYWRMaWJyYXJ5IiwicGFyc2VQTUNJZCIsInJlcGxhY2VQTUMiLCJsb2FkZWQiLCJsb2FkaW5nIiwiZ2V0Q29tcG9uZW50TGF5b3V0IiwiZ2V0V29ya2VyQ2xpZW50IiwiaXNXZWJTb2NrZXRFbmFibGVkIiwiaXNXZWJTb2NrZXRBdmFpbGFibGUiLCJhZGRCbG9ja2VkQ2FsbGJhY2tzIiwiQWRkQmxvY2tlZCIsImFkZENvbXBsZXRlZENhbGxiYWNrcyIsIkFkZENvbXBsZXRlZCIsImFkZEV4ZWN1dGVkQ2FsbGJhY2tzIiwiQWRkRXhlY3V0ZWQiLCJhZGRFeGVjdXRpbmdDYWxsYmFja3MiLCJBZGRFeGVjdXRpbmciLCJhZGRQcmlvcml0aXplZENhbGxiYWNrcyIsIkFkZFByaW9yaXRpemVkIiwiYWRkUmVxdWVzdGVkQ2FsbGJhY2tzIiwiQWRkUmVxdWVzdGVkIiwiYWRkU3RvcmVkQ2FsbGJhY2tzIiwiQWRkU3RvcmVkIiwiYWRkV2F0Y2hlZENhbGxiYWNrcyIsIkFkZFdhdGNoZWQiLCJyZW1vdmVFeGVjdXRlZENhbGxiYWNrcyIsIlJlbW92ZUV4ZWN1dGVkIiwicmVtb3ZlQmxvY2tlZENhbGxiYWNrcyIsIlJlbW92ZUJsb2NrZWQiLCJyZW1vdmVFeGVjdXRpbmdDYWxsYmFja3MiLCJSZW1vdmVFeGVjdXRpbmciLCJyZW1vdmVQcmlvcml0aXplZENhbGxiYWNrcyIsIlJlbW92ZVByaW9yaXRpemVkIiwicmVtb3ZlUmVxdWVzdGVkQ2FsbGJhY2tzIiwiUmVtb3ZlUmVxdWVzdGVkIiwicmVtb3ZlU3RvcmVkQ2FsbGJhY2tzIiwiUmVtb3ZlU3RvcmVkIiwicmVtb3ZlV2F0Y2hlZENhbGxiYWNrcyIsIlJlbW92ZVdhdGNoZWQiLCJhZ2dyZWdhdGVDYWxsYmFja3MiLCJBZ2dyZWdhdGUiLCJ1cGRhdGVSZXNvdXJjZVVzYWdlIiwiYWRkQ2FsbGJhY2tKb2IiLCJyZW1vdmVDYWxsYmFja0pvYiIsInNldENhbGxiYWNrSm9iT3V0ZGF0ZWQiLCJ1bndyYXBJZk5vdE11bHRpIiwicGF0aHMiLCJpZFByb3BzIiwic3BlYyIsImFueVZhbHMiLCJkZXBUeXBlIiwibXNnIiwiYWxsb3dfb3B0aW9uYWwiLCJpc1N0ciIsImlkIiwiSlNPTiIsInN0cmluZ2lmeSIsInByb3BlcnR5Iiwic3RycyIsImpvaW4iLCJmaWxsVmFscyIsImxheW91dCIsImNiIiwic3BlY3MiLCJhbGxvd0FsbE1pc3NpbmciLCJ1bmRlZmluZWQiLCJnZXR0ZXIiLCJnZXRJbnB1dHMiLCJlcnJvcnMiLCJlbXB0eU11bHRpVmFsdWVzIiwiaW5wdXRWYWxzIiwiaW5wdXRMaXN0IiwiX3Vud3JhcElmTm90TXVsdGkiLCJwYXRoXyIsIl91bndyYXBJZk5vdE11bHRpMiIsImlucHV0RXJyb3IiLCJyZWZFcnIiLCJlcnIiLCJpbmRleE9mIiwiY29uc29sZSIsImVycm9yIiwib2JqcyIsIlJlZmVyZW5jZUVycm9yIiwiZ2V0VmFscyIsImlucHV0IiwiemlwSWZBcnJheSIsImIiLCJ3aW5kb3ciLCJkYXNoX2NsaWVudHNpZGUiLCJub191cGRhdGUiLCJjbGVhbk91dHB1dFByb3AiLCJoYW5kbGVDbGllbnRzaWRlIiwiX3giLCJfeDIiLCJfeDMiLCJfeDQiLCJfaGFuZGxlQ2xpZW50c2lkZSIsIl9jYWxsZWUyIiwiZGlzcGF0Y2giLCJjbGllbnRzaWRlX2Z1bmN0aW9uIiwicGF5bG9hZCIsImRjIiwib3V0cHV0cyIsInJlcXVlc3RUaW1lIiwiaW5wdXREaWN0Iiwic3RhdGVEaWN0IiwicmVzdWx0Iiwic3RhdHVzIiwiX3JldHVyblZhbHVlIiwibmFtZXNwYWNlIiwiZnVuY3Rpb25fbmFtZSIsImFyZ3MiLCJyZXR1cm5WYWx1ZSIsInRvdGFsVGltZSIsInJlc291cmNlcyIsIl90NCIsIl9jb250ZXh0MyIsImRlc2NyaXB0aW9uIiwiRGF0ZSIsIm5vdyIsImlucHV0c1RvRGljdCIsIk9LIiwiY2FsbGJhY2tfY29udGV4dCIsImNoYW5nZWRQcm9wSWRzIiwicHJvcF9pZCIsInRyaWdnZXJlZF9pZCIsImdldFRyaWdnZXJlZElkIiwiaW5wdXRzX2xpc3QiLCJzdGF0ZXNfbGlzdCIsInN0YXRlcyIsIm91dHB1dHNfbGlzdCIsIl9yZWYxMCIsIl9yZWYxMSIsIm91dGkiLCJyZXRpIiwiX3JlZjEyIiwiX3JlZjEzIiwib3V0aWoiLCJyZXRpaiIsImlkU3RyIiwiZGF0YUZvcklkIiwiUHJldmVudFVwZGF0ZSIsIlBSRVZFTlRfVVBEQVRFIiwiQ0xJRU5UU0lERV9FUlJPUiIsIl9fZGFzaF9zZXJ2ZXIiLCJfX2Rhc2hfY2xpZW50IiwiX19kYXNoX3VwbG9hZCIsIl9fZGFzaF9kb3dubG9hZCIsInVpIiwib3V0cHV0IiwidXNhZ2UiLCJ1cGRhdGVDb21wb25lbnQiLCJjb21wb25lbnRfaWQiLCJwcm9wcyIsIl9nZXRTdGF0ZSIsImNvbXBvbmVudFBhdGgiLCJzdXBwcmVzc19jYWxsYmFja19leGNlcHRpb25zIiwiaXRlbXBhdGgiLCJyZW5kZXJUeXBlIiwic2lkZVVwZGF0ZSIsInJlZHVjZSIsImFjYyIsIl9yZWYyIiwiX3JlZjMiLCJjb21wb25lbnRJZCIsInByb3BOYW1lIiwicmVwbGFjZWRJZHMiLCJzdGFydHNXaXRoIiwiX3BhcnNlUE1DSWQiLCJfcGFyc2VQTUNJZDIiLCJpbmNsdWRlcyIsIl9pZCRzcGxpdCIsIl9pZCRzcGxpdDIiLCJyZXAiLCJfcmVmNCIsIl9vbGRDb21wb25lbnQiLCJfcmVmNSIsIm9sZENvbXBvbmVudCIsIm9sZFByb3BzIiwicGF0Y2hlZFByb3BzIiwiZXZlbnRzIiwiaGFuZGxlU2VydmVyc2lkZSIsImJhY2tncm91bmQiLCJhZGRpdGlvbmFsQXJncyIsInJ1bm5pbmciLCJib2R5IiwiY2FjaGVLZXkiLCJqb2IiLCJydW5uaW5nT2ZmIiwicHJvZ3Jlc3NEZWZhdWx0IiwibW9yZUFyZ3MiLCJmZXRjaENhbGxiYWNrIiwibmV3Qm9keSIsImFkZEFyZyIsImRlbGltIiwidG1wQm9keSIsInBhcnNlIiwiX3JlZjYiLCJfcmVmNyIsImtleSIsIl9yZWY4IiwiX3JlZjkiLCJfIiwiX18iLCJzaW5nbGUiLCJtZXRob2QiLCJyZWplY3QiLCJoYW5kbGVPdXRwdXQiLCJyZXMiLCJjYWxsYmFja0pvYiIsImNhbGxiYWNrSm9icyIsIm91dGRhdGVkIiwiam9iSWQiLCJyZWNvcmRQcm9maWxlIiwiZ2V0IiwidGltaW5nSGVhZGVycyIsImhlYWRlciIsImR1ciIsIm1hdGNoIiwiZmluaXNoTGluZSIsImRhdGEiLCJtdWx0aSIsInJlc3BvbnNlIiwic3Vic3RyIiwibGFzdEluZGV4T2YiLCJjb21wbGV0ZUpvYiIsImpzb24iLCJqb2JJbmZvIiwiY2FuY2VsSW5wdXRzIiwiY2FuY2VsIiwicHJvZ3Jlc3MiLCJkaXN0IiwiYWxsIiwic2V0VGltZW91dCIsImhhbmRsZSIsImludGVydmFsIiwiaGFuZGxlRXJyb3IiLCJOT19SRVNQT05TRSIsImhhbmRsZVdlYnNvY2tldENhbGxiYWNrIiwiX3g1IiwiX3g2IiwiX3g3IiwiX3g4IiwiX3g5IiwiX2hhbmRsZVdlYnNvY2tldENhbGxiYWNrIiwiX2NhbGxlZTMiLCJ3b3JrZXJDbGllbnQiLCJjYWxsYmFja0RhdGEiLCJfcmVmMTQiLCJjYWxsYmFja1Jlc3BvbnNlIiwiX3RvdGFsVGltZSIsIl90NSIsIl9jb250ZXh0NCIsImVuc3VyZUNvbm5lY3RlZCIsInNlbmRDYWxsYmFjayIsIm1lc3NhZ2UiLCJpbnB1dHNpIiwiaWkiLCJfaW5wdXRzaSRpaSR2YWx1ZSIsImlkX3N0ciIsIl9pbnB1dHNfbGlzdCRpJHZhbHVlIiwidHJpZyIsInN1YnN0cmluZyIsImV4ZWN1dGVDYWxsYmFjayIsIl9yZWYwIiwiYWxsT3V0cHV0cyIsIl9jYiRjYWxsYmFjayIsImNhbGxiYWNrIiwiZHluYW1pY19jcmVhdG9yIiwiaW5WYWxzIiwiZXhlY3V0aW9uUHJvbWlzZSIsIm91dHB1dEVycm9ycyIsIm91dCIsIl91bndyYXBJZk5vdE11bHRpMyIsIl91bndyYXBJZk5vdE11bHRpNCIsImVycmkiLCJfX2V4ZWN1dGUiLCJfcmVmMSIsIl9jYWxsZWUiLCJsb2FkaW5nT3V0cHV0cyIsInBhcnNlZENoYW5nZWRQcm9wc0lkcyIsImN1cnJlbnRMYXlvdXQiLCJuZXdDb25maWciLCJuZXdIZWFkZXJzIiwibGFzdEVycm9yIiwianNvbk91dHB1dCIsInVzZVdlYlNvY2tldCIsIl9sb29wIiwiX3JldCIsInJldHJ5IiwiX3QyIiwiX3QzIiwiX2NvbnRleHQyIiwiX291dCRwcm9wZXJ0eSIsInByb3BJZCIsIm91dHB1dFBhdGgiLCJkYXRhUGF0aCIsIm91dHB1dFZhbHVlIiwibmV3UHJvcHMiLCJpbnRlciIsIl9kYXRhIiwiX2N1cnJlbnRMYXlvdXQiLCJvbGRKd3QiLCJuZXdKd3QiLCJfdCIsIl9jb250ZXh0IiwiVU5BVVRIT1JJWkVEIiwiQkFEX1JFUVVFU1QiLCJ0ZXh0IiwiQXV0aG9yaXphdGlvbiIsIl9yZWdlbmVyYXRvclZhbHVlcyIsIm5ld0NiIiwiYXNzb2MiLCJkaWZmZXJlbmNlIiwiaXNFbXB0eSIsIm1lcmdlV2l0aCIsInBhcnRpdGlvbiIsInBpY2tCeSIsInppcE9iaiIsImFkZEFsbFJlc29sdmVkRnJvbU91dHB1dHMiLCJnZXRBbnlWYWxzIiwiZ2V0VW5maWx0ZXJlZExheW91dENhbGxiYWNrcyIsImlkTWF0Y2giLCJzcGxpdElkQW5kUHJvcCIsIkRJUkVDVCIsIklORElSRUNUIiwibWVyZ2VNYXgiLCJNYXRoIiwibWF4IiwiY29tYmluZUlkQW5kUHJvcCIsImdldENhbGxiYWNrc0J5SW5wdXQiLCJncmFwaHMiLCJwcm9wIiwiY2hhbmdlVHlwZSIsIndpdGhQcmlvcml0eSIsIm1hdGNoZXMiLCJpZEFuZFByb3AiLCJjYWxsYmFja3MiLCJpbnB1dE1hcCIsInJlc29sdmVEZXBzIiwiX2tleXMiLCJzb3J0IiwidmFscyIsImtleVN0ciIsInBhdHRlcm5zIiwiaW5wdXRQYXR0ZXJucyIsInBhdHRlcm4iLCJ0cmlnZ2VyQW55VmFscyIsInByaW9yaXR5IiwiZ2V0UHJpb3JpdHkiLCJ0b3VjaGVkT3V0cHV0cyIsInRvdWNoZWRDYklkcyIsInRvdWNoZWQiLCJyZXNvbHZlZElkIiwiZ2V0T3V0cHV0cyIsInVuc2hpZnQiLCJtaW4iLCJnZXRBbGxTdWJzZXF1ZW50T3V0cHV0c0ZvckNhbGxiYWNrIiwiZ2V0UmVhZHlDYWxsYmFja3MiLCJjYW5kaWRhdGVzIiwib3V0cHV0c01hcCIsImFsbFRvdWNoZWRPdXRwdXRzIiwiYXNzaWduIiwiZGlmZmVyZW5jZUJhc2VkT25JZCIsInNvbWUiLCJjYnAiLCJnZXRMYXlvdXRDYWxsYmFja3MiLCJvcHRpb25zIiwiZXhjbHVzaW9ucyIsIl9wYXJ0aXRpb24iLCJfcGFydGl0aW9uMiIsImluY2x1ZGVkIiwiZXhjbHVkZWQiLCJmaWx0ZXJSb290Iiwicm9vdElkIiwicHJldmlvdXMiLCJleGVjdXRpb25Hcm91cCIsInJhbmRvbSIsImdldFVuaXF1ZUlkZW50aWZpZXIiLCJfcmVmNiRjYWxsYmFjayIsImlkUGFydHMiLCJpbmNsdWRlT2JzZXJ2ZXJzIiwicHJvcGVydGllcyIsIm1ha2VSZXNvbHZlZENhbGxiYWNrIiwiaW5pdGlhbENhbGwiLCJwcnVuZUNhbGxiYWNrcyIsIl9wYXJ0aXRpb24zIiwiX3BhcnRpdGlvbjQiLCJyZW1vdmVkIiwiX3BhcnRpdGlvbjUiLCJfcGFydGl0aW9uNiIsIm1vZGlmaWVkIiwiYWRkZWQiLCJyZWZLZXlzIiwicmVmVmFscyIsInJlZlBhdHRlcm5WYWxzIiwiaWRQYXR0ZXJuIiwicGF0dGVyblZhbHMiLCJrZXlQYXRocyIsIklzTG9hZGluZ0FjdGlvblR5cGUiLCJzZXRJc0xvYWRpbmciLCJTZXQiLCJhcHBlbmQiLCJkaXNzb2NQYXRoIiwiZW1wdHkiLCJlcXVhbHMiLCJoYXMiLCJpbnNlcnQiLCJpcyIsInByZXBlbmQiLCJyZXZlcnNlIiwiaXNQYXRjaCIsIm9iaiIsImdldExvY2F0aW9uSW5kZXgiLCJnZXRMb2NhdGlvblBhdGgiLCJsb2NhdGlvbiIsImN1cnJlbnQiLCJQYXRjaEJ1aWxkZXIiLCJvcGVyYXRpb25zIiwib3BlcmF0aW9uIiwicGFyYW1zIiwibWVyZ2UiLCJleHRlbmQiLCJkZWxldGUiLCJpbmRleCIsInN1YiIsIm11bCIsImRpdiIsImNsZWFyIiwiYnVpbGQiLCJfX2Rhc2hfcGF0Y2hfdXBkYXRlIiwicGF0Y2hIYW5kbGVycyIsIkFzc2lnbiIsInBhdGNoT3BlcmF0aW9uIiwiTWVyZ2UiLCJwcmV2IiwiRXh0ZW5kIiwiRGVsZXRlIiwiSW5zZXJ0IiwiQXBwZW5kIiwiUHJlcGVuZCIsIkFkZCIsIlN1YiIsIk11bCIsIkRpdiIsIkNsZWFyIiwiUmV2ZXJzZSIsIlJlbW92ZSIsIml0ZW0iLCJoYW5kbGVQYXRjaCIsInByZXZpb3VzVmFsdWUiLCJwYXRjaFZhbHVlIiwicmVkdWNlZFZhbHVlIiwicGF0Y2giLCJoYW5kbGVyIiwicHJldmlvdXNQcm9wcyIsIl9pIiwiX09iamVjdCRrZXlzIiwidmFsIiwiZGlzc29jIiwiZ2V0QWxsUE1DSWRzIiwidHJpZ2dlcktleSIsImtleXNPZklkcyIsImlkS2V5IiwiZXh0cmFzIiwicmVwbGFjZWQiLCJ0cmlnZ2VyVmFsdWUiLCJiYXRjaCIsInNldEdyYXBocyIsImFwaVRodW5rIiwicmVzZXQiLCJjb25maWdFbGVtZW50IiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsInRleHRDb250ZW50IiwiRGFzaENvbnRleHQiLCJ1c2VEYXNoQ29udGV4dCIsImdldFN0b3JlcyIsIkV4dGVybmFsV3JhcHBlciIsIkRldnRvb2xDb250ZXh0IiwidXNlRGV2dG9vbCIsInVzZURldnRvb2xNZW51QnV0dG9uQ2xhc3NOYW1lIiwiZ2V0TGF5b3V0IiwiY29tcG9uZW50UGF0aE9ySWQiLCJkcyIsIl9kcyR5JGdldFN0YXRlIiwiZGFzaF9jb21wb25lbnRfYXBpIiwiZGV2dG9vbCIsInVwZGF0ZVRpdGxlIiwiaXNMb2FkaW5nIiwidXBkYXRlX3RpdGxlIiwidGl0bGUiLCJtdXRhdGlvbk9ic2VydmVyIiwiX2dldFN0YXRlMiIsIl9vYnNlcnZlciRtdXRhdGlvbk9icyIsImRpc2Nvbm5lY3QiLCJNdXRhdGlvbk9ic2VydmVyIiwicXVlcnlTZWxlY3RvciIsIm9ic2VydmUiLCJzdWJ0cmVlIiwiY2hpbGRMaXN0IiwiYXR0cmlidXRlcyIsImNoYXJhY3RlckRhdGEiLCJpc05pbCIsInBhdGhPciIsInBhcnNlSWZXaWxkY2FyZCIsImhhbmRsZUFzeW5jRXJyb3IiLCJhcHBseVBlcnNpc3RlbmNlIiwicHJ1bmVQZXJzaXN0ZW5jZSIsImV4ZWN1dGVkIiwiYXBwbHlQcm9wcyIsInVwZGF0ZWRQcm9wcyIsIl9hcHBseVBlcnNpc3RlbmNlIiwic291cmNlIiwicmVxdWVzdGVkQ2FsbGJhY2tzIiwic3RvcmVkQ2FsbGJhY2tzIiwiX2NiJHByZWRlY2Vzc29ycyIsInByZWRlY2Vzc29ycyIsImV4ZWN1dGlvblJlc3VsdCIsImVudHJpZXMiLCJwYXJzZWRJZCIsIl9nZXRTdGF0ZTMiLCJvbGRMYXlvdXQiLCJvbGRQYXRocyIsImFwcGxpZWRQcm9wcyIsInJjYiIsImJhc2VQYXRoIiwib2xkT2JqIiwiY2hpbGRyZW5Qcm9wcyIsInR5cGUiLCJfX2Rhc2hwcml2YXRlX2NoaWxkcmVuUHJvcHMiLCJoYW5kbGVQYXRocyIsImNoaWxkcmVuIiwib2xkQ2hpbGRyZW4iLCJvbGRDaGlsZHJlblBhdGgiLCJvUGF0aHMiLCJjaHVua1BhdGgiLCJyZW1vdmVkQXJyYXlJbnB1dHNPbmx5IiwibmV3UGF0aHMiLCJyZWNvbXB1dGVkIiwiY2hpbGRyZW5Qcm9wIiwiX2NoaWxkcmVuUHJvcCRzcGxpdCRtIiwiX2NoaWxkcmVuUHJvcCRzcGxpdCRtMiIsImZyb250UGF0aCIsImZyb250T2JqIiwiY2hpbGRyZW5Qcm9wUGF0aCIsImFkZGVkUHJvcHMiLCJrIiwiX2dldFN0YXRlNCIsImN1cnJlbnRHcmFwaHMiLCJleGVjdXRpb25NZXRhIiwiYWxsUHJvcHMiLCJub19vdXRwdXQiLCJpbnB0cyIsIm5zIiwiZm4iLCJmaW5kIiwiZ2V0QXBwU3RhdGUiLCJleGVjdXRpbmciLCJkZWZlcnJlZCIsInNraXBwZWRPclJlYWR5Iiwid2F0Y2hlZCIsImFwcExpZmVjeWNsZSIsImN1cnJlbnRDYiIsIl9jYiIsImdldFBlbmRpbmdDYWxsYmFja3MiLCJwZW5kaW5nQ2FsbGJhY2tzIiwibm9uUGVyc2lzdGVudENhbGxiYWNrcyIsInBlcnNpc3RlbnQiLCJCb29sZWFuIiwiaXNBcHBSZWFkeSIsInNvcnRQcmlvcml0eSIsImMxIiwiYzIiLCJfYzEkcHJpb3JpdHkiLCJfYzIkcHJpb3JpdHkiLCJnZXRTdGFzaCIsImZsYXRPdXRwdXRzIiwiYWxsUHJvcElkcyIsInJlcU91dCIsImlkT3V0IiwiZ2V0SWRzIiwiaXRlbXMiLCJ1bmlxdWVJZHMiLCJNYXAiLCJ1bmlxdWVJdGVtcyIsIl9vYnNlcnZlciIsIl9nZXRTdGF0ZSRjYWxsYmFja3MiLCJwcmlvcml0aXplZCIsImF2YWlsYWJsZSIsInN5bmNDYWxsYmFja3MiLCJhc3luY0NhbGxiYWNrcyIsInBpY2tlZFN5bmNDYWxsYmFja3MiLCJwaWNrZWRBc3luY0NhbGxiYWNrcyIsImlzUmVhZHkiLCJibG9ja2VkIiwiZXhlY3V0aW5nQ2FsbGJhY2siLCJncm91cEJ5IiwibWVyZ2VMZWZ0Iiwid2FpdCIsInN0b3JlZCIsInJlcXVlc3RlZCIsImluaXRpYWxSZXF1ZXN0ZWQiLCJyQ2lyY3VsYXJzIiwickR1cGxpY2F0ZXMiLCJyTWVyZ2VkRHVwbGljYXRlcyIsInBEdXBsaWNhdGVzIiwiYkR1cGxpY2F0ZXMiLCJlRHVwbGljYXRlcyIsIndEdXBsaWNhdGVzIiwiX3BydW5lQ2FsbGJhY2tzIiwickFkZGVkIiwiclJlbW92ZWQiLCJfcHJ1bmVDYWxsYmFja3MyIiwicEFkZGVkIiwicFJlbW92ZWQiLCJfcHJ1bmVDYWxsYmFja3MzIiwiYkFkZGVkIiwiYlJlbW92ZWQiLCJfcHJ1bmVDYWxsYmFja3M0IiwiZUFkZGVkIiwiZVJlbW92ZWQiLCJfcHJ1bmVDYWxsYmFja3M1Iiwid0FkZGVkIiwid1JlbW92ZWQiLCJyZWFkeUNhbGxiYWNrcyIsIm9sZEJsb2NrZWQiLCJuZXdCbG9ja2VkIiwicGVuZGluZ0dyb3VwcyIsImRyb3BwZWQiLCJncm91cCIsImluaXRpYWwiLCJncm91cFdpdGhvdXRJbml0aWFsIiwiZXhnIiwicmVhZHlDYWxsYmFjayIsImJsb2NrZWRCeUFzc3VtcHRpb25zIiwiX2NiJHByZWRlY2Vzc29yczIiLCJnY2IiLCJ1cGRhdGVkIiwibnVsbEdyb3VwQ2FsbGJhY2tzIiwiZ3JvdXBDYWxsYmFja3MiLCJleGVjdXRpb25Hcm91cHMiLCJleGVjdXRpb25Hcm91cENhbGxiYWNrcyIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX24iLCJGIiwicyIsInBhcnNlQ29tcG9uZW50SWQiLCJlbmRzV2l0aCIsIl91bnVzZWQiLCJfaW5pdGlhbGl6ZVdlYlNvY2tldCIsIndzQXZhaWxhYmxlIiwicHJvY2Vzc1NldFByb3BzIiwid2FzRGlzY29ubmVjdGVkIiwid3NVcmwiLCJTaGFyZWRXb3JrZXIiLCJ3YXJuIiwicmF3UHJvcHMiLCJwcm9jZXNzZWRQcm9wcyIsInVwZGF0ZWRTdGF0ZSIsIm9uU2V0UHJvcHMiLCJvblNldFByb3BzQmF0Y2giLCJwYXlsb2FkcyIsIl9pdGVyYXRvciIsIl9zdGVwIiwib25HZXRQcm9wc1JlcXVlc3QiLCJyZXF1ZXN0SWQiLCJjb21wb25lbnRQcm9wcyIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJzZW5kR2V0UHJvcHNSZXNwb25zZSIsIm9uQ29ubmVjdGVkIiwibG9nIiwicGVyc2lzdGVudENhbGxiYWNrcyIsIm5vT3V0cHV0IiwicmVzb2x2ZWQiLCJvbkRpc2Nvbm5lY3RlZCIsInJlYXNvbiIsIm9uRXJyb3IiLCJjb2RlIiwiYnVpbGRXZWJTb2NrZXRVcmwiLCJjb25uZWN0IiwiaW5hY3Rpdml0eV90aW1lb3V0IiwiYWRkRXZlbnRMaXN0ZW5lciIsInZpc2liaWxpdHlTdGF0ZSIsImNvbm5lY3RlZCIsIm5vdGlmeVRhYlZpc2libGUiLCJjYXRjaCIsIndzUHJvdG9jb2wiLCJwcm90b2NvbCIsImhvc3QiLCJzZXRKb2IiLCJyZW1vdmVKb2IiLCJzZXRPdXRkYXRlZCIsImFjdGlvbiIsIkRFRkFVTFRfU1RBVEUiLCJjb21wbGV0ZWQiLCJ0cmFuc2Zvcm1zIiwiZmllbGRzIiwibXV0YXRlQ29tcGxldGVkIiwibXV0YXRlQ2FsbGJhY2tzIiwidHJhbnNmb3JtIiwiZmllbGQiLCJsb2FkIiwibG9hZFBhdGgiLCJvbmNlIiwiY3JlYXRlU3RvcmUiLCJhcHBseU1pZGRsZXdhcmUiLCJ0aHVuayIsImNyZWF0ZVJlZHVjZXIiLCJkb2N1bWVudFRpdGxlIiwiZXhlY3V0ZWRDYWxsYmFja3MiLCJleGVjdXRpbmdDYWxsYmFja3MiLCJwcmlvcml0aXplZENhbGxiYWNrcyIsIlJlbmRlcmVyU3RvcmUiLCJzdG9yZU9ic2VydmVyIiwicmVkdWNlciIsIm1pZGRsZXdhcmUiLCJfX3N0b3JlIiwic2V0U3RvcmUiLCJkYXNoX3N0b3JlcyIsInNldE9ic2VydmVycyIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsImNyZWF0ZUFwcFN0b3JlIiwicmVkdXhEVEVDIiwiX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fQ09NUE9TRV9fIiwiYWN0aW9uc0RlbnlsaXN0IiwibW9kdWxlIiwiaG90IiwiYWNjZXB0IiwibmV4dFJvb3RSZWR1Y2VyIiwicmVxdWlyZSIsInJlcGxhY2VSZWR1Y2VyIiwiaW5pdGlhbGl6ZVN0b3JlIiwib21pdCIsInNldF9wcm9wcyIsImlkT3JQYXRoIiwiX2RzJHkiLCJpbnZhbGlkUHJvdG9jb2xzIiwibmV3TGluZXMiLCJjdHJsQ2hhcnMiLCJodG1sRW50aXRpZXMiLCJjbGVhbl91cmwiLCJmYWxsYmFjayIsImNsZWFuZWQiLCJyZXBsYWNlIiwiZGVjIiwiZnJvbUNoYXJDb2RlIiwidHJpbSIsInJlc291cmNlIiwicHJvbSIsImhlYWQiLCJlbGVtZW50Iiwic3JjIiwiYXN5bmMiLCJvbmxvYWQiLCJvbmVycm9yIiwiYXBwZW5kQ2hpbGQiLCJocmVmIiwicmVsIiwiY2FjaGVkUmVuZGVyZXJJZCIsImdldFJlbmRlcmVySWQiLCJjcnlwdG8iLCJyYW5kb21VVUlEIiwic3RvcmVzIiwiZHVyYXRpb24iLCJfcmVzb2x2ZSIsIldvcmtlck1lc3NhZ2VUeXBlIiwiV29ya2VyQ2xpZW50IiwicmVuZGVyZXJJZCIsIndvcmtlclVybCIsInNlcnZlclVybCIsImluYWN0aXZpdHlUaW1lb3V0IiwiaGVhcnRiZWF0SW50ZXJ2YWwiLCJfdGhpcyIsIndvcmtlciIsInBvcnQiLCJvbm1lc3NhZ2UiLCJoYW5kbGVNZXNzYWdlIiwiY29ubmVjdGlvblByb21pc2UiLCJjb25uZWN0aW9uUmVzb2x2ZSIsInN0YXJ0IiwicG9zdE1lc3NhZ2UiLCJDT05ORUNUIiwiRElTQ09OTkVDVCIsImNsb3NlIiwiaXNDb25uZWN0ZWQiLCJfc3RlcCR2YWx1ZSIsInBlbmRpbmciLCJfdGhpczIiLCJoZWFydGJlYXRfaW50ZXJ2YWwiLCJfdGhpczMiLCJyZXF1ZXN0Q291bnRlciIsInNldCIsIkNBTExCQUNLX1JFUVVFU1QiLCJHRVRfUFJPUFNfUkVTUE9OU0UiLCJUQUJfVklTSUJMRSIsImV2ZW50IiwiQ09OTkVDVEVEIiwiRElTQ09OTkVDVEVEIiwiX3N0ZXAyJHZhbHVlIiwiX21lc3NhZ2UkcGF5bG9hZCIsIkNBTExCQUNLX1JFU1BPTlNFIiwiU0VUX1BST1BTIiwiU0VUX1BST1BTX0JBVENIIiwiR0VUX1BST1BTX1JFUVVFU1QiLCJFUlJPUiIsIl9tZXNzYWdlJHBheWxvYWQyIiwiX21lc3NhZ2UkcGF5bG9hZDMiLCJ3b3JrZXJDbGllbnRJbnN0YW5jZSIsIl9jb25maWckd2Vic29ja2V0NCIsIl9jb25maWckd2Vic29ja2V0NSIsImNoZWNrUHJvcFR5cGVzIiwicHJvcFR5cGVFcnJvckhhbmRsZXIiLCJ2YWxpZGF0ZUNvbXBvbmVudCIsIkNoZWNrZWRDb21wb25lbnQiLCJjb21wb25lbnQiLCJlcnJvck1lc3NhZ2UiLCJ1c2VDYWxsYmFjayIsInVzZUNvbnRleHQiLCJ1c2VNZW1vIiwidXNlU3RvcmUiLCJ1c2VTZWxlY3RvciIsInVzZURpc3BhdGNoIiwiY3JlYXRlQ29udGV4dCIsIkRhc2hDb250ZXh0UHJvdmlkZXIiLCJzdHJpbmdQYXRoIiwiZXh0cmFQYXRoIiwicmF3UGF0aCIsImZpbHRlckZ1bmMiLCJsb2FkaW5nUGF0aCIsInVzZUxvYWRpbmciLCJjdHhWYWx1ZSIsImN0eCIsInVzZVJlZiIsIm1lcmdlUmlnaHQiLCJtYXBPYmpJbmRleGVkIiwiQ29tcG9uZW50RXJyb3JCb3VuZGFyeSIsInJlc2V0Q29tcG9uZW50U3RhdGUiLCJnZXRXYXRjaGVkS2V5cyIsImlzRHJ5Q29tcG9uZW50IiwiY2hlY2tSZW5kZXJUeXBlUHJvcCIsInN0cmluZ2lmeVBhdGgiLCJSZWdpc3RyeSIsImlzU2ltcGxlQ29tcG9uZW50Iiwic2VsZWN0RGFzaFByb3BzIiwic2VsZWN0RGFzaFByb3BzRXF1YWxpdHlGbiIsInNlbGVjdENvbmZpZyIsIkRhc2hXcmFwcGVyIiwiX2Rhc2hwcml2YXRlX2Vycm9yIiwiX3Bhc3NlZENvbXBvbmVudCIsIl9uZXdSZW5kZXIiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfZXhjbHVkZWQiLCJtZW1vaXplZEtleXMiLCJuZXdSZW5kZXIiLCJmcmVzaFJlbmRlcnMiLCJyZW5kZXJlZFBhdGgiLCJyZW5kZXJDb21wb25lbnQiLCJyZW5kZXJDb21wb25lbnRQcm9wcyIsInJlbmRlckgiLCJfdXNlU2VsZWN0b3IiLCJfdXNlU2VsZWN0b3IyIiwiaCIsImNoYW5nZWRQcm9wcyIsInNldFByb3BzIiwiX3JlbmRlckNvbXBvbmVudFByb3BzIiwiX2Rhc2hfZXJyb3IiLCJyZXN0UHJvcHMiLCJfZXhjbHVkZWQyIiwiY3VycmVudFN0YXRlIiwid2F0Y2hlZEtleXMiLCJjcmVhdGVDb250YWluZXIiLCJjb250YWluZXIiLCJjb250YWluZXJQYXRoIiwiX2NoaWxkTmV3UmVuZGVyIiwiX2NvbnRhaW5lciRwcm9wcyIsIndyYXBDaGlsZHJlblByb3AiLCJub2RlIiwiY2hpbGRyZW5QYXRoIiwiZXh0cmFQcm9wcyIsInNldEh5ZHJhdGVkUHJvcHMiLCJjaGlsZE5ld1JlbmRlciIsImhhbmRsZU9iamVjdCIsIm9wYXRoIiwibm9kZVZhbHVlIiwiX25vZGUiLCJiYWNrUGF0aCIsImZvdW5kIiwiaGFzT2JqZWN0IiwiZmlyc3ROb2RlIiwiZWwiLCJlbGVtZW50UGF0aCIsImxpc3RWYWx1ZSIsImZyb250IiwiZHluYW1pYyIsImhhc0JhY2siLCJqIiwiY3VyIiwiZHluVmFsdWUiLCJhUGF0aCIsImh5ZHJhdGVGdW5jIiwiaHlkcmF0ZWRQcm9wcyIsImh5ZHJhdGVkQ2hpbGRyZW4iLCJwcm9wc19jaGVjayIsImh5ZHJhdGVkIiwiaXNWYWxpZEVsZW1lbnQiLCJjb21wb25lbnRUeXBlIiwiYWRkQ29tcG9uZW50VG9MYXlvdXQiLCJyZW1vdmVDb21wb25lbnQiLCJfcmVmJHRlbXAiLCJ0ZW1wIiwiaW5zZXJ0ZWQiLCJzZXRJbnNlcnRlZCIsImNoZWNrRGFzaENoaWxkcmVuVXBkYXRlIiwicHJldmlvdXNIYXNoZXMiLCJpc0ZpcnN0TGV2ZWxQcm9wc0NoaWxkIiwidXBkYXRlZFBhdGgiLCJzdHJQYXRoIiwidXBkYXRlZFNlZ21lbnRzIiwiZnVsbFNlZ21lbnRzIiwic3RhcnRzV2l0aFBhdGgiLCJldmVyeSIsInNlZyIsInJlbWFpbmluZ1NlZ21lbnRzIiwicHJvcHNDb3VudCIsImRldGVybWluZUNoYW5nZWRQcm9wcyIsImNvbWJpbmVkSGFzaCIsImxheW91dEhhc2hlcyIsInBhdGhIYXNoIiwiX2lzRmlyc3RMZXZlbFByb3BzQ2hpIiwiX2lzRmlyc3RMZXZlbFByb3BzQ2hpMiIsImRlc2NlbmRhbnQiLCJwcmV2aW91c0hhc2giLCJoYXNoIiwiX19fIiwiX19fXyIsImNvbXBvbmVudERlZmluaXRpb24iLCJsYXlvdXRQYXRoIiwiR2xvYmFsRXJyb3JDb250YWluZXIiLCJoeWRyYXRlSW5pdGlhbE91dHB1dHMiLCJzZXRMYXlvdXQiLCJjb21wdXRlR3JhcGhzIiwiRXZlbnRFbWl0dGVyIiwiVW5jb25uZWN0ZWRDb250YWluZXIiLCJkZXBlbmRlbmNpZXNSZXF1ZXN0IiwibGF5b3V0UmVxdWVzdCIsImVycm9yTG9hZGluZyIsInNldEVycm9yTG9hZGluZyIsInJlbmRlcmVkVHJlZSIsInN0b3JlRWZmZWN0IiwiZW1pdCIsInNlcnZlX2xvY2FsbHkiLCJfZGFzaFBsb3RseUpTVVJMIiwicmVxdWVzdHNfcGF0aG5hbWVfcHJlZml4IiwicGxvdGx5anNfdXJsIiwiY29udGVudCIsImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiwiX19odG1sIiwiY2xhc3NOYW1lIiwiRnJhZ21lbnQiLCJjb21wb25lbnRzIiwiZmluYWxMYXlvdXQiLCJoYXNFcnJvciIsImZyb250RW5kIiwiYmFja0VuZCIsIm9uZU9mIiwib2JqZWN0IiwiaGlzdG9yeSIsIkNvbnRhaW5lciIsIkFQSUNvbnRyb2xsZXIiLCJMb2FkaW5nIiwiVG9vbGJhciIsIlJlbG9hZGVyIiwic2V0SG9va3MiLCJzZXRDb25maWciLCJtZW1vaXplV2l0aCIsImlkZW50aXR5IiwiVW5jb25uZWN0ZWRBcHBDb250YWluZXIiLCJDb21wb25lbnQiLCJVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IiwicmVuZGVyIiwic2hvd191bmRvX3JlZG8iLCJSZWFjdERPTSIsIkRhc2hSZW5kZXJlciIsImNyZWF0ZVJvb3QiLCJyb290IiwibG9nV2FybmluZ09uY2UiLCJHRVQiLCJmZXRjaENvbmZpZyIsIl9ib2R5IiwiUE9TVCIsInJlcXVlc3QiLCJlbmRwb2ludCIsInNldENvbm5lY3Rpb25TdGF0dXMiLCJfYm9keTIiLCJjb250ZW50VHlwZSIsIl9zZXRDb25uZWN0aW9uU3RhdHVzIiwiYmFja0VuZENvbm5lY3RlZCIsImFjdGlvbkxpc3QiLCJPTl9QUk9QX0NIQU5HRSIsIlNFVF9SRVFVRVNUX1FVRVVFIiwiU0VUX0dSQVBIUyIsIlNFVF9QQVRIUyIsIlNFVF9MQVlPVVQiLCJTRVRfQVBQX0xJRkVDWUNMRSIsIlNFVF9DT05GSUciLCJBRERfSFRUUF9IRUFERVJTIiwiT05fRVJST1IiLCJTRVRfSE9PS1MiLCJJTlNFUlRfQ09NUE9ORU5UIiwiUkVNT1ZFX0NPTVBPTkVOVCIsIlJFU0VUX0NPTVBPTkVOVF9TVEFURSIsImdldEFjdGlvbiIsIkRlcEdyYXBoIiwiaXNOdW1lcmljIiwiYXAiLCJldm9sdmUiLCJmb3JFYWNoT2JqSW5kZXhlZCIsImNyYXdsTGF5b3V0IiwiQUxMIiwid2lsZCIsIk1BVENIIiwiQUxMU01BTExFUiIsImV4cGFuZCIsIndpbGRjYXJkcyIsImFsbG93ZWRXaWxkY2FyZHMiLCJPdXRwdXQiLCJJbnB1dCIsIlN0YXRlIiwid2lsZGNhcmRWYWxUeXBlcyIsImlkSW52YWxpZENoYXJzIiwiaXNXaWxkY2FyZElkIiwicGFyc2VXaWxkY2FyZElkIiwicGFyc2VNdWx0aXBsZU91dHB1dHMiLCJvdXRwdXRJZEFuZFByb3AiLCJkb3RQb3MiLCJzdHJpbmdpZnlWYWwiLCJwYXJ0cyIsImlkVmFsU29ydCIsImJJc051bWVyaWMiLCJhTiIsImJOIiwiYUlzQm9vbCIsInZhbEJlZm9yZSIsInZhbEFmdGVyIiwiYWRkTWFwIiwiZGVwTWFwIiwiZGVwZW5kZW5jeSIsImlkTWFwIiwiYWRkUGF0dGVybiIsImlkU3BlYyIsInZhbHVlc0tleSIsInByb3BNYXAiLCJ2YWx1ZU1hcCIsInZhbE1hdGNoIiwib2ZmbG9hZFBhdHRlcm5zIiwicGF0dGVybnNNYXAiLCJ0YXJnZXRNYXAiLCJ2YWxpZGF0ZURlcGVuZGVuY2llcyIsInBhcnNlZERlcGVuZGVuY2llcyIsIm91dFN0cnMiLCJvdXRPYmpzIiwiZGVwIiwiaGFzT3V0cHV0cyIsInByZXZlbnRfaW5pdGlhbF9jYWxsIiwiY2xzIiwiaWRQcm9wIiwidmFsaWRhdGVBcmciLCJmaW5kRHVwbGljYXRlT3V0cHV0cyIsImZpbmRNaXNtYXRjaGVkV2lsZGNhcmRzIiwiaW52YWxpZENoYXJzIiwibmV3T3V0cHV0U3RycyIsIm5ld091dHB1dE9ianMiLCJpZE9iaiIsInNlbGZPdmVybGFwIiwid2lsZGNhcmRPdmVybGFwIiwib3RoZXJPdmVybGFwIiwiaWRQcm9wMiIsImNoZWNrSW5PdXRPdmVybGFwIiwib3V0SWQiLCJvdXRQcm9wIiwiaW5fIiwiaW5JZCIsImluUHJvcCIsIl9maW5kV2lsZGNhcmRLZXlzIiwiZmluZFdpbGRjYXJkS2V5cyIsIm91dDBNYXRjaEtleXMiLCJtYXRjaEtleXMiLCJvdXRwdXRzSGF2ZU1hdGNoIiwiYXJnIiwiX2ZpbmRXaWxkY2FyZEtleXMyIiwiYWxsc21hbGxlcktleXMiLCJkaWZmS2V5cyIsImRpZmYiLCJvdXREZXNjIiwibWF0Y2hXaWxkS2V5cyIsImFXaWxkIiwiYldpbGQiLCJpZEtleXMiLCJpZFZhbHMiLCJfaXRlcmF0b3IzIiwiX3N0ZXAzIiwiaWQyIiwicHJvcGVydHkyIiwidmFsaWRhdGVDYWxsYmFja3NUb0xheW91dCIsInN0YXRlXyIsImxheW91dF8iLCJwYXRoc18iLCJ2YWxpZGF0ZUlkcyIsInZhbGlkYXRpb25fbGF5b3V0Iiwib3V0cHV0TWFwIiwib3V0cHV0UGF0dGVybnMiLCJ0YWlsIiwibWlzc2luZ0lkIiwidmFsaWRhdGVQcm9wIiwiaWRQYXRoIiwicmF3UHJvcCIsImxhc3QiLCJjaGFyQXQiLCJ2YWxpZGF0ZUlkUGF0dGVyblByb3AiLCJpZFJlc29sdmVkIiwiY2FsbGJhY2tJZHNDaGVja2VkRm9yU3RhdGUiLCJ2YWxpZGF0ZVN0YXRlIiwidmFsaWRhdGVNYXAiLCJkb1N0YXRlIiwiZmNiIiwib3B0aW9uYWwiLCJkZXBzIiwidmFsaWRhdGVQYXR0ZXJucyIsImtleVBhdHRlcm5zIiwiX2xvb3AyIiwiZGVwZW5kZW5jaWVzIiwibXVsdGlHcmFwaCIsInBlcmZvcm1hbmNlIiwid2lsZGNhcmRQbGFjZWhvbGRlcnMiLCJmaXhJZHMiLCJ3cmFwcGVkREUiLCJsaW5lcyIsInZhbGlkYXRlX2NhbGxiYWNrcyIsIm91dHB1dFBhdHRlcm5NYXAiLCJpbnB1dFBhdHRlcm5NYXAiLCJmaW5hbEdyYXBocyIsIk11bHRpR3JhcGgiLCJleGFjdCIsImtleVBsYWNlaG9sZGVycyIsIm1ha2VBbGxJZHMiLCJvdXRJZEZpbmFsIiwiaWRMaXN0IiwidGVzdFZhbHMiLCJvdXRWYWxJbmRleCIsIm5ld1ZhbHMiLCJvdXRwdXRUYWciLCJkdXBsaWNhdGVPdXRwdXRzIiwiY2JJbiIsImNiT3V0IiwiYWRkSW5wdXRUb011bHRpIiwiaW5JZFByb3AiLCJvdXRJZFByb3AiLCJmaXJzdFBhc3MiLCJhZGROb2RlIiwiYWRkRGVwZW5kZW5jeSIsImFkZE91dHB1dFRvTXVsdGkiLCJpbk9iaiIsImluSWRMaXN0IiwiX2ZpbmRXaWxkY2FyZEtleXMzIiwiZmlyc3RTaW5nbGVPdXRwdXQiLCJmaW5hbERlcGVuZGVuY3kiLCJhbHNvSW5wdXQiLCJvdXRJZExpc3QiLCJ0ZW1wT3V0SWRQcm9wIiwib3V0SWROYW1lIiwiaW5wdXRPYmplY3QiLCJkdXBlT3V0SWRQcm9wIiwib3JpZ2luYWxOYW1lIiwibmV3TmFtZSIsImNudCIsImluTmFtZSIsIm91dE5hbWUiLCJlbmQiLCJjYWxsYmFja0dyYXBoVGltZSIsInRvRml4ZWQiLCJwYXR0ZXJuVmFsIiwicmVmSW5kZXgiLCJyZWZQYXR0ZXJuVmFsIiwiZ2V0Q2FsbGJhY2tCeU91dHB1dCIsImFkZFJlc29sdmVkRnJvbU91dHB1dHMiLCJvdXRQYXR0ZXJuIiwib3V0cyIsIm91dDBLZXlzIiwib3V0MFBhdHRlcm5WYWxzIiwiZm91bmRDYklkcyIsIm91dFZhbHMiLCJzaW5nbGVPdXRQYXR0ZXJuIiwiYW55U2VlbiIsIm91dFNldCIsIm1hdGNoU3RyIiwibmV3UHJvcCIsImxheW91dENodW5rIiwib3B0cyIsIm91dHB1dHNPbmx5IiwiYWRkQ2FsbGJhY2siLCJmb3VuZEluZGV4IiwiZm91bmRDYiIsImFkZENhbGxiYWNrSWZBcnJheSIsImluaSIsImluaWoiLCJoYW5kbGVPbmVJZCIsIm91dElkQ2FsbGJhY2tzIiwiaW5JZENhbGxiYWNrcyIsIm1heWJlQWRkQ2FsbGJhY2siLCJoYW5kbGVUaGlzQ2FsbGJhY2siLCJjaGlsZCIsImNvb2tpZSIsInJlY29yZFVpRWRpdCIsInNldEFwcExpZmVjeWNsZSIsInNldFJlcXVlc3RRdWV1ZSIsImluc2VydENvbXBvbmVudCIsIm9uUHJvcENoYW5nZSIsImh0bWwiLCJ0cmlnZ2VyRGVmYXVsdFN0YXRlIiwidG9rZW5OYW1lIiwiY3NyZl90b2tlbl9uYW1lIiwiaGVhZGVyTmFtZSIsImNzcmZfaGVhZGVyX25hbWUiLCJjb29raWVzIiwidG9rZW4iLCJvdmVyYWxsT3JkZXIiLCJsYXlvdXRDYWxsYmFja3MiLCJzcGVjaWFsQ2FsbGJhY2tzIiwiaXNOb091dHB1dCIsImlzTm9JbnB1dCIsImlucCIsInJlZG8iLCJtb3ZlSGlzdG9yeSIsInVuZG8iLCJyZXZlcnQiLCJmdXR1cmUiLCJwYXN0IiwidGFyZ2V0cyIsInByb21pc2VzIiwicmVuZGVyZWQiLCJyZXNvbHZlUmVuZGVyZWQiLCJwYXRoT2ZJZCIsInRhcmdldCIsInJlYWR5IiwicmFjZSIsInByb3BFcSIsInN1YlRyZWUiLCJzdGFydGluZ1BhdGgiLCJvbGRTdHJzIiwib2xkT2JqcyIsImRpZmZIZWFkIiwic3BMZW4iLCJvbGRWYWxQYXRocyIsIm9sZEtleXMiLCJvbGRpZSIsInBhdGhPYmoiLCJoYXNVcmxCYXNlIiwiaGFzUmVxUHJlZml4IiwiYmFzZSIsInVybF9iYXNlX3BhdGhuYW1lIiwicHJvcHNDaGlsZHJlbiIsImN1cnJlbnRQYXRoIiwib2JqT2YiLCJiYWNrIiwiY2hpbGRPYmoiLCJjaGlsZFBhdGgiLCJuZXdQYXRoIiwiY3VyUGF0aCIsIm9WYWx1ZSIsIl9jcmF3bExheW91dCIsIl9ldiIsIm9uIiwibGlzdGVuZXIiLCJyZW1vdmVMaXN0ZW5lciIsImlkeCIsIl9sZW4iLCJfa2V5IiwiX2xlbjIiLCJfa2V5MiIsIlJlYWN0UHJvcFR5cGVzU2VjcmV0IiwidHlwZVNwZWNzIiwiY29tcG9uZW50TmFtZSIsImdldFN0YWNrIiwidHlwZVNwZWNOYW1lIiwiaGFzT3duUHJvcGVydHkiLCJleCIsInN0YWNrIiwiYm9vbCIsImlzUmVxdWlyZWQiLCJjb21wYXJhdG9yIiwibHQiLCJob3RfcmVsb2FkIiwiX3Byb3BzJGNvbmZpZyRob3RfcmVsIiwibWF4X3JldHJ5IiwiZGlzYWJsZWQiLCJpbnRlcnZhbElkIiwicGFja2FnZXMiLCJfcmV0cnkiLCJfaGVhZCIsImNsZWFySW50ZXJ2YWwiLCJzZXRTdGF0ZSIsImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyIsInJlbG9hZFJlcXVlc3QiLCJjb21wb25lbnREaWRVcGRhdGUiLCJwcmV2UHJvcHMiLCJwcmV2U3RhdGUiLCJoYXJkIiwid2FzX2NzcyIsImZpbGVzIiwiaXNfY3NzIiwibm9kZXNUb0Rpc2FibGUiLCJpdCIsImV2YWx1YXRlIiwiaXRlcmF0ZU5leHQiLCJzZXRBdHRyaWJ1dGUiLCJsaW5rIiwicmVsb2FkIiwiYWxlcnQiLCJjb21wb25lbnREaWRNb3VudCIsIl90aGlzJHByb3BzIiwiX3RoaXMkc3RhdGUiLCJzZXRJbnRlcnZhbCIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwiZGVmYXVsdFByb3BzIiwic3RyaW5nIiwibnVtYmVyIiwiVW5jb25uZWN0ZWRUb29sYmFyIiwidW5kb0xpbmsiLCJvbkNsaWNrIiwicmVkb0xpbmsiLCJDeXRvc2NhcGUiLCJDeXRvc2NhcGVDb21wb25lbnQiLCJkYWdyZSIsImZjb3NlIiwiSlNPTlRyZWUiLCJzdHlsZXNoZWV0IiwidXBkYXRlU2VsZWN0ZWROb2RlIiwidXBkYXRlQ2hhbmdlZFByb3BzIiwidXBkYXRlQ2FsbGJhY2siLCJ1c2UiLCJnZW5lcmF0ZUVsZW1lbnRzIiwicHJvZmlsZSIsImV4dHJhTGlua3MiLCJjb25zdW1lZCIsImVsZW1lbnRzIiwic3RydWN0dXJlIiwicmVjb3JkTm9kZSIsInJhd1Byb3BlcnR5IiwiaWRUeXBlIiwicGFyZW50SWQiLCJjaGlsZElkIiwibGFiZWwiLCJwYXJlbnQiLCJyZWNvcmRFZGdlIiwidmlzaWJsZUluZGV4IiwiaGlkZGVuIiwiY2JQcm9maWxlIiwiY291bnQiLCJ0aW1lIiwidG90YWwiLCJtb2RlIiwicm91bmQiLCJsb2FkaW5nU2V0IiwiZXJyb3JTZXQiLCJub2RlSWQiLCJjaGlsZElkcyIsImNoaWxkRnJvbSIsImNoaWxkVG8iLCJyZWR1Y2VTdGF0dXMiLCJsYXRlc3QiLCJmbGF0dGVuT3V0cHV0cyIsImZsYXR0ZW5JbnB1dHMiLCJpbkFycmF5IiwiZmluYWwiLCJpbkl0ZW0iLCJjbGVhbk91dHB1dElkIiwib3V0cHV0SWQiLCJhZ2ciLCJjYlByZWZpeExlbiIsImRhZ3JlTGF5b3V0IiwicGFkZGluZyIsInJhbmtlciIsImZvcmNlTGF5b3V0IiwiYW5pbWF0ZSIsImxheW91dHMiLCJzcGFjaW5nRmFjdG9yIiwibm9kZVNlcCIsInJhbmtTZXAiLCJyYW5rRGlyIiwiZm9yY2UiLCJDYWxsYmFja0dyYXBoIiwiY2hhbmdlZCIsImxpZmVjeWNsZVN0YXRlIiwic2VsZWN0ZWQiLCJzZXRTZWxlY3RlZCIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwiY3l0b3NjYXBlIiwic2V0Q3l0b3NjYXBlIiwiZ3JhcGhMYXlvdXQiLCJjaG9zZW5UeXBlIiwiX2Nob3NlblR5cGUiLCJsYXlvdXRTZWxlY3RvciIsIl91c2VTdGF0ZTUiLCJfdXNlU3RhdGU2IiwibGF5b3V0VHlwZSIsInNldExheW91dFR5cGUiLCJ1c2VDeXRvc2NhcGVFZmZlY3QiLCJlZmZlY3QiLCJjb25kaXRpb24iLCJnZXRDb21wb25lbnQiLCJoYXNQYXR0ZXJucyIsImdldFByb3BWYWx1ZSIsInNldFByZXNldExheW91dCIsIl9sYXlvdXRTZWxlY3RvciRjdXJyZSIsImN5IiwicG9zaXRpb25zIiwibm9kZXMiLCJlYWNoIiwicG9zaXRpb24iLCJmaXQiLCJ6b29tIiwicGFuIiwiZWxlbWVudE5hbWUiLCJlbGVtZW50SW5mbyIsIl9nZXRDb21wb25lbnQiLCJyZXN0IiwiY2FsbGJhY2tPdXRwdXRJZCIsIm5ldHdvcmsiLCJjb21wdXRlIiwiYXZnIiwidGltaW5nIiwiZG93bmxvYWQiLCJ1cGxvYWQiLCJjeUxheW91dCIsInN0eWxlIiwid2lkdGgiLCJoZWlnaHQiLCJ0aGVtZSIsImxhYmVsUmVuZGVyZXIiLCJnZXRJdGVtU3RyaW5nIiwiaXRlbVR5cGUiLCJzaG91bGRFeHBhbmROb2RlIiwia2V5TmFtZSIsImxldmVsIiwib25DaGFuZ2UiLCJyZWYiLCJVbmNvbm5lY3RlZENhbGxiYWNrR3JhcGhDb250YWluZXIiLCJnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IiLCJjb21wb25lbnREaWRDYXRjaCIsImluZm8iLCJteUlEIiwiQ2FsbGJhY2tHcmFwaENvbnRhaW5lciIsInNlbGVjdG9yIiwiZGlzcGxheSIsImNvbG9yIiwiZ2hvc3QiLCJvcGFjaXR5IiwiU1RBVFVTTUFQIiwiZ2V0RWRnZVR5cGVzIiwiY29ubmVjdGVkRWRnZXMiLCJhc2NlbmQiLCJjb2xsZWN0aW9uIiwidmlzaXRlZCIsImVkZ2VzIiwicGFyZW50cyIsInNvdXJjZXMiLCJhbmNlc3RvcnMiLCJkZXNjZW5kIiwiYWRkQ2xhc3MiLCJvdGhlciIsImFic29sdXRlQ29tcGxlbWVudCIsInJlbW92ZUNsYXNzIiwiZmxhc2hUaW1lIiwiZmxhc2hDbGFzcyIsImVkZ2VzVG8iLCJhdmdUaW1lIiwiaGFzQ2xhc3MiLCJ0aW1lTGVmdCIsInByZXZDaGlsZHJlbiIsIkNvbGxhcHNlSWNvbiIsIndlcmt6ZXVnQ3NzIiwiRnJvbnRFbmRFcnJvciIsImNvbGxhcHNlZCIsImlzTGlzdEl0ZW0iLCJpbkFsZXJ0c1RyYXkiLCJjYXJkQ2xhc3NlcyIsImVycm9ySGVhZGVyIiwidGltZXN0YW1wIiwidG9Mb2NhbGVUaW1lU3RyaW5nIiwiRXJyb3JDb250ZW50IiwiQmFja2VuZEVycm9yIiwiaWZyYW1lUmVmIiwic2V0SGVpZ2h0IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInNyY0RvYyIsImJvcmRlciIsIk1BWF9NRVNTQUdFX0xFTkdUSCIsIlVuY29ubmVjdGVkRXJyb3JDb250ZW50IiwiaXNGdWxsSHRtbERvYyIsInRvTG93ZXJDYXNlIiwiaXNIdG1sRnJhZ21lbnQiLCJsaW5lIiwiZXJyb3JQcm9wVHlwZXMiLCJGcm9udEVuZEVycm9yQ29udGFpbmVyIiwiY2xpY2tIYW5kbGVyIiwiZXJyb3JFbGVtZW50cyIsImFycmF5IiwiRGVidWdNZW51IiwiVW5jb25uZWN0ZWRHbG9iYWxFcnJvckNvbnRhaW5lciIsImhvdFJlbG9hZCIsIkNoZWNrSWNvbiIsIkNsb2NrSWNvbiIsIkVycm9ySWNvbiIsIkdyYXBoSWNvbiIsIk9mZkljb24iLCJFeHBhbmQiLCJWZXJzaW9uSW5mbyIsIlBsb3RseUNsb3VkIiwiRGV2dG9vbFByb3ZpZGVyIiwiY2xhc3NlcyIsInZhcmlhbnQiLCJ2YXJpYW50MiIsImlzQ29sbGFwc2VkIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsIk1lbnVDb250ZW50IiwiX2NvbmZpZyRkZXZfdG9vbHMiLCJwb3B1cCIsInRvZ2dsZUVycm9ycyIsImVyckNvdW50IiwidG9nZ2xlQ2FsbGJhY2tHcmFwaCIsIl9TdGF0dXNJY29uIiwiY3VzdG9tIiwiZGV2X3Rvb2xzIiwiX2RldnRvb2wkcHJvcHMiLCJjb21wIiwibGVmdCIsInJpZ2h0IiwicGxvdGx5X2Nsb3VkX2luc3RhbGxlZCIsImZpbGwiLCJtYXJnaW5SaWdodCIsIkRlYnVnIiwiX3VzZURldnRvb2wiLCJzZXRQb3B1cCIsInNldENvbGxhcHNlZCIsInRvZ2dsZUNvbGxhcHNlZCIsInNldEl0ZW0iLCJwb3B1cENvbnRlbnQiLCJtZW51Q29udGVudCIsInBvcHVwTmFtZSIsIkNsb3VkU2xhc2hJY29uIiwiQ0xPVURfUE9QVVAiLCJpc09wZW4iLCJvbkNvcHkiLCJuYXZpZ2F0b3IiLCJjbGlwYm9hcmQiLCJ3cml0ZVRleHQiLCJEQVlfSU5fTVMiLCJjb21wYXJlVmVyc2lvbnMiLCJ2MSIsInYyIiwidjFQYXJ0cyIsInYyUGFydHMiLCJwYXJ0MSIsInBhcnQyIiwicmVxdWVzdERhc2hWZXJzaW9uSW5mbyIsIl9yZXF1ZXN0RGFzaFZlcnNpb25JbmZvIiwiY3VycmVudERhc2hWZXJzaW9uIiwiZGFzaFZlcnNpb25VcmwiLCJweXRob25WZXJzaW9uIiwiZGRrVmVyc2lvbiIsInBsb3RseVZlcnNpb24iLCJjYWNoZWRWZXJzaW9uSW5mbyIsImNhY2hlZE5ld0Rhc2hWZXJzaW9uTGluayIsImxhc3RGZXRjaGVkIiwicXVlcnlQYXJhbXMiLCJkYXNoX3ZlcnNpb24iLCJkYXNoX3ZlcnNpb25fdXJsIiwicHl0aG9uX3ZlcnNpb24iLCJkZGtfdmVyc2lvbiIsInBsb3RseV92ZXJzaW9uIiwidmVyc2lvbiIsInNob3VsZFJlcXVlc3REYXNoVmVyc2lvbiIsIlVSTFNlYXJjaFBhcmFtcyIsImRpc2FibGVfdmVyc2lvbl9jaGVjayIsInNob3dOb3RpZmljYXRpb25zIiwic2hvdWxkU2hvd1VwZ3JhZGVOb3RpZmljYXRpb24iLCJuZXdEYXNoVmVyc2lvbiIsImxhc3REaXNtaXNzZWQiLCJsYXN0RGlzbWlzc2VkVmVyc2lvbiIsInNldE5ld0Rhc2hWZXJzaW9uIiwibmV3RGFzaFZlcnNpb25MaW5rIiwic2V0TmV3RGFzaFZlcnNpb25MaW5rIiwidXBncmFkZVRvb2x0aXBPcGVuZWQiLCJzZXRVcGdyYWRlVG9vbHRpcE9wZW5lZCIsInNldERvbnRTaG93QWdhaW4iLCJzZXRSZW1pbmRNZUxhdGVyIiwic2V0U2tpcFRoaXNWZXJzaW9uIiwiaGlkZVVwZ3JhZGVUb29sdGlwIiwiUkVESVJFQ1RfVVJJX1BBVEhOQU1FIiwiT0FVVEhfQ09PS0lFX05BTUUiLCJtZXNzYWdlUGFydHMiLCJpbnZhbGlkUHJvcFBhdGgiLCJleHBlY3RlZFByb3BUeXBlIiwiaW52YWxpZFByb3BUeXBlUHJvdmlkZWQiLCJqc29uU3VwcGxpZWRWYWx1ZSIsIlNJTVBMRV9DT01QT05FTlRfVFlQRVMiLCJsZW5zUGF0aCIsInN0b3JlUHJlZml4Iiwia2V5UHJlZml4TWF0Y2giLCJwcmVmaXgiLCJzZXBhcmF0b3IiLCJmdWxsU3RyIiwiZnVsbExlbiIsIlVOREVGSU5FRCIsIl9wYXJzZSIsIl9zdHJpbmdpZnkiLCJXZWJTdG9yZSIsIl9uYW1lIiwiX3N0b3JhZ2UiLCJoYXNJdGVtIiwiX3NldEl0ZW0iLCJyZW1vdmVJdGVtIiwia2V5UHJlZml4IiwiZnVsbFByZWZpeCIsImtleU1hdGNoIiwia2V5c1RvUmVtb3ZlIiwiZnVsbEtleSIsIk1lbVN0b3JlIiwicG93IiwibG9uZ1N0cmluZyIsIm1lbW9yeSIsImJhY2tFbmRzIiwibG9jYWwiLCJzZXNzaW9uIiwidHJ5R2V0V2ViU3RvcmUiLCJmYWxsYmFja1N0b3JlIiwic3RvcmVUZXN0IiwidGVzdEtleSIsImdldFN0b3JlIiwibm9vcFRyYW5zZm9ybSIsImV4dHJhY3QiLCJwcm9wVmFsdWUiLCJzdG9yZWRWYWx1ZSIsIl9wcm9wVmFsdWUiLCJnZXRUcmFuc2Zvcm0iLCJwcm9wUGFydCIsInBlcnNpc3RlbmNlVHJhbnNmb3JtcyIsImdldFZhbHNLZXkiLCJwZXJzaXN0ZWRQcm9wIiwicGVyc2lzdGVuY2UiLCJnZXRQcm9wcyIsImdldFZhbCIsImRhc2hQZXJzaXN0ZW5jZSIsInBlcnNpc3RlZF9wcm9wcyIsInBlcnNpc3RlbmNlX3R5cGUiLCJjYW5QZXJzaXN0IiwiX2dldFByb3BzIiwiaXNQZXJzaXN0ZW5jZU1pc21hdGNoIiwiX3BlcnNpc3RlZFByb3Akc3BsaXQiLCJfcGVyc2lzdGVkUHJvcCRzcGxpdDIiLCJzdG9yYWdlIiwiX2dldFRyYW5zZm9ybSIsInZhbHNLZXkiLCJvcmlnaW5hbFZhbCIsIm5ld1ZhbCIsImxheSIsInBlcnNpc3RlbmNlTW9kcyIsIlVORE8iLCJtb2RQcm9wIiwidXBkYXRlIiwiX3N0b3JhZ2UkZ2V0SXRlbSIsIl9zdG9yYWdlJGdldEl0ZW0yIiwiZnJvbVZhbCIsInRvVmFsIiwiX3BlcnNpc3RlZFByb3Akc3BsaXQzIiwiX3BlcnNpc3RlZFByb3Akc3BsaXQ0IiwiX2dldFByb3BzMiIsImxheW91dE91dCIsIl9nZXRQcm9wczMiLCJnZXRGaW5hbCIsInByZXZWYWwiLCJmaW5hbFBlcnNpc3RlbmNlIiwiZmluYWxQZXJzaXN0ZW5jZVR5cGUiLCJmaW5hbFBlcnNpc3RlZFByb3BzIiwicGVyc2lzdGVuY2VDaGFuZ2VkIiwibm90SW5OZXdQcm9wcyIsImRlcGVyc2lzdGVkUHJvcHMiLCJmaW5hbFN0b3JhZ2UiLCJjcmVhdGVBcGlSZWR1Y2VyIiwiQXBpUmVkdWNlciIsIm5ld1N0YXRlIiwiX2FjdGlvbiRwYXlsb2FkIiwibmV3UmVxdWVzdCIsImluaXRpYWxDaGFuZ2UiLCJjaGlsZHJlbl9wcm9wcyIsInN0YXRlTGlzdCIsIlNUQVJURUQiLCJIWURSQVRFRCIsIkRFU1RST1lFRCIsImluaXRpYWxHcmFwaCIsImluaXRpYWxFcnJvciIsImluaXRpYWxIaXN0b3J5IiwicHJlc2VudCIsIm5ld1Bhc3QiLCJuZXdGdXR1cmUiLCJjdXN0b21Ib29rcyIsImJlYXIiLCJ2aWV3IiwicHJvcFBhdGgiLCJleGlzdGluZ1Byb3BzIiwibWVyZ2VkUHJvcHMiLCJpbml0aWFsUGF0aHMiLCJjbG9uZSIsImRlZmF1bHRQcm9maWxlIiwiZGVmYXVsdFN0YXRlIiwic3RhdHVzTWFwcGVkIiwiY2JSZXNvdXJjZXMiLCJ0b3RhbFJlc291cmNlcyIsInVzZXIiLCJjb21iaW5lUmVkdWNlcnMiLCJhcGlSZXF1ZXN0cyIsImFjdGlvblBhdGgiLCJwcmVmaXhTdHIiLCJmcm9tRW50cmllcyIsIm1haW5SZWR1Y2VyIiwiZ2V0SW5wdXRIaXN0b3J5U3RhdGUiLCJyZWNvcmRDaGFuZ2VzIiwicmVmUHJvcHMiLCJoaXN0b3J5RW50cnkiLCJwcm9wS2V5IiwicmVjb3JkSGlzdG9yeSIsIm5leHRTdGF0ZSIsInJlbG9hZGVyUmVkdWNlciIsImV4cG9ydHMiLCJwYXJzZUNvb2tpZSIsInN0cmluZ2lmeUNvb2tpZSIsInN0cmluZ2lmeVNldENvb2tpZSIsInNlcmlhbGl6ZSIsInBhcnNlU2V0Q29va2llIiwiY29va2llTmFtZVJlZ0V4cCIsImNvb2tpZVZhbHVlUmVnRXhwIiwiZG9tYWluVmFsdWVSZWdFeHAiLCJwYXRoVmFsdWVSZWdFeHAiLCJtYXhBZ2VSZWdFeHAiLCJfX3RvU3RyaW5nIiwiTnVsbE9iamVjdCIsIkMiLCJzdHIiLCJsZW4iLCJkZWNvZGUiLCJlcUlkeCIsImVxSW5kZXgiLCJlbmRJZHgiLCJlbmRJbmRleCIsInZhbHVlU2xpY2UiLCJlbmMiLCJlbmNvZGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJjb29raWVTdHJpbmdzIiwiX3ZhbCIsIl9vcHRzIiwibWF4QWdlIiwiaXNJbnRlZ2VyIiwiZG9tYWluIiwiZXhwaXJlcyIsImlzRGF0ZSIsImlzRmluaXRlIiwidmFsdWVPZiIsInRvVVRDU3RyaW5nIiwiaHR0cE9ubHkiLCJzZWN1cmUiLCJwYXJ0aXRpb25lZCIsInNhbWVTaXRlIiwic2V0Q29va2llIiwiYXR0ciIsImRhdGUiLCJjaGFyQ29kZUF0IiwiZGVjb2RlVVJJQ29tcG9uZW50Iiwid2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJmYWN0b3J5IiwiZGVmaW5lIiwiYW1kIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTQwX18iLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwidGd0Iiwic3JjcyIsIl9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJzbGljZUl0ZXJhdG9yIiwiYXJyIiwiX2FyciIsIl9kIiwiX2UiLCJfcyIsIkxpbmtlZExpc3QiLCJsYXlvdXRCYXNlIiwiYXV4aWxpYXJ5IiwiZ2V0VG9wTW9zdE5vZGVzIiwibm9kZXNNYXAiLCJyb290cyIsImVsZSIsImNvbm5lY3RDb21wb25lbnRzIiwiZWxlcyIsInRvcE1vc3ROb2RlcyIsImR1bW15Tm9kZXMiLCJxdWV1ZSIsInZpc2l0ZWRUb3BNb3N0Tm9kZXMiLCJjdXJyZW50TmVpZ2hib3IiLCJtaW5EZWdyZWVOb2RlIiwibWluRGVncmVlIiwibm9kZXNDb25uZWN0ZWRUb0R1bW15IiwiY21wdCIsImN1cnJlbnROb2RlIiwiY2hpbGRyZW5PZkN1cnJlbnROb2RlIiwiZGVzY2VuZGFudHMiLCJzaGlmdCIsIm5laWdoYm9yTm9kZXMiLCJuZWlnaGJvcmhvb2QiLCJlZGdlc1dpdGgiLCJuZWlnaGJvck5vZGUiLCJ1bmlvbiIsImNoaWxkcmVuT2ZOZWlnaGJvciIsInNpemUiLCJyZWxvY2F0ZUNvbXBvbmVudCIsIm9yaWdpbmFsQ2VudGVyIiwiY29tcG9uZW50UmVzdWx0IiwiZml4ZWROb2RlQ29uc3RyYWludCIsIm1pblhDb29yZCIsIlBPU0lUSVZFX0lORklOSVRZIiwibWF4WENvb3JkIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJtaW5ZQ29vcmQiLCJtYXhZQ29vcmQiLCJxdWFsaXR5IiwiX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiIsIl9kaWRJdGVyYXRvckVycm9yIiwiX2l0ZXJhdG9yRXJyb3IiLCJub2RlSW5kZXhlcyIsImN5Tm9kZSIsIm5vZGVCQiIsImJvdW5kaW5nQm94IiwibGVmdFgiLCJ4Q29vcmRzIiwicmlnaHRYIiwidG9wWSIsInlDb29yZHMiLCJib3R0b21ZIiwiZGlmZk9uWCIsIngiLCJkaWZmT25ZIiwiZ2V0UmVjdCIsIl9kaWZmT25YIiwiX2RpZmZPblkiLCJzZXRDZW50ZXIiLCJnZXRDZW50ZXJYIiwiZ2V0Q2VudGVyWSIsImNhbGNCb3VuZGluZ0JveCIsInBhcmVudE5vZGUiLCJNQVhfU0FGRV9JTlRFR0VSIiwiTUlOX1NBRkVfSU5URUdFUiIsInRvcCIsImJvdHRvbSIsIm5vZGVMZWZ0Iiwibm9kZVJpZ2h0Iiwibm9kZVRvcCIsIm5vZGVCb3R0b20iLCJub3QiLCJ0b3BMZWZ0WCIsInRvcExlZnRZIiwiY2FsY1BhcmVudHNXaXRob3V0Q2hpbGRyZW4iLCJwYXJlbnRzV2l0aG91dENoaWxkcmVuIiwiY2hlY2siLCJjc3MiLCJhdXgiLCJDb1NFTGF5b3V0IiwiQ29TRU5vZGUiLCJQb2ludEQiLCJEaW1lbnNpb25EIiwiTGF5b3V0Q29uc3RhbnRzIiwiRkRMYXlvdXRDb25zdGFudHMiLCJDb1NFQ29uc3RhbnRzIiwiY29zZUxheW91dCIsInNwZWN0cmFsUmVzdWx0IiwiaWRUb0xOb2RlIiwicmFuZG9taXplIiwiaXNGbiIsIm9wdEZuIiwib3B0IiwicHJvY2Vzc0NoaWxkcmVuTGlzdCIsInRoZUNoaWxkIiwiY2hpbGRyZW5fb2ZfY2hpbGRyZW4iLCJ0aGVOb2RlIiwiZGltZW5zaW9ucyIsImxheW91dERpbWVuc2lvbnMiLCJub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHMiLCJvdXRlcldpZHRoIiwib3V0ZXJIZWlnaHQiLCJpc1BhcmVudCIsImdyYXBoTWFuYWdlciIsInBhcnNlRmxvYXQiLCJwYXJlbnRJbmZvIiwibm9kZVJlcHVsc2lvbiIsInBhZGRpbmdMZWZ0IiwicGFyc2VJbnQiLCJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsImxhYmVsV2lkdGgiLCJpbmNsdWRlTGFiZWxzIiwiaW5jbHVkZU5vZGVzIiwiaW5jbHVkZU92ZXJsYXlzIiwibGFiZWxIZWlnaHQiLCJsYWJlbFBvc1ZlcnRpY2FsIiwibGFiZWxQb3NIb3Jpem9udGFsIiwiaXNOYU4iLCJyZWN0IiwidGhlTmV3R3JhcGgiLCJnZXRHcmFwaE1hbmFnZXIiLCJuZXdHcmFwaCIsInByb2Nlc3NFZGdlcyIsImdtIiwiaWRlYWxMZW5ndGhUb3RhbCIsImVkZ2VDb3VudCIsImVkZ2UiLCJzb3VyY2VOb2RlIiwidGFyZ2V0Tm9kZSIsImdldEVkZ2VzQmV0d2VlbiIsImUxIiwibmV3RWRnZSIsImlkZWFsTGVuZ3RoIiwiaWRlYWxFZGdlTGVuZ3RoIiwiZWRnZUVsYXN0aWNpdHkiLCJERUZBVUxUX0VER0VfTEVOR1RIIiwiTUlOX1JFUFVMU0lPTl9ESVNUIiwiREVGQVVMVF9SQURJQUxfU0VQQVJBVElPTiIsInByb2Nlc3NDb25zdHJhaW50cyIsImNvbnN0cmFpbnRzIiwiYWxpZ25tZW50Q29uc3RyYWludCIsInJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCIsIm5lc3RpbmdGYWN0b3IiLCJQRVJfTEVWRUxfSURFQUxfRURHRV9MRU5HVEhfRkFDVE9SIiwiZ3Jhdml0eSIsIkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSCIsIm51bUl0ZXIiLCJNQVhfSVRFUkFUSU9OUyIsImdyYXZpdHlSYW5nZSIsIkRFRkFVTFRfR1JBVklUWV9SQU5HRV9GQUNUT1IiLCJncmF2aXR5Q29tcG91bmQiLCJERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfU1RSRU5HVEgiLCJncmF2aXR5UmFuZ2VDb21wb3VuZCIsIkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9SQU5HRV9GQUNUT1IiLCJpbml0aWFsRW5lcmd5T25JbmNyZW1lbnRhbCIsIkRFRkFVTFRfQ09PTElOR19GQUNUT1JfSU5DUkVNRU5UQUwiLCJ0aWxpbmdDb21wYXJlQnkiLCJUSUxJTkdfQ09NUEFSRV9CWSIsIlFVQUxJVFkiLCJOT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMiLCJERUZBVUxUX0lOQ1JFTUVOVEFMIiwiQU5JTUFURSIsIlRJTEUiLCJ0aWxlIiwiVElMSU5HX1BBRERJTkdfVkVSVElDQUwiLCJ0aWxpbmdQYWRkaW5nVmVydGljYWwiLCJUSUxJTkdfUEFERElOR19IT1JJWk9OVEFMIiwidGlsaW5nUGFkZGluZ0hvcml6b250YWwiLCJQVVJFX0lOQ1JFTUVOVEFMIiwiREVGQVVMVF9VTklGT1JNX0xFQUZfTk9ERV9TSVpFUyIsInVuaWZvcm1Ob2RlRGltZW5zaW9ucyIsInN0ZXAiLCJUUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyIsIkVORk9SQ0VfQ09OU1RSQUlOVFMiLCJBUFBMWV9MQVlPVVQiLCJUUkVFX1JFRFVDVElPTl9PTl9JTkNSRU1FTlRBTCIsIm5ld0dyYXBoTWFuYWdlciIsImFkZFJvb3QiLCJydW5MYXlvdXQiLCJfY3JlYXRlQ2xhc3MiLCJkZXNjcmlwdG9yIiwiQ29uc3RydWN0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIl9yZXF1aXJlIiwic3BlY3RyYWxMYXlvdXQiLCJfcmVxdWlyZTIiLCJkZWZhdWx0cyIsImZyZWV6ZSIsImFuaW1hdGlvbkR1cmF0aW9uIiwiYW5pbWF0aW9uRWFzaW5nIiwicGFja0NvbXBvbmVudHMiLCJzYW1wbGluZ1R5cGUiLCJzYW1wbGVTaXplIiwibm9kZVNlcGFyYXRpb24iLCJwaVRvbCIsInN0b3AiLCJMYXlvdXQiLCJydW4iLCJjb3NlUmVzdWx0IiwiY29tcG9uZW50Q2VudGVycyIsInZlcnRpY2FsIiwiaG9yaXpvbnRhbCIsImNvbnN0cmFpbnRFeGlzdCIsImxheVV0aWwiLCJwYWNraW5nRW5hYmxlZCIsImxheW91dFV0aWxpdGllcyIsIngxIiwieTEiLCJ0b0JlVGlsZWROb2RlcyIsIl94Q29vcmRzIiwiX3lDb29yZHMiLCJ0ZW1wU3BlY3RyYWxSZXN1bHQiLCJpbmRleGVzVG9CZURlbGV0ZWQiLCJfYm91bmRpbmdCb3giLCJjb21wb25lbnRzRXZhbHVhdGVkIiwic3ViZ3JhcGhzIiwiaGlkZGVuRWxlcyIsInN1YmdyYXBoIiwibm9kZUluZGV4IiwiYm91bmRpbmdib3giLCJnZXRMZWZ0IiwiZ2V0VG9wIiwiZ2V0V2lkdGgiLCJnZXRIZWlnaHQiLCJzb3VyY2VOb2RlSW5kZXgiLCJ0YXJnZXROb2RlSW5kZXgiLCJzb3VyY2VDZW50ZXIiLCJ0YXJnZXRDZW50ZXIiLCJfcGFyZW50SW5mbyIsInN0YXJ0WCIsInN0YXJ0WSIsImVuZFgiLCJlbmRZIiwic2hpZnRSZXN1bHQiLCJzaGlmdHMiLCJuZXdYQ29vcmRzIiwiZHgiLCJuZXdZQ29vcmRzIiwiZHkiLCJfY291bnQiLCJub2RlUmVjdGFuZ2xlIiwiZ2V0UG9zaXRpb25zIiwicG9zIiwidGhlSWQiLCJfcG9zIiwiX2hpZGRlbkVsZXMiLCJsYXlvdXRQb3NpdGlvbnMiLCJNYXRyaXgiLCJTVkQiLCJwYXJlbnROb2RlcyIsInBhcmVudENoaWxkTWFwIiwiYWxsTm9kZXNOZWlnaGJvcmhvb2QiLCJzYW1wbGVzQ29sdW1uIiwibWluRGlzdGFuY2VzQ29sdW1uIiwiUEhJIiwiSU5WIiwiZmlyc3RTYW1wbGUiLCJub2RlU2l6ZSIsImluZmluaXR5Iiwic21hbGwiLCJyYW5kb21TYW1wbGVDUiIsInNhbXBsZSIsImZsYWciLCJmbG9vciIsIkJGUyIsInBpdm90Iiwic2FtcGxpbmdNZXRob2QiLCJkaXN0YW5jZSIsIm1heF9kaXN0IiwibWF4X2luZCIsIm5laWdoYm9ycyIsIl9pMiIsIl9pMyIsImFsbEJGUyIsIl9pNCIsIl9pNSIsIl9pNiIsIl9pNyIsIl9pOCIsIl9qIiwiU1ZEUmVzdWx0Iiwic3ZkIiwiYV9xIiwiUyIsImFfdSIsIlUiLCJhX3YiLCJWIiwibWF4X3MiLCJhX1NpZyIsIm11bHRNYXQiLCJ0cmFuc3Bvc2UiLCJwb3dlckl0ZXJhdGlvbiIsInRoZXRhMSIsInRoZXRhMiIsIlkxIiwiWTIiLCJWMSIsIlYyIiwibm9ybWFsaXplIiwiX2k5IiwibXVsdEdhbW1hIiwibXVsdEwiLCJkb3RQcm9kdWN0IiwiYWJzIiwiX2kxMCIsIl9pMTEiLCJtaW51c09wIiwibXVsdENvbnMiLCJfaTEyIiwic3FydCIsIl9pMTMiLCJlbGUyIiwiZWxlSW5kZXgiLCJkaXNjb25uZWN0ZWRJZCIsIl9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yIiwiX2RpZEl0ZXJhdG9yRXJyb3IyIiwiX2l0ZXJhdG9yRXJyb3IyIiwiX2kxNCIsIl9pMTUiLCJmaXJzdE5vZGVQb3MiLCJmaXJzdE5vZGVXaWR0aCIsInNlY29uZE5vZGUiLCJzZWNvbmROb2RlV2lkdGgiLCJpbXBsIiwicmVnaXN0ZXIiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19leHBvcnRzX18iLCJvbmVPZlR5cGUiLCJwYW5uaW5nRW5hYmxlZCIsInVzZXJQYW5uaW5nRW5hYmxlZCIsIm1pblpvb20iLCJtYXhab29tIiwiem9vbWluZ0VuYWJsZWQiLCJ1c2VyWm9vbWluZ0VuYWJsZWQiLCJib3hTZWxlY3Rpb25FbmFibGVkIiwiYXV0b3VuZ3JhYmlmeSIsImF1dG9sb2NrIiwiYXV0b3Vuc2VsZWN0aWZ5IiwidG9Kc29uIiwiaGVhZGxlc3MiLCJzdHlsZUVuYWJsZWQiLCJoaWRlRWRnZXNPblZpZXdwb3J0IiwidGV4dHVyZU9uVmlld3BvcnQiLCJtb3Rpb25CbHVyIiwibW90aW9uQmx1ck9wYWNpdHkiLCJ3aGVlbFNlbnNpdGl2aXR5IiwicGl4ZWxSYXRpbyIsInNoYWxsb3dPYmpEaWZmIiwiaXNEaWZmQXRLZXkiLCJFIiwiZyIsInBhdGNoSnNvbiIsInZhbDIiLCJmcm9tSnNvbiIsImVsZTEiLCJPIiwic2NyYXRjaCIsIm5vcm1hbGl6ZUVsZW1lbnRzIiwic3RhdGljIiwiY29udGFpbmVyUmVmIiwiY3JlYXRlUmVmIiwiZ2xvYmFsIiwiX2N5IiwidXBkYXRlQ3l0b3NjYXBlIiwiZGVzdHJveSIsIl90aGlzJHByb3BzMiIsImRlZmF1bHQiLCJSZWFjdFJlZHV4Q29udGV4dCIsImNyZWF0ZVN1YnNjcmlwdGlvbiIsInVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QiLCJjb250ZXh0Iiwic2VydmVyU3RhdGUiLCJjb250ZXh0VmFsdWUiLCJzdWJzY3JpcHRpb24iLCJnZXRTZXJ2ZXJTdGF0ZSIsInByZXZpb3VzU3RhdGUiLCJvblN0YXRlQ2hhbmdlIiwibm90aWZ5TmVzdGVkU3VicyIsInRyeVN1YnNjcmliZSIsInRyeVVuc3Vic2NyaWJlIiwiQ29udGV4dCIsIl9leHRlbmRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UiLCJob2lzdFN0YXRpY3MiLCJpc1ZhbGlkRWxlbWVudFR5cGUiLCJpc0NvbnRleHRDb25zdW1lciIsImRlZmF1bHRTZWxlY3RvckZhY3RvcnkiLCJtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3J5IiwibWFwU3RhdGVUb1Byb3BzRmFjdG9yeSIsIm1lcmdlUHJvcHNGYWN0b3J5Iiwic2hhbGxvd0VxdWFsIiwid2FybmluZyIsIm5vdEluaXRpYWxpemVkIiwidXNlU3luY0V4dGVybmFsU3RvcmUiLCJpbml0aWFsaXplQ29ubmVjdCIsIkVNUFRZX0FSUkFZIiwiTk9fU1VCU0NSSVBUSU9OX0FSUkFZIiwic3RyaW5naWZ5Q29tcG9uZW50IiwiQ29tcCIsInVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3RXaXRoQXJncyIsImVmZmVjdEZ1bmMiLCJlZmZlY3RBcmdzIiwiY2FwdHVyZVdyYXBwZXJQcm9wcyIsImxhc3RXcmFwcGVyUHJvcHMiLCJsYXN0Q2hpbGRQcm9wcyIsInJlbmRlcklzU2NoZWR1bGVkIiwid3JhcHBlclByb3BzIiwiY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSIsInN1YnNjcmliZVVwZGF0ZXMiLCJzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMiLCJjaGlsZFByb3BzU2VsZWN0b3IiLCJpc01vdW50ZWQiLCJhZGRpdGlvbmFsU3Vic2NyaWJlTGlzdGVuZXIiLCJkaWRVbnN1YnNjcmliZSIsImxhc3RUaHJvd25FcnJvciIsImNoZWNrRm9yVXBkYXRlcyIsImxhdGVzdFN0b3JlU3RhdGUiLCJuZXdDaGlsZFByb3BzIiwidW5zdWJzY3JpYmVXcmFwcGVyIiwiaW5pdFN0YXRlVXBkYXRlcyIsInN0cmljdEVxdWFsIiwiaGFzV2FybmVkQWJvdXREZXByZWNhdGVkUHVyZU9wdGlvbiIsIm1hcFN0YXRlVG9Qcm9wcyIsIm1hcERpc3BhdGNoVG9Qcm9wcyIsIm1lcmdlUHJvcHMiLCJwdXJlIiwiX3JlZiRhcmVTdGF0ZXNFcXVhbCIsImFyZVN0YXRlc0VxdWFsIiwiX3JlZiRhcmVPd25Qcm9wc0VxdWFsIiwiYXJlT3duUHJvcHNFcXVhbCIsIl9yZWYkYXJlU3RhdGVQcm9wc0VxdSIsImFyZVN0YXRlUHJvcHNFcXVhbCIsIl9yZWYkYXJlTWVyZ2VkUHJvcHNFcSIsImFyZU1lcmdlZFByb3BzRXF1YWwiLCJfcmVmJGZvcndhcmRSZWYiLCJmb3J3YXJkUmVmIiwiX3JlZiRjb250ZXh0IiwiaW5pdE1hcFN0YXRlVG9Qcm9wcyIsImluaXRNYXBEaXNwYXRjaFRvUHJvcHMiLCJpbml0TWVyZ2VQcm9wcyIsIndyYXBXaXRoQ29ubmVjdCIsIldyYXBwZWRDb21wb25lbnQiLCJ3cmFwcGVkQ29tcG9uZW50TmFtZSIsInNlbGVjdG9yRmFjdG9yeU9wdGlvbnMiLCJDb25uZWN0RnVuY3Rpb24iLCJfdXNlTWVtbyIsInJlYWN0UmVkdXhGb3J3YXJkZWRSZWYiLCJfdXNlTWVtbzIiLCJwcm9wc0NvbnRleHQiLCJDb250ZXh0VG9Vc2UiLCJDb25zdW1lciIsImRpZFN0b3JlQ29tZUZyb21Qcm9wcyIsImRpZFN0b3JlQ29tZUZyb21Db250ZXh0IiwiX3VzZU1lbW8zIiwiX3VzZU1lbW80Iiwib3ZlcnJpZGRlbkNvbnRleHRWYWx1ZSIsImlzUHJvY2Vzc2luZ0Rpc3BhdGNoIiwibGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvciIsImFjdHVhbENoaWxkUHJvcHNTZWxlY3RvciIsInN1YnNjcmliZUZvclJlYWN0IiwicmVhY3RMaXN0ZW5lciIsImFjdHVhbENoaWxkUHJvcHMiLCJyZW5kZXJlZFdyYXBwZWRDb21wb25lbnQiLCJyZW5kZXJlZENoaWxkIiwiX0Nvbm5lY3QiLCJtZW1vIiwiQ29ubmVjdCIsIl9mb3J3YXJkZWQiLCJmb3J3YXJkQ29ubmVjdFJlZiIsImZvcndhcmRlZCIsImNyZWF0ZUludmFsaWRBcmdGYWN0b3J5IiwiYmluZEFjdGlvbkNyZWF0b3JzIiwid3JhcE1hcFRvUHJvcHNDb25zdGFudCIsIndyYXBNYXBUb1Byb3BzRnVuYyIsInZlcmlmeVBsYWluT2JqZWN0IiwiZGVmYXVsdE1lcmdlUHJvcHMiLCJzdGF0ZVByb3BzIiwiZGlzcGF0Y2hQcm9wcyIsIm93blByb3BzIiwid3JhcE1lcmdlUHJvcHNGdW5jIiwiaW5pdE1lcmdlUHJvcHNQcm94eSIsImhhc1J1bk9uY2UiLCJtZXJnZVByb3BzUHJveHkiLCJuZXh0TWVyZ2VkUHJvcHMiLCJ2ZXJpZnlTdWJzZWxlY3RvcnMiLCJwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeSIsImhhc1J1bkF0TGVhc3RPbmNlIiwiaGFuZGxlRmlyc3RDYWxsIiwiZmlyc3RTdGF0ZSIsImZpcnN0T3duUHJvcHMiLCJoYW5kbGVOZXdQcm9wc0FuZE5ld1N0YXRlIiwiZGVwZW5kc09uT3duUHJvcHMiLCJoYW5kbGVOZXdQcm9wcyIsImhhbmRsZU5ld1N0YXRlIiwibmV4dFN0YXRlUHJvcHMiLCJzdGF0ZVByb3BzQ2hhbmdlZCIsImhhbmRsZVN1YnNlcXVlbnRDYWxscyIsIm5leHRPd25Qcm9wcyIsInByb3BzQ2hhbmdlZCIsInN0YXRlQ2hhbmdlZCIsInB1cmVGaW5hbFByb3BzU2VsZWN0b3IiLCJmaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5IiwidmVyaWZ5IiwibWV0aG9kTmFtZSIsImdldENvbnN0YW50IiwiaW5pdENvbnN0YW50U2VsZWN0b3IiLCJjb25zdGFudCIsImNvbnN0YW50U2VsZWN0b3IiLCJnZXREZXBlbmRzT25Pd25Qcm9wcyIsIm1hcFRvUHJvcHMiLCJpbml0UHJveHlTZWxlY3RvciIsInByb3h5IiwibWFwVG9Qcm9wc1Byb3h5Iiwic3RhdGVPckRpc3BhdGNoIiwiZGV0ZWN0RmFjdG9yeUFuZFZlcmlmeSIsImNyZWF0ZURpc3BhdGNoSG9vayIsImNyZWF0ZVNlbGVjdG9ySG9vayIsImNyZWF0ZVN0b3JlSG9vayIsInVzZURlZmF1bHRTdG9yZSIsInVzZVJlZHV4Q29udGV4dCIsInVzZURlYnVnVmFsdWUiLCJ1c2VEZWZhdWx0UmVkdXhDb250ZXh0IiwidXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IiLCJpbml0aWFsaXplVXNlU2VsZWN0b3IiLCJyZWZFcXVhbGl0eSIsImVxdWFsaXR5Rm4iLCJfdXNlUmVkdXhDb250ZXh0Iiwic2VsZWN0ZWRTdGF0ZSIsImFkZE5lc3RlZFN1YiIsInVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIiwic2V0QmF0Y2giLCJnZXRCYXRjaCIsImNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbiIsImZpcnN0IiwibGlzdGVuZXJzIiwiaXNTdWJzY3JpYmVkIiwidW5zdWJzY3JpYmUiLCJudWxsTGlzdGVuZXJzIiwicGFyZW50U3ViIiwiaGFuZGxlQ2hhbmdlV3JhcHBlciIsImdldExpc3RlbmVycyIsImRlZmF1bHROb29wQmF0Y2giLCJuZXdCYXRjaCIsImFjdGlvbkNyZWF0b3JzIiwiYm91bmRBY3Rpb25DcmVhdG9ycyIsImFjdGlvbkNyZWF0b3IiLCJpc1BsYWluT2JqZWN0IiwicHJvdG8iLCJiYXNlUHJvdG8iLCJvYmpBIiwib2JqQiIsImtleXNBIiwia2V5c0IiLCJ1c2VMYXlvdXRFZmZlY3QiLCJjYW5Vc2VET00iLCJSRUFDVF9FTEVNRU5UX1RZUEUiLCJmb3IiLCJSRUFDVF9QT1JUQUxfVFlQRSIsIlJFQUNUX0ZSQUdNRU5UX1RZUEUiLCJSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIiwiUkVBQ1RfUFJPRklMRVJfVFlQRSIsIlJFQUNUX1BST1ZJREVSX1RZUEUiLCJSRUFDVF9DT05URVhUX1RZUEUiLCJSRUFDVF9TRVJWRVJfQ09OVEVYVF9UWVBFIiwiUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSIsIlJFQUNUX1NVU1BFTlNFX1RZUEUiLCJSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUiLCJSRUFDVF9NRU1PX1RZUEUiLCJSRUFDVF9MQVpZX1RZUEUiLCJSRUFDVF9PRkZTQ1JFRU5fVFlQRSIsImVuYWJsZVNjb3BlQVBJIiwiZW5hYmxlQ2FjaGVFbGVtZW50IiwiZW5hYmxlVHJhbnNpdGlvblRyYWNpbmciLCJlbmFibGVMZWdhY3lIaWRkZW4iLCJlbmFibGVEZWJ1Z1RyYWNpbmciLCJSRUFDVF9NT0RVTEVfUkVGRVJFTkNFIiwiJCR0eXBlb2YiLCJnZXRNb2R1bGVJZCIsInR5cGVPZiIsIiQkdHlwZW9mVHlwZSIsIkNvbnRleHRDb25zdW1lciIsIkNvbnRleHRQcm92aWRlciIsIkVsZW1lbnQiLCJGb3J3YXJkUmVmIiwiTGF6eSIsIk1lbW8iLCJQb3J0YWwiLCJQcm9maWxlciIsIlN0cmljdE1vZGUiLCJTdXNwZW5zZSIsIlN1c3BlbnNlTGlzdCIsImhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlIiwiaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSIsImlzQXN5bmNNb2RlIiwiaXNDb25jdXJyZW50TW9kZSIsImlzQ29udGV4dFByb3ZpZGVyIiwiaXNFbGVtZW50IiwiaXNGb3J3YXJkUmVmIiwiaXNGcmFnbWVudCIsImlzTGF6eSIsImlzTWVtbyIsImlzUG9ydGFsIiwiaXNQcm9maWxlciIsImlzU3RyaWN0TW9kZSIsImlzU3VzcGVuc2UiLCJpc1N1c3BlbnNlTGlzdCIsIl9jdXJyeTIiLCJfZGlzcGF0Y2hhYmxlIiwiX3hhbGwiLCJsaXN0IiwiX2N1cnJ5MSIsImFsd2F5cyIsIl94YW55IiwiX2NvbmNhdCIsIl9yZWR1Y2UiLCJhcHBseUYiLCJhcHBseVgiLCJfY3VycnkzIiwiX2hhcyIsIl9pc0ludGVnZXIiLCJfYXNzb2MiLCJuZXh0T2JqIiwiX2FyaXR5IiwidGhpc09iaiIsIl9jbG9uZSIsInByZWQiLCJfaXNBcnJheSIsIl9pc0Z1bmN0aW9uIiwiX2lzU3RyaW5nIiwiX21hcCIsImN1cnJ5TiIsImNvbnZlcmdlIiwiYWZ0ZXIiLCJmbnMiLCJfY3VycnlOIiwiZGVmYXVsdFRvIiwiX1NldCIsInNlY29uZCIsImZpcnN0TGVuIiwic2Vjb25kTGVuIiwidG9GaWx0ZXJPdXQiLCJfZGlzc29jIiwiX3NoYWxsb3dDbG9uZU9iamVjdCIsIl9pc0FyZ3VtZW50cyIsIl9pc09iamVjdCIsIl9pc1R5cGVkQXJyYXkiLCJfZXF1YWxzIiwidHJhbnNmb3JtYXRpb25zIiwidHJhbnNmb3JtYXRpb24iLCJfYXJyYXlSZWR1Y2UiLCJfZmlsdGVyIiwiX3hmaWx0ZXIiLCJmaWx0ZXJhYmxlIiwiX3hmaW5kIiwiX3hmaW5kSW5kZXgiLCJfbWFrZUZsYXQiLCJfY2hlY2tGb3JNZXRob2QiLCJrZXlMaXN0IiwicmVkdWNlQnkiLCJoYXNQYXRoIiwiX3BhdGgiLCJfaWRlbnRpdHkiLCJfaW5jbHVkZXMiLCJfaW5kZXhPZiIsInhzIiwiZWx0IiwiX25hdGl2ZVNldCIsIl9pdGVtcyIsImhhc09yQWRkIiwic2hvdWxkQWRkIiwicHJldlNpemUiLCJuZXdTaXplIiwiSW5maW5pdHkiLCJiSWR4IiwiYTAiLCJhMSIsImEyIiwiYTMiLCJhNCIsImE1IiwiYTYiLCJhNyIsImE4IiwiYTkiLCJfYXJyYXlGcm9tSXRlcmF0b3IiLCJpdGVyIiwibWV0aG9kbmFtZSIsIl9jbG9uZVJlZ0V4cCIsImRlZXAiLCJfT2JqZWN0TWFwIiwiX2lzUHJpbWl0aXZlIiwiY29weSIsImNvcGllZFZhbHVlIiwiY2FjaGVkQ29weSIsInBhcmFtIiwiaGFzaGVkS2V5IiwiYnVja2V0IiwiUmVnRXhwIiwiZmxhZ3MiLCJpZ25vcmVDYXNlIiwibXVsdGlsaW5lIiwic3RpY2t5IiwidW5pY29kZSIsImRvdEFsbCIsIl9jb21wbGVtZW50Iiwic2V0MSIsInNldDIiLCJsZW4xIiwibGVuMiIsIl9pc0FycmF5TGlrZSIsInN5bUl0ZXJhdG9yIiwiX2NyZWF0ZVJlZHVjZSIsImFycmF5UmVkdWNlIiwibWV0aG9kUmVkdWNlIiwiaXRlcmFibGVSZWR1Y2UiLCJ4ZiIsIl9pc1BsYWNlaG9sZGVyIiwiZjEiLCJmMiIsIl9iIiwiX2EiLCJmMyIsIl9jIiwicmVjZWl2ZWQiLCJjb21iaW5lZCIsImFyZ3NJZHgiLCJjb21iaW5lZElkeCIsImhhc1BsYWNlaG9sZGVyIiwiX2lzVHJhbnNmb3JtZXIiLCJtZXRob2ROYW1lcyIsInRyYW5zZHVjZXJDcmVhdG9yIiwidHJhbnNkdWNlciIsIl9pbmNsdWRlc1dpdGgiLCJfZnVuY3Rpb25OYW1lIiwiX29iamVjdElzIiwiX3VuaXFDb250ZW50RXF1YWxzIiwiYUl0ZXJhdG9yIiwiYkl0ZXJhdG9yIiwic3RhY2tBIiwic3RhY2tCIiwiZXEiLCJhSXRlbSIsInR5cGVBIiwiZXh0ZW5kZWRTdGFja0EiLCJleHRlbmRlZFN0YWNrQiIsImluZiIsImlzQXJyYXlMaWtlIiwicmVjdXJzaXZlIiwiZmxhdHQiLCJqbGVuIiwiaWxlbiIsImZ1bmN0b3IiLCJfbnRoIiwib2Zmc2V0IiwiX29iamVjdEFzc2lnbiIsIm5leHRLZXkiLCJwYXRoQXIiLCJfcXVvdGUiLCJlc2NhcGVkIiwiX2l0ZXJhYmxlUmVkdWNlIiwiX21ldGhvZFJlZHVjZSIsIl9yZWR1Y2VkIiwicGFkIiwiX3RvSVNPU3RyaW5nIiwidG9JU09TdHJpbmciLCJnZXRVVENGdWxsWWVhciIsImdldFVUQ01vbnRoIiwiZ2V0VVRDRGF0ZSIsImdldFVUQ0hvdXJzIiwiZ2V0VVRDTWludXRlcyIsImdldFVUQ1NlY29uZHMiLCJnZXRVVENNaWxsaXNlY29uZHMiLCJfdG9TdHJpbmciLCJzZWVuIiwicmVjdXIiLCJtYXBQYWlycyIsIk5hTiIsInJlcHIiLCJfeEFycmF5UmVkdWNlIiwiX3hJdGVyYWJsZVJlZHVjZSIsIl94TWV0aG9kUmVkdWNlIiwiX3hSZWR1Y2UiLCJfeGZCYXNlIiwiWEFsbCIsImluaXQiLCJYQW55IiwiWEZpbHRlciIsIlhGaW5kIiwiWEZpbmRJbmRleCIsIlhNYXAiLCJfeG1hcCIsIlhSZWR1Y2VCeSIsInZhbHVlRm4iLCJ2YWx1ZUFjYyIsImtleUZuIiwiX3hyZWR1Y2VCeSIsIlhUYWtlIiwicmV0IiwiX3h0YWtlIiwiWFVuaXFCeSIsIl94dW5pcUJ5IiwiWFdyYXAiLCJfeHdyYXAiLCJ1bmlxIiwibGlzdDEiLCJsaXN0MiIsInRvS2VlcCIsImludm9rZXIiLCJhcml0eSIsIkN0b3IiLCJqdXh0IiwiaGFzRW51bUJ1ZyIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwibm9uRW51bWVyYWJsZVByb3BzIiwiaGFzQXJnc0VudW1CdWciLCJjb250YWlucyIsIm5JZHgiLCJrcyIsImNoZWNrQXJnc0xlbmd0aCIsImxlbnMiLCJzZXR0ZXIiLCJ0b0Z1bmN0b3JGbiIsImZvY3VzIiwic2FmZU1heCIsIm1heEJ5VmFsdWUiLCJtYXhCeVR5cGUiLCJzdHJpbmdBIiwibWF4QnlTdHJpbmdWYWx1ZSIsImtleUdlbiIsImNhY2hlIiwibWVyZ2VEZWVwV2l0aEtleSIsImxPYmoiLCJyT2JqIiwibFZhbCIsInJWYWwiLCJtZXJnZVdpdGhLZXkiLCJfbCIsIl9yIiwibmFtZXMiLCJjYWxsZWQiLCJJZGVudGl0eSIsIm92ZXIiLCJwcyIsImZyb21JbmRleCIsInRvSW5kZXgiLCJ0YWtlIiwicGFpcnMiLCJ1bmlxQnkiLCJhcHBsaWVkSXRlbSIsIkNvbnN0IiwiZmFudGFzeUxhbmRfbWFwIiwicnYiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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a0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7O0FDdkJhOztBQUViLGtCQUFrQjtBQUNsQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7Ozs7Ozs7QUN2QmE7O0FBRWIsa0JBQWtCO0FBQ2xCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DOzs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYixrQkFBa0I7QUFDbEIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7QUN2QkE7QUFDQSxrQkFBa0IsbUJBQU8sQ0FBQyxzREFBWTs7QUFFdEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLFFBQVEsNEJBQTRCO0FBQ3BDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sNkJBQTZCO0FBQ3BDLFdBQVcsaUNBQWlDO0FBQzVDLFVBQVUsZ0NBQWdDO0FBQzFDLFdBQVcsaUNBQWlDO0FBQzVDLE9BQU8scUNBQXFDO0FBQzVDLFNBQVMsMkNBQTJDO0FBQ3BELFFBQVE7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxnQkFBZ0I7QUFDckUsbURBQW1ELGNBQWM7QUFDakU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTyxRQUFRO0FBQ2hDLGlCQUFpQixPQUFPLFFBQVE7QUFDaEMsa0JBQWtCLE9BQU8sT0FBTztBQUNoQyxrQkFBa0IsT0FBTyxPQUFPO0FBQ2hDLGlCQUFpQixRQUFRLE9BQU87QUFDaEMsaUJBQWlCLFFBQVEsT0FBTztBQUNoQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUU7O0FBRXZFOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0MsRUFBRSxVQUFVLEVBQUU7QUFDN0Q7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVB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QUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0VBQXNFLG1DQUFtQzs7QUFFekc7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7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QTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQSwwSEFBMEg7QUFDMUgsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1LQUFtSztBQUNuSztBQUNBOztBQUVBO0FBQ0E7O0FB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S0FBSyxVQUFVLFVBQVUsVUFBVSxNQUFNLEtBQUssT0FBTyxPQUFPLFdBQVcsS0FBSyxLQUFLLFlBQVksYUFBYSxNQUFNLEtBQUssWUFBWSxXQUFXLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxXQUFXLE9BQU8sS0FBSyxZQUFZLGFBQWEsWUFBWSxZQUFZLGFBQWEsV0FBVyxVQUFVLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxXQUFXLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxhQUFhLFdBQVcsWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxZQUFZLGFBQWEsV0FBVyxZQUFZLGFBQWEsV0FBVyxLQUFLLEtBQUssWUFBWSxXQUFXLFVBQVUsVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsV0FBVyxNQUFNLEtBQUssVUFBVSxVQUFVLFlBQVksYUFBYSxhQUFhLFdBQVcsWUFBWSxPQUFPLE9BQU8sT0FBTyxLQUFLLFVBQVUsVUFBVSxVQUFVLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sS0FBSyxVQUFVLE9BQU8sS0FBSyxVQUFVLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLFdBQVcsWUFBWSxhQUFhLFdBQVcsVUFBVSxPQUFPLEtBQUssS0FBSyxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxLQUFLLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLDJDQUEy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QUFLLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxXQUFXLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE9BQU8sT0FBTyxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUFXLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksT0FBTyxLQUFLLFlBQVksV0FBVyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxVQUFVLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxXQUFXLFlBQVksYUFBYSxXQUFXLFlBQVksV0FBVyxZQUFZLE1BQU0sT0FBTyxhQUFhLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsV0FBVyxZQUFZLFdBQVcsT0FBTyxLQUFLLFVBQVUsWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssVUFBVSxVQUFVLFlBQVksYUFBYSxhQUFhLFdBQVcsVUFBVSxLQUFLLEtBQUssVUFBVSxZQUFZLFdBQVcsTUFBTSxLQUFLLFVBQVUsWUFBWSxhQUFhLGFBQWEsV0FBVyxPQUFPLEtBQUssWUFBWSxXQUFXLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksV0FBVyxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUFXLE9BQU8sS0FBSyxVQUFVLFlBQVksTUFBTSxLQUFLLFVBQVUsT0FBTyxLQUFLLFVBQVUsWUFBWSxXQUFXLE9BQU8sS0FBSyxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxLQUFLLE9BQU8sYUFBYSxhQUFhLFdBQVcsWUFBWSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksYUFBYSxh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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1B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QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLGNBQWM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FB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O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxR0FBcUc7QUFDckc7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLG9CQUFvQixrQkFBa0I7QUFDdEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0IsT0FBTztBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixVQUFVO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQSxpQ0FBaUMsZ0NBQW1COztBQUVwRDs7O0FBR0E7QUFDQSxZQUFZLGdDQUFtQjs7QUFFL0I7QUFDQSxXQUFXLGdDQUFtQixLQUFLO0FBQ25DOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsbUJBQW1CO0FBQ3ZDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsMEJBQTBCO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLE9BQU87QUFDUDtBQUNBLGlDQUFpQyxnQ0FBbUI7O0FBRXBEOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsWUFBWSxnQ0FBbUI7O0FBRS9COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7O0FBR0Es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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbURBQW1EOztBQUVuRDtBQUNBLDhDQUE4Qzs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQyxzRUFBc0U7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxrRUFBa0U7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGNBQWMsT0FBTzs7QUFFckI7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsR0FBRztBQUNkLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxpQkFBaUI7QUFDNUIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsR0FBRztBQUNkLFdBQVcsT0FBTztBQUNsQjtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEI7QUFDQSxXQUFXLE9BQU87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LGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsc0hBQXNILHFCQUFNLG1CQUFtQixxQkFBTTs7QUFFcko7QUFDQSxtQkFBbUIsYUFBYTtBQUNoQzs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRLFdBQVc7QUFDOUIsV0FBVyxTQUFTO0FBQ3BCO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsK0NBQStDLGlCQUFpQjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBDQUEwQztBQUMxQyw0Q0FBNEM7O0FBRTVDO0FBQ0E7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QSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLHNDQUFzQyxPQUFPO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLHdCQUF3QixzQkFBc0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDRCQUE0QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELG1DQUFtQywwQkFBMEI7QUFDcEg7QUFDQSxLQUFLO0FBQ0w7QUFDQSxzQ0FBc0MsV0FBVztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLFdBQVc7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxXQUFXO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0Msc0NBQXNDO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FB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QTs7QUFFQTtBQUNBLG1CQUFtQixhQUFhO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLEdBQUc7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxHQUFHO0FBQ2QsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsVUFBVTtBQUNyQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsV0FBVyxRQUFRO0FBQ25CLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxlQUFlO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxjQUFjO0FBQ3pCLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsR0FBRztBQUNkLGFBQWEsR0FBRztBQUNoQjtBQUNBO0FBQ0Esa0JBQWtCLFFBQVEsT0FBTyxVQUFVO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsSUFBSTtBQUNKLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxHQUFHO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsR0FBRztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsY0FBYztBQUN6QixXQUFXLEdBQUc7QUFDZCxXQUFXLFVBQVU7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsR0FBRztBQUNkLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0Esa0JBQWtCLFFBQVEsT0FBTyxVQUFVO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDLGlEQUFpRDtBQUNqRCxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBLDRDQUE0QyxPQUFPO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixjQUFjO0FBQ2pDLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGtCQUFrQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixnQkFBZ0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkIsS0FBSztBQUNsQyxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkIsT0FBTztBQUNQLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7O0FBRUEsc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlEOztBQUVqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLE9BQU87QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBLGdEQUFnRCxXQUFXO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTtBQUNSOztBQUVBLDhDQUE4QyxhQUFhO0FBQzNEO0FBQ0E7QUFDQSw0QkFBNEIsb0JBQW9CO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkIsT0FBTztBQUNQLElBQUk7QUFDSixHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNCQUFzQixxQkFBcUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7O0FBRXRCLHNDQUFzQyxRQUFRO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixvQkFBb0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtEQUErRCw4QkFBOEIsTUFBTTtBQUNuRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFO0FBQ2xFLGtFQUFrRTtBQUNsRSxvREFBb0Q7QUFDcEQsNkJBQTZCOztBQUU3QjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjLGdCQUFnQjtBQUM5QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWMsZ0JBQWdCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxlQUFlLE1BQU07QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDJCQUEyQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiwyQkFBMkI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixrQkFBa0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixnQkFBZ0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixRQUFRO0FBQ1I7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLE1BQU07O0FBRU47QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDOztBQUVsQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDOztBQUVyQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGlCQUFpQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsa0JBQWtCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsSUFBSTs7QUFFTCwwQkFBMEI7O0FBRTFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsd0JBQXdCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHdCQUF3QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG9FQUFvRTtBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQzs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFFBQVE7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFDQUFxQyxRQUFRO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGdCQUFnQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Es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O0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELGNBQWM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLCtCQUErQjtBQUMvQixNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxrQkFBa0IsNkJBQTZCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUcsSUFBSTtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxtQkFBbUIsbUJBQW1CO0FBQ3RDO0FBQ0EsNkJBQTZCO0FBQzdCOztBQUVBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMLGlCQUFpQjtBQUNqQixHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLDBEQUEwRDtBQUMxRCxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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QyxtQkFBbUI7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IseUJBQXlCO0FBQzNDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdDQUFnQztBQUNsRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0EsMEJBQTBCLGNBQWM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxpQkFBaUIsS0FBSztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FB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Q0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEZBQTRGO0FBQzVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBLDJFQUEyRTtBQUMzRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUIseUJBQXlCO0FBQ3pCLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxzQ0FBc0M7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixlQUFlO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGFBQWE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0U7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDJCQUEyQjtBQUMvQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsMEJBQTBCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDRCQUE0QjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsVUFBVTs7QUFFVixZQUFZO0FBQ1osWUFBWTs7QUFFWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKLDRCQUE0QjtBQUM1QixJQUFJO0FBQ0o7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKLDRCQUE0QjtBQUM1QixJQUFJO0FBQ0o7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDZCQUE2QjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDBCQUEwQjtBQUM5QztBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0Esb0JBQW9CLDBCQUEwQjtBQUM5QztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RCxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47O0FBRUE7QUFDQSxvQkFBb0IsMEJBQTBCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixxQkFBcUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RTs7QUFFeEUsc0JBQXNCLGdCQUFnQjtBQUN0QztBQUNBO0FBQ0EsOEZBQThGO0FBQzlGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCLGdCQUFnQjtBQUMxQztBQUNBLDRCQUE0Qix5QkFBeUI7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixhQUFhO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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YTtBQUNiO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUix1QkFBdUI7QUFDdkI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0ZBQWdGOztBQUVoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNILDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLHlCQUF5QjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsWUFBWTtBQUNaO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsZ0JBQWdCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsZ0JBQWdCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isd0JBQXdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztB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O0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsd0JBQXdCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IseUJBQXlCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLG9CQUFvQiw0QkFBNEI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFlBQVk7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxxQkFBcUI7QUFDMUUsdURBQXVEO0FBQ3ZEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRTs7QUFFakU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsdUJBQXVCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pELE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIscUJBQXFCO0FBQ2pEO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDOztBQUVELGtCQUFrQjtBQUNs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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9DQUFvQzs7QUFFcEM7QUFDQTtBQUNBLG9DQUFvQztBQUNwQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQzs7QUFFL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDRCQUE0QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7O0FBRTlCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRTs7QUFFbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1YsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVixRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixtQkFBbUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHlCQUF5QjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsV0FBVztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0Esa0JBQWtCLDZCQUE2QjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0U7QUFDaEU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixtQkFBbUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQSx1QkFBdUI7O0FBRXZCO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixxQkFBcUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG9CQUFvQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsaUJBQWlCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsaUJBQWlCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7O0FBRXJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsdUJBQXVCO0FBQ3pDLHdFQUF3RTtBQUN4RTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isc0JBQXNCO0FBQ3hDLGlFQUFpRTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixrQkFBa0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IseUJBQXlCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsa0JBQWtCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxrQkFBa0I7QUFDbEIsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjs7QUFFQTtBQUNBLHNDQUFzQztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx5Q0FBeUMsS0FBSztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUVBQWlFLEtBQUs7QUFDdEU7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsZUFBZTtBQUNmOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsOEJBQThCOztBQUU5QixvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVEQUF1RDs7QUFFdkQsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVnQzs7Ozs7OztVQ3hrOUJoQztVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7O1dDL0JBO1dBQ0E7V0FDQTtXQUNBLGVBQWUsNEJBQTRCO1dBQzNDLGVBQWU7V0FDZixpQ0FBaUMsV0FBVztXQUM1QztXQUNBLEU7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx5Q0FBeUMsd0NBQXdDO1dBQ2pGO1dBQ0E7V0FDQSxFOzs7OztXQ1BBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsR0FBRztXQUNIO1dBQ0E7V0FDQSxDQUFDLEk7Ozs7O1dDUEQsOENBQThDLHlEOzs7OztXQ0E5QztXQUNBO1dBQ0E7V0FDQSx1REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0QsRTs7Ozs7V0NOQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLEU7Ozs7O1dDSkEsbUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUscUJBQU0sb0JBQW9CLHFCQUFNO0FBQzFDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRCxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1IsNEVBQTRFO0FBQzVFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRCQUE0QixxQkFBcUI7QUFDakQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0EscUNBQXFDLDRCQUE0QjtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDZCQUE2QiwwQkFBMEIsZUFBZTtBQUN0RTs7QUFFTztBQUNQO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDam9CNEM7QUFDUDs7QUFFckM7QUFDQXhPLE1BQU0sQ0FBQzA0QixZQUFZLEdBQUdBLHVEQUFZLEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BwbG90bHkvZGFzaC1jb21wb25lbnQtcGx1Z2lucy9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9pY29ucy9DaGVja0ljb24uc3ZnIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9pY29ucy9DbG9ja0ljb24uc3ZnIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9pY29ucy9DbG91ZFNsYXNoSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0NvbGxhcHNlSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0Vycm9ySWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0V4cGFuZC5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL0dyYXBoSWNvbi5zdmciLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL2ljb25zL09mZkljb24uc3ZnIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvQXBwUHJvdmlkZXIucmVhY3QudHN4Iiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvU3RvcmVPYnNlcnZlci50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvY2FsbGJhY2tzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9kZXBlbmRlbmNpZXNfdHMudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2lzTG9hZGluZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvbG9hZGluZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvcGF0Y2gudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL3BhdHRlcm5NYXRjaGluZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvcmVxdWVzdERlcGVuZGVuY2llcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbmZpZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2Rhc2hBcGkudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvZG9jdW1lbnRUaXRsZS50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy9leGVjdXRlZENhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy9leGVjdXRpbmdDYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvaXNMb2FkaW5nLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL3ByaW9yaXRpemVkQ2FsbGJhY2tzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvb2JzZXJ2ZXJzL3JlcXVlc3RlZENhbGxiYWNrcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL29ic2VydmVycy9zdG9yZWRDYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9vYnNlcnZlcnMvd2Vic29ja2V0T2JzZXJ2ZXIudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9jYWxsYmFja0pvYnMudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9jYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9pc0xvYWRpbmcudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9sb2FkaW5nLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvc3RvcmUudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy9jYWxsYmFja3MudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy9jbGllbnRzaWRlRnVuY3Rpb25zLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvdXRpbHMvbGlicmFyaWVzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvdXRpbHMvcmVuZGVyZXJJZC50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3V0aWxzL3N0b3Jlcy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3V0aWxzL3dhaXQudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy91dGlscy93b3JrZXJDbGllbnQudHMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy93cmFwcGVyL0NoZWNrZWRDb21wb25lbnQudHN4Iiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvd3JhcHBlci9EYXNoQ29udGV4dC50c3giLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy93cmFwcGVyL0Rhc2hXcmFwcGVyLnRzeCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3dyYXBwZXIvRXh0ZXJuYWxXcmFwcGVyLnRzeCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3dyYXBwZXIvc2VsZWN0b3JzLnRzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvd3JhcHBlci93cmFwcGluZy50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL0FQSUNvbnRyb2xsZXIucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9BcHBDb250YWluZXIucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9EYXNoUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2FwaS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvY29uc3RhbnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9kZXBlbmRlbmNpZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9hY3Rpb25zL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9pc0FwcFJlYWR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvYWN0aW9ucy9wYXRocy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2FjdGlvbnMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jaGVja1Byb3BUeXBlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvY29yZS9Mb2FkaW5nLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9jb3JlL1JlbG9hZGVyLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9jb3JlL1Rvb2xiYXIucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0NhbGxiYWNrR3JhcGgvQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyU3R5bGVzaGVldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoRWZmZWN0cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ29tcG9uZW50RXJyb3JCb3VuZGFyeS5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvRnJvbnRFbmQvRnJvbnRFbmRFcnJvci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvRnJvbnRFbmQvRnJvbnRFbmRFcnJvckNvbnRhaW5lci5yZWFjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvR2xvYmFsRXJyb3JDb250YWluZXIucmVhY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvRGVidWdNZW51LnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L0RldnRvb2xDb250ZXh0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L1Bsb3RseUNsb3VkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L1ZlcnNpb25JbmZvLnJlYWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci93ZXJremV1Z2Nzcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbnN0YW50cy9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9leGNlcHRpb25zLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvaXNTaW1wbGVDb21wb25lbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9wZXJzaXN0ZW5jZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2FwaS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2FwcExpZmVjeWNsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2NoYW5nZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9jb25maWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9kZXBlbmRlbmN5R3JhcGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9lcnJvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2hpc3RvcnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWR1Y2Vycy9ob29rcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL2xheW91dC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL3BhdGhzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvcmVkdWNlcnMvcHJvZmlsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL3JlZHVjZXJzL3JlZHVjZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9yZWdpc3RyeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4uL3NyYy9pbmRleC50cyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2N5dG9zY2FwZS1mY29zZS9jeXRvc2NhcGUtZmNvc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uLi9zcmMvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uLi9zcmMvZGlmZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4uL3NyYy9qc29uLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi4vc3JjL2RlZmF1bHRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi4vc3JjL3BhdGNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi4vc3JjL2NvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2NvbXBvbmVudHMvQ29udGV4dC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2NvbXBvbmVudHMvUHJvdmlkZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb21wb25lbnRzL2Nvbm5lY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L2ludmFsaWRBcmdGYWN0b3J5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC9tYXBEaXNwYXRjaFRvUHJvcHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L21hcFN0YXRlVG9Qcm9wcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3QvbWVyZ2VQcm9wcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2Nvbm5lY3Qvc2VsZWN0b3JGYWN0b3J5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvY29ubmVjdC92ZXJpZnlTdWJzZWxlY3RvcnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9jb25uZWN0L3dyYXBNYXBUb1Byb3BzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvZXhwb3J0cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2hvb2tzL3VzZURpc3BhdGNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvaG9va3MvdXNlUmVkdXhDb250ZXh0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvaG9va3MvdXNlU2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy9ob29rcy91c2VTdG9yZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy9TdWJzY3JpcHRpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy9iYXRjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL2JpbmRBY3Rpb25DcmVhdG9ycy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL2lzUGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy9yZWFjdEJhdGNoZWRVcGRhdGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvc2hhbGxvd0VxdWFsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2VzL3V0aWxzL3VzZVN5bmNFeHRlcm5hbFN0b3JlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZXMvdXRpbHMvdmVyaWZ5UGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9lcy91dGlscy93YXJuaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYXBhdGh5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hc2hlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYXRlbGllci1kdW5lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9hdGVsaWVyLWZvcmVzdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYXRlbGllci1oZWF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYXRlbGllci1sYWtlc2lkZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYXRlbGllci1zZWFzaWRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9iZXNwaW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2JyZXdlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvYnJpZ2h0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9jaGFsay5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvY29kZXNjaG9vbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvY29sb3JzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9kZWZhdWx0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9laWdodGllcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvZW1iZXJzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9mbGF0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9nb29nbGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2dyYXlzY2FsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvZ3JlZW5zY3JlZW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2hhcm1vbmljLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9ob3BzY290Y2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9pc290b3BlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9tYXJyYWtlc2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL21vY2hhLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9tb25va2FpLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9vY2Vhbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvcGFyYWlzby5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvcG9wLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9yYWlsc2Nhc3RzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi9zaGFwZXNoaWZ0ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3NvbGFyaXplZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Jhc2UxNi9saWIvc3VtbWVyZnJ1aXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3RocmVlemVyb3R3b2ZvdXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9iYXNlMTYvbGliL3RvbW9ycm93LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi90dWJlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvYmFzZTE2L2xpYi90d2lsaWdodC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvY29udmVyc2lvbnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jb2xvci1jb252ZXJ0L2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9yb3V0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2NvbG9yLW5hbWUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jb2xvci1zdHJpbmcvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9jb2xvci9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2Nvc2UtYmFzZS9jb3NlLWJhc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2NvcmUvVG9vbGJhci5jc3MiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0NhbGxiYWNrR3JhcGgvQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5jc3MiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0Zyb250RW5kL0Zyb250RW5kRXJyb3IuY3NzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9QZXJjeS5jc3MiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvRGVidWdNZW51LmNzcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9QbG90bHlDbG91ZC5jc3MiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvVmVyc2lvbkluZm8uY3NzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2N5dG9zY2FwZS1kYWdyZS9jeXRvc2NhcGUtZGFncmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9hY3ljbGljLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL2FkZC1ib3JkZXItc2VnbWVudHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvY29vcmRpbmF0ZS1zeXN0ZW0uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvZGF0YS9saXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL2RlYnVnLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL2dyYXBobGliLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL2dyZWVkeS1mYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvbGF5b3V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL2xvZGFzaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9uZXN0aW5nLWdyYXBoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL25vcm1hbGl6ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9hZGQtc3ViZ3JhcGgtY29uc3RyYWludHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvYmFyeWNlbnRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9idWlsZC1sYXllci1ncmFwaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9jcm9zcy1jb3VudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9pbml0LW9yZGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL3Jlc29sdmUtY29uZmxpY3RzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL3NvcnQtc3ViZ3JhcGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvc29ydC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9wYXJlbnQtZHVtbXktY2hhaW5zLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL3Bvc2l0aW9uL2JrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL3Bvc2l0aW9uL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL3JhbmsvZmVhc2libGUtdHJlZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9yYW5rL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL3JhbmsvbmV0d29yay1zaW1wbGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL3JhbmsvdXRpbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi91dGlsLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZGFncmUvbGliL3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9kZXBlbmRlbmN5LWdyYXBoL2xpYi9kZXBfZ3JhcGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9mYXN0LWlzbnVtZXJpYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9jb21wb25lbnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9kZnMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2RpamtzdHJhLWFsbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvZGlqa3N0cmEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2ZpbmQtY3ljbGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9mbG95ZC13YXJzaGFsbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2lzLWFjeWNsaWMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL3Bvc3RvcmRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvcHJlb3JkZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL3ByaW0uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL3Rhcmphbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvdG9wc29ydC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9kYXRhL3ByaW9yaXR5LXF1ZXVlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2dyYXBoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2pzb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvbG9kYXNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy9kaXN0L2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzLmNqcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2ludmFyaWFudC9icm93c2VyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvaXMtc3RyaW5nLWJsYW5rL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbGF5b3V0LWJhc2UvbGF5b3V0LWJhc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2guY3VycnkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX0RhdGFWaWV3LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19IYXNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19MaXN0Q2FjaGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fTWFwQ2FjaGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1Byb21pc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1NldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fU2V0Q2FjaGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1N0YWNrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1VpbnQ4QXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1dlYWtNYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FwcGx5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUVhY2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5RmlsdGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUluY2x1ZGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUluY2x1ZGVzV2l0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlMaWtlS2V5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlNYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5UHVzaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5U29tZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNjaWlTaXplLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NpZ25NZXJnZVZhbHVlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NpZ25WYWx1ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNzb2NJbmRleE9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VBc3NpZ25WYWx1ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUNsb25lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQ3JlYXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRWFjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUV4dHJlbXVtLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmlsdGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmluZEluZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmxhdHRlbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUZvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUZvck93bi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldEFsbEtleXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUhhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUhhc0luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSW5kZXhPZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzQXJndW1lbnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNFcXVhbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzRXF1YWxEZWVwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNNYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc01hdGNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNOYU4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc05hdGl2ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNUeXBlZEFycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXRlcmF0ZWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlS2V5c0luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNYXRjaGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWF0Y2hlc1Byb3BlcnR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWVyZ2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNZXJnZURlZXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VPcmRlckJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUGljay5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVBpY2tCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVByb3BlcnR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUHJvcGVydHlEZWVwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUmFuZ2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VSZXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlU2V0VG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VTb3J0QnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VUaW1lcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRvU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVHJpbS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVVuYXJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5pcS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVZhbHVlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVppcE9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2FjaGVIYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nhc3RGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2FzdFBhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lQXJyYXlCdWZmZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lQnVmZmVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZURhdGFWaWV3LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZVJlZ0V4cC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVTeW1ib2wuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29tcGFyZUFzY2VuZGluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29tcGFyZU11bHRpcGxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5QXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlPYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlTeW1ib2xzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5U3ltYm9sc0luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3JlSnNEYXRhLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVBc3NpZ25lci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQmFzZUVhY2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUJhc2VGb3IuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUZpbmQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZVJhbmdlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbEFycmF5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxCeVRhZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxPYmplY3RzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19mbGF0UmVzdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZnJlZUdsb2JhbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0QWxsS2V5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0QWxsS2V5c0luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRNYXBEYXRhLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRNYXRjaERhdGEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE5hdGl2ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0UHJvdG90eXBlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRSYXdUYWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFN5bWJvbHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFN5bWJvbHNJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0VGFnLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRWYWx1ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzUGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzVW5pY29kZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaENsZWFyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoRGVsZXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoR2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoSGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pbml0Q2xvbmVBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lQnlUYWcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2luaXRDbG9uZU9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNGbGF0dGVuYWJsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNJbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNJdGVyYXRlZUNhbGwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzS2V5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0tleWFibGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzTWFza2VkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc1Byb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNTdHJpY3RDb21wYXJhYmxlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVDbGVhci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlRGVsZXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVHZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUhhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlU2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUNsZWFyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZURlbGV0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVHZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlSGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZVNldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21lbW9pemVDYXBwZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUNyZWF0ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbmF0aXZlS2V5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbmF0aXZlS2V5c0luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19ub2RlVXRpbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb2JqZWN0VG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX292ZXJBcmcuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX292ZXJSZXN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19yb290LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zYWZlR2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRDYWNoZUFkZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0Q2FjaGVIYXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldFRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldFRvU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zaG9ydE91dC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tDbGVhci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tEZWxldGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrR2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0hhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tTZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmljdEluZGV4T2YuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmluZ1NpemUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmluZ1RvUGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fdG9LZXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3RvU291cmNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL190cmltbWVkRW5kSW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3VuaWNvZGVTaXplLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2Nsb25lLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2Nsb25lRGVlcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9kZWZhdWx0cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9lYWNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2VxLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9maW5kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZpbmRJbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9mbGF0dGVuLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZvckVhY2guanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZm9ySW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZ2V0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2hhcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9oYXNJbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FyZ3VtZW50cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXlMaWtlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXlMaWtlT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQnVmZmVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzRW1wdHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0xlbmd0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc01hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdExpa2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1NldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1N5bWJvbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1R5cGVkQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNVbmRlZmluZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gva2V5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9rZXlzSW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbGFzdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9tYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWFwVmFsdWVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21heC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9tZW1vaXplLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21lcmdlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL21pbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9taW5CeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9ub29wLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL25vdy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9waWNrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3Byb3BlcnR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3JhbmdlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3JlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9zaXplLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3NvcnRCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9zdHViQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvc3R1YkZhbHNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvRmluaXRlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvSW50ZWdlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC90b051bWJlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC90b1BsYWluT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC91bmlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC91bmlxdWVJZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvemlwT2JqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1iYXNlMTYtc3R5bGluZy9saWIvZXNtL2NvbG9yQ29udmVydGVycy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWJhc2UxNi1zdHlsaW5nL2xpYi9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0l0ZW1SYW5nZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0pTT05BcnJheU5vZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9KU09OQXJyb3cuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9KU09OSXRlcmFibGVOb2RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vSlNPTk5lc3RlZE5vZGUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9KU09OTm9kZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL0pTT05PYmplY3ROb2RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vSlNPTlZhbHVlTm9kZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL2NyZWF0ZVN0eWxpbmdGcm9tVGhlbWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWFjdC1qc29uLXRyZWUvbGliL2VzbS9nZXRDb2xsZWN0aW9uRW50cmllcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVhY3QtanNvbi10cmVlL2xpYi9lc20vb2JqVHlwZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWpzb24tdHJlZS9saWIvZXNtL3RoZW1lcy9zb2xhcml6ZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWR1eC1hY3Rpb25zL2VzL2NyZWF0ZUFjdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlZHV4LWFjdGlvbnMvZXMvdXRpbHMvaWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWR1eC1hY3Rpb25zL2VzL3V0aWxzL2lzRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yZWR1eC1hY3Rpb25zL2VzL3V0aWxzL2lzTnVsbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JlZHV4LXRodW5rL2VzL2luZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmVkdXgvZXMvcmVkdXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9zaW1wbGUtc3dpenpsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3NpbXBsZS1zd2l6emxlL25vZGVfbW9kdWxlcy9pcy1hcnJheWlzaC9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvY29yZS9Ub29sYmFyLmNzcz9kODEzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9DYWxsYmFja0dyYXBoL0NhbGxiYWNrR3JhcGhDb250YWluZXIuY3NzPzU4ZTIiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL0Zyb250RW5kL0Zyb250RW5kRXJyb3IuY3NzP2E5MDAiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL3NyYy9jb21wb25lbnRzL2Vycm9yL1BlcmN5LmNzcz9hZjM4Iiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L0RlYnVnTWVudS5jc3M/NmQ1NCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9QbG90bHlDbG91ZC5jc3M/OWE4YiIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvbWVudS9WZXJzaW9uSW5mby5jc3M/ZGIyMiIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0uZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS93aXRoLXNlbGVjdG9yLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvc2hpbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL3NoaW0vd2l0aC1zZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL2V4dGVybmFsIHdpbmRvdyBcIlByb3BUeXBlc1wiIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvZXh0ZXJuYWwgd2luZG93IFwiUmVhY3RcIiIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL2V4dGVybmFsIHdpbmRvdyBcIlJlYWN0RE9NXCIiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheUxpa2VUb0FycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXJyYXlXaXRoSG9sZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hcnJheVdpdGhvdXRIb2xlcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NsYXNzQ2FsbENoZWNrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3MuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9nZXRQcm90b3R5cGVPZi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaXRlcmFibGVUb0FycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaXRlcmFibGVUb0FycmF5TGltaXQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9ub25JdGVyYWJsZVJlc3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9ub25JdGVyYWJsZVNwcmVhZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b1ByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvUHJvcGVydHlLZXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2YuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2FsbC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2Fsd2F5cy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2FueS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2FwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYXBwZW5kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvYXNzb2MuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9hc3NvY1BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9iaW5kLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvY2xvbmUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9jb21wYXJhdG9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvY29uY2F0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvY29udmVyZ2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9jdXJyeU4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9kZWZhdWx0VG8uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9kaWZmZXJlbmNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZGlzc29jLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZGlzc29jUGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2VtcHR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZXF1YWxzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZXZvbHZlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZmlsdGVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZmluZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ZpbmRJbmRleC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ZsYXR0ZW4uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9mb3JFYWNoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvZm9yRWFjaE9iakluZGV4ZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9ncm91cEJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaGFzUGF0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2lkZW50aXR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbmRleE9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW5zZXJ0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX1NldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19hcml0eS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19hcnJheUZyb21JdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19hcnJheVJlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19hc3NvYy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jaGVja0Zvck1ldGhvZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jbG9uZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jbG9uZVJlZ0V4cC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jb21wbGVtZW50LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jcmVhdGVSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY3VycnkxLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2N1cnJ5Mi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19jdXJyeTMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fY3VycnlOLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19kaXNzb2MuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fZXF1YWxzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19mdW5jdGlvbk5hbWUuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faGFzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lkZW50aXR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2luY2x1ZGVzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2luY2x1ZGVzV2l0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pbmRleE9mLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzQXJndW1lbnRzLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzQXJyYXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNBcnJheUxpa2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc0ludGVnZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNPYmplY3QuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9faXNQbGFjZWhvbGRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc1N0cmluZy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19pc1RyYW5zZm9ybWVyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX2lzVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19tYWtlRmxhdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19tYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9fbnRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX29iamVjdEFzc2lnbi5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19vYmplY3RJcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19wYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3F1b3RlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3JlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL19yZWR1Y2VkLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3RvSVNPU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3RvU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hBcnJheVJlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194UmVkdWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3hhbGwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feGFueS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194ZkJhc2UuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feGZpbHRlci5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194ZmluZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2ludGVybmFsL194ZmluZEluZGV4LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3htYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feHJlZHVjZUJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3h0YWtlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaW50ZXJuYWwvX3h1bmlxQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcm5hbC9feHdyYXAuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnRlcnNlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pbnZva2VyLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9pc0VtcHR5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvaXNOaWwuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9qb2luLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvanV4dC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL2tleXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9sZW5zLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbGVuc1BhdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9sdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21hcC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21hcE9iakluZGV4ZWQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tYXguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tZW1vaXplV2l0aC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lcmdlRGVlcFJpZ2h0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvbWVyZ2VEZWVwV2l0aEtleS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lcmdlTGVmdC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL21lcmdlUmlnaHQuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tZXJnZVdpdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9tZXJnZVdpdGhLZXkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9vbWl0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvb25jZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL292ZXIuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wYXJ0aXRpb24uanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wYXRoLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcGF0aE9yLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcGljay5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BpY2tCeS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3BsdWNrLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcHJlcGVuZC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3Byb3AuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wcm9wRXEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy9wcm9wcy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3JlZHVjZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3JlZHVjZUJ5LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcmVqZWN0LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcmVtb3ZlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvcmV2ZXJzZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3NldC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3NsaWNlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvc29ydC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3N0YXJ0c1dpdGguanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy90YWtlLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdG9QYWlycy5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3RvU3RyaW5nLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvdHlwZS5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3JhbWRhL2VzL3VuaXEuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy91bmlxQnkuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci8uL25vZGVfbW9kdWxlcy9yYW1kYS9lcy92aWV3LmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvemlwLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvcmFtZGEvZXMvemlwT2JqLmpzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvLi9ub2RlX21vZHVsZXMvY3l0b3NjYXBlL2Rpc3QvY3l0b3NjYXBlLmVzbS5tanMiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vZGFzaF9yZW5kZXJlci93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2Rhc2hfcmVuZGVyZXIvd2VicGFjay9ydW50aW1lL25vZGUgbW9kdWxlIGRlY29yYXRvciIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyL3dlYnBhY2svcnVudGltZS9ub25jZSIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vbm9kZV9tb2R1bGVzL3doYXR3Zy1mZXRjaC9mZXRjaC5qcyIsIndlYnBhY2s6Ly9kYXNoX3JlbmRlcmVyLy4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIiFmdW5jdGlvbihlLG4pe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPW4ocmVxdWlyZShcInJlYWN0XCIpKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcInJlYWN0XCJdLG4pOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHNbXCJkYXNoLWNvbXBvbmVudC1wbHVnaW5zXCJdPW4ocmVxdWlyZShcInJlYWN0XCIpKTplW1wiZGFzaC1jb21wb25lbnQtcGx1Z2luc1wiXT1uKGUuUmVhY3QpfSh3aW5kb3csKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj17fTtmdW5jdGlvbiB0KHIpe2lmKG5bcl0pcmV0dXJuIG5bcl0uZXhwb3J0czt2YXIgbz1uW3JdPXtpOnIsbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gZVtyXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyx0KSxvLmw9ITAsby5leHBvcnRzfXJldHVybiB0Lm09ZSx0LmM9bix0LmQ9ZnVuY3Rpb24oZSxuLHIpe3QubyhlLG4pfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLHtlbnVtZXJhYmxlOiEwLGdldDpyfSl9LHQucj1mdW5jdGlvbihlKXtcInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6XCJNb2R1bGVcIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSx0LnQ9ZnVuY3Rpb24oZSxuKXtpZigxJm4mJihlPXQoZSkpLDgmbilyZXR1cm4gZTtpZig0Jm4mJlwib2JqZWN0XCI9PXR5cGVvZiBlJiZlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHI9T2JqZWN0LmNyZWF0ZShudWxsKTtpZih0LnIociksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsXCJkZWZhdWx0XCIse2VudW1lcmFibGU6ITAsdmFsdWU6ZX0pLDImbiYmXCJzdHJpbmdcIiE9dHlwZW9mIGUpZm9yKHZhciBvIGluIGUpdC5kKHIsbyxmdW5jdGlvbihuKXtyZXR1cm4gZVtuXX0uYmluZChudWxsLG8pKTtyZXR1cm4gcn0sdC5uPWZ1bmN0aW9uKGUpe3ZhciBuPWUmJmUuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiBlLmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIGV9O3JldHVybiB0LmQobixcImFcIixuKSxufSx0Lm89ZnVuY3Rpb24oZSxuKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbil9LHQucD1cIlwiLHQodC5zPTEpfShbZnVuY3Rpb24obix0KXtuLmV4cG9ydHM9ZX0sZnVuY3Rpb24oZSxuLHQpe1widXNlIHN0cmljdFwiO3QucihuKSx0LmQobixcImFzeW5jRGVjb3JhdG9yXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSksdC5kKG4sXCJpbmhlcml0QXN5bmNEZWNvcmF0b3JcIiwoZnVuY3Rpb24oKXtyZXR1cm4gYX0pKSx0LmQobixcImlzUmVhZHlcIiwoZnVuY3Rpb24oKXtyZXR1cm4gY30pKSx0LmQobixcIkhpc3RvcnlcIiwoZnVuY3Rpb24oKXtyZXR1cm4gZH0pKTt2YXIgcj10KDApO2Z1bmN0aW9uIG8oZSxuLHQscixvLGksdSl7dHJ5e3ZhciBhPWVbaV0odSksYz1hLnZhbHVlfWNhdGNoKGUpe3JldHVybiB2b2lkIHQoZSl9YS5kb25lP24oYyk6UHJvbWlzZS5yZXNvbHZlKGMpLnRoZW4ocixvKX1mdW5jdGlvbiBpKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMsdD1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLGkpe3ZhciB1PWUuYXBwbHkobix0KTtmdW5jdGlvbiBhKGUpe28odSxyLGksYSxjLFwibmV4dFwiLGUpfWZ1bmN0aW9uIGMoZSl7byh1LHIsaSxhLGMsXCJ0aHJvd1wiLGUpfWEodm9pZCAwKX0pKX19dmFyIHU9ZnVuY3Rpb24oZSxuKXt2YXIgdCxvPXtpc1JlYWR5Om5ldyBQcm9taXNlKChmdW5jdGlvbihlKXt0PWV9KSksZ2V0Ok9iamVjdChyLmxhenkpKChmdW5jdGlvbigpe3JldHVybiBQcm9taXNlLnJlc29sdmUobigpKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gc2V0VGltZW91dChpKHJlZ2VuZXJhdG9yUnVudGltZS5tYXJrKChmdW5jdGlvbiBlKCl7cmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5uZXh0PTIsdCghMCk7Y2FzZSAyOm8uaXNSZWFkeT0hMDtjYXNlIDM6Y2FzZVwiZW5kXCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUpfSkpKSwwKSxlfSkpfSkpfTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfZGFzaHByaXZhdGVfaXNMYXp5Q29tcG9uZW50UmVhZHlcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG8uaXNSZWFkeX19KSxvLmdldH0sYT1mdW5jdGlvbihlLG4pe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX2Rhc2hwcml2YXRlX2lzTGF6eUNvbXBvbmVudFJlYWR5XCIse2dldDpmdW5jdGlvbigpe3JldHVybiBjKG4pfX0pfSxjPWZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9kYXNocHJpdmF0ZV9pc0xhenlDb21wb25lbnRSZWFkeX07ZnVuY3Rpb24gZihlLG4pe2Zvcih2YXIgdD0wO3Q8bi5sZW5ndGg7dCsrKXt2YXIgcj1uW3RdO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19dmFyIHM9XCJfZGFzaHByaXZhdGVfaGlzdG9yeWNoYW5nZVwiLGQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7IWZ1bmN0aW9uKGUsbil7aWYoIShlIGluc3RhbmNlb2YgbikpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX0odGhpcyxlKX12YXIgbix0LHI7cmV0dXJuIG49ZSxyPVt7a2V5OlwiZGlzcGF0Y2hDaGFuZ2VFdmVudFwiLHZhbHVlOmZ1bmN0aW9uKCl7d2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KHMpKX19LHtrZXk6XCJvbkNoYW5nZVwiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihzLGUpLGZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKHMsZSl9fX1dLCh0PW51bGwpJiZmKG4ucHJvdG90eXBlLHQpLHImJmYobixyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkobixcInByb3RvdHlwZVwiLHt3cml0YWJsZTohMX0pLGV9KCl9XSl9KSk7IiwidmFyIF9wYXRoO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7IGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7IHZhciB0ID0gYXJndW1lbnRzW2VdOyBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pOyB9IHJldHVybiBuOyB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBTdmdDaGVja0ljb24gPSBmdW5jdGlvbiBTdmdDaGVja0ljb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAxOCxcbiAgICBoZWlnaHQ6IDE4LFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDE0IDE0XCJcbiAgfSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGw6IFwiIzA2ODAwQVwiLFxuICAgIGZpbGxPcGFjaXR5OiAwLjgsXG4gICAgZDogXCJNOS44NTQgNS4xNDZhLjUuNSAwIDAgMSAwIC43MDhsLTMuNSAzLjVhLjUuNSAwIDAgMS0uNzA4IDBsLTEuNS0xLjVhLjUuNSAwIDEgMSAuNzA4LS43MDhMNiA4LjI5M2wzLjE0Ni0zLjE0N2EuNS41IDAgMCAxIC43MDggME0xMy41IDdBNi41IDYuNSAwIDEgMSA3IC41IDYuNTA3IDYuNTA3IDAgMCAxIDEzLjUgN20tMSAwQTUuNSA1LjUgMCAxIDAgNyAxMi41IDUuNTA3IDUuNTA3IDAgMCAwIDEyLjUgN1wiXG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU3ZnQ2hlY2tJY29uOyIsInZhciBfcGF0aDtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgU3ZnQ2xvY2tJY29uID0gZnVuY3Rpb24gU3ZnQ2xvY2tJY29uKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB2aWV3Qm94OiBcIjAgMCA1NCAyNFwiXG4gIH0sIHByb3BzKSwgX3BhdGggfHwgKF9wYXRoID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICBzdHJva2U6IFwiI2ZmZlwiLFxuICAgIHN0cm9rZVdpZHRoOiA0LFxuICAgIGQ6IFwiTTI3IDB2MjJoMjJcIlxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN2Z0Nsb2NrSWNvbjsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z0Nsb3VkU2xhc2hJY29uID0gZnVuY3Rpb24gU3ZnQ2xvdWRTbGFzaEljb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAzMixcbiAgICBoZWlnaHQ6IDMyLFxuICAgIHZpZXdCb3g6IFwiMCAwIDI1NiAyNTZcIlxuICB9LCBwcm9wcyksIF9wYXRoIHx8IChfcGF0aCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMjQ4IDEyOC43MkE4Ny43NCA4Ny43NCAwIDAgMSAyMjIuNDEgMTkwYTQgNCAwIDAgMS01Ljc3LS4xNkwxMDMuNzggNjUuNjdhNCA0IDAgMCAxIC4zOS01Ljc2QTg3LjgyIDg3LjgyIDAgMCAxIDE2MC44NyA0MGM0OC4yOC40NyA4Ny41MSA0MC40MyA4Ny4xMyA4OC43Mk01My45MiAzNC42MmE4IDggMCAxIDAtMTEuODQgMTAuNzZsMzkuMjUgNDMuMTgtLjA2LjExQTY0IDY0IDAgMCAwIDggMTUzYy41MyAzNS4xMiAyOS44NCA2MyA2NSA2M2g4N2E4Ny43IDg3LjcgMCAwIDAgMzEuNzgtNS45NWwxMC4zIDExLjMzYTggOCAwIDAgMCAxMS4zMy41MiA4LjMyIDguMzIgMCAwIDAgLjI5LTExLjUyWlwiXG4gIH0pKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgU3ZnQ2xvdWRTbGFzaEljb247IiwidmFyIF9wYXRoO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7IGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7IHZhciB0ID0gYXJndW1lbnRzW2VdOyBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pOyB9IHJldHVybiBuOyB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBTdmdDb2xsYXBzZUljb24gPSBmdW5jdGlvbiBTdmdDb2xsYXBzZUljb24ocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAxMCxcbiAgICBoZWlnaHQ6IDYsXG4gICAgZmlsbDogXCJub25lXCJcbiAgfSwgcHJvcHMpLCBfcGF0aCB8fCAoX3BhdGggPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIHN0cm9rZTogXCIjQTJCMUM2XCIsXG4gICAgZDogXCJtMSAxIDQgNCA0LTRcIlxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN2Z0NvbGxhcHNlSWNvbjsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z0Vycm9ySWNvbiA9IGZ1bmN0aW9uIFN2Z0Vycm9ySWNvbihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IDMyLFxuICAgIGhlaWdodDogMzIsXG4gICAgdmlld0JveDogXCIwIDAgMjU2IDI1NlwiXG4gIH0sIHByb3BzKSwgX3BhdGggfHwgKF9wYXRoID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0yMzYuOCAxODguMDkgMTQ5LjM1IDM2LjIyYTI0Ljc2IDI0Ljc2IDAgMCAwLTQyLjcgMEwxOS4yIDE4OC4wOWEyMy41MSAyMy41MSAwIDAgMCAwIDIzLjcyQTI0LjM1IDI0LjM1IDAgMCAwIDQwLjU1IDIyNGgxNzQuOWEyNC4zNSAyNC4zNSAwIDAgMCAyMS4zMy0xMi4xOSAyMy41MSAyMy41MSAwIDAgMCAuMDItMjMuNzJtLTEzLjg3IDE1LjcxYTguNSA4LjUgMCAwIDEtNy40OCA0LjJINDAuNTVhOC41IDguNSAwIDAgMS03LjQ4LTQuMiA3LjU5IDcuNTkgMCAwIDEgMC03LjcybDg3LjQ1LTE1MS44N2E4Ljc1IDguNzUgMCAwIDEgMTUgMGw4Ny40NSAxNTEuODdhNy41OSA3LjU5IDAgMCAxLS4wNCA3LjcyTTEyMCAxNDR2LTQwYTggOCAwIDAgMSAxNiAwdjQwYTggOCAwIDAgMS0xNiAwbTIwIDM2YTEyIDEyIDAgMSAxLTEyLTEyIDEyIDEyIDAgMCAxIDEyIDEyXCJcbiAgfSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdmdFcnJvckljb247IiwidmFyIF9wYXRoO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7IGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7IHZhciB0ID0gYXJndW1lbnRzW2VdOyBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pOyB9IHJldHVybiBuOyB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBTdmdFeHBhbmQgPSBmdW5jdGlvbiBTdmdFeHBhbmQocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAzMCxcbiAgICBoZWlnaHQ6IDMwLFxuICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCIsXG4gICAgdmlld0JveDogXCIwIDAgMjU2IDI1NlwiXG4gIH0sIHByb3BzKSwgX3BhdGggfHwgKF9wYXRoID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0yMDEuNTQgNTQuNDZBMTA0IDEwNCAwIDAgMCA1NC40NiAyMDEuNTQgMTA0IDEwNCAwIDAgMCAyMDEuNTQgNTQuNDZtLTExLjMxIDEzNS43N2E4OCA4OCAwIDEgMSAwLTEyNC40NiA4OC4xMSA4OC4xMSAwIDAgMSAwIDEyNC40Nm0tMTYuNTctODguNTdMMTQ3LjMxIDEyOGwyNi4zNSAyNi4zNGE4IDggMCAwIDEtMTEuMzIgMTEuMzJsLTMyLTMyYTggOCAwIDAgMSAwLTExLjMybDMyLTMyYTggOCAwIDAgMSAxMS4zMiAxMS4zMm0tNTYgMEw5MS4zMSAxMjhsMjYuMzUgMjYuMzRhOCA4IDAgMCAxLTExLjMyIDExLjMybC0zMi0zMmE4IDggMCAwIDEgMC0xMS4zMmwzMi0zMmE4IDggMCAwIDEgMTEuMzIgMTEuMzJcIlxuICB9KSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFN2Z0V4cGFuZDsiLCJ2YXIgX3BhdGg7XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIFN2Z0dyYXBoSWNvbiA9IGZ1bmN0aW9uIFN2Z0dyYXBoSWNvbihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IDMyLFxuICAgIGhlaWdodDogMzIsXG4gICAgdmlld0JveDogXCIwIDAgMjU2IDI1NlwiXG4gIH0sIHByb3BzKSwgX3BhdGggfHwgKF9wYXRoID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0yMDAgMTUyYTMxLjg0IDMxLjg0IDAgMCAwLTE5LjUzIDYuNjhsLTIzLjExLTE4QTMxLjY1IDMxLjY1IDAgMCAwIDE2MCAxMjhjMC0uNzQgMC0xLjQ4LS4wOC0yLjIxbDEzLjIzLTQuNDFBMzIgMzIgMCAxIDAgMTY4IDEwNGMwIC43NCAwIDEuNDguMDggMi4yMWwtMTMuMjMgNC40MUEzMiAzMiAwIDAgMCAxMjggOTZhMzIuNiAzMi42IDAgMCAwLTUuMjcuNDRMMTE1Ljg5IDgxQTMyIDMyIDAgMSAwIDk2IDg4YTMyLjYgMzIuNiAwIDAgMCA1LjI3LS40NGw2Ljg0IDE1LjRhMzEuOTIgMzEuOTIgMCAwIDAtOC41NyAzOS42NGwtMjUuNzEgMjIuODRhMzIuMDYgMzIuMDYgMCAxIDAgMTAuNjMgMTJsMjUuNzEtMjIuODRhMzEuOTEgMzEuOTEgMCAwIDAgMzcuMzYtMS4yNGwyMy4xMSAxOEEzMS42NSAzMS42NSAwIDAgMCAxNjggMTg0YTMyIDMyIDAgMSAwIDMyLTMybTAtNjRhMTYgMTYgMCAxIDEtMTYgMTYgMTYgMTYgMCAwIDEgMTYtMTZNODAgNTZhMTYgMTYgMCAxIDEgMTYgMTYgMTYgMTYgMCAwIDEtMTYtMTZNNTYgMjA4YTE2IDE2IDAgMSAxIDE2LTE2IDE2IDE2IDAgMCAxLTE2IDE2bTU2LTgwYTE2IDE2IDAgMSAxIDE2IDE2IDE2IDE2IDAgMCAxLTE2LTE2bTg4IDcyYTE2IDE2IDAgMSAxIDE2LTE2IDE2IDE2IDAgMCAxLTE2IDE2XCJcbiAgfSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdmdHcmFwaEljb247IiwidmFyIF9wYXRoO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7IGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7IHZhciB0ID0gYXJndW1lbnRzW2VdOyBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pOyB9IHJldHVybiBuOyB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciBTdmdPZmZJY29uID0gZnVuY3Rpb24gU3ZnT2ZmSWNvbihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IDE4LFxuICAgIGhlaWdodDogMTgsXG4gICAgZmlsbDogXCIjQzczQTNBXCIsXG4gICAgdmlld0JveDogXCIwIDAgMjU2IDI1NlwiXG4gIH0sIHByb3BzKSwgX3BhdGggfHwgKF9wYXRoID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNjUuNjYgMTAxLjY2IDEzOS4zMSAxMjhsMjYuMzUgMjYuMzRhOCA4IDAgMCAxLTExLjMyIDExLjMyTDEyOCAxMzkuMzFsLTI2LjM0IDI2LjM1YTggOCAwIDAgMS0xMS4zMi0xMS4zMkwxMTYuNjkgMTI4bC0yNi4zNS0yNi4zNGE4IDggMCAwIDEgMTEuMzItMTEuMzJMMTI4IDExNi42OWwyNi4zNC0yNi4zNWE4IDggMCAwIDEgMTEuMzIgMTEuMzJNMjMyIDEyOEExMDQgMTA0IDAgMSAxIDEyOCAyNGExMDQuMTEgMTA0LjExIDAgMCAxIDEwNCAxMDRtLTE2IDBhODggODggMCAxIDAtODggODggODguMSA4OC4xIDAgMCAwIDg4LTg4XCJcbiAgfSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTdmdPZmZJY29uOyIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IEFwcENvbnRhaW5lciBmcm9tICcuL0FwcENvbnRhaW5lci5yZWFjdCc7XG5pbXBvcnQgZ2V0Q29uZmlnRnJvbURPTSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBpbml0aWFsaXplV2ViU29ja2V0LCBkaXNjb25uZWN0V2ViU29ja2V0IH0gZnJvbSAnLi9vYnNlcnZlcnMvd2Vic29ja2V0T2JzZXJ2ZXInO1xuY29uc3QgQXBwUHJvdmlkZXIgPSAoeyBob29rcyA9IHtcbiAgICBsYXlvdXRfcHJlOiBudWxsLFxuICAgIGxheW91dF9wb3N0OiBudWxsLFxuICAgIHJlcXVlc3RfcHJlOiBudWxsLFxuICAgIHJlcXVlc3RfcG9zdDogbnVsbCxcbiAgICBjYWxsYmFja19yZXNvbHZlZDogbnVsbCxcbiAgICByZXF1ZXN0X3JlZnJlc2hfand0OiBudWxsXG59IH0pID0+IHtcbiAgICBjb25zdCBbeyBzdG9yZSB9XSA9IHVzZVN0YXRlKCgpID0+IG5ldyBTdG9yZSgpKTtcbiAgICAvLyBJbml0aWFsaXplIFdlYlNvY2tldCBjb25uZWN0aW9uIGlmIGVuYWJsZWQgb3IgaWYgd2Vic29ja2V0IGNvbmZpZyBpcyBhdmFpbGFibGVcbiAgICAvLyAoZm9yIHBlci1jYWxsYmFjayB3ZWJzb2NrZXQ9VHJ1ZSlcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWdGcm9tRE9NKCk7XG4gICAgICAgIGlmIChjb25maWcud2Vic29ja2V0Py5lbmFibGVkIHx8XG4gICAgICAgICAgICAoY29uZmlnLndlYnNvY2tldD8udXJsICYmIGNvbmZpZy53ZWJzb2NrZXQ/Lndvcmtlcl91cmwpKSB7XG4gICAgICAgICAgICAvLyBBZGQgZmV0Y2ggY29uZmlnIGZvciBjb25zaXN0ZW5jeVxuICAgICAgICAgICAgY29uc3QgZnVsbENvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgICAgICAgZmV0Y2g6IHtcbiAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGluaXRpYWxpemVXZWJTb2NrZXQoc3RvcmUsIGZ1bGxDb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENsZWFudXAgb24gdW5tb3VudFxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgZGlzY29ubmVjdFdlYlNvY2tldCgpO1xuICAgICAgICB9O1xuICAgIH0sIFtzdG9yZV0pO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChQcm92aWRlciwgeyBzdG9yZTogc3RvcmUgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChBcHBDb250YWluZXIsIHsgaG9va3M6IGhvb2tzIH0pKSk7XG59O1xuQXBwUHJvdmlkZXIucHJvcFR5cGVzID0ge1xuICAgIGhvb2tzOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICBsYXlvdXRfcHJlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgbGF5b3V0X3Bvc3Q6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgICByZXF1ZXN0X3ByZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIHJlcXVlc3RfcG9zdDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIGNhbGxiYWNrX3Jlc29sdmVkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgcmVxdWVzdF9yZWZyZXNoX2p3dDogUHJvcFR5cGVzLmZ1bmNcbiAgICB9KVxufTtcbmV4cG9ydCBkZWZhdWx0IEFwcFByb3ZpZGVyO1xuIiwiaW1wb3J0IHsgYW55LCBmaWx0ZXIsIG1hcCwgcGF0aCB9IGZyb20gJ3JhbWRhJztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0b3JlT2JzZXJ2ZXIge1xuICAgIF9zdG9yZTtcbiAgICBfdW5zdWJzY3JpYmU7XG4gICAgX29ic2VydmVycyA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7XG4gICAgICAgIHRoaXMuX19pbml0X18oc3RvcmUpO1xuICAgIH1cbiAgICBvYnNlcnZlID0gKG9ic2VydmVyLCBpbnB1dHMpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYnNlcnZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lucHV0cyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFkZChvYnNlcnZlciwgaW5wdXRzKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB0aGlzLnJlbW92ZShvYnNlcnZlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGQob2JzZXJ2ZXIub2JzZXJ2ZXIsIG9ic2VydmVyLmlucHV0cyk7XG4gICAgICAgIHJldHVybiAoKSA9PiB0aGlzLnJlbW92ZShvYnNlcnZlci5vYnNlcnZlcik7XG4gICAgfTtcbiAgICBzZXRTdG9yZSA9IChzdG9yZSkgPT4ge1xuICAgICAgICB0aGlzLl9fZmluYWxpemVfXygpO1xuICAgICAgICB0aGlzLl9faW5pdF9fKHN0b3JlKTtcbiAgICB9O1xuICAgIF9fZmluYWxpemVfXyA9ICgpID0+IHRoaXMuX3Vuc3Vic2NyaWJlPy4oKTtcbiAgICBfX2luaXRfXyA9IChzdG9yZSkgPT4ge1xuICAgICAgICB0aGlzLl9zdG9yZSA9IHN0b3JlO1xuICAgICAgICBpZiAoc3RvcmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlID0gc3RvcmUuc3Vic2NyaWJlKHRoaXMubm90aWZ5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vYnNlcnZlcnMuZm9yRWFjaChvID0+IHtcbiAgICAgICAgICAgIG8ubGFzdFN0YXRlID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBhZGQgPSAob2JzZXJ2ZXIsIGlucHV0cykgPT4gdGhpcy5fb2JzZXJ2ZXJzLnB1c2goe1xuICAgICAgICBpbnB1dFBhdGhzOiBtYXAocCA9PiBwLnNwbGl0KCcuJyksIGlucHV0cyksXG4gICAgICAgIGxhc3RTdGF0ZTogbnVsbCxcbiAgICAgICAgb2JzZXJ2ZXIsXG4gICAgICAgIHRyaWdnZXJlZDogZmFsc2VcbiAgICB9KTtcbiAgICBub3RpZnkgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0b3JlID0gdGhpcy5fc3RvcmU7XG4gICAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IHRyaWdnZXJlZCA9IGZpbHRlcihvID0+ICFvLnRyaWdnZXJlZCAmJlxuICAgICAgICAgICAgYW55KGkgPT4gcGF0aChpLCBzdGF0ZSkgIT09IHBhdGgoaSwgby5sYXN0U3RhdGUpLCBvLmlucHV0UGF0aHMpLCB0aGlzLl9vYnNlcnZlcnMpO1xuICAgICAgICB0cmlnZ2VyZWQuZm9yRWFjaChvID0+IHtcbiAgICAgICAgICAgIG8udHJpZ2dlcmVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRyaWdnZXJlZC5mb3JFYWNoKG8gPT4ge1xuICAgICAgICAgICAgby5sYXN0U3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgby5vYnNlcnZlcihzdG9yZSk7XG4gICAgICAgICAgICBvLnRyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJlbW92ZSA9IChvYnNlcnZlcikgPT4gdGhpcy5fb2JzZXJ2ZXJzLnNwbGljZSh0aGlzLl9vYnNlcnZlcnMuZmluZEluZGV4KG8gPT4gb2JzZXJ2ZXIgPT09IG8ub2JzZXJ2ZXIsIHRoaXMuX29ic2VydmVycyksIDEpO1xufVxuIiwiaW1wb3J0IHsgY29uY2F0LCBmbGF0dGVuLCBpbnRlcnNlY3Rpb24sIGtleXMsIG1hcCwgbWVyZ2VEZWVwUmlnaHQsIHBhdGgsIHBpY2ssIHBsdWNrLCB2YWx1ZXMsIHRvUGFpcnMsIHppcCwgYXNzb2NQYXRoIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgU1RBVFVTLCBKV1RfRVhQSVJFRF9NRVNTQUdFIH0gZnJvbSAnLi4vY29uc3RhbnRzL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBNQVhfQVVUSF9SRVRSSUVTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQ2FsbGJhY2tBY3Rpb25UeXBlLCBDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGUgfSBmcm9tICcuLi9yZWR1Y2Vycy9jYWxsYmFja3MnO1xuaW1wb3J0IHsgaXNNdWx0aVZhbHVlZCwgc3RyaW5naWZ5SWQsIGlzTXVsdGlPdXRwdXRQcm9wIH0gZnJvbSAnLi9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHsgdXJsQmFzZSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgZ2V0Q1NSRkhlYWRlciwgZGlzcGF0Y2hFcnJvciwgc2V0UGF0aHMgfSBmcm9tICcuJztcbmltcG9ydCB7IGNyZWF0ZUFjdGlvbiB9IGZyb20gJ3JlZHV4LWFjdGlvbnMnO1xuaW1wb3J0IHsgYWRkSHR0cEhlYWRlcnMgfSBmcm9tICcuLi9hY3Rpb25zJztcbmltcG9ydCB7IG5vdGlmeU9ic2VydmVycywgdXBkYXRlUHJvcHMgfSBmcm9tICcuL2luZGV4JztcbmltcG9ydCB7IHBhcnNlUGF0Y2hQcm9wcyB9IGZyb20gJy4vcGF0Y2gnO1xuaW1wb3J0IHsgY29tcHV0ZVBhdGhzLCBnZXRQYXRoIH0gZnJvbSAnLi9wYXRocyc7XG5pbXBvcnQgeyByZXF1ZXN0RGVwZW5kZW5jaWVzIH0gZnJvbSAnLi9yZXF1ZXN0RGVwZW5kZW5jaWVzJztcbmltcG9ydCB7IGxvYWRMaWJyYXJ5IH0gZnJvbSAnLi4vdXRpbHMvbGlicmFyaWVzJztcbmltcG9ydCB7IHBhcnNlUE1DSWQgfSBmcm9tICcuL3BhdHRlcm5NYXRjaGluZyc7XG5pbXBvcnQgeyByZXBsYWNlUE1DIH0gZnJvbSAnLi9wYXR0ZXJuTWF0Y2hpbmcnO1xuaW1wb3J0IHsgbG9hZGVkLCBsb2FkaW5nIH0gZnJvbSAnLi9sb2FkaW5nJztcbmltcG9ydCB7IGdldENvbXBvbmVudExheW91dCB9IGZyb20gJy4uL3dyYXBwZXIvd3JhcHBpbmcnO1xuaW1wb3J0IHsgZ2V0V29ya2VyQ2xpZW50LCBpc1dlYlNvY2tldEVuYWJsZWQsIGlzV2ViU29ja2V0QXZhaWxhYmxlIH0gZnJvbSAnLi4vdXRpbHMvd29ya2VyQ2xpZW50JztcbmV4cG9ydCBjb25zdCBhZGRCbG9ja2VkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5BZGRCbG9ja2VkKTtcbmV4cG9ydCBjb25zdCBhZGRDb21wbGV0ZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlLkFkZENvbXBsZXRlZCk7XG5leHBvcnQgY29uc3QgYWRkRXhlY3V0ZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEV4ZWN1dGVkKTtcbmV4cG9ydCBjb25zdCBhZGRFeGVjdXRpbmdDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEV4ZWN1dGluZyk7XG5leHBvcnQgY29uc3QgYWRkUHJpb3JpdGl6ZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFByaW9yaXRpemVkKTtcbmV4cG9ydCBjb25zdCBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFJlcXVlc3RlZCk7XG5leHBvcnQgY29uc3QgYWRkU3RvcmVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5BZGRTdG9yZWQpO1xuZXhwb3J0IGNvbnN0IGFkZFdhdGNoZWRDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFdhdGNoZWQpO1xuZXhwb3J0IGNvbnN0IHJlbW92ZUV4ZWN1dGVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVFeGVjdXRlZCk7XG5leHBvcnQgY29uc3QgcmVtb3ZlQmxvY2tlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlQmxvY2tlZCk7XG5leHBvcnQgY29uc3QgcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVFeGVjdXRpbmcpO1xuZXhwb3J0IGNvbnN0IHJlbW92ZVByaW9yaXRpemVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVQcmlvcml0aXplZCk7XG5leHBvcnQgY29uc3QgcmVtb3ZlUmVxdWVzdGVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVSZXF1ZXN0ZWQpO1xuZXhwb3J0IGNvbnN0IHJlbW92ZVN0b3JlZENhbGxiYWNrcyA9IGNyZWF0ZUFjdGlvbihDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlU3RvcmVkKTtcbmV4cG9ydCBjb25zdCByZW1vdmVXYXRjaGVkQ2FsbGJhY2tzID0gY3JlYXRlQWN0aW9uKENhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVXYXRjaGVkKTtcbmV4cG9ydCBjb25zdCBhZ2dyZWdhdGVDYWxsYmFja3MgPSBjcmVhdGVBY3Rpb24oQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlLkFnZ3JlZ2F0ZSk7XG5jb25zdCB1cGRhdGVSZXNvdXJjZVVzYWdlID0gY3JlYXRlQWN0aW9uKCdVUERBVEVfUkVTT1VSQ0VfVVNBR0UnKTtcbmNvbnN0IGFkZENhbGxiYWNrSm9iID0gY3JlYXRlQWN0aW9uKCdBRERfQ0FMTEJBQ0tfSk9CJyk7XG5jb25zdCByZW1vdmVDYWxsYmFja0pvYiA9IGNyZWF0ZUFjdGlvbignUkVNT1ZFX0NBTExCQUNLX0pPQicpO1xuY29uc3Qgc2V0Q2FsbGJhY2tKb2JPdXRkYXRlZCA9IGNyZWF0ZUFjdGlvbignQ0FMTEJBQ0tfSk9CX09VVERBVEVEJyk7XG5mdW5jdGlvbiB1bndyYXBJZk5vdE11bHRpKHBhdGhzLCBpZFByb3BzLCBzcGVjLCBhbnlWYWxzLCBkZXBUeXBlKSB7XG4gICAgbGV0IG1zZyA9ICcnO1xuICAgIGlmIChpc011bHRpVmFsdWVkKHNwZWMpKSB7XG4gICAgICAgIHJldHVybiBbaWRQcm9wcywgbXNnXTtcbiAgICB9XG4gICAgaWYgKGlkUHJvcHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIGlmICghaWRQcm9wcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChzcGVjLmFsbG93X29wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgaWRQcm9wcyA9IFt7IC4uLnNwZWMsIHZhbHVlOiBudWxsIH1dO1xuICAgICAgICAgICAgICAgIG1zZyA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNTdHIgPSB0eXBlb2Ygc3BlYy5pZCA9PT0gJ3N0cmluZyc7XG4gICAgICAgICAgICAgICAgbXNnID1cbiAgICAgICAgICAgICAgICAgICAgJ0Egbm9uZXhpc3RlbnQgb2JqZWN0IHdhcyB1c2VkIGluIGFuIGAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcFR5cGUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2Agb2YgYSBEYXNoIGNhbGxiYWNrLiBUaGUgaWQgb2YgdGhpcyBvYmplY3QgaXMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAoaXNTdHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdgJyArIHNwZWMuaWQgKyAnYCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHNwZWMuaWQpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFueVZhbHMgPyAnIHdpdGggTUFUQ0ggdmFsdWVzICcgKyBhbnlWYWxzIDogJycpKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnIGFuZCB0aGUgcHJvcGVydHkgaXMgYCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgc3BlYy5wcm9wZXJ0eSArXG4gICAgICAgICAgICAgICAgICAgICAgICAoaXNTdHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdgLiBUaGUgc3RyaW5nIGlkcyBpbiB0aGUgY3VycmVudCBsYXlvdXQgYXJlOiBbJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMocGF0aHMuc3Rycykuam9pbignLCAnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICddJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2AuIFRoZSB3aWxkY2FyZCBpZHMgY3VycmVudGx5IGF2YWlsYWJsZSBhcmUgbG9nZ2VkIGFib3ZlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbXNnID1cbiAgICAgICAgICAgICAgICAnTXVsdGlwbGUgb2JqZWN0cyB3ZXJlIGZvdW5kIGZvciBhbiBgJyArXG4gICAgICAgICAgICAgICAgICAgIGRlcFR5cGUgK1xuICAgICAgICAgICAgICAgICAgICAnYCBvZiBhIGNhbGxiYWNrIHRoYXQgb25seSB0YWtlcyBvbmUgdmFsdWUuIFRoZSBpZCBzcGVjIGlzICcgK1xuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShzcGVjLmlkKSArXG4gICAgICAgICAgICAgICAgICAgIChhbnlWYWxzID8gJyB3aXRoIE1BVENIIHZhbHVlcyAnICsgYW55VmFscyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICcgYW5kIHRoZSBwcm9wZXJ0eSBpcyBgJyArXG4gICAgICAgICAgICAgICAgICAgIHNwZWMucHJvcGVydHkgK1xuICAgICAgICAgICAgICAgICAgICAnYC4gVGhlIG9iamVjdHMgd2UgZm91bmQgYXJlOiAnICtcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobWFwKHBpY2soWydpZCcsICdwcm9wZXJ0eSddKSwgaWRQcm9wcykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbaWRQcm9wc1swXSwgbXNnXTtcbn1cbmZ1bmN0aW9uIGZpbGxWYWxzKHBhdGhzLCBsYXlvdXQsIGNiLCBzcGVjcywgZGVwVHlwZSwgYWxsb3dBbGxNaXNzaW5nID0gZmFsc2UpIHtcbiAgICBjb25zdCBnZXR0ZXIgPSBkZXBUeXBlID09PSAnSW5wdXQnID8gY2IuZ2V0SW5wdXRzIDogY2IuZ2V0U3RhdGU7XG4gICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgbGV0IGVtcHR5TXVsdGlWYWx1ZXMgPSAwO1xuICAgIGNvbnN0IGlucHV0VmFscyA9IGdldHRlcihwYXRocykubWFwKChpbnB1dExpc3QsIGkpID0+IHtcbiAgICAgICAgY29uc3QgW2lucHV0cywgaW5wdXRFcnJvcl0gPSB1bndyYXBJZk5vdE11bHRpKHBhdGhzLCBpbnB1dExpc3QubWFwKCh7IGlkLCBwcm9wZXJ0eSwgcGF0aDogcGF0aF8gfSkgPT4gKHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICB2YWx1ZTogcGF0aChbLi4ucGF0aF8sICdwcm9wcycsIHByb3BlcnR5XSwgbGF5b3V0KVxuICAgICAgICB9KSksIHNwZWNzW2ldLCBjYi5hbnlWYWxzLCBkZXBUeXBlKTtcbiAgICAgICAgaWYgKGlzTXVsdGlWYWx1ZWQoc3BlY3NbaV0pICYmICFpbnB1dHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBlbXB0eU11bHRpVmFsdWVzKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0RXJyb3IpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKGlucHV0RXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnB1dHM7XG4gICAgfSk7XG4gICAgaWYgKGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGFsbG93QWxsTWlzc2luZyAmJlxuICAgICAgICAgICAgZXJyb3JzLmxlbmd0aCArIGVtcHR5TXVsdGlWYWx1ZXMgPT09IGlucHV0VmFscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgYXQgbGVhc3Qgb25lIG5vbi1tdWx0aXZhbHVlZCBpbnB1dCwgYnV0IGFsbCBzaW1wbGUgYW5kXG4gICAgICAgICAgICAvLyBtdWx0aS12YWx1ZWQgaW5wdXRzIGFyZSBtaXNzaW5nLlxuICAgICAgICAgICAgLy8gKGlmIGFsbCBpbnB1dHMgYXJlIG11bHRpdmFsdWVkIGFuZCBhbGwgbWlzc2luZyB3ZSBzdGlsbCByZXR1cm5cbiAgICAgICAgICAgIC8vIHRoZW0gYXMgbm9ybWFsLCBhbmQgZmlyZSB0aGUgY2FsbGJhY2suKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUgd2UgaGF2ZSBzb21lIG1pc3NpbmcgYW5kIHNvbWUgcHJlc2VudCBpbnB1dHMuXG4gICAgICAgIC8vIE9yIGFsbCBtaXNzaW5nIGluIGEgY29udGV4dCB0aGF0IGRvZXNuJ3QgYWxsb3cgdGhpcy5cbiAgICAgICAgLy8gVGhhdCdzIGEgcmVhbCBwcm9ibGVtLCBzbyB0aHJvdyB0aGUgZmlyc3QgbWVzc2FnZSBhcyBhbiBlcnJvci5cbiAgICAgICAgcmVmRXJyKGVycm9ycywgcGF0aHMpO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRWYWxzO1xufVxuZnVuY3Rpb24gcmVmRXJyKGVycm9ycywgcGF0aHMpIHtcbiAgICBjb25zdCBlcnIgPSBlcnJvcnNbMF07XG4gICAgaWYgKGVyci5pbmRleE9mKCdsb2dnZWQgYWJvdmUnKSAhPT0gLTEpIHtcbiAgICAgICAgLy8gV2lsZGNhcmQgcmVmZXJlbmNlIGVycm9ycyBtZW50aW9uIGEgbGlzdCBvZiB3aWxkY2FyZCBzcGVjcyBsb2dnZWRcbiAgICAgICAgLy8gVE9ETzogdW53cmFwcGVkIGxpc3Qgb2Ygd2lsZGNhcmQgaWRzP1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yKHBhdGhzLm9ianMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoZXJyKTtcbn1cbmNvbnN0IGdldFZhbHMgPSAoaW5wdXQpID0+IEFycmF5LmlzQXJyYXkoaW5wdXQpID8gcGx1Y2soJ3ZhbHVlJywgaW5wdXQpIDogaW5wdXQudmFsdWU7XG5jb25zdCB6aXBJZkFycmF5ID0gKGEsIGIpID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgICAvLyBGb3IgY2xpZW50LXNpZGUgY2FsbGJhY2tzIHdpdGggbXVsdGlwbGUgT3V0cHV0cywgb25seSByZXR1cm4gYSBzaW5nbGUgZGFzaF9jbGllbnRzaWRlLm5vX3VwZGF0ZVxuICAgICAgICBpZiAoYiA9PT0gd2luZG93LmRhc2hfY2xpZW50c2lkZS5ub191cGRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB6aXAoYSwgW2JdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gemlwKGEsIGIpO1xuICAgIH1cbiAgICByZXR1cm4gW1thLCBiXV07XG59O1xuZnVuY3Rpb24gY2xlYW5PdXRwdXRQcm9wKHByb3BlcnR5KSB7XG4gICAgcmV0dXJuIHByb3BlcnR5LnNwbGl0KCdAJylbMF07XG59XG5hc3luYyBmdW5jdGlvbiBoYW5kbGVDbGllbnRzaWRlKGRpc3BhdGNoLCBjbGllbnRzaWRlX2Z1bmN0aW9uLCBjb25maWcsIHBheWxvYWQpIHtcbiAgICBjb25zdCBkYyA9ICh3aW5kb3cuZGFzaF9jbGllbnRzaWRlID1cbiAgICAgICAgd2luZG93LmRhc2hfY2xpZW50c2lkZSB8fCB7fSk7XG4gICAgaWYgKCFkYy5ub191cGRhdGUpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRjLCAnbm9fdXBkYXRlJywge1xuICAgICAgICAgICAgdmFsdWU6IHsgZGVzY3JpcHRpb246ICdSZXR1cm4gdG8gcHJldmVudCB1cGRhdGluZyBhbiBPdXRwdXQuJyB9LFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGMsICdQcmV2ZW50VXBkYXRlJywge1xuICAgICAgICAgICAgdmFsdWU6IHsgZGVzY3JpcHRpb246ICdUaHJvdyB0byBwcmV2ZW50IHVwZGF0aW5nIGFsbCBPdXRwdXRzLicgfSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBpbnB1dHMsIG91dHB1dHMsIHN0YXRlIH0gPSBwYXlsb2FkO1xuICAgIGNvbnN0IHJlcXVlc3RUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBpbnB1dERpY3QgPSBpbnB1dHNUb0RpY3QoaW5wdXRzKTtcbiAgICBjb25zdCBzdGF0ZURpY3QgPSBpbnB1dHNUb0RpY3Qoc3RhdGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGxldCBzdGF0dXMgPSBTVEFUVVMuT0s7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBuYW1lc3BhY2UsIGZ1bmN0aW9uX25hbWUgfSA9IGNsaWVudHNpZGVfZnVuY3Rpb247XG4gICAgICAgIGxldCBhcmdzID0gaW5wdXRzLm1hcChnZXRWYWxzKTtcbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICBhcmdzID0gY29uY2F0KGFyZ3MsIHN0YXRlLm1hcChnZXRWYWxzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0dXAgY2FsbGJhY2sgY29udGV4dFxuICAgICAgICBkYy5jYWxsYmFja19jb250ZXh0ID0ge307XG4gICAgICAgIGRjLmNhbGxiYWNrX2NvbnRleHQudHJpZ2dlcmVkID0gcGF5bG9hZC5jaGFuZ2VkUHJvcElkcy5tYXAocHJvcF9pZCA9PiAoe1xuICAgICAgICAgICAgcHJvcF9pZDogcHJvcF9pZCxcbiAgICAgICAgICAgIHZhbHVlOiBpbnB1dERpY3RbcHJvcF9pZF1cbiAgICAgICAgfSkpO1xuICAgICAgICBkYy5jYWxsYmFja19jb250ZXh0LnRyaWdnZXJlZF9pZCA9IGdldFRyaWdnZXJlZElkKHBheWxvYWQuY2hhbmdlZFByb3BJZHMpO1xuICAgICAgICBkYy5jYWxsYmFja19jb250ZXh0LmlucHV0c19saXN0ID0gaW5wdXRzO1xuICAgICAgICBkYy5jYWxsYmFja19jb250ZXh0LmlucHV0cyA9IGlucHV0RGljdDtcbiAgICAgICAgZGMuY2FsbGJhY2tfY29udGV4dC5zdGF0ZXNfbGlzdCA9IHN0YXRlO1xuICAgICAgICBkYy5jYWxsYmFja19jb250ZXh0LnN0YXRlcyA9IHN0YXRlRGljdDtcbiAgICAgICAgZGMuY2FsbGJhY2tfY29udGV4dC5vdXRwdXRzX2xpc3QgPSBvdXRwdXRzO1xuICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSBkY1tuYW1lc3BhY2VdW2Z1bmN0aW9uX25hbWVdKC4uLmFyZ3MpO1xuICAgICAgICBkZWxldGUgZGMuY2FsbGJhY2tfY29udGV4dDtcbiAgICAgICAgaWYgKHR5cGVvZiByZXR1cm5WYWx1ZT8udGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBhd2FpdCByZXR1cm5WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3V0cHV0cykge1xuICAgICAgICAgICAgemlwSWZBcnJheShvdXRwdXRzLCByZXR1cm5WYWx1ZSkuZm9yRWFjaCgoW291dGksIHJldGldKSA9PiB7XG4gICAgICAgICAgICAgICAgemlwSWZBcnJheShvdXRpLCByZXRpKS5mb3JFYWNoKChbb3V0aWosIHJldGlqXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGlkLCBwcm9wZXJ0eSB9ID0gb3V0aWo7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkU3RyID0gc3RyaW5naWZ5SWQoaWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhRm9ySWQgPSAocmVzdWx0W2lkU3RyXSA9IHJlc3VsdFtpZFN0cl0gfHwge30pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmV0aWogIT09IGRjLm5vX3VwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZvcklkW2NsZWFuT3V0cHV0UHJvcChwcm9wZXJ0eSldID0gcmV0aWo7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlID09PSBkYy5QcmV2ZW50VXBkYXRlKSB7XG4gICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVMuUFJFVkVOVF9VUERBVEU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVMuQ0xJRU5UU0lERV9FUlJPUjtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIGRlbGV0ZSBkYy5jYWxsYmFja19jb250ZXh0O1xuICAgICAgICAvLyBTZXR0aW5nIHNlcnZlciA9IGNsaWVudCBmb3JjZXMgbmV0d29yayA9IDBcbiAgICAgICAgY29uc3QgdG90YWxUaW1lID0gRGF0ZS5ub3coKSAtIHJlcXVlc3RUaW1lO1xuICAgICAgICBjb25zdCByZXNvdXJjZXMgPSB7XG4gICAgICAgICAgICBfX2Rhc2hfc2VydmVyOiB0b3RhbFRpbWUsXG4gICAgICAgICAgICBfX2Rhc2hfY2xpZW50OiB0b3RhbFRpbWUsXG4gICAgICAgICAgICBfX2Rhc2hfdXBsb2FkOiAwLFxuICAgICAgICAgICAgX19kYXNoX2Rvd25sb2FkOiAwXG4gICAgICAgIH07XG4gICAgICAgIGlmIChjb25maWcudWkpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHVwZGF0ZVJlc291cmNlVXNhZ2Uoe1xuICAgICAgICAgICAgICAgIGlkOiBwYXlsb2FkLm91dHB1dCxcbiAgICAgICAgICAgICAgICB1c2FnZTogcmVzb3VyY2VzLFxuICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgaW5wdXRzLFxuICAgICAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNvbXBvbmVudChjb21wb25lbnRfaWQsIHByb3BzLCBjYikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZGlzcGF0Y2gsIGdldFN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHsgcGF0aHMsIGNvbmZpZyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UGF0aCA9IGdldFBhdGgocGF0aHMsIGNvbXBvbmVudF9pZCk7XG4gICAgICAgIGlmICghY29tcG9uZW50UGF0aCkge1xuICAgICAgICAgICAgaWYgKCFjb25maWcuc3VwcHJlc3NfY2FsbGJhY2tfZXhjZXB0aW9ucykge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoZGlzcGF0Y2gpKCdJRCBydW5uaW5nIGNvbXBvbmVudCBub3QgZm91bmQgaW4gbGF5b3V0JywgW1xuICAgICAgICAgICAgICAgICAgICAnQ29tcG9uZW50IGRlZmluZWQgaW4gcnVubmluZyBrZXl3b3JkIG5vdCBmb3VuZCBpbiBsYXlvdXQuJyxcbiAgICAgICAgICAgICAgICAgICAgYENvbXBvbmVudCBpZDogXCIke3N0cmluZ2lmeUlkKGNvbXBvbmVudF9pZCl9XCJgLFxuICAgICAgICAgICAgICAgICAgICAnVGhpcyBJRCB3YXMgdXNlZCBpbiB0aGUgY2FsbGJhY2socykgZm9yIE91dHB1dChzKTonLFxuICAgICAgICAgICAgICAgICAgICBgJHtjYi5vdXRwdXR9YCxcbiAgICAgICAgICAgICAgICAgICAgJ1lvdSBjYW4gc3VwcHJlc3MgdGhpcyBleGNlcHRpb24gYnkgc2V0dGluZycsXG4gICAgICAgICAgICAgICAgICAgICdgc3VwcHJlc3NfY2FsbGJhY2tfZXhjZXB0aW9ucz1UcnVlYC4nXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHN0b3AgZnVydGhlciBwcm9jZXNzaW5nIGJlY2F1c2UgZnVuY3Rpb25zIGZ1cnRoZXIgb25cbiAgICAgICAgICAgIC8vIGNhbid0IG9wZXJhdGUgb24gYW4gJ3VuZGVmaW5lZCcgb2JqZWN0LCBhbmQgdGhleSB3aWxsIHRocm93IGFuXG4gICAgICAgICAgICAvLyBlcnJvci5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkaXNwYXRjaCh1cGRhdGVQcm9wcyh7XG4gICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgIGl0ZW1wYXRoOiBjb21wb25lbnRQYXRoLFxuICAgICAgICAgICAgcmVuZGVyVHlwZTogJ2NhbGxiYWNrJ1xuICAgICAgICB9KSk7XG4gICAgICAgIGRpc3BhdGNoKG5vdGlmeU9ic2VydmVycyh7IGlkOiBjb21wb25lbnRfaWQsIHByb3BzIH0pKTtcbiAgICB9O1xufVxuLyoqXG4gKiBVcGRhdGUgYSBjb21wb25lbnQgcHJvcHMgd2l0aCBgcnVubmluZ2AvYHByb2dyZXNzYC9gc2V0X3Byb3BzYCBjYWxscy5cbiAqXG4gKiBAcGFyYW0gb3V0cHV0cyBQcm9wcyB0byB1cGRhdGUuXG4gKiBAcGFyYW0gY2IgVGhlIG9yaWdpbmF0aW5nIGNhbGxiYWNrIGluZm8uXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBzaWRlVXBkYXRlKG91dHB1dHMsIGNiKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICAgICAgdG9QYWlycyhvdXRwdXRzKVxuICAgICAgICAgICAgLnJlZHVjZSgoYWNjLCBbaWQsIHZhbHVlXSwgaSkgPT4ge1xuICAgICAgICAgICAgbGV0IGNvbXBvbmVudElkID0gaWQsIHByb3BOYW1lLCByZXBsYWNlZElkcyA9IFtdO1xuICAgICAgICAgICAgaWYgKGlkLnN0YXJ0c1dpdGgoJ3snKSkge1xuICAgICAgICAgICAgICAgIFtjb21wb25lbnRJZCwgcHJvcE5hbWVdID0gcGFyc2VQTUNJZChpZCk7XG4gICAgICAgICAgICAgICAgcmVwbGFjZWRJZHMgPSByZXBsYWNlUE1DKGNvbXBvbmVudElkLCBjYiwgaSwgZ2V0U3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaWQuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgICAgIFtjb21wb25lbnRJZCwgcHJvcE5hbWVdID0gaWQuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gcHJvcE5hbWUgPyB7IFtwcm9wTmFtZV06IHZhbHVlIH0gOiB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChyZXBsYWNlZElkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBhY2MucHVzaChbY29tcG9uZW50SWQsIHByb3BzXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXBsYWNlZElkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBhY2MucHVzaChbcmVwbGFjZWRJZHNbMF0sIHByb3BzXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXBsYWNlZElkcy5mb3JFYWNoKChyZXApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYWNjLnB1c2goW3JlcCwgcHJvcHNdKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFtdKVxuICAgICAgICAgICAgLmZvckVhY2goKFtpZCwgaWRQcm9wc10pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFBhdGggPSBnZXRQYXRoKHN0YXRlLnBhdGhzLCBpZCk7XG4gICAgICAgICAgICBsZXQgb2xkQ29tcG9uZW50ID0geyBwcm9wczoge30gfTtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnRQYXRoKSB7XG4gICAgICAgICAgICAgICAgb2xkQ29tcG9uZW50ID0gZ2V0Q29tcG9uZW50TGF5b3V0KGNvbXBvbmVudFBhdGgsIHN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9sZFByb3BzID0gb2xkQ29tcG9uZW50Py5wcm9wcyB8fCB7fTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGNoZWRQcm9wcyA9IHBhcnNlUGF0Y2hQcm9wcyhpZFByb3BzLCBvbGRQcm9wcyk7XG4gICAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVDb21wb25lbnQoaWQsIHBhdGNoZWRQcm9wcywgY2IpKTtcbiAgICAgICAgICAgIGlmICghY29tcG9uZW50UGF0aCkge1xuICAgICAgICAgICAgICAgIC8vIENvbXBvbmVudCBkb2Vzbid0IGV4aXN0LCBkb2Vzbid0IG1hdHRlciBqdXN0IGFsbG93IHRoZVxuICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIHRvIGNvbnRpbnVlLlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3BhdGNoKHNldFBhdGhzKGNvbXB1dGVQYXRocyh7XG4gICAgICAgICAgICAgICAgLi4ub2xkQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgIHByb3BzOiB7IC4uLm9sZENvbXBvbmVudC5wcm9wcywgLi4ucGF0Y2hlZFByb3BzIH1cbiAgICAgICAgICAgIH0sIFsuLi5jb21wb25lbnRQYXRoXSwgc3RhdGUucGF0aHMsIHN0YXRlLnBhdGhzLmV2ZW50cykpKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGhhbmRsZVNlcnZlcnNpZGUoZGlzcGF0Y2gsIGhvb2tzLCBjb25maWcsIHBheWxvYWQsIGJhY2tncm91bmQsIGFkZGl0aW9uYWxBcmdzLCBnZXRTdGF0ZSwgcnVubmluZykge1xuICAgIGlmIChob29rcy5yZXF1ZXN0X3ByZSkge1xuICAgICAgICBob29rcy5yZXF1ZXN0X3ByZShwYXlsb2FkKTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcbiAgICBsZXQgY2FjaGVLZXk7XG4gICAgbGV0IGpvYjtcbiAgICBsZXQgcnVubmluZ09mZjtcbiAgICBsZXQgcHJvZ3Jlc3NEZWZhdWx0O1xuICAgIGxldCBtb3JlQXJncyA9IGFkZGl0aW9uYWxBcmdzO1xuICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgIGRpc3BhdGNoKHNpZGVVcGRhdGUocnVubmluZy5ydW5uaW5nLCBwYXlsb2FkKSk7XG4gICAgICAgIHJ1bm5pbmdPZmYgPSBydW5uaW5nLnJ1bm5pbmdPZmY7XG4gICAgfVxuICAgIGNvbnN0IGZldGNoQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBnZXRDU1JGSGVhZGVyKGNvbmZpZyk7XG4gICAgICAgIGxldCB1cmwgPSBgJHt1cmxCYXNlKGNvbmZpZyl9X2Rhc2gtdXBkYXRlLWNvbXBvbmVudGA7XG4gICAgICAgIGxldCBuZXdCb2R5ID0gYm9keTtcbiAgICAgICAgY29uc3QgYWRkQXJnID0gKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBsZXQgZGVsaW0gPSAnPyc7XG4gICAgICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgICAgICAgICAgICBkZWxpbSA9ICcmJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVybCA9IGAke3VybH0ke2RlbGltfSR7bmFtZX09JHt2YWx1ZX1gO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoY2FjaGVLZXkgfHwgam9iKSB7XG4gICAgICAgICAgICBpZiAoY2FjaGVLZXkpXG4gICAgICAgICAgICAgICAgYWRkQXJnKCdjYWNoZUtleScsIGNhY2hlS2V5KTtcbiAgICAgICAgICAgIGlmIChqb2IpXG4gICAgICAgICAgICAgICAgYWRkQXJnKCdqb2InLCBqb2IpO1xuICAgICAgICAgICAgLy8gY2xlYXIgaW5wdXRzIGFzIGJhY2tncm91bmQgY2FsbGJhY2sgZG9lc250IG5lZWQgaW5wdXRzLCBqdXN0IHZlcmlmeSBmb3IgY29udGV4dFxuICAgICAgICAgICAgY29uc3QgdG1wQm9keSA9IEpTT04ucGFyc2UobmV3Qm9keSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRtcEJvZHkuaW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdG1wQm9keS5pbnB1dHNbaV1bJ3ZhbHVlJ10gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAodG1wQm9keT8uc3RhdGUgfHwgW10pLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdG1wQm9keS5zdGF0ZVtpXVsndmFsdWUnXSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdCb2R5ID0gSlNPTi5zdHJpbmdpZnkodG1wQm9keSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vcmVBcmdzKSB7XG4gICAgICAgICAgICBtb3JlQXJncy5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IGFkZEFyZyhrZXksIHZhbHVlKSk7XG4gICAgICAgICAgICBtb3JlQXJncyA9IG1vcmVBcmdzLmZpbHRlcigoW18sIF9fLCBzaW5nbGVdKSA9PiAhc2luZ2xlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmV0Y2godXJsLCBtZXJnZURlZXBSaWdodChjb25maWcuZmV0Y2gsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIGJvZHk6IG5ld0JvZHlcbiAgICAgICAgfSkpO1xuICAgIH07XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlT3V0cHV0ID0gKHJlcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBzdGF0dXMgfSA9IHJlcztcbiAgICAgICAgICAgIGlmIChqb2IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFja0pvYiA9IGdldFN0YXRlKCkuY2FsbGJhY2tKb2JzW2pvYl07XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrSm9iPy5vdXRkYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChyZW1vdmVDYWxsYmFja0pvYih7IGpvYklkOiBqb2IgfSkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7fSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gcmVjb3JkUHJvZmlsZShyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnVpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGxiYWNrIHByb2ZpbGluZyAtIG9ubHkgcmVsZXZhbnQgaWYgd2UncmUgc2hvd2luZyB0aGUgZGVidWcgdWlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX3NlcnZlcjogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fZGFzaF9jbGllbnQ6IERhdGUubm93KCkgLSByZXF1ZXN0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fZGFzaF91cGxvYWQ6IGJvZHkubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgX19kYXNoX2Rvd25sb2FkOiBOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KCdDb250ZW50LUxlbmd0aCcpKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1pbmdIZWFkZXJzID0gcmVzLmhlYWRlcnMuZ2V0KCdTZXJ2ZXItVGltaW5nJykgfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIHRpbWluZ0hlYWRlcnMuc3BsaXQoJywnKS5mb3JFYWNoKChoZWFkZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBoZWFkZXIuc3BsaXQoJzsnKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR1ciA9IGhlYWRlci5tYXRjaCgvO2R1cj1bMC05Ll0rLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzW25hbWVdID0gTnVtYmVyKGR1clswXS5zbGljZSg1KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVSZXNvdXJjZVVzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBwYXlsb2FkLm91dHB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlOiByZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IHBheWxvYWQuaW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHBheWxvYWQuc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZpbmlzaExpbmUgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbXVsdGksIHJlc3BvbnNlIH0gPSBkYXRhO1xuICAgICAgICAgICAgICAgIGlmIChob29rcy5yZXF1ZXN0X3Bvc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9va3MucmVxdWVzdF9wb3N0KHBheWxvYWQsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAobXVsdGkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IG91dHB1dCB9ID0gcGF5bG9hZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSBvdXRwdXQuc3Vic3RyKDAsIG91dHB1dC5sYXN0SW5kZXhPZignLicpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0geyBbaWRdOiByZXNwb25zZS5wcm9wcyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWNvcmRQcm9maWxlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlSm9iID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChqb2IpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gocmVtb3ZlQ2FsbGJhY2tKb2IoeyBqb2JJZDogam9iIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmdPZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goc2lkZVVwZGF0ZShydW5uaW5nT2ZmLCBwYXlsb2FkKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goc2lkZVVwZGF0ZShwcm9ncmVzc0RlZmF1bHQsIHBheWxvYWQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gU1RBVFVTLk9LKSB7XG4gICAgICAgICAgICAgICAgcmVzLmpzb24oKS50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2FjaGVLZXkgJiYgZGF0YS5jYWNoZUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVLZXkgPSBkYXRhLmNhY2hlS2V5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICgham9iICYmIGRhdGEuam9iKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqb2JJbmZvID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYklkOiBkYXRhLmpvYixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUtleTogZGF0YS5jYWNoZUtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxJbnB1dHM6IGRhdGEuY2FuY2VsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzRGVmYXVsdDogZGF0YS5wcm9ncmVzc0RlZmF1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkLm91dHB1dHMpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goYWRkQ2FsbGJhY2tKb2Ioam9iSW5mbykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgam9iID0gZGF0YS5qb2I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuc2lkZVVwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goc2lkZVVwZGF0ZShkYXRhLnNpZGVVcGRhdGUsIHBheWxvYWQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5wcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goc2lkZVVwZGF0ZShkYXRhLnByb2dyZXNzLCBwYXlsb2FkKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9ncmVzc0RlZmF1bHQgJiYgZGF0YS5wcm9ncmVzc0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzRGVmYXVsdCA9IGRhdGEucHJvZ3Jlc3NEZWZhdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghYmFja2dyb3VuZCB8fCBkYXRhLnJlc3BvbnNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmRpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChkYXRhLmRpc3QubWFwKGxvYWRMaWJyYXJ5KSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlSm9iKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaExpbmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUpvYigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaExpbmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQb2xsIGNoYWluLlxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChoYW5kbGUsIGJhY2tncm91bmQuaW50ZXJ2YWwgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYmFja2dyb3VuZC5pbnRlcnZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNTAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RhdHVzID09PSBTVEFUVVMuUFJFVkVOVF9VUERBVEUpIHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZUpvYigpO1xuICAgICAgICAgICAgICAgIHJlY29yZFByb2ZpbGUoe30pO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoe30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tcGxldGVKb2IoKTtcbiAgICAgICAgICAgICAgICByZWplY3QocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGFuZGxlRXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLnVpKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2godXBkYXRlUmVzb3VyY2VVc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBwYXlsb2FkLm91dHB1dCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBTVEFUVVMuTk9fUkVTUE9OU0UsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDoge30sXG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogcGF5bG9hZC5pbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiBwYXlsb2FkLnN0YXRlXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQ2FsbGJhY2sgZmFpbGVkOiB0aGUgc2VydmVyIGRpZCBub3QgcmVzcG9uZC4nKSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGhhbmRsZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGZldGNoQ2FsbGJhY2soKS50aGVuKGhhbmRsZU91dHB1dCwgaGFuZGxlRXJyb3IpO1xuICAgICAgICB9O1xuICAgICAgICBoYW5kbGUoKTtcbiAgICB9KTtcbn1cbi8qKlxuICogSGFuZGxlIHNlcnZlcnNpZGUgY2FsbGJhY2sgdmlhIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICpcbiAqIFVzZXMgdGhlIFNoYXJlZFdvcmtlciB0byBzZW5kIHRoZSBjYWxsYmFjayByZXF1ZXN0IHRocm91Z2ggdGhlIHBlcnNpc3RlbnRcbiAqIFdlYlNvY2tldCBjb25uZWN0aW9uIGluc3RlYWQgb2YgSFRUUCBQT1NULlxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVXZWJzb2NrZXRDYWxsYmFjayhkaXNwYXRjaCwgaG9va3MsIGNvbmZpZywgcGF5bG9hZCwgcnVubmluZykge1xuICAgIGlmIChob29rcy5yZXF1ZXN0X3ByZSkge1xuICAgICAgICBob29rcy5yZXF1ZXN0X3ByZShwYXlsb2FkKTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxldCBydW5uaW5nT2ZmO1xuICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgIGRpc3BhdGNoKHNpZGVVcGRhdGUocnVubmluZy5ydW5uaW5nLCBwYXlsb2FkKSk7XG4gICAgICAgIHJ1bm5pbmdPZmYgPSBydW5uaW5nLnJ1bm5pbmdPZmY7XG4gICAgfVxuICAgIGNvbnN0IHdvcmtlckNsaWVudCA9IGdldFdvcmtlckNsaWVudCgpO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEVuc3VyZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZFxuICAgICAgICBhd2FpdCB3b3JrZXJDbGllbnQuZW5zdXJlQ29ubmVjdGVkKGNvbmZpZyk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd29ya2VyQ2xpZW50LnNlbmRDYWxsYmFjayhwYXlsb2FkKTtcbiAgICAgICAgLy8gSGFuZGxlIHJ1bm5pbmcgb2ZmIHN0YXRlXG4gICAgICAgIGlmIChydW5uaW5nT2ZmKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKHJ1bm5pbmdPZmYsIHBheWxvYWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAncHJldmVudF91cGRhdGUnKSB7XG4gICAgICAgICAgICAvLyBSZWNvcmQgdGltaW5nIGZvciBwcm9maWxpbmdcbiAgICAgICAgICAgIGlmIChjb25maWcudWkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbFRpbWUgPSBEYXRlLm5vdygpIC0gcmVxdWVzdFRpbWU7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2godXBkYXRlUmVzb3VyY2VVc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBwYXlsb2FkLm91dHB1dCxcbiAgICAgICAgICAgICAgICAgICAgdXNhZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fZGFzaF9zZXJ2ZXI6IHRvdGFsVGltZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fZGFzaF9jbGllbnQ6IHRvdGFsVGltZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fZGFzaF91cGxvYWQ6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfZG93bmxvYWQ6IDBcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBTVEFUVVMuUFJFVkVOVF9VUERBVEUsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDoge30sXG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogcGF5bG9hZC5pbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiBwYXlsb2FkLnN0YXRlXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5tZXNzYWdlIHx8ICdDYWxsYmFjayBlcnJvcicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIGNhbGxiYWNrIGRhdGEgLSBzdHJ1Y3R1cmUgaXMge211bHRpOiBib29sZWFuLCByZXNwb25zZTogey4uLn19XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrRGF0YSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgIC8vIEhhbmRsZSBzaWRlVXBkYXRlIGlmIHByZXNlbnRcbiAgICAgICAgaWYgKGNhbGxiYWNrRGF0YT8uc2lkZVVwZGF0ZSkge1xuICAgICAgICAgICAgZGlzcGF0Y2goc2lkZVVwZGF0ZShjYWxsYmFja0RhdGEuc2lkZVVwZGF0ZSwgcGF5bG9hZCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIGFjdHVhbCBvdXRwdXRzIGZyb20gdGhlIHJlc3BvbnNlXG4gICAgICAgIC8vIEZvcm1hdCBpcyBzaW1pbGFyIHRvIEhUVFAgcGF0aCdzIGZpbmlzaExpbmUgZnVuY3Rpb25cbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgY29uc3QgeyBtdWx0aSwgcmVzcG9uc2U6IGNhbGxiYWNrUmVzcG9uc2UgfSA9IGNhbGxiYWNrRGF0YSB8fCB7fTtcbiAgICAgICAgaWYgKGhvb2tzLnJlcXVlc3RfcG9zdCkge1xuICAgICAgICAgICAgaG9va3MucmVxdWVzdF9wb3N0KHBheWxvYWQsIGNhbGxiYWNrUmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtdWx0aSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gY2FsbGJhY2tSZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFNpbmdsZSBvdXRwdXQgLSBjb252ZXJ0IHRvIHRoZSBleHBlY3RlZCBmb3JtYXRcbiAgICAgICAgICAgIGNvbnN0IHsgb3V0cHV0IH0gPSBwYXlsb2FkO1xuICAgICAgICAgICAgY29uc3QgaWQgPSBvdXRwdXQuc3Vic3RyKDAsIG91dHB1dC5sYXN0SW5kZXhPZignLicpKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IHsgW2lkXTogY2FsbGJhY2tSZXNwb25zZT8ucHJvcHMgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWNvcmQgdGltaW5nIGZvciBwcm9maWxpbmdcbiAgICAgICAgaWYgKGNvbmZpZy51aSkge1xuICAgICAgICAgICAgY29uc3QgdG90YWxUaW1lID0gRGF0ZS5ub3coKSAtIHJlcXVlc3RUaW1lO1xuICAgICAgICAgICAgZGlzcGF0Y2godXBkYXRlUmVzb3VyY2VVc2FnZSh7XG4gICAgICAgICAgICAgICAgaWQ6IHBheWxvYWQub3V0cHV0LFxuICAgICAgICAgICAgICAgIHVzYWdlOiB7XG4gICAgICAgICAgICAgICAgICAgIF9fZGFzaF9zZXJ2ZXI6IHRvdGFsVGltZSxcbiAgICAgICAgICAgICAgICAgICAgX19kYXNoX2NsaWVudDogdG90YWxUaW1lLFxuICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfdXBsb2FkOiAwLFxuICAgICAgICAgICAgICAgICAgICBfX2Rhc2hfZG93bmxvYWQ6IDBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN0YXR1czogU1RBVFVTLk9LLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogcmVzdWx0IHx8IHt9LFxuICAgICAgICAgICAgICAgIGlucHV0czogcGF5bG9hZC5pbnB1dHMsXG4gICAgICAgICAgICAgICAgc3RhdGU6IHBheWxvYWQuc3RhdGVcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0IHx8IHt9O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSGFuZGxlIHJ1bm5pbmcgb2ZmIHN0YXRlIG9uIGVycm9yXG4gICAgICAgIGlmIChydW5uaW5nT2ZmKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChzaWRlVXBkYXRlKHJ1bm5pbmdPZmYsIHBheWxvYWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLnVpKSB7XG4gICAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVSZXNvdXJjZVVzYWdlKHtcbiAgICAgICAgICAgICAgICBpZDogcGF5bG9hZC5vdXRwdXQsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBTVEFUVVMuTk9fUkVTUE9OU0UsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiB7fSxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHBheWxvYWQuaW5wdXRzLFxuICAgICAgICAgICAgICAgIHN0YXRlOiBwYXlsb2FkLnN0YXRlXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuZnVuY3Rpb24gaW5wdXRzVG9EaWN0KGlucHV0c19saXN0KSB7XG4gICAgLy8gUG9ydGVkIGRpcmVjdGx5IGZyb20gX3V0aWxzLnB5LCBpbnB1dHNfdG9fZGljdFxuICAgIC8vIHRha2VzIGFuIGFycmF5IG9mIGlucHV0cyAoc29tZSBpbnB1dHMgbWF5IGJlIGFuIGFycmF5KVxuICAgIC8vIHJldHVybnMgYW4gT2JqZWN0IChtYXApOlxuICAgIC8vICBrZXlzIG9mIHRoZSBmb3JtIGBpZC5wcm9wZXJ0eWAgb3IgYHtcImlkXCI6IDB9LnByb3BlcnR5YFxuICAgIC8vICB2YWx1ZXMgY29udGFpbiB0aGUgcHJvcGVydHkgdmFsdWVcbiAgICBpZiAoIWlucHV0c19saXN0KSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dHNfbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dHNfbGlzdFtpXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0c2kgPSBpbnB1dHNfbGlzdFtpXTtcbiAgICAgICAgICAgIGZvciAobGV0IGlpID0gMDsgaWkgPCBpbnB1dHNpLmxlbmd0aDsgaWkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkX3N0ciA9IGAke3N0cmluZ2lmeUlkKGlucHV0c2lbaWldLmlkKX0uJHtpbnB1dHNpW2lpXS5wcm9wZXJ0eX1gO1xuICAgICAgICAgICAgICAgIGlucHV0c1tpZF9zdHJdID0gaW5wdXRzaVtpaV0udmFsdWUgPz8gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlkX3N0ciA9IGAke3N0cmluZ2lmeUlkKGlucHV0c19saXN0W2ldLmlkKX0uJHtpbnB1dHNfbGlzdFtpXS5wcm9wZXJ0eX1gO1xuICAgICAgICAgICAgaW5wdXRzW2lkX3N0cl0gPSBpbnB1dHNfbGlzdFtpXS52YWx1ZSA/PyBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHM7XG59XG5mdW5jdGlvbiBnZXRUcmlnZ2VyZWRJZCh0cmlnZ2VyZWQpIHtcbiAgICAvLyBmb3IgcmVndWxhciBjYWxsYmFja3MsICB0YWtlcyB0aGUgZmlyc3QgdHJpZ2dlcmVkIHByb3BfaWQsIGUuZy4gIFwiYnRuLm5fY2xpY2tzXCIgYW5kIHJldHVybnMgXCJidG5cIlxuICAgIC8vIGZvciBwYXR0ZXJuIG1hdGNoaW5nIGNhbGxiYWNrLCBlLmcuICd7XCJpbmRleFwiOjAsIFwidHlwZVwiOlwiYnRuXCJ9JyBhbmQgcmV0dXJucyB7aW5kZXg6MCwgdHlwZTogXCJidG5cIn0nXG4gICAgaWYgKHRyaWdnZXJlZCAmJiB0cmlnZ2VyZWQubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHRyaWcgPSB0cmlnZ2VyZWRbMF07XG4gICAgICAgIGxldCBjb21wb25lbnRJZDtcbiAgICAgICAgaWYgKHRyaWcuc3RhcnRzV2l0aCgneycpKSB7XG4gICAgICAgICAgICBjb21wb25lbnRJZCA9IEpTT04ucGFyc2UodHJpZy5zdWJzdHJpbmcoMCwgdHJpZy5sYXN0SW5kZXhPZignfScpICsgMSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29tcG9uZW50SWQgPSB0cmlnLnNwbGl0KCcuJylbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudElkO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlQ2FsbGJhY2soY2IsIGNvbmZpZywgaG9va3MsIHBhdGhzLCBsYXlvdXQsIHsgYWxsT3V0cHV0cyB9LCBkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICBjb25zdCB7IG91dHB1dCwgaW5wdXRzLCBzdGF0ZSwgY2xpZW50c2lkZV9mdW5jdGlvbiwgYmFja2dyb3VuZCwgZHluYW1pY19jcmVhdG9yIH0gPSBjYi5jYWxsYmFjaztcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBpblZhbHMgPSBmaWxsVmFscyhwYXRocywgbGF5b3V0LCBjYiwgaW5wdXRzLCAnSW5wdXQnLCB0cnVlKTtcbiAgICAgICAgLyogUHJldmVudCBjYWxsYmFjayBpZiB0aGVyZSdzIG5vIGlucHV0cyAqL1xuICAgICAgICBpZiAoaW5WYWxzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvblByb21pc2U6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IFtdO1xuICAgICAgICBjb25zdCBvdXRwdXRFcnJvcnMgPSBbXTtcbiAgICAgICAgYWxsT3V0cHV0cy5mb3JFYWNoKChvdXQsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtvdXRpLCBlcnJpXSA9IHVud3JhcElmTm90TXVsdGkocGF0aHMsIG1hcChwaWNrKFsnaWQnLCAncHJvcGVydHknXSksIG91dCksIGNiLmNhbGxiYWNrLm91dHB1dHNbaV0sIGNiLmFueVZhbHMsICdPdXRwdXQnKTtcbiAgICAgICAgICAgIG91dHB1dHMucHVzaChvdXRpKTtcbiAgICAgICAgICAgIGlmIChlcnJpKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0RXJyb3JzLnB1c2goZXJyaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3V0cHV0RXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGZsYXR0ZW4oaW5WYWxzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZWZFcnIob3V0cHV0RXJyb3JzLCBwYXRocyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGlzIGNhc2UgaXMgYWxsLWVtcHR5IG11bHRpdmFsdWVkIHdpbGRjYXJkIGlucHV0cyxcbiAgICAgICAgICAgIC8vIHdoaWNoIHdlIHdvdWxkIG5vcm1hbGx5IGZpcmUgdGhlIGNhbGxiYWNrIGZvciwgZXhjZXB0XG4gICAgICAgICAgICAvLyBzb21lIG91dHB1dHMgYXJlIG1pc3NpbmcuIFNvIGluc3RlYWQgd2UgdHJlYXQgaXQgbGlrZVxuICAgICAgICAgICAgLy8gcmVndWxhciBtaXNzaW5nIGlucHV0cyBhbmQganVzdCBzaWxlbnRseSBwcmV2ZW50IGl0LlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5jYixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Qcm9taXNlOiBudWxsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IF9fZXhlY3V0ZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRpbmdPdXRwdXRzID0gZmxhdHRlbihvdXRwdXRzKS5tYXAob3V0ID0+ICh7XG4gICAgICAgICAgICAgICAgcGF0aDogZ2V0UGF0aChwYXRocywgb3V0LmlkKSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogb3V0LnByb3BlcnR5Py5zcGxpdCgnQCcpWzBdLFxuICAgICAgICAgICAgICAgIGlkOiBzdHJpbmdpZnlJZChvdXQuaWQpXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBkaXNwYXRjaChsb2FkaW5nKGxvYWRpbmdPdXRwdXRzKSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZWRQcm9wSWRzID0ga2V5cyhjYi5jaGFuZ2VkUHJvcElkcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkQ2hhbmdlZFByb3BzSWRzID0gY2hhbmdlZFByb3BJZHMubWFwKHByb3BJZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wSWQuc3RhcnRzV2l0aCgneycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VQTUNJZChwcm9wSWQpWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wSWQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBpc011bHRpT3V0cHV0UHJvcChvdXRwdXQpID8gb3V0cHV0cyA6IG91dHB1dHNbMF0sXG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogaW5WYWxzLFxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkUHJvcElkcyxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkQ2hhbmdlZFByb3BzSWRzLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogY2IuY2FsbGJhY2suc3RhdGUubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGZpbGxWYWxzKHBhdGhzLCBsYXlvdXQsIGNiLCBzdGF0ZSwgJ1N0YXRlJylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAoY2xpZW50c2lkZV9mdW5jdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBoYW5kbGVDbGllbnRzaWRlKGRpc3BhdGNoLCBjbGllbnRzaWRlX2Z1bmN0aW9uLCBjb25maWcsIHBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGF0Y2ggbWV0aG9kb2xvZ3k6IGFsd2F5cyBydW4gdGhyb3VnaCBwYXJzZVBhdGNoUHJvcHMgZm9yIGVhY2ggb3V0cHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGF5b3V0ID0gZ2V0U3RhdGUoKS5sYXlvdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbGF0dGVuKG91dHB1dHMpLmZvckVhY2goKG91dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gY2xlYW5PdXRwdXRQcm9wKG91dC5wcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IGdldFBhdGgocGF0aHMsIG91dC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YVBhdGggPSBbc3RyaW5naWZ5SWQob3V0LmlkKSwgcHJvcE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dFZhbHVlID0gcGF0aChkYXRhUGF0aCwgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRQcm9wcyA9IHBhdGgob3V0cHV0UGF0aC5jb25jYXQoWydwcm9wcyddKSwgY3VycmVudExheW91dCkgfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UHJvcHMgPSBwYXJzZVBhdGNoUHJvcHMoeyBbcHJvcE5hbWVdOiBvdXRwdXRWYWx1ZSB9LCBvbGRQcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFzc29jUGF0aChkYXRhUGF0aCwgbmV3UHJvcHNbcHJvcE5hbWVdLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgcGF5bG9hZCB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3IsIHBheWxvYWQgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgbmV3Q29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgICAgIGxldCBuZXdIZWFkZXJzID0gbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgbGFzdEVycm9yO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxBcmdzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QganNvbk91dHB1dCA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQub3V0cHV0cyk7XG4gICAgICAgICAgICAgICAgdmFsdWVzKGdldFN0YXRlKCkuY2FsbGJhY2tKb2JzKS5mb3JFYWNoKChqb2IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25PdXRwdXQgPT09IGpvYi5vdXRwdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlcm1pbmF0ZSB0aGUgb2xkIGpvYnMgdGhhdCBhcmUgbm90IGNvbXBsZXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGFzIG91dGRhdGVkIGZvciB0aGUgY2FsbGJhY2sgcHJvbWlzZSB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzb2x2ZSBhbmQgcmVtb3ZlIGFmdGVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbEFyZ3MucHVzaChbJ29sZEpvYicsIGpvYi5qb2JJZCwgdHJ1ZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goc2V0Q2FsbGJhY2tKb2JPdXRkYXRlZCh7IGpvYklkOiBqb2Iuam9iSWQgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICgham9iLmNhbmNlbElucHV0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVyID0gaW50ZXJzZWN0aW9uKGpvYi5jYW5jZWxJbnB1dHMsIGNiLmNhbGxiYWNrLmlucHV0cyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnRlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxBcmdzLnB1c2goWydjYW5jZWxKb2InLCBqb2Iuam9iSWRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqb2IucHJvZ3Jlc3NEZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goc2lkZVVwZGF0ZShqb2IucHJvZ3Jlc3NEZWZhdWx0LCBwYXlsb2FkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBVc2UgV2ViU29ja2V0IGZvciBjYWxsYmFja3Mgd2hlbjpcbiAgICAgICAgICAgICAgICAvLyAxLiBHbG9iYWwgV2ViU29ja2V0IGlzIGVuYWJsZWQsIE9SXG4gICAgICAgICAgICAgICAgLy8gMi4gUGVyLWNhbGxiYWNrIHdlYnNvY2tldCBmbGFnIGlzIHNldCAoYW5kIFdlYlNvY2tldCBpcyBhdmFpbGFibGUpXG4gICAgICAgICAgICAgICAgLy8gKGJ1dCBuZXZlciBmb3IgYmFja2dyb3VuZCBjYWxsYmFja3MpXG4gICAgICAgICAgICAgICAgY29uc3QgdXNlV2ViU29ja2V0ID0gIWJhY2tncm91bmQgJiZcbiAgICAgICAgICAgICAgICAgICAgKGlzV2ViU29ja2V0RW5hYmxlZChjb25maWcpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoY2IuY2FsbGJhY2sud2Vic29ja2V0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNXZWJTb2NrZXRBdmFpbGFibGUoY29uZmlnKSkpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHJldHJ5ID0gMDsgcmV0cnkgPD0gTUFYX0FVVEhfUkVUUklFUzsgcmV0cnkrKykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlV2ViU29ja2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIFdlYlNvY2tldCBwYXRoIGZvciByZWFsLXRpbWUgY2FsbGJhY2tzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGF3YWl0IGhhbmRsZVdlYnNvY2tldENhbGxiYWNrKGRpc3BhdGNoLCBob29rcywgbmV3Q29uZmlnLCBwYXlsb2FkLCBjYi5jYWxsYmFjay5ydW5uaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0cmFkaXRpb25hbCBIVFRQIHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYXdhaXQgaGFuZGxlU2VydmVyc2lkZShkaXNwYXRjaCwgaG9va3MsIG5ld0NvbmZpZywgcGF5bG9hZCwgYmFja2dyb3VuZCwgYWRkaXRpb25hbEFyZ3MubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWRkaXRpb25hbEFyZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsIGdldFN0YXRlLCBjYi5jYWxsYmFjay5ydW5uaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdIZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goYWRkSHR0cEhlYWRlcnMobmV3SGVhZGVycykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF5b3V0IG1heSBoYXZlIGNoYW5nZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEUlk6IEFsd2F5cyBydW4gdGhyb3VnaCBwYXJzZVBhdGNoUHJvcHMgZm9yIGVhY2ggb3V0cHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGF5b3V0ID0gZ2V0U3RhdGUoKS5sYXlvdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbGF0dGVuKG91dHB1dHMpLmZvckVhY2goKG91dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gY2xlYW5PdXRwdXRQcm9wKG91dC5wcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IGdldFBhdGgocGF0aHMsIG91dC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YVBhdGggPSBbc3RyaW5naWZ5SWQob3V0LmlkKSwgcHJvcE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dFZhbHVlID0gcGF0aChkYXRhUGF0aCwgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRQcm9wcyA9IHBhdGgob3V0cHV0UGF0aC5jb25jYXQoWydwcm9wcyddKSwgY3VycmVudExheW91dCkgfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UHJvcHMgPSBwYXJzZVBhdGNoUHJvcHMoeyBbcHJvcE5hbWVdOiBvdXRwdXRWYWx1ZSB9LCBvbGRQcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFzc29jUGF0aChkYXRhUGF0aCwgbmV3UHJvcHNbcHJvcE5hbWVdLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR5bmFtaWNfY3JlYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZGlzcGF0Y2gocmVxdWVzdERlcGVuZGVuY2llcygpKSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhLCBwYXlsb2FkIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKHJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEVycm9yID0gcmVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJ5IDw9IE1BWF9BVVRIX1JFVFJJRVMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzLnN0YXR1cyA9PT0gU1RBVFVTLlVOQVVUSE9SSVpFRCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc3RhdHVzID09PSBTVEFUVVMuQkFEX1JFUVVFU1QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHkuaW5jbHVkZXMoSldUX0VYUElSRURfTUVTU0FHRSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvbGRKd3QgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5mZXRjaC5oZWFkZXJzLkF1dGhvcml6YXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRKd3QgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZmV0Y2guaGVhZGVycy5BdXRob3JpemF0aW9uLnN1YnN0cignQmVhcmVyICcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0p3dCA9IGF3YWl0IGhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3Qob2xkSnd0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdKd3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWFkZXJzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bmV3Snd0fWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbmZpZyA9IG1lcmdlRGVlcFJpZ2h0KGNvbmZpZywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogbmV3SGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB3ZSByZWFjaCBoZXJlIHdoZW4gd2UgcnVuIG91dCBvZiByZXRyaWVzLlxuICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBsYXN0RXJyb3IsIHBheWxvYWQ6IG51bGwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGVycm9yLCBwYXlsb2FkOiBudWxsIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChsb2FkZWQobG9hZGluZ091dHB1dHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmV3Q2IgPSB7XG4gICAgICAgICAgICAuLi5jYixcbiAgICAgICAgICAgIGV4ZWN1dGlvblByb21pc2U6IF9fZXhlY3V0ZSgpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXdDYjtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5jYixcbiAgICAgICAgICAgIGV4ZWN1dGlvblByb21pc2U6IHsgZXJyb3IsIHBheWxvYWQ6IG51bGwgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IGFsbCwgYXNzb2MsIGNvbmNhdCwgZGlmZmVyZW5jZSwgZmlsdGVyLCBmbGF0dGVuLCBpc0VtcHR5LCBrZXlzLCBtYXAsIG1lcmdlV2l0aCwgcGFydGl0aW9uLCBwYXRoLCBwaWNrQnksIHByb3BzLCByZWR1Y2UsIHppcE9iaiB9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7IGFkZEFsbFJlc29sdmVkRnJvbU91dHB1dHMsIGdldEFueVZhbHMsIGdldFVuZmlsdGVyZWRMYXlvdXRDYWxsYmFja3MsIGlkTWF0Y2gsIGlzTXVsdGlWYWx1ZWQsIHNwbGl0SWRBbmRQcm9wLCBzdHJpbmdpZnlJZCB9IGZyb20gJy4vZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7IGdldFBhdGggfSBmcm9tICcuL3BhdGhzJztcbmV4cG9ydCBjb25zdCBESVJFQ1QgPSAyO1xuZXhwb3J0IGNvbnN0IElORElSRUNUID0gMTtcbmV4cG9ydCBjb25zdCBtZXJnZU1heCA9IG1lcmdlV2l0aChNYXRoLm1heCk7XG5leHBvcnQgY29uc3QgY29tYmluZUlkQW5kUHJvcCA9ICh7IGlkLCBwcm9wZXJ0eSB9KSA9PiBgJHtzdHJpbmdpZnlJZChpZCl9LiR7cHJvcGVydHl9YDtcbmV4cG9ydCBmdW5jdGlvbiBnZXRDYWxsYmFja3NCeUlucHV0KGdyYXBocywgcGF0aHMsIGlkLCBwcm9wLCBjaGFuZ2VUeXBlLCB3aXRoUHJpb3JpdHkgPSB0cnVlKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IFtdO1xuICAgIGNvbnN0IGlkQW5kUHJvcCA9IGNvbWJpbmVJZEFuZFByb3AoeyBpZCwgcHJvcGVydHk6IHByb3AgfSk7XG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gc3RhbmRhcmQgaWQgdmVyc2lvblxuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSAoZ3JhcGhzLmlucHV0TWFwW2lkXSB8fCB7fSlbcHJvcF07XG4gICAgICAgIGlmICghY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2tzLmZvckVhY2goYWRkQWxsUmVzb2x2ZWRGcm9tT3V0cHV0cyhyZXNvbHZlRGVwcygpLCBwYXRocywgbWF0Y2hlcykpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gd2lsZGNhcmQgdmVyc2lvblxuICAgICAgICBjb25zdCBfa2V5cyA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IHZhbHMgPSBwcm9wcyhfa2V5cywgaWQpO1xuICAgICAgICBjb25zdCBrZXlTdHIgPSBfa2V5cy5qb2luKCcsJyk7XG4gICAgICAgIGNvbnN0IHBhdHRlcm5zID0gKGdyYXBocy5pbnB1dFBhdHRlcm5zW2tleVN0cl0gfHwge30pW3Byb3BdO1xuICAgICAgICBpZiAoIXBhdHRlcm5zKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcGF0dGVybnMuZm9yRWFjaChwYXR0ZXJuID0+IHtcbiAgICAgICAgICAgIGlmIChpZE1hdGNoKF9rZXlzLCB2YWxzLCBwYXR0ZXJuLnZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIGEgY2FsbGJhY2sncyBPdXRwdXRzIGhhdmUgbm8gTUFUQ0gga2V5cywgdGhlXG4gICAgICAgICAgICAgICAgLy8gdHJpZ2dlcmluZyBJbnB1dCdzIE1BVENIIHZhbHVlcyBhcmUgd2hhdCB1bmlxdWlmeSBlYWNoXG4gICAgICAgICAgICAgICAgLy8gZmlyaW5nJ3MgcmVzb2x2ZWRJZCAoc2VlIGFkZEFsbFJlc29sdmVkRnJvbU91dHB1dHMpLlxuICAgICAgICAgICAgICAgIC8vIENhbGxiYWNrcyB3aG9zZSBPdXRwdXRzIGRvIGNhcnJ5IE1BVENIIGtleXMgaWdub3JlIHRoaXNcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZSBzaW5jZSB0aGUgT3V0cHV0IHBhdHRlcm4gZHJpdmVzIHJlc29sdXRpb24uXG4gICAgICAgICAgICAgICAgY29uc3QgdHJpZ2dlckFueVZhbHMgPSBnZXRBbnlWYWxzKHBhdHRlcm4udmFsdWVzLCB2YWxzKTtcbiAgICAgICAgICAgICAgICBwYXR0ZXJuLmNhbGxiYWNrcy5mb3JFYWNoKGFkZEFsbFJlc29sdmVkRnJvbU91dHB1dHMocmVzb2x2ZURlcHMoX2tleXMsIHZhbHMsIHBhdHRlcm4udmFsdWVzKSwgcGF0aHMsIG1hdGNoZXMsIHRyaWdnZXJBbnlWYWxzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXRjaGVzLmZvckVhY2gobWF0Y2ggPT4ge1xuICAgICAgICBtYXRjaC5jaGFuZ2VkUHJvcElkc1tpZEFuZFByb3BdID0gY2hhbmdlVHlwZSB8fCBESVJFQ1Q7XG4gICAgICAgIGlmICh3aXRoUHJpb3JpdHkpIHtcbiAgICAgICAgICAgIG1hdGNoLnByaW9yaXR5ID0gZ2V0UHJpb3JpdHkoZ3JhcGhzLCBwYXRocywgbWF0Y2gpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1hdGNoZXM7XG59XG4vKlxuICogQnVpbGRzIGEgdHJlZSBvZiBhbGwgY2FsbGJhY2tzIHRoYXQgY2FuIGJlIHRyaWdnZXJlZCBieSB0aGUgcHJvdmlkZWQgY2FsbGJhY2suXG4gKiBVc2VzIHRoZSBudW1iZXIgb2YgY2FsbGJhY2tzIGF0IGVhY2ggdHJlZSBkZXB0aCBhbmQgdGhlIHRvdGFsIGRlcHRoIG9mIHRoZSB0cmVlXG4gKiB0byBjcmVhdGUgYSBzb3J0YWJsZSBwcmlvcml0eSBoYXNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJpb3JpdHkoZ3JhcGhzLCBwYXRocywgY2FsbGJhY2spIHtcbiAgICBsZXQgY2FsbGJhY2tzID0gW2NhbGxiYWNrXTtcbiAgICBjb25zdCB0b3VjaGVkT3V0cHV0cyA9IHt9O1xuICAgIGNvbnN0IHRvdWNoZWRDYklkcyA9IHt9O1xuICAgIGNvbnN0IHByaW9yaXR5ID0gW107XG4gICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgY2FsbGJhY2tzID0gZmlsdGVyKGMgPT4ge1xuICAgICAgICAgICAgY29uc3QgdG91Y2hlZCA9IHRvdWNoZWRDYklkc1tjLnJlc29sdmVkSWRdO1xuICAgICAgICAgICAgdG91Y2hlZENiSWRzW2MucmVzb2x2ZWRJZF0gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRvdWNoZWQ7XG4gICAgICAgIH0sIGNhbGxiYWNrcyk7XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSBmaWx0ZXIobyA9PiAhdG91Y2hlZE91dHB1dHNbY29tYmluZUlkQW5kUHJvcChvKV0sIGZsYXR0ZW4obWFwKGNiID0+IGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhwYXRocykpLCBjYWxsYmFja3MpKSk7XG4gICAgICAgIG91dHB1dHMuZm9yRWFjaChvID0+ICh0b3VjaGVkT3V0cHV0c1tjb21iaW5lSWRBbmRQcm9wKG8pXSA9IHRydWUpKTtcbiAgICAgICAgY2FsbGJhY2tzID0gZmxhdHRlbihtYXAoKHsgaWQsIHByb3BlcnR5IH0pID0+IGdldENhbGxiYWNrc0J5SW5wdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3BlcnR5LCBJTkRJUkVDVCwgZmFsc2UpLCBvdXRwdXRzKSk7XG4gICAgICAgIGlmIChjYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBwcmlvcml0eS5wdXNoKGNhbGxiYWNrcy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaW9yaXR5LnVuc2hpZnQocHJpb3JpdHkubGVuZ3RoKTtcbiAgICByZXR1cm4gbWFwKGkgPT4gTWF0aC5taW4oaSwgMzUpLnRvU3RyaW5nKDM2KSwgcHJpb3JpdHkpLmpvaW4oJycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbFN1YnNlcXVlbnRPdXRwdXRzRm9yQ2FsbGJhY2soZ3JhcGhzLCBwYXRocywgY2FsbGJhY2spIHtcbiAgICBsZXQgY2FsbGJhY2tzID0gW2NhbGxiYWNrXTtcbiAgICBsZXQgdG91Y2hlZE91dHB1dHMgPSB7fTtcbiAgICAvLyB0aGlzIHRyYXZlcnNlcyB0aGUgZ3JhcGggYWxsIHRoZSB3YXkgdG8gdGhlIGVuZFxuICAgIHdoaWxlIChjYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgIC8vIGRvbid0IGFkZCBpdCBpZiBpdCBhbHJlYWR5IGV4aXN0cyBiYXNlZCBvbiBpZCBhbmQgcHJvcHNcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IGZpbHRlcihvID0+ICF0b3VjaGVkT3V0cHV0c1tjb21iaW5lSWRBbmRQcm9wKG8pXSwgZmxhdHRlbihtYXAoY2IgPT4gZmxhdHRlbihjYi5nZXRPdXRwdXRzKHBhdGhzKSksIGNhbGxiYWNrcykpKTtcbiAgICAgICAgdG91Y2hlZE91dHB1dHMgPSByZWR1Y2UoKHRvdWNoZWQsIG8pID0+IGFzc29jKGNvbWJpbmVJZEFuZFByb3AobyksIHRydWUsIHRvdWNoZWQpLCB0b3VjaGVkT3V0cHV0cywgb3V0cHV0cyk7XG4gICAgICAgIGNhbGxiYWNrcyA9IGZsYXR0ZW4obWFwKCh7IGlkLCBwcm9wZXJ0eSB9KSA9PiBnZXRDYWxsYmFja3NCeUlucHV0KGdyYXBocywgcGF0aHMsIGlkLCBwcm9wZXJ0eSwgSU5ESVJFQ1QsIGZhbHNlKSwgb3V0cHV0cykpO1xuICAgIH1cbiAgICByZXR1cm4gdG91Y2hlZE91dHB1dHM7XG59XG5leHBvcnQgY29uc3QgZ2V0UmVhZHlDYWxsYmFja3MgPSAocGF0aHMsIGNhbmRpZGF0ZXMsIGNhbGxiYWNrcyA9IGNhbmRpZGF0ZXMsIGdyYXBocyA9IHt9KSA9PiB7XG4gICAgLy8gU2tpcCBpZiB0aGVyZSdzIG5vIGNhbmRpZGF0ZXNcbiAgICBpZiAoIWNhbmRpZGF0ZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLy8gRmluZCBhbGwgb3V0cHV0cyBvZiBhbGwgYWN0aXZlIGNhbGxiYWNrc1xuICAgIGNvbnN0IG91dHB1dHMgPSBtYXAoY29tYmluZUlkQW5kUHJvcCwgcmVkdWNlKChvLCBjYikgPT4gY29uY2F0KG8sIGZsYXR0ZW4oY2IuZ2V0T3V0cHV0cyhwYXRocykpKSwgW10sIGNhbGxiYWNrcykpO1xuICAgIC8vIE1ha2UgYG91dHB1dHNgIGhhc2ggdGFibGUgZm9yIGZhc3RlciBhY2Nlc3NcbiAgICBsZXQgb3V0cHV0c01hcCA9IHt9O1xuICAgIG91dHB1dHMuZm9yRWFjaChvdXRwdXQgPT4gKG91dHB1dHNNYXBbb3V0cHV0XSA9IHRydWUpKTtcbiAgICAvLyBmaW5kIGFsbCB0aGUgb3V0cHV0cyB0b3VjaGVkIGJ5IGFjdGl2ZUNhbGxiYWNrc1xuICAgIC8vIHJlbW92ZSB0aGlzIGNoZWNrIGlmIGdyYXBoIGlzIGFjY2Vzc2libGUgYWxsIHRoZSB0aW1lXG4gICAgaWYgKE9iamVjdC5rZXlzKGdyYXBocykubGVuZ3RoKSB7XG4gICAgICAgIC8vbm90IHN1cmUgaWYgZ3JhcGggd2lsbCBiZSBhY2Nlc3NpYmxlIGFsbCB0aGUgdGltZVxuICAgICAgICBjb25zdCBhbGxUb3VjaGVkT3V0cHV0cyA9IGZsYXR0ZW4obWFwKGNiID0+IGdldEFsbFN1YnNlcXVlbnRPdXRwdXRzRm9yQ2FsbGJhY2soZ3JhcGhzLCBwYXRocywgY2IpLCBjYWxsYmFja3MpKTtcbiAgICAgICAgLy8gb3ZlcnJyaWRlcyB0aGUgb3V0cHV0c01hcCwgd2lsbCBkdXBsaWNhdGUgY2FsbGJhY2tzIGZpbHRlcmVkXG4gICAgICAgIC8vIHRoaXMgaXMgb25seSBkb25lIHRvIHNpbGVuY2UgdHlwZXNjcmlwdCBlcnJvcnNcbiAgICAgICAgaWYgKGFsbFRvdWNoZWRPdXRwdXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG91dHB1dHNNYXAgPSBPYmplY3QuYXNzaWduKGFsbFRvdWNoZWRPdXRwdXRzWzBdLCAuLi5hbGxUb3VjaGVkT3V0cHV0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gUmFtZGEuSlMgYGRpZmZlcmVuY2VgIGZ1bmN0aW9uIGlzIHNsb3cgYmVjYXVzZSBpdCBjb21wYXJlcyBvYmplY3RzIGVudGlyZWx5XG4gICAgLy8gVGhpcyBjYXVzZSB0aGUgZm9sbG93aW5nIGBmaWx0ZXJgIHRvIGJlIGV4cG9uZW50aWFsbHkgc2xvdyBhcyB0aGUgbnVtYmVyIG9mIGlucHV0cyBvciBvdXRwdXRzIGdyb3dcbiAgICAvLyBXZSBjYW4gb3B0aW1pemUgdGhpcyBieSBjb21wYXJpbmcgb25seSB0aGUgYGlkK3Byb3BgIHBhcnQgb2YgdGhlIGlucHV0cyAmIG91dHB1dHMuXG4gICAgLy8gT3JpZ2luYWwgZGlmZmVyZW5jZSB0YWtlcyAzODBtcyBvbiBhdmVyYWdlIHRvIGNvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDIwMCBpbnB1dHMgYW5kIDEgb3V0cHV0LlxuICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gdGFrZXMgMS0ybXMgb24gYXZlcmFnZS5cbiAgICBjb25zdCBkaWZmZXJlbmNlQmFzZWRPbklkID0gKGlucHV0cywgb3V0cHV0cykgPT4gaW5wdXRzLmZpbHRlcihpbnB1dCA9PiAhb3V0cHV0cy5zb21lKG91dHB1dCA9PiBjb21iaW5lSWRBbmRQcm9wKGlucHV0KSA9PT0gY29tYmluZUlkQW5kUHJvcChvdXRwdXQpKSk7XG4gICAgLy8gRmluZCBgcmVxdWVzdGVkYCBjYWxsYmFja3MgdGhhdCBkbyBub3QgZGVwZW5kIG9uIGEgb3V0c3RhbmRpbmcgb3V0cHV0IChhcyBlaXRoZXIgaW5wdXQgb3Igc3RhdGUpXG4gICAgLy8gT3V0cHV0cyB3aGljaCBvdmVybGFwIGFuIGlucHV0IGRvIG5vdCBjb3VudCBhcyBhbiBvdXRzdGFuZGluZyBvdXRwdXRcbiAgICByZXR1cm4gZmlsdGVyKGNiID0+IGFsbChjYnAgPT4gIW91dHB1dHNNYXBbY29tYmluZUlkQW5kUHJvcChjYnApXSwgZGlmZmVyZW5jZUJhc2VkT25JZChmbGF0dGVuKGNiLmdldElucHV0cyhwYXRocykpLCBmbGF0dGVuKGNiLmdldE91dHB1dHMocGF0aHMpKSkpLCBjYW5kaWRhdGVzKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0TGF5b3V0Q2FsbGJhY2tzID0gKGdyYXBocywgcGF0aHMsIGxheW91dCwgb3B0aW9ucykgPT4ge1xuICAgIGxldCBleGNsdXNpb25zID0gW107XG4gICAgbGV0IGNhbGxiYWNrcyA9IGdldFVuZmlsdGVyZWRMYXlvdXRDYWxsYmFja3MoZ3JhcGhzLCBwYXRocywgbGF5b3V0LCBvcHRpb25zKTtcbiAgICAvKlxuICAgICAgICBSZW1vdmUgZnJvbSB0aGUgaW5pdGlhbCBjYWxsYmFja3MgdGhvc2UgdGhhdCBhcmUgbGVmdCB3aXRoIG9ubHkgZXhjbHVkZWQgaW5wdXRzLlxuXG4gICAgICAgIEV4Y2x1c2lvbiBvZiBpbnB1dHMgaGFwcGVucyB3aGVuOlxuICAgICAgICAtIGFuIGlucHV0IGlzIG1pc3NpbmdcbiAgICAgICAgLSBhbiBpbnB1dCBpbiB0aGUgaW5pdGlhbCBjYWxsYmFjayBjaGFpbiBkZXBlbmRzIG9ubHkgb24gZXhjbHVkZWQgaW5wdXRzXG5cbiAgICAgICAgRnVydGhlciBleGNsdXNpb24gbWlnaHQgaGFwcGVuIGFmdGVyIGNhbGxiYWNrcyByZXR1cm4gd2l0aDpcbiAgICAgICAgLSBQcmV2ZW50VXBkYXRlXG4gICAgICAgIC0gbm9fdXBkYXRlXG4gICAgKi9cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAvLyBGaW5kIGNhbGxiYWNrcyBmb3Igd2hpY2ggYWxsIGlucHV0cyBhcmUgbWlzc2luZyBvciBpbiB0aGUgZXhjbHVzaW9uc1xuICAgICAgICBjb25zdCBbaW5jbHVkZWQsIGV4Y2x1ZGVkXSA9IHBhcnRpdGlvbigoeyBjYWxsYmFjazogeyBpbnB1dHMgfSwgZ2V0SW5wdXRzIH0pID0+IGFsbChpc011bHRpVmFsdWVkLCBpbnB1dHMpIHx8XG4gICAgICAgICAgICAhaXNFbXB0eShkaWZmZXJlbmNlKG1hcChjb21iaW5lSWRBbmRQcm9wLCBmbGF0dGVuKGdldElucHV0cyhwYXRocykpKSwgZXhjbHVzaW9ucykpLCBjYWxsYmFja3MpO1xuICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIGFkZGl0aW9uYWwgZXhjbHVzaW9ucywgYnJlYWsgbG9vcCAtIGNhbGxiYWNrcyBoYXZlIGJlZW4gY2xlYW5lZFxuICAgICAgICBpZiAoIWV4Y2x1ZGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2tzID0gaW5jbHVkZWQ7XG4gICAgICAgIC8vIHVwZGF0ZSBleGNsdXNpb25zIHdpdGggYWxsIGFkZGl0aW9uYWwgZXhjbHVkZWQgb3V0cHV0c1xuICAgICAgICBleGNsdXNpb25zID0gY29uY2F0KGV4Y2x1c2lvbnMsIG1hcChjb21iaW5lSWRBbmRQcm9wLCBmbGF0dGVuKG1hcCgoeyBnZXRPdXRwdXRzIH0pID0+IGdldE91dHB1dHMocGF0aHMpLCBleGNsdWRlZCkpKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmZpbHRlclJvb3QpIHtcbiAgICAgICAgbGV0IHJvb3RJZCA9IHBhdGgoWydwcm9wcycsICdpZCddLCBsYXlvdXQpO1xuICAgICAgICBpZiAocm9vdElkKSB7XG4gICAgICAgICAgICByb290SWQgPSBzdHJpbmdpZnlJZChyb290SWQpO1xuICAgICAgICAgICAgLy8gRmlsdGVyIGlucHV0cyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgcmVzcG9uc2VcbiAgICAgICAgICAgIGNhbGxiYWNrcyA9IGNhbGxiYWNrcy5maWx0ZXIoY2IgPT4gY2IuY2FsbGJhY2suaW5wdXRzLnJlZHVjZSgocHJldmlvdXMsIGlucHV0KSA9PiBwcmV2aW91cyB8fFxuICAgICAgICAgICAgICAgIChzdHJpbmdpZnlJZChpbnB1dC5pZCkgPT0gcm9vdElkICYmXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsdGVyUm9vdC5pbmNsdWRlcyhpbnB1dC5wcm9wZXJ0eSkpLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qXG4gICAgICAgIFJldHVybiBhbGwgY2FsbGJhY2tzIHdpdGggYW4gYGV4ZWN1dGlvbkdyb3VwYCB0byBhbGxvdyBncm91cC1wcm9jZXNzaW5nXG4gICAgKi9cbiAgICBjb25zdCBleGVjdXRpb25Hcm91cCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpO1xuICAgIHJldHVybiBtYXAoY2IgPT4gKHsgLi4uY2IsIGV4ZWN1dGlvbkdyb3VwIH0pLCBjYWxsYmFja3MpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRVbmlxdWVJZGVudGlmaWVyID0gKHsgYW55VmFscywgY2FsbGJhY2s6IHsgaW5wdXRzLCBvdXRwdXRzLCBzdGF0ZSwgb3V0cHV0IH0gfSkgPT4ge1xuICAgIGNvbnN0IGlkUGFydHMgPSBtYXAoY29tYmluZUlkQW5kUHJvcCwgWy4uLmlucHV0cywgLi4ub3V0cHV0cywgLi4uc3RhdGVdKTtcbiAgICAvLyBGb3Igbm8tb3V0cHV0IGNhbGxiYWNrcywgaW5jbHVkZSB0aGUgb3V0cHV0IGhhc2ggdG8gZW5zdXJlIHVuaXF1ZW5lc3NcbiAgICBpZiAob3V0cHV0cy5sZW5ndGggPT09IDAgJiYgb3V0cHV0KSB7XG4gICAgICAgIGlkUGFydHMucHVzaChvdXRwdXQpO1xuICAgIH1cbiAgICByZXR1cm4gY29uY2F0KGlkUGFydHMsIEFycmF5LmlzQXJyYXkoYW55VmFscykgPyBhbnlWYWxzIDogYW55VmFscyA9PT0gJycgPyBbXSA6IFthbnlWYWxzXSkuam9pbignLCcpO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBpbmNsdWRlT2JzZXJ2ZXJzKGlkLCBwcm9wZXJ0aWVzLCBncmFwaHMsIHBhdGhzKSB7XG4gICAgcmV0dXJuIGZsYXR0ZW4obWFwKHByb3BOYW1lID0+IGdldENhbGxiYWNrc0J5SW5wdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3BOYW1lKSwga2V5cyhwcm9wZXJ0aWVzKSkpO1xufVxuLypcbiAqIENyZWF0ZSBhIHBlbmRpbmcgY2FsbGJhY2sgb2JqZWN0LiBJbmNsdWRlcyB0aGUgb3JpZ2luYWwgY2FsbGJhY2sgZGVmaW5pdGlvbixcbiAqIGl0cyByZXNvbHZlZCBJRCAoaW5jbHVkaW5nIHRoZSB2YWx1ZSBvZiBhbGwgTUFUQ0ggd2lsZGNhcmRzKSxcbiAqIGFjY2Vzc29ycyB0byBmaW5kIGFsbCBpbnB1dHMsIG91dHB1dHMsIGFuZCBzdGF0ZSBpbnZvbHZlZCBpbiB0aGlzXG4gKiBjYWxsYmFjayAobGF6eSBhcyBub3QgYWxsIHVzZXJzIHdpbGwgd2FudCBhbGwgb2YgdGhlc2UpLlxuICovXG5leHBvcnQgY29uc3QgbWFrZVJlc29sdmVkQ2FsbGJhY2sgPSAoY2FsbGJhY2ssIHJlc29sdmUsIGFueVZhbHMpID0+ICh7XG4gICAgY2FsbGJhY2ssXG4gICAgYW55VmFscyxcbiAgICByZXNvbHZlZElkOiBjYWxsYmFjay5vdXRwdXQgKyBhbnlWYWxzLFxuICAgIGdldE91dHB1dHM6IHBhdGhzID0+IGNhbGxiYWNrLm91dHB1dHMubWFwKHJlc29sdmUocGF0aHMpKSxcbiAgICBnZXRJbnB1dHM6IHBhdGhzID0+IGNhbGxiYWNrLmlucHV0cy5tYXAocmVzb2x2ZShwYXRocykpLFxuICAgIGdldFN0YXRlOiBwYXRocyA9PiBjYWxsYmFjay5zdGF0ZS5tYXAocmVzb2x2ZShwYXRocykpLFxuICAgIGNoYW5nZWRQcm9wSWRzOiB7fSxcbiAgICBpbml0aWFsQ2FsbDogZmFsc2Vcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIHBydW5lQ2FsbGJhY2tzKGNhbGxiYWNrcywgcGF0aHMpIHtcbiAgICBjb25zdCBbLCByZW1vdmVkXSA9IHBhcnRpdGlvbigoeyBnZXRPdXRwdXRzLCBjYWxsYmFjazogeyBvdXRwdXRzIH0gfSkgPT4gZmxhdHRlbihnZXRPdXRwdXRzKHBhdGhzKSkubGVuZ3RoID09PSBvdXRwdXRzLmxlbmd0aCwgY2FsbGJhY2tzKTtcbiAgICBjb25zdCBbLCBtb2RpZmllZF0gPSBwYXJ0aXRpb24oKHsgZ2V0T3V0cHV0cyB9KSA9PiAhZmxhdHRlbihnZXRPdXRwdXRzKHBhdGhzKSkubGVuZ3RoLCByZW1vdmVkKTtcbiAgICBjb25zdCBhZGRlZCA9IG1hcChjYiA9PiBhc3NvYygnY2hhbmdlZFByb3BJZHMnLCBwaWNrQnkoKF8sIHByb3BJZCkgPT4gZ2V0UGF0aChwYXRocywgc3BsaXRJZEFuZFByb3AocHJvcElkKS5pZCksIGNiLmNoYW5nZWRQcm9wSWRzKSwgY2IpLCBtb2RpZmllZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWRkZWQsXG4gICAgICAgIHJlbW92ZWRcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEZXBzKHJlZktleXMsIHJlZlZhbHMsIHJlZlBhdHRlcm5WYWxzKSB7XG4gICAgcmV0dXJuIChwYXRocykgPT4gKHsgaWQ6IGlkUGF0dGVybiwgcHJvcGVydHkgfSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGlkUGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKHBhdGhzLCBpZFBhdHRlcm4pO1xuICAgICAgICAgICAgcmV0dXJuIHBhdGggPyBbeyBpZDogaWRQYXR0ZXJuLCBwcm9wZXJ0eSwgcGF0aCB9XSA6IFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IF9rZXlzID0gT2JqZWN0LmtleXMoaWRQYXR0ZXJuKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IHBhdHRlcm5WYWxzID0gcHJvcHMoX2tleXMsIGlkUGF0dGVybik7XG4gICAgICAgIGNvbnN0IGtleVN0ciA9IF9rZXlzLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3Qga2V5UGF0aHMgPSBwYXRocy5vYmpzW2tleVN0cl07XG4gICAgICAgIGlmICgha2V5UGF0aHMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAga2V5UGF0aHMuZm9yRWFjaCgoeyB2YWx1ZXM6IHZhbHMsIHBhdGggfSkgPT4ge1xuICAgICAgICAgICAgaWYgKGlkTWF0Y2goX2tleXMsIHZhbHMsIHBhdHRlcm5WYWxzLCByZWZLZXlzLCByZWZWYWxzLCByZWZQYXR0ZXJuVmFscykpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7IGlkOiB6aXBPYmooX2tleXMsIHZhbHMpLCBwcm9wZXJ0eSwgcGF0aCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbn1cbiIsImltcG9ydCB7IGNyZWF0ZUFjdGlvbiB9IGZyb20gJ3JlZHV4LWFjdGlvbnMnO1xuaW1wb3J0IHsgSXNMb2FkaW5nQWN0aW9uVHlwZSB9IGZyb20gJy4uL3JlZHVjZXJzL2lzTG9hZGluZyc7XG5leHBvcnQgY29uc3Qgc2V0SXNMb2FkaW5nID0gY3JlYXRlQWN0aW9uKElzTG9hZGluZ0FjdGlvblR5cGUuU2V0KTtcbiIsImltcG9ydCB7IGNyZWF0ZUFjdGlvbiB9IGZyb20gJ3JlZHV4LWFjdGlvbnMnO1xuZXhwb3J0IGNvbnN0IGxvYWRpbmcgPSBjcmVhdGVBY3Rpb24oJ0xPQURJTkcnKTtcbmV4cG9ydCBjb25zdCBsb2FkZWQgPSBjcmVhdGVBY3Rpb24oJ0xPQURFRCcpO1xuIiwiaW1wb3J0IHsgYXBwZW5kLCBhc3NvY1BhdGgsIGNvbmNhdCwgZGlzc29jUGF0aCwgZW1wdHksIGVxdWFscywgaGFzLCBpbnNlcnQsIGlzLCBwYXRoLCBwcmVwZW5kLCByZXZlcnNlIH0gZnJvbSAncmFtZGEnO1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGF0Y2gob2JqKSB7XG4gICAgcmV0dXJuIGhhcygnX19kYXNoX3BhdGNoX3VwZGF0ZScsIG9iaik7XG59XG5mdW5jdGlvbiBnZXRMb2NhdGlvbkluZGV4KHZhbHVlLCBwcmV2aW91cykge1xuICAgIGlmIChpcyhOdW1iZXIsIHZhbHVlKSAmJiB2YWx1ZSA8IDApIHtcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzLmxlbmd0aCArIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBnZXRMb2NhdGlvblBhdGgobG9jYXRpb24sIG9iaikge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2F0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TG9jYXRpb25JbmRleChsb2NhdGlvbltpXSwgcGF0aChjdXJyZW50LCBvYmopKTtcbiAgICAgICAgY3VycmVudC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG59XG5leHBvcnQgY2xhc3MgUGF0Y2hCdWlsZGVyIHtcbiAgICBvcGVyYXRpb25zID0gW107XG4gICAgYXNzaWduKGxvY2F0aW9uLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdBc3NpZ24nLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWUgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG1lcmdlKGxvY2F0aW9uLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdNZXJnZScsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIHBhcmFtczogeyB2YWx1ZSB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZXh0ZW5kKGxvY2F0aW9uLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdFeHRlbmQnLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWUgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRlbGV0ZShsb2NhdGlvbikge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdEZWxldGUnLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHt9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaW5zZXJ0KGxvY2F0aW9uLCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgb3BlcmF0aW9uOiAnSW5zZXJ0JyxcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcGFyYW1zOiB7IGluZGV4LCB2YWx1ZSB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYXBwZW5kKGxvY2F0aW9uLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdBcHBlbmQnLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWUgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHByZXBlbmQobG9jYXRpb24sIHZhbHVlKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ1ByZXBlbmQnLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWUgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGFkZChsb2NhdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgb3BlcmF0aW9uOiAnQWRkJyxcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcGFyYW1zOiB7IHZhbHVlIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdWIobG9jYXRpb24sIHZhbHVlKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ1N1YicsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIHBhcmFtczogeyB2YWx1ZSB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgbXVsKGxvY2F0aW9uLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdNdWwnLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWUgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRpdihsb2NhdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgb3BlcmF0aW9uOiAnRGl2JyxcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgcGFyYW1zOiB7IHZhbHVlIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjbGVhcihsb2NhdGlvbikge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdDbGVhcicsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIHBhcmFtczoge31cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXZlcnNlKGxvY2F0aW9uKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogJ1JldmVyc2UnLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHt9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmVtb3ZlKGxvY2F0aW9uLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBvcGVyYXRpb246ICdSZW1vdmUnLFxuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWUgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGJ1aWxkKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgX19kYXNoX3BhdGNoX3VwZGF0ZTogJ19fZGFzaF9wYXRjaF91cGRhdGUnLFxuICAgICAgICAgICAgb3BlcmF0aW9uczogdGhpcy5vcGVyYXRpb25zXG4gICAgICAgIH07XG4gICAgfVxufVxuY29uc3QgcGF0Y2hIYW5kbGVycyA9IHtcbiAgICBBc3NpZ246IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgeyBwYXJhbXMsIGxvY2F0aW9uIH0gPSBwYXRjaE9wZXJhdGlvbjtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChsb2NhdGlvbiwgcGFyYW1zLnZhbHVlLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBNZXJnZTogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCB7XG4gICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgLi4ucGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlXG4gICAgICAgIH0sIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIEV4dGVuZDogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBjb25jYXQocHJldiwgcGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlKSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgRGVsZXRlOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIHJldHVybiBkaXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBJbnNlcnQ6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgaW5zZXJ0KGdldExvY2F0aW9uSW5kZXgocGF0Y2hPcGVyYXRpb24ucGFyYW1zLmluZGV4LCBwcmV2KSwgcGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlLCBwcmV2KSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgQXBwZW5kOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIGFwcGVuZChwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUsIHByZXYpLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBQcmVwZW5kOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXBlbmQocGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlLCBwcmV2KSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgQWRkOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXYgKyBwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUsIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIFN1YjogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2IC0gcGF0Y2hPcGVyYXRpb24ucGFyYW1zLnZhbHVlLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBNdWw6IChwcmV2aW91cywgcGF0Y2hPcGVyYXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcHJldiA9IHBhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXZpb3VzKTtcbiAgICAgICAgcmV0dXJuIGFzc29jUGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldiAqIHBhdGNoT3BlcmF0aW9uLnBhcmFtcy52YWx1ZSwgcHJldmlvdXMpO1xuICAgIH0sXG4gICAgRGl2OiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHByZXYgLyBwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUsIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIENsZWFyOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIGVtcHR5KHByZXYpLCBwcmV2aW91cyk7XG4gICAgfSxcbiAgICBSZXZlcnNlOiAocHJldmlvdXMsIHBhdGNoT3BlcmF0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2aW91cyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocGF0Y2hPcGVyYXRpb24ubG9jYXRpb24sIHJldmVyc2UocHJldiksIHByZXZpb3VzKTtcbiAgICB9LFxuICAgIFJlbW92ZTogKHByZXZpb3VzLCBwYXRjaE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gcGF0aChwYXRjaE9wZXJhdGlvbi5sb2NhdGlvbiwgcHJldmlvdXMpO1xuICAgICAgICByZXR1cm4gYXNzb2NQYXRoKHBhdGNoT3BlcmF0aW9uLmxvY2F0aW9uLCBwcmV2LmZpbHRlcigoaXRlbSkgPT4gIWVxdWFscyhpdGVtLCBwYXRjaE9wZXJhdGlvbi5wYXJhbXMudmFsdWUpKSwgcHJldmlvdXMpO1xuICAgIH1cbn07XG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUGF0Y2gocHJldmlvdXNWYWx1ZSwgcGF0Y2hWYWx1ZSkge1xuICAgIGxldCByZWR1Y2VkVmFsdWUgPSBwcmV2aW91c1ZhbHVlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0Y2hWYWx1ZS5vcGVyYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBhdGNoID0gcGF0Y2hWYWx1ZS5vcGVyYXRpb25zW2ldO1xuICAgICAgICBwYXRjaC5sb2NhdGlvbiA9IGdldExvY2F0aW9uUGF0aChwYXRjaC5sb2NhdGlvbiwgcmVkdWNlZFZhbHVlKTtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHBhdGNoSGFuZGxlcnNbcGF0Y2gub3BlcmF0aW9uXTtcbiAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgT3BlcmF0aW9uICR7cGF0Y2gub3BlcmF0aW9ufWApO1xuICAgICAgICB9XG4gICAgICAgIHJlZHVjZWRWYWx1ZSA9IGhhbmRsZXIocmVkdWNlZFZhbHVlLCBwYXRjaCk7XG4gICAgfVxuICAgIHJldHVybiByZWR1Y2VkVmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXRjaFByb3BzKHByb3BzLCBwcmV2aW91c1Byb3BzKSB7XG4gICAgaWYgKCFpcyhPYmplY3QsIHByb3BzKSkge1xuICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgfVxuICAgIGNvbnN0IHBhdGNoZWRQcm9wcyA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHByb3BzKSkge1xuICAgICAgICBjb25zdCB2YWwgPSBwcm9wc1trZXldO1xuICAgICAgICBpZiAoaXNQYXRjaCh2YWwpKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gcHJldmlvdXNQcm9wc1trZXldO1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHBhdGNoIHVuZGVmaW5lZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGF0Y2hlZFByb3BzW2tleV0gPSBoYW5kbGVQYXRjaChwcmV2aW91c1ZhbHVlLCB2YWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGF0Y2hlZFByb3BzW2tleV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhdGNoZWRQcm9wcztcbn1cbiIsImltcG9ydCB7IGtleXMsIGVxdWFscywgZGlzc29jLCB0b1BhaXJzIH0gZnJvbSAncmFtZGEnO1xuLyoqXG4gKiBEZXNlcmlhbGl6ZSBwYXR0ZXJuIG1hdGNoaW5nIGlkcyB0aGF0IGNvbWUgaW4gb25lIG9mIHRoZSBmb3JtOlxuICogLSAne1widHlwZVwiOlwiY29tcG9uZW50XCIsXCJpbmRleFwiOltcIk1BVENIXCJdfS5jaGlsZHJlbidcbiAqIC0gJ3tcInR5cGVcIjpcImNvbXBvbmVudFwiLFwiaW5kZXhcIjpbXCJNQVRDSFwiXX0nXG4gKlxuICogQHBhcmFtIGlkIFRoZSByYXcgb2JqZWN0IGFzIGEgc3RyaW5nIGlkLlxuICogQHJldHVybnMgVGhlIGlkIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUE1DSWQoaWQpIHtcbiAgICBsZXQgY29tcG9uZW50SWQsIHByb3BOYW1lO1xuICAgIGNvbnN0IGluZGV4ID0gaWQubGFzdEluZGV4T2YoJ30nKTtcbiAgICBpZiAoaW5kZXggKyAyIDwgaWQubGVuZ3RoKSB7XG4gICAgICAgIHByb3BOYW1lID0gaWQuc3Vic3RyaW5nKGluZGV4ICsgMik7XG4gICAgICAgIGNvbXBvbmVudElkID0gSlNPTi5wYXJzZShpZC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb21wb25lbnRJZCA9IEpTT04ucGFyc2UoaWQpO1xuICAgIH1cbiAgICByZXR1cm4gW2NvbXBvbmVudElkLCBwcm9wTmFtZV07XG59XG4vKipcbiAqIEdldCBhbGwgdGhlIGFzc29jaWF0ZWQgaWRzIGZvciBhbiBpZC5cbiAqXG4gKiBAcGFyYW0gaWQgSWQgdG8gZ2V0IGFsbCB0aGUgcG1jIGlkcyBmcm9tLlxuICogQHBhcmFtIHN0YXRlIFN0YXRlIG9mIHRoZSBzdG9yZS5cbiAqIEBwYXJhbSB0cmlnZ2VyS2V5IEtleSB0byByZW1vdmUgZnJvbSB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbi5cbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxQTUNJZHMoaWQsIHN0YXRlLCB0cmlnZ2VyS2V5KSB7XG4gICAgY29uc3Qga2V5c09mSWRzID0ga2V5cyhpZCk7XG4gICAgY29uc3QgaWRLZXkgPSBrZXlzT2ZJZHMuam9pbignLCcpO1xuICAgIHJldHVybiBzdGF0ZS5wYXRocy5vYmpzW2lkS2V5XVxuICAgICAgICAubWFwKChvYmopID0+IGtleXNPZklkcy5yZWR1Y2UoKGFjYywga2V5LCBpKSA9PiB7XG4gICAgICAgIGFjY1trZXldID0gb2JqLnZhbHVlc1tpXTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSkpXG4gICAgICAgIC5maWx0ZXIoKG9iaikgPT4gZXF1YWxzKGRpc3NvYyh0cmlnZ2VyS2V5LCBvYmopLCBkaXNzb2ModHJpZ2dlcktleSwgaWQpKSk7XG59XG4vKipcbiAqIFJlcGxhY2UgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgaWRzIHdpdGggdGhlIGFjdHVhbCB0cmlnZ2VyIHZhbHVlXG4gKiBmb3IgTUFUQ0gsIGFsbCB0aGUgaWRzIGZvciBBTEwgYW5kIHNtYWxsZXIgdGhhbiB0aGUgdHJpZ2dlciB2YWx1ZVxuICogZm9yIEFMTFNNQUxMRVIuXG4gKlxuICogQHBhcmFtIGlkIFRoZSBwYXJzZWQgaWQgaW4gZGljdGlvbmFyeSBmb3JtYXQuXG4gKiBAcGFyYW0gY2IgT3JpZ2luYWwgY2FsbGJhY2sgaW5mby5cbiAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiB0aGUgZGVwZW5kZW5jeSBpbiBjYXNlIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY2hhbmdlZCBpZC5cbiAqIEBwYXJhbSBnZXRTdGF0ZSBGdW5jdGlvbiB0byBnZXQgdGhlIHN0YXRlIG9mIHRoZSByZWR1eCBzdG9yZS5cbiAqIEByZXR1cm5zIExpc3Qgb2YgcmVwbGFjZWQgaWRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZVBNQyhpZCwgY2IsIGluZGV4LCBnZXRTdGF0ZSkge1xuICAgIGxldCBleHRyYXMgPSBbXTtcbiAgICBjb25zdCByZXBsYWNlZCA9IHt9O1xuICAgIHRvUGFpcnMoaWQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAoZXh0cmFzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gQWxsIGRvbmUuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VyVmFsdWUgPSAoY2IucGFyc2VkQ2hhbmdlZFByb3BzSWRzW2luZGV4XSB8fFxuICAgICAgICAgICAgICAgIGNiLnBhcnNlZENoYW5nZWRQcm9wc0lkc1swXSlba2V5XTtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcygnTUFUQ0gnKSkge1xuICAgICAgICAgICAgICAgIHJlcGxhY2VkW2tleV0gPSB0cmlnZ2VyVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5pbmNsdWRlcygnQUxMJykpIHtcbiAgICAgICAgICAgICAgICBleHRyYXMgPSBnZXRBbGxQTUNJZHMoaWQsIGdldFN0YXRlKCksIGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5pbmNsdWRlcygnQUxMU01BTExFUicpKSB7XG4gICAgICAgICAgICAgICAgZXh0cmFzID0gZ2V0QWxsUE1DSWRzKGlkLCBnZXRTdGF0ZSgpLCBrZXkpLmZpbHRlcigob2JqKSA9PiBvYmpba2V5XSA8IHRyaWdnZXJWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXBsYWNlZFtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoZXh0cmFzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZXh0cmFzO1xuICAgIH1cbiAgICByZXR1cm4gW3JlcGxhY2VkXTtcbn1cbiIsImltcG9ydCB7IGJhdGNoIH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHsgc2V0R3JhcGhzIH0gZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQgYXBpVGh1bmsgZnJvbSAnLi9hcGknO1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3REZXBlbmRlbmNpZXMoKSB7XG4gICAgcmV0dXJuIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICAgICAgYmF0Y2goKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBncmFwaHMgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgICBkaXNwYXRjaChzZXRHcmFwaHMoeyAuLi5ncmFwaHMsIHJlc2V0OiB0cnVlIH0pKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKGFwaVRodW5rKCdfZGFzaC1kZXBlbmRlbmNpZXMnLCAnR0VUJywgJ2RlcGVuZGVuY2llc1JlcXVlc3QnKSk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb25maWdGcm9tRE9NKCkge1xuICAgIGNvbnN0IGNvbmZpZ0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnX2Rhc2gtY29uZmlnJyk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY29uZmlnRWxlbWVudD8udGV4dENvbnRlbnQgPyBjb25maWdFbGVtZW50Py50ZXh0Q29udGVudCA6ICd7fScpO1xufVxuIiwiaW1wb3J0IHsgcGF0aCB9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7IERhc2hDb250ZXh0LCB1c2VEYXNoQ29udGV4dCB9IGZyb20gJy4vd3JhcHBlci9EYXNoQ29udGV4dCc7XG5pbXBvcnQgeyBnZXRQYXRoIH0gZnJvbSAnLi9hY3Rpb25zL3BhdGhzJztcbmltcG9ydCB7IGdldFN0b3JlcyB9IGZyb20gJy4vdXRpbHMvc3RvcmVzJztcbmltcG9ydCBFeHRlcm5hbFdyYXBwZXIgZnJvbSAnLi93cmFwcGVyL0V4dGVybmFsV3JhcHBlcic7XG5pbXBvcnQgeyBzdHJpbmdpZnlJZCB9IGZyb20gJy4vYWN0aW9ucy9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHsgRGV2dG9vbENvbnRleHQsIHVzZURldnRvb2wsIHVzZURldnRvb2xNZW51QnV0dG9uQ2xhc3NOYW1lIH0gZnJvbSAnLi9jb21wb25lbnRzL2Vycm9yL21lbnUvRGV2dG9vbENvbnRleHQnO1xuLyoqXG4gKiBHZXQgdGhlIGRhc2ggcHJvcHMgZnJvbSBhIGNvbXBvbmVudCBwYXRoIG9yIGlkLlxuICpcbiAqIEBwYXJhbSBjb21wb25lbnRQYXRoT3JJZCBUaGUgcGF0aCBvciB0aGUgaWQgb2YgdGhlIGNvbXBvbmVudCB0byBnZXQgdGhlIHByb3BzIG9mLlxuICogQHBhcmFtIHByb3BQYXRoIEFkZGl0aW9uYWwga2V5IHRvIGdldCB0aGUgcHJvcGVydHkgaW5zdGVhZCBvZiBwbGFpbiBwcm9wcy5cbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIGdldExheW91dChjb21wb25lbnRQYXRoT3JJZCkge1xuICAgIGNvbnN0IGRzID0gZ2V0U3RvcmVzKCk7XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBkcy5sZW5ndGg7IHkrKykge1xuICAgICAgICBjb25zdCB7IHBhdGhzLCBsYXlvdXQgfSA9IGRzW3ldLmdldFN0YXRlKCk7XG4gICAgICAgIGxldCBjb21wb25lbnRQYXRoO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29tcG9uZW50UGF0aE9ySWQpKSB7XG4gICAgICAgICAgICBjb21wb25lbnRQYXRoID0gZ2V0UGF0aChwYXRocywgY29tcG9uZW50UGF0aE9ySWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29tcG9uZW50UGF0aCA9IGNvbXBvbmVudFBhdGhPcklkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3BzID0gcGF0aChjb21wb25lbnRQYXRoLCBsYXlvdXQpO1xuICAgICAgICBpZiAocHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzO1xuICAgICAgICB9XG4gICAgfVxufVxud2luZG93LmRhc2hfY29tcG9uZW50X2FwaSA9IE9iamVjdC5hc3NpZ24od2luZG93LmRhc2hfY29tcG9uZW50X2FwaSB8fCB7fSwge1xuICAgIEV4dGVybmFsV3JhcHBlcixcbiAgICBEYXNoQ29udGV4dCxcbiAgICB1c2VEYXNoQ29udGV4dCxcbiAgICBnZXRMYXlvdXQsXG4gICAgc3RyaW5naWZ5SWQsXG4gICAgZGV2dG9vbDoge1xuICAgICAgICBEZXZ0b29sQ29udGV4dCxcbiAgICAgICAgdXNlRGV2dG9vbCxcbiAgICAgICAgdXNlRGV2dG9vbE1lbnVCdXR0b25DbGFzc05hbWVcbiAgICB9XG59KTtcbiIsImNvbnN0IHVwZGF0ZVRpdGxlID0gKGdldFN0YXRlKSA9PiB7XG4gICAgY29uc3QgeyBjb25maWcsIGlzTG9hZGluZyB9ID0gZ2V0U3RhdGUoKTtcbiAgICBjb25zdCB1cGRhdGVfdGl0bGUgPSBjb25maWc/LnVwZGF0ZV90aXRsZTtcbiAgICBpZiAoIXVwZGF0ZV90aXRsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc0xvYWRpbmcpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LnRpdGxlICE9PSB1cGRhdGVfdGl0bGUpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLnRpdGxlID0gZG9jdW1lbnQudGl0bGU7XG4gICAgICAgICAgICBkb2N1bWVudC50aXRsZSA9IHVwZGF0ZV90aXRsZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LnRpdGxlID09PSB1cGRhdGVfdGl0bGUpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LnRpdGxlID0gb2JzZXJ2ZXIudGl0bGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvYnNlcnZlci50aXRsZSA9IGRvY3VtZW50LnRpdGxlO1xuICAgICAgICB9XG4gICAgfVxufTtcbmNvbnN0IG9ic2VydmVyID0ge1xuICAgIGlucHV0czogWydpc0xvYWRpbmcnXSxcbiAgICBtdXRhdGlvbk9ic2VydmVyOiB1bmRlZmluZWQsXG4gICAgb2JzZXJ2ZXI6ICh7IGdldFN0YXRlIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25maWcgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGlmIChvYnNlcnZlci5jb25maWcgIT09IGNvbmZpZykge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuY29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgb2JzZXJ2ZXIubXV0YXRpb25PYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIubXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHVwZGF0ZVRpdGxlKGdldFN0YXRlKSk7XG4gICAgICAgICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RpdGxlJyk7XG4gICAgICAgICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUodGl0bGUsIHtcbiAgICAgICAgICAgICAgICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlVGl0bGUoZ2V0U3RhdGUpO1xuICAgIH1cbn07XG5leHBvcnQgZGVmYXVsdCBvYnNlcnZlcjtcbiIsImltcG9ydCB7IGNvbmNhdCwgZmxhdHRlbiwgaXNFbXB0eSwgaXNOaWwsIG1hcCwgcGF0aCwga2V5cywgcGlja0J5LCB0b1BhaXJzLCBwYXRoT3IgfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQgeyBhZ2dyZWdhdGVDYWxsYmFja3MsIGFkZFJlcXVlc3RlZENhbGxiYWNrcywgcmVtb3ZlRXhlY3V0ZWRDYWxsYmFja3MsIGFkZENvbXBsZXRlZENhbGxiYWNrcywgYWRkU3RvcmVkQ2FsbGJhY2tzIH0gZnJvbSAnLi4vYWN0aW9ucy9jYWxsYmFja3MnO1xuaW1wb3J0IHsgcGFyc2VJZldpbGRjYXJkIH0gZnJvbSAnLi4vYWN0aW9ucy9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHsgY29tYmluZUlkQW5kUHJvcCwgZ2V0Q2FsbGJhY2tzQnlJbnB1dCwgZ2V0TGF5b3V0Q2FsbGJhY2tzLCBpbmNsdWRlT2JzZXJ2ZXJzIH0gZnJvbSAnLi4vYWN0aW9ucy9kZXBlbmRlbmNpZXNfdHMnO1xuaW1wb3J0IHsgdXBkYXRlUHJvcHMsIHNldFBhdGhzLCBoYW5kbGVBc3luY0Vycm9yIH0gZnJvbSAnLi4vYWN0aW9ucyc7XG5pbXBvcnQgeyBnZXRQYXRoLCBjb21wdXRlUGF0aHMgfSBmcm9tICcuLi9hY3Rpb25zL3BhdGhzJztcbmltcG9ydCB7IGFwcGx5UGVyc2lzdGVuY2UsIHBydW5lUGVyc2lzdGVuY2UgfSBmcm9tICcuLi9wZXJzaXN0ZW5jZSc7XG5jb25zdCBvYnNlcnZlciA9IHtcbiAgICBvYnNlcnZlcjogKHsgZGlzcGF0Y2gsIGdldFN0YXRlIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHsgZXhlY3V0ZWQgfSB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgZnVuY3Rpb24gYXBwbHlQcm9wcyhpZCwgdXBkYXRlZFByb3BzKSB7XG4gICAgICAgICAgICBjb25zdCB7IGxheW91dCwgcGF0aHMgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcGF0aCA9IGdldFBhdGgocGF0aHMsIGlkKTtcbiAgICAgICAgICAgIGlmICghaXRlbXBhdGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgY2FsbGJhY2stZ2VuZXJhdGVkIHVwZGF0ZS5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaW52YWxpZGF0ZXMgZXhpc3RpbmcgcGVyc2lzdGVkIHByb3AgdmFsdWVzLFxuICAgICAgICAgICAgLy8gb3IgaWYgcGVyc2lzdGVuY2UgY2hhbmdlZCwgd2hldGhlciB0aGlzIHVwZGF0ZXMgb3RoZXIgcHJvcHMuXG4gICAgICAgICAgICB1cGRhdGVkUHJvcHMgPSBwcnVuZVBlcnNpc3RlbmNlKHBhdGgoaXRlbXBhdGgsIGxheW91dCksIHVwZGF0ZWRQcm9wcywgZGlzcGF0Y2gpO1xuICAgICAgICAgICAgLy8gSW4gY2FzZSB0aGUgdXBkYXRlIGNvbnRhaW5zIHdob2xlIGNvbXBvbmVudHMsIHNlZSBpZiBhbnkgb2ZcbiAgICAgICAgICAgIC8vIHRob3NlIGNvbXBvbmVudHMgaGF2ZSBwcm9wcyB0byB1cGRhdGUgdG8gcGVyc2lzdCB1c2VyIGVkaXRzLlxuICAgICAgICAgICAgY29uc3QgeyBwcm9wcyB9ID0gYXBwbHlQZXJzaXN0ZW5jZSh7IHByb3BzOiB1cGRhdGVkUHJvcHMgfSwgZGlzcGF0Y2gpO1xuICAgICAgICAgICAgZGlzcGF0Y2godXBkYXRlUHJvcHMoe1xuICAgICAgICAgICAgICAgIGl0ZW1wYXRoLFxuICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ3Jlc3BvbnNlJyxcbiAgICAgICAgICAgICAgICByZW5kZXJUeXBlOiAnY2FsbGJhY2snXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlcXVlc3RlZENhbGxiYWNrcyA9IFtdO1xuICAgICAgICBjb25zdCBzdG9yZWRDYWxsYmFja3MgPSBbXTtcbiAgICAgICAgZXhlY3V0ZWQuZm9yRWFjaChjYiA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcmVkZWNlc3NvcnMgPSBjb25jYXQoY2IucHJlZGVjZXNzb3JzID8/IFtdLCBbY2IuY2FsbGJhY2tdKTtcbiAgICAgICAgICAgIGNvbnN0IHsgY2FsbGJhY2s6IHsgY2xpZW50c2lkZV9mdW5jdGlvbiwgb3V0cHV0IH0sIGV4ZWN1dGlvblJlc3VsdCB9ID0gY2I7XG4gICAgICAgICAgICBpZiAoaXNOaWwoZXhlY3V0aW9uUmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3IsIHBheWxvYWQgfSA9IGV4ZWN1dGlvblJlc3VsdDtcbiAgICAgICAgICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhKS5mb3JFYWNoKChbaWQsIHByb3BzXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRJZCA9IHBhcnNlSWZXaWxkY2FyZChpZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZ3JhcGhzLCBsYXlvdXQ6IG9sZExheW91dCwgcGF0aHM6IG9sZFBhdGhzIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBDb21wb25lbnRzIHdpbGwgdHJpZ2dlciBjYWxsYmFja3Mgb24gdGhlaXIgb3duIGFzIHJlcXVpcmVkIChlZy4gZGVyaXZlZClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXBwbGllZFByb3BzID0gYXBwbHlQcm9wcyhwYXJzZWRJZCwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAvLyBBZGQgY2FsbGJhY2tzIGZvciBtb2RpZmllZCBpbnB1dHNcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ2FsbGJhY2tzID0gY29uY2F0KHJlcXVlc3RlZENhbGxiYWNrcywgZmxhdHRlbihtYXAocHJvcCA9PiBnZXRDYWxsYmFja3NCeUlucHV0KGdyYXBocywgb2xkUGF0aHMsIHBhcnNlZElkLCBwcm9wLCB0cnVlKSwga2V5cyhwcm9wcykpKS5tYXAocmNiID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5yY2IsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZVBhdGggPSBnZXRQYXRoKG9sZFBhdGhzLCBwYXJzZWRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYmFzZVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRPYmogPSBwYXRoKGJhc2VQYXRoLCBvbGRMYXlvdXQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlblByb3BzID0gcGF0aE9yKCdkZWZhdWx0VmFsdWUnLCBbb2xkT2JqLm5hbWVzcGFjZSwgb2xkT2JqLnR5cGVdLCB3aW5kb3cuX19kYXNocHJpdmF0ZV9jaGlsZHJlblByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlUGF0aHMgPSAoY2hpbGRyZW4sIG9sZENoaWxkcmVuLCBvbGRDaGlsZHJlblBhdGgsIGZpbHRlclJvb3QgPSBmYWxzZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb1BhdGhzID0gZ2V0U3RhdGUoKS5wYXRocztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhzID0gY29tcHV0ZVBhdGhzKGNoaWxkcmVuLCBvbGRDaGlsZHJlblBhdGgsIG9QYXRocyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzZXRQYXRocyhwYXRocykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGNhbGxiYWNrcyBmb3IgbmV3IGxheW91dCAody8gZXhlY3V0aW9uIGdyb3VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ2FsbGJhY2tzID0gY29uY2F0KHJlcXVlc3RlZENhbGxiYWNrcywgZ2V0TGF5b3V0Q2FsbGJhY2tzKGdyYXBocywgcGF0aHMsIGNoaWxkcmVuLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtQYXRoOiBvbGRDaGlsZHJlblBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUm9vdFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkubWFwKHJjYiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJjYixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaWxkY2FyZCBjYWxsYmFja3Mgd2l0aCBhcnJheSBpbnB1dHMgKEFMTCAvIEFMTFNNQUxMRVIpIG5lZWQgdG8gdHJpZ2dlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBkdWUgdG8gdGhlIGRlbGV0aW9uIG9mIGNvbXBvbmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENhbGxiYWNrcyA9IGNvbmNhdChyZXF1ZXN0ZWRDYWxsYmFja3MsIGdldExheW91dENhbGxiYWNrcyhncmFwaHMsIG9sZFBhdGhzLCBvbGRDaGlsZHJlbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWRBcnJheUlucHV0c09ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0aHM6IHBhdGhzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rUGF0aDogb2xkQ2hpbGRyZW5QYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclJvb3RcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLm1hcChyY2IgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yY2IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjb21wdXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBbJ2NoaWxkcmVuJ11cbiAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQoY2hpbGRyZW5Qcm9wcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGNoaWxkcmVuUHJvcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVjb21wdXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlblByb3AuaW5jbHVkZXMoJ1tdJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbZnJvbnRQYXRoXSA9IGNoaWxkcmVuUHJvcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ1tdJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChwID0+IHAuc3BsaXQoJy4nKS5maWx0ZXIoZSA9PiBlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbnRPYmogPSBwYXRoKGZyb250UGF0aCwgYXBwbGllZFByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZyb250T2JqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3Jhd2wgbGF5b3V0IG5lZWRzIHRoZSBucy90eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGF0aHMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5vbGRPYmosXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5vbGRPYmoucHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5hcHBsaWVkUHJvcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9sZE9iaiwgYmFzZVBhdGgsIGtleXMoYXBwbGllZFByb3BzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBkbyBpdCBvbmNlIGZvciB0aGUgY29tcG9uZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29tcHV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW5Qcm9wUGF0aCA9IGNoaWxkcmVuUHJvcC5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gcGF0aChjaGlsZHJlblByb3BQYXRoLCBhcHBsaWVkUHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRDaGlsZHJlblBhdGggPSBjb25jYXQoZ2V0UGF0aChvbGRQYXRocywgcGFyc2VkSWQpLCBbJ3Byb3BzJ10uY29uY2F0KGNoaWxkcmVuUHJvcFBhdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRDaGlsZHJlbiA9IHBhdGgob2xkQ2hpbGRyZW5QYXRoLCBvbGRMYXlvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBhdGhzKGNoaWxkcmVuLCBvbGRDaGlsZHJlbiwgb2xkQ2hpbGRyZW5QYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHBlcnNpc3RlbmNlIGVkZ2UgY2FzZTogaWYgeW91IGV4cGxpY2l0bHkgdXBkYXRlIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBwZXJzaXN0ZW5jZSBrZXksIG90aGVyIHByb3BzIG1heSBjaGFuZ2UgdGhhdCByZXF1aXJlIHVzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIGZpcmUgYWRkaXRpb25hbCBjYWxsYmFja3NcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRkZWRQcm9wcyA9IHBpY2tCeSgoXywgaykgPT4gIShrIGluIHByb3BzKSwgYXBwbGllZFByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0VtcHR5KGFkZGVkUHJvcHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGdyYXBoczogY3VycmVudEdyYXBocywgcGF0aHMgfSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDYWxsYmFja3MgPSBjb25jYXQocmVxdWVzdGVkQ2FsbGJhY2tzLCBpbmNsdWRlT2JzZXJ2ZXJzKGlkLCBhZGRlZFByb3BzLCBjdXJyZW50R3JhcGhzLCBwYXRocykubWFwKHJjYiA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJjYixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBBZGQgaW5mb3JtYXRpb24gYWJvdXQgcG90ZW50aWFsbHkgdXBkYXRlZCBvdXRwdXRzIHZzLiB1cGRhdGVkIG91dHB1dHMsXG4gICAgICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGJlIHVzZWQgdG8gZHJvcCBjYWxsYmFja3MgZnJvbSBleGVjdXRpb24gZ3JvdXBzIHdoZW4gbm8gb3V0cHV0XG4gICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgdGhlIGRvd25zdHJlYW0gY2FsbGJhY2sncyBpbnB1dHMgd2VyZSBtb2RpZmllZFxuICAgICAgICAgICAgICAgIHN0b3JlZENhbGxiYWNrcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY2IsXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbk1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbFByb3BzOiBtYXAoY29tYmluZUlkQW5kUHJvcCwgZmxhdHRlbihjYi5nZXRPdXRwdXRzKGdldFN0YXRlKCkucGF0aHMpKSksXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUHJvcHM6IGZsYXR0ZW4obWFwKChbaWQsIHZhbHVlXSkgPT4gbWFwKHByb3BlcnR5ID0+IGNvbWJpbmVJZEFuZFByb3AoeyBpZCwgcHJvcGVydHkgfSksIGtleXModmFsdWUpKSwgdG9QYWlycyhkYXRhKSkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgaWYgKGNiLmNhbGxiYWNrLm5vX291dHB1dCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB0cyA9IGtleXMoY2IuY2hhbmdlZFByb3BJZHMpLmpvaW4oJywgJyk7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgQ2FsbGJhY2sgZXJyb3Igd2l0aCBubyBvdXRwdXQgZnJvbSBpbnB1dCAke2lucHRzfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRzID0gcGF5bG9hZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBtYXAoY29tYmluZUlkQW5kUHJvcCwgZmxhdHRlbihbcGF5bG9hZC5vdXRwdXRzXSkpLmpvaW4oJywgJylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYENhbGxiYWNrIGVycm9yIHVwZGF0aW5nICR7b3V0cHV0c31gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2xpZW50c2lkZV9mdW5jdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IG5hbWVzcGFjZTogbnMsIGZ1bmN0aW9uX25hbWU6IGZuIH0gPSBjbGllbnRzaWRlX2Z1bmN0aW9uO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlICs9IGAgdmlhIGNsaWVudHNpZGUgZnVuY3Rpb24gJHtuc30uJHtmbn1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVBc3luY0Vycm9yKGVycm9yLCBtZXNzYWdlLCBkaXNwYXRjaCk7XG4gICAgICAgICAgICAgICAgc3RvcmVkQ2FsbGJhY2tzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAuLi5jYixcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uTWV0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsUHJvcHM6IG1hcChjb21iaW5lSWRBbmRQcm9wLCBmbGF0dGVuKGNiLmdldE91dHB1dHMoZ2V0U3RhdGUoKS5wYXRocykpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRQcm9wczogW11cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZGlzcGF0Y2goYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgIGV4ZWN1dGVkLmxlbmd0aCA/IHJlbW92ZUV4ZWN1dGVkQ2FsbGJhY2tzKGV4ZWN1dGVkKSA6IG51bGwsXG4gICAgICAgICAgICBleGVjdXRlZC5sZW5ndGggPyBhZGRDb21wbGV0ZWRDYWxsYmFja3MoZXhlY3V0ZWQubGVuZ3RoKSA6IG51bGwsXG4gICAgICAgICAgICBzdG9yZWRDYWxsYmFja3MubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBhZGRTdG9yZWRDYWxsYmFja3Moc3RvcmVkQ2FsbGJhY2tzKVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIHJlcXVlc3RlZENhbGxiYWNrcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IGFkZFJlcXVlc3RlZENhbGxiYWNrcyhyZXF1ZXN0ZWRDYWxsYmFja3MpXG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIF0pKTtcbiAgICB9LFxuICAgIGlucHV0czogWydjYWxsYmFja3MuZXhlY3V0ZWQnXVxufTtcbmV4cG9ydCBkZWZhdWx0IG9ic2VydmVyO1xuIiwiaW1wb3J0IHsgYXNzb2MsIGZpbmQsIHBhcnRpdGlvbiB9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7IGFkZEV4ZWN1dGVkQ2FsbGJhY2tzLCBhZGRXYXRjaGVkQ2FsbGJhY2tzLCBhZ2dyZWdhdGVDYWxsYmFja3MsIHJlbW92ZUV4ZWN1dGluZ0NhbGxiYWNrcywgcmVtb3ZlV2F0Y2hlZENhbGxiYWNrcyB9IGZyb20gJy4uL2FjdGlvbnMvY2FsbGJhY2tzJztcbmltcG9ydCB7IGdldEFwcFN0YXRlIH0gZnJvbSAnLi4vcmVkdWNlcnMvY29uc3RhbnRzJztcbmNvbnN0IG9ic2VydmVyID0ge1xuICAgIG9ic2VydmVyOiAoeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrczogeyBleGVjdXRpbmcgfSB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgW2RlZmVycmVkLCBza2lwcGVkT3JSZWFkeV0gPSBwYXJ0aXRpb24oY2IgPT4gY2IuZXhlY3V0aW9uUHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2UsIGV4ZWN1dGluZyk7XG4gICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICBleGVjdXRpbmcubGVuZ3RoID8gcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzKGV4ZWN1dGluZykgOiBudWxsLFxuICAgICAgICAgICAgZGVmZXJyZWQubGVuZ3RoID8gYWRkV2F0Y2hlZENhbGxiYWNrcyhkZWZlcnJlZCkgOiBudWxsLFxuICAgICAgICAgICAgc2tpcHBlZE9yUmVhZHkubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBhZGRFeGVjdXRlZENhbGxiYWNrcyhza2lwcGVkT3JSZWFkeS5tYXAoY2IgPT4gYXNzb2MoJ2V4ZWN1dGlvblJlc3VsdCcsIGNiLmV4ZWN1dGlvblByb21pc2UsIGNiKSkpXG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIF0pKTtcbiAgICAgICAgZGVmZXJyZWQuZm9yRWFjaChhc3luYyAoY2IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNiLmV4ZWN1dGlvblByb21pc2U7XG4gICAgICAgICAgICBjb25zdCB7IGNhbGxiYWNrczogeyB3YXRjaGVkIH0sIGFwcExpZmVjeWNsZSwgaG9va3M6IHsgY2FsbGJhY2tfcmVzb2x2ZWQgfSB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGlmIChhcHBMaWZlY3ljbGUgIT09IGdldEFwcFN0YXRlKCdIWURSQVRFRCcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrX3Jlc29sdmVkKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2tfcmVzb2x2ZWQoY2IuY2FsbGJhY2ssIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBgd2F0Y2hlZGAgbGlzdCBzaW5jZSAtIG9uIGNhbGxiYWNrIGNvbXBsZXRpb24sIGFub3RoZXIgY2FsbGJhY2sgbWF5IGJlIGNhbmNlbGxlZFxuICAgICAgICAgICAgLy8gRmluZCB0aGUgY2FsbGJhY2sgaW5zdGFuY2Ugb3Igb25lIHRoYXQgbWF0Y2hlcyBpdHMgcHJvbWlzZSAoZWcuIGNvdWxkIGhhdmUgYmVlbiBwcnVuZWQpXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Q2IgPSBmaW5kKF9jYiA9PiBfY2IgPT09IGNiIHx8IF9jYi5leGVjdXRpb25Qcm9taXNlID09PSBjYi5leGVjdXRpb25Qcm9taXNlLCB3YXRjaGVkKTtcbiAgICAgICAgICAgIGlmICghY3VycmVudENiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIG1vdmUgdG8gYGV4ZWN1dGVkYCBhbmQgcmVtb3ZlIGZyb20gYHdhdGNoZWRgXG4gICAgICAgICAgICBkaXNwYXRjaChhZ2dyZWdhdGVDYWxsYmFja3MoW1xuICAgICAgICAgICAgICAgIHJlbW92ZVdhdGNoZWRDYWxsYmFja3MoW2N1cnJlbnRDYl0pLFxuICAgICAgICAgICAgICAgIGFkZEV4ZWN1dGVkQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudENiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uUmVzdWx0OiByZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICBdKSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgaW5wdXRzOiBbJ2NhbGxiYWNrcy5leGVjdXRpbmcnXVxufTtcbmV4cG9ydCBkZWZhdWx0IG9ic2VydmVyO1xuIiwiaW1wb3J0IHsgZ2V0UGVuZGluZ0NhbGxiYWNrcyB9IGZyb20gJy4uL3V0aWxzL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBzZXRJc0xvYWRpbmcgfSBmcm9tICcuLi9hY3Rpb25zL2lzTG9hZGluZyc7XG5jb25zdCBvYnNlcnZlciA9IHtcbiAgICBvYnNlcnZlcjogKHsgZGlzcGF0Y2gsIGdldFN0YXRlIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3MsIGlzTG9hZGluZyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgcGVuZGluZ0NhbGxiYWNrcyA9IGdldFBlbmRpbmdDYWxsYmFja3MoY2FsbGJhY2tzKTtcbiAgICAgICAgLy8gRmlsdGVyIG91dCBwZXJzaXN0ZW50IGNhbGxiYWNrcyAtIHRoZXkgc2hvdWxkbid0IHRyaWdnZXIgdGhlIGxvYWRpbmcgaW5kaWNhdG9yXG4gICAgICAgIGNvbnN0IG5vblBlcnNpc3RlbnRDYWxsYmFja3MgPSBwZW5kaW5nQ2FsbGJhY2tzLmZpbHRlcihjYiA9PiAhY2IuY2FsbGJhY2sucGVyc2lzdGVudCk7XG4gICAgICAgIGNvbnN0IG5leHQgPSBCb29sZWFuKG5vblBlcnNpc3RlbnRDYWxsYmFja3MubGVuZ3RoKTtcbiAgICAgICAgaWYgKGlzTG9hZGluZyAhPT0gbmV4dCkge1xuICAgICAgICAgICAgZGlzcGF0Y2goc2V0SXNMb2FkaW5nKG5leHQpKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaW5wdXRzOiBbJ2NhbGxiYWNrcyddXG59O1xuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQgeyBmaW5kLCBmbGF0dGVuLCBtYXAsIHBhcnRpdGlvbiwgc29ydCB9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7IGFkZEJsb2NrZWRDYWxsYmFja3MsIGFkZEV4ZWN1dGluZ0NhbGxiYWNrcywgYWdncmVnYXRlQ2FsbGJhY2tzLCBleGVjdXRlQ2FsbGJhY2ssIHJlbW92ZUJsb2NrZWRDYWxsYmFja3MsIHJlbW92ZVByaW9yaXRpemVkQ2FsbGJhY2tzIH0gZnJvbSAnLi4vYWN0aW9ucy9jYWxsYmFja3MnO1xuaW1wb3J0IHsgc3RyaW5naWZ5SWQgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBjb21iaW5lSWRBbmRQcm9wIH0gZnJvbSAnLi4vYWN0aW9ucy9kZXBlbmRlbmNpZXNfdHMnO1xuaW1wb3J0IGlzQXBwUmVhZHkgZnJvbSAnLi4vYWN0aW9ucy9pc0FwcFJlYWR5JztcbmltcG9ydCB7IGdldEFwcFN0YXRlIH0gZnJvbSAnLi4vcmVkdWNlcnMvY29uc3RhbnRzJztcbmNvbnN0IHNvcnRQcmlvcml0eSA9IChjMSwgYzIpID0+IHtcbiAgICByZXR1cm4gKGMxLnByaW9yaXR5ID8/ICcnKSA+IChjMi5wcmlvcml0eSA/PyAnJykgPyAtMSA6IDE7XG59O1xuY29uc3QgZ2V0U3Rhc2ggPSAoY2IsIHBhdGhzKSA9PiB7XG4gICAgY29uc3QgeyBnZXRPdXRwdXRzIH0gPSBjYjtcbiAgICBjb25zdCBhbGxPdXRwdXRzID0gZ2V0T3V0cHV0cyhwYXRocyk7XG4gICAgY29uc3QgZmxhdE91dHB1dHMgPSBmbGF0dGVuKGFsbE91dHB1dHMpO1xuICAgIGNvbnN0IGFsbFByb3BJZHMgPSBbXTtcbiAgICBjb25zdCByZXFPdXQgPSB7fTtcbiAgICBmbGF0T3V0cHV0cy5mb3JFYWNoKCh7IGlkLCBwcm9wZXJ0eSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGlkU3RyID0gc3RyaW5naWZ5SWQoaWQpO1xuICAgICAgICBjb25zdCBpZE91dCA9IChyZXFPdXRbaWRTdHJdID0gcmVxT3V0W2lkU3RyXSB8fCBbXSk7XG4gICAgICAgIGlkT3V0LnB1c2gocHJvcGVydHkpO1xuICAgICAgICBhbGxQcm9wSWRzLnB1c2goY29tYmluZUlkQW5kUHJvcCh7IGlkOiBpZFN0ciwgcHJvcGVydHkgfSkpO1xuICAgIH0pO1xuICAgIHJldHVybiB7IGFsbE91dHB1dHMsIGFsbFByb3BJZHMgfTtcbn07XG5jb25zdCBnZXRJZHMgPSAoY2IsIHBhdGhzKSA9PiB7XG4gICAgY29uc3QgaXRlbXMgPSBbXG4gICAgICAgIC4uLmZsYXR0ZW4oY2IuZ2V0SW5wdXRzKHBhdGhzKSksXG4gICAgICAgIC4uLmZsYXR0ZW4oY2IuZ2V0U3RhdGUocGF0aHMpKVxuICAgIF07XG4gICAgY29uc3QgdW5pcXVlSWRzID0gbmV3IE1hcChpdGVtcy5tYXAoaXRlbSA9PiBbc3RyaW5naWZ5SWQoaXRlbS5pZCksIGl0ZW1dKSk7XG4gICAgY29uc3QgdW5pcXVlSXRlbXMgPSBBcnJheS5mcm9tKHVuaXF1ZUlkcy52YWx1ZXMoKSk7XG4gICAgcmV0dXJuIHVuaXF1ZUl0ZW1zO1xufTtcbmNvbnN0IG9ic2VydmVyID0ge1xuICAgIG9ic2VydmVyOiBhc3luYyAoeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrczogeyBleGVjdXRpbmcsIHdhdGNoZWQgfSwgY29uZmlnLCBob29rcywgbGF5b3V0LCBwYXRocywgYXBwTGlmZWN5Y2xlIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBsZXQgeyBjYWxsYmFja3M6IHsgcHJpb3JpdGl6ZWQgfSB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgaWYgKGFwcExpZmVjeWNsZSAhPT0gZ2V0QXBwU3RhdGUoJ0hZRFJBVEVEJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhdmFpbGFibGUgPSBNYXRoLm1heCgwLCAxMiAtIGV4ZWN1dGluZy5sZW5ndGggLSB3YXRjaGVkLmxlbmd0aCk7XG4gICAgICAgIC8vIE9yZGVyIHByaW9yaXRpemVkIGNhbGxiYWNrcyBiYXNlZCBvbiBkZXB0aCBhbmQgYnJlYWR0aCBvZiBjYWxsYmFjayBjaGFpblxuICAgICAgICBwcmlvcml0aXplZCA9IHNvcnQoc29ydFByaW9yaXR5LCBwcmlvcml0aXplZCk7XG4gICAgICAgIC8vIERpdmlkZSBiZXR3ZWVuIHN5bmMgYW5kIGFzeW5jXG4gICAgICAgIGNvbnN0IFtzeW5jQ2FsbGJhY2tzLCBhc3luY0NhbGxiYWNrc10gPSBwYXJ0aXRpb24oY2IgPT4gaXNBcHBSZWFkeShsYXlvdXQsIHBhdGhzLCBnZXRJZHMoY2IsIHBhdGhzKSkgPT09IHRydWUsIHByaW9yaXRpemVkKTtcbiAgICAgICAgY29uc3QgcGlja2VkU3luY0NhbGxiYWNrcyA9IHN5bmNDYWxsYmFja3Muc2xpY2UoMCwgYXZhaWxhYmxlKTtcbiAgICAgICAgY29uc3QgcGlja2VkQXN5bmNDYWxsYmFja3MgPSBhc3luY0NhbGxiYWNrcy5zbGljZSgwLCBhdmFpbGFibGUgLSBwaWNrZWRTeW5jQ2FsbGJhY2tzLmxlbmd0aCk7XG4gICAgICAgIGlmIChwaWNrZWRTeW5jQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgZGlzcGF0Y2goYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgICAgICByZW1vdmVQcmlvcml0aXplZENhbGxiYWNrcyhwaWNrZWRTeW5jQ2FsbGJhY2tzKSxcbiAgICAgICAgICAgICAgICBhZGRFeGVjdXRpbmdDYWxsYmFja3MobWFwKGNiID0+IGV4ZWN1dGVDYWxsYmFjayhjYiwgY29uZmlnLCBob29rcywgcGF0aHMsIGxheW91dCwgZ2V0U3Rhc2goY2IsIHBhdGhzKSwgZGlzcGF0Y2gsIGdldFN0YXRlKSwgcGlja2VkU3luY0NhbGxiYWNrcykpXG4gICAgICAgICAgICBdKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBpY2tlZEFzeW5jQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZGVmZXJyZWQgPSBtYXAoY2IgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi5jYixcbiAgICAgICAgICAgICAgICAuLi5nZXRTdGFzaChjYiwgcGF0aHMpLFxuICAgICAgICAgICAgICAgIGlzUmVhZHk6IGlzQXBwUmVhZHkobGF5b3V0LCBwYXRocywgZ2V0SWRzKGNiLCBwYXRocykpXG4gICAgICAgICAgICB9KSwgcGlja2VkQXN5bmNDYWxsYmFja3MpO1xuICAgICAgICAgICAgZGlzcGF0Y2goYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgICAgICByZW1vdmVQcmlvcml0aXplZENhbGxiYWNrcyhwaWNrZWRBc3luY0NhbGxiYWNrcyksXG4gICAgICAgICAgICAgICAgYWRkQmxvY2tlZENhbGxiYWNrcyhkZWZlcnJlZClcbiAgICAgICAgICAgIF0pKTtcbiAgICAgICAgICAgIGRlZmVycmVkLmZvckVhY2goYXN5bmMgKGNiKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgY2IuaXNSZWFkeTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNhbGxiYWNrczogeyBibG9ja2VkIH0gfSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgYGJsb2NrZWRgIGxpc3Qgc2luY2UgLSBvblxuICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIGNvbXBsZXRpb24sIGFub3RoZXIgY2FsbGJhY2sgbWF5IGJlIGNhbmNlbGxlZFxuICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGNhbGxiYWNrIGluc3RhbmNlIG9yIG9uZSB0aGF0IG1hdGNoZXMgaXRzIHByb21pc2VcbiAgICAgICAgICAgICAgICAvLyAoZWcuIGNvdWxkIGhhdmUgYmVlbiBwcnVuZWQpXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudENiID0gZmluZChfY2IgPT4gX2NiID09PSBjYiB8fCBfY2IuaXNSZWFkeSA9PT0gY2IuaXNSZWFkeSwgYmxvY2tlZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50Q2IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRpbmdDYWxsYmFjayA9IGV4ZWN1dGVDYWxsYmFjayhjYiwgY29uZmlnLCBob29rcywgcGF0aHMsIGxheW91dCwgY2IsIGRpc3BhdGNoLCBnZXRTdGF0ZSk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQmxvY2tlZENhbGxiYWNrcyhbY2JdKSxcbiAgICAgICAgICAgICAgICAgICAgYWRkRXhlY3V0aW5nQ2FsbGJhY2tzKFtleGVjdXRpbmdDYWxsYmFja10pXG4gICAgICAgICAgICAgICAgXSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGlucHV0czogWydjYWxsYmFja3MucHJpb3JpdGl6ZWQnLCAnY2FsbGJhY2tzLmNvbXBsZXRlZCddXG59O1xuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQgeyBhbGwsIGNvbmNhdCwgZGlmZmVyZW5jZSwgZmlsdGVyLCBmbGF0dGVuLCBncm91cEJ5LCBpbmNsdWRlcywgaW50ZXJzZWN0aW9uLCBpc0VtcHR5LCBpc05pbCwgbWFwLCBtZXJnZUxlZnQsIG1lcmdlV2l0aCwgcGx1Y2ssIHJlZHVjZSwgdmFsdWVzIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWdncmVnYXRlQ2FsbGJhY2tzLCByZW1vdmVQcmlvcml0aXplZENhbGxiYWNrcywgcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzLCByZW1vdmVXYXRjaGVkQ2FsbGJhY2tzLCBhZGRQcmlvcml0aXplZENhbGxiYWNrcywgYWRkRXhlY3V0aW5nQ2FsbGJhY2tzLCBhZGRXYXRjaGVkQ2FsbGJhY2tzLCByZW1vdmVCbG9ja2VkQ2FsbGJhY2tzLCBhZGRCbG9ja2VkQ2FsbGJhY2tzLCBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MsIHJlbW92ZVJlcXVlc3RlZENhbGxiYWNrcyB9IGZyb20gJy4uL2FjdGlvbnMvY2FsbGJhY2tzJztcbmltcG9ydCB7IGlzTXVsdGlWYWx1ZWQgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBjb21iaW5lSWRBbmRQcm9wLCBnZXRSZWFkeUNhbGxiYWNrcywgZ2V0VW5pcXVlSWRlbnRpZmllciwgcHJ1bmVDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llc190cyc7XG5pbXBvcnQgd2FpdCBmcm9tICcuLy4uL3V0aWxzL3dhaXQnO1xuaW1wb3J0IHsgZ2V0UGVuZGluZ0NhbGxiYWNrcyB9IGZyb20gJy4uL3V0aWxzL2NhbGxiYWNrcyc7XG5jb25zdCBvYnNlcnZlciA9IHtcbiAgICBvYnNlcnZlcjogYXN5bmMgKHsgZGlzcGF0Y2gsIGdldFN0YXRlIH0pID0+IHtcbiAgICAgICAgYXdhaXQgd2FpdCgwKTtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3MsIGNhbGxiYWNrczogeyBwcmlvcml0aXplZCwgYmxvY2tlZCwgZXhlY3V0aW5nLCB3YXRjaGVkLCBzdG9yZWQgfSwgcGF0aHMsIGdyYXBocyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgbGV0IHsgY2FsbGJhY2tzOiB7IHJlcXVlc3RlZCB9IH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBpbml0aWFsUmVxdWVzdGVkID0gcmVxdWVzdGVkLnNsaWNlKDApO1xuICAgICAgICBjb25zdCBwZW5kaW5nQ2FsbGJhY2tzID0gZ2V0UGVuZGluZ0NhbGxiYWNrcyhjYWxsYmFja3MpO1xuICAgICAgICAvKlxuICAgICAgICAgICAgMC4gUHJ1bmUgY2lyY3VsYXIgY2FsbGJhY2tzIHRoYXQgaGF2ZSBjb21wbGV0ZWQgdGhlIGxvb3BcbiAgICAgICAgICAgIC0gY2IuY2FsbGJhY2sgaW5jbHVkZWQgaW4gY2IucHJlZGVjZXNzb3JzXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IHJDaXJjdWxhcnMgPSBmaWx0ZXIoY2IgPT4gaW5jbHVkZXMoY2IuY2FsbGJhY2ssIGNiLnByZWRlY2Vzc29ycyA/PyBbXSksIHJlcXVlc3RlZCk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgY2lyY3VsYXJzIHdpbGwgYmUgcmVtb3ZlZCBmb3IgcmVhbFxuICAgICAgICAqL1xuICAgICAgICByZXF1ZXN0ZWQgPSBkaWZmZXJlbmNlKHJlcXVlc3RlZCwgckNpcmN1bGFycyk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICAxLiBSZW1vdmUgZHVwbGljYXRlZCBgcmVxdWVzdGVkYCBjYWxsYmFja3MgLSBnaXZlIHByZWNlZGVuY2UgdG8gbmV3ZXIgY2FsbGJhY2tzIG92ZXIgb2xkZXIgb25lc1xuICAgICAgICAqL1xuICAgICAgICBsZXQgckR1cGxpY2F0ZXMgPSBbXTtcbiAgICAgICAgY29uc3Qgck1lcmdlZER1cGxpY2F0ZXMgPSBbXTtcbiAgICAgICAgdmFsdWVzKGdyb3VwQnkoZ2V0VW5pcXVlSWRlbnRpZmllciwgcmVxdWVzdGVkKSkuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgICAgICBpZiAoZ3JvdXAubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8ga2VlcCBjYWxsYmFjayBpZiBpdHMgdGhlIG9ubHkgb25lIG9mIGl0cyBraW5kXG4gICAgICAgICAgICAgICAgck1lcmdlZER1cGxpY2F0ZXMucHVzaChncm91cFswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsID0gZ3JvdXAuZmluZChjYiA9PiBjYi5pbml0aWFsQ2FsbCk7XG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCB0aGUgaW5pdGlhbCBjYWxsYmFjayBpZiBpdCdzIG5vdCBhbG9uZVxuICAgICAgICAgICAgICAgICAgICByRHVwbGljYXRlcy5wdXNoKGluaXRpYWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBncm91cFdpdGhvdXRJbml0aWFsID0gZ3JvdXAuZmlsdGVyKGNiID0+IGNiICE9PSBpbml0aWFsKTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBXaXRob3V0SW5pdGlhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBvbmx5IG9uZSBjYWxsYmFjayBiZXNpZGUgdGhlIGluaXRpYWwgb25lLCBrZWVwIHRoYXQgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgck1lcmdlZER1cGxpY2F0ZXMucHVzaChncm91cFdpdGhvdXRJbml0aWFsWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBtZXJnZSBhbGwgcmVtYWluaW5nIGNhbGxiYWNrcyB0b2dldGhlclxuICAgICAgICAgICAgICAgICAgICByRHVwbGljYXRlcyA9IGNvbmNhdChyRHVwbGljYXRlcywgZ3JvdXBXaXRob3V0SW5pdGlhbCk7XG4gICAgICAgICAgICAgICAgICAgIHJNZXJnZWREdXBsaWNhdGVzLnB1c2gobWVyZ2VMZWZ0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRQcm9wSWRzOiByZWR1Y2UobWVyZ2VXaXRoKE1hdGgubWF4KSwge30sIHBsdWNrKCdjaGFuZ2VkUHJvcElkcycsIGdyb3VwV2l0aG91dEluaXRpYWwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkdyb3VwOiBmaWx0ZXIoZXhnID0+IEJvb2xlYW4oZXhnKSwgcGx1Y2soJ2V4ZWN1dGlvbkdyb3VwJywgZ3JvdXBXaXRob3V0SW5pdGlhbCkpLnNsaWNlKC0xKVswXVxuICAgICAgICAgICAgICAgICAgICB9LCBncm91cFdpdGhvdXRJbml0aWFsLnNsaWNlKC0xKVswXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgZHVwbGljYXRlcyB3aWxsIGJlIHJlbW92ZWQgZm9yIHJlYWxcbiAgICAgICAgKi9cbiAgICAgICAgcmVxdWVzdGVkID0gck1lcmdlZER1cGxpY2F0ZXM7XG4gICAgICAgIC8qXG4gICAgICAgICAgICAyLiBSZW1vdmUgZHVwbGljYXRlZCBgcHJpb3JpdGl6ZWRgLCBgZXhlY3V0aW5nYCBhbmQgYHdhdGNoaW5nYCBjYWxsYmFja3NcbiAgICAgICAgKi9cbiAgICAgICAgLypcbiAgICAgICAgICAgIEV4dHJhY3QgYWxsIGJ1dCB0aGUgZmlyc3QgY2FsbGJhY2sgZnJvbSBlYWNoIElPUy1rZXkgZ3JvdXBcbiAgICAgICAgICAgIHRoZXNlIGNhbGxiYWNrcyBhcmUgYHByaW9yaXRpemVkYCBhbmQgZHVwbGljYXRlcy5cbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgcER1cGxpY2F0ZXMgPSBmbGF0dGVuKG1hcChncm91cCA9PiBncm91cC5zbGljZSgwLCAtMSksIHZhbHVlcyhncm91cEJ5KGdldFVuaXF1ZUlkZW50aWZpZXIsIGNvbmNhdChwcmlvcml0aXplZCwgcmVxdWVzdGVkKSkpKSk7XG4gICAgICAgIGNvbnN0IGJEdXBsaWNhdGVzID0gZmxhdHRlbihtYXAoZ3JvdXAgPT4gZ3JvdXAuc2xpY2UoMCwgLTEpLCB2YWx1ZXMoZ3JvdXBCeShnZXRVbmlxdWVJZGVudGlmaWVyLCBjb25jYXQoYmxvY2tlZCwgcmVxdWVzdGVkKSkpKSk7XG4gICAgICAgIGNvbnN0IGVEdXBsaWNhdGVzID0gZmxhdHRlbihtYXAoZ3JvdXAgPT4gZ3JvdXAuc2xpY2UoMCwgLTEpLCB2YWx1ZXMoZ3JvdXBCeShnZXRVbmlxdWVJZGVudGlmaWVyLCBjb25jYXQoZXhlY3V0aW5nLCByZXF1ZXN0ZWQpKSkpKTtcbiAgICAgICAgY29uc3Qgd0R1cGxpY2F0ZXMgPSBmbGF0dGVuKG1hcChncm91cCA9PiBncm91cC5zbGljZSgwLCAtMSksIHZhbHVlcyhncm91cEJ5KGdldFVuaXF1ZUlkZW50aWZpZXIsIGNvbmNhdCh3YXRjaGVkLCByZXF1ZXN0ZWQpKSkpKTtcbiAgICAgICAgLypcbiAgICAgICAgICAgIDMuIE1vZGlmeSBvciByZW1vdmUgY2FsbGJhY2tzIHRoYXQgYXJlIG91dHB1dHRpbmcgdG8gbm9uLWV4aXN0aW5nIGxheW91dCBgaWRgLlxuICAgICAgICAqL1xuICAgICAgICBjb25zdCB7IGFkZGVkOiByQWRkZWQsIHJlbW92ZWQ6IHJSZW1vdmVkIH0gPSBwcnVuZUNhbGxiYWNrcyhyZXF1ZXN0ZWQsIHBhdGhzKTtcbiAgICAgICAgY29uc3QgeyBhZGRlZDogcEFkZGVkLCByZW1vdmVkOiBwUmVtb3ZlZCB9ID0gcHJ1bmVDYWxsYmFja3MocHJpb3JpdGl6ZWQsIHBhdGhzKTtcbiAgICAgICAgY29uc3QgeyBhZGRlZDogYkFkZGVkLCByZW1vdmVkOiBiUmVtb3ZlZCB9ID0gcHJ1bmVDYWxsYmFja3MoYmxvY2tlZCwgcGF0aHMpO1xuICAgICAgICBjb25zdCB7IGFkZGVkOiBlQWRkZWQsIHJlbW92ZWQ6IGVSZW1vdmVkIH0gPSBwcnVuZUNhbGxiYWNrcyhleGVjdXRpbmcsIHBhdGhzKTtcbiAgICAgICAgY29uc3QgeyBhZGRlZDogd0FkZGVkLCByZW1vdmVkOiB3UmVtb3ZlZCB9ID0gcHJ1bmVDYWxsYmFja3Mod2F0Y2hlZCwgcGF0aHMpO1xuICAgICAgICAvKlxuICAgICAgICAgICAgVE9ETz9cbiAgICAgICAgICAgIENsZWFuIHVwIHRoZSBgcmVxdWVzdGVkYCBsaXN0IC0gZHVyaW5nIHRoZSBkaXNwYXRjaCBwaGFzZSxcbiAgICAgICAgICAgIGl0IHdpbGwgYmUgdXBkYXRlZCBmb3IgcmVhbFxuICAgICAgICAqL1xuICAgICAgICByZXF1ZXN0ZWQgPSBjb25jYXQoZGlmZmVyZW5jZShyZXF1ZXN0ZWQsIHJSZW1vdmVkKSwgckFkZGVkKTtcbiAgICAgICAgLypcbiAgICAgICAgICAgIDQuIEZpbmQgYHJlcXVlc3RlZGAgY2FsbGJhY2tzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBhIG91dHN0YW5kaW5nIG91dHB1dCAoYXMgZWl0aGVyIGlucHV0IG9yIHN0YXRlKVxuICAgICAgICAqL1xuICAgICAgICBsZXQgcmVhZHlDYWxsYmFja3MgPSBnZXRSZWFkeUNhbGxiYWNrcyhwYXRocywgcmVxdWVzdGVkLCBwZW5kaW5nQ2FsbGJhY2tzLCBncmFwaHMpO1xuICAgICAgICBsZXQgb2xkQmxvY2tlZCA9IFtdO1xuICAgICAgICBsZXQgbmV3QmxvY2tlZCA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogSWYgdGhlcmUgaXMgOlxuICAgICAgICAgKiAtIG5vIHJlYWR5IGNhbGxiYWNrc1xuICAgICAgICAgKiAtIGF0IGxlYXN0IG9uZSByZXF1ZXN0ZWQgY2FsbGJhY2tcbiAgICAgICAgICogLSBubyBhZGRpdGlvbmFsIHBlbmRpbmcgY2FsbGJhY2tzXG4gICAgICAgICAqXG4gICAgICAgICAqIGNhbiBhc3N1bWU6XG4gICAgICAgICAqIC0gdGhlIHJlcXVlc3RlZCBjYWxsYmFja3MgYXJlIHBhcnQgb2YgYSBjaXJjdWxhciBkZXBlbmRlbmN5IGxvb3BcbiAgICAgICAgICpcbiAgICAgICAgICogdGhlbiByZWN1cnNpdmVseTpcbiAgICAgICAgICogLSBhc3N1bWUgdGhlIGZpcnN0IGNhbGxiYWNrIGluIHRoZSBsaXN0IGlzIHJlYWR5ICh0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBsb29wKVxuICAgICAgICAgKiAtIGNoZWNrIHdoYXQgY2FsbGJhY2tzIGFyZSBibG9ja2VkIC8gcmVhZHkgd2l0aCB0aGUgYXNzdW1wdGlvblxuICAgICAgICAgKiAtIHVwZGF0ZSB0aGUgbWlzc2luZyBwcmVkZWNlc3NvcnMgYmFzZWQgb24gYXNzdW1wdGlvbnNcbiAgICAgICAgICogLSBjb250aW51ZSB1bnRpbCB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIGNhbmRpZGF0ZXNcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGlmICghcmVhZHlDYWxsYmFja3MubGVuZ3RoICYmXG4gICAgICAgICAgICByZXF1ZXN0ZWQubGVuZ3RoICYmXG4gICAgICAgICAgICByZXF1ZXN0ZWQubGVuZ3RoID09PSBwZW5kaW5nQ2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSByZXF1ZXN0ZWQuc2xpY2UoMCk7XG4gICAgICAgICAgICB3aGlsZSAoY2FuZGlkYXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBBc3N1bWUgMXN0IGNhbGxiYWNrIGlzIHJlYWR5IGFuZFxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjYW5kaWRhdGVzIC8gcmVhZHlDYWxsYmFja3MgYWNjb3JkaW5nbHlcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkeUNhbGxiYWNrID0gY2FuZGlkYXRlc1swXTtcbiAgICAgICAgICAgICAgICByZWFkeUNhbGxiYWNrcy5wdXNoKHJlYWR5Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMgPSBjYW5kaWRhdGVzLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIC8vIFJlbWFpbmluZyBjYW5kaWRhdGVzIGFyZSBub3QgYmxvY2tlZCBieSBjdXJyZW50IGFzc3VtcHRpb25zXG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlcyA9IGdldFJlYWR5Q2FsbGJhY2tzKHBhdGhzLCBjYW5kaWRhdGVzLCByZWFkeUNhbGxiYWNrcyk7XG4gICAgICAgICAgICAgICAgLy8gQmxvY2tlZCByZXF1ZXN0cyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGV5IGhhdmUgdGhlIGNhbGxiYWNrIGFzIGEgcHJlZGVjZXNzb3JcbiAgICAgICAgICAgICAgICBjb25zdCBibG9ja2VkQnlBc3N1bXB0aW9ucyA9IGRpZmZlcmVuY2UoY2FuZGlkYXRlcywgY2FuZGlkYXRlcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZWQgPSBmaWx0ZXIoY2IgPT4gIWNiLnByZWRlY2Vzc29ycyB8fFxuICAgICAgICAgICAgICAgICAgICAhaW5jbHVkZXMocmVhZHlDYWxsYmFjay5jYWxsYmFjaywgY2IucHJlZGVjZXNzb3JzKSwgYmxvY2tlZEJ5QXNzdW1wdGlvbnMpO1xuICAgICAgICAgICAgICAgIG9sZEJsb2NrZWQgPSBjb25jYXQob2xkQmxvY2tlZCwgbW9kaWZpZWQpO1xuICAgICAgICAgICAgICAgIG5ld0Jsb2NrZWQgPSBjb25jYXQobmV3QmxvY2tlZCwgbW9kaWZpZWQubWFwKGNiID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvcnM6IGNvbmNhdChjYi5wcmVkZWNlc3NvcnMgPz8gW10sIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5Q2FsbGJhY2suY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgaXQgd2lsbCBiZSB1cGRhdGVkIGZvciByZWFsXG4gICAgICAgICovXG4gICAgICAgIHJlcXVlc3RlZCA9IGNvbmNhdChkaWZmZXJlbmNlKHJlcXVlc3RlZCwgb2xkQmxvY2tlZCksIG5ld0Jsb2NrZWQpO1xuICAgICAgICAvKlxuICAgICAgICAgICAgNS4gUHJ1bmUgY2FsbGJhY2tzIHRoYXQgYmVjYW1lIGlycmVsZXZhbnQgaW4gdGhlaXIgYGV4ZWN1dGlvbkdyb3VwYFxuICAgICAgICAqL1xuICAgICAgICAvLyBHcm91cCBieSBleGVjdXRpb25Hcm91cCwgZHJvcCBub24tZXhlY3V0aW9uR3JvdXAgY2FsbGJhY2tzXG4gICAgICAgIC8vIHRob3NlIHdlcmUgbm90IHRyaWdnZXJlZCBieSBsYXlvdXQgY2hhbmdlcyBhbmQgZG9uJ3QgaGF2ZSBcInN0cm9uZ1wiIGludGVyZGVwZW5kZW5jeSBmb3JcbiAgICAgICAgLy8gY2FsbGJhY2sgY2hhaW4gY29tcGxldGlvblxuICAgICAgICBjb25zdCBwZW5kaW5nR3JvdXBzID0gZ3JvdXBCeShjYiA9PiBjYi5leGVjdXRpb25Hcm91cCwgZmlsdGVyKGNiID0+ICFpc05pbChjYi5leGVjdXRpb25Hcm91cCksIHN0b3JlZCkpO1xuICAgICAgICBjb25zdCBkcm9wcGVkID0gZmlsdGVyKGNiID0+IHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGBzdG9yZWRgIGNhbGxiYWNrIGZvciB0aGUgZ3JvdXAsIG5vIG91dHB1dHMgd2VyZSBkcm9wcGVkIC0+IGBjYmAgaXMga2VwdFxuICAgICAgICAgICAgaWYgKCFjYi5leGVjdXRpb25Hcm91cCB8fFxuICAgICAgICAgICAgICAgICFwZW5kaW5nR3JvdXBzW2NiLmV4ZWN1dGlvbkdyb3VwXSB8fFxuICAgICAgICAgICAgICAgICFwZW5kaW5nR3JvdXBzW2NiLmV4ZWN1dGlvbkdyb3VwXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgYWxsIGlucHV0cyBmb3IgYGNiYFxuICAgICAgICAgICAgY29uc3QgaW5wdXRzID0gbWFwKGNvbWJpbmVJZEFuZFByb3AsIGZsYXR0ZW4oY2IuZ2V0SW5wdXRzKHBhdGhzKSkpO1xuICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgcG90ZW50aWFsbHkgdXBkYXRlZCBwcm9wcyBmb3IgdGhlIGdyb3VwIHNvIGZhclxuICAgICAgICAgICAgY29uc3QgYWxsUHJvcHMgPSBmbGF0dGVuKG1hcChnY2IgPT4gZ2NiLmV4ZWN1dGlvbk1ldGEuYWxsUHJvcHMsIHBlbmRpbmdHcm91cHNbY2IuZXhlY3V0aW9uR3JvdXBdKSk7XG4gICAgICAgICAgICAvLyBHZXQgYWxsIHRoZSB1cGRhdGVkIHByb3BzIGZvciB0aGUgZ3JvdXAgc28gZmFyXG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkID0gZmxhdHRlbihtYXAoZ2NiID0+IGdjYi5leGVjdXRpb25NZXRhLnVwZGF0ZWRQcm9wcywgcGVuZGluZ0dyb3Vwc1tjYi5leGVjdXRpb25Hcm91cF0pKTtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gb3ZlcmxhcCBiZXR3ZWVuIHRoZSB1cGRhdGVkIHByb3BzIGFuZCB0aGUgaW5wdXRzLFxuICAgICAgICAgICAgLy8gKyB0aGVyZSdzIG5vIHByb3BzIHRoYXQgYXJlbid0IGNvdmVyZWQgYnkgdGhlIHBvdGVudGlhbGx5IHVwZGF0ZWQgcHJvcHMsXG4gICAgICAgICAgICAvLyBhbmQgbm90IGFsbCBpbnB1dHMgYXJlIG11bHRpIHZhbHVlZFxuICAgICAgICAgICAgLy8gLT4gZHJvcCBgY2JgXG4gICAgICAgICAgICBjb25zdCByZXMgPSBpc0VtcHR5KGludGVyc2VjdGlvbihpbnB1dHMsIHVwZGF0ZWQpKSAmJlxuICAgICAgICAgICAgICAgIGlzRW1wdHkoZGlmZmVyZW5jZShpbnB1dHMsIGFsbFByb3BzKSkgJiZcbiAgICAgICAgICAgICAgICAhYWxsKGlzTXVsdGlWYWx1ZWQsIGNiLmNhbGxiYWNrLmlucHV0cyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9LCByZWFkeUNhbGxiYWNrcyk7XG4gICAgICAgIC8qXG4gICAgICAgICAgICBUT0RPP1xuICAgICAgICAgICAgQ2xlYW4gdXAgdGhlIGByZXF1ZXN0ZWRgIGxpc3QgLSBkdXJpbmcgdGhlIGRpc3BhdGNoIHBoYXNlLFxuICAgICAgICAgICAgaXQgd2lsbCBiZSB1cGRhdGVkIGZvciByZWFsXG4gICAgICAgICovXG4gICAgICAgIHJlcXVlc3RlZCA9IGRpZmZlcmVuY2UocmVxdWVzdGVkLCBkcm9wcGVkKTtcbiAgICAgICAgcmVhZHlDYWxsYmFja3MgPSBkaWZmZXJlbmNlKHJlYWR5Q2FsbGJhY2tzLCBkcm9wcGVkKTtcbiAgICAgICAgcmVxdWVzdGVkID0gZGlmZmVyZW5jZShyZXF1ZXN0ZWQsIHJlYWR5Q2FsbGJhY2tzKTtcbiAgICAgICAgY29uc3QgYWRkZWQgPSBkaWZmZXJlbmNlKHJlcXVlc3RlZCwgaW5pdGlhbFJlcXVlc3RlZCk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBkaWZmZXJlbmNlKGluaXRpYWxSZXF1ZXN0ZWQsIHJlcXVlc3RlZCk7XG4gICAgICAgIGRpc3BhdGNoKGFnZ3JlZ2F0ZUNhbGxiYWNrcyhbXG4gICAgICAgICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0ZWQgY2FsbGJhY2tzXG4gICAgICAgICAgICBhZGRlZC5sZW5ndGggPyBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MoYWRkZWQpIDogbnVsbCxcbiAgICAgICAgICAgIHJlbW92ZWQubGVuZ3RoID8gcmVtb3ZlUmVxdWVzdGVkQ2FsbGJhY2tzKHJlbW92ZWQpIDogbnVsbCxcbiAgICAgICAgICAgIC8vIENsZWFuIHVwIGR1cGxpY2F0ZWQgY2FsbGJhY2tzXG4gICAgICAgICAgICBwRHVwbGljYXRlcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHJlbW92ZVByaW9yaXRpemVkQ2FsbGJhY2tzKHBEdXBsaWNhdGVzKVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIGJEdXBsaWNhdGVzLmxlbmd0aCA/IHJlbW92ZUJsb2NrZWRDYWxsYmFja3MoYkR1cGxpY2F0ZXMpIDogbnVsbCxcbiAgICAgICAgICAgIGVEdXBsaWNhdGVzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzKGVEdXBsaWNhdGVzKVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIHdEdXBsaWNhdGVzLmxlbmd0aCA/IHJlbW92ZVdhdGNoZWRDYWxsYmFja3Mod0R1cGxpY2F0ZXMpIDogbnVsbCxcbiAgICAgICAgICAgIC8vIFBydW5lIGNhbGxiYWNrc1xuICAgICAgICAgICAgcFJlbW92ZWQubGVuZ3RoID8gcmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MocFJlbW92ZWQpIDogbnVsbCxcbiAgICAgICAgICAgIHBBZGRlZC5sZW5ndGggPyBhZGRQcmlvcml0aXplZENhbGxiYWNrcyhwQWRkZWQpIDogbnVsbCxcbiAgICAgICAgICAgIGJSZW1vdmVkLmxlbmd0aCA/IHJlbW92ZUJsb2NrZWRDYWxsYmFja3MoYlJlbW92ZWQpIDogbnVsbCxcbiAgICAgICAgICAgIGJBZGRlZC5sZW5ndGggPyBhZGRCbG9ja2VkQ2FsbGJhY2tzKGJBZGRlZCkgOiBudWxsLFxuICAgICAgICAgICAgZVJlbW92ZWQubGVuZ3RoID8gcmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzKGVSZW1vdmVkKSA6IG51bGwsXG4gICAgICAgICAgICBlQWRkZWQubGVuZ3RoID8gYWRkRXhlY3V0aW5nQ2FsbGJhY2tzKGVBZGRlZCkgOiBudWxsLFxuICAgICAgICAgICAgd1JlbW92ZWQubGVuZ3RoID8gcmVtb3ZlV2F0Y2hlZENhbGxiYWNrcyh3UmVtb3ZlZCkgOiBudWxsLFxuICAgICAgICAgICAgd0FkZGVkLmxlbmd0aCA/IGFkZFdhdGNoZWRDYWxsYmFja3Mod0FkZGVkKSA6IG51bGwsXG4gICAgICAgICAgICAvLyBQcm9tb3RlIGNhbGxiYWNrc1xuICAgICAgICAgICAgcmVhZHlDYWxsYmFja3MubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBhZGRQcmlvcml0aXplZENhbGxiYWNrcyhyZWFkeUNhbGxiYWNrcylcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgXSkpO1xuICAgIH0sXG4gICAgaW5wdXRzOiBbJ2NhbGxiYWNrcy5yZXF1ZXN0ZWQnLCAnY2FsbGJhY2tzLmNvbXBsZXRlZCddXG59O1xuZXhwb3J0IGRlZmF1bHQgb2JzZXJ2ZXI7XG4iLCJpbXBvcnQgeyBjb25jYXQsIGZpbHRlciwgZ3JvdXBCeSwgaXNOaWwsIHBhcnRpdGlvbiwgcmVkdWNlLCB0b1BhaXJzIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgYWdncmVnYXRlQ2FsbGJhY2tzLCByZW1vdmVTdG9yZWRDYWxsYmFja3MgfSBmcm9tICcuLi9hY3Rpb25zL2NhbGxiYWNrcyc7XG5pbXBvcnQgeyBnZXRQZW5kaW5nQ2FsbGJhY2tzIH0gZnJvbSAnLi4vdXRpbHMvY2FsbGJhY2tzJztcbmNvbnN0IG9ic2VydmVyID0ge1xuICAgIG9ic2VydmVyOiAoeyBkaXNwYXRjaCwgZ2V0U3RhdGUgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGNhbGxiYWNrcyB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgcGVuZGluZ0NhbGxiYWNrcyA9IGdldFBlbmRpbmdDYWxsYmFja3MoY2FsbGJhY2tzKTtcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3M6IHsgc3RvcmVkIH0gfSA9IGdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IFtudWxsR3JvdXBDYWxsYmFja3MsIGdyb3VwQ2FsbGJhY2tzXSA9IHBhcnRpdGlvbihjYiA9PiBpc05pbChjYi5leGVjdXRpb25Hcm91cCksIHN0b3JlZCk7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGlvbkdyb3VwcyA9IGdyb3VwQnkoY2IgPT4gY2IuZXhlY3V0aW9uR3JvdXAsIGdyb3VwQ2FsbGJhY2tzKTtcbiAgICAgICAgY29uc3QgcGVuZGluZ0dyb3VwcyA9IGdyb3VwQnkoY2IgPT4gY2IuZXhlY3V0aW9uR3JvdXAsIGZpbHRlcihjYiA9PiAhaXNOaWwoY2IuZXhlY3V0aW9uR3JvdXApLCBwZW5kaW5nQ2FsbGJhY2tzKSk7XG4gICAgICAgIGNvbnN0IGRyb3BwZWQgPSByZWR1Y2UoKHJlcywgW2V4ZWN1dGlvbkdyb3VwLCBleGVjdXRpb25Hcm91cENhbGxiYWNrc10pID0+ICFwZW5kaW5nR3JvdXBzW2V4ZWN1dGlvbkdyb3VwXVxuICAgICAgICAgICAgPyBjb25jYXQocmVzLCBleGVjdXRpb25Hcm91cENhbGxiYWNrcylcbiAgICAgICAgICAgIDogcmVzLCBbXSwgdG9QYWlycyhleGVjdXRpb25Hcm91cHMpKTtcbiAgICAgICAgZGlzcGF0Y2goYWdncmVnYXRlQ2FsbGJhY2tzKFtcbiAgICAgICAgICAgIG51bGxHcm91cENhbGxiYWNrcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHJlbW92ZVN0b3JlZENhbGxiYWNrcyhudWxsR3JvdXBDYWxsYmFja3MpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgZHJvcHBlZC5sZW5ndGggPyByZW1vdmVTdG9yZWRDYWxsYmFja3MoZHJvcHBlZCkgOiBudWxsXG4gICAgICAgIF0pKTtcbiAgICB9LFxuICAgIGlucHV0czogWydjYWxsYmFja3Muc3RvcmVkJywgJ2NhbGxiYWNrcy5jb21wbGV0ZWQnXVxufTtcbmV4cG9ydCBkZWZhdWx0IG9ic2VydmVyO1xuIiwiLyoqXG4gKiBPYnNlcnZlciBmb3IgaGFuZGxpbmcgaW5jb21pbmcgV2ViU29ja2V0IG1lc3NhZ2VzIChTRVRfUFJPUFMsIEdFVF9QUk9QU19SRVFVRVNUKS5cbiAqL1xuaW1wb3J0IHsgcGF0aCB9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7IHVwZGF0ZVByb3BzLCBub3RpZnlPYnNlcnZlcnMsIHNldFBhdGhzIH0gZnJvbSAnLi4vYWN0aW9ucyc7XG5pbXBvcnQgeyBwYXJzZVBhdGNoUHJvcHMgfSBmcm9tICcuLi9hY3Rpb25zL3BhdGNoJztcbmltcG9ydCB7IGNvbXB1dGVQYXRocywgZ2V0UGF0aCB9IGZyb20gJy4uL2FjdGlvbnMvcGF0aHMnO1xuaW1wb3J0IHsgYmF0Y2ggfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgeyBnZXRXb3JrZXJDbGllbnQgfSBmcm9tICcuLi91dGlscy93b3JrZXJDbGllbnQnO1xuaW1wb3J0IHsgYWRkUmVxdWVzdGVkQ2FsbGJhY2tzIH0gZnJvbSAnLi4vYWN0aW9ucy9jYWxsYmFja3MnO1xuaW1wb3J0IHsgbWFrZVJlc29sdmVkQ2FsbGJhY2ssIHJlc29sdmVEZXBzIH0gZnJvbSAnLi4vYWN0aW9ucy9kZXBlbmRlbmNpZXNfdHMnO1xuLyoqXG4gKiBQYXJzZSBhIGNvbXBvbmVudCBJRCB0aGF0IG1heSBiZSBhIHN0cmluZ2lmaWVkIEpTT04gb2JqZWN0LlxuICogVGhpcyBoYW5kbGVzIGRpY3QgSURzIGxpa2UgJ3tcImluZGV4XCI6MCxcInR5cGVcIjpcIm91dHB1dFwifScgdGhhdCBuZWVkXG4gKiB0byBiZSBwYXJzZWQgYmFjayB0byBvYmplY3RzIGZvciBnZXRQYXRoIHRvIHdvcmsgY29ycmVjdGx5LlxuICovXG5mdW5jdGlvbiBwYXJzZUNvbXBvbmVudElkKGNvbXBvbmVudElkKSB7XG4gICAgaWYgKGNvbXBvbmVudElkLnN0YXJ0c1dpdGgoJ3snKSAmJiBjb21wb25lbnRJZC5lbmRzV2l0aCgnfScpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShjb21wb25lbnRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgLy8gTm90IHZhbGlkIEpTT04sIHJldHVybiBhcy1pc1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudElkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnRJZDtcbn1cbi8qKlxuICogSW5pdGlhbGl6ZSB0aGUgV2ViU29ja2V0IG9ic2VydmVyLlxuICpcbiAqIFNldHMgdXAgaGFuZGxlcnMgZm9yOlxuICogLSBTRVRfUFJPUFM6IFVwZGF0ZSBjb21wb25lbnQgcHJvcHMgd2hlbiByZWNlaXZlZCBmcm9tIHNlcnZlclxuICogLSBHRVRfUFJPUFNfUkVRVUVTVDogU2VuZCBjdXJyZW50IHByb3AgdmFsdWVzIGJhY2sgdG8gc2VydmVyXG4gKlxuICogQHBhcmFtIHN0b3JlIFJlZHV4IHN0b3JlXG4gKiBAcGFyYW0gY29uZmlnIERhc2ggY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZVdlYlNvY2tldChzdG9yZSwgY29uZmlnKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBXZWJTb2NrZXQgaWY6XG4gICAgLy8gMS4gR2xvYmFsIHdlYnNvY2tldCBpcyBlbmFibGVkLCBPUlxuICAgIC8vIDIuIFdlYlNvY2tldCBjb25maWcgaXMgYXZhaWxhYmxlIChmb3IgcGVyLWNhbGxiYWNrIHdlYnNvY2tldD1UcnVlKVxuICAgIGNvbnN0IHdzQXZhaWxhYmxlID0gISEoY29uZmlnLndlYnNvY2tldD8udXJsICYmIGNvbmZpZy53ZWJzb2NrZXQ/Lndvcmtlcl91cmwpO1xuICAgIGlmICghd3NBdmFpbGFibGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBDaGVjayBpZiBTaGFyZWRXb3JrZXIgaXMgc3VwcG9ydGVkXG4gICAgaWYgKHR5cGVvZiBTaGFyZWRXb3JrZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU2hhcmVkV29ya2VyIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyLiAnICtcbiAgICAgICAgICAgICdXZWJTb2NrZXQgY2FsbGJhY2tzIHdpbGwgZmFsbCBiYWNrIHRvIEhUVFAuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgd29ya2VyQ2xpZW50ID0gZ2V0V29ya2VyQ2xpZW50KCk7XG4gICAgLy8gSGVscGVyIHRvIHByb2Nlc3MgYSBzaW5nbGUgc2V0X3Byb3BzIHBheWxvYWRcbiAgICBjb25zdCBwcm9jZXNzU2V0UHJvcHMgPSAocGF5bG9hZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGNvbXBvbmVudElkLCBwcm9wczogcmF3UHJvcHMgfSA9IHBheWxvYWQ7XG4gICAgICAgIGNvbnN0IHBhcnNlZElkID0gcGFyc2VDb21wb25lbnRJZChjb21wb25lbnRJZCk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UGF0aCA9IGdldFBhdGgoc3RhdGUucGF0aHMsIHBhcnNlZElkKTtcbiAgICAgICAgaWYgKCFjb21wb25lbnRQYXRoKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFNFVF9QUk9QUzogQ29tcG9uZW50ICR7Y29tcG9uZW50SWR9IG5vdCBmb3VuZCBpbiBsYXlvdXRgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBHZXQgb2xkIGNvbXBvbmVudCBmb3IgUGF0Y2ggcHJvY2Vzc2luZyBhbmQgcGF0aCByZWNvbXB1dGF0aW9uXG4gICAgICAgIGNvbnN0IG9sZENvbXBvbmVudCA9IHBhdGgoY29tcG9uZW50UGF0aCwgc3RhdGUubGF5b3V0KTtcbiAgICAgICAgY29uc3Qgb2xkUHJvcHMgPSAob2xkQ29tcG9uZW50Py5wcm9wcyB8fCB7fSk7XG4gICAgICAgIC8vIFByb2Nlc3MgcHJvcHMgdG8gaGFuZGxlIFBhdGNoIG9iamVjdHNcbiAgICAgICAgY29uc3QgcHJvY2Vzc2VkUHJvcHMgPSBwYXJzZVBhdGNoUHJvcHMocmF3UHJvcHMsIG9sZFByb3BzKTtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBjb21wb25lbnQgcHJvcHNcbiAgICAgICAgc3RvcmUuZGlzcGF0Y2godXBkYXRlUHJvcHMoe1xuICAgICAgICAgICAgcHJvcHM6IHByb2Nlc3NlZFByb3BzLFxuICAgICAgICAgICAgaXRlbXBhdGg6IGNvbXBvbmVudFBhdGgsXG4gICAgICAgICAgICByZW5kZXJUeXBlOiAnd2Vic29ja2V0J1xuICAgICAgICB9KSk7XG4gICAgICAgIC8vIE5vdGlmeSBvYnNlcnZlcnNcbiAgICAgICAgc3RvcmUuZGlzcGF0Y2gobm90aWZ5T2JzZXJ2ZXJzKHsgaWQ6IHBhcnNlZElkLCBwcm9wczogcHJvY2Vzc2VkUHJvcHMgfSkpO1xuICAgICAgICAvLyBSZWNvbXB1dGUgcGF0aHMgZm9yIGFueSBuZXcgY2hpbGQgY29tcG9uZW50c1xuICAgICAgICBpZiAob2xkQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkU3RhdGUgPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgc3RvcmUuZGlzcGF0Y2goc2V0UGF0aHMoY29tcHV0ZVBhdGhzKHtcbiAgICAgICAgICAgICAgICAuLi5vbGRDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgcHJvcHM6IHsgLi4ub2xkUHJvcHMsIC4uLnByb2Nlc3NlZFByb3BzIH1cbiAgICAgICAgICAgIH0sIFsuLi5jb21wb25lbnRQYXRoXSwgdXBkYXRlZFN0YXRlLnBhdGhzLCB1cGRhdGVkU3RhdGUucGF0aHMuZXZlbnRzKSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBIYW5kbGUgc2luZ2xlIFNFVF9QUk9QUyBtZXNzYWdlXG4gICAgd29ya2VyQ2xpZW50Lm9uU2V0UHJvcHMgPSBwcm9jZXNzU2V0UHJvcHM7XG4gICAgLy8gSGFuZGxlIGJhdGNoZWQgU0VUX1BST1BTX0JBVENIIG1lc3NhZ2VcbiAgICB3b3JrZXJDbGllbnQub25TZXRQcm9wc0JhdGNoID0gKHBheWxvYWRzKSA9PiB7XG4gICAgICAgIGJhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGF5bG9hZCBvZiBwYXlsb2Fkcykge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NTZXRQcm9wcyhwYXlsb2FkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBIYW5kbGUgR0VUX1BST1BTX1JFUVVFU1QgbWVzc2FnZXNcbiAgICB3b3JrZXJDbGllbnQub25HZXRQcm9wc1JlcXVlc3QgPSAocmVxdWVzdElkLCBwYXlsb2FkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29tcG9uZW50SWQsIHByb3BlcnRpZXMgfSA9IHBheWxvYWQ7XG4gICAgICAgIGNvbnN0IHBhcnNlZElkID0gcGFyc2VDb21wb25lbnRJZChjb21wb25lbnRJZCk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UGF0aCA9IGdldFBhdGgoc3RhdGUucGF0aHMsIHBhcnNlZElkKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIGlmIChjb21wb25lbnRQYXRoKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnRQcm9wcyA9IHBhdGgoWy4uLmNvbXBvbmVudFBhdGgsICdwcm9wcyddLCBzdGF0ZS5sYXlvdXQpO1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudFByb3BzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtwcm9wTmFtZV0gPSBjb21wb25lbnRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBHRVRfUFJPUFNfUkVRVUVTVDogQ29tcG9uZW50ICR7Y29tcG9uZW50SWR9IG5vdCBmb3VuZCBpbiBsYXlvdXRgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZW5kIHRoZSByZXNwb25zZVxuICAgICAgICB3b3JrZXJDbGllbnQuc2VuZEdldFByb3BzUmVzcG9uc2UocmVxdWVzdElkLCByZXN1bHQpO1xuICAgIH07XG4gICAgLy8gVHJhY2sgY29ubmVjdGlvbiBzdGF0ZSBmb3IgcmVjb25uZWN0aW9uIGhhbmRsaW5nXG4gICAgbGV0IHdhc0Rpc2Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgIC8vIEhhbmRsZSBjb25uZWN0aW9uIGV2ZW50c1xuICAgIHdvcmtlckNsaWVudC5vbkNvbm5lY3RlZCA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tEYXNoXSBXZWJTb2NrZXQgY29ubmVjdGVkJyk7XG4gICAgICAgIC8vIE9uIHJlY29ubmVjdCAobm90IGluaXRpYWwgY29ubmVjdCksIHJlLXRyaWdnZXIgcGVyc2lzdGVudCBjYWxsYmFja3NcbiAgICAgICAgaWYgKHdhc0Rpc2Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tEYXNoXSBSZWNvbm5lY3RlZCAtIHJlLXRyaWdnZXJpbmcgcGVyc2lzdGVudCBjYWxsYmFja3MnKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgZ3JhcGhzIH0gPSBzdGF0ZTtcbiAgICAgICAgICAgIGlmIChncmFwaHM/LmNhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBlcnNpc3RlbnRDYWxsYmFja3MgPSBncmFwaHMuY2FsbGJhY2tzLnJlZHVjZSgoYWNjLCBjYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHJlLXRyaWdnZXIgbm8tb3V0cHV0IGNhbGxiYWNrcyB3aXRoIG5vIGlucHV0c1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBhcmUgdGhlIFwicGVyc2lzdGVudFwiIGNhbGxiYWNrcyB0aGF0IHNob3VsZCByZXN0YXJ0XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYi5ub091dHB1dCAmJiBjYi5pbnB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IG1ha2VSZXNvbHZlZENhbGxiYWNrKGNiLCByZXNvbHZlRGVwcygpLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZC5pbml0aWFsQ2FsbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2MucHVzaChyZXNvbHZlZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgICAgICB9LCBbXSk7XG4gICAgICAgICAgICAgICAgaWYgKHBlcnNpc3RlbnRDYWxsYmFja3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgW0Rhc2hdIFJlLXRyaWdnZXJpbmcgJHtwZXJzaXN0ZW50Q2FsbGJhY2tzLmxlbmd0aH0gcGVyc2lzdGVudCBjYWxsYmFjayhzKWApO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5kaXNwYXRjaChhZGRSZXF1ZXN0ZWRDYWxsYmFja3MocGVyc2lzdGVudENhbGxiYWNrcykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgd29ya2VyQ2xpZW50Lm9uRGlzY29ubmVjdGVkID0gKHJlYXNvbikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0Rhc2hdIFdlYlNvY2tldCBkaXNjb25uZWN0ZWQ6ICR7cmVhc29ufWApO1xuICAgICAgICB3YXNEaXNjb25uZWN0ZWQgPSB0cnVlO1xuICAgIH07XG4gICAgd29ya2VyQ2xpZW50Lm9uRXJyb3IgPSAobWVzc2FnZSwgY29kZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbRGFzaF0gV2ViU29ja2V0IGVycm9yOiAke21lc3NhZ2V9YCwgY29kZSk7XG4gICAgfTtcbiAgICAvLyBDb25uZWN0IHRvIHRoZSB3b3JrZXJcbiAgICBjb25zdCB3c1VybCA9IGJ1aWxkV2ViU29ja2V0VXJsKGNvbmZpZyk7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gY29uZmlnLndlYnNvY2tldCBpcyBndWFyYW50ZWVkIHRvIGV4aXN0IGR1ZSB0byB3c0F2YWlsYWJsZSBjaGVjayBhYm92ZVxuICAgICAgICBhd2FpdCB3b3JrZXJDbGllbnQuY29ubmVjdChjb25maWcud2Vic29ja2V0Lndvcmtlcl91cmwsIHdzVXJsLCBjb25maWcud2Vic29ja2V0LmluYWN0aXZpdHlfdGltZW91dCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbRGFzaF0gRmFpbGVkIHRvIGNvbm5lY3QgdG8gV2ViU29ja2V0IHdvcmtlcjonLCBlcnJvcik7XG4gICAgfVxuICAgIC8vIEhhbmRsZSB0YWIgdmlzaWJpbGl0eSBjaGFuZ2VzXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsICgpID0+IHtcbiAgICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ3Zpc2libGUnKSB7XG4gICAgICAgICAgICBpZiAod29ya2VyQ2xpZW50LmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgIC8vIFRhYiB2aXNpYmxlIGFuZCBjb25uZWN0ZWQgLSByZXNldCBpbmFjdGl2aXR5IHRpbWVyXG4gICAgICAgICAgICAgICAgd29ya2VyQ2xpZW50Lm5vdGlmeVRhYlZpc2libGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRhYiB2aXNpYmxlIGJ1dCBkaXNjb25uZWN0ZWQgLSByZWNvbm5lY3RcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0Rhc2hdIFRhYiB2aXNpYmxlLCByZWNvbm5lY3RpbmcgV2ViU29ja2V0Li4uJyk7XG4gICAgICAgICAgICAgICAgd29ya2VyQ2xpZW50XG4gICAgICAgICAgICAgICAgICAgIC5lbnN1cmVDb25uZWN0ZWQoY29uZmlnKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IGNvbnNvbGUuZXJyb3IoJ1tEYXNoXSBGYWlsZWQgdG8gcmVjb25uZWN0OicsIGVycikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vKipcbiAqIEJ1aWxkIHRoZSBXZWJTb2NrZXQgVVJMIGZyb20gY29uZmlnLlxuICovXG5mdW5jdGlvbiBidWlsZFdlYlNvY2tldFVybChjb25maWcpIHtcbiAgICBpZiAoIWNvbmZpZy53ZWJzb2NrZXQ/LnVybCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYlNvY2tldCBVUkwgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICB9XG4gICAgLy8gQ29udmVydCBIVFRQKFMpIFVSTCB0byBXUyhTKVxuICAgIGNvbnN0IHdzUHJvdG9jb2wgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonID8gJ3dzczonIDogJ3dzOic7XG4gICAgY29uc3QgaG9zdCA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0O1xuICAgIC8vIFRoZSBjb25maWcud2Vic29ja2V0LnVybCBpcyBhIHBhdGggbGlrZSBcIi9fZGFzaC13cy1jYWxsYmFja1wiXG4gICAgcmV0dXJuIGAke3dzUHJvdG9jb2x9Ly8ke2hvc3R9JHtjb25maWcud2Vic29ja2V0LnVybH1gO1xufVxuLyoqXG4gKiBEaXNjb25uZWN0IGZyb20gdGhlIFdlYlNvY2tldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc2Nvbm5lY3RXZWJTb2NrZXQoKSB7XG4gICAgY29uc3Qgd29ya2VyQ2xpZW50ID0gZ2V0V29ya2VyQ2xpZW50KCk7XG4gICAgd29ya2VyQ2xpZW50LmRpc2Nvbm5lY3QoKTtcbn1cbiIsImltcG9ydCB7IGFzc29jLCBhc3NvY1BhdGgsIGRpc3NvYyB9IGZyb20gJ3JhbWRhJztcbmNvbnN0IHNldEpvYiA9IChqb2IsIHN0YXRlKSA9PiBhc3NvYyhqb2Iuam9iSWQsIGpvYiwgc3RhdGUpO1xuY29uc3QgcmVtb3ZlSm9iID0gKGpvYklkLCBzdGF0ZSkgPT4gZGlzc29jKGpvYklkLCBzdGF0ZSk7XG5jb25zdCBzZXRPdXRkYXRlZCA9IChqb2JJZCwgc3RhdGUpID0+IGFzc29jUGF0aChbam9iSWQsICdvdXRkYXRlZCddLCB0cnVlLCBzdGF0ZSk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc3RhdGUgPSB7fSwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdBRERfQ0FMTEJBQ0tfSk9CJzpcbiAgICAgICAgICAgIHJldHVybiBzZXRKb2IoYWN0aW9uLnBheWxvYWQsIHN0YXRlKTtcbiAgICAgICAgY2FzZSAnUkVNT1ZFX0NBTExCQUNLX0pPQic6XG4gICAgICAgICAgICByZXR1cm4gcmVtb3ZlSm9iKGFjdGlvbi5wYXlsb2FkLmpvYklkLCBzdGF0ZSk7XG4gICAgICAgIGNhc2UgJ0NBTExCQUNLX0pPQl9PVVREQVRFRCc6XG4gICAgICAgICAgICByZXR1cm4gc2V0T3V0ZGF0ZWQoYWN0aW9uLnBheWxvYWQuam9iSWQsIHN0YXRlKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBjb25jYXQsIGRpZmZlcmVuY2UsIHJlZHVjZSB9IGZyb20gJ3JhbWRhJztcbmV4cG9ydCB2YXIgQ2FsbGJhY2tBY3Rpb25UeXBlO1xuKGZ1bmN0aW9uIChDYWxsYmFja0FjdGlvblR5cGUpIHtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJBZGRCbG9ja2VkXCJdID0gXCJDYWxsYmFja3MuQWRkQmxvY2tlZFwiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIkFkZEV4ZWN1dGVkXCJdID0gXCJDYWxsYmFja3MuQWRkRXhlY3V0ZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJBZGRFeGVjdXRpbmdcIl0gPSBcIkNhbGxiYWNrcy5BZGRFeGVjdXRpbmdcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJBZGRQcmlvcml0aXplZFwiXSA9IFwiQ2FsbGJhY2tzLkFkZFByaW9yaXRpemVkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiQWRkUmVxdWVzdGVkXCJdID0gXCJDYWxsYmFja3MuQWRkUmVxdWVzdGVkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiQWRkU3RvcmVkXCJdID0gXCJDYWxsYmFja3MuQWRkU3RvcmVkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiQWRkV2F0Y2hlZFwiXSA9IFwiQ2FsbGJhY2tzLkFkZFdhdGNoZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJSZW1vdmVCbG9ja2VkXCJdID0gXCJDYWxsYmFja3MuUmVtb3ZlQmxvY2tlZFwiO1xuICAgIENhbGxiYWNrQWN0aW9uVHlwZVtcIlJlbW92ZUV4ZWN1dGVkXCJdID0gXCJDYWxsYmFja3MuUmVtb3ZlRXhlY3V0ZWRcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJSZW1vdmVFeGVjdXRpbmdcIl0gPSBcIkNhbGxiYWNrcy5SZW1vdmVFeGVjdXRpbmdcIjtcbiAgICBDYWxsYmFja0FjdGlvblR5cGVbXCJSZW1vdmVQcmlvcml0aXplZFwiXSA9IFwiQ2FsbGJhY2tzLlJlbW92ZVByaW9yaXRpemVkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiUmVtb3ZlUmVxdWVzdGVkXCJdID0gXCJDYWxsYmFja3MuUmVtb3ZlUmVxdWVzdGVkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiUmVtb3ZlU3RvcmVkXCJdID0gXCJDYWxsYmFja3MuUmVtb3ZlU3RvcmVkXCI7XG4gICAgQ2FsbGJhY2tBY3Rpb25UeXBlW1wiUmVtb3ZlV2F0Y2hlZFwiXSA9IFwiQ2FsbGJhY2tzLlJlbW92ZVdhdGNoZWRcIjtcbn0pKENhbGxiYWNrQWN0aW9uVHlwZSB8fCAoQ2FsbGJhY2tBY3Rpb25UeXBlID0ge30pKTtcbmV4cG9ydCB2YXIgQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlO1xuKGZ1bmN0aW9uIChDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGUpIHtcbiAgICBDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGVbXCJBZGRDb21wbGV0ZWRcIl0gPSBcIkNhbGxiYWNrcy5Db21wbGV0ZWRcIjtcbiAgICBDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGVbXCJBZ2dyZWdhdGVcIl0gPSBcIkNhbGxiYWNrcy5BZ2dyZWdhdGVcIjtcbn0pKENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZSB8fCAoQ2FsbGJhY2tBZ2dyZWdhdGVBY3Rpb25UeXBlID0ge30pKTtcbmNvbnN0IERFRkFVTFRfU1RBVEUgPSB7XG4gICAgYmxvY2tlZDogW10sXG4gICAgZXhlY3V0ZWQ6IFtdLFxuICAgIGV4ZWN1dGluZzogW10sXG4gICAgcHJpb3JpdGl6ZWQ6IFtdLFxuICAgIHJlcXVlc3RlZDogW10sXG4gICAgc3RvcmVkOiBbXSxcbiAgICB3YXRjaGVkOiBbXSxcbiAgICBjb21wbGV0ZWQ6IDBcbn07XG5jb25zdCB0cmFuc2Zvcm1zID0ge1xuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkQmxvY2tlZF06IGNvbmNhdCxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEV4ZWN1dGVkXTogY29uY2F0LFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkRXhlY3V0aW5nXTogY29uY2F0LFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkUHJpb3JpdGl6ZWRdOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRSZXF1ZXN0ZWRdOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRTdG9yZWRdOiBjb25jYXQsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRXYXRjaGVkXTogY29uY2F0LFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlQmxvY2tlZF06IGRpZmZlcmVuY2UsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVFeGVjdXRlZF06IGRpZmZlcmVuY2UsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVFeGVjdXRpbmddOiBkaWZmZXJlbmNlLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUHJpb3JpdGl6ZWRdOiBkaWZmZXJlbmNlLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUmVxdWVzdGVkXTogZGlmZmVyZW5jZSxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVN0b3JlZF06IGRpZmZlcmVuY2UsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVXYXRjaGVkXTogZGlmZmVyZW5jZVxufTtcbmNvbnN0IGZpZWxkcyA9IHtcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZEJsb2NrZWRdOiAnYmxvY2tlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRFeGVjdXRlZF06ICdleGVjdXRlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRFeGVjdXRpbmddOiAnZXhlY3V0aW5nJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFByaW9yaXRpemVkXTogJ3ByaW9yaXRpemVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLkFkZFJlcXVlc3RlZF06ICdyZXF1ZXN0ZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuQWRkU3RvcmVkXTogJ3N0b3JlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5BZGRXYXRjaGVkXTogJ3dhdGNoZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlQmxvY2tlZF06ICdibG9ja2VkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUV4ZWN1dGVkXTogJ2V4ZWN1dGVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZUV4ZWN1dGluZ106ICdleGVjdXRpbmcnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUHJpb3JpdGl6ZWRdOiAncHJpb3JpdGl6ZWQnLFxuICAgIFtDYWxsYmFja0FjdGlvblR5cGUuUmVtb3ZlUmVxdWVzdGVkXTogJ3JlcXVlc3RlZCcsXG4gICAgW0NhbGxiYWNrQWN0aW9uVHlwZS5SZW1vdmVTdG9yZWRdOiAnc3RvcmVkJyxcbiAgICBbQ2FsbGJhY2tBY3Rpb25UeXBlLlJlbW92ZVdhdGNoZWRdOiAnd2F0Y2hlZCdcbn07XG5jb25zdCBtdXRhdGVDb21wbGV0ZWQgPSAoc3RhdGUsIGFjdGlvbikgPT4gKHtcbiAgICAuLi5zdGF0ZSxcbiAgICBjb21wbGV0ZWQ6IHN0YXRlLmNvbXBsZXRlZCArIGFjdGlvbi5wYXlsb2FkXG59KTtcbmNvbnN0IG11dGF0ZUNhbGxiYWNrcyA9IChzdGF0ZSwgYWN0aW9uKSA9PiB7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gdHJhbnNmb3Jtc1thY3Rpb24udHlwZV07XG4gICAgY29uc3QgZmllbGQgPSBmaWVsZHNbYWN0aW9uLnR5cGVdO1xuICAgIHJldHVybiAhdHJhbnNmb3JtIHx8ICFmaWVsZCB8fCBhY3Rpb24ucGF5bG9hZC5sZW5ndGggPT09IDBcbiAgICAgICAgPyBzdGF0ZVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgW2ZpZWxkXTogdHJhbnNmb3JtKHN0YXRlW2ZpZWxkXSwgYWN0aW9uLnBheWxvYWQpXG4gICAgICAgIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgKHN0YXRlID0gREVGQVVMVF9TVEFURSwgYWN0aW9uKSA9PiByZWR1Y2UoKHMsIGEpID0+IHtcbiAgICBpZiAoYSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgZWxzZSBpZiAoYS50eXBlID09PSBDYWxsYmFja0FnZ3JlZ2F0ZUFjdGlvblR5cGUuQWRkQ29tcGxldGVkKSB7XG4gICAgICAgIHJldHVybiBtdXRhdGVDb21wbGV0ZWQocywgYSk7XG4gICAgfVxuICAgIHJldHVybiBtdXRhdGVDYWxsYmFja3MocywgYSk7XG59LCBzdGF0ZSwgYWN0aW9uLnR5cGUgPT09IENhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZS5BZ2dyZWdhdGVcbiAgICA/IGFjdGlvbi5wYXlsb2FkXG4gICAgOiBbYWN0aW9uXSk7XG4iLCJleHBvcnQgdmFyIElzTG9hZGluZ0FjdGlvblR5cGU7XG4oZnVuY3Rpb24gKElzTG9hZGluZ0FjdGlvblR5cGUpIHtcbiAgICBJc0xvYWRpbmdBY3Rpb25UeXBlW1wiU2V0XCJdID0gXCJJc0xvYWRpbmcuU2V0XCI7XG59KShJc0xvYWRpbmdBY3Rpb25UeXBlIHx8IChJc0xvYWRpbmdBY3Rpb25UeXBlID0ge30pKTtcbmNvbnN0IERFRkFVTFRfU1RBVEUgPSB0cnVlO1xuZXhwb3J0IGRlZmF1bHQgKHN0YXRlID0gREVGQVVMVF9TVEFURSwgYWN0aW9uKSA9PiAoYWN0aW9uLnR5cGUgPT09IElzTG9hZGluZ0FjdGlvblR5cGUuU2V0ID8gYWN0aW9uLnBheWxvYWQgOiBzdGF0ZSk7XG4iLCJpbXBvcnQgeyBhc3NvY1BhdGgsIGluY2x1ZGVzLCBwYXRoT3IgfSBmcm9tICdyYW1kYSc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsb2FkaW5nKHN0YXRlID0ge30sIGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnTE9BREVEJzpcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZC5yZWR1Y2UoKGFjYywgbG9hZCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRQYXRoID0gW0pTT04uc3RyaW5naWZ5KGxvYWQucGF0aCldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBwYXRoT3IoW10sIGxvYWRQYXRoLCBhY2MpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhc3NvY1BhdGgobG9hZFBhdGgsIHByZXYuZmlsdGVyKChsb2FkaW5nKSA9PiBsb2FkaW5nLnByb3BlcnR5ICE9PSBsb2FkLnByb3BlcnR5KSwgYWNjKTtcbiAgICAgICAgICAgIH0sIHN0YXRlKTtcbiAgICAgICAgY2FzZSAnTE9BRElORyc6XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnBheWxvYWQucmVkdWNlKChhY2MsIGxvYWQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2FkUGF0aCA9IFtKU09OLnN0cmluZ2lmeShsb2FkLnBhdGgpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gcGF0aE9yKFtdLCBsb2FkUGF0aCwgYWNjKTtcbiAgICAgICAgICAgICAgICBpZiAoIWluY2x1ZGVzKGxvYWQsIHByZXYpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSBvdXRwdXRzXG4gICAgICAgICAgICAgICAgICAgIHByZXYucHVzaChsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFzc29jUGF0aChsb2FkUGF0aCwgcHJldiwgYWNjKTtcbiAgICAgICAgICAgIH0sIHN0YXRlKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBvbmNlIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgY3JlYXRlU3RvcmUsIGFwcGx5TWlkZGxld2FyZSB9IGZyb20gJ3JlZHV4JztcbmltcG9ydCB0aHVuayBmcm9tICdyZWR1eC10aHVuayc7XG5pbXBvcnQgeyBjcmVhdGVSZWR1Y2VyIH0gZnJvbSAnLi9yZWR1Y2Vycy9yZWR1Y2VyJztcbmltcG9ydCBTdG9yZU9ic2VydmVyIGZyb20gJy4vU3RvcmVPYnNlcnZlcic7XG5pbXBvcnQgZG9jdW1lbnRUaXRsZSBmcm9tICcuL29ic2VydmVycy9kb2N1bWVudFRpdGxlJztcbmltcG9ydCBleGVjdXRlZENhbGxiYWNrcyBmcm9tICcuL29ic2VydmVycy9leGVjdXRlZENhbGxiYWNrcyc7XG5pbXBvcnQgZXhlY3V0aW5nQ2FsbGJhY2tzIGZyb20gJy4vb2JzZXJ2ZXJzL2V4ZWN1dGluZ0NhbGxiYWNrcyc7XG5pbXBvcnQgaXNMb2FkaW5nIGZyb20gJy4vb2JzZXJ2ZXJzL2lzTG9hZGluZyc7XG5pbXBvcnQgcHJpb3JpdGl6ZWRDYWxsYmFja3MgZnJvbSAnLi9vYnNlcnZlcnMvcHJpb3JpdGl6ZWRDYWxsYmFja3MnO1xuaW1wb3J0IHJlcXVlc3RlZENhbGxiYWNrcyBmcm9tICcuL29ic2VydmVycy9yZXF1ZXN0ZWRDYWxsYmFja3MnO1xuaW1wb3J0IHN0b3JlZENhbGxiYWNrcyBmcm9tICcuL29ic2VydmVycy9zdG9yZWRDYWxsYmFja3MnO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVuZGVyZXJTdG9yZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX19zdG9yZSA9IHRoaXMuaW5pdGlhbGl6ZVN0b3JlKCk7XG4gICAgfVxuICAgIF9fc3RvcmU7XG4gICAgZ2V0IHN0b3JlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX3N0b3JlO1xuICAgIH1cbiAgICBzdG9yZU9ic2VydmVyID0gbmV3IFN0b3JlT2JzZXJ2ZXIoKTtcbiAgICBzZXRPYnNlcnZlcnMgPSBvbmNlKCgpID0+IHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZSA9IHRoaXMuc3RvcmVPYnNlcnZlci5vYnNlcnZlO1xuICAgICAgICAvLyBGSVhNRSBSZW1vdmUgb2JzZXJ2ZXIgcGF0dGVybiBhbmQgcmVmYWN0b3IgdG8gc3RhbmRhcmQgcmVkdWNlcnMvYWN0aW9ucy9zZWxlY3RvcnMuXG4gICAgICAgIG9ic2VydmUoZG9jdW1lbnRUaXRsZSk7XG4gICAgICAgIG9ic2VydmUoaXNMb2FkaW5nKTtcbiAgICAgICAgb2JzZXJ2ZShyZXF1ZXN0ZWRDYWxsYmFja3MpO1xuICAgICAgICBvYnNlcnZlKHByaW9yaXRpemVkQ2FsbGJhY2tzKTtcbiAgICAgICAgb2JzZXJ2ZShleGVjdXRpbmdDYWxsYmFja3MpO1xuICAgICAgICBvYnNlcnZlKGV4ZWN1dGVkQ2FsbGJhY2tzKTtcbiAgICAgICAgb2JzZXJ2ZShzdG9yZWRDYWxsYmFja3MpO1xuICAgIH0pO1xuICAgIGNyZWF0ZUFwcFN0b3JlID0gKHJlZHVjZXIsIG1pZGRsZXdhcmUpID0+IHtcbiAgICAgICAgdGhpcy5fX3N0b3JlID0gY3JlYXRlU3RvcmUocmVkdWNlciwgbWlkZGxld2FyZSk7XG4gICAgICAgIHRoaXMuc3RvcmVPYnNlcnZlci5zZXRTdG9yZSh0aGlzLl9fc3RvcmUpO1xuICAgICAgICBjb25zdCBkcyA9ICh3aW5kb3cuZGFzaF9zdG9yZXMgPVxuICAgICAgICAgICAgd2luZG93LmRhc2hfc3RvcmVzIHx8IFtdKTtcbiAgICAgICAgaWYgKCFkcy5pbmNsdWRlcyh0aGlzLl9fc3RvcmUpKSB7XG4gICAgICAgICAgICBkcy5wdXNoKHRoaXMuX19zdG9yZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRPYnNlcnZlcnMoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYSBSZWR1eCBzdG9yZSB3aXRoIHRodW5rLCBwbHVzIGxvZ2dpbmcgKG9ubHkgaW4gZGV2ZWxvcG1lbnQgbW9kZSkgbWlkZGxld2FyZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sfSByZXNldDogZGlzY2FyZCBhbnkgcHJldmlvdXMgc3RvcmVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdG9yZTxHZW5lcmljU3RvcmVFbmhhbmNlcj59XG4gICAgICogIEFuIGluaXRpYWxpemVkIHJlZHV4IHN0b3JlIHdpdGggbWlkZGxld2FyZSBhbmQgcG9zc2libGUgaG90IHJlbG9hZGluZyBvZiByZWR1Y2Vyc1xuICAgICAqL1xuICAgIGluaXRpYWxpemVTdG9yZSA9IChyZXNldCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fX3N0b3JlICYmICFyZXNldCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX19zdG9yZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWR1Y2VyID0gY3JlYXRlUmVkdWNlcigpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvY2Vzcy1lbnZcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQXBwU3RvcmUocmVkdWNlciwgYXBwbHlNaWRkbGV3YXJlKHRodW5rKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBvbmx5IGF0dGFjaCBsb2dnZXIgdG8gbWlkZGxld2FyZSBpbiBub24tcHJvZHVjdGlvbiBtb2RlXG4gICAgICAgICAgICBjb25zdCByZWR1eERURUMgPSB3aW5kb3dcbiAgICAgICAgICAgICAgICAuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fQ09NUE9TRV9fO1xuICAgICAgICAgICAgaWYgKHJlZHV4RFRFQykge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQXBwU3RvcmUocmVkdWNlciwgcmVkdXhEVEVDKHsgYWN0aW9uc0RlbnlsaXN0OiBbJ3JlbG9hZFJlcXVlc3QnXSB9KShhcHBseU1pZGRsZXdhcmUodGh1bmspKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUFwcFN0b3JlKHJlZHVjZXIsIGFwcGx5TWlkZGxld2FyZSh0aHVuaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcmVzZXQpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gLSBQcm90ZWN0IHRoaXMgdW5kZXIgYSBkZWJ1ZyBtb2RlP1xuICAgICAgICAgICAgd2luZG93LnN0b3JlID0gdGhpcy5fX3N0b3JlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb2R1bGUuaG90KSB7XG4gICAgICAgICAgICAvLyBFbmFibGUgaG90IG1vZHVsZSByZXBsYWNlbWVudCBmb3IgcmVkdWNlcnNcbiAgICAgICAgICAgIG1vZHVsZS5ob3QuYWNjZXB0KCcuL3JlZHVjZXJzL3JlZHVjZXInLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFJvb3RSZWR1Y2VyID0gcmVxdWlyZSgnLi9yZWR1Y2Vycy9yZWR1Y2VyJykuY3JlYXRlUmVkdWNlcigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX19zdG9yZS5yZXBsYWNlUmVkdWNlcihuZXh0Um9vdFJlZHVjZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX19zdG9yZTtcbiAgICB9O1xufVxuIiwiaW1wb3J0IHsgb21pdCwgdmFsdWVzIH0gZnJvbSAncmFtZGEnO1xuZXhwb3J0IGNvbnN0IGdldFBlbmRpbmdDYWxsYmFja3MgPSAoc3RhdGUpID0+IEFycmF5KCkuY29uY2F0KC4uLnZhbHVlcyhvbWl0KFsnc3RvcmVkJywgJ2NvbXBsZXRlZCddLCBzdGF0ZSkpKTtcbiIsImltcG9ydCB7IHVwZGF0ZVByb3BzLCBub3RpZnlPYnNlcnZlcnMsIHNldFBhdGhzIH0gZnJvbSAnLi4vYWN0aW9ucy9pbmRleCc7XG5pbXBvcnQgeyBwYXJzZVBhdGNoUHJvcHMsIFBhdGNoQnVpbGRlciB9IGZyb20gJy4uL2FjdGlvbnMvcGF0Y2gnO1xuaW1wb3J0IHsgY29tcHV0ZVBhdGhzLCBnZXRQYXRoIH0gZnJvbSAnLi4vYWN0aW9ucy9wYXRocyc7XG5pbXBvcnQgeyBnZXRDb21wb25lbnRMYXlvdXQgfSBmcm9tICcuLi93cmFwcGVyL3dyYXBwaW5nJztcbmltcG9ydCB7IGdldFN0b3JlcyB9IGZyb20gJy4vc3RvcmVzJztcbi8qKlxuICogU2V0IHRoZSBwcm9wcyBvZiBhIGRhc2ggY29tcG9uZW50IGJ5IGlkIG9yIHBhdGguXG4gKlxuICogQHBhcmFtIGlkT3JQYXRoIFBhdGggb3IgaWQgb2YgdGhlIGRhc2ggY29tcG9uZW50IHRvIHVwZGF0ZS5cbiAqIEBwYXJhbSBwcm9wcyBUaGUgcHJvcHMgdG8gdXBkYXRlLlxuICovXG5mdW5jdGlvbiBzZXRfcHJvcHMoaWRPclBhdGgsIHByb3BzKSB7XG4gICAgY29uc3QgZHMgPSBnZXRTdG9yZXMoKTtcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGRzLmxlbmd0aDsgeSsrKSB7XG4gICAgICAgIGNvbnN0IHsgZGlzcGF0Y2gsIGdldFN0YXRlIH0gPSBkc1t5XTtcbiAgICAgICAgbGV0IGNvbXBvbmVudFBhdGg7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlkT3JQYXRoKSkge1xuICAgICAgICAgICAgY29tcG9uZW50UGF0aCA9IGdldFBhdGgoc3RhdGUucGF0aHMsIGlkT3JQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbXBvbmVudFBhdGggPSBpZE9yUGF0aDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvbGRDb21wb25lbnQgPSBnZXRDb21wb25lbnRMYXlvdXQoY29tcG9uZW50UGF0aCwgc3RhdGUpO1xuICAgICAgICAvLyBIYW5kbGUgYW55IHBhdGNoIHByb3BzXG4gICAgICAgIHByb3BzID0gcGFyc2VQYXRjaFByb3BzKHByb3BzLCBvbGRDb21wb25lbnQ/LnByb3BzIHx8IHt9KTtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBwcm9wc1xuICAgICAgICBkaXNwYXRjaCh1cGRhdGVQcm9wcyh7XG4gICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgIGl0ZW1wYXRoOiBjb21wb25lbnRQYXRoLFxuICAgICAgICAgICAgcmVuZGVyVHlwZTogJ2NsaWVudHNpZGVBcGknXG4gICAgICAgIH0pKTtcbiAgICAgICAgZGlzcGF0Y2gobm90aWZ5T2JzZXJ2ZXJzKHsgaWQ6IGlkT3JQYXRoLCBwcm9wcyB9KSk7XG4gICAgICAgIGlmICghb2xkQ29tcG9uZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZGlzcGF0Y2goc2V0UGF0aHMoY29tcHV0ZVBhdGhzKHtcbiAgICAgICAgICAgIC4uLm9sZENvbXBvbmVudCxcbiAgICAgICAgICAgIHByb3BzOiB7IC4uLm9sZENvbXBvbmVudC5wcm9wcywgLi4ucHJvcHMgfVxuICAgICAgICB9LCBbLi4uY29tcG9uZW50UGF0aF0sIHN0YXRlLnBhdGhzLCBzdGF0ZS5wYXRocy5ldmVudHMpKSk7XG4gICAgfVxufVxuLy8gQ2xlYW4gdXJsIGNvZGUgYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9icmFpbnRyZWUvc2FuaXRpemUtdXJsL2Jsb2IvbWFpbi9zcmMvY29uc3RhbnRzLnRzXG4vLyB0byBhbGxvdyBmb3IgZGF0YSBwcm90b2NvbC5cbmNvbnN0IGludmFsaWRQcm90b2NvbHMgPSAvXihbXlxcd10qKShqYXZhc2NyaXB0fHZic2NyaXB0KS9pbTtcbmNvbnN0IG5ld0xpbmVzID0gLyYodGFifG5ld2xpbmUpOy9naTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG5jb25zdCBjdHJsQ2hhcnMgPSAvW1xcdTAwMDAtXFx1MDAxRlxcdTAwN0YtXFx1MDA5RlxcdTIwMDAtXFx1MjAwRFxcdUZFRkZdL2dpbTtcbmNvbnN0IGh0bWxFbnRpdGllcyA9IC8mIyhcXHcrKSheXFx3fDspPy9nO1xuY29uc3QgY2xlYW5fdXJsID0gKHVybCwgZmFsbGJhY2sgPSAnYWJvdXQ6YmxhbmsnKSA9PiB7XG4gICAgaWYgKHVybCA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG4gICAgY29uc3QgY2xlYW5lZCA9IHVybFxuICAgICAgICAucmVwbGFjZShuZXdMaW5lcywgJycpXG4gICAgICAgIC5yZXBsYWNlKGN0cmxDaGFycywgJycpXG4gICAgICAgIC5yZXBsYWNlKGh0bWxFbnRpdGllcywgKF8sIGRlYykgPT4gU3RyaW5nLmZyb21DaGFyQ29kZShkZWMpKVxuICAgICAgICAudHJpbSgpO1xuICAgIGlmIChpbnZhbGlkUHJvdG9jb2xzLnRlc3QoY2xlYW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgIH1cbiAgICByZXR1cm4gdXJsO1xufTtcbmNvbnN0IGRjID0gKHdpbmRvdy5kYXNoX2NsaWVudHNpZGUgPVxuICAgIHdpbmRvdy5kYXNoX2NsaWVudHNpZGUgfHwge30pO1xuZGNbJ3NldF9wcm9wcyddID0gc2V0X3Byb3BzO1xuZGNbJ2NsZWFuX3VybCddID0gZGNbJ2NsZWFuX3VybCddID09PSB1bmRlZmluZWQgPyBjbGVhbl91cmwgOiBkY1snY2xlYW5fdXJsJ107XG5kY1snUGF0Y2gnXSA9IFBhdGNoQnVpbGRlcjtcbiIsImV4cG9ydCBmdW5jdGlvbiBsb2FkTGlicmFyeShyZXNvdXJjZSkge1xuICAgIGxldCBwcm9tO1xuICAgIGNvbnN0IGhlYWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkJyk7XG4gICAgaWYgKHJlc291cmNlLnR5cGUgPT09ICdfanNfZGlzdCcpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICBlbGVtZW50LnNyYyA9IHJlc291cmNlLnVybDtcbiAgICAgICAgZWxlbWVudC5hc3luYyA9IHRydWU7XG4gICAgICAgIHByb20gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZWxlbWVudC5vbmVycm9yID0gZXJyb3IgPT4gcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGhlYWQ/LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChyZXNvdXJjZS50eXBlID09PSAnX2Nzc19kaXN0Jykge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICBlbGVtZW50LmhyZWYgPSByZXNvdXJjZS51cmw7XG4gICAgICAgIGVsZW1lbnQucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgICBwcm9tID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGVsZW1lbnQub25lcnJvciA9IGVycm9yID0+IHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgICBoZWFkPy5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHByb207XG59XG4iLCIvKiogQ2FjaGVkIHJlbmRlcmVyIElEIGZvciB0aGlzIHBhZ2UgaW5zdGFuY2UgKi9cbmxldCBjYWNoZWRSZW5kZXJlcklkID0gbnVsbDtcbi8qKlxuICogR2VuZXJhdGUgYSB1bmlxdWUgcmVuZGVyZXIgSUQgZm9yIHRoaXMgcGFnZSBpbnN0YW5jZS5cbiAqXG4gKiBFYWNoIHBhZ2UgbG9hZCBnZXRzIGEgZnJlc2ggSUQgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggc3RhbGVcbiAqIGNvbm5lY3Rpb25zIGluIHRoZSBTaGFyZWRXb3JrZXIgYWZ0ZXIgcGFnZSByZWxvYWRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVuZGVyZXJJZCgpIHtcbiAgICBpZiAoIWNhY2hlZFJlbmRlcmVySWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgICAgICBjYWNoZWRSZW5kZXJlcklkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrIGZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICAgICAgY2FjaGVkUmVuZGVyZXJJZCA9IGAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKVxuICAgICAgICAgICAgICAgIC50b1N0cmluZygzNilcbiAgICAgICAgICAgICAgICAuc2xpY2UoMil9YDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkUmVuZGVyZXJJZDtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yZXMoKSB7XG4gICAgY29uc3Qgc3RvcmVzID0gKHdpbmRvdy5kYXNoX3N0b3JlcyA9XG4gICAgICAgIHdpbmRvdy5kYXNoX3N0b3JlcyB8fCBbXSk7XG4gICAgcmV0dXJuIHN0b3Jlcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGFzeW5jIChkdXJhdGlvbikgPT4ge1xuICAgIGxldCBfcmVzb2x2ZTtcbiAgICBjb25zdCBwID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiAoX3Jlc29sdmUgPSByZXNvbHZlKSk7XG4gICAgc2V0VGltZW91dChfcmVzb2x2ZSwgZHVyYXRpb24pO1xuICAgIHJldHVybiBwO1xufTtcbiIsIi8qKlxuICogQ2xpZW50IGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIERhc2ggV2ViU29ja2V0IFNoYXJlZFdvcmtlci5cbiAqL1xuaW1wb3J0IHsgZ2V0UmVuZGVyZXJJZCB9IGZyb20gJy4vcmVuZGVyZXJJZCc7XG4vKiogTWVzc2FnZSB0eXBlcyBmb3Igd29ya2VyIGNvbW11bmljYXRpb24gKi9cbmV4cG9ydCB2YXIgV29ya2VyTWVzc2FnZVR5cGU7XG4oZnVuY3Rpb24gKFdvcmtlck1lc3NhZ2VUeXBlKSB7XG4gICAgV29ya2VyTWVzc2FnZVR5cGVbXCJDT05ORUNUXCJdID0gXCJjb25uZWN0XCI7XG4gICAgV29ya2VyTWVzc2FnZVR5cGVbXCJESVNDT05ORUNUXCJdID0gXCJkaXNjb25uZWN0XCI7XG4gICAgV29ya2VyTWVzc2FnZVR5cGVbXCJDQUxMQkFDS19SRVFVRVNUXCJdID0gXCJjYWxsYmFja19yZXF1ZXN0XCI7XG4gICAgV29ya2VyTWVzc2FnZVR5cGVbXCJHRVRfUFJPUFNfUkVTUE9OU0VcIl0gPSBcImdldF9wcm9wc19yZXNwb25zZVwiO1xuICAgIFdvcmtlck1lc3NhZ2VUeXBlW1wiVEFCX1ZJU0lCTEVcIl0gPSBcInRhYl92aXNpYmxlXCI7XG4gICAgV29ya2VyTWVzc2FnZVR5cGVbXCJDT05ORUNURURcIl0gPSBcImNvbm5lY3RlZFwiO1xuICAgIFdvcmtlck1lc3NhZ2VUeXBlW1wiRElTQ09OTkVDVEVEXCJdID0gXCJkaXNjb25uZWN0ZWRcIjtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkNBTExCQUNLX1JFU1BPTlNFXCJdID0gXCJjYWxsYmFja19yZXNwb25zZVwiO1xuICAgIFdvcmtlck1lc3NhZ2VUeXBlW1wiU0VUX1BST1BTXCJdID0gXCJzZXRfcHJvcHNcIjtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIlNFVF9QUk9QU19CQVRDSFwiXSA9IFwic2V0X3Byb3BzX2JhdGNoXCI7XG4gICAgV29ya2VyTWVzc2FnZVR5cGVbXCJHRVRfUFJPUFNfUkVRVUVTVFwiXSA9IFwiZ2V0X3Byb3BzX3JlcXVlc3RcIjtcbiAgICBXb3JrZXJNZXNzYWdlVHlwZVtcIkVSUk9SXCJdID0gXCJlcnJvclwiO1xufSkoV29ya2VyTWVzc2FnZVR5cGUgfHwgKFdvcmtlck1lc3NhZ2VUeXBlID0ge30pKTtcbi8qKlxuICogQ2xpZW50IGZvciB0aGUgRGFzaCBXZWJTb2NrZXQgU2hhcmVkV29ya2VyLlxuICovXG5jbGFzcyBXb3JrZXJDbGllbnQge1xuICAgIHdvcmtlciA9IG51bGw7XG4gICAgcmVuZGVyZXJJZDtcbiAgICBwZW5kaW5nQ2FsbGJhY2tzID0gbmV3IE1hcCgpO1xuICAgIHJlcXVlc3RDb3VudGVyID0gMDtcbiAgICBpc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgIGNvbm5lY3Rpb25Qcm9taXNlID0gbnVsbDtcbiAgICBjb25uZWN0aW9uUmVzb2x2ZSA9IG51bGw7XG4gICAgLyoqIENhbGxiYWNrIHdoZW4gU0VUX1BST1BTIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgKi9cbiAgICBvblNldFByb3BzID0gbnVsbDtcbiAgICAvKiogQ2FsbGJhY2sgd2hlbiBTRVRfUFJPUFNfQkFUQ0ggbWVzc2FnZSBpcyByZWNlaXZlZCAqL1xuICAgIG9uU2V0UHJvcHNCYXRjaCA9IG51bGw7XG4gICAgLyoqIENhbGxiYWNrIHdoZW4gR0VUX1BST1BTX1JFUVVFU1QgbWVzc2FnZSBpcyByZWNlaXZlZCAqL1xuICAgIG9uR2V0UHJvcHNSZXF1ZXN0ID0gbnVsbDtcbiAgICAvKiogQ2FsbGJhY2sgd2hlbiBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkICovXG4gICAgb25Db25uZWN0ZWQgPSBudWxsO1xuICAgIC8qKiBDYWxsYmFjayB3aGVuIGNvbm5lY3Rpb24gaXMgbG9zdCAqL1xuICAgIG9uRGlzY29ubmVjdGVkID0gbnVsbDtcbiAgICAvKiogQ2FsbGJhY2sgd2hlbiBhbiBlcnJvciBvY2N1cnMgKi9cbiAgICBvbkVycm9yID0gbnVsbDtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlcklkID0gZ2V0UmVuZGVyZXJJZCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSB3b3JrZXIgY29ubmVjdGlvbi5cbiAgICAgKiBAcGFyYW0gd29ya2VyVXJsIFVSTCB0byB0aGUgU2hhcmVkV29ya2VyIHNjcmlwdFxuICAgICAqIEBwYXJhbSBzZXJ2ZXJVcmwgV2ViU29ja2V0IHNlcnZlciBVUkxcbiAgICAgKiBAcGFyYW0gaW5hY3Rpdml0eVRpbWVvdXQgT3B0aW9uYWwgaW5hY3Rpdml0eSB0aW1lb3V0IGluIG1zXG4gICAgICogQHBhcmFtIGhlYXJ0YmVhdEludGVydmFsIE9wdGlvbmFsIGhlYXJ0YmVhdCBpbnRlcnZhbCBpbiBtc1xuICAgICAqL1xuICAgIGFzeW5jIGNvbm5lY3Qod29ya2VyVXJsLCBzZXJ2ZXJVcmwsIGluYWN0aXZpdHlUaW1lb3V0LCBoZWFydGJlYXRJbnRlcnZhbCkge1xuICAgICAgICBpZiAodGhpcy53b3JrZXIpIHtcbiAgICAgICAgICAgIC8vIEFscmVhZHkgY29ubmVjdGVkXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBTaGFyZWRXb3JrZXJcbiAgICAgICAgdGhpcy53b3JrZXIgPSBuZXcgU2hhcmVkV29ya2VyKHdvcmtlclVybCwge1xuICAgICAgICAgICAgbmFtZTogJ2Rhc2gtd3Mtd29ya2VyJ1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gU2V0IHVwIG1lc3NhZ2UgaGFuZGxpbmdcbiAgICAgICAgdGhpcy53b3JrZXIucG9ydC5vbm1lc3NhZ2UgPSB0aGlzLmhhbmRsZU1lc3NhZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgLy8gQ3JlYXRlIHByb21pc2UgZm9yIGNvbm5lY3Rpb25cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBTdGFydCB0aGUgcG9ydFxuICAgICAgICB0aGlzLndvcmtlci5wb3J0LnN0YXJ0KCk7XG4gICAgICAgIC8vIFNlbmQgY29ubmVjdCBtZXNzYWdlXG4gICAgICAgIHRoaXMud29ya2VyLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgdHlwZTogV29ya2VyTWVzc2FnZVR5cGUuQ09OTkVDVCxcbiAgICAgICAgICAgIHJlbmRlcmVySWQ6IHRoaXMucmVuZGVyZXJJZCxcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJ2ZXJVcmwsXG4gICAgICAgICAgICAgICAgaW5hY3Rpdml0eVRpbWVvdXQsXG4gICAgICAgICAgICAgICAgaGVhcnRiZWF0SW50ZXJ2YWxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFdhaXQgZm9yIGNvbm5lY3Rpb25cbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uUHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzY29ubmVjdCBmcm9tIHRoZSB3b3JrZXIuXG4gICAgICovXG4gICAgZGlzY29ubmVjdCgpIHtcbiAgICAgICAgaWYgKHRoaXMud29ya2VyKSB7XG4gICAgICAgICAgICB0aGlzLndvcmtlci5wb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBXb3JrZXJNZXNzYWdlVHlwZS5ESVNDT05ORUNULFxuICAgICAgICAgICAgICAgIHJlbmRlcmVySWQ6IHRoaXMucmVuZGVyZXJJZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLndvcmtlci5wb3J0LmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLndvcmtlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25Qcm9taXNlID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uUmVzb2x2ZSA9IG51bGw7XG4gICAgICAgIC8vIFJlc29sdmUgcGVuZGluZyBjYWxsYmFja3Mgd2l0aCBwcmV2ZW50X3VwZGF0ZSBzbyBsb2FkaW5nIHN0YXRlcyBjbGVhclxuICAgICAgICBmb3IgKGNvbnN0IFssIHBlbmRpbmddIG9mIHRoaXMucGVuZGluZ0NhbGxiYWNrcykge1xuICAgICAgICAgICAgcGVuZGluZy5yZXNvbHZlKHsgc3RhdHVzOiAncHJldmVudF91cGRhdGUnIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGVuZGluZ0NhbGxiYWNrcy5jbGVhcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbnN1cmUgdGhlIHdvcmtlciBpcyBjb25uZWN0ZWQsIGluaXRpYXRpbmcgY29ubmVjdGlvbiBpZiBuZWVkZWQuXG4gICAgICogQHBhcmFtIGNvbmZpZyBUaGUgRGFzaCBjb25maWcgd2l0aCB3ZWJzb2NrZXQgc2V0dGluZ3NcbiAgICAgKi9cbiAgICBhc3luYyBlbnN1cmVDb25uZWN0ZWQoY29uZmlnKSB7XG4gICAgICAgIC8vIEFscmVhZHkgY29ubmVjdGVkXG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29ubmVjdGlvbiBpbiBwcm9ncmVzcywgd2FpdCBmb3IgaXRcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblByb21pc2UpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvblByb21pc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTmVlZCB0byBpbml0aWF0ZSBjb25uZWN0aW9uXG4gICAgICAgIGlmICghY29uZmlnLndlYnNvY2tldD8udXJsIHx8ICFjb25maWcud2Vic29ja2V0Py53b3JrZXJfdXJsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYlNvY2tldCBjb25maWcgbm90IGF2YWlsYWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgU2hhcmVkV29ya2VyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaGFyZWRXb3JrZXIgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJ1aWxkIFdlYlNvY2tldCBVUkxcbiAgICAgICAgY29uc3Qgd3NQcm90b2NvbCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnd3NzOicgOiAnd3M6JztcbiAgICAgICAgY29uc3QgaG9zdCA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0O1xuICAgICAgICBjb25zdCB3c1VybCA9IGAke3dzUHJvdG9jb2x9Ly8ke2hvc3R9JHtjb25maWcud2Vic29ja2V0LnVybH1gO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3QoY29uZmlnLndlYnNvY2tldC53b3JrZXJfdXJsLCB3c1VybCwgY29uZmlnLndlYnNvY2tldC5pbmFjdGl2aXR5X3RpbWVvdXQsIGNvbmZpZy53ZWJzb2NrZXQuaGVhcnRiZWF0X2ludGVydmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhIGNhbGxiYWNrIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB2aWEgdGhlIHdvcmtlci5cbiAgICAgKiBAcGFyYW0gcGF5bG9hZCBUaGUgY2FsbGJhY2sgcGF5bG9hZFxuICAgICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBjYWxsYmFjayByZXNwb25zZVxuICAgICAqL1xuICAgIGFzeW5jIHNlbmRDYWxsYmFjayhwYXlsb2FkKSB7XG4gICAgICAgIC8vIFdhaXQgZm9yIGluaXRpYWwgY29ubmVjdGlvbiBpZiBvbmUgaXMgaW4gcHJvZ3Jlc3NcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblByb21pc2UgJiYgIXRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvblByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLndvcmtlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3JrZXIgbm90IGNvbm5lY3RlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IGAke3RoaXMucmVuZGVyZXJJZH0tJHsrK3RoaXMucmVxdWVzdENvdW50ZXJ9YDtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0NhbGxiYWNrcy5zZXQocmVxdWVzdElkLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMud29ya2VyLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFdvcmtlck1lc3NhZ2VUeXBlLkNBTExCQUNLX1JFUVVFU1QsXG4gICAgICAgICAgICAgICAgcmVuZGVyZXJJZDogdGhpcy5yZW5kZXJlcklkLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYSBnZXRfcHJvcHMgcmVzcG9uc2UgYmFjayB0byB0aGUgc2VydmVyLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0SWQgVGhlIHJlcXVlc3QgSUQgZnJvbSB0aGUgZ2V0X3Byb3BzIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BlcnR5IHZhbHVlc1xuICAgICAqL1xuICAgIHNlbmRHZXRQcm9wc1Jlc3BvbnNlKHJlcXVlc3RJZCwgcHJvcHMpIHtcbiAgICAgICAgaWYgKCF0aGlzLndvcmtlciB8fCAhdGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud29ya2VyLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgdHlwZTogV29ya2VyTWVzc2FnZVR5cGUuR0VUX1BST1BTX1JFU1BPTlNFLFxuICAgICAgICAgICAgcmVuZGVyZXJJZDogdGhpcy5yZW5kZXJlcklkLFxuICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgcGF5bG9hZDogcHJvcHNcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSB3b3JrZXIgaXMgY29ubmVjdGVkLlxuICAgICAqL1xuICAgIGdldCBjb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOb3RpZnkgdGhlIHdvcmtlciB0aGF0IHRoZSB0YWIgaXMgbm93IHZpc2libGUuXG4gICAgICogVGhpcyByZXNldHMgdGhlIGluYWN0aXZpdHkgdGltZXIgdG8gcHJldmVudCB0aW1lb3V0IHdoaWxlIHVzZXIgaXMgdmlld2luZy5cbiAgICAgKi9cbiAgICBub3RpZnlUYWJWaXNpYmxlKCkge1xuICAgICAgICBpZiAodGhpcy53b3JrZXIgJiYgdGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy53b3JrZXIucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogV29ya2VyTWVzc2FnZVR5cGUuVEFCX1ZJU0lCTEUsXG4gICAgICAgICAgICAgICAgcmVuZGVyZXJJZDogdGhpcy5yZW5kZXJlcklkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVNZXNzYWdlKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhO1xuICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBXb3JrZXJNZXNzYWdlVHlwZS5DT05ORUNURUQ6XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uUmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25SZXNvbHZlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25Db25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNvbm5lY3RlZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgV29ya2VyTWVzc2FnZVR5cGUuRElTQ09OTkVDVEVEOlxuICAgICAgICAgICAgICAgIHRoaXMuaXNDb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIHBlbmRpbmcgY2FsbGJhY2tzIHdpdGggcHJldmVudF91cGRhdGUgc28gbG9hZGluZyBzdGF0ZXMgY2xlYXJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFssIHBlbmRpbmddIG9mIHRoaXMucGVuZGluZ0NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLnJlc29sdmUoeyBzdGF0dXM6ICdwcmV2ZW50X3VwZGF0ZScgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0NhbGxiYWNrcy5jbGVhcigpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uRGlzY29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25EaXNjb25uZWN0ZWQobWVzc2FnZS5wYXlsb2FkPy5yZWFzb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgV29ya2VyTWVzc2FnZVR5cGUuQ0FMTEJBQ0tfUkVTUE9OU0U6IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSBtZXNzYWdlLnJlcXVlc3RJZDtcbiAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nQ2FsbGJhY2tzLmdldChyZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0NhbGxiYWNrcy5kZWxldGUocmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZy5yZXNvbHZlKG1lc3NhZ2UucGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBXb3JrZXJNZXNzYWdlVHlwZS5TRVRfUFJPUFM6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25TZXRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2V0UHJvcHMobWVzc2FnZS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdvcmtlck1lc3NhZ2VUeXBlLlNFVF9QUk9QU19CQVRDSDpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vblNldFByb3BzQmF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNldFByb3BzQmF0Y2gobWVzc2FnZS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdvcmtlck1lc3NhZ2VUeXBlLkdFVF9QUk9QU19SRVFVRVNUOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uR2V0UHJvcHNSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25HZXRQcm9wc1JlcXVlc3QobWVzc2FnZS5yZXF1ZXN0SWQsIG1lc3NhZ2UucGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBXb3JrZXJNZXNzYWdlVHlwZS5FUlJPUjpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihtZXNzYWdlLnBheWxvYWQ/Lm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InLCBtZXNzYWdlLnBheWxvYWQ/LmNvZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIFNpbmdsZXRvbiBpbnN0YW5jZVxubGV0IHdvcmtlckNsaWVudEluc3RhbmNlID0gbnVsbDtcbi8qKlxuICogR2V0IHRoZSBzaW5nbGV0b24gV29ya2VyQ2xpZW50IGluc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2VyQ2xpZW50KCkge1xuICAgIGlmICghd29ya2VyQ2xpZW50SW5zdGFuY2UpIHtcbiAgICAgICAgd29ya2VyQ2xpZW50SW5zdGFuY2UgPSBuZXcgV29ya2VyQ2xpZW50KCk7XG4gICAgfVxuICAgIHJldHVybiB3b3JrZXJDbGllbnRJbnN0YW5jZTtcbn1cbi8qKlxuICogQ2hlY2sgaWYgV2ViU29ja2V0IGNhbGxiYWNrcyBhcmUgZ2xvYmFsbHkgZW5hYmxlZCBhbmQgc3VwcG9ydGVkLlxuICogQHBhcmFtIGNvbmZpZyBUaGUgRGFzaCBjb25maWdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV2ViU29ja2V0RW5hYmxlZChjb25maWcpIHtcbiAgICByZXR1cm4gISEoY29uZmlnLndlYnNvY2tldD8uZW5hYmxlZCAmJiB0eXBlb2YgU2hhcmVkV29ya2VyICE9PSAndW5kZWZpbmVkJyk7XG59XG4vKipcbiAqIENoZWNrIGlmIFdlYlNvY2tldCBpbmZyYXN0cnVjdHVyZSBpcyBhdmFpbGFibGUgKGZvciBwZXItY2FsbGJhY2sgd2Vic29ja2V0KS5cbiAqIEBwYXJhbSBjb25maWcgVGhlIERhc2ggY29uZmlnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dlYlNvY2tldEF2YWlsYWJsZShjb25maWcpIHtcbiAgICByZXR1cm4gISEoY29uZmlnLndlYnNvY2tldD8udXJsICYmXG4gICAgICAgIGNvbmZpZy53ZWJzb2NrZXQ/Lndvcmtlcl91cmwgJiZcbiAgICAgICAgdHlwZW9mIFNoYXJlZFdvcmtlciAhPT0gJ3VuZGVmaW5lZCcpO1xufVxuIiwiaW1wb3J0IGNoZWNrUHJvcFR5cGVzIGZyb20gJy4uL2NoZWNrUHJvcFR5cGVzJztcbmltcG9ydCB7IHByb3BUeXBlRXJyb3JIYW5kbGVyIH0gZnJvbSAnLi4vZXhjZXB0aW9ucyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUNvbXBvbmVudCB9IGZyb20gJy4vd3JhcHBpbmcnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ2hlY2tlZENvbXBvbmVudChwKSB7XG4gICAgY29uc3QgeyBlbGVtZW50LCBwcm9wcywgY2hpbGRyZW4sIGNvbXBvbmVudCB9ID0gcDtcbiAgICB2YWxpZGF0ZUNvbXBvbmVudChjb21wb25lbnQpO1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGNoZWNrUHJvcFR5cGVzKGVsZW1lbnQucHJvcFR5cGVzLCBwcm9wcywgJ2NvbXBvbmVudCBwcm9wJywgZWxlbWVudCk7XG4gICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgICBwcm9wVHlwZUVycm9ySGFuZGxlcihlcnJvck1lc3NhZ2UsIHByb3BzLCBjb21wb25lbnQudHlwZSk7XG4gICAgfVxuICAgIHJldHVybiBjaGlsZHJlbjtcbn1cbiIsImltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVN0b3JlLCB1c2VTZWxlY3RvciwgdXNlRGlzcGF0Y2ggfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgeyBjb25jYXQsIHBhdGhPciB9IGZyb20gJ3JhbWRhJztcbmV4cG9ydCBjb25zdCBEYXNoQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuZXhwb3J0IGZ1bmN0aW9uIERhc2hDb250ZXh0UHJvdmlkZXIocHJvcHMpIHtcbiAgICBjb25zdCB7IGNoaWxkcmVuLCBjb21wb25lbnRQYXRoIH0gPSBwcm9wcztcbiAgICBjb25zdCBzdHJpbmdQYXRoID0gdXNlTWVtbygoKSA9PiBKU09OLnN0cmluZ2lmeShjb21wb25lbnRQYXRoKSwgW2NvbXBvbmVudFBhdGhdKTtcbiAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlKCk7XG4gICAgY29uc3QgaXNMb2FkaW5nID0gdXNlQ2FsbGJhY2soKG9wdGlvbnMpID0+IHtcbiAgICAgICAgY29uc3QgeyBleHRyYVBhdGgsIHJhd1BhdGgsIGZpbHRlckZ1bmMgfSA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGxldCBsb2FkaW5nUGF0aCA9IFtzdHJpbmdQYXRoXTtcbiAgICAgICAgaWYgKGV4dHJhUGF0aCkge1xuICAgICAgICAgICAgbG9hZGluZ1BhdGggPSBbXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29uY2F0KGNvbXBvbmVudFBhdGgsIGV4dHJhUGF0aCkpXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJhd1BhdGgpIHtcbiAgICAgICAgICAgIGxvYWRpbmdQYXRoID0gW0pTT04uc3RyaW5naWZ5KHJhd1BhdGgpXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsb2FkaW5nID0gcGF0aE9yKFtdLCBsb2FkaW5nUGF0aCwgc3RvcmUuZ2V0U3RhdGUoKS5sb2FkaW5nKTtcbiAgICAgICAgcmV0dXJuIGZpbHRlckZ1bmNcbiAgICAgICAgICAgID8gbG9hZGluZy5maWx0ZXIoZmlsdGVyRnVuYykubGVuZ3RoID4gMFxuICAgICAgICAgICAgOiBsb2FkaW5nLmxlbmd0aCA+IDA7XG4gICAgfSwgW3N0cmluZ1BhdGhdKTtcbiAgICBjb25zdCB1c2VMb2FkaW5nID0gdXNlQ2FsbGJhY2soKG9wdGlvbnMpID0+IHtcbiAgICAgICAgY29uc3QgeyBmaWx0ZXJGdW5jLCBleHRyYVBhdGgsIHJhd1BhdGggfSA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHJldHVybiB1c2VTZWxlY3Rvcigoc3RhdGUpID0+IHtcbiAgICAgICAgICAgIGxldCBsb2FkaW5nUGF0aCA9IFtzdHJpbmdQYXRoXTtcbiAgICAgICAgICAgIGlmIChleHRyYVBhdGgpIHtcbiAgICAgICAgICAgICAgICBsb2FkaW5nUGF0aCA9IFtcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29uY2F0KGNvbXBvbmVudFBhdGgsIGV4dHJhUGF0aCkpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJhd1BhdGgpIHtcbiAgICAgICAgICAgICAgICBsb2FkaW5nUGF0aCA9IFtKU09OLnN0cmluZ2lmeShyYXdQYXRoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBsb2FkID0gcGF0aE9yKFtdLCBsb2FkaW5nUGF0aCwgc3RhdGUubG9hZGluZyk7XG4gICAgICAgICAgICBpZiAoZmlsdGVyRnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBsb2FkLmZpbHRlcihmaWx0ZXJGdW5jKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGxvYWQubGVuZ3RoID4gMDtcbiAgICAgICAgfSk7XG4gICAgfSwgW3N0cmluZ1BhdGhdKTtcbiAgICBjb25zdCBjdHhWYWx1ZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29tcG9uZW50UGF0aCxcbiAgICAgICAgICAgIGlzTG9hZGluZyxcbiAgICAgICAgICAgIHVzZUxvYWRpbmcsXG4gICAgICAgICAgICB1c2VTZWxlY3RvcixcbiAgICAgICAgICAgIHVzZVN0b3JlLFxuICAgICAgICAgICAgdXNlRGlzcGF0Y2hcbiAgICAgICAgfTtcbiAgICB9LCBbc3RyaW5nUGF0aF0pO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChEYXNoQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogY3R4VmFsdWUgfSwgY2hpbGRyZW4pKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXNoQ29udGV4dCgpIHtcbiAgICBjb25zdCBjdHggPSB1c2VDb250ZXh0KERhc2hDb250ZXh0KTtcbiAgICBpZiAoIWN0eCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yKCdEYXNoIENvbnRleHQgd2FzIG5vdCBmb3VuZCwgY29tcG9uZW50IHdhcyByZW5kZXJlZCB3aXRob3V0IGEgd3JhcHBlci4gVXNlIGB3aW5kb3cuZGFzaF9jb21wb25lbnRfYXBpLkV4dGVybmFsV3JhcHBlcmAgdG8gbWFrZSBzdXJlIHRoZSBjb21wb25lbnQgaXMgcHJvcGVybHkgY29ubmVjdGVkLicpO1xuICAgIH1cbiAgICByZXR1cm4gY3R4IHx8IHt9O1xufVxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VSZWYsIHVzZU1lbW8sIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHBhdGgsIGNvbmNhdCwgcGlja0J5LCBlcXVhbHMsIGtleXMsIGlzLCBpc0VtcHR5LCBwaWNrLCBhc3NvY1BhdGgsIHBhdGhPciwgbWVyZ2VSaWdodCwgZGlzc29jLCBhc3NvYywgbWFwT2JqSW5kZXhlZCwgdHlwZSB9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7IHVzZVNlbGVjdG9yLCB1c2VEaXNwYXRjaCwgYmF0Y2ggfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgQ29tcG9uZW50RXJyb3JCb3VuZGFyeSBmcm9tICcuLi9jb21wb25lbnRzL2Vycm9yL0NvbXBvbmVudEVycm9yQm91bmRhcnkucmVhY3QnO1xuaW1wb3J0IHsgbm90aWZ5T2JzZXJ2ZXJzLCBvbkVycm9yLCB1cGRhdGVQcm9wcywgcmVzZXRDb21wb25lbnRTdGF0ZSB9IGZyb20gJy4uL2FjdGlvbnMnO1xuaW1wb3J0IHsgZ2V0V2F0Y2hlZEtleXMsIHN0cmluZ2lmeUlkIH0gZnJvbSAnLi4vYWN0aW9ucy9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgZ2V0Q29tcG9uZW50TGF5b3V0LCBpc0RyeUNvbXBvbmVudCwgY2hlY2tSZW5kZXJUeXBlUHJvcCwgc3RyaW5naWZ5UGF0aCB9IGZyb20gJy4vd3JhcHBpbmcnO1xuaW1wb3J0IFJlZ2lzdHJ5IGZyb20gJy4uL3JlZ2lzdHJ5JztcbmltcG9ydCBpc1NpbXBsZUNvbXBvbmVudCBmcm9tICcuLi9pc1NpbXBsZUNvbXBvbmVudCc7XG5pbXBvcnQgeyBzZWxlY3REYXNoUHJvcHMsIHNlbGVjdERhc2hQcm9wc0VxdWFsaXR5Rm4sIHNlbGVjdENvbmZpZyB9IGZyb20gJy4vc2VsZWN0b3JzJztcbmltcG9ydCBDaGVja2VkQ29tcG9uZW50IGZyb20gJy4vQ2hlY2tlZENvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXNoQ29udGV4dFByb3ZpZGVyIH0gZnJvbSAnLi9EYXNoQ29udGV4dCc7XG5mdW5jdGlvbiBEYXNoV3JhcHBlcih7IGNvbXBvbmVudFBhdGgsIF9kYXNocHJpdmF0ZV9lcnJvciwgX3Bhc3NlZENvbXBvbmVudCwgLy8gcGFzcyBjb21wb25lbnQgdG8gdGhlIERhc2hXcmFwcGVyIGluIHRoZSBldmVudCB0aGF0IGl0IGlzIGEgbmV3UmVuZGVyIGFuZCB0aGVyZSBhcmUgbm8gbGF5b3V0aGFzaGVzXG5fbmV3UmVuZGVyLCAvLyB0aGlzIGlzIHRvIGZvcmNlIHRoZSBjb21wb25lbnQgdG8gbmV3bHkgcmVuZGVyIHJlZ2FyZGxlc3Mgb2YgcHJvcHMgKHJlZHJhdyBhbmQgY29tcG9uZW50IGFzIHByb3BzKSBpcyBwYXNzZWQgZnJvbSB0aGUgcGFyZW50XG4uLi5leHRyYXMgfSkge1xuICAgIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcbiAgICBjb25zdCBtZW1vaXplZEtleXMgPSB1c2VSZWYoe30pO1xuICAgIGNvbnN0IG5ld1JlbmRlciA9IHVzZVJlZihmYWxzZSk7XG4gICAgY29uc3QgZnJlc2hSZW5kZXJzID0gdXNlUmVmKDApO1xuICAgIGNvbnN0IHJlbmRlcmVkUGF0aCA9IHVzZVJlZihjb21wb25lbnRQYXRoKTtcbiAgICBsZXQgcmVuZGVyQ29tcG9uZW50ID0gbnVsbDtcbiAgICBsZXQgcmVuZGVyQ29tcG9uZW50UHJvcHMgPSBudWxsO1xuICAgIGxldCByZW5kZXJIID0gbnVsbDtcbiAgICAvLyBHZXQgdGhlIGNvbmZpZyBmb3IgdGhlIGNvbXBvbmVudCBhcyBwcm9wc1xuICAgIGNvbnN0IGNvbmZpZyA9IHVzZVNlbGVjdG9yKHNlbGVjdENvbmZpZyk7XG4gICAgLy8gU2VsZWN0IGNvbXBvbmVudCBhbmQgaXQncyBwcm9wcywgYWxvbmcgd2l0aCByZW5kZXIgaGFzaCwgY2hhbmdlZCBwcm9wcyBhbmQgdGhlIHJlYXNvbiBmb3IgcmVuZGVyXG4gICAgY29uc3QgW2NvbXBvbmVudCwgY29tcG9uZW50UHJvcHMsIGgsIGNoYW5nZWRQcm9wcywgcmVuZGVyVHlwZV0gPSB1c2VTZWxlY3RvcihzZWxlY3REYXNoUHJvcHMoY29tcG9uZW50UGF0aCksIHNlbGVjdERhc2hQcm9wc0VxdWFsaXR5Rm4pO1xuICAgIHJlbmRlckNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICByZW5kZXJDb21wb25lbnRQcm9wcyA9IGNvbXBvbmVudFByb3BzO1xuICAgIHJlbmRlckggPSBoO1xuICAgIHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBpZiAoX25ld1JlbmRlcikge1xuICAgICAgICAgICAgbmV3UmVuZGVyLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgcmVuZGVySCA9IDA7XG4gICAgICAgICAgICBmcmVzaFJlbmRlcnMuY3VycmVudCArPSAxO1xuICAgICAgICAgICAgaWYgKHJlbmRlckggaW4gbWVtb2l6ZWRLZXlzLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbWVtb2l6ZWRLZXlzLmN1cnJlbnRbcmVuZGVySF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBuZXdSZW5kZXIuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcmVkUGF0aC5jdXJyZW50ID0gY29tcG9uZW50UGF0aDtcbiAgICB9LCBbX25ld1JlbmRlcl0pO1xuICAgIGNvbnN0IHNldFByb3BzID0gKG5ld1Byb3BzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaWQgfSA9IHJlbmRlckNvbXBvbmVudFByb3BzO1xuICAgICAgICBjb25zdCB7IF9kYXNoX2Vycm9yLCAuLi5yZXN0UHJvcHMgfSA9IG5ld1Byb3BzO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZGlzcGF0Y2goKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgZ3JhcGhzIH0gPSBjdXJyZW50U3RhdGU7XG4gICAgICAgICAgICBjb25zdCBvbGRMYXlvdXQgPSBnZXRDb21wb25lbnRMYXlvdXQocmVuZGVyZWRQYXRoLmN1cnJlbnQsIGN1cnJlbnRTdGF0ZSk7XG4gICAgICAgICAgICBpZiAoIW9sZExheW91dClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCB7IHByb3BzOiBvbGRQcm9wcyB9ID0gb2xkTGF5b3V0O1xuICAgICAgICAgICAgaWYgKCFvbGRQcm9wcylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VkUHJvcHMgPSBwaWNrQnkoKHZhbCwga2V5KSA9PiAhZXF1YWxzKHZhbCwgb2xkUHJvcHNba2V5XSksIHJlc3RQcm9wcyk7XG4gICAgICAgICAgICBpZiAoX2Rhc2hfZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChvbkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Zyb250RW5kJyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IF9kYXNoX2Vycm9yXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRW1wdHkoY2hhbmdlZFByb3BzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElkZW50aWZ5IHRoZSBtb2RpZmllZCBwcm9wcyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgY2FsbGJhY2tzXG4gICAgICAgICAgICBjb25zdCB3YXRjaGVkS2V5cyA9IGdldFdhdGNoZWRLZXlzKGlkLCBrZXlzKGNoYW5nZWRQcm9wcyksIGdyYXBocyk7XG4gICAgICAgICAgICBiYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gT25seSBkaXNwYXRjaCBjaGFuZ2VzIHRvIERhc2ggaWYgYSB3YXRjaGVkIHByb3AgY2hhbmdlZFxuICAgICAgICAgICAgICAgIGlmICh3YXRjaGVkS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm90aWZ5T2JzZXJ2ZXJzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IHBpY2sod2F0Y2hlZEtleXMsIGNoYW5nZWRQcm9wcylcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBBbHdheXMgdXBkYXRlIHRoaXMgY29tcG9uZW50J3MgcHJvcHNcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh1cGRhdGVQcm9wcyh7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiBjaGFuZ2VkUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1wYXRoOiByZW5kZXJlZFBhdGguY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyVHlwZTogJ2ludGVybmFsJ1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IGNyZWF0ZUNvbnRhaW5lciA9IHVzZUNhbGxiYWNrKChjb250YWluZXIsIGNvbnRhaW5lclBhdGgsIF9jaGlsZE5ld1JlbmRlcikgPT4ge1xuICAgICAgICBpZiAoaXNTaW1wbGVDb21wb25lbnQocmVuZGVyQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlbmRlckNvbXBvbmVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoRGFzaFdyYXBwZXIsIHsga2V5OiBjb250YWluZXI/LnByb3BzPy5pZFxuICAgICAgICAgICAgICAgID8gc3RyaW5naWZ5SWQoY29udGFpbmVyLnByb3BzLmlkKVxuICAgICAgICAgICAgICAgIDogc3RyaW5naWZ5UGF0aChjb250YWluZXJQYXRoKSwgX2Rhc2hwcml2YXRlX2Vycm9yOiBfZGFzaHByaXZhdGVfZXJyb3IsIGNvbXBvbmVudFBhdGg6IGNvbnRhaW5lclBhdGgsIF9wYXNzZWRDb21wb25lbnQ6IGNvbnRhaW5lciwgX25ld1JlbmRlcjogX2NoaWxkTmV3UmVuZGVyIH0pKTtcbiAgICB9LCBbXSk7XG4gICAgY29uc3Qgd3JhcENoaWxkcmVuUHJvcCA9IHVzZUNhbGxiYWNrKChub2RlLCBjaGlsZHJlblBhdGgsIF9jaGlsZE5ld1JlbmRlcikgPT4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUubWFwKChuLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlzRHJ5Q29tcG9uZW50KG4pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVDb250YWluZXIobiwgY29uY2F0KGNvbXBvbmVudFBhdGgsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jaGlsZHJlblBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBpXG4gICAgICAgICAgICAgICAgICAgIF0pLCBfY2hpbGROZXdSZW5kZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNEcnlDb21wb25lbnQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjcmVhdGVDb250YWluZXIobm9kZSwgY29uY2F0KGNvbXBvbmVudFBhdGgsIFsncHJvcHMnLCAuLi5jaGlsZHJlblBhdGhdKSwgX2NoaWxkTmV3UmVuZGVyKTtcbiAgICB9LCBbY29tcG9uZW50UGF0aF0pO1xuICAgIGNvbnN0IGV4dHJhUHJvcHMgPSB7XG4gICAgICAgIHNldFByb3BzLFxuICAgICAgICAuLi5leHRyYXNcbiAgICB9O1xuICAgIGlmIChjaGVja1JlbmRlclR5cGVQcm9wKHJlbmRlckNvbXBvbmVudCkpIHtcbiAgICAgICAgZXh0cmFQcm9wc1snZGFzaFJlbmRlclR5cGUnXSA9IG5ld1JlbmRlci5jdXJyZW50XG4gICAgICAgICAgICA/ICdwYXJlbnQnXG4gICAgICAgICAgICA6IGNoYW5nZWRQcm9wc1xuICAgICAgICAgICAgICAgID8gcmVuZGVyVHlwZVxuICAgICAgICAgICAgICAgIDogJ3BhcmVudCc7XG4gICAgfVxuICAgIGNvbnN0IHNldEh5ZHJhdGVkUHJvcHMgPSAoY29tcG9uZW50LCBjb21wb25lbnRQcm9wcykgPT4ge1xuICAgICAgICAvLyBIeWRyYXRlIGNvbXBvbmVudHMgcHJvcHNcbiAgICAgICAgY29uc3QgY2hpbGRyZW5Qcm9wcyA9IHBhdGhPcihbXSwgWydjaGlsZHJlbl9wcm9wcycsIGNvbXBvbmVudD8ubmFtZXNwYWNlLCBjb21wb25lbnQ/LnR5cGVdLCBjb25maWcpO1xuICAgICAgICBsZXQgcHJvcHMgPSBtZXJnZVJpZ2h0KGRpc3NvYygnY2hpbGRyZW4nLCBjb21wb25lbnRQcm9wcyksIGV4dHJhUHJvcHMpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuUHJvcCA9IGNoaWxkcmVuUHJvcHNbaV07XG4gICAgICAgICAgICBsZXQgY2hpbGROZXdSZW5kZXIgPSAwO1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcFxuICAgICAgICAgICAgICAgIC5zcGxpdCgnLicpWzBdXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJ1tdJywgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJ3t9JywgJycpIGluIGNoYW5nZWRQcm9wcyB8fFxuICAgICAgICAgICAgICAgIG5ld1JlbmRlci5jdXJyZW50IHx8XG4gICAgICAgICAgICAgICAgIXJlbmRlckgpIHtcbiAgICAgICAgICAgICAgICBjaGlsZE5ld1JlbmRlciA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaGFuZGxlT2JqZWN0ID0gKG9iaiwgb3BhdGgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFwT2JqSW5kZXhlZCgobm9kZSwgaykgPT4gd3JhcENoaWxkcmVuUHJvcChub2RlLCBbLi4ub3BhdGgsIGtdLCBjaGlsZE5ld1JlbmRlciksIG9iaik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuUGF0aCA9IGNoaWxkcmVuUHJvcC5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgIGxldCBub2RlO1xuICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygnW10nKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcm9udFBhdGggPSBbXSwgYmFja1BhdGggPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2UsIGhhc09iamVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAvLyBBdCBmaXJzdCB0aGUgY2hpbGRyZW5QYXRoIGlzIGFsd2F5cyBhIGxpc3Qgb2Ygc3RyaW5ncy5cbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5QYXRoLmZvckVhY2gocCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuaW5jbHVkZXMoJ1tdJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocC5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT2JqZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250UGF0aC5wdXNoKHAucmVwbGFjZSgne30nLCAnJykucmVwbGFjZSgnW10nLCAnJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRQYXRoLnB1c2gocC5yZXBsYWNlKCdbXScsICcnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocC5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPYmplY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9udFBhdGgucHVzaChwLnJlcGxhY2UoJ3t9JywgJycpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250UGF0aC5wdXNoKHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLmluY2x1ZGVzKCd7fScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc09iamVjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tQYXRoLnB1c2gocC5yZXBsYWNlKCd7fScsICcnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrUGF0aC5wdXNoKHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBwYXRoKGZyb250UGF0aCwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkIHx8ICFub2RlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0Tm9kZSA9IHBhdGgoYmFja1BhdGgsIG5vZGVbMF0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbm9kZVZhbHVlID0gbm9kZS5tYXAoKGVsLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50UGF0aCA9IGNvbmNhdChmcm9udFBhdGgsIGNvbmNhdChbaV0sIGJhY2tQYXRoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc09iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrUGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFZhbHVlID0gaGFuZGxlT2JqZWN0KHBhdGgoYmFja1BhdGgsIGVsKSwgZWxlbWVudFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFZhbHVlID0gaGFuZGxlT2JqZWN0KGVsLCBlbGVtZW50UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFZhbHVlID0gd3JhcENoaWxkcmVuUHJvcChwYXRoKGJhY2tQYXRoLCBlbCksIGVsZW1lbnRQYXRoLCBjaGlsZE5ld1JlbmRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzb2NQYXRoKGJhY2tQYXRoLCBsaXN0VmFsdWUsIGVsKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuUGF0aCA9IGZyb250UGF0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlblByb3AuaW5jbHVkZXMoJ3t9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgc3VwcG9ydHMgb25lIGxldmVsIG9mIG5lc3RpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcm9udCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGR5bmFtaWMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNCYWNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrUGF0aCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjaGlsZHJlblBhdGgubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXIgPSBjaGlsZHJlblBhdGhbal07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ci5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljID0gY29uY2F0KGZyb250LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIucmVwbGFjZSgne30nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgY2hpbGRyZW5QYXRoLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0JhY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja1BhdGgucHVzaChjdXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnQucHVzaChjdXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHluVmFsdWUgPSBwYXRoKGR5bmFtaWMsIHByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeW5WYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9vIGR5bmFtaWMgZm9yIHByb3BlciB0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVWYWx1ZSA9IG1hcE9iakluZGV4ZWQoKGQsIGspID0+IHdyYXBDaGlsZHJlblByb3AoaGFzQmFjayA/IHBhdGgoYmFja1BhdGgsIGQpIDogZCwgaGFzQmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbmNhdChkeW5hbWljLCBjb25jYXQoW2tdLCBiYWNrUGF0aCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29uY2F0KGR5bmFtaWMsIFtrXSksIGNoaWxkTmV3UmVuZGVyKSwgZHluVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuUGF0aCA9IGR5bmFtaWM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gcGF0aChjaGlsZHJlblBhdGgsIHByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVWYWx1ZSA9IHdyYXBDaGlsZHJlblByb3Aobm9kZSwgY2hpbGRyZW5QYXRoLCBjaGlsZE5ld1JlbmRlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvcHMgPSBhc3NvY1BhdGgoY2hpbGRyZW5QYXRoLCBub2RlVmFsdWUsIHByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlblByb3AuaW5jbHVkZXMoJ3t9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9wYXRoID0gY2hpbGRyZW5Qcm9wLnJlcGxhY2UoJ3t9JywgJycpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0FycmF5ID0gY2hpbGRyZW5Qcm9wLmluY2x1ZGVzKCdbXScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BhdGggPSBvcGF0aC5yZXBsYWNlKCdbXScsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gcHJvcHNbb3BhdGhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9kZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhUGF0aCA9IGNvbmNhdChbb3BhdGhdLCBbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcyA9IGFzc29jUGF0aChhUGF0aCwgaGFuZGxlT2JqZWN0KG5vZGVbal0sIGFQYXRoKSwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzID0gYXNzb2Mob3BhdGgsIGhhbmRsZU9iamVjdChub2RlLCBbb3BhdGhdKSwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gcHJvcHNbY2hpbGRyZW5Qcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMgPSBhc3NvYyhjaGlsZHJlblByb3AsIHdyYXBDaGlsZHJlblByb3Aobm9kZSwgW2NoaWxkcmVuUHJvcF0sIGNoaWxkTmV3UmVuZGVyKSwgcHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlKHByb3BzLmlkKSA9PT0gJ09iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIFR1cm4gb2JqZWN0IGlkcyAoZm9yIHdpbGRjYXJkcykgaW50byB1bmlxdWUgc3RyaW5ncy5cbiAgICAgICAgICAgIC8vIEJlY2F1c2Ugb2YgdGhlIGBkaXNzb2NgIGFib3ZlIHdlJ3JlIG5vdCBtdXRhdGluZyB0aGUgbGF5b3V0LFxuICAgICAgICAgICAgLy8ganVzdCB0aGUgaWQgd2UgcGFzcyBvbiB0byB0aGUgcmVuZGVyZWQgY29tcG9uZW50XG4gICAgICAgICAgICBwcm9wcy5pZCA9IHN0cmluZ2lmeUlkKHByb3BzLmlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgfTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoX25ld1JlbmRlcikge1xuICAgICAgICAgICAgZGlzcGF0Y2gocmVzZXRDb21wb25lbnRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgaXRlbXBhdGg6IGNvbXBvbmVudFBhdGhcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgIH0sIFtfbmV3UmVuZGVyXSk7XG4gICAgY29uc3QgaHlkcmF0ZUZ1bmMgPSAoKSA9PiB7XG4gICAgICAgIGlmIChuZXdSZW5kZXIuY3VycmVudCkge1xuICAgICAgICAgICAgcmVuZGVyQ29tcG9uZW50ID0gX3Bhc3NlZENvbXBvbmVudDtcbiAgICAgICAgICAgIHJlbmRlckNvbXBvbmVudFByb3BzID0gX3Bhc3NlZENvbXBvbmVudD8ucHJvcHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZW5kZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBSZWdpc3RyeS5yZXNvbHZlKHJlbmRlckNvbXBvbmVudCk7XG4gICAgICAgIGNvbnN0IGh5ZHJhdGVkUHJvcHMgPSBzZXRIeWRyYXRlZFByb3BzKHJlbmRlckNvbXBvbmVudCwgcmVuZGVyQ29tcG9uZW50UHJvcHMpO1xuICAgICAgICBsZXQgaHlkcmF0ZWRDaGlsZHJlbjtcbiAgICAgICAgaWYgKHJlbmRlckNvbXBvbmVudFByb3BzLmNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGh5ZHJhdGVkQ2hpbGRyZW4gPSB3cmFwQ2hpbGRyZW5Qcm9wKHJlbmRlckNvbXBvbmVudFByb3BzLmNoaWxkcmVuLCBbJ2NoaWxkcmVuJ10sICFyZW5kZXJIIHx8IG5ld1JlbmRlci5jdXJyZW50IHx8ICdjaGlsZHJlbicgaW4gY2hhbmdlZFByb3BzXG4gICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgIDogMCk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3UmVuZGVyLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGNvbmZpZy5wcm9wc19jaGVjayA/IChSZWFjdC5jcmVhdGVFbGVtZW50KENoZWNrZWRDb21wb25lbnQsIHsgZWxlbWVudDogZWxlbWVudCwgcHJvcHM6IGh5ZHJhdGVkUHJvcHMsIGNvbXBvbmVudDogcmVuZGVyQ29tcG9uZW50IH0sIGNyZWF0ZUVsZW1lbnQoZWxlbWVudCwgaHlkcmF0ZWRQcm9wcywgZXh0cmFQcm9wcywgaHlkcmF0ZWRDaGlsZHJlbikpKSA6IChjcmVhdGVFbGVtZW50KGVsZW1lbnQsIGh5ZHJhdGVkUHJvcHMsIGV4dHJhUHJvcHMsIGh5ZHJhdGVkQ2hpbGRyZW4pKTtcbiAgICB9O1xuICAgIGxldCBoeWRyYXRlZCA9IG51bGw7XG4gICAgaWYgKHJlbmRlckggaW4gbWVtb2l6ZWRLZXlzLmN1cnJlbnQgJiYgIW5ld1JlbmRlci5jdXJyZW50KSB7XG4gICAgICAgIGh5ZHJhdGVkID0gUmVhY3QuaXNWYWxpZEVsZW1lbnQobWVtb2l6ZWRLZXlzLmN1cnJlbnRbcmVuZGVySF0pXG4gICAgICAgICAgICA/IG1lbW9pemVkS2V5cy5jdXJyZW50W3JlbmRlckhdXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgfVxuICAgIGlmICghaHlkcmF0ZWQpIHtcbiAgICAgICAgaHlkcmF0ZWQgPSBoeWRyYXRlRnVuYygpO1xuICAgICAgICBtZW1vaXplZEtleXMuY3VycmVudCA9IHsgW3JlbmRlckhdOiBoeWRyYXRlZCB9O1xuICAgIH1cbiAgICByZXR1cm4gcmVuZGVyQ29tcG9uZW50ID8gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50RXJyb3JCb3VuZGFyeSwgeyBjb21wb25lbnRUeXBlOiByZW5kZXJDb21wb25lbnQudHlwZSwgY29tcG9uZW50SWQ6IGlzKE9iamVjdCwgcmVuZGVyQ29tcG9uZW50UHJvcHMuaWQpXG4gICAgICAgICAgICA/IHN0cmluZ2lmeUlkKHJlbmRlckNvbXBvbmVudFByb3BzLmlkKVxuICAgICAgICAgICAgOiByZW5kZXJDb21wb25lbnRQcm9wcy5pZCwgZXJyb3I6IF9kYXNocHJpdmF0ZV9lcnJvciwgZGlzcGF0Y2g6IGRpc3BhdGNoLCBrZXk6IGZyZXNoUmVuZGVycy5jdXJyZW50IH0sXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRGFzaENvbnRleHRQcm92aWRlciwgeyBjb21wb25lbnRQYXRoOiBjb21wb25lbnRQYXRoIH0sIFJlYWN0LmlzVmFsaWRFbGVtZW50KGh5ZHJhdGVkKSA/IGh5ZHJhdGVkIDogUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBudWxsKSkpKSA6IChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwpKTtcbn1cbmV4cG9ydCBkZWZhdWx0IERhc2hXcmFwcGVyO1xuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBiYXRjaCwgdXNlRGlzcGF0Y2ggfSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgRGFzaFdyYXBwZXIgZnJvbSAnLi9EYXNoV3JhcHBlcic7XG5pbXBvcnQgeyBhZGRDb21wb25lbnRUb0xheW91dCwgbm90aWZ5T2JzZXJ2ZXJzLCByZW1vdmVDb21wb25lbnQsIHVwZGF0ZVByb3BzIH0gZnJvbSAnLi4vYWN0aW9ucyc7XG4vKipcbiAqIEZvciByZW5kZXJpbmcgY29tcG9uZW50cyB0aGF0IGFyZSBvdXQgb2YgdGhlIHJlZ3VsYXIgbGF5b3V0IHRyZWUuXG4gKi9cbmZ1bmN0aW9uIEV4dGVybmFsV3JhcHBlcih7IGNvbXBvbmVudCwgY29tcG9uZW50UGF0aCwgdGVtcCA9IGZhbHNlIH0pIHtcbiAgICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XG4gICAgY29uc3QgW2luc2VydGVkLCBzZXRJbnNlcnRlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgLy8gR2l2ZSBlbXB0eSBwcm9wcyBmb3IgdGhlIGluc2VydGVkIGNvbXBvbmVudHMuXG4gICAgICAgIC8vIFRoZSBwcm9wcyB3aWxsIGNvbWUgZnJvbSB0aGUgcGFyZW50IHNvIHRoZXkgY2FuIGJlIHVwZGF0ZWQuXG4gICAgICAgIGRpc3BhdGNoKGFkZENvbXBvbmVudFRvTGF5b3V0KHtcbiAgICAgICAgICAgIGNvbXBvbmVudCxcbiAgICAgICAgICAgIGNvbXBvbmVudFBhdGhcbiAgICAgICAgfSkpO1xuICAgICAgICBzZXRJbnNlcnRlZCh0cnVlKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0ZW1wKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2gocmVtb3ZlQ29tcG9uZW50KHsgY29tcG9uZW50UGF0aCB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSwgW10pO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGJhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHVwZGF0ZVByb3BzKHsgaXRlbXBhdGg6IGNvbXBvbmVudFBhdGgsIHByb3BzOiBjb21wb25lbnQucHJvcHMgfSkpO1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5wcm9wcy5pZCkge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKG5vdGlmeU9ic2VydmVycyh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBjb21wb25lbnQucHJvcHMuaWQsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiBjb21wb25lbnQucHJvcHNcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sIFtjb21wb25lbnQucHJvcHNdKTtcbiAgICBpZiAoIWluc2VydGVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBSZW5kZXIgYSB3cmFwcGVyIHdpdGggdGhlIGFjdHVhbCBwcm9wcy5cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChEYXNoV3JhcHBlciwgeyBjb21wb25lbnRQYXRoOiBjb21wb25lbnRQYXRoIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgRXh0ZXJuYWxXcmFwcGVyO1xuIiwiaW1wb3J0IHsgZ2V0Q29tcG9uZW50TGF5b3V0LCBzdHJpbmdpZnlQYXRoLCBjaGVja0Rhc2hDaGlsZHJlblVwZGF0ZSB9IGZyb20gJy4vd3JhcHBpbmcnO1xuaW1wb3J0IHsgcGF0aE9yIH0gZnJvbSAncmFtZGEnO1xuY29uc3QgcHJldmlvdXNIYXNoZXMgPSB7fTtcbmNvbnN0IGlzRmlyc3RMZXZlbFByb3BzQ2hpbGQgPSAodXBkYXRlZFBhdGgsIHN0clBhdGgpID0+IHtcbiAgICBjb25zdCB1cGRhdGVkU2VnbWVudHMgPSB1cGRhdGVkUGF0aC5zcGxpdCgnLCcpO1xuICAgIGNvbnN0IGZ1bGxTZWdtZW50cyA9IHN0clBhdGguc3BsaXQoJywnKTtcbiAgICAvLyBDaGVjayB0aGF0IHN0clBhdGggYWN0dWFsbHkgc3RhcnRzIHdpdGggdXBkYXRlZFBhdGhcbiAgICBjb25zdCBzdGFydHNXaXRoUGF0aCA9IGZ1bGxTZWdtZW50cy5ldmVyeSgoc2VnLCBpKSA9PiB1cGRhdGVkU2VnbWVudHNbaV0gPT09IHNlZyk7XG4gICAgaWYgKCFzdGFydHNXaXRoUGF0aClcbiAgICAgICAgcmV0dXJuIFtmYWxzZSwgW11dO1xuICAgIC8vIEdldCB0aGUgcmVtYWluaW5nIHBhdGggYWZ0ZXIgdGhlIHByZWZpeFxuICAgIGNvbnN0IHJlbWFpbmluZ1NlZ21lbnRzID0gdXBkYXRlZFNlZ21lbnRzLnNsaWNlKGZ1bGxTZWdtZW50cy5sZW5ndGgpO1xuICAgIGNvbnN0IHByb3BzQ291bnQgPSByZW1haW5pbmdTZWdtZW50cy5maWx0ZXIocyA9PiBzID09PSAncHJvcHMnKS5sZW5ndGg7XG4gICAgcmV0dXJuIFtwcm9wc0NvdW50IDwgMiwgcmVtYWluaW5nU2VnbWVudHNdO1xufTtcbmZ1bmN0aW9uIGRldGVybWluZUNoYW5nZWRQcm9wcyhzdGF0ZSwgc3RyUGF0aCkge1xuICAgIGxldCBjb21iaW5lZEhhc2ggPSAwO1xuICAgIGxldCByZW5kZXJUeXBlOyAvLyBEZWZhdWx0IHJlbmRlciB0eXBlLCBhZGp1c3QgYXMgbmVlZGVkXG4gICAgY29uc3QgY2hhbmdlZFByb3BzID0ge307XG4gICAgT2JqZWN0LmVudHJpZXMoc3RhdGUubGF5b3V0SGFzaGVzKS5mb3JFYWNoKChbdXBkYXRlZFBhdGgsIHBhdGhIYXNoXSkgPT4ge1xuICAgICAgICBjb25zdCBbZGVzY2VuZGFudCwgcmVtYWluaW5nU2VnbWVudHNdID0gaXNGaXJzdExldmVsUHJvcHNDaGlsZCh1cGRhdGVkUGF0aCwgc3RyUGF0aCk7XG4gICAgICAgIGlmIChkZXNjZW5kYW50KSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c0hhc2ggPSBwYXRoT3Ioe30sIFt1cGRhdGVkUGF0aF0sIHByZXZpb3VzSGFzaGVzKTtcbiAgICAgICAgICAgIGNvbWJpbmVkSGFzaCArPSBwYXRoT3IoMCwgWydoYXNoJ10sIHBhdGhIYXNoKTtcbiAgICAgICAgICAgIGlmIChwcmV2aW91c0hhc2ggIT09IHBhdGhIYXNoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRQYXRoICE9PSBzdHJQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY2hhbmdlZFByb3BzLCB7IFtyZW1haW5pbmdTZWdtZW50c1sxXV06IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlclR5cGUgPSAnY29tcG9uZW50cyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGNoYW5nZWRQcm9wcywgcGF0aE9yKHt9LCBbJ2NoYW5nZWRQcm9wcyddLCBwYXRoSGFzaCkpO1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJUeXBlID0gcGF0aE9yKHt9LCBbJ3JlbmRlclR5cGUnXSwgcGF0aEhhc2gpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcmV2aW91c0hhc2hlc1t1cGRhdGVkUGF0aF0gPSBwYXRoSGFzaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIGhhc2g6IGNvbWJpbmVkSGFzaCxcbiAgICAgICAgY2hhbmdlZFByb3BzLFxuICAgICAgICByZW5kZXJUeXBlXG4gICAgfTtcbn1cbmV4cG9ydCBjb25zdCBzZWxlY3REYXNoUHJvcHMgPSAoY29tcG9uZW50UGF0aCkgPT4gKHN0YXRlKSA9PiB7XG4gICAgY29uc3QgYyA9IGdldENvbXBvbmVudExheW91dChjb21wb25lbnRQYXRoLCBzdGF0ZSk7XG4gICAgLy8gTGF5b3V0IGhhc2hlcyByZWNvcmRzIHRoZSBudW1iZXIgb2YgdGltZXMgYSBwYXRoIGhhcyBiZWVuIHVwZGF0ZWQuXG4gICAgLy8gc3VtIHdpdGggdGhlIHBhcmVudHMgaGFzaCAobWF0Y2ggd2l0aG91dCB0aGUgbGFzdCAnXScpIHRvIGdldCB0aGUgcmVhbCBoYXNoXG4gICAgLy8gVGhlbiBpdCBjYW4gYmUgZWFzaWx5IGNvbXBhcmVkIHdpdGhvdXQgaGF2aW5nIHRvIGNvbXBhcmUgdGhlIHByb3BzLlxuICAgIGNvbnN0IHN0clBhdGggPSBzdHJpbmdpZnlQYXRoKGNvbXBvbmVudFBhdGgpO1xuICAgIGxldCBoYXNoO1xuICAgIGlmIChjaGVja0Rhc2hDaGlsZHJlblVwZGF0ZShjKSkge1xuICAgICAgICBoYXNoID0gZGV0ZXJtaW5lQ2hhbmdlZFByb3BzKHN0YXRlLCBzdHJQYXRoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGhhc2ggPSBzdGF0ZS5sYXlvdXRIYXNoZXNbc3RyUGF0aF07XG4gICAgfVxuICAgIGxldCBoID0gMDtcbiAgICBsZXQgY2hhbmdlZFByb3BzID0ge307XG4gICAgbGV0IHJlbmRlclR5cGUgPSAnJztcbiAgICBpZiAoaGFzaCkge1xuICAgICAgICBoID0gaGFzaFsnaGFzaCddO1xuICAgICAgICBjaGFuZ2VkUHJvcHMgPSBoYXNoWydjaGFuZ2VkUHJvcHMnXTtcbiAgICAgICAgcmVuZGVyVHlwZSA9IGhhc2hbJ3JlbmRlclR5cGUnXTtcbiAgICB9XG4gICAgcmV0dXJuIFtjLCBjPy5wcm9wcywgaCwgY2hhbmdlZFByb3BzLCByZW5kZXJUeXBlXTtcbn07XG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0RGFzaFByb3BzRXF1YWxpdHlGbihbXywgX18sIGhhc2hdLCBbX19fLCBfX19fLCBwcmV2aW91c0hhc2hdKSB7XG4gICAgLy8gT25seSBuZWVkIHRvIGNvbXBhcmUgdGhlIGhhc2ggYXMgYW55IGNoYW5nZSBpcyBzdW1tZWQgdXBcbiAgICByZXR1cm4gaGFzaCA9PT0gcHJldmlvdXNIYXNoO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdENvbmZpZyhzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5jb25maWc7XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgbWVyZ2VSaWdodCwgcGF0aCwgdHlwZSwgaGFzLCBqb2luLCBwYXRoT3IgfSBmcm9tICdyYW1kYSc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRWxlbWVudChlbGVtZW50LCBwcm9wcywgZXh0cmFQcm9wcywgY2hpbGRyZW4pIHtcbiAgICBjb25zdCBhbGxQcm9wcyA9IG1lcmdlUmlnaHQocHJvcHMsIGV4dHJhUHJvcHMpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChlbGVtZW50LCBhbGxQcm9wcywgLi4uY2hpbGRyZW4pO1xuICAgIH1cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChlbGVtZW50LCBhbGxQcm9wcywgY2hpbGRyZW4pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRHJ5Q29tcG9uZW50KG9iaikge1xuICAgIHJldHVybiAodHlwZShvYmopID09PSAnT2JqZWN0JyAmJlxuICAgICAgICBoYXMoJ3R5cGUnLCBvYmopICYmXG4gICAgICAgIGhhcygnbmFtZXNwYWNlJywgb2JqKSAmJlxuICAgICAgICBoYXMoJ3Byb3BzJywgb2JqKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbikge1xuICAgIGlmICh0eXBlKGNvbXBvbmVudERlZmluaXRpb24pID09PSAnQXJyYXknKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNoaWxkcmVuIHByb3BlcnR5IG9mIGEgY29tcG9uZW50IGlzIGEgbGlzdCBvZiBsaXN0cywgaW5zdGVhZCAnICtcbiAgICAgICAgICAgICdvZiBqdXN0IGEgbGlzdC4gVGhpcyBjYW4gc29tZXRpbWVzIGJlIGR1ZSB0byBhIHRyYWlsaW5nIGNvbW1hLiAnICtcbiAgICAgICAgICAgICdDaGVjayB0aGUgY29tcG9uZW50IHRoYXQgaGFzIHRoZSBmb2xsb3dpbmcgY29udGVudHMgJyArXG4gICAgICAgICAgICAnYW5kIHJlbW92ZSBvbmUgb2YgdGhlIGxldmVscyBvZiBuZXN0aW5nOiBcXG4nICtcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNvbXBvbmVudERlZmluaXRpb24sIG51bGwsIDIpKTtcbiAgICB9XG4gICAgaWYgKHR5cGUoY29tcG9uZW50RGVmaW5pdGlvbikgPT09ICdPYmplY3QnICYmXG4gICAgICAgICEoaGFzKCduYW1lc3BhY2UnLCBjb21wb25lbnREZWZpbml0aW9uKSAmJlxuICAgICAgICAgICAgaGFzKCd0eXBlJywgY29tcG9uZW50RGVmaW5pdGlvbikgJiZcbiAgICAgICAgICAgIGhhcygncHJvcHMnLCBjb21wb25lbnREZWZpbml0aW9uKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBvYmplY3Qgd2FzIHByb3ZpZGVkIGFzIGBjaGlsZHJlbmAgaW5zdGVhZCBvZiBhIGNvbXBvbmVudCwgJyArXG4gICAgICAgICAgICAnc3RyaW5nLCBvciBudW1iZXIgKG9yIGxpc3Qgb2YgdGhvc2UpLiAnICtcbiAgICAgICAgICAgICdDaGVjayB0aGUgY2hpbGRyZW4gcHJvcGVydHkgdGhhdCBsb29rcyBzb21ldGhpbmcgbGlrZTpcXG4nICtcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNvbXBvbmVudERlZmluaXRpb24sIG51bGwsIDIpKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5UGF0aChsYXlvdXRQYXRoKSB7XG4gICAgcmV0dXJuIGpvaW4oJywnLCBsYXlvdXRQYXRoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21wb25lbnRMYXlvdXQoY29tcG9uZW50UGF0aCwgc3RhdGUpIHtcbiAgICByZXR1cm4gcGF0aChjb21wb25lbnRQYXRoLCBzdGF0ZS5sYXlvdXQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrUmVuZGVyVHlwZVByb3AoY29tcG9uZW50RGVmaW5pdGlvbikge1xuICAgIHJldHVybiAoJ2Rhc2hSZW5kZXJUeXBlJyBpblxuICAgICAgICBwYXRoT3Ioe30sIFtjb21wb25lbnREZWZpbml0aW9uPy5uYW1lc3BhY2UsIGNvbXBvbmVudERlZmluaXRpb24/LnR5cGVdLCB3aW5kb3cpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0Rhc2hDaGlsZHJlblVwZGF0ZShjb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgcmV0dXJuICgnZGFzaENoaWxkcmVuVXBkYXRlJyBpblxuICAgICAgICBwYXRoT3Ioe30sIFtjb21wb25lbnREZWZpbml0aW9uPy5uYW1lc3BhY2UsIGNvbXBvbmVudERlZmluaXRpb24/LnR5cGVdLCB3aW5kb3cpKTtcbn1cbiIsImltcG9ydCB7YmF0Y2gsIGNvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7aW5jbHVkZXMsIGlzRW1wdHl9IGZyb20gJ3JhbWRhJztcbmltcG9ydCBSZWFjdCwge3VzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IEdsb2JhbEVycm9yQ29udGFpbmVyIGZyb20gJy4vY29tcG9uZW50cy9lcnJvci9HbG9iYWxFcnJvckNvbnRhaW5lci5yZWFjdCc7XG5pbXBvcnQge1xuICAgIGRpc3BhdGNoRXJyb3IsXG4gICAgaHlkcmF0ZUluaXRpYWxPdXRwdXRzLFxuICAgIG9uRXJyb3IsXG4gICAgc2V0R3JhcGhzLFxuICAgIHNldFBhdGhzLFxuICAgIHNldExheW91dFxufSBmcm9tICcuL2FjdGlvbnMnO1xuaW1wb3J0IHtjb21wdXRlUGF0aHN9IGZyb20gJy4vYWN0aW9ucy9wYXRocyc7XG5pbXBvcnQge2NvbXB1dGVHcmFwaHN9IGZyb20gJy4vYWN0aW9ucy9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IGFwaVRodW5rIGZyb20gJy4vYWN0aW9ucy9hcGknO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJy4vYWN0aW9ucy91dGlscyc7XG5pbXBvcnQge2FwcGx5UGVyc2lzdGVuY2V9IGZyb20gJy4vcGVyc2lzdGVuY2UnO1xuaW1wb3J0IHtnZXRBcHBTdGF0ZX0gZnJvbSAnLi9yZWR1Y2Vycy9jb25zdGFudHMnO1xuaW1wb3J0IHtTVEFUVVN9IGZyb20gJy4vY29uc3RhbnRzL2NvbnN0YW50cyc7XG5pbXBvcnQgd2FpdCBmcm9tICcuL3V0aWxzL3dhaXQnO1xuaW1wb3J0IGlzU2ltcGxlQ29tcG9uZW50IGZyb20gJy4vaXNTaW1wbGVDb21wb25lbnQnO1xuaW1wb3J0IERhc2hXcmFwcGVyIGZyb20gJy4vd3JhcHBlci9EYXNoV3JhcHBlcic7XG5cbi8qKlxuICogRmlyZSBvZmYgQVBJIGNhbGxzIGZvciBpbml0aWFsaXphdGlvblxuICogQHBhcmFtIHsqfSBwcm9wcyBwcm9wc1xuICogQHJldHVybnMgeyp9IGNvbXBvbmVudFxuICovXG5jb25zdCBVbmNvbm5lY3RlZENvbnRhaW5lciA9IHByb3BzID0+IHtcbiAgICBjb25zdCB7XG4gICAgICAgIGFwcExpZmVjeWNsZSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBkZXBlbmRlbmNpZXNSZXF1ZXN0LFxuICAgICAgICBlcnJvcixcbiAgICAgICAgbGF5b3V0UmVxdWVzdCxcbiAgICAgICAgbGF5b3V0XG4gICAgfSA9IHByb3BzO1xuXG4gICAgY29uc3QgW2Vycm9yTG9hZGluZywgc2V0RXJyb3JMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICAgIGNvbnN0IGV2ZW50cyA9IHVzZVJlZihudWxsKTtcbiAgICBpZiAoIWV2ZW50cy5jdXJyZW50KSB7XG4gICAgICAgIGV2ZW50cy5jdXJyZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIH1cbiAgICBjb25zdCByZW5kZXJlZFRyZWUgPSB1c2VSZWYoZmFsc2UpO1xuXG4gICAgdXNlRWZmZWN0KHN0b3JlRWZmZWN0LmJpbmQobnVsbCwgcHJvcHMsIGV2ZW50cywgc2V0RXJyb3JMb2FkaW5nKSk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAocmVuZGVyZWRUcmVlLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVuZGVyZWRUcmVlLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB3YWl0KDApO1xuICAgICAgICAgICAgICAgIGV2ZW50cy5jdXJyZW50LmVtaXQoJ3JlbmRlcmVkJyk7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoY29uZmlnLnNlcnZlX2xvY2FsbHkpIHtcbiAgICAgICAgICAgIHdpbmRvdy5fZGFzaFBsb3RseUpTVVJMID0gYCR7Y29uZmlnLnJlcXVlc3RzX3BhdGhuYW1lX3ByZWZpeH1fZGFzaC1jb21wb25lbnQtc3VpdGVzL3Bsb3RseS9wYWNrYWdlX2RhdGEvcGxvdGx5Lm1pbi5qc2A7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3aW5kb3cuX2Rhc2hQbG90bHlKU1VSTCA9IGNvbmZpZy5wbG90bHlqc191cmw7XG4gICAgICAgIH1cbiAgICB9LCBbXSk7XG5cbiAgICBsZXQgY29udGVudDtcbiAgICBpZiAoXG4gICAgICAgIGxheW91dFJlcXVlc3Quc3RhdHVzICYmXG4gICAgICAgICFpbmNsdWRlcyhsYXlvdXRSZXF1ZXN0LnN0YXR1cywgW1NUQVRVUy5PSywgJ2xvYWRpbmcnXSlcbiAgICApIHtcbiAgICAgICAgaWYgKGNvbmZpZy51aSkge1xuICAgICAgICAgICAgY29udGVudCA9IChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBsYXlvdXRSZXF1ZXN0LmNvbnRlbnR9fVxuICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZW50ID0gPGRpdiBjbGFzc05hbWU9J19kYXNoLWVycm9yJz5FcnJvciBsb2FkaW5nIGxheW91dDwvZGl2PjtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGVycm9yTG9hZGluZyB8fFxuICAgICAgICAoZGVwZW5kZW5jaWVzUmVxdWVzdC5zdGF0dXMgJiZcbiAgICAgICAgICAgICFpbmNsdWRlcyhkZXBlbmRlbmNpZXNSZXF1ZXN0LnN0YXR1cywgW1NUQVRVUy5PSywgJ2xvYWRpbmcnXSkpXG4gICAgKSB7XG4gICAgICAgIGlmIChjb25maWcudWkpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSAoXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17e1xuICAgICAgICAgICAgICAgICAgICAgICAgX19odG1sOiBkZXBlbmRlbmNpZXNSZXF1ZXN0LmNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGVudCA9IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtZXJyb3InPkVycm9yIGxvYWRpbmcgZGVwZW5kZW5jaWVzPC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChhcHBMaWZlY3ljbGUgPT09IGdldEFwcFN0YXRlKCdIWURSQVRFRCcpKSB7XG4gICAgICAgIHJlbmRlcmVkVHJlZS5jdXJyZW50ID0gdHJ1ZTtcblxuICAgICAgICBjb250ZW50ID0gKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICB7QXJyYXkuaXNBcnJheShsYXlvdXQuY29tcG9uZW50cykgPyAoXG4gICAgICAgICAgICAgICAgICAgIGxheW91dC5jb21wb25lbnRzLm1hcCgoYywgaSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2ltcGxlQ29tcG9uZW50KGMpID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNcbiAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPERhc2hXcmFwcGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYXNocHJpdmF0ZV9lcnJvcj17ZXJyb3J9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFBhdGg9e1snY29tcG9uZW50cycsIGldfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2l9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgIDxEYXNoV3JhcHBlclxuICAgICAgICAgICAgICAgICAgICAgICAgX2Rhc2hwcml2YXRlX2Vycm9yPXtlcnJvcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFBhdGg9e1snY29tcG9uZW50cyddfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZW50ID0gPGRpdiBjbGFzc05hbWU9J19kYXNoLWxvYWRpbmcnPkxvYWRpbmcuLi48L2Rpdj47XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZyAmJiBjb25maWcudWkgPT09IHRydWUgPyAoXG4gICAgICAgIDxHbG9iYWxFcnJvckNvbnRhaW5lcj57Y29udGVudH08L0dsb2JhbEVycm9yQ29udGFpbmVyPlxuICAgICkgOiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICApO1xufTtcblxuZnVuY3Rpb24gc3RvcmVFZmZlY3QocHJvcHMsIGV2ZW50cywgc2V0RXJyb3JMb2FkaW5nKSB7XG4gICAgY29uc3Qge1xuICAgICAgICBhcHBMaWZlY3ljbGUsXG4gICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3QsXG4gICAgICAgIGRpc3BhdGNoLFxuICAgICAgICBlcnJvcixcbiAgICAgICAgZ3JhcGhzLFxuICAgICAgICBob29rcyxcbiAgICAgICAgbGF5b3V0LFxuICAgICAgICBsYXlvdXRSZXF1ZXN0LFxuICAgICAgICBjb25maWdcbiAgICB9ID0gcHJvcHM7XG5cbiAgICBiYXRjaCgoKSA9PiB7XG4gICAgICAgIGlmIChpc0VtcHR5KGxheW91dFJlcXVlc3QpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhvb2tzLmxheW91dF9wcmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBob29rcy5sYXlvdXRfcHJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNwYXRjaChhcGlUaHVuaygnX2Rhc2gtbGF5b3V0JywgJ0dFVCcsICdsYXlvdXRSZXF1ZXN0JykpO1xuICAgICAgICB9IGVsc2UgaWYgKGxheW91dFJlcXVlc3Quc3RhdHVzID09PSBTVEFUVVMuT0spIHtcbiAgICAgICAgICAgIGlmIChpc0VtcHR5KGxheW91dC5jb21wb25lbnRzKSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaG9va3MubGF5b3V0X3Bvc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9va3MubGF5b3V0X3Bvc3QobGF5b3V0UmVxdWVzdC5jb250ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZmluYWxMYXlvdXQgPSBhcHBseVBlcnNpc3RlbmNlKFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXRSZXF1ZXN0LmNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgICAgICAgc2V0UGF0aHMoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlUGF0aHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxMYXlvdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydjb21wb25lbnRzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMuY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChzZXRMYXlvdXQoZmluYWxMYXlvdXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0VtcHR5KGRlcGVuZGVuY2llc1JlcXVlc3QpKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgICBhcGlUaHVuaygnX2Rhc2gtZGVwZW5kZW5jaWVzJywgJ0dFVCcsICdkZXBlbmRlbmNpZXNSZXF1ZXN0JylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXNSZXF1ZXN0LnN0YXR1cyA9PT0gU1RBVFVTLk9LICYmXG4gICAgICAgICAgICAoaXNFbXB0eShncmFwaHMpIHx8IGdyYXBocy5yZXNldClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgICBzZXRHcmFwaHMoXG4gICAgICAgICAgICAgICAgICAgIGNvbXB1dGVHcmFwaHMoXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXNSZXF1ZXN0LmNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKGRpc3BhdGNoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIGRlcGVuZGVuY2llc1JlcXVlc3QgYW5kIGl0cyBjb21wdXRlZCBzdG9yZXNcbiAgICAgICAgICAgIGRlcGVuZGVuY2llc1JlcXVlc3Quc3RhdHVzID09PSBTVEFUVVMuT0sgJiZcbiAgICAgICAgICAgICFpc0VtcHR5KGdyYXBocykgJiZcbiAgICAgICAgICAgIC8vIExheW91dFJlcXVlc3QgYW5kIGl0cyBjb21wdXRlZCBzdG9yZXNcbiAgICAgICAgICAgIGxheW91dFJlcXVlc3Quc3RhdHVzID09PSBTVEFUVVMuT0sgJiZcbiAgICAgICAgICAgICFpc0VtcHR5KGxheW91dC5jb21wb25lbnRzKSAmJlxuICAgICAgICAgICAgLy8gSGFzbid0IGFscmVhZHkgaHlkcmF0ZWRcbiAgICAgICAgICAgIGFwcExpZmVjeWNsZSA9PT0gZ2V0QXBwU3RhdGUoJ1NUQVJURUQnKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCBoYXNFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChoeWRyYXRlSW5pdGlhbE91dHB1dHMoZGlzcGF0Y2hFcnJvcihkaXNwYXRjaCkpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIC8vIERpc3BsYXkgdGhpcyBlcnJvciBpbiBkZXZ0b29scywgdW5sZXNzIHdlIGhhdmUgZXJyb3JzXG4gICAgICAgICAgICAgICAgLy8gYWxyZWFkeSwgaW4gd2hpY2ggY2FzZSB3ZSBhc3N1bWUgdGhpcyBuZXcgb25lIGlzIG1vb3RcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yLmZyb250RW5kLmxlbmd0aCAmJiAhZXJyb3IuYmFja0VuZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gob25FcnJvcih7dHlwZTogJ2JhY2tFbmQnLCBlcnJvcjogZXJyfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNldEVycm9yTG9hZGluZyhoYXNFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuVW5jb25uZWN0ZWRDb250YWluZXIucHJvcFR5cGVzID0ge1xuICAgIGFwcExpZmVjeWNsZTogUHJvcFR5cGVzLm9uZU9mKFtcbiAgICAgICAgZ2V0QXBwU3RhdGUoJ1NUQVJURUQnKSxcbiAgICAgICAgZ2V0QXBwU3RhdGUoJ0hZRFJBVEVEJyksXG4gICAgICAgIGdldEFwcFN0YXRlKCdERVNUUk9ZRUQnKVxuICAgIF0pLFxuICAgIGRpc3BhdGNoOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBkZXBlbmRlbmNpZXNSZXF1ZXN0OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGdyYXBoczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBob29rczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBsYXlvdXRSZXF1ZXN0OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGxheW91dDogUHJvcFR5cGVzLmFueSxcbiAgICBoaXN0b3J5OiBQcm9wVHlwZXMuYW55LFxuICAgIGVycm9yOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGNvbmZpZzogUHJvcFR5cGVzLm9iamVjdFxufTtcblxuY29uc3QgQ29udGFpbmVyID0gY29ubmVjdChcbiAgICAvLyBtYXAgc3RhdGUgdG8gcHJvcHNcbiAgICBzdGF0ZSA9PiAoe1xuICAgICAgICBhcHBMaWZlY3ljbGU6IHN0YXRlLmFwcExpZmVjeWNsZSxcbiAgICAgICAgZGVwZW5kZW5jaWVzUmVxdWVzdDogc3RhdGUuZGVwZW5kZW5jaWVzUmVxdWVzdCxcbiAgICAgICAgaG9va3M6IHN0YXRlLmhvb2tzLFxuICAgICAgICBsYXlvdXRSZXF1ZXN0OiBzdGF0ZS5sYXlvdXRSZXF1ZXN0LFxuICAgICAgICBsYXlvdXQ6IHN0YXRlLmxheW91dCxcbiAgICAgICAgZ3JhcGhzOiBzdGF0ZS5ncmFwaHMsXG4gICAgICAgIGhpc3Rvcnk6IHN0YXRlLmhpc3RvcnksXG4gICAgICAgIGVycm9yOiBzdGF0ZS5lcnJvcixcbiAgICAgICAgY29uZmlnOiBzdGF0ZS5jb25maWdcbiAgICB9KSxcbiAgICBkaXNwYXRjaCA9PiAoe2Rpc3BhdGNofSlcbikoVW5jb25uZWN0ZWRDb250YWluZXIpO1xuXG5leHBvcnQgZGVmYXVsdCBDb250YWluZXI7XG4iLCJpbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IEFQSUNvbnRyb2xsZXIgZnJvbSAnLi9BUElDb250cm9sbGVyLnJlYWN0JztcbmltcG9ydCBMb2FkaW5nIGZyb20gJy4vY29tcG9uZW50cy9jb3JlL0xvYWRpbmcucmVhY3QnO1xuaW1wb3J0IFRvb2xiYXIgZnJvbSAnLi9jb21wb25lbnRzL2NvcmUvVG9vbGJhci5yZWFjdCc7XG5pbXBvcnQgUmVsb2FkZXIgZnJvbSAnLi9jb21wb25lbnRzL2NvcmUvUmVsb2FkZXIucmVhY3QnO1xuaW1wb3J0IGdldENvbmZpZ0Zyb21ET00gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHtzZXRIb29rcywgc2V0Q29uZmlnfSBmcm9tICcuL2FjdGlvbnMvaW5kZXgnO1xuaW1wb3J0IHt0eXBlLCBtZW1vaXplV2l0aCwgaWRlbnRpdHl9IGZyb20gJ3JhbWRhJztcblxuY2xhc3MgVW5jb25uZWN0ZWRBcHBDb250YWluZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcHJvcHMuaG9va3MubGF5b3V0X3ByZSAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgcHJvcHMuaG9va3MubGF5b3V0X3Bvc3QgIT09IG51bGwgfHxcbiAgICAgICAgICAgIHByb3BzLmhvb2tzLnJlcXVlc3RfcHJlICE9PSBudWxsIHx8XG4gICAgICAgICAgICBwcm9wcy5ob29rcy5yZXF1ZXN0X3Bvc3QgIT09IG51bGwgfHxcbiAgICAgICAgICAgIHByb3BzLmhvb2tzLmNhbGxiYWNrX3Jlc29sdmVkICE9PSBudWxsIHx8XG4gICAgICAgICAgICBwcm9wcy5ob29rcy5yZXF1ZXN0X3JlZnJlc2hfand0ICE9PSBudWxsXG4gICAgICAgICkge1xuICAgICAgICAgICAgbGV0IGhvb2tzID0gcHJvcHMuaG9va3M7XG5cbiAgICAgICAgICAgIGlmIChob29rcy5yZXF1ZXN0X3JlZnJlc2hfand0KSB7XG4gICAgICAgICAgICAgICAgaG9va3MgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmhvb2tzLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JlZnJlc2hfand0OiBtZW1vaXplV2l0aChcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgaG9va3MucmVxdWVzdF9yZWZyZXNoX2p3dFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJvcHMuZGlzcGF0Y2goc2V0SG9va3MoaG9va3MpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSB7XG4gICAgICAgIGNvbnN0IHtkaXNwYXRjaH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWdGcm9tRE9NKCk7XG5cbiAgICAgICAgLy8gcHJlc2V0IGNvbW1vbiByZXF1ZXN0IHBhcmFtcyBpbiB0aGUgY29uZmlnXG4gICAgICAgIGNvbmZpZy5mZXRjaCA9IHtcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBkaXNwYXRjaChzZXRDb25maWcoY29uZmlnKSk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB7Y29uZmlnfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGlmICh0eXBlKGNvbmZpZykgPT09ICdOdWxsJykge1xuICAgICAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC1sb2FkaW5nJz5Mb2FkaW5nLi4uPC9kaXY+O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHtzaG93X3VuZG9fcmVkb30gPSBjb25maWc7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAge3Nob3dfdW5kb19yZWRvID8gPFRvb2xiYXIgLz4gOiBudWxsfVxuICAgICAgICAgICAgICAgIDxBUElDb250cm9sbGVyIC8+XG4gICAgICAgICAgICAgICAgPExvYWRpbmcgLz5cbiAgICAgICAgICAgICAgICA8UmVsb2FkZXIgLz5cbiAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5VbmNvbm5lY3RlZEFwcENvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gICAgaG9va3M6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZGlzcGF0Y2g6IFByb3BUeXBlcy5mdW5jLFxuICAgIGNvbmZpZzogUHJvcFR5cGVzLm9iamVjdFxufTtcblxuY29uc3QgQXBwQ29udGFpbmVyID0gY29ubmVjdChcbiAgICBzdGF0ZSA9PiAoe1xuICAgICAgICBoaXN0b3J5OiBzdGF0ZS5oaXN0b3J5LFxuICAgICAgICBjb25maWc6IHN0YXRlLmNvbmZpZ1xuICAgIH0pLFxuICAgIGRpc3BhdGNoID0+ICh7ZGlzcGF0Y2h9KVxuKShVbmNvbm5lY3RlZEFwcENvbnRhaW5lcik7XG5cbmV4cG9ydCBkZWZhdWx0IEFwcENvbnRhaW5lcjtcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcblxuaW1wb3J0IEFwcFByb3ZpZGVyIGZyb20gJy4vQXBwUHJvdmlkZXIucmVhY3QnO1xuXG5pbXBvcnQgJy4vZGFzaEFwaSc7XG5cbmNsYXNzIERhc2hSZW5kZXJlciB7XG4gICAgY29uc3RydWN0b3IoaG9va3MpIHtcbiAgICAgICAgLy8gcmVuZGVyIERhc2ggUmVuZGVyZXIgdXBvbiBpbml0aWFsaXNpbmchXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWFjdC1lbnRyeS1wb2ludCcpO1xuXG4gICAgICAgIGlmIChSZWFjdERPTS5jcmVhdGVSb290KSB7XG4gICAgICAgICAgICBjb25zdCByb290ID0gUmVhY3RET00uY3JlYXRlUm9vdChjb250YWluZXIpO1xuICAgICAgICAgICAgcm9vdC5yZW5kZXIoPEFwcFByb3ZpZGVyIGhvb2tzPXtob29rc30gLz4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgUmVhY3RET00ucmVuZGVyKDxBcHBQcm92aWRlciBob29rcz17aG9va3N9IC8+LCBjb250YWluZXIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQge0Rhc2hSZW5kZXJlcn07XG4iLCJpbXBvcnQge21lcmdlRGVlcFJpZ2h0LCBvbmNlfSBmcm9tICdyYW1kYSc7XG5pbXBvcnQge2dldENTUkZIZWFkZXIsIGhhbmRsZUFzeW5jRXJyb3IsIGFkZEh0dHBIZWFkZXJzfSBmcm9tICcuLi9hY3Rpb25zJztcbmltcG9ydCB7dXJsQmFzZX0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge01BWF9BVVRIX1JFVFJJRVN9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7SldUX0VYUElSRURfTUVTU0FHRSwgU1RBVFVTfSBmcm9tICcuLi9jb25zdGFudHMvY29uc3RhbnRzJztcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUgKi9cbmNvbnN0IGxvZ1dhcm5pbmdPbmNlID0gb25jZShjb25zb2xlLndhcm4pO1xuXG5mdW5jdGlvbiBHRVQocGF0aCwgZmV0Y2hDb25maWcsIF9ib2R5LCBjb25maWcpIHtcbiAgICByZXR1cm4gZmV0Y2goXG4gICAgICAgIHBhdGgsXG4gICAgICAgIG1lcmdlRGVlcFJpZ2h0KGZldGNoQ29uZmlnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgaGVhZGVyczogZ2V0Q1NSRkhlYWRlcihjb25maWcpXG4gICAgICAgIH0pXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gUE9TVChwYXRoLCBmZXRjaENvbmZpZywgYm9keSA9IHt9LCBjb25maWcpIHtcbiAgICByZXR1cm4gZmV0Y2goXG4gICAgICAgIHBhdGgsXG4gICAgICAgIG1lcmdlRGVlcFJpZ2h0KGZldGNoQ29uZmlnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IGdldENTUkZIZWFkZXIoY29uZmlnKSxcbiAgICAgICAgICAgIGJvZHk6IGJvZHkgPyBKU09OLnN0cmluZ2lmeShib2R5KSA6IG51bGxcbiAgICAgICAgfSlcbiAgICApO1xufVxuXG5jb25zdCByZXF1ZXN0ID0ge0dFVCwgUE9TVH07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFwaVRodW5rKGVuZHBvaW50LCBtZXRob2QsIHN0b3JlLCBpZCwgYm9keSkge1xuICAgIHJldHVybiBhc3luYyAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgICAgIGxldCB7Y29uZmlnLCBob29rc30gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBsZXQgbmV3SGVhZGVycyA9IG51bGw7XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7dXJsQmFzZShjb25maWcpfSR7ZW5kcG9pbnR9YDtcblxuICAgICAgICBmdW5jdGlvbiBzZXRDb25uZWN0aW9uU3RhdHVzKGNvbm5lY3RlZCkge1xuICAgICAgICAgICAgaWYgKGdldFN0YXRlKCkuZXJyb3IuYmFja0VuZENvbm5lY3RlZCAhPT0gY29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU0VUX0NPTk5FQ1RJT05fU1RBVFVTJyxcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogY29ubmVjdGVkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiBzdG9yZSxcbiAgICAgICAgICAgIHBheWxvYWQ6IHtpZCwgc3RhdHVzOiAnbG9hZGluZyd9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmVzO1xuICAgICAgICAgICAgZm9yIChsZXQgcmV0cnkgPSAwOyByZXRyeSA8PSBNQVhfQVVUSF9SRVRSSUVTOyByZXRyeSsrKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gYXdhaXQgcmVxdWVzdFttZXRob2RdKFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZldGNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZmV0Y2ggcmVqZWN0aW9uIC0gdGhpcyBtZWFucyB0aGUgcmVxdWVzdCBkaWRuJ3QgcmV0dXJuLFxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBnZXQgaGVyZSBmcm9tIDQwMC81MDAgZXJyb3JzLCBvbmx5IG5ldHdvcmtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3JzIG9yIHVucmVzcG9uc2l2ZSBzZXJ2ZXJzLlxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZmV0Y2ggZXJyb3InLCByZXMpO1xuICAgICAgICAgICAgICAgICAgICBzZXRDb25uZWN0aW9uU3RhdHVzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcmVzLnN0YXR1cyA9PT0gU1RBVFVTLlVOQVVUSE9SSVpFRCB8fFxuICAgICAgICAgICAgICAgICAgICByZXMuc3RhdHVzID09PSBTVEFUVVMuQkFEX1JFUVVFU1RcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhvb2tzLnJlcXVlc3RfcmVmcmVzaF9qd3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHkuaW5jbHVkZXMoSldUX0VYUElSRURfTUVTU0FHRSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdKd3QgPSBhd2FpdCBob29rcy5yZXF1ZXN0X3JlZnJlc2hfand0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZmV0Y2guaGVhZGVycy5BdXRob3JpemF0aW9uLnN1YnN0cihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCZWFyZXIgJy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0p3dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWFkZXJzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke25ld0p3dH1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gbWVyZ2VEZWVwUmlnaHQoY29uZmlnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IG5ld0hlYWRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG5cbiAgICAgICAgICAgIGlmIChuZXdIZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goYWRkSHR0cEhlYWRlcnMobmV3SGVhZGVycykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0Q29ubmVjdGlvblN0YXR1cyh0cnVlKTtcbiAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSAmJiBjb250ZW50VHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi9qc29uJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKCkudGhlbihqc29uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogc3RvcmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXMuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGpzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqc29uO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgICAgICBsb2dXYXJuaW5nT25jZShcbiAgICAgICAgICAgICAgICAnUmVzcG9uc2UgaXMgbWlzc2luZyBoZWFkZXI6IGNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IHN0b3JlLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnRXJyb3IgZnJvbSBBUEkgY2FsbDogJyArIGVuZHBvaW50O1xuICAgICAgICAgICAgaGFuZGxlQXN5bmNFcnJvcihlcnIsIG1lc3NhZ2UsIGRpc3BhdGNoKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCJjb25zdCBhY3Rpb25MaXN0ID0ge1xuICAgIE9OX1BST1BfQ0hBTkdFOiAxLFxuICAgIFNFVF9SRVFVRVNUX1FVRVVFOiAxLFxuICAgIFNFVF9HUkFQSFM6IDEsXG4gICAgU0VUX1BBVEhTOiAxLFxuICAgIFNFVF9MQVlPVVQ6IDEsXG4gICAgU0VUX0FQUF9MSUZFQ1lDTEU6IDEsXG4gICAgU0VUX0NPTkZJRzogMSxcbiAgICBBRERfSFRUUF9IRUFERVJTOiAxLFxuICAgIE9OX0VSUk9SOiAxLFxuICAgIFNFVF9IT09LUzogMSxcbiAgICBJTlNFUlRfQ09NUE9ORU5UOiAxLFxuICAgIFJFTU9WRV9DT01QT05FTlQ6IDEsXG4gICAgUkVTRVRfQ09NUE9ORU5UX1NUQVRFOiAxXG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QWN0aW9uID0gYWN0aW9uID0+IHtcbiAgICBpZiAoYWN0aW9uTGlzdFthY3Rpb25dKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb247XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgJHthY3Rpb259IGlzIG5vdCBkZWZpbmVkLmApO1xufTtcblxuZXhwb3J0IGNvbnN0IE1BWF9BVVRIX1JFVFJJRVMgPSAxO1xuIiwiaW1wb3J0IHtEZXBHcmFwaH0gZnJvbSAnZGVwZW5kZW5jeS1ncmFwaCc7XG5pbXBvcnQgaXNOdW1lcmljIGZyb20gJ2Zhc3QtaXNudW1lcmljJztcbmltcG9ydCB7XG4gICAgYWxsLFxuICAgIGFueSxcbiAgICBhcCxcbiAgICBhc3NvYyxcbiAgICBjb25jYXQsXG4gICAgZGlmZmVyZW5jZSxcbiAgICBlcXVhbHMsXG4gICAgZXZvbHZlLFxuICAgIGZpbmRJbmRleCxcbiAgICBmbGF0dGVuLFxuICAgIGZvckVhY2hPYmpJbmRleGVkLFxuICAgIGluY2x1ZGVzLFxuICAgIGludGVyc2VjdGlvbixcbiAgICBpc0VtcHR5LFxuICAgIGtleXMsXG4gICAgbWFwLFxuICAgIG1lcmdlUmlnaHQsXG4gICAgcGF0aCxcbiAgICBwbHVjayxcbiAgICBwcm9wcyxcbiAgICBzdGFydHNXaXRoLFxuICAgIHZhbHVlcyxcbiAgICB6aXAsXG4gICAgemlwT2JqXG59IGZyb20gJ3JhbWRhJztcblxuaW1wb3J0IHtcbiAgICBjb21iaW5lSWRBbmRQcm9wLFxuICAgIGdldENhbGxiYWNrc0J5SW5wdXQsXG4gICAgZ2V0UHJpb3JpdHksXG4gICAgSU5ESVJFQ1QsXG4gICAgbWVyZ2VNYXgsXG4gICAgbWFrZVJlc29sdmVkQ2FsbGJhY2ssXG4gICAgcmVzb2x2ZURlcHNcbn0gZnJvbSAnLi9kZXBlbmRlbmNpZXNfdHMnO1xuaW1wb3J0IHtjb21wdXRlUGF0aHMsIGdldFBhdGh9IGZyb20gJy4vcGF0aHMnO1xuXG5pbXBvcnQge2NyYXdsTGF5b3V0fSBmcm9tICcuL3V0aWxzJztcblxuaW1wb3J0IFJlZ2lzdHJ5IGZyb20gJy4uL3JlZ2lzdHJ5JztcblxuLypcbiAqIElmIHRoaXMgdXBkYXRlIGlzIGZvciBtdWx0aXBsZSBvdXRwdXRzLCB0aGVuIGl0IGhhc1xuICogc3RhcnRpbmcgJiB0cmFpbGluZyBgLi5gIGFuZCBlYWNoIHByb3BJZCBwYWlyIGlzIHNlcGFyYXRlZFxuICogYnkgYC4uLmAsIGUuZy5cbiAqIFwiLi5vdXRwdXQtMS52YWx1ZS4uLm91dHB1dC0yLnZhbHVlLi4ub3V0cHV0LTMudmFsdWUuLi5vdXRwdXQtNC52YWx1ZS4uXCJcbiAqL1xuZXhwb3J0IGNvbnN0IGlzTXVsdGlPdXRwdXRQcm9wID0gaWRBbmRQcm9wID0+IGlkQW5kUHJvcC5zdGFydHNXaXRoKCcuLicpO1xuXG5jb25zdCBBTEwgPSB7d2lsZDogJ0FMTCcsIG11bHRpOiAxfTtcbmNvbnN0IE1BVENIID0ge3dpbGQ6ICdNQVRDSCd9O1xuY29uc3QgQUxMU01BTExFUiA9IHt3aWxkOiAnQUxMU01BTExFUicsIG11bHRpOiAxLCBleHBhbmQ6IDF9O1xuY29uc3Qgd2lsZGNhcmRzID0ge0FMTCwgTUFUQ0gsIEFMTFNNQUxMRVJ9O1xuY29uc3QgYWxsb3dlZFdpbGRjYXJkcyA9IHtcbiAgICBPdXRwdXQ6IHtBTEwsIE1BVENIfSxcbiAgICBJbnB1dDogd2lsZGNhcmRzLFxuICAgIFN0YXRlOiB3aWxkY2FyZHNcbn07XG5jb25zdCB3aWxkY2FyZFZhbFR5cGVzID0gWydzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nXTtcblxuY29uc3QgaWRJbnZhbGlkQ2hhcnMgPSBbJy4nLCAneyddO1xuXG4vKlxuICogSWYgdGhpcyBJRCBpcyBhIHdpbGRjYXJkLCBpdCBpcyBhIHN0cmluZ2lmaWVkIEpTT04gb2JqZWN0XG4gKiB0aGUgXCJ7XCIgY2hhcmFjdGVyIGlzIGRpc2FsbG93ZWQgZnJvbSByZWd1bGFyIHN0cmluZyBJRHNcbiAqL1xuY29uc3QgaXNXaWxkY2FyZElkID0gaWRTdHIgPT4gaWRTdHIuc3RhcnRzV2l0aCgneycpO1xuXG4vKlxuICogVHVybiBzdHJpbmdpZmllZCB3aWxkY2FyZCBJRHMgaW50byBvYmplY3RzLlxuICogV2lsZGNhcmRzIGFyZSBlbmNvZGVkIGFzIHNpbmdsZS1pdGVtIGFycmF5cyBjb250YWluaW5nIHRoZSB3aWxkY2FyZCBuYW1lXG4gKiBhcyBhIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VXaWxkY2FyZElkKGlkU3RyKSB7XG4gICAgcmV0dXJuIG1hcChcbiAgICAgICAgdmFsID0+IChBcnJheS5pc0FycmF5KHZhbCkgJiYgd2lsZGNhcmRzW3ZhbFswXV0pIHx8IHZhbCxcbiAgICAgICAgSlNPTi5wYXJzZShpZFN0cilcbiAgICApO1xufVxuXG4vKlxuICogSWYgdGhpcyB1cGRhdGUgaXMgZm9yIG11bHRpcGxlIG91dHB1dHMsIHRoZW4gaXQgaGFzXG4gKiBzdGFydGluZyAmIHRyYWlsaW5nIGAuLmAgYW5kIGVhY2ggcHJvcElkIHBhaXIgaXMgc2VwYXJhdGVkXG4gKiBieSBgLi4uYCwgZS5nLlxuICogXCIuLm91dHB1dC0xLnZhbHVlLi4ub3V0cHV0LTIudmFsdWUuLi5vdXRwdXQtMy52YWx1ZS4uLm91dHB1dC00LnZhbHVlLi5cIlxuICovXG5mdW5jdGlvbiBwYXJzZU11bHRpcGxlT3V0cHV0cyhvdXRwdXRJZEFuZFByb3ApIHtcbiAgICByZXR1cm4gb3V0cHV0SWRBbmRQcm9wLnN1YnN0cigyLCBvdXRwdXRJZEFuZFByb3AubGVuZ3RoIC0gNCkuc3BsaXQoJy4uLicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRJZEFuZFByb3AoaWRBbmRQcm9wKSB7XG4gICAgLy8gc2luY2Ugd2lsZGNhcmQgaWRzIGNhbiBoYXZlIC4gaW4gdGhlbSBidXQgcHJvcHMgY2FuJ3QsXG4gICAgLy8gbG9vayBmb3IgdGhlIGxhc3QgLiBpbiB0aGUgc3RyaW5nIGFuZCBzcGxpdCB0aGVyZVxuICAgIGNvbnN0IGRvdFBvcyA9IGlkQW5kUHJvcC5sYXN0SW5kZXhPZignLicpO1xuICAgIGNvbnN0IGlkU3RyID0gaWRBbmRQcm9wLnN1YnN0cigwLCBkb3RQb3MpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBwYXJzZUlmV2lsZGNhcmQoaWRTdHIpLFxuICAgICAgICBwcm9wZXJ0eTogaWRBbmRQcm9wLnN1YnN0cihkb3RQb3MgKyAxKVxuICAgIH07XG59XG5cbi8qXG4gKiBDaGVjayBpZiB0aGlzIElEIGlzIGEgc3RyaW5naWZpZWQgb2JqZWN0LCBhbmQgaWYgc28gcGFyc2UgaXQgdG8gdGhhdCBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSWZXaWxkY2FyZChpZFN0cikge1xuICAgIHJldHVybiBpc1dpbGRjYXJkSWQoaWRTdHIpID8gcGFyc2VXaWxkY2FyZElkKGlkU3RyKSA6IGlkU3RyO1xufVxuXG4vKlxuICogSlNPTi5zdHJpbmdpZnkgLSBmb3IgdGhlIG9iamVjdCBmb3JtIC0gYnV0IGVuc3VyaW5nIGtleXMgYXJlIHNvcnRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5SWQoaWQpIHtcbiAgICBpZiAodHlwZW9mIGlkICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICAgIGNvbnN0IHN0cmluZ2lmeVZhbCA9IHYgPT4gKHYgJiYgdi53aWxkKSB8fCBKU09OLnN0cmluZ2lmeSh2KTtcbiAgICBjb25zdCBwYXJ0cyA9IE9iamVjdC5rZXlzKGlkKVxuICAgICAgICAuc29ydCgpXG4gICAgICAgIC5tYXAoayA9PiBKU09OLnN0cmluZ2lmeShrKSArICc6JyArIHN0cmluZ2lmeVZhbChpZFtrXSkpO1xuICAgIHJldHVybiAneycgKyBwYXJ0cy5qb2luKCcsJykgKyAnfSc7XG59XG5cbi8qXG4gKiBpZCBkaWN0IHZhbHVlcyBjYW4gYmUgbnVtYmVycywgc3RyaW5ncywgYW5kIGJvb2xlYW5zLlxuICogV2UgbmVlZCBhIGRlZmluaXRlIG9yZGVyaW5nIHRoYXQgd2lsbCB3b3JrIGFjcm9zcyB0eXBlcyxcbiAqIGV2ZW4gaWYgc2FuZSB1c2VycyB3b3VsZCBub3QgbWl4IHR5cGVzLlxuICogLSBudW1lcmljIHN0cmluZ3MgYXJlIHRyZWF0ZWQgYXMgbnVtYmVyc1xuICogLSBib29sZWFucyBjb21lIGFmdGVyIG51bWJlcnMsIGJlZm9yZSBzdHJpbmdzLiBmYWxzZSwgdGhlbiB0cnVlLlxuICogLSBub24tbnVtZXJpYyBzdHJpbmdzIGNvbWUgbGFzdFxuICovXG5mdW5jdGlvbiBpZFZhbFNvcnQoYSwgYikge1xuICAgIGNvbnN0IGJJc051bWVyaWMgPSBpc051bWVyaWMoYik7XG4gICAgaWYgKGlzTnVtZXJpYyhhKSkge1xuICAgICAgICBpZiAoYklzTnVtZXJpYykge1xuICAgICAgICAgICAgY29uc3QgYU4gPSBOdW1iZXIoYSk7XG4gICAgICAgICAgICBjb25zdCBiTiA9IE51bWJlcihiKTtcbiAgICAgICAgICAgIHJldHVybiBhTiA+IGJOID8gMSA6IGFOIDwgYk4gPyAtMSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBpZiAoYklzTnVtZXJpYykge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgY29uc3QgYUlzQm9vbCA9IHR5cGVvZiBhID09PSAnYm9vbGVhbic7XG4gICAgaWYgKGFJc0Jvb2wgIT09ICh0eXBlb2YgYiA9PT0gJ2Jvb2xlYW4nKSkge1xuICAgICAgICByZXR1cm4gYUlzQm9vbCA/IC0xIDogMTtcbiAgICB9XG4gICAgcmV0dXJuIGEgPiBiID8gMSA6IGEgPCBiID8gLTEgOiAwO1xufVxuXG4vKlxuICogUHJvdmlkZSBhIHZhbHVlIGtub3duIHRvIGJlIGJlZm9yZSBvciBhZnRlciB2LCBhY2NvcmRpbmcgdG8gaWRWYWxTb3J0XG4gKi9cbmNvbnN0IHZhbEJlZm9yZSA9IHYgPT4gKGlzTnVtZXJpYyh2KSA/IHYgLSAxIDogMCk7XG5jb25zdCB2YWxBZnRlciA9IHYgPT4gKHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IHYgKyAneicgOiAneicpO1xuXG5mdW5jdGlvbiBhZGRNYXAoZGVwTWFwLCBpZCwgcHJvcCwgZGVwZW5kZW5jeSkge1xuICAgIGNvbnN0IGlkTWFwID0gKGRlcE1hcFtpZF0gPSBkZXBNYXBbaWRdIHx8IHt9KTtcbiAgICBjb25zdCBjYWxsYmFja3MgPSAoaWRNYXBbcHJvcF0gPSBpZE1hcFtwcm9wXSB8fCBbXSk7XG4gICAgY2FsbGJhY2tzLnB1c2goZGVwZW5kZW5jeSk7XG59XG5cbi8vIFBhdHRlcm5zIGFyZSBzdG9yZWQgaW4gYSBuZXN0ZWQgTWFwIHN0cnVjdHVyZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2Zcbi8vIHN0cmluZ2lmeWluZyBpZHMgZm9yIGV2ZXJ5IGNhbGxiYWNrLlxuZnVuY3Rpb24gYWRkUGF0dGVybihwYXR0ZXJucywgaWRTcGVjLCBwcm9wLCBkZXBlbmRlbmN5KSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGlkU3BlYykuc29ydCgpO1xuICAgIGNvbnN0IGtleVN0ciA9IGtleXMuam9pbignLCcpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHByb3BzKGtleXMsIGlkU3BlYyk7XG4gICAgY29uc3QgdmFsdWVzS2V5ID0gdmFsdWVzXG4gICAgICAgIC5tYXAodiA9PlxuICAgICAgICAgICAgdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IHYud2lsZFxuICAgICAgICAgICAgICAgICAgICA/IHYud2lsZFxuICAgICAgICAgICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHYpXG4gICAgICAgICAgICAgICAgOiBTdHJpbmcodilcbiAgICAgICAgKVxuICAgICAgICAuam9pbignfCcpO1xuXG4gICAgaWYgKCFwYXR0ZXJucy5oYXMoa2V5U3RyKSkge1xuICAgICAgICBwYXR0ZXJucy5zZXQoa2V5U3RyLCBuZXcgTWFwKCkpO1xuICAgIH1cbiAgICBjb25zdCBwcm9wTWFwID0gcGF0dGVybnMuZ2V0KGtleVN0cik7XG4gICAgaWYgKCFwcm9wTWFwLmhhcyhwcm9wKSkge1xuICAgICAgICBwcm9wTWFwLnNldChwcm9wLCBuZXcgTWFwKCkpO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZU1hcCA9IHByb3BNYXAuZ2V0KHByb3ApO1xuXG4gICAgbGV0IHZhbE1hdGNoID0gdmFsdWVNYXAuZ2V0KHZhbHVlc0tleSk7XG4gICAgaWYgKCF2YWxNYXRjaCkge1xuICAgICAgICB2YWxNYXRjaCA9IHtrZXlzLCB2YWx1ZXMsIGNhbGxiYWNrczogW119O1xuICAgICAgICB2YWx1ZU1hcC5zZXQodmFsdWVzS2V5LCB2YWxNYXRjaCk7XG4gICAgfVxuICAgIHZhbE1hdGNoLmNhbGxiYWNrcy5wdXNoKGRlcGVuZGVuY3kpO1xufVxuXG4vLyBDb252ZXJ0IHRoZSBuZXN0ZWQgTWFwIHN0cnVjdHVyZSBvZiBwYXR0ZXJucyBpbnRvIHRoZSBwbGFpbiBuZXN0ZWQgb2JqZWN0IHN0cnVjdHVyZVxuLy8gZXhwZWN0ZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIGNvZGUsIHdpdGggc3RyaW5naWZpZWQgaWQga2V5cy5cbi8vIFRoaXMgaXMgb25seSBkb25lIG9uY2UgcGVyIHBhdHRlcm4sIGF0IHRoZSBlbmQgb2YgZ3JhcGggY29uc3RydWN0aW9uLFxuLy8gdG8gbWluaW1pemUgdGhlIG92ZXJoZWFkIG9mIHN0cmluZ2lmeWluZyBpZHMuXG5mdW5jdGlvbiBvZmZsb2FkUGF0dGVybnMocGF0dGVybnNNYXAsIHRhcmdldE1hcCkge1xuICAgIGZvciAoY29uc3QgW2tleVN0ciwgcHJvcE1hcF0gb2YgcGF0dGVybnNNYXAuZW50cmllcygpKSB7XG4gICAgICAgIHRhcmdldE1hcFtrZXlTdHJdID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW3Byb3AsIHZhbHVlTWFwXSBvZiBwcm9wTWFwLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgdGFyZ2V0TWFwW2tleVN0cl1bcHJvcF0gPSBBcnJheS5mcm9tKHZhbHVlTWFwLnZhbHVlcygpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVEZXBlbmRlbmNpZXMocGFyc2VkRGVwZW5kZW5jaWVzLCBkaXNwYXRjaEVycm9yKSB7XG4gICAgY29uc3Qgb3V0U3RycyA9IHt9O1xuICAgIGNvbnN0IG91dE9ianMgPSBbXTtcblxuICAgIHBhcnNlZERlcGVuZGVuY2llcy5mb3JFYWNoKGRlcCA9PiB7XG4gICAgICAgIGNvbnN0IHtpbnB1dHMsIG91dHB1dHMsIHN0YXRlfSA9IGRlcDtcbiAgICAgICAgbGV0IGhhc091dHB1dHMgPSB0cnVlO1xuICAgICAgICBpZiAob3V0cHV0cy5sZW5ndGggPT09IDEgJiYgIW91dHB1dHNbMF0uaWQgJiYgIW91dHB1dHNbMF0ucHJvcGVydHkpIHtcbiAgICAgICAgICAgIGhhc091dHB1dHMgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhlYWQgPVxuICAgICAgICAgICAgJ0luIHRoZSBjYWxsYmFjayBmb3Igb3V0cHV0KHMpOlxcbiAgJyArXG4gICAgICAgICAgICBvdXRwdXRzLm1hcChjb21iaW5lSWRBbmRQcm9wKS5qb2luKCdcXG4gICcpO1xuXG4gICAgICAgIGlmICghaW5wdXRzLmxlbmd0aCAmJiBkZXAucHJldmVudF9pbml0aWFsX2NhbGwpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0EgY2FsbGJhY2sgaXMgbWlzc2luZyBJbnB1dHMnLCBbXG4gICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAndGhlcmUgYXJlIG5vIGBJbnB1dGAgZWxlbWVudHMuJyxcbiAgICAgICAgICAgICAgICAnV2l0aG91dCBgSW5wdXRgIGVsZW1lbnRzLCBpdCB3aWxsIG5ldmVyIGdldCBjYWxsZWQuJyxcbiAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAnU3Vic2NyaWJpbmcgdG8gYElucHV0YCBjb21wb25lbnRzIHdpbGwgY2F1c2UgdGhlJyxcbiAgICAgICAgICAgICAgICAnY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW5ldmVyIHRoZWlyIHZhbHVlcyBjaGFuZ2UuJyxcbiAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAnSWYgeW91IHdhbnQgYSBjYWxsYmFjayB3aXRob3V0IGlucHV0cyB0aGF0IGZpcmVzIG9uIGluaXRpYWwgbG9hZCwnLFxuICAgICAgICAgICAgICAgICdzZXQgcHJldmVudF9pbml0aWFsX2NhbGw9RmFsc2UuJ1xuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGVjID0gW1xuICAgICAgICAgICAgW291dHB1dHMsICdPdXRwdXQnXSxcbiAgICAgICAgICAgIFtpbnB1dHMsICdJbnB1dCddLFxuICAgICAgICAgICAgW3N0YXRlLCAnU3RhdGUnXVxuICAgICAgICBdO1xuICAgICAgICBzcGVjLmZvckVhY2goKFthcmdzLCBjbHNdKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2xzID09PSAnT3V0cHV0JyAmJiAhaGFzT3V0cHV0cykge1xuICAgICAgICAgICAgICAgIC8vIGp1c3QgYSBxdWlyayBvZiBob3cgd2UgcGFzcyAmIHBhcnNlIG91dHB1dHMgLSBpZiB5b3UgZG9uJ3RcbiAgICAgICAgICAgICAgICAvLyBwcm92aWRlIG9uZSwgaXQgbG9va3MgbGlrZSBhIHNpbmdsZSBibGFuayBvdXRwdXQuIFRoaXMgaXNcbiAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSB1c2VmdWwgZm9yIGdyYWNlZnVsIGZhaWx1cmUsIHNvIHdlIHdvcmsgYXJvdW5kIGl0LlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFyZ3MpKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcihgQ2FsbGJhY2sgJHtjbHN9KHMpIG11c3QgYmUgYW4gQXJyYXlgLCBbXG4gICAgICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGBGb3IgJHtjbHN9KHMpIHdlIGZvdW5kOmAsXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGFyZ3MpLFxuICAgICAgICAgICAgICAgICAgICAnYnV0IHdlIGV4cGVjdGVkIGFuIEFycmF5LidcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFyZ3MuZm9yRWFjaCgoaWRQcm9wLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGVBcmcoaWRQcm9wLCBoZWFkLCBjbHMsIGksIGRpc3BhdGNoRXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChoYXNPdXRwdXRzKSB7XG4gICAgICAgICAgICBmaW5kRHVwbGljYXRlT3V0cHV0cyhcbiAgICAgICAgICAgICAgICBvdXRwdXRzLFxuICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcixcbiAgICAgICAgICAgICAgICBvdXRTdHJzLFxuICAgICAgICAgICAgICAgIG91dE9ianNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaW5kTWlzbWF0Y2hlZFdpbGRjYXJkcyhcbiAgICAgICAgICAgICAgICBvdXRwdXRzLFxuICAgICAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3JcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBcmcoe2lkLCBwcm9wZXJ0eX0sIGhlYWQsIGNscywgaSwgZGlzcGF0Y2hFcnJvcikge1xuICAgIGlmICh0eXBlb2YgcHJvcGVydHkgIT09ICdzdHJpbmcnIHx8ICFwcm9wZXJ0eSkge1xuICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBwcm9wZXJ0eSBlcnJvcicsIFtcbiAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICBgJHtjbHN9WyR7aX1dLnByb3BlcnR5ID0gJHtKU09OLnN0cmluZ2lmeShwcm9wZXJ0eSl9YCxcbiAgICAgICAgICAgICdidXQgd2UgZXhwZWN0ZWQgYHByb3BlcnR5YCB0byBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJ1xuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlkID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoaXNFbXB0eShpZCkpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIGl0ZW0gbWlzc2luZyBJRCcsIFtcbiAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWQgPSB7fWAsXG4gICAgICAgICAgICAgICAgJ0V2ZXJ5IGl0ZW0gbGlua2VkIHRvIGEgY2FsbGJhY2sgbmVlZHMgYW4gSUQnXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKCh2LCBrKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWspIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayB3aWxkY2FyZCBJRCBlcnJvcicsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYCR7Y2xzfVske2l9XS5pZCBoYXMga2V5IFwiJHtrfVwiYCxcbiAgICAgICAgICAgICAgICAgICAgJ0tleXMgbXVzdCBiZSBub24tZW1wdHkgc3RyaW5ncy4nXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdi53aWxkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFsbG93ZWRXaWxkY2FyZHNbY2xzXVt2LndpbGRdICE9PSB2KSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIHdpbGRjYXJkIElEIGVycm9yJywgW1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWRbXCIke2t9XCJdID0gJHt2LndpbGR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGBBbGxvd2VkIHdpbGRjYXJkcyBmb3IgJHtjbHN9cyBhcmU6YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMoYWxsb3dlZFdpbGRjYXJkc1tjbHNdKS5qb2luKCcsICcpXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWluY2x1ZGVzKHR5cGVvZiB2LCB3aWxkY2FyZFZhbFR5cGVzKSkge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoRXJyb3IoJ0NhbGxiYWNrIHdpbGRjYXJkIElEIGVycm9yJywgW1xuICAgICAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgICAgICBgJHtjbHN9WyR7aX1dLmlkW1wiJHtrfVwiXSA9ICR7SlNPTi5zdHJpbmdpZnkodil9YCxcbiAgICAgICAgICAgICAgICAgICAgJ1dpbGRjYXJkIGNhbGxiYWNrIElEIHZhbHVlcyBtdXN0IGJlIGVpdGhlciB3aWxkY2FyZHMnLFxuICAgICAgICAgICAgICAgICAgICAnb3IgY29uc3RhbnRzIG9mIG9uZSBvZiB0aGVzZSB0eXBlczonLFxuICAgICAgICAgICAgICAgICAgICB3aWxkY2FyZFZhbFR5cGVzLmpvaW4oJywgJylcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgaWQpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBpdGVtIG1pc3NpbmcgSUQnLCBbXG4gICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICBgJHtjbHN9WyR7aX1dLmlkID0gXCIke2lkfVwiYCxcbiAgICAgICAgICAgICAgICAnRXZlcnkgaXRlbSBsaW5rZWQgdG8gYSBjYWxsYmFjayBuZWVkcyBhbiBJRCdcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGludmFsaWRDaGFycyA9IGlkSW52YWxpZENoYXJzLmZpbHRlcihjID0+IGluY2x1ZGVzKGMsIGlkKSk7XG4gICAgICAgIGlmIChpbnZhbGlkQ2hhcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBpbnZhbGlkIElEIHN0cmluZycsIFtcbiAgICAgICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWQgPSAnJHtpZH0nYCxcbiAgICAgICAgICAgICAgICBgY2hhcmFjdGVycyAnJHtpbnZhbGlkQ2hhcnMuam9pbihcIicsICdcIil9JyBhcmUgbm90IGFsbG93ZWQuYFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBkaXNwYXRjaEVycm9yKCdDYWxsYmFjayBJRCB0eXBlIGVycm9yJywgW1xuICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgIGAke2Nsc31bJHtpfV0uaWQgPSAke0pTT04uc3RyaW5naWZ5KGlkKX1gLFxuICAgICAgICAgICAgJ0lEcyBtdXN0IGJlIHN0cmluZ3Mgb3Igd2lsZGNhcmQtY29tcGF0aWJsZSBvYmplY3RzLidcbiAgICAgICAgXSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRHVwbGljYXRlT3V0cHV0cyhvdXRwdXRzLCBoZWFkLCBkaXNwYXRjaEVycm9yLCBvdXRTdHJzLCBvdXRPYmpzKSB7XG4gICAgY29uc3QgbmV3T3V0cHV0U3RycyA9IHt9O1xuICAgIGNvbnN0IG5ld091dHB1dE9ianMgPSBbXTtcbiAgICBvdXRwdXRzLmZvckVhY2goKHtpZCwgcHJvcGVydHl9LCBpKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBpZFByb3AgPSBjb21iaW5lSWRBbmRQcm9wKHtpZCwgcHJvcGVydHl9KTtcbiAgICAgICAgICAgIGlmIChuZXdPdXRwdXRTdHJzW2lkUHJvcF0pIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdEdXBsaWNhdGUgY2FsbGJhY2sgT3V0cHV0cycsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYE91dHB1dCAke2l9ICgke2lkUHJvcH0pIGlzIGFscmVhZHkgdXNlZCBieSB0aGlzIGNhbGxiYWNrLmBcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0U3Ryc1tpZFByb3BdKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignRHVwbGljYXRlIGNhbGxiYWNrIG91dHB1dHMnLCBbXG4gICAgICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGBPdXRwdXQgJHtpfSAoJHtpZFByb3B9KSBpcyBhbHJlYWR5IGluIHVzZS5gLFxuICAgICAgICAgICAgICAgICAgICAnVG8gcmVzb2x2ZSB0aGlzLCBzZXQgYGFsbG93X2R1cGxpY2F0ZT1UcnVlYCBvbicsXG4gICAgICAgICAgICAgICAgICAgICdkdXBsaWNhdGUgb3V0cHV0cywgb3IgY29tYmluZSB0aGUgb3V0cHV0cyBpbnRvJyxcbiAgICAgICAgICAgICAgICAgICAgJ29uZSBjYWxsYmFjayBmdW5jdGlvbiwgZGlzdGluZ3Vpc2hpbmcgdGhlIHRyaWdnZXInLFxuICAgICAgICAgICAgICAgICAgICAnYnkgdXNpbmcgYGRhc2guY2FsbGJhY2tfY29udGV4dGAgaWYgbmVjZXNzYXJ5LidcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3T3V0cHV0U3Ryc1tpZFByb3BdID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlkT2JqID0ge2lkLCBwcm9wZXJ0eX07XG4gICAgICAgICAgICBjb25zdCBzZWxmT3ZlcmxhcCA9IHdpbGRjYXJkT3ZlcmxhcChpZE9iaiwgbmV3T3V0cHV0T2Jqcyk7XG4gICAgICAgICAgICBjb25zdCBvdGhlck92ZXJsYXAgPSBzZWxmT3ZlcmxhcCB8fCB3aWxkY2FyZE92ZXJsYXAoaWRPYmosIG91dE9ianMpO1xuICAgICAgICAgICAgaWYgKHNlbGZPdmVybGFwIHx8IG90aGVyT3ZlcmxhcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IGNvbWJpbmVJZEFuZFByb3AoaWRPYmopO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkUHJvcDIgPSBjb21iaW5lSWRBbmRQcm9wKHNlbGZPdmVybGFwIHx8IG90aGVyT3ZlcmxhcCk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignT3ZlcmxhcHBpbmcgd2lsZGNhcmQgY2FsbGJhY2sgb3V0cHV0cycsIFtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgYE91dHB1dCAke2l9ICgke2lkUHJvcH0pYCxcbiAgICAgICAgICAgICAgICAgICAgYG92ZXJsYXBzIGFub3RoZXIgb3V0cHV0ICgke2lkUHJvcDJ9KWAsXG4gICAgICAgICAgICAgICAgICAgIGB1c2VkIGluICR7c2VsZk92ZXJsYXAgPyAndGhpcycgOiAnYSBkaWZmZXJlbnQnfSBjYWxsYmFjay5gXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld091dHB1dE9ianMucHVzaChpZE9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBrZXlzKG5ld091dHB1dFN0cnMpLmZvckVhY2goayA9PiB7XG4gICAgICAgIG91dFN0cnNba10gPSAxO1xuICAgIH0pO1xuICAgIG5ld091dHB1dE9ianMuZm9yRWFjaChpZE9iaiA9PiB7XG4gICAgICAgIG91dE9ianMucHVzaChpZE9iaik7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSW5PdXRPdmVybGFwKG91dCwgaW5wdXRzKSB7XG4gICAgY29uc3Qge2lkOiBvdXRJZCwgcHJvcGVydHk6IG91dFByb3B9ID0gb3V0O1xuICAgIHJldHVybiBpbnB1dHMuc29tZShpbl8gPT4ge1xuICAgICAgICBjb25zdCB7aWQ6IGluSWQsIHByb3BlcnR5OiBpblByb3B9ID0gaW5fO1xuICAgICAgICBpZiAob3V0UHJvcCAhPT0gaW5Qcm9wIHx8IHR5cGVvZiBvdXRJZCAhPT0gdHlwZW9mIGluSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG91dElkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKG91dElkID09PSBpbklkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2lsZGNhcmRPdmVybGFwKGluXywgW291dF0pKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRNaXNtYXRjaGVkV2lsZGNhcmRzKG91dHB1dHMsIGlucHV0cywgc3RhdGUsIGhlYWQsIGRpc3BhdGNoRXJyb3IpIHtcbiAgICBjb25zdCB7bWF0Y2hLZXlzOiBvdXQwTWF0Y2hLZXlzfSA9IGZpbmRXaWxkY2FyZEtleXMoXG4gICAgICAgIG91dHB1dHMubGVuZ3RoID8gb3V0cHV0c1swXS5pZCA6IHVuZGVmaW5lZFxuICAgICk7XG4gICAgb3V0cHV0cy5mb3JFYWNoKChvdXQsIGkpID0+IHtcbiAgICAgICAgaWYgKGkgJiYgIWVxdWFscyhmaW5kV2lsZGNhcmRLZXlzKG91dC5pZCkubWF0Y2hLZXlzLCBvdXQwTWF0Y2hLZXlzKSkge1xuICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignTWlzbWF0Y2hlZCBgTUFUQ0hgIHdpbGRjYXJkcyBhY3Jvc3MgYE91dHB1dGBzJywgW1xuICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgYE91dHB1dCAke2l9ICgke2NvbWJpbmVJZEFuZFByb3Aob3V0KX0pYCxcbiAgICAgICAgICAgICAgICAnZG9lcyBub3QgaGF2ZSBNQVRDSCB3aWxkY2FyZHMgb24gdGhlIHNhbWUga2V5cyBhcycsXG4gICAgICAgICAgICAgICAgYE91dHB1dCAwICgke2NvbWJpbmVJZEFuZFByb3Aob3V0cHV0c1swXSl9KS5gLFxuICAgICAgICAgICAgICAgICdNQVRDSCB3aWxkY2FyZHMgbXVzdCBiZSBvbiB0aGUgc2FtZSBrZXlzIGZvciBhbGwgT3V0cHV0cy4nLFxuICAgICAgICAgICAgICAgICdBTEwgd2lsZGNhcmRzIG5lZWQgbm90IG1hdGNoLCBvbmx5IE1BVENILidcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gV2hlbiB0aGUgT3V0cHV0cyBkb24ndCBjYXJyeSBhbnkgTUFUQ0gga2V5cyAoZml4ZWQtaWQgb3V0cHV0cywgbm9cbiAgICAvLyBvdXRwdXRzLCBvciB3aWxkY2FyZCBvdXRwdXRzIHdpdGggb25seSBBTEwpLCB0aGUgSW5wdXRzL1N0YXRlIG1heSB1c2VcbiAgICAvLyBNQVRDSCBmcmVlbHkg4oCUIGVhY2ggZmlyaW5nIGlzIGlkZW50aWZpZWQgYnkgdGhlIHRyaWdnZXJpbmcgaW5wdXQnc1xuICAgIC8vIE1BVENIIHZhbHVlcy4gQUxMU01BTExFUiBzdGlsbCByZXF1aXJlcyBhIE1BVENIIHJlZmVyZW5jZSwgc28gdGhhdFxuICAgIC8vIGNhc2UgcmVtYWlucyBhbiBlcnJvci4gU2VlIGlzc3VlICMyNDYyLlxuICAgIGNvbnN0IG91dHB1dHNIYXZlTWF0Y2ggPSBvdXQwTWF0Y2hLZXlzLmxlbmd0aCA+IDA7XG4gICAgW1xuICAgICAgICBbaW5wdXRzLCAnSW5wdXQnXSxcbiAgICAgICAgW3N0YXRlLCAnU3RhdGUnXVxuICAgIF0uZm9yRWFjaCgoW2FyZ3MsIGNsc10pID0+IHtcbiAgICAgICAgYXJncy5mb3JFYWNoKChhcmcsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHttYXRjaEtleXMsIGFsbHNtYWxsZXJLZXlzfSA9IGZpbmRXaWxkY2FyZEtleXMoYXJnLmlkKTtcbiAgICAgICAgICAgIGNvbnN0IGRpZmZLZXlzID0gb3V0cHV0c0hhdmVNYXRjaFxuICAgICAgICAgICAgICAgID8gbWF0Y2hLZXlzLmNvbmNhdChhbGxzbWFsbGVyS2V5cylcbiAgICAgICAgICAgICAgICA6IGFsbHNtYWxsZXJLZXlzO1xuICAgICAgICAgICAgY29uc3QgZGlmZiA9IGRpZmZlcmVuY2UoZGlmZktleXMsIG91dDBNYXRjaEtleXMpO1xuICAgICAgICAgICAgaWYgKGRpZmYubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZGlmZi5zb3J0KCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0RGVzYyA9IG91dHB1dHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgID8gYE91dHB1dCAwICgke2NvbWJpbmVJZEFuZFByb3Aob3V0cHV0c1swXSl9KWBcbiAgICAgICAgICAgICAgICAgICAgOiAndGhlIChhYnNlbnQpIE91dHB1dCc7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFcnJvcignYElucHV0YCAvIGBTdGF0ZWAgd2lsZGNhcmRzIG5vdCBpbiBgT3V0cHV0YHMnLCBbXG4gICAgICAgICAgICAgICAgICAgIGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGAke2Nsc30gJHtpfSAoJHtjb21iaW5lSWRBbmRQcm9wKGFyZyl9KWAsXG4gICAgICAgICAgICAgICAgICAgIGBoYXMgTUFUQ0ggb3IgQUxMU01BTExFUiBvbiBrZXkocykgJHtkaWZmLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgICAgICAgICAgYHdoZXJlICR7b3V0RGVzY31gLFxuICAgICAgICAgICAgICAgICAgICAnZG9lcyBub3QgaGF2ZSBhIE1BVENIIHdpbGRjYXJkLiBJbnB1dHMgYW5kIFN0YXRlIGRvIG5vdCcsXG4gICAgICAgICAgICAgICAgICAgICduZWVkIGV2ZXJ5IE1BVENIIGZyb20gdGhlIE91dHB1dChzKSwgYnV0IEFMTFNNQUxMRVInLFxuICAgICAgICAgICAgICAgICAgICAncmVxdWlyZXMgYSBtYXRjaGluZyBNQVRDSCBpbiB0aGUgT3V0cHV0KHMpLCBhbmQgd2hlbicsXG4gICAgICAgICAgICAgICAgICAgICd0aGUgT3V0cHV0KHMpIGhhdmUgYW55IE1BVENILCBJbnB1dC9TdGF0ZSBNQVRDSCBrZXlzJyxcbiAgICAgICAgICAgICAgICAgICAgJ211c3QgYmUgYSBzdWJzZXQgb2YgdGhlbS4nXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5jb25zdCBtYXRjaFdpbGRLZXlzID0gKFthLCBiXSkgPT4ge1xuICAgIGNvbnN0IGFXaWxkID0gYSAmJiBhLndpbGQ7XG4gICAgY29uc3QgYldpbGQgPSBiICYmIGIud2lsZDtcbiAgICBpZiAoYVdpbGQgJiYgYldpbGQpIHtcbiAgICAgICAgLy8gRXZlcnkgd2lsZGNhcmQgY29tYmluYXRpb24gb3ZlcmxhcHMgZXhjZXB0IE1BVENIPC0+QUxMU01BTExFUlxuICAgICAgICByZXR1cm4gIShcbiAgICAgICAgICAgIChhID09PSBNQVRDSCAmJiBiID09PSBBTExTTUFMTEVSKSB8fFxuICAgICAgICAgICAgKGEgPT09IEFMTFNNQUxMRVIgJiYgYiA9PT0gTUFUQ0gpXG4gICAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhID09PSBiIHx8IGFXaWxkIHx8IGJXaWxkO1xufTtcblxuZnVuY3Rpb24gd2lsZGNhcmRPdmVybGFwKHtpZCwgcHJvcGVydHl9LCBvYmpzKSB7XG4gICAgY29uc3QgaWRLZXlzID0ga2V5cyhpZCkuc29ydCgpO1xuICAgIGNvbnN0IGlkVmFscyA9IHByb3BzKGlkS2V5cywgaWQpO1xuICAgIGZvciAoY29uc3Qgb2JqIG9mIG9ianMpIHtcbiAgICAgICAgY29uc3Qge2lkOiBpZDIsIHByb3BlcnR5OiBwcm9wZXJ0eTJ9ID0gb2JqO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwcm9wZXJ0eTIgPT09IHByb3BlcnR5ICYmXG4gICAgICAgICAgICB0eXBlb2YgaWQyICE9PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgZXF1YWxzKGtleXMoaWQyKS5zb3J0KCksIGlkS2V5cykgJiZcbiAgICAgICAgICAgIGFsbChtYXRjaFdpbGRLZXlzLCB6aXAoaWRWYWxzLCBwcm9wcyhpZEtleXMsIGlkMikpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDYWxsYmFja3NUb0xheW91dChzdGF0ZV8sIGRpc3BhdGNoRXJyb3IpIHtcbiAgICBjb25zdCB7Y29uZmlnLCBncmFwaHMsIGxheW91dDogbGF5b3V0XywgcGF0aHM6IHBhdGhzX30gPSBzdGF0ZV87XG4gICAgY29uc3QgdmFsaWRhdGVJZHMgPSAhY29uZmlnLnN1cHByZXNzX2NhbGxiYWNrX2V4Y2VwdGlvbnM7XG4gICAgbGV0IGxheW91dCwgcGF0aHM7XG4gICAgaWYgKHZhbGlkYXRlSWRzICYmIGNvbmZpZy52YWxpZGF0aW9uX2xheW91dCkge1xuICAgICAgICBsYXlvdXQgPSBjb25maWcudmFsaWRhdGlvbl9sYXlvdXQ7XG4gICAgICAgIHBhdGhzID0gY29tcHV0ZVBhdGhzKGxheW91dCwgW10sIG51bGwsIHBhdGhzXy5ldmVudHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxheW91dCA9IGxheW91dF87XG4gICAgICAgIHBhdGhzID0gcGF0aHNfO1xuICAgIH1cbiAgICBjb25zdCB7b3V0cHV0TWFwLCBpbnB1dE1hcCwgb3V0cHV0UGF0dGVybnMsIGlucHV0UGF0dGVybnN9ID0gZ3JhcGhzO1xuXG4gICAgZnVuY3Rpb24gdGFpbChjYWxsYmFja3MpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICdUaGlzIElEIHdhcyB1c2VkIGluIHRoZSBjYWxsYmFjayhzKSBmb3IgT3V0cHV0KHMpOlxcbiAgJyArXG4gICAgICAgICAgICBjYWxsYmFja3NcbiAgICAgICAgICAgICAgICAubWFwKCh7b3V0cHV0c30pID0+IG91dHB1dHMubWFwKGNvbWJpbmVJZEFuZFByb3ApLmpvaW4oJywgJykpXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbiAgJylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtaXNzaW5nSWQoaWQsIGNscywgY2FsbGJhY2tzKSB7XG4gICAgICAgIGRpc3BhdGNoRXJyb3IoJ0lEIG5vdCBmb3VuZCBpbiBsYXlvdXQnLCBbXG4gICAgICAgICAgICBgQXR0ZW1wdGluZyB0byBjb25uZWN0IGEgY2FsbGJhY2sgJHtjbHN9IGl0ZW0gdG8gY29tcG9uZW50OmAsXG4gICAgICAgICAgICBgICBcIiR7c3RyaW5naWZ5SWQoaWQpfVwiYCxcbiAgICAgICAgICAgICdidXQgbm8gY29tcG9uZW50cyB3aXRoIHRoYXQgaWQgZXhpc3QgaW4gdGhlIGxheW91dC4nLFxuICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAnSWYgeW91IGFyZSBhc3NpZ25pbmcgY2FsbGJhY2tzIHRvIGNvbXBvbmVudHMgdGhhdCBhcmUnLFxuICAgICAgICAgICAgJ2dlbmVyYXRlZCBieSBvdGhlciBjYWxsYmFja3MgKGFuZCB0aGVyZWZvcmUgbm90IGluIHRoZScsXG4gICAgICAgICAgICAnaW5pdGlhbCBsYXlvdXQpLCB5b3UgY2FuIHN1cHByZXNzIHRoaXMgZXhjZXB0aW9uIGJ5IHNldHRpbmcnLFxuICAgICAgICAgICAgJ2BzdXBwcmVzc19jYWxsYmFja19leGNlcHRpb25zPVRydWVgLicsXG4gICAgICAgICAgICB0YWlsKGNhbGxiYWNrcylcbiAgICAgICAgXSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVQcm9wKGlkLCBpZFBhdGgsIHJhd1Byb3AsIGNscywgY2FsbGJhY2tzKSB7XG4gICAgICAgIGNvbnN0IHByb3AgPSByYXdQcm9wLnNwbGl0KCdAJylbMF07XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHBhdGgoaWRQYXRoLCBsYXlvdXQpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gUmVnaXN0cnkucmVzb2x2ZShjb21wb25lbnQpO1xuXG4gICAgICAgIC8vIG5vdGU6IEZsb3cgY29tcG9uZW50cyBkbyBub3QgaGF2ZSBwcm9wVHlwZXMsIHNvIHdlIGNhbid0IHZhbGlkYXRlLlxuICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50LnByb3BUeXBlcyAmJiAhZWxlbWVudC5wcm9wVHlwZXNbcHJvcF0pIHtcbiAgICAgICAgICAgIC8vIGxvb2sgZm9yIHdpbGRjYXJkIHByb3BzIChpZSBkYXRhLSogZXRjKVxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiBlbGVtZW50LnByb3BUeXBlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBwcm9wTmFtZS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWUuY2hhckF0KGxhc3QpID09PSAnKicgJiZcbiAgICAgICAgICAgICAgICAgICAgcHJvcC5zdWJzdHIoMCwgbGFzdCkgPT09IHByb3BOYW1lLnN1YnN0cigwLCBsYXN0KVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qge3R5cGUsIG5hbWVzcGFjZX0gPSBjb21wb25lbnQ7XG4gICAgICAgICAgICBkaXNwYXRjaEVycm9yKCdJbnZhbGlkIHByb3AgZm9yIHRoaXMgY29tcG9uZW50JywgW1xuICAgICAgICAgICAgICAgIGBQcm9wZXJ0eSBcIiR7cHJvcH1cIiB3YXMgdXNlZCB3aXRoIGNvbXBvbmVudCBJRDpgLFxuICAgICAgICAgICAgICAgIGAgICR7SlNPTi5zdHJpbmdpZnkoaWQpfWAsXG4gICAgICAgICAgICAgICAgYGluIG9uZSBvZiB0aGUgJHtjbHN9IGl0ZW1zIG9mIGEgY2FsbGJhY2suYCxcbiAgICAgICAgICAgICAgICBgVGhpcyBJRCBpcyBhc3NpZ25lZCB0byBhICR7bmFtZXNwYWNlfS4ke3R5cGV9IGNvbXBvbmVudGAsXG4gICAgICAgICAgICAgICAgJ2luIHRoZSBsYXlvdXQsIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBwcm9wZXJ0eS4nLFxuICAgICAgICAgICAgICAgIHRhaWwoY2FsbGJhY2tzKVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUlkUGF0dGVyblByb3AoaWQsIHByb3BlcnR5LCBjbHMsIGNhbGxiYWNrcykge1xuICAgICAgICByZXNvbHZlRGVwcygpKHBhdGhzKSh7aWQsIHByb3BlcnR5fSkuZm9yRWFjaChkZXAgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2lkOiBpZFJlc29sdmVkLCBwYXRoOiBpZFBhdGh9ID0gZGVwO1xuICAgICAgICAgICAgdmFsaWRhdGVQcm9wKGlkUmVzb2x2ZWQsIGlkUGF0aCwgcHJvcGVydHksIGNscywgY2FsbGJhY2tzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2FsbGJhY2tJZHNDaGVja2VkRm9yU3RhdGUgPSB7fTtcblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlU3RhdGUoY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3Qge3N0YXRlLCBvdXRwdXR9ID0gY2FsbGJhY2s7XG5cbiAgICAgICAgLy8gZW5zdXJlIHdlIGRvbid0IGNoZWNrIHRoZSBzYW1lIGNhbGxiYWNrIGZvciBzdGF0ZSBtdWx0aXBsZSB0aW1lc1xuICAgICAgICBpZiAoY2FsbGJhY2tJZHNDaGVja2VkRm9yU3RhdGVbb3V0cHV0XSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrSWRzQ2hlY2tlZEZvclN0YXRlW291dHB1dF0gPSAxO1xuXG4gICAgICAgIGNvbnN0IGNscyA9ICdTdGF0ZSc7XG5cbiAgICAgICAgc3RhdGUuZm9yRWFjaCgoe2lkLCBwcm9wZXJ0eX0pID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRQYXRoID0gZ2V0UGF0aChwYXRocywgaWQpO1xuICAgICAgICAgICAgICAgIGlmICghaWRQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZUlkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZ0lkKGlkLCBjbHMsIFtjYWxsYmFja10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVQcm9wKGlkLCBpZFBhdGgsIHByb3BlcnR5LCBjbHMsIFtjYWxsYmFja10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE9ubHkgdmFsaWRhdGUgcHJvcHMgZm9yIFN0YXRlIG9iamVjdCBpZHMgdGhhdCB3ZSBkb24ndCBuZWVkIHRvXG4gICAgICAgICAgICAvLyByZXNvbHZlIHRoZW0gdG8gc3BlY2lmaWMgaW5wdXRzIG9yIG91dHB1dHNcbiAgICAgICAgICAgIGVsc2UgaWYgKCFpbnRlcnNlY3Rpb24oW01BVENILCBBTExTTUFMTEVSXSwgdmFsdWVzKGlkKSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGVJZFBhdHRlcm5Qcm9wKGlkLCBwcm9wZXJ0eSwgY2xzLCBbY2FsbGJhY2tdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVNYXAobWFwLCBjbHMsIGRvU3RhdGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBtYXApIHtcbiAgICAgICAgICAgIGNvbnN0IGlkUHJvcHMgPSBtYXBbaWRdO1xuICAgICAgICAgICAgY29uc3QgZmNiID0gZmxhdHRlbih2YWx1ZXMoaWRQcm9wcykpO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uYWwgPSBmY2IucmVkdWNlKChhY2MsIGNiKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFjYyA9PT0gZmFsc2UgfHwgY2Iub3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwcyA9IGNvbmNhdChjYi5vdXRwdXRzLCBjYi5pbnB1dHMsIGNiLnN0YXRlcykuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICBkZXAgPT4gZGVwLmlkID09PSBpZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgIWRlcHMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgICAgIGFsbCgoe2FsbG93X29wdGlvbmFsfSkgPT4gYWxsb3dfb3B0aW9uYWwsIGRlcHMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sIHRydWUpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpZFBhdGggPSBnZXRQYXRoKHBhdGhzLCBpZCk7XG4gICAgICAgICAgICBpZiAoIWlkUGF0aCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZUlkcykge1xuICAgICAgICAgICAgICAgICAgICBtaXNzaW5nSWQoaWQsIGNscywgZmNiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gaWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFja3MgPSBpZFByb3BzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVQcm9wKGlkLCBpZFBhdGgsIHByb3BlcnR5LCBjbHMsIGNhbGxiYWNrcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb1N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCB3b3VsZCBiZSByZWR1bmRhbnQgdG8gY2hlY2sgc3RhdGUgb24gYm90aCBpbnB1dHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBvdXRwdXRzIC0gc28gb25seSBzZXQgZG9TdGF0ZSBmb3Igb3V0cHV0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKHZhbGlkYXRlU3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGVNYXAob3V0cHV0TWFwLCAnT3V0cHV0JywgdHJ1ZSk7XG4gICAgdmFsaWRhdGVNYXAoaW5wdXRNYXAsICdJbnB1dCcpO1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVQYXR0ZXJucyhwYXR0ZXJucywgY2xzLCBkb1N0YXRlKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5U3RyIGluIHBhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlQYXR0ZXJucyA9IHBhdHRlcm5zW2tleVN0cl07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGtleVBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAga2V5UGF0dGVybnNbcHJvcGVydHldLmZvckVhY2goKHtrZXlzLCB2YWx1ZXMsIGNhbGxiYWNrc30pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSB6aXBPYmooa2V5cywgdmFsdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVJZFBhdHRlcm5Qcm9wKGlkLCBwcm9wZXJ0eSwgY2xzLCBjYWxsYmFja3MpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9TdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmZvckVhY2godmFsaWRhdGVTdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhbGlkYXRlUGF0dGVybnMob3V0cHV0UGF0dGVybnMsICdPdXRwdXQnLCB0cnVlKTtcbiAgICB2YWxpZGF0ZVBhdHRlcm5zKGlucHV0UGF0dGVybnMsICdJbnB1dCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUdyYXBocyhkZXBlbmRlbmNpZXMsIGRpc3BhdGNoRXJyb3IsIGNvbmZpZykge1xuICAgIC8vIG11bHRpR3JhcGggaXMganVzdCBmb3IgZmluZGluZyBjaXJjdWxhciBkZXBzXG4gICAgY29uc3QgbXVsdGlHcmFwaCA9IG5ldyBEZXBHcmFwaCgpO1xuICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgICBjb25zdCB3aWxkY2FyZFBsYWNlaG9sZGVycyA9IHt9O1xuXG4gICAgY29uc3QgZml4SWRzID0gbWFwKGV2b2x2ZSh7aWQ6IHBhcnNlSWZXaWxkY2FyZH0pKTtcbiAgICBjb25zdCBwYXJzZWREZXBlbmRlbmNpZXMgPSBtYXAoZGVwID0+IHtcbiAgICAgICAgY29uc3Qge291dHB1dCwgbm9fb3V0cHV0fSA9IGRlcDtcbiAgICAgICAgY29uc3Qgb3V0ID0gZXZvbHZlKHtpbnB1dHM6IGZpeElkcywgc3RhdGU6IGZpeElkc30sIGRlcCk7XG4gICAgICAgIGlmIChub19vdXRwdXQpIHtcbiAgICAgICAgICAgIC8vIE5vIG91dHB1dCBjYXNlXG4gICAgICAgICAgICBvdXQub3V0cHV0cyA9IFtdO1xuICAgICAgICAgICAgb3V0Lm5vT3V0cHV0ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dC5vdXRwdXRzID0gbWFwKFxuICAgICAgICAgICAgICAgIG91dGkgPT4gYXNzb2MoJ291dCcsIHRydWUsIHNwbGl0SWRBbmRQcm9wKG91dGkpKSxcbiAgICAgICAgICAgICAgICBpc011bHRpT3V0cHV0UHJvcChvdXRwdXQpXG4gICAgICAgICAgICAgICAgICAgID8gcGFyc2VNdWx0aXBsZU91dHB1dHMob3V0cHV0KVxuICAgICAgICAgICAgICAgICAgICA6IFtvdXRwdXRdXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9LCBkZXBlbmRlbmNpZXMpO1xuXG4gICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XG4gICAgY29uc3Qgd3JhcHBlZERFID0gKG1lc3NhZ2UsIGxpbmVzKSA9PiB7XG4gICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgZGlzcGF0Y2hFcnJvcihtZXNzYWdlLCBsaW5lcyk7XG4gICAgfTtcbiAgICBpZiAoY29uZmlnLnZhbGlkYXRlX2NhbGxiYWNrcykge1xuICAgICAgICB2YWxpZGF0ZURlcGVuZGVuY2llcyhwYXJzZWREZXBlbmRlbmNpZXMsIHdyYXBwZWRERSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBGb3IgcmVndWxhciBpZHMsIG91dHB1dE1hcCBhbmQgaW5wdXRNYXAgYXJlOlxuICAgICAqICAge1tpZF06IHtbcHJvcF06IFtjYWxsYmFjaywgLi4uXX19XG4gICAgICogd2hlcmUgY2FsbGJhY2tzIGFyZSB0aGUgbWF0Y2hpbmcgc3BlY3MgZnJvbSB0aGUgb3JpZ2luYWxcbiAgICAgKiBkZXBlbmRlbmNpZXNSZXF1ZXN0LCBidXQgd2l0aCBvdXRwdXRzIHBhcnNlZCB0byBsb29rIGxpa2UgaW5wdXRzLFxuICAgICAqIGFuZCBhIGxpc3QgbWF0Y2hLZXlzIGFkZGVkIGlmIHRoZSBvdXRwdXRzIGhhdmUgTUFUQ0ggd2lsZGNhcmRzLlxuICAgICAqIEZvciBvdXRwdXRNYXAgdGhlcmUgc2hvdWxkIG9ubHkgZXZlciBiZSBvbmUgY2FsbGJhY2sgcGVyIGlkL3Byb3BcbiAgICAgKiBidXQgZm9yIGlucHV0TWFwIHRoZXJlIG1heSBiZSBtYW55LlxuICAgICAqXG4gICAgICogRm9yIHdpbGRjYXJkIGlkcywgb3V0cHV0UGF0dGVybnMgYW5kIGlucHV0UGF0dGVybnMgYXJlOlxuICAgICAqICAge1xuICAgICAqICAgICAgIFtrZXlzdHJdOiB7XG4gICAgICogICAgICAgICAgIFtwcm9wXTogW1xuICAgICAqICAgICAgICAgICAgICAge2tleXM6IFsuLi5dLCB2YWx1ZXM6IFsuLi5dLCBjYWxsYmFja3M6IFtjYWxsYmFjaywgLi4uXX0sXG4gICAgICogICAgICAgICAgICAgICB7Li4ufVxuICAgICAqICAgICAgICAgICBdXG4gICAgICogICAgICAgfVxuICAgICAqICAgfVxuICAgICAqIGtleXN0ciBpcyBhIHN0cmluZ2lmaWVkIG9yZGVyZWQgbGlzdCBvZiBrZXlzIGluIHRoZSBpZFxuICAgICAqIGtleXMgaXMgdGhlIHNhbWUgb3JkZXJlZCBsaXN0IChqdXN0IGNvcGllZCBmb3IgY29udmVuaWVuY2UpXG4gICAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIGV4cGxpY2l0IG9yIHdpbGRjYXJkIHZhbHVlcyBmb3IgZWFjaCBrZXkgaW4ga2V5c1xuICAgICAqL1xuICAgIGNvbnN0IG91dHB1dE1hcCA9IHt9O1xuICAgIGNvbnN0IGlucHV0TWFwID0ge307XG4gICAgY29uc3Qgb3V0cHV0UGF0dGVybk1hcCA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBpbnB1dFBhdHRlcm5NYXAgPSBuZXcgTWFwKCk7XG4gICAgbGV0IG91dHB1dFBhdHRlcm5zID0ge307XG4gICAgbGV0IGlucHV0UGF0dGVybnMgPSB7fTtcblxuICAgIGNvbnN0IGZpbmFsR3JhcGhzID0ge1xuICAgICAgICBNdWx0aUdyYXBoOiBtdWx0aUdyYXBoLFxuICAgICAgICBvdXRwdXRNYXAsXG4gICAgICAgIGlucHV0TWFwLFxuICAgICAgICBvdXRwdXRQYXR0ZXJucyxcbiAgICAgICAgaW5wdXRQYXR0ZXJucyxcbiAgICAgICAgY2FsbGJhY2tzOiBwYXJzZWREZXBlbmRlbmNpZXNcbiAgICB9O1xuXG4gICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICAgIC8vIGxlYXZlIHRoZSBncmFwaHMgZW1wdHkgaWYgd2UgZm91bmQgYW4gZXJyb3IsIHNvIHdlIGRvbid0IHRyeSB0b1xuICAgICAgICAvLyBleGVjdXRlIHRoZSBicm9rZW4gY2FsbGJhY2tzLlxuICAgICAgICByZXR1cm4gZmluYWxHcmFwaHM7XG4gICAgfVxuXG4gICAgLy8gYnVpbGRzIHVwIHdpbGRjYXJkUGxhY2Vob2xkZXJzIHdpdGggYWxsIHRoZSB3aWxkY2FyZCBrZXlzIGFuZCB2YWx1ZXMgdXNlZCBpbiB0aGUgY2FsbGJhY2tzLCBzbyB3ZSBjYW4gZ2VuZXJhdGUgdGhlIGZ1bGwgbGlzdCBvZiBpZHMgdGhhdCBlYWNoIGNhbGxiYWNrIGRlcGVuZHMgb24uXG4gICAgcGFyc2VkRGVwZW5kZW5jaWVzLmZvckVhY2goZGVwZW5kZW5jeSA9PiB7XG4gICAgICAgIGNvbnN0IHtvdXRwdXRzLCBpbnB1dHN9ID0gZGVwZW5kZW5jeTtcblxuICAgICAgICBvdXRwdXRzXG4gICAgICAgICAgICAuY29uY2F0KGlucHV0cylcbiAgICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiB0eXBlb2YgaXRlbS5pZCA9PT0gJ29iamVjdCcpXG4gICAgICAgICAgICAuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBmb3JFYWNoT2JqSW5kZXhlZCgodmFsLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aWxkY2FyZFBsYWNlaG9sZGVyc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWxkY2FyZFBsYWNlaG9sZGVyc1trZXldID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmQ6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5UGxhY2Vob2xkZXJzID0gd2lsZGNhcmRQbGFjZWhvbGRlcnNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCAmJiB2YWwud2lsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5leHBhbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlQbGFjZWhvbGRlcnMuZXhwYW5kICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5UGxhY2Vob2xkZXJzLmV4YWN0LmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleVBsYWNlaG9sZGVycy5leGFjdC5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBpdGVtLmlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gRWZmaWNpZW50bHkgYnVpbGQgd2lsZGNhcmRQbGFjZWhvbGRlcnMudmFscyBhcnJheXNcbiAgICBmb3JFYWNoT2JqSW5kZXhlZChrZXlQbGFjZWhvbGRlcnMgPT4ge1xuICAgICAgICBjb25zdCB7ZXhhY3QsIGV4cGFuZH0gPSBrZXlQbGFjZWhvbGRlcnM7XG4gICAgICAgIGNvbnN0IHZhbHMgPSBleGFjdC5zbGljZSgpLnNvcnQoaWRWYWxTb3J0KTtcbiAgICAgICAgaWYgKGV4cGFuZCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBhbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChleGFjdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFscy5zcGxpY2UoMCwgMCwgW3ZhbEJlZm9yZSh2YWxzWzBdKV0pO1xuICAgICAgICAgICAgICAgICAgICB2YWxzLnB1c2godmFsQWZ0ZXIodmFsc1t2YWxzLmxlbmd0aCAtIDFdKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFscy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghZXhhY3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBvbmx5IE1BVENIL0FMTCAtIHN0aWxsIG5lZWQgYSB2YWx1ZVxuICAgICAgICAgICAgdmFscy5wdXNoKDApO1xuICAgICAgICB9XG4gICAgICAgIGtleVBsYWNlaG9sZGVycy52YWxzID0gdmFscztcbiAgICB9LCB3aWxkY2FyZFBsYWNlaG9sZGVycyk7XG5cbiAgICBmdW5jdGlvbiBtYWtlQWxsSWRzKGlkU3BlYywgb3V0SWRGaW5hbCkge1xuICAgICAgICBsZXQgaWRMaXN0ID0gW3t9XTtcbiAgICAgICAgZm9yRWFjaE9iakluZGV4ZWQoKHZhbCwga2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0VmFscyA9IHdpbGRjYXJkUGxhY2Vob2xkZXJzW2tleV0udmFscztcbiAgICAgICAgICAgIGNvbnN0IG91dFZhbEluZGV4ID0gdGVzdFZhbHMuaW5kZXhPZihvdXRJZEZpbmFsW2tleV0pO1xuICAgICAgICAgICAgbGV0IG5ld1ZhbHMgPSBbdmFsXTtcbiAgICAgICAgICAgIGlmICh2YWwgJiYgdmFsLndpbGQpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsID09PSBBTExTTUFMTEVSKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvdXRWYWxJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHMgPSB0ZXN0VmFscy5zbGljZSgwLCBvdXRWYWxJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzbWFsbGVyIGl0ZW1zIC0gZGVsZXRlIGFsbCBvdXRwdXRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFscyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTUFUQ0ggb3IgQUxMXG4gICAgICAgICAgICAgICAgICAgIC8vIE1BVENIICppcyogQUxMIGZvciBvdXRwdXRzLCBpZSB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgYVxuICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBzcGVjaWZpZWQgaW4gYG91dElkRmluYWxgXG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0VmFsSW5kZXggPT09IC0xIHx8IHZhbCA9PT0gQUxMXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0ZXN0VmFsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW291dElkRmluYWxba2V5XV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmVwbGljYXRlcyBldmVyeXRoaW5nIGluIGlkTGlzdCBvbmNlIGZvciBlYWNoIGl0ZW0gaW5cbiAgICAgICAgICAgIC8vIG5ld1ZhbHMsIGF0dGFjaGluZyBlYWNoIHZhbHVlIGF0IGtleS5cbiAgICAgICAgICAgIGlkTGlzdCA9IGFwKGFwKFthc3NvYyhrZXkpXSwgbmV3VmFscyksIGlkTGlzdCk7XG4gICAgICAgIH0sIGlkU3BlYyk7XG4gICAgICAgIHJldHVybiBpZExpc3Q7XG4gICAgfVxuXG4gICAgLyogbXVsdGlHcmFwaCBpcyB1c2VkIG9ubHkgZm9yIHRlc3RpbmcgY2lyY3VsYXJpdHlcbiAgICAgKlxuICAgICAqIEVhY2ggY29tcG9uZW50K3Byb3BlcnR5IHRoYXQgaXMgdXNlZCBhcyBhbiBpbnB1dCBvciBvdXRwdXQgaXMgYWRkZWQgYXMgYSBub2RlXG4gICAgICogdG8gYSBkaXJlY3RlZCBncmFwaCB3aXRoIGEgZGVwZW5kZW5jeSBmcm9tIGVhY2ggaW5wdXQgdG8gZWFjaCBvdXRwdXQuIFRoZVxuICAgICAqIGZ1bmN0aW9uIHRyaWdnZXJEZWZhdWx0U3RhdGUgaW4gaW5kZXguanMgdGhlbiBjaGVja3MgdGhpcyBncmFwaCBmb3IgY2lyY3VsYXJpdHkuXG4gICAgICpcbiAgICAgKiBJbiBvcmRlciB0byBhbGxvdyB0aGUgc2FtZSBjb21wb25lbnQrcHJvcGVydHkgdG8gYmUgYm90aCBhbiBpbnB1dCBhbmQgb3V0cHV0XG4gICAgICogb2YgdGhlIHNhbWUgY2FsbGJhY2ssIGEgdHdvIHBhc3MgYXBwcm9hY2ggaXMgdXNlZC5cbiAgICAgKlxuICAgICAqIEluIHRoZSBmaXJzdCBwYXNzLCB0aGUgZ3JhcGggaXMgYnVpbHQgdXAgbm9ybWFsbHkgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXRcbiAgICAgKiBpbiBjYXNlcyB3aGVyZSBhbiBvdXRwdXQgaXMgYWxzbyBhbiBpbnB1dCB0byB0aGUgc2FtZSBjYWxsYmFjayBhIHNwZWNpYWxcbiAgICAgKiBcIm91dHB1dFwiIG5vZGUgaXMgYWRkZWQgYW5kIHRoZSBkZXBlbmRlbmNpZXMgdGFyZ2V0IHRoaXMgb3V0cHV0IG5vZGUgaW5zdGVhZC5cbiAgICAgKiBGb3IgZXhhbXBsZSwgaWYgYHNsaWRlci52YWx1ZWAgaXMgYm90aCBhbiBpbnB1dCBhbmQgYW4gb3V0cHV0LCB0aGVuIHRoZSBhIG5ld1xuICAgICAqIG5vZGUgYHNsaWRlci52YWx1ZV9fb3V0cHV0YCB3aWxsIGJlIGFkZGVkIHdpdGggYSBkZXBlbmRlbmN5IGZyb20gYHNsaWRlci52YWx1ZWBcbiAgICAgKiB0byBgc2xpZGVyLnZhbHVlX19vdXRwdXRgLiBTcGxpdHRpbmcgdGhlIGlucHV0IGFuZCBvdXRwdXQgaW50byBzZXBhcmF0ZSBub2Rlc1xuICAgICAqIHJlbW92ZXMgdGhlIGNpcmN1bGFyaXR5LlxuICAgICAqXG4gICAgICogSW4gb3JkZXIgdG8gc3RpbGwgZGV0ZWN0IG90aGVyIGZvcm1zIG9mIGNpcmN1bGFyaXR5LCBpdCBpcyBuZWNlc3NhcnkgdG8gZG8gYVxuICAgICAqIHNlY29uZCBwYXNzIGFuZCBhZGQgdGhlIG5ldyBvdXRwdXQgbm9kZXMgYXMgYSBkZXBlbmRlbmN5IGluIGFueSAqb3RoZXIqIGNhbGxiYWNrc1xuICAgICAqIHdoZXJlIHRoZSBvcmlnaW5hbCBub2RlIHdhcyBhbiBpbnB1dC4gQ29udGludWluZyB0aGUgZXhhbXBsZSwgYW55IG90aGVyIGNhbGxiYWNrXG4gICAgICogdGhhdCBoYWQgYHNsaWRlci52YWx1ZWAgYXMgYW4gaW5wdXQgZGVwZW5kZW5jeSBhbHNvIG5lZWRzIHRvIGhhdmVcbiAgICAgKiBgc2xpZGVyLnZhbHVlX19vdXRwdXRgIGFzIGEgZGVwZW5kZW5jeS4gVG8gbWFrZSB0aGlzIGVmZmljaWVudCwgYWxsIHRoZSBpbnB1dHNcbiAgICAgKiBhbmQgb3V0cHV0cyBmb3IgZWFjaCBjYWxsYmFjayBhcmUgc3RvcmVkIGR1cmluZyB0aGUgZmlyc3QgcGFzcy5cbiAgICAgKi9cblxuICAgIGNvbnN0IG91dHB1dFRhZyA9ICdfX291dHB1dCc7XG4gICAgY29uc3QgZHVwbGljYXRlT3V0cHV0cyA9IFtdO1xuICAgIGNvbnN0IGNiSW4gPSBbXTtcbiAgICBjb25zdCBjYk91dCA9IFtdO1xuXG4gICAgZnVuY3Rpb24gYWRkSW5wdXRUb011bHRpKGluSWRQcm9wLCBvdXRJZFByb3AsIGZpcnN0UGFzcyA9IHRydWUpIHtcbiAgICAgICAgaWYgKCFjb25maWcudmFsaWRhdGVfY2FsbGJhY2tzKSByZXR1cm47XG4gICAgICAgIG11bHRpR3JhcGguYWRkTm9kZShpbklkUHJvcCk7XG4gICAgICAgIG11bHRpR3JhcGguYWRkRGVwZW5kZW5jeShpbklkUHJvcCwgb3V0SWRQcm9wKTtcbiAgICAgICAgLy8gb25seSBzdG9yZSBjYWxsYmFjayBpbnB1dHMgYW5kIG91dHB1dHMgZHVyaW5nIHRoZSBmaXJzdCBwYXNzXG4gICAgICAgIGlmIChmaXJzdFBhc3MpIHtcbiAgICAgICAgICAgIGNiSW5bY2JJbi5sZW5ndGggLSAxXS5wdXNoKGluSWRQcm9wKTtcbiAgICAgICAgICAgIGNiT3V0W2NiT3V0Lmxlbmd0aCAtIDFdLnB1c2gob3V0SWRQcm9wKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlZERlcGVuZGVuY2llcy5mb3JFYWNoKGRlcGVuZGVuY3kgPT4ge1xuICAgICAgICBjb25zdCB7b3V0cHV0cywgaW5wdXRzfSA9IGRlcGVuZGVuY3k7XG5cbiAgICAgICAgLy8gbmV3IGNhbGxiYWNrLCBhZGQgYW4gZW1wdHkgYXJyYXkgZm9yIGl0cyBpbnB1dHMgYW5kIG91dHB1dHNcbiAgICAgICAgY2JJbi5wdXNoKFtdKTtcbiAgICAgICAgY2JPdXQucHVzaChbXSk7XG5cbiAgICAgICAgZnVuY3Rpb24gYWRkT3V0cHV0VG9NdWx0aShvdXRJZEZpbmFsLCBvdXRJZFByb3ApIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnLnZhbGlkYXRlX2NhbGxiYWNrcykgcmV0dXJuO1xuICAgICAgICAgICAgbXVsdGlHcmFwaC5hZGROb2RlKG91dElkUHJvcCk7XG4gICAgICAgICAgICBpbnB1dHMuZm9yRWFjaChpbk9iaiA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qge2lkOiBpbklkLCBwcm9wZXJ0eX0gPSBpbk9iajtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluSWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluSWRMaXN0ID0gbWFrZUFsbElkcyhpbklkLCBvdXRJZEZpbmFsKTtcbiAgICAgICAgICAgICAgICAgICAgaW5JZExpc3QuZm9yRWFjaChpZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJbnB1dFRvTXVsdGkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZUlkQW5kUHJvcCh7aWQsIHByb3BlcnR5fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SWRQcm9wXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhZGRJbnB1dFRvTXVsdGkoY29tYmluZUlkQW5kUHJvcChpbk9iaiksIG91dElkUHJvcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSdsbCBjb250aW51ZSB0byB1c2UgZGVwLm91dHB1dCBhcyBpdHMgaWQsIGJ1dCBhZGQgb3V0cHV0cyBhcyB3ZWxsXG4gICAgICAgIC8vIGZvciBjb252ZW5pZW5jZSBhbmQgc3ltbWV0cnkgd2l0aCB0aGUgc3RydWN0dXJlIG9mIGlucHV0cyBhbmQgc3RhdGUuXG4gICAgICAgIC8vIEFsc28gY29sbGVjdCBNQVRDSCBrZXlzIGluIHRoZSBvdXRwdXQgKGFsbCBvdXRwdXRzIG11c3Qgc2hhcmUgdGhlc2UpXG4gICAgICAgIC8vIGFuZCBBTEwga2V5cyBpbiB0aGUgZmlyc3Qgb3V0cHV0IChuZWVkIG5vdCBiZSBzaGFyZWQgYnV0IHdlJ2xsIHVzZVxuICAgICAgICAvLyB0aGUgZmlyc3Qgb3V0cHV0IGZvciBjYWxjdWxhdGlvbnMpIGZvciBsYXRlciBjb252ZW5pZW5jZS5cbiAgICAgICAgY29uc3Qge21hdGNoS2V5c30gPSBmaW5kV2lsZGNhcmRLZXlzKFxuICAgICAgICAgICAgb3V0cHV0cy5sZW5ndGggPyBvdXRwdXRzWzBdLmlkIDogdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGZpcnN0U2luZ2xlT3V0cHV0ID0gZmluZEluZGV4KG8gPT4gIWlzTXVsdGlWYWx1ZWQoby5pZCksIG91dHB1dHMpO1xuICAgICAgICBjb25zdCBmaW5hbERlcGVuZGVuY3kgPSBtZXJnZVJpZ2h0KFxuICAgICAgICAgICAge21hdGNoS2V5cywgZmlyc3RTaW5nbGVPdXRwdXQsIG91dHB1dHN9LFxuICAgICAgICAgICAgZGVwZW5kZW5jeVxuICAgICAgICApO1xuXG4gICAgICAgIG91dHB1dHMuZm9yRWFjaChvdXRJZFByb3AgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2lkOiBvdXRJZCwgcHJvcGVydHl9ID0gb3V0SWRQcm9wO1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBvdXRwdXQgaXMgYWxzbyBhbiBpbnB1dCB0byB0aGUgc2FtZSBjYWxsYmFja1xuICAgICAgICAgICAgbGV0IGFsc29JbnB1dDtcbiAgICAgICAgICAgIGlmIChjb25maWcudmFsaWRhdGVfY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgYWxzb0lucHV0ID0gY2hlY2tJbk91dE92ZXJsYXAob3V0SWRQcm9wLCBpbnB1dHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvdXRJZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnZhbGlkYXRlX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRJZExpc3QgPSBtYWtlQWxsSWRzKG91dElkLCB7fSk7XG4gICAgICAgICAgICAgICAgICAgIG91dElkTGlzdC5mb3JFYWNoKGlkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBPdXRJZFByb3AgPSB7aWQsIHByb3BlcnR5fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvdXRJZE5hbWUgPSBjb21iaW5lSWRBbmRQcm9wKHRlbXBPdXRJZFByb3ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBvdXRwdXQgaXMgYWxzbyBhbiBpbnB1dCwgYWRkIGBvdXRwdXRUYWdgIHRvIHRoZSBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxzb0lucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlT3V0cHV0cy5wdXNoKHRlbXBPdXRJZFByb3ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dElkTmFtZSArPSBvdXRwdXRUYWc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXRUb011bHRpKGlkLCBvdXRJZE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWRkUGF0dGVybihvdXRwdXRQYXR0ZXJuTWFwLCBvdXRJZCwgcHJvcGVydHksIGZpbmFsRGVwZW5kZW5jeSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcudmFsaWRhdGVfY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvdXRJZE5hbWUgPSBjb21iaW5lSWRBbmRQcm9wKG91dElkUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgb3V0cHV0IGlzIGFsc28gYW4gaW5wdXQsIGFkZCBgb3V0cHV0VGFnYCB0byB0aGUgbmFtZVxuICAgICAgICAgICAgICAgICAgICBpZiAoYWxzb0lucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVPdXRwdXRzLnB1c2gob3V0SWRQcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dElkTmFtZSArPSBvdXRwdXRUYWc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0VG9NdWx0aSh7fSwgb3V0SWROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWRkTWFwKG91dHB1dE1hcCwgb3V0SWQsIHByb3BlcnR5LCBmaW5hbERlcGVuZGVuY3kpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpbnB1dHMuZm9yRWFjaChpbnB1dE9iamVjdCA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aWQ6IGluSWQsIHByb3BlcnR5OiBpblByb3B9ID0gaW5wdXRPYmplY3Q7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGluSWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgYWRkUGF0dGVybihpbnB1dFBhdHRlcm5NYXAsIGluSWQsIGluUHJvcCwgZmluYWxEZXBlbmRlbmN5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYWRkTWFwKGlucHV0TWFwLCBpbklkLCBpblByb3AsIGZpbmFsRGVwZW5kZW5jeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIG91dHB1dFBhdHRlcm5zID0gb2ZmbG9hZFBhdHRlcm5zKG91dHB1dFBhdHRlcm5NYXAsIG91dHB1dFBhdHRlcm5zKTtcbiAgICBpbnB1dFBhdHRlcm5zID0gb2ZmbG9hZFBhdHRlcm5zKGlucHV0UGF0dGVybk1hcCwgaW5wdXRQYXR0ZXJucyk7XG5cbiAgICAvLyBzZWNvbmQgcGFzcyBmb3IgYWRkaW5nIG5ldyBvdXRwdXQgbm9kZXMgYXMgZGVwZW5kZW5jaWVzIHdoZXJlIG5lZWRlZFxuICAgIGR1cGxpY2F0ZU91dHB1dHMuZm9yRWFjaChkdXBlT3V0SWRQcm9wID0+IHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxOYW1lID0gY29tYmluZUlkQW5kUHJvcChkdXBlT3V0SWRQcm9wKTtcbiAgICAgICAgY29uc3QgbmV3TmFtZSA9IG9yaWdpbmFsTmFtZS5jb25jYXQob3V0cHV0VGFnKTtcbiAgICAgICAgZm9yICh2YXIgY250ID0gMDsgY250IDwgY2JJbi5sZW5ndGg7IGNudCsrKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBpbnB1dCB0byB0aGUgY2FsbGJhY2tcbiAgICAgICAgICAgIGlmIChjYkluW2NudF0uc29tZShpbk5hbWUgPT4gaW5OYW1lID09PSBvcmlnaW5hbE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgLyogbWFrZSBzdXJlIGl0J3Mgbm90IGFsc28gYW4gb3V0cHV0IG9mIHRoZSBjYWxsYmFja1xuICAgICAgICAgICAgICAgICAqICh0aGlzIHdpbGwgYmUgdGhlIG9yaWdpbmFsIGNhbGxiYWNrKVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGlmICghY2JPdXRbY250XS5zb21lKG91dE5hbWUgPT4gb3V0TmFtZSA9PT0gbmV3TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2JPdXRbY250XS5mb3JFYWNoKG91dE5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkSW5wdXRUb011bHRpKG5ld05hbWUsIG91dE5hbWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZW5kID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgaWYgKCF3aW5kb3cuZGFzaF9jb21wb25lbnRfYXBpKSB7XG4gICAgICAgIHdpbmRvdy5kYXNoX2NvbXBvbmVudF9hcGkgPSB7fTtcbiAgICB9XG4gICAgd2luZG93LmRhc2hfY29tcG9uZW50X2FwaS5jYWxsYmFja0dyYXBoVGltZSA9IChlbmQgLSBzdGFydCkudG9GaXhlZCgyKTtcblxuICAgIHJldHVybiBmaW5hbEdyYXBocztcbn1cblxuZnVuY3Rpb24gZmluZFdpbGRjYXJkS2V5cyhpZCkge1xuICAgIGNvbnN0IG1hdGNoS2V5cyA9IFtdO1xuICAgIGNvbnN0IGFsbHNtYWxsZXJLZXlzID0gW107XG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yRWFjaE9iakluZGV4ZWQoKHZhbCwga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsID09PSBNQVRDSCkge1xuICAgICAgICAgICAgICAgIG1hdGNoS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbCA9PT0gQUxMU01BTExFUikge1xuICAgICAgICAgICAgICAgIGFsbHNtYWxsZXJLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgaWQpO1xuICAgICAgICBtYXRjaEtleXMuc29ydCgpO1xuICAgICAgICBhbGxzbWFsbGVyS2V5cy5zb3J0KCk7XG4gICAgfVxuICAgIHJldHVybiB7bWF0Y2hLZXlzLCBhbGxzbWFsbGVyS2V5c307XG59XG5cbi8qXG4gKiBEbyB0aGUgZ2l2ZW4gaWQgdmFsdWVzIGB2YWxzYCBtYXRjaCB0aGUgcGF0dGVybiBgcGF0dGVyblZhbHNgP1xuICogYGtleXNgLCBgcGF0dGVyblZhbHNgLCBhbmQgYHZhbHNgIGFyZSBhbGwgYXJyYXlzLCBhbmQgd2UgYWxyZWFkeSBrbm93IHRoYXRcbiAqIHdlJ3JlIG9ubHkgbG9va2luZyBhdCBpZHMgd2l0aCB0aGUgc2FtZSBrZXlzIGFzIHRoZSBwYXR0ZXJuLlxuICpcbiAqIE9wdGlvbmFsbHksIGluY2x1ZGUgYW5vdGhlciByZWZlcmVuY2Ugc2V0IG9mIHRoZSBzYW1lIC0gdG8gZW5zdXJlIHRoZVxuICogY29ycmVjdCBtYXRjaGluZyBvZiBNQVRDSCBvciBBTExTTUFMTEVSIGJldHdlZW4gaW5wdXQgYW5kIG91dHB1dCBpdGVtcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlkTWF0Y2goXG4gICAga2V5cyxcbiAgICB2YWxzLFxuICAgIHBhdHRlcm5WYWxzLFxuICAgIHJlZktleXMsXG4gICAgcmVmVmFscyxcbiAgICByZWZQYXR0ZXJuVmFsc1xuKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHZhbHNbaV07XG4gICAgICAgIGNvbnN0IHBhdHRlcm5WYWwgPSBwYXR0ZXJuVmFsc1tpXTtcbiAgICAgICAgaWYgKHBhdHRlcm5WYWwud2lsZCkge1xuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHNlY29uZCBpZCwgY29tcGFyZSB0aGUgd2lsZGNhcmQgdmFsdWVzLlxuICAgICAgICAgICAgLy8gV2l0aG91dCBhIHNlY29uZCBpZCwgYWxsIHdpbGRjYXJkcyBwYXNzIGF0IHRoaXMgc3RhZ2UuXG4gICAgICAgICAgICBpZiAocmVmS2V5cyAmJiBwYXR0ZXJuVmFsICE9PSBBTEwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZJbmRleCA9IHJlZktleXMuaW5kZXhPZihrZXlzW2ldKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZQYXR0ZXJuVmFsID0gcmVmUGF0dGVyblZhbHNbcmVmSW5kZXhdO1xuICAgICAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjay4gU2hvdWxkbid0IGV2ZXIgZmFpbCB0aGlzLCBpZiB0aGUgYmFjayBlbmRcbiAgICAgICAgICAgICAgICAvLyBkaWQgaXRzIGpvYiB2YWxpZGF0aW5nIGNhbGxiYWNrcy5cbiAgICAgICAgICAgICAgICAvLyBZb3UgY2FuJ3QgcmVzb2x2ZSBhbiBpbnB1dCBhZ2FpbnN0IGFuIGlucHV0LCBiZWNhdXNlXG4gICAgICAgICAgICAgICAgLy8gdHdvIEFMTFNNQUxMRVIncyB3b3VsZG4ndCBtYWtlIHNlbnNlIVxuICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuVmFsID09PSBBTExTTUFMTEVSICYmIHJlZlBhdHRlcm5WYWwgPT09IEFMTFNNQUxMRVIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ludmFsaWQgd2lsZGNhcmQgaWQgcGFpcjogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuVmFscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmS2V5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmUGF0dGVyblZhbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlZhbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGlkVmFsU29ydCh2YWwsIHJlZlZhbHNbcmVmSW5kZXhdKSAhPT1cbiAgICAgICAgICAgICAgICAgICAgKHBhdHRlcm5WYWwgPT09IEFMTFNNQUxMRVJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcmVmUGF0dGVyblZhbCA9PT0gQUxMU01BTExFUlxuICAgICAgICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICAgICAgICA6IDApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodmFsICE9PSBwYXR0ZXJuVmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbnlWYWxzKHBhdHRlcm5WYWxzLCB2YWxzKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBhdHRlcm5WYWxzW2ldID09PSBNQVRDSCkge1xuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHZhbHNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVzLmxlbmd0aCA/IEpTT04uc3RyaW5naWZ5KG1hdGNoZXMpIDogJyc7XG59XG5cbi8qXG4gKiBEb2VzIHRoaXMgaXRlbSAoaW5wdXQgLyBvdXRwdXQgLyBzdGF0ZSkgc3VwcG9ydCBtdWx0aXBsZSB2YWx1ZXM/XG4gKiBzdHJpbmcgSURzIGRvIG5vdDsgd2lsZGNhcmQgSURzIG9ubHkgZG8gaWYgdGhleSBjb250YWluIEFMTCBvciBBTExTTUFMTEVSXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc011bHRpVmFsdWVkKHtpZH0pIHtcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSAnb2JqZWN0JyAmJiBhbnkodiA9PiB2Lm11bHRpLCB2YWx1ZXMoaWQpKTtcbn1cblxuLypcbiAqIEZvciBhIGdpdmVuIG91dHB1dCBpZCBhbmQgcHJvcCwgZmluZCB0aGUgY2FsbGJhY2sgZ2VuZXJhdGluZyBpdC5cbiAqIElmIG5vIGNhbGxiYWNrIGlzIGZvdW5kLCByZXR1cm5zIGZhbHNlLlxuICogSWYgb25lIGlzIGZvdW5kLCByZXR1cm5zOlxuICoge1xuICogICAgIGNhbGxiYWNrOiB0aGUgY2FsbGJhY2sgc3BlYyB7b3V0cHV0cywgaW5wdXRzLCBzdGF0ZSBldGN9XG4gKiAgICAgYW55VmFsczogc3RyaW5naWZpZWQgbGlzdCBvZiByZXNvbHZlZCBNQVRDSCBrZXlzIHdlIG1hdGNoZWRcbiAqICAgICByZXNvbHZlZElkOiB0aGUgXCJvdXRwdXRzXCIgaWQgc3RyaW5nIHBsdXMgTUFUQ0ggdmFsdWVzIHdlIG1hdGNoZWRcbiAqICAgICBnZXRPdXRwdXRzOiBhY2Nlc3NvciBmdW5jdGlvbiB0byBnaXZlIGFsbCByZXNvbHZlZCBvdXRwdXRzIG9mIHRoaXNcbiAqICAgICAgICAgY2FsbGJhY2suIFRha2VzIGBwYXRoc2AgYXMgYXJndW1lbnQgdG8gYXBwbHkgd2hlbiB0aGUgY2FsbGJhY2sgaXNcbiAqICAgICAgICAgZGlzcGF0Y2hlZCwgaW4gY2FzZSBhIHByZXZpb3VzIGNhbGxiYWNrIGhhcyBhbHRlcmVkIHRoZSBsYXlvdXQuXG4gKiAgICAgICAgIFRoZSByZXN1bHQgaXMgYSBsaXN0IG9mIHtpZCAoc3RyaW5nIG9yIG9iamVjdCksIHByb3BlcnR5IChzdHJpbmcpfVxuICogICAgIGdldElucHV0czogc2FtZSBmb3IgaW5wdXRzXG4gKiAgICAgZ2V0U3RhdGU6IHNhbWUgZm9yIHN0YXRlXG4gKiAgICAgY2hhbmdlZFByb3BJZHM6IGFuIG9iamVjdCBvZiB7W2lkQW5kUHJvcF06IHZ9IHRyaWdnZXJpbmcgdGhpcyBjYWxsYmFja1xuICogICAgICAgICB2ID0gRElSRUNUICgyKTogdGhlIHByb3Agd2FzIGNoYW5nZWQgaW4gdGhlIGZyb250IGVuZCwgc28gZGVwZW5kZW50XG4gKiAgICAgICAgICAgICBjYWxsYmFja3MgKk1VU1QqIGJlIGV4ZWN1dGVkLlxuICogICAgICAgICB2ID0gSU5ESVJFQ1QgKDEpOiB0aGUgcHJvcCBpcyBleHBlY3RlZCB0byBiZSBjaGFuZ2VkIGJ5IGEgY2FsbGJhY2ssXG4gKiAgICAgICAgICAgICBidXQgaWYgdGhpcyBpcyBwcmV2ZW50ZWQsIGRlcGVuZGVudCBjYWxsYmFja3MgbWF5IGJlIHBydW5lZC5cbiAqICAgICBpbml0aWFsQ2FsbDogYm9vbGVhbiwgaWYgdHJ1ZSB3ZSBkb24ndCByZXF1aXJlIGFueSBjaGFuZ2VkUHJvcElkc1xuICogICAgICAgICB0byBrZWVwIHRoaXMgY2FsbGJhY2sgYXJvdW5kLCBhcyBpdCdzIHRoZSBpbml0aWFsIGNhbGwgdG8gcG9wdWxhdGVcbiAqICAgICAgICAgdGhpcyB2YWx1ZSBvbiBwYWdlIGxvYWQgb3IgY2hhbmdpbmcgcGFydCBvZiB0aGUgbGF5b3V0LlxuICogICAgICAgICBCeSBkZWZhdWx0IHRoaXMgaXMgdHJ1ZSBmb3IgY2FsbGJhY2tzIGdlbmVyYXRlZCBieVxuICogICAgICAgICBnZXRDYWxsYmFja0J5T3V0cHV0LCBmYWxzZSBmcm9tIGdldENhbGxiYWNrc0J5SW5wdXQuXG4gKiB9XG4gKi9cbmZ1bmN0aW9uIGdldENhbGxiYWNrQnlPdXRwdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3ApIHtcbiAgICBsZXQgcmVzb2x2ZTtcbiAgICBsZXQgY2FsbGJhY2s7XG4gICAgbGV0IGFueVZhbHMgPSAnJztcbiAgICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBzdGFuZGFyZCBpZCB2ZXJzaW9uXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IChncmFwaHMub3V0cHV0TWFwW2lkXSB8fCB7fSlbcHJvcF07XG4gICAgICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2tzWzBdO1xuICAgICAgICAgICAgcmVzb2x2ZSA9IHJlc29sdmVEZXBzKCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyB3aWxkY2FyZCB2ZXJzaW9uXG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpZCkuc29ydCgpO1xuICAgICAgICBjb25zdCB2YWxzID0gcHJvcHMoa2V5cywgaWQpO1xuICAgICAgICBjb25zdCBrZXlTdHIgPSBrZXlzLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSAoZ3JhcGhzLm91dHB1dFBhdHRlcm5zW2tleVN0cl0gfHwge30pW3Byb3BdO1xuICAgICAgICBpZiAocGF0dGVybnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuVmFscyA9IHBhdHRlcm5zW2ldLnZhbHVlcztcbiAgICAgICAgICAgICAgICBpZiAoaWRNYXRjaChrZXlzLCB2YWxzLCBwYXR0ZXJuVmFscykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBwYXR0ZXJuc1tpXS5jYWxsYmFja3NbMF07XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUgPSByZXNvbHZlRGVwcyhrZXlzLCB2YWxzLCBwYXR0ZXJuVmFscyk7XG4gICAgICAgICAgICAgICAgICAgIGFueVZhbHMgPSBnZXRBbnlWYWxzKHBhdHRlcm5WYWxzLCB2YWxzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghcmVzb2x2ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VSZXNvbHZlZENhbGxiYWNrKGNhbGxiYWNrLCByZXNvbHZlLCBhbnlWYWxzKTtcbn1cblxuZnVuY3Rpb24gYWRkUmVzb2x2ZWRGcm9tT3V0cHV0cyhjYWxsYmFjaywgb3V0UGF0dGVybiwgb3V0cywgbWF0Y2hlcykge1xuICAgIGNvbnN0IG91dDBLZXlzID0gT2JqZWN0LmtleXMob3V0UGF0dGVybi5pZCkuc29ydCgpO1xuICAgIGNvbnN0IG91dDBQYXR0ZXJuVmFscyA9IHByb3BzKG91dDBLZXlzLCBvdXRQYXR0ZXJuLmlkKTtcbiAgICBjb25zdCBmb3VuZENiSWRzID0ge307XG4gICAgb3V0cy5mb3JFYWNoKCh7aWQ6IG91dElkfSkgPT4ge1xuICAgICAgICBjb25zdCBvdXRWYWxzID0gcHJvcHMob3V0MEtleXMsIG91dElkKTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBtYWtlUmVzb2x2ZWRDYWxsYmFjayhcbiAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgcmVzb2x2ZURlcHMob3V0MEtleXMsIG91dFZhbHMsIG91dDBQYXR0ZXJuVmFscyksXG4gICAgICAgICAgICBnZXRBbnlWYWxzKG91dDBQYXR0ZXJuVmFscywgb3V0VmFscylcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qge3Jlc29sdmVkSWR9ID0gcmVzb2x2ZWQ7XG4gICAgICAgIGlmICghZm91bmRDYklkc1tyZXNvbHZlZElkXSkge1xuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHJlc29sdmVkKTtcbiAgICAgICAgICAgIGZvdW5kQ2JJZHNbcmVzb2x2ZWRJZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRBbGxSZXNvbHZlZEZyb21PdXRwdXRzKFxuICAgIHJlc29sdmUsXG4gICAgcGF0aHMsXG4gICAgbWF0Y2hlcyxcbiAgICB0cmlnZ2VyQW55VmFscyA9ICcnXG4pIHtcbiAgICByZXR1cm4gY2FsbGJhY2sgPT4ge1xuICAgICAgICBjb25zdCB7bWF0Y2hLZXlzLCBmaXJzdFNpbmdsZU91dHB1dCwgb3V0cHV0c30gPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKG1hdGNoS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpbmdsZU91dFBhdHRlcm4gPSBvdXRwdXRzW2ZpcnN0U2luZ2xlT3V0cHV0XTtcbiAgICAgICAgICAgIGlmIChzaW5nbGVPdXRQYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgYWRkUmVzb2x2ZWRGcm9tT3V0cHV0cyhcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgICAgIHNpbmdsZU91dFBhdHRlcm4sXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocGF0aHMpKHNpbmdsZU91dFBhdHRlcm4pLFxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgKiBJZiBldmVyeSBvdXRwdXQgaGFzIEFMTCB3ZSBuZWVkIHRvIHJlZHVjZSByZXNvbHZlZCBzZXRcbiAgICAgICAgICAgICAgICAgKiB0byBvbmUgaXRlbSBwZXIgY29tYmluYXRpb24gb2YgTUFUQ0ggdmFsdWVzLlxuICAgICAgICAgICAgICAgICAqIFRoYXQgd2lsbCBnaXZlIG9uZSByZXN1bHQgcGVyIGNhbGxiYWNrIGludm9jYXRpb24uXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3QgYW55U2VlbiA9IHt9O1xuICAgICAgICAgICAgICAgIG91dHB1dHMuZm9yRWFjaChvdXRQYXR0ZXJuID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0U2V0ID0gcmVzb2x2ZShwYXRocykob3V0UGF0dGVybikuZmlsdGVyKGkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hTdHIgPSBKU09OLnN0cmluZ2lmeShwcm9wcyhtYXRjaEtleXMsIGkuaWQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYW55U2VlblttYXRjaFN0cl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnlTZWVuW21hdGNoU3RyXSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhZGRSZXNvbHZlZEZyb21PdXRwdXRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRQYXR0ZXJuLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0U2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3V0cHV0cyBoYXZlIG5vIE1BVENIIGtleXMgKGZpeGVkLWlkIG91dHB1dHMgb3Igbm8gb3V0cHV0KS5cbiAgICAgICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgdHJpZ2dlcmluZyBpbnB1dCdzIE1BVENIIHZhbHVlcyBzbyB0aGF0XG4gICAgICAgICAgICAvLyBzZXBhcmF0ZSBNQVRDSCB0cmlnZ2VycyBwcm9kdWNlIGRpc3RpbmN0IHJlc29sdmVkSWRzIGFuZFxuICAgICAgICAgICAgLy8gYXJlbid0IGRlZHVwbGljYXRlZCBpbnRvIGEgc2luZ2xlIGZpcmluZy4gU2VlIGlzc3VlICMyNDYyLlxuICAgICAgICAgICAgY29uc3QgY2IgPSBtYWtlUmVzb2x2ZWRDYWxsYmFjayhjYWxsYmFjaywgcmVzb2x2ZSwgdHJpZ2dlckFueVZhbHMpO1xuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKGNiKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8qXG4gKiBGb3IgYSBnaXZlbiBpZCBhbmQgcHJvcCBmaW5kIGFsbCBjYWxsYmFja3MgaXQncyBhbiBpbnB1dCBvZi5cbiAqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHM6XG4gKiAgIHtjYWxsYmFjaywgcmVzb2x2ZWRJZCwgZ2V0T3V0cHV0cywgZ2V0SW5wdXRzLCBnZXRTdGF0ZX1cbiAqICAgU2VlIGdldENhbGxiYWNrQnlPdXRwdXQgZm9yIGRldGFpbHMuXG4gKlxuICogTm90ZSB0aGF0IGlmIHRoZSBvcmlnaW5hbCBpbnB1dCBjb250YWlucyBhbiBBTExTTUFMTEVSIHdpbGRjYXJkLFxuICogdGhlcmUgbWF5IGJlIG1hbnkgZW50cmllcyBmb3IgdGhlIHNhbWUgY2FsbGJhY2ssIGJ1dCBhbnkgZ2l2ZW4gb3V0cHV0XG4gKiAod2l0aCBhbiBNQVRDSCBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCdzIEFMTFNNQUxMRVIpIHdpbGwgb25seSBhcHBlYXJcbiAqIGluIG9uZSBlbnRyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdhdGNoZWRLZXlzKGlkLCBuZXdQcm9wcywgZ3JhcGhzKSB7XG4gICAgaWYgKCEoaWQgJiYgZ3JhcGhzICYmIG5ld1Byb3BzLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGlucHV0cyA9IGdyYXBocy5pbnB1dE1hcFtpZF07XG4gICAgICAgIHJldHVybiBpbnB1dHMgPyBuZXdQcm9wcy5maWx0ZXIobmV3UHJvcCA9PiBpbnB1dHNbbmV3UHJvcF0pIDogW107XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCk7XG4gICAgY29uc3QgdmFscyA9IHByb3BzKGtleXMsIGlkKTtcbiAgICBjb25zdCBrZXlTdHIgPSBrZXlzLmpvaW4oJywnKTtcbiAgICBjb25zdCBrZXlQYXR0ZXJucyA9IGdyYXBocy5pbnB1dFBhdHRlcm5zW2tleVN0cl07XG4gICAgaWYgKCFrZXlQYXR0ZXJucykge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBuZXdQcm9wcy5maWx0ZXIocHJvcCA9PiB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm5zID0ga2V5UGF0dGVybnNbcHJvcF07XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwYXR0ZXJucyAmJlxuICAgICAgICAgICAgcGF0dGVybnMuc29tZShwYXR0ZXJuID0+IGlkTWF0Y2goa2V5cywgdmFscywgcGF0dGVybi52YWx1ZXMpKVxuICAgICAgICApO1xuICAgIH0pO1xufVxuXG4vKlxuICogUmV0dXJuIGEgbGlzdCBvZiBhbGwgY2FsbGJhY2tzIHJlZmVyZW5jaW5nIGEgY2h1bmsgb2YgdGhlIGxheW91dCxcbiAqIGVpdGhlciBhcyBpbnB1dHMgb3Igb3V0cHV0cy5cbiAqXG4gKiBvcHRzLm91dHB1dHNPbmx5OiBib29sZWFuLCBzZXQgdHJ1ZSB3aGVuIGNyYXdsaW5nIHRoZSAqd2hvbGUqIGxheW91dCxcbiAqICAgYmVjYXVzZSBvdXRwdXRzIGFyZSBlbm91Z2ggdG8gZ2V0IGV2ZXJ5dGhpbmcuXG4gKiBvcHRzLnJlbW92ZWRBcnJheUlucHV0c09ubHk6IGJvb2xlYW4sIHNldCB0cnVlIHRvIG9ubHkgbG9vayBmb3IgaW5wdXRzIGluXG4gKiAgIHdpbGRjYXJkIGFycmF5cyAoQUxMIG9yIEFMTFNNQUxMRVIpLCBubyBvdXRwdXRzLiBUaGlzIGdldHMgdXNlZCB0byB0ZWxsXG4gKiAgIHdoZW4gdGhlIG5ldyAqYWJzZW5jZSogb2YgYSBnaXZlbiBjb21wb25lbnQgc2hvdWxkIHRyaWdnZXIgYSBjYWxsYmFjay5cbiAqIG9wdHMubmV3UGF0aHM6IHBhdGhzIG9iamVjdCBhZnRlciB0aGUgZWRpdCAtIHRvIGJlIHVzZWQgd2l0aFxuICogICByZW1vdmVkQXJyYXlJbnB1dHNPbmx5IHRvIGRldGVybWluZSBpZiB0aGUgY2FsbGJhY2sgc3RpbGwgaGFzIGl0cyBvdXRwdXRzXG4gKiBvcHRzLmNodW5rUGF0aDogcGF0aCB0byB0aGUgbmV3IGNodW5rIC0gdXNlZCB0byBkZXRlcm1pbmUgaWYgYW55IG91dHB1dHMgYXJlXG4gKiAgIG91dHNpZGUgb2YgdGhpcyBjaHVuaywgYmVjYXVzZSB0aGlzIGRldGVybWluZXMgd2hldGhlciBpbnB1dHMgaW5zaWRlIHRoZVxuICogICBjaHVuayBjb3VudCBhcyBoYXZpbmcgY2hhbmdlZFxuICpcbiAqIFJldHVybnMgYW4gYXJyYXkgb2Ygb2JqZWN0czpcbiAqICAge2NhbGxiYWNrLCByZXNvbHZlZElkLCBnZXRPdXRwdXRzLCBnZXRJbnB1dHMsIGdldFN0YXRlLCAuLi5ldGN9XG4gKiAgIFNlZSBnZXRDYWxsYmFja0J5T3V0cHV0IGZvciBkZXRhaWxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5maWx0ZXJlZExheW91dENhbGxiYWNrcyhncmFwaHMsIHBhdGhzLCBsYXlvdXRDaHVuaywgb3B0cykge1xuICAgIGNvbnN0IHtvdXRwdXRzT25seSwgcmVtb3ZlZEFycmF5SW5wdXRzT25seSwgbmV3UGF0aHMsIGNodW5rUGF0aH0gPSBvcHRzO1xuICAgIGNvbnN0IGZvdW5kQ2JJZHMgPSB7fTtcbiAgICBjb25zdCBjYWxsYmFja3MgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGFkZENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY29uc3QgZm91bmRJbmRleCA9IGZvdW5kQ2JJZHNbY2FsbGJhY2sucmVzb2x2ZWRJZF07XG4gICAgICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmRDYiA9IGNhbGxiYWNrc1tmb3VuZEluZGV4XTtcbiAgICAgICAgICAgICAgICBmb3VuZENiLmNoYW5nZWRQcm9wSWRzID0gbWVyZ2VNYXgoXG4gICAgICAgICAgICAgICAgICAgIGZvdW5kQ2IuY2hhbmdlZFByb3BJZHMsXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNoYW5nZWRQcm9wSWRzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2suaW5pdGlhbENhbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmRDYi5pbml0aWFsQ2FsbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3VuZENiSWRzW2NhbGxiYWNrLnJlc29sdmVkSWRdID0gY2FsbGJhY2tzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRDYWxsYmFja0lmQXJyYXkoaWRTdHIpIHtcbiAgICAgICAgcmV0dXJuIGNiID0+XG4gICAgICAgICAgICBjYi5nZXRJbnB1dHMocGF0aHMpLnNvbWUoaW5pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaW5pKSAmJlxuICAgICAgICAgICAgICAgICAgICBpbmkuc29tZShpbmlqID0+IHN0cmluZ2lmeUlkKGluaWouaWQpID09PSBpZFN0cilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjYWxsYmFjayBzaG91bGQgdHJpZ2dlciBldmVuIHdpdGggbm8gY2hhbmdlZFByb3BzLFxuICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgcHJvcHMgdGhhdCBjaGFuZ2VkIG5vIGxvbmdlciBleGlzdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUga2luZCBvZiBhYnVzaW5nIHRoZSBgaW5pdGlhbENhbGxgIGZsYWcgaGVyZSwgaXQnc1xuICAgICAgICAgICAgICAgICAgICAvLyBtb3JlIGxpa2UgYSBcImZpbmFsIGNhbGxcIiBmb3IgdGhlIHJlbW92ZWQgaW5wdXRzLCBidXRcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjYXNlIGlzIG5vdCBzdWJqZWN0IHRvIGBwcmV2ZW50X2luaXRpYWxfY2FsbGAuXG4gICAgICAgICAgICAgICAgICAgIGlmIChmbGF0dGVuKGNiLmdldE91dHB1dHMobmV3UGF0aHMpKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiLmluaXRpYWxDYWxsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiLmNoYW5nZWRQcm9wSWRzID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRDYWxsYmFjayhjYik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZU9uZUlkKGlkLCBvdXRJZENhbGxiYWNrcywgaW5JZENhbGxiYWNrcykge1xuICAgICAgICBpZiAob3V0SWRDYWxsYmFja3MpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gb3V0SWRDYWxsYmFja3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYiA9IGdldENhbGxiYWNrQnlPdXRwdXQoZ3JhcGhzLCBwYXRocywgaWQsIHByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICBpZiAoY2IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGJhY2tzIGZvdW5kIGluIHRoZSBsYXlvdXQgYnkgb3V0cHV0IHNob3VsZCBhbHdheXMgcnVuXG4gICAgICAgICAgICAgICAgICAgIC8vIHVubGVzcyBzcGVjaWZpY2FsbHkgcmVxdWVzdGVkIG5vdCB0by5cbiAgICAgICAgICAgICAgICAgICAgLy8gaWUgdGhpcyBpcyB0aGUgaW5pdGlhbCBjYWxsIG9mIHRoaXMgY2FsbGJhY2sgZXZlbiBpZiBpdCdzXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdCB0aGUgcGFnZSBpbml0aWFsaXphdGlvbiBidXQganVzdCBhIG5ldyBsYXlvdXQgY2h1bmtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYi5jYWxsYmFjay5wcmV2ZW50X2luaXRpYWxfY2FsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2IuaW5pdGlhbENhbGwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2FsbGJhY2soY2IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghb3V0cHV0c09ubHkgJiYgaW5JZENhbGxiYWNrcykge1xuICAgICAgICAgICAgY29uc3QgbWF5YmVBZGRDYWxsYmFjayA9IHJlbW92ZWRBcnJheUlucHV0c09ubHlcbiAgICAgICAgICAgICAgICA/IGFkZENhbGxiYWNrSWZBcnJheShzdHJpbmdpZnlJZChpZCkpXG4gICAgICAgICAgICAgICAgOiBhZGRDYWxsYmFjaztcbiAgICAgICAgICAgIGxldCBoYW5kbGVUaGlzQ2FsbGJhY2sgPSBtYXliZUFkZENhbGxiYWNrO1xuICAgICAgICAgICAgaWYgKGNodW5rUGF0aCkge1xuICAgICAgICAgICAgICAgIGhhbmRsZVRoaXNDYWxsYmFjayA9IGNiID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgIWFsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHNXaXRoKGNodW5rUGF0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Y2soJ3BhdGgnLCBmbGF0dGVuKGNiLmdldE91dHB1dHMocGF0aHMpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXliZUFkZENhbGxiYWNrKGNiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGluSWRDYWxsYmFja3MpIHtcbiAgICAgICAgICAgICAgICBnZXRDYWxsYmFja3NCeUlucHV0KFxuICAgICAgICAgICAgICAgICAgICBncmFwaHMsXG4gICAgICAgICAgICAgICAgICAgIHBhdGhzLFxuICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgIElORElSRUNUXG4gICAgICAgICAgICAgICAgKS5mb3JFYWNoKGhhbmRsZVRoaXNDYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmF3bExheW91dChsYXlvdXRDaHVuaywgY2hpbGQgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IHBhdGgoWydwcm9wcycsICdpZCddLCBjaGlsZCk7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgIXJlbW92ZWRBcnJheUlucHV0c09ubHkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVPbmVJZChpZCwgZ3JhcGhzLm91dHB1dE1hcFtpZF0sIGdyYXBocy5pbnB1dE1hcFtpZF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlTdHIgPSBPYmplY3Qua2V5cyhpZCkuc29ydCgpLmpvaW4oJywnKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVPbmVJZChcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgICFyZW1vdmVkQXJyYXlJbnB1dHNPbmx5ICYmIGdyYXBocy5vdXRwdXRQYXR0ZXJuc1trZXlTdHJdLFxuICAgICAgICAgICAgICAgICAgICBncmFwaHMuaW5wdXRQYXR0ZXJuc1trZXlTdHJdXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1hcChcbiAgICAgICAgY2IgPT4gKHtcbiAgICAgICAgICAgIC4uLmNiLFxuICAgICAgICAgICAgcHJpb3JpdHk6IGdldFByaW9yaXR5KGdyYXBocywgcGF0aHMsIGNiKVxuICAgICAgICB9KSxcbiAgICAgICAgY2FsbGJhY2tzXG4gICAgKTtcbn1cbiIsImltcG9ydCB7b25jZSwgcGF0aH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHtjcmVhdGVBY3Rpb259IGZyb20gJ3JlZHV4LWFjdGlvbnMnO1xuaW1wb3J0IHthZGRSZXF1ZXN0ZWRDYWxsYmFja3N9IGZyb20gJy4vY2FsbGJhY2tzJztcbmltcG9ydCB7Z2V0QXBwU3RhdGV9IGZyb20gJy4uL3JlZHVjZXJzL2NvbnN0YW50cyc7XG5pbXBvcnQge2dldEFjdGlvbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0ICogYXMgY29va2llIGZyb20gJ2Nvb2tpZSc7XG5pbXBvcnQge3ZhbGlkYXRlQ2FsbGJhY2tzVG9MYXlvdXR9IGZyb20gJy4vZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7XG4gICAgaW5jbHVkZU9ic2VydmVycyxcbiAgICBnZXRMYXlvdXRDYWxsYmFja3MsXG4gICAgbWFrZVJlc29sdmVkQ2FsbGJhY2ssXG4gICAgcmVzb2x2ZURlcHNcbn0gZnJvbSAnLi9kZXBlbmRlbmNpZXNfdHMnO1xuaW1wb3J0IHtjb21wdXRlUGF0aHMsIGdldFBhdGh9IGZyb20gJy4vcGF0aHMnO1xuaW1wb3J0IHtyZWNvcmRVaUVkaXR9IGZyb20gJy4uL3BlcnNpc3RlbmNlJztcblxuZXhwb3J0IGNvbnN0IG9uRXJyb3IgPSBjcmVhdGVBY3Rpb24oZ2V0QWN0aW9uKCdPTl9FUlJPUicpKTtcbmV4cG9ydCBjb25zdCBzZXRBcHBMaWZlY3ljbGUgPSBjcmVhdGVBY3Rpb24oZ2V0QWN0aW9uKCdTRVRfQVBQX0xJRkVDWUNMRScpKTtcbmV4cG9ydCBjb25zdCBzZXRDb25maWcgPSBjcmVhdGVBY3Rpb24oZ2V0QWN0aW9uKCdTRVRfQ09ORklHJykpO1xuZXhwb3J0IGNvbnN0IGFkZEh0dHBIZWFkZXJzID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignQUREX0hUVFBfSEVBREVSUycpKTtcbmV4cG9ydCBjb25zdCBzZXRHcmFwaHMgPSBjcmVhdGVBY3Rpb24oZ2V0QWN0aW9uKCdTRVRfR1JBUEhTJykpO1xuZXhwb3J0IGNvbnN0IHNldEhvb2tzID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX0hPT0tTJykpO1xuZXhwb3J0IGNvbnN0IHNldExheW91dCA9IGNyZWF0ZUFjdGlvbihnZXRBY3Rpb24oJ1NFVF9MQVlPVVQnKSk7XG5leHBvcnQgY29uc3Qgc2V0UGF0aHMgPSBjcmVhdGVBY3Rpb24oZ2V0QWN0aW9uKCdTRVRfUEFUSFMnKSk7XG5leHBvcnQgY29uc3Qgc2V0UmVxdWVzdFF1ZXVlID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignU0VUX1JFUVVFU1RfUVVFVUUnKSk7XG5leHBvcnQgY29uc3QgaW5zZXJ0Q29tcG9uZW50ID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignSU5TRVJUX0NPTVBPTkVOVCcpKTtcbmV4cG9ydCBjb25zdCByZW1vdmVDb21wb25lbnQgPSBjcmVhdGVBY3Rpb24oZ2V0QWN0aW9uKCdSRU1PVkVfQ09NUE9ORU5UJykpO1xuXG5leHBvcnQgY29uc3Qgb25Qcm9wQ2hhbmdlID0gY3JlYXRlQWN0aW9uKGdldEFjdGlvbignT05fUFJPUF9DSEFOR0UnKSk7XG5leHBvcnQgY29uc3QgcmVzZXRDb21wb25lbnRTdGF0ZSA9IGNyZWF0ZUFjdGlvbihcbiAgICBnZXRBY3Rpb24oJ1JFU0VUX0NPTVBPTkVOVF9TVEFURScpXG4pO1xuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlUHJvcHMocGF5bG9hZCkge1xuICAgIHJldHVybiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHBhdGgocGF5bG9hZC5pdGVtcGF0aCwgZ2V0U3RhdGUoKS5sYXlvdXQpO1xuICAgICAgICByZWNvcmRVaUVkaXQoY29tcG9uZW50LCBwYXlsb2FkLnByb3BzLCBkaXNwYXRjaCk7XG4gICAgICAgIGRpc3BhdGNoKG9uUHJvcENoYW5nZShwYXlsb2FkKSk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGFkZENvbXBvbmVudFRvTGF5b3V0ID0gcGF5bG9hZCA9PiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgY29uc3Qge3BhdGhzfSA9IGdldFN0YXRlKCk7XG4gICAgZGlzcGF0Y2goaW5zZXJ0Q29tcG9uZW50KHBheWxvYWQpKTtcbiAgICBkaXNwYXRjaChcbiAgICAgICAgc2V0UGF0aHMoY29tcHV0ZVBhdGhzKHBheWxvYWQuY29tcG9uZW50LCBwYXlsb2FkLmNvbXBvbmVudFBhdGgsIHBhdGhzKSlcbiAgICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGRpc3BhdGNoRXJyb3IgPSBkaXNwYXRjaCA9PiAobWVzc2FnZSwgbGluZXMpID0+XG4gICAgZGlzcGF0Y2goXG4gICAgICAgIG9uRXJyb3Ioe1xuICAgICAgICAgICAgdHlwZTogJ2JhY2tFbmQnLFxuICAgICAgICAgICAgZXJyb3I6IHttZXNzYWdlLCBodG1sOiBsaW5lcy5qb2luKCdcXG4nKX1cbiAgICAgICAgfSlcbiAgICApO1xuXG5leHBvcnQgZnVuY3Rpb24gaHlkcmF0ZUluaXRpYWxPdXRwdXRzKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZGlzcGF0Y2gsIGdldFN0YXRlKSB7XG4gICAgICAgIHZhbGlkYXRlQ2FsbGJhY2tzVG9MYXlvdXQoZ2V0U3RhdGUoKSwgZGlzcGF0Y2hFcnJvcihkaXNwYXRjaCkpO1xuICAgICAgICB0cmlnZ2VyRGVmYXVsdFN0YXRlKGRpc3BhdGNoLCBnZXRTdGF0ZSk7XG4gICAgICAgIGRpc3BhdGNoKHNldEFwcExpZmVjeWNsZShnZXRBcHBTdGF0ZSgnSFlEUkFURUQnKSkpO1xuICAgIH07XG59XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlICovXG5jb25zdCBsb2dXYXJuaW5nT25jZSA9IG9uY2UoY29uc29sZS53YXJuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENTUkZIZWFkZXIoY29uZmlnKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdG9rZW5OYW1lID0gKGNvbmZpZyAmJiBjb25maWcuY3NyZl90b2tlbl9uYW1lKSB8fCAnX2NzcmZfdG9rZW4nO1xuICAgICAgICBjb25zdCBoZWFkZXJOYW1lID0gKGNvbmZpZyAmJiBjb25maWcuY3NyZl9oZWFkZXJfbmFtZSkgfHwgJ1gtQ1NSRlRva2VuJztcbiAgICAgICAgY29uc3QgY29va2llcyA9IGNvb2tpZS5wYXJzZShkb2N1bWVudC5jb29raWUpO1xuICAgICAgICBjb25zdCB0b2tlbiA9IGNvb2tpZXNbdG9rZW5OYW1lXTtcbiAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7W2hlYWRlck5hbWVdOiB0b2tlbn07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dXYXJuaW5nT25jZShlKTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdHJpZ2dlckRlZmF1bHRTdGF0ZShkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICBjb25zdCB7Z3JhcGhzLCBwYXRocywgbGF5b3V0fSA9IGdldFN0YXRlKCk7XG5cbiAgICAvLyBvdmVyYWxsT3JkZXIgd2lsbCBhc3NlcnQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGZvciBtdWx0aSBvdXRwdXQuXG4gICAgdHJ5IHtcbiAgICAgICAgZ3JhcGhzLk11bHRpR3JhcGgub3ZlcmFsbE9yZGVyKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgb25FcnJvcih7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2JhY2tFbmQnLFxuICAgICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdDaXJjdWxhciBEZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgICAgICAgICBodG1sOiBlcnIudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbGF5b3V0Q2FsbGJhY2tzID0gZ2V0TGF5b3V0Q2FsbGJhY2tzKFxuICAgICAgICBncmFwaHMsXG4gICAgICAgIHBhdGhzLFxuICAgICAgICBsYXlvdXQuY29tcG9uZW50cyxcbiAgICAgICAge1xuICAgICAgICAgICAgb3V0cHV0c09ubHk6IHRydWVcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBBbHNvIGluY2x1ZGUgbm8tb3V0cHV0IGFuZCBuby1pbnB1dCBjYWxsYmFja3MgdGhhdCBzaG91bGQgZmlyZSBvbiBpbml0aWFsIGxvYWRcbiAgICBjb25zdCBzcGVjaWFsQ2FsbGJhY2tzID0gKGdyYXBocy5jYWxsYmFja3MgfHwgW10pLnJlZHVjZSgoYWNjLCBjYikgPT4ge1xuICAgICAgICBpZiAoY2IucHJldmVudF9pbml0aWFsX2NhbGwpIHtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc05vT3V0cHV0ID0gY2Iubm9PdXRwdXQ7XG4gICAgICAgIGNvbnN0IGlzTm9JbnB1dCA9ICFjYi5ub091dHB1dCAmJiBjYi5pbnB1dHMubGVuZ3RoID09PSAwO1xuXG4gICAgICAgIGlmICghaXNOb091dHB1dCAmJiAhaXNOb0lucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBtYWtlUmVzb2x2ZWRDYWxsYmFjayhjYiwgcmVzb2x2ZURlcHMoKSwgJycpO1xuICAgICAgICByZXNvbHZlZC5pbml0aWFsQ2FsbCA9IHRydWU7XG5cbiAgICAgICAgaWYgKGlzTm9PdXRwdXQpIHtcbiAgICAgICAgICAgIC8vIE5vLW91dHB1dDogaW5jbHVkZSBpZiBubyBpbnB1dHMgb3IgYW55IGlucHV0IGlzIGluIGxheW91dFxuICAgICAgICAgICAgaWYgKGNiLmlucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBhY2MucHVzaChyZXNvbHZlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0cyA9IHJlc29sdmVkLmdldElucHV0cyhwYXRocyk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBpbnB1dHMuc29tZShpbnAgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaW5wKSA/IGlucC5sZW5ndGggPiAwIDogaW5wXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjLnB1c2gocmVzb2x2ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vLWlucHV0OiBpbmNsdWRlIGlmIGFueSBvdXRwdXQgaXMgaW4gbGF5b3V0XG4gICAgICAgICAgICBjb25zdCBvdXRwdXRzID0gcmVzb2x2ZWQuZ2V0T3V0cHV0cyhwYXRocyk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgb3V0cHV0cy5zb21lKG91dCA9PiAoQXJyYXkuaXNBcnJheShvdXQpID8gb3V0Lmxlbmd0aCA+IDAgOiBvdXQpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYWNjLnB1c2gocmVzb2x2ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG5cbiAgICBkaXNwYXRjaChhZGRSZXF1ZXN0ZWRDYWxsYmFja3MoWy4uLmxheW91dENhbGxiYWNrcywgLi4uc3BlY2lhbENhbGxiYWNrc10pKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlZG8gPSBtb3ZlSGlzdG9yeSgnUkVETycpO1xuZXhwb3J0IGNvbnN0IHVuZG8gPSBtb3ZlSGlzdG9yeSgnVU5ETycpO1xuZXhwb3J0IGNvbnN0IHJldmVydCA9IG1vdmVIaXN0b3J5KCdSRVZFUlQnKTtcblxuZnVuY3Rpb24gbW92ZUhpc3RvcnkoY2hhbmdlVHlwZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZGlzcGF0Y2gsIGdldFN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHtoaXN0b3J5LCBwYXRoc30gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBkaXNwYXRjaChjcmVhdGVBY3Rpb24oY2hhbmdlVHlwZSkoKSk7XG4gICAgICAgIGNvbnN0IHtpZCwgcHJvcHN9ID1cbiAgICAgICAgICAgIChjaGFuZ2VUeXBlID09PSAnUkVETydcbiAgICAgICAgICAgICAgICA/IGhpc3RvcnkuZnV0dXJlWzBdXG4gICAgICAgICAgICAgICAgOiBoaXN0b3J5LnBhc3RbaGlzdG9yeS5wYXN0Lmxlbmd0aCAtIDFdKSB8fCB7fTtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgcHJvcHNcbiAgICAgICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUFjdGlvbignVU5ET19QUk9QX0NIQU5HRScpKHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXBhdGg6IGdldFBhdGgocGF0aHMsIGlkKSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHNcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgZGlzcGF0Y2gobm90aWZ5T2JzZXJ2ZXJzKHtpZCwgcHJvcHN9KSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm90aWZ5T2JzZXJ2ZXJzKHtpZCwgcHJvcHN9KSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChkaXNwYXRjaCwgZ2V0U3RhdGUpIHtcbiAgICAgICAgY29uc3Qge2dyYXBocywgcGF0aHN9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICBhZGRSZXF1ZXN0ZWRDYWxsYmFja3MoaW5jbHVkZU9ic2VydmVycyhpZCwgcHJvcHMsIGdyYXBocywgcGF0aHMpKVxuICAgICAgICApO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVBc3luY0Vycm9yKGVyciwgbWVzc2FnZSwgZGlzcGF0Y2gpIHtcbiAgICAvLyBIYW5kbGUgaHRtbCBlcnJvciByZXNwb25zZXNcbiAgICBpZiAoZXJyICYmIHR5cGVvZiBlcnIudGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnIudGV4dCgpLnRoZW4odGV4dCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHttZXNzYWdlLCBodG1sOiB0ZXh0fTtcbiAgICAgICAgICAgIGRpc3BhdGNoKG9uRXJyb3Ioe3R5cGU6ICdiYWNrRW5kJywgZXJyb3J9KSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiB7bWVzc2FnZSwgaHRtbDogZXJyfTtcbiAgICAgICAgZGlzcGF0Y2gob25FcnJvcih7dHlwZTogJ2JhY2tFbmQnLCBlcnJvcn0pKTtcbiAgICB9XG59XG4iLCJpbXBvcnQge3BhdGh9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7aXNSZWFkeX0gZnJvbSAnQHBsb3RseS9kYXNoLWNvbXBvbmVudC1wbHVnaW5zJztcblxuaW1wb3J0IFJlZ2lzdHJ5IGZyb20gJy4uL3JlZ2lzdHJ5JztcbmltcG9ydCB7Z2V0UGF0aH0gZnJvbSAnLi9wYXRocyc7XG5pbXBvcnQge3N0cmluZ2lmeUlkfSBmcm9tICcuL2RlcGVuZGVuY2llcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChsYXlvdXQsIHBhdGhzLCB0YXJnZXRzKSA9PiB7XG4gICAgaWYgKCF0YXJnZXRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcblxuICAgIGNvbnN0IHtldmVudHN9ID0gcGF0aHM7XG4gICAgY29uc3QgcmVuZGVyZWQgPSBuZXcgUHJvbWlzZShyZXNvbHZlUmVuZGVyZWQgPT4ge1xuICAgICAgICBldmVudHMub25jZSgncmVuZGVyZWQnLCByZXNvbHZlUmVuZGVyZWQpO1xuICAgIH0pO1xuXG4gICAgdGFyZ2V0cy5mb3JFYWNoKGlkID0+IHtcbiAgICAgICAgY29uc3QgcGF0aE9mSWQgPSBnZXRQYXRoKHBhdGhzLCBpZCk7XG4gICAgICAgIGlmICghcGF0aE9mSWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHBhdGgocGF0aE9mSWQsIGxheW91dCk7XG4gICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBSZWdpc3RyeS5yZXNvbHZlKHRhcmdldCk7XG4gICAgICAgIGNvbnN0IHJlYWR5ID0gaXNSZWFkeShjb21wb25lbnQpO1xuXG4gICAgICAgIGlmIChyZWFkeSAmJiB0eXBlb2YgcmVhZHkudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgICAgICBQcm9taXNlLnJhY2UoW1xuICAgICAgICAgICAgICAgICAgICByZWFkeSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWQudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN0cmluZ2lmeUlkKGlkKSkgJiYgcmVhZHlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHJvbWlzZXMubGVuZ3RoID8gUHJvbWlzZS5hbGwocHJvbWlzZXMpIDogdHJ1ZTtcbn07XG4iLCJpbXBvcnQge1xuICAgIGNvbmNhdCxcbiAgICBmaWx0ZXIsXG4gICAgZmluZCxcbiAgICBmb3JFYWNoT2JqSW5kZXhlZCxcbiAgICBpbnNlcnQsXG4gICAgcGF0aCxcbiAgICBwcm9wRXEsXG4gICAgcHJvcHMsXG4gICAgaW5kZXhPZlxufSBmcm9tICdyYW1kYSc7XG5cbmltcG9ydCB7Y3Jhd2xMYXlvdXR9IGZyb20gJy4vdXRpbHMnO1xuXG4vKlxuICogc3RhdGUucGF0aHMgaGFzIHN0cnVjdHVyZTpcbiAqIHtcbiAqICAgc3Ryczoge1tpZF06IHBhdGh9IC8vIGZvciByZWd1bGFyIHN0cmluZyBpZHNcbiAqICAgb2Jqczoge1trZXlTdHJdOiBbe3ZhbHVlcywgcGF0aH1dfSAvLyBmb3Igd2lsZGNhcmQgaWRzXG4gKiB9XG4gKiBrZXlTdHI6IHNvcnRlZCBrZXlzIG9mIHRoZSBpZCwgam9pbmVkIHdpdGggJywnIGludG8gb25lIHN0cmluZ1xuICogdmFsdWVzOiBhcnJheSBvZiB2YWx1ZXMgaW4gdGhlIGlkLCBpbiBvcmRlciBvZiBrZXlzXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVQYXRocyhzdWJUcmVlLCBzdGFydGluZ1BhdGgsIG9sZFBhdGhzLCBldmVudHMpIHtcbiAgICBjb25zdCB7c3Ryczogb2xkU3Rycywgb2Jqczogb2xkT2Jqc30gPSBvbGRQYXRocyB8fCB7c3Ryczoge30sIG9ianM6IHt9fTtcblxuICAgIGNvbnN0IGRpZmZIZWFkID0gcGF0aCA9PiBzdGFydGluZ1BhdGguc29tZSgodiwgaSkgPT4gcGF0aFtpXSAhPT0gdik7XG5cbiAgICBjb25zdCBzcExlbiA9IHN0YXJ0aW5nUGF0aC5sZW5ndGg7XG4gICAgLy8gaWYgd2UncmUgdXBkYXRpbmcgYSBzdWJ0cmVlLCBjbGVhciBvdXQgYWxsIG9mIHRoZSBleGlzdGluZyBpdGVtc1xuICAgIGNvbnN0IHN0cnMgPSBzcExlbiA/IGZpbHRlcihkaWZmSGVhZCwgb2xkU3RycykgOiB7fTtcbiAgICBjb25zdCBvYmpzID0ge307XG4gICAgaWYgKHNwTGVuKSB7XG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKChvbGRWYWxQYXRocywgb2xkS2V5cykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3VmFscyA9IGZpbHRlcigoe3BhdGh9KSA9PiBkaWZmSGVhZChwYXRoKSwgb2xkVmFsUGF0aHMpO1xuICAgICAgICAgICAgaWYgKG5ld1ZhbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgb2Jqc1tvbGRLZXlzXSA9IG5ld1ZhbHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIG9sZE9ianMpO1xuICAgIH1cblxuICAgIGNyYXdsTGF5b3V0KHN1YlRyZWUsIChjaGlsZCwgaXRlbXBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBwYXRoKFsncHJvcHMnLCAnaWQnXSwgY2hpbGQpO1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGlkKS5zb3J0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gcHJvcHMoa2V5cywgaWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleVN0ciA9IGtleXMuam9pbignLCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhzID0gKG9ianNba2V5U3RyXSA9IG9ianNba2V5U3RyXSB8fCBbXSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkaWUgPSBvbGRPYmpzW2tleVN0cl0gfHwgW107XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHt2YWx1ZXMsIHBhdGg6IGNvbmNhdChzdGFydGluZ1BhdGgsIGl0ZW1wYXRoKX07XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBpbmRleE9mKGl0ZW0sIG9sZGllKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGhzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb2Jqc1trZXlTdHJdID0gaW5zZXJ0KGluZGV4LCBpdGVtLCBwYXRocyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHJzW2lkXSA9IGNvbmNhdChzdGFydGluZ1BhdGgsIGl0ZW1wYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gV2UgaW5jbHVkZSBhbiBldmVudCBlbWl0dGVyIGhlcmUgYmVjYXVzZSBpdCB3aWxsIGJlIHVzZWQgYWxvbmcgd2l0aFxuICAgIC8vIHBhdGhzIHRvIGRldGVybWluZSB3aGVuIHRoZSBhcHAgaXMgcmVhZHkgZm9yIGNhbGxiYWNrcy5cbiAgICByZXR1cm4ge3N0cnMsIG9ianMsIGV2ZW50czogZXZlbnRzIHx8IG9sZFBhdGhzLmV2ZW50c307XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXRoKHBhdGhzLCBpZCkge1xuICAgIGlmICh0eXBlb2YgaWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpZCkuc29ydCgpO1xuICAgICAgICBjb25zdCBrZXlTdHIgPSBrZXlzLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3Qga2V5UGF0aHMgPSBwYXRocy5vYmpzW2tleVN0cl07XG4gICAgICAgIGlmICgha2V5UGF0aHMpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZXMgPSBwcm9wcyhrZXlzLCBpZCk7XG4gICAgICAgIGNvbnN0IHBhdGhPYmogPSBmaW5kKHByb3BFcSh2YWx1ZXMsICd2YWx1ZXMnKSwga2V5UGF0aHMpO1xuICAgICAgICByZXR1cm4gcGF0aE9iaiAmJiBwYXRoT2JqLnBhdGg7XG4gICAgfVxuICAgIHJldHVybiBwYXRocy5zdHJzW2lkXTtcbn1cbiIsImltcG9ydCB7XG4gICAgYXBwZW5kLFxuICAgIGNvbmNhdCxcbiAgICBoYXMsXG4gICAgcGF0aCxcbiAgICBwYXRoT3IsXG4gICAgdHlwZSxcbiAgICBmaW5kSW5kZXgsXG4gICAgaW5jbHVkZXMsXG4gICAgc2xpY2Vcbn0gZnJvbSAncmFtZGEnO1xuXG4vKlxuICogcmVxdWVzdHNfcGF0aG5hbWVfcHJlZml4IGlzIHRoZSBuZXcgY29uZmlnIHBhcmFtZXRlciBpbnRyb2R1Y2VkIGluXG4gKiBkYXNoPT0wLjE4LjAuIFRoZSBwcmV2aW91cyB2ZXJzaW9ucyBqdXN0IGhhZCB1cmxfYmFzZV9wYXRobmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXJsQmFzZShjb25maWcpIHtcbiAgICBjb25zdCBoYXNVcmxCYXNlID0gaGFzKCd1cmxfYmFzZV9wYXRobmFtZScsIGNvbmZpZyk7XG4gICAgY29uc3QgaGFzUmVxUHJlZml4ID0gaGFzKCdyZXF1ZXN0c19wYXRobmFtZV9wcmVmaXgnLCBjb25maWcpO1xuICAgIGlmICh0eXBlKGNvbmZpZykgIT09ICdPYmplY3QnIHx8ICghaGFzVXJsQmFzZSAmJiAhaGFzUmVxUHJlZml4KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgXG4gICAgICAgICAgICBUcnlpbmcgdG8gbWFrZSBhbiBBUEkgcmVxdWVzdCBidXQgbmVpdGhlclxuICAgICAgICAgICAgXCJ1cmxfYmFzZV9wYXRobmFtZVwiIG5vciBcInJlcXVlc3RzX3BhdGhuYW1lX3ByZWZpeFwiXG4gICAgICAgICAgICBpcyBpbiBcXGBjb25maWdcXGAuIFxcYGNvbmZpZ1xcYCBpczogYCxcbiAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGJhc2UgPSBoYXNSZXFQcmVmaXhcbiAgICAgICAgPyBjb25maWcucmVxdWVzdHNfcGF0aG5hbWVfcHJlZml4XG4gICAgICAgIDogY29uZmlnLnVybF9iYXNlX3BhdGhuYW1lO1xuXG4gICAgcmV0dXJuIGJhc2UuY2hhckF0KGJhc2UubGVuZ3RoIC0gMSkgPT09ICcvJyA/IGJhc2UgOiBiYXNlICsgJy8nO1xufVxuXG5jb25zdCBwcm9wc0NoaWxkcmVuID0gWydwcm9wcycsICdjaGlsZHJlbiddO1xuXG4vLyBjcmF3bCBhIGxheW91dCBvYmplY3Qgb3IgY2hpbGRyZW4gYXJyYXksIGFwcGx5IGEgZnVuY3Rpb24gb24gZXZlcnkgb2JqZWN0XG5leHBvcnQgY29uc3QgY3Jhd2xMYXlvdXQgPSAoXG4gICAgb2JqZWN0LFxuICAgIGZ1bmMsXG4gICAgY3VycmVudFBhdGggPSBbXSxcbiAgICBleHRyYVBhdGggPSB1bmRlZmluZWRcbikgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgLy8gY2hpbGRyZW4gYXJyYXlcbiAgICAgICAgb2JqZWN0LmZvckVhY2goKGNoaWxkLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXh0cmFQYXRoKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqT2YgPSBmaW5kSW5kZXgocCA9PiBpbmNsdWRlcygne30nLCBwKSwgZXh0cmFQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAob2JqT2YgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyb250ID0gc2xpY2UoMCwgb2JqT2YsIGV4dHJhUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2sgPSBzbGljZShvYmpPZiwgZXh0cmFQYXRoLmxlbmd0aCwgZXh0cmFQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZyb250Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2xMYXlvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aChmcm9udCwgY2hpbGQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2F0KGN1cnJlbnRQYXRoLCBjb25jYXQoW2ldLCBmcm9udCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrUGF0aCA9IGJhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKHAgPT4gcC5yZXBsYWNlKCd7fScsICcnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGUgPT4gZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRPYmosXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRQYXRoID0gY29uY2F0KFtpXSwgYmFja1BhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tQYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkT2JqID0gcGF0aChiYWNrUGF0aCwgY2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZE9iaiA9IGNoaWxkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY2hpbGRPYmopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNoaWxkT2JqW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhd2xMYXlvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jYXQoY3VycmVudFBhdGgsIGNoaWxkUGF0aC5jb25jYXQoW2tleV0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjcmF3bExheW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgoZXh0cmFQYXRoLCBjaGlsZCksXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uY2F0KGN1cnJlbnRQYXRoLCBjb25jYXQoW2ldLCBleHRyYVBhdGgpKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY3Jhd2xMYXlvdXQoY2hpbGQsIGZ1bmMsIGFwcGVuZChpLCBjdXJyZW50UGF0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUob2JqZWN0KSA9PT0gJ09iamVjdCcpIHtcbiAgICAgICAgZnVuYyhvYmplY3QsIGN1cnJlbnRQYXRoKTtcblxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHBhdGgocHJvcHNDaGlsZHJlbiwgb2JqZWN0KTtcbiAgICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdQYXRoID0gY29uY2F0KGN1cnJlbnRQYXRoLCBwcm9wc0NoaWxkcmVuKTtcbiAgICAgICAgICAgIGNyYXdsTGF5b3V0KGNoaWxkcmVuLCBmdW5jLCBuZXdQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuUHJvcHMgPSBwYXRoT3IoXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIFtvYmplY3QubmFtZXNwYWNlLCBvYmplY3QudHlwZV0sXG4gICAgICAgICAgICB3aW5kb3cuX19kYXNocHJpdmF0ZV9jaGlsZHJlblByb3BzXG4gICAgICAgICk7XG4gICAgICAgIGNoaWxkcmVuUHJvcHMuZm9yRWFjaChjaGlsZHJlblByb3AgPT4ge1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygnW10nKSkge1xuICAgICAgICAgICAgICAgIGxldCBbZnJvbnRQYXRoLCBiYWNrUGF0aF0gPSBjaGlsZHJlblByb3BcbiAgICAgICAgICAgICAgICAgICAgLnNwbGl0KCdbXScpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAocCA9PiBwLnNwbGl0KCcuJykuZmlsdGVyKGUgPT4gZSkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbnQgPSBjb25jYXQoWydwcm9wcyddLCBmcm9udFBhdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VQYXRoID0gY29uY2F0KGN1cnJlbnRQYXRoLCBmcm9udCk7XG4gICAgICAgICAgICAgICAgY3Jhd2xMYXlvdXQocGF0aChmcm9udCwgb2JqZWN0KSwgZnVuYywgYmFzZVBhdGgsIGJhY2tQYXRoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuUHJvcC5pbmNsdWRlcygne30nKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGF0aCA9IGNoaWxkcmVuUHJvcC5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcm9udFBhdGggPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja1BhdGggPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VyUGF0aCA9IG9wYXRoW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCAmJiBjdXJQYXRoLmluY2x1ZGVzKCd7fScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb250UGF0aC5wdXNoKGN1clBhdGgucmVwbGFjZSgne30nLCAnJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja1BhdGgucHVzaChjdXJQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9udFBhdGgucHVzaChjdXJQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UGF0aCA9IGNvbmNhdChjdXJyZW50UGF0aCwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmZyb250UGF0aFxuICAgICAgICAgICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvVmFsdWUgPSBwYXRoKFsncHJvcHMnLCAuLi5mcm9udFBhdGhdLCBvYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9WYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb1ZhbHVlW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tQYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmF3bExheW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgoYmFja1BhdGgsIHZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jYXQobmV3UGF0aCwgW2tleSwgLi4uYmFja1BhdGhdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyYXdsTGF5b3V0KHZhbHVlLCBmdW5jLCBbLi4ubmV3UGF0aCwga2V5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UGF0aCA9IGNvbmNhdChjdXJyZW50UGF0aCwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmNoaWxkcmVuUHJvcC5zcGxpdCgnLicpXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICBjcmF3bExheW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgoWydwcm9wcycsIC4uLmNoaWxkcmVuUHJvcC5zcGxpdCgnLicpXSwgb2JqZWN0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRoXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG4vLyBUaGVyZSBhcmUgcGFja2FnZXMgZm9yIHRoaXMgYnV0IGl0J3Mgc2ltcGxlIGVub3VnaCwgSSBqdXN0XG4vLyBhZGFwdGVkIGl0IGZyb20gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vbXVkZ2UvNTgzMDM4MlxuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2V2ID0ge307XG4gICAgfVxuICAgIG9uKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICBjb25zdCBldmVudHMgPSAodGhpcy5fZXZbZXZlbnRdID0gdGhpcy5fZXZbZXZlbnRdIHx8IFtdKTtcbiAgICAgICAgZXZlbnRzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gKCkgPT4gdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIH1cbiAgICByZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgY29uc3QgZXZlbnRzID0gdGhpcy5fZXZbZXZlbnRdO1xuICAgICAgICBpZiAoZXZlbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBpZHggPSBldmVudHMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgICAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBldmVudHMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW1pdChldmVudCwgLi4uYXJncykge1xuICAgICAgICBjb25zdCBldmVudHMgPSB0aGlzLl9ldltldmVudF07XG4gICAgICAgIGlmIChldmVudHMpIHtcbiAgICAgICAgICAgIGV2ZW50cy5mb3JFYWNoKGxpc3RlbmVyID0+IGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3MpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvbmNlKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICBjb25zdCByZW1vdmUgPSB0aGlzLm9uKGV2ZW50LCAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgcmVtb3ZlKCk7XG4gICAgICAgICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiLypcbiAqIENvcGllZCBvdXQgb2YgcHJvcC10eXBlcyBhbmQgbW9kaWZpZWQgLSBpbnNwaXJlZCBieSBjaGVjay1wcm9wLXR5cGVzLCBidXRcbiAqIHNpbXBsaWZpZWQgYW5kIHR3ZWFrZWQgdG8gb3VyIG5lZWRzOiB3ZSBkb24ndCBuZWVkIHRoZSBOT0RFX0VOViBjaGVjayxcbiAqIHdlIHJlcG9ydCBhbGwgZXJyb3JzLCBub3QganVzdCB0aGUgZmlyc3Qgb25lLCBhbmQgd2UgZG9uJ3QgbmVlZCB0aGUgdGhyb3dpbmdcbiAqIHZhcmlhbnQgYGFzc2VydFByb3BUeXBlc2AuXG4gKi9cbmltcG9ydCBSZWFjdFByb3BUeXBlc1NlY3JldCBmcm9tICdwcm9wLXR5cGVzL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCc7XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIHZhbHVlcyBtYXRjaCB3aXRoIHRoZSB0eXBlIHNwZWNzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFwIG9mIG5hbWUgdG8gYSBSZWFjdFByb3BUeXBlXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIFJ1bnRpbWUgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSB0eXBlLWNoZWNrZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBlLmcuIFwicHJvcFwiLCBcImNvbnRleHRcIiwgXCJjaGlsZCBjb250ZXh0XCJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnROYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gez9GdW5jdGlvbn0gZ2V0U3RhY2sgUmV0dXJucyB0aGUgY29tcG9uZW50IHN0YWNrLlxuICogQHJldHVybiB7c3RyaW5nfSBBbnkgZXJyb3IgbWVzc2FnZSByZXN1bHRpbmcgZnJvbSBjaGVja2luZyB0aGUgdHlwZXNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXMoXG4gICAgdHlwZVNwZWNzLFxuICAgIHZhbHVlcyxcbiAgICBsb2NhdGlvbixcbiAgICBjb21wb25lbnROYW1lLFxuICAgIGdldFN0YWNrID0gbnVsbFxuKSB7XG4gICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgZm9yIChjb25zdCB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICAgIGlmICh0eXBlU3BlY3MuaGFzT3duUHJvcGVydHkodHlwZVNwZWNOYW1lKSkge1xuICAgICAgICAgICAgbGV0IGVycm9yO1xuICAgICAgICAgICAgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJyB0eXBlIGAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3BlY05hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdgIGlzIGludmFsaWQ7ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYC4nXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXShcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTcGVjTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFjdFByb3BUeXBlc1NlY3JldFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvciAmJiAhKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgYCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVNwZWNOYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZXJyb3IgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJy4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIHZhciBzdGFjayA9IChnZXRTdGFjayAmJiBnZXRTdGFjaygpKSB8fCAnJztcblxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAnRmFpbGVkICcgKyBsb2NhdGlvbiArICcgdHlwZTogJyArIGVycm9yLm1lc3NhZ2UgKyBzdGFja1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycy5qb2luKCdcXG5cXG4nKTtcbn1cbiIsImltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmZ1bmN0aW9uIExvYWRpbmcocHJvcHMpIHtcbiAgICBpZiAocHJvcHMuaXNMb2FkaW5nKSB7XG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtbG9hZGluZy1jYWxsYmFjaycgLz47XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5Mb2FkaW5nLnByb3BUeXBlcyA9IHtcbiAgICBpc0xvYWRpbmc6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWRcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3Qoc3RhdGUgPT4gKHtcbiAgICBpc0xvYWRpbmc6IHN0YXRlLmlzTG9hZGluZ1xufSkpKExvYWRpbmcpO1xuIiwiaW1wb3J0IHtcbiAgICBjb21wYXJhdG9yLFxuICAgIGVxdWFscyxcbiAgICBmb3JFYWNoLFxuICAgIGhhcyxcbiAgICBpc0VtcHR5LFxuICAgIGx0LFxuICAgIHBhdGgsXG4gICAgcGF0aE9yLFxuICAgIHNvcnRcbn0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBhcGlUaHVuayBmcm9tICcuLi8uLi9hY3Rpb25zL2FwaSc7XG5cbmNsYXNzIFJlbG9hZGVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIGlmIChwcm9wcy5jb25maWcuaG90X3JlbG9hZCkge1xuICAgICAgICAgICAgY29uc3Qge2ludGVydmFsLCBtYXhfcmV0cnl9ID0gcHJvcHMuY29uZmlnLmhvdF9yZWxvYWQ7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgICAgIGludGVydmFsLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpbnRlcnZhbElkOiBudWxsLFxuICAgICAgICAgICAgICAgIHBhY2thZ2VzOiBudWxsLFxuICAgICAgICAgICAgICAgIG1heF9yZXRyeVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmV0cnkgPSAwO1xuICAgICAgICB0aGlzLl9oZWFkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZCcpO1xuICAgICAgICB0aGlzLmNsZWFySW50ZXJ2YWwgPSB0aGlzLmNsZWFySW50ZXJ2YWwuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBjbGVhckludGVydmFsKCkge1xuICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnN0YXRlLmludGVydmFsSWQpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtpbnRlcnZhbElkOiBudWxsfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcykge1xuICAgICAgICAvKlxuICAgICAgICAgKiBTYXZlIHRoZSBub24tbG9hZGluZyByZXF1ZXN0cyBpbiB0aGUgc3RhdGUgaW4gb3JkZXIgdG8gY29tcGFyZVxuICAgICAgICAgKiBjdXJyZW50IGhhc2hlcyB3aXRoIHByZXZpb3VzIGhhc2hlcy5cbiAgICAgICAgICogTm90ZSB0aGF0IGlmIHRoZXJlIHdhc24ndCBhIFwibG9hZGluZ1wiIHN0YXRlIGZvciB0aGUgcmVxdWVzdHMsXG4gICAgICAgICAqIHRoZW4gd2UgIGNvdWxkIHNpbXBseSBjb21wYXJlIGBwcm9wc2Agd2l0aCBgcHJldlByb3BzYCBpblxuICAgICAgICAgKiBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFpc0VtcHR5KHByb3BzLnJlbG9hZFJlcXVlc3QpICYmXG4gICAgICAgICAgICBwcm9wcy5yZWxvYWRSZXF1ZXN0LnN0YXR1cyAhPT0gJ2xvYWRpbmcnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHtyZWxvYWRSZXF1ZXN0OiBwcm9wcy5yZWxvYWRSZXF1ZXN0fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICAgICAgY29uc3Qge3JlbG9hZFJlcXVlc3R9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgY29uc3Qge2Rpc3BhdGNofSA9IHRoaXMucHJvcHM7XG5cbiAgICAgICAgLy8gSW4gdGhlIGJlZ2lubmluZywgcmVsb2FkUmVxdWVzdCB3b24ndCBiZSBkZWZpbmVkXG4gICAgICAgIGlmICghcmVsb2FkUmVxdWVzdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICogV2hlbiByZWxvYWRSZXF1ZXN0IGlzIGZpcnN0IGRlZmluZWQsIHByZXZTdGF0ZSB3b24ndCBiZSBkZWZpbmVkXG4gICAgICAgICAqIGZvciBvbmUgcmVuZGVyIGxvb3AuXG4gICAgICAgICAqIFRoZSBmaXJzdCByZWxvYWRSZXF1ZXN0IGRlZmluZXMgdGhlIGluaXRpYWwvYmFzZWxpbmUgaGFzaCAtXG4gICAgICAgICAqIGl0IGRvZXNuJ3QgcmVxdWlyZSBhIHJlbG9hZFxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKCFoYXMoJ3JlbG9hZFJlcXVlc3QnLCBwcmV2U3RhdGUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICByZWxvYWRSZXF1ZXN0LnN0YXR1cyA9PT0gMjAwICYmXG4gICAgICAgICAgICBwYXRoKFsnY29udGVudCcsICdyZWxvYWRIYXNoJ10sIHJlbG9hZFJlcXVlc3QpICE9PVxuICAgICAgICAgICAgICAgIHBhdGgoWydyZWxvYWRSZXF1ZXN0JywgJ2NvbnRlbnQnLCAncmVsb2FkSGFzaCddLCBwcmV2U3RhdGUpXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIENTUyAoIWNvbnRlbnQuaGFyZCkgb3IgbmV3IHBhY2thZ2UgYXNzZXRzXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcmVsb2FkUmVxdWVzdC5jb250ZW50LmhhcmQgfHxcbiAgICAgICAgICAgICAgICAhZXF1YWxzKFxuICAgICAgICAgICAgICAgICAgICByZWxvYWRSZXF1ZXN0LmNvbnRlbnQucGFja2FnZXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBwYXRoT3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFsncmVsb2FkUmVxdWVzdCcsICdjb250ZW50JywgJ3BhY2thZ2VzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2U3RhdGVcbiAgICAgICAgICAgICAgICAgICAgKS5sZW5ndGhcbiAgICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICAgIWVxdWFscyhcbiAgICAgICAgICAgICAgICAgICAgc29ydChjb21wYXJhdG9yKGx0KSwgcmVsb2FkUmVxdWVzdC5jb250ZW50LnBhY2thZ2VzKSxcbiAgICAgICAgICAgICAgICAgICAgc29ydChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IobHQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aE9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsncmVsb2FkUmVxdWVzdCcsICdjb250ZW50JywgJ3BhY2thZ2VzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBMb29rIGlmIGl0IHdhcyBhIGNzcyBmaWxlLlxuICAgICAgICAgICAgICAgIGxldCB3YXNfY3NzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGEgb2YgcmVsb2FkUmVxdWVzdC5jb250ZW50LmZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhLmlzX2Nzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2FzX2NzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2Rlc1RvRGlzYWJsZSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBvbGQgZmlsZSBieSB4cGF0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ID0gZG9jdW1lbnQuZXZhbHVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYC8vbGlua1tjb250YWlucyhAaHJlZiwgXCIke2EudXJsfVwiKV1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hlYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IGl0Lml0ZXJhdGVOZXh0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb0Rpc2FibGUucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gaXQuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yRWFjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0+IG4uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzVG9EaXNhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5tb2RpZmllZCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuaHJlZiA9IGAke2EudXJsfT9tPSR7YS5tb2RpZmllZH1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbHNlIHRoZSBmaWxlIHdhcyBkZWxldGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhbm90aGVyIGtpbmQgb2YgZmlsZSBoZXJlIGRvIGEgaGFyZCByZWxvYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICB3YXNfY3NzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXdhc19jc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXNzZXRzIGZpbGUgaGF2ZSBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIGEgY29tcG9uZW50IGxpYiBoYXMgYmVlbiBhZGRlZC9yZW1vdmVkIC1cbiAgICAgICAgICAgICAgICAgICAgLy8gTXVzdCBkbyBhIGhhcmQgcmVsb2FkXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJhY2tlbmQgY29kZSBjaGFuZ2VkIC0gY2FuIGRvIGEgc29mdCByZWxvYWQgaW4gcGxhY2VcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh7dHlwZTogJ1JFTE9BRCd9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuaW50ZXJ2YWxJZCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgcmVsb2FkUmVxdWVzdC5zdGF0dXMgPT09IDUwMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZXRyeSA+IHRoaXMuc3RhdGUubWF4X3JldHJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckludGVydmFsKCk7XG4gICAgICAgICAgICAgICAgLy8gSW50ZWdyYXRlIHdpdGggZGV2IHRvb2xzIHVpPyFcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWxlcnQoXG4gICAgICAgICAgICAgICAgICAgIGBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkIGFmdGVyIGZhaWxpbmcgJHt0aGlzLl9yZXRyeX0gdGltZXMuIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1BsZWFzZSBjaGVjayB5b3VyIGFwcGxpY2F0aW9uIGZvciBlcnJvcnMsIHRoZW4gcmVmcmVzaCB0aGUgcGFnZS4nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JldHJ5Kys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgY29uc3Qge2Rpc3BhdGNoLCByZWxvYWRSZXF1ZXN0fSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGNvbnN0IHtkaXNhYmxlZCwgaW50ZXJ2YWx9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgaWYgKCFkaXNhYmxlZCAmJiAhdGhpcy5zdGF0ZS5pbnRlcnZhbElkKSB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcnZhbElkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHJlcXVlc3RzIGZyb20gcGlsaW5nIHVwIC0gcmVsb2FkaW5nIGNhbiB0YWtlXG4gICAgICAgICAgICAgICAgLy8gbWFueSBzZWNvbmRzICgxMC0zMCkgYW5kIHRoZSBpbnRlcnZhbCBpcyAzcyBieSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgaWYgKHJlbG9hZFJlcXVlc3Quc3RhdHVzICE9PSAnbG9hZGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goYXBpVGh1bmsoJ19yZWxvYWQtaGFzaCcsICdHRVQnLCAncmVsb2FkUmVxdWVzdCcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBpbnRlcnZhbCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtpbnRlcnZhbElkfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmRpc2FibGVkICYmIHRoaXMuc3RhdGUuaW50ZXJ2YWxJZCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhckludGVydmFsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuUmVsb2FkZXIuZGVmYXVsdFByb3BzID0ge307XG5cblJlbG9hZGVyLnByb3BUeXBlcyA9IHtcbiAgICBpZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjb25maWc6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgcmVsb2FkUmVxdWVzdDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBkaXNwYXRjaDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgaW50ZXJ2YWw6IFByb3BUeXBlcy5udW1iZXJcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QoXG4gICAgc3RhdGUgPT4gKHtcbiAgICAgICAgY29uZmlnOiBzdGF0ZS5jb25maWcsXG4gICAgICAgIHJlbG9hZFJlcXVlc3Q6IHN0YXRlLnJlbG9hZFJlcXVlc3RcbiAgICB9KSxcbiAgICBkaXNwYXRjaCA9PiAoe2Rpc3BhdGNofSlcbikoUmVsb2FkZXIpO1xuIiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7cmVkbywgdW5kb30gZnJvbSAnLi4vLi4vYWN0aW9ucy9pbmRleC5qcyc7XG5pbXBvcnQgJy4vVG9vbGJhci5jc3MnO1xuXG5mdW5jdGlvbiBVbmNvbm5lY3RlZFRvb2xiYXIocHJvcHMpIHtcbiAgICBjb25zdCB7ZGlzcGF0Y2gsIGhpc3Rvcnl9ID0gcHJvcHM7XG5cbiAgICBjb25zdCB1bmRvTGluayA9IChcbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGtleT0ndW5kb0xpbmsnXG4gICAgICAgICAgICBjbGFzc05hbWU9J19kYXNoLXVuZG8tcmVkby1saW5rJ1xuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gZGlzcGF0Y2godW5kbyl9XG4gICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdfZGFzaC1pY29uLXVuZG8nPuKGujwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J19kYXNoLXVuZG8tcmVkby1sYWJlbCc+dW5kbzwvZGl2PlxuICAgICAgICA8L3NwYW4+XG4gICAgKTtcblxuICAgIGNvbnN0IHJlZG9MaW5rID0gKFxuICAgICAgICA8c3BhblxuICAgICAgICAgICAga2V5PSdyZWRvTGluaydcbiAgICAgICAgICAgIGNsYXNzTmFtZT0nX2Rhc2gtdW5kby1yZWRvLWxpbmsnXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBkaXNwYXRjaChyZWRvKX1cbiAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J19kYXNoLWljb24tcmVkbyc+4oa7PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nX2Rhc2gtdW5kby1yZWRvLWxhYmVsJz5yZWRvPC9kaXY+XG4gICAgICAgIDwvc3Bhbj5cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J19kYXNoLXVuZG8tcmVkbyc+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIHtoaXN0b3J5LnBhc3QubGVuZ3RoID4gMCA/IHVuZG9MaW5rIDogbnVsbH1cbiAgICAgICAgICAgICAgICB7aGlzdG9yeS5mdXR1cmUubGVuZ3RoID4gMCA/IHJlZG9MaW5rIDogbnVsbH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufVxuXG5VbmNvbm5lY3RlZFRvb2xiYXIucHJvcFR5cGVzID0ge1xuICAgIGhpc3Rvcnk6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZGlzcGF0Y2g6IFByb3BUeXBlcy5mdW5jXG59O1xuXG5jb25zdCBUb29sYmFyID0gY29ubmVjdChcbiAgICBzdGF0ZSA9PiAoe1xuICAgICAgICBoaXN0b3J5OiBzdGF0ZS5oaXN0b3J5XG4gICAgfSksXG4gICAgZGlzcGF0Y2ggPT4gKHtkaXNwYXRjaH0pXG4pKFVuY29ubmVjdGVkVG9vbGJhcik7XG5cbmV4cG9ydCBkZWZhdWx0IFRvb2xiYXI7XG4iLCJpbXBvcnQgUmVhY3QsIHtDb21wb25lbnQsIHVzZVN0YXRlLCB1c2VNZW1vLCB1c2VFZmZlY3QsIHVzZVJlZn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7Y29ubmVjdCwgdXNlU2VsZWN0b3J9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBDeXRvc2NhcGUgZnJvbSAnY3l0b3NjYXBlJztcbmltcG9ydCBDeXRvc2NhcGVDb21wb25lbnQgZnJvbSAncmVhY3QtY3l0b3NjYXBlanMnO1xuaW1wb3J0IGRhZ3JlIGZyb20gJ2N5dG9zY2FwZS1kYWdyZSc7XG5pbXBvcnQgZmNvc2UgZnJvbSAnY3l0b3NjYXBlLWZjb3NlJztcbmltcG9ydCB7SlNPTlRyZWV9IGZyb20gJ3JlYWN0LWpzb24tdHJlZSc7XG5pbXBvcnQge2tleXMsIG1lcmdlUmlnaHQsIG9taXQsIHBhdGgsIHZhbHVlc30gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge2dldFBhdGh9IGZyb20gJy4uLy4uLy4uL2FjdGlvbnMvcGF0aHMnO1xuaW1wb3J0IHtzdHJpbmdpZnlJZH0gZnJvbSAnLi4vLi4vLi4vYWN0aW9ucy9kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHtvbkVycm9yfSBmcm9tICcuLi8uLi8uLi9hY3Rpb25zJztcblxuaW1wb3J0ICcuL0NhbGxiYWNrR3JhcGhDb250YWluZXIuY3NzJztcbmltcG9ydCBzdHlsZXNoZWV0IGZyb20gJy4vQ2FsbGJhY2tHcmFwaENvbnRhaW5lclN0eWxlc2hlZXQnO1xuaW1wb3J0IHtcbiAgICB1cGRhdGVTZWxlY3RlZE5vZGUsXG4gICAgdXBkYXRlQ2hhbmdlZFByb3BzLFxuICAgIHVwZGF0ZUNhbGxiYWNrXG59IGZyb20gJy4vQ2FsbGJhY2tHcmFwaEVmZmVjdHMnO1xuXG5DeXRvc2NhcGUudXNlKGRhZ3JlKTtcbkN5dG9zY2FwZS51c2UoZmNvc2UpO1xuXG4vKlxuICogR2VuZXJhdGVzIGFsbCB0aGUgZWxlbWVudHMgKG5vZGVzLCBlZGdlcykgZm9yIHRoZSBkZXBlbmRlbmN5IGdyYXBoLlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUVsZW1lbnRzKGdyYXBocywgcHJvZmlsZSwgZXh0cmFMaW5rcykge1xuICAgIGNvbnN0IGNvbnN1bWVkID0gW107XG4gICAgY29uc3QgZWxlbWVudHMgPSBbXTtcbiAgICBjb25zdCBzdHJ1Y3R1cmUgPSB7fTtcblxuICAgIGZ1bmN0aW9uIHJlY29yZE5vZGUoaWQsIHJhd1Byb3BlcnR5KSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5ID0gcmF3UHJvcGVydHkuc3BsaXQoJ0AnKVswXTtcbiAgICAgICAgY29uc3QgaWRTdHIgPSBzdHJpbmdpZnlJZChpZCk7XG4gICAgICAgIGNvbnN0IGlkVHlwZSA9IHR5cGVvZiBpZCA9PT0gJ29iamVjdCcgPyAnd2lsZGNhcmQnIDogJ2NvbXBvbmVudCc7XG5cbiAgICAgICAgLy8gZGFncmUgbGF5b3V0IGhhcyBwcm9ibGVtcyB3aXRoIGVnIGB3aWR0aGAgcHJvcGVydHkgLSBzbyBwcmVwZW5kIGFuIFhcbiAgICAgICAgY29uc3QgcGFyZW50SWQgPSBpZFN0cjtcbiAgICAgICAgY29uc3QgY2hpbGRJZCA9IGAke3BhcmVudElkfS5YJHtwcm9wZXJ0eX1gO1xuXG4gICAgICAgIGlmICghY29uc3VtZWQuaW5jbHVkZXMocGFyZW50SWQpKSB7XG4gICAgICAgICAgICBjb25zdW1lZC5wdXNoKHBhcmVudElkKTtcbiAgICAgICAgICAgIGVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHBhcmVudElkLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogaWRTdHIsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IGlkVHlwZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RydWN0dXJlW3BhcmVudElkXSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb25zdW1lZC5pbmNsdWRlcyhjaGlsZElkKSkge1xuICAgICAgICAgICAgY29uc3VtZWQucHVzaChjaGlsZElkKTtcbiAgICAgICAgICAgIGVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGNoaWxkSWQsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBwYXJlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3Byb3BlcnR5J1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RydWN0dXJlW3BhcmVudElkXS5wdXNoKGNoaWxkSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkSWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVjb3JkRWRnZShzb3VyY2UsIHRhcmdldCwgdHlwZSkge1xuICAgICAgICBlbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIChncmFwaHMuY2FsbGJhY2tzIHx8IFtdKS5yZWR1Y2UoKHZpc2libGVJbmRleCwgY2FsbGJhY2spID0+IHtcbiAgICAgICAgaWYgKGNhbGxiYWNrLmhpZGRlbikge1xuICAgICAgICAgICAgcmV0dXJuIHZpc2libGVJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNiID0gYF9fZGFzaF9jYWxsYmFja19fLiR7Y2FsbGJhY2sub3V0cHV0fWA7XG4gICAgICAgIGNvbnN0IGNiUHJvZmlsZSA9IHByb2ZpbGUuY2FsbGJhY2tzW2NhbGxiYWNrLm91dHB1dF0gfHwge307XG4gICAgICAgIGNvbnN0IGNvdW50ID0gY2JQcm9maWxlLmNvdW50IHx8IDA7XG4gICAgICAgIGNvbnN0IHRpbWUgPSBjYlByb2ZpbGUudG90YWwgfHwgMDtcblxuICAgICAgICBlbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBpZDogY2IsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGBjYWxsYmFjay4ke3Zpc2libGVJbmRleH1gLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdjYWxsYmFjaycsXG4gICAgICAgICAgICAgICAgbW9kZTogY2FsbGJhY2suY2xpZW50c2lkZV9mdW5jdGlvbiA/ICdjbGllbnQnIDogJ3NlcnZlcicsXG4gICAgICAgICAgICAgICAgY291bnQ6IGNvdW50LFxuICAgICAgICAgICAgICAgIHRpbWU6IGNvdW50ID4gMCA/IE1hdGgucm91bmQodGltZSAvIGNvdW50KSA6IDAsXG4gICAgICAgICAgICAgICAgbG9hZGluZ1NldDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICBlcnJvclNldDogRGF0ZS5ub3coKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjYWxsYmFjay5vdXRwdXRzLmZvckVhY2goKHtpZCwgcHJvcGVydHl9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub2RlSWQgPSByZWNvcmROb2RlKGlkLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgICByZWNvcmRFZGdlKGNiLCBub2RlSWQsICdvdXRwdXQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2FsbGJhY2suaW5wdXRzLmZvckVhY2goKHtpZCwgcHJvcGVydHl9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub2RlSWQgPSByZWNvcmROb2RlKGlkLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgICByZWNvcmRFZGdlKG5vZGVJZCwgY2IsICdpbnB1dCcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjYWxsYmFjay5zdGF0ZS5mb3JFYWNoKCh7aWQsIHByb3BlcnR5fSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9kZUlkID0gcmVjb3JkTm9kZShpZCwgcHJvcGVydHkpO1xuICAgICAgICAgICAgcmVjb3JkRWRnZShub2RlSWQsIGNiLCAnc3RhdGUnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHZpc2libGVJbmRleCArIDE7XG4gICAgfSwgMCk7XG5cbiAgICAvLyBwdWxsIHRvZ2V0aGVyIHByb3BzIGluIHRoZSBzYW1lIGNvbXBvbmVudFxuICAgIGlmIChleHRyYUxpbmtzKSB7XG4gICAgICAgIHZhbHVlcyhzdHJ1Y3R1cmUpLmZvckVhY2goY2hpbGRJZHMgPT4ge1xuICAgICAgICAgICAgY2hpbGRJZHMuZm9yRWFjaChjaGlsZEZyb20gPT4ge1xuICAgICAgICAgICAgICAgIGNoaWxkSWRzLmZvckVhY2goY2hpbGRUbyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEZyb20gIT09IGNoaWxkVG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZEVkZ2UoY2hpbGRGcm9tLCBjaGlsZFRvLCAnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHM7XG59XG5cbmZ1bmN0aW9uIHJlZHVjZVN0YXR1cyhzdGF0dXMpIHtcbiAgICBpZiAoa2V5cyhzdGF0dXMpLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gc3RhdHVzLmxhdGVzdDtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXR1cztcbn1cblxuZnVuY3Rpb24gZmxhdHRlbk91dHB1dHMocmVzKSB7XG4gICAgY29uc3Qgb3V0cHV0cyA9IHt9O1xuICAgIGZvciAoY29uc3QgaWRTdHIgaW4gcmVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiByZXNbaWRTdHJdKSB7XG4gICAgICAgICAgICBvdXRwdXRzW2lkU3RyICsgJy4nICsgcHJvcF0gPSByZXNbaWRTdHJdW3Byb3BdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXRzO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuSW5wdXRzKGluQXJyYXksIGZpbmFsKSB7XG4gICAgKGluQXJyYXkgfHwgW10pLmZvckVhY2goaW5JdGVtID0+IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5JdGVtKSkge1xuICAgICAgICAgICAgZmxhdHRlbklucHV0cyhpbkl0ZW0sIGZpbmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHtpZCwgcHJvcGVydHksIHZhbHVlfSA9IGluSXRlbTtcbiAgICAgICAgICAgIGZpbmFsW3N0cmluZ2lmeUlkKGlkKSArICcuJyArIHByb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpbmFsO1xufVxuXG5mdW5jdGlvbiBjbGVhbk91dHB1dElkKG91dHB1dElkKSB7XG4gICAgcmV0dXJuIG91dHB1dElkXG4gICAgICAgIC5yZXBsYWNlKC8oXlxcLlxcLnxcXC5cXC4kKS9nLCAnJylcbiAgICAgICAgLnNwbGl0KCcuLi4nKVxuICAgICAgICAucmVkdWNlKFxuICAgICAgICAgICAgKGFnZywgbmV4dCkgPT5cbiAgICAgICAgICAgICAgICBhZ2cuY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICBuZXh0LnJlcGxhY2UoLyguKlxcLi4qKShALispJC8sIChhLCBiKSA9PiBiICsgJyAoRHVwbGljYXRlKScpXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIFtdXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oJy4uLicpO1xufVxuXG4vLyBsZW4oJ19fZGFzaF9jYWxsYmFja19fLicpXG5jb25zdCBjYlByZWZpeExlbiA9IDE4O1xuXG5jb25zdCBkYWdyZUxheW91dCA9IHtcbiAgICBuYW1lOiAnZGFncmUnLFxuICAgIHBhZGRpbmc6IDEwLFxuICAgIHJhbmtlcjogJ3RpZ2h0LXRyZWUnXG59O1xuXG5jb25zdCBmb3JjZUxheW91dCA9IHtuYW1lOiAnZmNvc2UnLCBwYWRkaW5nOiAxMCwgYW5pbWF0ZTogZmFsc2V9O1xuXG5jb25zdCBsYXlvdXRzID0ge1xuICAgICd0b3AtZG93bic6IHsuLi5kYWdyZUxheW91dCwgc3BhY2luZ0ZhY3RvcjogMC44fSxcbiAgICAnbGVmdC1yaWdodCc6IHsuLi5kYWdyZUxheW91dCwgbm9kZVNlcDogMCwgcmFua1NlcDogODAsIHJhbmtEaXI6ICdMUid9LFxuICAgIGZvcmNlOiBmb3JjZUxheW91dCxcbiAgICAnZm9yY2UtbG9vc2UnOiBmb3JjZUxheW91dFxufTtcblxuZnVuY3Rpb24gQ2FsbGJhY2tHcmFwaCgpIHtcbiAgICAvLyBHcmFiIGl0ZW1zIGZyb20gdGhlIHJlZHV4IHN0b3JlLlxuICAgIGNvbnN0IHBhdGhzID0gdXNlU2VsZWN0b3Ioc3RhdGUgPT4gc3RhdGUucGF0aHMpO1xuICAgIGNvbnN0IGxheW91dCA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLmxheW91dCk7XG4gICAgY29uc3QgZ3JhcGhzID0gdXNlU2VsZWN0b3Ioc3RhdGUgPT4gc3RhdGUuZ3JhcGhzKTtcbiAgICBjb25zdCBwcm9maWxlID0gdXNlU2VsZWN0b3Ioc3RhdGUgPT4gc3RhdGUucHJvZmlsZSk7XG4gICAgY29uc3QgY2hhbmdlZCA9IHVzZVNlbGVjdG9yKHN0YXRlID0+IHN0YXRlLmNoYW5nZWQpO1xuICAgIGNvbnN0IGxpZmVjeWNsZVN0YXRlID0gdXNlU2VsZWN0b3Ioc3RhdGUgPT4gc3RhdGUuYXBwTGlmZWN5Y2xlKTtcblxuICAgIC8vIEtlZXAgdHJhY2sgb2YgY3l0b3NjYXBlIHJlZmVyZW5jZSBhbmQgdXNlciBzZWxlY3RlZCBpdGVtcy5cbiAgICBjb25zdCBbc2VsZWN0ZWQsIHNldFNlbGVjdGVkXSA9IHVzZVN0YXRlKG51bGwpO1xuICAgIGNvbnN0IFtjeXRvc2NhcGUsIHNldEN5dG9zY2FwZV0gPSB1c2VTdGF0ZShudWxsKTtcblxuICAgIGNvbnN0IHtncmFwaExheW91dH0gPSBwcm9maWxlO1xuICAgIGNvbnN0IGNob3NlblR5cGUgPSBncmFwaExheW91dD8uX2Nob3NlblR5cGU7XG4gICAgY29uc3QgbGF5b3V0U2VsZWN0b3IgPSB1c2VSZWYobnVsbCk7XG4gICAgY29uc3QgW2xheW91dFR5cGUsIHNldExheW91dFR5cGVdID0gdXNlU3RhdGUoY2hvc2VuVHlwZSB8fCAndG9wLWRvd24nKTtcblxuICAgIC8vIEdlbmVyYXRlIGFuZCBtZW1vaXplIHRoZSBlbGVtZW50cy5cbiAgICBjb25zdCBlbGVtZW50cyA9IHVzZU1lbW8oXG4gICAgICAgICgpID0+IGdlbmVyYXRlRWxlbWVudHMoZ3JhcGhzLCBwcm9maWxlLCBsYXlvdXRUeXBlID09PSAnZm9yY2UnKSxcbiAgICAgICAgW2dyYXBocywgbGF5b3V0VHlwZV1cbiAgICApO1xuXG4gICAgLy8gQ3VzdG9tIGhvb2sgdG8gbWFrZSBzdXJlIGN5dG9zY2FwZSBpcyBsb2FkZWQuXG4gICAgY29uc3QgdXNlQ3l0b3NjYXBlRWZmZWN0ID0gKGVmZmVjdCwgY29uZGl0aW9uKSA9PiB7XG4gICAgICAgIHVzZUVmZmVjdChcbiAgICAgICAgICAgICgpID0+IChjeXRvc2NhcGUgJiYgZWZmZWN0KGN5dG9zY2FwZSkpIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbmRpdGlvblxuICAgICAgICApO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnQoaWQpIHtcbiAgICAgICAgLy8gZm9yIG5vdyBpZ25vcmUgcGF0dGVybi1tYXRjaGluZyBJRHNcbiAgICAgICAgLy8gdG8gZG8gYmV0dGVyIHdlIG1heSBuZWVkIHRvIHN0b3JlIHRoZSAqYWN0dWFsKiBJRHMgdXNlZCBmb3IgZWFjaFxuICAgICAgICAvLyBjYWxsYmFjayBpbnZvY2F0aW9uLCBzaW5jZSB0aGV5IG5lZWQgbm90IG1hdGNoIHdoYXQncyBvbiB0aGUgcGFnZSBub3cuXG4gICAgICAgIGlmIChpZC5jaGFyQXQoMCkgPT09ICd7Jykge1xuICAgICAgICAgICAgaGFzUGF0dGVybnMgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpZFBhdGggPSBnZXRQYXRoKHBhdGhzLCBpZCk7XG4gICAgICAgIHJldHVybiBpZFBhdGggPyBwYXRoKGlkUGF0aCwgbGF5b3V0KSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRQcm9wVmFsdWUoZGF0YSkge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBnZXRDb21wb25lbnQoZGF0YS5wYXJlbnQpO1xuICAgICAgICByZXR1cm4gcGFyZW50ID8gcGFyZW50LnByb3BzW2RhdGEubGFiZWxdIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldFByZXNldExheW91dCh7Y3l9KSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHt9O1xuICAgICAgICBjeS5ub2RlcygpLmVhY2gobiA9PiB7XG4gICAgICAgICAgICBwb3NpdGlvbnNbbi5pZCgpXSA9IG4ucG9zaXRpb24oKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSGFjayEgV2UncmUgbXV0YXRpbmcgdGhlIHJlZHV4IHN0b3JlIGRpcmVjdGx5IGhlcmUsIHJhdGhlciB0aGFuXG4gICAgICAgIC8vIGRpc3BhdGNoaW5nIGFuIGFjdGlvbiwgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRoaXMgdG8gdHJpZ2dlciBhXG4gICAgICAgIC8vIHJlcmVuZGVyLCB3ZSBqdXN0IHdhbnQgdGhlIGxheW91dCB0byBwZXJzaXN0IHdoZW4gdGhlIGNhbGxiYWNrIGdyYXBoXG4gICAgICAgIC8vIGlzIHJlcmVuZGVyZWQgLSBlaXRoZXIgYmVjYXVzZSB0aGVyZSdzIG5ldyBwcm9maWxlIGluZm9ybWF0aW9uIHRvXG4gICAgICAgIC8vIGRpc3BsYXkgb3IgYmVjYXVzZSB0aGUgZ3JhcGggd2FzIGNsb3NlZCBhbmQgcmVvcGVuZWQuIFRoZSBsYXR0ZXIgaXNcbiAgICAgICAgLy8gdGhlIHJlYXNvbiB3ZSdyZSBub3QgdXNpbmcgY29tcG9uZW50IHN0YXRlIHRvIHN0b3JlIHRoZSBsYXlvdXQuXG4gICAgICAgIHByb2ZpbGUuZ3JhcGhMYXlvdXQgPSB7XG4gICAgICAgICAgICBuYW1lOiAncHJlc2V0JyxcbiAgICAgICAgICAgIGZpdDogZmFsc2UsXG4gICAgICAgICAgICBwb3NpdGlvbnMsXG4gICAgICAgICAgICB6b29tOiBjeS56b29tKCksXG4gICAgICAgICAgICBwYW46IGN5LnBhbigpLFxuICAgICAgICAgICAgX2Nob3NlblR5cGU6IGxheW91dFNlbGVjdG9yLmN1cnJlbnQ/LnZhbHVlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQWRkcyBjYWxsYmFja3Mgb25jZSBjeWN0b3NjYXBlIGlzIGluaXRpYWxpemVkLlxuICAgIHVzZUN5dG9zY2FwZUVmZmVjdChcbiAgICAgICAgY3kgPT4ge1xuICAgICAgICAgICAgY3l0b3NjYXBlLm9uKCd0YXAnLCAnbm9kZScsIGUgPT4gc2V0U2VsZWN0ZWQoZS50YXJnZXQpKTtcbiAgICAgICAgICAgIGN5dG9zY2FwZS5vbigndGFwJywgZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0ID09PSBjeSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZChudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGN5dG9zY2FwZS5vbignem9vbScsIHNldFByZXNldExheW91dCk7XG4gICAgICAgICAgICBjeXRvc2NhcGUub24oJ3BhbicsIHNldFByZXNldExheW91dCk7XG4gICAgICAgICAgICBjeXRvc2NhcGUubm9kZXMoKS5vbigncG9zaXRpb24nLCBzZXRQcmVzZXRMYXlvdXQpO1xuICAgICAgICB9LFxuICAgICAgICBbY3l0b3NjYXBlXVxuICAgICk7XG5cbiAgICAvLyBTZXQgbm9kZSBjbGFzc2VzIG9uIHNlbGVjdGVkLlxuICAgIHVzZUN5dG9zY2FwZUVmZmVjdChcbiAgICAgICAgY3kgPT4gc2VsZWN0ZWQgJiYgdXBkYXRlU2VsZWN0ZWROb2RlKGN5LCBzZWxlY3RlZC5kYXRhKCkuaWQpLFxuICAgICAgICBbc2VsZWN0ZWRdXG4gICAgKTtcblxuICAgIC8vIEZsYXNoIGNsYXNzZXMgd2hlbiBwcm9wcyBjaGFuZ2UuIFVzZXMgY2hhbmdlZCBhcyBhIHRyaWdnZXIuIEFsc29cbiAgICAvLyBmbGFzaCBhbGwgaW5wdXQgZWRnZXMgb3JpZ2luYXRpbmcgZnJvbSB0aGlzIG5vZGUgYW5kIGhpZ2hsaWdodFxuICAgIC8vIHRoZSBzdWJ0cmVlIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIG5vZGUuXG4gICAgdXNlQ3l0b3NjYXBlRWZmZWN0KFxuICAgICAgICBjeSA9PiBjaGFuZ2VkICYmIHVwZGF0ZUNoYW5nZWRQcm9wcyhjeSwgY2hhbmdlZC5pZCwgY2hhbmdlZC5wcm9wcyksXG4gICAgICAgIFtjaGFuZ2VkXVxuICAgICk7XG5cbiAgICAvLyBVcGRhdGUgY2FsbGJhY2tzIGZyb20gcHJvZmlsaW5nIGluZm9ybWF0aW9uLlxuICAgIHVzZUN5dG9zY2FwZUVmZmVjdChcbiAgICAgICAgY3kgPT5cbiAgICAgICAgICAgIHByb2ZpbGUudXBkYXRlZC5mb3JFYWNoKGNiID0+XG4gICAgICAgICAgICAgICAgdXBkYXRlQ2FsbGJhY2soY3ksIGNiLCBwcm9maWxlLmNhbGxiYWNrc1tjYl0pXG4gICAgICAgICAgICApLFxuICAgICAgICBbcHJvZmlsZS51cGRhdGVkXVxuICAgICk7XG5cbiAgICBpZiAobGlmZWN5Y2xlU3RhdGUgIT09ICdIWURSQVRFRCcpIHtcbiAgICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUgdG9vIGVhcmx5IC0gbW9zdCBsaWtlbHkgZHVyaW5nIGhvdCByZWxvYWRpbmcgLSB0aGVuXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gYmFpbCBvdXQgYW5kIHdhaXQgZm9yIHRoZSBmdWxsIHN0YXRlIHRvIGJlIGF2YWlsYWJsZVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtY2FsbGJhY2stZGFnLS1jb250YWluZXInPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWNhbGxiYWNrLWRhZy0tbWVzc2FnZSc+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+V2FpdGluZyBmb3IgYXBwIHRvIGJlIHJlYWR5Li4uPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGSVhNRTogTW92ZSB0byBhIG5ldyBjb21wb25lbnQ/XG4gICAgLy8gR2VuZXJhdGUgdGhlIGVsZW1lbnQgaW50cm9zcGVjdGlvbiBkYXRhLlxuICAgIGxldCBlbGVtZW50TmFtZSA9ICcnO1xuICAgIGxldCBlbGVtZW50SW5mbyA9IHt9O1xuICAgIGxldCBoYXNQYXR0ZXJucyA9IGZhbHNlO1xuXG4gICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBzZWxlY3RlZC5kYXRhKCk7XG5cbiAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBvbmVudCc6IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN0ID0gb21pdChbJ2lkJ10sIGdldENvbXBvbmVudChkYXRhLmlkKT8ucHJvcHMpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvID0gcmVzdDtcbiAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9IGRhdGEuaWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ3Byb3BlcnR5Jzoge1xuICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gZGF0YS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgZWxlbWVudEluZm9bZGF0YS5sYWJlbF0gPSBnZXRQcm9wVmFsdWUoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNhbGxiYWNrXG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudEluZm8udHlwZSA9IGRhdGEubW9kZTtcblxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB1aWQgYW5kIHNldCBwcm9maWxlLlxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrT3V0cHV0SWQgPSBkYXRhLmlkLnNsaWNlKGNiUHJlZml4TGVuKTtcbiAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9IGNsZWFuT3V0cHV0SWQoY2FsbGJhY2tPdXRwdXRJZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2JQcm9maWxlID0gcHJvZmlsZS5jYWxsYmFja3NbY2FsbGJhY2tPdXRwdXRJZF07XG4gICAgICAgICAgICAgICAgaWYgKGNiUHJvZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmssXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICB9ID0gY2JQcm9maWxlO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF2ZyA9IHYgPT4gTWF0aC5yb3VuZCh2IC8gKGNvdW50IHx8IDEpKTtcblxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5mb1snY2FsbCBjb3VudCddID0gY291bnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvLnN0YXR1cyA9IHJlZHVjZVN0YXR1cyhzdGF0dXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWluZyA9IChlbGVtZW50SW5mb1sndGltZSAoYXZnIG1pbGxpc2Vjb25kcyknXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsOiBhdmcodG90YWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZTogYXZnKGNvbXB1dGUpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5tb2RlID09PSAnc2VydmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltaW5nLm5ldHdvcmsgPSBhdmcobmV0d29yay50aW1lKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluZm9bJ2RhdGEgdHJhbnNmZXIgKGF2ZyBieXRlcyknXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZDogYXZnKG5ldHdvcmsuZG93bmxvYWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZDogYXZnKG5ldHdvcmsudXBsb2FkKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiByZXNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWluZ1sndXNlcjogJyArIGtleV0gPSBhdmcocmVzb3VyY2VzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluZm8ub3V0cHV0cyA9IGZsYXR0ZW5PdXRwdXRzKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvLmlucHV0cyA9IGZsYXR0ZW5JbnB1dHMoaW5wdXRzLCB7fSk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvLnN0YXRlID0gZmxhdHRlbklucHV0cyhzdGF0ZSwge30pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmZvWydjYWxsIGNvdW50J10gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGN5TGF5b3V0ID1cbiAgICAgICAgY2hvc2VuVHlwZSA9PT0gbGF5b3V0VHlwZVxuICAgICAgICAgICAgPyBncmFwaExheW91dFxuICAgICAgICAgICAgOiBtZXJnZVJpZ2h0KGxheW91dHNbbGF5b3V0VHlwZV0sIHtyZWFkeTogc2V0UHJlc2V0TGF5b3V0fSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1jYWxsYmFjay1kYWctLWNvbnRhaW5lcic+XG4gICAgICAgICAgICA8Q3l0b3NjYXBlQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgc3R5bGU9e3t3aWR0aDogJzEwMCUnLCBoZWlnaHQ6ICcxMDAlJ319XG4gICAgICAgICAgICAgICAgY3k9e3NldEN5dG9zY2FwZX1cbiAgICAgICAgICAgICAgICBlbGVtZW50cz17ZWxlbWVudHN9XG4gICAgICAgICAgICAgICAgbGF5b3V0PXtjeUxheW91dH1cbiAgICAgICAgICAgICAgICBzdHlsZXNoZWV0PXtzdHlsZXNoZWV0fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIHtzZWxlY3RlZCA/IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1jYWxsYmFjay1kYWctLWluZm8nPlxuICAgICAgICAgICAgICAgICAgICB7aGFzUGF0dGVybnMgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gaXNuJ3Qgc3VwcG9ydGVkIGZvciBwYXR0ZXJuLW1hdGNoaW5nIElEcyBhdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICA8SlNPTlRyZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9e2VsZW1lbnRJbmZvfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWU9J3N1bW1lcmZydWl0J1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxSZW5kZXJlcj17X2tleXMgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfa2V5cy5sZW5ndGggPT09IDEgPyBlbGVtZW50TmFtZSA6IF9rZXlzWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRJdGVtU3RyaW5nPXsodHlwZSwgZGF0YSwgaXRlbVR5cGUpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57aXRlbVR5cGV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEV4cGFuZE5vZGU9eyhrZXlOYW1lLCBkYXRhLCBsZXZlbCkgPT4gbGV2ZWwgPCAxfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdkYXNoLWNhbGxiYWNrLWRhZy0tbGF5b3V0U2VsZWN0b3InXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e2UgPT4gc2V0TGF5b3V0VHlwZShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgdmFsdWU9e2xheW91dFR5cGV9XG4gICAgICAgICAgICAgICAgcmVmPXtsYXlvdXRTZWxlY3Rvcn1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7a2V5cyhsYXlvdXRzKS5tYXAoayA9PiAoXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9e2t9IGtleT17a30+XG4gICAgICAgICAgICAgICAgICAgICAgICB7a31cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn1cblxuQ2FsbGJhY2tHcmFwaC5wcm9wVHlwZXMgPSB7fTtcblxuY2xhc3MgVW5jb25uZWN0ZWRDYWxsYmFja0dyYXBoQ29udGFpbmVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7aGFzRXJyb3I6IGZhbHNlfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKF8pIHtcbiAgICAgICAgcmV0dXJuIHtoYXNFcnJvcjogdHJ1ZX07XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIGluZm8pIHtcbiAgICAgICAgY29uc3Qge2Rpc3BhdGNofSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGRpc3BhdGNoKFxuICAgICAgICAgICAgb25FcnJvcih7XG4gICAgICAgICAgICAgICAgbXlJRDogdGhpcy5zdGF0ZS5teUlELFxuICAgICAgICAgICAgICAgIHR5cGU6ICdmcm9udEVuZCcsXG4gICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgaW5mb1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmhhc0Vycm9yID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtY2FsbGJhY2stZGFnLS1jb250YWluZXInPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWNhbGxiYWNrLWRhZy0tbWVzc2FnZSc+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+T29wcyEgVGhlIGNhbGxiYWNrIGdyYXBoIHRocmV3IGFuIGVycm9yLjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PkNoZWNrIHRoZSBlcnJvciBsaXN0IGZvciBkZXRhaWxzLjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgICA8Q2FsbGJhY2tHcmFwaCAvPlxuICAgICAgICApO1xuICAgIH1cbn1cblxuVW5jb25uZWN0ZWRDYWxsYmFja0dyYXBoQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgICBkaXNwYXRjaDogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbmNvbnN0IENhbGxiYWNrR3JhcGhDb250YWluZXIgPSBjb25uZWN0KG51bGwsIGRpc3BhdGNoID0+ICh7ZGlzcGF0Y2h9KSkoXG4gICAgVW5jb25uZWN0ZWRDYWxsYmFja0dyYXBoQ29udGFpbmVyXG4pO1xuXG5leHBvcnQge0NhbGxiYWNrR3JhcGhDb250YWluZXJ9O1xuIiwiY29uc3Qgc3R5bGVzaGVldCA9IFtcbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnKicsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAnZm9udC1zaXplJzogMTIsXG4gICAgICAgICAgICAnZm9udC1mYW1pbHknOiAnVmVyZGFuYSwgc2Fucy1zZXJpZidcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnZWRnZScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICB3aWR0aDogMixcbiAgICAgICAgICAgICdsaW5lLWNvbG9yJzogJyM4ODg4ODgnLFxuICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1jb2xvcic6ICcjODg4ODg4JyxcbiAgICAgICAgICAgICd0YXJnZXQtYXJyb3ctc2hhcGUnOiAndHJpYW5nbGUnLFxuICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1maWxsJzogJ2ZpbGxlZCcsXG4gICAgICAgICAgICAnYXJyb3ctc2NhbGUnOiAxLFxuICAgICAgICAgICAgJ2N1cnZlLXN0eWxlJzogJ2JlemllcicsXG4gICAgICAgICAgICAnY29udHJvbC1wb2ludC1zdGVwLXNpemUnOiA0MCxcbiAgICAgICAgICAgICd0cmFuc2l0aW9uLXByb3BlcnR5JzogJ2xpbmUtY29sb3IsIHRhcmdldC1hcnJvdy1jb2xvcicsXG4gICAgICAgICAgICAndHJhbnNpdGlvbi1kdXJhdGlvbic6ICcwLjI1cycsXG4gICAgICAgICAgICAndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nOiAnZWFzZS1pbi1vdXQtc2luZSdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnZWRnZVt0eXBlPVwiaGlkZGVuXCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdlZGdlW3R5cGU9XCJvdXRwdXRcIl0nLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgJ2xpbmUtY29sb3InOiAnIzAwODBEMCcsXG4gICAgICAgICAgICAndGFyZ2V0LWFycm93LWNvbG9yJzogJyMwMDgwRDAnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ2VkZ2VbdHlwZT1cInN0YXRlXCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICdsaW5lLXN0eWxlJzogJ2Rhc2hlZCdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnbm9kZScsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBjb2xvcjogJyMzMzMzMzMnLFxuICAgICAgICAgICAgcGFkZGluZzogNixcbiAgICAgICAgICAgICd0ZXh0LXZhbGlnbic6ICdjZW50ZXInLFxuICAgICAgICAgICAgJ3RleHQtaGFsaWduJzogJ2NlbnRlcicsXG4gICAgICAgICAgICAnYm9yZGVyLXdpZHRoJzogMixcbiAgICAgICAgICAgICdib3JkZXItb3BhY2l0eSc6IDAsXG4gICAgICAgICAgICAnYm9yZGVyLXN0eWxlJzogJ3NvbGlkJyxcbiAgICAgICAgICAgICdib3JkZXItY29sb3InOiAnIzg4ODg4OCcsXG4gICAgICAgICAgICAndHJhbnNpdGlvbi1wcm9wZXJ0eSc6ICdib3JkZXItb3BhY2l0eScsXG4gICAgICAgICAgICAndHJhbnNpdGlvbi1kdXJhdGlvbic6ICcwLjI1cycsXG4gICAgICAgICAgICAndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nOiAnZWFzZS1pbi1vdXQtc2luZSdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB7XG4gICAgICAgIHNlbGVjdG9yOiAnbm9kZVt0eXBlPVwiY2FsbGJhY2tcIl0nLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgd2lkdGg6IDM1LFxuICAgICAgICAgICAgaGVpZ2h0OiAyNSxcbiAgICAgICAgICAgIHNoYXBlOiAncm91bmQtcmVjdGFuZ2xlJyxcbiAgICAgICAgICAgIGxhYmVsOiBlID0+IGAke2UuZGF0YSgpLmNvdW50fVxcbiR7ZS5kYXRhKCkudGltZX0gbXNgLFxuICAgICAgICAgICAgJ3RleHQtd3JhcCc6ICd3cmFwJyxcbiAgICAgICAgICAgICd0ZXh0LWp1c3RpZmljYXRpb24nOiAnY2VudGVyJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdub2RlW3R5cGU9XCJjYWxsYmFja1wiXVttb2RlPVwiY2xpZW50XCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGNvbG9yOiAnIzMyMzMzMCcsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjRjBEQjRGJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdub2RlW3R5cGU9XCJjYWxsYmFja1wiXVttb2RlPVwic2VydmVyXCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGNvbG9yOiAnIzMyMzMzMCcsXG4gICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjMDBDQzk2J1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICdub2RlW3R5cGU9XCJjb21wb25lbnRcIl0sIG5vZGVbdHlwZT1cIndpbGRjYXJkXCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIHdpZHRoOiAnbGFiZWwnLFxuICAgICAgICAgICAgLy8gaGVpZ2h0OiAnbGFiZWwnLFxuICAgICAgICAgICAgc2hhcGU6ICdyZWN0YW5nbGUnLFxuICAgICAgICAgICAgY29udGVudDogZSA9PiBlLmRhdGEoKS5sYWJlbC5yZXBsYWNlKC9cIi9nLCAnJyksXG4gICAgICAgICAgICAndGV4dC12YWxpZ24nOiAndG9wJyxcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyNCOUMyQ0UnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJ25vZGVbdHlwZT1cInByb3BlcnR5XCJdJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIHdpZHRoOiAnbGFiZWwnLFxuICAgICAgICAgICAgaGVpZ2h0OiAyMCxcbiAgICAgICAgICAgIHNoYXBlOiAncmVjdGFuZ2xlJyxcbiAgICAgICAgICAgIGNvbnRlbnQ6ICdkYXRhKGxhYmVsKScsXG4gICAgICAgICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyMxMDlERkYnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJy5zZWxlY3RlZC1ub2RlJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGdob3N0OiAneWVzJyxcbiAgICAgICAgICAgICdnaG9zdC1vZmZzZXQteCc6IDIsXG4gICAgICAgICAgICAnZ2hvc3Qtb2Zmc2V0LXknOiAyLFxuICAgICAgICAgICAgJ2dob3N0LW9wYWNpdHknOiAwLjI1LFxuICAgICAgICAgICAgJ2JvcmRlci1vcGFjaXR5JzogMVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICcucHJvcC1jaGFuZ2VkLCAuY2FsbGJhY2stbG9hZGluZycsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJyNDQzQzQjcnLFxuICAgICAgICAgICAgJ2JvcmRlci13aWR0aCc6IDIsXG4gICAgICAgICAgICAnYm9yZGVyLW9wYWNpdHknOiAxXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAge1xuICAgICAgICBzZWxlY3RvcjogJy5jYWxsYmFjay1lcnJvcicsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjRTEzMzJFJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICcudHJpZ2dlcmVkJyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICdsaW5lLWNvbG9yJzogJyNDQzQzQjcnLFxuICAgICAgICAgICAgJ3RhcmdldC1hcnJvdy1jb2xvcic6ICcjQ0M0M0I3J1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHtcbiAgICAgICAgc2VsZWN0b3I6ICcuaW5hY3RpdmUnLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgb3BhY2l0eTogMC41XG4gICAgICAgIH1cbiAgICB9XG5dO1xuXG5leHBvcnQgZGVmYXVsdCBzdHlsZXNoZWV0O1xuIiwiaW1wb3J0IHtTVEFUVVMsIFNUQVRVU01BUH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL2NvbnN0YW50cyc7XG5cbi8qKlxuICogZ2V0RWRnZVR5cGVzXG4gKlxuICogRmluZHMgYWxsIGVkZ2VzIGNvbm5lY3RlZCB0byBhIG5vZGUgYW5kIHNwbGl0cyB0aGVtIGJ5IHR5cGUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG5vZGUgLSBDeXRvc2NhcGUgbm9kZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IC0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGVkZ2VzLCBzb3J0ZWQgYnkgdHlwZS5cbiAqL1xuZnVuY3Rpb24gZ2V0RWRnZVR5cGVzKG5vZGUpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IG5vZGUuY29ubmVjdGVkRWRnZXMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnB1dDogZWxlbWVudHMuZmlsdGVyKCdbdHlwZSA9IFwiaW5wdXRcIl0nKSxcbiAgICAgICAgc3RhdGU6IGVsZW1lbnRzLmZpbHRlcignW3R5cGUgPSBcInN0YXRlXCJdJyksXG4gICAgICAgIG91dHB1dDogZWxlbWVudHMuZmlsdGVyKCdbdHlwZSA9IFwib3V0cHV0XCJdJylcbiAgICB9O1xufVxuXG4vKipcbiAqIHVwZGF0ZVNlbGVjdGVkXG4gKlxuICogVXBkYXRlcyB0aGUgY2xhc3NlcyBvZiB0aGUgc2VsZWN0ZWQgbm9kZSBhbmQgcmVjZW50ZXJzIHRoZSB2aWV3cG9ydC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3kgLSBSZWZlcmVuY2UgdG8gdGhlIGN5dG9zY2FwZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBpZCAtIFRoZSBpZCBvZiB0aGUgc2VsZWN0ZWQgbm9kZS5cbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gLSBjbGVhbnVwIGZ1bmN0aW9uLCBmb3IgdXNlRWZmZWN0IGhvb2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGVkTm9kZShjeSwgaWQpIHtcbiAgICBmdW5jdGlvbiBhc2NlbmQobm9kZSwgY29sbGVjdGlvbiwgdmlzaXRlZCA9IG5ldyBTZXQoKSkge1xuICAgICAgICBpZiAodmlzaXRlZC5oYXMobm9kZS5pZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZpc2l0ZWQuYWRkKG5vZGUuaWQoKSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBub2RlLmRhdGEoKS50eXBlID09PSAnY2FsbGJhY2snID8gJ2lucHV0JyA6ICdvdXRwdXQnO1xuICAgICAgICBjb25zdCBlZGdlcyA9IGdldEVkZ2VUeXBlcyhub2RlKVt0eXBlXTtcbiAgICAgICAgY29uc3QgcGFyZW50cyA9IGVkZ2VzLnNvdXJjZXMoKTtcbiAgICAgICAgY29sbGVjdGlvbi5tZXJnZShlZGdlcyk7XG4gICAgICAgIGNvbGxlY3Rpb24ubWVyZ2UocGFyZW50cyk7XG4gICAgICAgIGlmIChub2RlLmRhdGEoKS50eXBlID09PSAncHJvcGVydHknKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uLm1lcmdlKG5vZGUuYW5jZXN0b3JzKCkpO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudHMuZm9yRWFjaChub2RlID0+IGFzY2VuZChub2RlLCBjb2xsZWN0aW9uLCB2aXNpdGVkKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVzY2VuZChub2RlLCBjb2xsZWN0aW9uLCB2aXNpdGVkID0gbmV3IFNldCgpKSB7XG4gICAgICAgIGlmICh2aXNpdGVkLmhhcyhub2RlLmlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmlzaXRlZC5hZGQobm9kZS5pZCgpKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IG5vZGUuZGF0YSgpLnR5cGUgPT09ICdjYWxsYmFjaycgPyAnb3V0cHV0JyA6ICdpbnB1dCc7XG4gICAgICAgIGNvbnN0IGVkZ2VzID0gZ2V0RWRnZVR5cGVzKG5vZGUpW3R5cGVdO1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGVkZ2VzLnRhcmdldHMoKTtcbiAgICAgICAgY29sbGVjdGlvbi5tZXJnZShlZGdlcyk7XG4gICAgICAgIGNvbGxlY3Rpb24ubWVyZ2UoY2hpbGRyZW4pO1xuICAgICAgICBpZiAobm9kZS5kYXRhKCkudHlwZSA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgICAgICAgY29sbGVjdGlvbi5tZXJnZShub2RlLmFuY2VzdG9ycygpKTtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKG5vZGUgPT4gZGVzY2VuZChub2RlLCBjb2xsZWN0aW9uLCB2aXNpdGVkKSk7XG4gICAgfVxuXG4gICAgaWYgKGlkKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBjeS5nZXRFbGVtZW50QnlJZChpZCk7XG5cbiAgICAgICAgLy8gSGlnaGxpZ2h0IHRoZSBzZWxlY3RlZCBub2RlLlxuXG4gICAgICAgIG5vZGUuYWRkQ2xhc3MoJ3NlbGVjdGVkLW5vZGUnKTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBzdWJ0cmVlIHRoYXQgdGhlIG5vZGUgYmVsb25ncyB0by4gQSBzdWJ0cmVlIGNvbnRhaW5zXG4gICAgICAgIC8vIGFsbCBhbGwgYW5jZXN0b3JzIGFuZCBkZXNjZW5kYW50cyB0aGF0IGFyZSBjb25uZWN0ZWQgdmlhIElucHV0c1xuICAgICAgICAvLyBvciBPdXRwdXRzIChidXQgbm90IFN0YXRlKS5cblxuICAgICAgICBjb25zdCBzdWJ0cmVlID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICBzdWJ0cmVlLm1lcmdlKG5vZGUpO1xuICAgICAgICBhc2NlbmQobm9kZSwgc3VidHJlZSk7XG4gICAgICAgIGRlc2NlbmQobm9kZSwgc3VidHJlZSk7XG5cbiAgICAgICAgY29uc3Qgb3RoZXIgPSBzdWJ0cmVlLmFic29sdXRlQ29tcGxlbWVudCgpO1xuICAgICAgICBvdGhlci5hZGRDbGFzcygnaW5hY3RpdmUnKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQtbm9kZScpO1xuICAgICAgICAgICAgb3RoZXIucmVtb3ZlQ2xhc3MoJ2luYWN0aXZlJyk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogdXBkYXRlQ2hhbmdlZFByb3BcbiAqXG4gKiBGbGFzaGVzIHByb3BlcnR5IG5vZGVzIHRoYXQgdXBkYXRlZCBhbmQgYW55IGlucHV0cyB0aGV5IGFyZSBjb25uZWN0ZWQgdG8uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGN5IC0gUmVmZXJlbmNlIHRvIHRoZSBjeXRvc2NhcGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBUaGUgY29tcG9uZW50IGlkIHdoaWNoIHVwZGF0ZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgLSBUaGUgcHJvcHMgdGhhdCB1cGRhdGVkLlxuICogQHBhcmFtIHtOdW1iZXJ9IGZsYXNoVGltZSAtIFRoZSB0aW1lIHRvIGZsYXNoIGNsYXNzZXMgZm9yIGluIG1zLlxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUNoYW5nZWRQcm9wcyhjeSwgaWQsIHByb3BzLCBmbGFzaFRpbWUgPSA1MDApIHtcbiAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGAke2lkfS4ke3Byb3B9YCk7XG4gICAgICAgIG5vZGUuZmxhc2hDbGFzcygncHJvcC1jaGFuZ2VkJywgZmxhc2hUaW1lKTtcbiAgICAgICAgbm9kZS5lZGdlc1RvKCcqJylcbiAgICAgICAgICAgIC5maWx0ZXIoJ1t0eXBlID0gXCJpbnB1dFwiXScpXG4gICAgICAgICAgICAuZmxhc2hDbGFzcygndHJpZ2dlcmVkJywgZmxhc2hUaW1lKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiB1cGRhdGVDYWxsYmFja1xuICpcbiAqIFVwZGF0ZXMgYSBjYWxsYmFjayBub2RlIHdpdGggcHJvZmlsaW5nIGluZm9ybWF0aW9uIChjYWxsIGNvdW50LCBhdmcgdGltZSlcbiAqIGFuZCBhZGRzIG9yIHJlbW92ZXMgY2xhc3NlcyBhcyBuZWNlc3NhcnkuIENsYXNzZXMgYXJlIGFsd2F5cyBhc3NlcnQgZm9yXG4gKiBhdCBsZWFzdCBmbGFzaFRpbWUgbXMgc28gdGhhdCB0aGV5IGNhbiBiZSB2aXN1YWxseSBvYnNlcnZlZC4gV2hlbiBjYWxsYmFja3NcbiAqIHJlc29sdmUsIGFsbCBvdXRwdXQgZWRnZXMgYXJlIGZsYXNoZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGN5IC0gUmVmZXJlbmNlIHRvIHRoZSBjeXRvc2NhcGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBUaGUgaWQgb2YgdGhlIGNhbGxiYWNrIChpLmUuLCBpdCdzIG91dHB1dCBpZGVudGlmaWVyKVxuICogQHBhcmFtIHtPYmplY3R9IHByb2ZpbGUgLSBUaGUgY2FsbGJhY2sgcHJvZmlsaW5nIGluZm9ybWF0aW9uLlxuICogQHBhcmFtIHtOdW1iZXJ9IGZsYXNoVGltZSAtIFRoZSB0aW1lIHRvIGZsYXNoIGNsYXNzZXMgZm9yIGluIG1zLlxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUNhbGxiYWNrKGN5LCBpZCwgcHJvZmlsZSwgZmxhc2hUaW1lID0gNTAwKSB7XG4gICAgY29uc3Qgbm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGBfX2Rhc2hfY2FsbGJhY2tfXy4ke2lkfWApO1xuICAgIGNvbnN0IHtjb3VudCwgdG90YWwsIHN0YXR1c30gPSBwcm9maWxlO1xuICAgIGNvbnN0IHtsYXRlc3R9ID0gc3RhdHVzO1xuXG4gICAgLy8gVXBkYXRlIGRhdGEuXG4gICAgY29uc3QgYXZnVGltZSA9IGNvdW50ID4gMCA/IHRvdGFsIC8gY291bnQgOiAwO1xuICAgIG5vZGUuZGF0YSgnY291bnQnLCBjb3VudCk7XG4gICAgbm9kZS5kYXRhKCd0aW1lJywgTWF0aC5yb3VuZChhdmdUaW1lKSk7XG5cbiAgICAvLyBFaXRoZXIgZmxhc2ggdGhlIGNsYXNzZXMgT1IgbWFpbnRhaW4gaXQgZm9yIGxvbmcgY2FsbGJhY2tzLlxuICAgIGlmIChsYXRlc3QgPT09ICdsb2FkaW5nJykge1xuICAgICAgICBub2RlLmRhdGEoJ2xvYWRpbmdTZXQnLCBEYXRlLm5vdygpKTtcbiAgICAgICAgbm9kZS5hZGRDbGFzcygnY2FsbGJhY2stbG9hZGluZycpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5oYXNDbGFzcygnY2FsbGJhY2stbG9hZGluZycpKSB7XG4gICAgICAgIGNvbnN0IHRpbWVMZWZ0ID0gbm9kZS5kYXRhKCdsb2FkaW5nU2V0JykgKyBmbGFzaFRpbWUgLSBEYXRlLm5vdygpO1xuICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT4gbm9kZS5yZW1vdmVDbGFzcygnY2FsbGJhY2stbG9hZGluZycpLFxuICAgICAgICAgICAgTWF0aC5tYXgodGltZUxlZnQsIDApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgICBsYXRlc3QgIT09ICdsb2FkaW5nJyAmJlxuICAgICAgICBsYXRlc3QgIT09IFNUQVRVU01BUFtTVEFUVVMuT0tdICYmXG4gICAgICAgIGxhdGVzdCAhPT0gU1RBVFVTTUFQW1NUQVRVUy5QUkVWRU5UX1VQREFURV1cbiAgICApIHtcbiAgICAgICAgbm9kZS5kYXRhKCdlcnJvclNldCcsIERhdGUubm93KCkpO1xuICAgICAgICBub2RlLmFkZENsYXNzKCdjYWxsYmFjay1lcnJvcicpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5oYXNDbGFzcygnY2FsbGJhY2stZXJyb3InKSkge1xuICAgICAgICBjb25zdCB0aW1lTGVmdCA9IG5vZGUuZGF0YSgnZXJyb3JTZXQnKSArIGZsYXNoVGltZSAtIERhdGUubm93KCk7XG4gICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAoKSA9PiBub2RlLnJlbW92ZUNsYXNzKCdjYWxsYmFjay1lcnJvcicpLFxuICAgICAgICAgICAgTWF0aC5tYXgodGltZUxlZnQsIDApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRklYTUU6IFRoaXMgd2lsbCBmbGFzaCBicmFuY2hlcyB0aGF0IHJldHVybiBub191cGRhdGUhIVxuICAgIC8vIElmIHRoZSBjYWxsYmFjayByZXNvbHZlZCBwcm9wZXJseSwgZmxhc2ggdGhlIG91dHB1dHMuXG4gICAgaWYgKGxhdGVzdCA9PT0gU1RBVFVTTUFQW1NUQVRVUy5PS10pIHtcbiAgICAgICAgbm9kZS5lZGdlc1RvKCcqJykuZmxhc2hDbGFzcygndHJpZ2dlcmVkJywgZmxhc2hUaW1lKTtcbiAgICB9XG59XG4iLCJpbXBvcnQge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7b25FcnJvciwgcmV2ZXJ0fSBmcm9tICcuLi8uLi9hY3Rpb25zJztcblxuY2xhc3MgQ29tcG9uZW50RXJyb3JCb3VuZGFyeSBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgbXlJRDogcHJvcHMuY29tcG9uZW50SWQsXG4gICAgICAgICAgICBvbGRDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGhhc0Vycm9yOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoXykge1xuICAgICAgICByZXR1cm4ge2hhc0Vycm9yOiB0cnVlfTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRDYXRjaChlcnJvciwgaW5mbykge1xuICAgICAgICBjb25zdCB7ZGlzcGF0Y2h9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICBvbkVycm9yKHtcbiAgICAgICAgICAgICAgICBteUlEOiB0aGlzLnN0YXRlLm15SUQsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2Zyb250RW5kJyxcbiAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICBpbmZvXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBkaXNwYXRjaChyZXZlcnQpO1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgICBjb25zdCBwcmV2Q2hpbGRyZW4gPSBwcmV2UHJvcHMuY2hpbGRyZW47XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICF0aGlzLnN0YXRlLmhhc0Vycm9yICYmXG4gICAgICAgICAgICBwcmV2Q2hpbGRyZW4gIT09IHByZXZTdGF0ZS5vbGRDaGlsZHJlbiAmJlxuICAgICAgICAgICAgcHJldkNoaWxkcmVuICE9PSB0aGlzLnByb3BzLmNoaWxkcmVuXG4gICAgICAgICkge1xuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWRpZC11cGRhdGUtc2V0LXN0YXRlICovXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBvbGRDaGlsZHJlbjogcHJldkNoaWxkcmVuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge2hhc0Vycm9yLCBvbGRDaGlsZHJlbn0gPSB0aGlzLnN0YXRlO1xuICAgICAgICByZXR1cm4gaGFzRXJyb3IgPyBvbGRDaGlsZHJlbiA6IHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgfVxufVxuXG5Db21wb25lbnRFcnJvckJvdW5kYXJ5LnByb3BUeXBlcyA9IHtcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBjb21wb25lbnRJZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBlcnJvcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBkaXNwYXRjaDogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvbXBvbmVudEVycm9yQm91bmRhcnk7XG4iLCJpbXBvcnQge2Nvbm5lY3R9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCAnLi9Gcm9udEVuZEVycm9yLmNzcyc7XG5pbXBvcnQge0NvbXBvbmVudCwgdXNlUmVmLCB1c2VTdGF0ZSwgdXNlRWZmZWN0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQ29sbGFwc2VJY29uIGZyb20gJy4uL2ljb25zL0NvbGxhcHNlSWNvbi5zdmcnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAnLi4vUGVyY3kuY3NzJztcbmltcG9ydCB7dXJsQmFzZX0gZnJvbSAnLi4vLi4vLi4vYWN0aW9ucy91dGlscyc7XG5cbmltcG9ydCB3ZXJremV1Z0NzcyBmcm9tICcuLi93ZXJremV1Z2Nzcyc7XG5cbmNsYXNzIEZyb250RW5kRXJyb3IgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGNvbGxhcHNlZDogdGhpcy5wcm9wcy5pc0xpc3RJdGVtXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB7ZSwgaW5BbGVydHNUcmF5fSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGNvbnN0IHtjb2xsYXBzZWR9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgICBjb25zdCBjYXJkQ2xhc3NlcyA9XG4gICAgICAgICAgICAnZGFzaC1lcnJvci1jYXJkX19jb250ZW50JyArXG4gICAgICAgICAgICAoaW5BbGVydHNUcmF5ID8gJyBkYXNoLWVycm9yLWNhcmQtLWFsZXJ0cy10cmF5JyA6ICcnKTtcblxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1pbmxpbmUtY29tbWVudHMgKi9cbiAgICAgICAgY29uc3QgZXJyb3JIZWFkZXIgPSAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yLWl0ZW0gdGVzdC1kZXZ0b29scy1lcnJvci10b2dnbGUnXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdGhpcy5zZXRTdGF0ZSh7Y29sbGFwc2VkOiAhY29sbGFwc2VkfSl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yLXRvcF9fZ3JvdXAnPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3JfX3RpdGxlJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtlLmVycm9yLm1lc3NhZ2UgfHwgJ0Vycm9yJ31cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J2Rhc2gtZmUtZXJyb3ItdG9wX19ncm91cCc+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9fdGltZXN0YW1wIHBlcmN5LWhpZGUnPlxuICAgICAgICAgICAgICAgICAgICAgICAge2Ake2UudGltZXN0YW1wLnRvTG9jYWxlVGltZVN0cmluZygpfWB9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yX190aW1lc3RhbXAgcGVyY3ktc2hvdyc+XG4gICAgICAgICAgICAgICAgICAgICAgICB7LyogU3BlY2lhbCBwZXJjeSB0aW1lc3RhbXAgZm9yIHZpc3VhbCB0ZXN0aW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICogSGlkZGVuIGR1cmluZyByZWd1bGFyIHVzYWdlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICovfVxuICAgICAgICAgICAgICAgICAgICAgICAgMDA6MDA6MDAgUE1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgIDxDb2xsYXBzZUljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGRhc2gtZmUtZXJyb3JfX2NvbGxhcHNlICR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VkID8gJ2Rhc2gtZmUtZXJyb3JfX2NvbGxhcHNlLS1mbGlwcGVkJyA6ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHRoaXMuc2V0U3RhdGUoe2NvbGxhcHNlZDogIWNvbGxhcHNlZH0pfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y2FyZENsYXNzZXN9PlxuICAgICAgICAgICAgICAgIHtlcnJvckhlYWRlcn1cbiAgICAgICAgICAgICAgICB7IWNvbGxhcHNlZCAmJiA8RXJyb3JDb250ZW50IGVycm9yPXtlLmVycm9yfSAvPn1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gQmFja2VuZEVycm9yKHtlcnJvciwgYmFzZX0pIHtcbiAgICBjb25zdCBpZnJhbWVSZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgY29uc3QgW2hlaWdodCwgc2V0SGVpZ2h0XSA9IHVzZVN0YXRlKCc1MDBweCcpOyAvLyBEZWZhdWx0IGhlaWdodFxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlTWVzc2FnZSA9IGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBldmVudC5kYXRhICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGV2ZW50LmRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuZGF0YS50eXBlID09PSAnSUZSQU1FX0hFSUdIVCdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHNldEhlaWdodChgJHtldmVudC5kYXRhLmhlaWdodH1weGApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlTWVzc2FnZSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZU1lc3NhZ2UpO1xuICAgIH0sIFtdKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxpZnJhbWVcbiAgICAgICAgICAgIHJlZj17aWZyYW1lUmVmfVxuICAgICAgICAgICAgc3JjRG9jPXtlcnJvci5odG1sXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICc8L2hlYWQ+JyxcbiAgICAgICAgICAgICAgICAgICAgYDxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4ke3dlcmt6ZXVnQ3NzfTwvc3R5bGU+XG4gICAgICAgICAgICAgICAgICAgIDxzY3JpcHQ+XG4gIGZ1bmN0aW9uIHNlbmRIZWlnaHQoKSB7XG4gICAgY29uc3QgaGVpZ2h0ID0gZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQ7XG4gICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZSh7IHR5cGU6IFwiSUZSQU1FX0hFSUdIVFwiLCBoZWlnaHQgfSwgXCIqXCIpO1xuICB9XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIHNlbmRIZWlnaHQpO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCBzZW5kSGVpZ2h0KTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBzZW5kSGVpZ2h0KTtcbjwvc2NyaXB0PjwvaGVhZD5gXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCc9XCI/X19kZWJ1Z2dlcl9fJywgYD1cIiR7YmFzZX0/X19kZWJ1Z2dlcl9fYCl9XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICogNjdweCBvZiBwYWRkaW5nIGFuZCBtYXJnaW4gYmV0d2VlbiB0aGlzXG4gICAgICAgICAgICAgICAgICogaWZyYW1lIGFuZCB0aGUgcGFyZW50IGNvbnRhaW5lci5cbiAgICAgICAgICAgICAgICAgKiA2NyB3YXMgZGV0ZXJtaW5lZCBtYW51YWxseSBpbiB0aGVcbiAgICAgICAgICAgICAgICAgKiBicm93c2VyJ3MgZGV2IHRvb2xzLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIHdpZHRoOiAnY2FsYyg2MDBweCAtIDY3cHgpJyxcbiAgICAgICAgICAgICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodFxuICAgICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICApO1xufVxuXG5jb25zdCBNQVhfTUVTU0FHRV9MRU5HVEggPSA0MDtcbi8qIGVzbGludC1kaXNhYmxlIG5vLWlubGluZS1jb21tZW50cyAqL1xuZnVuY3Rpb24gVW5jb25uZWN0ZWRFcnJvckNvbnRlbnQoe2Vycm9yLCBiYXNlfSkge1xuICAgIC8vIEhlbHBlciB0byBkZXRlY3QgZnVsbCBIVE1MIGRvY3VtZW50XG4gICAgY29uc3QgaXNGdWxsSHRtbERvYyA9XG4gICAgICAgIHR5cGVvZiBlcnJvci5odG1sID09PSAnc3RyaW5nJyAmJlxuICAgICAgICBlcnJvci5odG1sLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJzwhZG9jdHlwZScpO1xuXG4gICAgLy8gSGVscGVyIHRvIGRldGVjdCBIVE1MIGZyYWdtZW50XG4gICAgY29uc3QgaXNIdG1sRnJhZ21lbnQgPVxuICAgICAgICB0eXBlb2YgZXJyb3IuaHRtbCA9PT0gJ3N0cmluZycgJiYgZXJyb3IuaHRtbC50cmltKCkuc3RhcnRzV2l0aCgnPCcpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Vycm9yLWNvbnRhaW5lcic+XG4gICAgICAgICAgICB7LyogRnJvbnRlbmQgZXJyb3IgbWVzc2FnZSAqL31cbiAgICAgICAgICAgIHt0eXBlb2YgZXJyb3IubWVzc2FnZSAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UubGVuZ3RoIDwgTUFYX01FU1NBR0VfTEVOR1RIID8gbnVsbCA6IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9fc3QnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9faW5mbyBkYXNoLWZlLWVycm9yX19jdXJ2ZWQnPlxuICAgICAgICAgICAgICAgICAgICAgICAge2Vycm9yLm1lc3NhZ2V9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgey8qIEZyb250ZW5kIHN0YWNrIHRyYWNlICovfVxuICAgICAgICAgICAge3R5cGVvZiBlcnJvci5zdGFjayAhPT0gJ3N0cmluZycgPyBudWxsIDogKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yX19zdCc+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWZlLWVycm9yX19pbmZvJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkZXRhaWxzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdW1tYXJ5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUaGlzIGVycm9yIG9yaWdpbmF0ZWQgZnJvbSB0aGUgYnVpbHQtaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgY29kZSB0aGF0IHJ1bnMgRGFzaCBhcHBzLiBDbGlja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VlIHRoZSBmdWxsIHN0YWNrIHRyYWNlIG9yIG9wZW4geW91clxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJvd3NlcidzIGNvbnNvbGUuKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdW1tYXJ5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJvci5zdGFjay5zcGxpdCgnXFxuJykubWFwKChsaW5lLCBpKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGtleT17aX0+e2xpbmV9PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXRhaWxzPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgIHsvKiBCYWNrZW5kIGVycm9yOiBmdWxsIEhUTUwgZG9jdW1lbnQgKi99XG4gICAgICAgICAgICB7aXNGdWxsSHRtbERvYyA/IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1iZS1lcnJvcl9fc3QnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1iYWNrZW5kLWVycm9yJz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxCYWNrZW5kRXJyb3IgZXJyb3I9e2Vycm9yfSBiYXNlPXtiYXNlfSAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkgOiBpc0h0bWxGcmFnbWVudCA/IChcbiAgICAgICAgICAgICAgICAvLyBCYWNrZW5kIGVycm9yOiBIVE1MIGZyYWdtZW50XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtYmUtZXJyb3JfX3N0cic+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nZGFzaC1iYWNrZW5kLWVycm9yJ1xuICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGVycm9yLmh0bWx9fVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSA6IHR5cGVvZiBlcnJvci5odG1sID09PSAnc3RyaW5nJyA/IChcbiAgICAgICAgICAgICAgICAvLyBCYWNrZW5kIGVycm9yOiBwbGFpbiB0ZXh0XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtYmUtZXJyb3JfX3N0cic+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWJhY2tlbmQtZXJyb3InPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHByZT57ZXJyb3IuaHRtbH08L3ByZT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn1cbi8qIGVzbGludC1lbmFibGUgbm8taW5saW5lLWNvbW1lbnRzICovXG5cbmNvbnN0IGVycm9yUHJvcFR5cGVzID0gUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBtZXNzYWdlOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gICAgLyogZnJvbnQtZW5kIGVycm9yIG1lc3NhZ2VzICovXG4gICAgc3RhY2s6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgICAvKiBiYWNrZW5kIGVycm9yIG1lc3NhZ2VzICovXG4gICAgaHRtbDogUHJvcFR5cGVzLnN0cmluZ1xufSk7XG5cblVuY29ubmVjdGVkRXJyb3JDb250ZW50LnByb3BUeXBlcyA9IHtcbiAgICBlcnJvcjogZXJyb3JQcm9wVHlwZXMsXG4gICAgYmFzZTogUHJvcFR5cGVzLnN0cmluZ1xufTtcblxuY29uc3QgRXJyb3JDb250ZW50ID0gY29ubmVjdChzdGF0ZSA9PiAoe2Jhc2U6IHVybEJhc2Uoc3RhdGUuY29uZmlnKX0pKShcbiAgICBVbmNvbm5lY3RlZEVycm9yQ29udGVudFxuKTtcblxuRnJvbnRFbmRFcnJvci5wcm9wVHlwZXMgPSB7XG4gICAgZTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgICAgdGltZXN0YW1wOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgICBlcnJvcjogZXJyb3JQcm9wVHlwZXNcbiAgICB9KSxcbiAgICBpbkFsZXJ0c1RyYXk6IFByb3BUeXBlcy5ib29sLFxuICAgIGlzTGlzdEl0ZW06IFByb3BUeXBlcy5ib29sXG59O1xuXG5Gcm9udEVuZEVycm9yLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBpbkFsZXJ0c1RyYXk6IGZhbHNlLFxuICAgIGlzTGlzdEl0ZW06IGZhbHNlXG59O1xuXG5leHBvcnQge0Zyb250RW5kRXJyb3J9O1xuIiwiaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgJy4vRnJvbnRFbmRFcnJvci5jc3MnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7RnJvbnRFbmRFcnJvcn0gZnJvbSAnLi9Gcm9udEVuZEVycm9yLnJlYWN0JztcblxuY2xhc3MgRnJvbnRFbmRFcnJvckNvbnRhaW5lciBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge2Vycm9ycywgY29ubmVjdGVkLCBjbGlja0hhbmRsZXJ9ID0gdGhpcy5wcm9wcztcblxuICAgICAgICBjb25zdCBpbkFsZXJ0c1RyYXkgPSB0aGlzLnByb3BzLmluQWxlcnRzVHJheTtcbiAgICAgICAgbGV0IGNhcmRDbGFzc2VzID0gJ2Rhc2gtZXJyb3ItY2FyZCBkYXNoLWVycm9yLWNhcmQtLWNvbnRhaW5lcic7XG5cbiAgICAgICAgY29uc3QgZXJyb3JFbGVtZW50cyA9IGVycm9ycy5tYXAoKGVycm9yLCBpKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gPEZyb250RW5kRXJyb3IgZT17ZXJyb3J9IGlzTGlzdEl0ZW09e3RydWV9IGtleT17aX0gLz47XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaW5BbGVydHNUcmF5KSB7XG4gICAgICAgICAgICBjYXJkQ2xhc3NlcyArPSAnIGRhc2gtZXJyb3ItY2FyZC0tYWxlcnRzLXRyYXknO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y2FyZENsYXNzZXN9PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWVycm9yLWNhcmRfX3RvcGJhcic+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWVycm9yLWNhcmRfX21lc3NhZ2UnPlxuICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y29ubmVjdGVkID8gbnVsbCA6ICdcXHUwMGEwIPCfmqsgU2VydmVyIFVuYXZhaWxhYmxlJ31cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nZGFzaC1mZS1lcnJvcl9faWNvbi14J1xuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gY2xpY2tIYW5kbGVyKCl9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIMOXXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWVycm9yLWNhcmRfX2xpc3QnPntlcnJvckVsZW1lbnRzfTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5Gcm9udEVuZEVycm9yQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgICBpZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBlcnJvcnM6IFByb3BUeXBlcy5hcnJheSxcbiAgICBjb25uZWN0ZWQ6IFByb3BUeXBlcy5ib29sLFxuICAgIGluQWxlcnRzVHJheTogUHJvcFR5cGVzLmFueVxufTtcblxuRnJvbnRFbmRFcnJvckNvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gICAgaW5BbGVydHNUcmF5OiBQcm9wVHlwZXMuYW55XG59O1xuXG5leHBvcnQge0Zyb250RW5kRXJyb3JDb250YWluZXJ9O1xuIiwiaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge0RlYnVnTWVudX0gZnJvbSAnLi9tZW51L0RlYnVnTWVudS5yZWFjdCc7XG5cbmNsYXNzIFVuY29ubmVjdGVkR2xvYmFsRXJyb3JDb250YWluZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtjb25maWcsIGVycm9yLCBjaGlsZHJlbn0gPSB0aGlzLnByb3BzO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBpZD0nX2Rhc2gtZ2xvYmFsLWVycm9yLWNvbnRhaW5lcic+XG4gICAgICAgICAgICAgICAgPERlYnVnTWVudVxuICAgICAgICAgICAgICAgICAgICBjb25maWc9e2NvbmZpZ31cbiAgICAgICAgICAgICAgICAgICAgZXJyb3I9e2Vycm9yfVxuICAgICAgICAgICAgICAgICAgICBob3RSZWxvYWQ9e0Jvb2xlYW4oY29uZmlnLmhvdF9yZWxvYWQpfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0nX2Rhc2gtYXBwLWNvbnRlbnQnPntjaGlsZHJlbn08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L0RlYnVnTWVudT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuVW5jb25uZWN0ZWRHbG9iYWxFcnJvckNvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5vYmplY3QsXG4gICAgY29uZmlnOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGVycm9yOiBQcm9wVHlwZXMub2JqZWN0XG59O1xuXG5jb25zdCBHbG9iYWxFcnJvckNvbnRhaW5lciA9IGNvbm5lY3Qoc3RhdGUgPT4gKHtcbiAgICBjb25maWc6IHN0YXRlLmNvbmZpZyxcbiAgICBlcnJvcjogc3RhdGUuZXJyb3Jcbn0pKShVbmNvbm5lY3RlZEdsb2JhbEVycm9yQ29udGFpbmVyKTtcblxuZXhwb3J0IGRlZmF1bHQgR2xvYmFsRXJyb3JDb250YWluZXI7XG4iLCJpbXBvcnQgUmVhY3QsIHt1c2VFZmZlY3QsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtjb25jYXR9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7dXNlU2VsZWN0b3J9IGZyb20gJ3JlYWN0LXJlZHV4JztcblxuaW1wb3J0ICcuL0RlYnVnTWVudS5jc3MnO1xuXG5pbXBvcnQgQ2hlY2tJY29uIGZyb20gJy4uL2ljb25zL0NoZWNrSWNvbi5zdmcnO1xuaW1wb3J0IENsb2NrSWNvbiBmcm9tICcuLi9pY29ucy9DbG9ja0ljb24uc3ZnJztcbmltcG9ydCBFcnJvckljb24gZnJvbSAnLi4vaWNvbnMvRXJyb3JJY29uLnN2Zyc7XG5pbXBvcnQgR3JhcGhJY29uIGZyb20gJy4uL2ljb25zL0dyYXBoSWNvbi5zdmcnO1xuaW1wb3J0IE9mZkljb24gZnJvbSAnLi4vaWNvbnMvT2ZmSWNvbi5zdmcnO1xuaW1wb3J0IEV4cGFuZCBmcm9tICcuLi9pY29ucy9FeHBhbmQuc3ZnJztcbmltcG9ydCB7VmVyc2lvbkluZm99IGZyb20gJy4vVmVyc2lvbkluZm8ucmVhY3QnO1xuaW1wb3J0IHtDYWxsYmFja0dyYXBoQ29udGFpbmVyfSBmcm9tICcuLi9DYWxsYmFja0dyYXBoL0NhbGxiYWNrR3JhcGhDb250YWluZXIucmVhY3QnO1xuaW1wb3J0IHtGcm9udEVuZEVycm9yQ29udGFpbmVyfSBmcm9tICcuLi9Gcm9udEVuZC9Gcm9udEVuZEVycm9yQ29udGFpbmVyLnJlYWN0JztcbmltcG9ydCBFeHRlcm5hbFdyYXBwZXIgZnJvbSAnLi4vLi4vLi4vd3JhcHBlci9FeHRlcm5hbFdyYXBwZXInO1xuaW1wb3J0IFBsb3RseUNsb3VkIGZyb20gJy4vUGxvdGx5Q2xvdWQnO1xuaW1wb3J0IHtEZXZ0b29sUHJvdmlkZXIsIHVzZURldnRvb2x9IGZyb20gJy4vRGV2dG9vbENvbnRleHQnO1xuXG5jb25zdCBjbGFzc2VzID0gKGJhc2UsIHZhcmlhbnQsIHZhcmlhbnQyKSA9PlxuICAgIGAke2Jhc2V9ICR7YmFzZX0tLSR7dmFyaWFudH1gICsgKHZhcmlhbnQyID8gYCAke2Jhc2V9LS0ke3ZhcmlhbnQyfWAgOiAnJyk7XG5cbmNvbnN0IGlzQ29sbGFwc2VkID0gKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGFzaF9kZWJ1Z19tZW51X2NvbGxhcHNlZCcpID09PSAndHJ1ZSc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZiBsb2NhbFN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZSwgZGVmYXVsdCB0byBmYWxzZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcblxuY29uc3QgTWVudUNvbnRlbnQgPSAoe1xuICAgIGhvdFJlbG9hZCxcbiAgICBjb25uZWN0ZWQsXG4gICAgcG9wdXAsXG4gICAgdG9nZ2xlRXJyb3JzLFxuICAgIGVyckNvdW50LFxuICAgIHRvZ2dsZUNhbGxiYWNrR3JhcGgsXG4gICAgY29uZmlnXG59KSA9PiB7XG4gICAgY29uc3QgcmVhZHkgPSB1c2VTZWxlY3RvcihzdGF0ZSA9PiBzdGF0ZS5hcHBMaWZlY3ljbGUgPT09ICdIWURSQVRFRCcpO1xuICAgIGNvbnN0IF9TdGF0dXNJY29uID0gaG90UmVsb2FkXG4gICAgICAgID8gY29ubmVjdGVkXG4gICAgICAgICAgICA/IENoZWNrSWNvblxuICAgICAgICAgICAgOiBPZmZJY29uXG4gICAgICAgIDogQ2xvY2tJY29uO1xuXG4gICAgY29uc3Qgc3RhdHVzID0gaG90UmVsb2FkXG4gICAgICAgID8gY29ubmVjdGVkXG4gICAgICAgICAgICA/ICdhdmFpbGFibGUnXG4gICAgICAgICAgICA6ICd1bmF2YWlsYWJsZSdcbiAgICAgICAgOiAnY29sZCc7XG5cbiAgICBsZXQgY3VzdG9tID0gbnVsbDtcbiAgICBpZiAoY29uZmlnLmRldl90b29scz8ubGVuZ3RoICYmIHJlYWR5KSB7XG4gICAgICAgIGN1c3RvbSA9IGNvbmZpZy5kZXZfdG9vbHMucmVkdWNlKFxuICAgICAgICAgICAgKGFjYywgZGV2dG9vbCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXAgPSAoXG4gICAgICAgICAgICAgICAgICAgIDxFeHRlcm5hbFdyYXBwZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudD17ZGV2dG9vbH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFBhdGg9e1snX19kYXNoX2RldnRvb2xzJywgaV19XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2RldnRvb2w/LnByb3BzPy5pZCA/IGRldnRvb2wucHJvcHMuaWQgOiBpfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGRldnRvb2wucG9zaXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgICAgICAgICBhY2MubGVmdC5wdXNoKGNvbXApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFjYy5yaWdodC5wdXNoKGNvbXApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtsZWZ0OiBbXSwgcmlnaHQ6IFtdfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2NvbnRlbnQnPlxuICAgICAgICAgICAge2N1c3RvbSAmJiA8PntjdXN0b20ubGVmdH08Lz59XG4gICAgICAgICAgICB7IWNvbmZpZy5wbG90bHlfY2xvdWRfaW5zdGFsbGVkID8gPFBsb3RseUNsb3VkIC8+IDogbnVsbH1cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0b2dnbGVFcnJvcnN9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtcbiAgICAgICAgICAgICAgICAgICAgKHBvcHVwID09ICdlcnJvcnMnXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdkYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tc2VsZWN0ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwpICsgJyBkYXNoLWRlYnVnLW1lbnVfX2J1dHRvbidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWQ9J2Rhc2gtZGVidWctbWVudV9fZXJyb3JzLWJ1dHRvbidcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8RXJyb3JJY29uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X19pY29uJ1xuICAgICAgICAgICAgICAgICAgICB3aWR0aD17MTZ9XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD17MTZ9XG4gICAgICAgICAgICAgICAgICAgIGZpbGw9J2N1cnJlbnRDb2xvcidcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIEVycm9yc1xuICAgICAgICAgICAgICAgIHtlcnJDb3VudCA+IDAgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0ndGVzdC1kZXZ0b29scy1lcnJvci1jb3VudCBkYXNoLWRlYnVnLW1lbnVfX2Vycm9yLWNvdW50Jz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtlcnJDb3VudH1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17dG9nZ2xlQ2FsbGJhY2tHcmFwaH1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e1xuICAgICAgICAgICAgICAgICAgICAocG9wdXAgPT0gJ2NhbGxiYWNrR3JhcGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdkYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tc2VsZWN0ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICcnKSArICcgZGFzaC1kZWJ1Zy1tZW51X19idXR0b24nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlkPSdkYXNoLWRlYnVnLW1lbnVfX2NhbGxiYWNrLWdyYXBoLWJ1dHRvbidcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8R3JhcGhJY29uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X19pY29uJ1xuICAgICAgICAgICAgICAgICAgICB3aWR0aD17MTZ9XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD17MTZ9XG4gICAgICAgICAgICAgICAgICAgIGZpbGw9J2N1cnJlbnRDb2xvcidcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIENhbGxiYWNrc1xuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X19kaXZpZGVyJyAvPlxuICAgICAgICAgICAgPFZlcnNpb25JbmZvIGNvbmZpZz17Y29uZmlnfSAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9fZGl2aWRlcicgLz5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BkYXNoLWRlYnVnLW1lbnVfX3N0YXR1cyBkYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tJHtzdGF0dXN9YH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBTZXJ2ZXJcbiAgICAgICAgICAgICAgICA8X1N0YXR1c0ljb24gY2xhc3NOYW1lPSdkYXNoLWRlYnVnLW1lbnVfX2ljb24nIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIHtjdXN0b20gJiYgPD57Y3VzdG9tLnJpZ2h0fTwvPn1cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9fZGl2aWRlcidcbiAgICAgICAgICAgICAgICBzdHlsZT17e21hcmdpblJpZ2h0OiAwfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59O1xuXG5jb25zdCBEZWJ1ZyA9ICh7ZXJyb3IsIGhvdFJlbG9hZCwgY29uZmlnLCBjaGlsZHJlbn0pID0+IHtcbiAgICBjb25zdCB7cG9wdXAsIHNldFBvcHVwfSA9IHVzZURldnRvb2woKTtcbiAgICBjb25zdCBbY29sbGFwc2VkLCBzZXRDb2xsYXBzZWRdID0gdXNlU3RhdGUoaXNDb2xsYXBzZWQpO1xuXG4gICAgY29uc3QgZXJyQ291bnQgPSBlcnJvci5mcm9udEVuZC5sZW5ndGggKyBlcnJvci5iYWNrRW5kLmxlbmd0aDtcbiAgICBjb25zdCBjb25uZWN0ZWQgPSBlcnJvci5iYWNrRW5kQ29ubmVjdGVkO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGVyckNvdW50ID4gMCAmJiBwb3B1cCA9PSBudWxsKSB7XG4gICAgICAgICAgICBzZXRQb3B1cCgnZXJyb3JzJyk7XG4gICAgICAgIH1cbiAgICB9LCBbZXJyQ291bnRdKTtcblxuICAgIGNvbnN0IHRvZ2dsZUVycm9ycyA9ICgpID0+IHtcbiAgICAgICAgc2V0UG9wdXAocG9wdXAgPT0gJ2Vycm9ycycgPyBudWxsIDogJ2Vycm9ycycpO1xuICAgIH07XG5cbiAgICBjb25zdCB0b2dnbGVDYWxsYmFja0dyYXBoID0gKCkgPT4ge1xuICAgICAgICBzZXRQb3B1cChwb3B1cCA9PSAnY2FsbGJhY2tHcmFwaCcgPyBudWxsIDogJ2NhbGxiYWNrR3JhcGgnKTtcbiAgICB9O1xuXG4gICAgY29uc3QgdG9nZ2xlQ29sbGFwc2VkID0gKCkgPT4ge1xuICAgICAgICBzZXRDb2xsYXBzZWQoIWNvbGxhcHNlZCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZGFzaF9kZWJ1Z19tZW51X2NvbGxhcHNlZCcsICFjb2xsYXBzZWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBJZiBsb2NhbFN0b3JhZ2UgaXMgbm90IGF2YWlsYWJsZSwgZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGVycm9ycyA9IGNvbmNhdChlcnJvci5mcm9udEVuZCwgZXJyb3IuYmFja0VuZCk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCAmJiBwb3B1cCAhPT0gJ2Vycm9ycycpIHtcbiAgICAgICAgICAgIHNldFBvcHVwKCdlcnJvcnMnKTtcbiAgICAgICAgfVxuICAgIH0sIFtlcnJvcl0pO1xuXG4gICAgY29uc3QgcG9wdXBDb250ZW50ID0gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X19wb3B1cCc+XG4gICAgICAgICAgICB7cG9wdXAgPT0gJ2NhbGxiYWNrR3JhcGgnID8gPENhbGxiYWNrR3JhcGhDb250YWluZXIgLz4gOiB1bmRlZmluZWR9XG4gICAgICAgICAgICB7cG9wdXAgPT0gJ2Vycm9ycycgJiYgZXJyQ291bnQgPiAwID8gKFxuICAgICAgICAgICAgICAgIDxGcm9udEVuZEVycm9yQ29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIGNsaWNrSGFuZGxlcj17dG9nZ2xlRXJyb3JzfVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnM9e2Vycm9yc31cbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkPXtlcnJvci5iYWNrRW5kQ29ubmVjdGVkfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApIDogdW5kZWZpbmVkfVxuICAgICAgICA8L2Rpdj5cbiAgICApO1xuXG4gICAgY29uc3QgbWVudUNvbnRlbnQgPSBjb2xsYXBzZWQgPyB1bmRlZmluZWQgOiAoXG4gICAgICAgIDxNZW51Q29udGVudFxuICAgICAgICAgICAgcG9wdXA9e3BvcHVwfVxuICAgICAgICAgICAgZXJyQ291bnQ9e2VyckNvdW50fVxuICAgICAgICAgICAgdG9nZ2xlRXJyb3JzPXt0b2dnbGVFcnJvcnN9XG4gICAgICAgICAgICB0b2dnbGVDYWxsYmFja0dyYXBoPXt0b2dnbGVDYWxsYmFja0dyYXBofVxuICAgICAgICAgICAgY29uZmlnPXtjb25maWd9XG4gICAgICAgICAgICBob3RSZWxvYWQ9e2hvdFJlbG9hZH1cbiAgICAgICAgICAgIGNvbm5lY3RlZD17Y29ubmVjdGVkfVxuICAgICAgICAvPlxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NlcyhcbiAgICAgICAgICAgICAgICAgICAgJ2Rhc2gtZGVidWctbWVudV9fb3V0ZXInLFxuICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZWQgPyAnY29sbGFwc2VkJyA6ICdleHBhbmRlZCdcbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtwb3B1cENvbnRlbnR9XG4gICAgICAgICAgICAgICAge21lbnVDb250ZW50fVxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dG9nZ2xlQ29sbGFwc2VkfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAnZGFzaC1kZWJ1Zy1tZW51X190b2dnbGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VkID8gJ2NvbGxhcHNlZCcgOiAnZXhwYW5kZWQnXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8RXhwYW5kIC8+XG4gICAgICAgICAgICAgICAgICAgIHtlcnJDb3VudCA+IDAgJiYgY29sbGFwc2VkID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Rhc2gtZGVidWctbWVudV9fZXJyb3ItaW5kaWNhdG9yJyAvPlxuICAgICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufTtcblxuY29uc3QgRGVidWdNZW51ID0gKHtjaGlsZHJlbiwgLi4ucHJvcHN9KSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgPERldnRvb2xQcm92aWRlcj5cbiAgICAgICAgICAgIDxEZWJ1ZyB7Li4ucHJvcHN9PntjaGlsZHJlbn08L0RlYnVnPlxuICAgICAgICA8L0RldnRvb2xQcm92aWRlcj5cbiAgICApO1xufTtcblxuRGVidWdNZW51LnByb3BUeXBlcyA9IHtcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBlcnJvcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBob3RSZWxvYWQ6IFByb3BUeXBlcy5ib29sLFxuICAgIGNvbmZpZzogUHJvcFR5cGVzLm9iamVjdFxufTtcblxuZXhwb3J0IHtEZWJ1Z01lbnV9O1xuIiwiaW1wb3J0IFJlYWN0LCB7dXNlQ29udGV4dCwgdXNlTWVtbywgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGNvbnN0IERldnRvb2xDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh7fSk7XG5cbmV4cG9ydCBjb25zdCBEZXZ0b29sUHJvdmlkZXIgPSAoe2NoaWxkcmVufSkgPT4ge1xuICAgIGNvbnN0IFtwb3B1cCwgc2V0UG9wdXBdID0gdXNlU3RhdGUoJycpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPERldnRvb2xDb250ZXh0LlByb3ZpZGVyXG4gICAgICAgICAgICB2YWx1ZT17e1xuICAgICAgICAgICAgICAgIHBvcHVwLFxuICAgICAgICAgICAgICAgIHNldFBvcHVwXG4gICAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvRGV2dG9vbENvbnRleHQuUHJvdmlkZXI+XG4gICAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VEZXZ0b29sID0gKCkgPT4ge1xuICAgIHJldHVybiB1c2VDb250ZXh0KERldnRvb2xDb250ZXh0KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VEZXZ0b29sTWVudUJ1dHRvbkNsYXNzTmFtZSA9IHBvcHVwTmFtZSA9PiB7XG4gICAgY29uc3Qge3BvcHVwfSA9IHVzZURldnRvb2woKTtcblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBjb25zdCBiYXNlID0gJ2Rhc2gtZGVidWctbWVudV9fYnV0dG9uJztcbiAgICAgICAgaWYgKHBvcHVwID09PSBwb3B1cE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBiYXNlICsgJyBkYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tc2VsZWN0ZWQnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiYXNlO1xuICAgIH0sIFtwb3B1cF0pO1xuXG4gICAgcmV0dXJuIGNsYXNzTmFtZTtcbn07XG4iLCJpbXBvcnQgUmVhY3QsIHt1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7dXNlRGV2dG9vbCwgdXNlRGV2dG9vbE1lbnVCdXR0b25DbGFzc05hbWV9IGZyb20gJy4vRGV2dG9vbENvbnRleHQnO1xuXG5pbXBvcnQgJy4vUGxvdGx5Q2xvdWQuY3NzJztcbmltcG9ydCBDbG91ZFNsYXNoSWNvbiBmcm9tICcuLi9pY29ucy9DbG91ZFNsYXNoSWNvbi5zdmcnO1xuXG5jb25zdCBDTE9VRF9QT1BVUCA9ICdjbG91ZCc7XG5cbmNvbnN0IFBsb3RseUNsb3VkID0gKCkgPT4ge1xuICAgIGNvbnN0IHtwb3B1cCwgc2V0UG9wdXB9ID0gdXNlRGV2dG9vbCgpO1xuXG4gICAgY29uc3QgY2xhc3NOYW1lID0gdXNlRGV2dG9vbE1lbnVCdXR0b25DbGFzc05hbWUoQ0xPVURfUE9QVVApO1xuXG4gICAgY29uc3QgaXNPcGVuID0gdXNlTWVtbygoKSA9PiBwb3B1cCA9PT0gQ0xPVURfUE9QVVAsIFtwb3B1cF0pO1xuXG4gICAgY29uc3Qgb25DbGljayA9ICgpID0+IHtcbiAgICAgICAgaWYgKHBvcHVwID09PSBDTE9VRF9QT1BVUCkge1xuICAgICAgICAgICAgc2V0UG9wdXAoJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0UG9wdXAoQ0xPVURfUE9QVVApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uQ29weSA9ICgpID0+IHtcbiAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoJ3BpcCBpbnN0YWxsIFwiZGFzaFtjbG91ZF1cIicpO1xuICAgIH07XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8PlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9e2NsYXNzTmFtZX0gb25DbGljaz17b25DbGlja30+XG4gICAgICAgICAgICAgICAgPENsb3VkU2xhc2hJY29uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X19pY29uJ1xuICAgICAgICAgICAgICAgICAgICB3aWR0aD17MTZ9XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD17MTZ9XG4gICAgICAgICAgICAgICAgICAgIGZpbGw9J2N1cnJlbnRDb2xvcidcbiAgICAgICAgICAgICAgICAvPnsnICd9XG4gICAgICAgICAgICAgICAgUGxvdGx5IENsb3VkXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIHtpc09wZW4gPyAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3Bsb3RseS1jbG91ZC1tb2RhbC1vdmVybGF5Jz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3Bsb3RseS1jbG91ZC1tb2RhbC1jb250ZW50Jz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdwbG90bHktY2xvdWQtbW9kYWwtaGVhZGVyJz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMga2V5PSdtb2RhbC10aXRsZSc+UGxvdGx5IENsb3VkPC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT0nbW9kYWwtY2xvc2UnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ncGxvdGx5LWNsb3VkLW1vZGFsLWNsb3NlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRQb3B1cCgnJyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDDl1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PSdtb2RhbC1ib2R5J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ncGxvdGx5LWNsb3VkLW1vZGFsLWJvZHknXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFsbCB0aGUgZXh0ZW5zaW9uIHRvIHB1Ymxpc2ggdG8gUGxvdGx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsb3VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdwbG90bHktY2xvdWQtY29weS1pbnN0YWxsJz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+eydwaXAgaW5zdGFsbCBcImRhc2hbY2xvdWRdXCInfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17b25Db3B5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdwbG90bHktY2xvdWQtbW9kYWwtYnV0dG9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3B5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvPlxuICAgICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBQbG90bHlDbG91ZDtcbiIsImltcG9ydCBSZWFjdCwge3VzZUVmZmVjdCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0ICcuL1ZlcnNpb25JbmZvLmNzcyc7XG5cbmNvbnN0IERBWV9JTl9NUyA9IDg2NDAwMDAwO1xuXG5mdW5jdGlvbiBjb21wYXJlVmVyc2lvbnModjEsIHYyKSB7XG4gICAgLy8gUmVtb3ZlIGFueSBub24tbnVtZXJpYyBjaGFyYWN0ZXJzIGZyb20gdGhlIHZlcnNpb24gc3RyaW5nc1xuICAgIC8vIGFuZCBhbnl0aGluZyBhZnRlciB0aGVtIChlLmcuIDEuMi4zLXJjLjEgLT4gMS4yLjMsIDEuMi4zK2J1aWxkLjEgLT4gMS4yLjMpXG4gICAgdjEgPSB2MS5yZXBsYWNlKC9cXC4/W14wLTkuXS4qJC8sICcnKTtcbiAgICB2MiA9IHYyLnJlcGxhY2UoL1xcLj9bXjAtOS5dLiokLywgJycpO1xuXG4gICAgY29uc3QgdjFQYXJ0cyA9IHYxLnNwbGl0KCcuJykubWFwKE51bWJlcik7XG4gICAgY29uc3QgdjJQYXJ0cyA9IHYyLnNwbGl0KCcuJykubWFwKE51bWJlcik7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWF4KHYxUGFydHMubGVuZ3RoLCB2MlBhcnRzLmxlbmd0aCk7IGkrKykge1xuICAgICAgICBjb25zdCBwYXJ0MSA9IHYxUGFydHNbaV0gfHwgMDtcbiAgICAgICAgY29uc3QgcGFydDIgPSB2MlBhcnRzW2ldIHx8IDA7XG5cbiAgICAgICAgaWYgKHBhcnQxID4gcGFydDIpIHJldHVybiAxO1xuICAgICAgICBpZiAocGFydDEgPCBwYXJ0MikgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0RGFzaFZlcnNpb25JbmZvKGNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgICAgZGFzaF92ZXJzaW9uOiBjdXJyZW50RGFzaFZlcnNpb24sXG4gICAgICAgIGRhc2hfdmVyc2lvbl91cmw6IGRhc2hWZXJzaW9uVXJsLFxuICAgICAgICBweXRob25fdmVyc2lvbjogcHl0aG9uVmVyc2lvbixcbiAgICAgICAgZGRrX3ZlcnNpb246IGRka1ZlcnNpb24sXG4gICAgICAgIHBsb3RseV92ZXJzaW9uOiBwbG90bHlWZXJzaW9uXG4gICAgfSA9IGNvbmZpZztcbiAgICBsZXQgY2FjaGVkVmVyc2lvbkluZm8sIGNhY2hlZE5ld0Rhc2hWZXJzaW9uTGluaywgbGFzdEZldGNoZWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgY2FjaGVkVmVyc2lvbkluZm8gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVkTmV3RGFzaFZlcnNpb24nKTtcbiAgICAgICAgY2FjaGVkTmV3RGFzaFZlcnNpb25MaW5rID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXG4gICAgICAgICAgICAnY2FjaGVkTmV3RGFzaFZlcnNpb25MaW5rJ1xuICAgICAgICApO1xuICAgICAgICBsYXN0RmV0Y2hlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsYXN0RmV0Y2hlZCcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgbG9jYWxTdG9yYWdlIGlzIG5vdCBhdmFpbGFibGUsIHJldHVybiBhbiBlbXB0eSBvYmplY3RcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAgIGxhc3RGZXRjaGVkICYmXG4gICAgICAgIERhdGUubm93KCkgLSBOdW1iZXIobGFzdEZldGNoZWQpIDwgREFZX0lOX01TICYmXG4gICAgICAgIGNhY2hlZFZlcnNpb25JbmZvXG4gICAgKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2ZXJzaW9uOiBKU09OLnBhcnNlKGNhY2hlZFZlcnNpb25JbmZvKSxcbiAgICAgICAgICAgIGxpbms6IGNhY2hlZE5ld0Rhc2hWZXJzaW9uTGlua1xuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAoc2hvdWxkUmVxdWVzdERhc2hWZXJzaW9uKGNvbmZpZykpIHtcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgICAgIGRhc2hfdmVyc2lvbjogY3VycmVudERhc2hWZXJzaW9uLFxuICAgICAgICAgICAgcHl0aG9uX3ZlcnNpb246IHB5dGhvblZlcnNpb24sXG4gICAgICAgICAgICBkZGtfdmVyc2lvbjogZGRrVmVyc2lvbixcbiAgICAgICAgICAgIHBsb3RseV92ZXJzaW9uOiBwbG90bHlWZXJzaW9uXG4gICAgICAgIH0pLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBmZXRjaChkYXNoVmVyc2lvblVybCArICc/JyArIHF1ZXJ5UGFyYW1zLCB7bW9kZTogJ2NvcnMnfSlcbiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSlcbiAgICAgICAgICAgIC50aGVuKGJvZHkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChib2R5ICYmIGJvZHkudmVyc2lvbiAmJiBib2R5LmxpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYWNoZWROZXdEYXNoVmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoYm9keS52ZXJzaW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYWNoZWROZXdEYXNoVmVyc2lvbkxpbmsnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkubGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdsYXN0RmV0Y2hlZCcsIERhdGUubm93KCkpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIGlmIGxvY2FsU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkUmVxdWVzdERhc2hWZXJzaW9uKGNvbmZpZykge1xuICAgIC8vIElmIHZlcnNpb24gY2hlY2sgaXMgZGlzYWJsZWQsIHJldHVybiBmYWxzZSB0byBhdm9pZFxuICAgIC8vIGNoZWNraW5nIGxvY2FsU3RvcmFnZSB1bm5lY2Vzc2FyaWx5XG4gICAgaWYgKGNvbmZpZy5kaXNhYmxlX3ZlcnNpb25fY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgc2hvd05vdGlmaWNhdGlvbnMsIGxhc3RGZXRjaGVkO1xuICAgIHRyeSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb25zID1cbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzaG93Tm90aWZpY2F0aW9ucycpICE9PSAnZmFsc2UnO1xuICAgICAgICBsYXN0RmV0Y2hlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsYXN0RmV0Y2hlZCcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgbG9jYWxTdG9yYWdlIGlzIG5vdCBhdmFpbGFibGUsIHJldHVybiBmYWxzZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICAgIHNob3dOb3RpZmljYXRpb25zICYmXG4gICAgICAgICghbGFzdEZldGNoZWQgfHwgRGF0ZS5ub3coKSAtIE51bWJlcihsYXN0RmV0Y2hlZCkgPiBEQVlfSU5fTVMpXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU2hvd1VwZ3JhZGVOb3RpZmljYXRpb24oXG4gICAgY3VycmVudERhc2hWZXJzaW9uLFxuICAgIG5ld0Rhc2hWZXJzaW9uLFxuICAgIGNvbmZpZ1xuKSB7XG4gICAgLy8gSWYgdmVyc2lvbiBjaGVjayBpcyBkaXNhYmxlZCwgcmV0dXJuIGZhbHNlIHRvIGF2b2lkXG4gICAgLy8gY2hlY2tpbmcgbG9jYWxTdG9yYWdlIHVubmVjZXNzYXJpbHlcbiAgICBpZiAoY29uZmlnLmRpc2FibGVfdmVyc2lvbl9jaGVjaykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCBzaG93Tm90aWZpY2F0aW9ucywgbGFzdERpc21pc3NlZCwgbGFzdERpc21pc3NlZFZlcnNpb247XG4gICAgdHJ5IHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbnMgPVxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Nob3dOb3RpZmljYXRpb25zJykgIT09ICdmYWxzZSc7XG4gICAgICAgIGxhc3REaXNtaXNzZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFzdERpc21pc3NlZCcpO1xuICAgICAgICBsYXN0RGlzbWlzc2VkVmVyc2lvbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsYXN0RGlzbWlzc2VkVmVyc2lvbicpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgbG9jYWxTdG9yYWdlIGlzIG5vdCBhdmFpbGFibGUsIHJldHVybiBmYWxzZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICAgbmV3RGFzaFZlcnNpb24gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBjb21wYXJlVmVyc2lvbnMoY3VycmVudERhc2hWZXJzaW9uLCBuZXdEYXNoVmVyc2lvbikgPj0gMCB8fFxuICAgICAgICAhc2hvd05vdGlmaWNhdGlvbnNcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGxhc3REaXNtaXNzZWQgJiZcbiAgICAgICAgRGF0ZS5ub3coKSAtIE51bWJlcihsYXN0RGlzbWlzc2VkKSA+IERBWV9JTl9NU1xuICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBsYXN0RGlzbWlzc2VkVmVyc2lvbiAmJlxuICAgICAgICAhbGFzdERpc21pc3NlZCAmJlxuICAgICAgICBjb21wYXJlVmVyc2lvbnMobGFzdERpc21pc3NlZFZlcnNpb24sIG5ld0Rhc2hWZXJzaW9uKSA8IDBcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICFsYXN0RGlzbWlzc2VkICYmICFsYXN0RGlzbWlzc2VkVmVyc2lvbjtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBWZXJzaW9uSW5mbyA9ICh7Y29uZmlnfSkgPT4ge1xuICAgIGNvbnN0IFtuZXdEYXNoVmVyc2lvbiwgc2V0TmV3RGFzaFZlcnNpb25dID0gdXNlU3RhdGUodW5kZWZpbmVkKTtcbiAgICBjb25zdCBbbmV3RGFzaFZlcnNpb25MaW5rLCBzZXROZXdEYXNoVmVyc2lvbkxpbmtdID0gdXNlU3RhdGUodW5kZWZpbmVkKTtcbiAgICBjb25zdCBbdXBncmFkZVRvb2x0aXBPcGVuZWQsIHNldFVwZ3JhZGVUb29sdGlwT3BlbmVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICAgIGNvbnN0IHNldERvbnRTaG93QWdhaW4gPSAoKSA9PiB7XG4gICAgICAgIC8vIFNldCBsb2NhbCBzdG9yYWdlIHRvIHJlY29yZCB0aGUgbGFzdCBkaXNtaXNzZWQgbm90aWZpY2F0aW9uXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnc2hvd05vdGlmaWNhdGlvbnMnLCBmYWxzZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnMgaWYgbG9jYWxTdG9yYWdlIGlzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgfVxuICAgICAgICBzZXRVcGdyYWRlVG9vbHRpcE9wZW5lZChmYWxzZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHNldFJlbWluZE1lTGF0ZXIgPSAoKSA9PiB7XG4gICAgICAgIC8vIFNldCBsb2NhbCBzdG9yYWdlIHRvIHJlY29yZCB0aGUgbGFzdCBkaXNtaXNzZWQgbm90aWZpY2F0aW9uXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbGFzdERpc21pc3NlZCcsIERhdGUubm93KCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIGlmIGxvY2FsU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgIH1cbiAgICAgICAgc2V0VXBncmFkZVRvb2x0aXBPcGVuZWQoZmFsc2UpO1xuICAgIH07XG5cbiAgICBjb25zdCBzZXRTa2lwVGhpc1ZlcnNpb24gPSAoKSA9PiB7XG4gICAgICAgIC8vIFNldCBsb2NhbCBzdG9yYWdlIHRvIHJlY29yZCB0aGUgbGFzdCBkaXNtaXNzZWQgdmVyc2lvblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2xhc3REaXNtaXNzZWRWZXJzaW9uJywgbmV3RGFzaFZlcnNpb24pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIGlmIGxvY2FsU3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgIH1cbiAgICAgICAgc2V0VXBncmFkZVRvb2x0aXBPcGVuZWQoZmFsc2UpO1xuICAgIH07XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICByZXF1ZXN0RGFzaFZlcnNpb25JbmZvKGNvbmZpZykudGhlbihib2R5ID0+IHtcbiAgICAgICAgICAgIGlmIChib2R5KSB7XG4gICAgICAgICAgICAgICAgc2V0TmV3RGFzaFZlcnNpb25MaW5rKGJvZHkubGluayk7XG4gICAgICAgICAgICAgICAgc2V0TmV3RGFzaFZlcnNpb24oYm9keS52ZXJzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSwgW10pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgaGlkZVVwZ3JhZGVUb29sdGlwID0gZSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdXBncmFkZVRvb2x0aXBPcGVuZWQgJiZcbiAgICAgICAgICAgICAgICAhZS50YXJnZXQubWF0Y2hlcyhcbiAgICAgICAgICAgICAgICAgICAgJy5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24sIC5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24gKidcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBzZXRVcGdyYWRlVG9vbHRpcE9wZW5lZChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIENsb3NlIHRoZSB1cGdyYWRlIHRvb2x0aXAgaWYgdGhlIHVzZXIgY2xpY2tzIG91dHNpZGUgb2YgaXRcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWRlVXBncmFkZVRvb2x0aXApO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZGVVcGdyYWRlVG9vbHRpcCk7XG4gICAgfSwgW3VwZ3JhZGVUb29sdGlwT3BlbmVkXSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uJz5cbiAgICAgICAgICAgIHt1cGdyYWRlVG9vbHRpcE9wZW5lZCA/IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLXRvb2x0aXAnPlxuICAgICAgICAgICAgICAgICAgICB7bmV3RGFzaFZlcnNpb25MaW5rID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9e25ld0Rhc2hWZXJzaW9uTGlua30+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZCBkZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e3NldFNraXBUaGlzVmVyc2lvbn0+XG4gICAgICAgICAgICAgICAgICAgICAgICBTa2lwIHRoaXMgdmVyc2lvblxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtzZXRSZW1pbmRNZUxhdGVyfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIFJlbWluZCBtZSB0b21vcnJvd1xuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtzZXREb250U2hvd0FnYWlufT5cbiAgICAgICAgICAgICAgICAgICAgICAgIFNpbGVuY2UgYWxsIHZlcnNpb24gbm90aWZpY2F0aW9uc1xuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgPHNwYW4+dntjb25maWcuZGFzaF92ZXJzaW9ufTwvc3Bhbj5cbiAgICAgICAgICAgIHtzaG91bGRTaG93VXBncmFkZU5vdGlmaWNhdGlvbihcbiAgICAgICAgICAgICAgICBjb25maWcuZGFzaF92ZXJzaW9uLFxuICAgICAgICAgICAgICAgIG5ld0Rhc2hWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICAgICAgKSA/IChcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLWJ1dHRvbidcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFVwZ3JhZGVUb29sdGlwT3BlbmVkKCF1cGdyYWRlVG9vbHRpcE9wZW5lZClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgRGFzaCB1cGRhdGUgYXZhaWxhYmxlIC0gdntuZXdEYXNoVmVyc2lvbn1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufTtcbiIsIi8vIFdlcmt6ZXVnIGNzcyBpbmNsdWRlZCBhcyBhIHN0cmluZywgYmVjYXVzZSB3ZSB3YW50IHRvIGluamVjdFxuLy8gaXQgaW50byBhbiBpZnJhbWUgc3JjRG9jXG5cbmV4cG9ydCBkZWZhdWx0IGBcbmJvZHkge1xuICAgIG1hcmdpbjogMHB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi50cmFjZWJhY2sge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkICNkZmU4ZjM7XG4gICAgYm9yZGVyLXJhZGl1czogMHB4IDBweCA0cHggNHB4O1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xufVxuXG5oMi50cmFjZWJhY2sge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2Y2ZmE7XG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcbiAgICBib3JkZXItYm90dG9tOiAwcHg7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHggNHB4IDBweCAwcHg7XG4gICAgY29sb3I6ICM1MDY3ODQ7XG59XG5cbmgyLnRyYWNlYmFjayBlbSB7XG4gICAgY29sb3I6ICM1MDY3ODQ7XG4gICAgZm9udC13ZWlnaHQ6IDEwMDtcbn1cblxuLnRyYWNlYmFjayBwcmUsIC5kZWJ1Z2dlciB0ZXh0YXJlYSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0YzRjZGQTtcbn1cblxuLmRlYnVnZ2VyIGgxIHtcbiAgICBjb2xvcjogIzUwNjc4NDtcbiAgICBmb250LWZhbWlseTogUm9ib3RvO1xufVxuXG4uZXhwbGFuYXRpb24ge1xuICAgIGNvbG9yOiAjQTJCMUM2O1xufVxuXG4vKiBIaWRlIHRoZSBEb24ndCBQYW5pYyEgZm9vdGVyICovXG4uZGVidWdnZXIgLmZvb3RlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLyogSGlkZSBhbGwgb2YgdGhlIERhc2ggdHJhY2ViYWNrIHN0dWZmIHRoYXQgbGVhZHMgdXAgdG8gdGhlIGNhbGwgKi9cbi5saW5lLmJlZm9yZSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuZGl2LmRlYnVnZ2VyIHtcbiAgICBwYWRkaW5nOiAwcHg7XG59XG5cbi5kZWJ1Z2dlciBoMSB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmRlYnVnZ2VyIC5lcnJvcm1zZyB7XG4gICAgbWFyZ2luOiAwO1xuICAgIGNvbG9yOiAjNTA2Nzg0O1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmNmZhO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkICNkZmU4ZjM7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgcGFkZGluZzogMTBweDtcbn1cblxuLmRlYnVnZ2VyIC5wYXN0ZW1lc3NhZ2UgaW5wdXQge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5kZWJ1Z2dlciAuZXhwbGFuYXRpb24ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5kZWJ1Z2dlciBkaXYucGxhaW4ge1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBib3JkZXItd2lkdGg6IDJweDtcbiAgICBjb2xvcjogIzUwNjc4NDtcbn1cblxuLnBsYWluIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xufVxuLnBsYWluID4gZm9ybSA+IHAge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG4ucGxhaW4gcHJlIHtcbiAgICBwYWRkaW5nOiAxNXB4ICFpbXBvcnRhbnQ7XG4gICAgb3ZlcmZsb3cteDogc2Nyb2xsO1xufVxuXG4uZGVidWdnZXIgZGl2LnRyYWNlYmFjayBwcmUge1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLmRlYnVnZ2VyIC50cmFjZWJhY2sgLnNvdXJjZSBwcmUubGluZSBpbWcge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5gO1xuIiwiZXhwb3J0IGNvbnN0IFJFRElSRUNUX1VSSV9QQVRITkFNRSA9ICcvX29hdXRoMi9jYWxsYmFjayc7XG5leHBvcnQgY29uc3QgT0FVVEhfQ09PS0lFX05BTUUgPSAncGxvdGx5X29hdXRoX3Rva2VuJztcbmV4cG9ydCBjb25zdCBKV1RfRVhQSVJFRF9NRVNTQUdFID0gJ0pXVCBFeHBpcmVkJztcblxuZXhwb3J0IGNvbnN0IFNUQVRVUyA9IHtcbiAgICBPSzogMjAwLFxuICAgIFBSRVZFTlRfVVBEQVRFOiAyMDQsXG4gICAgLy8gV2UgYWNjZXB0IGJvdGggNDAwIGFuZCA0MDEgZm9yIEpXVCB0b2tlbiBleHBpcnkgcmVzcG9uc2VzLlxuICAgIC8vIFNvbWUgc2VydmVycyB1c2UgY29kZSA0MDAgZm9yIGV4cGlyZWQgdG9rZW5zLCBiZWNhdXNlXG4gICAgLy8gdGhleSByZXNlcnZlIDQwMSBmb3IgY2FzZXMgdGhhdCByZXF1aXJlIHVzZXIgYWN0aW9uXG4gICAgQkFEX1JFUVVFU1Q6IDQwMCxcbiAgICBVTkFVVEhPUklaRUQ6IDQwMSxcbiAgICBDTElFTlRTSURFX0VSUk9SOiAnQ0xJRU5UU0lERV9FUlJPUicsXG4gICAgTk9fUkVTUE9OU0U6ICdOT19SRVNQT05TRSdcbn07XG5cbmV4cG9ydCBjb25zdCBTVEFUVVNNQVAgPSB7XG4gICAgW1NUQVRVUy5PS106ICdTVUNDRVNTJyxcbiAgICBbU1RBVFVTLlBSRVZFTlRfVVBEQVRFXTogJ05PX1VQREFURSdcbn07XG4iLCJpbXBvcnQge2hhcywgaW5jbHVkZXN9IGZyb20gJ3JhbWRhJztcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3BUeXBlRXJyb3JIYW5kbGVyKG1lc3NhZ2UsIHByb3BzLCB0eXBlKSB7XG4gICAgLypcbiAgICAgKiBwcm9wVHlwZSBlcnJvciBtZXNzYWdlcyBhcmUgY29uc3RydWN0ZWQgaW5cbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcHJvcC10eXBlcy9ibG9iL3YxNS43LjIvZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanNcbiAgICAgKiAoVmVyc2lvbiAxNS43LjIpXG4gICAgICpcbiAgICAgKiBQYXJzZSB0aGVzZSBleGNlcHRpb24gb2JqZWN0cyB0byByZW1vdmUgSlMgc291cmNlIGNvZGUgYW5kIGltcHJvdmVcbiAgICAgKiB0aGUgY2xhcml0eS5cbiAgICAgKlxuICAgICAqIElmIHdyb25nIHByb3AgdHlwZSB3YXMgcGFzc2VkIGluLCBtZXNzYWdlIGxvb2tzIGxpa2U6XG4gICAgICpcbiAgICAgKiBFcnJvcjogXCJGYWlsZWQgY29tcG9uZW50IHByb3AgdHlwZTogSW52YWxpZCBjb21wb25lbnQgcHJvcCBgYW5pbWF0ZWAgb2YgdHlwZSBgbnVtYmVyYCBzdXBwbGllZCB0byBgZnVuY3Rpb24gR3JhcGhXaXRoRGVmYXVsdHMocHJvcHMpIHtcbiAgICAgKiAgIHZhciBpZCA9IHByb3BzLmlkID8gcHJvcHMuaWQgOiBnZW5lcmF0ZUlkKCk7XG4gICAgICogICByZXR1cm4gcmVhY3RfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudChQbG90bHlHcmFwaCwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgICogICAgIGlkOiBpZFxuICAgICAqICAgfSkpO1xuICAgICAqIH1gLCBleHBlY3RlZCBgYm9vbGVhbmAuXCJcbiAgICAgKlxuICAgICAqXG4gICAgICogSWYgYSByZXF1aXJlZCBwcm9wIHR5cGUgd2FzIG9taXR0ZWQsIG1lc3NhZ2UgbG9va3MgbGlrZTpcbiAgICAgKlxuICAgICAqIFwiRmFpbGVkIGNvbXBvbmVudCBwcm9wIHR5cGU6IFRoZSBjb21wb25lbnQgcHJvcCBgb3B0aW9uc1swXS52YWx1ZWAgaXMgbWFya2VkIGFzIHJlcXVpcmVkIGluIGBmdW5jdGlvbiBDaGVja2xpc3QocHJvcHMpIHtcbiAgICAgKiAgICB2YXIgX3RoaXM7XG4gICAgICpcbiAgICAgKiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2hlY2tsaXN0KTtcbiAgICAgKlxuICAgICAqICAgICBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9nZXRQcm90b3R5cGVPZihDaGVja2xpc3QpLmNhbGwodGhpcywgcHJvcHMpKTtcbiAgICAgKiAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICogICAgICAgdmFsdWVzOiBwcm9wcy52YWx1ZXNcbiAgICAgKiAgICAgfTtcbiAgICAgKiAgICAgcmV0dXJuIF90aGlzO1xuICAgICAqICAgfWAsIGJ1dCBpdHMgdmFsdWUgaXMgYHVuZGVmaW5lZGAuXCJcbiAgICAgKlxuICAgICAqL1xuXG4gICAgY29uc3QgbWVzc2FnZVBhcnRzID0gbWVzc2FnZS5zcGxpdCgnYCcpO1xuICAgIGxldCBlcnJvck1lc3NhZ2U7XG4gICAgaWYgKGluY2x1ZGVzKCdpcyBtYXJrZWQgYXMgcmVxdWlyZWQnLCBtZXNzYWdlKSkge1xuICAgICAgICBjb25zdCBpbnZhbGlkUHJvcFBhdGggPSBtZXNzYWdlUGFydHNbMV07XG4gICAgICAgIGVycm9yTWVzc2FnZSA9IGAke2ludmFsaWRQcm9wUGF0aH0gaW4gJHt0eXBlfWA7XG4gICAgICAgIGlmIChwcm9wcy5pZCkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGAgd2l0aCBJRCBcIiR7cHJvcHMuaWR9XCJgO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yTWVzc2FnZSArPSAnIGlzIHJlcXVpcmVkIGJ1dCBpdCB3YXMgbm90IHByb3ZpZGVkLic7XG4gICAgfSBlbHNlIGlmIChpbmNsdWRlcygnQmFkIG9iamVjdCcsIG1lc3NhZ2UpKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIEhhbmRsZSAuZXhhY3QgZXJyb3JzXG4gICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9wcm9wLXR5cGVzL2Jsb2IvdjE1LjcuMi9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qcyNMNDM4LUw0NDJcbiAgICAgICAgICovXG4gICAgICAgIGVycm9yTWVzc2FnZSA9XG4gICAgICAgICAgICBtZXNzYWdlLnNwbGl0KCdzdXBwbGllZCB0byAnKVswXSArXG4gICAgICAgICAgICBgc3VwcGxpZWQgdG8gJHt0eXBlfWAgK1xuICAgICAgICAgICAgJy5cXG5CYWQnICtcbiAgICAgICAgICAgIG1lc3NhZ2Uuc3BsaXQoJy5cXG5CYWQnKVsxXTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBpbmNsdWRlcygnSW52YWxpZCAnLCBtZXNzYWdlKSAmJlxuICAgICAgICBpbmNsdWRlcygnIHN1cHBsaWVkIHRvICcsIG1lc3NhZ2UpXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGludmFsaWRQcm9wUGF0aCA9IG1lc3NhZ2VQYXJ0c1sxXTtcblxuICAgICAgICBlcnJvck1lc3NhZ2UgPSBgSW52YWxpZCBhcmd1bWVudCBcXGAke2ludmFsaWRQcm9wUGF0aH1cXGAgcGFzc2VkIGludG8gJHt0eXBlfWA7XG4gICAgICAgIGlmIChwcm9wcy5pZCkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGAgd2l0aCBJRCBcIiR7cHJvcHMuaWR9XCJgO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yTWVzc2FnZSArPSAnLic7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogTm90IGFsbCBlcnJvciBtZXNzYWdlcyBpbmNsdWRlIHRoZSBleHBlY3RlZCB2YWx1ZS5cbiAgICAgICAgICogSW4gcGFydGljdWxhciwgb25lT2ZUeXBlLlxuICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcHJvcC10eXBlcy9ibG9iL3YxNS43LjIvZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanMjTDM4OFxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGluY2x1ZGVzKCcsIGV4cGVjdGVkICcsIG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZFByb3BUeXBlID0gbWVzc2FnZS5zcGxpdCgnLCBleHBlY3RlZCAnKVsxXTtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBgXFxuRXhwZWN0ZWQgJHtleHBlY3RlZFByb3BUeXBlfWA7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgKiBOb3QgYWxsIGVycm9yIG1lc3NhZ2VzIGluY2x1ZGUgdGhlIHR5cGVcbiAgICAgICAgICogSW4gcGFydGljdWxhciwgb25lT2ZUeXBlLlxuICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcHJvcC10eXBlcy9ibG9iL3YxNS43LjIvZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanMjTDM4OFxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGluY2x1ZGVzKCcgb2YgdHlwZSBgJywgbWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGludmFsaWRQcm9wVHlwZVByb3ZpZGVkID0gbWVzc2FnZVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnIG9mIHR5cGUgYCcpWzFdXG4gICAgICAgICAgICAgICAgLnNwbGl0KCdgJylbMF07XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFxcbldhcyBzdXBwbGllZCB0eXBlIFxcYCR7aW52YWxpZFByb3BUeXBlUHJvdmlkZWR9XFxgLmA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzKGludmFsaWRQcm9wUGF0aCwgcHJvcHMpKSB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogaW52YWxpZFByb3BQYXRoIG1heSBiZSBuZXN0ZWQgbGlrZSBgb3B0aW9uc1swXS52YWx1ZWAuXG4gICAgICAgICAgICAgKiBGb3Igbm93LCB3ZSB3b24ndCB0cnkgdG8gdW5wYWNrIHRoZXNlIG5lc3RlZCBvcHRpb25zXG4gICAgICAgICAgICAgKiBidXQgd2UgY291bGQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QganNvblN1cHBsaWVkVmFsdWUgPSBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICBwcm9wc1tpbnZhbGlkUHJvcFBhdGhdLFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChqc29uU3VwcGxpZWRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlcygnXFxuJywganNvblN1cHBsaWVkVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBgXFxuVmFsdWUgcHJvdmlkZWQ6IFxcbiR7anNvblN1cHBsaWVkVmFsdWV9YDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFxcblZhbHVlIHByb3ZpZGVkOiAke2pzb25TdXBwbGllZFZhbHVlfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLypcbiAgICAgICAgICogTm90IGF3YXJlIG9mIG90aGVyIHByb3AgdHlwZSB3YXJuaW5nIG1lc3NhZ2VzLlxuICAgICAgICAgKiBCdXQsIGlmIHRoZXkgZXhpc3QsIHRoZW4gYXQgbGVhc3QgdGhyb3cgdGhlIGRlZmF1bHRcbiAgICAgICAgICogcmVhY3QgcHJvcCB0eXBlcyBlcnJvclxuICAgICAgICAgKi9cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xufVxuIiwiaW1wb3J0IHtpbmNsdWRlcywgdHlwZX0gZnJvbSAncmFtZGEnO1xuXG5jb25zdCBTSU1QTEVfQ09NUE9ORU5UX1RZUEVTID0gWydTdHJpbmcnLCAnTnVtYmVyJywgJ051bGwnLCAnQm9vbGVhbiddO1xuXG5leHBvcnQgZGVmYXVsdCBjb21wb25lbnQgPT4gaW5jbHVkZXModHlwZShjb21wb25lbnQpLCBTSU1QTEVfQ09NUE9ORU5UX1RZUEVTKTtcbiIsIi8qKlxuICogR2VuZXJhbGl6ZWQgcGVyc2lzdGVuY2UgZm9yIGNvbXBvbmVudCBwcm9wc1xuICpcbiAqIFdoZW4gdXNlcnMgaW5wdXQgbmV3IHByb3AgdmFsdWVzLCB0aGV5IGNhbiBiZSBzdG9yZWQgYW5kIHJlYXBwbGllZCBsYXRlcixcbiAqIHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZWNyZWF0ZWQgKGNoYW5naW5nIGBUYWJgIGZvciBleGFtcGxlKSBvciB3aGVuIHRoZVxuICogcGFnZSBpcyByZWxvYWRlZCAoZGVwZW5kaW5nIG9uIGBwZXJzaXN0ZW5jZV90eXBlYCkuIFN0b3JhZ2UgaXMgdGllZCB0b1xuICogY29tcG9uZW50IElELCBhbmQgdGhlIHByb3AgdmFsdWVzIHdpbGwgbm90IGJlIHN0b3JlZCB3aXRoIGNvbXBvbmVudHNcbiAqIHdpdGhvdXQgYW4gSUQuXG4gKlxuICogUmVuZGVyZXIgaGFuZGxlcyB0aGUgbWVjaGFuaWNzLCBidXQgY29tcG9uZW50cyBtdXN0IGRlZmluZSBhIGZldyBwcm9wczpcbiAqXG4gKiAtIGBwZXJzaXN0ZW5jZWA6IGJvb2xlYW4sIHN0cmluZywgb3IgbnVtYmVyLiBGb3Igc2ltcGxlIHVzYWdlLCBzZXQgdG8gYHRydWVgXG4gKiAgIHRvIGVuYWJsZSBwZXJzaXN0ZW5jZSwgb21pdCBvciBzZXQgYGZhbHNlYCB0byBkaXNhYmxlLiBGb3IgbW9yZSBjb21wbGV4XG4gKiAgIHNjZW5hcmlvcywgdXNlIGFueSB0cnV0aHkgdmFsdWUsIGFuZCBjaGFuZ2UgdG8gYSAqZGlmZmVyZW50KiB0cnV0aHkgdmFsdWVcbiAqICAgd2hlbiB5b3Ugd2FudCB0aGUgcGVyc2lzdGVkIHZhbHVlcyBjbGVhcmVkLiAobW9kZWxlZCBvZmYgYHVpcmV2aXNpb25gIGluKVxuICogICBwbG90bHkuanNcbiAqICAgVHlwaWNhbGx5IHNob3VsZCBoYXZlIG5vIGRlZmF1bHQsIGJ1dCB0aGUgb3RoZXIgcGVyc2lzdGVuY2UgcHJvcHMgc2hvdWxkXG4gKiAgIGhhdmUgZGVmYXVsdHMsIHNvIGFsbCBhIHVzZXIgbmVlZHMgdG8gZG8gdG8gZW5hYmxlIHBlcnNpc3RlbmNlIGlzIHNldCB0aGlzXG4gKiAgIG9uZSBwcm9wLlxuICpcbiAqIC0gYHBlcnNpc3RlZF9wcm9wc2A6IGFycmF5IG9mIHByb3AgbmFtZXMgb3IgXCJuZXN0ZWQgcHJvcCBJRHNcIiBhbGxvd2VkIHRvXG4gKiAgIHBlcnNpc3QuIE5vcm1hbGx5IHNob3VsZCBkZWZhdWx0IHRvIHRoZSBmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkIHByb3BzLFxuICogICBzbyB0aGV5IGNhbiBhbGwgYmUgZW5hYmxlZCBhdCBvbmNlLiBUaGUgbWFpbiBleGNlcHRpb24gdG8gdGhpcyBpcyBpZlxuICogICB0aGVyZSdzIGEgcHJvcCB0aGF0ICpjYW4qIGJlIHBlcnNpc3RlZCBidXQgbW9zdCB1c2VycyB3b3VsZG4ndCB3YW50IHRoaXMuXG4gKiAgIEEgbmVzdGVkIHByb3AgSUQgZGVzY3JpYmVzICpwYXJ0KiBvZiBhIHByb3AgdG8gc3RvcmUuIEl0IG11c3QgYmVcbiAqICAgXCI8cHJvcE5hbWU+LjxwaWVjZT5cIiB3aGVyZSBwcm9wTmFtZSBpcyB0aGUgcHJvcCB0aGF0IGhhcyB0aGlzIGluZm8sIGFuZFxuICogICBwaWVjZSBtYXkgb3IgbWF5IG5vdCBtYXAgdG8gdGhlIGV4YWN0IHN1YnN0cnVjdHVyZSBiZWluZyBzdG9yZWQgYnV0IGlzXG4gKiAgIG1lYW5pbmdmdWwgdG8gdGhlIHVzZXIuIEZvciBleGFtcGxlLCBpbiBgZGFzaF90YWJsZWAsIGBjb2x1bW5zLm5hbWVgXG4gKiAgIHN0b3JlcyBgY29sdW1uc1tpXS5uYW1lYCBmb3IgYWxsIGNvbHVtbnMgYGlgLiBOZXN0ZWQgcHJvcHMgYWxzbyBuZWVkXG4gKiAgIGVudHJpZXMgaW4gYHBlcnNpc3RlbmNlVHJhbnNmb3Jtc2AgLSBzZWUgYmVsb3cuXG4gKlxuICogLSBgcGVyc2lzdGVuY2VfdHlwZWA6IG9uZSBvZiBcImxvY2FsXCIsIFwic2Vzc2lvblwiLCBvciBcIm1lbW9yeVwiLCBqdXN0IGxpa2VcbiAqICAgYGRjYy5TdG9yZWAuIEJ1dCB0aGUgZGVmYXVsdCBoZXJlIHNob3VsZCBiZSBcImxvY2FsXCIgYmVjYXVzZSB0aGUgbWFpbiB1c2VcbiAqICAgY2FzZSBpcyB0byBtYWludGFpbiBzZXR0aW5ncyBhY3Jvc3MgcmVsb2Fkcy5cbiAqXG4gKiBJZiBhbnkgYHBlcnNpc3RlZF9wcm9wc2AgYXJlIG5lc3RlZCBwcm9wIElEcywgdGhlIGNvbXBvbmVudCBzaG91bGQgZGVmaW5lIGFcbiAqIGNsYXNzIHByb3BlcnR5IChub3QgYSBSZWFjdCBwcm9wKSBgcGVyc2lzdGVuY2VUcmFuc2Zvcm1zYCwgYXMgYW4gb2JqZWN0OlxuICoge1xuICogICBbcHJvcE5hbWVdOiB7XG4gKiAgICAgW3BpZWNlXToge1xuICogICAgICAgZXh0cmFjdDogcHJvcFZhbHVlID0+IHZhbHVlVG9TdG9yZSxcbiAqICAgICAgIGFwcGx5OiAoc3RvcmVkVmFsdWUsIHByb3BWYWx1ZSkgPT4gbmV3UHJvcFZhbHVlXG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKiAtIGBleHRyYWN0YCB0dXJucyBhIHByb3AgdmFsdWUgaW50byBhIHJlZHVjZWQgdmFsdWUgdG8gc3RvcmUuXG4gKiAtIGBhcHBseWAgcHV0cyBhbiBleHRyYWN0ZWQgdmFsdWUgYmFjayBpbnRvIHRoZSBwcm9wLiBNYWtlIHN1cmUgdGhpcyBjcmVhdGVzXG4gKiAgIGEgbmV3IG9iamVjdCByYXRoZXIgdGhhbiBtdXRhdGluZyBgcHJvVmFsdWVgLCBhbmQgdGhhdCBpZiB0aGVyZSBhcmVcbiAqICAgbXVsdGlwbGUgYHBpZWNlYCBlbnRyaWVzIGZvciBvbmUgYHByb3BOYW1lYCwgdGhlaXIgYGFwcGx5YCBmdW5jdGlvbnNcbiAqICAgY29tbXV0ZSAtIHdoaWNoIHNob3VsZCBub3QgYmUgYW4gaXNzdWUgaWYgdGhleSBleHRyYWN0IGFuZCBhcHBseVxuICogICBub24taW50ZXJzZWN0aW5nIHBhcnRzIG9mIHRoZSBmdWxsIHByb3AuXG4gKiBZb3Ugb25seSBuZWVkIHRvIGRlZmluZSB0aGVzZSBmb3IgdGhlIHByb3BzIHRoYXQgbmVlZCB0aGVtLlxuICogSXQncyBpbXBvcnRhbnQgdGhhdCBgZXh0cmFjdGAgcHVsbHMgb3V0ICpvbmx5KiB0aGUgcmVsZXZhbnQgcGllY2VzIG9mIHRoZVxuICogcHJvcCwgYmVjYXVzZSBwZXJzaXN0ZW5jZSBpcyBvbmx5IG1haW50YWluZWQgaWYgdGhlIGV4dHJhY3RlZCB2YWx1ZSBvZiB0aGVcbiAqIHByb3AgYmVmb3JlIGFwcGx5aW5nIHBlcnNpc3RlbmNlIGlzIHRoZSBzYW1lIGFzIGl0IHdhcyBiZWZvcmUgdGhlIHVzZXInc1xuICogY2hhbmdlcy5cbiAqL1xuXG5pbXBvcnQge1xuICAgIGVxdWFscyxcbiAgICBmaWx0ZXIsXG4gICAgZm9yRWFjaCxcbiAgICBrZXlzLFxuICAgIGxlbnNQYXRoLFxuICAgIG1lcmdlUmlnaHQsXG4gICAgc2V0LFxuICAgIHR5cGVcbn0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHtjcmVhdGVBY3Rpb259IGZyb20gJ3JlZHV4LWFjdGlvbnMnO1xuXG5pbXBvcnQgUmVnaXN0cnkgZnJvbSAnLi9yZWdpc3RyeSc7XG5pbXBvcnQge3N0cmluZ2lmeUlkfSBmcm9tICcuL2FjdGlvbnMvZGVwZW5kZW5jaWVzJztcbmltcG9ydCB7aXNEcnlDb21wb25lbnR9IGZyb20gJy4vd3JhcHBlci93cmFwcGluZyc7XG5cbmV4cG9ydCBjb25zdCBzdG9yZVByZWZpeCA9ICdfZGFzaF9wZXJzaXN0ZW5jZS4nO1xuXG5mdW5jdGlvbiBlcnIoZSkge1xuICAgIGNvbnN0IGVycm9yID0gdHlwZW9mIGUgPT09ICdzdHJpbmcnID8gbmV3IEVycm9yKGUpIDogZTtcblxuICAgIHJldHVybiBjcmVhdGVBY3Rpb24oJ09OX0VSUk9SJykoe1xuICAgICAgICB0eXBlOiAnZnJvbnRFbmQnLFxuICAgICAgICBlcnJvclxuICAgIH0pO1xufVxuXG4vKlxuICogRG9lcyBhIGtleSBmaXQgdGhpcyBwcmVmaXg/IE11c3QgZWl0aGVyIGJlIGFuIGV4YWN0IG1hdGNoXG4gKiBvciwgaWYgYSBzZXBhcmF0b3IgaXMgcHJvdmlkZWQsIGEgc2NvcGVkIG1hdGNoIC0gZXhhY3QgcHJlZml4XG4gKiBmb2xsb3dlZCBieSB0aGUgc2VwYXJhdG9yICh0aGVuIGFueXRoaW5nIGVsc2UpXG4gKi9cbmZ1bmN0aW9uIGtleVByZWZpeE1hdGNoKHByZWZpeCwgc2VwYXJhdG9yKSB7XG4gICAgY29uc3QgZnVsbFN0ciA9IHByZWZpeCArIHNlcGFyYXRvcjtcbiAgICBjb25zdCBmdWxsTGVuID0gZnVsbFN0ci5sZW5ndGg7XG4gICAgcmV0dXJuIGtleSA9PiBrZXkgPT09IHByZWZpeCB8fCBrZXkuc3Vic3RyKDAsIGZ1bGxMZW4pID09PSBmdWxsU3RyO1xufVxuXG5jb25zdCBVTkRFRklORUQgPSAnVSc7XG5jb25zdCBfcGFyc2UgPSB2YWwgPT4gKHZhbCA9PT0gVU5ERUZJTkVEID8gdW5kZWZpbmVkIDogSlNPTi5wYXJzZSh2YWwgfHwgbnVsbCkpO1xuY29uc3QgX3N0cmluZ2lmeSA9IHZhbCA9PiAodmFsID09PSB1bmRlZmluZWQgPyBVTkRFRklORUQgOiBKU09OLnN0cmluZ2lmeSh2YWwpKTtcblxuY2xhc3MgV2ViU3RvcmUge1xuICAgIGNvbnN0cnVjdG9yKGJhY2tFbmQpIHtcbiAgICAgICAgdGhpcy5fbmFtZSA9IGJhY2tFbmQ7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2UgPSB3aW5kb3dbYmFja0VuZF07XG4gICAgfVxuXG4gICAgaGFzSXRlbShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2UuZ2V0SXRlbShzdG9yZVByZWZpeCArIGtleSkgIT09IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0SXRlbShrZXkpIHtcbiAgICAgICAgLy8gbm90ZTogX3N0b3JhZ2UuZ2V0SXRlbSByZXR1cm5zIG51bGwgb24gbWlzc2luZyBrZXlzXG4gICAgICAgIC8vIGFuZCBKU09OLnBhcnNlKG51bGwpIHJldHVybnMgbnVsbCBhcyB3ZWxsXG4gICAgICAgIHJldHVybiBfcGFyc2UodGhpcy5fc3RvcmFnZS5nZXRJdGVtKHN0b3JlUHJlZml4ICsga2V5KSk7XG4gICAgfVxuXG4gICAgX3NldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgICAgICAvLyB1bnByb3RlY3RlZCB2ZXJzaW9uIG9mIHNldEl0ZW0sIGZvciB1c2UgYnkgdHJ5R2V0V2ViU3RvcmVcbiAgICAgICAgdGhpcy5fc3RvcmFnZS5zZXRJdGVtKHN0b3JlUHJlZml4ICsga2V5LCBfc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuICAgIC8qXG4gICAgICogSW4gYWRkaXRpb24gdG8gdGhlIHJlZ3VsYXIga2V5LT52YWx1ZSB0byBzZXQsIHNldEl0ZW0gdGFrZXNcbiAgICAgKiBkaXNwYXRjaCBhcyBhIHBhcmFtZXRlciwgc28gaXQgY2FuIHJlcG9ydCBPT00gdG8gZGV2dG9vbHNcbiAgICAgKi9cbiAgICBzZXRJdGVtKGtleSwgdmFsdWUsIGRpc3BhdGNoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRJdGVtKGtleSwgdmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgICBlcnIoXG4gICAgICAgICAgICAgICAgICAgIGAke2tleX0gZmFpbGVkIHRvIHNhdmUgaW4gJHt0aGlzLl9uYW1lfS4gUGVyc2lzdGVkIHByb3BzIG1heSBiZSBsb3N0LmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gVE9ETzogYXQgc29tZSBwb2ludCB3ZSBtYXkgd2FudCB0byBjb252ZXJ0IHRoaXMgdG8gZmFsbCBiYWNrXG4gICAgICAgICAgICAvLyBvbiBtZW1vcnksIHB1bGxpbmcgb3V0IGFsbCBwZXJzaXN0ZW5jZSBrZXlzIGFuZCBwdXR0aW5nIHRoZW1cbiAgICAgICAgICAgIC8vIGluIGEgTWVtU3RvcmUgdGhhdCBnZXRzIHVzZWQgZnJvbSB0aGVuIG9ud2FyZC5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZUl0ZW0oa2V5KSB7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2UucmVtb3ZlSXRlbShzdG9yZVByZWZpeCArIGtleSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBjbGVhciBtYXRjaGluZyBrZXlzIG1hdGNoaW5nIChvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgZG90IGFuZCBtb3JlXG4gICAgICogY2hhcmFjdGVycykgLSBvciBhbGwga2V5cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdG9yZSBpZiBubyBwcmVmaXguXG4gICAgICovXG4gICAgY2xlYXIoa2V5UHJlZml4KSB7XG4gICAgICAgIGNvbnN0IGZ1bGxQcmVmaXggPSBzdG9yZVByZWZpeCArIChrZXlQcmVmaXggfHwgJycpO1xuICAgICAgICBjb25zdCBrZXlNYXRjaCA9IGtleVByZWZpeE1hdGNoKGZ1bGxQcmVmaXgsIGtleVByZWZpeCA/ICcuJyA6ICcnKTtcbiAgICAgICAgY29uc3Qga2V5c1RvUmVtb3ZlID0gW107XG4gICAgICAgIC8vIDItc3RlcCBwcm9jZXNzLCBzbyB3ZSBkb24ndCBkZXBlbmQgb24gYW55IHBhcnRpY3VsYXIgYmVoYXZpb3Igb2ZcbiAgICAgICAgLy8ga2V5IG9yZGVyIHdoaWxlIHJlbW92aW5nIHNvbWVcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9zdG9yYWdlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBmdWxsS2V5ID0gdGhpcy5fc3RvcmFnZS5rZXkoaSk7XG4gICAgICAgICAgICBpZiAoa2V5TWF0Y2goZnVsbEtleSkpIHtcbiAgICAgICAgICAgICAgICBrZXlzVG9SZW1vdmUucHVzaChmdWxsS2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3JFYWNoKGsgPT4gdGhpcy5fc3RvcmFnZS5yZW1vdmVJdGVtKGspLCBrZXlzVG9SZW1vdmUpO1xuICAgIH1cbn1cblxuY2xhc3MgTWVtU3RvcmUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9kYXRhID0ge307XG4gICAgfVxuXG4gICAgaGFzSXRlbShrZXkpIHtcbiAgICAgICAgcmV0dXJuIGtleSBpbiB0aGlzLl9kYXRhO1xuICAgIH1cblxuICAgIGdldEl0ZW0oa2V5KSB7XG4gICAgICAgIC8vIHJ1biB0aGlzIHN0b3JhZ2UgdGhyb3VnaCBKU09OIHRvbyBzbyB3ZSBrbm93IHdlIGdldCBhIGZyZXNoIG9iamVjdFxuICAgICAgICAvLyBlYWNoIHJldHJpZXZhbFxuICAgICAgICByZXR1cm4gX3BhcnNlKHRoaXMuX2RhdGFba2V5XSk7XG4gICAgfVxuXG4gICAgc2V0SXRlbShrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2RhdGFba2V5XSA9IF9zdHJpbmdpZnkodmFsdWUpO1xuICAgIH1cblxuICAgIHJlbW92ZUl0ZW0oa2V5KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9kYXRhW2tleV07XG4gICAgfVxuXG4gICAgY2xlYXIoa2V5UHJlZml4KSB7XG4gICAgICAgIGlmIChrZXlQcmVmaXgpIHtcbiAgICAgICAgICAgIGZvckVhY2goXG4gICAgICAgICAgICAgICAga2V5ID0+IGRlbGV0ZSB0aGlzLl9kYXRhW2tleV0sXG4gICAgICAgICAgICAgICAgZmlsdGVyKGtleVByZWZpeE1hdGNoKGtleVByZWZpeCwgJy4nKSwga2V5cyh0aGlzLl9kYXRhKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9kYXRhID0ge307XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIE1ha2UgYSBzdHJpbmcgMl4xNiBjaGFyYWN0ZXJzIGxvbmcgKCoyIGJ5dGVzL2NoYXIgPSAxMzBrQiksIHRvIHRlc3Qgc3RvcmFnZS5cbi8vIFRoYXQgc2hvdWxkIGJlIHBsZW50eSBmb3IgY29tbW9uIHBlcnNpc3RlbmNlIHVzZSBjYXNlcyxcbi8vIHdpdGhvdXQgZ2V0dGluZyBhbnl3aGVyZSBuZWFyIHR5cGljYWwgYnJvd3NlciBsaW1pdHNcbmNvbnN0IHBvdyA9IDE2O1xuZnVuY3Rpb24gbG9uZ1N0cmluZygpIHtcbiAgICBsZXQgcyA9ICdTcGFtJztcbiAgICBmb3IgKGxldCBpID0gMjsgaSA8IHBvdzsgaSsrKSB7XG4gICAgICAgIHMgKz0gcztcbiAgICB9XG4gICAgcmV0dXJuIHM7XG59XG5cbmV4cG9ydCBjb25zdCBzdG9yZXMgPSB7XG4gICAgbWVtb3J5OiBuZXcgTWVtU3RvcmUoKVxuICAgIC8vIERlZmVyIHRlc3RpbmcgJiBtYWtpbmcgbG9jYWwvc2Vzc2lvbiBzdG9yZXMgdW50aWwgcmVxdWVzdGVkLlxuICAgIC8vIFRoYXQgd2F5IGlmIHdlIGhhdmUgZXJyb3JzIGhlcmUgdGhleSBjYW4gc2hvdyB1cCBpbiBkZXZ0b29scy5cbn07XG5cbmNvbnN0IGJhY2tFbmRzID0ge1xuICAgIGxvY2FsOiAnbG9jYWxTdG9yYWdlJyxcbiAgICBzZXNzaW9uOiAnc2Vzc2lvblN0b3JhZ2UnXG59O1xuXG5mdW5jdGlvbiB0cnlHZXRXZWJTdG9yZShiYWNrRW5kLCBkaXNwYXRjaCkge1xuICAgIGNvbnN0IHN0b3JlID0gbmV3IFdlYlN0b3JlKGJhY2tFbmQpO1xuICAgIGNvbnN0IGZhbGxiYWNrU3RvcmUgPSBzdG9yZXMubWVtb3J5O1xuICAgIGNvbnN0IHN0b3JlVGVzdCA9IGxvbmdTdHJpbmcoKTtcbiAgICBjb25zdCB0ZXN0S2V5ID0gc3RvcmVQcmVmaXggKyAneC54JztcbiAgICB0cnkge1xuICAgICAgICBzdG9yZS5fc2V0SXRlbSh0ZXN0S2V5LCBzdG9yZVRlc3QpO1xuICAgICAgICBpZiAoc3RvcmUuZ2V0SXRlbSh0ZXN0S2V5KSAhPT0gc3RvcmVUZXN0KSB7XG4gICAgICAgICAgICBkaXNwYXRjaChcbiAgICAgICAgICAgICAgICBlcnIoYCR7YmFja0VuZH0gaW5pdCBmYWlsZWQgc2V0L2dldCwgZmFsbGluZyBiYWNrIHRvIG1lbW9yeWApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrU3RvcmU7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmUucmVtb3ZlSXRlbSh0ZXN0S2V5KTtcbiAgICAgICAgcmV0dXJuIHN0b3JlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICBlcnIoYCR7YmFja0VuZH0gaW5pdCBmaXJzdCB0cnkgZmFpbGVkOyBjbGVhcmluZyBhbmQgcmV0cnlpbmdgKVxuICAgICAgICApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBzdG9yZS5jbGVhcigpO1xuICAgICAgICBzdG9yZS5fc2V0SXRlbSh0ZXN0S2V5LCBzdG9yZVRlc3QpO1xuICAgICAgICBpZiAoc3RvcmUuZ2V0SXRlbSh0ZXN0S2V5KSAhPT0gc3RvcmVUZXN0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vcGUnKTtcbiAgICAgICAgfVxuICAgICAgICBzdG9yZS5yZW1vdmVJdGVtKHRlc3RLZXkpO1xuICAgICAgICBkaXNwYXRjaChlcnIoYCR7YmFja0VuZH0gaW5pdCBzZXQvZ2V0IHN1Y2NlZWRlZCBhZnRlciBjbGVhcmluZyFgKSk7XG4gICAgICAgIHJldHVybiBzdG9yZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGRpc3BhdGNoKGVycihgJHtiYWNrRW5kfSBpbml0IHN0aWxsIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIG1lbW9yeWApKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrU3RvcmU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRTdG9yZSh0eXBlLCBkaXNwYXRjaCkge1xuICAgIGlmICghc3RvcmVzW3R5cGVdKSB7XG4gICAgICAgIHN0b3Jlc1t0eXBlXSA9IHRyeUdldFdlYlN0b3JlKGJhY2tFbmRzW3R5cGVdLCBkaXNwYXRjaCk7XG4gICAgfVxuICAgIHJldHVybiBzdG9yZXNbdHlwZV07XG59XG5cbmNvbnN0IG5vb3BUcmFuc2Zvcm0gPSB7XG4gICAgZXh0cmFjdDogcHJvcFZhbHVlID0+IHByb3BWYWx1ZSxcbiAgICBhcHBseTogKHN0b3JlZFZhbHVlLCBfcHJvcFZhbHVlKSA9PiBzdG9yZWRWYWx1ZVxufTtcblxuY29uc3QgZ2V0VHJhbnNmb3JtID0gKGVsZW1lbnQsIHByb3BOYW1lLCBwcm9wUGFydCkgPT4ge1xuICAgIGlmIChcbiAgICAgICAgZWxlbWVudC5wZXJzaXN0ZW5jZVRyYW5zZm9ybXMgJiZcbiAgICAgICAgZWxlbWVudC5wZXJzaXN0ZW5jZVRyYW5zZm9ybXNbcHJvcE5hbWVdXG4gICAgKSB7XG4gICAgICAgIGlmIChwcm9wUGFydCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQucGVyc2lzdGVuY2VUcmFuc2Zvcm1zW3Byb3BOYW1lXVtwcm9wUGFydF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucGVyc2lzdGVuY2VUcmFuc2Zvcm1zW3Byb3BOYW1lXTtcbiAgICB9XG4gICAgcmV0dXJuIG5vb3BUcmFuc2Zvcm07XG59O1xuXG5jb25zdCBnZXRWYWxzS2V5ID0gKGlkLCBwZXJzaXN0ZWRQcm9wLCBwZXJzaXN0ZW5jZSkgPT5cbiAgICBgJHtzdHJpbmdpZnlJZChpZCl9LiR7cGVyc2lzdGVkUHJvcH0uJHtKU09OLnN0cmluZ2lmeShwZXJzaXN0ZW5jZSl9YDtcblxuY29uc3QgZ2V0UHJvcHMgPSBsYXlvdXQgPT4ge1xuICAgIGNvbnN0IHtwcm9wcywgdHlwZSwgbmFtZXNwYWNlfSA9IGxheW91dDtcbiAgICBpZiAoIXR5cGUgfHwgIW5hbWVzcGFjZSkge1xuICAgICAgICAvLyBub3QgYSByZWFsIGNvbXBvbmVudCAtIGp1c3QgbmVlZCB0aGUgcHJvcHMgZm9yIHJlY3Vyc2lvblxuICAgICAgICByZXR1cm4ge3Byb3BzfTtcbiAgICB9XG4gICAgY29uc3Qge2lkLCBwZXJzaXN0ZW5jZX0gPSBwcm9wcztcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBSZWdpc3RyeS5yZXNvbHZlKGxheW91dCk7XG4gICAgY29uc3QgZ2V0VmFsID0gcHJvcCA9PlxuICAgICAgICBwcm9wc1twcm9wXSB8fFxuICAgICAgICAoZWxlbWVudC5kZWZhdWx0UHJvcHMgfHwgZWxlbWVudC5kYXNoUGVyc2lzdGVuY2UgfHwge30pW3Byb3BdO1xuICAgIGNvbnN0IHBlcnNpc3RlZF9wcm9wcyA9IGdldFZhbCgncGVyc2lzdGVkX3Byb3BzJyk7XG4gICAgY29uc3QgcGVyc2lzdGVuY2VfdHlwZSA9IGdldFZhbCgncGVyc2lzdGVuY2VfdHlwZScpO1xuICAgIGNvbnN0IGNhblBlcnNpc3QgPSBpZCAmJiBwZXJzaXN0ZWRfcHJvcHMgJiYgcGVyc2lzdGVuY2VfdHlwZTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGNhblBlcnNpc3QsXG4gICAgICAgIGlkLFxuICAgICAgICBwcm9wcyxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgcGVyc2lzdGVuY2UsXG4gICAgICAgIHBlcnNpc3RlZF9wcm9wcyxcbiAgICAgICAgcGVyc2lzdGVuY2VfdHlwZVxuICAgIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkVWlFZGl0KGxheW91dCwgbmV3UHJvcHMsIGRpc3BhdGNoKSB7XG4gICAgY29uc3Qge1xuICAgICAgICBjYW5QZXJzaXN0LFxuICAgICAgICBpZCxcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHBlcnNpc3RlbmNlLFxuICAgICAgICBwZXJzaXN0ZWRfcHJvcHMsXG4gICAgICAgIHBlcnNpc3RlbmNlX3R5cGVcbiAgICB9ID0gZ2V0UHJvcHMobGF5b3V0KTtcblxuICAgIC8vIGlmIHRoZSBcInBlcnNpc3RlbmNlXCIgcHJvcGVydHkgaXMgY2hhbmdlZCBhcyBhIGNhbGxiYWNrIG91dHB1dCxcbiAgICAvLyBza2lwIHRoZSBwZXJzaXN0ZW5jZSBzdG9yYWdlIG92ZXJ3cml0aW5nLlxuICAgIGNvbnN0IGlzUGVyc2lzdGVuY2VNaXNtYXRjaCA9XG4gICAgICAgIG5ld1Byb3BzPy5wZXJzaXN0ZW5jZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIG5ld1Byb3BzLnBlcnNpc3RlbmNlICE9PSBwZXJzaXN0ZW5jZTtcblxuICAgIGlmICghY2FuUGVyc2lzdCB8fCAhcGVyc2lzdGVuY2UgfHwgaXNQZXJzaXN0ZW5jZU1pc21hdGNoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3JFYWNoKHBlcnNpc3RlZFByb3AgPT4ge1xuICAgICAgICBjb25zdCBbcHJvcE5hbWUsIHByb3BQYXJ0XSA9IHBlcnNpc3RlZFByb3Auc3BsaXQoJy4nKTtcbiAgICAgICAgaWYgKG5ld1Byb3BzW3Byb3BOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBzdG9yYWdlID0gZ2V0U3RvcmUocGVyc2lzdGVuY2VfdHlwZSwgZGlzcGF0Y2gpO1xuICAgICAgICAgICAgY29uc3Qge2V4dHJhY3R9ID0gZ2V0VHJhbnNmb3JtKGVsZW1lbnQsIHByb3BOYW1lLCBwcm9wUGFydCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHZhbHNLZXkgPSBnZXRWYWxzS2V5KGlkLCBwZXJzaXN0ZWRQcm9wLCBwZXJzaXN0ZW5jZSk7XG4gICAgICAgICAgICBsZXQgb3JpZ2luYWxWYWwgPSBleHRyYWN0KHByb3BzW3Byb3BOYW1lXSk7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWwgPSBleHRyYWN0KG5ld1Byb3BzW3Byb3BOYW1lXSk7XG5cbiAgICAgICAgICAgIC8vIG1haW5seSBmb3IgbmVzdGVkIHByb3BzIHdpdGggbXVsdGlwbGUgcGVyc2lzdGVkIHBhcnRzLCBpdCdzXG4gICAgICAgICAgICAvLyBwb3NzaWJsZSB0byBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGJlZm9yZSAtIHNob3VsZCBub3Qgc3RvcmVcbiAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZS5cbiAgICAgICAgICAgIGlmIChvcmlnaW5hbFZhbCAhPT0gbmV3VmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0b3JhZ2UuaGFzSXRlbSh2YWxzS2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFZhbCA9IHN0b3JhZ2UuZ2V0SXRlbSh2YWxzS2V5KVsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdmFscyA9XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gW25ld1ZhbF1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogW25ld1ZhbCwgb3JpZ2luYWxWYWxdO1xuICAgICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0SXRlbSh2YWxzS2V5LCB2YWxzLCBkaXNwYXRjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCBwZXJzaXN0ZWRfcHJvcHMpO1xufVxuXG4vKlxuICogVXNlZCBmb3IgZW50aXJlIGxheW91dHMgKG9uIGxvYWQpIG9yIHBhcnRpYWwgbGF5b3V0cyAoZnJvbSBjaGlsZHJlblxuICogY2FsbGJhY2tzKSB0byBhcHBseSBwcmV2aW91c2x5LXN0b3JlZCBVSSBlZGl0cyB0byBjb21wb25lbnRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVBlcnNpc3RlbmNlKGxheW91dCwgZGlzcGF0Y2gpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShsYXlvdXQpKSB7XG4gICAgICAgIHJldHVybiBsYXlvdXQubWFwKGxheSA9PlxuICAgICAgICAgICAgaXNEcnlDb21wb25lbnQobGF5KSA/IHBlcnNpc3RlbmNlTW9kcyhsYXksIGxheSwgW10sIGRpc3BhdGNoKSA6IGxheVxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcGVyc2lzdGVuY2VNb2RzKGxheW91dCwgbGF5b3V0LCBbXSwgZGlzcGF0Y2gpO1xufVxuXG5jb25zdCBVTkRPID0gdHJ1ZTtcbmZ1bmN0aW9uIG1vZFByb3Aoa2V5LCBzdG9yYWdlLCBlbGVtZW50LCBwcm9wcywgcGVyc2lzdGVkUHJvcCwgdXBkYXRlLCB1bmRvKSB7XG4gICAgaWYgKHN0b3JhZ2UuaGFzSXRlbShrZXkpKSB7XG4gICAgICAgIGNvbnN0IFtuZXdWYWwsIG9yaWdpbmFsVmFsXSA9IHN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICBjb25zdCBmcm9tVmFsID0gdW5kbyA/IG5ld1ZhbCA6IG9yaWdpbmFsVmFsO1xuICAgICAgICBjb25zdCB0b1ZhbCA9IHVuZG8gPyBvcmlnaW5hbFZhbCA6IG5ld1ZhbDtcbiAgICAgICAgY29uc3QgW3Byb3BOYW1lLCBwcm9wUGFydF0gPSBwZXJzaXN0ZWRQcm9wLnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldFRyYW5zZm9ybShlbGVtZW50LCBwcm9wTmFtZSwgcHJvcFBhcnQpO1xuXG4gICAgICAgIGlmIChlcXVhbHMoZnJvbVZhbCwgdHJhbnNmb3JtLmV4dHJhY3QocHJvcHNbcHJvcE5hbWVdKSkpIHtcbiAgICAgICAgICAgIHVwZGF0ZVtwcm9wTmFtZV0gPSB0cmFuc2Zvcm0uYXBwbHkoXG4gICAgICAgICAgICAgICAgdG9WYWwsXG4gICAgICAgICAgICAgICAgcHJvcE5hbWUgaW4gdXBkYXRlID8gdXBkYXRlW3Byb3BOYW1lXSA6IHByb3BzW3Byb3BOYW1lXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNsZWFyIHRoaXMgc2F2ZWQgZWRpdCAtIHdlJ3ZlIHN0YXJ0ZWQgd2l0aCB0aGUgd3JvbmdcbiAgICAgICAgICAgIC8vIHZhbHVlIGZvciB0aGlzIHBlcnNpc3RlbmNlIElEXG4gICAgICAgICAgICBzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcGVyc2lzdGVuY2VNb2RzKGxheW91dCwgY29tcG9uZW50LCBwYXRoLCBkaXNwYXRjaCkge1xuICAgIGNvbnN0IHtcbiAgICAgICAgY2FuUGVyc2lzdCxcbiAgICAgICAgaWQsXG4gICAgICAgIHByb3BzLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBwZXJzaXN0ZW5jZSxcbiAgICAgICAgcGVyc2lzdGVkX3Byb3BzLFxuICAgICAgICBwZXJzaXN0ZW5jZV90eXBlXG4gICAgfSA9IGdldFByb3BzKGNvbXBvbmVudCk7XG5cbiAgICBsZXQgbGF5b3V0T3V0ID0gbGF5b3V0O1xuICAgIGlmIChjYW5QZXJzaXN0ICYmIHBlcnNpc3RlbmNlKSB7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBnZXRTdG9yZShwZXJzaXN0ZW5jZV90eXBlLCBkaXNwYXRjaCk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZSA9IHt9O1xuICAgICAgICBmb3JFYWNoKFxuICAgICAgICAgICAgcGVyc2lzdGVkUHJvcCA9PlxuICAgICAgICAgICAgICAgIG1vZFByb3AoXG4gICAgICAgICAgICAgICAgICAgIGdldFZhbHNLZXkoaWQsIHBlcnNpc3RlZFByb3AsIHBlcnNpc3RlbmNlKSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlZFByb3AsXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBwZXJzaXN0ZWRfcHJvcHNcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3BOYW1lIGluIHVwZGF0ZSkge1xuICAgICAgICAgICAgbGF5b3V0T3V0ID0gc2V0KFxuICAgICAgICAgICAgICAgIGxlbnNQYXRoKHBhdGguY29uY2F0KCdwcm9wcycsIHByb3BOYW1lKSksXG4gICAgICAgICAgICAgICAgdXBkYXRlW3Byb3BOYW1lXSxcbiAgICAgICAgICAgICAgICBsYXlvdXRPdXRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZWN1cnNlIGlud2FyZFxuICAgIGNvbnN0IHtjaGlsZHJlbn0gPSBwcm9wcztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQsIGkpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlKGNoaWxkKSA9PT0gJ09iamVjdCcgJiYgY2hpbGQucHJvcHMpIHtcbiAgICAgICAgICAgICAgICBsYXlvdXRPdXQgPSBwZXJzaXN0ZW5jZU1vZHMoXG4gICAgICAgICAgICAgICAgICAgIGxheW91dE91dCxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICAgICAgICAgIHBhdGguY29uY2F0KCdwcm9wcycsICdjaGlsZHJlbicsIGkpLFxuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZShjaGlsZHJlbikgPT09ICdPYmplY3QnICYmIGNoaWxkcmVuLnByb3BzKSB7XG4gICAgICAgIGxheW91dE91dCA9IHBlcnNpc3RlbmNlTW9kcyhcbiAgICAgICAgICAgIGxheW91dE91dCxcbiAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgcGF0aC5jb25jYXQoJ3Byb3BzJywgJ2NoaWxkcmVuJyksXG4gICAgICAgICAgICBkaXNwYXRjaFxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbGF5b3V0T3V0O1xufVxuXG4vKlxuICogV2hlbiB3ZSByZWNlaXZlIG5ldyBleHBsaWNpdCBwcm9wcyBmcm9tIGEgY2FsbGJhY2ssXG4gKiB0aGVzZSBvdmVycmlkZSBVSS1kcml2ZW4gZWRpdHMgb2YgdGhvc2UgZXhhY3QgcHJvcHNcbiAqIGJ1dCBub3QgZm9yIHByb3BzIG5lc3RlZCBpbnNpZGUgY2hpbGRyZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBydW5lUGVyc2lzdGVuY2UobGF5b3V0LCBuZXdQcm9wcywgZGlzcGF0Y2gpIHtcbiAgICBjb25zdCB7XG4gICAgICAgIGNhblBlcnNpc3QsXG4gICAgICAgIGlkLFxuICAgICAgICBwcm9wcyxcbiAgICAgICAgcGVyc2lzdGVuY2UsXG4gICAgICAgIHBlcnNpc3RlZF9wcm9wcyxcbiAgICAgICAgcGVyc2lzdGVuY2VfdHlwZSxcbiAgICAgICAgZWxlbWVudFxuICAgIH0gPSBnZXRQcm9wcyhsYXlvdXQpO1xuXG4gICAgY29uc3QgZ2V0RmluYWwgPSAocHJvcE5hbWUsIHByZXZWYWwpID0+XG4gICAgICAgIHByb3BOYW1lIGluIG5ld1Byb3BzID8gbmV3UHJvcHNbcHJvcE5hbWVdIDogcHJldlZhbDtcbiAgICBjb25zdCBmaW5hbFBlcnNpc3RlbmNlID0gZ2V0RmluYWwoJ3BlcnNpc3RlbmNlJywgcGVyc2lzdGVuY2UpO1xuXG4gICAgaWYgKCFjYW5QZXJzaXN0IHx8ICEocGVyc2lzdGVuY2UgfHwgZmluYWxQZXJzaXN0ZW5jZSkpIHtcbiAgICAgICAgcmV0dXJuIG5ld1Byb3BzO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmFsUGVyc2lzdGVuY2VUeXBlID0gZ2V0RmluYWwoJ3BlcnNpc3RlbmNlX3R5cGUnLCBwZXJzaXN0ZW5jZV90eXBlKTtcbiAgICBjb25zdCBmaW5hbFBlcnNpc3RlZFByb3BzID0gZ2V0RmluYWwoJ3BlcnNpc3RlZF9wcm9wcycsIHBlcnNpc3RlZF9wcm9wcyk7XG4gICAgY29uc3QgcGVyc2lzdGVuY2VDaGFuZ2VkID1cbiAgICAgICAgZmluYWxQZXJzaXN0ZW5jZSAhPT0gcGVyc2lzdGVuY2UgfHxcbiAgICAgICAgZmluYWxQZXJzaXN0ZW5jZVR5cGUgIT09IHBlcnNpc3RlbmNlX3R5cGUgfHxcbiAgICAgICAgZmluYWxQZXJzaXN0ZWRQcm9wcyAhPT0gcGVyc2lzdGVkX3Byb3BzO1xuXG4gICAgY29uc3Qgbm90SW5OZXdQcm9wcyA9IHBlcnNpc3RlZFByb3AgPT5cbiAgICAgICAgIShwZXJzaXN0ZWRQcm9wLnNwbGl0KCcuJylbMF0gaW4gbmV3UHJvcHMpO1xuXG4gICAgY29uc3QgdXBkYXRlID0ge307XG5cbiAgICBsZXQgZGVwZXJzaXN0ZWRQcm9wcyA9IHByb3BzO1xuXG4gICAgaWYgKHBlcnNpc3RlbmNlQ2hhbmdlZCAmJiBwZXJzaXN0ZW5jZSkge1xuICAgICAgICAvLyBjbGVhciBwcmV2aW91c2x5LWFwcGxpZWQgcGVyc2lzdGVuY2VcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IGdldFN0b3JlKHBlcnNpc3RlbmNlX3R5cGUsIGRpc3BhdGNoKTtcbiAgICAgICAgZm9yRWFjaChcbiAgICAgICAgICAgIHBlcnNpc3RlZFByb3AgPT5cbiAgICAgICAgICAgICAgICBtb2RQcm9wKFxuICAgICAgICAgICAgICAgICAgICBnZXRWYWxzS2V5KGlkLCBwZXJzaXN0ZWRQcm9wLCBwZXJzaXN0ZW5jZSksXG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZWRQcm9wLFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGUsXG4gICAgICAgICAgICAgICAgICAgIFVORE9cbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZmlsdGVyKG5vdEluTmV3UHJvcHMsIHBlcnNpc3RlZF9wcm9wcylcbiAgICAgICAgKTtcbiAgICAgICAgZGVwZXJzaXN0ZWRQcm9wcyA9IG1lcmdlUmlnaHQocHJvcHMsIHVwZGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGZpbmFsUGVyc2lzdGVuY2UgJiYgcGVyc2lzdGVuY2VDaGFuZ2VkKSB7XG4gICAgICAgIGNvbnN0IGZpbmFsU3RvcmFnZSA9IGdldFN0b3JlKGZpbmFsUGVyc2lzdGVuY2VUeXBlLCBkaXNwYXRjaCk7XG4gICAgICAgIC8vIGFwcGx5IG5ldyBwZXJzaXN0ZW5jZVxuICAgICAgICBmb3JFYWNoKFxuICAgICAgICAgICAgcGVyc2lzdGVkUHJvcCA9PlxuICAgICAgICAgICAgICAgIG1vZFByb3AoXG4gICAgICAgICAgICAgICAgICAgIGdldFZhbHNLZXkoaWQsIHBlcnNpc3RlZFByb3AsIGZpbmFsUGVyc2lzdGVuY2UpLFxuICAgICAgICAgICAgICAgICAgICBmaW5hbFN0b3JhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGRlcGVyc2lzdGVkUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlZFByb3AsXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmaWx0ZXIobm90SW5OZXdQcm9wcywgZmluYWxQZXJzaXN0ZWRQcm9wcylcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBlcnNpc3RlbmNlQ2hhbmdlZCA/IG1lcmdlUmlnaHQobmV3UHJvcHMsIHVwZGF0ZSkgOiBuZXdQcm9wcztcbn1cbiIsImltcG9ydCB7YXNzb2MsIGFzc29jUGF0aCwgbWVyZ2VSaWdodH0gZnJvbSAncmFtZGEnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVBcGlSZWR1Y2VyKHN0b3JlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIEFwaVJlZHVjZXIoc3RhdGUgPSB7fSwgYWN0aW9uKSB7XG4gICAgICAgIGxldCBuZXdTdGF0ZSA9IHN0YXRlO1xuICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09IHN0b3JlKSB7XG4gICAgICAgICAgICBjb25zdCB7aWQsIHN0YXR1cywgY29udGVudH0gPSBhY3Rpb24ucGF5bG9hZDtcbiAgICAgICAgICAgIGNvbnN0IG5ld1JlcXVlc3QgPSB7c3RhdHVzLCBjb250ZW50fTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlkKSkge1xuICAgICAgICAgICAgICAgIG5ld1N0YXRlID0gYXNzb2NQYXRoKGlkLCBuZXdSZXF1ZXN0LCBzdGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlkKSB7XG4gICAgICAgICAgICAgICAgbmV3U3RhdGUgPSBhc3NvYyhpZCwgbmV3UmVxdWVzdCwgc3RhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IG1lcmdlUmlnaHQoc3RhdGUsIG5ld1JlcXVlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICB9O1xufVxuIiwiaW1wb3J0IHtnZXRBY3Rpb259IGZyb20gJy4uL2FjdGlvbnMvY29uc3RhbnRzJztcbmltcG9ydCB7Z2V0QXBwU3RhdGV9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZnVuY3Rpb24gYXBwTGlmZWN5Y2xlKHN0YXRlID0gZ2V0QXBwU3RhdGUoJ1NUQVJURUQnKSwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlIGdldEFjdGlvbignU0VUX0FQUF9MSUZFQ1lDTEUnKTpcbiAgICAgICAgICAgIHJldHVybiBnZXRBcHBTdGF0ZShhY3Rpb24ucGF5bG9hZCk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBhcHBMaWZlY3ljbGU7XG4iLCJjb25zdCBpbml0aWFsQ2hhbmdlID0ge1xuICAgIGlkOiBudWxsLFxuICAgIHByb3BzOiB7fVxufTtcblxuZnVuY3Rpb24gY2hhbmdlZChzdGF0ZSA9IGluaXRpYWxDaGFuZ2UpIHtcbiAgICAvLyBUaGlzIGlzIGVtcHR5IGp1c3QgdG8gaW5pdGlhbGl6ZSB0aGUgc3RvcmUuIENoYW5nZXNcbiAgICAvLyBhcmUgYWN0dWFsbHkgcmVjb3JkZWQgaW4gcmVkdWNlci5qcyBzbyB0aGF0IHdlIGNhblxuICAgIC8vIHJlc29sdmUgcGF0aHMgdG8gaWQuXG4gICAgcmV0dXJuIHN0YXRlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjaGFuZ2VkO1xuIiwiaW1wb3J0IHtnZXRBY3Rpb259IGZyb20gJy4uL2FjdGlvbnMvY29uc3RhbnRzJztcbmltcG9ydCB7bWVyZ2VEZWVwUmlnaHR9IGZyb20gJ3JhbWRhJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29uZmlnKHN0YXRlID0gbnVsbCwgYWN0aW9uKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBnZXRBY3Rpb24oJ1NFVF9DT05GSUcnKSkge1xuICAgICAgICAvLyBQdXQgdGhlIGNvbXBvbmVudHMgY2hpbGRyZW5Qcm9wcyBpbiB3aW5kb3dzIGZvciBzaWRlIHVzYWdlLlxuICAgICAgICB3aW5kb3cuX19kYXNocHJpdmF0ZV9jaGlsZHJlblByb3BzID0gbWVyZ2VEZWVwUmlnaHQoXG4gICAgICAgICAgICB3aW5kb3cuX19kYXNocHJpdmF0ZV9jaGlsZHJlblByb3BzIHx8IHt9LFxuICAgICAgICAgICAgYWN0aW9uLnBheWxvYWQuY2hpbGRyZW5fcHJvcHNcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09IGdldEFjdGlvbignQUREX0hUVFBfSEVBREVSUycpKSB7XG4gICAgICAgIHJldHVybiBtZXJnZURlZXBSaWdodChzdGF0ZSwge1xuICAgICAgICAgICAgZmV0Y2g6IHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBhY3Rpb24ucGF5bG9hZFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGdldEFwcFN0YXRlKHN0YXRlKSB7XG4gICAgY29uc3Qgc3RhdGVMaXN0ID0ge1xuICAgICAgICBTVEFSVEVEOiAnU1RBUlRFRCcsXG4gICAgICAgIEhZRFJBVEVEOiAnSFlEUkFURUQnLFxuICAgICAgICBERVNUUk9ZRUQ6ICdERVNUUk9ZRUQnXG4gICAgfTtcbiAgICBpZiAoc3RhdGVMaXN0W3N0YXRlXSkge1xuICAgICAgICByZXR1cm4gc3RhdGVMaXN0W3N0YXRlXTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3N0YXRlfSBpcyBub3QgYSB2YWxpZCBhcHAgc3RhdGUuYCk7XG59XG4iLCJjb25zdCBpbml0aWFsR3JhcGggPSB7fTtcblxuY29uc3QgZ3JhcGhzID0gKHN0YXRlID0gaW5pdGlhbEdyYXBoLCBhY3Rpb24pID0+IHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdTRVRfR1JBUEhTJykge1xuICAgICAgICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGdyYXBocztcbiIsImltcG9ydCB7bWVyZ2VSaWdodH0gZnJvbSAncmFtZGEnO1xuXG5jb25zdCBpbml0aWFsRXJyb3IgPSB7XG4gICAgZnJvbnRFbmQ6IFtdLFxuICAgIGJhY2tFbmQ6IFtdLFxuICAgIGJhY2tFbmRDb25uZWN0ZWQ6IHRydWVcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGVycm9yKHN0YXRlID0gaW5pdGlhbEVycm9yLCBhY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ09OX0VSUk9SJzoge1xuICAgICAgICAgICAgY29uc3Qge2Zyb250RW5kLCBiYWNrRW5kLCBiYWNrRW5kQ29ubmVjdGVkfSA9IHN0YXRlO1xuICAgICAgICAgICAgLy8gbG9nIGVycm9ycyB0byB0aGUgY29uc29sZSBmb3Igc3RhY2sgdHJhY2luZyBhbmQgc28gdGhleSdyZVxuICAgICAgICAgICAgLy8gYXZhaWxhYmxlIGV2ZW4gd2l0aCBkZWJ1Z2dpbmcgb2ZmXG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAqL1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihhY3Rpb24ucGF5bG9hZC5lcnJvcik7XG5cbiAgICAgICAgICAgIGlmIChhY3Rpb24ucGF5bG9hZC50eXBlID09PSAnZnJvbnRFbmQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbnRFbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlUmlnaHQoYWN0aW9uLnBheWxvYWQsIHt0aW1lc3RhbXA6IG5ldyBEYXRlKCl9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmZyb250RW5kXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGJhY2tFbmQsXG4gICAgICAgICAgICAgICAgICAgIGJhY2tFbmRDb25uZWN0ZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24ucGF5bG9hZC50eXBlID09PSAnYmFja0VuZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBmcm9udEVuZCxcbiAgICAgICAgICAgICAgICAgICAgYmFja0VuZDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VSaWdodChhY3Rpb24ucGF5bG9hZCwge3RpbWVzdGFtcDogbmV3IERhdGUoKX0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uYmFja0VuZFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBiYWNrRW5kQ29ubmVjdGVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTRVRfQ09OTkVDVElPTl9TVEFUVVMnOiB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VSaWdodChzdGF0ZSwge2JhY2tFbmRDb25uZWN0ZWQ6IGFjdGlvbi5wYXlsb2FkfSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJjb25zdCBpbml0aWFsSGlzdG9yeSA9IHtcbiAgICBwYXN0OiBbXSxcbiAgICBwcmVzZW50OiB7fSxcbiAgICBmdXR1cmU6IFtdXG59O1xuXG5mdW5jdGlvbiBoaXN0b3J5KHN0YXRlID0gaW5pdGlhbEhpc3RvcnksIGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnVU5ETyc6IHtcbiAgICAgICAgICAgIGNvbnN0IHtwYXN0LCBwcmVzZW50LCBmdXR1cmV9ID0gc3RhdGU7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IHBhc3RbcGFzdC5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1Bhc3QgPSBwYXN0LnNsaWNlKDAsIHBhc3QubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHBhc3Q6IG5ld1Bhc3QsXG4gICAgICAgICAgICAgICAgcHJlc2VudDogcHJldmlvdXMsXG4gICAgICAgICAgICAgICAgZnV0dXJlOiBbcHJlc2VudCwgLi4uZnV0dXJlXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ1JFRE8nOiB7XG4gICAgICAgICAgICBjb25zdCB7cGFzdCwgcHJlc2VudCwgZnV0dXJlfSA9IHN0YXRlO1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IGZ1dHVyZVswXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0Z1dHVyZSA9IGZ1dHVyZS5zbGljZSgxKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGFzdDogWy4uLnBhc3QsIHByZXNlbnRdLFxuICAgICAgICAgICAgICAgIHByZXNlbnQ6IG5leHQsXG4gICAgICAgICAgICAgICAgZnV0dXJlOiBuZXdGdXR1cmVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdSRVZFUlQnOiB7XG4gICAgICAgICAgICBjb25zdCB7cGFzdCwgZnV0dXJlfSA9IHN0YXRlO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBwYXN0W3Bhc3QubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBjb25zdCBuZXdQYXN0ID0gcGFzdC5zbGljZSgwLCBwYXN0Lmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwYXN0OiBuZXdQYXN0LFxuICAgICAgICAgICAgICAgIHByZXNlbnQ6IHByZXZpb3VzLFxuICAgICAgICAgICAgICAgIGZ1dHVyZTogWy4uLmZ1dHVyZV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGhpc3Rvcnk7XG4iLCJjb25zdCBjdXN0b21Ib29rcyA9IChcbiAgICBzdGF0ZSA9IHtcbiAgICAgICAgbGF5b3V0X3ByZTogbnVsbCxcbiAgICAgICAgbGF5b3V0X3Bvc3Q6IG51bGwsXG4gICAgICAgIHJlcXVlc3RfcHJlOiBudWxsLFxuICAgICAgICByZXF1ZXN0X3Bvc3Q6IG51bGwsXG4gICAgICAgIGNhbGxiYWNrX3Jlc29sdmVkOiBudWxsLFxuICAgICAgICByZXF1ZXN0X3JlZnJlc2hfand0OiBudWxsLFxuICAgICAgICBiZWFyOiBmYWxzZVxuICAgIH0sXG4gICAgYWN0aW9uXG4pID0+IHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1NFVF9IT09LUyc6XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY3VzdG9tSG9va3M7XG4iLCJpbXBvcnQge1xuICAgIGluY2x1ZGVzLFxuICAgIG1lcmdlUmlnaHQsXG4gICAgYXBwZW5kLFxuICAgIHZpZXcsXG4gICAgbGVuc1BhdGgsXG4gICAgYXNzb2NQYXRoLFxuICAgIGRpc3NvY1BhdGhcbn0gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge2dldEFjdGlvbn0gZnJvbSAnLi4vYWN0aW9ucy9jb25zdGFudHMnO1xuXG5jb25zdCBsYXlvdXQgPSAoc3RhdGUgPSB7Y29tcG9uZW50czogW119LCBhY3Rpb24pID0+IHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGdldEFjdGlvbignU0VUX0xBWU9VVCcpKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFjdGlvbi5wYXlsb2FkKSkge1xuICAgICAgICAgICAgc3RhdGUuY29tcG9uZW50cyA9IFsuLi5hY3Rpb24ucGF5bG9hZF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZS5jb21wb25lbnRzID0gey4uLmFjdGlvbi5wYXlsb2FkfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBpbmNsdWRlcyhhY3Rpb24udHlwZSwgW1xuICAgICAgICAgICAgJ1VORE9fUFJPUF9DSEFOR0UnLFxuICAgICAgICAgICAgJ1JFRE9fUFJPUF9DSEFOR0UnLFxuICAgICAgICAgICAgZ2V0QWN0aW9uKCdPTl9QUk9QX0NIQU5HRScpXG4gICAgICAgIF0pXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHByb3BQYXRoID0gYXBwZW5kKCdwcm9wcycsIGFjdGlvbi5wYXlsb2FkLml0ZW1wYXRoKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdQcm9wcyA9IHZpZXcobGVuc1BhdGgocHJvcFBhdGgpLCBzdGF0ZSk7XG4gICAgICAgIGNvbnN0IG1lcmdlZFByb3BzID0gbWVyZ2VSaWdodChleGlzdGluZ1Byb3BzLCBhY3Rpb24ucGF5bG9hZC5wcm9wcyk7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgocHJvcFBhdGgsIG1lcmdlZFByb3BzLCBzdGF0ZSk7XG4gICAgfVxuICAgIC8vIEN1c3RvbSBjb21wb25lbnQgcmVuZGVyZWQgb3V0IG9mIHRyZWUuXG4gICAgZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09IGdldEFjdGlvbignSU5TRVJUX0NPTVBPTkVOVCcpKSB7XG4gICAgICAgIGNvbnN0IHtjb21wb25lbnQsIGNvbXBvbmVudFBhdGh9ID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgICAgIHJldHVybiBhc3NvY1BhdGgoY29tcG9uZW50UGF0aCwgY29tcG9uZW50LCBzdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gZ2V0QWN0aW9uKCdSRU1PVkVfQ09NUE9ORU5UJykpIHtcbiAgICAgICAgY29uc3Qge2NvbXBvbmVudFBhdGh9ID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgICAgIHJldHVybiBkaXNzb2NQYXRoKGNvbXBvbmVudFBhdGgsIHN0YXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBsYXlvdXQ7XG4iLCJpbXBvcnQge2dldEFjdGlvbn0gZnJvbSAnLi4vYWN0aW9ucy9jb25zdGFudHMnO1xuXG5jb25zdCBpbml0aWFsUGF0aHMgPSB7c3Ryczoge30sIG9ianM6IHt9fTtcblxuY29uc3QgcGF0aHMgPSAoc3RhdGUgPSBpbml0aWFsUGF0aHMsIGFjdGlvbikgPT4ge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gZ2V0QWN0aW9uKCdTRVRfUEFUSFMnKSkge1xuICAgICAgICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHBhdGhzO1xuIiwiaW1wb3J0IHtjbG9uZX0gZnJvbSAncmFtZGEnO1xuXG5pbXBvcnQge1NUQVRVU01BUH0gZnJvbSAnLi4vY29uc3RhbnRzL2NvbnN0YW50cyc7XG5cbmNvbnN0IGRlZmF1bHRQcm9maWxlID0ge1xuICAgIGNvdW50OiAwLFxuICAgIHRvdGFsOiAwLFxuICAgIGNvbXB1dGU6IDAsXG4gICAgbmV0d29yazoge1xuICAgICAgICB0aW1lOiAwLFxuICAgICAgICB1cGxvYWQ6IDAsXG4gICAgICAgIGRvd25sb2FkOiAwXG4gICAgfSxcbiAgICByZXNvdXJjZXM6IHt9LFxuICAgIHN0YXR1czoge1xuICAgICAgICBsYXRlc3Q6IG51bGxcbiAgICB9LFxuICAgIHJlc3VsdDoge31cbn07XG5cbmNvbnN0IGRlZmF1bHRTdGF0ZSA9IHtcbiAgICB1cGRhdGVkOiBbXSxcbiAgICByZXNvdXJjZXM6IHt9LFxuICAgIGNhbGxiYWNrczoge30sXG4gICAgZ3JhcGhMYXlvdXQ6IG51bGxcbn07XG5cbmNvbnN0IHByb2ZpbGUgPSAoc3RhdGUgPSBkZWZhdWx0U3RhdGUsIGFjdGlvbikgPT4ge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ1VQREFURV9SRVNPVVJDRV9VU0FHRScpIHtcbiAgICAgICAgLy8gS2VlcCBhIHJlY29yZCBvZiB0aGUgbW9zdCByZWNlbnQgY2hhbmdlLiBUaGlzXG4gICAgICAgIC8vIGlzIHN1YnRseSBkaWZmZXJlbnQgZnJvbSBoaXN0b3J5LnByZXNlbnQgYmVjYXVzZVxuICAgICAgICAvLyBpdCB3YXRjaGVzIGFsbCBwcm9wcywgbm90IGp1c3QgaW5wdXRzLlxuICAgICAgICBjb25zdCB7aWQsIHVzYWdlLCBzdGF0dXN9ID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgICAgIGNvbnN0IHN0YXR1c01hcHBlZCA9IFNUQVRVU01BUFtzdGF0dXNdIHx8IHN0YXR1cztcblxuICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBjYWxsYmFjayB0aGF0IGFjdHVhbGx5IGNoYW5nZWQuXG4gICAgICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgICAgICAgdXBkYXRlZDogW2lkXSxcbiAgICAgICAgICAgIHJlc291cmNlczogc3RhdGUucmVzb3VyY2VzLFxuICAgICAgICAgICAgY2FsbGJhY2tzOiBzdGF0ZS5jYWxsYmFja3MsXG4gICAgICAgICAgICAvLyBncmFwaExheW91dCBpcyBuZXZlciBwYXNzZWQgaW4gdmlhIGFjdGlvbnMsIGJlY2F1c2Ugd2UgZG9uJ3RcbiAgICAgICAgICAgIC8vIHdhbnQgaXQgdG8gdHJpZ2dlciBhIHJlcmVuZGVyIG9mIHRoZSBjYWxsYmFjayBncmFwaC5cbiAgICAgICAgICAgIC8vIFNlZSBDYWxsYmFja0dyYXBoQ29udGFpbmVyLnJlYWN0XG4gICAgICAgICAgICBncmFwaExheW91dDogc3RhdGUuZ3JhcGhMYXlvdXRcbiAgICAgICAgfTtcblxuICAgICAgICBuZXdTdGF0ZS5jYWxsYmFja3NbaWRdID1cbiAgICAgICAgICAgIG5ld1N0YXRlLmNhbGxiYWNrc1tpZF0gfHwgY2xvbmUoZGVmYXVsdFByb2ZpbGUpO1xuXG4gICAgICAgIGNvbnN0IGNiID0gbmV3U3RhdGUuY2FsbGJhY2tzW2lkXTtcbiAgICAgICAgY29uc3QgY2JSZXNvdXJjZXMgPSBjYi5yZXNvdXJjZXM7XG4gICAgICAgIGNvbnN0IHRvdGFsUmVzb3VyY2VzID0gbmV3U3RhdGUucmVzb3VyY2VzO1xuXG4gICAgICAgIC8vIFVwZGF0ZSByZXNvdXJjZSB1c2FnZSAmIHBhcmFtcy5cbiAgICAgICAgY2IuY291bnQgKz0gMTtcbiAgICAgICAgY2Iuc3RhdHVzLmxhdGVzdCA9IHN0YXR1c01hcHBlZDtcbiAgICAgICAgY2Iuc3RhdHVzW3N0YXR1c01hcHBlZF0gPSAoY2Iuc3RhdHVzW3N0YXR1c01hcHBlZF0gfHwgMCkgKyAxO1xuICAgICAgICBjYi5yZXN1bHQgPSBhY3Rpb24ucGF5bG9hZC5yZXN1bHQ7XG4gICAgICAgIGNiLmlucHV0cyA9IGFjdGlvbi5wYXlsb2FkLmlucHV0cztcbiAgICAgICAgY2Iuc3RhdGUgPSBhY3Rpb24ucGF5bG9hZC5zdGF0ZTtcblxuICAgICAgICBpZiAodXNhZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBfX2Rhc2hfY2xpZW50LFxuICAgICAgICAgICAgICAgIF9fZGFzaF9zZXJ2ZXIsXG4gICAgICAgICAgICAgICAgX19kYXNoX3VwbG9hZCxcbiAgICAgICAgICAgICAgICBfX2Rhc2hfZG93bmxvYWQsXG4gICAgICAgICAgICAgICAgLi4udXNlclxuICAgICAgICAgICAgfSA9IHVzYWdlO1xuXG4gICAgICAgICAgICBjYi50b3RhbCArPSBfX2Rhc2hfY2xpZW50O1xuICAgICAgICAgICAgY2IuY29tcHV0ZSArPSBfX2Rhc2hfc2VydmVyO1xuICAgICAgICAgICAgY2IubmV0d29yay50aW1lICs9IF9fZGFzaF9jbGllbnQgLSBfX2Rhc2hfc2VydmVyO1xuICAgICAgICAgICAgY2IubmV0d29yay51cGxvYWQgKz0gX19kYXNoX3VwbG9hZDtcbiAgICAgICAgICAgIGNiLm5ldHdvcmsuZG93bmxvYWQgKz0gX19kYXNoX2Rvd25sb2FkO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHIgaW4gdXNlcikge1xuICAgICAgICAgICAgICAgIGlmICh1c2VyLmhhc093blByb3BlcnR5KHIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNiUmVzb3VyY2VzW3JdID0gKGNiUmVzb3VyY2VzW3JdIHx8IDApICsgdXNlcltyXTtcbiAgICAgICAgICAgICAgICAgICAgdG90YWxSZXNvdXJjZXNbcl0gPSAodG90YWxSZXNvdXJjZXNbcl0gfHwgMCkgKyB1c2VyW3JdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBwcm9maWxlO1xuIiwiaW1wb3J0IHtmb3JFYWNoLCBpbmNsdWRlcywgaXNFbXB0eSwga2V5cywgcGF0aCwgYXNzb2MsIHBhdGhPcn0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHtjb21iaW5lUmVkdWNlcnN9IGZyb20gJ3JlZHV4JztcblxuaW1wb3J0IHtnZXRDYWxsYmFja3NCeUlucHV0fSBmcm9tICcuLi9hY3Rpb25zL2RlcGVuZGVuY2llc190cyc7XG5cbmltcG9ydCBjcmVhdGVBcGlSZWR1Y2VyIGZyb20gJy4vYXBpJztcbmltcG9ydCBhcHBMaWZlY3ljbGUgZnJvbSAnLi9hcHBMaWZlY3ljbGUnO1xuaW1wb3J0IGNhbGxiYWNrcyBmcm9tICcuL2NhbGxiYWNrcyc7XG5pbXBvcnQgY29uZmlnIGZyb20gJy4vY29uZmlnJztcbmltcG9ydCBncmFwaHMgZnJvbSAnLi9kZXBlbmRlbmN5R3JhcGgnO1xuaW1wb3J0IGVycm9yIGZyb20gJy4vZXJyb3InO1xuaW1wb3J0IGhpc3RvcnkgZnJvbSAnLi9oaXN0b3J5JztcbmltcG9ydCBob29rcyBmcm9tICcuL2hvb2tzJztcbmltcG9ydCBwcm9maWxlIGZyb20gJy4vcHJvZmlsZSc7XG5pbXBvcnQgY2hhbmdlZCBmcm9tICcuL2NoYW5nZWQnO1xuaW1wb3J0IGlzTG9hZGluZyBmcm9tICcuL2lzTG9hZGluZyc7XG5pbXBvcnQgbGF5b3V0IGZyb20gJy4vbGF5b3V0JztcbmltcG9ydCBwYXRocyBmcm9tICcuL3BhdGhzJztcbmltcG9ydCBjYWxsYmFja0pvYnMgZnJvbSAnLi9jYWxsYmFja0pvYnMnO1xuaW1wb3J0IGxvYWRpbmcgZnJvbSAnLi9sb2FkaW5nJztcbmltcG9ydCB7c3RyaW5naWZ5UGF0aH0gZnJvbSAnLi4vd3JhcHBlci93cmFwcGluZyc7XG5cbmV4cG9ydCBjb25zdCBhcGlSZXF1ZXN0cyA9IFtcbiAgICAnZGVwZW5kZW5jaWVzUmVxdWVzdCcsXG4gICAgJ2xheW91dFJlcXVlc3QnLFxuICAgICdyZWxvYWRSZXF1ZXN0JyxcbiAgICAnbG9naW5SZXF1ZXN0J1xuXTtcblxuY29uc3QgbGF5b3V0SGFzaGVzID0gKHN0YXRlID0ge30sIGFjdGlvbikgPT4ge1xuICAgIGlmIChcbiAgICAgICAgaW5jbHVkZXMoYWN0aW9uLnR5cGUsIFtcbiAgICAgICAgICAgICdVTkRPX1BST1BfQ0hBTkdFJyxcbiAgICAgICAgICAgICdSRURPX1BST1BfQ0hBTkdFJyxcbiAgICAgICAgICAgICdPTl9QUk9QX0NIQU5HRSdcbiAgICAgICAgXSlcbiAgICApIHtcbiAgICAgICAgLy8gTGV0IHVzIGNvbXBhcmUgdGhlIHBhdGhzIHN1bXMgdG8gZ2V0IHVwZGF0ZXMgd2l0aG91dCB0cmlnZ2VyaW5nXG4gICAgICAgIC8vIHJlbmRlciBvbiB0aGUgcGFyZW50IGNvbnRhaW5lcnMuXG4gICAgICAgIGNvbnN0IGFjdGlvblBhdGggPSBhY3Rpb24ucGF5bG9hZC5pdGVtcGF0aDtcbiAgICAgICAgY29uc3Qgc3RyUGF0aCA9IHN0cmluZ2lmeVBhdGgoYWN0aW9uUGF0aCk7XG4gICAgICAgIGNvbnN0IHByZXYgPSBwYXRoT3IoMCwgW3N0clBhdGgsICdoYXNoJ10sIHN0YXRlKTtcbiAgICAgICAgc3RhdGUgPSBhc3NvYyhcbiAgICAgICAgICAgIHN0clBhdGgsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaGFzaDogcHJldiArIDEsXG4gICAgICAgICAgICAgICAgY2hhbmdlZFByb3BzOiBhY3Rpb24ucGF5bG9hZC5wcm9wcyxcbiAgICAgICAgICAgICAgICByZW5kZXJUeXBlOiBhY3Rpb24ucGF5bG9hZC5yZW5kZXJUeXBlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnUkVTRVRfQ09NUE9ORU5UX1NUQVRFJykge1xuICAgICAgICBjb25zdCB7aXRlbXBhdGh9ID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgICAgIGlmIChpdGVtcGF0aCkge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4U3RyID0gc3RyaW5naWZ5UGF0aChpdGVtcGF0aCk7XG4gICAgICAgICAgICAvLyBSZW1vdmUgYWxsIGhhc2hlcyBmb3Iga2V5cyBzdGFydGluZyB3aXRoIHByZWZpeFN0clxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhzdGF0ZSkuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAoW2tleV0pID0+ICFrZXkuc3RhcnRzV2l0aChwcmVmaXhTdHIpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG5mdW5jdGlvbiBtYWluUmVkdWNlcigpIHtcbiAgICBjb25zdCBwYXJ0cyA9IHtcbiAgICAgICAgYXBwTGlmZWN5Y2xlLFxuICAgICAgICBjYWxsYmFja3MsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGdyYXBocyxcbiAgICAgICAgaGlzdG9yeSxcbiAgICAgICAgaG9va3MsXG4gICAgICAgIHByb2ZpbGUsXG4gICAgICAgIGNoYW5nZWQsXG4gICAgICAgIGlzTG9hZGluZyxcbiAgICAgICAgbGF5b3V0LFxuICAgICAgICBwYXRocyxcbiAgICAgICAgbGF5b3V0SGFzaGVzLFxuICAgICAgICBsb2FkaW5nXG4gICAgfTtcbiAgICBmb3JFYWNoKHIgPT4ge1xuICAgICAgICBwYXJ0c1tyXSA9IGNyZWF0ZUFwaVJlZHVjZXIocik7XG4gICAgfSwgYXBpUmVxdWVzdHMpO1xuXG4gICAgcGFydHMuY2FsbGJhY2tKb2JzID0gY2FsbGJhY2tKb2JzO1xuXG4gICAgcmV0dXJuIGNvbWJpbmVSZWR1Y2VycyhwYXJ0cyk7XG59XG5cbmZ1bmN0aW9uIGdldElucHV0SGlzdG9yeVN0YXRlKHBheWxvYWQsIHN0YXRlLCByZWNvcmRDaGFuZ2VzKSB7XG4gICAgY29uc3Qge2dyYXBocywgcGF0aHMsIGxheW91dH0gPSBzdGF0ZTtcbiAgICBjb25zdCB7aXRlbXBhdGgsIHByb3BzfSA9IHBheWxvYWQ7XG4gICAgY29uc3QgcmVmUHJvcHMgPSBwYXRoKGl0ZW1wYXRoLmNvbmNhdChbJ3Byb3BzJ10pLCBsYXlvdXQpIHx8IHt9O1xuICAgIGNvbnN0IHtpZH0gPSByZWZQcm9wcztcblxuICAgIGxldCBoaXN0b3J5RW50cnk7XG4gICAgaWYgKGlkKSB7XG4gICAgICAgIGlmIChyZWNvcmRDaGFuZ2VzKSB7XG4gICAgICAgICAgICBzdGF0ZS5jaGFuZ2VkID0ge2lkLCBwcm9wc307XG4gICAgICAgIH1cblxuICAgICAgICBoaXN0b3J5RW50cnkgPSB7aWQsIHByb3BzOiB7fX07XG4gICAgICAgIGtleXMocHJvcHMpLmZvckVhY2gocHJvcEtleSA9PiB7XG4gICAgICAgICAgICBpZiAoZ2V0Q2FsbGJhY2tzQnlJbnB1dChncmFwaHMsIHBhdGhzLCBpZCwgcHJvcEtleSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaGlzdG9yeUVudHJ5LnByb3BzW3Byb3BLZXldID0gcmVmUHJvcHNbcHJvcEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaGlzdG9yeUVudHJ5O1xufVxuXG5mdW5jdGlvbiByZWNvcmRIaXN0b3J5KHJlZHVjZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHtcbiAgICAgICAgLy8gUmVjb3JkIGluaXRpYWwgc3RhdGVcbiAgICAgICAgY29uc3Qge3R5cGUsIHBheWxvYWR9ID0gYWN0aW9uO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ09OX1BST1BfQ0hBTkdFJykge1xuICAgICAgICAgICAgLy8gaGlzdG9yeSByZWNvcmRzIGFsbCBwcm9wIGNoYW5nZXMgdGhhdCBhcmUgaW5wdXRzLlxuICAgICAgICAgICAgY29uc3QgaGlzdG9yeUVudHJ5ID0gZ2V0SW5wdXRIaXN0b3J5U3RhdGUocGF5bG9hZCwgc3RhdGUsIHRydWUpO1xuICAgICAgICAgICAgaWYgKGhpc3RvcnlFbnRyeSAmJiAhaXNFbXB0eShoaXN0b3J5RW50cnkucHJvcHMpKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuaGlzdG9yeS5wcmVzZW50ID0gaGlzdG9yeUVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV4dFN0YXRlID0gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gJ09OX1BST1BfQ0hBTkdFJyAmJiBwYXlsb2FkLnNvdXJjZSAhPT0gJ3Jlc3BvbnNlJykge1xuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIGlmIHRoZSBwcm9wIGNoYW5nZSBpcyBhbiBpbnB1dCwgdGhlblxuICAgICAgICAgICAgICogcmVjb3JkIGl0IHNvIHRoYXQgaXQgY2FuIGJlIHBsYXllZCBiYWNrXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGhpc3RvcnlFbnRyeSA9IGdldElucHV0SGlzdG9yeVN0YXRlKHBheWxvYWQsIG5leHRTdGF0ZSk7XG4gICAgICAgICAgICBpZiAoaGlzdG9yeUVudHJ5ICYmICFpc0VtcHR5KGhpc3RvcnlFbnRyeS5wcm9wcykpIHtcbiAgICAgICAgICAgICAgICBuZXh0U3RhdGUuaGlzdG9yeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcGFzdDogWy4uLm5leHRTdGF0ZS5oaXN0b3J5LnBhc3QsIHN0YXRlLmhpc3RvcnkucHJlc2VudF0sXG4gICAgICAgICAgICAgICAgICAgIHByZXNlbnQ6IGhpc3RvcnlFbnRyeSxcbiAgICAgICAgICAgICAgICAgICAgZnV0dXJlOiBbXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIHJlbG9hZGVyUmVkdWNlcihyZWR1Y2VyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHtoaXN0b3J5LCBjb25maWcsIGhvb2tzfSA9IHN0YXRlIHx8IHt9O1xuICAgICAgICBsZXQgbmV3U3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSAnUkVMT0FEJykge1xuICAgICAgICAgICAgbmV3U3RhdGUgPSB7aGlzdG9yeSwgY29uZmlnLCBob29rc307XG4gICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdTRVRfQ09ORklHJykge1xuICAgICAgICAgICAgLy8gbmV3IGNvbmZpZyBhbHNvIHJlbG9hZHMsIGFuZCBldmVuIGNsZWFycyBoaXN0b3J5LFxuICAgICAgICAgICAgLy8gaW4gY2FzZSB0aGVyZSdzIGEgbmV3IHVzZXIgb3IgZXZlbiBhIHRvdGFsbHkgZGlmZmVyZW50IGFwcCFcbiAgICAgICAgICAgIC8vIGhvb2tzIGFyZSBzZXQgYXQgYW4gZXZlbiBoaWdoZXIgbGV2ZWwgdGhhbiBjb25maWcgdGhvdWdoLlxuICAgICAgICAgICAgbmV3U3RhdGUgPSB7aG9va3N9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWR1Y2VyKG5ld1N0YXRlLCBhY3Rpb24pO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWR1Y2VyKCkge1xuICAgIHJldHVybiByZWxvYWRlclJlZHVjZXIocmVjb3JkSGlzdG9yeShtYWluUmVkdWNlcigpKSk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gICAgcmVzb2x2ZTogY29tcG9uZW50ID0+IHtcbiAgICAgICAgY29uc3Qge3R5cGUsIG5hbWVzcGFjZX0gPSBjb21wb25lbnQ7XG5cbiAgICAgICAgY29uc3QgbnMgPSB3aW5kb3dbbmFtZXNwYWNlXTtcblxuICAgICAgICBpZiAobnMpIHtcbiAgICAgICAgICAgIGlmIChuc1t0eXBlXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuc1t0eXBlXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb21wb25lbnQgJHt0eXBlfSBub3QgZm91bmQgaW4gJHtuYW1lc3BhY2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZXNwYWNlfSB3YXMgbm90IGZvdW5kLmApO1xuICAgIH1cbn07XG4iLCIvKipcbiAqIFJlZ0V4cCB0byBtYXRjaCBjb29raWUtbmFtZSBpbiBSRkMgNjI2NSBzZWMgNC4xLjFcbiAqIFRoaXMgcmVmZXJzIG91dCB0byB0aGUgb2Jzb2xldGVkIGRlZmluaXRpb24gb2YgdG9rZW4gaW4gUkZDIDI2MTYgc2VjIDIuMlxuICogd2hpY2ggaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIHRva2VuIGRlZmluaXRpb24gaW4gUkZDIDcyMzAgYXBwZW5kaXggQi5cbiAqXG4gKiBjb29raWUtbmFtZSAgICAgICA9IHRva2VuXG4gKiB0b2tlbiAgICAgICAgICAgICA9IDEqdGNoYXJcbiAqIHRjaGFyICAgICAgICAgICAgID0gXCIhXCIgLyBcIiNcIiAvIFwiJFwiIC8gXCIlXCIgLyBcIiZcIiAvIFwiJ1wiIC9cbiAqICAgICAgICAgICAgICAgICAgICAgXCIqXCIgLyBcIitcIiAvIFwiLVwiIC8gXCIuXCIgLyBcIl5cIiAvIFwiX1wiIC9cbiAqICAgICAgICAgICAgICAgICAgICAgXCJgXCIgLyBcInxcIiAvIFwiflwiIC8gRElHSVQgLyBBTFBIQVxuICpcbiAqIE5vdGU6IEFsbG93aW5nIG1vcmUgY2hhcmFjdGVycyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9qc2h0dHAvY29va2llL2lzc3Vlcy8xOTFcbiAqIEFsbG93IHNhbWUgcmFuZ2UgYXMgY29va2llIHZhbHVlLCBleGNlcHQgYD1gLCB3aGljaCBkZWxpbWl0cyBlbmQgb2YgbmFtZS5cbiAqL1xuY29uc3QgY29va2llTmFtZVJlZ0V4cCA9IC9eW1xcdTAwMjEtXFx1MDAzQVxcdTAwM0NcXHUwMDNFLVxcdTAwN0VdKyQvO1xuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCBjb29raWUtdmFsdWUgaW4gUkZDIDYyNjUgc2VjIDQuMS4xXG4gKlxuICogY29va2llLXZhbHVlICAgICAgPSAqY29va2llLW9jdGV0IC8gKCBEUVVPVEUgKmNvb2tpZS1vY3RldCBEUVVPVEUgKVxuICogY29va2llLW9jdGV0ICAgICAgPSAleDIxIC8gJXgyMy0yQiAvICV4MkQtM0EgLyAleDNDLTVCIC8gJXg1RC03RVxuICogICAgICAgICAgICAgICAgICAgICA7IFVTLUFTQ0lJIGNoYXJhY3RlcnMgZXhjbHVkaW5nIENUTHMsXG4gKiAgICAgICAgICAgICAgICAgICAgIDsgd2hpdGVzcGFjZSBEUVVPVEUsIGNvbW1hLCBzZW1pY29sb24sXG4gKiAgICAgICAgICAgICAgICAgICAgIDsgYW5kIGJhY2tzbGFzaFxuICpcbiAqIEFsbG93aW5nIG1vcmUgY2hhcmFjdGVyczogaHR0cHM6Ly9naXRodWIuY29tL2pzaHR0cC9jb29raWUvaXNzdWVzLzE5MVxuICogQ29tbWEsIGJhY2tzbGFzaCwgYW5kIERRVU9URSBhcmUgbm90IHBhcnQgb2YgdGhlIHBhcnNpbmcgYWxnb3JpdGhtLlxuICovXG5jb25zdCBjb29raWVWYWx1ZVJlZ0V4cCA9IC9eW1xcdTAwMjEtXFx1MDAzQVxcdTAwM0MtXFx1MDA3RV0qJC87XG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIGRvbWFpbi12YWx1ZSBpbiBSRkMgNjI2NSBzZWMgNC4xLjFcbiAqXG4gKiBkb21haW4tdmFsdWUgICAgICA9IDxzdWJkb21haW4+XG4gKiAgICAgICAgICAgICAgICAgICAgIDsgZGVmaW5lZCBpbiBbUkZDMTAzNF0sIFNlY3Rpb24gMy41LCBhc1xuICogICAgICAgICAgICAgICAgICAgICA7IGVuaGFuY2VkIGJ5IFtSRkMxMTIzXSwgU2VjdGlvbiAyLjFcbiAqIDxzdWJkb21haW4+ICAgICAgID0gPGxhYmVsPiB8IDxzdWJkb21haW4+IFwiLlwiIDxsYWJlbD5cbiAqIDxsYWJlbD4gICAgICAgICAgID0gPGxldC1kaWc+IFsgWyA8bGRoLXN0cj4gXSA8bGV0LWRpZz4gXVxuICogICAgICAgICAgICAgICAgICAgICBMYWJlbHMgbXVzdCBiZSA2MyBjaGFyYWN0ZXJzIG9yIGxlc3MuXG4gKiAgICAgICAgICAgICAgICAgICAgICdsZXQtZGlnJyBub3QgJ2xldHRlcicgaW4gdGhlIGZpcnN0IGNoYXIsIHBlciBSRkMxMTIzXG4gKiA8bGRoLXN0cj4gICAgICAgICA9IDxsZXQtZGlnLWh5cD4gfCA8bGV0LWRpZy1oeXA+IDxsZGgtc3RyPlxuICogPGxldC1kaWctaHlwPiAgICAgPSA8bGV0LWRpZz4gfCBcIi1cIlxuICogPGxldC1kaWc+ICAgICAgICAgPSA8bGV0dGVyPiB8IDxkaWdpdD5cbiAqIDxsZXR0ZXI+ICAgICAgICAgID0gYW55IG9uZSBvZiB0aGUgNTIgYWxwaGFiZXRpYyBjaGFyYWN0ZXJzIEEgdGhyb3VnaCBaIGluXG4gKiAgICAgICAgICAgICAgICAgICAgIHVwcGVyIGNhc2UgYW5kIGEgdGhyb3VnaCB6IGluIGxvd2VyIGNhc2VcbiAqIDxkaWdpdD4gICAgICAgICAgID0gYW55IG9uZSBvZiB0aGUgdGVuIGRpZ2l0cyAwIHRocm91Z2ggOVxuICpcbiAqIEtlZXAgc3VwcG9ydCBmb3IgbGVhZGluZyBkb3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS9qc2h0dHAvY29va2llL2lzc3Vlcy8xNzNcbiAqXG4gKiA+IChOb3RlIHRoYXQgYSBsZWFkaW5nICV4MkUgKFwiLlwiKSwgaWYgcHJlc2VudCwgaXMgaWdub3JlZCBldmVuIHRob3VnaCB0aGF0XG4gKiBjaGFyYWN0ZXIgaXMgbm90IHBlcm1pdHRlZCwgYnV0IGEgdHJhaWxpbmcgJXgyRSAoXCIuXCIpLCBpZiBwcmVzZW50LCB3aWxsXG4gKiBjYXVzZSB0aGUgdXNlciBhZ2VudCB0byBpZ25vcmUgdGhlIGF0dHJpYnV0ZS4pXG4gKi9cbmNvbnN0IGRvbWFpblZhbHVlUmVnRXhwID1cbiAgL14oWy5dP1thLXowLTldKFthLXowLTktXXswLDYxfVthLXowLTldKT8pKFsuXVthLXowLTldKFthLXowLTktXXswLDYxfVthLXowLTldKT8pKiQvaTtcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggcGF0aC12YWx1ZSBpbiBSRkMgNjI2NSBzZWMgNC4xLjFcbiAqXG4gKiBwYXRoLXZhbHVlICAgICAgICA9IDxhbnkgQ0hBUiBleGNlcHQgQ1RMcyBvciBcIjtcIj5cbiAqIENIQVIgICAgICAgICAgICAgID0gJXgwMS03RlxuICogICAgICAgICAgICAgICAgICAgICA7IGRlZmluZWQgaW4gUkZDIDUyMzQgYXBwZW5kaXggQi4xXG4gKi9cbmNvbnN0IHBhdGhWYWx1ZVJlZ0V4cCA9IC9eW1xcdTAwMjAtXFx1MDAzQVxcdTAwM0QtXFx1MDA3RV0qJC87XG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIG1heC1hZ2UtdmFsdWUgaW4gUkZDIDYyNjUgc2VjIDUuNi4yXG4gKi9cbmNvbnN0IG1heEFnZVJlZ0V4cCA9IC9eLT9cXGQrJC87XG5cbmNvbnN0IF9fdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5jb25zdCBOdWxsT2JqZWN0ID0gLyogQF9fUFVSRV9fICovICgoKSA9PiB7XG4gIGNvbnN0IEMgPSBmdW5jdGlvbiAoKSB7fTtcbiAgQy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gQztcbn0pKCkgYXMgdW5rbm93biBhcyB7IG5ldyAoKTogYW55IH07XG5cbi8qKlxuICogUGFyc2Ugb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZU9wdGlvbnMge1xuICAvKipcbiAgICogU3BlY2lmaWVzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGVjb2RlIGEgW2Nvb2tpZS12YWx1ZV0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNC4xLjEpLlxuICAgKiBTaW5jZSB0aGUgdmFsdWUgb2YgYSBjb29raWUgaGFzIGEgbGltaXRlZCBjaGFyYWN0ZXIgc2V0IChhbmQgbXVzdCBiZSBhIHNpbXBsZSBzdHJpbmcpLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGRlY29kZVxuICAgKiBhIHByZXZpb3VzbHktZW5jb2RlZCBjb29raWUgdmFsdWUgaW50byBhIEphdmFTY3JpcHQgc3RyaW5nLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBmdW5jdGlvbiBpcyB0aGUgZ2xvYmFsIGBkZWNvZGVVUklDb21wb25lbnRgLCB3cmFwcGVkIGluIGEgYHRyeS4uY2F0Y2hgLiBJZiBhbiBlcnJvclxuICAgKiBpcyB0aHJvd24gaXQgd2lsbCByZXR1cm4gdGhlIGNvb2tpZSdzIG9yaWdpbmFsIHZhbHVlLiBJZiB5b3UgcHJvdmlkZSB5b3VyIG93biBlbmNvZGUvZGVjb2RlXG4gICAqIHNjaGVtZSB5b3UgbXVzdCBlbnN1cmUgZXJyb3JzIGFyZSBhcHByb3ByaWF0ZWx5IGhhbmRsZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGRlY29kZVxuICAgKi9cbiAgZGVjb2RlPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29va2llcyBvYmplY3QuXG4gKi9cbmV4cG9ydCB0eXBlIENvb2tpZXMgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+O1xuXG4vKipcbiAqIFBhcnNlIGEgYENvb2tpZWAgaGVhZGVyLlxuICpcbiAqIFBhcnNlIHRoZSBnaXZlbiBjb29raWUgaGVhZGVyIHN0cmluZyBpbnRvIGFuIG9iamVjdFxuICogVGhlIG9iamVjdCBoYXMgdGhlIHZhcmlvdXMgY29va2llcyBhcyBrZXlzKG5hbWVzKSA9PiB2YWx1ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ29va2llKHN0cjogc3RyaW5nLCBvcHRpb25zPzogUGFyc2VPcHRpb25zKTogQ29va2llcyB7XG4gIGNvbnN0IG9iajogQ29va2llcyA9IG5ldyBOdWxsT2JqZWN0KCk7XG4gIGNvbnN0IGxlbiA9IHN0ci5sZW5ndGg7XG4gIC8vIFJGQyA2MjY1IHNlYyA0LjEuMSwgUkZDIDI2MTYgMi4yIGRlZmluZXMgYSBjb29raWUgbmFtZSBjb25zaXN0cyBvZiBvbmUgY2hhciBtaW5pbXVtLCBwbHVzICc9Jy5cbiAgaWYgKGxlbiA8IDIpIHJldHVybiBvYmo7XG5cbiAgY29uc3QgZGVjID0gb3B0aW9ucz8uZGVjb2RlIHx8IGRlY29kZTtcbiAgbGV0IGluZGV4ID0gMDtcblxuICBkbyB7XG4gICAgY29uc3QgZXFJZHggPSBlcUluZGV4KHN0ciwgaW5kZXgsIGxlbik7XG4gICAgaWYgKGVxSWR4ID09PSAtMSkgYnJlYWs7IC8vIE5vIG1vcmUgY29va2llIHBhaXJzLlxuXG4gICAgY29uc3QgZW5kSWR4ID0gZW5kSW5kZXgoc3RyLCBpbmRleCwgbGVuKTtcblxuICAgIGlmIChlcUlkeCA+IGVuZElkeCkge1xuICAgICAgLy8gYmFja3RyYWNrIG9uIHByaW9yIHNlbWljb2xvblxuICAgICAgaW5kZXggPSBzdHIubGFzdEluZGV4T2YoXCI7XCIsIGVxSWR4IC0gMSkgKyAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gdmFsdWVTbGljZShzdHIsIGluZGV4LCBlcUlkeCk7XG5cbiAgICAvLyBvbmx5IGFzc2lnbiBvbmNlXG4gICAgaWYgKG9ialtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG9ialtrZXldID0gZGVjKHZhbHVlU2xpY2Uoc3RyLCBlcUlkeCArIDEsIGVuZElkeCkpO1xuICAgIH1cblxuICAgIGluZGV4ID0gZW5kSWR4ICsgMTtcbiAgfSB3aGlsZSAoaW5kZXggPCBsZW4pO1xuXG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyaW5naWZ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBlbmNvZGUgYSBbY29va2llLXZhbHVlXShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzYyNjUjc2VjdGlvbi00LjEuMSkuXG4gICAqIFNpbmNlIHZhbHVlIG9mIGEgY29va2llIGhhcyBhIGxpbWl0ZWQgY2hhcmFjdGVyIHNldCAoYW5kIG11c3QgYmUgYSBzaW1wbGUgc3RyaW5nKSwgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBlbmNvZGVcbiAgICogYSB2YWx1ZSBpbnRvIGEgc3RyaW5nIHN1aXRlZCBmb3IgYSBjb29raWUncyB2YWx1ZSwgYW5kIHNob3VsZCBtaXJyb3IgYGRlY29kZWAgd2hlbiBwYXJzaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBlbmNvZGVVUklDb21wb25lbnRcbiAgICovXG4gIGVuY29kZT86IChzdHI6IHN0cmluZykgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFN0cmluZ2lmaWVzIGFuIG9iamVjdCBpbnRvIGFuIEhUVFAgYENvb2tpZWAgaGVhZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5Q29va2llKFxuICBjb29raWU6IENvb2tpZXMsXG4gIG9wdGlvbnM/OiBTdHJpbmdpZnlPcHRpb25zLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZW5jID0gb3B0aW9ucz8uZW5jb2RlIHx8IGVuY29kZVVSSUNvbXBvbmVudDtcbiAgY29uc3QgY29va2llU3RyaW5nczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoY29va2llKSkge1xuICAgIGNvbnN0IHZhbCA9IGNvb2tpZVtuYW1lXTtcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgaWYgKCFjb29raWVOYW1lUmVnRXhwLnRlc3QobmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGNvb2tpZSBuYW1lIGlzIGludmFsaWQ6ICR7bmFtZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IGVuYyh2YWwpO1xuXG4gICAgaWYgKCFjb29raWVWYWx1ZVJlZ0V4cC50ZXN0KHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgY29va2llIHZhbCBpcyBpbnZhbGlkOiAke3ZhbH1gKTtcbiAgICB9XG5cbiAgICBjb29raWVTdHJpbmdzLnB1c2goYCR7bmFtZX09JHt2YWx1ZX1gKTtcbiAgfVxuXG4gIHJldHVybiBjb29raWVTdHJpbmdzLmpvaW4oXCI7IFwiKTtcbn1cblxuLyoqXG4gKiBTZXQtQ29va2llIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXRDb29raWUge1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBjb29raWUuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHN0cmluZyB0byBiZSB0aGUgdmFsdWUgZm9yIHRoZSBjb29raWUuXG4gICAqL1xuICB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBgbnVtYmVyYCAoaW4gc2Vjb25kcykgdG8gYmUgdGhlIHZhbHVlIGZvciB0aGUgW2BNYXgtQWdlYCBgU2V0LUNvb2tpZWAgYXR0cmlidXRlXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTUuMi4yKS5cbiAgICpcbiAgICogVGhlIFtjb29raWUgc3RvcmFnZSBtb2RlbCBzcGVjaWZpY2F0aW9uXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTUuMykgc3RhdGVzIHRoYXQgaWYgYm90aCBgZXhwaXJlc2AgYW5kXG4gICAqIGBtYXhBZ2VgIGFyZSBzZXQsIHRoZW4gYG1heEFnZWAgdGFrZXMgcHJlY2VkZW5jZSwgYnV0IGl0IGlzIHBvc3NpYmxlIG5vdCBhbGwgY2xpZW50cyBieSBvYmV5IHRoaXMsXG4gICAqIHNvIGlmIGJvdGggYXJlIHNldCwgdGhleSBzaG91bGQgcG9pbnQgdG8gdGhlIHNhbWUgZGF0ZSBhbmQgdGltZS5cbiAgICovXG4gIG1heEFnZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgYERhdGVgIG9iamVjdCB0byBiZSB0aGUgdmFsdWUgZm9yIHRoZSBbYEV4cGlyZXNgIGBTZXQtQ29va2llYCBhdHRyaWJ1dGVdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNS4yLjEpLlxuICAgKiBXaGVuIG5vIGV4cGlyYXRpb24gaXMgc2V0LCBjbGllbnRzIGNvbnNpZGVyIHRoaXMgYSBcIm5vbi1wZXJzaXN0ZW50IGNvb2tpZVwiIGFuZCBkZWxldGUgaXQgd2hlbiB0aGUgY3VycmVudCBzZXNzaW9uIGlzIG92ZXIuXG4gICAqXG4gICAqIFRoZSBbY29va2llIHN0b3JhZ2UgbW9kZWwgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyNjUjc2VjdGlvbi01LjMpIHN0YXRlcyB0aGF0IGlmIGJvdGggYGV4cGlyZXNgIGFuZFxuICAgKiBgbWF4QWdlYCBhcmUgc2V0LCB0aGVuIGBtYXhBZ2VgIHRha2VzIHByZWNlZGVuY2UsIGJ1dCBpdCBpcyBwb3NzaWJsZSBub3QgYWxsIGNsaWVudHMgYnkgb2JleSB0aGlzLFxuICAgKiBzbyBpZiBib3RoIGFyZSBzZXQsIHRoZXkgc2hvdWxkIHBvaW50IHRvIHRoZSBzYW1lIGRhdGUgYW5kIHRpbWUuXG4gICAqL1xuICBleHBpcmVzPzogRGF0ZTtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgdmFsdWUgZm9yIHRoZSBbYERvbWFpbmAgYFNldC1Db29raWVgIGF0dHJpYnV0ZV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyNjUjc2VjdGlvbi01LjIuMykuXG4gICAqIFdoZW4gbm8gZG9tYWluIGlzIHNldCwgY2xpZW50cyBjb25zaWRlciB0aGUgY29va2llIHRvIGFwcGx5IHRvIHRoZSBjdXJyZW50IGRvbWFpbiBvbmx5LlxuICAgKi9cbiAgZG9tYWluPzogc3RyaW5nO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSB2YWx1ZSBmb3IgdGhlIFtgUGF0aGAgYFNldC1Db29raWVgIGF0dHJpYnV0ZV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyNjUjc2VjdGlvbi01LjIuNCkuXG4gICAqIFdoZW4gbm8gcGF0aCBpcyBzZXQsIHRoZSBwYXRoIGlzIGNvbnNpZGVyZWQgdGhlIFtcImRlZmF1bHQgcGF0aFwiXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTUuMS40KS5cbiAgICovXG4gIHBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFbmFibGVzIHRoZSBbYEh0dHBPbmx5YCBgU2V0LUNvb2tpZWAgYXR0cmlidXRlXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTUuMi42KS5cbiAgICogV2hlbiBlbmFibGVkLCBjbGllbnRzIHdpbGwgbm90IGFsbG93IGNsaWVudC1zaWRlIEphdmFTY3JpcHQgdG8gc2VlIHRoZSBjb29raWUgaW4gYGRvY3VtZW50LmNvb2tpZWAuXG4gICAqL1xuICBodHRwT25seT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFbmFibGVzIHRoZSBbYFNlY3VyZWAgYFNldC1Db29raWVgIGF0dHJpYnV0ZV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYyNjUjc2VjdGlvbi01LjIuNSkuXG4gICAqIFdoZW4gZW5hYmxlZCwgY2xpZW50cyB3aWxsIG9ubHkgc2VuZCB0aGUgY29va2llIGJhY2sgaWYgdGhlIGJyb3dzZXIgaGFzIGFuIEhUVFBTIGNvbm5lY3Rpb24uXG4gICAqL1xuICBzZWN1cmU/OiBib29sZWFuO1xuICAvKipcbiAgICogRW5hYmxlcyB0aGUgW2BQYXJ0aXRpb25lZGAgYFNldC1Db29raWVgIGF0dHJpYnV0ZV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWN1dGxlci1odHRwYmlzLXBhcnRpdGlvbmVkLWNvb2tpZXMvKS5cbiAgICogV2hlbiBlbmFibGVkLCBjbGllbnRzIHdpbGwgb25seSBzZW5kIHRoZSBjb29raWUgYmFjayB3aGVuIHRoZSBjdXJyZW50IGRvbWFpbiBfYW5kXyB0b3AtbGV2ZWwgZG9tYWluIG1hdGNoZXMuXG4gICAqXG4gICAqIFRoaXMgaXMgYW4gYXR0cmlidXRlIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBmdWxseSBzdGFuZGFyZGl6ZWQsIGFuZCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG4gICAqIFRoaXMgYWxzbyBtZWFucyBjbGllbnRzIG1heSBpZ25vcmUgdGhpcyBhdHRyaWJ1dGUgdW50aWwgdGhleSB1bmRlcnN0YW5kIGl0LiBNb3JlIGluZm9ybWF0aW9uXG4gICAqIGFib3V0IGNhbiBiZSBmb3VuZCBpbiBbdGhlIHByb3Bvc2FsXShodHRwczovL2dpdGh1Yi5jb20vcHJpdmFjeWNnL0NISVBTKS5cbiAgICovXG4gIHBhcnRpdGlvbmVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgdmFsdWUgZm9yIHRoZSBbYFByaW9yaXR5YCBgU2V0LUNvb2tpZWAgYXR0cmlidXRlXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtd2VzdC1jb29raWUtcHJpb3JpdHktMDAjc2VjdGlvbi00LjEpLlxuICAgKlxuICAgKiAtIGAnbG93J2Agd2lsbCBzZXQgdGhlIGBQcmlvcml0eWAgYXR0cmlidXRlIHRvIGBMb3dgLlxuICAgKiAtIGAnbWVkaXVtJ2Agd2lsbCBzZXQgdGhlIGBQcmlvcml0eWAgYXR0cmlidXRlIHRvIGBNZWRpdW1gLCB0aGUgZGVmYXVsdCBwcmlvcml0eSB3aGVuIG5vdCBzZXQuXG4gICAqIC0gYCdoaWdoJ2Agd2lsbCBzZXQgdGhlIGBQcmlvcml0eWAgYXR0cmlidXRlIHRvIGBIaWdoYC5cbiAgICpcbiAgICogTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBwcmlvcml0eSBsZXZlbHMgY2FuIGJlIGZvdW5kIGluIFt0aGUgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LXdlc3QtY29va2llLXByaW9yaXR5LTAwI3NlY3Rpb24tNC4xKS5cbiAgICovXG4gIHByaW9yaXR5PzogXCJsb3dcIiB8IFwibWVkaXVtXCIgfCBcImhpZ2hcIjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgdmFsdWUgZm9yIHRoZSBbYFNhbWVTaXRlYCBgU2V0LUNvb2tpZWAgYXR0cmlidXRlXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMtMDkjc2VjdGlvbi01LjQuNykuXG4gICAqXG4gICAqIC0gYHRydWVgIHdpbGwgc2V0IHRoZSBgU2FtZVNpdGVgIGF0dHJpYnV0ZSB0byBgU3RyaWN0YCBmb3Igc3RyaWN0IHNhbWUgc2l0ZSBlbmZvcmNlbWVudC5cbiAgICogLSBgJ2xheCdgIHdpbGwgc2V0IHRoZSBgU2FtZVNpdGVgIGF0dHJpYnV0ZSB0byBgTGF4YCBmb3IgbGF4IHNhbWUgc2l0ZSBlbmZvcmNlbWVudC5cbiAgICogLSBgJ25vbmUnYCB3aWxsIHNldCB0aGUgYFNhbWVTaXRlYCBhdHRyaWJ1dGUgdG8gYE5vbmVgIGZvciBhbiBleHBsaWNpdCBjcm9zcy1zaXRlIGNvb2tpZS5cbiAgICogLSBgJ3N0cmljdCdgIHdpbGwgc2V0IHRoZSBgU2FtZVNpdGVgIGF0dHJpYnV0ZSB0byBgU3RyaWN0YCBmb3Igc3RyaWN0IHNhbWUgc2l0ZSBlbmZvcmNlbWVudC5cbiAgICpcbiAgICogTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBlbmZvcmNlbWVudCBsZXZlbHMgY2FuIGJlIGZvdW5kIGluIFt0aGUgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzLTA5I3NlY3Rpb24tNS40LjcpLlxuICAgKi9cbiAgc2FtZVNpdGU/OiBib29sZWFuIHwgXCJsYXhcIiB8IFwic3RyaWN0XCIgfCBcIm5vbmVcIjtcbn1cblxuLyoqXG4gKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHNlcmlhbGl6ZSBvcHRpb25zLlxuICovXG5leHBvcnQgdHlwZSBTZXJpYWxpemVPcHRpb25zID0gU3RyaW5naWZ5T3B0aW9ucyAmXG4gIE9taXQ8U2V0Q29va2llLCBcIm5hbWVcIiB8IFwidmFsdWVcIj47XG5cbi8qKlxuICogU2VyaWFsaXplIGRhdGEgaW50byBhIGNvb2tpZSBoZWFkZXIuXG4gKlxuICogU2VyaWFsaXplIGEgbmFtZSB2YWx1ZSBwYWlyIGludG8gYSBjb29raWUgc3RyaW5nIHN1aXRhYmxlIGZvclxuICogaHR0cCBoZWFkZXJzLiBBbiBvcHRpb25hbCBvcHRpb25zIG9iamVjdCBzcGVjaWZpZXMgY29va2llIHBhcmFtZXRlcnMuXG4gKlxuICogc2VyaWFsaXplKCdmb28nLCAnYmFyJywgeyBodHRwT25seTogdHJ1ZSB9KVxuICogICA9PiBcImZvbz1iYXI7IGh0dHBPbmx5XCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeVNldENvb2tpZShcbiAgY29va2llOiBTZXRDb29raWUsXG4gIG9wdGlvbnM/OiBTdHJpbmdpZnlPcHRpb25zLFxuKTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeVNldENvb2tpZShcbiAgbmFtZTogc3RyaW5nLFxuICB2YWw6IHN0cmluZyxcbiAgb3B0aW9ucz86IFNlcmlhbGl6ZU9wdGlvbnMsXG4pOiBzdHJpbmc7XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5U2V0Q29va2llKFxuICBfbmFtZTogc3RyaW5nIHwgU2V0Q29va2llLFxuICBfdmFsPzogc3RyaW5nIHwgU3RyaW5naWZ5T3B0aW9ucyxcbiAgX29wdHM/OiBTZXJpYWxpemVPcHRpb25zLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgY29va2llID1cbiAgICB0eXBlb2YgX25hbWUgPT09IFwib2JqZWN0XCJcbiAgICAgID8gX25hbWVcbiAgICAgIDogeyAuLi5fb3B0cywgbmFtZTogX25hbWUsIHZhbHVlOiBTdHJpbmcoX3ZhbCkgfTtcbiAgY29uc3Qgb3B0aW9ucyA9IHR5cGVvZiBfdmFsID09PSBcIm9iamVjdFwiID8gX3ZhbCA6IF9vcHRzO1xuICBjb25zdCBlbmMgPSBvcHRpb25zPy5lbmNvZGUgfHwgZW5jb2RlVVJJQ29tcG9uZW50O1xuXG4gIGlmICghY29va2llTmFtZVJlZ0V4cC50ZXN0KGNvb2tpZS5uYW1lKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGFyZ3VtZW50IG5hbWUgaXMgaW52YWxpZDogJHtjb29raWUubmFtZX1gKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0gY29va2llLnZhbHVlID8gZW5jKGNvb2tpZS52YWx1ZSkgOiBcIlwiO1xuXG4gIGlmICghY29va2llVmFsdWVSZWdFeHAudGVzdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBhcmd1bWVudCB2YWwgaXMgaW52YWxpZDogJHtjb29raWUudmFsdWV9YCk7XG4gIH1cblxuICBsZXQgc3RyID0gY29va2llLm5hbWUgKyBcIj1cIiArIHZhbHVlO1xuXG4gIGlmIChjb29raWUubWF4QWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoY29va2llLm1heEFnZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYG9wdGlvbiBtYXhBZ2UgaXMgaW52YWxpZDogJHtjb29raWUubWF4QWdlfWApO1xuICAgIH1cblxuICAgIHN0ciArPSBcIjsgTWF4LUFnZT1cIiArIGNvb2tpZS5tYXhBZ2U7XG4gIH1cblxuICBpZiAoY29va2llLmRvbWFpbikge1xuICAgIGlmICghZG9tYWluVmFsdWVSZWdFeHAudGVzdChjb29raWUuZG9tYWluKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgb3B0aW9uIGRvbWFpbiBpcyBpbnZhbGlkOiAke2Nvb2tpZS5kb21haW59YCk7XG4gICAgfVxuXG4gICAgc3RyICs9IFwiOyBEb21haW49XCIgKyBjb29raWUuZG9tYWluO1xuICB9XG5cbiAgaWYgKGNvb2tpZS5wYXRoKSB7XG4gICAgaWYgKCFwYXRoVmFsdWVSZWdFeHAudGVzdChjb29raWUucGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYG9wdGlvbiBwYXRoIGlzIGludmFsaWQ6ICR7Y29va2llLnBhdGh9YCk7XG4gICAgfVxuXG4gICAgc3RyICs9IFwiOyBQYXRoPVwiICsgY29va2llLnBhdGg7XG4gIH1cblxuICBpZiAoY29va2llLmV4cGlyZXMpIHtcbiAgICBpZiAoIWlzRGF0ZShjb29raWUuZXhwaXJlcykgfHwgIU51bWJlci5pc0Zpbml0ZShjb29raWUuZXhwaXJlcy52YWx1ZU9mKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBvcHRpb24gZXhwaXJlcyBpcyBpbnZhbGlkOiAke2Nvb2tpZS5leHBpcmVzfWApO1xuICAgIH1cblxuICAgIHN0ciArPSBcIjsgRXhwaXJlcz1cIiArIGNvb2tpZS5leHBpcmVzLnRvVVRDU3RyaW5nKCk7XG4gIH1cblxuICBpZiAoY29va2llLmh0dHBPbmx5KSB7XG4gICAgc3RyICs9IFwiOyBIdHRwT25seVwiO1xuICB9XG5cbiAgaWYgKGNvb2tpZS5zZWN1cmUpIHtcbiAgICBzdHIgKz0gXCI7IFNlY3VyZVwiO1xuICB9XG5cbiAgaWYgKGNvb2tpZS5wYXJ0aXRpb25lZCkge1xuICAgIHN0ciArPSBcIjsgUGFydGl0aW9uZWRcIjtcbiAgfVxuXG4gIGlmIChjb29raWUucHJpb3JpdHkpIHtcbiAgICBjb25zdCBwcmlvcml0eSA9XG4gICAgICB0eXBlb2YgY29va2llLnByaW9yaXR5ID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gY29va2llLnByaW9yaXR5LnRvTG93ZXJDYXNlKClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgc3dpdGNoIChwcmlvcml0eSkge1xuICAgICAgY2FzZSBcImxvd1wiOlxuICAgICAgICBzdHIgKz0gXCI7IFByaW9yaXR5PUxvd1wiO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJtZWRpdW1cIjpcbiAgICAgICAgc3RyICs9IFwiOyBQcmlvcml0eT1NZWRpdW1cIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiaGlnaFwiOlxuICAgICAgICBzdHIgKz0gXCI7IFByaW9yaXR5PUhpZ2hcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBvcHRpb24gcHJpb3JpdHkgaXMgaW52YWxpZDogJHtjb29raWUucHJpb3JpdHl9YCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvb2tpZS5zYW1lU2l0ZSkge1xuICAgIGNvbnN0IHNhbWVTaXRlID1cbiAgICAgIHR5cGVvZiBjb29raWUuc2FtZVNpdGUgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBjb29raWUuc2FtZVNpdGUudG9Mb3dlckNhc2UoKVxuICAgICAgICA6IGNvb2tpZS5zYW1lU2l0ZTtcbiAgICBzd2l0Y2ggKHNhbWVTaXRlKSB7XG4gICAgICBjYXNlIHRydWU6XG4gICAgICBjYXNlIFwic3RyaWN0XCI6XG4gICAgICAgIHN0ciArPSBcIjsgU2FtZVNpdGU9U3RyaWN0XCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImxheFwiOlxuICAgICAgICBzdHIgKz0gXCI7IFNhbWVTaXRlPUxheFwiO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJub25lXCI6XG4gICAgICAgIHN0ciArPSBcIjsgU2FtZVNpdGU9Tm9uZVwiO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYG9wdGlvbiBzYW1lU2l0ZSBpcyBpbnZhbGlkOiAke2Nvb2tpZS5zYW1lU2l0ZX1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RyO1xufVxuXG4vKipcbiAqIERlc2VyaWFsaXplIGEgYFNldC1Db29raWVgIGhlYWRlciBpbnRvIGFuIG9iamVjdC5cbiAqXG4gKiBkZXNlcmlhbGl6ZSgnZm9vPWJhcjsgaHR0cE9ubHknKVxuICogICA9PiB7IG5hbWU6ICdmb28nLCB2YWx1ZTogJ2JhcicsIGh0dHBPbmx5OiB0cnVlIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2V0Q29va2llKHN0cjogc3RyaW5nLCBvcHRpb25zPzogUGFyc2VPcHRpb25zKTogU2V0Q29va2llIHtcbiAgY29uc3QgZGVjID0gb3B0aW9ucz8uZGVjb2RlIHx8IGRlY29kZTtcbiAgY29uc3QgbGVuID0gc3RyLmxlbmd0aDtcbiAgY29uc3QgZW5kSWR4ID0gZW5kSW5kZXgoc3RyLCAwLCBsZW4pO1xuICBjb25zdCBlcUlkeCA9IGVxSW5kZXgoc3RyLCAwLCBlbmRJZHgpO1xuICBjb25zdCBzZXRDb29raWU6IFNldENvb2tpZSA9XG4gICAgZXFJZHggPT09IC0xXG4gICAgICA/IHsgbmFtZTogXCJcIiwgdmFsdWU6IGRlYyh2YWx1ZVNsaWNlKHN0ciwgMCwgZW5kSWR4KSkgfVxuICAgICAgOiB7XG4gICAgICAgICAgbmFtZTogdmFsdWVTbGljZShzdHIsIDAsIGVxSWR4KSxcbiAgICAgICAgICB2YWx1ZTogZGVjKHZhbHVlU2xpY2Uoc3RyLCBlcUlkeCArIDEsIGVuZElkeCkpLFxuICAgICAgICB9O1xuXG4gIGxldCBpbmRleCA9IGVuZElkeCArIDE7XG4gIHdoaWxlIChpbmRleCA8IGxlbikge1xuICAgIGNvbnN0IGVuZElkeCA9IGVuZEluZGV4KHN0ciwgaW5kZXgsIGxlbik7XG4gICAgY29uc3QgZXFJZHggPSBlcUluZGV4KHN0ciwgaW5kZXgsIGVuZElkeCk7XG4gICAgY29uc3QgYXR0ciA9XG4gICAgICBlcUlkeCA9PT0gLTFcbiAgICAgICAgPyB2YWx1ZVNsaWNlKHN0ciwgaW5kZXgsIGVuZElkeClcbiAgICAgICAgOiB2YWx1ZVNsaWNlKHN0ciwgaW5kZXgsIGVxSWR4KTtcbiAgICBjb25zdCB2YWwgPSBlcUlkeCA9PT0gLTEgPyB1bmRlZmluZWQgOiB2YWx1ZVNsaWNlKHN0ciwgZXFJZHggKyAxLCBlbmRJZHgpO1xuXG4gICAgc3dpdGNoIChhdHRyLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgXCJodHRwb25seVwiOlxuICAgICAgICBzZXRDb29raWUuaHR0cE9ubHkgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJzZWN1cmVcIjpcbiAgICAgICAgc2V0Q29va2llLnNlY3VyZSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInBhcnRpdGlvbmVkXCI6XG4gICAgICAgIHNldENvb2tpZS5wYXJ0aXRpb25lZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImRvbWFpblwiOlxuICAgICAgICBzZXRDb29raWUuZG9tYWluID0gdmFsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJwYXRoXCI6XG4gICAgICAgIHNldENvb2tpZS5wYXRoID0gdmFsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJtYXgtYWdlXCI6XG4gICAgICAgIGlmICh2YWwgJiYgbWF4QWdlUmVnRXhwLnRlc3QodmFsKSkgc2V0Q29va2llLm1heEFnZSA9IE51bWJlcih2YWwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJleHBpcmVzXCI6XG4gICAgICAgIGlmICghdmFsKSBicmVhaztcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbCk7XG4gICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoZGF0ZS52YWx1ZU9mKCkpKSBzZXRDb29raWUuZXhwaXJlcyA9IGRhdGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInByaW9yaXR5XCI6XG4gICAgICAgIGlmICghdmFsKSBicmVhaztcbiAgICAgICAgY29uc3QgcHJpb3JpdHkgPSB2YWwudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByaW9yaXR5ID09PSBcImxvd1wiIHx8XG4gICAgICAgICAgcHJpb3JpdHkgPT09IFwibWVkaXVtXCIgfHxcbiAgICAgICAgICBwcmlvcml0eSA9PT0gXCJoaWdoXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2V0Q29va2llLnByaW9yaXR5ID0gcHJpb3JpdHk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwic2FtZXNpdGVcIjpcbiAgICAgICAgaWYgKCF2YWwpIGJyZWFrO1xuICAgICAgICBjb25zdCBzYW1lU2l0ZSA9IHZhbC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc2FtZVNpdGUgPT09IFwibGF4XCIgfHxcbiAgICAgICAgICBzYW1lU2l0ZSA9PT0gXCJzdHJpY3RcIiB8fFxuICAgICAgICAgIHNhbWVTaXRlID09PSBcIm5vbmVcIlxuICAgICAgICApIHtcbiAgICAgICAgICBzZXRDb29raWUuc2FtZVNpdGUgPSBzYW1lU2l0ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpbmRleCA9IGVuZElkeCArIDE7XG4gIH1cblxuICByZXR1cm4gc2V0Q29va2llO1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIGA7YCBjaGFyYWN0ZXIgYmV0d2VlbiBgbWluYCBhbmQgYGxlbmAgaW4gc3RyLlxuICovXG5mdW5jdGlvbiBlbmRJbmRleChzdHI6IHN0cmluZywgbWluOiBudW1iZXIsIGxlbjogbnVtYmVyKSB7XG4gIGNvbnN0IGluZGV4ID0gc3RyLmluZGV4T2YoXCI7XCIsIG1pbik7XG4gIHJldHVybiBpbmRleCA9PT0gLTEgPyBsZW4gOiBpbmRleDtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBgPWAgY2hhcmFjdGVyIGJldHdlZW4gYG1pbmAgYW5kIGBtYXhgIGluIHN0ci5cbiAqL1xuZnVuY3Rpb24gZXFJbmRleChzdHI6IHN0cmluZywgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XG4gIGNvbnN0IGluZGV4ID0gc3RyLmluZGV4T2YoXCI9XCIsIG1pbik7XG4gIHJldHVybiBpbmRleCA8IG1heCA/IGluZGV4IDogLTE7XG59XG5cbi8qKlxuICogU2xpY2Ugb3V0IGEgdmFsdWUgYmV0d2VlbiBzdGFydFBvZCB0byBtYXguXG4gKi9cbmZ1bmN0aW9uIHZhbHVlU2xpY2Uoc3RyOiBzdHJpbmcsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikge1xuICBsZXQgc3RhcnQgPSBtaW47XG4gIGxldCBlbmQgPSBtYXg7XG5cbiAgZG8ge1xuICAgIGNvbnN0IGNvZGUgPSBzdHIuY2hhckNvZGVBdChzdGFydCk7XG4gICAgaWYgKGNvZGUgIT09IDB4MjAgLyogICAqLyAmJiBjb2RlICE9PSAweDA5IC8qIFxcdCAqLykgYnJlYWs7XG4gIH0gd2hpbGUgKCsrc3RhcnQgPCBlbmQpO1xuXG4gIHdoaWxlIChlbmQgPiBzdGFydCkge1xuICAgIGNvbnN0IGNvZGUgPSBzdHIuY2hhckNvZGVBdChlbmQgLSAxKTtcbiAgICBpZiAoY29kZSAhPT0gMHgyMCAvKiAgICovICYmIGNvZGUgIT09IDB4MDkgLyogXFx0ICovKSBicmVhaztcbiAgICBlbmQtLTtcbiAgfVxuXG4gIHJldHVybiBzdHIuc2xpY2Uoc3RhcnQsIGVuZCk7XG59XG5cbi8qKlxuICogVVJMLWRlY29kZSBzdHJpbmcgdmFsdWUuIE9wdGltaXplZCB0byBza2lwIG5hdGl2ZSBjYWxsIHdoZW4gbm8gJS5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHN0ci5pbmRleE9mKFwiJVwiKSA9PT0gLTEpIHJldHVybiBzdHI7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHZhbHVlIGlzIGEgRGF0ZS5cbiAqL1xuZnVuY3Rpb24gaXNEYXRlKHZhbDogYW55KTogdmFsIGlzIERhdGUge1xuICByZXR1cm4gX190b1N0cmluZy5jYWxsKHZhbCkgPT09IFwiW29iamVjdCBEYXRlXVwiO1xufVxuXG4vKipcbiAqIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZXhwb3J0cy5cbiAqL1xuZXhwb3J0IHsgc3RyaW5naWZ5U2V0Q29va2llIGFzIHNlcmlhbGl6ZSwgcGFyc2VDb29raWUgYXMgcGFyc2UgfTtcbiIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcImNvc2UtYmFzZVwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXCJjb3NlLWJhc2VcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiY3l0b3NjYXBlRmNvc2VcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJjb3NlLWJhc2VcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcImN5dG9zY2FwZUZjb3NlXCJdID0gZmFjdG9yeShyb290W1wiY29zZUJhc2VcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTQwX18pIHtcbnJldHVybiAvKioqKioqLyAoKCkgPT4geyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdFwidXNlIHN0cmljdFwiO1xuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9ICh7XG5cbi8qKiovIDY1ODpcbi8qKiovICgobW9kdWxlKSA9PiB7XG5cblxuXG4vLyBTaW1wbGUsIGludGVybmFsIE9iamVjdC5hc3NpZ24oKSBwb2x5ZmlsbCBmb3Igb3B0aW9ucyBvYmplY3RzIGV0Yy5cblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuYXNzaWduICE9IG51bGwgPyBPYmplY3QuYXNzaWduLmJpbmQoT2JqZWN0KSA6IGZ1bmN0aW9uICh0Z3QpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHNyY3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgc3Jjc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBzcmNzLmZvckVhY2goZnVuY3Rpb24gKHNyYykge1xuICAgIE9iamVjdC5rZXlzKHNyYykuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgcmV0dXJuIHRndFtrXSA9IHNyY1trXTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHRndDtcbn07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1NDg6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgX3NsaWNlZFRvQXJyYXkgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIHNsaWNlSXRlcmF0b3IoYXJyLCBpKSB7IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdKSBfaVtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH0gcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGkpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyByZXR1cm4gYXJyOyB9IGVsc2UgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkgeyByZXR1cm4gc2xpY2VJdGVyYXRvcihhcnIsIGkpOyB9IGVsc2UgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfSB9OyB9KCk7XG5cbi8qXG4gKiBBdXhpbGlhcnkgZnVuY3Rpb25zXG4gKi9cblxudmFyIExpbmtlZExpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MCkubGF5b3V0QmFzZS5MaW5rZWRMaXN0O1xuXG52YXIgYXV4aWxpYXJ5ID0ge307XG5cbi8vIGdldCB0aGUgdG9wIG1vc3Qgbm9kZXNcbmF1eGlsaWFyeS5nZXRUb3BNb3N0Tm9kZXMgPSBmdW5jdGlvbiAobm9kZXMpIHtcbiAgdmFyIG5vZGVzTWFwID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2Rlc01hcFtub2Rlc1tpXS5pZCgpXSA9IHRydWU7XG4gIH1cbiAgdmFyIHJvb3RzID0gbm9kZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUsIGkpIHtcbiAgICBpZiAodHlwZW9mIGVsZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgZWxlID0gaTtcbiAgICB9XG4gICAgdmFyIHBhcmVudCA9IGVsZS5wYXJlbnQoKVswXTtcbiAgICB3aGlsZSAocGFyZW50ICE9IG51bGwpIHtcbiAgICAgIGlmIChub2Rlc01hcFtwYXJlbnQuaWQoKV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudCgpWzBdO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJvb3RzO1xufTtcblxuLy8gZmluZCBkaXNjb25uZWN0ZWQgY29tcG9uZW50cyBhbmQgY3JlYXRlIGR1bW15IG5vZGVzIHRoYXQgY29ubmVjdCB0aGVtXG5hdXhpbGlhcnkuY29ubmVjdENvbXBvbmVudHMgPSBmdW5jdGlvbiAoY3ksIGVsZXMsIHRvcE1vc3ROb2RlcywgZHVtbXlOb2Rlcykge1xuICB2YXIgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpO1xuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIHZpc2l0ZWRUb3BNb3N0Tm9kZXMgPSBbXTtcbiAgdmFyIGN1cnJlbnROZWlnaGJvciA9IHZvaWQgMDtcbiAgdmFyIG1pbkRlZ3JlZU5vZGUgPSB2b2lkIDA7XG4gIHZhciBtaW5EZWdyZWUgPSB2b2lkIDA7XG5cbiAgdmFyIGlzQ29ubmVjdGVkID0gZmFsc2U7XG4gIHZhciBjb3VudCA9IDE7XG4gIHZhciBub2Rlc0Nvbm5lY3RlZFRvRHVtbXkgPSBbXTtcbiAgdmFyIGNvbXBvbmVudHMgPSBbXTtcblxuICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcCgpIHtcbiAgICB2YXIgY21wdCA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICBjb21wb25lbnRzLnB1c2goY21wdCk7XG5cbiAgICB2YXIgY3VycmVudE5vZGUgPSB0b3BNb3N0Tm9kZXNbMF07XG4gICAgdmFyIGNoaWxkcmVuT2ZDdXJyZW50Tm9kZSA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICBjaGlsZHJlbk9mQ3VycmVudE5vZGUubWVyZ2UoY3VycmVudE5vZGUpLm1lcmdlKGN1cnJlbnROb2RlLmRlc2NlbmRhbnRzKCkuaW50ZXJzZWN0aW9uKGVsZXMpKTtcbiAgICB2aXNpdGVkVG9wTW9zdE5vZGVzLnB1c2goY3VycmVudE5vZGUpO1xuXG4gICAgY2hpbGRyZW5PZkN1cnJlbnROb2RlLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHF1ZXVlLnB1c2gobm9kZSk7XG4gICAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgICAgIGNtcHQubWVyZ2Uobm9kZSk7XG4gICAgfSk7XG5cbiAgICB2YXIgX2xvb3AyID0gZnVuY3Rpb24gX2xvb3AyKCkge1xuICAgICAgY3VycmVudE5vZGUgPSBxdWV1ZS5zaGlmdCgpO1xuXG4gICAgICAvLyBUcmF2ZXJzZSBhbGwgbmVpZ2hib3JzIG9mIHRoaXMgbm9kZVxuICAgICAgdmFyIG5laWdoYm9yTm9kZXMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICBjdXJyZW50Tm9kZS5uZWlnaGJvcmhvb2QoKS5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKGVsZXMuaW50ZXJzZWN0aW9uKGN1cnJlbnROb2RlLmVkZ2VzV2l0aChub2RlKSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG5laWdoYm9yTm9kZXMubWVyZ2Uobm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5laWdoYm9yTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5laWdoYm9yTm9kZSA9IG5laWdoYm9yTm9kZXNbaV07XG4gICAgICAgIGN1cnJlbnROZWlnaGJvciA9IHRvcE1vc3ROb2Rlcy5pbnRlcnNlY3Rpb24obmVpZ2hib3JOb2RlLnVuaW9uKG5laWdoYm9yTm9kZS5hbmNlc3RvcnMoKSkpO1xuICAgICAgICBpZiAoY3VycmVudE5laWdoYm9yICE9IG51bGwgJiYgIXZpc2l0ZWQuaGFzKGN1cnJlbnROZWlnaGJvclswXSkpIHtcbiAgICAgICAgICB2YXIgY2hpbGRyZW5PZk5laWdoYm9yID0gY3VycmVudE5laWdoYm9yLnVuaW9uKGN1cnJlbnROZWlnaGJvci5kZXNjZW5kYW50cygpKTtcblxuICAgICAgICAgIGNoaWxkcmVuT2ZOZWlnaGJvci5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBxdWV1ZS5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgdmlzaXRlZC5hZGQobm9kZSk7XG4gICAgICAgICAgICBjbXB0Lm1lcmdlKG5vZGUpO1xuICAgICAgICAgICAgaWYgKHRvcE1vc3ROb2Rlcy5oYXMobm9kZSkpIHtcbiAgICAgICAgICAgICAgdmlzaXRlZFRvcE1vc3ROb2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggIT0gMCkge1xuICAgICAgX2xvb3AyKCk7XG4gICAgfVxuXG4gICAgY21wdC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBlbGVzLmludGVyc2VjdGlvbihub2RlLmNvbm5lY3RlZEVkZ2VzKCkpLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgLy8gY29ubmVjdGVkRWRnZXMoKSB1c3VhbGx5IGNhY2hlZFxuICAgICAgICBpZiAoY21wdC5oYXMoZS5zb3VyY2UoKSkgJiYgY21wdC5oYXMoZS50YXJnZXQoKSkpIHtcbiAgICAgICAgICAvLyBoYXMoKSBpcyBjaGVhcFxuICAgICAgICAgIGNtcHQubWVyZ2UoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKHZpc2l0ZWRUb3BNb3N0Tm9kZXMubGVuZ3RoID09IHRvcE1vc3ROb2Rlcy5sZW5ndGgpIHtcbiAgICAgIGlzQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ29ubmVjdGVkIHx8IGlzQ29ubmVjdGVkICYmIGNvdW50ID4gMSkge1xuICAgICAgbWluRGVncmVlTm9kZSA9IHZpc2l0ZWRUb3BNb3N0Tm9kZXNbMF07XG4gICAgICBtaW5EZWdyZWUgPSBtaW5EZWdyZWVOb2RlLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoO1xuICAgICAgdmlzaXRlZFRvcE1vc3ROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoIDwgbWluRGVncmVlKSB7XG4gICAgICAgICAgbWluRGVncmVlID0gbm9kZS5jb25uZWN0ZWRFZGdlcygpLmxlbmd0aDtcbiAgICAgICAgICBtaW5EZWdyZWVOb2RlID0gbm9kZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBub2Rlc0Nvbm5lY3RlZFRvRHVtbXkucHVzaChtaW5EZWdyZWVOb2RlLmlkKCkpO1xuICAgICAgLy8gVE8gRE86IENoZWNrIGVmZmljaWVuY3kgb2YgdGhpcyBwYXJ0XG4gICAgICB2YXIgdGVtcCA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgIHRlbXAubWVyZ2UodmlzaXRlZFRvcE1vc3ROb2Rlc1swXSk7XG4gICAgICB2aXNpdGVkVG9wTW9zdE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdGVtcC5tZXJnZShub2RlKTtcbiAgICAgIH0pO1xuICAgICAgdmlzaXRlZFRvcE1vc3ROb2RlcyA9IFtdO1xuICAgICAgdG9wTW9zdE5vZGVzID0gdG9wTW9zdE5vZGVzLmRpZmZlcmVuY2UodGVtcCk7XG4gICAgICBjb3VudCsrO1xuICAgIH1cbiAgfTtcblxuICBkbyB7XG4gICAgX2xvb3AoKTtcbiAgfSB3aGlsZSAoIWlzQ29ubmVjdGVkKTtcblxuICBpZiAoZHVtbXlOb2Rlcykge1xuICAgIGlmIChub2Rlc0Nvbm5lY3RlZFRvRHVtbXkubGVuZ3RoID4gMCkge1xuICAgICAgZHVtbXlOb2Rlcy5zZXQoJ2R1bW15JyArIChkdW1teU5vZGVzLnNpemUgKyAxKSwgbm9kZXNDb25uZWN0ZWRUb0R1bW15KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbXBvbmVudHM7XG59O1xuXG4vLyByZWxvY2F0ZXMgY29tcG9uZW50UmVzdWx0IHRvIG9yaWdpbmFsQ2VudGVyIGlmIHRoZXJlIGlzIG5vIGZpeGVkTm9kZUNvbnN0cmFpbnRcbmF1eGlsaWFyeS5yZWxvY2F0ZUNvbXBvbmVudCA9IGZ1bmN0aW9uIChvcmlnaW5hbENlbnRlciwgY29tcG9uZW50UmVzdWx0LCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50KSB7XG4gICAgdmFyIG1pblhDb29yZCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICB2YXIgbWF4WENvb3JkID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgIHZhciBtaW5ZQ29vcmQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIG1heFlDb29yZCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZHJhZnRcIikge1xuICAgICAgLy8gY2FsY3VsYXRlIGN1cnJlbnQgYm91bmRpbmcgYm94XG4gICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICAgIHZhciBfaXRlcmF0b3JFcnJvciA9IHVuZGVmaW5lZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gY29tcG9uZW50UmVzdWx0Lm5vZGVJbmRleGVzW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IChfc3RlcCA9IF9pdGVyYXRvci5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZSkge1xuICAgICAgICAgIHZhciBfcmVmID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAyKTtcblxuICAgICAgICAgIHZhciBrZXkgPSBfcmVmMlswXTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBfcmVmMlsxXTtcblxuICAgICAgICAgIHZhciBjeU5vZGUgPSBvcHRpb25zLmN5LmdldEVsZW1lbnRCeUlkKGtleSk7XG4gICAgICAgICAgaWYgKGN5Tm9kZSkge1xuICAgICAgICAgICAgdmFyIG5vZGVCQiA9IGN5Tm9kZS5ib3VuZGluZ0JveCgpO1xuICAgICAgICAgICAgdmFyIGxlZnRYID0gY29tcG9uZW50UmVzdWx0LnhDb29yZHNbdmFsdWVdIC0gbm9kZUJCLncgLyAyO1xuICAgICAgICAgICAgdmFyIHJpZ2h0WCA9IGNvbXBvbmVudFJlc3VsdC54Q29vcmRzW3ZhbHVlXSArIG5vZGVCQi53IC8gMjtcbiAgICAgICAgICAgIHZhciB0b3BZID0gY29tcG9uZW50UmVzdWx0LnlDb29yZHNbdmFsdWVdIC0gbm9kZUJCLmggLyAyO1xuICAgICAgICAgICAgdmFyIGJvdHRvbVkgPSBjb21wb25lbnRSZXN1bHQueUNvb3Jkc1t2YWx1ZV0gKyBub2RlQkIuaCAvIDI7XG5cbiAgICAgICAgICAgIGlmIChsZWZ0WCA8IG1pblhDb29yZCkgbWluWENvb3JkID0gbGVmdFg7XG4gICAgICAgICAgICBpZiAocmlnaHRYID4gbWF4WENvb3JkKSBtYXhYQ29vcmQgPSByaWdodFg7XG4gICAgICAgICAgICBpZiAodG9wWSA8IG1pbllDb29yZCkgbWluWUNvb3JkID0gdG9wWTtcbiAgICAgICAgICAgIGlmIChib3R0b21ZID4gbWF4WUNvb3JkKSBtYXhZQ29vcmQgPSBib3R0b21ZO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBmaW5kIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IGFuZCBvcmlnaW5hbCBjZW50ZXJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICAgIF9pdGVyYXRvckVycm9yID0gZXJyO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gJiYgX2l0ZXJhdG9yLnJldHVybikge1xuICAgICAgICAgICAgX2l0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgZGlmZk9uWCA9IG9yaWdpbmFsQ2VudGVyLnggLSAobWF4WENvb3JkICsgbWluWENvb3JkKSAvIDI7XG4gICAgICB2YXIgZGlmZk9uWSA9IG9yaWdpbmFsQ2VudGVyLnkgLSAobWF4WUNvb3JkICsgbWluWUNvb3JkKSAvIDI7XG4gICAgICAvLyBtb3ZlIGNvbXBvbmVudCB0byBvcmlnaW5hbCBjZW50ZXJcbiAgICAgIGNvbXBvbmVudFJlc3VsdC54Q29vcmRzID0gY29tcG9uZW50UmVzdWx0LnhDb29yZHMubWFwKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4ICsgZGlmZk9uWDtcbiAgICAgIH0pO1xuICAgICAgY29tcG9uZW50UmVzdWx0LnlDb29yZHMgPSBjb21wb25lbnRSZXN1bHQueUNvb3Jkcy5tYXAoZnVuY3Rpb24gKHkpIHtcbiAgICAgICAgcmV0dXJuIHkgKyBkaWZmT25ZO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNhbGN1bGF0ZSBjdXJyZW50IGJvdW5kaW5nIGJveFxuICAgICAgT2JqZWN0LmtleXMoY29tcG9uZW50UmVzdWx0KS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHZhciBub2RlID0gY29tcG9uZW50UmVzdWx0W2l0ZW1dO1xuICAgICAgICB2YXIgbGVmdFggPSBub2RlLmdldFJlY3QoKS54O1xuICAgICAgICB2YXIgcmlnaHRYID0gbm9kZS5nZXRSZWN0KCkueCArIG5vZGUuZ2V0UmVjdCgpLndpZHRoO1xuICAgICAgICB2YXIgdG9wWSA9IG5vZGUuZ2V0UmVjdCgpLnk7XG4gICAgICAgIHZhciBib3R0b21ZID0gbm9kZS5nZXRSZWN0KCkueSArIG5vZGUuZ2V0UmVjdCgpLmhlaWdodDtcblxuICAgICAgICBpZiAobGVmdFggPCBtaW5YQ29vcmQpIG1pblhDb29yZCA9IGxlZnRYO1xuICAgICAgICBpZiAocmlnaHRYID4gbWF4WENvb3JkKSBtYXhYQ29vcmQgPSByaWdodFg7XG4gICAgICAgIGlmICh0b3BZIDwgbWluWUNvb3JkKSBtaW5ZQ29vcmQgPSB0b3BZO1xuICAgICAgICBpZiAoYm90dG9tWSA+IG1heFlDb29yZCkgbWF4WUNvb3JkID0gYm90dG9tWTtcbiAgICAgIH0pO1xuICAgICAgLy8gZmluZCBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCBhbmQgb3JpZ2luYWwgY2VudGVyXG4gICAgICB2YXIgX2RpZmZPblggPSBvcmlnaW5hbENlbnRlci54IC0gKG1heFhDb29yZCArIG1pblhDb29yZCkgLyAyO1xuICAgICAgdmFyIF9kaWZmT25ZID0gb3JpZ2luYWxDZW50ZXIueSAtIChtYXhZQ29vcmQgKyBtaW5ZQ29vcmQpIC8gMjtcbiAgICAgIC8vIG1vdmUgY29tcG9uZW50IHRvIG9yaWdpbmFsIGNlbnRlclxuICAgICAgT2JqZWN0LmtleXMoY29tcG9uZW50UmVzdWx0KS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHZhciBub2RlID0gY29tcG9uZW50UmVzdWx0W2l0ZW1dO1xuICAgICAgICBub2RlLnNldENlbnRlcihub2RlLmdldENlbnRlclgoKSArIF9kaWZmT25YLCBub2RlLmdldENlbnRlclkoKSArIF9kaWZmT25ZKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufTtcblxuYXV4aWxpYXJ5LmNhbGNCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIChwYXJlbnROb2RlLCB4Q29vcmRzLCB5Q29vcmRzLCBub2RlSW5kZXhlcykge1xuICAvLyBjYWxjdWxhdGUgYm91bmRzXG4gIHZhciBsZWZ0ID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gIHZhciByaWdodCA9IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xuICB2YXIgdG9wID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gIHZhciBib3R0b20gPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtcbiAgdmFyIG5vZGVMZWZ0ID0gdm9pZCAwO1xuICB2YXIgbm9kZVJpZ2h0ID0gdm9pZCAwO1xuICB2YXIgbm9kZVRvcCA9IHZvaWQgMDtcbiAgdmFyIG5vZGVCb3R0b20gPSB2b2lkIDA7XG5cbiAgdmFyIG5vZGVzID0gcGFyZW50Tm9kZS5kZXNjZW5kYW50cygpLm5vdChcIjpwYXJlbnRcIik7XG4gIHZhciBzID0gbm9kZXMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgIHZhciBub2RlID0gbm9kZXNbaV07XG5cbiAgICBub2RlTGVmdCA9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGUuaWQoKSldIC0gbm9kZS53aWR0aCgpIC8gMjtcbiAgICBub2RlUmlnaHQgPSB4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlLmlkKCkpXSArIG5vZGUud2lkdGgoKSAvIDI7XG4gICAgbm9kZVRvcCA9IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGUuaWQoKSldIC0gbm9kZS5oZWlnaHQoKSAvIDI7XG4gICAgbm9kZUJvdHRvbSA9IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGUuaWQoKSldICsgbm9kZS5oZWlnaHQoKSAvIDI7XG5cbiAgICBpZiAobGVmdCA+IG5vZGVMZWZ0KSB7XG4gICAgICBsZWZ0ID0gbm9kZUxlZnQ7XG4gICAgfVxuXG4gICAgaWYgKHJpZ2h0IDwgbm9kZVJpZ2h0KSB7XG4gICAgICByaWdodCA9IG5vZGVSaWdodDtcbiAgICB9XG5cbiAgICBpZiAodG9wID4gbm9kZVRvcCkge1xuICAgICAgdG9wID0gbm9kZVRvcDtcbiAgICB9XG5cbiAgICBpZiAoYm90dG9tIDwgbm9kZUJvdHRvbSkge1xuICAgICAgYm90dG9tID0gbm9kZUJvdHRvbTtcbiAgICB9XG4gIH1cblxuICB2YXIgYm91bmRpbmdCb3ggPSB7fTtcbiAgYm91bmRpbmdCb3gudG9wTGVmdFggPSBsZWZ0O1xuICBib3VuZGluZ0JveC50b3BMZWZ0WSA9IHRvcDtcbiAgYm91bmRpbmdCb3gud2lkdGggPSByaWdodCAtIGxlZnQ7XG4gIGJvdW5kaW5nQm94LmhlaWdodCA9IGJvdHRvbSAtIHRvcDtcbiAgcmV0dXJuIGJvdW5kaW5nQm94O1xufTtcblxuLy8gVGhpcyBmdW5jdGlvbiBmaW5kcyBhbmQgcmV0dXJucyBwYXJlbnQgbm9kZXMgd2hvc2UgYWxsIGNoaWxkcmVuIGFyZSBoaWRkZW5cbmF1eGlsaWFyeS5jYWxjUGFyZW50c1dpdGhvdXRDaGlsZHJlbiA9IGZ1bmN0aW9uIChjeSwgZWxlcykge1xuICB2YXIgcGFyZW50c1dpdGhvdXRDaGlsZHJlbiA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgZWxlcy5ub2RlcygnOnBhcmVudCcpLmZvckVhY2goZnVuY3Rpb24gKHBhcmVudCkge1xuICAgIHZhciBjaGVjayA9IGZhbHNlO1xuICAgIHBhcmVudC5jaGlsZHJlbigpLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICBpZiAoY2hpbGQuY3NzKCdkaXNwbGF5JykgIT0gJ25vbmUnKSB7XG4gICAgICAgIGNoZWNrID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWNoZWNrKSB7XG4gICAgICBwYXJlbnRzV2l0aG91dENoaWxkcmVuLm1lcmdlKHBhcmVudCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcGFyZW50c1dpdGhvdXRDaGlsZHJlbjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gYXV4aWxpYXJ5O1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODE2OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuLyoqXG4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcG9zdHByb2Nlc3NpbmcgcGFydCB0aGF0IGFwcGxpZXMgQ29TRSBsYXlvdXQgb3ZlciB0aGUgc3BlY3RyYWwgbGF5b3V0XG4qL1xuXG52YXIgYXV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NDgpO1xudmFyIENvU0VMYXlvdXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MCkuQ29TRUxheW91dDtcbnZhciBDb1NFTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5Db1NFTm9kZTtcbnZhciBQb2ludEQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MCkubGF5b3V0QmFzZS5Qb2ludEQ7XG52YXIgRGltZW5zaW9uRCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLkRpbWVuc2lvbkQ7XG52YXIgTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLmxheW91dEJhc2UuTGF5b3V0Q29uc3RhbnRzO1xudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDApLmxheW91dEJhc2UuRkRMYXlvdXRDb25zdGFudHM7XG52YXIgQ29TRUNvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5Db1NFQ29uc3RhbnRzO1xuXG4vLyBtYWluIGZ1bmN0aW9uIHRoYXQgY29zZSBsYXlvdXQgaXMgcHJvY2Vzc2VkXG52YXIgY29zZUxheW91dCA9IGZ1bmN0aW9uIGNvc2VMYXlvdXQob3B0aW9ucywgc3BlY3RyYWxSZXN1bHQpIHtcblxuICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpO1xuICB2YXIgZWRnZXMgPSBlbGVzLmVkZ2VzKCk7XG5cbiAgdmFyIG5vZGVJbmRleGVzID0gdm9pZCAwO1xuICB2YXIgeENvb3JkcyA9IHZvaWQgMDtcbiAgdmFyIHlDb29yZHMgPSB2b2lkIDA7XG4gIHZhciBpZFRvTE5vZGUgPSB7fTtcblxuICBpZiAob3B0aW9ucy5yYW5kb21pemUpIHtcbiAgICBub2RlSW5kZXhlcyA9IHNwZWN0cmFsUmVzdWx0W1wibm9kZUluZGV4ZXNcIl07XG4gICAgeENvb3JkcyA9IHNwZWN0cmFsUmVzdWx0W1wieENvb3Jkc1wiXTtcbiAgICB5Q29vcmRzID0gc3BlY3RyYWxSZXN1bHRbXCJ5Q29vcmRzXCJdO1xuICB9XG5cbiAgdmFyIGlzRm4gPSBmdW5jdGlvbiBpc0ZuKGZuKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJztcbiAgfTtcblxuICB2YXIgb3B0Rm4gPSBmdW5jdGlvbiBvcHRGbihvcHQsIGVsZSkge1xuICAgIGlmIChpc0ZuKG9wdCkpIHtcbiAgICAgIHJldHVybiBvcHQoZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9wdDtcbiAgICB9XG4gIH07XG5cbiAgLyoqKiogUG9zdHByb2Nlc3NpbmcgZnVuY3Rpb25zICoqKiovXG5cbiAgdmFyIHBhcmVudHNXaXRob3V0Q2hpbGRyZW4gPSBhdXguY2FsY1BhcmVudHNXaXRob3V0Q2hpbGRyZW4oY3ksIGVsZXMpO1xuXG4gIC8vIHRyYW5zZmVyIGN5dG9zY2FwZSBub2RlcyB0byBjb3NlIG5vZGVzXG4gIHZhciBwcm9jZXNzQ2hpbGRyZW5MaXN0ID0gZnVuY3Rpb24gcHJvY2Vzc0NoaWxkcmVuTGlzdChwYXJlbnQsIGNoaWxkcmVuLCBsYXlvdXQsIG9wdGlvbnMpIHtcbiAgICB2YXIgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgdmFyIHRoZUNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICB2YXIgY2hpbGRyZW5fb2ZfY2hpbGRyZW4gPSBudWxsO1xuICAgICAgaWYgKHRoZUNoaWxkLmludGVyc2VjdGlvbihwYXJlbnRzV2l0aG91dENoaWxkcmVuKS5sZW5ndGggPT0gMCkge1xuICAgICAgICBjaGlsZHJlbl9vZl9jaGlsZHJlbiA9IHRoZUNoaWxkLmNoaWxkcmVuKCk7XG4gICAgICB9XG4gICAgICB2YXIgdGhlTm9kZSA9IHZvaWQgMDtcblxuICAgICAgdmFyIGRpbWVuc2lvbnMgPSB0aGVDaGlsZC5sYXlvdXREaW1lbnNpb25zKHtcbiAgICAgICAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzOiBvcHRpb25zLm5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsc1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGVDaGlsZC5vdXRlcldpZHRoKCkgIT0gbnVsbCAmJiB0aGVDaGlsZC5vdXRlckhlaWdodCgpICE9IG51bGwpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucmFuZG9taXplKSB7XG4gICAgICAgICAgaWYgKCF0aGVDaGlsZC5pc1BhcmVudCgpKSB7XG4gICAgICAgICAgICB0aGVOb2RlID0gcGFyZW50LmFkZChuZXcgQ29TRU5vZGUobGF5b3V0LmdyYXBoTWFuYWdlciwgbmV3IFBvaW50RCh4Q29vcmRzW25vZGVJbmRleGVzLmdldCh0aGVDaGlsZC5pZCgpKV0gLSBkaW1lbnNpb25zLncgLyAyLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldCh0aGVDaGlsZC5pZCgpKV0gLSBkaW1lbnNpb25zLmggLyAyKSwgbmV3IERpbWVuc2lvbkQocGFyc2VGbG9hdChkaW1lbnNpb25zLncpLCBwYXJzZUZsb2F0KGRpbWVuc2lvbnMuaCkpKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRJbmZvID0gYXV4LmNhbGNCb3VuZGluZ0JveCh0aGVDaGlsZCwgeENvb3JkcywgeUNvb3Jkcywgbm9kZUluZGV4ZXMpO1xuICAgICAgICAgICAgaWYgKHRoZUNoaWxkLmludGVyc2VjdGlvbihwYXJlbnRzV2l0aG91dENoaWxkcmVuKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICB0aGVOb2RlID0gcGFyZW50LmFkZChuZXcgQ29TRU5vZGUobGF5b3V0LmdyYXBoTWFuYWdlciwgbmV3IFBvaW50RChwYXJlbnRJbmZvLnRvcExlZnRYLCBwYXJlbnRJbmZvLnRvcExlZnRZKSwgbmV3IERpbWVuc2lvbkQocGFyZW50SW5mby53aWR0aCwgcGFyZW50SW5mby5oZWlnaHQpKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBmb3IgdGhlIHBhcmVudHNXaXRob3V0Q2hpbGRyZW5cbiAgICAgICAgICAgICAgdGhlTm9kZSA9IHBhcmVudC5hZGQobmV3IENvU0VOb2RlKGxheW91dC5ncmFwaE1hbmFnZXIsIG5ldyBQb2ludEQocGFyZW50SW5mby50b3BMZWZ0WCwgcGFyZW50SW5mby50b3BMZWZ0WSksIG5ldyBEaW1lbnNpb25EKHBhcnNlRmxvYXQoZGltZW5zaW9ucy53KSwgcGFyc2VGbG9hdChkaW1lbnNpb25zLmgpKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGVOb2RlID0gcGFyZW50LmFkZChuZXcgQ29TRU5vZGUobGF5b3V0LmdyYXBoTWFuYWdlciwgbmV3IFBvaW50RCh0aGVDaGlsZC5wb3NpdGlvbigneCcpIC0gZGltZW5zaW9ucy53IC8gMiwgdGhlQ2hpbGQucG9zaXRpb24oJ3knKSAtIGRpbWVuc2lvbnMuaCAvIDIpLCBuZXcgRGltZW5zaW9uRChwYXJzZUZsb2F0KGRpbWVuc2lvbnMudyksIHBhcnNlRmxvYXQoZGltZW5zaW9ucy5oKSkpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhlTm9kZSA9IHBhcmVudC5hZGQobmV3IENvU0VOb2RlKHRoaXMuZ3JhcGhNYW5hZ2VyKSk7XG4gICAgICB9XG4gICAgICAvLyBBdHRhY2ggaWQgdG8gdGhlIGxheW91dCBub2RlIGFuZCByZXB1bHNpb24gdmFsdWVcbiAgICAgIHRoZU5vZGUuaWQgPSB0aGVDaGlsZC5kYXRhKFwiaWRcIik7XG4gICAgICB0aGVOb2RlLm5vZGVSZXB1bHNpb24gPSBvcHRGbihvcHRpb25zLm5vZGVSZXB1bHNpb24sIHRoZUNoaWxkKTtcbiAgICAgIC8vIEF0dGFjaCB0aGUgcGFkZGluZ3Mgb2YgY3kgbm9kZSB0byBsYXlvdXQgbm9kZVxuICAgICAgdGhlTm9kZS5wYWRkaW5nTGVmdCA9IHBhcnNlSW50KHRoZUNoaWxkLmNzcygncGFkZGluZycpKTtcbiAgICAgIHRoZU5vZGUucGFkZGluZ1RvcCA9IHBhcnNlSW50KHRoZUNoaWxkLmNzcygncGFkZGluZycpKTtcbiAgICAgIHRoZU5vZGUucGFkZGluZ1JpZ2h0ID0gcGFyc2VJbnQodGhlQ2hpbGQuY3NzKCdwYWRkaW5nJykpO1xuICAgICAgdGhlTm9kZS5wYWRkaW5nQm90dG9tID0gcGFyc2VJbnQodGhlQ2hpbGQuY3NzKCdwYWRkaW5nJykpO1xuXG4gICAgICAvL0F0dGFjaCB0aGUgbGFiZWwgcHJvcGVydGllcyB0byBib3RoIGNvbXBvdW5kIGFuZCBzaW1wbGUgbm9kZXMgaWYgbGFiZWxzIHdpbGwgYmUgaW5jbHVkZWQgaW4gbm9kZSBkaW1lbnNpb25zXG4gICAgICAvL1RoZXNlIHByb3BlcnRpZXMgd2lsbCBiZSB1c2VkIHdoaWxlIHVwZGF0aW5nIGJvdW5kcyBvZiBjb21wb3VuZHMgZHVyaW5nIGl0ZXJhdGlvbnMgb3IgdGlsaW5nXG4gICAgICAvL2FuZCB3aWxsIGJlIHVzZWQgZm9yIHNpbXBsZSBub2RlcyB3aGlsZSB0cmFuc2ZlcnJpbmcgZmluYWwgcG9zaXRpb25zIHRvIGN5dG9zY2FwZVxuICAgICAgaWYgKG9wdGlvbnMubm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzKSB7XG4gICAgICAgIHRoZU5vZGUubGFiZWxXaWR0aCA9IHRoZUNoaWxkLmJvdW5kaW5nQm94KHsgaW5jbHVkZUxhYmVsczogdHJ1ZSwgaW5jbHVkZU5vZGVzOiBmYWxzZSwgaW5jbHVkZU92ZXJsYXlzOiBmYWxzZSB9KS53O1xuICAgICAgICB0aGVOb2RlLmxhYmVsSGVpZ2h0ID0gdGhlQ2hpbGQuYm91bmRpbmdCb3goeyBpbmNsdWRlTGFiZWxzOiB0cnVlLCBpbmNsdWRlTm9kZXM6IGZhbHNlLCBpbmNsdWRlT3ZlcmxheXM6IGZhbHNlIH0pLmg7XG4gICAgICAgIHRoZU5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9IHRoZUNoaWxkLmNzcyhcInRleHQtdmFsaWduXCIpO1xuICAgICAgICB0aGVOb2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9IHRoZUNoaWxkLmNzcyhcInRleHQtaGFsaWduXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBNYXAgdGhlIGxheW91dCBub2RlXG4gICAgICBpZFRvTE5vZGVbdGhlQ2hpbGQuZGF0YShcImlkXCIpXSA9IHRoZU5vZGU7XG5cbiAgICAgIGlmIChpc05hTih0aGVOb2RlLnJlY3QueCkpIHtcbiAgICAgICAgdGhlTm9kZS5yZWN0LnggPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNOYU4odGhlTm9kZS5yZWN0LnkpKSB7XG4gICAgICAgIHRoZU5vZGUucmVjdC55ID0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoaWxkcmVuX29mX2NoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW5fb2ZfY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgdGhlTmV3R3JhcGggPSB2b2lkIDA7XG4gICAgICAgIHRoZU5ld0dyYXBoID0gbGF5b3V0LmdldEdyYXBoTWFuYWdlcigpLmFkZChsYXlvdXQubmV3R3JhcGgoKSwgdGhlTm9kZSk7XG4gICAgICAgIHByb2Nlc3NDaGlsZHJlbkxpc3QodGhlTmV3R3JhcGgsIGNoaWxkcmVuX29mX2NoaWxkcmVuLCBsYXlvdXQsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyB0cmFuc2ZlciBjeXRvc2NhcGUgZWRnZXMgdG8gY29zZSBlZGdlc1xuICB2YXIgcHJvY2Vzc0VkZ2VzID0gZnVuY3Rpb24gcHJvY2Vzc0VkZ2VzKGxheW91dCwgZ20sIGVkZ2VzKSB7XG4gICAgdmFyIGlkZWFsTGVuZ3RoVG90YWwgPSAwO1xuICAgIHZhciBlZGdlQ291bnQgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgICB2YXIgc291cmNlTm9kZSA9IGlkVG9MTm9kZVtlZGdlLmRhdGEoXCJzb3VyY2VcIildO1xuICAgICAgdmFyIHRhcmdldE5vZGUgPSBpZFRvTE5vZGVbZWRnZS5kYXRhKFwidGFyZ2V0XCIpXTtcbiAgICAgIGlmIChzb3VyY2VOb2RlICYmIHRhcmdldE5vZGUgJiYgc291cmNlTm9kZSAhPT0gdGFyZ2V0Tm9kZSAmJiBzb3VyY2VOb2RlLmdldEVkZ2VzQmV0d2Vlbih0YXJnZXROb2RlKS5sZW5ndGggPT0gMCkge1xuICAgICAgICB2YXIgZTEgPSBnbS5hZGQobGF5b3V0Lm5ld0VkZ2UoKSwgc291cmNlTm9kZSwgdGFyZ2V0Tm9kZSk7XG4gICAgICAgIGUxLmlkID0gZWRnZS5pZCgpO1xuICAgICAgICBlMS5pZGVhbExlbmd0aCA9IG9wdEZuKG9wdGlvbnMuaWRlYWxFZGdlTGVuZ3RoLCBlZGdlKTtcbiAgICAgICAgZTEuZWRnZUVsYXN0aWNpdHkgPSBvcHRGbihvcHRpb25zLmVkZ2VFbGFzdGljaXR5LCBlZGdlKTtcbiAgICAgICAgaWRlYWxMZW5ndGhUb3RhbCArPSBlMS5pZGVhbExlbmd0aDtcbiAgICAgICAgZWRnZUNvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBpZGVhbCBlZGdlIGxlbmd0aCBjb25zdGFudCB3aXRoIHRoZSBhdmcuIGlkZWFsIGxlbmd0aCB2YWx1ZSBhZnRlciBwcm9jZXNzaW5nIGVkZ2VzXG4gICAgLy8gaW4gY2FzZSB0aGVyZSBpcyBubyBlZGdlLCB1c2Ugb3RoZXIgb3B0aW9uc1xuICAgIGlmIChvcHRpb25zLmlkZWFsRWRnZUxlbmd0aCAhPSBudWxsKSB7XG4gICAgICBpZiAoZWRnZUNvdW50ID4gMCkgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCA9IGlkZWFsTGVuZ3RoVG90YWwgLyBlZGdlQ291bnQ7ZWxzZSBpZiAoIWlzRm4ob3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGgpKSAvLyBpbiBjYXNlIHRoZXJlIGlzIG5vIGVkZ2UsIGJ1dCBvcHRpb24gZ2l2ZXMgYSB2YWx1ZSB0byB1c2VcbiAgICAgICAgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCA9IG9wdGlvbnMuaWRlYWxFZGdlTGVuZ3RoO2Vsc2UgLy8gaW4gY2FzZSB0aGVyZSBpcyBubyBlZGdlIGFuZCB3ZSBjYW5ub3QgZ2V0IGEgdmFsdWUgZnJvbSBvcHRpb24gKGJlY2F1c2UgaXQncyBhIGZ1bmN0aW9uKVxuICAgICAgICBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIID0gNTA7XG4gICAgICAvLyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGVzZSBjb25zdGFudCB2YWx1ZXMgYmFzZWQgb24gdGhlIGlkZWFsIGVkZ2UgbGVuZ3RoIGNvbnN0YW50XG4gICAgICBDb1NFQ29uc3RhbnRzLk1JTl9SRVBVTFNJT05fRElTVCA9IEZETGF5b3V0Q29uc3RhbnRzLk1JTl9SRVBVTFNJT05fRElTVCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggLyAxMC4wO1xuICAgICAgQ29TRUNvbnN0YW50cy5ERUZBVUxUX1JBRElBTF9TRVBBUkFUSU9OID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSDtcbiAgICB9XG4gIH07XG5cbiAgLy8gdHJhbnNmZXIgY3l0b3NjYXBlIGNvbnN0cmFpbnRzIHRvIGNvc2UgbGF5b3V0XG4gIHZhciBwcm9jZXNzQ29uc3RyYWludHMgPSBmdW5jdGlvbiBwcm9jZXNzQ29uc3RyYWludHMobGF5b3V0LCBvcHRpb25zKSB7XG4gICAgLy8gZ2V0IG5vZGVzIHRvIGJlIGZpeGVkXG4gICAgaWYgKG9wdGlvbnMuZml4ZWROb2RlQ29uc3RyYWludCkge1xuICAgICAgbGF5b3V0LmNvbnN0cmFpbnRzW1wiZml4ZWROb2RlQ29uc3RyYWludFwiXSA9IG9wdGlvbnMuZml4ZWROb2RlQ29uc3RyYWludDtcbiAgICB9XG4gICAgLy8gZ2V0IG5vZGVzIHRvIGJlIGFsaWduZWRcbiAgICBpZiAob3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50KSB7XG4gICAgICBsYXlvdXQuY29uc3RyYWludHNbXCJhbGlnbm1lbnRDb25zdHJhaW50XCJdID0gb3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50O1xuICAgIH1cbiAgICAvLyBnZXQgbm9kZXMgdG8gYmUgcmVsYXRpdmVseSBwbGFjZWRcbiAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICAgIGxheW91dC5jb25zdHJhaW50c1tcInJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludFwiXSA9IG9wdGlvbnMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50O1xuICAgIH1cbiAgfTtcblxuICAvKioqKiBBcHBseSBwb3N0cHJvY2Vzc2luZyAqKioqL1xuICBpZiAob3B0aW9ucy5uZXN0aW5nRmFjdG9yICE9IG51bGwpIENvU0VDb25zdGFudHMuUEVSX0xFVkVMX0lERUFMX0VER0VfTEVOR1RIX0ZBQ1RPUiA9IEZETGF5b3V0Q29uc3RhbnRzLlBFUl9MRVZFTF9JREVBTF9FREdFX0xFTkdUSF9GQUNUT1IgPSBvcHRpb25zLm5lc3RpbmdGYWN0b3I7XG4gIGlmIChvcHRpb25zLmdyYXZpdHkgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0dSQVZJVFlfU1RSRU5HVEggPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVZJVFlfU1RSRU5HVEggPSBvcHRpb25zLmdyYXZpdHk7XG4gIGlmIChvcHRpb25zLm51bUl0ZXIgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5NQVhfSVRFUkFUSU9OUyA9IEZETGF5b3V0Q29uc3RhbnRzLk1BWF9JVEVSQVRJT05TID0gb3B0aW9ucy5udW1JdGVyO1xuICBpZiAob3B0aW9ucy5ncmF2aXR5UmFuZ2UgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0dSQVZJVFlfUkFOR0VfRkFDVE9SID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUiA9IG9wdGlvbnMuZ3Jhdml0eVJhbmdlO1xuICBpZiAob3B0aW9ucy5ncmF2aXR5Q29tcG91bmQgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfU1RSRU5HVEggPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfU1RSRU5HVEggPSBvcHRpb25zLmdyYXZpdHlDb21wb3VuZDtcbiAgaWYgKG9wdGlvbnMuZ3Jhdml0eVJhbmdlQ29tcG91bmQgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfUkFOR0VfRkFDVE9SID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUiA9IG9wdGlvbnMuZ3Jhdml0eVJhbmdlQ29tcG91bmQ7XG4gIGlmIChvcHRpb25zLmluaXRpYWxFbmVyZ3lPbkluY3JlbWVudGFsICE9IG51bGwpIENvU0VDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09PTElOR19GQUNUT1JfSU5DUkVNRU5UQUwgPSBvcHRpb25zLmluaXRpYWxFbmVyZ3lPbkluY3JlbWVudGFsO1xuXG4gIGlmIChvcHRpb25zLnRpbGluZ0NvbXBhcmVCeSAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLlRJTElOR19DT01QQVJFX0JZID0gb3B0aW9ucy50aWxpbmdDb21wYXJlQnk7XG5cbiAgaWYgKG9wdGlvbnMucXVhbGl0eSA9PSAncHJvb2YnKSBMYXlvdXRDb25zdGFudHMuUVVBTElUWSA9IDI7ZWxzZSBMYXlvdXRDb25zdGFudHMuUVVBTElUWSA9IDA7XG5cbiAgQ29TRUNvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMgPSBGRExheW91dENvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMgPSBMYXlvdXRDb25zdGFudHMuTk9ERV9ESU1FTlNJT05TX0lOQ0xVREVfTEFCRUxTID0gb3B0aW9ucy5ub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM7XG4gIENvU0VDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUwgPSBMYXlvdXRDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTCA9ICFvcHRpb25zLnJhbmRvbWl6ZTtcbiAgQ29TRUNvbnN0YW50cy5BTklNQVRFID0gRkRMYXlvdXRDb25zdGFudHMuQU5JTUFURSA9IExheW91dENvbnN0YW50cy5BTklNQVRFID0gb3B0aW9ucy5hbmltYXRlO1xuICBDb1NFQ29uc3RhbnRzLlRJTEUgPSBvcHRpb25zLnRpbGU7XG4gIENvU0VDb25zdGFudHMuVElMSU5HX1BBRERJTkdfVkVSVElDQUwgPSB0eXBlb2Ygb3B0aW9ucy50aWxpbmdQYWRkaW5nVmVydGljYWwgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLnRpbGluZ1BhZGRpbmdWZXJ0aWNhbC5jYWxsKCkgOiBvcHRpb25zLnRpbGluZ1BhZGRpbmdWZXJ0aWNhbDtcbiAgQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19IT1JJWk9OVEFMID0gdHlwZW9mIG9wdGlvbnMudGlsaW5nUGFkZGluZ0hvcml6b250YWwgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLnRpbGluZ1BhZGRpbmdIb3Jpem9udGFsLmNhbGwoKSA6IG9wdGlvbnMudGlsaW5nUGFkZGluZ0hvcml6b250YWw7XG5cbiAgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gdHJ1ZTtcbiAgQ29TRUNvbnN0YW50cy5QVVJFX0lOQ1JFTUVOVEFMID0gIW9wdGlvbnMucmFuZG9taXplO1xuICBMYXlvdXRDb25zdGFudHMuREVGQVVMVF9VTklGT1JNX0xFQUZfTk9ERV9TSVpFUyA9IG9wdGlvbnMudW5pZm9ybU5vZGVEaW1lbnNpb25zO1xuXG4gIC8vIFRoaXMgcGFydCBpcyBmb3IgZGVidWcvZGVtbyBwdXJwb3NlXG4gIGlmIChvcHRpb25zLnN0ZXAgPT0gXCJ0cmFuc2Zvcm1lZFwiKSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IHRydWU7XG4gICAgQ29TRUNvbnN0YW50cy5FTkZPUkNFX0NPTlNUUkFJTlRTID0gZmFsc2U7XG4gICAgQ29TRUNvbnN0YW50cy5BUFBMWV9MQVlPVVQgPSBmYWxzZTtcbiAgfVxuICBpZiAob3B0aW9ucy5zdGVwID09IFwiZW5mb3JjZWRcIikge1xuICAgIENvU0VDb25zdGFudHMuVFJBTlNGT1JNX09OX0NPTlNUUkFJTlRfSEFORExJTkcgPSBmYWxzZTtcbiAgICBDb1NFQ29uc3RhbnRzLkVORk9SQ0VfQ09OU1RSQUlOVFMgPSB0cnVlO1xuICAgIENvU0VDb25zdGFudHMuQVBQTFlfTEFZT1VUID0gZmFsc2U7XG4gIH1cbiAgaWYgKG9wdGlvbnMuc3RlcCA9PSBcImNvc2VcIikge1xuICAgIENvU0VDb25zdGFudHMuVFJBTlNGT1JNX09OX0NPTlNUUkFJTlRfSEFORExJTkcgPSBmYWxzZTtcbiAgICBDb1NFQ29uc3RhbnRzLkVORk9SQ0VfQ09OU1RSQUlOVFMgPSBmYWxzZTtcbiAgICBDb1NFQ29uc3RhbnRzLkFQUExZX0xBWU9VVCA9IHRydWU7XG4gIH1cbiAgaWYgKG9wdGlvbnMuc3RlcCA9PSBcImFsbFwiKSB7XG4gICAgaWYgKG9wdGlvbnMucmFuZG9taXplKSBDb1NFQ29uc3RhbnRzLlRSQU5TRk9STV9PTl9DT05TVFJBSU5UX0hBTkRMSU5HID0gdHJ1ZTtlbHNlIENvU0VDb25zdGFudHMuVFJBTlNGT1JNX09OX0NPTlNUUkFJTlRfSEFORExJTkcgPSBmYWxzZTtcbiAgICBDb1NFQ29uc3RhbnRzLkVORk9SQ0VfQ09OU1RSQUlOVFMgPSB0cnVlO1xuICAgIENvU0VDb25zdGFudHMuQVBQTFlfTEFZT1VUID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQgfHwgb3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50IHx8IG9wdGlvbnMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG4gICAgQ29TRUNvbnN0YW50cy5UUkVFX1JFRFVDVElPTl9PTl9JTkNSRU1FTlRBTCA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIENvU0VDb25zdGFudHMuVFJFRV9SRURVQ1RJT05fT05fSU5DUkVNRU5UQUwgPSB0cnVlO1xuICB9XG5cbiAgdmFyIGNvc2VMYXlvdXQgPSBuZXcgQ29TRUxheW91dCgpO1xuICB2YXIgZ20gPSBjb3NlTGF5b3V0Lm5ld0dyYXBoTWFuYWdlcigpO1xuXG4gIHByb2Nlc3NDaGlsZHJlbkxpc3QoZ20uYWRkUm9vdCgpLCBhdXguZ2V0VG9wTW9zdE5vZGVzKG5vZGVzKSwgY29zZUxheW91dCwgb3B0aW9ucyk7XG4gIHByb2Nlc3NFZGdlcyhjb3NlTGF5b3V0LCBnbSwgZWRnZXMpO1xuICBwcm9jZXNzQ29uc3RyYWludHMoY29zZUxheW91dCwgb3B0aW9ucyk7XG5cbiAgY29zZUxheW91dC5ydW5MYXlvdXQoKTtcblxuICByZXR1cm4gaWRUb0xOb2RlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7IGNvc2VMYXlvdXQ6IGNvc2VMYXlvdXQgfTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDIxMjpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbi8qKlxuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZjb3NlIGxheW91dCBhbGdvcml0aG1cbiovXG5cbnZhciBhc3NpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1OCk7XG52YXIgYXV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NDgpO1xuXG52YXIgX3JlcXVpcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1NyksXG4gICAgc3BlY3RyYWxMYXlvdXQgPSBfcmVxdWlyZS5zcGVjdHJhbExheW91dDtcblxudmFyIF9yZXF1aXJlMiA9IF9fd2VicGFja19yZXF1aXJlX18oODE2KSxcbiAgICBjb3NlTGF5b3V0ID0gX3JlcXVpcmUyLmNvc2VMYXlvdXQ7XG5cbnZhciBkZWZhdWx0cyA9IE9iamVjdC5mcmVlemUoe1xuXG4gIC8vICdkcmFmdCcsICdkZWZhdWx0JyBvciAncHJvb2YnIFxuICAvLyAtICdkcmFmdCcgb25seSBhcHBsaWVzIHNwZWN0cmFsIGxheW91dCBcbiAgLy8gLSAnZGVmYXVsdCcgaW1wcm92ZXMgdGhlIHF1YWxpdHkgd2l0aCBzdWJzZXF1ZW50IENvU0UgbGF5b3V0IChmYXN0IGNvb2xpbmcgcmF0ZSlcbiAgLy8gLSAncHJvb2YnIGltcHJvdmVzIHRoZSBxdWFsaXR5IHdpdGggc3Vic2VxdWVudCBDb1NFIGxheW91dCAoc2xvdyBjb29saW5nIHJhdGUpIFxuICBxdWFsaXR5OiBcImRlZmF1bHRcIixcbiAgLy8gVXNlIHJhbmRvbSBub2RlIHBvc2l0aW9ucyBhdCBiZWdpbm5pbmcgb2YgbGF5b3V0XG4gIC8vIGlmIHRoaXMgaXMgc2V0IHRvIGZhbHNlLCB0aGVuIHF1YWxpdHkgb3B0aW9uIG11c3QgYmUgXCJwcm9vZlwiXG4gIHJhbmRvbWl6ZTogdHJ1ZSxcbiAgLy8gV2hldGhlciBvciBub3QgdG8gYW5pbWF0ZSB0aGUgbGF5b3V0XG4gIGFuaW1hdGU6IHRydWUsXG4gIC8vIER1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcywgaWYgZW5hYmxlZFxuICBhbmltYXRpb25EdXJhdGlvbjogMTAwMCxcbiAgLy8gRWFzaW5nIG9mIGFuaW1hdGlvbiwgaWYgZW5hYmxlZFxuICBhbmltYXRpb25FYXNpbmc6IHVuZGVmaW5lZCxcbiAgLy8gRml0IHRoZSB2aWV3cG9ydCB0byB0aGUgcmVwb3NpdGlvbmVkIG5vZGVzXG4gIGZpdDogdHJ1ZSxcbiAgLy8gUGFkZGluZyBhcm91bmQgbGF5b3V0XG4gIHBhZGRpbmc6IDMwLFxuICAvLyBXaGV0aGVyIHRvIGluY2x1ZGUgbGFiZWxzIGluIG5vZGUgZGltZW5zaW9ucy4gVmFsaWQgaW4gXCJwcm9vZlwiIHF1YWxpdHlcbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzOiBmYWxzZSxcbiAgLy8gV2hldGhlciBvciBub3Qgc2ltcGxlIG5vZGVzIChub24tY29tcG91bmQgbm9kZXMpIGFyZSBvZiB1bmlmb3JtIGRpbWVuc2lvbnNcbiAgdW5pZm9ybU5vZGVEaW1lbnNpb25zOiBmYWxzZSxcbiAgLy8gV2hldGhlciB0byBwYWNrIGRpc2Nvbm5lY3RlZCBjb21wb25lbnRzIC0gdmFsaWQgb25seSBpZiByYW5kb21pemU6IHRydWVcbiAgcGFja0NvbXBvbmVudHM6IHRydWUsXG4gIC8vIExheW91dCBzdGVwIC0gYWxsLCB0cmFuc2Zvcm1lZCwgZW5mb3JjZWQsIGNvc2UgLSBmb3IgZGVidWcgcHVycG9zZSBvbmx5XG4gIHN0ZXA6IFwiYWxsXCIsXG5cbiAgLyogc3BlY3RyYWwgbGF5b3V0IG9wdGlvbnMgKi9cblxuICAvLyBGYWxzZSBmb3IgcmFuZG9tLCB0cnVlIGZvciBncmVlZHlcbiAgc2FtcGxpbmdUeXBlOiB0cnVlLFxuICAvLyBTYW1wbGUgc2l6ZSB0byBjb25zdHJ1Y3QgZGlzdGFuY2UgbWF0cml4XG4gIHNhbXBsZVNpemU6IDI1LFxuICAvLyBTZXBhcmF0aW9uIGFtb3VudCBiZXR3ZWVuIG5vZGVzXG4gIG5vZGVTZXBhcmF0aW9uOiA3NSxcbiAgLy8gUG93ZXIgaXRlcmF0aW9uIHRvbGVyYW5jZVxuICBwaVRvbDogMC4wMDAwMDAxLFxuXG4gIC8qIENvU0UgbGF5b3V0IG9wdGlvbnMgKi9cblxuICAvLyBOb2RlIHJlcHVsc2lvbiAobm9uIG92ZXJsYXBwaW5nKSBtdWx0aXBsaWVyXG4gIG5vZGVSZXB1bHNpb246IGZ1bmN0aW9uIG5vZGVSZXB1bHNpb24obm9kZSkge1xuICAgIHJldHVybiA0NTAwO1xuICB9LFxuICAvLyBJZGVhbCBlZGdlIChub24gbmVzdGVkKSBsZW5ndGhcbiAgaWRlYWxFZGdlTGVuZ3RoOiBmdW5jdGlvbiBpZGVhbEVkZ2VMZW5ndGgoZWRnZSkge1xuICAgIHJldHVybiA1MDtcbiAgfSxcbiAgLy8gRGl2aXNvciB0byBjb21wdXRlIGVkZ2UgZm9yY2VzXG4gIGVkZ2VFbGFzdGljaXR5OiBmdW5jdGlvbiBlZGdlRWxhc3RpY2l0eShlZGdlKSB7XG4gICAgcmV0dXJuIDAuNDU7XG4gIH0sXG4gIC8vIE5lc3RpbmcgZmFjdG9yIChtdWx0aXBsaWVyKSB0byBjb21wdXRlIGlkZWFsIGVkZ2UgbGVuZ3RoIGZvciBuZXN0ZWQgZWRnZXNcbiAgbmVzdGluZ0ZhY3RvcjogMC4xLFxuICAvLyBHcmF2aXR5IGZvcmNlIChjb25zdGFudClcbiAgZ3Jhdml0eTogMC4yNSxcbiAgLy8gTWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBwZXJmb3JtXG4gIG51bUl0ZXI6IDI1MDAsXG4gIC8vIEZvciBlbmFibGluZyB0aWxpbmdcbiAgdGlsZTogdHJ1ZSxcbiAgLy8gVGhlIGZ1bmN0aW9uIHRoYXQgc3BlY2lmaWVzIHRoZSBjcml0ZXJpYSBmb3IgY29tcGFyaW5nIG5vZGVzIHdoaWxlIHNvcnRpbmcgdGhlbSBkdXJpbmcgdGlsaW5nIG9wZXJhdGlvbi5cbiAgLy8gVGFrZXMgdGhlIG5vZGUgaWQgYXMgYSBwYXJhbWV0ZXIgYW5kIHRoZSBkZWZhdWx0IHRpbGluZyBvcGVyYXRpb24gaXMgcGVyZm9tZWQgd2hlbiB0aGlzIG9wdGlvbiBpcyBub3Qgc2V0LlxuICB0aWxpbmdDb21wYXJlQnk6IHVuZGVmaW5lZCxcbiAgLy8gUmVwcmVzZW50cyB0aGUgYW1vdW50IG9mIHRoZSB2ZXJ0aWNhbCBzcGFjZSB0byBwdXQgYmV0d2VlbiB0aGUgemVybyBkZWdyZWUgbWVtYmVycyBkdXJpbmcgdGhlIHRpbGluZyBvcGVyYXRpb24oY2FuIGFsc28gYmUgYSBmdW5jdGlvbilcbiAgdGlsaW5nUGFkZGluZ1ZlcnRpY2FsOiAxMCxcbiAgLy8gUmVwcmVzZW50cyB0aGUgYW1vdW50IG9mIHRoZSBob3Jpem9udGFsIHNwYWNlIHRvIHB1dCBiZXR3ZWVuIHRoZSB6ZXJvIGRlZ3JlZSBtZW1iZXJzIGR1cmluZyB0aGUgdGlsaW5nIG9wZXJhdGlvbihjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uKVxuICB0aWxpbmdQYWRkaW5nSG9yaXpvbnRhbDogMTAsXG4gIC8vIEdyYXZpdHkgcmFuZ2UgKGNvbnN0YW50KSBmb3IgY29tcG91bmRzXG4gIGdyYXZpdHlSYW5nZUNvbXBvdW5kOiAxLjUsXG4gIC8vIEdyYXZpdHkgZm9yY2UgKGNvbnN0YW50KSBmb3IgY29tcG91bmRzXG4gIGdyYXZpdHlDb21wb3VuZDogMS4wLFxuICAvLyBHcmF2aXR5IHJhbmdlIChjb25zdGFudClcbiAgZ3Jhdml0eVJhbmdlOiAzLjgsXG4gIC8vIEluaXRpYWwgY29vbGluZyBmYWN0b3IgZm9yIGluY3JlbWVudGFsIGxheW91dCAgXG4gIGluaXRpYWxFbmVyZ3lPbkluY3JlbWVudGFsOiAwLjMsXG5cbiAgLyogY29uc3RyYWludCBvcHRpb25zICovXG5cbiAgLy8gRml4IHJlcXVpcmVkIG5vZGVzIHRvIHByZWRlZmluZWQgcG9zaXRpb25zXG4gIC8vIFt7bm9kZUlkOiAnbjEnLCBwb3NpdGlvbjoge3g6IDEwMCwgeTogMjAwfSwgey4uLn1dXG4gIGZpeGVkTm9kZUNvbnN0cmFpbnQ6IHVuZGVmaW5lZCxcbiAgLy8gQWxpZ24gcmVxdWlyZWQgbm9kZXMgaW4gdmVydGljYWwvaG9yaXpvbnRhbCBkaXJlY3Rpb25cbiAgLy8ge3ZlcnRpY2FsOiBbWyduMScsICduMicpXSwgWyduMycsICduNCddXSwgaG9yaXpvbnRhbDogWyduMicsICduNCddfVxuICBhbGlnbm1lbnRDb25zdHJhaW50OiB1bmRlZmluZWQsXG4gIC8vIFBsYWNlIHR3byBub2RlcyByZWxhdGl2ZWx5IGluIHZlcnRpY2FsL2hvcml6b250YWwgZGlyZWN0aW9uIFxuICAvLyBbe3RvcDogJ24xJywgYm90dG9tOiAnbjInLCBnYXA6IDEwMH0sIHtsZWZ0OiAnbjMnLCByaWdodDogJ240JywgZ2FwOiA3NX1dXG4gIHJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludDogdW5kZWZpbmVkLFxuXG4gIC8qIGxheW91dCBldmVudCBjYWxsYmFja3MgKi9cbiAgcmVhZHk6IGZ1bmN0aW9uIHJlYWR5KCkge30sIC8vIG9uIGxheW91dHJlYWR5XG4gIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7fSAvLyBvbiBsYXlvdXRzdG9wXG59KTtcblxudmFyIExheW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTGF5b3V0KG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGF5b3V0KTtcblxuICAgIHRoaXMub3B0aW9ucyA9IGFzc2lnbih7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKExheW91dCwgW3tcbiAgICBrZXk6ICdydW4nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBydW4oKSB7XG4gICAgICB2YXIgbGF5b3V0ID0gdGhpcztcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgdmFyIGN5ID0gb3B0aW9ucy5jeTtcbiAgICAgIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuXG4gICAgICB2YXIgc3BlY3RyYWxSZXN1bHQgPSBbXTtcbiAgICAgIHZhciB4Q29vcmRzID0gdm9pZCAwO1xuICAgICAgdmFyIHlDb29yZHMgPSB2b2lkIDA7XG4gICAgICB2YXIgY29zZVJlc3VsdCA9IFtdO1xuICAgICAgdmFyIGNvbXBvbmVudHMgPSB2b2lkIDA7XG4gICAgICB2YXIgY29tcG9uZW50Q2VudGVycyA9IFtdO1xuXG4gICAgICAvLyBiYXNpYyB2YWxpZGl0eSBjaGVjayBmb3IgY29uc3RyYWludCBpbnB1dHMgXG4gICAgICBpZiAob3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50ICYmICghQXJyYXkuaXNBcnJheShvcHRpb25zLmZpeGVkTm9kZUNvbnN0cmFpbnQpIHx8IG9wdGlvbnMuZml4ZWROb2RlQ29uc3RyYWludC5sZW5ndGggPT0gMCkpIHtcbiAgICAgICAgb3B0aW9ucy5maXhlZE5vZGVDb25zdHJhaW50ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50KSB7XG4gICAgICAgIGlmIChvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWwgJiYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCkgfHwgb3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50LnZlcnRpY2FsLmxlbmd0aCA9PSAwKSkge1xuICAgICAgICAgIG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWwgJiYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsKSB8fCBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbC5sZW5ndGggPT0gMCkpIHtcbiAgICAgICAgICBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQgJiYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB8fCBvcHRpb25zLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludC5sZW5ndGggPT0gMCkpIHtcbiAgICAgICAgb3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIGFueSBjb25zdHJhaW50IGV4aXN0cywgc2V0IHNvbWUgb3B0aW9uc1xuICAgICAgdmFyIGNvbnN0cmFpbnRFeGlzdCA9IG9wdGlvbnMuZml4ZWROb2RlQ29uc3RyYWludCB8fCBvcHRpb25zLmFsaWdubWVudENvbnN0cmFpbnQgfHwgb3B0aW9ucy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQ7XG4gICAgICBpZiAoY29uc3RyYWludEV4aXN0KSB7XG4gICAgICAgIC8vIGNvbnN0cmFpbnRzIHdvcmsgd2l0aCB0aGVzZSBvcHRpb25zXG4gICAgICAgIG9wdGlvbnMudGlsZSA9IGZhbHNlO1xuICAgICAgICBvcHRpb25zLnBhY2tDb21wb25lbnRzID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIGRlY2lkZSBjb21wb25lbnQgcGFja2luZyBpcyBlbmFibGVkIG9yIG5vdFxuICAgICAgdmFyIGxheVV0aWwgPSB2b2lkIDA7XG4gICAgICB2YXIgcGFja2luZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgIGlmIChjeS5sYXlvdXRVdGlsaXRpZXMgJiYgb3B0aW9ucy5wYWNrQ29tcG9uZW50cykge1xuICAgICAgICBsYXlVdGlsID0gY3kubGF5b3V0VXRpbGl0aWVzKFwiZ2V0XCIpO1xuICAgICAgICBpZiAoIWxheVV0aWwpIGxheVV0aWwgPSBjeS5sYXlvdXRVdGlsaXRpZXMoKTtcbiAgICAgICAgcGFja2luZ0VuYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlcy5ub2RlcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gaWYgcGFja2luZyBpcyBub3QgZW5hYmxlZCwgcGVyZm9ybSBsYXlvdXQgb24gdGhlIHdob2xlIGdyYXBoXG4gICAgICAgIGlmICghcGFja2luZ0VuYWJsZWQpIHtcbiAgICAgICAgICAvLyBzdG9yZSBjb21wb25lbnQgY2VudGVyXG4gICAgICAgICAgdmFyIGJvdW5kaW5nQm94ID0gb3B0aW9ucy5lbGVzLmJvdW5kaW5nQm94KCk7XG4gICAgICAgICAgY29tcG9uZW50Q2VudGVycy5wdXNoKHsgeDogYm91bmRpbmdCb3gueDEgKyBib3VuZGluZ0JveC53IC8gMiwgeTogYm91bmRpbmdCb3gueTEgKyBib3VuZGluZ0JveC5oIC8gMiB9KTtcbiAgICAgICAgICAvLyBhcHBseSBzcGVjdHJhbCBsYXlvdXRcbiAgICAgICAgICBpZiAob3B0aW9ucy5yYW5kb21pemUpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBzcGVjdHJhbExheW91dChvcHRpb25zKTtcbiAgICAgICAgICAgIHNwZWN0cmFsUmVzdWx0LnB1c2gocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gYXBwbHkgY29zZSBsYXlvdXQgYXMgcG9zdHByb2Nlc3NpbmdcbiAgICAgICAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZGVmYXVsdFwiIHx8IG9wdGlvbnMucXVhbGl0eSA9PSBcInByb29mXCIpIHtcbiAgICAgICAgICAgIGNvc2VSZXN1bHQucHVzaChjb3NlTGF5b3V0KG9wdGlvbnMsIHNwZWN0cmFsUmVzdWx0WzBdKSk7XG4gICAgICAgICAgICBhdXgucmVsb2NhdGVDb21wb25lbnQoY29tcG9uZW50Q2VudGVyc1swXSwgY29zZVJlc3VsdFswXSwgb3B0aW9ucyk7IC8vIHJlbG9jYXRlIGNlbnRlciB0byBvcmlnaW5hbCBwb3NpdGlvblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhdXgucmVsb2NhdGVDb21wb25lbnQoY29tcG9uZW50Q2VudGVyc1swXSwgc3BlY3RyYWxSZXN1bHRbMF0sIG9wdGlvbnMpOyAvLyByZWxvY2F0ZSBjZW50ZXIgdG8gb3JpZ2luYWwgcG9zaXRpb25cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcGFja2luZyBpcyBlbmFibGVkXG4gICAgICAgICAgdmFyIHRvcE1vc3ROb2RlcyA9IGF1eC5nZXRUb3BNb3N0Tm9kZXMob3B0aW9ucy5lbGVzLm5vZGVzKCkpO1xuICAgICAgICAgIGNvbXBvbmVudHMgPSBhdXguY29ubmVjdENvbXBvbmVudHMoY3ksIG9wdGlvbnMuZWxlcywgdG9wTW9zdE5vZGVzKTtcbiAgICAgICAgICAvLyBzdG9yZSBjb21wb25lbnQgY2VudGVyc1xuICAgICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICB2YXIgYm91bmRpbmdCb3ggPSBjb21wb25lbnQuYm91bmRpbmdCb3goKTtcbiAgICAgICAgICAgIGNvbXBvbmVudENlbnRlcnMucHVzaCh7IHg6IGJvdW5kaW5nQm94LngxICsgYm91bmRpbmdCb3gudyAvIDIsIHk6IGJvdW5kaW5nQm94LnkxICsgYm91bmRpbmdCb3guaCAvIDIgfSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvL3NlbmQgZWFjaCBjb21wb25lbnQgdG8gc3BlY3RyYWwgbGF5b3V0IGlmIHJhbmRvbWl6ZWRcbiAgICAgICAgICBpZiAob3B0aW9ucy5yYW5kb21pemUpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgIG9wdGlvbnMuZWxlcyA9IGNvbXBvbmVudDtcbiAgICAgICAgICAgICAgc3BlY3RyYWxSZXN1bHQucHVzaChzcGVjdHJhbExheW91dChvcHRpb25zKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZGVmYXVsdFwiIHx8IG9wdGlvbnMucXVhbGl0eSA9PSBcInByb29mXCIpIHtcbiAgICAgICAgICAgIHZhciB0b0JlVGlsZWROb2RlcyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnRpbGUpIHtcbiAgICAgICAgICAgICAgLy8gYmVoYXZlIG5vZGVzIHRvIGJlIHRpbGVkIGFzIG9uZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgdmFyIG5vZGVJbmRleGVzID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgICB2YXIgX3hDb29yZHMgPSBbXTtcbiAgICAgICAgICAgICAgdmFyIF95Q29vcmRzID0gW107XG4gICAgICAgICAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICAgICAgICAgIHZhciB0ZW1wU3BlY3RyYWxSZXN1bHQgPSB7IG5vZGVJbmRleGVzOiBub2RlSW5kZXhlcywgeENvb3JkczogX3hDb29yZHMsIHlDb29yZHM6IF95Q29vcmRzIH07XG4gICAgICAgICAgICAgIHZhciBpbmRleGVzVG9CZURlbGV0ZWQgPSBbXTtcbiAgICAgICAgICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5lZGdlcygpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnQubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlLCBpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvQmVUaWxlZE5vZGVzLm1lcmdlKGNvbXBvbmVudC5ub2RlcygpW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0ZW1wU3BlY3RyYWxSZXN1bHQubm9kZUluZGV4ZXMuc2V0KGNvbXBvbmVudC5ub2RlcygpW2ldLmlkKCksIGNvdW50KyspO1xuICAgICAgICAgICAgICAgICAgICAgIHRlbXBTcGVjdHJhbFJlc3VsdC54Q29vcmRzLnB1c2goY29tcG9uZW50Lm5vZGVzKClbMF0ucG9zaXRpb24oKS54KTtcbiAgICAgICAgICAgICAgICAgICAgICB0ZW1wU3BlY3RyYWxSZXN1bHQueUNvb3Jkcy5wdXNoKGNvbXBvbmVudC5ub2RlcygpWzBdLnBvc2l0aW9uKCkueSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgaW5kZXhlc1RvQmVEZWxldGVkLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmICh0b0JlVGlsZWROb2Rlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9ib3VuZGluZ0JveCA9IHRvQmVUaWxlZE5vZGVzLmJvdW5kaW5nQm94KCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q2VudGVycy5wdXNoKHsgeDogX2JvdW5kaW5nQm94LngxICsgX2JvdW5kaW5nQm94LncgLyAyLCB5OiBfYm91bmRpbmdCb3gueTEgKyBfYm91bmRpbmdCb3guaCAvIDIgfSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKHRvQmVUaWxlZE5vZGVzKTtcbiAgICAgICAgICAgICAgICBzcGVjdHJhbFJlc3VsdC5wdXNoKHRlbXBTcGVjdHJhbFJlc3VsdCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGluZGV4ZXNUb0JlRGVsZXRlZC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5zcGxpY2UoaW5kZXhlc1RvQmVEZWxldGVkW2ldLCAxKTtcbiAgICAgICAgICAgICAgICAgIHNwZWN0cmFsUmVzdWx0LnNwbGljZShpbmRleGVzVG9CZURlbGV0ZWRbaV0sIDEpO1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50Q2VudGVycy5zcGxpY2UoaW5kZXhlc1RvQmVEZWxldGVkW2ldLCAxKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgLy8gc2VuZCBlYWNoIGNvbXBvbmVudCB0byBjb3NlIGxheW91dFxuICAgICAgICAgICAgICBvcHRpb25zLmVsZXMgPSBjb21wb25lbnQ7XG4gICAgICAgICAgICAgIGNvc2VSZXN1bHQucHVzaChjb3NlTGF5b3V0KG9wdGlvbnMsIHNwZWN0cmFsUmVzdWx0W2luZGV4XSkpO1xuICAgICAgICAgICAgICBhdXgucmVsb2NhdGVDb21wb25lbnQoY29tcG9uZW50Q2VudGVyc1tpbmRleF0sIGNvc2VSZXN1bHRbaW5kZXhdLCBvcHRpb25zKTsgLy8gcmVsb2NhdGUgY2VudGVyIHRvIG9yaWdpbmFsIHBvc2l0aW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQsIGluZGV4KSB7XG4gICAgICAgICAgICAgIGF1eC5yZWxvY2F0ZUNvbXBvbmVudChjb21wb25lbnRDZW50ZXJzW2luZGV4XSwgc3BlY3RyYWxSZXN1bHRbaW5kZXhdLCBvcHRpb25zKTsgLy8gcmVsb2NhdGUgY2VudGVyIHRvIG9yaWdpbmFsIHBvc2l0aW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBwYWNraW5nXG4gICAgICAgICAgdmFyIGNvbXBvbmVudHNFdmFsdWF0ZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgaWYgKGNvbXBvbmVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdmFyIHN1YmdyYXBocyA9IFtdO1xuICAgICAgICAgICAgdmFyIGhpZGRlbkVsZXMgPSBlbGVzLmZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbGUuY3NzKCdkaXNwbGF5JykgPT0gJ25vbmUnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgdmFyIG5vZGVJbmRleGVzID0gdm9pZCAwO1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZHJhZnRcIikge1xuICAgICAgICAgICAgICAgIG5vZGVJbmRleGVzID0gc3BlY3RyYWxSZXN1bHRbaW5kZXhdLm5vZGVJbmRleGVzO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5ub2RlcygpLm5vdChoaWRkZW5FbGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1YmdyYXBoID0ge307XG4gICAgICAgICAgICAgICAgc3ViZ3JhcGguZWRnZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBzdWJncmFwaC5ub2RlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBub2RlSW5kZXggPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Lm5vZGVzKCkubm90KGhpZGRlbkVsZXMpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkcmFmdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9kZS5pc1BhcmVudCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgbm9kZUluZGV4ID0gbm9kZUluZGV4ZXMuZ2V0KG5vZGUuaWQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgc3ViZ3JhcGgubm9kZXMucHVzaCh7IHg6IHNwZWN0cmFsUmVzdWx0W2luZGV4XS54Q29vcmRzW25vZGVJbmRleF0gLSBub2RlLmJvdW5kaW5nYm94KCkudyAvIDIsIHk6IHNwZWN0cmFsUmVzdWx0W2luZGV4XS55Q29vcmRzW25vZGVJbmRleF0gLSBub2RlLmJvdW5kaW5nYm94KCkuaCAvIDIsIHdpZHRoOiBub2RlLmJvdW5kaW5nYm94KCkudywgaGVpZ2h0OiBub2RlLmJvdW5kaW5nYm94KCkuaCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50SW5mbyA9IGF1eC5jYWxjQm91bmRpbmdCb3gobm9kZSwgc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnhDb29yZHMsIHNwZWN0cmFsUmVzdWx0W2luZGV4XS55Q29vcmRzLCBub2RlSW5kZXhlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgc3ViZ3JhcGgubm9kZXMucHVzaCh7IHg6IHBhcmVudEluZm8udG9wTGVmdFgsIHk6IHBhcmVudEluZm8udG9wTGVmdFksIHdpZHRoOiBwYXJlbnRJbmZvLndpZHRoLCBoZWlnaHQ6IHBhcmVudEluZm8uaGVpZ2h0IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29zZVJlc3VsdFtpbmRleF1bbm9kZS5pZCgpXSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN1YmdyYXBoLm5vZGVzLnB1c2goeyB4OiBjb3NlUmVzdWx0W2luZGV4XVtub2RlLmlkKCldLmdldExlZnQoKSwgeTogY29zZVJlc3VsdFtpbmRleF1bbm9kZS5pZCgpXS5nZXRUb3AoKSwgd2lkdGg6IGNvc2VSZXN1bHRbaW5kZXhdW25vZGUuaWQoKV0uZ2V0V2lkdGgoKSwgaGVpZ2h0OiBjb3NlUmVzdWx0W2luZGV4XVtub2RlLmlkKCldLmdldEhlaWdodCgpIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGVkZ2Uuc291cmNlKCk7XG4gICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZWRnZS50YXJnZXQoKTtcbiAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuY3NzKFwiZGlzcGxheVwiKSAhPSBcIm5vbmVcIiAmJiB0YXJnZXQuY3NzKFwiZGlzcGxheVwiKSAhPSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZHJhZnRcIikge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciBzb3VyY2VOb2RlSW5kZXggPSBub2RlSW5kZXhlcy5nZXQoc291cmNlLmlkKCkpO1xuICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXROb2RlSW5kZXggPSBub2RlSW5kZXhlcy5nZXQodGFyZ2V0LmlkKCkpO1xuICAgICAgICAgICAgICAgICAgICAgIHZhciBzb3VyY2VDZW50ZXIgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0Q2VudGVyID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5pc1BhcmVudCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50SW5mbyA9IGF1eC5jYWxjQm91bmRpbmdCb3goc291cmNlLCBzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkcywgc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnlDb29yZHMsIG5vZGVJbmRleGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNlbnRlci5wdXNoKHBhcmVudEluZm8udG9wTGVmdFggKyBwYXJlbnRJbmZvLndpZHRoIC8gMik7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDZW50ZXIucHVzaChwYXJlbnRJbmZvLnRvcExlZnRZICsgcGFyZW50SW5mby5oZWlnaHQgLyAyKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ2VudGVyLnB1c2goc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnhDb29yZHNbc291cmNlTm9kZUluZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDZW50ZXIucHVzaChzcGVjdHJhbFJlc3VsdFtpbmRleF0ueUNvb3Jkc1tzb3VyY2VOb2RlSW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5pc1BhcmVudCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3BhcmVudEluZm8gPSBhdXguY2FsY0JvdW5kaW5nQm94KHRhcmdldCwgc3BlY3RyYWxSZXN1bHRbaW5kZXhdLnhDb29yZHMsIHNwZWN0cmFsUmVzdWx0W2luZGV4XS55Q29vcmRzLCBub2RlSW5kZXhlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRDZW50ZXIucHVzaChfcGFyZW50SW5mby50b3BMZWZ0WCArIF9wYXJlbnRJbmZvLndpZHRoIC8gMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRDZW50ZXIucHVzaChfcGFyZW50SW5mby50b3BMZWZ0WSArIF9wYXJlbnRJbmZvLmhlaWdodCAvIDIpO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRDZW50ZXIucHVzaChzcGVjdHJhbFJlc3VsdFtpbmRleF0ueENvb3Jkc1t0YXJnZXROb2RlSW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldENlbnRlci5wdXNoKHNwZWN0cmFsUmVzdWx0W2luZGV4XS55Q29vcmRzW3RhcmdldE5vZGVJbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBzdWJncmFwaC5lZGdlcy5wdXNoKHsgc3RhcnRYOiBzb3VyY2VDZW50ZXJbMF0sIHN0YXJ0WTogc291cmNlQ2VudGVyWzFdLCBlbmRYOiB0YXJnZXRDZW50ZXJbMF0sIGVuZFk6IHRhcmdldENlbnRlclsxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY29zZVJlc3VsdFtpbmRleF1bc291cmNlLmlkKCldICYmIGNvc2VSZXN1bHRbaW5kZXhdW3RhcmdldC5pZCgpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3ViZ3JhcGguZWRnZXMucHVzaCh7IHN0YXJ0WDogY29zZVJlc3VsdFtpbmRleF1bc291cmNlLmlkKCldLmdldENlbnRlclgoKSwgc3RhcnRZOiBjb3NlUmVzdWx0W2luZGV4XVtzb3VyY2UuaWQoKV0uZ2V0Q2VudGVyWSgpLCBlbmRYOiBjb3NlUmVzdWx0W2luZGV4XVt0YXJnZXQuaWQoKV0uZ2V0Q2VudGVyWCgpLCBlbmRZOiBjb3NlUmVzdWx0W2luZGV4XVt0YXJnZXQuaWQoKV0uZ2V0Q2VudGVyWSgpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChzdWJncmFwaC5ub2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBzdWJncmFwaHMucHVzaChzdWJncmFwaCk7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRzRXZhbHVhdGVkLmFkZChpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBzaGlmdFJlc3VsdCA9IGxheVV0aWwucGFja0NvbXBvbmVudHMoc3ViZ3JhcGhzLCBvcHRpb25zLnJhbmRvbWl6ZSkuc2hpZnRzO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucXVhbGl0eSA9PSBcImRyYWZ0XCIpIHtcbiAgICAgICAgICAgICAgc3BlY3RyYWxSZXN1bHQuZm9yRWFjaChmdW5jdGlvbiAocmVzdWx0LCBpbmRleCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXdYQ29vcmRzID0gcmVzdWx0LnhDb29yZHMubWFwKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4geCArIHNoaWZ0UmVzdWx0W2luZGV4XS5keDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB2YXIgbmV3WUNvb3JkcyA9IHJlc3VsdC55Q29vcmRzLm1hcChmdW5jdGlvbiAoeSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHkgKyBzaGlmdFJlc3VsdFtpbmRleF0uZHk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnhDb29yZHMgPSBuZXdYQ29vcmRzO1xuICAgICAgICAgICAgICAgIHJlc3VsdC55Q29vcmRzID0gbmV3WUNvb3JkcztcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgX2NvdW50ID0gMDtcbiAgICAgICAgICAgICAgY29tcG9uZW50c0V2YWx1YXRlZC5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGNvc2VSZXN1bHRbaW5kZXhdKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgbm9kZVJlY3RhbmdsZSA9IGNvc2VSZXN1bHRbaW5kZXhdW2l0ZW1dO1xuICAgICAgICAgICAgICAgICAgbm9kZVJlY3RhbmdsZS5zZXRDZW50ZXIobm9kZVJlY3RhbmdsZS5nZXRDZW50ZXJYKCkgKyBzaGlmdFJlc3VsdFtfY291bnRdLmR4LCBub2RlUmVjdGFuZ2xlLmdldENlbnRlclkoKSArIHNoaWZ0UmVzdWx0W19jb3VudF0uZHkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIF9jb3VudCsrO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZ2V0IGVhY2ggZWxlbWVudCdzIGNhbGN1bGF0ZWQgcG9zaXRpb25cbiAgICAgIHZhciBnZXRQb3NpdGlvbnMgPSBmdW5jdGlvbiBnZXRQb3NpdGlvbnMoZWxlLCBpKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPT0gXCJkZWZhdWx0XCIgfHwgb3B0aW9ucy5xdWFsaXR5ID09IFwicHJvb2ZcIikge1xuICAgICAgICAgIGlmICh0eXBlb2YgZWxlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBlbGUgPSBpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgcG9zID0gdm9pZCAwO1xuICAgICAgICAgIHZhciBub2RlID0gdm9pZCAwO1xuICAgICAgICAgIHZhciB0aGVJZCA9IGVsZS5kYXRhKCdpZCcpO1xuICAgICAgICAgIGNvc2VSZXN1bHQuZm9yRWFjaChmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAodGhlSWQgaW4gcmVzdWx0KSB7XG4gICAgICAgICAgICAgIHBvcyA9IHsgeDogcmVzdWx0W3RoZUlkXS5nZXRSZWN0KCkuZ2V0Q2VudGVyWCgpLCB5OiByZXN1bHRbdGhlSWRdLmdldFJlY3QoKS5nZXRDZW50ZXJZKCkgfTtcbiAgICAgICAgICAgICAgbm9kZSA9IHJlc3VsdFt0aGVJZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKG9wdGlvbnMubm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5sYWJlbFdpZHRoKSB7XG4gICAgICAgICAgICAgIGlmIChub2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcImxlZnRcIikge1xuICAgICAgICAgICAgICAgIHBvcy54ICs9IG5vZGUubGFiZWxXaWR0aCAvIDI7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICAgICAgcG9zLnggLT0gbm9kZS5sYWJlbFdpZHRoIC8gMjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUubGFiZWxIZWlnaHQpIHtcbiAgICAgICAgICAgICAgaWYgKG5vZGUubGFiZWxQb3NWZXJ0aWNhbCA9PSBcInRvcFwiKSB7XG4gICAgICAgICAgICAgICAgcG9zLnkgKz0gbm9kZS5sYWJlbEhlaWdodCAvIDI7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwiYm90dG9tXCIpIHtcbiAgICAgICAgICAgICAgICBwb3MueSAtPSBub2RlLmxhYmVsSGVpZ2h0IC8gMjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocG9zID09IHVuZGVmaW5lZCkgcG9zID0geyB4OiBlbGUucG9zaXRpb24oXCJ4XCIpLCB5OiBlbGUucG9zaXRpb24oXCJ5XCIpIH07XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHBvcy54LFxuICAgICAgICAgICAgeTogcG9zLnlcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfcG9zID0gdm9pZCAwO1xuICAgICAgICAgIHNwZWN0cmFsUmVzdWx0LmZvckVhY2goZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gcmVzdWx0Lm5vZGVJbmRleGVzLmdldChlbGUuaWQoKSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIF9wb3MgPSB7IHg6IHJlc3VsdC54Q29vcmRzW2luZGV4XSwgeTogcmVzdWx0LnlDb29yZHNbaW5kZXhdIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKF9wb3MgPT0gdW5kZWZpbmVkKSBfcG9zID0geyB4OiBlbGUucG9zaXRpb24oXCJ4XCIpLCB5OiBlbGUucG9zaXRpb24oXCJ5XCIpIH07XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IF9wb3MueCxcbiAgICAgICAgICAgIHk6IF9wb3MueVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIHF1YWxpdHkgPSBcImRyYWZ0XCIgYW5kIHJhbmRvbWl6ZSA9IGZhbHNlIGFyZSBjb250cmFkaWN0aXZlIHNvIGluIHRoYXQgY2FzZSBwb3NpdGlvbnMgZG9uJ3QgY2hhbmdlXG4gICAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZGVmYXVsdFwiIHx8IG9wdGlvbnMucXVhbGl0eSA9PSBcInByb29mXCIgfHwgb3B0aW9ucy5yYW5kb21pemUpIHtcbiAgICAgICAgLy8gdHJhbnNmZXIgY2FsY3VsYXRlZCBwb3NpdGlvbnMgdG8gbm9kZXMgKHBvc2l0aW9ucyBvZiBvbmx5IHNpbXBsZSBub2RlcyBhcmUgZXZhbHVhdGVkLCBjb21wb3VuZHMgYXJlIHBvc2l0aW9uZWQgYXV0b21hdGljYWxseSlcbiAgICAgICAgdmFyIHBhcmVudHNXaXRob3V0Q2hpbGRyZW4gPSBhdXguY2FsY1BhcmVudHNXaXRob3V0Q2hpbGRyZW4oY3ksIGVsZXMpO1xuICAgICAgICB2YXIgX2hpZGRlbkVsZXMgPSBlbGVzLmZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZS5jc3MoJ2Rpc3BsYXknKSA9PSAnbm9uZSc7XG4gICAgICAgIH0pO1xuICAgICAgICBvcHRpb25zLmVsZXMgPSBlbGVzLm5vdChfaGlkZGVuRWxlcyk7XG5cbiAgICAgICAgZWxlcy5ub2RlcygpLm5vdChcIjpwYXJlbnRcIikubm90KF9oaWRkZW5FbGVzKS5sYXlvdXRQb3NpdGlvbnMobGF5b3V0LCBvcHRpb25zLCBnZXRQb3NpdGlvbnMpO1xuXG4gICAgICAgIGlmIChwYXJlbnRzV2l0aG91dENoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBwYXJlbnRzV2l0aG91dENoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgZWxlLnBvc2l0aW9uKGdldFBvc2l0aW9ucyhlbGUpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJJZiByYW5kb21pemUgb3B0aW9uIGlzIHNldCB0byBmYWxzZSwgdGhlbiBxdWFsaXR5IG9wdGlvbiBtdXN0IGJlICdkZWZhdWx0JyBvciAncHJvb2YnLlwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTGF5b3V0O1xufSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExheW91dDtcblxuLyoqKi8gfSksXG5cbi8qKiovIDY1Nzpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbi8qKlxuICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNwZWN0cmFsIGxheW91dCB0aGF0IGlzIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBmY29zZSBsYXlvdXQgYWxnb3JpdGhtXG4qL1xuXG52YXIgYXV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NDgpO1xudmFyIE1hdHJpeCA9IF9fd2VicGFja19yZXF1aXJlX18oMTQwKS5sYXlvdXRCYXNlLk1hdHJpeDtcbnZhciBTVkQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0MCkubGF5b3V0QmFzZS5TVkQ7XG5cbi8vIG1haW4gZnVuY3Rpb24gdGhhdCBzcGVjdHJhbCBsYXlvdXQgaXMgcHJvY2Vzc2VkXG52YXIgc3BlY3RyYWxMYXlvdXQgPSBmdW5jdGlvbiBzcGVjdHJhbExheW91dChvcHRpb25zKSB7XG5cbiAgdmFyIGN5ID0gb3B0aW9ucy5jeTtcbiAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG4gIHZhciBub2RlcyA9IGVsZXMubm9kZXMoKTtcbiAgdmFyIHBhcmVudE5vZGVzID0gZWxlcy5ub2RlcyhcIjpwYXJlbnRcIik7XG5cbiAgdmFyIGR1bW15Tm9kZXMgPSBuZXcgTWFwKCk7IC8vIG1hcCB0byBrZWVwIGR1bW15IG5vZGVzIGFuZCB0aGVpciBuZWlnaGJvcnNcbiAgdmFyIG5vZGVJbmRleGVzID0gbmV3IE1hcCgpOyAvLyBtYXAgdG8ga2VlcCBpbmRleGVzIHRvIG5vZGVzXG4gIHZhciBwYXJlbnRDaGlsZE1hcCA9IG5ldyBNYXAoKTsgLy8gbWFwcGluZyBidHcuIGNvbXBvdW5kIGFuZCBpdHMgcmVwcmVzZW50YXRpdmUgbm9kZSBcbiAgdmFyIGFsbE5vZGVzTmVpZ2hib3Job29kID0gW107IC8vIGFycmF5IHRvIGtlZXAgbmVpZ2hib3Job29kIG9mIGFsbCBub2Rlc1xuICB2YXIgeENvb3JkcyA9IFtdO1xuICB2YXIgeUNvb3JkcyA9IFtdO1xuXG4gIHZhciBzYW1wbGVzQ29sdW1uID0gW107IC8vIHNhbXBsZWQgdmVydGljZXNcbiAgdmFyIG1pbkRpc3RhbmNlc0NvbHVtbiA9IFtdO1xuICB2YXIgQyA9IFtdOyAvLyBjb2x1bW4gc2FtcGxpbmcgbWF0cml4XG4gIHZhciBQSEkgPSBbXTsgLy8gaW50ZXJzZWN0aW9uIG9mIGNvbHVtbiBhbmQgcm93IHNhbXBsaW5nIG1hdHJpY2VzIFxuICB2YXIgSU5WID0gW107IC8vIGludmVyc2Ugb2YgUEhJIFxuXG4gIHZhciBmaXJzdFNhbXBsZSA9IHZvaWQgMDsgLy8gdGhlIGZpcnN0IHNhbXBsZWQgbm9kZVxuICB2YXIgbm9kZVNpemUgPSB2b2lkIDA7XG5cbiAgdmFyIGluZmluaXR5ID0gMTAwMDAwMDAwO1xuICB2YXIgc21hbGwgPSAwLjAwMDAwMDAwMTtcblxuICB2YXIgcGlUb2wgPSBvcHRpb25zLnBpVG9sO1xuICB2YXIgc2FtcGxpbmdUeXBlID0gb3B0aW9ucy5zYW1wbGluZ1R5cGU7IC8vIGZhbHNlIGZvciByYW5kb20sIHRydWUgZm9yIGdyZWVkeVxuICB2YXIgbm9kZVNlcGFyYXRpb24gPSBvcHRpb25zLm5vZGVTZXBhcmF0aW9uO1xuICB2YXIgc2FtcGxlU2l6ZSA9IHZvaWQgMDtcblxuICAvKioqKiBTcGVjdHJhbC1wcmVwcm9jZXNzaW5nIGZ1bmN0aW9ucyAqKioqL1xuXG4gIC8qKioqIFNwZWN0cmFsIGxheW91dCBmdW5jdGlvbnMgKioqKi9cblxuICAvLyBkZXRlcm1pbmUgd2hpY2ggY29sdW1ucyB0byBiZSBzYW1wbGVkXG4gIHZhciByYW5kb21TYW1wbGVDUiA9IGZ1bmN0aW9uIHJhbmRvbVNhbXBsZUNSKCkge1xuICAgIHZhciBzYW1wbGUgPSAwO1xuICAgIHZhciBjb3VudCA9IDA7XG4gICAgdmFyIGZsYWcgPSBmYWxzZTtcblxuICAgIHdoaWxlIChjb3VudCA8IHNhbXBsZVNpemUpIHtcbiAgICAgIHNhbXBsZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vZGVTaXplKTtcblxuICAgICAgZmxhZyA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgIGlmIChzYW1wbGVzQ29sdW1uW2ldID09IHNhbXBsZSkge1xuICAgICAgICAgIGZsYWcgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghZmxhZykge1xuICAgICAgICBzYW1wbGVzQ29sdW1uW2NvdW50XSA9IHNhbXBsZTtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyB0YWtlcyB0aGUgaW5kZXggb2YgdGhlIG5vZGUocGl2b3QpIHRvIGluaXRpYXRlIEJGUyBhcyBhIHBhcmFtZXRlclxuICB2YXIgQkZTID0gZnVuY3Rpb24gQkZTKHBpdm90LCBpbmRleCwgc2FtcGxpbmdNZXRob2QpIHtcbiAgICB2YXIgcGF0aCA9IFtdOyAvLyB0aGUgZnJvbnQgb2YgdGhlIHBhdGhcbiAgICB2YXIgZnJvbnQgPSAwOyAvLyB0aGUgYmFjayBvZiB0aGUgcGF0aFxuICAgIHZhciBiYWNrID0gMDtcbiAgICB2YXIgY3VycmVudCA9IDA7XG4gICAgdmFyIHRlbXAgPSB2b2lkIDA7XG4gICAgdmFyIGRpc3RhbmNlID0gW107XG5cbiAgICB2YXIgbWF4X2Rpc3QgPSAwOyAvLyB0aGUgZnVydGhlc3Qgbm9kZSB0byBiZSByZXR1cm5lZFxuICAgIHZhciBtYXhfaW5kID0gMTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZVNpemU7IGkrKykge1xuICAgICAgZGlzdGFuY2VbaV0gPSBpbmZpbml0eTtcbiAgICB9XG5cbiAgICBwYXRoW2JhY2tdID0gcGl2b3Q7XG4gICAgZGlzdGFuY2VbcGl2b3RdID0gMDtcblxuICAgIHdoaWxlIChiYWNrID49IGZyb250KSB7XG4gICAgICBjdXJyZW50ID0gcGF0aFtmcm9udCsrXTtcbiAgICAgIHZhciBuZWlnaGJvcnMgPSBhbGxOb2Rlc05laWdoYm9yaG9vZFtjdXJyZW50XTtcbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBuZWlnaGJvcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHRlbXAgPSBub2RlSW5kZXhlcy5nZXQobmVpZ2hib3JzW19pXSk7XG4gICAgICAgIGlmIChkaXN0YW5jZVt0ZW1wXSA9PSBpbmZpbml0eSkge1xuICAgICAgICAgIGRpc3RhbmNlW3RlbXBdID0gZGlzdGFuY2VbY3VycmVudF0gKyAxO1xuICAgICAgICAgIHBhdGhbKytiYWNrXSA9IHRlbXA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIENbY3VycmVudF1baW5kZXhdID0gZGlzdGFuY2VbY3VycmVudF0gKiBub2RlU2VwYXJhdGlvbjtcbiAgICB9XG5cbiAgICBpZiAoc2FtcGxpbmdNZXRob2QpIHtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG5vZGVTaXplOyBfaTIrKykge1xuICAgICAgICBpZiAoQ1tfaTJdW2luZGV4XSA8IG1pbkRpc3RhbmNlc0NvbHVtbltfaTJdKSBtaW5EaXN0YW5jZXNDb2x1bW5bX2kyXSA9IENbX2kyXVtpbmRleF07XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IG5vZGVTaXplOyBfaTMrKykge1xuICAgICAgICBpZiAobWluRGlzdGFuY2VzQ29sdW1uW19pM10gPiBtYXhfZGlzdCkge1xuICAgICAgICAgIG1heF9kaXN0ID0gbWluRGlzdGFuY2VzQ29sdW1uW19pM107XG4gICAgICAgICAgbWF4X2luZCA9IF9pMztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWF4X2luZDtcbiAgfTtcblxuICAvLyBhcHBseSBCRlMgdG8gYWxsIG5vZGVzIG9yIHNlbGVjdGVkIHNhbXBsZXNcbiAgdmFyIGFsbEJGUyA9IGZ1bmN0aW9uIGFsbEJGUyhzYW1wbGluZ01ldGhvZCkge1xuXG4gICAgdmFyIHNhbXBsZSA9IHZvaWQgMDtcblxuICAgIGlmICghc2FtcGxpbmdNZXRob2QpIHtcbiAgICAgIHJhbmRvbVNhbXBsZUNSKCk7XG5cbiAgICAgIC8vIGNhbGwgQkZTXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNhbXBsZVNpemU7IGkrKykge1xuICAgICAgICBCRlMoc2FtcGxlc0NvbHVtbltpXSwgaSwgc2FtcGxpbmdNZXRob2QsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2FtcGxlID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbm9kZVNpemUpO1xuICAgICAgZmlyc3RTYW1wbGUgPSBzYW1wbGU7XG5cbiAgICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG5vZGVTaXplOyBfaTQrKykge1xuICAgICAgICBtaW5EaXN0YW5jZXNDb2x1bW5bX2k0XSA9IGluZmluaXR5O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBzYW1wbGVTaXplOyBfaTUrKykge1xuICAgICAgICBzYW1wbGVzQ29sdW1uW19pNV0gPSBzYW1wbGU7XG4gICAgICAgIHNhbXBsZSA9IEJGUyhzYW1wbGUsIF9pNSwgc2FtcGxpbmdNZXRob2QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZvcm0gdGhlIHNxdWFyZWQgZGlzdGFuY2VzIGZvciBDXG4gICAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgbm9kZVNpemU7IF9pNisrKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNhbXBsZVNpemU7IGorKykge1xuICAgICAgICBDW19pNl1bal0gKj0gQ1tfaTZdW2pdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZvcm0gUEhJXG4gICAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgc2FtcGxlU2l6ZTsgX2k3KyspIHtcbiAgICAgIFBISVtfaTddID0gW107XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2k4ID0gMDsgX2k4IDwgc2FtcGxlU2l6ZTsgX2k4KyspIHtcbiAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBzYW1wbGVTaXplOyBfaisrKSB7XG4gICAgICAgIFBISVtfaThdW19qXSA9IENbc2FtcGxlc0NvbHVtbltfal1dW19pOF07XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIHBlcmZvcm0gdGhlIFNWRCBhbGdvcml0aG0gYW5kIGFwcGx5IGEgcmVndWxhcml6YXRpb24gc3RlcFxuICB2YXIgc2FtcGxlID0gZnVuY3Rpb24gc2FtcGxlKCkge1xuXG4gICAgdmFyIFNWRFJlc3VsdCA9IFNWRC5zdmQoUEhJKTtcblxuICAgIHZhciBhX3EgPSBTVkRSZXN1bHQuUztcbiAgICB2YXIgYV91ID0gU1ZEUmVzdWx0LlU7XG4gICAgdmFyIGFfdiA9IFNWRFJlc3VsdC5WO1xuXG4gICAgdmFyIG1heF9zID0gYV9xWzBdICogYV9xWzBdICogYV9xWzBdO1xuXG4gICAgdmFyIGFfU2lnID0gW107XG5cbiAgICAvLyAgcmVndWxhcml6YXRpb25cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNhbXBsZVNpemU7IGkrKykge1xuICAgICAgYV9TaWdbaV0gPSBbXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2FtcGxlU2l6ZTsgaisrKSB7XG4gICAgICAgIGFfU2lnW2ldW2pdID0gMDtcbiAgICAgICAgaWYgKGkgPT0gaikge1xuICAgICAgICAgIGFfU2lnW2ldW2pdID0gYV9xW2ldIC8gKGFfcVtpXSAqIGFfcVtpXSArIG1heF9zIC8gKGFfcVtpXSAqIGFfcVtpXSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgSU5WID0gTWF0cml4Lm11bHRNYXQoTWF0cml4Lm11bHRNYXQoYV92LCBhX1NpZyksIE1hdHJpeC50cmFuc3Bvc2UoYV91KSk7XG4gIH07XG5cbiAgLy8gY2FsY3VsYXRlIGZpbmFsIGNvb3JkaW5hdGVzIFxuICB2YXIgcG93ZXJJdGVyYXRpb24gPSBmdW5jdGlvbiBwb3dlckl0ZXJhdGlvbigpIHtcbiAgICAvLyB0d28gbGFyZ2VzdCBlaWdlbnZhbHVlc1xuICAgIHZhciB0aGV0YTEgPSB2b2lkIDA7XG4gICAgdmFyIHRoZXRhMiA9IHZvaWQgMDtcblxuICAgIC8vIGluaXRpYWwgZ3Vlc3NlcyBmb3IgZWlnZW52ZWN0b3JzXG4gICAgdmFyIFkxID0gW107XG4gICAgdmFyIFkyID0gW107XG5cbiAgICB2YXIgVjEgPSBbXTtcbiAgICB2YXIgVjIgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZVNpemU7IGkrKykge1xuICAgICAgWTFbaV0gPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgWTJbaV0gPSBNYXRoLnJhbmRvbSgpO1xuICAgIH1cblxuICAgIFkxID0gTWF0cml4Lm5vcm1hbGl6ZShZMSk7XG4gICAgWTIgPSBNYXRyaXgubm9ybWFsaXplKFkyKTtcblxuICAgIHZhciBjb3VudCA9IDA7XG4gICAgLy8gdG8ga2VlcCB0cmFjayBvZiB0aGUgaW1wcm92ZW1lbnQgcmF0aW8gaW4gcG93ZXIgaXRlcmF0aW9uXG4gICAgdmFyIGN1cnJlbnQgPSBzbWFsbDtcbiAgICB2YXIgcHJldmlvdXMgPSBzbWFsbDtcblxuICAgIHZhciB0ZW1wID0gdm9pZCAwO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvdW50Kys7XG5cbiAgICAgIGZvciAodmFyIF9pOSA9IDA7IF9pOSA8IG5vZGVTaXplOyBfaTkrKykge1xuICAgICAgICBWMVtfaTldID0gWTFbX2k5XTtcbiAgICAgIH1cblxuICAgICAgWTEgPSBNYXRyaXgubXVsdEdhbW1hKE1hdHJpeC5tdWx0TChNYXRyaXgubXVsdEdhbW1hKFYxKSwgQywgSU5WKSk7XG4gICAgICB0aGV0YTEgPSBNYXRyaXguZG90UHJvZHVjdChWMSwgWTEpO1xuICAgICAgWTEgPSBNYXRyaXgubm9ybWFsaXplKFkxKTtcblxuICAgICAgY3VycmVudCA9IE1hdHJpeC5kb3RQcm9kdWN0KFYxLCBZMSk7XG5cbiAgICAgIHRlbXAgPSBNYXRoLmFicyhjdXJyZW50IC8gcHJldmlvdXMpO1xuXG4gICAgICBpZiAodGVtcCA8PSAxICsgcGlUb2wgJiYgdGVtcCA+PSAxKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2kxMCA9IDA7IF9pMTAgPCBub2RlU2l6ZTsgX2kxMCsrKSB7XG4gICAgICBWMVtfaTEwXSA9IFkxW19pMTBdO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2aW91cyA9IHNtYWxsO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb3VudCsrO1xuXG4gICAgICBmb3IgKHZhciBfaTExID0gMDsgX2kxMSA8IG5vZGVTaXplOyBfaTExKyspIHtcbiAgICAgICAgVjJbX2kxMV0gPSBZMltfaTExXTtcbiAgICAgIH1cblxuICAgICAgVjIgPSBNYXRyaXgubWludXNPcChWMiwgTWF0cml4Lm11bHRDb25zKFYxLCBNYXRyaXguZG90UHJvZHVjdChWMSwgVjIpKSk7XG4gICAgICBZMiA9IE1hdHJpeC5tdWx0R2FtbWEoTWF0cml4Lm11bHRMKE1hdHJpeC5tdWx0R2FtbWEoVjIpLCBDLCBJTlYpKTtcbiAgICAgIHRoZXRhMiA9IE1hdHJpeC5kb3RQcm9kdWN0KFYyLCBZMik7XG4gICAgICBZMiA9IE1hdHJpeC5ub3JtYWxpemUoWTIpO1xuXG4gICAgICBjdXJyZW50ID0gTWF0cml4LmRvdFByb2R1Y3QoVjIsIFkyKTtcblxuICAgICAgdGVtcCA9IE1hdGguYWJzKGN1cnJlbnQgLyBwcmV2aW91cyk7XG5cbiAgICAgIGlmICh0ZW1wIDw9IDEgKyBwaVRvbCAmJiB0ZW1wID49IDEpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzID0gY3VycmVudDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaTEyID0gMDsgX2kxMiA8IG5vZGVTaXplOyBfaTEyKyspIHtcbiAgICAgIFYyW19pMTJdID0gWTJbX2kxMl07XG4gICAgfVxuXG4gICAgLy8gdGhldGExIG5vdyBjb250YWlucyBkb21pbmFudCBlaWdlbnZhbHVlXG4gICAgLy8gdGhldGEyIG5vdyBjb250YWlucyB0aGUgc2Vjb25kLWxhcmdlc3QgZWlnZW52YWx1ZVxuICAgIC8vIFYxIG5vdyBjb250YWlucyB0aGV0YTEncyBlaWdlbnZlY3RvclxuICAgIC8vIFYyIG5vdyBjb250YWlucyB0aGV0YTIncyBlaWdlbnZlY3RvclxuXG4gICAgLy9wb3B1bGF0ZSB0aGUgdHdvIHZlY3RvcnNcbiAgICB4Q29vcmRzID0gTWF0cml4Lm11bHRDb25zKFYxLCBNYXRoLnNxcnQoTWF0aC5hYnModGhldGExKSkpO1xuICAgIHlDb29yZHMgPSBNYXRyaXgubXVsdENvbnMoVjIsIE1hdGguc3FydChNYXRoLmFicyh0aGV0YTIpKSk7XG4gIH07XG5cbiAgLyoqKiogUHJlcGFyYXRpb24gZm9yIHNwZWN0cmFsIGxheW91dCAoUHJlcHJvY2Vzc2luZykgKioqKi9cblxuICAvLyBjb25uZWN0IGRpc2Nvbm5lY3RlZCBjb21wb25lbnRzIChmaXJzdCB0b3AgbGV2ZWwsIHRoZW4gaW5zaWRlIG9mIGVhY2ggY29tcG91bmQgbm9kZSlcbiAgYXV4LmNvbm5lY3RDb21wb25lbnRzKGN5LCBlbGVzLCBhdXguZ2V0VG9wTW9zdE5vZGVzKG5vZGVzKSwgZHVtbXlOb2Rlcyk7XG5cbiAgcGFyZW50Tm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgYXV4LmNvbm5lY3RDb21wb25lbnRzKGN5LCBlbGVzLCBhdXguZ2V0VG9wTW9zdE5vZGVzKGVsZS5kZXNjZW5kYW50cygpLmludGVyc2VjdGlvbihlbGVzKSksIGR1bW15Tm9kZXMpO1xuICB9KTtcblxuICAvLyBhc3NpZ24gaW5kZXhlcyB0byBub2RlcyAoZmlyc3QgcmVhbCwgdGhlbiBkdW1teSBub2RlcylcbiAgdmFyIGluZGV4ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmICghbm9kZXNbaV0uaXNQYXJlbnQoKSkge1xuICAgICAgbm9kZUluZGV4ZXMuc2V0KG5vZGVzW2ldLmlkKCksIGluZGV4KyspO1xuICAgIH1cbiAgfVxuXG4gIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgdmFyIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG4gIHZhciBfaXRlcmF0b3JFcnJvciA9IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IGR1bW15Tm9kZXMua2V5cygpW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IChfc3RlcCA9IF9pdGVyYXRvci5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZSkge1xuICAgICAgdmFyIGtleSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICBub2RlSW5kZXhlcy5zZXQoa2V5LCBpbmRleCsrKTtcbiAgICB9XG5cbiAgICAvLyBpbnN0YW50aWF0ZSB0aGUgbmVpZ2hib3Job29kIG1hdHJpeFxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgX2l0ZXJhdG9yRXJyb3IgPSBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3IucmV0dXJuKSB7XG4gICAgICAgIF9pdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIF9pMTMgPSAwOyBfaTEzIDwgbm9kZUluZGV4ZXMuc2l6ZTsgX2kxMysrKSB7XG4gICAgYWxsTm9kZXNOZWlnaGJvcmhvb2RbX2kxM10gPSBbXTtcbiAgfVxuXG4gIC8vIGZvcm0gYSBwYXJlbnQtY2hpbGQgbWFwIHRvIGtlZXAgcmVwcmVzZW50YXRpdmUgbm9kZSBvZiBlYWNoIGNvbXBvdW5kIG5vZGUgIFxuICBwYXJlbnROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBlbGUuY2hpbGRyZW4oKS5pbnRlcnNlY3Rpb24oZWxlcyk7XG5cbiAgICAvLyAgICAgIGxldCByYW5kb20gPSAwO1xuICAgIHdoaWxlIChjaGlsZHJlbi5ub2RlcyhcIjpjaGlsZGxlc3NcIikubGVuZ3RoID09IDApIHtcbiAgICAgIC8vICAgICAgICByYW5kb20gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGlsZHJlbi5ub2RlcygpLmxlbmd0aCk7IC8vIGlmIGFsbCBjaGlsZHJlbiBhcmUgY29tcG91bmQgdGhlbiBwcm9jZWVkIHJhbmRvbWx5XG4gICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLm5vZGVzKClbMF0uY2hpbGRyZW4oKS5pbnRlcnNlY3Rpb24oZWxlcyk7XG4gICAgfVxuICAgIC8vICBzZWxlY3QgdGhlIHJlcHJlc2VudGF0aXZlIG5vZGUgLSB3ZSBjYW4gYXBwbHkgZGlmZmVyZW50IG1ldGhvZHMgaGVyZVxuICAgIC8vICAgICAgcmFuZG9tID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hpbGRyZW4ubm9kZXMoXCI6Y2hpbGRsZXNzXCIpLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgbWluID0gY2hpbGRyZW4ubm9kZXMoXCI6Y2hpbGRsZXNzXCIpWzBdLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoO1xuICAgIGNoaWxkcmVuLm5vZGVzKFwiOmNoaWxkbGVzc1wiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGUyLCBpKSB7XG4gICAgICBpZiAoZWxlMi5jb25uZWN0ZWRFZGdlcygpLmxlbmd0aCA8IG1pbikge1xuICAgICAgICBtaW4gPSBlbGUyLmNvbm5lY3RlZEVkZ2VzKCkubGVuZ3RoO1xuICAgICAgICBpbmRleCA9IGk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcGFyZW50Q2hpbGRNYXAuc2V0KGVsZS5pZCgpLCBjaGlsZHJlbi5ub2RlcyhcIjpjaGlsZGxlc3NcIilbaW5kZXhdLmlkKCkpO1xuICB9KTtcblxuICAvLyBhZGQgbmVpZ2hib3Job29kIHJlbGF0aW9ucyAoZmlyc3QgcmVhbCwgdGhlbiBkdW1teSBub2RlcylcbiAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgdmFyIGVsZUluZGV4ID0gdm9pZCAwO1xuXG4gICAgaWYgKGVsZS5pc1BhcmVudCgpKSBlbGVJbmRleCA9IG5vZGVJbmRleGVzLmdldChwYXJlbnRDaGlsZE1hcC5nZXQoZWxlLmlkKCkpKTtlbHNlIGVsZUluZGV4ID0gbm9kZUluZGV4ZXMuZ2V0KGVsZS5pZCgpKTtcblxuICAgIGVsZS5uZWlnaGJvcmhvb2QoKS5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIGlmIChlbGVzLmludGVyc2VjdGlvbihlbGUuZWRnZXNXaXRoKG5vZGUpKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChub2RlLmlzUGFyZW50KCkpIGFsbE5vZGVzTmVpZ2hib3Job29kW2VsZUluZGV4XS5wdXNoKHBhcmVudENoaWxkTWFwLmdldChub2RlLmlkKCkpKTtlbHNlIGFsbE5vZGVzTmVpZ2hib3Job29kW2VsZUluZGV4XS5wdXNoKG5vZGUuaWQoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKF9rZXkpIHtcbiAgICB2YXIgZWxlSW5kZXggPSBub2RlSW5kZXhlcy5nZXQoX2tleSk7XG4gICAgdmFyIGRpc2Nvbm5lY3RlZElkID0gdm9pZCAwO1xuICAgIGR1bW15Tm9kZXMuZ2V0KF9rZXkpLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICBpZiAoY3kuZ2V0RWxlbWVudEJ5SWQoaWQpLmlzUGFyZW50KCkpIGRpc2Nvbm5lY3RlZElkID0gcGFyZW50Q2hpbGRNYXAuZ2V0KGlkKTtlbHNlIGRpc2Nvbm5lY3RlZElkID0gaWQ7XG5cbiAgICAgIGFsbE5vZGVzTmVpZ2hib3Job29kW2VsZUluZGV4XS5wdXNoKGRpc2Nvbm5lY3RlZElkKTtcbiAgICAgIGFsbE5vZGVzTmVpZ2hib3Job29kW25vZGVJbmRleGVzLmdldChkaXNjb25uZWN0ZWRJZCldLnB1c2goX2tleSk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gdHJ1ZTtcbiAgdmFyIF9kaWRJdGVyYXRvckVycm9yMiA9IGZhbHNlO1xuICB2YXIgX2l0ZXJhdG9yRXJyb3IyID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IGR1bW15Tm9kZXMua2V5cygpW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXAyOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gKF9zdGVwMiA9IF9pdGVyYXRvcjIubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSB0cnVlKSB7XG4gICAgICB2YXIgX2tleSA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgX2xvb3AoX2tleSk7XG4gICAgfVxuXG4gICAgLy8gbm9kZVNpemUgbm93IG9ubHkgY29uc2lkZXJzIHRoZSBzaXplIG9mIHRyYW5zZm9ybWVkIGdyYXBoXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kaWRJdGVyYXRvckVycm9yMiA9IHRydWU7XG4gICAgX2l0ZXJhdG9yRXJyb3IyID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yICYmIF9pdGVyYXRvcjIucmV0dXJuKSB7XG4gICAgICAgIF9pdGVyYXRvcjIucmV0dXJuKCk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjIpIHtcbiAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5vZGVTaXplID0gbm9kZUluZGV4ZXMuc2l6ZTtcblxuICB2YXIgc3BlY3RyYWxSZXN1bHQgPSB2b2lkIDA7XG5cbiAgLy8gSWYgbnVtYmVyIG9mIG5vZGVzIGluIHRyYW5zZm9ybWVkIGdyYXBoIGlzIDEgb3IgMiwgZWl0aGVyIFNWRCBvciBwb3dlckl0ZXJhdGlvbiBjYXVzZXMgcHJvYmxlbVxuICAvLyBTbyBza2lwIHNwZWN0cmFsIGFuZCBsYXlvdXQgdGhlIGdyYXBoIHdpdGggY29zZVxuICBpZiAobm9kZVNpemUgPiAyKSB7XG4gICAgLy8gaWYgIyBvZiBub2RlcyBpbiB0cmFuc2Zvcm1lZCBncmFwaCBpcyBzbWFsbGVyIHRoYW4gc2FtcGxlIHNpemUsXG4gICAgLy8gdGhlbiB1c2UgIyBvZiBub2RlcyBhcyBzYW1wbGUgc2l6ZVxuICAgIHNhbXBsZVNpemUgPSBub2RlU2l6ZSA8IG9wdGlvbnMuc2FtcGxlU2l6ZSA/IG5vZGVTaXplIDogb3B0aW9ucy5zYW1wbGVTaXplO1xuXG4gICAgLy8gaW5zdGFudGlhdGVzIHRoZSBwYXJ0aWFsIG1hdHJpY2VzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHNwZWN0cmFsIGxheW91dFxuICAgIGZvciAodmFyIF9pMTQgPSAwOyBfaTE0IDwgbm9kZVNpemU7IF9pMTQrKykge1xuICAgICAgQ1tfaTE0XSA9IFtdO1xuICAgIH1cbiAgICBmb3IgKHZhciBfaTE1ID0gMDsgX2kxNSA8IHNhbXBsZVNpemU7IF9pMTUrKykge1xuICAgICAgSU5WW19pMTVdID0gW107XG4gICAgfVxuXG4gICAgLyoqKiogQXBwbHkgc3BlY3RyYWwgbGF5b3V0ICoqKiovXG5cbiAgICBpZiAob3B0aW9ucy5xdWFsaXR5ID09IFwiZHJhZnRcIiB8fCBvcHRpb25zLnN0ZXAgPT0gXCJhbGxcIikge1xuICAgICAgYWxsQkZTKHNhbXBsaW5nVHlwZSk7XG4gICAgICBzYW1wbGUoKTtcbiAgICAgIHBvd2VySXRlcmF0aW9uKCk7XG5cbiAgICAgIHNwZWN0cmFsUmVzdWx0ID0geyBub2RlSW5kZXhlczogbm9kZUluZGV4ZXMsIHhDb29yZHM6IHhDb29yZHMsIHlDb29yZHM6IHlDb29yZHMgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZUluZGV4ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICB4Q29vcmRzLnB1c2goY3kuZ2V0RWxlbWVudEJ5SWQoa2V5KS5wb3NpdGlvbihcInhcIikpO1xuICAgICAgICB5Q29vcmRzLnB1c2goY3kuZ2V0RWxlbWVudEJ5SWQoa2V5KS5wb3NpdGlvbihcInlcIikpO1xuICAgICAgfSk7XG4gICAgICBzcGVjdHJhbFJlc3VsdCA9IHsgbm9kZUluZGV4ZXM6IG5vZGVJbmRleGVzLCB4Q29vcmRzOiB4Q29vcmRzLCB5Q29vcmRzOiB5Q29vcmRzIH07XG4gICAgfVxuICAgIHJldHVybiBzcGVjdHJhbFJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgaXRlcmF0b3IgPSBub2RlSW5kZXhlcy5rZXlzKCk7XG4gICAgdmFyIGZpcnN0Tm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGl0ZXJhdG9yLm5leHQoKS52YWx1ZSk7XG4gICAgdmFyIGZpcnN0Tm9kZVBvcyA9IGZpcnN0Tm9kZS5wb3NpdGlvbigpO1xuICAgIHZhciBmaXJzdE5vZGVXaWR0aCA9IGZpcnN0Tm9kZS5vdXRlcldpZHRoKCk7XG4gICAgeENvb3Jkcy5wdXNoKGZpcnN0Tm9kZVBvcy54KTtcbiAgICB5Q29vcmRzLnB1c2goZmlyc3ROb2RlUG9zLnkpO1xuICAgIGlmIChub2RlU2l6ZSA9PSAyKSB7XG4gICAgICB2YXIgc2Vjb25kTm9kZSA9IGN5LmdldEVsZW1lbnRCeUlkKGl0ZXJhdG9yLm5leHQoKS52YWx1ZSk7XG4gICAgICB2YXIgc2Vjb25kTm9kZVdpZHRoID0gc2Vjb25kTm9kZS5vdXRlcldpZHRoKCk7XG4gICAgICB4Q29vcmRzLnB1c2goZmlyc3ROb2RlUG9zLnggKyBmaXJzdE5vZGVXaWR0aCAvIDIgKyBzZWNvbmROb2RlV2lkdGggLyAyICsgb3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGgpO1xuICAgICAgeUNvb3Jkcy5wdXNoKGZpcnN0Tm9kZVBvcy55KTtcbiAgICB9XG5cbiAgICBzcGVjdHJhbFJlc3VsdCA9IHsgbm9kZUluZGV4ZXM6IG5vZGVJbmRleGVzLCB4Q29vcmRzOiB4Q29vcmRzLCB5Q29vcmRzOiB5Q29vcmRzIH07XG4gICAgcmV0dXJuIHNwZWN0cmFsUmVzdWx0O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgc3BlY3RyYWxMYXlvdXQ6IHNwZWN0cmFsTGF5b3V0IH07XG5cbi8qKiovIH0pLFxuXG4vKioqLyA1Nzk6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgaW1wbCA9IF9fd2VicGFja19yZXF1aXJlX18oMjEyKTtcblxuLy8gcmVnaXN0ZXJzIHRoZSBleHRlbnNpb24gb24gYSBjeXRvc2NhcGUgbGliIHJlZlxudmFyIHJlZ2lzdGVyID0gZnVuY3Rpb24gcmVnaXN0ZXIoY3l0b3NjYXBlKSB7XG4gIGlmICghY3l0b3NjYXBlKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIGNhbid0IHJlZ2lzdGVyIGlmIGN5dG9zY2FwZSB1bnNwZWNpZmllZFxuXG4gIGN5dG9zY2FwZSgnbGF5b3V0JywgJ2Zjb3NlJywgaW1wbCk7IC8vIHJlZ2lzdGVyIHdpdGggY3l0b3NjYXBlLmpzXG59O1xuXG5pZiAodHlwZW9mIGN5dG9zY2FwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gZXhwb3NlIHRvIGdsb2JhbCBjeXRvc2NhcGUgKGkuZS4gd2luZG93LmN5dG9zY2FwZSlcbiAgcmVnaXN0ZXIoY3l0b3NjYXBlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWdpc3RlcjtcblxuLyoqKi8gfSksXG5cbi8qKiovIDE0MDpcbi8qKiovICgobW9kdWxlKSA9PiB7XG5cbm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTQwX187XG5cbi8qKiovIH0pXG5cbi8qKioqKiovIFx0fSk7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcbi8qKioqKiovIFx0XHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi8gXHRcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBzdGFydHVwXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHQvLyBUaGlzIGVudHJ5IG1vZHVsZSBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIG1vZHVsZXMgc28gaXQgY2FuJ3QgYmUgaW5saW5lZFxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNTc5KTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfZXhwb3J0c19fO1xuLyoqKioqKi8gfSkoKVxuO1xufSk7IiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuY29uc3QgeyBzdHJpbmcsIGFycmF5LCBvYmplY3QsIG51bWJlciwgYm9vbCwgb25lT2ZUeXBlLCBhbnksIGZ1bmMgfSA9IFByb3BUeXBlcztcblxuZXhwb3J0IGNvbnN0IHR5cGVzID0ge1xuICAvKipcbiAgICogVGhlIGBpZGAgSFRNTCBhdHRyaWJ1dGUgb2YgdGhlIGNvbXBvbmVudC5cbiAgICogKi9cbiAgaWQ6IHN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGBjbGFzc2AgSFRNTCBhdHRyaWJ1dGUgb2YgdGhlIGNvbXBvbmVudC4gIFVzZSB0aGlzIHRvIHNldCB0aGUgZGltZW5zaW9ucyBvZlxuICAgKiB0aGUgZ3JhcGggdmlzdWFsaXNhdGlvbiB2aWEgYSBzdHlsZSBibG9jayBpbiB5b3VyIENTUyBmaWxlLlxuICAgKi9cbiAgY2xhc3NOYW1lOiBzdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBgc3R5bGVgIEhUTUwgYXR0cmlidXRlIG9mIHRoZSBjb21wb25lbnQuICBVc2UgdGhpcyB0byBzZXQgdGhlIGRpbWVuc2lvbnMgb2ZcbiAgICogdGhlIGdyYXBoIHZpc3VhbGlzYXRpb24gaWYgeW91IGRvIG5vdCB1c2Ugc2VwYXJhdGUgQ1NTIGZpbGVzLlxuICAgKi9cbiAgc3R5bGU6IG9uZU9mVHlwZShbc3RyaW5nLCBvYmplY3RdKSxcblxuICAvKipcbiAgICogVGhlIGZsYXQgbGlzdCBvZiBDeXRvc2NhcGUgZWxlbWVudHMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGdyYXBoLCBlYWNoIHJlcHJlc2VudGVkXG4gICAqIGFzIG5vbi1zdHJpbmdpZmllZCBKU09OLiAgRS5nLjpcbiAgICpcbiAgICogYGBgXG4gICAqIGVsZW1lbnRzOiBbXG4gICAqICAgeyBkYXRhOiB7IGlkOiAnb25lJywgbGFiZWw6ICdOb2RlIDEnIH0sIHBvc2l0aW9uOiB7IHg6IDAsIHk6IDAgfSB9LFxuICAgKiAgIHsgZGF0YTogeyBpZDogJ3R3bycsIGxhYmVsOiAnTm9kZSAyJyB9LCBwb3NpdGlvbjogeyB4OiAxMDAsIHk6IDAgfSB9LFxuICAgKiAgIHsgZGF0YTogeyBzb3VyY2U6ICdvbmUnLCB0YXJnZXQ6ICd0d28nLCBsYWJlbDogJ0VkZ2UgZnJvbSBOb2RlMSB0byBOb2RlMicgfSB9XG4gICAqIF1cbiAgICogYGBgXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jbm90YXRpb24vZWxlbWVudHMtanNvblxuICAgKiAqL1xuICBlbGVtZW50czogb25lT2ZUeXBlKFthcnJheSwgYW55XSksXG5cbiAgLyoqXG4gICAqIFRoZSBDeXRvc2NhcGUgc3R5bGVzaGVldCBhcyBub24tc3RyaW5naWZpZWQgSlNPTi4gIEUuZy46XG4gICAqXG4gICAqIGBgYFxuICAgKiBzdHlsZXNoZWV0OiBbXG4gICAqICAge1xuICAgKiAgICAgIHNlbGVjdG9yOiAnbm9kZScsXG4gICAqICAgICAgc3R5bGU6IHtcbiAgICogICAgICAgICd3aWR0aCc6IDMwLFxuICAgKiAgICAgICAgJ2hlaWdodCc6IDMwLFxuICAgKiAgICAgICAgJ3NoYXBlJzogJ3JlY3RhbmdsZSdcbiAgICogICAgICB9XG4gICAqICAgfVxuICAgKiBdXG4gICAqIGBgYFxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI3N0eWxlXG4gICAqL1xuICBzdHlsZXNoZWV0OiBvbmVPZlR5cGUoW2FycmF5LCBhbnldKSxcblxuICAvKipcbiAgICogVXNlIGEgbGF5b3V0IHRvIGF1dG9tYXRpY2FsbHkgcG9zaXRpb24gdGhlIG5vZGVzIGluIHRoZSBncmFwaC4gIEUuZy5cbiAgICpcbiAgICogYGBgXG4gICAqIGxheW91dDogeyBuYW1lOiAncmFuZG9tJyB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBOLmIuIHRvIHVzZSBhbiBleHRlcm5hbCBsYXlvdXQgZXh0ZW5zaW9uLCB5b3UgbXVzdCByZWdpc3RlciB0aGUgZXh0ZW5zaW9uXG4gICAqIHByaW9yIHRvIHJlbmRlcmluZyB0aGlzIGNvbXBvbmVudCwgZS5nLjpcbiAgICpcbiAgICogYGBgXG4gICAqIGltcG9ydCBDeXRvc2NhcGUgZnJvbSAnY3l0b3NjYXBlJztcbiAgICogaW1wb3J0IENPU0VCaWxrZW50IGZyb20gJ2N5dG9zY2FwZS1jb3NlLWJpbGtlbnQnO1xuICAgKiBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuICAgKiBpbXBvcnQgQ3l0b3NjYXBlQ29tcG9uZW50IGZyb20gJ2N5dG9zY2FwZS1yZWFjdGpzJztcbiAgICpcbiAgICogQ3l0b3NjYXBlLnVzZShDT1NFQmlsa2VudCk7XG4gICAqXG4gICAqIGNsYXNzIE15QXBwIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICogICByZW5kZXIoKSB7XG4gICAqICAgICBjb25zdCBlbGVtZW50cyA9IFtcbiAgICogICAgICAgeyBkYXRhOiB7IGlkOiAnb25lJywgbGFiZWw6ICdOb2RlIDEnIH0sIHBvc2l0aW9uOiB7IHg6IDAsIHk6IDAgfSB9LFxuICAgKiAgICAgICB7IGRhdGE6IHsgaWQ6ICd0d28nLCBsYWJlbDogJ05vZGUgMicgfSwgcG9zaXRpb246IHsgeDogMTAwLCB5OiAwIH0gfSxcbiAgICogICAgICAgeyBkYXRhOiB7IHNvdXJjZTogJ29uZScsIHRhcmdldDogJ3R3bycsIGxhYmVsOiAnRWRnZSBmcm9tIE5vZGUxIHRvIE5vZGUyJyB9IH1cbiAgICogICAgIF07XG4gICAqXG4gICAqICAgICBjb25zdCBsYXlvdXQgPSB7IG5hbWU6ICdjb3NlLWJpbGtlbnQnIH07XG4gICAqXG4gICAqICAgICByZXR1cm4gPEN5dG9zY2FwZUNvbXBvbmVudCBlbGVtZW50cz17ZWxlbWVudHN9IGxheW91dD17bGF5b3V0fT47XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2xheW91dHNcbiAgICovXG4gIGxheW91dDogb25lT2ZUeXBlKFtvYmplY3QsIGFueV0pLFxuXG4gIC8qKlxuICAgKiBUaGUgcGFubmluZyBwb3NpdGlvbiBvZiB0aGUgZ3JhcGguXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL3BhblxuICAgKi9cbiAgcGFuOiBvbmVPZlR5cGUoW29iamVjdCwgYW55XSksXG5cbiAgLyoqXG4gICAqIFRoZSB6b29tIGxldmVsIG9mIHRoZSBncmFwaC5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvem9vbVxuICAgKi9cbiAgem9vbTogbnVtYmVyLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYW5uaW5nIHBvc2l0aW9uIG9mIHRoZSBncmFwaCBpcyBtdXRhYmxlIG92ZXJhbGwuXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL3Bhbm5pbmdFbmFibGVkXG4gICAqL1xuICBwYW5uaW5nRW5hYmxlZDogYm9vbCxcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGFubmluZyBwb3NpdGlvbiBvZiB0aGUgZ3JhcGggaXMgbXV0YWJsZSBieSB1c2VyIGdlc3R1cmVzIChlLmcuIHN3aXBlKS5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvdXNlclBhbm5pbmdFbmFibGVkXG4gICAqL1xuICB1c2VyUGFubmluZ0VuYWJsZWQ6IGJvb2wsXG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy9taW5ab29tXG4gICAqL1xuICBtaW5ab29tOiBudW1iZXIsXG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy9tYXhab29tXG4gICAqL1xuICBtYXhab29tOiBudW1iZXIsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHpvb20gbGV2ZWwgb2YgdGhlIGdyYXBoIGlzIG11dGFibGUgb3ZlcmFsbC5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvem9vbWluZ0VuYWJsZWRcbiAgICovXG4gIHpvb21pbmdFbmFibGVkOiBib29sLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB6b29tIGxldmVsIG9mIHRoZSBncmFwaCBpcyBtdXRhYmxlIGJ5IHVzZXIgZ2VzdHVyZXMgKGUuZy4gcGluY2gtdG8tem9vbSkuXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL3VzZXJab29taW5nRW5hYmxlZFxuICAgKi9cbiAgdXNlclpvb21pbmdFbmFibGVkOiBib29sLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNoaWZ0K2NsaWNrLWFuZC1kcmFnIGJveCBzZWxlY3Rpb24gaXMgZW5hYmxlZC5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvYm94U2VsZWN0aW9uRW5hYmxlZFxuICAgKi9cbiAgYm94U2VsZWN0aW9uRW5hYmxlZDogYm9vbCxcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgbm9kZXMgYXV0b21hdGljYWxseSBjYW4gbm90IGJlIGdyYWJiZWQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyXG4gICAqIGVhY2ggbm9kZSBpcyBtYXJrZWQgYXMgZ3JhYmJhYmxlLlxuICAgKlxuICAgKiBTZWUgaHR0cDovL2pzLmN5dG9zY2FwZS5vcmcvI2luaXQtb3B0cy9hdXRvdW5ncmFiaWZ5XG4gICAqL1xuICBhdXRvdW5ncmFiaWZ5OiBib29sLFxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBub2RlcyBjYW4gbm90IGJlIG1vdmVkIGF0IGFsbC5cbiAgICpcbiAgICogU2VlIGh0dHA6Ly9qcy5jeXRvc2NhcGUub3JnLyNpbml0LW9wdHMvYXV0b2xvY2tcbiAgICovXG4gIGF1dG9sb2NrOiBib29sLFxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBlbGVtZW50cyBoYXZlIGltbXV0YWJsZSBzZWxlY3Rpb24gc3RhdGUuXG4gICAqXG4gICAqIFNlZSBodHRwOi8vanMuY3l0b3NjYXBlLm9yZy8jaW5pdC1vcHRzL2F1dG91bnNlbGVjdGlmeVxuICAgKi9cbiAgYXV0b3Vuc2VsZWN0aWZ5OiBib29sLFxuXG4gIC8qKlxuICAgKiBgZ2V0KG9iamVjdCwga2V5KWBcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGBvYmplY3RgIGF0IHRoZSBga2V5YCwgd2hpY2ggbWF5IGJlIGFuIGludGVnZXJcbiAgICogaW4gdGhlIGNhc2Ugb2YgbGlzdHMvYXJyYXlzIG9yIHN0cmluZ3MgaW4gdGhlIGNhc2Ugb2YgbWFwcy9vYmplY3RzLlxuICAgKi9cbiAgZ2V0OiBmdW5jLFxuXG4gIC8qKlxuICAgKiBgdG9Kc29uKG9iamVjdClgXG4gICAqIEdldCB0aGUgZGVlcCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGBvYmplY3RgIGFzIG5vbi1zdHJpbmdpZmllZCBKU09OLlxuICAgKi9cbiAgdG9Kc29uOiBmdW5jLFxuXG4gIC8qKlxuICAgKiBkaWZmKG9iamVjdEEsIG9iamVjdEIpXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSB0d28gb2JqZWN0cyBoYXZlIGVxdWFsIHZhbHVlLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmXG4gICAqIGFuZCB3aGVyZSBDeXRvc2NhcGUgbmVlZHMgdG8gYmUgcGF0Y2hlZC5cbiAgICovXG4gIGRpZmY6IGZ1bmMsXG5cbiAgLyoqXG4gICAqIGZvckVhY2gobGlzdCwgaXRlcmF0b3IpXG4gICAqIENhbGwgYGl0ZXJhdG9yYCBvbiBlYWNoIGVsZW1lbnQgaW4gdGhlIGBsaXN0YCwgaW4gb3JkZXIuXG4gICAqL1xuICBmb3JFYWNoOiBmdW5jLFxuXG4gIC8qKlxuICAgKiBjeShjeVJlZilcbiAgICogVGhlIGBjeWAgcHJvcCBhbGxvd3MgZm9yIGdldHRpbmcgYSByZWZlcmVuY2UgdG8gdGhlIGBjeWAgQ3l0b3NjYXBlIG9iamVjdCwgZS5nLjpcbiAgICpcbiAgICogYDxDeXRvc2NhcGVDb21wb25lbnQgY3k9e2N5ID0+IChteUN5UmVmID0gY3kpfSAvPmBcbiAgICovXG4gIGN5OiBmdW5jLFxuXG4gIC8qKlxuICAgKiBoZWFkbGVzc1xuICAgKiBUaGUgYGhlYWRsZXNzYCBwcm9wZXIgYWxsb3dzIGZvciBzZXR0aW5nIHdoZXRoZXIgdGhlIEN5dG9zY2FwZSBpbnN0YW5jZSBpcyBoZWFkbGVzcywgaS5lLlxuICAgKiBub3QgcmVuZGVyZWQuICBUaGlzIHZhbHVlIGNhbiBub3QgYmUgY2hhbmdlZCBhZnRlciBpbml0aWFsaXNhdGlvbiBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgaGVhZGxlc3M6IGJvb2wsXG5cbiAgLyoqXG4gICAqIHN0eWxlRW5hYmxlZFxuICAgKiBUaGUgYHN0eWxlRW5hYmxlZGAgZmxhZyBpcyB1c2VkIHRvIGVuYWJsZSBzdHlsZSBmdW5jdGlvbmFsaXR5IGluIGEgaGVhZGxlc3MgaW5zdGFuY2UgKGkuZS5cbiAgICogYGhlYWRsZXNzOiB0cnVlLCBzdHlsZUVuYWJsZWQ6IHRydWVgKS4gIEZvciBhIHJlbmRlcmVkIGluc3RhbmNlLCBkbyBub3Qgc2V0IHRoaXMgdmFsdWUuXG4gICAqL1xuICBzdHlsZUVuYWJsZWQ6IGJvb2wsXG5cbiAgLyoqXG4gICAqIGhpZGVFZGdlc09uVmlld3BvcnRcbiAgICogQSByZW5kZXJpbmcgaGludCB0aGF0IHNwZWNpZmllcywgZm9yIHJlbmRlcmVycyB3aGljaCBzdXBwb3J0IHRoZSBoaW50LCB3aGV0aGVyIGVkZ2VzIHNob3VsZFxuICAgKiBiZSBoaWRkZW4gZHVyaW5nIHpvb20gYW5kIHBhbiBvcGVyYXRpb25zLlxuICAgKi9cbiAgaGlkZUVkZ2VzT25WaWV3cG9ydDogYm9vbCxcblxuICAvKipcbiAgICogdGV4dHVyZU9uVmlld3BvcnRcbiAgICogQSByZW5kZXJpbmcgaGludCB0aGF0IHNwZWNpZmllcywgZm9yIHJlbmRlcmVycyB3aGljaCBzdXBwb3J0IHRoZSBoaW50LCB3aGV0aGVyIGEgcHJldmlld1xuICAgKiBiYXNlZCBvbiB0aGUgZXhpc3Rpbmcgc2NlbmUgc2hvdWxkIGJlIHVzZWQgaW4gcGxhY2Ugb2YgYnVpbGRpbmcgYSBuZXcgc2NlbmUuXG4gICAqL1xuICB0ZXh0dXJlT25WaWV3cG9ydDogYm9vbCxcblxuICAvKipcbiAgICogbW90aW9uQmx1clxuICAgKiBBIHJlbmRlcmluZyBoaW50IHRoYXQgc3BlY2lmaWVzLCBmb3IgcmVuZGVyZXJzIHdoaWNoIHN1cHBvcnQgdGhlIGhpbnQsIHdoZXRoZXIgYSBtb3Rpb24gYmx1clxuICAgKiBlZmZlY3Qgc2hvdWxkIGJlIGFwcGxpZWQuXG4gICAqL1xuICBtb3Rpb25CbHVyOiBib29sLFxuXG4gIC8qKlxuICAgKiBtb3Rpb25CbHVyT3BhY2l0eVxuICAgKiBBIHJlbmRlcmluZyBoaW50IHRoYXQgc3BlY2lmaWVzLCBmb3IgcmVuZGVyZXJzIHdoaWNoIHN1cHBvcnQgdGhlIGhpbnQsIGhvdyBzdHJvbmcgdGhlIG1vdGlvblxuICAgKiBibHVyIGVmZmVjdCBzaG91bGQgYmUuICBUaGUgdmFsdWUgcmFuZ2VzIGZyb20gMCB0byAxLCB3aXRoIGxhcmdlciB2YWx1ZXMgaW5kaWNhdGluZyBsYXJnZXJcbiAgICogc3RyZW5ndGguXG4gICAqL1xuICBtb3Rpb25CbHVyT3BhY2l0eTogbnVtYmVyLFxuXG4gIC8qKlxuICAgKiB3aGVlbFNlbnNpdGl2aXR5XG4gICAqIEEgcmVuZGVyaW5nIGhpbnQgdGhhdCBzcGVjaWZpZXMsIGZvciByZW5kZXJlcnMgd2hpY2ggc3VwcG9ydCB0aGUgaGludCwgaG93IGZhc3Qgd2hlZWwgem9vbWluZ1xuICAgKiBzaG91bGQgYmUuICBUaGUgdmFsdWUgaXMgYSBwb3NpdGl2ZSBtdWx0aXBsaWVyLiAgRG8gbm90IHNldCB0aGlzIHZhbHVlIHVubGVzcyB5b3UgYXJlIHVzaW5nXG4gICAqIHVuY29udmVudGlvbmFsIGhhcmR3YXJlIGFuZCBjYW4gZ3VhcmFudGVlIHRoYXQgYWxsIHlvdXIgdXNlcnMgd2lsbCB1c2UgdGhlIHNhbWUgaGFyZHdhcmUuICBUaGVcbiAgICogZGVmYXVsdCB2YWx1ZSB3b3JrcyB3ZWxsIGZvciBzdGFuZGFyZCBtaWNlIG9uIGNvbW1vbiBvcGVyYXRpbmcgc3lzdGVtcy4gIElmIHlvdSBjaGFuZ2UgdGhpc1xuICAgKiB2YWx1ZSwgaXQgaXMgdmVyeSBsaWtlbHkgdGhhdCB5b3Ugd2lsbCBjcmVhdGUgYSBiYWQgdXNlciBleHBlcmllbmNlIGZvciBtYW55IG9yIG1vc3Qgb2YgeW91clxuICAgKiB1c2Vycy5cbiAgICovXG4gIHdoZWVsU2Vuc2l0aXZpdHk6IG51bWJlcixcblxuICAvKipcbiAgICogcGl4ZWxSYXRpb1xuICAgKiBBIHJlbmRlcmluZyBoaW50IHRoYXQgc3BlY2lmaWVzLCBmb3IgcmVuZGVyZXJzIHdoaWNoIHN1cHBvcnQgdGhlIGhpbnQsIHRoZSBwaXhlbCByYXRpbyB0aGF0XG4gICAqIHNob3VsZCBiZSB1c2VkLiAgTWF5IGJlICdhdXRvJyBvciBhIHBvc2l0aXZlIG51bWJlci5cbiAgICovXG4gIHBpeGVsUmF0aW86IG9uZU9mVHlwZShbc3RyaW5nLCBvYmplY3RdKSxcbn07XG4iLCJjb25zdCBlaXRoZXJJc05pbCA9IChhLCBiKSA9PiBhID09IG51bGwgfHwgYiA9PSBudWxsO1xuXG5leHBvcnQgY29uc3QgaGFzaERpZmYgPSAoYSwgYikgPT4ge1xuICByZXR1cm4gZWl0aGVySXNOaWwoYSwgYikgfHwgYS5oYXNoKCkgIT09IGIuaGFzaCgpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNoYWxsb3dPYmpEaWZmID0gKGEsIGIpID0+IHtcbiAgaWYgKGVpdGhlcklzTmlsKGEsIGIpICYmICEoYSA9PSBudWxsICYmIGIgPT0gbnVsbCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhID09PSBiKSB7XG4gICAgLy8gY2FuJ3QgZG8gYSBkaWZmIG9uIHRoZSBzYW1lIG9ialxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIG5vbi1vYmplY3QgdmFsdWVzIGNhbiBiZSBjb21wYXJlZCB3aXRoIHRoZSBlcXVhbGl0eSBvcGVyYXRvclxuICBpZiAodHlwZW9mIGEgIT09ICdvYmplY3QnIHx8IHR5cGVvZiBiICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBhICE9PSBiO1xuICB9XG5cbiAgY29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgY29uc3QgYktleXMgPSBPYmplY3Qua2V5cyhiKTtcbiAgY29uc3QgbWlzbWF0Y2hlcyA9IChrZXkpID0+IGFba2V5XSAhPT0gYltrZXldO1xuXG4gIGlmIChhS2V5cy5sZW5ndGggIT09IGJLZXlzLmxlbmd0aCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGFLZXlzLnNvbWUobWlzbWF0Y2hlcykgfHwgYktleXMuc29tZShtaXNtYXRjaGVzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcbiIsImV4cG9ydCBjb25zdCBnZXQgPSAob2JqLCBrZXkpID0+IChvYmogIT0gbnVsbCA/IG9ialtrZXldIDogbnVsbCk7XG5cbmV4cG9ydCBjb25zdCB0b0pzb24gPSAob2JqKSA9PiBvYmo7XG5cbmV4cG9ydCBjb25zdCBmb3JFYWNoID0gKGFyciwgaXRlcmF0b3IpID0+IGFyci5mb3JFYWNoKGl0ZXJhdG9yKTtcbiIsImltcG9ydCB7IHNoYWxsb3dPYmpEaWZmIH0gZnJvbSAnLi9kaWZmJztcbmltcG9ydCB7IGdldCwgdG9Kc29uLCBmb3JFYWNoIH0gZnJvbSAnLi9qc29uJztcblxuZXhwb3J0IGNvbnN0IGlkZW50aXR5ID0gKHgpID0+IHg7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50cyA9IFtcbiAgeyBkYXRhOiB7IGlkOiAnYScsIGxhYmVsOiAnRXhhbXBsZSBub2RlIEEnIH0gfSxcbiAgeyBkYXRhOiB7IGlkOiAnYicsIGxhYmVsOiAnRXhhbXBsZSBub2RlIEInIH0gfSxcbiAgeyBkYXRhOiB7IGlkOiAnZScsIHNvdXJjZTogJ2EnLCB0YXJnZXQ6ICdiJyB9IH0sXG5dO1xuXG5leHBvcnQgY29uc3Qgc3R5bGVzaGVldCA9IFtcbiAge1xuICAgIHNlbGVjdG9yOiAnbm9kZScsXG4gICAgc3R5bGU6IHtcbiAgICAgIGxhYmVsOiAnZGF0YShsYWJlbCknLFxuICAgIH0sXG4gIH0sXG5dO1xuXG5leHBvcnQgY29uc3Qgem9vbSA9IDE7XG5cbmV4cG9ydCBjb25zdCBwYW4gPSB7XG4gIHg6IDAsXG4gIHk6IDAsXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdHMgPSB7XG4gIGRpZmY6IHNoYWxsb3dPYmpEaWZmLFxuICBnZXQsXG4gIHRvSnNvbixcbiAgZm9yRWFjaCxcbiAgZWxlbWVudHMsXG4gIHN0eWxlc2hlZXQsXG4gIHpvb20sXG4gIHBhbixcbn07XG4iLCJpbXBvcnQgeyBnZXQgYXMgYXRLZXkgfSBmcm9tICcuL2pzb24nO1xuaW1wb3J0IHsgc2hhbGxvd09iakRpZmYgfSBmcm9tICcuL2RpZmYnO1xuXG5jb25zdCBpc0RpZmZBdEtleSA9IChqc29uMSwganNvbjIsIGRpZmYsIGtleSkgPT5cbiAgZGlmZihhdEtleShqc29uMSwga2V5KSwgYXRLZXkoanNvbjIsIGtleSkpO1xuXG5leHBvcnQgY29uc3QgcGF0Y2ggPSAoY3ksIGpzb24xLCBqc29uMiwgZGlmZiwgdG9Kc29uLCBnZXQsIGZvckVhY2gpID0+IHtcbiAgY3kuYmF0Y2goKCkgPT4ge1xuICAgIC8vIFRoZSBzaGFsbG93IG9iamVjdCBkaWZmKCkgbXVzdCBkZWZlciB0byBwYXRjaEVsZW1lbnRzKCkgYXMgaXQgbXVzdCBjb21wYXJlIHRoZVxuICAgIC8vIGVsZW1lbnRzIGFzIGFuIHVub3JkZXJlZCBzZXQuICBBIGN1c3RvbSBkaWZmKCksIHdpdGggSW1tdXRhYmxlIGZvciBleGFtcGxlLFxuICAgIC8vIGNvdWxkIGp1c3QgdXNlIGFuIGVxdWFsaXR5IGNoZWNrICg9PT0pLlxuICAgIGlmIChcbiAgICAgIGRpZmYgPT09IHNoYWxsb3dPYmpEaWZmIHx8XG4gICAgICBpc0RpZmZBdEtleShqc29uMSwganNvbjIsIGRpZmYsICdlbGVtZW50cycpXG4gICAgKSB7XG4gICAgICBwYXRjaEVsZW1lbnRzKFxuICAgICAgICBjeSxcbiAgICAgICAgYXRLZXkoanNvbjEsICdlbGVtZW50cycpLFxuICAgICAgICBhdEtleShqc29uMiwgJ2VsZW1lbnRzJyksXG4gICAgICAgIHRvSnNvbixcbiAgICAgICAgZ2V0LFxuICAgICAgICBmb3JFYWNoLFxuICAgICAgICBkaWZmXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpc0RpZmZBdEtleShqc29uMSwganNvbjIsIGRpZmYsICdzdHlsZXNoZWV0JykpIHtcbiAgICAgIHBhdGNoU3R5bGUoXG4gICAgICAgIGN5LFxuICAgICAgICBhdEtleShqc29uMSwgJ3N0eWxlc2hlZXQnKSxcbiAgICAgICAgYXRLZXkoanNvbjIsICdzdHlsZXNoZWV0JyksXG4gICAgICAgIHRvSnNvblxuICAgICAgKTtcbiAgICB9XG5cbiAgICBbXG4gICAgICAvLyBzaW1wbGUga2V5cyB0aGF0IGNhbiBiZSBwYXRjaGVkIGRpcmVjdGx5IChrZXkgc2FtZSBhcyBmbiBuYW1lKVxuICAgICAgJ3pvb20nLFxuICAgICAgJ21pblpvb20nLFxuICAgICAgJ21heFpvb20nLFxuICAgICAgJ3pvb21pbmdFbmFibGVkJyxcbiAgICAgICd1c2VyWm9vbWluZ0VuYWJsZWQnLFxuICAgICAgJ3BhbicsXG4gICAgICAncGFubmluZ0VuYWJsZWQnLFxuICAgICAgJ3VzZXJQYW5uaW5nRW5hYmxlZCcsXG4gICAgICAnYm94U2VsZWN0aW9uRW5hYmxlZCcsXG4gICAgICAnYXV0b3VuZ3JhYmlmeScsXG4gICAgICAnYXV0b2xvY2snLFxuICAgICAgJ2F1dG91bnNlbGVjdGlmeScsXG4gICAgXS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChpc0RpZmZBdEtleShqc29uMSwganNvbjIsIGRpZmYsIGtleSkpIHtcbiAgICAgICAgcGF0Y2hKc29uKGN5LCBrZXksIGF0S2V5KGpzb24xLCBrZXkpLCBhdEtleShqc29uMiwga2V5KSwgdG9Kc29uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgaWYgKGlzRGlmZkF0S2V5KGpzb24xLCBqc29uMiwgZGlmZiwgJ2xheW91dCcpKSB7XG4gICAgcGF0Y2hMYXlvdXQoY3ksIGF0S2V5KGpzb24xLCAnbGF5b3V0JyksIGF0S2V5KGpzb24yLCAnbGF5b3V0JyksIHRvSnNvbik7XG4gIH1cbn07XG5cbmNvbnN0IHBhdGNoSnNvbiA9IChjeSwga2V5LCB2YWwxLCB2YWwyLCB0b0pzb24pID0+IHtcbiAgY3lba2V5XSh0b0pzb24odmFsMikpO1xufTtcblxuY29uc3QgcGF0Y2hMYXlvdXQgPSAoY3ksIGxheW91dDEsIGxheW91dDIsIHRvSnNvbikgPT4ge1xuICBjb25zdCBsYXlvdXRPcHRzID0gdG9Kc29uKGxheW91dDIpO1xuXG4gIGlmIChsYXlvdXRPcHRzICE9IG51bGwpIHtcbiAgICBjeS5sYXlvdXQobGF5b3V0T3B0cykucnVuKCk7XG4gIH1cbn07XG5cbmNvbnN0IHBhdGNoU3R5bGUgPSAoY3ksIHN0eWxlMSwgc3R5bGUyLCB0b0pzb24pID0+IHtcbiAgY29uc3Qgc3R5bGUgPSBjeS5zdHlsZSgpO1xuXG4gIGlmIChzdHlsZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3R5bGUuZnJvbUpzb24odG9Kc29uKHN0eWxlMikpLnVwZGF0ZSgpO1xufTtcblxuY29uc3QgcGF0Y2hFbGVtZW50cyA9IChjeSwgZWxlczEsIGVsZXMyLCB0b0pzb24sIGdldCwgZm9yRWFjaCwgZGlmZikgPT4ge1xuICBjb25zdCB0b0FkZCA9IFtdO1xuICBjb25zdCB0b1JtID0gY3kuY29sbGVjdGlvbigpO1xuICBjb25zdCB0b1BhdGNoID0gW107XG4gIGNvbnN0IGVsZXMxTWFwID0ge307XG4gIGNvbnN0IGVsZXMyTWFwID0ge307XG4gIGNvbnN0IGVsZXMxSGFzSWQgPSAoaWQpID0+IGVsZXMxTWFwW2lkXSAhPSBudWxsO1xuICBjb25zdCBlbGVzMkhhc0lkID0gKGlkKSA9PiBlbGVzMk1hcFtpZF0gIT0gbnVsbDtcbiAgY29uc3QgZ2V0RWxlMSA9IChpZCkgPT4gZWxlczFNYXBbaWRdO1xuICBjb25zdCBnZXRJZCA9IChlbGUpID0+IGdldChnZXQoZWxlLCAnZGF0YScpLCAnaWQnKTtcblxuICBmb3JFYWNoKGVsZXMyLCAoZWxlMikgPT4ge1xuICAgIGNvbnN0IGlkID0gZ2V0SWQoZWxlMik7XG5cbiAgICBlbGVzMk1hcFtpZF0gPSBlbGUyO1xuICB9KTtcblxuICBpZiAoZWxlczEgIT0gbnVsbCkge1xuICAgIGZvckVhY2goZWxlczEsIChlbGUxKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IGdldElkKGVsZTEpO1xuXG4gICAgICBlbGVzMU1hcFtpZF0gPSBlbGUxO1xuXG4gICAgICBpZiAoIWVsZXMySGFzSWQoaWQpKSB7XG4gICAgICAgIHRvUm0ubWVyZ2UoY3kuZ2V0RWxlbWVudEJ5SWQoaWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZvckVhY2goZWxlczIsIChlbGUyKSA9PiB7XG4gICAgY29uc3QgaWQgPSBnZXRJZChlbGUyKTtcbiAgICBjb25zdCBlbGUxID0gZ2V0RWxlMShpZCk7XG5cbiAgICBpZiAoZWxlczFIYXNJZChpZCkpIHtcbiAgICAgIHRvUGF0Y2gucHVzaCh7IGVsZTEsIGVsZTIgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRvQWRkLnB1c2godG9Kc29uKGVsZTIpKTtcbiAgICB9XG4gIH0pO1xuXG4gIGlmICh0b1JtLmxlbmd0aCA+IDApIHtcbiAgICBjeS5yZW1vdmUodG9SbSk7XG4gIH1cblxuICBpZiAodG9BZGQubGVuZ3RoID4gMCkge1xuICAgIGN5LmFkZCh0b0FkZCk7XG4gIH1cblxuICB0b1BhdGNoLmZvckVhY2goKHsgZWxlMSwgZWxlMiB9KSA9PlxuICAgIHBhdGNoRWxlbWVudChjeSwgZWxlMSwgZWxlMiwgdG9Kc29uLCBnZXQsIGRpZmYpXG4gICk7XG59O1xuXG5jb25zdCBwYXRjaEVsZW1lbnQgPSAoY3ksIGVsZTEsIGVsZTIsIHRvSnNvbiwgZ2V0LCBkaWZmKSA9PiB7XG4gIGNvbnN0IGlkID0gZ2V0KGdldChlbGUyLCAnZGF0YScpLCAnaWQnKTtcbiAgY29uc3QgY3lFbGUgPSBjeS5nZXRFbGVtZW50QnlJZChpZCk7XG4gIGNvbnN0IHBhdGNoID0ge307XG4gIGNvbnN0IGpzb25LZXlzID0gW1xuICAgICdkYXRhJyxcbiAgICAncG9zaXRpb24nLFxuICAgICdzZWxlY3RlZCcsXG4gICAgJ3NlbGVjdGFibGUnLFxuICAgICdsb2NrZWQnLFxuICAgICdncmFiYmFibGUnLFxuICAgICdjbGFzc2VzJyxcbiAgXTtcblxuICBqc29uS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBjb25zdCBkYXRhMiA9IGdldChlbGUyLCBrZXkpO1xuXG4gICAgaWYgKGRpZmYoZGF0YTIsIGdldChlbGUxLCBrZXkpKSkge1xuICAgICAgcGF0Y2hba2V5XSA9IHRvSnNvbihkYXRhMik7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBzY3JhdGNoMiA9IGdldChlbGUyLCAnc2NyYXRjaCcpO1xuICBpZiAoZGlmZihzY3JhdGNoMiwgZ2V0KGVsZTEsICdzY3JhdGNoJykpKSB7XG4gICAgY3lFbGUuc2NyYXRjaCh0b0pzb24oc2NyYXRjaDIpKTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhwYXRjaCkubGVuZ3RoID4gMCkge1xuICAgIGN5RWxlLmpzb24ocGF0Y2gpO1xuICB9XG59O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHR5cGVzIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBkZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMnO1xuaW1wb3J0IEN5dG9zY2FwZSBmcm9tICdjeXRvc2NhcGUnO1xuaW1wb3J0IHsgcGF0Y2ggfSBmcm9tICcuL3BhdGNoJztcblxuLyoqXG4gKiBUaGUgYEN5dG9zY2FwZUNvbXBvbmVudGAgaXMgYSBSZWFjdCBjb21wb25lbnQgdGhhdCBhbGxvd3MgZm9yIHRoZSBkZWNsYXJhdGl2ZSBjcmVhdGlvblxuICogYW5kIG1vZGlmaWNhdGlvbiBvZiBhIEN5dG9zY2FwZSBpbnN0YW5jZSwgYSBncmFwaCB2aXN1YWxpc2F0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDeXRvc2NhcGVDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0aWMgZ2V0IHByb3BUeXBlcygpIHtcbiAgICByZXR1cm4gdHlwZXM7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wcygpIHtcbiAgICByZXR1cm4gZGVmYXVsdHM7XG4gIH1cblxuICBzdGF0aWMgbm9ybWFsaXplRWxlbWVudHMoZWxlbWVudHMpIHtcbiAgICBjb25zdCBpc0FycmF5ID0gZWxlbWVudHMubGVuZ3RoICE9IG51bGw7XG5cbiAgICBpZiAoaXNBcnJheSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgeyBub2RlcywgZWRnZXMgfSA9IGVsZW1lbnRzO1xuXG4gICAgICBpZiAobm9kZXMgPT0gbnVsbCkge1xuICAgICAgICBub2RlcyA9IFtdO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWRnZXMgPT0gbnVsbCkge1xuICAgICAgICBlZGdlcyA9IFtdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZXMuY29uY2F0KGVkZ2VzKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmRpc3BsYXlOYW1lID0gJ0N5dG9zY2FwZUNvbXBvbmVudCc7XG4gICAgdGhpcy5jb250YWluZXJSZWYgPSBSZWFjdC5jcmVhdGVSZWYoKTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyUmVmLmN1cnJlbnQ7XG5cbiAgICBjb25zdCB7XG4gICAgICBnbG9iYWwsXG4gICAgICBoZWFkbGVzcyxcbiAgICAgIHN0eWxlRW5hYmxlZCxcbiAgICAgIGhpZGVFZGdlc09uVmlld3BvcnQsXG4gICAgICB0ZXh0dXJlT25WaWV3cG9ydCxcbiAgICAgIG1vdGlvbkJsdXIsXG4gICAgICBtb3Rpb25CbHVyT3BhY2l0eSxcbiAgICAgIHdoZWVsU2Vuc2l0aXZpdHksXG4gICAgICBwaXhlbFJhdGlvLFxuICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgY29uc3QgY3kgPSAodGhpcy5fY3kgPSBuZXcgQ3l0b3NjYXBlKHtcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGhlYWRsZXNzLFxuICAgICAgc3R5bGVFbmFibGVkLFxuICAgICAgaGlkZUVkZ2VzT25WaWV3cG9ydCxcbiAgICAgIHRleHR1cmVPblZpZXdwb3J0LFxuICAgICAgbW90aW9uQmx1cixcbiAgICAgIG1vdGlvbkJsdXJPcGFjaXR5LFxuICAgICAgd2hlZWxTZW5zaXRpdml0eSxcbiAgICAgIHBpeGVsUmF0aW8sXG4gICAgfSkpO1xuXG4gICAgaWYgKGdsb2JhbCkge1xuICAgICAgd2luZG93W2dsb2JhbF0gPSBjeTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUN5dG9zY2FwZShudWxsLCB0aGlzLnByb3BzKTtcbiAgfVxuXG4gIHVwZGF0ZUN5dG9zY2FwZShwcmV2UHJvcHMsIG5ld1Byb3BzKSB7XG4gICAgY29uc3QgY3kgPSB0aGlzLl9jeTtcbiAgICBjb25zdCB7IGRpZmYsIHRvSnNvbiwgZ2V0LCBmb3JFYWNoIH0gPSBuZXdQcm9wcztcblxuICAgIHBhdGNoKGN5LCBwcmV2UHJvcHMsIG5ld1Byb3BzLCBkaWZmLCB0b0pzb24sIGdldCwgZm9yRWFjaCk7XG5cbiAgICBpZiAobmV3UHJvcHMuY3kgIT0gbnVsbCkge1xuICAgICAgbmV3UHJvcHMuY3koY3kpO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICB0aGlzLnVwZGF0ZUN5dG9zY2FwZShwcmV2UHJvcHMsIHRoaXMucHJvcHMpO1xuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5fY3kuZGVzdHJveSgpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHsgaWQsIGNsYXNzTmFtZSwgc3R5bGUgfSA9IHRoaXMucHJvcHM7XG5cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCgnZGl2Jywge1xuICAgICAgcmVmOiB0aGlzLmNvbnRhaW5lclJlZixcbiAgICAgIGlkLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgc3R5bGUsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5leHBvcnQgY29uc3QgUmVhY3RSZWR1eENvbnRleHQgPSAvKiNfX1BVUkVfXyovY3JlYXRlQ29udGV4dChudWxsKTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVhY3RSZWR1eENvbnRleHQuZGlzcGxheU5hbWUgPSAnUmVhY3RSZWR1eCc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlYWN0UmVkdXhDb250ZXh0OyIsImltcG9ydCBSZWFjdCwgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuL0NvbnRleHQnO1xuaW1wb3J0IHsgY3JlYXRlU3Vic2NyaXB0aW9uIH0gZnJvbSAnLi4vdXRpbHMvU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgfSBmcm9tICcuLi91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0JztcblxuZnVuY3Rpb24gUHJvdmlkZXIoe1xuICBzdG9yZSxcbiAgY29udGV4dCxcbiAgY2hpbGRyZW4sXG4gIHNlcnZlclN0YXRlXG59KSB7XG4gIGNvbnN0IGNvbnRleHRWYWx1ZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGNyZWF0ZVN1YnNjcmlwdGlvbihzdG9yZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0b3JlLFxuICAgICAgc3Vic2NyaXB0aW9uLFxuICAgICAgZ2V0U2VydmVyU3RhdGU6IHNlcnZlclN0YXRlID8gKCkgPT4gc2VydmVyU3RhdGUgOiB1bmRlZmluZWRcbiAgICB9O1xuICB9LCBbc3RvcmUsIHNlcnZlclN0YXRlXSk7XG4gIGNvbnN0IHByZXZpb3VzU3RhdGUgPSB1c2VNZW1vKCgpID0+IHN0b3JlLmdldFN0YXRlKCksIFtzdG9yZV0pO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBzdWJzY3JpcHRpb25cbiAgICB9ID0gY29udGV4dFZhbHVlO1xuICAgIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gc3Vic2NyaXB0aW9uLm5vdGlmeU5lc3RlZFN1YnM7XG4gICAgc3Vic2NyaXB0aW9uLnRyeVN1YnNjcmliZSgpO1xuXG4gICAgaWYgKHByZXZpb3VzU3RhdGUgIT09IHN0b3JlLmdldFN0YXRlKCkpIHtcbiAgICAgIHN1YnNjcmlwdGlvbi5ub3RpZnlOZXN0ZWRTdWJzKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHN1YnNjcmlwdGlvbi50cnlVbnN1YnNjcmliZSgpO1xuICAgICAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UgPSB1bmRlZmluZWQ7XG4gICAgfTtcbiAgfSwgW2NvbnRleHRWYWx1ZSwgcHJldmlvdXNTdGF0ZV0pO1xuICBjb25zdCBDb250ZXh0ID0gY29udGV4dCB8fCBSZWFjdFJlZHV4Q29udGV4dDsgLy8gQHRzLWlnbm9yZSAnQW55QWN0aW9uJyBpcyBhc3NpZ25hYmxlIHRvIHRoZSBjb25zdHJhaW50IG9mIHR5cGUgJ0EnLCBidXQgJ0EnIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGVcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0VmFsdWVcbiAgfSwgY2hpbGRyZW4pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBQcm92aWRlcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZVwiO1xuY29uc3QgX2V4Y2x1ZGVkID0gW1wicmVhY3RSZWR1eEZvcndhcmRlZFJlZlwiXTtcblxuLyogZXNsaW50LWRpc2FibGUgdmFsaWQtanNkb2MsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuaW1wb3J0IGhvaXN0U3RhdGljcyBmcm9tICdob2lzdC1ub24tcmVhY3Qtc3RhdGljcyc7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCwgdXNlTWVtbywgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNWYWxpZEVsZW1lbnRUeXBlLCBpc0NvbnRleHRDb25zdW1lciB9IGZyb20gJ3JlYWN0LWlzJztcbmltcG9ydCBkZWZhdWx0U2VsZWN0b3JGYWN0b3J5IGZyb20gJy4uL2Nvbm5lY3Qvc2VsZWN0b3JGYWN0b3J5JztcbmltcG9ydCB7IG1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcnkgfSBmcm9tICcuLi9jb25uZWN0L21hcERpc3BhdGNoVG9Qcm9wcyc7XG5pbXBvcnQgeyBtYXBTdGF0ZVRvUHJvcHNGYWN0b3J5IH0gZnJvbSAnLi4vY29ubmVjdC9tYXBTdGF0ZVRvUHJvcHMnO1xuaW1wb3J0IHsgbWVyZ2VQcm9wc0ZhY3RvcnkgfSBmcm9tICcuLi9jb25uZWN0L21lcmdlUHJvcHMnO1xuaW1wb3J0IHsgY3JlYXRlU3Vic2NyaXB0aW9uIH0gZnJvbSAnLi4vdXRpbHMvU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgfSBmcm9tICcuLi91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0JztcbmltcG9ydCBzaGFsbG93RXF1YWwgZnJvbSAnLi4vdXRpbHMvc2hhbGxvd0VxdWFsJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJy4uL3V0aWxzL3dhcm5pbmcnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuL0NvbnRleHQnO1xuaW1wb3J0IHsgbm90SW5pdGlhbGl6ZWQgfSBmcm9tICcuLi91dGlscy91c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG5sZXQgdXNlU3luY0V4dGVybmFsU3RvcmUgPSBub3RJbml0aWFsaXplZDtcbmV4cG9ydCBjb25zdCBpbml0aWFsaXplQ29ubmVjdCA9IGZuID0+IHtcbiAgdXNlU3luY0V4dGVybmFsU3RvcmUgPSBmbjtcbn07IC8vIERlZmluZSBzb21lIGNvbnN0YW50IGFycmF5cyBqdXN0IHRvIGF2b2lkIHJlLWNyZWF0aW5nIHRoZXNlXG5cbmNvbnN0IEVNUFRZX0FSUkFZID0gW251bGwsIDBdO1xuY29uc3QgTk9fU1VCU0NSSVBUSU9OX0FSUkFZID0gW251bGwsIG51bGxdOyAvLyBBdHRlbXB0cyB0byBzdHJpbmdpZnkgd2hhdGV2ZXIgbm90LXJlYWxseS1hLWNvbXBvbmVudCB2YWx1ZSB3ZSB3ZXJlIGdpdmVuXG4vLyBmb3IgbG9nZ2luZyBpbiBhbiBlcnJvciBtZXNzYWdlXG5cbmNvbnN0IHN0cmluZ2lmeUNvbXBvbmVudCA9IENvbXAgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShDb21wKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIFN0cmluZyhDb21wKTtcbiAgfVxufTtcblxuLy8gVGhpcyBpcyBcImp1c3RcIiBhIGB1c2VMYXlvdXRFZmZlY3RgLCBidXQgd2l0aCB0d28gbW9kaWZpY2F0aW9uczpcbi8vIC0gd2UgbmVlZCB0byBmYWxsIGJhY2sgdG8gYHVzZUVmZmVjdGAgaW4gU1NSIHRvIGF2b2lkIGFubm95aW5nIHdhcm5pbmdzXG4vLyAtIHdlIGV4dHJhY3QgdGhpcyB0byBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGF2b2lkIGNsb3Npbmcgb3ZlciB2YWx1ZXNcbi8vICAgYW5kIGNhdXNpbmcgbWVtb3J5IGxlYWtzXG5mdW5jdGlvbiB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0V2l0aEFyZ3MoZWZmZWN0RnVuYywgZWZmZWN0QXJncywgZGVwZW5kZW5jaWVzKSB7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4gZWZmZWN0RnVuYyguLi5lZmZlY3RBcmdzKSwgZGVwZW5kZW5jaWVzKTtcbn0gLy8gRWZmZWN0IGNhbGxiYWNrLCBleHRyYWN0ZWQ6IGFzc2lnbiB0aGUgbGF0ZXN0IHByb3BzIHZhbHVlcyB0byByZWZzIGZvciBsYXRlciB1c2FnZVxuXG5cbmZ1bmN0aW9uIGNhcHR1cmVXcmFwcGVyUHJvcHMobGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCB3cmFwcGVyUHJvcHMsIC8vIGFjdHVhbENoaWxkUHJvcHM6IHVua25vd24sXG5jaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzKSB7XG4gIC8vIFdlIHdhbnQgdG8gY2FwdHVyZSB0aGUgd3JhcHBlciBwcm9wcyBhbmQgY2hpbGQgcHJvcHMgd2UgdXNlZCBmb3IgbGF0ZXIgY29tcGFyaXNvbnNcbiAgbGFzdFdyYXBwZXJQcm9wcy5jdXJyZW50ID0gd3JhcHBlclByb3BzO1xuICByZW5kZXJJc1NjaGVkdWxlZC5jdXJyZW50ID0gZmFsc2U7IC8vIElmIHRoZSByZW5kZXIgd2FzIGZyb20gYSBzdG9yZSB1cGRhdGUsIGNsZWFyIG91dCB0aGF0IHJlZmVyZW5jZSBhbmQgY2FzY2FkZSB0aGUgc3Vic2NyaWJlciB1cGRhdGVcblxuICBpZiAoY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50KSB7XG4gICAgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50ID0gbnVsbDtcbiAgICBub3RpZnlOZXN0ZWRTdWJzKCk7XG4gIH1cbn0gLy8gRWZmZWN0IGNhbGxiYWNrLCBleHRyYWN0ZWQ6IHN1YnNjcmliZSB0byB0aGUgUmVkdXggc3RvcmUgb3IgbmVhcmVzdCBjb25uZWN0ZWQgYW5jZXN0b3IsXG4vLyBjaGVjayBmb3IgdXBkYXRlcyBhZnRlciBkaXNwYXRjaGVkIGFjdGlvbnMsIGFuZCB0cmlnZ2VyIHJlLXJlbmRlcnMuXG5cblxuZnVuY3Rpb24gc3Vic2NyaWJlVXBkYXRlcyhzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsIHN0b3JlLCBzdWJzY3JpcHRpb24sIGNoaWxkUHJvcHNTZWxlY3RvciwgbGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCBpc01vdW50ZWQsIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsIG5vdGlmeU5lc3RlZFN1YnMsIC8vIGZvcmNlQ29tcG9uZW50VXBkYXRlRGlzcGF0Y2g6IFJlYWN0LkRpc3BhdGNoPGFueT4sXG5hZGRpdGlvbmFsU3Vic2NyaWJlTGlzdGVuZXIpIHtcbiAgLy8gSWYgd2UncmUgbm90IHN1YnNjcmliZWQgdG8gdGhlIHN0b3JlLCBub3RoaW5nIHRvIGRvIGhlcmVcbiAgaWYgKCFzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMpIHJldHVybiAoKSA9PiB7fTsgLy8gQ2FwdHVyZSB2YWx1ZXMgZm9yIGNoZWNraW5nIGlmIGFuZCB3aGVuIHRoaXMgY29tcG9uZW50IHVubW91bnRzXG5cbiAgbGV0IGRpZFVuc3Vic2NyaWJlID0gZmFsc2U7XG4gIGxldCBsYXN0VGhyb3duRXJyb3IgPSBudWxsOyAvLyBXZSdsbCBydW4gdGhpcyBjYWxsYmFjayBldmVyeSB0aW1lIGEgc3RvcmUgc3Vic2NyaXB0aW9uIHVwZGF0ZSBwcm9wYWdhdGVzIHRvIHRoaXMgY29tcG9uZW50XG5cbiAgY29uc3QgY2hlY2tGb3JVcGRhdGVzID0gKCkgPT4ge1xuICAgIGlmIChkaWRVbnN1YnNjcmliZSB8fCAhaXNNb3VudGVkLmN1cnJlbnQpIHtcbiAgICAgIC8vIERvbid0IHJ1biBzdGFsZSBsaXN0ZW5lcnMuXG4gICAgICAvLyBSZWR1eCBkb2Vzbid0IGd1YXJhbnRlZSB1bnN1YnNjcmlwdGlvbnMgaGFwcGVuIHVudGlsIG5leHQgZGlzcGF0Y2guXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBUT0RPIFdlJ3JlIGN1cnJlbnRseSBjYWxsaW5nIGdldFN0YXRlIG91cnNlbHZlcyBoZXJlLCByYXRoZXIgdGhhbiBsZXR0aW5nIGB1U0VTYCBkbyBpdFxuXG5cbiAgICBjb25zdCBsYXRlc3RTdG9yZVN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBsZXQgbmV3Q2hpbGRQcm9wcywgZXJyb3I7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQWN0dWFsbHkgcnVuIHRoZSBzZWxlY3RvciB3aXRoIHRoZSBtb3N0IHJlY2VudCBzdG9yZSBzdGF0ZSBhbmQgd3JhcHBlciBwcm9wc1xuICAgICAgLy8gdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIGNoaWxkIHByb3BzIHNob3VsZCBiZVxuICAgICAgbmV3Q2hpbGRQcm9wcyA9IGNoaWxkUHJvcHNTZWxlY3RvcihsYXRlc3RTdG9yZVN0YXRlLCBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yID0gZTtcbiAgICAgIGxhc3RUaHJvd25FcnJvciA9IGU7XG4gICAgfVxuXG4gICAgaWYgKCFlcnJvcikge1xuICAgICAgbGFzdFRocm93bkVycm9yID0gbnVsbDtcbiAgICB9IC8vIElmIHRoZSBjaGlsZCBwcm9wcyBoYXZlbid0IGNoYW5nZWQsIG5vdGhpbmcgdG8gZG8gaGVyZSAtIGNhc2NhZGUgdGhlIHN1YnNjcmlwdGlvbiB1cGRhdGVcblxuXG4gICAgaWYgKG5ld0NoaWxkUHJvcHMgPT09IGxhc3RDaGlsZFByb3BzLmN1cnJlbnQpIHtcbiAgICAgIGlmICghcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCkge1xuICAgICAgICBub3RpZnlOZXN0ZWRTdWJzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNhdmUgcmVmZXJlbmNlcyB0byB0aGUgbmV3IGNoaWxkIHByb3BzLiAgTm90ZSB0aGF0IHdlIHRyYWNrIHRoZSBcImNoaWxkIHByb3BzIGZyb20gc3RvcmUgdXBkYXRlXCJcbiAgICAgIC8vIGFzIGEgcmVmIGluc3RlYWQgb2YgYSB1c2VTdGF0ZS91c2VSZWR1Y2VyIGJlY2F1c2Ugd2UgbmVlZCBhIHdheSB0byBkZXRlcm1pbmUgaWYgdGhhdCB2YWx1ZSBoYXNcbiAgICAgIC8vIGJlZW4gcHJvY2Vzc2VkLiAgSWYgdGhpcyB3ZW50IGludG8gdXNlU3RhdGUvdXNlUmVkdWNlciwgd2UgY291bGRuJ3QgY2xlYXIgb3V0IHRoZSB2YWx1ZSB3aXRob3V0XG4gICAgICAvLyBmb3JjaW5nIGFub3RoZXIgcmUtcmVuZGVyLCB3aGljaCB3ZSBkb24ndCB3YW50LlxuICAgICAgbGFzdENoaWxkUHJvcHMuY3VycmVudCA9IG5ld0NoaWxkUHJvcHM7XG4gICAgICBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQgPSBuZXdDaGlsZFByb3BzO1xuICAgICAgcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCA9IHRydWU7IC8vIFRPRE8gVGhpcyBpcyBoYWNreSBhbmQgbm90IGhvdyBgdVNFU2AgaXMgbWVhbnQgdG8gYmUgdXNlZFxuICAgICAgLy8gVHJpZ2dlciB0aGUgUmVhY3QgYHVzZVN5bmNFeHRlcm5hbFN0b3JlYCBzdWJzY3JpYmVyXG5cbiAgICAgIGFkZGl0aW9uYWxTdWJzY3JpYmVMaXN0ZW5lcigpO1xuICAgIH1cbiAgfTsgLy8gQWN0dWFsbHkgc3Vic2NyaWJlIHRvIHRoZSBuZWFyZXN0IGNvbm5lY3RlZCBhbmNlc3RvciAob3Igc3RvcmUpXG5cblxuICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IGNoZWNrRm9yVXBkYXRlcztcbiAgc3Vic2NyaXB0aW9uLnRyeVN1YnNjcmliZSgpOyAvLyBQdWxsIGRhdGEgZnJvbSB0aGUgc3RvcmUgYWZ0ZXIgZmlyc3QgcmVuZGVyIGluIGNhc2UgdGhlIHN0b3JlIGhhc1xuICAvLyBjaGFuZ2VkIHNpbmNlIHdlIGJlZ2FuLlxuXG4gIGNoZWNrRm9yVXBkYXRlcygpO1xuXG4gIGNvbnN0IHVuc3Vic2NyaWJlV3JhcHBlciA9ICgpID0+IHtcbiAgICBkaWRVbnN1YnNjcmliZSA9IHRydWU7XG4gICAgc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UgPSBudWxsO1xuXG4gICAgaWYgKGxhc3RUaHJvd25FcnJvcikge1xuICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdlIGNhdWdodCBhbiBlcnJvciBkdWUgdG8gYSBiYWQgbWFwU3RhdGUgZnVuY3Rpb24sIGJ1dCB0aGVcbiAgICAgIC8vIHBhcmVudCByZS1yZW5kZXJlZCB3aXRob3V0IHRoaXMgY29tcG9uZW50IGFuZCB3ZSdyZSBhYm91dCB0byB1bm1vdW50LlxuICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGFzIGxvbmcgYXMgd2UgZG8gdG9wLWRvd24gc3Vic2NyaXB0aW9ucyBjb3JyZWN0bHksIGJ1dFxuICAgICAgLy8gaWYgd2UgZXZlciBkbyB0aG9zZSB3cm9uZywgdGhpcyB0aHJvdyB3aWxsIHN1cmZhY2UgdGhlIGVycm9yIGluIG91ciB0ZXN0cy5cbiAgICAgIC8vIEluIHRoYXQgY2FzZSwgdGhyb3cgdGhlIGVycm9yIGZyb20gaGVyZSBzbyBpdCBkb2Vzbid0IGdldCBsb3N0LlxuICAgICAgdGhyb3cgbGFzdFRocm93bkVycm9yO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gdW5zdWJzY3JpYmVXcmFwcGVyO1xufSAvLyBSZWR1Y2VyIGluaXRpYWwgc3RhdGUgY3JlYXRpb24gZm9yIG91ciB1cGRhdGUgcmVkdWNlclxuXG5cbmNvbnN0IGluaXRTdGF0ZVVwZGF0ZXMgPSAoKSA9PiBFTVBUWV9BUlJBWTtcblxuZnVuY3Rpb24gc3RyaWN0RXF1YWwoYSwgYikge1xuICByZXR1cm4gYSA9PT0gYjtcbn1cbi8qKlxyXG4gKiBJbmZlcnMgdGhlIHR5cGUgb2YgcHJvcHMgdGhhdCBhIGNvbm5lY3RvciB3aWxsIGluamVjdCBpbnRvIGEgY29tcG9uZW50LlxyXG4gKi9cblxuXG5sZXQgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkUHVyZU9wdGlvbiA9IGZhbHNlO1xuLyoqXHJcbiAqIENvbm5lY3RzIGEgUmVhY3QgY29tcG9uZW50IHRvIGEgUmVkdXggc3RvcmUuXHJcbiAqXHJcbiAqIC0gV2l0aG91dCBhcmd1bWVudHMsIGp1c3Qgd3JhcHMgdGhlIGNvbXBvbmVudCwgd2l0aG91dCBjaGFuZ2luZyB0aGUgYmVoYXZpb3IgLyBwcm9wc1xyXG4gKlxyXG4gKiAtIElmIDIgcGFyYW1zIGFyZSBwYXNzZWQgKDNyZCBwYXJhbSwgbWVyZ2VQcm9wcywgaXMgc2tpcHBlZCksIGRlZmF1bHQgYmVoYXZpb3JcclxuICogaXMgdG8gb3ZlcnJpZGUgb3duUHJvcHMgKGFzIHN0YXRlZCBpbiB0aGUgZG9jcyksIHNvIHdoYXQgcmVtYWlucyBpcyBldmVyeXRoaW5nIHRoYXQnc1xyXG4gKiBub3QgYSBzdGF0ZSBvciBkaXNwYXRjaCBwcm9wXHJcbiAqXHJcbiAqIC0gV2hlbiAzcmQgcGFyYW0gaXMgcGFzc2VkLCB3ZSBkb24ndCBrbm93IGlmIG93blByb3BzIHByb3BhZ2F0ZSBhbmQgd2hldGhlciB0aGV5XHJcbiAqIHNob3VsZCBiZSB2YWxpZCBjb21wb25lbnQgcHJvcHMsIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBtZXJnZVByb3BzIGltcGxlbWVudGF0aW9uLlxyXG4gKiBBcyBzdWNoLCBpdCBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGV4dGVuZCBvd25Qcm9wcyBpbnRlcmZhY2UgZnJvbSBzdGF0ZSBvclxyXG4gKiBkaXNwYXRjaCBwcm9wcyBvciBib3RoIHdoZW4gYXBwbGljYWJsZVxyXG4gKlxyXG4gKiBAcGFyYW0gbWFwU3RhdGVUb1Byb3BzIEEgZnVuY3Rpb24gdGhhdCBleHRyYWN0cyB2YWx1ZXMgZnJvbSBzdGF0ZVxyXG4gKiBAcGFyYW0gbWFwRGlzcGF0Y2hUb1Byb3BzIFNldHVwIGZvciBkaXNwYXRjaGluZyBhY3Rpb25zXHJcbiAqIEBwYXJhbSBtZXJnZVByb3BzIE9wdGlvbmFsIGNhbGxiYWNrIHRvIG1lcmdlIHN0YXRlIGFuZCBkaXNwYXRjaCBwcm9wcyB0b2dldGhlclxyXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgY29ubmVjdGlvblxyXG4gKlxyXG4gKi9cblxuZnVuY3Rpb24gY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywge1xuICAvLyBUaGUgYHB1cmVgIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLCBzbyBUUyBkb2Vzbid0IGxpa2UgdXMgZGVzdHJ1Y3R1cmluZyB0aGlzIHRvIGNoZWNrIGl0cyBleGlzdGVuY2UuXG4gIC8vIEB0cy1pZ25vcmVcbiAgcHVyZSxcbiAgYXJlU3RhdGVzRXF1YWwgPSBzdHJpY3RFcXVhbCxcbiAgYXJlT3duUHJvcHNFcXVhbCA9IHNoYWxsb3dFcXVhbCxcbiAgYXJlU3RhdGVQcm9wc0VxdWFsID0gc2hhbGxvd0VxdWFsLFxuICBhcmVNZXJnZWRQcm9wc0VxdWFsID0gc2hhbGxvd0VxdWFsLFxuICAvLyB1c2UgUmVhY3QncyBmb3J3YXJkUmVmIHRvIGV4cG9zZSBhIHJlZiBvZiB0aGUgd3JhcHBlZCBjb21wb25lbnRcbiAgZm9yd2FyZFJlZiA9IGZhbHNlLFxuICAvLyB0aGUgY29udGV4dCBjb25zdW1lciB0byB1c2VcbiAgY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0XG59ID0ge30pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAocHVyZSAhPT0gdW5kZWZpbmVkICYmICFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRQdXJlT3B0aW9uKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRQdXJlT3B0aW9uID0gdHJ1ZTtcbiAgICAgIHdhcm5pbmcoJ1RoZSBgcHVyZWAgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQuIGBjb25uZWN0YCBpcyBub3cgYWx3YXlzIGEgXCJwdXJlL21lbW9pemVkXCIgY29tcG9uZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgQ29udGV4dCA9IGNvbnRleHQ7XG4gIGNvbnN0IGluaXRNYXBTdGF0ZVRvUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHNGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcyk7XG4gIGNvbnN0IGluaXRNYXBEaXNwYXRjaFRvUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3J5KG1hcERpc3BhdGNoVG9Qcm9wcyk7XG4gIGNvbnN0IGluaXRNZXJnZVByb3BzID0gbWVyZ2VQcm9wc0ZhY3RvcnkobWVyZ2VQcm9wcyk7XG4gIGNvbnN0IHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyA9IEJvb2xlYW4obWFwU3RhdGVUb1Byb3BzKTtcblxuICBjb25zdCB3cmFwV2l0aENvbm5lY3QgPSBXcmFwcGVkQ29tcG9uZW50ID0+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhaXNWYWxpZEVsZW1lbnRUeXBlKFdyYXBwZWRDb21wb25lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFlvdSBtdXN0IHBhc3MgYSBjb21wb25lbnQgdG8gdGhlIGZ1bmN0aW9uIHJldHVybmVkIGJ5IGNvbm5lY3QuIEluc3RlYWQgcmVjZWl2ZWQgJHtzdHJpbmdpZnlDb21wb25lbnQoV3JhcHBlZENvbXBvbmVudCl9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgd3JhcHBlZENvbXBvbmVudE5hbWUgPSBXcmFwcGVkQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IFdyYXBwZWRDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JztcbiAgICBjb25zdCBkaXNwbGF5TmFtZSA9IGBDb25uZWN0KCR7d3JhcHBlZENvbXBvbmVudE5hbWV9KWA7XG4gICAgY29uc3Qgc2VsZWN0b3JGYWN0b3J5T3B0aW9ucyA9IHtcbiAgICAgIHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyxcbiAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgd3JhcHBlZENvbXBvbmVudE5hbWUsXG4gICAgICBXcmFwcGVkQ29tcG9uZW50LFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaW5pdE1hcFN0YXRlVG9Qcm9wcyxcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGluaXRNYXBEaXNwYXRjaFRvUHJvcHMsXG4gICAgICBpbml0TWVyZ2VQcm9wcyxcbiAgICAgIGFyZVN0YXRlc0VxdWFsLFxuICAgICAgYXJlU3RhdGVQcm9wc0VxdWFsLFxuICAgICAgYXJlT3duUHJvcHNFcXVhbCxcbiAgICAgIGFyZU1lcmdlZFByb3BzRXF1YWxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gQ29ubmVjdEZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICBjb25zdCBbcHJvcHNDb250ZXh0LCByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmLCB3cmFwcGVyUHJvcHNdID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIC8vIERpc3Rpbmd1aXNoIGJldHdlZW4gYWN0dWFsIFwiZGF0YVwiIHByb3BzIHRoYXQgd2VyZSBwYXNzZWQgdG8gdGhlIHdyYXBwZXIgY29tcG9uZW50LFxuICAgICAgICAvLyBhbmQgdmFsdWVzIG5lZWRlZCB0byBjb250cm9sIGJlaGF2aW9yIChmb3J3YXJkZWQgcmVmcywgYWx0ZXJuYXRlIGNvbnRleHQgaW5zdGFuY2VzKS5cbiAgICAgICAgLy8gVG8gbWFpbnRhaW4gdGhlIHdyYXBwZXJQcm9wcyBvYmplY3QgcmVmZXJlbmNlLCBtZW1vaXplIHRoaXMgZGVzdHJ1Y3R1cmluZy5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWZcbiAgICAgICAgfSA9IHByb3BzLFxuICAgICAgICAgICAgICB3cmFwcGVyUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShwcm9wcywgX2V4Y2x1ZGVkKTtcblxuICAgICAgICByZXR1cm4gW3Byb3BzLmNvbnRleHQsIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWYsIHdyYXBwZXJQcm9wc107XG4gICAgICB9LCBbcHJvcHNdKTtcbiAgICAgIGNvbnN0IENvbnRleHRUb1VzZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICAvLyBVc2VycyBtYXkgb3B0aW9uYWxseSBwYXNzIGluIGEgY3VzdG9tIGNvbnRleHQgaW5zdGFuY2UgdG8gdXNlIGluc3RlYWQgb2Ygb3VyIFJlYWN0UmVkdXhDb250ZXh0LlxuICAgICAgICAvLyBNZW1vaXplIHRoZSBjaGVjayB0aGF0IGRldGVybWluZXMgd2hpY2ggY29udGV4dCBpbnN0YW5jZSB3ZSBzaG91bGQgdXNlLlxuICAgICAgICByZXR1cm4gcHJvcHNDb250ZXh0ICYmIHByb3BzQ29udGV4dC5Db25zdW1lciAmJiAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlzQ29udGV4dENvbnN1bWVyKCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChwcm9wc0NvbnRleHQuQ29uc3VtZXIsIG51bGwpKSA/IHByb3BzQ29udGV4dCA6IENvbnRleHQ7XG4gICAgICB9LCBbcHJvcHNDb250ZXh0LCBDb250ZXh0XSk7IC8vIFJldHJpZXZlIHRoZSBzdG9yZSBhbmQgYW5jZXN0b3Igc3Vic2NyaXB0aW9uIHZpYSBjb250ZXh0LCBpZiBhdmFpbGFibGVcblxuICAgICAgY29uc3QgY29udGV4dFZhbHVlID0gdXNlQ29udGV4dChDb250ZXh0VG9Vc2UpOyAvLyBUaGUgc3RvcmUgX211c3RfIGV4aXN0IGFzIGVpdGhlciBhIHByb3Agb3IgaW4gY29udGV4dC5cbiAgICAgIC8vIFdlJ2xsIGNoZWNrIHRvIHNlZSBpZiBpdCBfbG9va3NfIGxpa2UgYSBSZWR1eCBzdG9yZSBmaXJzdC5cbiAgICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIHBhc3MgdGhyb3VnaCBhIGBzdG9yZWAgcHJvcCB0aGF0IGlzIGp1c3QgYSBwbGFpbiB2YWx1ZS5cblxuICAgICAgY29uc3QgZGlkU3RvcmVDb21lRnJvbVByb3BzID0gQm9vbGVhbihwcm9wcy5zdG9yZSkgJiYgQm9vbGVhbihwcm9wcy5zdG9yZS5nZXRTdGF0ZSkgJiYgQm9vbGVhbihwcm9wcy5zdG9yZS5kaXNwYXRjaCk7XG4gICAgICBjb25zdCBkaWRTdG9yZUNvbWVGcm9tQ29udGV4dCA9IEJvb2xlYW4oY29udGV4dFZhbHVlKSAmJiBCb29sZWFuKGNvbnRleHRWYWx1ZS5zdG9yZSk7XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFkaWRTdG9yZUNvbWVGcm9tUHJvcHMgJiYgIWRpZFN0b3JlQ29tZUZyb21Db250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgXCJzdG9yZVwiIGluIHRoZSBjb250ZXh0IG9mIGAgKyBgXCIke2Rpc3BsYXlOYW1lfVwiLiBFaXRoZXIgd3JhcCB0aGUgcm9vdCBjb21wb25lbnQgaW4gYSA8UHJvdmlkZXI+LCBgICsgYG9yIHBhc3MgYSBjdXN0b20gUmVhY3QgY29udGV4dCBwcm92aWRlciB0byA8UHJvdmlkZXI+IGFuZCB0aGUgY29ycmVzcG9uZGluZyBgICsgYFJlYWN0IGNvbnRleHQgY29uc3VtZXIgdG8gJHtkaXNwbGF5TmFtZX0gaW4gY29ubmVjdCBvcHRpb25zLmApO1xuICAgICAgfSAvLyBCYXNlZCBvbiB0aGUgcHJldmlvdXMgY2hlY2ssIG9uZSBvZiB0aGVzZSBtdXN0IGJlIHRydWVcblxuXG4gICAgICBjb25zdCBzdG9yZSA9IGRpZFN0b3JlQ29tZUZyb21Qcm9wcyA/IHByb3BzLnN0b3JlIDogY29udGV4dFZhbHVlLnN0b3JlO1xuICAgICAgY29uc3QgZ2V0U2VydmVyU3RhdGUgPSBkaWRTdG9yZUNvbWVGcm9tQ29udGV4dCA/IGNvbnRleHRWYWx1ZS5nZXRTZXJ2ZXJTdGF0ZSA6IHN0b3JlLmdldFN0YXRlO1xuICAgICAgY29uc3QgY2hpbGRQcm9wc1NlbGVjdG9yID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIC8vIFRoZSBjaGlsZCBwcm9wcyBzZWxlY3RvciBuZWVkcyB0aGUgc3RvcmUgcmVmZXJlbmNlIGFzIGFuIGlucHV0LlxuICAgICAgICAvLyBSZS1jcmVhdGUgdGhpcyBzZWxlY3RvciB3aGVuZXZlciB0aGUgc3RvcmUgY2hhbmdlcy5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRTZWxlY3RvckZhY3Rvcnkoc3RvcmUuZGlzcGF0Y2gsIHNlbGVjdG9yRmFjdG9yeU9wdGlvbnMpO1xuICAgICAgfSwgW3N0b3JlXSk7XG4gICAgICBjb25zdCBbc3Vic2NyaXB0aW9uLCBub3RpZnlOZXN0ZWRTdWJzXSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBpZiAoIXNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcykgcmV0dXJuIE5PX1NVQlNDUklQVElPTl9BUlJBWTsgLy8gVGhpcyBTdWJzY3JpcHRpb24ncyBzb3VyY2Ugc2hvdWxkIG1hdGNoIHdoZXJlIHN0b3JlIGNhbWUgZnJvbTogcHJvcHMgdnMuIGNvbnRleHQuIEEgY29tcG9uZW50XG4gICAgICAgIC8vIGNvbm5lY3RlZCB0byB0aGUgc3RvcmUgdmlhIHByb3BzIHNob3VsZG4ndCB1c2Ugc3Vic2NyaXB0aW9uIGZyb20gY29udGV4dCwgb3IgdmljZSB2ZXJzYS5cblxuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBjcmVhdGVTdWJzY3JpcHRpb24oc3RvcmUsIGRpZFN0b3JlQ29tZUZyb21Qcm9wcyA/IHVuZGVmaW5lZCA6IGNvbnRleHRWYWx1ZS5zdWJzY3JpcHRpb24pOyAvLyBgbm90aWZ5TmVzdGVkU3Vic2AgaXMgZHVwbGljYXRlZCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGNvbXBvbmVudCBpcyB1bm1vdW50ZWQgaW5cbiAgICAgICAgLy8gdGhlIG1pZGRsZSBvZiB0aGUgbm90aWZpY2F0aW9uIGxvb3AsIHdoZXJlIGBzdWJzY3JpcHRpb25gIHdpbGwgdGhlbiBiZSBudWxsLiBUaGlzIGNhblxuICAgICAgICAvLyBwcm9iYWJseSBiZSBhdm9pZGVkIGlmIFN1YnNjcmlwdGlvbidzIGxpc3RlbmVycyBsb2dpYyBpcyBjaGFuZ2VkIHRvIG5vdCBjYWxsIGxpc3RlbmVyc1xuICAgICAgICAvLyB0aGF0IGhhdmUgYmVlbiB1bnN1YnNjcmliZWQgaW4gdGhlICBtaWRkbGUgb2YgdGhlIG5vdGlmaWNhdGlvbiBsb29wLlxuXG4gICAgICAgIGNvbnN0IG5vdGlmeU5lc3RlZFN1YnMgPSBzdWJzY3JpcHRpb24ubm90aWZ5TmVzdGVkU3Vicy5iaW5kKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIHJldHVybiBbc3Vic2NyaXB0aW9uLCBub3RpZnlOZXN0ZWRTdWJzXTtcbiAgICAgIH0sIFtzdG9yZSwgZGlkU3RvcmVDb21lRnJvbVByb3BzLCBjb250ZXh0VmFsdWVdKTsgLy8gRGV0ZXJtaW5lIHdoYXQge3N0b3JlLCBzdWJzY3JpcHRpb259IHZhbHVlIHNob3VsZCBiZSBwdXQgaW50byBuZXN0ZWQgY29udGV4dCwgaWYgbmVjZXNzYXJ5LFxuICAgICAgLy8gYW5kIG1lbW9pemUgdGhhdCB2YWx1ZSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBjb250ZXh0IHVwZGF0ZXMuXG5cbiAgICAgIGNvbnN0IG92ZXJyaWRkZW5Db250ZXh0VmFsdWUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKGRpZFN0b3JlQ29tZUZyb21Qcm9wcykge1xuICAgICAgICAgIC8vIFRoaXMgY29tcG9uZW50IGlzIGRpcmVjdGx5IHN1YnNjcmliZWQgdG8gYSBzdG9yZSBmcm9tIHByb3BzLlxuICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgZGVzY2VuZGFudHMgcmVhZGluZyBmcm9tIHRoaXMgc3RvcmUgLSBwYXNzIGRvd24gd2hhdGV2ZXJcbiAgICAgICAgICAvLyB0aGUgZXhpc3RpbmcgY29udGV4dCB2YWx1ZSBpcyBmcm9tIHRoZSBuZWFyZXN0IGNvbm5lY3RlZCBhbmNlc3Rvci5cbiAgICAgICAgICByZXR1cm4gY29udGV4dFZhbHVlO1xuICAgICAgICB9IC8vIE90aGVyd2lzZSwgcHV0IHRoaXMgY29tcG9uZW50J3Mgc3Vic2NyaXB0aW9uIGluc3RhbmNlIGludG8gY29udGV4dCwgc28gdGhhdFxuICAgICAgICAvLyBjb25uZWN0ZWQgZGVzY2VuZGFudHMgd29uJ3QgdXBkYXRlIHVudGlsIGFmdGVyIHRoaXMgY29tcG9uZW50IGlzIGRvbmVcblxuXG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgY29udGV4dFZhbHVlLCB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfSwgW2RpZFN0b3JlQ29tZUZyb21Qcm9wcywgY29udGV4dFZhbHVlLCBzdWJzY3JpcHRpb25dKTsgLy8gU2V0IHVwIHJlZnMgdG8gY29vcmRpbmF0ZSB2YWx1ZXMgYmV0d2VlbiB0aGUgc3Vic2NyaXB0aW9uIGVmZmVjdCBhbmQgdGhlIHJlbmRlciBsb2dpY1xuXG4gICAgICBjb25zdCBsYXN0Q2hpbGRQcm9wcyA9IHVzZVJlZigpO1xuICAgICAgY29uc3QgbGFzdFdyYXBwZXJQcm9wcyA9IHVzZVJlZih3cmFwcGVyUHJvcHMpO1xuICAgICAgY29uc3QgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSA9IHVzZVJlZigpO1xuICAgICAgY29uc3QgcmVuZGVySXNTY2hlZHVsZWQgPSB1c2VSZWYoZmFsc2UpO1xuICAgICAgY29uc3QgaXNQcm9jZXNzaW5nRGlzcGF0Y2ggPSB1c2VSZWYoZmFsc2UpO1xuICAgICAgY29uc3QgaXNNb3VudGVkID0gdXNlUmVmKGZhbHNlKTtcbiAgICAgIGNvbnN0IGxhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IgPSB1c2VSZWYoKTtcbiAgICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpc01vdW50ZWQuY3VycmVudCA9IHRydWU7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgaXNNb3VudGVkLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIGNvbnN0IGFjdHVhbENoaWxkUHJvcHNTZWxlY3RvciA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RvciA9ICgpID0+IHtcbiAgICAgICAgICAvLyBUcmlja3kgbG9naWMgaGVyZTpcbiAgICAgICAgICAvLyAtIFRoaXMgcmVuZGVyIG1heSBoYXZlIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgUmVkdXggc3RvcmUgdXBkYXRlIHRoYXQgcHJvZHVjZWQgbmV3IGNoaWxkIHByb3BzXG4gICAgICAgICAgLy8gLSBIb3dldmVyLCB3ZSBtYXkgaGF2ZSBnb3R0ZW4gbmV3IHdyYXBwZXIgcHJvcHMgYWZ0ZXIgdGhhdFxuICAgICAgICAgIC8vIElmIHdlIGhhdmUgbmV3IGNoaWxkIHByb3BzLCBhbmQgdGhlIHNhbWUgd3JhcHBlciBwcm9wcywgd2Uga25vdyB3ZSBzaG91bGQgdXNlIHRoZSBuZXcgY2hpbGQgcHJvcHMgYXMtaXMuXG4gICAgICAgICAgLy8gQnV0LCBpZiB3ZSBoYXZlIG5ldyB3cmFwcGVyIHByb3BzLCB0aG9zZSBtaWdodCBjaGFuZ2UgdGhlIGNoaWxkIHByb3BzLCBzbyB3ZSBoYXZlIHRvIHJlY2FsY3VsYXRlIHRoaW5ncy5cbiAgICAgICAgICAvLyBTbywgd2UnbGwgdXNlIHRoZSBjaGlsZCBwcm9wcyBmcm9tIHN0b3JlIHVwZGF0ZSBvbmx5IGlmIHRoZSB3cmFwcGVyIHByb3BzIGFyZSB0aGUgc2FtZSBhcyBsYXN0IHRpbWUuXG4gICAgICAgICAgaWYgKGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCAmJiB3cmFwcGVyUHJvcHMgPT09IGxhc3RXcmFwcGVyUHJvcHMuY3VycmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudDtcbiAgICAgICAgICB9IC8vIFRPRE8gV2UncmUgcmVhZGluZyB0aGUgc3RvcmUgZGlyZWN0bHkgaW4gcmVuZGVyKCkgaGVyZS4gQmFkIGlkZWE/XG4gICAgICAgICAgLy8gVGhpcyB3aWxsIGxpa2VseSBjYXVzZSBCYWQgVGhpbmdzIChUTSkgdG8gaGFwcGVuIGluIENvbmN1cnJlbnQgTW9kZS5cbiAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG8gdGhpcyBiZWNhdXNlIG9uIHJlbmRlcnMgX25vdF8gY2F1c2VkIGJ5IHN0b3JlIHVwZGF0ZXMsIHdlIG5lZWQgdGhlIGxhdGVzdCBzdG9yZSBzdGF0ZVxuICAgICAgICAgIC8vIHRvIGRldGVybWluZSB3aGF0IHRoZSBjaGlsZCBwcm9wcyBzaG91bGQgYmUuXG5cblxuICAgICAgICAgIHJldHVybiBjaGlsZFByb3BzU2VsZWN0b3Ioc3RvcmUuZ2V0U3RhdGUoKSwgd3JhcHBlclByb3BzKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gc2VsZWN0b3I7XG4gICAgICB9LCBbc3RvcmUsIHdyYXBwZXJQcm9wc10pOyAvLyBXZSBuZWVkIHRoaXMgdG8gZXhlY3V0ZSBzeW5jaHJvbm91c2x5IGV2ZXJ5IHRpbWUgd2UgcmUtcmVuZGVyLiBIb3dldmVyLCBSZWFjdCB3YXJuc1xuICAgICAgLy8gYWJvdXQgdXNlTGF5b3V0RWZmZWN0IGluIFNTUiwgc28gd2UgdHJ5IHRvIGRldGVjdCBlbnZpcm9ubWVudCBhbmQgZmFsbCBiYWNrIHRvXG4gICAgICAvLyBqdXN0IHVzZUVmZmVjdCBpbnN0ZWFkIHRvIGF2b2lkIHRoZSB3YXJuaW5nLCBzaW5jZSBuZWl0aGVyIHdpbGwgcnVuIGFueXdheS5cblxuICAgICAgY29uc3Qgc3Vic2NyaWJlRm9yUmVhY3QgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3Vic2NyaWJlID0gcmVhY3RMaXN0ZW5lciA9PiB7XG4gICAgICAgICAgaWYgKCFzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlVXBkYXRlcyhzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsIHN0b3JlLCBzdWJzY3JpcHRpb24sIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBjaGlsZFByb3BzU2VsZWN0b3IsIGxhc3RXcmFwcGVyUHJvcHMsIGxhc3RDaGlsZFByb3BzLCByZW5kZXJJc1NjaGVkdWxlZCwgaXNNb3VudGVkLCBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLCBub3RpZnlOZXN0ZWRTdWJzLCByZWFjdExpc3RlbmVyKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gc3Vic2NyaWJlO1xuICAgICAgfSwgW3N1YnNjcmlwdGlvbl0pO1xuICAgICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdFdpdGhBcmdzKGNhcHR1cmVXcmFwcGVyUHJvcHMsIFtsYXN0V3JhcHBlclByb3BzLCBsYXN0Q2hpbGRQcm9wcywgcmVuZGVySXNTY2hlZHVsZWQsIHdyYXBwZXJQcm9wcywgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSwgbm90aWZ5TmVzdGVkU3Vic10pO1xuICAgICAgbGV0IGFjdHVhbENoaWxkUHJvcHM7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGFjdHVhbENoaWxkUHJvcHMgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZSggLy8gVE9ETyBXZSdyZSBwYXNzaW5nIHRocm91Z2ggYSBiaWcgd3JhcHBlciB0aGF0IGRvZXMgYSBidW5jaCBvZiBleHRyYSBzaWRlIGVmZmVjdHMgYmVzaWRlcyBzdWJzY3JpYmluZ1xuICAgICAgICBzdWJzY3JpYmVGb3JSZWFjdCwgLy8gVE9ETyBUaGlzIGlzIGluY3JlZGlibHkgaGFja3kuIFdlJ3ZlIGFscmVhZHkgcHJvY2Vzc2VkIHRoZSBzdG9yZSB1cGRhdGUgYW5kIGNhbGN1bGF0ZWQgbmV3IGNoaWxkIHByb3BzLFxuICAgICAgICAvLyBUT0RPIGFuZCB3ZSdyZSBqdXN0IHBhc3NpbmcgdGhhdCB0aHJvdWdoIHNvIGl0IHRyaWdnZXJzIGEgcmUtcmVuZGVyIGZvciB1cyByYXRoZXIgdGhhbiByZWx5aW5nIG9uIGB1U0VTYC5cbiAgICAgICAgYWN0dWFsQ2hpbGRQcm9wc1NlbGVjdG9yLCBnZXRTZXJ2ZXJTdGF0ZSA/ICgpID0+IGNoaWxkUHJvcHNTZWxlY3RvcihnZXRTZXJ2ZXJTdGF0ZSgpLCB3cmFwcGVyUHJvcHMpIDogYWN0dWFsQ2hpbGRQcm9wc1NlbGVjdG9yKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAobGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvci5jdXJyZW50KSB7XG4gICAgICAgICAgO1xuICAgICAgICAgIGVyci5tZXNzYWdlICs9IGBcXG5UaGUgZXJyb3IgbWF5IGJlIGNvcnJlbGF0ZWQgd2l0aCB0aGlzIHByZXZpb3VzIGVycm9yOlxcbiR7bGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvci5jdXJyZW50LnN0YWNrfVxcblxcbmA7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgICBsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGFzdENoaWxkUHJvcHMuY3VycmVudCA9IGFjdHVhbENoaWxkUHJvcHM7XG4gICAgICB9KTsgLy8gTm93IHRoYXQgYWxsIHRoYXQncyBkb25lLCB3ZSBjYW4gZmluYWxseSB0cnkgdG8gYWN0dWFsbHkgcmVuZGVyIHRoZSBjaGlsZCBjb21wb25lbnQuXG4gICAgICAvLyBXZSBtZW1vaXplIHRoZSBlbGVtZW50cyBmb3IgdGhlIHJlbmRlcmVkIGNoaWxkIGNvbXBvbmVudCBhcyBhbiBvcHRpbWl6YXRpb24uXG5cbiAgICAgIGNvbnN0IHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgYWN0dWFsQ2hpbGRQcm9wcywge1xuICAgICAgICAgICAgcmVmOiByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG4gICAgICB9LCBbcmVhY3RSZWR1eEZvcndhcmRlZFJlZiwgV3JhcHBlZENvbXBvbmVudCwgYWN0dWFsQ2hpbGRQcm9wc10pOyAvLyBJZiBSZWFjdCBzZWVzIHRoZSBleGFjdCBzYW1lIGVsZW1lbnQgcmVmZXJlbmNlIGFzIGxhc3QgdGltZSwgaXQgYmFpbHMgb3V0IG9mIHJlLXJlbmRlcmluZ1xuICAgICAgLy8gdGhhdCBjaGlsZCwgc2FtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBSZWFjdC5tZW1vKCkgb3IgcmV0dXJuZWQgZmFsc2UgZnJvbSBzaG91bGRDb21wb25lbnRVcGRhdGUuXG5cbiAgICAgIGNvbnN0IHJlbmRlcmVkQ2hpbGQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcykge1xuICAgICAgICAgIC8vIElmIHRoaXMgY29tcG9uZW50IGlzIHN1YnNjcmliZWQgdG8gc3RvcmUgdXBkYXRlcywgd2UgbmVlZCB0byBwYXNzIGl0cyBvd25cbiAgICAgICAgICAvLyBzdWJzY3JpcHRpb24gaW5zdGFuY2UgZG93biB0byBvdXIgZGVzY2VuZGFudHMuIFRoYXQgbWVhbnMgcmVuZGVyaW5nIHRoZSBzYW1lXG4gICAgICAgICAgLy8gQ29udGV4dCBpbnN0YW5jZSwgYW5kIHB1dHRpbmcgYSBkaWZmZXJlbnQgdmFsdWUgaW50byB0aGUgY29udGV4dC5cbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGV4dFRvVXNlLlByb3ZpZGVyLCB7XG4gICAgICAgICAgICB2YWx1ZTogb3ZlcnJpZGRlbkNvbnRleHRWYWx1ZVxuICAgICAgICAgIH0sIHJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50O1xuICAgICAgfSwgW0NvbnRleHRUb1VzZSwgcmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50LCBvdmVycmlkZGVuQ29udGV4dFZhbHVlXSk7XG4gICAgICByZXR1cm4gcmVuZGVyZWRDaGlsZDtcbiAgICB9XG5cbiAgICBjb25zdCBfQ29ubmVjdCA9IFJlYWN0Lm1lbW8oQ29ubmVjdEZ1bmN0aW9uKTtcblxuICAgIC8vIEFkZCBhIGhhY2t5IGNhc3QgdG8gZ2V0IHRoZSByaWdodCBvdXRwdXQgdHlwZVxuICAgIGNvbnN0IENvbm5lY3QgPSBfQ29ubmVjdDtcbiAgICBDb25uZWN0LldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICAgIENvbm5lY3QuZGlzcGxheU5hbWUgPSBDb25uZWN0RnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcblxuICAgIGlmIChmb3J3YXJkUmVmKSB7XG4gICAgICBjb25zdCBfZm9yd2FyZGVkID0gUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBmb3J3YXJkQ29ubmVjdFJlZihwcm9wcywgcmVmKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbm5lY3QsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgICAgIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWY6IHJlZlxuICAgICAgICB9KSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZm9yd2FyZGVkID0gX2ZvcndhcmRlZDtcbiAgICAgIGZvcndhcmRlZC5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICAgICAgZm9yd2FyZGVkLldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICAgICAgcmV0dXJuIGhvaXN0U3RhdGljcyhmb3J3YXJkZWQsIFdyYXBwZWRDb21wb25lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBob2lzdFN0YXRpY3MoQ29ubmVjdCwgV3JhcHBlZENvbXBvbmVudCk7XG4gIH07XG5cbiAgcmV0dXJuIHdyYXBXaXRoQ29ubmVjdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdDsiLCJleHBvcnQgZnVuY3Rpb24gY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkoYXJnLCBuYW1lKSB7XG4gIHJldHVybiAoZGlzcGF0Y2gsIG9wdGlvbnMpID0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWUgb2YgdHlwZSAke3R5cGVvZiBhcmd9IGZvciAke25hbWV9IGFyZ3VtZW50IHdoZW4gY29ubmVjdGluZyBjb21wb25lbnQgJHtvcHRpb25zLndyYXBwZWRDb21wb25lbnROYW1lfS5gKTtcbiAgfTtcbn0iLCJpbXBvcnQgYmluZEFjdGlvbkNyZWF0b3JzIGZyb20gJy4uL3V0aWxzL2JpbmRBY3Rpb25DcmVhdG9ycyc7XG5pbXBvcnQgeyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50LCB3cmFwTWFwVG9Qcm9wc0Z1bmMgfSBmcm9tICcuL3dyYXBNYXBUb1Byb3BzJztcbmltcG9ydCB7IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5IH0gZnJvbSAnLi9pbnZhbGlkQXJnRmFjdG9yeSc7XG5leHBvcnQgZnVuY3Rpb24gbWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yeShtYXBEaXNwYXRjaFRvUHJvcHMpIHtcbiAgcmV0dXJuIG1hcERpc3BhdGNoVG9Qcm9wcyAmJiB0eXBlb2YgbWFwRGlzcGF0Y2hUb1Byb3BzID09PSAnb2JqZWN0JyA/IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoZGlzcGF0Y2ggPT4gLy8gQHRzLWlnbm9yZVxuICBiaW5kQWN0aW9uQ3JlYXRvcnMobWFwRGlzcGF0Y2hUb1Byb3BzLCBkaXNwYXRjaCkpIDogIW1hcERpc3BhdGNoVG9Qcm9wcyA/IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoZGlzcGF0Y2ggPT4gKHtcbiAgICBkaXNwYXRjaFxuICB9KSkgOiB0eXBlb2YgbWFwRGlzcGF0Y2hUb1Byb3BzID09PSAnZnVuY3Rpb24nID8gLy8gQHRzLWlnbm9yZVxuICB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwRGlzcGF0Y2hUb1Byb3BzLCAnbWFwRGlzcGF0Y2hUb1Byb3BzJykgOiBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeShtYXBEaXNwYXRjaFRvUHJvcHMsICdtYXBEaXNwYXRjaFRvUHJvcHMnKTtcbn0iLCJpbXBvcnQgeyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50LCB3cmFwTWFwVG9Qcm9wc0Z1bmMgfSBmcm9tICcuL3dyYXBNYXBUb1Byb3BzJztcbmltcG9ydCB7IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5IH0gZnJvbSAnLi9pbnZhbGlkQXJnRmFjdG9yeSc7XG5leHBvcnQgZnVuY3Rpb24gbWFwU3RhdGVUb1Byb3BzRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMpIHtcbiAgcmV0dXJuICFtYXBTdGF0ZVRvUHJvcHMgPyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KCgpID0+ICh7fSkpIDogdHlwZW9mIG1hcFN0YXRlVG9Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/IC8vIEB0cy1pZ25vcmVcbiAgd3JhcE1hcFRvUHJvcHNGdW5jKG1hcFN0YXRlVG9Qcm9wcywgJ21hcFN0YXRlVG9Qcm9wcycpIDogY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCAnbWFwU3RhdGVUb1Byb3BzJyk7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgdmVyaWZ5UGxhaW5PYmplY3QgZnJvbSAnLi4vdXRpbHMvdmVyaWZ5UGxhaW5PYmplY3QnO1xuaW1wb3J0IHsgY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkgfSBmcm9tICcuL2ludmFsaWRBcmdGYWN0b3J5JztcbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0TWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcykge1xuICAvLyBAdHMtaWdub3JlXG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgb3duUHJvcHMsIHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBNZXJnZVByb3BzRnVuYyhtZXJnZVByb3BzKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbml0TWVyZ2VQcm9wc1Byb3h5KGRpc3BhdGNoLCB7XG4gICAgZGlzcGxheU5hbWUsXG4gICAgYXJlTWVyZ2VkUHJvcHNFcXVhbFxuICB9KSB7XG4gICAgbGV0IGhhc1J1bk9uY2UgPSBmYWxzZTtcbiAgICBsZXQgbWVyZ2VkUHJvcHM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlUHJvcHNQcm94eShzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcykge1xuICAgICAgY29uc3QgbmV4dE1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG5cbiAgICAgIGlmIChoYXNSdW5PbmNlKSB7XG4gICAgICAgIGlmICghYXJlTWVyZ2VkUHJvcHNFcXVhbChuZXh0TWVyZ2VkUHJvcHMsIG1lcmdlZFByb3BzKSkgbWVyZ2VkUHJvcHMgPSBuZXh0TWVyZ2VkUHJvcHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYXNSdW5PbmNlID0gdHJ1ZTtcbiAgICAgICAgbWVyZ2VkUHJvcHMgPSBuZXh0TWVyZ2VkUHJvcHM7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB2ZXJpZnlQbGFpbk9iamVjdChtZXJnZWRQcm9wcywgZGlzcGxheU5hbWUsICdtZXJnZVByb3BzJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgICB9O1xuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUHJvcHNGYWN0b3J5KG1lcmdlUHJvcHMpIHtcbiAgcmV0dXJuICFtZXJnZVByb3BzID8gKCkgPT4gZGVmYXVsdE1lcmdlUHJvcHMgOiB0eXBlb2YgbWVyZ2VQcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/IHdyYXBNZXJnZVByb3BzRnVuYyhtZXJnZVByb3BzKSA6IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5KG1lcmdlUHJvcHMsICdtZXJnZVByb3BzJyk7XG59IiwiaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlXCI7XG5jb25zdCBfZXhjbHVkZWQgPSBbXCJpbml0TWFwU3RhdGVUb1Byb3BzXCIsIFwiaW5pdE1hcERpc3BhdGNoVG9Qcm9wc1wiLCBcImluaXRNZXJnZVByb3BzXCJdO1xuaW1wb3J0IHZlcmlmeVN1YnNlbGVjdG9ycyBmcm9tICcuL3ZlcmlmeVN1YnNlbGVjdG9ycyc7XG5leHBvcnQgZnVuY3Rpb24gcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BhdGNoLCB7XG4gIGFyZVN0YXRlc0VxdWFsLFxuICBhcmVPd25Qcm9wc0VxdWFsLFxuICBhcmVTdGF0ZVByb3BzRXF1YWxcbn0pIHtcbiAgbGV0IGhhc1J1bkF0TGVhc3RPbmNlID0gZmFsc2U7XG4gIGxldCBzdGF0ZTtcbiAgbGV0IG93blByb3BzO1xuICBsZXQgc3RhdGVQcm9wcztcbiAgbGV0IGRpc3BhdGNoUHJvcHM7XG4gIGxldCBtZXJnZWRQcm9wcztcblxuICBmdW5jdGlvbiBoYW5kbGVGaXJzdENhbGwoZmlyc3RTdGF0ZSwgZmlyc3RPd25Qcm9wcykge1xuICAgIHN0YXRlID0gZmlyc3RTdGF0ZTtcbiAgICBvd25Qcm9wcyA9IGZpcnN0T3duUHJvcHM7XG4gICAgc3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIGRpc3BhdGNoUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIGhhc1J1bkF0TGVhc3RPbmNlID0gdHJ1ZTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXdQcm9wc0FuZE5ld1N0YXRlKCkge1xuICAgIHN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBpZiAobWFwRGlzcGF0Y2hUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBkaXNwYXRjaFByb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXdQcm9wcygpIHtcbiAgICBpZiAobWFwU3RhdGVUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgaWYgKG1hcERpc3BhdGNoVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTmV3U3RhdGUoKSB7XG4gICAgY29uc3QgbmV4dFN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBjb25zdCBzdGF0ZVByb3BzQ2hhbmdlZCA9ICFhcmVTdGF0ZVByb3BzRXF1YWwobmV4dFN0YXRlUHJvcHMsIHN0YXRlUHJvcHMpO1xuICAgIHN0YXRlUHJvcHMgPSBuZXh0U3RhdGVQcm9wcztcbiAgICBpZiAoc3RhdGVQcm9wc0NoYW5nZWQpIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlU3Vic2VxdWVudENhbGxzKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSB7XG4gICAgY29uc3QgcHJvcHNDaGFuZ2VkID0gIWFyZU93blByb3BzRXF1YWwobmV4dE93blByb3BzLCBvd25Qcm9wcyk7XG4gICAgY29uc3Qgc3RhdGVDaGFuZ2VkID0gIWFyZVN0YXRlc0VxdWFsKG5leHRTdGF0ZSwgc3RhdGUsIG5leHRPd25Qcm9wcywgb3duUHJvcHMpO1xuICAgIHN0YXRlID0gbmV4dFN0YXRlO1xuICAgIG93blByb3BzID0gbmV4dE93blByb3BzO1xuICAgIGlmIChwcm9wc0NoYW5nZWQgJiYgc3RhdGVDaGFuZ2VkKSByZXR1cm4gaGFuZGxlTmV3UHJvcHNBbmROZXdTdGF0ZSgpO1xuICAgIGlmIChwcm9wc0NoYW5nZWQpIHJldHVybiBoYW5kbGVOZXdQcm9wcygpO1xuICAgIGlmIChzdGF0ZUNoYW5nZWQpIHJldHVybiBoYW5kbGVOZXdTdGF0ZSgpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSB7XG4gICAgcmV0dXJuIGhhc1J1bkF0TGVhc3RPbmNlID8gaGFuZGxlU3Vic2VxdWVudENhbGxzKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSA6IGhhbmRsZUZpcnN0Q2FsbChuZXh0U3RhdGUsIG5leHRPd25Qcm9wcyk7XG4gIH07XG59XG4vLyBUT0RPOiBBZGQgbW9yZSBjb21tZW50c1xuLy8gVGhlIHNlbGVjdG9yIHJldHVybmVkIGJ5IHNlbGVjdG9yRmFjdG9yeSB3aWxsIG1lbW9pemUgaXRzIHJlc3VsdHMsXG4vLyBhbGxvd2luZyBjb25uZWN0J3Mgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHRvIHJldHVybiBmYWxzZSBpZiBmaW5hbFxuLy8gcHJvcHMgaGF2ZSBub3QgY2hhbmdlZC5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkoZGlzcGF0Y2gsIF9yZWYpIHtcbiAgbGV0IHtcbiAgICBpbml0TWFwU3RhdGVUb1Byb3BzLFxuICAgIGluaXRNYXBEaXNwYXRjaFRvUHJvcHMsXG4gICAgaW5pdE1lcmdlUHJvcHNcbiAgfSA9IF9yZWYsXG4gICAgICBvcHRpb25zID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZiwgX2V4Y2x1ZGVkKTtcblxuICBjb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSBpbml0TWFwU3RhdGVUb1Byb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcbiAgY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG4gIGNvbnN0IG1lcmdlUHJvcHMgPSBpbml0TWVyZ2VQcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2ZXJpZnlTdWJzZWxlY3RvcnMobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMpO1xuICB9XG5cbiAgcmV0dXJuIHB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCBkaXNwYXRjaCwgb3B0aW9ucyk7XG59IiwiaW1wb3J0IHdhcm5pbmcgZnJvbSAnLi4vdXRpbHMvd2FybmluZyc7XG5cbmZ1bmN0aW9uIHZlcmlmeShzZWxlY3RvciwgbWV0aG9kTmFtZSkge1xuICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlIGZvciAke21ldGhvZE5hbWV9IGluIGNvbm5lY3QuYCk7XG4gIH0gZWxzZSBpZiAobWV0aG9kTmFtZSA9PT0gJ21hcFN0YXRlVG9Qcm9wcycgfHwgbWV0aG9kTmFtZSA9PT0gJ21hcERpc3BhdGNoVG9Qcm9wcycpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZWxlY3RvciwgJ2RlcGVuZHNPbk93blByb3BzJykpIHtcbiAgICAgIHdhcm5pbmcoYFRoZSBzZWxlY3RvciBmb3IgJHttZXRob2ROYW1lfSBvZiBjb25uZWN0IGRpZCBub3Qgc3BlY2lmeSBhIHZhbHVlIGZvciBkZXBlbmRzT25Pd25Qcm9wcy5gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmVyaWZ5U3Vic2VsZWN0b3JzKG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzKSB7XG4gIHZlcmlmeShtYXBTdGF0ZVRvUHJvcHMsICdtYXBTdGF0ZVRvUHJvcHMnKTtcbiAgdmVyaWZ5KG1hcERpc3BhdGNoVG9Qcm9wcywgJ21hcERpc3BhdGNoVG9Qcm9wcycpO1xuICB2ZXJpZnkobWVyZ2VQcm9wcywgJ21lcmdlUHJvcHMnKTtcbn0iLCJpbXBvcnQgdmVyaWZ5UGxhaW5PYmplY3QgZnJvbSAnLi4vdXRpbHMvdmVyaWZ5UGxhaW5PYmplY3QnO1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoIC8vICogTm90ZTpcbi8vICBJdCBzZWVtcyB0aGF0IHRoZSBkaXNwYXRjaCBhcmd1bWVudFxuLy8gIGNvdWxkIGJlIGEgZGlzcGF0Y2ggZnVuY3Rpb24gaW4gc29tZSBjYXNlcyAoZXg6IHdoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc01pc3NpbmcpXG4vLyAgYW5kIGEgc3RhdGUgb2JqZWN0IGluIHNvbWUgb3RoZXJzIChleDogd2hlbk1hcFN0YXRlVG9Qcm9wc0lzTWlzc2luZylcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuZ2V0Q29uc3RhbnQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRDb25zdGFudFNlbGVjdG9yKGRpc3BhdGNoKSB7XG4gICAgY29uc3QgY29uc3RhbnQgPSBnZXRDb25zdGFudChkaXNwYXRjaCk7XG5cbiAgICBmdW5jdGlvbiBjb25zdGFudFNlbGVjdG9yKCkge1xuICAgICAgcmV0dXJuIGNvbnN0YW50O1xuICAgIH1cblxuICAgIGNvbnN0YW50U2VsZWN0b3IuZGVwZW5kc09uT3duUHJvcHMgPSBmYWxzZTtcbiAgICByZXR1cm4gY29uc3RhbnRTZWxlY3RvcjtcbiAgfTtcbn0gLy8gZGVwZW5kc09uT3duUHJvcHMgaXMgdXNlZCBieSBjcmVhdGVNYXBUb1Byb3BzUHJveHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcGFzcyBwcm9wcyBhcyBhcmdzXG4vLyB0byB0aGUgbWFwVG9Qcm9wcyBmdW5jdGlvbiBiZWluZyB3cmFwcGVkLiBJdCBpcyBhbHNvIHVzZWQgYnkgbWFrZVB1cmVQcm9wc1NlbGVjdG9yIHRvIGRldGVybWluZVxuLy8gd2hldGhlciBtYXBUb1Byb3BzIG5lZWRzIHRvIGJlIGludm9rZWQgd2hlbiBwcm9wcyBoYXZlIGNoYW5nZWQuXG4vL1xuLy8gQSBsZW5ndGggb2Ygb25lIHNpZ25hbHMgdGhhdCBtYXBUb1Byb3BzIGRvZXMgbm90IGRlcGVuZCBvbiBwcm9wcyBmcm9tIHRoZSBwYXJlbnQgY29tcG9uZW50LlxuLy8gQSBsZW5ndGggb2YgemVybyBpcyBhc3N1bWVkIHRvIG1lYW4gbWFwVG9Qcm9wcyBpcyBnZXR0aW5nIGFyZ3MgdmlhIGFyZ3VtZW50cyBvciAuLi5hcmdzIGFuZFxuLy8gdGhlcmVmb3JlIG5vdCByZXBvcnRpbmcgaXRzIGxlbmd0aCBhY2N1cmF0ZWx5Li5cbi8vIFRPRE8gQ2FuIHRoaXMgZ2V0IHB1bGxlZCBvdXQgc28gdGhhdCB3ZSBjYW4gc3Vic2NyaWJlIGRpcmVjdGx5IHRvIHRoZSBzdG9yZSBpZiB3ZSBkb24ndCBuZWVkIG93blByb3BzP1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVwZW5kc09uT3duUHJvcHMobWFwVG9Qcm9wcykge1xuICByZXR1cm4gbWFwVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcyA/IEJvb2xlYW4obWFwVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgOiBtYXBUb1Byb3BzLmxlbmd0aCAhPT0gMTtcbn0gLy8gVXNlZCBieSB3aGVuTWFwU3RhdGVUb1Byb3BzSXNGdW5jdGlvbiBhbmQgd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzRnVuY3Rpb24sXG4vLyB0aGlzIGZ1bmN0aW9uIHdyYXBzIG1hcFRvUHJvcHMgaW4gYSBwcm94eSBmdW5jdGlvbiB3aGljaCBkb2VzIHNldmVyYWwgdGhpbmdzOlxuLy9cbi8vICAqIERldGVjdHMgd2hldGhlciB0aGUgbWFwVG9Qcm9wcyBmdW5jdGlvbiBiZWluZyBjYWxsZWQgZGVwZW5kcyBvbiBwcm9wcywgd2hpY2hcbi8vICAgIGlzIHVzZWQgYnkgc2VsZWN0b3JGYWN0b3J5IHRvIGRlY2lkZSBpZiBpdCBzaG91bGQgcmVpbnZva2Ugb24gcHJvcHMgY2hhbmdlcy5cbi8vXG4vLyAgKiBPbiBmaXJzdCBjYWxsLCBoYW5kbGVzIG1hcFRvUHJvcHMgaWYgcmV0dXJucyBhbm90aGVyIGZ1bmN0aW9uLCBhbmQgdHJlYXRzIHRoYXRcbi8vICAgIG5ldyBmdW5jdGlvbiBhcyB0aGUgdHJ1ZSBtYXBUb1Byb3BzIGZvciBzdWJzZXF1ZW50IGNhbGxzLlxuLy9cbi8vICAqIE9uIGZpcnN0IGNhbGwsIHZlcmlmaWVzIHRoZSBmaXJzdCByZXN1bHQgaXMgYSBwbGFpbiBvYmplY3QsIGluIG9yZGVyIHRvIHdhcm5cbi8vICAgIHRoZSBkZXZlbG9wZXIgdGhhdCB0aGVpciBtYXBUb1Byb3BzIGZ1bmN0aW9uIGlzIG5vdCByZXR1cm5pbmcgYSB2YWxpZCByZXN1bHQuXG4vL1xuXG5leHBvcnQgZnVuY3Rpb24gd3JhcE1hcFRvUHJvcHNGdW5jKG1hcFRvUHJvcHMsIG1ldGhvZE5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRQcm94eVNlbGVjdG9yKGRpc3BhdGNoLCB7XG4gICAgZGlzcGxheU5hbWVcbiAgfSkge1xuICAgIGNvbnN0IHByb3h5ID0gZnVuY3Rpb24gbWFwVG9Qcm9wc1Byb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIHtcbiAgICAgIHJldHVybiBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA/IHByb3h5Lm1hcFRvUHJvcHMoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcykgOiBwcm94eS5tYXBUb1Byb3BzKHN0YXRlT3JEaXNwYXRjaCwgdW5kZWZpbmVkKTtcbiAgICB9OyAvLyBhbGxvdyBkZXRlY3RGYWN0b3J5QW5kVmVyaWZ5IHRvIGdldCBvd25Qcm9wc1xuXG5cbiAgICBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA9IHRydWU7XG5cbiAgICBwcm94eS5tYXBUb1Byb3BzID0gZnVuY3Rpb24gZGV0ZWN0RmFjdG9yeUFuZFZlcmlmeShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKSB7XG4gICAgICBwcm94eS5tYXBUb1Byb3BzID0gbWFwVG9Qcm9wcztcbiAgICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gZ2V0RGVwZW5kc09uT3duUHJvcHMobWFwVG9Qcm9wcyk7XG4gICAgICBsZXQgcHJvcHMgPSBwcm94eShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKTtcblxuICAgICAgaWYgKHR5cGVvZiBwcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcm94eS5tYXBUb1Byb3BzID0gcHJvcHM7XG4gICAgICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gZ2V0RGVwZW5kc09uT3duUHJvcHMocHJvcHMpO1xuICAgICAgICBwcm9wcyA9IHByb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgdmVyaWZ5UGxhaW5PYmplY3QocHJvcHMsIGRpc3BsYXlOYW1lLCBtZXRob2ROYW1lKTtcbiAgICAgIHJldHVybiBwcm9wcztcbiAgICB9O1xuXG4gICAgcmV0dXJuIHByb3h5O1xuICB9O1xufSIsImltcG9ydCBQcm92aWRlciBmcm9tICcuL2NvbXBvbmVudHMvUHJvdmlkZXInO1xuaW1wb3J0IGNvbm5lY3QgZnJvbSAnLi9jb21wb25lbnRzL2Nvbm5lY3QnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuL2NvbXBvbmVudHMvQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VEaXNwYXRjaCwgY3JlYXRlRGlzcGF0Y2hIb29rIH0gZnJvbSAnLi9ob29rcy91c2VEaXNwYXRjaCc7XG5pbXBvcnQgeyB1c2VTZWxlY3RvciwgY3JlYXRlU2VsZWN0b3JIb29rIH0gZnJvbSAnLi9ob29rcy91c2VTZWxlY3Rvcic7XG5pbXBvcnQgeyB1c2VTdG9yZSwgY3JlYXRlU3RvcmVIb29rIH0gZnJvbSAnLi9ob29rcy91c2VTdG9yZSc7XG5pbXBvcnQgc2hhbGxvd0VxdWFsIGZyb20gJy4vdXRpbHMvc2hhbGxvd0VxdWFsJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0IHsgUHJvdmlkZXIsIFJlYWN0UmVkdXhDb250ZXh0LCBjb25uZWN0LCB1c2VEaXNwYXRjaCwgY3JlYXRlRGlzcGF0Y2hIb29rLCB1c2VTZWxlY3RvciwgY3JlYXRlU2VsZWN0b3JIb29rLCB1c2VTdG9yZSwgY3JlYXRlU3RvcmVIb29rLCBzaGFsbG93RXF1YWwgfTsiLCJpbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VTdG9yZSBhcyB1c2VEZWZhdWx0U3RvcmUsIGNyZWF0ZVN0b3JlSG9vayB9IGZyb20gJy4vdXNlU3RvcmUnO1xuLyoqXHJcbiAqIEhvb2sgZmFjdG9yeSwgd2hpY2ggY3JlYXRlcyBhIGB1c2VEaXNwYXRjaGAgaG9vayBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhY3QuQ29udGV4dH0gW2NvbnRleHQ9UmVhY3RSZWR1eENvbnRleHRdIENvbnRleHQgcGFzc2VkIHRvIHlvdXIgYDxQcm92aWRlcj5gLlxyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgYHVzZURpc3BhdGNoYCBob29rIGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dC5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaXNwYXRjaEhvb2soY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0KSB7XG4gIGNvbnN0IHVzZVN0b3JlID0gLy8gQHRzLWlnbm9yZVxuICBjb250ZXh0ID09PSBSZWFjdFJlZHV4Q29udGV4dCA/IHVzZURlZmF1bHRTdG9yZSA6IGNyZWF0ZVN0b3JlSG9vayhjb250ZXh0KTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZURpc3BhdGNoKCkge1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmUoKTsgLy8gQHRzLWlnbm9yZVxuXG4gICAgcmV0dXJuIHN0b3JlLmRpc3BhdGNoO1xuICB9O1xufVxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHJlZHV4IGBkaXNwYXRjaGAgZnVuY3Rpb24uXHJcbiAqXHJcbiAqIEByZXR1cm5zIHthbnl8ZnVuY3Rpb259IHJlZHV4IHN0b3JlJ3MgYGRpc3BhdGNoYCBmdW5jdGlvblxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKlxyXG4gKiBpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCdcclxuICogaW1wb3J0IHsgdXNlRGlzcGF0Y2ggfSBmcm9tICdyZWFjdC1yZWR1eCdcclxuICpcclxuICogZXhwb3J0IGNvbnN0IENvdW50ZXJDb21wb25lbnQgPSAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAqICAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpXHJcbiAqICAgY29uc3QgaW5jcmVhc2VDb3VudGVyID0gdXNlQ2FsbGJhY2soKCkgPT4gZGlzcGF0Y2goeyB0eXBlOiAnaW5jcmVhc2UtY291bnRlcicgfSksIFtdKVxyXG4gKiAgIHJldHVybiAoXHJcbiAqICAgICA8ZGl2PlxyXG4gKiAgICAgICA8c3Bhbj57dmFsdWV9PC9zcGFuPlxyXG4gKiAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e2luY3JlYXNlQ291bnRlcn0+SW5jcmVhc2UgY291bnRlcjwvYnV0dG9uPlxyXG4gKiAgICAgPC9kaXY+XHJcbiAqICAgKVxyXG4gKiB9XHJcbiAqL1xuXG5leHBvcnQgY29uc3QgdXNlRGlzcGF0Y2ggPSAvKiNfX1BVUkVfXyovY3JlYXRlRGlzcGF0Y2hIb29rKCk7IiwiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJlYWN0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9Db250ZXh0JztcblxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHZhbHVlIG9mIHRoZSBgUmVhY3RSZWR1eENvbnRleHRgLiBUaGlzIGlzIGEgbG93LWxldmVsXHJcbiAqIGhvb2sgdGhhdCB5b3Ugc2hvdWxkIHVzdWFsbHkgbm90IG5lZWQgdG8gY2FsbCBkaXJlY3RseS5cclxuICpcclxuICogQHJldHVybnMge2FueX0gdGhlIHZhbHVlIG9mIHRoZSBgUmVhY3RSZWR1eENvbnRleHRgXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqXHJcbiAqIGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcclxuICogaW1wb3J0IHsgdXNlUmVkdXhDb250ZXh0IH0gZnJvbSAncmVhY3QtcmVkdXgnXHJcbiAqXHJcbiAqIGV4cG9ydCBjb25zdCBDb3VudGVyQ29tcG9uZW50ID0gKCkgPT4ge1xyXG4gKiAgIGNvbnN0IHsgc3RvcmUgfSA9IHVzZVJlZHV4Q29udGV4dCgpXHJcbiAqICAgcmV0dXJuIDxkaXY+e3N0b3JlLmdldFN0YXRlKCl9PC9kaXY+XHJcbiAqIH1cclxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVkdXhDb250ZXh0KCkge1xuICBjb25zdCBjb250ZXh0VmFsdWUgPSB1c2VDb250ZXh0KFJlYWN0UmVkdXhDb250ZXh0KTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhY29udGV4dFZhbHVlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZmluZCByZWFjdC1yZWR1eCBjb250ZXh0IHZhbHVlOyBwbGVhc2UgZW5zdXJlIHRoZSBjb21wb25lbnQgaXMgd3JhcHBlZCBpbiBhIDxQcm92aWRlcj4nKTtcbiAgfVxuXG4gIHJldHVybiBjb250ZXh0VmFsdWU7XG59IiwiaW1wb3J0IHsgdXNlQ29udGV4dCwgdXNlRGVidWdWYWx1ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZHV4Q29udGV4dCBhcyB1c2VEZWZhdWx0UmVkdXhDb250ZXh0IH0gZnJvbSAnLi91c2VSZWR1eENvbnRleHQnO1xuaW1wb3J0IHsgUmVhY3RSZWR1eENvbnRleHQgfSBmcm9tICcuLi9jb21wb25lbnRzL0NvbnRleHQnO1xuaW1wb3J0IHsgbm90SW5pdGlhbGl6ZWQgfSBmcm9tICcuLi91dGlscy91c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG5sZXQgdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IgPSBub3RJbml0aWFsaXplZDtcbmV4cG9ydCBjb25zdCBpbml0aWFsaXplVXNlU2VsZWN0b3IgPSBmbiA9PiB7XG4gIHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yID0gZm47XG59O1xuXG5jb25zdCByZWZFcXVhbGl0eSA9IChhLCBiKSA9PiBhID09PSBiO1xuLyoqXHJcbiAqIEhvb2sgZmFjdG9yeSwgd2hpY2ggY3JlYXRlcyBhIGB1c2VTZWxlY3RvcmAgaG9vayBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhY3QuQ29udGV4dH0gW2NvbnRleHQ9UmVhY3RSZWR1eENvbnRleHRdIENvbnRleHQgcGFzc2VkIHRvIHlvdXIgYDxQcm92aWRlcj5gLlxyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgYHVzZVNlbGVjdG9yYCBob29rIGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dC5cclxuICovXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlbGVjdG9ySG9vayhjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQpIHtcbiAgY29uc3QgdXNlUmVkdXhDb250ZXh0ID0gY29udGV4dCA9PT0gUmVhY3RSZWR1eENvbnRleHQgPyB1c2VEZWZhdWx0UmVkdXhDb250ZXh0IDogKCkgPT4gdXNlQ29udGV4dChjb250ZXh0KTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZVNlbGVjdG9yKHNlbGVjdG9yLCBlcXVhbGl0eUZuID0gcmVmRXF1YWxpdHkpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFlvdSBtdXN0IHBhc3MgYSBzZWxlY3RvciB0byB1c2VTZWxlY3RvcmApO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWW91IG11c3QgcGFzcyBhIGZ1bmN0aW9uIGFzIGEgc2VsZWN0b3IgdG8gdXNlU2VsZWN0b3JgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBlcXVhbGl0eUZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWW91IG11c3QgcGFzcyBhIGZ1bmN0aW9uIGFzIGFuIGVxdWFsaXR5IGZ1bmN0aW9uIHRvIHVzZVNlbGVjdG9yYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgc3RvcmUsXG4gICAgICBzdWJzY3JpcHRpb24sXG4gICAgICBnZXRTZXJ2ZXJTdGF0ZVxuICAgIH0gPSB1c2VSZWR1eENvbnRleHQoKTtcbiAgICBjb25zdCBzZWxlY3RlZFN0YXRlID0gdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3Ioc3Vic2NyaXB0aW9uLmFkZE5lc3RlZFN1Yiwgc3RvcmUuZ2V0U3RhdGUsIGdldFNlcnZlclN0YXRlIHx8IHN0b3JlLmdldFN0YXRlLCBzZWxlY3RvciwgZXF1YWxpdHlGbik7XG4gICAgdXNlRGVidWdWYWx1ZShzZWxlY3RlZFN0YXRlKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRTdGF0ZTtcbiAgfTtcbn1cbi8qKlxyXG4gKiBBIGhvb2sgdG8gYWNjZXNzIHRoZSByZWR1eCBzdG9yZSdzIHN0YXRlLiBUaGlzIGhvb2sgdGFrZXMgYSBzZWxlY3RvciBmdW5jdGlvblxyXG4gKiBhcyBhbiBhcmd1bWVudC4gVGhlIHNlbGVjdG9yIGlzIGNhbGxlZCB3aXRoIHRoZSBzdG9yZSBzdGF0ZS5cclxuICpcclxuICogVGhpcyBob29rIHRha2VzIGFuIG9wdGlvbmFsIGVxdWFsaXR5IGNvbXBhcmlzb24gZnVuY3Rpb24gYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXJcclxuICogdGhhdCBhbGxvd3MgeW91IHRvIGN1c3RvbWl6ZSB0aGUgd2F5IHRoZSBzZWxlY3RlZCBzdGF0ZSBpcyBjb21wYXJlZCB0byBkZXRlcm1pbmVcclxuICogd2hldGhlciB0aGUgY29tcG9uZW50IG5lZWRzIHRvIGJlIHJlLXJlbmRlcmVkLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgZnVuY3Rpb25cclxuICogQHBhcmFtIHtGdW5jdGlvbj19IGVxdWFsaXR5Rm4gdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSBlcXVhbGl0eVxyXG4gKlxyXG4gKiBAcmV0dXJucyB7YW55fSB0aGUgc2VsZWN0ZWQgc3RhdGVcclxuICpcclxuICogQGV4YW1wbGVcclxuICpcclxuICogaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xyXG4gKiBpbXBvcnQgeyB1c2VTZWxlY3RvciB9IGZyb20gJ3JlYWN0LXJlZHV4J1xyXG4gKlxyXG4gKiBleHBvcnQgY29uc3QgQ291bnRlckNvbXBvbmVudCA9ICgpID0+IHtcclxuICogICBjb25zdCBjb3VudGVyID0gdXNlU2VsZWN0b3Ioc3RhdGUgPT4gc3RhdGUuY291bnRlcilcclxuICogICByZXR1cm4gPGRpdj57Y291bnRlcn08L2Rpdj5cclxuICogfVxyXG4gKi9cblxuZXhwb3J0IGNvbnN0IHVzZVNlbGVjdG9yID0gLyojX19QVVJFX18qL2NyZWF0ZVNlbGVjdG9ySG9vaygpOyIsImltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSZWFjdFJlZHV4Q29udGV4dCB9IGZyb20gJy4uL2NvbXBvbmVudHMvQ29udGV4dCc7XG5pbXBvcnQgeyB1c2VSZWR1eENvbnRleHQgYXMgdXNlRGVmYXVsdFJlZHV4Q29udGV4dCB9IGZyb20gJy4vdXNlUmVkdXhDb250ZXh0Jztcbi8qKlxyXG4gKiBIb29rIGZhY3RvcnksIHdoaWNoIGNyZWF0ZXMgYSBgdXNlU3RvcmVgIGhvb2sgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0LlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWN0LkNvbnRleHR9IFtjb250ZXh0PVJlYWN0UmVkdXhDb250ZXh0XSBDb250ZXh0IHBhc3NlZCB0byB5b3VyIGA8UHJvdmlkZXI+YC5cclxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGB1c2VTdG9yZWAgaG9vayBib3VuZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RvcmVIb29rKGNvbnRleHQgPSBSZWFjdFJlZHV4Q29udGV4dCkge1xuICBjb25zdCB1c2VSZWR1eENvbnRleHQgPSAvLyBAdHMtaWdub3JlXG4gIGNvbnRleHQgPT09IFJlYWN0UmVkdXhDb250ZXh0ID8gdXNlRGVmYXVsdFJlZHV4Q29udGV4dCA6ICgpID0+IHVzZUNvbnRleHQoY29udGV4dCk7XG4gIHJldHVybiBmdW5jdGlvbiB1c2VTdG9yZSgpIHtcbiAgICBjb25zdCB7XG4gICAgICBzdG9yZVxuICAgIH0gPSB1c2VSZWR1eENvbnRleHQoKTsgLy8gQHRzLWlnbm9yZVxuXG4gICAgcmV0dXJuIHN0b3JlO1xuICB9O1xufVxuLyoqXHJcbiAqIEEgaG9vayB0byBhY2Nlc3MgdGhlIHJlZHV4IHN0b3JlLlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7YW55fSB0aGUgcmVkdXggc3RvcmVcclxuICpcclxuICogQGV4YW1wbGVcclxuICpcclxuICogaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xyXG4gKiBpbXBvcnQgeyB1c2VTdG9yZSB9IGZyb20gJ3JlYWN0LXJlZHV4J1xyXG4gKlxyXG4gKiBleHBvcnQgY29uc3QgRXhhbXBsZUNvbXBvbmVudCA9ICgpID0+IHtcclxuICogICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlKClcclxuICogICByZXR1cm4gPGRpdj57c3RvcmUuZ2V0U3RhdGUoKX08L2Rpdj5cclxuICogfVxyXG4gKi9cblxuZXhwb3J0IGNvbnN0IHVzZVN0b3JlID0gLyojX19QVVJFX18qL2NyZWF0ZVN0b3JlSG9vaygpOyIsIi8vIFRoZSBwcmltYXJ5IGVudHJ5IHBvaW50IGFzc3VtZXMgd2UncmUgd29ya2luZyB3aXRoIHN0YW5kYXJkIFJlYWN0RE9NL1JOLCBidXRcbi8vIG9sZGVyIHZlcnNpb25zIHRoYXQgZG8gbm90IGluY2x1ZGUgYHVzZVN5bmNFeHRlcm5hbFN0b3JlYCAoUmVhY3QgMTYuOSAtIDE3LngpLlxuLy8gQmVjYXVzZSBvZiB0aGF0LCB0aGUgdXNlU3luY0V4dGVybmFsU3RvcmUgY29tcGF0IHNoaW0gaXMgbmVlZGVkLlxuaW1wb3J0IHsgdXNlU3luY0V4dGVybmFsU3RvcmUgfSBmcm9tICd1c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltJztcbmltcG9ydCB7IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yIH0gZnJvbSAndXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvc2hpbS93aXRoLXNlbGVjdG9yJztcbmltcG9ydCB7IHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIGFzIGJhdGNoIH0gZnJvbSAnLi91dGlscy9yZWFjdEJhdGNoZWRVcGRhdGVzJztcbmltcG9ydCB7IHNldEJhdGNoIH0gZnJvbSAnLi91dGlscy9iYXRjaCc7XG5pbXBvcnQgeyBpbml0aWFsaXplVXNlU2VsZWN0b3IgfSBmcm9tICcuL2hvb2tzL3VzZVNlbGVjdG9yJztcbmltcG9ydCB7IGluaXRpYWxpemVDb25uZWN0IH0gZnJvbSAnLi9jb21wb25lbnRzL2Nvbm5lY3QnO1xuaW5pdGlhbGl6ZVVzZVNlbGVjdG9yKHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKTtcbmluaXRpYWxpemVDb25uZWN0KHVzZVN5bmNFeHRlcm5hbFN0b3JlKTsgLy8gRW5hYmxlIGJhdGNoZWQgdXBkYXRlcyBpbiBvdXIgc3Vic2NyaXB0aW9ucyBmb3IgdXNlXG4vLyB3aXRoIHN0YW5kYXJkIFJlYWN0IHJlbmRlcmVycyAoUmVhY3RET00sIFJlYWN0IE5hdGl2ZSlcblxuc2V0QmF0Y2goYmF0Y2gpO1xuZXhwb3J0IHsgYmF0Y2ggfTtcbmV4cG9ydCAqIGZyb20gJy4vZXhwb3J0cyc7IiwiZXhwb3J0IHt9OyIsImltcG9ydCB7IGdldEJhdGNoIH0gZnJvbSAnLi9iYXRjaCc7IC8vIGVuY2Fwc3VsYXRlcyB0aGUgc3Vic2NyaXB0aW9uIGxvZ2ljIGZvciBjb25uZWN0aW5nIGEgY29tcG9uZW50IHRvIHRoZSByZWR1eCBzdG9yZSwgYXNcbi8vIHdlbGwgYXMgbmVzdGluZyBzdWJzY3JpcHRpb25zIG9mIGRlc2NlbmRhbnQgY29tcG9uZW50cywgc28gdGhhdCB3ZSBjYW4gZW5zdXJlIHRoZVxuLy8gYW5jZXN0b3IgY29tcG9uZW50cyByZS1yZW5kZXIgYmVmb3JlIGRlc2NlbmRhbnRzXG5cbmZ1bmN0aW9uIGNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbigpIHtcbiAgY29uc3QgYmF0Y2ggPSBnZXRCYXRjaCgpO1xuICBsZXQgZmlyc3QgPSBudWxsO1xuICBsZXQgbGFzdCA9IG51bGw7XG4gIHJldHVybiB7XG4gICAgY2xlYXIoKSB7XG4gICAgICBmaXJzdCA9IG51bGw7XG4gICAgICBsYXN0ID0gbnVsbDtcbiAgICB9LFxuXG4gICAgbm90aWZ5KCkge1xuICAgICAgYmF0Y2goKCkgPT4ge1xuICAgICAgICBsZXQgbGlzdGVuZXIgPSBmaXJzdDtcblxuICAgICAgICB3aGlsZSAobGlzdGVuZXIpIHtcbiAgICAgICAgICBsaXN0ZW5lci5jYWxsYmFjaygpO1xuICAgICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGdldCgpIHtcbiAgICAgIGxldCBsaXN0ZW5lcnMgPSBbXTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IGZpcnN0O1xuXG4gICAgICB3aGlsZSAobGlzdGVuZXIpIHtcbiAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyLm5leHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaXN0ZW5lcnM7XG4gICAgfSxcblxuICAgIHN1YnNjcmliZShjYWxsYmFjaykge1xuICAgICAgbGV0IGlzU3Vic2NyaWJlZCA9IHRydWU7XG4gICAgICBsZXQgbGlzdGVuZXIgPSBsYXN0ID0ge1xuICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgcHJldjogbGFzdFxuICAgICAgfTtcblxuICAgICAgaWYgKGxpc3RlbmVyLnByZXYpIHtcbiAgICAgICAgbGlzdGVuZXIucHJldi5uZXh0ID0gbGlzdGVuZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaXJzdCA9IGxpc3RlbmVyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICAgIGlmICghaXNTdWJzY3JpYmVkIHx8IGZpcnN0ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChsaXN0ZW5lci5uZXh0KSB7XG4gICAgICAgICAgbGlzdGVuZXIubmV4dC5wcmV2ID0gbGlzdGVuZXIucHJldjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYXN0ID0gbGlzdGVuZXIucHJldjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0ZW5lci5wcmV2KSB7XG4gICAgICAgICAgbGlzdGVuZXIucHJldi5uZXh0ID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaXJzdCA9IGxpc3RlbmVyLm5leHQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gIH07XG59XG5cbmNvbnN0IG51bGxMaXN0ZW5lcnMgPSB7XG4gIG5vdGlmeSgpIHt9LFxuXG4gIGdldDogKCkgPT4gW11cbn07XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3Vic2NyaXB0aW9uKHN0b3JlLCBwYXJlbnRTdWIpIHtcbiAgbGV0IHVuc3Vic2NyaWJlO1xuICBsZXQgbGlzdGVuZXJzID0gbnVsbExpc3RlbmVycztcblxuICBmdW5jdGlvbiBhZGROZXN0ZWRTdWIobGlzdGVuZXIpIHtcbiAgICB0cnlTdWJzY3JpYmUoKTtcbiAgICByZXR1cm4gbGlzdGVuZXJzLnN1YnNjcmliZShsaXN0ZW5lcik7XG4gIH1cblxuICBmdW5jdGlvbiBub3RpZnlOZXN0ZWRTdWJzKCkge1xuICAgIGxpc3RlbmVycy5ub3RpZnkoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNoYW5nZVdyYXBwZXIoKSB7XG4gICAgaWYgKHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlKSB7XG4gICAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU3Vic2NyaWJlZCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih1bnN1YnNjcmliZSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cnlTdWJzY3JpYmUoKSB7XG4gICAgaWYgKCF1bnN1YnNjcmliZSkge1xuICAgICAgdW5zdWJzY3JpYmUgPSBwYXJlbnRTdWIgPyBwYXJlbnRTdWIuYWRkTmVzdGVkU3ViKGhhbmRsZUNoYW5nZVdyYXBwZXIpIDogc3RvcmUuc3Vic2NyaWJlKGhhbmRsZUNoYW5nZVdyYXBwZXIpO1xuICAgICAgbGlzdGVuZXJzID0gY3JlYXRlTGlzdGVuZXJDb2xsZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdHJ5VW5zdWJzY3JpYmUoKSB7XG4gICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgdW5zdWJzY3JpYmUgPSB1bmRlZmluZWQ7XG4gICAgICBsaXN0ZW5lcnMuY2xlYXIoKTtcbiAgICAgIGxpc3RlbmVycyA9IG51bGxMaXN0ZW5lcnM7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3Vic2NyaXB0aW9uID0ge1xuICAgIGFkZE5lc3RlZFN1YixcbiAgICBub3RpZnlOZXN0ZWRTdWJzLFxuICAgIGhhbmRsZUNoYW5nZVdyYXBwZXIsXG4gICAgaXNTdWJzY3JpYmVkLFxuICAgIHRyeVN1YnNjcmliZSxcbiAgICB0cnlVbnN1YnNjcmliZSxcbiAgICBnZXRMaXN0ZW5lcnM6ICgpID0+IGxpc3RlbmVyc1xuICB9O1xuICByZXR1cm4gc3Vic2NyaXB0aW9uO1xufSIsIi8vIERlZmF1bHQgdG8gYSBkdW1teSBcImJhdGNoXCIgaW1wbGVtZW50YXRpb24gdGhhdCBqdXN0IHJ1bnMgdGhlIGNhbGxiYWNrXG5mdW5jdGlvbiBkZWZhdWx0Tm9vcEJhdGNoKGNhbGxiYWNrKSB7XG4gIGNhbGxiYWNrKCk7XG59XG5cbmxldCBiYXRjaCA9IGRlZmF1bHROb29wQmF0Y2g7IC8vIEFsbG93IGluamVjdGluZyBhbm90aGVyIGJhdGNoaW5nIGZ1bmN0aW9uIGxhdGVyXG5cbmV4cG9ydCBjb25zdCBzZXRCYXRjaCA9IG5ld0JhdGNoID0+IGJhdGNoID0gbmV3QmF0Y2g7IC8vIFN1cHBseSBhIGdldHRlciBqdXN0IHRvIHNraXAgZGVhbGluZyB3aXRoIEVTTSBiaW5kaW5nc1xuXG5leHBvcnQgY29uc3QgZ2V0QmF0Y2ggPSAoKSA9PiBiYXRjaDsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGNvbnN0IGJvdW5kQWN0aW9uQ3JlYXRvcnMgPSB7fTtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBhY3Rpb25DcmVhdG9ycykge1xuICAgIGNvbnN0IGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSAoLi4uYXJncykgPT4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvciguLi5hcmdzKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59IiwiLyoqXHJcbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0byBpbnNwZWN0LlxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cclxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGxldCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHJldHVybiB0cnVlO1xuICBsZXQgYmFzZVByb3RvID0gcHJvdG87XG5cbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihiYXNlUHJvdG8pICE9PSBudWxsKSB7XG4gICAgYmFzZVByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGJhc2VQcm90byk7XG4gIH1cblxuICByZXR1cm4gcHJvdG8gPT09IGJhc2VQcm90bztcbn0iLCJleHBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gJ3JlYWN0LWRvbSc7IiwiZnVuY3Rpb24gaXMoeCwgeSkge1xuICBpZiAoeCA9PT0geSkge1xuICAgIHJldHVybiB4ICE9PSAwIHx8IHkgIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIpIHtcbiAgaWYgKGlzKG9iakEsIG9iakIpKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAodHlwZW9mIG9iakEgIT09ICdvYmplY3QnIHx8IG9iakEgPT09IG51bGwgfHwgdHlwZW9mIG9iakIgIT09ICdvYmplY3QnIHx8IG9iakIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICBjb25zdCBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNBLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqQiwga2V5c0FbaV0pIHx8ICFpcyhvYmpBW2tleXNBW2ldXSwgb2JqQltrZXlzQVtpXV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59IiwiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tICdyZWFjdCc7IC8vIFJlYWN0IGN1cnJlbnRseSB0aHJvd3MgYSB3YXJuaW5nIHdoZW4gdXNpbmcgdXNlTGF5b3V0RWZmZWN0IG9uIHRoZSBzZXJ2ZXIuXG4vLyBUbyBnZXQgYXJvdW5kIGl0LCB3ZSBjYW4gY29uZGl0aW9uYWxseSB1c2VFZmZlY3Qgb24gdGhlIHNlcnZlciAobm8tb3ApIGFuZFxuLy8gdXNlTGF5b3V0RWZmZWN0IGluIHRoZSBicm93c2VyLiBXZSBuZWVkIHVzZUxheW91dEVmZmVjdCB0byBlbnN1cmUgdGhlIHN0b3JlXG4vLyBzdWJzY3JpcHRpb24gY2FsbGJhY2sgYWx3YXlzIGhhcyB0aGUgc2VsZWN0b3IgZnJvbSB0aGUgbGF0ZXN0IHJlbmRlciBjb21taXRcbi8vIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGEgc3RvcmUgdXBkYXRlIG1heSBoYXBwZW4gYmV0d2VlbiByZW5kZXIgYW5kIHRoZSBlZmZlY3QsXG4vLyB3aGljaCBtYXkgY2F1c2UgbWlzc2VkIHVwZGF0ZXM7IHdlIGFsc28gbXVzdCBlbnN1cmUgdGhlIHN0b3JlIHN1YnNjcmlwdGlvblxuLy8gaXMgY3JlYXRlZCBzeW5jaHJvbm91c2x5LCBvdGhlcndpc2UgYSBzdG9yZSB1cGRhdGUgbWF5IG9jY3VyIGJlZm9yZSB0aGVcbi8vIHN1YnNjcmlwdGlvbiBpcyBjcmVhdGVkIGFuZCBhbiBpbmNvbnNpc3RlbnQgc3RhdGUgbWF5IGJlIG9ic2VydmVkXG4vLyBNYXRjaGVzIGxvZ2ljIGluIFJlYWN0J3MgYHNoYXJlZC9FeGVjdXRpb25FbnZpcm9ubWVudGAgZmlsZVxuXG5leHBvcnQgY29uc3QgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSAndW5kZWZpbmVkJyk7XG5leHBvcnQgY29uc3QgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCA9IGNhblVzZURPTSA/IHVzZUxheW91dEVmZmVjdCA6IHVzZUVmZmVjdDsiLCJleHBvcnQgY29uc3Qgbm90SW5pdGlhbGl6ZWQgPSAoKSA9PiB7XG4gIHRocm93IG5ldyBFcnJvcigndVNFUyBub3QgaW5pdGlhbGl6ZWQhJyk7XG59OyIsImltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJy4vaXNQbGFpbk9iamVjdCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICcuL3dhcm5pbmcnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmVyaWZ5UGxhaW5PYmplY3QodmFsdWUsIGRpc3BsYXlOYW1lLCBtZXRob2ROYW1lKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICB3YXJuaW5nKGAke21ldGhvZE5hbWV9KCkgaW4gJHtkaXNwbGF5TmFtZX0gbXVzdCByZXR1cm4gYSBwbGFpbiBvYmplY3QuIEluc3RlYWQgcmVjZWl2ZWQgJHt2YWx1ZX0uYCk7XG4gIH1cbn0iLCIvKipcclxuICogUHJpbnRzIGEgd2FybmluZyBpbiB0aGUgY29uc29sZSBpZiBpdCBleGlzdHMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIFRoZSB3YXJuaW5nIG1lc3NhZ2UuXHJcbiAqIEByZXR1cm5zIHt2b2lkfVxyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuXG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IGlmIHlvdSBlbmFibGVcbiAgICAvLyBcImJyZWFrIG9uIGFsbCBleGNlcHRpb25zXCIgaW4geW91ciBjb25zb2xlLFxuICAgIC8vIGl0IHdvdWxkIHBhdXNlIHRoZSBleGVjdXRpb24gYXQgdGhpcyBsaW5lLlxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1lbXB0eSAqL1xuICB9IGNhdGNoIChlKSB7fVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWVtcHR5ICovXG5cbn0iLCIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC1pcy5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpO1xudmFyIFJFQUNUX1NFUlZFUl9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zZXJ2ZXJfY29udGV4dCcpO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGF6eScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBlbmFibGVTY29wZUFQSSA9IGZhbHNlOyAvLyBFeHBlcmltZW50YWwgQ3JlYXRlIEV2ZW50IEhhbmRsZSBBUEkuXG52YXIgZW5hYmxlQ2FjaGVFbGVtZW50ID0gZmFsc2U7XG52YXIgZW5hYmxlVHJhbnNpdGlvblRyYWNpbmcgPSBmYWxzZTsgLy8gTm8ga25vd24gYnVncywgYnV0IG5lZWRzIHBlcmZvcm1hbmNlIHRlc3RpbmdcblxudmFyIGVuYWJsZUxlZ2FjeUhpZGRlbiA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRmliZXJcbi8vIHN0dWZmLiBJbnRlbmRlZCB0byBlbmFibGUgUmVhY3QgY29yZSBtZW1iZXJzIHRvIG1vcmUgZWFzaWx5IGRlYnVnIHNjaGVkdWxpbmdcbi8vIGlzc3VlcyBpbiBERVYgYnVpbGRzLlxuXG52YXIgZW5hYmxlRGVidWdUcmFjaW5nID0gZmFsc2U7IC8vIFRyYWNrIHdoaWNoIEZpYmVyKHMpIHNjaGVkdWxlIHJlbmRlciB3b3JrLlxuXG52YXIgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRTtcblxue1xuICBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFID0gU3ltYm9sLmZvcigncmVhY3QubW9kdWxlLnJlZmVyZW5jZScpO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm90ZTogdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgKGUuZy4gaWYgaXQncyBhIHBvbHlmaWxsKS5cblxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgZW5hYmxlRGVidWdUcmFjaW5nICB8fCB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IGVuYWJsZUxlZ2FjeUhpZGRlbiAgfHwgdHlwZSA9PT0gUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgfHwgZW5hYmxlU2NvcGVBUEkgIHx8IGVuYWJsZUNhY2hlRWxlbWVudCAgfHwgZW5hYmxlVHJhbnNpdGlvblRyYWNpbmcgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIFRoaXMgbmVlZHMgdG8gaW5jbHVkZSBhbGwgcG9zc2libGUgbW9kdWxlIHJlZmVyZW5jZSBvYmplY3RcbiAgICAvLyB0eXBlcyBzdXBwb3J0ZWQgYnkgYW55IEZsaWdodCBjb25maWd1cmF0aW9uIGFueXdoZXJlIHNpbmNlXG4gICAgLy8gd2UgZG9uJ3Qga25vdyB3aGljaCBGbGlnaHQgYnVpbGQgdGhpcyB3aWxsIGVuZCB1cCBiZWluZyB1c2VkXG4gICAgLy8gd2l0aC5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFIHx8IHR5cGUuZ2V0TW9kdWxlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0eXBlT2Yob2JqZWN0KSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBvYmplY3QuJCR0eXBlb2Y7XG5cbiAgICBzd2l0Y2ggKCQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgdmFyIHR5cGUgPSBvYmplY3QudHlwZTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1NFUlZFUl9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZlR5cGU7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbnZhciBDb250ZXh0Q29uc3VtZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbnZhciBFbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xudmFyIEZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xudmFyIEZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbnZhciBMYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xudmFyIE1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG52YXIgUG9ydGFsID0gUkVBQ1RfUE9SVEFMX1RZUEU7XG52YXIgUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xudmFyIFN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xudmFyIFN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbnZhciBTdXNwZW5zZUxpc3QgPSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG52YXIgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSBmYWxzZTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxOCsuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNDb25jdXJyZW50TW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxOCsuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUxpc3Qob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFO1xufVxuXG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IENvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5FbGVtZW50ID0gRWxlbWVudDtcbmV4cG9ydHMuRm9yd2FyZFJlZiA9IEZvcndhcmRSZWY7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLkxhenkgPSBMYXp5O1xuZXhwb3J0cy5NZW1vID0gTWVtbztcbmV4cG9ydHMuUG9ydGFsID0gUG9ydGFsO1xuZXhwb3J0cy5Qcm9maWxlciA9IFByb2ZpbGVyO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gU3RyaWN0TW9kZTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBTdXNwZW5zZTtcbmV4cG9ydHMuU3VzcGVuc2VMaXN0ID0gU3VzcGVuc2VMaXN0O1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzU3VzcGVuc2VMaXN0ID0gaXNTdXNwZW5zZUxpc3Q7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2FwYXRoeScsXG4gIGF1dGhvcjogJ2phbm5payBzaWViZXJ0IChodHRwczovL2dpdGh1Yi5jb20vamFubmlrcyknLFxuICBiYXNlMDA6ICcjMDMxQTE2JyxcbiAgYmFzZTAxOiAnIzBCMzQyRCcsXG4gIGJhc2UwMjogJyMxODRFNDUnLFxuICBiYXNlMDM6ICcjMkI2ODVFJyxcbiAgYmFzZTA0OiAnIzVGOUM5MicsXG4gIGJhc2UwNTogJyM4MUI1QUMnLFxuICBiYXNlMDY6ICcjQTdDRUM4JyxcbiAgYmFzZTA3OiAnI0QyRTdFNCcsXG4gIGJhc2UwODogJyMzRTk2ODgnLFxuICBiYXNlMDk6ICcjM0U3OTk2JyxcbiAgYmFzZTBBOiAnIzNFNEM5NicsXG4gIGJhc2UwQjogJyM4ODNFOTYnLFxuICBiYXNlMEM6ICcjOTYzRTRDJyxcbiAgYmFzZTBEOiAnIzk2ODgzRScsXG4gIGJhc2UwRTogJyM0Qzk2M0UnLFxuICBiYXNlMEY6ICcjM0U5NjVCJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnYXNoZXMnLFxuICBhdXRob3I6ICdqYW5uaWsgc2llYmVydCAoaHR0cHM6Ly9naXRodWIuY29tL2phbm5pa3MpJyxcbiAgYmFzZTAwOiAnIzFDMjAyMycsXG4gIGJhc2UwMTogJyMzOTNGNDUnLFxuICBiYXNlMDI6ICcjNTY1RTY1JyxcbiAgYmFzZTAzOiAnIzc0N0M4NCcsXG4gIGJhc2UwNDogJyNBREIzQkEnLFxuICBiYXNlMDU6ICcjQzdDQ0QxJyxcbiAgYmFzZTA2OiAnI0RGRTJFNScsXG4gIGJhc2UwNzogJyNGM0Y0RjUnLFxuICBiYXNlMDg6ICcjQzdBRTk1JyxcbiAgYmFzZTA5OiAnI0M3Qzc5NScsXG4gIGJhc2UwQTogJyNBRUM3OTUnLFxuICBiYXNlMEI6ICcjOTVDN0FFJyxcbiAgYmFzZTBDOiAnIzk1QUVDNycsXG4gIGJhc2UwRDogJyNBRTk1QzcnLFxuICBiYXNlMEU6ICcjQzc5NUFFJyxcbiAgYmFzZTBGOiAnI0M3OTU5NSdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2F0ZWxpZXIgZHVuZScsXG4gIGF1dGhvcjogJ2JyYW0gZGUgaGFhbiAoaHR0cDovL2F0ZWxpZXJicmFtLmdpdGh1Yi5pby9zeW50YXgtaGlnaGxpZ2h0aW5nL2F0ZWxpZXItc2NoZW1lcy9kdW5lKScsXG4gIGJhc2UwMDogJyMyMDIwMWQnLFxuICBiYXNlMDE6ICcjMjkyODI0JyxcbiAgYmFzZTAyOiAnIzZlNmI1ZScsXG4gIGJhc2UwMzogJyM3ZDdhNjgnLFxuICBiYXNlMDQ6ICcjOTk5NTgwJyxcbiAgYmFzZTA1OiAnI2E2YTI4YycsXG4gIGJhc2UwNjogJyNlOGU0Y2YnLFxuICBiYXNlMDc6ICcjZmVmYmVjJyxcbiAgYmFzZTA4OiAnI2Q3MzczNycsXG4gIGJhc2UwOTogJyNiNjU2MTEnLFxuICBiYXNlMEE6ICcjY2ZiMDE3JyxcbiAgYmFzZTBCOiAnIzYwYWMzOScsXG4gIGJhc2UwQzogJyMxZmFkODMnLFxuICBiYXNlMEQ6ICcjNjY4NGUxJyxcbiAgYmFzZTBFOiAnI2I4NTRkNCcsXG4gIGJhc2UwRjogJyNkNDM1NTInXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdhdGVsaWVyIGZvcmVzdCcsXG4gIGF1dGhvcjogJ2JyYW0gZGUgaGFhbiAoaHR0cDovL2F0ZWxpZXJicmFtLmdpdGh1Yi5pby9zeW50YXgtaGlnaGxpZ2h0aW5nL2F0ZWxpZXItc2NoZW1lcy9mb3Jlc3QpJyxcbiAgYmFzZTAwOiAnIzFiMTkxOCcsXG4gIGJhc2UwMTogJyMyYzI0MjEnLFxuICBiYXNlMDI6ICcjNjg2MTVlJyxcbiAgYmFzZTAzOiAnIzc2NmU2YicsXG4gIGJhc2UwNDogJyM5Yzk0OTEnLFxuICBiYXNlMDU6ICcjYThhMTlmJyxcbiAgYmFzZTA2OiAnI2U2ZTJlMCcsXG4gIGJhc2UwNzogJyNmMWVmZWUnLFxuICBiYXNlMDg6ICcjZjIyYzQwJyxcbiAgYmFzZTA5OiAnI2RmNTMyMCcsXG4gIGJhc2UwQTogJyNkNTkxMWEnLFxuICBiYXNlMEI6ICcjNWFiNzM4JyxcbiAgYmFzZTBDOiAnIzAwYWQ5YycsXG4gIGJhc2UwRDogJyM0MDdlZTcnLFxuICBiYXNlMEU6ICcjNjY2NmVhJyxcbiAgYmFzZTBGOiAnI2MzM2ZmMydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2F0ZWxpZXIgaGVhdGgnLFxuICBhdXRob3I6ICdicmFtIGRlIGhhYW4gKGh0dHA6Ly9hdGVsaWVyYnJhbS5naXRodWIuaW8vc3ludGF4LWhpZ2hsaWdodGluZy9hdGVsaWVyLXNjaGVtZXMvaGVhdGgpJyxcbiAgYmFzZTAwOiAnIzFiMTgxYicsXG4gIGJhc2UwMTogJyMyOTIzMjknLFxuICBiYXNlMDI6ICcjNjk1ZDY5JyxcbiAgYmFzZTAzOiAnIzc3Njk3NycsXG4gIGJhc2UwNDogJyM5ZThmOWUnLFxuICBiYXNlMDU6ICcjYWI5YmFiJyxcbiAgYmFzZTA2OiAnI2Q4Y2FkOCcsXG4gIGJhc2UwNzogJyNmN2YzZjcnLFxuICBiYXNlMDg6ICcjY2E0MDJiJyxcbiAgYmFzZTA5OiAnI2E2NTkyNicsXG4gIGJhc2UwQTogJyNiYjhhMzUnLFxuICBiYXNlMEI6ICcjMzc5YTM3JyxcbiAgYmFzZTBDOiAnIzE1OTM5MycsXG4gIGJhc2UwRDogJyM1MTZhZWMnLFxuICBiYXNlMEU6ICcjN2I1OWMwJyxcbiAgYmFzZTBGOiAnI2NjMzNjYydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2F0ZWxpZXIgbGFrZXNpZGUnLFxuICBhdXRob3I6ICdicmFtIGRlIGhhYW4gKGh0dHA6Ly9hdGVsaWVyYnJhbS5naXRodWIuaW8vc3ludGF4LWhpZ2hsaWdodGluZy9hdGVsaWVyLXNjaGVtZXMvbGFrZXNpZGUvKScsXG4gIGJhc2UwMDogJyMxNjFiMWQnLFxuICBiYXNlMDE6ICcjMWYyOTJlJyxcbiAgYmFzZTAyOiAnIzUxNmQ3YicsXG4gIGJhc2UwMzogJyM1YTdiOGMnLFxuICBiYXNlMDQ6ICcjNzE5NWE4JyxcbiAgYmFzZTA1OiAnIzdlYTJiNCcsXG4gIGJhc2UwNjogJyNjMWU0ZjYnLFxuICBiYXNlMDc6ICcjZWJmOGZmJyxcbiAgYmFzZTA4OiAnI2QyMmQ3MicsXG4gIGJhc2UwOTogJyM5MzVjMjUnLFxuICBiYXNlMEE6ICcjOGE4YTBmJyxcbiAgYmFzZTBCOiAnIzU2OGMzYicsXG4gIGJhc2UwQzogJyMyZDhmNmYnLFxuICBiYXNlMEQ6ICcjMjU3ZmFkJyxcbiAgYmFzZTBFOiAnIzVkNWRiMScsXG4gIGJhc2UwRjogJyNiNzJkZDInXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdhdGVsaWVyIHNlYXNpZGUnLFxuICBhdXRob3I6ICdicmFtIGRlIGhhYW4gKGh0dHA6Ly9hdGVsaWVyYnJhbS5naXRodWIuaW8vc3ludGF4LWhpZ2hsaWdodGluZy9hdGVsaWVyLXNjaGVtZXMvc2Vhc2lkZS8pJyxcbiAgYmFzZTAwOiAnIzEzMTUxMycsXG4gIGJhc2UwMTogJyMyNDI5MjQnLFxuICBiYXNlMDI6ICcjNWU2ZTVlJyxcbiAgYmFzZTAzOiAnIzY4N2Q2OCcsXG4gIGJhc2UwNDogJyM4MDk5ODAnLFxuICBiYXNlMDU6ICcjOGNhNjhjJyxcbiAgYmFzZTA2OiAnI2NmZThjZicsXG4gIGJhc2UwNzogJyNmMGZmZjAnLFxuICBiYXNlMDg6ICcjZTYxOTNjJyxcbiAgYmFzZTA5OiAnIzg3NzExZCcsXG4gIGJhc2UwQTogJyNjM2MzMjInLFxuICBiYXNlMEI6ICcjMjlhMzI5JyxcbiAgYmFzZTBDOiAnIzE5OTliMycsXG4gIGJhc2UwRDogJyMzZDYyZjUnLFxuICBiYXNlMEU6ICcjYWQyYmVlJyxcbiAgYmFzZTBGOiAnI2U2MTljMydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2Jlc3BpbicsXG4gIGF1dGhvcjogJ2phbiB0LiBzb3R0JyxcbiAgYmFzZTAwOiAnIzI4MjExYycsXG4gIGJhc2UwMTogJyMzNjMxMmUnLFxuICBiYXNlMDI6ICcjNWU1ZDVjJyxcbiAgYmFzZTAzOiAnIzY2NjY2NicsXG4gIGJhc2UwNDogJyM3OTc5NzcnLFxuICBiYXNlMDU6ICcjOGE4OTg2JyxcbiAgYmFzZTA2OiAnIzlkOWI5NycsXG4gIGJhc2UwNzogJyNiYWFlOWUnLFxuICBiYXNlMDg6ICcjY2Y2YTRjJyxcbiAgYmFzZTA5OiAnI2NmN2QzNCcsXG4gIGJhc2UwQTogJyNmOWVlOTgnLFxuICBiYXNlMEI6ICcjNTRiZTBkJyxcbiAgYmFzZTBDOiAnI2FmYzRkYicsXG4gIGJhc2UwRDogJyM1ZWE2ZWEnLFxuICBiYXNlMEU6ICcjOWI4NTlkJyxcbiAgYmFzZTBGOiAnIzkzNzEyMSdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2JyZXdlcicsXG4gIGF1dGhvcjogJ3RpbW90aMOpZSBwb2lzb3QgKGh0dHA6Ly9naXRodWIuY29tL3Rwb2lzb3QpJyxcbiAgYmFzZTAwOiAnIzBjMGQwZScsXG4gIGJhc2UwMTogJyMyZTJmMzAnLFxuICBiYXNlMDI6ICcjNTE1MjUzJyxcbiAgYmFzZTAzOiAnIzczNzQ3NScsXG4gIGJhc2UwNDogJyM5NTk2OTcnLFxuICBiYXNlMDU6ICcjYjdiOGI5JyxcbiAgYmFzZTA2OiAnI2RhZGJkYycsXG4gIGJhc2UwNzogJyNmY2ZkZmUnLFxuICBiYXNlMDg6ICcjZTMxYTFjJyxcbiAgYmFzZTA5OiAnI2U2NTUwZCcsXG4gIGJhc2UwQTogJyNkY2EwNjAnLFxuICBiYXNlMEI6ICcjMzFhMzU0JyxcbiAgYmFzZTBDOiAnIzgwYjFkMycsXG4gIGJhc2UwRDogJyMzMTgyYmQnLFxuICBiYXNlMEU6ICcjNzU2YmIxJyxcbiAgYmFzZTBGOiAnI2IxNTkyOCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2JyaWdodCcsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMwMDAwMDAnLFxuICBiYXNlMDE6ICcjMzAzMDMwJyxcbiAgYmFzZTAyOiAnIzUwNTA1MCcsXG4gIGJhc2UwMzogJyNiMGIwYjAnLFxuICBiYXNlMDQ6ICcjZDBkMGQwJyxcbiAgYmFzZTA1OiAnI2UwZTBlMCcsXG4gIGJhc2UwNjogJyNmNWY1ZjUnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI2ZiMDEyMCcsXG4gIGJhc2UwOTogJyNmYzZkMjQnLFxuICBiYXNlMEE6ICcjZmRhMzMxJyxcbiAgYmFzZTBCOiAnI2ExYzY1OScsXG4gIGJhc2UwQzogJyM3NmM3YjcnLFxuICBiYXNlMEQ6ICcjNmZiM2QyJyxcbiAgYmFzZTBFOiAnI2QzODFjMycsXG4gIGJhc2UwRjogJyNiZTY0M2MnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdjaGFsaycsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMxNTE1MTUnLFxuICBiYXNlMDE6ICcjMjAyMDIwJyxcbiAgYmFzZTAyOiAnIzMwMzAzMCcsXG4gIGJhc2UwMzogJyM1MDUwNTAnLFxuICBiYXNlMDQ6ICcjYjBiMGIwJyxcbiAgYmFzZTA1OiAnI2QwZDBkMCcsXG4gIGJhc2UwNjogJyNlMGUwZTAnLFxuICBiYXNlMDc6ICcjZjVmNWY1JyxcbiAgYmFzZTA4OiAnI2ZiOWZiMScsXG4gIGJhc2UwOTogJyNlZGE5ODcnLFxuICBiYXNlMEE6ICcjZGRiMjZmJyxcbiAgYmFzZTBCOiAnI2FjYzI2NycsXG4gIGJhc2UwQzogJyMxMmNmYzAnLFxuICBiYXNlMEQ6ICcjNmZjMmVmJyxcbiAgYmFzZTBFOiAnI2UxYTNlZScsXG4gIGJhc2UwRjogJyNkZWFmOGYnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdjb2Rlc2Nob29sJyxcbiAgYXV0aG9yOiAnYnJldHRvZjg2JyxcbiAgYmFzZTAwOiAnIzIzMmMzMScsXG4gIGJhc2UwMTogJyMxYzM2NTcnLFxuICBiYXNlMDI6ICcjMmEzNDNhJyxcbiAgYmFzZTAzOiAnIzNmNDk0NCcsXG4gIGJhc2UwNDogJyM4NDg5OGMnLFxuICBiYXNlMDU6ICcjOWVhN2E2JyxcbiAgYmFzZTA2OiAnI2E3Y2ZhMycsXG4gIGJhc2UwNzogJyNiNWQ4ZjYnLFxuICBiYXNlMDg6ICcjMmE1NDkxJyxcbiAgYmFzZTA5OiAnIzQzODIwZCcsXG4gIGJhc2UwQTogJyNhMDNiMWUnLFxuICBiYXNlMEI6ICcjMjM3OTg2JyxcbiAgYmFzZTBDOiAnI2IwMmYzMCcsXG4gIGJhc2UwRDogJyM0ODRkNzknLFxuICBiYXNlMEU6ICcjYzU5ODIwJyxcbiAgYmFzZTBGOiAnI2M5ODM0NCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2NvbG9ycycsXG4gIGF1dGhvcjogJ21ybXJzIChodHRwOi8vY2xycy5jYyknLFxuICBiYXNlMDA6ICcjMTExMTExJyxcbiAgYmFzZTAxOiAnIzMzMzMzMycsXG4gIGJhc2UwMjogJyM1NTU1NTUnLFxuICBiYXNlMDM6ICcjNzc3Nzc3JyxcbiAgYmFzZTA0OiAnIzk5OTk5OScsXG4gIGJhc2UwNTogJyNiYmJiYmInLFxuICBiYXNlMDY6ICcjZGRkZGRkJyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNmZjQxMzYnLFxuICBiYXNlMDk6ICcjZmY4NTFiJyxcbiAgYmFzZTBBOiAnI2ZmZGMwMCcsXG4gIGJhc2UwQjogJyMyZWNjNDAnLFxuICBiYXNlMEM6ICcjN2ZkYmZmJyxcbiAgYmFzZTBEOiAnIzAwNzRkOScsXG4gIGJhc2UwRTogJyNiMTBkYzknLFxuICBiYXNlMEY6ICcjODUxNDRiJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnZGVmYXVsdCcsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMxODE4MTgnLFxuICBiYXNlMDE6ICcjMjgyODI4JyxcbiAgYmFzZTAyOiAnIzM4MzgzOCcsXG4gIGJhc2UwMzogJyM1ODU4NTgnLFxuICBiYXNlMDQ6ICcjYjhiOGI4JyxcbiAgYmFzZTA1OiAnI2Q4ZDhkOCcsXG4gIGJhc2UwNjogJyNlOGU4ZTgnLFxuICBiYXNlMDc6ICcjZjhmOGY4JyxcbiAgYmFzZTA4OiAnI2FiNDY0MicsXG4gIGJhc2UwOTogJyNkYzk2NTYnLFxuICBiYXNlMEE6ICcjZjdjYTg4JyxcbiAgYmFzZTBCOiAnI2ExYjU2YycsXG4gIGJhc2UwQzogJyM4NmMxYjknLFxuICBiYXNlMEQ6ICcjN2NhZmMyJyxcbiAgYmFzZTBFOiAnI2JhOGJhZicsXG4gIGJhc2UwRjogJyNhMTY5NDYnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdlaWdodGllcycsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMyZDJkMmQnLFxuICBiYXNlMDE6ICcjMzkzOTM5JyxcbiAgYmFzZTAyOiAnIzUxNTE1MScsXG4gIGJhc2UwMzogJyM3NDczNjknLFxuICBiYXNlMDQ6ICcjYTA5ZjkzJyxcbiAgYmFzZTA1OiAnI2QzZDBjOCcsXG4gIGJhc2UwNjogJyNlOGU2ZGYnLFxuICBiYXNlMDc6ICcjZjJmMGVjJyxcbiAgYmFzZTA4OiAnI2YyNzc3YScsXG4gIGJhc2UwOTogJyNmOTkxNTcnLFxuICBiYXNlMEE6ICcjZmZjYzY2JyxcbiAgYmFzZTBCOiAnIzk5Y2M5OScsXG4gIGJhc2UwQzogJyM2NmNjY2MnLFxuICBiYXNlMEQ6ICcjNjY5OWNjJyxcbiAgYmFzZTBFOiAnI2NjOTljYycsXG4gIGJhc2UwRjogJyNkMjdiNTMnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdlbWJlcnMnLFxuICBhdXRob3I6ICdqYW5uaWsgc2llYmVydCAoaHR0cHM6Ly9naXRodWIuY29tL2phbm5pa3MpJyxcbiAgYmFzZTAwOiAnIzE2MTMwRicsXG4gIGJhc2UwMTogJyMyQzI2MjAnLFxuICBiYXNlMDI6ICcjNDMzQjMyJyxcbiAgYmFzZTAzOiAnIzVBNTA0NycsXG4gIGJhc2UwNDogJyM4QTgwNzUnLFxuICBiYXNlMDU6ICcjQTM5QTkwJyxcbiAgYmFzZTA2OiAnI0JFQjZBRScsXG4gIGJhc2UwNzogJyNEQkQ2RDEnLFxuICBiYXNlMDg6ICcjODI2RDU3JyxcbiAgYmFzZTA5OiAnIzgyODI1NycsXG4gIGJhc2UwQTogJyM2RDgyNTcnLFxuICBiYXNlMEI6ICcjNTc4MjZEJyxcbiAgYmFzZTBDOiAnIzU3NkQ4MicsXG4gIGJhc2UwRDogJyM2RDU3ODInLFxuICBiYXNlMEU6ICcjODI1NzZEJyxcbiAgYmFzZTBGOiAnIzgyNTc1Nydcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2ZsYXQnLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMkMzRTUwJyxcbiAgYmFzZTAxOiAnIzM0NDk1RScsXG4gIGJhc2UwMjogJyM3RjhDOEQnLFxuICBiYXNlMDM6ICcjOTVBNUE2JyxcbiAgYmFzZTA0OiAnI0JEQzNDNycsXG4gIGJhc2UwNTogJyNlMGUwZTAnLFxuICBiYXNlMDY6ICcjZjVmNWY1JyxcbiAgYmFzZTA3OiAnI0VDRjBGMScsXG4gIGJhc2UwODogJyNFNzRDM0MnLFxuICBiYXNlMDk6ICcjRTY3RTIyJyxcbiAgYmFzZTBBOiAnI0YxQzQwRicsXG4gIGJhc2UwQjogJyMyRUNDNzEnLFxuICBiYXNlMEM6ICcjMUFCQzlDJyxcbiAgYmFzZTBEOiAnIzM0OThEQicsXG4gIGJhc2UwRTogJyM5QjU5QjYnLFxuICBiYXNlMEY6ICcjYmU2NDNjJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnZ29vZ2xlJyxcbiAgYXV0aG9yOiAnc2V0aCB3cmlnaHQgKGh0dHA6Ly9zZXRoYXdyaWdodC5jb20pJyxcbiAgYmFzZTAwOiAnIzFkMWYyMScsXG4gIGJhc2UwMTogJyMyODJhMmUnLFxuICBiYXNlMDI6ICcjMzczYjQxJyxcbiAgYmFzZTAzOiAnIzk2OTg5NicsXG4gIGJhc2UwNDogJyNiNGI3YjQnLFxuICBiYXNlMDU6ICcjYzVjOGM2JyxcbiAgYmFzZTA2OiAnI2UwZTBlMCcsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjQ0MzNDJCJyxcbiAgYmFzZTA5OiAnI0Y5NkEzOCcsXG4gIGJhc2UwQTogJyNGQkE5MjInLFxuICBiYXNlMEI6ICcjMTk4ODQ0JyxcbiAgYmFzZTBDOiAnIzM5NzFFRCcsXG4gIGJhc2UwRDogJyMzOTcxRUQnLFxuICBiYXNlMEU6ICcjQTM2QUM3JyxcbiAgYmFzZTBGOiAnIzM5NzFFRCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2dyYXlzY2FsZScsXG4gIGF1dGhvcjogJ2FsZXhhbmRyZSBnYXZpb2xpIChodHRwczovL2dpdGh1Yi5jb20vYWxleHgyLyknLFxuICBiYXNlMDA6ICcjMTAxMDEwJyxcbiAgYmFzZTAxOiAnIzI1MjUyNScsXG4gIGJhc2UwMjogJyM0NjQ2NDYnLFxuICBiYXNlMDM6ICcjNTI1MjUyJyxcbiAgYmFzZTA0OiAnI2FiYWJhYicsXG4gIGJhc2UwNTogJyNiOWI5YjknLFxuICBiYXNlMDY6ICcjZTNlM2UzJyxcbiAgYmFzZTA3OiAnI2Y3ZjdmNycsXG4gIGJhc2UwODogJyM3YzdjN2MnLFxuICBiYXNlMDk6ICcjOTk5OTk5JyxcbiAgYmFzZTBBOiAnI2EwYTBhMCcsXG4gIGJhc2UwQjogJyM4ZThlOGUnLFxuICBiYXNlMEM6ICcjODY4Njg2JyxcbiAgYmFzZTBEOiAnIzY4Njg2OCcsXG4gIGJhc2UwRTogJyM3NDc0NzQnLFxuICBiYXNlMEY6ICcjNWU1ZTVlJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnZ3JlZW4gc2NyZWVuJyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzAwMTEwMCcsXG4gIGJhc2UwMTogJyMwMDMzMDAnLFxuICBiYXNlMDI6ICcjMDA1NTAwJyxcbiAgYmFzZTAzOiAnIzAwNzcwMCcsXG4gIGJhc2UwNDogJyMwMDk5MDAnLFxuICBiYXNlMDU6ICcjMDBiYjAwJyxcbiAgYmFzZTA2OiAnIzAwZGQwMCcsXG4gIGJhc2UwNzogJyMwMGZmMDAnLFxuICBiYXNlMDg6ICcjMDA3NzAwJyxcbiAgYmFzZTA5OiAnIzAwOTkwMCcsXG4gIGJhc2UwQTogJyMwMDc3MDAnLFxuICBiYXNlMEI6ICcjMDBiYjAwJyxcbiAgYmFzZTBDOiAnIzAwNTUwMCcsXG4gIGJhc2UwRDogJyMwMDk5MDAnLFxuICBiYXNlMEU6ICcjMDBiYjAwJyxcbiAgYmFzZTBGOiAnIzAwNTUwMCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2hhcm1vbmljMTYnLFxuICBhdXRob3I6ICdqYW5uaWsgc2llYmVydCAoaHR0cHM6Ly9naXRodWIuY29tL2phbm5pa3MpJyxcbiAgYmFzZTAwOiAnIzBiMWMyYycsXG4gIGJhc2UwMTogJyMyMjNiNTQnLFxuICBiYXNlMDI6ICcjNDA1Yzc5JyxcbiAgYmFzZTAzOiAnIzYyN2U5OScsXG4gIGJhc2UwNDogJyNhYWJjY2UnLFxuICBiYXNlMDU6ICcjY2JkNmUyJyxcbiAgYmFzZTA2OiAnI2U1ZWJmMScsXG4gIGJhc2UwNzogJyNmN2Y5ZmInLFxuICBiYXNlMDg6ICcjYmY4YjU2JyxcbiAgYmFzZTA5OiAnI2JmYmY1NicsXG4gIGJhc2UwQTogJyM4YmJmNTYnLFxuICBiYXNlMEI6ICcjNTZiZjhiJyxcbiAgYmFzZTBDOiAnIzU2OGJiZicsXG4gIGJhc2UwRDogJyM4YjU2YmYnLFxuICBiYXNlMEU6ICcjYmY1NjhiJyxcbiAgYmFzZTBGOiAnI2JmNTY1Nidcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ2hvcHNjb3RjaCcsXG4gIGF1dGhvcjogJ2phbiB0LiBzb3R0JyxcbiAgYmFzZTAwOiAnIzMyMjkzMScsXG4gIGJhc2UwMTogJyM0MzNiNDInLFxuICBiYXNlMDI6ICcjNWM1NDViJyxcbiAgYmFzZTAzOiAnIzc5NzM3OScsXG4gIGJhc2UwNDogJyM5ODk0OTgnLFxuICBiYXNlMDU6ICcjYjliNWI4JyxcbiAgYmFzZTA2OiAnI2Q1ZDNkNScsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjZGQ0NjRjJyxcbiAgYmFzZTA5OiAnI2ZkOGIxOScsXG4gIGJhc2UwQTogJyNmZGNjNTknLFxuICBiYXNlMEI6ICcjOGZjMTNlJyxcbiAgYmFzZTBDOiAnIzE0OWI5MycsXG4gIGJhc2UwRDogJyMxMjkwYmYnLFxuICBiYXNlMEU6ICcjYzg1ZTdjJyxcbiAgYmFzZTBGOiAnI2IzMzUwOCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZShvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9ialsnZGVmYXVsdCddIDogb2JqOyB9XG5cbnZhciBfdGhyZWV6ZXJvdHdvZm91ciA9IHJlcXVpcmUoJy4vdGhyZWV6ZXJvdHdvZm91cicpO1xuXG5leHBvcnRzLnRocmVlemVyb3R3b2ZvdXIgPSBfaW50ZXJvcFJlcXVpcmUoX3RocmVlemVyb3R3b2ZvdXIpO1xuXG52YXIgX2FwYXRoeSA9IHJlcXVpcmUoJy4vYXBhdGh5Jyk7XG5cbmV4cG9ydHMuYXBhdGh5ID0gX2ludGVyb3BSZXF1aXJlKF9hcGF0aHkpO1xuXG52YXIgX2FzaGVzID0gcmVxdWlyZSgnLi9hc2hlcycpO1xuXG5leHBvcnRzLmFzaGVzID0gX2ludGVyb3BSZXF1aXJlKF9hc2hlcyk7XG5cbnZhciBfYXRlbGllckR1bmUgPSByZXF1aXJlKCcuL2F0ZWxpZXItZHVuZScpO1xuXG5leHBvcnRzLmF0ZWxpZXJEdW5lID0gX2ludGVyb3BSZXF1aXJlKF9hdGVsaWVyRHVuZSk7XG5cbnZhciBfYXRlbGllckZvcmVzdCA9IHJlcXVpcmUoJy4vYXRlbGllci1mb3Jlc3QnKTtcblxuZXhwb3J0cy5hdGVsaWVyRm9yZXN0ID0gX2ludGVyb3BSZXF1aXJlKF9hdGVsaWVyRm9yZXN0KTtcblxudmFyIF9hdGVsaWVySGVhdGggPSByZXF1aXJlKCcuL2F0ZWxpZXItaGVhdGgnKTtcblxuZXhwb3J0cy5hdGVsaWVySGVhdGggPSBfaW50ZXJvcFJlcXVpcmUoX2F0ZWxpZXJIZWF0aCk7XG5cbnZhciBfYXRlbGllckxha2VzaWRlID0gcmVxdWlyZSgnLi9hdGVsaWVyLWxha2VzaWRlJyk7XG5cbmV4cG9ydHMuYXRlbGllckxha2VzaWRlID0gX2ludGVyb3BSZXF1aXJlKF9hdGVsaWVyTGFrZXNpZGUpO1xuXG52YXIgX2F0ZWxpZXJTZWFzaWRlID0gcmVxdWlyZSgnLi9hdGVsaWVyLXNlYXNpZGUnKTtcblxuZXhwb3J0cy5hdGVsaWVyU2Vhc2lkZSA9IF9pbnRlcm9wUmVxdWlyZShfYXRlbGllclNlYXNpZGUpO1xuXG52YXIgX2Jlc3BpbiA9IHJlcXVpcmUoJy4vYmVzcGluJyk7XG5cbmV4cG9ydHMuYmVzcGluID0gX2ludGVyb3BSZXF1aXJlKF9iZXNwaW4pO1xuXG52YXIgX2JyZXdlciA9IHJlcXVpcmUoJy4vYnJld2VyJyk7XG5cbmV4cG9ydHMuYnJld2VyID0gX2ludGVyb3BSZXF1aXJlKF9icmV3ZXIpO1xuXG52YXIgX2JyaWdodCA9IHJlcXVpcmUoJy4vYnJpZ2h0Jyk7XG5cbmV4cG9ydHMuYnJpZ2h0ID0gX2ludGVyb3BSZXF1aXJlKF9icmlnaHQpO1xuXG52YXIgX2NoYWxrID0gcmVxdWlyZSgnLi9jaGFsaycpO1xuXG5leHBvcnRzLmNoYWxrID0gX2ludGVyb3BSZXF1aXJlKF9jaGFsayk7XG5cbnZhciBfY29kZXNjaG9vbCA9IHJlcXVpcmUoJy4vY29kZXNjaG9vbCcpO1xuXG5leHBvcnRzLmNvZGVzY2hvb2wgPSBfaW50ZXJvcFJlcXVpcmUoX2NvZGVzY2hvb2wpO1xuXG52YXIgX2NvbG9ycyA9IHJlcXVpcmUoJy4vY29sb3JzJyk7XG5cbmV4cG9ydHMuY29sb3JzID0gX2ludGVyb3BSZXF1aXJlKF9jb2xvcnMpO1xuXG52YXIgX2RlZmF1bHQgPSByZXF1aXJlKCcuL2RlZmF1bHQnKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gX2ludGVyb3BSZXF1aXJlKF9kZWZhdWx0KTtcblxudmFyIF9laWdodGllcyA9IHJlcXVpcmUoJy4vZWlnaHRpZXMnKTtcblxuZXhwb3J0cy5laWdodGllcyA9IF9pbnRlcm9wUmVxdWlyZShfZWlnaHRpZXMpO1xuXG52YXIgX2VtYmVycyA9IHJlcXVpcmUoJy4vZW1iZXJzJyk7XG5cbmV4cG9ydHMuZW1iZXJzID0gX2ludGVyb3BSZXF1aXJlKF9lbWJlcnMpO1xuXG52YXIgX2ZsYXQgPSByZXF1aXJlKCcuL2ZsYXQnKTtcblxuZXhwb3J0cy5mbGF0ID0gX2ludGVyb3BSZXF1aXJlKF9mbGF0KTtcblxudmFyIF9nb29nbGUgPSByZXF1aXJlKCcuL2dvb2dsZScpO1xuXG5leHBvcnRzLmdvb2dsZSA9IF9pbnRlcm9wUmVxdWlyZShfZ29vZ2xlKTtcblxudmFyIF9ncmF5c2NhbGUgPSByZXF1aXJlKCcuL2dyYXlzY2FsZScpO1xuXG5leHBvcnRzLmdyYXlzY2FsZSA9IF9pbnRlcm9wUmVxdWlyZShfZ3JheXNjYWxlKTtcblxudmFyIF9ncmVlbnNjcmVlbiA9IHJlcXVpcmUoJy4vZ3JlZW5zY3JlZW4nKTtcblxuZXhwb3J0cy5ncmVlbnNjcmVlbiA9IF9pbnRlcm9wUmVxdWlyZShfZ3JlZW5zY3JlZW4pO1xuXG52YXIgX2hhcm1vbmljID0gcmVxdWlyZSgnLi9oYXJtb25pYycpO1xuXG5leHBvcnRzLmhhcm1vbmljID0gX2ludGVyb3BSZXF1aXJlKF9oYXJtb25pYyk7XG5cbnZhciBfaG9wc2NvdGNoID0gcmVxdWlyZSgnLi9ob3BzY290Y2gnKTtcblxuZXhwb3J0cy5ob3BzY290Y2ggPSBfaW50ZXJvcFJlcXVpcmUoX2hvcHNjb3RjaCk7XG5cbnZhciBfaXNvdG9wZSA9IHJlcXVpcmUoJy4vaXNvdG9wZScpO1xuXG5leHBvcnRzLmlzb3RvcGUgPSBfaW50ZXJvcFJlcXVpcmUoX2lzb3RvcGUpO1xuXG52YXIgX21hcnJha2VzaCA9IHJlcXVpcmUoJy4vbWFycmFrZXNoJyk7XG5cbmV4cG9ydHMubWFycmFrZXNoID0gX2ludGVyb3BSZXF1aXJlKF9tYXJyYWtlc2gpO1xuXG52YXIgX21vY2hhID0gcmVxdWlyZSgnLi9tb2NoYScpO1xuXG5leHBvcnRzLm1vY2hhID0gX2ludGVyb3BSZXF1aXJlKF9tb2NoYSk7XG5cbnZhciBfbW9ub2thaSA9IHJlcXVpcmUoJy4vbW9ub2thaScpO1xuXG5leHBvcnRzLm1vbm9rYWkgPSBfaW50ZXJvcFJlcXVpcmUoX21vbm9rYWkpO1xuXG52YXIgX29jZWFuID0gcmVxdWlyZSgnLi9vY2VhbicpO1xuXG5leHBvcnRzLm9jZWFuID0gX2ludGVyb3BSZXF1aXJlKF9vY2Vhbik7XG5cbnZhciBfcGFyYWlzbyA9IHJlcXVpcmUoJy4vcGFyYWlzbycpO1xuXG5leHBvcnRzLnBhcmFpc28gPSBfaW50ZXJvcFJlcXVpcmUoX3BhcmFpc28pO1xuXG52YXIgX3BvcCA9IHJlcXVpcmUoJy4vcG9wJyk7XG5cbmV4cG9ydHMucG9wID0gX2ludGVyb3BSZXF1aXJlKF9wb3ApO1xuXG52YXIgX3JhaWxzY2FzdHMgPSByZXF1aXJlKCcuL3JhaWxzY2FzdHMnKTtcblxuZXhwb3J0cy5yYWlsc2Nhc3RzID0gX2ludGVyb3BSZXF1aXJlKF9yYWlsc2Nhc3RzKTtcblxudmFyIF9zaGFwZXNoaWZ0ZXIgPSByZXF1aXJlKCcuL3NoYXBlc2hpZnRlcicpO1xuXG5leHBvcnRzLnNoYXBlc2hpZnRlciA9IF9pbnRlcm9wUmVxdWlyZShfc2hhcGVzaGlmdGVyKTtcblxudmFyIF9zb2xhcml6ZWQgPSByZXF1aXJlKCcuL3NvbGFyaXplZCcpO1xuXG5leHBvcnRzLnNvbGFyaXplZCA9IF9pbnRlcm9wUmVxdWlyZShfc29sYXJpemVkKTtcblxudmFyIF9zdW1tZXJmcnVpdCA9IHJlcXVpcmUoJy4vc3VtbWVyZnJ1aXQnKTtcblxuZXhwb3J0cy5zdW1tZXJmcnVpdCA9IF9pbnRlcm9wUmVxdWlyZShfc3VtbWVyZnJ1aXQpO1xuXG52YXIgX3RvbW9ycm93ID0gcmVxdWlyZSgnLi90b21vcnJvdycpO1xuXG5leHBvcnRzLnRvbW9ycm93ID0gX2ludGVyb3BSZXF1aXJlKF90b21vcnJvdyk7XG5cbnZhciBfdHViZSA9IHJlcXVpcmUoJy4vdHViZScpO1xuXG5leHBvcnRzLnR1YmUgPSBfaW50ZXJvcFJlcXVpcmUoX3R1YmUpO1xuXG52YXIgX3R3aWxpZ2h0ID0gcmVxdWlyZSgnLi90d2lsaWdodCcpO1xuXG5leHBvcnRzLnR3aWxpZ2h0ID0gX2ludGVyb3BSZXF1aXJlKF90d2lsaWdodCk7IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdpc290b3BlJyxcbiAgYXV0aG9yOiAnamFuIHQuIHNvdHQnLFxuICBiYXNlMDA6ICcjMDAwMDAwJyxcbiAgYmFzZTAxOiAnIzQwNDA0MCcsXG4gIGJhc2UwMjogJyM2MDYwNjAnLFxuICBiYXNlMDM6ICcjODA4MDgwJyxcbiAgYmFzZTA0OiAnI2MwYzBjMCcsXG4gIGJhc2UwNTogJyNkMGQwZDAnLFxuICBiYXNlMDY6ICcjZTBlMGUwJyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNmZjAwMDAnLFxuICBiYXNlMDk6ICcjZmY5OTAwJyxcbiAgYmFzZTBBOiAnI2ZmMDA5OScsXG4gIGJhc2UwQjogJyMzM2ZmMDAnLFxuICBiYXNlMEM6ICcjMDBmZmZmJyxcbiAgYmFzZTBEOiAnIzAwNjZmZicsXG4gIGJhc2UwRTogJyNjYzAwZmYnLFxuICBiYXNlMEY6ICcjMzMwMGZmJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnbWFycmFrZXNoJyxcbiAgYXV0aG9yOiAnYWxleGFuZHJlIGdhdmlvbGkgKGh0dHA6Ly9naXRodWIuY29tL2FsZXh4Mi8pJyxcbiAgYmFzZTAwOiAnIzIwMTYwMicsXG4gIGJhc2UwMTogJyMzMDJlMDAnLFxuICBiYXNlMDI6ICcjNWY1YjE3JyxcbiAgYmFzZTAzOiAnIzZjNjgyMycsXG4gIGJhc2UwNDogJyM4NjgxM2InLFxuICBiYXNlMDU6ICcjOTQ4ZTQ4JyxcbiAgYmFzZTA2OiAnI2NjYzM3YScsXG4gIGJhc2UwNzogJyNmYWYwYTUnLFxuICBiYXNlMDg6ICcjYzM1MzU5JyxcbiAgYmFzZTA5OiAnI2IzNjE0NCcsXG4gIGJhc2UwQTogJyNhODgzMzknLFxuICBiYXNlMEI6ICcjMTg5NzRlJyxcbiAgYmFzZTBDOiAnIzc1YTczOCcsXG4gIGJhc2UwRDogJyM0NzdjYTEnLFxuICBiYXNlMEU6ICcjODg2OGIzJyxcbiAgYmFzZTBGOiAnI2IzNTg4ZSdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ21vY2hhJyxcbiAgYXV0aG9yOiAnY2hyaXMga2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pJyxcbiAgYmFzZTAwOiAnIzNCMzIyOCcsXG4gIGJhc2UwMTogJyM1MzQ2MzYnLFxuICBiYXNlMDI6ICcjNjQ1MjQwJyxcbiAgYmFzZTAzOiAnIzdlNzA1YScsXG4gIGJhc2UwNDogJyNiOGFmYWQnLFxuICBiYXNlMDU6ICcjZDBjOGM2JyxcbiAgYmFzZTA2OiAnI2U5ZTFkZCcsXG4gIGJhc2UwNzogJyNmNWVlZWInLFxuICBiYXNlMDg6ICcjY2I2MDc3JyxcbiAgYmFzZTA5OiAnI2QyOGI3MScsXG4gIGJhc2UwQTogJyNmNGJjODcnLFxuICBiYXNlMEI6ICcjYmViNTViJyxcbiAgYmFzZTBDOiAnIzdiYmRhNCcsXG4gIGJhc2UwRDogJyM4YWIzYjUnLFxuICBiYXNlMEU6ICcjYTg5YmI5JyxcbiAgYmFzZTBGOiAnI2JiOTU4NCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ21vbm9rYWknLFxuICBhdXRob3I6ICd3aW1lciBoYXplbmJlcmcgKGh0dHA6Ly93d3cubW9ub2thaS5ubCknLFxuICBiYXNlMDA6ICcjMjcyODIyJyxcbiAgYmFzZTAxOiAnIzM4MzgzMCcsXG4gIGJhc2UwMjogJyM0OTQ4M2UnLFxuICBiYXNlMDM6ICcjNzU3MTVlJyxcbiAgYmFzZTA0OiAnI2E1OWY4NScsXG4gIGJhc2UwNTogJyNmOGY4ZjInLFxuICBiYXNlMDY6ICcjZjVmNGYxJyxcbiAgYmFzZTA3OiAnI2Y5ZjhmNScsXG4gIGJhc2UwODogJyNmOTI2NzInLFxuICBiYXNlMDk6ICcjZmQ5NzFmJyxcbiAgYmFzZTBBOiAnI2Y0YmY3NScsXG4gIGJhc2UwQjogJyNhNmUyMmUnLFxuICBiYXNlMEM6ICcjYTFlZmU0JyxcbiAgYmFzZTBEOiAnIzY2ZDllZicsXG4gIGJhc2UwRTogJyNhZTgxZmYnLFxuICBiYXNlMEY6ICcjY2M2NjMzJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnb2NlYW4nLFxuICBhdXRob3I6ICdjaHJpcyBrZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSknLFxuICBiYXNlMDA6ICcjMmIzMDNiJyxcbiAgYmFzZTAxOiAnIzM0M2Q0NicsXG4gIGJhc2UwMjogJyM0ZjViNjYnLFxuICBiYXNlMDM6ICcjNjU3MzdlJyxcbiAgYmFzZTA0OiAnI2E3YWRiYScsXG4gIGJhc2UwNTogJyNjMGM1Y2UnLFxuICBiYXNlMDY6ICcjZGZlMWU4JyxcbiAgYmFzZTA3OiAnI2VmZjFmNScsXG4gIGJhc2UwODogJyNiZjYxNmEnLFxuICBiYXNlMDk6ICcjZDA4NzcwJyxcbiAgYmFzZTBBOiAnI2ViY2I4YicsXG4gIGJhc2UwQjogJyNhM2JlOGMnLFxuICBiYXNlMEM6ICcjOTZiNWI0JyxcbiAgYmFzZTBEOiAnIzhmYTFiMycsXG4gIGJhc2UwRTogJyNiNDhlYWQnLFxuICBiYXNlMEY6ICcjYWI3OTY3J1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAncGFyYWlzbycsXG4gIGF1dGhvcjogJ2phbiB0LiBzb3R0JyxcbiAgYmFzZTAwOiAnIzJmMWUyZScsXG4gIGJhc2UwMTogJyM0MTMyM2YnLFxuICBiYXNlMDI6ICcjNGY0MjRjJyxcbiAgYmFzZTAzOiAnIzc3NmU3MScsXG4gIGJhc2UwNDogJyM4ZDg2ODcnLFxuICBiYXNlMDU6ICcjYTM5ZTliJyxcbiAgYmFzZTA2OiAnI2I5YjZiMCcsXG4gIGJhc2UwNzogJyNlN2U5ZGInLFxuICBiYXNlMDg6ICcjZWY2MTU1JyxcbiAgYmFzZTA5OiAnI2Y5OWIxNScsXG4gIGJhc2UwQTogJyNmZWM0MTgnLFxuICBiYXNlMEI6ICcjNDhiNjg1JyxcbiAgYmFzZTBDOiAnIzViYzRiZicsXG4gIGJhc2UwRDogJyMwNmI2ZWYnLFxuICBiYXNlMEU6ICcjODE1YmE0JyxcbiAgYmFzZTBGOiAnI2U5NmJhOCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3BvcCcsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMwMDAwMDAnLFxuICBiYXNlMDE6ICcjMjAyMDIwJyxcbiAgYmFzZTAyOiAnIzMwMzAzMCcsXG4gIGJhc2UwMzogJyM1MDUwNTAnLFxuICBiYXNlMDQ6ICcjYjBiMGIwJyxcbiAgYmFzZTA1OiAnI2QwZDBkMCcsXG4gIGJhc2UwNjogJyNlMGUwZTAnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI2ViMDA4YScsXG4gIGJhc2UwOTogJyNmMjkzMzMnLFxuICBiYXNlMEE6ICcjZjhjYTEyJyxcbiAgYmFzZTBCOiAnIzM3YjM0OScsXG4gIGJhc2UwQzogJyMwMGFhYmInLFxuICBiYXNlMEQ6ICcjMGU1YTk0JyxcbiAgYmFzZTBFOiAnI2IzMWU4ZCcsXG4gIGJhc2UwRjogJyM3YTJkMDAnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdyYWlsc2Nhc3RzJyxcbiAgYXV0aG9yOiAncnlhbiBiYXRlcyAoaHR0cDovL3JhaWxzY2FzdHMuY29tKScsXG4gIGJhc2UwMDogJyMyYjJiMmInLFxuICBiYXNlMDE6ICcjMjcyOTM1JyxcbiAgYmFzZTAyOiAnIzNhNDA1NScsXG4gIGJhc2UwMzogJyM1YTY0N2UnLFxuICBiYXNlMDQ6ICcjZDRjZmM5JyxcbiAgYmFzZTA1OiAnI2U2ZTFkYycsXG4gIGJhc2UwNjogJyNmNGYxZWQnLFxuICBiYXNlMDc6ICcjZjlmN2YzJyxcbiAgYmFzZTA4OiAnI2RhNDkzOScsXG4gIGJhc2UwOTogJyNjYzc4MzMnLFxuICBiYXNlMEE6ICcjZmZjNjZkJyxcbiAgYmFzZTBCOiAnI2E1YzI2MScsXG4gIGJhc2UwQzogJyM1MTlmNTAnLFxuICBiYXNlMEQ6ICcjNmQ5Y2JlJyxcbiAgYmFzZTBFOiAnI2I2YjNlYicsXG4gIGJhc2UwRjogJyNiYzk0NTgnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdzaGFwZXNoaWZ0ZXInLFxuICBhdXRob3I6ICd0eWxlciBiZW56aWdlciAoaHR0cDovL3R5YmVuei5jb20pJyxcbiAgYmFzZTAwOiAnIzAwMDAwMCcsXG4gIGJhc2UwMTogJyMwNDA0MDQnLFxuICBiYXNlMDI6ICcjMTAyMDE1JyxcbiAgYmFzZTAzOiAnIzM0MzQzNCcsXG4gIGJhc2UwNDogJyM1NTU1NTUnLFxuICBiYXNlMDU6ICcjYWJhYmFiJyxcbiAgYmFzZTA2OiAnI2UwZTBlMCcsXG4gIGJhc2UwNzogJyNmOWY5ZjknLFxuICBiYXNlMDg6ICcjZTkyZjJmJyxcbiAgYmFzZTA5OiAnI2UwOTQ0OCcsXG4gIGJhc2UwQTogJyNkZGRkMTMnLFxuICBiYXNlMEI6ICcjMGVkODM5JyxcbiAgYmFzZTBDOiAnIzIzZWRkYScsXG4gIGJhc2UwRDogJyMzYjQ4ZTMnLFxuICBiYXNlMEU6ICcjZjk5NmUyJyxcbiAgYmFzZTBGOiAnIzY5NTQyZCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3NvbGFyaXplZCcsXG4gIGF1dGhvcjogJ2V0aGFuIHNjaG9vbm92ZXIgKGh0dHA6Ly9ldGhhbnNjaG9vbm92ZXIuY29tL3NvbGFyaXplZCknLFxuICBiYXNlMDA6ICcjMDAyYjM2JyxcbiAgYmFzZTAxOiAnIzA3MzY0MicsXG4gIGJhc2UwMjogJyM1ODZlNzUnLFxuICBiYXNlMDM6ICcjNjU3YjgzJyxcbiAgYmFzZTA0OiAnIzgzOTQ5NicsXG4gIGJhc2UwNTogJyM5M2ExYTEnLFxuICBiYXNlMDY6ICcjZWVlOGQ1JyxcbiAgYmFzZTA3OiAnI2ZkZjZlMycsXG4gIGJhc2UwODogJyNkYzMyMmYnLFxuICBiYXNlMDk6ICcjY2I0YjE2JyxcbiAgYmFzZTBBOiAnI2I1ODkwMCcsXG4gIGJhc2UwQjogJyM4NTk5MDAnLFxuICBiYXNlMEM6ICcjMmFhMTk4JyxcbiAgYmFzZTBEOiAnIzI2OGJkMicsXG4gIGJhc2UwRTogJyM2YzcxYzQnLFxuICBiYXNlMEY6ICcjZDMzNjgyJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgc2NoZW1lOiAnc3VtbWVyZnJ1aXQnLFxuICBhdXRob3I6ICdjaHJpc3RvcGhlciBjb3JsZXkgKGh0dHA6Ly9jc2NvcmxleS5naXRodWIuaW8vKScsXG4gIGJhc2UwMDogJyMxNTE1MTUnLFxuICBiYXNlMDE6ICcjMjAyMDIwJyxcbiAgYmFzZTAyOiAnIzMwMzAzMCcsXG4gIGJhc2UwMzogJyM1MDUwNTAnLFxuICBiYXNlMDQ6ICcjQjBCMEIwJyxcbiAgYmFzZTA1OiAnI0QwRDBEMCcsXG4gIGJhc2UwNjogJyNFMEUwRTAnLFxuICBiYXNlMDc6ICcjRkZGRkZGJyxcbiAgYmFzZTA4OiAnI0ZGMDA4NicsXG4gIGJhc2UwOTogJyNGRDg5MDAnLFxuICBiYXNlMEE6ICcjQUJBODAwJyxcbiAgYmFzZTBCOiAnIzAwQzkxOCcsXG4gIGJhc2UwQzogJyMxZmFhYWEnLFxuICBiYXNlMEQ6ICcjMzc3N0U2JyxcbiAgYmFzZTBFOiAnI0FEMDBBMScsXG4gIGJhc2UwRjogJyNjYzY2MzMnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICd0aHJlZXplcm90d29mb3VyJyxcbiAgYXV0aG9yOiAnamFuIHQuIHNvdHQgKGh0dHA6Ly9naXRodWIuY29tL2lkbGViZXJnKScsXG4gIGJhc2UwMDogJyMwOTAzMDAnLFxuICBiYXNlMDE6ICcjM2EzNDMyJyxcbiAgYmFzZTAyOiAnIzRhNDU0MycsXG4gIGJhc2UwMzogJyM1YzU4NTUnLFxuICBiYXNlMDQ6ICcjODA3ZDdjJyxcbiAgYmFzZTA1OiAnI2E1YTJhMicsXG4gIGJhc2UwNjogJyNkNmQ1ZDQnLFxuICBiYXNlMDc6ICcjZjdmN2Y3JyxcbiAgYmFzZTA4OiAnI2RiMmQyMCcsXG4gIGJhc2UwOTogJyNlOGJiZDAnLFxuICBiYXNlMEE6ICcjZmRlZDAyJyxcbiAgYmFzZTBCOiAnIzAxYTI1MicsXG4gIGJhc2UwQzogJyNiNWU0ZjQnLFxuICBiYXNlMEQ6ICcjMDFhMGU0JyxcbiAgYmFzZTBFOiAnI2ExNmE5NCcsXG4gIGJhc2UwRjogJyNjZGFiNTMnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICd0b21vcnJvdycsXG4gIGF1dGhvcjogJ2NocmlzIGtlbXBzb24gKGh0dHA6Ly9jaHJpc2tlbXBzb24uY29tKScsXG4gIGJhc2UwMDogJyMxZDFmMjEnLFxuICBiYXNlMDE6ICcjMjgyYTJlJyxcbiAgYmFzZTAyOiAnIzM3M2I0MScsXG4gIGJhc2UwMzogJyM5Njk4OTYnLFxuICBiYXNlMDQ6ICcjYjRiN2I0JyxcbiAgYmFzZTA1OiAnI2M1YzhjNicsXG4gIGJhc2UwNjogJyNlMGUwZTAnLFxuICBiYXNlMDc6ICcjZmZmZmZmJyxcbiAgYmFzZTA4OiAnI2NjNjY2NicsXG4gIGJhc2UwOTogJyNkZTkzNWYnLFxuICBiYXNlMEE6ICcjZjBjNjc0JyxcbiAgYmFzZTBCOiAnI2I1YmQ2OCcsXG4gIGJhc2UwQzogJyM4YWJlYjcnLFxuICBiYXNlMEQ6ICcjODFhMmJlJyxcbiAgYmFzZTBFOiAnI2IyOTRiYicsXG4gIGJhc2UwRjogJyNhMzY4NWEnXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBzY2hlbWU6ICdsb25kb24gdHViZScsXG4gIGF1dGhvcjogJ2phbiB0LiBzb3R0JyxcbiAgYmFzZTAwOiAnIzIzMWYyMCcsXG4gIGJhc2UwMTogJyMxYzNmOTUnLFxuICBiYXNlMDI6ICcjNWE1NzU4JyxcbiAgYmFzZTAzOiAnIzczNzE3MScsXG4gIGJhc2UwNDogJyM5NTljYTEnLFxuICBiYXNlMDU6ICcjZDlkOGQ4JyxcbiAgYmFzZTA2OiAnI2U3ZTdlOCcsXG4gIGJhc2UwNzogJyNmZmZmZmYnLFxuICBiYXNlMDg6ICcjZWUyZTI0JyxcbiAgYmFzZTA5OiAnI2YzODZhMScsXG4gIGJhc2UwQTogJyNmZmQyMDQnLFxuICBiYXNlMEI6ICcjMDA4NTNlJyxcbiAgYmFzZTBDOiAnIzg1Y2ViYycsXG4gIGJhc2UwRDogJyMwMDlkZGMnLFxuICBiYXNlMEU6ICcjOTgwMDVkJyxcbiAgYmFzZTBGOiAnI2IwNjExMCdcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB7XG4gIHNjaGVtZTogJ3R3aWxpZ2h0JyxcbiAgYXV0aG9yOiAnZGF2aWQgaGFydCAoaHR0cDovL2hhcnQtZGV2LmNvbSknLFxuICBiYXNlMDA6ICcjMWUxZTFlJyxcbiAgYmFzZTAxOiAnIzMyMzUzNycsXG4gIGJhc2UwMjogJyM0NjRiNTAnLFxuICBiYXNlMDM6ICcjNWY1YTYwJyxcbiAgYmFzZTA0OiAnIzgzODE4NCcsXG4gIGJhc2UwNTogJyNhN2E3YTcnLFxuICBiYXNlMDY6ICcjYzNjM2MzJyxcbiAgYmFzZTA3OiAnI2ZmZmZmZicsXG4gIGJhc2UwODogJyNjZjZhNGMnLFxuICBiYXNlMDk6ICcjY2RhODY5JyxcbiAgYmFzZTBBOiAnI2Y5ZWU5OCcsXG4gIGJhc2UwQjogJyM4ZjlkNmEnLFxuICBiYXNlMEM6ICcjYWZjNGRiJyxcbiAgYmFzZTBEOiAnIzc1ODdhNicsXG4gIGJhc2UwRTogJyM5Yjg1OWQnLFxuICBiYXNlMEY6ICcjOWI3MDNmJ1xufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIi8qIE1JVCBsaWNlbnNlICovXG52YXIgY3NzS2V5d29yZHMgPSByZXF1aXJlKCdjb2xvci1uYW1lJyk7XG5cbi8vIE5PVEU6IGNvbnZlcnNpb25zIHNob3VsZCBvbmx5IHJldHVybiBwcmltaXRpdmUgdmFsdWVzIChpLmUuIGFycmF5cywgb3Jcbi8vICAgICAgIHZhbHVlcyB0aGF0IGdpdmUgY29ycmVjdCBgdHlwZW9mYCByZXN1bHRzKS5cbi8vICAgICAgIGRvIG5vdCB1c2UgYm94IHZhbHVlcyB0eXBlcyAoaS5lLiBOdW1iZXIoKSwgU3RyaW5nKCksIGV0Yy4pXG5cbnZhciByZXZlcnNlS2V5d29yZHMgPSB7fTtcbmZvciAodmFyIGtleSBpbiBjc3NLZXl3b3Jkcykge1xuXHRpZiAoY3NzS2V5d29yZHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdHJldmVyc2VLZXl3b3Jkc1tjc3NLZXl3b3Jkc1trZXldXSA9IGtleTtcblx0fVxufVxuXG52YXIgY29udmVydCA9IG1vZHVsZS5leHBvcnRzID0ge1xuXHRyZ2I6IHtjaGFubmVsczogMywgbGFiZWxzOiAncmdiJ30sXG5cdGhzbDoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdoc2wnfSxcblx0aHN2OiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2hzdid9LFxuXHRod2I6IHtjaGFubmVsczogMywgbGFiZWxzOiAnaHdiJ30sXG5cdGNteWs6IHtjaGFubmVsczogNCwgbGFiZWxzOiAnY215ayd9LFxuXHR4eXo6IHtjaGFubmVsczogMywgbGFiZWxzOiAneHl6J30sXG5cdGxhYjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdsYWInfSxcblx0bGNoOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2xjaCd9LFxuXHRoZXg6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2hleCddfSxcblx0a2V5d29yZDoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsna2V5d29yZCddfSxcblx0YW5zaTE2OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydhbnNpMTYnXX0sXG5cdGFuc2kyNTY6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2Fuc2kyNTYnXX0sXG5cdGhjZzoge2NoYW5uZWxzOiAzLCBsYWJlbHM6IFsnaCcsICdjJywgJ2cnXX0sXG5cdGFwcGxlOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogWydyMTYnLCAnZzE2JywgJ2IxNiddfSxcblx0Z3JheToge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnZ3JheSddfVxufTtcblxuLy8gaGlkZSAuY2hhbm5lbHMgYW5kIC5sYWJlbHMgcHJvcGVydGllc1xuZm9yICh2YXIgbW9kZWwgaW4gY29udmVydCkge1xuXHRpZiAoY29udmVydC5oYXNPd25Qcm9wZXJ0eShtb2RlbCkpIHtcblx0XHRpZiAoISgnY2hhbm5lbHMnIGluIGNvbnZlcnRbbW9kZWxdKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGNoYW5uZWxzIHByb3BlcnR5OiAnICsgbW9kZWwpO1xuXHRcdH1cblxuXHRcdGlmICghKCdsYWJlbHMnIGluIGNvbnZlcnRbbW9kZWxdKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGNoYW5uZWwgbGFiZWxzIHByb3BlcnR5OiAnICsgbW9kZWwpO1xuXHRcdH1cblxuXHRcdGlmIChjb252ZXJ0W21vZGVsXS5sYWJlbHMubGVuZ3RoICE9PSBjb252ZXJ0W21vZGVsXS5jaGFubmVscykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdjaGFubmVsIGFuZCBsYWJlbCBjb3VudHMgbWlzbWF0Y2g6ICcgKyBtb2RlbCk7XG5cdFx0fVxuXG5cdFx0dmFyIGNoYW5uZWxzID0gY29udmVydFttb2RlbF0uY2hhbm5lbHM7XG5cdFx0dmFyIGxhYmVscyA9IGNvbnZlcnRbbW9kZWxdLmxhYmVscztcblx0XHRkZWxldGUgY29udmVydFttb2RlbF0uY2hhbm5lbHM7XG5cdFx0ZGVsZXRlIGNvbnZlcnRbbW9kZWxdLmxhYmVscztcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFttb2RlbF0sICdjaGFubmVscycsIHt2YWx1ZTogY2hhbm5lbHN9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFttb2RlbF0sICdsYWJlbHMnLCB7dmFsdWU6IGxhYmVsc30pO1xuXHR9XG59XG5cbmNvbnZlcnQucmdiLmhzbCA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHIgPSByZ2JbMF0gLyAyNTU7XG5cdHZhciBnID0gcmdiWzFdIC8gMjU1O1xuXHR2YXIgYiA9IHJnYlsyXSAvIDI1NTtcblx0dmFyIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpO1xuXHR2YXIgbWF4ID0gTWF0aC5tYXgociwgZywgYik7XG5cdHZhciBkZWx0YSA9IG1heCAtIG1pbjtcblx0dmFyIGg7XG5cdHZhciBzO1xuXHR2YXIgbDtcblxuXHRpZiAobWF4ID09PSBtaW4pIHtcblx0XHRoID0gMDtcblx0fSBlbHNlIGlmIChyID09PSBtYXgpIHtcblx0XHRoID0gKGcgLSBiKSAvIGRlbHRhO1xuXHR9IGVsc2UgaWYgKGcgPT09IG1heCkge1xuXHRcdGggPSAyICsgKGIgLSByKSAvIGRlbHRhO1xuXHR9IGVsc2UgaWYgKGIgPT09IG1heCkge1xuXHRcdGggPSA0ICsgKHIgLSBnKSAvIGRlbHRhO1xuXHR9XG5cblx0aCA9IE1hdGgubWluKGggKiA2MCwgMzYwKTtcblxuXHRpZiAoaCA8IDApIHtcblx0XHRoICs9IDM2MDtcblx0fVxuXG5cdGwgPSAobWluICsgbWF4KSAvIDI7XG5cblx0aWYgKG1heCA9PT0gbWluKSB7XG5cdFx0cyA9IDA7XG5cdH0gZWxzZSBpZiAobCA8PSAwLjUpIHtcblx0XHRzID0gZGVsdGEgLyAobWF4ICsgbWluKTtcblx0fSBlbHNlIHtcblx0XHRzID0gZGVsdGEgLyAoMiAtIG1heCAtIG1pbik7XG5cdH1cblxuXHRyZXR1cm4gW2gsIHMgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IuaHN2ID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgcmRpZjtcblx0dmFyIGdkaWY7XG5cdHZhciBiZGlmO1xuXHR2YXIgaDtcblx0dmFyIHM7XG5cblx0dmFyIHIgPSByZ2JbMF0gLyAyNTU7XG5cdHZhciBnID0gcmdiWzFdIC8gMjU1O1xuXHR2YXIgYiA9IHJnYlsyXSAvIDI1NTtcblx0dmFyIHYgPSBNYXRoLm1heChyLCBnLCBiKTtcblx0dmFyIGRpZmYgPSB2IC0gTWF0aC5taW4ociwgZywgYik7XG5cdHZhciBkaWZmYyA9IGZ1bmN0aW9uIChjKSB7XG5cdFx0cmV0dXJuICh2IC0gYykgLyA2IC8gZGlmZiArIDEgLyAyO1xuXHR9O1xuXG5cdGlmIChkaWZmID09PSAwKSB7XG5cdFx0aCA9IHMgPSAwO1xuXHR9IGVsc2Uge1xuXHRcdHMgPSBkaWZmIC8gdjtcblx0XHRyZGlmID0gZGlmZmMocik7XG5cdFx0Z2RpZiA9IGRpZmZjKGcpO1xuXHRcdGJkaWYgPSBkaWZmYyhiKTtcblxuXHRcdGlmIChyID09PSB2KSB7XG5cdFx0XHRoID0gYmRpZiAtIGdkaWY7XG5cdFx0fSBlbHNlIGlmIChnID09PSB2KSB7XG5cdFx0XHRoID0gKDEgLyAzKSArIHJkaWYgLSBiZGlmO1xuXHRcdH0gZWxzZSBpZiAoYiA9PT0gdikge1xuXHRcdFx0aCA9ICgyIC8gMykgKyBnZGlmIC0gcmRpZjtcblx0XHR9XG5cdFx0aWYgKGggPCAwKSB7XG5cdFx0XHRoICs9IDE7XG5cdFx0fSBlbHNlIGlmIChoID4gMSkge1xuXHRcdFx0aCAtPSAxO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBbXG5cdFx0aCAqIDM2MCxcblx0XHRzICogMTAwLFxuXHRcdHYgKiAxMDBcblx0XTtcbn07XG5cbmNvbnZlcnQucmdiLmh3YiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHIgPSByZ2JbMF07XG5cdHZhciBnID0gcmdiWzFdO1xuXHR2YXIgYiA9IHJnYlsyXTtcblx0dmFyIGggPSBjb252ZXJ0LnJnYi5oc2wocmdiKVswXTtcblx0dmFyIHcgPSAxIC8gMjU1ICogTWF0aC5taW4ociwgTWF0aC5taW4oZywgYikpO1xuXG5cdGIgPSAxIC0gMSAvIDI1NSAqIE1hdGgubWF4KHIsIE1hdGgubWF4KGcsIGIpKTtcblxuXHRyZXR1cm4gW2gsIHcgKiAxMDAsIGIgKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IuY215ayA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHIgPSByZ2JbMF0gLyAyNTU7XG5cdHZhciBnID0gcmdiWzFdIC8gMjU1O1xuXHR2YXIgYiA9IHJnYlsyXSAvIDI1NTtcblx0dmFyIGM7XG5cdHZhciBtO1xuXHR2YXIgeTtcblx0dmFyIGs7XG5cblx0ayA9IE1hdGgubWluKDEgLSByLCAxIC0gZywgMSAtIGIpO1xuXHRjID0gKDEgLSByIC0gaykgLyAoMSAtIGspIHx8IDA7XG5cdG0gPSAoMSAtIGcgLSBrKSAvICgxIC0gaykgfHwgMDtcblx0eSA9ICgxIC0gYiAtIGspIC8gKDEgLSBrKSB8fCAwO1xuXG5cdHJldHVybiBbYyAqIDEwMCwgbSAqIDEwMCwgeSAqIDEwMCwgayAqIDEwMF07XG59O1xuXG4vKipcbiAqIFNlZSBodHRwczovL2VuLm0ud2lraXBlZGlhLm9yZy93aWtpL0V1Y2xpZGVhbl9kaXN0YW5jZSNTcXVhcmVkX0V1Y2xpZGVhbl9kaXN0YW5jZVxuICogKi9cbmZ1bmN0aW9uIGNvbXBhcmF0aXZlRGlzdGFuY2UoeCwgeSkge1xuXHRyZXR1cm4gKFxuXHRcdE1hdGgucG93KHhbMF0gLSB5WzBdLCAyKSArXG5cdFx0TWF0aC5wb3coeFsxXSAtIHlbMV0sIDIpICtcblx0XHRNYXRoLnBvdyh4WzJdIC0geVsyXSwgMilcblx0KTtcbn1cblxuY29udmVydC5yZ2Iua2V5d29yZCA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHJldmVyc2VkID0gcmV2ZXJzZUtleXdvcmRzW3JnYl07XG5cdGlmIChyZXZlcnNlZCkge1xuXHRcdHJldHVybiByZXZlcnNlZDtcblx0fVxuXG5cdHZhciBjdXJyZW50Q2xvc2VzdERpc3RhbmNlID0gSW5maW5pdHk7XG5cdHZhciBjdXJyZW50Q2xvc2VzdEtleXdvcmQ7XG5cblx0Zm9yICh2YXIga2V5d29yZCBpbiBjc3NLZXl3b3Jkcykge1xuXHRcdGlmIChjc3NLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eShrZXl3b3JkKSkge1xuXHRcdFx0dmFyIHZhbHVlID0gY3NzS2V5d29yZHNba2V5d29yZF07XG5cblx0XHRcdC8vIENvbXB1dGUgY29tcGFyYXRpdmUgZGlzdGFuY2Vcblx0XHRcdHZhciBkaXN0YW5jZSA9IGNvbXBhcmF0aXZlRGlzdGFuY2UocmdiLCB2YWx1ZSk7XG5cblx0XHRcdC8vIENoZWNrIGlmIGl0cyBsZXNzLCBpZiBzbyBzZXQgYXMgY2xvc2VzdFxuXHRcdFx0aWYgKGRpc3RhbmNlIDwgY3VycmVudENsb3Nlc3REaXN0YW5jZSkge1xuXHRcdFx0XHRjdXJyZW50Q2xvc2VzdERpc3RhbmNlID0gZGlzdGFuY2U7XG5cdFx0XHRcdGN1cnJlbnRDbG9zZXN0S2V5d29yZCA9IGtleXdvcmQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGN1cnJlbnRDbG9zZXN0S2V5d29yZDtcbn07XG5cbmNvbnZlcnQua2V5d29yZC5yZ2IgPSBmdW5jdGlvbiAoa2V5d29yZCkge1xuXHRyZXR1cm4gY3NzS2V5d29yZHNba2V5d29yZF07XG59O1xuXG5jb252ZXJ0LnJnYi54eXogPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByID0gcmdiWzBdIC8gMjU1O1xuXHR2YXIgZyA9IHJnYlsxXSAvIDI1NTtcblx0dmFyIGIgPSByZ2JbMl0gLyAyNTU7XG5cblx0Ly8gYXNzdW1lIHNSR0Jcblx0ciA9IHIgPiAwLjA0MDQ1ID8gTWF0aC5wb3coKChyICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpIDogKHIgLyAxMi45Mik7XG5cdGcgPSBnID4gMC4wNDA0NSA/IE1hdGgucG93KCgoZyArIDAuMDU1KSAvIDEuMDU1KSwgMi40KSA6IChnIC8gMTIuOTIpO1xuXHRiID0gYiA+IDAuMDQwNDUgPyBNYXRoLnBvdygoKGIgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCkgOiAoYiAvIDEyLjkyKTtcblxuXHR2YXIgeCA9IChyICogMC40MTI0KSArIChnICogMC4zNTc2KSArIChiICogMC4xODA1KTtcblx0dmFyIHkgPSAociAqIDAuMjEyNikgKyAoZyAqIDAuNzE1MikgKyAoYiAqIDAuMDcyMik7XG5cdHZhciB6ID0gKHIgKiAwLjAxOTMpICsgKGcgKiAwLjExOTIpICsgKGIgKiAwLjk1MDUpO1xuXG5cdHJldHVybiBbeCAqIDEwMCwgeSAqIDEwMCwgeiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LnJnYi5sYWIgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciB4eXogPSBjb252ZXJ0LnJnYi54eXoocmdiKTtcblx0dmFyIHggPSB4eXpbMF07XG5cdHZhciB5ID0geHl6WzFdO1xuXHR2YXIgeiA9IHh5elsyXTtcblx0dmFyIGw7XG5cdHZhciBhO1xuXHR2YXIgYjtcblxuXHR4IC89IDk1LjA0Nztcblx0eSAvPSAxMDA7XG5cdHogLz0gMTA4Ljg4MztcblxuXHR4ID0geCA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeCwgMSAvIDMpIDogKDcuNzg3ICogeCkgKyAoMTYgLyAxMTYpO1xuXHR5ID0geSA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeSwgMSAvIDMpIDogKDcuNzg3ICogeSkgKyAoMTYgLyAxMTYpO1xuXHR6ID0geiA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeiwgMSAvIDMpIDogKDcuNzg3ICogeikgKyAoMTYgLyAxMTYpO1xuXG5cdGwgPSAoMTE2ICogeSkgLSAxNjtcblx0YSA9IDUwMCAqICh4IC0geSk7XG5cdGIgPSAyMDAgKiAoeSAtIHopO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LmhzbC5yZ2IgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdHZhciBoID0gaHNsWzBdIC8gMzYwO1xuXHR2YXIgcyA9IGhzbFsxXSAvIDEwMDtcblx0dmFyIGwgPSBoc2xbMl0gLyAxMDA7XG5cdHZhciB0MTtcblx0dmFyIHQyO1xuXHR2YXIgdDM7XG5cdHZhciByZ2I7XG5cdHZhciB2YWw7XG5cblx0aWYgKHMgPT09IDApIHtcblx0XHR2YWwgPSBsICogMjU1O1xuXHRcdHJldHVybiBbdmFsLCB2YWwsIHZhbF07XG5cdH1cblxuXHRpZiAobCA8IDAuNSkge1xuXHRcdHQyID0gbCAqICgxICsgcyk7XG5cdH0gZWxzZSB7XG5cdFx0dDIgPSBsICsgcyAtIGwgKiBzO1xuXHR9XG5cblx0dDEgPSAyICogbCAtIHQyO1xuXG5cdHJnYiA9IFswLCAwLCAwXTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHR0MyA9IGggKyAxIC8gMyAqIC0oaSAtIDEpO1xuXHRcdGlmICh0MyA8IDApIHtcblx0XHRcdHQzKys7XG5cdFx0fVxuXHRcdGlmICh0MyA+IDEpIHtcblx0XHRcdHQzLS07XG5cdFx0fVxuXG5cdFx0aWYgKDYgKiB0MyA8IDEpIHtcblx0XHRcdHZhbCA9IHQxICsgKHQyIC0gdDEpICogNiAqIHQzO1xuXHRcdH0gZWxzZSBpZiAoMiAqIHQzIDwgMSkge1xuXHRcdFx0dmFsID0gdDI7XG5cdFx0fSBlbHNlIGlmICgzICogdDMgPCAyKSB7XG5cdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqICgyIC8gMyAtIHQzKSAqIDY7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhbCA9IHQxO1xuXHRcdH1cblxuXHRcdHJnYltpXSA9IHZhbCAqIDI1NTtcblx0fVxuXG5cdHJldHVybiByZ2I7XG59O1xuXG5jb252ZXJ0LmhzbC5oc3YgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdHZhciBoID0gaHNsWzBdO1xuXHR2YXIgcyA9IGhzbFsxXSAvIDEwMDtcblx0dmFyIGwgPSBoc2xbMl0gLyAxMDA7XG5cdHZhciBzbWluID0gcztcblx0dmFyIGxtaW4gPSBNYXRoLm1heChsLCAwLjAxKTtcblx0dmFyIHN2O1xuXHR2YXIgdjtcblxuXHRsICo9IDI7XG5cdHMgKj0gKGwgPD0gMSkgPyBsIDogMiAtIGw7XG5cdHNtaW4gKj0gbG1pbiA8PSAxID8gbG1pbiA6IDIgLSBsbWluO1xuXHR2ID0gKGwgKyBzKSAvIDI7XG5cdHN2ID0gbCA9PT0gMCA/ICgyICogc21pbikgLyAobG1pbiArIHNtaW4pIDogKDIgKiBzKSAvIChsICsgcyk7XG5cblx0cmV0dXJuIFtoLCBzdiAqIDEwMCwgdiAqIDEwMF07XG59O1xuXG5jb252ZXJ0Lmhzdi5yZ2IgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdHZhciBoID0gaHN2WzBdIC8gNjA7XG5cdHZhciBzID0gaHN2WzFdIC8gMTAwO1xuXHR2YXIgdiA9IGhzdlsyXSAvIDEwMDtcblx0dmFyIGhpID0gTWF0aC5mbG9vcihoKSAlIDY7XG5cblx0dmFyIGYgPSBoIC0gTWF0aC5mbG9vcihoKTtcblx0dmFyIHAgPSAyNTUgKiB2ICogKDEgLSBzKTtcblx0dmFyIHEgPSAyNTUgKiB2ICogKDEgLSAocyAqIGYpKTtcblx0dmFyIHQgPSAyNTUgKiB2ICogKDEgLSAocyAqICgxIC0gZikpKTtcblx0diAqPSAyNTU7XG5cblx0c3dpdGNoIChoaSkge1xuXHRcdGNhc2UgMDpcblx0XHRcdHJldHVybiBbdiwgdCwgcF07XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cmV0dXJuIFtxLCB2LCBwXTtcblx0XHRjYXNlIDI6XG5cdFx0XHRyZXR1cm4gW3AsIHYsIHRdO1xuXHRcdGNhc2UgMzpcblx0XHRcdHJldHVybiBbcCwgcSwgdl07XG5cdFx0Y2FzZSA0OlxuXHRcdFx0cmV0dXJuIFt0LCBwLCB2XTtcblx0XHRjYXNlIDU6XG5cdFx0XHRyZXR1cm4gW3YsIHAsIHFdO1xuXHR9XG59O1xuXG5jb252ZXJ0Lmhzdi5oc2wgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdHZhciBoID0gaHN2WzBdO1xuXHR2YXIgcyA9IGhzdlsxXSAvIDEwMDtcblx0dmFyIHYgPSBoc3ZbMl0gLyAxMDA7XG5cdHZhciB2bWluID0gTWF0aC5tYXgodiwgMC4wMSk7XG5cdHZhciBsbWluO1xuXHR2YXIgc2w7XG5cdHZhciBsO1xuXG5cdGwgPSAoMiAtIHMpICogdjtcblx0bG1pbiA9ICgyIC0gcykgKiB2bWluO1xuXHRzbCA9IHMgKiB2bWluO1xuXHRzbCAvPSAobG1pbiA8PSAxKSA/IGxtaW4gOiAyIC0gbG1pbjtcblx0c2wgPSBzbCB8fCAwO1xuXHRsIC89IDI7XG5cblx0cmV0dXJuIFtoLCBzbCAqIDEwMCwgbCAqIDEwMF07XG59O1xuXG4vLyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3MtY29sb3IvI2h3Yi10by1yZ2JcbmNvbnZlcnQuaHdiLnJnYiA9IGZ1bmN0aW9uIChod2IpIHtcblx0dmFyIGggPSBod2JbMF0gLyAzNjA7XG5cdHZhciB3aCA9IGh3YlsxXSAvIDEwMDtcblx0dmFyIGJsID0gaHdiWzJdIC8gMTAwO1xuXHR2YXIgcmF0aW8gPSB3aCArIGJsO1xuXHR2YXIgaTtcblx0dmFyIHY7XG5cdHZhciBmO1xuXHR2YXIgbjtcblxuXHQvLyB3aCArIGJsIGNhbnQgYmUgPiAxXG5cdGlmIChyYXRpbyA+IDEpIHtcblx0XHR3aCAvPSByYXRpbztcblx0XHRibCAvPSByYXRpbztcblx0fVxuXG5cdGkgPSBNYXRoLmZsb29yKDYgKiBoKTtcblx0diA9IDEgLSBibDtcblx0ZiA9IDYgKiBoIC0gaTtcblxuXHRpZiAoKGkgJiAweDAxKSAhPT0gMCkge1xuXHRcdGYgPSAxIC0gZjtcblx0fVxuXG5cdG4gPSB3aCArIGYgKiAodiAtIHdoKTsgLy8gbGluZWFyIGludGVycG9sYXRpb25cblxuXHR2YXIgcjtcblx0dmFyIGc7XG5cdHZhciBiO1xuXHRzd2l0Y2ggKGkpIHtcblx0XHRkZWZhdWx0OlxuXHRcdGNhc2UgNjpcblx0XHRjYXNlIDA6IHIgPSB2OyBnID0gbjsgYiA9IHdoOyBicmVhaztcblx0XHRjYXNlIDE6IHIgPSBuOyBnID0gdjsgYiA9IHdoOyBicmVhaztcblx0XHRjYXNlIDI6IHIgPSB3aDsgZyA9IHY7IGIgPSBuOyBicmVhaztcblx0XHRjYXNlIDM6IHIgPSB3aDsgZyA9IG47IGIgPSB2OyBicmVhaztcblx0XHRjYXNlIDQ6IHIgPSBuOyBnID0gd2g7IGIgPSB2OyBicmVhaztcblx0XHRjYXNlIDU6IHIgPSB2OyBnID0gd2g7IGIgPSBuOyBicmVhaztcblx0fVxuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0LmNteWsucmdiID0gZnVuY3Rpb24gKGNteWspIHtcblx0dmFyIGMgPSBjbXlrWzBdIC8gMTAwO1xuXHR2YXIgbSA9IGNteWtbMV0gLyAxMDA7XG5cdHZhciB5ID0gY215a1syXSAvIDEwMDtcblx0dmFyIGsgPSBjbXlrWzNdIC8gMTAwO1xuXHR2YXIgcjtcblx0dmFyIGc7XG5cdHZhciBiO1xuXG5cdHIgPSAxIC0gTWF0aC5taW4oMSwgYyAqICgxIC0gaykgKyBrKTtcblx0ZyA9IDEgLSBNYXRoLm1pbigxLCBtICogKDEgLSBrKSArIGspO1xuXHRiID0gMSAtIE1hdGgubWluKDEsIHkgKiAoMSAtIGspICsgayk7XG5cblx0cmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn07XG5cbmNvbnZlcnQueHl6LnJnYiA9IGZ1bmN0aW9uICh4eXopIHtcblx0dmFyIHggPSB4eXpbMF0gLyAxMDA7XG5cdHZhciB5ID0geHl6WzFdIC8gMTAwO1xuXHR2YXIgeiA9IHh5elsyXSAvIDEwMDtcblx0dmFyIHI7XG5cdHZhciBnO1xuXHR2YXIgYjtcblxuXHRyID0gKHggKiAzLjI0MDYpICsgKHkgKiAtMS41MzcyKSArICh6ICogLTAuNDk4Nik7XG5cdGcgPSAoeCAqIC0wLjk2ODkpICsgKHkgKiAxLjg3NTgpICsgKHogKiAwLjA0MTUpO1xuXHRiID0gKHggKiAwLjA1NTcpICsgKHkgKiAtMC4yMDQwKSArICh6ICogMS4wNTcwKTtcblxuXHQvLyBhc3N1bWUgc1JHQlxuXHRyID0gciA+IDAuMDAzMTMwOFxuXHRcdD8gKCgxLjA1NSAqIE1hdGgucG93KHIsIDEuMCAvIDIuNCkpIC0gMC4wNTUpXG5cdFx0OiByICogMTIuOTI7XG5cblx0ZyA9IGcgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiBNYXRoLnBvdyhnLCAxLjAgLyAyLjQpKSAtIDAuMDU1KVxuXHRcdDogZyAqIDEyLjkyO1xuXG5cdGIgPSBiID4gMC4wMDMxMzA4XG5cdFx0PyAoKDEuMDU1ICogTWF0aC5wb3coYiwgMS4wIC8gMi40KSkgLSAwLjA1NSlcblx0XHQ6IGIgKiAxMi45MjtcblxuXHRyID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgciksIDEpO1xuXHRnID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgZyksIDEpO1xuXHRiID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgYiksIDEpO1xuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0Lnh5ei5sYWIgPSBmdW5jdGlvbiAoeHl6KSB7XG5cdHZhciB4ID0geHl6WzBdO1xuXHR2YXIgeSA9IHh5elsxXTtcblx0dmFyIHogPSB4eXpbMl07XG5cdHZhciBsO1xuXHR2YXIgYTtcblx0dmFyIGI7XG5cblx0eCAvPSA5NS4wNDc7XG5cdHkgLz0gMTAwO1xuXHR6IC89IDEwOC44ODM7XG5cblx0eCA9IHggPiAwLjAwODg1NiA/IE1hdGgucG93KHgsIDEgLyAzKSA6ICg3Ljc4NyAqIHgpICsgKDE2IC8gMTE2KTtcblx0eSA9IHkgPiAwLjAwODg1NiA/IE1hdGgucG93KHksIDEgLyAzKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcblx0eiA9IHogPiAwLjAwODg1NiA/IE1hdGgucG93KHosIDEgLyAzKSA6ICg3Ljc4NyAqIHopICsgKDE2IC8gMTE2KTtcblxuXHRsID0gKDExNiAqIHkpIC0gMTY7XG5cdGEgPSA1MDAgKiAoeCAtIHkpO1xuXHRiID0gMjAwICogKHkgLSB6KTtcblxuXHRyZXR1cm4gW2wsIGEsIGJdO1xufTtcblxuY29udmVydC5sYWIueHl6ID0gZnVuY3Rpb24gKGxhYikge1xuXHR2YXIgbCA9IGxhYlswXTtcblx0dmFyIGEgPSBsYWJbMV07XG5cdHZhciBiID0gbGFiWzJdO1xuXHR2YXIgeDtcblx0dmFyIHk7XG5cdHZhciB6O1xuXG5cdHkgPSAobCArIDE2KSAvIDExNjtcblx0eCA9IGEgLyA1MDAgKyB5O1xuXHR6ID0geSAtIGIgLyAyMDA7XG5cblx0dmFyIHkyID0gTWF0aC5wb3coeSwgMyk7XG5cdHZhciB4MiA9IE1hdGgucG93KHgsIDMpO1xuXHR2YXIgejIgPSBNYXRoLnBvdyh6LCAzKTtcblx0eSA9IHkyID4gMC4wMDg4NTYgPyB5MiA6ICh5IC0gMTYgLyAxMTYpIC8gNy43ODc7XG5cdHggPSB4MiA+IDAuMDA4ODU2ID8geDIgOiAoeCAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuXHR6ID0gejIgPiAwLjAwODg1NiA/IHoyIDogKHogLSAxNiAvIDExNikgLyA3Ljc4NztcblxuXHR4ICo9IDk1LjA0Nztcblx0eSAqPSAxMDA7XG5cdHogKj0gMTA4Ljg4MztcblxuXHRyZXR1cm4gW3gsIHksIHpdO1xufTtcblxuY29udmVydC5sYWIubGNoID0gZnVuY3Rpb24gKGxhYikge1xuXHR2YXIgbCA9IGxhYlswXTtcblx0dmFyIGEgPSBsYWJbMV07XG5cdHZhciBiID0gbGFiWzJdO1xuXHR2YXIgaHI7XG5cdHZhciBoO1xuXHR2YXIgYztcblxuXHRociA9IE1hdGguYXRhbjIoYiwgYSk7XG5cdGggPSBociAqIDM2MCAvIDIgLyBNYXRoLlBJO1xuXG5cdGlmIChoIDwgMCkge1xuXHRcdGggKz0gMzYwO1xuXHR9XG5cblx0YyA9IE1hdGguc3FydChhICogYSArIGIgKiBiKTtcblxuXHRyZXR1cm4gW2wsIGMsIGhdO1xufTtcblxuY29udmVydC5sY2gubGFiID0gZnVuY3Rpb24gKGxjaCkge1xuXHR2YXIgbCA9IGxjaFswXTtcblx0dmFyIGMgPSBsY2hbMV07XG5cdHZhciBoID0gbGNoWzJdO1xuXHR2YXIgYTtcblx0dmFyIGI7XG5cdHZhciBocjtcblxuXHRociA9IGggLyAzNjAgKiAyICogTWF0aC5QSTtcblx0YSA9IGMgKiBNYXRoLmNvcyhocik7XG5cdGIgPSBjICogTWF0aC5zaW4oaHIpO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5hbnNpMTYgPSBmdW5jdGlvbiAoYXJncykge1xuXHR2YXIgciA9IGFyZ3NbMF07XG5cdHZhciBnID0gYXJnc1sxXTtcblx0dmFyIGIgPSBhcmdzWzJdO1xuXHR2YXIgdmFsdWUgPSAxIGluIGFyZ3VtZW50cyA/IGFyZ3VtZW50c1sxXSA6IGNvbnZlcnQucmdiLmhzdihhcmdzKVsyXTsgLy8gaHN2IC0+IGFuc2kxNiBvcHRpbWl6YXRpb25cblxuXHR2YWx1ZSA9IE1hdGgucm91bmQodmFsdWUgLyA1MCk7XG5cblx0aWYgKHZhbHVlID09PSAwKSB7XG5cdFx0cmV0dXJuIDMwO1xuXHR9XG5cblx0dmFyIGFuc2kgPSAzMFxuXHRcdCsgKChNYXRoLnJvdW5kKGIgLyAyNTUpIDw8IDIpXG5cdFx0fCAoTWF0aC5yb3VuZChnIC8gMjU1KSA8PCAxKVxuXHRcdHwgTWF0aC5yb3VuZChyIC8gMjU1KSk7XG5cblx0aWYgKHZhbHVlID09PSAyKSB7XG5cdFx0YW5zaSArPSA2MDtcblx0fVxuXG5cdHJldHVybiBhbnNpO1xufTtcblxuY29udmVydC5oc3YuYW5zaTE2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Ly8gb3B0aW1pemF0aW9uIGhlcmU7IHdlIGFscmVhZHkga25vdyB0aGUgdmFsdWUgYW5kIGRvbid0IG5lZWQgdG8gZ2V0XG5cdC8vIGl0IGNvbnZlcnRlZCBmb3IgdXMuXG5cdHJldHVybiBjb252ZXJ0LnJnYi5hbnNpMTYoY29udmVydC5oc3YucmdiKGFyZ3MpLCBhcmdzWzJdKTtcbn07XG5cbmNvbnZlcnQucmdiLmFuc2kyNTYgPSBmdW5jdGlvbiAoYXJncykge1xuXHR2YXIgciA9IGFyZ3NbMF07XG5cdHZhciBnID0gYXJnc1sxXTtcblx0dmFyIGIgPSBhcmdzWzJdO1xuXG5cdC8vIHdlIHVzZSB0aGUgZXh0ZW5kZWQgZ3JleXNjYWxlIHBhbGV0dGUgaGVyZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mXG5cdC8vIGJsYWNrIGFuZCB3aGl0ZS4gbm9ybWFsIHBhbGV0dGUgb25seSBoYXMgNCBncmV5c2NhbGUgc2hhZGVzLlxuXHRpZiAociA9PT0gZyAmJiBnID09PSBiKSB7XG5cdFx0aWYgKHIgPCA4KSB7XG5cdFx0XHRyZXR1cm4gMTY7XG5cdFx0fVxuXG5cdFx0aWYgKHIgPiAyNDgpIHtcblx0XHRcdHJldHVybiAyMzE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIE1hdGgucm91bmQoKChyIC0gOCkgLyAyNDcpICogMjQpICsgMjMyO1xuXHR9XG5cblx0dmFyIGFuc2kgPSAxNlxuXHRcdCsgKDM2ICogTWF0aC5yb3VuZChyIC8gMjU1ICogNSkpXG5cdFx0KyAoNiAqIE1hdGgucm91bmQoZyAvIDI1NSAqIDUpKVxuXHRcdCsgTWF0aC5yb3VuZChiIC8gMjU1ICogNSk7XG5cblx0cmV0dXJuIGFuc2k7XG59O1xuXG5jb252ZXJ0LmFuc2kxNi5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHR2YXIgY29sb3IgPSBhcmdzICUgMTA7XG5cblx0Ly8gaGFuZGxlIGdyZXlzY2FsZVxuXHRpZiAoY29sb3IgPT09IDAgfHwgY29sb3IgPT09IDcpIHtcblx0XHRpZiAoYXJncyA+IDUwKSB7XG5cdFx0XHRjb2xvciArPSAzLjU7XG5cdFx0fVxuXG5cdFx0Y29sb3IgPSBjb2xvciAvIDEwLjUgKiAyNTU7XG5cblx0XHRyZXR1cm4gW2NvbG9yLCBjb2xvciwgY29sb3JdO1xuXHR9XG5cblx0dmFyIG11bHQgPSAofn4oYXJncyA+IDUwKSArIDEpICogMC41O1xuXHR2YXIgciA9ICgoY29sb3IgJiAxKSAqIG11bHQpICogMjU1O1xuXHR2YXIgZyA9ICgoKGNvbG9yID4+IDEpICYgMSkgKiBtdWx0KSAqIDI1NTtcblx0dmFyIGIgPSAoKChjb2xvciA+PiAyKSAmIDEpICogbXVsdCkgKiAyNTU7XG5cblx0cmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbmNvbnZlcnQuYW5zaTI1Ni5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHQvLyBoYW5kbGUgZ3JleXNjYWxlXG5cdGlmIChhcmdzID49IDIzMikge1xuXHRcdHZhciBjID0gKGFyZ3MgLSAyMzIpICogMTAgKyA4O1xuXHRcdHJldHVybiBbYywgYywgY107XG5cdH1cblxuXHRhcmdzIC09IDE2O1xuXG5cdHZhciByZW07XG5cdHZhciByID0gTWF0aC5mbG9vcihhcmdzIC8gMzYpIC8gNSAqIDI1NTtcblx0dmFyIGcgPSBNYXRoLmZsb29yKChyZW0gPSBhcmdzICUgMzYpIC8gNikgLyA1ICogMjU1O1xuXHR2YXIgYiA9IChyZW0gJSA2KSAvIDUgKiAyNTU7XG5cblx0cmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbmNvbnZlcnQucmdiLmhleCA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHZhciBpbnRlZ2VyID0gKChNYXRoLnJvdW5kKGFyZ3NbMF0pICYgMHhGRikgPDwgMTYpXG5cdFx0KyAoKE1hdGgucm91bmQoYXJnc1sxXSkgJiAweEZGKSA8PCA4KVxuXHRcdCsgKE1hdGgucm91bmQoYXJnc1syXSkgJiAweEZGKTtcblxuXHR2YXIgc3RyaW5nID0gaW50ZWdlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuICcwMDAwMDAnLnN1YnN0cmluZyhzdHJpbmcubGVuZ3RoKSArIHN0cmluZztcbn07XG5cbmNvbnZlcnQuaGV4LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHZhciBtYXRjaCA9IGFyZ3MudG9TdHJpbmcoMTYpLm1hdGNoKC9bYS1mMC05XXs2fXxbYS1mMC05XXszfS9pKTtcblx0aWYgKCFtYXRjaCkge1xuXHRcdHJldHVybiBbMCwgMCwgMF07XG5cdH1cblxuXHR2YXIgY29sb3JTdHJpbmcgPSBtYXRjaFswXTtcblxuXHRpZiAobWF0Y2hbMF0ubGVuZ3RoID09PSAzKSB7XG5cdFx0Y29sb3JTdHJpbmcgPSBjb2xvclN0cmluZy5zcGxpdCgnJykubWFwKGZ1bmN0aW9uIChjaGFyKSB7XG5cdFx0XHRyZXR1cm4gY2hhciArIGNoYXI7XG5cdFx0fSkuam9pbignJyk7XG5cdH1cblxuXHR2YXIgaW50ZWdlciA9IHBhcnNlSW50KGNvbG9yU3RyaW5nLCAxNik7XG5cdHZhciByID0gKGludGVnZXIgPj4gMTYpICYgMHhGRjtcblx0dmFyIGcgPSAoaW50ZWdlciA+PiA4KSAmIDB4RkY7XG5cdHZhciBiID0gaW50ZWdlciAmIDB4RkY7XG5cblx0cmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbmNvbnZlcnQucmdiLmhjZyA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHIgPSByZ2JbMF0gLyAyNTU7XG5cdHZhciBnID0gcmdiWzFdIC8gMjU1O1xuXHR2YXIgYiA9IHJnYlsyXSAvIDI1NTtcblx0dmFyIG1heCA9IE1hdGgubWF4KE1hdGgubWF4KHIsIGcpLCBiKTtcblx0dmFyIG1pbiA9IE1hdGgubWluKE1hdGgubWluKHIsIGcpLCBiKTtcblx0dmFyIGNocm9tYSA9IChtYXggLSBtaW4pO1xuXHR2YXIgZ3JheXNjYWxlO1xuXHR2YXIgaHVlO1xuXG5cdGlmIChjaHJvbWEgPCAxKSB7XG5cdFx0Z3JheXNjYWxlID0gbWluIC8gKDEgLSBjaHJvbWEpO1xuXHR9IGVsc2Uge1xuXHRcdGdyYXlzY2FsZSA9IDA7XG5cdH1cblxuXHRpZiAoY2hyb21hIDw9IDApIHtcblx0XHRodWUgPSAwO1xuXHR9IGVsc2Vcblx0aWYgKG1heCA9PT0gcikge1xuXHRcdGh1ZSA9ICgoZyAtIGIpIC8gY2hyb21hKSAlIDY7XG5cdH0gZWxzZVxuXHRpZiAobWF4ID09PSBnKSB7XG5cdFx0aHVlID0gMiArIChiIC0gcikgLyBjaHJvbWE7XG5cdH0gZWxzZSB7XG5cdFx0aHVlID0gNCArIChyIC0gZykgLyBjaHJvbWEgKyA0O1xuXHR9XG5cblx0aHVlIC89IDY7XG5cdGh1ZSAlPSAxO1xuXG5cdHJldHVybiBbaHVlICogMzYwLCBjaHJvbWEgKiAxMDAsIGdyYXlzY2FsZSAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhzbC5oY2cgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdHZhciBzID0gaHNsWzFdIC8gMTAwO1xuXHR2YXIgbCA9IGhzbFsyXSAvIDEwMDtcblx0dmFyIGMgPSAxO1xuXHR2YXIgZiA9IDA7XG5cblx0aWYgKGwgPCAwLjUpIHtcblx0XHRjID0gMi4wICogcyAqIGw7XG5cdH0gZWxzZSB7XG5cdFx0YyA9IDIuMCAqIHMgKiAoMS4wIC0gbCk7XG5cdH1cblxuXHRpZiAoYyA8IDEuMCkge1xuXHRcdGYgPSAobCAtIDAuNSAqIGMpIC8gKDEuMCAtIGMpO1xuXHR9XG5cblx0cmV0dXJuIFtoc2xbMF0sIGMgKiAxMDAsIGYgKiAxMDBdO1xufTtcblxuY29udmVydC5oc3YuaGNnID0gZnVuY3Rpb24gKGhzdikge1xuXHR2YXIgcyA9IGhzdlsxXSAvIDEwMDtcblx0dmFyIHYgPSBoc3ZbMl0gLyAxMDA7XG5cblx0dmFyIGMgPSBzICogdjtcblx0dmFyIGYgPSAwO1xuXG5cdGlmIChjIDwgMS4wKSB7XG5cdFx0ZiA9ICh2IC0gYykgLyAoMSAtIGMpO1xuXHR9XG5cblx0cmV0dXJuIFtoc3ZbMF0sIGMgKiAxMDAsIGYgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cucmdiID0gZnVuY3Rpb24gKGhjZykge1xuXHR2YXIgaCA9IGhjZ1swXSAvIDM2MDtcblx0dmFyIGMgPSBoY2dbMV0gLyAxMDA7XG5cdHZhciBnID0gaGNnWzJdIC8gMTAwO1xuXG5cdGlmIChjID09PSAwLjApIHtcblx0XHRyZXR1cm4gW2cgKiAyNTUsIGcgKiAyNTUsIGcgKiAyNTVdO1xuXHR9XG5cblx0dmFyIHB1cmUgPSBbMCwgMCwgMF07XG5cdHZhciBoaSA9IChoICUgMSkgKiA2O1xuXHR2YXIgdiA9IGhpICUgMTtcblx0dmFyIHcgPSAxIC0gdjtcblx0dmFyIG1nID0gMDtcblxuXHRzd2l0Y2ggKE1hdGguZmxvb3IoaGkpKSB7XG5cdFx0Y2FzZSAwOlxuXHRcdFx0cHVyZVswXSA9IDE7IHB1cmVbMV0gPSB2OyBwdXJlWzJdID0gMDsgYnJlYWs7XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cHVyZVswXSA9IHc7IHB1cmVbMV0gPSAxOyBwdXJlWzJdID0gMDsgYnJlYWs7XG5cdFx0Y2FzZSAyOlxuXHRcdFx0cHVyZVswXSA9IDA7IHB1cmVbMV0gPSAxOyBwdXJlWzJdID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSAzOlxuXHRcdFx0cHVyZVswXSA9IDA7IHB1cmVbMV0gPSB3OyBwdXJlWzJdID0gMTsgYnJlYWs7XG5cdFx0Y2FzZSA0OlxuXHRcdFx0cHVyZVswXSA9IHY7IHB1cmVbMV0gPSAwOyBwdXJlWzJdID0gMTsgYnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHB1cmVbMF0gPSAxOyBwdXJlWzFdID0gMDsgcHVyZVsyXSA9IHc7XG5cdH1cblxuXHRtZyA9ICgxLjAgLSBjKSAqIGc7XG5cblx0cmV0dXJuIFtcblx0XHQoYyAqIHB1cmVbMF0gKyBtZykgKiAyNTUsXG5cdFx0KGMgKiBwdXJlWzFdICsgbWcpICogMjU1LFxuXHRcdChjICogcHVyZVsyXSArIG1nKSAqIDI1NVxuXHRdO1xufTtcblxuY29udmVydC5oY2cuaHN2ID0gZnVuY3Rpb24gKGhjZykge1xuXHR2YXIgYyA9IGhjZ1sxXSAvIDEwMDtcblx0dmFyIGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0dmFyIHYgPSBjICsgZyAqICgxLjAgLSBjKTtcblx0dmFyIGYgPSAwO1xuXG5cdGlmICh2ID4gMC4wKSB7XG5cdFx0ZiA9IGMgLyB2O1xuXHR9XG5cblx0cmV0dXJuIFtoY2dbMF0sIGYgKiAxMDAsIHYgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cuaHNsID0gZnVuY3Rpb24gKGhjZykge1xuXHR2YXIgYyA9IGhjZ1sxXSAvIDEwMDtcblx0dmFyIGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0dmFyIGwgPSBnICogKDEuMCAtIGMpICsgMC41ICogYztcblx0dmFyIHMgPSAwO1xuXG5cdGlmIChsID4gMC4wICYmIGwgPCAwLjUpIHtcblx0XHRzID0gYyAvICgyICogbCk7XG5cdH0gZWxzZVxuXHRpZiAobCA+PSAwLjUgJiYgbCA8IDEuMCkge1xuXHRcdHMgPSBjIC8gKDIgKiAoMSAtIGwpKTtcblx0fVxuXG5cdHJldHVybiBbaGNnWzBdLCBzICogMTAwLCBsICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLmh3YiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0dmFyIGMgPSBoY2dbMV0gLyAxMDA7XG5cdHZhciBnID0gaGNnWzJdIC8gMTAwO1xuXHR2YXIgdiA9IGMgKyBnICogKDEuMCAtIGMpO1xuXHRyZXR1cm4gW2hjZ1swXSwgKHYgLSBjKSAqIDEwMCwgKDEgLSB2KSAqIDEwMF07XG59O1xuXG5jb252ZXJ0Lmh3Yi5oY2cgPSBmdW5jdGlvbiAoaHdiKSB7XG5cdHZhciB3ID0gaHdiWzFdIC8gMTAwO1xuXHR2YXIgYiA9IGh3YlsyXSAvIDEwMDtcblx0dmFyIHYgPSAxIC0gYjtcblx0dmFyIGMgPSB2IC0gdztcblx0dmFyIGcgPSAwO1xuXG5cdGlmIChjIDwgMSkge1xuXHRcdGcgPSAodiAtIGMpIC8gKDEgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHdiWzBdLCBjICogMTAwLCBnICogMTAwXTtcbn07XG5cbmNvbnZlcnQuYXBwbGUucmdiID0gZnVuY3Rpb24gKGFwcGxlKSB7XG5cdHJldHVybiBbKGFwcGxlWzBdIC8gNjU1MzUpICogMjU1LCAoYXBwbGVbMV0gLyA2NTUzNSkgKiAyNTUsIChhcHBsZVsyXSAvIDY1NTM1KSAqIDI1NV07XG59O1xuXG5jb252ZXJ0LnJnYi5hcHBsZSA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0cmV0dXJuIFsocmdiWzBdIC8gMjU1KSAqIDY1NTM1LCAocmdiWzFdIC8gMjU1KSAqIDY1NTM1LCAocmdiWzJdIC8gMjU1KSAqIDY1NTM1XTtcbn07XG5cbmNvbnZlcnQuZ3JheS5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHRyZXR1cm4gW2FyZ3NbMF0gLyAxMDAgKiAyNTUsIGFyZ3NbMF0gLyAxMDAgKiAyNTUsIGFyZ3NbMF0gLyAxMDAgKiAyNTVdO1xufTtcblxuY29udmVydC5ncmF5LmhzbCA9IGNvbnZlcnQuZ3JheS5oc3YgPSBmdW5jdGlvbiAoYXJncykge1xuXHRyZXR1cm4gWzAsIDAsIGFyZ3NbMF1dO1xufTtcblxuY29udmVydC5ncmF5Lmh3YiA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHJldHVybiBbMCwgMTAwLCBncmF5WzBdXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5jbXlrID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0cmV0dXJuIFswLCAwLCAwLCBncmF5WzBdXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5sYWIgPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRyZXR1cm4gW2dyYXlbMF0sIDAsIDBdO1xufTtcblxuY29udmVydC5ncmF5LmhleCA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHZhciB2YWwgPSBNYXRoLnJvdW5kKGdyYXlbMF0gLyAxMDAgKiAyNTUpICYgMHhGRjtcblx0dmFyIGludGVnZXIgPSAodmFsIDw8IDE2KSArICh2YWwgPDwgOCkgKyB2YWw7XG5cblx0dmFyIHN0cmluZyA9IGludGVnZXIudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cdHJldHVybiAnMDAwMDAwJy5zdWJzdHJpbmcoc3RyaW5nLmxlbmd0aCkgKyBzdHJpbmc7XG59O1xuXG5jb252ZXJ0LnJnYi5ncmF5ID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgdmFsID0gKHJnYlswXSArIHJnYlsxXSArIHJnYlsyXSkgLyAzO1xuXHRyZXR1cm4gW3ZhbCAvIDI1NSAqIDEwMF07XG59O1xuIiwidmFyIGNvbnZlcnNpb25zID0gcmVxdWlyZSgnLi9jb252ZXJzaW9ucycpO1xudmFyIHJvdXRlID0gcmVxdWlyZSgnLi9yb3V0ZScpO1xuXG52YXIgY29udmVydCA9IHt9O1xuXG52YXIgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMpO1xuXG5mdW5jdGlvbiB3cmFwUmF3KGZuKSB7XG5cdHZhciB3cmFwcGVkRm4gPSBmdW5jdGlvbiAoYXJncykge1xuXHRcdGlmIChhcmdzID09PSB1bmRlZmluZWQgfHwgYXJncyA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGFyZ3M7XG5cdFx0fVxuXG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZm4oYXJncyk7XG5cdH07XG5cblx0Ly8gcHJlc2VydmUgLmNvbnZlcnNpb24gcHJvcGVydHkgaWYgdGhlcmUgaXMgb25lXG5cdGlmICgnY29udmVyc2lvbicgaW4gZm4pIHtcblx0XHR3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG5cdH1cblxuXHRyZXR1cm4gd3JhcHBlZEZuO1xufVxuXG5mdW5jdGlvbiB3cmFwUm91bmRlZChmbikge1xuXHR2YXIgd3JhcHBlZEZuID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0XHRpZiAoYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3MgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBhcmdzO1xuXHRcdH1cblxuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuXHRcdFx0YXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cdFx0fVxuXG5cdFx0dmFyIHJlc3VsdCA9IGZuKGFyZ3MpO1xuXG5cdFx0Ly8gd2UncmUgYXNzdW1pbmcgdGhlIHJlc3VsdCBpcyBhbiBhcnJheSBoZXJlLlxuXHRcdC8vIHNlZSBub3RpY2UgaW4gY29udmVyc2lvbnMuanM7IGRvbid0IHVzZSBib3ggdHlwZXNcblx0XHQvLyBpbiBjb252ZXJzaW9uIGZ1bmN0aW9ucy5cblx0XHRpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAodmFyIGxlbiA9IHJlc3VsdC5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0cmVzdWx0W2ldID0gTWF0aC5yb3VuZChyZXN1bHRbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0Ly8gcHJlc2VydmUgLmNvbnZlcnNpb24gcHJvcGVydHkgaWYgdGhlcmUgaXMgb25lXG5cdGlmICgnY29udmVyc2lvbicgaW4gZm4pIHtcblx0XHR3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG5cdH1cblxuXHRyZXR1cm4gd3JhcHBlZEZuO1xufVxuXG5tb2RlbHMuZm9yRWFjaChmdW5jdGlvbiAoZnJvbU1vZGVsKSB7XG5cdGNvbnZlcnRbZnJvbU1vZGVsXSA9IHt9O1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W2Zyb21Nb2RlbF0sICdjaGFubmVscycsIHt2YWx1ZTogY29udmVyc2lvbnNbZnJvbU1vZGVsXS5jaGFubmVsc30pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFtmcm9tTW9kZWxdLCAnbGFiZWxzJywge3ZhbHVlOiBjb252ZXJzaW9uc1tmcm9tTW9kZWxdLmxhYmVsc30pO1xuXG5cdHZhciByb3V0ZXMgPSByb3V0ZShmcm9tTW9kZWwpO1xuXHR2YXIgcm91dGVNb2RlbHMgPSBPYmplY3Qua2V5cyhyb3V0ZXMpO1xuXG5cdHJvdXRlTW9kZWxzLmZvckVhY2goZnVuY3Rpb24gKHRvTW9kZWwpIHtcblx0XHR2YXIgZm4gPSByb3V0ZXNbdG9Nb2RlbF07XG5cblx0XHRjb252ZXJ0W2Zyb21Nb2RlbF1bdG9Nb2RlbF0gPSB3cmFwUm91bmRlZChmbik7XG5cdFx0Y29udmVydFtmcm9tTW9kZWxdW3RvTW9kZWxdLnJhdyA9IHdyYXBSYXcoZm4pO1xuXHR9KTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG4iLCJ2YXIgY29udmVyc2lvbnMgPSByZXF1aXJlKCcuL2NvbnZlcnNpb25zJyk7XG5cbi8qXG5cdHRoaXMgZnVuY3Rpb24gcm91dGVzIGEgbW9kZWwgdG8gYWxsIG90aGVyIG1vZGVscy5cblxuXHRhbGwgZnVuY3Rpb25zIHRoYXQgYXJlIHJvdXRlZCBoYXZlIGEgcHJvcGVydHkgYC5jb252ZXJzaW9uYCBhdHRhY2hlZFxuXHR0byB0aGUgcmV0dXJuZWQgc3ludGhldGljIGZ1bmN0aW9uLiBUaGlzIHByb3BlcnR5IGlzIGFuIGFycmF5XG5cdG9mIHN0cmluZ3MsIGVhY2ggd2l0aCB0aGUgc3RlcHMgaW4gYmV0d2VlbiB0aGUgJ2Zyb20nIGFuZCAndG8nXG5cdGNvbG9yIG1vZGVscyAoaW5jbHVzaXZlKS5cblxuXHRjb252ZXJzaW9ucyB0aGF0IGFyZSBub3QgcG9zc2libGUgc2ltcGx5IGFyZSBub3QgaW5jbHVkZWQuXG4qL1xuXG5mdW5jdGlvbiBidWlsZEdyYXBoKCkge1xuXHR2YXIgZ3JhcGggPSB7fTtcblx0Ly8gaHR0cHM6Ly9qc3BlcmYuY29tL29iamVjdC1rZXlzLXZzLWZvci1pbi13aXRoLWNsb3N1cmUvM1xuXHR2YXIgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMpO1xuXG5cdGZvciAodmFyIGxlbiA9IG1vZGVscy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRncmFwaFttb2RlbHNbaV1dID0ge1xuXHRcdFx0Ly8gaHR0cDovL2pzcGVyZi5jb20vMS12cy1pbmZpbml0eVxuXHRcdFx0Ly8gbWljcm8tb3B0LCBidXQgdGhpcyBpcyBzaW1wbGUuXG5cdFx0XHRkaXN0YW5jZTogLTEsXG5cdFx0XHRwYXJlbnQ6IG51bGxcblx0XHR9O1xuXHR9XG5cblx0cmV0dXJuIGdyYXBoO1xufVxuXG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CcmVhZHRoLWZpcnN0X3NlYXJjaFxuZnVuY3Rpb24gZGVyaXZlQkZTKGZyb21Nb2RlbCkge1xuXHR2YXIgZ3JhcGggPSBidWlsZEdyYXBoKCk7XG5cdHZhciBxdWV1ZSA9IFtmcm9tTW9kZWxdOyAvLyB1bnNoaWZ0IC0+IHF1ZXVlIC0+IHBvcFxuXG5cdGdyYXBoW2Zyb21Nb2RlbF0uZGlzdGFuY2UgPSAwO1xuXG5cdHdoaWxlIChxdWV1ZS5sZW5ndGgpIHtcblx0XHR2YXIgY3VycmVudCA9IHF1ZXVlLnBvcCgpO1xuXHRcdHZhciBhZGphY2VudHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9uc1tjdXJyZW50XSk7XG5cblx0XHRmb3IgKHZhciBsZW4gPSBhZGphY2VudHMubGVuZ3RoLCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHR2YXIgYWRqYWNlbnQgPSBhZGphY2VudHNbaV07XG5cdFx0XHR2YXIgbm9kZSA9IGdyYXBoW2FkamFjZW50XTtcblxuXHRcdFx0aWYgKG5vZGUuZGlzdGFuY2UgPT09IC0xKSB7XG5cdFx0XHRcdG5vZGUuZGlzdGFuY2UgPSBncmFwaFtjdXJyZW50XS5kaXN0YW5jZSArIDE7XG5cdFx0XHRcdG5vZGUucGFyZW50ID0gY3VycmVudDtcblx0XHRcdFx0cXVldWUudW5zaGlmdChhZGphY2VudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGdyYXBoO1xufVxuXG5mdW5jdGlvbiBsaW5rKGZyb20sIHRvKSB7XG5cdHJldHVybiBmdW5jdGlvbiAoYXJncykge1xuXHRcdHJldHVybiB0byhmcm9tKGFyZ3MpKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gd3JhcENvbnZlcnNpb24odG9Nb2RlbCwgZ3JhcGgpIHtcblx0dmFyIHBhdGggPSBbZ3JhcGhbdG9Nb2RlbF0ucGFyZW50LCB0b01vZGVsXTtcblx0dmFyIGZuID0gY29udmVyc2lvbnNbZ3JhcGhbdG9Nb2RlbF0ucGFyZW50XVt0b01vZGVsXTtcblxuXHR2YXIgY3VyID0gZ3JhcGhbdG9Nb2RlbF0ucGFyZW50O1xuXHR3aGlsZSAoZ3JhcGhbY3VyXS5wYXJlbnQpIHtcblx0XHRwYXRoLnVuc2hpZnQoZ3JhcGhbY3VyXS5wYXJlbnQpO1xuXHRcdGZuID0gbGluayhjb252ZXJzaW9uc1tncmFwaFtjdXJdLnBhcmVudF1bY3VyXSwgZm4pO1xuXHRcdGN1ciA9IGdyYXBoW2N1cl0ucGFyZW50O1xuXHR9XG5cblx0Zm4uY29udmVyc2lvbiA9IHBhdGg7XG5cdHJldHVybiBmbjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZnJvbU1vZGVsKSB7XG5cdHZhciBncmFwaCA9IGRlcml2ZUJGUyhmcm9tTW9kZWwpO1xuXHR2YXIgY29udmVyc2lvbiA9IHt9O1xuXG5cdHZhciBtb2RlbHMgPSBPYmplY3Qua2V5cyhncmFwaCk7XG5cdGZvciAodmFyIGxlbiA9IG1vZGVscy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHR2YXIgdG9Nb2RlbCA9IG1vZGVsc1tpXTtcblx0XHR2YXIgbm9kZSA9IGdyYXBoW3RvTW9kZWxdO1xuXG5cdFx0aWYgKG5vZGUucGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHQvLyBubyBwb3NzaWJsZSBjb252ZXJzaW9uLCBvciB0aGlzIG5vZGUgaXMgdGhlIHNvdXJjZSBtb2RlbC5cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnZlcnNpb25bdG9Nb2RlbF0gPSB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCk7XG5cdH1cblxuXHRyZXR1cm4gY29udmVyc2lvbjtcbn07XG5cbiIsIid1c2Ugc3RyaWN0J1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblx0XCJhbGljZWJsdWVcIjogWzI0MCwgMjQ4LCAyNTVdLFxyXG5cdFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsIDIzNSwgMjE1XSxcclxuXHRcImFxdWFcIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImFxdWFtYXJpbmVcIjogWzEyNywgMjU1LCAyMTJdLFxyXG5cdFwiYXp1cmVcIjogWzI0MCwgMjU1LCAyNTVdLFxyXG5cdFwiYmVpZ2VcIjogWzI0NSwgMjQ1LCAyMjBdLFxyXG5cdFwiYmlzcXVlXCI6IFsyNTUsIDIyOCwgMTk2XSxcclxuXHRcImJsYWNrXCI6IFswLCAwLCAwXSxcclxuXHRcImJsYW5jaGVkYWxtb25kXCI6IFsyNTUsIDIzNSwgMjA1XSxcclxuXHRcImJsdWVcIjogWzAsIDAsIDI1NV0sXHJcblx0XCJibHVldmlvbGV0XCI6IFsxMzgsIDQzLCAyMjZdLFxyXG5cdFwiYnJvd25cIjogWzE2NSwgNDIsIDQyXSxcclxuXHRcImJ1cmx5d29vZFwiOiBbMjIyLCAxODQsIDEzNV0sXHJcblx0XCJjYWRldGJsdWVcIjogWzk1LCAxNTgsIDE2MF0sXHJcblx0XCJjaGFydHJldXNlXCI6IFsxMjcsIDI1NSwgMF0sXHJcblx0XCJjaG9jb2xhdGVcIjogWzIxMCwgMTA1LCAzMF0sXHJcblx0XCJjb3JhbFwiOiBbMjU1LCAxMjcsIDgwXSxcclxuXHRcImNvcm5mbG93ZXJibHVlXCI6IFsxMDAsIDE0OSwgMjM3XSxcclxuXHRcImNvcm5zaWxrXCI6IFsyNTUsIDI0OCwgMjIwXSxcclxuXHRcImNyaW1zb25cIjogWzIyMCwgMjAsIDYwXSxcclxuXHRcImN5YW5cIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImRhcmtibHVlXCI6IFswLCAwLCAxMzldLFxyXG5cdFwiZGFya2N5YW5cIjogWzAsIDEzOSwgMTM5XSxcclxuXHRcImRhcmtnb2xkZW5yb2RcIjogWzE4NCwgMTM0LCAxMV0sXHJcblx0XCJkYXJrZ3JheVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJrZ3JlZW5cIjogWzAsIDEwMCwgMF0sXHJcblx0XCJkYXJrZ3JleVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJra2hha2lcIjogWzE4OSwgMTgzLCAxMDddLFxyXG5cdFwiZGFya21hZ2VudGFcIjogWzEzOSwgMCwgMTM5XSxcclxuXHRcImRhcmtvbGl2ZWdyZWVuXCI6IFs4NSwgMTA3LCA0N10sXHJcblx0XCJkYXJrb3JhbmdlXCI6IFsyNTUsIDE0MCwgMF0sXHJcblx0XCJkYXJrb3JjaGlkXCI6IFsxNTMsIDUwLCAyMDRdLFxyXG5cdFwiZGFya3JlZFwiOiBbMTM5LCAwLCAwXSxcclxuXHRcImRhcmtzYWxtb25cIjogWzIzMywgMTUwLCAxMjJdLFxyXG5cdFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsIDE4OCwgMTQzXSxcclxuXHRcImRhcmtzbGF0ZWJsdWVcIjogWzcyLCA2MSwgMTM5XSxcclxuXHRcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LCA3OSwgNzldLFxyXG5cdFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsIDc5LCA3OV0sXHJcblx0XCJkYXJrdHVycXVvaXNlXCI6IFswLCAyMDYsIDIwOV0sXHJcblx0XCJkYXJrdmlvbGV0XCI6IFsxNDgsIDAsIDIxMV0sXHJcblx0XCJkZWVwcGlua1wiOiBbMjU1LCAyMCwgMTQ3XSxcclxuXHRcImRlZXBza3libHVlXCI6IFswLCAxOTEsIDI1NV0sXHJcblx0XCJkaW1ncmF5XCI6IFsxMDUsIDEwNSwgMTA1XSxcclxuXHRcImRpbWdyZXlcIjogWzEwNSwgMTA1LCAxMDVdLFxyXG5cdFwiZG9kZ2VyYmx1ZVwiOiBbMzAsIDE0NCwgMjU1XSxcclxuXHRcImZpcmVicmlja1wiOiBbMTc4LCAzNCwgMzRdLFxyXG5cdFwiZmxvcmFsd2hpdGVcIjogWzI1NSwgMjUwLCAyNDBdLFxyXG5cdFwiZm9yZXN0Z3JlZW5cIjogWzM0LCAxMzksIDM0XSxcclxuXHRcImZ1Y2hzaWFcIjogWzI1NSwgMCwgMjU1XSxcclxuXHRcImdhaW5zYm9yb1wiOiBbMjIwLCAyMjAsIDIyMF0sXHJcblx0XCJnaG9zdHdoaXRlXCI6IFsyNDgsIDI0OCwgMjU1XSxcclxuXHRcImdvbGRcIjogWzI1NSwgMjE1LCAwXSxcclxuXHRcImdvbGRlbnJvZFwiOiBbMjE4LCAxNjUsIDMyXSxcclxuXHRcImdyYXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiZ3JlZW5cIjogWzAsIDEyOCwgMF0sXHJcblx0XCJncmVlbnllbGxvd1wiOiBbMTczLCAyNTUsIDQ3XSxcclxuXHRcImdyZXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiaG9uZXlkZXdcIjogWzI0MCwgMjU1LCAyNDBdLFxyXG5cdFwiaG90cGlua1wiOiBbMjU1LCAxMDUsIDE4MF0sXHJcblx0XCJpbmRpYW5yZWRcIjogWzIwNSwgOTIsIDkyXSxcclxuXHRcImluZGlnb1wiOiBbNzUsIDAsIDEzMF0sXHJcblx0XCJpdm9yeVwiOiBbMjU1LCAyNTUsIDI0MF0sXHJcblx0XCJraGFraVwiOiBbMjQwLCAyMzAsIDE0MF0sXHJcblx0XCJsYXZlbmRlclwiOiBbMjMwLCAyMzAsIDI1MF0sXHJcblx0XCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsIDI0MCwgMjQ1XSxcclxuXHRcImxhd25ncmVlblwiOiBbMTI0LCAyNTIsIDBdLFxyXG5cdFwibGVtb25jaGlmZm9uXCI6IFsyNTUsIDI1MCwgMjA1XSxcclxuXHRcImxpZ2h0Ymx1ZVwiOiBbMTczLCAyMTYsIDIzMF0sXHJcblx0XCJsaWdodGNvcmFsXCI6IFsyNDAsIDEyOCwgMTI4XSxcclxuXHRcImxpZ2h0Y3lhblwiOiBbMjI0LCAyNTUsIDI1NV0sXHJcblx0XCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLCAyNTAsIDIxMF0sXHJcblx0XCJsaWdodGdyYXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRncmVlblwiOiBbMTQ0LCAyMzgsIDE0NF0sXHJcblx0XCJsaWdodGdyZXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRwaW5rXCI6IFsyNTUsIDE4MiwgMTkzXSxcclxuXHRcImxpZ2h0c2FsbW9uXCI6IFsyNTUsIDE2MCwgMTIyXSxcclxuXHRcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLCAxNzgsIDE3MF0sXHJcblx0XCJsaWdodHNreWJsdWVcIjogWzEzNSwgMjA2LCAyNTBdLFxyXG5cdFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzdGVlbGJsdWVcIjogWzE3NiwgMTk2LCAyMjJdLFxyXG5cdFwibGlnaHR5ZWxsb3dcIjogWzI1NSwgMjU1LCAyMjRdLFxyXG5cdFwibGltZVwiOiBbMCwgMjU1LCAwXSxcclxuXHRcImxpbWVncmVlblwiOiBbNTAsIDIwNSwgNTBdLFxyXG5cdFwibGluZW5cIjogWzI1MCwgMjQwLCAyMzBdLFxyXG5cdFwibWFnZW50YVwiOiBbMjU1LCAwLCAyNTVdLFxyXG5cdFwibWFyb29uXCI6IFsxMjgsIDAsIDBdLFxyXG5cdFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLCAyMDUsIDE3MF0sXHJcblx0XCJtZWRpdW1ibHVlXCI6IFswLCAwLCAyMDVdLFxyXG5cdFwibWVkaXVtb3JjaGlkXCI6IFsxODYsIDg1LCAyMTFdLFxyXG5cdFwibWVkaXVtcHVycGxlXCI6IFsxNDcsIDExMiwgMjE5XSxcclxuXHRcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwgMTc5LCAxMTNdLFxyXG5cdFwibWVkaXVtc2xhdGVibHVlXCI6IFsxMjMsIDEwNCwgMjM4XSxcclxuXHRcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLCAyNTAsIDE1NF0sXHJcblx0XCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLCAyMDksIDIwNF0sXHJcblx0XCJtZWRpdW12aW9sZXRyZWRcIjogWzE5OSwgMjEsIDEzM10sXHJcblx0XCJtaWRuaWdodGJsdWVcIjogWzI1LCAyNSwgMTEyXSxcclxuXHRcIm1pbnRjcmVhbVwiOiBbMjQ1LCAyNTUsIDI1MF0sXHJcblx0XCJtaXN0eXJvc2VcIjogWzI1NSwgMjI4LCAyMjVdLFxyXG5cdFwibW9jY2FzaW5cIjogWzI1NSwgMjI4LCAxODFdLFxyXG5cdFwibmF2YWpvd2hpdGVcIjogWzI1NSwgMjIyLCAxNzNdLFxyXG5cdFwibmF2eVwiOiBbMCwgMCwgMTI4XSxcclxuXHRcIm9sZGxhY2VcIjogWzI1MywgMjQ1LCAyMzBdLFxyXG5cdFwib2xpdmVcIjogWzEyOCwgMTI4LCAwXSxcclxuXHRcIm9saXZlZHJhYlwiOiBbMTA3LCAxNDIsIDM1XSxcclxuXHRcIm9yYW5nZVwiOiBbMjU1LCAxNjUsIDBdLFxyXG5cdFwib3JhbmdlcmVkXCI6IFsyNTUsIDY5LCAwXSxcclxuXHRcIm9yY2hpZFwiOiBbMjE4LCAxMTIsIDIxNF0sXHJcblx0XCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsIDIzMiwgMTcwXSxcclxuXHRcInBhbGVncmVlblwiOiBbMTUyLCAyNTEsIDE1Ml0sXHJcblx0XCJwYWxldHVycXVvaXNlXCI6IFsxNzUsIDIzOCwgMjM4XSxcclxuXHRcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwgMTEyLCAxNDddLFxyXG5cdFwicGFwYXlhd2hpcFwiOiBbMjU1LCAyMzksIDIxM10sXHJcblx0XCJwZWFjaHB1ZmZcIjogWzI1NSwgMjE4LCAxODVdLFxyXG5cdFwicGVydVwiOiBbMjA1LCAxMzMsIDYzXSxcclxuXHRcInBpbmtcIjogWzI1NSwgMTkyLCAyMDNdLFxyXG5cdFwicGx1bVwiOiBbMjIxLCAxNjAsIDIyMV0sXHJcblx0XCJwb3dkZXJibHVlXCI6IFsxNzYsIDIyNCwgMjMwXSxcclxuXHRcInB1cnBsZVwiOiBbMTI4LCAwLCAxMjhdLFxyXG5cdFwicmViZWNjYXB1cnBsZVwiOiBbMTAyLCA1MSwgMTUzXSxcclxuXHRcInJlZFwiOiBbMjU1LCAwLCAwXSxcclxuXHRcInJvc3licm93blwiOiBbMTg4LCAxNDMsIDE0M10sXHJcblx0XCJyb3lhbGJsdWVcIjogWzY1LCAxMDUsIDIyNV0sXHJcblx0XCJzYWRkbGVicm93blwiOiBbMTM5LCA2OSwgMTldLFxyXG5cdFwic2FsbW9uXCI6IFsyNTAsIDEyOCwgMTE0XSxcclxuXHRcInNhbmR5YnJvd25cIjogWzI0NCwgMTY0LCA5Nl0sXHJcblx0XCJzZWFncmVlblwiOiBbNDYsIDEzOSwgODddLFxyXG5cdFwic2Vhc2hlbGxcIjogWzI1NSwgMjQ1LCAyMzhdLFxyXG5cdFwic2llbm5hXCI6IFsxNjAsIDgyLCA0NV0sXHJcblx0XCJzaWx2ZXJcIjogWzE5MiwgMTkyLCAxOTJdLFxyXG5cdFwic2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDIzNV0sXHJcblx0XCJzbGF0ZWJsdWVcIjogWzEwNiwgOTAsIDIwNV0sXHJcblx0XCJzbGF0ZWdyYXlcIjogWzExMiwgMTI4LCAxNDRdLFxyXG5cdFwic2xhdGVncmV5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcclxuXHRcInNub3dcIjogWzI1NSwgMjUwLCAyNTBdLFxyXG5cdFwic3ByaW5nZ3JlZW5cIjogWzAsIDI1NSwgMTI3XSxcclxuXHRcInN0ZWVsYmx1ZVwiOiBbNzAsIDEzMCwgMTgwXSxcclxuXHRcInRhblwiOiBbMjEwLCAxODAsIDE0MF0sXHJcblx0XCJ0ZWFsXCI6IFswLCAxMjgsIDEyOF0sXHJcblx0XCJ0aGlzdGxlXCI6IFsyMTYsIDE5MSwgMjE2XSxcclxuXHRcInRvbWF0b1wiOiBbMjU1LCA5OSwgNzFdLFxyXG5cdFwidHVycXVvaXNlXCI6IFs2NCwgMjI0LCAyMDhdLFxyXG5cdFwidmlvbGV0XCI6IFsyMzgsIDEzMCwgMjM4XSxcclxuXHRcIndoZWF0XCI6IFsyNDUsIDIyMiwgMTc5XSxcclxuXHRcIndoaXRlXCI6IFsyNTUsIDI1NSwgMjU1XSxcclxuXHRcIndoaXRlc21va2VcIjogWzI0NSwgMjQ1LCAyNDVdLFxyXG5cdFwieWVsbG93XCI6IFsyNTUsIDI1NSwgMF0sXHJcblx0XCJ5ZWxsb3dncmVlblwiOiBbMTU0LCAyMDUsIDUwXVxyXG59O1xyXG4iLCIvKiBNSVQgbGljZW5zZSAqL1xudmFyIGNvbG9yTmFtZXMgPSByZXF1aXJlKCdjb2xvci1uYW1lJyk7XG52YXIgc3dpenpsZSA9IHJlcXVpcmUoJ3NpbXBsZS1zd2l6emxlJyk7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QuaGFzT3duUHJvcGVydHk7XG5cbnZhciByZXZlcnNlTmFtZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4vLyBjcmVhdGUgYSBsaXN0IG9mIHJldmVyc2UgY29sb3IgbmFtZXNcbmZvciAodmFyIG5hbWUgaW4gY29sb3JOYW1lcykge1xuXHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb2xvck5hbWVzLCBuYW1lKSkge1xuXHRcdHJldmVyc2VOYW1lc1tjb2xvck5hbWVzW25hbWVdXSA9IG5hbWU7XG5cdH1cbn1cblxudmFyIGNzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG5cdHRvOiB7fSxcblx0Z2V0OiB7fVxufTtcblxuY3MuZ2V0ID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgcHJlZml4ID0gc3RyaW5nLnN1YnN0cmluZygwLCAzKS50b0xvd2VyQ2FzZSgpO1xuXHR2YXIgdmFsO1xuXHR2YXIgbW9kZWw7XG5cdHN3aXRjaCAocHJlZml4KSB7XG5cdFx0Y2FzZSAnaHNsJzpcblx0XHRcdHZhbCA9IGNzLmdldC5oc2woc3RyaW5nKTtcblx0XHRcdG1vZGVsID0gJ2hzbCc7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdod2InOlxuXHRcdFx0dmFsID0gY3MuZ2V0Lmh3YihzdHJpbmcpO1xuXHRcdFx0bW9kZWwgPSAnaHdiJztcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR2YWwgPSBjcy5nZXQucmdiKHN0cmluZyk7XG5cdFx0XHRtb2RlbCA9ICdyZ2InO1xuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRpZiAoIXZhbCkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0cmV0dXJuIHttb2RlbDogbW9kZWwsIHZhbHVlOiB2YWx9O1xufTtcblxuY3MuZ2V0LnJnYiA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0aWYgKCFzdHJpbmcpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHZhciBhYmJyID0gL14jKFthLWYwLTldezMsNH0pJC9pO1xuXHR2YXIgaGV4ID0gL14jKFthLWYwLTldezZ9KShbYS1mMC05XXsyfSk/JC9pO1xuXHR2YXIgcmdiYSA9IC9ecmdiYT9cXChcXHMqKFsrLV0/XFxkKykoPz1bXFxzLF0pXFxzKig/OixcXHMqKT8oWystXT9cXGQrKSg/PVtcXHMsXSlcXHMqKD86LFxccyopPyhbKy1dP1xcZCspXFxzKig/OlssfFxcL11cXHMqKFsrLV0/W1xcZFxcLl0rKSglPylcXHMqKT9cXCkkLztcblx0dmFyIHBlciA9IC9ecmdiYT9cXChcXHMqKFsrLV0/W1xcZFxcLl0rKVxcJVxccyosP1xccyooWystXT9bXFxkXFwuXSspXFwlXFxzKiw/XFxzKihbKy1dP1tcXGRcXC5dKylcXCVcXHMqKD86Wyx8XFwvXVxccyooWystXT9bXFxkXFwuXSspKCU/KVxccyopP1xcKSQvO1xuXHR2YXIga2V5d29yZCA9IC9eKFxcdyspJC87XG5cblx0dmFyIHJnYiA9IFswLCAwLCAwLCAxXTtcblx0dmFyIG1hdGNoO1xuXHR2YXIgaTtcblx0dmFyIGhleEFscGhhO1xuXG5cdGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChoZXgpKSB7XG5cdFx0aGV4QWxwaGEgPSBtYXRjaFsyXTtcblx0XHRtYXRjaCA9IG1hdGNoWzFdO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0Ly8gaHR0cHM6Ly9qc3BlcmYuY29tL3NsaWNlLXZzLXN1YnN0ci12cy1zdWJzdHJpbmctbWV0aG9kcy1sb25nLXN0cmluZy8xOVxuXHRcdFx0dmFyIGkyID0gaSAqIDI7XG5cdFx0XHRyZ2JbaV0gPSBwYXJzZUludChtYXRjaC5zbGljZShpMiwgaTIgKyAyKSwgMTYpO1xuXHRcdH1cblxuXHRcdGlmIChoZXhBbHBoYSkge1xuXHRcdFx0cmdiWzNdID0gcGFyc2VJbnQoaGV4QWxwaGEsIDE2KSAvIDI1NTtcblx0XHR9XG5cdH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goYWJicikpIHtcblx0XHRtYXRjaCA9IG1hdGNoWzFdO1xuXHRcdGhleEFscGhhID0gbWF0Y2hbM107XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0XHRyZ2JbaV0gPSBwYXJzZUludChtYXRjaFtpXSArIG1hdGNoW2ldLCAxNik7XG5cdFx0fVxuXG5cdFx0aWYgKGhleEFscGhhKSB7XG5cdFx0XHRyZ2JbM10gPSBwYXJzZUludChoZXhBbHBoYSArIGhleEFscGhhLCAxNikgLyAyNTU7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKHJnYmEpKSB7XG5cdFx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0cmdiW2ldID0gcGFyc2VJbnQobWF0Y2hbaSArIDFdLCAwKTtcblx0XHR9XG5cblx0XHRpZiAobWF0Y2hbNF0pIHtcblx0XHRcdGlmIChtYXRjaFs1XSkge1xuXHRcdFx0XHRyZ2JbM10gPSBwYXJzZUZsb2F0KG1hdGNoWzRdKSAqIDAuMDE7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZ2JbM10gPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2gocGVyKSkge1xuXHRcdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYltpXSA9IE1hdGgucm91bmQocGFyc2VGbG9hdChtYXRjaFtpICsgMV0pICogMi41NSk7XG5cdFx0fVxuXG5cdFx0aWYgKG1hdGNoWzRdKSB7XG5cdFx0XHRpZiAobWF0Y2hbNV0pIHtcblx0XHRcdFx0cmdiWzNdID0gcGFyc2VGbG9hdChtYXRjaFs0XSkgKiAwLjAxO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmdiWzNdID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKGtleXdvcmQpKSB7XG5cdFx0aWYgKG1hdGNoWzFdID09PSAndHJhbnNwYXJlbnQnKSB7XG5cdFx0XHRyZXR1cm4gWzAsIDAsIDAsIDBdO1xuXHRcdH1cblxuXHRcdGlmICghaGFzT3duUHJvcGVydHkuY2FsbChjb2xvck5hbWVzLCBtYXRjaFsxXSkpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdHJnYiA9IGNvbG9yTmFtZXNbbWF0Y2hbMV1dO1xuXHRcdHJnYlszXSA9IDE7XG5cblx0XHRyZXR1cm4gcmdiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdHJnYltpXSA9IGNsYW1wKHJnYltpXSwgMCwgMjU1KTtcblx0fVxuXHRyZ2JbM10gPSBjbGFtcChyZ2JbM10sIDAsIDEpO1xuXG5cdHJldHVybiByZ2I7XG59O1xuXG5jcy5nZXQuaHNsID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHRpZiAoIXN0cmluZykge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0dmFyIGhzbCA9IC9eaHNsYT9cXChcXHMqKFsrLV0/KD86XFxkezAsM31cXC4pP1xcZCspKD86ZGVnKT9cXHMqLD9cXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqLD9cXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqKD86Wyx8XFwvXVxccyooWystXT8oPz1cXC5cXGR8XFxkKSg/OjB8WzEtOV1cXGQqKT8oPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pXFxzKik/XFwpJC87XG5cdHZhciBtYXRjaCA9IHN0cmluZy5tYXRjaChoc2wpO1xuXG5cdGlmIChtYXRjaCkge1xuXHRcdHZhciBhbHBoYSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuXHRcdHZhciBoID0gKChwYXJzZUZsb2F0KG1hdGNoWzFdKSAlIDM2MCkgKyAzNjApICUgMzYwO1xuXHRcdHZhciBzID0gY2xhbXAocGFyc2VGbG9hdChtYXRjaFsyXSksIDAsIDEwMCk7XG5cdFx0dmFyIGwgPSBjbGFtcChwYXJzZUZsb2F0KG1hdGNoWzNdKSwgMCwgMTAwKTtcblx0XHR2YXIgYSA9IGNsYW1wKGlzTmFOKGFscGhhKSA/IDEgOiBhbHBoYSwgMCwgMSk7XG5cblx0XHRyZXR1cm4gW2gsIHMsIGwsIGFdO1xuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59O1xuXG5jcy5nZXQuaHdiID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHRpZiAoIXN0cmluZykge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0dmFyIGh3YiA9IC9eaHdiXFwoXFxzKihbKy1dP1xcZHswLDN9KD86XFwuXFxkKyk/KSg/OmRlZyk/XFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqLFxccyooWystXT9bXFxkXFwuXSspJVxccyooPzosXFxzKihbKy1dPyg/PVxcLlxcZHxcXGQpKD86MHxbMS05XVxcZCopPyg/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPylcXHMqKT9cXCkkLztcblx0dmFyIG1hdGNoID0gc3RyaW5nLm1hdGNoKGh3Yik7XG5cblx0aWYgKG1hdGNoKSB7XG5cdFx0dmFyIGFscGhhID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG5cdFx0dmFyIGggPSAoKHBhcnNlRmxvYXQobWF0Y2hbMV0pICUgMzYwKSArIDM2MCkgJSAzNjA7XG5cdFx0dmFyIHcgPSBjbGFtcChwYXJzZUZsb2F0KG1hdGNoWzJdKSwgMCwgMTAwKTtcblx0XHR2YXIgYiA9IGNsYW1wKHBhcnNlRmxvYXQobWF0Y2hbM10pLCAwLCAxMDApO1xuXHRcdHZhciBhID0gY2xhbXAoaXNOYU4oYWxwaGEpID8gMSA6IGFscGhhLCAwLCAxKTtcblx0XHRyZXR1cm4gW2gsIHcsIGIsIGFdO1xuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59O1xuXG5jcy50by5oZXggPSBmdW5jdGlvbiAoKSB7XG5cdHZhciByZ2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHJldHVybiAoXG5cdFx0JyMnICtcblx0XHRoZXhEb3VibGUocmdiYVswXSkgK1xuXHRcdGhleERvdWJsZShyZ2JhWzFdKSArXG5cdFx0aGV4RG91YmxlKHJnYmFbMl0pICtcblx0XHQocmdiYVszXSA8IDFcblx0XHRcdD8gKGhleERvdWJsZShNYXRoLnJvdW5kKHJnYmFbM10gKiAyNTUpKSlcblx0XHRcdDogJycpXG5cdCk7XG59O1xuXG5jcy50by5yZ2IgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciByZ2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHJldHVybiByZ2JhLmxlbmd0aCA8IDQgfHwgcmdiYVszXSA9PT0gMVxuXHRcdD8gJ3JnYignICsgTWF0aC5yb3VuZChyZ2JhWzBdKSArICcsICcgKyBNYXRoLnJvdW5kKHJnYmFbMV0pICsgJywgJyArIE1hdGgucm91bmQocmdiYVsyXSkgKyAnKSdcblx0XHQ6ICdyZ2JhKCcgKyBNYXRoLnJvdW5kKHJnYmFbMF0pICsgJywgJyArIE1hdGgucm91bmQocmdiYVsxXSkgKyAnLCAnICsgTWF0aC5yb3VuZChyZ2JhWzJdKSArICcsICcgKyByZ2JhWzNdICsgJyknO1xufTtcblxuY3MudG8ucmdiLnBlcmNlbnQgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciByZ2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHZhciByID0gTWF0aC5yb3VuZChyZ2JhWzBdIC8gMjU1ICogMTAwKTtcblx0dmFyIGcgPSBNYXRoLnJvdW5kKHJnYmFbMV0gLyAyNTUgKiAxMDApO1xuXHR2YXIgYiA9IE1hdGgucm91bmQocmdiYVsyXSAvIDI1NSAqIDEwMCk7XG5cblx0cmV0dXJuIHJnYmEubGVuZ3RoIDwgNCB8fCByZ2JhWzNdID09PSAxXG5cdFx0PyAncmdiKCcgKyByICsgJyUsICcgKyBnICsgJyUsICcgKyBiICsgJyUpJ1xuXHRcdDogJ3JnYmEoJyArIHIgKyAnJSwgJyArIGcgKyAnJSwgJyArIGIgKyAnJSwgJyArIHJnYmFbM10gKyAnKSc7XG59O1xuXG5jcy50by5oc2wgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBoc2xhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXHRyZXR1cm4gaHNsYS5sZW5ndGggPCA0IHx8IGhzbGFbM10gPT09IDFcblx0XHQ/ICdoc2woJyArIGhzbGFbMF0gKyAnLCAnICsgaHNsYVsxXSArICclLCAnICsgaHNsYVsyXSArICclKSdcblx0XHQ6ICdoc2xhKCcgKyBoc2xhWzBdICsgJywgJyArIGhzbGFbMV0gKyAnJSwgJyArIGhzbGFbMl0gKyAnJSwgJyArIGhzbGFbM10gKyAnKSc7XG59O1xuXG4vLyBod2IgaXMgYSBiaXQgZGlmZmVyZW50IHRoYW4gcmdiKGEpICYgaHNsKGEpIHNpbmNlIHRoZXJlIGlzIG5vIGFscGhhIHNwZWNpZmljIHN5bnRheFxuLy8gKGh3YiBoYXZlIGFscGhhIG9wdGlvbmFsICYgMSBpcyBkZWZhdWx0IHZhbHVlKVxuY3MudG8uaHdiID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgaHdiYSA9IHN3aXp6bGUoYXJndW1lbnRzKTtcblxuXHR2YXIgYSA9ICcnO1xuXHRpZiAoaHdiYS5sZW5ndGggPj0gNCAmJiBod2JhWzNdICE9PSAxKSB7XG5cdFx0YSA9ICcsICcgKyBod2JhWzNdO1xuXHR9XG5cblx0cmV0dXJuICdod2IoJyArIGh3YmFbMF0gKyAnLCAnICsgaHdiYVsxXSArICclLCAnICsgaHdiYVsyXSArICclJyArIGEgKyAnKSc7XG59O1xuXG5jcy50by5rZXl3b3JkID0gZnVuY3Rpb24gKHJnYikge1xuXHRyZXR1cm4gcmV2ZXJzZU5hbWVzW3JnYi5zbGljZSgwLCAzKV07XG59O1xuXG4vLyBoZWxwZXJzXG5mdW5jdGlvbiBjbGFtcChudW0sIG1pbiwgbWF4KSB7XG5cdHJldHVybiBNYXRoLm1pbihNYXRoLm1heChtaW4sIG51bSksIG1heCk7XG59XG5cbmZ1bmN0aW9uIGhleERvdWJsZShudW0pIHtcblx0dmFyIHN0ciA9IE1hdGgucm91bmQobnVtKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuIChzdHIubGVuZ3RoIDwgMikgPyAnMCcgKyBzdHIgOiBzdHI7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb2xvclN0cmluZyA9IHJlcXVpcmUoJ2NvbG9yLXN0cmluZycpO1xudmFyIGNvbnZlcnQgPSByZXF1aXJlKCdjb2xvci1jb252ZXJ0Jyk7XG5cbnZhciBfc2xpY2UgPSBbXS5zbGljZTtcblxudmFyIHNraXBwZWRNb2RlbHMgPSBbXG5cdC8vIHRvIGJlIGhvbmVzdCwgSSBkb24ndCByZWFsbHkgZmVlbCBsaWtlIGtleXdvcmQgYmVsb25ncyBpbiBjb2xvciBjb252ZXJ0LCBidXQgZWguXG5cdCdrZXl3b3JkJyxcblxuXHQvLyBncmF5IGNvbmZsaWN0cyB3aXRoIHNvbWUgbWV0aG9kIG5hbWVzLCBhbmQgaGFzIGl0cyBvd24gbWV0aG9kIGRlZmluZWQuXG5cdCdncmF5JyxcblxuXHQvLyBzaG91bGRuJ3QgcmVhbGx5IGJlIGluIGNvbG9yLWNvbnZlcnQgZWl0aGVyLi4uXG5cdCdoZXgnXG5dO1xuXG52YXIgaGFzaGVkTW9kZWxLZXlzID0ge307XG5PYmplY3Qua2V5cyhjb252ZXJ0KS5mb3JFYWNoKGZ1bmN0aW9uIChtb2RlbCkge1xuXHRoYXNoZWRNb2RlbEtleXNbX3NsaWNlLmNhbGwoY29udmVydFttb2RlbF0ubGFiZWxzKS5zb3J0KCkuam9pbignJyldID0gbW9kZWw7XG59KTtcblxudmFyIGxpbWl0ZXJzID0ge307XG5cbmZ1bmN0aW9uIENvbG9yKG9iaiwgbW9kZWwpIHtcblx0aWYgKCEodGhpcyBpbnN0YW5jZW9mIENvbG9yKSkge1xuXHRcdHJldHVybiBuZXcgQ29sb3Iob2JqLCBtb2RlbCk7XG5cdH1cblxuXHRpZiAobW9kZWwgJiYgbW9kZWwgaW4gc2tpcHBlZE1vZGVscykge1xuXHRcdG1vZGVsID0gbnVsbDtcblx0fVxuXG5cdGlmIChtb2RlbCAmJiAhKG1vZGVsIGluIGNvbnZlcnQpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1vZGVsOiAnICsgbW9kZWwpO1xuXHR9XG5cblx0dmFyIGk7XG5cdHZhciBjaGFubmVscztcblxuXHRpZiAob2JqID09IG51bGwpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuXHRcdHRoaXMubW9kZWwgPSAncmdiJztcblx0XHR0aGlzLmNvbG9yID0gWzAsIDAsIDBdO1xuXHRcdHRoaXMudmFscGhhID0gMTtcblx0fSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDb2xvcikge1xuXHRcdHRoaXMubW9kZWwgPSBvYmoubW9kZWw7XG5cdFx0dGhpcy5jb2xvciA9IG9iai5jb2xvci5zbGljZSgpO1xuXHRcdHRoaXMudmFscGhhID0gb2JqLnZhbHBoYTtcblx0fSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuXHRcdHZhciByZXN1bHQgPSBjb2xvclN0cmluZy5nZXQob2JqKTtcblx0XHRpZiAocmVzdWx0ID09PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBwYXJzZSBjb2xvciBmcm9tIHN0cmluZzogJyArIG9iaik7XG5cdFx0fVxuXG5cdFx0dGhpcy5tb2RlbCA9IHJlc3VsdC5tb2RlbDtcblx0XHRjaGFubmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0uY2hhbm5lbHM7XG5cdFx0dGhpcy5jb2xvciA9IHJlc3VsdC52YWx1ZS5zbGljZSgwLCBjaGFubmVscyk7XG5cdFx0dGhpcy52YWxwaGEgPSB0eXBlb2YgcmVzdWx0LnZhbHVlW2NoYW5uZWxzXSA9PT0gJ251bWJlcicgPyByZXN1bHQudmFsdWVbY2hhbm5lbHNdIDogMTtcblx0fSBlbHNlIGlmIChvYmoubGVuZ3RoKSB7XG5cdFx0dGhpcy5tb2RlbCA9IG1vZGVsIHx8ICdyZ2InO1xuXHRcdGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHR2YXIgbmV3QXJyID0gX3NsaWNlLmNhbGwob2JqLCAwLCBjaGFubmVscyk7XG5cdFx0dGhpcy5jb2xvciA9IHplcm9BcnJheShuZXdBcnIsIGNoYW5uZWxzKTtcblx0XHR0aGlzLnZhbHBoYSA9IHR5cGVvZiBvYmpbY2hhbm5lbHNdID09PSAnbnVtYmVyJyA/IG9ialtjaGFubmVsc10gOiAxO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdudW1iZXInKSB7XG5cdFx0Ly8gdGhpcyBpcyBhbHdheXMgUkdCIC0gY2FuIGJlIGNvbnZlcnRlZCBsYXRlciBvbi5cblx0XHRvYmogJj0gMHhGRkZGRkY7XG5cdFx0dGhpcy5tb2RlbCA9ICdyZ2InO1xuXHRcdHRoaXMuY29sb3IgPSBbXG5cdFx0XHQob2JqID4+IDE2KSAmIDB4RkYsXG5cdFx0XHQob2JqID4+IDgpICYgMHhGRixcblx0XHRcdG9iaiAmIDB4RkZcblx0XHRdO1xuXHRcdHRoaXMudmFscGhhID0gMTtcblx0fSBlbHNlIHtcblx0XHR0aGlzLnZhbHBoYSA9IDE7XG5cblx0XHR2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG5cdFx0aWYgKCdhbHBoYScgaW4gb2JqKSB7XG5cdFx0XHRrZXlzLnNwbGljZShrZXlzLmluZGV4T2YoJ2FscGhhJyksIDEpO1xuXHRcdFx0dGhpcy52YWxwaGEgPSB0eXBlb2Ygb2JqLmFscGhhID09PSAnbnVtYmVyJyA/IG9iai5hbHBoYSA6IDA7XG5cdFx0fVxuXG5cdFx0dmFyIGhhc2hlZEtleXMgPSBrZXlzLnNvcnQoKS5qb2luKCcnKTtcblx0XHRpZiAoIShoYXNoZWRLZXlzIGluIGhhc2hlZE1vZGVsS2V5cykpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIGNvbG9yIGZyb20gb2JqZWN0OiAnICsgSlNPTi5zdHJpbmdpZnkob2JqKSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5tb2RlbCA9IGhhc2hlZE1vZGVsS2V5c1toYXNoZWRLZXlzXTtcblxuXHRcdHZhciBsYWJlbHMgPSBjb252ZXJ0W3RoaXMubW9kZWxdLmxhYmVscztcblx0XHR2YXIgY29sb3IgPSBbXTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb2xvci5wdXNoKG9ialtsYWJlbHNbaV1dKTtcblx0XHR9XG5cblx0XHR0aGlzLmNvbG9yID0gemVyb0FycmF5KGNvbG9yKTtcblx0fVxuXG5cdC8vIHBlcmZvcm0gbGltaXRhdGlvbnMgKGNsYW1waW5nLCBldGMuKVxuXHRpZiAobGltaXRlcnNbdGhpcy5tb2RlbF0pIHtcblx0XHRjaGFubmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0uY2hhbm5lbHM7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHtcblx0XHRcdHZhciBsaW1pdCA9IGxpbWl0ZXJzW3RoaXMubW9kZWxdW2ldO1xuXHRcdFx0aWYgKGxpbWl0KSB7XG5cdFx0XHRcdHRoaXMuY29sb3JbaV0gPSBsaW1pdCh0aGlzLmNvbG9yW2ldKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHR0aGlzLnZhbHBoYSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHRoaXMudmFscGhhKSk7XG5cblx0aWYgKE9iamVjdC5mcmVlemUpIHtcblx0XHRPYmplY3QuZnJlZXplKHRoaXMpO1xuXHR9XG59XG5cbkNvbG9yLnByb3RvdHlwZSA9IHtcblx0dG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5zdHJpbmcoKTtcblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpc1t0aGlzLm1vZGVsXSgpO1xuXHR9LFxuXG5cdHN0cmluZzogZnVuY3Rpb24gKHBsYWNlcykge1xuXHRcdHZhciBzZWxmID0gdGhpcy5tb2RlbCBpbiBjb2xvclN0cmluZy50byA/IHRoaXMgOiB0aGlzLnJnYigpO1xuXHRcdHNlbGYgPSBzZWxmLnJvdW5kKHR5cGVvZiBwbGFjZXMgPT09ICdudW1iZXInID8gcGxhY2VzIDogMSk7XG5cdFx0dmFyIGFyZ3MgPSBzZWxmLnZhbHBoYSA9PT0gMSA/IHNlbGYuY29sb3IgOiBzZWxmLmNvbG9yLmNvbmNhdCh0aGlzLnZhbHBoYSk7XG5cdFx0cmV0dXJuIGNvbG9yU3RyaW5nLnRvW3NlbGYubW9kZWxdKGFyZ3MpO1xuXHR9LFxuXG5cdHBlcmNlbnRTdHJpbmc6IGZ1bmN0aW9uIChwbGFjZXMpIHtcblx0XHR2YXIgc2VsZiA9IHRoaXMucmdiKCkucm91bmQodHlwZW9mIHBsYWNlcyA9PT0gJ251bWJlcicgPyBwbGFjZXMgOiAxKTtcblx0XHR2YXIgYXJncyA9IHNlbGYudmFscGhhID09PSAxID8gc2VsZi5jb2xvciA6IHNlbGYuY29sb3IuY29uY2F0KHRoaXMudmFscGhhKTtcblx0XHRyZXR1cm4gY29sb3JTdHJpbmcudG8ucmdiLnBlcmNlbnQoYXJncyk7XG5cdH0sXG5cblx0YXJyYXk6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy52YWxwaGEgPT09IDEgPyB0aGlzLmNvbG9yLnNsaWNlKCkgOiB0aGlzLmNvbG9yLmNvbmNhdCh0aGlzLnZhbHBoYSk7XG5cdH0sXG5cblx0b2JqZWN0OiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHJlc3VsdCA9IHt9O1xuXHRcdHZhciBjaGFubmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0uY2hhbm5lbHM7XG5cdFx0dmFyIGxhYmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0ubGFiZWxzO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7XG5cdFx0XHRyZXN1bHRbbGFiZWxzW2ldXSA9IHRoaXMuY29sb3JbaV07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMudmFscGhhICE9PSAxKSB7XG5cdFx0XHRyZXN1bHQuYWxwaGEgPSB0aGlzLnZhbHBoYTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LFxuXG5cdHVuaXRBcnJheTogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXHRcdHJnYlswXSAvPSAyNTU7XG5cdFx0cmdiWzFdIC89IDI1NTtcblx0XHRyZ2JbMl0gLz0gMjU1O1xuXG5cdFx0aWYgKHRoaXMudmFscGhhICE9PSAxKSB7XG5cdFx0XHRyZ2IucHVzaCh0aGlzLnZhbHBoYSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJnYjtcblx0fSxcblxuXHR1bml0T2JqZWN0OiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHJnYiA9IHRoaXMucmdiKCkub2JqZWN0KCk7XG5cdFx0cmdiLnIgLz0gMjU1O1xuXHRcdHJnYi5nIC89IDI1NTtcblx0XHRyZ2IuYiAvPSAyNTU7XG5cblx0XHRpZiAodGhpcy52YWxwaGEgIT09IDEpIHtcblx0XHRcdHJnYi5hbHBoYSA9IHRoaXMudmFscGhhO1xuXHRcdH1cblxuXHRcdHJldHVybiByZ2I7XG5cdH0sXG5cblx0cm91bmQ6IGZ1bmN0aW9uIChwbGFjZXMpIHtcblx0XHRwbGFjZXMgPSBNYXRoLm1heChwbGFjZXMgfHwgMCwgMCk7XG5cdFx0cmV0dXJuIG5ldyBDb2xvcih0aGlzLmNvbG9yLm1hcChyb3VuZFRvUGxhY2UocGxhY2VzKSkuY29uY2F0KHRoaXMudmFscGhhKSwgdGhpcy5tb2RlbCk7XG5cdH0sXG5cblx0YWxwaGE6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIG5ldyBDb2xvcih0aGlzLmNvbG9yLmNvbmNhdChNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB2YWwpKSksIHRoaXMubW9kZWwpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnZhbHBoYTtcblx0fSxcblxuXHQvLyByZ2Jcblx0cmVkOiBnZXRzZXQoJ3JnYicsIDAsIG1heGZuKDI1NSkpLFxuXHRncmVlbjogZ2V0c2V0KCdyZ2InLCAxLCBtYXhmbigyNTUpKSxcblx0Ymx1ZTogZ2V0c2V0KCdyZ2InLCAyLCBtYXhmbigyNTUpKSxcblxuXHRodWU6IGdldHNldChbJ2hzbCcsICdoc3YnLCAnaHNsJywgJ2h3YicsICdoY2cnXSwgMCwgZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gKCh2YWwgJSAzNjApICsgMzYwKSAlIDM2MDsgfSksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYnJhY2Utc3R5bGVcblxuXHRzYXR1cmF0aW9ubDogZ2V0c2V0KCdoc2wnLCAxLCBtYXhmbigxMDApKSxcblx0bGlnaHRuZXNzOiBnZXRzZXQoJ2hzbCcsIDIsIG1heGZuKDEwMCkpLFxuXG5cdHNhdHVyYXRpb252OiBnZXRzZXQoJ2hzdicsIDEsIG1heGZuKDEwMCkpLFxuXHR2YWx1ZTogZ2V0c2V0KCdoc3YnLCAyLCBtYXhmbigxMDApKSxcblxuXHRjaHJvbWE6IGdldHNldCgnaGNnJywgMSwgbWF4Zm4oMTAwKSksXG5cdGdyYXk6IGdldHNldCgnaGNnJywgMiwgbWF4Zm4oMTAwKSksXG5cblx0d2hpdGU6IGdldHNldCgnaHdiJywgMSwgbWF4Zm4oMTAwKSksXG5cdHdibGFjazogZ2V0c2V0KCdod2InLCAyLCBtYXhmbigxMDApKSxcblxuXHRjeWFuOiBnZXRzZXQoJ2NteWsnLCAwLCBtYXhmbigxMDApKSxcblx0bWFnZW50YTogZ2V0c2V0KCdjbXlrJywgMSwgbWF4Zm4oMTAwKSksXG5cdHllbGxvdzogZ2V0c2V0KCdjbXlrJywgMiwgbWF4Zm4oMTAwKSksXG5cdGJsYWNrOiBnZXRzZXQoJ2NteWsnLCAzLCBtYXhmbigxMDApKSxcblxuXHR4OiBnZXRzZXQoJ3h5eicsIDAsIG1heGZuKDEwMCkpLFxuXHR5OiBnZXRzZXQoJ3h5eicsIDEsIG1heGZuKDEwMCkpLFxuXHR6OiBnZXRzZXQoJ3h5eicsIDIsIG1heGZuKDEwMCkpLFxuXG5cdGw6IGdldHNldCgnbGFiJywgMCwgbWF4Zm4oMTAwKSksXG5cdGE6IGdldHNldCgnbGFiJywgMSksXG5cdGI6IGdldHNldCgnbGFiJywgMiksXG5cblx0a2V5d29yZDogZnVuY3Rpb24gKHZhbCkge1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKHZhbCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbnZlcnRbdGhpcy5tb2RlbF0ua2V5d29yZCh0aGlzLmNvbG9yKTtcblx0fSxcblxuXHRoZXg6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIG5ldyBDb2xvcih2YWwpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb2xvclN0cmluZy50by5oZXgodGhpcy5yZ2IoKS5yb3VuZCgpLmNvbG9yKTtcblx0fSxcblxuXHRyZ2JOdW1iZXI6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblx0XHRyZXR1cm4gKChyZ2JbMF0gJiAweEZGKSA8PCAxNikgfCAoKHJnYlsxXSAmIDB4RkYpIDw8IDgpIHwgKHJnYlsyXSAmIDB4RkYpO1xuXHR9LFxuXG5cdGx1bWlub3NpdHk6IGZ1bmN0aW9uICgpIHtcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI3JlbGF0aXZlbHVtaW5hbmNlZGVmXG5cdFx0dmFyIHJnYiA9IHRoaXMucmdiKCkuY29sb3I7XG5cblx0XHR2YXIgbHVtID0gW107XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCByZ2IubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBjaGFuID0gcmdiW2ldIC8gMjU1O1xuXHRcdFx0bHVtW2ldID0gKGNoYW4gPD0gMC4wMzkyOCkgPyBjaGFuIC8gMTIuOTIgOiBNYXRoLnBvdygoKGNoYW4gKyAwLjA1NSkgLyAxLjA1NSksIDIuNCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIDAuMjEyNiAqIGx1bVswXSArIDAuNzE1MiAqIGx1bVsxXSArIDAuMDcyMiAqIGx1bVsyXTtcblx0fSxcblxuXHRjb250cmFzdDogZnVuY3Rpb24gKGNvbG9yMikge1xuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jY29udHJhc3QtcmF0aW9kZWZcblx0XHR2YXIgbHVtMSA9IHRoaXMubHVtaW5vc2l0eSgpO1xuXHRcdHZhciBsdW0yID0gY29sb3IyLmx1bWlub3NpdHkoKTtcblxuXHRcdGlmIChsdW0xID4gbHVtMikge1xuXHRcdFx0cmV0dXJuIChsdW0xICsgMC4wNSkgLyAobHVtMiArIDAuMDUpO1xuXHRcdH1cblxuXHRcdHJldHVybiAobHVtMiArIDAuMDUpIC8gKGx1bTEgKyAwLjA1KTtcblx0fSxcblxuXHRsZXZlbDogZnVuY3Rpb24gKGNvbG9yMikge1xuXHRcdHZhciBjb250cmFzdFJhdGlvID0gdGhpcy5jb250cmFzdChjb2xvcjIpO1xuXHRcdGlmIChjb250cmFzdFJhdGlvID49IDcuMSkge1xuXHRcdFx0cmV0dXJuICdBQUEnO1xuXHRcdH1cblxuXHRcdHJldHVybiAoY29udHJhc3RSYXRpbyA+PSA0LjUpID8gJ0FBJyA6ICcnO1xuXHR9LFxuXG5cdGlzRGFyazogZnVuY3Rpb24gKCkge1xuXHRcdC8vIFlJUSBlcXVhdGlvbiBmcm9tIGh0dHA6Ly8yNHdheXMub3JnLzIwMTAvY2FsY3VsYXRpbmctY29sb3ItY29udHJhc3Rcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblx0XHR2YXIgeWlxID0gKHJnYlswXSAqIDI5OSArIHJnYlsxXSAqIDU4NyArIHJnYlsyXSAqIDExNCkgLyAxMDAwO1xuXHRcdHJldHVybiB5aXEgPCAxMjg7XG5cdH0sXG5cblx0aXNMaWdodDogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiAhdGhpcy5pc0RhcmsoKTtcblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0cmdiLmNvbG9yW2ldID0gMjU1IC0gcmdiLmNvbG9yW2ldO1xuXHRcdH1cblx0XHRyZXR1cm4gcmdiO1xuXHR9LFxuXG5cdGxpZ2h0ZW46IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHZhciBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdGhzbC5jb2xvclsyXSArPSBoc2wuY29sb3JbMl0gKiByYXRpbztcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdGRhcmtlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0aHNsLmNvbG9yWzJdIC09IGhzbC5jb2xvclsyXSAqIHJhdGlvO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0c2F0dXJhdGU6IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHZhciBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdGhzbC5jb2xvclsxXSArPSBoc2wuY29sb3JbMV0gKiByYXRpbztcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdGRlc2F0dXJhdGU6IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHZhciBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdGhzbC5jb2xvclsxXSAtPSBoc2wuY29sb3JbMV0gKiByYXRpbztcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdHdoaXRlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGh3YiA9IHRoaXMuaHdiKCk7XG5cdFx0aHdiLmNvbG9yWzFdICs9IGh3Yi5jb2xvclsxXSAqIHJhdGlvO1xuXHRcdHJldHVybiBod2I7XG5cdH0sXG5cblx0YmxhY2tlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGh3YiA9IHRoaXMuaHdiKCk7XG5cdFx0aHdiLmNvbG9yWzJdICs9IGh3Yi5jb2xvclsyXSAqIHJhdGlvO1xuXHRcdHJldHVybiBod2I7XG5cdH0sXG5cblx0Z3JheXNjYWxlOiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9HcmF5c2NhbGUjQ29udmVydGluZ19jb2xvcl90b19ncmF5c2NhbGVcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblx0XHR2YXIgdmFsID0gcmdiWzBdICogMC4zICsgcmdiWzFdICogMC41OSArIHJnYlsyXSAqIDAuMTE7XG5cdFx0cmV0dXJuIENvbG9yLnJnYih2YWwsIHZhbCwgdmFsKTtcblx0fSxcblxuXHRmYWRlOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHRyZXR1cm4gdGhpcy5hbHBoYSh0aGlzLnZhbHBoYSAtICh0aGlzLnZhbHBoYSAqIHJhdGlvKSk7XG5cdH0sXG5cblx0b3BhcXVlcjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWxwaGEodGhpcy52YWxwaGEgKyAodGhpcy52YWxwaGEgKiByYXRpbykpO1xuXHR9LFxuXG5cdHJvdGF0ZTogZnVuY3Rpb24gKGRlZ3JlZXMpIHtcblx0XHR2YXIgaHNsID0gdGhpcy5oc2woKTtcblx0XHR2YXIgaHVlID0gaHNsLmNvbG9yWzBdO1xuXHRcdGh1ZSA9IChodWUgKyBkZWdyZWVzKSAlIDM2MDtcblx0XHRodWUgPSBodWUgPCAwID8gMzYwICsgaHVlIDogaHVlO1xuXHRcdGhzbC5jb2xvclswXSA9IGh1ZTtcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdG1peDogZnVuY3Rpb24gKG1peGluQ29sb3IsIHdlaWdodCkge1xuXHRcdC8vIHBvcnRlZCBmcm9tIHNhc3MgaW1wbGVtZW50YXRpb24gaW4gQ1xuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zYXNzL2xpYnNhc3MvYmxvYi8wZTZiNGEyODUwMDkyMzU2YWEzZWNlMDdjNmIyNDlmMDIyMWNhY2VkL2Z1bmN0aW9ucy5jcHAjTDIwOVxuXHRcdGlmICghbWl4aW5Db2xvciB8fCAhbWl4aW5Db2xvci5yZ2IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignQXJndW1lbnQgdG8gXCJtaXhcIiB3YXMgbm90IGEgQ29sb3IgaW5zdGFuY2UsIGJ1dCByYXRoZXIgYW4gaW5zdGFuY2Ugb2YgJyArIHR5cGVvZiBtaXhpbkNvbG9yKTtcblx0XHR9XG5cdFx0dmFyIGNvbG9yMSA9IG1peGluQ29sb3IucmdiKCk7XG5cdFx0dmFyIGNvbG9yMiA9IHRoaXMucmdiKCk7XG5cdFx0dmFyIHAgPSB3ZWlnaHQgPT09IHVuZGVmaW5lZCA/IDAuNSA6IHdlaWdodDtcblxuXHRcdHZhciB3ID0gMiAqIHAgLSAxO1xuXHRcdHZhciBhID0gY29sb3IxLmFscGhhKCkgLSBjb2xvcjIuYWxwaGEoKTtcblxuXHRcdHZhciB3MSA9ICgoKHcgKiBhID09PSAtMSkgPyB3IDogKHcgKyBhKSAvICgxICsgdyAqIGEpKSArIDEpIC8gMi4wO1xuXHRcdHZhciB3MiA9IDEgLSB3MTtcblxuXHRcdHJldHVybiBDb2xvci5yZ2IoXG5cdFx0XHRcdHcxICogY29sb3IxLnJlZCgpICsgdzIgKiBjb2xvcjIucmVkKCksXG5cdFx0XHRcdHcxICogY29sb3IxLmdyZWVuKCkgKyB3MiAqIGNvbG9yMi5ncmVlbigpLFxuXHRcdFx0XHR3MSAqIGNvbG9yMS5ibHVlKCkgKyB3MiAqIGNvbG9yMi5ibHVlKCksXG5cdFx0XHRcdGNvbG9yMS5hbHBoYSgpICogcCArIGNvbG9yMi5hbHBoYSgpICogKDEgLSBwKSk7XG5cdH1cbn07XG5cbi8vIG1vZGVsIGNvbnZlcnNpb24gbWV0aG9kcyBhbmQgc3RhdGljIGNvbnN0cnVjdG9yc1xuT2JqZWN0LmtleXMoY29udmVydCkuZm9yRWFjaChmdW5jdGlvbiAobW9kZWwpIHtcblx0aWYgKHNraXBwZWRNb2RlbHMuaW5kZXhPZihtb2RlbCkgIT09IC0xKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dmFyIGNoYW5uZWxzID0gY29udmVydFttb2RlbF0uY2hhbm5lbHM7XG5cblx0Ly8gY29udmVyc2lvbiBtZXRob2RzXG5cdENvbG9yLnByb3RvdHlwZVttb2RlbF0gPSBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwgPT09IG1vZGVsKSB7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKHRoaXMpO1xuXHRcdH1cblxuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKGFyZ3VtZW50cywgbW9kZWwpO1xuXHRcdH1cblxuXHRcdHZhciBuZXdBbHBoYSA9IHR5cGVvZiBhcmd1bWVudHNbY2hhbm5lbHNdID09PSAnbnVtYmVyJyA/IGNoYW5uZWxzIDogdGhpcy52YWxwaGE7XG5cdFx0cmV0dXJuIG5ldyBDb2xvcihhc3NlcnRBcnJheShjb252ZXJ0W3RoaXMubW9kZWxdW21vZGVsXS5yYXcodGhpcy5jb2xvcikpLmNvbmNhdChuZXdBbHBoYSksIG1vZGVsKTtcblx0fTtcblxuXHQvLyAnc3RhdGljJyBjb25zdHJ1Y3Rpb24gbWV0aG9kc1xuXHRDb2xvclttb2RlbF0gPSBmdW5jdGlvbiAoY29sb3IpIHtcblx0XHRpZiAodHlwZW9mIGNvbG9yID09PSAnbnVtYmVyJykge1xuXHRcdFx0Y29sb3IgPSB6ZXJvQXJyYXkoX3NsaWNlLmNhbGwoYXJndW1lbnRzKSwgY2hhbm5lbHMpO1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3IENvbG9yKGNvbG9yLCBtb2RlbCk7XG5cdH07XG59KTtcblxuZnVuY3Rpb24gcm91bmRUbyhudW0sIHBsYWNlcykge1xuXHRyZXR1cm4gTnVtYmVyKG51bS50b0ZpeGVkKHBsYWNlcykpO1xufVxuXG5mdW5jdGlvbiByb3VuZFRvUGxhY2UocGxhY2VzKSB7XG5cdHJldHVybiBmdW5jdGlvbiAobnVtKSB7XG5cdFx0cmV0dXJuIHJvdW5kVG8obnVtLCBwbGFjZXMpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiBnZXRzZXQobW9kZWwsIGNoYW5uZWwsIG1vZGlmaWVyKSB7XG5cdG1vZGVsID0gQXJyYXkuaXNBcnJheShtb2RlbCkgPyBtb2RlbCA6IFttb2RlbF07XG5cblx0bW9kZWwuZm9yRWFjaChmdW5jdGlvbiAobSkge1xuXHRcdChsaW1pdGVyc1ttXSB8fCAobGltaXRlcnNbbV0gPSBbXSkpW2NoYW5uZWxdID0gbW9kaWZpZXI7XG5cdH0pO1xuXG5cdG1vZGVsID0gbW9kZWxbMF07XG5cblx0cmV0dXJuIGZ1bmN0aW9uICh2YWwpIHtcblx0XHR2YXIgcmVzdWx0O1xuXG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdGlmIChtb2RpZmllcikge1xuXHRcdFx0XHR2YWwgPSBtb2RpZmllcih2YWwpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHQgPSB0aGlzW21vZGVsXSgpO1xuXHRcdFx0cmVzdWx0LmNvbG9yW2NoYW5uZWxdID0gdmFsO1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRyZXN1bHQgPSB0aGlzW21vZGVsXSgpLmNvbG9yW2NoYW5uZWxdO1xuXHRcdGlmIChtb2RpZmllcikge1xuXHRcdFx0cmVzdWx0ID0gbW9kaWZpZXIocmVzdWx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xufVxuXG5mdW5jdGlvbiBtYXhmbihtYXgpIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh2KSB7XG5cdFx0cmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKG1heCwgdikpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiBhc3NlcnRBcnJheSh2YWwpIHtcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbCA6IFt2YWxdO1xufVxuXG5mdW5jdGlvbiB6ZXJvQXJyYXkoYXJyLCBsZW5ndGgpIHtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuXHRcdGlmICh0eXBlb2YgYXJyW2ldICE9PSAnbnVtYmVyJykge1xuXHRcdFx0YXJyW2ldID0gMDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbG9yO1xuIiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwibGF5b3V0LWJhc2VcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW1wibGF5b3V0LWJhc2VcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiY29zZUJhc2VcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJsYXlvdXQtYmFzZVwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiY29zZUJhc2VcIl0gPSBmYWN0b3J5KHJvb3RbXCJsYXlvdXRCYXNlXCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzU1MV9fKSB7XG5yZXR1cm4gLyoqKioqKi8gKCgpID0+IHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHRcInVzZSBzdHJpY3RcIjtcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVzX18gPSAoe1xuXG4vKioqLyA0NTpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBjb3NlQmFzZSA9IHt9O1xuXG5jb3NlQmFzZS5sYXlvdXRCYXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpO1xuY29zZUJhc2UuQ29TRUNvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oODA2KTtcbmNvc2VCYXNlLkNvU0VFZGdlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NjcpO1xuY29zZUJhc2UuQ29TRUdyYXBoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4ODApO1xuY29zZUJhc2UuQ29TRUdyYXBoTWFuYWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oNTc4KTtcbmNvc2VCYXNlLkNvU0VMYXlvdXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2NSk7XG5jb3NlQmFzZS5Db1NFTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oOTkxKTtcbmNvc2VCYXNlLkNvbnN0cmFpbnRIYW5kbGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MDIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvc2VCYXNlO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gODA2OlxuLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4ge1xuXG5cblxudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkZETGF5b3V0Q29uc3RhbnRzO1xuXG5mdW5jdGlvbiBDb1NFQ29uc3RhbnRzKCkge31cblxuLy9Db1NFQ29uc3RhbnRzIGluaGVyaXRzIHN0YXRpYyBwcm9wcyBpbiBGRExheW91dENvbnN0YW50c1xuZm9yICh2YXIgcHJvcCBpbiBGRExheW91dENvbnN0YW50cykge1xuICBDb1NFQ29uc3RhbnRzW3Byb3BdID0gRkRMYXlvdXRDb25zdGFudHNbcHJvcF07XG59XG5cbkNvU0VDb25zdGFudHMuREVGQVVMVF9VU0VfTVVMVElfTEVWRUxfU0NBTElORyA9IGZhbHNlO1xuQ29TRUNvbnN0YW50cy5ERUZBVUxUX1JBRElBTF9TRVBBUkFUSU9OID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSDtcbkNvU0VDb25zdGFudHMuREVGQVVMVF9DT01QT05FTlRfU0VQRVJBVElPTiA9IDYwO1xuQ29TRUNvbnN0YW50cy5USUxFID0gdHJ1ZTtcbkNvU0VDb25zdGFudHMuVElMSU5HX1BBRERJTkdfVkVSVElDQUwgPSAxMDtcbkNvU0VDb25zdGFudHMuVElMSU5HX1BBRERJTkdfSE9SSVpPTlRBTCA9IDEwO1xuQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyA9IHRydWU7XG5Db1NFQ29uc3RhbnRzLkVORk9SQ0VfQ09OU1RSQUlOVFMgPSB0cnVlO1xuQ29TRUNvbnN0YW50cy5BUFBMWV9MQVlPVVQgPSB0cnVlO1xuQ29TRUNvbnN0YW50cy5SRUxBWF9NT1ZFTUVOVF9PTl9DT05TVFJBSU5UUyA9IHRydWU7XG5Db1NFQ29uc3RhbnRzLlRSRUVfUkVEVUNUSU9OX09OX0lOQ1JFTUVOVEFMID0gdHJ1ZTsgLy8gdGhpcyBzaG91bGQgYmUgc2V0IHRvIGZhbHNlIGlmIHRoZXJlIHdpbGwgYmUgYSBjb25zdHJhaW50XG4vLyBUaGlzIGNvbnN0YW50IGlzIGZvciBkaWZmZXJlbnRpYXRpbmcgd2hldGhlciBhY3R1YWwgbGF5b3V0IGFsZ29yaXRobSB0aGF0IHVzZXMgY29zZS1iYXNlIHdhbnRzIHRvIGFwcGx5IG9ubHkgaW5jcmVtZW50YWwgbGF5b3V0IG9yIFxuLy8gYW4gaW5jcmVtZW50YWwgbGF5b3V0IG9uIHRvcCBvZiBhIHJhbmRvbWl6ZWQgbGF5b3V0LiBJZiBpdCBpcyBvbmx5IGluY3JlbWVudGFsIGxheW91dCwgdGhlbiB0aGlzIGNvbnN0YW50IHNob3VsZCBiZSB0cnVlLlxuQ29TRUNvbnN0YW50cy5QVVJFX0lOQ1JFTUVOVEFMID0gQ29TRUNvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvU0VDb25zdGFudHM7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA3Njc6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgRkRMYXlvdXRFZGdlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkZETGF5b3V0RWRnZTtcblxuZnVuY3Rpb24gQ29TRUVkZ2Uoc291cmNlLCB0YXJnZXQsIHZFZGdlKSB7XG4gIEZETGF5b3V0RWRnZS5jYWxsKHRoaXMsIHNvdXJjZSwgdGFyZ2V0LCB2RWRnZSk7XG59XG5cbkNvU0VFZGdlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRkRMYXlvdXRFZGdlLnByb3RvdHlwZSk7XG5mb3IgKHZhciBwcm9wIGluIEZETGF5b3V0RWRnZSkge1xuICBDb1NFRWRnZVtwcm9wXSA9IEZETGF5b3V0RWRnZVtwcm9wXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDb1NFRWRnZTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDg4MDpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBMR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuTEdyYXBoO1xuXG5mdW5jdGlvbiBDb1NFR3JhcGgocGFyZW50LCBncmFwaE1nciwgdkdyYXBoKSB7XG4gIExHcmFwaC5jYWxsKHRoaXMsIHBhcmVudCwgZ3JhcGhNZ3IsIHZHcmFwaCk7XG59XG5cbkNvU0VHcmFwaC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKExHcmFwaC5wcm90b3R5cGUpO1xuZm9yICh2YXIgcHJvcCBpbiBMR3JhcGgpIHtcbiAgQ29TRUdyYXBoW3Byb3BdID0gTEdyYXBoW3Byb3BdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvU0VHcmFwaDtcblxuLyoqKi8gfSksXG5cbi8qKiovIDU3ODpcbi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHtcblxuXG5cbnZhciBMR3JhcGhNYW5hZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkxHcmFwaE1hbmFnZXI7XG5cbmZ1bmN0aW9uIENvU0VHcmFwaE1hbmFnZXIobGF5b3V0KSB7XG4gIExHcmFwaE1hbmFnZXIuY2FsbCh0aGlzLCBsYXlvdXQpO1xufVxuXG5Db1NFR3JhcGhNYW5hZ2VyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTEdyYXBoTWFuYWdlci5wcm90b3R5cGUpO1xuZm9yICh2YXIgcHJvcCBpbiBMR3JhcGhNYW5hZ2VyKSB7XG4gIENvU0VHcmFwaE1hbmFnZXJbcHJvcF0gPSBMR3JhcGhNYW5hZ2VyW3Byb3BdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvU0VHcmFwaE1hbmFnZXI7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA3NjU6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgRkRMYXlvdXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuRkRMYXlvdXQ7XG52YXIgQ29TRUdyYXBoTWFuYWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oNTc4KTtcbnZhciBDb1NFR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg4MCk7XG52YXIgQ29TRU5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5MSk7XG52YXIgQ29TRUVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2Nyk7XG52YXIgQ29TRUNvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oODA2KTtcbnZhciBDb25zdHJhaW50SGFuZGxlciA9IF9fd2VicGFja19yZXF1aXJlX18oOTAyKTtcbnZhciBGRExheW91dENvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5GRExheW91dENvbnN0YW50cztcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuTGF5b3V0Q29uc3RhbnRzO1xudmFyIFBvaW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLlBvaW50O1xudmFyIFBvaW50RCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5Qb2ludEQ7XG52YXIgRGltZW5zaW9uRCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5EaW1lbnNpb25EO1xudmFyIExheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5MYXlvdXQ7XG52YXIgSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5JbnRlZ2VyO1xudmFyIElHZW9tZXRyeSA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5JR2VvbWV0cnk7XG52YXIgTEdyYXBoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkxHcmFwaDtcbnZhciBUcmFuc2Zvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuVHJhbnNmb3JtO1xudmFyIExpbmtlZExpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1MSkuTGlua2VkTGlzdDtcblxuZnVuY3Rpb24gQ29TRUxheW91dCgpIHtcbiAgRkRMYXlvdXQuY2FsbCh0aGlzKTtcblxuICB0aGlzLnRvQmVUaWxlZCA9IHt9OyAvLyBNZW1vcml6ZSBpZiBhIG5vZGUgaXMgdG8gYmUgdGlsZWQgb3IgaXMgdGlsZWRcbiAgdGhpcy5jb25zdHJhaW50cyA9IHt9OyAvLyBrZWVwIGxheW91dCBjb25zdHJhaW50c1xufVxuXG5Db1NFTGF5b3V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRkRMYXlvdXQucHJvdG90eXBlKTtcblxuZm9yICh2YXIgcHJvcCBpbiBGRExheW91dCkge1xuICBDb1NFTGF5b3V0W3Byb3BdID0gRkRMYXlvdXRbcHJvcF07XG59XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLm5ld0dyYXBoTWFuYWdlciA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGdtID0gbmV3IENvU0VHcmFwaE1hbmFnZXIodGhpcyk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyID0gZ207XG4gIHJldHVybiBnbTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLm5ld0dyYXBoID0gZnVuY3Rpb24gKHZHcmFwaCkge1xuICByZXR1cm4gbmV3IENvU0VHcmFwaChudWxsLCB0aGlzLmdyYXBoTWFuYWdlciwgdkdyYXBoKTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLm5ld05vZGUgPSBmdW5jdGlvbiAodk5vZGUpIHtcbiAgcmV0dXJuIG5ldyBDb1NFTm9kZSh0aGlzLmdyYXBoTWFuYWdlciwgdk5vZGUpO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUubmV3RWRnZSA9IGZ1bmN0aW9uICh2RWRnZSkge1xuICByZXR1cm4gbmV3IENvU0VFZGdlKG51bGwsIG51bGwsIHZFZGdlKTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmluaXRQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkge1xuICBGRExheW91dC5wcm90b3R5cGUuaW5pdFBhcmFtZXRlcnMuY2FsbCh0aGlzLCBhcmd1bWVudHMpO1xuICBpZiAoIXRoaXMuaXNTdWJMYXlvdXQpIHtcbiAgICBpZiAoQ29TRUNvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIDwgMTApIHtcbiAgICAgIHRoaXMuaWRlYWxFZGdlTGVuZ3RoID0gMTA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaWRlYWxFZGdlTGVuZ3RoID0gQ29TRUNvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIO1xuICAgIH1cblxuICAgIHRoaXMudXNlU21hcnRJZGVhbEVkZ2VMZW5ndGhDYWxjdWxhdGlvbiA9IENvU0VDb25zdGFudHMuREVGQVVMVF9VU0VfU01BUlRfSURFQUxfRURHRV9MRU5HVEhfQ0FMQ1VMQVRJT047XG4gICAgdGhpcy5ncmF2aXR5Q29uc3RhbnQgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVZJVFlfU1RSRU5HVEg7XG4gICAgdGhpcy5jb21wb3VuZEdyYXZpdHlDb25zdGFudCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9TVFJFTkdUSDtcbiAgICB0aGlzLmdyYXZpdHlSYW5nZUZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9SQU5HRV9GQUNUT1I7XG4gICAgdGhpcy5jb21wb3VuZEdyYXZpdHlSYW5nZUZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9SQU5HRV9GQUNUT1I7XG5cbiAgICAvLyB2YXJpYWJsZXMgZm9yIHRyZWUgcmVkdWN0aW9uIHN1cHBvcnRcbiAgICB0aGlzLnBydW5lZE5vZGVzQWxsID0gW107XG4gICAgdGhpcy5ncm93VHJlZUl0ZXJhdGlvbnMgPSAwO1xuICAgIHRoaXMuYWZ0ZXJHcm93dGhJdGVyYXRpb25zID0gMDtcbiAgICB0aGlzLmlzVHJlZUdyb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmlzR3Jvd3RoRmluaXNoZWQgPSBmYWxzZTtcbiAgfVxufTtcblxuLy8gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzZXQgQ29TRSByZWxhdGVkIHBhcmFtZXRlcnMgdXNlZCBieSBzcHJpbmcgZW1iZWRkZXIuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5pbml0U3ByaW5nRW1iZWRkZXIgPSBmdW5jdGlvbiAoKSB7XG4gIEZETGF5b3V0LnByb3RvdHlwZS5pbml0U3ByaW5nRW1iZWRkZXIuY2FsbCh0aGlzKTtcblxuICAvLyB2YXJpYWJsZXMgZm9yIGNvb2xpbmdcbiAgdGhpcy5jb29saW5nQ3ljbGUgPSAwO1xuICB0aGlzLm1heENvb2xpbmdDeWNsZSA9IHRoaXMubWF4SXRlcmF0aW9ucyAvIEZETGF5b3V0Q29uc3RhbnRzLkNPTlZFUkdFTkNFX0NIRUNLX1BFUklPRDtcbiAgdGhpcy5maW5hbFRlbXBlcmF0dXJlID0gMC4wNDtcbiAgdGhpcy5jb29saW5nQWRqdXN0ZXIgPSAxO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUubGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY3JlYXRlQmVuZHNBc05lZWRlZCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0NSRUFURV9CRU5EU19BU19ORUVERUQ7XG4gIGlmIChjcmVhdGVCZW5kc0FzTmVlZGVkKSB7XG4gICAgdGhpcy5jcmVhdGVCZW5kcG9pbnRzKCk7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxFZGdlcygpO1xuICB9XG5cbiAgdGhpcy5sZXZlbCA9IDA7XG4gIHJldHVybiB0aGlzLmNsYXNzaWNMYXlvdXQoKTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNsYXNzaWNMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMubm9kZXNXaXRoR3Jhdml0eSA9IHRoaXMuY2FsY3VsYXRlTm9kZXNUb0FwcGx5R3Jhdml0YXRpb25UbygpO1xuICB0aGlzLmdyYXBoTWFuYWdlci5zZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbih0aGlzLm5vZGVzV2l0aEdyYXZpdHkpO1xuICB0aGlzLmNhbGNOb09mQ2hpbGRyZW5Gb3JBbGxOb2RlcygpO1xuICB0aGlzLmdyYXBoTWFuYWdlci5jYWxjTG93ZXN0Q29tbW9uQW5jZXN0b3JzKCk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLmNhbGNJbmNsdXNpb25UcmVlRGVwdGhzKCk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS5jYWxjRXN0aW1hdGVkU2l6ZSgpO1xuICB0aGlzLmNhbGNJZGVhbEVkZ2VMZW5ndGhzKCk7XG5cbiAgaWYgKCF0aGlzLmluY3JlbWVudGFsKSB7XG4gICAgdmFyIGZvcmVzdCA9IHRoaXMuZ2V0RmxhdEZvcmVzdCgpO1xuXG4gICAgLy8gVGhlIGdyYXBoIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxheW91dCBpcyBmbGF0IGFuZCBhIGZvcmVzdFxuICAgIGlmIChmb3Jlc3QubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5wb3NpdGlvbk5vZGVzUmFkaWFsbHkoZm9yZXN0KTtcbiAgICB9XG4gICAgLy8gVGhlIGdyYXBoIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxheW91dCBpcyBub3QgZmxhdCBvciBhIGZvcmVzdFxuICAgIGVsc2Uge1xuICAgICAgICAvLyBSZWR1Y2UgdGhlIHRyZWVzIHdoZW4gaW5jcmVtZW50YWwgbW9kZSBpcyBub3QgZW5hYmxlZCBhbmQgZ3JhcGggaXMgbm90IGEgZm9yZXN0IFxuICAgICAgICB0aGlzLnJlZHVjZVRyZWVzKCk7XG4gICAgICAgIC8vIFVwZGF0ZSBub2RlcyB0aGF0IGdyYXZpdHkgd2lsbCBiZSBhcHBsaWVkXG4gICAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24oKTtcbiAgICAgICAgdmFyIGFsbE5vZGVzID0gbmV3IFNldCh0aGlzLmdldEFsbE5vZGVzKCkpO1xuICAgICAgICB2YXIgaW50ZXJzZWN0aW9uID0gdGhpcy5ub2Rlc1dpdGhHcmF2aXR5LmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICAgIHJldHVybiBhbGxOb2Rlcy5oYXMoeCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmdyYXBoTWFuYWdlci5zZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbihpbnRlcnNlY3Rpb24pO1xuXG4gICAgICAgIHRoaXMucG9zaXRpb25Ob2Rlc1JhbmRvbWx5KCk7XG4gICAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKENvU0VDb25zdGFudHMuVFJFRV9SRURVQ1RJT05fT05fSU5DUkVNRU5UQUwpIHtcbiAgICAgIC8vIFJlZHVjZSB0aGUgdHJlZXMgaW4gaW5jcmVtZW50YWwgbW9kZSBpZiBvbmx5IHRoaXMgY29uc3RhbnQgaXMgc2V0IHRvIHRydWUgXG4gICAgICB0aGlzLnJlZHVjZVRyZWVzKCk7XG4gICAgICAvLyBVcGRhdGUgbm9kZXMgdGhhdCBncmF2aXR5IHdpbGwgYmUgYXBwbGllZFxuICAgICAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbigpO1xuICAgICAgdmFyIGFsbE5vZGVzID0gbmV3IFNldCh0aGlzLmdldEFsbE5vZGVzKCkpO1xuICAgICAgdmFyIGludGVyc2VjdGlvbiA9IHRoaXMubm9kZXNXaXRoR3Jhdml0eS5maWx0ZXIoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIGFsbE5vZGVzLmhhcyh4KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ncmFwaE1hbmFnZXIuc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24oaW50ZXJzZWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXModGhpcy5jb25zdHJhaW50cykubGVuZ3RoID4gMCkge1xuICAgIENvbnN0cmFpbnRIYW5kbGVyLmhhbmRsZUNvbnN0cmFpbnRzKHRoaXMpO1xuICAgIHRoaXMuaW5pdENvbnN0cmFpbnRWYXJpYWJsZXMoKTtcbiAgfVxuXG4gIHRoaXMuaW5pdFNwcmluZ0VtYmVkZGVyKCk7XG4gIGlmIChDb1NFQ29uc3RhbnRzLkFQUExZX0xBWU9VVCkge1xuICAgIHRoaXMucnVuU3ByaW5nRW1iZWRkZXIoKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUudGljayA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy50b3RhbEl0ZXJhdGlvbnMrKztcblxuICBpZiAodGhpcy50b3RhbEl0ZXJhdGlvbnMgPT09IHRoaXMubWF4SXRlcmF0aW9ucyAmJiAhdGhpcy5pc1RyZWVHcm93aW5nICYmICF0aGlzLmlzR3Jvd3RoRmluaXNoZWQpIHtcbiAgICBpZiAodGhpcy5wcnVuZWROb2Rlc0FsbC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmlzVHJlZUdyb3dpbmcgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy50b3RhbEl0ZXJhdGlvbnMgJSBGRExheW91dENvbnN0YW50cy5DT05WRVJHRU5DRV9DSEVDS19QRVJJT0QgPT0gMCAmJiAhdGhpcy5pc1RyZWVHcm93aW5nICYmICF0aGlzLmlzR3Jvd3RoRmluaXNoZWQpIHtcbiAgICBpZiAodGhpcy5pc0NvbnZlcmdlZCgpKSB7XG4gICAgICBpZiAodGhpcy5wcnVuZWROb2Rlc0FsbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuaXNUcmVlR3Jvd2luZyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvb2xpbmdDeWNsZSsrO1xuXG4gICAgaWYgKHRoaXMubGF5b3V0UXVhbGl0eSA9PSAwKSB7XG4gICAgICAvLyBxdWFsaXR5IC0gXCJkcmFmdFwiXG4gICAgICB0aGlzLmNvb2xpbmdBZGp1c3RlciA9IHRoaXMuY29vbGluZ0N5Y2xlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5sYXlvdXRRdWFsaXR5ID09IDEpIHtcbiAgICAgIC8vIHF1YWxpdHkgLSBcImRlZmF1bHRcIlxuICAgICAgdGhpcy5jb29saW5nQWRqdXN0ZXIgPSB0aGlzLmNvb2xpbmdDeWNsZSAvIDM7XG4gICAgfVxuXG4gICAgLy8gY29vbGluZyBzY2hlZHVsZSBpcyBiYXNlZCBvbiBodHRwOi8vd3d3LmJ0bHVrZS5jb20vc2ltYW5mMS5odG1sIC0+IGNvb2xpbmcgc2NoZWR1bGUgM1xuICAgIHRoaXMuY29vbGluZ0ZhY3RvciA9IE1hdGgubWF4KHRoaXMuaW5pdGlhbENvb2xpbmdGYWN0b3IgLSBNYXRoLnBvdyh0aGlzLmNvb2xpbmdDeWNsZSwgTWF0aC5sb2coMTAwICogKHRoaXMuaW5pdGlhbENvb2xpbmdGYWN0b3IgLSB0aGlzLmZpbmFsVGVtcGVyYXR1cmUpKSAvIE1hdGgubG9nKHRoaXMubWF4Q29vbGluZ0N5Y2xlKSkgLyAxMDAgKiB0aGlzLmNvb2xpbmdBZGp1c3RlciwgdGhpcy5maW5hbFRlbXBlcmF0dXJlKTtcbiAgICB0aGlzLmFuaW1hdGlvblBlcmlvZCA9IE1hdGguY2VpbCh0aGlzLmluaXRpYWxBbmltYXRpb25QZXJpb2QgKiBNYXRoLnNxcnQodGhpcy5jb29saW5nRmFjdG9yKSk7XG4gIH1cbiAgLy8gT3BlcmF0aW9ucyB3aGlsZSB0cmVlIGlzIGdyb3dpbmcgYWdhaW4gXG4gIGlmICh0aGlzLmlzVHJlZUdyb3dpbmcpIHtcbiAgICBpZiAodGhpcy5ncm93VHJlZUl0ZXJhdGlvbnMgJSAxMCA9PSAwKSB7XG4gICAgICBpZiAodGhpcy5wcnVuZWROb2Rlc0FsbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnVwZGF0ZUJvdW5kcygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUdyaWQoKTtcbiAgICAgICAgdGhpcy5ncm93VHJlZSh0aGlzLnBydW5lZE5vZGVzQWxsKTtcbiAgICAgICAgLy8gVXBkYXRlIG5vZGVzIHRoYXQgZ3Jhdml0eSB3aWxsIGJlIGFwcGxpZWRcbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbigpO1xuICAgICAgICB2YXIgYWxsTm9kZXMgPSBuZXcgU2V0KHRoaXMuZ2V0QWxsTm9kZXMoKSk7XG4gICAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSB0aGlzLm5vZGVzV2l0aEdyYXZpdHkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgcmV0dXJuIGFsbE5vZGVzLmhhcyh4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKGludGVyc2VjdGlvbik7XG5cbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIudXBkYXRlQm91bmRzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlR3JpZCgpO1xuICAgICAgICBpZiAoQ29TRUNvbnN0YW50cy5QVVJFX0lOQ1JFTUVOVEFMKSB0aGlzLmNvb2xpbmdGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMIC8gMjtlbHNlIHRoaXMuY29vbGluZ0ZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09PTElOR19GQUNUT1JfSU5DUkVNRU5UQUw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzVHJlZUdyb3dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0dyb3d0aEZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5ncm93VHJlZUl0ZXJhdGlvbnMrKztcbiAgfVxuICAvLyBPcGVyYXRpb25zIGFmdGVyIGdyb3d0aCBpcyBmaW5pc2hlZFxuICBpZiAodGhpcy5pc0dyb3d0aEZpbmlzaGVkKSB7XG4gICAgaWYgKHRoaXMuaXNDb252ZXJnZWQoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLmFmdGVyR3Jvd3RoSXRlcmF0aW9ucyAlIDEwID09IDApIHtcbiAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnVwZGF0ZUJvdW5kcygpO1xuICAgICAgdGhpcy51cGRhdGVHcmlkKCk7XG4gICAgfVxuICAgIGlmIChDb1NFQ29uc3RhbnRzLlBVUkVfSU5DUkVNRU5UQUwpIHRoaXMuY29vbGluZ0ZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09PTElOR19GQUNUT1JfSU5DUkVNRU5UQUwgLyAyICogKCgxMDAgLSB0aGlzLmFmdGVyR3Jvd3RoSXRlcmF0aW9ucykgLyAxMDApO2Vsc2UgdGhpcy5jb29saW5nRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCAqICgoMTAwIC0gdGhpcy5hZnRlckdyb3d0aEl0ZXJhdGlvbnMpIC8gMTAwKTtcbiAgICB0aGlzLmFmdGVyR3Jvd3RoSXRlcmF0aW9ucysrO1xuICB9XG5cbiAgdmFyIGdyaWRVcGRhdGVBbGxvd2VkID0gIXRoaXMuaXNUcmVlR3Jvd2luZyAmJiAhdGhpcy5pc0dyb3d0aEZpbmlzaGVkO1xuICB2YXIgZm9yY2VUb05vZGVTdXJyb3VuZGluZ1VwZGF0ZSA9IHRoaXMuZ3Jvd1RyZWVJdGVyYXRpb25zICUgMTAgPT0gMSAmJiB0aGlzLmlzVHJlZUdyb3dpbmcgfHwgdGhpcy5hZnRlckdyb3d0aEl0ZXJhdGlvbnMgJSAxMCA9PSAxICYmIHRoaXMuaXNHcm93dGhGaW5pc2hlZDtcblxuICB0aGlzLnRvdGFsRGlzcGxhY2VtZW50ID0gMDtcbiAgdGhpcy5ncmFwaE1hbmFnZXIudXBkYXRlQm91bmRzKCk7XG4gIHRoaXMuY2FsY1NwcmluZ0ZvcmNlcygpO1xuICB0aGlzLmNhbGNSZXB1bHNpb25Gb3JjZXMoZ3JpZFVwZGF0ZUFsbG93ZWQsIGZvcmNlVG9Ob2RlU3Vycm91bmRpbmdVcGRhdGUpO1xuICB0aGlzLmNhbGNHcmF2aXRhdGlvbmFsRm9yY2VzKCk7XG4gIHRoaXMubW92ZU5vZGVzKCk7XG4gIHRoaXMuYW5pbWF0ZSgpO1xuXG4gIHJldHVybiBmYWxzZTsgLy8gTGF5b3V0IGlzIG5vdCBlbmRlZCB5ZXQgcmV0dXJuIGZhbHNlXG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5nZXRQb3NpdGlvbnNEYXRhID0gZnVuY3Rpb24gKCkge1xuICB2YXIgYWxsTm9kZXMgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxOb2RlcygpO1xuICB2YXIgcERhdGEgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciByZWN0ID0gYWxsTm9kZXNbaV0ucmVjdDtcbiAgICB2YXIgaWQgPSBhbGxOb2Rlc1tpXS5pZDtcbiAgICBwRGF0YVtpZF0gPSB7XG4gICAgICBpZDogaWQsXG4gICAgICB4OiByZWN0LmdldENlbnRlclgoKSxcbiAgICAgIHk6IHJlY3QuZ2V0Q2VudGVyWSgpLFxuICAgICAgdzogcmVjdC53aWR0aCxcbiAgICAgIGg6IHJlY3QuaGVpZ2h0XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBwRGF0YTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnJ1blNwcmluZ0VtYmVkZGVyID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmluaXRpYWxBbmltYXRpb25QZXJpb2QgPSAyNTtcbiAgdGhpcy5hbmltYXRpb25QZXJpb2QgPSB0aGlzLmluaXRpYWxBbmltYXRpb25QZXJpb2Q7XG4gIHZhciBsYXlvdXRFbmRlZCA9IGZhbHNlO1xuXG4gIC8vIElmIGFtaW5hdGUgb3B0aW9uIGlzICdkdXJpbmcnIHNpZ25hbCB0aGF0IGxheW91dCBpcyBzdXBwb3NlZCB0byBzdGFydCBpdGVyYXRpbmdcbiAgaWYgKEZETGF5b3V0Q29uc3RhbnRzLkFOSU1BVEUgPT09ICdkdXJpbmcnKSB7XG4gICAgdGhpcy5lbWl0KCdsYXlvdXRzdGFydGVkJyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgYW1pbmF0ZSBvcHRpb24gaXMgJ2R1cmluZycgdGljaygpIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIG9uIGluZGV4LmpzXG4gICAgd2hpbGUgKCFsYXlvdXRFbmRlZCkge1xuICAgICAgbGF5b3V0RW5kZWQgPSB0aGlzLnRpY2soKTtcbiAgICB9XG5cbiAgICB0aGlzLmdyYXBoTWFuYWdlci51cGRhdGVCb3VuZHMoKTtcbiAgfVxufTtcblxuLy8gb3ZlcnJpZGVzIG1vdmVOb2RlcyBtZXRob2QgaW4gRkRMYXlvdXRcbkNvU0VMYXlvdXQucHJvdG90eXBlLm1vdmVOb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGxOb2RlcyA9IHRoaXMuZ2V0QWxsTm9kZXMoKTtcbiAgdmFyIG5vZGU7XG5cbiAgLy8gY2FsY3VsYXRlIGRpc3BsYWNlbWVudCBmb3IgZWFjaCBub2RlIFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIG5vZGUgPSBsTm9kZXNbaV07XG4gICAgbm9kZS5jYWxjdWxhdGVEaXNwbGFjZW1lbnQoKTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyh0aGlzLmNvbnN0cmFpbnRzKS5sZW5ndGggPiAwKSB7XG4gICAgdGhpcy51cGRhdGVEaXNwbGFjZW1lbnRzKCk7XG4gIH1cblxuICAvLyBtb3ZlIGVhY2ggbm9kZVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIG5vZGUgPSBsTm9kZXNbaV07XG4gICAgbm9kZS5tb3ZlKCk7XG4gIH1cbn07XG5cbi8vIGNvbnN0cmFpbnQgcmVsYXRlZCBtZXRob2RzOiBpbml0Q29uc3RyYWludFZhcmlhYmxlcyBhbmQgdXBkYXRlRGlzcGxhY2VtZW50c1xuXG4vLyBpbml0aWFsaXplIGNvbnN0cmFpbnQgcmVsYXRlZCB2YXJpYWJsZXNcbkNvU0VMYXlvdXQucHJvdG90eXBlLmluaXRDb25zdHJhaW50VmFyaWFibGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuaWRUb05vZGVNYXAgPSBuZXcgTWFwKCk7XG4gIHRoaXMuZml4ZWROb2RlU2V0ID0gbmV3IFNldCgpO1xuXG4gIHZhciBhbGxOb2RlcyA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbE5vZGVzKCk7XG5cbiAgLy8gZmlsbCBpZFRvTm9kZU1hcFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBhbGxOb2Rlc1tpXTtcbiAgICB0aGlzLmlkVG9Ob2RlTWFwLnNldChub2RlLmlkLCBub2RlKTtcbiAgfVxuXG4gIC8vIGNhbGN1bGF0ZSBmaXhlZCBub2RlIHdlaWdodCBmb3IgZ2l2ZW4gY29tcG91bmQgbm9kZVxuICB2YXIgY2FsY3VsYXRlQ29tcG91bmRXZWlnaHQgPSBmdW5jdGlvbiBjYWxjdWxhdGVDb21wb3VuZFdlaWdodChjb21wb3VuZE5vZGUpIHtcbiAgICB2YXIgbm9kZXMgPSBjb21wb3VuZE5vZGUuZ2V0Q2hpbGQoKS5nZXROb2RlcygpO1xuICAgIHZhciBub2RlO1xuICAgIHZhciBmaXhlZE5vZGVXZWlnaHQgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIGlmIChub2RlLmdldENoaWxkKCkgPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2VsZi5maXhlZE5vZGVTZXQuaGFzKG5vZGUuaWQpKSB7XG4gICAgICAgICAgZml4ZWROb2RlV2VpZ2h0ICs9IDEwMDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZml4ZWROb2RlV2VpZ2h0ICs9IGNhbGN1bGF0ZUNvbXBvdW5kV2VpZ2h0KG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZml4ZWROb2RlV2VpZ2h0O1xuICB9O1xuXG4gIGlmICh0aGlzLmNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQpIHtcbiAgICAvLyBmaWxsIGZpeGVkTm9kZVNldFxuICAgIHRoaXMuY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRGF0YSkge1xuICAgICAgc2VsZi5maXhlZE5vZGVTZXQuYWRkKG5vZGVEYXRhLm5vZGVJZCk7XG4gICAgfSk7XG5cbiAgICAvLyBhc3NpZ24gZml4ZWQgbm9kZSB3ZWlnaHRzIHRvIGNvbXBvdW5kcyBpZiB0aGV5IGNvbnRhaW4gZml4ZWQgbm9kZXNcbiAgICB2YXIgYWxsTm9kZXMgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxOb2RlcygpO1xuICAgIHZhciBub2RlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbm9kZSA9IGFsbE5vZGVzW2ldO1xuICAgICAgaWYgKG5vZGUuZ2V0Q2hpbGQoKSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBmaXhlZE5vZGVXZWlnaHQgPSBjYWxjdWxhdGVDb21wb3VuZFdlaWdodChub2RlKTtcbiAgICAgICAgaWYgKGZpeGVkTm9kZVdlaWdodCA+IDApIHtcbiAgICAgICAgICBub2RlLmZpeGVkTm9kZVdlaWdodCA9IGZpeGVkTm9kZVdlaWdodDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLmNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuICAgIHZhciBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgIHZhciBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZml4ZWROb2Rlc09uSG9yaXpvbnRhbCA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLmZpeGVkTm9kZXNPblZlcnRpY2FsID0gbmV3IFNldCgpO1xuXG4gICAgLy8gZmlsbCBtYXBzIGFuZCBzZXRzXG4gICAgdGhpcy5maXhlZE5vZGVTZXQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICBzZWxmLmZpeGVkTm9kZXNPbkhvcml6b250YWwuYWRkKG5vZGVJZCk7XG4gICAgICBzZWxmLmZpeGVkTm9kZXNPblZlcnRpY2FsLmFkZChub2RlSWQpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludCkge1xuICAgICAgaWYgKHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCkge1xuICAgICAgICB2YXIgdmVydGljYWxBbGlnbm1lbnQgPSB0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWw7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVydGljYWxBbGlnbm1lbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0aGlzLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuc2V0KFwiZHVtbXlcIiArIGksIFtdKTtcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWdubWVudFtpXS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuc2V0KG5vZGVJZCwgXCJkdW1teVwiICsgaSk7XG4gICAgICAgICAgICBzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KFwiZHVtbXlcIiArIGkpLnB1c2gobm9kZUlkKTtcbiAgICAgICAgICAgIGlmIChzZWxmLmZpeGVkTm9kZVNldC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgICBzZWxmLmZpeGVkTm9kZXNPbkhvcml6b250YWwuYWRkKFwiZHVtbXlcIiArIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWwpIHtcbiAgICAgICAgdmFyIGhvcml6b250YWxBbGlnbm1lbnQgPSB0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBob3Jpem9udGFsQWxpZ25tZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuc2V0KFwiZHVtbXlcIiArIGksIFtdKTtcbiAgICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50W2ldLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LnNldChub2RlSWQsIFwiZHVtbXlcIiArIGkpO1xuICAgICAgICAgICAgc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KFwiZHVtbXlcIiArIGkpLnB1c2gobm9kZUlkKTtcbiAgICAgICAgICAgIGlmIChzZWxmLmZpeGVkTm9kZVNldC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgICBzZWxmLmZpeGVkTm9kZXNPblZlcnRpY2FsLmFkZChcImR1bW15XCIgKyBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChDb1NFQ29uc3RhbnRzLlJFTEFYX01PVkVNRU5UX09OX0NPTlNUUkFJTlRTKSB7XG5cbiAgICAgIHRoaXMuc2h1ZmZsZSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICAgICAgICB2YXIgaiwgeCwgaTtcbiAgICAgICAgZm9yIChpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAyICogYXJyYXkubGVuZ3RoIC8gMzsgaS0tKSB7XG4gICAgICAgICAgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgICAgICAgIHggPSBhcnJheVtpXTtcbiAgICAgICAgICBhcnJheVtpXSA9IGFycmF5W2pdO1xuICAgICAgICAgIGFycmF5W2pdID0geDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLm5vZGVzSW5SZWxhdGl2ZUhvcml6b250YWwgPSBbXTtcbiAgICAgIHRoaXMubm9kZXNJblJlbGF0aXZlVmVydGljYWwgPSBbXTtcbiAgICAgIHRoaXMubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwSG9yaXpvbnRhbCA9IG5ldyBNYXAoKTtcbiAgICAgIHRoaXMubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwVmVydGljYWwgPSBuZXcgTWFwKCk7XG4gICAgICB0aGlzLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwgPSBuZXcgTWFwKCk7XG4gICAgICB0aGlzLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsID0gbmV3IE1hcCgpO1xuXG4gICAgICAvLyBmaWxsIGFycmF5cyBhbmQgbWFwc1xuICAgICAgdGhpcy5jb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICBpZiAoY29uc3RyYWludC5sZWZ0KSB7XG4gICAgICAgICAgdmFyIG5vZGVJZExlZnQgPSBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LmxlZnQpID8gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC5sZWZ0KSA6IGNvbnN0cmFpbnQubGVmdDtcbiAgICAgICAgICB2YXIgbm9kZUlkUmlnaHQgPSBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LnJpZ2h0KSA/IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGNvbnN0cmFpbnQucmlnaHQpIDogY29uc3RyYWludC5yaWdodDtcblxuICAgICAgICAgIGlmICghc2VsZi5ub2Rlc0luUmVsYXRpdmVIb3Jpem9udGFsLmluY2x1ZGVzKG5vZGVJZExlZnQpKSB7XG4gICAgICAgICAgICBzZWxmLm5vZGVzSW5SZWxhdGl2ZUhvcml6b250YWwucHVzaChub2RlSWRMZWZ0KTtcbiAgICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwSG9yaXpvbnRhbC5zZXQobm9kZUlkTGVmdCwgW10pO1xuICAgICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMobm9kZUlkTGVmdCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLnNldChub2RlSWRMZWZ0LCBzZWxmLmlkVG9Ob2RlTWFwLmdldChzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KG5vZGVJZExlZnQpWzBdKS5nZXRDZW50ZXJYKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLnNldChub2RlSWRMZWZ0LCBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWRMZWZ0KS5nZXRDZW50ZXJYKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXNlbGYubm9kZXNJblJlbGF0aXZlSG9yaXpvbnRhbC5pbmNsdWRlcyhub2RlSWRSaWdodCkpIHtcbiAgICAgICAgICAgIHNlbGYubm9kZXNJblJlbGF0aXZlSG9yaXpvbnRhbC5wdXNoKG5vZGVJZFJpZ2h0KTtcbiAgICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwSG9yaXpvbnRhbC5zZXQobm9kZUlkUmlnaHQsIFtdKTtcbiAgICAgICAgICAgIGlmIChzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKG5vZGVJZFJpZ2h0KSkge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuc2V0KG5vZGVJZFJpZ2h0LCBzZWxmLmlkVG9Ob2RlTWFwLmdldChzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KG5vZGVJZFJpZ2h0KVswXSkuZ2V0Q2VudGVyWCgpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5zZXQobm9kZUlkUmlnaHQsIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZFJpZ2h0KS5nZXRDZW50ZXJYKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwSG9yaXpvbnRhbC5nZXQobm9kZUlkTGVmdCkucHVzaCh7IHJpZ2h0OiBub2RlSWRSaWdodCwgZ2FwOiBjb25zdHJhaW50LmdhcCB9KTtcbiAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcEhvcml6b250YWwuZ2V0KG5vZGVJZFJpZ2h0KS5wdXNoKHsgbGVmdDogbm9kZUlkTGVmdCwgZ2FwOiBjb25zdHJhaW50LmdhcCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgbm9kZUlkVG9wID0gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LnRvcCkgPyBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGNvbnN0cmFpbnQudG9wKSA6IGNvbnN0cmFpbnQudG9wO1xuICAgICAgICAgIHZhciBub2RlSWRCb3R0b20gPSBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKGNvbnN0cmFpbnQuYm90dG9tKSA/IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoY29uc3RyYWludC5ib3R0b20pIDogY29uc3RyYWludC5ib3R0b207XG5cbiAgICAgICAgICBpZiAoIXNlbGYubm9kZXNJblJlbGF0aXZlVmVydGljYWwuaW5jbHVkZXMobm9kZUlkVG9wKSkge1xuICAgICAgICAgICAgc2VsZi5ub2Rlc0luUmVsYXRpdmVWZXJ0aWNhbC5wdXNoKG5vZGVJZFRvcCk7XG4gICAgICAgICAgICBzZWxmLm5vZGVUb1JlbGF0aXZlQ29uc3RyYWludE1hcFZlcnRpY2FsLnNldChub2RlSWRUb3AsIFtdKTtcbiAgICAgICAgICAgIGlmIChzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMobm9kZUlkVG9wKSkge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLnNldChub2RlSWRUb3AsIHNlbGYuaWRUb05vZGVNYXAuZ2V0KHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChub2RlSWRUb3ApWzBdKS5nZXRDZW50ZXJZKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5zZXQobm9kZUlkVG9wLCBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWRUb3ApLmdldENlbnRlclkoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc2VsZi5ub2Rlc0luUmVsYXRpdmVWZXJ0aWNhbC5pbmNsdWRlcyhub2RlSWRCb3R0b20pKSB7XG4gICAgICAgICAgICBzZWxmLm5vZGVzSW5SZWxhdGl2ZVZlcnRpY2FsLnB1c2gobm9kZUlkQm90dG9tKTtcbiAgICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwVmVydGljYWwuc2V0KG5vZGVJZEJvdHRvbSwgW10pO1xuICAgICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhub2RlSWRCb3R0b20pKSB7XG4gICAgICAgICAgICAgIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuc2V0KG5vZGVJZEJvdHRvbSwgc2VsZi5pZFRvTm9kZU1hcC5nZXQoc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KG5vZGVJZEJvdHRvbSlbMF0pLmdldENlbnRlclkoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLnNldChub2RlSWRCb3R0b20sIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZEJvdHRvbSkuZ2V0Q2VudGVyWSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBWZXJ0aWNhbC5nZXQobm9kZUlkVG9wKS5wdXNoKHsgYm90dG9tOiBub2RlSWRCb3R0b20sIGdhcDogY29uc3RyYWludC5nYXAgfSk7XG4gICAgICAgICAgc2VsZi5ub2RlVG9SZWxhdGl2ZUNvbnN0cmFpbnRNYXBWZXJ0aWNhbC5nZXQobm9kZUlkQm90dG9tKS5wdXNoKHsgdG9wOiBub2RlSWRUb3AsIGdhcDogY29uc3RyYWludC5nYXAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc3ViR3JhcGhPbkhvcml6b250YWwgPSBuZXcgTWFwKCk7IC8vIHN1YmdyYXBoIGZyb20gdmVydGljYWwgUlAgY29uc3RyYWludHNcbiAgICAgIHZhciBzdWJHcmFwaE9uVmVydGljYWwgPSBuZXcgTWFwKCk7IC8vIHN1YmdyYXBoIGZyb20gdmVydGljYWwgUlAgY29uc3RyYWludHNcblxuICAgICAgLy8gY29uc3RydWN0IHN1YmdyYXBocyBmcm9tIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50cyBcbiAgICAgIHRoaXMuY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgaWYgKGNvbnN0cmFpbnQubGVmdCkge1xuICAgICAgICAgIHZhciBsZWZ0ID0gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMoY29uc3RyYWludC5sZWZ0KSA/IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGNvbnN0cmFpbnQubGVmdCkgOiBjb25zdHJhaW50LmxlZnQ7XG4gICAgICAgICAgdmFyIHJpZ2h0ID0gbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMoY29uc3RyYWludC5yaWdodCkgPyBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChjb25zdHJhaW50LnJpZ2h0KSA6IGNvbnN0cmFpbnQucmlnaHQ7XG4gICAgICAgICAgaWYgKHN1YkdyYXBoT25Ib3Jpem9udGFsLmhhcyhsZWZ0KSkge1xuICAgICAgICAgICAgc3ViR3JhcGhPbkhvcml6b250YWwuZ2V0KGxlZnQpLnB1c2gocmlnaHQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJHcmFwaE9uSG9yaXpvbnRhbC5zZXQobGVmdCwgW3JpZ2h0XSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdWJHcmFwaE9uSG9yaXpvbnRhbC5oYXMocmlnaHQpKSB7XG4gICAgICAgICAgICBzdWJHcmFwaE9uSG9yaXpvbnRhbC5nZXQocmlnaHQpLnB1c2gobGVmdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YkdyYXBoT25Ib3Jpem9udGFsLnNldChyaWdodCwgW2xlZnRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHRvcCA9IG5vZGVUb0R1bW15Rm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMoY29uc3RyYWludC50b3ApID8gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChjb25zdHJhaW50LnRvcCkgOiBjb25zdHJhaW50LnRvcDtcbiAgICAgICAgICB2YXIgYm90dG9tID0gbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhjb25zdHJhaW50LmJvdHRvbSkgPyBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGNvbnN0cmFpbnQuYm90dG9tKSA6IGNvbnN0cmFpbnQuYm90dG9tO1xuICAgICAgICAgIGlmIChzdWJHcmFwaE9uVmVydGljYWwuaGFzKHRvcCkpIHtcbiAgICAgICAgICAgIHN1YkdyYXBoT25WZXJ0aWNhbC5nZXQodG9wKS5wdXNoKGJvdHRvbSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YkdyYXBoT25WZXJ0aWNhbC5zZXQodG9wLCBbYm90dG9tXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdWJHcmFwaE9uVmVydGljYWwuaGFzKGJvdHRvbSkpIHtcbiAgICAgICAgICAgIHN1YkdyYXBoT25WZXJ0aWNhbC5nZXQoYm90dG9tKS5wdXNoKHRvcCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YkdyYXBoT25WZXJ0aWNhbC5zZXQoYm90dG9tLCBbdG9wXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gZnVuY3Rpb24gdG8gY29uc3RydWN0IGNvbXBvbmVudHMgZnJvbSBhIGdpdmVuIGdyYXBoIFxuICAgICAgLy8gYWxzbyByZXR1cm5zIGFuIGFycmF5IHRoYXQga2VlcHMgd2hldGhlciBlYWNoIGNvbXBvbmVudCBjb250YWlucyBmaXhlZCBub2RlXG4gICAgICB2YXIgY29uc3RydWN0Q29tcG9uZW50cyA9IGZ1bmN0aW9uIGNvbnN0cnVjdENvbXBvbmVudHMoZ3JhcGgsIGZpeGVkTm9kZXMpIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgdmFyIGlzRml4ZWQgPSBbXTtcbiAgICAgICAgdmFyIHF1ZXVlID0gbmV3IExpbmtlZExpc3QoKTtcbiAgICAgICAgdmFyIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgIHZhciBjb3VudCA9IDA7XG5cbiAgICAgICAgZ3JhcGguZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgY29tcG9uZW50c1tjb3VudF0gPSBbXTtcbiAgICAgICAgICAgIGlzRml4ZWRbY291bnRdID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgY3VycmVudE5vZGUgPSBrZXk7XG4gICAgICAgICAgICBxdWV1ZS5wdXNoKGN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgIHZpc2l0ZWQuYWRkKGN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHNbY291bnRdLnB1c2goY3VycmVudE5vZGUpO1xuXG4gICAgICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICBpZiAoZml4ZWROb2Rlcy5oYXMoY3VycmVudE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgaXNGaXhlZFtjb3VudF0gPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciBuZWlnaGJvcnMgPSBncmFwaC5nZXQoY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgICBuZWlnaGJvcnMuZm9yRWFjaChmdW5jdGlvbiAobmVpZ2hib3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzKG5laWdoYm9yKSkge1xuICAgICAgICAgICAgICAgICAgcXVldWUucHVzaChuZWlnaGJvcik7XG4gICAgICAgICAgICAgICAgICB2aXNpdGVkLmFkZChuZWlnaGJvcik7XG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRzW2NvdW50XS5wdXNoKG5laWdoYm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB7IGNvbXBvbmVudHM6IGNvbXBvbmVudHMsIGlzRml4ZWQ6IGlzRml4ZWQgfTtcbiAgICAgIH07XG5cbiAgICAgIHZhciByZXN1bHRPbkhvcml6b250YWwgPSBjb25zdHJ1Y3RDb21wb25lbnRzKHN1YkdyYXBoT25Ib3Jpem9udGFsLCBzZWxmLmZpeGVkTm9kZXNPbkhvcml6b250YWwpO1xuICAgICAgdGhpcy5jb21wb25lbnRzT25Ib3Jpem9udGFsID0gcmVzdWx0T25Ib3Jpem9udGFsLmNvbXBvbmVudHM7XG4gICAgICB0aGlzLmZpeGVkQ29tcG9uZW50c09uSG9yaXpvbnRhbCA9IHJlc3VsdE9uSG9yaXpvbnRhbC5pc0ZpeGVkO1xuICAgICAgdmFyIHJlc3VsdE9uVmVydGljYWwgPSBjb25zdHJ1Y3RDb21wb25lbnRzKHN1YkdyYXBoT25WZXJ0aWNhbCwgc2VsZi5maXhlZE5vZGVzT25WZXJ0aWNhbCk7XG4gICAgICB0aGlzLmNvbXBvbmVudHNPblZlcnRpY2FsID0gcmVzdWx0T25WZXJ0aWNhbC5jb21wb25lbnRzO1xuICAgICAgdGhpcy5maXhlZENvbXBvbmVudHNPblZlcnRpY2FsID0gcmVzdWx0T25WZXJ0aWNhbC5pc0ZpeGVkO1xuICAgIH1cbiAgfVxufTtcblxuLy8gdXBkYXRlcyBub2RlIGRpc3BsYWNlbWVudHMgYmFzZWQgb24gY29uc3RyYWludHNcbkNvU0VMYXlvdXQucHJvdG90eXBlLnVwZGF0ZURpc3BsYWNlbWVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKHRoaXMuY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludCkge1xuICAgIHRoaXMuY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRGF0YSkge1xuICAgICAgdmFyIGZpeGVkTm9kZSA9IHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVEYXRhLm5vZGVJZCk7XG4gICAgICBmaXhlZE5vZGUuZGlzcGxhY2VtZW50WCA9IDA7XG4gICAgICBmaXhlZE5vZGUuZGlzcGxhY2VtZW50WSA9IDA7XG4gICAgfSk7XG4gIH1cblxuICBpZiAodGhpcy5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50KSB7XG4gICAgaWYgKHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCkge1xuICAgICAgdmFyIGFsbFZlcnRpY2FsQWxpZ25tZW50cyA9IHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsVmVydGljYWxBbGlnbm1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0b3RhbERpc3BsYWNlbWVudFggPSAwO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFsbFZlcnRpY2FsQWxpZ25tZW50c1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmICh0aGlzLmZpeGVkTm9kZVNldC5oYXMoYWxsVmVydGljYWxBbGlnbm1lbnRzW2ldW2pdKSkge1xuICAgICAgICAgICAgdG90YWxEaXNwbGFjZW1lbnRYID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0b3RhbERpc3BsYWNlbWVudFggKz0gdGhpcy5pZFRvTm9kZU1hcC5nZXQoYWxsVmVydGljYWxBbGlnbm1lbnRzW2ldW2pdKS5kaXNwbGFjZW1lbnRYO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhdmVyYWdlRGlzcGxhY2VtZW50WCA9IHRvdGFsRGlzcGxhY2VtZW50WCAvIGFsbFZlcnRpY2FsQWxpZ25tZW50c1tpXS5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYWxsVmVydGljYWxBbGlnbm1lbnRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgdGhpcy5pZFRvTm9kZU1hcC5nZXQoYWxsVmVydGljYWxBbGlnbm1lbnRzW2ldW2pdKS5kaXNwbGFjZW1lbnRYID0gYXZlcmFnZURpc3BsYWNlbWVudFg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsKSB7XG4gICAgICB2YXIgYWxsSG9yaXpvbnRhbEFsaWdubWVudHMgPSB0aGlzLmNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsSG9yaXpvbnRhbEFsaWdubWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHRvdGFsRGlzcGxhY2VtZW50WSA9IDA7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYWxsSG9yaXpvbnRhbEFsaWdubWVudHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5maXhlZE5vZGVTZXQuaGFzKGFsbEhvcml6b250YWxBbGlnbm1lbnRzW2ldW2pdKSkge1xuICAgICAgICAgICAgdG90YWxEaXNwbGFjZW1lbnRZID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0b3RhbERpc3BsYWNlbWVudFkgKz0gdGhpcy5pZFRvTm9kZU1hcC5nZXQoYWxsSG9yaXpvbnRhbEFsaWdubWVudHNbaV1bal0pLmRpc3BsYWNlbWVudFk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGF2ZXJhZ2VEaXNwbGFjZW1lbnRZID0gdG90YWxEaXNwbGFjZW1lbnRZIC8gYWxsSG9yaXpvbnRhbEFsaWdubWVudHNbaV0ubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFsbEhvcml6b250YWxBbGlnbm1lbnRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgdGhpcy5pZFRvTm9kZU1hcC5nZXQoYWxsSG9yaXpvbnRhbEFsaWdubWVudHNbaV1bal0pLmRpc3BsYWNlbWVudFkgPSBhdmVyYWdlRGlzcGxhY2VtZW50WTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLmNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuXG4gICAgaWYgKENvU0VDb25zdGFudHMuUkVMQVhfTU9WRU1FTlRfT05fQ09OU1RSQUlOVFMpIHtcbiAgICAgIC8vIHNodWZmbGUgYXJyYXkgdG8gcmFuZG9taXplIG5vZGUgcHJvY2Vzc2luZyBvcmRlclxuICAgICAgaWYgKHRoaXMudG90YWxJdGVyYXRpb25zICUgMTAgPT0gMCkge1xuICAgICAgICB0aGlzLnNodWZmbGUodGhpcy5ub2Rlc0luUmVsYXRpdmVIb3Jpem9udGFsKTtcbiAgICAgICAgdGhpcy5zaHVmZmxlKHRoaXMubm9kZXNJblJlbGF0aXZlVmVydGljYWwpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5vZGVzSW5SZWxhdGl2ZUhvcml6b250YWwuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgIGlmICghc2VsZi5maXhlZE5vZGVzT25Ib3Jpem9udGFsLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgdmFyIGRpc3BsYWNlbWVudCA9IDA7XG4gICAgICAgICAgaWYgKHNlbGYuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgZGlzcGxhY2VtZW50ID0gc2VsZi5pZFRvTm9kZU1hcC5nZXQoc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChub2RlSWQpWzBdKS5kaXNwbGFjZW1lbnRYO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkaXNwbGFjZW1lbnQgPSBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFg7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwSG9yaXpvbnRhbC5nZXQobm9kZUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgICAgICBpZiAoY29uc3RyYWludC5yaWdodCkge1xuICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5nZXQoY29uc3RyYWludC5yaWdodCkgLSBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuZ2V0KG5vZGVJZCkgLSBkaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgIGlmIChkaWZmIDwgY29uc3RyYWludC5nYXApIHtcbiAgICAgICAgICAgICAgICBkaXNwbGFjZW1lbnQgLT0gY29uc3RyYWludC5nYXAgLSBkaWZmO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgZGlmZiA9IHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5nZXQobm9kZUlkKSAtIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwSG9yaXpvbnRhbC5nZXQoY29uc3RyYWludC5sZWZ0KSArIGRpc3BsYWNlbWVudDtcbiAgICAgICAgICAgICAgaWYgKGRpZmYgPCBjb25zdHJhaW50LmdhcCkge1xuICAgICAgICAgICAgICAgIGRpc3BsYWNlbWVudCArPSBjb25zdHJhaW50LmdhcCAtIGRpZmY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcEhvcml6b250YWwuc2V0KG5vZGVJZCwgc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBIb3Jpem9udGFsLmdldChub2RlSWQpICsgZGlzcGxhY2VtZW50KTtcbiAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50Lmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICBzZWxmLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KG5vZGVJZCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WCA9IGRpc3BsYWNlbWVudDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFggPSBkaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ub2Rlc0luUmVsYXRpdmVWZXJ0aWNhbC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgaWYgKCFzZWxmLmZpeGVkTm9kZXNPbkhvcml6b250YWwuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICB2YXIgZGlzcGxhY2VtZW50ID0gMDtcbiAgICAgICAgICBpZiAoc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgIGRpc3BsYWNlbWVudCA9IHNlbGYuaWRUb05vZGVNYXAuZ2V0KHNlbGYuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChub2RlSWQpWzBdKS5kaXNwbGFjZW1lbnRZO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkaXNwbGFjZW1lbnQgPSBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYubm9kZVRvUmVsYXRpdmVDb25zdHJhaW50TWFwVmVydGljYWwuZ2V0KG5vZGVJZCkuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnQuYm90dG9tKSB7XG4gICAgICAgICAgICAgIHZhciBkaWZmID0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5nZXQoY29uc3RyYWludC5ib3R0b20pIC0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5nZXQobm9kZUlkKSAtIGRpc3BsYWNlbWVudDtcbiAgICAgICAgICAgICAgaWYgKGRpZmYgPCBjb25zdHJhaW50LmdhcCkge1xuICAgICAgICAgICAgICAgIGRpc3BsYWNlbWVudCAtPSBjb25zdHJhaW50LmdhcCAtIGRpZmY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBkaWZmID0gc2VsZi5ub2RlVG9UZW1wUG9zaXRpb25NYXBWZXJ0aWNhbC5nZXQobm9kZUlkKSAtIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuZ2V0KGNvbnN0cmFpbnQudG9wKSArIGRpc3BsYWNlbWVudDtcbiAgICAgICAgICAgICAgaWYgKGRpZmYgPCBjb25zdHJhaW50LmdhcCkge1xuICAgICAgICAgICAgICAgIGRpc3BsYWNlbWVudCArPSBjb25zdHJhaW50LmdhcCAtIGRpZmY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzZWxmLm5vZGVUb1RlbXBQb3NpdGlvbk1hcFZlcnRpY2FsLnNldChub2RlSWQsIHNlbGYubm9kZVRvVGVtcFBvc2l0aW9uTWFwVmVydGljYWwuZ2V0KG5vZGVJZCkgKyBkaXNwbGFjZW1lbnQpO1xuICAgICAgICAgIGlmIChzZWxmLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgc2VsZi5kdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KG5vZGVJZCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WSA9IGRpc3BsYWNlbWVudDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFkgPSBkaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbXBvbmVudHNPbkhvcml6b250YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c09uSG9yaXpvbnRhbFtpXTtcbiAgICAgICAgaWYgKHRoaXMuZml4ZWRDb21wb25lbnRzT25Ib3Jpem9udGFsW2ldKSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21wb25lbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuaGFzKGNvbXBvbmVudFtqXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5kdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChjb21wb25lbnRbal0pLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WCA9IDA7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5pZFRvTm9kZU1hcC5nZXQoY29tcG9uZW50W2pdKS5kaXNwbGFjZW1lbnRYID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbXBvbmVudC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMoY29tcG9uZW50W2pdKSkge1xuICAgICAgICAgICAgICB2YXIgYWN0dWFsTm9kZXMgPSB0aGlzLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGNvbXBvbmVudFtqXSk7XG4gICAgICAgICAgICAgIHN1bSArPSBhY3R1YWxOb2Rlcy5sZW5ndGggKiB0aGlzLmlkVG9Ob2RlTWFwLmdldChhY3R1YWxOb2Rlc1swXSkuZGlzcGxhY2VtZW50WDtcbiAgICAgICAgICAgICAgY291bnQgKz0gYWN0dWFsTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3VtICs9IHRoaXMuaWRUb05vZGVNYXAuZ2V0KGNvbXBvbmVudFtqXSkuZGlzcGxhY2VtZW50WDtcbiAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGF2ZXJhZ2VEaXNwbGFjZW1lbnQgPSBzdW0gLyBjb3VudDtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbXBvbmVudC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudC5oYXMoY29tcG9uZW50W2pdKSkge1xuICAgICAgICAgICAgICB0aGlzLmR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGNvbXBvbmVudFtqXSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pZFRvTm9kZU1hcC5nZXQobm9kZUlkKS5kaXNwbGFjZW1lbnRYID0gYXZlcmFnZURpc3BsYWNlbWVudDtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmlkVG9Ob2RlTWFwLmdldChjb21wb25lbnRbal0pLmRpc3BsYWNlbWVudFggPSBhdmVyYWdlRGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29tcG9uZW50c09uVmVydGljYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c09uVmVydGljYWxbaV07XG4gICAgICAgIGlmICh0aGlzLmZpeGVkQ29tcG9uZW50c09uVmVydGljYWxbaV0pIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbXBvbmVudC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhjb21wb25lbnRbal0pKSB7XG4gICAgICAgICAgICAgIHRoaXMuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChjb21wb25lbnRbal0pLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICAgIHNlbGYuaWRUb05vZGVNYXAuZ2V0KG5vZGVJZCkuZGlzcGxhY2VtZW50WSA9IDA7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5pZFRvTm9kZU1hcC5nZXQoY29tcG9uZW50W2pdKS5kaXNwbGFjZW1lbnRZID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbXBvbmVudC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50Lmhhcyhjb21wb25lbnRbal0pKSB7XG4gICAgICAgICAgICAgIHZhciBhY3R1YWxOb2RlcyA9IHRoaXMuZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LmdldChjb21wb25lbnRbal0pO1xuICAgICAgICAgICAgICBzdW0gKz0gYWN0dWFsTm9kZXMubGVuZ3RoICogdGhpcy5pZFRvTm9kZU1hcC5nZXQoYWN0dWFsTm9kZXNbMF0pLmRpc3BsYWNlbWVudFk7XG4gICAgICAgICAgICAgIGNvdW50ICs9IGFjdHVhbE5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN1bSArPSB0aGlzLmlkVG9Ob2RlTWFwLmdldChjb21wb25lbnRbal0pLmRpc3BsYWNlbWVudFk7XG4gICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBhdmVyYWdlRGlzcGxhY2VtZW50ID0gc3VtIC8gY291bnQ7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21wb25lbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5oYXMoY29tcG9uZW50W2pdKSkge1xuICAgICAgICAgICAgICB0aGlzLmR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoY29tcG9uZW50W2pdKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmlkVG9Ob2RlTWFwLmdldChub2RlSWQpLmRpc3BsYWNlbWVudFkgPSBhdmVyYWdlRGlzcGxhY2VtZW50O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaWRUb05vZGVNYXAuZ2V0KGNvbXBvbmVudFtqXSkuZGlzcGxhY2VtZW50WSA9IGF2ZXJhZ2VEaXNwbGFjZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5jYWxjdWxhdGVOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvblRvID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm9kZUxpc3QgPSBbXTtcbiAgdmFyIGdyYXBoO1xuXG4gIHZhciBncmFwaHMgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRHcmFwaHMoKTtcbiAgdmFyIHNpemUgPSBncmFwaHMubGVuZ3RoO1xuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgIGdyYXBoID0gZ3JhcGhzW2ldO1xuXG4gICAgZ3JhcGgudXBkYXRlQ29ubmVjdGVkKCk7XG5cbiAgICBpZiAoIWdyYXBoLmlzQ29ubmVjdGVkKSB7XG4gICAgICBub2RlTGlzdCA9IG5vZGVMaXN0LmNvbmNhdChncmFwaC5nZXROb2RlcygpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZUxpc3Q7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5jcmVhdGVCZW5kcG9pbnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWRnZXMgPSBbXTtcbiAgZWRnZXMgPSBlZGdlcy5jb25jYXQodGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsRWRnZXMoKSk7XG4gIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcblxuICAgIGlmICghdmlzaXRlZC5oYXMoZWRnZSkpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBlZGdlLmdldFNvdXJjZSgpO1xuICAgICAgdmFyIHRhcmdldCA9IGVkZ2UuZ2V0VGFyZ2V0KCk7XG5cbiAgICAgIGlmIChzb3VyY2UgPT0gdGFyZ2V0KSB7XG4gICAgICAgIGVkZ2UuZ2V0QmVuZHBvaW50cygpLnB1c2gobmV3IFBvaW50RCgpKTtcbiAgICAgICAgZWRnZS5nZXRCZW5kcG9pbnRzKCkucHVzaChuZXcgUG9pbnREKCkpO1xuICAgICAgICB0aGlzLmNyZWF0ZUR1bW15Tm9kZXNGb3JCZW5kcG9pbnRzKGVkZ2UpO1xuICAgICAgICB2aXNpdGVkLmFkZChlZGdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBlZGdlTGlzdCA9IFtdO1xuXG4gICAgICAgIGVkZ2VMaXN0ID0gZWRnZUxpc3QuY29uY2F0KHNvdXJjZS5nZXRFZGdlTGlzdFRvTm9kZSh0YXJnZXQpKTtcbiAgICAgICAgZWRnZUxpc3QgPSBlZGdlTGlzdC5jb25jYXQodGFyZ2V0LmdldEVkZ2VMaXN0VG9Ob2RlKHNvdXJjZSkpO1xuXG4gICAgICAgIGlmICghdmlzaXRlZC5oYXMoZWRnZUxpc3RbMF0pKSB7XG4gICAgICAgICAgaWYgKGVkZ2VMaXN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHZhciBrO1xuICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGVkZ2VMaXN0Lmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgIHZhciBtdWx0aUVkZ2UgPSBlZGdlTGlzdFtrXTtcbiAgICAgICAgICAgICAgbXVsdGlFZGdlLmdldEJlbmRwb2ludHMoKS5wdXNoKG5ldyBQb2ludEQoKSk7XG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlRHVtbXlOb2Rlc0ZvckJlbmRwb2ludHMobXVsdGlFZGdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWRnZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgICAgdmlzaXRlZC5hZGQoZWRnZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmlzaXRlZC5zaXplID09IGVkZ2VzLmxlbmd0aCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5wb3NpdGlvbk5vZGVzUmFkaWFsbHkgPSBmdW5jdGlvbiAoZm9yZXN0KSB7XG4gIC8vIFdlIHRpbGUgdGhlIHRyZWVzIHRvIGEgZ3JpZCByb3cgYnkgcm93OyBmaXJzdCB0cmVlIHN0YXJ0cyBhdCAoMCwwKVxuICB2YXIgY3VycmVudFN0YXJ0aW5nUG9pbnQgPSBuZXcgUG9pbnQoMCwgMCk7XG4gIHZhciBudW1iZXJPZkNvbHVtbnMgPSBNYXRoLmNlaWwoTWF0aC5zcXJ0KGZvcmVzdC5sZW5ndGgpKTtcbiAgdmFyIGhlaWdodCA9IDA7XG4gIHZhciBjdXJyZW50WSA9IDA7XG4gIHZhciBjdXJyZW50WCA9IDA7XG4gIHZhciBwb2ludCA9IG5ldyBQb2ludEQoMCwgMCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3Jlc3QubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaSAlIG51bWJlck9mQ29sdW1ucyA9PSAwKSB7XG4gICAgICAvLyBTdGFydCBvZiBhIG5ldyByb3csIG1ha2UgdGhlIHggY29vcmRpbmF0ZSAwLCBpbmNyZW1lbnQgdGhlXG4gICAgICAvLyB5IGNvb3JkaW5hdGUgd2l0aCB0aGUgbWF4IGhlaWdodCBvZiB0aGUgcHJldmlvdXMgcm93XG4gICAgICBjdXJyZW50WCA9IDA7XG4gICAgICBjdXJyZW50WSA9IGhlaWdodDtcblxuICAgICAgaWYgKGkgIT0gMCkge1xuICAgICAgICBjdXJyZW50WSArPSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfQ09NUE9ORU5UX1NFUEVSQVRJT047XG4gICAgICB9XG5cbiAgICAgIGhlaWdodCA9IDA7XG4gICAgfVxuXG4gICAgdmFyIHRyZWUgPSBmb3Jlc3RbaV07XG5cbiAgICAvLyBGaW5kIHRoZSBjZW50ZXIgb2YgdGhlIHRyZWVcbiAgICB2YXIgY2VudGVyTm9kZSA9IExheW91dC5maW5kQ2VudGVyT2ZUcmVlKHRyZWUpO1xuXG4gICAgLy8gU2V0IHRoZSBzdGFyaW5nIHBvaW50IG9mIHRoZSBuZXh0IHRyZWVcbiAgICBjdXJyZW50U3RhcnRpbmdQb2ludC54ID0gY3VycmVudFg7XG4gICAgY3VycmVudFN0YXJ0aW5nUG9pbnQueSA9IGN1cnJlbnRZO1xuXG4gICAgLy8gRG8gYSByYWRpYWwgbGF5b3V0IHN0YXJ0aW5nIHdpdGggdGhlIGNlbnRlclxuICAgIHBvaW50ID0gQ29TRUxheW91dC5yYWRpYWxMYXlvdXQodHJlZSwgY2VudGVyTm9kZSwgY3VycmVudFN0YXJ0aW5nUG9pbnQpO1xuXG4gICAgaWYgKHBvaW50LnkgPiBoZWlnaHQpIHtcbiAgICAgIGhlaWdodCA9IE1hdGguZmxvb3IocG9pbnQueSk7XG4gICAgfVxuXG4gICAgY3VycmVudFggPSBNYXRoLmZsb29yKHBvaW50LnggKyBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfQ09NUE9ORU5UX1NFUEVSQVRJT04pO1xuICB9XG5cbiAgdGhpcy50cmFuc2Zvcm0obmV3IFBvaW50RChMYXlvdXRDb25zdGFudHMuV09STERfQ0VOVEVSX1ggLSBwb2ludC54IC8gMiwgTGF5b3V0Q29uc3RhbnRzLldPUkxEX0NFTlRFUl9ZIC0gcG9pbnQueSAvIDIpKTtcbn07XG5cbkNvU0VMYXlvdXQucmFkaWFsTGF5b3V0ID0gZnVuY3Rpb24gKHRyZWUsIGNlbnRlck5vZGUsIHN0YXJ0aW5nUG9pbnQpIHtcbiAgdmFyIHJhZGlhbFNlcCA9IE1hdGgubWF4KHRoaXMubWF4RGlhZ29uYWxJblRyZWUodHJlZSksIENvU0VDb25zdGFudHMuREVGQVVMVF9SQURJQUxfU0VQQVJBVElPTik7XG4gIENvU0VMYXlvdXQuYnJhbmNoUmFkaWFsTGF5b3V0KGNlbnRlck5vZGUsIG51bGwsIDAsIDM1OSwgMCwgcmFkaWFsU2VwKTtcbiAgdmFyIGJvdW5kcyA9IExHcmFwaC5jYWxjdWxhdGVCb3VuZHModHJlZSk7XG5cbiAgdmFyIHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0oKTtcbiAgdHJhbnNmb3JtLnNldERldmljZU9yZ1goYm91bmRzLmdldE1pblgoKSk7XG4gIHRyYW5zZm9ybS5zZXREZXZpY2VPcmdZKGJvdW5kcy5nZXRNaW5ZKCkpO1xuICB0cmFuc2Zvcm0uc2V0V29ybGRPcmdYKHN0YXJ0aW5nUG9pbnQueCk7XG4gIHRyYW5zZm9ybS5zZXRXb3JsZE9yZ1koc3RhcnRpbmdQb2ludC55KTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRyZWUubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IHRyZWVbaV07XG4gICAgbm9kZS50cmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgfVxuXG4gIHZhciBib3R0b21SaWdodCA9IG5ldyBQb2ludEQoYm91bmRzLmdldE1heFgoKSwgYm91bmRzLmdldE1heFkoKSk7XG5cbiAgcmV0dXJuIHRyYW5zZm9ybS5pbnZlcnNlVHJhbnNmb3JtUG9pbnQoYm90dG9tUmlnaHQpO1xufTtcblxuQ29TRUxheW91dC5icmFuY2hSYWRpYWxMYXlvdXQgPSBmdW5jdGlvbiAobm9kZSwgcGFyZW50T2ZOb2RlLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgZGlzdGFuY2UsIHJhZGlhbFNlcGFyYXRpb24pIHtcbiAgLy8gRmlyc3QsIHBvc2l0aW9uIHRoaXMgbm9kZSBieSBmaW5kaW5nIGl0cyBhbmdsZS5cbiAgdmFyIGhhbGZJbnRlcnZhbCA9IChlbmRBbmdsZSAtIHN0YXJ0QW5nbGUgKyAxKSAvIDI7XG5cbiAgaWYgKGhhbGZJbnRlcnZhbCA8IDApIHtcbiAgICBoYWxmSW50ZXJ2YWwgKz0gMTgwO1xuICB9XG5cbiAgdmFyIG5vZGVBbmdsZSA9IChoYWxmSW50ZXJ2YWwgKyBzdGFydEFuZ2xlKSAlIDM2MDtcbiAgdmFyIHRldGEgPSBub2RlQW5nbGUgKiBJR2VvbWV0cnkuVFdPX1BJIC8gMzYwO1xuXG4gIC8vIE1ha2UgcG9sYXIgdG8gamF2YSBjb3JkaW5hdGUgY29udmVyc2lvbi5cbiAgdmFyIGNvc190ZXRhID0gTWF0aC5jb3ModGV0YSk7XG4gIHZhciB4XyA9IGRpc3RhbmNlICogTWF0aC5jb3ModGV0YSk7XG4gIHZhciB5XyA9IGRpc3RhbmNlICogTWF0aC5zaW4odGV0YSk7XG5cbiAgbm9kZS5zZXRDZW50ZXIoeF8sIHlfKTtcblxuICAvLyBUcmF2ZXJzZSBhbGwgbmVpZ2hib3JzIG9mIHRoaXMgbm9kZSBhbmQgcmVjdXJzaXZlbHkgY2FsbCB0aGlzXG4gIC8vIGZ1bmN0aW9uLlxuICB2YXIgbmVpZ2hib3JFZGdlcyA9IFtdO1xuICBuZWlnaGJvckVkZ2VzID0gbmVpZ2hib3JFZGdlcy5jb25jYXQobm9kZS5nZXRFZGdlcygpKTtcbiAgdmFyIGNoaWxkQ291bnQgPSBuZWlnaGJvckVkZ2VzLmxlbmd0aDtcblxuICBpZiAocGFyZW50T2ZOb2RlICE9IG51bGwpIHtcbiAgICBjaGlsZENvdW50LS07XG4gIH1cblxuICB2YXIgYnJhbmNoQ291bnQgPSAwO1xuXG4gIHZhciBpbmNFZGdlc0NvdW50ID0gbmVpZ2hib3JFZGdlcy5sZW5ndGg7XG4gIHZhciBzdGFydEluZGV4O1xuXG4gIHZhciBlZGdlcyA9IG5vZGUuZ2V0RWRnZXNCZXR3ZWVuKHBhcmVudE9mTm9kZSk7XG5cbiAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGVkZ2VzLCBwcnVuZSB0aGVtIHVudGlsIHRoZXJlIHJlbWFpbnMgb25seSBvbmVcbiAgLy8gZWRnZS5cbiAgd2hpbGUgKGVkZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAvL25laWdoYm9yRWRnZXMucmVtb3ZlKGVkZ2VzLnJlbW92ZSgwKSk7XG4gICAgdmFyIHRlbXAgPSBlZGdlc1swXTtcbiAgICBlZGdlcy5zcGxpY2UoMCwgMSk7XG4gICAgdmFyIGluZGV4ID0gbmVpZ2hib3JFZGdlcy5pbmRleE9mKHRlbXApO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICBuZWlnaGJvckVkZ2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIGluY0VkZ2VzQ291bnQtLTtcbiAgICBjaGlsZENvdW50LS07XG4gIH1cblxuICBpZiAocGFyZW50T2ZOb2RlICE9IG51bGwpIHtcbiAgICAvL2Fzc2VydCBlZGdlcy5sZW5ndGggPT0gMTtcbiAgICBzdGFydEluZGV4ID0gKG5laWdoYm9yRWRnZXMuaW5kZXhPZihlZGdlc1swXSkgKyAxKSAlIGluY0VkZ2VzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgc3RhcnRJbmRleCA9IDA7XG4gIH1cblxuICB2YXIgc3RlcEFuZ2xlID0gTWF0aC5hYnMoZW5kQW5nbGUgLSBzdGFydEFuZ2xlKSAvIGNoaWxkQ291bnQ7XG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXg7IGJyYW5jaENvdW50ICE9IGNoaWxkQ291bnQ7IGkgPSArK2kgJSBpbmNFZGdlc0NvdW50KSB7XG4gICAgdmFyIGN1cnJlbnROZWlnaGJvciA9IG5laWdoYm9yRWRnZXNbaV0uZ2V0T3RoZXJFbmQobm9kZSk7XG5cbiAgICAvLyBEb24ndCBiYWNrIHRyYXZlcnNlIHRvIHJvb3Qgbm9kZSBpbiBjdXJyZW50IHRyZWUuXG4gICAgaWYgKGN1cnJlbnROZWlnaGJvciA9PSBwYXJlbnRPZk5vZGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBjaGlsZFN0YXJ0QW5nbGUgPSAoc3RhcnRBbmdsZSArIGJyYW5jaENvdW50ICogc3RlcEFuZ2xlKSAlIDM2MDtcbiAgICB2YXIgY2hpbGRFbmRBbmdsZSA9IChjaGlsZFN0YXJ0QW5nbGUgKyBzdGVwQW5nbGUpICUgMzYwO1xuXG4gICAgQ29TRUxheW91dC5icmFuY2hSYWRpYWxMYXlvdXQoY3VycmVudE5laWdoYm9yLCBub2RlLCBjaGlsZFN0YXJ0QW5nbGUsIGNoaWxkRW5kQW5nbGUsIGRpc3RhbmNlICsgcmFkaWFsU2VwYXJhdGlvbiwgcmFkaWFsU2VwYXJhdGlvbik7XG5cbiAgICBicmFuY2hDb3VudCsrO1xuICB9XG59O1xuXG5Db1NFTGF5b3V0Lm1heERpYWdvbmFsSW5UcmVlID0gZnVuY3Rpb24gKHRyZWUpIHtcbiAgdmFyIG1heERpYWdvbmFsID0gSW50ZWdlci5NSU5fVkFMVUU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSB0cmVlW2ldO1xuICAgIHZhciBkaWFnb25hbCA9IG5vZGUuZ2V0RGlhZ29uYWwoKTtcblxuICAgIGlmIChkaWFnb25hbCA+IG1heERpYWdvbmFsKSB7XG4gICAgICBtYXhEaWFnb25hbCA9IGRpYWdvbmFsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtYXhEaWFnb25hbDtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNhbGNSZXB1bHNpb25SYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gZm9ybXVsYSBpcyAyIHggKGxldmVsICsgMSkgeCBpZGVhbEVkZ2VMZW5ndGhcbiAgcmV0dXJuIDIgKiAodGhpcy5sZXZlbCArIDEpICogdGhpcy5pZGVhbEVkZ2VMZW5ndGg7XG59O1xuXG4vLyBUaWxpbmcgbWV0aG9kc1xuXG4vLyBHcm91cCB6ZXJvIGRlZ3JlZSBtZW1iZXJzIHdob3NlIHBhcmVudHMgYXJlIG5vdCB0byBiZSB0aWxlZCwgY3JlYXRlIGR1bW15IHBhcmVudHMgd2hlcmUgbmVlZGVkIGFuZCBmaWxsIG1lbWJlckdyb3VwcyBieSB0aGVpciBkdW1tcCBwYXJlbnQgaWQnc1xuQ29TRUxheW91dC5wcm90b3R5cGUuZ3JvdXBaZXJvRGVncmVlTWVtYmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICAvLyBhcnJheSBvZiBbcGFyZW50X2lkIHggb25lRGVncmVlTm9kZV9pZF1cbiAgdmFyIHRlbXBNZW1iZXJHcm91cHMgPSB7fTsgLy8gQSB0ZW1wb3JhcnkgbWFwIG9mIHBhcmVudCBub2RlIGFuZCBpdHMgemVybyBkZWdyZWUgbWVtYmVyc1xuICB0aGlzLm1lbWJlckdyb3VwcyA9IHt9OyAvLyBBIG1hcCBvZiBkdW1teSBwYXJlbnQgbm9kZSBhbmQgaXRzIHplcm8gZGVncmVlIG1lbWJlcnMgd2hvc2UgcGFyZW50cyBhcmUgbm90IHRvIGJlIHRpbGVkXG4gIHRoaXMuaWRUb0R1bW15Tm9kZSA9IHt9OyAvLyBBIG1hcCBvZiBpZCB0byBkdW1teSBub2RlIFxuXG4gIHZhciB6ZXJvRGVncmVlID0gW107IC8vIExpc3Qgb2YgemVybyBkZWdyZWUgbm9kZXMgd2hvc2UgcGFyZW50cyBhcmUgbm90IHRvIGJlIHRpbGVkXG4gIHZhciBhbGxOb2RlcyA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbE5vZGVzKCk7XG5cbiAgLy8gRmlsbCB6ZXJvIGRlZ3JlZSBsaXN0XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IGFsbE5vZGVzW2ldO1xuICAgIHZhciBwYXJlbnQgPSBub2RlLmdldFBhcmVudCgpO1xuICAgIC8vIElmIGEgbm9kZSBoYXMgemVybyBkZWdyZWUgYW5kIGl0cyBwYXJlbnQgaXMgbm90IHRvIGJlIHRpbGVkIGlmIGV4aXN0cyBhZGQgdGhhdCBub2RlIHRvIHplcm9EZWdyZXMgbGlzdFxuICAgIGlmICh0aGlzLmdldE5vZGVEZWdyZWVXaXRoQ2hpbGRyZW4obm9kZSkgPT09IDAgJiYgKHBhcmVudC5pZCA9PSB1bmRlZmluZWQgfHwgIXRoaXMuZ2V0VG9CZVRpbGVkKHBhcmVudCkpKSB7XG4gICAgICB6ZXJvRGVncmVlLnB1c2gobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ3JlYXRlIGEgbWFwIG9mIHBhcmVudCBub2RlIGFuZCBpdHMgemVybyBkZWdyZWUgbWVtYmVyc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHplcm9EZWdyZWUubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IHplcm9EZWdyZWVbaV07IC8vIFplcm8gZGVncmVlIG5vZGUgaXRzZWxmXG4gICAgdmFyIHBfaWQgPSBub2RlLmdldFBhcmVudCgpLmlkOyAvLyBQYXJlbnQgaWRcblxuICAgIGlmICh0eXBlb2YgdGVtcE1lbWJlckdyb3Vwc1twX2lkXSA9PT0gXCJ1bmRlZmluZWRcIikgdGVtcE1lbWJlckdyb3Vwc1twX2lkXSA9IFtdO1xuXG4gICAgdGVtcE1lbWJlckdyb3Vwc1twX2lkXSA9IHRlbXBNZW1iZXJHcm91cHNbcF9pZF0uY29uY2F0KG5vZGUpOyAvLyBQdXNoIG5vZGUgdG8gdGhlIGxpc3QgYmVsb25ncyB0byBpdHMgcGFyZW50IGluIHRlbXBNZW1iZXJHcm91cHNcbiAgfVxuXG4gIC8vIElmIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gbm9kZXMgYXQgYSBsZXZlbCwgY3JlYXRlIGEgZHVtbXkgY29tcG91bmQgZm9yIHRoZW1cbiAgT2JqZWN0LmtleXModGVtcE1lbWJlckdyb3VwcykuZm9yRWFjaChmdW5jdGlvbiAocF9pZCkge1xuICAgIGlmICh0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdLmxlbmd0aCA+IDEpIHtcbiAgICAgIHZhciBkdW1teUNvbXBvdW5kSWQgPSBcIkR1bW15Q29tcG91bmRfXCIgKyBwX2lkOyAvLyBUaGUgaWQgb2YgZHVtbXkgY29tcG91bmQgd2hpY2ggd2lsbCBiZSBjcmVhdGVkIHNvb25cbiAgICAgIHNlbGYubWVtYmVyR3JvdXBzW2R1bW15Q29tcG91bmRJZF0gPSB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdOyAvLyBBZGQgZHVtbXkgY29tcG91bmQgdG8gbWVtYmVyR3JvdXBzXG5cbiAgICAgIHZhciBwYXJlbnQgPSB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdWzBdLmdldFBhcmVudCgpOyAvLyBUaGUgcGFyZW50IG9mIHplcm8gZGVncmVlIG5vZGVzIHdpbGwgYmUgdGhlIHBhcmVudCBvZiBuZXcgZHVtbXkgY29tcG91bmRcblxuICAgICAgLy8gQ3JlYXRlIGEgZHVtbXkgY29tcG91bmQgd2l0aCBjYWxjdWxhdGVkIGlkXG4gICAgICB2YXIgZHVtbXlDb21wb3VuZCA9IG5ldyBDb1NFTm9kZShzZWxmLmdyYXBoTWFuYWdlcik7XG4gICAgICBkdW1teUNvbXBvdW5kLmlkID0gZHVtbXlDb21wb3VuZElkO1xuICAgICAgZHVtbXlDb21wb3VuZC5wYWRkaW5nTGVmdCA9IHBhcmVudC5wYWRkaW5nTGVmdCB8fCAwO1xuICAgICAgZHVtbXlDb21wb3VuZC5wYWRkaW5nUmlnaHQgPSBwYXJlbnQucGFkZGluZ1JpZ2h0IHx8IDA7XG4gICAgICBkdW1teUNvbXBvdW5kLnBhZGRpbmdCb3R0b20gPSBwYXJlbnQucGFkZGluZ0JvdHRvbSB8fCAwO1xuICAgICAgZHVtbXlDb21wb3VuZC5wYWRkaW5nVG9wID0gcGFyZW50LnBhZGRpbmdUb3AgfHwgMDtcblxuICAgICAgc2VsZi5pZFRvRHVtbXlOb2RlW2R1bW15Q29tcG91bmRJZF0gPSBkdW1teUNvbXBvdW5kO1xuXG4gICAgICB2YXIgZHVtbXlQYXJlbnRHcmFwaCA9IHNlbGYuZ2V0R3JhcGhNYW5hZ2VyKCkuYWRkKHNlbGYubmV3R3JhcGgoKSwgZHVtbXlDb21wb3VuZCk7XG4gICAgICB2YXIgcGFyZW50R3JhcGggPSBwYXJlbnQuZ2V0Q2hpbGQoKTtcblxuICAgICAgLy8gQWRkIGR1bW15IGNvbXBvdW5kIHRvIHBhcmVudCB0aGUgZ3JhcGhcbiAgICAgIHBhcmVudEdyYXBoLmFkZChkdW1teUNvbXBvdW5kKTtcblxuICAgICAgLy8gRm9yIGVhY2ggemVybyBkZWdyZWUgbm9kZSBpbiB0aGlzIGxldmVsIHJlbW92ZSBpdCBmcm9tIGl0cyBwYXJlbnQgZ3JhcGggYW5kIGFkZCBpdCB0byB0aGUgZ3JhcGggb2YgZHVtbXkgcGFyZW50XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRlbXBNZW1iZXJHcm91cHNbcF9pZF0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGUgPSB0ZW1wTWVtYmVyR3JvdXBzW3BfaWRdW2ldO1xuXG4gICAgICAgIHBhcmVudEdyYXBoLnJlbW92ZShub2RlKTtcbiAgICAgICAgZHVtbXlQYXJlbnRHcmFwaC5hZGQobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmNsZWFyQ29tcG91bmRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY2hpbGRHcmFwaE1hcCA9IHt9O1xuICB2YXIgaWRUb05vZGUgPSB7fTtcblxuICAvLyBHZXQgY29tcG91bmQgb3JkZXJpbmcgYnkgZmluZGluZyB0aGUgaW5uZXIgb25lIGZpcnN0XG4gIHRoaXMucGVyZm9ybURGU09uQ29tcG91bmRzKCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbXBvdW5kT3JkZXIubGVuZ3RoOyBpKyspIHtcblxuICAgIGlkVG9Ob2RlW3RoaXMuY29tcG91bmRPcmRlcltpXS5pZF0gPSB0aGlzLmNvbXBvdW5kT3JkZXJbaV07XG4gICAgY2hpbGRHcmFwaE1hcFt0aGlzLmNvbXBvdW5kT3JkZXJbaV0uaWRdID0gW10uY29uY2F0KHRoaXMuY29tcG91bmRPcmRlcltpXS5nZXRDaGlsZCgpLmdldE5vZGVzKCkpO1xuXG4gICAgLy8gUmVtb3ZlIGNoaWxkcmVuIG9mIGNvbXBvdW5kc1xuICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlbW92ZSh0aGlzLmNvbXBvdW5kT3JkZXJbaV0uZ2V0Q2hpbGQoKSk7XG4gICAgdGhpcy5jb21wb3VuZE9yZGVyW2ldLmNoaWxkID0gbnVsbDtcbiAgfVxuXG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsTm9kZXMoKTtcblxuICAvLyBUaWxlIHRoZSByZW1vdmVkIGNoaWxkcmVuXG4gIHRoaXMudGlsZUNvbXBvdW5kTWVtYmVycyhjaGlsZEdyYXBoTWFwLCBpZFRvTm9kZSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5jbGVhclplcm9EZWdyZWVNZW1iZXJzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciB0aWxlZFplcm9EZWdyZWVQYWNrID0gdGhpcy50aWxlZFplcm9EZWdyZWVQYWNrID0gW107XG5cbiAgT2JqZWN0LmtleXModGhpcy5tZW1iZXJHcm91cHMpLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGNvbXBvdW5kTm9kZSA9IHNlbGYuaWRUb0R1bW15Tm9kZVtpZF07IC8vIEdldCB0aGUgZHVtbXkgY29tcG91bmRcblxuICAgIHRpbGVkWmVyb0RlZ3JlZVBhY2tbaWRdID0gc2VsZi50aWxlTm9kZXMoc2VsZi5tZW1iZXJHcm91cHNbaWRdLCBjb21wb3VuZE5vZGUucGFkZGluZ0xlZnQgKyBjb21wb3VuZE5vZGUucGFkZGluZ1JpZ2h0KTtcblxuICAgIC8vIFNldCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgZHVtbXkgY29tcG91bmQgYXMgY2FsY3VsYXRlZFxuICAgIGNvbXBvdW5kTm9kZS5yZWN0LndpZHRoID0gdGlsZWRaZXJvRGVncmVlUGFja1tpZF0ud2lkdGg7XG4gICAgY29tcG91bmROb2RlLnJlY3QuaGVpZ2h0ID0gdGlsZWRaZXJvRGVncmVlUGFja1tpZF0uaGVpZ2h0O1xuICAgIGNvbXBvdW5kTm9kZS5zZXRDZW50ZXIodGlsZWRaZXJvRGVncmVlUGFja1tpZF0uY2VudGVyWCwgdGlsZWRaZXJvRGVncmVlUGFja1tpZF0uY2VudGVyWSk7XG5cbiAgICAvLyBjb21wb3VuZCBsZWZ0IGFuZCB0b3AgbWFyZ2luZ3MgZm9yIGxhYmVsc1xuICAgIC8vIHdoZW4gbm9kZSBsYWJlbHMgYXJlIGluY2x1ZGVkLCB0aGVzZSB2YWx1ZXMgbWF5IGJlIHNldCB0byBkaWZmZXJlbnQgdmFsdWVzIGJlbG93IGFuZCBhcmUgdXNlZCBpbiB0aWxpbmdQb3N0TGF5b3V0LFxuICAgIC8vIG90aGVyd2lzZSB0aGV5IHN0YXkgYXMgemVyb1xuICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpbkxlZnQgPSAwO1xuICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcCA9IDA7XG5cbiAgICAvLyBVcGRhdGUgY29tcG91bmQgYm91bmRzIGNvbnNpZGVyaW5nIGl0cyBsYWJlbCBwcm9wZXJ0aWVzIGFuZCBzZXQgbGFiZWwgbWFyZ2lucyBmb3IgbGVmdCBhbmQgdG9wXG4gICAgaWYgKENvU0VDb25zdGFudHMuTk9ERV9ESU1FTlNJT05TX0lOQ0xVREVfTEFCRUxTKSB7XG5cbiAgICAgIHZhciB3aWR0aCA9IGNvbXBvdW5kTm9kZS5yZWN0LndpZHRoO1xuICAgICAgdmFyIGhlaWdodCA9IGNvbXBvdW5kTm9kZS5yZWN0LmhlaWdodDtcblxuICAgICAgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKSB7XG4gICAgICAgIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwibGVmdFwiKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnJlY3QueCAtPSBjb21wb3VuZE5vZGUubGFiZWxXaWR0aDtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0V2lkdGgod2lkdGggKyBjb21wb3VuZE5vZGUubGFiZWxXaWR0aCk7XG4gICAgICAgICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdCA9IGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJjZW50ZXJcIiAmJiBjb21wb3VuZE5vZGUubGFiZWxXaWR0aCA+IHdpZHRoKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnJlY3QueCAtPSAoY29tcG91bmROb2RlLmxhYmVsV2lkdGggLSB3aWR0aCkgLyAyO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRXaWR0aChjb21wb3VuZE5vZGUubGFiZWxXaWR0aCk7XG4gICAgICAgICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdCA9IChjb21wb3VuZE5vZGUubGFiZWxXaWR0aCAtIHdpZHRoKSAvIDI7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0V2lkdGgod2lkdGggKyBjb21wb3VuZE5vZGUubGFiZWxXaWR0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCkge1xuICAgICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJ0b3BcIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5yZWN0LnkgLT0gY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0O1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRIZWlnaHQoaGVpZ2h0ICsgY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5Ub3AgPSBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJjZW50ZXJcIiAmJiBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQgPiBoZWlnaHQpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC55IC09IChjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQgLSBoZWlnaHQpIC8gMjtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0SGVpZ2h0KGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCk7XG4gICAgICAgICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wID0gKGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCAtIGhlaWdodCkgLyAyO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwiYm90dG9tXCIpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0SGVpZ2h0KGhlaWdodCArIGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUucmVwb3B1bGF0ZUNvbXBvdW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgZm9yICh2YXIgaSA9IHRoaXMuY29tcG91bmRPcmRlci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBsQ29tcG91bmROb2RlID0gdGhpcy5jb21wb3VuZE9yZGVyW2ldO1xuICAgIHZhciBpZCA9IGxDb21wb3VuZE5vZGUuaWQ7XG4gICAgdmFyIGhvcml6b250YWxNYXJnaW4gPSBsQ29tcG91bmROb2RlLnBhZGRpbmdMZWZ0O1xuICAgIHZhciB2ZXJ0aWNhbE1hcmdpbiA9IGxDb21wb3VuZE5vZGUucGFkZGluZ1RvcDtcbiAgICB2YXIgbGFiZWxNYXJnaW5MZWZ0ID0gbENvbXBvdW5kTm9kZS5sYWJlbE1hcmdpbkxlZnQ7XG4gICAgdmFyIGxhYmVsTWFyZ2luVG9wID0gbENvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcDtcblxuICAgIHRoaXMuYWRqdXN0TG9jYXRpb25zKHRoaXMudGlsZWRNZW1iZXJQYWNrW2lkXSwgbENvbXBvdW5kTm9kZS5yZWN0LngsIGxDb21wb3VuZE5vZGUucmVjdC55LCBob3Jpem9udGFsTWFyZ2luLCB2ZXJ0aWNhbE1hcmdpbiwgbGFiZWxNYXJnaW5MZWZ0LCBsYWJlbE1hcmdpblRvcCk7XG4gIH1cbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLnJlcG9wdWxhdGVaZXJvRGVncmVlTWVtYmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgdGlsZWRQYWNrID0gdGhpcy50aWxlZFplcm9EZWdyZWVQYWNrO1xuXG4gIE9iamVjdC5rZXlzKHRpbGVkUGFjaykuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgY29tcG91bmROb2RlID0gc2VsZi5pZFRvRHVtbXlOb2RlW2lkXTsgLy8gR2V0IHRoZSBkdW1teSBjb21wb3VuZCBieSBpdHMgaWRcbiAgICB2YXIgaG9yaXpvbnRhbE1hcmdpbiA9IGNvbXBvdW5kTm9kZS5wYWRkaW5nTGVmdDtcbiAgICB2YXIgdmVydGljYWxNYXJnaW4gPSBjb21wb3VuZE5vZGUucGFkZGluZ1RvcDtcbiAgICB2YXIgbGFiZWxNYXJnaW5MZWZ0ID0gY29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdDtcbiAgICB2YXIgbGFiZWxNYXJnaW5Ub3AgPSBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5Ub3A7XG5cbiAgICAvLyBBZGp1c3QgdGhlIHBvc2l0aW9ucyBvZiBub2RlcyB3cnQgaXRzIGNvbXBvdW5kXG4gICAgc2VsZi5hZGp1c3RMb2NhdGlvbnModGlsZWRQYWNrW2lkXSwgY29tcG91bmROb2RlLnJlY3QueCwgY29tcG91bmROb2RlLnJlY3QueSwgaG9yaXpvbnRhbE1hcmdpbiwgdmVydGljYWxNYXJnaW4sIGxhYmVsTWFyZ2luTGVmdCwgbGFiZWxNYXJnaW5Ub3ApO1xuICB9KTtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmdldFRvQmVUaWxlZCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHZhciBpZCA9IG5vZGUuaWQ7XG4gIC8vZmlyc3RseSBjaGVjayB0aGUgcHJldmlvdXMgcmVzdWx0c1xuICBpZiAodGhpcy50b0JlVGlsZWRbaWRdICE9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy50b0JlVGlsZWRbaWRdO1xuICB9XG5cbiAgLy9vbmx5IGNvbXBvdW5kIG5vZGVzIGFyZSB0byBiZSB0aWxlZFxuICB2YXIgY2hpbGRHcmFwaCA9IG5vZGUuZ2V0Q2hpbGQoKTtcbiAgaWYgKGNoaWxkR3JhcGggPT0gbnVsbCkge1xuICAgIHRoaXMudG9CZVRpbGVkW2lkXSA9IGZhbHNlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBjaGlsZHJlbiA9IGNoaWxkR3JhcGguZ2V0Tm9kZXMoKTsgLy8gR2V0IHRoZSBjaGlsZHJlbiBub2Rlc1xuXG4gIC8vYSBjb21wb3VuZCBub2RlIGlzIG5vdCB0byBiZSB0aWxlZCBpZiBhbGwgb2YgaXRzIGNvbXBvdW5kIGNoaWxkcmVuIGFyZSBub3QgdG8gYmUgdGlsZWRcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0aGVDaGlsZCA9IGNoaWxkcmVuW2ldO1xuXG4gICAgaWYgKHRoaXMuZ2V0Tm9kZURlZ3JlZSh0aGVDaGlsZCkgPiAwKSB7XG4gICAgICB0aGlzLnRvQmVUaWxlZFtpZF0gPSBmYWxzZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvL3Bhc3MgdGhlIGNoaWxkcmVuIG5vdCBoYXZpbmcgdGhlIGNvbXBvdW5kIHN0cnVjdHVyZVxuICAgIGlmICh0aGVDaGlsZC5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICAgIHRoaXMudG9CZVRpbGVkW3RoZUNoaWxkLmlkXSA9IGZhbHNlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmdldFRvQmVUaWxlZCh0aGVDaGlsZCkpIHtcbiAgICAgIHRoaXMudG9CZVRpbGVkW2lkXSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICB0aGlzLnRvQmVUaWxlZFtpZF0gPSB0cnVlO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIEdldCBkZWdyZWUgb2YgYSBub2RlIGRlcGVuZGluZyBvZiBpdHMgZWRnZXMgYW5kIGluZGVwZW5kZW50IG9mIGl0cyBjaGlsZHJlblxuQ29TRUxheW91dC5wcm90b3R5cGUuZ2V0Tm9kZURlZ3JlZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHZhciBpZCA9IG5vZGUuaWQ7XG4gIHZhciBlZGdlcyA9IG5vZGUuZ2V0RWRnZXMoKTtcbiAgdmFyIGRlZ3JlZSA9IDA7XG5cbiAgLy8gRm9yIHRoZSBlZGdlcyBjb25uZWN0ZWRcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgaWYgKGVkZ2UuZ2V0U291cmNlKCkuaWQgIT09IGVkZ2UuZ2V0VGFyZ2V0KCkuaWQpIHtcbiAgICAgIGRlZ3JlZSA9IGRlZ3JlZSArIDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWdyZWU7XG59O1xuXG4vLyBHZXQgZGVncmVlIG9mIGEgbm9kZSB3aXRoIGl0cyBjaGlsZHJlblxuQ29TRUxheW91dC5wcm90b3R5cGUuZ2V0Tm9kZURlZ3JlZVdpdGhDaGlsZHJlbiA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHZhciBkZWdyZWUgPSB0aGlzLmdldE5vZGVEZWdyZWUobm9kZSk7XG4gIGlmIChub2RlLmdldENoaWxkKCkgPT0gbnVsbCkge1xuICAgIHJldHVybiBkZWdyZWU7XG4gIH1cbiAgdmFyIGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZCgpLmdldE5vZGVzKCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBkZWdyZWUgKz0gdGhpcy5nZXROb2RlRGVncmVlV2l0aENoaWxkcmVuKGNoaWxkKTtcbiAgfVxuICByZXR1cm4gZGVncmVlO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUucGVyZm9ybURGU09uQ29tcG91bmRzID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNvbXBvdW5kT3JkZXIgPSBbXTtcbiAgdGhpcy5maWxsQ29tcGV4T3JkZXJCeURGUyh0aGlzLmdyYXBoTWFuYWdlci5nZXRSb290KCkuZ2V0Tm9kZXMoKSk7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5maWxsQ29tcGV4T3JkZXJCeURGUyA9IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgaWYgKGNoaWxkLmdldENoaWxkKCkgIT0gbnVsbCkge1xuICAgICAgdGhpcy5maWxsQ29tcGV4T3JkZXJCeURGUyhjaGlsZC5nZXRDaGlsZCgpLmdldE5vZGVzKCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXRUb0JlVGlsZWQoY2hpbGQpKSB7XG4gICAgICB0aGlzLmNvbXBvdW5kT3JkZXIucHVzaChjaGlsZCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiogVGhpcyBtZXRob2QgcGxhY2VzIGVhY2ggemVybyBkZWdyZWUgbWVtYmVyIHdydCBnaXZlbiAoeCx5KSBjb29yZGluYXRlcyAodG9wIGxlZnQpLlxuKi9cbkNvU0VMYXlvdXQucHJvdG90eXBlLmFkanVzdExvY2F0aW9ucyA9IGZ1bmN0aW9uIChvcmdhbml6YXRpb24sIHgsIHksIGNvbXBvdW5kSG9yaXpvbnRhbE1hcmdpbiwgY29tcG91bmRWZXJ0aWNhbE1hcmdpbiwgY29tcG91bmRMYWJlbE1hcmdpbkxlZnQsIGNvbXBvdW5kTGFiZWxNYXJnaW5Ub3ApIHtcbiAgeCArPSBjb21wb3VuZEhvcml6b250YWxNYXJnaW4gKyBjb21wb3VuZExhYmVsTWFyZ2luTGVmdDtcbiAgeSArPSBjb21wb3VuZFZlcnRpY2FsTWFyZ2luICsgY29tcG91bmRMYWJlbE1hcmdpblRvcDtcblxuICB2YXIgbGVmdCA9IHg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmdhbml6YXRpb24ucm93cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciByb3cgPSBvcmdhbml6YXRpb24ucm93c1tpXTtcbiAgICB4ID0gbGVmdDtcbiAgICB2YXIgbWF4SGVpZ2h0ID0gMDtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcm93Lmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgbG5vZGUgPSByb3dbal07XG5cbiAgICAgIGxub2RlLnJlY3QueCA9IHg7IC8vICsgbG5vZGUucmVjdC53aWR0aCAvIDI7XG4gICAgICBsbm9kZS5yZWN0LnkgPSB5OyAvLyArIGxub2RlLnJlY3QuaGVpZ2h0IC8gMjtcblxuICAgICAgeCArPSBsbm9kZS5yZWN0LndpZHRoICsgb3JnYW5pemF0aW9uLmhvcml6b250YWxQYWRkaW5nO1xuXG4gICAgICBpZiAobG5vZGUucmVjdC5oZWlnaHQgPiBtYXhIZWlnaHQpIG1heEhlaWdodCA9IGxub2RlLnJlY3QuaGVpZ2h0O1xuICAgIH1cblxuICAgIHkgKz0gbWF4SGVpZ2h0ICsgb3JnYW5pemF0aW9uLnZlcnRpY2FsUGFkZGluZztcbiAgfVxufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUudGlsZUNvbXBvdW5kTWVtYmVycyA9IGZ1bmN0aW9uIChjaGlsZEdyYXBoTWFwLCBpZFRvTm9kZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMudGlsZWRNZW1iZXJQYWNrID0gW107XG5cbiAgT2JqZWN0LmtleXMoY2hpbGRHcmFwaE1hcCkuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAvLyBHZXQgdGhlIGNvbXBvdW5kIG5vZGVcbiAgICB2YXIgY29tcG91bmROb2RlID0gaWRUb05vZGVbaWRdO1xuXG4gICAgc2VsZi50aWxlZE1lbWJlclBhY2tbaWRdID0gc2VsZi50aWxlTm9kZXMoY2hpbGRHcmFwaE1hcFtpZF0sIGNvbXBvdW5kTm9kZS5wYWRkaW5nTGVmdCArIGNvbXBvdW5kTm9kZS5wYWRkaW5nUmlnaHQpO1xuXG4gICAgY29tcG91bmROb2RlLnJlY3Qud2lkdGggPSBzZWxmLnRpbGVkTWVtYmVyUGFja1tpZF0ud2lkdGg7XG4gICAgY29tcG91bmROb2RlLnJlY3QuaGVpZ2h0ID0gc2VsZi50aWxlZE1lbWJlclBhY2tbaWRdLmhlaWdodDtcbiAgICBjb21wb3VuZE5vZGUuc2V0Q2VudGVyKHNlbGYudGlsZWRNZW1iZXJQYWNrW2lkXS5jZW50ZXJYLCBzZWxmLnRpbGVkTWVtYmVyUGFja1tpZF0uY2VudGVyWSk7XG5cbiAgICAvLyBjb21wb3VuZCBsZWZ0IGFuZCB0b3AgbWFyZ2luZ3MgZm9yIGxhYmVsc1xuICAgIC8vIHdoZW4gbm9kZSBsYWJlbHMgYXJlIGluY2x1ZGVkLCB0aGVzZSB2YWx1ZXMgbWF5IGJlIHNldCB0byBkaWZmZXJlbnQgdmFsdWVzIGJlbG93IGFuZCBhcmUgdXNlZCBpbiB0aWxpbmdQb3N0TGF5b3V0LFxuICAgIC8vIG90aGVyd2lzZSB0aGV5IHN0YXkgYXMgemVyb1xuICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpbkxlZnQgPSAwO1xuICAgIGNvbXBvdW5kTm9kZS5sYWJlbE1hcmdpblRvcCA9IDA7XG5cbiAgICAvLyBVcGRhdGUgY29tcG91bmQgYm91bmRzIGNvbnNpZGVyaW5nIGl0cyBsYWJlbCBwcm9wZXJ0aWVzIGFuZCBzZXQgbGFiZWwgbWFyZ2lucyBmb3IgbGVmdCBhbmQgdG9wXG4gICAgaWYgKENvU0VDb25zdGFudHMuTk9ERV9ESU1FTlNJT05TX0lOQ0xVREVfTEFCRUxTKSB7XG5cbiAgICAgIHZhciB3aWR0aCA9IGNvbXBvdW5kTm9kZS5yZWN0LndpZHRoO1xuICAgICAgdmFyIGhlaWdodCA9IGNvbXBvdW5kTm9kZS5yZWN0LmhlaWdodDtcblxuICAgICAgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoKSB7XG4gICAgICAgIGlmIChjb21wb3VuZE5vZGUubGFiZWxQb3NIb3Jpem9udGFsID09IFwibGVmdFwiKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnJlY3QueCAtPSBjb21wb3VuZE5vZGUubGFiZWxXaWR0aDtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0V2lkdGgod2lkdGggKyBjb21wb3VuZE5vZGUubGFiZWxXaWR0aCk7XG4gICAgICAgICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdCA9IGNvbXBvdW5kTm9kZS5sYWJlbFdpZHRoO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJjZW50ZXJcIiAmJiBjb21wb3VuZE5vZGUubGFiZWxXaWR0aCA+IHdpZHRoKSB7XG4gICAgICAgICAgY29tcG91bmROb2RlLnJlY3QueCAtPSAoY29tcG91bmROb2RlLmxhYmVsV2lkdGggLSB3aWR0aCkgLyAyO1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRXaWR0aChjb21wb3VuZE5vZGUubGFiZWxXaWR0aCk7XG4gICAgICAgICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luTGVmdCA9IChjb21wb3VuZE5vZGUubGFiZWxXaWR0aCAtIHdpZHRoKSAvIDI7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zSG9yaXpvbnRhbCA9PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0V2lkdGgod2lkdGggKyBjb21wb3VuZE5vZGUubGFiZWxXaWR0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCkge1xuICAgICAgICBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJ0b3BcIikge1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5yZWN0LnkgLT0gY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0O1xuICAgICAgICAgIGNvbXBvdW5kTm9kZS5zZXRIZWlnaHQoaGVpZ2h0ICsgY29tcG91bmROb2RlLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgICBjb21wb3VuZE5vZGUubGFiZWxNYXJnaW5Ub3AgPSBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG91bmROb2RlLmxhYmVsUG9zVmVydGljYWwgPT0gXCJjZW50ZXJcIiAmJiBjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQgPiBoZWlnaHQpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUucmVjdC55IC09IChjb21wb3VuZE5vZGUubGFiZWxIZWlnaHQgLSBoZWlnaHQpIC8gMjtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0SGVpZ2h0KGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCk7XG4gICAgICAgICAgY29tcG91bmROb2RlLmxhYmVsTWFyZ2luVG9wID0gKGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCAtIGhlaWdodCkgLyAyO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBvdW5kTm9kZS5sYWJlbFBvc1ZlcnRpY2FsID09IFwiYm90dG9tXCIpIHtcbiAgICAgICAgICBjb21wb3VuZE5vZGUuc2V0SGVpZ2h0KGhlaWdodCArIGNvbXBvdW5kTm9kZS5sYWJlbEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUudGlsZU5vZGVzID0gZnVuY3Rpb24gKG5vZGVzLCBtaW5XaWR0aCkge1xuICB2YXIgaG9yaXpvbnRhbE9yZyA9IHRoaXMudGlsZU5vZGVzQnlGYXZvcmluZ0RpbShub2RlcywgbWluV2lkdGgsIHRydWUpO1xuICB2YXIgdmVydGljYWxPcmcgPSB0aGlzLnRpbGVOb2Rlc0J5RmF2b3JpbmdEaW0obm9kZXMsIG1pbldpZHRoLCBmYWxzZSk7XG5cbiAgdmFyIGhvcml6b250YWxSYXRpbyA9IHRoaXMuZ2V0T3JnUmF0aW8oaG9yaXpvbnRhbE9yZyk7XG4gIHZhciB2ZXJ0aWNhbFJhdGlvID0gdGhpcy5nZXRPcmdSYXRpbyh2ZXJ0aWNhbE9yZyk7XG4gIHZhciBiZXN0T3JnO1xuXG4gIC8vIHRoZSBiZXN0IHJhdGlvIGlzIHRoZSBvbmUgdGhhdCBpcyBjbG9zZXIgdG8gMSBzaW5jZSB0aGUgcmF0aW9zIGFyZSBhbHJlYWR5IG5vcm1hbGl6ZWRcbiAgLy8gYW5kIHRoZSBiZXN0IG9yZ2FuaXphdGlvbiBpcyB0aGUgb25lIHRoYXQgaGFzIHRoZSBiZXN0IHJhdGlvXG4gIGlmICh2ZXJ0aWNhbFJhdGlvIDwgaG9yaXpvbnRhbFJhdGlvKSB7XG4gICAgYmVzdE9yZyA9IHZlcnRpY2FsT3JnO1xuICB9IGVsc2Uge1xuICAgIGJlc3RPcmcgPSBob3Jpem9udGFsT3JnO1xuICB9XG5cbiAgcmV0dXJuIGJlc3RPcmc7XG59O1xuXG4vLyBnZXQgdGhlIHdpZHRoL2hlaWdodCByYXRpbyBvZiB0aGUgb3JnYW5pemF0aW9uIHRoYXQgaXMgbm9ybWFsaXplZCBzbyB0aGF0IGl0IHdpbGwgbm90IGJlIGxlc3MgdGhhbiAxXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5nZXRPcmdSYXRpbyA9IGZ1bmN0aW9uIChvcmdhbml6YXRpb24pIHtcbiAgLy8gZ2V0IGRpbWVuc2lvbnMgYW5kIGNhbGN1bGF0ZSB0aGUgaW5pdGlhbCByYXRpb1xuICB2YXIgd2lkdGggPSBvcmdhbml6YXRpb24ud2lkdGg7XG4gIHZhciBoZWlnaHQgPSBvcmdhbml6YXRpb24uaGVpZ2h0O1xuICB2YXIgcmF0aW8gPSB3aWR0aCAvIGhlaWdodDtcblxuICAvLyBpZiB0aGUgaW5pdGlhbCByYXRpbyBpcyBsZXNzIHRoZW4gMSB0aGVuIGludmVyc2UgaXRcbiAgaWYgKHJhdGlvIDwgMSkge1xuICAgIHJhdGlvID0gMSAvIHJhdGlvO1xuICB9XG5cbiAgLy8gcmV0dXJuIHRoZSBub3JtYWxpemVkIHJhdGlvXG4gIHJldHVybiByYXRpbztcbn07XG5cbi8qXG4gKiBDYWxjdWxhdGVzIHRoZSBpZGVhbCB3aWR0aCBmb3IgdGhlIHJvd3MuIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdFxuICogZWFjaCBub2RlIGhhcyB0aGUgc2FtZSBzaXplcyBhbmQgY2FsY3VsYXRlcyB0aGUgaWRlYWwgcm93IHdpZHRoIHRoYXRcbiAqIGFwcHJveGltYXRlcyBhIHNxdWFyZSBzaGFwZWQgY29tcGxleCBhY2NvcmRpbmdseS4gSG93ZXZlciwgc2luY2Ugbm9kZXMgd291bGRcbiAqIGhhdmUgZGlmZmVyZW50IHNpemVzIHNvbWUgcm93cyB3b3VsZCBoYXZlIGRpZmZlcmVudCBzaXplcyBhbmQgdGhlIHJlc3VsdGluZ1xuICogc2hhcGUgd291bGQgbm90IGJlIGFuIGV4YWN0IHNxdWFyZS5cbiAqL1xuQ29TRUxheW91dC5wcm90b3R5cGUuY2FsY0lkZWFsUm93V2lkdGggPSBmdW5jdGlvbiAobWVtYmVycywgZmF2b3JIb3Jpem9udGFsRGltKSB7XG4gIC8vIFRvIGFwcHJveGltYXRlIGEgc3F1YXJlIHNoYXBlZCBjb21wbGV4IHdlIG5lZWQgdG8gbWFrZSBjb21wbGV4IHdpZHRoIGVxdWFsIHRvIGNvbXBsZXggaGVpZ2h0LlxuICAvLyBUbyBhY2hpZXZlIHRoaXMgd2UgbmVlZCB0byBzb2x2ZSB0aGUgZm9sbG93aW5nIGVxdWF0aW9uIHN5c3RlbSBmb3IgaGM6XG4gIC8vICh4ICsgYngpICogaGMgLSBieCA9ICh5ICsgYnkpICogdmMgLSBieSwgaGMgKiB2YyA9IG5cbiAgLy8gd2hlcmUgeCBpcyB0aGUgYXZhcmFnZSB3aWR0aCBvZiB0aGUgbm9kZXMsIHkgaXMgdGhlIGF2YXJhZ2UgaGVpZ2h0IG9mIG5vZGVzXG4gIC8vIGJ4IGFuZCBieSBhcmUgdGhlIGJ1ZmZlciBzaXplcyBpbiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkaW1lbnNpb25zIGFjY29yZGluZ2x5LFxuICAvLyBoYyBhbmQgdmMgYXJlIHRoZSBudW1iZXIgb2Ygcm93cyBpbiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkaW1lbnNpb25zXG4gIC8vIG4gaXMgbnVtYmVyIG9mIG1lbWJlcnMuXG5cbiAgdmFyIHZlcnRpY2FsUGFkZGluZyA9IENvU0VDb25zdGFudHMuVElMSU5HX1BBRERJTkdfVkVSVElDQUw7XG4gIHZhciBob3Jpem9udGFsUGFkZGluZyA9IENvU0VDb25zdGFudHMuVElMSU5HX1BBRERJTkdfSE9SSVpPTlRBTDtcblxuICAvLyBudW1iZXIgb2YgbWVtYmVyc1xuICB2YXIgbWVtYmVyc1NpemUgPSBtZW1iZXJzLmxlbmd0aDtcblxuICAvLyBzdW0gb2YgdGhlIHdpZHRoIG9mIGFsbCBtZW1iZXJzXG4gIHZhciB0b3RhbFdpZHRoID0gMDtcblxuICAvLyBzdW0gb2YgdGhlIGhlaWdodCBvZiBhbGwgbWVtYmVyc1xuICB2YXIgdG90YWxIZWlnaHQgPSAwO1xuXG4gIHZhciBtYXhXaWR0aCA9IDA7XG5cbiAgLy8gdHJhdmVyc2UgYWxsIG1lbWJlcnMgdG8gY2FsY3VsYXRlIHRvdGFsIHdpZHRoIGFuZCB0b3RhbCBoZWlnaHQgYW5kIGdldCB0aGUgbWF4aW11bSBtZW1iZXJzIHdpZHRoXG4gIG1lbWJlcnMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgIHRvdGFsV2lkdGggKz0gbm9kZS5nZXRXaWR0aCgpO1xuICAgIHRvdGFsSGVpZ2h0ICs9IG5vZGUuZ2V0SGVpZ2h0KCk7XG5cbiAgICBpZiAobm9kZS5nZXRXaWR0aCgpID4gbWF4V2lkdGgpIHtcbiAgICAgIG1heFdpZHRoID0gbm9kZS5nZXRXaWR0aCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gYXZlcmFnZSB3aWR0aCBvZiB0aGUgbWVtYmVyc1xuICB2YXIgYXZlcmFnZVdpZHRoID0gdG90YWxXaWR0aCAvIG1lbWJlcnNTaXplO1xuXG4gIC8vIGF2ZXJhZ2UgaGVpZ2h0IG9mIHRoZSBtZW1iZXJzXG4gIHZhciBhdmVyYWdlSGVpZ2h0ID0gdG90YWxIZWlnaHQgLyBtZW1iZXJzU2l6ZTtcblxuICAvLyBzb2x2aW5nIHRoZSBpbml0aWFsIGVxdWF0aW9uIHN5c3RlbSBmb3IgdGhlIGhjIHlpZWxkcyB0aGUgZm9sbG93aW5nIHNlY29uZCBkZWdyZWUgZXF1YXRpb246XG4gIC8vIGhjXjIgKiAoeCtieCkgKyBoYyAqIChieSAtIGJ4KSAtIG4gKiAoeSArIGJ5KSA9IDBcblxuICAvLyB0aGUgZGVsdGEgdmFsdWUgdG8gc29sdmUgdGhlIGVxdWF0aW9uIGFib3ZlIGZvciBoY1xuICB2YXIgZGVsdGEgPSBNYXRoLnBvdyh2ZXJ0aWNhbFBhZGRpbmcgLSBob3Jpem9udGFsUGFkZGluZywgMikgKyA0ICogKGF2ZXJhZ2VXaWR0aCArIGhvcml6b250YWxQYWRkaW5nKSAqIChhdmVyYWdlSGVpZ2h0ICsgdmVydGljYWxQYWRkaW5nKSAqIG1lbWJlcnNTaXplO1xuXG4gIC8vIHNvbHZlIHRoZSBlcXVhdGlvbiB1c2luZyBkZWx0YSB2YWx1ZSB0byBjYWxjdWxhdGUgdGhlIGhvcml6b250YWwgY291bnRcbiAgLy8gdGhhdCByZXByZXNlbnRzIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gYW4gaWRlYWwgcm93XG4gIHZhciBob3Jpem9udGFsQ291bnREb3VibGUgPSAoaG9yaXpvbnRhbFBhZGRpbmcgLSB2ZXJ0aWNhbFBhZGRpbmcgKyBNYXRoLnNxcnQoZGVsdGEpKSAvICgyICogKGF2ZXJhZ2VXaWR0aCArIGhvcml6b250YWxQYWRkaW5nKSk7XG4gIC8vIHJvdW5kIHRoZSBjYWxjdWxhdGVkIGhvcml6b250YWwgY291bnQgdXAgb3IgZG93biBhY2NvcmRpbmcgdG8gdGhlIGZhdm9yZWQgZGltZW5zaW9uXG4gIHZhciBob3Jpem9udGFsQ291bnQ7XG5cbiAgaWYgKGZhdm9ySG9yaXpvbnRhbERpbSkge1xuICAgIGhvcml6b250YWxDb3VudCA9IE1hdGguY2VpbChob3Jpem9udGFsQ291bnREb3VibGUpO1xuICAgIC8vIGlmIGhvcml6b250YWxDb3VudCBjb3VudCBpcyBub3QgYSBmbG9hdCB2YWx1ZSB0aGVuIGJvdGggb2Ygcm91bmRpbmcgdG8gZmxvb3IgYW5kIGNlaWxcbiAgICAvLyB3aWxsIHlpZWxkIHRoZSBzYW1lIHZhbHVlcy4gSW5zdGVhZCBvZiByZXBlYXRpbmcgdGhlIHNhbWUgY2FsY3VsYXRpb24gdHJ5IGdvaW5nIHVwXG4gICAgLy8gd2hpbGUgZmF2b3JpbmcgaG9yaXpvbnRhbCBkaW1lbnNpb24gaW4gc3VjaCBjYXNlc1xuICAgIGlmIChob3Jpem9udGFsQ291bnQgPT0gaG9yaXpvbnRhbENvdW50RG91YmxlKSB7XG4gICAgICBob3Jpem9udGFsQ291bnQrKztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaG9yaXpvbnRhbENvdW50ID0gTWF0aC5mbG9vcihob3Jpem9udGFsQ291bnREb3VibGUpO1xuICB9XG5cbiAgLy8gaWRlYWwgd2lkdGggdG8gYmUgY2FsY3VsYXRlZFxuICB2YXIgaWRlYWxXaWR0aCA9IGhvcml6b250YWxDb3VudCAqIChhdmVyYWdlV2lkdGggKyBob3Jpem9udGFsUGFkZGluZykgLSBob3Jpem9udGFsUGFkZGluZztcblxuICAvLyBpZiBtYXggd2lkdGggaXMgYmlnZ2VyIHRoYW4gY2FsY3VsYXRlZCBpZGVhbCB3aWR0aCByZXNldCBpZGVhbCB3aWR0aCB0byBpdFxuICBpZiAobWF4V2lkdGggPiBpZGVhbFdpZHRoKSB7XG4gICAgaWRlYWxXaWR0aCA9IG1heFdpZHRoO1xuICB9XG5cbiAgLy8gYWRkIHRoZSBsZWZ0LXJpZ2h0IG1hcmdpbnMgdG8gdGhlIGlkZWFsIHJvdyB3aWR0aFxuICBpZGVhbFdpZHRoICs9IGhvcml6b250YWxQYWRkaW5nICogMjtcblxuICAvLyByZXR1cm4gdGhlIGlkZWFsIHJvdyB3aWR0aDFcbiAgcmV0dXJuIGlkZWFsV2lkdGg7XG59O1xuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS50aWxlTm9kZXNCeUZhdm9yaW5nRGltID0gZnVuY3Rpb24gKG5vZGVzLCBtaW5XaWR0aCwgZmF2b3JIb3Jpem9udGFsRGltKSB7XG4gIHZhciB2ZXJ0aWNhbFBhZGRpbmcgPSBDb1NFQ29uc3RhbnRzLlRJTElOR19QQURESU5HX1ZFUlRJQ0FMO1xuICB2YXIgaG9yaXpvbnRhbFBhZGRpbmcgPSBDb1NFQ29uc3RhbnRzLlRJTElOR19QQURESU5HX0hPUklaT05UQUw7XG4gIHZhciB0aWxpbmdDb21wYXJlQnkgPSBDb1NFQ29uc3RhbnRzLlRJTElOR19DT01QQVJFX0JZO1xuICB2YXIgb3JnYW5pemF0aW9uID0ge1xuICAgIHJvd3M6IFtdLFxuICAgIHJvd1dpZHRoOiBbXSxcbiAgICByb3dIZWlnaHQ6IFtdLFxuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogbWluV2lkdGgsIC8vIGFzc3VtZSBtaW5IZWlnaHQgZXF1YWxzIHRvIG1pbldpZHRoXG4gICAgdmVydGljYWxQYWRkaW5nOiB2ZXJ0aWNhbFBhZGRpbmcsXG4gICAgaG9yaXpvbnRhbFBhZGRpbmc6IGhvcml6b250YWxQYWRkaW5nLFxuICAgIGNlbnRlclg6IDAsXG4gICAgY2VudGVyWTogMFxuICB9O1xuXG4gIGlmICh0aWxpbmdDb21wYXJlQnkpIHtcbiAgICBvcmdhbml6YXRpb24uaWRlYWxSb3dXaWR0aCA9IHRoaXMuY2FsY0lkZWFsUm93V2lkdGgobm9kZXMsIGZhdm9ySG9yaXpvbnRhbERpbSk7XG4gIH1cblxuICB2YXIgZ2V0Tm9kZUFyZWEgPSBmdW5jdGlvbiBnZXROb2RlQXJlYShuKSB7XG4gICAgcmV0dXJuIG4ucmVjdC53aWR0aCAqIG4ucmVjdC5oZWlnaHQ7XG4gIH07XG5cbiAgdmFyIGFyZWFDb21wYXJlRmNuID0gZnVuY3Rpb24gYXJlYUNvbXBhcmVGY24objEsIG4yKSB7XG4gICAgcmV0dXJuIGdldE5vZGVBcmVhKG4yKSAtIGdldE5vZGVBcmVhKG4xKTtcbiAgfTtcblxuICAvLyBTb3J0IHRoZSBub2RlcyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHRoZWlyIGFyZWFzXG4gIG5vZGVzLnNvcnQoZnVuY3Rpb24gKG4xLCBuMikge1xuICAgIHZhciBjbXBCeSA9IGFyZWFDb21wYXJlRmNuO1xuICAgIGlmIChvcmdhbml6YXRpb24uaWRlYWxSb3dXaWR0aCkge1xuICAgICAgY21wQnkgPSB0aWxpbmdDb21wYXJlQnk7XG4gICAgICByZXR1cm4gY21wQnkobjEuaWQsIG4yLmlkKTtcbiAgICB9XG4gICAgcmV0dXJuIGNtcEJ5KG4xLCBuMik7XG4gIH0pO1xuXG4gIC8vIENyZWF0ZSB0aGUgb3JnYW5pemF0aW9uIC0+IGNhbGN1bGF0ZSBjb21wb3VuZCBjZW50ZXJcbiAgdmFyIHN1bUNlbnRlclggPSAwO1xuICB2YXIgc3VtQ2VudGVyWSA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbE5vZGUgPSBub2Rlc1tpXTtcblxuICAgIHN1bUNlbnRlclggKz0gbE5vZGUuZ2V0Q2VudGVyWCgpO1xuICAgIHN1bUNlbnRlclkgKz0gbE5vZGUuZ2V0Q2VudGVyWSgpO1xuICB9XG5cbiAgb3JnYW5pemF0aW9uLmNlbnRlclggPSBzdW1DZW50ZXJYIC8gbm9kZXMubGVuZ3RoO1xuICBvcmdhbml6YXRpb24uY2VudGVyWSA9IHN1bUNlbnRlclkgLyBub2Rlcy5sZW5ndGg7XG5cbiAgLy8gQ3JlYXRlIHRoZSBvcmdhbml6YXRpb24gLT4gdGlsZSBtZW1iZXJzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbE5vZGUgPSBub2Rlc1tpXTtcblxuICAgIGlmIChvcmdhbml6YXRpb24ucm93cy5sZW5ndGggPT0gMCkge1xuICAgICAgdGhpcy5pbnNlcnROb2RlVG9Sb3cob3JnYW5pemF0aW9uLCBsTm9kZSwgMCwgbWluV2lkdGgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jYW5BZGRIb3Jpem9udGFsKG9yZ2FuaXphdGlvbiwgbE5vZGUucmVjdC53aWR0aCwgbE5vZGUucmVjdC5oZWlnaHQpKSB7XG4gICAgICB2YXIgcm93SW5kZXggPSBvcmdhbml6YXRpb24ucm93cy5sZW5ndGggLSAxO1xuICAgICAgaWYgKCFvcmdhbml6YXRpb24uaWRlYWxSb3dXaWR0aCkge1xuICAgICAgICByb3dJbmRleCA9IHRoaXMuZ2V0U2hvcnRlc3RSb3dJbmRleChvcmdhbml6YXRpb24pO1xuICAgICAgfVxuICAgICAgdGhpcy5pbnNlcnROb2RlVG9Sb3cob3JnYW5pemF0aW9uLCBsTm9kZSwgcm93SW5kZXgsIG1pbldpZHRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnNlcnROb2RlVG9Sb3cob3JnYW5pemF0aW9uLCBsTm9kZSwgb3JnYW5pemF0aW9uLnJvd3MubGVuZ3RoLCBtaW5XaWR0aCk7XG4gICAgfVxuXG4gICAgdGhpcy5zaGlmdFRvTGFzdFJvdyhvcmdhbml6YXRpb24pO1xuICB9XG5cbiAgcmV0dXJuIG9yZ2FuaXphdGlvbjtcbn07XG5cbkNvU0VMYXlvdXQucHJvdG90eXBlLmluc2VydE5vZGVUb1JvdyA9IGZ1bmN0aW9uIChvcmdhbml6YXRpb24sIG5vZGUsIHJvd0luZGV4LCBtaW5XaWR0aCkge1xuICB2YXIgbWluQ29tcG91bmRTaXplID0gbWluV2lkdGg7XG5cbiAgLy8gQWRkIG5ldyByb3cgaWYgbmVlZGVkXG4gIGlmIChyb3dJbmRleCA9PSBvcmdhbml6YXRpb24ucm93cy5sZW5ndGgpIHtcbiAgICB2YXIgc2Vjb25kRGltZW5zaW9uID0gW107XG5cbiAgICBvcmdhbml6YXRpb24ucm93cy5wdXNoKHNlY29uZERpbWVuc2lvbik7XG4gICAgb3JnYW5pemF0aW9uLnJvd1dpZHRoLnB1c2gobWluQ29tcG91bmRTaXplKTtcbiAgICBvcmdhbml6YXRpb24ucm93SGVpZ2h0LnB1c2goMCk7XG4gIH1cblxuICAvLyBVcGRhdGUgcm93IHdpZHRoXG4gIHZhciB3ID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW3Jvd0luZGV4XSArIG5vZGUucmVjdC53aWR0aDtcblxuICBpZiAob3JnYW5pemF0aW9uLnJvd3Nbcm93SW5kZXhdLmxlbmd0aCA+IDApIHtcbiAgICB3ICs9IG9yZ2FuaXphdGlvbi5ob3Jpem9udGFsUGFkZGluZztcbiAgfVxuXG4gIG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtyb3dJbmRleF0gPSB3O1xuICAvLyBVcGRhdGUgY29tcG91bmQgd2lkdGhcbiAgaWYgKG9yZ2FuaXphdGlvbi53aWR0aCA8IHcpIHtcbiAgICBvcmdhbml6YXRpb24ud2lkdGggPSB3O1xuICB9XG5cbiAgLy8gVXBkYXRlIGhlaWdodFxuICB2YXIgaCA9IG5vZGUucmVjdC5oZWlnaHQ7XG4gIGlmIChyb3dJbmRleCA+IDApIGggKz0gb3JnYW5pemF0aW9uLnZlcnRpY2FsUGFkZGluZztcblxuICB2YXIgZXh0cmFIZWlnaHQgPSAwO1xuICBpZiAoaCA+IG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbcm93SW5kZXhdKSB7XG4gICAgZXh0cmFIZWlnaHQgPSBvcmdhbml6YXRpb24ucm93SGVpZ2h0W3Jvd0luZGV4XTtcbiAgICBvcmdhbml6YXRpb24ucm93SGVpZ2h0W3Jvd0luZGV4XSA9IGg7XG4gICAgZXh0cmFIZWlnaHQgPSBvcmdhbml6YXRpb24ucm93SGVpZ2h0W3Jvd0luZGV4XSAtIGV4dHJhSGVpZ2h0O1xuICB9XG5cbiAgb3JnYW5pemF0aW9uLmhlaWdodCArPSBleHRyYUhlaWdodDtcblxuICAvLyBJbnNlcnQgbm9kZVxuICBvcmdhbml6YXRpb24ucm93c1tyb3dJbmRleF0ucHVzaChub2RlKTtcbn07XG5cbi8vU2NhbnMgdGhlIHJvd3Mgb2YgYW4gb3JnYW5pemF0aW9uIGFuZCByZXR1cm5zIHRoZSBvbmUgd2l0aCB0aGUgbWluIHdpZHRoXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5nZXRTaG9ydGVzdFJvd0luZGV4ID0gZnVuY3Rpb24gKG9yZ2FuaXphdGlvbikge1xuICB2YXIgciA9IC0xO1xuICB2YXIgbWluID0gTnVtYmVyLk1BWF9WQUxVRTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZ2FuaXphdGlvbi5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtpXSA8IG1pbikge1xuICAgICAgciA9IGk7XG4gICAgICBtaW4gPSBvcmdhbml6YXRpb24ucm93V2lkdGhbaV07XG4gICAgfVxuICB9XG4gIHJldHVybiByO1xufTtcblxuLy9TY2FucyB0aGUgcm93cyBvZiBhbiBvcmdhbml6YXRpb24gYW5kIHJldHVybnMgdGhlIG9uZSB3aXRoIHRoZSBtYXggd2lkdGhcbkNvU0VMYXlvdXQucHJvdG90eXBlLmdldExvbmdlc3RSb3dJbmRleCA9IGZ1bmN0aW9uIChvcmdhbml6YXRpb24pIHtcbiAgdmFyIHIgPSAtMTtcbiAgdmFyIG1heCA9IE51bWJlci5NSU5fVkFMVUU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmdhbml6YXRpb24ucm93cy5sZW5ndGg7IGkrKykge1xuXG4gICAgaWYgKG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtpXSA+IG1heCkge1xuICAgICAgciA9IGk7XG4gICAgICBtYXggPSBvcmdhbml6YXRpb24ucm93V2lkdGhbaV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHI7XG59O1xuXG4vKipcbiogVGhpcyBtZXRob2QgY2hlY2tzIHdoZXRoZXIgYWRkaW5nIGV4dHJhIHdpZHRoIHRvIHRoZSBvcmdhbml6YXRpb24gdmlvbGF0ZXNcbiogdGhlIGFzcGVjdCByYXRpbygxKSBvciBub3QuXG4qL1xuQ29TRUxheW91dC5wcm90b3R5cGUuY2FuQWRkSG9yaXpvbnRhbCA9IGZ1bmN0aW9uIChvcmdhbml6YXRpb24sIGV4dHJhV2lkdGgsIGV4dHJhSGVpZ2h0KSB7XG5cbiAgLy8gaWYgdGhlcmUgaXMgYW4gaWRlYWwgcm93IHdpZHRoIHNwZWNpZmllZCB1c2UgaXQgaW5zdGVhZCBvZiBjaGVja2luZyB0aGUgYXNwZWN0IHJhdGlvXG4gIGlmIChvcmdhbml6YXRpb24uaWRlYWxSb3dXaWR0aCkge1xuICAgIHZhciBsYXN0Um93SW5kZXggPSBvcmdhbml6YXRpb24ucm93cy5sZW5ndGggLSAxO1xuICAgIHZhciBsYXN0Um93V2lkdGggPSBvcmdhbml6YXRpb24ucm93V2lkdGhbbGFzdFJvd0luZGV4XTtcblxuICAgIC8vIGNoZWNrIGFuZCByZXR1cm4gaWYgaWRlYWwgcm93IHdpZHRoIHdpbGwgYmUgZXhjZWVkIGlmIHRoZSBub2RlIGlzIGFkZGVkIHRvIHRoZSByb3dcbiAgICByZXR1cm4gbGFzdFJvd1dpZHRoICsgZXh0cmFXaWR0aCArIG9yZ2FuaXphdGlvbi5ob3Jpem9udGFsUGFkZGluZyA8PSBvcmdhbml6YXRpb24uaWRlYWxSb3dXaWR0aDtcbiAgfVxuXG4gIHZhciBzcmkgPSB0aGlzLmdldFNob3J0ZXN0Um93SW5kZXgob3JnYW5pemF0aW9uKTtcblxuICBpZiAoc3JpIDwgMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIG1pbiA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtzcmldO1xuXG4gIGlmIChtaW4gKyBvcmdhbml6YXRpb24uaG9yaXpvbnRhbFBhZGRpbmcgKyBleHRyYVdpZHRoIDw9IG9yZ2FuaXphdGlvbi53aWR0aCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIGhEaWZmID0gMDtcblxuICAvLyBBZGRpbmcgdG8gYW4gZXhpc3Rpbmcgcm93XG4gIGlmIChvcmdhbml6YXRpb24ucm93SGVpZ2h0W3NyaV0gPCBleHRyYUhlaWdodCkge1xuICAgIGlmIChzcmkgPiAwKSBoRGlmZiA9IGV4dHJhSGVpZ2h0ICsgb3JnYW5pemF0aW9uLnZlcnRpY2FsUGFkZGluZyAtIG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbc3JpXTtcbiAgfVxuXG4gIHZhciBhZGRfdG9fcm93X3JhdGlvO1xuICBpZiAob3JnYW5pemF0aW9uLndpZHRoIC0gbWluID49IGV4dHJhV2lkdGggKyBvcmdhbml6YXRpb24uaG9yaXpvbnRhbFBhZGRpbmcpIHtcbiAgICBhZGRfdG9fcm93X3JhdGlvID0gKG9yZ2FuaXphdGlvbi5oZWlnaHQgKyBoRGlmZikgLyAobWluICsgZXh0cmFXaWR0aCArIG9yZ2FuaXphdGlvbi5ob3Jpem9udGFsUGFkZGluZyk7XG4gIH0gZWxzZSB7XG4gICAgYWRkX3RvX3Jvd19yYXRpbyA9IChvcmdhbml6YXRpb24uaGVpZ2h0ICsgaERpZmYpIC8gb3JnYW5pemF0aW9uLndpZHRoO1xuICB9XG5cbiAgLy8gQWRkaW5nIGEgbmV3IHJvdyBmb3IgdGhpcyBub2RlXG4gIGhEaWZmID0gZXh0cmFIZWlnaHQgKyBvcmdhbml6YXRpb24udmVydGljYWxQYWRkaW5nO1xuICB2YXIgYWRkX25ld19yb3dfcmF0aW87XG4gIGlmIChvcmdhbml6YXRpb24ud2lkdGggPCBleHRyYVdpZHRoKSB7XG4gICAgYWRkX25ld19yb3dfcmF0aW8gPSAob3JnYW5pemF0aW9uLmhlaWdodCArIGhEaWZmKSAvIGV4dHJhV2lkdGg7XG4gIH0gZWxzZSB7XG4gICAgYWRkX25ld19yb3dfcmF0aW8gPSAob3JnYW5pemF0aW9uLmhlaWdodCArIGhEaWZmKSAvIG9yZ2FuaXphdGlvbi53aWR0aDtcbiAgfVxuXG4gIGlmIChhZGRfbmV3X3Jvd19yYXRpbyA8IDEpIGFkZF9uZXdfcm93X3JhdGlvID0gMSAvIGFkZF9uZXdfcm93X3JhdGlvO1xuXG4gIGlmIChhZGRfdG9fcm93X3JhdGlvIDwgMSkgYWRkX3RvX3Jvd19yYXRpbyA9IDEgLyBhZGRfdG9fcm93X3JhdGlvO1xuXG4gIHJldHVybiBhZGRfdG9fcm93X3JhdGlvIDwgYWRkX25ld19yb3dfcmF0aW87XG59O1xuXG4vL0lmIG1vdmluZyB0aGUgbGFzdCBub2RlIGZyb20gdGhlIGxvbmdlc3Qgcm93IGFuZCBhZGRpbmcgaXQgdG8gdGhlIGxhc3Rcbi8vcm93IG1ha2VzIHRoZSBib3VuZGluZyBib3ggc21hbGxlciwgZG8gaXQuXG5Db1NFTGF5b3V0LnByb3RvdHlwZS5zaGlmdFRvTGFzdFJvdyA9IGZ1bmN0aW9uIChvcmdhbml6YXRpb24pIHtcbiAgdmFyIGxvbmdlc3QgPSB0aGlzLmdldExvbmdlc3RSb3dJbmRleChvcmdhbml6YXRpb24pO1xuICB2YXIgbGFzdCA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aC5sZW5ndGggLSAxO1xuICB2YXIgcm93ID0gb3JnYW5pemF0aW9uLnJvd3NbbG9uZ2VzdF07XG4gIHZhciBub2RlID0gcm93W3Jvdy5sZW5ndGggLSAxXTtcblxuICB2YXIgZGlmZiA9IG5vZGUud2lkdGggKyBvcmdhbml6YXRpb24uaG9yaXpvbnRhbFBhZGRpbmc7XG5cbiAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIG9uIHRoZSBsYXN0IHJvd1xuICBpZiAob3JnYW5pemF0aW9uLndpZHRoIC0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW2xhc3RdID4gZGlmZiAmJiBsb25nZXN0ICE9IGxhc3QpIHtcbiAgICAvLyBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgbG9uZ2VzdCByb3dcbiAgICByb3cuc3BsaWNlKC0xLCAxKTtcblxuICAgIC8vIFB1c2ggaXQgdG8gdGhlIGxhc3Qgcm93XG4gICAgb3JnYW5pemF0aW9uLnJvd3NbbGFzdF0ucHVzaChub2RlKTtcblxuICAgIG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtsb25nZXN0XSA9IG9yZ2FuaXphdGlvbi5yb3dXaWR0aFtsb25nZXN0XSAtIGRpZmY7XG4gICAgb3JnYW5pemF0aW9uLnJvd1dpZHRoW2xhc3RdID0gb3JnYW5pemF0aW9uLnJvd1dpZHRoW2xhc3RdICsgZGlmZjtcbiAgICBvcmdhbml6YXRpb24ud2lkdGggPSBvcmdhbml6YXRpb24ucm93V2lkdGhbaW5zdGFuY2UuZ2V0TG9uZ2VzdFJvd0luZGV4KG9yZ2FuaXphdGlvbildO1xuXG4gICAgLy8gVXBkYXRlIGhlaWdodHMgb2YgdGhlIG9yZ2FuaXphdGlvblxuICAgIHZhciBtYXhIZWlnaHQgPSBOdW1iZXIuTUlOX1ZBTFVFO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocm93W2ldLmhlaWdodCA+IG1heEhlaWdodCkgbWF4SGVpZ2h0ID0gcm93W2ldLmhlaWdodDtcbiAgICB9XG4gICAgaWYgKGxvbmdlc3QgPiAwKSBtYXhIZWlnaHQgKz0gb3JnYW5pemF0aW9uLnZlcnRpY2FsUGFkZGluZztcblxuICAgIHZhciBwcmV2VG90YWwgPSBvcmdhbml6YXRpb24ucm93SGVpZ2h0W2xvbmdlc3RdICsgb3JnYW5pemF0aW9uLnJvd0hlaWdodFtsYXN0XTtcblxuICAgIG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbbG9uZ2VzdF0gPSBtYXhIZWlnaHQ7XG4gICAgaWYgKG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbbGFzdF0gPCBub2RlLmhlaWdodCArIG9yZ2FuaXphdGlvbi52ZXJ0aWNhbFBhZGRpbmcpIG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbbGFzdF0gPSBub2RlLmhlaWdodCArIG9yZ2FuaXphdGlvbi52ZXJ0aWNhbFBhZGRpbmc7XG5cbiAgICB2YXIgZmluYWxUb3RhbCA9IG9yZ2FuaXphdGlvbi5yb3dIZWlnaHRbbG9uZ2VzdF0gKyBvcmdhbml6YXRpb24ucm93SGVpZ2h0W2xhc3RdO1xuICAgIG9yZ2FuaXphdGlvbi5oZWlnaHQgKz0gZmluYWxUb3RhbCAtIHByZXZUb3RhbDtcblxuICAgIHRoaXMuc2hpZnRUb0xhc3RSb3cob3JnYW5pemF0aW9uKTtcbiAgfVxufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUudGlsaW5nUHJlTGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAoQ29TRUNvbnN0YW50cy5USUxFKSB7XG4gICAgLy8gRmluZCB6ZXJvIGRlZ3JlZSBub2RlcyBhbmQgY3JlYXRlIGEgY29tcG91bmQgZm9yIGVhY2ggbGV2ZWxcbiAgICB0aGlzLmdyb3VwWmVyb0RlZ3JlZU1lbWJlcnMoKTtcbiAgICAvLyBUaWxlIGFuZCBjbGVhciBjaGlsZHJlbiBvZiBlYWNoIGNvbXBvdW5kXG4gICAgdGhpcy5jbGVhckNvbXBvdW5kcygpO1xuICAgIC8vIFNlcGFyYXRlbHkgdGlsZSBhbmQgY2xlYXIgemVybyBkZWdyZWUgbm9kZXMgZm9yIGVhY2ggbGV2ZWxcbiAgICB0aGlzLmNsZWFyWmVyb0RlZ3JlZU1lbWJlcnMoKTtcbiAgfVxufTtcblxuQ29TRUxheW91dC5wcm90b3R5cGUudGlsaW5nUG9zdExheW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKENvU0VDb25zdGFudHMuVElMRSkge1xuICAgIHRoaXMucmVwb3B1bGF0ZVplcm9EZWdyZWVNZW1iZXJzKCk7XG4gICAgdGhpcy5yZXBvcHVsYXRlQ29tcG91bmRzKCk7XG4gIH1cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZWN0aW9uOiBUcmVlIFJlZHVjdGlvbiBtZXRob2RzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVkdWNlIHRyZWVzIFxuQ29TRUxheW91dC5wcm90b3R5cGUucmVkdWNlVHJlZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwcnVuZWROb2Rlc0FsbCA9IFtdO1xuICB2YXIgY29udGFpbnNMZWFmID0gdHJ1ZTtcbiAgdmFyIG5vZGU7XG5cbiAgd2hpbGUgKGNvbnRhaW5zTGVhZikge1xuICAgIHZhciBhbGxOb2RlcyA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbE5vZGVzKCk7XG4gICAgdmFyIHBydW5lZE5vZGVzSW5TdGVwVGVtcCA9IFtdO1xuICAgIGNvbnRhaW5zTGVhZiA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbm9kZSA9IGFsbE5vZGVzW2ldO1xuICAgICAgaWYgKG5vZGUuZ2V0RWRnZXMoKS5sZW5ndGggPT0gMSAmJiAhbm9kZS5nZXRFZGdlcygpWzBdLmlzSW50ZXJHcmFwaCAmJiBub2RlLmdldENoaWxkKCkgPT0gbnVsbCkge1xuICAgICAgICBpZiAoQ29TRUNvbnN0YW50cy5QVVJFX0lOQ1JFTUVOVEFMKSB7XG4gICAgICAgICAgdmFyIG90aGVyRW5kID0gbm9kZS5nZXRFZGdlcygpWzBdLmdldE90aGVyRW5kKG5vZGUpO1xuICAgICAgICAgIHZhciByZWxhdGl2ZVBvc2l0aW9uID0gbmV3IERpbWVuc2lvbkQobm9kZS5nZXRDZW50ZXJYKCkgLSBvdGhlckVuZC5nZXRDZW50ZXJYKCksIG5vZGUuZ2V0Q2VudGVyWSgpIC0gb3RoZXJFbmQuZ2V0Q2VudGVyWSgpKTtcbiAgICAgICAgICBwcnVuZWROb2Rlc0luU3RlcFRlbXAucHVzaChbbm9kZSwgbm9kZS5nZXRFZGdlcygpWzBdLCBub2RlLmdldE93bmVyKCksIHJlbGF0aXZlUG9zaXRpb25dKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcnVuZWROb2Rlc0luU3RlcFRlbXAucHVzaChbbm9kZSwgbm9kZS5nZXRFZGdlcygpWzBdLCBub2RlLmdldE93bmVyKCldKTtcbiAgICAgICAgfVxuICAgICAgICBjb250YWluc0xlYWYgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29udGFpbnNMZWFmID09IHRydWUpIHtcbiAgICAgIHZhciBwcnVuZWROb2Rlc0luU3RlcCA9IFtdO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcnVuZWROb2Rlc0luU3RlcFRlbXAubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHBydW5lZE5vZGVzSW5TdGVwVGVtcFtqXVswXS5nZXRFZGdlcygpLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgcHJ1bmVkTm9kZXNJblN0ZXAucHVzaChwcnVuZWROb2Rlc0luU3RlcFRlbXBbal0pO1xuICAgICAgICAgIHBydW5lZE5vZGVzSW5TdGVwVGVtcFtqXVswXS5nZXRPd25lcigpLnJlbW92ZShwcnVuZWROb2Rlc0luU3RlcFRlbXBbal1bMF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwcnVuZWROb2Rlc0FsbC5wdXNoKHBydW5lZE5vZGVzSW5TdGVwKTtcbiAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsTm9kZXMoKTtcbiAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsRWRnZXMoKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5wcnVuZWROb2Rlc0FsbCA9IHBydW5lZE5vZGVzQWxsO1xufTtcblxuLy8gR3JvdyB0cmVlIG9uZSBzdGVwIFxuQ29TRUxheW91dC5wcm90b3R5cGUuZ3Jvd1RyZWUgPSBmdW5jdGlvbiAocHJ1bmVkTm9kZXNBbGwpIHtcbiAgdmFyIGxlbmd0aE9mUHJ1bmVkTm9kZXNJblN0ZXAgPSBwcnVuZWROb2Rlc0FsbC5sZW5ndGg7XG4gIHZhciBwcnVuZWROb2Rlc0luU3RlcCA9IHBydW5lZE5vZGVzQWxsW2xlbmd0aE9mUHJ1bmVkTm9kZXNJblN0ZXAgLSAxXTtcblxuICB2YXIgbm9kZURhdGE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJ1bmVkTm9kZXNJblN0ZXAubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlRGF0YSA9IHBydW5lZE5vZGVzSW5TdGVwW2ldO1xuXG4gICAgdGhpcy5maW5kUGxhY2Vmb3JQcnVuZWROb2RlKG5vZGVEYXRhKTtcblxuICAgIG5vZGVEYXRhWzJdLmFkZChub2RlRGF0YVswXSk7XG4gICAgbm9kZURhdGFbMl0uYWRkKG5vZGVEYXRhWzFdLCBub2RlRGF0YVsxXS5zb3VyY2UsIG5vZGVEYXRhWzFdLnRhcmdldCk7XG4gIH1cblxuICBwcnVuZWROb2Rlc0FsbC5zcGxpY2UocHJ1bmVkTm9kZXNBbGwubGVuZ3RoIC0gMSwgMSk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsTm9kZXMoKTtcbiAgdGhpcy5ncmFwaE1hbmFnZXIucmVzZXRBbGxFZGdlcygpO1xufTtcblxuLy8gRmluZCBhbiBhcHByb3ByaWF0ZSBwb3NpdGlvbiB0byByZXBsYWNlIHBydW5lZCBub2RlLCB0aGlzIG1ldGhvZCBjYW4gYmUgaW1wcm92ZWRcbkNvU0VMYXlvdXQucHJvdG90eXBlLmZpbmRQbGFjZWZvclBydW5lZE5vZGUgPSBmdW5jdGlvbiAobm9kZURhdGEpIHtcblxuICB2YXIgZ3JpZEZvclBydW5lZE5vZGU7XG4gIHZhciBub2RlVG9Db25uZWN0O1xuICB2YXIgcHJ1bmVkTm9kZSA9IG5vZGVEYXRhWzBdO1xuICBpZiAocHJ1bmVkTm9kZSA9PSBub2RlRGF0YVsxXS5zb3VyY2UpIHtcbiAgICBub2RlVG9Db25uZWN0ID0gbm9kZURhdGFbMV0udGFyZ2V0O1xuICB9IGVsc2Uge1xuICAgIG5vZGVUb0Nvbm5lY3QgPSBub2RlRGF0YVsxXS5zb3VyY2U7XG4gIH1cblxuICBpZiAoQ29TRUNvbnN0YW50cy5QVVJFX0lOQ1JFTUVOVEFMKSB7XG4gICAgcHJ1bmVkTm9kZS5zZXRDZW50ZXIobm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJYKCkgKyBub2RlRGF0YVszXS5nZXRXaWR0aCgpLCBub2RlVG9Db25uZWN0LmdldENlbnRlclkoKSArIG5vZGVEYXRhWzNdLmdldEhlaWdodCgpKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc3RhcnRHcmlkWCA9IG5vZGVUb0Nvbm5lY3Quc3RhcnRYO1xuICAgIHZhciBmaW5pc2hHcmlkWCA9IG5vZGVUb0Nvbm5lY3QuZmluaXNoWDtcbiAgICB2YXIgc3RhcnRHcmlkWSA9IG5vZGVUb0Nvbm5lY3Quc3RhcnRZO1xuICAgIHZhciBmaW5pc2hHcmlkWSA9IG5vZGVUb0Nvbm5lY3QuZmluaXNoWTtcblxuICAgIHZhciB1cE5vZGVDb3VudCA9IDA7XG4gICAgdmFyIGRvd25Ob2RlQ291bnQgPSAwO1xuICAgIHZhciByaWdodE5vZGVDb3VudCA9IDA7XG4gICAgdmFyIGxlZnROb2RlQ291bnQgPSAwO1xuICAgIHZhciBjb250cm9sUmVnaW9ucyA9IFt1cE5vZGVDb3VudCwgcmlnaHROb2RlQ291bnQsIGRvd25Ob2RlQ291bnQsIGxlZnROb2RlQ291bnRdO1xuXG4gICAgaWYgKHN0YXJ0R3JpZFkgPiAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gc3RhcnRHcmlkWDsgaSA8PSBmaW5pc2hHcmlkWDsgaSsrKSB7XG4gICAgICAgIGNvbnRyb2xSZWdpb25zWzBdICs9IHRoaXMuZ3JpZFtpXVtzdGFydEdyaWRZIC0gMV0ubGVuZ3RoICsgdGhpcy5ncmlkW2ldW3N0YXJ0R3JpZFldLmxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaW5pc2hHcmlkWCA8IHRoaXMuZ3JpZC5sZW5ndGggLSAxKSB7XG4gICAgICBmb3IgKHZhciBpID0gc3RhcnRHcmlkWTsgaSA8PSBmaW5pc2hHcmlkWTsgaSsrKSB7XG4gICAgICAgIGNvbnRyb2xSZWdpb25zWzFdICs9IHRoaXMuZ3JpZFtmaW5pc2hHcmlkWCArIDFdW2ldLmxlbmd0aCArIHRoaXMuZ3JpZFtmaW5pc2hHcmlkWF1baV0ubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpbmlzaEdyaWRZIDwgdGhpcy5ncmlkWzBdLmxlbmd0aCAtIDEpIHtcbiAgICAgIGZvciAodmFyIGkgPSBzdGFydEdyaWRYOyBpIDw9IGZpbmlzaEdyaWRYOyBpKyspIHtcbiAgICAgICAgY29udHJvbFJlZ2lvbnNbMl0gKz0gdGhpcy5ncmlkW2ldW2ZpbmlzaEdyaWRZICsgMV0ubGVuZ3RoICsgdGhpcy5ncmlkW2ldW2ZpbmlzaEdyaWRZXS5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhcnRHcmlkWCA+IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSBzdGFydEdyaWRZOyBpIDw9IGZpbmlzaEdyaWRZOyBpKyspIHtcbiAgICAgICAgY29udHJvbFJlZ2lvbnNbM10gKz0gdGhpcy5ncmlkW3N0YXJ0R3JpZFggLSAxXVtpXS5sZW5ndGggKyB0aGlzLmdyaWRbc3RhcnRHcmlkWF1baV0ubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIG1pbiA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICAgIHZhciBtaW5Db3VudDtcbiAgICB2YXIgbWluSW5kZXg7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb250cm9sUmVnaW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGNvbnRyb2xSZWdpb25zW2pdIDwgbWluKSB7XG4gICAgICAgIG1pbiA9IGNvbnRyb2xSZWdpb25zW2pdO1xuICAgICAgICBtaW5Db3VudCA9IDE7XG4gICAgICAgIG1pbkluZGV4ID0gajtcbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbFJlZ2lvbnNbal0gPT0gbWluKSB7XG4gICAgICAgIG1pbkNvdW50Kys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1pbkNvdW50ID09IDMgJiYgbWluID09IDApIHtcbiAgICAgIGlmIChjb250cm9sUmVnaW9uc1swXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzFdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMl0gPT0gMCkge1xuICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDE7XG4gICAgICB9IGVsc2UgaWYgKGNvbnRyb2xSZWdpb25zWzBdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbMV0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1szXSA9PSAwKSB7XG4gICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbFJlZ2lvbnNbMF0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1syXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzNdID09IDApIHtcbiAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAzO1xuICAgICAgfSBlbHNlIGlmIChjb250cm9sUmVnaW9uc1sxXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzJdID09IDAgJiYgY29udHJvbFJlZ2lvbnNbM10gPT0gMCkge1xuICAgICAgICBncmlkRm9yUHJ1bmVkTm9kZSA9IDI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtaW5Db3VudCA9PSAyICYmIG1pbiA9PSAwKSB7XG4gICAgICB2YXIgcmFuZG9tID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMik7XG4gICAgICBpZiAoY29udHJvbFJlZ2lvbnNbMF0gPT0gMCAmJiBjb250cm9sUmVnaW9uc1sxXSA9PSAwKSB7XG4gICAgICAgIDtcbiAgICAgICAgaWYgKHJhbmRvbSA9PSAwKSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb250cm9sUmVnaW9uc1swXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzJdID09IDApIHtcbiAgICAgICAgaWYgKHJhbmRvbSA9PSAwKSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb250cm9sUmVnaW9uc1swXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzNdID09IDApIHtcbiAgICAgICAgaWYgKHJhbmRvbSA9PSAwKSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb250cm9sUmVnaW9uc1sxXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzJdID09IDApIHtcbiAgICAgICAgaWYgKHJhbmRvbSA9PSAwKSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb250cm9sUmVnaW9uc1sxXSA9PSAwICYmIGNvbnRyb2xSZWdpb25zWzNdID09IDApIHtcbiAgICAgICAgaWYgKHJhbmRvbSA9PSAwKSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHJhbmRvbSA9PSAwKSB7XG4gICAgICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gMztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobWluQ291bnQgPT0gNCAmJiBtaW4gPT0gMCkge1xuICAgICAgdmFyIHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDQpO1xuICAgICAgZ3JpZEZvclBydW5lZE5vZGUgPSByYW5kb207XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyaWRGb3JQcnVuZWROb2RlID0gbWluSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKGdyaWRGb3JQcnVuZWROb2RlID09IDApIHtcbiAgICAgIHBydW5lZE5vZGUuc2V0Q2VudGVyKG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWCgpLCBub2RlVG9Db25uZWN0LmdldENlbnRlclkoKSAtIG5vZGVUb0Nvbm5lY3QuZ2V0SGVpZ2h0KCkgLyAyIC0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCAtIHBydW5lZE5vZGUuZ2V0SGVpZ2h0KCkgLyAyKTtcbiAgICB9IGVsc2UgaWYgKGdyaWRGb3JQcnVuZWROb2RlID09IDEpIHtcbiAgICAgIHBydW5lZE5vZGUuc2V0Q2VudGVyKG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWCgpICsgbm9kZVRvQ29ubmVjdC5nZXRXaWR0aCgpIC8gMiArIEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggKyBwcnVuZWROb2RlLmdldFdpZHRoKCkgLyAyLCBub2RlVG9Db25uZWN0LmdldENlbnRlclkoKSk7XG4gICAgfSBlbHNlIGlmIChncmlkRm9yUHJ1bmVkTm9kZSA9PSAyKSB7XG4gICAgICBwcnVuZWROb2RlLnNldENlbnRlcihub2RlVG9Db25uZWN0LmdldENlbnRlclgoKSwgbm9kZVRvQ29ubmVjdC5nZXRDZW50ZXJZKCkgKyBub2RlVG9Db25uZWN0LmdldEhlaWdodCgpIC8gMiArIEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggKyBwcnVuZWROb2RlLmdldEhlaWdodCgpIC8gMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBydW5lZE5vZGUuc2V0Q2VudGVyKG5vZGVUb0Nvbm5lY3QuZ2V0Q2VudGVyWCgpIC0gbm9kZVRvQ29ubmVjdC5nZXRXaWR0aCgpIC8gMiAtIEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggLSBwcnVuZWROb2RlLmdldFdpZHRoKCkgLyAyLCBub2RlVG9Db25uZWN0LmdldENlbnRlclkoKSk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvU0VMYXlvdXQ7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA5OTE6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG52YXIgRkRMYXlvdXROb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLkZETGF5b3V0Tm9kZTtcbnZhciBJTWF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5JTWF0aDtcblxuZnVuY3Rpb24gQ29TRU5vZGUoZ20sIGxvYywgc2l6ZSwgdk5vZGUpIHtcbiAgRkRMYXlvdXROb2RlLmNhbGwodGhpcywgZ20sIGxvYywgc2l6ZSwgdk5vZGUpO1xufVxuXG5Db1NFTm9kZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEZETGF5b3V0Tm9kZS5wcm90b3R5cGUpO1xuZm9yICh2YXIgcHJvcCBpbiBGRExheW91dE5vZGUpIHtcbiAgQ29TRU5vZGVbcHJvcF0gPSBGRExheW91dE5vZGVbcHJvcF07XG59XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5jYWxjdWxhdGVEaXNwbGFjZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsYXlvdXQgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRMYXlvdXQoKTtcbiAgLy8gdGhpcyBjaGVjayBpcyBmb3IgY29tcG91bmQgbm9kZXMgdGhhdCBjb250YWluIGZpeGVkIG5vZGVzXG4gIGlmICh0aGlzLmdldENoaWxkKCkgIT0gbnVsbCAmJiB0aGlzLmZpeGVkTm9kZVdlaWdodCkge1xuICAgIHRoaXMuZGlzcGxhY2VtZW50WCArPSBsYXlvdXQuY29vbGluZ0ZhY3RvciAqICh0aGlzLnNwcmluZ0ZvcmNlWCArIHRoaXMucmVwdWxzaW9uRm9yY2VYICsgdGhpcy5ncmF2aXRhdGlvbkZvcmNlWCkgLyB0aGlzLmZpeGVkTm9kZVdlaWdodDtcbiAgICB0aGlzLmRpc3BsYWNlbWVudFkgKz0gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiAodGhpcy5zcHJpbmdGb3JjZVkgKyB0aGlzLnJlcHVsc2lvbkZvcmNlWSArIHRoaXMuZ3Jhdml0YXRpb25Gb3JjZVkpIC8gdGhpcy5maXhlZE5vZGVXZWlnaHQ7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5kaXNwbGFjZW1lbnRYICs9IGxheW91dC5jb29saW5nRmFjdG9yICogKHRoaXMuc3ByaW5nRm9yY2VYICsgdGhpcy5yZXB1bHNpb25Gb3JjZVggKyB0aGlzLmdyYXZpdGF0aW9uRm9yY2VYKSAvIHRoaXMubm9PZkNoaWxkcmVuO1xuICAgIHRoaXMuZGlzcGxhY2VtZW50WSArPSBsYXlvdXQuY29vbGluZ0ZhY3RvciAqICh0aGlzLnNwcmluZ0ZvcmNlWSArIHRoaXMucmVwdWxzaW9uRm9yY2VZICsgdGhpcy5ncmF2aXRhdGlvbkZvcmNlWSkgLyB0aGlzLm5vT2ZDaGlsZHJlbjtcbiAgfVxuXG4gIGlmIChNYXRoLmFicyh0aGlzLmRpc3BsYWNlbWVudFgpID4gbGF5b3V0LmNvb2xpbmdGYWN0b3IgKiBsYXlvdXQubWF4Tm9kZURpc3BsYWNlbWVudCkge1xuICAgIHRoaXMuZGlzcGxhY2VtZW50WCA9IGxheW91dC5jb29saW5nRmFjdG9yICogbGF5b3V0Lm1heE5vZGVEaXNwbGFjZW1lbnQgKiBJTWF0aC5zaWduKHRoaXMuZGlzcGxhY2VtZW50WCk7XG4gIH1cblxuICBpZiAoTWF0aC5hYnModGhpcy5kaXNwbGFjZW1lbnRZKSA+IGxheW91dC5jb29saW5nRmFjdG9yICogbGF5b3V0Lm1heE5vZGVEaXNwbGFjZW1lbnQpIHtcbiAgICB0aGlzLmRpc3BsYWNlbWVudFkgPSBsYXlvdXQuY29vbGluZ0ZhY3RvciAqIGxheW91dC5tYXhOb2RlRGlzcGxhY2VtZW50ICogSU1hdGguc2lnbih0aGlzLmRpc3BsYWNlbWVudFkpO1xuICB9XG5cbiAgLy8gbm9uLWVtcHR5IGNvbXBvdW5kIG5vZGUsIHByb3BvZ2F0ZSBtb3ZlbWVudCB0byBjaGlsZHJlbiBhcyB3ZWxsXG4gIGlmICh0aGlzLmNoaWxkICYmIHRoaXMuY2hpbGQuZ2V0Tm9kZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgdGhpcy5wcm9wb2dhdGVEaXNwbGFjZW1lbnRUb0NoaWxkcmVuKHRoaXMuZGlzcGxhY2VtZW50WCwgdGhpcy5kaXNwbGFjZW1lbnRZKTtcbiAgfVxufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLnByb3BvZ2F0ZURpc3BsYWNlbWVudFRvQ2hpbGRyZW4gPSBmdW5jdGlvbiAoZFgsIGRZKSB7XG4gIHZhciBub2RlcyA9IHRoaXMuZ2V0Q2hpbGQoKS5nZXROb2RlcygpO1xuICB2YXIgbm9kZTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICBpZiAobm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICAgIG5vZGUuZGlzcGxhY2VtZW50WCArPSBkWDtcbiAgICAgIG5vZGUuZGlzcGxhY2VtZW50WSArPSBkWTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5wcm9wb2dhdGVEaXNwbGFjZW1lbnRUb0NoaWxkcmVuKGRYLCBkWSk7XG4gICAgfVxuICB9XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUubW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGxheW91dCA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldExheW91dCgpO1xuXG4gIC8vIGEgc2ltcGxlIG5vZGUgb3IgYW4gZW1wdHkgY29tcG91bmQgbm9kZSwgbW92ZSBpdFxuICBpZiAodGhpcy5jaGlsZCA9PSBudWxsIHx8IHRoaXMuY2hpbGQuZ2V0Tm9kZXMoKS5sZW5ndGggPT0gMCkge1xuICAgIHRoaXMubW92ZUJ5KHRoaXMuZGlzcGxhY2VtZW50WCwgdGhpcy5kaXNwbGFjZW1lbnRZKTtcblxuICAgIGxheW91dC50b3RhbERpc3BsYWNlbWVudCArPSBNYXRoLmFicyh0aGlzLmRpc3BsYWNlbWVudFgpICsgTWF0aC5hYnModGhpcy5kaXNwbGFjZW1lbnRZKTtcbiAgfVxuXG4gIHRoaXMuc3ByaW5nRm9yY2VYID0gMDtcbiAgdGhpcy5zcHJpbmdGb3JjZVkgPSAwO1xuICB0aGlzLnJlcHVsc2lvbkZvcmNlWCA9IDA7XG4gIHRoaXMucmVwdWxzaW9uRm9yY2VZID0gMDtcbiAgdGhpcy5ncmF2aXRhdGlvbkZvcmNlWCA9IDA7XG4gIHRoaXMuZ3Jhdml0YXRpb25Gb3JjZVkgPSAwO1xuICB0aGlzLmRpc3BsYWNlbWVudFggPSAwO1xuICB0aGlzLmRpc3BsYWNlbWVudFkgPSAwO1xufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLnNldFByZWQxID0gZnVuY3Rpb24gKHByZWQxKSB7XG4gIHRoaXMucHJlZDEgPSBwcmVkMTtcbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5nZXRQcmVkMSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHByZWQxO1xufTtcblxuQ29TRU5vZGUucHJvdG90eXBlLmdldFByZWQyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcHJlZDI7XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUuc2V0TmV4dCA9IGZ1bmN0aW9uIChuZXh0KSB7XG4gIHRoaXMubmV4dCA9IG5leHQ7XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUuZ2V0TmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5leHQ7XG59O1xuXG5Db1NFTm9kZS5wcm90b3R5cGUuc2V0UHJvY2Vzc2VkID0gZnVuY3Rpb24gKHByb2Nlc3NlZCkge1xuICB0aGlzLnByb2Nlc3NlZCA9IHByb2Nlc3NlZDtcbn07XG5cbkNvU0VOb2RlLnByb3RvdHlwZS5pc1Byb2Nlc3NlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHByb2Nlc3NlZDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ29TRU5vZGU7XG5cbi8qKiovIH0pLFxuXG4vKioqLyA5MDI6XG4vKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblxudmFyIENvU0VDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgwNik7XG52YXIgTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5MaW5rZWRMaXN0O1xudmFyIE1hdHJpeCA9IF9fd2VicGFja19yZXF1aXJlX18oNTUxKS5NYXRyaXg7XG52YXIgU1ZEID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NTEpLlNWRDtcblxuZnVuY3Rpb24gQ29uc3RyYWludEhhbmRsZXIoKSB7fVxuXG5Db25zdHJhaW50SGFuZGxlci5oYW5kbGVDb25zdHJhaW50cyA9IGZ1bmN0aW9uIChsYXlvdXQpIHtcbiAgLy8gIGxldCBsYXlvdXQgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRMYXlvdXQoKTtcblxuICAvLyBnZXQgY29uc3RyYWludHMgZnJvbSBsYXlvdXRcbiAgdmFyIGNvbnN0cmFpbnRzID0ge307XG4gIGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQgPSBsYXlvdXQuY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludDtcbiAgY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludCA9IGxheW91dC5jb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50O1xuICBjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQgPSBsYXlvdXQuY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50O1xuXG4gIHZhciBpZFRvTm9kZU1hcCA9IG5ldyBNYXAoKTtcbiAgdmFyIG5vZGVJbmRleGVzID0gbmV3IE1hcCgpO1xuICB2YXIgeENvb3JkcyA9IFtdO1xuICB2YXIgeUNvb3JkcyA9IFtdO1xuXG4gIHZhciBhbGxOb2RlcyA9IGxheW91dC5nZXRBbGxOb2RlcygpO1xuICB2YXIgaW5kZXggPSAwO1xuICAvLyBmaWxsIGluZGV4IG1hcCBhbmQgY29vcmRpbmF0ZXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gYWxsTm9kZXNbaV07XG4gICAgaWYgKG5vZGUuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgICBub2RlSW5kZXhlcy5zZXQobm9kZS5pZCwgaW5kZXgrKyk7XG4gICAgICB4Q29vcmRzLnB1c2gobm9kZS5nZXRDZW50ZXJYKCkpO1xuICAgICAgeUNvb3Jkcy5wdXNoKG5vZGUuZ2V0Q2VudGVyWSgpKTtcbiAgICAgIGlkVG9Ob2RlTWFwLnNldChub2RlLmlkLCBub2RlKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGVyZSBleGlzdHMgcmVsYXRpdmUgcGxhY2VtZW50IGNvbnN0cmFpbnQgd2l0aG91dCBnYXAgdmFsdWUsIHNldCBpdCB0byBkZWZhdWx0IFxuICBpZiAoY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KSB7XG4gICAgY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgIGlmICghY29uc3RyYWludC5nYXAgJiYgY29uc3RyYWludC5nYXAgIT0gMCkge1xuICAgICAgICBpZiAoY29uc3RyYWludC5sZWZ0KSB7XG4gICAgICAgICAgY29uc3RyYWludC5nYXAgPSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggKyBpZFRvTm9kZU1hcC5nZXQoY29uc3RyYWludC5sZWZ0KS5nZXRXaWR0aCgpIC8gMiArIGlkVG9Ob2RlTWFwLmdldChjb25zdHJhaW50LnJpZ2h0KS5nZXRXaWR0aCgpIC8gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdHJhaW50LmdhcCA9IENvU0VDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSCArIGlkVG9Ob2RlTWFwLmdldChjb25zdHJhaW50LnRvcCkuZ2V0SGVpZ2h0KCkgLyAyICsgaWRUb05vZGVNYXAuZ2V0KGNvbnN0cmFpbnQuYm90dG9tKS5nZXRIZWlnaHQoKSAvIDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qIGF1eGlsaWFyeSBmdW5jdGlvbnMgKi9cblxuICAvLyBjYWxjdWxhdGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBwb3NpdGlvbiBvYmplY3RzXG4gIHZhciBjYWxjdWxhdGVQb3NpdGlvbkRpZmYgPSBmdW5jdGlvbiBjYWxjdWxhdGVQb3NpdGlvbkRpZmYocG9zMSwgcG9zMikge1xuICAgIHJldHVybiB7IHg6IHBvczEueCAtIHBvczIueCwgeTogcG9zMS55IC0gcG9zMi55IH07XG4gIH07XG5cbiAgLy8gY2FsY3VsYXRlIGF2ZXJhZ2UgcG9zaXRpb24gb2YgdGhlIG5vZGVzXG4gIHZhciBjYWxjdWxhdGVBdmdQb3NpdGlvbiA9IGZ1bmN0aW9uIGNhbGN1bGF0ZUF2Z1Bvc2l0aW9uKG5vZGVJZFNldCkge1xuICAgIHZhciB4UG9zU3VtID0gMDtcbiAgICB2YXIgeVBvc1N1bSA9IDA7XG4gICAgbm9kZUlkU2V0LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgeFBvc1N1bSArPSB4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXTtcbiAgICAgIHlQb3NTdW0gKz0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV07XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyB4OiB4UG9zU3VtIC8gbm9kZUlkU2V0LnNpemUsIHk6IHlQb3NTdW0gLyBub2RlSWRTZXQuc2l6ZSB9O1xuICB9O1xuXG4gIC8vIGZpbmQgYW4gYXBwcm9wcmlhdGUgcG9zaXRpb25pbmcgZm9yIHRoZSBub2RlcyBpbiBhIGdpdmVuIGdyYXBoIGFjY29yZGluZyB0byByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludHNcbiAgLy8gdGhpcyBmdW5jdGlvbiBhbHNvIHRha2VzIHRoZSBmaXhlZCBub2RlcyBhbmQgYWxpZ25tZW50IGNvbnN0cmFpbnRzIGludG8gYWNjb3VudFxuICAvLyBncmFwaDogZGFnIHRvIGJlIGV2YWx1YXRlZCwgZGlyZWN0aW9uOiBcImhvcml6b250YWxcIiBvciBcInZlcnRpY2FsXCIsIFxuICAvLyBmaXhlZE5vZGVzOiBzZXQgb2YgZml4ZWQgbm9kZXMgdG8gY29uc2lkZXIgZHVyaW5nIGV2YWx1YXRpb24sIGR1bW15UG9zaXRpb25zOiBhcHByb3ByaWF0ZSBjb29yZGluYXRlcyBvZiB0aGUgZHVtbXkgbm9kZXMgIFxuICB2YXIgZmluZEFwcHJvcHJpYXRlUG9zaXRpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudCA9IGZ1bmN0aW9uIGZpbmRBcHByb3ByaWF0ZVBvc2l0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQoZ3JhcGgsIGRpcmVjdGlvbiwgZml4ZWROb2RlcywgZHVtbXlQb3NpdGlvbnMsIGNvbXBvbmVudFNvdXJjZXMpIHtcblxuICAgIC8vIGZpbmQgdW5pb24gb2YgdHdvIHNldHNcbiAgICBmdW5jdGlvbiBzZXRVbmlvbihzZXRBLCBzZXRCKSB7XG4gICAgICB2YXIgdW5pb24gPSBuZXcgU2V0KHNldEEpO1xuICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG4gICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIF9pdGVyYXRvciA9IHNldEJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gKF9zdGVwID0gX2l0ZXJhdG9yLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlKSB7XG4gICAgICAgICAgdmFyIGVsZW0gPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgIHVuaW9uLmFkZChlbGVtKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9kaWRJdGVyYXRvckVycm9yID0gdHJ1ZTtcbiAgICAgICAgX2l0ZXJhdG9yRXJyb3IgPSBlcnI7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3IucmV0dXJuKSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmlvbjtcbiAgICB9XG5cbiAgICAvLyBmaW5kIGluZGVncmVlIGNvdW50IGZvciBlYWNoIG5vZGVcbiAgICB2YXIgaW5EZWdyZWVzID0gbmV3IE1hcCgpO1xuXG4gICAgZ3JhcGguZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgaW5EZWdyZWVzLnNldChrZXksIDApO1xuICAgIH0pO1xuICAgIGdyYXBoLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGFkamFjZW50KSB7XG4gICAgICAgIGluRGVncmVlcy5zZXQoYWRqYWNlbnQuaWQsIGluRGVncmVlcy5nZXQoYWRqYWNlbnQuaWQpICsgMSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHZhciBwb3NpdGlvbk1hcCA9IG5ldyBNYXAoKTsgLy8ga2VlcHMgdGhlIHBvc2l0aW9uIGZvciBlYWNoIG5vZGVcbiAgICB2YXIgcGFzdE1hcCA9IG5ldyBNYXAoKTsgLy8ga2VlcHMgdGhlIHByZWRlY2Vzc29ycyhwYXN0KSBvZiBhIG5vZGVcbiAgICB2YXIgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpO1xuICAgIGluRGVncmVlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAodmFsdWUgPT0gMCkge1xuICAgICAgICBxdWV1ZS5wdXNoKGtleSk7XG4gICAgICAgIGlmICghZml4ZWROb2Rlcykge1xuICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gXCJob3Jpem9udGFsXCIpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChrZXksIG5vZGVJbmRleGVzLmhhcyhrZXkpID8geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoa2V5KV0gOiBkdW1teVBvc2l0aW9ucy5nZXQoa2V5KSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChrZXksIG5vZGVJbmRleGVzLmhhcyhrZXkpID8geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoa2V5KV0gOiBkdW1teVBvc2l0aW9ucy5nZXQoa2V5KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3NpdGlvbk1hcC5zZXQoa2V5LCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpO1xuICAgICAgfVxuICAgICAgaWYgKGZpeGVkTm9kZXMpIHtcbiAgICAgICAgcGFzdE1hcC5zZXQoa2V5LCBuZXcgU2V0KFtrZXldKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBhbGlnbiBzb3VyY2VzIG9mIGVhY2ggY29tcG9uZW50IGluIGVuZm9yY2VtZW50IHBoYXNlXG4gICAgaWYgKGZpeGVkTm9kZXMpIHtcbiAgICAgIGNvbXBvbmVudFNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgIHZhciBmaXhlZElkcyA9IFtdO1xuICAgICAgICBjb21wb25lbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgaWYgKGZpeGVkTm9kZXMuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgIGZpeGVkSWRzLnB1c2gobm9kZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZml4ZWRJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHZhciBwb3NpdGlvbiA9IDA7XG4gICAgICAgICAgZml4ZWRJZHMuZm9yRWFjaChmdW5jdGlvbiAoZml4ZWRJZCkge1xuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBcImhvcml6b250YWxcIikge1xuICAgICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQoZml4ZWRJZCwgbm9kZUluZGV4ZXMuaGFzKGZpeGVkSWQpID8geENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoZml4ZWRJZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KGZpeGVkSWQpKTtcbiAgICAgICAgICAgICAgcG9zaXRpb24gKz0gcG9zaXRpb25NYXAuZ2V0KGZpeGVkSWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcG9zaXRpb25NYXAuc2V0KGZpeGVkSWQsIG5vZGVJbmRleGVzLmhhcyhmaXhlZElkKSA/IHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGZpeGVkSWQpXSA6IGR1bW15UG9zaXRpb25zLmdldChmaXhlZElkKSk7XG4gICAgICAgICAgICAgIHBvc2l0aW9uICs9IHBvc2l0aW9uTWFwLmdldChmaXhlZElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uIC8gZml4ZWRJZHMubGVuZ3RoO1xuICAgICAgICAgIGNvbXBvbmVudC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIGlmICghZml4ZWROb2Rlcy5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQobm9kZUlkLCBwb3NpdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIF9wb3NpdGlvbiA9IDA7XG4gICAgICAgICAgY29tcG9uZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBcImhvcml6b250YWxcIikge1xuICAgICAgICAgICAgICBfcG9zaXRpb24gKz0gbm9kZUluZGV4ZXMuaGFzKG5vZGVJZCkgPyB4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSA6IGR1bW15UG9zaXRpb25zLmdldChub2RlSWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgX3Bvc2l0aW9uICs9IG5vZGVJbmRleGVzLmhhcyhub2RlSWQpID8geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0gOiBkdW1teVBvc2l0aW9ucy5nZXQobm9kZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfcG9zaXRpb24gPSBfcG9zaXRpb24gLyBjb21wb25lbnQubGVuZ3RoO1xuICAgICAgICAgIGNvbXBvbmVudC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChub2RlSWQsIF9wb3NpdGlvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGNhbGN1bGF0ZSBwb3NpdGlvbnMgb2YgdGhlIG5vZGVzXG5cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcCgpIHtcbiAgICAgIHZhciBjdXJyZW50Tm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICB2YXIgbmVpZ2hib3JzID0gZ3JhcGguZ2V0KGN1cnJlbnROb2RlKTtcbiAgICAgIG5laWdoYm9ycy5mb3JFYWNoKGZ1bmN0aW9uIChuZWlnaGJvcikge1xuICAgICAgICBpZiAocG9zaXRpb25NYXAuZ2V0KG5laWdoYm9yLmlkKSA8IHBvc2l0aW9uTWFwLmdldChjdXJyZW50Tm9kZSkgKyBuZWlnaGJvci5nYXApIHtcbiAgICAgICAgICBpZiAoZml4ZWROb2RlcyAmJiBmaXhlZE5vZGVzLmhhcyhuZWlnaGJvci5pZCkpIHtcbiAgICAgICAgICAgIHZhciBmaXhlZFBvc2l0aW9uID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBcImhvcml6b250YWxcIikge1xuICAgICAgICAgICAgICBmaXhlZFBvc2l0aW9uID0gbm9kZUluZGV4ZXMuaGFzKG5laWdoYm9yLmlkKSA/IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5laWdoYm9yLmlkKV0gOiBkdW1teVBvc2l0aW9ucy5nZXQobmVpZ2hib3IuaWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZml4ZWRQb3NpdGlvbiA9IG5vZGVJbmRleGVzLmhhcyhuZWlnaGJvci5pZCkgPyB5Q29vcmRzW25vZGVJbmRleGVzLmdldChuZWlnaGJvci5pZCldIDogZHVtbXlQb3NpdGlvbnMuZ2V0KG5laWdoYm9yLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChuZWlnaGJvci5pZCwgZml4ZWRQb3NpdGlvbik7IC8vIFRPRE86IG1heSBkbyB1bm5lY2Vzc2FyeSB3b3JrXG4gICAgICAgICAgICBpZiAoZml4ZWRQb3NpdGlvbiA8IHBvc2l0aW9uTWFwLmdldChjdXJyZW50Tm9kZSkgKyBuZWlnaGJvci5nYXApIHtcbiAgICAgICAgICAgICAgdmFyIGRpZmYgPSBwb3NpdGlvbk1hcC5nZXQoY3VycmVudE5vZGUpICsgbmVpZ2hib3IuZ2FwIC0gZml4ZWRQb3NpdGlvbjtcbiAgICAgICAgICAgICAgcGFzdE1hcC5nZXQoY3VycmVudE5vZGUpLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChub2RlSWQsIHBvc2l0aW9uTWFwLmdldChub2RlSWQpIC0gZGlmZik7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQobmVpZ2hib3IuaWQsIHBvc2l0aW9uTWFwLmdldChjdXJyZW50Tm9kZSkgKyBuZWlnaGJvci5nYXApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbkRlZ3JlZXMuc2V0KG5laWdoYm9yLmlkLCBpbkRlZ3JlZXMuZ2V0KG5laWdoYm9yLmlkKSAtIDEpO1xuICAgICAgICBpZiAoaW5EZWdyZWVzLmdldChuZWlnaGJvci5pZCkgPT0gMCkge1xuICAgICAgICAgIHF1ZXVlLnB1c2gobmVpZ2hib3IuaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaXhlZE5vZGVzKSB7XG4gICAgICAgICAgcGFzdE1hcC5zZXQobmVpZ2hib3IuaWQsIHNldFVuaW9uKHBhc3RNYXAuZ2V0KGN1cnJlbnROb2RlKSwgcGFzdE1hcC5nZXQobmVpZ2hib3IuaWQpKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB3aGlsZSAocXVldWUubGVuZ3RoICE9IDApIHtcbiAgICAgIF9sb29wKCk7XG4gICAgfVxuXG4gICAgLy8gcmVhZGp1c3QgcG9zaXRpb24gb2YgdGhlIG5vZGVzIGFmdGVyIGVuZm9yY2VtZW50XG4gICAgaWYgKGZpeGVkTm9kZXMpIHtcbiAgICAgIC8vIGZpbmQgaW5kZWdyZWUgY291bnQgZm9yIGVhY2ggbm9kZVxuICAgICAgdmFyIHNpbmtOb2RlcyA9IG5ldyBTZXQoKTtcblxuICAgICAgZ3JhcGguZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09IDApIHtcbiAgICAgICAgICBzaW5rTm9kZXMuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB2YXIgX2NvbXBvbmVudHMgPSBbXTtcbiAgICAgIHBhc3RNYXAuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICBpZiAoc2lua05vZGVzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgdmFyIGlzRml4ZWRDb21wb25lbnQgPSBmYWxzZTtcbiAgICAgICAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgPSB0cnVlO1xuICAgICAgICAgIHZhciBfZGlkSXRlcmF0b3JFcnJvcjIgPSBmYWxzZTtcbiAgICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IyID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSB2YWx1ZVtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMjsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMiA9IChfc3RlcDIgPSBfaXRlcmF0b3IyLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yID0gdHJ1ZSkge1xuICAgICAgICAgICAgICB2YXIgbm9kZUlkID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICAgICAgICAgIGlmIChmaXhlZE5vZGVzLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgICAgaXNGaXhlZENvbXBvbmVudCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yMiA9IHRydWU7XG4gICAgICAgICAgICBfaXRlcmF0b3JFcnJvcjIgPSBlcnI7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjIgJiYgX2l0ZXJhdG9yMi5yZXR1cm4pIHtcbiAgICAgICAgICAgICAgICBfaXRlcmF0b3IyLnJldHVybigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3IyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFpc0ZpeGVkQ29tcG9uZW50KSB7XG4gICAgICAgICAgICB2YXIgaXNFeGlzdCA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIGV4aXN0QXQgPSB2b2lkIDA7XG4gICAgICAgICAgICBfY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQsIGluZGV4KSB7XG4gICAgICAgICAgICAgIGlmIChjb21wb25lbnQuaGFzKFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkodmFsdWUpKVswXSkpIHtcbiAgICAgICAgICAgICAgICBpc0V4aXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBleGlzdEF0ID0gaW5kZXg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFpc0V4aXN0KSB7XG4gICAgICAgICAgICAgIF9jb21wb25lbnRzLnB1c2gobmV3IFNldCh2YWx1ZSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICAgICAgX2NvbXBvbmVudHNbZXhpc3RBdF0uYWRkKGVsZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIF9jb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgICAgICAgdmFyIG1pbkJlZm9yZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgdmFyIG1pbkFmdGVyID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICB2YXIgbWF4QmVmb3JlID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICB2YXIgbWF4QWZ0ZXIgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yMyA9IGZhbHNlO1xuICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3IzID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMyA9IGNvbXBvbmVudFtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwMzsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMyA9IChfc3RlcDMgPSBfaXRlcmF0b3IzLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24zID0gdHJ1ZSkge1xuICAgICAgICAgICAgdmFyIG5vZGVJZCA9IF9zdGVwMy52YWx1ZTtcblxuICAgICAgICAgICAgdmFyIHBvc0JlZm9yZSA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gXCJob3Jpem9udGFsXCIpIHtcbiAgICAgICAgICAgICAgcG9zQmVmb3JlID0gbm9kZUluZGV4ZXMuaGFzKG5vZGVJZCkgPyB4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSA6IGR1bW15UG9zaXRpb25zLmdldChub2RlSWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcG9zQmVmb3JlID0gbm9kZUluZGV4ZXMuaGFzKG5vZGVJZCkgPyB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSA6IGR1bW15UG9zaXRpb25zLmdldChub2RlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHBvc0FmdGVyID0gcG9zaXRpb25NYXAuZ2V0KG5vZGVJZCk7XG4gICAgICAgICAgICBpZiAocG9zQmVmb3JlIDwgbWluQmVmb3JlKSB7XG4gICAgICAgICAgICAgIG1pbkJlZm9yZSA9IHBvc0JlZm9yZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3NCZWZvcmUgPiBtYXhCZWZvcmUpIHtcbiAgICAgICAgICAgICAgbWF4QmVmb3JlID0gcG9zQmVmb3JlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvc0FmdGVyIDwgbWluQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgbWluQWZ0ZXIgPSBwb3NBZnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3NBZnRlciA+IG1heEFmdGVyKSB7XG4gICAgICAgICAgICAgIG1heEFmdGVyID0gcG9zQWZ0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjMgPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yMyA9IGVycjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uMyAmJiBfaXRlcmF0b3IzLnJldHVybikge1xuICAgICAgICAgICAgICBfaXRlcmF0b3IzLnJldHVybigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3IzKSB7XG4gICAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGlmZiA9IChtaW5CZWZvcmUgKyBtYXhCZWZvcmUpIC8gMiAtIChtaW5BZnRlciArIG1heEFmdGVyKSAvIDI7XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb240ID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yNCA9IGZhbHNlO1xuICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3I0ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNCA9IGNvbXBvbmVudFtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwNDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNCA9IChfc3RlcDQgPSBfaXRlcmF0b3I0Lm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb240ID0gdHJ1ZSkge1xuICAgICAgICAgICAgdmFyIF9ub2RlSWQgPSBfc3RlcDQudmFsdWU7XG5cbiAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChfbm9kZUlkLCBwb3NpdGlvbk1hcC5nZXQoX25vZGVJZCkgKyBkaWZmKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9kaWRJdGVyYXRvckVycm9yNCA9IHRydWU7XG4gICAgICAgICAgX2l0ZXJhdG9yRXJyb3I0ID0gZXJyO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIV9pdGVyYXRvck5vcm1hbENvbXBsZXRpb240ICYmIF9pdGVyYXRvcjQucmV0dXJuKSB7XG4gICAgICAgICAgICAgIF9pdGVyYXRvcjQucmV0dXJuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcjQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc2l0aW9uTWFwO1xuICB9O1xuXG4gIC8vIGZpbmQgdHJhbnNmb3JtYXRpb24gYmFzZWQgb24gcmVsLiBwbGFjZW1lbnQgY29uc3RyYWludHMgaWYgdGhlcmUgYXJlIGJvdGggYWxpZ25tZW50IGFuZCByZWwuIHBsYWNlbWVudCBjb25zdHJhaW50c1xuICAvLyBvciBpZiB0aGVyZSBhcmUgb25seSByZWwuIHBsYWNlbWVudCBjb250cmFpbnRzIHdoZXJlIHRoZSBsYXJnZXN0IGNvbXBvbmVudCBpc24ndCBzdWZmaWNpZW50bHkgbGFyZ2VcbiAgdmFyIGFwcGx5UmVmbGVjdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50ID0gZnVuY3Rpb24gYXBwbHlSZWZsZWN0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQocmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50cykge1xuICAgIC8vIHZhcmlhYmxlcyB0byBjb3VudCB2b3Rlc1xuICAgIHZhciByZWZsZWN0T25ZID0gMCxcbiAgICAgICAgbm90UmVmbGVjdE9uWSA9IDA7XG4gICAgdmFyIHJlZmxlY3RPblggPSAwLFxuICAgICAgICBub3RSZWZsZWN0T25YID0gMDtcblxuICAgIHJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludHMuZm9yRWFjaChmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgaWYgKGNvbnN0cmFpbnQubGVmdCkge1xuICAgICAgICB4Q29vcmRzW25vZGVJbmRleGVzLmdldChjb25zdHJhaW50LmxlZnQpXSAtIHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGNvbnN0cmFpbnQucmlnaHQpXSA+PSAwID8gcmVmbGVjdE9uWSsrIDogbm90UmVmbGVjdE9uWSsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoY29uc3RyYWludC50b3ApXSAtIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGNvbnN0cmFpbnQuYm90dG9tKV0gPj0gMCA/IHJlZmxlY3RPblgrKyA6IG5vdFJlZmxlY3RPblgrKztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChyZWZsZWN0T25ZID4gbm90UmVmbGVjdE9uWSAmJiByZWZsZWN0T25YID4gbm90UmVmbGVjdE9uWCkge1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5vZGVJbmRleGVzLnNpemU7IF9pKyspIHtcbiAgICAgICAgeENvb3Jkc1tfaV0gPSAtMSAqIHhDb29yZHNbX2ldO1xuICAgICAgICB5Q29vcmRzW19pXSA9IC0xICogeUNvb3Jkc1tfaV07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWZsZWN0T25ZID4gbm90UmVmbGVjdE9uWSkge1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZUluZGV4ZXMuc2l6ZTsgX2kyKyspIHtcbiAgICAgICAgeENvb3Jkc1tfaTJdID0gLTEgKiB4Q29vcmRzW19pMl07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWZsZWN0T25YID4gbm90UmVmbGVjdE9uWCkge1xuICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbm9kZUluZGV4ZXMuc2l6ZTsgX2kzKyspIHtcbiAgICAgICAgeUNvb3Jkc1tfaTNdID0gLTEgKiB5Q29vcmRzW19pM107XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIGZpbmQgd2Vha2x5IGNvbm5lY3RlZCBjb21wb25lbnRzIGluIHVuZGlyZWN0ZWQgZ3JhcGhcbiAgdmFyIGZpbmRDb21wb25lbnRzID0gZnVuY3Rpb24gZmluZENvbXBvbmVudHMoZ3JhcGgpIHtcbiAgICAvLyBmaW5kIHdlYWtseSBjb25uZWN0ZWQgY29tcG9uZW50cyBpbiBkYWdcbiAgICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICAgIHZhciBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7XG4gICAgdmFyIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGNvdW50ID0gMDtcblxuICAgIGdyYXBoLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICghdmlzaXRlZC5oYXMoa2V5KSkge1xuICAgICAgICBjb21wb25lbnRzW2NvdW50XSA9IFtdO1xuICAgICAgICB2YXIgX2N1cnJlbnROb2RlID0ga2V5O1xuICAgICAgICBxdWV1ZS5wdXNoKF9jdXJyZW50Tm9kZSk7XG4gICAgICAgIHZpc2l0ZWQuYWRkKF9jdXJyZW50Tm9kZSk7XG4gICAgICAgIGNvbXBvbmVudHNbY291bnRdLnB1c2goX2N1cnJlbnROb2RlKTtcblxuICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICBfY3VycmVudE5vZGUgPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgIHZhciBuZWlnaGJvcnMgPSBncmFwaC5nZXQoX2N1cnJlbnROb2RlKTtcbiAgICAgICAgICBuZWlnaGJvcnMuZm9yRWFjaChmdW5jdGlvbiAobmVpZ2hib3IpIHtcbiAgICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMobmVpZ2hib3IuaWQpKSB7XG4gICAgICAgICAgICAgIHF1ZXVlLnB1c2gobmVpZ2hib3IuaWQpO1xuICAgICAgICAgICAgICB2aXNpdGVkLmFkZChuZWlnaGJvci5pZCk7XG4gICAgICAgICAgICAgIGNvbXBvbmVudHNbY291bnRdLnB1c2gobmVpZ2hib3IuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50Kys7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gIH07XG5cbiAgLy8gcmV0dXJuIHVuZGlyZWN0ZWQgdmVyc2lvbiBvZiBnaXZlbiBkYWdcbiAgdmFyIGRhZ1RvVW5kaXJlY3RlZCA9IGZ1bmN0aW9uIGRhZ1RvVW5kaXJlY3RlZChkYWcpIHtcbiAgICB2YXIgdW5kaXJlY3RlZCA9IG5ldyBNYXAoKTtcblxuICAgIGRhZy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICB1bmRpcmVjdGVkLnNldChrZXksIFtdKTtcbiAgICB9KTtcblxuICAgIGRhZy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChhZGphY2VudCkge1xuICAgICAgICB1bmRpcmVjdGVkLmdldChrZXkpLnB1c2goYWRqYWNlbnQpO1xuICAgICAgICB1bmRpcmVjdGVkLmdldChhZGphY2VudC5pZCkucHVzaCh7IGlkOiBrZXksIGdhcDogYWRqYWNlbnQuZ2FwLCBkaXJlY3Rpb246IGFkamFjZW50LmRpcmVjdGlvbiB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHVuZGlyZWN0ZWQ7XG4gIH07XG5cbiAgLy8gcmV0dXJuIHJldmVyc2VkIChkaXJlY3Rpb25zIGludmVydGVkKSB2ZXJzaW9uIG9mIGdpdmVuIGRhZ1xuICB2YXIgZGFnVG9SZXZlcnNlZCA9IGZ1bmN0aW9uIGRhZ1RvUmV2ZXJzZWQoZGFnKSB7XG4gICAgdmFyIHJldmVyc2VkID0gbmV3IE1hcCgpO1xuXG4gICAgZGFnLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJldmVyc2VkLnNldChrZXksIFtdKTtcbiAgICB9KTtcblxuICAgIGRhZy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChhZGphY2VudCkge1xuICAgICAgICByZXZlcnNlZC5nZXQoYWRqYWNlbnQuaWQpLnB1c2goeyBpZDoga2V5LCBnYXA6IGFkamFjZW50LmdhcCwgZGlyZWN0aW9uOiBhZGphY2VudC5kaXJlY3Rpb24gfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXZlcnNlZDtcbiAgfTtcblxuICAvKioqKiAgYXBwbHkgdHJhbnNmb3JtYXRpb24gdG8gdGhlIGluaXRpYWwgZHJhZnQgbGF5b3V0IHRvIGJldHRlciBhbGlnbiB3aXRoIGNvbnN0cmFpbmVkIG5vZGVzICoqKiovXG4gIC8vIHNvbHZlIHRoZSBPcnRob2dvbmFsIFByb2NydXN0ZWFuIFByb2JsZW0gdG8gcm90YXRlIGFuZC9vciByZWZsZWN0IGluaXRpYWwgZHJhZnQgbGF5b3V0XG4gIC8vIGhlcmUgd2UgZm9sbG93IHRoZSBzb2x1dGlvbiBpbiBDaGFwdGVyIDIwLjIgb2YgQm9yZywgSS4gJiBHcm9lbmVuLCBQLiAoMjAwNSkgTW9kZXJuIE11bHRpZGltZW5zaW9uYWwgU2NhbGluZzogVGhlb3J5IGFuZCBBcHBsaWNhdGlvbnMgXG5cbiAgLyogY29uc3RydWN0IHNvdXJjZSBhbmQgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zICovXG5cbiAgdmFyIHRhcmdldE1hdHJpeCA9IFtdOyAvLyBBIC0gdGFyZ2V0IGNvbmZpZ3VyYXRpb25cbiAgdmFyIHNvdXJjZU1hdHJpeCA9IFtdOyAvLyBCIC0gc291cmNlIGNvbmZpZ3VyYXRpb24gXG4gIHZhciBzdGFuZGFyZFRyYW5zZm9ybWF0aW9uID0gZmFsc2U7IC8vIGZhbHNlIGZvciBubyB0cmFuc2Zvcm1hdGlvbiwgdHJ1ZSBmb3Igc3RhbmRhcnQgKFByb2NydXN0ZXMpIHRyYW5zZm9ybWF0aW9uIChyb3RhdGlvbiBhbmQvb3IgcmVmbGVjdGlvbilcbiAgdmFyIHJlZmxlY3Rpb25UeXBlID0gZmFsc2U7IC8vIGZhbHNlL3RydWUgZm9yIHJlZmxlY3Rpb24gY2hlY2ssICdyZWZsZWN0T25YJywgJ3JlZmxlY3RPblknIG9yICdyZWZsZWN0T25Cb3RoJyBmb3IgcmVmbGVjdGlvbiB0eXBlIGlmIG5lY2Vzc2FyeVxuICB2YXIgZml4ZWROb2RlcyA9IG5ldyBTZXQoKTtcbiAgdmFyIGRhZyA9IG5ldyBNYXAoKTsgLy8gYWRqYWNlbmN5IGxpc3QgdG8ga2VlcCBkaXJlY3RlZCBhY3ljbGljIGdyYXBoIChkYWcpIHRoYXQgY29uc2lzdHMgb2YgcmVsYXRpdmUgcGxhY2VtZW50IGNvbnN0cmFpbnRzXG4gIHZhciBkYWdVbmRpcmVjdGVkID0gbmV3IE1hcCgpOyAvLyB1bmRpcmVjdGVkIHZlcnNpb24gb2YgdGhlIGRhZ1xuICB2YXIgY29tcG9uZW50cyA9IFtdOyAvLyB3ZWFrbHkgY29ubmVjdGVkIGNvbXBvbmVudHNcblxuICAvLyBmaWxsIGZpeGVkTm9kZXMgY29sbGVjdGlvbiB0byB1c2UgbGF0ZXJcbiAgaWYgKGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQpIHtcbiAgICBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVEYXRhKSB7XG4gICAgICBmaXhlZE5vZGVzLmFkZChub2RlRGF0YS5ub2RlSWQpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gY29uc3RydWN0IGRhZyBmcm9tIHJlbGF0aXZlIHBsYWNlbWVudCBjb25zdHJhaW50cyBcbiAgaWYgKGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuICAgIC8vIGNvbnN0cnVjdCBib3RoIGRpcmVjdGVkIGFuZCB1bmRpcmVjdGVkIHZlcnNpb24gb2YgdGhlIGRhZ1xuICAgIGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICBpZiAoY29uc3RyYWludC5sZWZ0KSB7XG4gICAgICAgIGlmIChkYWcuaGFzKGNvbnN0cmFpbnQubGVmdCkpIHtcbiAgICAgICAgICBkYWcuZ2V0KGNvbnN0cmFpbnQubGVmdCkucHVzaCh7IGlkOiBjb25zdHJhaW50LnJpZ2h0LCBnYXA6IGNvbnN0cmFpbnQuZ2FwLCBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhZy5zZXQoY29uc3RyYWludC5sZWZ0LCBbeyBpZDogY29uc3RyYWludC5yaWdodCwgZ2FwOiBjb25zdHJhaW50LmdhcCwgZGlyZWN0aW9uOiBcImhvcml6b250YWxcIiB9XSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkYWcuaGFzKGNvbnN0cmFpbnQucmlnaHQpKSB7XG4gICAgICAgICAgZGFnLnNldChjb25zdHJhaW50LnJpZ2h0LCBbXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChkYWcuaGFzKGNvbnN0cmFpbnQudG9wKSkge1xuICAgICAgICAgIGRhZy5nZXQoY29uc3RyYWludC50b3ApLnB1c2goeyBpZDogY29uc3RyYWludC5ib3R0b20sIGdhcDogY29uc3RyYWludC5nYXAsIGRpcmVjdGlvbjogXCJ2ZXJ0aWNhbFwiIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhZy5zZXQoY29uc3RyYWludC50b3AsIFt7IGlkOiBjb25zdHJhaW50LmJvdHRvbSwgZ2FwOiBjb25zdHJhaW50LmdhcCwgZGlyZWN0aW9uOiBcInZlcnRpY2FsXCIgfV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGFnLmhhcyhjb25zdHJhaW50LmJvdHRvbSkpIHtcbiAgICAgICAgICBkYWcuc2V0KGNvbnN0cmFpbnQuYm90dG9tLCBbXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRhZ1VuZGlyZWN0ZWQgPSBkYWdUb1VuZGlyZWN0ZWQoZGFnKTtcbiAgICBjb21wb25lbnRzID0gZmluZENvbXBvbmVudHMoZGFnVW5kaXJlY3RlZCk7XG4gIH1cblxuICBpZiAoQ29TRUNvbnN0YW50cy5UUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORykge1xuICAgIC8vIGZpcnN0IGNoZWNrIGZpeGVkIG5vZGUgY29uc3RyYWludFxuICAgIGlmIChjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50ICYmIGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRGF0YSwgaSkge1xuICAgICAgICB0YXJnZXRNYXRyaXhbaV0gPSBbbm9kZURhdGEucG9zaXRpb24ueCwgbm9kZURhdGEucG9zaXRpb24ueV07XG4gICAgICAgIHNvdXJjZU1hdHJpeFtpXSA9IFt4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlRGF0YS5ub2RlSWQpXSwgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZURhdGEubm9kZUlkKV1dO1xuICAgICAgfSk7XG4gICAgICBzdGFuZGFyZFRyYW5zZm9ybWF0aW9uID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIHRoZW4gY2hlY2sgYWxpZ25tZW50IGNvbnN0cmFpbnRcbiAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWwpIHtcbiAgICAgICAgICB2YXIgdmVydGljYWxBbGlnbiA9IGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWw7XG5cbiAgICAgICAgICB2YXIgX2xvb3AyID0gZnVuY3Rpb24gX2xvb3AyKF9pNCkge1xuICAgICAgICAgICAgdmFyIGFsaWdubWVudFNldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIHZlcnRpY2FsQWxpZ25bX2k0XS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgYWxpZ25tZW50U2V0LmFkZChub2RlSWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgaW50ZXJzZWN0aW9uID0gbmV3IFNldChbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGFsaWdubWVudFNldCkpLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICByZXR1cm4gZml4ZWROb2Rlcy5oYXMoeCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB2YXIgeFBvcyA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb24uc2l6ZSA+IDApIHhQb3MgPSB4Q29vcmRzW25vZGVJbmRleGVzLmdldChpbnRlcnNlY3Rpb24udmFsdWVzKCkubmV4dCgpLnZhbHVlKV07ZWxzZSB4UG9zID0gY2FsY3VsYXRlQXZnUG9zaXRpb24oYWxpZ25tZW50U2V0KS54O1xuXG4gICAgICAgICAgICB2ZXJ0aWNhbEFsaWduW19pNF0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgIHRhcmdldE1hdHJpeFtjb3VudF0gPSBbeFBvcywgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV1dO1xuICAgICAgICAgICAgICBzb3VyY2VNYXRyaXhbY291bnRdID0gW3hDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXV07XG4gICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgdmVydGljYWxBbGlnbi5sZW5ndGg7IF9pNCsrKSB7XG4gICAgICAgICAgICBfbG9vcDIoX2k0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhbmRhcmRUcmFuc2Zvcm1hdGlvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCkge1xuICAgICAgICAgIHZhciBob3Jpem9udGFsQWxpZ24gPSBjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWw7XG5cbiAgICAgICAgICB2YXIgX2xvb3AzID0gZnVuY3Rpb24gX2xvb3AzKF9pNSkge1xuICAgICAgICAgICAgdmFyIGFsaWdubWVudFNldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGhvcml6b250YWxBbGlnbltfaTVdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICBhbGlnbm1lbnRTZXQuYWRkKG5vZGVJZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBuZXcgU2V0KFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoYWxpZ25tZW50U2V0KSkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgIHJldHVybiBmaXhlZE5vZGVzLmhhcyh4KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHZhciB5UG9zID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKGludGVyc2VjdGlvbi5zaXplID4gMCkgeVBvcyA9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGludGVyc2VjdGlvbi52YWx1ZXMoKS5uZXh0KCkudmFsdWUpXTtlbHNlIHlQb3MgPSBjYWxjdWxhdGVBdmdQb3NpdGlvbihhbGlnbm1lbnRTZXQpLnk7XG5cbiAgICAgICAgICAgIGhvcml6b250YWxBbGlnbltfaTVdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICB0YXJnZXRNYXRyaXhbY291bnRdID0gW3hDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldLCB5UG9zXTtcbiAgICAgICAgICAgICAgc291cmNlTWF0cml4W2NvdW50XSA9IFt4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSwgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV1dO1xuICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IGhvcml6b250YWxBbGlnbi5sZW5ndGg7IF9pNSsrKSB7XG4gICAgICAgICAgICBfbG9vcDMoX2k1KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhbmRhcmRUcmFuc2Zvcm1hdGlvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuICAgICAgICAgIHJlZmxlY3Rpb25UeXBlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9IGVsc2UgaWYgKGNvbnN0cmFpbnRzLnJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCkge1xuICAgICAgLy8gZmluYWxseSBjaGVjayByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludFxuICAgICAgLy8gZmluZCBsYXJnZXN0IGNvbXBvbmVudCBpbiBkYWdcbiAgICAgIHZhciBsYXJnZXN0Q29tcG9uZW50U2l6ZSA9IDA7XG4gICAgICB2YXIgbGFyZ2VzdENvbXBvbmVudEluZGV4ID0gMDtcbiAgICAgIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IGNvbXBvbmVudHMubGVuZ3RoOyBfaTYrKykge1xuICAgICAgICBpZiAoY29tcG9uZW50c1tfaTZdLmxlbmd0aCA+IGxhcmdlc3RDb21wb25lbnRTaXplKSB7XG4gICAgICAgICAgbGFyZ2VzdENvbXBvbmVudFNpemUgPSBjb21wb25lbnRzW19pNl0ubGVuZ3RoO1xuICAgICAgICAgIGxhcmdlc3RDb21wb25lbnRJbmRleCA9IF9pNjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gaWYgbGFyZ2VzdCBjb21wb25lbnQgaXNuJ3QgZG9taW5hbnQsIHRoZW4gdGFrZSB0aGUgdm90ZXMgZm9yIHJlZmxlY3Rpb25cbiAgICAgIGlmIChsYXJnZXN0Q29tcG9uZW50U2l6ZSA8IGRhZ1VuZGlyZWN0ZWQuc2l6ZSAvIDIpIHtcbiAgICAgICAgYXBwbHlSZWZsZWN0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQoY29uc3RyYWludHMucmVsYXRpdmVQbGFjZW1lbnRDb25zdHJhaW50KTtcbiAgICAgICAgc3RhbmRhcmRUcmFuc2Zvcm1hdGlvbiA9IGZhbHNlO1xuICAgICAgICByZWZsZWN0aW9uVHlwZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdXNlIGxhcmdlc3QgY29tcG9uZW50IGZvciB0cmFuc2Zvcm1hdGlvblxuICAgICAgICAvLyBjb25zdHJ1Y3QgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgc3ViZ3JhcGhzIGluIHRoZSBsYXJnZXN0IGNvbXBvbmVudFxuICAgICAgICB2YXIgc3ViR3JhcGhPbkhvcml6b250YWwgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBzdWJHcmFwaE9uVmVydGljYWwgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBjb25zdHJhaW50c0lubGFyZ2VzdENvbXBvbmVudCA9IFtdO1xuXG4gICAgICAgIGNvbXBvbmVudHNbbGFyZ2VzdENvbXBvbmVudEluZGV4XS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICBkYWcuZ2V0KG5vZGVJZCkuZm9yRWFjaChmdW5jdGlvbiAoYWRqYWNlbnQpIHtcbiAgICAgICAgICAgIGlmIChhZGphY2VudC5kaXJlY3Rpb24gPT0gXCJob3Jpem9udGFsXCIpIHtcbiAgICAgICAgICAgICAgaWYgKHN1YkdyYXBoT25Ib3Jpem9udGFsLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgICAgc3ViR3JhcGhPbkhvcml6b250YWwuZ2V0KG5vZGVJZCkucHVzaChhZGphY2VudCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3ViR3JhcGhPbkhvcml6b250YWwuc2V0KG5vZGVJZCwgW2FkamFjZW50XSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFzdWJHcmFwaE9uSG9yaXpvbnRhbC5oYXMoYWRqYWNlbnQuaWQpKSB7XG4gICAgICAgICAgICAgICAgc3ViR3JhcGhPbkhvcml6b250YWwuc2V0KGFkamFjZW50LmlkLCBbXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3RyYWludHNJbmxhcmdlc3RDb21wb25lbnQucHVzaCh7IGxlZnQ6IG5vZGVJZCwgcmlnaHQ6IGFkamFjZW50LmlkIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHN1YkdyYXBoT25WZXJ0aWNhbC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgICAgIHN1YkdyYXBoT25WZXJ0aWNhbC5nZXQobm9kZUlkKS5wdXNoKGFkamFjZW50KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdWJHcmFwaE9uVmVydGljYWwuc2V0KG5vZGVJZCwgW2FkamFjZW50XSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFzdWJHcmFwaE9uVmVydGljYWwuaGFzKGFkamFjZW50LmlkKSkge1xuICAgICAgICAgICAgICAgIHN1YkdyYXBoT25WZXJ0aWNhbC5zZXQoYWRqYWNlbnQuaWQsIFtdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdHJhaW50c0lubGFyZ2VzdENvbXBvbmVudC5wdXNoKHsgdG9wOiBub2RlSWQsIGJvdHRvbTogYWRqYWNlbnQuaWQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFwcGx5UmVmbGVjdGlvbkZvclJlbGF0aXZlUGxhY2VtZW50KGNvbnN0cmFpbnRzSW5sYXJnZXN0Q29tcG9uZW50KTtcbiAgICAgICAgcmVmbGVjdGlvblR5cGUgPSBmYWxzZTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgYXBwcm9wcmlhdGUgcG9zaXRpb25pbmcgZm9yIHN1YmdyYXBoc1xuICAgICAgICB2YXIgcG9zaXRpb25NYXBIb3Jpem9udGFsID0gZmluZEFwcHJvcHJpYXRlUG9zaXRpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChzdWJHcmFwaE9uSG9yaXpvbnRhbCwgXCJob3Jpem9udGFsXCIpO1xuICAgICAgICB2YXIgcG9zaXRpb25NYXBWZXJ0aWNhbCA9IGZpbmRBcHByb3ByaWF0ZVBvc2l0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQoc3ViR3JhcGhPblZlcnRpY2FsLCBcInZlcnRpY2FsXCIpO1xuXG4gICAgICAgIC8vIGNvbnN0cnVjdCBzb3VyY2UgYW5kIHRhcmdldCBjb25maWd1cmF0aW9uXG4gICAgICAgIGNvbXBvbmVudHNbbGFyZ2VzdENvbXBvbmVudEluZGV4XS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQsIGkpIHtcbiAgICAgICAgICBzb3VyY2VNYXRyaXhbaV0gPSBbeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0sIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldXTtcbiAgICAgICAgICB0YXJnZXRNYXRyaXhbaV0gPSBbXTtcbiAgICAgICAgICBpZiAocG9zaXRpb25NYXBIb3Jpem9udGFsLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICB0YXJnZXRNYXRyaXhbaV1bMF0gPSBwb3NpdGlvbk1hcEhvcml6b250YWwuZ2V0KG5vZGVJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldE1hdHJpeFtpXVswXSA9IHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVJZCldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocG9zaXRpb25NYXBWZXJ0aWNhbC5oYXMobm9kZUlkKSkge1xuICAgICAgICAgICAgdGFyZ2V0TWF0cml4W2ldWzFdID0gcG9zaXRpb25NYXBWZXJ0aWNhbC5nZXQobm9kZUlkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0TWF0cml4W2ldWzFdID0geUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBzdGFuZGFyZFRyYW5zZm9ybWF0aW9uID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB0cmFuc2Zvcm1hdGlvbiBpcyByZXF1aXJlZCwgdGhlbiBjYWxjdWxhdGUgYW5kIGFwcGx5IHRyYW5zZm9ybWF0aW9uIG1hdHJpeFxuICAgIGlmIChzdGFuZGFyZFRyYW5zZm9ybWF0aW9uKSB7XG4gICAgICAvKiBjYWxjdWxhdGUgdHJhbnNmb3JtYXRpb24gbWF0cml4ICovXG4gICAgICB2YXIgdHJhbnNmb3JtYXRpb25NYXRyaXggPSB2b2lkIDA7XG4gICAgICB2YXIgdGFyZ2V0TWF0cml4VHJhbnNwb3NlID0gTWF0cml4LnRyYW5zcG9zZSh0YXJnZXRNYXRyaXgpOyAvLyBBJ1xuICAgICAgdmFyIHNvdXJjZU1hdHJpeFRyYW5zcG9zZSA9IE1hdHJpeC50cmFuc3Bvc2Uoc291cmNlTWF0cml4KTsgLy8gQidcblxuICAgICAgLy8gY2VudHJhbGl6ZSB0cmFuc3Bvc2UgbWF0cmljZXNcbiAgICAgIGZvciAodmFyIF9pNyA9IDA7IF9pNyA8IHRhcmdldE1hdHJpeFRyYW5zcG9zZS5sZW5ndGg7IF9pNysrKSB7XG4gICAgICAgIHRhcmdldE1hdHJpeFRyYW5zcG9zZVtfaTddID0gTWF0cml4Lm11bHRHYW1tYSh0YXJnZXRNYXRyaXhUcmFuc3Bvc2VbX2k3XSk7XG4gICAgICAgIHNvdXJjZU1hdHJpeFRyYW5zcG9zZVtfaTddID0gTWF0cml4Lm11bHRHYW1tYShzb3VyY2VNYXRyaXhUcmFuc3Bvc2VbX2k3XSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGRvIGFjdHVhbCBjYWxjdWxhdGlvbiBmb3IgdHJhbnNmb3JtYXRpb24gbWF0cml4XG4gICAgICB2YXIgdGVtcE1hdHJpeCA9IE1hdHJpeC5tdWx0TWF0KHRhcmdldE1hdHJpeFRyYW5zcG9zZSwgTWF0cml4LnRyYW5zcG9zZShzb3VyY2VNYXRyaXhUcmFuc3Bvc2UpKTsgLy8gdGVtcE1hdHJpeCA9IEEnQlxuICAgICAgdmFyIFNWRFJlc3VsdCA9IFNWRC5zdmQodGVtcE1hdHJpeCk7IC8vIFNWRChBJ0IpID0gVVNWJywgc3ZkIGZ1bmN0aW9uIHJldHVybnMgVSwgUyBhbmQgViBcbiAgICAgIHRyYW5zZm9ybWF0aW9uTWF0cml4ID0gTWF0cml4Lm11bHRNYXQoU1ZEUmVzdWx0LlYsIE1hdHJpeC50cmFuc3Bvc2UoU1ZEUmVzdWx0LlUpKTsgLy8gdHJhbnNmb3JtYXRpb25NYXRyaXggPSBUID0gVlUnXG5cbiAgICAgIC8qIGFwcGx5IGZvdW5kIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0byBvYnRhaW4gZmluYWwgZHJhZnQgbGF5b3V0ICovXG4gICAgICBmb3IgKHZhciBfaTggPSAwOyBfaTggPCBub2RlSW5kZXhlcy5zaXplOyBfaTgrKykge1xuICAgICAgICB2YXIgdGVtcDEgPSBbeENvb3Jkc1tfaThdLCB5Q29vcmRzW19pOF1dO1xuICAgICAgICB2YXIgdGVtcDIgPSBbdHJhbnNmb3JtYXRpb25NYXRyaXhbMF1bMF0sIHRyYW5zZm9ybWF0aW9uTWF0cml4WzFdWzBdXTtcbiAgICAgICAgdmFyIHRlbXAzID0gW3RyYW5zZm9ybWF0aW9uTWF0cml4WzBdWzFdLCB0cmFuc2Zvcm1hdGlvbk1hdHJpeFsxXVsxXV07XG4gICAgICAgIHhDb29yZHNbX2k4XSA9IE1hdHJpeC5kb3RQcm9kdWN0KHRlbXAxLCB0ZW1wMik7XG4gICAgICAgIHlDb29yZHNbX2k4XSA9IE1hdHJpeC5kb3RQcm9kdWN0KHRlbXAxLCB0ZW1wMyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGFwcGxpZWQgb25seSBib3RoIGFsaWdubWVudCBhbmQgcmVsLiBwbGFjZW1lbnQgY29uc3RyYWludHMgZXhpc3RcbiAgICAgIGlmIChyZWZsZWN0aW9uVHlwZSkge1xuICAgICAgICBhcHBseVJlZmxlY3Rpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChDb1NFQ29uc3RhbnRzLkVORk9SQ0VfQ09OU1RSQUlOVFMpIHtcbiAgICAvKioqKiAgZW5mb3JjZSBjb25zdHJhaW50cyBvbiB0aGUgdHJhbnNmb3JtZWQgZHJhZnQgbGF5b3V0ICoqKiovXG5cbiAgICAvKiBmaXJzdCBlbmZvcmNlIGZpeGVkIG5vZGUgY29uc3RyYWludCAqL1xuXG4gICAgaWYgKGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQgJiYgY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgdHJhbnNsYXRpb25BbW91bnQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgIGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZURhdGEsIGkpIHtcbiAgICAgICAgdmFyIHBvc0luVGhlb3J5ID0geyB4OiB4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlRGF0YS5ub2RlSWQpXSwgeTogeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZURhdGEubm9kZUlkKV0gfTtcbiAgICAgICAgdmFyIHBvc0Rlc2lyZWQgPSBub2RlRGF0YS5wb3NpdGlvbjtcbiAgICAgICAgdmFyIHBvc0RpZmYgPSBjYWxjdWxhdGVQb3NpdGlvbkRpZmYocG9zRGVzaXJlZCwgcG9zSW5UaGVvcnkpO1xuICAgICAgICB0cmFuc2xhdGlvbkFtb3VudC54ICs9IHBvc0RpZmYueDtcbiAgICAgICAgdHJhbnNsYXRpb25BbW91bnQueSArPSBwb3NEaWZmLnk7XG4gICAgICB9KTtcbiAgICAgIHRyYW5zbGF0aW9uQW1vdW50LnggLz0gY29uc3RyYWludHMuZml4ZWROb2RlQ29uc3RyYWludC5sZW5ndGg7XG4gICAgICB0cmFuc2xhdGlvbkFtb3VudC55IC89IGNvbnN0cmFpbnRzLmZpeGVkTm9kZUNvbnN0cmFpbnQubGVuZ3RoO1xuXG4gICAgICB4Q29vcmRzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBpKSB7XG4gICAgICAgIHhDb29yZHNbaV0gKz0gdHJhbnNsYXRpb25BbW91bnQueDtcbiAgICAgIH0pO1xuXG4gICAgICB5Q29vcmRzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBpKSB7XG4gICAgICAgIHlDb29yZHNbaV0gKz0gdHJhbnNsYXRpb25BbW91bnQueTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdHJhaW50cy5maXhlZE5vZGVDb25zdHJhaW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVEYXRhKSB7XG4gICAgICAgIHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KG5vZGVEYXRhLm5vZGVJZCldID0gbm9kZURhdGEucG9zaXRpb24ueDtcbiAgICAgICAgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZURhdGEubm9kZUlkKV0gPSBub2RlRGF0YS5wb3NpdGlvbi55O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyogdGhlbiBlbmZvcmNlIGFsaWdubWVudCBjb25zdHJhaW50ICovXG5cbiAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludCkge1xuICAgICAgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWwpIHtcbiAgICAgICAgdmFyIHhBbGlnbiA9IGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQudmVydGljYWw7XG5cbiAgICAgICAgdmFyIF9sb29wNCA9IGZ1bmN0aW9uIF9sb29wNChfaTkpIHtcbiAgICAgICAgICB2YXIgYWxpZ25tZW50U2V0ID0gbmV3IFNldCgpO1xuICAgICAgICAgIHhBbGlnbltfaTldLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgYWxpZ25tZW50U2V0LmFkZChub2RlSWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBuZXcgU2V0KFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoYWxpZ25tZW50U2V0KSkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gZml4ZWROb2Rlcy5oYXMoeCk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHZhciB4UG9zID0gdm9pZCAwO1xuICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb24uc2l6ZSA+IDApIHhQb3MgPSB4Q29vcmRzW25vZGVJbmRleGVzLmdldChpbnRlcnNlY3Rpb24udmFsdWVzKCkubmV4dCgpLnZhbHVlKV07ZWxzZSB4UG9zID0gY2FsY3VsYXRlQXZnUG9zaXRpb24oYWxpZ25tZW50U2V0KS54O1xuXG4gICAgICAgICAgYWxpZ25tZW50U2V0LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgaWYgKCFmaXhlZE5vZGVzLmhhcyhub2RlSWQpKSB4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSA9IHhQb3M7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yICh2YXIgX2k5ID0gMDsgX2k5IDwgeEFsaWduLmxlbmd0aDsgX2k5KyspIHtcbiAgICAgICAgICBfbG9vcDQoX2k5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQuaG9yaXpvbnRhbCkge1xuICAgICAgICB2YXIgeUFsaWduID0gY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsO1xuXG4gICAgICAgIHZhciBfbG9vcDUgPSBmdW5jdGlvbiBfbG9vcDUoX2kxMCkge1xuICAgICAgICAgIHZhciBhbGlnbm1lbnRTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgeUFsaWduW19pMTBdLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgYWxpZ25tZW50U2V0LmFkZChub2RlSWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBuZXcgU2V0KFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoYWxpZ25tZW50U2V0KSkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gZml4ZWROb2Rlcy5oYXMoeCk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHZhciB5UG9zID0gdm9pZCAwO1xuICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb24uc2l6ZSA+IDApIHlQb3MgPSB5Q29vcmRzW25vZGVJbmRleGVzLmdldChpbnRlcnNlY3Rpb24udmFsdWVzKCkubmV4dCgpLnZhbHVlKV07ZWxzZSB5UG9zID0gY2FsY3VsYXRlQXZnUG9zaXRpb24oYWxpZ25tZW50U2V0KS55O1xuXG4gICAgICAgICAgYWxpZ25tZW50U2V0LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgaWYgKCFmaXhlZE5vZGVzLmhhcyhub2RlSWQpKSB5Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSA9IHlQb3M7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yICh2YXIgX2kxMCA9IDA7IF9pMTAgPCB5QWxpZ24ubGVuZ3RoOyBfaTEwKyspIHtcbiAgICAgICAgICBfbG9vcDUoX2kxMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBmaW5hbGx5IGVuZm9yY2UgcmVsYXRpdmUgcGxhY2VtZW50IGNvbnN0cmFpbnQgKi9cblxuICAgIGlmIChjb25zdHJhaW50cy5yZWxhdGl2ZVBsYWNlbWVudENvbnN0cmFpbnQpIHtcbiAgICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50ID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgZHVtbXlUb05vZGVGb3JWZXJ0aWNhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGR1bW15UG9zaXRpb25zRm9yVmVydGljYWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBkdW1teVBvc2l0aW9uc0Zvckhvcml6b250YWxBbGlnbm1lbnQgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBmaXhlZE5vZGVzT25Ib3Jpem9udGFsID0gbmV3IFNldCgpO1xuICAgICAgICB2YXIgZml4ZWROb2Rlc09uVmVydGljYWwgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgLy8gZmlsbCBtYXBzIGFuZCBzZXRzICAgICAgXG4gICAgICAgIGZpeGVkTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgZml4ZWROb2Rlc09uSG9yaXpvbnRhbC5hZGQobm9kZUlkKTtcbiAgICAgICAgICBmaXhlZE5vZGVzT25WZXJ0aWNhbC5hZGQobm9kZUlkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNvbnN0cmFpbnRzLmFsaWdubWVudENvbnN0cmFpbnQpIHtcbiAgICAgICAgICBpZiAoY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgdmFyIHZlcnRpY2FsQWxpZ25tZW50ID0gY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC52ZXJ0aWNhbDtcblxuICAgICAgICAgICAgdmFyIF9sb29wNiA9IGZ1bmN0aW9uIF9sb29wNihfaTExKSB7XG4gICAgICAgICAgICAgIGR1bW15VG9Ob2RlRm9yVmVydGljYWxBbGlnbm1lbnQuc2V0KFwiZHVtbXlcIiArIF9pMTEsIFtdKTtcbiAgICAgICAgICAgICAgdmVydGljYWxBbGlnbm1lbnRbX2kxMV0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgbm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5zZXQobm9kZUlkLCBcImR1bW15XCIgKyBfaTExKTtcbiAgICAgICAgICAgICAgICBkdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChcImR1bW15XCIgKyBfaTExKS5wdXNoKG5vZGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGZpeGVkTm9kZXMuaGFzKG5vZGVJZCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpeGVkTm9kZXNPbkhvcml6b250YWwuYWRkKFwiZHVtbXlcIiArIF9pMTEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGR1bW15UG9zaXRpb25zRm9yVmVydGljYWxBbGlnbm1lbnQuc2V0KFwiZHVtbXlcIiArIF9pMTEsIHhDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KHZlcnRpY2FsQWxpZ25tZW50W19pMTFdWzBdKV0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9yICh2YXIgX2kxMSA9IDA7IF9pMTEgPCB2ZXJ0aWNhbEFsaWdubWVudC5sZW5ndGg7IF9pMTErKykge1xuICAgICAgICAgICAgICBfbG9vcDYoX2kxMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb25zdHJhaW50cy5hbGlnbm1lbnRDb25zdHJhaW50Lmhvcml6b250YWwpIHtcbiAgICAgICAgICAgIHZhciBob3Jpem9udGFsQWxpZ25tZW50ID0gY29uc3RyYWludHMuYWxpZ25tZW50Q29uc3RyYWludC5ob3Jpem9udGFsO1xuXG4gICAgICAgICAgICB2YXIgX2xvb3A3ID0gZnVuY3Rpb24gX2xvb3A3KF9pMTIpIHtcbiAgICAgICAgICAgICAgZHVtbXlUb05vZGVGb3JIb3Jpem9udGFsQWxpZ25tZW50LnNldChcImR1bW15XCIgKyBfaTEyLCBbXSk7XG4gICAgICAgICAgICAgIGhvcml6b250YWxBbGlnbm1lbnRbX2kxMl0uZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgbm9kZVRvRHVtbXlGb3JIb3Jpem9udGFsQWxpZ25tZW50LnNldChub2RlSWQsIFwiZHVtbXlcIiArIF9pMTIpO1xuICAgICAgICAgICAgICAgIGR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoXCJkdW1teVwiICsgX2kxMikucHVzaChub2RlSWQpO1xuICAgICAgICAgICAgICAgIGlmIChmaXhlZE5vZGVzLmhhcyhub2RlSWQpKSB7XG4gICAgICAgICAgICAgICAgICBmaXhlZE5vZGVzT25WZXJ0aWNhbC5hZGQoXCJkdW1teVwiICsgX2kxMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgZHVtbXlQb3NpdGlvbnNGb3JIb3Jpem9udGFsQWxpZ25tZW50LnNldChcImR1bW15XCIgKyBfaTEyLCB5Q29vcmRzW25vZGVJbmRleGVzLmdldChob3Jpem9udGFsQWxpZ25tZW50W19pMTJdWzBdKV0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9yICh2YXIgX2kxMiA9IDA7IF9pMTIgPCBob3Jpem9udGFsQWxpZ25tZW50Lmxlbmd0aDsgX2kxMisrKSB7XG4gICAgICAgICAgICAgIF9sb29wNyhfaTEyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25zdHJ1Y3QgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZGFncyAoc3ViZ3JhcGhzKSBmcm9tIG92ZXJhbGwgZGFnXG4gICAgICAgIHZhciBkYWdPbkhvcml6b250YWwgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBkYWdPblZlcnRpY2FsID0gbmV3IE1hcCgpO1xuXG4gICAgICAgIHZhciBfbG9vcDggPSBmdW5jdGlvbiBfbG9vcDgobm9kZUlkKSB7XG4gICAgICAgICAgZGFnLmdldChub2RlSWQpLmZvckVhY2goZnVuY3Rpb24gKGFkamFjZW50KSB7XG4gICAgICAgICAgICB2YXIgc291cmNlSWQgPSB2b2lkIDA7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0Tm9kZSA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChhZGphY2VudFtcImRpcmVjdGlvblwiXSA9PSBcImhvcml6b250YWxcIikge1xuICAgICAgICAgICAgICBzb3VyY2VJZCA9IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KG5vZGVJZCkgPyBub2RlVG9EdW1teUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChub2RlSWQpIDogbm9kZUlkO1xuICAgICAgICAgICAgICBpZiAobm9kZVRvRHVtbXlGb3JWZXJ0aWNhbEFsaWdubWVudC5nZXQoYWRqYWNlbnQuaWQpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IHsgaWQ6IG5vZGVUb0R1bW15Rm9yVmVydGljYWxBbGlnbm1lbnQuZ2V0KGFkamFjZW50LmlkKSwgZ2FwOiBhZGphY2VudC5nYXAsIGRpcmVjdGlvbjogYWRqYWNlbnQuZGlyZWN0aW9uIH07XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IGFkamFjZW50O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChkYWdPbkhvcml6b250YWwuaGFzKHNvdXJjZUlkKSkge1xuICAgICAgICAgICAgICAgIGRhZ09uSG9yaXpvbnRhbC5nZXQoc291cmNlSWQpLnB1c2godGFyZ2V0Tm9kZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGFnT25Ib3Jpem9udGFsLnNldChzb3VyY2VJZCwgW3RhcmdldE5vZGVdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIWRhZ09uSG9yaXpvbnRhbC5oYXModGFyZ2V0Tm9kZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBkYWdPbkhvcml6b250YWwuc2V0KHRhcmdldE5vZGUuaWQsIFtdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc291cmNlSWQgPSBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KG5vZGVJZCkgPyBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KG5vZGVJZCkgOiBub2RlSWQ7XG4gICAgICAgICAgICAgIGlmIChub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGFkamFjZW50LmlkKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGUgPSB7IGlkOiBub2RlVG9EdW1teUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGFkamFjZW50LmlkKSwgZ2FwOiBhZGphY2VudC5nYXAsIGRpcmVjdGlvbjogYWRqYWNlbnQuZGlyZWN0aW9uIH07XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IGFkamFjZW50O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChkYWdPblZlcnRpY2FsLmhhcyhzb3VyY2VJZCkpIHtcbiAgICAgICAgICAgICAgICBkYWdPblZlcnRpY2FsLmdldChzb3VyY2VJZCkucHVzaCh0YXJnZXROb2RlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYWdPblZlcnRpY2FsLnNldChzb3VyY2VJZCwgW3RhcmdldE5vZGVdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIWRhZ09uVmVydGljYWwuaGFzKHRhcmdldE5vZGUuaWQpKSB7XG4gICAgICAgICAgICAgICAgZGFnT25WZXJ0aWNhbC5zZXQodGFyZ2V0Tm9kZS5pZCwgW10pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb241ID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yNSA9IGZhbHNlO1xuICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3I1ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNSA9IGRhZy5rZXlzKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDU7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjUgPSAoX3N0ZXA1ID0gX2l0ZXJhdG9yNS5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNSA9IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBub2RlSWQgPSBfc3RlcDUudmFsdWU7XG5cbiAgICAgICAgICAgIF9sb29wOChub2RlSWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGZpbmQgc291cmNlIG5vZGVzIG9mIGVhY2ggY29tcG9uZW50IGluIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRhZ3NcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3I1ID0gdHJ1ZTtcbiAgICAgICAgICBfaXRlcmF0b3JFcnJvcjUgPSBlcnI7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjUgJiYgX2l0ZXJhdG9yNS5yZXR1cm4pIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yNS5yZXR1cm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yNSkge1xuICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHVuZGlyZWN0ZWRPbkhvcml6b250YWwgPSBkYWdUb1VuZGlyZWN0ZWQoZGFnT25Ib3Jpem9udGFsKTtcbiAgICAgICAgdmFyIHVuZGlyZWN0ZWRPblZlcnRpY2FsID0gZGFnVG9VbmRpcmVjdGVkKGRhZ09uVmVydGljYWwpO1xuICAgICAgICB2YXIgY29tcG9uZW50c09uSG9yaXpvbnRhbCA9IGZpbmRDb21wb25lbnRzKHVuZGlyZWN0ZWRPbkhvcml6b250YWwpO1xuICAgICAgICB2YXIgY29tcG9uZW50c09uVmVydGljYWwgPSBmaW5kQ29tcG9uZW50cyh1bmRpcmVjdGVkT25WZXJ0aWNhbCk7XG4gICAgICAgIHZhciByZXZlcnNlZERhZ09uSG9yaXpvbnRhbCA9IGRhZ1RvUmV2ZXJzZWQoZGFnT25Ib3Jpem9udGFsKTtcbiAgICAgICAgdmFyIHJldmVyc2VkRGFnT25WZXJ0aWNhbCA9IGRhZ1RvUmV2ZXJzZWQoZGFnT25WZXJ0aWNhbCk7XG4gICAgICAgIHZhciBjb21wb25lbnRTb3VyY2VzT25Ib3Jpem9udGFsID0gW107XG4gICAgICAgIHZhciBjb21wb25lbnRTb3VyY2VzT25WZXJ0aWNhbCA9IFtdO1xuXG4gICAgICAgIGNvbXBvbmVudHNPbkhvcml6b250YWwuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICAgIGNvbXBvbmVudFNvdXJjZXNPbkhvcml6b250YWxbaW5kZXhdID0gW107XG4gICAgICAgICAgY29tcG9uZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgaWYgKHJldmVyc2VkRGFnT25Ib3Jpem9udGFsLmdldChub2RlSWQpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudFNvdXJjZXNPbkhvcml6b250YWxbaW5kZXhdLnB1c2gobm9kZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29tcG9uZW50c09uVmVydGljYWwuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50LCBpbmRleCkge1xuICAgICAgICAgIGNvbXBvbmVudFNvdXJjZXNPblZlcnRpY2FsW2luZGV4XSA9IFtdO1xuICAgICAgICAgIGNvbXBvbmVudC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgIGlmIChyZXZlcnNlZERhZ09uVmVydGljYWwuZ2V0KG5vZGVJZCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50U291cmNlc09uVmVydGljYWxbaW5kZXhdLnB1c2gobm9kZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIGFwcHJvcHJpYXRlIHBvc2l0aW9uaW5nIGZvciBzdWJncmFwaHNcbiAgICAgICAgdmFyIHBvc2l0aW9uTWFwSG9yaXpvbnRhbCA9IGZpbmRBcHByb3ByaWF0ZVBvc2l0aW9uRm9yUmVsYXRpdmVQbGFjZW1lbnQoZGFnT25Ib3Jpem9udGFsLCBcImhvcml6b250YWxcIiwgZml4ZWROb2Rlc09uSG9yaXpvbnRhbCwgZHVtbXlQb3NpdGlvbnNGb3JWZXJ0aWNhbEFsaWdubWVudCwgY29tcG9uZW50U291cmNlc09uSG9yaXpvbnRhbCk7XG4gICAgICAgIHZhciBwb3NpdGlvbk1hcFZlcnRpY2FsID0gZmluZEFwcHJvcHJpYXRlUG9zaXRpb25Gb3JSZWxhdGl2ZVBsYWNlbWVudChkYWdPblZlcnRpY2FsLCBcInZlcnRpY2FsXCIsIGZpeGVkTm9kZXNPblZlcnRpY2FsLCBkdW1teVBvc2l0aW9uc0Zvckhvcml6b250YWxBbGlnbm1lbnQsIGNvbXBvbmVudFNvdXJjZXNPblZlcnRpY2FsKTtcblxuICAgICAgICAvLyB1cGRhdGUgcG9zaXRpb25zIG9mIHRoZSBub2RlcyBiYXNlZCBvbiByZWxhdGl2ZSBwbGFjZW1lbnQgY29uc3RyYWludHNcblxuICAgICAgICB2YXIgX2xvb3A5ID0gZnVuY3Rpb24gX2xvb3A5KGtleSkge1xuICAgICAgICAgIGlmIChkdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChrZXkpKSB7XG4gICAgICAgICAgICBkdW1teVRvTm9kZUZvclZlcnRpY2FsQWxpZ25tZW50LmdldChrZXkpLmZvckVhY2goZnVuY3Rpb24gKG5vZGVJZCkge1xuICAgICAgICAgICAgICB4Q29vcmRzW25vZGVJbmRleGVzLmdldChub2RlSWQpXSA9IHBvc2l0aW9uTWFwSG9yaXpvbnRhbC5nZXQoa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB4Q29vcmRzW25vZGVJbmRleGVzLmdldChrZXkpXSA9IHBvc2l0aW9uTWFwSG9yaXpvbnRhbC5nZXQoa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb242ID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yNiA9IGZhbHNlO1xuICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3I2ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNiA9IHBvc2l0aW9uTWFwSG9yaXpvbnRhbC5rZXlzKClbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDY7ICEoX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjYgPSAoX3N0ZXA2ID0gX2l0ZXJhdG9yNi5uZXh0KCkpLmRvbmUpOyBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNiA9IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBfc3RlcDYudmFsdWU7XG5cbiAgICAgICAgICAgIF9sb29wOShrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2RpZEl0ZXJhdG9yRXJyb3I2ID0gdHJ1ZTtcbiAgICAgICAgICBfaXRlcmF0b3JFcnJvcjYgPSBlcnI7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjYgJiYgX2l0ZXJhdG9yNi5yZXR1cm4pIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yNi5yZXR1cm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yNikge1xuICAgICAgICAgICAgICB0aHJvdyBfaXRlcmF0b3JFcnJvcjY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9sb29wMTAgPSBmdW5jdGlvbiBfbG9vcDEwKGtleSkge1xuICAgICAgICAgIGlmIChkdW1teVRvTm9kZUZvckhvcml6b250YWxBbGlnbm1lbnQuZ2V0KGtleSkpIHtcbiAgICAgICAgICAgIGR1bW15VG9Ob2RlRm9ySG9yaXpvbnRhbEFsaWdubWVudC5nZXQoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgICAgICAgICAgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQobm9kZUlkKV0gPSBwb3NpdGlvbk1hcFZlcnRpY2FsLmdldChrZXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHlDb29yZHNbbm9kZUluZGV4ZXMuZ2V0KGtleSldID0gcG9zaXRpb25NYXBWZXJ0aWNhbC5nZXQoa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb243ID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9kaWRJdGVyYXRvckVycm9yNyA9IGZhbHNlO1xuICAgICAgICB2YXIgX2l0ZXJhdG9yRXJyb3I3ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNyA9IHBvc2l0aW9uTWFwVmVydGljYWwua2V5cygpW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3N0ZXA3OyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb243ID0gKF9zdGVwNyA9IF9pdGVyYXRvcjcubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbjcgPSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gX3N0ZXA3LnZhbHVlO1xuXG4gICAgICAgICAgICBfbG9vcDEwKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfZGlkSXRlcmF0b3JFcnJvcjcgPSB0cnVlO1xuICAgICAgICAgIF9pdGVyYXRvckVycm9yNyA9IGVycjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uNyAmJiBfaXRlcmF0b3I3LnJldHVybikge1xuICAgICAgICAgICAgICBfaXRlcmF0b3I3LnJldHVybigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoX2RpZEl0ZXJhdG9yRXJyb3I3KSB7XG4gICAgICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yNztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gYXNzaWduIG5ldyBjb29yZGluYXRlcyB0byBub2RlcyBhZnRlciBjb25zdHJhaW50IGhhbmRsaW5nXG4gIGZvciAodmFyIF9pMTMgPSAwOyBfaTEzIDwgYWxsTm9kZXMubGVuZ3RoOyBfaTEzKyspIHtcbiAgICB2YXIgX25vZGUgPSBhbGxOb2Rlc1tfaTEzXTtcbiAgICBpZiAoX25vZGUuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgICBfbm9kZS5zZXRDZW50ZXIoeENvb3Jkc1tub2RlSW5kZXhlcy5nZXQoX25vZGUuaWQpXSwgeUNvb3Jkc1tub2RlSW5kZXhlcy5nZXQoX25vZGUuaWQpXSk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbnN0cmFpbnRIYW5kbGVyO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gNTUxOlxuLyoqKi8gKChtb2R1bGUpID0+IHtcblxubW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX181NTFfXztcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gXHR9KTtcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqLyBcdFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIHN0YXJ0dXBcbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdC8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NSk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX2V4cG9ydHNfXztcbi8qKioqKiovIH0pKClcbjtcbn0pOyIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLl9kYXNoLXVuZG8tcmVkbyB7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgYm90dG9tOiAzMHB4O1xcbiAgICBsZWZ0OiAzMHB4O1xcbiAgICBmb250LXNpemU6IDIwcHg7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgei1pbmRleDogOTk5OTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcbn1cXG4uX2Rhc2gtdW5kby1yZWRvID4gZGl2IHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsge1xcbiAgICBjb2xvcjogIzAwNzRkOTtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcXG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIG9wYWNpdHk6IDAuMjtcXG59XFxuLl9kYXNoLXVuZG8tcmVkby1saW5rOmhvdmVyIHtcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuLl9kYXNoLXVuZG8tcmVkby1saW5rIC5fZGFzaC1pY29uLXVuZG8ge1xcbiAgICBmb250LXNpemU6IDIwcHg7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7XFxufVxcbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtaWNvbi1yZWRvIHtcXG4gICAgZm9udC1zaXplOiAyMHB4O1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XFxufVxcbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtdW5kby1yZWRvLWxhYmVsIHtcXG4gICAgZm9udC1zaXplOiAxNXB4O1xcbn1cXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9jb3JlL1Rvb2xiYXIuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksZUFBZTtJQUNmLFlBQVk7SUFDWixVQUFVO0lBQ1YsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixhQUFhO0lBQ2IsMENBQTBDO0FBQzlDO0FBQ0E7SUFDSSxrQkFBa0I7QUFDdEI7QUFDQTtJQUNJLGNBQWM7SUFDZCxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixxQkFBcUI7SUFDckIsWUFBWTtBQUNoQjtBQUNBO0lBQ0ksVUFBVTtBQUNkO0FBQ0E7SUFDSSxlQUFlO0lBQ2YseUJBQXlCO0FBQzdCO0FBQ0E7SUFDSSxlQUFlO0lBQ2Ysd0JBQXdCO0FBQzVCO0FBQ0E7SUFDSSxlQUFlO0FBQ25CXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5fZGFzaC11bmRvLXJlZG8ge1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgIGJvdHRvbTogMzBweDtcXG4gICAgbGVmdDogMzBweDtcXG4gICAgZm9udC1zaXplOiAyMHB4O1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIHotaW5kZXg6IDk5OTk7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTtcXG59XFxuLl9kYXNoLXVuZG8tcmVkbyA+IGRpdiB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuLl9kYXNoLXVuZG8tcmVkby1saW5rIHtcXG4gICAgY29sb3I6ICMwMDc0ZDk7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XFxuICAgIG1hcmdpbi1yaWdodDogMTBweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBvcGFjaXR5OiAwLjI7XFxufVxcbi5fZGFzaC11bmRvLXJlZG8tbGluazpob3ZlciB7XFxuICAgIG9wYWNpdHk6IDE7XFxufVxcbi5fZGFzaC11bmRvLXJlZG8tbGluayAuX2Rhc2gtaWNvbi11bmRvIHtcXG4gICAgZm9udC1zaXplOiAyMHB4O1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1xcbn1cXG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsgLl9kYXNoLWljb24tcmVkbyB7XFxuICAgIGZvbnQtc2l6ZTogMjBweDtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xcbn1cXG4uX2Rhc2gtdW5kby1yZWRvLWxpbmsgLl9kYXNoLXVuZG8tcmVkby1sYWJlbCB7XFxuICAgIGZvbnQtc2l6ZTogMTVweDtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLmRhc2gtY2FsbGJhY2stZGFnLS1jb250YWluZXIge1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIHdpZHRoOiA4MHZ3O1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIGhlaWdodDogY2FsYygxMDB2aCAtIDc1cHgpO1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIC8qIHNoYWRvdy0xICovXFxuICAgIGJveC1zaGFkb3c6IDBweCA2cHggMTZweCByZ2JhKDgwLCAxMDMsIDEzMiwgMC4xNjUpLFxcbiAgICAgICAgMHB4IDJweCA2cHggcmdiYSg4MCwgMTAzLCAxMzIsIDAuMTIpLFxcbiAgICAgICAgMHB4IDBweCAxcHggcmdiYSg4MCwgMTAzLCAxMzIsIDAuMzIpO1xcbn1cXG5cXG4uZGFzaC1jYWxsYmFjay1kYWctLWluZm8ge1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcGFkZGluZzogOHB4O1xcbiAgICBib3R0b206IDE2cHg7XFxuICAgIGxlZnQ6IDE2cHg7XFxuICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gMzJweCk7XFxuICAgIG1heC1oZWlnaHQ6IDUwJTtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTtcXG4gICAgYm9yZGVyOiAycHggc29saWQgI2NjYztcXG4gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWY7XFxufVxcblxcbi5kYXNoLWNhbGxiYWNrLWRhZy0tbWVzc2FnZSB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBoZWlnaHQ6IDEwMCU7XFxuICAgIGxpbmUtaGVpZ2h0OiAyZW07XFxuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmO1xcbn1cXG5cXG4uZGFzaC1jYWxsYmFjay1kYWctLWxheW91dFNlbGVjdG9yIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IDNweDtcXG4gICAgcmlnaHQ6IDNweDtcXG59XFxuXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL2NvbXBvbmVudHMvZXJyb3IvQ2FsbGJhY2tHcmFwaC9DYWxsYmFja0dyYXBoQ29udGFpbmVyLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLDBCQUEwQjtJQUMxQixnQkFBZ0I7SUFDaEIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixxQkFBcUI7SUFDckIsYUFBYTtJQUNiOzs0Q0FFd0M7QUFDNUM7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixZQUFZO0lBQ1osVUFBVTtJQUNWLDRCQUE0QjtJQUM1QixlQUFlO0lBQ2YsY0FBYztJQUNkLHNCQUFzQjtJQUN0QixvQ0FBb0M7SUFDcEMsc0JBQXNCO0lBQ3RCLGdDQUFnQztBQUNwQzs7QUFFQTtJQUNJLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGdDQUFnQztBQUNwQzs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsVUFBVTtBQUNkXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5kYXNoLWNhbGxiYWNrLWRhZy0tY29udGFpbmVyIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICB3aWR0aDogODB2dztcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBoZWlnaHQ6IGNhbGMoMTAwdmggLSA3NXB4KTtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICAvKiBzaGFkb3ctMSAqL1xcbiAgICBib3gtc2hhZG93OiAwcHggNnB4IDE2cHggcmdiYSg4MCwgMTAzLCAxMzIsIDAuMTY1KSxcXG4gICAgICAgIDBweCAycHggNnB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjEyKSxcXG4gICAgICAgIDBweCAwcHggMXB4IHJnYmEoODAsIDEwMywgMTMyLCAwLjMyKTtcXG59XFxuXFxuLmRhc2gtY2FsbGJhY2stZGFnLS1pbmZvIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHBhZGRpbmc6IDhweDtcXG4gICAgYm90dG9tOiAxNnB4O1xcbiAgICBsZWZ0OiAxNnB4O1xcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDMycHgpO1xcbiAgICBtYXgtaGVpZ2h0OiA1MCU7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7XFxuICAgIGJvcmRlcjogMnB4IHNvbGlkICNjY2M7XFxuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmO1xcbn1cXG5cXG4uZGFzaC1jYWxsYmFjay1kYWctLW1lc3NhZ2Uge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgaGVpZ2h0OiAxMDAlO1xcbiAgICBsaW5lLWhlaWdodDogMmVtO1xcbiAgICBmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZjtcXG59XFxuXFxuLmRhc2gtY2FsbGJhY2stZGFnLS1sYXlvdXRTZWxlY3RvciB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAzcHg7XFxuICAgIHJpZ2h0OiAzcHg7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi5lcnJvci1jb250YWluZXIge1xcbiAgICBwYWRkaW5nOiAwIDEwcHg7XFxuICAgIGZvbnQtZmFtaWx5OiBDb3VyaWVyO1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9faWNvbi14IHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICByaWdodDogMDtcXG4gICAgdG9wOiAwO1xcbiAgICBjb2xvcjogI2I5YzJjZTtcXG4gICAgZm9udC1zaXplOiAyMHB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19pY29uLXg6aG92ZXIge1xcbiAgICBjb2xvcjogI2ExYTliNTtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JzIHtcXG4gICAgbWluLXdpZHRoOiAzODZweDtcXG4gICAgbWF4LXdpZHRoOiA2NTBweDtcXG4gICAgbWF4LWhlaWdodDogNDUwcHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2ljb24tZXJyb3Ige1xcbiAgICB3aWR0aDogMjBweDtcXG4gICAgaGVpZ2h0OiAyMHB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIG1hcmdpbi1yaWdodDogMTZweDtcXG59XFxuLmRhc2gtZmUtZXJyb3JfX2ljb24tY2xvc2Uge1xcbiAgICB3aWR0aDogMTBweDtcXG4gICAgaGVpZ2h0OiAxMHB4O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHJpZ2h0OiAxMnB4O1xcbiAgICB0b3A6IDEycHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuLmRhc2gtZmUtZXJyb3JfX2ljb24tYXJyb3cge1xcbiAgICB3aWR0aDogOHB4O1xcbiAgICBoZWlnaHQ6IDI4cHg7XFxuICAgIG1hcmdpbjogMHB4IDhweDtcXG59XFxuLmRhc2gtZmUtZXJyb3ItdG9wX19ncm91cDpmaXJzdC1jaGlsZCB7XFxuICAgIC8qXFxuICAgICAqIDc3JSBpcyB0aGUgbWF4aW11bSBzcGFjZSBhbGxvd2VkIGJhc2VkIG9mZiBvZiB0aGUgb3RoZXIgZWxlbWVudHNcXG4gICAgICogaW4gdGhlIHRvcCBwYXJ0IG9mIHRoZSBlcnJvciBjb250YWluZXIgKHRpbWVzdGFtcCAmIGNvbGxhcHNlIGFycm93KS5cXG4gICAgICogdGhpcyB3YXMgbWFudWFsbHkgZGV0ZXJtaW5lZCAqL1xcbiAgICB3aWR0aDogNzclO1xcbn1cXG4uZGFzaC1mZS1lcnJvci10b3BfX2dyb3VwIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcbi5kYXNoLWZlLWVycm9yX190aXRsZSB7XFxuICAgIHRleHQtYWxpZ246IGxlZnQ7XFxuICAgIG1hcmdpbjogMHB4O1xcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xcbiAgICBwYWRkaW5nOiAwcHg7XFxuICAgIGZvbnQtc2l6ZTogMTIuNnB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICBsaW5lLWhlaWdodDogMjBweDtcXG59XFxuLmRhc2gtZmUtZXJyb3JfX3RpbWVzdGFtcCB7XFxuICAgIG1hcmdpbi1yaWdodDogMjBweDtcXG59XFxuLmRhc2gtZmUtZXJyb3JfX2NvbGxhcHNlLS1mbGlwcGVkIHtcXG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2luZm9fdGl0bGUge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIGNvbG9yOiAjNTA2Nzg0O1xcbiAgICBmb250LXNpemU6IDE2cHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2Y2ZmE7XFxuICAgIGJvcmRlcjogMnB4IHNvbGlkICNkZmU4ZjM7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDtcXG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDtcXG4gICAgcGFkZGluZzogMTBweDtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2luZm8ge1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGZlOGYzO1xcbiAgICBtYXJnaW46IDAgMCAxZW0gMDtcXG4gICAgcGFkZGluZzogMTBweDtcXG5cXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIGJvcmRlcjogMnB4IHNvbGlkICNkZmU4ZjM7XFxuICAgIGNvbG9yOiAjNTA2Nzg0O1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9fY3VydmVkIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9fY3VydmVkLXRvcCB7XFxuICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDtcXG4gICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDtcXG4gICAgYm9yZGVyLWJvdHRvbS13aWR0aDogMHB4O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9fY3VydmVkLWJvdHRvbSB7XFxuICAgIGJvcmRlci1yYWRpdXMtYm90dG9tLWxlZnQ6IDRweDtcXG4gICAgYm9yZGVyLXJhZGl1cy1ib3R0b20tcmlnaHQ6IDRweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZWZlZjtcXG59XFxuXFxuLmRhc2gtYmUtZXJyb3JfX3N0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZkZjNmNDtcXG4gICAgbWluLXdpZHRoOiAzODZweDtcXG4gICAgbWF4LXdpZHRoOiA2NTBweDtcXG4gICAgLyogaWZyYW1lIGNvbnRhaW5lciBoYW5kbGVzIHRoZSBzY3JvbGxpbmcgKi9cXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4uZGFzaC1iZS1lcnJvcl9fc3RyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjZmYTtcXG4gICAgbWluLXdpZHRoOiAzODZweDtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbiAgICBsaW5lLWhlaWdodDogMTdweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbn1cXG5cXG4uZGFzaC1iYWNrZW5kLWVycm9yIHtcXG4gICAgcGFkZGluZzogOHB4O1xcbn1cXG5cXG4uZGFzaC1lcnJvci1tZW51IHtcXG4gICAgbWF4LXdpZHRoOiA1MCU7XFxuICAgIG1heC1oZWlnaHQ6IDYwJTtcXG4gICAgZGlzcGxheTogY29udGVudHM7XFxuICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gICAgZm9udC12YXJpYW50LWxpZ2F0dXJlczogY29tbW9uLWxpZ2F0dXJlcztcXG4gICAgY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcXG59XFxuXFxuLmRhc2gtZXJyb3ItY2FyZCB7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgLyogc2hhZG93LTEgKi9cXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBhbmltYXRpb246IGRhc2gtZXJyb3ItY2FyZC1hbmltYXRpb24gMC41cztcXG4gICAgcGFkZGluZzogMjRweDtcXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcXG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XFxuICAgIHdpZHRoOiAxMDAlO1xcbn1cXG4uZGFzaC1lcnJvci1jYXJkLS1hbGVydHMtdHJheSB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAtMzAwcHg7XFxuICAgIGxlZnQ6IC0xcHg7XFxuICAgIGFuaW1hdGlvbjogbm9uZTtcXG4gICAgYm94LXNoYWRvdzogbm9uZTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2VjZWNlYztcXG4gICAgYm9yZGVyLWJvdHRvbTogMDtcXG4gICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMHB4O1xcbiAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMHB4O1xcbiAgICB3aWR0aDogNDIycHg7XFxufVxcbi5kYXNoLWVycm9yLWNhcmQtLWNvbnRhaW5lciB7XFxuICAgIHBhZGRpbmc6IDE2cHg7XFxuICAgIHdpZHRoOiA2MDBweDtcXG4gICAgbWF4LXdpZHRoOiA4MDBweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogNHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcXG4gICAgYm94LXNoYWRvdzogMHB4IDAuN3B4IDEuNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDcpLFxcbiAgICAgICAgMHB4IDEuOXB4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjA1KSxcXG4gICAgICAgIDBweCA0LjVweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDUpO1xcbn1cXG5cXG4uZGFzaC1lcnJvci1jYXJkX190b3BiYXIge1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgaGVpZ2h0OiAzMnB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBwYWRkaW5nLWJvdHRvbTogMTRweDtcXG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcXG59XFxuLmRhc2gtZXJyb3ItY2FyZF9fbWVzc2FnZSB7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG59XFxuXFxuLmRhc2gtZXJyb3ItY2FyZF9fbWVzc2FnZSA+IHN0cm9uZyB7XFxuICAgIGNvbG9yOiAjZmY0NTAwO1xcbn1cXG5cXG4uZGFzaC1lcnJvci1jYXJkX19jb250ZW50IHtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTVweDtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMTg2NjFhO1xcbiAgICBmb250LXNpemU6IDEyLjZweDtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3ItaXRlbSB7XFxuICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XFxuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBwYWRkaW5nOiA4cHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuQGtleWZyYW1lcyBkYXNoLWVycm9yLWNhcmQtYW5pbWF0aW9uIHtcXG4gICAgZnJvbSB7XFxuICAgICAgICBvcGFjaXR5OiAwO1xcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMSk7XFxuICAgICAgICAtbW96LXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgICAgIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEuMSk7XFxuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMSk7XFxuICAgIH1cXG4gICAgdG8ge1xcbiAgICAgICAgb3BhY2l0eTogMTtcXG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gICAgICAgIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXG4gICAgfVxcbn1cXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9lcnJvci9Gcm9udEVuZC9Gcm9udEVuZEVycm9yLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGVBQWU7SUFDZixvQkFBb0I7QUFDeEI7O0FBRUE7SUFDSSxrQkFB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O0lBQ25CLDJCQUEyQjtJQUMzQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLGFBQWE7SUFDYiw4QkFBOEI7SUFDOUIsbUJBQW1CO0lBQ25CLFlBQVk7SUFDWixlQUFlO0FBQ25COztBQUVBO0lBQ0k7UUFDSSxVQUFVO1FBQ1YsNkJBQTZCO1FBQzdCLDBCQUEwQjtRQUMxQix5QkFBeUI7UUFDekIscUJBQXFCO0lBQ3pCO0lBQ0E7UUFDSSxVQUFVO1FBQ1YsMkJBQTJCO1FBQzNCLHdCQUF3QjtRQUN4Qix1QkFBdUI7UUFDdkIsbUJBQW1CO0lBQ3ZCO0FBQ0pcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmVycm9yLWNvbnRhaW5lciB7XFxuICAgIHBhZGRpbmc6IDAgMTBweDtcXG4gICAgZm9udC1mYW1pbHk6IENvdXJpZXI7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19pY29uLXgge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHJpZ2h0OiAwO1xcbiAgICB0b3A6IDA7XFxuICAgIGNvbG9yOiAjYjljMmNlO1xcbiAgICBmb250LXNpemU6IDIwcHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLmRhc2gtZmUtZXJyb3JfX2ljb24teDpob3ZlciB7XFxuICAgIGNvbG9yOiAjYTFhOWI1O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcnMge1xcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xcbiAgICBtYXgtd2lkdGg6IDY1MHB4O1xcbiAgICBtYXgtaGVpZ2h0OiA0NTBweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9faWNvbi1lcnJvciB7XFxuICAgIHdpZHRoOiAyMHB4O1xcbiAgICBoZWlnaHQ6IDIwcHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgbWFyZ2luLXJpZ2h0OiAxNnB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9faWNvbi1jbG9zZSB7XFxuICAgIHdpZHRoOiAxMHB4O1xcbiAgICBoZWlnaHQ6IDEwcHg7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IDEycHg7XFxuICAgIHRvcDogMTJweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9faWNvbi1hcnJvdyB7XFxuICAgIHdpZHRoOiA4cHg7XFxuICAgIGhlaWdodDogMjhweDtcXG4gICAgbWFyZ2luOiAwcHggOHB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvci10b3BfX2dyb3VwOmZpcnN0LWNoaWxkIHtcXG4gICAgLypcXG4gICAgICogNzclIGlzIHRoZSBtYXhpbXVtIHNwYWNlIGFsbG93ZWQgYmFzZWQgb2ZmIG9mIHRoZSBvdGhlciBlbGVtZW50c1xcbiAgICAgKiBpbiB0aGUgdG9wIHBhcnQgb2YgdGhlIGVycm9yIGNvbnRhaW5lciAodGltZXN0YW1wICYgY29sbGFwc2UgYXJyb3cpLlxcbiAgICAgKiB0aGlzIHdhcyBtYW51YWxseSBkZXRlcm1pbmVkICovXFxuICAgIHdpZHRoOiA3NyU7XFxufVxcbi5kYXNoLWZlLWVycm9yLXRvcF9fZ3JvdXAge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuLmRhc2gtZmUtZXJyb3JfX3RpdGxlIHtcXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcXG4gICAgbWFyZ2luOiAwcHg7XFxuICAgIG1hcmdpbi1sZWZ0OiA1cHg7XFxuICAgIHBhZGRpbmc6IDBweDtcXG4gICAgZm9udC1zaXplOiAxMi42cHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxuICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9fdGltZXN0YW1wIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiAyMHB4O1xcbn1cXG4uZGFzaC1mZS1lcnJvcl9fY29sbGFwc2UtLWZsaXBwZWQge1xcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICAgIC1tcy10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9faW5mb190aXRsZSB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgY29sb3I6ICM1MDY3ODQ7XFxuICAgIGZvbnQtc2l6ZTogMTZweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YzZjZmYTtcXG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xcbiAgICBwYWRkaW5nOiAxMHB4O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvcl9faW5mbyB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZmU4ZjM7XFxuICAgIG1hcmdpbjogMCAwIDFlbSAwO1xcbiAgICBwYWRkaW5nOiAxMHB4O1xcblxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgYm9yZGVyOiAycHggc29saWQgI2RmZThmMztcXG4gICAgY29sb3I6ICM1MDY3ODQ7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19jdXJ2ZWQge1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19jdXJ2ZWQtdG9wIHtcXG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItYm90dG9tLXdpZHRoOiAwcHg7XFxufVxcblxcbi5kYXNoLWZlLWVycm9yX19jdXJ2ZWQtYm90dG9tIHtcXG4gICAgYm9yZGVyLXJhZGl1cy1ib3R0b20tbGVmdDogNHB4O1xcbiAgICBib3JkZXItcmFkaXVzLWJvdHRvbS1yaWdodDogNHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZlZmVmO1xcbn1cXG5cXG4uZGFzaC1iZS1lcnJvcl9fc3Qge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmRmM2Y0O1xcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xcbiAgICBtYXgtd2lkdGg6IDY1MHB4O1xcbiAgICAvKiBpZnJhbWUgY29udGFpbmVyIGhhbmRsZXMgdGhlIHNjcm9sbGluZyAqL1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcblxcbi5kYXNoLWJlLWVycm9yX19zdHIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNmZhO1xcbiAgICBtaW4td2lkdGg6IDM4NnB4O1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIGxpbmUtaGVpZ2h0OiAxN3B4O1xcbiAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxufVxcblxcbi5kYXNoLWJhY2tlbmQtZXJyb3Ige1xcbiAgICBwYWRkaW5nOiA4cHg7XFxufVxcblxcbi5kYXNoLWVycm9yLW1lbnUge1xcbiAgICBtYXgtd2lkdGg6IDUwJTtcXG4gICAgbWF4LWhlaWdodDogNjAlO1xcbiAgICBkaXNwbGF5OiBjb250ZW50cztcXG4gICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBmb250LXZhcmlhbnQtbGlnYXR1cmVzOiBjb21tb24tbGlnYXR1cmVzO1xcbiAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbn1cXG5cXG4uZGFzaC1lcnJvci1jYXJkIHtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICAvKiBzaGFkb3ctMSAqL1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGFuaW1hdGlvbjogZGFzaC1lcnJvci1jYXJkLWFuaW1hdGlvbiAwLjVzO1xcbiAgICBwYWRkaW5nOiAyNHB4O1xcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcXG4gICAgd2lkdGg6IDEwMCU7XFxufVxcbi5kYXNoLWVycm9yLWNhcmQtLWFsZXJ0cy10cmF5IHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IC0zMDBweDtcXG4gICAgbGVmdDogLTFweDtcXG4gICAgYW5pbWF0aW9uOiBub25lO1xcbiAgICBib3gtc2hhZG93OiBub25lO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZWNlY2VjO1xcbiAgICBib3JkZXItYm90dG9tOiAwO1xcbiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwcHg7XFxuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwcHg7XFxuICAgIHdpZHRoOiA0MjJweDtcXG59XFxuLmRhc2gtZXJyb3ItY2FyZC0tY29udGFpbmVyIHtcXG4gICAgcGFkZGluZzogMTZweDtcXG4gICAgd2lkdGg6IDYwMHB4O1xcbiAgICBtYXgtd2lkdGg6IDgwMHB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiA0cHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBib3gtc2hhZG93OiAwcHggMC43cHggMS40cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNyksXFxuICAgICAgICAwcHggMS45cHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDUpLFxcbiAgICAgICAgMHB4IDQuNXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XFxufVxcblxcbi5kYXNoLWVycm9yLWNhcmRfX3RvcGJhciB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDMycHg7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHBhZGRpbmctYm90dG9tOiAxNHB4O1xcbiAgICBmb250LXdlaWdodDogNzAwO1xcbn1cXG4uZGFzaC1lcnJvci1jYXJkX19tZXNzYWdlIHtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbn1cXG5cXG4uZGFzaC1lcnJvci1jYXJkX19tZXNzYWdlID4gc3Ryb25nIHtcXG4gICAgY29sb3I6ICNmZjQ1MDA7XFxufVxcblxcbi5kYXNoLWVycm9yLWNhcmRfX2NvbnRlbnQge1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjMDAxODY2MWE7XFxuICAgIGZvbnQtc2l6ZTogMTIuNnB4O1xcbn1cXG5cXG4uZGFzaC1mZS1lcnJvci1pdGVtIHtcXG4gICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcXG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHBhZGRpbmc6IDhweDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG5Aa2V5ZnJhbWVzIGRhc2gtZXJyb3ItY2FyZC1hbmltYXRpb24ge1xcbiAgICBmcm9tIHtcXG4gICAgICAgIG9wYWNpdHk6IDA7XFxuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgICAgIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxLjEpO1xcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gICAgfVxcbiAgICB0byB7XFxuICAgICAgICBvcGFjaXR5OiAxO1xcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMSk7XFxuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcbiAgICB9XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi5wZXJjeS1zaG93IHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuQG1lZGlhIG9ubHkgcGVyY3kge1xcbiAgICAucGVyY3ktaGlkZSB7XFxuICAgICAgICBkaXNwbGF5OiBub25lO1xcbiAgICB9XFxuICAgIC5wZXJjeS1zaG93IHtcXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICB9XFxufVxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9jb21wb25lbnRzL2Vycm9yL1BlcmN5LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGFBQWE7QUFDakI7O0FBRUE7SUFDSTtRQUNJLGFBQWE7SUFDakI7SUFDQTtRQUNJLGNBQWM7SUFDbEI7QUFDSlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIucGVyY3ktc2hvdyB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbkBtZWRpYSBvbmx5IHBlcmN5IHtcXG4gICAgLnBlcmN5LWhpZGUge1xcbiAgICAgICAgZGlzcGxheTogbm9uZTtcXG4gICAgfVxcbiAgICAucGVyY3ktc2hvdyB7XFxuICAgICAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgfVxcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIuZGFzaC1kZWJ1Zy1tZW51IHtcXG4gICAgdHJhbnNpdGlvbjogMC4zcztcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBib3R0b206IDM1cHg7XFxuICAgIHJpZ2h0OiAzNXB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgei1pbmRleDogMTAwMDE7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMxMTlkZmY7XFxuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XFxuICAgIHdpZHRoOiA2NHB4O1xcbiAgICBoZWlnaHQ6IDY0cHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLmRhc2gtZGVidWctbWVudS0tb3BlbiB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKC0xODBkZWcpO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19vdXRlciBidXR0b24ge1xcbiAgICBoZWlnaHQ6IGF1dG87XFxuICAgIHBhZGRpbmc6IDAgOHB4O1xcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xcbiAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiAwcHg7XFxuICAgIGxldHRlci1zcGFjaW5nOiBub3JtYWw7XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIGdhcDogNnB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgYmFja2dyb3VuZDogbm9uZTtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fcG9wdXAge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJvdHRvbTogMTAwJTtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIGdhcDogOHB4O1xcbiAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNzVweCk7XFxuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIHdpZHRoOiA0MjZweDtcXG4gICAgcGFkZGluZzogMTZweDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XFxuICAgIGdhcDogOHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiA4cHg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMjQsIDEwMiwgMC4xKTtcXG4gICAgYmFja2dyb3VuZDogI2ZmZjtcXG4gICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgLyogU2hhZG93L1NtYWxsICovXFxuICAgIGJveC1zaGFkb3c6IDBweCAwLjdweCAxLjRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjA3KSxcXG4gICAgICAgIDBweCAxLjlweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNSksXFxuICAgICAgICAwcHggNC41cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X190ZXh0IHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX3RleHQgYSB7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fdGV4dCBzcGFuIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dCBidXR0b24ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBoZWlnaHQ6IDI0cHg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgbGluZS1oZWlnaHQ6IDE4cHg7XFxuICAgIHBhZGRpbmc6IDE2cHggMTJweDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X19idXR0b25zLWNvbnRhaW5lciB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGdhcDogOHB4O1xcbiAgICBhbGlnbi1zZWxmOiBzdHJldGNoO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgcGFkZGluZy10b3A6IDE2cHg7XFxuICAgIG1hcmdpbi10b3A6IDE2cHg7XFxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDI0LCAxMDIsIDAuMSk7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fYnV0dG9uLXByaW1hcnkge1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIGNvbG9yOiAjZmZmO1xcbiAgICBiYWNrZ3JvdW5kOiAjN2Y0YmM0O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX2J1dHRvbi1zZWNvbmRhcnkge1xcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE2MSwgODksIDI1NSwgMC4wNSk7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDEzNCwgNzQsIDIxMiwgMC44KTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudTpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM3ZjRiYzQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIHtcXG4gICAgdHJhbnNpdGlvbjogMC4zcztcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBib3R0b206IC0xcHg7XFxuICAgIHJpZ2h0OiAtMXB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBjb2xvcjogYmxhY2s7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgei1pbmRleDogMTAwMDA7XFxuICAgIGJvcmRlci1yYWRpdXM6IDVweCAwIDAgMDtcXG4gICAgcGFkZGluZzogMTVweCAwO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNmZhO1xcbiAgICBib3gtc2hhZG93OiAwcHggMC44cHggMC44cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNCksXFxuICAgICAgICAwcHggMi4zcHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDMpO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDI0LCAxMDIsIDAuMSk7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyLmRhc2gtZGVidWctbWVudV9fb3V0ZXItLWNvbGxhcHNlZCB7XFxuICAgIG1heC13aWR0aDogNTBweDtcXG59XFxuLmRhc2gtZGVidWctbWVudV9fb3V0ZXIuZGFzaC1kZWJ1Zy1tZW51X19vdXRlci0tZXhwYW5kZWQge1xcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSA1MHB4KTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS10b29sdGlwIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBib3R0b206IGNhbGMoMTAwJSArIDEycHgpO1xcbiAgICByaWdodDogMDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMTg2NjFhO1xcbiAgICBwYWRkaW5nOiAxMXB4O1xcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDE0cHggNXB4ICMwMDAwMDAxMjtcXG4gICAgei1pbmRleDogMTIwMDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdG9nZ2xlIHtcXG4gICAgY29sb3I6ICM3ZjRiYzQ7XFxuICAgIHRyYW5zaXRpb246IDAuM3M7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX3RvZ2dsZS0tZXhwYW5kZWQge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbn1cXG4uZGFzaC1kZWJ1Zy1tZW51X19lcnJvci1pbmRpY2F0b3Ige1xcbiAgICB3aWR0aDogOHB4O1xcbiAgICBoZWlnaHQ6IDhweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0RDM0U0MjtcXG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICByaWdodDogM3B4O1xcbiAgICB0b3A6IDEzcHg7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX3N0YXR1cyB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGdhcDogNnB4O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19jb250ZW50IHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XFxuICAgIG1hcmdpbi1sZWZ0OiAxNXB4O1xcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC41cyBlYXNlO1xcbiAgICBmbGV4LXNocmluazogMDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbiB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fZGl2aWRlciB7XFxuICAgIHdpZHRoOiAxLjVweDtcXG4gICAgaGVpZ2h0OiAyNnB4O1xcbiAgICBtYXJnaW46IDBweCAxM3B4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAxNTU5NGQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbiB7XFxuICAgIGJhY2tncm91bmQ6IG5vbmU7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgYm94LXNoYWRvdzogMCAxcHggI2QzZGFlNjtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4ycztcXG4gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcXG4gICAgY29sb3I6ICM3ZjRiYzQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tc2VsZWN0ZWQge1xcbiAgICBjb2xvcjogIzdmNGJjNDtcXG4gICAgYm94LXNoYWRvdzogMCAycHggIzdmNGJjNDtcXG59XFxuLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLmRhc2gtZGVidWctbWVudV9fYnV0dG9uLS1zZWxlY3RlZDpob3ZlciB7XFxuICAgIGNvbG9yOiAjNTgwNmM0O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1hbGVydCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGZvbnQtc2l6ZTogMTBweDtcXG59XFxuXFxuLmRhc2gtZGVidWctYWxlcnQtbGFiZWwge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgIGJvdHRvbTogODFweDtcXG4gICAgcmlnaHQ6IDI5cHg7XFxuICAgIHotaW5kZXg6IDEwMDAyO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4yNSksXFxuICAgICAgICAwcHggMXB4IDNweCByZ2JhKDE2MiwgMTc3LCAxOTgsIDAuMzIpO1xcbiAgICBib3JkZXItcmFkaXVzOiAzMnB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgcGFkZGluZzogNHB4O1xcbiAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19lcnJvci1jb3VudCB7XFxuICAgIGZvbnQtc2l6ZTogMTJweDtcXG4gICAgY29sb3I6ICNmZmY7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNjNzNhM2E7XFxuICAgIHBhZGRpbmc6IDNweCA1cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcXG59XFxuXFxuLmRhc2gtZGVidWctZGlzY29ubmVjdGVkIHtcXG4gICAgZm9udC1zaXplOiAxNHB4O1xcbiAgICBtYXJnaW4tbGVmdDogM3B4O1xcbn1cXG4uZGFzaC1kZWJ1Zy1tZW51X19pY29uIHtcXG4gICAgY29sb3I6ICM5Y2EzYWY7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbjpob3ZlciAuZGFzaC1kZWJ1Zy1tZW51X19pY29uIHtcXG4gICAgY29sb3I6ICM1ODA2YzQ7XFxufVxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvRGVidWdNZW51LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGdCQUFnQjtJQUNoQixlQUFlO0lB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QUFnQjtJQUNoQixZQUFZO0lBQ1oseUJBQXlCO0lBQ3pCLGFBQWE7SUFDYix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLGlDQUFpQztJQUNqQywyQ0FBMkM7SUFDM0MsY0FBYztBQUNsQjs7QUFFQTtJQUNJLGNBQWM7SUFDZCx5QkFBeUI7QUFDN0I7QUFDQTtJQUNJLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsZUFBZTtJQUNmLFlBQVk7SUFDWixXQUFXO0lBQ1gsY0FBYztJQUNkLGVBQWU7SUFDZjs2Q0FDeUM7SUFDekMsbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2QixZQUFZO0lBQ1osc0JBQXNCO0FBQzFCOztBQUVBO0lBQ0ksZUFBZTtJQUNmLFdBQVc7SUFDWCx5QkFBeUI7SUFDekIsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGVBQWU7SUFDZixnQkFBZ0I7QUFDcEI7QUFDQTtJQUNJLGNBQWM7QUFDbEI7QUFDQTtJQUNJLGNBQWM7QUFDbEJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmRhc2gtZGVidWctbWVudSB7XFxuICAgIHRyYW5zaXRpb246IDAuM3M7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgYm90dG9tOiAzNXB4O1xcbiAgICByaWdodDogMzVweDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHotaW5kZXg6IDEwMDAxO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTE5ZGZmO1xcbiAgICBib3JkZXItcmFkaXVzOiAxMDAlO1xcbiAgICB3aWR0aDogNjRweDtcXG4gICAgaGVpZ2h0OiA2NHB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnUtLW9wZW4ge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMTgwZGVnKTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fb3V0ZXIgYnV0dG9uIHtcXG4gICAgaGVpZ2h0OiBhdXRvO1xcbiAgICBwYWRkaW5nOiAwIDhweDtcXG4gICAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcXG4gICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gICAgYm9yZGVyLXJhZGl1czogMHB4O1xcbiAgICBsZXR0ZXItc3BhY2luZzogbm9ybWFsO1xcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgICBnYXA6IDZweDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIGJhY2tncm91bmQ6IG5vbmU7XFxuICAgIG91dGxpbmU6IG5vbmU7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3BvcHVwIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBib3R0b206IDEwMCU7XFxuICAgIHJpZ2h0OiAwO1xcbiAgICBnYXA6IDhweDtcXG4gICAgbWF4LWhlaWdodDogY2FsYygxMDB2aCAtIDc1cHgpO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXQge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICB3aWR0aDogNDI2cHg7XFxuICAgIHBhZGRpbmc6IDE2cHg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xcbiAgICBnYXA6IDhweDtcXG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDI0LCAxMDIsIDAuMSk7XFxuICAgIGJhY2tncm91bmQ6ICNmZmY7XFxuICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIC8qIFNoYWRvdy9TbWFsbCAqL1xcbiAgICBib3gtc2hhZG93OiAwcHggMC43cHggMS40cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNyksXFxuICAgICAgICAwcHggMS45cHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDUpLFxcbiAgICAgICAgMHB4IDQuNXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fdGV4dCB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X190ZXh0IGEge1xcbiAgICBjb2xvcjogIzdmNGJjNDtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX3RleHQgc3BhbiB7XFxuICAgIG1hcmdpbi1yaWdodDogNXB4O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXQgYnV0dG9uIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgaGVpZ2h0OiAyNHB4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGxpbmUtaGVpZ2h0OiAxOHB4O1xcbiAgICBwYWRkaW5nOiAxNnB4IDEycHg7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24tb3B0LW91dF9fYnV0dG9ucy1jb250YWluZXIge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBnYXA6IDhweDtcXG4gICAgYWxpZ24tc2VsZjogc3RyZXRjaDtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIHBhZGRpbmctdG9wOiAxNnB4O1xcbiAgICBtYXJnaW4tdG9wOiAxNnB4O1xcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgwLCAyNCwgMTAyLCAwLjEpO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X192ZXJzaW9uLW9wdC1vdXRfX2J1dHRvbi1wcmltYXJ5IHtcXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBjb2xvcjogI2ZmZjtcXG4gICAgYmFja2dyb3VuZDogIzdmNGJjNDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdmVyc2lvbi1vcHQtb3V0X19idXR0b24tc2Vjb25kYXJ5IHtcXG4gICAgYmFja2dyb3VuZDogcmdiYSgxNjEsIDg5LCAyNTUsIDAuMDUpO1xcbiAgICBjb2xvcjogIzdmNGJjNDtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMzQsIDc0LCAyMTIsIDAuOCk7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnU6aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjN2Y0YmM0O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19vdXRlciB7XFxuICAgIHRyYW5zaXRpb246IDAuM3M7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgYm90dG9tOiAtMXB4O1xcbiAgICByaWdodDogLTFweDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgY29sb3I6IGJsYWNrO1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZiAhaW1wb3J0YW50O1xcbiAgICBmb250LXNpemU6IDE0cHg7XFxuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHotaW5kZXg6IDEwMDAwO1xcbiAgICBib3JkZXItcmFkaXVzOiA1cHggMCAwIDA7XFxuICAgIHBhZGRpbmc6IDE1cHggMDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjZmYTtcXG4gICAgYm94LXNoYWRvdzogMHB4IDAuOHB4IDAuOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMDQpLFxcbiAgICAgICAgMHB4IDIuM3B4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjAzKTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAyNCwgMTAyLCAwLjEpO1xcbn1cXG4uZGFzaC1kZWJ1Zy1tZW51X19vdXRlci5kYXNoLWRlYnVnLW1lbnVfX291dGVyLS1jb2xsYXBzZWQge1xcbiAgICBtYXgtd2lkdGg6IDUwcHg7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyLmRhc2gtZGVidWctbWVudV9fb3V0ZXItLWV4cGFuZGVkIHtcXG4gICAgbWF4LXdpZHRoOiBjYWxjKDEwMHZ3IC0gNTBweCk7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtdG9vbHRpcCB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgYm90dG9tOiBjYWxjKDEwMCUgKyAxMnB4KTtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDE4NjYxYTtcXG4gICAgcGFkZGluZzogMTFweDtcXG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAxNHB4IDVweCAjMDAwMDAwMTI7XFxuICAgIHotaW5kZXg6IDEyMDA7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3RvZ2dsZSB7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICB0cmFuc2l0aW9uOiAwLjNzO1xcbn1cXG4uZGFzaC1kZWJ1Zy1tZW51X190b2dnbGUtLWV4cGFuZGVkIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG59XFxuLmRhc2gtZGVidWctbWVudV9fZXJyb3ItaW5kaWNhdG9yIHtcXG4gICAgd2lkdGg6IDhweDtcXG4gICAgaGVpZ2h0OiA4cHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNEQzNFNDI7XFxuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IDNweDtcXG4gICAgdG9wOiAxM3B4O1xcbn1cXG4uZGFzaC1kZWJ1Zy1tZW51X19zdGF0dXMge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBnYXA6IDZweDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fY29udGVudCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xcbiAgICBtYXJnaW4tbGVmdDogMTVweDtcXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuNXMgZWFzZTtcXG4gICAgZmxleC1zaHJpbms6IDA7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3ZlcnNpb24ge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX2RpdmlkZXIge1xcbiAgICB3aWR0aDogMS41cHg7XFxuICAgIGhlaWdodDogMjZweDtcXG4gICAgbWFyZ2luOiAwcHggMTNweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMTU1OTRkO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19idXR0b24ge1xcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIGJveC1zaGFkb3c6IDAgMXB4ICNkM2RhZTY7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XFxuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X19idXR0b24uZGFzaC1kZWJ1Zy1tZW51X19idXR0b24tLXNlbGVjdGVkIHtcXG4gICAgY29sb3I6ICM3ZjRiYzQ7XFxuICAgIGJveC1zaGFkb3c6IDAgMnB4ICM3ZjRiYzQ7XFxufVxcbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX2J1dHRvbi0tc2VsZWN0ZWQ6aG92ZXIge1xcbiAgICBjb2xvcjogIzU4MDZjNDtcXG59XFxuXFxuLmRhc2gtZGVidWctYWxlcnQge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBmb250LXNpemU6IDEwcHg7XFxufVxcblxcbi5kYXNoLWRlYnVnLWFsZXJ0LWxhYmVsIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICBib3R0b206IDgxcHg7XFxuICAgIHJpZ2h0OiAyOXB4O1xcbiAgICB6LWluZGV4OiAxMDAwMjtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMjUpLFxcbiAgICAgICAgMHB4IDFweCAzcHggcmdiYSgxNjIsIDE3NywgMTk4LCAwLjMyKTtcXG4gICAgYm9yZGVyLXJhZGl1czogMzJweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIHBhZGRpbmc6IDRweDtcXG4gICAgY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fZXJyb3ItY291bnQge1xcbiAgICBmb250LXNpemU6IDEycHg7XFxuICAgIGNvbG9yOiAjZmZmO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzczYTNhO1xcbiAgICBwYWRkaW5nOiAzcHggNXB4O1xcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XFxufVxcblxcbi5kYXNoLWRlYnVnLWRpc2Nvbm5lY3RlZCB7XFxuICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gICAgbWFyZ2luLWxlZnQ6IDNweDtcXG59XFxuLmRhc2gtZGVidWctbWVudV9faWNvbiB7XFxuICAgIGNvbG9yOiAjOWNhM2FmO1xcbn1cXG4uZGFzaC1kZWJ1Zy1tZW51X19idXR0b246aG92ZXIgLmRhc2gtZGVidWctbWVudV9faWNvbiB7XFxuICAgIGNvbG9yOiAjNTgwNmM0O1xcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIvKlxcbiAgICBTYW1lIGFzIGluIHBsb3RseS1jbG91ZCBidXQgd2l0aG91dCB0aGUgcHVibGlzaFxcbiAgICBpbiB0aGUgbmFtZSB0byBhdm9pZCBmdXR1cmUgY29uZmxpY3RzIGlmIGNoYW5nZWRcXG4gICAgdXBzdHJlYW0uXFxuKi9cXG4ucGxvdGx5LWNsb3VkLW1vZGFsLW92ZXJsYXkge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJvdHRvbTogMTAwJTtcXG4gICAgbGVmdDogLTFweDtcXG4gICAgei1pbmRleDogMTAwMDA7XFxufVxcblxcbi5wbG90bHktY2xvdWQtbW9kYWwtY29udGVudCB7XFxuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcXG4gICAgd2lkdGg6IDUyMnB4O1xcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2QxZDVkYjtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4IDRweCAwIDA7XFxuICAgIGJveC1zaGFkb3c6IDAgLTRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjA4KTtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuXFxuLnBsb3RseS1jbG91ZC1tb2RhbC1oZWFkZXIge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHBhZGRpbmc6IDE2cHggMjBweDtcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNWU1ZTU7XFxuICAgIGJhY2tncm91bmQ6ICNmOWZhZmI7XFxufVxcblxcbi5wbG90bHktY2xvdWQtbW9kYWwtaGVhZGVyIGgzIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBjb2xvcjogIzMzMztcXG59XFxuXFxuLnBsb3RseS1jbG91ZC1tb2RhbC1jbG9zZSB7XFxuICAgIGJhY2tncm91bmQ6IG5vbmU7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgZm9udC1zaXplOiAyNHB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGNvbG9yOiAjNjY2O1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICB3aWR0aDogMzBweDtcXG4gICAgaGVpZ2h0OiAzMHB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG59XFxuXFxuLnBsb3RseS1jbG91ZC1tb2RhbC1jbG9zZTpob3ZlciB7XFxuICAgIGNvbG9yOiAjMzMzO1xcbn1cXG5cXG4ucGxvdGx5LWNsb3VkLW1vZGFsLWJvZHkge1xcbiAgICBwYWRkaW5nOiAyMHB4O1xcbiAgICBjb2xvcjogYmxhY2sgIWltcG9ydGFudDtcXG4gICAgZm9udC13ZWlnaHQ6IDEwMDtcXG59XFxuYnV0dG9uLnBsb3RseS1jbG91ZC1tb2RhbC1idXR0b24ge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgZ2FwOiA2cHg7XFxuICAgIHBhZGRpbmc6IDZweCAxMHB4ICFpbXBvcnRhbnQ7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweCAhaW1wb3J0YW50O1xcbiAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcXG4gICAgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgICBiYWNrZ3JvdW5kOiAjOGI1Y2Y2O1xcbiAgICBjb2xvcjogd2hpdGU7XFxuICAgIGJvcmRlci1jb2xvcjogIzdjM2FlZDtcXG59XFxuXFxuLnBsb3RseS1jbG91ZC1tb2RhbC1idXR0b246ZGlzYWJsZWQge1xcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xcbn1cXG4ucGxvdGx5LWNsb3VkLWNvcHktaW5zdGFsbCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG4gICAgZ2FwOiAxMHB4O1xcbiAgICBwYWRkaW5nOiA4cHggMTBweDtcXG4gICAgYmFja2dyb3VuZDogI2Y5ZmFmYjtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2U1ZTdlYjtcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBtYXJnaW4tdG9wOiA4cHg7XFxufVxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9jb21wb25lbnRzL2Vycm9yL21lbnUvUGxvdGx5Q2xvdWQuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBOzs7O0NBSUM7QUFDRDtJQUNJLGtCQUFrQjtJQUNsQixZQUFZO0lBQ1osVUFBVTtJQUNWLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsWUFBWTtJQUNaLGlCQUFpQjtJQUNqQix5QkFBeUI7SUFDekIsMEJBQTBCO0lBQzFCLDBDQUEwQztJQUMxQyxnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsOEJBQThCO0lBQzlCLG1CQUFtQjtJQUNuQixrQkFBa0I7SUFDbEIsZ0NBQWdDO0lBQ2hDLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLFNBQVM7SUFDVCxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLGVBQWU7SUFDZixlQUFlO0lBQ2YsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsWUFBWTtJQUNaLGFBQWE7SUFDYixtQkFBbUI7SUFDbkIsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksV0FBVztBQUNmOztBQUVBO0lBQ0ksYUFBYTtJQUNiLHVCQUF1QjtJQUN2QixnQkFBZ0I7QUFDcEI7QUFDQTtJQUNJLG9CQUFvQjtJQUNwQixtQkFBbUI7SUFDbkIsUUFBUTtJQUNSLDRCQUE0QjtJQUM1Qiw2QkFBNkI7SUFDN0IsMEJBQTBCO0lBQzFCLDJCQUEyQjtJQUMzQixlQUFlO0lBQ2YsNkJBQTZCO0lBQzdCLG1CQUFtQjtJQUNuQixZQUFZO0lBQ1oscUJBQXFCO0FBQ3pCOztBQUVBO0lBQ0ksbUJBQW1CO0FBQ3ZCO0FBQ0E7SUFDSSxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLDhCQUE4QjtJQUM5QixTQUFTO0lBQ1QsaUJBQWlCO0lBQ2pCLG1CQUFtQjtJQUNuQix5QkFBeUI7SUFDekIsa0JBQWtCO0lBQ2xCLGVBQWU7QUFDbkJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLypcXG4gICAgU2FtZSBhcyBpbiBwbG90bHktY2xvdWQgYnV0IHdpdGhvdXQgdGhlIHB1Ymxpc2hcXG4gICAgaW4gdGhlIG5hbWUgdG8gYXZvaWQgZnV0dXJlIGNvbmZsaWN0cyBpZiBjaGFuZ2VkXFxuICAgIHVwc3RyZWFtLlxcbiovXFxuLnBsb3RseS1jbG91ZC1tb2RhbC1vdmVybGF5IHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBib3R0b206IDEwMCU7XFxuICAgIGxlZnQ6IC0xcHg7XFxuICAgIHotaW5kZXg6IDEwMDAwO1xcbn1cXG5cXG4ucGxvdGx5LWNsb3VkLW1vZGFsLWNvbnRlbnQge1xcbiAgICBib3JkZXItcmFkaXVzOiA4cHg7XFxuICAgIHdpZHRoOiA1MjJweDtcXG4gICAgYmFja2dyb3VuZDogd2hpdGU7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMWQ1ZGI7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweCA0cHggMCAwO1xcbiAgICBib3gtc2hhZG93OiAwIC00cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4wOCk7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxufVxcblxcbi5wbG90bHktY2xvdWQtbW9kYWwtaGVhZGVyIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBwYWRkaW5nOiAxNnB4IDIwcHg7XFxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTVlNWU1O1xcbiAgICBiYWNrZ3JvdW5kOiAjZjlmYWZiO1xcbn1cXG5cXG4ucGxvdGx5LWNsb3VkLW1vZGFsLWhlYWRlciBoMyB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgY29sb3I6ICMzMzM7XFxufVxcblxcbi5wbG90bHktY2xvdWQtbW9kYWwtY2xvc2Uge1xcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIGZvbnQtc2l6ZTogMjRweDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBjb2xvcjogIzY2NjtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgd2lkdGg6IDMwcHg7XFxuICAgIGhlaWdodDogMzBweDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxufVxcblxcbi5wbG90bHktY2xvdWQtbW9kYWwtY2xvc2U6aG92ZXIge1xcbiAgICBjb2xvcjogIzMzMztcXG59XFxuXFxuLnBsb3RseS1jbG91ZC1tb2RhbC1ib2R5IHtcXG4gICAgcGFkZGluZzogMjBweDtcXG4gICAgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7XFxuICAgIGZvbnQtd2VpZ2h0OiAxMDA7XFxufVxcbmJ1dHRvbi5wbG90bHktY2xvdWQtbW9kYWwtYnV0dG9uIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGdhcDogNnB4O1xcbiAgICBwYWRkaW5nOiA2cHggMTBweCAhaW1wb3J0YW50O1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDtcXG4gICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7XFxuICAgIGZvbnQtd2VpZ2h0OiA2MDAgIWltcG9ydGFudDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcXG4gICAgYmFja2dyb3VuZDogIzhiNWNmNjtcXG4gICAgY29sb3I6IHdoaXRlO1xcbiAgICBib3JkZXItY29sb3I6ICM3YzNhZWQ7XFxufVxcblxcbi5wbG90bHktY2xvdWQtbW9kYWwtYnV0dG9uOmRpc2FibGVkIHtcXG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcXG59XFxuLnBsb3RseS1jbG91ZC1jb3B5LWluc3RhbGwge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIGdhcDogMTBweDtcXG4gICAgcGFkZGluZzogOHB4IDEwcHg7XFxuICAgIGJhY2tncm91bmQ6ICNmOWZhZmI7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNlNWU3ZWI7XFxuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcXG4gICAgbWFyZ2luLXRvcDogOHB4O1xcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIuZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLXRvb2x0aXAgYnV0dG9uLFxcbi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtdG9vbHRpcCBhIHtcXG4gICAgYmFja2dyb3VuZDogd2hpdGU7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgcGFkZGluZzogMnB4IDVweDtcXG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gICAgY29sb3I6ICM3ZjRiYzQ7XFxuICAgIGZvbnQtc2l6ZTogMTBwdDtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XFxuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XFxuICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtdG9vbHRpcDphZnRlciB7XFxuICAgIGNvbnRlbnQ6ICcgJztcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IDEwMCU7XFxuICAgIGxlZnQ6IDUwJTtcXG4gICAgbWFyZ2luLWxlZnQ6IC01cHg7XFxuICAgIGJvcmRlci13aWR0aDogMTBweDtcXG4gICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcXG4gICAgYm9yZGVyLWNvbG9yOiB3aGl0ZSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fb3V0ZXIgYnV0dG9uLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS1idXR0b24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYTE1OWZmMGQ7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM4NjRhZDQzMztcXG4gICAgY29sb3I6ICM3ZjRiYzQ7XFxuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xcbiAgICBmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZiAhaW1wb3J0YW50O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGhlaWdodDogMjBweDtcXG4gICAgcGFkZGluZzogMHB4IDhweDtcXG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xcbiAgICBmb250LXdlaWdodDogNTAwO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLWJ1dHRvbjpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM4NjRhZDQzMztcXG4gICAgYm9yZGVyLWNvbG9yOiAjODY0YWQ0MzM7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbn1cXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvY29tcG9uZW50cy9lcnJvci9tZW51L1ZlcnNpb25JbmZvLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTs7SUFFSSxpQkFBaUI7SUFDakIsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixtQkFBbUI7SUFDbkIsY0FBYztJQUNkLGVBQWU7SUFDZixxQkFBcUI7SUFDckIsZUFBZTtJQUNmLGFBQWE7SUFDYiwyQ0FBMkM7SUFDM0MsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsU0FBUztJQUNULFNBQVM7SUFDVCxpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQix1REFBdUQ7QUFDM0Q7O0FBRUE7SUFDSSwyQkFBMkI7SUFDM0IsMkJBQTJCO0lBQzNCLGNBQWM7SUFDZCxpQkFBaUI7SUFDakIsMkNBQTJDO0lBQzNDLGVBQWU7SUFDZixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSwyQkFBMkI7SUFDM0IsdUJBQXVCO0lBQ3ZCLGNBQWM7QUFDbEJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS10b29sdGlwIGJ1dHRvbixcXG4uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLXRvb2x0aXAgYSB7XFxuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIHBhZGRpbmc6IDJweCA1cHg7XFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICBmb250LXNpemU6IDEwcHQ7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZiAhaW1wb3J0YW50O1xcbiAgICBmb250LXdlaWdodDogNTAwO1xcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xcbn1cXG5cXG4uZGFzaC1kZWJ1Zy1tZW51X191cGdyYWRlLXRvb2x0aXA6YWZ0ZXIge1xcbiAgICBjb250ZW50OiAnICc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAxMDAlO1xcbiAgICBsZWZ0OiA1MCU7XFxuICAgIG1hcmdpbi1sZWZ0OiAtNXB4O1xcbiAgICBib3JkZXItd2lkdGg6IDEwcHg7XFxuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XFxuICAgIGJvcmRlci1jb2xvcjogd2hpdGUgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XFxufVxcblxcbi5kYXNoLWRlYnVnLW1lbnVfX291dGVyIGJ1dHRvbi5kYXNoLWRlYnVnLW1lbnVfX3VwZ3JhZGUtYnV0dG9uIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ExNTlmZjBkO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjODY0YWQ0MzM7XFxuICAgIGNvbG9yOiAjN2Y0YmM0O1xcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcXG4gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBoZWlnaHQ6IDIwcHg7XFxuICAgIHBhZGRpbmc6IDBweCA4cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcXG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcXG59XFxuXFxuLmRhc2gtZGVidWctbWVudV9fdXBncmFkZS1idXR0b246aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODY0YWQ0MzM7XFxuICAgIGJvcmRlci1jb2xvcjogIzg2NGFkNDMzO1xcbiAgICBjb2xvcjogIzdmNGJjNDtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJkYWdyZVwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXCJkYWdyZVwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJjeXRvc2NhcGVEYWdyZVwiXSA9IGZhY3RvcnkocmVxdWlyZShcImRhZ3JlXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJjeXRvc2NhcGVEYWdyZVwiXSA9IGZhY3Rvcnkocm9vdFtcImRhZ3JlXCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzRfXykge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vKioqKioqLyBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuLyoqKioqKi8gXHRcdHJldHVybiBucztcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBpbXBsID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTsgLy8gcmVnaXN0ZXJzIHRoZSBleHRlbnNpb24gb24gYSBjeXRvc2NhcGUgbGliIHJlZlxuXG5cbnZhciByZWdpc3RlciA9IGZ1bmN0aW9uIHJlZ2lzdGVyKGN5dG9zY2FwZSkge1xuICBpZiAoIWN5dG9zY2FwZSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBjYW4ndCByZWdpc3RlciBpZiBjeXRvc2NhcGUgdW5zcGVjaWZpZWRcblxuXG4gIGN5dG9zY2FwZSgnbGF5b3V0JywgJ2RhZ3JlJywgaW1wbCk7IC8vIHJlZ2lzdGVyIHdpdGggY3l0b3NjYXBlLmpzXG59O1xuXG5pZiAodHlwZW9mIGN5dG9zY2FwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gZXhwb3NlIHRvIGdsb2JhbCBjeXRvc2NhcGUgKGkuZS4gd2luZG93LmN5dG9zY2FwZSlcbiAgcmVnaXN0ZXIoY3l0b3NjYXBlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWdpc3RlcjtcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiBpc0Z1bmN0aW9uKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSAnZnVuY3Rpb24nO1xufTtcblxudmFyIGRlZmF1bHRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxudmFyIGFzc2lnbiA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cbnZhciBkYWdyZSA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7IC8vIGNvbnN0cnVjdG9yXG4vLyBvcHRpb25zIDogb2JqZWN0IGNvbnRhaW5pbmcgbGF5b3V0IG9wdGlvbnNcblxuXG5mdW5jdGlvbiBEYWdyZUxheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGFzc2lnbih7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xufSAvLyBydW5zIHRoZSBsYXlvdXRcblxuXG5EYWdyZUxheW91dC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgdmFyIGxheW91dCA9IHRoaXM7XG4gIHZhciBjeSA9IG9wdGlvbnMuY3k7IC8vIGN5IGlzIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGVkIGZvciB1cyBpbiB0aGUgY29uc3RydWN0b3JcblxuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcblxuICB2YXIgZ2V0VmFsID0gZnVuY3Rpb24gZ2V0VmFsKGVsZSwgdmFsKSB7XG4gICAgcmV0dXJuIGlzRnVuY3Rpb24odmFsKSA/IHZhbC5hcHBseShlbGUsIFtlbGVdKSA6IHZhbDtcbiAgfTtcblxuICB2YXIgYmIgPSBvcHRpb25zLmJvdW5kaW5nQm94IHx8IHtcbiAgICB4MTogMCxcbiAgICB5MTogMCxcbiAgICB3OiBjeS53aWR0aCgpLFxuICAgIGg6IGN5LmhlaWdodCgpXG4gIH07XG5cbiAgaWYgKGJiLngyID09PSB1bmRlZmluZWQpIHtcbiAgICBiYi54MiA9IGJiLngxICsgYmIudztcbiAgfVxuXG4gIGlmIChiYi53ID09PSB1bmRlZmluZWQpIHtcbiAgICBiYi53ID0gYmIueDIgLSBiYi54MTtcbiAgfVxuXG4gIGlmIChiYi55MiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYmIueTIgPSBiYi55MSArIGJiLmg7XG4gIH1cblxuICBpZiAoYmIuaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYmIuaCA9IGJiLnkyIC0gYmIueTE7XG4gIH1cblxuICB2YXIgZyA9IG5ldyBkYWdyZS5ncmFwaGxpYi5HcmFwaCh7XG4gICAgbXVsdGlncmFwaDogdHJ1ZSxcbiAgICBjb21wb3VuZDogdHJ1ZVxuICB9KTtcbiAgdmFyIGdPYmogPSB7fTtcblxuICB2YXIgc2V0R09iaiA9IGZ1bmN0aW9uIHNldEdPYmoobmFtZSwgdmFsKSB7XG4gICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICBnT2JqW25hbWVdID0gdmFsO1xuICAgIH1cbiAgfTtcblxuICBzZXRHT2JqKCdub2Rlc2VwJywgb3B0aW9ucy5ub2RlU2VwKTtcbiAgc2V0R09iaignZWRnZXNlcCcsIG9wdGlvbnMuZWRnZVNlcCk7XG4gIHNldEdPYmooJ3JhbmtzZXAnLCBvcHRpb25zLnJhbmtTZXApO1xuICBzZXRHT2JqKCdyYW5rZGlyJywgb3B0aW9ucy5yYW5rRGlyKTtcbiAgc2V0R09iaignYWxpZ24nLCBvcHRpb25zLmFsaWduKTtcbiAgc2V0R09iaigncmFua2VyJywgb3B0aW9ucy5yYW5rZXIpO1xuICBzZXRHT2JqKCdhY3ljbGljZXInLCBvcHRpb25zLmFjeWNsaWNlcik7XG4gIGcuc2V0R3JhcGgoZ09iaik7XG4gIGcuc2V0RGVmYXVsdEVkZ2VMYWJlbChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9KTtcbiAgZy5zZXREZWZhdWx0Tm9kZUxhYmVsKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge307XG4gIH0pOyAvLyBhZGQgbm9kZXMgdG8gZGFncmVcblxuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCk7XG5cbiAgaWYgKGlzRnVuY3Rpb24ob3B0aW9ucy5zb3J0KSkge1xuICAgIG5vZGVzID0gbm9kZXMuc29ydChvcHRpb25zLnNvcnQpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgdmFyIG5iYiA9IG5vZGUubGF5b3V0RGltZW5zaW9ucyhvcHRpb25zKTtcbiAgICBnLnNldE5vZGUobm9kZS5pZCgpLCB7XG4gICAgICB3aWR0aDogbmJiLncsXG4gICAgICBoZWlnaHQ6IG5iYi5oLFxuICAgICAgbmFtZTogbm9kZS5pZCgpXG4gICAgfSk7IC8vIGNvbnNvbGUubG9nKCBnLm5vZGUobm9kZS5pZCgpKSApO1xuICB9IC8vIHNldCBjb21wb3VuZCBwYXJlbnRzXG5cblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbm9kZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIF9ub2RlID0gbm9kZXNbX2ldO1xuXG4gICAgaWYgKF9ub2RlLmlzQ2hpbGQoKSkge1xuICAgICAgZy5zZXRQYXJlbnQoX25vZGUuaWQoKSwgX25vZGUucGFyZW50KCkuaWQoKSk7XG4gICAgfVxuICB9IC8vIGFkZCBlZGdlcyB0byBkYWdyZVxuXG5cbiAgdmFyIGVkZ2VzID0gZWxlcy5lZGdlcygpLnN0ZEZpbHRlcihmdW5jdGlvbiAoZWRnZSkge1xuICAgIHJldHVybiAhZWRnZS5zb3VyY2UoKS5pc1BhcmVudCgpICYmICFlZGdlLnRhcmdldCgpLmlzUGFyZW50KCk7IC8vIGRhZ3JlIGNhbid0IGhhbmRsZSBlZGdlcyBvbiBjb21wb3VuZCBub2Rlc1xuICB9KTtcblxuICBpZiAoaXNGdW5jdGlvbihvcHRpb25zLnNvcnQpKSB7XG4gICAgZWRnZXMgPSBlZGdlcy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gIH1cblxuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBlZGdlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tfaTJdO1xuICAgIGcuc2V0RWRnZShlZGdlLnNvdXJjZSgpLmlkKCksIGVkZ2UudGFyZ2V0KCkuaWQoKSwge1xuICAgICAgbWlubGVuOiBnZXRWYWwoZWRnZSwgb3B0aW9ucy5taW5MZW4pLFxuICAgICAgd2VpZ2h0OiBnZXRWYWwoZWRnZSwgb3B0aW9ucy5lZGdlV2VpZ2h0KSxcbiAgICAgIG5hbWU6IGVkZ2UuaWQoKVxuICAgIH0sIGVkZ2UuaWQoKSk7IC8vIGNvbnNvbGUubG9nKCBnLmVkZ2UoZWRnZS5zb3VyY2UoKS5pZCgpLCBlZGdlLnRhcmdldCgpLmlkKCksIGVkZ2UuaWQoKSkgKTtcbiAgfVxuXG4gIGRhZ3JlLmxheW91dChnKTtcbiAgdmFyIGdOb2RlSWRzID0gZy5ub2RlcygpO1xuXG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGdOb2RlSWRzLmxlbmd0aDsgX2kzKyspIHtcbiAgICB2YXIgaWQgPSBnTm9kZUlkc1tfaTNdO1xuICAgIHZhciBuID0gZy5ub2RlKGlkKTtcbiAgICBjeS5nZXRFbGVtZW50QnlJZChpZCkuc2NyYXRjaCgpLmRhZ3JlID0gbjtcbiAgfVxuXG4gIHZhciBkYWdyZUJCO1xuXG4gIGlmIChvcHRpb25zLmJvdW5kaW5nQm94KSB7XG4gICAgZGFncmVCQiA9IHtcbiAgICAgIHgxOiBJbmZpbml0eSxcbiAgICAgIHgyOiAtSW5maW5pdHksXG4gICAgICB5MTogSW5maW5pdHksXG4gICAgICB5MjogLUluZmluaXR5XG4gICAgfTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICB2YXIgZE1vZGVsID0gbm9kZS5zY3JhdGNoKCkuZGFncmU7XG4gICAgICBkYWdyZUJCLngxID0gTWF0aC5taW4oZGFncmVCQi54MSwgZE1vZGVsLngpO1xuICAgICAgZGFncmVCQi54MiA9IE1hdGgubWF4KGRhZ3JlQkIueDIsIGRNb2RlbC54KTtcbiAgICAgIGRhZ3JlQkIueTEgPSBNYXRoLm1pbihkYWdyZUJCLnkxLCBkTW9kZWwueSk7XG4gICAgICBkYWdyZUJCLnkyID0gTWF0aC5tYXgoZGFncmVCQi55MiwgZE1vZGVsLnkpO1xuICAgIH0pO1xuICAgIGRhZ3JlQkIudyA9IGRhZ3JlQkIueDIgLSBkYWdyZUJCLngxO1xuICAgIGRhZ3JlQkIuaCA9IGRhZ3JlQkIueTIgLSBkYWdyZUJCLnkxO1xuICB9IGVsc2Uge1xuICAgIGRhZ3JlQkIgPSBiYjtcbiAgfVxuXG4gIHZhciBjb25zdHJhaW5Qb3MgPSBmdW5jdGlvbiBjb25zdHJhaW5Qb3MocCkge1xuICAgIGlmIChvcHRpb25zLmJvdW5kaW5nQm94KSB7XG4gICAgICB2YXIgeFBjdCA9IGRhZ3JlQkIudyA9PT0gMCA/IDAgOiAocC54IC0gZGFncmVCQi54MSkgLyBkYWdyZUJCLnc7XG4gICAgICB2YXIgeVBjdCA9IGRhZ3JlQkIuaCA9PT0gMCA/IDAgOiAocC55IC0gZGFncmVCQi55MSkgLyBkYWdyZUJCLmg7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBiYi54MSArIHhQY3QgKiBiYi53LFxuICAgICAgICB5OiBiYi55MSArIHlQY3QgKiBiYi5oXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gIH07XG5cbiAgbm9kZXMubGF5b3V0UG9zaXRpb25zKGxheW91dCwgb3B0aW9ucywgZnVuY3Rpb24gKGVsZSkge1xuICAgIGVsZSA9IF90eXBlb2YoZWxlKSA9PT0gXCJvYmplY3RcIiA/IGVsZSA6IHRoaXM7XG4gICAgdmFyIGRNb2RlbCA9IGVsZS5zY3JhdGNoKCkuZGFncmU7XG4gICAgcmV0dXJuIGNvbnN0cmFpblBvcyh7XG4gICAgICB4OiBkTW9kZWwueCxcbiAgICAgIHk6IGRNb2RlbC55XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRGFncmVMYXlvdXQ7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gIC8vIGRhZ3JlIGFsZ28gb3B0aW9ucywgdXNlcyBkZWZhdWx0IHZhbHVlIG9uIHVuZGVmaW5lZFxuICBub2RlU2VwOiB1bmRlZmluZWQsXG4gIC8vIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gYWRqYWNlbnQgbm9kZXMgaW4gdGhlIHNhbWUgcmFua1xuICBlZGdlU2VwOiB1bmRlZmluZWQsXG4gIC8vIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gYWRqYWNlbnQgZWRnZXMgaW4gdGhlIHNhbWUgcmFua1xuICByYW5rU2VwOiB1bmRlZmluZWQsXG4gIC8vIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gYWRqYWNlbnQgbm9kZXMgaW4gdGhlIHNhbWUgcmFua1xuICByYW5rRGlyOiB1bmRlZmluZWQsXG4gIC8vICdUQicgZm9yIHRvcCB0byBib3R0b20gZmxvdywgJ0xSJyBmb3IgbGVmdCB0byByaWdodCxcbiAgYWxpZ246IHVuZGVmaW5lZCxcbiAgLy8gYWxpZ25tZW50IGZvciByYW5rIG5vZGVzLiBDYW4gYmUgJ1VMJywgJ1VSJywgJ0RMJywgb3IgJ0RSJywgd2hlcmUgVSA9IHVwLCBEID0gZG93biwgTCA9IGxlZnQsIGFuZCBSID0gcmlnaHRcbiAgYWN5Y2xpY2VyOiB1bmRlZmluZWQsXG4gIC8vIElmIHNldCB0byAnZ3JlZWR5JywgdXNlcyBhIGdyZWVkeSBoZXVyaXN0aWMgZm9yIGZpbmRpbmcgYSBmZWVkYmFjayBhcmMgc2V0IGZvciBhIGdyYXBoLlxuICAvLyBBIGZlZWRiYWNrIGFyYyBzZXQgaXMgYSBzZXQgb2YgZWRnZXMgdGhhdCBjYW4gYmUgcmVtb3ZlZCB0byBtYWtlIGEgZ3JhcGggYWN5Y2xpYy5cbiAgcmFua2VyOiB1bmRlZmluZWQsXG4gIC8vIFR5cGUgb2YgYWxnb3JpdGhtIHRvIGFzc2lnbnMgYSByYW5rIHRvIGVhY2ggbm9kZSBpbiB0aGUgaW5wdXQgZ3JhcGguXG4gIC8vIFBvc3NpYmxlIHZhbHVlczogbmV0d29yay1zaW1wbGV4LCB0aWdodC10cmVlIG9yIGxvbmdlc3QtcGF0aFxuICBtaW5MZW46IGZ1bmN0aW9uIG1pbkxlbihlZGdlKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0sXG4gIC8vIG51bWJlciBvZiByYW5rcyB0byBrZWVwIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9mIHRoZSBlZGdlXG4gIGVkZ2VXZWlnaHQ6IGZ1bmN0aW9uIGVkZ2VXZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICAvLyBoaWdoZXIgd2VpZ2h0IGVkZ2VzIGFyZSBnZW5lcmFsbHkgbWFkZSBzaG9ydGVyIGFuZCBzdHJhaWdodGVyIHRoYW4gbG93ZXIgd2VpZ2h0IGVkZ2VzXG4gIC8vIGdlbmVyYWwgbGF5b3V0IG9wdGlvbnNcbiAgZml0OiB0cnVlLFxuICAvLyB3aGV0aGVyIHRvIGZpdCB0byB2aWV3cG9ydFxuICBwYWRkaW5nOiAzMCxcbiAgLy8gZml0IHBhZGRpbmdcbiAgc3BhY2luZ0ZhY3RvcjogdW5kZWZpbmVkLFxuICAvLyBBcHBsaWVzIGEgbXVsdGlwbGljYXRpdmUgZmFjdG9yICg+MCkgdG8gZXhwYW5kIG9yIGNvbXByZXNzIHRoZSBvdmVyYWxsIGFyZWEgdGhhdCB0aGUgbm9kZXMgdGFrZSB1cFxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyB3aGV0aGVyIGxhYmVscyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gZGV0ZXJtaW5pbmcgdGhlIHNwYWNlIHVzZWQgYnkgYSBub2RlXG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGVGaWx0ZXI6IGZ1bmN0aW9uIGFuaW1hdGVGaWx0ZXIobm9kZSwgaSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyB3aGV0aGVyIHRvIGFuaW1hdGUgc3BlY2lmaWMgbm9kZXMgd2hlbiBhbmltYXRpb24gaXMgb247IG5vbi1hbmltYXRlZCBub2RlcyBpbW1lZGlhdGVseSBnbyB0byB0aGVpciBmaW5hbCBwb3NpdGlvbnNcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gZHVyYXRpb24gb2YgYW5pbWF0aW9uIGluIG1zIGlmIGVuYWJsZWRcbiAgYW5pbWF0aW9uRWFzaW5nOiB1bmRlZmluZWQsXG4gIC8vIGVhc2luZyBvZiBhbmltYXRpb24gaWYgZW5hYmxlZFxuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgdHJhbnNmb3JtOiBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSwgcG9zKSB7XG4gICAgcmV0dXJuIHBvcztcbiAgfSxcbiAgLy8gYSBmdW5jdGlvbiB0aGF0IGFwcGxpZXMgYSB0cmFuc2Zvcm0gdG8gdGhlIGZpbmFsIG5vZGUgcG9zaXRpb25cbiAgcmVhZHk6IGZ1bmN0aW9uIHJlYWR5KCkge30sXG4gIC8vIG9uIGxheW91dHJlYWR5XG4gIHNvcnQ6IHVuZGVmaW5lZCxcbiAgLy8gYSBzb3J0aW5nIGZ1bmN0aW9uIHRvIG9yZGVyIHRoZSBub2RlcyBhbmQgZWRnZXM7IGUuZy4gZnVuY3Rpb24oYSwgYil7IHJldHVybiBhLmRhdGEoJ3dlaWdodCcpIC0gYi5kYXRhKCd3ZWlnaHQnKSB9XG4gIC8vIGJlY2F1c2UgY3l0b3NjYXBlIGRhZ3JlIGNyZWF0ZXMgYSBkaXJlY3RlZCBncmFwaCwgYW5kIGRpcmVjdGVkIGdyYXBocyB1c2UgdGhlIG5vZGUgb3JkZXIgYXMgYSB0aWUgYnJlYWtlciB3aGVuXG4gIC8vIGRlZmluaW5nIHRoZSB0b3BvbG9neSBvZiBhIGdyYXBoLCB0aGlzIHNvcnQgZnVuY3Rpb24gY2FuIGhlbHAgZW5zdXJlIHRoZSBjb3JyZWN0IG9yZGVyIG9mIHRoZSBub2Rlcy9lZGdlcy5cbiAgLy8gdGhpcyBmZWF0dXJlIGlzIG1vc3QgdXNlZnVsIHdoZW4gYWRkaW5nIGFuZCByZW1vdmluZyB0aGUgc2FtZSBub2RlcyBhbmQgZWRnZXMgbXVsdGlwbGUgdGltZXMgaW4gYSBncmFwaC5cbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHt9IC8vIG9uIGxheW91dHN0b3BcblxufTtcbm1vZHVsZS5leHBvcnRzID0gZGVmYXVsdHM7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG4vLyBTaW1wbGUsIGludGVybmFsIE9iamVjdC5hc3NpZ24oKSBwb2x5ZmlsbCBmb3Igb3B0aW9ucyBvYmplY3RzIGV0Yy5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmFzc2lnbiAhPSBudWxsID8gT2JqZWN0LmFzc2lnbi5iaW5kKE9iamVjdCkgOiBmdW5jdGlvbiAodGd0KSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzcmNzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBzcmNzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHNyY3MuZm9yRWFjaChmdW5jdGlvbiAoc3JjKSB7XG4gICAgT2JqZWN0LmtleXMoc3JjKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gdGd0W2tdID0gc3JjW2tdO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHRndDtcbn07XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzRfXztcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xufSk7IiwiLypcbkNvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFBldHRpdHRcblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLlxuKi9cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdyYXBobGliOiByZXF1aXJlKFwiLi9saWIvZ3JhcGhsaWJcIiksXG5cbiAgbGF5b3V0OiByZXF1aXJlKFwiLi9saWIvbGF5b3V0XCIpLFxuICBkZWJ1ZzogcmVxdWlyZShcIi4vbGliL2RlYnVnXCIpLFxuICB1dGlsOiB7XG4gICAgdGltZTogcmVxdWlyZShcIi4vbGliL3V0aWxcIikudGltZSxcbiAgICBub3RpbWU6IHJlcXVpcmUoXCIuL2xpYi91dGlsXCIpLm5vdGltZVxuICB9LFxuICB2ZXJzaW9uOiByZXF1aXJlKFwiLi9saWIvdmVyc2lvblwiKVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBncmVlZHlGQVMgPSByZXF1aXJlKFwiLi9ncmVlZHktZmFzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcnVuOiBydW4sXG4gIHVuZG86IHVuZG9cbn07XG5cbmZ1bmN0aW9uIHJ1bihnKSB7XG4gIHZhciBmYXMgPSAoZy5ncmFwaCgpLmFjeWNsaWNlciA9PT0gXCJncmVlZHlcIlxuICAgID8gZ3JlZWR5RkFTKGcsIHdlaWdodEZuKGcpKVxuICAgIDogZGZzRkFTKGcpKTtcbiAgXy5mb3JFYWNoKGZhcywgZnVuY3Rpb24oZSkge1xuICAgIHZhciBsYWJlbCA9IGcuZWRnZShlKTtcbiAgICBnLnJlbW92ZUVkZ2UoZSk7XG4gICAgbGFiZWwuZm9yd2FyZE5hbWUgPSBlLm5hbWU7XG4gICAgbGFiZWwucmV2ZXJzZWQgPSB0cnVlO1xuICAgIGcuc2V0RWRnZShlLncsIGUudiwgbGFiZWwsIF8udW5pcXVlSWQoXCJyZXZcIikpO1xuICB9KTtcblxuICBmdW5jdGlvbiB3ZWlnaHRGbihnKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiBnLmVkZ2UoZSkud2VpZ2h0O1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZGZzRkFTKGcpIHtcbiAgdmFyIGZhcyA9IFtdO1xuICB2YXIgc3RhY2sgPSB7fTtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIGlmIChfLmhhcyh2aXNpdGVkLCB2KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICBzdGFja1t2XSA9IHRydWU7XG4gICAgXy5mb3JFYWNoKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGlmIChfLmhhcyhzdGFjaywgZS53KSkge1xuICAgICAgICBmYXMucHVzaChlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRmcyhlLncpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRlbGV0ZSBzdGFja1t2XTtcbiAgfVxuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGRmcyk7XG4gIHJldHVybiBmYXM7XG59XG5cbmZ1bmN0aW9uIHVuZG8oZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGxhYmVsID0gZy5lZGdlKGUpO1xuICAgIGlmIChsYWJlbC5yZXZlcnNlZCkge1xuICAgICAgZy5yZW1vdmVFZGdlKGUpO1xuXG4gICAgICB2YXIgZm9yd2FyZE5hbWUgPSBsYWJlbC5mb3J3YXJkTmFtZTtcbiAgICAgIGRlbGV0ZSBsYWJlbC5yZXZlcnNlZDtcbiAgICAgIGRlbGV0ZSBsYWJlbC5mb3J3YXJkTmFtZTtcbiAgICAgIGcuc2V0RWRnZShlLncsIGUudiwgbGFiZWwsIGZvcndhcmROYW1lKTtcbiAgICB9XG4gIH0pO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gYWRkQm9yZGVyU2VnbWVudHM7XG5cbmZ1bmN0aW9uIGFkZEJvcmRlclNlZ21lbnRzKGcpIHtcbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBnLmNoaWxkcmVuKHYpO1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIF8uZm9yRWFjaChjaGlsZHJlbiwgZGZzKTtcbiAgICB9XG5cbiAgICBpZiAoXy5oYXMobm9kZSwgXCJtaW5SYW5rXCIpKSB7XG4gICAgICBub2RlLmJvcmRlckxlZnQgPSBbXTtcbiAgICAgIG5vZGUuYm9yZGVyUmlnaHQgPSBbXTtcbiAgICAgIGZvciAodmFyIHJhbmsgPSBub2RlLm1pblJhbmssIG1heFJhbmsgPSBub2RlLm1heFJhbmsgKyAxO1xuICAgICAgICByYW5rIDwgbWF4UmFuaztcbiAgICAgICAgKytyYW5rKSB7XG4gICAgICAgIGFkZEJvcmRlck5vZGUoZywgXCJib3JkZXJMZWZ0XCIsIFwiX2JsXCIsIHYsIG5vZGUsIHJhbmspO1xuICAgICAgICBhZGRCb3JkZXJOb2RlKGcsIFwiYm9yZGVyUmlnaHRcIiwgXCJfYnJcIiwgdiwgbm9kZSwgcmFuayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgXy5mb3JFYWNoKGcuY2hpbGRyZW4oKSwgZGZzKTtcbn1cblxuZnVuY3Rpb24gYWRkQm9yZGVyTm9kZShnLCBwcm9wLCBwcmVmaXgsIHNnLCBzZ05vZGUsIHJhbmspIHtcbiAgdmFyIGxhYmVsID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCByYW5rOiByYW5rLCBib3JkZXJUeXBlOiBwcm9wIH07XG4gIHZhciBwcmV2ID0gc2dOb2RlW3Byb3BdW3JhbmsgLSAxXTtcbiAgdmFyIGN1cnIgPSB1dGlsLmFkZER1bW15Tm9kZShnLCBcImJvcmRlclwiLCBsYWJlbCwgcHJlZml4KTtcbiAgc2dOb2RlW3Byb3BdW3JhbmtdID0gY3VycjtcbiAgZy5zZXRQYXJlbnQoY3Vyciwgc2cpO1xuICBpZiAocHJldikge1xuICAgIGcuc2V0RWRnZShwcmV2LCBjdXJyLCB7IHdlaWdodDogMSB9KTtcbiAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYWRqdXN0OiBhZGp1c3QsXG4gIHVuZG86IHVuZG9cbn07XG5cbmZ1bmN0aW9uIGFkanVzdChnKSB7XG4gIHZhciByYW5rRGlyID0gZy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJhbmtEaXIgPT09IFwibHJcIiB8fCByYW5rRGlyID09PSBcInJsXCIpIHtcbiAgICBzd2FwV2lkdGhIZWlnaHQoZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5kbyhnKSB7XG4gIHZhciByYW5rRGlyID0gZy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJhbmtEaXIgPT09IFwiYnRcIiB8fCByYW5rRGlyID09PSBcInJsXCIpIHtcbiAgICByZXZlcnNlWShnKTtcbiAgfVxuXG4gIGlmIChyYW5rRGlyID09PSBcImxyXCIgfHwgcmFua0RpciA9PT0gXCJybFwiKSB7XG4gICAgc3dhcFhZKGcpO1xuICAgIHN3YXBXaWR0aEhlaWdodChnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzd2FwV2lkdGhIZWlnaHQoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHN3YXBXaWR0aEhlaWdodE9uZShnLm5vZGUodikpOyB9KTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkgeyBzd2FwV2lkdGhIZWlnaHRPbmUoZy5lZGdlKGUpKTsgfSk7XG59XG5cbmZ1bmN0aW9uIHN3YXBXaWR0aEhlaWdodE9uZShhdHRycykge1xuICB2YXIgdyA9IGF0dHJzLndpZHRoO1xuICBhdHRycy53aWR0aCA9IGF0dHJzLmhlaWdodDtcbiAgYXR0cnMuaGVpZ2h0ID0gdztcbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVkoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldmVyc2VZT25lKGcubm9kZSh2KSk7IH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBfLmZvckVhY2goZWRnZS5wb2ludHMsIHJldmVyc2VZT25lKTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ5XCIpKSB7XG4gICAgICByZXZlcnNlWU9uZShlZGdlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXZlcnNlWU9uZShhdHRycykge1xuICBhdHRycy55ID0gLWF0dHJzLnk7XG59XG5cbmZ1bmN0aW9uIHN3YXBYWShnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgc3dhcFhZT25lKGcubm9kZSh2KSk7IH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBfLmZvckVhY2goZWRnZS5wb2ludHMsIHN3YXBYWU9uZSk7XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieFwiKSkge1xuICAgICAgc3dhcFhZT25lKGVkZ2UpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3YXBYWU9uZShhdHRycykge1xuICB2YXIgeCA9IGF0dHJzLng7XG4gIGF0dHJzLnggPSBhdHRycy55O1xuICBhdHRycy55ID0geDtcbn1cbiIsIi8qXG4gKiBTaW1wbGUgZG91Ymx5IGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uIGRlcml2ZWQgZnJvbSBDb3JtZW4sIGV0IGFsLixcbiAqIFwiSW50cm9kdWN0aW9uIHRvIEFsZ29yaXRobXNcIi5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpc3Q7XG5cbmZ1bmN0aW9uIExpc3QoKSB7XG4gIHZhciBzZW50aW5lbCA9IHt9O1xuICBzZW50aW5lbC5fbmV4dCA9IHNlbnRpbmVsLl9wcmV2ID0gc2VudGluZWw7XG4gIHRoaXMuX3NlbnRpbmVsID0gc2VudGluZWw7XG59XG5cbkxpc3QucHJvdG90eXBlLmRlcXVldWUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbnRpbmVsID0gdGhpcy5fc2VudGluZWw7XG4gIHZhciBlbnRyeSA9IHNlbnRpbmVsLl9wcmV2O1xuICBpZiAoZW50cnkgIT09IHNlbnRpbmVsKSB7XG4gICAgdW5saW5rKGVudHJ5KTtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cbn07XG5cbkxpc3QucHJvdG90eXBlLmVucXVldWUgPSBmdW5jdGlvbihlbnRyeSkge1xuICB2YXIgc2VudGluZWwgPSB0aGlzLl9zZW50aW5lbDtcbiAgaWYgKGVudHJ5Ll9wcmV2ICYmIGVudHJ5Ll9uZXh0KSB7XG4gICAgdW5saW5rKGVudHJ5KTtcbiAgfVxuICBlbnRyeS5fbmV4dCA9IHNlbnRpbmVsLl9uZXh0O1xuICBzZW50aW5lbC5fbmV4dC5fcHJldiA9IGVudHJ5O1xuICBzZW50aW5lbC5fbmV4dCA9IGVudHJ5O1xuICBlbnRyeS5fcHJldiA9IHNlbnRpbmVsO1xufTtcblxuTGlzdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0cnMgPSBbXTtcbiAgdmFyIHNlbnRpbmVsID0gdGhpcy5fc2VudGluZWw7XG4gIHZhciBjdXJyID0gc2VudGluZWwuX3ByZXY7XG4gIHdoaWxlIChjdXJyICE9PSBzZW50aW5lbCkge1xuICAgIHN0cnMucHVzaChKU09OLnN0cmluZ2lmeShjdXJyLCBmaWx0ZXJPdXRMaW5rcykpO1xuICAgIGN1cnIgPSBjdXJyLl9wcmV2O1xuICB9XG4gIHJldHVybiBcIltcIiArIHN0cnMuam9pbihcIiwgXCIpICsgXCJdXCI7XG59O1xuXG5mdW5jdGlvbiB1bmxpbmsoZW50cnkpIHtcbiAgZW50cnkuX3ByZXYuX25leHQgPSBlbnRyeS5fbmV4dDtcbiAgZW50cnkuX25leHQuX3ByZXYgPSBlbnRyeS5fcHJldjtcbiAgZGVsZXRlIGVudHJ5Ll9uZXh0O1xuICBkZWxldGUgZW50cnkuX3ByZXY7XG59XG5cbmZ1bmN0aW9uIGZpbHRlck91dExpbmtzKGssIHYpIHtcbiAgaWYgKGsgIT09IFwiX25leHRcIiAmJiBrICE9PSBcIl9wcmV2XCIpIHtcbiAgICByZXR1cm4gdjtcbiAgfVxufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaGxpYlwiKS5HcmFwaDtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRlYnVnT3JkZXJpbmc6IGRlYnVnT3JkZXJpbmdcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBkZWJ1Z09yZGVyaW5nKGcpIHtcbiAgdmFyIGxheWVyTWF0cml4ID0gdXRpbC5idWlsZExheWVyTWF0cml4KGcpO1xuXG4gIHZhciBoID0gbmV3IEdyYXBoKHsgY29tcG91bmQ6IHRydWUsIG11bHRpZ3JhcGg6IHRydWUgfSkuc2V0R3JhcGgoe30pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBoLnNldE5vZGUodiwgeyBsYWJlbDogdiB9KTtcbiAgICBoLnNldFBhcmVudCh2LCBcImxheWVyXCIgKyBnLm5vZGUodikucmFuayk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBoLnNldEVkZ2UoZS52LCBlLncsIHt9LCBlLm5hbWUpO1xuICB9KTtcblxuICBfLmZvckVhY2gobGF5ZXJNYXRyaXgsIGZ1bmN0aW9uKGxheWVyLCBpKSB7XG4gICAgdmFyIGxheWVyViA9IFwibGF5ZXJcIiArIGk7XG4gICAgaC5zZXROb2RlKGxheWVyViwgeyByYW5rOiBcInNhbWVcIiB9KTtcbiAgICBfLnJlZHVjZShsYXllciwgZnVuY3Rpb24odSwgdikge1xuICAgICAgaC5zZXRFZGdlKHUsIHYsIHsgc3R5bGU6IFwiaW52aXNcIiB9KTtcbiAgICAgIHJldHVybiB2O1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gaDtcbn1cbiIsIi8qIGdsb2JhbCB3aW5kb3cgKi9cblxudmFyIGdyYXBobGliO1xuXG5pZiAodHlwZW9mIHJlcXVpcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICB0cnkge1xuICAgIGdyYXBobGliID0gcmVxdWlyZShcImdyYXBobGliXCIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuICB9XG59XG5cbmlmICghZ3JhcGhsaWIpIHtcbiAgZ3JhcGhsaWIgPSB3aW5kb3cuZ3JhcGhsaWI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ3JhcGhsaWI7XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuL2dyYXBobGliXCIpLkdyYXBoO1xudmFyIExpc3QgPSByZXF1aXJlKFwiLi9kYXRhL2xpc3RcIik7XG5cbi8qXG4gKiBBIGdyZWVkeSBoZXVyaXN0aWMgZm9yIGZpbmRpbmcgYSBmZWVkYmFjayBhcmMgc2V0IGZvciBhIGdyYXBoLiBBIGZlZWRiYWNrXG4gKiBhcmMgc2V0IGlzIGEgc2V0IG9mIGVkZ2VzIHRoYXQgY2FuIGJlIHJlbW92ZWQgdG8gbWFrZSBhIGdyYXBoIGFjeWNsaWMuXG4gKiBUaGUgYWxnb3JpdGhtIGNvbWVzIGZyb206IFAuIEVhZGVzLCBYLiBMaW4sIGFuZCBXLiBGLiBTbXl0aCwgXCJBIGZhc3QgYW5kXG4gKiBlZmZlY3RpdmUgaGV1cmlzdGljIGZvciB0aGUgZmVlZGJhY2sgYXJjIHNldCBwcm9ibGVtLlwiIFRoaXMgaW1wbGVtZW50YXRpb25cbiAqIGFkanVzdHMgdGhhdCBmcm9tIHRoZSBwYXBlciB0byBhbGxvdyBmb3Igd2VpZ2h0ZWQgZWRnZXMuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZ3JlZWR5RkFTO1xuXG52YXIgREVGQVVMVF9XRUlHSFRfRk4gPSBfLmNvbnN0YW50KDEpO1xuXG5mdW5jdGlvbiBncmVlZHlGQVMoZywgd2VpZ2h0Rm4pIHtcbiAgaWYgKGcubm9kZUNvdW50KCkgPD0gMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgc3RhdGUgPSBidWlsZFN0YXRlKGcsIHdlaWdodEZuIHx8IERFRkFVTFRfV0VJR0hUX0ZOKTtcbiAgdmFyIHJlc3VsdHMgPSBkb0dyZWVkeUZBUyhzdGF0ZS5ncmFwaCwgc3RhdGUuYnVja2V0cywgc3RhdGUuemVyb0lkeCk7XG5cbiAgLy8gRXhwYW5kIG11bHRpLWVkZ2VzXG4gIHJldHVybiBfLmZsYXR0ZW4oXy5tYXAocmVzdWx0cywgZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiBnLm91dEVkZ2VzKGUudiwgZS53KTtcbiAgfSksIHRydWUpO1xufVxuXG5mdW5jdGlvbiBkb0dyZWVkeUZBUyhnLCBidWNrZXRzLCB6ZXJvSWR4KSB7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBzb3VyY2VzID0gYnVja2V0c1tidWNrZXRzLmxlbmd0aCAtIDFdO1xuICB2YXIgc2lua3MgPSBidWNrZXRzWzBdO1xuXG4gIHZhciBlbnRyeTtcbiAgd2hpbGUgKGcubm9kZUNvdW50KCkpIHtcbiAgICB3aGlsZSAoKGVudHJ5ID0gc2lua3MuZGVxdWV1ZSgpKSkgICB7IHJlbW92ZU5vZGUoZywgYnVja2V0cywgemVyb0lkeCwgZW50cnkpOyB9XG4gICAgd2hpbGUgKChlbnRyeSA9IHNvdXJjZXMuZGVxdWV1ZSgpKSkgeyByZW1vdmVOb2RlKGcsIGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5KTsgfVxuICAgIGlmIChnLm5vZGVDb3VudCgpKSB7XG4gICAgICBmb3IgKHZhciBpID0gYnVja2V0cy5sZW5ndGggLSAyOyBpID4gMDsgLS1pKSB7XG4gICAgICAgIGVudHJ5ID0gYnVja2V0c1tpXS5kZXF1ZXVlKCk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChyZW1vdmVOb2RlKGcsIGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5LCB0cnVlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZShnLCBidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSwgY29sbGVjdFByZWRlY2Vzc29ycykge1xuICB2YXIgcmVzdWx0cyA9IGNvbGxlY3RQcmVkZWNlc3NvcnMgPyBbXSA6IHVuZGVmaW5lZDtcblxuICBfLmZvckVhY2goZy5pbkVkZ2VzKGVudHJ5LnYpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgdmFyIHdlaWdodCA9IGcuZWRnZShlZGdlKTtcbiAgICB2YXIgdUVudHJ5ID0gZy5ub2RlKGVkZ2Uudik7XG5cbiAgICBpZiAoY29sbGVjdFByZWRlY2Vzc29ycykge1xuICAgICAgcmVzdWx0cy5wdXNoKHsgdjogZWRnZS52LCB3OiBlZGdlLncgfSk7XG4gICAgfVxuXG4gICAgdUVudHJ5Lm91dCAtPSB3ZWlnaHQ7XG4gICAgYXNzaWduQnVja2V0KGJ1Y2tldHMsIHplcm9JZHgsIHVFbnRyeSk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLm91dEVkZ2VzKGVudHJ5LnYpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgdmFyIHdlaWdodCA9IGcuZWRnZShlZGdlKTtcbiAgICB2YXIgdyA9IGVkZ2UudztcbiAgICB2YXIgd0VudHJ5ID0gZy5ub2RlKHcpO1xuICAgIHdFbnRyeVtcImluXCJdIC09IHdlaWdodDtcbiAgICBhc3NpZ25CdWNrZXQoYnVja2V0cywgemVyb0lkeCwgd0VudHJ5KTtcbiAgfSk7XG5cbiAgZy5yZW1vdmVOb2RlKGVudHJ5LnYpO1xuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBidWlsZFN0YXRlKGcsIHdlaWdodEZuKSB7XG4gIHZhciBmYXNHcmFwaCA9IG5ldyBHcmFwaCgpO1xuICB2YXIgbWF4SW4gPSAwO1xuICB2YXIgbWF4T3V0ID0gMDtcblxuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgZmFzR3JhcGguc2V0Tm9kZSh2LCB7IHY6IHYsIFwiaW5cIjogMCwgb3V0OiAwIH0pO1xuICB9KTtcblxuICAvLyBBZ2dyZWdhdGUgd2VpZ2h0cyBvbiBub2RlcywgYnV0IGFsc28gc3VtIHRoZSB3ZWlnaHRzIGFjcm9zcyBtdWx0aS1lZGdlc1xuICAvLyBpbnRvIGEgc2luZ2xlIGVkZ2UgZm9yIHRoZSBmYXNHcmFwaC5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBwcmV2V2VpZ2h0ID0gZmFzR3JhcGguZWRnZShlLnYsIGUudykgfHwgMDtcbiAgICB2YXIgd2VpZ2h0ID0gd2VpZ2h0Rm4oZSk7XG4gICAgdmFyIGVkZ2VXZWlnaHQgPSBwcmV2V2VpZ2h0ICsgd2VpZ2h0O1xuICAgIGZhc0dyYXBoLnNldEVkZ2UoZS52LCBlLncsIGVkZ2VXZWlnaHQpO1xuICAgIG1heE91dCA9IE1hdGgubWF4KG1heE91dCwgZmFzR3JhcGgubm9kZShlLnYpLm91dCArPSB3ZWlnaHQpO1xuICAgIG1heEluICA9IE1hdGgubWF4KG1heEluLCAgZmFzR3JhcGgubm9kZShlLncpW1wiaW5cIl0gICs9IHdlaWdodCk7XG4gIH0pO1xuXG4gIHZhciBidWNrZXRzID0gXy5yYW5nZShtYXhPdXQgKyBtYXhJbiArIDMpLm1hcChmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBMaXN0KCk7IH0pO1xuICB2YXIgemVyb0lkeCA9IG1heEluICsgMTtcblxuICBfLmZvckVhY2goZmFzR3JhcGgubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGFzc2lnbkJ1Y2tldChidWNrZXRzLCB6ZXJvSWR4LCBmYXNHcmFwaC5ub2RlKHYpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgZ3JhcGg6IGZhc0dyYXBoLCBidWNrZXRzOiBidWNrZXRzLCB6ZXJvSWR4OiB6ZXJvSWR4IH07XG59XG5cbmZ1bmN0aW9uIGFzc2lnbkJ1Y2tldChidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSkge1xuICBpZiAoIWVudHJ5Lm91dCkge1xuICAgIGJ1Y2tldHNbMF0uZW5xdWV1ZShlbnRyeSk7XG4gIH0gZWxzZSBpZiAoIWVudHJ5W1wiaW5cIl0pIHtcbiAgICBidWNrZXRzW2J1Y2tldHMubGVuZ3RoIC0gMV0uZW5xdWV1ZShlbnRyeSk7XG4gIH0gZWxzZSB7XG4gICAgYnVja2V0c1tlbnRyeS5vdXQgLSBlbnRyeVtcImluXCJdICsgemVyb0lkeF0uZW5xdWV1ZShlbnRyeSk7XG4gIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBhY3ljbGljID0gcmVxdWlyZShcIi4vYWN5Y2xpY1wiKTtcbnZhciBub3JtYWxpemUgPSByZXF1aXJlKFwiLi9ub3JtYWxpemVcIik7XG52YXIgcmFuayA9IHJlcXVpcmUoXCIuL3JhbmtcIik7XG52YXIgbm9ybWFsaXplUmFua3MgPSByZXF1aXJlKFwiLi91dGlsXCIpLm5vcm1hbGl6ZVJhbmtzO1xudmFyIHBhcmVudER1bW15Q2hhaW5zID0gcmVxdWlyZShcIi4vcGFyZW50LWR1bW15LWNoYWluc1wiKTtcbnZhciByZW1vdmVFbXB0eVJhbmtzID0gcmVxdWlyZShcIi4vdXRpbFwiKS5yZW1vdmVFbXB0eVJhbmtzO1xudmFyIG5lc3RpbmdHcmFwaCA9IHJlcXVpcmUoXCIuL25lc3RpbmctZ3JhcGhcIik7XG52YXIgYWRkQm9yZGVyU2VnbWVudHMgPSByZXF1aXJlKFwiLi9hZGQtYm9yZGVyLXNlZ21lbnRzXCIpO1xudmFyIGNvb3JkaW5hdGVTeXN0ZW0gPSByZXF1aXJlKFwiLi9jb29yZGluYXRlLXN5c3RlbVwiKTtcbnZhciBvcmRlciA9IHJlcXVpcmUoXCIuL29yZGVyXCIpO1xudmFyIHBvc2l0aW9uID0gcmVxdWlyZShcIi4vcG9zaXRpb25cIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaGxpYlwiKS5HcmFwaDtcblxubW9kdWxlLmV4cG9ydHMgPSBsYXlvdXQ7XG5cbmZ1bmN0aW9uIGxheW91dChnLCBvcHRzKSB7XG4gIHZhciB0aW1lID0gb3B0cyAmJiBvcHRzLmRlYnVnVGltaW5nID8gdXRpbC50aW1lIDogdXRpbC5ub3RpbWU7XG4gIHRpbWUoXCJsYXlvdXRcIiwgZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxheW91dEdyYXBoID0gXG4gICAgICB0aW1lKFwiICBidWlsZExheW91dEdyYXBoXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gYnVpbGRMYXlvdXRHcmFwaChnKTsgfSk7XG4gICAgdGltZShcIiAgcnVuTGF5b3V0XCIsICAgICAgICBmdW5jdGlvbigpIHsgcnVuTGF5b3V0KGxheW91dEdyYXBoLCB0aW1lKTsgfSk7XG4gICAgdGltZShcIiAgdXBkYXRlSW5wdXRHcmFwaFwiLCBmdW5jdGlvbigpIHsgdXBkYXRlSW5wdXRHcmFwaChnLCBsYXlvdXRHcmFwaCk7IH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuTGF5b3V0KGcsIHRpbWUpIHtcbiAgdGltZShcIiAgICBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzXCIsIGZ1bmN0aW9uKCkgeyBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzKGcpOyB9KTtcbiAgdGltZShcIiAgICByZW1vdmVTZWxmRWRnZXNcIiwgICAgICAgIGZ1bmN0aW9uKCkgeyByZW1vdmVTZWxmRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFjeWNsaWNcIiwgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IGFjeWNsaWMucnVuKGcpOyB9KTtcbiAgdGltZShcIiAgICBuZXN0aW5nR3JhcGgucnVuXCIsICAgICAgIGZ1bmN0aW9uKCkgeyBuZXN0aW5nR3JhcGgucnVuKGcpOyB9KTtcbiAgdGltZShcIiAgICByYW5rXCIsICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByYW5rKHV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpKTsgfSk7XG4gIHRpbWUoXCIgICAgaW5qZWN0RWRnZUxhYmVsUHJveGllc1wiLCBmdW5jdGlvbigpIHsgaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgcmVtb3ZlRW1wdHlSYW5rc1wiLCAgICAgICBmdW5jdGlvbigpIHsgcmVtb3ZlRW1wdHlSYW5rcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgbmVzdGluZ0dyYXBoLmNsZWFudXBcIiwgICBmdW5jdGlvbigpIHsgbmVzdGluZ0dyYXBoLmNsZWFudXAoZyk7IH0pO1xuICB0aW1lKFwiICAgIG5vcm1hbGl6ZVJhbmtzXCIsICAgICAgICAgZnVuY3Rpb24oKSB7IG5vcm1hbGl6ZVJhbmtzKGcpOyB9KTtcbiAgdGltZShcIiAgICBhc3NpZ25SYW5rTWluTWF4XCIsICAgICAgIGZ1bmN0aW9uKCkgeyBhc3NpZ25SYW5rTWluTWF4KGcpOyB9KTtcbiAgdGltZShcIiAgICByZW1vdmVFZGdlTGFiZWxQcm94aWVzXCIsIGZ1bmN0aW9uKCkgeyByZW1vdmVFZGdlTGFiZWxQcm94aWVzKGcpOyB9KTtcbiAgdGltZShcIiAgICBub3JtYWxpemUucnVuXCIsICAgICAgICAgIGZ1bmN0aW9uKCkgeyBub3JtYWxpemUucnVuKGcpOyB9KTtcbiAgdGltZShcIiAgICBwYXJlbnREdW1teUNoYWluc1wiLCAgICAgIGZ1bmN0aW9uKCkgeyBwYXJlbnREdW1teUNoYWlucyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgYWRkQm9yZGVyU2VnbWVudHNcIiwgICAgICBmdW5jdGlvbigpIHsgYWRkQm9yZGVyU2VnbWVudHMoZyk7IH0pO1xuICB0aW1lKFwiICAgIG9yZGVyXCIsICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IG9yZGVyKGcpOyB9KTtcbiAgdGltZShcIiAgICBpbnNlcnRTZWxmRWRnZXNcIiwgICAgICAgIGZ1bmN0aW9uKCkgeyBpbnNlcnRTZWxmRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFkanVzdENvb3JkaW5hdGVTeXN0ZW1cIiwgZnVuY3Rpb24oKSB7IGNvb3JkaW5hdGVTeXN0ZW0uYWRqdXN0KGcpOyB9KTtcbiAgdGltZShcIiAgICBwb3NpdGlvblwiLCAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyBwb3NpdGlvbihnKTsgfSk7XG4gIHRpbWUoXCIgICAgcG9zaXRpb25TZWxmRWRnZXNcIiwgICAgICBmdW5jdGlvbigpIHsgcG9zaXRpb25TZWxmRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIHJlbW92ZUJvcmRlck5vZGVzXCIsICAgICAgZnVuY3Rpb24oKSB7IHJlbW92ZUJvcmRlck5vZGVzKGcpOyB9KTtcbiAgdGltZShcIiAgICBub3JtYWxpemUudW5kb1wiLCAgICAgICAgIGZ1bmN0aW9uKCkgeyBub3JtYWxpemUudW5kbyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgZml4dXBFZGdlTGFiZWxDb29yZHNcIiwgICBmdW5jdGlvbigpIHsgZml4dXBFZGdlTGFiZWxDb29yZHMoZyk7IH0pO1xuICB0aW1lKFwiICAgIHVuZG9Db29yZGluYXRlU3lzdGVtXCIsICAgZnVuY3Rpb24oKSB7IGNvb3JkaW5hdGVTeXN0ZW0udW5kbyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgdHJhbnNsYXRlR3JhcGhcIiwgICAgICAgICBmdW5jdGlvbigpIHsgdHJhbnNsYXRlR3JhcGgoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFzc2lnbk5vZGVJbnRlcnNlY3RzXCIsICAgZnVuY3Rpb24oKSB7IGFzc2lnbk5vZGVJbnRlcnNlY3RzKGcpOyB9KTtcbiAgdGltZShcIiAgICByZXZlcnNlUG9pbnRzXCIsICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgYWN5Y2xpYy51bmRvXCIsICAgICAgICAgICBmdW5jdGlvbigpIHsgYWN5Y2xpYy51bmRvKGcpOyB9KTtcbn1cblxuLypcbiAqIENvcGllcyBmaW5hbCBsYXlvdXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGF5b3V0IGdyYXBoIGJhY2sgdG8gdGhlIGlucHV0XG4gKiBncmFwaC4gVGhpcyBwcm9jZXNzIG9ubHkgY29waWVzIHdoaXRlbGlzdGVkIGF0dHJpYnV0ZXMgZnJvbSB0aGUgbGF5b3V0IGdyYXBoXG4gKiB0byB0aGUgaW5wdXQgZ3JhcGgsIHNvIGl0IHNlcnZlcyBhcyBhIGdvb2QgcGxhY2UgdG8gZGV0ZXJtaW5lIHdoYXRcbiAqIGF0dHJpYnV0ZXMgY2FuIGluZmx1ZW5jZSBsYXlvdXQuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUlucHV0R3JhcGgoaW5wdXRHcmFwaCwgbGF5b3V0R3JhcGgpIHtcbiAgXy5mb3JFYWNoKGlucHV0R3JhcGgubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBpbnB1dExhYmVsID0gaW5wdXRHcmFwaC5ub2RlKHYpO1xuICAgIHZhciBsYXlvdXRMYWJlbCA9IGxheW91dEdyYXBoLm5vZGUodik7XG5cbiAgICBpZiAoaW5wdXRMYWJlbCkge1xuICAgICAgaW5wdXRMYWJlbC54ID0gbGF5b3V0TGFiZWwueDtcbiAgICAgIGlucHV0TGFiZWwueSA9IGxheW91dExhYmVsLnk7XG5cbiAgICAgIGlmIChsYXlvdXRHcmFwaC5jaGlsZHJlbih2KS5sZW5ndGgpIHtcbiAgICAgICAgaW5wdXRMYWJlbC53aWR0aCA9IGxheW91dExhYmVsLndpZHRoO1xuICAgICAgICBpbnB1dExhYmVsLmhlaWdodCA9IGxheW91dExhYmVsLmhlaWdodDtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChpbnB1dEdyYXBoLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgaW5wdXRMYWJlbCA9IGlucHV0R3JhcGguZWRnZShlKTtcbiAgICB2YXIgbGF5b3V0TGFiZWwgPSBsYXlvdXRHcmFwaC5lZGdlKGUpO1xuXG4gICAgaW5wdXRMYWJlbC5wb2ludHMgPSBsYXlvdXRMYWJlbC5wb2ludHM7XG4gICAgaWYgKF8uaGFzKGxheW91dExhYmVsLCBcInhcIikpIHtcbiAgICAgIGlucHV0TGFiZWwueCA9IGxheW91dExhYmVsLng7XG4gICAgICBpbnB1dExhYmVsLnkgPSBsYXlvdXRMYWJlbC55O1xuICAgIH1cbiAgfSk7XG5cbiAgaW5wdXRHcmFwaC5ncmFwaCgpLndpZHRoID0gbGF5b3V0R3JhcGguZ3JhcGgoKS53aWR0aDtcbiAgaW5wdXRHcmFwaC5ncmFwaCgpLmhlaWdodCA9IGxheW91dEdyYXBoLmdyYXBoKCkuaGVpZ2h0O1xufVxuXG52YXIgZ3JhcGhOdW1BdHRycyA9IFtcIm5vZGVzZXBcIiwgXCJlZGdlc2VwXCIsIFwicmFua3NlcFwiLCBcIm1hcmdpbnhcIiwgXCJtYXJnaW55XCJdO1xudmFyIGdyYXBoRGVmYXVsdHMgPSB7IHJhbmtzZXA6IDUwLCBlZGdlc2VwOiAyMCwgbm9kZXNlcDogNTAsIHJhbmtkaXI6IFwidGJcIiB9O1xudmFyIGdyYXBoQXR0cnMgPSBbXCJhY3ljbGljZXJcIiwgXCJyYW5rZXJcIiwgXCJyYW5rZGlyXCIsIFwiYWxpZ25cIl07XG52YXIgbm9kZU51bUF0dHJzID0gW1wid2lkdGhcIiwgXCJoZWlnaHRcIl07XG52YXIgbm9kZURlZmF1bHRzID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG52YXIgZWRnZU51bUF0dHJzID0gW1wibWlubGVuXCIsIFwid2VpZ2h0XCIsIFwid2lkdGhcIiwgXCJoZWlnaHRcIiwgXCJsYWJlbG9mZnNldFwiXTtcbnZhciBlZGdlRGVmYXVsdHMgPSB7XG4gIG1pbmxlbjogMSwgd2VpZ2h0OiAxLCB3aWR0aDogMCwgaGVpZ2h0OiAwLFxuICBsYWJlbG9mZnNldDogMTAsIGxhYmVscG9zOiBcInJcIlxufTtcbnZhciBlZGdlQXR0cnMgPSBbXCJsYWJlbHBvc1wiXTtcblxuLypcbiAqIENvbnN0cnVjdHMgYSBuZXcgZ3JhcGggZnJvbSB0aGUgaW5wdXQgZ3JhcGgsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBsYXlvdXQuXG4gKiBUaGlzIHByb2Nlc3MgY29waWVzIG9ubHkgd2hpdGVsaXN0ZWQgYXR0cmlidXRlcyBmcm9tIHRoZSBpbnB1dCBncmFwaCB0byB0aGVcbiAqIGxheW91dCBncmFwaC4gVGh1cyB0aGlzIGZ1bmN0aW9uIHNlcnZlcyBhcyBhIGdvb2QgcGxhY2UgdG8gZGV0ZXJtaW5lIHdoYXRcbiAqIGF0dHJpYnV0ZXMgY2FuIGluZmx1ZW5jZSBsYXlvdXQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTGF5b3V0R3JhcGgoaW5wdXRHcmFwaCkge1xuICB2YXIgZyA9IG5ldyBHcmFwaCh7IG11bHRpZ3JhcGg6IHRydWUsIGNvbXBvdW5kOiB0cnVlIH0pO1xuICB2YXIgZ3JhcGggPSBjYW5vbmljYWxpemUoaW5wdXRHcmFwaC5ncmFwaCgpKTtcblxuICBnLnNldEdyYXBoKF8ubWVyZ2Uoe30sXG4gICAgZ3JhcGhEZWZhdWx0cyxcbiAgICBzZWxlY3ROdW1iZXJBdHRycyhncmFwaCwgZ3JhcGhOdW1BdHRycyksXG4gICAgXy5waWNrKGdyYXBoLCBncmFwaEF0dHJzKSkpO1xuXG4gIF8uZm9yRWFjaChpbnB1dEdyYXBoLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLm5vZGUodikpO1xuICAgIGcuc2V0Tm9kZSh2LCBfLmRlZmF1bHRzKHNlbGVjdE51bWJlckF0dHJzKG5vZGUsIG5vZGVOdW1BdHRycyksIG5vZGVEZWZhdWx0cykpO1xuICAgIGcuc2V0UGFyZW50KHYsIGlucHV0R3JhcGgucGFyZW50KHYpKTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGlucHV0R3JhcGguZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gY2Fub25pY2FsaXplKGlucHV0R3JhcGguZWRnZShlKSk7XG4gICAgZy5zZXRFZGdlKGUsIF8ubWVyZ2Uoe30sXG4gICAgICBlZGdlRGVmYXVsdHMsXG4gICAgICBzZWxlY3ROdW1iZXJBdHRycyhlZGdlLCBlZGdlTnVtQXR0cnMpLFxuICAgICAgXy5waWNrKGVkZ2UsIGVkZ2VBdHRycykpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGc7XG59XG5cbi8qXG4gKiBUaGlzIGlkZWEgY29tZXMgZnJvbSB0aGUgR2Fuc25lciBwYXBlcjogdG8gYWNjb3VudCBmb3IgZWRnZSBsYWJlbHMgaW4gb3VyXG4gKiBsYXlvdXQgd2Ugc3BsaXQgZWFjaCByYW5rIGluIGhhbGYgYnkgZG91YmxpbmcgbWlubGVuIGFuZCBoYWx2aW5nIHJhbmtzZXAuXG4gKiBUaGVuIHdlIGNhbiBwbGFjZSBsYWJlbHMgYXQgdGhlc2UgbWlkLXBvaW50cyBiZXR3ZWVuIG5vZGVzLlxuICpcbiAqIFdlIGFsc28gYWRkIHNvbWUgbWluaW1hbCBwYWRkaW5nIHRvIHRoZSB3aWR0aCB0byBwdXNoIHRoZSBsYWJlbCBmb3IgdGhlIGVkZ2VcbiAqIGF3YXkgZnJvbSB0aGUgZWRnZSBpdHNlbGYgYSBiaXQuXG4gKi9cbmZ1bmN0aW9uIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMoZykge1xuICB2YXIgZ3JhcGggPSBnLmdyYXBoKCk7XG4gIGdyYXBoLnJhbmtzZXAgLz0gMjtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGVkZ2UubWlubGVuICo9IDI7XG4gICAgaWYgKGVkZ2UubGFiZWxwb3MudG9Mb3dlckNhc2UoKSAhPT0gXCJjXCIpIHtcbiAgICAgIGlmIChncmFwaC5yYW5rZGlyID09PSBcIlRCXCIgfHwgZ3JhcGgucmFua2RpciA9PT0gXCJCVFwiKSB7XG4gICAgICAgIGVkZ2Uud2lkdGggKz0gZWRnZS5sYWJlbG9mZnNldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVkZ2UuaGVpZ2h0ICs9IGVkZ2UubGFiZWxvZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLypcbiAqIENyZWF0ZXMgdGVtcG9yYXJ5IGR1bW15IG5vZGVzIHRoYXQgY2FwdHVyZSB0aGUgcmFuayBpbiB3aGljaCBlYWNoIGVkZ2Unc1xuICogbGFiZWwgaXMgZ29pbmcgdG8sIGlmIGl0IGhhcyBvbmUgb2Ygbm9uLXplcm8gd2lkdGggYW5kIGhlaWdodC4gV2UgZG8gdGhpc1xuICogc28gdGhhdCB3ZSBjYW4gc2FmZWx5IHJlbW92ZSBlbXB0eSByYW5rcyB3aGlsZSBwcmVzZXJ2aW5nIGJhbGFuY2UgZm9yIHRoZVxuICogbGFiZWwncyBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKSB7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBpZiAoZWRnZS53aWR0aCAmJiBlZGdlLmhlaWdodCkge1xuICAgICAgdmFyIHYgPSBnLm5vZGUoZS52KTtcbiAgICAgIHZhciB3ID0gZy5ub2RlKGUudyk7XG4gICAgICB2YXIgbGFiZWwgPSB7IHJhbms6ICh3LnJhbmsgLSB2LnJhbmspIC8gMiArIHYucmFuaywgZTogZSB9O1xuICAgICAgdXRpbC5hZGREdW1teU5vZGUoZywgXCJlZGdlLXByb3h5XCIsIGxhYmVsLCBcIl9lcFwiKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25SYW5rTWluTWF4KGcpIHtcbiAgdmFyIG1heFJhbmsgPSAwO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKG5vZGUuYm9yZGVyVG9wKSB7XG4gICAgICBub2RlLm1pblJhbmsgPSBnLm5vZGUobm9kZS5ib3JkZXJUb3ApLnJhbms7XG4gICAgICBub2RlLm1heFJhbmsgPSBnLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pLnJhbms7XG4gICAgICBtYXhSYW5rID0gXy5tYXgobWF4UmFuaywgbm9kZS5tYXhSYW5rKTtcbiAgICB9XG4gIH0pO1xuICBnLmdyYXBoKCkubWF4UmFuayA9IG1heFJhbms7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVkZ2VMYWJlbFByb3hpZXMoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKG5vZGUuZHVtbXkgPT09IFwiZWRnZS1wcm94eVwiKSB7XG4gICAgICBnLmVkZ2Uobm9kZS5lKS5sYWJlbFJhbmsgPSBub2RlLnJhbms7XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlR3JhcGgoZykge1xuICB2YXIgbWluWCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgdmFyIG1heFggPSAwO1xuICB2YXIgbWluWSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgdmFyIG1heFkgPSAwO1xuICB2YXIgZ3JhcGhMYWJlbCA9IGcuZ3JhcGgoKTtcbiAgdmFyIG1hcmdpblggPSBncmFwaExhYmVsLm1hcmdpbnggfHwgMDtcbiAgdmFyIG1hcmdpblkgPSBncmFwaExhYmVsLm1hcmdpbnkgfHwgMDtcblxuICBmdW5jdGlvbiBnZXRFeHRyZW1lcyhhdHRycykge1xuICAgIHZhciB4ID0gYXR0cnMueDtcbiAgICB2YXIgeSA9IGF0dHJzLnk7XG4gICAgdmFyIHcgPSBhdHRycy53aWR0aDtcbiAgICB2YXIgaCA9IGF0dHJzLmhlaWdodDtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCAtIHcgLyAyKTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeCArIHcgLyAyKTtcbiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgeSAtIGggLyAyKTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSArIGggLyAyKTtcbiAgfVxuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgZ2V0RXh0cmVtZXMoZy5ub2RlKHYpKTsgfSk7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ4XCIpKSB7XG4gICAgICBnZXRFeHRyZW1lcyhlZGdlKTtcbiAgICB9XG4gIH0pO1xuXG4gIG1pblggLT0gbWFyZ2luWDtcbiAgbWluWSAtPSBtYXJnaW5ZO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBub2RlLnggLT0gbWluWDtcbiAgICBub2RlLnkgLT0gbWluWTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIF8uZm9yRWFjaChlZGdlLnBvaW50cywgZnVuY3Rpb24ocCkge1xuICAgICAgcC54IC09IG1pblg7XG4gICAgICBwLnkgLT0gbWluWTtcbiAgICB9KTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ4XCIpKSB7IGVkZ2UueCAtPSBtaW5YOyB9XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieVwiKSkgeyBlZGdlLnkgLT0gbWluWTsgfVxuICB9KTtcblxuICBncmFwaExhYmVsLndpZHRoID0gbWF4WCAtIG1pblggKyBtYXJnaW5YO1xuICBncmFwaExhYmVsLmhlaWdodCA9IG1heFkgLSBtaW5ZICsgbWFyZ2luWTtcbn1cblxuZnVuY3Rpb24gYXNzaWduTm9kZUludGVyc2VjdHMoZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgdmFyIG5vZGVWID0gZy5ub2RlKGUudik7XG4gICAgdmFyIG5vZGVXID0gZy5ub2RlKGUudyk7XG4gICAgdmFyIHAxLCBwMjtcbiAgICBpZiAoIWVkZ2UucG9pbnRzKSB7XG4gICAgICBlZGdlLnBvaW50cyA9IFtdO1xuICAgICAgcDEgPSBub2RlVztcbiAgICAgIHAyID0gbm9kZVY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAxID0gZWRnZS5wb2ludHNbMF07XG4gICAgICBwMiA9IGVkZ2UucG9pbnRzW2VkZ2UucG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICBlZGdlLnBvaW50cy51bnNoaWZ0KHV0aWwuaW50ZXJzZWN0UmVjdChub2RlViwgcDEpKTtcbiAgICBlZGdlLnBvaW50cy5wdXNoKHV0aWwuaW50ZXJzZWN0UmVjdChub2RlVywgcDIpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGZpeHVwRWRnZUxhYmVsQ29vcmRzKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGlmIChfLmhhcyhlZGdlLCBcInhcIikpIHtcbiAgICAgIGlmIChlZGdlLmxhYmVscG9zID09PSBcImxcIiB8fCBlZGdlLmxhYmVscG9zID09PSBcInJcIikge1xuICAgICAgICBlZGdlLndpZHRoIC09IGVkZ2UubGFiZWxvZmZzZXQ7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGVkZ2UubGFiZWxwb3MpIHtcbiAgICAgIGNhc2UgXCJsXCI6IGVkZ2UueCAtPSBlZGdlLndpZHRoIC8gMiArIGVkZ2UubGFiZWxvZmZzZXQ7IGJyZWFrO1xuICAgICAgY2FzZSBcInJcIjogZWRnZS54ICs9IGVkZ2Uud2lkdGggLyAyICsgZWRnZS5sYWJlbG9mZnNldDsgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVBvaW50c0ZvclJldmVyc2VkRWRnZXMoZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKGVkZ2UucmV2ZXJzZWQpIHtcbiAgICAgIGVkZ2UucG9pbnRzLnJldmVyc2UoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVCb3JkZXJOb2RlcyhnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoZy5jaGlsZHJlbih2KS5sZW5ndGgpIHtcbiAgICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgICAgdmFyIHQgPSBnLm5vZGUobm9kZS5ib3JkZXJUb3ApO1xuICAgICAgdmFyIGIgPSBnLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pO1xuICAgICAgdmFyIGwgPSBnLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyTGVmdCkpO1xuICAgICAgdmFyIHIgPSBnLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyUmlnaHQpKTtcblxuICAgICAgbm9kZS53aWR0aCA9IE1hdGguYWJzKHIueCAtIGwueCk7XG4gICAgICBub2RlLmhlaWdodCA9IE1hdGguYWJzKGIueSAtIHQueSk7XG4gICAgICBub2RlLnggPSBsLnggKyBub2RlLndpZHRoIC8gMjtcbiAgICAgIG5vZGUueSA9IHQueSArIG5vZGUuaGVpZ2h0IC8gMjtcbiAgICB9XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoZy5ub2RlKHYpLmR1bW15ID09PSBcImJvcmRlclwiKSB7XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU2VsZkVkZ2VzKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIGlmIChlLnYgPT09IGUudykge1xuICAgICAgdmFyIG5vZGUgPSBnLm5vZGUoZS52KTtcbiAgICAgIGlmICghbm9kZS5zZWxmRWRnZXMpIHtcbiAgICAgICAgbm9kZS5zZWxmRWRnZXMgPSBbXTtcbiAgICAgIH1cbiAgICAgIG5vZGUuc2VsZkVkZ2VzLnB1c2goeyBlOiBlLCBsYWJlbDogZy5lZGdlKGUpIH0pO1xuICAgICAgZy5yZW1vdmVFZGdlKGUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGluc2VydFNlbGZFZGdlcyhnKSB7XG4gIHZhciBsYXllcnMgPSB1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7XG4gIF8uZm9yRWFjaChsYXllcnMsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgdmFyIG9yZGVyU2hpZnQgPSAwO1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgaSkge1xuICAgICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgICBub2RlLm9yZGVyID0gaSArIG9yZGVyU2hpZnQ7XG4gICAgICBfLmZvckVhY2gobm9kZS5zZWxmRWRnZXMsIGZ1bmN0aW9uKHNlbGZFZGdlKSB7XG4gICAgICAgIHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwic2VsZmVkZ2VcIiwge1xuICAgICAgICAgIHdpZHRoOiBzZWxmRWRnZS5sYWJlbC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHNlbGZFZGdlLmxhYmVsLmhlaWdodCxcbiAgICAgICAgICByYW5rOiBub2RlLnJhbmssXG4gICAgICAgICAgb3JkZXI6IGkgKyAoKytvcmRlclNoaWZ0KSxcbiAgICAgICAgICBlOiBzZWxmRWRnZS5lLFxuICAgICAgICAgIGxhYmVsOiBzZWxmRWRnZS5sYWJlbFxuICAgICAgICB9LCBcIl9zZVwiKTtcbiAgICAgIH0pO1xuICAgICAgZGVsZXRlIG5vZGUuc2VsZkVkZ2VzO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpb25TZWxmRWRnZXMoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKG5vZGUuZHVtbXkgPT09IFwic2VsZmVkZ2VcIikge1xuICAgICAgdmFyIHNlbGZOb2RlID0gZy5ub2RlKG5vZGUuZS52KTtcbiAgICAgIHZhciB4ID0gc2VsZk5vZGUueCArIHNlbGZOb2RlLndpZHRoIC8gMjtcbiAgICAgIHZhciB5ID0gc2VsZk5vZGUueTtcbiAgICAgIHZhciBkeCA9IG5vZGUueCAtIHg7XG4gICAgICB2YXIgZHkgPSBzZWxmTm9kZS5oZWlnaHQgLyAyO1xuICAgICAgZy5zZXRFZGdlKG5vZGUuZSwgbm9kZS5sYWJlbCk7XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgICBub2RlLmxhYmVsLnBvaW50cyA9IFtcbiAgICAgICAgeyB4OiB4ICsgMiAqIGR4IC8gMywgeTogeSAtIGR5IH0sXG4gICAgICAgIHsgeDogeCArIDUgKiBkeCAvIDYsIHk6IHkgLSBkeSB9LFxuICAgICAgICB7IHg6IHggKyAgICAgZHggICAgLCB5OiB5IH0sXG4gICAgICAgIHsgeDogeCArIDUgKiBkeCAvIDYsIHk6IHkgKyBkeSB9LFxuICAgICAgICB7IHg6IHggKyAyICogZHggLyAzLCB5OiB5ICsgZHkgfVxuICAgICAgXTtcbiAgICAgIG5vZGUubGFiZWwueCA9IG5vZGUueDtcbiAgICAgIG5vZGUubGFiZWwueSA9IG5vZGUueTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZWxlY3ROdW1iZXJBdHRycyhvYmosIGF0dHJzKSB7XG4gIHJldHVybiBfLm1hcFZhbHVlcyhfLnBpY2sob2JqLCBhdHRycyksIE51bWJlcik7XG59XG5cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShhdHRycykge1xuICB2YXIgbmV3QXR0cnMgPSB7fTtcbiAgXy5mb3JFYWNoKGF0dHJzLCBmdW5jdGlvbih2LCBrKSB7XG4gICAgbmV3QXR0cnNbay50b0xvd2VyQ2FzZSgpXSA9IHY7XG4gIH0pO1xuICByZXR1cm4gbmV3QXR0cnM7XG59XG4iLCIvKiBnbG9iYWwgd2luZG93ICovXG5cbnZhciBsb2Rhc2g7XG5cbmlmICh0eXBlb2YgcmVxdWlyZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gIHRyeSB7XG4gICAgbG9kYXNoID0ge1xuICAgICAgY2xvbmVEZWVwOiByZXF1aXJlKFwibG9kYXNoL2Nsb25lRGVlcFwiKSxcbiAgICAgIGNvbnN0YW50OiByZXF1aXJlKFwibG9kYXNoL2NvbnN0YW50XCIpLFxuICAgICAgZGVmYXVsdHM6IHJlcXVpcmUoXCJsb2Rhc2gvZGVmYXVsdHNcIiksXG4gICAgICBlYWNoOiByZXF1aXJlKFwibG9kYXNoL2VhY2hcIiksXG4gICAgICBmaWx0ZXI6IHJlcXVpcmUoXCJsb2Rhc2gvZmlsdGVyXCIpLFxuICAgICAgZmluZDogcmVxdWlyZShcImxvZGFzaC9maW5kXCIpLFxuICAgICAgZmxhdHRlbjogcmVxdWlyZShcImxvZGFzaC9mbGF0dGVuXCIpLFxuICAgICAgZm9yRWFjaDogcmVxdWlyZShcImxvZGFzaC9mb3JFYWNoXCIpLFxuICAgICAgZm9ySW46IHJlcXVpcmUoXCJsb2Rhc2gvZm9ySW5cIiksXG4gICAgICBoYXM6ICByZXF1aXJlKFwibG9kYXNoL2hhc1wiKSxcbiAgICAgIGlzVW5kZWZpbmVkOiByZXF1aXJlKFwibG9kYXNoL2lzVW5kZWZpbmVkXCIpLFxuICAgICAgbGFzdDogcmVxdWlyZShcImxvZGFzaC9sYXN0XCIpLFxuICAgICAgbWFwOiByZXF1aXJlKFwibG9kYXNoL21hcFwiKSxcbiAgICAgIG1hcFZhbHVlczogcmVxdWlyZShcImxvZGFzaC9tYXBWYWx1ZXNcIiksXG4gICAgICBtYXg6IHJlcXVpcmUoXCJsb2Rhc2gvbWF4XCIpLFxuICAgICAgbWVyZ2U6IHJlcXVpcmUoXCJsb2Rhc2gvbWVyZ2VcIiksXG4gICAgICBtaW46IHJlcXVpcmUoXCJsb2Rhc2gvbWluXCIpLFxuICAgICAgbWluQnk6IHJlcXVpcmUoXCJsb2Rhc2gvbWluQnlcIiksXG4gICAgICBub3c6IHJlcXVpcmUoXCJsb2Rhc2gvbm93XCIpLFxuICAgICAgcGljazogcmVxdWlyZShcImxvZGFzaC9waWNrXCIpLFxuICAgICAgcmFuZ2U6IHJlcXVpcmUoXCJsb2Rhc2gvcmFuZ2VcIiksXG4gICAgICByZWR1Y2U6IHJlcXVpcmUoXCJsb2Rhc2gvcmVkdWNlXCIpLFxuICAgICAgc29ydEJ5OiByZXF1aXJlKFwibG9kYXNoL3NvcnRCeVwiKSxcbiAgICAgIHVuaXF1ZUlkOiByZXF1aXJlKFwibG9kYXNoL3VuaXF1ZUlkXCIpLFxuICAgICAgdmFsdWVzOiByZXF1aXJlKFwibG9kYXNoL3ZhbHVlc1wiKSxcbiAgICAgIHppcE9iamVjdDogcmVxdWlyZShcImxvZGFzaC96aXBPYmplY3RcIiksXG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgZXJyb3JcbiAgfVxufVxuXG5pZiAoIWxvZGFzaCkge1xuICBsb2Rhc2ggPSB3aW5kb3cuXztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsb2Rhc2g7XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJ1bjogcnVuLFxuICBjbGVhbnVwOiBjbGVhbnVwXG59O1xuXG4vKlxuICogQSBuZXN0aW5nIGdyYXBoIGNyZWF0ZXMgZHVtbXkgbm9kZXMgZm9yIHRoZSB0b3BzIGFuZCBib3R0b21zIG9mIHN1YmdyYXBocyxcbiAqIGFkZHMgYXBwcm9wcmlhdGUgZWRnZXMgdG8gZW5zdXJlIHRoYXQgYWxsIGNsdXN0ZXIgbm9kZXMgYXJlIHBsYWNlZCBiZXR3ZWVuXG4gKiB0aGVzZSBib3VuZHJpZXMsIGFuZCBlbnN1cmVzIHRoYXQgdGhlIGdyYXBoIGlzIGNvbm5lY3RlZC5cbiAqXG4gKiBJbiBhZGRpdGlvbiB3ZSBlbnN1cmUsIHRocm91Z2ggdGhlIHVzZSBvZiB0aGUgbWlubGVuIHByb3BlcnR5LCB0aGF0IG5vZGVzXG4gKiBhbmQgc3ViZ3JhcGggYm9yZGVyIG5vZGVzIHRvIG5vdCBlbmQgdXAgb24gdGhlIHNhbWUgcmFuay5cbiAqXG4gKiBQcmVjb25kaXRpb25zOlxuICpcbiAqICAgIDEuIElucHV0IGdyYXBoIGlzIGEgREFHXG4gKiAgICAyLiBOb2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGFzIGEgbWlubGVuIGF0dHJpYnV0ZVxuICpcbiAqIFBvc3Rjb25kaXRpb25zOlxuICpcbiAqICAgIDEuIElucHV0IGdyYXBoIGlzIGNvbm5lY3RlZC5cbiAqICAgIDIuIER1bW15IG5vZGVzIGFyZSBhZGRlZCBmb3IgdGhlIHRvcHMgYW5kIGJvdHRvbXMgb2Ygc3ViZ3JhcGhzLlxuICogICAgMy4gVGhlIG1pbmxlbiBhdHRyaWJ1dGUgZm9yIG5vZGVzIGlzIGFkanVzdGVkIHRvIGVuc3VyZSBub2RlcyBkbyBub3RcbiAqICAgICAgIGdldCBwbGFjZWQgb24gdGhlIHNhbWUgcmFuayBhcyBzdWJncmFwaCBib3JkZXIgbm9kZXMuXG4gKlxuICogVGhlIG5lc3RpbmcgZ3JhcGggaWRlYSBjb21lcyBmcm9tIFNhbmRlciwgXCJMYXlvdXQgb2YgQ29tcG91bmQgRGlyZWN0ZWRcbiAqIEdyYXBocy5cIlxuICovXG5mdW5jdGlvbiBydW4oZykge1xuICB2YXIgcm9vdCA9IHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwicm9vdFwiLCB7fSwgXCJfcm9vdFwiKTtcbiAgdmFyIGRlcHRocyA9IHRyZWVEZXB0aHMoZyk7XG4gIHZhciBoZWlnaHQgPSBfLm1heChfLnZhbHVlcyhkZXB0aHMpKSAtIDE7IC8vIE5vdGU6IGRlcHRocyBpcyBhbiBPYmplY3Qgbm90IGFuIGFycmF5XG4gIHZhciBub2RlU2VwID0gMiAqIGhlaWdodCArIDE7XG5cbiAgZy5ncmFwaCgpLm5lc3RpbmdSb290ID0gcm9vdDtcblxuICAvLyBNdWx0aXBseSBtaW5sZW4gYnkgbm9kZVNlcCB0byBhbGlnbiBub2RlcyBvbiBub24tYm9yZGVyIHJhbmtzLlxuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7IGcuZWRnZShlKS5taW5sZW4gKj0gbm9kZVNlcDsgfSk7XG5cbiAgLy8gQ2FsY3VsYXRlIGEgd2VpZ2h0IHRoYXQgaXMgc3VmZmljaWVudCB0byBrZWVwIHN1YmdyYXBocyB2ZXJ0aWNhbGx5IGNvbXBhY3RcbiAgdmFyIHdlaWdodCA9IHN1bVdlaWdodHMoZykgKyAxO1xuXG4gIC8vIENyZWF0ZSBib3JkZXIgbm9kZXMgYW5kIGxpbmsgdGhlbSB1cFxuICBfLmZvckVhY2goZy5jaGlsZHJlbigpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgIGRmcyhnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCBjaGlsZCk7XG4gIH0pO1xuXG4gIC8vIFNhdmUgdGhlIG11bHRpcGxpZXIgZm9yIG5vZGUgbGF5ZXJzIGZvciBsYXRlciByZW1vdmFsIG9mIGVtcHR5IGJvcmRlclxuICAvLyBsYXllcnMuXG4gIGcuZ3JhcGgoKS5ub2RlUmFua0ZhY3RvciA9IG5vZGVTZXA7XG59XG5cbmZ1bmN0aW9uIGRmcyhnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCB2KSB7XG4gIHZhciBjaGlsZHJlbiA9IGcuY2hpbGRyZW4odik7XG4gIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgaWYgKHYgIT09IHJvb3QpIHtcbiAgICAgIGcuc2V0RWRnZShyb290LCB2LCB7IHdlaWdodDogMCwgbWlubGVuOiBub2RlU2VwIH0pO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdG9wID0gdXRpbC5hZGRCb3JkZXJOb2RlKGcsIFwiX2J0XCIpO1xuICB2YXIgYm90dG9tID0gdXRpbC5hZGRCb3JkZXJOb2RlKGcsIFwiX2JiXCIpO1xuICB2YXIgbGFiZWwgPSBnLm5vZGUodik7XG5cbiAgZy5zZXRQYXJlbnQodG9wLCB2KTtcbiAgbGFiZWwuYm9yZGVyVG9wID0gdG9wO1xuICBnLnNldFBhcmVudChib3R0b20sIHYpO1xuICBsYWJlbC5ib3JkZXJCb3R0b20gPSBib3R0b207XG5cbiAgXy5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgIGRmcyhnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCBjaGlsZCk7XG5cbiAgICB2YXIgY2hpbGROb2RlID0gZy5ub2RlKGNoaWxkKTtcbiAgICB2YXIgY2hpbGRUb3AgPSBjaGlsZE5vZGUuYm9yZGVyVG9wID8gY2hpbGROb2RlLmJvcmRlclRvcCA6IGNoaWxkO1xuICAgIHZhciBjaGlsZEJvdHRvbSA9IGNoaWxkTm9kZS5ib3JkZXJCb3R0b20gPyBjaGlsZE5vZGUuYm9yZGVyQm90dG9tIDogY2hpbGQ7XG4gICAgdmFyIHRoaXNXZWlnaHQgPSBjaGlsZE5vZGUuYm9yZGVyVG9wID8gd2VpZ2h0IDogMiAqIHdlaWdodDtcbiAgICB2YXIgbWlubGVuID0gY2hpbGRUb3AgIT09IGNoaWxkQm90dG9tID8gMSA6IGhlaWdodCAtIGRlcHRoc1t2XSArIDE7XG5cbiAgICBnLnNldEVkZ2UodG9wLCBjaGlsZFRvcCwge1xuICAgICAgd2VpZ2h0OiB0aGlzV2VpZ2h0LFxuICAgICAgbWlubGVuOiBtaW5sZW4sXG4gICAgICBuZXN0aW5nRWRnZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgZy5zZXRFZGdlKGNoaWxkQm90dG9tLCBib3R0b20sIHtcbiAgICAgIHdlaWdodDogdGhpc1dlaWdodCxcbiAgICAgIG1pbmxlbjogbWlubGVuLFxuICAgICAgbmVzdGluZ0VkZ2U6IHRydWVcbiAgICB9KTtcbiAgfSk7XG5cbiAgaWYgKCFnLnBhcmVudCh2KSkge1xuICAgIGcuc2V0RWRnZShyb290LCB0b3AsIHsgd2VpZ2h0OiAwLCBtaW5sZW46IGhlaWdodCArIGRlcHRoc1t2XSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmVlRGVwdGhzKGcpIHtcbiAgdmFyIGRlcHRocyA9IHt9O1xuICBmdW5jdGlvbiBkZnModiwgZGVwdGgpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBnLmNoaWxkcmVuKHYpO1xuICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIF8uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgZGZzKGNoaWxkLCBkZXB0aCArIDEpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGRlcHRoc1t2XSA9IGRlcHRoO1xuICB9XG4gIF8uZm9yRWFjaChnLmNoaWxkcmVuKCksIGZ1bmN0aW9uKHYpIHsgZGZzKHYsIDEpOyB9KTtcbiAgcmV0dXJuIGRlcHRocztcbn1cblxuZnVuY3Rpb24gc3VtV2VpZ2h0cyhnKSB7XG4gIHJldHVybiBfLnJlZHVjZShnLmVkZ2VzKCksIGZ1bmN0aW9uKGFjYywgZSkge1xuICAgIHJldHVybiBhY2MgKyBnLmVkZ2UoZSkud2VpZ2h0O1xuICB9LCAwKTtcbn1cblxuZnVuY3Rpb24gY2xlYW51cChnKSB7XG4gIHZhciBncmFwaExhYmVsID0gZy5ncmFwaCgpO1xuICBnLnJlbW92ZU5vZGUoZ3JhcGhMYWJlbC5uZXN0aW5nUm9vdCk7XG4gIGRlbGV0ZSBncmFwaExhYmVsLm5lc3RpbmdSb290O1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKGVkZ2UubmVzdGluZ0VkZ2UpIHtcbiAgICAgIGcucmVtb3ZlRWRnZShlKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcnVuOiBydW4sXG4gIHVuZG86IHVuZG9cbn07XG5cbi8qXG4gKiBCcmVha3MgYW55IGxvbmcgZWRnZXMgaW4gdGhlIGdyYXBoIGludG8gc2hvcnQgc2VnbWVudHMgdGhhdCBzcGFuIDEgbGF5ZXJcbiAqIGVhY2guIFRoaXMgb3BlcmF0aW9uIGlzIHVuZG9hYmxlIHdpdGggdGhlIGRlbm9ybWFsaXplIGZ1bmN0aW9uLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIFRoZSBpbnB1dCBncmFwaCBpcyBhIERBRy5cbiAqICAgIDIuIEVhY2ggbm9kZSBpbiB0aGUgZ3JhcGggaGFzIGEgXCJyYW5rXCIgcHJvcGVydHkuXG4gKlxuICogUG9zdC1jb25kaXRpb246XG4gKlxuICogICAgMS4gQWxsIGVkZ2VzIGluIHRoZSBncmFwaCBoYXZlIGEgbGVuZ3RoIG9mIDEuXG4gKiAgICAyLiBEdW1teSBub2RlcyBhcmUgYWRkZWQgd2hlcmUgZWRnZXMgaGF2ZSBiZWVuIHNwbGl0IGludG8gc2VnbWVudHMuXG4gKiAgICAzLiBUaGUgZ3JhcGggaXMgYXVnbWVudGVkIHdpdGggYSBcImR1bW15Q2hhaW5zXCIgYXR0cmlidXRlIHdoaWNoIGNvbnRhaW5zXG4gKiAgICAgICB0aGUgZmlyc3QgZHVtbXkgaW4gZWFjaCBjaGFpbiBvZiBkdW1teSBub2RlcyBwcm9kdWNlZC5cbiAqL1xuZnVuY3Rpb24gcnVuKGcpIHtcbiAgZy5ncmFwaCgpLmR1bW15Q2hhaW5zID0gW107XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGVkZ2UpIHsgbm9ybWFsaXplRWRnZShnLCBlZGdlKTsgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVkZ2UoZywgZSkge1xuICB2YXIgdiA9IGUudjtcbiAgdmFyIHZSYW5rID0gZy5ub2RlKHYpLnJhbms7XG4gIHZhciB3ID0gZS53O1xuICB2YXIgd1JhbmsgPSBnLm5vZGUodykucmFuaztcbiAgdmFyIG5hbWUgPSBlLm5hbWU7XG4gIHZhciBlZGdlTGFiZWwgPSBnLmVkZ2UoZSk7XG4gIHZhciBsYWJlbFJhbmsgPSBlZGdlTGFiZWwubGFiZWxSYW5rO1xuXG4gIGlmICh3UmFuayA9PT0gdlJhbmsgKyAxKSByZXR1cm47XG5cbiAgZy5yZW1vdmVFZGdlKGUpO1xuXG4gIHZhciBkdW1teSwgYXR0cnMsIGk7XG4gIGZvciAoaSA9IDAsICsrdlJhbms7IHZSYW5rIDwgd1Jhbms7ICsraSwgKyt2UmFuaykge1xuICAgIGVkZ2VMYWJlbC5wb2ludHMgPSBbXTtcbiAgICBhdHRycyA9IHtcbiAgICAgIHdpZHRoOiAwLCBoZWlnaHQ6IDAsXG4gICAgICBlZGdlTGFiZWw6IGVkZ2VMYWJlbCwgZWRnZU9iajogZSxcbiAgICAgIHJhbms6IHZSYW5rXG4gICAgfTtcbiAgICBkdW1teSA9IHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwiZWRnZVwiLCBhdHRycywgXCJfZFwiKTtcbiAgICBpZiAodlJhbmsgPT09IGxhYmVsUmFuaykge1xuICAgICAgYXR0cnMud2lkdGggPSBlZGdlTGFiZWwud2lkdGg7XG4gICAgICBhdHRycy5oZWlnaHQgPSBlZGdlTGFiZWwuaGVpZ2h0O1xuICAgICAgYXR0cnMuZHVtbXkgPSBcImVkZ2UtbGFiZWxcIjtcbiAgICAgIGF0dHJzLmxhYmVscG9zID0gZWRnZUxhYmVsLmxhYmVscG9zO1xuICAgIH1cbiAgICBnLnNldEVkZ2UodiwgZHVtbXksIHsgd2VpZ2h0OiBlZGdlTGFiZWwud2VpZ2h0IH0sIG5hbWUpO1xuICAgIGlmIChpID09PSAwKSB7XG4gICAgICBnLmdyYXBoKCkuZHVtbXlDaGFpbnMucHVzaChkdW1teSk7XG4gICAgfVxuICAgIHYgPSBkdW1teTtcbiAgfVxuXG4gIGcuc2V0RWRnZSh2LCB3LCB7IHdlaWdodDogZWRnZUxhYmVsLndlaWdodCB9LCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gdW5kbyhnKSB7XG4gIF8uZm9yRWFjaChnLmdyYXBoKCkuZHVtbXlDaGFpbnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICB2YXIgb3JpZ0xhYmVsID0gbm9kZS5lZGdlTGFiZWw7XG4gICAgdmFyIHc7XG4gICAgZy5zZXRFZGdlKG5vZGUuZWRnZU9iaiwgb3JpZ0xhYmVsKTtcbiAgICB3aGlsZSAobm9kZS5kdW1teSkge1xuICAgICAgdyA9IGcuc3VjY2Vzc29ycyh2KVswXTtcbiAgICAgIGcucmVtb3ZlTm9kZSh2KTtcbiAgICAgIG9yaWdMYWJlbC5wb2ludHMucHVzaCh7IHg6IG5vZGUueCwgeTogbm9kZS55IH0pO1xuICAgICAgaWYgKG5vZGUuZHVtbXkgPT09IFwiZWRnZS1sYWJlbFwiKSB7XG4gICAgICAgIG9yaWdMYWJlbC54ID0gbm9kZS54O1xuICAgICAgICBvcmlnTGFiZWwueSA9IG5vZGUueTtcbiAgICAgICAgb3JpZ0xhYmVsLndpZHRoID0gbm9kZS53aWR0aDtcbiAgICAgICAgb3JpZ0xhYmVsLmhlaWdodCA9IG5vZGUuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgdiA9IHc7XG4gICAgICBub2RlID0gZy5ub2RlKHYpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gYWRkU3ViZ3JhcGhDb25zdHJhaW50cztcblxuZnVuY3Rpb24gYWRkU3ViZ3JhcGhDb25zdHJhaW50cyhnLCBjZywgdnMpIHtcbiAgdmFyIHByZXYgPSB7fSxcbiAgICByb290UHJldjtcblxuICBfLmZvckVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgY2hpbGQgPSBnLnBhcmVudCh2KSxcbiAgICAgIHBhcmVudCxcbiAgICAgIHByZXZDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIHBhcmVudCA9IGcucGFyZW50KGNoaWxkKTtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcHJldkNoaWxkID0gcHJldltwYXJlbnRdO1xuICAgICAgICBwcmV2W3BhcmVudF0gPSBjaGlsZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByZXZDaGlsZCA9IHJvb3RQcmV2O1xuICAgICAgICByb290UHJldiA9IGNoaWxkO1xuICAgICAgfVxuICAgICAgaWYgKHByZXZDaGlsZCAmJiBwcmV2Q2hpbGQgIT09IGNoaWxkKSB7XG4gICAgICAgIGNnLnNldEVkZ2UocHJldkNoaWxkLCBjaGlsZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNoaWxkID0gcGFyZW50O1xuICAgIH1cbiAgfSk7XG5cbiAgLypcbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB2ID8gZy5jaGlsZHJlbih2KSA6IGcuY2hpbGRyZW4oKTtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICB2YXIgbWluID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgICAgICAgIHN1YmdyYXBocyA9IFtdO1xuICAgICAgXy5lYWNoKGNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICB2YXIgY2hpbGRNaW4gPSBkZnMoY2hpbGQpO1xuICAgICAgICBpZiAoZy5jaGlsZHJlbihjaGlsZCkubGVuZ3RoKSB7XG4gICAgICAgICAgc3ViZ3JhcGhzLnB1c2goeyB2OiBjaGlsZCwgb3JkZXI6IGNoaWxkTWluIH0pO1xuICAgICAgICB9XG4gICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgY2hpbGRNaW4pO1xuICAgICAgfSk7XG4gICAgICBfLnJlZHVjZShfLnNvcnRCeShzdWJncmFwaHMsIFwib3JkZXJcIiksIGZ1bmN0aW9uKHByZXYsIGN1cnIpIHtcbiAgICAgICAgY2cuc2V0RWRnZShwcmV2LnYsIGN1cnIudik7XG4gICAgICAgIHJldHVybiBjdXJyO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWluO1xuICAgIH1cbiAgICByZXR1cm4gZy5ub2RlKHYpLm9yZGVyO1xuICB9XG4gIGRmcyh1bmRlZmluZWQpO1xuICAqL1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhcnljZW50ZXI7XG5cbmZ1bmN0aW9uIGJhcnljZW50ZXIoZywgbW92YWJsZSkge1xuICByZXR1cm4gXy5tYXAobW92YWJsZSwgZnVuY3Rpb24odikge1xuICAgIHZhciBpblYgPSBnLmluRWRnZXModik7XG4gICAgaWYgKCFpblYubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyB2OiB2IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXN1bHQgPSBfLnJlZHVjZShpblYsIGZ1bmN0aW9uKGFjYywgZSkge1xuICAgICAgICB2YXIgZWRnZSA9IGcuZWRnZShlKSxcbiAgICAgICAgICBub2RlVSA9IGcubm9kZShlLnYpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1bTogYWNjLnN1bSArIChlZGdlLndlaWdodCAqIG5vZGVVLm9yZGVyKSxcbiAgICAgICAgICB3ZWlnaHQ6IGFjYy53ZWlnaHQgKyBlZGdlLndlaWdodFxuICAgICAgICB9O1xuICAgICAgfSwgeyBzdW06IDAsIHdlaWdodDogMCB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdjogdixcbiAgICAgICAgYmFyeWNlbnRlcjogcmVzdWx0LnN1bSAvIHJlc3VsdC53ZWlnaHQsXG4gICAgICAgIHdlaWdodDogcmVzdWx0LndlaWdodFxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuXG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuR3JhcGg7XG5cbm1vZHVsZS5leHBvcnRzID0gYnVpbGRMYXllckdyYXBoO1xuXG4vKlxuICogQ29uc3RydWN0cyBhIGdyYXBoIHRoYXQgY2FuIGJlIHVzZWQgdG8gc29ydCBhIGxheWVyIG9mIG5vZGVzLiBUaGUgZ3JhcGggd2lsbFxuICogY29udGFpbiBhbGwgYmFzZSBhbmQgc3ViZ3JhcGggbm9kZXMgZnJvbSB0aGUgcmVxdWVzdCBsYXllciBpbiB0aGVpciBvcmlnaW5hbFxuICogaGllcmFyY2h5IGFuZCBhbnkgZWRnZXMgdGhhdCBhcmUgaW5jaWRlbnQgb24gdGhlc2Ugbm9kZXMgYW5kIGFyZSBvZiB0aGUgdHlwZVxuICogcmVxdWVzdGVkIGJ5IHRoZSBcInJlbGF0aW9uc2hpcFwiIHBhcmFtZXRlci5cbiAqXG4gKiBOb2RlcyBmcm9tIHRoZSByZXF1ZXN0ZWQgcmFuayB0aGF0IGRvIG5vdCBoYXZlIHBhcmVudHMgYXJlIGFzc2lnbmVkIGEgcm9vdFxuICogbm9kZSBpbiB0aGUgb3V0cHV0IGdyYXBoLCB3aGljaCBpcyBzZXQgaW4gdGhlIHJvb3QgZ3JhcGggYXR0cmlidXRlLiBUaGlzXG4gKiBtYWtlcyBpdCBlYXN5IHRvIHdhbGsgdGhlIGhpZXJhcmNoeSBvZiBtb3ZhYmxlIG5vZGVzIGR1cmluZyBvcmRlcmluZy5cbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBpcyBhIERBR1xuICogICAgMi4gQmFzZSBub2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGF2ZSBhIHJhbmsgYXR0cmlidXRlXG4gKiAgICAzLiBTdWJncmFwaCBub2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGFzIG1pblJhbmsgYW5kIG1heFJhbmsgYXR0cmlidXRlc1xuICogICAgNC4gRWRnZXMgaGF2ZSBhbiBhc3NpZ25lZCB3ZWlnaHRcbiAqXG4gKiBQb3N0LWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gT3V0cHV0IGdyYXBoIGhhcyBhbGwgbm9kZXMgaW4gdGhlIG1vdmFibGUgcmFuayB3aXRoIHByZXNlcnZlZFxuICogICAgICAgaGllcmFyY2h5LlxuICogICAgMi4gUm9vdCBub2RlcyBpbiB0aGUgbW92YWJsZSBsYXllciBhcmUgbWFkZSBjaGlsZHJlbiBvZiB0aGUgbm9kZVxuICogICAgICAgaW5kaWNhdGVkIGJ5IHRoZSByb290IGF0dHJpYnV0ZSBvZiB0aGUgZ3JhcGguXG4gKiAgICAzLiBOb24tbW92YWJsZSBub2RlcyBpbmNpZGVudCBvbiBtb3ZhYmxlIG5vZGVzLCBzZWxlY3RlZCBieSB0aGVcbiAqICAgICAgIHJlbGF0aW9uc2hpcCBwYXJhbWV0ZXIsIGFyZSBpbmNsdWRlZCBpbiB0aGUgZ3JhcGggKHdpdGhvdXQgaGllcmFyY2h5KS5cbiAqICAgIDQuIEVkZ2VzIGluY2lkZW50IG9uIG1vdmFibGUgbm9kZXMsIHNlbGVjdGVkIGJ5IHRoZSByZWxhdGlvbnNoaXBcbiAqICAgICAgIHBhcmFtZXRlciwgYXJlIGFkZGVkIHRvIHRoZSBvdXRwdXQgZ3JhcGguXG4gKiAgICA1LiBUaGUgd2VpZ2h0cyBmb3IgY29waWVkIGVkZ2VzIGFyZSBhZ2dyZWdhdGVkIGFzIG5lZWQsIHNpbmNlIHRoZSBvdXRwdXRcbiAqICAgICAgIGdyYXBoIGlzIG5vdCBhIG11bHRpLWdyYXBoLlxuICovXG5mdW5jdGlvbiBidWlsZExheWVyR3JhcGgoZywgcmFuaywgcmVsYXRpb25zaGlwKSB7XG4gIHZhciByb290ID0gY3JlYXRlUm9vdE5vZGUoZyksXG4gICAgcmVzdWx0ID0gbmV3IEdyYXBoKHsgY29tcG91bmQ6IHRydWUgfSkuc2V0R3JhcGgoeyByb290OiByb290IH0pXG4gICAgICAuc2V0RGVmYXVsdE5vZGVMYWJlbChmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodik7IH0pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KSxcbiAgICAgIHBhcmVudCA9IGcucGFyZW50KHYpO1xuXG4gICAgaWYgKG5vZGUucmFuayA9PT0gcmFuayB8fCBub2RlLm1pblJhbmsgPD0gcmFuayAmJiByYW5rIDw9IG5vZGUubWF4UmFuaykge1xuICAgICAgcmVzdWx0LnNldE5vZGUodik7XG4gICAgICByZXN1bHQuc2V0UGFyZW50KHYsIHBhcmVudCB8fCByb290KTtcblxuICAgICAgLy8gVGhpcyBhc3N1bWVzIHdlIGhhdmUgb25seSBzaG9ydCBlZGdlcyFcbiAgICAgIF8uZm9yRWFjaChnW3JlbGF0aW9uc2hpcF0odiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdmFyIHUgPSBlLnYgPT09IHYgPyBlLncgOiBlLnYsXG4gICAgICAgICAgZWRnZSA9IHJlc3VsdC5lZGdlKHUsIHYpLFxuICAgICAgICAgIHdlaWdodCA9ICFfLmlzVW5kZWZpbmVkKGVkZ2UpID8gZWRnZS53ZWlnaHQgOiAwO1xuICAgICAgICByZXN1bHQuc2V0RWRnZSh1LCB2LCB7IHdlaWdodDogZy5lZGdlKGUpLndlaWdodCArIHdlaWdodCB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoXy5oYXMobm9kZSwgXCJtaW5SYW5rXCIpKSB7XG4gICAgICAgIHJlc3VsdC5zZXROb2RlKHYsIHtcbiAgICAgICAgICBib3JkZXJMZWZ0OiBub2RlLmJvcmRlckxlZnRbcmFua10sXG4gICAgICAgICAgYm9yZGVyUmlnaHQ6IG5vZGUuYm9yZGVyUmlnaHRbcmFua11cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSb290Tm9kZShnKSB7XG4gIHZhciB2O1xuICB3aGlsZSAoZy5oYXNOb2RlKCh2ID0gXy51bmlxdWVJZChcIl9yb290XCIpKSkpO1xuICByZXR1cm4gdjtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY3Jvc3NDb3VudDtcblxuLypcbiAqIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGxheWVyaW5nIChhbiBhcnJheSBvZiBsYXllcnMsIGVhY2ggd2l0aCBhbiBhcnJheSBvZlxuICogb3JkZXJlcmQgbm9kZXMpIGFuZCBhIGdyYXBoIGFuZCByZXR1cm5zIGEgd2VpZ2h0ZWQgY3Jvc3NpbmcgY291bnQuXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gSW5wdXQgZ3JhcGggbXVzdCBiZSBzaW1wbGUgKG5vdCBhIG11bHRpZ3JhcGgpLCBkaXJlY3RlZCwgYW5kIGluY2x1ZGVcbiAqICAgICAgIG9ubHkgc2ltcGxlIGVkZ2VzLlxuICogICAgMi4gRWRnZXMgaW4gdGhlIGlucHV0IGdyYXBoIG11c3QgaGF2ZSBhc3NpZ25lZCB3ZWlnaHRzLlxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBUaGUgZ3JhcGggYW5kIGxheWVyaW5nIG1hdHJpeCBhcmUgbGVmdCB1bmNoYW5nZWQuXG4gKlxuICogVGhpcyBhbGdvcml0aG0gaXMgZGVyaXZlZCBmcm9tIEJhcnRoLCBldCBhbC4sIFwiQmlsYXllciBDcm9zcyBDb3VudGluZy5cIlxuICovXG5mdW5jdGlvbiBjcm9zc0NvdW50KGcsIGxheWVyaW5nKSB7XG4gIHZhciBjYyA9IDA7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGF5ZXJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICBjYyArPSB0d29MYXllckNyb3NzQ291bnQoZywgbGF5ZXJpbmdbaS0xXSwgbGF5ZXJpbmdbaV0pO1xuICB9XG4gIHJldHVybiBjYztcbn1cblxuZnVuY3Rpb24gdHdvTGF5ZXJDcm9zc0NvdW50KGcsIG5vcnRoTGF5ZXIsIHNvdXRoTGF5ZXIpIHtcbiAgLy8gU29ydCBhbGwgb2YgdGhlIGVkZ2VzIGJldHdlZW4gdGhlIG5vcnRoIGFuZCBzb3V0aCBsYXllcnMgYnkgdGhlaXIgcG9zaXRpb25cbiAgLy8gaW4gdGhlIG5vcnRoIGxheWVyIGFuZCB0aGVuIHRoZSBzb3V0aC4gTWFwIHRoZXNlIGVkZ2VzIHRvIHRoZSBwb3NpdGlvbiBvZlxuICAvLyB0aGVpciBoZWFkIGluIHRoZSBzb3V0aCBsYXllci5cbiAgdmFyIHNvdXRoUG9zID0gXy56aXBPYmplY3Qoc291dGhMYXllcixcbiAgICBfLm1hcChzb3V0aExheWVyLCBmdW5jdGlvbiAodiwgaSkgeyByZXR1cm4gaTsgfSkpO1xuICB2YXIgc291dGhFbnRyaWVzID0gXy5mbGF0dGVuKF8ubWFwKG5vcnRoTGF5ZXIsIGZ1bmN0aW9uKHYpIHtcbiAgICByZXR1cm4gXy5zb3J0QnkoXy5tYXAoZy5vdXRFZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuIHsgcG9zOiBzb3V0aFBvc1tlLnddLCB3ZWlnaHQ6IGcuZWRnZShlKS53ZWlnaHQgfTtcbiAgICB9KSwgXCJwb3NcIik7XG4gIH0pLCB0cnVlKTtcblxuICAvLyBCdWlsZCB0aGUgYWNjdW11bGF0b3IgdHJlZVxuICB2YXIgZmlyc3RJbmRleCA9IDE7XG4gIHdoaWxlIChmaXJzdEluZGV4IDwgc291dGhMYXllci5sZW5ndGgpIGZpcnN0SW5kZXggPDw9IDE7XG4gIHZhciB0cmVlU2l6ZSA9IDIgKiBmaXJzdEluZGV4IC0gMTtcbiAgZmlyc3RJbmRleCAtPSAxO1xuICB2YXIgdHJlZSA9IF8ubWFwKG5ldyBBcnJheSh0cmVlU2l6ZSksIGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfSk7XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSB3ZWlnaHRlZCBjcm9zc2luZ3NcbiAgdmFyIGNjID0gMDtcbiAgXy5mb3JFYWNoKHNvdXRoRW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgdmFyIGluZGV4ID0gZW50cnkucG9zICsgZmlyc3RJbmRleDtcbiAgICB0cmVlW2luZGV4XSArPSBlbnRyeS53ZWlnaHQ7XG4gICAgdmFyIHdlaWdodFN1bSA9IDA7XG4gICAgd2hpbGUgKGluZGV4ID4gMCkge1xuICAgICAgaWYgKGluZGV4ICUgMikge1xuICAgICAgICB3ZWlnaHRTdW0gKz0gdHJlZVtpbmRleCArIDFdO1xuICAgICAgfVxuICAgICAgaW5kZXggPSAoaW5kZXggLSAxKSA+PiAxO1xuICAgICAgdHJlZVtpbmRleF0gKz0gZW50cnkud2VpZ2h0O1xuICAgIH1cbiAgICBjYyArPSBlbnRyeS53ZWlnaHQgKiB3ZWlnaHRTdW07XG4gIH0pKTtcblxuICByZXR1cm4gY2M7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIGluaXRPcmRlciA9IHJlcXVpcmUoXCIuL2luaXQtb3JkZXJcIik7XG52YXIgY3Jvc3NDb3VudCA9IHJlcXVpcmUoXCIuL2Nyb3NzLWNvdW50XCIpO1xudmFyIHNvcnRTdWJncmFwaCA9IHJlcXVpcmUoXCIuL3NvcnQtc3ViZ3JhcGhcIik7XG52YXIgYnVpbGRMYXllckdyYXBoID0gcmVxdWlyZShcIi4vYnVpbGQtbGF5ZXItZ3JhcGhcIik7XG52YXIgYWRkU3ViZ3JhcGhDb25zdHJhaW50cyA9IHJlcXVpcmUoXCIuL2FkZC1zdWJncmFwaC1jb25zdHJhaW50c1wiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5HcmFwaDtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4uL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gb3JkZXI7XG5cbi8qXG4gKiBBcHBsaWVzIGhldXJpc3RpY3MgdG8gbWluaW1pemUgZWRnZSBjcm9zc2luZ3MgaW4gdGhlIGdyYXBoIGFuZCBzZXRzIHRoZSBiZXN0XG4gKiBvcmRlciBzb2x1dGlvbiBhcyBhbiBvcmRlciBhdHRyaWJ1dGUgb24gZWFjaCBub2RlLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEdyYXBoIG11c3QgYmUgREFHXG4gKiAgICAyLiBHcmFwaCBub2RlcyBtdXN0IGJlIG9iamVjdHMgd2l0aCBhIFwicmFua1wiIGF0dHJpYnV0ZVxuICogICAgMy4gR3JhcGggZWRnZXMgbXVzdCBoYXZlIHRoZSBcIndlaWdodFwiIGF0dHJpYnV0ZVxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBub2RlcyB3aWxsIGhhdmUgYW4gXCJvcmRlclwiIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiB0aGVcbiAqICAgICAgIGFsZ29yaXRobS5cbiAqL1xuZnVuY3Rpb24gb3JkZXIoZykge1xuICB2YXIgbWF4UmFuayA9IHV0aWwubWF4UmFuayhnKSxcbiAgICBkb3duTGF5ZXJHcmFwaHMgPSBidWlsZExheWVyR3JhcGhzKGcsIF8ucmFuZ2UoMSwgbWF4UmFuayArIDEpLCBcImluRWRnZXNcIiksXG4gICAgdXBMYXllckdyYXBocyA9IGJ1aWxkTGF5ZXJHcmFwaHMoZywgXy5yYW5nZShtYXhSYW5rIC0gMSwgLTEsIC0xKSwgXCJvdXRFZGdlc1wiKTtcblxuICB2YXIgbGF5ZXJpbmcgPSBpbml0T3JkZXIoZyk7XG4gIGFzc2lnbk9yZGVyKGcsIGxheWVyaW5nKTtcblxuICB2YXIgYmVzdENDID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgIGJlc3Q7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxhc3RCZXN0ID0gMDsgbGFzdEJlc3QgPCA0OyArK2ksICsrbGFzdEJlc3QpIHtcbiAgICBzd2VlcExheWVyR3JhcGhzKGkgJSAyID8gZG93bkxheWVyR3JhcGhzIDogdXBMYXllckdyYXBocywgaSAlIDQgPj0gMik7XG5cbiAgICBsYXllcmluZyA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcbiAgICB2YXIgY2MgPSBjcm9zc0NvdW50KGcsIGxheWVyaW5nKTtcbiAgICBpZiAoY2MgPCBiZXN0Q0MpIHtcbiAgICAgIGxhc3RCZXN0ID0gMDtcbiAgICAgIGJlc3QgPSBfLmNsb25lRGVlcChsYXllcmluZyk7XG4gICAgICBiZXN0Q0MgPSBjYztcbiAgICB9XG4gIH1cblxuICBhc3NpZ25PcmRlcihnLCBiZXN0KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMYXllckdyYXBocyhnLCByYW5rcywgcmVsYXRpb25zaGlwKSB7XG4gIHJldHVybiBfLm1hcChyYW5rcywgZnVuY3Rpb24ocmFuaykge1xuICAgIHJldHVybiBidWlsZExheWVyR3JhcGgoZywgcmFuaywgcmVsYXRpb25zaGlwKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3ZWVwTGF5ZXJHcmFwaHMobGF5ZXJHcmFwaHMsIGJpYXNSaWdodCkge1xuICB2YXIgY2cgPSBuZXcgR3JhcGgoKTtcbiAgXy5mb3JFYWNoKGxheWVyR3JhcGhzLCBmdW5jdGlvbihsZykge1xuICAgIHZhciByb290ID0gbGcuZ3JhcGgoKS5yb290O1xuICAgIHZhciBzb3J0ZWQgPSBzb3J0U3ViZ3JhcGgobGcsIHJvb3QsIGNnLCBiaWFzUmlnaHQpO1xuICAgIF8uZm9yRWFjaChzb3J0ZWQudnMsIGZ1bmN0aW9uKHYsIGkpIHtcbiAgICAgIGxnLm5vZGUodikub3JkZXIgPSBpO1xuICAgIH0pO1xuICAgIGFkZFN1YmdyYXBoQ29uc3RyYWludHMobGcsIGNnLCBzb3J0ZWQudnMpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXNzaWduT3JkZXIoZywgbGF5ZXJpbmcpIHtcbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgaSkge1xuICAgICAgZy5ub2RlKHYpLm9yZGVyID0gaTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRPcmRlcjtcblxuLypcbiAqIEFzc2lnbnMgYW4gaW5pdGlhbCBvcmRlciB2YWx1ZSBmb3IgZWFjaCBub2RlIGJ5IHBlcmZvcm1pbmcgYSBERlMgc2VhcmNoXG4gKiBzdGFydGluZyBmcm9tIG5vZGVzIGluIHRoZSBmaXJzdCByYW5rLiBOb2RlcyBhcmUgYXNzaWduZWQgYW4gb3JkZXIgaW4gdGhlaXJcbiAqIHJhbmsgYXMgdGhleSBhcmUgZmlyc3QgdmlzaXRlZC5cbiAqXG4gKiBUaGlzIGFwcHJvYWNoIGNvbWVzIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkEgVGVjaG5pcXVlIGZvciBEcmF3aW5nIERpcmVjdGVkXG4gKiBHcmFwaHMuXCJcbiAqXG4gKiBSZXR1cm5zIGEgbGF5ZXJpbmcgbWF0cml4IHdpdGggYW4gYXJyYXkgcGVyIGxheWVyIGFuZCBlYWNoIGxheWVyIHNvcnRlZCBieVxuICogdGhlIG9yZGVyIG9mIGl0cyBub2Rlcy5cbiAqL1xuZnVuY3Rpb24gaW5pdE9yZGVyKGcpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgdmFyIHNpbXBsZU5vZGVzID0gXy5maWx0ZXIoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuICFnLmNoaWxkcmVuKHYpLmxlbmd0aDtcbiAgfSk7XG4gIHZhciBtYXhSYW5rID0gXy5tYXgoXy5tYXAoc2ltcGxlTm9kZXMsIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KSk7XG4gIHZhciBsYXllcnMgPSBfLm1hcChfLnJhbmdlKG1heFJhbmsgKyAxKSwgZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfSk7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHJldHVybjtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBsYXllcnNbbm9kZS5yYW5rXS5wdXNoKHYpO1xuICAgIF8uZm9yRWFjaChnLnN1Y2Nlc3NvcnModiksIGRmcyk7XG4gIH1cblxuICB2YXIgb3JkZXJlZFZzID0gXy5zb3J0Qnkoc2ltcGxlTm9kZXMsIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KTtcbiAgXy5mb3JFYWNoKG9yZGVyZWRWcywgZGZzKTtcblxuICByZXR1cm4gbGF5ZXJzO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXNvbHZlQ29uZmxpY3RzO1xuXG4vKlxuICogR2l2ZW4gYSBsaXN0IG9mIGVudHJpZXMgb2YgdGhlIGZvcm0ge3YsIGJhcnljZW50ZXIsIHdlaWdodH0gYW5kIGFcbiAqIGNvbnN0cmFpbnQgZ3JhcGggdGhpcyBmdW5jdGlvbiB3aWxsIHJlc29sdmUgYW55IGNvbmZsaWN0cyBiZXR3ZWVuIHRoZVxuICogY29uc3RyYWludCBncmFwaCBhbmQgdGhlIGJhcnljZW50ZXJzIGZvciB0aGUgZW50cmllcy4gSWYgdGhlIGJhcnljZW50ZXJzIGZvclxuICogYW4gZW50cnkgd291bGQgdmlvbGF0ZSBhIGNvbnN0cmFpbnQgaW4gdGhlIGNvbnN0cmFpbnQgZ3JhcGggdGhlbiB3ZSBjb2FsZXNjZVxuICogdGhlIG5vZGVzIGluIHRoZSBjb25mbGljdCBpbnRvIGEgbmV3IG5vZGUgdGhhdCByZXNwZWN0cyB0aGUgY29udHJhaW50IGFuZFxuICogYWdncmVnYXRlcyBiYXJ5Y2VudGVyIGFuZCB3ZWlnaHQgaW5mb3JtYXRpb24uXG4gKlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgZGVzY3JpcHRpb24gaW4gRm9yc3RlciwgXCJBIEZhc3QgYW5kXG4gKiBTaW1wbGUgSHVlcmlzdGljIGZvciBDb25zdHJhaW5lZCBUd28tTGV2ZWwgQ3Jvc3NpbmcgUmVkdWN0aW9uLFwiIHRob3VnaHQgaXRcbiAqIGRpZmZlcnMgaW4gc29tZSBzcGVjaWZpYyBkZXRhaWxzLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEVhY2ggZW50cnkgaGFzIHRoZSBmb3JtIHt2LCBiYXJ5Y2VudGVyLCB3ZWlnaHR9LCBvciBpZiB0aGUgbm9kZSBoYXNcbiAqICAgICAgIG5vIGJhcnljZW50ZXIsIHRoZW4ge3Z9LlxuICpcbiAqIFJldHVybnM6XG4gKlxuICogICAgQSBuZXcgbGlzdCBvZiBlbnRyaWVzIG9mIHRoZSBmb3JtIHt2cywgaSwgYmFyeWNlbnRlciwgd2VpZ2h0fS4gVGhlIGxpc3RcbiAqICAgIGB2c2AgbWF5IGVpdGhlciBiZSBhIHNpbmdsZXRvbiBvciBpdCBtYXkgYmUgYW4gYWdncmVnYXRpb24gb2Ygbm9kZXNcbiAqICAgIG9yZGVyZWQgc3VjaCB0aGF0IHRoZXkgZG8gbm90IHZpb2xhdGUgY29uc3RyYWludHMgZnJvbSB0aGUgY29uc3RyYWludFxuICogICAgZ3JhcGguIFRoZSBwcm9wZXJ0eSBgaWAgaXMgdGhlIGxvd2VzdCBvcmlnaW5hbCBpbmRleCBvZiBhbnkgb2YgdGhlXG4gKiAgICBlbGVtZW50cyBpbiBgdnNgLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQ29uZmxpY3RzKGVudHJpZXMsIGNnKSB7XG4gIHZhciBtYXBwZWRFbnRyaWVzID0ge307XG4gIF8uZm9yRWFjaChlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSwgaSkge1xuICAgIHZhciB0bXAgPSBtYXBwZWRFbnRyaWVzW2VudHJ5LnZdID0ge1xuICAgICAgaW5kZWdyZWU6IDAsXG4gICAgICBcImluXCI6IFtdLFxuICAgICAgb3V0OiBbXSxcbiAgICAgIHZzOiBbZW50cnkudl0sXG4gICAgICBpOiBpXG4gICAgfTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZW50cnkuYmFyeWNlbnRlcikpIHtcbiAgICAgIHRtcC5iYXJ5Y2VudGVyID0gZW50cnkuYmFyeWNlbnRlcjtcbiAgICAgIHRtcC53ZWlnaHQgPSBlbnRyeS53ZWlnaHQ7XG4gICAgfVxuICB9KTtcblxuICBfLmZvckVhY2goY2cuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlbnRyeVYgPSBtYXBwZWRFbnRyaWVzW2Uudl07XG4gICAgdmFyIGVudHJ5VyA9IG1hcHBlZEVudHJpZXNbZS53XTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZW50cnlWKSAmJiAhXy5pc1VuZGVmaW5lZChlbnRyeVcpKSB7XG4gICAgICBlbnRyeVcuaW5kZWdyZWUrKztcbiAgICAgIGVudHJ5Vi5vdXQucHVzaChtYXBwZWRFbnRyaWVzW2Uud10pO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIHNvdXJjZVNldCA9IF8uZmlsdGVyKG1hcHBlZEVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgcmV0dXJuICFlbnRyeS5pbmRlZ3JlZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGRvUmVzb2x2ZUNvbmZsaWN0cyhzb3VyY2VTZXQpO1xufVxuXG5mdW5jdGlvbiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KSB7XG4gIHZhciBlbnRyaWVzID0gW107XG5cbiAgZnVuY3Rpb24gaGFuZGxlSW4odkVudHJ5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHVFbnRyeSkge1xuICAgICAgaWYgKHVFbnRyeS5tZXJnZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodUVudHJ5LmJhcnljZW50ZXIpIHx8XG4gICAgICAgICAgXy5pc1VuZGVmaW5lZCh2RW50cnkuYmFyeWNlbnRlcikgfHxcbiAgICAgICAgICB1RW50cnkuYmFyeWNlbnRlciA+PSB2RW50cnkuYmFyeWNlbnRlcikge1xuICAgICAgICBtZXJnZUVudHJpZXModkVudHJ5LCB1RW50cnkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVPdXQodkVudHJ5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHdFbnRyeSkge1xuICAgICAgd0VudHJ5W1wiaW5cIl0ucHVzaCh2RW50cnkpO1xuICAgICAgaWYgKC0td0VudHJ5LmluZGVncmVlID09PSAwKSB7XG4gICAgICAgIHNvdXJjZVNldC5wdXNoKHdFbnRyeSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHdoaWxlIChzb3VyY2VTZXQubGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gc291cmNlU2V0LnBvcCgpO1xuICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgXy5mb3JFYWNoKGVudHJ5W1wiaW5cIl0ucmV2ZXJzZSgpLCBoYW5kbGVJbihlbnRyeSkpO1xuICAgIF8uZm9yRWFjaChlbnRyeS5vdXQsIGhhbmRsZU91dChlbnRyeSkpO1xuICB9XG5cbiAgcmV0dXJuIF8ubWFwKF8uZmlsdGVyKGVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7IHJldHVybiAhZW50cnkubWVyZ2VkOyB9KSxcbiAgICBmdW5jdGlvbihlbnRyeSkge1xuICAgICAgcmV0dXJuIF8ucGljayhlbnRyeSwgW1widnNcIiwgXCJpXCIsIFwiYmFyeWNlbnRlclwiLCBcIndlaWdodFwiXSk7XG4gICAgfSk7XG5cbn1cblxuZnVuY3Rpb24gbWVyZ2VFbnRyaWVzKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBzdW0gPSAwO1xuICB2YXIgd2VpZ2h0ID0gMDtcblxuICBpZiAodGFyZ2V0LndlaWdodCkge1xuICAgIHN1bSArPSB0YXJnZXQuYmFyeWNlbnRlciAqIHRhcmdldC53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IHRhcmdldC53ZWlnaHQ7XG4gIH1cblxuICBpZiAoc291cmNlLndlaWdodCkge1xuICAgIHN1bSArPSBzb3VyY2UuYmFyeWNlbnRlciAqIHNvdXJjZS53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IHNvdXJjZS53ZWlnaHQ7XG4gIH1cblxuICB0YXJnZXQudnMgPSBzb3VyY2UudnMuY29uY2F0KHRhcmdldC52cyk7XG4gIHRhcmdldC5iYXJ5Y2VudGVyID0gc3VtIC8gd2VpZ2h0O1xuICB0YXJnZXQud2VpZ2h0ID0gd2VpZ2h0O1xuICB0YXJnZXQuaSA9IE1hdGgubWluKHNvdXJjZS5pLCB0YXJnZXQuaSk7XG4gIHNvdXJjZS5tZXJnZWQgPSB0cnVlO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIGJhcnljZW50ZXIgPSByZXF1aXJlKFwiLi9iYXJ5Y2VudGVyXCIpO1xudmFyIHJlc29sdmVDb25mbGljdHMgPSByZXF1aXJlKFwiLi9yZXNvbHZlLWNvbmZsaWN0c1wiKTtcbnZhciBzb3J0ID0gcmVxdWlyZShcIi4vc29ydFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzb3J0U3ViZ3JhcGg7XG5cbmZ1bmN0aW9uIHNvcnRTdWJncmFwaChnLCB2LCBjZywgYmlhc1JpZ2h0KSB7XG4gIHZhciBtb3ZhYmxlID0gZy5jaGlsZHJlbih2KTtcbiAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gIHZhciBibCA9IG5vZGUgPyBub2RlLmJvcmRlckxlZnQgOiB1bmRlZmluZWQ7XG4gIHZhciBiciA9IG5vZGUgPyBub2RlLmJvcmRlclJpZ2h0OiB1bmRlZmluZWQ7XG4gIHZhciBzdWJncmFwaHMgPSB7fTtcblxuICBpZiAoYmwpIHtcbiAgICBtb3ZhYmxlID0gXy5maWx0ZXIobW92YWJsZSwgZnVuY3Rpb24odykge1xuICAgICAgcmV0dXJuIHcgIT09IGJsICYmIHcgIT09IGJyO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGJhcnljZW50ZXJzID0gYmFyeWNlbnRlcihnLCBtb3ZhYmxlKTtcbiAgXy5mb3JFYWNoKGJhcnljZW50ZXJzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIGlmIChnLmNoaWxkcmVuKGVudHJ5LnYpLmxlbmd0aCkge1xuICAgICAgdmFyIHN1YmdyYXBoUmVzdWx0ID0gc29ydFN1YmdyYXBoKGcsIGVudHJ5LnYsIGNnLCBiaWFzUmlnaHQpO1xuICAgICAgc3ViZ3JhcGhzW2VudHJ5LnZdID0gc3ViZ3JhcGhSZXN1bHQ7XG4gICAgICBpZiAoXy5oYXMoc3ViZ3JhcGhSZXN1bHQsIFwiYmFyeWNlbnRlclwiKSkge1xuICAgICAgICBtZXJnZUJhcnljZW50ZXJzKGVudHJ5LCBzdWJncmFwaFJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICB2YXIgZW50cmllcyA9IHJlc29sdmVDb25mbGljdHMoYmFyeWNlbnRlcnMsIGNnKTtcbiAgZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsIHN1YmdyYXBocyk7XG5cbiAgdmFyIHJlc3VsdCA9IHNvcnQoZW50cmllcywgYmlhc1JpZ2h0KTtcblxuICBpZiAoYmwpIHtcbiAgICByZXN1bHQudnMgPSBfLmZsYXR0ZW4oW2JsLCByZXN1bHQudnMsIGJyXSwgdHJ1ZSk7XG4gICAgaWYgKGcucHJlZGVjZXNzb3JzKGJsKS5sZW5ndGgpIHtcbiAgICAgIHZhciBibFByZWQgPSBnLm5vZGUoZy5wcmVkZWNlc3NvcnMoYmwpWzBdKSxcbiAgICAgICAgYnJQcmVkID0gZy5ub2RlKGcucHJlZGVjZXNzb3JzKGJyKVswXSk7XG4gICAgICBpZiAoIV8uaGFzKHJlc3VsdCwgXCJiYXJ5Y2VudGVyXCIpKSB7XG4gICAgICAgIHJlc3VsdC5iYXJ5Y2VudGVyID0gMDtcbiAgICAgICAgcmVzdWx0LndlaWdodCA9IDA7XG4gICAgICB9XG4gICAgICByZXN1bHQuYmFyeWNlbnRlciA9IChyZXN1bHQuYmFyeWNlbnRlciAqIHJlc3VsdC53ZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxQcmVkLm9yZGVyICsgYnJQcmVkLm9yZGVyKSAvIChyZXN1bHQud2VpZ2h0ICsgMik7XG4gICAgICByZXN1bHQud2VpZ2h0ICs9IDI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsIHN1YmdyYXBocykge1xuICBfLmZvckVhY2goZW50cmllcywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICBlbnRyeS52cyA9IF8uZmxhdHRlbihlbnRyeS52cy5tYXAoZnVuY3Rpb24odikge1xuICAgICAgaWYgKHN1YmdyYXBoc1t2XSkge1xuICAgICAgICByZXR1cm4gc3ViZ3JhcGhzW3ZdLnZzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHY7XG4gICAgfSksIHRydWUpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VCYXJ5Y2VudGVycyh0YXJnZXQsIG90aGVyKSB7XG4gIGlmICghXy5pc1VuZGVmaW5lZCh0YXJnZXQuYmFyeWNlbnRlcikpIHtcbiAgICB0YXJnZXQuYmFyeWNlbnRlciA9ICh0YXJnZXQuYmFyeWNlbnRlciAqIHRhcmdldC53ZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLmJhcnljZW50ZXIgKiBvdGhlci53ZWlnaHQpIC9cbiAgICAgICAgICAgICAgICAgICAgICAgICh0YXJnZXQud2VpZ2h0ICsgb3RoZXIud2VpZ2h0KTtcbiAgICB0YXJnZXQud2VpZ2h0ICs9IG90aGVyLndlaWdodDtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQuYmFyeWNlbnRlciA9IG90aGVyLmJhcnljZW50ZXI7XG4gICAgdGFyZ2V0LndlaWdodCA9IG90aGVyLndlaWdodDtcbiAgfVxufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzb3J0O1xuXG5mdW5jdGlvbiBzb3J0KGVudHJpZXMsIGJpYXNSaWdodCkge1xuICB2YXIgcGFydHMgPSB1dGlsLnBhcnRpdGlvbihlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIHJldHVybiBfLmhhcyhlbnRyeSwgXCJiYXJ5Y2VudGVyXCIpO1xuICB9KTtcbiAgdmFyIHNvcnRhYmxlID0gcGFydHMubGhzLFxuICAgIHVuc29ydGFibGUgPSBfLnNvcnRCeShwYXJ0cy5yaHMsIGZ1bmN0aW9uKGVudHJ5KSB7IHJldHVybiAtZW50cnkuaTsgfSksXG4gICAgdnMgPSBbXSxcbiAgICBzdW0gPSAwLFxuICAgIHdlaWdodCA9IDAsXG4gICAgdnNJbmRleCA9IDA7XG5cbiAgc29ydGFibGUuc29ydChjb21wYXJlV2l0aEJpYXMoISFiaWFzUmlnaHQpKTtcblxuICB2c0luZGV4ID0gY29uc3VtZVVuc29ydGFibGUodnMsIHVuc29ydGFibGUsIHZzSW5kZXgpO1xuXG4gIF8uZm9yRWFjaChzb3J0YWJsZSwgZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgdnNJbmRleCArPSBlbnRyeS52cy5sZW5ndGg7XG4gICAgdnMucHVzaChlbnRyeS52cyk7XG4gICAgc3VtICs9IGVudHJ5LmJhcnljZW50ZXIgKiBlbnRyeS53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IGVudHJ5LndlaWdodDtcbiAgICB2c0luZGV4ID0gY29uc3VtZVVuc29ydGFibGUodnMsIHVuc29ydGFibGUsIHZzSW5kZXgpO1xuICB9KTtcblxuICB2YXIgcmVzdWx0ID0geyB2czogXy5mbGF0dGVuKHZzLCB0cnVlKSB9O1xuICBpZiAod2VpZ2h0KSB7XG4gICAgcmVzdWx0LmJhcnljZW50ZXIgPSBzdW0gLyB3ZWlnaHQ7XG4gICAgcmVzdWx0LndlaWdodCA9IHdlaWdodDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjb25zdW1lVW5zb3J0YWJsZSh2cywgdW5zb3J0YWJsZSwgaW5kZXgpIHtcbiAgdmFyIGxhc3Q7XG4gIHdoaWxlICh1bnNvcnRhYmxlLmxlbmd0aCAmJiAobGFzdCA9IF8ubGFzdCh1bnNvcnRhYmxlKSkuaSA8PSBpbmRleCkge1xuICAgIHVuc29ydGFibGUucG9wKCk7XG4gICAgdnMucHVzaChsYXN0LnZzKTtcbiAgICBpbmRleCsrO1xuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuZnVuY3Rpb24gY29tcGFyZVdpdGhCaWFzKGJpYXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGVudHJ5ViwgZW50cnlXKSB7XG4gICAgaWYgKGVudHJ5Vi5iYXJ5Y2VudGVyIDwgZW50cnlXLmJhcnljZW50ZXIpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5Vi5iYXJ5Y2VudGVyID4gZW50cnlXLmJhcnljZW50ZXIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIHJldHVybiAhYmlhcyA/IGVudHJ5Vi5pIC0gZW50cnlXLmkgOiBlbnRyeVcuaSAtIGVudHJ5Vi5pO1xuICB9O1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50RHVtbXlDaGFpbnM7XG5cbmZ1bmN0aW9uIHBhcmVudER1bW15Q2hhaW5zKGcpIHtcbiAgdmFyIHBvc3RvcmRlck51bXMgPSBwb3N0b3JkZXIoZyk7XG5cbiAgXy5mb3JFYWNoKGcuZ3JhcGgoKS5kdW1teUNoYWlucywgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIHZhciBlZGdlT2JqID0gbm9kZS5lZGdlT2JqO1xuICAgIHZhciBwYXRoRGF0YSA9IGZpbmRQYXRoKGcsIHBvc3RvcmRlck51bXMsIGVkZ2VPYmoudiwgZWRnZU9iai53KTtcbiAgICB2YXIgcGF0aCA9IHBhdGhEYXRhLnBhdGg7XG4gICAgdmFyIGxjYSA9IHBhdGhEYXRhLmxjYTtcbiAgICB2YXIgcGF0aElkeCA9IDA7XG4gICAgdmFyIHBhdGhWID0gcGF0aFtwYXRoSWR4XTtcbiAgICB2YXIgYXNjZW5kaW5nID0gdHJ1ZTtcblxuICAgIHdoaWxlICh2ICE9PSBlZGdlT2JqLncpIHtcbiAgICAgIG5vZGUgPSBnLm5vZGUodik7XG5cbiAgICAgIGlmIChhc2NlbmRpbmcpIHtcbiAgICAgICAgd2hpbGUgKChwYXRoViA9IHBhdGhbcGF0aElkeF0pICE9PSBsY2EgJiZcbiAgICAgICAgICAgICAgIGcubm9kZShwYXRoVikubWF4UmFuayA8IG5vZGUucmFuaykge1xuICAgICAgICAgIHBhdGhJZHgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXRoViA9PT0gbGNhKSB7XG4gICAgICAgICAgYXNjZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhc2NlbmRpbmcpIHtcbiAgICAgICAgd2hpbGUgKHBhdGhJZHggPCBwYXRoLmxlbmd0aCAtIDEgJiZcbiAgICAgICAgICAgICAgIGcubm9kZShwYXRoViA9IHBhdGhbcGF0aElkeCArIDFdKS5taW5SYW5rIDw9IG5vZGUucmFuaykge1xuICAgICAgICAgIHBhdGhJZHgrKztcbiAgICAgICAgfVxuICAgICAgICBwYXRoViA9IHBhdGhbcGF0aElkeF07XG4gICAgICB9XG5cbiAgICAgIGcuc2V0UGFyZW50KHYsIHBhdGhWKTtcbiAgICAgIHYgPSBnLnN1Y2Nlc3NvcnModilbMF07XG4gICAgfVxuICB9KTtcbn1cblxuLy8gRmluZCBhIHBhdGggZnJvbSB2IHRvIHcgdGhyb3VnaCB0aGUgbG93ZXN0IGNvbW1vbiBhbmNlc3RvciAoTENBKS4gUmV0dXJuIHRoZVxuLy8gZnVsbCBwYXRoIGFuZCB0aGUgTENBLlxuZnVuY3Rpb24gZmluZFBhdGgoZywgcG9zdG9yZGVyTnVtcywgdiwgdykge1xuICB2YXIgdlBhdGggPSBbXTtcbiAgdmFyIHdQYXRoID0gW107XG4gIHZhciBsb3cgPSBNYXRoLm1pbihwb3N0b3JkZXJOdW1zW3ZdLmxvdywgcG9zdG9yZGVyTnVtc1t3XS5sb3cpO1xuICB2YXIgbGltID0gTWF0aC5tYXgocG9zdG9yZGVyTnVtc1t2XS5saW0sIHBvc3RvcmRlck51bXNbd10ubGltKTtcbiAgdmFyIHBhcmVudDtcbiAgdmFyIGxjYTtcblxuICAvLyBUcmF2ZXJzZSB1cCBmcm9tIHYgdG8gZmluZCB0aGUgTENBXG4gIHBhcmVudCA9IHY7XG4gIGRvIHtcbiAgICBwYXJlbnQgPSBnLnBhcmVudChwYXJlbnQpO1xuICAgIHZQYXRoLnB1c2gocGFyZW50KTtcbiAgfSB3aGlsZSAocGFyZW50ICYmXG4gICAgICAgICAgIChwb3N0b3JkZXJOdW1zW3BhcmVudF0ubG93ID4gbG93IHx8IGxpbSA+IHBvc3RvcmRlck51bXNbcGFyZW50XS5saW0pKTtcbiAgbGNhID0gcGFyZW50O1xuXG4gIC8vIFRyYXZlcnNlIGZyb20gdyB0byBMQ0FcbiAgcGFyZW50ID0gdztcbiAgd2hpbGUgKChwYXJlbnQgPSBnLnBhcmVudChwYXJlbnQpKSAhPT0gbGNhKSB7XG4gICAgd1BhdGgucHVzaChwYXJlbnQpO1xuICB9XG5cbiAgcmV0dXJuIHsgcGF0aDogdlBhdGguY29uY2F0KHdQYXRoLnJldmVyc2UoKSksIGxjYTogbGNhIH07XG59XG5cbmZ1bmN0aW9uIHBvc3RvcmRlcihnKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgdmFyIGxpbSA9IDA7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgbG93ID0gbGltO1xuICAgIF8uZm9yRWFjaChnLmNoaWxkcmVuKHYpLCBkZnMpO1xuICAgIHJlc3VsdFt2XSA9IHsgbG93OiBsb3csIGxpbTogbGltKysgfTtcbiAgfVxuICBfLmZvckVhY2goZy5jaGlsZHJlbigpLCBkZnMpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBobGliXCIpLkdyYXBoO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxuLypcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGNvb3JkaW5hdGUgYXNzaWdubWVudCBiYXNlZCBvbiBCcmFuZGVzIGFuZCBLw7ZwZiwgXCJGYXN0XG4gKiBhbmQgU2ltcGxlIEhvcml6b250YWwgQ29vcmRpbmF0ZSBBc3NpZ25tZW50LlwiXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBvc2l0aW9uWDogcG9zaXRpb25YLFxuICBmaW5kVHlwZTFDb25mbGljdHM6IGZpbmRUeXBlMUNvbmZsaWN0cyxcbiAgZmluZFR5cGUyQ29uZmxpY3RzOiBmaW5kVHlwZTJDb25mbGljdHMsXG4gIGFkZENvbmZsaWN0OiBhZGRDb25mbGljdCxcbiAgaGFzQ29uZmxpY3Q6IGhhc0NvbmZsaWN0LFxuICB2ZXJ0aWNhbEFsaWdubWVudDogdmVydGljYWxBbGlnbm1lbnQsXG4gIGhvcml6b250YWxDb21wYWN0aW9uOiBob3Jpem9udGFsQ29tcGFjdGlvbixcbiAgYWxpZ25Db29yZGluYXRlczogYWxpZ25Db29yZGluYXRlcyxcbiAgZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQ6IGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50LFxuICBiYWxhbmNlOiBiYWxhbmNlXG59O1xuXG4vKlxuICogTWFya3MgYWxsIGVkZ2VzIGluIHRoZSBncmFwaCB3aXRoIGEgdHlwZS0xIGNvbmZsaWN0IHdpdGggdGhlIFwidHlwZTFDb25mbGljdFwiXG4gKiBwcm9wZXJ0eS4gQSB0eXBlLTEgY29uZmxpY3QgaXMgb25lIHdoZXJlIGEgbm9uLWlubmVyIHNlZ21lbnQgY3Jvc3NlcyBhblxuICogaW5uZXIgc2VnbWVudC4gQW4gaW5uZXIgc2VnbWVudCBpcyBhbiBlZGdlIHdpdGggYm90aCBpbmNpZGVudCBub2RlcyBtYXJrZWRcbiAqIHdpdGggdGhlIFwiZHVtbXlcIiBwcm9wZXJ0eS5cbiAqXG4gKiBUaGlzIGFsZ29yaXRobSBzY2FucyBsYXllciBieSBsYXllciwgc3RhcnRpbmcgd2l0aCB0aGUgc2Vjb25kLCBmb3IgdHlwZS0xXG4gKiBjb25mbGljdHMgYmV0d2VlbiB0aGUgY3VycmVudCBsYXllciBhbmQgdGhlIHByZXZpb3VzIGxheWVyLiBGb3IgZWFjaCBsYXllclxuICogaXQgc2NhbnMgdGhlIG5vZGVzIGZyb20gbGVmdCB0byByaWdodCB1bnRpbCBpdCByZWFjaGVzIG9uZSB0aGF0IGlzIGluY2lkZW50XG4gKiBvbiBhbiBpbm5lciBzZWdtZW50LiBJdCB0aGVuIHNjYW5zIHByZWRlY2Vzc29ycyB0byBkZXRlcm1pbmUgaWYgdGhleSBoYXZlXG4gKiBlZGdlcyB0aGF0IGNyb3NzIHRoYXQgaW5uZXIgc2VnbWVudC4gQXQgdGhlIGVuZCBhIGZpbmFsIHNjYW4gaXMgZG9uZSBmb3IgYWxsXG4gKiBub2RlcyBvbiB0aGUgY3VycmVudCByYW5rIHRvIHNlZSBpZiB0aGV5IGNyb3NzIHRoZSBsYXN0IHZpc2l0ZWQgaW5uZXJcbiAqIHNlZ21lbnQuXG4gKlxuICogVGhpcyBhbGdvcml0aG0gKHNhZmVseSkgYXNzdW1lcyB0aGF0IGEgZHVtbXkgbm9kZSB3aWxsIG9ubHkgYmUgaW5jaWRlbnQgb24gYVxuICogc2luZ2xlIG5vZGUgaW4gdGhlIGxheWVycyBiZWluZyBzY2FubmVkLlxuICovXG5mdW5jdGlvbiBmaW5kVHlwZTFDb25mbGljdHMoZywgbGF5ZXJpbmcpIHtcbiAgdmFyIGNvbmZsaWN0cyA9IHt9O1xuXG4gIGZ1bmN0aW9uIHZpc2l0TGF5ZXIocHJldkxheWVyLCBsYXllcikge1xuICAgIHZhclxuICAgICAgLy8gbGFzdCB2aXNpdGVkIG5vZGUgaW4gdGhlIHByZXZpb3VzIGxheWVyIHRoYXQgaXMgaW5jaWRlbnQgb24gYW4gaW5uZXJcbiAgICAgIC8vIHNlZ21lbnQuXG4gICAgICBrMCA9IDAsXG4gICAgICAvLyBUcmFja3MgdGhlIGxhc3Qgbm9kZSBpbiB0aGlzIGxheWVyIHNjYW5uZWQgZm9yIGNyb3NzaW5ncyB3aXRoIGEgdHlwZS0xXG4gICAgICAvLyBzZWdtZW50LlxuICAgICAgc2NhblBvcyA9IDAsXG4gICAgICBwcmV2TGF5ZXJMZW5ndGggPSBwcmV2TGF5ZXIubGVuZ3RoLFxuICAgICAgbGFzdE5vZGUgPSBfLmxhc3QobGF5ZXIpO1xuXG4gICAgXy5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2LCBpKSB7XG4gICAgICB2YXIgdyA9IGZpbmRPdGhlcklubmVyU2VnbWVudE5vZGUoZywgdiksXG4gICAgICAgIGsxID0gdyA/IGcubm9kZSh3KS5vcmRlciA6IHByZXZMYXllckxlbmd0aDtcblxuICAgICAgaWYgKHcgfHwgdiA9PT0gbGFzdE5vZGUpIHtcbiAgICAgICAgXy5mb3JFYWNoKGxheWVyLnNsaWNlKHNjYW5Qb3MsIGkgKzEpLCBmdW5jdGlvbihzY2FuTm9kZSkge1xuICAgICAgICAgIF8uZm9yRWFjaChnLnByZWRlY2Vzc29ycyhzY2FuTm9kZSksIGZ1bmN0aW9uKHUpIHtcbiAgICAgICAgICAgIHZhciB1TGFiZWwgPSBnLm5vZGUodSksXG4gICAgICAgICAgICAgIHVQb3MgPSB1TGFiZWwub3JkZXI7XG4gICAgICAgICAgICBpZiAoKHVQb3MgPCBrMCB8fCBrMSA8IHVQb3MpICYmXG4gICAgICAgICAgICAgICAgISh1TGFiZWwuZHVtbXkgJiYgZy5ub2RlKHNjYW5Ob2RlKS5kdW1teSkpIHtcbiAgICAgICAgICAgICAgYWRkQ29uZmxpY3QoY29uZmxpY3RzLCB1LCBzY2FuTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzY2FuUG9zID0gaSArIDE7XG4gICAgICAgIGswID0gazE7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGF5ZXI7XG4gIH1cblxuICBfLnJlZHVjZShsYXllcmluZywgdmlzaXRMYXllcik7XG4gIHJldHVybiBjb25mbGljdHM7XG59XG5cbmZ1bmN0aW9uIGZpbmRUeXBlMkNvbmZsaWN0cyhnLCBsYXllcmluZykge1xuICB2YXIgY29uZmxpY3RzID0ge307XG5cbiAgZnVuY3Rpb24gc2Nhbihzb3V0aCwgc291dGhQb3MsIHNvdXRoRW5kLCBwcmV2Tm9ydGhCb3JkZXIsIG5leHROb3J0aEJvcmRlcikge1xuICAgIHZhciB2O1xuICAgIF8uZm9yRWFjaChfLnJhbmdlKHNvdXRoUG9zLCBzb3V0aEVuZCksIGZ1bmN0aW9uKGkpIHtcbiAgICAgIHYgPSBzb3V0aFtpXTtcbiAgICAgIGlmIChnLm5vZGUodikuZHVtbXkpIHtcbiAgICAgICAgXy5mb3JFYWNoKGcucHJlZGVjZXNzb3JzKHYpLCBmdW5jdGlvbih1KSB7XG4gICAgICAgICAgdmFyIHVOb2RlID0gZy5ub2RlKHUpO1xuICAgICAgICAgIGlmICh1Tm9kZS5kdW1teSAmJlxuICAgICAgICAgICAgICAodU5vZGUub3JkZXIgPCBwcmV2Tm9ydGhCb3JkZXIgfHwgdU5vZGUub3JkZXIgPiBuZXh0Tm9ydGhCb3JkZXIpKSB7XG4gICAgICAgICAgICBhZGRDb25mbGljdChjb25mbGljdHMsIHUsIHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIHZpc2l0TGF5ZXIobm9ydGgsIHNvdXRoKSB7XG4gICAgdmFyIHByZXZOb3J0aFBvcyA9IC0xLFxuICAgICAgbmV4dE5vcnRoUG9zLFxuICAgICAgc291dGhQb3MgPSAwO1xuXG4gICAgXy5mb3JFYWNoKHNvdXRoLCBmdW5jdGlvbih2LCBzb3V0aExvb2thaGVhZCkge1xuICAgICAgaWYgKGcubm9kZSh2KS5kdW1teSA9PT0gXCJib3JkZXJcIikge1xuICAgICAgICB2YXIgcHJlZGVjZXNzb3JzID0gZy5wcmVkZWNlc3NvcnModik7XG4gICAgICAgIGlmIChwcmVkZWNlc3NvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgbmV4dE5vcnRoUG9zID0gZy5ub2RlKHByZWRlY2Vzc29yc1swXSkub3JkZXI7XG4gICAgICAgICAgc2Nhbihzb3V0aCwgc291dGhQb3MsIHNvdXRoTG9va2FoZWFkLCBwcmV2Tm9ydGhQb3MsIG5leHROb3J0aFBvcyk7XG4gICAgICAgICAgc291dGhQb3MgPSBzb3V0aExvb2thaGVhZDtcbiAgICAgICAgICBwcmV2Tm9ydGhQb3MgPSBuZXh0Tm9ydGhQb3M7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNjYW4oc291dGgsIHNvdXRoUG9zLCBzb3V0aC5sZW5ndGgsIG5leHROb3J0aFBvcywgbm9ydGgubGVuZ3RoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBzb3V0aDtcbiAgfVxuXG4gIF8ucmVkdWNlKGxheWVyaW5nLCB2aXNpdExheWVyKTtcbiAgcmV0dXJuIGNvbmZsaWN0cztcbn1cblxuZnVuY3Rpb24gZmluZE90aGVySW5uZXJTZWdtZW50Tm9kZShnLCB2KSB7XG4gIGlmIChnLm5vZGUodikuZHVtbXkpIHtcbiAgICByZXR1cm4gXy5maW5kKGcucHJlZGVjZXNzb3JzKHYpLCBmdW5jdGlvbih1KSB7XG4gICAgICByZXR1cm4gZy5ub2RlKHUpLmR1bW15O1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZENvbmZsaWN0KGNvbmZsaWN0cywgdiwgdykge1xuICBpZiAodiA+IHcpIHtcbiAgICB2YXIgdG1wID0gdjtcbiAgICB2ID0gdztcbiAgICB3ID0gdG1wO1xuICB9XG5cbiAgdmFyIGNvbmZsaWN0c1YgPSBjb25mbGljdHNbdl07XG4gIGlmICghY29uZmxpY3RzVikge1xuICAgIGNvbmZsaWN0c1t2XSA9IGNvbmZsaWN0c1YgPSB7fTtcbiAgfVxuICBjb25mbGljdHNWW3ddID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaGFzQ29uZmxpY3QoY29uZmxpY3RzLCB2LCB3KSB7XG4gIGlmICh2ID4gdykge1xuICAgIHZhciB0bXAgPSB2O1xuICAgIHYgPSB3O1xuICAgIHcgPSB0bXA7XG4gIH1cbiAgcmV0dXJuIF8uaGFzKGNvbmZsaWN0c1t2XSwgdyk7XG59XG5cbi8qXG4gKiBUcnkgdG8gYWxpZ24gbm9kZXMgaW50byB2ZXJ0aWNhbCBcImJsb2Nrc1wiIHdoZXJlIHBvc3NpYmxlLiBUaGlzIGFsZ29yaXRobVxuICogYXR0ZW1wdHMgdG8gYWxpZ24gYSBub2RlIHdpdGggb25lIG9mIGl0cyBtZWRpYW4gbmVpZ2hib3JzLiBJZiB0aGUgZWRnZVxuICogY29ubmVjdGluZyBhIG5laWdoYm9yIGlzIGEgdHlwZS0xIGNvbmZsaWN0IHRoZW4gd2UgaWdub3JlIHRoYXQgcG9zc2liaWxpdHkuXG4gKiBJZiBhIHByZXZpb3VzIG5vZGUgaGFzIGFscmVhZHkgZm9ybWVkIGEgYmxvY2sgd2l0aCBhIG5vZGUgYWZ0ZXIgdGhlIG5vZGVcbiAqIHdlJ3JlIHRyeWluZyB0byBmb3JtIGEgYmxvY2sgd2l0aCwgd2UgYWxzbyBpZ25vcmUgdGhhdCBwb3NzaWJpbGl0eSAtIG91clxuICogYmxvY2tzIHdvdWxkIGJlIHNwbGl0IGluIHRoYXQgc2NlbmFyaW8uXG4gKi9cbmZ1bmN0aW9uIHZlcnRpY2FsQWxpZ25tZW50KGcsIGxheWVyaW5nLCBjb25mbGljdHMsIG5laWdoYm9yRm4pIHtcbiAgdmFyIHJvb3QgPSB7fSxcbiAgICBhbGlnbiA9IHt9LFxuICAgIHBvcyA9IHt9O1xuXG4gIC8vIFdlIGNhY2hlIHRoZSBwb3NpdGlvbiBoZXJlIGJhc2VkIG9uIHRoZSBsYXllcmluZyBiZWNhdXNlIHRoZSBncmFwaCBhbmRcbiAgLy8gbGF5ZXJpbmcgbWF5IGJlIG91dCBvZiBzeW5jLiBUaGUgbGF5ZXJpbmcgbWF0cml4IGlzIG1hbmlwdWxhdGVkIHRvXG4gIC8vIGdlbmVyYXRlIGRpZmZlcmVudCBleHRyZW1lIGFsaWdubWVudHMuXG4gIF8uZm9yRWFjaChsYXllcmluZywgZnVuY3Rpb24obGF5ZXIpIHtcbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYsIG9yZGVyKSB7XG4gICAgICByb290W3ZdID0gdjtcbiAgICAgIGFsaWduW3ZdID0gdjtcbiAgICAgIHBvc1t2XSA9IG9yZGVyO1xuICAgIH0pO1xuICB9KTtcblxuICBfLmZvckVhY2gobGF5ZXJpbmcsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgdmFyIHByZXZJZHggPSAtMTtcbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYpIHtcbiAgICAgIHZhciB3cyA9IG5laWdoYm9yRm4odik7XG4gICAgICBpZiAod3MubGVuZ3RoKSB7XG4gICAgICAgIHdzID0gXy5zb3J0Qnkod3MsIGZ1bmN0aW9uKHcpIHsgcmV0dXJuIHBvc1t3XTsgfSk7XG4gICAgICAgIHZhciBtcCA9ICh3cy5sZW5ndGggLSAxKSAvIDI7XG4gICAgICAgIGZvciAodmFyIGkgPSBNYXRoLmZsb29yKG1wKSwgaWwgPSBNYXRoLmNlaWwobXApOyBpIDw9IGlsOyArK2kpIHtcbiAgICAgICAgICB2YXIgdyA9IHdzW2ldO1xuICAgICAgICAgIGlmIChhbGlnblt2XSA9PT0gdiAmJlxuICAgICAgICAgICAgICBwcmV2SWR4IDwgcG9zW3ddICYmXG4gICAgICAgICAgICAgICFoYXNDb25mbGljdChjb25mbGljdHMsIHYsIHcpKSB7XG4gICAgICAgICAgICBhbGlnblt3XSA9IHY7XG4gICAgICAgICAgICBhbGlnblt2XSA9IHJvb3Rbdl0gPSByb290W3ddO1xuICAgICAgICAgICAgcHJldklkeCA9IHBvc1t3XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgcm9vdDogcm9vdCwgYWxpZ246IGFsaWduIH07XG59XG5cbmZ1bmN0aW9uIGhvcml6b250YWxDb21wYWN0aW9uKGcsIGxheWVyaW5nLCByb290LCBhbGlnbiwgcmV2ZXJzZVNlcCkge1xuICAvLyBUaGlzIHBvcnRpb24gb2YgdGhlIGFsZ29yaXRobSBkaWZmZXJzIGZyb20gQksgZHVlIHRvIGEgbnVtYmVyIG9mIHByb2JsZW1zLlxuICAvLyBJbnN0ZWFkIG9mIHRoZWlyIGFsZ29yaXRobSB3ZSBjb25zdHJ1Y3QgYSBuZXcgYmxvY2sgZ3JhcGggYW5kIGRvIHR3b1xuICAvLyBzd2VlcHMuIFRoZSBmaXJzdCBzd2VlcCBwbGFjZXMgYmxvY2tzIHdpdGggdGhlIHNtYWxsZXN0IHBvc3NpYmxlXG4gIC8vIGNvb3JkaW5hdGVzLiBUaGUgc2Vjb25kIHN3ZWVwIHJlbW92ZXMgdW51c2VkIHNwYWNlIGJ5IG1vdmluZyBibG9ja3MgdG8gdGhlXG4gIC8vIGdyZWF0ZXN0IGNvb3JkaW5hdGVzIHdpdGhvdXQgdmlvbGF0aW5nIHNlcGFyYXRpb24uXG4gIHZhciB4cyA9IHt9LFxuICAgIGJsb2NrRyA9IGJ1aWxkQmxvY2tHcmFwaChnLCBsYXllcmluZywgcm9vdCwgcmV2ZXJzZVNlcCksXG4gICAgYm9yZGVyVHlwZSA9IHJldmVyc2VTZXAgPyBcImJvcmRlckxlZnRcIiA6IFwiYm9yZGVyUmlnaHRcIjtcblxuICBmdW5jdGlvbiBpdGVyYXRlKHNldFhzRnVuYywgbmV4dE5vZGVzRnVuYykge1xuICAgIHZhciBzdGFjayA9IGJsb2NrRy5ub2RlcygpO1xuICAgIHZhciBlbGVtID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgICB3aGlsZSAoZWxlbSkge1xuICAgICAgaWYgKHZpc2l0ZWRbZWxlbV0pIHtcbiAgICAgICAgc2V0WHNGdW5jKGVsZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmlzaXRlZFtlbGVtXSA9IHRydWU7XG4gICAgICAgIHN0YWNrLnB1c2goZWxlbSk7XG4gICAgICAgIHN0YWNrID0gc3RhY2suY29uY2F0KG5leHROb2Rlc0Z1bmMoZWxlbSkpO1xuICAgICAgfVxuXG4gICAgICBlbGVtID0gc3RhY2sucG9wKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRmlyc3QgcGFzcywgYXNzaWduIHNtYWxsZXN0IGNvb3JkaW5hdGVzXG4gIGZ1bmN0aW9uIHBhc3MxKGVsZW0pIHtcbiAgICB4c1tlbGVtXSA9IGJsb2NrRy5pbkVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsIGUpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heChhY2MsIHhzW2Uudl0gKyBibG9ja0cuZWRnZShlKSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvLyBTZWNvbmQgcGFzcywgYXNzaWduIGdyZWF0ZXN0IGNvb3JkaW5hdGVzXG4gIGZ1bmN0aW9uIHBhc3MyKGVsZW0pIHtcbiAgICB2YXIgbWluID0gYmxvY2tHLm91dEVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsIGUpIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbihhY2MsIHhzW2Uud10gLSBibG9ja0cuZWRnZShlKSk7XG4gICAgfSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcblxuICAgIHZhciBub2RlID0gZy5ub2RlKGVsZW0pO1xuICAgIGlmIChtaW4gIT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSAmJiBub2RlLmJvcmRlclR5cGUgIT09IGJvcmRlclR5cGUpIHtcbiAgICAgIHhzW2VsZW1dID0gTWF0aC5tYXgoeHNbZWxlbV0sIG1pbik7XG4gICAgfVxuICB9XG5cbiAgaXRlcmF0ZShwYXNzMSwgYmxvY2tHLnByZWRlY2Vzc29ycy5iaW5kKGJsb2NrRykpO1xuICBpdGVyYXRlKHBhc3MyLCBibG9ja0cuc3VjY2Vzc29ycy5iaW5kKGJsb2NrRykpO1xuXG4gIC8vIEFzc2lnbiB4IGNvb3JkaW5hdGVzIHRvIGFsbCBub2Rlc1xuICBfLmZvckVhY2goYWxpZ24sIGZ1bmN0aW9uKHYpIHtcbiAgICB4c1t2XSA9IHhzW3Jvb3Rbdl1dO1xuICB9KTtcblxuICByZXR1cm4geHM7XG59XG5cblxuZnVuY3Rpb24gYnVpbGRCbG9ja0dyYXBoKGcsIGxheWVyaW5nLCByb290LCByZXZlcnNlU2VwKSB7XG4gIHZhciBibG9ja0dyYXBoID0gbmV3IEdyYXBoKCksXG4gICAgZ3JhcGhMYWJlbCA9IGcuZ3JhcGgoKSxcbiAgICBzZXBGbiA9IHNlcChncmFwaExhYmVsLm5vZGVzZXAsIGdyYXBoTGFiZWwuZWRnZXNlcCwgcmV2ZXJzZVNlcCk7XG5cbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIHZhciB1O1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odikge1xuICAgICAgdmFyIHZSb290ID0gcm9vdFt2XTtcbiAgICAgIGJsb2NrR3JhcGguc2V0Tm9kZSh2Um9vdCk7XG4gICAgICBpZiAodSkge1xuICAgICAgICB2YXIgdVJvb3QgPSByb290W3VdLFxuICAgICAgICAgIHByZXZNYXggPSBibG9ja0dyYXBoLmVkZ2UodVJvb3QsIHZSb290KTtcbiAgICAgICAgYmxvY2tHcmFwaC5zZXRFZGdlKHVSb290LCB2Um9vdCwgTWF0aC5tYXgoc2VwRm4oZywgdiwgdSksIHByZXZNYXggfHwgMCkpO1xuICAgICAgfVxuICAgICAgdSA9IHY7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBibG9ja0dyYXBoO1xufVxuXG4vKlxuICogUmV0dXJucyB0aGUgYWxpZ25tZW50IHRoYXQgaGFzIHRoZSBzbWFsbGVzdCB3aWR0aCBvZiB0aGUgZ2l2ZW4gYWxpZ25tZW50cy5cbiAqL1xuZnVuY3Rpb24gZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQoZywgeHNzKSB7XG4gIHJldHVybiBfLm1pbkJ5KF8udmFsdWVzKHhzcyksIGZ1bmN0aW9uICh4cykge1xuICAgIHZhciBtYXggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIG1pbiA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuICAgIF8uZm9ySW4oeHMsIGZ1bmN0aW9uICh4LCB2KSB7XG4gICAgICB2YXIgaGFsZldpZHRoID0gd2lkdGgoZywgdikgLyAyO1xuXG4gICAgICBtYXggPSBNYXRoLm1heCh4ICsgaGFsZldpZHRoLCBtYXgpO1xuICAgICAgbWluID0gTWF0aC5taW4oeCAtIGhhbGZXaWR0aCwgbWluKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtYXggLSBtaW47XG4gIH0pO1xufVxuXG4vKlxuICogQWxpZ24gdGhlIGNvb3JkaW5hdGVzIG9mIGVhY2ggb2YgdGhlIGxheW91dCBhbGlnbm1lbnRzIHN1Y2ggdGhhdFxuICogbGVmdC1iaWFzZWQgYWxpZ25tZW50cyBoYXZlIHRoZWlyIG1pbmltdW0gY29vcmRpbmF0ZSBhdCB0aGUgc2FtZSBwb2ludCBhc1xuICogdGhlIG1pbmltdW0gY29vcmRpbmF0ZSBvZiB0aGUgc21hbGxlc3Qgd2lkdGggYWxpZ25tZW50IGFuZCByaWdodC1iaWFzZWRcbiAqIGFsaWdubWVudHMgaGF2ZSB0aGVpciBtYXhpbXVtIGNvb3JkaW5hdGUgYXQgdGhlIHNhbWUgcG9pbnQgYXMgdGhlIG1heGltdW1cbiAqIGNvb3JkaW5hdGUgb2YgdGhlIHNtYWxsZXN0IHdpZHRoIGFsaWdubWVudC5cbiAqL1xuZnVuY3Rpb24gYWxpZ25Db29yZGluYXRlcyh4c3MsIGFsaWduVG8pIHtcbiAgdmFyIGFsaWduVG9WYWxzID0gXy52YWx1ZXMoYWxpZ25UbyksXG4gICAgYWxpZ25Ub01pbiA9IF8ubWluKGFsaWduVG9WYWxzKSxcbiAgICBhbGlnblRvTWF4ID0gXy5tYXgoYWxpZ25Ub1ZhbHMpO1xuXG4gIF8uZm9yRWFjaChbXCJ1XCIsIFwiZFwiXSwgZnVuY3Rpb24odmVydCkge1xuICAgIF8uZm9yRWFjaChbXCJsXCIsIFwiclwiXSwgZnVuY3Rpb24oaG9yaXopIHtcbiAgICAgIHZhciBhbGlnbm1lbnQgPSB2ZXJ0ICsgaG9yaXosXG4gICAgICAgIHhzID0geHNzW2FsaWdubWVudF0sXG4gICAgICAgIGRlbHRhO1xuICAgICAgaWYgKHhzID09PSBhbGlnblRvKSByZXR1cm47XG5cbiAgICAgIHZhciB4c1ZhbHMgPSBfLnZhbHVlcyh4cyk7XG4gICAgICBkZWx0YSA9IGhvcml6ID09PSBcImxcIiA/IGFsaWduVG9NaW4gLSBfLm1pbih4c1ZhbHMpIDogYWxpZ25Ub01heCAtIF8ubWF4KHhzVmFscyk7XG5cbiAgICAgIGlmIChkZWx0YSkge1xuICAgICAgICB4c3NbYWxpZ25tZW50XSA9IF8ubWFwVmFsdWVzKHhzLCBmdW5jdGlvbih4KSB7IHJldHVybiB4ICsgZGVsdGE7IH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYmFsYW5jZSh4c3MsIGFsaWduKSB7XG4gIHJldHVybiBfLm1hcFZhbHVlcyh4c3MudWwsIGZ1bmN0aW9uKGlnbm9yZSwgdikge1xuICAgIGlmIChhbGlnbikge1xuICAgICAgcmV0dXJuIHhzc1thbGlnbi50b0xvd2VyQ2FzZSgpXVt2XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHhzID0gXy5zb3J0QnkoXy5tYXAoeHNzLCB2KSk7XG4gICAgICByZXR1cm4gKHhzWzFdICsgeHNbMl0pIC8gMjtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwb3NpdGlvblgoZykge1xuICB2YXIgbGF5ZXJpbmcgPSB1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7XG4gIHZhciBjb25mbGljdHMgPSBfLm1lcmdlKFxuICAgIGZpbmRUeXBlMUNvbmZsaWN0cyhnLCBsYXllcmluZyksXG4gICAgZmluZFR5cGUyQ29uZmxpY3RzKGcsIGxheWVyaW5nKSk7XG5cbiAgdmFyIHhzcyA9IHt9O1xuICB2YXIgYWRqdXN0ZWRMYXllcmluZztcbiAgXy5mb3JFYWNoKFtcInVcIiwgXCJkXCJdLCBmdW5jdGlvbih2ZXJ0KSB7XG4gICAgYWRqdXN0ZWRMYXllcmluZyA9IHZlcnQgPT09IFwidVwiID8gbGF5ZXJpbmcgOiBfLnZhbHVlcyhsYXllcmluZykucmV2ZXJzZSgpO1xuICAgIF8uZm9yRWFjaChbXCJsXCIsIFwiclwiXSwgZnVuY3Rpb24oaG9yaXopIHtcbiAgICAgIGlmIChob3JpeiA9PT0gXCJyXCIpIHtcbiAgICAgICAgYWRqdXN0ZWRMYXllcmluZyA9IF8ubWFwKGFkanVzdGVkTGF5ZXJpbmcsIGZ1bmN0aW9uKGlubmVyKSB7XG4gICAgICAgICAgcmV0dXJuIF8udmFsdWVzKGlubmVyKS5yZXZlcnNlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmVpZ2hib3JGbiA9ICh2ZXJ0ID09PSBcInVcIiA/IGcucHJlZGVjZXNzb3JzIDogZy5zdWNjZXNzb3JzKS5iaW5kKGcpO1xuICAgICAgdmFyIGFsaWduID0gdmVydGljYWxBbGlnbm1lbnQoZywgYWRqdXN0ZWRMYXllcmluZywgY29uZmxpY3RzLCBuZWlnaGJvckZuKTtcbiAgICAgIHZhciB4cyA9IGhvcml6b250YWxDb21wYWN0aW9uKGcsIGFkanVzdGVkTGF5ZXJpbmcsXG4gICAgICAgIGFsaWduLnJvb3QsIGFsaWduLmFsaWduLCBob3JpeiA9PT0gXCJyXCIpO1xuICAgICAgaWYgKGhvcml6ID09PSBcInJcIikge1xuICAgICAgICB4cyA9IF8ubWFwVmFsdWVzKHhzLCBmdW5jdGlvbih4KSB7IHJldHVybiAteDsgfSk7XG4gICAgICB9XG4gICAgICB4c3NbdmVydCArIGhvcml6XSA9IHhzO1xuICAgIH0pO1xuICB9KTtcblxuICB2YXIgc21hbGxlc3RXaWR0aCA9IGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50KGcsIHhzcyk7XG4gIGFsaWduQ29vcmRpbmF0ZXMoeHNzLCBzbWFsbGVzdFdpZHRoKTtcbiAgcmV0dXJuIGJhbGFuY2UoeHNzLCBnLmdyYXBoKCkuYWxpZ24pO1xufVxuXG5mdW5jdGlvbiBzZXAobm9kZVNlcCwgZWRnZVNlcCwgcmV2ZXJzZVNlcCkge1xuICByZXR1cm4gZnVuY3Rpb24oZywgdiwgdykge1xuICAgIHZhciB2TGFiZWwgPSBnLm5vZGUodik7XG4gICAgdmFyIHdMYWJlbCA9IGcubm9kZSh3KTtcbiAgICB2YXIgc3VtID0gMDtcbiAgICB2YXIgZGVsdGE7XG5cbiAgICBzdW0gKz0gdkxhYmVsLndpZHRoIC8gMjtcbiAgICBpZiAoXy5oYXModkxhYmVsLCBcImxhYmVscG9zXCIpKSB7XG4gICAgICBzd2l0Y2ggKHZMYWJlbC5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlIFwibFwiOiBkZWx0YSA9IC12TGFiZWwud2lkdGggLyAyOyBicmVhaztcbiAgICAgIGNhc2UgXCJyXCI6IGRlbHRhID0gdkxhYmVsLndpZHRoIC8gMjsgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWx0YSkge1xuICAgICAgc3VtICs9IHJldmVyc2VTZXAgPyBkZWx0YSA6IC1kZWx0YTtcbiAgICB9XG4gICAgZGVsdGEgPSAwO1xuXG4gICAgc3VtICs9ICh2TGFiZWwuZHVtbXkgPyBlZGdlU2VwIDogbm9kZVNlcCkgLyAyO1xuICAgIHN1bSArPSAod0xhYmVsLmR1bW15ID8gZWRnZVNlcCA6IG5vZGVTZXApIC8gMjtcblxuICAgIHN1bSArPSB3TGFiZWwud2lkdGggLyAyO1xuICAgIGlmIChfLmhhcyh3TGFiZWwsIFwibGFiZWxwb3NcIikpIHtcbiAgICAgIHN3aXRjaCAod0xhYmVsLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgXCJsXCI6IGRlbHRhID0gd0xhYmVsLndpZHRoIC8gMjsgYnJlYWs7XG4gICAgICBjYXNlIFwiclwiOiBkZWx0YSA9IC13TGFiZWwud2lkdGggLyAyOyBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbHRhKSB7XG4gICAgICBzdW0gKz0gcmV2ZXJzZVNlcCA/IGRlbHRhIDogLWRlbHRhO1xuICAgIH1cbiAgICBkZWx0YSA9IDA7XG5cbiAgICByZXR1cm4gc3VtO1xuICB9O1xufVxuXG5mdW5jdGlvbiB3aWR0aChnLCB2KSB7XG4gIHJldHVybiBnLm5vZGUodikud2lkdGg7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcbnZhciBwb3NpdGlvblggPSByZXF1aXJlKFwiLi9ia1wiKS5wb3NpdGlvblg7XG5cbm1vZHVsZS5leHBvcnRzID0gcG9zaXRpb247XG5cbmZ1bmN0aW9uIHBvc2l0aW9uKGcpIHtcbiAgZyA9IHV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpO1xuXG4gIHBvc2l0aW9uWShnKTtcbiAgXy5mb3JFYWNoKHBvc2l0aW9uWChnKSwgZnVuY3Rpb24oeCwgdikge1xuICAgIGcubm9kZSh2KS54ID0geDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBvc2l0aW9uWShnKSB7XG4gIHZhciBsYXllcmluZyA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcbiAgdmFyIHJhbmtTZXAgPSBnLmdyYXBoKCkucmFua3NlcDtcbiAgdmFyIHByZXZZID0gMDtcbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIHZhciBtYXhIZWlnaHQgPSBfLm1heChfLm1hcChsYXllciwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLmhlaWdodDsgfSkpO1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odikge1xuICAgICAgZy5ub2RlKHYpLnkgPSBwcmV2WSArIG1heEhlaWdodCAvIDI7XG4gICAgfSk7XG4gICAgcHJldlkgKz0gbWF4SGVpZ2h0ICsgcmFua1NlcDtcbiAgfSk7XG59XG5cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuR3JhcGg7XG52YXIgc2xhY2sgPSByZXF1aXJlKFwiLi91dGlsXCIpLnNsYWNrO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZlYXNpYmxlVHJlZTtcblxuLypcbiAqIENvbnN0cnVjdHMgYSBzcGFubmluZyB0cmVlIHdpdGggdGlnaHQgZWRnZXMgYW5kIGFkanVzdGVkIHRoZSBpbnB1dCBub2RlJ3NcbiAqIHJhbmtzIHRvIGFjaGlldmUgdGhpcy4gQSB0aWdodCBlZGdlIGlzIG9uZSB0aGF0IGlzIGhhcyBhIGxlbmd0aCB0aGF0IG1hdGNoZXNcbiAqIGl0cyBcIm1pbmxlblwiIGF0dHJpYnV0ZS5cbiAqXG4gKiBUaGUgYmFzaWMgc3RydWN0dXJlIGZvciB0aGlzIGZ1bmN0aW9uIGlzIGRlcml2ZWQgZnJvbSBHYW5zbmVyLCBldCBhbC4sIFwiQVxuICogVGVjaG5pcXVlIGZvciBEcmF3aW5nIERpcmVjdGVkIEdyYXBocy5cIlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEdyYXBoIG11c3QgYmUgYSBEQUcuXG4gKiAgICAyLiBHcmFwaCBtdXN0IGJlIGNvbm5lY3RlZC5cbiAqICAgIDMuIEdyYXBoIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbm9kZS5cbiAqICAgIDUuIEdyYXBoIG5vZGVzIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgYXNzaWduZWQgYSBcInJhbmtcIiBwcm9wZXJ0eSB0aGF0XG4gKiAgICAgICByZXNwZWN0cyB0aGUgXCJtaW5sZW5cIiBwcm9wZXJ0eSBvZiBpbmNpZGVudCBlZGdlcy5cbiAqICAgIDYuIEdyYXBoIGVkZ2VzIG11c3QgaGF2ZSBhIFwibWlubGVuXCIgcHJvcGVydHkuXG4gKlxuICogUG9zdC1jb25kaXRpb25zOlxuICpcbiAqICAgIC0gR3JhcGggbm9kZXMgd2lsbCBoYXZlIHRoZWlyIHJhbmsgYWRqdXN0ZWQgdG8gZW5zdXJlIHRoYXQgYWxsIGVkZ2VzIGFyZVxuICogICAgICB0aWdodC5cbiAqXG4gKiBSZXR1cm5zIGEgdHJlZSAodW5kaXJlY3RlZCBncmFwaCkgdGhhdCBpcyBjb25zdHJ1Y3RlZCB1c2luZyBvbmx5IFwidGlnaHRcIlxuICogZWRnZXMuXG4gKi9cbmZ1bmN0aW9uIGZlYXNpYmxlVHJlZShnKSB7XG4gIHZhciB0ID0gbmV3IEdyYXBoKHsgZGlyZWN0ZWQ6IGZhbHNlIH0pO1xuXG4gIC8vIENob29zZSBhcmJpdHJhcnkgbm9kZSBmcm9tIHdoaWNoIHRvIHN0YXJ0IG91ciB0cmVlXG4gIHZhciBzdGFydCA9IGcubm9kZXMoKVswXTtcbiAgdmFyIHNpemUgPSBnLm5vZGVDb3VudCgpO1xuICB0LnNldE5vZGUoc3RhcnQsIHt9KTtcblxuICB2YXIgZWRnZSwgZGVsdGE7XG4gIHdoaWxlICh0aWdodFRyZWUodCwgZykgPCBzaXplKSB7XG4gICAgZWRnZSA9IGZpbmRNaW5TbGFja0VkZ2UodCwgZyk7XG4gICAgZGVsdGEgPSB0Lmhhc05vZGUoZWRnZS52KSA/IHNsYWNrKGcsIGVkZ2UpIDogLXNsYWNrKGcsIGVkZ2UpO1xuICAgIHNoaWZ0UmFua3ModCwgZywgZGVsdGEpO1xuICB9XG5cbiAgcmV0dXJuIHQ7XG59XG5cbi8qXG4gKiBGaW5kcyBhIG1heGltYWwgdHJlZSBvZiB0aWdodCBlZGdlcyBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZVxuICogdHJlZS5cbiAqL1xuZnVuY3Rpb24gdGlnaHRUcmVlKHQsIGcpIHtcbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBfLmZvckVhY2goZy5ub2RlRWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHZhciBlZGdlViA9IGUudixcbiAgICAgICAgdyA9ICh2ID09PSBlZGdlVikgPyBlLncgOiBlZGdlVjtcbiAgICAgIGlmICghdC5oYXNOb2RlKHcpICYmICFzbGFjayhnLCBlKSkge1xuICAgICAgICB0LnNldE5vZGUodywge30pO1xuICAgICAgICB0LnNldEVkZ2Uodiwgdywge30pO1xuICAgICAgICBkZnModyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfLmZvckVhY2godC5ub2RlcygpLCBkZnMpO1xuICByZXR1cm4gdC5ub2RlQ291bnQoKTtcbn1cblxuLypcbiAqIEZpbmRzIHRoZSBlZGdlIHdpdGggdGhlIHNtYWxsZXN0IHNsYWNrIHRoYXQgaXMgaW5jaWRlbnQgb24gdHJlZSBhbmQgcmV0dXJuc1xuICogaXQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRNaW5TbGFja0VkZ2UodCwgZykge1xuICByZXR1cm4gXy5taW5CeShnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAodC5oYXNOb2RlKGUudikgIT09IHQuaGFzTm9kZShlLncpKSB7XG4gICAgICByZXR1cm4gc2xhY2soZywgZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2hpZnRSYW5rcyh0LCBnLCBkZWx0YSkge1xuICBfLmZvckVhY2godC5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgZy5ub2RlKHYpLnJhbmsgKz0gZGVsdGE7XG4gIH0pO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciByYW5rVXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgbG9uZ2VzdFBhdGggPSByYW5rVXRpbC5sb25nZXN0UGF0aDtcbnZhciBmZWFzaWJsZVRyZWUgPSByZXF1aXJlKFwiLi9mZWFzaWJsZS10cmVlXCIpO1xudmFyIG5ldHdvcmtTaW1wbGV4ID0gcmVxdWlyZShcIi4vbmV0d29yay1zaW1wbGV4XCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJhbms7XG5cbi8qXG4gKiBBc3NpZ25zIGEgcmFuayB0byBlYWNoIG5vZGUgaW4gdGhlIGlucHV0IGdyYXBoIHRoYXQgcmVzcGVjdHMgdGhlIFwibWlubGVuXCJcbiAqIGNvbnN0cmFpbnQgc3BlY2lmaWVkIG9uIGVkZ2VzIGJldHdlZW4gbm9kZXMuXG4gKlxuICogVGhpcyBiYXNpYyBzdHJ1Y3R1cmUgaXMgZGVyaXZlZCBmcm9tIEdhbnNuZXIsIGV0IGFsLiwgXCJBIFRlY2huaXF1ZSBmb3JcbiAqIERyYXdpbmcgRGlyZWN0ZWQgR3JhcGhzLlwiXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gR3JhcGggbXVzdCBiZSBhIGNvbm5lY3RlZCBEQUdcbiAqICAgIDIuIEdyYXBoIG5vZGVzIG11c3QgYmUgb2JqZWN0c1xuICogICAgMy4gR3JhcGggZWRnZXMgbXVzdCBoYXZlIFwid2VpZ2h0XCIgYW5kIFwibWlubGVuXCIgYXR0cmlidXRlc1xuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBub2RlcyB3aWxsIGhhdmUgYSBcInJhbmtcIiBhdHRyaWJ1dGUgYmFzZWQgb24gdGhlIHJlc3VsdHMgb2YgdGhlXG4gKiAgICAgICBhbGdvcml0aG0uIFJhbmtzIGNhbiBzdGFydCBhdCBhbnkgaW5kZXggKGluY2x1ZGluZyBuZWdhdGl2ZSksIHdlJ2xsXG4gKiAgICAgICBmaXggdGhlbSB1cCBsYXRlci5cbiAqL1xuZnVuY3Rpb24gcmFuayhnKSB7XG4gIHN3aXRjaChnLmdyYXBoKCkucmFua2VyKSB7XG4gIGNhc2UgXCJuZXR3b3JrLXNpbXBsZXhcIjogbmV0d29ya1NpbXBsZXhSYW5rZXIoZyk7IGJyZWFrO1xuICBjYXNlIFwidGlnaHQtdHJlZVwiOiB0aWdodFRyZWVSYW5rZXIoZyk7IGJyZWFrO1xuICBjYXNlIFwibG9uZ2VzdC1wYXRoXCI6IGxvbmdlc3RQYXRoUmFua2VyKGcpOyBicmVhaztcbiAgZGVmYXVsdDogbmV0d29ya1NpbXBsZXhSYW5rZXIoZyk7XG4gIH1cbn1cblxuLy8gQSBmYXN0IGFuZCBzaW1wbGUgcmFua2VyLCBidXQgcmVzdWx0cyBhcmUgZmFyIGZyb20gb3B0aW1hbC5cbnZhciBsb25nZXN0UGF0aFJhbmtlciA9IGxvbmdlc3RQYXRoO1xuXG5mdW5jdGlvbiB0aWdodFRyZWVSYW5rZXIoZykge1xuICBsb25nZXN0UGF0aChnKTtcbiAgZmVhc2libGVUcmVlKGcpO1xufVxuXG5mdW5jdGlvbiBuZXR3b3JrU2ltcGxleFJhbmtlcihnKSB7XG4gIG5ldHdvcmtTaW1wbGV4KGcpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBmZWFzaWJsZVRyZWUgPSByZXF1aXJlKFwiLi9mZWFzaWJsZS10cmVlXCIpO1xudmFyIHNsYWNrID0gcmVxdWlyZShcIi4vdXRpbFwiKS5zbGFjaztcbnZhciBpbml0UmFuayA9IHJlcXVpcmUoXCIuL3V0aWxcIikubG9uZ2VzdFBhdGg7XG52YXIgcHJlb3JkZXIgPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuYWxnLnByZW9yZGVyO1xudmFyIHBvc3RvcmRlciA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5hbGcucG9zdG9yZGVyO1xudmFyIHNpbXBsaWZ5ID0gcmVxdWlyZShcIi4uL3V0aWxcIikuc2ltcGxpZnk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV0d29ya1NpbXBsZXg7XG5cbi8vIEV4cG9zZSBzb21lIGludGVybmFscyBmb3IgdGVzdGluZyBwdXJwb3Nlc1xubmV0d29ya1NpbXBsZXguaW5pdExvd0xpbVZhbHVlcyA9IGluaXRMb3dMaW1WYWx1ZXM7XG5uZXR3b3JrU2ltcGxleC5pbml0Q3V0VmFsdWVzID0gaW5pdEN1dFZhbHVlcztcbm5ldHdvcmtTaW1wbGV4LmNhbGNDdXRWYWx1ZSA9IGNhbGNDdXRWYWx1ZTtcbm5ldHdvcmtTaW1wbGV4LmxlYXZlRWRnZSA9IGxlYXZlRWRnZTtcbm5ldHdvcmtTaW1wbGV4LmVudGVyRWRnZSA9IGVudGVyRWRnZTtcbm5ldHdvcmtTaW1wbGV4LmV4Y2hhbmdlRWRnZXMgPSBleGNoYW5nZUVkZ2VzO1xuXG4vKlxuICogVGhlIG5ldHdvcmsgc2ltcGxleCBhbGdvcml0aG0gYXNzaWducyByYW5rcyB0byBlYWNoIG5vZGUgaW4gdGhlIGlucHV0IGdyYXBoXG4gKiBhbmQgaXRlcmF0aXZlbHkgaW1wcm92ZXMgdGhlIHJhbmtpbmcgdG8gcmVkdWNlIHRoZSBsZW5ndGggb2YgZWRnZXMuXG4gKlxuICogUHJlY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBUaGUgaW5wdXQgZ3JhcGggbXVzdCBiZSBhIERBRy5cbiAqICAgIDIuIEFsbCBub2RlcyBpbiB0aGUgZ3JhcGggbXVzdCBoYXZlIGFuIG9iamVjdCB2YWx1ZS5cbiAqICAgIDMuIEFsbCBlZGdlcyBpbiB0aGUgZ3JhcGggbXVzdCBoYXZlIFwibWlubGVuXCIgYW5kIFwid2VpZ2h0XCIgYXR0cmlidXRlcy5cbiAqXG4gKiBQb3N0Y29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBBbGwgbm9kZXMgaW4gdGhlIGdyYXBoIHdpbGwgaGF2ZSBhbiBhc3NpZ25lZCBcInJhbmtcIiBhdHRyaWJ1dGUgdGhhdCBoYXNcbiAqICAgICAgIGJlZW4gb3B0aW1pemVkIGJ5IHRoZSBuZXR3b3JrIHNpbXBsZXggYWxnb3JpdGhtLiBSYW5rcyBzdGFydCBhdCAwLlxuICpcbiAqXG4gKiBBIHJvdWdoIHNrZXRjaCBvZiB0aGUgYWxnb3JpdGhtIGlzIGFzIGZvbGxvd3M6XG4gKlxuICogICAgMS4gQXNzaWduIGluaXRpYWwgcmFua3MgdG8gZWFjaCBub2RlLiBXZSB1c2UgdGhlIGxvbmdlc3QgcGF0aCBhbGdvcml0aG0sXG4gKiAgICAgICB3aGljaCBhc3NpZ25zIHJhbmtzIHRvIHRoZSBsb3dlc3QgcG9zaXRpb24gcG9zc2libGUuIEluIGdlbmVyYWwgdGhpc1xuICogICAgICAgbGVhZHMgdG8gdmVyeSB3aWRlIGJvdHRvbSByYW5rcyBhbmQgdW5uZWNlc3NhcmlseSBsb25nIGVkZ2VzLlxuICogICAgMi4gQ29uc3RydWN0IGEgZmVhc2libGUgdGlnaHQgdHJlZS4gQSB0aWdodCB0cmVlIGlzIG9uZSBzdWNoIHRoYXQgYWxsXG4gKiAgICAgICBlZGdlcyBpbiB0aGUgdHJlZSBoYXZlIG5vIHNsYWNrIChkaWZmZXJlbmNlIGJldHdlZW4gbGVuZ3RoIG9mIGVkZ2VcbiAqICAgICAgIGFuZCBtaW5sZW4gZm9yIHRoZSBlZGdlKS4gVGhpcyBieSBpdHNlbGYgZ3JlYXRseSBpbXByb3ZlcyB0aGUgYXNzaWduZWRcbiAqICAgICAgIHJhbmtpbmdzIGJ5IHNob3J0aW5nIGVkZ2VzLlxuICogICAgMy4gSXRlcmF0aXZlbHkgZmluZCBlZGdlcyB0aGF0IGhhdmUgbmVnYXRpdmUgY3V0IHZhbHVlcy4gR2VuZXJhbGx5IGFcbiAqICAgICAgIG5lZ2F0aXZlIGN1dCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZWRnZSBjb3VsZCBiZSByZW1vdmVkIGFuZCBhIG5ld1xuICogICAgICAgdHJlZSBlZGdlIGNvdWxkIGJlIGFkZGVkIHRvIHByb2R1Y2UgYSBtb3JlIGNvbXBhY3QgZ3JhcGguXG4gKlxuICogTXVjaCBvZiB0aGUgYWxnb3JpdGhtcyBoZXJlIGFyZSBkZXJpdmVkIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkEgVGVjaG5pcXVlXG4gKiBmb3IgRHJhd2luZyBEaXJlY3RlZCBHcmFwaHMuXCIgVGhlIHN0cnVjdHVyZSBvZiB0aGUgZmlsZSByb3VnaGx5IGZvbGxvd3MgdGhlXG4gKiBzdHJ1Y3R1cmUgb2YgdGhlIG92ZXJhbGwgYWxnb3JpdGhtLlxuICovXG5mdW5jdGlvbiBuZXR3b3JrU2ltcGxleChnKSB7XG4gIGcgPSBzaW1wbGlmeShnKTtcbiAgaW5pdFJhbmsoZyk7XG4gIHZhciB0ID0gZmVhc2libGVUcmVlKGcpO1xuICBpbml0TG93TGltVmFsdWVzKHQpO1xuICBpbml0Q3V0VmFsdWVzKHQsIGcpO1xuXG4gIHZhciBlLCBmO1xuICB3aGlsZSAoKGUgPSBsZWF2ZUVkZ2UodCkpKSB7XG4gICAgZiA9IGVudGVyRWRnZSh0LCBnLCBlKTtcbiAgICBleGNoYW5nZUVkZ2VzKHQsIGcsIGUsIGYpO1xuICB9XG59XG5cbi8qXG4gKiBJbml0aWFsaXplcyBjdXQgdmFsdWVzIGZvciBhbGwgZWRnZXMgaW4gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDdXRWYWx1ZXModCwgZykge1xuICB2YXIgdnMgPSBwb3N0b3JkZXIodCwgdC5ub2RlcygpKTtcbiAgdnMgPSB2cy5zbGljZSgwLCB2cy5sZW5ndGggLSAxKTtcbiAgXy5mb3JFYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgYXNzaWduQ3V0VmFsdWUodCwgZywgdik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25DdXRWYWx1ZSh0LCBnLCBjaGlsZCkge1xuICB2YXIgY2hpbGRMYWIgPSB0Lm5vZGUoY2hpbGQpO1xuICB2YXIgcGFyZW50ID0gY2hpbGRMYWIucGFyZW50O1xuICB0LmVkZ2UoY2hpbGQsIHBhcmVudCkuY3V0dmFsdWUgPSBjYWxjQ3V0VmFsdWUodCwgZywgY2hpbGQpO1xufVxuXG4vKlxuICogR2l2ZW4gdGhlIHRpZ2h0IHRyZWUsIGl0cyBncmFwaCwgYW5kIGEgY2hpbGQgaW4gdGhlIGdyYXBoIGNhbGN1bGF0ZSBhbmRcbiAqIHJldHVybiB0aGUgY3V0IHZhbHVlIGZvciB0aGUgZWRnZSBiZXR3ZWVuIHRoZSBjaGlsZCBhbmQgaXRzIHBhcmVudC5cbiAqL1xuZnVuY3Rpb24gY2FsY0N1dFZhbHVlKHQsIGcsIGNoaWxkKSB7XG4gIHZhciBjaGlsZExhYiA9IHQubm9kZShjaGlsZCk7XG4gIHZhciBwYXJlbnQgPSBjaGlsZExhYi5wYXJlbnQ7XG4gIC8vIFRydWUgaWYgdGhlIGNoaWxkIGlzIG9uIHRoZSB0YWlsIGVuZCBvZiB0aGUgZWRnZSBpbiB0aGUgZGlyZWN0ZWQgZ3JhcGhcbiAgdmFyIGNoaWxkSXNUYWlsID0gdHJ1ZTtcbiAgLy8gVGhlIGdyYXBoJ3MgdmlldyBvZiB0aGUgdHJlZSBlZGdlIHdlJ3JlIGluc3BlY3RpbmdcbiAgdmFyIGdyYXBoRWRnZSA9IGcuZWRnZShjaGlsZCwgcGFyZW50KTtcbiAgLy8gVGhlIGFjY3VtdWxhdGVkIGN1dCB2YWx1ZSBmb3IgdGhlIGVkZ2UgYmV0d2VlbiB0aGlzIG5vZGUgYW5kIGl0cyBwYXJlbnRcbiAgdmFyIGN1dFZhbHVlID0gMDtcblxuICBpZiAoIWdyYXBoRWRnZSkge1xuICAgIGNoaWxkSXNUYWlsID0gZmFsc2U7XG4gICAgZ3JhcGhFZGdlID0gZy5lZGdlKHBhcmVudCwgY2hpbGQpO1xuICB9XG5cbiAgY3V0VmFsdWUgPSBncmFwaEVkZ2Uud2VpZ2h0O1xuXG4gIF8uZm9yRWFjaChnLm5vZGVFZGdlcyhjaGlsZCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgaXNPdXRFZGdlID0gZS52ID09PSBjaGlsZCxcbiAgICAgIG90aGVyID0gaXNPdXRFZGdlID8gZS53IDogZS52O1xuXG4gICAgaWYgKG90aGVyICE9PSBwYXJlbnQpIHtcbiAgICAgIHZhciBwb2ludHNUb0hlYWQgPSBpc091dEVkZ2UgPT09IGNoaWxkSXNUYWlsLFxuICAgICAgICBvdGhlcldlaWdodCA9IGcuZWRnZShlKS53ZWlnaHQ7XG5cbiAgICAgIGN1dFZhbHVlICs9IHBvaW50c1RvSGVhZCA/IG90aGVyV2VpZ2h0IDogLW90aGVyV2VpZ2h0O1xuICAgICAgaWYgKGlzVHJlZUVkZ2UodCwgY2hpbGQsIG90aGVyKSkge1xuICAgICAgICB2YXIgb3RoZXJDdXRWYWx1ZSA9IHQuZWRnZShjaGlsZCwgb3RoZXIpLmN1dHZhbHVlO1xuICAgICAgICBjdXRWYWx1ZSArPSBwb2ludHNUb0hlYWQgPyAtb3RoZXJDdXRWYWx1ZSA6IG90aGVyQ3V0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY3V0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIGluaXRMb3dMaW1WYWx1ZXModHJlZSwgcm9vdCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICByb290ID0gdHJlZS5ub2RlcygpWzBdO1xuICB9XG4gIGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB7fSwgMSwgcm9vdCk7XG59XG5cbmZ1bmN0aW9uIGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB2aXNpdGVkLCBuZXh0TGltLCB2LCBwYXJlbnQpIHtcbiAgdmFyIGxvdyA9IG5leHRMaW07XG4gIHZhciBsYWJlbCA9IHRyZWUubm9kZSh2KTtcblxuICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgXy5mb3JFYWNoKHRyZWUubmVpZ2hib3JzKHYpLCBmdW5jdGlvbih3KSB7XG4gICAgaWYgKCFfLmhhcyh2aXNpdGVkLCB3KSkge1xuICAgICAgbmV4dExpbSA9IGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB2aXNpdGVkLCBuZXh0TGltLCB3LCB2KTtcbiAgICB9XG4gIH0pO1xuXG4gIGxhYmVsLmxvdyA9IGxvdztcbiAgbGFiZWwubGltID0gbmV4dExpbSsrO1xuICBpZiAocGFyZW50KSB7XG4gICAgbGFiZWwucGFyZW50ID0gcGFyZW50O1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE8gc2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlIHRoaXMgd2hlbiB3ZSBpbmNyZW1lbnRhbGx5IHVwZGF0ZSBsb3cgbGltXG4gICAgZGVsZXRlIGxhYmVsLnBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBuZXh0TGltO1xufVxuXG5mdW5jdGlvbiBsZWF2ZUVkZ2UodHJlZSkge1xuICByZXR1cm4gXy5maW5kKHRyZWUuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiB0cmVlLmVkZ2UoZSkuY3V0dmFsdWUgPCAwO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZW50ZXJFZGdlKHQsIGcsIGVkZ2UpIHtcbiAgdmFyIHYgPSBlZGdlLnY7XG4gIHZhciB3ID0gZWRnZS53O1xuXG4gIC8vIEZvciB0aGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uIHdlIGFzc3VtZSB0aGF0IHYgaXMgdGhlIHRhaWwgYW5kIHcgaXMgdGhlXG4gIC8vIGhlYWQsIHNvIGlmIHdlIGRvbid0IGhhdmUgdGhpcyBlZGdlIGluIHRoZSBncmFwaCB3ZSBzaG91bGQgZmxpcCBpdCB0b1xuICAvLyBtYXRjaCB0aGUgY29ycmVjdCBvcmllbnRhdGlvbi5cbiAgaWYgKCFnLmhhc0VkZ2UodiwgdykpIHtcbiAgICB2ID0gZWRnZS53O1xuICAgIHcgPSBlZGdlLnY7XG4gIH1cblxuICB2YXIgdkxhYmVsID0gdC5ub2RlKHYpO1xuICB2YXIgd0xhYmVsID0gdC5ub2RlKHcpO1xuICB2YXIgdGFpbExhYmVsID0gdkxhYmVsO1xuICB2YXIgZmxpcCA9IGZhbHNlO1xuXG4gIC8vIElmIHRoZSByb290IGlzIGluIHRoZSB0YWlsIG9mIHRoZSBlZGdlIHRoZW4gd2UgbmVlZCB0byBmbGlwIHRoZSBsb2dpYyB0aGF0XG4gIC8vIGNoZWNrcyBmb3IgdGhlIGhlYWQgYW5kIHRhaWwgbm9kZXMgaW4gdGhlIGNhbmRpZGF0ZXMgZnVuY3Rpb24gYmVsb3cuXG4gIGlmICh2TGFiZWwubGltID4gd0xhYmVsLmxpbSkge1xuICAgIHRhaWxMYWJlbCA9IHdMYWJlbDtcbiAgICBmbGlwID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBjYW5kaWRhdGVzID0gXy5maWx0ZXIoZy5lZGdlcygpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgcmV0dXJuIGZsaXAgPT09IGlzRGVzY2VuZGFudCh0LCB0Lm5vZGUoZWRnZS52KSwgdGFpbExhYmVsKSAmJlxuICAgICAgICAgICBmbGlwICE9PSBpc0Rlc2NlbmRhbnQodCwgdC5ub2RlKGVkZ2UudyksIHRhaWxMYWJlbCk7XG4gIH0pO1xuXG4gIHJldHVybiBfLm1pbkJ5KGNhbmRpZGF0ZXMsIGZ1bmN0aW9uKGVkZ2UpIHsgcmV0dXJuIHNsYWNrKGcsIGVkZ2UpOyB9KTtcbn1cblxuZnVuY3Rpb24gZXhjaGFuZ2VFZGdlcyh0LCBnLCBlLCBmKSB7XG4gIHZhciB2ID0gZS52O1xuICB2YXIgdyA9IGUudztcbiAgdC5yZW1vdmVFZGdlKHYsIHcpO1xuICB0LnNldEVkZ2UoZi52LCBmLncsIHt9KTtcbiAgaW5pdExvd0xpbVZhbHVlcyh0KTtcbiAgaW5pdEN1dFZhbHVlcyh0LCBnKTtcbiAgdXBkYXRlUmFua3ModCwgZyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJhbmtzKHQsIGcpIHtcbiAgdmFyIHJvb3QgPSBfLmZpbmQodC5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldHVybiAhZy5ub2RlKHYpLnBhcmVudDsgfSk7XG4gIHZhciB2cyA9IHByZW9yZGVyKHQsIHJvb3QpO1xuICB2cyA9IHZzLnNsaWNlKDEpO1xuICBfLmZvckVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgcGFyZW50ID0gdC5ub2RlKHYpLnBhcmVudCxcbiAgICAgIGVkZ2UgPSBnLmVkZ2UodiwgcGFyZW50KSxcbiAgICAgIGZsaXBwZWQgPSBmYWxzZTtcblxuICAgIGlmICghZWRnZSkge1xuICAgICAgZWRnZSA9IGcuZWRnZShwYXJlbnQsIHYpO1xuICAgICAgZmxpcHBlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZy5ub2RlKHYpLnJhbmsgPSBnLm5vZGUocGFyZW50KS5yYW5rICsgKGZsaXBwZWQgPyBlZGdlLm1pbmxlbiA6IC1lZGdlLm1pbmxlbik7XG4gIH0pO1xufVxuXG4vKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBlZGdlIGlzIGluIHRoZSB0cmVlLlxuICovXG5mdW5jdGlvbiBpc1RyZWVFZGdlKHRyZWUsIHUsIHYpIHtcbiAgcmV0dXJuIHRyZWUuaGFzRWRnZSh1LCB2KTtcbn1cblxuLypcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgZGVzY2VuZGFudCBvZiB0aGUgcm9vdCBub2RlIHBlciB0aGVcbiAqIGFzc2lnbmVkIGxvdyBhbmQgbGltIGF0dHJpYnV0ZXMgaW4gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIGlzRGVzY2VuZGFudCh0cmVlLCB2TGFiZWwsIHJvb3RMYWJlbCkge1xuICByZXR1cm4gcm9vdExhYmVsLmxvdyA8PSB2TGFiZWwubGltICYmIHZMYWJlbC5saW0gPD0gcm9vdExhYmVsLmxpbTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBsb25nZXN0UGF0aDogbG9uZ2VzdFBhdGgsXG4gIHNsYWNrOiBzbGFja1xufTtcblxuLypcbiAqIEluaXRpYWxpemVzIHJhbmtzIGZvciB0aGUgaW5wdXQgZ3JhcGggdXNpbmcgdGhlIGxvbmdlc3QgcGF0aCBhbGdvcml0aG0uIFRoaXNcbiAqIGFsZ29yaXRobSBzY2FsZXMgd2VsbCBhbmQgaXMgZmFzdCBpbiBwcmFjdGljZSwgaXQgeWllbGRzIHJhdGhlciBwb29yXG4gKiBzb2x1dGlvbnMuIE5vZGVzIGFyZSBwdXNoZWQgdG8gdGhlIGxvd2VzdCBsYXllciBwb3NzaWJsZSwgbGVhdmluZyB0aGUgYm90dG9tXG4gKiByYW5rcyB3aWRlIGFuZCBsZWF2aW5nIGVkZ2VzIGxvbmdlciB0aGFuIG5lY2Vzc2FyeS4gSG93ZXZlciwgZHVlIHRvIGl0c1xuICogc3BlZWQsIHRoaXMgYWxnb3JpdGhtIGlzIGdvb2QgZm9yIGdldHRpbmcgYW4gaW5pdGlhbCByYW5raW5nIHRoYXQgY2FuIGJlIGZlZFxuICogaW50byBvdGhlciBhbGdvcml0aG1zLlxuICpcbiAqIFRoaXMgYWxnb3JpdGhtIGRvZXMgbm90IG5vcm1hbGl6ZSBsYXllcnMgYmVjYXVzZSBpdCB3aWxsIGJlIHVzZWQgYnkgb3RoZXJcbiAqIGFsZ29yaXRobXMgaW4gbW9zdCBjYXNlcy4gSWYgdXNpbmcgdGhpcyBhbGdvcml0aG0gZGlyZWN0bHksIGJlIHN1cmUgdG9cbiAqIHJ1biBub3JtYWxpemUgYXQgdGhlIGVuZC5cbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBpcyBhIERBRy5cbiAqICAgIDIuIElucHV0IGdyYXBoIG5vZGUgbGFiZWxzIGNhbiBiZSBhc3NpZ25lZCBwcm9wZXJ0aWVzLlxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBFYWNoIG5vZGUgd2lsbCBiZSBhc3NpZ24gYW4gKHVubm9ybWFsaXplZCkgXCJyYW5rXCIgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGxvbmdlc3RQYXRoKGcpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIHZhciBsYWJlbCA9IGcubm9kZSh2KTtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHtcbiAgICAgIHJldHVybiBsYWJlbC5yYW5rO1xuICAgIH1cbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcblxuICAgIHZhciByYW5rID0gXy5taW4oXy5tYXAoZy5vdXRFZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuIGRmcyhlLncpIC0gZy5lZGdlKGUpLm1pbmxlbjtcbiAgICB9KSk7XG5cbiAgICBpZiAocmFuayA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIHx8IC8vIHJldHVybiB2YWx1ZSBvZiBfLm1hcChbXSkgZm9yIExvZGFzaCAzXG4gICAgICAgIHJhbmsgPT09IHVuZGVmaW5lZCB8fCAvLyByZXR1cm4gdmFsdWUgb2YgXy5tYXAoW10pIGZvciBMb2Rhc2ggNFxuICAgICAgICByYW5rID09PSBudWxsKSB7IC8vIHJldHVybiB2YWx1ZSBvZiBfLm1hcChbbnVsbF0pXG4gICAgICByYW5rID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gKGxhYmVsLnJhbmsgPSByYW5rKTtcbiAgfVxuXG4gIF8uZm9yRWFjaChnLnNvdXJjZXMoKSwgZGZzKTtcbn1cblxuLypcbiAqIFJldHVybnMgdGhlIGFtb3VudCBvZiBzbGFjayBmb3IgdGhlIGdpdmVuIGVkZ2UuIFRoZSBzbGFjayBpcyBkZWZpbmVkIGFzIHRoZVxuICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBsZW5ndGggb2YgdGhlIGVkZ2UgYW5kIGl0cyBtaW5pbXVtIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gc2xhY2soZywgZSkge1xuICByZXR1cm4gZy5ub2RlKGUudykucmFuayAtIGcubm9kZShlLnYpLnJhbmsgLSBnLmVkZ2UoZSkubWlubGVuO1xufVxuIiwiLyogZXNsaW50IFwibm8tY29uc29sZVwiOiBvZmYgKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4vZ3JhcGhsaWJcIikuR3JhcGg7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhZGREdW1teU5vZGU6IGFkZER1bW15Tm9kZSxcbiAgc2ltcGxpZnk6IHNpbXBsaWZ5LFxuICBhc05vbkNvbXBvdW5kR3JhcGg6IGFzTm9uQ29tcG91bmRHcmFwaCxcbiAgc3VjY2Vzc29yV2VpZ2h0czogc3VjY2Vzc29yV2VpZ2h0cyxcbiAgcHJlZGVjZXNzb3JXZWlnaHRzOiBwcmVkZWNlc3NvcldlaWdodHMsXG4gIGludGVyc2VjdFJlY3Q6IGludGVyc2VjdFJlY3QsXG4gIGJ1aWxkTGF5ZXJNYXRyaXg6IGJ1aWxkTGF5ZXJNYXRyaXgsXG4gIG5vcm1hbGl6ZVJhbmtzOiBub3JtYWxpemVSYW5rcyxcbiAgcmVtb3ZlRW1wdHlSYW5rczogcmVtb3ZlRW1wdHlSYW5rcyxcbiAgYWRkQm9yZGVyTm9kZTogYWRkQm9yZGVyTm9kZSxcbiAgbWF4UmFuazogbWF4UmFuayxcbiAgcGFydGl0aW9uOiBwYXJ0aXRpb24sXG4gIHRpbWU6IHRpbWUsXG4gIG5vdGltZTogbm90aW1lXG59O1xuXG4vKlxuICogQWRkcyBhIGR1bW15IG5vZGUgdG8gdGhlIGdyYXBoIGFuZCByZXR1cm4gdi5cbiAqL1xuZnVuY3Rpb24gYWRkRHVtbXlOb2RlKGcsIHR5cGUsIGF0dHJzLCBuYW1lKSB7XG4gIHZhciB2O1xuICBkbyB7XG4gICAgdiA9IF8udW5pcXVlSWQobmFtZSk7XG4gIH0gd2hpbGUgKGcuaGFzTm9kZSh2KSk7XG5cbiAgYXR0cnMuZHVtbXkgPSB0eXBlO1xuICBnLnNldE5vZGUodiwgYXR0cnMpO1xuICByZXR1cm4gdjtcbn1cblxuLypcbiAqIFJldHVybnMgYSBuZXcgZ3JhcGggd2l0aCBvbmx5IHNpbXBsZSBlZGdlcy4gSGFuZGxlcyBhZ2dyZWdhdGlvbiBvZiBkYXRhXG4gKiBhc3NvY2lhdGVkIHdpdGggbXVsdGktZWRnZXMuXG4gKi9cbmZ1bmN0aW9uIHNpbXBsaWZ5KGcpIHtcbiAgdmFyIHNpbXBsaWZpZWQgPSBuZXcgR3JhcGgoKS5zZXRHcmFwaChnLmdyYXBoKCkpO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHNpbXBsaWZpZWQuc2V0Tm9kZSh2LCBnLm5vZGUodikpOyB9KTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBzaW1wbGVMYWJlbCA9IHNpbXBsaWZpZWQuZWRnZShlLnYsIGUudykgfHwgeyB3ZWlnaHQ6IDAsIG1pbmxlbjogMSB9O1xuICAgIHZhciBsYWJlbCA9IGcuZWRnZShlKTtcbiAgICBzaW1wbGlmaWVkLnNldEVkZ2UoZS52LCBlLncsIHtcbiAgICAgIHdlaWdodDogc2ltcGxlTGFiZWwud2VpZ2h0ICsgbGFiZWwud2VpZ2h0LFxuICAgICAgbWlubGVuOiBNYXRoLm1heChzaW1wbGVMYWJlbC5taW5sZW4sIGxhYmVsLm1pbmxlbilcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBzaW1wbGlmaWVkO1xufVxuXG5mdW5jdGlvbiBhc05vbkNvbXBvdW5kR3JhcGgoZykge1xuICB2YXIgc2ltcGxpZmllZCA9IG5ldyBHcmFwaCh7IG11bHRpZ3JhcGg6IGcuaXNNdWx0aWdyYXBoKCkgfSkuc2V0R3JhcGgoZy5ncmFwaCgpKTtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGlmICghZy5jaGlsZHJlbih2KS5sZW5ndGgpIHtcbiAgICAgIHNpbXBsaWZpZWQuc2V0Tm9kZSh2LCBnLm5vZGUodikpO1xuICAgIH1cbiAgfSk7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBzaW1wbGlmaWVkLnNldEVkZ2UoZSwgZy5lZGdlKGUpKTtcbiAgfSk7XG4gIHJldHVybiBzaW1wbGlmaWVkO1xufVxuXG5mdW5jdGlvbiBzdWNjZXNzb3JXZWlnaHRzKGcpIHtcbiAgdmFyIHdlaWdodE1hcCA9IF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBzdWNzID0ge307XG4gICAgXy5mb3JFYWNoKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHN1Y3NbZS53XSA9IChzdWNzW2Uud10gfHwgMCkgKyBnLmVkZ2UoZSkud2VpZ2h0O1xuICAgIH0pO1xuICAgIHJldHVybiBzdWNzO1xuICB9KTtcbiAgcmV0dXJuIF8uemlwT2JqZWN0KGcubm9kZXMoKSwgd2VpZ2h0TWFwKTtcbn1cblxuZnVuY3Rpb24gcHJlZGVjZXNzb3JXZWlnaHRzKGcpIHtcbiAgdmFyIHdlaWdodE1hcCA9IF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBwcmVkcyA9IHt9O1xuICAgIF8uZm9yRWFjaChnLmluRWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHByZWRzW2Uudl0gPSAocHJlZHNbZS52XSB8fCAwKSArIGcuZWRnZShlKS53ZWlnaHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByZWRzO1xuICB9KTtcbiAgcmV0dXJuIF8uemlwT2JqZWN0KGcubm9kZXMoKSwgd2VpZ2h0TWFwKTtcbn1cblxuLypcbiAqIEZpbmRzIHdoZXJlIGEgbGluZSBzdGFydGluZyBhdCBwb2ludCAoe3gsIHl9KSB3b3VsZCBpbnRlcnNlY3QgYSByZWN0YW5nbGVcbiAqICh7eCwgeSwgd2lkdGgsIGhlaWdodH0pIGlmIGl0IHdlcmUgcG9pbnRpbmcgYXQgdGhlIHJlY3RhbmdsZSdzIGNlbnRlci5cbiAqL1xuZnVuY3Rpb24gaW50ZXJzZWN0UmVjdChyZWN0LCBwb2ludCkge1xuICB2YXIgeCA9IHJlY3QueDtcbiAgdmFyIHkgPSByZWN0Lnk7XG5cbiAgLy8gUmVjdGFuZ2xlIGludGVyc2VjdGlvbiBhbGdvcml0aG0gZnJvbTpcbiAgLy8gaHR0cDovL21hdGguc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzEwODExMy9maW5kLWVkZ2UtYmV0d2Vlbi10d28tYm94ZXNcbiAgdmFyIGR4ID0gcG9pbnQueCAtIHg7XG4gIHZhciBkeSA9IHBvaW50LnkgLSB5O1xuICB2YXIgdyA9IHJlY3Qud2lkdGggLyAyO1xuICB2YXIgaCA9IHJlY3QuaGVpZ2h0IC8gMjtcblxuICBpZiAoIWR4ICYmICFkeSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBwb3NzaWJsZSB0byBmaW5kIGludGVyc2VjdGlvbiBpbnNpZGUgb2YgdGhlIHJlY3RhbmdsZVwiKTtcbiAgfVxuXG4gIHZhciBzeCwgc3k7XG4gIGlmIChNYXRoLmFicyhkeSkgKiB3ID4gTWF0aC5hYnMoZHgpICogaCkge1xuICAgIC8vIEludGVyc2VjdGlvbiBpcyB0b3Agb3IgYm90dG9tIG9mIHJlY3QuXG4gICAgaWYgKGR5IDwgMCkge1xuICAgICAgaCA9IC1oO1xuICAgIH1cbiAgICBzeCA9IGggKiBkeCAvIGR5O1xuICAgIHN5ID0gaDtcbiAgfSBlbHNlIHtcbiAgICAvLyBJbnRlcnNlY3Rpb24gaXMgbGVmdCBvciByaWdodCBvZiByZWN0LlxuICAgIGlmIChkeCA8IDApIHtcbiAgICAgIHcgPSAtdztcbiAgICB9XG4gICAgc3ggPSB3O1xuICAgIHN5ID0gdyAqIGR5IC8gZHg7XG4gIH1cblxuICByZXR1cm4geyB4OiB4ICsgc3gsIHk6IHkgKyBzeSB9O1xufVxuXG4vKlxuICogR2l2ZW4gYSBEQUcgd2l0aCBlYWNoIG5vZGUgYXNzaWduZWQgXCJyYW5rXCIgYW5kIFwib3JkZXJcIiBwcm9wZXJ0aWVzLCB0aGlzXG4gKiBmdW5jdGlvbiB3aWxsIHByb2R1Y2UgYSBtYXRyaXggd2l0aCB0aGUgaWRzIG9mIGVhY2ggbm9kZS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRMYXllck1hdHJpeChnKSB7XG4gIHZhciBsYXllcmluZyA9IF8ubWFwKF8ucmFuZ2UobWF4UmFuayhnKSArIDEpLCBmdW5jdGlvbigpIHsgcmV0dXJuIFtdOyB9KTtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIHZhciByYW5rID0gbm9kZS5yYW5rO1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChyYW5rKSkge1xuICAgICAgbGF5ZXJpbmdbcmFua11bbm9kZS5vcmRlcl0gPSB2O1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsYXllcmluZztcbn1cblxuLypcbiAqIEFkanVzdHMgdGhlIHJhbmtzIGZvciBhbGwgbm9kZXMgaW4gdGhlIGdyYXBoIHN1Y2ggdGhhdCBhbGwgbm9kZXMgdiBoYXZlXG4gKiByYW5rKHYpID49IDAgYW5kIGF0IGxlYXN0IG9uZSBub2RlIHcgaGFzIHJhbmsodykgPSAwLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSYW5rcyhnKSB7XG4gIHZhciBtaW4gPSBfLm1pbihfLm1hcChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KSk7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBpZiAoXy5oYXMobm9kZSwgXCJyYW5rXCIpKSB7XG4gICAgICBub2RlLnJhbmsgLT0gbWluO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5UmFua3MoZykge1xuICAvLyBSYW5rcyBtYXkgbm90IHN0YXJ0IGF0IDAsIHNvIHdlIG5lZWQgdG8gb2Zmc2V0IHRoZW1cbiAgdmFyIG9mZnNldCA9IF8ubWluKF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLnJhbms7IH0pKTtcblxuICB2YXIgbGF5ZXJzID0gW107XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgcmFuayA9IGcubm9kZSh2KS5yYW5rIC0gb2Zmc2V0O1xuICAgIGlmICghbGF5ZXJzW3JhbmtdKSB7XG4gICAgICBsYXllcnNbcmFua10gPSBbXTtcbiAgICB9XG4gICAgbGF5ZXJzW3JhbmtdLnB1c2godik7XG4gIH0pO1xuXG4gIHZhciBkZWx0YSA9IDA7XG4gIHZhciBub2RlUmFua0ZhY3RvciA9IGcuZ3JhcGgoKS5ub2RlUmFua0ZhY3RvcjtcbiAgXy5mb3JFYWNoKGxheWVycywgZnVuY3Rpb24odnMsIGkpIHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh2cykgJiYgaSAlIG5vZGVSYW5rRmFjdG9yICE9PSAwKSB7XG4gICAgICAtLWRlbHRhO1xuICAgIH0gZWxzZSBpZiAoZGVsdGEpIHtcbiAgICAgIF8uZm9yRWFjaCh2cywgZnVuY3Rpb24odikgeyBnLm5vZGUodikucmFuayArPSBkZWx0YTsgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkQm9yZGVyTm9kZShnLCBwcmVmaXgsIHJhbmssIG9yZGVyKSB7XG4gIHZhciBub2RlID0ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9O1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSB7XG4gICAgbm9kZS5yYW5rID0gcmFuaztcbiAgICBub2RlLm9yZGVyID0gb3JkZXI7XG4gIH1cbiAgcmV0dXJuIGFkZER1bW15Tm9kZShnLCBcImJvcmRlclwiLCBub2RlLCBwcmVmaXgpO1xufVxuXG5mdW5jdGlvbiBtYXhSYW5rKGcpIHtcbiAgcmV0dXJuIF8ubWF4KF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciByYW5rID0gZy5ub2RlKHYpLnJhbms7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHJhbmspKSB7XG4gICAgICByZXR1cm4gcmFuaztcbiAgICB9XG4gIH0pKTtcbn1cblxuLypcbiAqIFBhcnRpdGlvbiBhIGNvbGxlY3Rpb24gaW50byB0d28gZ3JvdXBzOiBgbGhzYCBhbmQgYHJoc2AuIElmIHRoZSBzdXBwbGllZFxuICogZnVuY3Rpb24gcmV0dXJucyB0cnVlIGZvciBhbiBlbnRyeSBpdCBnb2VzIGludG8gYGxoc2AuIE90aGVyd2lzZSBpdCBnb2VzXG4gKiBpbnRvIGByaHMuXG4gKi9cbmZ1bmN0aW9uIHBhcnRpdGlvbihjb2xsZWN0aW9uLCBmbikge1xuICB2YXIgcmVzdWx0ID0geyBsaHM6IFtdLCByaHM6IFtdIH07XG4gIF8uZm9yRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmIChmbih2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdC5saHMucHVzaCh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5yaHMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLypcbiAqIFJldHVybnMgYSBuZXcgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZm5gIHdpdGggYSB0aW1lci4gVGhlIHdyYXBwZXIgbG9ncyB0aGVcbiAqIHRpbWUgaXQgdGFrZXMgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHRpbWUobmFtZSwgZm4pIHtcbiAgdmFyIHN0YXJ0ID0gXy5ub3coKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjb25zb2xlLmxvZyhuYW1lICsgXCIgdGltZTogXCIgKyAoXy5ub3coKSAtIHN0YXJ0KSArIFwibXNcIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm90aW1lKG5hbWUsIGZuKSB7XG4gIHJldHVybiBmbigpO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjAuOC41XCI7XG4iLCIvKipcbiAqIEEgc2ltcGxlIGRlcGVuZGVuY3kgZ3JhcGhcbiAqL1xuXG4vKipcbiAqIEhlbHBlciBmb3IgY3JlYXRpbmcgYSBUb3BvbG9naWNhbCBTb3J0IHVzaW5nIERlcHRoLUZpcnN0LVNlYXJjaCBvbiBhIHNldCBvZiBlZGdlcy5cbiAqXG4gKiBEZXRlY3RzIGN5Y2xlcyBhbmQgdGhyb3dzIGFuIEVycm9yIGlmIG9uZSBpcyBkZXRlY3RlZCAodW5sZXNzIHRoZSBcImNpcmN1bGFyXCJcbiAqIHBhcmFtZXRlciBpcyBcInRydWVcIiBpbiB3aGljaCBjYXNlIGl0IGlnbm9yZXMgdGhlbSkuXG4gKlxuICogQHBhcmFtIGVkZ2VzIFRoZSBzZXQgb2YgZWRnZXMgdG8gREZTIHRocm91Z2hcbiAqIEBwYXJhbSBsZWF2ZXNPbmx5IFdoZXRoZXIgdG8gb25seSByZXR1cm4gXCJsZWFmXCIgbm9kZXMgKG9uZXMgd2hvIGhhdmUgbm8gZWRnZXMpXG4gKiBAcGFyYW0gcmVzdWx0IEFuIGFycmF5IGluIHdoaWNoIHRoZSByZXN1bHRzIHdpbGwgYmUgcG9wdWxhdGVkXG4gKiBAcGFyYW0gY2lyY3VsYXIgQSBib29sZWFuIHRvIGFsbG93IGNpcmN1bGFyIGRlcGVuZGVuY2llc1xuICovXG5mdW5jdGlvbiBjcmVhdGVERlMoZWRnZXMsIGxlYXZlc09ubHksIHJlc3VsdCwgY2lyY3VsYXIpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzdGFydCkge1xuICAgIGlmICh2aXNpdGVkW3N0YXJ0XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW5DdXJyZW50UGF0aCA9IHt9O1xuICAgIHZhciBjdXJyZW50UGF0aCA9IFtdO1xuICAgIHZhciB0b2RvID0gW107IC8vIHVzZWQgYXMgYSBzdGFja1xuICAgIHRvZG8ucHVzaCh7IG5vZGU6IHN0YXJ0LCBwcm9jZXNzZWQ6IGZhbHNlIH0pO1xuICAgIHdoaWxlICh0b2RvLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBjdXJyZW50ID0gdG9kb1t0b2RvLmxlbmd0aCAtIDFdOyAvLyBwZWVrIGF0IHRoZSB0b2RvIHN0YWNrXG4gICAgICB2YXIgcHJvY2Vzc2VkID0gY3VycmVudC5wcm9jZXNzZWQ7XG4gICAgICB2YXIgbm9kZSA9IGN1cnJlbnQubm9kZTtcbiAgICAgIGlmICghcHJvY2Vzc2VkKSB7XG4gICAgICAgIC8vIEhhdmVuJ3QgdmlzaXRlZCBlZGdlcyB5ZXQgKHZpc2l0aW5nIHBoYXNlKVxuICAgICAgICBpZiAodmlzaXRlZFtub2RlXSkge1xuICAgICAgICAgIHRvZG8ucG9wKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5DdXJyZW50UGF0aFtub2RlXSkge1xuICAgICAgICAgIC8vIEl0J3Mgbm90IGEgREFHXG4gICAgICAgICAgaWYgKGNpcmN1bGFyKSB7XG4gICAgICAgICAgICB0b2RvLnBvcCgpO1xuICAgICAgICAgICAgLy8gSWYgd2UncmUgdG9sZXJhdGluZyBjeWNsZXMsIGRvbid0IHJldmlzaXQgdGhlIG5vZGVcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50UGF0aC5wdXNoKG5vZGUpO1xuICAgICAgICAgIHRocm93IG5ldyBEZXBHcmFwaEN5Y2xlRXJyb3IoY3VycmVudFBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5DdXJyZW50UGF0aFtub2RlXSA9IHRydWU7XG4gICAgICAgIGN1cnJlbnRQYXRoLnB1c2gobm9kZSk7XG4gICAgICAgIHZhciBub2RlRWRnZXMgPSBlZGdlc1tub2RlXTtcbiAgICAgICAgLy8gKHB1c2ggZWRnZXMgb250byB0aGUgdG9kbyBzdGFjayBpbiByZXZlcnNlIG9yZGVyIHRvIGJlIG9yZGVyLWNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIERGUyBpbXBsZW1lbnRhdGlvbilcbiAgICAgICAgZm9yICh2YXIgaSA9IG5vZGVFZGdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRvZG8ucHVzaCh7IG5vZGU6IG5vZGVFZGdlc1tpXSwgcHJvY2Vzc2VkOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LnByb2Nlc3NlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYXZlIHZpc2l0ZWQgZWRnZXMgKHN0YWNrIHVucm9sbGluZyBwaGFzZSlcbiAgICAgICAgdG9kby5wb3AoKTtcbiAgICAgICAgY3VycmVudFBhdGgucG9wKCk7XG4gICAgICAgIGluQ3VycmVudFBhdGhbbm9kZV0gPSBmYWxzZTtcbiAgICAgICAgdmlzaXRlZFtub2RlXSA9IHRydWU7XG4gICAgICAgIGlmICghbGVhdmVzT25seSB8fCBlZGdlc1tub2RlXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgRGVwZW5kZW5jeSBHcmFwaFxuICovXG52YXIgRGVwR3JhcGggPSAoZXhwb3J0cy5EZXBHcmFwaCA9IGZ1bmN0aW9uIERlcEdyYXBoKG9wdHMpIHtcbiAgdGhpcy5ub2RlcyA9IHt9OyAvLyBOb2RlIC0+IE5vZGUvRGF0YSAodHJlYXRlZCBsaWtlIGEgU2V0KVxuICB0aGlzLm91dGdvaW5nRWRnZXMgPSB7fTsgLy8gTm9kZSAtPiBbRGVwZW5kZW5jeSBOb2RlXVxuICB0aGlzLmluY29taW5nRWRnZXMgPSB7fTsgLy8gTm9kZSAtPiBbRGVwZW5kYW50IE5vZGVdXG4gIHRoaXMuY2lyY3VsYXIgPSBvcHRzICYmICEhb3B0cy5jaXJjdWxhcjsgLy8gQWxsb3dzIGNpcmN1bGFyIGRlcHNcbn0pO1xuRGVwR3JhcGgucHJvdG90eXBlID0ge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBzaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMubm9kZXMpLmxlbmd0aDtcbiAgfSxcbiAgLyoqXG4gICAqIEFkZCBhIG5vZGUgdG8gdGhlIGRlcGVuZGVuY3kgZ3JhcGguIElmIGEgbm9kZSBhbHJlYWR5IGV4aXN0cywgdGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nLlxuICAgKi9cbiAgYWRkTm9kZTogZnVuY3Rpb24gKG5vZGUsIGRhdGEpIHtcbiAgICBpZiAoIXRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgLy8gQ2hlY2tpbmcgdGhlIGFyZ3VtZW50cyBsZW5ndGggYWxsb3dzIHRoZSB1c2VyIHRvIGFkZCBhIG5vZGUgd2l0aCB1bmRlZmluZWQgZGF0YVxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgdGhpcy5ub2Rlc1tub2RlXSA9IGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm5vZGVzW25vZGVdID0gbm9kZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3V0Z29pbmdFZGdlc1tub2RlXSA9IFtdO1xuICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzW25vZGVdID0gW107XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogUmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSBkZXBlbmRlbmN5IGdyYXBoLiBJZiBhIG5vZGUgZG9lcyBub3QgZXhpc3QsIHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZy5cbiAgICovXG4gIHJlbW92ZU5vZGU6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgZGVsZXRlIHRoaXMubm9kZXNbbm9kZV07XG4gICAgICBkZWxldGUgdGhpcy5vdXRnb2luZ0VkZ2VzW25vZGVdO1xuICAgICAgZGVsZXRlIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXTtcbiAgICAgIFt0aGlzLmluY29taW5nRWRnZXMsIHRoaXMub3V0Z29pbmdFZGdlc10uZm9yRWFjaChmdW5jdGlvbiAoZWRnZUxpc3QpIHtcbiAgICAgICAgT2JqZWN0LmtleXMoZWRnZUxpc3QpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHZhciBpZHggPSBlZGdlTGlzdFtrZXldLmluZGV4T2Yobm9kZSk7XG4gICAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgICBlZGdlTGlzdFtrZXldLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG5vZGUgZXhpc3RzIGluIHRoZSBncmFwaFxuICAgKi9cbiAgaGFzTm9kZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlKTtcbiAgfSxcbiAgLyoqXG4gICAqIEdldCB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBub2RlIG5hbWVcbiAgICovXG4gIGdldE5vZGVEYXRhOiBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzW25vZGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFNldCB0aGUgYXNzb2NpYXRlZCBkYXRhIGZvciBhIGdpdmVuIG5vZGUgbmFtZS4gSWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QsIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJyb3JcbiAgICovXG4gIHNldE5vZGVEYXRhOiBmdW5jdGlvbiAobm9kZSwgZGF0YSkge1xuICAgIGlmICh0aGlzLmhhc05vZGUobm9kZSkpIHtcbiAgICAgIHRoaXMubm9kZXNbbm9kZV0gPSBkYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEFkZCBhIGRlcGVuZGVuY3kgYmV0d2VlbiB0d28gbm9kZXMuIElmIGVpdGhlciBvZiB0aGUgbm9kZXMgZG9lcyBub3QgZXhpc3QsXG4gICAqIGFuIEVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKi9cbiAgYWRkRGVwZW5kZW5jeTogZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gICAgaWYgKCF0aGlzLmhhc05vZGUoZnJvbSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGUgZG9lcyBub3QgZXhpc3Q6IFwiICsgZnJvbSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNOb2RlKHRvKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyB0byk7XG4gICAgfVxuICAgIGlmICh0aGlzLm91dGdvaW5nRWRnZXNbZnJvbV0uaW5kZXhPZih0bykgPT09IC0xKSB7XG4gICAgICB0aGlzLm91dGdvaW5nRWRnZXNbZnJvbV0ucHVzaCh0byk7XG4gICAgfVxuICAgIGlmICh0aGlzLmluY29taW5nRWRnZXNbdG9dLmluZGV4T2YoZnJvbSkgPT09IC0xKSB7XG4gICAgICB0aGlzLmluY29taW5nRWRnZXNbdG9dLnB1c2goZnJvbSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKipcbiAgICogUmVtb3ZlIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHR3byBub2Rlcy5cbiAgICovXG4gIHJlbW92ZURlcGVuZGVuY3k6IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgIHZhciBpZHg7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShmcm9tKSkge1xuICAgICAgaWR4ID0gdGhpcy5vdXRnb2luZ0VkZ2VzW2Zyb21dLmluZGV4T2YodG8pO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHRoaXMub3V0Z29pbmdFZGdlc1tmcm9tXS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNOb2RlKHRvKSkge1xuICAgICAgaWR4ID0gdGhpcy5pbmNvbWluZ0VkZ2VzW3RvXS5pbmRleE9mKGZyb20pO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHRoaXMuaW5jb21pbmdFZGdlc1t0b10uc3BsaWNlKGlkeCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogUmV0dXJuIGEgY2xvbmUgb2YgdGhlIGRlcGVuZGVuY3kgZ3JhcGguIElmIGFueSBjdXN0b20gZGF0YSBpcyBhdHRhY2hlZFxuICAgKiB0byB0aGUgbm9kZXMsIGl0IHdpbGwgb25seSBiZSBzaGFsbG93IGNvcGllZC5cbiAgICovXG4gIGNsb25lOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHRoaXM7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBEZXBHcmFwaCgpO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoc291cmNlLm5vZGVzKTtcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJlc3VsdC5ub2Rlc1tuXSA9IHNvdXJjZS5ub2Rlc1tuXTtcbiAgICAgIHJlc3VsdC5vdXRnb2luZ0VkZ2VzW25dID0gc291cmNlLm91dGdvaW5nRWRnZXNbbl0uc2xpY2UoMCk7XG4gICAgICByZXN1bHQuaW5jb21pbmdFZGdlc1tuXSA9IHNvdXJjZS5pbmNvbWluZ0VkZ2VzW25dLnNsaWNlKDApO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZGlyZWN0IGRlcGVuZGVuY2llcyBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqL1xuICBkaXJlY3REZXBlbmRlbmNpZXNPZjogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAodGhpcy5oYXNOb2RlKG5vZGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5vdXRnb2luZ0VkZ2VzW25vZGVdLnNsaWNlKDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGV4aXN0OiBcIiArIG5vZGUpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBjb250YWluaW5nIHRoZSBub2RlcyB0aGF0IGRpcmVjdGx5IGRlcGVuZCBvbiB0aGUgc3BlY2lmaWVkIG5vZGUuXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqL1xuICBkaXJlY3REZXBlbmRhbnRzT2Y6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5jb21pbmdFZGdlc1tub2RlXS5zbGljZSgwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbm9kZXMgdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgZGVwZW5kcyBvbiAodHJhbnNpdGl2ZWx5KS5cbiAgICpcbiAgICogVGhyb3dzIGFuIEVycm9yIGlmIHRoZSBncmFwaCBoYXMgYSBjeWNsZSwgb3IgdGhlIHNwZWNpZmllZCBub2RlIGRvZXMgbm90IGV4aXN0LlxuICAgKlxuICAgKiBJZiBgbGVhdmVzT25seWAgaXMgdHJ1ZSwgb25seSBub2RlcyB0aGF0IGRvIG5vdCBkZXBlbmQgb24gYW55IG90aGVyIG5vZGVzIHdpbGwgYmUgcmV0dXJuZWRcbiAgICogaW4gdGhlIGFycmF5LlxuICAgKi9cbiAgZGVwZW5kZW5jaWVzT2Y6IGZ1bmN0aW9uIChub2RlLCBsZWF2ZXNPbmx5KSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgdmFyIERGUyA9IGNyZWF0ZURGUyhcbiAgICAgICAgdGhpcy5vdXRnb2luZ0VkZ2VzLFxuICAgICAgICBsZWF2ZXNPbmx5LFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHRoaXMuY2lyY3VsYXJcbiAgICAgICk7XG4gICAgICBERlMobm9kZSk7XG4gICAgICB2YXIgaWR4ID0gcmVzdWx0LmluZGV4T2Yobm9kZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgcmVzdWx0LnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBnZXQgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbm9kZXMgdGhhdCBkZXBlbmQgb24gdGhlIHNwZWNpZmllZCBub2RlICh0cmFuc2l0aXZlbHkpLlxuICAgKlxuICAgKiBUaHJvd3MgYW4gRXJyb3IgaWYgdGhlIGdyYXBoIGhhcyBhIGN5Y2xlLCBvciB0aGUgc3BlY2lmaWVkIG5vZGUgZG9lcyBub3QgZXhpc3QuXG4gICAqXG4gICAqIElmIGBsZWF2ZXNPbmx5YCBpcyB0cnVlLCBvbmx5IG5vZGVzIHRoYXQgZG8gbm90IGhhdmUgYW55IGRlcGVuZGFudHMgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgYXJyYXkuXG4gICAqL1xuICBkZXBlbmRhbnRzT2Y6IGZ1bmN0aW9uIChub2RlLCBsZWF2ZXNPbmx5KSB7XG4gICAgaWYgKHRoaXMuaGFzTm9kZShub2RlKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgdmFyIERGUyA9IGNyZWF0ZURGUyhcbiAgICAgICAgdGhpcy5pbmNvbWluZ0VkZ2VzLFxuICAgICAgICBsZWF2ZXNPbmx5LFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHRoaXMuY2lyY3VsYXJcbiAgICAgICk7XG4gICAgICBERlMobm9kZSk7XG4gICAgICB2YXIgaWR4ID0gcmVzdWx0LmluZGV4T2Yobm9kZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgcmVzdWx0LnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBleGlzdDogXCIgKyBub2RlKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgdGhlIG92ZXJhbGwgcHJvY2Vzc2luZyBvcmRlciBmb3IgdGhlIGRlcGVuZGVuY3kgZ3JhcGguXG4gICAqXG4gICAqIFRocm93cyBhbiBFcnJvciBpZiB0aGUgZ3JhcGggaGFzIGEgY3ljbGUuXG4gICAqXG4gICAqIElmIGBsZWF2ZXNPbmx5YCBpcyB0cnVlLCBvbmx5IG5vZGVzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBhbnkgb3RoZXIgbm9kZXMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICovXG4gIG92ZXJhbGxPcmRlcjogZnVuY3Rpb24gKGxlYXZlc09ubHkpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGhpcy5ub2Rlcyk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0OyAvLyBFbXB0eSBncmFwaFxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMuY2lyY3VsYXIpIHtcbiAgICAgICAgLy8gTG9vayBmb3IgY3ljbGVzIC0gd2UgcnVuIHRoZSBERlMgc3RhcnRpbmcgYXQgYWxsIHRoZSBub2RlcyBpbiBjYXNlIHRoZXJlXG4gICAgICAgIC8vIGFyZSBzZXZlcmFsIGRpc2Nvbm5lY3RlZCBzdWJncmFwaHMgaW5zaWRlIHRoaXMgZGVwZW5kZW5jeSBncmFwaC5cbiAgICAgICAgdmFyIEN5Y2xlREZTID0gY3JlYXRlREZTKHRoaXMub3V0Z29pbmdFZGdlcywgZmFsc2UsIFtdLCB0aGlzLmNpcmN1bGFyKTtcbiAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgQ3ljbGVERlMobik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgREZTID0gY3JlYXRlREZTKFxuICAgICAgICB0aGlzLm91dGdvaW5nRWRnZXMsXG4gICAgICAgIGxlYXZlc09ubHksXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgdGhpcy5jaXJjdWxhclxuICAgICAgKTtcbiAgICAgIC8vIEZpbmQgYWxsIHBvdGVudGlhbCBzdGFydGluZyBwb2ludHMgKG5vZGVzIHdpdGggbm90aGluZyBkZXBlbmRpbmcgb24gdGhlbSkgYW5cbiAgICAgIC8vIHJ1biBhIERGUyBzdGFydGluZyBhdCB0aGVzZSBwb2ludHMgdG8gZ2V0IHRoZSBvcmRlclxuICAgICAga2V5c1xuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuaW5jb21pbmdFZGdlc1tub2RlXS5sZW5ndGggPT09IDA7XG4gICAgICAgIH0pXG4gICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgREZTKG4pO1xuICAgICAgICB9KTtcblxuICAgICAgLy8gSWYgd2UncmUgYWxsb3dpbmcgY3ljbGVzIC0gd2UgbmVlZCB0byBydW4gdGhlIERGUyBhZ2FpbnN0IGFueSByZW1haW5pbmdcbiAgICAgIC8vIG5vZGVzIHRoYXQgZGlkIG5vdCBlbmQgdXAgaW4gdGhlIGluaXRpYWwgcmVzdWx0IChhcyB0aGV5IGFyZSBwYXJ0IG9mIGFcbiAgICAgIC8vIHN1YmdyYXBoIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGNsZWFyIHN0YXJ0aW5nIHBvaW50KVxuICAgICAgaWYgKHRoaXMuY2lyY3VsYXIpIHtcbiAgICAgICAga2V5c1xuICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuaW5kZXhPZihub2RlKSA9PT0gLTE7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgREZTKG4pO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiBub2RlcyB0aGF0IGhhdmUgbm8gZGVwZW5kYW50cyAoaS5lLiBub3RoaW5nIGRlcGVuZHMgb24gdGhlbSkuXG4gICAqL1xuICBlbnRyeU5vZGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLm5vZGVzKS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBzZWxmLmluY29taW5nRWRnZXNbbm9kZV0ubGVuZ3RoID09PSAwO1xuICAgIH0pO1xuICB9XG59O1xuXG4vLyBDcmVhdGUgc29tZSBhbGlhc2VzXG5EZXBHcmFwaC5wcm90b3R5cGUuZGlyZWN0RGVwZW5kZW50c09mID0gRGVwR3JhcGgucHJvdG90eXBlLmRpcmVjdERlcGVuZGFudHNPZjtcbkRlcEdyYXBoLnByb3RvdHlwZS5kZXBlbmRlbnRzT2YgPSBEZXBHcmFwaC5wcm90b3R5cGUuZGVwZW5kYW50c09mO1xuXG4vKipcbiAqIEN5Y2xlIGVycm9yLCBpbmNsdWRpbmcgdGhlIHBhdGggb2YgdGhlIGN5Y2xlLlxuICovXG52YXIgRGVwR3JhcGhDeWNsZUVycm9yID0gKGV4cG9ydHMuRGVwR3JhcGhDeWNsZUVycm9yID0gZnVuY3Rpb24gKGN5Y2xlUGF0aCkge1xuICB2YXIgbWVzc2FnZSA9IFwiRGVwZW5kZW5jeSBDeWNsZSBGb3VuZDogXCIgKyBjeWNsZVBhdGguam9pbihcIiAtPiBcIik7XG4gIHZhciBpbnN0YW5jZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgaW5zdGFuY2UuY3ljbGVQYXRoID0gY3ljbGVQYXRoO1xuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoaW5zdGFuY2UsIE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSk7XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGluc3RhbmNlLCBEZXBHcmFwaEN5Y2xlRXJyb3IpO1xuICB9XG4gIHJldHVybiBpbnN0YW5jZTtcbn0pO1xuRGVwR3JhcGhDeWNsZUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlLCB7XG4gIGNvbnN0cnVjdG9yOiB7XG4gICAgdmFsdWU6IEVycm9yLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KTtcbk9iamVjdC5zZXRQcm90b3R5cGVPZihEZXBHcmFwaEN5Y2xlRXJyb3IsIEVycm9yKTtcbiIsIi8qKlxuICogaW5zcGlyZWQgYnkgaXMtbnVtYmVyIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1udW1iZXI+XG4gKiBidXQgc2lnbmlmaWNhbnRseSBzaW1wbGlmaWVkIGFuZCBzcGVkIHVwIGJ5IGlnbm9yaW5nIG51bWJlciBhbmQgc3RyaW5nIGNvbnN0cnVjdG9yc1xuICogaWUgdGhlc2UgcmV0dXJuIGZhbHNlOlxuICogICBuZXcgTnVtYmVyKDEpXG4gKiAgIG5ldyBTdHJpbmcoJzEnKVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGFsbEJsYW5rQ2hhckNvZGVzID0gcmVxdWlyZSgnaXMtc3RyaW5nLWJsYW5rJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obikge1xuICAgIHZhciB0eXBlID0gdHlwZW9mIG47XG4gICAgaWYodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsID0gbjtcbiAgICAgICAgbiA9ICtuO1xuICAgICAgICAvLyB3aGl0ZXNwYWNlIHN0cmluZ3MgY2FzdCB0byB6ZXJvIC0gZmlsdGVyIHRoZW0gb3V0XG4gICAgICAgIGlmKG49PT0wICYmIGFsbEJsYW5rQ2hhckNvZGVzKG9yaWdpbmFsKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmKHR5cGUgIT09ICdudW1iZXInKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gbiAtIG4gPCAxO1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LCBDaHJpcyBQZXR0aXR0XG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xuICogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXRcbiAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcbiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFXG4gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1JcbiAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSXG4gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxudmFyIGxpYiA9IHJlcXVpcmUoXCIuL2xpYlwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEdyYXBoOiBsaWIuR3JhcGgsXG4gIGpzb246IHJlcXVpcmUoXCIuL2xpYi9qc29uXCIpLFxuICBhbGc6IHJlcXVpcmUoXCIuL2xpYi9hbGdcIiksXG4gIHZlcnNpb246IGxpYi52ZXJzaW9uXG59O1xuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBvbmVudHM7XG5cbmZ1bmN0aW9uIGNvbXBvbmVudHMoZykge1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuICB2YXIgY21wdHMgPSBbXTtcbiAgdmFyIGNtcHQ7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHJldHVybjtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICBjbXB0LnB1c2godik7XG4gICAgXy5lYWNoKGcuc3VjY2Vzc29ycyh2KSwgZGZzKTtcbiAgICBfLmVhY2goZy5wcmVkZWNlc3NvcnModiksIGRmcyk7XG4gIH1cblxuICBfLmVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgY21wdCA9IFtdO1xuICAgIGRmcyh2KTtcbiAgICBpZiAoY21wdC5sZW5ndGgpIHtcbiAgICAgIGNtcHRzLnB1c2goY21wdCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY21wdHM7XG59XG4iLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGZzO1xuXG4vKlxuICogQSBoZWxwZXIgdGhhdCBwcmVmb3JtcyBhIHByZS0gb3IgcG9zdC1vcmRlciB0cmF2ZXJzYWwgb24gdGhlIGlucHV0IGdyYXBoXG4gKiBhbmQgcmV0dXJucyB0aGUgbm9kZXMgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSB2aXNpdGVkLiBJZiB0aGUgZ3JhcGggaXNcbiAqIHVuZGlyZWN0ZWQgdGhlbiB0aGlzIGFsZ29yaXRobSB3aWxsIG5hdmlnYXRlIHVzaW5nIG5laWdoYm9ycy4gSWYgdGhlIGdyYXBoXG4gKiBpcyBkaXJlY3RlZCB0aGVuIHRoaXMgYWxnb3JpdGhtIHdpbGwgbmF2aWdhdGUgdXNpbmcgc3VjY2Vzc29ycy5cbiAqXG4gKiBPcmRlciBtdXN0IGJlIG9uZSBvZiBcInByZVwiIG9yIFwicG9zdFwiLlxuICovXG5mdW5jdGlvbiBkZnMoZywgdnMsIG9yZGVyKSB7XG4gIGlmICghXy5pc0FycmF5KHZzKSkge1xuICAgIHZzID0gW3ZzXTtcbiAgfVxuXG4gIHZhciBuYXZpZ2F0aW9uID0gKGcuaXNEaXJlY3RlZCgpID8gZy5zdWNjZXNzb3JzIDogZy5uZWlnaGJvcnMpLmJpbmQoZyk7XG5cbiAgdmFyIGFjYyA9IFtdO1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuICBfLmVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoIWcuaGFzTm9kZSh2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR3JhcGggZG9lcyBub3QgaGF2ZSBub2RlOiBcIiArIHYpO1xuICAgIH1cblxuICAgIGRvRGZzKGcsIHYsIG9yZGVyID09PSBcInBvc3RcIiwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKTtcbiAgfSk7XG4gIHJldHVybiBhY2M7XG59XG5cbmZ1bmN0aW9uIGRvRGZzKGcsIHYsIHBvc3RvcmRlciwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKSB7XG4gIGlmICghXy5oYXModmlzaXRlZCwgdikpIHtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcblxuICAgIGlmICghcG9zdG9yZGVyKSB7IGFjYy5wdXNoKHYpOyB9XG4gICAgXy5lYWNoKG5hdmlnYXRpb24odiksIGZ1bmN0aW9uKHcpIHtcbiAgICAgIGRvRGZzKGcsIHcsIHBvc3RvcmRlciwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKTtcbiAgICB9KTtcbiAgICBpZiAocG9zdG9yZGVyKSB7IGFjYy5wdXNoKHYpOyB9XG4gIH1cbn1cbiIsInZhciBkaWprc3RyYSA9IHJlcXVpcmUoXCIuL2RpamtzdHJhXCIpO1xudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRpamtzdHJhQWxsO1xuXG5mdW5jdGlvbiBkaWprc3RyYUFsbChnLCB3ZWlnaHRGdW5jLCBlZGdlRnVuYykge1xuICByZXR1cm4gXy50cmFuc2Zvcm0oZy5ub2RlcygpLCBmdW5jdGlvbihhY2MsIHYpIHtcbiAgICBhY2Nbdl0gPSBkaWprc3RyYShnLCB2LCB3ZWlnaHRGdW5jLCBlZGdlRnVuYyk7XG4gIH0sIHt9KTtcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBQcmlvcml0eVF1ZXVlID0gcmVxdWlyZShcIi4uL2RhdGEvcHJpb3JpdHktcXVldWVcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGlqa3N0cmE7XG5cbnZhciBERUZBVUxUX1dFSUdIVF9GVU5DID0gXy5jb25zdGFudCgxKTtcblxuZnVuY3Rpb24gZGlqa3N0cmEoZywgc291cmNlLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHJldHVybiBydW5EaWprc3RyYShnLCBTdHJpbmcoc291cmNlKSxcbiAgICB3ZWlnaHRGbiB8fCBERUZBVUxUX1dFSUdIVF9GVU5DLFxuICAgIGVkZ2VGbiB8fCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm91dEVkZ2VzKHYpOyB9KTtcbn1cblxuZnVuY3Rpb24gcnVuRGlqa3N0cmEoZywgc291cmNlLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHZhciByZXN1bHRzID0ge307XG4gIHZhciBwcSA9IG5ldyBQcmlvcml0eVF1ZXVlKCk7XG4gIHZhciB2LCB2RW50cnk7XG5cbiAgdmFyIHVwZGF0ZU5laWdoYm9ycyA9IGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICB2YXIgdyA9IGVkZ2UudiAhPT0gdiA/IGVkZ2UudiA6IGVkZ2UudztcbiAgICB2YXIgd0VudHJ5ID0gcmVzdWx0c1t3XTtcbiAgICB2YXIgd2VpZ2h0ID0gd2VpZ2h0Rm4oZWRnZSk7XG4gICAgdmFyIGRpc3RhbmNlID0gdkVudHJ5LmRpc3RhbmNlICsgd2VpZ2h0O1xuXG4gICAgaWYgKHdlaWdodCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImRpamtzdHJhIGRvZXMgbm90IGFsbG93IG5lZ2F0aXZlIGVkZ2Ugd2VpZ2h0cy4gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiQmFkIGVkZ2U6IFwiICsgZWRnZSArIFwiIFdlaWdodDogXCIgKyB3ZWlnaHQpO1xuICAgIH1cblxuICAgIGlmIChkaXN0YW5jZSA8IHdFbnRyeS5kaXN0YW5jZSkge1xuICAgICAgd0VudHJ5LmRpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICB3RW50cnkucHJlZGVjZXNzb3IgPSB2O1xuICAgICAgcHEuZGVjcmVhc2UodywgZGlzdGFuY2UpO1xuICAgIH1cbiAgfTtcblxuICBnLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbih2KSB7XG4gICAgdmFyIGRpc3RhbmNlID0gdiA9PT0gc291cmNlID8gMCA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICByZXN1bHRzW3ZdID0geyBkaXN0YW5jZTogZGlzdGFuY2UgfTtcbiAgICBwcS5hZGQodiwgZGlzdGFuY2UpO1xuICB9KTtcblxuICB3aGlsZSAocHEuc2l6ZSgpID4gMCkge1xuICAgIHYgPSBwcS5yZW1vdmVNaW4oKTtcbiAgICB2RW50cnkgPSByZXN1bHRzW3ZdO1xuICAgIGlmICh2RW50cnkuZGlzdGFuY2UgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZWRnZUZuKHYpLmZvckVhY2godXBkYXRlTmVpZ2hib3JzKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHRhcmphbiA9IHJlcXVpcmUoXCIuL3RhcmphblwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmaW5kQ3ljbGVzO1xuXG5mdW5jdGlvbiBmaW5kQ3ljbGVzKGcpIHtcbiAgcmV0dXJuIF8uZmlsdGVyKHRhcmphbihnKSwgZnVuY3Rpb24oY21wdCkge1xuICAgIHJldHVybiBjbXB0Lmxlbmd0aCA+IDEgfHwgKGNtcHQubGVuZ3RoID09PSAxICYmIGcuaGFzRWRnZShjbXB0WzBdLCBjbXB0WzBdKSk7XG4gIH0pO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZsb3lkV2Fyc2hhbGw7XG5cbnZhciBERUZBVUxUX1dFSUdIVF9GVU5DID0gXy5jb25zdGFudCgxKTtcblxuZnVuY3Rpb24gZmxveWRXYXJzaGFsbChnLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHJldHVybiBydW5GbG95ZFdhcnNoYWxsKGcsXG4gICAgd2VpZ2h0Rm4gfHwgREVGQVVMVF9XRUlHSFRfRlVOQyxcbiAgICBlZGdlRm4gfHwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5vdXRFZGdlcyh2KTsgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkZsb3lkV2Fyc2hhbGwoZywgd2VpZ2h0Rm4sIGVkZ2VGbikge1xuICB2YXIgcmVzdWx0cyA9IHt9O1xuICB2YXIgbm9kZXMgPSBnLm5vZGVzKCk7XG5cbiAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbih2KSB7XG4gICAgcmVzdWx0c1t2XSA9IHt9O1xuICAgIHJlc3VsdHNbdl1bdl0gPSB7IGRpc3RhbmNlOiAwIH07XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbih3KSB7XG4gICAgICBpZiAodiAhPT0gdykge1xuICAgICAgICByZXN1bHRzW3ZdW3ddID0geyBkaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIH07XG4gICAgICB9XG4gICAgfSk7XG4gICAgZWRnZUZuKHYpLmZvckVhY2goZnVuY3Rpb24oZWRnZSkge1xuICAgICAgdmFyIHcgPSBlZGdlLnYgPT09IHYgPyBlZGdlLncgOiBlZGdlLnY7XG4gICAgICB2YXIgZCA9IHdlaWdodEZuKGVkZ2UpO1xuICAgICAgcmVzdWx0c1t2XVt3XSA9IHsgZGlzdGFuY2U6IGQsIHByZWRlY2Vzc29yOiB2IH07XG4gICAgfSk7XG4gIH0pO1xuXG4gIG5vZGVzLmZvckVhY2goZnVuY3Rpb24oaykge1xuICAgIHZhciByb3dLID0gcmVzdWx0c1trXTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGkpIHtcbiAgICAgIHZhciByb3dJID0gcmVzdWx0c1tpXTtcbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24oaikge1xuICAgICAgICB2YXIgaWsgPSByb3dJW2tdO1xuICAgICAgICB2YXIga2ogPSByb3dLW2pdO1xuICAgICAgICB2YXIgaWogPSByb3dJW2pdO1xuICAgICAgICB2YXIgYWx0RGlzdGFuY2UgPSBpay5kaXN0YW5jZSArIGtqLmRpc3RhbmNlO1xuICAgICAgICBpZiAoYWx0RGlzdGFuY2UgPCBpai5kaXN0YW5jZSkge1xuICAgICAgICAgIGlqLmRpc3RhbmNlID0gYWx0RGlzdGFuY2U7XG4gICAgICAgICAgaWoucHJlZGVjZXNzb3IgPSBrai5wcmVkZWNlc3NvcjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHRzO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbXBvbmVudHM6IHJlcXVpcmUoXCIuL2NvbXBvbmVudHNcIiksXG4gIGRpamtzdHJhOiByZXF1aXJlKFwiLi9kaWprc3RyYVwiKSxcbiAgZGlqa3N0cmFBbGw6IHJlcXVpcmUoXCIuL2RpamtzdHJhLWFsbFwiKSxcbiAgZmluZEN5Y2xlczogcmVxdWlyZShcIi4vZmluZC1jeWNsZXNcIiksXG4gIGZsb3lkV2Fyc2hhbGw6IHJlcXVpcmUoXCIuL2Zsb3lkLXdhcnNoYWxsXCIpLFxuICBpc0FjeWNsaWM6IHJlcXVpcmUoXCIuL2lzLWFjeWNsaWNcIiksXG4gIHBvc3RvcmRlcjogcmVxdWlyZShcIi4vcG9zdG9yZGVyXCIpLFxuICBwcmVvcmRlcjogcmVxdWlyZShcIi4vcHJlb3JkZXJcIiksXG4gIHByaW06IHJlcXVpcmUoXCIuL3ByaW1cIiksXG4gIHRhcmphbjogcmVxdWlyZShcIi4vdGFyamFuXCIpLFxuICB0b3Bzb3J0OiByZXF1aXJlKFwiLi90b3Bzb3J0XCIpXG59O1xuIiwidmFyIHRvcHNvcnQgPSByZXF1aXJlKFwiLi90b3Bzb3J0XCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQWN5Y2xpYztcblxuZnVuY3Rpb24gaXNBY3ljbGljKGcpIHtcbiAgdHJ5IHtcbiAgICB0b3Bzb3J0KGcpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiB0b3Bzb3J0LkN5Y2xlRXhjZXB0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJ2YXIgZGZzID0gcmVxdWlyZShcIi4vZGZzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBvc3RvcmRlcjtcblxuZnVuY3Rpb24gcG9zdG9yZGVyKGcsIHZzKSB7XG4gIHJldHVybiBkZnMoZywgdnMsIFwicG9zdFwiKTtcbn1cbiIsInZhciBkZnMgPSByZXF1aXJlKFwiLi9kZnNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcHJlb3JkZXI7XG5cbmZ1bmN0aW9uIHByZW9yZGVyKGcsIHZzKSB7XG4gIHJldHVybiBkZnMoZywgdnMsIFwicHJlXCIpO1xufVxuIiwidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBoXCIpO1xudmFyIFByaW9yaXR5UXVldWUgPSByZXF1aXJlKFwiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwcmltO1xuXG5mdW5jdGlvbiBwcmltKGcsIHdlaWdodEZ1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBHcmFwaCgpO1xuICB2YXIgcGFyZW50cyA9IHt9O1xuICB2YXIgcHEgPSBuZXcgUHJpb3JpdHlRdWV1ZSgpO1xuICB2YXIgdjtcblxuICBmdW5jdGlvbiB1cGRhdGVOZWlnaGJvcnMoZWRnZSkge1xuICAgIHZhciB3ID0gZWRnZS52ID09PSB2ID8gZWRnZS53IDogZWRnZS52O1xuICAgIHZhciBwcmkgPSBwcS5wcmlvcml0eSh3KTtcbiAgICBpZiAocHJpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBlZGdlV2VpZ2h0ID0gd2VpZ2h0RnVuYyhlZGdlKTtcbiAgICAgIGlmIChlZGdlV2VpZ2h0IDwgcHJpKSB7XG4gICAgICAgIHBhcmVudHNbd10gPSB2O1xuICAgICAgICBwcS5kZWNyZWFzZSh3LCBlZGdlV2VpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZy5ub2RlQ291bnQoKSA9PT0gMCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBfLmVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcHEuYWRkKHYsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgcmVzdWx0LnNldE5vZGUodik7XG4gIH0pO1xuXG4gIC8vIFN0YXJ0IGZyb20gYW4gYXJiaXRyYXJ5IG5vZGVcbiAgcHEuZGVjcmVhc2UoZy5ub2RlcygpWzBdLCAwKTtcblxuICB2YXIgaW5pdCA9IGZhbHNlO1xuICB3aGlsZSAocHEuc2l6ZSgpID4gMCkge1xuICAgIHYgPSBwcS5yZW1vdmVNaW4oKTtcbiAgICBpZiAoXy5oYXMocGFyZW50cywgdikpIHtcbiAgICAgIHJlc3VsdC5zZXRFZGdlKHYsIHBhcmVudHNbdl0pO1xuICAgIH0gZWxzZSBpZiAoaW5pdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5wdXQgZ3JhcGggaXMgbm90IGNvbm5lY3RlZDogXCIgKyBnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5pdCA9IHRydWU7XG4gICAgfVxuXG4gICAgZy5ub2RlRWRnZXModikuZm9yRWFjaCh1cGRhdGVOZWlnaGJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0YXJqYW47XG5cbmZ1bmN0aW9uIHRhcmphbihnKSB7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgdmlzaXRlZCA9IHt9OyAvLyBub2RlIGlkIC0+IHsgb25TdGFjaywgbG93bGluaywgaW5kZXggfVxuICB2YXIgcmVzdWx0cyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgdmFyIGVudHJ5ID0gdmlzaXRlZFt2XSA9IHtcbiAgICAgIG9uU3RhY2s6IHRydWUsXG4gICAgICBsb3dsaW5rOiBpbmRleCxcbiAgICAgIGluZGV4OiBpbmRleCsrXG4gICAgfTtcbiAgICBzdGFjay5wdXNoKHYpO1xuXG4gICAgZy5zdWNjZXNzb3JzKHYpLmZvckVhY2goZnVuY3Rpb24odykge1xuICAgICAgaWYgKCFfLmhhcyh2aXNpdGVkLCB3KSkge1xuICAgICAgICBkZnModyk7XG4gICAgICAgIGVudHJ5Lmxvd2xpbmsgPSBNYXRoLm1pbihlbnRyeS5sb3dsaW5rLCB2aXNpdGVkW3ddLmxvd2xpbmspO1xuICAgICAgfSBlbHNlIGlmICh2aXNpdGVkW3ddLm9uU3RhY2spIHtcbiAgICAgICAgZW50cnkubG93bGluayA9IE1hdGgubWluKGVudHJ5Lmxvd2xpbmssIHZpc2l0ZWRbd10uaW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGVudHJ5Lmxvd2xpbmsgPT09IGVudHJ5LmluZGV4KSB7XG4gICAgICB2YXIgY21wdCA9IFtdO1xuICAgICAgdmFyIHc7XG4gICAgICBkbyB7XG4gICAgICAgIHcgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgdmlzaXRlZFt3XS5vblN0YWNrID0gZmFsc2U7XG4gICAgICAgIGNtcHQucHVzaCh3KTtcbiAgICAgIH0gd2hpbGUgKHYgIT09IHcpO1xuICAgICAgcmVzdWx0cy5wdXNoKGNtcHQpO1xuICAgIH1cbiAgfVxuXG4gIGcubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoIV8uaGFzKHZpc2l0ZWQsIHYpKSB7XG4gICAgICBkZnModik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0cztcbn1cbiIsInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0b3Bzb3J0O1xudG9wc29ydC5DeWNsZUV4Y2VwdGlvbiA9IEN5Y2xlRXhjZXB0aW9uO1xuXG5mdW5jdGlvbiB0b3Bzb3J0KGcpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgdmFyIHN0YWNrID0ge307XG4gIHZhciByZXN1bHRzID0gW107XG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZSkge1xuICAgIGlmIChfLmhhcyhzdGFjaywgbm9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBDeWNsZUV4Y2VwdGlvbigpO1xuICAgIH1cblxuICAgIGlmICghXy5oYXModmlzaXRlZCwgbm9kZSkpIHtcbiAgICAgIHN0YWNrW25vZGVdID0gdHJ1ZTtcbiAgICAgIHZpc2l0ZWRbbm9kZV0gPSB0cnVlO1xuICAgICAgXy5lYWNoKGcucHJlZGVjZXNzb3JzKG5vZGUpLCB2aXNpdCk7XG4gICAgICBkZWxldGUgc3RhY2tbbm9kZV07XG4gICAgICByZXN1bHRzLnB1c2gobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgXy5lYWNoKGcuc2lua3MoKSwgdmlzaXQpO1xuXG4gIGlmIChfLnNpemUodmlzaXRlZCkgIT09IGcubm9kZUNvdW50KCkpIHtcbiAgICB0aHJvdyBuZXcgQ3ljbGVFeGNlcHRpb24oKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBDeWNsZUV4Y2VwdGlvbigpIHt9XG5DeWNsZUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsgLy8gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBFcnJvciB0byBwYXNzIHRlc3RpbmciLCJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJpb3JpdHlRdWV1ZTtcblxuLyoqXG4gKiBBIG1pbi1wcmlvcml0eSBxdWV1ZSBkYXRhIHN0cnVjdHVyZS4gVGhpcyBhbGdvcml0aG0gaXMgZGVyaXZlZCBmcm9tIENvcm1lbixcbiAqIGV0IGFsLiwgXCJJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtc1wiLiBUaGUgYmFzaWMgaWRlYSBvZiBhIG1pbi1wcmlvcml0eVxuICogcXVldWUgaXMgdGhhdCB5b3UgY2FuIGVmZmljaWVudGx5IChpbiBPKDEpIHRpbWUpIGdldCB0aGUgc21hbGxlc3Qga2V5IGluXG4gKiB0aGUgcXVldWUuIEFkZGluZyBhbmQgcmVtb3ZpbmcgZWxlbWVudHMgdGFrZXMgTyhsb2cgbikgdGltZS4gQSBrZXkgY2FuXG4gKiBoYXZlIGl0cyBwcmlvcml0eSBkZWNyZWFzZWQgaW4gTyhsb2cgbikgdGltZS5cbiAqL1xuZnVuY3Rpb24gUHJpb3JpdHlRdWV1ZSgpIHtcbiAgdGhpcy5fYXJyID0gW107XG4gIHRoaXMuX2tleUluZGljZXMgPSB7fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlLiBUYWtlcyBgTygxKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fYXJyLmxlbmd0aDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUga2V5cyB0aGF0IGFyZSBpbiB0aGUgcXVldWUuIFRha2VzIGBPKG4pYCB0aW1lLlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9hcnIubWFwKGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHgua2V5OyB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgKiprZXkqKiBpcyBpbiB0aGUgcXVldWUgYW5kIGBmYWxzZWAgaWYgbm90LlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbihrZXkpIHtcbiAgcmV0dXJuIF8uaGFzKHRoaXMuX2tleUluZGljZXMsIGtleSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHByaW9yaXR5IGZvciAqKmtleSoqLiBJZiAqKmtleSoqIGlzIG5vdCBwcmVzZW50IGluIHRoZSBxdWV1ZVxuICogdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYHVuZGVmaW5lZGAuIFRha2VzIGBPKDEpYCB0aW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBrZXlcbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucHJpb3JpdHkgPSBmdW5jdGlvbihrZXkpIHtcbiAgdmFyIGluZGV4ID0gdGhpcy5fa2V5SW5kaWNlc1trZXldO1xuICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5O1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhlIG1pbmltdW0gZWxlbWVudCBpbiB0aGlzIHF1ZXVlLiBJZiB0aGUgcXVldWUgaXNcbiAqIGVtcHR5IHRoaXMgZnVuY3Rpb24gdGhyb3dzIGFuIEVycm9yLiBUYWtlcyBgTygxKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUubWluID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUoKSA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlF1ZXVlIHVuZGVyZmxvd1wiKTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyWzBdLmtleTtcbn07XG5cbi8qKlxuICogSW5zZXJ0cyBhIG5ldyBrZXkgaW50byB0aGUgcHJpb3JpdHkgcXVldWUuIElmIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMgaW5cbiAqIHRoZSBxdWV1ZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYGZhbHNlYDsgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIGB0cnVlYC5cbiAqIFRha2VzIGBPKG4pYCB0aW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBrZXkgdGhlIGtleSB0byBhZGRcbiAqIEBwYXJhbSB7TnVtYmVyfSBwcmlvcml0eSB0aGUgaW5pdGlhbCBwcmlvcml0eSBmb3IgdGhlIGtleVxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihrZXksIHByaW9yaXR5KSB7XG4gIHZhciBrZXlJbmRpY2VzID0gdGhpcy5fa2V5SW5kaWNlcztcbiAga2V5ID0gU3RyaW5nKGtleSk7XG4gIGlmICghXy5oYXMoa2V5SW5kaWNlcywga2V5KSkge1xuICAgIHZhciBhcnIgPSB0aGlzLl9hcnI7XG4gICAgdmFyIGluZGV4ID0gYXJyLmxlbmd0aDtcbiAgICBrZXlJbmRpY2VzW2tleV0gPSBpbmRleDtcbiAgICBhcnIucHVzaCh7a2V5OiBrZXksIHByaW9yaXR5OiBwcmlvcml0eX0pO1xuICAgIHRoaXMuX2RlY3JlYXNlKGluZGV4KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIHNtYWxsZXN0IGtleSBpbiB0aGUgcXVldWUuIFRha2VzIGBPKGxvZyBuKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucmVtb3ZlTWluID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3N3YXAoMCwgdGhpcy5fYXJyLmxlbmd0aCAtIDEpO1xuICB2YXIgbWluID0gdGhpcy5fYXJyLnBvcCgpO1xuICBkZWxldGUgdGhpcy5fa2V5SW5kaWNlc1ttaW4ua2V5XTtcbiAgdGhpcy5faGVhcGlmeSgwKTtcbiAgcmV0dXJuIG1pbi5rZXk7XG59O1xuXG4vKipcbiAqIERlY3JlYXNlcyB0aGUgcHJpb3JpdHkgZm9yICoqa2V5KiogdG8gKipwcmlvcml0eSoqLiBJZiB0aGUgbmV3IHByaW9yaXR5IGlzXG4gKiBncmVhdGVyIHRoYW4gdGhlIHByZXZpb3VzIHByaW9yaXR5LCB0aGlzIGZ1bmN0aW9uIHdpbGwgdGhyb3cgYW4gRXJyb3IuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGtleSB0aGUga2V5IGZvciB3aGljaCB0byByYWlzZSBwcmlvcml0eVxuICogQHBhcmFtIHtOdW1iZXJ9IHByaW9yaXR5IHRoZSBuZXcgcHJpb3JpdHkgZm9yIHRoZSBrZXlcbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuZGVjcmVhc2UgPSBmdW5jdGlvbihrZXksIHByaW9yaXR5KSB7XG4gIHZhciBpbmRleCA9IHRoaXMuX2tleUluZGljZXNba2V5XTtcbiAgaWYgKHByaW9yaXR5ID4gdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5ldyBwcmlvcml0eSBpcyBncmVhdGVyIHRoYW4gY3VycmVudCBwcmlvcml0eS4gXCIgK1xuICAgICAgICBcIktleTogXCIgKyBrZXkgKyBcIiBPbGQ6IFwiICsgdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSArIFwiIE5ldzogXCIgKyBwcmlvcml0eSk7XG4gIH1cbiAgdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSA9IHByaW9yaXR5O1xuICB0aGlzLl9kZWNyZWFzZShpbmRleCk7XG59O1xuXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5faGVhcGlmeSA9IGZ1bmN0aW9uKGkpIHtcbiAgdmFyIGFyciA9IHRoaXMuX2FycjtcbiAgdmFyIGwgPSAyICogaTtcbiAgdmFyIHIgPSBsICsgMTtcbiAgdmFyIGxhcmdlc3QgPSBpO1xuICBpZiAobCA8IGFyci5sZW5ndGgpIHtcbiAgICBsYXJnZXN0ID0gYXJyW2xdLnByaW9yaXR5IDwgYXJyW2xhcmdlc3RdLnByaW9yaXR5ID8gbCA6IGxhcmdlc3Q7XG4gICAgaWYgKHIgPCBhcnIubGVuZ3RoKSB7XG4gICAgICBsYXJnZXN0ID0gYXJyW3JdLnByaW9yaXR5IDwgYXJyW2xhcmdlc3RdLnByaW9yaXR5ID8gciA6IGxhcmdlc3Q7XG4gICAgfVxuICAgIGlmIChsYXJnZXN0ICE9PSBpKSB7XG4gICAgICB0aGlzLl9zd2FwKGksIGxhcmdlc3QpO1xuICAgICAgdGhpcy5faGVhcGlmeShsYXJnZXN0KTtcbiAgICB9XG4gIH1cbn07XG5cblByaW9yaXR5UXVldWUucHJvdG90eXBlLl9kZWNyZWFzZSA9IGZ1bmN0aW9uKGluZGV4KSB7XG4gIHZhciBhcnIgPSB0aGlzLl9hcnI7XG4gIHZhciBwcmlvcml0eSA9IGFycltpbmRleF0ucHJpb3JpdHk7XG4gIHZhciBwYXJlbnQ7XG4gIHdoaWxlIChpbmRleCAhPT0gMCkge1xuICAgIHBhcmVudCA9IGluZGV4ID4+IDE7XG4gICAgaWYgKGFycltwYXJlbnRdLnByaW9yaXR5IDwgcHJpb3JpdHkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLl9zd2FwKGluZGV4LCBwYXJlbnQpO1xuICAgIGluZGV4ID0gcGFyZW50O1xuICB9XG59O1xuXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5fc3dhcCA9IGZ1bmN0aW9uKGksIGopIHtcbiAgdmFyIGFyciA9IHRoaXMuX2FycjtcbiAgdmFyIGtleUluZGljZXMgPSB0aGlzLl9rZXlJbmRpY2VzO1xuICB2YXIgb3JpZ0FyckkgPSBhcnJbaV07XG4gIHZhciBvcmlnQXJySiA9IGFycltqXTtcbiAgYXJyW2ldID0gb3JpZ0Fycko7XG4gIGFycltqXSA9IG9yaWdBcnJJO1xuICBrZXlJbmRpY2VzW29yaWdBcnJKLmtleV0gPSBpO1xuICBrZXlJbmRpY2VzW29yaWdBcnJJLmtleV0gPSBqO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBHcmFwaDtcblxudmFyIERFRkFVTFRfRURHRV9OQU1FID0gXCJcXHgwMFwiO1xudmFyIEdSQVBIX05PREUgPSBcIlxceDAwXCI7XG52YXIgRURHRV9LRVlfREVMSU0gPSBcIlxceDAxXCI7XG5cbi8vIEltcGxlbWVudGF0aW9uIG5vdGVzOlxuLy9cbi8vICAqIE5vZGUgaWQgcXVlcnkgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gc3RyaW5nIGlkcyBmb3IgdGhlIG5vZGVzXG4vLyAgKiBFZGdlIGlkIHF1ZXJ5IGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIGFuIFwiZWRnZU9ialwiLCBlZGdlIG9iamVjdCwgdGhhdCBpc1xuLy8gICAgY29tcG9zZWQgb2YgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuIGVkZ2U6IHt2LCB3LCBuYW1lfS5cbi8vICAqIEludGVybmFsbHkgd2UgdXNlIGFuIFwiZWRnZUlkXCIsIGEgc3RyaW5naWZpZWQgZm9ybSBvZiB0aGUgZWRnZU9iaiwgdG9cbi8vICAgIHJlZmVyZW5jZSBlZGdlcy4gVGhpcyBpcyBiZWNhdXNlIHdlIG5lZWQgYSBwZXJmb3JtYW50IHdheSB0byBsb29rIHRoZXNlXG4vLyAgICBlZGdlcyB1cCBhbmQsIG9iamVjdCBwcm9wZXJ0aWVzLCB3aGljaCBoYXZlIHN0cmluZyBrZXlzLCBhcmUgdGhlIGNsb3Nlc3Rcbi8vICAgIHdlJ3JlIGdvaW5nIHRvIGdldCB0byBhIHBlcmZvcm1hbnQgaGFzaHRhYmxlIGluIEphdmFTY3JpcHQuXG5cbmZ1bmN0aW9uIEdyYXBoKG9wdHMpIHtcbiAgdGhpcy5faXNEaXJlY3RlZCA9IF8uaGFzKG9wdHMsIFwiZGlyZWN0ZWRcIikgPyBvcHRzLmRpcmVjdGVkIDogdHJ1ZTtcbiAgdGhpcy5faXNNdWx0aWdyYXBoID0gXy5oYXMob3B0cywgXCJtdWx0aWdyYXBoXCIpID8gb3B0cy5tdWx0aWdyYXBoIDogZmFsc2U7XG4gIHRoaXMuX2lzQ29tcG91bmQgPSBfLmhhcyhvcHRzLCBcImNvbXBvdW5kXCIpID8gb3B0cy5jb21wb3VuZCA6IGZhbHNlO1xuXG4gIC8vIExhYmVsIGZvciB0aGUgZ3JhcGggaXRzZWxmXG4gIHRoaXMuX2xhYmVsID0gdW5kZWZpbmVkO1xuXG4gIC8vIERlZmF1bHRzIHRvIGJlIHNldCB3aGVuIGNyZWF0aW5nIGEgbmV3IG5vZGVcbiAgdGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuID0gXy5jb25zdGFudCh1bmRlZmluZWQpO1xuXG4gIC8vIERlZmF1bHRzIHRvIGJlIHNldCB3aGVuIGNyZWF0aW5nIGEgbmV3IGVkZ2VcbiAgdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuID0gXy5jb25zdGFudCh1bmRlZmluZWQpO1xuXG4gIC8vIHYgLT4gbGFiZWxcbiAgdGhpcy5fbm9kZXMgPSB7fTtcblxuICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgIC8vIHYgLT4gcGFyZW50XG4gICAgdGhpcy5fcGFyZW50ID0ge307XG5cbiAgICAvLyB2IC0+IGNoaWxkcmVuXG4gICAgdGhpcy5fY2hpbGRyZW4gPSB7fTtcbiAgICB0aGlzLl9jaGlsZHJlbltHUkFQSF9OT0RFXSA9IHt9O1xuICB9XG5cbiAgLy8gdiAtPiBlZGdlT2JqXG4gIHRoaXMuX2luID0ge307XG5cbiAgLy8gdSAtPiB2IC0+IE51bWJlclxuICB0aGlzLl9wcmVkcyA9IHt9O1xuXG4gIC8vIHYgLT4gZWRnZU9ialxuICB0aGlzLl9vdXQgPSB7fTtcblxuICAvLyB2IC0+IHcgLT4gTnVtYmVyXG4gIHRoaXMuX3N1Y3MgPSB7fTtcblxuICAvLyBlIC0+IGVkZ2VPYmpcbiAgdGhpcy5fZWRnZU9ianMgPSB7fTtcblxuICAvLyBlIC0+IGxhYmVsXG4gIHRoaXMuX2VkZ2VMYWJlbHMgPSB7fTtcbn1cblxuLyogTnVtYmVyIG9mIG5vZGVzIGluIHRoZSBncmFwaC4gU2hvdWxkIG9ubHkgYmUgY2hhbmdlZCBieSB0aGUgaW1wbGVtZW50YXRpb24uICovXG5HcmFwaC5wcm90b3R5cGUuX25vZGVDb3VudCA9IDA7XG5cbi8qIE51bWJlciBvZiBlZGdlcyBpbiB0aGUgZ3JhcGguIFNob3VsZCBvbmx5IGJlIGNoYW5nZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uLiAqL1xuR3JhcGgucHJvdG90eXBlLl9lZGdlQ291bnQgPSAwO1xuXG5cbi8qID09PSBHcmFwaCBmdW5jdGlvbnMgPT09PT09PT09ICovXG5cbkdyYXBoLnByb3RvdHlwZS5pc0RpcmVjdGVkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9pc0RpcmVjdGVkO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmlzTXVsdGlncmFwaCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5faXNNdWx0aWdyYXBoO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmlzQ29tcG91bmQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2lzQ29tcG91bmQ7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0R3JhcGggPSBmdW5jdGlvbihsYWJlbCkge1xuICB0aGlzLl9sYWJlbCA9IGxhYmVsO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ncmFwaCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fbGFiZWw7XG59O1xuXG5cbi8qID09PSBOb2RlIGZ1bmN0aW9ucyA9PT09PT09PT09ICovXG5cbkdyYXBoLnByb3RvdHlwZS5zZXREZWZhdWx0Tm9kZUxhYmVsID0gZnVuY3Rpb24obmV3RGVmYXVsdCkge1xuICBpZiAoIV8uaXNGdW5jdGlvbihuZXdEZWZhdWx0KSkge1xuICAgIG5ld0RlZmF1bHQgPSBfLmNvbnN0YW50KG5ld0RlZmF1bHQpO1xuICB9XG4gIHRoaXMuX2RlZmF1bHROb2RlTGFiZWxGbiA9IG5ld0RlZmF1bHQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLm5vZGVDb3VudCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fbm9kZUNvdW50O1xufTtcblxuR3JhcGgucHJvdG90eXBlLm5vZGVzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBfLmtleXModGhpcy5fbm9kZXMpO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNvdXJjZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICByZXR1cm4gXy5maWx0ZXIodGhpcy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuIF8uaXNFbXB0eShzZWxmLl9pblt2XSk7XG4gIH0pO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNpbmtzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgcmV0dXJuIF8uZmlsdGVyKHRoaXMubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHJldHVybiBfLmlzRW1wdHkoc2VsZi5fb3V0W3ZdKTtcbiAgfSk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0Tm9kZXMgPSBmdW5jdGlvbih2cywgdmFsdWUpIHtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgXy5lYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuICAgICAgc2VsZi5zZXROb2RlKHYsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5zZXROb2RlKHYpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNldE5vZGUgPSBmdW5jdGlvbih2LCB2YWx1ZSkge1xuICBpZiAoXy5oYXModGhpcy5fbm9kZXMsIHYpKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLl9ub2Rlc1t2XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoaXMuX25vZGVzW3ZdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyB2YWx1ZSA6IHRoaXMuX2RlZmF1bHROb2RlTGFiZWxGbih2KTtcbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICB0aGlzLl9wYXJlbnRbdl0gPSBHUkFQSF9OT0RFO1xuICAgIHRoaXMuX2NoaWxkcmVuW3ZdID0ge307XG4gICAgdGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV1bdl0gPSB0cnVlO1xuICB9XG4gIHRoaXMuX2luW3ZdID0ge307XG4gIHRoaXMuX3ByZWRzW3ZdID0ge307XG4gIHRoaXMuX291dFt2XSA9IHt9O1xuICB0aGlzLl9zdWNzW3ZdID0ge307XG4gICsrdGhpcy5fbm9kZUNvdW50O1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ub2RlID0gZnVuY3Rpb24odikge1xuICByZXR1cm4gdGhpcy5fbm9kZXNbdl07XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaGFzTm9kZSA9IGZ1bmN0aW9uKHYpIHtcbiAgcmV0dXJuIF8uaGFzKHRoaXMuX25vZGVzLCB2KTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5yZW1vdmVOb2RlID0gIGZ1bmN0aW9uKHYpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoXy5oYXModGhpcy5fbm9kZXMsIHYpKSB7XG4gICAgdmFyIHJlbW92ZUVkZ2UgPSBmdW5jdGlvbihlKSB7IHNlbGYucmVtb3ZlRWRnZShzZWxmLl9lZGdlT2Jqc1tlXSk7IH07XG4gICAgZGVsZXRlIHRoaXMuX25vZGVzW3ZdO1xuICAgIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgICB0aGlzLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCh2KTtcbiAgICAgIGRlbGV0ZSB0aGlzLl9wYXJlbnRbdl07XG4gICAgICBfLmVhY2godGhpcy5jaGlsZHJlbih2KSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgc2VsZi5zZXRQYXJlbnQoY2hpbGQpO1xuICAgICAgfSk7XG4gICAgICBkZWxldGUgdGhpcy5fY2hpbGRyZW5bdl07XG4gICAgfVxuICAgIF8uZWFjaChfLmtleXModGhpcy5faW5bdl0pLCByZW1vdmVFZGdlKTtcbiAgICBkZWxldGUgdGhpcy5faW5bdl07XG4gICAgZGVsZXRlIHRoaXMuX3ByZWRzW3ZdO1xuICAgIF8uZWFjaChfLmtleXModGhpcy5fb3V0W3ZdKSwgcmVtb3ZlRWRnZSk7XG4gICAgZGVsZXRlIHRoaXMuX291dFt2XTtcbiAgICBkZWxldGUgdGhpcy5fc3Vjc1t2XTtcbiAgICAtLXRoaXMuX25vZGVDb3VudDtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXRQYXJlbnQgPSBmdW5jdGlvbih2LCBwYXJlbnQpIHtcbiAgaWYgKCF0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNldCBwYXJlbnQgaW4gYSBub24tY29tcG91bmQgZ3JhcGhcIik7XG4gIH1cblxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJlbnQpKSB7XG4gICAgcGFyZW50ID0gR1JBUEhfTk9ERTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDb2VyY2UgcGFyZW50IHRvIHN0cmluZ1xuICAgIHBhcmVudCArPSBcIlwiO1xuICAgIGZvciAodmFyIGFuY2VzdG9yID0gcGFyZW50O1xuICAgICAgIV8uaXNVbmRlZmluZWQoYW5jZXN0b3IpO1xuICAgICAgYW5jZXN0b3IgPSB0aGlzLnBhcmVudChhbmNlc3RvcikpIHtcbiAgICAgIGlmIChhbmNlc3RvciA9PT0gdikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZXR0aW5nIFwiICsgcGFyZW50KyBcIiBhcyBwYXJlbnQgb2YgXCIgKyB2ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIHdvdWxkIGNyZWF0ZSBhIGN5Y2xlXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0Tm9kZShwYXJlbnQpO1xuICB9XG5cbiAgdGhpcy5zZXROb2RlKHYpO1xuICB0aGlzLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCh2KTtcbiAgdGhpcy5fcGFyZW50W3ZdID0gcGFyZW50O1xuICB0aGlzLl9jaGlsZHJlbltwYXJlbnRdW3ZdID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0ID0gZnVuY3Rpb24odikge1xuICBkZWxldGUgdGhpcy5fY2hpbGRyZW5bdGhpcy5fcGFyZW50W3ZdXVt2XTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5wYXJlbnQgPSBmdW5jdGlvbih2KSB7XG4gIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMuX3BhcmVudFt2XTtcbiAgICBpZiAocGFyZW50ICE9PSBHUkFQSF9OT0RFKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLmNoaWxkcmVuID0gZnVuY3Rpb24odikge1xuICBpZiAoXy5pc1VuZGVmaW5lZCh2KSkge1xuICAgIHYgPSBHUkFQSF9OT0RFO1xuICB9XG5cbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLl9jaGlsZHJlblt2XTtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiBfLmtleXMoY2hpbGRyZW4pO1xuICAgIH1cbiAgfSBlbHNlIGlmICh2ID09PSBHUkFQSF9OT0RFKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZXMoKTtcbiAgfSBlbHNlIGlmICh0aGlzLmhhc05vZGUodikpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5wcmVkZWNlc3NvcnMgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBwcmVkc1YgPSB0aGlzLl9wcmVkc1t2XTtcbiAgaWYgKHByZWRzVikge1xuICAgIHJldHVybiBfLmtleXMocHJlZHNWKTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLnN1Y2Nlc3NvcnMgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBzdWNzViA9IHRoaXMuX3N1Y3Nbdl07XG4gIGlmIChzdWNzVikge1xuICAgIHJldHVybiBfLmtleXMoc3Vjc1YpO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUubmVpZ2hib3JzID0gZnVuY3Rpb24odikge1xuICB2YXIgcHJlZHMgPSB0aGlzLnByZWRlY2Vzc29ycyh2KTtcbiAgaWYgKHByZWRzKSB7XG4gICAgcmV0dXJuIF8udW5pb24ocHJlZHMsIHRoaXMuc3VjY2Vzc29ycyh2KSk7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5pc0xlYWYgPSBmdW5jdGlvbiAodikge1xuICB2YXIgbmVpZ2hib3JzO1xuICBpZiAodGhpcy5pc0RpcmVjdGVkKCkpIHtcbiAgICBuZWlnaGJvcnMgPSB0aGlzLnN1Y2Nlc3NvcnModik7XG4gIH0gZWxzZSB7XG4gICAgbmVpZ2hib3JzID0gdGhpcy5uZWlnaGJvcnModik7XG4gIH1cbiAgcmV0dXJuIG5laWdoYm9ycy5sZW5ndGggPT09IDA7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZmlsdGVyTm9kZXMgPSBmdW5jdGlvbihmaWx0ZXIpIHtcbiAgdmFyIGNvcHkgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih7XG4gICAgZGlyZWN0ZWQ6IHRoaXMuX2lzRGlyZWN0ZWQsXG4gICAgbXVsdGlncmFwaDogdGhpcy5faXNNdWx0aWdyYXBoLFxuICAgIGNvbXBvdW5kOiB0aGlzLl9pc0NvbXBvdW5kXG4gIH0pO1xuXG4gIGNvcHkuc2V0R3JhcGgodGhpcy5ncmFwaCgpKTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIF8uZWFjaCh0aGlzLl9ub2RlcywgZnVuY3Rpb24odmFsdWUsIHYpIHtcbiAgICBpZiAoZmlsdGVyKHYpKSB7XG4gICAgICBjb3B5LnNldE5vZGUodiwgdmFsdWUpO1xuICAgIH1cbiAgfSk7XG5cbiAgXy5lYWNoKHRoaXMuX2VkZ2VPYmpzLCBmdW5jdGlvbihlKSB7XG4gICAgaWYgKGNvcHkuaGFzTm9kZShlLnYpICYmIGNvcHkuaGFzTm9kZShlLncpKSB7XG4gICAgICBjb3B5LnNldEVkZ2UoZSwgc2VsZi5lZGdlKGUpKTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciBwYXJlbnRzID0ge307XG4gIGZ1bmN0aW9uIGZpbmRQYXJlbnQodikge1xuICAgIHZhciBwYXJlbnQgPSBzZWxmLnBhcmVudCh2KTtcbiAgICBpZiAocGFyZW50ID09PSB1bmRlZmluZWQgfHwgY29weS5oYXNOb2RlKHBhcmVudCkpIHtcbiAgICAgIHBhcmVudHNbdl0gPSBwYXJlbnQ7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH0gZWxzZSBpZiAocGFyZW50IGluIHBhcmVudHMpIHtcbiAgICAgIHJldHVybiBwYXJlbnRzW3BhcmVudF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kUGFyZW50KHBhcmVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICBfLmVhY2goY29weS5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgICBjb3B5LnNldFBhcmVudCh2LCBmaW5kUGFyZW50KHYpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb3B5O1xufTtcblxuLyogPT09IEVkZ2UgZnVuY3Rpb25zID09PT09PT09PT0gKi9cblxuR3JhcGgucHJvdG90eXBlLnNldERlZmF1bHRFZGdlTGFiZWwgPSBmdW5jdGlvbihuZXdEZWZhdWx0KSB7XG4gIGlmICghXy5pc0Z1bmN0aW9uKG5ld0RlZmF1bHQpKSB7XG4gICAgbmV3RGVmYXVsdCA9IF8uY29uc3RhbnQobmV3RGVmYXVsdCk7XG4gIH1cbiAgdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuID0gbmV3RGVmYXVsdDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZWRnZUNvdW50ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9lZGdlQ291bnQ7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZWRnZXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIF8udmFsdWVzKHRoaXMuX2VkZ2VPYmpzKTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXRQYXRoID0gZnVuY3Rpb24odnMsIHZhbHVlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIF8ucmVkdWNlKHZzLCBmdW5jdGlvbih2LCB3KSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuICAgICAgc2VsZi5zZXRFZGdlKHYsIHcsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5zZXRFZGdlKHYsIHcpO1xuICAgIH1cbiAgICByZXR1cm4gdztcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLypcbiAqIHNldEVkZ2UodiwgdywgW3ZhbHVlLCBbbmFtZV1dKVxuICogc2V0RWRnZSh7IHYsIHcsIFtuYW1lXSB9LCBbdmFsdWVdKVxuICovXG5HcmFwaC5wcm90b3R5cGUuc2V0RWRnZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgdiwgdywgbmFtZSwgdmFsdWU7XG4gIHZhciB2YWx1ZVNwZWNpZmllZCA9IGZhbHNlO1xuICB2YXIgYXJnMCA9IGFyZ3VtZW50c1swXTtcblxuICBpZiAodHlwZW9mIGFyZzAgPT09IFwib2JqZWN0XCIgJiYgYXJnMCAhPT0gbnVsbCAmJiBcInZcIiBpbiBhcmcwKSB7XG4gICAgdiA9IGFyZzAudjtcbiAgICB3ID0gYXJnMC53O1xuICAgIG5hbWUgPSBhcmcwLm5hbWU7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHZhbHVlID0gYXJndW1lbnRzWzFdO1xuICAgICAgdmFsdWVTcGVjaWZpZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2ID0gYXJnMDtcbiAgICB3ID0gYXJndW1lbnRzWzFdO1xuICAgIG5hbWUgPSBhcmd1bWVudHNbM107XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICB2YWx1ZSA9IGFyZ3VtZW50c1syXTtcbiAgICAgIHZhbHVlU3BlY2lmaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2ID0gXCJcIiArIHY7XG4gIHcgPSBcIlwiICsgdztcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgbmFtZSA9IFwiXCIgKyBuYW1lO1xuICB9XG5cbiAgdmFyIGUgPSBlZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSk7XG4gIGlmIChfLmhhcyh0aGlzLl9lZGdlTGFiZWxzLCBlKSkge1xuICAgIGlmICh2YWx1ZVNwZWNpZmllZCkge1xuICAgICAgdGhpcy5fZWRnZUxhYmVsc1tlXSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmICghXy5pc1VuZGVmaW5lZChuYW1lKSAmJiAhdGhpcy5faXNNdWx0aWdyYXBoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNldCBhIG5hbWVkIGVkZ2Ugd2hlbiBpc011bHRpZ3JhcGggPSBmYWxzZVwiKTtcbiAgfVxuXG4gIC8vIEl0IGRpZG4ndCBleGlzdCwgc28gd2UgbmVlZCB0byBjcmVhdGUgaXQuXG4gIC8vIEZpcnN0IGVuc3VyZSB0aGUgbm9kZXMgZXhpc3QuXG4gIHRoaXMuc2V0Tm9kZSh2KTtcbiAgdGhpcy5zZXROb2RlKHcpO1xuXG4gIHRoaXMuX2VkZ2VMYWJlbHNbZV0gPSB2YWx1ZVNwZWNpZmllZCA/IHZhbHVlIDogdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuKHYsIHcsIG5hbWUpO1xuXG4gIHZhciBlZGdlT2JqID0gZWRnZUFyZ3NUb09iaih0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKTtcbiAgLy8gRW5zdXJlIHdlIGFkZCB1bmRpcmVjdGVkIGVkZ2VzIGluIGEgY29uc2lzdGVudCB3YXkuXG4gIHYgPSBlZGdlT2JqLnY7XG4gIHcgPSBlZGdlT2JqLnc7XG5cbiAgT2JqZWN0LmZyZWV6ZShlZGdlT2JqKTtcbiAgdGhpcy5fZWRnZU9ianNbZV0gPSBlZGdlT2JqO1xuICBpbmNyZW1lbnRPckluaXRFbnRyeSh0aGlzLl9wcmVkc1t3XSwgdik7XG4gIGluY3JlbWVudE9ySW5pdEVudHJ5KHRoaXMuX3N1Y3Nbdl0sIHcpO1xuICB0aGlzLl9pblt3XVtlXSA9IGVkZ2VPYmo7XG4gIHRoaXMuX291dFt2XVtlXSA9IGVkZ2VPYmo7XG4gIHRoaXMuX2VkZ2VDb3VudCsrO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5lZGdlID0gZnVuY3Rpb24odiwgdywgbmFtZSkge1xuICB2YXIgZSA9IChhcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgPyBlZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCBhcmd1bWVudHNbMF0pXG4gICAgOiBlZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSkpO1xuICByZXR1cm4gdGhpcy5fZWRnZUxhYmVsc1tlXTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5oYXNFZGdlID0gZnVuY3Rpb24odiwgdywgbmFtZSkge1xuICB2YXIgZSA9IChhcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgPyBlZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCBhcmd1bWVudHNbMF0pXG4gICAgOiBlZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSkpO1xuICByZXR1cm4gXy5oYXModGhpcy5fZWRnZUxhYmVscywgZSk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUucmVtb3ZlRWRnZSA9IGZ1bmN0aW9uKHYsIHcsIG5hbWUpIHtcbiAgdmFyIGUgPSAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMVxuICAgID8gZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCwgYXJndW1lbnRzWzBdKVxuICAgIDogZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIHYsIHcsIG5hbWUpKTtcbiAgdmFyIGVkZ2UgPSB0aGlzLl9lZGdlT2Jqc1tlXTtcbiAgaWYgKGVkZ2UpIHtcbiAgICB2ID0gZWRnZS52O1xuICAgIHcgPSBlZGdlLnc7XG4gICAgZGVsZXRlIHRoaXMuX2VkZ2VMYWJlbHNbZV07XG4gICAgZGVsZXRlIHRoaXMuX2VkZ2VPYmpzW2VdO1xuICAgIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkodGhpcy5fcHJlZHNbd10sIHYpO1xuICAgIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkodGhpcy5fc3Vjc1t2XSwgdyk7XG4gICAgZGVsZXRlIHRoaXMuX2luW3ddW2VdO1xuICAgIGRlbGV0ZSB0aGlzLl9vdXRbdl1bZV07XG4gICAgdGhpcy5fZWRnZUNvdW50LS07XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaW5FZGdlcyA9IGZ1bmN0aW9uKHYsIHUpIHtcbiAgdmFyIGluViA9IHRoaXMuX2luW3ZdO1xuICBpZiAoaW5WKSB7XG4gICAgdmFyIGVkZ2VzID0gXy52YWx1ZXMoaW5WKTtcbiAgICBpZiAoIXUpIHtcbiAgICAgIHJldHVybiBlZGdlcztcbiAgICB9XG4gICAgcmV0dXJuIF8uZmlsdGVyKGVkZ2VzLCBmdW5jdGlvbihlZGdlKSB7IHJldHVybiBlZGdlLnYgPT09IHU7IH0pO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUub3V0RWRnZXMgPSBmdW5jdGlvbih2LCB3KSB7XG4gIHZhciBvdXRWID0gdGhpcy5fb3V0W3ZdO1xuICBpZiAob3V0Vikge1xuICAgIHZhciBlZGdlcyA9IF8udmFsdWVzKG91dFYpO1xuICAgIGlmICghdykge1xuICAgICAgcmV0dXJuIGVkZ2VzO1xuICAgIH1cbiAgICByZXR1cm4gXy5maWx0ZXIoZWRnZXMsIGZ1bmN0aW9uKGVkZ2UpIHsgcmV0dXJuIGVkZ2UudyA9PT0gdzsgfSk7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ub2RlRWRnZXMgPSBmdW5jdGlvbih2LCB3KSB7XG4gIHZhciBpbkVkZ2VzID0gdGhpcy5pbkVkZ2VzKHYsIHcpO1xuICBpZiAoaW5FZGdlcykge1xuICAgIHJldHVybiBpbkVkZ2VzLmNvbmNhdCh0aGlzLm91dEVkZ2VzKHYsIHcpKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gaW5jcmVtZW50T3JJbml0RW50cnkobWFwLCBrKSB7XG4gIGlmIChtYXBba10pIHtcbiAgICBtYXBba10rKztcbiAgfSBlbHNlIHtcbiAgICBtYXBba10gPSAxO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkobWFwLCBrKSB7XG4gIGlmICghLS1tYXBba10pIHsgZGVsZXRlIG1hcFtrXTsgfVxufVxuXG5mdW5jdGlvbiBlZGdlQXJnc1RvSWQoaXNEaXJlY3RlZCwgdl8sIHdfLCBuYW1lKSB7XG4gIHZhciB2ID0gXCJcIiArIHZfO1xuICB2YXIgdyA9IFwiXCIgKyB3XztcbiAgaWYgKCFpc0RpcmVjdGVkICYmIHYgPiB3KSB7XG4gICAgdmFyIHRtcCA9IHY7XG4gICAgdiA9IHc7XG4gICAgdyA9IHRtcDtcbiAgfVxuICByZXR1cm4gdiArIEVER0VfS0VZX0RFTElNICsgdyArIEVER0VfS0VZX0RFTElNICtcbiAgICAgICAgICAgICAoXy5pc1VuZGVmaW5lZChuYW1lKSA/IERFRkFVTFRfRURHRV9OQU1FIDogbmFtZSk7XG59XG5cbmZ1bmN0aW9uIGVkZ2VBcmdzVG9PYmooaXNEaXJlY3RlZCwgdl8sIHdfLCBuYW1lKSB7XG4gIHZhciB2ID0gXCJcIiArIHZfO1xuICB2YXIgdyA9IFwiXCIgKyB3XztcbiAgaWYgKCFpc0RpcmVjdGVkICYmIHYgPiB3KSB7XG4gICAgdmFyIHRtcCA9IHY7XG4gICAgdiA9IHc7XG4gICAgdyA9IHRtcDtcbiAgfVxuICB2YXIgZWRnZU9iaiA9ICB7IHY6IHYsIHc6IHcgfTtcbiAgaWYgKG5hbWUpIHtcbiAgICBlZGdlT2JqLm5hbWUgPSBuYW1lO1xuICB9XG4gIHJldHVybiBlZGdlT2JqO1xufVxuXG5mdW5jdGlvbiBlZGdlT2JqVG9JZChpc0RpcmVjdGVkLCBlZGdlT2JqKSB7XG4gIHJldHVybiBlZGdlQXJnc1RvSWQoaXNEaXJlY3RlZCwgZWRnZU9iai52LCBlZGdlT2JqLncsIGVkZ2VPYmoubmFtZSk7XG59XG4iLCIvLyBJbmNsdWRlcyBvbmx5IHRoZSBcImNvcmVcIiBvZiBncmFwaGxpYlxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEdyYXBoOiByZXF1aXJlKFwiLi9ncmFwaFwiKSxcbiAgdmVyc2lvbjogcmVxdWlyZShcIi4vdmVyc2lvblwiKVxufTtcbiIsInZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4vZ3JhcGhcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB3cml0ZTogd3JpdGUsXG4gIHJlYWQ6IHJlYWRcbn07XG5cbmZ1bmN0aW9uIHdyaXRlKGcpIHtcbiAgdmFyIGpzb24gPSB7XG4gICAgb3B0aW9uczoge1xuICAgICAgZGlyZWN0ZWQ6IGcuaXNEaXJlY3RlZCgpLFxuICAgICAgbXVsdGlncmFwaDogZy5pc011bHRpZ3JhcGgoKSxcbiAgICAgIGNvbXBvdW5kOiBnLmlzQ29tcG91bmQoKVxuICAgIH0sXG4gICAgbm9kZXM6IHdyaXRlTm9kZXMoZyksXG4gICAgZWRnZXM6IHdyaXRlRWRnZXMoZylcbiAgfTtcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKGcuZ3JhcGgoKSkpIHtcbiAgICBqc29uLnZhbHVlID0gXy5jbG9uZShnLmdyYXBoKCkpO1xuICB9XG4gIHJldHVybiBqc29uO1xufVxuXG5mdW5jdGlvbiB3cml0ZU5vZGVzKGcpIHtcbiAgcmV0dXJuIF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlVmFsdWUgPSBnLm5vZGUodik7XG4gICAgdmFyIHBhcmVudCA9IGcucGFyZW50KHYpO1xuICAgIHZhciBub2RlID0geyB2OiB2IH07XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKG5vZGVWYWx1ZSkpIHtcbiAgICAgIG5vZGUudmFsdWUgPSBub2RlVmFsdWU7XG4gICAgfVxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJlbnQpKSB7XG4gICAgICBub2RlLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB3cml0ZUVkZ2VzKGcpIHtcbiAgcmV0dXJuIF8ubWFwKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlVmFsdWUgPSBnLmVkZ2UoZSk7XG4gICAgdmFyIGVkZ2UgPSB7IHY6IGUudiwgdzogZS53IH07XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGUubmFtZSkpIHtcbiAgICAgIGVkZ2UubmFtZSA9IGUubmFtZTtcbiAgICB9XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGVkZ2VWYWx1ZSkpIHtcbiAgICAgIGVkZ2UudmFsdWUgPSBlZGdlVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBlZGdlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZChqc29uKSB7XG4gIHZhciBnID0gbmV3IEdyYXBoKGpzb24ub3B0aW9ucykuc2V0R3JhcGgoanNvbi52YWx1ZSk7XG4gIF8uZWFjaChqc29uLm5vZGVzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIGcuc2V0Tm9kZShlbnRyeS52LCBlbnRyeS52YWx1ZSk7XG4gICAgaWYgKGVudHJ5LnBhcmVudCkge1xuICAgICAgZy5zZXRQYXJlbnQoZW50cnkudiwgZW50cnkucGFyZW50KTtcbiAgICB9XG4gIH0pO1xuICBfLmVhY2goanNvbi5lZGdlcywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICBnLnNldEVkZ2UoeyB2OiBlbnRyeS52LCB3OiBlbnRyeS53LCBuYW1lOiBlbnRyeS5uYW1lIH0sIGVudHJ5LnZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiBnO1xufVxuIiwiLyogZ2xvYmFsIHdpbmRvdyAqL1xuXG52YXIgbG9kYXNoO1xuXG5pZiAodHlwZW9mIHJlcXVpcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICB0cnkge1xuICAgIGxvZGFzaCA9IHtcbiAgICAgIGNsb25lOiByZXF1aXJlKFwibG9kYXNoL2Nsb25lXCIpLFxuICAgICAgY29uc3RhbnQ6IHJlcXVpcmUoXCJsb2Rhc2gvY29uc3RhbnRcIiksXG4gICAgICBlYWNoOiByZXF1aXJlKFwibG9kYXNoL2VhY2hcIiksXG4gICAgICBmaWx0ZXI6IHJlcXVpcmUoXCJsb2Rhc2gvZmlsdGVyXCIpLFxuICAgICAgaGFzOiAgcmVxdWlyZShcImxvZGFzaC9oYXNcIiksXG4gICAgICBpc0FycmF5OiByZXF1aXJlKFwibG9kYXNoL2lzQXJyYXlcIiksXG4gICAgICBpc0VtcHR5OiByZXF1aXJlKFwibG9kYXNoL2lzRW1wdHlcIiksXG4gICAgICBpc0Z1bmN0aW9uOiByZXF1aXJlKFwibG9kYXNoL2lzRnVuY3Rpb25cIiksXG4gICAgICBpc1VuZGVmaW5lZDogcmVxdWlyZShcImxvZGFzaC9pc1VuZGVmaW5lZFwiKSxcbiAgICAgIGtleXM6IHJlcXVpcmUoXCJsb2Rhc2gva2V5c1wiKSxcbiAgICAgIG1hcDogcmVxdWlyZShcImxvZGFzaC9tYXBcIiksXG4gICAgICByZWR1Y2U6IHJlcXVpcmUoXCJsb2Rhc2gvcmVkdWNlXCIpLFxuICAgICAgc2l6ZTogcmVxdWlyZShcImxvZGFzaC9zaXplXCIpLFxuICAgICAgdHJhbnNmb3JtOiByZXF1aXJlKFwibG9kYXNoL3RyYW5zZm9ybVwiKSxcbiAgICAgIHVuaW9uOiByZXF1aXJlKFwibG9kYXNoL3VuaW9uXCIpLFxuICAgICAgdmFsdWVzOiByZXF1aXJlKFwibG9kYXNoL3ZhbHVlc1wiKVxuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXG4gIH1cbn1cblxuaWYgKCFsb2Rhc2gpIHtcbiAgbG9kYXNoID0gd2luZG93Ll87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbG9kYXNoO1xuIiwibW9kdWxlLmV4cG9ydHMgPSAnMi4xLjgnO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbi8qKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vISBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbnZhciBSRUFDVF9TVEFUSUNTID0ge1xuICBjaGlsZENvbnRleHRUeXBlczogdHJ1ZSxcbiAgY29udGV4dFR5cGU6IHRydWUsXG4gIGNvbnRleHRUeXBlczogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgZ2V0RGVmYXVsdFByb3BzOiB0cnVlLFxuICBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I6IHRydWUsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wczogdHJ1ZSxcbiAgbWl4aW5zOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWUsXG4gIHR5cGU6IHRydWVcbn07XG52YXIgS05PV05fU1RBVElDUyA9IHtcbiAgbmFtZTogdHJ1ZSxcbiAgbGVuZ3RoOiB0cnVlLFxuICBwcm90b3R5cGU6IHRydWUsXG4gIGNhbGxlcjogdHJ1ZSxcbiAgY2FsbGVlOiB0cnVlLFxuICBhcmd1bWVudHM6IHRydWUsXG4gIGFyaXR5OiB0cnVlXG59O1xudmFyIEZPUldBUkRfUkVGX1NUQVRJQ1MgPSB7XG4gICckJHR5cGVvZic6IHRydWUsXG4gIHJlbmRlcjogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlXG59O1xudmFyIE1FTU9fU1RBVElDUyA9IHtcbiAgJyQkdHlwZW9mJzogdHJ1ZSxcbiAgY29tcGFyZTogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlLFxuICB0eXBlOiB0cnVlXG59O1xudmFyIFRZUEVfU1RBVElDUyA9IHt9O1xuVFlQRV9TVEFUSUNTW3JlYWN0SXMuRm9yd2FyZFJlZl0gPSBGT1JXQVJEX1JFRl9TVEFUSUNTO1xuVFlQRV9TVEFUSUNTW3JlYWN0SXMuTWVtb10gPSBNRU1PX1NUQVRJQ1M7XG5cbmZ1bmN0aW9uIGdldFN0YXRpY3MoY29tcG9uZW50KSB7XG4gIC8vIFJlYWN0IHYxNi4xMSBhbmQgYmVsb3dcbiAgaWYgKHJlYWN0SXMuaXNNZW1vKGNvbXBvbmVudCkpIHtcbiAgICByZXR1cm4gTUVNT19TVEFUSUNTO1xuICB9IC8vIFJlYWN0IHYxNi4xMiBhbmQgYWJvdmVcblxuXG4gIHJldHVybiBUWVBFX1NUQVRJQ1NbY29tcG9uZW50WyckJHR5cGVvZiddXSB8fCBSRUFDVF9TVEFUSUNTO1xufVxuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBvYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuZnVuY3Rpb24gaG9pc3ROb25SZWFjdFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50LCBzb3VyY2VDb21wb25lbnQsIGJsYWNrbGlzdCkge1xuICBpZiAodHlwZW9mIHNvdXJjZUNvbXBvbmVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAvLyBkb24ndCBob2lzdCBvdmVyIHN0cmluZyAoaHRtbCkgY29tcG9uZW50c1xuICAgIGlmIChvYmplY3RQcm90b3R5cGUpIHtcbiAgICAgIHZhciBpbmhlcml0ZWRDb21wb25lbnQgPSBnZXRQcm90b3R5cGVPZihzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgICBpZiAoaW5oZXJpdGVkQ29tcG9uZW50ICYmIGluaGVyaXRlZENvbXBvbmVudCAhPT0gb2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICAgIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgaW5oZXJpdGVkQ29tcG9uZW50LCBibGFja2xpc3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgaWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAga2V5cyA9IGtleXMuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2VDb21wb25lbnQpKTtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0U3RhdGljcyA9IGdldFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50KTtcbiAgICB2YXIgc291cmNlU3RhdGljcyA9IGdldFN0YXRpY3Moc291cmNlQ29tcG9uZW50KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmICghS05PV05fU1RBVElDU1trZXldICYmICEoYmxhY2tsaXN0ICYmIGJsYWNrbGlzdFtrZXldKSAmJiAhKHNvdXJjZVN0YXRpY3MgJiYgc291cmNlU3RhdGljc1trZXldKSAmJiAhKHRhcmdldFN0YXRpY3MgJiYgdGFyZ2V0U3RhdGljc1trZXldKSkge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2VDb21wb25lbnQsIGtleSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBBdm9pZCBmYWlsdXJlcyBmcm9tIHJlYWQtb25seSBwcm9wZXJ0aWVzXG4gICAgICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0Q29tcG9uZW50LCBrZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXRDb21wb25lbnQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaG9pc3ROb25SZWFjdFN0YXRpY3M7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVc2UgaW52YXJpYW50KCkgdG8gYXNzZXJ0IHN0YXRlIHdoaWNoIHlvdXIgcHJvZ3JhbSBhc3N1bWVzIHRvIGJlIHRydWUuXG4gKlxuICogUHJvdmlkZSBzcHJpbnRmLXN0eWxlIGZvcm1hdCAob25seSAlcyBpcyBzdXBwb3J0ZWQpIGFuZCBhcmd1bWVudHNcbiAqIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBicm9rZSBhbmQgd2hhdCB5b3Ugd2VyZVxuICogZXhwZWN0aW5nLlxuICpcbiAqIFRoZSBpbnZhcmlhbnQgbWVzc2FnZSB3aWxsIGJlIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgaW52YXJpYW50XG4gKiB3aWxsIHJlbWFpbiB0byBlbnN1cmUgbG9naWMgZG9lcyBub3QgZGlmZmVyIGluIHByb2R1Y3Rpb24uXG4gKi9cblxudmFyIGludmFyaWFudCA9IGZ1bmN0aW9uKGNvbmRpdGlvbiwgZm9ybWF0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFyaWFudCByZXF1aXJlcyBhbiBlcnJvciBtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB2YXIgZXJyb3I7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgJ01pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50ICcgK1xuICAgICAgICAnZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IFthLCBiLCBjLCBkLCBlLCBmXTtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJnc1thcmdJbmRleCsrXTsgfSlcbiAgICAgICk7XG4gICAgICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIH1cblxuICAgIGVycm9yLmZyYW1lc1RvUG9wID0gMTsgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCBpbnZhcmlhbnQncyBvd24gZnJhbWVcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbnZhcmlhbnQ7XG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG4vKipcclxuICogSXMgdGhpcyBzdHJpbmcgYWxsIHdoaXRlc3BhY2U/XHJcbiAqIFRoaXMgc29sdXRpb24ga2luZCBvZiBtYWtlcyBteSBicmFpbiBodXJ0LCBidXQgaXQncyBzaWduaWZpY2FudGx5IGZhc3RlclxyXG4gKiB0aGFuICFzdHIudHJpbSgpIG9yIGFueSBvdGhlciBzb2x1dGlvbiBJIGNvdWxkIGZpbmQuXHJcbiAqXHJcbiAqIHdoaXRlc3BhY2UgY29kZXMgZnJvbTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XaGl0ZXNwYWNlX2NoYXJhY3RlclxyXG4gKiBhbmQgdmVyaWZpZWQgd2l0aDpcclxuICpcclxuICogIGZvcih2YXIgaSA9IDA7IGkgPCA2NTUzNjsgaSsrKSB7XHJcbiAqICAgICAgdmFyIHMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpO1xyXG4gKiAgICAgIGlmKCtzPT09MCAmJiAhcy50cmltKCkpIGNvbnNvbGUubG9nKGksIHMpO1xyXG4gKiAgfVxyXG4gKlxyXG4gKiB3aGljaCBjb3VudHMgYSBjb3VwbGUgb2YgdGhlc2UgYXMgKm5vdCogd2hpdGVzcGFjZSwgYnV0IGZpbmRzIG5vdGhpbmcgZWxzZVxyXG4gKiB0aGF0ICppcyogd2hpdGVzcGFjZS4gTm90ZSB0aGF0IGNoYXJDb2RlQXQgc3RvcHMgYXQgMTYgYml0cywgYnV0IGl0IGFwcGVhcnNcclxuICogdGhhdCB0aGVyZSBhcmUgbm8gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFib3ZlIHRoaXMsIGFuZCBjb2RlIHBvaW50cyBhYm92ZVxyXG4gKiB0aGlzIGRvIG5vdCBtYXAgb250byB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzLlxyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc3RyKXtcclxuICAgIHZhciBsID0gc3RyLmxlbmd0aCxcclxuICAgICAgICBhO1xyXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGEgPSBzdHIuY2hhckNvZGVBdChpKTtcclxuICAgICAgICBpZigoYSA8IDkgfHwgYSA+IDEzKSAmJiAoYSAhPT0gMzIpICYmIChhICE9PSAxMzMpICYmIChhICE9PSAxNjApICYmXHJcbiAgICAgICAgICAgIChhICE9PSA1NzYwKSAmJiAoYSAhPT0gNjE1OCkgJiYgKGEgPCA4MTkyIHx8IGEgPiA4MjA1KSAmJlxyXG4gICAgICAgICAgICAoYSAhPT0gODIzMikgJiYgKGEgIT09IDgyMzMpICYmIChhICE9PSA4MjM5KSAmJiAoYSAhPT0gODI4NykgJiZcclxuICAgICAgICAgICAgKGEgIT09IDgyODgpICYmIChhICE9PSAxMjI4OCkgJiYgKGEgIT09IDY1Mjc5KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbiIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImxheW91dEJhc2VcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wibGF5b3V0QmFzZVwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDI4KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gTGF5b3V0Q29uc3RhbnRzKCkge31cblxuLyoqXHJcbiAqIExheW91dCBRdWFsaXR5OiAwOmRyYWZ0LCAxOmRlZmF1bHQsIDI6cHJvb2ZcclxuICovXG5MYXlvdXRDb25zdGFudHMuUVVBTElUWSA9IDE7XG5cbi8qKlxyXG4gKiBEZWZhdWx0IHBhcmFtZXRlcnNcclxuICovXG5MYXlvdXRDb25zdGFudHMuREVGQVVMVF9DUkVBVEVfQkVORFNfQVNfTkVFREVEID0gZmFsc2U7XG5MYXlvdXRDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTCA9IGZhbHNlO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX09OX0xBWU9VVCA9IHRydWU7XG5MYXlvdXRDb25zdGFudHMuREVGQVVMVF9BTklNQVRJT05fRFVSSU5HX0xBWU9VVCA9IGZhbHNlO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX1BFUklPRCA9IDUwO1xuTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfVU5JRk9STV9MRUFGX05PREVfU0laRVMgPSBmYWxzZTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlY3Rpb246IEdlbmVyYWwgb3RoZXIgY29uc3RhbnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLypcclxuICogTWFyZ2lucyBvZiBhIGdyYXBoIHRvIGJlIGFwcGxpZWQgb24gYm91ZGluZyByZWN0YW5nbGUgb2YgaXRzIGNvbnRlbnRzLiBXZVxyXG4gKiBhc3N1bWUgbWFyZ2lucyBvbiBhbGwgZm91ciBzaWRlcyB0byBiZSB1bmlmb3JtLlxyXG4gKi9cbkxheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVBIX01BUkdJTiA9IDE1O1xuXG4vKlxyXG4gKiBXaGV0aGVyIHRvIGNvbnNpZGVyIGxhYmVscyBpbiBub2RlIGRpbWVuc2lvbnMgb3Igbm90XHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyA9IGZhbHNlO1xuXG4vKlxyXG4gKiBEZWZhdWx0IGRpbWVuc2lvbiBvZiBhIG5vbi1jb21wb3VuZCBub2RlLlxyXG4gKi9cbkxheW91dENvbnN0YW50cy5TSU1QTEVfTk9ERV9TSVpFID0gNDA7XG5cbi8qXHJcbiAqIERlZmF1bHQgZGltZW5zaW9uIG9mIGEgbm9uLWNvbXBvdW5kIG5vZGUuXHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLlNJTVBMRV9OT0RFX0hBTEZfU0laRSA9IExheW91dENvbnN0YW50cy5TSU1QTEVfTk9ERV9TSVpFIC8gMjtcblxuLypcclxuICogRW1wdHkgY29tcG91bmQgbm9kZSBzaXplLiBXaGVuIGEgY29tcG91bmQgbm9kZSBpcyBlbXB0eSwgaXRzIGJvdGhcclxuICogZGltZW5zaW9ucyBzaG91bGQgYmUgb2YgdGhpcyB2YWx1ZS5cclxuICovXG5MYXlvdXRDb25zdGFudHMuRU1QVFlfQ09NUE9VTkRfTk9ERV9TSVpFID0gNDA7XG5cbi8qXHJcbiAqIE1pbmltdW0gbGVuZ3RoIHRoYXQgYW4gZWRnZSBzaG91bGQgdGFrZSBkdXJpbmcgbGF5b3V0XHJcbiAqL1xuTGF5b3V0Q29uc3RhbnRzLk1JTl9FREdFX0xFTkdUSCA9IDE7XG5cbi8qXHJcbiAqIFdvcmxkIGJvdW5kYXJpZXMgdGhhdCBsYXlvdXQgb3BlcmF0ZXMgb25cclxuICovXG5MYXlvdXRDb25zdGFudHMuV09STERfQk9VTkRBUlkgPSAxMDAwMDAwO1xuXG4vKlxyXG4gKiBXb3JsZCBib3VuZGFyaWVzIHRoYXQgcmFuZG9tIHBvc2l0aW9uaW5nIGNhbiBiZSBwZXJmb3JtZWQgd2l0aFxyXG4gKi9cbkxheW91dENvbnN0YW50cy5JTklUSUFMX1dPUkxEX0JPVU5EQVJZID0gTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZIC8gMTAwMDtcblxuLypcclxuICogQ29vcmRpbmF0ZXMgb2YgdGhlIHdvcmxkIGNlbnRlclxyXG4gKi9cbkxheW91dENvbnN0YW50cy5XT1JMRF9DRU5URVJfWCA9IDEyMDA7XG5MYXlvdXRDb25zdGFudHMuV09STERfQ0VOVEVSX1kgPSA5MDA7XG5cbm1vZHVsZS5leHBvcnRzID0gTGF5b3V0Q29uc3RhbnRzO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIExHcmFwaE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG52YXIgSUdlb21ldHJ5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcbnZhciBJTWF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cbmZ1bmN0aW9uIExFZGdlKHNvdXJjZSwgdGFyZ2V0LCB2RWRnZSkge1xuICBMR3JhcGhPYmplY3QuY2FsbCh0aGlzLCB2RWRnZSk7XG5cbiAgdGhpcy5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQgPSBmYWxzZTtcbiAgdGhpcy52R3JhcGhPYmplY3QgPSB2RWRnZTtcbiAgdGhpcy5iZW5kcG9pbnRzID0gW107XG4gIHRoaXMuc291cmNlID0gc291cmNlO1xuICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbn1cblxuTEVkZ2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGhPYmplY3QucHJvdG90eXBlKTtcblxuZm9yICh2YXIgcHJvcCBpbiBMR3JhcGhPYmplY3QpIHtcbiAgTEVkZ2VbcHJvcF0gPSBMR3JhcGhPYmplY3RbcHJvcF07XG59XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRTb3VyY2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnNvdXJjZTtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnRhcmdldDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5pc0ludGVyR3JhcGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmlzSW50ZXJHcmFwaDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxlbmd0aDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmlzT3ZlcmxhcGluZ1NvdXJjZUFuZFRhcmdldDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRCZW5kcG9pbnRzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5iZW5kcG9pbnRzO1xufTtcblxuTEVkZ2UucHJvdG90eXBlLmdldExjYSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubGNhO1xufTtcblxuTEVkZ2UucHJvdG90eXBlLmdldFNvdXJjZUluTGNhID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5zb3VyY2VJbkxjYTtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS5nZXRUYXJnZXRJbkxjYSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudGFyZ2V0SW5MY2E7XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuZ2V0T3RoZXJFbmQgPSBmdW5jdGlvbiAobm9kZSkge1xuICBpZiAodGhpcy5zb3VyY2UgPT09IG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy50YXJnZXQ7XG4gIH0gZWxzZSBpZiAodGhpcy50YXJnZXQgPT09IG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2U7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgXCJOb2RlIGlzIG5vdCBpbmNpZGVudCB3aXRoIHRoaXMgZWRnZVwiO1xuICB9XG59O1xuXG5MRWRnZS5wcm90b3R5cGUuZ2V0T3RoZXJFbmRJbkdyYXBoID0gZnVuY3Rpb24gKG5vZGUsIGdyYXBoKSB7XG4gIHZhciBvdGhlckVuZCA9IHRoaXMuZ2V0T3RoZXJFbmQobm9kZSk7XG4gIHZhciByb290ID0gZ3JhcGguZ2V0R3JhcGhNYW5hZ2VyKCkuZ2V0Um9vdCgpO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKG90aGVyRW5kLmdldE93bmVyKCkgPT0gZ3JhcGgpIHtcbiAgICAgIHJldHVybiBvdGhlckVuZDtcbiAgICB9XG5cbiAgICBpZiAob3RoZXJFbmQuZ2V0T3duZXIoKSA9PSByb290KSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBvdGhlckVuZCA9IG90aGVyRW5kLmdldE93bmVyKCkuZ2V0UGFyZW50KCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbkxFZGdlLnByb3RvdHlwZS51cGRhdGVMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjbGlwUG9pbnRDb29yZGluYXRlcyA9IG5ldyBBcnJheSg0KTtcblxuICB0aGlzLmlzT3ZlcmxhcGluZ1NvdXJjZUFuZFRhcmdldCA9IElHZW9tZXRyeS5nZXRJbnRlcnNlY3Rpb24odGhpcy50YXJnZXQuZ2V0UmVjdCgpLCB0aGlzLnNvdXJjZS5nZXRSZWN0KCksIGNsaXBQb2ludENvb3JkaW5hdGVzKTtcblxuICBpZiAoIXRoaXMuaXNPdmVybGFwaW5nU291cmNlQW5kVGFyZ2V0KSB7XG4gICAgdGhpcy5sZW5ndGhYID0gY2xpcFBvaW50Q29vcmRpbmF0ZXNbMF0gLSBjbGlwUG9pbnRDb29yZGluYXRlc1syXTtcbiAgICB0aGlzLmxlbmd0aFkgPSBjbGlwUG9pbnRDb29yZGluYXRlc1sxXSAtIGNsaXBQb2ludENvb3JkaW5hdGVzWzNdO1xuXG4gICAgaWYgKE1hdGguYWJzKHRoaXMubGVuZ3RoWCkgPCAxLjApIHtcbiAgICAgIHRoaXMubGVuZ3RoWCA9IElNYXRoLnNpZ24odGhpcy5sZW5ndGhYKTtcbiAgICB9XG5cbiAgICBpZiAoTWF0aC5hYnModGhpcy5sZW5ndGhZKSA8IDEuMCkge1xuICAgICAgdGhpcy5sZW5ndGhZID0gSU1hdGguc2lnbih0aGlzLmxlbmd0aFkpO1xuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5zcXJ0KHRoaXMubGVuZ3RoWCAqIHRoaXMubGVuZ3RoWCArIHRoaXMubGVuZ3RoWSAqIHRoaXMubGVuZ3RoWSk7XG4gIH1cbn07XG5cbkxFZGdlLnByb3RvdHlwZS51cGRhdGVMZW5ndGhTaW1wbGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMubGVuZ3RoWCA9IHRoaXMudGFyZ2V0LmdldENlbnRlclgoKSAtIHRoaXMuc291cmNlLmdldENlbnRlclgoKTtcbiAgdGhpcy5sZW5ndGhZID0gdGhpcy50YXJnZXQuZ2V0Q2VudGVyWSgpIC0gdGhpcy5zb3VyY2UuZ2V0Q2VudGVyWSgpO1xuXG4gIGlmIChNYXRoLmFicyh0aGlzLmxlbmd0aFgpIDwgMS4wKSB7XG4gICAgdGhpcy5sZW5ndGhYID0gSU1hdGguc2lnbih0aGlzLmxlbmd0aFgpO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKHRoaXMubGVuZ3RoWSkgPCAxLjApIHtcbiAgICB0aGlzLmxlbmd0aFkgPSBJTWF0aC5zaWduKHRoaXMubGVuZ3RoWSk7XG4gIH1cblxuICB0aGlzLmxlbmd0aCA9IE1hdGguc3FydCh0aGlzLmxlbmd0aFggKiB0aGlzLmxlbmd0aFggKyB0aGlzLmxlbmd0aFkgKiB0aGlzLmxlbmd0aFkpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBMRWRnZTtcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIExHcmFwaE9iamVjdCh2R3JhcGhPYmplY3QpIHtcbiAgdGhpcy52R3JhcGhPYmplY3QgPSB2R3JhcGhPYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTEdyYXBoT2JqZWN0O1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIExHcmFwaE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG52YXIgSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xudmFyIFJlY3RhbmdsZUQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIFJhbmRvbVNlZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcbnZhciBQb2ludEQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXG5mdW5jdGlvbiBMTm9kZShnbSwgbG9jLCBzaXplLCB2Tm9kZSkge1xuICAvL0FsdGVybmF0aXZlIGNvbnN0cnVjdG9yIDEgOiBMTm9kZShMR3JhcGhNYW5hZ2VyIGdtLCBQb2ludCBsb2MsIERpbWVuc2lvbiBzaXplLCBPYmplY3Qgdk5vZGUpXG4gIGlmIChzaXplID09IG51bGwgJiYgdk5vZGUgPT0gbnVsbCkge1xuICAgIHZOb2RlID0gbG9jO1xuICB9XG5cbiAgTEdyYXBoT2JqZWN0LmNhbGwodGhpcywgdk5vZGUpO1xuXG4gIC8vQWx0ZXJuYXRpdmUgY29uc3RydWN0b3IgMiA6IExOb2RlKExheW91dCBsYXlvdXQsIE9iamVjdCB2Tm9kZSlcbiAgaWYgKGdtLmdyYXBoTWFuYWdlciAhPSBudWxsKSBnbSA9IGdtLmdyYXBoTWFuYWdlcjtcblxuICB0aGlzLmVzdGltYXRlZFNpemUgPSBJbnRlZ2VyLk1JTl9WQUxVRTtcbiAgdGhpcy5pbmNsdXNpb25UcmVlRGVwdGggPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdGhpcy52R3JhcGhPYmplY3QgPSB2Tm9kZTtcbiAgdGhpcy5lZGdlcyA9IFtdO1xuICB0aGlzLmdyYXBoTWFuYWdlciA9IGdtO1xuXG4gIGlmIChzaXplICE9IG51bGwgJiYgbG9jICE9IG51bGwpIHRoaXMucmVjdCA9IG5ldyBSZWN0YW5nbGVEKGxvYy54LCBsb2MueSwgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpO2Vsc2UgdGhpcy5yZWN0ID0gbmV3IFJlY3RhbmdsZUQoKTtcbn1cblxuTE5vZGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGhPYmplY3QucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gTEdyYXBoT2JqZWN0KSB7XG4gIExOb2RlW3Byb3BdID0gTEdyYXBoT2JqZWN0W3Byb3BdO1xufVxuXG5MTm9kZS5wcm90b3R5cGUuZ2V0RWRnZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmVkZ2VzO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldENoaWxkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5jaGlsZDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRPd25lciA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gIGlmICh0aGlzLm93bmVyICE9IG51bGwpIHtcbiAgLy8gICAgaWYgKCEodGhpcy5vd25lciA9PSBudWxsIHx8IHRoaXMub3duZXIuZ2V0Tm9kZXMoKS5pbmRleE9mKHRoaXMpID4gLTEpKSB7XG4gIC8vICAgICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIC8vICAgIH1cbiAgLy8gIH1cblxuICByZXR1cm4gdGhpcy5vd25lcjtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmVjdC53aWR0aDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5zZXRXaWR0aCA9IGZ1bmN0aW9uICh3aWR0aCkge1xuICB0aGlzLnJlY3Qud2lkdGggPSB3aWR0aDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QuaGVpZ2h0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLnNldEhlaWdodCA9IGZ1bmN0aW9uIChoZWlnaHQpIHtcbiAgdGhpcy5yZWN0LmhlaWdodCA9IGhlaWdodDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRDZW50ZXJYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0LnggKyB0aGlzLnJlY3Qud2lkdGggLyAyO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldENlbnRlclkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueSArIHRoaXMucmVjdC5oZWlnaHQgLyAyO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldENlbnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBQb2ludEQodGhpcy5yZWN0LnggKyB0aGlzLnJlY3Qud2lkdGggLyAyLCB0aGlzLnJlY3QueSArIHRoaXMucmVjdC5oZWlnaHQgLyAyKTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRMb2NhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBQb2ludEQodGhpcy5yZWN0LngsIHRoaXMucmVjdC55KTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRSZWN0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldERpYWdvbmFsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMucmVjdC53aWR0aCAqIHRoaXMucmVjdC53aWR0aCArIHRoaXMucmVjdC5oZWlnaHQgKiB0aGlzLnJlY3QuaGVpZ2h0KTtcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBoYWxmIHRoZSBkaWFnb25hbCBsZW5ndGggb2YgdGhpcyBub2RlLlxuICovXG5MTm9kZS5wcm90b3R5cGUuZ2V0SGFsZlRoZURpYWdvbmFsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMucmVjdC5oZWlnaHQgKiB0aGlzLnJlY3QuaGVpZ2h0ICsgdGhpcy5yZWN0LndpZHRoICogdGhpcy5yZWN0LndpZHRoKSAvIDI7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuc2V0UmVjdCA9IGZ1bmN0aW9uICh1cHBlckxlZnQsIGRpbWVuc2lvbikge1xuICB0aGlzLnJlY3QueCA9IHVwcGVyTGVmdC54O1xuICB0aGlzLnJlY3QueSA9IHVwcGVyTGVmdC55O1xuICB0aGlzLnJlY3Qud2lkdGggPSBkaW1lbnNpb24ud2lkdGg7XG4gIHRoaXMucmVjdC5oZWlnaHQgPSBkaW1lbnNpb24uaGVpZ2h0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLnNldENlbnRlciA9IGZ1bmN0aW9uIChjeCwgY3kpIHtcbiAgdGhpcy5yZWN0LnggPSBjeCAtIHRoaXMucmVjdC53aWR0aCAvIDI7XG4gIHRoaXMucmVjdC55ID0gY3kgLSB0aGlzLnJlY3QuaGVpZ2h0IC8gMjtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5zZXRMb2NhdGlvbiA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gIHRoaXMucmVjdC54ID0geDtcbiAgdGhpcy5yZWN0LnkgPSB5O1xufTtcblxuTE5vZGUucHJvdG90eXBlLm1vdmVCeSA9IGZ1bmN0aW9uIChkeCwgZHkpIHtcbiAgdGhpcy5yZWN0LnggKz0gZHg7XG4gIHRoaXMucmVjdC55ICs9IGR5O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldEVkZ2VMaXN0VG9Ob2RlID0gZnVuY3Rpb24gKHRvKSB7XG4gIHZhciBlZGdlTGlzdCA9IFtdO1xuICB2YXIgZWRnZTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHNlbGYuZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuXG4gICAgaWYgKGVkZ2UudGFyZ2V0ID09IHRvKSB7XG4gICAgICBpZiAoZWRnZS5zb3VyY2UgIT0gc2VsZikgdGhyb3cgXCJJbmNvcnJlY3QgZWRnZSBzb3VyY2UhXCI7XG5cbiAgICAgIGVkZ2VMaXN0LnB1c2goZWRnZSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZWRnZUxpc3Q7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0RWRnZXNCZXR3ZWVuID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gIHZhciBlZGdlTGlzdCA9IFtdO1xuICB2YXIgZWRnZTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYuZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuXG4gICAgaWYgKCEoZWRnZS5zb3VyY2UgPT0gc2VsZiB8fCBlZGdlLnRhcmdldCA9PSBzZWxmKSkgdGhyb3cgXCJJbmNvcnJlY3QgZWRnZSBzb3VyY2UgYW5kL29yIHRhcmdldFwiO1xuXG4gICAgaWYgKGVkZ2UudGFyZ2V0ID09IG90aGVyIHx8IGVkZ2Uuc291cmNlID09IG90aGVyKSB7XG4gICAgICBlZGdlTGlzdC5wdXNoKGVkZ2UpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGVkZ2VMaXN0O1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldE5laWdoYm9yc0xpc3QgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBuZWlnaGJvcnMgPSBuZXcgU2V0KCk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcblxuICAgIGlmIChlZGdlLnNvdXJjZSA9PSBzZWxmKSB7XG4gICAgICBuZWlnaGJvcnMuYWRkKGVkZ2UudGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVkZ2UudGFyZ2V0ICE9IHNlbGYpIHtcbiAgICAgICAgdGhyb3cgXCJJbmNvcnJlY3QgaW5jaWRlbmN5IVwiO1xuICAgICAgfVxuXG4gICAgICBuZWlnaGJvcnMuYWRkKGVkZ2Uuc291cmNlKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBuZWlnaGJvcnM7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUud2l0aENoaWxkcmVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgd2l0aE5laWdoYm9yc0xpc3QgPSBuZXcgU2V0KCk7XG4gIHZhciBjaGlsZE5vZGU7XG4gIHZhciBjaGlsZHJlbjtcblxuICB3aXRoTmVpZ2hib3JzTGlzdC5hZGQodGhpcyk7XG5cbiAgaWYgKHRoaXMuY2hpbGQgIT0gbnVsbCkge1xuICAgIHZhciBub2RlcyA9IHRoaXMuY2hpbGQuZ2V0Tm9kZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZE5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIGNoaWxkcmVuID0gY2hpbGROb2RlLndpdGhDaGlsZHJlbigpO1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB3aXRoTmVpZ2hib3JzTGlzdC5hZGQobm9kZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd2l0aE5laWdoYm9yc0xpc3Q7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0Tm9PZkNoaWxkcmVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm9PZkNoaWxkcmVuID0gMDtcbiAgdmFyIGNoaWxkTm9kZTtcblxuICBpZiAodGhpcy5jaGlsZCA9PSBudWxsKSB7XG4gICAgbm9PZkNoaWxkcmVuID0gMTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLmNoaWxkLmdldE5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGROb2RlID0gbm9kZXNbaV07XG5cbiAgICAgIG5vT2ZDaGlsZHJlbiArPSBjaGlsZE5vZGUuZ2V0Tm9PZkNoaWxkcmVuKCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG5vT2ZDaGlsZHJlbiA9PSAwKSB7XG4gICAgbm9PZkNoaWxkcmVuID0gMTtcbiAgfVxuICByZXR1cm4gbm9PZkNoaWxkcmVuO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmdldEVzdGltYXRlZFNpemUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmVzdGltYXRlZFNpemUgPT0gSW50ZWdlci5NSU5fVkFMVUUpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuICByZXR1cm4gdGhpcy5lc3RpbWF0ZWRTaXplO1xufTtcblxuTE5vZGUucHJvdG90eXBlLmNhbGNFc3RpbWF0ZWRTaXplID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jaGlsZCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuZXN0aW1hdGVkU2l6ZSA9ICh0aGlzLnJlY3Qud2lkdGggKyB0aGlzLnJlY3QuaGVpZ2h0KSAvIDI7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5lc3RpbWF0ZWRTaXplID0gdGhpcy5jaGlsZC5jYWxjRXN0aW1hdGVkU2l6ZSgpO1xuICAgIHRoaXMucmVjdC53aWR0aCA9IHRoaXMuZXN0aW1hdGVkU2l6ZTtcbiAgICB0aGlzLnJlY3QuaGVpZ2h0ID0gdGhpcy5lc3RpbWF0ZWRTaXplO1xuXG4gICAgcmV0dXJuIHRoaXMuZXN0aW1hdGVkU2l6ZTtcbiAgfVxufTtcblxuTE5vZGUucHJvdG90eXBlLnNjYXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByYW5kb21DZW50ZXJYO1xuICB2YXIgcmFuZG9tQ2VudGVyWTtcblxuICB2YXIgbWluWCA9IC1MYXlvdXRDb25zdGFudHMuSU5JVElBTF9XT1JMRF9CT1VOREFSWTtcbiAgdmFyIG1heFggPSBMYXlvdXRDb25zdGFudHMuSU5JVElBTF9XT1JMRF9CT1VOREFSWTtcbiAgcmFuZG9tQ2VudGVyWCA9IExheW91dENvbnN0YW50cy5XT1JMRF9DRU5URVJfWCArIFJhbmRvbVNlZWQubmV4dERvdWJsZSgpICogKG1heFggLSBtaW5YKSArIG1pblg7XG5cbiAgdmFyIG1pblkgPSAtTGF5b3V0Q29uc3RhbnRzLklOSVRJQUxfV09STERfQk9VTkRBUlk7XG4gIHZhciBtYXhZID0gTGF5b3V0Q29uc3RhbnRzLklOSVRJQUxfV09STERfQk9VTkRBUlk7XG4gIHJhbmRvbUNlbnRlclkgPSBMYXlvdXRDb25zdGFudHMuV09STERfQ0VOVEVSX1kgKyBSYW5kb21TZWVkLm5leHREb3VibGUoKSAqIChtYXhZIC0gbWluWSkgKyBtaW5ZO1xuXG4gIHRoaXMucmVjdC54ID0gcmFuZG9tQ2VudGVyWDtcbiAgdGhpcy5yZWN0LnkgPSByYW5kb21DZW50ZXJZO1xufTtcblxuTE5vZGUucHJvdG90eXBlLnVwZGF0ZUJvdW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuZ2V0Q2hpbGQoKSA9PSBudWxsKSB7XG4gICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIH1cbiAgaWYgKHRoaXMuZ2V0Q2hpbGQoKS5nZXROb2RlcygpLmxlbmd0aCAhPSAwKSB7XG4gICAgLy8gd3JhcCB0aGUgY2hpbGRyZW4gbm9kZXMgYnkgcmUtYXJyYW5naW5nIHRoZSBib3VuZGFyaWVzXG4gICAgdmFyIGNoaWxkR3JhcGggPSB0aGlzLmdldENoaWxkKCk7XG4gICAgY2hpbGRHcmFwaC51cGRhdGVCb3VuZHModHJ1ZSk7XG5cbiAgICB0aGlzLnJlY3QueCA9IGNoaWxkR3JhcGguZ2V0TGVmdCgpO1xuICAgIHRoaXMucmVjdC55ID0gY2hpbGRHcmFwaC5nZXRUb3AoKTtcblxuICAgIHRoaXMuc2V0V2lkdGgoY2hpbGRHcmFwaC5nZXRSaWdodCgpIC0gY2hpbGRHcmFwaC5nZXRMZWZ0KCkpO1xuICAgIHRoaXMuc2V0SGVpZ2h0KGNoaWxkR3JhcGguZ2V0Qm90dG9tKCkgLSBjaGlsZEdyYXBoLmdldFRvcCgpKTtcblxuICAgIC8vIFVwZGF0ZSBjb21wb3VuZCBib3VuZHMgY29uc2lkZXJpbmcgaXRzIGxhYmVsIHByb3BlcnRpZXMgICAgXG4gICAgaWYgKExheW91dENvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMpIHtcblxuICAgICAgdmFyIHdpZHRoID0gY2hpbGRHcmFwaC5nZXRSaWdodCgpIC0gY2hpbGRHcmFwaC5nZXRMZWZ0KCk7XG4gICAgICB2YXIgaGVpZ2h0ID0gY2hpbGRHcmFwaC5nZXRCb3R0b20oKSAtIGNoaWxkR3JhcGguZ2V0VG9wKCk7XG5cbiAgICAgIGlmICh0aGlzLmxhYmVsV2lkdGgpIHtcbiAgICAgICAgaWYgKHRoaXMubGFiZWxQb3NIb3Jpem9udGFsID09IFwibGVmdFwiKSB7XG4gICAgICAgICAgdGhpcy5yZWN0LnggLT0gdGhpcy5sYWJlbFdpZHRoO1xuICAgICAgICAgIHRoaXMuc2V0V2lkdGgod2lkdGggKyB0aGlzLmxhYmVsV2lkdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGFiZWxQb3NIb3Jpem9udGFsID09IFwiY2VudGVyXCIgJiYgdGhpcy5sYWJlbFdpZHRoID4gd2lkdGgpIHtcbiAgICAgICAgICB0aGlzLnJlY3QueCAtPSAodGhpcy5sYWJlbFdpZHRoIC0gd2lkdGgpIC8gMjtcbiAgICAgICAgICB0aGlzLnNldFdpZHRoKHRoaXMubGFiZWxXaWR0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sYWJlbFBvc0hvcml6b250YWwgPT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgdGhpcy5zZXRXaWR0aCh3aWR0aCArIHRoaXMubGFiZWxXaWR0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubGFiZWxIZWlnaHQpIHtcbiAgICAgICAgaWYgKHRoaXMubGFiZWxQb3NWZXJ0aWNhbCA9PSBcInRvcFwiKSB7XG4gICAgICAgICAgdGhpcy5yZWN0LnkgLT0gdGhpcy5sYWJlbEhlaWdodDtcbiAgICAgICAgICB0aGlzLnNldEhlaWdodChoZWlnaHQgKyB0aGlzLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhYmVsUG9zVmVydGljYWwgPT0gXCJjZW50ZXJcIiAmJiB0aGlzLmxhYmVsSGVpZ2h0ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgdGhpcy5yZWN0LnkgLT0gKHRoaXMubGFiZWxIZWlnaHQgLSBoZWlnaHQpIC8gMjtcbiAgICAgICAgICB0aGlzLnNldEhlaWdodCh0aGlzLmxhYmVsSGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhYmVsUG9zVmVydGljYWwgPT0gXCJib3R0b21cIikge1xuICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KGhlaWdodCArIHRoaXMubGFiZWxIZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0SW5jbHVzaW9uVHJlZURlcHRoID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5pbmNsdXNpb25UcmVlRGVwdGggPT0gSW50ZWdlci5NQVhfVkFMVUUpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuICByZXR1cm4gdGhpcy5pbmNsdXNpb25UcmVlRGVwdGg7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHRyYW5zKSB7XG4gIHZhciBsZWZ0ID0gdGhpcy5yZWN0Lng7XG5cbiAgaWYgKGxlZnQgPiBMYXlvdXRDb25zdGFudHMuV09STERfQk9VTkRBUlkpIHtcbiAgICBsZWZ0ID0gTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZO1xuICB9IGVsc2UgaWYgKGxlZnQgPCAtTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZKSB7XG4gICAgbGVmdCA9IC1MYXlvdXRDb25zdGFudHMuV09STERfQk9VTkRBUlk7XG4gIH1cblxuICB2YXIgdG9wID0gdGhpcy5yZWN0Lnk7XG5cbiAgaWYgKHRvcCA+IExheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWSkge1xuICAgIHRvcCA9IExheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWTtcbiAgfSBlbHNlIGlmICh0b3AgPCAtTGF5b3V0Q29uc3RhbnRzLldPUkxEX0JPVU5EQVJZKSB7XG4gICAgdG9wID0gLUxheW91dENvbnN0YW50cy5XT1JMRF9CT1VOREFSWTtcbiAgfVxuXG4gIHZhciBsZWZ0VG9wID0gbmV3IFBvaW50RChsZWZ0LCB0b3ApO1xuICB2YXIgdkxlZnRUb3AgPSB0cmFucy5pbnZlcnNlVHJhbnNmb3JtUG9pbnQobGVmdFRvcCk7XG5cbiAgdGhpcy5zZXRMb2NhdGlvbih2TGVmdFRvcC54LCB2TGVmdFRvcC55KTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRMZWZ0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZWN0Lng7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0UmlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueCArIHRoaXMucmVjdC53aWR0aDtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRUb3AgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueTtcbn07XG5cbkxOb2RlLnByb3RvdHlwZS5nZXRCb3R0b20gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlY3QueSArIHRoaXMucmVjdC5oZWlnaHQ7XG59O1xuXG5MTm9kZS5wcm90b3R5cGUuZ2V0UGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5vd25lciA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdGhpcy5vd25lci5nZXRQYXJlbnQoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTE5vZGU7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuZnVuY3Rpb24gRkRMYXlvdXRDb25zdGFudHMoKSB7fVxuXG4vL0ZETGF5b3V0Q29uc3RhbnRzIGluaGVyaXRzIHN0YXRpYyBwcm9wcyBpbiBMYXlvdXRDb25zdGFudHNcbmZvciAodmFyIHByb3AgaW4gTGF5b3V0Q29uc3RhbnRzKSB7XG4gIEZETGF5b3V0Q29uc3RhbnRzW3Byb3BdID0gTGF5b3V0Q29uc3RhbnRzW3Byb3BdO1xufVxuXG5GRExheW91dENvbnN0YW50cy5NQVhfSVRFUkFUSU9OUyA9IDI1MDA7XG5cbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSA1MDtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfU1BSSU5HX1NUUkVOR1RIID0gMC40NTtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfUkVQVUxTSU9OX1NUUkVOR1RIID0gNDUwMC4wO1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1NUUkVOR1RIID0gMC40O1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1NUUkVOR1RIID0gMS4wO1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUiA9IDMuODtcbkZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9SQU5HRV9GQUNUT1IgPSAxLjU7XG5GRExheW91dENvbnN0YW50cy5ERUZBVUxUX1VTRV9TTUFSVF9JREVBTF9FREdFX0xFTkdUSF9DQUxDVUxBVElPTiA9IHRydWU7XG5GRExheW91dENvbnN0YW50cy5ERUZBVUxUX1VTRV9TTUFSVF9SRVBVTFNJT05fUkFOR0VfQ0FMQ1VMQVRJT04gPSB0cnVlO1xuRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCA9IDAuMztcbkZETGF5b3V0Q29uc3RhbnRzLkNPT0xJTkdfQURBUFRBVElPTl9GQUNUT1IgPSAwLjMzO1xuRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9MT1dFUl9OT0RFX0xJTUlUID0gMTAwMDtcbkZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fVVBQRVJfTk9ERV9MSU1JVCA9IDUwMDA7XG5GRExheW91dENvbnN0YW50cy5NQVhfTk9ERV9ESVNQTEFDRU1FTlRfSU5DUkVNRU5UQUwgPSAxMDAuMDtcbkZETGF5b3V0Q29uc3RhbnRzLk1BWF9OT0RFX0RJU1BMQUNFTUVOVCA9IEZETGF5b3V0Q29uc3RhbnRzLk1BWF9OT0RFX0RJU1BMQUNFTUVOVF9JTkNSRU1FTlRBTCAqIDM7XG5GRExheW91dENvbnN0YW50cy5NSU5fUkVQVUxTSU9OX0RJU1QgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC8gMTAuMDtcbkZETGF5b3V0Q29uc3RhbnRzLkNPTlZFUkdFTkNFX0NIRUNLX1BFUklPRCA9IDEwMDtcbkZETGF5b3V0Q29uc3RhbnRzLlBFUl9MRVZFTF9JREVBTF9FREdFX0xFTkdUSF9GQUNUT1IgPSAwLjE7XG5GRExheW91dENvbnN0YW50cy5NSU5fRURHRV9MRU5HVEggPSAxO1xuRkRMYXlvdXRDb25zdGFudHMuR1JJRF9DQUxDVUxBVElPTl9DSEVDS19QRVJJT0QgPSAxMDtcblxubW9kdWxlLmV4cG9ydHMgPSBGRExheW91dENvbnN0YW50cztcblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIFBvaW50RCh4LCB5KSB7XG4gIGlmICh4ID09IG51bGwgJiYgeSA9PSBudWxsKSB7XG4gICAgdGhpcy54ID0gMDtcbiAgICB0aGlzLnkgPSAwO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgfVxufVxuXG5Qb2ludEQucHJvdG90eXBlLmdldFggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLng7XG59O1xuXG5Qb2ludEQucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnk7XG59O1xuXG5Qb2ludEQucHJvdG90eXBlLnNldFggPSBmdW5jdGlvbiAoeCkge1xuICB0aGlzLnggPSB4O1xufTtcblxuUG9pbnRELnByb3RvdHlwZS5zZXRZID0gZnVuY3Rpb24gKHkpIHtcbiAgdGhpcy55ID0geTtcbn07XG5cblBvaW50RC5wcm90b3R5cGUuZ2V0RGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChwdCkge1xuICByZXR1cm4gbmV3IERpbWVuc2lvbkQodGhpcy54IC0gcHQueCwgdGhpcy55IC0gcHQueSk7XG59O1xuXG5Qb2ludEQucHJvdG90eXBlLmdldENvcHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgUG9pbnREKHRoaXMueCwgdGhpcy55KTtcbn07XG5cblBvaW50RC5wcm90b3R5cGUudHJhbnNsYXRlID0gZnVuY3Rpb24gKGRpbSkge1xuICB0aGlzLnggKz0gZGltLndpZHRoO1xuICB0aGlzLnkgKz0gZGltLmhlaWdodDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvaW50RDtcblxuLyoqKi8gfSksXG4vKiA2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMR3JhcGhPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xudmFyIEludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIExHcmFwaE1hbmFnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xudmFyIExOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbnZhciBMRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG52YXIgUmVjdGFuZ2xlRCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xudmFyIFBvaW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG52YXIgTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXG5mdW5jdGlvbiBMR3JhcGgocGFyZW50LCBvYmoyLCB2R3JhcGgpIHtcbiAgTEdyYXBoT2JqZWN0LmNhbGwodGhpcywgdkdyYXBoKTtcbiAgdGhpcy5lc3RpbWF0ZWRTaXplID0gSW50ZWdlci5NSU5fVkFMVUU7XG4gIHRoaXMubWFyZ2luID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBUEhfTUFSR0lOO1xuICB0aGlzLmVkZ2VzID0gW107XG4gIHRoaXMubm9kZXMgPSBbXTtcbiAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICB0aGlzLnBhcmVudCA9IHBhcmVudDtcblxuICBpZiAob2JqMiAhPSBudWxsICYmIG9iajIgaW5zdGFuY2VvZiBMR3JhcGhNYW5hZ2VyKSB7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIgPSBvYmoyO1xuICB9IGVsc2UgaWYgKG9iajIgIT0gbnVsbCAmJiBvYmoyIGluc3RhbmNlb2YgTGF5b3V0KSB7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIgPSBvYmoyLmdyYXBoTWFuYWdlcjtcbiAgfVxufVxuXG5MR3JhcGgucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMR3JhcGhPYmplY3QucHJvdG90eXBlKTtcbmZvciAodmFyIHByb3AgaW4gTEdyYXBoT2JqZWN0KSB7XG4gIExHcmFwaFtwcm9wXSA9IExHcmFwaE9iamVjdFtwcm9wXTtcbn1cblxuTEdyYXBoLnByb3RvdHlwZS5nZXROb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZXM7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmdldEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5lZGdlcztcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0R3JhcGhNYW5hZ2VyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ncmFwaE1hbmFnZXI7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmdldFBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucGFyZW50O1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5nZXRMZWZ0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sZWZ0O1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5nZXRSaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucmlnaHQ7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmdldFRvcCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudG9wO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5nZXRCb3R0b20gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmJvdHRvbTtcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuaXNDb25uZWN0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAob2JqMSwgc291cmNlTm9kZSwgdGFyZ2V0Tm9kZSkge1xuICBpZiAoc291cmNlTm9kZSA9PSBudWxsICYmIHRhcmdldE5vZGUgPT0gbnVsbCkge1xuICAgIHZhciBuZXdOb2RlID0gb2JqMTtcbiAgICBpZiAodGhpcy5ncmFwaE1hbmFnZXIgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJHcmFwaCBoYXMgbm8gZ3JhcGggbWdyIVwiO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXROb2RlcygpLmluZGV4T2YobmV3Tm9kZSkgPiAtMSkge1xuICAgICAgdGhyb3cgXCJOb2RlIGFscmVhZHkgaW4gZ3JhcGghXCI7XG4gICAgfVxuICAgIG5ld05vZGUub3duZXIgPSB0aGlzO1xuICAgIHRoaXMuZ2V0Tm9kZXMoKS5wdXNoKG5ld05vZGUpO1xuXG4gICAgcmV0dXJuIG5ld05vZGU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5ld0VkZ2UgPSBvYmoxO1xuICAgIGlmICghKHRoaXMuZ2V0Tm9kZXMoKS5pbmRleE9mKHNvdXJjZU5vZGUpID4gLTEgJiYgdGhpcy5nZXROb2RlcygpLmluZGV4T2YodGFyZ2V0Tm9kZSkgPiAtMSkpIHtcbiAgICAgIHRocm93IFwiU291cmNlIG9yIHRhcmdldCBub3QgaW4gZ3JhcGghXCI7XG4gICAgfVxuXG4gICAgaWYgKCEoc291cmNlTm9kZS5vd25lciA9PSB0YXJnZXROb2RlLm93bmVyICYmIHNvdXJjZU5vZGUub3duZXIgPT0gdGhpcykpIHtcbiAgICAgIHRocm93IFwiQm90aCBvd25lcnMgbXVzdCBiZSB0aGlzIGdyYXBoIVwiO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2VOb2RlLm93bmVyICE9IHRhcmdldE5vZGUub3duZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHNldCBzb3VyY2UgYW5kIHRhcmdldFxuICAgIG5ld0VkZ2Uuc291cmNlID0gc291cmNlTm9kZTtcbiAgICBuZXdFZGdlLnRhcmdldCA9IHRhcmdldE5vZGU7XG5cbiAgICAvLyBzZXQgYXMgaW50cmEtZ3JhcGggZWRnZVxuICAgIG5ld0VkZ2UuaXNJbnRlckdyYXBoID0gZmFsc2U7XG5cbiAgICAvLyBhZGQgdG8gZ3JhcGggZWRnZSBsaXN0XG4gICAgdGhpcy5nZXRFZGdlcygpLnB1c2gobmV3RWRnZSk7XG5cbiAgICAvLyBhZGQgdG8gaW5jaWRlbmN5IGxpc3RzXG4gICAgc291cmNlTm9kZS5lZGdlcy5wdXNoKG5ld0VkZ2UpO1xuXG4gICAgaWYgKHRhcmdldE5vZGUgIT0gc291cmNlTm9kZSkge1xuICAgICAgdGFyZ2V0Tm9kZS5lZGdlcy5wdXNoKG5ld0VkZ2UpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdFZGdlO1xuICB9XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIG5vZGUgPSBvYmo7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBMTm9kZSkge1xuICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgIHRocm93IFwiTm9kZSBpcyBudWxsIVwiO1xuICAgIH1cbiAgICBpZiAoIShub2RlLm93bmVyICE9IG51bGwgJiYgbm9kZS5vd25lciA9PSB0aGlzKSkge1xuICAgICAgdGhyb3cgXCJPd25lciBncmFwaCBpcyBpbnZhbGlkIVwiO1xuICAgIH1cbiAgICBpZiAodGhpcy5ncmFwaE1hbmFnZXIgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJPd25lciBncmFwaCBtYW5hZ2VyIGlzIGludmFsaWQhXCI7XG4gICAgfVxuICAgIC8vIHJlbW92ZSBpbmNpZGVudCBlZGdlcyBmaXJzdCAobWFrZSBhIGNvcHkgdG8gZG8gaXQgc2FmZWx5KVxuICAgIHZhciBlZGdlc1RvQmVSZW1vdmVkID0gbm9kZS5lZGdlcy5zbGljZSgpO1xuICAgIHZhciBlZGdlO1xuICAgIHZhciBzID0gZWRnZXNUb0JlUmVtb3ZlZC5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgIGVkZ2UgPSBlZGdlc1RvQmVSZW1vdmVkW2ldO1xuXG4gICAgICBpZiAoZWRnZS5pc0ludGVyR3JhcGgpIHtcbiAgICAgICAgdGhpcy5ncmFwaE1hbmFnZXIucmVtb3ZlKGVkZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWRnZS5zb3VyY2Uub3duZXIucmVtb3ZlKGVkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG5vdyB0aGUgbm9kZSBpdHNlbGZcbiAgICB2YXIgaW5kZXggPSB0aGlzLm5vZGVzLmluZGV4T2Yobm9kZSk7XG4gICAgaWYgKGluZGV4ID09IC0xKSB7XG4gICAgICB0aHJvdyBcIk5vZGUgbm90IGluIG93bmVyIG5vZGUgbGlzdCFcIjtcbiAgICB9XG5cbiAgICB0aGlzLm5vZGVzLnNwbGljZShpbmRleCwgMSk7XG4gIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTEVkZ2UpIHtcbiAgICB2YXIgZWRnZSA9IG9iajtcbiAgICBpZiAoZWRnZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIkVkZ2UgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKCEoZWRnZS5zb3VyY2UgIT0gbnVsbCAmJiBlZGdlLnRhcmdldCAhPSBudWxsKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBpcyBudWxsIVwiO1xuICAgIH1cbiAgICBpZiAoIShlZGdlLnNvdXJjZS5vd25lciAhPSBudWxsICYmIGVkZ2UudGFyZ2V0Lm93bmVyICE9IG51bGwgJiYgZWRnZS5zb3VyY2Uub3duZXIgPT0gdGhpcyAmJiBlZGdlLnRhcmdldC5vd25lciA9PSB0aGlzKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBvd25lciBpcyBpbnZhbGlkIVwiO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VJbmRleCA9IGVkZ2Uuc291cmNlLmVkZ2VzLmluZGV4T2YoZWRnZSk7XG4gICAgdmFyIHRhcmdldEluZGV4ID0gZWRnZS50YXJnZXQuZWRnZXMuaW5kZXhPZihlZGdlKTtcbiAgICBpZiAoIShzb3VyY2VJbmRleCA+IC0xICYmIHRhcmdldEluZGV4ID4gLTEpKSB7XG4gICAgICB0aHJvdyBcIlNvdXJjZSBhbmQvb3IgdGFyZ2V0IGRvZXNuJ3Qga25vdyB0aGlzIGVkZ2UhXCI7XG4gICAgfVxuXG4gICAgZWRnZS5zb3VyY2UuZWRnZXMuc3BsaWNlKHNvdXJjZUluZGV4LCAxKTtcblxuICAgIGlmIChlZGdlLnRhcmdldCAhPSBlZGdlLnNvdXJjZSkge1xuICAgICAgZWRnZS50YXJnZXQuZWRnZXMuc3BsaWNlKHRhcmdldEluZGV4LCAxKTtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSBlZGdlLnNvdXJjZS5vd25lci5nZXRFZGdlcygpLmluZGV4T2YoZWRnZSk7XG4gICAgaWYgKGluZGV4ID09IC0xKSB7XG4gICAgICB0aHJvdyBcIk5vdCBpbiBvd25lcidzIGVkZ2UgbGlzdCFcIjtcbiAgICB9XG5cbiAgICBlZGdlLnNvdXJjZS5vd25lci5nZXRFZGdlcygpLnNwbGljZShpbmRleCwgMSk7XG4gIH1cbn07XG5cbkxHcmFwaC5wcm90b3R5cGUudXBkYXRlTGVmdFRvcCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRvcCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgbGVmdCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgbm9kZVRvcDtcbiAgdmFyIG5vZGVMZWZ0O1xuICB2YXIgbWFyZ2luO1xuXG4gIHZhciBub2RlcyA9IHRoaXMuZ2V0Tm9kZXMoKTtcbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICB2YXIgbE5vZGUgPSBub2Rlc1tpXTtcbiAgICBub2RlVG9wID0gbE5vZGUuZ2V0VG9wKCk7XG4gICAgbm9kZUxlZnQgPSBsTm9kZS5nZXRMZWZ0KCk7XG5cbiAgICBpZiAodG9wID4gbm9kZVRvcCkge1xuICAgICAgdG9wID0gbm9kZVRvcDtcbiAgICB9XG5cbiAgICBpZiAobGVmdCA+IG5vZGVMZWZ0KSB7XG4gICAgICBsZWZ0ID0gbm9kZUxlZnQ7XG4gICAgfVxuICB9XG5cbiAgLy8gRG8gd2UgaGF2ZSBhbnkgbm9kZXMgaW4gdGhpcyBncmFwaD9cbiAgaWYgKHRvcCA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKG5vZGVzWzBdLmdldFBhcmVudCgpLnBhZGRpbmdMZWZ0ICE9IHVuZGVmaW5lZCkge1xuICAgIG1hcmdpbiA9IG5vZGVzWzBdLmdldFBhcmVudCgpLnBhZGRpbmdMZWZ0O1xuICB9IGVsc2Uge1xuICAgIG1hcmdpbiA9IHRoaXMubWFyZ2luO1xuICB9XG5cbiAgdGhpcy5sZWZ0ID0gbGVmdCAtIG1hcmdpbjtcbiAgdGhpcy50b3AgPSB0b3AgLSBtYXJnaW47XG5cbiAgLy8gQXBwbHkgdGhlIG1hcmdpbnMgYW5kIHJldHVybiB0aGUgcmVzdWx0XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcy5sZWZ0LCB0aGlzLnRvcCk7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLnVwZGF0ZUJvdW5kcyA9IGZ1bmN0aW9uIChyZWN1cnNpdmUpIHtcbiAgLy8gY2FsY3VsYXRlIGJvdW5kc1xuICB2YXIgbGVmdCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgcmlnaHQgPSAtSW50ZWdlci5NQVhfVkFMVUU7XG4gIHZhciB0b3AgPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIGJvdHRvbSA9IC1JbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIG5vZGVMZWZ0O1xuICB2YXIgbm9kZVJpZ2h0O1xuICB2YXIgbm9kZVRvcDtcbiAgdmFyIG5vZGVCb3R0b207XG4gIHZhciBtYXJnaW47XG5cbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcztcbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIGxOb2RlID0gbm9kZXNbaV07XG5cbiAgICBpZiAocmVjdXJzaXZlICYmIGxOb2RlLmNoaWxkICE9IG51bGwpIHtcbiAgICAgIGxOb2RlLnVwZGF0ZUJvdW5kcygpO1xuICAgIH1cbiAgICBub2RlTGVmdCA9IGxOb2RlLmdldExlZnQoKTtcbiAgICBub2RlUmlnaHQgPSBsTm9kZS5nZXRSaWdodCgpO1xuICAgIG5vZGVUb3AgPSBsTm9kZS5nZXRUb3AoKTtcbiAgICBub2RlQm90dG9tID0gbE5vZGUuZ2V0Qm90dG9tKCk7XG5cbiAgICBpZiAobGVmdCA+IG5vZGVMZWZ0KSB7XG4gICAgICBsZWZ0ID0gbm9kZUxlZnQ7XG4gICAgfVxuXG4gICAgaWYgKHJpZ2h0IDwgbm9kZVJpZ2h0KSB7XG4gICAgICByaWdodCA9IG5vZGVSaWdodDtcbiAgICB9XG5cbiAgICBpZiAodG9wID4gbm9kZVRvcCkge1xuICAgICAgdG9wID0gbm9kZVRvcDtcbiAgICB9XG5cbiAgICBpZiAoYm90dG9tIDwgbm9kZUJvdHRvbSkge1xuICAgICAgYm90dG9tID0gbm9kZUJvdHRvbTtcbiAgICB9XG4gIH1cblxuICB2YXIgYm91bmRpbmdSZWN0ID0gbmV3IFJlY3RhbmdsZUQobGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7XG4gIGlmIChsZWZ0ID09IEludGVnZXIuTUFYX1ZBTFVFKSB7XG4gICAgdGhpcy5sZWZ0ID0gdGhpcy5wYXJlbnQuZ2V0TGVmdCgpO1xuICAgIHRoaXMucmlnaHQgPSB0aGlzLnBhcmVudC5nZXRSaWdodCgpO1xuICAgIHRoaXMudG9wID0gdGhpcy5wYXJlbnQuZ2V0VG9wKCk7XG4gICAgdGhpcy5ib3R0b20gPSB0aGlzLnBhcmVudC5nZXRCb3R0b20oKTtcbiAgfVxuXG4gIGlmIChub2Rlc1swXS5nZXRQYXJlbnQoKS5wYWRkaW5nTGVmdCAhPSB1bmRlZmluZWQpIHtcbiAgICBtYXJnaW4gPSBub2Rlc1swXS5nZXRQYXJlbnQoKS5wYWRkaW5nTGVmdDtcbiAgfSBlbHNlIHtcbiAgICBtYXJnaW4gPSB0aGlzLm1hcmdpbjtcbiAgfVxuXG4gIHRoaXMubGVmdCA9IGJvdW5kaW5nUmVjdC54IC0gbWFyZ2luO1xuICB0aGlzLnJpZ2h0ID0gYm91bmRpbmdSZWN0LnggKyBib3VuZGluZ1JlY3Qud2lkdGggKyBtYXJnaW47XG4gIHRoaXMudG9wID0gYm91bmRpbmdSZWN0LnkgLSBtYXJnaW47XG4gIHRoaXMuYm90dG9tID0gYm91bmRpbmdSZWN0LnkgKyBib3VuZGluZ1JlY3QuaGVpZ2h0ICsgbWFyZ2luO1xufTtcblxuTEdyYXBoLmNhbGN1bGF0ZUJvdW5kcyA9IGZ1bmN0aW9uIChub2Rlcykge1xuICB2YXIgbGVmdCA9IEludGVnZXIuTUFYX1ZBTFVFO1xuICB2YXIgcmlnaHQgPSAtSW50ZWdlci5NQVhfVkFMVUU7XG4gIHZhciB0b3AgPSBJbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIGJvdHRvbSA9IC1JbnRlZ2VyLk1BWF9WQUxVRTtcbiAgdmFyIG5vZGVMZWZ0O1xuICB2YXIgbm9kZVJpZ2h0O1xuICB2YXIgbm9kZVRvcDtcbiAgdmFyIG5vZGVCb3R0b207XG5cbiAgdmFyIHMgPSBub2Rlcy5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICB2YXIgbE5vZGUgPSBub2Rlc1tpXTtcbiAgICBub2RlTGVmdCA9IGxOb2RlLmdldExlZnQoKTtcbiAgICBub2RlUmlnaHQgPSBsTm9kZS5nZXRSaWdodCgpO1xuICAgIG5vZGVUb3AgPSBsTm9kZS5nZXRUb3AoKTtcbiAgICBub2RlQm90dG9tID0gbE5vZGUuZ2V0Qm90dG9tKCk7XG5cbiAgICBpZiAobGVmdCA+IG5vZGVMZWZ0KSB7XG4gICAgICBsZWZ0ID0gbm9kZUxlZnQ7XG4gICAgfVxuXG4gICAgaWYgKHJpZ2h0IDwgbm9kZVJpZ2h0KSB7XG4gICAgICByaWdodCA9IG5vZGVSaWdodDtcbiAgICB9XG5cbiAgICBpZiAodG9wID4gbm9kZVRvcCkge1xuICAgICAgdG9wID0gbm9kZVRvcDtcbiAgICB9XG5cbiAgICBpZiAoYm90dG9tIDwgbm9kZUJvdHRvbSkge1xuICAgICAgYm90dG9tID0gbm9kZUJvdHRvbTtcbiAgICB9XG4gIH1cblxuICB2YXIgYm91bmRpbmdSZWN0ID0gbmV3IFJlY3RhbmdsZUQobGVmdCwgdG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7XG5cbiAgcmV0dXJuIGJvdW5kaW5nUmVjdDtcbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0SW5jbHVzaW9uVHJlZURlcHRoID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcyA9PSB0aGlzLmdyYXBoTWFuYWdlci5nZXRSb290KCkpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0SW5jbHVzaW9uVHJlZURlcHRoKCk7XG4gIH1cbn07XG5cbkxHcmFwaC5wcm90b3R5cGUuZ2V0RXN0aW1hdGVkU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuZXN0aW1hdGVkU2l6ZSA9PSBJbnRlZ2VyLk1JTl9WQUxVRSkge1xuICAgIHRocm93IFwiYXNzZXJ0IGZhaWxlZFwiO1xuICB9XG4gIHJldHVybiB0aGlzLmVzdGltYXRlZFNpemU7XG59O1xuXG5MR3JhcGgucHJvdG90eXBlLmNhbGNFc3RpbWF0ZWRTaXplID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2l6ZSA9IDA7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXM7XG4gIHZhciBzID0gbm9kZXMubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIGxOb2RlID0gbm9kZXNbaV07XG4gICAgc2l6ZSArPSBsTm9kZS5jYWxjRXN0aW1hdGVkU2l6ZSgpO1xuICB9XG5cbiAgaWYgKHNpemUgPT0gMCkge1xuICAgIHRoaXMuZXN0aW1hdGVkU2l6ZSA9IExheW91dENvbnN0YW50cy5FTVBUWV9DT01QT1VORF9OT0RFX1NJWkU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5lc3RpbWF0ZWRTaXplID0gc2l6ZSAvIE1hdGguc3FydCh0aGlzLm5vZGVzLmxlbmd0aCk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lc3RpbWF0ZWRTaXplO1xufTtcblxuTEdyYXBoLnByb3RvdHlwZS51cGRhdGVDb25uZWN0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKHRoaXMubm9kZXMubGVuZ3RoID09IDApIHtcbiAgICB0aGlzLmlzQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcXVldWUgPSBuZXcgTGlua2VkTGlzdCgpO1xuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIGN1cnJlbnROb2RlID0gdGhpcy5ub2Rlc1swXTtcbiAgdmFyIG5laWdoYm9yRWRnZXM7XG4gIHZhciBjdXJyZW50TmVpZ2hib3I7XG4gIHZhciBjaGlsZHJlbk9mTm9kZSA9IGN1cnJlbnROb2RlLndpdGhDaGlsZHJlbigpO1xuICBjaGlsZHJlbk9mTm9kZS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcXVldWUucHVzaChub2RlKTtcbiAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgfSk7XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPT0gMCkge1xuICAgIGN1cnJlbnROb2RlID0gcXVldWUuc2hpZnQoKTtcblxuICAgIC8vIFRyYXZlcnNlIGFsbCBuZWlnaGJvcnMgb2YgdGhpcyBub2RlXG4gICAgbmVpZ2hib3JFZGdlcyA9IGN1cnJlbnROb2RlLmdldEVkZ2VzKCk7XG4gICAgdmFyIHNpemUgPSBuZWlnaGJvckVkZ2VzLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgdmFyIG5laWdoYm9yRWRnZSA9IG5laWdoYm9yRWRnZXNbaV07XG4gICAgICBjdXJyZW50TmVpZ2hib3IgPSBuZWlnaGJvckVkZ2UuZ2V0T3RoZXJFbmRJbkdyYXBoKGN1cnJlbnROb2RlLCB0aGlzKTtcblxuICAgICAgLy8gQWRkIHVudmlzaXRlZCBuZWlnaGJvcnMgdG8gdGhlIGxpc3QgdG8gdmlzaXRcbiAgICAgIGlmIChjdXJyZW50TmVpZ2hib3IgIT0gbnVsbCAmJiAhdmlzaXRlZC5oYXMoY3VycmVudE5laWdoYm9yKSkge1xuICAgICAgICB2YXIgY2hpbGRyZW5PZk5laWdoYm9yID0gY3VycmVudE5laWdoYm9yLndpdGhDaGlsZHJlbigpO1xuXG4gICAgICAgIGNoaWxkcmVuT2ZOZWlnaGJvci5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcXVldWUucHVzaChub2RlKTtcbiAgICAgICAgICB2aXNpdGVkLmFkZChub2RlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuXG4gIGlmICh2aXNpdGVkLnNpemUgPj0gdGhpcy5ub2Rlcy5sZW5ndGgpIHtcbiAgICB2YXIgbm9PZlZpc2l0ZWRJblRoaXNHcmFwaCA9IDA7XG5cbiAgICB2aXNpdGVkLmZvckVhY2goZnVuY3Rpb24gKHZpc2l0ZWROb2RlKSB7XG4gICAgICBpZiAodmlzaXRlZE5vZGUub3duZXIgPT0gc2VsZikge1xuICAgICAgICBub09mVmlzaXRlZEluVGhpc0dyYXBoKys7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAobm9PZlZpc2l0ZWRJblRoaXNHcmFwaCA9PSB0aGlzLm5vZGVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IExHcmFwaDtcblxuLyoqKi8gfSksXG4vKiA3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMR3JhcGg7XG52YXIgTEVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXG5mdW5jdGlvbiBMR3JhcGhNYW5hZ2VyKGxheW91dCkge1xuICBMR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOyAvLyBJdCBtYXkgYmUgYmV0dGVyIHRvIGluaXRpbGl6ZSB0aGlzIG91dCBvZiB0aGlzIGZ1bmN0aW9uIGJ1dCBpdCBnaXZlcyBhbiBlcnJvciAoUmlnaHQtaGFuZCBzaWRlIG9mICdpbnN0YW5jZW9mJyBpcyBub3QgY2FsbGFibGUpIG5vdy5cbiAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG5cbiAgdGhpcy5ncmFwaHMgPSBbXTtcbiAgdGhpcy5lZGdlcyA9IFtdO1xufVxuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5hZGRSb290ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbmdyYXBoID0gdGhpcy5sYXlvdXQubmV3R3JhcGgoKTtcbiAgdmFyIG5ub2RlID0gdGhpcy5sYXlvdXQubmV3Tm9kZShudWxsKTtcbiAgdmFyIHJvb3QgPSB0aGlzLmFkZChuZ3JhcGgsIG5ub2RlKTtcbiAgdGhpcy5zZXRSb290R3JhcGgocm9vdCk7XG4gIHJldHVybiB0aGlzLnJvb3RHcmFwaDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChuZXdHcmFwaCwgcGFyZW50Tm9kZSwgbmV3RWRnZSwgc291cmNlTm9kZSwgdGFyZ2V0Tm9kZSkge1xuICAvL3RoZXJlIGFyZSBqdXN0IDIgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRoZW4gaXQgYWRkcyBhbiBMR3JhcGggZWxzZSBpdCBhZGRzIGFuIExFZGdlXG4gIGlmIChuZXdFZGdlID09IG51bGwgJiYgc291cmNlTm9kZSA9PSBudWxsICYmIHRhcmdldE5vZGUgPT0gbnVsbCkge1xuICAgIGlmIChuZXdHcmFwaCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIkdyYXBoIGlzIG51bGwhXCI7XG4gICAgfVxuICAgIGlmIChwYXJlbnROb2RlID09IG51bGwpIHtcbiAgICAgIHRocm93IFwiUGFyZW50IG5vZGUgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JhcGhzLmluZGV4T2YobmV3R3JhcGgpID4gLTEpIHtcbiAgICAgIHRocm93IFwiR3JhcGggYWxyZWFkeSBpbiB0aGlzIGdyYXBoIG1nciFcIjtcbiAgICB9XG5cbiAgICB0aGlzLmdyYXBocy5wdXNoKG5ld0dyYXBoKTtcblxuICAgIGlmIChuZXdHcmFwaC5wYXJlbnQgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJBbHJlYWR5IGhhcyBhIHBhcmVudCFcIjtcbiAgICB9XG4gICAgaWYgKHBhcmVudE5vZGUuY2hpbGQgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgXCJBbHJlYWR5IGhhcyBhIGNoaWxkIVwiO1xuICAgIH1cblxuICAgIG5ld0dyYXBoLnBhcmVudCA9IHBhcmVudE5vZGU7XG4gICAgcGFyZW50Tm9kZS5jaGlsZCA9IG5ld0dyYXBoO1xuXG4gICAgcmV0dXJuIG5ld0dyYXBoO1xuICB9IGVsc2Uge1xuICAgIC8vY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgcGFyYW1ldGVyc1xuICAgIHRhcmdldE5vZGUgPSBuZXdFZGdlO1xuICAgIHNvdXJjZU5vZGUgPSBwYXJlbnROb2RlO1xuICAgIG5ld0VkZ2UgPSBuZXdHcmFwaDtcbiAgICB2YXIgc291cmNlR3JhcGggPSBzb3VyY2VOb2RlLmdldE93bmVyKCk7XG4gICAgdmFyIHRhcmdldEdyYXBoID0gdGFyZ2V0Tm9kZS5nZXRPd25lcigpO1xuXG4gICAgaWYgKCEoc291cmNlR3JhcGggIT0gbnVsbCAmJiBzb3VyY2VHcmFwaC5nZXRHcmFwaE1hbmFnZXIoKSA9PSB0aGlzKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2Ugbm90IGluIHRoaXMgZ3JhcGggbWdyIVwiO1xuICAgIH1cbiAgICBpZiAoISh0YXJnZXRHcmFwaCAhPSBudWxsICYmIHRhcmdldEdyYXBoLmdldEdyYXBoTWFuYWdlcigpID09IHRoaXMpKSB7XG4gICAgICB0aHJvdyBcIlRhcmdldCBub3QgaW4gdGhpcyBncmFwaCBtZ3IhXCI7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZUdyYXBoID09IHRhcmdldEdyYXBoKSB7XG4gICAgICBuZXdFZGdlLmlzSW50ZXJHcmFwaCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHNvdXJjZUdyYXBoLmFkZChuZXdFZGdlLCBzb3VyY2VOb2RlLCB0YXJnZXROb2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RWRnZS5pc0ludGVyR3JhcGggPSB0cnVlO1xuXG4gICAgICAvLyBzZXQgc291cmNlIGFuZCB0YXJnZXRcbiAgICAgIG5ld0VkZ2Uuc291cmNlID0gc291cmNlTm9kZTtcbiAgICAgIG5ld0VkZ2UudGFyZ2V0ID0gdGFyZ2V0Tm9kZTtcblxuICAgICAgLy8gYWRkIGVkZ2UgdG8gaW50ZXItZ3JhcGggZWRnZSBsaXN0XG4gICAgICBpZiAodGhpcy5lZGdlcy5pbmRleE9mKG5ld0VkZ2UpID4gLTEpIHtcbiAgICAgICAgdGhyb3cgXCJFZGdlIGFscmVhZHkgaW4gaW50ZXItZ3JhcGggZWRnZSBsaXN0IVwiO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVkZ2VzLnB1c2gobmV3RWRnZSk7XG5cbiAgICAgIC8vIGFkZCBlZGdlIHRvIHNvdXJjZSBhbmQgdGFyZ2V0IGluY2lkZW5jeSBsaXN0c1xuICAgICAgaWYgKCEobmV3RWRnZS5zb3VyY2UgIT0gbnVsbCAmJiBuZXdFZGdlLnRhcmdldCAhPSBudWxsKSkge1xuICAgICAgICB0aHJvdyBcIkVkZ2Ugc291cmNlIGFuZC9vciB0YXJnZXQgaXMgbnVsbCFcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKCEobmV3RWRnZS5zb3VyY2UuZWRnZXMuaW5kZXhPZihuZXdFZGdlKSA9PSAtMSAmJiBuZXdFZGdlLnRhcmdldC5lZGdlcy5pbmRleE9mKG5ld0VkZ2UpID09IC0xKSkge1xuICAgICAgICB0aHJvdyBcIkVkZ2UgYWxyZWFkeSBpbiBzb3VyY2UgYW5kL29yIHRhcmdldCBpbmNpZGVuY3kgbGlzdCFcIjtcbiAgICAgIH1cblxuICAgICAgbmV3RWRnZS5zb3VyY2UuZWRnZXMucHVzaChuZXdFZGdlKTtcbiAgICAgIG5ld0VkZ2UudGFyZ2V0LmVkZ2VzLnB1c2gobmV3RWRnZSk7XG5cbiAgICAgIHJldHVybiBuZXdFZGdlO1xuICAgIH1cbiAgfVxufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGxPYmopIHtcbiAgaWYgKGxPYmogaW5zdGFuY2VvZiBMR3JhcGgpIHtcbiAgICB2YXIgZ3JhcGggPSBsT2JqO1xuICAgIGlmIChncmFwaC5nZXRHcmFwaE1hbmFnZXIoKSAhPSB0aGlzKSB7XG4gICAgICB0aHJvdyBcIkdyYXBoIG5vdCBpbiB0aGlzIGdyYXBoIG1nclwiO1xuICAgIH1cbiAgICBpZiAoIShncmFwaCA9PSB0aGlzLnJvb3RHcmFwaCB8fCBncmFwaC5wYXJlbnQgIT0gbnVsbCAmJiBncmFwaC5wYXJlbnQuZ3JhcGhNYW5hZ2VyID09IHRoaXMpKSB7XG4gICAgICB0aHJvdyBcIkludmFsaWQgcGFyZW50IG5vZGUhXCI7XG4gICAgfVxuXG4gICAgLy8gZmlyc3QgdGhlIGVkZ2VzIChtYWtlIGEgY29weSB0byBkbyBpdCBzYWZlbHkpXG4gICAgdmFyIGVkZ2VzVG9CZVJlbW92ZWQgPSBbXTtcblxuICAgIGVkZ2VzVG9CZVJlbW92ZWQgPSBlZGdlc1RvQmVSZW1vdmVkLmNvbmNhdChncmFwaC5nZXRFZGdlcygpKTtcblxuICAgIHZhciBlZGdlO1xuICAgIHZhciBzID0gZWRnZXNUb0JlUmVtb3ZlZC5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgIGVkZ2UgPSBlZGdlc1RvQmVSZW1vdmVkW2ldO1xuICAgICAgZ3JhcGgucmVtb3ZlKGVkZ2UpO1xuICAgIH1cblxuICAgIC8vIHRoZW4gdGhlIG5vZGVzIChtYWtlIGEgY29weSB0byBkbyBpdCBzYWZlbHkpXG4gICAgdmFyIG5vZGVzVG9CZVJlbW92ZWQgPSBbXTtcblxuICAgIG5vZGVzVG9CZVJlbW92ZWQgPSBub2Rlc1RvQmVSZW1vdmVkLmNvbmNhdChncmFwaC5nZXROb2RlcygpKTtcblxuICAgIHZhciBub2RlO1xuICAgIHMgPSBub2Rlc1RvQmVSZW1vdmVkLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgICAgbm9kZSA9IG5vZGVzVG9CZVJlbW92ZWRbaV07XG4gICAgICBncmFwaC5yZW1vdmUobm9kZSk7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgZ3JhcGggaXMgdGhlIHJvb3RcbiAgICBpZiAoZ3JhcGggPT0gdGhpcy5yb290R3JhcGgpIHtcbiAgICAgIHRoaXMuc2V0Um9vdEdyYXBoKG51bGwpO1xuICAgIH1cblxuICAgIC8vIG5vdyByZW1vdmUgdGhlIGdyYXBoIGl0c2VsZlxuICAgIHZhciBpbmRleCA9IHRoaXMuZ3JhcGhzLmluZGV4T2YoZ3JhcGgpO1xuICAgIHRoaXMuZ3JhcGhzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBhbHNvIHJlc2V0IHRoZSBwYXJlbnQgb2YgdGhlIGdyYXBoXG4gICAgZ3JhcGgucGFyZW50ID0gbnVsbDtcbiAgfSBlbHNlIGlmIChsT2JqIGluc3RhbmNlb2YgTEVkZ2UpIHtcbiAgICBlZGdlID0gbE9iajtcbiAgICBpZiAoZWRnZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIkVkZ2UgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKCFlZGdlLmlzSW50ZXJHcmFwaCkge1xuICAgICAgdGhyb3cgXCJOb3QgYW4gaW50ZXItZ3JhcGggZWRnZSFcIjtcbiAgICB9XG4gICAgaWYgKCEoZWRnZS5zb3VyY2UgIT0gbnVsbCAmJiBlZGdlLnRhcmdldCAhPSBudWxsKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBpcyBudWxsIVwiO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBlZGdlIGZyb20gc291cmNlIGFuZCB0YXJnZXQgbm9kZXMnIGluY2lkZW5jeSBsaXN0c1xuXG4gICAgaWYgKCEoZWRnZS5zb3VyY2UuZWRnZXMuaW5kZXhPZihlZGdlKSAhPSAtMSAmJiBlZGdlLnRhcmdldC5lZGdlcy5pbmRleE9mKGVkZ2UpICE9IC0xKSkge1xuICAgICAgdGhyb3cgXCJTb3VyY2UgYW5kL29yIHRhcmdldCBkb2Vzbid0IGtub3cgdGhpcyBlZGdlIVwiO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IGVkZ2Uuc291cmNlLmVkZ2VzLmluZGV4T2YoZWRnZSk7XG4gICAgZWRnZS5zb3VyY2UuZWRnZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpbmRleCA9IGVkZ2UudGFyZ2V0LmVkZ2VzLmluZGV4T2YoZWRnZSk7XG4gICAgZWRnZS50YXJnZXQuZWRnZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIHJlbW92ZSBlZGdlIGZyb20gb3duZXIgZ3JhcGggbWFuYWdlcidzIGludGVyLWdyYXBoIGVkZ2UgbGlzdFxuXG4gICAgaWYgKCEoZWRnZS5zb3VyY2Uub3duZXIgIT0gbnVsbCAmJiBlZGdlLnNvdXJjZS5vd25lci5nZXRHcmFwaE1hbmFnZXIoKSAhPSBudWxsKSkge1xuICAgICAgdGhyb3cgXCJFZGdlIG93bmVyIGdyYXBoIG9yIG93bmVyIGdyYXBoIG1hbmFnZXIgaXMgbnVsbCFcIjtcbiAgICB9XG4gICAgaWYgKGVkZ2Uuc291cmNlLm93bmVyLmdldEdyYXBoTWFuYWdlcigpLmVkZ2VzLmluZGV4T2YoZWRnZSkgPT0gLTEpIHtcbiAgICAgIHRocm93IFwiTm90IGluIG93bmVyIGdyYXBoIG1hbmFnZXIncyBlZGdlIGxpc3QhXCI7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4ID0gZWRnZS5zb3VyY2Uub3duZXIuZ2V0R3JhcGhNYW5hZ2VyKCkuZWRnZXMuaW5kZXhPZihlZGdlKTtcbiAgICBlZGdlLnNvdXJjZS5vd25lci5nZXRHcmFwaE1hbmFnZXIoKS5lZGdlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS51cGRhdGVCb3VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucm9vdEdyYXBoLnVwZGF0ZUJvdW5kcyh0cnVlKTtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldEdyYXBocyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhzO1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuZ2V0QWxsTm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmFsbE5vZGVzID09IG51bGwpIHtcbiAgICB2YXIgbm9kZUxpc3QgPSBbXTtcbiAgICB2YXIgZ3JhcGhzID0gdGhpcy5nZXRHcmFwaHMoKTtcbiAgICB2YXIgcyA9IGdyYXBocy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgIG5vZGVMaXN0ID0gbm9kZUxpc3QuY29uY2F0KGdyYXBoc1tpXS5nZXROb2RlcygpKTtcbiAgICB9XG4gICAgdGhpcy5hbGxOb2RlcyA9IG5vZGVMaXN0O1xuICB9XG4gIHJldHVybiB0aGlzLmFsbE5vZGVzO1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUucmVzZXRBbGxOb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5hbGxOb2RlcyA9IG51bGw7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5yZXNldEFsbEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmFsbEVkZ2VzID0gbnVsbDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLnJlc2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuYWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBudWxsO1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuZ2V0QWxsRWRnZXMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmFsbEVkZ2VzID09IG51bGwpIHtcbiAgICB2YXIgZWRnZUxpc3QgPSBbXTtcbiAgICB2YXIgZ3JhcGhzID0gdGhpcy5nZXRHcmFwaHMoKTtcbiAgICB2YXIgcyA9IGdyYXBocy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncmFwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGVkZ2VMaXN0ID0gZWRnZUxpc3QuY29uY2F0KGdyYXBoc1tpXS5nZXRFZGdlcygpKTtcbiAgICB9XG5cbiAgICBlZGdlTGlzdCA9IGVkZ2VMaXN0LmNvbmNhdCh0aGlzLmVkZ2VzKTtcblxuICAgIHRoaXMuYWxsRWRnZXMgPSBlZGdlTGlzdDtcbiAgfVxuICByZXR1cm4gdGhpcy5hbGxFZGdlcztcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5hbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbjtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLnNldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uID0gZnVuY3Rpb24gKG5vZGVMaXN0KSB7XG4gIGlmICh0aGlzLmFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uICE9IG51bGwpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuXG4gIHRoaXMuYWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBub2RlTGlzdDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldFJvb3QgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJvb3RHcmFwaDtcbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLnNldFJvb3RHcmFwaCA9IGZ1bmN0aW9uIChncmFwaCkge1xuICBpZiAoZ3JhcGguZ2V0R3JhcGhNYW5hZ2VyKCkgIT0gdGhpcykge1xuICAgIHRocm93IFwiUm9vdCBub3QgaW4gdGhpcyBncmFwaCBtZ3IhXCI7XG4gIH1cblxuICB0aGlzLnJvb3RHcmFwaCA9IGdyYXBoO1xuICAvLyByb290IGdyYXBoIG11c3QgaGF2ZSBhIHJvb3Qgbm9kZSBhc3NvY2lhdGVkIHdpdGggaXQgZm9yIGNvbnZlbmllbmNlXG4gIGlmIChncmFwaC5wYXJlbnQgPT0gbnVsbCkge1xuICAgIGdyYXBoLnBhcmVudCA9IHRoaXMubGF5b3V0Lm5ld05vZGUoXCJSb290IG5vZGVcIik7XG4gIH1cbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmdldExheW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubGF5b3V0O1xufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuaXNPbmVBbmNlc3Rvck9mT3RoZXIgPSBmdW5jdGlvbiAoZmlyc3ROb2RlLCBzZWNvbmROb2RlKSB7XG4gIGlmICghKGZpcnN0Tm9kZSAhPSBudWxsICYmIHNlY29uZE5vZGUgIT0gbnVsbCkpIHtcbiAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgfVxuXG4gIGlmIChmaXJzdE5vZGUgPT0gc2Vjb25kTm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIElzIHNlY29uZCBub2RlIGFuIGFuY2VzdG9yIG9mIHRoZSBmaXJzdCBvbmU/XG4gIHZhciBvd25lckdyYXBoID0gZmlyc3ROb2RlLmdldE93bmVyKCk7XG4gIHZhciBwYXJlbnROb2RlO1xuXG4gIGRvIHtcbiAgICBwYXJlbnROb2RlID0gb3duZXJHcmFwaC5nZXRQYXJlbnQoKTtcblxuICAgIGlmIChwYXJlbnROb2RlID09IG51bGwpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChwYXJlbnROb2RlID09IHNlY29uZE5vZGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIG93bmVyR3JhcGggPSBwYXJlbnROb2RlLmdldE93bmVyKCk7XG4gICAgaWYgKG93bmVyR3JhcGggPT0gbnVsbCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcbiAgLy8gSXMgZmlyc3Qgbm9kZSBhbiBhbmNlc3RvciBvZiB0aGUgc2Vjb25kIG9uZT9cbiAgb3duZXJHcmFwaCA9IHNlY29uZE5vZGUuZ2V0T3duZXIoKTtcblxuICBkbyB7XG4gICAgcGFyZW50Tm9kZSA9IG93bmVyR3JhcGguZ2V0UGFyZW50KCk7XG5cbiAgICBpZiAocGFyZW50Tm9kZSA9PSBudWxsKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocGFyZW50Tm9kZSA9PSBmaXJzdE5vZGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIG93bmVyR3JhcGggPSBwYXJlbnROb2RlLmdldE93bmVyKCk7XG4gICAgaWYgKG93bmVyR3JhcGggPT0gbnVsbCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5jYWxjTG93ZXN0Q29tbW9uQW5jZXN0b3JzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWRnZTtcbiAgdmFyIHNvdXJjZU5vZGU7XG4gIHZhciB0YXJnZXROb2RlO1xuICB2YXIgc291cmNlQW5jZXN0b3JHcmFwaDtcbiAgdmFyIHRhcmdldEFuY2VzdG9yR3JhcGg7XG5cbiAgdmFyIGVkZ2VzID0gdGhpcy5nZXRBbGxFZGdlcygpO1xuICB2YXIgcyA9IGVkZ2VzLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICBlZGdlID0gZWRnZXNbaV07XG5cbiAgICBzb3VyY2VOb2RlID0gZWRnZS5zb3VyY2U7XG4gICAgdGFyZ2V0Tm9kZSA9IGVkZ2UudGFyZ2V0O1xuICAgIGVkZ2UubGNhID0gbnVsbDtcbiAgICBlZGdlLnNvdXJjZUluTGNhID0gc291cmNlTm9kZTtcbiAgICBlZGdlLnRhcmdldEluTGNhID0gdGFyZ2V0Tm9kZTtcblxuICAgIGlmIChzb3VyY2VOb2RlID09IHRhcmdldE5vZGUpIHtcbiAgICAgIGVkZ2UubGNhID0gc291cmNlTm9kZS5nZXRPd25lcigpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgc291cmNlQW5jZXN0b3JHcmFwaCA9IHNvdXJjZU5vZGUuZ2V0T3duZXIoKTtcblxuICAgIHdoaWxlIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICBlZGdlLnRhcmdldEluTGNhID0gdGFyZ2V0Tm9kZTtcbiAgICAgIHRhcmdldEFuY2VzdG9yR3JhcGggPSB0YXJnZXROb2RlLmdldE93bmVyKCk7XG5cbiAgICAgIHdoaWxlIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICAgIGlmICh0YXJnZXRBbmNlc3RvckdyYXBoID09IHNvdXJjZUFuY2VzdG9yR3JhcGgpIHtcbiAgICAgICAgICBlZGdlLmxjYSA9IHRhcmdldEFuY2VzdG9yR3JhcGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0QW5jZXN0b3JHcmFwaCA9PSB0aGlzLnJvb3RHcmFwaCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVkZ2UubGNhICE9IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgICAgICAgfVxuICAgICAgICBlZGdlLnRhcmdldEluTGNhID0gdGFyZ2V0QW5jZXN0b3JHcmFwaC5nZXRQYXJlbnQoKTtcbiAgICAgICAgdGFyZ2V0QW5jZXN0b3JHcmFwaCA9IGVkZ2UudGFyZ2V0SW5MY2EuZ2V0T3duZXIoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNvdXJjZUFuY2VzdG9yR3JhcGggPT0gdGhpcy5yb290R3JhcGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICAgIGVkZ2Uuc291cmNlSW5MY2EgPSBzb3VyY2VBbmNlc3RvckdyYXBoLmdldFBhcmVudCgpO1xuICAgICAgICBzb3VyY2VBbmNlc3RvckdyYXBoID0gZWRnZS5zb3VyY2VJbkxjYS5nZXRPd25lcigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlZGdlLmxjYSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcImFzc2VydCBmYWlsZWRcIjtcbiAgICB9XG4gIH1cbn07XG5cbkxHcmFwaE1hbmFnZXIucHJvdG90eXBlLmNhbGNMb3dlc3RDb21tb25BbmNlc3RvciA9IGZ1bmN0aW9uIChmaXJzdE5vZGUsIHNlY29uZE5vZGUpIHtcbiAgaWYgKGZpcnN0Tm9kZSA9PSBzZWNvbmROb2RlKSB7XG4gICAgcmV0dXJuIGZpcnN0Tm9kZS5nZXRPd25lcigpO1xuICB9XG4gIHZhciBmaXJzdE93bmVyR3JhcGggPSBmaXJzdE5vZGUuZ2V0T3duZXIoKTtcblxuICBkbyB7XG4gICAgaWYgKGZpcnN0T3duZXJHcmFwaCA9PSBudWxsKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIHNlY29uZE93bmVyR3JhcGggPSBzZWNvbmROb2RlLmdldE93bmVyKCk7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoc2Vjb25kT3duZXJHcmFwaCA9PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2Vjb25kT3duZXJHcmFwaCA9PSBmaXJzdE93bmVyR3JhcGgpIHtcbiAgICAgICAgcmV0dXJuIHNlY29uZE93bmVyR3JhcGg7XG4gICAgICB9XG4gICAgICBzZWNvbmRPd25lckdyYXBoID0gc2Vjb25kT3duZXJHcmFwaC5nZXRQYXJlbnQoKS5nZXRPd25lcigpO1xuICAgIH0gd2hpbGUgKHRydWUpO1xuXG4gICAgZmlyc3RPd25lckdyYXBoID0gZmlyc3RPd25lckdyYXBoLmdldFBhcmVudCgpLmdldE93bmVyKCk7XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJldHVybiBmaXJzdE93bmVyR3JhcGg7XG59O1xuXG5MR3JhcGhNYW5hZ2VyLnByb3RvdHlwZS5jYWxjSW5jbHVzaW9uVHJlZURlcHRocyA9IGZ1bmN0aW9uIChncmFwaCwgZGVwdGgpIHtcbiAgaWYgKGdyYXBoID09IG51bGwgJiYgZGVwdGggPT0gbnVsbCkge1xuICAgIGdyYXBoID0gdGhpcy5yb290R3JhcGg7XG4gICAgZGVwdGggPSAxO1xuICB9XG4gIHZhciBub2RlO1xuXG4gIHZhciBub2RlcyA9IGdyYXBoLmdldE5vZGVzKCk7XG4gIHZhciBzID0gbm9kZXMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICBub2RlLmluY2x1c2lvblRyZWVEZXB0aCA9IGRlcHRoO1xuXG4gICAgaWYgKG5vZGUuY2hpbGQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5jYWxjSW5jbHVzaW9uVHJlZURlcHRocyhub2RlLmNoaWxkLCBkZXB0aCArIDEpO1xuICAgIH1cbiAgfVxufTtcblxuTEdyYXBoTWFuYWdlci5wcm90b3R5cGUuaW5jbHVkZXNJbnZhbGlkRWRnZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVkZ2U7XG4gIHZhciBlZGdlc1RvUmVtb3ZlID0gW107XG5cbiAgdmFyIHMgPSB0aGlzLmVkZ2VzLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICBlZGdlID0gdGhpcy5lZGdlc1tpXTtcblxuICAgIGlmICh0aGlzLmlzT25lQW5jZXN0b3JPZk90aGVyKGVkZ2Uuc291cmNlLCBlZGdlLnRhcmdldCkpIHtcbiAgICAgIGVkZ2VzVG9SZW1vdmUucHVzaChlZGdlKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZW1vdmUgaW52YWxpZCBlZGdlcyBmcm9tIGdyYXBoIG1hbmFnZXJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5yZW1vdmUoZWRnZXNUb1JlbW92ZVtpXSk7XG4gIH1cblxuICAvLyBJbnZhbGlkIGVkZ2VzIGFyZSBjbGVhcmVkLCBzbyByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBMR3JhcGhNYW5hZ2VyO1xuXG4vKioqLyB9KSxcbi8qIDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLyoqXG4gKiBUaGlzIGNsYXNzIG1haW50YWlucyBhIGxpc3Qgb2Ygc3RhdGljIGdlb21ldHJ5IHJlbGF0ZWQgdXRpbGl0eSBtZXRob2RzLlxuICpcbiAqXG4gKiBDb3B5cmlnaHQ6IGktVmlzIFJlc2VhcmNoIEdyb3VwLCBCaWxrZW50IFVuaXZlcnNpdHksIDIwMDcgLSBwcmVzZW50XG4gKi9cblxudmFyIFBvaW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5cbmZ1bmN0aW9uIElHZW9tZXRyeSgpIHt9XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2FsY3VsYXRlcyAqaGFsZiogdGhlIGFtb3VudCBpbiB4IGFuZCB5IGRpcmVjdGlvbnMgb2YgdGhlIHR3b1xuICogaW5wdXQgcmVjdGFuZ2xlcyBuZWVkZWQgdG8gc2VwYXJhdGUgdGhlbSBrZWVwaW5nIHRoZWlyIHJlc3BlY3RpdmVcbiAqIHBvc2l0aW9uaW5nLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGluIHRoZSBpbnB1dCBhcnJheS4gQW4gaW5wdXRcbiAqIHNlcGFyYXRpb24gYnVmZmVyIGFkZGVkIHRvIHRoZSBhbW91bnQgaW4gYm90aCBkaXJlY3Rpb25zLiBXZSBhc3N1bWUgdGhhdFxuICogdGhlIHR3byByZWN0YW5nbGVzIGRvIGludGVyc2VjdC5cbiAqL1xuSUdlb21ldHJ5LmNhbGNTZXBhcmF0aW9uQW1vdW50ID0gZnVuY3Rpb24gKHJlY3RBLCByZWN0Qiwgb3ZlcmxhcEFtb3VudCwgc2VwYXJhdGlvbkJ1ZmZlcikge1xuICBpZiAoIXJlY3RBLmludGVyc2VjdHMocmVjdEIpKSB7XG4gICAgdGhyb3cgXCJhc3NlcnQgZmFpbGVkXCI7XG4gIH1cblxuICB2YXIgZGlyZWN0aW9ucyA9IG5ldyBBcnJheSgyKTtcblxuICB0aGlzLmRlY2lkZURpcmVjdGlvbnNGb3JPdmVybGFwcGluZ05vZGVzKHJlY3RBLCByZWN0QiwgZGlyZWN0aW9ucyk7XG5cbiAgb3ZlcmxhcEFtb3VudFswXSA9IE1hdGgubWluKHJlY3RBLmdldFJpZ2h0KCksIHJlY3RCLmdldFJpZ2h0KCkpIC0gTWF0aC5tYXgocmVjdEEueCwgcmVjdEIueCk7XG4gIG92ZXJsYXBBbW91bnRbMV0gPSBNYXRoLm1pbihyZWN0QS5nZXRCb3R0b20oKSwgcmVjdEIuZ2V0Qm90dG9tKCkpIC0gTWF0aC5tYXgocmVjdEEueSwgcmVjdEIueSk7XG5cbiAgLy8gdXBkYXRlIHRoZSBvdmVybGFwcGluZyBhbW91bnRzIGZvciB0aGUgZm9sbG93aW5nIGNhc2VzOlxuICBpZiAocmVjdEEuZ2V0WCgpIDw9IHJlY3RCLmdldFgoKSAmJiByZWN0QS5nZXRSaWdodCgpID49IHJlY3RCLmdldFJpZ2h0KCkpIHtcbiAgICAvKiBDYXNlIHguMTpcbiAgICAqXG4gICAgKiByZWN0QVxuICAgICogXHR8ICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgKiBcdHwgICAgICAgIF9fX19fX19fXyAgICAgIHxcbiAgICAqIFx0fCAgICAgICAgfCAgICAgICB8ICAgICAgfFxuICAgICogXHR8X19fX19fX198X19fX19fX3xfX19fX198XG4gICAgKiBcdFx0XHQgfCAgICAgICB8XG4gICAgKiAgICAgICAgICAgfCAgICAgICB8XG4gICAgKiAgICAgICAgcmVjdEJcbiAgICAqL1xuICAgIG92ZXJsYXBBbW91bnRbMF0gKz0gTWF0aC5taW4ocmVjdEIuZ2V0WCgpIC0gcmVjdEEuZ2V0WCgpLCByZWN0QS5nZXRSaWdodCgpIC0gcmVjdEIuZ2V0UmlnaHQoKSk7XG4gIH0gZWxzZSBpZiAocmVjdEIuZ2V0WCgpIDw9IHJlY3RBLmdldFgoKSAmJiByZWN0Qi5nZXRSaWdodCgpID49IHJlY3RBLmdldFJpZ2h0KCkpIHtcbiAgICAvKiBDYXNlIHguMjpcbiAgICAqXG4gICAgKiByZWN0QlxuICAgICogXHR8ICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgKiBcdHwgICAgICAgIF9fX19fX19fXyAgICAgIHxcbiAgICAqIFx0fCAgICAgICAgfCAgICAgICB8ICAgICAgfFxuICAgICogXHR8X19fX19fX198X19fX19fX3xfX19fX198XG4gICAgKiBcdFx0XHQgfCAgICAgICB8XG4gICAgKiAgICAgICAgICAgfCAgICAgICB8XG4gICAgKiAgICAgICAgcmVjdEFcbiAgICAqL1xuICAgIG92ZXJsYXBBbW91bnRbMF0gKz0gTWF0aC5taW4ocmVjdEEuZ2V0WCgpIC0gcmVjdEIuZ2V0WCgpLCByZWN0Qi5nZXRSaWdodCgpIC0gcmVjdEEuZ2V0UmlnaHQoKSk7XG4gIH1cbiAgaWYgKHJlY3RBLmdldFkoKSA8PSByZWN0Qi5nZXRZKCkgJiYgcmVjdEEuZ2V0Qm90dG9tKCkgPj0gcmVjdEIuZ2V0Qm90dG9tKCkpIHtcbiAgICAvKiBDYXNlIHkuMTpcbiAgICAgKiAgICAgICAgICBfX19fX19fXyByZWN0QVxuICAgICAqICAgICAgICAgfFxuICAgICAqICAgICAgICAgfFxuICAgICAqICAgX19fX19ffF9fX18gIHJlY3RCXG4gICAgICogICAgICAgICB8ICAgIHxcbiAgICAgKiAgICAgICAgIHwgICAgfFxuICAgICAqICAgX19fX19ffF9fX198XG4gICAgICogICAgICAgICB8XG4gICAgICogICAgICAgICB8XG4gICAgICogICAgICAgICB8X19fX19fX19cbiAgICAgKlxuICAgICAqL1xuICAgIG92ZXJsYXBBbW91bnRbMV0gKz0gTWF0aC5taW4ocmVjdEIuZ2V0WSgpIC0gcmVjdEEuZ2V0WSgpLCByZWN0QS5nZXRCb3R0b20oKSAtIHJlY3RCLmdldEJvdHRvbSgpKTtcbiAgfSBlbHNlIGlmIChyZWN0Qi5nZXRZKCkgPD0gcmVjdEEuZ2V0WSgpICYmIHJlY3RCLmdldEJvdHRvbSgpID49IHJlY3RBLmdldEJvdHRvbSgpKSB7XG4gICAgLyogQ2FzZSB5LjI6XG4gICAgKiAgICAgICAgICBfX19fX19fXyByZWN0QlxuICAgICogICAgICAgICB8XG4gICAgKiAgICAgICAgIHxcbiAgICAqICAgX19fX19ffF9fX18gIHJlY3RBXG4gICAgKiAgICAgICAgIHwgICAgfFxuICAgICogICAgICAgICB8ICAgIHxcbiAgICAqICAgX19fX19ffF9fX198XG4gICAgKiAgICAgICAgIHxcbiAgICAqICAgICAgICAgfFxuICAgICogICAgICAgICB8X19fX19fX19cbiAgICAqXG4gICAgKi9cbiAgICBvdmVybGFwQW1vdW50WzFdICs9IE1hdGgubWluKHJlY3RBLmdldFkoKSAtIHJlY3RCLmdldFkoKSwgcmVjdEIuZ2V0Qm90dG9tKCkgLSByZWN0QS5nZXRCb3R0b20oKSk7XG4gIH1cblxuICAvLyBmaW5kIHNsb3BlIG9mIHRoZSBsaW5lIHBhc3NlcyB0d28gY2VudGVyc1xuICB2YXIgc2xvcGUgPSBNYXRoLmFicygocmVjdEIuZ2V0Q2VudGVyWSgpIC0gcmVjdEEuZ2V0Q2VudGVyWSgpKSAvIChyZWN0Qi5nZXRDZW50ZXJYKCkgLSByZWN0QS5nZXRDZW50ZXJYKCkpKTtcbiAgLy8gaWYgY2VudGVycyBhcmUgb3ZlcmxhcHBlZFxuICBpZiAocmVjdEIuZ2V0Q2VudGVyWSgpID09PSByZWN0QS5nZXRDZW50ZXJZKCkgJiYgcmVjdEIuZ2V0Q2VudGVyWCgpID09PSByZWN0QS5nZXRDZW50ZXJYKCkpIHtcbiAgICAvLyBhc3N1bWUgdGhlIHNsb3BlIGlzIDEgKDQ1IGRlZ3JlZSlcbiAgICBzbG9wZSA9IDEuMDtcbiAgfVxuXG4gIHZhciBtb3ZlQnlZID0gc2xvcGUgKiBvdmVybGFwQW1vdW50WzBdO1xuICB2YXIgbW92ZUJ5WCA9IG92ZXJsYXBBbW91bnRbMV0gLyBzbG9wZTtcbiAgaWYgKG92ZXJsYXBBbW91bnRbMF0gPCBtb3ZlQnlYKSB7XG4gICAgbW92ZUJ5WCA9IG92ZXJsYXBBbW91bnRbMF07XG4gIH0gZWxzZSB7XG4gICAgbW92ZUJ5WSA9IG92ZXJsYXBBbW91bnRbMV07XG4gIH1cbiAgLy8gcmV0dXJuIGhhbGYgdGhlIGFtb3VudCBzbyB0aGF0IGlmIGVhY2ggcmVjdGFuZ2xlIGlzIG1vdmVkIGJ5IHRoZXNlXG4gIC8vIGFtb3VudHMgaW4gb3Bwb3NpdGUgZGlyZWN0aW9ucywgb3ZlcmxhcCB3aWxsIGJlIHJlc29sdmVkXG4gIG92ZXJsYXBBbW91bnRbMF0gPSAtMSAqIGRpcmVjdGlvbnNbMF0gKiAobW92ZUJ5WCAvIDIgKyBzZXBhcmF0aW9uQnVmZmVyKTtcbiAgb3ZlcmxhcEFtb3VudFsxXSA9IC0xICogZGlyZWN0aW9uc1sxXSAqIChtb3ZlQnlZIC8gMiArIHNlcGFyYXRpb25CdWZmZXIpO1xufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBkZWNpZGVzIHRoZSBzZXBhcmF0aW9uIGRpcmVjdGlvbiBvZiBvdmVybGFwcGluZyBub2Rlc1xuICpcbiAqIGlmIGRpcmVjdGlvbnNbMF0gPSAtMSwgdGhlbiByZWN0QSBnb2VzIGxlZnRcbiAqIGlmIGRpcmVjdGlvbnNbMF0gPSAxLCAgdGhlbiByZWN0QSBnb2VzIHJpZ2h0XG4gKiBpZiBkaXJlY3Rpb25zWzFdID0gLTEsIHRoZW4gcmVjdEEgZ29lcyB1cFxuICogaWYgZGlyZWN0aW9uc1sxXSA9IDEsICB0aGVuIHJlY3RBIGdvZXMgZG93blxuICovXG5JR2VvbWV0cnkuZGVjaWRlRGlyZWN0aW9uc0Zvck92ZXJsYXBwaW5nTm9kZXMgPSBmdW5jdGlvbiAocmVjdEEsIHJlY3RCLCBkaXJlY3Rpb25zKSB7XG4gIGlmIChyZWN0QS5nZXRDZW50ZXJYKCkgPCByZWN0Qi5nZXRDZW50ZXJYKCkpIHtcbiAgICBkaXJlY3Rpb25zWzBdID0gLTE7XG4gIH0gZWxzZSB7XG4gICAgZGlyZWN0aW9uc1swXSA9IDE7XG4gIH1cblxuICBpZiAocmVjdEEuZ2V0Q2VudGVyWSgpIDwgcmVjdEIuZ2V0Q2VudGVyWSgpKSB7XG4gICAgZGlyZWN0aW9uc1sxXSA9IC0xO1xuICB9IGVsc2Uge1xuICAgIGRpcmVjdGlvbnNbMV0gPSAxO1xuICB9XG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNhbGN1bGF0ZXMgdGhlIGludGVyc2VjdGlvbiAoY2xpcHBpbmcpIHBvaW50cyBvZiB0aGUgdHdvXG4gKiBpbnB1dCByZWN0YW5nbGVzIHdpdGggbGluZSBzZWdtZW50IGRlZmluZWQgYnkgdGhlIGNlbnRlcnMgb2YgdGhlc2UgdHdvXG4gKiByZWN0YW5nbGVzLiBUaGUgY2xpcHBpbmcgcG9pbnRzIGFyZSBzYXZlZCBpbiB0aGUgaW5wdXQgZG91YmxlIGFycmF5IGFuZFxuICogd2hldGhlciBvciBub3QgdGhlIHR3byByZWN0YW5nbGVzIG92ZXJsYXAgaXMgcmV0dXJuZWQuXG4gKi9cbklHZW9tZXRyeS5nZXRJbnRlcnNlY3Rpb24yID0gZnVuY3Rpb24gKHJlY3RBLCByZWN0QiwgcmVzdWx0KSB7XG4gIC8vcmVzdWx0WzAtMV0gd2lsbCBjb250YWluIGNsaXBQb2ludCBvZiByZWN0QSwgcmVzdWx0WzItM10gd2lsbCBjb250YWluIGNsaXBQb2ludCBvZiByZWN0QlxuICB2YXIgcDF4ID0gcmVjdEEuZ2V0Q2VudGVyWCgpO1xuICB2YXIgcDF5ID0gcmVjdEEuZ2V0Q2VudGVyWSgpO1xuICB2YXIgcDJ4ID0gcmVjdEIuZ2V0Q2VudGVyWCgpO1xuICB2YXIgcDJ5ID0gcmVjdEIuZ2V0Q2VudGVyWSgpO1xuXG4gIC8vaWYgdHdvIHJlY3RhbmdsZXMgaW50ZXJzZWN0LCB0aGVuIGNsaXBwaW5nIHBvaW50cyBhcmUgY2VudGVyc1xuICBpZiAocmVjdEEuaW50ZXJzZWN0cyhyZWN0QikpIHtcbiAgICByZXN1bHRbMF0gPSBwMXg7XG4gICAgcmVzdWx0WzFdID0gcDF5O1xuICAgIHJlc3VsdFsyXSA9IHAyeDtcbiAgICByZXN1bHRbM10gPSBwMnk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy92YXJpYWJsZXMgZm9yIHJlY3RBXG4gIHZhciB0b3BMZWZ0QXggPSByZWN0QS5nZXRYKCk7XG4gIHZhciB0b3BMZWZ0QXkgPSByZWN0QS5nZXRZKCk7XG4gIHZhciB0b3BSaWdodEF4ID0gcmVjdEEuZ2V0UmlnaHQoKTtcbiAgdmFyIGJvdHRvbUxlZnRBeCA9IHJlY3RBLmdldFgoKTtcbiAgdmFyIGJvdHRvbUxlZnRBeSA9IHJlY3RBLmdldEJvdHRvbSgpO1xuICB2YXIgYm90dG9tUmlnaHRBeCA9IHJlY3RBLmdldFJpZ2h0KCk7XG4gIHZhciBoYWxmV2lkdGhBID0gcmVjdEEuZ2V0V2lkdGhIYWxmKCk7XG4gIHZhciBoYWxmSGVpZ2h0QSA9IHJlY3RBLmdldEhlaWdodEhhbGYoKTtcbiAgLy92YXJpYWJsZXMgZm9yIHJlY3RCXG4gIHZhciB0b3BMZWZ0QnggPSByZWN0Qi5nZXRYKCk7XG4gIHZhciB0b3BMZWZ0QnkgPSByZWN0Qi5nZXRZKCk7XG4gIHZhciB0b3BSaWdodEJ4ID0gcmVjdEIuZ2V0UmlnaHQoKTtcbiAgdmFyIGJvdHRvbUxlZnRCeCA9IHJlY3RCLmdldFgoKTtcbiAgdmFyIGJvdHRvbUxlZnRCeSA9IHJlY3RCLmdldEJvdHRvbSgpO1xuICB2YXIgYm90dG9tUmlnaHRCeCA9IHJlY3RCLmdldFJpZ2h0KCk7XG4gIHZhciBoYWxmV2lkdGhCID0gcmVjdEIuZ2V0V2lkdGhIYWxmKCk7XG4gIHZhciBoYWxmSGVpZ2h0QiA9IHJlY3RCLmdldEhlaWdodEhhbGYoKTtcblxuICAvL2ZsYWcgd2hldGhlciBjbGlwcGluZyBwb2ludHMgYXJlIGZvdW5kXG4gIHZhciBjbGlwUG9pbnRBRm91bmQgPSBmYWxzZTtcbiAgdmFyIGNsaXBQb2ludEJGb3VuZCA9IGZhbHNlO1xuXG4gIC8vIGxpbmUgaXMgdmVydGljYWxcbiAgaWYgKHAxeCA9PT0gcDJ4KSB7XG4gICAgaWYgKHAxeSA+IHAyeSkge1xuICAgICAgcmVzdWx0WzBdID0gcDF4O1xuICAgICAgcmVzdWx0WzFdID0gdG9wTGVmdEF5O1xuICAgICAgcmVzdWx0WzJdID0gcDJ4O1xuICAgICAgcmVzdWx0WzNdID0gYm90dG9tTGVmdEJ5O1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAocDF5IDwgcDJ5KSB7XG4gICAgICByZXN1bHRbMF0gPSBwMXg7XG4gICAgICByZXN1bHRbMV0gPSBib3R0b21MZWZ0QXk7XG4gICAgICByZXN1bHRbMl0gPSBwMng7XG4gICAgICByZXN1bHRbM10gPSB0b3BMZWZ0Qnk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vbm90IGxpbmUsIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICAvLyBsaW5lIGlzIGhvcml6b250YWxcbiAgZWxzZSBpZiAocDF5ID09PSBwMnkpIHtcbiAgICAgIGlmIChwMXggPiBwMngpIHtcbiAgICAgICAgcmVzdWx0WzBdID0gdG9wTGVmdEF4O1xuICAgICAgICByZXN1bHRbMV0gPSBwMXk7XG4gICAgICAgIHJlc3VsdFsyXSA9IHRvcFJpZ2h0Qng7XG4gICAgICAgIHJlc3VsdFszXSA9IHAyeTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChwMXggPCBwMngpIHtcbiAgICAgICAgcmVzdWx0WzBdID0gdG9wUmlnaHRBeDtcbiAgICAgICAgcmVzdWx0WzFdID0gcDF5O1xuICAgICAgICByZXN1bHRbMl0gPSB0b3BMZWZ0Qng7XG4gICAgICAgIHJlc3VsdFszXSA9IHAyeTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy9ub3QgdmFsaWQgbGluZSwgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vc2xvcGVzIG9mIHJlY3RBJ3MgYW5kIHJlY3RCJ3MgZGlhZ29uYWxzXG4gICAgICB2YXIgc2xvcGVBID0gcmVjdEEuaGVpZ2h0IC8gcmVjdEEud2lkdGg7XG4gICAgICB2YXIgc2xvcGVCID0gcmVjdEIuaGVpZ2h0IC8gcmVjdEIud2lkdGg7XG5cbiAgICAgIC8vc2xvcGUgb2YgbGluZSBiZXR3ZWVuIGNlbnRlciBvZiByZWN0QSBhbmQgY2VudGVyIG9mIHJlY3RCXG4gICAgICB2YXIgc2xvcGVQcmltZSA9IChwMnkgLSBwMXkpIC8gKHAyeCAtIHAxeCk7XG4gICAgICB2YXIgY2FyZGluYWxEaXJlY3Rpb25BID0gdm9pZCAwO1xuICAgICAgdmFyIGNhcmRpbmFsRGlyZWN0aW9uQiA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRBeCA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRBeSA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRCeCA9IHZvaWQgMDtcbiAgICAgIHZhciB0ZW1wUG9pbnRCeSA9IHZvaWQgMDtcblxuICAgICAgLy9kZXRlcm1pbmUgd2hldGhlciBjbGlwcGluZyBwb2ludCBpcyB0aGUgY29ybmVyIG9mIG5vZGVBXG4gICAgICBpZiAoLXNsb3BlQSA9PT0gc2xvcGVQcmltZSkge1xuICAgICAgICBpZiAocDF4ID4gcDJ4KSB7XG4gICAgICAgICAgcmVzdWx0WzBdID0gYm90dG9tTGVmdEF4O1xuICAgICAgICAgIHJlc3VsdFsxXSA9IGJvdHRvbUxlZnRBeTtcbiAgICAgICAgICBjbGlwUG9pbnRBRm91bmQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFswXSA9IHRvcFJpZ2h0QXg7XG4gICAgICAgICAgcmVzdWx0WzFdID0gdG9wTGVmdEF5O1xuICAgICAgICAgIGNsaXBQb2ludEFGb3VuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2xvcGVBID09PSBzbG9wZVByaW1lKSB7XG4gICAgICAgIGlmIChwMXggPiBwMngpIHtcbiAgICAgICAgICByZXN1bHRbMF0gPSB0b3BMZWZ0QXg7XG4gICAgICAgICAgcmVzdWx0WzFdID0gdG9wTGVmdEF5O1xuICAgICAgICAgIGNsaXBQb2ludEFGb3VuZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0WzBdID0gYm90dG9tUmlnaHRBeDtcbiAgICAgICAgICByZXN1bHRbMV0gPSBib3R0b21MZWZ0QXk7XG4gICAgICAgICAgY2xpcFBvaW50QUZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvL2RldGVybWluZSB3aGV0aGVyIGNsaXBwaW5nIHBvaW50IGlzIHRoZSBjb3JuZXIgb2Ygbm9kZUJcbiAgICAgIGlmICgtc2xvcGVCID09PSBzbG9wZVByaW1lKSB7XG4gICAgICAgIGlmIChwMnggPiBwMXgpIHtcbiAgICAgICAgICByZXN1bHRbMl0gPSBib3R0b21MZWZ0Qng7XG4gICAgICAgICAgcmVzdWx0WzNdID0gYm90dG9tTGVmdEJ5O1xuICAgICAgICAgIGNsaXBQb2ludEJGb3VuZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0WzJdID0gdG9wUmlnaHRCeDtcbiAgICAgICAgICByZXN1bHRbM10gPSB0b3BMZWZ0Qnk7XG4gICAgICAgICAgY2xpcFBvaW50QkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzbG9wZUIgPT09IHNsb3BlUHJpbWUpIHtcbiAgICAgICAgaWYgKHAyeCA+IHAxeCkge1xuICAgICAgICAgIHJlc3VsdFsyXSA9IHRvcExlZnRCeDtcbiAgICAgICAgICByZXN1bHRbM10gPSB0b3BMZWZ0Qnk7XG4gICAgICAgICAgY2xpcFBvaW50QkZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRbMl0gPSBib3R0b21SaWdodEJ4O1xuICAgICAgICAgIHJlc3VsdFszXSA9IGJvdHRvbUxlZnRCeTtcbiAgICAgICAgICBjbGlwUG9pbnRCRm91bmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vaWYgYm90aCBjbGlwcGluZyBwb2ludHMgYXJlIGNvcm5lcnNcbiAgICAgIGlmIChjbGlwUG9pbnRBRm91bmQgJiYgY2xpcFBvaW50QkZvdW5kKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy9kZXRlcm1pbmUgQ2FyZGluYWwgRGlyZWN0aW9uIG9mIHJlY3RhbmdsZXNcbiAgICAgIGlmIChwMXggPiBwMngpIHtcbiAgICAgICAgaWYgKHAxeSA+IHAyeSkge1xuICAgICAgICAgIGNhcmRpbmFsRGlyZWN0aW9uQSA9IHRoaXMuZ2V0Q2FyZGluYWxEaXJlY3Rpb24oc2xvcGVBLCBzbG9wZVByaW1lLCA0KTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKHNsb3BlQiwgc2xvcGVQcmltZSwgMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FyZGluYWxEaXJlY3Rpb25BID0gdGhpcy5nZXRDYXJkaW5hbERpcmVjdGlvbigtc2xvcGVBLCBzbG9wZVByaW1lLCAzKTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKC1zbG9wZUIsIHNsb3BlUHJpbWUsIDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocDF5ID4gcDJ5KSB7XG4gICAgICAgICAgY2FyZGluYWxEaXJlY3Rpb25BID0gdGhpcy5nZXRDYXJkaW5hbERpcmVjdGlvbigtc2xvcGVBLCBzbG9wZVByaW1lLCAxKTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKC1zbG9wZUIsIHNsb3BlUHJpbWUsIDMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhcmRpbmFsRGlyZWN0aW9uQSA9IHRoaXMuZ2V0Q2FyZGluYWxEaXJlY3Rpb24oc2xvcGVBLCBzbG9wZVByaW1lLCAyKTtcbiAgICAgICAgICBjYXJkaW5hbERpcmVjdGlvbkIgPSB0aGlzLmdldENhcmRpbmFsRGlyZWN0aW9uKHNsb3BlQiwgc2xvcGVQcmltZSwgNCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vY2FsY3VsYXRlIGNsaXBwaW5nIFBvaW50IGlmIGl0IGlzIG5vdCBmb3VuZCBiZWZvcmVcbiAgICAgIGlmICghY2xpcFBvaW50QUZvdW5kKSB7XG4gICAgICAgIHN3aXRjaCAoY2FyZGluYWxEaXJlY3Rpb25BKSB7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdGVtcFBvaW50QXkgPSB0b3BMZWZ0QXk7XG4gICAgICAgICAgICB0ZW1wUG9pbnRBeCA9IHAxeCArIC1oYWxmSGVpZ2h0QSAvIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMF0gPSB0ZW1wUG9pbnRBeDtcbiAgICAgICAgICAgIHJlc3VsdFsxXSA9IHRlbXBQb2ludEF5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgdGVtcFBvaW50QXggPSBib3R0b21SaWdodEF4O1xuICAgICAgICAgICAgdGVtcFBvaW50QXkgPSBwMXkgKyBoYWxmV2lkdGhBICogc2xvcGVQcmltZTtcbiAgICAgICAgICAgIHJlc3VsdFswXSA9IHRlbXBQb2ludEF4O1xuICAgICAgICAgICAgcmVzdWx0WzFdID0gdGVtcFBvaW50QXk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICB0ZW1wUG9pbnRBeSA9IGJvdHRvbUxlZnRBeTtcbiAgICAgICAgICAgIHRlbXBQb2ludEF4ID0gcDF4ICsgaGFsZkhlaWdodEEgLyBzbG9wZVByaW1lO1xuICAgICAgICAgICAgcmVzdWx0WzBdID0gdGVtcFBvaW50QXg7XG4gICAgICAgICAgICByZXN1bHRbMV0gPSB0ZW1wUG9pbnRBeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHRlbXBQb2ludEF4ID0gYm90dG9tTGVmdEF4O1xuICAgICAgICAgICAgdGVtcFBvaW50QXkgPSBwMXkgKyAtaGFsZldpZHRoQSAqIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMF0gPSB0ZW1wUG9pbnRBeDtcbiAgICAgICAgICAgIHJlc3VsdFsxXSA9IHRlbXBQb2ludEF5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghY2xpcFBvaW50QkZvdW5kKSB7XG4gICAgICAgIHN3aXRjaCAoY2FyZGluYWxEaXJlY3Rpb25CKSB7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgdGVtcFBvaW50QnkgPSB0b3BMZWZ0Qnk7XG4gICAgICAgICAgICB0ZW1wUG9pbnRCeCA9IHAyeCArIC1oYWxmSGVpZ2h0QiAvIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMl0gPSB0ZW1wUG9pbnRCeDtcbiAgICAgICAgICAgIHJlc3VsdFszXSA9IHRlbXBQb2ludEJ5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgdGVtcFBvaW50QnggPSBib3R0b21SaWdodEJ4O1xuICAgICAgICAgICAgdGVtcFBvaW50QnkgPSBwMnkgKyBoYWxmV2lkdGhCICogc2xvcGVQcmltZTtcbiAgICAgICAgICAgIHJlc3VsdFsyXSA9IHRlbXBQb2ludEJ4O1xuICAgICAgICAgICAgcmVzdWx0WzNdID0gdGVtcFBvaW50Qnk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICB0ZW1wUG9pbnRCeSA9IGJvdHRvbUxlZnRCeTtcbiAgICAgICAgICAgIHRlbXBQb2ludEJ4ID0gcDJ4ICsgaGFsZkhlaWdodEIgLyBzbG9wZVByaW1lO1xuICAgICAgICAgICAgcmVzdWx0WzJdID0gdGVtcFBvaW50Qng7XG4gICAgICAgICAgICByZXN1bHRbM10gPSB0ZW1wUG9pbnRCeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHRlbXBQb2ludEJ4ID0gYm90dG9tTGVmdEJ4O1xuICAgICAgICAgICAgdGVtcFBvaW50QnkgPSBwMnkgKyAtaGFsZldpZHRoQiAqIHNsb3BlUHJpbWU7XG4gICAgICAgICAgICByZXN1bHRbMl0gPSB0ZW1wUG9pbnRCeDtcbiAgICAgICAgICAgIHJlc3VsdFszXSA9IHRlbXBQb2ludEJ5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBpbiB3aGljaCBjYXJkaW5hbCBkaXJlY3Rpb24gZG9lcyBpbnB1dCBwb2ludCBzdGF5c1xuICogMTogTm9ydGhcbiAqIDI6IEVhc3RcbiAqIDM6IFNvdXRoXG4gKiA0OiBXZXN0XG4gKi9cbklHZW9tZXRyeS5nZXRDYXJkaW5hbERpcmVjdGlvbiA9IGZ1bmN0aW9uIChzbG9wZSwgc2xvcGVQcmltZSwgbGluZSkge1xuICBpZiAoc2xvcGUgPiBzbG9wZVByaW1lKSB7XG4gICAgcmV0dXJuIGxpbmU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDEgKyBsaW5lICUgNDtcbiAgfVxufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjYWxjdWxhdGVzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBsaW5lcyBkZWZpbmVkIGJ5XG4gKiBwb2ludCBwYWlycyAoczEsczIpIGFuZCAoZjEsZjIpLlxuICovXG5JR2VvbWV0cnkuZ2V0SW50ZXJzZWN0aW9uID0gZnVuY3Rpb24gKHMxLCBzMiwgZjEsIGYyKSB7XG4gIGlmIChmMiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SW50ZXJzZWN0aW9uMihzMSwgczIsIGYxKTtcbiAgfVxuXG4gIHZhciB4MSA9IHMxLng7XG4gIHZhciB5MSA9IHMxLnk7XG4gIHZhciB4MiA9IHMyLng7XG4gIHZhciB5MiA9IHMyLnk7XG4gIHZhciB4MyA9IGYxLng7XG4gIHZhciB5MyA9IGYxLnk7XG4gIHZhciB4NCA9IGYyLng7XG4gIHZhciB5NCA9IGYyLnk7XG4gIHZhciB4ID0gdm9pZCAwLFxuICAgICAgeSA9IHZvaWQgMDsgLy8gaW50ZXJzZWN0aW9uIHBvaW50XG4gIHZhciBhMSA9IHZvaWQgMCxcbiAgICAgIGEyID0gdm9pZCAwLFxuICAgICAgYjEgPSB2b2lkIDAsXG4gICAgICBiMiA9IHZvaWQgMCxcbiAgICAgIGMxID0gdm9pZCAwLFxuICAgICAgYzIgPSB2b2lkIDA7IC8vIGNvZWZmaWNpZW50cyBvZiBsaW5lIGVxbnMuXG4gIHZhciBkZW5vbSA9IHZvaWQgMDtcblxuICBhMSA9IHkyIC0geTE7XG4gIGIxID0geDEgLSB4MjtcbiAgYzEgPSB4MiAqIHkxIC0geDEgKiB5MjsgLy8geyBhMSp4ICsgYjEqeSArIGMxID0gMCBpcyBsaW5lIDEgfVxuXG4gIGEyID0geTQgLSB5MztcbiAgYjIgPSB4MyAtIHg0O1xuICBjMiA9IHg0ICogeTMgLSB4MyAqIHk0OyAvLyB7IGEyKnggKyBiMip5ICsgYzIgPSAwIGlzIGxpbmUgMiB9XG5cbiAgZGVub20gPSBhMSAqIGIyIC0gYTIgKiBiMTtcblxuICBpZiAoZGVub20gPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHggPSAoYjEgKiBjMiAtIGIyICogYzEpIC8gZGVub207XG4gIHkgPSAoYTIgKiBjMSAtIGExICogYzIpIC8gZGVub207XG5cbiAgcmV0dXJuIG5ldyBQb2ludCh4LCB5KTtcbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgZmluZHMgYW5kIHJldHVybnMgdGhlIGFuZ2xlIG9mIHRoZSB2ZWN0b3IgZnJvbSB0aGUgKyB4LWF4aXNcbiAqIGluIGNsb2Nrd2lzZSBkaXJlY3Rpb24gKGNvbXBhdGlibGUgdy8gSmF2YSBjb29yZGluYXRlIHN5c3RlbSEpLlxuICovXG5JR2VvbWV0cnkuYW5nbGVPZlZlY3RvciA9IGZ1bmN0aW9uIChDeCwgQ3ksIE54LCBOeSkge1xuICB2YXIgQ19hbmdsZSA9IHZvaWQgMDtcblxuICBpZiAoQ3ggIT09IE54KSB7XG4gICAgQ19hbmdsZSA9IE1hdGguYXRhbigoTnkgLSBDeSkgLyAoTnggLSBDeCkpO1xuXG4gICAgaWYgKE54IDwgQ3gpIHtcbiAgICAgIENfYW5nbGUgKz0gTWF0aC5QSTtcbiAgICB9IGVsc2UgaWYgKE55IDwgQ3kpIHtcbiAgICAgIENfYW5nbGUgKz0gdGhpcy5UV09fUEk7XG4gICAgfVxuICB9IGVsc2UgaWYgKE55IDwgQ3kpIHtcbiAgICBDX2FuZ2xlID0gdGhpcy5PTkVfQU5EX0hBTEZfUEk7IC8vIDI3MCBkZWdyZWVzXG4gIH0gZWxzZSB7XG4gICAgQ19hbmdsZSA9IHRoaXMuSEFMRl9QSTsgLy8gOTAgZGVncmVlc1xuICB9XG5cbiAgcmV0dXJuIENfYW5nbGU7XG59O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB0d28gbGluZSBzZWdtZW50cyAob25lIHdpdGggcG9pbnRcbiAqIHAxIGFuZCBwMiwgdGhlIG90aGVyIHdpdGggcG9pbnQgcDMgYW5kIHA0KSBpbnRlcnNlY3QgYXQgYSBwb2ludCBvdGhlclxuICogdGhhbiB0aGVzZSBwb2ludHMuXG4gKi9cbklHZW9tZXRyeS5kb0ludGVyc2VjdCA9IGZ1bmN0aW9uIChwMSwgcDIsIHAzLCBwNCkge1xuICB2YXIgYSA9IHAxLng7XG4gIHZhciBiID0gcDEueTtcbiAgdmFyIGMgPSBwMi54O1xuICB2YXIgZCA9IHAyLnk7XG4gIHZhciBwID0gcDMueDtcbiAgdmFyIHEgPSBwMy55O1xuICB2YXIgciA9IHA0Lng7XG4gIHZhciBzID0gcDQueTtcbiAgdmFyIGRldCA9IChjIC0gYSkgKiAocyAtIHEpIC0gKHIgLSBwKSAqIChkIC0gYik7XG5cbiAgaWYgKGRldCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGFtYmRhID0gKChzIC0gcSkgKiAociAtIGEpICsgKHAgLSByKSAqIChzIC0gYikpIC8gZGV0O1xuICAgIHZhciBnYW1tYSA9ICgoYiAtIGQpICogKHIgLSBhKSArIChjIC0gYSkgKiAocyAtIGIpKSAvIGRldDtcbiAgICByZXR1cm4gMCA8IGxhbWJkYSAmJiBsYW1iZGEgPCAxICYmIDAgPCBnYW1tYSAmJiBnYW1tYSA8IDE7XG4gIH1cbn07XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGFuZCBjYWxjdWxhdGVzIHRoZSBpbnRlcnNlY3Rpb24gb2YgXG4gKiBhIGxpbmUgc2VnbWVudCBhbmQgYSBjaXJjbGUuXG4gKi9cbklHZW9tZXRyeS5maW5kQ2lyY2xlTGluZUludGVyc2VjdGlvbnMgPSBmdW5jdGlvbiAoRXgsIEV5LCBMeCwgTHksIEN4LCBDeSwgcikge1xuXG4gIC8vIEUgaXMgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSByYXksXG4gIC8vIEwgaXMgdGhlIGVuZCBwb2ludCBvZiB0aGUgcmF5LFxuICAvLyBDIGlzIHRoZSBjZW50ZXIgb2Ygc3BoZXJlIHlvdSdyZSB0ZXN0aW5nIGFnYWluc3RcbiAgLy8gciBpcyB0aGUgcmFkaXVzIG9mIHRoYXQgc3BoZXJlXG5cbiAgLy8gQ29tcHV0ZTpcbiAgLy8gZCA9IEwgLSBFICggRGlyZWN0aW9uIHZlY3RvciBvZiByYXksIGZyb20gc3RhcnQgdG8gZW5kIClcbiAgLy8gZiA9IEUgLSBDICggVmVjdG9yIGZyb20gY2VudGVyIHNwaGVyZSB0byByYXkgc3RhcnQgKVxuXG4gIC8vIFRoZW4gdGhlIGludGVyc2VjdGlvbiBpcyBmb3VuZCBieS4uXG4gIC8vIFAgPSBFICsgdCAqIGRcbiAgLy8gVGhpcyBpcyBhIHBhcmFtZXRyaWMgZXF1YXRpb246XG4gIC8vIFB4ID0gRXggKyB0ZHhcbiAgLy8gUHkgPSBFeSArIHRkeVxuXG4gIC8vIGdldCBhLCBiLCBjIHZhbHVlc1xuICB2YXIgYSA9IChMeCAtIEV4KSAqIChMeCAtIEV4KSArIChMeSAtIEV5KSAqIChMeSAtIEV5KTtcbiAgdmFyIGIgPSAyICogKChFeCAtIEN4KSAqIChMeCAtIEV4KSArIChFeSAtIEN5KSAqIChMeSAtIEV5KSk7XG4gIHZhciBjID0gKEV4IC0gQ3gpICogKEV4IC0gQ3gpICsgKEV5IC0gQ3kpICogKEV5IC0gQ3kpIC0gciAqIHI7XG5cbiAgLy8gZ2V0IGRpc2NyaW1pbmFudFxuICB2YXIgZGlzYyA9IGIgKiBiIC0gNCAqIGEgKiBjO1xuICBpZiAoZGlzYyA+PSAwKSB7XG4gICAgLy8gaW5zZXJ0IGludG8gcXVhZHJhdGljIGZvcm11bGFcbiAgICB2YXIgdDEgPSAoLWIgKyBNYXRoLnNxcnQoYiAqIGIgLSA0ICogYSAqIGMpKSAvICgyICogYSk7XG4gICAgdmFyIHQyID0gKC1iIC0gTWF0aC5zcXJ0KGIgKiBiIC0gNCAqIGEgKiBjKSkgLyAoMiAqIGEpO1xuICAgIHZhciBpbnRlcnNlY3Rpb25zID0gbnVsbDtcbiAgICBpZiAodDEgPj0gMCAmJiB0MSA8PSAxKSB7XG4gICAgICAvLyB0MSBpcyB0aGUgaW50ZXJzZWN0aW9uLCBhbmQgaXQncyBjbG9zZXIgdGhhbiB0MlxuICAgICAgLy8gKHNpbmNlIHQxIHVzZXMgLWIgLSBkaXNjcmltaW5hbnQpXG4gICAgICAvLyBJbXBhbGUsIFBva2VcbiAgICAgIHJldHVybiBbdDFdO1xuICAgIH1cblxuICAgIC8vIGhlcmUgdDEgZGlkbid0IGludGVyc2VjdCBzbyB3ZSBhcmUgZWl0aGVyIHN0YXJ0ZWRcbiAgICAvLyBpbnNpZGUgdGhlIHNwaGVyZSBvciBjb21wbGV0ZWx5IHBhc3QgaXRcbiAgICBpZiAodDIgPj0gMCAmJiB0MiA8PSAxKSB7XG4gICAgICAvLyBFeGl0V291bmRcbiAgICAgIHJldHVybiBbdDJdO1xuICAgIH1cblxuICAgIHJldHVybiBpbnRlcnNlY3Rpb25zO1xuICB9IGVsc2UgcmV0dXJuIG51bGw7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VjdGlvbjogQ2xhc3MgQ29uc3RhbnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBTb21lIHVzZWZ1bCBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHNcbiAqL1xuSUdlb21ldHJ5LkhBTEZfUEkgPSAwLjUgKiBNYXRoLlBJO1xuSUdlb21ldHJ5Lk9ORV9BTkRfSEFMRl9QSSA9IDEuNSAqIE1hdGguUEk7XG5JR2VvbWV0cnkuVFdPX1BJID0gMi4wICogTWF0aC5QSTtcbklHZW9tZXRyeS5USFJFRV9QSSA9IDMuMCAqIE1hdGguUEk7XG5cbm1vZHVsZS5leHBvcnRzID0gSUdlb21ldHJ5O1xuXG4vKioqLyB9KSxcbi8qIDkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gSU1hdGgoKSB7fVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpZ24gb2YgdGhlIGlucHV0IHZhbHVlLlxuICovXG5JTWF0aC5zaWduID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA+IDApIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIGlmICh2YWx1ZSA8IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbklNYXRoLmZsb29yID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA8IDAgPyBNYXRoLmNlaWwodmFsdWUpIDogTWF0aC5mbG9vcih2YWx1ZSk7XG59O1xuXG5JTWF0aC5jZWlsID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA8IDAgPyBNYXRoLmZsb29yKHZhbHVlKSA6IE1hdGguY2VpbCh2YWx1ZSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IElNYXRoO1xuXG4vKioqLyB9KSxcbi8qIDEwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIEludGVnZXIoKSB7fVxuXG5JbnRlZ2VyLk1BWF9WQUxVRSA9IDIxNDc0ODM2NDc7XG5JbnRlZ2VyLk1JTl9WQUxVRSA9IC0yMTQ3NDgzNjQ4O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEludGVnZXI7XG5cbi8qKiovIH0pLFxuLyogMTEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIG5vZGVGcm9tID0gZnVuY3Rpb24gbm9kZUZyb20odmFsdWUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBuZXh0OiBudWxsLCBwcmV2OiBudWxsIH07XG59O1xuXG52YXIgYWRkID0gZnVuY3Rpb24gYWRkKHByZXYsIG5vZGUsIG5leHQsIGxpc3QpIHtcbiAgaWYgKHByZXYgIT09IG51bGwpIHtcbiAgICBwcmV2Lm5leHQgPSBub2RlO1xuICB9IGVsc2Uge1xuICAgIGxpc3QuaGVhZCA9IG5vZGU7XG4gIH1cblxuICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgIG5leHQucHJldiA9IG5vZGU7XG4gIH0gZWxzZSB7XG4gICAgbGlzdC50YWlsID0gbm9kZTtcbiAgfVxuXG4gIG5vZGUucHJldiA9IHByZXY7XG4gIG5vZGUubmV4dCA9IG5leHQ7XG5cbiAgbGlzdC5sZW5ndGgrKztcblxuICByZXR1cm4gbm9kZTtcbn07XG5cbnZhciBfcmVtb3ZlID0gZnVuY3Rpb24gX3JlbW92ZShub2RlLCBsaXN0KSB7XG4gIHZhciBwcmV2ID0gbm9kZS5wcmV2LFxuICAgICAgbmV4dCA9IG5vZGUubmV4dDtcblxuXG4gIGlmIChwcmV2ICE9PSBudWxsKSB7XG4gICAgcHJldi5uZXh0ID0gbmV4dDtcbiAgfSBlbHNlIHtcbiAgICBsaXN0LmhlYWQgPSBuZXh0O1xuICB9XG5cbiAgaWYgKG5leHQgIT09IG51bGwpIHtcbiAgICBuZXh0LnByZXYgPSBwcmV2O1xuICB9IGVsc2Uge1xuICAgIGxpc3QudGFpbCA9IHByZXY7XG4gIH1cblxuICBub2RlLnByZXYgPSBub2RlLm5leHQgPSBudWxsO1xuXG4gIGxpc3QubGVuZ3RoLS07XG5cbiAgcmV0dXJuIG5vZGU7XG59O1xuXG52YXIgTGlua2VkTGlzdCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTGlua2VkTGlzdCh2YWxzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMaW5rZWRMaXN0KTtcblxuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgIHRoaXMudGFpbCA9IG51bGw7XG5cbiAgICBpZiAodmFscyAhPSBudWxsKSB7XG4gICAgICB2YWxzLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLnB1c2godik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTGlua2VkTGlzdCwgW3tcbiAgICBrZXk6IFwic2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaXplKCkge1xuICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnNlcnRCZWZvcmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKHZhbCwgb3RoZXJOb2RlKSB7XG4gICAgICByZXR1cm4gYWRkKG90aGVyTm9kZS5wcmV2LCBub2RlRnJvbSh2YWwpLCBvdGhlck5vZGUsIHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnNlcnRBZnRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnRBZnRlcih2YWwsIG90aGVyTm9kZSkge1xuICAgICAgcmV0dXJuIGFkZChvdGhlck5vZGUsIG5vZGVGcm9tKHZhbCksIG90aGVyTm9kZS5uZXh0LCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5zZXJ0Tm9kZUJlZm9yZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnNlcnROb2RlQmVmb3JlKG5ld05vZGUsIG90aGVyTm9kZSkge1xuICAgICAgcmV0dXJuIGFkZChvdGhlck5vZGUucHJldiwgbmV3Tm9kZSwgb3RoZXJOb2RlLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5zZXJ0Tm9kZUFmdGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluc2VydE5vZGVBZnRlcihuZXdOb2RlLCBvdGhlck5vZGUpIHtcbiAgICAgIHJldHVybiBhZGQob3RoZXJOb2RlLCBuZXdOb2RlLCBvdGhlck5vZGUubmV4dCwgdGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInB1c2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHVzaCh2YWwpIHtcbiAgICAgIHJldHVybiBhZGQodGhpcy50YWlsLCBub2RlRnJvbSh2YWwpLCBudWxsLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5zaGlmdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bnNoaWZ0KHZhbCkge1xuICAgICAgcmV0dXJuIGFkZChudWxsLCBub2RlRnJvbSh2YWwpLCB0aGlzLmhlYWQsIHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlKG5vZGUpIHtcbiAgICAgIHJldHVybiBfcmVtb3ZlKG5vZGUsIHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwb3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcG9wKCkge1xuICAgICAgcmV0dXJuIF9yZW1vdmUodGhpcy50YWlsLCB0aGlzKS52YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicG9wTm9kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwb3BOb2RlKCkge1xuICAgICAgcmV0dXJuIF9yZW1vdmUodGhpcy50YWlsLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hpZnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnQoKSB7XG4gICAgICByZXR1cm4gX3JlbW92ZSh0aGlzLmhlYWQsIHRoaXMpLnZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaGlmdE5vZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnROb2RlKCkge1xuICAgICAgcmV0dXJuIF9yZW1vdmUodGhpcy5oZWFkLCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0X29iamVjdF9hdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRfb2JqZWN0X2F0KGluZGV4KSB7XG4gICAgICBpZiAoaW5kZXggPD0gdGhpcy5sZW5ndGgoKSkge1xuICAgICAgICB2YXIgaSA9IDE7XG4gICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5oZWFkO1xuICAgICAgICB3aGlsZSAoaSA8IGluZGV4KSB7XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldF9vYmplY3RfYXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0X29iamVjdF9hdChpbmRleCwgdmFsdWUpIHtcbiAgICAgIGlmIChpbmRleCA8PSB0aGlzLmxlbmd0aCgpKSB7XG4gICAgICAgIHZhciBpID0gMTtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmhlYWQ7XG4gICAgICAgIHdoaWxlIChpIDwgaW5kZXgpIHtcbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50LnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExpbmtlZExpc3Q7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTGlua2VkTGlzdDtcblxuLyoqKi8gfSksXG4vKiAxMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG4vKlxyXG4gKlRoaXMgY2xhc3MgaXMgdGhlIGphdmFzY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFBvaW50LmphdmEgY2xhc3MgaW4gamRrXHJcbiAqL1xuZnVuY3Rpb24gUG9pbnQoeCwgeSwgcCkge1xuICB0aGlzLnggPSBudWxsO1xuICB0aGlzLnkgPSBudWxsO1xuICBpZiAoeCA9PSBudWxsICYmIHkgPT0gbnVsbCAmJiBwID09IG51bGwpIHtcbiAgICB0aGlzLnggPSAwO1xuICAgIHRoaXMueSA9IDA7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHggPT0gJ251bWJlcicgJiYgdHlwZW9mIHkgPT0gJ251bWJlcicgJiYgcCA9PSBudWxsKSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICB9IGVsc2UgaWYgKHguY29uc3RydWN0b3IubmFtZSA9PSAnUG9pbnQnICYmIHkgPT0gbnVsbCAmJiBwID09IG51bGwpIHtcbiAgICBwID0geDtcbiAgICB0aGlzLnggPSBwLng7XG4gICAgdGhpcy55ID0gcC55O1xuICB9XG59XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy54O1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0TG9jYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcy54LCB0aGlzLnkpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLnNldExvY2F0aW9uID0gZnVuY3Rpb24gKHgsIHksIHApIHtcbiAgaWYgKHguY29uc3RydWN0b3IubmFtZSA9PSAnUG9pbnQnICYmIHkgPT0gbnVsbCAmJiBwID09IG51bGwpIHtcbiAgICBwID0geDtcbiAgICB0aGlzLnNldExvY2F0aW9uKHAueCwgcC55KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgeCA9PSAnbnVtYmVyJyAmJiB0eXBlb2YgeSA9PSAnbnVtYmVyJyAmJiBwID09IG51bGwpIHtcbiAgICAvL2lmIGJvdGggcGFyYW1ldGVycyBhcmUgaW50ZWdlciBqdXN0IG1vdmUgKHgseSkgbG9jYXRpb25cbiAgICBpZiAocGFyc2VJbnQoeCkgPT0geCAmJiBwYXJzZUludCh5KSA9PSB5KSB7XG4gICAgICB0aGlzLm1vdmUoeCwgeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMueCA9IE1hdGguZmxvb3IoeCArIDAuNSk7XG4gICAgICB0aGlzLnkgPSBNYXRoLmZsb29yKHkgKyAwLjUpO1xuICAgIH1cbiAgfVxufTtcblxuUG9pbnQucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbiAoeCwgeSkge1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xufTtcblxuUG9pbnQucHJvdG90eXBlLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIChkeCwgZHkpIHtcbiAgdGhpcy54ICs9IGR4O1xuICB0aGlzLnkgKz0gZHk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKG9iaikge1xuICBpZiAob2JqLmNvbnN0cnVjdG9yLm5hbWUgPT0gXCJQb2ludFwiKSB7XG4gICAgdmFyIHB0ID0gb2JqO1xuICAgIHJldHVybiB0aGlzLnggPT0gcHQueCAmJiB0aGlzLnkgPT0gcHQueTtcbiAgfVxuICByZXR1cm4gdGhpcyA9PSBvYmo7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgUG9pbnQoKS5jb25zdHJ1Y3Rvci5uYW1lICsgXCJbeD1cIiArIHRoaXMueCArIFwiLHk9XCIgKyB0aGlzLnkgKyBcIl1cIjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUG9pbnQ7XG5cbi8qKiovIH0pLFxuLyogMTMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gUmVjdGFuZ2xlRCh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHRoaXMueCA9IDA7XG4gIHRoaXMueSA9IDA7XG4gIHRoaXMud2lkdGggPSAwO1xuICB0aGlzLmhlaWdodCA9IDA7XG5cbiAgaWYgKHggIT0gbnVsbCAmJiB5ICE9IG51bGwgJiYgd2lkdGggIT0gbnVsbCAmJiBoZWlnaHQgIT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cbn1cblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMueDtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLnNldFggPSBmdW5jdGlvbiAoeCkge1xuICB0aGlzLnggPSB4O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMueTtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLnNldFkgPSBmdW5jdGlvbiAoeSkge1xuICB0aGlzLnkgPSB5O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcbiAgdGhpcy53aWR0aCA9IHdpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5oZWlnaHQ7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5zZXRIZWlnaHQgPSBmdW5jdGlvbiAoaGVpZ2h0KSB7XG4gIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0UmlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnggKyB0aGlzLndpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0Qm90dG9tID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy55ICsgdGhpcy5oZWlnaHQ7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5pbnRlcnNlY3RzID0gZnVuY3Rpb24gKGEpIHtcbiAgaWYgKHRoaXMuZ2V0UmlnaHQoKSA8IGEueCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0aGlzLmdldEJvdHRvbSgpIDwgYS55KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGEuZ2V0UmlnaHQoKSA8IHRoaXMueCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChhLmdldEJvdHRvbSgpIDwgdGhpcy55KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRDZW50ZXJYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy54ICsgdGhpcy53aWR0aCAvIDI7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRNaW5YID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5nZXRYKCk7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRNYXhYID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5nZXRYKCkgKyB0aGlzLndpZHRoO1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0Q2VudGVyWSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMueSArIHRoaXMuaGVpZ2h0IC8gMjtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLmdldE1pblkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdldFkoKTtcbn07XG5cblJlY3RhbmdsZUQucHJvdG90eXBlLmdldE1heFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdldFkoKSArIHRoaXMuaGVpZ2h0O1xufTtcblxuUmVjdGFuZ2xlRC5wcm90b3R5cGUuZ2V0V2lkdGhIYWxmID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53aWR0aCAvIDI7XG59O1xuXG5SZWN0YW5nbGVELnByb3RvdHlwZS5nZXRIZWlnaHRIYWxmID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5oZWlnaHQgLyAyO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWN0YW5nbGVEO1xuXG4vKioqLyB9KSxcbi8qIDE0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuZnVuY3Rpb24gVW5pcXVlSURHZW5lcmV0b3IoKSB7fVxuXG5VbmlxdWVJREdlbmVyZXRvci5sYXN0SUQgPSAwO1xuXG5VbmlxdWVJREdlbmVyZXRvci5jcmVhdGVJRCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgaWYgKFVuaXF1ZUlER2VuZXJldG9yLmlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIGlmIChvYmoudW5pcXVlSUQgIT0gbnVsbCkge1xuICAgIHJldHVybiBvYmoudW5pcXVlSUQ7XG4gIH1cbiAgb2JqLnVuaXF1ZUlEID0gVW5pcXVlSURHZW5lcmV0b3IuZ2V0U3RyaW5nKCk7XG4gIFVuaXF1ZUlER2VuZXJldG9yLmxhc3RJRCsrO1xuICByZXR1cm4gb2JqLnVuaXF1ZUlEO1xufTtcblxuVW5pcXVlSURHZW5lcmV0b3IuZ2V0U3RyaW5nID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlmIChpZCA9PSBudWxsKSBpZCA9IFVuaXF1ZUlER2VuZXJldG9yLmxhc3RJRDtcbiAgcmV0dXJuIFwiT2JqZWN0I1wiICsgaWQgKyBcIlwiO1xufTtcblxuVW5pcXVlSURHZW5lcmV0b3IuaXNQcmltaXRpdmUgPSBmdW5jdGlvbiAoYXJnKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGFyZyA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKGFyZyk7XG4gIHJldHVybiBhcmcgPT0gbnVsbCB8fCB0eXBlICE9IFwib2JqZWN0XCIgJiYgdHlwZSAhPSBcImZ1bmN0aW9uXCI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVuaXF1ZUlER2VuZXJldG9yO1xuXG4vKioqLyB9KSxcbi8qIDE1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG52YXIgTGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbnZhciBMR3JhcGhNYW5hZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcbnZhciBMTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG52YXIgTEVkZ2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xudmFyIExHcmFwaCA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG52YXIgUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcbnZhciBUcmFuc2Zvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KTtcbnZhciBFbWl0dGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSk7XG5cbmZ1bmN0aW9uIExheW91dChpc1JlbW90ZVVzZSkge1xuICBFbWl0dGVyLmNhbGwodGhpcyk7XG5cbiAgLy9MYXlvdXQgUXVhbGl0eTogMDpkcmFmdCwgMTpkZWZhdWx0LCAyOnByb29mXG4gIHRoaXMubGF5b3V0UXVhbGl0eSA9IExheW91dENvbnN0YW50cy5RVUFMSVRZO1xuICAvL1doZXRoZXIgbGF5b3V0IHNob3VsZCBjcmVhdGUgYmVuZHBvaW50cyBhcyBuZWVkZWQgb3Igbm90XG4gIHRoaXMuY3JlYXRlQmVuZHNBc05lZWRlZCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0NSRUFURV9CRU5EU19BU19ORUVERUQ7XG4gIC8vV2hldGhlciBsYXlvdXQgc2hvdWxkIGJlIGluY3JlbWVudGFsIG9yIG5vdFxuICB0aGlzLmluY3JlbWVudGFsID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUw7XG4gIC8vV2hldGhlciB3ZSBhbmltYXRlIGZyb20gYmVmb3JlIHRvIGFmdGVyIGxheW91dCBub2RlIHBvc2l0aW9uc1xuICB0aGlzLmFuaW1hdGlvbk9uTGF5b3V0ID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX09OX0xBWU9VVDtcbiAgLy9XaGV0aGVyIHdlIGFuaW1hdGUgdGhlIGxheW91dCBwcm9jZXNzIG9yIG5vdFxuICB0aGlzLmFuaW1hdGlvbkR1cmluZ0xheW91dCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0FOSU1BVElPTl9EVVJJTkdfTEFZT1VUO1xuICAvL051bWJlciBpdGVyYXRpb25zIHRoYXQgc2hvdWxkIGJlIGRvbmUgYmV0d2VlbiB0d28gc3VjY2Vzc2l2ZSBhbmltYXRpb25zXG4gIHRoaXMuYW5pbWF0aW9uUGVyaW9kID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX1BFUklPRDtcbiAgLyoqXHJcbiAgICogV2hldGhlciBvciBub3QgbGVhZiBub2RlcyAobm9uLWNvbXBvdW5kIG5vZGVzKSBhcmUgb2YgdW5pZm9ybSBzaXplcy4gV2hlblxyXG4gICAqIHRoZXkgYXJlLCBib3RoIHNwcmluZyBhbmQgcmVwdWxzaW9uIGZvcmNlcyBiZXR3ZWVuIHR3byBsZWFmIG5vZGVzIGNhbiBiZVxyXG4gICAqIGNhbGN1bGF0ZWQgd2l0aG91dCB0aGUgZXhwZW5zaXZlIGNsaXBwaW5nIHBvaW50IGNhbGN1bGF0aW9ucywgcmVzdWx0aW5nXHJcbiAgICogaW4gbWFqb3Igc3BlZWQtdXAuXHJcbiAgICovXG4gIHRoaXMudW5pZm9ybUxlYWZOb2RlU2l6ZXMgPSBMYXlvdXRDb25zdGFudHMuREVGQVVMVF9VTklGT1JNX0xFQUZfTk9ERV9TSVpFUztcbiAgLyoqXHJcbiAgICogVGhpcyBpcyB1c2VkIGZvciBjcmVhdGlvbiBvZiBiZW5kcG9pbnRzIGJ5IHVzaW5nIGR1bW15IG5vZGVzIGFuZCBlZGdlcy5cclxuICAgKiBNYXBzIGFuIExFZGdlIHRvIGl0cyBkdW1teSBiZW5kcG9pbnQgcGF0aC5cclxuICAgKi9cbiAgdGhpcy5lZGdlVG9EdW1teU5vZGVzID0gbmV3IE1hcCgpO1xuICB0aGlzLmdyYXBoTWFuYWdlciA9IG5ldyBMR3JhcGhNYW5hZ2VyKHRoaXMpO1xuICB0aGlzLmlzTGF5b3V0RmluaXNoZWQgPSBmYWxzZTtcbiAgdGhpcy5pc1N1YkxheW91dCA9IGZhbHNlO1xuICB0aGlzLmlzUmVtb3RlVXNlID0gZmFsc2U7XG5cbiAgaWYgKGlzUmVtb3RlVXNlICE9IG51bGwpIHtcbiAgICB0aGlzLmlzUmVtb3RlVXNlID0gaXNSZW1vdGVVc2U7XG4gIH1cbn1cblxuTGF5b3V0LlJBTkRPTV9TRUVEID0gMTtcblxuTGF5b3V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRW1pdHRlci5wcm90b3R5cGUpO1xuXG5MYXlvdXQucHJvdG90eXBlLmdldEdyYXBoTWFuYWdlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhNYW5hZ2VyO1xufTtcblxuTGF5b3V0LnByb3RvdHlwZS5nZXRBbGxOb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhNYW5hZ2VyLmdldEFsbE5vZGVzKCk7XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLmdldEFsbEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsRWRnZXMoKTtcbn07XG5cbkxheW91dC5wcm90b3R5cGUuZ2V0QWxsTm9kZXNUb0FwcGx5R3Jhdml0YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxOb2Rlc1RvQXBwbHlHcmF2aXRhdGlvbigpO1xufTtcblxuTGF5b3V0LnByb3RvdHlwZS5uZXdHcmFwaE1hbmFnZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBnbSA9IG5ldyBMR3JhcGhNYW5hZ2VyKHRoaXMpO1xuICB0aGlzLmdyYXBoTWFuYWdlciA9IGdtO1xuICByZXR1cm4gZ207XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLm5ld0dyYXBoID0gZnVuY3Rpb24gKHZHcmFwaCkge1xuICByZXR1cm4gbmV3IExHcmFwaChudWxsLCB0aGlzLmdyYXBoTWFuYWdlciwgdkdyYXBoKTtcbn07XG5cbkxheW91dC5wcm90b3R5cGUubmV3Tm9kZSA9IGZ1bmN0aW9uICh2Tm9kZSkge1xuICByZXR1cm4gbmV3IExOb2RlKHRoaXMuZ3JhcGhNYW5hZ2VyLCB2Tm9kZSk7XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLm5ld0VkZ2UgPSBmdW5jdGlvbiAodkVkZ2UpIHtcbiAgcmV0dXJuIG5ldyBMRWRnZShudWxsLCBudWxsLCB2RWRnZSk7XG59O1xuXG5MYXlvdXQucHJvdG90eXBlLmNoZWNrTGF5b3V0U3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKSA9PSBudWxsIHx8IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS5nZXROb2RlcygpLmxlbmd0aCA9PSAwIHx8IHRoaXMuZ3JhcGhNYW5hZ2VyLmluY2x1ZGVzSW52YWxpZEVkZ2UoKTtcbn07XG5cbkxheW91dC5wcm90b3R5cGUucnVuTGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmlzTGF5b3V0RmluaXNoZWQgPSBmYWxzZTtcblxuICBpZiAodGhpcy50aWxpbmdQcmVMYXlvdXQpIHtcbiAgICB0aGlzLnRpbGluZ1ByZUxheW91dCgpO1xuICB9XG5cbiAgdGhpcy5pbml0UGFyYW1ldGVycygpO1xuICB2YXIgaXNMYXlvdXRTdWNjZXNzZnVsbDtcblxuICBpZiAodGhpcy5jaGVja0xheW91dFN1Y2Nlc3MoKSkge1xuICAgIGlzTGF5b3V0U3VjY2Vzc2Z1bGwgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBpc0xheW91dFN1Y2Nlc3NmdWxsID0gdGhpcy5sYXlvdXQoKTtcbiAgfVxuXG4gIGlmIChMYXlvdXRDb25zdGFudHMuQU5JTUFURSA9PT0gJ2R1cmluZycpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgJ2R1cmluZycgbGF5b3V0IGFuaW1hdGlvbi4gTGF5b3V0IGlzIG5vdCBmaW5pc2hlZCB5ZXQuIFxuICAgIC8vIFdlIG5lZWQgdG8gcGVyZm9ybSB0aGVzZSBpbiBpbmRleC5qcyB3aGVuIGxheW91dCBpcyByZWFsbHkgZmluaXNoZWQuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzTGF5b3V0U3VjY2Vzc2Z1bGwpIHtcbiAgICBpZiAoIXRoaXMuaXNTdWJMYXlvdXQpIHtcbiAgICAgIHRoaXMuZG9Qb3N0TGF5b3V0KCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMudGlsaW5nUG9zdExheW91dCkge1xuICAgIHRoaXMudGlsaW5nUG9zdExheW91dCgpO1xuICB9XG5cbiAgdGhpcy5pc0xheW91dEZpbmlzaGVkID0gdHJ1ZTtcblxuICByZXR1cm4gaXNMYXlvdXRTdWNjZXNzZnVsbDtcbn07XG5cbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyB0aGUgb3BlcmF0aW9ucyByZXF1aXJlZCBhZnRlciBsYXlvdXQuXHJcbiAqL1xuTGF5b3V0LnByb3RvdHlwZS5kb1Bvc3RMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIC8vYXNzZXJ0ICFpc1N1YkxheW91dCA6IFwiU2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gc3ViLWxheW91dCFcIjtcbiAgLy8gUHJvcGFnYXRlIGdlb21ldHJpYyBjaGFuZ2VzIHRvIHYtbGV2ZWwgb2JqZWN0c1xuICBpZiAoIXRoaXMuaW5jcmVtZW50YWwpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSgpO1xuICB9XG4gIHRoaXMudXBkYXRlKCk7XG59O1xuXG4vKipcclxuICogVGhpcyBtZXRob2QgdXBkYXRlcyB0aGUgZ2VvbWV0cnkgb2YgdGhlIHRhcmdldCBncmFwaCBhY2NvcmRpbmcgdG9cclxuICogY2FsY3VsYXRlZCBsYXlvdXQuXHJcbiAqL1xuTGF5b3V0LnByb3RvdHlwZS51cGRhdGUyID0gZnVuY3Rpb24gKCkge1xuICAvLyB1cGRhdGUgYmVuZCBwb2ludHNcbiAgaWYgKHRoaXMuY3JlYXRlQmVuZHNBc05lZWRlZCkge1xuICAgIHRoaXMuY3JlYXRlQmVuZHBvaW50c0Zyb21EdW1teU5vZGVzKCk7XG5cbiAgICAvLyByZXNldCBhbGwgZWRnZXMsIHNpbmNlIHRoZSB0b3BvbG9neSBoYXMgY2hhbmdlZFxuICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLnJlc2V0QWxsRWRnZXMoKTtcbiAgfVxuXG4gIC8vIHBlcmZvcm0gZWRnZSwgbm9kZSBhbmQgcm9vdCB1cGRhdGVzIGlmIGxheW91dCBpcyBub3QgY2FsbGVkXG4gIC8vIHJlbW90ZWx5XG4gIGlmICghdGhpcy5pc1JlbW90ZVVzZSkge1xuICAgIC8vIHVwZGF0ZSBhbGwgZWRnZXNcbiAgICB2YXIgZWRnZTtcbiAgICB2YXIgYWxsRWRnZXMgPSB0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxFZGdlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsRWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGVkZ2UgPSBhbGxFZGdlc1tpXTtcbiAgICAgIC8vICAgICAgdGhpcy51cGRhdGUoZWRnZSk7XG4gICAgfVxuXG4gICAgLy8gcmVjdXJzaXZlbHkgdXBkYXRlIG5vZGVzXG4gICAgdmFyIG5vZGU7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldE5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgLy8gICAgICB0aGlzLnVwZGF0ZShub2RlKTtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgcm9vdCBncmFwaFxuICAgIHRoaXMudXBkYXRlKHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKSk7XG4gIH1cbn07XG5cbkxheW91dC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKG9iaikge1xuICBpZiAob2JqID09IG51bGwpIHtcbiAgICB0aGlzLnVwZGF0ZTIoKTtcbiAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBMTm9kZSkge1xuICAgIHZhciBub2RlID0gb2JqO1xuICAgIGlmIChub2RlLmdldENoaWxkKCkgIT0gbnVsbCkge1xuICAgICAgLy8gc2luY2Ugbm9kZSBpcyBjb21wb3VuZCwgcmVjdXJzaXZlbHkgdXBkYXRlIGNoaWxkIG5vZGVzXG4gICAgICB2YXIgbm9kZXMgPSBub2RlLmdldENoaWxkKCkuZ2V0Tm9kZXMoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdXBkYXRlKG5vZGVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgbC1sZXZlbCBub2RlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHYtbGV2ZWwgZ3JhcGggb2JqZWN0LFxuICAgIC8vIHRoZW4gaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSB2LWxldmVsIG5vZGUgaW1wbGVtZW50cyB0aGVcbiAgICAvLyBpbnRlcmZhY2UgVXBkYXRhYmxlLlxuICAgIGlmIChub2RlLnZHcmFwaE9iamVjdCAhPSBudWxsKSB7XG4gICAgICAvLyBjYXN0IHRvIFVwZGF0YWJsZSB3aXRob3V0IGFueSB0eXBlIGNoZWNrXG4gICAgICB2YXIgdk5vZGUgPSBub2RlLnZHcmFwaE9iamVjdDtcblxuICAgICAgLy8gY2FsbCB0aGUgdXBkYXRlIG1ldGhvZCBvZiB0aGUgaW50ZXJmYWNlXG4gICAgICB2Tm9kZS51cGRhdGUobm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExFZGdlKSB7XG4gICAgdmFyIGVkZ2UgPSBvYmo7XG4gICAgLy8gaWYgdGhlIGwtbGV2ZWwgZWRnZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB2LWxldmVsIGdyYXBoIG9iamVjdCxcbiAgICAvLyB0aGVuIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgdi1sZXZlbCBlZGdlIGltcGxlbWVudHMgdGhlXG4gICAgLy8gaW50ZXJmYWNlIFVwZGF0YWJsZS5cblxuICAgIGlmIChlZGdlLnZHcmFwaE9iamVjdCAhPSBudWxsKSB7XG4gICAgICAvLyBjYXN0IHRvIFVwZGF0YWJsZSB3aXRob3V0IGFueSB0eXBlIGNoZWNrXG4gICAgICB2YXIgdkVkZ2UgPSBlZGdlLnZHcmFwaE9iamVjdDtcblxuICAgICAgLy8gY2FsbCB0aGUgdXBkYXRlIG1ldGhvZCBvZiB0aGUgaW50ZXJmYWNlXG4gICAgICB2RWRnZS51cGRhdGUoZWRnZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExHcmFwaCkge1xuICAgIHZhciBncmFwaCA9IG9iajtcbiAgICAvLyBpZiB0aGUgbC1sZXZlbCBncmFwaCBpcyBhc3NvY2lhdGVkIHdpdGggYSB2LWxldmVsIGdyYXBoIG9iamVjdCxcbiAgICAvLyB0aGVuIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgdi1sZXZlbCBvYmplY3QgaW1wbGVtZW50cyB0aGVcbiAgICAvLyBpbnRlcmZhY2UgVXBkYXRhYmxlLlxuXG4gICAgaWYgKGdyYXBoLnZHcmFwaE9iamVjdCAhPSBudWxsKSB7XG4gICAgICAvLyBjYXN0IHRvIFVwZGF0YWJsZSB3aXRob3V0IGFueSB0eXBlIGNoZWNrXG4gICAgICB2YXIgdkdyYXBoID0gZ3JhcGgudkdyYXBoT2JqZWN0O1xuXG4gICAgICAvLyBjYWxsIHRoZSB1cGRhdGUgbWV0aG9kIG9mIHRoZSBpbnRlcmZhY2VcbiAgICAgIHZHcmFwaC51cGRhdGUoZ3JhcGgpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXHJcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IGFsbCBsYXlvdXQgcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlc1xyXG4gKiBkZXRlcm1pbmVkIGF0IGNvbXBpbGUgdGltZS5cclxuICovXG5MYXlvdXQucHJvdG90eXBlLmluaXRQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuaXNTdWJMYXlvdXQpIHtcbiAgICB0aGlzLmxheW91dFF1YWxpdHkgPSBMYXlvdXRDb25zdGFudHMuUVVBTElUWTtcbiAgICB0aGlzLmFuaW1hdGlvbkR1cmluZ0xheW91dCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0FOSU1BVElPTl9EVVJJTkdfTEFZT1VUO1xuICAgIHRoaXMuYW5pbWF0aW9uUGVyaW9kID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX1BFUklPRDtcbiAgICB0aGlzLmFuaW1hdGlvbk9uTGF5b3V0ID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQU5JTUFUSU9OX09OX0xBWU9VVDtcbiAgICB0aGlzLmluY3JlbWVudGFsID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfSU5DUkVNRU5UQUw7XG4gICAgdGhpcy5jcmVhdGVCZW5kc0FzTmVlZGVkID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ1JFQVRFX0JFTkRTX0FTX05FRURFRDtcbiAgICB0aGlzLnVuaWZvcm1MZWFmTm9kZVNpemVzID0gTGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfVU5JRk9STV9MRUFGX05PREVfU0laRVM7XG4gIH1cblxuICBpZiAodGhpcy5hbmltYXRpb25EdXJpbmdMYXlvdXQpIHtcbiAgICB0aGlzLmFuaW1hdGlvbk9uTGF5b3V0ID0gZmFsc2U7XG4gIH1cbn07XG5cbkxheW91dC5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKG5ld0xlZnRUb3ApIHtcbiAgaWYgKG5ld0xlZnRUb3AgPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0obmV3IFBvaW50RCgwLCAwKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gY3JlYXRlIGEgdHJhbnNmb3JtYXRpb24gb2JqZWN0IChmcm9tIEVjbGlwc2UgdG8gbGF5b3V0KS4gV2hlbiBhblxuICAgIC8vIGludmVyc2UgdHJhbnNmb3JtIGlzIGFwcGxpZWQsIHdlIGdldCB1cHBlci1sZWZ0IGNvb3JkaW5hdGUgb2YgdGhlXG4gICAgLy8gZHJhd2luZyBvciB0aGUgcm9vdCBncmFwaCBhdCBnaXZlbiBpbnB1dCBjb29yZGluYXRlIChzb21lIG1hcmdpbnNcbiAgICAvLyBhbHJlYWR5IGluY2x1ZGVkIGluIGNhbGN1bGF0aW9uIG9mIGxlZnQtdG9wKS5cblxuICAgIHZhciB0cmFucyA9IG5ldyBUcmFuc2Zvcm0oKTtcbiAgICB2YXIgbGVmdFRvcCA9IHRoaXMuZ3JhcGhNYW5hZ2VyLmdldFJvb3QoKS51cGRhdGVMZWZ0VG9wKCk7XG5cbiAgICBpZiAobGVmdFRvcCAhPSBudWxsKSB7XG4gICAgICB0cmFucy5zZXRXb3JsZE9yZ1gobmV3TGVmdFRvcC54KTtcbiAgICAgIHRyYW5zLnNldFdvcmxkT3JnWShuZXdMZWZ0VG9wLnkpO1xuXG4gICAgICB0cmFucy5zZXREZXZpY2VPcmdYKGxlZnRUb3AueCk7XG4gICAgICB0cmFucy5zZXREZXZpY2VPcmdZKGxlZnRUb3AueSk7XG5cbiAgICAgIHZhciBub2RlcyA9IHRoaXMuZ2V0QWxsTm9kZXMoKTtcbiAgICAgIHZhciBub2RlO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgbm9kZS50cmFuc2Zvcm0odHJhbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuTGF5b3V0LnByb3RvdHlwZS5wb3NpdGlvbk5vZGVzUmFuZG9tbHkgPSBmdW5jdGlvbiAoZ3JhcGgpIHtcblxuICBpZiAoZ3JhcGggPT0gdW5kZWZpbmVkKSB7XG4gICAgLy9hc3NlcnQgIXRoaXMuaW5jcmVtZW50YWw7XG4gICAgdGhpcy5wb3NpdGlvbk5vZGVzUmFuZG9tbHkodGhpcy5nZXRHcmFwaE1hbmFnZXIoKS5nZXRSb290KCkpO1xuICAgIHRoaXMuZ2V0R3JhcGhNYW5hZ2VyKCkuZ2V0Um9vdCgpLnVwZGF0ZUJvdW5kcyh0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbE5vZGU7XG4gICAgdmFyIGNoaWxkR3JhcGg7XG5cbiAgICB2YXIgbm9kZXMgPSBncmFwaC5nZXROb2RlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxOb2RlID0gbm9kZXNbaV07XG4gICAgICBjaGlsZEdyYXBoID0gbE5vZGUuZ2V0Q2hpbGQoKTtcblxuICAgICAgaWYgKGNoaWxkR3JhcGggPT0gbnVsbCkge1xuICAgICAgICBsTm9kZS5zY2F0dGVyKCk7XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkR3JhcGguZ2V0Tm9kZXMoKS5sZW5ndGggPT0gMCkge1xuICAgICAgICBsTm9kZS5zY2F0dGVyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvc2l0aW9uTm9kZXNSYW5kb21seShjaGlsZEdyYXBoKTtcbiAgICAgICAgbE5vZGUudXBkYXRlQm91bmRzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vKipcclxuICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgdHJlZXMgd2hlcmUgZWFjaCB0cmVlIGlzIHJlcHJlc2VudGVkIGFzIGFcclxuICogbGlzdCBvZiBsLW5vZGVzLiBUaGUgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIHNpemUgMCB3aGVuOlxyXG4gKiAtIFRoZSBncmFwaCBpcyBub3QgZmxhdCBvclxyXG4gKiAtIE9uZSBvZiB0aGUgY29tcG9uZW50KHMpIG9mIHRoZSBncmFwaCBpcyBub3QgYSB0cmVlLlxyXG4gKi9cbkxheW91dC5wcm90b3R5cGUuZ2V0RmxhdEZvcmVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZsYXRGb3Jlc3QgPSBbXTtcbiAgdmFyIGlzRm9yZXN0ID0gdHJ1ZTtcblxuICAvLyBRdWljayByZWZlcmVuY2UgZm9yIGFsbCBub2RlcyBpbiB0aGUgZ3JhcGggbWFuYWdlciBhc3NvY2lhdGVkIHdpdGhcbiAgLy8gdGhpcyBsYXlvdXQuIFRoZSBsaXN0IHNob3VsZCBub3QgYmUgY2hhbmdlZC5cbiAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldE5vZGVzKCk7XG5cbiAgLy8gRmlyc3QgYmUgc3VyZSB0aGF0IHRoZSBncmFwaCBpcyBmbGF0XG4gIHZhciBpc0ZsYXQgPSB0cnVlO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYWxsTm9kZXNbaV0uZ2V0Q2hpbGQoKSAhPSBudWxsKSB7XG4gICAgICBpc0ZsYXQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm4gZW1wdHkgZm9yZXN0IGlmIHRoZSBncmFwaCBpcyBub3QgZmxhdC5cbiAgaWYgKCFpc0ZsYXQpIHtcbiAgICByZXR1cm4gZmxhdEZvcmVzdDtcbiAgfVxuXG4gIC8vIFJ1biBCRlMgZm9yIGVhY2ggY29tcG9uZW50IG9mIHRoZSBncmFwaC5cblxuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIHRvQmVWaXNpdGVkID0gW107XG4gIHZhciBwYXJlbnRzID0gbmV3IE1hcCgpO1xuICB2YXIgdW5Qcm9jZXNzZWROb2RlcyA9IFtdO1xuXG4gIHVuUHJvY2Vzc2VkTm9kZXMgPSB1blByb2Nlc3NlZE5vZGVzLmNvbmNhdChhbGxOb2Rlcyk7XG5cbiAgLy8gRWFjaCBpdGVyYXRpb24gb2YgdGhpcyBsb29wIGZpbmRzIGEgY29tcG9uZW50IG9mIHRoZSBncmFwaCBhbmRcbiAgLy8gZGVjaWRlcyB3aGV0aGVyIGl0IGlzIGEgdHJlZSBvciBub3QuIElmIGl0IGlzIGEgdHJlZSwgYWRkcyBpdCB0byB0aGVcbiAgLy8gZm9yZXN0IGFuZCBjb250aW51ZWQgd2l0aCB0aGUgbmV4dCBjb21wb25lbnQuXG5cbiAgd2hpbGUgKHVuUHJvY2Vzc2VkTm9kZXMubGVuZ3RoID4gMCAmJiBpc0ZvcmVzdCkge1xuICAgIHRvQmVWaXNpdGVkLnB1c2godW5Qcm9jZXNzZWROb2Rlc1swXSk7XG5cbiAgICAvLyBTdGFydCB0aGUgQkZTLiBFYWNoIGl0ZXJhdGlvbiBvZiB0aGlzIGxvb3AgdmlzaXRzIGEgbm9kZSBpbiBhXG4gICAgLy8gQkZTIG1hbm5lci5cbiAgICB3aGlsZSAodG9CZVZpc2l0ZWQubGVuZ3RoID4gMCAmJiBpc0ZvcmVzdCkge1xuICAgICAgLy9wb29sIG9wZXJhdGlvblxuICAgICAgdmFyIGN1cnJlbnROb2RlID0gdG9CZVZpc2l0ZWRbMF07XG4gICAgICB0b0JlVmlzaXRlZC5zcGxpY2UoMCwgMSk7XG4gICAgICB2aXNpdGVkLmFkZChjdXJyZW50Tm9kZSk7XG5cbiAgICAgIC8vIFRyYXZlcnNlIGFsbCBuZWlnaGJvcnMgb2YgdGhpcyBub2RlXG4gICAgICB2YXIgbmVpZ2hib3JFZGdlcyA9IGN1cnJlbnROb2RlLmdldEVkZ2VzKCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVpZ2hib3JFZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY3VycmVudE5laWdoYm9yID0gbmVpZ2hib3JFZGdlc1tpXS5nZXRPdGhlckVuZChjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgLy8gSWYgQkZTIGlzIG5vdCBncm93aW5nIGZyb20gdGhpcyBuZWlnaGJvci5cbiAgICAgICAgaWYgKHBhcmVudHMuZ2V0KGN1cnJlbnROb2RlKSAhPSBjdXJyZW50TmVpZ2hib3IpIHtcbiAgICAgICAgICAvLyBXZSBoYXZlbid0IHByZXZpb3VzbHkgdmlzaXRlZCB0aGlzIG5laWdoYm9yLlxuICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMoY3VycmVudE5laWdoYm9yKSkge1xuICAgICAgICAgICAgdG9CZVZpc2l0ZWQucHVzaChjdXJyZW50TmVpZ2hib3IpO1xuICAgICAgICAgICAgcGFyZW50cy5zZXQoY3VycmVudE5laWdoYm9yLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNpbmNlIHdlIGhhdmUgcHJldmlvdXNseSB2aXNpdGVkIHRoaXMgbmVpZ2hib3IgYW5kXG4gICAgICAgICAgLy8gdGhpcyBuZWlnaGJvciBpcyBub3QgcGFyZW50IG9mIGN1cnJlbnROb2RlLCBnaXZlblxuICAgICAgICAgIC8vIGdyYXBoIGNvbnRhaW5zIGEgY29tcG9uZW50IHRoYXQgaXMgbm90IHRyZWUsIGhlbmNlXG4gICAgICAgICAgLy8gaXQgaXMgbm90IGEgZm9yZXN0LlxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBpc0ZvcmVzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBncmFwaCBjb250YWlucyBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCBhIHRyZWUuIEVtcHR5XG4gICAgLy8gcHJldmlvdXNseSBmb3VuZCB0cmVlcy4gVGhlIG1ldGhvZCB3aWxsIGVuZC5cbiAgICBpZiAoIWlzRm9yZXN0KSB7XG4gICAgICBmbGF0Rm9yZXN0ID0gW107XG4gICAgfVxuICAgIC8vIFNhdmUgY3VycmVudGx5IHZpc2l0ZWQgbm9kZXMgYXMgYSB0cmVlIGluIG91ciBmb3Jlc3QuIFJlc2V0XG4gICAgLy8gdmlzaXRlZCBhbmQgcGFyZW50cyBsaXN0cy4gQ29udGludWUgd2l0aCB0aGUgbmV4dCBjb21wb25lbnQgb2ZcbiAgICAvLyB0aGUgZ3JhcGgsIGlmIGFueS5cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHRlbXAgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHZpc2l0ZWQpKTtcbiAgICAgICAgZmxhdEZvcmVzdC5wdXNoKHRlbXApO1xuICAgICAgICAvL2ZsYXRGb3Jlc3QgPSBmbGF0Rm9yZXN0LmNvbmNhdCh0ZW1wKTtcbiAgICAgICAgLy91blByb2Nlc3NlZE5vZGVzLnJlbW92ZUFsbCh2aXNpdGVkKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZW1wLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gdGVtcFtpXTtcbiAgICAgICAgICB2YXIgaW5kZXggPSB1blByb2Nlc3NlZE5vZGVzLmluZGV4T2YodmFsdWUpO1xuICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB1blByb2Nlc3NlZE5vZGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgIHBhcmVudHMgPSBuZXcgTWFwKCk7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gZmxhdEZvcmVzdDtcbn07XG5cbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGR1bW15IG5vZGVzIChhbiBsLWxldmVsIG5vZGUgd2l0aCBtaW5pbWFsIGRpbWVuc2lvbnMpXHJcbiAqIGZvciB0aGUgZ2l2ZW4gZWRnZSAob25lIHBlciBiZW5kcG9pbnQpLiBUaGUgZXhpc3RpbmcgbC1sZXZlbCBzdHJ1Y3R1cmVcclxuICogaXMgdXBkYXRlZCBhY2NvcmRpbmdseS5cclxuICovXG5MYXlvdXQucHJvdG90eXBlLmNyZWF0ZUR1bW15Tm9kZXNGb3JCZW5kcG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIGR1bW15Tm9kZXMgPSBbXTtcbiAgdmFyIHByZXYgPSBlZGdlLnNvdXJjZTtcblxuICB2YXIgZ3JhcGggPSB0aGlzLmdyYXBoTWFuYWdlci5jYWxjTG93ZXN0Q29tbW9uQW5jZXN0b3IoZWRnZS5zb3VyY2UsIGVkZ2UudGFyZ2V0KTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2UuYmVuZHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgIC8vIGNyZWF0ZSBuZXcgZHVtbXkgbm9kZVxuICAgIHZhciBkdW1teU5vZGUgPSB0aGlzLm5ld05vZGUobnVsbCk7XG4gICAgZHVtbXlOb2RlLnNldFJlY3QobmV3IFBvaW50KDAsIDApLCBuZXcgRGltZW5zaW9uKDEsIDEpKTtcblxuICAgIGdyYXBoLmFkZChkdW1teU5vZGUpO1xuXG4gICAgLy8gY3JlYXRlIG5ldyBkdW1teSBlZGdlIGJldHdlZW4gcHJldiBhbmQgZHVtbXkgbm9kZVxuICAgIHZhciBkdW1teUVkZ2UgPSB0aGlzLm5ld0VkZ2UobnVsbCk7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIuYWRkKGR1bW15RWRnZSwgcHJldiwgZHVtbXlOb2RlKTtcblxuICAgIGR1bW15Tm9kZXMuYWRkKGR1bW15Tm9kZSk7XG4gICAgcHJldiA9IGR1bW15Tm9kZTtcbiAgfVxuXG4gIHZhciBkdW1teUVkZ2UgPSB0aGlzLm5ld0VkZ2UobnVsbCk7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyLmFkZChkdW1teUVkZ2UsIHByZXYsIGVkZ2UudGFyZ2V0KTtcblxuICB0aGlzLmVkZ2VUb0R1bW15Tm9kZXMuc2V0KGVkZ2UsIGR1bW15Tm9kZXMpO1xuXG4gIC8vIHJlbW92ZSByZWFsIGVkZ2UgZnJvbSBncmFwaCBtYW5hZ2VyIGlmIGl0IGlzIGludGVyLWdyYXBoXG4gIGlmIChlZGdlLmlzSW50ZXJHcmFwaCgpKSB7XG4gICAgdGhpcy5ncmFwaE1hbmFnZXIucmVtb3ZlKGVkZ2UpO1xuICB9XG4gIC8vIGVsc2UsIHJlbW92ZSB0aGUgZWRnZSBmcm9tIHRoZSBjdXJyZW50IGdyYXBoXG4gIGVsc2Uge1xuICAgICAgZ3JhcGgucmVtb3ZlKGVkZ2UpO1xuICAgIH1cblxuICByZXR1cm4gZHVtbXlOb2Rlcztcbn07XG5cbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGJlbmRwb2ludHMgZm9yIGVkZ2VzIGZyb20gdGhlIGR1bW15IG5vZGVzXHJcbiAqIGF0IGwtbGV2ZWwuXHJcbiAqL1xuTGF5b3V0LnByb3RvdHlwZS5jcmVhdGVCZW5kcG9pbnRzRnJvbUR1bW15Tm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlZGdlcyA9IFtdO1xuICBlZGdlcyA9IGVkZ2VzLmNvbmNhdCh0aGlzLmdyYXBoTWFuYWdlci5nZXRBbGxFZGdlcygpKTtcbiAgZWRnZXMgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHRoaXMuZWRnZVRvRHVtbXlOb2Rlcy5rZXlzKCkpKS5jb25jYXQoZWRnZXMpO1xuXG4gIGZvciAodmFyIGsgPSAwOyBrIDwgZWRnZXMubGVuZ3RoOyBrKyspIHtcbiAgICB2YXIgbEVkZ2UgPSBlZGdlc1trXTtcblxuICAgIGlmIChsRWRnZS5iZW5kcG9pbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBwYXRoID0gdGhpcy5lZGdlVG9EdW1teU5vZGVzLmdldChsRWRnZSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZHVtbXlOb2RlID0gcGF0aFtpXTtcbiAgICAgICAgdmFyIHAgPSBuZXcgUG9pbnREKGR1bW15Tm9kZS5nZXRDZW50ZXJYKCksIGR1bW15Tm9kZS5nZXRDZW50ZXJZKCkpO1xuXG4gICAgICAgIC8vIHVwZGF0ZSBiZW5kcG9pbnQncyBsb2NhdGlvbiBhY2NvcmRpbmcgdG8gZHVtbXkgbm9kZVxuICAgICAgICB2YXIgZWJwID0gbEVkZ2UuYmVuZHBvaW50cy5nZXQoaSk7XG4gICAgICAgIGVicC54ID0gcC54O1xuICAgICAgICBlYnAueSA9IHAueTtcblxuICAgICAgICAvLyByZW1vdmUgdGhlIGR1bW15IG5vZGUsIGR1bW15IGVkZ2VzIGluY2lkZW50IHdpdGggdGhpc1xuICAgICAgICAvLyBkdW1teSBub2RlIGlzIGFsc28gcmVtb3ZlZCAod2l0aGluIHRoZSByZW1vdmUgbWV0aG9kKVxuICAgICAgICBkdW1teU5vZGUuZ2V0T3duZXIoKS5yZW1vdmUoZHVtbXlOb2RlKTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHRoZSByZWFsIGVkZ2UgdG8gZ3JhcGhcbiAgICAgIHRoaXMuZ3JhcGhNYW5hZ2VyLmFkZChsRWRnZSwgbEVkZ2Uuc291cmNlLCBsRWRnZS50YXJnZXQpO1xuICAgIH1cbiAgfVxufTtcblxuTGF5b3V0LnRyYW5zZm9ybSA9IGZ1bmN0aW9uIChzbGlkZXJWYWx1ZSwgZGVmYXVsdFZhbHVlLCBtaW5EaXYsIG1heE11bCkge1xuICBpZiAobWluRGl2ICE9IHVuZGVmaW5lZCAmJiBtYXhNdWwgIT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuXG4gICAgaWYgKHNsaWRlclZhbHVlIDw9IDUwKSB7XG4gICAgICB2YXIgbWluVmFsdWUgPSBkZWZhdWx0VmFsdWUgLyBtaW5EaXY7XG4gICAgICB2YWx1ZSAtPSAoZGVmYXVsdFZhbHVlIC0gbWluVmFsdWUpIC8gNTAgKiAoNTAgLSBzbGlkZXJWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBtYXhWYWx1ZSA9IGRlZmF1bHRWYWx1ZSAqIG1heE11bDtcbiAgICAgIHZhbHVlICs9IChtYXhWYWx1ZSAtIGRlZmF1bHRWYWx1ZSkgLyA1MCAqIChzbGlkZXJWYWx1ZSAtIDUwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGEsIGI7XG5cbiAgICBpZiAoc2xpZGVyVmFsdWUgPD0gNTApIHtcbiAgICAgIGEgPSA5LjAgKiBkZWZhdWx0VmFsdWUgLyA1MDAuMDtcbiAgICAgIGIgPSBkZWZhdWx0VmFsdWUgLyAxMC4wO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gOS4wICogZGVmYXVsdFZhbHVlIC8gNTAuMDtcbiAgICAgIGIgPSAtOCAqIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYSAqIHNsaWRlclZhbHVlICsgYjtcbiAgfVxufTtcblxuLyoqXHJcbiAqIFRoaXMgbWV0aG9kIGZpbmRzIGFuZCByZXR1cm5zIHRoZSBjZW50ZXIgb2YgdGhlIGdpdmVuIG5vZGVzLCBhc3N1bWluZ1xyXG4gKiB0aGF0IHRoZSBnaXZlbiBub2RlcyBmb3JtIGEgdHJlZSBpbiB0aGVtc2VsdmVzLlxyXG4gKi9cbkxheW91dC5maW5kQ2VudGVyT2ZUcmVlID0gZnVuY3Rpb24gKG5vZGVzKSB7XG4gIHZhciBsaXN0ID0gW107XG4gIGxpc3QgPSBsaXN0LmNvbmNhdChub2Rlcyk7XG5cbiAgdmFyIHJlbW92ZWROb2RlcyA9IFtdO1xuICB2YXIgcmVtYWluaW5nRGVncmVlcyA9IG5ldyBNYXAoKTtcbiAgdmFyIGZvdW5kQ2VudGVyID0gZmFsc2U7XG4gIHZhciBjZW50ZXJOb2RlID0gbnVsbDtcblxuICBpZiAobGlzdC5sZW5ndGggPT0gMSB8fCBsaXN0Lmxlbmd0aCA9PSAyKSB7XG4gICAgZm91bmRDZW50ZXIgPSB0cnVlO1xuICAgIGNlbnRlck5vZGUgPSBsaXN0WzBdO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBsaXN0W2ldO1xuICAgIHZhciBkZWdyZWUgPSBub2RlLmdldE5laWdoYm9yc0xpc3QoKS5zaXplO1xuICAgIHJlbWFpbmluZ0RlZ3JlZXMuc2V0KG5vZGUsIG5vZGUuZ2V0TmVpZ2hib3JzTGlzdCgpLnNpemUpO1xuXG4gICAgaWYgKGRlZ3JlZSA9PSAxKSB7XG4gICAgICByZW1vdmVkTm9kZXMucHVzaChub2RlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgdGVtcExpc3QgPSBbXTtcbiAgdGVtcExpc3QgPSB0ZW1wTGlzdC5jb25jYXQocmVtb3ZlZE5vZGVzKTtcblxuICB3aGlsZSAoIWZvdW5kQ2VudGVyKSB7XG4gICAgdmFyIHRlbXBMaXN0MiA9IFtdO1xuICAgIHRlbXBMaXN0MiA9IHRlbXBMaXN0Mi5jb25jYXQodGVtcExpc3QpO1xuICAgIHRlbXBMaXN0ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbGlzdFtpXTtcblxuICAgICAgdmFyIGluZGV4ID0gbGlzdC5pbmRleE9mKG5vZGUpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgbGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmVpZ2hib3VycyA9IG5vZGUuZ2V0TmVpZ2hib3JzTGlzdCgpO1xuXG4gICAgICBuZWlnaGJvdXJzLmZvckVhY2goZnVuY3Rpb24gKG5laWdoYm91cikge1xuICAgICAgICBpZiAocmVtb3ZlZE5vZGVzLmluZGV4T2YobmVpZ2hib3VyKSA8IDApIHtcbiAgICAgICAgICB2YXIgb3RoZXJEZWdyZWUgPSByZW1haW5pbmdEZWdyZWVzLmdldChuZWlnaGJvdXIpO1xuICAgICAgICAgIHZhciBuZXdEZWdyZWUgPSBvdGhlckRlZ3JlZSAtIDE7XG5cbiAgICAgICAgICBpZiAobmV3RGVncmVlID09IDEpIHtcbiAgICAgICAgICAgIHRlbXBMaXN0LnB1c2gobmVpZ2hib3VyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZW1haW5pbmdEZWdyZWVzLnNldChuZWlnaGJvdXIsIG5ld0RlZ3JlZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbW92ZWROb2RlcyA9IHJlbW92ZWROb2Rlcy5jb25jYXQodGVtcExpc3QpO1xuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09IDEgfHwgbGlzdC5sZW5ndGggPT0gMikge1xuICAgICAgZm91bmRDZW50ZXIgPSB0cnVlO1xuICAgICAgY2VudGVyTm9kZSA9IGxpc3RbMF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNlbnRlck5vZGU7XG59O1xuXG4vKipcclxuICogRHVyaW5nIHRoZSBjb2Fyc2VuaW5nIHByb2Nlc3MsIHRoaXMgbGF5b3V0IG1heSBiZSByZWZlcmVuY2VkIGJ5IHR3byBncmFwaCBtYW5hZ2Vyc1xyXG4gKiB0aGlzIHNldHRlciBmdW5jdGlvbiBncmFudHMgYWNjZXNzIHRvIGNoYW5nZSB0aGUgY3VycmVudGx5IGJlaW5nIHVzZWQgZ3JhcGggbWFuYWdlclxyXG4gKi9cbkxheW91dC5wcm90b3R5cGUuc2V0R3JhcGhNYW5hZ2VyID0gZnVuY3Rpb24gKGdtKSB7XG4gIHRoaXMuZ3JhcGhNYW5hZ2VyID0gZ207XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IExheW91dDtcblxuLyoqKi8gfSksXG4vKiAxNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBSYW5kb21TZWVkKCkge31cbi8vIGFkYXB0ZWQgZnJvbTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE5MzAzNzI1XG5SYW5kb21TZWVkLnNlZWQgPSAxO1xuUmFuZG9tU2VlZC54ID0gMDtcblxuUmFuZG9tU2VlZC5uZXh0RG91YmxlID0gZnVuY3Rpb24gKCkge1xuICBSYW5kb21TZWVkLnggPSBNYXRoLnNpbihSYW5kb21TZWVkLnNlZWQrKykgKiAxMDAwMDtcbiAgcmV0dXJuIFJhbmRvbVNlZWQueCAtIE1hdGguZmxvb3IoUmFuZG9tU2VlZC54KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmFuZG9tU2VlZDtcblxuLyoqKi8gfSksXG4vKiAxNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblxuZnVuY3Rpb24gVHJhbnNmb3JtKHgsIHkpIHtcbiAgdGhpcy5sd29ybGRPcmdYID0gMC4wO1xuICB0aGlzLmx3b3JsZE9yZ1kgPSAwLjA7XG4gIHRoaXMubGRldmljZU9yZ1ggPSAwLjA7XG4gIHRoaXMubGRldmljZU9yZ1kgPSAwLjA7XG4gIHRoaXMubHdvcmxkRXh0WCA9IDEuMDtcbiAgdGhpcy5sd29ybGRFeHRZID0gMS4wO1xuICB0aGlzLmxkZXZpY2VFeHRYID0gMS4wO1xuICB0aGlzLmxkZXZpY2VFeHRZID0gMS4wO1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkT3JnWCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkT3JnWDtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRPcmdYID0gZnVuY3Rpb24gKHdveCkge1xuICB0aGlzLmx3b3JsZE9yZ1ggPSB3b3g7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkT3JnWSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkT3JnWTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRPcmdZID0gZnVuY3Rpb24gKHdveSkge1xuICB0aGlzLmx3b3JsZE9yZ1kgPSB3b3k7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkRXh0WCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkRXh0WDtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRFeHRYID0gZnVuY3Rpb24gKHdleCkge1xuICB0aGlzLmx3b3JsZEV4dFggPSB3ZXg7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldFdvcmxkRXh0WSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubHdvcmxkRXh0WTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0V29ybGRFeHRZID0gZnVuY3Rpb24gKHdleSkge1xuICB0aGlzLmx3b3JsZEV4dFkgPSB3ZXk7XG59O1xuXG4vKiBEZXZpY2UgcmVsYXRlZCAqL1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldERldmljZU9yZ1ggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxkZXZpY2VPcmdYO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5zZXREZXZpY2VPcmdYID0gZnVuY3Rpb24gKGRveCkge1xuICB0aGlzLmxkZXZpY2VPcmdYID0gZG94O1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5nZXREZXZpY2VPcmdZID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sZGV2aWNlT3JnWTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0RGV2aWNlT3JnWSA9IGZ1bmN0aW9uIChkb3kpIHtcbiAgdGhpcy5sZGV2aWNlT3JnWSA9IGRveTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuZ2V0RGV2aWNlRXh0WCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubGRldmljZUV4dFg7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnNldERldmljZUV4dFggPSBmdW5jdGlvbiAoZGV4KSB7XG4gIHRoaXMubGRldmljZUV4dFggPSBkZXg7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmdldERldmljZUV4dFkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxkZXZpY2VFeHRZO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5zZXREZXZpY2VFeHRZID0gZnVuY3Rpb24gKGRleSkge1xuICB0aGlzLmxkZXZpY2VFeHRZID0gZGV5O1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS50cmFuc2Zvcm1YID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIHhEZXZpY2UgPSAwLjA7XG4gIHZhciB3b3JsZEV4dFggPSB0aGlzLmx3b3JsZEV4dFg7XG4gIGlmICh3b3JsZEV4dFggIT0gMC4wKSB7XG4gICAgeERldmljZSA9IHRoaXMubGRldmljZU9yZ1ggKyAoeCAtIHRoaXMubHdvcmxkT3JnWCkgKiB0aGlzLmxkZXZpY2VFeHRYIC8gd29ybGRFeHRYO1xuICB9XG5cbiAgcmV0dXJuIHhEZXZpY2U7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnRyYW5zZm9ybVkgPSBmdW5jdGlvbiAoeSkge1xuICB2YXIgeURldmljZSA9IDAuMDtcbiAgdmFyIHdvcmxkRXh0WSA9IHRoaXMubHdvcmxkRXh0WTtcbiAgaWYgKHdvcmxkRXh0WSAhPSAwLjApIHtcbiAgICB5RGV2aWNlID0gdGhpcy5sZGV2aWNlT3JnWSArICh5IC0gdGhpcy5sd29ybGRPcmdZKSAqIHRoaXMubGRldmljZUV4dFkgLyB3b3JsZEV4dFk7XG4gIH1cblxuICByZXR1cm4geURldmljZTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuaW52ZXJzZVRyYW5zZm9ybVggPSBmdW5jdGlvbiAoeCkge1xuICB2YXIgeFdvcmxkID0gMC4wO1xuICB2YXIgZGV2aWNlRXh0WCA9IHRoaXMubGRldmljZUV4dFg7XG4gIGlmIChkZXZpY2VFeHRYICE9IDAuMCkge1xuICAgIHhXb3JsZCA9IHRoaXMubHdvcmxkT3JnWCArICh4IC0gdGhpcy5sZGV2aWNlT3JnWCkgKiB0aGlzLmx3b3JsZEV4dFggLyBkZXZpY2VFeHRYO1xuICB9XG5cbiAgcmV0dXJuIHhXb3JsZDtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuaW52ZXJzZVRyYW5zZm9ybVkgPSBmdW5jdGlvbiAoeSkge1xuICB2YXIgeVdvcmxkID0gMC4wO1xuICB2YXIgZGV2aWNlRXh0WSA9IHRoaXMubGRldmljZUV4dFk7XG4gIGlmIChkZXZpY2VFeHRZICE9IDAuMCkge1xuICAgIHlXb3JsZCA9IHRoaXMubHdvcmxkT3JnWSArICh5IC0gdGhpcy5sZGV2aWNlT3JnWSkgKiB0aGlzLmx3b3JsZEV4dFkgLyBkZXZpY2VFeHRZO1xuICB9XG4gIHJldHVybiB5V29ybGQ7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLmludmVyc2VUcmFuc2Zvcm1Qb2ludCA9IGZ1bmN0aW9uIChpblBvaW50KSB7XG4gIHZhciBvdXRQb2ludCA9IG5ldyBQb2ludEQodGhpcy5pbnZlcnNlVHJhbnNmb3JtWChpblBvaW50LngpLCB0aGlzLmludmVyc2VUcmFuc2Zvcm1ZKGluUG9pbnQueSkpO1xuICByZXR1cm4gb3V0UG9pbnQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxuLyoqKi8gfSksXG4vKiAxOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblxudmFyIExheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIElHZW9tZXRyeSA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG52YXIgSU1hdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXG5mdW5jdGlvbiBGRExheW91dCgpIHtcbiAgTGF5b3V0LmNhbGwodGhpcyk7XG5cbiAgdGhpcy51c2VTbWFydElkZWFsRWRnZUxlbmd0aENhbGN1bGF0aW9uID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9VU0VfU01BUlRfSURFQUxfRURHRV9MRU5HVEhfQ0FMQ1VMQVRJT047XG4gIHRoaXMuZ3Jhdml0eUNvbnN0YW50ID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9HUkFWSVRZX1NUUkVOR1RIO1xuICB0aGlzLmNvbXBvdW5kR3Jhdml0eUNvbnN0YW50ID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1NUUkVOR1RIO1xuICB0aGlzLmdyYXZpdHlSYW5nZUZhY3RvciA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9SQU5HRV9GQUNUT1I7XG4gIHRoaXMuY29tcG91bmRHcmF2aXR5UmFuZ2VGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfUkFOR0VfRkFDVE9SO1xuICB0aGlzLmRpc3BsYWNlbWVudFRocmVzaG9sZFBlck5vZGUgPSAzLjAgKiBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC8gMTAwO1xuICB0aGlzLmNvb2xpbmdGYWN0b3IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMO1xuICB0aGlzLmluaXRpYWxDb29saW5nRmFjdG9yID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTDtcbiAgdGhpcy50b3RhbERpc3BsYWNlbWVudCA9IDAuMDtcbiAgdGhpcy5vbGRUb3RhbERpc3BsYWNlbWVudCA9IDAuMDtcbiAgdGhpcy5tYXhJdGVyYXRpb25zID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX0lURVJBVElPTlM7XG59XG5cbkZETGF5b3V0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTGF5b3V0LnByb3RvdHlwZSk7XG5cbmZvciAodmFyIHByb3AgaW4gTGF5b3V0KSB7XG4gIEZETGF5b3V0W3Byb3BdID0gTGF5b3V0W3Byb3BdO1xufVxuXG5GRExheW91dC5wcm90b3R5cGUuaW5pdFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7XG4gIExheW91dC5wcm90b3R5cGUuaW5pdFBhcmFtZXRlcnMuY2FsbCh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIHRoaXMudG90YWxJdGVyYXRpb25zID0gMDtcbiAgdGhpcy5ub3RBbmltYXRlZEl0ZXJhdGlvbnMgPSAwO1xuXG4gIHRoaXMudXNlRlJHcmlkVmFyaWFudCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfVVNFX1NNQVJUX1JFUFVMU0lPTl9SQU5HRV9DQUxDVUxBVElPTjtcblxuICB0aGlzLmdyaWQgPSBbXTtcbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjSWRlYWxFZGdlTGVuZ3RocyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVkZ2U7XG4gIHZhciBvcmlnaW5hbElkZWFsTGVuZ3RoO1xuICB2YXIgbGNhRGVwdGg7XG4gIHZhciBzb3VyY2U7XG4gIHZhciB0YXJnZXQ7XG4gIHZhciBzaXplT2ZTb3VyY2VJbkxjYTtcbiAgdmFyIHNpemVPZlRhcmdldEluTGNhO1xuXG4gIHZhciBhbGxFZGdlcyA9IHRoaXMuZ2V0R3JhcGhNYW5hZ2VyKCkuZ2V0QWxsRWRnZXMoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxFZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIGVkZ2UgPSBhbGxFZGdlc1tpXTtcblxuICAgIG9yaWdpbmFsSWRlYWxMZW5ndGggPSBlZGdlLmlkZWFsTGVuZ3RoO1xuXG4gICAgaWYgKGVkZ2UuaXNJbnRlckdyYXBoKSB7XG4gICAgICBzb3VyY2UgPSBlZGdlLmdldFNvdXJjZSgpO1xuICAgICAgdGFyZ2V0ID0gZWRnZS5nZXRUYXJnZXQoKTtcblxuICAgICAgc2l6ZU9mU291cmNlSW5MY2EgPSBlZGdlLmdldFNvdXJjZUluTGNhKCkuZ2V0RXN0aW1hdGVkU2l6ZSgpO1xuICAgICAgc2l6ZU9mVGFyZ2V0SW5MY2EgPSBlZGdlLmdldFRhcmdldEluTGNhKCkuZ2V0RXN0aW1hdGVkU2l6ZSgpO1xuXG4gICAgICBpZiAodGhpcy51c2VTbWFydElkZWFsRWRnZUxlbmd0aENhbGN1bGF0aW9uKSB7XG4gICAgICAgIGVkZ2UuaWRlYWxMZW5ndGggKz0gc2l6ZU9mU291cmNlSW5MY2EgKyBzaXplT2ZUYXJnZXRJbkxjYSAtIDIgKiBMYXlvdXRDb25zdGFudHMuU0lNUExFX05PREVfU0laRTtcbiAgICAgIH1cblxuICAgICAgbGNhRGVwdGggPSBlZGdlLmdldExjYSgpLmdldEluY2x1c2lvblRyZWVEZXB0aCgpO1xuXG4gICAgICBlZGdlLmlkZWFsTGVuZ3RoICs9IG9yaWdpbmFsSWRlYWxMZW5ndGggKiBGRExheW91dENvbnN0YW50cy5QRVJfTEVWRUxfSURFQUxfRURHRV9MRU5HVEhfRkFDVE9SICogKHNvdXJjZS5nZXRJbmNsdXNpb25UcmVlRGVwdGgoKSArIHRhcmdldC5nZXRJbmNsdXNpb25UcmVlRGVwdGgoKSAtIDIgKiBsY2FEZXB0aCk7XG4gICAgfVxuICB9XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuaW5pdFNwcmluZ0VtYmVkZGVyID0gZnVuY3Rpb24gKCkge1xuXG4gIHZhciBzID0gdGhpcy5nZXRBbGxOb2RlcygpLmxlbmd0aDtcbiAgaWYgKHRoaXMuaW5jcmVtZW50YWwpIHtcbiAgICBpZiAocyA+IEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fTE9XRVJfTk9ERV9MSU1JVCkge1xuICAgICAgdGhpcy5jb29saW5nRmFjdG9yID0gTWF0aC5tYXgodGhpcy5jb29saW5nRmFjdG9yICogRkRMYXlvdXRDb25zdGFudHMuQ09PTElOR19BREFQVEFUSU9OX0ZBQ1RPUiwgdGhpcy5jb29saW5nRmFjdG9yIC0gKHMgLSBGRExheW91dENvbnN0YW50cy5BREFQVEFUSU9OX0xPV0VSX05PREVfTElNSVQpIC8gKEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fVVBQRVJfTk9ERV9MSU1JVCAtIEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fTE9XRVJfTk9ERV9MSU1JVCkgKiB0aGlzLmNvb2xpbmdGYWN0b3IgKiAoMSAtIEZETGF5b3V0Q29uc3RhbnRzLkNPT0xJTkdfQURBUFRBVElPTl9GQUNUT1IpKTtcbiAgICB9XG4gICAgdGhpcy5tYXhOb2RlRGlzcGxhY2VtZW50ID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX05PREVfRElTUExBQ0VNRU5UX0lOQ1JFTUVOVEFMO1xuICB9IGVsc2Uge1xuICAgIGlmIChzID4gRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9MT1dFUl9OT0RFX0xJTUlUKSB7XG4gICAgICB0aGlzLmNvb2xpbmdGYWN0b3IgPSBNYXRoLm1heChGRExheW91dENvbnN0YW50cy5DT09MSU5HX0FEQVBUQVRJT05fRkFDVE9SLCAxLjAgLSAocyAtIEZETGF5b3V0Q29uc3RhbnRzLkFEQVBUQVRJT05fTE9XRVJfTk9ERV9MSU1JVCkgLyAoRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9VUFBFUl9OT0RFX0xJTUlUIC0gRkRMYXlvdXRDb25zdGFudHMuQURBUFRBVElPTl9MT1dFUl9OT0RFX0xJTUlUKSAqICgxIC0gRkRMYXlvdXRDb25zdGFudHMuQ09PTElOR19BREFQVEFUSU9OX0ZBQ1RPUikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvb2xpbmdGYWN0b3IgPSAxLjA7XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbENvb2xpbmdGYWN0b3IgPSB0aGlzLmNvb2xpbmdGYWN0b3I7XG4gICAgdGhpcy5tYXhOb2RlRGlzcGxhY2VtZW50ID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX05PREVfRElTUExBQ0VNRU5UO1xuICB9XG5cbiAgdGhpcy5tYXhJdGVyYXRpb25zID0gTWF0aC5tYXgodGhpcy5nZXRBbGxOb2RlcygpLmxlbmd0aCAqIDUsIHRoaXMubWF4SXRlcmF0aW9ucyk7XG5cbiAgLy8gUmVhc3NpZ24gdGhpcyBhdHRyaWJ1dGUgYnkgdXNpbmcgbmV3IGNvbnN0YW50IHZhbHVlXG4gIHRoaXMuZGlzcGxhY2VtZW50VGhyZXNob2xkUGVyTm9kZSA9IDMuMCAqIEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggLyAxMDA7XG4gIHRoaXMudG90YWxEaXNwbGFjZW1lbnRUaHJlc2hvbGQgPSB0aGlzLmRpc3BsYWNlbWVudFRocmVzaG9sZFBlck5vZGUgKiB0aGlzLmdldEFsbE5vZGVzKCkubGVuZ3RoO1xuXG4gIHRoaXMucmVwdWxzaW9uUmFuZ2UgPSB0aGlzLmNhbGNSZXB1bHNpb25SYW5nZSgpO1xufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmNhbGNTcHJpbmdGb3JjZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsRWRnZXMgPSB0aGlzLmdldEFsbEVkZ2VzKCk7XG4gIHZhciBlZGdlO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbEVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgZWRnZSA9IGxFZGdlc1tpXTtcblxuICAgIHRoaXMuY2FsY1NwcmluZ0ZvcmNlKGVkZ2UsIGVkZ2UuaWRlYWxMZW5ndGgpO1xuICB9XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuY2FsY1JlcHVsc2lvbkZvcmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGdyaWRVcGRhdGVBbGxvd2VkID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICB2YXIgZm9yY2VUb05vZGVTdXJyb3VuZGluZ1VwZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgdmFyIGksIGo7XG4gIHZhciBub2RlQSwgbm9kZUI7XG4gIHZhciBsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzKCk7XG4gIHZhciBwcm9jZXNzZWROb2RlU2V0O1xuXG4gIGlmICh0aGlzLnVzZUZSR3JpZFZhcmlhbnQpIHtcbiAgICBpZiAodGhpcy50b3RhbEl0ZXJhdGlvbnMgJSBGRExheW91dENvbnN0YW50cy5HUklEX0NBTENVTEFUSU9OX0NIRUNLX1BFUklPRCA9PSAxICYmIGdyaWRVcGRhdGVBbGxvd2VkKSB7XG4gICAgICB0aGlzLnVwZGF0ZUdyaWQoKTtcbiAgICB9XG5cbiAgICBwcm9jZXNzZWROb2RlU2V0ID0gbmV3IFNldCgpO1xuXG4gICAgLy8gY2FsY3VsYXRlIHJlcHVsc2lvbiBmb3JjZXMgYmV0d2VlbiBlYWNoIG5vZGVzIGFuZCBpdHMgc3Vycm91bmRpbmdcbiAgICBmb3IgKGkgPSAwOyBpIDwgbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub2RlQSA9IGxOb2Rlc1tpXTtcbiAgICAgIHRoaXMuY2FsY3VsYXRlUmVwdWxzaW9uRm9yY2VPZkFOb2RlKG5vZGVBLCBwcm9jZXNzZWROb2RlU2V0LCBncmlkVXBkYXRlQWxsb3dlZCwgZm9yY2VUb05vZGVTdXJyb3VuZGluZ1VwZGF0ZSk7XG4gICAgICBwcm9jZXNzZWROb2RlU2V0LmFkZChub2RlQSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5vZGVBID0gbE5vZGVzW2ldO1xuXG4gICAgICBmb3IgKGogPSBpICsgMTsgaiA8IGxOb2Rlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBub2RlQiA9IGxOb2Rlc1tqXTtcblxuICAgICAgICAvLyBJZiBib3RoIG5vZGVzIGFyZSBub3QgbWVtYmVycyBvZiB0aGUgc2FtZSBncmFwaCwgc2tpcC5cbiAgICAgICAgaWYgKG5vZGVBLmdldE93bmVyKCkgIT0gbm9kZUIuZ2V0T3duZXIoKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxjUmVwdWxzaW9uRm9yY2Uobm9kZUEsIG5vZGVCKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjR3Jhdml0YXRpb25hbEZvcmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vZGU7XG4gIHZhciBsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzVG9BcHBseUdyYXZpdGF0aW9uKCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlID0gbE5vZGVzW2ldO1xuICAgIHRoaXMuY2FsY0dyYXZpdGF0aW9uYWxGb3JjZShub2RlKTtcbiAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLm1vdmVOb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGxOb2RlcyA9IHRoaXMuZ2V0QWxsTm9kZXMoKTtcbiAgdmFyIG5vZGU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBub2RlID0gbE5vZGVzW2ldO1xuICAgIG5vZGUubW92ZSgpO1xuICB9XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuY2FsY1NwcmluZ0ZvcmNlID0gZnVuY3Rpb24gKGVkZ2UsIGlkZWFsTGVuZ3RoKSB7XG4gIHZhciBzb3VyY2VOb2RlID0gZWRnZS5nZXRTb3VyY2UoKTtcbiAgdmFyIHRhcmdldE5vZGUgPSBlZGdlLmdldFRhcmdldCgpO1xuXG4gIHZhciBsZW5ndGg7XG4gIHZhciBzcHJpbmdGb3JjZTtcbiAgdmFyIHNwcmluZ0ZvcmNlWDtcbiAgdmFyIHNwcmluZ0ZvcmNlWTtcblxuICAvLyBVcGRhdGUgZWRnZSBsZW5ndGhcbiAgaWYgKHRoaXMudW5pZm9ybUxlYWZOb2RlU2l6ZXMgJiYgc291cmNlTm9kZS5nZXRDaGlsZCgpID09IG51bGwgJiYgdGFyZ2V0Tm9kZS5nZXRDaGlsZCgpID09IG51bGwpIHtcbiAgICBlZGdlLnVwZGF0ZUxlbmd0aFNpbXBsZSgpO1xuICB9IGVsc2Uge1xuICAgIGVkZ2UudXBkYXRlTGVuZ3RoKCk7XG5cbiAgICBpZiAoZWRnZS5pc092ZXJsYXBpbmdTb3VyY2VBbmRUYXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBsZW5ndGggPSBlZGdlLmdldExlbmd0aCgpO1xuXG4gIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuO1xuXG4gIC8vIENhbGN1bGF0ZSBzcHJpbmcgZm9yY2VzXG4gIHNwcmluZ0ZvcmNlID0gZWRnZS5lZGdlRWxhc3RpY2l0eSAqIChsZW5ndGggLSBpZGVhbExlbmd0aCk7XG5cbiAgLy8gUHJvamVjdCBmb3JjZSBvbnRvIHggYW5kIHkgYXhlc1xuICBzcHJpbmdGb3JjZVggPSBzcHJpbmdGb3JjZSAqIChlZGdlLmxlbmd0aFggLyBsZW5ndGgpO1xuICBzcHJpbmdGb3JjZVkgPSBzcHJpbmdGb3JjZSAqIChlZGdlLmxlbmd0aFkgLyBsZW5ndGgpO1xuXG4gIC8vIEFwcGx5IGZvcmNlcyBvbiB0aGUgZW5kIG5vZGVzXG4gIHNvdXJjZU5vZGUuc3ByaW5nRm9yY2VYICs9IHNwcmluZ0ZvcmNlWDtcbiAgc291cmNlTm9kZS5zcHJpbmdGb3JjZVkgKz0gc3ByaW5nRm9yY2VZO1xuICB0YXJnZXROb2RlLnNwcmluZ0ZvcmNlWCAtPSBzcHJpbmdGb3JjZVg7XG4gIHRhcmdldE5vZGUuc3ByaW5nRm9yY2VZIC09IHNwcmluZ0ZvcmNlWTtcbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjUmVwdWxzaW9uRm9yY2UgPSBmdW5jdGlvbiAobm9kZUEsIG5vZGVCKSB7XG4gIHZhciByZWN0QSA9IG5vZGVBLmdldFJlY3QoKTtcbiAgdmFyIHJlY3RCID0gbm9kZUIuZ2V0UmVjdCgpO1xuICB2YXIgb3ZlcmxhcEFtb3VudCA9IG5ldyBBcnJheSgyKTtcbiAgdmFyIGNsaXBQb2ludHMgPSBuZXcgQXJyYXkoNCk7XG4gIHZhciBkaXN0YW5jZVg7XG4gIHZhciBkaXN0YW5jZVk7XG4gIHZhciBkaXN0YW5jZVNxdWFyZWQ7XG4gIHZhciBkaXN0YW5jZTtcbiAgdmFyIHJlcHVsc2lvbkZvcmNlO1xuICB2YXIgcmVwdWxzaW9uRm9yY2VYO1xuICB2YXIgcmVwdWxzaW9uRm9yY2VZO1xuXG4gIGlmIChyZWN0QS5pbnRlcnNlY3RzKHJlY3RCKSkgLy8gdHdvIG5vZGVzIG92ZXJsYXBcbiAgICB7XG4gICAgICAvLyBjYWxjdWxhdGUgc2VwYXJhdGlvbiBhbW91bnQgaW4geCBhbmQgeSBkaXJlY3Rpb25zXG4gICAgICBJR2VvbWV0cnkuY2FsY1NlcGFyYXRpb25BbW91bnQocmVjdEEsIHJlY3RCLCBvdmVybGFwQW1vdW50LCBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIIC8gMi4wKTtcblxuICAgICAgcmVwdWxzaW9uRm9yY2VYID0gMiAqIG92ZXJsYXBBbW91bnRbMF07XG4gICAgICByZXB1bHNpb25Gb3JjZVkgPSAyICogb3ZlcmxhcEFtb3VudFsxXTtcblxuICAgICAgdmFyIGNoaWxkcmVuQ29uc3RhbnQgPSBub2RlQS5ub09mQ2hpbGRyZW4gKiBub2RlQi5ub09mQ2hpbGRyZW4gLyAobm9kZUEubm9PZkNoaWxkcmVuICsgbm9kZUIubm9PZkNoaWxkcmVuKTtcblxuICAgICAgLy8gQXBwbHkgZm9yY2VzIG9uIHRoZSB0d28gbm9kZXNcbiAgICAgIG5vZGVBLnJlcHVsc2lvbkZvcmNlWCAtPSBjaGlsZHJlbkNvbnN0YW50ICogcmVwdWxzaW9uRm9yY2VYO1xuICAgICAgbm9kZUEucmVwdWxzaW9uRm9yY2VZIC09IGNoaWxkcmVuQ29uc3RhbnQgKiByZXB1bHNpb25Gb3JjZVk7XG4gICAgICBub2RlQi5yZXB1bHNpb25Gb3JjZVggKz0gY2hpbGRyZW5Db25zdGFudCAqIHJlcHVsc2lvbkZvcmNlWDtcbiAgICAgIG5vZGVCLnJlcHVsc2lvbkZvcmNlWSArPSBjaGlsZHJlbkNvbnN0YW50ICogcmVwdWxzaW9uRm9yY2VZO1xuICAgIH0gZWxzZSAvLyBubyBvdmVybGFwXG4gICAge1xuICAgICAgLy8gY2FsY3VsYXRlIGRpc3RhbmNlXG5cbiAgICAgIGlmICh0aGlzLnVuaWZvcm1MZWFmTm9kZVNpemVzICYmIG5vZGVBLmdldENoaWxkKCkgPT0gbnVsbCAmJiBub2RlQi5nZXRDaGlsZCgpID09IG51bGwpIC8vIHNpbXBseSBiYXNlIHJlcHVsc2lvbiBvbiBkaXN0YW5jZSBvZiBub2RlIGNlbnRlcnNcbiAgICAgICAge1xuICAgICAgICAgIGRpc3RhbmNlWCA9IHJlY3RCLmdldENlbnRlclgoKSAtIHJlY3RBLmdldENlbnRlclgoKTtcbiAgICAgICAgICBkaXN0YW5jZVkgPSByZWN0Qi5nZXRDZW50ZXJZKCkgLSByZWN0QS5nZXRDZW50ZXJZKCk7XG4gICAgICAgIH0gZWxzZSAvLyB1c2UgY2xpcHBpbmcgcG9pbnRzXG4gICAgICAgIHtcbiAgICAgICAgICBJR2VvbWV0cnkuZ2V0SW50ZXJzZWN0aW9uKHJlY3RBLCByZWN0QiwgY2xpcFBvaW50cyk7XG5cbiAgICAgICAgICBkaXN0YW5jZVggPSBjbGlwUG9pbnRzWzJdIC0gY2xpcFBvaW50c1swXTtcbiAgICAgICAgICBkaXN0YW5jZVkgPSBjbGlwUG9pbnRzWzNdIC0gY2xpcFBvaW50c1sxXTtcbiAgICAgICAgfVxuXG4gICAgICAvLyBObyByZXB1bHNpb24gcmFuZ2UuIEZSIGdyaWQgdmFyaWFudCBzaG91bGQgdGFrZSBjYXJlIG9mIHRoaXMuXG4gICAgICBpZiAoTWF0aC5hYnMoZGlzdGFuY2VYKSA8IEZETGF5b3V0Q29uc3RhbnRzLk1JTl9SRVBVTFNJT05fRElTVCkge1xuICAgICAgICBkaXN0YW5jZVggPSBJTWF0aC5zaWduKGRpc3RhbmNlWCkgKiBGRExheW91dENvbnN0YW50cy5NSU5fUkVQVUxTSU9OX0RJU1Q7XG4gICAgICB9XG5cbiAgICAgIGlmIChNYXRoLmFicyhkaXN0YW5jZVkpIDwgRkRMYXlvdXRDb25zdGFudHMuTUlOX1JFUFVMU0lPTl9ESVNUKSB7XG4gICAgICAgIGRpc3RhbmNlWSA9IElNYXRoLnNpZ24oZGlzdGFuY2VZKSAqIEZETGF5b3V0Q29uc3RhbnRzLk1JTl9SRVBVTFNJT05fRElTVDtcbiAgICAgIH1cblxuICAgICAgZGlzdGFuY2VTcXVhcmVkID0gZGlzdGFuY2VYICogZGlzdGFuY2VYICsgZGlzdGFuY2VZICogZGlzdGFuY2VZO1xuICAgICAgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGlzdGFuY2VTcXVhcmVkKTtcblxuICAgICAgLy8gSGVyZSB3ZSB1c2UgaGFsZiBvZiB0aGUgbm9kZXMnIHJlcHVsc2lvbiB2YWx1ZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgIHJlcHVsc2lvbkZvcmNlID0gKG5vZGVBLm5vZGVSZXB1bHNpb24gLyAyICsgbm9kZUIubm9kZVJlcHVsc2lvbiAvIDIpICogbm9kZUEubm9PZkNoaWxkcmVuICogbm9kZUIubm9PZkNoaWxkcmVuIC8gZGlzdGFuY2VTcXVhcmVkO1xuXG4gICAgICAvLyBQcm9qZWN0IGZvcmNlIG9udG8geCBhbmQgeSBheGVzXG4gICAgICByZXB1bHNpb25Gb3JjZVggPSByZXB1bHNpb25Gb3JjZSAqIGRpc3RhbmNlWCAvIGRpc3RhbmNlO1xuICAgICAgcmVwdWxzaW9uRm9yY2VZID0gcmVwdWxzaW9uRm9yY2UgKiBkaXN0YW5jZVkgLyBkaXN0YW5jZTtcblxuICAgICAgLy8gQXBwbHkgZm9yY2VzIG9uIHRoZSB0d28gbm9kZXMgICAgXG4gICAgICBub2RlQS5yZXB1bHNpb25Gb3JjZVggLT0gcmVwdWxzaW9uRm9yY2VYO1xuICAgICAgbm9kZUEucmVwdWxzaW9uRm9yY2VZIC09IHJlcHVsc2lvbkZvcmNlWTtcbiAgICAgIG5vZGVCLnJlcHVsc2lvbkZvcmNlWCArPSByZXB1bHNpb25Gb3JjZVg7XG4gICAgICBub2RlQi5yZXB1bHNpb25Gb3JjZVkgKz0gcmVwdWxzaW9uRm9yY2VZO1xuICAgIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjR3Jhdml0YXRpb25hbEZvcmNlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIG93bmVyR3JhcGg7XG4gIHZhciBvd25lckNlbnRlclg7XG4gIHZhciBvd25lckNlbnRlclk7XG4gIHZhciBkaXN0YW5jZVg7XG4gIHZhciBkaXN0YW5jZVk7XG4gIHZhciBhYnNEaXN0YW5jZVg7XG4gIHZhciBhYnNEaXN0YW5jZVk7XG4gIHZhciBlc3RpbWF0ZWRTaXplO1xuICBvd25lckdyYXBoID0gbm9kZS5nZXRPd25lcigpO1xuXG4gIG93bmVyQ2VudGVyWCA9IChvd25lckdyYXBoLmdldFJpZ2h0KCkgKyBvd25lckdyYXBoLmdldExlZnQoKSkgLyAyO1xuICBvd25lckNlbnRlclkgPSAob3duZXJHcmFwaC5nZXRUb3AoKSArIG93bmVyR3JhcGguZ2V0Qm90dG9tKCkpIC8gMjtcbiAgZGlzdGFuY2VYID0gbm9kZS5nZXRDZW50ZXJYKCkgLSBvd25lckNlbnRlclg7XG4gIGRpc3RhbmNlWSA9IG5vZGUuZ2V0Q2VudGVyWSgpIC0gb3duZXJDZW50ZXJZO1xuICBhYnNEaXN0YW5jZVggPSBNYXRoLmFicyhkaXN0YW5jZVgpICsgbm9kZS5nZXRXaWR0aCgpIC8gMjtcbiAgYWJzRGlzdGFuY2VZID0gTWF0aC5hYnMoZGlzdGFuY2VZKSArIG5vZGUuZ2V0SGVpZ2h0KCkgLyAyO1xuXG4gIGlmIChub2RlLmdldE93bmVyKCkgPT0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpKSAvLyBpbiB0aGUgcm9vdCBncmFwaFxuICAgIHtcbiAgICAgIGVzdGltYXRlZFNpemUgPSBvd25lckdyYXBoLmdldEVzdGltYXRlZFNpemUoKSAqIHRoaXMuZ3Jhdml0eVJhbmdlRmFjdG9yO1xuXG4gICAgICBpZiAoYWJzRGlzdGFuY2VYID4gZXN0aW1hdGVkU2l6ZSB8fCBhYnNEaXN0YW5jZVkgPiBlc3RpbWF0ZWRTaXplKSB7XG4gICAgICAgIG5vZGUuZ3Jhdml0YXRpb25Gb3JjZVggPSAtdGhpcy5ncmF2aXR5Q29uc3RhbnQgKiBkaXN0YW5jZVg7XG4gICAgICAgIG5vZGUuZ3Jhdml0YXRpb25Gb3JjZVkgPSAtdGhpcy5ncmF2aXR5Q29uc3RhbnQgKiBkaXN0YW5jZVk7XG4gICAgICB9XG4gICAgfSBlbHNlIC8vIGluc2lkZSBhIGNvbXBvdW5kXG4gICAge1xuICAgICAgZXN0aW1hdGVkU2l6ZSA9IG93bmVyR3JhcGguZ2V0RXN0aW1hdGVkU2l6ZSgpICogdGhpcy5jb21wb3VuZEdyYXZpdHlSYW5nZUZhY3RvcjtcblxuICAgICAgaWYgKGFic0Rpc3RhbmNlWCA+IGVzdGltYXRlZFNpemUgfHwgYWJzRGlzdGFuY2VZID4gZXN0aW1hdGVkU2l6ZSkge1xuICAgICAgICBub2RlLmdyYXZpdGF0aW9uRm9yY2VYID0gLXRoaXMuZ3Jhdml0eUNvbnN0YW50ICogZGlzdGFuY2VYICogdGhpcy5jb21wb3VuZEdyYXZpdHlDb25zdGFudDtcbiAgICAgICAgbm9kZS5ncmF2aXRhdGlvbkZvcmNlWSA9IC10aGlzLmdyYXZpdHlDb25zdGFudCAqIGRpc3RhbmNlWSAqIHRoaXMuY29tcG91bmRHcmF2aXR5Q29uc3RhbnQ7XG4gICAgICB9XG4gICAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmlzQ29udmVyZ2VkID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY29udmVyZ2VkO1xuICB2YXIgb3NjaWxhdGluZyA9IGZhbHNlO1xuXG4gIGlmICh0aGlzLnRvdGFsSXRlcmF0aW9ucyA+IHRoaXMubWF4SXRlcmF0aW9ucyAvIDMpIHtcbiAgICBvc2NpbGF0aW5nID0gTWF0aC5hYnModGhpcy50b3RhbERpc3BsYWNlbWVudCAtIHRoaXMub2xkVG90YWxEaXNwbGFjZW1lbnQpIDwgMjtcbiAgfVxuXG4gIGNvbnZlcmdlZCA9IHRoaXMudG90YWxEaXNwbGFjZW1lbnQgPCB0aGlzLnRvdGFsRGlzcGxhY2VtZW50VGhyZXNob2xkO1xuXG4gIHRoaXMub2xkVG90YWxEaXNwbGFjZW1lbnQgPSB0aGlzLnRvdGFsRGlzcGxhY2VtZW50O1xuXG4gIHJldHVybiBjb252ZXJnZWQgfHwgb3NjaWxhdGluZztcbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5hbmltYXRlID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5hbmltYXRpb25EdXJpbmdMYXlvdXQgJiYgIXRoaXMuaXNTdWJMYXlvdXQpIHtcbiAgICBpZiAodGhpcy5ub3RBbmltYXRlZEl0ZXJhdGlvbnMgPT0gdGhpcy5hbmltYXRpb25QZXJpb2QpIHtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICB0aGlzLm5vdEFuaW1hdGVkSXRlcmF0aW9ucyA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubm90QW5pbWF0ZWRJdGVyYXRpb25zKys7XG4gICAgfVxuICB9XG59O1xuXG4vL1RoaXMgbWV0aG9kIGNhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiAod2VpZ2h0KSBmb3IgYWxsIG5vZGVzXG5GRExheW91dC5wcm90b3R5cGUuY2FsY05vT2ZDaGlsZHJlbkZvckFsbE5vZGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm9kZTtcbiAgdmFyIGFsbE5vZGVzID0gdGhpcy5ncmFwaE1hbmFnZXIuZ2V0QWxsTm9kZXMoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IGFsbE5vZGVzW2ldO1xuICAgIG5vZGUubm9PZkNoaWxkcmVuID0gbm9kZS5nZXROb09mQ2hpbGRyZW4oKTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlY3Rpb246IEZSLUdyaWQgVmFyaWFudCBSZXB1bHNpb24gRm9yY2UgQ2FsY3VsYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjR3JpZCA9IGZ1bmN0aW9uIChncmFwaCkge1xuXG4gIHZhciBzaXplWCA9IDA7XG4gIHZhciBzaXplWSA9IDA7XG5cbiAgc2l6ZVggPSBwYXJzZUludChNYXRoLmNlaWwoKGdyYXBoLmdldFJpZ2h0KCkgLSBncmFwaC5nZXRMZWZ0KCkpIC8gdGhpcy5yZXB1bHNpb25SYW5nZSkpO1xuICBzaXplWSA9IHBhcnNlSW50KE1hdGguY2VpbCgoZ3JhcGguZ2V0Qm90dG9tKCkgLSBncmFwaC5nZXRUb3AoKSkgLyB0aGlzLnJlcHVsc2lvblJhbmdlKSk7XG5cbiAgdmFyIGdyaWQgPSBuZXcgQXJyYXkoc2l6ZVgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZVg7IGkrKykge1xuICAgIGdyaWRbaV0gPSBuZXcgQXJyYXkoc2l6ZVkpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplWDsgaSsrKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzaXplWTsgaisrKSB7XG4gICAgICBncmlkW2ldW2pdID0gbmV3IEFycmF5KCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdyaWQ7XG59O1xuXG5GRExheW91dC5wcm90b3R5cGUuYWRkTm9kZVRvR3JpZCA9IGZ1bmN0aW9uICh2LCBsZWZ0LCB0b3ApIHtcblxuICB2YXIgc3RhcnRYID0gMDtcbiAgdmFyIGZpbmlzaFggPSAwO1xuICB2YXIgc3RhcnRZID0gMDtcbiAgdmFyIGZpbmlzaFkgPSAwO1xuXG4gIHN0YXJ0WCA9IHBhcnNlSW50KE1hdGguZmxvb3IoKHYuZ2V0UmVjdCgpLnggLSBsZWZ0KSAvIHRoaXMucmVwdWxzaW9uUmFuZ2UpKTtcbiAgZmluaXNoWCA9IHBhcnNlSW50KE1hdGguZmxvb3IoKHYuZ2V0UmVjdCgpLndpZHRoICsgdi5nZXRSZWN0KCkueCAtIGxlZnQpIC8gdGhpcy5yZXB1bHNpb25SYW5nZSkpO1xuICBzdGFydFkgPSBwYXJzZUludChNYXRoLmZsb29yKCh2LmdldFJlY3QoKS55IC0gdG9wKSAvIHRoaXMucmVwdWxzaW9uUmFuZ2UpKTtcbiAgZmluaXNoWSA9IHBhcnNlSW50KE1hdGguZmxvb3IoKHYuZ2V0UmVjdCgpLmhlaWdodCArIHYuZ2V0UmVjdCgpLnkgLSB0b3ApIC8gdGhpcy5yZXB1bHNpb25SYW5nZSkpO1xuXG4gIGZvciAodmFyIGkgPSBzdGFydFg7IGkgPD0gZmluaXNoWDsgaSsrKSB7XG4gICAgZm9yICh2YXIgaiA9IHN0YXJ0WTsgaiA8PSBmaW5pc2hZOyBqKyspIHtcbiAgICAgIHRoaXMuZ3JpZFtpXVtqXS5wdXNoKHYpO1xuICAgICAgdi5zZXRHcmlkQ29vcmRpbmF0ZXMoc3RhcnRYLCBmaW5pc2hYLCBzdGFydFksIGZpbmlzaFkpO1xuICAgIH1cbiAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLnVwZGF0ZUdyaWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpO1xuICB2YXIgbm9kZUE7XG4gIHZhciBsTm9kZXMgPSB0aGlzLmdldEFsbE5vZGVzKCk7XG5cbiAgdGhpcy5ncmlkID0gdGhpcy5jYWxjR3JpZCh0aGlzLmdyYXBoTWFuYWdlci5nZXRSb290KCkpO1xuXG4gIC8vIHB1dCBhbGwgbm9kZXMgdG8gcHJvcGVyIGdyaWQgY2VsbHNcbiAgZm9yIChpID0gMDsgaSA8IGxOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIG5vZGVBID0gbE5vZGVzW2ldO1xuICAgIHRoaXMuYWRkTm9kZVRvR3JpZChub2RlQSwgdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldExlZnQoKSwgdGhpcy5ncmFwaE1hbmFnZXIuZ2V0Um9vdCgpLmdldFRvcCgpKTtcbiAgfVxufTtcblxuRkRMYXlvdXQucHJvdG90eXBlLmNhbGN1bGF0ZVJlcHVsc2lvbkZvcmNlT2ZBTm9kZSA9IGZ1bmN0aW9uIChub2RlQSwgcHJvY2Vzc2VkTm9kZVNldCwgZ3JpZFVwZGF0ZUFsbG93ZWQsIGZvcmNlVG9Ob2RlU3Vycm91bmRpbmdVcGRhdGUpIHtcblxuICBpZiAodGhpcy50b3RhbEl0ZXJhdGlvbnMgJSBGRExheW91dENvbnN0YW50cy5HUklEX0NBTENVTEFUSU9OX0NIRUNLX1BFUklPRCA9PSAxICYmIGdyaWRVcGRhdGVBbGxvd2VkIHx8IGZvcmNlVG9Ob2RlU3Vycm91bmRpbmdVcGRhdGUpIHtcbiAgICB2YXIgc3Vycm91bmRpbmcgPSBuZXcgU2V0KCk7XG4gICAgbm9kZUEuc3Vycm91bmRpbmcgPSBuZXcgQXJyYXkoKTtcbiAgICB2YXIgbm9kZUI7XG4gICAgdmFyIGdyaWQgPSB0aGlzLmdyaWQ7XG5cbiAgICBmb3IgKHZhciBpID0gbm9kZUEuc3RhcnRYIC0gMTsgaSA8IG5vZGVBLmZpbmlzaFggKyAyOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSBub2RlQS5zdGFydFkgLSAxOyBqIDwgbm9kZUEuZmluaXNoWSArIDI7IGorKykge1xuICAgICAgICBpZiAoIShpIDwgMCB8fCBqIDwgMCB8fCBpID49IGdyaWQubGVuZ3RoIHx8IGogPj0gZ3JpZFswXS5sZW5ndGgpKSB7XG4gICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBncmlkW2ldW2pdLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBub2RlQiA9IGdyaWRbaV1bal1ba107XG5cbiAgICAgICAgICAgIC8vIElmIGJvdGggbm9kZXMgYXJlIG5vdCBtZW1iZXJzIG9mIHRoZSBzYW1lIGdyYXBoLCBcbiAgICAgICAgICAgIC8vIG9yIGJvdGggbm9kZXMgYXJlIHRoZSBzYW1lLCBza2lwLlxuICAgICAgICAgICAgaWYgKG5vZGVBLmdldE93bmVyKCkgIT0gbm9kZUIuZ2V0T3duZXIoKSB8fCBub2RlQSA9PSBub2RlQikge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHJlcHVsc2lvbiBmb3JjZSBiZXR3ZWVuXG4gICAgICAgICAgICAvLyBub2RlQSBhbmQgbm9kZUIgaGFzIGFscmVhZHkgYmVlbiBjYWxjdWxhdGVkXG4gICAgICAgICAgICBpZiAoIXByb2Nlc3NlZE5vZGVTZXQuaGFzKG5vZGVCKSAmJiAhc3Vycm91bmRpbmcuaGFzKG5vZGVCKSkge1xuICAgICAgICAgICAgICB2YXIgZGlzdGFuY2VYID0gTWF0aC5hYnMobm9kZUEuZ2V0Q2VudGVyWCgpIC0gbm9kZUIuZ2V0Q2VudGVyWCgpKSAtIChub2RlQS5nZXRXaWR0aCgpIC8gMiArIG5vZGVCLmdldFdpZHRoKCkgLyAyKTtcbiAgICAgICAgICAgICAgdmFyIGRpc3RhbmNlWSA9IE1hdGguYWJzKG5vZGVBLmdldENlbnRlclkoKSAtIG5vZGVCLmdldENlbnRlclkoKSkgLSAobm9kZUEuZ2V0SGVpZ2h0KCkgLyAyICsgbm9kZUIuZ2V0SGVpZ2h0KCkgLyAyKTtcblxuICAgICAgICAgICAgICAvLyBpZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiBub2RlQSBhbmQgbm9kZUIgXG4gICAgICAgICAgICAgIC8vIGlzIGxlc3MgdGhlbiBjYWxjdWxhdGlvbiByYW5nZVxuICAgICAgICAgICAgICBpZiAoZGlzdGFuY2VYIDw9IHRoaXMucmVwdWxzaW9uUmFuZ2UgJiYgZGlzdGFuY2VZIDw9IHRoaXMucmVwdWxzaW9uUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAvL3RoZW4gYWRkIG5vZGVCIHRvIHN1cnJvdW5kaW5nIG9mIG5vZGVBXG4gICAgICAgICAgICAgICAgc3Vycm91bmRpbmcuYWRkKG5vZGVCKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGVBLnN1cnJvdW5kaW5nID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShzdXJyb3VuZGluZykpO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCBub2RlQS5zdXJyb3VuZGluZy5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMuY2FsY1JlcHVsc2lvbkZvcmNlKG5vZGVBLCBub2RlQS5zdXJyb3VuZGluZ1tpXSk7XG4gIH1cbn07XG5cbkZETGF5b3V0LnByb3RvdHlwZS5jYWxjUmVwdWxzaW9uUmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAwLjA7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZETGF5b3V0O1xuXG4vKioqLyB9KSxcbi8qIDE5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG52YXIgRkRMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXG5mdW5jdGlvbiBGRExheW91dEVkZ2Uoc291cmNlLCB0YXJnZXQsIHZFZGdlKSB7XG4gIExFZGdlLmNhbGwodGhpcywgc291cmNlLCB0YXJnZXQsIHZFZGdlKTtcblxuICAvLyBJZGVhbCBsZW5ndGggYW5kIGVsYXN0aWNpdHkgdmFsdWUgZm9yIHRoaXMgZWRnZVxuICB0aGlzLmlkZWFsTGVuZ3RoID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9FREdFX0xFTkdUSDtcbiAgdGhpcy5lZGdlRWxhc3RpY2l0eSA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfU1BSSU5HX1NUUkVOR1RIO1xufVxuXG5GRExheW91dEVkZ2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMRWRnZS5wcm90b3R5cGUpO1xuXG5mb3IgKHZhciBwcm9wIGluIExFZGdlKSB7XG4gIEZETGF5b3V0RWRnZVtwcm9wXSA9IExFZGdlW3Byb3BdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEZETGF5b3V0RWRnZTtcblxuLyoqKi8gfSksXG4vKiAyMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgTE5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblxuZnVuY3Rpb24gRkRMYXlvdXROb2RlKGdtLCBsb2MsIHNpemUsIHZOb2RlKSB7XG4gIC8vIGFsdGVybmF0aXZlIGNvbnN0cnVjdG9yIGlzIGhhbmRsZWQgaW5zaWRlIExOb2RlXG4gIExOb2RlLmNhbGwodGhpcywgZ20sIGxvYywgc2l6ZSwgdk5vZGUpO1xuXG4gIC8vIFJlcHVsc2lvbiB2YWx1ZSBvZiB0aGlzIG5vZGVcbiAgdGhpcy5ub2RlUmVwdWxzaW9uID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9SRVBVTFNJT05fU1RSRU5HVEg7XG5cbiAgLy9TcHJpbmcsIHJlcHVsc2lvbiBhbmQgZ3Jhdml0YXRpb25hbCBmb3JjZXMgYWN0aW5nIG9uIHRoaXMgbm9kZVxuICB0aGlzLnNwcmluZ0ZvcmNlWCA9IDA7XG4gIHRoaXMuc3ByaW5nRm9yY2VZID0gMDtcbiAgdGhpcy5yZXB1bHNpb25Gb3JjZVggPSAwO1xuICB0aGlzLnJlcHVsc2lvbkZvcmNlWSA9IDA7XG4gIHRoaXMuZ3Jhdml0YXRpb25Gb3JjZVggPSAwO1xuICB0aGlzLmdyYXZpdGF0aW9uRm9yY2VZID0gMDtcbiAgLy9BbW91bnQgYnkgd2hpY2ggdGhpcyBub2RlIGlzIHRvIGJlIG1vdmVkIGluIHRoaXMgaXRlcmF0aW9uXG4gIHRoaXMuZGlzcGxhY2VtZW50WCA9IDA7XG4gIHRoaXMuZGlzcGxhY2VtZW50WSA9IDA7XG5cbiAgLy9TdGFydCBhbmQgZmluaXNoIGdyaWQgY29vcmRpbmF0ZXMgdGhhdCB0aGlzIG5vZGUgaXMgZmFsbGVuIGludG9cbiAgdGhpcy5zdGFydFggPSAwO1xuICB0aGlzLmZpbmlzaFggPSAwO1xuICB0aGlzLnN0YXJ0WSA9IDA7XG4gIHRoaXMuZmluaXNoWSA9IDA7XG5cbiAgLy9HZW9tZXRyaWMgbmVpZ2hib3JzIG9mIHRoaXMgbm9kZVxuICB0aGlzLnN1cnJvdW5kaW5nID0gW107XG59XG5cbkZETGF5b3V0Tm9kZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKExOb2RlLnByb3RvdHlwZSk7XG5cbmZvciAodmFyIHByb3AgaW4gTE5vZGUpIHtcbiAgRkRMYXlvdXROb2RlW3Byb3BdID0gTE5vZGVbcHJvcF07XG59XG5cbkZETGF5b3V0Tm9kZS5wcm90b3R5cGUuc2V0R3JpZENvb3JkaW5hdGVzID0gZnVuY3Rpb24gKF9zdGFydFgsIF9maW5pc2hYLCBfc3RhcnRZLCBfZmluaXNoWSkge1xuICB0aGlzLnN0YXJ0WCA9IF9zdGFydFg7XG4gIHRoaXMuZmluaXNoWCA9IF9maW5pc2hYO1xuICB0aGlzLnN0YXJ0WSA9IF9zdGFydFk7XG4gIHRoaXMuZmluaXNoWSA9IF9maW5pc2hZO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBGRExheW91dE5vZGU7XG5cbi8qKiovIH0pLFxuLyogMjEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gRGltZW5zaW9uRCh3aWR0aCwgaGVpZ2h0KSB7XG4gIHRoaXMud2lkdGggPSAwO1xuICB0aGlzLmhlaWdodCA9IDA7XG4gIGlmICh3aWR0aCAhPT0gbnVsbCAmJiBoZWlnaHQgIT09IG51bGwpIHtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gIH1cbn1cblxuRGltZW5zaW9uRC5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndpZHRoO1xufTtcblxuRGltZW5zaW9uRC5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcbiAgdGhpcy53aWR0aCA9IHdpZHRoO1xufTtcblxuRGltZW5zaW9uRC5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5oZWlnaHQ7XG59O1xuXG5EaW1lbnNpb25ELnByb3RvdHlwZS5zZXRIZWlnaHQgPSBmdW5jdGlvbiAoaGVpZ2h0KSB7XG4gIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBEaW1lbnNpb25EO1xuXG4vKioqLyB9KSxcbi8qIDIyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBVbmlxdWVJREdlbmVyZXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xuXG5mdW5jdGlvbiBIYXNoTWFwKCkge1xuICB0aGlzLm1hcCA9IHt9O1xuICB0aGlzLmtleXMgPSBbXTtcbn1cblxuSGFzaE1hcC5wcm90b3R5cGUucHV0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdmFyIHRoZUlkID0gVW5pcXVlSURHZW5lcmV0b3IuY3JlYXRlSUQoa2V5KTtcbiAgaWYgKCF0aGlzLmNvbnRhaW5zKHRoZUlkKSkge1xuICAgIHRoaXMubWFwW3RoZUlkXSA9IHZhbHVlO1xuICAgIHRoaXMua2V5cy5wdXNoKGtleSk7XG4gIH1cbn07XG5cbkhhc2hNYXAucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgdGhlSWQgPSBVbmlxdWVJREdlbmVyZXRvci5jcmVhdGVJRChrZXkpO1xuICByZXR1cm4gdGhpcy5tYXBba2V5XSAhPSBudWxsO1xufTtcblxuSGFzaE1hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICB2YXIgdGhlSWQgPSBVbmlxdWVJREdlbmVyZXRvci5jcmVhdGVJRChrZXkpO1xuICByZXR1cm4gdGhpcy5tYXBbdGhlSWRdO1xufTtcblxuSGFzaE1hcC5wcm90b3R5cGUua2V5U2V0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5rZXlzO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBIYXNoTWFwO1xuXG4vKioqLyB9KSxcbi8qIDIzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBVbmlxdWVJREdlbmVyZXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xuXG5mdW5jdGlvbiBIYXNoU2V0KCkge1xuICB0aGlzLnNldCA9IHt9O1xufVxuO1xuXG5IYXNoU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciB0aGVJZCA9IFVuaXF1ZUlER2VuZXJldG9yLmNyZWF0ZUlEKG9iaik7XG4gIGlmICghdGhpcy5jb250YWlucyh0aGVJZCkpIHRoaXMuc2V0W3RoZUlkXSA9IG9iajtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgZGVsZXRlIHRoaXMuc2V0W1VuaXF1ZUlER2VuZXJldG9yLmNyZWF0ZUlEKG9iaildO1xufTtcblxuSGFzaFNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2V0ID0ge307XG59O1xuXG5IYXNoU2V0LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHRoaXMuc2V0W1VuaXF1ZUlER2VuZXJldG9yLmNyZWF0ZUlEKG9iaildID09IG9iajtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnNpemUoKSA9PT0gMDtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnNldCkubGVuZ3RoO1xufTtcblxuLy9jb25jYXRzIHRoaXMuc2V0IHRvIHRoZSBnaXZlbiBsaXN0XG5IYXNoU2V0LnByb3RvdHlwZS5hZGRBbGxUbyA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModGhpcy5zZXQpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBsaXN0LnB1c2godGhpcy5zZXRba2V5c1tpXV0pO1xuICB9XG59O1xuXG5IYXNoU2V0LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5zZXQpLmxlbmd0aDtcbn07XG5cbkhhc2hTZXQucHJvdG90eXBlLmFkZEFsbCA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gIHZhciBzID0gbGlzdC5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgdmFyIHYgPSBsaXN0W2ldO1xuICAgIHRoaXMuYWRkKHYpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2hTZXQ7XG5cbi8qKiovIH0pLFxuLyogMjQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLy8gU29tZSBtYXRyaXggKDFkIGFuZCAyZCBhcnJheSkgb3BlcmF0aW9uc1xuZnVuY3Rpb24gTWF0cml4KCkge31cblxuLyoqXG4gKiBtYXRyaXggbXVsdGlwbGljYXRpb25cbiAqIGFycmF5MSwgYXJyYXkyIGFuZCByZXN1bHQgYXJlIDJkIGFycmF5c1xuICovXG5NYXRyaXgubXVsdE1hdCA9IGZ1bmN0aW9uIChhcnJheTEsIGFycmF5Mikge1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheTEubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRbaV0gPSBbXTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFycmF5MlswXS5sZW5ndGg7IGorKykge1xuICAgICAgcmVzdWx0W2ldW2pdID0gMDtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgYXJyYXkxWzBdLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHJlc3VsdFtpXVtqXSArPSBhcnJheTFbaV1ba10gKiBhcnJheTJba11bal07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIG1hdHJpeCB0cmFuc3Bvc2VcbiAqIGFycmF5IGFuZCByZXN1bHQgYXJlIDJkIGFycmF5c1xuICovXG5NYXRyaXgudHJhbnNwb3NlID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5WzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzdWx0W2ldID0gW107XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBhcnJheS5sZW5ndGg7IGorKykge1xuICAgICAgcmVzdWx0W2ldW2pdID0gYXJyYXlbal1baV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogbXVsdGlwbHkgYXJyYXkgd2l0aCBjb25zdGFudFxuICogYXJyYXkgYW5kIHJlc3VsdCBhcmUgMWQgYXJyYXlzXG4gKi9cbk1hdHJpeC5tdWx0Q29ucyA9IGZ1bmN0aW9uIChhcnJheSwgY29uc3RhbnQpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRbaV0gPSBhcnJheVtpXSAqIGNvbnN0YW50O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogc3Vic3RyYWN0IHR3byBhcnJheXNcbiAqIGFycmF5MSwgYXJyYXkyIGFuZCByZXN1bHQgYXJlIDFkIGFycmF5c1xuICovXG5NYXRyaXgubWludXNPcCA9IGZ1bmN0aW9uIChhcnJheTEsIGFycmF5Mikge1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheTEubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHRbaV0gPSBhcnJheTFbaV0gLSBhcnJheTJbaV07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBkb3QgcHJvZHVjdCBvZiB0d28gYXJyYXlzIHdpdGggc2FtZSBzaXplXG4gKiBhcnJheTEgYW5kIGFycmF5MiBhcmUgMWQgYXJyYXlzXG4gKi9cbk1hdHJpeC5kb3RQcm9kdWN0ID0gZnVuY3Rpb24gKGFycmF5MSwgYXJyYXkyKSB7XG4gIHZhciBwcm9kdWN0ID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5MS5sZW5ndGg7IGkrKykge1xuICAgIHByb2R1Y3QgKz0gYXJyYXkxW2ldICogYXJyYXkyW2ldO1xuICB9XG5cbiAgcmV0dXJuIHByb2R1Y3Q7XG59O1xuXG4vKipcbiAqIG1hZ25pdHVkZSBvZiBhbiBhcnJheVxuICogYXJyYXkgaXMgMWQgYXJyYXlcbiAqL1xuTWF0cml4Lm1hZyA9IGZ1bmN0aW9uIChhcnJheSkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZG90UHJvZHVjdChhcnJheSwgYXJyYXkpKTtcbn07XG5cbi8qKlxuICogbm9ybWFsaXphdGlvbiBvZiBhbiBhcnJheVxuICogYXJyYXkgYW5kIHJlc3VsdCBhcmUgMWQgYXJyYXlcbiAqL1xuTWF0cml4Lm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBtYWduaXR1ZGUgPSB0aGlzLm1hZyhhcnJheSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIHJlc3VsdFtpXSA9IGFycmF5W2ldIC8gbWFnbml0dWRlO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogbXVsdGlwbHkgYW4gYXJyYXkgd2l0aCBjZW50ZXJpbmcgbWF0cml4XG4gKiBhcnJheSBhbmQgcmVzdWx0IGFyZSAxZCBhcnJheVxuICovXG5NYXRyaXgubXVsdEdhbW1hID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIHN1bSA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIHN1bSArPSBhcnJheVtpXTtcbiAgfVxuXG4gIHN1bSAqPSAtMSAvIGFycmF5Lmxlbmd0aDtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJyYXkubGVuZ3RoOyBfaSsrKSB7XG4gICAgcmVzdWx0W19pXSA9IHN1bSArIGFycmF5W19pXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBhIHNwZWNpYWwgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gKiByZXN1bHQgPSAwLjUgKiBDICogSU5WICogQ15UICogYXJyYXlcbiAqIGFycmF5IGFuZCByZXN1bHQgYXJlIDFkLCBDIGFuZCBJTlYgYXJlIDJkIGFycmF5c1xuICovXG5NYXRyaXgubXVsdEwgPSBmdW5jdGlvbiAoYXJyYXksIEMsIElOVikge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciB0ZW1wMSA9IFtdO1xuICB2YXIgdGVtcDIgPSBbXTtcblxuICAvLyBtdWx0aXBseSBieSBDXlRcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBDWzBdLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBDLmxlbmd0aDsgaisrKSB7XG4gICAgICBzdW0gKz0gLTAuNSAqIENbal1baV0gKiBhcnJheVtqXTtcbiAgICB9XG4gICAgdGVtcDFbaV0gPSBzdW07XG4gIH1cbiAgLy8gbXVsdGlwbHkgdGhlIHJlc3VsdCBieSBJTlZcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgSU5WLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIgX3N1bSA9IDA7XG4gICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IElOVi5sZW5ndGg7IF9qKyspIHtcbiAgICAgIF9zdW0gKz0gSU5WW19pMl1bX2pdICogdGVtcDFbX2pdO1xuICAgIH1cbiAgICB0ZW1wMltfaTJdID0gX3N1bTtcbiAgfVxuICAvLyBtdWx0aXBseSB0aGUgcmVzdWx0IGJ5IENcbiAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgQy5sZW5ndGg7IF9pMysrKSB7XG4gICAgdmFyIF9zdW0yID0gMDtcbiAgICBmb3IgKHZhciBfajIgPSAwOyBfajIgPCBDWzBdLmxlbmd0aDsgX2oyKyspIHtcbiAgICAgIF9zdW0yICs9IENbX2kzXVtfajJdICogdGVtcDJbX2oyXTtcbiAgICB9XG4gICAgcmVzdWx0W19pM10gPSBfc3VtMjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hdHJpeDtcblxuLyoqKi8gfSksXG4vKiAyNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG4vKipcbiAqIEEgY2xhc3NpYyBRdWlja3NvcnQgYWxnb3JpdGhtIHdpdGggSG9hcmUncyBwYXJ0aXRpb25cbiAqIC0gV29ya3MgYWxzbyBvbiBMaW5rZWRMaXN0IG9iamVjdHNcbiAqXG4gKiBDb3B5cmlnaHQ6IGktVmlzIFJlc2VhcmNoIEdyb3VwLCBCaWxrZW50IFVuaXZlcnNpdHksIDIwMDcgLSBwcmVzZW50XG4gKi9cblxudmFyIExpbmtlZExpc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKTtcblxudmFyIFF1aWNrc29ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBRdWlja3NvcnQoQSwgY29tcGFyZUZ1bmN0aW9uKSB7XG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBRdWlja3NvcnQpO1xuXG4gICAgICAgIGlmIChjb21wYXJlRnVuY3Rpb24gIT09IG51bGwgfHwgY29tcGFyZUZ1bmN0aW9uICE9PSB1bmRlZmluZWQpIHRoaXMuY29tcGFyZUZ1bmN0aW9uID0gdGhpcy5fZGVmYXVsdENvbXBhcmVGdW5jdGlvbjtcblxuICAgICAgICB2YXIgbGVuZ3RoID0gdm9pZCAwO1xuICAgICAgICBpZiAoQSBpbnN0YW5jZW9mIExpbmtlZExpc3QpIGxlbmd0aCA9IEEuc2l6ZSgpO2Vsc2UgbGVuZ3RoID0gQS5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5fcXVpY2tzb3J0KEEsIDAsIGxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhRdWlja3NvcnQsIFt7XG4gICAgICAgIGtleTogJ19xdWlja3NvcnQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3F1aWNrc29ydChBLCBwLCByKSB7XG4gICAgICAgICAgICBpZiAocCA8IHIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcSA9IHRoaXMuX3BhcnRpdGlvbihBLCBwLCByKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9xdWlja3NvcnQoQSwgcCwgcSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcXVpY2tzb3J0KEEsIHEgKyAxLCByKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnX3BhcnRpdGlvbicsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfcGFydGl0aW9uKEEsIHAsIHIpIHtcbiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5fZ2V0KEEsIHApO1xuICAgICAgICAgICAgdmFyIGkgPSBwO1xuICAgICAgICAgICAgdmFyIGogPSByO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5jb21wYXJlRnVuY3Rpb24oeCwgdGhpcy5fZ2V0KEEsIGopKSkge1xuICAgICAgICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICAgICAgfXdoaWxlICh0aGlzLmNvbXBhcmVGdW5jdGlvbih0aGlzLl9nZXQoQSwgaSksIHgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9aWYgKGkgPCBqKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N3YXAoQSwgaSwgaik7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSByZXR1cm4gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnX2dldCcsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0KG9iamVjdCwgaW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBMaW5rZWRMaXN0KSByZXR1cm4gb2JqZWN0LmdldF9vYmplY3RfYXQoaW5kZXgpO2Vsc2UgcmV0dXJuIG9iamVjdFtpbmRleF07XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19zZXQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3NldChvYmplY3QsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpbmtlZExpc3QpIG9iamVjdC5zZXRfb2JqZWN0X2F0KGluZGV4LCB2YWx1ZSk7ZWxzZSBvYmplY3RbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19zd2FwJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9zd2FwKEEsIGksIGopIHtcbiAgICAgICAgICAgIHZhciB0ZW1wID0gdGhpcy5fZ2V0KEEsIGkpO1xuICAgICAgICAgICAgdGhpcy5fc2V0KEEsIGksIHRoaXMuX2dldChBLCBqKSk7XG4gICAgICAgICAgICB0aGlzLl9zZXQoQSwgaiwgdGVtcCk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ19kZWZhdWx0Q29tcGFyZUZ1bmN0aW9uJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWZhdWx0Q29tcGFyZUZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiID4gYTtcbiAgICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBRdWlja3NvcnQ7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gUXVpY2tzb3J0O1xuXG4vKioqLyB9KSxcbi8qIDI2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbi8vIFNpbmd1bGFyIFZhbHVlIERlY29tcG9zaXRpb24gaW1wbGVtZW50YXRpb25cbmZ1bmN0aW9uIFNWRCgpIHt9O1xuXG4vKiBCZWxvdyBzaW5ndWxhciB2YWx1ZSBkZWNvbXBvc2l0aW9uIChzdmQpIGNvZGUgaW5jbHVkaW5nIGh5cG90IGZ1bmN0aW9uIGlzIGFkb3B0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZHJhZ29uZmx5LWFpL0phbWFKU1xuICAgU29tZSBjaGFuZ2VzIGFyZSBhcHBsaWVkIHRvIG1ha2UgdGhlIGNvZGUgY29tcGF0aWJsZSB3aXRoIHRoZSBmY29zZSBjb2RlIGFuZCB0byBtYWtlIGl0IGluZGVwZW5kZW50IGZyb20gSmFtYS5cbiAgIElucHV0IG1hdHJpeCBpcyBjaGFuZ2VkIHRvIGEgMkQgYXJyYXkgaW5zdGVhZCBvZiBKYW1hIG1hdHJpeC4gTWF0cml4IGRpbWVuc2lvbnMgYXJlIHRha2VuIGFjY29yZGluZyB0byAyRCBhcnJheSBpbnN0ZWFkIG9mIHVzaW5nIEphbWEgZnVuY3Rpb25zLlxuICAgQW4gb2JqZWN0IHRoYXQgaW5jbHVkZXMgc2luZ3VsYXIgdmFsdWUgY29tcG9uZW50cyBpcyBjcmVhdGVkIGZvciByZXR1cm4uIFxuICAgVGhlIHR5cGVzIG9mIGlucHV0IHBhcmFtZXRlcnMgb2YgdGhlIGh5cG90IGZ1bmN0aW9uIGFyZSByZW1vdmVkLiBcbiAgIGxldCBpcyB1c2VkIGluc3RlYWQgb2YgdmFyIGZvciB0aGUgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24uXG4qL1xuLypcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNFxuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL1xuXG4gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT05cblxuICAgMS4gRGVmaW5pdGlvbnMuXG5cbiAgICAgIFwiTGljZW5zZVwiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbixcbiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LlxuXG4gICAgICBcIkxpY2Vuc29yXCIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5XG4gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICAgIFwiTGVnYWwgRW50aXR5XCIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbFxuICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vblxuICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbixcbiAgICAgIFwiY29udHJvbFwiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlXG4gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvclxuICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlXG4gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LlxuXG4gICAgICBcIllvdVwiIChvciBcIllvdXJcIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eVxuICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS5cblxuICAgICAgXCJTb3VyY2VcIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyxcbiAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb25cbiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuXG5cbiAgICAgIFwiT2JqZWN0XCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWxcbiAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXRcbiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbixcbiAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy5cblxuICAgICAgXCJXb3JrXCIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvclxuICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYVxuICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrXG4gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLlxuXG4gICAgICBcIkRlcml2YXRpdmUgV29ya3NcIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3RcbiAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGVcbiAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnNcbiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzXG4gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW5cbiAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZixcbiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuXG5cbiAgICAgIFwiQ29udHJpYnV0aW9uXCIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmdcbiAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnNcbiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseVxuICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lclxuICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mXG4gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgXCJzdWJtaXR0ZWRcIlxuICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudFxuICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG9cbiAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsXG4gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZVxuICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0XG4gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZVxuICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgXCJOb3QgYSBDb250cmlidXRpb24uXCJcblxuICAgICAgXCJDb250cmlidXRvclwiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eVxuICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kXG4gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay5cblxuICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG4gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsXG4gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZVxuICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsXG4gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGVcbiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uXG5cbiAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLFxuICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGVcbiAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLFxuICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssXG4gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZVxuICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXJcbiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocylcbiAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91XG4gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYVxuICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29ya1xuICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3RcbiAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXNcbiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZVxuICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLlxuXG4gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZVxuICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0XG4gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdVxuICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbiAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yXG4gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmRcblxuICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlc1xuICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZFxuXG4gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3NcbiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kXG4gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yayxcbiAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mXG4gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZFxuXG4gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSBcIk5PVElDRVwiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0c1xuICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3RcbiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWRcbiAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3RcbiAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmVcbiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZFxuICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3JcbiAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvcixcbiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kXG4gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzXG4gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZFxuICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uXG4gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGVcbiAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWRcbiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWRcbiAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZFxuICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvclxuICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsXG4gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGhcbiAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuXG5cbiAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSxcbiAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29ya1xuICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcbiAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLlxuICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeVxuICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWRcbiAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy5cblxuICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZVxuICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLFxuICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlXG4gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS5cblxuICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yXG4gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoXG4gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yXG4gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9uc1xuICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQVxuICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlXG4gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnlcbiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS5cblxuICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksXG4gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSxcbiAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5XG4gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZVxuICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLFxuICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhXG4gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlXG4gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsXG4gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbFxuICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvclxuICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLlxuXG4gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nXG4gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLFxuICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSxcbiAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzXG4gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seVxuICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGZcbiAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSxcbiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eVxuICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvblxuICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuXG5cbiAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OU1xuXG4gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuXG5cbiAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nXG4gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBcInt9XCJcbiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlXG4gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZVxuICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhXG4gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlXG4gICAgICBzYW1lIFwicHJpbnRlZCBwYWdlXCIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llclxuICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLlxuXG4gICBDb3B5cmlnaHQge3l5eXl9IHtuYW1lIG9mIGNvcHlyaWdodCBvd25lcn1cblxuICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5TVkQuc3ZkID0gZnVuY3Rpb24gKEEpIHtcbiAgdGhpcy5VID0gbnVsbDtcbiAgdGhpcy5WID0gbnVsbDtcbiAgdGhpcy5zID0gbnVsbDtcbiAgdGhpcy5tID0gMDtcbiAgdGhpcy5uID0gMDtcbiAgdGhpcy5tID0gQS5sZW5ndGg7XG4gIHRoaXMubiA9IEFbMF0ubGVuZ3RoO1xuICB2YXIgbnUgPSBNYXRoLm1pbih0aGlzLm0sIHRoaXMubik7XG4gIHRoaXMucyA9IGZ1bmN0aW9uIChzKSB7XG4gICAgdmFyIGEgPSBbXTtcbiAgICB3aGlsZSAocy0tID4gMCkge1xuICAgICAgYS5wdXNoKDApO1xuICAgIH1yZXR1cm4gYTtcbiAgfShNYXRoLm1pbih0aGlzLm0gKyAxLCB0aGlzLm4pKTtcbiAgdGhpcy5VID0gZnVuY3Rpb24gKGRpbXMpIHtcbiAgICB2YXIgYWxsb2NhdGUgPSBmdW5jdGlvbiBhbGxvY2F0ZShkaW1zKSB7XG4gICAgICBpZiAoZGltcy5sZW5ndGggPT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBhcnJheSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbXNbMF07IGkrKykge1xuICAgICAgICAgIGFycmF5LnB1c2goYWxsb2NhdGUoZGltcy5zbGljZSgxKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBhbGxvY2F0ZShkaW1zKTtcbiAgfShbdGhpcy5tLCBudV0pO1xuICB0aGlzLlYgPSBmdW5jdGlvbiAoZGltcykge1xuICAgIHZhciBhbGxvY2F0ZSA9IGZ1bmN0aW9uIGFsbG9jYXRlKGRpbXMpIHtcbiAgICAgIGlmIChkaW1zLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGltc1swXTsgaSsrKSB7XG4gICAgICAgICAgYXJyYXkucHVzaChhbGxvY2F0ZShkaW1zLnNsaWNlKDEpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGFsbG9jYXRlKGRpbXMpO1xuICB9KFt0aGlzLm4sIHRoaXMubl0pO1xuICB2YXIgZSA9IGZ1bmN0aW9uIChzKSB7XG4gICAgdmFyIGEgPSBbXTtcbiAgICB3aGlsZSAocy0tID4gMCkge1xuICAgICAgYS5wdXNoKDApO1xuICAgIH1yZXR1cm4gYTtcbiAgfSh0aGlzLm4pO1xuICB2YXIgd29yayA9IGZ1bmN0aW9uIChzKSB7XG4gICAgdmFyIGEgPSBbXTtcbiAgICB3aGlsZSAocy0tID4gMCkge1xuICAgICAgYS5wdXNoKDApO1xuICAgIH1yZXR1cm4gYTtcbiAgfSh0aGlzLm0pO1xuICB2YXIgd2FudHUgPSB0cnVlO1xuICB2YXIgd2FudHYgPSB0cnVlO1xuICB2YXIgbmN0ID0gTWF0aC5taW4odGhpcy5tIC0gMSwgdGhpcy5uKTtcbiAgdmFyIG5ydCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMubiAtIDIsIHRoaXMubSkpO1xuICBmb3IgKHZhciBrID0gMDsgayA8IE1hdGgubWF4KG5jdCwgbnJ0KTsgaysrKSB7XG4gICAgaWYgKGsgPCBuY3QpIHtcbiAgICAgIHRoaXMuc1trXSA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gazsgaSA8IHRoaXMubTsgaSsrKSB7XG4gICAgICAgIHRoaXMuc1trXSA9IFNWRC5oeXBvdCh0aGlzLnNba10sIEFbaV1ba10pO1xuICAgICAgfVxuICAgICAgO1xuICAgICAgaWYgKHRoaXMuc1trXSAhPT0gMC4wKSB7XG4gICAgICAgIGlmIChBW2tdW2tdIDwgMC4wKSB7XG4gICAgICAgICAgdGhpcy5zW2tdID0gLXRoaXMuc1trXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBfaSA9IGs7IF9pIDwgdGhpcy5tOyBfaSsrKSB7XG4gICAgICAgICAgQVtfaV1ba10gLz0gdGhpcy5zW2tdO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgICAgQVtrXVtrXSArPSAxLjA7XG4gICAgICB9XG4gICAgICB0aGlzLnNba10gPSAtdGhpcy5zW2tdO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gayArIDE7IGogPCB0aGlzLm47IGorKykge1xuICAgICAgaWYgKGZ1bmN0aW9uIChsaHMsIHJocykge1xuICAgICAgICByZXR1cm4gbGhzICYmIHJocztcbiAgICAgIH0oayA8IG5jdCwgdGhpcy5zW2tdICE9PSAwLjApKSB7XG4gICAgICAgIHZhciB0ID0gMDtcbiAgICAgICAgZm9yICh2YXIgX2kyID0gazsgX2kyIDwgdGhpcy5tOyBfaTIrKykge1xuICAgICAgICAgIHQgKz0gQVtfaTJdW2tdICogQVtfaTJdW2pdO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgICAgdCA9IC10IC8gQVtrXVtrXTtcbiAgICAgICAgZm9yICh2YXIgX2kzID0gazsgX2kzIDwgdGhpcy5tOyBfaTMrKykge1xuICAgICAgICAgIEFbX2kzXVtqXSArPSB0ICogQVtfaTNdW2tdO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgIH1cbiAgICAgIGVbal0gPSBBW2tdW2pdO1xuICAgIH1cbiAgICA7XG4gICAgaWYgKGZ1bmN0aW9uIChsaHMsIHJocykge1xuICAgICAgcmV0dXJuIGxocyAmJiByaHM7XG4gICAgfSh3YW50dSwgayA8IG5jdCkpIHtcbiAgICAgIGZvciAodmFyIF9pNCA9IGs7IF9pNCA8IHRoaXMubTsgX2k0KyspIHtcbiAgICAgICAgdGhpcy5VW19pNF1ba10gPSBBW19pNF1ba107XG4gICAgICB9XG4gICAgICA7XG4gICAgfVxuICAgIGlmIChrIDwgbnJ0KSB7XG4gICAgICBlW2tdID0gMDtcbiAgICAgIGZvciAodmFyIF9pNSA9IGsgKyAxOyBfaTUgPCB0aGlzLm47IF9pNSsrKSB7XG4gICAgICAgIGVba10gPSBTVkQuaHlwb3QoZVtrXSwgZVtfaTVdKTtcbiAgICAgIH1cbiAgICAgIDtcbiAgICAgIGlmIChlW2tdICE9PSAwLjApIHtcbiAgICAgICAgaWYgKGVbayArIDFdIDwgMC4wKSB7XG4gICAgICAgICAgZVtrXSA9IC1lW2tdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIF9pNiA9IGsgKyAxOyBfaTYgPCB0aGlzLm47IF9pNisrKSB7XG4gICAgICAgICAgZVtfaTZdIC89IGVba107XG4gICAgICAgIH1cbiAgICAgICAgO1xuICAgICAgICBlW2sgKyAxXSArPSAxLjA7XG4gICAgICB9XG4gICAgICBlW2tdID0gLWVba107XG4gICAgICBpZiAoZnVuY3Rpb24gKGxocywgcmhzKSB7XG4gICAgICAgIHJldHVybiBsaHMgJiYgcmhzO1xuICAgICAgfShrICsgMSA8IHRoaXMubSwgZVtrXSAhPT0gMC4wKSkge1xuICAgICAgICBmb3IgKHZhciBfaTcgPSBrICsgMTsgX2k3IDwgdGhpcy5tOyBfaTcrKykge1xuICAgICAgICAgIHdvcmtbX2k3XSA9IDAuMDtcbiAgICAgICAgfVxuICAgICAgICA7XG4gICAgICAgIGZvciAodmFyIF9qID0gayArIDE7IF9qIDwgdGhpcy5uOyBfaisrKSB7XG4gICAgICAgICAgZm9yICh2YXIgX2k4ID0gayArIDE7IF9pOCA8IHRoaXMubTsgX2k4KyspIHtcbiAgICAgICAgICAgIHdvcmtbX2k4XSArPSBlW19qXSAqIEFbX2k4XVtfal07XG4gICAgICAgICAgfVxuICAgICAgICAgIDtcbiAgICAgICAgfVxuICAgICAgICA7XG4gICAgICAgIGZvciAodmFyIF9qMiA9IGsgKyAxOyBfajIgPCB0aGlzLm47IF9qMisrKSB7XG4gICAgICAgICAgdmFyIF90ID0gLWVbX2oyXSAvIGVbayArIDFdO1xuICAgICAgICAgIGZvciAodmFyIF9pOSA9IGsgKyAxOyBfaTkgPCB0aGlzLm07IF9pOSsrKSB7XG4gICAgICAgICAgICBBW19pOV1bX2oyXSArPSBfdCAqIHdvcmtbX2k5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgIH1cbiAgICAgIGlmICh3YW50dikge1xuICAgICAgICBmb3IgKHZhciBfaTEwID0gayArIDE7IF9pMTAgPCB0aGlzLm47IF9pMTArKykge1xuICAgICAgICAgIHRoaXMuVltfaTEwXVtrXSA9IGVbX2kxMF07XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgcCA9IE1hdGgubWluKHRoaXMubiwgdGhpcy5tICsgMSk7XG4gIGlmIChuY3QgPCB0aGlzLm4pIHtcbiAgICB0aGlzLnNbbmN0XSA9IEFbbmN0XVtuY3RdO1xuICB9XG4gIGlmICh0aGlzLm0gPCBwKSB7XG4gICAgdGhpcy5zW3AgLSAxXSA9IDAuMDtcbiAgfVxuICBpZiAobnJ0ICsgMSA8IHApIHtcbiAgICBlW25ydF0gPSBBW25ydF1bcCAtIDFdO1xuICB9XG4gIGVbcCAtIDFdID0gMC4wO1xuICBpZiAod2FudHUpIHtcbiAgICBmb3IgKHZhciBfajMgPSBuY3Q7IF9qMyA8IG51OyBfajMrKykge1xuICAgICAgZm9yICh2YXIgX2kxMSA9IDA7IF9pMTEgPCB0aGlzLm07IF9pMTErKykge1xuICAgICAgICB0aGlzLlVbX2kxMV1bX2ozXSA9IDAuMDtcbiAgICAgIH1cbiAgICAgIDtcbiAgICAgIHRoaXMuVVtfajNdW19qM10gPSAxLjA7XG4gICAgfTtcbiAgICBmb3IgKHZhciBfayA9IG5jdCAtIDE7IF9rID49IDA7IF9rLS0pIHtcbiAgICAgIGlmICh0aGlzLnNbX2tdICE9PSAwLjApIHtcbiAgICAgICAgZm9yICh2YXIgX2o0ID0gX2sgKyAxOyBfajQgPCBudTsgX2o0KyspIHtcbiAgICAgICAgICB2YXIgX3QyID0gMDtcbiAgICAgICAgICBmb3IgKHZhciBfaTEyID0gX2s7IF9pMTIgPCB0aGlzLm07IF9pMTIrKykge1xuICAgICAgICAgICAgX3QyICs9IHRoaXMuVVtfaTEyXVtfa10gKiB0aGlzLlVbX2kxMl1bX2o0XTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIF90MiA9IC1fdDIgLyB0aGlzLlVbX2tdW19rXTtcbiAgICAgICAgICBmb3IgKHZhciBfaTEzID0gX2s7IF9pMTMgPCB0aGlzLm07IF9pMTMrKykge1xuICAgICAgICAgICAgdGhpcy5VW19pMTNdW19qNF0gKz0gX3QyICogdGhpcy5VW19pMTNdW19rXTtcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKHZhciBfaTE0ID0gX2s7IF9pMTQgPCB0aGlzLm07IF9pMTQrKykge1xuICAgICAgICAgIHRoaXMuVVtfaTE0XVtfa10gPSAtdGhpcy5VW19pMTRdW19rXTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5VW19rXVtfa10gPSAxLjAgKyB0aGlzLlVbX2tdW19rXTtcbiAgICAgICAgZm9yICh2YXIgX2kxNSA9IDA7IF9pMTUgPCBfayAtIDE7IF9pMTUrKykge1xuICAgICAgICAgIHRoaXMuVVtfaTE1XVtfa10gPSAwLjA7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBfaTE2ID0gMDsgX2kxNiA8IHRoaXMubTsgX2kxNisrKSB7XG4gICAgICAgICAgdGhpcy5VW19pMTZdW19rXSA9IDAuMDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5VW19rXVtfa10gPSAxLjA7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBpZiAod2FudHYpIHtcbiAgICBmb3IgKHZhciBfazIgPSB0aGlzLm4gLSAxOyBfazIgPj0gMDsgX2syLS0pIHtcbiAgICAgIGlmIChmdW5jdGlvbiAobGhzLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIGxocyAmJiByaHM7XG4gICAgICB9KF9rMiA8IG5ydCwgZVtfazJdICE9PSAwLjApKSB7XG4gICAgICAgIGZvciAodmFyIF9qNSA9IF9rMiArIDE7IF9qNSA8IG51OyBfajUrKykge1xuICAgICAgICAgIHZhciBfdDMgPSAwO1xuICAgICAgICAgIGZvciAodmFyIF9pMTcgPSBfazIgKyAxOyBfaTE3IDwgdGhpcy5uOyBfaTE3KyspIHtcbiAgICAgICAgICAgIF90MyArPSB0aGlzLlZbX2kxN11bX2syXSAqIHRoaXMuVltfaTE3XVtfajVdO1xuICAgICAgICAgIH07XG4gICAgICAgICAgX3QzID0gLV90MyAvIHRoaXMuVltfazIgKyAxXVtfazJdO1xuICAgICAgICAgIGZvciAodmFyIF9pMTggPSBfazIgKyAxOyBfaTE4IDwgdGhpcy5uOyBfaTE4KyspIHtcbiAgICAgICAgICAgIHRoaXMuVltfaTE4XVtfajVdICs9IF90MyAqIHRoaXMuVltfaTE4XVtfazJdO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBfaTE5ID0gMDsgX2kxOSA8IHRoaXMubjsgX2kxOSsrKSB7XG4gICAgICAgIHRoaXMuVltfaTE5XVtfazJdID0gMC4wO1xuICAgICAgfTtcbiAgICAgIHRoaXMuVltfazJdW19rMl0gPSAxLjA7XG4gICAgfTtcbiAgfVxuICB2YXIgcHAgPSBwIC0gMTtcbiAgdmFyIGl0ZXIgPSAwO1xuICB2YXIgZXBzID0gTWF0aC5wb3coMi4wLCAtNTIuMCk7XG4gIHZhciB0aW55ID0gTWF0aC5wb3coMi4wLCAtOTY2LjApO1xuICB3aGlsZSAocCA+IDApIHtcbiAgICB2YXIgX2szID0gdm9pZCAwO1xuICAgIHZhciBrYXNlID0gdm9pZCAwO1xuICAgIGZvciAoX2szID0gcCAtIDI7IF9rMyA+PSAtMTsgX2szLS0pIHtcbiAgICAgIGlmIChfazMgPT09IC0xKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKE1hdGguYWJzKGVbX2szXSkgPD0gdGlueSArIGVwcyAqIChNYXRoLmFicyh0aGlzLnNbX2szXSkgKyBNYXRoLmFicyh0aGlzLnNbX2szICsgMV0pKSkge1xuICAgICAgICBlW19rM10gPSAwLjA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKF9rMyA9PT0gcCAtIDIpIHtcbiAgICAgIGthc2UgPSA0O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIga3MgPSB2b2lkIDA7XG4gICAgICBmb3IgKGtzID0gcCAtIDE7IGtzID49IF9rMzsga3MtLSkge1xuICAgICAgICBpZiAoa3MgPT09IF9rMykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfdDQgPSAoa3MgIT09IHAgPyBNYXRoLmFicyhlW2tzXSkgOiAwLjApICsgKGtzICE9PSBfazMgKyAxID8gTWF0aC5hYnMoZVtrcyAtIDFdKSA6IDAuMCk7XG4gICAgICAgIGlmIChNYXRoLmFicyh0aGlzLnNba3NdKSA8PSB0aW55ICsgZXBzICogX3Q0KSB7XG4gICAgICAgICAgdGhpcy5zW2tzXSA9IDAuMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChrcyA9PT0gX2szKSB7XG4gICAgICAgIGthc2UgPSAzO1xuICAgICAgfSBlbHNlIGlmIChrcyA9PT0gcCAtIDEpIHtcbiAgICAgICAga2FzZSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrYXNlID0gMjtcbiAgICAgICAgX2szID0ga3M7XG4gICAgICB9XG4gICAgfVxuICAgIF9rMysrO1xuICAgIHN3aXRjaCAoa2FzZSkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGYgPSBlW3AgLSAyXTtcbiAgICAgICAgICBlW3AgLSAyXSA9IDAuMDtcbiAgICAgICAgICBmb3IgKHZhciBfajYgPSBwIC0gMjsgX2o2ID49IF9rMzsgX2o2LS0pIHtcbiAgICAgICAgICAgIHZhciBfdDUgPSBTVkQuaHlwb3QodGhpcy5zW19qNl0sIGYpO1xuICAgICAgICAgICAgdmFyIGNzID0gdGhpcy5zW19qNl0gLyBfdDU7XG4gICAgICAgICAgICB2YXIgc24gPSBmIC8gX3Q1O1xuICAgICAgICAgICAgdGhpcy5zW19qNl0gPSBfdDU7XG4gICAgICAgICAgICBpZiAoX2o2ICE9PSBfazMpIHtcbiAgICAgICAgICAgICAgZiA9IC1zbiAqIGVbX2o2IC0gMV07XG4gICAgICAgICAgICAgIGVbX2o2IC0gMV0gPSBjcyAqIGVbX2o2IC0gMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2FudHYpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgX2kyMCA9IDA7IF9pMjAgPCB0aGlzLm47IF9pMjArKykge1xuICAgICAgICAgICAgICAgIF90NSA9IGNzICogdGhpcy5WW19pMjBdW19qNl0gKyBzbiAqIHRoaXMuVltfaTIwXVtwIC0gMV07XG4gICAgICAgICAgICAgICAgdGhpcy5WW19pMjBdW3AgLSAxXSA9IC1zbiAqIHRoaXMuVltfaTIwXVtfajZdICsgY3MgKiB0aGlzLlZbX2kyMF1bcCAtIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVltfaTIwXVtfajZdID0gX3Q1O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9mID0gZVtfazMgLSAxXTtcbiAgICAgICAgICBlW19rMyAtIDFdID0gMC4wO1xuICAgICAgICAgIGZvciAodmFyIF9qNyA9IF9rMzsgX2o3IDwgcDsgX2o3KyspIHtcbiAgICAgICAgICAgIHZhciBfdDYgPSBTVkQuaHlwb3QodGhpcy5zW19qN10sIF9mKTtcbiAgICAgICAgICAgIHZhciBfY3MgPSB0aGlzLnNbX2o3XSAvIF90NjtcbiAgICAgICAgICAgIHZhciBfc24gPSBfZiAvIF90NjtcbiAgICAgICAgICAgIHRoaXMuc1tfajddID0gX3Q2O1xuICAgICAgICAgICAgX2YgPSAtX3NuICogZVtfajddO1xuICAgICAgICAgICAgZVtfajddID0gX2NzICogZVtfajddO1xuICAgICAgICAgICAgaWYgKHdhbnR1KSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pMjEgPSAwOyBfaTIxIDwgdGhpcy5tOyBfaTIxKyspIHtcbiAgICAgICAgICAgICAgICBfdDYgPSBfY3MgKiB0aGlzLlVbX2kyMV1bX2o3XSArIF9zbiAqIHRoaXMuVVtfaTIxXVtfazMgLSAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlVbX2kyMV1bX2szIC0gMV0gPSAtX3NuICogdGhpcy5VW19pMjFdW19qN10gKyBfY3MgKiB0aGlzLlVbX2kyMV1bX2szIC0gMV07XG4gICAgICAgICAgICAgICAgdGhpcy5VW19pMjFdW19qN10gPSBfdDY7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgc2NhbGUgPSBNYXRoLm1heChNYXRoLm1heChNYXRoLm1heChNYXRoLm1heChNYXRoLmFicyh0aGlzLnNbcCAtIDFdKSwgTWF0aC5hYnModGhpcy5zW3AgLSAyXSkpLCBNYXRoLmFicyhlW3AgLSAyXSkpLCBNYXRoLmFicyh0aGlzLnNbX2szXSkpLCBNYXRoLmFicyhlW19rM10pKTtcbiAgICAgICAgICB2YXIgc3AgPSB0aGlzLnNbcCAtIDFdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIHNwbTEgPSB0aGlzLnNbcCAtIDJdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIGVwbTEgPSBlW3AgLSAyXSAvIHNjYWxlO1xuICAgICAgICAgIHZhciBzayA9IHRoaXMuc1tfazNdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIGVrID0gZVtfazNdIC8gc2NhbGU7XG4gICAgICAgICAgdmFyIGIgPSAoKHNwbTEgKyBzcCkgKiAoc3BtMSAtIHNwKSArIGVwbTEgKiBlcG0xKSAvIDIuMDtcbiAgICAgICAgICB2YXIgYyA9IHNwICogZXBtMSAqIChzcCAqIGVwbTEpO1xuICAgICAgICAgIHZhciBzaGlmdCA9IDAuMDtcbiAgICAgICAgICBpZiAoZnVuY3Rpb24gKGxocywgcmhzKSB7XG4gICAgICAgICAgICByZXR1cm4gbGhzIHx8IHJocztcbiAgICAgICAgICB9KGIgIT09IDAuMCwgYyAhPT0gMC4wKSkge1xuICAgICAgICAgICAgc2hpZnQgPSBNYXRoLnNxcnQoYiAqIGIgKyBjKTtcbiAgICAgICAgICAgIGlmIChiIDwgMC4wKSB7XG4gICAgICAgICAgICAgIHNoaWZ0ID0gLXNoaWZ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2hpZnQgPSBjIC8gKGIgKyBzaGlmdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBfZjIgPSAoc2sgKyBzcCkgKiAoc2sgLSBzcCkgKyBzaGlmdDtcbiAgICAgICAgICB2YXIgZyA9IHNrICogZWs7XG4gICAgICAgICAgZm9yICh2YXIgX2o4ID0gX2szOyBfajggPCBwIC0gMTsgX2o4KyspIHtcbiAgICAgICAgICAgIHZhciBfdDcgPSBTVkQuaHlwb3QoX2YyLCBnKTtcbiAgICAgICAgICAgIHZhciBfY3MyID0gX2YyIC8gX3Q3O1xuICAgICAgICAgICAgdmFyIF9zbjIgPSBnIC8gX3Q3O1xuICAgICAgICAgICAgaWYgKF9qOCAhPT0gX2szKSB7XG4gICAgICAgICAgICAgIGVbX2o4IC0gMV0gPSBfdDc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfZjIgPSBfY3MyICogdGhpcy5zW19qOF0gKyBfc24yICogZVtfajhdO1xuICAgICAgICAgICAgZVtfajhdID0gX2NzMiAqIGVbX2o4XSAtIF9zbjIgKiB0aGlzLnNbX2o4XTtcbiAgICAgICAgICAgIGcgPSBfc24yICogdGhpcy5zW19qOCArIDFdO1xuICAgICAgICAgICAgdGhpcy5zW19qOCArIDFdID0gX2NzMiAqIHRoaXMuc1tfajggKyAxXTtcbiAgICAgICAgICAgIGlmICh3YW50dikge1xuICAgICAgICAgICAgICBmb3IgKHZhciBfaTIyID0gMDsgX2kyMiA8IHRoaXMubjsgX2kyMisrKSB7XG4gICAgICAgICAgICAgICAgX3Q3ID0gX2NzMiAqIHRoaXMuVltfaTIyXVtfajhdICsgX3NuMiAqIHRoaXMuVltfaTIyXVtfajggKyAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlZbX2kyMl1bX2o4ICsgMV0gPSAtX3NuMiAqIHRoaXMuVltfaTIyXVtfajhdICsgX2NzMiAqIHRoaXMuVltfaTIyXVtfajggKyAxXTtcbiAgICAgICAgICAgICAgICB0aGlzLlZbX2kyMl1bX2o4XSA9IF90NztcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF90NyA9IFNWRC5oeXBvdChfZjIsIGcpO1xuICAgICAgICAgICAgX2NzMiA9IF9mMiAvIF90NztcbiAgICAgICAgICAgIF9zbjIgPSBnIC8gX3Q3O1xuICAgICAgICAgICAgdGhpcy5zW19qOF0gPSBfdDc7XG4gICAgICAgICAgICBfZjIgPSBfY3MyICogZVtfajhdICsgX3NuMiAqIHRoaXMuc1tfajggKyAxXTtcbiAgICAgICAgICAgIHRoaXMuc1tfajggKyAxXSA9IC1fc24yICogZVtfajhdICsgX2NzMiAqIHRoaXMuc1tfajggKyAxXTtcbiAgICAgICAgICAgIGcgPSBfc24yICogZVtfajggKyAxXTtcbiAgICAgICAgICAgIGVbX2o4ICsgMV0gPSBfY3MyICogZVtfajggKyAxXTtcbiAgICAgICAgICAgIGlmICh3YW50dSAmJiBfajggPCB0aGlzLm0gLSAxKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pMjMgPSAwOyBfaTIzIDwgdGhpcy5tOyBfaTIzKyspIHtcbiAgICAgICAgICAgICAgICBfdDcgPSBfY3MyICogdGhpcy5VW19pMjNdW19qOF0gKyBfc24yICogdGhpcy5VW19pMjNdW19qOCArIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTIzXVtfajggKyAxXSA9IC1fc24yICogdGhpcy5VW19pMjNdW19qOF0gKyBfY3MyICogdGhpcy5VW19pMjNdW19qOCArIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTIzXVtfajhdID0gX3Q3O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgZVtwIC0gMl0gPSBfZjI7XG4gICAgICAgICAgaXRlciA9IGl0ZXIgKyAxO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0aGlzLnNbX2szXSA8PSAwLjApIHtcbiAgICAgICAgICAgIHRoaXMuc1tfazNdID0gdGhpcy5zW19rM10gPCAwLjAgPyAtdGhpcy5zW19rM10gOiAwLjA7XG4gICAgICAgICAgICBpZiAod2FudHYpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgX2kyNCA9IDA7IF9pMjQgPD0gcHA7IF9pMjQrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuVltfaTI0XVtfazNdID0gLXRoaXMuVltfaTI0XVtfazNdO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAoX2szIDwgcHApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNbX2szXSA+PSB0aGlzLnNbX2szICsgMV0pIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgX3Q4ID0gdGhpcy5zW19rM107XG4gICAgICAgICAgICB0aGlzLnNbX2szXSA9IHRoaXMuc1tfazMgKyAxXTtcbiAgICAgICAgICAgIHRoaXMuc1tfazMgKyAxXSA9IF90ODtcbiAgICAgICAgICAgIGlmICh3YW50diAmJiBfazMgPCB0aGlzLm4gLSAxKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pMjUgPSAwOyBfaTI1IDwgdGhpcy5uOyBfaTI1KyspIHtcbiAgICAgICAgICAgICAgICBfdDggPSB0aGlzLlZbX2kyNV1bX2szICsgMV07XG4gICAgICAgICAgICAgICAgdGhpcy5WW19pMjVdW19rMyArIDFdID0gdGhpcy5WW19pMjVdW19rM107XG4gICAgICAgICAgICAgICAgdGhpcy5WW19pMjVdW19rM10gPSBfdDg7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2FudHUgJiYgX2szIDwgdGhpcy5tIC0gMSkge1xuICAgICAgICAgICAgICBmb3IgKHZhciBfaTI2ID0gMDsgX2kyNiA8IHRoaXMubTsgX2kyNisrKSB7XG4gICAgICAgICAgICAgICAgX3Q4ID0gdGhpcy5VW19pMjZdW19rMyArIDFdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTI2XVtfazMgKyAxXSA9IHRoaXMuVVtfaTI2XVtfazNdO1xuICAgICAgICAgICAgICAgIHRoaXMuVVtfaTI2XVtfazNdID0gX3Q4O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2szKys7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpdGVyID0gMDtcbiAgICAgICAgICBwLS07XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfTtcbiAgdmFyIHJlc3VsdCA9IHsgVTogdGhpcy5VLCBWOiB0aGlzLlYsIFM6IHRoaXMucyB9O1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gc3FydChhXjIgKyBiXjIpIHdpdGhvdXQgdW5kZXIvb3ZlcmZsb3cuXG5TVkQuaHlwb3QgPSBmdW5jdGlvbiAoYSwgYikge1xuICB2YXIgciA9IHZvaWQgMDtcbiAgaWYgKE1hdGguYWJzKGEpID4gTWF0aC5hYnMoYikpIHtcbiAgICByID0gYiAvIGE7XG4gICAgciA9IE1hdGguYWJzKGEpICogTWF0aC5zcXJ0KDEgKyByICogcik7XG4gIH0gZWxzZSBpZiAoYiAhPSAwKSB7XG4gICAgciA9IGEgLyBiO1xuICAgIHIgPSBNYXRoLmFicyhiKSAqIE1hdGguc3FydCgxICsgciAqIHIpO1xuICB9IGVsc2Uge1xuICAgIHIgPSAwLjA7XG4gIH1cbiAgcmV0dXJuIHI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNWRDtcblxuLyoqKi8gfSksXG4vKiAyNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG4vKipcbiAqICAgTmVlZGxlbWFuLVd1bnNjaCBhbGdvcml0aG0gaXMgYW4gcHJvY2VkdXJlIHRvIGNvbXB1dGUgdGhlIG9wdGltYWwgZ2xvYmFsIGFsaWdubWVudCBvZiB0d28gc3RyaW5nXG4gKiAgIHNlcXVlbmNlcyBieSBTLkIuTmVlZGxlbWFuIGFuZCBDLkQuV3Vuc2NoICgxOTcwKS5cbiAqXG4gKiAgIEFzaWRlIGZyb20gdGhlIGlucHV0cywgeW91IGNhbiBhc3NpZ24gdGhlIHNjb3JlcyBmb3IsXG4gKiAgIC0gTWF0Y2g6IFRoZSB0d28gY2hhcmFjdGVycyBhdCB0aGUgY3VycmVudCBpbmRleCBhcmUgc2FtZS5cbiAqICAgLSBNaXNtYXRjaDogVGhlIHR3byBjaGFyYWN0ZXJzIGF0IHRoZSBjdXJyZW50IGluZGV4IGFyZSBkaWZmZXJlbnQuXG4gKiAgIC0gSW5zZXJ0aW9uL0RlbGV0aW9uKGdhcHMpOiBUaGUgYmVzdCBhbGlnbm1lbnQgaW52b2x2ZXMgb25lIGxldHRlciBhbGlnbmluZyB0byBhIGdhcCBpbiB0aGUgb3RoZXIgc3RyaW5nLlxuICovXG5cbnZhciBOZWVkbGVtYW5XdW5zY2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmVlZGxlbWFuV3Vuc2NoKHNlcXVlbmNlMSwgc2VxdWVuY2UyKSB7XG4gICAgICAgIHZhciBtYXRjaF9zY29yZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMTtcbiAgICAgICAgdmFyIG1pc21hdGNoX3BlbmFsdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IC0xO1xuICAgICAgICB2YXIgZ2FwX3BlbmFsdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IC0xO1xuXG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOZWVkbGVtYW5XdW5zY2gpO1xuXG4gICAgICAgIHRoaXMuc2VxdWVuY2UxID0gc2VxdWVuY2UxO1xuICAgICAgICB0aGlzLnNlcXVlbmNlMiA9IHNlcXVlbmNlMjtcbiAgICAgICAgdGhpcy5tYXRjaF9zY29yZSA9IG1hdGNoX3Njb3JlO1xuICAgICAgICB0aGlzLm1pc21hdGNoX3BlbmFsdHkgPSBtaXNtYXRjaF9wZW5hbHR5O1xuICAgICAgICB0aGlzLmdhcF9wZW5hbHR5ID0gZ2FwX3BlbmFsdHk7XG5cbiAgICAgICAgLy8gSnVzdCB0aGUgcmVtb3ZlIHJlZHVuZGFuY3lcbiAgICAgICAgdGhpcy5pTWF4ID0gc2VxdWVuY2UxLmxlbmd0aCArIDE7XG4gICAgICAgIHRoaXMuak1heCA9IHNlcXVlbmNlMi5sZW5ndGggKyAxO1xuXG4gICAgICAgIC8vIEdyaWQgbWF0cml4IG9mIHNjb3Jlc1xuICAgICAgICB0aGlzLmdyaWQgPSBuZXcgQXJyYXkodGhpcy5pTWF4KTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmlNYXg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5ncmlkW2ldID0gbmV3IEFycmF5KHRoaXMuak1heCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5qTWF4OyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRbaV1bal0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhY2ViYWNrIG1hdHJpeCAoMkQgYXJyYXksIGVhY2ggY2VsbCBpcyBhbiBhcnJheSBvZiBib29sZWFuIHZhbHVlcyBmb3IgW2BEaWFnYCwgYFVwYCwgYExlZnRgXSBwb3NpdGlvbnMpXG4gICAgICAgIHRoaXMudHJhY2ViYWNrR3JpZCA9IG5ldyBBcnJheSh0aGlzLmlNYXgpO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdGhpcy5pTWF4OyBfaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbX2ldID0gbmV3IEFycmF5KHRoaXMuak1heCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCB0aGlzLmpNYXg7IF9qKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbX2ldW19qXSA9IFtudWxsLCBudWxsLCBudWxsXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBhbGlnbmVkIHNlcXVlbmNlcyAocmV0dXJuIG11bHRpcGxlIHBvc3NpYmlsaXRpZXMpXG4gICAgICAgIHRoaXMuYWxpZ25tZW50cyA9IFtdO1xuXG4gICAgICAgIC8vIEZpbmFsIGFsaWdubWVudCBzY29yZVxuICAgICAgICB0aGlzLnNjb3JlID0gLTE7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHNjb3JlcyBhbmQgdHJhY2ViYWNrc1xuICAgICAgICB0aGlzLmNvbXB1dGVHcmlkcygpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhOZWVkbGVtYW5XdW5zY2gsIFt7XG4gICAgICAgIGtleTogXCJnZXRTY29yZVwiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2NvcmUoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zY29yZTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiBcImdldEFsaWdubWVudHNcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFsaWdubWVudHMoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hbGlnbm1lbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFpbiBkeW5hbWljIHByb2dyYW1taW5nIHByb2NlZHVyZVxuXG4gICAgfSwge1xuICAgICAgICBrZXk6IFwiY29tcHV0ZUdyaWRzXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wdXRlR3JpZHMoKSB7XG4gICAgICAgICAgICAvLyBGaWxsIGluIHRoZSBmaXJzdCByb3dcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgdGhpcy5qTWF4OyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRbMF1bal0gPSB0aGlzLmdyaWRbMF1baiAtIDFdICsgdGhpcy5nYXBfcGVuYWx0eTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbMF1bal0gPSBbZmFsc2UsIGZhbHNlLCB0cnVlXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlsbCBpbiB0aGUgZmlyc3QgY29sdW1uXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRoaXMuaU1heDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkW2ldWzBdID0gdGhpcy5ncmlkW2kgLSAxXVswXSArIHRoaXMuZ2FwX3BlbmFsdHk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFjZWJhY2tHcmlkW2ldWzBdID0gW2ZhbHNlLCB0cnVlLCBmYWxzZV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbGwgdGhlIHJlc3Qgb2YgdGhlIGdyaWRcbiAgICAgICAgICAgIGZvciAodmFyIF9pMiA9IDE7IF9pMiA8IHRoaXMuaU1heDsgX2kyKyspIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfajIgPSAxOyBfajIgPCB0aGlzLmpNYXg7IF9qMisrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIG1heCBzY29yZShzKSBhbW9uZyBbYERpYWdgLCBgVXBgLCBgTGVmdGBdXG4gICAgICAgICAgICAgICAgICAgIHZhciBkaWFnID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXF1ZW5jZTFbX2kyIC0gMV0gPT09IHRoaXMuc2VxdWVuY2UyW19qMiAtIDFdKSBkaWFnID0gdGhpcy5ncmlkW19pMiAtIDFdW19qMiAtIDFdICsgdGhpcy5tYXRjaF9zY29yZTtlbHNlIGRpYWcgPSB0aGlzLmdyaWRbX2kyIC0gMV1bX2oyIC0gMV0gKyB0aGlzLm1pc21hdGNoX3BlbmFsdHk7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHVwID0gdGhpcy5ncmlkW19pMiAtIDFdW19qMl0gKyB0aGlzLmdhcF9wZW5hbHR5O1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IHRoaXMuZ3JpZFtfaTJdW19qMiAtIDFdICsgdGhpcy5nYXBfcGVuYWx0eTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBleGlzdHMgbXVsdGlwbGUgbWF4IHZhbHVlcywgY2FwdHVyZSB0aGVtIGZvciBtdWx0aXBsZSBwYXRoc1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWF4T2YgPSBbZGlhZywgdXAsIGxlZnRdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuYXJyYXlBbGxNYXhJbmRleGVzKG1heE9mKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgR3JpZHNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkW19pMl1bX2oyXSA9IG1heE9mW2luZGljZXNbMF1dO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYWNlYmFja0dyaWRbX2kyXVtfajJdID0gW2luZGljZXMuaW5jbHVkZXMoMCksIGluZGljZXMuaW5jbHVkZXMoMSksIGluZGljZXMuaW5jbHVkZXMoMildO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIGFsaWdubWVudCBzY29yZVxuICAgICAgICAgICAgdGhpcy5zY29yZSA9IHRoaXMuZ3JpZFt0aGlzLmlNYXggLSAxXVt0aGlzLmpNYXggLSAxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldHMgYWxsIHBvc3NpYmxlIHZhbGlkIHNlcXVlbmNlIGNvbWJpbmF0aW9uc1xuXG4gICAgfSwge1xuICAgICAgICBrZXk6IFwiYWxpZ25tZW50VHJhY2ViYWNrXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBhbGlnbm1lbnRUcmFjZWJhY2soKSB7XG4gICAgICAgICAgICB2YXIgaW5Qcm9jZXNzQWxpZ25tZW50cyA9IFtdO1xuXG4gICAgICAgICAgICBpblByb2Nlc3NBbGlnbm1lbnRzLnB1c2goeyBwb3M6IFt0aGlzLnNlcXVlbmNlMS5sZW5ndGgsIHRoaXMuc2VxdWVuY2UyLmxlbmd0aF0sXG4gICAgICAgICAgICAgICAgc2VxMTogXCJcIixcbiAgICAgICAgICAgICAgICBzZXEyOiBcIlwiXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgd2hpbGUgKGluUHJvY2Vzc0FsaWdubWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudCA9IGluUHJvY2Vzc0FsaWdubWVudHNbMF07XG4gICAgICAgICAgICAgICAgdmFyIGRpcmVjdGlvbnMgPSB0aGlzLnRyYWNlYmFja0dyaWRbY3VycmVudC5wb3NbMF1dW2N1cnJlbnQucG9zWzFdXTtcblxuICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb25zWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGluUHJvY2Vzc0FsaWdubWVudHMucHVzaCh7IHBvczogW2N1cnJlbnQucG9zWzBdIC0gMSwgY3VycmVudC5wb3NbMV0gLSAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcTE6IHRoaXMuc2VxdWVuY2UxW2N1cnJlbnQucG9zWzBdIC0gMV0gKyBjdXJyZW50LnNlcTEsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXEyOiB0aGlzLnNlcXVlbmNlMltjdXJyZW50LnBvc1sxXSAtIDFdICsgY3VycmVudC5zZXEyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICBpblByb2Nlc3NBbGlnbm1lbnRzLnB1c2goeyBwb3M6IFtjdXJyZW50LnBvc1swXSAtIDEsIGN1cnJlbnQucG9zWzFdXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcTE6IHRoaXMuc2VxdWVuY2UxW2N1cnJlbnQucG9zWzBdIC0gMV0gKyBjdXJyZW50LnNlcTEsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXEyOiAnLScgKyBjdXJyZW50LnNlcTJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb25zWzJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGluUHJvY2Vzc0FsaWdubWVudHMucHVzaCh7IHBvczogW2N1cnJlbnQucG9zWzBdLCBjdXJyZW50LnBvc1sxXSAtIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VxMTogJy0nICsgY3VycmVudC5zZXExLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VxMjogdGhpcy5zZXF1ZW5jZTJbY3VycmVudC5wb3NbMV0gLSAxXSArIGN1cnJlbnQuc2VxMlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5wb3NbMF0gPT09IDAgJiYgY3VycmVudC5wb3NbMV0gPT09IDApIHRoaXMuYWxpZ25tZW50cy5wdXNoKHsgc2VxdWVuY2UxOiBjdXJyZW50LnNlcTEsXG4gICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlMjogY3VycmVudC5zZXEyXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpblByb2Nlc3NBbGlnbm1lbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFsaWdubWVudHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIZWxwZXIgRnVuY3Rpb25zXG5cbiAgICB9LCB7XG4gICAgICAgIGtleTogXCJnZXRBbGxJbmRleGVzXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBbGxJbmRleGVzKGFyciwgdmFsKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXhlcyA9IFtdLFxuICAgICAgICAgICAgICAgIGkgPSAtMTtcbiAgICAgICAgICAgIHdoaWxlICgoaSA9IGFyci5pbmRleE9mKHZhbCwgaSArIDEpKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5kZXhlcztcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiBcImFycmF5QWxsTWF4SW5kZXhlc1wiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gYXJyYXlBbGxNYXhJbmRleGVzKGFycmF5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBbGxJbmRleGVzKGFycmF5LCBNYXRoLm1heC5hcHBseShudWxsLCBhcnJheSkpO1xuICAgICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIE5lZWRsZW1hbld1bnNjaDtcbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOZWVkbGVtYW5XdW5zY2g7XG5cbi8qKiovIH0pLFxuLyogMjggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIGxheW91dEJhc2UgPSBmdW5jdGlvbiBsYXlvdXRCYXNlKCkge1xuICByZXR1cm47XG59O1xuXG5sYXlvdXRCYXNlLkZETGF5b3V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7XG5sYXlvdXRCYXNlLkZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbmxheW91dEJhc2UuRkRMYXlvdXRFZGdlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSk7XG5sYXlvdXRCYXNlLkZETGF5b3V0Tm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjApO1xubGF5b3V0QmFzZS5EaW1lbnNpb25EID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMSk7XG5sYXlvdXRCYXNlLkhhc2hNYXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKTtcbmxheW91dEJhc2UuSGFzaFNldCA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpO1xubGF5b3V0QmFzZS5JR2VvbWV0cnkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xubGF5b3V0QmFzZS5JTWF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5sYXlvdXRCYXNlLkludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcbmxheW91dEJhc2UuUG9pbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTtcbmxheW91dEJhc2UuUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcbmxheW91dEJhc2UuUmFuZG9tU2VlZCA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpO1xubGF5b3V0QmFzZS5SZWN0YW5nbGVEID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG5sYXlvdXRCYXNlLlRyYW5zZm9ybSA9IF9fd2VicGFja19yZXF1aXJlX18oMTcpO1xubGF5b3V0QmFzZS5VbmlxdWVJREdlbmVyZXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xubGF5b3V0QmFzZS5RdWlja3NvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTtcbmxheW91dEJhc2UuTGlua2VkTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xubGF5b3V0QmFzZS5MR3JhcGhPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xubGF5b3V0QmFzZS5MR3JhcGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xubGF5b3V0QmFzZS5MRWRnZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5sYXlvdXRCYXNlLkxHcmFwaE1hbmFnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xubGF5b3V0QmFzZS5MTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5sYXlvdXRCYXNlLkxheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xubGF5b3V0QmFzZS5MYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xubGF5b3V0QmFzZS5OZWVkbGVtYW5XdW5zY2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTtcbmxheW91dEJhc2UuTWF0cml4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7XG5sYXlvdXRCYXNlLlNWRCA9IF9fd2VicGFja19yZXF1aXJlX18oMjYpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxheW91dEJhc2U7XG5cbi8qKiovIH0pLFxuLyogMjkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZnVuY3Rpb24gRW1pdHRlcigpIHtcbiAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbn1cblxudmFyIHAgPSBFbWl0dGVyLnByb3RvdHlwZTtcblxucC5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCwgY2FsbGJhY2spIHtcbiAgdGhpcy5saXN0ZW5lcnMucHVzaCh7XG4gICAgZXZlbnQ6IGV2ZW50LFxuICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICB9KTtcbn07XG5cbnAucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGNhbGxiYWNrKSB7XG4gIGZvciAodmFyIGkgPSB0aGlzLmxpc3RlbmVycy5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGwgPSB0aGlzLmxpc3RlbmVyc1tpXTtcblxuICAgIGlmIChsLmV2ZW50ID09PSBldmVudCAmJiBsLmNhbGxiYWNrID09PSBjYWxsYmFjaykge1xuICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxufTtcblxucC5lbWl0ID0gZnVuY3Rpb24gKGV2ZW50LCBkYXRhKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5saXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbCA9IHRoaXMubGlzdGVuZXJzW2ldO1xuXG4gICAgaWYgKGV2ZW50ID09PSBsLmV2ZW50KSB7XG4gICAgICBsLmNhbGxiYWNrKGRhdGEpO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFbWl0dGVyO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG59KTsiLCIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHRoZSBpbnRlcm5hbCBhcmd1bWVudCBwbGFjZWhvbGRlci4gKi9cbnZhciBQTEFDRUhPTERFUiA9ICdfX2xvZGFzaF9wbGFjZWhvbGRlcl9fJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG52YXIgQklORF9GTEFHID0gMSxcbiAgICBCSU5EX0tFWV9GTEFHID0gMixcbiAgICBDVVJSWV9CT1VORF9GTEFHID0gNCxcbiAgICBDVVJSWV9GTEFHID0gOCxcbiAgICBDVVJSWV9SSUdIVF9GTEFHID0gMTYsXG4gICAgUEFSVElBTF9GTEFHID0gMzIsXG4gICAgUEFSVElBTF9SSUdIVF9GTEFHID0gNjQsXG4gICAgQVJZX0ZMQUcgPSAxMjgsXG4gICAgUkVBUkdfRkxBRyA9IDI1NixcbiAgICBGTElQX0ZMQUcgPSA1MTI7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTEsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICBOQU4gPSAwIC8gMDtcblxuLyoqIFVzZWQgdG8gYXNzb2NpYXRlIHdyYXAgbWV0aG9kcyB3aXRoIHRoZWlyIGJpdCBmbGFncy4gKi9cbnZhciB3cmFwRmxhZ3MgPSBbXG4gIFsnYXJ5JywgQVJZX0ZMQUddLFxuICBbJ2JpbmQnLCBCSU5EX0ZMQUddLFxuICBbJ2JpbmRLZXknLCBCSU5EX0tFWV9GTEFHXSxcbiAgWydjdXJyeScsIENVUlJZX0ZMQUddLFxuICBbJ2N1cnJ5UmlnaHQnLCBDVVJSWV9SSUdIVF9GTEFHXSxcbiAgWydmbGlwJywgRkxJUF9GTEFHXSxcbiAgWydwYXJ0aWFsJywgUEFSVElBTF9GTEFHXSxcbiAgWydwYXJ0aWFsUmlnaHQnLCBQQVJUSUFMX1JJR0hUX0ZMQUddLFxuICBbJ3JlYXJnJywgUkVBUkdfRkxBR11cbl07XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKipcbiAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICovXG52YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBtYXRjaCB3cmFwIGRldGFpbCBjb21tZW50cy4gKi9cbnZhciByZVdyYXBDb21tZW50ID0gL1xceyg/OlxcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggLitcXF0gXFwqXFwvKT9cXG4/LyxcbiAgICByZVdyYXBEZXRhaWxzID0gL1xce1xcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggKC4rKVxcXSBcXCovLFxuICAgIHJlU3BsaXREZXRhaWxzID0gLyw/ICYgLztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG52YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xudmFyIHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBhcnJheUVhY2goYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheUluY2x1ZGVzKGFycmF5LCB2YWx1ZSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuICByZXR1cm4gISFsZW5ndGggJiYgYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCAwKSA+IC0xO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgaWYgKHZhbHVlICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG4gIH1cbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBudW1iZXIgb2YgYHBsYWNlaG9sZGVyYCBvY2N1cnJlbmNlcyBpbiBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciBjb3VudC5cbiAqL1xuZnVuY3Rpb24gY291bnRIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gMDtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBpZiAoYXJyYXlbbGVuZ3RoXSA9PT0gcGxhY2Vob2xkZXIpIHtcbiAgICAgIHJlc3VsdCsrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0IGluIElFIDwgOS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSG9zdE9iamVjdCh2YWx1ZSkge1xuICAvLyBNYW55IGhvc3Qgb2JqZWN0cyBhcmUgYE9iamVjdGAgb2JqZWN0cyB0aGF0IGNhbiBjb2VyY2UgdG8gc3RyaW5nc1xuICAvLyBkZXNwaXRlIGhhdmluZyBpbXByb3Blcmx5IGRlZmluZWQgYHRvU3RyaW5nYCBtZXRob2RzLlxuICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9ICEhKHZhbHVlICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyBhbGwgYHBsYWNlaG9sZGVyYCBlbGVtZW50cyBpbiBgYXJyYXlgIHdpdGggYW4gaW50ZXJuYWwgcGxhY2Vob2xkZXJcbiAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZWlyIGluZGV4ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byByZXBsYWNlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKHZhbHVlID09PSBwbGFjZWhvbGRlciB8fCB2YWx1ZSA9PT0gUExBQ0VIT0xERVIpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IFBMQUNFSE9MREVSO1xuICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG52YXIgY29yZUpzRGF0YSA9IHJvb3RbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xudmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbn0oKSk7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qIFVzZWQgdG8gc2V0IGB0b1N0cmluZ2AgbWV0aG9kcy4gKi9cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKSxcbiAgICAgIG5hbWUgPSBnZXROYXRpdmUubmFtZTtcblxuICByZXR1cm4gKG5hbWUgJiYgbmFtZS5sZW5ndGggPiAyKSA/IGZ1bmMgOiB1bmRlZmluZWQ7XG59KCkpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNyZWF0ZWAgd2l0aG91dCBzdXBwb3J0IGZvciBhc3NpZ25pbmdcbiAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZUNyZWF0ZShwcm90bykge1xuICByZXR1cm4gaXNPYmplY3QocHJvdG8pID8gb2JqZWN0Q3JlYXRlKHByb3RvKSA6IHt9O1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSAoaXNGdW5jdGlvbih2YWx1ZSkgfHwgaXNIb3N0T2JqZWN0KHZhbHVlKSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yO1xuICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMsXG4gKiBwbGFjZWhvbGRlcnMsIGFuZCBwcm92aWRlZCBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBhcnJheSBvZiBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbXMge2Jvb2xlYW59IFtpc0N1cnJpZWRdIFNwZWNpZnkgY29tcG9zaW5nIGZvciBhIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VBcmdzKGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgYXJnc0xlbmd0aCA9IGFyZ3MubGVuZ3RoLFxuICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgcmFuZ2VMZW5ndGggPSBuYXRpdmVNYXgoYXJnc0xlbmd0aCAtIGhvbGRlcnNMZW5ndGgsIDApLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSxcbiAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICB3aGlsZSAoKytsZWZ0SW5kZXggPCBsZWZ0TGVuZ3RoKSB7XG4gICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2FyZ3NJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgcmVzdWx0W2hvbGRlcnNbYXJnc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleF07XG4gICAgfVxuICB9XG4gIHdoaWxlIChyYW5nZUxlbmd0aC0tKSB7XG4gICAgcmVzdWx0W2xlZnRJbmRleCsrXSA9IGFyZ3NbYXJnc0luZGV4KytdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBjb21wb3NlQXJnc2AgZXhjZXB0IHRoYXQgdGhlIGFyZ3VtZW50cyBjb21wb3NpdGlvblxuICogaXMgdGFpbG9yZWQgZm9yIGBfLnBhcnRpYWxSaWdodGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICogQHBhcmFtIHtBcnJheX0gaG9sZGVycyBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKSB7XG4gIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgIGhvbGRlcnNJbmRleCA9IC0xLFxuICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgcmlnaHRJbmRleCA9IC0xLFxuICAgICAgcmlnaHRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICByZXN1bHQgPSBBcnJheShyYW5nZUxlbmd0aCArIHJpZ2h0TGVuZ3RoKSxcbiAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICB3aGlsZSAoKythcmdzSW5kZXggPCByYW5nZUxlbmd0aCkge1xuICAgIHJlc3VsdFthcmdzSW5kZXhdID0gYXJnc1thcmdzSW5kZXhdO1xuICB9XG4gIHZhciBvZmZzZXQgPSBhcmdzSW5kZXg7XG4gIHdoaWxlICgrK3JpZ2h0SW5kZXggPCByaWdodExlbmd0aCkge1xuICAgIHJlc3VsdFtvZmZzZXQgKyByaWdodEluZGV4XSA9IHBhcnRpYWxzW3JpZ2h0SW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2hvbGRlcnNJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgcmVzdWx0W29mZnNldCArIGhvbGRlcnNbaG9sZGVyc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBvcHRpb25hbCBgdGhpc2BcbiAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCaW5kKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcpIHtcbiAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBCSU5EX0ZMQUcsXG4gICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgcmV0dXJuIGZuLmFwcGx5KGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmd1bWVudHMpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGluc3RhbmNlIG9mIGBDdG9yYCByZWdhcmRsZXNzIG9mXG4gKiB3aGV0aGVyIGl0IHdhcyBpbnZva2VkIGFzIHBhcnQgb2YgYSBgbmV3YCBleHByZXNzaW9uIG9yIGJ5IGBjYWxsYCBvciBgYXBwbHlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBDdG9yIFRoZSBjb25zdHJ1Y3RvciB0byB3cmFwLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ3RvcihDdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAvLyBVc2UgYSBgc3dpdGNoYCBzdGF0ZW1lbnQgdG8gd29yayB3aXRoIGNsYXNzIGNvbnN0cnVjdG9ycy4gU2VlXG4gICAgLy8gaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1mdW5jdGlvbi1vYmplY3RzLWNhbGwtdGhpc2FyZ3VtZW50LWFyZ3VtZW50c2xpc3RcbiAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBDdG9yO1xuICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSk7XG4gICAgICBjYXNlIDI6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICBjYXNlIDU6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdKTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pO1xuICAgICAgY2FzZSA3OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSwgYXJnc1s2XSk7XG4gICAgfVxuICAgIHZhciB0aGlzQmluZGluZyA9IGJhc2VDcmVhdGUoQ3Rvci5wcm90b3R5cGUpLFxuICAgICAgICByZXN1bHQgPSBDdG9yLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcblxuICAgIC8vIE1pbWljIHRoZSBjb25zdHJ1Y3RvcidzIGByZXR1cm5gIGJlaGF2aW9yLlxuICAgIC8vIFNlZSBodHRwczovL2VzNS5naXRodWIuaW8vI3gxMy4yLjIgZm9yIG1vcmUgZGV0YWlscy5cbiAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBlbmFibGUgY3VycnlpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtudW1iZXJ9IGFyaXR5IFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSkge1xuICB2YXIgQ3RvciA9IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKTtcblxuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgfVxuICAgIHZhciBob2xkZXJzID0gKGxlbmd0aCA8IDMgJiYgYXJnc1swXSAhPT0gcGxhY2Vob2xkZXIgJiYgYXJnc1tsZW5ndGggLSAxXSAhPT0gcGxhY2Vob2xkZXIpXG4gICAgICA/IFtdXG4gICAgICA6IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcblxuICAgIGxlbmd0aCAtPSBob2xkZXJzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoIDwgYXJpdHkpIHtcbiAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICBmdW5jLCBiaXRtYXNrLCBjcmVhdGVIeWJyaWQsIHdyYXBwZXIucGxhY2Vob2xkZXIsIHVuZGVmaW5lZCxcbiAgICAgICAgYXJncywgaG9sZGVycywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFyaXR5IC0gbGVuZ3RoKTtcbiAgICB9XG4gICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICByZXR1cm4gYXBwbHkoZm4sIHRoaXMsIGFyZ3MpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCBvcHRpb25hbCBgdGhpc2BcbiAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLCBwYXJ0aWFsIGFwcGxpY2F0aW9uLCBhbmQgY3VycnlpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc1JpZ2h0XSBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZFxuICogIHRvIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc1JpZ2h0XSBUaGUgYHBhcnRpYWxzUmlnaHRgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSHlicmlkKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICB2YXIgaXNBcnkgPSBiaXRtYXNrICYgQVJZX0ZMQUcsXG4gICAgICBpc0JpbmQgPSBiaXRtYXNrICYgQklORF9GTEFHLFxuICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIEJJTkRfS0VZX0ZMQUcsXG4gICAgICBpc0N1cnJpZWQgPSBiaXRtYXNrICYgKENVUlJZX0ZMQUcgfCBDVVJSWV9SSUdIVF9GTEFHKSxcbiAgICAgIGlzRmxpcCA9IGJpdG1hc2sgJiBGTElQX0ZMQUcsXG4gICAgICBDdG9yID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogY3JlYXRlQ3RvcihmdW5jKTtcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICBhcmdzID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgYXJnc1tpbmRleF0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgIH1cbiAgICBpZiAoaXNDdXJyaWVkKSB7XG4gICAgICB2YXIgcGxhY2Vob2xkZXIgPSBnZXRIb2xkZXIod3JhcHBlciksXG4gICAgICAgICAgaG9sZGVyc0NvdW50ID0gY291bnRIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcbiAgICB9XG4gICAgaWYgKHBhcnRpYWxzKSB7XG4gICAgICBhcmdzID0gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCk7XG4gICAgfVxuICAgIGlmIChwYXJ0aWFsc1JpZ2h0KSB7XG4gICAgICBhcmdzID0gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGlzQ3VycmllZCk7XG4gICAgfVxuICAgIGxlbmd0aCAtPSBob2xkZXJzQ291bnQ7XG4gICAgaWYgKGlzQ3VycmllZCAmJiBsZW5ndGggPCBhcml0eSkge1xuICAgICAgdmFyIG5ld0hvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG4gICAgICByZXR1cm4gY3JlYXRlUmVjdXJyeShcbiAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB0aGlzQXJnLFxuICAgICAgICBhcmdzLCBuZXdIb2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkgLSBsZW5ndGhcbiAgICAgICk7XG4gICAgfVxuICAgIHZhciB0aGlzQmluZGluZyA9IGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLFxuICAgICAgICBmbiA9IGlzQmluZEtleSA/IHRoaXNCaW5kaW5nW2Z1bmNdIDogZnVuYztcblxuICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICAgIGlmIChhcmdQb3MpIHtcbiAgICAgIGFyZ3MgPSByZW9yZGVyKGFyZ3MsIGFyZ1Bvcyk7XG4gICAgfSBlbHNlIGlmIChpc0ZsaXAgJiYgbGVuZ3RoID4gMSkge1xuICAgICAgYXJncy5yZXZlcnNlKCk7XG4gICAgfVxuICAgIGlmIChpc0FyeSAmJiBhcnkgPCBsZW5ndGgpIHtcbiAgICAgIGFyZ3MubGVuZ3RoID0gYXJ5O1xuICAgIH1cbiAgICBpZiAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSB7XG4gICAgICBmbiA9IEN0b3IgfHwgY3JlYXRlQ3Rvcihmbik7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG4gIH1cbiAgcmV0dXJuIHdyYXBwZXI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZ1xuICogb2YgYHRoaXNBcmdgIGFuZCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpIHtcbiAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBCSU5EX0ZMQUcsXG4gICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgIGxlZnRJbmRleCA9IC0xLFxuICAgICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICBhcmdzID0gQXJyYXkobGVmdExlbmd0aCArIGFyZ3NMZW5ndGgpLFxuICAgICAgICBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG5cbiAgICB3aGlsZSAoKytsZWZ0SW5kZXggPCBsZWZ0TGVuZ3RoKSB7XG4gICAgICBhcmdzW2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgIH1cbiAgICB3aGlsZSAoYXJnc0xlbmd0aC0tKSB7XG4gICAgICBhcmdzW2xlZnRJbmRleCsrXSA9IGFyZ3VtZW50c1srK2FyZ3NJbmRleF07XG4gICAgfVxuICAgIHJldHVybiBhcHBseShmbiwgaXNCaW5kID8gdGhpc0FyZyA6IHRoaXMsIGFyZ3MpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBjb250aW51ZSBjdXJyeWluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwRnVuYyBUaGUgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBgZnVuY2Agd3JhcHBlci5cbiAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYywgYml0bWFzaywgd3JhcEZ1bmMsIHBsYWNlaG9sZGVyLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gIHZhciBpc0N1cnJ5ID0gYml0bWFzayAmIENVUlJZX0ZMQUcsXG4gICAgICBuZXdIb2xkZXJzID0gaXNDdXJyeSA/IGhvbGRlcnMgOiB1bmRlZmluZWQsXG4gICAgICBuZXdIb2xkZXJzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogaG9sZGVycyxcbiAgICAgIG5ld1BhcnRpYWxzID0gaXNDdXJyeSA/IHBhcnRpYWxzIDogdW5kZWZpbmVkLFxuICAgICAgbmV3UGFydGlhbHNSaWdodCA9IGlzQ3VycnkgPyB1bmRlZmluZWQgOiBwYXJ0aWFscztcblxuICBiaXRtYXNrIHw9IChpc0N1cnJ5ID8gUEFSVElBTF9GTEFHIDogUEFSVElBTF9SSUdIVF9GTEFHKTtcbiAgYml0bWFzayAmPSB+KGlzQ3VycnkgPyBQQVJUSUFMX1JJR0hUX0ZMQUcgOiBQQVJUSUFMX0ZMQUcpO1xuXG4gIGlmICghKGJpdG1hc2sgJiBDVVJSWV9CT1VORF9GTEFHKSkge1xuICAgIGJpdG1hc2sgJj0gfihCSU5EX0ZMQUcgfCBCSU5EX0tFWV9GTEFHKTtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSB3cmFwRnVuYyhmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBuZXdQYXJ0aWFscywgbmV3SG9sZGVycywgbmV3UGFydGlhbHNSaWdodCwgbmV3SG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHkpO1xuICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsIGZ1bmMsIGJpdG1hc2spO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGVpdGhlciBjdXJyaWVzIG9yIGludm9rZXMgYGZ1bmNgIHdpdGggb3B0aW9uYWxcbiAqIGB0aGlzYCBiaW5kaW5nIGFuZCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gKiAgVGhlIGJpdG1hc2sgbWF5IGJlIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6XG4gKiAgICAgMSAtIGBfLmJpbmRgXG4gKiAgICAgMiAtIGBfLmJpbmRLZXlgXG4gKiAgICAgNCAtIGBfLmN1cnJ5YCBvciBgXy5jdXJyeVJpZ2h0YCBvZiBhIGJvdW5kIGZ1bmN0aW9uXG4gKiAgICAgOCAtIGBfLmN1cnJ5YFxuICogICAgMTYgLSBgXy5jdXJyeVJpZ2h0YFxuICogICAgMzIgLSBgXy5wYXJ0aWFsYFxuICogICAgNjQgLSBgXy5wYXJ0aWFsUmlnaHRgXG4gKiAgIDEyOCAtIGBfLnJlYXJnYFxuICogICAyNTYgLSBgXy5hcnlgXG4gKiAgIDUxMiAtIGBfLmZsaXBgXG4gKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gIHZhciBpc0JpbmRLZXkgPSBiaXRtYXNrICYgQklORF9LRVlfRkxBRztcbiAgaWYgKCFpc0JpbmRLZXkgJiYgdHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB2YXIgbGVuZ3RoID0gcGFydGlhbHMgPyBwYXJ0aWFscy5sZW5ndGggOiAwO1xuICBpZiAoIWxlbmd0aCkge1xuICAgIGJpdG1hc2sgJj0gfihQQVJUSUFMX0ZMQUcgfCBQQVJUSUFMX1JJR0hUX0ZMQUcpO1xuICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgfVxuICBhcnkgPSBhcnkgPT09IHVuZGVmaW5lZCA/IGFyeSA6IG5hdGl2ZU1heCh0b0ludGVnZXIoYXJ5KSwgMCk7XG4gIGFyaXR5ID0gYXJpdHkgPT09IHVuZGVmaW5lZCA/IGFyaXR5IDogdG9JbnRlZ2VyKGFyaXR5KTtcbiAgbGVuZ3RoIC09IGhvbGRlcnMgPyBob2xkZXJzLmxlbmd0aCA6IDA7XG5cbiAgaWYgKGJpdG1hc2sgJiBQQVJUSUFMX1JJR0hUX0ZMQUcpIHtcbiAgICB2YXIgcGFydGlhbHNSaWdodCA9IHBhcnRpYWxzLFxuICAgICAgICBob2xkZXJzUmlnaHQgPSBob2xkZXJzO1xuXG4gICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIG5ld0RhdGEgPSBbXG4gICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCxcbiAgICBhcmdQb3MsIGFyeSwgYXJpdHlcbiAgXTtcblxuICBmdW5jID0gbmV3RGF0YVswXTtcbiAgYml0bWFzayA9IG5ld0RhdGFbMV07XG4gIHRoaXNBcmcgPSBuZXdEYXRhWzJdO1xuICBwYXJ0aWFscyA9IG5ld0RhdGFbM107XG4gIGhvbGRlcnMgPSBuZXdEYXRhWzRdO1xuICBhcml0eSA9IG5ld0RhdGFbOV0gPSBuZXdEYXRhWzldID09IG51bGxcbiAgICA/IChpc0JpbmRLZXkgPyAwIDogZnVuYy5sZW5ndGgpXG4gICAgOiBuYXRpdmVNYXgobmV3RGF0YVs5XSAtIGxlbmd0aCwgMCk7XG5cbiAgaWYgKCFhcml0eSAmJiBiaXRtYXNrICYgKENVUlJZX0ZMQUcgfCBDVVJSWV9SSUdIVF9GTEFHKSkge1xuICAgIGJpdG1hc2sgJj0gfihDVVJSWV9GTEFHIHwgQ1VSUllfUklHSFRfRkxBRyk7XG4gIH1cbiAgaWYgKCFiaXRtYXNrIHx8IGJpdG1hc2sgPT0gQklORF9GTEFHKSB7XG4gICAgdmFyIHJlc3VsdCA9IGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZyk7XG4gIH0gZWxzZSBpZiAoYml0bWFzayA9PSBDVVJSWV9GTEFHIHx8IGJpdG1hc2sgPT0gQ1VSUllfUklHSFRfRkxBRykge1xuICAgIHJlc3VsdCA9IGNyZWF0ZUN1cnJ5KGZ1bmMsIGJpdG1hc2ssIGFyaXR5KTtcbiAgfSBlbHNlIGlmICgoYml0bWFzayA9PSBQQVJUSUFMX0ZMQUcgfHwgYml0bWFzayA9PSAoQklORF9GTEFHIHwgUEFSVElBTF9GTEFHKSkgJiYgIWhvbGRlcnMubGVuZ3RoKSB7XG4gICAgcmVzdWx0ID0gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscyk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gY3JlYXRlSHlicmlkLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gIH1cbiAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsIGZ1bmMsIGJpdG1hc2spO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGFyZ3VtZW50IHBsYWNlaG9sZGVyIHZhbHVlIGZvciBgZnVuY2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldEhvbGRlcihmdW5jKSB7XG4gIHZhciBvYmplY3QgPSBmdW5jO1xuICByZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHdyYXBwZXIgZGV0YWlscyBmcm9tIHRoZSBgc291cmNlYCBib2R5IGNvbW1lbnQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3cmFwcGVyIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIGdldFdyYXBEZXRhaWxzKHNvdXJjZSkge1xuICB2YXIgbWF0Y2ggPSBzb3VyY2UubWF0Y2gocmVXcmFwRGV0YWlscyk7XG4gIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdLnNwbGl0KHJlU3BsaXREZXRhaWxzKSA6IFtdO1xufVxuXG4vKipcbiAqIEluc2VydHMgd3JhcHBlciBgZGV0YWlsc2AgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGBzb3VyY2VgIGJvZHkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBtb2RpZnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gaW5zZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbW9kaWZpZWQgc291cmNlLlxuICovXG5mdW5jdGlvbiBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIGRldGFpbHMpIHtcbiAgdmFyIGxlbmd0aCA9IGRldGFpbHMubGVuZ3RoLFxuICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICBkZXRhaWxzW2xhc3RJbmRleF0gPSAobGVuZ3RoID4gMSA/ICcmICcgOiAnJykgKyBkZXRhaWxzW2xhc3RJbmRleF07XG4gIGRldGFpbHMgPSBkZXRhaWxzLmpvaW4obGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICByZXR1cm4gc291cmNlLnJlcGxhY2UocmVXcmFwQ29tbWVudCwgJ3tcXG4vKiBbd3JhcHBlZCB3aXRoICcgKyBkZXRhaWxzICsgJ10gKi9cXG4nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAodHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IHJlSXNVaW50LnRlc3QodmFsdWUpKSAmJlxuICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7XG59XG5cbi8qKlxuICogUmVvcmRlciBgYXJyYXlgIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGluZGV4ZXMgd2hlcmUgdGhlIGVsZW1lbnQgYXRcbiAqIHRoZSBmaXJzdCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlIGVsZW1lbnQgYXRcbiAqIHRoZSBzZWNvbmQgaW5kZXggaXMgYXNzaWduZWQgYXMgdGhlIHNlY29uZCBlbGVtZW50LCBhbmQgc28gb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byByZW9yZGVyLlxuICogQHBhcmFtIHtBcnJheX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJyYXkgaW5kZXhlcy5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiByZW9yZGVyKGFycmF5LCBpbmRleGVzKSB7XG4gIHZhciBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICBsZW5ndGggPSBuYXRpdmVNaW4oaW5kZXhlcy5sZW5ndGgsIGFyckxlbmd0aCksXG4gICAgICBvbGRBcnJheSA9IGNvcHlBcnJheShhcnJheSk7XG5cbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdO1xuICAgIGFycmF5W2xlbmd0aF0gPSBpc0luZGV4KGluZGV4LCBhcnJMZW5ndGgpID8gb2xkQXJyYXlbaW5kZXhdIDogdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgd3JhcHBlcmAgdG8gbWltaWMgdGhlIHNvdXJjZSBvZiBgcmVmZXJlbmNlYFxuICogd2l0aCB3cmFwcGVyIGRldGFpbHMgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIHNvdXJjZSBib2R5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWZlcmVuY2UgVGhlIHJlZmVyZW5jZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYHdyYXBwZXJgLlxuICovXG52YXIgc2V0V3JhcFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbih3cmFwcGVyLCByZWZlcmVuY2UsIGJpdG1hc2spIHtcbiAgdmFyIHNvdXJjZSA9IChyZWZlcmVuY2UgKyAnJyk7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eSh3cmFwcGVyLCAndG9TdHJpbmcnLCB7XG4gICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAndmFsdWUnOiBjb25zdGFudChpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIHVwZGF0ZVdyYXBEZXRhaWxzKGdldFdyYXBEZXRhaWxzKHNvdXJjZSksIGJpdG1hc2spKSlcbiAgfSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogVXBkYXRlcyB3cmFwcGVyIGBkZXRhaWxzYCBiYXNlZCBvbiBgYml0bWFza2AgZmxhZ3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtBcnJheX0gZGV0YWlscyBUaGUgZGV0YWlscyB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkZXRhaWxzYC5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlV3JhcERldGFpbHMoZGV0YWlscywgYml0bWFzaykge1xuICBhcnJheUVhY2god3JhcEZsYWdzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgdmFyIHZhbHVlID0gJ18uJyArIHBhaXJbMF07XG4gICAgaWYgKChiaXRtYXNrICYgcGFpclsxXSkgJiYgIWFycmF5SW5jbHVkZXMoZGV0YWlscywgdmFsdWUpKSB7XG4gICAgICBkZXRhaWxzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkZXRhaWxzLnNvcnQoKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyZ3VtZW50cyBvZiBgZnVuY2AgYW5kIGVpdGhlciBpbnZva2VzXG4gKiBgZnVuY2AgcmV0dXJuaW5nIGl0cyByZXN1bHQsIGlmIGF0IGxlYXN0IGBhcml0eWAgbnVtYmVyIG9mIGFyZ3VtZW50cyBoYXZlXG4gKiBiZWVuIHByb3ZpZGVkLCBvciByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHRoZSByZW1haW5pbmcgYGZ1bmNgXG4gKiBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGBmdW5jYCBtYXkgYmUgc3BlY2lmaWVkIGlmIGBmdW5jLmxlbmd0aGBcbiAqIGlzIG5vdCBzdWZmaWNpZW50LlxuICpcbiAqIFRoZSBgXy5jdXJyeS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgY3VycmllZCBmdW5jdGlvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAqIH07XG4gKlxuICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5KGFiYyk7XG4gKlxuICogY3VycmllZCgxKSgyKSgzKTtcbiAqIC8vID0+IFsxLCAyLCAzXVxuICpcbiAqIGN1cnJpZWQoMSwgMikoMyk7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqXG4gKiBjdXJyaWVkKDEsIDIsIDMpO1xuICogLy8gPT4gWzEsIDIsIDNdXG4gKlxuICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAqIGN1cnJpZWQoMSkoXywgMykoMik7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqL1xuZnVuY3Rpb24gY3VycnkoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gIGFyaXR5ID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBhcml0eTtcbiAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgQ1VSUllfRkxBRywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFyaXR5KTtcbiAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnkucGxhY2Vob2xkZXI7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOC05IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5IGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBpc09iamVjdCh2YWx1ZSkgPyBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9JbnRlZ2VyKDMuMik7XG4gKiAvLyA9PiAzXG4gKlxuICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiAwXG4gKlxuICogXy50b0ludGVnZXIoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvSW50ZWdlcignMy4yJyk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICByZXR1cm4gcmVzdWx0ID09PSByZXN1bHQgPyAocmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0KSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKlxuICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIEFzc2lnbiBkZWZhdWx0IHBsYWNlaG9sZGVycy5cbmN1cnJ5LnBsYWNlaG9sZGVyID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gY3Vycnk7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIERhdGFWaWV3ID0gZ2V0TmF0aXZlKHJvb3QsICdEYXRhVmlldycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFWaWV3O1xuIiwidmFyIGhhc2hDbGVhciA9IHJlcXVpcmUoJy4vX2hhc2hDbGVhcicpLFxuICAgIGhhc2hEZWxldGUgPSByZXF1aXJlKCcuL19oYXNoRGVsZXRlJyksXG4gICAgaGFzaEdldCA9IHJlcXVpcmUoJy4vX2hhc2hHZXQnKSxcbiAgICBoYXNoSGFzID0gcmVxdWlyZSgnLi9faGFzaEhhcycpLFxuICAgIGhhc2hTZXQgPSByZXF1aXJlKCcuL19oYXNoU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG5IYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbkhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG5IYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2g7XG4iLCJ2YXIgbGlzdENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVDbGVhcicpLFxuICAgIGxpc3RDYWNoZURlbGV0ZSA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZURlbGV0ZScpLFxuICAgIGxpc3RDYWNoZUdldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUdldCcpLFxuICAgIGxpc3RDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUhhcycpLFxuICAgIGxpc3RDYWNoZVNldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xuTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbkxpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzO1xuTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTGlzdENhY2hlO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcDtcbiIsInZhciBtYXBDYWNoZUNsZWFyID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVDbGVhcicpLFxuICAgIG1hcENhY2hlRGVsZXRlID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVEZWxldGUnKSxcbiAgICBtYXBDYWNoZUdldCA9IHJlcXVpcmUoJy4vX21hcENhY2hlR2V0JyksXG4gICAgbWFwQ2FjaGVIYXMgPSByZXF1aXJlKCcuL19tYXBDYWNoZUhhcycpLFxuICAgIG1hcENhY2hlU2V0ID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC5cbk1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG5NYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XG5NYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7XG5NYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG5NYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFwQ2FjaGU7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFByb21pc2UgPSBnZXROYXRpdmUocm9vdCwgJ1Byb21pc2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBTZXQgPSBnZXROYXRpdmUocm9vdCwgJ1NldCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldDtcbiIsInZhciBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyksXG4gICAgc2V0Q2FjaGVBZGQgPSByZXF1aXJlKCcuL19zZXRDYWNoZUFkZCcpLFxuICAgIHNldENhY2hlSGFzID0gcmVxdWlyZSgnLi9fc2V0Q2FjaGVIYXMnKTtcblxuLyoqXG4gKlxuICogQ3JlYXRlcyBhbiBhcnJheSBjYWNoZSBvYmplY3QgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoO1xuXG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGU7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdGhpcy5hZGQodmFsdWVzW2luZGV4XSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFNldENhY2hlYC5cblNldENhY2hlLnByb3RvdHlwZS5hZGQgPSBTZXRDYWNoZS5wcm90b3R5cGUucHVzaCA9IHNldENhY2hlQWRkO1xuU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldENhY2hlO1xuIiwidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIHN0YWNrQ2xlYXIgPSByZXF1aXJlKCcuL19zdGFja0NsZWFyJyksXG4gICAgc3RhY2tEZWxldGUgPSByZXF1aXJlKCcuL19zdGFja0RlbGV0ZScpLFxuICAgIHN0YWNrR2V0ID0gcmVxdWlyZSgnLi9fc3RhY2tHZXQnKSxcbiAgICBzdGFja0hhcyA9IHJlcXVpcmUoJy4vX3N0YWNrSGFzJyksXG4gICAgc3RhY2tTZXQgPSByZXF1aXJlKCcuL19zdGFja1NldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzdGFjayBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFN0YWNrYC5cblN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG5TdGFjay5wcm90b3R5cGVbJ2RlbGV0ZSddID0gc3RhY2tEZWxldGU7XG5TdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7XG5TdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG5TdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gU3RhY2s7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFVpbnQ4QXJyYXkgPSByb290LlVpbnQ4QXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gVWludDhBcnJheTtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgV2Vha01hcCA9IGdldE5hdGl2ZShyb290LCAnV2Vha01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdlYWtNYXA7XG4iLCIvKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXBwbHk7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlFYWNoO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZmlsdGVyYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5RmlsdGVyO1xuIiwidmFyIGJhc2VJbmRleE9mID0gcmVxdWlyZSgnLi9fYmFzZUluZGV4T2YnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5jbHVkZXNgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUluY2x1ZGVzO1xuIiwiLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFycmF5SW5jbHVkZXNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlJbmNsdWRlc1dpdGgoYXJyYXksIHZhbHVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoY29tcGFyYXRvcih2YWx1ZSwgYXJyYXlbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiIsInZhciBiYXNlVGltZXMgPSByZXF1aXJlKCcuL19iYXNlVGltZXMnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksXG4gICAgICBpc0FyZyA9ICFpc0FyciAmJiBpc0FyZ3VtZW50cyh2YWx1ZSksXG4gICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgc2tpcEluZGV4ZXMgPSBpc0FyciB8fCBpc0FyZyB8fCBpc0J1ZmYgfHwgaXNUeXBlLFxuICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKFxuICAgICAgICAgICAvLyBTYWZhcmkgOSBoYXMgZW51bWVyYWJsZSBgYXJndW1lbnRzLmxlbmd0aGAgaW4gc3RyaWN0IG1vZGUuXG4gICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbiAgICAgICAgICAgKGlzQnVmZiAmJiAoa2V5ID09ICdvZmZzZXQnIHx8IGtleSA9PSAncGFyZW50JykpIHx8XG4gICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgKGlzVHlwZSAmJiAoa2V5ID09ICdidWZmZXInIHx8IGtleSA9PSAnYnl0ZUxlbmd0aCcgfHwga2V5ID09ICdieXRlT2Zmc2V0JykpIHx8XG4gICAgICAgICAgIC8vIFNraXAgaW5kZXggcHJvcGVydGllcy5cbiAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlMaWtlS2V5cztcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlNYXA7XG4iLCIvKipcbiAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlQdXNoO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleF07XG4gIH1cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5UmVkdWNlO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc29tZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5U29tZShhcnJheSwgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVNvbWU7XG4iLCJ2YXIgYmFzZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fYmFzZVByb3BlcnR5Jyk7XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBhbiBBU0NJSSBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xudmFyIGFzY2lpU2l6ZSA9IGJhc2VQcm9wZXJ0eSgnbGVuZ3RoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYXNjaWlTaXplO1xuIiwidmFyIGJhc2VBc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25WYWx1ZScpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXNzaWduVmFsdWVgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYXNzaWduXG4gKiBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fFxuICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc2lnbk1lcmdlVmFsdWU7XG4iLCJ2YXIgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQXNzaWducyBgdmFsdWVgIHRvIGBrZXlgIG9mIGBvYmplY3RgIGlmIHRoZSBleGlzdGluZyB2YWx1ZSBpcyBub3QgZXF1aXZhbGVudFxuICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV07XG4gIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxKG9ialZhbHVlLCB2YWx1ZSkpIHx8XG4gICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzaWduVmFsdWU7XG4iLCJ2YXIgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzb2NJbmRleE9mO1xuIiwidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUFzc2lnbjtcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXNzaWduSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ25JbihvYmplY3QsIHNvdXJjZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQXNzaWduSW47XG4iLCJ2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19kZWZpbmVQcm9wZXJ0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBhc3NpZ25WYWx1ZWAgYW5kIGBhc3NpZ25NZXJnZVZhbHVlYCB3aXRob3V0XG4gKiB2YWx1ZSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5ID09ICdfX3Byb3RvX18nICYmIGRlZmluZVByb3BlcnR5KSB7XG4gICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgJ2VudW1lcmFibGUnOiB0cnVlLFxuICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ25WYWx1ZTtcbiIsInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25WYWx1ZScpLFxuICAgIGJhc2VBc3NpZ24gPSByZXF1aXJlKCcuL19iYXNlQXNzaWduJyksXG4gICAgYmFzZUFzc2lnbkluID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnbkluJyksXG4gICAgY2xvbmVCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUJ1ZmZlcicpLFxuICAgIGNvcHlBcnJheSA9IHJlcXVpcmUoJy4vX2NvcHlBcnJheScpLFxuICAgIGNvcHlTeW1ib2xzID0gcmVxdWlyZSgnLi9fY29weVN5bWJvbHMnKSxcbiAgICBjb3B5U3ltYm9sc0luID0gcmVxdWlyZSgnLi9fY29weVN5bWJvbHNJbicpLFxuICAgIGdldEFsbEtleXMgPSByZXF1aXJlKCcuL19nZXRBbGxLZXlzJyksXG4gICAgZ2V0QWxsS2V5c0luID0gcmVxdWlyZSgnLi9fZ2V0QWxsS2V5c0luJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaW5pdENsb25lQXJyYXkgPSByZXF1aXJlKCcuL19pbml0Q2xvbmVBcnJheScpLFxuICAgIGluaXRDbG9uZUJ5VGFnID0gcmVxdWlyZSgnLi9faW5pdENsb25lQnlUYWcnKSxcbiAgICBpbml0Q2xvbmVPYmplY3QgPSByZXF1aXJlKCcuL19pbml0Q2xvbmVPYmplY3QnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNNYXAgPSByZXF1aXJlKCcuL2lzTWFwJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNTZXQgPSByZXF1aXJlKCcuL2lzU2V0JyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG52YXIgQ0xPTkVfREVFUF9GTEFHID0gMSxcbiAgICBDTE9ORV9GTEFUX0ZMQUcgPSAyLFxuICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IGBfLmNsb25lYC4gKi9cbnZhciBjbG9uZWFibGVUYWdzID0ge307XG5jbG9uZWFibGVUYWdzW2FyZ3NUYWddID0gY2xvbmVhYmxlVGFnc1thcnJheVRhZ10gPVxuY2xvbmVhYmxlVGFnc1thcnJheUJ1ZmZlclRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXSA9XG5jbG9uZWFibGVUYWdzW2Jvb2xUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRlVGFnXSA9XG5jbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWddID0gY2xvbmVhYmxlVGFnc1tmbG9hdDY0VGFnXSA9XG5jbG9uZWFibGVUYWdzW2ludDhUYWddID0gY2xvbmVhYmxlVGFnc1tpbnQxNlRhZ10gPVxuY2xvbmVhYmxlVGFnc1tpbnQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW21hcFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tudW1iZXJUYWddID0gY2xvbmVhYmxlVGFnc1tvYmplY3RUYWddID1cbmNsb25lYWJsZVRhZ3NbcmVnZXhwVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc2V0VGFnXSA9XG5jbG9uZWFibGVUYWdzW3N0cmluZ1RhZ10gPSBjbG9uZWFibGVUYWdzW3N5bWJvbFRhZ10gPVxuY2xvbmVhYmxlVGFnc1t1aW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPVxuY2xvbmVhYmxlVGFnc1t1aW50MTZUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbmNsb25lYWJsZVRhZ3NbZXJyb3JUYWddID0gY2xvbmVhYmxlVGFnc1tmdW5jVGFnXSA9XG5jbG9uZWFibGVUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xvbmVgIGFuZCBgXy5jbG9uZURlZXBgIHdoaWNoIHRyYWNrc1xuICogdHJhdmVyc2VkIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICogIDEgLSBEZWVwIGNsb25lXG4gKiAgMiAtIEZsYXR0ZW4gaW5oZXJpdGVkIHByb3BlcnRpZXNcbiAqICA0IC0gQ2xvbmUgc3ltYm9sc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSBUaGUga2V5IG9mIGB2YWx1ZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIHBhcmVudCBvYmplY3Qgb2YgYHZhbHVlYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBhbmQgdGhlaXIgY2xvbmUgY291bnRlcnBhcnRzLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIG9iamVjdCwgc3RhY2spIHtcbiAgdmFyIHJlc3VsdCxcbiAgICAgIGlzRGVlcCA9IGJpdG1hc2sgJiBDTE9ORV9ERUVQX0ZMQUcsXG4gICAgICBpc0ZsYXQgPSBiaXRtYXNrICYgQ0xPTkVfRkxBVF9GTEFHLFxuICAgICAgaXNGdWxsID0gYml0bWFzayAmIENMT05FX1NZTUJPTFNfRkxBRztcblxuICBpZiAoY3VzdG9taXplcikge1xuICAgIHJlc3VsdCA9IG9iamVjdCA/IGN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlKTtcbiAgfVxuICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpO1xuICBpZiAoaXNBcnIpIHtcbiAgICByZXN1bHQgPSBpbml0Q2xvbmVBcnJheSh2YWx1ZSk7XG4gICAgaWYgKCFpc0RlZXApIHtcbiAgICAgIHJldHVybiBjb3B5QXJyYXkodmFsdWUsIHJlc3VsdCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgICBpc0Z1bmMgPSB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnO1xuXG4gICAgaWYgKGlzQnVmZmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGNsb25lQnVmZmVyKHZhbHVlLCBpc0RlZXApO1xuICAgIH1cbiAgICBpZiAodGFnID09IG9iamVjdFRhZyB8fCB0YWcgPT0gYXJnc1RhZyB8fCAoaXNGdW5jICYmICFvYmplY3QpKSB7XG4gICAgICByZXN1bHQgPSAoaXNGbGF0IHx8IGlzRnVuYykgPyB7fSA6IGluaXRDbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICByZXR1cm4gaXNGbGF0XG4gICAgICAgICAgPyBjb3B5U3ltYm9sc0luKHZhbHVlLCBiYXNlQXNzaWduSW4ocmVzdWx0LCB2YWx1ZSkpXG4gICAgICAgICAgOiBjb3B5U3ltYm9scyh2YWx1ZSwgYmFzZUFzc2lnbihyZXN1bHQsIHZhbHVlKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2xvbmVhYmxlVGFnc1t0YWddKSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPyB2YWx1ZSA6IHt9O1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gaW5pdENsb25lQnlUYWcodmFsdWUsIHRhZywgaXNEZWVwKTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyBjbG9uZS5cbiAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQodmFsdWUpO1xuICBpZiAoc3RhY2tlZCkge1xuICAgIHJldHVybiBzdGFja2VkO1xuICB9XG4gIHN0YWNrLnNldCh2YWx1ZSwgcmVzdWx0KTtcblxuICBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSkge1xuICAgICAgcmVzdWx0LmFkZChiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN1YlZhbHVlLCB2YWx1ZSwgc3RhY2spKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc01hcCh2YWx1ZSkpIHtcbiAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdC5zZXQoa2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgfSk7XG4gIH1cblxuICB2YXIga2V5c0Z1bmMgPSBpc0Z1bGxcbiAgICA/IChpc0ZsYXQgPyBnZXRBbGxLZXlzSW4gOiBnZXRBbGxLZXlzKVxuICAgIDogKGlzRmxhdCA/IGtleXNJbiA6IGtleXMpO1xuXG4gIHZhciBwcm9wcyA9IGlzQXJyID8gdW5kZWZpbmVkIDoga2V5c0Z1bmModmFsdWUpO1xuICBhcnJheUVhY2gocHJvcHMgfHwgdmFsdWUsIGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIGtleSA9IHN1YlZhbHVlO1xuICAgICAgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBwb3B1bGF0ZSBjbG9uZSAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VDbG9uZTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0Q3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gKiBwcm9wZXJ0aWVzIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xudmFyIGJhc2VDcmVhdGUgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIG9iamVjdCgpIHt9XG4gIHJldHVybiBmdW5jdGlvbihwcm90bykge1xuICAgIGlmICghaXNPYmplY3QocHJvdG8pKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGlmIChvYmplY3RDcmVhdGUpIHtcbiAgICAgIHJldHVybiBvYmplY3RDcmVhdGUocHJvdG8pO1xuICAgIH1cbiAgICBvYmplY3QucHJvdG90eXBlID0gcHJvdG87XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBvYmplY3Q7XG4gICAgb2JqZWN0LnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQ3JlYXRlO1xuIiwidmFyIGJhc2VGb3JPd24gPSByZXF1aXJlKCcuL19iYXNlRm9yT3duJyksXG4gICAgY3JlYXRlQmFzZUVhY2ggPSByZXF1aXJlKCcuL19jcmVhdGVCYXNlRWFjaCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICovXG52YXIgYmFzZUVhY2ggPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRWFjaDtcbiIsInZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8ubWF4YCBhbmQgYF8ubWluYCB3aGljaCBhY2NlcHRzIGFcbiAqIGBjb21wYXJhdG9yYCB0byBkZXRlcm1pbmUgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgdXNlZCB0byBjb21wYXJlIHZhbHVlcy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgY3VycmVudCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgIGlmIChjdXJyZW50ICE9IG51bGwgJiYgKGNvbXB1dGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IChjdXJyZW50ID09PSBjdXJyZW50ICYmICFpc1N5bWJvbChjdXJyZW50KSlcbiAgICAgICAgICA6IGNvbXBhcmF0b3IoY3VycmVudCwgY29tcHV0ZWQpXG4gICAgICAgICkpIHtcbiAgICAgIHZhciBjb21wdXRlZCA9IGN1cnJlbnQsXG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUV4dHJlbXVtO1xuIiwidmFyIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWx0ZXJgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGaWx0ZXI7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmluZEluZGV4O1xuIiwidmFyIGFycmF5UHVzaCA9IHJlcXVpcmUoJy4vX2FycmF5UHVzaCcpLFxuICAgIGlzRmxhdHRlbmFibGUgPSByZXF1aXJlKCcuL19pc0ZsYXR0ZW5hYmxlJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmxhdHRlbmAgd2l0aCBzdXBwb3J0IGZvciByZXN0cmljdGluZyBmbGF0dGVuaW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aCBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0XSBSZXN0cmljdCB0byB2YWx1ZXMgdGhhdCBwYXNzIGBwcmVkaWNhdGVgIGNoZWNrcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHQ9W11dIFRoZSBpbml0aWFsIHJlc3VsdCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZUZsYXR0ZW4oYXJyYXksIGRlcHRoLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgcHJlZGljYXRlIHx8IChwcmVkaWNhdGUgPSBpc0ZsYXR0ZW5hYmxlKTtcbiAgcmVzdWx0IHx8IChyZXN1bHQgPSBbXSk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKGRlcHRoID4gMCAmJiBwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICBpZiAoZGVwdGggPiAxKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGJhc2VGbGF0dGVuKHZhbHVlLCBkZXB0aCAtIDEsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheVB1c2gocmVzdWx0LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHtcbiAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGbGF0dGVuO1xuIiwidmFyIGNyZWF0ZUJhc2VGb3IgPSByZXF1aXJlKCcuL19jcmVhdGVCYXNlRm9yJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG52YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRm9yO1xuIiwidmFyIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93bmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZvck93bjtcbiIsInZhciBjYXN0UGF0aCA9IHJlcXVpcmUoJy4vX2Nhc3RQYXRoJyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHBhdGgpIHtcbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gMCxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gIHdoaWxlIChvYmplY3QgIT0gbnVsbCAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XG4gIH1cbiAgcmV0dXJuIChpbmRleCAmJiBpbmRleCA9PSBsZW5ndGgpID8gb2JqZWN0IDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXQ7XG4iLCJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlc1xuICogYGtleXNGdW5jYCBhbmQgYHN5bWJvbHNGdW5jYCB0byBnZXQgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3ltYm9sc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7XG4gIHZhciByZXN1bHQgPSBrZXlzRnVuYyhvYmplY3QpO1xuICByZXR1cm4gaXNBcnJheShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldEFsbEtleXM7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgZ2V0UmF3VGFnID0gcmVxdWlyZSgnLi9fZ2V0UmF3VGFnJyksXG4gICAgb2JqZWN0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19vYmplY3RUb1N0cmluZycpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICB9XG4gIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICA/IGdldFJhd1RhZyh2YWx1ZSlcbiAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0VGFnO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ndGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUd0KHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPiBvdGhlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR3Q7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc2Agd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUhhcyhvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUhhcztcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYga2V5IGluIE9iamVjdChvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VIYXNJbjtcbiIsInZhciBiYXNlRmluZEluZGV4ID0gcmVxdWlyZSgnLi9fYmFzZUZpbmRJbmRleCcpLFxuICAgIGJhc2VJc05hTiA9IHJlcXVpcmUoJy4vX2Jhc2VJc05hTicpLFxuICAgIHN0cmljdEluZGV4T2YgPSByZXF1aXJlKCcuL19zdHJpY3RJbmRleE9mJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICA/IHN0cmljdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpXG4gICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUluZGV4T2Y7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJndW1lbnRzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0FyZ3VtZW50cztcbiIsInZhciBiYXNlSXNFcXVhbERlZXAgPSByZXF1aXJlKCcuL19iYXNlSXNFcXVhbERlZXAnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRXF1YWxgIHdoaWNoIHN1cHBvcnRzIHBhcnRpYWwgY29tcGFyaXNvbnNcbiAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICogIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICogIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjtcbiAgfVxuICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgYmFzZUlzRXF1YWwsIHN0YWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNFcXVhbDtcbiIsInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgZXF1YWxBcnJheXMgPSByZXF1aXJlKCcuL19lcXVhbEFycmF5cycpLFxuICAgIGVxdWFsQnlUYWcgPSByZXF1aXJlKCcuL19lcXVhbEJ5VGFnJyksXG4gICAgZXF1YWxPYmplY3RzID0gcmVxdWlyZSgnLi9fZXF1YWxPYmplY3RzJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICogcmVmZXJlbmNlcyB0byBiZSBjb21wYXJlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIG9iaklzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgIG90aFRhZyA9IG90aElzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob3RoZXIpO1xuXG4gIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICB2YXIgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICBpZiAoaXNTYW1lVGFnICYmIGlzQnVmZmVyKG9iamVjdCkpIHtcbiAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgfVxuICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgcmV0dXJuIChvYmpJc0FyciB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KSlcbiAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICB9XG4gIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICBvdGhJc1dyYXBwZWQgPSBvdGhJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCAnX193cmFwcGVkX18nKTtcblxuICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgb3RoVW53cmFwcGVkID0gb3RoSXNXcmFwcGVkID8gb3RoZXIudmFsdWUoKSA6IG90aGVyO1xuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzU2FtZVRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICByZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0VxdWFsRGVlcDtcbiIsInZhciBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc01hcCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IG1hcFRhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNNYXA7XG4iLCJ2YXIgU3RhY2sgPSByZXF1aXJlKCcuL19TdGFjaycpLFxuICAgIGJhc2VJc0VxdWFsID0gcmVxdWlyZSgnLi9fYmFzZUlzRXF1YWwnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWF0Y2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICogQHBhcmFtIHtBcnJheX0gbWF0Y2hEYXRhIFRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSwgY3VzdG9taXplcikge1xuICB2YXIgaW5kZXggPSBtYXRjaERhdGEubGVuZ3RoLFxuICAgICAgbGVuZ3RoID0gaW5kZXgsXG4gICAgICBub0N1c3RvbWl6ZXIgPSAhY3VzdG9taXplcjtcblxuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gIWxlbmd0aDtcbiAgfVxuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICB2YXIgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgaWYgKChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSlcbiAgICAgICAgICA/IGRhdGFbMV0gIT09IG9iamVjdFtkYXRhWzBdXVxuICAgICAgICAgIDogIShkYXRhWzBdIGluIG9iamVjdClcbiAgICAgICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgdmFyIGtleSA9IGRhdGFbMF0sXG4gICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgIHNyY1ZhbHVlID0gZGF0YVsxXTtcblxuICAgIGlmIChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSkge1xuICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdGFjayA9IG5ldyBTdGFjaztcbiAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spO1xuICAgICAgfVxuICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgOiByZXN1bHRcbiAgICAgICAgICApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTWF0Y2g7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmFOYCB3aXRob3V0IHN1cHBvcnQgZm9yIG51bWJlciBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc05hTjtcbiIsInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNNYXNrZWQgPSByZXF1aXJlKCcuL19pc01hc2tlZCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqXG4gKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAqL1xudmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xudmFyIHJlSXNIb3N0Q3RvciA9IC9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC87XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNOYXRpdmU7XG4iLCJ2YXIgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzU2V0YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBzZXRUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzU2V0O1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNMZW5ndGggPSByZXF1aXJlKCcuL2lzTGVuZ3RoJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xudmFyIHR5cGVkQXJyYXlUYWdzID0ge307XG50eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbnR5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddID1cbnR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID1cbnR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID1cbnR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Z1bmNUYWddID1cbnR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPSB0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID1cbnR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID1cbnR5cGVkQXJyYXlUYWdzW3NldFRhZ10gPSB0eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddID1cbnR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiZcbiAgICBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc1R5cGVkQXJyYXk7XG4iLCJ2YXIgYmFzZU1hdGNoZXMgPSByZXF1aXJlKCcuL19iYXNlTWF0Y2hlcycpLFxuICAgIGJhc2VNYXRjaGVzUHJvcGVydHkgPSByZXF1aXJlKCcuL19iYXNlTWF0Y2hlc1Byb3BlcnR5JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIHByb3BlcnR5ID0gcmVxdWlyZSgnLi9wcm9wZXJ0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLml0ZXJhdGVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBbdmFsdWU9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGl0ZXJhdGVlLlxuICovXG5mdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpIHtcbiAgLy8gRG9uJ3Qgc3RvcmUgdGhlIGB0eXBlb2ZgIHJlc3VsdCBpbiBhIHZhcmlhYmxlIHRvIGF2b2lkIGEgSklUIGJ1ZyBpbiBTYWZhcmkgOS5cbiAgLy8gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTYwMzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gYmFzZU1hdGNoZXNQcm9wZXJ0eSh2YWx1ZVswXSwgdmFsdWVbMV0pXG4gICAgICA6IGJhc2VNYXRjaGVzKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gcHJvcGVydHkodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJdGVyYXRlZTtcbiIsInZhciBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgbmF0aXZlS2V5cyA9IHJlcXVpcmUoJy4vX25hdGl2ZUtleXMnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICBpZiAoIWlzUHJvdG90eXBlKG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VLZXlzO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBuYXRpdmVLZXlzSW4gPSByZXF1aXJlKCcuL19uYXRpdmVLZXlzSW4nKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzSW5gIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3QpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO1xuICB9XG4gIHZhciBpc1Byb3RvID0gaXNQcm90b3R5cGUob2JqZWN0KSxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoIShrZXkgPT0gJ2NvbnN0cnVjdG9yJyAmJiAoaXNQcm90byB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlS2V5c0luO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5sdGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUx0KHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPCBvdGhlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTHQ7XG4iLCJ2YXIgYmFzZUVhY2ggPSByZXF1aXJlKCcuL19iYXNlRWFjaCcpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hcGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlTWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gaXRlcmF0ZWUodmFsdWUsIGtleSwgY29sbGVjdGlvbik7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNYXA7XG4iLCJ2YXIgYmFzZUlzTWF0Y2ggPSByZXF1aXJlKCcuL19iYXNlSXNNYXRjaCcpLFxuICAgIGdldE1hdGNoRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hdGNoRGF0YScpLFxuICAgIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlID0gcmVxdWlyZSgnLi9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzYCB3aGljaCBkb2Vzbid0IGNsb25lIGBzb3VyY2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKSB7XG4gIHZhciBtYXRjaERhdGEgPSBnZXRNYXRjaERhdGEoc291cmNlKTtcbiAgaWYgKG1hdGNoRGF0YS5sZW5ndGggPT0gMSAmJiBtYXRjaERhdGFbMF1bMl0pIHtcbiAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLCBtYXRjaERhdGFbMF1bMV0pO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09PSBzb3VyY2UgfHwgYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZU1hdGNoZXM7XG4iLCJ2YXIgYmFzZUlzRXF1YWwgPSByZXF1aXJlKCcuL19iYXNlSXNFcXVhbCcpLFxuICAgIGdldCA9IHJlcXVpcmUoJy4vZ2V0JyksXG4gICAgaGFzSW4gPSByZXF1aXJlKCcuL2hhc0luJyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIGlzU3RyaWN0Q29tcGFyYWJsZSA9IHJlcXVpcmUoJy4vX2lzU3RyaWN0Q29tcGFyYWJsZScpLFxuICAgIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlID0gcmVxdWlyZSgnLi9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzUHJvcGVydHlgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNyY1ZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICBpZiAoaXNLZXkocGF0aCkgJiYgaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSkge1xuICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSwgc3JjVmFsdWUpO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIgb2JqVmFsdWUgPSBnZXQob2JqZWN0LCBwYXRoKTtcbiAgICByZXR1cm4gKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgb2JqVmFsdWUgPT09IHNyY1ZhbHVlKVxuICAgICAgPyBoYXNJbihvYmplY3QsIHBhdGgpXG4gICAgICA6IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWF0Y2hlc1Byb3BlcnR5O1xuIiwidmFyIFN0YWNrID0gcmVxdWlyZSgnLi9fU3RhY2snKSxcbiAgICBhc3NpZ25NZXJnZVZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduTWVyZ2VWYWx1ZScpLFxuICAgIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAgYmFzZU1lcmdlRGVlcCA9IHJlcXVpcmUoJy4vX2Jhc2VNZXJnZURlZXAnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpLFxuICAgIHNhZmVHZXQgPSByZXF1aXJlKCcuL19zYWZlR2V0Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAqICBjb3VudGVycGFydHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmIChvYmplY3QgPT09IHNvdXJjZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBiYXNlRm9yKHNvdXJjZSwgZnVuY3Rpb24oc3JjVmFsdWUsIGtleSkge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgYmFzZU1lcmdlLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgfVxuICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfSwga2V5c0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2U7XG4iLCJ2YXIgYXNzaWduTWVyZ2VWYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnbk1lcmdlVmFsdWUnKSxcbiAgICBjbG9uZUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQnVmZmVyJyksXG4gICAgY2xvbmVUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fY2xvbmVUeXBlZEFycmF5JyksXG4gICAgY29weUFycmF5ID0gcmVxdWlyZSgnLi9fY29weUFycmF5JyksXG4gICAgaW5pdENsb25lT2JqZWN0ID0gcmVxdWlyZSgnLi9faW5pdENsb25lT2JqZWN0JyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQXJyYXlMaWtlT2JqZWN0ID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZU9iamVjdCcpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi9pc1BsYWluT2JqZWN0JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKSxcbiAgICBzYWZlR2V0ID0gcmVxdWlyZSgnLi9fc2FmZUdldCcpLFxuICAgIHRvUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuL3RvUGxhaW5PYmplY3QnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VNZXJnZWAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBtZXJnZXMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAqIHJlZmVyZW5jZXMgdG8gYmUgbWVyZ2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBtZXJnZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXJnZUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1lcmdlIHZhbHVlcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gKiAgY291bnRlcnBhcnRzLlxuICovXG5mdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBtZXJnZUZ1bmMsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIHZhciBvYmpWYWx1ZSA9IHNhZmVHZXQob2JqZWN0LCBrZXkpLFxuICAgICAgc3JjVmFsdWUgPSBzYWZlR2V0KHNvdXJjZSwga2V5KSxcbiAgICAgIHN0YWNrZWQgPSBzdGFjay5nZXQoc3JjVmFsdWUpO1xuXG4gIGlmIChzdGFja2VkKSB7XG4gICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgc3RhY2tlZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgdmFyIGlzQ29tbW9uID0gbmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICBpZiAoaXNDb21tb24pIHtcbiAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHNyY1ZhbHVlKSxcbiAgICAgICAgaXNCdWZmID0gIWlzQXJyICYmIGlzQnVmZmVyKHNyY1ZhbHVlKSxcbiAgICAgICAgaXNUeXBlZCA9ICFpc0FyciAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheShzcmNWYWx1ZSk7XG5cbiAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgIGlmIChpc0FyciB8fCBpc0J1ZmYgfHwgaXNUeXBlZCkge1xuICAgICAgaWYgKGlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBjb3B5QXJyYXkob2JqVmFsdWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNCdWZmKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIG5ld1ZhbHVlID0gY2xvbmVCdWZmZXIoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNUeXBlZCkge1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBuZXdWYWx1ZSA9IGNsb25lVHlwZWRBcnJheShzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbmV3VmFsdWUgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChzcmNWYWx1ZSkgfHwgaXNBcmd1bWVudHMoc3JjVmFsdWUpKSB7XG4gICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgaWYgKGlzQXJndW1lbnRzKG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IHRvUGxhaW5PYmplY3Qob2JqVmFsdWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoIWlzT2JqZWN0KG9ialZhbHVlKSB8fCBpc0Z1bmN0aW9uKG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IGluaXRDbG9uZU9iamVjdChzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQ29tbW9uKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgbWVyZ2VGdW5jKG5ld1ZhbHVlLCBzcmNWYWx1ZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICBzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpO1xuICB9XG4gIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2VEZWVwO1xuIiwidmFyIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VNYXAgPSByZXF1aXJlKCcuL19iYXNlTWFwJyksXG4gICAgYmFzZVNvcnRCeSA9IHJlcXVpcmUoJy4vX2Jhc2VTb3J0QnknKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBjb21wYXJlTXVsdGlwbGUgPSByZXF1aXJlKCcuL19jb21wYXJlTXVsdGlwbGUnKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ub3JkZXJCeWAgd2l0aG91dCBwYXJhbSBndWFyZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gaXRlcmF0ZWVzIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAqIEBwYXJhbSB7c3RyaW5nW119IG9yZGVycyBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKSB7XG4gIGlmIChpdGVyYXRlZXMubGVuZ3RoKSB7XG4gICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgaWYgKGlzQXJyYXkoaXRlcmF0ZWUpKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBiYXNlR2V0KHZhbHVlLCBpdGVyYXRlZS5sZW5ndGggPT09IDEgPyBpdGVyYXRlZVswXSA6IGl0ZXJhdGVlKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVyYXRlZTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyYXRlZXMgPSBbaWRlbnRpdHldO1xuICB9XG5cbiAgdmFyIGluZGV4ID0gLTE7XG4gIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgYmFzZVVuYXJ5KGJhc2VJdGVyYXRlZSkpO1xuXG4gIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICB2YXIgY3JpdGVyaWEgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB7ICdjcml0ZXJpYSc6IGNyaXRlcmlhLCAnaW5kZXgnOiArK2luZGV4LCAndmFsdWUnOiB2YWx1ZSB9O1xuICB9KTtcblxuICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICByZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycyk7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VPcmRlckJ5O1xuIiwidmFyIGJhc2VQaWNrQnkgPSByZXF1aXJlKCcuL19iYXNlUGlja0J5JyksXG4gICAgaGFzSW4gPSByZXF1aXJlKCcuL2hhc0luJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucGlja2Agd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gKiBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LCBwYXRocykge1xuICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgIHJldHVybiBoYXNJbihvYmplY3QsIHBhdGgpO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUGljaztcbiIsInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpLFxuICAgIGJhc2VTZXQgPSByZXF1aXJlKCcuL19iYXNlU2V0JyksXG4gICAgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mICBgXy5waWNrQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0ge307XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgcGF0aCA9IHBhdGhzW2luZGV4XSxcbiAgICAgICAgdmFsdWUgPSBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG5cbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBwYXRoKSkge1xuICAgICAgYmFzZVNldChyZXN1bHQsIGNhc3RQYXRoKHBhdGgsIG9iamVjdCksIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUGlja0J5O1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eWAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUHJvcGVydHk7XG4iLCJ2YXIgYmFzZUdldCA9IHJlcXVpcmUoJy4vX2Jhc2VHZXQnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VQcm9wZXJ0eWAgd2hpY2ggc3VwcG9ydHMgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHJldHVybiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVByb3BlcnR5RGVlcDtcbiIsIi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVDZWlsID0gTWF0aC5jZWlsLFxuICAgIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmdlYCBhbmQgYF8ucmFuZ2VSaWdodGAgd2hpY2ggZG9lc24ndFxuICogY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAqL1xuZnVuY3Rpb24gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQgLSBzdGFydCkgLyAoc3RlcCB8fCAxKSksIDApLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICByZXN1bHRbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF0gPSBzdGFydDtcbiAgICBzdGFydCArPSBzdGVwO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVJhbmdlO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZWR1Y2VgIGFuZCBgXy5yZWR1Y2VSaWdodGAsIHdpdGhvdXQgc3VwcG9ydFxuICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gIHVzaW5nIGBlYWNoRnVuY2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtib29sZWFufSBpbml0QWNjdW0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3Qgb3IgbGFzdCBlbGVtZW50IG9mXG4gKiAgYGNvbGxlY3Rpb25gIGFzIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VSZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGVhY2hGdW5jKSB7XG4gIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgIGFjY3VtdWxhdG9yID0gaW5pdEFjY3VtXG4gICAgICA/IChpbml0QWNjdW0gPSBmYWxzZSwgdmFsdWUpXG4gICAgICA6IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICB9KTtcbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VSZWR1Y2U7XG4iLCJ2YXIgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgb3ZlclJlc3QgPSByZXF1aXJlKCcuL19vdmVyUmVzdCcpLFxuICAgIHNldFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fc2V0VG9TdHJpbmcnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXN0YCB3aGljaCBkb2Vzbid0IHZhbGlkYXRlIG9yIGNvZXJjZSBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVJlc3Q7XG4iLCJ2YXIgYXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25WYWx1ZScpLFxuICAgIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zZXRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIHBhdGggY3JlYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoLFxuICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMSxcbiAgICAgIG5lc3RlZCA9IG9iamVjdDtcblxuICB3aGlsZSAobmVzdGVkICE9IG51bGwgJiYgKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJyB8fCBrZXkgPT09ICdjb25zdHJ1Y3RvcicgfHwga2V5ID09PSAncHJvdG90eXBlJykge1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggIT0gbGFzdEluZGV4KSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3Qob2JqVmFsdWUpXG4gICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgIDogKGlzSW5kZXgocGF0aFtpbmRleCArIDFdKSA/IFtdIDoge30pO1xuICAgICAgfVxuICAgIH1cbiAgICBhc3NpZ25WYWx1ZShuZXN0ZWQsIGtleSwgbmV3VmFsdWUpO1xuICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldO1xuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNldDtcbiIsInZhciBjb25zdGFudCA9IHJlcXVpcmUoJy4vY29uc3RhbnQnKSxcbiAgICBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2RlZmluZVByb3BlcnR5JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldFRvU3RyaW5nYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIGJhc2VTZXRUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgc3RyaW5nKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7XG4gICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAndmFsdWUnOiBjb25zdGFudChzdHJpbmcpLFxuICAgICd3cml0YWJsZSc6IHRydWVcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VTZXRUb1N0cmluZztcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydEJ5YCB3aGljaCB1c2VzIGBjb21wYXJlcmAgdG8gZGVmaW5lIHRoZVxuICogc29ydCBvcmRlciBvZiBgYXJyYXlgIGFuZCByZXBsYWNlcyBjcml0ZXJpYSBvYmplY3RzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZ1xuICogdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc29ydC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmVyIFRoZSBmdW5jdGlvbiB0byBkZWZpbmUgc29ydCBvcmRlci5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBiYXNlU29ydEJ5KGFycmF5LCBjb21wYXJlcikge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIGFycmF5LnNvcnQoY29tcGFyZXIpO1xuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBhcnJheVtsZW5ndGhdID0gYXJyYXlbbGVuZ3RoXS52YWx1ZTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNvcnRCeTtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRpbWVzO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xudmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udG9TdHJpbmcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gIC8vIEV4aXQgZWFybHkgZm9yIHN0cmluZ3MgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSBoaXQgaW4gc29tZSBlbnZpcm9ubWVudHMuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgY29udmVydCB2YWx1ZXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICByZXR1cm4gYXJyYXlNYXAodmFsdWUsIGJhc2VUb1N0cmluZykgKyAnJztcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHN5bWJvbFRvU3RyaW5nID8gc3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRvU3RyaW5nO1xuIiwidmFyIHRyaW1tZWRFbmRJbmRleCA9IHJlcXVpcmUoJy4vX3RyaW1tZWRFbmRJbmRleCcpO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltU3RhcnQgPSAvXlxccysvO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRyaW1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVHJpbShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZ1xuICAgID8gc3RyaW5nLnNsaWNlKDAsIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpICsgMSkucmVwbGFjZShyZVRyaW1TdGFydCwgJycpXG4gICAgOiBzdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRyaW07XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVVuYXJ5O1xuIiwidmFyIFNldENhY2hlID0gcmVxdWlyZSgnLi9fU2V0Q2FjaGUnKSxcbiAgICBhcnJheUluY2x1ZGVzID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlcycpLFxuICAgIGFycmF5SW5jbHVkZXNXaXRoID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlc1dpdGgnKSxcbiAgICBjYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2NhY2hlSGFzJyksXG4gICAgY3JlYXRlU2V0ID0gcmVxdWlyZSgnLi9fY3JlYXRlU2V0JyksXG4gICAgc2V0VG9BcnJheSA9IHJlcXVpcmUoJy4vX3NldFRvQXJyYXknKTtcblxuLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG52YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuaXEoYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgcmVzdWx0ID0gW10sXG4gICAgICBzZWVuID0gcmVzdWx0O1xuXG4gIGlmIChjb21wYXJhdG9yKSB7XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICB9XG4gIGVsc2UgaWYgKGxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgdmFyIHNldCA9IGl0ZXJhdGVlID8gbnVsbCA6IGNyZWF0ZVNldChhcnJheSk7XG4gICAgaWYgKHNldCkge1xuICAgICAgcmV0dXJuIHNldFRvQXJyYXkoc2V0KTtcbiAgICB9XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgIHNlZW4gPSBuZXcgU2V0Q2FjaGU7XG4gIH1cbiAgZWxzZSB7XG4gICAgc2VlbiA9IGl0ZXJhdGVlID8gW10gOiByZXN1bHQ7XG4gIH1cbiAgb3V0ZXI6XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5sZW5ndGg7XG4gICAgICB3aGlsZSAoc2VlbkluZGV4LS0pIHtcbiAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgIGlmIChzZWVuICE9PSByZXN1bHQpIHtcbiAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVW5pcTtcbiIsInZhciBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICogb2YgYHByb3BzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VWYWx1ZXM7XG4iLCIvKipcbiAqIFRoaXMgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy56aXBPYmplY3RgIHdoaWNoIGFzc2lnbnMgdmFsdWVzIHVzaW5nIGBhc3NpZ25GdW5jYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25GdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVppcE9iamVjdChwcm9wcywgdmFsdWVzLCBhc3NpZ25GdW5jKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgdmFsc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICByZXN1bHQgPSB7fTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGluZGV4IDwgdmFsc0xlbmd0aCA/IHZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgYXNzaWduRnVuYyhyZXN1bHQsIHByb3BzW2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVppcE9iamVjdDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGEgYGNhY2hlYCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgVGhlIGNhY2hlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgcmV0dXJuIGNhY2hlLmhhcyhrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhY2hlSGFzO1xuIiwidmFyIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYGlkZW50aXR5YCBpZiBpdCdzIG5vdCBhIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGNhc3QgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNhc3RGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicgPyB2YWx1ZSA6IGlkZW50aXR5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RGdW5jdGlvbjtcbiIsInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIHN0cmluZ1RvUGF0aCA9IHJlcXVpcmUoJy4vX3N0cmluZ1RvUGF0aCcpLFxuICAgIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b1N0cmluZycpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYSBwYXRoIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RQYXRoO1xuIiwidmFyIFVpbnQ4QXJyYXkgPSByZXF1aXJlKCcuL19VaW50OEFycmF5Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheSBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBhcnJheUJ1ZmZlci5jb25zdHJ1Y3RvcihhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgbmV3IFVpbnQ4QXJyYXkocmVzdWx0KS5zZXQobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZUFycmF5QnVmZmVyO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkLFxuICAgIGFsbG9jVW5zYWZlID0gQnVmZmVyID8gQnVmZmVyLmFsbG9jVW5zYWZlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiAgYGJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBjbG9uZUJ1ZmZlcihidWZmZXIsIGlzRGVlcCkge1xuICBpZiAoaXNEZWVwKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgpO1xuICB9XG4gIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gYWxsb2NVbnNhZmUgPyBhbGxvY1Vuc2FmZShsZW5ndGgpIDogbmV3IGJ1ZmZlci5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gIGJ1ZmZlci5jb3B5KHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVCdWZmZXI7XG4iLCJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIGRhdGEgdmlldy5cbiAqL1xuZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldywgaXNEZWVwKSB7XG4gIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKGRhdGFWaWV3LmJ1ZmZlcikgOiBkYXRhVmlldy5idWZmZXI7XG4gIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZURhdGFWaWV3O1xuIiwiLyoqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVGbGFncyA9IC9cXHcqJC87XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGByZWdleHBgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcmVnZXhwIFRoZSByZWdleHAgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgcmVnZXhwLlxuICovXG5mdW5jdGlvbiBjbG9uZVJlZ0V4cChyZWdleHApIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSwgcmVGbGFncy5leGVjKHJlZ2V4cCkpO1xuICByZXN1bHQubGFzdEluZGV4ID0gcmVnZXhwLmxhc3RJbmRleDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZVJlZ0V4cDtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBgc3ltYm9sYCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzeW1ib2wgVGhlIHN5bWJvbCBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgc3ltYm9sIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKSB7XG4gIHJldHVybiBzeW1ib2xWYWx1ZU9mID8gT2JqZWN0KHN5bWJvbFZhbHVlT2YuY2FsbChzeW1ib2wpKSA6IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lU3ltYm9sO1xuIiwidmFyIGNsb25lQXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUFycmF5QnVmZmVyJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB0eXBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHR5cGVkQXJyYXksIGlzRGVlcCkge1xuICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcikgOiB0eXBlZEFycmF5LmJ1ZmZlcjtcbiAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVUeXBlZEFycmF5O1xuIiwidmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKipcbiAqIENvbXBhcmVzIHZhbHVlcyB0byBzb3J0IHRoZW0gaW4gYXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgdmFsdWVgLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICBpZiAodmFsdWUgIT09IG90aGVyKSB7XG4gICAgdmFyIHZhbElzRGVmaW5lZCA9IHZhbHVlICE9PSB1bmRlZmluZWQsXG4gICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICB2YWxJc1JlZmxleGl2ZSA9IHZhbHVlID09PSB2YWx1ZSxcbiAgICAgICAgdmFsSXNTeW1ib2wgPSBpc1N5bWJvbCh2YWx1ZSk7XG5cbiAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgb3RoSXNOdWxsID0gb3RoZXIgPT09IG51bGwsXG4gICAgICAgIG90aElzUmVmbGV4aXZlID0gb3RoZXIgPT09IG90aGVyLFxuICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgIGlmICgoIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wgJiYgIXZhbElzU3ltYm9sICYmIHZhbHVlID4gb3RoZXIpIHx8XG4gICAgICAgICh2YWxJc1N5bWJvbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUgJiYgIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wpIHx8XG4gICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAoIXZhbElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgIXZhbElzUmVmbGV4aXZlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgaWYgKCghdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCAmJiAhb3RoSXNTeW1ib2wgJiYgdmFsdWUgPCBvdGhlcikgfHxcbiAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgKG90aElzTnVsbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICghb3RoSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZUFzY2VuZGluZztcbiIsInZhciBjb21wYXJlQXNjZW5kaW5nID0gcmVxdWlyZSgnLi9fY29tcGFyZUFzY2VuZGluZycpO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlclxuICogYW5kIHN0YWJsZSBzb3J0IHRoZW0uXG4gKlxuICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSxcbiAqIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXJcbiAqIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW5bXXxzdHJpbmdbXX0gb3JkZXJzIFRoZSBvcmRlciB0byBzb3J0IGJ5IGZvciBlYWNoIHByb3BlcnR5LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc29ydCBvcmRlciBpbmRpY2F0b3IgZm9yIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgb2JqQ3JpdGVyaWEgPSBvYmplY3QuY3JpdGVyaWEsXG4gICAgICBvdGhDcml0ZXJpYSA9IG90aGVyLmNyaXRlcmlhLFxuICAgICAgbGVuZ3RoID0gb2JqQ3JpdGVyaWEubGVuZ3RoLFxuICAgICAgb3JkZXJzTGVuZ3RoID0gb3JkZXJzLmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciByZXN1bHQgPSBjb21wYXJlQXNjZW5kaW5nKG9iakNyaXRlcmlhW2luZGV4XSwgb3RoQ3JpdGVyaWFbaW5kZXhdKTtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBpZiAoaW5kZXggPj0gb3JkZXJzTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgb3JkZXIgPSBvcmRlcnNbaW5kZXhdO1xuICAgICAgcmV0dXJuIHJlc3VsdCAqIChvcmRlciA9PSAnZGVzYycgPyAtMSA6IDEpO1xuICAgIH1cbiAgfVxuICAvLyBGaXhlcyBhbiBgQXJyYXkjc29ydGAgYnVnIGluIHRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgYXBwbGljYXRpb25zXG4gIC8vIHRoYXQgY2F1c2VzIGl0LCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWUgZm9yXG4gIC8vIGBvYmplY3RgIGFuZCBgb3RoZXJgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL3B1bGwvMTI0N1xuICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAvL1xuICAvLyBUaGlzIGFsc28gZW5zdXJlcyBhIHN0YWJsZSBzb3J0IGluIFY4IGFuZCBvdGhlciBlbmdpbmVzLlxuICAvLyBTZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9OTAgZm9yIG1vcmUgZGV0YWlscy5cbiAgcmV0dXJuIG9iamVjdC5pbmRleCAtIG90aGVyLmluZGV4O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVNdWx0aXBsZTtcbiIsIi8qKlxuICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgYHNvdXJjZWAgdG8gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuXG4gIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlBcnJheTtcbiIsInZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyk7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29waWVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLCBwcm9wcywgb2JqZWN0LCBjdXN0b21pemVyKSB7XG4gIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcblxuICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXdWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgICBpZiAoaXNOZXcpIHtcbiAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlPYmplY3Q7XG4iLCJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBnZXRTeW1ib2xzID0gcmVxdWlyZSgnLi9fZ2V0U3ltYm9scycpO1xuXG4vKipcbiAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLCBvYmplY3QpIHtcbiAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVN5bWJvbHM7XG4iLCJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBnZXRTeW1ib2xzSW4gPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzSW4nKTtcblxuLyoqXG4gKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2UsIG9iamVjdCkge1xuICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHNJbihzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlTeW1ib2xzSW47XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xudmFyIGNvcmVKc0RhdGEgPSByb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3JlSnNEYXRhO1xuIiwidmFyIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhc3NpZ25lciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA+IDEgPyBzb3VyY2VzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkLFxuICAgICAgICBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICA/IChsZW5ndGgtLSwgY3VzdG9taXplcilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiBjdXN0b21pemVyO1xuICAgICAgbGVuZ3RoID0gMTtcbiAgICB9XG4gICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgYXNzaWduZXIob2JqZWN0LCBzb3VyY2UsIGluZGV4LCBjdXN0b21pemVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQXNzaWduZXI7XG4iLCJ2YXIgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmFzZUVhY2goZWFjaEZ1bmMsIGZyb21SaWdodCkge1xuICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9XG4gICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgcmV0dXJuIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKTtcbiAgICB9XG4gICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IGZyb21SaWdodCA/IGxlbmd0aCA6IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChjb2xsZWN0aW9uKTtcblxuICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQmFzZUVhY2g7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSBiYXNlIGZ1bmN0aW9uIGZvciBtZXRob2RzIGxpa2UgYF8uZm9ySW5gIGFuZCBgXy5mb3JPd25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VGb3IoZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChvYmplY3QpLFxuICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCYXNlRm9yO1xuIiwidmFyIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYF8uZmluZGAgb3IgYF8uZmluZExhc3RgIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5kSW5kZXhGdW5jIFRoZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb2xsZWN0aW9uIGluZGV4LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmluZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgIHZhciBpdGVyYWJsZSA9IE9iamVjdChjb2xsZWN0aW9uKTtcbiAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgIGNvbGxlY3Rpb24gPSBrZXlzKGNvbGxlY3Rpb24pO1xuICAgICAgcHJlZGljYXRlID0gZnVuY3Rpb24oa2V5KSB7IHJldHVybiBpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKTsgfTtcbiAgICB9XG4gICAgdmFyIGluZGV4ID0gZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCk7XG4gICAgcmV0dXJuIGluZGV4ID4gLTEgPyBpdGVyYWJsZVtpdGVyYXRlZSA/IGNvbGxlY3Rpb25baW5kZXhdIDogaW5kZXhdIDogdW5kZWZpbmVkO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUZpbmQ7XG4iLCJ2YXIgYmFzZVJhbmdlID0gcmVxdWlyZSgnLi9fYmFzZVJhbmdlJyksXG4gICAgaXNJdGVyYXRlZUNhbGwgPSByZXF1aXJlKCcuL19pc0l0ZXJhdGVlQ2FsbCcpLFxuICAgIHRvRmluaXRlID0gcmVxdWlyZSgnLi90b0Zpbml0ZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgXy5yYW5nZWAgb3IgYF8ucmFuZ2VSaWdodGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmFuZ2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCkge1xuICByZXR1cm4gZnVuY3Rpb24oc3RhcnQsIGVuZCwgc3RlcCkge1xuICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICBlbmQgPSBzdGVwID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmQgPSBzdGFydDtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICB9XG4gICAgc3RlcCA9IHN0ZXAgPT09IHVuZGVmaW5lZCA/IChzdGFydCA8IGVuZCA/IDEgOiAtMSkgOiB0b0Zpbml0ZShzdGVwKTtcbiAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlUmFuZ2U7XG4iLCJ2YXIgU2V0ID0gcmVxdWlyZSgnLi9fU2V0JyksXG4gICAgbm9vcCA9IHJlcXVpcmUoJy4vbm9vcCcpLFxuICAgIHNldFRvQXJyYXkgPSByZXF1aXJlKCcuL19zZXRUb0FycmF5Jyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNldCBvYmplY3Qgb2YgYHZhbHVlc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IHNldC5cbiAqL1xudmFyIGNyZWF0ZVNldCA9ICEoU2V0ICYmICgxIC8gc2V0VG9BcnJheShuZXcgU2V0KFssLTBdKSlbMV0pID09IElORklOSVRZKSA/IG5vb3AgOiBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgcmV0dXJuIG5ldyBTZXQodmFsdWVzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlU2V0O1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTtcbiAgICBmdW5jKHt9LCAnJywge30pO1xuICAgIHJldHVybiBmdW5jO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWZpbmVQcm9wZXJ0eTtcbiIsInZhciBTZXRDYWNoZSA9IHJlcXVpcmUoJy4vX1NldENhY2hlJyksXG4gICAgYXJyYXlTb21lID0gcmVxdWlyZSgnLi9fYXJyYXlTb21lJyksXG4gICAgY2FjaGVIYXMgPSByZXF1aXJlKCcuL19jYWNoZUhhcycpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7QXJyYXl9IG90aGVyIFRoZSBvdGhlciBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICBpZiAoYXJyTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhKGlzUGFydGlhbCAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gIHZhciBhcnJTdGFja2VkID0gc3RhY2suZ2V0KGFycmF5KTtcbiAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICBpZiAoYXJyU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgcmV0dXJuIGFyclN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBhcnJheTtcbiAgfVxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IHRydWUsXG4gICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICBzdGFjay5zZXQoYXJyYXksIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBhcnJheSk7XG5cbiAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICB3aGlsZSAoKytpbmRleCA8IGFyckxlbmd0aCkge1xuICAgIHZhciBhcnJWYWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICA6IGN1c3RvbWl6ZXIoYXJyVmFsdWUsIG90aFZhbHVlLCBpbmRleCwgYXJyYXksIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29tcGFyZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmIChzZWVuKSB7XG4gICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICBpZiAoIWNhY2hlSGFzKHNlZW4sIG90aEluZGV4KSAmJlxuICAgICAgICAgICAgICAgIChhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKSkge1xuICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSkge1xuICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgIGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fFxuICAgICAgICAgICAgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spXG4gICAgICAgICkpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHN0YWNrWydkZWxldGUnXShhcnJheSk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxBcnJheXM7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgVWludDhBcnJheSA9IHJlcXVpcmUoJy4vX1VpbnQ4QXJyYXknKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKSxcbiAgICBlcXVhbEFycmF5cyA9IHJlcXVpcmUoJy4vX2VxdWFsQXJyYXlzJyksXG4gICAgbWFwVG9BcnJheSA9IHJlcXVpcmUoJy4vX21hcFRvQXJyYXknKSxcbiAgICBzZXRUb0FycmF5ID0gcmVxdWlyZSgnLi9fc2V0VG9BcnJheScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJztcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBjb21wYXJpbmcgb2JqZWN0cyBvZlxuICogdGhlIHNhbWUgYHRvU3RyaW5nVGFnYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNvbXBhcmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBvciBgU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0cyB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgdGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAob2JqZWN0LmJ5dGVPZmZzZXQgIT0gb3RoZXIuYnl0ZU9mZnNldCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gb2JqZWN0LmJ1ZmZlcjtcbiAgICAgIG90aGVyID0gb3RoZXIuYnVmZmVyO1xuXG4gICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAhZXF1YWxGdW5jKG5ldyBVaW50OEFycmF5KG9iamVjdCksIG5ldyBVaW50OEFycmF5KG90aGVyKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBjYXNlIGJvb2xUYWc6XG4gICAgY2FzZSBkYXRlVGFnOlxuICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgLy8gQ29lcmNlIGJvb2xlYW5zIHRvIGAxYCBvciBgMGAgYW5kIGRhdGVzIHRvIG1pbGxpc2Vjb25kcy5cbiAgICAgIC8vIEludmFsaWQgZGF0ZXMgYXJlIGNvZXJjZWQgdG8gYE5hTmAuXG4gICAgICByZXR1cm4gZXEoK29iamVjdCwgK290aGVyKTtcblxuICAgIGNhc2UgZXJyb3JUYWc6XG4gICAgICByZXR1cm4gb2JqZWN0Lm5hbWUgPT0gb3RoZXIubmFtZSAmJiBvYmplY3QubWVzc2FnZSA9PSBvdGhlci5tZXNzYWdlO1xuXG4gICAgY2FzZSByZWdleHBUYWc6XG4gICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAvLyBDb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzIGFuZCB0cmVhdCBzdHJpbmdzLCBwcmltaXRpdmVzIGFuZCBvYmplY3RzLFxuICAgICAgLy8gYXMgZXF1YWwuIFNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcmVnZXhwLnByb3RvdHlwZS50b3N0cmluZ1xuICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIHJldHVybiBvYmplY3QgPT0gKG90aGVyICsgJycpO1xuXG4gICAgY2FzZSBtYXBUYWc6XG4gICAgICB2YXIgY29udmVydCA9IG1hcFRvQXJyYXk7XG5cbiAgICBjYXNlIHNldFRhZzpcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUc7XG4gICAgICBjb252ZXJ0IHx8IChjb252ZXJ0ID0gc2V0VG9BcnJheSk7XG5cbiAgICAgIGlmIChvYmplY3Quc2l6ZSAhPSBvdGhlci5zaXplICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgIGlmIChzdGFja2VkKSB7XG4gICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgfVxuICAgICAgYml0bWFzayB8PSBDT01QQVJFX1VOT1JERVJFRF9GTEFHO1xuXG4gICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgIHZhciByZXN1bHQgPSBlcXVhbEFycmF5cyhjb252ZXJ0KG9iamVjdCksIGNvbnZlcnQob3RoZXIpLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgaWYgKHN5bWJvbFZhbHVlT2YpIHtcbiAgICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpID09IHN5bWJvbFZhbHVlT2YuY2FsbChvdGhlcik7XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxdWFsQnlUYWc7XG4iLCJ2YXIgZ2V0QWxsS2V5cyA9IHJlcXVpcmUoJy4vX2dldEFsbEtleXMnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3Igb2JqZWN0cyB3aXRoIHN1cHBvcnQgZm9yXG4gKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgb2JqUHJvcHMgPSBnZXRBbGxLZXlzKG9iamVjdCksXG4gICAgICBvYmpMZW5ndGggPSBvYmpQcm9wcy5sZW5ndGgsXG4gICAgICBvdGhQcm9wcyA9IGdldEFsbEtleXMob3RoZXIpLFxuICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoO1xuXG4gIGlmIChvYmpMZW5ndGggIT0gb3RoTGVuZ3RoICYmICFpc1BhcnRpYWwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGluZGV4ID0gb2JqTGVuZ3RoO1xuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgaWYgKCEoaXNQYXJ0aWFsID8ga2V5IGluIG90aGVyIDogaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwga2V5KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgdGhhdCBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgdmFyIG9ialN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICBpZiAob2JqU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgcmV0dXJuIG9ialN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBvYmplY3Q7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHRydWU7XG4gIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBvYmplY3QpO1xuXG4gIHZhciBza2lwQ3RvciA9IGlzUGFydGlhbDtcbiAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcbiAgICBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTtcblxuICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcbiAgICAgICAgOiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSwga2V5LCBvYmplY3QsIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmICghKGNvbXBhcmVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IChvYmpWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKG9ialZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKVxuICAgICAgICAgIDogY29tcGFyZWRcbiAgICAgICAgKSkge1xuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2tpcEN0b3IgfHwgKHNraXBDdG9yID0ga2V5ID09ICdjb25zdHJ1Y3RvcicpO1xuICB9XG4gIGlmIChyZXN1bHQgJiYgIXNraXBDdG9yKSB7XG4gICAgdmFyIG9iakN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLlxuICAgIGlmIChvYmpDdG9yICE9IG90aEN0b3IgJiZcbiAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJlxuICAgICAgICAgIHR5cGVvZiBvdGhDdG9yID09ICdmdW5jdGlvbicgJiYgb3RoQ3RvciBpbnN0YW5jZW9mIG90aEN0b3IpKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxPYmplY3RzO1xuIiwidmFyIGZsYXR0ZW4gPSByZXF1aXJlKCcuL2ZsYXR0ZW4nKSxcbiAgICBvdmVyUmVzdCA9IHJlcXVpcmUoJy4vX292ZXJSZXN0JyksXG4gICAgc2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19zZXRUb1N0cmluZycpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIGZsYXR0ZW5zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHVuZGVmaW5lZCwgZmxhdHRlbiksIGZ1bmMgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdFJlc3Q7XG4iLCIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG4iLCJ2YXIgYmFzZUdldEFsbEtleXMgPSByZXF1aXJlKCcuL19iYXNlR2V0QWxsS2V5cycpLFxuICAgIGdldFN5bWJvbHMgPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7XG4gIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXMsIGdldFN5bWJvbHMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEFsbEtleXM7XG4iLCJ2YXIgYmFzZUdldEFsbEtleXMgPSByZXF1aXJlKCcuL19iYXNlR2V0QWxsS2V5cycpLFxuICAgIGdldFN5bWJvbHNJbiA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHNJbicpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCkge1xuICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzSW4sIGdldFN5bWJvbHNJbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QWxsS2V5c0luO1xuIiwidmFyIGlzS2V5YWJsZSA9IHJlcXVpcmUoJy4vX2lzS2V5YWJsZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hcCBkYXRhLlxuICovXG5mdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XG4gIHZhciBkYXRhID0gbWFwLl9fZGF0YV9fO1xuICByZXR1cm4gaXNLZXlhYmxlKGtleSlcbiAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXVxuICAgIDogZGF0YS5tYXA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TWFwRGF0YTtcbiIsInZhciBpc1N0cmljdENvbXBhcmFibGUgPSByZXF1aXJlKCcuL19pc1N0cmljdENvbXBhcmFibGUnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3Mgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBvZiBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sXG4gICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICByZXN1bHRbbGVuZ3RoXSA9IFtrZXksIHZhbHVlLCBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE1hdGNoRGF0YTtcbiIsInZhciBiYXNlSXNOYXRpdmUgPSByZXF1aXJlKCcuL19iYXNlSXNOYXRpdmUnKSxcbiAgICBnZXRWYWx1ZSA9IHJlcXVpcmUoJy4vX2dldFZhbHVlJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TmF0aXZlO1xuIiwidmFyIG92ZXJBcmcgPSByZXF1aXJlKCcuL19vdmVyQXJnJyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFByb3RvdHlwZTtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFJhd1RhZztcbiIsInZhciBhcnJheUZpbHRlciA9IHJlcXVpcmUoJy4vX2FycmF5RmlsdGVyJyksXG4gICAgc3R1YkFycmF5ID0gcmVxdWlyZSgnLi9zdHViQXJyYXknKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy5cbiAqL1xudmFyIGdldFN5bWJvbHMgPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gIHJldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksIGZ1bmN0aW9uKHN5bWJvbCkge1xuICAgIHJldHVybiBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgc3ltYm9sKTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFN5bWJvbHM7XG4iLCJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgZ2V0U3ltYm9scyA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHMnKSxcbiAgICBzdHViQXJyYXkgPSByZXF1aXJlKCcuL3N0dWJBcnJheScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gKi9cbnZhciBnZXRTeW1ib2xzSW4gPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHdoaWxlIChvYmplY3QpIHtcbiAgICBhcnJheVB1c2gocmVzdWx0LCBnZXRTeW1ib2xzKG9iamVjdCkpO1xuICAgIG9iamVjdCA9IGdldFByb3RvdHlwZShvYmplY3QpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFN5bWJvbHNJbjtcbiIsInZhciBEYXRhVmlldyA9IHJlcXVpcmUoJy4vX0RhdGFWaWV3JyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyksXG4gICAgUHJvbWlzZSA9IHJlcXVpcmUoJy4vX1Byb21pc2UnKSxcbiAgICBTZXQgPSByZXF1aXJlKCcuL19TZXQnKSxcbiAgICBXZWFrTWFwID0gcmVxdWlyZSgnLi9fV2Vha01hcCcpLFxuICAgIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgdG9Tb3VyY2UgPSByZXF1aXJlKCcuL190b1NvdXJjZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcHJvbWlzZVRhZyA9ICdbb2JqZWN0IFByb21pc2VdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWFwcywgc2V0cywgYW5kIHdlYWttYXBzLiAqL1xudmFyIGRhdGFWaWV3Q3RvclN0cmluZyA9IHRvU291cmNlKERhdGFWaWV3KSxcbiAgICBtYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoTWFwKSxcbiAgICBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UpLFxuICAgIHNldEN0b3JTdHJpbmcgPSB0b1NvdXJjZShTZXQpLFxuICAgIHdlYWtNYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoV2Vha01hcCk7XG5cbi8qKlxuICogR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbnZhciBnZXRUYWcgPSBiYXNlR2V0VGFnO1xuXG4vLyBGYWxsYmFjayBmb3IgZGF0YSB2aWV3cywgbWFwcywgc2V0cywgYW5kIHdlYWsgbWFwcyBpbiBJRSAxMSBhbmQgcHJvbWlzZXMgaW4gTm9kZS5qcyA8IDYuXG5pZiAoKERhdGFWaWV3ICYmIGdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcpIHx8XG4gICAgKE1hcCAmJiBnZXRUYWcobmV3IE1hcCkgIT0gbWFwVGFnKSB8fFxuICAgIChQcm9taXNlICYmIGdldFRhZyhQcm9taXNlLnJlc29sdmUoKSkgIT0gcHJvbWlzZVRhZykgfHxcbiAgICAoU2V0ICYmIGdldFRhZyhuZXcgU2V0KSAhPSBzZXRUYWcpIHx8XG4gICAgKFdlYWtNYXAgJiYgZ2V0VGFnKG5ldyBXZWFrTWFwKSAhPSB3ZWFrTWFwVGFnKSkge1xuICBnZXRUYWcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciByZXN1bHQgPSBiYXNlR2V0VGFnKHZhbHVlKSxcbiAgICAgICAgQ3RvciA9IHJlc3VsdCA9PSBvYmplY3RUYWcgPyB2YWx1ZS5jb25zdHJ1Y3RvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgY3RvclN0cmluZyA9IEN0b3IgPyB0b1NvdXJjZShDdG9yKSA6ICcnO1xuXG4gICAgaWYgKGN0b3JTdHJpbmcpIHtcbiAgICAgIHN3aXRjaCAoY3RvclN0cmluZykge1xuICAgICAgICBjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzogcmV0dXJuIGRhdGFWaWV3VGFnO1xuICAgICAgICBjYXNlIG1hcEN0b3JTdHJpbmc6IHJldHVybiBtYXBUYWc7XG4gICAgICAgIGNhc2UgcHJvbWlzZUN0b3JTdHJpbmc6IHJldHVybiBwcm9taXNlVGFnO1xuICAgICAgICBjYXNlIHNldEN0b3JTdHJpbmc6IHJldHVybiBzZXRUYWc7XG4gICAgICAgIGNhc2Ugd2Vha01hcEN0b3JTdHJpbmc6IHJldHVybiB3ZWFrTWFwVGFnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFRhZztcbiIsIi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFZhbHVlO1xuIiwidmFyIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBleGlzdHMgb24gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBmYWxzZTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSk7XG4gICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gIH1cbiAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGlzTGVuZ3RoKGxlbmd0aCkgJiYgaXNJbmRleChrZXksIGxlbmd0aCkgJiZcbiAgICAoaXNBcnJheShvYmplY3QpIHx8IGlzQXJndW1lbnRzKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1BhdGg7XG4iLCIvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG52YXIgcnNBc3RyYWxSYW5nZSA9ICdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxcbiAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2FwdHVyZSBncm91cHMuICovXG52YXIgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3Mgd2l0aCBbemVyby13aWR0aCBqb2luZXJzIG9yIGNvZGUgcG9pbnRzIGZyb20gdGhlIGFzdHJhbCBwbGFuZXNdKGh0dHA6Ly9lZXYuZWUvYmxvZy8yMDE1LzA5LzEyL2RhcmstY29ybmVycy1vZi11bmljb2RlLykuICovXG52YXIgcmVIYXNVbmljb2RlID0gUmVnRXhwKCdbJyArIHJzWldKICsgcnNBc3RyYWxSYW5nZSAgKyByc0NvbWJvUmFuZ2UgKyByc1ZhclJhbmdlICsgJ10nKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHN5bWJvbCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykge1xuICByZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNVbmljb2RlO1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgSGFzaFxuICovXG5mdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoQ2xlYXI7XG4iLCIvKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge09iamVjdH0gaGFzaCBUaGUgaGFzaCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTtcbiAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hEZWxldGU7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoR2V0O1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaEhhcztcbiIsInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIFNldHMgdGhlIGhhc2ggYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBoYXNoU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICB0aGlzLnNpemUgKz0gdGhpcy5oYXMoa2V5KSA/IDAgOiAxO1xuICBkYXRhW2tleV0gPSAobmF0aXZlQ3JlYXRlICYmIHZhbHVlID09PSB1bmRlZmluZWQpID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaFNldDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBuZXcgYXJyYXkuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAvLyBBZGQgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgLlxuICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAnc3RyaW5nJyAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCAnaW5kZXgnKSkge1xuICAgIHJlc3VsdC5pbmRleCA9IGFycmF5LmluZGV4O1xuICAgIHJlc3VsdC5pbnB1dCA9IGFycmF5LmlucHV0O1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lQXJyYXk7XG4iLCJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKSxcbiAgICBjbG9uZURhdGFWaWV3ID0gcmVxdWlyZSgnLi9fY2xvbmVEYXRhVmlldycpLFxuICAgIGNsb25lUmVnRXhwID0gcmVxdWlyZSgnLi9fY2xvbmVSZWdFeHAnKSxcbiAgICBjbG9uZVN5bWJvbCA9IHJlcXVpcmUoJy4vX2Nsb25lU3ltYm9sJyksXG4gICAgY2xvbmVUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fY2xvbmVUeXBlZEFycmF5Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNsb25pbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBNYXBgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIGBTZXRgLCBvciBgU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICovXG5mdW5jdGlvbiBpbml0Q2xvbmVCeVRhZyhvYmplY3QsIHRhZywgaXNEZWVwKSB7XG4gIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO1xuXG4gICAgY2FzZSBib29sVGFnOlxuICAgIGNhc2UgZGF0ZVRhZzpcbiAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtcblxuICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICByZXR1cm4gY2xvbmVEYXRhVmlldyhvYmplY3QsIGlzRGVlcCk7XG5cbiAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzpcbiAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgY2FzZSB1aW50OFRhZzogY2FzZSB1aW50OENsYW1wZWRUYWc6IGNhc2UgdWludDE2VGFnOiBjYXNlIHVpbnQzMlRhZzpcbiAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgY2FzZSBtYXBUYWc6XG4gICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICBjYXNlIG51bWJlclRhZzpcbiAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgIHJldHVybiBuZXcgQ3RvcihvYmplY3QpO1xuXG4gICAgY2FzZSByZWdleHBUYWc6XG4gICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTtcblxuICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICByZXR1cm4gY2xvbmVTeW1ib2wob2JqZWN0KTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRDbG9uZUJ5VGFnO1xuIiwidmFyIGJhc2VDcmVhdGUgPSByZXF1aXJlKCcuL19iYXNlQ3JlYXRlJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2Ygb2JqZWN0LmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgIWlzUHJvdG90eXBlKG9iamVjdCkpXG4gICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgIDoge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lT2JqZWN0O1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ByZWFkYWJsZVN5bWJvbCA9IFN5bWJvbCA/IFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGUgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmbGF0dGVuYWJsZSBgYXJndW1lbnRzYCBvYmplY3Qgb3IgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZmxhdHRlbmFibGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNGbGF0dGVuYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpIHx8XG4gICAgISEoc3ByZWFkYWJsZVN5bWJvbCAmJiB2YWx1ZSAmJiB2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGbGF0dGVuYWJsZTtcbiIsIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG52YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuXG4gIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICh0eXBlID09ICdudW1iZXInIHx8XG4gICAgICAodHlwZSAhPSAnc3ltYm9sJyAmJiByZUlzVWludC50ZXN0KHZhbHVlKSkpICYmXG4gICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0luZGV4O1xuIiwidmFyIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIHZhbHVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgPyAoaXNBcnJheUxpa2Uob2JqZWN0KSAmJiBpc0luZGV4KGluZGV4LCBvYmplY3QubGVuZ3RoKSlcbiAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICApIHtcbiAgICByZXR1cm4gZXEob2JqZWN0W2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0l0ZXJhdGVlQ2FsbDtcbiIsInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgIHJlSXNQbGFpblByb3AgPSAvXlxcdyokLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleSh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgdmFsdWUgPT0gbnVsbCB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcmVJc1BsYWluUHJvcC50ZXN0KHZhbHVlKSB8fCAhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpIHx8XG4gICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyB1bmlxdWUgb2JqZWN0IGtleS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleWFibGUodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgPyAodmFsdWUgIT09ICdfX3Byb3RvX18nKVxuICAgIDogKHZhbHVlID09PSBudWxsKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleWFibGU7XG4iLCJ2YXIgY29yZUpzRGF0YSA9IHJlcXVpcmUoJy4vX2NvcmVKc0RhdGEnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbnZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG59KCkpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcbiAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc01hc2tlZDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1Byb3RvdHlwZTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlmIHN1aXRhYmxlIGZvciBzdHJpY3RcbiAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAhaXNPYmplY3QodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3RyaWN0Q29tcGFyYWJsZTtcbiIsIi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVDbGVhcjtcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICBpZiAoaW5kZXggPT0gbGFzdEluZGV4KSB7XG4gICAgZGF0YS5wb3AoKTtcbiAgfSBlbHNlIHtcbiAgICBzcGxpY2UuY2FsbChkYXRhLCBpbmRleCwgMSk7XG4gIH1cbiAgLS10aGlzLnNpemU7XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZURlbGV0ZTtcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVHZXQ7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXywga2V5KSA+IC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUhhcztcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICArK3RoaXMuc2l6ZTtcbiAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZVNldDtcbiIsInZhciBIYXNoID0gcmVxdWlyZSgnLi9fSGFzaCcpLFxuICAgIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkge1xuICB0aGlzLnNpemUgPSAwO1xuICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICdoYXNoJzogbmV3IEhhc2gsXG4gICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgJ3N0cmluZyc6IG5ldyBIYXNoXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVDbGVhcjtcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZURlbGV0ZTtcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVHZXQ7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBtYXAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUhhcztcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVTZXQ7XG4iLCIvKipcbiAqIENvbnZlcnRzIGBtYXBgIHRvIGl0cyBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gKi9cbmZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobWFwLnNpemUpO1xuXG4gIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcFRvQXJyYXk7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgbWF0Y2hlc1Byb3BlcnR5YCBmb3Igc291cmNlIHZhbHVlcyBzdWl0YWJsZVxuICogZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKGtleSwgc3JjVmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHNyY1ZhbHVlICYmXG4gICAgICAoc3JjVmFsdWUgIT09IHVuZGVmaW5lZCB8fCAoa2V5IGluIE9iamVjdChvYmplY3QpKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWF0Y2hlc1N0cmljdENvbXBhcmFibGU7XG4iLCJ2YXIgbWVtb2l6ZSA9IHJlcXVpcmUoJy4vbWVtb2l6ZScpO1xuXG4vKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG52YXIgTUFYX01FTU9JWkVfU0laRSA9IDUwMDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gKiBjYWNoZSB3aGVuIGl0IGV4Y2VlZHMgYE1BWF9NRU1PSVpFX1NJWkVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZUNhcHBlZChmdW5jKSB7XG4gIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkge1xuICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG4gICAgICBjYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9KTtcblxuICB2YXIgY2FjaGUgPSByZXN1bHQuY2FjaGU7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWVtb2l6ZUNhcHBlZDtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVDcmVhdGU7XG4iLCJ2YXIgb3ZlckFyZyA9IHJlcXVpcmUoJy4vX292ZXJBcmcnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUtleXM7XG4iLCIvKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZVxuICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChvYmplY3QgIT0gbnVsbCkge1xuICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVLZXlzSW47XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4vKiogVXNlZCB0byBhY2Nlc3MgZmFzdGVyIE5vZGUuanMgaGVscGVycy4gKi9cbnZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICAvLyBVc2UgYHV0aWwudHlwZXNgIGZvciBOb2RlLmpzIDEwKy5cbiAgICB2YXIgdHlwZXMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUucmVxdWlyZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUoJ3V0aWwnKS50eXBlcztcblxuICAgIGlmICh0eXBlcykge1xuICAgICAgcmV0dXJuIHR5cGVzO1xuICAgIH1cblxuICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcgJiYgZnJlZVByb2Nlc3MuYmluZGluZygndXRpbCcpO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBub2RlVXRpbDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9iamVjdFRvU3RyaW5nO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlckFyZztcbiIsInZhciBhcHBseSA9IHJlcXVpcmUoJy4vX2FwcGx5Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSByZXN0IGFycmF5IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyUmVzdChmdW5jLCBzdGFydCwgdHJhbnNmb3JtKSB7XG4gIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgIGFycmF5ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgIH1cbiAgICBpbmRleCA9IC0xO1xuICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgIHdoaWxlICgrK2luZGV4IDwgc3RhcnQpIHtcbiAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICB9XG4gICAgb3RoZXJBcmdzW3N0YXJ0XSA9IHRyYW5zZm9ybShhcnJheSk7XG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlclJlc3Q7XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG4iLCIvKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgLCB1bmxlc3MgYGtleWAgaXMgXCJfX3Byb3RvX19cIiBvciBcImNvbnN0cnVjdG9yXCIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBzYWZlR2V0KG9iamVjdCwga2V5KSB7XG4gIGlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicgJiYgdHlwZW9mIG9iamVjdFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGtleSA9PSAnX19wcm90b19fJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiBvYmplY3Rba2V5XTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzYWZlR2V0O1xuIiwiLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGFkZFxuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAYWxpYXMgcHVzaFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0Q2FjaGVBZGQ7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldENhY2hlSGFzO1xuIiwiLyoqXG4gKiBDb252ZXJ0cyBgc2V0YCB0byBhbiBhcnJheSBvZiBpdHMgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBzZXRUb0FycmF5KHNldCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUb0FycmF5O1xuIiwidmFyIGJhc2VTZXRUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VTZXRUb1N0cmluZycpLFxuICAgIHNob3J0T3V0ID0gcmVxdWlyZSgnLi9fc2hvcnRPdXQnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgZnVuY2AgdG8gcmV0dXJuIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIHNldFRvU3RyaW5nID0gc2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUb1N0cmluZztcbiIsIi8qKiBVc2VkIHRvIGRldGVjdCBob3QgZnVuY3Rpb25zIGJ5IG51bWJlciBvZiBjYWxscyB3aXRoaW4gYSBzcGFuIG9mIG1pbGxpc2Vjb25kcy4gKi9cbnZhciBIT1RfQ09VTlQgPSA4MDAsXG4gICAgSE9UX1NQQU4gPSAxNjtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU5vdyA9IERhdGUubm93O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0J2xsIHNob3J0IG91dCBhbmQgaW52b2tlIGBpZGVudGl0eWAgaW5zdGVhZFxuICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gXG4gKiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc2hvcnRhYmxlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7XG4gIHZhciBjb3VudCA9IDAsXG4gICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0YW1wID0gbmF0aXZlTm93KCksXG4gICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7XG5cbiAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgIGlmICgrK2NvdW50ID49IEhPVF9DT1VOVCkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb3VudCA9IDA7XG4gICAgfVxuICAgIHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG9ydE91dDtcbiIsInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBzdGFjay5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBTdGFja1xuICovXG5mdW5jdGlvbiBzdGFja0NsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0NsZWFyO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIHJlc3VsdCA9IGRhdGFbJ2RlbGV0ZSddKGtleSk7XG5cbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrRGVsZXRlO1xuIiwiLyoqXG4gKiBHZXRzIHRoZSBzdGFjayB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tHZXQoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmdldChrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrR2V0O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYSBzdGFjayB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0hhcztcbiIsInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBNYXAgPSByZXF1aXJlKCcuL19NYXAnKSxcbiAgICBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyk7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgc3RhY2sgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSkge1xuICAgIHZhciBwYWlycyA9IGRhdGEuX19kYXRhX187XG4gICAgaWYgKCFNYXAgfHwgKHBhaXJzLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSkge1xuICAgICAgcGFpcnMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgdGhpcy5zaXplID0gKytkYXRhLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xuICB9XG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrU2V0O1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmljdEluZGV4T2Y7XG4iLCJ2YXIgYXNjaWlTaXplID0gcmVxdWlyZSgnLi9fYXNjaWlTaXplJyksXG4gICAgaGFzVW5pY29kZSA9IHJlcXVpcmUoJy4vX2hhc1VuaWNvZGUnKSxcbiAgICB1bmljb2RlU2l6ZSA9IHJlcXVpcmUoJy4vX3VuaWNvZGVTaXplJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKSB7XG4gIHJldHVybiBoYXNVbmljb2RlKHN0cmluZylcbiAgICA/IHVuaWNvZGVTaXplKHN0cmluZylcbiAgICA6IGFzY2lpU2l6ZShzdHJpbmcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ1NpemU7XG4iLCJ2YXIgbWVtb2l6ZUNhcHBlZCA9IHJlcXVpcmUoJy4vX21lbW9pemVDYXBwZWQnKTtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlUHJvcE5hbWUgPSAvW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2c7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBtZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgfVxuICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ1RvUGF0aDtcbiIsInZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGtleSBpZiBpdCdzIG5vdCBhIHN0cmluZyBvciBzeW1ib2wuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICovXG5mdW5jdGlvbiB0b0tleSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9LZXk7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9Tb3VyY2U7XG4iLCIvKiogVXNlZCB0byBtYXRjaCBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4gKi9cbnZhciByZVdoaXRlc3BhY2UgPSAvXFxzLztcblxuLyoqXG4gKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlXG4gKiBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLlxuICovXG5mdW5jdGlvbiB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSB7XG4gIHZhciBpbmRleCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgd2hpbGUgKGluZGV4LS0gJiYgcmVXaGl0ZXNwYWNlLnRlc3Qoc3RyaW5nLmNoYXJBdChpbmRleCkpKSB7fVxuICByZXR1cm4gaW5kZXg7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdHJpbW1lZEVuZEluZGV4O1xuIiwiLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL1xudmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgcmVDb21ib0hhbGZNYXJrc1JhbmdlID0gJ1xcXFx1ZmUyMC1cXFxcdWZlMmYnLFxuICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xudmFyIHJzQXN0cmFsID0gJ1snICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc0NvbWJvID0gJ1snICsgcnNDb21ib1JhbmdlICsgJ10nLFxuICAgIHJzRml0eiA9ICdcXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0nLFxuICAgIHJzTW9kaWZpZXIgPSAnKD86JyArIHJzQ29tYm8gKyAnfCcgKyByc0ZpdHogKyAnKScsXG4gICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc1JlZ2lvbmFsID0gJyg/OlxcXFx1ZDgzY1tcXFxcdWRkZTYtXFxcXHVkZGZmXSl7Mn0nLFxuICAgIHJzU3VyclBhaXIgPSAnW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdJyxcbiAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbnZhciByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICByc09wdEpvaW4gPSAnKD86JyArIHJzWldKICsgJyg/OicgKyBbcnNOb25Bc3RyYWwsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzT3B0VmFyICsgcmVPcHRNb2QgKyAnKSonLFxuICAgIHJzU2VxID0gcnNPcHRWYXIgKyByZU9wdE1vZCArIHJzT3B0Sm9pbixcbiAgICByc1N5bWJvbCA9ICcoPzonICsgW3JzTm9uQXN0cmFsICsgcnNDb21ibyArICc/JywgcnNDb21ibywgcnNSZWdpb25hbCwgcnNTdXJyUGFpciwgcnNBc3RyYWxdLmpvaW4oJ3wnKSArICcpJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbnZhciByZVVuaWNvZGUgPSBSZWdFeHAocnNGaXR6ICsgJyg/PScgKyByc0ZpdHogKyAnKXwnICsgcnNTeW1ib2wgKyByc1NlcSwgJ2cnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBzaXplIG9mIGEgVW5pY29kZSBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xuZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKSB7XG4gIHZhciByZXN1bHQgPSByZVVuaWNvZGUubGFzdEluZGV4ID0gMDtcbiAgd2hpbGUgKHJlVW5pY29kZS50ZXN0KHN0cmluZykpIHtcbiAgICArK3Jlc3VsdDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVuaWNvZGVTaXplO1xuIiwidmFyIGJhc2VDbG9uZSA9IHJlcXVpcmUoJy4vX2Jhc2VDbG9uZScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYHZhbHVlYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGVcbiAqIFtzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobV0oaHR0cHM6Ly9tZG4uaW8vU3RydWN0dXJlZF9jbG9uZV9hbGdvcml0aG0pXG4gKiBhbmQgc3VwcG9ydHMgY2xvbmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLCBkYXRlIG9iamVjdHMsIG1hcHMsXG4gKiBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLCBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWRcbiAqIGFycmF5cy4gVGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYGFyZ3VtZW50c2Agb2JqZWN0cyBhcmUgY2xvbmVkXG4gKiBhcyBwbGFpbiBvYmplY3RzLiBBbiBlbXB0eSBvYmplY3QgaXMgcmV0dXJuZWQgZm9yIHVuY2xvbmVhYmxlIHZhbHVlcyBzdWNoXG4gKiBhcyBlcnJvciBvYmplY3RzLCBmdW5jdGlvbnMsIERPTSBub2RlcywgYW5kIFdlYWtNYXBzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gKiBAc2VlIF8uY2xvbmVEZWVwXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICpcbiAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShvYmplY3RzKTtcbiAqIGNvbnNvbGUubG9nKHNoYWxsb3dbMF0gPT09IG9iamVjdHNbMF0pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBjbG9uZSh2YWx1ZSkge1xuICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9TWU1CT0xTX0ZMQUcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lO1xuIiwidmFyIGJhc2VDbG9uZSA9IHJlcXVpcmUoJy4vX2Jhc2VDbG9uZScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX0RFRVBfRkxBRyA9IDEsXG4gICAgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZGVlcCBjbG9uZWQgdmFsdWUuXG4gKiBAc2VlIF8uY2xvbmVcbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbeyAnYSc6IDEgfSwgeyAnYic6IDIgfV07XG4gKlxuICogdmFyIGRlZXAgPSBfLmNsb25lRGVlcChvYmplY3RzKTtcbiAqIGNvbnNvbGUubG9nKGRlZXBbMF0gPT09IG9iamVjdHNbMF0pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlKSB7XG4gIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVEZWVwO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29uc3RhbnQ7XG4iLCJ2YXIgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEFzc2lnbnMgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2VcbiAqIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXMgdGhhdFxuICogcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICogT25jZSBhIHByb3BlcnR5IGlzIHNldCwgYWRkaXRpb25hbCB2YWx1ZXMgb2YgdGhlIHNhbWUgcHJvcGVydHkgYXJlIGlnbm9yZWQuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQHNlZSBfLmRlZmF1bHRzRGVlcFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gKi9cbnZhciBkZWZhdWx0cyA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMTtcbiAgdmFyIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoO1xuICB2YXIgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgbGVuZ3RoID0gMTtcbiAgfVxuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgIHZhciBwcm9wcyA9IGtleXNJbihzb3VyY2UpO1xuICAgIHZhciBwcm9wc0luZGV4ID0gLTE7XG4gICAgdmFyIHByb3BzTGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsrcHJvcHNJbmRleCA8IHByb3BzTGVuZ3RoKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcHNbcHJvcHNJbmRleF07XG4gICAgICB2YXIgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAoZXEodmFsdWUsIG9iamVjdFByb3RvW2tleV0pICYmICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpIHtcbiAgICAgICAgb2JqZWN0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmYXVsdHM7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZm9yRWFjaCcpO1xuIiwiLyoqXG4gKiBQZXJmb3JtcyBhXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICpcbiAqIF8uZXEob2JqZWN0LCBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoJ2EnLCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEoJ2EnLCBPYmplY3QoJ2EnKSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoTmFOLCBOYU4pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXE7XG4iLCJ2YXIgYXJyYXlGaWx0ZXIgPSByZXF1aXJlKCcuL19hcnJheUZpbHRlcicpLFxuICAgIGJhc2VGaWx0ZXIgPSByZXF1aXJlKCcuL19iYXNlRmlsdGVyJyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgYWxsIGVsZW1lbnRzXG4gKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiAqKk5vdGU6KiogVW5saWtlIGBfLnJlbW92ZWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICogQHNlZSBfLnJlamVjdFxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAqIF07XG4gKlxuICogXy5maWx0ZXIodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbHRlcih1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmlsdGVyKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maWx0ZXIodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAqXG4gKiAvLyBDb21iaW5pbmcgc2V2ZXJhbCBwcmVkaWNhdGVzIHVzaW5nIGBfLm92ZXJFdmVyeWAgb3IgYF8ub3ZlclNvbWVgLlxuICogXy5maWx0ZXIodXNlcnMsIF8ub3ZlclNvbWUoW3sgJ2FnZSc6IDM2IH0sIFsnYWdlJywgNDBdXSkpO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ2Jhcm5leSddXG4gKi9cbmZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmlsdGVyO1xuIiwidmFyIGNyZWF0ZUZpbmQgPSByZXF1aXJlKCcuL19jcmVhdGVGaW5kJyksXG4gICAgZmluZEluZGV4ID0gcmVxdWlyZSgnLi9maW5kSW5kZXgnKTtcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIHRoZSBmaXJzdCBlbGVtZW50XG4gKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAqIF07XG4gKlxuICogXy5maW5kKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAqIC8vID0+IG9iamVjdCBmb3IgJ3BlYmJsZXMnXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiBvYmplY3QgZm9yICdmcmVkJ1xuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kKHVzZXJzLCAnYWN0aXZlJyk7XG4gKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknXG4gKi9cbnZhciBmaW5kID0gY3JlYXRlRmluZChmaW5kSW5kZXgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbmQ7XG4iLCJ2YXIgYmFzZUZpbmRJbmRleCA9IHJlcXVpcmUoJy4vX2Jhc2VGaW5kSW5kZXgnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICB0b0ludGVnZXIgPSByZXF1aXJlKCcuL3RvSW50ZWdlcicpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3RcbiAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMS4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICogXTtcbiAqXG4gKiBfLmZpbmRJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdiYXJuZXknOyB9KTtcbiAqIC8vID0+IDBcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kSW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnZnJlZCcsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAqIC8vID0+IDFcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmRJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICogLy8gPT4gMFxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kSW5kZXgodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+IDJcbiAqL1xuZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgaW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApO1xuICB9XG4gIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbmRJbmRleDtcbiIsInZhciBiYXNlRmxhdHRlbiA9IHJlcXVpcmUoJy4vX2Jhc2VGbGF0dGVuJyk7XG5cbi8qKlxuICogRmxhdHRlbnMgYGFycmF5YCBhIHNpbmdsZSBsZXZlbCBkZWVwLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZmxhdHRlbihbMSwgWzIsIFszLCBbNF1dLCA1XV0pO1xuICogLy8gPT4gWzEsIDIsIFszLCBbNF1dLCA1XVxuICovXG5mdW5jdGlvbiBmbGF0dGVuKGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCAxKSA6IFtdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZsYXR0ZW47XG4iLCJ2YXIgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYmFzZUVhY2ggPSByZXF1aXJlKCcuL19iYXNlRWFjaCcpLFxuICAgIGNhc3RGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2Nhc3RGdW5jdGlvbicpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqICoqTm90ZToqKiBBcyB3aXRoIG90aGVyIFwiQ29sbGVjdGlvbnNcIiBtZXRob2RzLCBvYmplY3RzIHdpdGggYSBcImxlbmd0aFwiXG4gKiBwcm9wZXJ0eSBhcmUgaXRlcmF0ZWQgbGlrZSBhcnJheXMuIFRvIGF2b2lkIHRoaXMgYmVoYXZpb3IgdXNlIGBfLmZvckluYFxuICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAYWxpYXMgZWFjaFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gKiBAc2VlIF8uZm9yRWFjaFJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZm9yRWFjaChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gKiAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAqIH0pO1xuICogLy8gPT4gTG9ncyBgMWAgdGhlbiBgMmAuXG4gKlxuICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICogICBjb25zb2xlLmxvZyhrZXkpO1xuICogfSk7XG4gKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2ggOiBiYXNlRWFjaDtcbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgY2FzdEZ1bmN0aW9uKGl0ZXJhdGVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZm9yRWFjaDtcbiIsInZhciBiYXNlRm9yID0gcmVxdWlyZSgnLi9fYmFzZUZvcicpLFxuICAgIGNhc3RGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2Nhc3RGdW5jdGlvbicpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuXG4gKiBvYmplY3QgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0XG4gKiBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQHNlZSBfLmZvckluUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5mb3JJbihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gKiB9KTtcbiAqIC8vID0+IExvZ3MgJ2EnLCAnYicsIHRoZW4gJ2MnIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICovXG5mdW5jdGlvbiBmb3JJbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbFxuICAgID8gb2JqZWN0XG4gICAgOiBiYXNlRm9yKG9iamVjdCwgY2FzdEZ1bmN0aW9uKGl0ZXJhdGVlKSwga2V5c0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmb3JJbjtcbiIsInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpO1xuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzXG4gKiBgdW5kZWZpbmVkYCwgdGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGluIGl0cyBwbGFjZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuNy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAqXG4gKiBfLmdldChvYmplY3QsICdhWzBdLmIuYycpO1xuICogLy8gPT4gM1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICogLy8gPT4gM1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgJ2EuYi5jJywgJ2RlZmF1bHQnKTtcbiAqIC8vID0+ICdkZWZhdWx0J1xuICovXG5mdW5jdGlvbiBnZXQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0O1xuIiwidmFyIGJhc2VIYXMgPSByZXF1aXJlKCcuL19iYXNlSGFzJyksXG4gICAgaGFzUGF0aCA9IHJlcXVpcmUoJy4vX2hhc1BhdGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiB7ICdiJzogMiB9IH07XG4gKiB2YXIgb3RoZXIgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gKlxuICogXy5oYXMob2JqZWN0LCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzKG9iamVjdCwgJ2EuYicpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzKG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXMob3RoZXIsICdhJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBoYXMob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzO1xuIiwidmFyIGJhc2VIYXNJbiA9IHJlcXVpcmUoJy4vX2Jhc2VIYXNJbicpLFxuICAgIGhhc1BhdGggPSByZXF1aXJlKCcuL19oYXNQYXRoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYS5iJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsIFsnYScsICdiJ10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYicpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaGFzSW4ob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNJbjtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKlxuICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHk7XG4iLCJ2YXIgYmFzZUlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9fYmFzZUlzQXJndW1lbnRzJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcmd1bWVudHM7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5O1xuIiwidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2U7XG4iLCJ2YXIgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gKiBpcyBhbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXlMaWtlT2JqZWN0O1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290JyksXG4gICAgc3R1YkZhbHNlID0gcmVxdWlyZSgnLi9zdHViRmFsc2UnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gcm9vdC5CdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBCdWZmZXIoMikpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IFVpbnQ4QXJyYXkoMikpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQnVmZmVyID0gbmF0aXZlSXNCdWZmZXIgfHwgc3R1YkZhbHNlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQnVmZmVyO1xuIiwidmFyIGJhc2VLZXlzID0gcmVxdWlyZSgnLi9fYmFzZUtleXMnKSxcbiAgICBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBlbXB0eSBvYmplY3QsIGNvbGxlY3Rpb24sIG1hcCwgb3Igc2V0LlxuICpcbiAqIE9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIG5vIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZFxuICogcHJvcGVydGllcy5cbiAqXG4gKiBBcnJheS1saWtlIHZhbHVlcyBzdWNoIGFzIGBhcmd1bWVudHNgIG9iamVjdHMsIGFycmF5cywgYnVmZmVycywgc3RyaW5ncywgb3JcbiAqIGpRdWVyeS1saWtlIGNvbGxlY3Rpb25zIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBsZW5ndGhgIG9mIGAwYC5cbiAqIFNpbWlsYXJseSwgbWFwcyBhbmQgc2V0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgc2l6ZWAgb2YgYDBgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGVtcHR5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNFbXB0eShudWxsKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRW1wdHkodHJ1ZSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0VtcHR5KDEpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFbXB0eShbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzRW1wdHkoeyAnYSc6IDEgfSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSAmJlxuICAgICAgKGlzQXJyYXkodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUuc3BsaWNlID09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgaXNCdWZmZXIodmFsdWUpIHx8IGlzVHlwZWRBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpKSkge1xuICAgIHJldHVybiAhdmFsdWUubGVuZ3RoO1xuICB9XG4gIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpO1xuICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgcmV0dXJuICF2YWx1ZS5zaXplO1xuICB9XG4gIGlmIChpc1Byb3RvdHlwZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gIWJhc2VLZXlzKHZhbHVlKS5sZW5ndGg7XG4gIH1cbiAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNFbXB0eTtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheXMgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRnVuY3Rpb247XG4iLCIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNMZW5ndGgoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNMZW5ndGg7XG4iLCJ2YXIgYmFzZUlzTWFwID0gcmVxdWlyZSgnLi9fYmFzZUlzTWFwJyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc01hcCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzTWFwO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTWFwYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc01hcChuZXcgTWFwKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTWFwKG5ldyBXZWFrTWFwKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc01hcCA9IG5vZGVJc01hcCA/IGJhc2VVbmFyeShub2RlSXNNYXApIDogYmFzZUlzTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTWFwO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3Q7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdExpa2U7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC44LjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqIH1cbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8IGJhc2VHZXRUYWcodmFsdWUpICE9IG9iamVjdFRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5LmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09IG9iamVjdEN0b3JTdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQbGFpbk9iamVjdDtcbiIsInZhciBiYXNlSXNTZXQgPSByZXF1aXJlKCcuL19iYXNlSXNTZXQnKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBub2RlVXRpbCA9IHJlcXVpcmUoJy4vX25vZGVVdGlsJyk7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzU2V0ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNTZXQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTZXRgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU2V0KG5ldyBTZXQpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTZXQobmV3IFdlYWtTZXQpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzU2V0ID0gbm9kZUlzU2V0ID8gYmFzZVVuYXJ5KG5vZGVJc1NldCkgOiBiYXNlSXNTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTZXQ7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3RyaW5nLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTdHJpbmcoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTdHJpbmcoMSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8XG4gICAgKCFpc0FycmF5KHZhbHVlKSAmJiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN0cmluZ1RhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTdHJpbmc7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTeW1ib2w7XG4iLCJ2YXIgYmFzZUlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vX2Jhc2VJc1R5cGVkQXJyYXknKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBub2RlVXRpbCA9IHJlcXVpcmUoJy4vX25vZGVVdGlsJyk7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzVHlwZWRBcnJheSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzVHlwZWRBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShuZXcgVWludDhBcnJheSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkoW10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzVHlwZWRBcnJheSA9IG5vZGVJc1R5cGVkQXJyYXkgPyBiYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSkgOiBiYXNlSXNUeXBlZEFycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVHlwZWRBcnJheTtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1VuZGVmaW5lZCh2b2lkIDApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNVbmRlZmluZWQobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1VuZGVmaW5lZDtcbiIsInZhciBhcnJheUxpa2VLZXlzID0gcmVxdWlyZSgnLi9fYXJyYXlMaWtlS2V5cycpLFxuICAgIGJhc2VLZXlzID0gcmVxdWlyZSgnLi9fYmFzZUtleXMnKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4gU2VlIHRoZVxuICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXMobmV3IEZvbyk7XG4gKiAvLyA9PiBbJ2EnLCAnYiddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy5rZXlzKCdoaScpO1xuICogLy8gPT4gWycwJywgJzEnXVxuICovXG5mdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0KSA6IGJhc2VLZXlzKG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ga2V5cztcbiIsInZhciBhcnJheUxpa2VLZXlzID0gcmVxdWlyZSgnLi9fYXJyYXlMaWtlS2V5cycpLFxuICAgIGJhc2VLZXlzSW4gPSByZXF1aXJlKCcuL19iYXNlS2V5c0luJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXNJbihuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNJbjtcbiIsIi8qKlxuICogR2V0cyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ubGFzdChbMSwgMiwgM10pO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuIGxlbmd0aCA/IGFycmF5W2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxhc3Q7XG4iLCJ2YXIgYXJyYXlNYXAgPSByZXF1aXJlKCcuL19hcnJheU1hcCcpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VNYXAgPSByZXF1aXJlKCcuL19iYXNlTWFwJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1XG4gKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiBNYW55IGxvZGFzaCBtZXRob2RzIGFyZSBndWFyZGVkIHRvIHdvcmsgYXMgaXRlcmF0ZWVzIGZvciBtZXRob2RzIGxpa2VcbiAqIGBfLmV2ZXJ5YCwgYF8uZmlsdGVyYCwgYF8ubWFwYCwgYF8ubWFwVmFsdWVzYCwgYF8ucmVqZWN0YCwgYW5kIGBfLnNvbWVgLlxuICpcbiAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICogYGFyeWAsIGBjaHVua2AsIGBjdXJyeWAsIGBjdXJyeVJpZ2h0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGV2ZXJ5YCxcbiAqIGBmaWxsYCwgYGludmVydGAsIGBwYXJzZUludGAsIGByYW5kb21gLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZXBlYXRgLFxuICogYHNhbXBsZVNpemVgLCBgc2xpY2VgLCBgc29tZWAsIGBzb3J0QnlgLCBgc3BsaXRgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLFxuICogYHRlbXBsYXRlYCwgYHRyaW1gLCBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBhbmQgYHdvcmRzYFxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAqICAgcmV0dXJuIG4gKiBuO1xuICogfVxuICpcbiAqIF8ubWFwKFs0LCA4XSwgc3F1YXJlKTtcbiAqIC8vID0+IFsxNiwgNjRdXG4gKlxuICogXy5tYXAoeyAnYSc6IDQsICdiJzogOCB9LCBzcXVhcmUpO1xuICogLy8gPT4gWzE2LCA2NF0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JyB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnIH1cbiAqIF07XG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLm1hcCh1c2VycywgJ3VzZXInKTtcbiAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICovXG5mdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlNYXAgOiBiYXNlTWFwO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXA7XG4iLCJ2YXIgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyksXG4gICAgYmFzZUZvck93biA9IHJlcXVpcmUoJy4vX2Jhc2VGb3JPd24nKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYXMgYG9iamVjdGAgYW5kIHZhbHVlcyBnZW5lcmF0ZWRcbiAqIGJ5IHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydVxuICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gKiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC5cbiAqIEBzZWUgXy5tYXBLZXlzXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IHtcbiAqICAgJ2ZyZWQnOiAgICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAqICAgJ3BlYmJsZXMnOiB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gKiB9O1xuICpcbiAqIF8ubWFwVmFsdWVzKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZTsgfSk7XG4gKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLm1hcFZhbHVlcyh1c2VycywgJ2FnZScpO1xuICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiBtYXBWYWx1ZXMob2JqZWN0LCBpdGVyYXRlZSkge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGl0ZXJhdGVlID0gYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCAzKTtcblxuICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwVmFsdWVzO1xuIiwidmFyIGJhc2VFeHRyZW11bSA9IHJlcXVpcmUoJy4vX2Jhc2VFeHRyZW11bScpLFxuICAgIGJhc2VHdCA9IHJlcXVpcmUoJy4vX2Jhc2VHdCcpLFxuICAgIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5tYXgoWzQsIDIsIDgsIDZdKTtcbiAqIC8vID0+IDhcbiAqXG4gKiBfLm1heChbXSk7XG4gKiAvLyA9PiB1bmRlZmluZWRcbiAqL1xuZnVuY3Rpb24gbWF4KGFycmF5KSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUd0KVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1heDtcbiIsInZhciBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyk7XG5cbi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbWVtb2l6ZXMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuIElmIGByZXNvbHZlcmAgaXNcbiAqIHByb3ZpZGVkLCBpdCBkZXRlcm1pbmVzIHRoZSBjYWNoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdCBiYXNlZCBvbiB0aGVcbiAqIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBhcmd1bWVudFxuICogcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIG1hcCBjYWNoZSBrZXkuIFRoZSBgZnVuY2BcbiAqIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIG1lbW9pemVkIGZ1bmN0aW9uLlxuICpcbiAqICoqTm90ZToqKiBUaGUgY2FjaGUgaXMgZXhwb3NlZCBhcyB0aGUgYGNhY2hlYCBwcm9wZXJ0eSBvbiB0aGUgbWVtb2l6ZWRcbiAqIGZ1bmN0aW9uLiBJdHMgY3JlYXRpb24gbWF5IGJlIGN1c3RvbWl6ZWQgYnkgcmVwbGFjaW5nIHRoZSBgXy5tZW1vaXplLkNhY2hlYFxuICogY29uc3RydWN0b3Igd2l0aCBvbmUgd2hvc2UgaW5zdGFuY2VzIGltcGxlbWVudCB0aGVcbiAqIFtgTWFwYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtbWFwLXByb3RvdHlwZS1vYmplY3QpXG4gKiBtZXRob2QgaW50ZXJmYWNlIG9mIGBjbGVhcmAsIGBkZWxldGVgLCBgZ2V0YCwgYGhhc2AsIGFuZCBgc2V0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXNvbHZlcl0gVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgdGhlIGNhY2hlIGtleS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICogdmFyIG90aGVyID0geyAnYyc6IDMsICdkJzogNCB9O1xuICpcbiAqIHZhciB2YWx1ZXMgPSBfLm1lbW9pemUoXy52YWx1ZXMpO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiB2YWx1ZXMob3RoZXIpO1xuICogLy8gPT4gWzMsIDRdXG4gKlxuICogb2JqZWN0LmEgPSAyO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiAvLyBNb2RpZnkgdGhlIHJlc3VsdCBjYWNoZS5cbiAqIHZhbHVlcy5jYWNoZS5zZXQob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWydhJywgJ2InXVxuICpcbiAqIC8vIFJlcGxhY2UgYF8ubWVtb2l6ZS5DYWNoZWAuXG4gKiBfLm1lbW9pemUuQ2FjaGUgPSBXZWFrTWFwO1xuICovXG5mdW5jdGlvbiBtZW1vaXplKGZ1bmMsIHJlc29sdmVyKSB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nIHx8IChyZXNvbHZlciAhPSBudWxsICYmIHR5cGVvZiByZXNvbHZlciAhPSAnZnVuY3Rpb24nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAga2V5ID0gcmVzb2x2ZXIgPyByZXNvbHZlci5hcHBseSh0aGlzLCBhcmdzKSA6IGFyZ3NbMF0sXG4gICAgICAgIGNhY2hlID0gbWVtb2l6ZWQuY2FjaGU7XG5cbiAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5KTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgbWVtb2l6ZWQuY2FjaGUgPSBjYWNoZS5zZXQoa2V5LCByZXN1bHQpIHx8IGNhY2hlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIG1lbW9pemVkLmNhY2hlID0gbmV3IChtZW1vaXplLkNhY2hlIHx8IE1hcENhY2hlKTtcbiAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG4vLyBFeHBvc2UgYE1hcENhY2hlYC5cbm1lbW9pemUuQ2FjaGUgPSBNYXBDYWNoZTtcblxubW9kdWxlLmV4cG9ydHMgPSBtZW1vaXplO1xuIiwidmFyIGJhc2VNZXJnZSA9IHJlcXVpcmUoJy4vX2Jhc2VNZXJnZScpLFxuICAgIGNyZWF0ZUFzc2lnbmVyID0gcmVxdWlyZSgnLi9fY3JlYXRlQXNzaWduZXInKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgbWVyZ2VzIG93biBhbmRcbiAqIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIGludG8gdGhlXG4gKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBhcmVcbiAqIHNraXBwZWQgaWYgYSBkZXN0aW5hdGlvbiB2YWx1ZSBleGlzdHMuIEFycmF5IGFuZCBwbGFpbiBvYmplY3QgcHJvcGVydGllc1xuICogYXJlIG1lcmdlZCByZWN1cnNpdmVseS4gT3RoZXIgb2JqZWN0cyBhbmQgdmFsdWUgdHlwZXMgYXJlIG92ZXJyaWRkZW4gYnlcbiAqIGFzc2lnbm1lbnQuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC4gU3Vic2VxdWVudFxuICogc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuNS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7XG4gKiAgICdhJzogW3sgJ2InOiAyIH0sIHsgJ2QnOiA0IH1dXG4gKiB9O1xuICpcbiAqIHZhciBvdGhlciA9IHtcbiAqICAgJ2EnOiBbeyAnYyc6IDMgfSwgeyAnZSc6IDUgfV1cbiAqIH07XG4gKlxuICogXy5tZXJnZShvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IDIsICdjJzogMyB9LCB7ICdkJzogNCwgJ2UnOiA1IH1dIH1cbiAqL1xudmFyIG1lcmdlID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KSB7XG4gIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbWVyZ2U7XG4iLCJ2YXIgYmFzZUV4dHJlbXVtID0gcmVxdWlyZSgnLi9fYmFzZUV4dHJlbXVtJyksXG4gICAgYmFzZUx0ID0gcmVxdWlyZSgnLi9fYmFzZUx0JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksXG4gKiBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTWF0aFxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLm1pbihbNCwgMiwgOCwgNl0pO1xuICogLy8gPT4gMlxuICpcbiAqIF8ubWluKFtdKTtcbiAqIC8vID0+IHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiBtaW4oYXJyYXkpIHtcbiAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGlkZW50aXR5LCBiYXNlTHQpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWluO1xuIiwidmFyIGJhc2VFeHRyZW11bSA9IHJlcXVpcmUoJy4vX2Jhc2VFeHRyZW11bScpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VMdCA9IHJlcXVpcmUoJy4vX2Jhc2VMdCcpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWluYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICpcbiAqIF8ubWluQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAqIC8vID0+IHsgJ24nOiAxIH1cbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8ubWluQnkob2JqZWN0cywgJ24nKTtcbiAqIC8vID0+IHsgJ24nOiAxIH1cbiAqL1xuZnVuY3Rpb24gbWluQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlTHQpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWluQnk7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLm5vb3ApO1xuICogLy8gPT4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICovXG5mdW5jdGlvbiBub29wKCkge1xuICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5vb3A7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBEYXRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAqIH0sIF8ubm93KCkpO1xuICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAqL1xudmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcm9vdC5EYXRlLm5vdygpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBub3c7XG4iLCJ2YXIgYmFzZVBpY2sgPSByZXF1aXJlKCcuL19iYXNlUGljaycpLFxuICAgIGZsYXRSZXN0ID0gcmVxdWlyZSgnLi9fZmxhdFJlc3QnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgcGlja2VkIGBvYmplY3RgIHByb3BlcnRpZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAqXG4gKiBfLnBpY2sob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICovXG52YXIgcGljayA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8ge30gOiBiYXNlUGljayhvYmplY3QsIHBhdGhzKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBpY2s7XG4iLCJ2YXIgYmFzZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fYmFzZVByb3BlcnR5JyksXG4gICAgYmFzZVByb3BlcnR5RGVlcCA9IHJlcXVpcmUoJy4vX2Jhc2VQcm9wZXJ0eURlZXAnKSxcbiAgICBpc0tleSA9IHJlcXVpcmUoJy4vX2lzS2V5JyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBhIGdpdmVuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IFtcbiAqICAgeyAnYSc6IHsgJ2InOiAyIH0gfSxcbiAqICAgeyAnYSc6IHsgJ2InOiAxIH0gfVxuICogXTtcbiAqXG4gKiBfLm1hcChvYmplY3RzLCBfLnByb3BlcnR5KCdhLmInKSk7XG4gKiAvLyA9PiBbMiwgMV1cbiAqXG4gKiBfLm1hcChfLnNvcnRCeShvYmplY3RzLCBfLnByb3BlcnR5KFsnYScsICdiJ10pKSwgJ2EuYicpO1xuICogLy8gPT4gWzEsIDJdXG4gKi9cbmZ1bmN0aW9uIHByb3BlcnR5KHBhdGgpIHtcbiAgcmV0dXJuIGlzS2V5KHBhdGgpID8gYmFzZVByb3BlcnR5KHRvS2V5KHBhdGgpKSA6IGJhc2VQcm9wZXJ0eURlZXAocGF0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcHJvcGVydHk7XG4iLCJ2YXIgY3JlYXRlUmFuZ2UgPSByZXF1aXJlKCcuL19jcmVhdGVSYW5nZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyAocG9zaXRpdmUgYW5kL29yIG5lZ2F0aXZlKSBwcm9ncmVzc2luZyBmcm9tXG4gKiBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIEEgc3RlcCBvZiBgLTFgIGlzIHVzZWQgaWYgYSBuZWdhdGl2ZVxuICogYHN0YXJ0YCBpcyBzcGVjaWZpZWQgd2l0aG91dCBhbiBgZW5kYCBvciBgc3RlcGAuIElmIGBlbmRgIGlzIG5vdCBzcGVjaWZpZWQsXG4gKiBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gKlxuICogKipOb3RlOioqIEphdmFTY3JpcHQgZm9sbG93cyB0aGUgSUVFRS03NTQgc3RhbmRhcmQgZm9yIHJlc29sdmluZ1xuICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAqIEBzZWUgXy5pblJhbmdlLCBfLnJhbmdlUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogXy5yYW5nZSg0KTtcbiAqIC8vID0+IFswLCAxLCAyLCAzXVxuICpcbiAqIF8ucmFuZ2UoLTQpO1xuICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdXG4gKlxuICogXy5yYW5nZSgxLCA1KTtcbiAqIC8vID0+IFsxLCAyLCAzLCA0XVxuICpcbiAqIF8ucmFuZ2UoMCwgMjAsIDUpO1xuICogLy8gPT4gWzAsIDUsIDEwLCAxNV1cbiAqXG4gKiBfLnJhbmdlKDAsIC00LCAtMSk7XG4gKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAqXG4gKiBfLnJhbmdlKDEsIDQsIDApO1xuICogLy8gPT4gWzEsIDEsIDFdXG4gKlxuICogXy5yYW5nZSgwKTtcbiAqIC8vID0+IFtdXG4gKi9cbnZhciByYW5nZSA9IGNyZWF0ZVJhbmdlKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmFuZ2U7XG4iLCJ2YXIgYXJyYXlSZWR1Y2UgPSByZXF1aXJlKCcuL19hcnJheVJlZHVjZScpLFxuICAgIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBiYXNlUmVkdWNlID0gcmVxdWlyZSgnLi9fYmFzZVJlZHVjZScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBSZWR1Y2VzIGBjb2xsZWN0aW9uYCB0byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZ1xuICogZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAsIHdoZXJlIGVhY2ggc3VjY2Vzc2l2ZVxuICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYFxuICogaXMgbm90IGdpdmVuLCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbFxuICogdmFsdWUuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6XG4gKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICpcbiAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC5cbiAqXG4gKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYG9yZGVyQnlgLFxuICogYW5kIGBzb3J0QnlgXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQHNlZSBfLnJlZHVjZVJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ucmVkdWNlKFsxLCAyXSwgZnVuY3Rpb24oc3VtLCBuKSB7XG4gKiAgIHJldHVybiBzdW0gKyBuO1xuICogfSwgMCk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICogICByZXR1cm4gcmVzdWx0O1xuICogfSwge30pO1xuICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlIDogYmFzZVJlZHVjZSxcbiAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWR1Y2U7XG4iLCJ2YXIgYmFzZUtleXMgPSByZXF1aXJlKCcuL19iYXNlS2V5cycpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzU3RyaW5nID0gcmVxdWlyZSgnLi9pc1N0cmluZycpLFxuICAgIHN0cmluZ1NpemUgPSByZXF1aXJlKCcuL19zdHJpbmdTaXplJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcblxuLyoqXG4gKiBHZXRzIHRoZSBzaXplIG9mIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgaXRzIGxlbmd0aCBmb3IgYXJyYXktbGlrZVxuICogdmFsdWVzIG9yIHRoZSBudW1iZXIgb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgZm9yIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBzaXplLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnNpemUoWzEsIDIsIDNdKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAqIC8vID0+IDJcbiAqXG4gKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAqIC8vID0+IDdcbiAqL1xuZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICByZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbikgPyBzdHJpbmdTaXplKGNvbGxlY3Rpb24pIDogY29sbGVjdGlvbi5sZW5ndGg7XG4gIH1cbiAgdmFyIHRhZyA9IGdldFRhZyhjb2xsZWN0aW9uKTtcbiAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgIHJldHVybiBjb2xsZWN0aW9uLnNpemU7XG4gIH1cbiAgcmV0dXJuIGJhc2VLZXlzKGNvbGxlY3Rpb24pLmxlbmd0aDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaXplO1xuIiwidmFyIGJhc2VGbGF0dGVuID0gcmVxdWlyZSgnLi9fYmFzZUZsYXR0ZW4nKSxcbiAgICBiYXNlT3JkZXJCeSA9IHJlcXVpcmUoJy4vX2Jhc2VPcmRlckJ5JyksXG4gICAgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mXG4gKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhydSBlYWNoIGl0ZXJhdGVlLiBUaGlzIG1ldGhvZFxuICogcGVyZm9ybXMgYSBzdGFibGUgc29ydCwgdGhhdCBpcywgaXQgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBzb3J0IG9yZGVyIG9mXG4gKiBlcXVhbCBlbGVtZW50cy4gVGhlIGl0ZXJhdGVlcyBhcmUgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiAzMCB9LFxuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9XG4gKiBdO1xuICpcbiAqIF8uc29ydEJ5KHVzZXJzLCBbZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyOyB9XSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNl0sIFsnYmFybmV5JywgMzRdLCBbJ2ZyZWQnLCA0OF0sIFsnZnJlZCcsIDMwXV1cbiAqXG4gKiBfLnNvcnRCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM0XSwgWydiYXJuZXknLCAzNl0sIFsnZnJlZCcsIDMwXSwgWydmcmVkJywgNDhdXVxuICovXG52YXIgc29ydEJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWVzKSB7XG4gIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIGxlbmd0aCA9IGl0ZXJhdGVlcy5sZW5ndGg7XG4gIGlmIChsZW5ndGggPiAxICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdKSkge1xuICAgIGl0ZXJhdGVlcyA9IFtdO1xuICB9IGVsc2UgaWYgKGxlbmd0aCA+IDIgJiYgaXNJdGVyYXRlZUNhbGwoaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0sIGl0ZXJhdGVlc1syXSkpIHtcbiAgICBpdGVyYXRlZXMgPSBbaXRlcmF0ZWVzWzBdXTtcbiAgfVxuICByZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgYmFzZUZsYXR0ZW4oaXRlcmF0ZWVzLCAxKSwgW10pO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc29ydEJ5O1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhcnJheXMgPSBfLnRpbWVzKDIsIF8uc3R1YkFycmF5KTtcbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheXMpO1xuICogLy8gPT4gW1tdLCBbXV1cbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheXNbMF0gPT09IGFycmF5c1sxXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBzdHViQXJyYXkoKSB7XG4gIHJldHVybiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViQXJyYXk7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAqL1xuZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R1YkZhbHNlO1xuIiwidmFyIHRvTnVtYmVyID0gcmVxdWlyZSgnLi90b051bWJlcicpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDg7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIGZpbml0ZSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEyLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0Zpbml0ZSgzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9GaW5pdGUoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvRmluaXRlKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b0Zpbml0ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiAwO1xuICB9XG4gIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICBpZiAodmFsdWUgPT09IElORklOSVRZIHx8IHZhbHVlID09PSAtSU5GSU5JVFkpIHtcbiAgICB2YXIgc2lnbiA9ICh2YWx1ZSA8IDAgPyAtMSA6IDEpO1xuICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gIH1cbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/IHZhbHVlIDogMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0Zpbml0ZTtcbiIsInZhciB0b0Zpbml0ZSA9IHJlcXVpcmUoJy4vdG9GaW5pdGUnKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9JbnRlZ2VyYF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvaW50ZWdlcikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0ludGVnZXIoMy4yKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDBcbiAqXG4gKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSB0b0Zpbml0ZSh2YWx1ZSksXG4gICAgICByZW1haW5kZXIgPSByZXN1bHQgJSAxO1xuXG4gIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0ludGVnZXI7XG4iLCJ2YXIgYmFzZVRyaW0gPSByZXF1aXJlKCcuL19iYXNlVHJpbScpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBOQU4gPSAwIC8gMDtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gYmFzZVRyaW0odmFsdWUpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b051bWJlcjtcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHBsYWluIG9iamVjdCBmbGF0dGVuaW5nIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZ1xuICoga2V5ZWQgcHJvcGVydGllcyBvZiBgdmFsdWVgIHRvIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBwbGFpbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmFzc2lnbih7ICdhJzogMSB9LCBuZXcgRm9vKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICpcbiAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIF8udG9QbGFpbk9iamVjdChuZXcgRm9vKSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfVxuICovXG5mdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBjb3B5T2JqZWN0KHZhbHVlLCBrZXlzSW4odmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1BsYWluT2JqZWN0O1xuIiwidmFyIGJhc2VUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VUb1N0cmluZycpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9TdHJpbmcobnVsbCk7XG4gKiAvLyA9PiAnJ1xuICpcbiAqIF8udG9TdHJpbmcoLTApO1xuICogLy8gPT4gJy0wJ1xuICpcbiAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAqIC8vID0+ICcxLDIsMydcbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9TdHJpbmc7XG4iLCJ2YXIgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYmFzZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX2Jhc2VDcmVhdGUnKSxcbiAgICBiYXNlRm9yT3duID0gcmVxdWlyZSgnLi9fYmFzZUZvck93bicpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGdldFByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2dldFByb3RvdHlwZScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqXG4gKiBBbiBhbHRlcm5hdGl2ZSB0byBgXy5yZWR1Y2VgOyB0aGlzIG1ldGhvZCB0cmFuc2Zvcm1zIGBvYmplY3RgIHRvIGEgbmV3XG4gKiBgYWNjdW11bGF0b3JgIG9iamVjdCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgZWFjaCBvZiBpdHMgb3duXG4gKiBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIHRocnUgYGl0ZXJhdGVlYCwgd2l0aCBlYWNoIGludm9jYXRpb25cbiAqIHBvdGVudGlhbGx5IG11dGF0aW5nIHRoZSBgYWNjdW11bGF0b3JgIG9iamVjdC4gSWYgYGFjY3VtdWxhdG9yYCBpcyBub3RcbiAqIHByb3ZpZGVkLCBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBgW1tQcm90b3R5cGVdXWAgd2lsbCBiZSB1c2VkLiBUaGVcbiAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czogKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5LCBvYmplY3QpLlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMS4zLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgY3VzdG9tIGFjY3VtdWxhdG9yIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRyYW5zZm9ybShbMiwgMywgNF0sIGZ1bmN0aW9uKHJlc3VsdCwgbikge1xuICogICByZXN1bHQucHVzaChuICo9IG4pO1xuICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAqIH0sIFtdKTtcbiAqIC8vID0+IFs0LCA5XVxuICpcbiAqIF8udHJhbnNmb3JtKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAqIH0sIHt9KTtcbiAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH1cbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtKG9iamVjdCwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgIGlzQXJyTGlrZSA9IGlzQXJyIHx8IGlzQnVmZmVyKG9iamVjdCkgfHwgaXNUeXBlZEFycmF5KG9iamVjdCk7XG5cbiAgaXRlcmF0ZWUgPSBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDQpO1xuICBpZiAoYWNjdW11bGF0b3IgPT0gbnVsbCkge1xuICAgIHZhciBDdG9yID0gb2JqZWN0ICYmIG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoaXNBcnJMaWtlKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGlzQXJyID8gbmV3IEN0b3IgOiBbXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgYWNjdW11bGF0b3IgPSBpc0Z1bmN0aW9uKEN0b3IpID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSkgOiB7fTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBhY2N1bXVsYXRvciA9IHt9O1xuICAgIH1cbiAgfVxuICAoaXNBcnJMaWtlID8gYXJyYXlFYWNoIDogYmFzZUZvck93bikob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgIHJldHVybiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBvYmplY3QpO1xuICB9KTtcbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRyYW5zZm9ybTtcbiIsInZhciBiYXNlRmxhdHRlbiA9IHJlcXVpcmUoJy4vX2Jhc2VGbGF0dGVuJyksXG4gICAgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGJhc2VVbmlxID0gcmVxdWlyZSgnLi9fYmFzZVVuaXEnKSxcbiAgICBpc0FycmF5TGlrZU9iamVjdCA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2VPYmplY3QnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBnaXZlbiBhcnJheXMgdXNpbmdcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udW5pb24oWzJdLCBbMSwgMl0pO1xuICogLy8gPT4gWzIsIDFdXG4gKi9cbnZhciB1bmlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pb247XG4iLCJ2YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cbi8qKiBVc2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMuICovXG52YXIgaWRDb3VudGVyID0gMDtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIElmIGBwcmVmaXhgIGlzIGdpdmVuLCB0aGUgSUQgaXMgYXBwZW5kZWQgdG8gaXQuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4PScnXSBUaGUgdmFsdWUgdG8gcHJlZml4IHRoZSBJRCB3aXRoLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpO1xuICogLy8gPT4gJ2NvbnRhY3RfMTA0J1xuICpcbiAqIF8udW5pcXVlSWQoKTtcbiAqIC8vID0+ICcxMDUnXG4gKi9cbmZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICB2YXIgaWQgPSArK2lkQ291bnRlcjtcbiAgcmV0dXJuIHRvU3RyaW5nKHByZWZpeCkgKyBpZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmlxdWVJZDtcbiIsInZhciBiYXNlVmFsdWVzID0gcmVxdWlyZSgnLi9fYmFzZVZhbHVlcycpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLnZhbHVlcyhuZXcgRm9vKTtcbiAqIC8vID0+IFsxLCAyXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8udmFsdWVzKCdoaScpO1xuICogLy8gPT4gWydoJywgJ2knXVxuICovXG5mdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsdWVzO1xuIiwidmFyIGFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduVmFsdWUnKSxcbiAgICBiYXNlWmlwT2JqZWN0ID0gcmVxdWlyZSgnLi9fYmFzZVppcE9iamVjdCcpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZnJvbVBhaXJzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIHR3byBhcnJheXMsXG4gKiBvbmUgb2YgcHJvcGVydHkgaWRlbnRpZmllcnMgYW5kIG9uZSBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuNC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wcz1bXV0gVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uemlwT2JqZWN0KFsnYScsICdiJ10sIFsxLCAyXSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAqL1xuZnVuY3Rpb24gemlwT2JqZWN0KHByb3BzLCB2YWx1ZXMpIHtcbiAgcmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHMgfHwgW10sIHZhbHVlcyB8fCBbXSwgYXNzaWduVmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHppcE9iamVjdDtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuIiwiZXhwb3J0IGZ1bmN0aW9uIHl1djJyZ2IoeXV2KSB7XG4gIHZhciB5ID0geXV2WzBdLFxuICAgICAgdSA9IHl1dlsxXSxcbiAgICAgIHYgPSB5dXZbMl07XG4gIHZhciByLCBnLCBiO1xuICByID0geSAqIDEgKyB1ICogMCArIHYgKiAxLjEzOTgzO1xuICBnID0geSAqIDEgKyB1ICogLTAuMzk0NjUgKyB2ICogLTAuNTgwNjtcbiAgYiA9IHkgKiAxICsgdSAqIDIuMDIzMTEgKyB2ICogMDtcbiAgciA9IE1hdGgubWluKE1hdGgubWF4KDAsIHIpLCAxKTtcbiAgZyA9IE1hdGgubWluKE1hdGgubWF4KDAsIGcpLCAxKTtcbiAgYiA9IE1hdGgubWluKE1hdGgubWF4KDAsIGIpLCAxKTtcbiAgcmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZ2IyeXV2KHJnYikge1xuICB2YXIgciA9IHJnYlswXSAvIDI1NSxcbiAgICAgIGcgPSByZ2JbMV0gLyAyNTUsXG4gICAgICBiID0gcmdiWzJdIC8gMjU1O1xuICB2YXIgeSA9IHIgKiAwLjI5OSArIGcgKiAwLjU4NyArIGIgKiAwLjExNDtcbiAgdmFyIHUgPSByICogLTAuMTQ3MTMgKyBnICogLTAuMjg4ODYgKyBiICogMC40MzY7XG4gIHZhciB2ID0gciAqIDAuNjE1ICsgZyAqIC0wLjUxNDk5ICsgYiAqIC0wLjEwMDAxO1xuICByZXR1cm4gW3ksIHUsIHZdO1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXlcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0ICogYXMgYmFzZTE2IGZyb20gJ2Jhc2UxNic7XG5pbXBvcnQgQ29sb3IgZnJvbSAnY29sb3InO1xuaW1wb3J0IGN1cnJ5IGZyb20gJ2xvZGFzaC5jdXJyeSc7XG5pbXBvcnQgeyB5dXYycmdiLCByZ2IyeXV2IH0gZnJvbSAnLi9jb2xvckNvbnZlcnRlcnMnO1xudmFyIERFRkFVTFRfQkFTRTE2ID0gYmFzZTE2LmRlZmF1bHQ7XG52YXIgQkFTRTE2X0tFWVMgPSBPYmplY3Qua2V5cyhERUZBVUxUX0JBU0UxNik7IC8vIHdlIG5lZWQgYSBjb3JyZWN0aW5nIGZhY3Rvciwgc28gdGhhdCBhIGRhcmssIGJ1dCBub3QgYmxhY2sgYmFja2dyb3VuZCBjb2xvclxuLy8gY29udmVydHMgdG8gYnJpZ2h0IGVub3VnaCBpbnZlcnNlZCBjb2xvclxuXG52YXIgZmxpcCA9IGZ1bmN0aW9uIGZsaXAoeCkge1xuICByZXR1cm4geCA8IDAuMjUgPyAxIDogeCA8IDAuNSA/IDAuOSAtIHggOiAxLjEgLSB4O1xufTtcblxudmFyIGludmVydENvbG9yID0gZnVuY3Rpb24gaW52ZXJ0Q29sb3IoaGV4U3RyaW5nKSB7XG4gIHZhciBjb2xvciA9IENvbG9yKGhleFN0cmluZyk7XG5cbiAgdmFyIF9yZ2IyeXV2ID0gcmdiMnl1dihjb2xvci5hcnJheSgpKSxcbiAgICAgIF9yZ2IyeXV2MiA9IF9zbGljZWRUb0FycmF5KF9yZ2IyeXV2LCAzKSxcbiAgICAgIHkgPSBfcmdiMnl1djJbMF0sXG4gICAgICB1ID0gX3JnYjJ5dXYyWzFdLFxuICAgICAgdiA9IF9yZ2IyeXV2MlsyXTtcblxuICB2YXIgZmxpcHBlZFl1diA9IFtmbGlwKHkpLCB1LCB2XTtcbiAgdmFyIHJnYiA9IHl1djJyZ2IoZmxpcHBlZFl1dik7XG4gIHJldHVybiBDb2xvci5yZ2IocmdiKS5oZXgoKTtcbn07XG5cbnZhciBtZXJnZXIgPSBmdW5jdGlvbiBtZXJnZXIoc3R5bGluZykge1xuICByZXR1cm4gZnVuY3Rpb24gKHByZXZTdHlsaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzTmFtZTogW3ByZXZTdHlsaW5nLmNsYXNzTmFtZSwgc3R5bGluZy5jbGFzc05hbWVdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyksXG4gICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3R5bGluZy5zdHlsZSB8fCB7fSksIHN0eWxpbmcuc3R5bGUgfHwge30pXG4gICAgfTtcbiAgfTtcbn07XG5cbnZhciBtZXJnZVN0eWxpbmcgPSBmdW5jdGlvbiBtZXJnZVN0eWxpbmcoY3VzdG9tU3R5bGluZywgZGVmYXVsdFN0eWxpbmcpIHtcbiAgaWYgKGN1c3RvbVN0eWxpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBkZWZhdWx0U3R5bGluZztcbiAgfVxuXG4gIGlmIChkZWZhdWx0U3R5bGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0eWxpbmc7XG4gIH1cblxuICB2YXIgY3VzdG9tVHlwZSA9IF90eXBlb2YoY3VzdG9tU3R5bGluZyk7XG5cbiAgdmFyIGRlZmF1bHRUeXBlID0gX3R5cGVvZihkZWZhdWx0U3R5bGluZyk7XG5cbiAgc3dpdGNoIChjdXN0b21UeXBlKSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIHN3aXRjaCAoZGVmYXVsdFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICByZXR1cm4gW2RlZmF1bHRTdHlsaW5nLCBjdXN0b21TdHlsaW5nXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuXG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgcmV0dXJuIG1lcmdlcih7XG4gICAgICAgICAgICBjbGFzc05hbWU6IGN1c3RvbVN0eWxpbmcsXG4gICAgICAgICAgICBzdHlsZTogZGVmYXVsdFN0eWxpbmdcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdHlsaW5nKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VyKHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjdXN0b21TdHlsaW5nXG4gICAgICAgICAgICB9KShkZWZhdWx0U3R5bGluZy5hcHBseSh2b2lkIDAsIFtzdHlsaW5nXS5jb25jYXQoYXJncykpKTtcbiAgICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICBzd2l0Y2ggKGRlZmF1bHRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgcmV0dXJuIG1lcmdlcih7XG4gICAgICAgICAgICBjbGFzc05hbWU6IGRlZmF1bHRTdHlsaW5nLFxuICAgICAgICAgICAgc3R5bGU6IGN1c3RvbVN0eWxpbmdcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRlZmF1bHRTdHlsaW5nKSwgY3VzdG9tU3R5bGluZyk7XG5cbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc3R5bGluZykge1xuICAgICAgICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlcih7XG4gICAgICAgICAgICAgIHN0eWxlOiBjdXN0b21TdHlsaW5nXG4gICAgICAgICAgICB9KShkZWZhdWx0U3R5bGluZy5hcHBseSh2b2lkIDAsIFtzdHlsaW5nXS5jb25jYXQoYXJncykpKTtcbiAgICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHN3aXRjaCAoZGVmYXVsdFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHN0eWxpbmcpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMyA+IDEgPyBfbGVuMyAtIDEgOiAwKSwgX2tleTMgPSAxOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2tleTMgLSAxXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjdXN0b21TdHlsaW5nLmFwcGx5KHZvaWQgMCwgW21lcmdlcihzdHlsaW5nKSh7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogZGVmYXVsdFN0eWxpbmdcbiAgICAgICAgICAgIH0pXS5jb25jYXQoYXJncykpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHN0eWxpbmcpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuNCA+IDEgPyBfbGVuNCAtIDEgOiAwKSwgX2tleTQgPSAxOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2tleTQgLSAxXSA9IGFyZ3VtZW50c1tfa2V5NF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjdXN0b21TdHlsaW5nLmFwcGx5KHZvaWQgMCwgW21lcmdlcihzdHlsaW5nKSh7XG4gICAgICAgICAgICAgIHN0eWxlOiBkZWZhdWx0U3R5bGluZ1xuICAgICAgICAgICAgfSldLmNvbmNhdChhcmdzKSk7XG4gICAgICAgICAgfTtcblxuICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdHlsaW5nKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuNSA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjUgPiAxID8gX2xlbjUgLSAxIDogMCksIF9rZXk1ID0gMTsgX2tleTUgPCBfbGVuNTsgX2tleTUrKykge1xuICAgICAgICAgICAgICBhcmdzW19rZXk1IC0gMV0gPSBhcmd1bWVudHNbX2tleTVdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY3VzdG9tU3R5bGluZy5hcHBseSh2b2lkIDAsIFtkZWZhdWx0U3R5bGluZy5hcHBseSh2b2lkIDAsIFtzdHlsaW5nXS5jb25jYXQoYXJncykpXS5jb25jYXQoYXJncykpO1xuICAgICAgICAgIH07XG4gICAgICB9XG5cbiAgfVxufTtcblxudmFyIG1lcmdlU3R5bGluZ3MgPSBmdW5jdGlvbiBtZXJnZVN0eWxpbmdzKGN1c3RvbVN0eWxpbmdzLCBkZWZhdWx0U3R5bGluZ3MpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhkZWZhdWx0U3R5bGluZ3MpO1xuXG4gIGZvciAodmFyIGtleSBpbiBjdXN0b21TdHlsaW5ncykge1xuICAgIGlmIChrZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIGtleXMucHVzaChrZXkpO1xuICB9XG5cbiAgcmV0dXJuIGtleXMucmVkdWNlKGZ1bmN0aW9uIChtZXJnZWRTdHlsaW5nLCBrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkU3R5bGluZ1trZXldID0gbWVyZ2VTdHlsaW5nKGN1c3RvbVN0eWxpbmdzW2tleV0sIGRlZmF1bHRTdHlsaW5nc1trZXldKSwgbWVyZ2VkU3R5bGluZztcbiAgfSwge30pO1xufTtcblxudmFyIGdldFN0eWxpbmdCeUtleXMgPSBmdW5jdGlvbiBnZXRTdHlsaW5nQnlLZXlzKG1lcmdlZFN0eWxpbmcsIGtleXMpIHtcbiAgZm9yICh2YXIgX2xlbjYgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW42ID4gMiA/IF9sZW42IC0gMiA6IDApLCBfa2V5NiA9IDI7IF9rZXk2IDwgX2xlbjY7IF9rZXk2KyspIHtcbiAgICBhcmdzW19rZXk2IC0gMl0gPSBhcmd1bWVudHNbX2tleTZdO1xuICB9XG5cbiAgaWYgKGtleXMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbWVyZ2VkU3R5bGluZztcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgIGtleXMgPSBba2V5c107XG4gIH1cblxuICB2YXIgc3R5bGVzID0ga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBtZXJnZWRTdHlsaW5nW2tleV07XG4gIH0pLmZpbHRlcihCb29sZWFuKTtcbiAgdmFyIHByb3BzID0gc3R5bGVzLnJlZHVjZShmdW5jdGlvbiAob2JqLCBzKSB7XG4gICAgaWYgKHR5cGVvZiBzID09PSAnc3RyaW5nJykge1xuICAgICAgb2JqLmNsYXNzTmFtZSA9IFtvYmouY2xhc3NOYW1lLCBzXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIH0gZWxzZSBpZiAoX3R5cGVvZihzKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG9iai5zdHlsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb2JqLnN0eWxlKSwgcyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb2JqID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvYmopLCBzLmFwcGx5KHZvaWQgMCwgW29ial0uY29uY2F0KGFyZ3MpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbiAgfSwge1xuICAgIGNsYXNzTmFtZTogJycsXG4gICAgc3R5bGU6IHt9XG4gIH0pO1xuXG4gIGlmICghcHJvcHMuY2xhc3NOYW1lKSB7XG4gICAgZGVsZXRlIHByb3BzLmNsYXNzTmFtZTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhwcm9wcy5zdHlsZSkubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIHByb3BzLnN0eWxlO1xuICB9XG5cbiAgcmV0dXJuIHByb3BzO1xufTtcblxuZXhwb3J0IHZhciBpbnZlcnRCYXNlMTZUaGVtZSA9IGZ1bmN0aW9uIGludmVydEJhc2UxNlRoZW1lKGJhc2UxNlRoZW1lKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhiYXNlMTZUaGVtZSkucmVkdWNlKGZ1bmN0aW9uICh0LCBrZXkpIHtcbiAgICByZXR1cm4gdFtrZXldID0gL15iYXNlLy50ZXN0KGtleSkgPyBpbnZlcnRDb2xvcihiYXNlMTZUaGVtZVtrZXldKSA6IGtleSA9PT0gJ3NjaGVtZScgPyBiYXNlMTZUaGVtZVtrZXldICsgJzppbnZlcnRlZCcgOiBiYXNlMTZUaGVtZVtrZXldLCB0O1xuICB9LCB7fSk7XG59O1xuZXhwb3J0IHZhciBjcmVhdGVTdHlsaW5nID0gY3VycnkoZnVuY3Rpb24gKGdldFN0eWxpbmdGcm9tQmFzZTE2KSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIHRoZW1lT3JTdHlsaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgdmFyIF9vcHRpb25zJGRlZmF1bHRCYXNlID0gb3B0aW9ucy5kZWZhdWx0QmFzZTE2LFxuICAgICAgZGVmYXVsdEJhc2UxNiA9IF9vcHRpb25zJGRlZmF1bHRCYXNlID09PSB2b2lkIDAgPyBERUZBVUxUX0JBU0UxNiA6IF9vcHRpb25zJGRlZmF1bHRCYXNlLFxuICAgICAgX29wdGlvbnMkYmFzZTE2VGhlbWVzID0gb3B0aW9ucy5iYXNlMTZUaGVtZXMsXG4gICAgICBiYXNlMTZUaGVtZXMgPSBfb3B0aW9ucyRiYXNlMTZUaGVtZXMgPT09IHZvaWQgMCA/IG51bGwgOiBfb3B0aW9ucyRiYXNlMTZUaGVtZXM7XG4gIHZhciBiYXNlMTZUaGVtZSA9IGdldEJhc2UxNlRoZW1lKHRoZW1lT3JTdHlsaW5nLCBiYXNlMTZUaGVtZXMpO1xuXG4gIGlmIChiYXNlMTZUaGVtZSkge1xuICAgIHRoZW1lT3JTdHlsaW5nID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBiYXNlMTZUaGVtZSksIHRoZW1lT3JTdHlsaW5nKTtcbiAgfVxuXG4gIHZhciB0aGVtZSA9IEJBU0UxNl9LRVlTLnJlZHVjZShmdW5jdGlvbiAodCwga2V5KSB7XG4gICAgcmV0dXJuIHRba2V5XSA9IHRoZW1lT3JTdHlsaW5nW2tleV0gfHwgZGVmYXVsdEJhc2UxNltrZXldLCB0O1xuICB9LCB7fSk7XG4gIHZhciBjdXN0b21TdHlsaW5nID0gT2JqZWN0LmtleXModGhlbWVPclN0eWxpbmcpLnJlZHVjZShmdW5jdGlvbiAocywga2V5KSB7XG4gICAgcmV0dXJuIEJBU0UxNl9LRVlTLmluZGV4T2Yoa2V5KSA9PT0gLTEgPyAoc1trZXldID0gdGhlbWVPclN0eWxpbmdba2V5XSwgcykgOiBzO1xuICB9LCB7fSk7XG4gIHZhciBkZWZhdWx0U3R5bGluZyA9IGdldFN0eWxpbmdGcm9tQmFzZTE2KHRoZW1lKTtcbiAgdmFyIG1lcmdlZFN0eWxpbmcgPSBtZXJnZVN0eWxpbmdzKGN1c3RvbVN0eWxpbmcsIGRlZmF1bHRTdHlsaW5nKTtcblxuICBmb3IgKHZhciBfbGVuNyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjcgPiAzID8gX2xlbjcgLSAzIDogMCksIF9rZXk3ID0gMzsgX2tleTcgPCBfbGVuNzsgX2tleTcrKykge1xuICAgIGFyZ3NbX2tleTcgLSAzXSA9IGFyZ3VtZW50c1tfa2V5N107XG4gIH1cblxuICByZXR1cm4gY3VycnkoZ2V0U3R5bGluZ0J5S2V5cywgMikuYXBwbHkodm9pZCAwLCBbbWVyZ2VkU3R5bGluZ10uY29uY2F0KGFyZ3MpKTtcbn0sIDMpO1xuXG52YXIgaXNTdHlsaW5nQ29uZmlnID0gZnVuY3Rpb24gaXNTdHlsaW5nQ29uZmlnKHRoZW1lKSB7XG4gIHJldHVybiAhIXRoZW1lLmV4dGVuZDtcbn07XG5cbmV4cG9ydCB2YXIgZ2V0QmFzZTE2VGhlbWUgPSBmdW5jdGlvbiBnZXRCYXNlMTZUaGVtZSh0aGVtZSwgYmFzZTE2VGhlbWVzKSB7XG4gIGlmICh0aGVtZSAmJiBpc1N0eWxpbmdDb25maWcodGhlbWUpICYmIHRoZW1lLmV4dGVuZCkge1xuICAgIHRoZW1lID0gdGhlbWUuZXh0ZW5kO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0aGVtZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgX3RoZW1lJHNwbGl0ID0gdGhlbWUuc3BsaXQoJzonKSxcbiAgICAgICAgX3RoZW1lJHNwbGl0MiA9IF9zbGljZWRUb0FycmF5KF90aGVtZSRzcGxpdCwgMiksXG4gICAgICAgIF90aGVtZU5hbWUgPSBfdGhlbWUkc3BsaXQyWzBdLFxuICAgICAgICBtb2RpZmllciA9IF90aGVtZSRzcGxpdDJbMV07XG5cbiAgICBpZiAoYmFzZTE2VGhlbWVzKSB7XG4gICAgICB0aGVtZSA9IGJhc2UxNlRoZW1lc1tfdGhlbWVOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhlbWUgPSBiYXNlMTZbX3RoZW1lTmFtZV07XG4gICAgfVxuXG4gICAgaWYgKG1vZGlmaWVyID09PSAnaW52ZXJ0ZWQnKSB7XG4gICAgICB0aGVtZSA9IGludmVydEJhc2UxNlRoZW1lKHRoZW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhlbWUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoZW1lLCAnYmFzZTAwJykgPyB0aGVtZSA6IHVuZGVmaW5lZDtcbn07XG5leHBvcnQgdmFyIGludmVydFRoZW1lID0gZnVuY3Rpb24gaW52ZXJ0VGhlbWUodGhlbWUpIHtcbiAgaWYgKHR5cGVvZiB0aGVtZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQodGhlbWUsIFwiOmludmVydGVkXCIpO1xuICB9XG5cbiAgaWYgKHRoZW1lICYmIGlzU3R5bGluZ0NvbmZpZyh0aGVtZSkgJiYgdGhlbWUuZXh0ZW5kKSB7XG4gICAgaWYgKHR5cGVvZiB0aGVtZS5leHRlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0aGVtZSksIHt9LCB7XG4gICAgICAgIGV4dGVuZDogXCJcIi5jb25jYXQodGhlbWUuZXh0ZW5kLCBcIjppbnZlcnRlZFwiKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhlbWUpLCB7fSwge1xuICAgICAgZXh0ZW5kOiBpbnZlcnRCYXNlMTZUaGVtZSh0aGVtZS5leHRlbmQpXG4gICAgfSk7XG4gIH1cblxuICBpZiAodGhlbWUpIHtcbiAgICByZXR1cm4gaW52ZXJ0QmFzZTE2VGhlbWUodGhlbWUpO1xuICB9XG5cbiAgcmV0dXJuIHRoZW1lO1xufTtcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnOyIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBoYXNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIDogMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJykgOiAweGVhY2E7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50JykgOiAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJykgOiAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJykgOiAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJykgOiAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpIDogMHhlYWNlOyAvLyBUT0RPOiBXZSBkb24ndCB1c2UgQXN5bmNNb2RlIG9yIENvbmN1cnJlbnRNb2RlIGFueW1vcmUuIFRoZXkgd2VyZSB0ZW1wb3Jhcnlcbi8vICh1bnN0YWJsZSkgQVBJcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLiBDYW4gd2UgcmVtb3ZlIHRoZSBzeW1ib2xzP1xuXG52YXIgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYXN5bmNfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29uY3VycmVudF9tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJykgOiAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJykgOiAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpIDogMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKSA6IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5JykgOiAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmJsb2NrJykgOiAweGVhZDk7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJykgOiAweGVhZDU7XG52YXIgUkVBQ1RfUkVTUE9OREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5yZXNwb25kZXInKSA6IDB4ZWFkNjtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKSA6IDB4ZWFkNztcblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCAvLyBOb3RlOiBpdHMgdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgaWYgaXQncyBhIHBvbHlmaWxsLlxuICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUkVTUE9OREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfU0NPUEVfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFKTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59IC8vIEFzeW5jTW9kZSBpcyBkZXByZWNhdGVkIGFsb25nIHdpdGggaXNBc3luY01vZGVcblxudmFyIEFzeW5jTW9kZSA9IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbnZhciBDb25jdXJyZW50TW9kZSA9IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxNysuIFVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlICcgKyAnUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgaW5zdGVhZC4gSXQgaGFzIHRoZSBleGFjdCBzYW1lIEFQSS4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHx8IHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuXG5leHBvcnRzLkFzeW5jTW9kZSA9IEFzeW5jTW9kZTtcbmV4cG9ydHMuQ29uY3VycmVudE1vZGUgPSBDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiO1xuaW1wb3J0IF9nZXRQcm90b3R5cGVPZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgSlNPTkFycm93IGZyb20gJy4vSlNPTkFycm93JztcblxudmFyIEl0ZW1SYW5nZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoSXRlbVJhbmdlLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEl0ZW1SYW5nZSk7XG5cbiAgZnVuY3Rpb24gSXRlbVJhbmdlKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEl0ZW1SYW5nZSk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJoYW5kbGVDbGlja1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGV4cGFuZGVkOiAhX3RoaXMuc3RhdGUuZXhwYW5kZWRcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBleHBhbmRlZDogZmFsc2VcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhJdGVtUmFuZ2UsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHN0eWxpbmcgPSBfdGhpcyRwcm9wcy5zdHlsaW5nLFxuICAgICAgICAgIGZyb20gPSBfdGhpcyRwcm9wcy5mcm9tLFxuICAgICAgICAgIHRvID0gX3RoaXMkcHJvcHMudG8sXG4gICAgICAgICAgcmVuZGVyQ2hpbGROb2RlcyA9IF90aGlzJHByb3BzLnJlbmRlckNoaWxkTm9kZXMsXG4gICAgICAgICAgbm9kZVR5cGUgPSBfdGhpcyRwcm9wcy5ub2RlVHlwZTtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlLmV4cGFuZGVkID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgc3R5bGluZygnaXRlbVJhbmdlJywgdGhpcy5zdGF0ZS5leHBhbmRlZCksIHJlbmRlckNoaWxkTm9kZXModGhpcy5wcm9wcywgZnJvbSwgdG8pKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBzdHlsaW5nKCdpdGVtUmFuZ2UnLCB0aGlzLnN0YXRlLmV4cGFuZGVkKSwge1xuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTkFycm93LCB7XG4gICAgICAgIG5vZGVUeXBlOiBub2RlVHlwZSxcbiAgICAgICAgc3R5bGluZzogc3R5bGluZyxcbiAgICAgICAgZXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrLFxuICAgICAgICBhcnJvd1N0eWxlOiBcImRvdWJsZVwiXG4gICAgICB9KSwgXCJcIi5jb25jYXQoZnJvbSwgXCIgLi4uIFwiKS5jb25jYXQodG8pKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSXRlbVJhbmdlO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5fZGVmaW5lUHJvcGVydHkoSXRlbVJhbmdlLCBcInByb3BUeXBlc1wiLCB7XG4gIHN0eWxpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGZyb206IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgdG86IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgcmVuZGVyQ2hpbGROb2RlczogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgbm9kZVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxufSk7XG5cbmV4cG9ydCB7IEl0ZW1SYW5nZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJkYXRhXCJdO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgSlNPTk5lc3RlZE5vZGUgZnJvbSAnLi9KU09OTmVzdGVkTm9kZSc7XG5cbi8vIFJldHVybnMgdGhlIFwibiBJdGVtc1wiIHN0cmluZyBmb3IgdGhpcyBub2RlLFxuLy8gZ2VuZXJhdGluZyBhbmQgY2FjaGluZyBpdCBpZiBpdCBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldC5cbmZ1bmN0aW9uIGNyZWF0ZUl0ZW1TdHJpbmcoZGF0YSkge1xuICByZXR1cm4gXCJcIi5jb25jYXQoZGF0YS5sZW5ndGgsIFwiIFwiKS5jb25jYXQoZGF0YS5sZW5ndGggIT09IDEgPyAnaXRlbXMnIDogJ2l0ZW0nKTtcbn1cblxuLy8gQ29uZmlndXJlcyA8SlNPTk5lc3RlZE5vZGU+IHRvIHJlbmRlciBhbiBBcnJheVxudmFyIEpTT05BcnJheU5vZGUgPSBmdW5jdGlvbiBKU09OQXJyYXlOb2RlKF9yZWYpIHtcbiAgdmFyIGRhdGEgPSBfcmVmLmRhdGEsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OTmVzdGVkTm9kZSwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgZGF0YTogZGF0YSxcbiAgICBub2RlVHlwZTogXCJBcnJheVwiLFxuICAgIG5vZGVUeXBlSW5kaWNhdG9yOiBcIltdXCIsXG4gICAgY3JlYXRlSXRlbVN0cmluZzogY3JlYXRlSXRlbVN0cmluZyxcbiAgICBleHBhbmRhYmxlOiBkYXRhLmxlbmd0aCA+IDBcbiAgfSkpO1xufTtcblxuSlNPTkFycmF5Tm9kZS5wcm9wVHlwZXMgPSB7XG4gIGRhdGE6IFByb3BUeXBlcy5hcnJheVxufTtcbmV4cG9ydCBkZWZhdWx0IEpTT05BcnJheU5vZGU7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG52YXIgSlNPTkFycm93ID0gZnVuY3Rpb24gSlNPTkFycm93KF9yZWYpIHtcbiAgdmFyIHN0eWxpbmcgPSBfcmVmLnN0eWxpbmcsXG4gICAgICBhcnJvd1N0eWxlID0gX3JlZi5hcnJvd1N0eWxlLFxuICAgICAgZXhwYW5kZWQgPSBfcmVmLmV4cGFuZGVkLFxuICAgICAgbm9kZVR5cGUgPSBfcmVmLm5vZGVUeXBlLFxuICAgICAgb25DbGljayA9IF9yZWYub25DbGljaztcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBzdHlsaW5nKCdhcnJvd0NvbnRhaW5lcicsIGFycm93U3R5bGUpLCB7XG4gICAgb25DbGljazogb25DbGlja1xuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgc3R5bGluZyhbJ2Fycm93JywgJ2Fycm93U2lnbiddLCBub2RlVHlwZSwgZXhwYW5kZWQsIGFycm93U3R5bGUpLCBcIlxcdTI1QjZcIiwgYXJyb3dTdHlsZSA9PT0gJ2RvdWJsZScgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgc3R5bGluZyhbJ2Fycm93U2lnbicsICdhcnJvd1NpZ25Jbm5lciddKSwgXCJcXHUyNUI2XCIpKSk7XG59O1xuXG5KU09OQXJyb3cucHJvcFR5cGVzID0ge1xuICBzdHlsaW5nOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBhcnJvd1N0eWxlOiBQcm9wVHlwZXMub25lT2YoWydzaW5nbGUnLCAnZG91YmxlJ10pLFxuICBleHBhbmRlZDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgbm9kZVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxufTtcbkpTT05BcnJvdy5kZWZhdWx0UHJvcHMgPSB7XG4gIGFycm93U3R5bGU6ICdzaW5nbGUnXG59O1xuZXhwb3J0IGRlZmF1bHQgSlNPTkFycm93OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdOyBpZiAoIWl0KSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IGl0LmNhbGwobyk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXQucmV0dXJuICE9IG51bGwpIGl0LnJldHVybigpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBKU09OTmVzdGVkTm9kZSBmcm9tICcuL0pTT05OZXN0ZWROb2RlJztcblxuLy8gUmV0dXJucyB0aGUgXCJuIEl0ZW1zXCIgc3RyaW5nIGZvciB0aGlzIG5vZGUsXG4vLyBnZW5lcmF0aW5nIGFuZCBjYWNoaW5nIGl0IGlmIGl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LlxuZnVuY3Rpb24gY3JlYXRlSXRlbVN0cmluZyhkYXRhLCBsaW1pdCkge1xuICB2YXIgY291bnQgPSAwO1xuICB2YXIgaGFzTW9yZSA9IGZhbHNlO1xuXG4gIGlmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihkYXRhLnNpemUpKSB7XG4gICAgY291bnQgPSBkYXRhLnNpemU7XG4gIH0gZWxzZSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGRhdGEpLFxuICAgICAgICBfc3RlcDtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICB2YXIgZW50cnkgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICBpZiAobGltaXQgJiYgY291bnQgKyAxID4gbGltaXQpIHtcbiAgICAgICAgICBoYXNNb3JlID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvdW50ICs9IDE7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IuZigpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBcIlwiLmNvbmNhdChoYXNNb3JlID8gJz4nIDogJycpLmNvbmNhdChjb3VudCwgXCIgXCIpLmNvbmNhdChjb3VudCAhPT0gMSA/ICdlbnRyaWVzJyA6ICdlbnRyeScpO1xufVxuXG4vLyBDb25maWd1cmVzIDxKU09OTmVzdGVkTm9kZT4gdG8gcmVuZGVyIGFuIGl0ZXJhYmxlXG52YXIgSlNPTkl0ZXJhYmxlTm9kZSA9IGZ1bmN0aW9uIEpTT05JdGVyYWJsZU5vZGUoX3JlZikge1xuICB2YXIgcHJvcHMgPSBfZXh0ZW5kcyh7fSwgX3JlZik7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05OZXN0ZWROb2RlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBub2RlVHlwZTogXCJJdGVyYWJsZVwiLFxuICAgIG5vZGVUeXBlSW5kaWNhdG9yOiBcIigpXCIsXG4gICAgY3JlYXRlSXRlbVN0cmluZzogY3JlYXRlSXRlbVN0cmluZ1xuICB9KSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBKU09OSXRlcmFibGVOb2RlOyIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBKU09OQXJyb3cgZnJvbSAnLi9KU09OQXJyb3cnO1xuaW1wb3J0IGdldENvbGxlY3Rpb25FbnRyaWVzIGZyb20gJy4vZ2V0Q29sbGVjdGlvbkVudHJpZXMnO1xuaW1wb3J0IEpTT05Ob2RlIGZyb20gJy4vSlNPTk5vZGUnO1xuaW1wb3J0IEl0ZW1SYW5nZSBmcm9tICcuL0l0ZW1SYW5nZSc7XG5cbmZ1bmN0aW9uIGlzUmFuZ2UocmFuZ2VPckVudHJ5KSB7XG4gIHJldHVybiByYW5nZU9yRW50cnkudG8gIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyQ2hpbGROb2Rlcyhwcm9wcywgZnJvbSwgdG8pIHtcbiAgdmFyIG5vZGVUeXBlID0gcHJvcHMubm9kZVR5cGUsXG4gICAgICBkYXRhID0gcHJvcHMuZGF0YSxcbiAgICAgIGNvbGxlY3Rpb25MaW1pdCA9IHByb3BzLmNvbGxlY3Rpb25MaW1pdCxcbiAgICAgIGNpcmN1bGFyQ2FjaGUgPSBwcm9wcy5jaXJjdWxhckNhY2hlLFxuICAgICAga2V5UGF0aCA9IHByb3BzLmtleVBhdGgsXG4gICAgICBwb3N0cHJvY2Vzc1ZhbHVlID0gcHJvcHMucG9zdHByb2Nlc3NWYWx1ZSxcbiAgICAgIHNvcnRPYmplY3RLZXlzID0gcHJvcHMuc29ydE9iamVjdEtleXM7XG4gIHZhciBjaGlsZE5vZGVzID0gW107XG4gIGdldENvbGxlY3Rpb25FbnRyaWVzKG5vZGVUeXBlLCBkYXRhLCBzb3J0T2JqZWN0S2V5cywgY29sbGVjdGlvbkxpbWl0LCBmcm9tLCB0bykuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICBpZiAoaXNSYW5nZShlbnRyeSkpIHtcbiAgICAgIGNoaWxkTm9kZXMucHVzaCggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSXRlbVJhbmdlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAga2V5OiBcIkl0ZW1SYW5nZS0tXCIuY29uY2F0KGVudHJ5LmZyb20sIFwiLVwiKS5jb25jYXQoZW50cnkudG8pLFxuICAgICAgICBmcm9tOiBlbnRyeS5mcm9tLFxuICAgICAgICB0bzogZW50cnkudG8sXG4gICAgICAgIHJlbmRlckNoaWxkTm9kZXM6IHJlbmRlckNoaWxkTm9kZXNcbiAgICAgIH0pKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBrZXkgPSBlbnRyeS5rZXksXG4gICAgICAgICAgdmFsdWUgPSBlbnRyeS52YWx1ZTtcbiAgICAgIHZhciBpc0NpcmN1bGFyID0gY2lyY3VsYXJDYWNoZS5pbmRleE9mKHZhbHVlKSAhPT0gLTE7XG4gICAgICBjaGlsZE5vZGVzLnB1c2goIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05Ob2RlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgICAgcG9zdHByb2Nlc3NWYWx1ZTogcG9zdHByb2Nlc3NWYWx1ZSxcbiAgICAgICAgY29sbGVjdGlvbkxpbWl0OiBjb2xsZWN0aW9uTGltaXQsXG4gICAgICAgIGtleTogXCJOb2RlLS1cIi5jb25jYXQoa2V5KSxcbiAgICAgICAga2V5UGF0aDogW2tleV0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShrZXlQYXRoKSksXG4gICAgICAgIHZhbHVlOiBwb3N0cHJvY2Vzc1ZhbHVlKHZhbHVlKSxcbiAgICAgICAgY2lyY3VsYXJDYWNoZTogW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShjaXJjdWxhckNhY2hlKSwgW3ZhbHVlXSksXG4gICAgICAgIGlzQ2lyY3VsYXI6IGlzQ2lyY3VsYXIsXG4gICAgICAgIGhpZGVSb290OiBmYWxzZVxuICAgICAgfSkpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY2hpbGROb2Rlcztcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdGVGcm9tUHJvcHMocHJvcHMpIHtcbiAgLy8gY2FsY3VsYXRlIGluZGl2aWR1YWwgbm9kZSBleHBhbnNpb24gaWYgbmVjZXNzYXJ5XG4gIHZhciBleHBhbmRlZCA9ICFwcm9wcy5pc0NpcmN1bGFyID8gcHJvcHMuc2hvdWxkRXhwYW5kTm9kZShwcm9wcy5rZXlQYXRoLCBwcm9wcy5kYXRhLCBwcm9wcy5sZXZlbCkgOiBmYWxzZTtcbiAgcmV0dXJuIHtcbiAgICBleHBhbmRlZDogZXhwYW5kZWRcbiAgfTtcbn1cblxudmFyIEpTT05OZXN0ZWROb2RlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhKU09OTmVzdGVkTm9kZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihKU09OTmVzdGVkTm9kZSk7XG5cbiAgZnVuY3Rpb24gSlNPTk5lc3RlZE5vZGUocHJvcHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSlNPTk5lc3RlZE5vZGUpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlQ2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnByb3BzLmV4cGFuZGFibGUpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGV4cGFuZGVkOiAhX3RoaXMuc3RhdGUuZXhwYW5kZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfdGhpcy5zdGF0ZSA9IGdldFN0YXRlRnJvbVByb3BzKHByb3BzKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoSlNPTk5lc3RlZE5vZGUsIFt7XG4gICAga2V5OiBcIlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgdmFyIG5leHRTdGF0ZSA9IGdldFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcyk7XG5cbiAgICAgIGlmIChnZXRTdGF0ZUZyb21Qcm9wcyh0aGlzLnByb3BzKS5leHBhbmRlZCAhPT0gbmV4dFN0YXRlLmV4cGFuZGVkKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUobmV4dFN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2hvdWxkQ29tcG9uZW50VXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHJldHVybiAhIU9iamVjdC5rZXlzKG5leHRQcm9wcykuZmluZChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgIT09ICdjaXJjdWxhckNhY2hlJyAmJiAoa2V5ID09PSAna2V5UGF0aCcgPyBuZXh0UHJvcHNba2V5XS5qb2luKCcvJykgIT09IF90aGlzMi5wcm9wc1trZXldLmpvaW4oJy8nKSA6IG5leHRQcm9wc1trZXldICE9PSBfdGhpczIucHJvcHNba2V5XSk7XG4gICAgICB9KSB8fCBuZXh0U3RhdGUuZXhwYW5kZWQgIT09IHRoaXMuc3RhdGUuZXhwYW5kZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIGdldEl0ZW1TdHJpbmcgPSBfdGhpcyRwcm9wcy5nZXRJdGVtU3RyaW5nLFxuICAgICAgICAgIG5vZGVUeXBlSW5kaWNhdG9yID0gX3RoaXMkcHJvcHMubm9kZVR5cGVJbmRpY2F0b3IsXG4gICAgICAgICAgbm9kZVR5cGUgPSBfdGhpcyRwcm9wcy5ub2RlVHlwZSxcbiAgICAgICAgICBkYXRhID0gX3RoaXMkcHJvcHMuZGF0YSxcbiAgICAgICAgICBoaWRlUm9vdCA9IF90aGlzJHByb3BzLmhpZGVSb290LFxuICAgICAgICAgIGNyZWF0ZUl0ZW1TdHJpbmcgPSBfdGhpcyRwcm9wcy5jcmVhdGVJdGVtU3RyaW5nLFxuICAgICAgICAgIHN0eWxpbmcgPSBfdGhpcyRwcm9wcy5zdHlsaW5nLFxuICAgICAgICAgIGNvbGxlY3Rpb25MaW1pdCA9IF90aGlzJHByb3BzLmNvbGxlY3Rpb25MaW1pdCxcbiAgICAgICAgICBrZXlQYXRoID0gX3RoaXMkcHJvcHMua2V5UGF0aCxcbiAgICAgICAgICBsYWJlbFJlbmRlcmVyID0gX3RoaXMkcHJvcHMubGFiZWxSZW5kZXJlcixcbiAgICAgICAgICBleHBhbmRhYmxlID0gX3RoaXMkcHJvcHMuZXhwYW5kYWJsZTtcbiAgICAgIHZhciBleHBhbmRlZCA9IHRoaXMuc3RhdGUuZXhwYW5kZWQ7XG4gICAgICB2YXIgcmVuZGVyZWRDaGlsZHJlbiA9IGV4cGFuZGVkIHx8IGhpZGVSb290ICYmIHRoaXMucHJvcHMubGV2ZWwgPT09IDAgPyByZW5kZXJDaGlsZE5vZGVzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhpcy5wcm9wcyksIHt9LCB7XG4gICAgICAgIGxldmVsOiB0aGlzLnByb3BzLmxldmVsICsgMVxuICAgICAgfSkpIDogbnVsbDtcbiAgICAgIHZhciBpdGVtVHlwZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBzdHlsaW5nKCduZXN0ZWROb2RlSXRlbVR5cGUnLCBleHBhbmRlZCksIG5vZGVUeXBlSW5kaWNhdG9yKTtcbiAgICAgIHZhciByZW5kZXJlZEl0ZW1TdHJpbmcgPSBnZXRJdGVtU3RyaW5nKG5vZGVUeXBlLCBkYXRhLCBpdGVtVHlwZSwgY3JlYXRlSXRlbVN0cmluZyhkYXRhLCBjb2xsZWN0aW9uTGltaXQpLCBrZXlQYXRoKTtcbiAgICAgIHZhciBzdHlsaW5nQXJncyA9IFtrZXlQYXRoLCBub2RlVHlwZSwgZXhwYW5kZWQsIGV4cGFuZGFibGVdO1xuICAgICAgcmV0dXJuIGhpZGVSb290ID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBzdHlsaW5nLmFwcGx5KHZvaWQgMCwgWydyb290Tm9kZSddLmNvbmNhdChzdHlsaW5nQXJncykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHN0eWxpbmcuYXBwbHkodm9pZCAwLCBbJ3Jvb3ROb2RlQ2hpbGRyZW4nXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwgcmVuZGVyZWRDaGlsZHJlbikpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBzdHlsaW5nLmFwcGx5KHZvaWQgMCwgWyduZXN0ZWROb2RlJ10uY29uY2F0KHN0eWxpbmdBcmdzKSksIGV4cGFuZGFibGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTkFycm93LCB7XG4gICAgICAgIHN0eWxpbmc6IHN0eWxpbmcsXG4gICAgICAgIG5vZGVUeXBlOiBub2RlVHlwZSxcbiAgICAgICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCBfZXh0ZW5kcyh7fSwgc3R5bGluZy5hcHBseSh2b2lkIDAsIFtbJ2xhYmVsJywgJ25lc3RlZE5vZGVMYWJlbCddXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwge1xuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgbGFiZWxSZW5kZXJlci5hcHBseSh2b2lkIDAsIHN0eWxpbmdBcmdzKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBfZXh0ZW5kcyh7fSwgc3R5bGluZy5hcHBseSh2b2lkIDAsIFsnbmVzdGVkTm9kZUl0ZW1TdHJpbmcnXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwge1xuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgcmVuZGVyZWRJdGVtU3RyaW5nKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBzdHlsaW5nLmFwcGx5KHZvaWQgMCwgWyduZXN0ZWROb2RlQ2hpbGRyZW4nXS5jb25jYXQoc3R5bGluZ0FyZ3MpKSwgcmVuZGVyZWRDaGlsZHJlbikpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBKU09OTmVzdGVkTm9kZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuX2RlZmluZVByb3BlcnR5KEpTT05OZXN0ZWROb2RlLCBcInByb3BUeXBlc1wiLCB7XG4gIGdldEl0ZW1TdHJpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG5vZGVUeXBlSW5kaWNhdG9yOiBQcm9wVHlwZXMuYW55LFxuICBub2RlVHlwZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBkYXRhOiBQcm9wVHlwZXMuYW55LFxuICBoaWRlUm9vdDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgY3JlYXRlSXRlbVN0cmluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgc3R5bGluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgY29sbGVjdGlvbkxpbWl0OiBQcm9wVHlwZXMubnVtYmVyLFxuICBrZXlQYXRoOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSkpLmlzUmVxdWlyZWQsXG4gIGxhYmVsUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHNob3VsZEV4cGFuZE5vZGU6IFByb3BUeXBlcy5mdW5jLFxuICBsZXZlbDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBzb3J0T2JqZWN0S2V5czogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIFByb3BUeXBlcy5ib29sXSksXG4gIGlzQ2lyY3VsYXI6IFByb3BUeXBlcy5ib29sLFxuICBleHBhbmRhYmxlOiBQcm9wVHlwZXMuYm9vbFxufSk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKU09OTmVzdGVkTm9kZSwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBkYXRhOiBbXSxcbiAgY2lyY3VsYXJDYWNoZTogW10sXG4gIGxldmVsOiAwLFxuICBleHBhbmRhYmxlOiB0cnVlXG59KTtcblxuZXhwb3J0IHsgSlNPTk5lc3RlZE5vZGUgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiZ2V0SXRlbVN0cmluZ1wiLCBcImtleVBhdGhcIiwgXCJsYWJlbFJlbmRlcmVyXCIsIFwic3R5bGluZ1wiLCBcInZhbHVlXCIsIFwidmFsdWVSZW5kZXJlclwiLCBcImlzQ3VzdG9tTm9kZVwiXTtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgb2JqVHlwZSBmcm9tICcuL29ialR5cGUnO1xuaW1wb3J0IEpTT05PYmplY3ROb2RlIGZyb20gJy4vSlNPTk9iamVjdE5vZGUnO1xuaW1wb3J0IEpTT05BcnJheU5vZGUgZnJvbSAnLi9KU09OQXJyYXlOb2RlJztcbmltcG9ydCBKU09OSXRlcmFibGVOb2RlIGZyb20gJy4vSlNPTkl0ZXJhYmxlTm9kZSc7XG5pbXBvcnQgSlNPTlZhbHVlTm9kZSBmcm9tICcuL0pTT05WYWx1ZU5vZGUnO1xuXG52YXIgSlNPTk5vZGUgPSBmdW5jdGlvbiBKU09OTm9kZShfcmVmKSB7XG4gIHZhciBnZXRJdGVtU3RyaW5nID0gX3JlZi5nZXRJdGVtU3RyaW5nLFxuICAgICAga2V5UGF0aCA9IF9yZWYua2V5UGF0aCxcbiAgICAgIGxhYmVsUmVuZGVyZXIgPSBfcmVmLmxhYmVsUmVuZGVyZXIsXG4gICAgICBzdHlsaW5nID0gX3JlZi5zdHlsaW5nLFxuICAgICAgdmFsdWUgPSBfcmVmLnZhbHVlLFxuICAgICAgdmFsdWVSZW5kZXJlciA9IF9yZWYudmFsdWVSZW5kZXJlcixcbiAgICAgIGlzQ3VzdG9tTm9kZSA9IF9yZWYuaXNDdXN0b21Ob2RlLFxuICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIHZhciBub2RlVHlwZSA9IGlzQ3VzdG9tTm9kZSh2YWx1ZSkgPyAnQ3VzdG9tJyA6IG9ialR5cGUodmFsdWUpO1xuICB2YXIgc2ltcGxlTm9kZVByb3BzID0ge1xuICAgIGdldEl0ZW1TdHJpbmc6IGdldEl0ZW1TdHJpbmcsXG4gICAga2V5OiBrZXlQYXRoWzBdLFxuICAgIGtleVBhdGg6IGtleVBhdGgsXG4gICAgbGFiZWxSZW5kZXJlcjogbGFiZWxSZW5kZXJlcixcbiAgICBub2RlVHlwZTogbm9kZVR5cGUsXG4gICAgc3R5bGluZzogc3R5bGluZyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgdmFsdWVSZW5kZXJlcjogdmFsdWVSZW5kZXJlclxuICB9O1xuXG4gIHZhciBuZXN0ZWROb2RlUHJvcHMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcmVzdCksIHNpbXBsZU5vZGVQcm9wcyksIHt9LCB7XG4gICAgZGF0YTogdmFsdWUsXG4gICAgaXNDdXN0b21Ob2RlOiBpc0N1c3RvbU5vZGVcbiAgfSk7XG5cbiAgc3dpdGNoIChub2RlVHlwZSkge1xuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgY2FzZSAnRXJyb3InOlxuICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05PYmplY3ROb2RlLCBuZXN0ZWROb2RlUHJvcHMpO1xuXG4gICAgY2FzZSAnQXJyYXknOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05BcnJheU5vZGUsIG5lc3RlZE5vZGVQcm9wcyk7XG5cbiAgICBjYXNlICdJdGVyYWJsZSc6XG4gICAgY2FzZSAnTWFwJzpcbiAgICBjYXNlICdTZXQnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05JdGVyYWJsZU5vZGUsIG5lc3RlZE5vZGVQcm9wcyk7XG5cbiAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKHJhdykge1xuICAgICAgICAgIHJldHVybiBcIlxcXCJcIi5jb25jYXQocmF3LCBcIlxcXCJcIik7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ051bWJlcic6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgc2ltcGxlTm9kZVByb3BzKTtcblxuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKHJhdykge1xuICAgICAgICAgIHJldHVybiByYXcgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICBjYXNlICdEYXRlJzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OVmFsdWVOb2RlLCBfZXh0ZW5kcyh7fSwgc2ltcGxlTm9kZVByb3BzLCB7XG4gICAgICAgIHZhbHVlR2V0dGVyOiBmdW5jdGlvbiB2YWx1ZUdldHRlcihyYXcpIHtcbiAgICAgICAgICByZXR1cm4gcmF3LnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ051bGwnOlxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05WYWx1ZU5vZGUsIF9leHRlbmRzKHt9LCBzaW1wbGVOb2RlUHJvcHMsIHtcbiAgICAgICAgdmFsdWVHZXR0ZXI6IGZ1bmN0aW9uIHZhbHVlR2V0dGVyKCkge1xuICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ1VuZGVmaW5lZCc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgX2V4dGVuZHMoe30sIHNpbXBsZU5vZGVQcm9wcywge1xuICAgICAgICB2YWx1ZUdldHRlcjogZnVuY3Rpb24gdmFsdWVHZXR0ZXIoKSB7XG4gICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICBjYXNlICdGdW5jdGlvbic6XG4gICAgY2FzZSAnU3ltYm9sJzpcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChKU09OVmFsdWVOb2RlLCBfZXh0ZW5kcyh7fSwgc2ltcGxlTm9kZVByb3BzLCB7XG4gICAgICAgIHZhbHVlR2V0dGVyOiBmdW5jdGlvbiB2YWx1ZUdldHRlcihyYXcpIHtcbiAgICAgICAgICByZXR1cm4gcmF3LnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNhc2UgJ0N1c3RvbSc6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgc2ltcGxlTm9kZVByb3BzKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSlNPTlZhbHVlTm9kZSwgX2V4dGVuZHMoe30sIHNpbXBsZU5vZGVQcm9wcywge1xuICAgICAgICB2YWx1ZUdldHRlcjogZnVuY3Rpb24gdmFsdWVHZXR0ZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIFwiPFwiLmNvbmNhdChub2RlVHlwZSwgXCI+XCIpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gIH1cbn07XG5cbkpTT05Ob2RlLnByb3BUeXBlcyA9IHtcbiAgZ2V0SXRlbVN0cmluZzogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAga2V5UGF0aDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLmlzUmVxdWlyZWQpLmlzUmVxdWlyZWQsXG4gIGxhYmVsUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHN0eWxpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHZhbHVlOiBQcm9wVHlwZXMuYW55LFxuICB2YWx1ZVJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBpc0N1c3RvbU5vZGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn07XG5leHBvcnQgZGVmYXVsdCBKU09OTm9kZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xudmFyIF9leGNsdWRlZCA9IFtcImRhdGFcIl07XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBKU09OTmVzdGVkTm9kZSBmcm9tICcuL0pTT05OZXN0ZWROb2RlJztcblxuLy8gUmV0dXJucyB0aGUgXCJuIEl0ZW1zXCIgc3RyaW5nIGZvciB0aGlzIG5vZGUsXG4vLyBnZW5lcmF0aW5nIGFuZCBjYWNoaW5nIGl0IGlmIGl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LlxuZnVuY3Rpb24gY3JlYXRlSXRlbVN0cmluZyhkYXRhKSB7XG4gIHZhciBsZW4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkYXRhKS5sZW5ndGg7XG4gIHJldHVybiBcIlwiLmNvbmNhdChsZW4sIFwiIFwiKS5jb25jYXQobGVuICE9PSAxID8gJ2tleXMnIDogJ2tleScpO1xufVxuXG4vLyBDb25maWd1cmVzIDxKU09OTmVzdGVkTm9kZT4gdG8gcmVuZGVyIGFuIE9iamVjdFxudmFyIEpTT05PYmplY3ROb2RlID0gZnVuY3Rpb24gSlNPTk9iamVjdE5vZGUoX3JlZikge1xuICB2YXIgZGF0YSA9IF9yZWYuZGF0YSxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05OZXN0ZWROb2RlLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBkYXRhOiBkYXRhLFxuICAgIG5vZGVUeXBlOiBcIk9iamVjdFwiLFxuICAgIG5vZGVUeXBlSW5kaWNhdG9yOiBwcm9wcy5ub2RlVHlwZSA9PT0gJ0Vycm9yJyA/ICdFcnJvcigpJyA6ICd7fScsXG4gICAgY3JlYXRlSXRlbVN0cmluZzogY3JlYXRlSXRlbVN0cmluZyxcbiAgICBleHBhbmRhYmxlOiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkYXRhKS5sZW5ndGggPiAwXG4gIH0pKTtcbn07XG5cbkpTT05PYmplY3ROb2RlLnByb3BUeXBlcyA9IHtcbiAgZGF0YTogUHJvcFR5cGVzLm9iamVjdCxcbiAgbm9kZVR5cGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxufTtcbmV4cG9ydCBkZWZhdWx0IEpTT05PYmplY3ROb2RlOyIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG52YXIgSlNPTlZhbHVlTm9kZSA9IGZ1bmN0aW9uIEpTT05WYWx1ZU5vZGUoX3JlZikge1xuICB2YXIgbm9kZVR5cGUgPSBfcmVmLm5vZGVUeXBlLFxuICAgICAgc3R5bGluZyA9IF9yZWYuc3R5bGluZyxcbiAgICAgIGxhYmVsUmVuZGVyZXIgPSBfcmVmLmxhYmVsUmVuZGVyZXIsXG4gICAgICBrZXlQYXRoID0gX3JlZi5rZXlQYXRoLFxuICAgICAgdmFsdWVSZW5kZXJlciA9IF9yZWYudmFsdWVSZW5kZXJlcixcbiAgICAgIHZhbHVlID0gX3JlZi52YWx1ZSxcbiAgICAgIF9yZWYkdmFsdWVHZXR0ZXIgPSBfcmVmLnZhbHVlR2V0dGVyLFxuICAgICAgdmFsdWVHZXR0ZXIgPSBfcmVmJHZhbHVlR2V0dGVyID09PSB2b2lkIDAgPyBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gOiBfcmVmJHZhbHVlR2V0dGVyO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCBzdHlsaW5nKCd2YWx1ZScsIG5vZGVUeXBlLCBrZXlQYXRoKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCBzdHlsaW5nKFsnbGFiZWwnLCAndmFsdWVMYWJlbCddLCBub2RlVHlwZSwga2V5UGF0aCksIGxhYmVsUmVuZGVyZXIoa2V5UGF0aCwgbm9kZVR5cGUsIGZhbHNlLCBmYWxzZSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgc3R5bGluZygndmFsdWVUZXh0Jywgbm9kZVR5cGUsIGtleVBhdGgpLCB2YWx1ZVJlbmRlcmVyLmFwcGx5KHZvaWQgMCwgW3ZhbHVlR2V0dGVyKHZhbHVlKSwgdmFsdWVdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoa2V5UGF0aCkpKSkpO1xufTtcblxuSlNPTlZhbHVlTm9kZS5wcm9wVHlwZXMgPSB7XG4gIG5vZGVUeXBlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIHN0eWxpbmc6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGxhYmVsUmVuZGVyZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGtleVBhdGg6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKS5pc1JlcXVpcmVkKS5pc1JlcXVpcmVkLFxuICB2YWx1ZVJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICB2YWx1ZTogUHJvcFR5cGVzLmFueSxcbiAgdmFsdWVHZXR0ZXI6IFByb3BUeXBlcy5mdW5jXG59O1xuZXhwb3J0IGRlZmF1bHQgSlNPTlZhbHVlTm9kZTsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IGNyZWF0ZVN0eWxpbmcgfSBmcm9tICdyZWFjdC1iYXNlMTYtc3R5bGluZyc7XG5pbXBvcnQgc29sYXJpemVkIGZyb20gJy4vdGhlbWVzL3NvbGFyaXplZCc7XG5cbnZhciBjb2xvck1hcCA9IGZ1bmN0aW9uIGNvbG9yTWFwKHRoZW1lKSB7XG4gIHJldHVybiB7XG4gICAgQkFDS0dST1VORF9DT0xPUjogdGhlbWUuYmFzZTAwLFxuICAgIFRFWFRfQ09MT1I6IHRoZW1lLmJhc2UwNyxcbiAgICBTVFJJTkdfQ09MT1I6IHRoZW1lLmJhc2UwQixcbiAgICBEQVRFX0NPTE9SOiB0aGVtZS5iYXNlMEIsXG4gICAgTlVNQkVSX0NPTE9SOiB0aGVtZS5iYXNlMDksXG4gICAgQk9PTEVBTl9DT0xPUjogdGhlbWUuYmFzZTA5LFxuICAgIE5VTExfQ09MT1I6IHRoZW1lLmJhc2UwOCxcbiAgICBVTkRFRklORURfQ09MT1I6IHRoZW1lLmJhc2UwOCxcbiAgICBGVU5DVElPTl9DT0xPUjogdGhlbWUuYmFzZTA4LFxuICAgIFNZTUJPTF9DT0xPUjogdGhlbWUuYmFzZTA4LFxuICAgIExBQkVMX0NPTE9SOiB0aGVtZS5iYXNlMEQsXG4gICAgQVJST1dfQ09MT1I6IHRoZW1lLmJhc2UwRCxcbiAgICBJVEVNX1NUUklOR19DT0xPUjogdGhlbWUuYmFzZTBCLFxuICAgIElURU1fU1RSSU5HX0VYUEFOREVEX0NPTE9SOiB0aGVtZS5iYXNlMDNcbiAgfTtcbn07XG5cbnZhciB2YWx1ZUNvbG9yTWFwID0gZnVuY3Rpb24gdmFsdWVDb2xvck1hcChjb2xvcnMpIHtcbiAgcmV0dXJuIHtcbiAgICBTdHJpbmc6IGNvbG9ycy5TVFJJTkdfQ09MT1IsXG4gICAgRGF0ZTogY29sb3JzLkRBVEVfQ09MT1IsXG4gICAgTnVtYmVyOiBjb2xvcnMuTlVNQkVSX0NPTE9SLFxuICAgIEJvb2xlYW46IGNvbG9ycy5CT09MRUFOX0NPTE9SLFxuICAgIE51bGw6IGNvbG9ycy5OVUxMX0NPTE9SLFxuICAgIFVuZGVmaW5lZDogY29sb3JzLlVOREVGSU5FRF9DT0xPUixcbiAgICBGdW5jdGlvbjogY29sb3JzLkZVTkNUSU9OX0NPTE9SLFxuICAgIFN5bWJvbDogY29sb3JzLlNZTUJPTF9DT0xPUlxuICB9O1xufTtcblxudmFyIGdldERlZmF1bHRUaGVtZVN0eWxpbmcgPSBmdW5jdGlvbiBnZXREZWZhdWx0VGhlbWVTdHlsaW5nKHRoZW1lKSB7XG4gIHZhciBjb2xvcnMgPSBjb2xvck1hcCh0aGVtZSk7XG4gIHJldHVybiB7XG4gICAgdHJlZToge1xuICAgICAgYm9yZGVyOiAwLFxuICAgICAgcGFkZGluZzogMCxcbiAgICAgIG1hcmdpblRvcDogJzAuNWVtJyxcbiAgICAgIG1hcmdpbkJvdHRvbTogJzAuNWVtJyxcbiAgICAgIG1hcmdpbkxlZnQ6ICcwLjEyNWVtJyxcbiAgICAgIG1hcmdpblJpZ2h0OiAwLFxuICAgICAgbGlzdFN0eWxlOiAnbm9uZScsXG4gICAgICBNb3pVc2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICBXZWJraXRVc2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9ycy5CQUNLR1JPVU5EX0NPTE9SXG4gICAgfSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoX3JlZiwgbm9kZVR5cGUsIGtleVBhdGgpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWYuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgcGFkZGluZ1RvcDogJzAuMjVlbScsXG4gICAgICAgICAgcGFkZGluZ1JpZ2h0OiAwLFxuICAgICAgICAgIG1hcmdpbkxlZnQ6ICcwLjg3NWVtJyxcbiAgICAgICAgICBXZWJraXRVc2VyU2VsZWN0OiAndGV4dCcsXG4gICAgICAgICAgTW96VXNlclNlbGVjdDogJ3RleHQnLFxuICAgICAgICAgIHdvcmRXcmFwOiAnYnJlYWstd29yZCcsXG4gICAgICAgICAgcGFkZGluZ0xlZnQ6IGtleVBhdGgubGVuZ3RoID4gMSA/ICcyLjEyNWVtJyA6ICcxLjI1ZW0nLFxuICAgICAgICAgIHRleHRJbmRlbnQ6ICctMC41ZW0nLFxuICAgICAgICAgIHdvcmRCcmVhazogJ2JyZWFrLWFsbCdcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBsYWJlbDoge1xuICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICBjb2xvcjogY29sb3JzLkxBQkVMX0NPTE9SXG4gICAgfSxcbiAgICB2YWx1ZUxhYmVsOiB7XG4gICAgICBtYXJnaW46ICcwIDAuNWVtIDAgMCdcbiAgICB9LFxuICAgIHZhbHVlVGV4dDogZnVuY3Rpb24gdmFsdWVUZXh0KF9yZWYyLCBub2RlVHlwZSkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjIuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgY29sb3I6IHZhbHVlQ29sb3JNYXAoY29sb3JzKVtub2RlVHlwZV1cbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBpdGVtUmFuZ2U6IGZ1bmN0aW9uIGl0ZW1SYW5nZShzdHlsaW5nLCBleHBhbmRlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBwYWRkaW5nVG9wOiBleHBhbmRlZCA/IDAgOiAnMC4yNWVtJyxcbiAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICBjb2xvcjogY29sb3JzLkxBQkVMX0NPTE9SXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICBhcnJvdzogZnVuY3Rpb24gYXJyb3coX3JlZjMsIG5vZGVUeXBlLCBleHBhbmRlZCkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjMuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgbWFyZ2luTGVmdDogMCxcbiAgICAgICAgICB0cmFuc2l0aW9uOiAnMTUwbXMnLFxuICAgICAgICAgIFdlYmtpdFRyYW5zaXRpb246ICcxNTBtcycsXG4gICAgICAgICAgTW96VHJhbnNpdGlvbjogJzE1MG1zJyxcbiAgICAgICAgICBXZWJraXRUcmFuc2Zvcm06IGV4cGFuZGVkID8gJ3JvdGF0ZVooOTBkZWcpJyA6ICdyb3RhdGVaKDBkZWcpJyxcbiAgICAgICAgICBNb3pUcmFuc2Zvcm06IGV4cGFuZGVkID8gJ3JvdGF0ZVooOTBkZWcpJyA6ICdyb3RhdGVaKDBkZWcpJyxcbiAgICAgICAgICB0cmFuc2Zvcm06IGV4cGFuZGVkID8gJ3JvdGF0ZVooOTBkZWcpJyA6ICdyb3RhdGVaKDBkZWcpJyxcbiAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICc0NSUgNTAlJyxcbiAgICAgICAgICBXZWJraXRUcmFuc2Zvcm1PcmlnaW46ICc0NSUgNTAlJyxcbiAgICAgICAgICBNb3pUcmFuc2Zvcm1PcmlnaW46ICc0NSUgNTAlJyxcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICBsaW5lSGVpZ2h0OiAnMS4xZW0nLFxuICAgICAgICAgIGZvbnRTaXplOiAnMC43NWVtJ1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIGFycm93Q29udGFpbmVyOiBmdW5jdGlvbiBhcnJvd0NvbnRhaW5lcihfcmVmNCwgYXJyb3dTdHlsZSkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjQuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgcGFkZGluZ1JpZ2h0OiAnMC41ZW0nLFxuICAgICAgICAgIHBhZGRpbmdMZWZ0OiBhcnJvd1N0eWxlID09PSAnZG91YmxlJyA/ICcxZW0nIDogMCxcbiAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIGFycm93U2lnbjoge1xuICAgICAgY29sb3I6IGNvbG9ycy5BUlJPV19DT0xPUlxuICAgIH0sXG4gICAgYXJyb3dTaWduSW5uZXI6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdG9wOiAwLFxuICAgICAgbGVmdDogJy0wLjRlbSdcbiAgICB9LFxuICAgIG5lc3RlZE5vZGU6IGZ1bmN0aW9uIG5lc3RlZE5vZGUoX3JlZjUsIGtleVBhdGgsIG5vZGVUeXBlLCBleHBhbmRlZCwgZXhwYW5kYWJsZSkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjUuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgcGFkZGluZ1RvcDogJzAuMjVlbScsXG4gICAgICAgICAgbWFyZ2luTGVmdDoga2V5UGF0aC5sZW5ndGggPiAxID8gJzAuODc1ZW0nIDogMCxcbiAgICAgICAgICBwYWRkaW5nTGVmdDogIWV4cGFuZGFibGUgPyAnMS4xMjVlbScgOiAwXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sXG4gICAgcm9vdE5vZGU6IHtcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBtYXJnaW46IDBcbiAgICB9LFxuICAgIG5lc3RlZE5vZGVMYWJlbDogZnVuY3Rpb24gbmVzdGVkTm9kZUxhYmVsKF9yZWY2LCBrZXlQYXRoLCBub2RlVHlwZSwgZXhwYW5kZWQsIGV4cGFuZGFibGUpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWY2LnN0eWxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgIFdlYmtpdFVzZXJTZWxlY3Q6IGV4cGFuZGFibGUgPyAnaW5oZXJpdCcgOiAndGV4dCcsXG4gICAgICAgICAgTW96VXNlclNlbGVjdDogZXhwYW5kYWJsZSA/ICdpbmhlcml0JyA6ICd0ZXh0JyxcbiAgICAgICAgICBjdXJzb3I6IGV4cGFuZGFibGUgPyAncG9pbnRlcicgOiAnZGVmYXVsdCdcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSxcbiAgICBuZXN0ZWROb2RlSXRlbVN0cmluZzogZnVuY3Rpb24gbmVzdGVkTm9kZUl0ZW1TdHJpbmcoX3JlZjcsIGtleVBhdGgsIG5vZGVUeXBlLCBleHBhbmRlZCkge1xuICAgICAgdmFyIHN0eWxlID0gX3JlZjcuc3R5bGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICAgICAgcGFkZGluZ0xlZnQ6ICcwLjVlbScsXG4gICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCcsXG4gICAgICAgICAgY29sb3I6IGV4cGFuZGVkID8gY29sb3JzLklURU1fU1RSSU5HX0VYUEFOREVEX0NPTE9SIDogY29sb3JzLklURU1fU1RSSU5HX0NPTE9SXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgIH0sXG4gICAgbmVzdGVkTm9kZUl0ZW1UeXBlOiB7XG4gICAgICBtYXJnaW5MZWZ0OiAnMC4zZW0nLFxuICAgICAgbWFyZ2luUmlnaHQ6ICcwLjNlbSdcbiAgICB9LFxuICAgIG5lc3RlZE5vZGVDaGlsZHJlbjogZnVuY3Rpb24gbmVzdGVkTm9kZUNoaWxkcmVuKF9yZWY4LCBub2RlVHlwZSwgZXhwYW5kZWQpIHtcbiAgICAgIHZhciBzdHlsZSA9IF9yZWY4LnN0eWxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICAgIGxpc3RTdHlsZTogJ25vbmUnLFxuICAgICAgICAgIGRpc3BsYXk6IGV4cGFuZGVkID8gJ2Jsb2NrJyA6ICdub25lJ1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9LFxuICAgIHJvb3ROb2RlQ2hpbGRyZW46IHtcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBtYXJnaW46IDAsXG4gICAgICBsaXN0U3R5bGU6ICdub25lJ1xuICAgIH1cbiAgfTtcbn07XG5cbnZhciBjcmVhdGVTdHlsaW5nRnJvbVRoZW1lID0gY3JlYXRlU3R5bGluZyhnZXREZWZhdWx0VGhlbWVTdHlsaW5nLCB7XG4gIGRlZmF1bHRCYXNlMTY6IHNvbGFyaXplZFxufSk7XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVTdHlsaW5nRnJvbVRoZW1lOyIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIjtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0ID0gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0gfHwgb1tcIkBAaXRlcmF0b3JcIl07IGlmICghaXQpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gaXQuY2FsbChvKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdC5yZXR1cm4gIT0gbnVsbCkgaXQucmV0dXJuKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBnZXRMZW5ndGgodHlwZSwgY29sbGVjdGlvbikge1xuICBpZiAodHlwZSA9PT0gJ09iamVjdCcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb2xsZWN0aW9uKS5sZW5ndGg7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0FycmF5Jykge1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBJbmZpbml0eTtcbn1cblxuZnVuY3Rpb24gaXNJdGVyYWJsZU1hcChjb2xsZWN0aW9uKSB7XG4gIHJldHVybiB0eXBlb2YgY29sbGVjdGlvbi5zZXQgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGdldEVudHJpZXModHlwZSwgY29sbGVjdGlvbiwgc29ydE9iamVjdEtleXMpIHtcbiAgdmFyIGZyb20gPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IDA7XG4gIHZhciB0byA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogSW5maW5pdHk7XG4gIHZhciByZXM7XG5cbiAgaWYgKHR5cGUgPT09ICdPYmplY3QnKSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjb2xsZWN0aW9uKTtcblxuICAgIGlmIChzb3J0T2JqZWN0S2V5cykge1xuICAgICAga2V5cy5zb3J0KHNvcnRPYmplY3RLZXlzID09PSB0cnVlID8gdW5kZWZpbmVkIDogc29ydE9iamVjdEtleXMpO1xuICAgIH1cblxuICAgIGtleXMgPSBrZXlzLnNsaWNlKGZyb20sIHRvICsgMSk7XG4gICAgcmVzID0ge1xuICAgICAgZW50cmllczoga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHZhbHVlOiBjb2xsZWN0aW9uW2tleV1cbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnQXJyYXknKSB7XG4gICAgcmVzID0ge1xuICAgICAgZW50cmllczogY29sbGVjdGlvbi5zbGljZShmcm9tLCB0byArIDEpLm1hcChmdW5jdGlvbiAodmFsLCBpZHgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBrZXk6IGlkeCArIGZyb20sXG4gICAgICAgICAgdmFsdWU6IHZhbFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHZhciBpZHggPSAwO1xuICAgIHZhciBlbnRyaWVzID0gW107XG4gICAgdmFyIGRvbmUgPSB0cnVlO1xuICAgIHZhciBpc01hcCA9IGlzSXRlcmFibGVNYXAoY29sbGVjdGlvbik7XG5cbiAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoY29sbGVjdGlvbiksXG4gICAgICAgIF9zdGVwO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBpdGVtID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgaWYgKGlkeCA+IHRvKSB7XG4gICAgICAgICAgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyb20gPD0gaWR4KSB7XG4gICAgICAgICAgaWYgKGlzTWFwICYmIEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbVswXSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGl0ZW1bMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiBpdGVtWzBdLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtWzFdXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiW2VudHJ5IFwiLmNvbmNhdChpZHgsIFwiXVwiKSxcbiAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgJ1trZXldJzogaXRlbVswXSxcbiAgICAgICAgICAgICAgICAgICdbdmFsdWVdJzogaXRlbVsxXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgICAgIGtleTogaWR4LFxuICAgICAgICAgICAgICB2YWx1ZTogaXRlbVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWR4Kys7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IuZigpO1xuICAgIH1cblxuICAgIHJlcyA9IHtcbiAgICAgIGhhc01vcmU6ICFkb25lLFxuICAgICAgZW50cmllczogZW50cmllc1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBnZXRSYW5nZXMoZnJvbSwgdG8sIGxpbWl0KSB7XG4gIHZhciByYW5nZXMgPSBbXTtcblxuICB3aGlsZSAodG8gLSBmcm9tID4gbGltaXQgKiBsaW1pdCkge1xuICAgIGxpbWl0ID0gbGltaXQgKiBsaW1pdDtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSBmcm9tOyBpIDw9IHRvOyBpICs9IGxpbWl0KSB7XG4gICAgcmFuZ2VzLnB1c2goe1xuICAgICAgZnJvbTogaSxcbiAgICAgIHRvOiBNYXRoLm1pbih0bywgaSArIGxpbWl0IC0gMSlcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByYW5nZXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbGxlY3Rpb25FbnRyaWVzKHR5cGUsIGNvbGxlY3Rpb24sIHNvcnRPYmplY3RLZXlzLCBsaW1pdCkge1xuICB2YXIgZnJvbSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogMDtcbiAgdmFyIHRvID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiBJbmZpbml0eTtcbiAgdmFyIGdldEVudHJpZXNCb3VuZCA9IGdldEVudHJpZXMuYmluZChudWxsLCB0eXBlLCBjb2xsZWN0aW9uLCBzb3J0T2JqZWN0S2V5cyk7XG5cbiAgaWYgKCFsaW1pdCkge1xuICAgIHJldHVybiBnZXRFbnRyaWVzQm91bmQoKS5lbnRyaWVzO1xuICB9XG5cbiAgdmFyIGlzU3Vic2V0ID0gdG8gPCBJbmZpbml0eTtcbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKHRvIC0gZnJvbSwgZ2V0TGVuZ3RoKHR5cGUsIGNvbGxlY3Rpb24pKTtcblxuICBpZiAodHlwZSAhPT0gJ0l0ZXJhYmxlJykge1xuICAgIGlmIChsZW5ndGggPD0gbGltaXQgfHwgbGltaXQgPCA3KSB7XG4gICAgICByZXR1cm4gZ2V0RW50cmllc0JvdW5kKGZyb20sIHRvKS5lbnRyaWVzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAobGVuZ3RoIDw9IGxpbWl0ICYmICFpc1N1YnNldCkge1xuICAgICAgcmV0dXJuIGdldEVudHJpZXNCb3VuZChmcm9tLCB0bykuZW50cmllcztcbiAgICB9XG4gIH1cblxuICB2YXIgbGltaXRlZEVudHJpZXM7XG5cbiAgaWYgKHR5cGUgPT09ICdJdGVyYWJsZScpIHtcbiAgICB2YXIgX2dldEVudHJpZXNCb3VuZCA9IGdldEVudHJpZXNCb3VuZChmcm9tLCBmcm9tICsgbGltaXQgLSAxKSxcbiAgICAgICAgaGFzTW9yZSA9IF9nZXRFbnRyaWVzQm91bmQuaGFzTW9yZSxcbiAgICAgICAgZW50cmllcyA9IF9nZXRFbnRyaWVzQm91bmQuZW50cmllcztcblxuICAgIGxpbWl0ZWRFbnRyaWVzID0gaGFzTW9yZSA/IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZW50cmllcyksIF90b0NvbnN1bWFibGVBcnJheShnZXRSYW5nZXMoZnJvbSArIGxpbWl0LCBmcm9tICsgMiAqIGxpbWl0IC0gMSwgbGltaXQpKSkgOiBlbnRyaWVzO1xuICB9IGVsc2Uge1xuICAgIGxpbWl0ZWRFbnRyaWVzID0gaXNTdWJzZXQgPyBnZXRSYW5nZXMoZnJvbSwgdG8sIGxpbWl0KSA6IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZ2V0RW50cmllc0JvdW5kKDAsIGxpbWl0IC0gNSkuZW50cmllcyksIF90b0NvbnN1bWFibGVBcnJheShnZXRSYW5nZXMobGltaXQgLSA0LCBsZW5ndGggLSA1LCBsaW1pdCkpLCBfdG9Db25zdW1hYmxlQXJyYXkoZ2V0RW50cmllc0JvdW5kKGxlbmd0aCAtIDQsIGxlbmd0aCAtIDEpLmVudHJpZXMpKTtcbiAgfVxuXG4gIHJldHVybiBsaW1pdGVkRW50cmllcztcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCI7XG52YXIgX2V4Y2x1ZGVkID0gW1wiZGF0YVwiLCBcImtleVBhdGhcIiwgXCJwb3N0cHJvY2Vzc1ZhbHVlXCIsIFwiaGlkZVJvb3RcIiwgXCJ0aGVtZVwiLCBcImludmVydFRoZW1lXCJdO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuLy8gRVM2ICsgaW5saW5lIHN0eWxlIHBvcnQgb2YgSlNPTlZpZXdlciBodHRwczovL2JpdGJ1Y2tldC5vcmcvZGF2ZXZlZGRlci9yZWFjdC1qc29uLXZpZXdlci9cbi8vIGFsbCBjcmVkaXRzIGFuZCBvcmlnaW5hbCBjb2RlIHRvIHRoZSBhdXRob3Jcbi8vIERhdmUgVmVkZGVyIDx2ZWRkZXJtYXRpY0BnbWFpbC5jb20+IGh0dHA6Ly93d3cuZXNraW1vc3B5LmNvbS9cbi8vIHBvcnQgYnkgRGFuaWVsZSBaYW5ub3R0aSBodHRwOi8vd3d3LmdpdGh1Yi5jb20vZHphbm5vdHRpIDxkemFubm90dGlAbWUuY29tPlxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgSlNPTk5vZGUgZnJvbSAnLi9KU09OTm9kZSc7XG5pbXBvcnQgY3JlYXRlU3R5bGluZ0Zyb21UaGVtZSBmcm9tICcuL2NyZWF0ZVN0eWxpbmdGcm9tVGhlbWUnO1xuaW1wb3J0IHsgaW52ZXJ0VGhlbWUgfSBmcm9tICdyZWFjdC1iYXNlMTYtc3R5bGluZyc7XG5cbnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbnZhciBleHBhbmRSb290Tm9kZSA9IGZ1bmN0aW9uIGV4cGFuZFJvb3ROb2RlKGtleVBhdGgsIGRhdGEsIGxldmVsKSB7XG4gIHJldHVybiBsZXZlbCA9PT0gMDtcbn07XG5cbnZhciBkZWZhdWx0SXRlbVN0cmluZyA9IGZ1bmN0aW9uIGRlZmF1bHRJdGVtU3RyaW5nKHR5cGUsIGRhdGEsIGl0ZW1UeXBlLCBpdGVtU3RyaW5nKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgaXRlbVR5cGUsIFwiIFwiLCBpdGVtU3RyaW5nKTtcbn07XG5cbnZhciBkZWZhdWx0TGFiZWxSZW5kZXJlciA9IGZ1bmN0aW9uIGRlZmF1bHRMYWJlbFJlbmRlcmVyKF9yZWYpIHtcbiAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMSksXG4gICAgICBsYWJlbCA9IF9yZWYyWzBdO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgbGFiZWwsIFwiOlwiKTtcbn07XG5cbnZhciBub0N1c3RvbU5vZGUgPSBmdW5jdGlvbiBub0N1c3RvbU5vZGUoKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIGNoZWNrTGVnYWN5VGhlbWluZyh0aGVtZSwgcHJvcHMpIHtcbiAgdmFyIGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kc01hcCA9IHtcbiAgICBnZXRBcnJvd1N0eWxlOiAnYXJyb3cnLFxuICAgIGdldExpc3RTdHlsZTogJ25lc3RlZE5vZGVDaGlsZHJlbicsXG4gICAgZ2V0SXRlbVN0cmluZ1N0eWxlOiAnbmVzdGVkTm9kZUl0ZW1TdHJpbmcnLFxuICAgIGdldExhYmVsU3R5bGU6ICdsYWJlbCcsXG4gICAgZ2V0VmFsdWVTdHlsZTogJ3ZhbHVlVGV4dCdcbiAgfTtcbiAgdmFyIGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kcyA9IE9iamVjdC5rZXlzKGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kc01hcCkuZmlsdGVyKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHByb3BzW25hbWVdO1xuICB9KTtcblxuICBpZiAoZGVwcmVjYXRlZFN0eWxpbmdNZXRob2RzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAodHlwZW9mIHRoZW1lID09PSAnc3RyaW5nJykge1xuICAgICAgdGhlbWUgPSB7XG4gICAgICAgIGV4dGVuZDogdGhlbWVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoZW1lID0gX29iamVjdFNwcmVhZCh7fSwgdGhlbWUpO1xuICAgIH1cblxuICAgIGRlcHJlY2F0ZWRTdHlsaW5nTWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihcIlN0eWxpbmcgbWV0aG9kIFxcXCJcIi5jb25jYXQobmFtZSwgXCJcXFwiIGlzIGRlcHJlY2F0ZWQsIHVzZSBcXFwidGhlbWVcXFwiIHByb3BlcnR5IGluc3RlYWRcIikpO1xuXG4gICAgICB0aGVtZVtkZXByZWNhdGVkU3R5bGluZ01ldGhvZHNNYXBbbmFtZV1dID0gZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgIHZhciBzdHlsZSA9IF9yZWYzLnN0eWxlO1xuXG4gICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCBwcm9wc1tuYW1lXS5hcHBseShwcm9wcywgYXJncykpXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRoZW1lO1xufVxuXG5mdW5jdGlvbiBnZXRTdGF0ZUZyb21Qcm9wcyhwcm9wcykge1xuICB2YXIgdGhlbWUgPSBjaGVja0xlZ2FjeVRoZW1pbmcocHJvcHMudGhlbWUsIHByb3BzKTtcblxuICBpZiAocHJvcHMuaW52ZXJ0VGhlbWUpIHtcbiAgICB0aGVtZSA9IGludmVydFRoZW1lKHRoZW1lKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3R5bGluZzogY3JlYXRlU3R5bGluZ0Zyb21UaGVtZSh0aGVtZSlcbiAgfTtcbn1cblxuZXhwb3J0IHZhciBKU09OVHJlZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoSlNPTlRyZWUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoSlNPTlRyZWUpO1xuXG4gIGZ1bmN0aW9uIEpTT05UcmVlKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEpTT05UcmVlKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpO1xuICAgIF90aGlzLnN0YXRlID0gZ2V0U3RhdGVGcm9tUHJvcHMocHJvcHMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhKU09OVHJlZSwgW3tcbiAgICBrZXk6IFwiVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKFsndGhlbWUnLCAnaW52ZXJ0VGhlbWUnXS5maW5kKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldHVybiBuZXh0UHJvcHNba10gIT09IF90aGlzMi5wcm9wc1trXTtcbiAgICAgIH0pKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoZ2V0U3RhdGVGcm9tUHJvcHMobmV4dFByb3BzKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgcmV0dXJuICEhT2JqZWN0LmtleXMobmV4dFByb3BzKS5maW5kKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldHVybiBrID09PSAna2V5UGF0aCcgPyBuZXh0UHJvcHNba10uam9pbignLycpICE9PSBfdGhpczMucHJvcHNba10uam9pbignLycpIDogbmV4dFByb3BzW2tdICE9PSBfdGhpczMucHJvcHNba107XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wcy5kYXRhLFxuICAgICAgICAgIGtleVBhdGggPSBfdGhpcyRwcm9wcy5rZXlQYXRoLFxuICAgICAgICAgIHBvc3Rwcm9jZXNzVmFsdWUgPSBfdGhpcyRwcm9wcy5wb3N0cHJvY2Vzc1ZhbHVlLFxuICAgICAgICAgIGhpZGVSb290ID0gX3RoaXMkcHJvcHMuaGlkZVJvb3QsXG4gICAgICAgICAgdGhlbWUgPSBfdGhpcyRwcm9wcy50aGVtZSxcbiAgICAgICAgICBfID0gX3RoaXMkcHJvcHMuaW52ZXJ0VGhlbWUsXG4gICAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdGhpcyRwcm9wcywgX2V4Y2x1ZGVkKTtcblxuICAgICAgdmFyIHN0eWxpbmcgPSB0aGlzLnN0YXRlLnN0eWxpbmc7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCBzdHlsaW5nKCd0cmVlJyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEpTT05Ob2RlLCBfZXh0ZW5kcyh7fSwgX29iamVjdFNwcmVhZCh7XG4gICAgICAgIHBvc3Rwcm9jZXNzVmFsdWU6IHBvc3Rwcm9jZXNzVmFsdWUsXG4gICAgICAgIGhpZGVSb290OiBoaWRlUm9vdCxcbiAgICAgICAgc3R5bGluZzogc3R5bGluZ1xuICAgICAgfSwgcmVzdCksIHtcbiAgICAgICAga2V5UGF0aDogaGlkZVJvb3QgPyBbXSA6IGtleVBhdGgsXG4gICAgICAgIHZhbHVlOiBwb3N0cHJvY2Vzc1ZhbHVlKHZhbHVlKVxuICAgICAgfSkpKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSlNPTlRyZWU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKU09OVHJlZSwgXCJwcm9wVHlwZXNcIiwge1xuICBkYXRhOiBQcm9wVHlwZXMuYW55LFxuICBoaWRlUm9vdDogUHJvcFR5cGVzLmJvb2wsXG4gIHRoZW1lOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuc3RyaW5nXSksXG4gIGludmVydFRoZW1lOiBQcm9wVHlwZXMuYm9vbCxcbiAga2V5UGF0aDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pKSxcbiAgcG9zdHByb2Nlc3NWYWx1ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIHNvcnRPYmplY3RLZXlzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLmJvb2xdKVxufSk7XG5cbl9kZWZpbmVQcm9wZXJ0eShKU09OVHJlZSwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBzaG91bGRFeHBhbmROb2RlOiBleHBhbmRSb290Tm9kZSxcbiAgaGlkZVJvb3Q6IGZhbHNlLFxuICBrZXlQYXRoOiBbJ3Jvb3QnXSxcbiAgZ2V0SXRlbVN0cmluZzogZGVmYXVsdEl0ZW1TdHJpbmcsXG4gIGxhYmVsUmVuZGVyZXI6IGRlZmF1bHRMYWJlbFJlbmRlcmVyLFxuICB2YWx1ZVJlbmRlcmVyOiBpZGVudGl0eSxcbiAgcG9zdHByb2Nlc3NWYWx1ZTogaWRlbnRpdHksXG4gIGlzQ3VzdG9tTm9kZTogbm9DdXN0b21Ob2RlLFxuICBjb2xsZWN0aW9uTGltaXQ6IDUwLFxuICBpbnZlcnRUaGVtZTogdHJ1ZVxufSk7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb2JqVHlwZShvYmopIHtcbiAgdmFyIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKS5zbGljZSg4LCAtMSk7XG5cbiAgaWYgKHR5cGUgPT09ICdPYmplY3QnICYmIHR5cGVvZiBvYmpbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiAnSXRlcmFibGUnO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09ICdDdXN0b20nICYmIG9iai5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIG9iaiBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgIC8vIEZvciBwcm9qZWN0cyBpbXBsZW1lbnRpbmcgb2JqZWN0cyBvdmVycmlkaW5nIGAucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ11gXG4gICAgcmV0dXJuICdPYmplY3QnO1xuICB9XG5cbiAgcmV0dXJuIHR5cGU7XG59IiwiZXhwb3J0IGRlZmF1bHQge1xuICBzY2hlbWU6ICdzb2xhcml6ZWQnLFxuICBhdXRob3I6ICdldGhhbiBzY2hvb25vdmVyIChodHRwOi8vZXRoYW5zY2hvb25vdmVyLmNvbS9zb2xhcml6ZWQpJyxcbiAgYmFzZTAwOiAnIzAwMmIzNicsXG4gIGJhc2UwMTogJyMwNzM2NDInLFxuICBiYXNlMDI6ICcjNTg2ZTc1JyxcbiAgYmFzZTAzOiAnIzY1N2I4MycsXG4gIGJhc2UwNDogJyM4Mzk0OTYnLFxuICBiYXNlMDU6ICcjOTNhMWExJyxcbiAgYmFzZTA2OiAnI2VlZThkNScsXG4gIGJhc2UwNzogJyNmZGY2ZTMnLFxuICBiYXNlMDg6ICcjZGMzMjJmJyxcbiAgYmFzZTA5OiAnI2NiNGIxNicsXG4gIGJhc2UwQTogJyNiNTg5MDAnLFxuICBiYXNlMEI6ICcjODU5OTAwJyxcbiAgYmFzZTBDOiAnIzJhYTE5OCcsXG4gIGJhc2UwRDogJyMyNjhiZDInLFxuICBiYXNlMEU6ICcjNmM3MWM0JyxcbiAgYmFzZTBGOiAnI2QzMzY4Midcbn07IiwiaW1wb3J0IGludmFyaWFudCBmcm9tICdpbnZhcmlhbnQnO1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi91dGlscy9pc0Z1bmN0aW9uJztcbmltcG9ydCBpZGVudGl0eSBmcm9tICcuL3V0aWxzL2lkZW50aXR5JztcbmltcG9ydCBpc051bGwgZnJvbSAnLi91dGlscy9pc051bGwnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlQWN0aW9uKHR5cGUsIHBheWxvYWRDcmVhdG9yLCBtZXRhQ3JlYXRvcikge1xuICBpZiAocGF5bG9hZENyZWF0b3IgPT09IHZvaWQgMCkge1xuICAgIHBheWxvYWRDcmVhdG9yID0gaWRlbnRpdHk7XG4gIH1cblxuICBpbnZhcmlhbnQoaXNGdW5jdGlvbihwYXlsb2FkQ3JlYXRvcikgfHwgaXNOdWxsKHBheWxvYWRDcmVhdG9yKSwgJ0V4cGVjdGVkIHBheWxvYWRDcmVhdG9yIHRvIGJlIGEgZnVuY3Rpb24sIHVuZGVmaW5lZCBvciBudWxsJyk7XG4gIHZhciBmaW5hbFBheWxvYWRDcmVhdG9yID0gaXNOdWxsKHBheWxvYWRDcmVhdG9yKSB8fCBwYXlsb2FkQ3JlYXRvciA9PT0gaWRlbnRpdHkgPyBpZGVudGl0eSA6IGZ1bmN0aW9uIChoZWFkKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWQgaW5zdGFuY2VvZiBFcnJvciA/IGhlYWQgOiBwYXlsb2FkQ3JlYXRvci5hcHBseSh2b2lkIDAsIFtoZWFkXS5jb25jYXQoYXJncykpO1xuICB9O1xuICB2YXIgaGFzTWV0YSA9IGlzRnVuY3Rpb24obWV0YUNyZWF0b3IpO1xuICB2YXIgdHlwZVN0cmluZyA9IHR5cGUudG9TdHJpbmcoKTtcblxuICB2YXIgYWN0aW9uQ3JlYXRvciA9IGZ1bmN0aW9uIGFjdGlvbkNyZWF0b3IoKSB7XG4gICAgdmFyIHBheWxvYWQgPSBmaW5hbFBheWxvYWRDcmVhdG9yLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICB2YXIgYWN0aW9uID0ge1xuICAgICAgdHlwZTogdHlwZVxuICAgIH07XG5cbiAgICBpZiAocGF5bG9hZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBhY3Rpb24uZXJyb3IgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwYXlsb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFjdGlvbi5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICB9XG5cbiAgICBpZiAoaGFzTWV0YSkge1xuICAgICAgYWN0aW9uLm1ldGEgPSBtZXRhQ3JlYXRvci5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvbjtcbiAgfTtcblxuICBhY3Rpb25DcmVhdG9yLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0eXBlU3RyaW5nO1xuICB9O1xuXG4gIHJldHVybiBhY3Rpb25DcmVhdG9yO1xufSIsImV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufSk7IiwiZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufSk7IiwiZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG59KTsiLCIvKiogQSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBwb3RlbnRpYWwgXCJleHRyYSBhcmd1bWVudFwiIHZhbHVlIHRvIGJlIGluamVjdGVkIGxhdGVyLFxyXG4gKiBhbmQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgdGh1bmsgbWlkZGxld2FyZSB0aGF0IHVzZXMgdGhhdCB2YWx1ZVxyXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVRodW5rTWlkZGxld2FyZShleHRyYUFyZ3VtZW50KSB7XG4gIC8vIFN0YW5kYXJkIFJlZHV4IG1pZGRsZXdhcmUgZGVmaW5pdGlvbiBwYXR0ZXJuOlxuICAvLyBTZWU6IGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI3dyaXRpbmctY3VzdG9tLW1pZGRsZXdhcmVcbiAgdmFyIG1pZGRsZXdhcmUgPSBmdW5jdGlvbiBtaWRkbGV3YXJlKF9yZWYpIHtcbiAgICB2YXIgZGlzcGF0Y2ggPSBfcmVmLmRpc3BhdGNoLFxuICAgICAgICBnZXRTdGF0ZSA9IF9yZWYuZ2V0U3RhdGU7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICAvLyBUaGUgdGh1bmsgbWlkZGxld2FyZSBsb29rcyBmb3IgYW55IGZ1bmN0aW9ucyB0aGF0IHdlcmUgcGFzc2VkIHRvIGBzdG9yZS5kaXNwYXRjaGAuXG4gICAgICAgIC8vIElmIHRoaXMgXCJhY3Rpb25cIiBpcyByZWFsbHkgYSBmdW5jdGlvbiwgY2FsbCBpdCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuXG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gSW5qZWN0IHRoZSBzdG9yZSdzIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgbWV0aG9kcywgYXMgd2VsbCBhcyBhbnkgXCJleHRyYSBhcmdcIlxuICAgICAgICAgIHJldHVybiBhY3Rpb24oZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYUFyZ3VtZW50KTtcbiAgICAgICAgfSAvLyBPdGhlcndpc2UsIHBhc3MgdGhlIGFjdGlvbiBkb3duIHRoZSBtaWRkbGV3YXJlIGNoYWluIGFzIHVzdWFsXG5cblxuICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiBtaWRkbGV3YXJlO1xufVxuXG52YXIgdGh1bmsgPSBjcmVhdGVUaHVua01pZGRsZXdhcmUoKTsgLy8gQXR0YWNoIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIHNvIHVzZXJzIGNhbiBjcmVhdGUgYSBjdXN0b21pemVkIHZlcnNpb25cbi8vIHdpdGggd2hhdGV2ZXIgXCJleHRyYSBhcmdcIiB0aGV5IHdhbnQgdG8gaW5qZWN0IGludG8gdGhlaXIgdGh1bmtzXG5cbnRodW5rLndpdGhFeHRyYUFyZ3VtZW50ID0gY3JlYXRlVGh1bmtNaWRkbGV3YXJlO1xuZXhwb3J0IGRlZmF1bHQgdGh1bms7IiwiaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMic7XG5cbi8qKlxuICogQWRhcHRlZCBmcm9tIFJlYWN0OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2hhcmVkL2Zvcm1hdFByb2RFcnJvck1lc3NhZ2UuanNcbiAqXG4gKiBEbyBub3QgcmVxdWlyZSB0aGlzIG1vZHVsZSBkaXJlY3RseSEgVXNlIG5vcm1hbCB0aHJvdyBlcnJvciBjYWxscy4gVGhlc2UgbWVzc2FnZXMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGVycm9yIGNvZGVzXG4gKiBkdXJpbmcgYnVpbGQuXG4gKiBAcGFyYW0ge251bWJlcn0gY29kZVxuICovXG5mdW5jdGlvbiBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKGNvZGUpIHtcbiAgcmV0dXJuIFwiTWluaWZpZWQgUmVkdXggZXJyb3IgI1wiICsgY29kZSArIFwiOyB2aXNpdCBodHRwczovL3JlZHV4LmpzLm9yZy9FcnJvcnM/Y29kZT1cIiArIGNvZGUgKyBcIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciBcIiArICd1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzLiAnO1xufVxuXG4vLyBJbmxpbmVkIHZlcnNpb24gb2YgdGhlIGBzeW1ib2wtb2JzZXJ2YWJsZWAgcG9seWZpbGxcbnZhciAkJG9ic2VydmFibGUgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wub2JzZXJ2YWJsZSB8fCAnQEBvYnNlcnZhYmxlJztcbn0pKCk7XG5cbi8qKlxuICogVGhlc2UgYXJlIHByaXZhdGUgYWN0aW9uIHR5cGVzIHJlc2VydmVkIGJ5IFJlZHV4LlxuICogRm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqIElmIHRoZSBjdXJyZW50IHN0YXRlIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLlxuICogRG8gbm90IHJlZmVyZW5jZSB0aGVzZSBhY3Rpb24gdHlwZXMgZGlyZWN0bHkgaW4geW91ciBjb2RlLlxuICovXG52YXIgcmFuZG9tU3RyaW5nID0gZnVuY3Rpb24gcmFuZG9tU3RyaW5nKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyk7XG59O1xuXG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6IFwiQEByZWR1eC9JTklUXCIgKyByYW5kb21TdHJpbmcoKSxcbiAgUkVQTEFDRTogXCJAQHJlZHV4L1JFUExBQ0VcIiArIHJhbmRvbVN0cmluZygpLFxuICBQUk9CRV9VTktOT1dOX0FDVElPTjogZnVuY3Rpb24gUFJPQkVfVU5LTk9XTl9BQ1RJT04oKSB7XG4gICAgcmV0dXJuIFwiQEByZWR1eC9QUk9CRV9VTktOT1dOX0FDVElPTlwiICsgcmFuZG9tU3RyaW5nKCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICB2YXIgcHJvdG8gPSBvYmo7XG5cbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IHByb3RvO1xufVxuXG4vLyBJbmxpbmVkIC8gc2hvcnRlbmVkIHZlcnNpb24gb2YgYGtpbmRPZmAgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9raW5kLW9mXG5mdW5jdGlvbiBtaW5pS2luZE9mKHZhbCkge1xuICBpZiAodmFsID09PSB2b2lkIDApIHJldHVybiAndW5kZWZpbmVkJztcbiAgaWYgKHZhbCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzeW1ib2wnOlxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gJ2FycmF5JztcbiAgaWYgKGlzRGF0ZSh2YWwpKSByZXR1cm4gJ2RhdGUnO1xuICBpZiAoaXNFcnJvcih2YWwpKSByZXR1cm4gJ2Vycm9yJztcbiAgdmFyIGNvbnN0cnVjdG9yTmFtZSA9IGN0b3JOYW1lKHZhbCk7XG5cbiAgc3dpdGNoIChjb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICBjYXNlICdTeW1ib2wnOlxuICAgIGNhc2UgJ1Byb21pc2UnOlxuICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgIGNhc2UgJ01hcCc6XG4gICAgY2FzZSAnU2V0JzpcbiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck5hbWU7XG4gIH0gLy8gb3RoZXJcblxuXG4gIHJldHVybiB0eXBlLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGN0b3JOYW1lKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyA/IHZhbC5jb25zdHJ1Y3Rvci5uYW1lIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNFcnJvcih2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiB2YWwubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgdmFsLmNvbnN0cnVjdG9yICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3Iuc3RhY2tUcmFjZUxpbWl0ID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiB0eXBlb2YgdmFsLnRvRGF0ZVN0cmluZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsLmdldERhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbC5zZXREYXRlID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBraW5kT2YodmFsKSB7XG4gIHZhciB0eXBlT2ZWYWwgPSB0eXBlb2YgdmFsO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdHlwZU9mVmFsID0gbWluaUtpbmRPZih2YWwpO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVPZlZhbDtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICpcbiAqICoqV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBgY29uZmlndXJlU3RvcmVgIG1ldGhvZFxuICogb2YgdGhlIGBAcmVkdXhqcy90b29sa2l0YCBwYWNrYWdlKiosIHdoaWNoIHJlcGxhY2VzIGBjcmVhdGVTdG9yZWAuXG4gKlxuICogUmVkdXggVG9vbGtpdCBpcyBvdXIgcmVjb21tZW5kZWQgYXBwcm9hY2ggZm9yIHdyaXRpbmcgUmVkdXggbG9naWMgdG9kYXksXG4gKiBpbmNsdWRpbmcgc3RvcmUgc2V0dXAsIHJlZHVjZXJzLCBkYXRhIGZldGNoaW5nLCBhbmQgbW9yZS5cbiAqXG4gKiAqKkZvciBtb3JlIGRldGFpbHMsIHBsZWFzZSByZWFkIHRoaXMgUmVkdXggZG9jcyBwYWdlOioqXG4gKiAqKmh0dHBzOi8vcmVkdXguanMub3JnL2ludHJvZHVjdGlvbi93aHktcnRrLWlzLXJlZHV4LXRvZGF5KipcbiAqXG4gKiBgY29uZmlndXJlU3RvcmVgIGZyb20gUmVkdXggVG9vbGtpdCBpcyBhbiBpbXByb3ZlZCB2ZXJzaW9uIG9mIGBjcmVhdGVTdG9yZWAgdGhhdFxuICogc2ltcGxpZmllcyBzZXR1cCBhbmQgaGVscHMgYXZvaWQgY29tbW9uIGJ1Z3MuXG4gKlxuICogWW91IHNob3VsZCBub3QgYmUgdXNpbmcgdGhlIGByZWR1eGAgY29yZSBwYWNrYWdlIGJ5IGl0c2VsZiB0b2RheSwgZXhjZXB0IGZvciBsZWFybmluZyBwdXJwb3Nlcy5cbiAqIFRoZSBgY3JlYXRlU3RvcmVgIG1ldGhvZCBmcm9tIHRoZSBjb3JlIGByZWR1eGAgcGFja2FnZSB3aWxsIG5vdCBiZSByZW1vdmVkLCBidXQgd2UgZW5jb3VyYWdlXG4gKiBhbGwgdXNlcnMgdG8gbWlncmF0ZSB0byB1c2luZyBSZWR1eCBUb29sa2l0IGZvciBhbGwgUmVkdXggY29kZS5cbiAqXG4gKiBJZiB5b3Ugd2FudCB0byB1c2UgYGNyZWF0ZVN0b3JlYCB3aXRob3V0IHRoaXMgdmlzdWFsIGRlcHJlY2F0aW9uIHdhcm5pbmcsIHVzZVxuICogdGhlIGBsZWdhY3lfY3JlYXRlU3RvcmVgIGltcG9ydCBpbnN0ZWFkOlxuICpcbiAqIGBpbXBvcnQgeyBsZWdhY3lfY3JlYXRlU3RvcmUgYXMgY3JlYXRlU3RvcmV9IGZyb20gJ3JlZHV4J2BcbiAqXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIHZhciBfcmVmMjtcblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZW5oYW5jZXIgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDApIDogJ0l0IGxvb2tzIGxpa2UgeW91IGFyZSBwYXNzaW5nIHNldmVyYWwgc3RvcmUgZW5oYW5jZXJzIHRvICcgKyAnY3JlYXRlU3RvcmUoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkLCBjb21wb3NlIHRoZW0gJyArICd0b2dldGhlciB0byBhIHNpbmdsZSBmdW5jdGlvbi4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI2NyZWF0aW5nLWEtc3RvcmUtd2l0aC1lbmhhbmNlcnMgZm9yIGFuIGV4YW1wbGUuJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBlbmhhbmNlciA9IHByZWxvYWRlZFN0YXRlO1xuICAgIHByZWxvYWRlZFN0YXRlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxKSA6IFwiRXhwZWN0ZWQgdGhlIGVuaGFuY2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YoZW5oYW5jZXIpICsgXCInXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlcihjcmVhdGVTdG9yZSkocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMikgOiBcIkV4cGVjdGVkIHRoZSByb290IHJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihyZWR1Y2VyKSArIFwiJ1wiKTtcbiAgfVxuXG4gIHZhciBjdXJyZW50UmVkdWNlciA9IHJlZHVjZXI7XG4gIHZhciBjdXJyZW50U3RhdGUgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgdmFyIGN1cnJlbnRMaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzO1xuICB2YXIgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAvKipcbiAgICogVGhpcyBtYWtlcyBhIHNoYWxsb3cgY29weSBvZiBjdXJyZW50TGlzdGVuZXJzIHNvIHdlIGNhbiB1c2VcbiAgICogbmV4dExpc3RlbmVycyBhcyBhIHRlbXBvcmFyeSBsaXN0IHdoaWxlIGRpc3BhdGNoaW5nLlxuICAgKlxuICAgKiBUaGlzIHByZXZlbnRzIGFueSBidWdzIGFyb3VuZCBjb25zdW1lcnMgY2FsbGluZ1xuICAgKiBzdWJzY3JpYmUvdW5zdWJzY3JpYmUgaW4gdGhlIG1pZGRsZSBvZiBhIGRpc3BhdGNoLlxuICAgKi9cblxuICBmdW5jdGlvbiBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCkge1xuICAgIGlmIChuZXh0TGlzdGVuZXJzID09PSBjdXJyZW50TGlzdGVuZXJzKSB7XG4gICAgICBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycy5zbGljZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVhZHMgdGhlIHN0YXRlIHRyZWUgbWFuYWdlZCBieSB0aGUgc3RvcmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSBjdXJyZW50IHN0YXRlIHRyZWUgb2YgeW91ciBhcHBsaWNhdGlvbi5cbiAgICovXG5cblxuICBmdW5jdGlvbiBnZXRTdGF0ZSgpIHtcbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMykgOiAnWW91IG1heSBub3QgY2FsbCBzdG9yZS5nZXRTdGF0ZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdUaGUgcmVkdWNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCB0aGUgc3RhdGUgYXMgYW4gYXJndW1lbnQuICcgKyAnUGFzcyBpdCBkb3duIGZyb20gdGhlIHRvcCByZWR1Y2VyIGluc3RlYWQgb2YgcmVhZGluZyBpdCBmcm9tIHRoZSBzdG9yZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFN0YXRlO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgY2hhbmdlIGxpc3RlbmVyLiBJdCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSBhbiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCxcbiAgICogYW5kIHNvbWUgcGFydCBvZiB0aGUgc3RhdGUgdHJlZSBtYXkgcG90ZW50aWFsbHkgaGF2ZSBjaGFuZ2VkLiBZb3UgbWF5IHRoZW5cbiAgICogY2FsbCBgZ2V0U3RhdGUoKWAgdG8gcmVhZCB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFlvdSBtYXkgY2FsbCBgZGlzcGF0Y2goKWAgZnJvbSBhIGNoYW5nZSBsaXN0ZW5lciwgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAqIGNhdmVhdHM6XG4gICAqXG4gICAqIDEuIFRoZSBzdWJzY3JpcHRpb25zIGFyZSBzbmFwc2hvdHRlZCBqdXN0IGJlZm9yZSBldmVyeSBgZGlzcGF0Y2goKWAgY2FsbC5cbiAgICogSWYgeW91IHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSB3aGlsZSB0aGUgbGlzdGVuZXJzIGFyZSBiZWluZyBpbnZva2VkLCB0aGlzXG4gICAqIHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdCBvbiB0aGUgYGRpc3BhdGNoKClgIHRoYXQgaXMgY3VycmVudGx5IGluIHByb2dyZXNzLlxuICAgKiBIb3dldmVyLCB0aGUgbmV4dCBgZGlzcGF0Y2goKWAgY2FsbCwgd2hldGhlciBuZXN0ZWQgb3Igbm90LCB3aWxsIHVzZSBhIG1vcmVcbiAgICogcmVjZW50IHNuYXBzaG90IG9mIHRoZSBzdWJzY3JpcHRpb24gbGlzdC5cbiAgICpcbiAgICogMi4gVGhlIGxpc3RlbmVyIHNob3VsZCBub3QgZXhwZWN0IHRvIHNlZSBhbGwgc3RhdGUgY2hhbmdlcywgYXMgdGhlIHN0YXRlXG4gICAqIG1pZ2h0IGhhdmUgYmVlbiB1cGRhdGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBhIG5lc3RlZCBgZGlzcGF0Y2goKWAgYmVmb3JlXG4gICAqIHRoZSBsaXN0ZW5lciBpcyBjYWxsZWQuIEl0IGlzLCBob3dldmVyLCBndWFyYW50ZWVkIHRoYXQgYWxsIHN1YnNjcmliZXJzXG4gICAqIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBgZGlzcGF0Y2goKWAgc3RhcnRlZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBsYXRlc3RcbiAgICogc3RhdGUgYnkgdGhlIHRpbWUgaXQgZXhpdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBvbiBldmVyeSBkaXNwYXRjaC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGlzIGNoYW5nZSBsaXN0ZW5lci5cbiAgICovXG5cblxuICBmdW5jdGlvbiBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg0KSA6IFwiRXhwZWN0ZWQgdGhlIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YobGlzdGVuZXIpICsgXCInXCIpO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg1KSA6ICdZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLnN1YnNjcmliZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdJZiB5b3Ugd291bGQgbGlrZSB0byBiZSBub3RpZmllZCBhZnRlciB0aGUgc3RvcmUgaGFzIGJlZW4gdXBkYXRlZCwgc3Vic2NyaWJlIGZyb20gYSAnICsgJ2NvbXBvbmVudCBhbmQgaW52b2tlIHN0b3JlLmdldFN0YXRlKCkgaW4gdGhlIGNhbGxiYWNrIHRvIGFjY2VzcyB0aGUgbGF0ZXN0IHN0YXRlLiAnICsgJ1NlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGkvc3RvcmUjc3Vic2NyaWJlbGlzdGVuZXIgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICB9XG5cbiAgICB2YXIgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgbmV4dExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICBpZiAoIWlzU3Vic2NyaWJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDYpIDogJ1lvdSBtYXkgbm90IHVuc3Vic2NyaWJlIGZyb20gYSBzdG9yZSBsaXN0ZW5lciB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICAgICAgfVxuXG4gICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICAgIHZhciBpbmRleCA9IG5leHRMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICBuZXh0TGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBjdXJyZW50TGlzdGVuZXJzID0gbnVsbDtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGFjdGlvbi4gSXQgaXMgdGhlIG9ubHkgd2F5IHRvIHRyaWdnZXIgYSBzdGF0ZSBjaGFuZ2UuXG4gICAqXG4gICAqIFRoZSBgcmVkdWNlcmAgZnVuY3Rpb24sIHVzZWQgdG8gY3JlYXRlIHRoZSBzdG9yZSwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcbiAgICogY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgZ2l2ZW4gYGFjdGlvbmAuIEl0cyByZXR1cm4gdmFsdWUgd2lsbFxuICAgKiBiZSBjb25zaWRlcmVkIHRoZSAqKm5leHQqKiBzdGF0ZSBvZiB0aGUgdHJlZSwgYW5kIHRoZSBjaGFuZ2UgbGlzdGVuZXJzXG4gICAqIHdpbGwgYmUgbm90aWZpZWQuXG4gICAqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgcGxhaW4gb2JqZWN0IGFjdGlvbnMuIElmIHlvdSB3YW50IHRvXG4gICAqIGRpc3BhdGNoIGEgUHJvbWlzZSwgYW4gT2JzZXJ2YWJsZSwgYSB0aHVuaywgb3Igc29tZXRoaW5nIGVsc2UsIHlvdSBuZWVkIHRvXG4gICAqIHdyYXAgeW91ciBzdG9yZSBjcmVhdGluZyBmdW5jdGlvbiBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIG1pZGRsZXdhcmUuIEZvclxuICAgKiBleGFtcGxlLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UuIEV2ZW4gdGhlXG4gICAqIG1pZGRsZXdhcmUgd2lsbCBldmVudHVhbGx5IGRpc3BhdGNoIHBsYWluIG9iamVjdCBhY3Rpb25zIHVzaW5nIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIEEgcGxhaW4gb2JqZWN0IHJlcHJlc2VudGluZyDigJx3aGF0IGNoYW5nZWTigJ0uIEl0IGlzXG4gICAqIGEgZ29vZCBpZGVhIHRvIGtlZXAgYWN0aW9ucyBzZXJpYWxpemFibGUgc28geW91IGNhbiByZWNvcmQgYW5kIHJlcGxheSB1c2VyXG4gICAqIHNlc3Npb25zLCBvciB1c2UgdGhlIHRpbWUgdHJhdmVsbGluZyBgcmVkdXgtZGV2dG9vbHNgLiBBbiBhY3Rpb24gbXVzdCBoYXZlXG4gICAqIGEgYHR5cGVgIHByb3BlcnR5IHdoaWNoIG1heSBub3QgYmUgYHVuZGVmaW5lZGAuIEl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZVxuICAgKiBzdHJpbmcgY29uc3RhbnRzIGZvciBhY3Rpb24gdHlwZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEZvciBjb252ZW5pZW5jZSwgdGhlIHNhbWUgYWN0aW9uIG9iamVjdCB5b3UgZGlzcGF0Y2hlZC5cbiAgICpcbiAgICogTm90ZSB0aGF0LCBpZiB5b3UgdXNlIGEgY3VzdG9tIG1pZGRsZXdhcmUsIGl0IG1heSB3cmFwIGBkaXNwYXRjaCgpYCB0b1xuICAgKiByZXR1cm4gc29tZXRoaW5nIGVsc2UgKGZvciBleGFtcGxlLCBhIFByb21pc2UgeW91IGNhbiBhd2FpdCkuXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDcpIDogXCJBY3Rpb25zIG11c3QgYmUgcGxhaW4gb2JqZWN0cy4gSW5zdGVhZCwgdGhlIGFjdHVhbCB0eXBlIHdhczogJ1wiICsga2luZE9mKGFjdGlvbikgKyBcIicuIFlvdSBtYXkgbmVlZCB0byBhZGQgbWlkZGxld2FyZSB0byB5b3VyIHN0b3JlIHNldHVwIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBvdGhlciB2YWx1ZXMsIHN1Y2ggYXMgJ3JlZHV4LXRodW5rJyB0byBoYW5kbGUgZGlzcGF0Y2hpbmcgZnVuY3Rpb25zLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTQtc3RvcmUjbWlkZGxld2FyZSBhbmQgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTYtYXN5bmMtbG9naWMjdXNpbmctdGhlLXJlZHV4LXRodW5rLW1pZGRsZXdhcmUgZm9yIGV4YW1wbGVzLlwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOCkgOiAnQWN0aW9ucyBtYXkgbm90IGhhdmUgYW4gdW5kZWZpbmVkIFwidHlwZVwiIHByb3BlcnR5LiBZb3UgbWF5IGhhdmUgbWlzc3BlbGxlZCBhbiBhY3Rpb24gdHlwZSBzdHJpbmcgY29uc3RhbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDkpIDogJ1JlZHVjZXJzIG1heSBub3QgZGlzcGF0Y2ggYWN0aW9ucy4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IHRydWU7XG4gICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50UmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycyA9IG5leHRMaXN0ZW5lcnM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgbGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgcmVkdWNlciBjdXJyZW50bHkgdXNlZCBieSB0aGUgc3RvcmUgdG8gY2FsY3VsYXRlIHRoZSBzdGF0ZS5cbiAgICpcbiAgICogWW91IG1pZ2h0IG5lZWQgdGhpcyBpZiB5b3VyIGFwcCBpbXBsZW1lbnRzIGNvZGUgc3BsaXR0aW5nIGFuZCB5b3Ugd2FudCB0b1xuICAgKiBsb2FkIHNvbWUgb2YgdGhlIHJlZHVjZXJzIGR5bmFtaWNhbGx5LiBZb3UgbWlnaHQgYWxzbyBuZWVkIHRoaXMgaWYgeW91XG4gICAqIGltcGxlbWVudCBhIGhvdCByZWxvYWRpbmcgbWVjaGFuaXNtIGZvciBSZWR1eC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dFJlZHVjZXIgVGhlIHJlZHVjZXIgZm9yIHRoZSBzdG9yZSB0byB1c2UgaW5zdGVhZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMCkgOiBcIkV4cGVjdGVkIHRoZSBuZXh0UmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKG5leHRSZWR1Y2VyKSk7XG4gICAgfVxuXG4gICAgY3VycmVudFJlZHVjZXIgPSBuZXh0UmVkdWNlcjsgLy8gVGhpcyBhY3Rpb24gaGFzIGEgc2ltaWxpYXIgZWZmZWN0IHRvIEFjdGlvblR5cGVzLklOSVQuXG4gICAgLy8gQW55IHJlZHVjZXJzIHRoYXQgZXhpc3RlZCBpbiBib3RoIHRoZSBuZXcgYW5kIG9sZCByb290UmVkdWNlclxuICAgIC8vIHdpbGwgcmVjZWl2ZSB0aGUgcHJldmlvdXMgc3RhdGUuIFRoaXMgZWZmZWN0aXZlbHkgcG9wdWxhdGVzXG4gICAgLy8gdGhlIG5ldyBzdGF0ZSB0cmVlIHdpdGggYW55IHJlbGV2YW50IGRhdGEgZnJvbSB0aGUgb2xkIG9uZS5cblxuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLlJFUExBQ0VcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogSW50ZXJvcGVyYWJpbGl0eSBwb2ludCBmb3Igb2JzZXJ2YWJsZS9yZWFjdGl2ZSBsaWJyYXJpZXMuXG4gICAqIEByZXR1cm5zIHtvYnNlcnZhYmxlfSBBIG1pbmltYWwgb2JzZXJ2YWJsZSBvZiBzdGF0ZSBjaGFuZ2VzLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBvYnNlcnZhYmxlIHByb3Bvc2FsOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYnNlcnZhYmxlXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBvdXRlclN1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICByZXR1cm4gX3JlZiA9IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG1pbmltYWwgb2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24gbWV0aG9kLlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVyIEFueSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBvYnNlcnZlci5cbiAgICAgICAqIFRoZSBvYnNlcnZlciBvYmplY3Qgc2hvdWxkIGhhdmUgYSBgbmV4dGAgbWV0aG9kLlxuICAgICAgICogQHJldHVybnMge3N1YnNjcmlwdGlvbn0gQW4gb2JqZWN0IHdpdGggYW4gYHVuc3Vic2NyaWJlYCBtZXRob2QgdGhhdCBjYW5cbiAgICAgICAqIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgZnJvbSB0aGUgc3RvcmUsIGFuZCBwcmV2ZW50IGZ1cnRoZXJcbiAgICAgICAqIGVtaXNzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBvYnNlcnZhYmxlLlxuICAgICAgICovXG4gICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgICAgICBpZiAodHlwZW9mIG9ic2VydmVyICE9PSAnb2JqZWN0JyB8fCBvYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDExKSA6IFwiRXhwZWN0ZWQgdGhlIG9ic2VydmVyIHRvIGJlIGFuIG9iamVjdC4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihvYnNlcnZlcikgKyBcIidcIik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvYnNlcnZlU3RhdGUoKSB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLm5leHQpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZVN0YXRlKCk7XG4gICAgICAgIHZhciB1bnN1YnNjcmliZSA9IG91dGVyU3Vic2NyaWJlKG9ic2VydmVTdGF0ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdW5zdWJzY3JpYmU6IHVuc3Vic2NyaWJlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwgX3JlZlskJG9ic2VydmFibGVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgX3JlZjtcbiAgfSAvLyBXaGVuIGEgc3RvcmUgaXMgY3JlYXRlZCwgYW4gXCJJTklUXCIgYWN0aW9uIGlzIGRpc3BhdGNoZWQgc28gdGhhdCBldmVyeVxuICAvLyByZWR1Y2VyIHJldHVybnMgdGhlaXIgaW5pdGlhbCBzdGF0ZS4gVGhpcyBlZmZlY3RpdmVseSBwb3B1bGF0ZXNcbiAgLy8gdGhlIGluaXRpYWwgc3RhdGUgdHJlZS5cblxuXG4gIGRpc3BhdGNoKHtcbiAgICB0eXBlOiBBY3Rpb25UeXBlcy5JTklUXG4gIH0pO1xuICByZXR1cm4gX3JlZjIgPSB7XG4gICAgZGlzcGF0Y2g6IGRpc3BhdGNoLFxuICAgIHN1YnNjcmliZTogc3Vic2NyaWJlLFxuICAgIGdldFN0YXRlOiBnZXRTdGF0ZSxcbiAgICByZXBsYWNlUmVkdWNlcjogcmVwbGFjZVJlZHVjZXJcbiAgfSwgX3JlZjJbJCRvYnNlcnZhYmxlXSA9IG9ic2VydmFibGUsIF9yZWYyO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgUmVkdXggc3RvcmUgdGhhdCBob2xkcyB0aGUgc3RhdGUgdHJlZS5cbiAqXG4gKiAqKldlIHJlY29tbWVuZCB1c2luZyBgY29uZmlndXJlU3RvcmVgIGZyb20gdGhlXG4gKiBgQHJlZHV4anMvdG9vbGtpdGAgcGFja2FnZSoqLCB3aGljaCByZXBsYWNlcyBgY3JlYXRlU3RvcmVgOlxuICogKipodHRwczovL3JlZHV4LmpzLm9yZy9pbnRyb2R1Y3Rpb24vd2h5LXJ0ay1pcy1yZWR1eC10b2RheSoqXG4gKlxuICogVGhlIG9ubHkgd2F5IHRvIGNoYW5nZSB0aGUgZGF0YSBpbiB0aGUgc3RvcmUgaXMgdG8gY2FsbCBgZGlzcGF0Y2goKWAgb24gaXQuXG4gKlxuICogVGhlcmUgc2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUgc3RvcmUgaW4geW91ciBhcHAuIFRvIHNwZWNpZnkgaG93IGRpZmZlcmVudFxuICogcGFydHMgb2YgdGhlIHN0YXRlIHRyZWUgcmVzcG9uZCB0byBhY3Rpb25zLCB5b3UgbWF5IGNvbWJpbmUgc2V2ZXJhbCByZWR1Y2Vyc1xuICogaW50byBhIHNpbmdsZSByZWR1Y2VyIGZ1bmN0aW9uIGJ5IHVzaW5nIGBjb21iaW5lUmVkdWNlcnNgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZHVjZXIgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG5leHQgc3RhdGUgdHJlZSwgZ2l2ZW5cbiAqIHRoZSBjdXJyZW50IHN0YXRlIHRyZWUgYW5kIHRoZSBhY3Rpb24gdG8gaGFuZGxlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBbcHJlbG9hZGVkU3RhdGVdIFRoZSBpbml0aWFsIHN0YXRlLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gaHlkcmF0ZSB0aGUgc3RhdGUgZnJvbSB0aGUgc2VydmVyIGluIHVuaXZlcnNhbCBhcHBzLCBvciB0byByZXN0b3JlIGFcbiAqIHByZXZpb3VzbHkgc2VyaWFsaXplZCB1c2VyIHNlc3Npb24uXG4gKiBJZiB5b3UgdXNlIGBjb21iaW5lUmVkdWNlcnNgIHRvIHByb2R1Y2UgdGhlIHJvb3QgcmVkdWNlciBmdW5jdGlvbiwgdGhpcyBtdXN0IGJlXG4gKiBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyBgY29tYmluZVJlZHVjZXJzYCBrZXlzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtlbmhhbmNlcl0gVGhlIHN0b3JlIGVuaGFuY2VyLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gZW5oYW5jZSB0aGUgc3RvcmUgd2l0aCB0aGlyZC1wYXJ0eSBjYXBhYmlsaXRpZXMgc3VjaCBhcyBtaWRkbGV3YXJlLFxuICogdGltZSB0cmF2ZWwsIHBlcnNpc3RlbmNlLCBldGMuIFRoZSBvbmx5IHN0b3JlIGVuaGFuY2VyIHRoYXQgc2hpcHMgd2l0aCBSZWR1eFxuICogaXMgYGFwcGx5TWlkZGxld2FyZSgpYC5cbiAqXG4gKiBAcmV0dXJucyB7U3RvcmV9IEEgUmVkdXggc3RvcmUgdGhhdCBsZXRzIHlvdSByZWFkIHRoZSBzdGF0ZSwgZGlzcGF0Y2ggYWN0aW9uc1xuICogYW5kIHN1YnNjcmliZSB0byBjaGFuZ2VzLlxuICovXG5cbnZhciBsZWdhY3lfY3JlYXRlU3RvcmUgPSBjcmVhdGVTdG9yZTtcblxuLyoqXG4gKiBQcmludHMgYSB3YXJuaW5nIGluIHRoZSBjb25zb2xlIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuXG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IGlmIHlvdSBlbmFibGVcbiAgICAvLyBcImJyZWFrIG9uIGFsbCBleGNlcHRpb25zXCIgaW4geW91ciBjb25zb2xlLFxuICAgIC8vIGl0IHdvdWxkIHBhdXNlIHRoZSBleGVjdXRpb24gYXQgdGhpcyBsaW5lLlxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfSBjYXRjaCAoZSkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuXG59XG5cbmZ1bmN0aW9uIGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2UoaW5wdXRTdGF0ZSwgcmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKSB7XG4gIHZhciByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgdmFyIGFyZ3VtZW50TmFtZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZXMuSU5JVCA/ICdwcmVsb2FkZWRTdGF0ZSBhcmd1bWVudCBwYXNzZWQgdG8gY3JlYXRlU3RvcmUnIDogJ3ByZXZpb3VzIHN0YXRlIHJlY2VpdmVkIGJ5IHRoZSByZWR1Y2VyJztcblxuICBpZiAocmVkdWNlcktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdTdG9yZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgcmVkdWNlci4gTWFrZSBzdXJlIHRoZSBhcmd1bWVudCBwYXNzZWQgJyArICd0byBjb21iaW5lUmVkdWNlcnMgaXMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgcmVkdWNlcnMuJztcbiAgfVxuXG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dFN0YXRlKSkge1xuICAgIHJldHVybiBcIlRoZSBcIiArIGFyZ3VtZW50TmFtZSArIFwiIGhhcyB1bmV4cGVjdGVkIHR5cGUgb2YgXFxcIlwiICsga2luZE9mKGlucHV0U3RhdGUpICsgXCJcXFwiLiBFeHBlY3RlZCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIFwiICsgKFwia2V5czogXFxcIlwiICsgcmVkdWNlcktleXMuam9pbignXCIsIFwiJykgKyBcIlxcXCJcIik7XG4gIH1cblxuICB2YXIgdW5leHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dFN0YXRlKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhcmVkdWNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdW5leHBlY3RlZEtleUNhY2hlW2tleV07XG4gIH0pO1xuICB1bmV4cGVjdGVkS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XSA9IHRydWU7XG4gIH0pO1xuICBpZiAoYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlcy5SRVBMQUNFKSByZXR1cm47XG5cbiAgaWYgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gXCJVbmV4cGVjdGVkIFwiICsgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDEgPyAna2V5cycgOiAna2V5JykgKyBcIiBcIiArIChcIlxcXCJcIiArIHVuZXhwZWN0ZWRLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiIGZvdW5kIGluIFwiICsgYXJndW1lbnROYW1lICsgXCIuIFwiKSArIFwiRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIga2V5cyBpbnN0ZWFkOiBcIiArIChcIlxcXCJcIiArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiLiBVbmV4cGVjdGVkIGtleXMgd2lsbCBiZSBpZ25vcmVkLlwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRSZWR1Y2VyU2hhcGUocmVkdWNlcnMpIHtcbiAgT2JqZWN0LmtleXMocmVkdWNlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciByZWR1Y2VyID0gcmVkdWNlcnNba2V5XTtcbiAgICB2YXIgaW5pdGlhbFN0YXRlID0gcmVkdWNlcih1bmRlZmluZWQsIHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLklOSVRcbiAgICB9KTtcblxuICAgIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTIpIDogXCJUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBcIiArIFwiSWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgcmVkdWNlciBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IFwiICsgXCJleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IFwiICsgXCJub3QgYmUgdW5kZWZpbmVkLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCBcIiArIFwieW91IGNhbiB1c2UgbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5cIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZWR1Y2VyKHVuZGVmaW5lZCwge1xuICAgICAgdHlwZTogQWN0aW9uVHlwZXMuUFJPQkVfVU5LTk9XTl9BQ1RJT04oKVxuICAgIH0pID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTMpIDogXCJUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBwcm9iZWQgd2l0aCBhIHJhbmRvbSB0eXBlLiBcIiArIChcIkRvbid0IHRyeSB0byBoYW5kbGUgJ1wiICsgQWN0aW9uVHlwZXMuSU5JVCArIFwiJyBvciBvdGhlciBhY3Rpb25zIGluIFxcXCJyZWR1eC8qXFxcIiBcIikgKyBcIm5hbWVzcGFjZS4gVGhleSBhcmUgY29uc2lkZXJlZCBwcml2YXRlLiBJbnN0ZWFkLCB5b3UgbXVzdCByZXR1cm4gdGhlIFwiICsgXCJjdXJyZW50IHN0YXRlIGZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB1bmxlc3MgaXQgaXMgdW5kZWZpbmVkLCBcIiArIFwiaW4gd2hpY2ggY2FzZSB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIFwiICsgXCJhY3Rpb24gdHlwZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQsIGJ1dCBjYW4gYmUgbnVsbC5cIik7XG4gICAgfVxuICB9KTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgZGlmZmVyZW50IHJlZHVjZXIgZnVuY3Rpb25zLCBpbnRvIGEgc2luZ2xlXG4gKiByZWR1Y2VyIGZ1bmN0aW9uLiBJdCB3aWxsIGNhbGwgZXZlcnkgY2hpbGQgcmVkdWNlciwgYW5kIGdhdGhlciB0aGVpciByZXN1bHRzXG4gKiBpbnRvIGEgc2luZ2xlIHN0YXRlIG9iamVjdCwgd2hvc2Uga2V5cyBjb3JyZXNwb25kIHRvIHRoZSBrZXlzIG9mIHRoZSBwYXNzZWRcbiAqIHJlZHVjZXIgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWR1Y2VycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50XG4gKiByZWR1Y2VyIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgY29tYmluZWQgaW50byBvbmUuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluXG4gKiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhcyByZWR1Y2Vyc2Agc3ludGF4LiBUaGUgcmVkdWNlcnMgbWF5IG5ldmVyIHJldHVyblxuICogdW5kZWZpbmVkIGZvciBhbnkgYWN0aW9uLiBJbnN0ZWFkLCB0aGV5IHNob3VsZCByZXR1cm4gdGhlaXIgaW5pdGlhbCBzdGF0ZVxuICogaWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGVtIHdhcyB1bmRlZmluZWQsIGFuZCB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYW55XG4gKiB1bnJlY29nbml6ZWQgYWN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSByZWR1Y2VyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBldmVyeSByZWR1Y2VyIGluc2lkZSB0aGVcbiAqIHBhc3NlZCBvYmplY3QsIGFuZCBidWlsZHMgYSBzdGF0ZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2Vycykge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBmaW5hbFJlZHVjZXJzID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSByZWR1Y2VyS2V5c1tpXTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdhcm5pbmcoXCJObyByZWR1Y2VyIHByb3ZpZGVkIGZvciBrZXkgXFxcIlwiICsga2V5ICsgXCJcXFwiXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZmluYWxSZWR1Y2Vyc1trZXldID0gcmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmluYWxSZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKGZpbmFsUmVkdWNlcnMpOyAvLyBUaGlzIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHdhcm4gYWJvdXQgdGhlIHNhbWVcbiAgLy8ga2V5cyBtdWx0aXBsZSB0aW1lcy5cblxuICB2YXIgdW5leHBlY3RlZEtleUNhY2hlO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlID0ge307XG4gIH1cblxuICB2YXIgc2hhcGVBc3NlcnRpb25FcnJvcjtcblxuICB0cnkge1xuICAgIGFzc2VydFJlZHVjZXJTaGFwZShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNoYXBlQXNzZXJ0aW9uRXJyb3IgPSBlO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbWJpbmF0aW9uKHN0YXRlLCBhY3Rpb24pIHtcbiAgICBpZiAoc3RhdGUgPT09IHZvaWQgMCkge1xuICAgICAgc3RhdGUgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoc2hhcGVBc3NlcnRpb25FcnJvcikge1xuICAgICAgdGhyb3cgc2hhcGVBc3NlcnRpb25FcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHdhcm5pbmdNZXNzYWdlID0gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShzdGF0ZSwgZmluYWxSZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpO1xuXG4gICAgICBpZiAod2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgd2FybmluZyh3YXJuaW5nTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgbmV4dFN0YXRlID0ge307XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfa2V5ID0gZmluYWxSZWR1Y2VyS2V5c1tfaV07XG4gICAgICB2YXIgcmVkdWNlciA9IGZpbmFsUmVkdWNlcnNbX2tleV07XG4gICAgICB2YXIgcHJldmlvdXNTdGF0ZUZvcktleSA9IHN0YXRlW19rZXldO1xuICAgICAgdmFyIG5leHRTdGF0ZUZvcktleSA9IHJlZHVjZXIocHJldmlvdXNTdGF0ZUZvcktleSwgYWN0aW9uKTtcblxuICAgICAgaWYgKHR5cGVvZiBuZXh0U3RhdGVGb3JLZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBhY3Rpb25UeXBlID0gYWN0aW9uICYmIGFjdGlvbi50eXBlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNCkgOiBcIldoZW4gY2FsbGVkIHdpdGggYW4gYWN0aW9uIG9mIHR5cGUgXCIgKyAoYWN0aW9uVHlwZSA/IFwiXFxcIlwiICsgU3RyaW5nKGFjdGlvblR5cGUpICsgXCJcXFwiXCIgOiAnKHVua25vd24gdHlwZSknKSArIFwiLCB0aGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFxcXCJcIiArIF9rZXkgKyBcIlxcXCIgcmV0dXJuZWQgdW5kZWZpbmVkLiBcIiArIFwiVG8gaWdub3JlIGFuIGFjdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXRlLiBcIiArIFwiSWYgeW91IHdhbnQgdGhpcyByZWR1Y2VyIHRvIGhvbGQgbm8gdmFsdWUsIHlvdSBjYW4gcmV0dXJuIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICBuZXh0U3RhdGVbX2tleV0gPSBuZXh0U3RhdGVGb3JLZXk7XG4gICAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBuZXh0U3RhdGVGb3JLZXkgIT09IHByZXZpb3VzU3RhdGVGb3JLZXk7XG4gICAgfVxuXG4gICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKHN0YXRlKS5sZW5ndGg7XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQgPyBuZXh0U3RhdGUgOiBzdGF0ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgYWN0aW9uIGNyZWF0b3JzLCBpbnRvIGFuIG9iamVjdCB3aXRoIHRoZVxuICogc2FtZSBrZXlzLCBidXQgd2l0aCBldmVyeSBmdW5jdGlvbiB3cmFwcGVkIGludG8gYSBgZGlzcGF0Y2hgIGNhbGwgc28gdGhleVxuICogbWF5IGJlIGludm9rZWQgZGlyZWN0bHkuIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIG1ldGhvZCwgYXMgeW91IGNhbiBjYWxsXG4gKiBgc3RvcmUuZGlzcGF0Y2goTXlBY3Rpb25DcmVhdG9ycy5kb1NvbWV0aGluZygpKWAgeW91cnNlbGYganVzdCBmaW5lLlxuICpcbiAqIEZvciBjb252ZW5pZW5jZSwgeW91IGNhbiBhbHNvIHBhc3MgYW4gYWN0aW9uIGNyZWF0b3IgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LFxuICogYW5kIGdldCBhIGRpc3BhdGNoIHdyYXBwZWQgZnVuY3Rpb24gaW4gcmV0dXJuLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBhY3Rpb25DcmVhdG9ycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSBhY3Rpb25cbiAqIGNyZWF0b3IgZnVuY3Rpb25zLiBPbmUgaGFuZHkgd2F5IHRvIG9idGFpbiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhc2BcbiAqIHN5bnRheC4gWW91IG1heSBhbHNvIHBhc3MgYSBzaW5nbGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZGlzcGF0Y2ggVGhlIGBkaXNwYXRjaGAgZnVuY3Rpb24gYXZhaWxhYmxlIG9uIHlvdXIgUmVkdXhcbiAqIHN0b3JlLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbnxPYmplY3R9IFRoZSBvYmplY3QgbWltaWNraW5nIHRoZSBvcmlnaW5hbCBvYmplY3QsIGJ1dCB3aXRoXG4gKiBldmVyeSBhY3Rpb24gY3JlYXRvciB3cmFwcGVkIGludG8gdGhlIGBkaXNwYXRjaGAgY2FsbC4gSWYgeW91IHBhc3NlZCBhXG4gKiBmdW5jdGlvbiBhcyBgYWN0aW9uQ3JlYXRvcnNgLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYWxzbyBiZSBhIHNpbmdsZVxuICogZnVuY3Rpb24uXG4gKi9cblxuXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgIT09ICdvYmplY3QnIHx8IGFjdGlvbkNyZWF0b3JzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTYpIDogXCJiaW5kQWN0aW9uQ3JlYXRvcnMgZXhwZWN0ZWQgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24sIGJ1dCBpbnN0ZWFkIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YoYWN0aW9uQ3JlYXRvcnMpICsgXCInLiBcIiArIFwiRGlkIHlvdSB3cml0ZSBcXFwiaW1wb3J0IEFjdGlvbkNyZWF0b3JzIGZyb21cXFwiIGluc3RlYWQgb2YgXFxcImltcG9ydCAqIGFzIEFjdGlvbkNyZWF0b3JzIGZyb21cXFwiP1wiKTtcbiAgfVxuXG4gIHZhciBib3VuZEFjdGlvbkNyZWF0b3JzID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIGFjdGlvbkNyZWF0b3JzKSB7XG4gICAgdmFyIGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59XG5cbi8qKlxuICogQ29tcG9zZXMgc2luZ2xlLWFyZ3VtZW50IGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuIFRoZSByaWdodG1vc3RcbiAqIGZ1bmN0aW9uIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cyBhcyBpdCBwcm92aWRlcyB0aGUgc2lnbmF0dXJlIGZvclxuICogdGhlIHJlc3VsdGluZyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gZnVuY3MgVGhlIGZ1bmN0aW9ucyB0byBjb21wb3NlLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIG9idGFpbmVkIGJ5IGNvbXBvc2luZyB0aGUgYXJndW1lbnQgZnVuY3Rpb25zXG4gKiBmcm9tIHJpZ2h0IHRvIGxlZnQuIEZvciBleGFtcGxlLCBjb21wb3NlKGYsIGcsIGgpIGlzIGlkZW50aWNhbCB0byBkb2luZ1xuICogKC4uLmFyZ3MpID0+IGYoZyhoKC4uLmFyZ3MpKSkuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2UoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBmdW5jcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBmdW5jc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICB9XG5cbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBmdW5jc1swXTtcbiAgfVxuXG4gIHJldHVybiBmdW5jcy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGEoYi5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cykpO1xuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdG9yZSBlbmhhbmNlciB0aGF0IGFwcGxpZXMgbWlkZGxld2FyZSB0byB0aGUgZGlzcGF0Y2ggbWV0aG9kXG4gKiBvZiB0aGUgUmVkdXggc3RvcmUuIFRoaXMgaXMgaGFuZHkgZm9yIGEgdmFyaWV0eSBvZiB0YXNrcywgc3VjaCBhcyBleHByZXNzaW5nXG4gKiBhc3luY2hyb25vdXMgYWN0aW9ucyBpbiBhIGNvbmNpc2UgbWFubmVyLCBvciBsb2dnaW5nIGV2ZXJ5IGFjdGlvbiBwYXlsb2FkLlxuICpcbiAqIFNlZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UgYXMgYW4gZXhhbXBsZSBvZiB0aGUgUmVkdXggbWlkZGxld2FyZS5cbiAqXG4gKiBCZWNhdXNlIG1pZGRsZXdhcmUgaXMgcG90ZW50aWFsbHkgYXN5bmNocm9ub3VzLCB0aGlzIHNob3VsZCBiZSB0aGUgZmlyc3RcbiAqIHN0b3JlIGVuaGFuY2VyIGluIHRoZSBjb21wb3NpdGlvbiBjaGFpbi5cbiAqXG4gKiBOb3RlIHRoYXQgZWFjaCBtaWRkbGV3YXJlIHdpbGwgYmUgZ2l2ZW4gdGhlIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgZnVuY3Rpb25zXG4gKiBhcyBuYW1lZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gbWlkZGxld2FyZXMgVGhlIG1pZGRsZXdhcmUgY2hhaW4gdG8gYmUgYXBwbGllZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBzdG9yZSBlbmhhbmNlciBhcHBseWluZyB0aGUgbWlkZGxld2FyZS5cbiAqL1xuXG5mdW5jdGlvbiBhcHBseU1pZGRsZXdhcmUoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBtaWRkbGV3YXJlcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBtaWRkbGV3YXJlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoY3JlYXRlU3RvcmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0b3JlID0gY3JlYXRlU3RvcmUuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuXG4gICAgICB2YXIgX2Rpc3BhdGNoID0gZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE1KSA6ICdEaXNwYXRjaGluZyB3aGlsZSBjb25zdHJ1Y3RpbmcgeW91ciBtaWRkbGV3YXJlIGlzIG5vdCBhbGxvd2VkLiAnICsgJ090aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC4nKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBtaWRkbGV3YXJlQVBJID0ge1xuICAgICAgICBnZXRTdGF0ZTogc3RvcmUuZ2V0U3RhdGUsXG4gICAgICAgIGRpc3BhdGNoOiBmdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgICAgICAgICByZXR1cm4gX2Rpc3BhdGNoLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBjaGFpbiA9IG1pZGRsZXdhcmVzLm1hcChmdW5jdGlvbiAobWlkZGxld2FyZSkge1xuICAgICAgICByZXR1cm4gbWlkZGxld2FyZShtaWRkbGV3YXJlQVBJKTtcbiAgICAgIH0pO1xuICAgICAgX2Rpc3BhdGNoID0gY29tcG9zZS5hcHBseSh2b2lkIDAsIGNoYWluKShzdG9yZS5kaXNwYXRjaCk7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdG9yZSksIHt9LCB7XG4gICAgICAgIGRpc3BhdGNoOiBfZGlzcGF0Y2hcbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB7IEFjdGlvblR5cGVzIGFzIF9fRE9fTk9UX1VTRV9fQWN0aW9uVHlwZXMsIGFwcGx5TWlkZGxld2FyZSwgYmluZEFjdGlvbkNyZWF0b3JzLCBjb21iaW5lUmVkdWNlcnMsIGNvbXBvc2UsIGNyZWF0ZVN0b3JlLCBsZWdhY3lfY3JlYXRlU3RvcmUgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGlzQXJyYXlpc2ggPSByZXF1aXJlKCdpcy1hcnJheWlzaCcpO1xuXG52YXIgY29uY2F0ID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdDtcbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxudmFyIHN3aXp6bGUgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHN3aXp6bGUoYXJncykge1xuXHR2YXIgcmVzdWx0cyA9IFtdO1xuXG5cdGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0dmFyIGFyZyA9IGFyZ3NbaV07XG5cblx0XHRpZiAoaXNBcnJheWlzaChhcmcpKSB7XG5cdFx0XHQvLyBodHRwOi8vanNwZXJmLmNvbS9qYXZhc2NyaXB0LWFycmF5LWNvbmNhdC12cy1wdXNoLzk4XG5cdFx0XHRyZXN1bHRzID0gY29uY2F0LmNhbGwocmVzdWx0cywgc2xpY2UuY2FsbChhcmcpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0cy5wdXNoKGFyZyk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG5zd2l6emxlLndyYXAgPSBmdW5jdGlvbiAoZm4pIHtcblx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gZm4oc3dpenpsZShhcmd1bWVudHMpKTtcblx0fTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXJyYXlpc2gob2JqKSB7XG5cdGlmICghb2JqIHx8IHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIG9iaiBpbnN0YW5jZW9mIEFycmF5IHx8IEFycmF5LmlzQXJyYXkob2JqKSB8fFxuXHRcdChvYmoubGVuZ3RoID49IDAgJiYgKG9iai5zcGxpY2UgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fFxuXHRcdFx0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCAob2JqLmxlbmd0aCAtIDEpKSAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPT0gJ1N0cmluZycpKSk7XG59O1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL1Rvb2xiYXIuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9Ub29sYmFyLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9DYWxsYmFja0dyYXBoQ29udGFpbmVyLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vQ2FsbGJhY2tHcmFwaENvbnRhaW5lci5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vRnJvbnRFbmRFcnJvci5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0Zyb250RW5kRXJyb3IuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL1BlcmN5LmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vUGVyY3kuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0RlYnVnTWVudS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL0RlYnVnTWVudS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vUGxvdGx5Q2xvdWQuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9QbG90bHlDbG91ZC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vVmVyc2lvbkluZm8uY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9WZXJzaW9uSW5mby5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdXBkYXRlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHVzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0uZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcblxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG4vKipcbiAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICovXG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIHJldHVybiB4ID09PSB5ICYmICh4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSkgfHwgeCAhPT0geCAmJiB5ICE9PSB5IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIDtcbn1cblxudmFyIG9iamVjdElzID0gdHlwZW9mIE9iamVjdC5pcyA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdC5pcyA6IGlzO1xuXG4vLyBkaXNwYXRjaCBmb3IgQ29tbW9uSlMgaW50ZXJvcCBuYW1lZCBpbXBvcnRzLlxuXG52YXIgdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSxcbiAgICB1c2VFZmZlY3QgPSBSZWFjdC51c2VFZmZlY3QsXG4gICAgdXNlTGF5b3V0RWZmZWN0ID0gUmVhY3QudXNlTGF5b3V0RWZmZWN0LFxuICAgIHVzZURlYnVnVmFsdWUgPSBSZWFjdC51c2VEZWJ1Z1ZhbHVlO1xudmFyIGRpZFdhcm5PbGQxOEFscGhhID0gZmFsc2U7XG52YXIgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSBmYWxzZTsgLy8gRGlzY2xhaW1lcjogVGhpcyBzaGltIGJyZWFrcyBtYW55IG9mIHRoZSBydWxlcyBvZiBSZWFjdCwgYW5kIG9ubHkgd29ya3Ncbi8vIGJlY2F1c2Ugb2YgYSB2ZXJ5IHBhcnRpY3VsYXIgc2V0IG9mIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYW5kIGFzc3VtcHRpb25zXG4vLyAtLSBjaGFuZ2UgYW55IG9uZSBvZiB0aGVtIGFuZCBpdCB3aWxsIGJyZWFrLiBUaGUgbW9zdCBpbXBvcnRhbnQgYXNzdW1wdGlvblxuLy8gaXMgdGhhdCB1cGRhdGVzIGFyZSBhbHdheXMgc3luY2hyb25vdXMsIGJlY2F1c2UgY29uY3VycmVudCByZW5kZXJpbmcgaXNcbi8vIG9ubHkgYXZhaWxhYmxlIGluIHZlcnNpb25zIG9mIFJlYWN0IHRoYXQgYWxzbyBoYXZlIGEgYnVpbHQtaW5cbi8vIHVzZVN5bmNFeHRlcm5hbFN0b3JlIEFQSS4gQW5kIHdlIG9ubHkgdXNlIHRoaXMgc2hpbSB3aGVuIHRoZSBidWlsdC1pbiBBUElcbi8vIGRvZXMgbm90IGV4aXN0LlxuLy9cbi8vIERvIG5vdCBhc3N1bWUgdGhhdCB0aGUgY2xldmVyIGhhY2tzIHVzZWQgYnkgdGhpcyBob29rIGFsc28gd29yayBpbiBnZW5lcmFsLlxuLy8gVGhlIHBvaW50IG9mIHRoaXMgc2hpbSBpcyB0byByZXBsYWNlIHRoZSBuZWVkIGZvciBoYWNrcyBieSBvdGhlciBsaWJyYXJpZXMuXG5cbmZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIC8vIE5vdGU6IFRoZSBzaGltIGRvZXMgbm90IHVzZSBnZXRTZXJ2ZXJTbmFwc2hvdCwgYmVjYXVzZSBwcmUtMTggdmVyc2lvbnMgb2Zcbi8vIFJlYWN0IGRvIG5vdCBleHBvc2UgYSB3YXkgdG8gY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nLiBTbyB1c2VycyBvZiB0aGUgc2hpbVxuLy8gd2lsbCBuZWVkIHRvIHRyYWNrIHRoYXQgdGhlbXNlbHZlcyBhbmQgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlXG4vLyBmcm9tIGBnZXRTbmFwc2hvdGAuXG5nZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICB7XG4gICAgaWYgKCFkaWRXYXJuT2xkMThBbHBoYSkge1xuICAgICAgaWYgKFJlYWN0LnN0YXJ0VHJhbnNpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRpZFdhcm5PbGQxOEFscGhhID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignWW91IGFyZSB1c2luZyBhbiBvdXRkYXRlZCwgcHJlLXJlbGVhc2UgYWxwaGEgb2YgUmVhY3QgMTggdGhhdCAnICsgJ2RvZXMgbm90IHN1cHBvcnQgdXNlU3luY0V4dGVybmFsU3RvcmUuIFRoZSAnICsgJ3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlIHNoaW0gd2lsbCBub3Qgd29yayBjb3JyZWN0bHkuIFVwZ3JhZGUgJyArICd0byBhIG5ld2VyIHByZS1yZWxlYXNlLicpO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBSZWFkIHRoZSBjdXJyZW50IHNuYXBzaG90IGZyb20gdGhlIHN0b3JlIG9uIGV2ZXJ5IHJlbmRlci4gQWdhaW4sIHRoaXNcbiAgLy8gYnJlYWtzIHRoZSBydWxlcyBvZiBSZWFjdCwgYW5kIG9ubHkgd29ya3MgaGVyZSBiZWNhdXNlIG9mIHNwZWNpZmljXG4gIC8vIGltcGxlbWVudGF0aW9uIGRldGFpbHMsIG1vc3QgaW1wb3J0YW50bHkgdGhhdCB1cGRhdGVzIGFyZVxuICAvLyBhbHdheXMgc3luY2hyb25vdXMuXG5cblxuICB2YXIgdmFsdWUgPSBnZXRTbmFwc2hvdCgpO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90KSB7XG4gICAgICB2YXIgY2FjaGVkVmFsdWUgPSBnZXRTbmFwc2hvdCgpO1xuXG4gICAgICBpZiAoIW9iamVjdElzKHZhbHVlLCBjYWNoZWRWYWx1ZSkpIHtcbiAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBCZWNhdXNlIHVwZGF0ZXMgYXJlIHN5bmNocm9ub3VzLCB3ZSBkb24ndCBxdWV1ZSB0aGVtLiBJbnN0ZWFkIHdlIGZvcmNlIGFcbiAgLy8gcmUtcmVuZGVyIHdoZW5ldmVyIHRoZSBzdWJzY3JpYmVkIHN0YXRlIGNoYW5nZXMgYnkgdXBkYXRpbmcgYW4gc29tZVxuICAvLyBhcmJpdHJhcnkgdXNlU3RhdGUgaG9vay4gVGhlbiwgZHVyaW5nIHJlbmRlciwgd2UgY2FsbCBnZXRTbmFwc2hvdCB0byByZWFkXG4gIC8vIHRoZSBjdXJyZW50IHZhbHVlLlxuICAvL1xuICAvLyBCZWNhdXNlIHdlIGRvbid0IGFjdHVhbGx5IHVzZSB0aGUgc3RhdGUgcmV0dXJuZWQgYnkgdGhlIHVzZVN0YXRlIGhvb2ssIHdlXG4gIC8vIGNhbiBzYXZlIGEgYml0IG9mIG1lbW9yeSBieSBzdG9yaW5nIG90aGVyIHN0dWZmIGluIHRoYXQgc2xvdC5cbiAgLy9cbiAgLy8gVG8gaW1wbGVtZW50IHRoZSBlYXJseSBiYWlsb3V0LCB3ZSBuZWVkIHRvIHRyYWNrIHNvbWUgdGhpbmdzIG9uIGEgbXV0YWJsZVxuICAvLyBvYmplY3QuIFVzdWFsbHksIHdlIHdvdWxkIHB1dCB0aGF0IGluIGEgdXNlUmVmIGhvb2ssIGJ1dCB3ZSBjYW4gc3Rhc2ggaXQgaW5cbiAgLy8gb3VyIHVzZVN0YXRlIGhvb2sgaW5zdGVhZC5cbiAgLy9cbiAgLy8gVG8gZm9yY2UgYSByZS1yZW5kZXIsIHdlIGNhbGwgZm9yY2VVcGRhdGUoe2luc3R9KS4gVGhhdCB3b3JrcyBiZWNhdXNlIHRoZVxuICAvLyBuZXcgb2JqZWN0IGFsd2F5cyBmYWlscyBhbiBlcXVhbGl0eSBjaGVjay5cblxuXG4gIHZhciBfdXNlU3RhdGUgPSB1c2VTdGF0ZSh7XG4gICAgaW5zdDoge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZ2V0U25hcHNob3Q6IGdldFNuYXBzaG90XG4gICAgfVxuICB9KSxcbiAgICAgIGluc3QgPSBfdXNlU3RhdGVbMF0uaW5zdCxcbiAgICAgIGZvcmNlVXBkYXRlID0gX3VzZVN0YXRlWzFdOyAvLyBUcmFjayB0aGUgbGF0ZXN0IGdldFNuYXBzaG90IGZ1bmN0aW9uIHdpdGggYSByZWYuIFRoaXMgbmVlZHMgdG8gYmUgdXBkYXRlZFxuICAvLyBpbiB0aGUgbGF5b3V0IHBoYXNlIHNvIHdlIGNhbiBhY2Nlc3MgaXQgZHVyaW5nIHRoZSB0ZWFyaW5nIGNoZWNrIHRoYXRcbiAgLy8gaGFwcGVucyBvbiBzdWJzY3JpYmUuXG5cblxuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGluc3QudmFsdWUgPSB2YWx1ZTtcbiAgICBpbnN0LmdldFNuYXBzaG90ID0gZ2V0U25hcHNob3Q7IC8vIFdoZW5ldmVyIGdldFNuYXBzaG90IG9yIHN1YnNjcmliZSBjaGFuZ2VzLCB3ZSBuZWVkIHRvIGNoZWNrIGluIHRoZVxuICAgIC8vIGNvbW1pdCBwaGFzZSBpZiB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgbXV0YXRpb24uIEluIGNvbmN1cnJlbnQgbW9kZVxuICAgIC8vIHRoaXMgY2FuIGhhcHBlbiBhbGwgdGhlIHRpbWUsIGJ1dCBldmVuIGluIHN5bmNocm9ub3VzIG1vZGUsIGFuIGVhcmxpZXJcbiAgICAvLyBlZmZlY3QgbWF5IGhhdmUgbXV0YXRlZCB0aGUgc3RvcmUuXG5cbiAgICBpZiAoY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSkge1xuICAgICAgLy8gRm9yY2UgYSByZS1yZW5kZXIuXG4gICAgICBmb3JjZVVwZGF0ZSh7XG4gICAgICAgIGluc3Q6IGluc3RcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW3N1YnNjcmliZSwgdmFsdWUsIGdldFNuYXBzaG90XSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gQ2hlY2sgZm9yIGNoYW5nZXMgcmlnaHQgYmVmb3JlIHN1YnNjcmliaW5nLiBTdWJzZXF1ZW50IGNoYW5nZXMgd2lsbCBiZVxuICAgIC8vIGRldGVjdGVkIGluIHRoZSBzdWJzY3JpcHRpb24gaGFuZGxlci5cbiAgICBpZiAoY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSkge1xuICAgICAgLy8gRm9yY2UgYSByZS1yZW5kZXIuXG4gICAgICBmb3JjZVVwZGF0ZSh7XG4gICAgICAgIGluc3Q6IGluc3RcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBoYW5kbGVTdG9yZUNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRPRE86IEJlY2F1c2UgdGhlcmUgaXMgbm8gY3Jvc3MtcmVuZGVyZXIgQVBJIGZvciBiYXRjaGluZyB1cGRhdGVzLCBpdCdzXG4gICAgICAvLyB1cCB0byB0aGUgY29uc3VtZXIgb2YgdGhpcyBsaWJyYXJ5IHRvIHdyYXAgdGhlaXIgc3Vic2NyaXB0aW9uIGV2ZW50XG4gICAgICAvLyB3aXRoIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzLiBTaG91bGQgd2UgdHJ5IHRvIGRldGVjdCB3aGVuIHRoaXMgaXNuJ3RcbiAgICAgIC8vIHRoZSBjYXNlIGFuZCBwcmludCBhIHdhcm5pbmcgaW4gZGV2ZWxvcG1lbnQ/XG4gICAgICAvLyBUaGUgc3RvcmUgY2hhbmdlZC4gQ2hlY2sgaWYgdGhlIHNuYXBzaG90IGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZVxuICAgICAgLy8gcmVhZCBmcm9tIHRoZSBzdG9yZS5cbiAgICAgIGlmIChjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpKSB7XG4gICAgICAgIC8vIEZvcmNlIGEgcmUtcmVuZGVyLlxuICAgICAgICBmb3JjZVVwZGF0ZSh7XG4gICAgICAgICAgaW5zdDogaW5zdFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9OyAvLyBTdWJzY3JpYmUgdG8gdGhlIHN0b3JlIGFuZCByZXR1cm4gYSBjbGVhbi11cCBmdW5jdGlvbi5cblxuXG4gICAgcmV0dXJuIHN1YnNjcmliZShoYW5kbGVTdG9yZUNoYW5nZSk7XG4gIH0sIFtzdWJzY3JpYmVdKTtcbiAgdXNlRGVidWdWYWx1ZSh2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSB7XG4gIHZhciBsYXRlc3RHZXRTbmFwc2hvdCA9IGluc3QuZ2V0U25hcHNob3Q7XG4gIHZhciBwcmV2VmFsdWUgPSBpbnN0LnZhbHVlO1xuXG4gIHRyeSB7XG4gICAgdmFyIG5leHRWYWx1ZSA9IGxhdGVzdEdldFNuYXBzaG90KCk7XG4gICAgcmV0dXJuICFvYmplY3RJcyhwcmV2VmFsdWUsIG5leHRWYWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXNlU3luY0V4dGVybmFsU3RvcmUkMShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAvLyBOb3RlOiBUaGUgc2hpbSBkb2VzIG5vdCB1c2UgZ2V0U2VydmVyU25hcHNob3QsIGJlY2F1c2UgcHJlLTE4IHZlcnNpb25zIG9mXG4gIC8vIFJlYWN0IGRvIG5vdCBleHBvc2UgYSB3YXkgdG8gY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nLiBTbyB1c2VycyBvZiB0aGUgc2hpbVxuICAvLyB3aWxsIG5lZWQgdG8gdHJhY2sgdGhhdCB0aGVtc2VsdmVzIGFuZCByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWVcbiAgLy8gZnJvbSBgZ2V0U25hcHNob3RgLlxuICByZXR1cm4gZ2V0U25hcHNob3QoKTtcbn1cblxudmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpO1xuXG52YXIgaXNTZXJ2ZXJFbnZpcm9ubWVudCA9ICFjYW5Vc2VET007XG5cbnZhciBzaGltID0gaXNTZXJ2ZXJFbnZpcm9ubWVudCA/IHVzZVN5bmNFeHRlcm5hbFN0b3JlJDEgOiB1c2VTeW5jRXh0ZXJuYWxTdG9yZTtcbnZhciB1c2VTeW5jRXh0ZXJuYWxTdG9yZSQyID0gUmVhY3QudXNlU3luY0V4dGVybmFsU3RvcmUgIT09IHVuZGVmaW5lZCA/IFJlYWN0LnVzZVN5bmNFeHRlcm5hbFN0b3JlIDogc2hpbTtcblxuZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlJDI7XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHVzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0vd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG52YXIgc2hpbSA9IHJlcXVpcmUoJ3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL3NoaW0nKTtcblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICByZXR1cm4geCA9PT0geSAmJiAoeCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkpIHx8IHggIT09IHggJiYgeSAhPT0geSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICA7XG59XG5cbnZhciBvYmplY3RJcyA9IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBpcztcblxudmFyIHVzZVN5bmNFeHRlcm5hbFN0b3JlID0gc2hpbS51c2VTeW5jRXh0ZXJuYWxTdG9yZTtcblxuLy8gZm9yIENvbW1vbkpTIGludGVyb3AuXG5cbnZhciB1c2VSZWYgPSBSZWFjdC51c2VSZWYsXG4gICAgdXNlRWZmZWN0ID0gUmVhY3QudXNlRWZmZWN0LFxuICAgIHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vLFxuICAgIHVzZURlYnVnVmFsdWUgPSBSZWFjdC51c2VEZWJ1Z1ZhbHVlOyAvLyBTYW1lIGFzIHVzZVN5bmNFeHRlcm5hbFN0b3JlLCBidXQgc3VwcG9ydHMgc2VsZWN0b3IgYW5kIGlzRXF1YWwgYXJndW1lbnRzLlxuXG5mdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvcihzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCwgc2VsZWN0b3IsIGlzRXF1YWwpIHtcbiAgLy8gVXNlIHRoaXMgdG8gdHJhY2sgdGhlIHJlbmRlcmVkIHNuYXBzaG90LlxuICB2YXIgaW5zdFJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGluc3Q7XG5cbiAgaWYgKGluc3RSZWYuY3VycmVudCA9PT0gbnVsbCkge1xuICAgIGluc3QgPSB7XG4gICAgICBoYXNWYWx1ZTogZmFsc2UsXG4gICAgICB2YWx1ZTogbnVsbFxuICAgIH07XG4gICAgaW5zdFJlZi5jdXJyZW50ID0gaW5zdDtcbiAgfSBlbHNlIHtcbiAgICBpbnN0ID0gaW5zdFJlZi5jdXJyZW50O1xuICB9XG5cbiAgdmFyIF91c2VNZW1vID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gVHJhY2sgdGhlIG1lbW9pemVkIHN0YXRlIHVzaW5nIGNsb3N1cmUgdmFyaWFibGVzIHRoYXQgYXJlIGxvY2FsIHRvIHRoaXNcbiAgICAvLyBtZW1vaXplZCBpbnN0YW5jZSBvZiBhIGdldFNuYXBzaG90IGZ1bmN0aW9uLiBJbnRlbnRpb25hbGx5IG5vdCB1c2luZyBhXG4gICAgLy8gdXNlUmVmIGhvb2ssIGJlY2F1c2UgdGhhdCBzdGF0ZSB3b3VsZCBiZSBzaGFyZWQgYWNyb3NzIGFsbCBjb25jdXJyZW50XG4gICAgLy8gY29waWVzIG9mIHRoZSBob29rL2NvbXBvbmVudC5cbiAgICB2YXIgaGFzTWVtbyA9IGZhbHNlO1xuICAgIHZhciBtZW1vaXplZFNuYXBzaG90O1xuICAgIHZhciBtZW1vaXplZFNlbGVjdGlvbjtcblxuICAgIHZhciBtZW1vaXplZFNlbGVjdG9yID0gZnVuY3Rpb24gKG5leHRTbmFwc2hvdCkge1xuICAgICAgaWYgKCFoYXNNZW1vKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCB0aW1lIHRoZSBob29rIGlzIGNhbGxlZCwgdGhlcmUgaXMgbm8gbWVtb2l6ZWQgcmVzdWx0LlxuICAgICAgICBoYXNNZW1vID0gdHJ1ZTtcbiAgICAgICAgbWVtb2l6ZWRTbmFwc2hvdCA9IG5leHRTbmFwc2hvdDtcblxuICAgICAgICB2YXIgX25leHRTZWxlY3Rpb24gPSBzZWxlY3RvcihuZXh0U25hcHNob3QpO1xuXG4gICAgICAgIGlmIChpc0VxdWFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBFdmVuIGlmIHRoZSBzZWxlY3RvciBoYXMgY2hhbmdlZCwgdGhlIGN1cnJlbnRseSByZW5kZXJlZCBzZWxlY3Rpb25cbiAgICAgICAgICAvLyBtYXkgYmUgZXF1YWwgdG8gdGhlIG5ldyBzZWxlY3Rpb24uIFdlIHNob3VsZCBhdHRlbXB0IHRvIHJldXNlIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgdmFsdWUgaWYgcG9zc2libGUsIHRvIHByZXNlcnZlIGRvd25zdHJlYW0gbWVtb2l6YXRpb25zLlxuICAgICAgICAgIGlmIChpbnN0Lmhhc1ZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFNlbGVjdGlvbiA9IGluc3QudmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChpc0VxdWFsKGN1cnJlbnRTZWxlY3Rpb24sIF9uZXh0U2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgICBtZW1vaXplZFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb247XG4gICAgICAgICAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG1lbW9pemVkU2VsZWN0aW9uID0gX25leHRTZWxlY3Rpb247XG4gICAgICAgIHJldHVybiBfbmV4dFNlbGVjdGlvbjtcbiAgICAgIH0gLy8gV2UgbWF5IGJlIGFibGUgdG8gcmV1c2UgdGhlIHByZXZpb3VzIGludm9jYXRpb24ncyByZXN1bHQuXG5cblxuICAgICAgLy8gV2UgbWF5IGJlIGFibGUgdG8gcmV1c2UgdGhlIHByZXZpb3VzIGludm9jYXRpb24ncyByZXN1bHQuXG4gICAgICB2YXIgcHJldlNuYXBzaG90ID0gbWVtb2l6ZWRTbmFwc2hvdDtcbiAgICAgIHZhciBwcmV2U2VsZWN0aW9uID0gbWVtb2l6ZWRTZWxlY3Rpb247XG5cbiAgICAgIGlmIChvYmplY3RJcyhwcmV2U25hcHNob3QsIG5leHRTbmFwc2hvdCkpIHtcbiAgICAgICAgLy8gVGhlIHNuYXBzaG90IGlzIHRoZSBzYW1lIGFzIGxhc3QgdGltZS4gUmV1c2UgdGhlIHByZXZpb3VzIHNlbGVjdGlvbi5cbiAgICAgICAgcmV0dXJuIHByZXZTZWxlY3Rpb247XG4gICAgICB9IC8vIFRoZSBzbmFwc2hvdCBoYXMgY2hhbmdlZCwgc28gd2UgbmVlZCB0byBjb21wdXRlIGEgbmV3IHNlbGVjdGlvbi5cblxuXG4gICAgICAvLyBUaGUgc25hcHNob3QgaGFzIGNoYW5nZWQsIHNvIHdlIG5lZWQgdG8gY29tcHV0ZSBhIG5ldyBzZWxlY3Rpb24uXG4gICAgICB2YXIgbmV4dFNlbGVjdGlvbiA9IHNlbGVjdG9yKG5leHRTbmFwc2hvdCk7IC8vIElmIGEgY3VzdG9tIGlzRXF1YWwgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIHVzZSB0aGF0IHRvIGNoZWNrIGlmIHRoZSBkYXRhXG4gICAgICAvLyBoYXMgY2hhbmdlZC4gSWYgaXQgaGFzbid0LCByZXR1cm4gdGhlIHByZXZpb3VzIHNlbGVjdGlvbi4gVGhhdCBzaWduYWxzXG4gICAgICAvLyB0byBSZWFjdCB0aGF0IHRoZSBzZWxlY3Rpb25zIGFyZSBjb25jZXB0dWFsbHkgZXF1YWwsIGFuZCB3ZSBjYW4gYmFpbFxuICAgICAgLy8gb3V0IG9mIHJlbmRlcmluZy5cblxuICAgICAgLy8gSWYgYSBjdXN0b20gaXNFcXVhbCBmdW5jdGlvbiBpcyBwcm92aWRlZCwgdXNlIHRoYXQgdG8gY2hlY2sgaWYgdGhlIGRhdGFcbiAgICAgIC8vIGhhcyBjaGFuZ2VkLiBJZiBpdCBoYXNuJ3QsIHJldHVybiB0aGUgcHJldmlvdXMgc2VsZWN0aW9uLiBUaGF0IHNpZ25hbHNcbiAgICAgIC8vIHRvIFJlYWN0IHRoYXQgdGhlIHNlbGVjdGlvbnMgYXJlIGNvbmNlcHR1YWxseSBlcXVhbCwgYW5kIHdlIGNhbiBiYWlsXG4gICAgICAvLyBvdXQgb2YgcmVuZGVyaW5nLlxuICAgICAgaWYgKGlzRXF1YWwgIT09IHVuZGVmaW5lZCAmJiBpc0VxdWFsKHByZXZTZWxlY3Rpb24sIG5leHRTZWxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBwcmV2U2VsZWN0aW9uO1xuICAgICAgfVxuXG4gICAgICBtZW1vaXplZFNuYXBzaG90ID0gbmV4dFNuYXBzaG90O1xuICAgICAgbWVtb2l6ZWRTZWxlY3Rpb24gPSBuZXh0U2VsZWN0aW9uO1xuICAgICAgcmV0dXJuIG5leHRTZWxlY3Rpb247XG4gICAgfTsgLy8gQXNzaWduaW5nIHRoaXMgdG8gYSBjb25zdGFudCBzbyB0aGF0IEZsb3cga25vd3MgaXQgY2FuJ3QgY2hhbmdlLlxuXG5cbiAgICAvLyBBc3NpZ25pbmcgdGhpcyB0byBhIGNvbnN0YW50IHNvIHRoYXQgRmxvdyBrbm93cyBpdCBjYW4ndCBjaGFuZ2UuXG4gICAgdmFyIG1heWJlR2V0U2VydmVyU25hcHNob3QgPSBnZXRTZXJ2ZXJTbmFwc2hvdCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGdldFNlcnZlclNuYXBzaG90O1xuXG4gICAgdmFyIGdldFNuYXBzaG90V2l0aFNlbGVjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG1lbW9pemVkU2VsZWN0b3IoZ2V0U25hcHNob3QoKSk7XG4gICAgfTtcblxuICAgIHZhciBnZXRTZXJ2ZXJTbmFwc2hvdFdpdGhTZWxlY3RvciA9IG1heWJlR2V0U2VydmVyU25hcHNob3QgPT09IG51bGwgPyB1bmRlZmluZWQgOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbWVtb2l6ZWRTZWxlY3RvcihtYXliZUdldFNlcnZlclNuYXBzaG90KCkpO1xuICAgIH07XG4gICAgcmV0dXJuIFtnZXRTbmFwc2hvdFdpdGhTZWxlY3RvciwgZ2V0U2VydmVyU25hcHNob3RXaXRoU2VsZWN0b3JdO1xuICB9LCBbZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90LCBzZWxlY3RvciwgaXNFcXVhbF0pLFxuICAgICAgZ2V0U2VsZWN0aW9uID0gX3VzZU1lbW9bMF0sXG4gICAgICBnZXRTZXJ2ZXJTZWxlY3Rpb24gPSBfdXNlTWVtb1sxXTtcblxuICB2YXIgdmFsdWUgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNlbGVjdGlvbiwgZ2V0U2VydmVyU2VsZWN0aW9uKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpbnN0Lmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICBpbnN0LnZhbHVlID0gdmFsdWU7XG4gIH0sIFt2YWx1ZV0pO1xuICB1c2VEZWJ1Z1ZhbHVlKHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnRzLnVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yID0gdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3I7XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltL3dpdGgtc2VsZWN0b3IucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0vd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSB3aW5kb3dbXCJQcm9wVHlwZXNcIl07IiwibW9kdWxlLmV4cG9ydHMgPSB3aW5kb3dbXCJSZWFjdFwiXTsiLCJtb2R1bGUuZXhwb3J0cyA9IHdpbmRvd1tcIlJlYWN0RE9NXCJdOyIsImZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KHIsIGEpIHtcbiAgKG51bGwgPT0gYSB8fCBhID4gci5sZW5ndGgpICYmIChhID0gci5sZW5ndGgpO1xuICBmb3IgKHZhciBlID0gMCwgbiA9IEFycmF5KGEpOyBlIDwgYTsgZSsrKSBuW2VdID0gcltlXTtcbiAgcmV0dXJuIG47XG59XG5leHBvcnQgeyBfYXJyYXlMaWtlVG9BcnJheSBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKHIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocikpIHJldHVybiByO1xufVxuZXhwb3J0IHsgX2FycmF5V2l0aEhvbGVzIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgYXJyYXlMaWtlVG9BcnJheSBmcm9tIFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCI7XG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMocikge1xuICBpZiAoQXJyYXkuaXNBcnJheShyKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkocik7XG59XG5leHBvcnQgeyBfYXJyYXlXaXRob3V0SG9sZXMgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoZSkge1xuICBpZiAodm9pZCAwID09PSBlKSB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIHJldHVybiBlO1xufVxuZXhwb3J0IHsgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGEsIG4pIHtcbiAgaWYgKCEoYSBpbnN0YW5jZW9mIG4pKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xufVxuZXhwb3J0IHsgX2NsYXNzQ2FsbENoZWNrIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgdG9Qcm9wZXJ0eUtleSBmcm9tIFwiLi90b1Byb3BlcnR5S2V5LmpzXCI7XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyhlLCByKSB7XG4gIGZvciAodmFyIHQgPSAwOyB0IDwgci5sZW5ndGg7IHQrKykge1xuICAgIHZhciBvID0gclt0XTtcbiAgICBvLmVudW1lcmFibGUgPSBvLmVudW1lcmFibGUgfHwgITEsIG8uY29uZmlndXJhYmxlID0gITAsIFwidmFsdWVcIiBpbiBvICYmIChvLndyaXRhYmxlID0gITApLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdG9Qcm9wZXJ0eUtleShvLmtleSksIG8pO1xuICB9XG59XG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoZSwgciwgdCkge1xuICByZXR1cm4gciAmJiBfZGVmaW5lUHJvcGVydGllcyhlLnByb3RvdHlwZSwgciksIHQgJiYgX2RlZmluZVByb3BlcnRpZXMoZSwgdCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6ICExXG4gIH0pLCBlO1xufVxuZXhwb3J0IHsgX2NyZWF0ZUNsYXNzIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgdG9Qcm9wZXJ0eUtleSBmcm9tIFwiLi90b1Byb3BlcnR5S2V5LmpzXCI7XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkoZSwgciwgdCkge1xuICByZXR1cm4gKHIgPSB0b1Byb3BlcnR5S2V5KHIpKSBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIHtcbiAgICB2YWx1ZTogdCxcbiAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICBjb25maWd1cmFibGU6ICEwLFxuICAgIHdyaXRhYmxlOiAhMFxuICB9KSA6IGVbcl0gPSB0LCBlO1xufVxuZXhwb3J0IHsgX2RlZmluZVByb3BlcnR5IGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHtcbiAgICBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykge1xuICAgICAgdmFyIHQgPSBhcmd1bWVudHNbZV07XG4gICAgICBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbiAgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cbmV4cG9ydCB7IF9leHRlbmRzIGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCkge1xuICByZXR1cm4gX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtcbiAgfSwgX2dldFByb3RvdHlwZU9mKHQpO1xufVxuZXhwb3J0IHsgX2dldFByb3RvdHlwZU9mIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgc2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vc2V0UHJvdG90eXBlT2YuanNcIjtcbmZ1bmN0aW9uIF9pbmhlcml0cyh0LCBlKSB7XG4gIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUgJiYgbnVsbCAhPT0gZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogdCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgICB9XG4gIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiAhMVxuICB9KSwgZSAmJiBzZXRQcm90b3R5cGVPZih0LCBlKTtcbn1cbmV4cG9ydCB7IF9pbmhlcml0cyBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShyKSB7XG4gIGlmIChcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgbnVsbCAhPSByW1N5bWJvbC5pdGVyYXRvcl0gfHwgbnVsbCAhPSByW1wiQEBpdGVyYXRvclwiXSkgcmV0dXJuIEFycmF5LmZyb20ocik7XG59XG5leHBvcnQgeyBfaXRlcmFibGVUb0FycmF5IGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQociwgbCkge1xuICB2YXIgdCA9IG51bGwgPT0gciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgcltTeW1ib2wuaXRlcmF0b3JdIHx8IHJbXCJAQGl0ZXJhdG9yXCJdO1xuICBpZiAobnVsbCAhPSB0KSB7XG4gICAgdmFyIGUsXG4gICAgICBuLFxuICAgICAgaSxcbiAgICAgIHUsXG4gICAgICBhID0gW10sXG4gICAgICBmID0gITAsXG4gICAgICBvID0gITE7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChpID0gKHQgPSB0LmNhbGwocikpLm5leHQsIDAgPT09IGwpIHtcbiAgICAgICAgaWYgKE9iamVjdCh0KSAhPT0gdCkgcmV0dXJuO1xuICAgICAgICBmID0gITE7XG4gICAgICB9IGVsc2UgZm9yICg7ICEoZiA9IChlID0gaS5jYWxsKHQpKS5kb25lKSAmJiAoYS5wdXNoKGUudmFsdWUpLCBhLmxlbmd0aCAhPT0gbCk7IGYgPSAhMCk7XG4gICAgfSBjYXRjaCAocikge1xuICAgICAgbyA9ICEwLCBuID0gcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFmICYmIG51bGwgIT0gdFtcInJldHVyblwiXSAmJiAodSA9IHRbXCJyZXR1cm5cIl0oKSwgT2JqZWN0KHUpICE9PSB1KSkgcmV0dXJuO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKG8pIHRocm93IG47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhO1xuICB9XG59XG5leHBvcnQgeyBfaXRlcmFibGVUb0FycmF5TGltaXQgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5leHBvcnQgeyBfbm9uSXRlcmFibGVSZXN0IGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuZXhwb3J0IHsgX25vbkl0ZXJhYmxlU3ByZWFkIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgZGVmaW5lUHJvcGVydHkgZnJvbSBcIi4vZGVmaW5lUHJvcGVydHkuanNcIjtcbmZ1bmN0aW9uIG93bktleXMoZSwgcikge1xuICB2YXIgdCA9IE9iamVjdC5rZXlzKGUpO1xuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtcbiAgICByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7XG4gICAgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7XG4gIH1cbiAgcmV0dXJuIHQ7XG59XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMihlKSB7XG4gIGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7XG4gICAgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9O1xuICAgIHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eShlLCByLCB0W3JdKTtcbiAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIpKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZTtcbn1cbmV4cG9ydCB7IF9vYmplY3RTcHJlYWQyIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBmcm9tIFwiLi9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzXCI7XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoZSwgdCkge1xuICBpZiAobnVsbCA9PSBlKSByZXR1cm4ge307XG4gIHZhciBvLFxuICAgIHIsXG4gICAgaSA9IG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoZSwgdCk7XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIG4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO1xuICAgIGZvciAociA9IDA7IHIgPCBuLmxlbmd0aDsgcisrKSBvID0gbltyXSwgLTEgPT09IHQuaW5kZXhPZihvKSAmJiB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIG8pICYmIChpW29dID0gZVtvXSk7XG4gIH1cbiAgcmV0dXJuIGk7XG59XG5leHBvcnQgeyBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHIsIGUpIHtcbiAgaWYgKG51bGwgPT0gcikgcmV0dXJuIHt9O1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBuIGluIHIpIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIG4pKSB7XG4gICAgaWYgKC0xICE9PSBlLmluZGV4T2YobikpIGNvbnRpbnVlO1xuICAgIHRbbl0gPSByW25dO1xuICB9XG4gIHJldHVybiB0O1xufVxuZXhwb3J0IHsgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuaW1wb3J0IGFzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiLi9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanNcIjtcbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQsIGUpIHtcbiAgaWYgKGUgJiYgKFwib2JqZWN0XCIgPT0gX3R5cGVvZihlKSB8fCBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGUpKSByZXR1cm4gZTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpO1xuICByZXR1cm4gYXNzZXJ0VGhpc0luaXRpYWxpemVkKHQpO1xufVxuZXhwb3J0IHsgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LCBlKSB7XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICByZXR1cm4gdC5fX3Byb3RvX18gPSBlLCB0O1xuICB9LCBfc2V0UHJvdG90eXBlT2YodCwgZSk7XG59XG5leHBvcnQgeyBfc2V0UHJvdG90eXBlT2YgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBhcnJheVdpdGhIb2xlcyBmcm9tIFwiLi9hcnJheVdpdGhIb2xlcy5qc1wiO1xuaW1wb3J0IGl0ZXJhYmxlVG9BcnJheUxpbWl0IGZyb20gXCIuL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzXCI7XG5pbXBvcnQgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCBub25JdGVyYWJsZVJlc3QgZnJvbSBcIi4vbm9uSXRlcmFibGVSZXN0LmpzXCI7XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShyLCBlKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhyKSB8fCBpdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBlKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBlKSB8fCBub25JdGVyYWJsZVJlc3QoKTtcbn1cbmV4cG9ydCB7IF9zbGljZWRUb0FycmF5IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgYXJyYXlXaXRob3V0SG9sZXMgZnJvbSBcIi4vYXJyYXlXaXRob3V0SG9sZXMuanNcIjtcbmltcG9ydCBpdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vaXRlcmFibGVUb0FycmF5LmpzXCI7XG5pbXBvcnQgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgZnJvbSBcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIjtcbmltcG9ydCBub25JdGVyYWJsZVNwcmVhZCBmcm9tIFwiLi9ub25JdGVyYWJsZVNwcmVhZC5qc1wiO1xuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KHIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKHIpIHx8IGl0ZXJhYmxlVG9BcnJheShyKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuZXhwb3J0IHsgX3RvQ29uc3VtYWJsZUFycmF5IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmZ1bmN0aW9uIHRvUHJpbWl0aXZlKHQsIHIpIHtcbiAgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7XG4gIHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdO1xuICBpZiAodm9pZCAwICE9PSBlKSB7XG4gICAgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7XG4gICAgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpO1xuICB9XG4gIHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7XG59XG5leHBvcnQgeyB0b1ByaW1pdGl2ZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5pbXBvcnQgdG9QcmltaXRpdmUgZnJvbSBcIi4vdG9QcmltaXRpdmUuanNcIjtcbmZ1bmN0aW9uIHRvUHJvcGVydHlLZXkodCkge1xuICB2YXIgaSA9IHRvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpO1xuICByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiO1xufVxuZXhwb3J0IHsgdG9Qcm9wZXJ0eUtleSBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvO1xuICB9IDogZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbztcbiAgfSwgX3R5cGVvZihvKTtcbn1cbmV4cG9ydCB7IF90eXBlb2YgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBhcnJheUxpa2VUb0FycmF5IGZyb20gXCIuL2FycmF5TGlrZVRvQXJyYXkuanNcIjtcbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBhKSB7XG4gIGlmIChyKSB7XG4gICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHIpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KHIsIGEpO1xuICAgIHZhciB0ID0ge30udG9TdHJpbmcuY2FsbChyKS5zbGljZSg4LCAtMSk7XG4gICAgcmV0dXJuIFwiT2JqZWN0XCIgPT09IHQgJiYgci5jb25zdHJ1Y3RvciAmJiAodCA9IHIuY29uc3RydWN0b3IubmFtZSksIFwiTWFwXCIgPT09IHQgfHwgXCJTZXRcIiA9PT0gdCA/IEFycmF5LmZyb20ocikgOiBcIkFyZ3VtZW50c1wiID09PSB0IHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHQpID8gYXJyYXlMaWtlVG9BcnJheShyLCBhKSA6IHZvaWQgMDtcbiAgfVxufVxuZXhwb3J0IHsgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX3hhbGwgZnJvbSBcIi4vaW50ZXJuYWwvX3hhbGwuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgb2YgdGhlIGxpc3QgbWF0Y2ggdGhlIHByZWRpY2F0ZSwgYGZhbHNlYCBpZlxuICogdGhlcmUgYXJlIGFueSB0aGF0IGRvbid0LlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBhbGxgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIHByZWRpY2F0ZSBpcyBzYXRpc2ZpZWQgYnkgZXZlcnkgZWxlbWVudCwgYGZhbHNlYFxuICogICAgICAgICBvdGhlcndpc2UuXG4gKiBAc2VlIFIuYW55LCBSLm5vbmUsIFIudHJhbnNkdWNlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZXF1YWxzMyA9IFIuZXF1YWxzKDMpO1xuICogICAgICBSLmFsbChlcXVhbHMzKShbMywgMywgMywgM10pOyAvLz0+IHRydWVcbiAqICAgICAgUi5hbGwoZXF1YWxzMykoWzMsIDMsIDEsIDNdKTsgLy89PiBmYWxzZVxuICovXG52YXIgYWxsID0gLyojX19QVVJFX18qL19jdXJyeTIoIC8qI19fUFVSRV9fKi9fZGlzcGF0Y2hhYmxlKFsnYWxsJ10sIF94YWxsLCBmdW5jdGlvbiBhbGwoZm4sIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgIGlmICghZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IGFsbDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIGdpdmVuIHZhbHVlLiBOb3RlIHRoYXQgZm9yXG4gKiBub24tcHJpbWl0aXZlcyB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHZhbHVlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMga25vd24gYXMgYGNvbnN0YCwgYGNvbnN0YW50YCwgb3IgYEtgIChmb3IgSyBjb21iaW5hdG9yKSBpblxuICogb3RoZXIgbGFuZ3VhZ2VzIGFuZCBsaWJyYXJpZXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgYSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHdyYXAgaW4gYSBmdW5jdGlvblxuICogQHJldHVybiB7RnVuY3Rpb259IEEgRnVuY3Rpb24gOjogKiAtPiB2YWwuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgdCA9IFIuYWx3YXlzKCdUZWUnKTtcbiAqICAgICAgdCgpOyAvLz0+ICdUZWUnXG4gKi9cbnZhciBhbHdheXMgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBhbHdheXModmFsKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgYWx3YXlzOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeGFueSBmcm9tIFwiLi9pbnRlcm5hbC9feGFueS5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGxpc3QgbWF0Y2ggdGhlIHByZWRpY2F0ZSxcbiAqIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBhbnlgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIHByZWRpY2F0ZSBpcyBzYXRpc2ZpZWQgYnkgYXQgbGVhc3Qgb25lIGVsZW1lbnQsIGBmYWxzZWBcbiAqICAgICAgICAgb3RoZXJ3aXNlLlxuICogQHNlZSBSLmFsbCwgUi5ub25lLCBSLnRyYW5zZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGxlc3NUaGFuMCA9IFIuZmxpcChSLmx0KSgwKTtcbiAqICAgICAgY29uc3QgbGVzc1RoYW4yID0gUi5mbGlwKFIubHQpKDIpO1xuICogICAgICBSLmFueShsZXNzVGhhbjApKFsxLCAyXSk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5hbnkobGVzc1RoYW4yKShbMSwgMl0pOyAvLz0+IHRydWVcbiAqL1xudmFyIGFueSA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbJ2FueSddLCBfeGFueSwgZnVuY3Rpb24gYW55KGZuLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IGFueTsiLCJpbXBvcnQgX2NvbmNhdCBmcm9tIFwiLi9pbnRlcm5hbC9fY29uY2F0LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX3JlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9fcmVkdWNlLmpzXCI7XG5pbXBvcnQgbWFwIGZyb20gXCIuL21hcC5qc1wiO1xuXG4vKipcbiAqIGFwIGFwcGxpZXMgYSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBhIGxpc3Qgb2YgdmFsdWVzLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBhcGAgbWV0aG9kIG9mIHRoZSBmaXJzdCBhcmd1bWVudCwgaWYgcHJlc2VudC4gQWxzb1xuICogdHJlYXRzIGN1cnJpZWQgZnVuY3Rpb25zIGFzIGFwcGxpY2F0aXZlcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4zLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBbYSAtPiBiXSAtPiBbYV0gLT4gW2JdXG4gKiBAc2lnIEFwcGx5IGYgPT4gZiAoYSAtPiBiKSAtPiBmIGEgLT4gZiBiXG4gKiBAc2lnIChyIC0+IGEgLT4gYikgLT4gKHIgLT4gYSkgLT4gKHIgLT4gYilcbiAqIEBwYXJhbSB7Kn0gYXBwbHlGXG4gKiBAcGFyYW0geyp9IGFwcGx5WFxuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFwKFtSLm11bHRpcGx5KDIpLCBSLmFkZCgzKV0sIFsxLDIsM10pOyAvLz0+IFsyLCA0LCA2LCA0LCA1LCA2XVxuICogICAgICBSLmFwKFtSLmNvbmNhdCgndGFzdHkgJyksIFIudG9VcHBlcl0sIFsncGl6emEnLCAnc2FsYWQnXSk7IC8vPT4gW1widGFzdHkgcGl6emFcIiwgXCJ0YXN0eSBzYWxhZFwiLCBcIlBJWlpBXCIsIFwiU0FMQURcIl1cbiAqXG4gKiAgICAgIC8vIFIuYXAgY2FuIGFsc28gYmUgdXNlZCBhcyBTIGNvbWJpbmF0b3JcbiAqICAgICAgLy8gd2hlbiBvbmx5IHR3byBmdW5jdGlvbnMgYXJlIHBhc3NlZFxuICogICAgICBSLmFwKFIuY29uY2F0LCBSLnRvVXBwZXIpKCdSYW1kYScpIC8vPT4gJ1JhbWRhUkFNREEnXG4gKiBAc3ltYiBSLmFwKFtmLCBnXSwgW2EsIGJdKSA9IFtmKGEpLCBmKGIpLCBnKGEpLCBnKGIpXVxuICovXG52YXIgYXAgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBhcChhcHBseUYsIGFwcGx5WCkge1xuICByZXR1cm4gdHlwZW9mIGFwcGx5WFsnZmFudGFzeS1sYW5kL2FwJ10gPT09ICdmdW5jdGlvbicgPyBhcHBseVhbJ2ZhbnRhc3ktbGFuZC9hcCddKGFwcGx5RikgOiB0eXBlb2YgYXBwbHlGLmFwID09PSAnZnVuY3Rpb24nID8gYXBwbHlGLmFwKGFwcGx5WCkgOiB0eXBlb2YgYXBwbHlGID09PSAnZnVuY3Rpb24nID8gZnVuY3Rpb24gKHgpIHtcbiAgICByZXR1cm4gYXBwbHlGKHgpKGFwcGx5WCh4KSk7XG4gIH0gOiBfcmVkdWNlKGZ1bmN0aW9uIChhY2MsIGYpIHtcbiAgICByZXR1cm4gX2NvbmNhdChhY2MsIG1hcChmLCBhcHBseVgpKTtcbiAgfSwgW10sIGFwcGx5Rik7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGFwOyIsImltcG9ydCBfY29uY2F0IGZyb20gXCIuL2ludGVybmFsL19jb25jYXQuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGxpc3QsIGZvbGxvd2VkIGJ5XG4gKiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIGEgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHsqfSBlbCBUaGUgZWxlbWVudCB0byBhZGQgdG8gdGhlIGVuZCBvZiB0aGUgbmV3IGxpc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IG9mIGVsZW1lbnRzIHRvIGFkZCBhIG5ldyBpdGVtIHRvLlxuICogICAgICAgIGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgb2xkIGxpc3QgZm9sbG93ZWQgYnkgYGVsYC5cbiAqIEBzZWUgUi5wcmVwZW5kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5hcHBlbmQoJ3Rlc3RzJywgWyd3cml0ZScsICdtb3JlJ10pOyAvLz0+IFsnd3JpdGUnLCAnbW9yZScsICd0ZXN0cyddXG4gKiAgICAgIFIuYXBwZW5kKCd0ZXN0cycsIFtdKTsgLy89PiBbJ3Rlc3RzJ11cbiAqICAgICAgUi5hcHBlbmQoWyd0ZXN0cyddLCBbJ3dyaXRlJywgJ21vcmUnXSk7IC8vPT4gWyd3cml0ZScsICdtb3JlJywgWyd0ZXN0cyddXVxuICovXG52YXIgYXBwZW5kID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gYXBwZW5kKGVsLCBsaXN0KSB7XG4gIHJldHVybiBfY29uY2F0KGxpc3QsIFtlbF0pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBhcHBlbmQ7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IGFzc29jUGF0aCBmcm9tIFwiLi9hc3NvY1BhdGguanNcIjtcblxuLyoqXG4gKiBNYWtlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYW4gb2JqZWN0LCBzZXR0aW5nIG9yIG92ZXJyaWRpbmcgdGhlIHNwZWNpZmllZFxuICogcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuIE5vdGUgdGhhdCB0aGlzIGNvcGllcyBhbmQgZmxhdHRlbnMgcHJvdG90eXBlXG4gKiBwcm9wZXJ0aWVzIG9udG8gdGhlIG5ldyBvYmplY3QgYXMgd2VsbC4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllcyBhcmVcbiAqIGNvcGllZCBieSByZWZlcmVuY2UuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50XG4gKiBAc2lnIElkeCAtPiBhIC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gcHJvcCBUaGUgcHJvcGVydHkgbmFtZSB0byBzZXRcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSBuZXcgdmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3QgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwgZXhjZXB0IGZvciB0aGUgY2hhbmdlZCBwcm9wZXJ0eS5cbiAqIEBzZWUgUi5kaXNzb2MsIFIucGlja1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYXNzb2MoJ2MnLCAzLCB7YTogMSwgYjogMn0pOyAvLz0+IHthOiAxLCBiOiAyLCBjOiAzfVxuICovXG52YXIgYXNzb2MgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBhc3NvYyhwcm9wLCB2YWwsIG9iaikge1xuICByZXR1cm4gYXNzb2NQYXRoKFtwcm9wXSwgdmFsLCBvYmopO1xufSk7XG5leHBvcnQgZGVmYXVsdCBhc3NvYzsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwiLi9pbnRlcm5hbC9faGFzLmpzXCI7XG5pbXBvcnQgX2lzSW50ZWdlciBmcm9tIFwiLi9pbnRlcm5hbC9faXNJbnRlZ2VyLmpzXCI7XG5pbXBvcnQgX2Fzc29jIGZyb20gXCIuL2ludGVybmFsL19hc3NvYy5qc1wiO1xuaW1wb3J0IGlzTmlsIGZyb20gXCIuL2lzTmlsLmpzXCI7XG5cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdCwgc2V0dGluZyBvciBvdmVycmlkaW5nIHRoZSBub2RlcyByZXF1aXJlZFxuICogdG8gY3JlYXRlIHRoZSBnaXZlbiBwYXRoLCBhbmQgcGxhY2luZyB0aGUgc3BlY2lmaWMgdmFsdWUgYXQgdGhlIHRhaWwgZW5kIG9mXG4gKiB0aGF0IHBhdGguIE5vdGUgdGhhdCB0aGlzIGNvcGllcyBhbmQgZmxhdHRlbnMgcHJvdG90eXBlIHByb3BlcnRpZXMgb250byB0aGVcbiAqIG5ldyBvYmplY3QgYXMgd2VsbC4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllcyBhcmUgY29waWVkIGJ5IHJlZmVyZW5jZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgW0lkeF0gLT4gYSAtPiB7YX0gLT4ge2F9XG4gKiBAcGFyYW0ge0FycmF5fSBwYXRoIHRoZSBwYXRoIHRvIHNldFxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG5ldyB2YWx1ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbCBleGNlcHQgYWxvbmcgdGhlIHNwZWNpZmllZCBwYXRoLlxuICogQHNlZSBSLmRpc3NvY1BhdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFzc29jUGF0aChbJ2EnLCAnYicsICdjJ10sIDQyLCB7YToge2I6IHtjOiAwfX19KTsgLy89PiB7YToge2I6IHtjOiA0Mn19fVxuICpcbiAqICAgICAgLy8gQW55IG1pc3Npbmcgb3Igbm9uLW9iamVjdCBrZXlzIGluIHBhdGggd2lsbCBiZSBvdmVycmlkZGVuXG4gKiAgICAgIFIuYXNzb2NQYXRoKFsnYScsICdiJywgJ2MnXSwgNDIsIHthOiA1fSk7IC8vPT4ge2E6IHtiOiB7YzogNDJ9fX1cbiAqL1xudmFyIGFzc29jUGF0aCA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIGFzc29jUGF0aChwYXRoLCB2YWwsIG9iaikge1xuICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHZhciBpZHggPSBwYXRoWzBdO1xuICBpZiAocGF0aC5sZW5ndGggPiAxKSB7XG4gICAgdmFyIG5leHRPYmogPSAhaXNOaWwob2JqKSAmJiBfaGFzKGlkeCwgb2JqKSAmJiB0eXBlb2Ygb2JqW2lkeF0gPT09ICdvYmplY3QnID8gb2JqW2lkeF0gOiBfaXNJbnRlZ2VyKHBhdGhbMV0pID8gW10gOiB7fTtcbiAgICB2YWwgPSBhc3NvY1BhdGgoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocGF0aCwgMSksIHZhbCwgbmV4dE9iaik7XG4gIH1cbiAgcmV0dXJuIF9hc3NvYyhpZHgsIHZhbCwgb2JqKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgYXNzb2NQYXRoOyIsImltcG9ydCBfYXJpdHkgZnJvbSBcIi4vaW50ZXJuYWwvX2FyaXR5LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgYm91bmQgdG8gYSBjb250ZXh0LlxuICogTm90ZTogYFIuYmluZGAgZG9lcyBub3QgcHJvdmlkZSB0aGUgYWRkaXRpb25hbCBhcmd1bWVudC1iaW5kaW5nIGNhcGFiaWxpdGllcyBvZlxuICogW0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9GdW5jdGlvbi9iaW5kKS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC42LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKiAtPiAqKSAtPiB7Kn0gLT4gKCogLT4gKilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBiaW5kIHRvIGNvbnRleHRcbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzT2JqIFRoZSBjb250ZXh0IHRvIGJpbmQgYGZuYCB0b1xuICogQHJldHVybiB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCB3aWxsIGV4ZWN1dGUgaW4gdGhlIGNvbnRleHQgb2YgYHRoaXNPYmpgLlxuICogQHNlZSBSLnBhcnRpYWxcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBsb2cgPSBSLmJpbmQoY29uc29sZS5sb2csIGNvbnNvbGUpO1xuICogICAgICBSLnBpcGUoUi5hc3NvYygnYScsIDIpLCBSLnRhcChsb2cpLCBSLmFzc29jKCdhJywgMykpKHthOiAxfSk7IC8vPT4ge2E6IDN9XG4gKiAgICAgIC8vIGxvZ3Mge2E6IDJ9XG4gKiBAc3ltYiBSLmJpbmQoZiwgbykoYSwgYikgPSBmLmNhbGwobywgYSwgYilcbiAqL1xudmFyIGJpbmQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBiaW5kKGZuLCB0aGlzT2JqKSB7XG4gIHJldHVybiBfYXJpdHkoZm4ubGVuZ3RoLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNPYmosIGFyZ3VtZW50cyk7XG4gIH0pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBiaW5kOyIsImltcG9ydCBfY2xvbmUgZnJvbSBcIi4vaW50ZXJuYWwvX2Nsb25lLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlZXAgY29weSBvZiB0aGUgc291cmNlIHRoYXQgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIHNvdXJjZVxuICogb2JqZWN0IHdpdGhvdXQgcmV0YWluaW5nIGFueSByZWZlcmVuY2VzIHRvIGl0LlxuICogVGhlIHNvdXJjZSBvYmplY3QgbWF5IGNvbnRhaW4gKG5lc3RlZCkgYEFycmF5YHMgYW5kIGBPYmplY3RgcyxcbiAqIGBOdW1iZXJgcywgYFN0cmluZ2BzLCBgQm9vbGVhbmBzIGFuZCBgRGF0ZWBzLlxuICogYEZ1bmN0aW9uYHMgYXJlIGFzc2lnbmVkIGJ5IHJlZmVyZW5jZSByYXRoZXIgdGhhbiBjb3BpZWQuXG4gKlxuICogRGlzcGF0Y2hlcyB0byBhIGBjbG9uZWAgbWV0aG9kIGlmIHByZXNlbnQuXG4gKlxuICogTm90ZSB0aGF0IGlmIHRoZSBzb3VyY2Ugb2JqZWN0IGhhcyBtdWx0aXBsZSBub2RlcyB0aGF0IHNoYXJlIGEgcmVmZXJlbmNlLFxuICogdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGhhdmUgdGhlIHNhbWUgc3RydWN0dXJlLCBidXQgdGhlIHJlZmVyZW5jZXMgd2lsbFxuICogYmUgcG9pbnRlZCB0byB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBjbG9uZWQgdmFsdWUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHsqfSAtPiB7Kn1cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIG9iamVjdCBvciBhcnJheSB0byBjbG9uZVxuICogQHJldHVybiB7Kn0gQSBkZWVwbHkgY2xvbmVkIGNvcHkgb2YgYHZhbGBcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBvYmplY3RzID0gW3t9LCB7fSwge31dO1xuICogICAgICBjb25zdCBvYmplY3RzQ2xvbmUgPSBSLmNsb25lKG9iamVjdHMpO1xuICogICAgICBvYmplY3RzID09PSBvYmplY3RzQ2xvbmU7IC8vPT4gZmFsc2VcbiAqICAgICAgb2JqZWN0c1swXSA9PT0gb2JqZWN0c0Nsb25lWzBdOyAvLz0+IGZhbHNlXG4gKi9cbnZhciBjbG9uZSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGNsb25lKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZS5jbG9uZSA9PT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLmNsb25lKCkgOiBfY2xvbmUodmFsdWUsIHRydWUpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBjbG9uZTsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5cbi8qKlxuICogTWFrZXMgYSBjb21wYXJhdG9yIGZ1bmN0aW9uIG91dCBvZiBhIGZ1bmN0aW9uIHRoYXQgcmVwb3J0cyB3aGV0aGVyIHRoZSBmaXJzdFxuICogZWxlbWVudCBpcyBsZXNzIHRoYW4gdGhlIHNlY29uZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKGEsIGIpIC0+IEJvb2xlYW4pIC0+ICgoYSwgYikgLT4gTnVtYmVyKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCBBIHByZWRpY2F0ZSBmdW5jdGlvbiBvZiBhcml0eSB0d28gd2hpY2ggd2lsbCByZXR1cm4gYHRydWVgIGlmIHRoZSBmaXJzdCBhcmd1bWVudFxuICogaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBGdW5jdGlvbiA6OiBhIC0+IGIgLT4gSW50IHRoYXQgcmV0dXJucyBgLTFgIGlmIGEgPCBiLCBgMWAgaWYgYiA8IGEsIG90aGVyd2lzZSBgMGBcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBieUFnZSA9IFIuY29tcGFyYXRvcigoYSwgYikgPT4gYS5hZ2UgPCBiLmFnZSk7XG4gKiAgICAgIGNvbnN0IHBlb3BsZSA9IFtcbiAqICAgICAgICB7IG5hbWU6ICdFbW1hJywgYWdlOiA3MCB9LFxuICogICAgICAgIHsgbmFtZTogJ1BldGVyJywgYWdlOiA3OCB9LFxuICogICAgICAgIHsgbmFtZTogJ01pa2hhaWwnLCBhZ2U6IDYyIH0sXG4gKiAgICAgIF07XG4gKiAgICAgIGNvbnN0IHBlb3BsZUJ5SW5jcmVhc2luZ0FnZSA9IFIuc29ydChieUFnZSwgcGVvcGxlKTtcbiAqICAgICAgICAvLz0+IFt7IG5hbWU6ICdNaWtoYWlsJywgYWdlOiA2MiB9LHsgbmFtZTogJ0VtbWEnLCBhZ2U6IDcwIH0sIHsgbmFtZTogJ1BldGVyJywgYWdlOiA3OCB9XVxuICovXG52YXIgY29tcGFyYXRvciA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGNvbXBhcmF0b3IocHJlZCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gcHJlZChhLCBiKSA/IC0xIDogcHJlZChiLCBhKSA/IDEgOiAwO1xuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBjb21wYXJhdG9yOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9pbnRlcm5hbC9faXNBcnJheS5qc1wiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCIuL2ludGVybmFsL19pc0Z1bmN0aW9uLmpzXCI7XG5pbXBvcnQgX2lzU3RyaW5nIGZyb20gXCIuL2ludGVybmFsL19pc1N0cmluZy5qc1wiO1xuaW1wb3J0IHRvU3RyaW5nIGZyb20gXCIuL3RvU3RyaW5nLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbmNhdGVuYXRpbmcgdGhlIGdpdmVuIGxpc3RzIG9yIHN0cmluZ3MuXG4gKlxuICogTm90ZTogYFIuY29uY2F0YCBleHBlY3RzIGJvdGggYXJndW1lbnRzIHRvIGJlIG9mIHRoZSBzYW1lIHR5cGUsXG4gKiB1bmxpa2UgdGhlIG5hdGl2ZSBgQXJyYXkucHJvdG90eXBlLmNvbmNhdGAgbWV0aG9kLiBJdCB3aWxsIHRocm93XG4gKiBhbiBlcnJvciBpZiB5b3UgYGNvbmNhdGAgYW4gQXJyYXkgd2l0aCBhIG5vbi1BcnJheSB2YWx1ZS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgY29uY2F0YCBtZXRob2Qgb2YgdGhlIGZpcnN0IGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICogQ2FuIGFsc28gY29uY2F0ZW5hdGUgdHdvIG1lbWJlcnMgb2YgYSBbZmFudGFzeS1sYW5kXG4gKiBjb21wYXRpYmxlIHNlbWlncm91cF0oaHR0cHM6Ly9naXRodWIuY29tL2ZhbnRhc3lsYW5kL2ZhbnRhc3ktbGFuZCNzZW1pZ3JvdXApLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFthXSAtPiBbYV1cbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBmaXJzdExpc3QgVGhlIGZpcnN0IGxpc3RcbiAqIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBzZWNvbmRMaXN0IFRoZSBzZWNvbmQgbGlzdFxuICogQHJldHVybiB7QXJyYXl8U3RyaW5nfSBBIGxpc3QgY29uc2lzdGluZyBvZiB0aGUgZWxlbWVudHMgb2YgYGZpcnN0TGlzdGAgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzIG9mXG4gKiBgc2Vjb25kTGlzdGAuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuY29uY2F0KCdBQkMnLCAnREVGJyk7IC8vICdBQkNERUYnXG4gKiAgICAgIFIuY29uY2F0KFs0LCA1LCA2XSwgWzEsIDIsIDNdKTsgLy89PiBbNCwgNSwgNiwgMSwgMiwgM11cbiAqICAgICAgUi5jb25jYXQoW10sIFtdKTsgLy89PiBbXVxuICovXG52YXIgY29uY2F0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gY29uY2F0KGEsIGIpIHtcbiAgaWYgKF9pc0FycmF5KGEpKSB7XG4gICAgaWYgKF9pc0FycmF5KGIpKSB7XG4gICAgICByZXR1cm4gYS5jb25jYXQoYik7XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IodG9TdHJpbmcoYikgKyAnIGlzIG5vdCBhbiBhcnJheScpO1xuICB9XG4gIGlmIChfaXNTdHJpbmcoYSkpIHtcbiAgICBpZiAoX2lzU3RyaW5nKGIpKSB7XG4gICAgICByZXR1cm4gYSArIGI7XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IodG9TdHJpbmcoYikgKyAnIGlzIG5vdCBhIHN0cmluZycpO1xuICB9XG4gIGlmIChhICE9IG51bGwgJiYgX2lzRnVuY3Rpb24oYVsnZmFudGFzeS1sYW5kL2NvbmNhdCddKSkge1xuICAgIHJldHVybiBhWydmYW50YXN5LWxhbmQvY29uY2F0J10oYik7XG4gIH1cbiAgaWYgKGEgIT0gbnVsbCAmJiBfaXNGdW5jdGlvbihhLmNvbmNhdCkpIHtcbiAgICByZXR1cm4gYS5jb25jYXQoYik7XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcih0b1N0cmluZyhhKSArICcgZG9lcyBub3QgaGF2ZSBhIG1ldGhvZCBuYW1lZCBcImNvbmNhdFwiIG9yIFwiZmFudGFzeS1sYW5kL2NvbmNhdFwiJyk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGNvbmNhdDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwiLi9pbnRlcm5hbC9fbWFwLmpzXCI7XG5pbXBvcnQgY3VycnlOIGZyb20gXCIuL2N1cnJ5Ti5qc1wiO1xuaW1wb3J0IG1heCBmcm9tIFwiLi9tYXguanNcIjtcbmltcG9ydCBwbHVjayBmcm9tIFwiLi9wbHVjay5qc1wiO1xuaW1wb3J0IHJlZHVjZSBmcm9tIFwiLi9yZWR1Y2UuanNcIjtcblxuLyoqXG4gKiBBY2NlcHRzIGEgY29udmVyZ2luZyBmdW5jdGlvbiBhbmQgYSBsaXN0IG9mIGJyYW5jaGluZyBmdW5jdGlvbnMgYW5kIHJldHVybnNcbiAqIGEgbmV3IGZ1bmN0aW9uLiBUaGUgYXJpdHkgb2YgdGhlIG5ldyBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgYXJpdHkgb2ZcbiAqIHRoZSBsb25nZXN0IGJyYW5jaGluZyBmdW5jdGlvbi4gV2hlbiBpbnZva2VkLCB0aGlzIG5ldyBmdW5jdGlvbiBpcyBhcHBsaWVkXG4gKiB0byBzb21lIGFyZ3VtZW50cywgYW5kIGVhY2ggYnJhbmNoaW5nIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gdGhvc2Ugc2FtZVxuICogYXJndW1lbnRzLiBUaGUgcmVzdWx0cyBvZiBlYWNoIGJyYW5jaGluZyBmdW5jdGlvbiBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50c1xuICogdG8gdGhlIGNvbnZlcmdpbmcgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgcmV0dXJuIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjQuMlxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgoeDEsIHgyLCAuLi4pIC0+IHopIC0+IFsoKGEsIGIsIC4uLikgLT4geDEpLCAoKGEsIGIsIC4uLikgLT4geDIpLCAuLi5dIC0+IChhIC0+IGIgLT4gLi4uIC0+IHopXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZnRlciBBIGZ1bmN0aW9uLiBgYWZ0ZXJgIHdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSByZXR1cm4gdmFsdWVzIG9mXG4gKiAgICAgICAgYGZuMWAgYW5kIGBmbjJgIGFzIGl0cyBhcmd1bWVudHMuXG4gKiBAcGFyYW0ge0FycmF5fSBmdW5jdGlvbnMgQSBsaXN0IG9mIGZ1bmN0aW9ucy5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldyBmdW5jdGlvbi5cbiAqIEBzZWUgUi51c2VXaXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYXZlcmFnZSA9IFIuY29udmVyZ2UoUi5kaXZpZGUsIFtSLnN1bSwgUi5sZW5ndGhdKVxuICogICAgICBhdmVyYWdlKFsxLCAyLCAzLCA0LCA1LCA2LCA3XSkgLy89PiA0XG4gKlxuICogICAgICBjb25zdCBzdHJhbmdlQ29uY2F0ID0gUi5jb252ZXJnZShSLmNvbmNhdCwgW1IudG9VcHBlciwgUi50b0xvd2VyXSlcbiAqICAgICAgc3RyYW5nZUNvbmNhdChcIllvZGVsXCIpIC8vPT4gXCJZT0RFTHlvZGVsXCJcbiAqXG4gKiBAc3ltYiBSLmNvbnZlcmdlKGYsIFtnLCBoXSkoYSwgYikgPSBmKGcoYSwgYiksIGgoYSwgYikpXG4gKi9cbnZhciBjb252ZXJnZSA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGNvbnZlcmdlKGFmdGVyLCBmbnMpIHtcbiAgcmV0dXJuIGN1cnJ5TihyZWR1Y2UobWF4LCAwLCBwbHVjaygnbGVuZ3RoJywgZm5zKSksIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgcmV0dXJuIGFmdGVyLmFwcGx5KGNvbnRleHQsIF9tYXAoZnVuY3Rpb24gKGZuKSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgfSwgZm5zKSk7XG4gIH0pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBjb252ZXJnZTsiLCJpbXBvcnQgX2FyaXR5IGZyb20gXCIuL2ludGVybmFsL19hcml0eS5qc1wiO1xuaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9jdXJyeU4gZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Ti5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBjdXJyaWVkIGVxdWl2YWxlbnQgb2YgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLCB3aXRoIHRoZSBzcGVjaWZpZWRcbiAqIGFyaXR5LiBUaGUgY3VycmllZCBmdW5jdGlvbiBoYXMgdHdvIHVudXN1YWwgY2FwYWJpbGl0aWVzLiBGaXJzdCwgaXRzXG4gKiBhcmd1bWVudHMgbmVlZG4ndCBiZSBwcm92aWRlZCBvbmUgYXQgYSB0aW1lLiBJZiBgZ2AgaXMgYFIuY3VycnlOKDMsIGYpYCwgdGhlXG4gKiBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEpKDIpKDMpYFxuICogICAtIGBnKDEpKDIsIDMpYFxuICogICAtIGBnKDEsIDIpKDMpYFxuICogICAtIGBnKDEsIDIsIDMpYFxuICpcbiAqIFNlY29uZGx5LCB0aGUgc3BlY2lhbCBwbGFjZWhvbGRlciB2YWx1ZSBbYFIuX19gXSgjX18pIG1heSBiZSB1c2VkIHRvIHNwZWNpZnlcbiAqIFwiZ2Fwc1wiLCBhbGxvd2luZyBwYXJ0aWFsIGFwcGxpY2F0aW9uIG9mIGFueSBjb21iaW5hdGlvbiBvZiBhcmd1bWVudHMsXG4gKiByZWdhcmRsZXNzIG9mIHRoZWlyIHBvc2l0aW9ucy4gSWYgYGdgIGlzIGFzIGFib3ZlIGFuZCBgX2AgaXMgW2BSLl9fYF0oI19fKSxcbiAqIHRoZSBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEsIDIsIDMpYFxuICogICAtIGBnKF8sIDIsIDMpKDEpYFxuICogICAtIGBnKF8sIF8sIDMpKDEpKDIpYFxuICogICAtIGBnKF8sIF8sIDMpKDEsIDIpYFxuICogICAtIGBnKF8sIDIpKDEpKDMpYFxuICogICAtIGBnKF8sIDIpKDEsIDMpYFxuICogICAtIGBnKF8sIDIpKF8sIDMpKDEpYFxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjUuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIE51bWJlciAtPiAoKiAtPiBhKSAtPiAoKiAtPiBhKVxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgYXJpdHkgZm9yIHRoZSByZXR1cm5lZCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldywgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBzZWUgUi5jdXJyeVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHN1bUFyZ3MgPSAoLi4uYXJncykgPT4gUi5zdW0oYXJncyk7XG4gKlxuICogICAgICBjb25zdCBjdXJyaWVkQWRkRm91ck51bWJlcnMgPSBSLmN1cnJ5Tig0LCBzdW1BcmdzKTtcbiAqICAgICAgY29uc3QgZiA9IGN1cnJpZWRBZGRGb3VyTnVtYmVycygxLCAyKTtcbiAqICAgICAgY29uc3QgZyA9IGYoMyk7XG4gKiAgICAgIGcoNCk7IC8vPT4gMTBcbiAqL1xudmFyIGN1cnJ5TiA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGN1cnJ5TihsZW5ndGgsIGZuKSB7XG4gIGlmIChsZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gX2N1cnJ5MShmbik7XG4gIH1cbiAgcmV0dXJuIF9hcml0eShsZW5ndGgsIF9jdXJyeU4obGVuZ3RoLCBbXSwgZm4pKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgY3VycnlOOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzZWNvbmQgYXJndW1lbnQgaWYgaXQgaXMgbm90IGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYE5hTmA7XG4gKiBvdGhlcndpc2UgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEwLjBcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHNpZyBhIC0+IGIgLT4gYSB8IGJcbiAqIEBwYXJhbSB7YX0gZGVmYXVsdCBUaGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEBwYXJhbSB7Yn0gdmFsIGB2YWxgIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCBvZiBgZGVmYXVsdGAgdW5sZXNzIGB2YWxgIGlzIGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYE5hTmAuXG4gKiBAcmV0dXJuIHsqfSBUaGUgc2Vjb25kIHZhbHVlIGlmIGl0IGlzIG5vdCBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGBOYU5gLCBvdGhlcndpc2UgdGhlIGRlZmF1bHQgdmFsdWVcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBkZWZhdWx0VG80MiA9IFIuZGVmYXVsdFRvKDQyKTtcbiAqXG4gKiAgICAgIGRlZmF1bHRUbzQyKG51bGwpOyAgLy89PiA0MlxuICogICAgICBkZWZhdWx0VG80Mih1bmRlZmluZWQpOyAgLy89PiA0MlxuICogICAgICBkZWZhdWx0VG80MihmYWxzZSk7ICAvLz0+IGZhbHNlXG4gKiAgICAgIGRlZmF1bHRUbzQyKCdSYW1kYScpOyAgLy89PiAnUmFtZGEnXG4gKiAgICAgIC8vIHBhcnNlSW50KCdzdHJpbmcnKSByZXN1bHRzIGluIE5hTlxuICogICAgICBkZWZhdWx0VG80MihwYXJzZUludCgnc3RyaW5nJykpOyAvLz0+IDQyXG4gKi9cbnZhciBkZWZhdWx0VG8gPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBkZWZhdWx0VG8oZCwgdikge1xuICByZXR1cm4gdiA9PSBudWxsIHx8IHYgIT09IHYgPyBkIDogdjtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgZGVmYXVsdFRvOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfU2V0IGZyb20gXCIuL2ludGVybmFsL19TZXQuanNcIjtcblxuLyoqXG4gKiBGaW5kcyB0aGUgc2V0IChpLmUuIG5vIGR1cGxpY2F0ZXMpIG9mIGFsbCBlbGVtZW50cyBpbiB0aGUgZmlyc3QgbGlzdCBub3RcbiAqIGNvbnRhaW5lZCBpbiB0aGUgc2Vjb25kIGxpc3QuIE9iamVjdHMgYW5kIEFycmF5cyBhcmUgY29tcGFyZWQgaW4gdGVybXMgb2ZcbiAqIHZhbHVlIGVxdWFsaXR5LCBub3QgcmVmZXJlbmNlIGVxdWFsaXR5LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIFsqXSAtPiBbKl0gLT4gWypdXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QyIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgZWxlbWVudHMgaW4gYGxpc3QxYCB0aGF0IGFyZSBub3QgaW4gYGxpc3QyYC5cbiAqIEBzZWUgUi5kaWZmZXJlbmNlV2l0aCwgUi5zeW1tZXRyaWNEaWZmZXJlbmNlLCBSLnN5bW1ldHJpY0RpZmZlcmVuY2VXaXRoLCBSLndpdGhvdXRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmRpZmZlcmVuY2UoWzEsMiwzLDRdLCBbNyw2LDUsNCwzXSk7IC8vPT4gWzEsMl1cbiAqICAgICAgUi5kaWZmZXJlbmNlKFs3LDYsNSw0LDNdLCBbMSwyLDMsNF0pOyAvLz0+IFs3LDYsNV1cbiAqICAgICAgUi5kaWZmZXJlbmNlKFt7YTogMX0sIHtiOiAyfV0sIFt7YTogMX0sIHtjOiAzfV0pIC8vPT4gW3tiOiAyfV1cbiAqL1xudmFyIGRpZmZlcmVuY2UgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBkaWZmZXJlbmNlKGZpcnN0LCBzZWNvbmQpIHtcbiAgdmFyIG91dCA9IFtdO1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGZpcnN0TGVuID0gZmlyc3QubGVuZ3RoO1xuICB2YXIgc2Vjb25kTGVuID0gc2Vjb25kLmxlbmd0aDtcbiAgdmFyIHRvRmlsdGVyT3V0ID0gbmV3IF9TZXQoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWNvbmRMZW47IGkgKz0gMSkge1xuICAgIHRvRmlsdGVyT3V0LmFkZChzZWNvbmRbaV0pO1xuICB9XG4gIHdoaWxlIChpZHggPCBmaXJzdExlbikge1xuICAgIGlmICh0b0ZpbHRlck91dC5hZGQoZmlyc3RbaWR4XSkpIHtcbiAgICAgIG91dFtvdXQubGVuZ3RoXSA9IGZpcnN0W2lkeF07XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBvdXQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGRpZmZlcmVuY2U7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGRpc3NvY1BhdGggZnJvbSBcIi4vZGlzc29jUGF0aC5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgZG9lcyBub3QgY29udGFpbiBhIGBwcm9wYCBwcm9wZXJ0eS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIFN0cmluZyAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcCBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZGlzc29jaWF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbCBidXQgd2l0aG91dCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5XG4gKiBAc2VlIFIuYXNzb2MsIFIub21pdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZGlzc29jKCdiJywge2E6IDEsIGI6IDIsIGM6IDN9KTsgLy89PiB7YTogMSwgYzogM31cbiAqL1xudmFyIGRpc3NvYyA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGRpc3NvYyhwcm9wLCBvYmopIHtcbiAgcmV0dXJuIGRpc3NvY1BhdGgoW3Byb3BdLCBvYmopO1xufSk7XG5leHBvcnQgZGVmYXVsdCBkaXNzb2M7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNzb2MgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3NvYy5qc1wiO1xuaW1wb3J0IF9pc0ludGVnZXIgZnJvbSBcIi4vaW50ZXJuYWwvX2lzSW50ZWdlci5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL2ludGVybmFsL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgYXNzb2MgZnJvbSBcIi4vYXNzb2MuanNcIjtcblxuLyoqXG4gKiBNYWtlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYW4gb2JqZWN0LiBOb3RlIHRoYXQgdGhpcyBjb3BpZXMgYW5kIGZsYXR0ZW5zXG4gKiBwcm90b3R5cGUgcHJvcGVydGllcyBvbnRvIHRoZSBuZXcgb2JqZWN0IGFzIHdlbGwuIEFsbCBub24tcHJpbWl0aXZlXG4gKiBwcm9wZXJ0aWVzIGFyZSBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ3xJbnRlZ2VyfSBwcm9wIFRoZSBwcm9wIG9wZXJhdGluZ1xuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R8QXJyYXl9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbC5cbiAqL1xuZnVuY3Rpb24gX3NoYWxsb3dDbG9uZU9iamVjdChwcm9wLCBvYmopIHtcbiAgaWYgKF9pc0ludGVnZXIocHJvcCkgJiYgX2lzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBbXS5jb25jYXQob2JqKTtcbiAgfVxuICB2YXIgcmVzdWx0ID0ge307XG4gIGZvciAodmFyIHAgaW4gb2JqKSB7XG4gICAgcmVzdWx0W3BdID0gb2JqW3BdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdCwgb21pdHRpbmcgdGhlIHByb3BlcnR5IGF0IHRoZSBnaXZlbiBwYXRoLlxuICogTm90ZSB0aGF0IHRoaXMgY29waWVzIGFuZCBmbGF0dGVucyBwcm90b3R5cGUgcHJvcGVydGllcyBvbnRvIHRoZSBuZXcgb2JqZWN0XG4gKiBhcyB3ZWxsLiBBbGwgbm9uLXByaW1pdGl2ZSBwcm9wZXJ0aWVzIGFyZSBjb3BpZWQgYnkgcmVmZXJlbmNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjExLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgW0lkeF0gLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byB0aGUgdmFsdWUgdG8gb21pdFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRob3V0IHRoZSBwcm9wZXJ0eSBhdCBwYXRoXG4gKiBAc2VlIFIuYXNzb2NQYXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5kaXNzb2NQYXRoKFsnYScsICdiJywgJ2MnXSwge2E6IHtiOiB7YzogNDJ9fX0pOyAvLz0+IHthOiB7Yjoge319fVxuICovXG52YXIgZGlzc29jUGF0aCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGRpc3NvY1BhdGgocGF0aCwgb2JqKSB7XG4gIGlmIChvYmogPT0gbnVsbCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgc3dpdGNoIChwYXRoLmxlbmd0aCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBvYmo7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIF9kaXNzb2MocGF0aFswXSwgb2JqKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdmFyIGhlYWQgPSBwYXRoWzBdO1xuICAgICAgdmFyIHRhaWwgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChwYXRoLCAxKTtcbiAgICAgIGlmIChvYmpbaGVhZF0gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gX3NoYWxsb3dDbG9uZU9iamVjdChoZWFkLCBvYmopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFzc29jKGhlYWQsIGRpc3NvY1BhdGgodGFpbCwgb2JqW2hlYWRdKSwgb2JqKTtcbiAgICAgIH1cbiAgfVxufSk7XG5leHBvcnQgZGVmYXVsdCBkaXNzb2NQYXRoOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaXNBcmd1bWVudHMgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJndW1lbnRzLmpzXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJyYXkuanNcIjtcbmltcG9ydCBfaXNPYmplY3QgZnJvbSBcIi4vaW50ZXJuYWwvX2lzT2JqZWN0LmpzXCI7XG5pbXBvcnQgX2lzU3RyaW5nIGZyb20gXCIuL2ludGVybmFsL19pc1N0cmluZy5qc1wiO1xuaW1wb3J0IF9pc1R5cGVkQXJyYXkgZnJvbSBcIi4vaW50ZXJuYWwvX2lzVHlwZWRBcnJheS5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGVtcHR5IHZhbHVlIG9mIGl0cyBhcmd1bWVudCdzIHR5cGUuIFJhbWRhIGRlZmluZXMgdGhlIGVtcHR5XG4gKiB2YWx1ZSBvZiBBcnJheSAoYFtdYCksIE9iamVjdCAoYHt9YCksIFN0cmluZyAoYCcnYCksXG4gKiBUeXBlZEFycmF5IChgVWludDhBcnJheSBbXWAsIGBGbG9hdDMyQXJyYXkgW11gLCBldGMpLCBhbmQgQXJndW1lbnRzLiBPdGhlclxuICogdHlwZXMgYXJlIHN1cHBvcnRlZCBpZiB0aGV5IGRlZmluZSBgPFR5cGU+LmVtcHR5YCxcbiAqIGA8VHlwZT4ucHJvdG90eXBlLmVtcHR5YCBvciBpbXBsZW1lbnQgdGhlXG4gKiBbRmFudGFzeUxhbmQgTW9ub2lkIHNwZWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjbW9ub2lkKS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgZW1wdHlgIG1ldGhvZCBvZiB0aGUgZmlyc3QgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMy4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgYSAtPiBhXG4gKiBAcGFyYW0geyp9IHhcbiAqIEByZXR1cm4geyp9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5lbXB0eShKdXN0KDQyKSk7ICAgICAgICAgICAgICAgLy89PiBOb3RoaW5nKClcbiAqICAgICAgUi5lbXB0eShbMSwgMiwgM10pOyAgICAgICAgICAgICAgLy89PiBbXVxuICogICAgICBSLmVtcHR5KCd1bmljb3JucycpOyAgICAgICAgICAgICAvLz0+ICcnXG4gKiAgICAgIFIuZW1wdHkoe3g6IDEsIHk6IDJ9KTsgICAgICAgICAgIC8vPT4ge31cbiAqICAgICAgUi5lbXB0eShVaW50OEFycmF5LmZyb20oJzEyMycpKTsgLy89PiBVaW50OEFycmF5IFtdXG4gKi9cbnZhciBlbXB0eSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGVtcHR5KHgpIHtcbiAgcmV0dXJuIHggIT0gbnVsbCAmJiB0eXBlb2YgeFsnZmFudGFzeS1sYW5kL2VtcHR5J10gPT09ICdmdW5jdGlvbicgPyB4WydmYW50YXN5LWxhbmQvZW1wdHknXSgpIDogeCAhPSBudWxsICYmIHguY29uc3RydWN0b3IgIT0gbnVsbCAmJiB0eXBlb2YgeC5jb25zdHJ1Y3RvclsnZmFudGFzeS1sYW5kL2VtcHR5J10gPT09ICdmdW5jdGlvbicgPyB4LmNvbnN0cnVjdG9yWydmYW50YXN5LWxhbmQvZW1wdHknXSgpIDogeCAhPSBudWxsICYmIHR5cGVvZiB4LmVtcHR5ID09PSAnZnVuY3Rpb24nID8geC5lbXB0eSgpIDogeCAhPSBudWxsICYmIHguY29uc3RydWN0b3IgIT0gbnVsbCAmJiB0eXBlb2YgeC5jb25zdHJ1Y3Rvci5lbXB0eSA9PT0gJ2Z1bmN0aW9uJyA/IHguY29uc3RydWN0b3IuZW1wdHkoKSA6IF9pc0FycmF5KHgpID8gW10gOiBfaXNTdHJpbmcoeCkgPyAnJyA6IF9pc09iamVjdCh4KSA/IHt9IDogX2lzQXJndW1lbnRzKHgpID8gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBhcmd1bWVudHM7XG4gIH0oKSA6IF9pc1R5cGVkQXJyYXkoeCkgPyB4LmNvbnN0cnVjdG9yLmZyb20oJycpIDogdm9pZCAwIC8vIGVsc2VcbiAgO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGVtcHR5OyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZXF1YWxzIGZyb20gXCIuL2ludGVybmFsL19lcXVhbHMuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBpdHMgYXJndW1lbnRzIGFyZSBlcXVpdmFsZW50LCBgZmFsc2VgIG90aGVyd2lzZS4gSGFuZGxlc1xuICogY3ljbGljYWwgZGF0YSBzdHJ1Y3R1cmVzLlxuICpcbiAqIERpc3BhdGNoZXMgc3ltbWV0cmljYWxseSB0byB0aGUgYGVxdWFsc2AgbWV0aG9kcyBvZiBib3RoIGFyZ3VtZW50cywgaWZcbiAqIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTUuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIGEgLT4gYiAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmVxdWFscygxLCAxKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuZXF1YWxzKDEsICcxJyk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5lcXVhbHMoWzEsIDIsIDNdLCBbMSwgMiwgM10pOyAvLz0+IHRydWVcbiAqXG4gKiAgICAgIGNvbnN0IGEgPSB7fTsgYS52ID0gYTtcbiAqICAgICAgY29uc3QgYiA9IHt9OyBiLnYgPSBiO1xuICogICAgICBSLmVxdWFscyhhLCBiKTsgLy89PiB0cnVlXG4gKi9cbnZhciBlcXVhbHMgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICByZXR1cm4gX2VxdWFscyhhLCBiLCBbXSwgW10pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBlcXVhbHM7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL2ludGVybmFsL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgX2lzT2JqZWN0IGZyb20gXCIuL2ludGVybmFsL19pc09iamVjdC5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IGJ5IHJlY3Vyc2l2ZWx5IGV2b2x2aW5nIGEgc2hhbGxvdyBjb3B5IG9mIGBvYmplY3RgLFxuICogYWNjb3JkaW5nIHRvIHRoZSBgdHJhbnNmb3JtYXRpb25gIGZ1bmN0aW9ucy4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllc1xuICogYXJlIGNvcGllZCBieSByZWZlcmVuY2UuXG4gKlxuICogQSBgdHJhbnNmb3JtYXRpb25gIGZ1bmN0aW9uIHdpbGwgbm90IGJlIGludm9rZWQgaWYgaXRzIGNvcnJlc3BvbmRpbmcga2V5XG4gKiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZXZvbHZlZCBvYmplY3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtrOiAodiAtPiB2KX0gLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtPYmplY3R9IHRyYW5zZm9ybWF0aW9ucyBUaGUgb2JqZWN0IHNwZWNpZnlpbmcgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zIHRvIGFwcGx5XG4gKiAgICAgICAgdG8gdGhlIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSB0cmFuc2Zvcm1lZC5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHRyYW5zZm9ybWVkIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB0b21hdG8gPSB7Zmlyc3ROYW1lOiAnICBUb21hdG8gJywgZGF0YToge2VsYXBzZWQ6IDEwMCwgcmVtYWluaW5nOiAxNDAwfSwgaWQ6MTIzfTtcbiAqICAgICAgY29uc3QgdHJhbnNmb3JtYXRpb25zID0ge1xuICogICAgICAgIGZpcnN0TmFtZTogUi50cmltLFxuICogICAgICAgIGxhc3ROYW1lOiBSLnRyaW0sIC8vIFdpbGwgbm90IGdldCBpbnZva2VkLlxuICogICAgICAgIGRhdGE6IHtlbGFwc2VkOiBSLmFkZCgxKSwgcmVtYWluaW5nOiBSLmFkZCgtMSl9XG4gKiAgICAgIH07XG4gKiAgICAgIFIuZXZvbHZlKHRyYW5zZm9ybWF0aW9ucywgdG9tYXRvKTsgLy89PiB7Zmlyc3ROYW1lOiAnVG9tYXRvJywgZGF0YToge2VsYXBzZWQ6IDEwMSwgcmVtYWluaW5nOiAxMzk5fSwgaWQ6MTIzfVxuICovXG52YXIgZXZvbHZlID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gZXZvbHZlKHRyYW5zZm9ybWF0aW9ucywgb2JqZWN0KSB7XG4gIGlmICghX2lzT2JqZWN0KG9iamVjdCkgJiYgIV9pc0FycmF5KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0O1xuICB9XG4gIHZhciByZXN1bHQgPSBvYmplY3QgaW5zdGFuY2VvZiBBcnJheSA/IFtdIDoge307XG4gIHZhciB0cmFuc2Zvcm1hdGlvbiwga2V5LCB0eXBlO1xuICBmb3IgKGtleSBpbiBvYmplY3QpIHtcbiAgICB0cmFuc2Zvcm1hdGlvbiA9IHRyYW5zZm9ybWF0aW9uc1trZXldO1xuICAgIHR5cGUgPSB0eXBlb2YgdHJhbnNmb3JtYXRpb247XG4gICAgcmVzdWx0W2tleV0gPSB0eXBlID09PSAnZnVuY3Rpb24nID8gdHJhbnNmb3JtYXRpb24ob2JqZWN0W2tleV0pIDogdHJhbnNmb3JtYXRpb24gJiYgdHlwZSA9PT0gJ29iamVjdCcgPyBldm9sdmUodHJhbnNmb3JtYXRpb24sIG9iamVjdFtrZXldKSA6IG9iamVjdFtrZXldO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGV2b2x2ZTsiLCJpbXBvcnQgX2FycmF5UmVkdWNlIGZyb20gXCIuL2ludGVybmFsL19hcnJheVJlZHVjZS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF9maWx0ZXIgZnJvbSBcIi4vaW50ZXJuYWwvX2ZpbHRlci5qc1wiO1xuaW1wb3J0IF9pc09iamVjdCBmcm9tIFwiLi9pbnRlcm5hbC9faXNPYmplY3QuanNcIjtcbmltcG9ydCBfeGZpbHRlciBmcm9tIFwiLi9pbnRlcm5hbC9feGZpbHRlci5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4va2V5cy5qc1wiO1xuXG4vKipcbiAqIFRha2VzIGEgcHJlZGljYXRlIGFuZCBhIGBGaWx0ZXJhYmxlYCwgYW5kIHJldHVybnMgYSBuZXcgZmlsdGVyYWJsZSBvZiB0aGVcbiAqIHNhbWUgdHlwZSBjb250YWluaW5nIHRoZSBtZW1iZXJzIG9mIHRoZSBnaXZlbiBmaWx0ZXJhYmxlIHdoaWNoIHNhdGlzZnkgdGhlXG4gKiBnaXZlbiBwcmVkaWNhdGUuIEZpbHRlcmFibGUgb2JqZWN0cyBpbmNsdWRlIHBsYWluIG9iamVjdHMgb3IgYW55IG9iamVjdFxuICogdGhhdCBoYXMgYSBmaWx0ZXIgbWV0aG9kIHN1Y2ggYXMgYEFycmF5YC5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgZmlsdGVyYCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBGaWx0ZXJhYmxlIGYgPT4gKGEgLT4gQm9vbGVhbikgLT4gZiBhIC0+IGYgYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZFxuICogQHBhcmFtIHtBcnJheX0gZmlsdGVyYWJsZVxuICogQHJldHVybiB7QXJyYXl9IEZpbHRlcmFibGVcbiAqIEBzZWUgUi5yZWplY3QsIFIudHJhbnNkdWNlLCBSLmFkZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgaXNFdmVuID0gbiA9PiBuICUgMiA9PT0gMDtcbiAqXG4gKiAgICAgIFIuZmlsdGVyKGlzRXZlbiwgWzEsIDIsIDMsIDRdKTsgLy89PiBbMiwgNF1cbiAqXG4gKiAgICAgIFIuZmlsdGVyKGlzRXZlbiwge2E6IDEsIGI6IDIsIGM6IDMsIGQ6IDR9KTsgLy89PiB7YjogMiwgZDogNH1cbiAqL1xudmFyIGZpbHRlciA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbJ2ZhbnRhc3ktbGFuZC9maWx0ZXInLCAnZmlsdGVyJ10sIF94ZmlsdGVyLCBmdW5jdGlvbiAocHJlZCwgZmlsdGVyYWJsZSkge1xuICByZXR1cm4gX2lzT2JqZWN0KGZpbHRlcmFibGUpID8gX2FycmF5UmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgIGlmIChwcmVkKGZpbHRlcmFibGVba2V5XSkpIHtcbiAgICAgIGFjY1trZXldID0gZmlsdGVyYWJsZVtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSwga2V5cyhmaWx0ZXJhYmxlKSkgOlxuICAvLyBlbHNlXG4gIF9maWx0ZXIocHJlZCwgZmlsdGVyYWJsZSk7XG59KSk7XG5leHBvcnQgZGVmYXVsdCBmaWx0ZXI7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94ZmluZCBmcm9tIFwiLi9pbnRlcm5hbC9feGZpbmQuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0IHdoaWNoIG1hdGNoZXMgdGhlIHByZWRpY2F0ZSwgb3JcbiAqIGB1bmRlZmluZWRgIGlmIG5vIGVsZW1lbnQgbWF0Y2hlcy5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgZmluZGAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IGEgfCB1bmRlZmluZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGVsZW1lbnQgaXMgdGhlXG4gKiAgICAgICAgZGVzaXJlZCBvbmUuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIGVsZW1lbnQgZm91bmQsIG9yIGB1bmRlZmluZWRgLlxuICogQHNlZSBSLnRyYW5zZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhzID0gW3thOiAxfSwge2E6IDJ9LCB7YTogM31dO1xuICogICAgICBSLmZpbmQoUi5wcm9wRXEoMiwgJ2EnKSkoeHMpOyAvLz0+IHthOiAyfVxuICogICAgICBSLmZpbmQoUi5wcm9wRXEoNCwgJ2EnKSkoeHMpOyAvLz0+IHVuZGVmaW5lZFxuICovXG52YXIgZmluZCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbJ2ZpbmQnXSwgX3hmaW5kLCBmdW5jdGlvbiBmaW5kKGZuLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIGxpc3RbaWR4XTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbn0pKTtcbmV4cG9ydCBkZWZhdWx0IGZpbmQ7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94ZmluZEluZGV4IGZyb20gXCIuL2ludGVybmFsL194ZmluZEluZGV4LmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3Qgd2hpY2ggbWF0Y2hlcyB0aGVcbiAqIHByZWRpY2F0ZSwgb3IgYC0xYCBpZiBubyBlbGVtZW50IG1hdGNoZXMuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMVxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IE51bWJlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgZWxlbWVudCBpcyB0aGVcbiAqIGRlc2lyZWQgb25lLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBmb3VuZCwgb3IgYC0xYC5cbiAqIEBzZWUgUi50cmFuc2R1Y2UsIFIuaW5kZXhPZlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhzID0gW3thOiAxfSwge2E6IDJ9LCB7YTogM31dO1xuICogICAgICBSLmZpbmRJbmRleChSLnByb3BFcSgyLCAnYScpKSh4cyk7IC8vPT4gMVxuICogICAgICBSLmZpbmRJbmRleChSLnByb3BFcSg0LCAnYScpKSh4cyk7IC8vPT4gLTFcbiAqL1xudmFyIGZpbmRJbmRleCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbXSwgX3hmaW5kSW5kZXgsIGZ1bmN0aW9uIGZpbmRJbmRleChmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgaWYgKGZuKGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiAtMTtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IGZpbmRJbmRleDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX21ha2VGbGF0IGZyb20gXCIuL2ludGVybmFsL19tYWtlRmxhdC5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBieSBwdWxsaW5nIGV2ZXJ5IGl0ZW0gb3V0IG9mIGl0IChhbmQgYWxsIGl0cyBzdWItYXJyYXlzKVxuICogYW5kIHB1dHRpbmcgdGhlbSBpbiBhIG5ldyBhcnJheSwgZGVwdGgtZmlyc3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2JdXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgZmxhdHRlbmVkIGxpc3QuXG4gKiBAc2VlIFIudW5uZXN0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5mbGF0dGVuKFsxLCAyLCBbMywgNF0sIDUsIFs2LCBbNywgOCwgWzksIFsxMCwgMTFdLCAxMl1dXV0pO1xuICogICAgICAvLz0+IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyXVxuICovXG52YXIgZmxhdHRlbiA9IC8qI19fUFVSRV9fKi9fY3VycnkxKCAvKiNfX1BVUkVfXyovX21ha2VGbGF0KHRydWUpKTtcbmV4cG9ydCBkZWZhdWx0IGZsYXR0ZW47IiwiaW1wb3J0IF9jaGVja0Zvck1ldGhvZCBmcm9tIFwiLi9pbnRlcm5hbC9fY2hlY2tGb3JNZXRob2QuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gaW5wdXQgYGxpc3RgLCBjYWxsaW5nIGEgcHJvdmlkZWQgZnVuY3Rpb24gYGZuYCBmb3IgZWFjaFxuICogZWxlbWVudCBpbiB0aGUgbGlzdC5cbiAqXG4gKiBgZm5gIHJlY2VpdmVzIG9uZSBhcmd1bWVudDogKih2YWx1ZSkqLlxuICpcbiAqIE5vdGU6IGBSLmZvckVhY2hgIGRvZXMgbm90IHNraXAgZGVsZXRlZCBvciB1bmFzc2lnbmVkIGluZGljZXMgKHNwYXJzZVxuICogYXJyYXlzKSwgdW5saWtlIHRoZSBuYXRpdmUgYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCBtZXRob2QuIEZvciBtb3JlXG4gKiBkZXRhaWxzIG9uIHRoaXMgYmVoYXZpb3IsIHNlZTpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZvckVhY2gjRGVzY3JpcHRpb25cbiAqXG4gKiBBbHNvIG5vdGUgdGhhdCwgdW5saWtlIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAsIFJhbWRhJ3MgYGZvckVhY2hgIHJldHVybnNcbiAqIHRoZSBvcmlnaW5hbCBhcnJheS4gSW4gc29tZSBsaWJyYXJpZXMgdGhpcyBmdW5jdGlvbiBpcyBuYW1lZCBgZWFjaGAuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGZvckVhY2hgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMVxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gKikgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGludm9rZS4gUmVjZWl2ZXMgb25lIGFyZ3VtZW50LCBgdmFsdWVgLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIG9yaWdpbmFsIGxpc3QuXG4gKiBAc2VlIFIuYWRkSW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBwcmludFhQbHVzRml2ZSA9IHggPT4gY29uc29sZS5sb2coeCArIDUpO1xuICogICAgICBSLmZvckVhY2gocHJpbnRYUGx1c0ZpdmUsIFsxLCAyLCAzXSk7IC8vPT4gWzEsIDIsIDNdXG4gKiAgICAgIC8vIGxvZ3MgNlxuICogICAgICAvLyBsb2dzIDdcbiAqICAgICAgLy8gbG9ncyA4XG4gKiBAc3ltYiBSLmZvckVhY2goZiwgW2EsIGIsIGNdKSA9IFthLCBiLCBjXVxuICovXG52YXIgZm9yRWFjaCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2NoZWNrRm9yTWV0aG9kKCdmb3JFYWNoJywgZnVuY3Rpb24gZm9yRWFjaChmbiwgbGlzdCkge1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgZm4obGlzdFtpZHhdKTtcbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gbGlzdDtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IGZvckVhY2g7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4va2V5cy5qc1wiO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBpbnB1dCBgb2JqZWN0YCwgY2FsbGluZyBhIHByb3ZpZGVkIGZ1bmN0aW9uIGBmbmAgZm9yIGVhY2hcbiAqIGtleSBhbmQgdmFsdWUgaW4gdGhlIG9iamVjdC5cbiAqXG4gKiBgZm5gIHJlY2VpdmVzIHRocmVlIGFyZ3VtZW50OiAqKHZhbHVlLCBrZXksIG9iaikqLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIzLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKChhLCBTdHJpbmcsIFN0ck1hcCBhKSAtPiBBbnkpIC0+IFN0ck1hcCBhIC0+IFN0ck1hcCBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLiBSZWNlaXZlcyB0aHJlZSBhcmd1bWVudCwgYHZhbHVlYCwgYGtleWAsIGBvYmpgLlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIG9yaWdpbmFsIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBwcmludEtleUNvbmNhdFZhbHVlID0gKHZhbHVlLCBrZXkpID0+IGNvbnNvbGUubG9nKGtleSArICc6JyArIHZhbHVlKTtcbiAqICAgICAgUi5mb3JFYWNoT2JqSW5kZXhlZChwcmludEtleUNvbmNhdFZhbHVlLCB7eDogMSwgeTogMn0pOyAvLz0+IHt4OiAxLCB5OiAyfVxuICogICAgICAvLyBsb2dzIHg6MVxuICogICAgICAvLyBsb2dzIHk6MlxuICogQHN5bWIgUi5mb3JFYWNoT2JqSW5kZXhlZChmLCB7eDogYSwgeTogYn0pID0ge3g6IGEsIHk6IGJ9XG4gKi9cbnZhciBmb3JFYWNoT2JqSW5kZXhlZCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGZvckVhY2hPYmpJbmRleGVkKGZuLCBvYmopIHtcbiAgdmFyIGtleUxpc3QgPSBrZXlzKG9iaik7XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwga2V5TGlzdC5sZW5ndGgpIHtcbiAgICB2YXIga2V5ID0ga2V5TGlzdFtpZHhdO1xuICAgIGZuKG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgZm9yRWFjaE9iakluZGV4ZWQ7IiwiaW1wb3J0IF9jaGVja0Zvck1ldGhvZCBmcm9tIFwiLi9pbnRlcm5hbC9fY2hlY2tGb3JNZXRob2QuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCByZWR1Y2VCeSBmcm9tIFwiLi9yZWR1Y2VCeS5qc1wiO1xuXG4vKipcbiAqIFNwbGl0cyBhIGxpc3QgaW50byBzdWItbGlzdHMgc3RvcmVkIGluIGFuIG9iamVjdCwgYmFzZWQgb24gdGhlIHJlc3VsdCBvZlxuICogY2FsbGluZyBhIGtleS1yZXR1cm5pbmcgZnVuY3Rpb24gb24gZWFjaCBlbGVtZW50LCBhbmQgZ3JvdXBpbmcgdGhlXG4gKiByZXN1bHRzIGFjY29yZGluZyB0byB2YWx1ZXMgcmV0dXJuZWQuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGdyb3VwQnlgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50IHwgU3ltYm9sXG4gKiBAc2lnIElkeCBhID0+IChiIC0+IGEpIC0+IFtiXSAtPiB7YTogW2JdfVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gOjogYSAtPiBJZHhcbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGdyb3VwXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCB3aXRoIHRoZSBvdXRwdXQgb2YgYGZuYCBmb3Iga2V5cywgbWFwcGVkIHRvIGFycmF5cyBvZiBlbGVtZW50c1xuICogICAgICAgICB0aGF0IHByb2R1Y2VkIHRoYXQga2V5IHdoZW4gcGFzc2VkIHRvIGBmbmAuXG4gKiBAc2VlIFIucmVkdWNlQnksIFIudHJhbnNkdWNlLCBSLmluZGV4QnksIFIuY29sbGVjdEJ5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYnlHcmFkZSA9IFIuZ3JvdXBCeShmdW5jdGlvbihzdHVkZW50KSB7XG4gKiAgICAgICAgY29uc3Qgc2NvcmUgPSBzdHVkZW50LnNjb3JlO1xuICogICAgICAgIHJldHVybiBzY29yZSA8IDY1ID8gJ0YnIDpcbiAqICAgICAgICAgICAgICAgc2NvcmUgPCA3MCA/ICdEJyA6XG4gKiAgICAgICAgICAgICAgIHNjb3JlIDwgODAgPyAnQycgOlxuICogICAgICAgICAgICAgICBzY29yZSA8IDkwID8gJ0InIDogJ0EnO1xuICogICAgICB9KTtcbiAqICAgICAgY29uc3Qgc3R1ZGVudHMgPSBbe25hbWU6ICdBYmJ5Jywgc2NvcmU6IDg0fSxcbiAqICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOiAnRWRkeScsIHNjb3JlOiA1OH0sXG4gKiAgICAgICAgICAgICAgICAgICAgICAvLyAuLi5cbiAqICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOiAnSmFjaycsIHNjb3JlOiA2OX1dO1xuICogICAgICBieUdyYWRlKHN0dWRlbnRzKTtcbiAqICAgICAgLy8ge1xuICogICAgICAvLyAgICdBJzogW3tuYW1lOiAnRGlhbm5lJywgc2NvcmU6IDk5fV0sXG4gKiAgICAgIC8vICAgJ0InOiBbe25hbWU6ICdBYmJ5Jywgc2NvcmU6IDg0fV1cbiAqICAgICAgLy8gICAvLyAuLi4sXG4gKiAgICAgIC8vICAgJ0YnOiBbe25hbWU6ICdFZGR5Jywgc2NvcmU6IDU4fV1cbiAqICAgICAgLy8gfVxuICovXG52YXIgZ3JvdXBCeSA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2NoZWNrRm9yTWV0aG9kKCdncm91cEJ5JywgLyojX19QVVJFX18qL3JlZHVjZUJ5KGZ1bmN0aW9uIChhY2MsIGl0ZW0pIHtcbiAgYWNjLnB1c2goaXRlbSk7XG4gIHJldHVybiBhY2M7XG59LCBbXSkpKTtcbmV4cG9ydCBkZWZhdWx0IGdyb3VwQnk7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGhhc1BhdGggZnJvbSBcIi4vaGFzUGF0aC5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgYW4gb2JqZWN0IGhhcyBhbiBvd24gcHJvcGVydHkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVcbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC43LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgcyAtPiB7czogeH0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtTdHJpbmd9IHByb3AgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNoZWNrIGZvci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgdGhlIHByb3BlcnR5IGV4aXN0cy5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBoYXNOYW1lID0gUi5oYXMoJ25hbWUnKTtcbiAqICAgICAgaGFzTmFtZSh7bmFtZTogJ2FsaWNlJ30pOyAgIC8vPT4gdHJ1ZVxuICogICAgICBoYXNOYW1lKHtuYW1lOiAnYm9iJ30pOyAgICAgLy89PiB0cnVlXG4gKiAgICAgIGhhc05hbWUoe30pOyAgICAgICAgICAgICAgICAvLz0+IGZhbHNlXG4gKlxuICogICAgICBjb25zdCBwb2ludCA9IHt4OiAwLCB5OiAwfTtcbiAqICAgICAgY29uc3QgcG9pbnRIYXMgPSBSLmhhcyhSLl9fLCBwb2ludCk7XG4gKiAgICAgIHBvaW50SGFzKCd4Jyk7ICAvLz0+IHRydWVcbiAqICAgICAgcG9pbnRIYXMoJ3knKTsgIC8vPT4gdHJ1ZVxuICogICAgICBwb2ludEhhcygneicpOyAgLy89PiBmYWxzZVxuICovXG52YXIgaGFzID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gaGFzKHByb3AsIG9iaikge1xuICByZXR1cm4gaGFzUGF0aChbcHJvcF0sIG9iaik7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGhhczsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwiLi9pbnRlcm5hbC9faGFzLmpzXCI7XG5pbXBvcnQgaXNOaWwgZnJvbSBcIi4vaXNOaWwuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGEgcGF0aCBleGlzdHMgaW4gYW4gb2JqZWN0LiBPbmx5IHRoZSBvYmplY3Qnc1xuICogb3duIHByb3BlcnRpZXMgYXJlIGNoZWNrZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjYuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludCB8IFN5bWJvbFxuICogQHNpZyBbSWR4XSAtPiB7YX0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byB1c2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2sgdGhlIHBhdGggaW4uXG4gKiBAcmV0dXJuIHtCb29sZWFufSBXaGV0aGVyIHRoZSBwYXRoIGV4aXN0cy5cbiAqIEBzZWUgUi5oYXNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmhhc1BhdGgoWydhJywgJ2InXSwge2E6IHtiOiAyfX0pOyAgICAgICAgIC8vID0+IHRydWVcbiAqICAgICAgUi5oYXNQYXRoKFsnYScsICdiJ10sIHthOiB7YjogdW5kZWZpbmVkfX0pOyAvLyA9PiB0cnVlXG4gKiAgICAgIFIuaGFzUGF0aChbJ2EnLCAnYiddLCB7YToge2M6IDJ9fSk7ICAgICAgICAgLy8gPT4gZmFsc2VcbiAqICAgICAgUi5oYXNQYXRoKFsnYScsICdiJ10sIHt9KTsgICAgICAgICAgICAgICAgICAvLyA9PiBmYWxzZVxuICovXG52YXIgaGFzUGF0aCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGhhc1BhdGgoX3BhdGgsIG9iaikge1xuICBpZiAoX3BhdGgubGVuZ3RoID09PSAwIHx8IGlzTmlsKG9iaikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHZhbCA9IG9iajtcbiAgdmFyIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBfcGF0aC5sZW5ndGgpIHtcbiAgICBpZiAoIWlzTmlsKHZhbCkgJiYgX2hhcyhfcGF0aFtpZHhdLCB2YWwpKSB7XG4gICAgICB2YWwgPSB2YWxbX3BhdGhbaWR4XV07XG4gICAgICBpZHggKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgaGFzUGF0aDsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX2lkZW50aXR5IGZyb20gXCIuL2ludGVybmFsL19pZGVudGl0eS5qc1wiO1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHJldHVybiB0aGUgcGFyYW1ldGVyIHN1cHBsaWVkIHRvIGl0LiBHb29kXG4gKiBhcyBhIGRlZmF1bHQgb3IgcGxhY2Vob2xkZXIgZnVuY3Rpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgYSAtPiBhXG4gKiBAcGFyYW0geyp9IHggVGhlIHZhbHVlIHRvIHJldHVybi5cbiAqIEByZXR1cm4geyp9IFRoZSBpbnB1dCB2YWx1ZSwgYHhgLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaWRlbnRpdHkoMSk7IC8vPT4gMVxuICpcbiAqICAgICAgY29uc3Qgb2JqID0ge307XG4gKiAgICAgIFIuaWRlbnRpdHkob2JqKSA9PT0gb2JqOyAvLz0+IHRydWVcbiAqIEBzeW1iIFIuaWRlbnRpdHkoYSkgPSBhXG4gKi9cbnZhciBpZGVudGl0eSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKF9pZGVudGl0eSk7XG5leHBvcnQgZGVmYXVsdCBpZGVudGl0eTsiLCJpbXBvcnQgX2luY2x1ZGVzIGZyb20gXCIuL2ludGVybmFsL19pbmNsdWRlcy5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgZXF1YWwsIGluIFtgUi5lcXVhbHNgXSgjZXF1YWxzKVxuICogdGVybXMsIHRvIGF0IGxlYXN0IG9uZSBlbGVtZW50IG9mIHRoZSBnaXZlbiBsaXN0OyBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEFsc28gd29ya3Mgd2l0aCBzdHJpbmdzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI2LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIGEgLT4gW2FdIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBpdGVtIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGFuIGVxdWl2YWxlbnQgaXRlbSBpcyBpbiB0aGUgbGlzdCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBAc2VlIFIuYW55XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pbmNsdWRlcygzLCBbMSwgMiwgM10pOyAvLz0+IHRydWVcbiAqICAgICAgUi5pbmNsdWRlcyg0LCBbMSwgMiwgM10pOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaW5jbHVkZXMoeyBuYW1lOiAnRnJlZCcgfSwgW3sgbmFtZTogJ0ZyZWQnIH1dKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaW5jbHVkZXMoWzQyXSwgW1s0Ml1dKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaW5jbHVkZXMoJ2JhJywgJ2JhbmFuYScpOyAvLz0+dHJ1ZVxuICovXG52YXIgaW5jbHVkZXMgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihfaW5jbHVkZXMpO1xuZXhwb3J0IGRlZmF1bHQgaW5jbHVkZXM7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pbmRleE9mIGZyb20gXCIuL2ludGVybmFsL19pbmRleE9mLmpzXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJyYXkuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbiBpdGVtIGluIGFuIGFycmF5LCBvciAtMVxuICogaWYgdGhlIGl0ZW0gaXMgbm90IGluY2x1ZGVkIGluIHRoZSBhcnJheS4gW2BSLmVxdWFsc2BdKCNlcXVhbHMpIGlzIHVzZWQgdG9cbiAqIGRldGVybWluZSBlcXVhbGl0eS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIGEgLT4gW2FdIC0+IE51bWJlclxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIGl0ZW0gdG8gZmluZC5cbiAqIEBwYXJhbSB7QXJyYXl9IHhzIFRoZSBhcnJheSB0byBzZWFyY2ggaW4uXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBpbmRleCBvZiB0aGUgdGFyZ2V0LCBvciAtMSBpZiB0aGUgdGFyZ2V0IGlzIG5vdCBmb3VuZC5cbiAqIEBzZWUgUi5sYXN0SW5kZXhPZiwgUi5maW5kSW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmluZGV4T2YoMywgWzEsMiwzLDRdKTsgLy89PiAyXG4gKiAgICAgIFIuaW5kZXhPZigxMCwgWzEsMiwzLDRdKTsgLy89PiAtMVxuICovXG52YXIgaW5kZXhPZiA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGluZGV4T2YodGFyZ2V0LCB4cykge1xuICByZXR1cm4gdHlwZW9mIHhzLmluZGV4T2YgPT09ICdmdW5jdGlvbicgJiYgIV9pc0FycmF5KHhzKSA/IHhzLmluZGV4T2YodGFyZ2V0KSA6IF9pbmRleE9mKHhzLCB0YXJnZXQsIDApO1xufSk7XG5leHBvcnQgZGVmYXVsdCBpbmRleE9mOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcblxuLyoqXG4gKiBJbnNlcnRzIHRoZSBzdXBwbGllZCBlbGVtZW50IGludG8gdGhlIGxpc3QsIGF0IHRoZSBzcGVjaWZpZWQgYGluZGV4YC4gX05vdGUgdGhhdFxuXG4gKiB0aGlzIGlzIG5vdCBkZXN0cnVjdGl2ZV86IGl0IHJldHVybnMgYSBjb3B5IG9mIHRoZSBsaXN0IHdpdGggdGhlIGNoYW5nZXMuXG4gKiA8c21hbGw+Tm8gbGlzdHMgaGF2ZSBiZWVuIGhhcm1lZCBpbiB0aGUgYXBwbGljYXRpb24gb2YgdGhpcyBmdW5jdGlvbi48L3NtYWxsPlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIuMlxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgTnVtYmVyIC0+IGEgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4IFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSB7Kn0gZWx0IFRoZSBlbGVtZW50IHRvIGluc2VydCBpbnRvIHRoZSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBpbnNlcnQgaW50b1xuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IEFycmF5IHdpdGggYGVsdGAgaW5zZXJ0ZWQgYXQgYGluZGV4YC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmluc2VydCgyLCAneCcsIFsxLDIsMyw0XSk7IC8vPT4gWzEsMiwneCcsMyw0XVxuICovXG52YXIgaW5zZXJ0ID0gLyojX19QVVJFX18qL19jdXJyeTMoZnVuY3Rpb24gaW5zZXJ0KGlkeCwgZWx0LCBsaXN0KSB7XG4gIGlkeCA9IGlkeCA8IGxpc3QubGVuZ3RoICYmIGlkeCA+PSAwID8gaWR4IDogbGlzdC5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCAwKTtcbiAgcmVzdWx0LnNwbGljZShpZHgsIDAsIGVsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGluc2VydDsiLCJpbXBvcnQgX2luY2x1ZGVzIGZyb20gXCIuL19pbmNsdWRlcy5qc1wiO1xudmFyIF9TZXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBfU2V0KCkge1xuICAgIC8qIGdsb2JhbHMgU2V0ICovXG4gICAgdGhpcy5fbmF0aXZlU2V0ID0gdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBTZXQoKSA6IG51bGw7XG4gICAgdGhpcy5faXRlbXMgPSB7fTtcbiAgfVxuICAvLyB1bnRpbCB3ZSBmaWd1cmUgb3V0IHdoeSBqc2RvYyBjaG9rZXMgb24gdGhpc1xuICAvLyBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byBhZGQgdG8gdGhlIFNldFxuICAvLyBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaXRlbSBkaWQgbm90IGV4aXN0IHByaW9yLCBvdGhlcndpc2UgZmFsc2VcbiAgLy9cbiAgX1NldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICByZXR1cm4gIWhhc09yQWRkKGl0ZW0sIHRydWUsIHRoaXMpO1xuICB9O1xuXG4gIC8vXG4gIC8vIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRvIGNoZWNrIGZvciBleGlzdGVuY2UgaW4gdGhlIFNldFxuICAvLyBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaXRlbSBleGlzdHMgaW4gdGhlIFNldCwgb3RoZXJ3aXNlIGZhbHNlXG4gIC8vXG4gIF9TZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmV0dXJuIGhhc09yQWRkKGl0ZW0sIGZhbHNlLCB0aGlzKTtcbiAgfTtcblxuICAvL1xuICAvLyBDb21iaW5lcyB0aGUgbG9naWMgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gaXRlbSBpcyBhIG1lbWJlciBvZiB0aGUgc2V0IGFuZFxuICAvLyBmb3IgYWRkaW5nIGEgbmV3IGl0ZW0gdG8gdGhlIHNldC5cbiAgLy9cbiAgLy8gQHBhcmFtIGl0ZW0gICAgICAgVGhlIGl0ZW0gdG8gY2hlY2sgb3IgYWRkIHRvIHRoZSBTZXQgaW5zdGFuY2UuXG4gIC8vIEBwYXJhbSBzaG91bGRBZGQgIElmIHRydWUsIHRoZSBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNldCBpZiBpdCBkb2Vzbid0XG4gIC8vICAgICAgICAgICAgICAgICAgIGFscmVhZHkgZXhpc3QuXG4gIC8vIEBwYXJhbSBzZXQgICAgICAgIFRoZSBzZXQgaW5zdGFuY2UgdG8gY2hlY2sgb3IgYWRkIHRvLlxuICAvLyBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBpdGVtIGFscmVhZHkgZXhpc3RlZCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAvL1xuICByZXR1cm4gX1NldDtcbn0oKTtcbmZ1bmN0aW9uIGhhc09yQWRkKGl0ZW0sIHNob3VsZEFkZCwgc2V0KSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGl0ZW07XG4gIHZhciBwcmV2U2l6ZSwgbmV3U2l6ZTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiArMCBhbmQgLTBcbiAgICAgIGlmIChpdGVtID09PSAwICYmIDEgLyBpdGVtID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgaWYgKHNldC5faXRlbXNbJy0wJ10pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBzZXQuX2l0ZW1zWyctMCddID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyB0aGVzZSB0eXBlcyBjYW4gYWxsIHV0aWxpc2UgdGhlIG5hdGl2ZSBTZXRcbiAgICAgIGlmIChzZXQuX25hdGl2ZVNldCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgcHJldlNpemUgPSBzZXQuX25hdGl2ZVNldC5zaXplO1xuICAgICAgICAgIHNldC5fbmF0aXZlU2V0LmFkZChpdGVtKTtcbiAgICAgICAgICBuZXdTaXplID0gc2V0Ll9uYXRpdmVTZXQuc2l6ZTtcbiAgICAgICAgICByZXR1cm4gbmV3U2l6ZSA9PT0gcHJldlNpemU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHNldC5fbmF0aXZlU2V0LmhhcyhpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEodHlwZSBpbiBzZXQuX2l0ZW1zKSkge1xuICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0gPSB7fTtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV1baXRlbV0gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbiBzZXQuX2l0ZW1zW3R5cGVdKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXVtpdGVtXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgLy8gc2V0Ll9pdGVtc1snYm9vbGVhbiddIGhvbGRzIGEgdHdvIGVsZW1lbnQgYXJyYXlcbiAgICAgIC8vIHJlcHJlc2VudGluZyBbIGZhbHNlRXhpc3RzLCB0cnVlRXhpc3RzIF1cbiAgICAgIGlmICh0eXBlIGluIHNldC5faXRlbXMpIHtcbiAgICAgICAgdmFyIGJJZHggPSBpdGVtID8gMSA6IDA7XG4gICAgICAgIGlmIChzZXQuX2l0ZW1zW3R5cGVdW2JJZHhdKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXVtiSWR4XSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0gPSBpdGVtID8gW2ZhbHNlLCB0cnVlXSA6IFt0cnVlLCBmYWxzZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIC8vIGNvbXBhcmUgZnVuY3Rpb25zIGZvciByZWZlcmVuY2UgZXF1YWxpdHlcbiAgICAgIGlmIChzZXQuX25hdGl2ZVNldCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgcHJldlNpemUgPSBzZXQuX25hdGl2ZVNldC5zaXplO1xuICAgICAgICAgIHNldC5fbmF0aXZlU2V0LmFkZChpdGVtKTtcbiAgICAgICAgICBuZXdTaXplID0gc2V0Ll9uYXRpdmVTZXQuc2l6ZTtcbiAgICAgICAgICByZXR1cm4gbmV3U2l6ZSA9PT0gcHJldlNpemU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHNldC5fbmF0aXZlU2V0LmhhcyhpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCEodHlwZSBpbiBzZXQuX2l0ZW1zKSkge1xuICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0gPSBbaXRlbV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIV9pbmNsdWRlcyhpdGVtLCBzZXQuX2l0ZW1zW3R5cGVdKSkge1xuICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0ucHVzaChpdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICBpZiAoc2V0Ll9pdGVtc1t0eXBlXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIGlmIChpdGVtID09PSBudWxsKSB7XG4gICAgICAgIGlmICghc2V0Ll9pdGVtc1snbnVsbCddKSB7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgc2V0Ll9pdGVtc1snbnVsbCddID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gcmVkdWNlIHRoZSBzZWFyY2ggc2l6ZSBvZiBoZXRlcm9nZW5lb3VzIHNldHMgYnkgY3JlYXRpbmcgYnVja2V0c1xuICAgICAgLy8gZm9yIGVhY2ggdHlwZS5cbiAgICAgIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlbSk7XG4gICAgICBpZiAoISh0eXBlIGluIHNldC5faXRlbXMpKSB7XG4gICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0gW2l0ZW1dO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIHNjYW4gdGhyb3VnaCBhbGwgcHJldmlvdXNseSBhcHBsaWVkIGl0ZW1zXG4gICAgICBpZiAoIV9pbmNsdWRlcyhpdGVtLCBzZXQuX2l0ZW1zW3R5cGVdKSkge1xuICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXS5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8vIEEgc2ltcGxlIFNldCB0eXBlIHRoYXQgaG9ub3VycyBSLmVxdWFscyBzZW1hbnRpY3NcbmV4cG9ydCBkZWZhdWx0IF9TZXQ7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2FyaXR5KG4sIGZuKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4gIHN3aXRjaCAobikge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSwgYTIsIGEzKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSwgYTIsIGEzLCBhNCkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDg6XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgY2FzZSA5OlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICBjYXNlIDEwOlxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSkge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmlyc3QgYXJndW1lbnQgdG8gX2FyaXR5IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciBubyBncmVhdGVyIHRoYW4gdGVuJyk7XG4gIH1cbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfYXJyYXlGcm9tSXRlcmF0b3IoaXRlcikge1xuICB2YXIgbGlzdCA9IFtdO1xuICB2YXIgbmV4dDtcbiAgd2hpbGUgKCEobmV4dCA9IGl0ZXIubmV4dCgpKS5kb25lKSB7XG4gICAgbGlzdC5wdXNoKG5leHQudmFsdWUpO1xuICB9XG4gIHJldHVybiBsaXN0O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hcnJheVJlZHVjZShyZWR1Y2VyLCBhY2MsIGxpc3QpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBhY2MgPSByZWR1Y2VyKGFjYywgbGlzdFtpbmRleF0pO1xuICAgIGluZGV4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIGFjYztcbn0iLCJpbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vX2lzQXJyYXkuanNcIjtcbmltcG9ydCBfaXNJbnRlZ2VyIGZyb20gXCIuL19pc0ludGVnZXIuanNcIjtcblxuLyoqXG4gKiBNYWtlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYW4gb2JqZWN0LCBzZXR0aW5nIG9yIG92ZXJyaWRpbmcgdGhlIHNwZWNpZmllZFxuICogcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuIE5vdGUgdGhhdCB0aGlzIGNvcGllcyBhbmQgZmxhdHRlbnMgcHJvdG90eXBlXG4gKiBwcm9wZXJ0aWVzIG9udG8gdGhlIG5ldyBvYmplY3QgYXMgd2VsbC4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllcyBhcmVcbiAqIGNvcGllZCBieSByZWZlcmVuY2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gcHJvcCBUaGUgcHJvcGVydHkgbmFtZSB0byBzZXRcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSBuZXcgdmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmogVGhlIG9iamVjdCB0byBjbG9uZVxuICogQHJldHVybiB7T2JqZWN0fEFycmF5fSBBIG5ldyBvYmplY3QgZXF1aXZhbGVudCB0byB0aGUgb3JpZ2luYWwgZXhjZXB0IGZvciB0aGUgY2hhbmdlZCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Fzc29jKHByb3AsIHZhbCwgb2JqKSB7XG4gIGlmIChfaXNJbnRlZ2VyKHByb3ApICYmIF9pc0FycmF5KG9iaikpIHtcbiAgICB2YXIgYXJyID0gW10uY29uY2F0KG9iaik7XG4gICAgYXJyW3Byb3BdID0gdmFsO1xuICAgIHJldHVybiBhcnI7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIG9iaikge1xuICAgIHJlc3VsdFtwXSA9IG9ialtwXTtcbiAgfVxuICByZXN1bHRbcHJvcF0gPSB2YWw7XG4gIHJldHVybiByZXN1bHQ7XG59IiwiaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL19pc0FycmF5LmpzXCI7XG5cbi8qKlxuICogVGhpcyBjaGVja3Mgd2hldGhlciBhIGZ1bmN0aW9uIGhhcyBhIFttZXRob2RuYW1lXSBmdW5jdGlvbi4gSWYgaXQgaXNuJ3QgYW5cbiAqIGFycmF5IGl0IHdpbGwgZXhlY3V0ZSB0aGF0IGZ1bmN0aW9uIG90aGVyd2lzZSBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIHJhbWRhXG4gKiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gcmFtZGEgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2RuYW1lIHByb3BlcnR5IHRvIGNoZWNrIGZvciBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvblxuICogQHJldHVybiB7T2JqZWN0fSBXaGF0ZXZlciB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBtZXRob2QgaXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jaGVja0Zvck1ldGhvZChtZXRob2RuYW1lLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cbiAgICB2YXIgb2JqID0gYXJndW1lbnRzW2xlbmd0aCAtIDFdO1xuICAgIHJldHVybiBfaXNBcnJheShvYmopIHx8IHR5cGVvZiBvYmpbbWV0aG9kbmFtZV0gIT09ICdmdW5jdGlvbicgPyBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogb2JqW21ldGhvZG5hbWVdLmFwcGx5KG9iaiwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCBsZW5ndGggLSAxKSk7XG4gIH07XG59IiwiaW1wb3J0IF9jbG9uZVJlZ0V4cCBmcm9tIFwiLi9fY2xvbmVSZWdFeHAuanNcIjtcbmltcG9ydCB0eXBlIGZyb20gXCIuLi90eXBlLmpzXCI7XG5cbi8qKlxuICogQ29waWVzIGFuIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgY29waWVkXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXAgV2hldGhlciBvciBub3QgdG8gcGVyZm9ybSBkZWVwIGNsb25pbmcuXG4gKiBAcmV0dXJuIHsqfSBUaGUgY29waWVkIHZhbHVlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xvbmUodmFsdWUsIGRlZXAsIG1hcCkge1xuICBtYXAgfHwgKG1hcCA9IG5ldyBfT2JqZWN0TWFwKCkpO1xuXG4gIC8vIHRoaXMgYXZvaWRzIHRoZSBzbG93ZXIgc3dpdGNoIHdpdGggYSBxdWljayBpZiBkZWNpc2lvbiByZW1vdmluZyBzb21lIG1pbGxpc2Vjb25kcyBpbiBlYWNoIHJ1bi5cbiAgaWYgKF9pc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdmFyIGNvcHkgPSBmdW5jdGlvbiBjb3B5KGNvcGllZFZhbHVlKSB7XG4gICAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIGFuZCBzYW1lIHJlZmVyZW5jZXMgb24gdGhlIG9iamVjdCBncmFwaCBhbmQgcmV0dXJuIGl0cyBjb3JyZXNwb25kaW5nIGNsb25lLlxuICAgIHZhciBjYWNoZWRDb3B5ID0gbWFwLmdldCh2YWx1ZSk7XG4gICAgaWYgKGNhY2hlZENvcHkpIHtcbiAgICAgIHJldHVybiBjYWNoZWRDb3B5O1xuICAgIH1cbiAgICBtYXAuc2V0KHZhbHVlLCBjb3BpZWRWYWx1ZSk7XG4gICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSB7XG4gICAgICAgIGNvcGllZFZhbHVlW2tleV0gPSBkZWVwID8gX2Nsb25lKHZhbHVlW2tleV0sIHRydWUsIG1hcCkgOiB2YWx1ZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29waWVkVmFsdWU7XG4gIH07XG4gIHN3aXRjaCAodHlwZSh2YWx1ZSkpIHtcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuIGNvcHkoT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpKSk7XG4gICAgY2FzZSAnQXJyYXknOlxuICAgICAgcmV0dXJuIGNvcHkoQXJyYXkodmFsdWUubGVuZ3RoKSk7XG4gICAgY2FzZSAnRGF0ZSc6XG4gICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUudmFsdWVPZigpKTtcbiAgICBjYXNlICdSZWdFeHAnOlxuICAgICAgcmV0dXJuIF9jbG9uZVJlZ0V4cCh2YWx1ZSk7XG4gICAgY2FzZSAnSW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OENsYW1wZWRBcnJheSc6XG4gICAgY2FzZSAnSW50MTZBcnJheSc6XG4gICAgY2FzZSAnVWludDE2QXJyYXknOlxuICAgIGNhc2UgJ0ludDMyQXJyYXknOlxuICAgIGNhc2UgJ1VpbnQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0NjRBcnJheSc6XG4gICAgY2FzZSAnQmlnSW50NjRBcnJheSc6XG4gICAgY2FzZSAnQmlnVWludDY0QXJyYXknOlxuICAgICAgcmV0dXJuIHZhbHVlLnNsaWNlKCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gX2lzUHJpbWl0aXZlKHBhcmFtKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHBhcmFtO1xuICByZXR1cm4gcGFyYW0gPT0gbnVsbCB8fCB0eXBlICE9ICdvYmplY3QnICYmIHR5cGUgIT0gJ2Z1bmN0aW9uJztcbn1cbnZhciBfT2JqZWN0TWFwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gX09iamVjdE1hcCgpIHtcbiAgICB0aGlzLm1hcCA9IHt9O1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgfVxuICBfT2JqZWN0TWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIHZhciBoYXNoZWRLZXkgPSB0aGlzLmhhc2goa2V5KTtcbiAgICB2YXIgYnVja2V0ID0gdGhpcy5tYXBbaGFzaGVkS2V5XTtcbiAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgdGhpcy5tYXBbaGFzaGVkS2V5XSA9IGJ1Y2tldCA9IFtdO1xuICAgIH1cbiAgICBidWNrZXQucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgIHRoaXMubGVuZ3RoICs9IDE7XG4gIH07XG4gIF9PYmplY3RNYXAucHJvdG90eXBlLmhhc2ggPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGhhc2hlZEtleSA9IFtdO1xuICAgIGZvciAodmFyIHZhbHVlIGluIGtleSkge1xuICAgICAgaGFzaGVkS2V5LnB1c2goT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGtleVt2YWx1ZV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc2hlZEtleS5qb2luKCk7XG4gIH07XG4gIF9PYmplY3RNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAvKipcbiAgICAgKiBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBvYmplY3RzIHRvIGJlIGNsb25lZCBpcyBmYXN0ZXIgdG8ganVzdCBpdGVyYXRlIG92ZXIgdGhlIGl0ZW1zIGluIHRoZSBtYXAganVzdCBiZWNhdXNlIHRoZSBoYXNoIGZ1bmN0aW9uIGlzIHNvIGNvc3RseSxcbiAgICAgKiBvbiBteSB0ZXN0cyB0aGlzIG51bWJlciBpcyAxODAsIGFueXRoaW5nIGFib3ZlIHRoYXQgdXNpbmcgdGhlIGhhc2ggZnVuY3Rpb24gaXMgZmFzdGVyLlxuICAgICAqL1xuICAgIGlmICh0aGlzLmxlbmd0aCA8PSAxODApIHtcbiAgICAgIGZvciAodmFyIHAgaW4gdGhpcy5tYXApIHtcbiAgICAgICAgdmFyIGJ1Y2tldCA9IHRoaXMubWFwW3BdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Y2tldC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIHZhciBlbGVtZW50ID0gYnVja2V0W2ldO1xuICAgICAgICAgIGlmIChlbGVtZW50WzBdID09PSBrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50WzFdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaGFzaGVkS2V5ID0gdGhpcy5oYXNoKGtleSk7XG4gICAgdmFyIGJ1Y2tldCA9IHRoaXMubWFwW2hhc2hlZEtleV07XG4gICAgaWYgKCFidWNrZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWNrZXQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHZhciBlbGVtZW50ID0gYnVja2V0W2ldO1xuICAgICAgaWYgKGVsZW1lbnRbMF0gPT09IGtleSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudFsxXTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBfT2JqZWN0TWFwO1xufSgpOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jbG9uZVJlZ0V4cChwYXR0ZXJuKSB7XG4gIHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4uc291cmNlLCBwYXR0ZXJuLmZsYWdzID8gcGF0dGVybi5mbGFncyA6IChwYXR0ZXJuLmdsb2JhbCA/ICdnJyA6ICcnKSArIChwYXR0ZXJuLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgKyAocGF0dGVybi5tdWx0aWxpbmUgPyAnbScgOiAnJykgKyAocGF0dGVybi5zdGlja3kgPyAneScgOiAnJykgKyAocGF0dGVybi51bmljb2RlID8gJ3UnIDogJycpICsgKHBhdHRlcm4uZG90QWxsID8gJ3MnIDogJycpKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY29tcGxlbWVudChmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICFmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59IiwiLyoqXG4gKiBQcml2YXRlIGBjb25jYXRgIGZ1bmN0aW9uIHRvIG1lcmdlIHR3byBhcnJheS1saWtlIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8QXJndW1lbnRzfSBbc2V0MT1bXV0gQW4gYXJyYXktbGlrZSBvYmplY3QuXG4gKiBAcGFyYW0ge0FycmF5fEFyZ3VtZW50c30gW3NldDI9W11dIEFuIGFycmF5LWxpa2Ugb2JqZWN0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3LCBtZXJnZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgX2NvbmNhdChbNCwgNSwgNl0sIFsxLCAyLCAzXSk7IC8vPT4gWzQsIDUsIDYsIDEsIDIsIDNdXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9jb25jYXQoc2V0MSwgc2V0Mikge1xuICBzZXQxID0gc2V0MSB8fCBbXTtcbiAgc2V0MiA9IHNldDIgfHwgW107XG4gIHZhciBpZHg7XG4gIHZhciBsZW4xID0gc2V0MS5sZW5ndGg7XG4gIHZhciBsZW4yID0gc2V0Mi5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxlbjEpIHtcbiAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBzZXQxW2lkeF07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxlbjIpIHtcbiAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBzZXQyW2lkeF07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJpbXBvcnQgX2lzQXJyYXlMaWtlIGZyb20gXCIuL19pc0FycmF5TGlrZS5qc1wiO1xudmFyIHN5bUl0ZXJhdG9yID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgPyBTeW1ib2wuaXRlcmF0b3IgOiAnQEBpdGVyYXRvcic7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY3JlYXRlUmVkdWNlKGFycmF5UmVkdWNlLCBtZXRob2RSZWR1Y2UsIGl0ZXJhYmxlUmVkdWNlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBfcmVkdWNlKHhmLCBhY2MsIGxpc3QpIHtcbiAgICBpZiAoX2lzQXJyYXlMaWtlKGxpc3QpKSB7XG4gICAgICByZXR1cm4gYXJyYXlSZWR1Y2UoeGYsIGFjYywgbGlzdCk7XG4gICAgfVxuICAgIGlmIChsaXN0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGlzdFsnZmFudGFzeS1sYW5kL3JlZHVjZSddID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbWV0aG9kUmVkdWNlKHhmLCBhY2MsIGxpc3QsICdmYW50YXN5LWxhbmQvcmVkdWNlJyk7XG4gICAgfVxuICAgIGlmIChsaXN0W3N5bUl0ZXJhdG9yXSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gaXRlcmFibGVSZWR1Y2UoeGYsIGFjYywgbGlzdFtzeW1JdGVyYXRvcl0oKSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGlzdC5uZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaXRlcmFibGVSZWR1Y2UoeGYsIGFjYywgbGlzdCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGlzdC5yZWR1Y2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBtZXRob2RSZWR1Y2UoeGYsIGFjYywgbGlzdCwgJ3JlZHVjZScpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWR1Y2U6IGxpc3QgbXVzdCBiZSBhcnJheSBvciBpdGVyYWJsZScpO1xuICB9O1xufSIsImltcG9ydCBfaXNQbGFjZWhvbGRlciBmcm9tIFwiLi9faXNQbGFjZWhvbGRlci5qc1wiO1xuXG4vKipcbiAqIE9wdGltaXplZCBpbnRlcm5hbCBvbmUtYXJpdHkgY3VycnkgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBjdXJyaWVkIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY3VycnkxKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmMShhKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDAgfHwgX2lzUGxhY2Vob2xkZXIoYSkpIHtcbiAgICAgIHJldHVybiBmMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9O1xufSIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaXNQbGFjZWhvbGRlciBmcm9tIFwiLi9faXNQbGFjZWhvbGRlci5qc1wiO1xuXG4vKipcbiAqIE9wdGltaXplZCBpbnRlcm5hbCB0d28tYXJpdHkgY3VycnkgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBjdXJyaWVkIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY3VycnkyKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmMihhLCBiKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiBmMjtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpID8gZjIgOiBfY3VycnkxKGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgIHJldHVybiBmbihhLCBfYik7XG4gICAgICAgIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGIpID8gZjIgOiBfaXNQbGFjZWhvbGRlcihhKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKF9hLCBiKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iKTtcbiAgICAgICAgfSkgOiBmbihhLCBiKTtcbiAgICB9XG4gIH07XG59IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pc1BsYWNlaG9sZGVyIGZyb20gXCIuL19pc1BsYWNlaG9sZGVyLmpzXCI7XG5cbi8qKlxuICogT3B0aW1pemVkIGludGVybmFsIHRocmVlLWFyaXR5IGN1cnJ5IGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2N1cnJ5Myhmbikge1xuICByZXR1cm4gZnVuY3Rpb24gZjMoYSwgYiwgYykge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gZjM7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSA/IGYzIDogX2N1cnJ5MihmdW5jdGlvbiAoX2IsIF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iLCBfYyk7XG4gICAgICAgIH0pO1xuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYikgPyBmMyA6IF9pc1BsYWNlaG9sZGVyKGEpID8gX2N1cnJ5MihmdW5jdGlvbiAoX2EsIF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKF9hLCBiLCBfYyk7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkyKGZ1bmN0aW9uIChfYiwgX2MpIHtcbiAgICAgICAgICByZXR1cm4gZm4oYSwgX2IsIF9jKTtcbiAgICAgICAgfSkgOiBfY3VycnkxKGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgIHJldHVybiBmbihhLCBiLCBfYyk7XG4gICAgICAgIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGIpICYmIF9pc1BsYWNlaG9sZGVyKGMpID8gZjMgOiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTIoZnVuY3Rpb24gKF9hLCBfYikge1xuICAgICAgICAgIHJldHVybiBmbihfYSwgX2IsIGMpO1xuICAgICAgICB9KSA6IF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGMpID8gX2N1cnJ5MihmdW5jdGlvbiAoX2EsIF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKF9hLCBiLCBfYyk7XG4gICAgICAgIH0pIDogX2lzUGxhY2Vob2xkZXIoYikgJiYgX2lzUGxhY2Vob2xkZXIoYykgPyBfY3VycnkyKGZ1bmN0aW9uIChfYiwgX2MpIHtcbiAgICAgICAgICByZXR1cm4gZm4oYSwgX2IsIF9jKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihhKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKF9hLCBiLCBjKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIF9iLCBjKTtcbiAgICAgICAgfSkgOiBfaXNQbGFjZWhvbGRlcihjKSA/IF9jdXJyeTEoZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgcmV0dXJuIGZuKGEsIGIsIF9jKTtcbiAgICAgICAgfSkgOiBmbihhLCBiLCBjKTtcbiAgICB9XG4gIH07XG59IiwiaW1wb3J0IF9hcml0eSBmcm9tIFwiLi9fYXJpdHkuanNcIjtcbmltcG9ydCBfaXNQbGFjZWhvbGRlciBmcm9tIFwiLi9faXNQbGFjZWhvbGRlci5qc1wiO1xuXG4vKipcbiAqIEludGVybmFsIGN1cnJ5TiBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gbGVuZ3RoIFRoZSBhcml0eSBvZiB0aGUgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IHJlY2VpdmVkIEFuIGFycmF5IG9mIGFyZ3VtZW50cyByZWNlaXZlZCB0aHVzIGZhci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2N1cnJ5TihsZW5ndGgsIHJlY2VpdmVkLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb21iaW5lZCA9IFtdO1xuICAgIHZhciBhcmdzSWR4ID0gMDtcbiAgICB2YXIgbGVmdCA9IGxlbmd0aDtcbiAgICB2YXIgY29tYmluZWRJZHggPSAwO1xuICAgIHZhciBoYXNQbGFjZWhvbGRlciA9IGZhbHNlO1xuICAgIHdoaWxlIChjb21iaW5lZElkeCA8IHJlY2VpdmVkLmxlbmd0aCB8fCBhcmdzSWR4IDwgYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIGlmIChjb21iaW5lZElkeCA8IHJlY2VpdmVkLmxlbmd0aCAmJiAoIV9pc1BsYWNlaG9sZGVyKHJlY2VpdmVkW2NvbWJpbmVkSWR4XSkgfHwgYXJnc0lkeCA+PSBhcmd1bWVudHMubGVuZ3RoKSkge1xuICAgICAgICByZXN1bHQgPSByZWNlaXZlZFtjb21iaW5lZElkeF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBhcmd1bWVudHNbYXJnc0lkeF07XG4gICAgICAgIGFyZ3NJZHggKz0gMTtcbiAgICAgIH1cbiAgICAgIGNvbWJpbmVkW2NvbWJpbmVkSWR4XSA9IHJlc3VsdDtcbiAgICAgIGlmICghX2lzUGxhY2Vob2xkZXIocmVzdWx0KSkge1xuICAgICAgICBsZWZ0IC09IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYXNQbGFjZWhvbGRlciA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb21iaW5lZElkeCArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gIWhhc1BsYWNlaG9sZGVyICYmIGxlZnQgPD0gMCA/IGZuLmFwcGx5KHRoaXMsIGNvbWJpbmVkKSA6IF9hcml0eShNYXRoLm1heCgwLCBsZWZ0KSwgX2N1cnJ5TihsZW5ndGgsIGNvbWJpbmVkLCBmbikpO1xuICB9O1xufSIsImltcG9ydCBfaXNBcnJheSBmcm9tIFwiLi9faXNBcnJheS5qc1wiO1xuaW1wb3J0IF9pc1RyYW5zZm9ybWVyIGZyb20gXCIuL19pc1RyYW5zZm9ybWVyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgZGlzcGF0Y2hlcyB3aXRoIGRpZmZlcmVudCBzdHJhdGVnaWVzIGJhc2VkIG9uIHRoZVxuICogb2JqZWN0IGluIGxpc3QgcG9zaXRpb24gKGxhc3QgYXJndW1lbnQpLiBJZiBpdCBpcyBhbiBhcnJheSwgZXhlY3V0ZXMgW2ZuXS5cbiAqIE90aGVyd2lzZSwgaWYgaXQgaGFzIGEgZnVuY3Rpb24gd2l0aCBvbmUgb2YgdGhlIGdpdmVuIG1ldGhvZCBuYW1lcywgaXQgd2lsbFxuICogZXhlY3V0ZSB0aGF0IGZ1bmN0aW9uIChmdW5jdG9yIGNhc2UpLiBPdGhlcndpc2UsIGlmIGl0IGlzIGEgdHJhbnNmb3JtZXIsXG4gKiB1c2VzIHRyYW5zZHVjZXIgY3JlYXRlZCBieSBbdHJhbnNkdWNlckNyZWF0b3JdIHRvIHJldHVybiBhIG5ldyB0cmFuc2Zvcm1lclxuICogKHRyYW5zZHVjZXIgY2FzZSkuXG4gKiBPdGhlcndpc2UsIGl0IHdpbGwgZGVmYXVsdCB0byBleGVjdXRpbmcgW2ZuXS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gbWV0aG9kTmFtZXMgcHJvcGVydGllcyB0byBjaGVjayBmb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZHVjZXJDcmVhdG9yIHRyYW5zZHVjZXIgZmFjdG9yeSBpZiBvYmplY3QgaXMgdHJhbnNmb3JtZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIGRlZmF1bHQgcmFtZGEgaW1wbGVtZW50YXRpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgZGlzcGF0Y2hlcyBvbiBvYmplY3QgaW4gbGlzdCBwb3NpdGlvblxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZGlzcGF0Y2hhYmxlKG1ldGhvZE5hbWVzLCB0cmFuc2R1Y2VyQ3JlYXRvciwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfVxuICAgIHZhciBvYmogPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgIGlmICghX2lzQXJyYXkob2JqKSkge1xuICAgICAgdmFyIGlkeCA9IDA7XG4gICAgICB3aGlsZSAoaWR4IDwgbWV0aG9kTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW21ldGhvZE5hbWVzW2lkeF1dID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIG9ialttZXRob2ROYW1lc1tpZHhdXS5hcHBseShvYmosIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgLTEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZHggKz0gMTtcbiAgICAgIH1cbiAgICAgIGlmIChfaXNUcmFuc2Zvcm1lcihvYmopKSB7XG4gICAgICAgIHZhciB0cmFuc2R1Y2VyID0gdHJhbnNkdWNlckNyZWF0b3IuYXBwbHkobnVsbCwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSkpO1xuICAgICAgICByZXR1cm4gdHJhbnNkdWNlcihvYmopO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0iLCJpbXBvcnQgX2lzSW50ZWdlciBmcm9tIFwiLi9faXNJbnRlZ2VyLmpzXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcIi4vX2lzQXJyYXkuanNcIjtcbmltcG9ydCByZW1vdmUgZnJvbSBcIi4uL3JlbW92ZS5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgZG9lcyBub3QgY29udGFpbiBhIGBwcm9wYCBwcm9wZXJ0eS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBwcm9wIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBkaXNzb2NpYXRlXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gY2xvbmVcbiAqIEByZXR1cm4ge09iamVjdH0gQSBuZXcgb2JqZWN0IGVxdWl2YWxlbnQgdG8gdGhlIG9yaWdpbmFsIGJ1dCB3aXRob3V0IHRoZSBzcGVjaWZpZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Rpc3NvYyhwcm9wLCBvYmopIHtcbiAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICBpZiAoX2lzSW50ZWdlcihwcm9wKSAmJiBfaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIHJlbW92ZShwcm9wLCAxLCBvYmopO1xuICB9XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBvYmopIHtcbiAgICByZXN1bHRbcF0gPSBvYmpbcF07XG4gIH1cbiAgZGVsZXRlIHJlc3VsdFtwcm9wXTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJpbXBvcnQgX2FycmF5RnJvbUl0ZXJhdG9yIGZyb20gXCIuL19hcnJheUZyb21JdGVyYXRvci5qc1wiO1xuaW1wb3J0IF9pbmNsdWRlc1dpdGggZnJvbSBcIi4vX2luY2x1ZGVzV2l0aC5qc1wiO1xuaW1wb3J0IF9mdW5jdGlvbk5hbWUgZnJvbSBcIi4vX2Z1bmN0aW9uTmFtZS5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vX2hhcy5qc1wiO1xuaW1wb3J0IF9vYmplY3RJcyBmcm9tIFwiLi9fb2JqZWN0SXMuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuLi9rZXlzLmpzXCI7XG5pbXBvcnQgdHlwZSBmcm9tIFwiLi4vdHlwZS5qc1wiO1xuXG4vKipcbiAqIHByaXZhdGUgX3VuaXFDb250ZW50RXF1YWxzIGZ1bmN0aW9uLlxuICogVGhhdCBmdW5jdGlvbiBpcyBjaGVja2luZyBlcXVhbGl0eSBvZiAyIGl0ZXJhdG9yIGNvbnRlbnRzIHdpdGggMiBhc3N1bXB0aW9uc1xuICogLSBpdGVyYXRvcnMgbGVuZ3RocyBhcmUgdGhlIHNhbWVcbiAqIC0gaXRlcmF0b3JzIHZhbHVlcyBhcmUgdW5pcXVlXG4gKlxuICogZmFsc2UtcG9zaXRpdmUgcmVzdWx0IHdpbGwgYmUgcmV0dXJuZWQgZm9yIGNvbXBhcmlzb24gb2YsIGUuZy5cbiAqIC0gWzEsMiwzXSBhbmQgWzEsMiwzLDRdXG4gKiAtIFsxLDEsMV0gYW5kIFsxLDIsM11cbiAqICovXG5cbmZ1bmN0aW9uIF91bmlxQ29udGVudEVxdWFscyhhSXRlcmF0b3IsIGJJdGVyYXRvciwgc3RhY2tBLCBzdGFja0IpIHtcbiAgdmFyIGEgPSBfYXJyYXlGcm9tSXRlcmF0b3IoYUl0ZXJhdG9yKTtcbiAgdmFyIGIgPSBfYXJyYXlGcm9tSXRlcmF0b3IoYkl0ZXJhdG9yKTtcbiAgZnVuY3Rpb24gZXEoX2EsIF9iKSB7XG4gICAgcmV0dXJuIF9lcXVhbHMoX2EsIF9iLCBzdGFja0Euc2xpY2UoKSwgc3RhY2tCLnNsaWNlKCkpO1xuICB9XG5cbiAgLy8gaWYgKmEqIGFycmF5IGNvbnRhaW5zIGFueSBlbGVtZW50IHRoYXQgaXMgbm90IGluY2x1ZGVkIGluICpiKlxuICByZXR1cm4gIV9pbmNsdWRlc1dpdGgoZnVuY3Rpb24gKGIsIGFJdGVtKSB7XG4gICAgcmV0dXJuICFfaW5jbHVkZXNXaXRoKGVxLCBhSXRlbSwgYik7XG4gIH0sIGIsIGEpO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2VxdWFscyhhLCBiLCBzdGFja0EsIHN0YWNrQikge1xuICBpZiAoX29iamVjdElzKGEsIGIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIHR5cGVBID0gdHlwZShhKTtcbiAgaWYgKHR5cGVBICE9PSB0eXBlKGIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgYVsnZmFudGFzeS1sYW5kL2VxdWFscyddID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBiWydmYW50YXN5LWxhbmQvZXF1YWxzJ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZW9mIGFbJ2ZhbnRhc3ktbGFuZC9lcXVhbHMnXSA9PT0gJ2Z1bmN0aW9uJyAmJiBhWydmYW50YXN5LWxhbmQvZXF1YWxzJ10oYikgJiYgdHlwZW9mIGJbJ2ZhbnRhc3ktbGFuZC9lcXVhbHMnXSA9PT0gJ2Z1bmN0aW9uJyAmJiBiWydmYW50YXN5LWxhbmQvZXF1YWxzJ10oYSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBhLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgYi5lcXVhbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZW9mIGEuZXF1YWxzID09PSAnZnVuY3Rpb24nICYmIGEuZXF1YWxzKGIpICYmIHR5cGVvZiBiLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJyAmJiBiLmVxdWFscyhhKTtcbiAgfVxuICBzd2l0Y2ggKHR5cGVBKSB7XG4gICAgY2FzZSAnQXJndW1lbnRzJzpcbiAgICBjYXNlICdBcnJheSc6XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIGlmICh0eXBlb2YgYS5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyAmJiBfZnVuY3Rpb25OYW1lKGEuY29uc3RydWN0b3IpID09PSAnUHJvbWlzZScpIHtcbiAgICAgICAgcmV0dXJuIGEgPT09IGI7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdCb29sZWFuJzpcbiAgICBjYXNlICdOdW1iZXInOlxuICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICBpZiAoISh0eXBlb2YgYSA9PT0gdHlwZW9mIGIgJiYgX29iamVjdElzKGEudmFsdWVPZigpLCBiLnZhbHVlT2YoKSkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgaWYgKCFfb2JqZWN0SXMoYS52YWx1ZU9mKCksIGIudmFsdWVPZigpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdFcnJvcic6XG4gICAgICByZXR1cm4gYS5uYW1lID09PSBiLm5hbWUgJiYgYS5tZXNzYWdlID09PSBiLm1lc3NhZ2U7XG4gICAgY2FzZSAnUmVnRXhwJzpcbiAgICAgIGlmICghKGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiYgYS5pZ25vcmVDYXNlID09PSBiLmlnbm9yZUNhc2UgJiYgYS5tdWx0aWxpbmUgPT09IGIubXVsdGlsaW5lICYmIGEuc3RpY2t5ID09PSBiLnN0aWNreSAmJiBhLnVuaWNvZGUgPT09IGIudW5pY29kZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cbiAgdmFyIGlkeCA9IHN0YWNrQS5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICBpZiAoc3RhY2tBW2lkeF0gPT09IGEpIHtcbiAgICAgIHJldHVybiBzdGFja0JbaWR4XSA9PT0gYjtcbiAgICB9XG4gICAgaWR4IC09IDE7XG4gIH1cbiAgc3dpdGNoICh0eXBlQSkge1xuICAgIGNhc2UgJ01hcCc6XG4gICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF91bmlxQ29udGVudEVxdWFscyhhLmVudHJpZXMoKSwgYi5lbnRyaWVzKCksIHN0YWNrQS5jb25jYXQoW2FdKSwgc3RhY2tCLmNvbmNhdChbYl0pKTtcbiAgICBjYXNlICdTZXQnOlxuICAgICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfdW5pcUNvbnRlbnRFcXVhbHMoYS52YWx1ZXMoKSwgYi52YWx1ZXMoKSwgc3RhY2tBLmNvbmNhdChbYV0pLCBzdGFja0IuY29uY2F0KFtiXSkpO1xuICAgIGNhc2UgJ0FyZ3VtZW50cyc6XG4gICAgY2FzZSAnQXJyYXknOlxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgY2FzZSAnQm9vbGVhbic6XG4gICAgY2FzZSAnTnVtYmVyJzpcbiAgICBjYXNlICdTdHJpbmcnOlxuICAgIGNhc2UgJ0RhdGUnOlxuICAgIGNhc2UgJ0Vycm9yJzpcbiAgICBjYXNlICdSZWdFeHAnOlxuICAgIGNhc2UgJ0ludDhBcnJheSc6XG4gICAgY2FzZSAnVWludDhBcnJheSc6XG4gICAgY2FzZSAnVWludDhDbGFtcGVkQXJyYXknOlxuICAgIGNhc2UgJ0ludDE2QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQxNkFycmF5JzpcbiAgICBjYXNlICdJbnQzMkFycmF5JzpcbiAgICBjYXNlICdVaW50MzJBcnJheSc6XG4gICAgY2FzZSAnRmxvYXQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDY0QXJyYXknOlxuICAgIGNhc2UgJ0FycmF5QnVmZmVyJzpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBWYWx1ZXMgb2Ygb3RoZXIgdHlwZXMgYXJlIG9ubHkgZXF1YWwgaWYgaWRlbnRpY2FsLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBrZXlzQSA9IGtleXMoYSk7XG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXMoYikubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBleHRlbmRlZFN0YWNrQSA9IHN0YWNrQS5jb25jYXQoW2FdKTtcbiAgdmFyIGV4dGVuZGVkU3RhY2tCID0gc3RhY2tCLmNvbmNhdChbYl0pO1xuICBpZHggPSBrZXlzQS5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICB2YXIga2V5ID0ga2V5c0FbaWR4XTtcbiAgICBpZiAoIShfaGFzKGtleSwgYikgJiYgX2VxdWFscyhiW2tleV0sIGFba2V5XSwgZXh0ZW5kZWRTdGFja0EsIGV4dGVuZGVkU3RhY2tCKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWR4IC09IDE7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2ZpbHRlcihmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gbGlzdFtpZHhdO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9mdW5jdGlvbk5hbWUoZikge1xuICAvLyBTdHJpbmcoeCA9PiB4KSBldmFsdWF0ZXMgdG8gXCJ4ID0+IHhcIiwgc28gdGhlIHBhdHRlcm4gbWF5IG5vdCBtYXRjaC5cbiAgdmFyIG1hdGNoID0gU3RyaW5nKGYpLm1hdGNoKC9eZnVuY3Rpb24gKFxcdyopLyk7XG4gIHJldHVybiBtYXRjaCA9PSBudWxsID8gJycgOiBtYXRjaFsxXTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaGFzKHByb3AsIG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lkZW50aXR5KHgpIHtcbiAgcmV0dXJuIHg7XG59IiwiaW1wb3J0IF9pbmRleE9mIGZyb20gXCIuL19pbmRleE9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5jbHVkZXMoYSwgbGlzdCkge1xuICByZXR1cm4gX2luZGV4T2YobGlzdCwgYSwgMCkgPj0gMDtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5jbHVkZXNXaXRoKHByZWQsIHgsIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGlmIChwcmVkKHgsIGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59IiwiaW1wb3J0IGVxdWFscyBmcm9tIFwiLi4vZXF1YWxzLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5kZXhPZihsaXN0LCBhLCBpZHgpIHtcbiAgdmFyIGluZiwgaXRlbTtcbiAgLy8gQXJyYXkucHJvdG90eXBlLmluZGV4T2YgZG9lc24ndCBleGlzdCBiZWxvdyBJRTlcbiAgaWYgKHR5cGVvZiBsaXN0LmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBhKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpZiAoYSA9PT0gMCkge1xuICAgICAgICAgIC8vIG1hbnVhbGx5IGNyYXdsIHRoZSBsaXN0IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gKzAgYW5kIC0wXG4gICAgICAgICAgaW5mID0gMSAvIGE7XG4gICAgICAgICAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICBpdGVtID0gbGlzdFtpZHhdO1xuICAgICAgICAgICAgaWYgKGl0ZW0gPT09IDAgJiYgMSAvIGl0ZW0gPT09IGluZikge1xuICAgICAgICAgICAgICByZXR1cm4gaWR4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWR4ICs9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfSBlbHNlIGlmIChhICE9PSBhKSB7XG4gICAgICAgICAgLy8gTmFOXG4gICAgICAgICAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICBpdGVtID0gbGlzdFtpZHhdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJyAmJiBpdGVtICE9PSBpdGVtKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpZHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZHggKz0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vbi16ZXJvIG51bWJlcnMgY2FuIHV0aWxpc2UgU2V0XG4gICAgICAgIHJldHVybiBsaXN0LmluZGV4T2YoYSwgaWR4KTtcblxuICAgICAgLy8gYWxsIHRoZXNlIHR5cGVzIGNhbiB1dGlsaXNlIFNldFxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgcmV0dXJuIGxpc3QuaW5kZXhPZihhLCBpZHgpO1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgaWYgKGEgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBudWxsIGNhbiB1dGlsaXNlIFNldFxuICAgICAgICAgIHJldHVybiBsaXN0LmluZGV4T2YoYSwgaWR4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBhbnl0aGluZyBlbHNlIG5vdCBjb3ZlcmVkIGFib3ZlLCBkZWZlciB0byBSLmVxdWFsc1xuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpZiAoZXF1YWxzKGxpc3RbaWR4XSwgYSkpIHtcbiAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiAtMTtcbn0iLCJpbXBvcnQgX2hhcyBmcm9tIFwiLi9faGFzLmpzXCI7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIF9pc0FyZ3VtZW50cyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFyZ3VtZW50cykgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nID8gZnVuY3Rpb24gX2lzQXJndW1lbnRzKHgpIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG4gIH0gOiBmdW5jdGlvbiBfaXNBcmd1bWVudHMoeCkge1xuICAgIHJldHVybiBfaGFzKCdjYWxsZWUnLCB4KTtcbiAgfTtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IF9pc0FyZ3VtZW50czsiLCIvKipcbiAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IGFuIG9iamVjdCBpcyBhbiBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG9iamVjdCB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB2YWxgIGlzIGFuIGFycmF5LCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBfaXNBcnJheShbXSk7IC8vPT4gdHJ1ZVxuICogICAgICBfaXNBcnJheShudWxsKTsgLy89PiBmYWxzZVxuICogICAgICBfaXNBcnJheSh7fSk7IC8vPT4gZmFsc2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBfaXNBcnJheSh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbC5sZW5ndGggPj0gMCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn07IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vX2N1cnJ5MS5qc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCIuL19pc0FycmF5LmpzXCI7XG5pbXBvcnQgX2lzU3RyaW5nIGZyb20gXCIuL19pc1N0cmluZy5qc1wiO1xuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IGFuIG9iamVjdCBpcyBzaW1pbGFyIHRvIGFuIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2F0ZWdvcnkgVHlwZVxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKiAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IHggVGhlIG9iamVjdCB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB4YCBoYXMgYSBudW1lcmljIGxlbmd0aCBwcm9wZXJ0eSBhbmQgZXh0cmVtZSBpbmRpY2VzIGRlZmluZWQ7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIF9pc0FycmF5TGlrZShbXSk7IC8vPT4gdHJ1ZVxuICogICAgICBfaXNBcnJheUxpa2UodHJ1ZSk7IC8vPT4gZmFsc2VcbiAqICAgICAgX2lzQXJyYXlMaWtlKHt9KTsgLy89PiBmYWxzZVxuICogICAgICBfaXNBcnJheUxpa2Uoe2xlbmd0aDogMTB9KTsgLy89PiBmYWxzZVxuICogICAgICBfaXNBcnJheUxpa2UoezA6ICd6ZXJvJywgOTogJ25pbmUnLCBsZW5ndGg6IDEwfSk7IC8vPT4gdHJ1ZVxuICogICAgICBfaXNBcnJheUxpa2Uoe25vZGVUeXBlOiAxLCBsZW5ndGg6IDF9KSAvLyA9PiBmYWxzZVxuICovXG52YXIgX2lzQXJyYXlMaWtlID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gaXNBcnJheUxpa2UoeCkge1xuICBpZiAoX2lzQXJyYXkoeCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIXgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoX2lzU3RyaW5nKHgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh4Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh4Lmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4geC5oYXNPd25Qcm9wZXJ0eSgwKSAmJiB4Lmhhc093blByb3BlcnR5KHgubGVuZ3RoIC0gMSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSk7XG5leHBvcnQgZGVmYXVsdCBfaXNBcnJheUxpa2U7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lzRnVuY3Rpb24oeCkge1xuICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KTtcbiAgcmV0dXJuIHR5cGUgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgQXN5bmNHZW5lcmF0b3JGdW5jdGlvbl0nO1xufSIsIi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBwYXNzZWQgYXJndW1lbnQgaXMgYW4gaW50ZWdlci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBuXG4gKiBAY2F0ZWdvcnkgVHlwZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgTnVtYmVyLmlzSW50ZWdlciB8fCBmdW5jdGlvbiBfaXNJbnRlZ2VyKG4pIHtcbiAgcmV0dXJuIG4gPDwgMCA9PT0gbjtcbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lzT2JqZWN0KHgpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2lzUGxhY2Vob2xkZXIoYSkge1xuICByZXR1cm4gYSAhPSBudWxsICYmIHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiBhWydAQGZ1bmN0aW9uYWwvcGxhY2Vob2xkZXInXSA9PT0gdHJ1ZTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNTdHJpbmcoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBTdHJpbmddJztcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNUcmFuc2Zvcm1lcihvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIHR5cGVvZiBvYmpbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPT09ICdmdW5jdGlvbic7XG59IiwiLyoqXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCBhbiBvYmplY3QgaXMgYSB0eXBlZCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG9iamVjdCB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB2YWxgIGlzIGEgdHlwZWQgYXJyYXksIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIF9pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkoW10pKTsgLy89PiB0cnVlXG4gKiAgICAgIF9pc1R5cGVkQXJyYXkobmV3IEZsb2F0MzJBcnJheShbXSkpOyAvLz0+IHRydWVcbiAqICAgICAgX2lzVHlwZWRBcnJheShbXSk7IC8vPT4gZmFsc2VcbiAqICAgICAgX2lzVHlwZWRBcnJheShudWxsKTsgLy89PiBmYWxzZVxuICogICAgICBfaXNUeXBlZEFycmF5KHt9KTsgLy89PiBmYWxzZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaXNUeXBlZEFycmF5KHZhbCkge1xuICB2YXIgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpO1xuICByZXR1cm4gdHlwZSA9PT0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBJbnQ4QXJyYXldJyB8fCB0eXBlID09PSAnW29iamVjdCBVaW50OEFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgSW50MTZBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IFVpbnQxNkFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgSW50MzJBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IFVpbnQzMkFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgQmlnSW50NjRBcnJheV0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEJpZ1VpbnQ2NEFycmF5XSc7XG59IiwiaW1wb3J0IF9pc0FycmF5TGlrZSBmcm9tIFwiLi9faXNBcnJheUxpa2UuanNcIjtcblxuLyoqXG4gKiBgX21ha2VGbGF0YCBpcyBhIGhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBvbmUtbGV2ZWwgb3IgZnVsbHkgcmVjdXJzaXZlXG4gKiBmdW5jdGlvbiBiYXNlZCBvbiB0aGUgZmxhZyBwYXNzZWQgaW4uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX21ha2VGbGF0KHJlY3Vyc2l2ZSkge1xuICByZXR1cm4gZnVuY3Rpb24gZmxhdHQobGlzdCkge1xuICAgIHZhciB2YWx1ZSwgamxlbiwgajtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGlkeCA9IDA7XG4gICAgdmFyIGlsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgICB3aGlsZSAoaWR4IDwgaWxlbikge1xuICAgICAgaWYgKF9pc0FycmF5TGlrZShsaXN0W2lkeF0pKSB7XG4gICAgICAgIHZhbHVlID0gcmVjdXJzaXZlID8gZmxhdHQobGlzdFtpZHhdKSA6IGxpc3RbaWR4XTtcbiAgICAgICAgaiA9IDA7XG4gICAgICAgIGpsZW4gPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgIHdoaWxlIChqIDwgamxlbikge1xuICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlW2pdO1xuICAgICAgICAgIGogKz0gMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gbGlzdFtpZHhdO1xuICAgICAgfVxuICAgICAgaWR4ICs9IDE7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX21hcChmbiwgZnVuY3Rvcikge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGZ1bmN0b3IubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuKTtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIHJlc3VsdFtpZHhdID0gZm4oZnVuY3RvcltpZHhdKTtcbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSIsImltcG9ydCBfaXNTdHJpbmcgZnJvbSBcIi4vX2lzU3RyaW5nLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfbnRoKG9mZnNldCwgbGlzdCkge1xuICB2YXIgaWR4ID0gb2Zmc2V0IDwgMCA/IGxpc3QubGVuZ3RoICsgb2Zmc2V0IDogb2Zmc2V0O1xuICByZXR1cm4gX2lzU3RyaW5nKGxpc3QpID8gbGlzdC5jaGFyQXQoaWR4KSA6IGxpc3RbaWR4XTtcbn0iLCJpbXBvcnQgX2hhcyBmcm9tIFwiLi9faGFzLmpzXCI7XG5cbi8vIEJhc2VkIG9uIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ25cbmZ1bmN0aW9uIF9vYmplY3RBc3NpZ24odGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICB9XG4gIHZhciBvdXRwdXQgPSBPYmplY3QodGFyZ2V0KTtcbiAgdmFyIGlkeCA9IDE7XG4gIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB3aGlsZSAoaWR4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpZHhdO1xuICAgIGlmIChzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgZm9yICh2YXIgbmV4dEtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKF9oYXMobmV4dEtleSwgc291cmNlKSkge1xuICAgICAgICAgIG91dHB1dFtuZXh0S2V5XSA9IHNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuZXhwb3J0IGRlZmF1bHQgdHlwZW9mIE9iamVjdC5hc3NpZ24gPT09ICdmdW5jdGlvbicgPyBPYmplY3QuYXNzaWduIDogX29iamVjdEFzc2lnbjsiLCIvLyBCYXNlZCBvbiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbmZ1bmN0aW9uIF9vYmplY3RJcyhhLCBiKSB7XG4gIC8vIFNhbWVWYWx1ZSBhbGdvcml0aG1cbiAgaWYgKGEgPT09IGIpIHtcbiAgICAvLyBTdGVwcyAxLTUsIDctMTBcbiAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgIHJldHVybiBhICE9PSAwIHx8IDEgLyBhID09PSAxIC8gYjtcbiAgfSBlbHNlIHtcbiAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgIHJldHVybiBhICE9PSBhICYmIGIgIT09IGI7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBfb2JqZWN0SXM7IiwiaW1wb3J0IF9pc0ludGVnZXIgZnJvbSBcIi4vX2lzSW50ZWdlci5qc1wiO1xuaW1wb3J0IF9udGggZnJvbSBcIi4vX250aC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3BhdGgocGF0aEFyLCBvYmopIHtcbiAgdmFyIHZhbCA9IG9iajtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoQXIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhciBwID0gcGF0aEFyW2ldO1xuICAgIGlmIChfaXNJbnRlZ2VyKHApKSB7XG4gICAgICB2YWwgPSBfbnRoKHAsIHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbCA9IHZhbFtwXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfcXVvdGUocykge1xuICB2YXIgZXNjYXBlZCA9IHMucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKS5yZXBsYWNlKC9bXFxiXS9nLCAnXFxcXGInKSAvLyBcXGIgbWF0Y2hlcyB3b3JkIGJvdW5kYXJ5OyBbXFxiXSBtYXRjaGVzIGJhY2tzcGFjZVxuICAucmVwbGFjZSgvXFxmL2csICdcXFxcZicpLnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKS5yZXBsYWNlKC9cXHIvZywgJ1xcXFxyJykucmVwbGFjZSgvXFx0L2csICdcXFxcdCcpLnJlcGxhY2UoL1xcdi9nLCAnXFxcXHYnKS5yZXBsYWNlKC9cXDAvZywgJ1xcXFwwJyk7XG4gIHJldHVybiAnXCInICsgZXNjYXBlZC5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykgKyAnXCInO1xufSIsImltcG9ydCBfYXJyYXlSZWR1Y2UgZnJvbSBcIi4vX2FycmF5UmVkdWNlLmpzXCI7XG5pbXBvcnQgX2NyZWF0ZVJlZHVjZSBmcm9tIFwiLi9fY3JlYXRlUmVkdWNlLmpzXCI7XG5mdW5jdGlvbiBfaXRlcmFibGVSZWR1Y2UocmVkdWNlciwgYWNjLCBpdGVyKSB7XG4gIHZhciBzdGVwID0gaXRlci5uZXh0KCk7XG4gIHdoaWxlICghc3RlcC5kb25lKSB7XG4gICAgYWNjID0gcmVkdWNlcihhY2MsIHN0ZXAudmFsdWUpO1xuICAgIHN0ZXAgPSBpdGVyLm5leHQoKTtcbiAgfVxuICByZXR1cm4gYWNjO1xufVxuZnVuY3Rpb24gX21ldGhvZFJlZHVjZShyZWR1Y2VyLCBhY2MsIG9iaiwgbWV0aG9kTmFtZSkge1xuICByZXR1cm4gb2JqW21ldGhvZE5hbWVdKHJlZHVjZXIsIGFjYyk7XG59XG52YXIgX3JlZHVjZSA9IC8qI19fUFVSRV9fKi9fY3JlYXRlUmVkdWNlKF9hcnJheVJlZHVjZSwgX21ldGhvZFJlZHVjZSwgX2l0ZXJhYmxlUmVkdWNlKTtcbmV4cG9ydCBkZWZhdWx0IF9yZWR1Y2U7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3JlZHVjZWQoeCkge1xuICByZXR1cm4geCAmJiB4WydAQHRyYW5zZHVjZXIvcmVkdWNlZCddID8geCA6IHtcbiAgICAnQEB0cmFuc2R1Y2VyL3ZhbHVlJzogeCxcbiAgICAnQEB0cmFuc2R1Y2VyL3JlZHVjZWQnOiB0cnVlXG4gIH07XG59IiwiLyoqXG4gKiBQb2x5ZmlsbCBmcm9tIDxodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlL3RvSVNPU3RyaW5nPi5cbiAqL1xudmFyIHBhZCA9IGZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiAobiA8IDEwID8gJzAnIDogJycpICsgbjtcbn07XG52YXIgX3RvSVNPU3RyaW5nID0gdHlwZW9mIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID09PSAnZnVuY3Rpb24nID8gZnVuY3Rpb24gX3RvSVNPU3RyaW5nKGQpIHtcbiAgcmV0dXJuIGQudG9JU09TdHJpbmcoKTtcbn0gOiBmdW5jdGlvbiBfdG9JU09TdHJpbmcoZCkge1xuICByZXR1cm4gZC5nZXRVVENGdWxsWWVhcigpICsgJy0nICsgcGFkKGQuZ2V0VVRDTW9udGgoKSArIDEpICsgJy0nICsgcGFkKGQuZ2V0VVRDRGF0ZSgpKSArICdUJyArIHBhZChkLmdldFVUQ0hvdXJzKCkpICsgJzonICsgcGFkKGQuZ2V0VVRDTWludXRlcygpKSArICc6JyArIHBhZChkLmdldFVUQ1NlY29uZHMoKSkgKyAnLicgKyAoZC5nZXRVVENNaWxsaXNlY29uZHMoKSAvIDEwMDApLnRvRml4ZWQoMykuc2xpY2UoMiwgNSkgKyAnWic7XG59O1xuZXhwb3J0IGRlZmF1bHQgX3RvSVNPU3RyaW5nOyIsImltcG9ydCBfaW5jbHVkZXMgZnJvbSBcIi4vX2luY2x1ZGVzLmpzXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwiLi9fbWFwLmpzXCI7XG5pbXBvcnQgX3F1b3RlIGZyb20gXCIuL19xdW90ZS5qc1wiO1xuaW1wb3J0IF90b0lTT1N0cmluZyBmcm9tIFwiLi9fdG9JU09TdHJpbmcuanNcIjtcbmltcG9ydCBrZXlzIGZyb20gXCIuLi9rZXlzLmpzXCI7XG5pbXBvcnQgcmVqZWN0IGZyb20gXCIuLi9yZWplY3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF90b1N0cmluZyh4LCBzZWVuKSB7XG4gIHZhciByZWN1ciA9IGZ1bmN0aW9uIHJlY3VyKHkpIHtcbiAgICB2YXIgeHMgPSBzZWVuLmNvbmNhdChbeF0pO1xuICAgIHJldHVybiBfaW5jbHVkZXMoeSwgeHMpID8gJzxDaXJjdWxhcj4nIDogX3RvU3RyaW5nKHksIHhzKTtcbiAgfTtcblxuICAvLyAgbWFwUGFpcnMgOjogKE9iamVjdCwgW1N0cmluZ10pIC0+IFtTdHJpbmddXG4gIHZhciBtYXBQYWlycyA9IGZ1bmN0aW9uIChvYmosIGtleXMpIHtcbiAgICByZXR1cm4gX21hcChmdW5jdGlvbiAoaykge1xuICAgICAgcmV0dXJuIF9xdW90ZShrKSArICc6ICcgKyByZWN1cihvYmpba10pO1xuICAgIH0sIGtleXMuc2xpY2UoKS5zb3J0KCkpO1xuICB9O1xuICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSkge1xuICAgIGNhc2UgJ1tvYmplY3QgQXJndW1lbnRzXSc6XG4gICAgICByZXR1cm4gJyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgnICsgX21hcChyZWN1ciwgeCkuam9pbignLCAnKSArICcpKSc7XG4gICAgY2FzZSAnW29iamVjdCBBcnJheV0nOlxuICAgICAgcmV0dXJuICdbJyArIF9tYXAocmVjdXIsIHgpLmNvbmNhdChtYXBQYWlycyh4LCByZWplY3QoZnVuY3Rpb24gKGspIHtcbiAgICAgICAgcmV0dXJuIC9eXFxkKyQvLnRlc3Qoayk7XG4gICAgICB9LCBrZXlzKHgpKSkpLmpvaW4oJywgJykgKyAnXSc7XG4gICAgY2FzZSAnW29iamVjdCBCb29sZWFuXSc6XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdvYmplY3QnID8gJ25ldyBCb29sZWFuKCcgKyByZWN1cih4LnZhbHVlT2YoKSkgKyAnKScgOiB4LnRvU3RyaW5nKCk7XG4gICAgY2FzZSAnW29iamVjdCBEYXRlXSc6XG4gICAgICByZXR1cm4gJ25ldyBEYXRlKCcgKyAoaXNOYU4oeC52YWx1ZU9mKCkpID8gcmVjdXIoTmFOKSA6IF9xdW90ZShfdG9JU09TdHJpbmcoeCkpKSArICcpJztcbiAgICBjYXNlICdbb2JqZWN0IE1hcF0nOlxuICAgICAgcmV0dXJuICduZXcgTWFwKCcgKyByZWN1cihBcnJheS5mcm9tKHgpKSArICcpJztcbiAgICBjYXNlICdbb2JqZWN0IE51bGxdJzpcbiAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgY2FzZSAnW29iamVjdCBOdW1iZXJdJzpcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgPyAnbmV3IE51bWJlcignICsgcmVjdXIoeC52YWx1ZU9mKCkpICsgJyknIDogMSAvIHggPT09IC1JbmZpbml0eSA/ICctMCcgOiB4LnRvU3RyaW5nKDEwKTtcbiAgICBjYXNlICdbb2JqZWN0IFNldF0nOlxuICAgICAgcmV0dXJuICduZXcgU2V0KCcgKyByZWN1cihBcnJheS5mcm9tKHgpLnNvcnQoKSkgKyAnKSc7XG4gICAgY2FzZSAnW29iamVjdCBTdHJpbmddJzpcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgPyAnbmV3IFN0cmluZygnICsgcmVjdXIoeC52YWx1ZU9mKCkpICsgJyknIDogX3F1b3RlKHgpO1xuICAgIGNhc2UgJ1tvYmplY3QgVW5kZWZpbmVkXSc6XG4gICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgeC50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgcmVwciA9IHgudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKHJlcHIgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICAgICAgcmV0dXJuIHJlcHI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAneycgKyBtYXBQYWlycyh4LCBrZXlzKHgpKS5qb2luKCcsICcpICsgJ30nO1xuICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hBcnJheVJlZHVjZSh4ZiwgYWNjLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBhY2MgPSB4ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShhY2MsIGxpc3RbaWR4XSk7XG4gICAgaWYgKGFjYyAmJiBhY2NbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10pIHtcbiAgICAgIGFjYyA9IGFjY1snQEB0cmFuc2R1Y2VyL3ZhbHVlJ107XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10oYWNjKTtcbn0iLCJpbXBvcnQgX2NyZWF0ZVJlZHVjZSBmcm9tIFwiLi9fY3JlYXRlUmVkdWNlLmpzXCI7XG5pbXBvcnQgX3hBcnJheVJlZHVjZSBmcm9tIFwiLi9feEFycmF5UmVkdWNlLmpzXCI7XG5pbXBvcnQgYmluZCBmcm9tIFwiLi4vYmluZC5qc1wiO1xuZnVuY3Rpb24gX3hJdGVyYWJsZVJlZHVjZSh4ZiwgYWNjLCBpdGVyKSB7XG4gIHZhciBzdGVwID0gaXRlci5uZXh0KCk7XG4gIHdoaWxlICghc3RlcC5kb25lKSB7XG4gICAgYWNjID0geGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10oYWNjLCBzdGVwLnZhbHVlKTtcbiAgICBpZiAoYWNjICYmIGFjY1snQEB0cmFuc2R1Y2VyL3JlZHVjZWQnXSkge1xuICAgICAgYWNjID0gYWNjWydAQHRyYW5zZHVjZXIvdmFsdWUnXTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzdGVwID0gaXRlci5uZXh0KCk7XG4gIH1cbiAgcmV0dXJuIHhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10oYWNjKTtcbn1cbmZ1bmN0aW9uIF94TWV0aG9kUmVkdWNlKHhmLCBhY2MsIG9iaiwgbWV0aG9kTmFtZSkge1xuICByZXR1cm4geGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShvYmpbbWV0aG9kTmFtZV0oYmluZCh4ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSwgeGYpLCBhY2MpKTtcbn1cbnZhciBfeFJlZHVjZSA9IC8qI19fUFVSRV9fKi9fY3JlYXRlUmVkdWNlKF94QXJyYXlSZWR1Y2UsIF94TWV0aG9kUmVkdWNlLCBfeEl0ZXJhYmxlUmVkdWNlKTtcbmV4cG9ydCBkZWZhdWx0IF94UmVkdWNlOyIsImltcG9ydCBfcmVkdWNlZCBmcm9tIFwiLi9fcmVkdWNlZC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhBbGwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYQWxsKGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5hbGwgPSB0cnVlO1xuICB9XG4gIFhBbGwucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYQWxsLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGlmICh0aGlzLmFsbCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG4gIFhBbGwucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAoIXRoaXMuZihpbnB1dCkpIHtcbiAgICAgIHRoaXMuYWxsID0gZmFsc2U7XG4gICAgICByZXN1bHQgPSBfcmVkdWNlZCh0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgZmFsc2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIFhBbGw7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeGFsbChmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhBbGwoZiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfcmVkdWNlZCBmcm9tIFwiLi9fcmVkdWNlZC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhBbnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYQW55KGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5hbnkgPSBmYWxzZTtcbiAgfVxuICBYQW55LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWEFueS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICBpZiAoIXRoaXMuYW55KSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG4gIFhBbnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAodGhpcy5mKGlucHV0KSkge1xuICAgICAgdGhpcy5hbnkgPSB0cnVlO1xuICAgICAgcmVzdWx0ID0gX3JlZHVjZWQodGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHRydWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIFhBbnk7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeGFueShmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhBbnkoZiwgeGYpO1xuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvaW5pdCddKCk7XG4gIH0sXG4gIHJlc3VsdDogZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ocmVzdWx0KTtcbiAgfVxufTsiLCJpbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG52YXIgWEZpbHRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhGaWx0ZXIoZiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5mID0gZjtcbiAgfVxuICBYRmlsdGVyLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWEZpbHRlci5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IF94ZkJhc2UucmVzdWx0O1xuICBYRmlsdGVyLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uIChyZXN1bHQsIGlucHV0KSB7XG4gICAgcmV0dXJuIHRoaXMuZihpbnB1dCkgPyB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgaW5wdXQpIDogcmVzdWx0O1xuICB9O1xuICByZXR1cm4gWEZpbHRlcjtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94ZmlsdGVyKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWEZpbHRlcihmLCB4Zik7XG4gIH07XG59IiwiaW1wb3J0IF9yZWR1Y2VkIGZyb20gXCIuL19yZWR1Y2VkLmpzXCI7XG5pbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG52YXIgWEZpbmQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYRmluZChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICAgIHRoaXMuZm91bmQgPSBmYWxzZTtcbiAgfVxuICBYRmluZC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhGaW5kLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGlmICghdGhpcy5mb3VuZCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHZvaWQgMCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ocmVzdWx0KTtcbiAgfTtcbiAgWEZpbmQucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAodGhpcy5mKGlucHV0KSkge1xuICAgICAgdGhpcy5mb3VuZCA9IHRydWU7XG4gICAgICByZXN1bHQgPSBfcmVkdWNlZCh0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgaW5wdXQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIFhGaW5kO1xufSgpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hmaW5kKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWEZpbmQoZiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfcmVkdWNlZCBmcm9tIFwiLi9fcmVkdWNlZC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhGaW5kSW5kZXggPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYRmluZEluZGV4KGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gICAgdGhpcy5pZHggPSAtMTtcbiAgICB0aGlzLmZvdW5kID0gZmFsc2U7XG4gIH1cbiAgWEZpbmRJbmRleC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhGaW5kSW5kZXgucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgaWYgKCF0aGlzLmZvdW5kKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgLTEpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG4gIFhGaW5kSW5kZXgucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICB0aGlzLmlkeCArPSAxO1xuICAgIGlmICh0aGlzLmYoaW5wdXQpKSB7XG4gICAgICB0aGlzLmZvdW5kID0gdHJ1ZTtcbiAgICAgIHJlc3VsdCA9IF9yZWR1Y2VkKHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB0aGlzLmlkeCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICByZXR1cm4gWEZpbmRJbmRleDtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94ZmluZEluZGV4KGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWEZpbmRJbmRleChmLCB4Zik7XG4gIH07XG59IiwiaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhNYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBYTWFwKGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gIH1cbiAgWE1hcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhNYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcbiAgWE1hcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdGhpcy5mKGlucHV0KSk7XG4gIH07XG4gIHJldHVybiBYTWFwO1xufSgpO1xudmFyIF94bWFwID0gZnVuY3Rpb24gX3htYXAoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKHhmKSB7XG4gICAgcmV0dXJuIG5ldyBYTWFwKGYsIHhmKTtcbiAgfTtcbn07XG5leHBvcnQgZGVmYXVsdCBfeG1hcDsiLCJpbXBvcnQgX2Nsb25lIGZyb20gXCIuL19jbG9uZS5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vX2hhcy5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhSZWR1Y2VCeSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhSZWR1Y2VCeSh2YWx1ZUZuLCB2YWx1ZUFjYywga2V5Rm4sIHhmKSB7XG4gICAgdGhpcy52YWx1ZUZuID0gdmFsdWVGbjtcbiAgICB0aGlzLnZhbHVlQWNjID0gdmFsdWVBY2M7XG4gICAgdGhpcy5rZXlGbiA9IGtleUZuO1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmlucHV0cyA9IHt9O1xuICB9XG4gIFhSZWR1Y2VCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhSZWR1Y2VCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICB2YXIga2V5O1xuICAgIGZvciAoa2V5IGluIHRoaXMuaW5wdXRzKSB7XG4gICAgICBpZiAoX2hhcyhrZXksIHRoaXMuaW5wdXRzKSkge1xuICAgICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdGhpcy5pbnB1dHNba2V5XSk7XG4gICAgICAgIGlmIChyZXN1bHRbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10pIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHRbJ0BAdHJhbnNkdWNlci92YWx1ZSddO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaW5wdXRzID0gbnVsbDtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG4gIFhSZWR1Y2VCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHZhciBrZXkgPSB0aGlzLmtleUZuKGlucHV0KTtcbiAgICB0aGlzLmlucHV0c1trZXldID0gdGhpcy5pbnB1dHNba2V5XSB8fCBba2V5LCBfY2xvbmUodGhpcy52YWx1ZUFjYywgZmFsc2UpXTtcbiAgICB0aGlzLmlucHV0c1trZXldWzFdID0gdGhpcy52YWx1ZUZuKHRoaXMuaW5wdXRzW2tleV1bMV0sIGlucHV0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICByZXR1cm4gWFJlZHVjZUJ5O1xufSgpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3hyZWR1Y2VCeSh2YWx1ZUZuLCB2YWx1ZUFjYywga2V5Rm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWFJlZHVjZUJ5KHZhbHVlRm4sIHZhbHVlQWNjLCBrZXlGbiwgeGYpO1xuICB9O1xufSIsImltcG9ydCBfcmVkdWNlZCBmcm9tIFwiLi9fcmVkdWNlZC5qc1wiO1xuaW1wb3J0IF94ZkJhc2UgZnJvbSBcIi4vX3hmQmFzZS5qc1wiO1xudmFyIFhUYWtlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWFRha2UobiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5uID0gbjtcbiAgICB0aGlzLmkgPSAwO1xuICB9XG4gIFhUYWtlLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWFRha2UucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcbiAgWFRha2UucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24gKHJlc3VsdCwgaW5wdXQpIHtcbiAgICB0aGlzLmkgKz0gMTtcbiAgICB2YXIgcmV0ID0gdGhpcy5uID09PSAwID8gcmVzdWx0IDogdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KTtcbiAgICByZXR1cm4gdGhpcy5uID49IDAgJiYgdGhpcy5pID49IHRoaXMubiA/IF9yZWR1Y2VkKHJldCkgOiByZXQ7XG4gIH07XG4gIHJldHVybiBYVGFrZTtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94dGFrZShuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeGYpIHtcbiAgICByZXR1cm4gbmV3IFhUYWtlKG4sIHhmKTtcbiAgfTtcbn0iLCJpbXBvcnQgX1NldCBmcm9tIFwiLi9fU2V0LmpzXCI7XG5pbXBvcnQgX3hmQmFzZSBmcm9tIFwiLi9feGZCYXNlLmpzXCI7XG52YXIgWFVuaXFCeSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFhVbmlxQnkoZiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5mID0gZjtcbiAgICB0aGlzLnNldCA9IG5ldyBfU2V0KCk7XG4gIH1cbiAgWFVuaXFCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhVbmlxQnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcbiAgWFVuaXFCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLnNldC5hZGQodGhpcy5mKGlucHV0KSkgPyB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgaW5wdXQpIDogcmVzdWx0O1xuICB9O1xuICByZXR1cm4gWFVuaXFCeTtcbn0oKTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF94dW5pcUJ5KGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4Zikge1xuICAgIHJldHVybiBuZXcgWFVuaXFCeShmLCB4Zik7XG4gIH07XG59IiwidmFyIFhXcmFwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWFdyYXAoZm4pIHtcbiAgICB0aGlzLmYgPSBmbjtcbiAgfVxuICBYV3JhcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbml0IG5vdCBpbXBsZW1lbnRlZCBvbiBYV3JhcCcpO1xuICB9O1xuICBYV3JhcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uIChhY2MpIHtcbiAgICByZXR1cm4gYWNjO1xuICB9O1xuICBYV3JhcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbiAoYWNjLCB4KSB7XG4gICAgcmV0dXJuIHRoaXMuZihhY2MsIHgpO1xuICB9O1xuICByZXR1cm4gWFdyYXA7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfeHdyYXAoZm4pIHtcbiAgcmV0dXJuIG5ldyBYV3JhcChmbik7XG59IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9maWx0ZXIgZnJvbSBcIi4vaW50ZXJuYWwvX2ZpbHRlci5qc1wiO1xuaW1wb3J0IF9TZXQgZnJvbSBcIi4vaW50ZXJuYWwvX1NldC5qc1wiO1xuaW1wb3J0IHVuaXEgZnJvbSBcIi4vdW5pcS5qc1wiO1xuXG4vKipcbiAqIENvbWJpbmVzIHR3byBsaXN0cyBpbnRvIGEgc2V0IChpLmUuIG5vIGR1cGxpY2F0ZXMpIGNvbXBvc2VkIG9mIHRob3NlXG4gKiBlbGVtZW50cyBjb21tb24gdG8gYm90aCBsaXN0cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBbKl0gLT4gWypdIC0+IFsqXVxuICogQHBhcmFtIHtBcnJheX0gbGlzdDEgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MiBUaGUgc2Vjb25kIGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGxpc3Qgb2YgZWxlbWVudHMgZm91bmQgaW4gYm90aCBgbGlzdDFgIGFuZCBgbGlzdDJgLlxuICogQHNlZSBSLmlubmVySm9pblxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaW50ZXJzZWN0aW9uKFsxLDIsMyw0XSwgWzcsNiw1LDQsM10pOyAvLz0+IFs0LCAzXVxuICovXG52YXIgaW50ZXJzZWN0aW9uID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gaW50ZXJzZWN0aW9uKGxpc3QxLCBsaXN0Mikge1xuICB2YXIgdG9LZWVwID0gbmV3IF9TZXQoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0MS5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHRvS2VlcC5hZGQobGlzdDFbaV0pO1xuICB9XG4gIHJldHVybiB1bmlxKF9maWx0ZXIodG9LZWVwLmhhcy5iaW5kKHRvS2VlcCksIGxpc3QyKSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGludGVyc2VjdGlvbjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2lzRnVuY3Rpb24gZnJvbSBcIi4vaW50ZXJuYWwvX2lzRnVuY3Rpb24uanNcIjtcbmltcG9ydCBjdXJyeU4gZnJvbSBcIi4vY3VycnlOLmpzXCI7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSBcIi4vdG9TdHJpbmcuanNcIjtcblxuLyoqXG4gKiBHaXZlbiBhbiBgYXJpdHlgIChOdW1iZXIpIGFuZCBhIGBuYW1lYCAoU3RyaW5nKSB0aGUgYGludm9rZXJgIGZ1bmN0aW9uXG4gKiByZXR1cm5zIGEgY3VycmllZCBmdW5jdGlvbiB0aGF0IHRha2VzIGBhcml0eWAgYXJndW1lbnRzIGFuZCBhIGBjb250ZXh0YFxuICogb2JqZWN0LiBJdCB3aWxsIFwiaW52b2tlXCIgdGhlIGBuYW1lYCdkIGZ1bmN0aW9uIChhIG1ldGhvZCkgb24gdGhlIGBjb250ZXh0YFxuICogb2JqZWN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIE51bWJlciAtPiBTdHJpbmcgLT4gKGEgLT4gYiAtPiAuLi4gLT4gbiAtPiBPYmplY3QgLT4gKilcbiAqIEBwYXJhbSB7TnVtYmVyfSBhcml0eSBOdW1iZXIgb2YgYXJndW1lbnRzIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBzaG91bGQgdGFrZVxuICogICAgICAgIGJlZm9yZSB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2QgTmFtZSBvZiBhbnkgb2YgdGhlIHRhcmdldCBvYmplY3QncyBtZXRob2RzIHRvIGNhbGwuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBzZWUgUi5jb25zdHJ1Y3RcbiAqIEBleGFtcGxlXG4gKiAgICAgIC8vIEEgZnVuY3Rpb24gd2l0aCBubyBhcmd1bWVudHNcbiAqICAgICAgY29uc3QgYXNKc29uID0gaW52b2tlcigwLCBcImpzb25cIilcbiAqICAgICAgLy8gSnVzdCBsaWtlIGNhbGxpbmcgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5qc29uKCkpXG4gKiAgICAgIGZldGNoKFwiaHR0cDovL2V4YW1wbGUuY29tL2luZGV4Lmpzb25cIikudGhlbihhc0pzb24pXG4gKlxuICogICAgICAvLyBBIGZ1bmN0aW9uIHdpdGggb25lIGFyZ3VtZW50XG4gKiAgICAgIGNvbnN0IHNsaWNlRnJvbSA9IGludm9rZXIoMSwgJ3NsaWNlJyk7XG4gKiAgICAgIHNsaWNlRnJvbSg2LCAnYWJjZGVmZ2hpamtsbScpOyAvLz0+ICdnaGlqa2xtJ1xuICpcbiAqICAgICAgLy8gQSBmdW5jdGlvbiB3aXRoIHR3byBhcmd1bWVudHNcbiAqICAgICAgY29uc3Qgc2xpY2VGcm9tNiA9IGludm9rZXIoMiwgJ3NsaWNlJykoNik7XG4gKiAgICAgIHNsaWNlRnJvbTYoOCwgJ2FiY2RlZmdoaWprbG0nKTsgLy89PiAnZ2gnXG4gKlxuICogICAgICAvLyBOT1RFOiBZb3UgY2FuJ3Qgc2ltcGx5IHBhc3Mgc29tZSBvZiB0aGUgYXJndW1lbnRzIHRvIHRoZSBpbml0aWFsIGludm9rZXIgZnVuY3Rpb24uXG4gKiAgICAgIGNvbnN0IGZpcnN0Q3JlZGl0Q2FyZFNlY3Rpb24gPSBpbnZva2VyKDIsIFwic2xpY2VcIiwgMCwgNClcbiAqICAgICAgZmlyc3RDcmVkaXRDYXJkU2VjdGlvbihcIjQyNDIgNDI0MiA0MjQyIDQyNDJcIikgLy8gPT4gRnVuY3Rpb248Li4uPlxuICpcbiAqICAgICAgLy8gU2luY2UgaW52b2tlciByZXR1cm5zIGEgY3VycmllZCBmdW5jdGlvbiwgeW91IG1heSBwYXJ0aWFsbHkgYXBwbHkgaXQgdG8gY3JlYXRlIHRoZSBmdW5jdGlvbiB5b3UgbmVlZC5cbiAqICAgICAgY29uc3QgZmlyc3RDcmVkaXRDYXJkU2VjdGlvbiA9IGludm9rZXIoMiwgXCJzbGljZVwiKSgwLCA0KVxuICogICAgICBmaXJzdENyZWRpdENhcmRTZWN0aW9uKFwiNDI0MiA0MjQyIDQyNDIgNDI0MlwiKSAvLyA9PiBcIjQyNDJcIlxuICpcbiAqIEBzeW1iIFIuaW52b2tlcigwLCAnbWV0aG9kJykobykgPSBvWydtZXRob2QnXSgpXG4gKiBAc3ltYiBSLmludm9rZXIoMSwgJ21ldGhvZCcpKGEsIG8pID0gb1snbWV0aG9kJ10oYSlcbiAqIEBzeW1iIFIuaW52b2tlcigyLCAnbWV0aG9kJykoYSwgYiwgbykgPSBvWydtZXRob2QnXShhLCBiKVxuICovXG52YXIgaW52b2tlciA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGludm9rZXIoYXJpdHksIG1ldGhvZCkge1xuICByZXR1cm4gY3VycnlOKGFyaXR5ICsgMSwgZnVuY3Rpb24gKCkge1xuICAgIHZhciB0YXJnZXQgPSBhcmd1bWVudHNbYXJpdHldO1xuICAgIGlmICh0YXJnZXQgIT0gbnVsbCAmJiBfaXNGdW5jdGlvbih0YXJnZXRbbWV0aG9kXSkpIHtcbiAgICAgIHJldHVybiB0YXJnZXRbbWV0aG9kXS5hcHBseSh0YXJnZXQsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgYXJpdHkpKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcih0b1N0cmluZyh0YXJnZXQpICsgJyBkb2VzIG5vdCBoYXZlIGEgbWV0aG9kIG5hbWVkIFwiJyArIG1ldGhvZCArICdcIicpO1xuICB9KTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgaW52b2tlcjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogU2VlIGlmIGFuIG9iamVjdCAoaS5lLiBgdmFsYCkgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN1cHBsaWVkIGNvbnN0cnVjdG9yLiBUaGlzXG4gKiBmdW5jdGlvbiB3aWxsIGNoZWNrIHVwIHRoZSBpbmhlcml0YW5jZSBjaGFpbiwgaWYgYW55LlxuICogSWYgYHZhbGAgd2FzIGNyZWF0ZWQgdXNpbmcgYE9iamVjdC5jcmVhdGVgLCBgUi5pcyhPYmplY3QsIHZhbCkgPT09IHRydWVgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IFR5cGVcbiAqIEBzaWcgKCogLT4geyp9KSAtPiBhIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjdG9yIEEgY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaXMoT2JqZWN0LCB7fSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzKE51bWJlciwgMSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzKE9iamVjdCwgMSk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5pcyhTdHJpbmcsICdzJyk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzKFN0cmluZywgbmV3IFN0cmluZygnJykpOyAvLz0+IHRydWVcbiAqICAgICAgUi5pcyhPYmplY3QsIG5ldyBTdHJpbmcoJycpKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXMoT2JqZWN0LCAncycpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXMoTnVtYmVyLCB7fSk7IC8vPT4gZmFsc2VcbiAqL1xudmFyIGlzID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gaXMoQ3RvciwgdmFsKSB7XG4gIHJldHVybiB2YWwgaW5zdGFuY2VvZiBDdG9yIHx8IHZhbCAhPSBudWxsICYmICh2YWwuY29uc3RydWN0b3IgPT09IEN0b3IgfHwgQ3Rvci5uYW1lID09PSAnT2JqZWN0JyAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jyk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGlzOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBlbXB0eSBmcm9tIFwiLi9lbXB0eS5qc1wiO1xuaW1wb3J0IGVxdWFscyBmcm9tIFwiLi9lcXVhbHMuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgaXRzIHR5cGUncyBlbXB0eSB2YWx1ZTsgYGZhbHNlYFxuICogb3RoZXJ3aXNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExvZ2ljXG4gKiBAc2lnIGEgLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSB4XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHNlZSBSLmVtcHR5LCBSLmlzTm90RW1wdHlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmlzRW1wdHkoWzEsIDIsIDNdKTsgICAgICAgICAgIC8vPT4gZmFsc2VcbiAqICAgICAgUi5pc0VtcHR5KFtdKTsgICAgICAgICAgICAgICAgICAvLz0+IHRydWVcbiAqICAgICAgUi5pc0VtcHR5KCcnKTsgICAgICAgICAgICAgICAgICAvLz0+IHRydWVcbiAqICAgICAgUi5pc0VtcHR5KG51bGwpOyAgICAgICAgICAgICAgICAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXNFbXB0eSh7fSk7ICAgICAgICAgICAgICAgICAgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNFbXB0eSh7bGVuZ3RoOiAwfSk7ICAgICAgICAgLy89PiBmYWxzZVxuICogICAgICBSLmlzRW1wdHkoVWludDhBcnJheS5mcm9tKCcnKSk7IC8vPT4gdHJ1ZVxuICovXG52YXIgaXNFbXB0eSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGlzRW1wdHkoeCkge1xuICByZXR1cm4geCAhPSBudWxsICYmIGVxdWFscyh4LCBlbXB0eSh4KSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGlzRW1wdHk7IiwiaW1wb3J0IF9jdXJyeTEgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5MS5qc1wiO1xuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgaW5wdXQgdmFsdWUgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjkuMFxuICogQGNhdGVnb3J5IFR5cGVcbiAqIEBzaWcgKiAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IHggVGhlIHZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgYHhgIGlzIGB1bmRlZmluZWRgIG9yIGBudWxsYCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pc05pbChudWxsKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNOaWwodW5kZWZpbmVkKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNOaWwoMCk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5pc05pbChbXSk7IC8vPT4gZmFsc2VcbiAqL1xudmFyIGlzTmlsID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gaXNOaWwoeCkge1xuICByZXR1cm4geCA9PSBudWxsO1xufSk7XG5leHBvcnQgZGVmYXVsdCBpc05pbDsiLCJpbXBvcnQgaW52b2tlciBmcm9tIFwiLi9pbnZva2VyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyBtYWRlIGJ5IGluc2VydGluZyB0aGUgYHNlcGFyYXRvcmAgYmV0d2VlbiBlYWNoIGVsZW1lbnQgYW5kXG4gKiBjb25jYXRlbmF0aW5nIGFsbCB0aGUgZWxlbWVudHMgaW50byBhIHNpbmdsZSBzdHJpbmcuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBTdHJpbmcgLT4gW2FdIC0+IFN0cmluZ1xuICogQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBzZXBhcmF0b3IgVGhlIHN0cmluZyB1c2VkIHRvIHNlcGFyYXRlIHRoZSBlbGVtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXl9IHhzIFRoZSBlbGVtZW50cyB0byBqb2luIGludG8gYSBzdHJpbmcuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIG1hZGUgYnkgY29uY2F0ZW5hdGluZyBgeHNgIHdpdGggYHNlcGFyYXRvcmAuXG4gKiBAc2VlIFIuc3BsaXRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBzcGFjZXIgPSBSLmpvaW4oJyAnKTtcbiAqICAgICAgc3BhY2VyKFsnYScsIDIsIDMuNF0pOyAgIC8vPT4gJ2EgMiAzLjQnXG4gKiAgICAgIFIuam9pbignfCcsIFsxLCAyLCAzXSk7ICAgIC8vPT4gJzF8MnwzJ1xuICovXG52YXIgam9pbiA9IC8qI19fUFVSRV9fKi9pbnZva2VyKDEsICdqb2luJyk7XG5leHBvcnQgZGVmYXVsdCBqb2luOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBjb252ZXJnZSBmcm9tIFwiLi9jb252ZXJnZS5qc1wiO1xuXG4vKipcbiAqIGp1eHQgYXBwbGllcyBhIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIGEgbGlzdCBvZiB2YWx1ZXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIFsoYSwgYiwgLi4uLCBtKSAtPiBuXSAtPiAoKGEsIGIsIC4uLiwgbSkgLT4gW25dKVxuICogQHBhcmFtIHtBcnJheX0gZm5zIEFuIGFycmF5IG9mIGZ1bmN0aW9uc1xuICogQHJldHVybiB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbGlzdCBvZiB2YWx1ZXMgYWZ0ZXIgYXBwbHlpbmcgZWFjaCBvZiB0aGUgb3JpZ2luYWwgYGZuc2AgdG8gaXRzIHBhcmFtZXRlcnMuXG4gKiBAc2VlIFIuYXBwbHlTcGVjXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgZ2V0UmFuZ2UgPSBSLmp1eHQoW01hdGgubWluLCBNYXRoLm1heF0pO1xuICogICAgICBnZXRSYW5nZSgzLCA0LCA5LCAtMyk7IC8vPT4gWy0zLCA5XVxuICogQHN5bWIgUi5qdXh0KFtmLCBnLCBoXSkoYSwgYikgPSBbZihhLCBiKSwgZyhhLCBiKSwgaChhLCBiKV1cbiAqL1xudmFyIGp1eHQgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBqdXh0KGZucykge1xuICByZXR1cm4gY29udmVyZ2UoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICB9LCBmbnMpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBqdXh0OyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcbmltcG9ydCBfaXNBcmd1bWVudHMgZnJvbSBcIi4vaW50ZXJuYWwvX2lzQXJndW1lbnRzLmpzXCI7XG5cbi8vIGNvdmVyIElFIDwgOSBrZXlzIGlzc3Vlc1xudmFyIGhhc0VudW1CdWcgPSAhIC8qI19fUFVSRV9fKi97XG4gIHRvU3RyaW5nOiBudWxsXG59LnByb3BlcnR5SXNFbnVtZXJhYmxlKCd0b1N0cmluZycpO1xudmFyIG5vbkVudW1lcmFibGVQcm9wcyA9IFsnY29uc3RydWN0b3InLCAndmFsdWVPZicsICdpc1Byb3RvdHlwZU9mJywgJ3RvU3RyaW5nJywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJ2hhc093blByb3BlcnR5JywgJ3RvTG9jYWxlU3RyaW5nJ107XG4vLyBTYWZhcmkgYnVnXG52YXIgaGFzQXJnc0VudW1CdWcgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5wcm9wZXJ0eUlzRW51bWVyYWJsZSgnbGVuZ3RoJyk7XG59KCk7XG52YXIgY29udGFpbnMgPSBmdW5jdGlvbiBjb250YWlucyhsaXN0LCBpdGVtKSB7XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpZiAobGlzdFtpZHhdID09PSBpdGVtKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgb2ZcbiAqIHRoZSBzdXBwbGllZCBvYmplY3QuXG4gKiBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBvdXRwdXQgYXJyYXkgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29uc2lzdGVudFxuICogYWNyb3NzIGRpZmZlcmVudCBKUyBwbGF0Zm9ybXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtrOiB2fSAtPiBba11cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBleHRyYWN0IHByb3BlcnRpZXMgZnJvbVxuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHRoZSBvYmplY3QncyBvd24gcHJvcGVydGllcy5cbiAqIEBzZWUgUi5rZXlzSW4sIFIudmFsdWVzLCBSLnRvUGFpcnNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmtleXMoe2E6IDEsIGI6IDIsIGM6IDN9KTsgLy89PiBbJ2EnLCAnYicsICdjJ11cbiAqL1xudmFyIGtleXMgPSB0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgIWhhc0FyZ3NFbnVtQnVnID8gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24ga2V5cyhvYmopIHtcbiAgcmV0dXJuIE9iamVjdChvYmopICE9PSBvYmogPyBbXSA6IE9iamVjdC5rZXlzKG9iaik7XG59KSA6IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIGtleXMob2JqKSB7XG4gIGlmIChPYmplY3Qob2JqKSAhPT0gb2JqKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBwcm9wLCBuSWR4O1xuICB2YXIga3MgPSBbXTtcbiAgdmFyIGNoZWNrQXJnc0xlbmd0aCA9IGhhc0FyZ3NFbnVtQnVnICYmIF9pc0FyZ3VtZW50cyhvYmopO1xuICBmb3IgKHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKF9oYXMocHJvcCwgb2JqKSAmJiAoIWNoZWNrQXJnc0xlbmd0aCB8fCBwcm9wICE9PSAnbGVuZ3RoJykpIHtcbiAgICAgIGtzW2tzLmxlbmd0aF0gPSBwcm9wO1xuICAgIH1cbiAgfVxuICBpZiAoaGFzRW51bUJ1Zykge1xuICAgIG5JZHggPSBub25FbnVtZXJhYmxlUHJvcHMubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAobklkeCA+PSAwKSB7XG4gICAgICBwcm9wID0gbm9uRW51bWVyYWJsZVByb3BzW25JZHhdO1xuICAgICAgaWYgKF9oYXMocHJvcCwgb2JqKSAmJiAhY29udGFpbnMoa3MsIHByb3ApKSB7XG4gICAgICAgIGtzW2tzLmxlbmd0aF0gPSBwcm9wO1xuICAgICAgfVxuICAgICAgbklkeCAtPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4ga3M7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGtleXM7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IG1hcCBmcm9tIFwiLi9tYXAuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbGVucyBmb3IgdGhlIGdpdmVuIGdldHRlciBhbmQgc2V0dGVyIGZ1bmN0aW9ucy4gVGhlIGdldHRlciBcImdldHNcIlxuICogdGhlIHZhbHVlIG9mIHRoZSBmb2N1czsgdGhlIHNldHRlciBcInNldHNcIiB0aGUgdmFsdWUgb2YgdGhlIGZvY3VzLiBUaGUgc2V0dGVyXG4gKiBzaG91bGQgbm90IG11dGF0ZSB0aGUgZGF0YSBzdHJ1Y3R1cmUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gTGVucyBzIGEgPSBGdW5jdG9yIGYgPT4gKGEgLT4gZiBhKSAtPiBzIC0+IGYgc1xuICogQHNpZyAocyAtPiBhKSAtPiAoKGEsIHMpIC0+IHMpIC0+IExlbnMgcyBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXR0ZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlclxuICogQHJldHVybiB7TGVuc31cbiAqIEBzZWUgUi52aWV3LCBSLnNldCwgUi5vdmVyLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhMZW5zID0gUi5sZW5zKFIucHJvcCgneCcpLCBSLmFzc29jKCd4JykpO1xuICpcbiAqICAgICAgUi52aWV3KHhMZW5zLCB7eDogMSwgeTogMn0pOyAgICAgICAgICAgIC8vPT4gMVxuICogICAgICBSLnNldCh4TGVucywgNCwge3g6IDEsIHk6IDJ9KTsgICAgICAgICAgLy89PiB7eDogNCwgeTogMn1cbiAqICAgICAgUi5vdmVyKHhMZW5zLCBSLm5lZ2F0ZSwge3g6IDEsIHk6IDJ9KTsgIC8vPT4ge3g6IC0xLCB5OiAyfVxuICovXG52YXIgbGVucyA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIGxlbnMoZ2V0dGVyLCBzZXR0ZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0b0Z1bmN0b3JGbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICByZXR1cm4gbWFwKGZ1bmN0aW9uIChmb2N1cykge1xuICAgICAgICByZXR1cm4gc2V0dGVyKGZvY3VzLCB0YXJnZXQpO1xuICAgICAgfSwgdG9GdW5jdG9yRm4oZ2V0dGVyKHRhcmdldCkpKTtcbiAgICB9O1xuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBsZW5zOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBhc3NvY1BhdGggZnJvbSBcIi4vYXNzb2NQYXRoLmpzXCI7XG5pbXBvcnQgbGVucyBmcm9tIFwiLi9sZW5zLmpzXCI7XG5pbXBvcnQgX3BhdGggZnJvbSBcIi4vaW50ZXJuYWwvX3BhdGguanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbGVucyB3aG9zZSBmb2N1cyBpcyB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludCB8IFN5bWJvbFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgW0lkeF0gLT4gTGVucyBzIGFcbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gdXNlLlxuICogQHJldHVybiB7TGVuc31cbiAqIEBzZWUgUi52aWV3LCBSLnNldCwgUi5vdmVyXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgeEhlYWRZTGVucyA9IFIubGVuc1BhdGgoWyd4JywgMCwgJ3knXSk7XG4gKlxuICogICAgICBSLnZpZXcoeEhlYWRZTGVucywge3g6IFt7eTogMiwgejogM30sIHt5OiA0LCB6OiA1fV19KTtcbiAqICAgICAgLy89PiAyXG4gKiAgICAgIFIuc2V0KHhIZWFkWUxlbnMsIDEsIHt4OiBbe3k6IDIsIHo6IDN9LCB7eTogNCwgejogNX1dfSk7XG4gKiAgICAgIC8vPT4ge3g6IFt7eTogMSwgejogM30sIHt5OiA0LCB6OiA1fV19XG4gKiAgICAgIFIub3Zlcih4SGVhZFlMZW5zLCBSLm5lZ2F0ZSwge3g6IFt7eTogMiwgejogM30sIHt5OiA0LCB6OiA1fV19KTtcbiAqICAgICAgLy89PiB7eDogW3t5OiAtMiwgejogM30sIHt5OiA0LCB6OiA1fV19XG4gKi9cblxudmFyIGxlbnNQYXRoID0gLyojX19QVVJFX18qL19jdXJyeTEoZnVuY3Rpb24gbGVuc1BhdGgocCkge1xuICByZXR1cm4gbGVucyhmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIF9wYXRoKHAsIHZhbCk7XG4gIH0sIGFzc29jUGF0aChwKSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGxlbnNQYXRoOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQ7IGBmYWxzZWBcbiAqIG90aGVyd2lzZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBPcmQgYSA9PiBhIC0+IGEgLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSBhXG4gKiBAcGFyYW0geyp9IGJcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAc2VlIFIuZ3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmx0KDIsIDEpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIubHQoMiwgMik7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5sdCgyLCAzKTsgLy89PiB0cnVlXG4gKiAgICAgIFIubHQoJ2EnLCAneicpOyAvLz0+IHRydWVcbiAqICAgICAgUi5sdCgneicsICdhJyk7IC8vPT4gZmFsc2VcbiAqL1xudmFyIGx0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gbHQoYSwgYikge1xuICByZXR1cm4gYSA8IGI7XG59KTtcbmV4cG9ydCBkZWZhdWx0IGx0OyIsImltcG9ydCBfYXJyYXlSZWR1Y2UgZnJvbSBcIi4vaW50ZXJuYWwvX2FycmF5UmVkdWNlLmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwiLi9pbnRlcm5hbC9fbWFwLmpzXCI7XG5pbXBvcnQgX3htYXAgZnJvbSBcIi4vaW50ZXJuYWwvX3htYXAuanNcIjtcbmltcG9ydCBjdXJyeU4gZnJvbSBcIi4vY3VycnlOLmpzXCI7XG5pbXBvcnQga2V5cyBmcm9tIFwiLi9rZXlzLmpzXCI7XG5cbi8qKlxuICogVGFrZXMgYSBmdW5jdGlvbiBhbmRcbiAqIGEgW2Z1bmN0b3JdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjZnVuY3RvciksXG4gKiBhcHBsaWVzIHRoZSBmdW5jdGlvbiB0byBlYWNoIG9mIHRoZSBmdW5jdG9yJ3MgdmFsdWVzLCBhbmQgcmV0dXJuc1xuICogYSBmdW5jdG9yIG9mIHRoZSBzYW1lIHNoYXBlLlxuICpcbiAqIFJhbWRhIHByb3ZpZGVzIHN1aXRhYmxlIGBtYXBgIGltcGxlbWVudGF0aW9ucyBmb3IgYEFycmF5YCBhbmQgYE9iamVjdGAsXG4gKiBzbyB0aGlzIGZ1bmN0aW9uIG1heSBiZSBhcHBsaWVkIHRvIGBbMSwgMiwgM11gIG9yIGB7eDogMSwgeTogMiwgejogM31gLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBtYXBgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBBbHNvIHRyZWF0cyBmdW5jdGlvbnMgYXMgZnVuY3RvcnMgYW5kIHdpbGwgY29tcG9zZSB0aGVtIHRvZ2V0aGVyLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgRnVuY3RvciBmID0+IChhIC0+IGIpIC0+IGYgYSAtPiBmIGJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gZXZlcnkgZWxlbWVudCBvZiB0aGUgaW5wdXQgYGxpc3RgLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBiZSBpdGVyYXRlZCBvdmVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBuZXcgbGlzdC5cbiAqIEBzZWUgUi50cmFuc2R1Y2UsIFIuYWRkSW5kZXgsIFIucGx1Y2ssIFIucHJvamVjdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGRvdWJsZSA9IHggPT4geCAqIDI7XG4gKlxuICogICAgICBSLm1hcChkb3VibGUsIFsxLCAyLCAzXSk7IC8vPT4gWzIsIDQsIDZdXG4gKlxuICogICAgICBSLm1hcChkb3VibGUsIHt4OiAxLCB5OiAyLCB6OiAzfSk7IC8vPT4ge3g6IDIsIHk6IDQsIHo6IDZ9XG4gKiBAc3ltYiBSLm1hcChmLCBbYSwgYl0pID0gW2YoYSksIGYoYildXG4gKiBAc3ltYiBSLm1hcChmLCB7IHg6IGEsIHk6IGIgfSkgPSB7IHg6IGYoYSksIHk6IGYoYikgfVxuICogQHN5bWIgUi5tYXAoZiwgZnVuY3Rvcl9vKSA9IGZ1bmN0b3Jfby5tYXAoZilcbiAqL1xudmFyIG1hcCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbJ2ZhbnRhc3ktbGFuZC9tYXAnLCAnbWFwJ10sIF94bWFwLCBmdW5jdGlvbiBtYXAoZm4sIGZ1bmN0b3IpIHtcbiAgc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZnVuY3RvcikpIHtcbiAgICBjYXNlICdbb2JqZWN0IEZ1bmN0aW9uXSc6XG4gICAgICByZXR1cm4gY3VycnlOKGZ1bmN0b3IubGVuZ3RoLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGZ1bmN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgICB9KTtcbiAgICBjYXNlICdbb2JqZWN0IE9iamVjdF0nOlxuICAgICAgcmV0dXJuIF9hcnJheVJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgYWNjW2tleV0gPSBmbihmdW5jdG9yW2tleV0pO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30sIGtleXMoZnVuY3RvcikpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gX21hcChmbiwgZnVuY3Rvcik7XG4gIH1cbn0pKTtcbmV4cG9ydCBkZWZhdWx0IG1hcDsiLCJpbXBvcnQgX2FycmF5UmVkdWNlIGZyb20gXCIuL2ludGVybmFsL19hcnJheVJlZHVjZS5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IGtleXMgZnJvbSBcIi4va2V5cy5qc1wiO1xuXG4vKipcbiAqIEFuIE9iamVjdC1zcGVjaWZpYyB2ZXJzaW9uIG9mIFtgbWFwYF0oI21hcCkuIFRoZSBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRocmVlXG4gKiBhcmd1bWVudHM6ICoodmFsdWUsIGtleSwgb2JqKSouIElmIG9ubHkgdGhlIHZhbHVlIGlzIHNpZ25pZmljYW50LCB1c2VcbiAqIFtgbWFwYF0oI21hcCkgaW5zdGVhZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKCgqLCBTdHJpbmcsIE9iamVjdCkgLT4gKikgLT4gT2JqZWN0IC0+IE9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tYXBcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCB4eXogPSB7IHg6IDEsIHk6IDIsIHo6IDMgfTtcbiAqICAgICAgY29uc3QgcHJlcGVuZEtleUFuZERvdWJsZSA9IChudW0sIGtleSwgb2JqKSA9PiBrZXkgKyAobnVtICogMik7XG4gKlxuICogICAgICBSLm1hcE9iakluZGV4ZWQocHJlcGVuZEtleUFuZERvdWJsZSwgeHl6KTsgLy89PiB7IHg6ICd4MicsIHk6ICd5NCcsIHo6ICd6NicgfVxuICovXG52YXIgbWFwT2JqSW5kZXhlZCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIG1hcE9iakluZGV4ZWQoZm4sIG9iaikge1xuICByZXR1cm4gX2FycmF5UmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgIGFjY1trZXldID0gZm4ob2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSwga2V5cyhvYmopKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWFwT2JqSW5kZXhlZDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSBcIi4vdG9TdHJpbmcuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXJnZXIgb2YgaXRzIHR3byBhcmd1bWVudHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgT3JkIGEgPT4gYSAtPiBhIC0+IGFcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLm1heEJ5LCBSLm1pblxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubWF4KDc4OSwgMTIzKTsgLy89PiA3ODlcbiAqICAgICAgUi5tYXgoJ2EnLCAnYicpOyAvLz0+ICdiJ1xuICovXG52YXIgbWF4ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gbWF4KGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gYjtcbiAgfVxuICBmdW5jdGlvbiBzYWZlTWF4KHgsIHkpIHtcbiAgICBpZiAoeCA+IHkgIT09IHkgPiB4KSB7XG4gICAgICByZXR1cm4geSA+IHggPyB5IDogeDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB2YXIgbWF4QnlWYWx1ZSA9IHNhZmVNYXgoYSwgYik7XG4gIGlmIChtYXhCeVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbWF4QnlWYWx1ZTtcbiAgfVxuICB2YXIgbWF4QnlUeXBlID0gc2FmZU1heCh0eXBlb2YgYSwgdHlwZW9mIGIpO1xuICBpZiAobWF4QnlUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbWF4QnlUeXBlID09PSB0eXBlb2YgYSA/IGEgOiBiO1xuICB9XG4gIHZhciBzdHJpbmdBID0gdG9TdHJpbmcoYSk7XG4gIHZhciBtYXhCeVN0cmluZ1ZhbHVlID0gc2FmZU1heChzdHJpbmdBLCB0b1N0cmluZyhiKSk7XG4gIGlmIChtYXhCeVN0cmluZ1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbWF4QnlTdHJpbmdWYWx1ZSA9PT0gc3RyaW5nQSA/IGEgOiBiO1xuICB9XG4gIHJldHVybiBiO1xufSk7XG5leHBvcnQgZGVmYXVsdCBtYXg7IiwiaW1wb3J0IF9hcml0eSBmcm9tIFwiLi9pbnRlcm5hbC9fYXJpdHkuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcblxuLyoqXG4gKiBUYWtlcyBhIHN0cmluZy1yZXR1cm5pbmcgZnVuY3Rpb24gYGtleUdlbmAgYW5kIGEgZnVuY3Rpb24gYGZuYCBhbmQgcmV0dXJuc1xuICogYSBuZXcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGNhY2hlZCByZXN1bHRzIGZvciBzdWJzZXF1ZW50XG4gKiBjYWxscyB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cy5cbiAqXG4gKiBXaGVuIHRoZSBmdW5jdGlvbiBpcyBpbnZva2VkLCBga2V5R2VuYCBpcyBhcHBsaWVkIHRvIHRoZSBzYW1lIGFyZ3VtZW50c1xuICogYW5kIGl0cyByZXN1bHQgYmVjb21lcyB0aGUgY2FjaGUga2V5LiBJZiB0aGUgY2FjaGUgY29udGFpbnMgc29tZXRoaW5nXG4gKiB1bmRlciB0aGF0IGtleSwgdGhlIGZ1bmN0aW9uIHNpbXBseSByZXR1cm5zIGl0IGFuZCBkb2VzIG5vdCBpbnZva2UgYGZuYCBhdCBhbGwuXG4gKlxuICogT3RoZXJ3aXNlIGBmbmAgaXMgYXBwbGllZCB0byB0aGUgc2FtZSBhcmd1bWVudHMgYW5kIGl0cyByZXR1cm4gdmFsdWVcbiAqIGlzIGNhY2hlZCB1bmRlciB0aGF0IGtleSBhbmQgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLlxuICpcbiAqIENhcmUgbXVzdCBiZSB0YWtlbiB3aGVuIGltcGxlbWVudGluZyBga2V5R2VuYCB0byBhdm9pZCBrZXkgY29sbGlzaW9uLFxuICogb3IgaWYgdHJhY2tpbmcgcmVmZXJlbmNlcywgbWVtb3J5IGxlYWtzIGFuZCBtdXRhdGluZyBhcmd1bWVudHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjQuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgqLi4uIC0+IFN0cmluZykgLT4gKCouLi4gLT4gYSkgLT4gKCouLi4gLT4gYSlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleUdlbiBUaGUgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIGNhY2hlIGtleS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtZW1vaXplLlxuICogQHJldHVybiB7RnVuY3Rpb259IE1lbW9pemVkIHZlcnNpb24gb2YgYGZuYC5cbiAqIEBleGFtcGxlXG4gKiAgICAgIGNvbnN0IHdpdGhBZ2UgPSBtZW1vaXplV2l0aChvID0+IGAke28uYmlydGh9LyR7by5kZWF0aH1gLCAoe2JpcnRoLCBkZWF0aH0pID0+IHtcbiAqICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4gIF5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuICogICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAga2V5R2VuICAgICAgICAgICAgICAgICAgICAgICAgZm5cbiAqICAgICAgICBjb25zb2xlLmxvZyhgY29tcHV0aW5nIGFnZSBmb3IgJHtiaXJ0aH0vJHtkZWF0aH1gKTtcbiAqICAgICAgICByZXR1cm4gKHtiaXJ0aCwgZGVhdGgsIGFnZTogZGVhdGggLSBiaXJ0aH0pO1xuICogICAgICB9KTtcbiAqXG4gKiAgICAgIHdpdGhBZ2Uoe2JpcnRoOiAxOTIxLCBkZWF0aDogMTk5OX0pO1xuICogICAgICAvLz0+IExPRzogY29tcHV0aW5nIGFnZSBmb3IgMTkyMS8xOTk5XG4gKiAgICAgIC8vPT4ge2JpcnRoOiAxOTIxLCBkZWF0aDogMTk5OSwgYWdlOiA3OH0gKHJldHVybmVkIGZyb20gZm4pXG4gKlxuICogICAgICB3aXRoQWdlKHtiaXJ0aDogMTkyMSwgZGVhdGg6IDE5OTl9KTtcbiAqICAgICAgLy89PiB7YmlydGg6IDE5MjEsIGRlYXRoOiAxOTk5LCBhZ2U6IDc4fSAocmV0dXJuZWQgZnJvbSBjYWNoZSlcbiAqL1xudmFyIG1lbW9pemVXaXRoID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gbWVtb2l6ZVdpdGgoa2V5R2VuLCBmbikge1xuICB2YXIgY2FjaGUgPSB7fTtcbiAgcmV0dXJuIF9hcml0eShmbi5sZW5ndGgsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIga2V5ID0ga2V5R2VuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKCFfaGFzKGtleSwgY2FjaGUpKSB7XG4gICAgICBjYWNoZVtrZXldID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlW2tleV07XG4gIH0pO1xufSk7XG5leHBvcnQgZGVmYXVsdCBtZW1vaXplV2l0aDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgbWVyZ2VEZWVwV2l0aEtleSBmcm9tIFwiLi9tZXJnZURlZXBXaXRoS2V5LmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIGZpcnN0IG9iamVjdCBtZXJnZWQgd2l0aFxuICogdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBzZWNvbmQgb2JqZWN0LiBJZiBhIGtleSBleGlzdHMgaW4gYm90aCBvYmplY3RzOlxuICogLSBhbmQgYm90aCB2YWx1ZXMgYXJlIG9iamVjdHMsIHRoZSB0d28gdmFsdWVzIHdpbGwgYmUgcmVjdXJzaXZlbHkgbWVyZ2VkXG4gKiAtIG90aGVyd2lzZSB0aGUgdmFsdWUgZnJvbSB0aGUgc2Vjb25kIG9iamVjdCB3aWxsIGJlIHVzZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjQuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7YX0gLT4ge2F9IC0+IHthfVxuICogQHBhcmFtIHtPYmplY3R9IGxPYmpcbiAqIEBwYXJhbSB7T2JqZWN0fSByT2JqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWVyZ2UsIFIubWVyZ2VEZWVwTGVmdCwgUi5tZXJnZURlZXBXaXRoLCBSLm1lcmdlRGVlcFdpdGhLZXlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1lcmdlRGVlcFJpZ2h0KHsgbmFtZTogJ2ZyZWQnLCBhZ2U6IDEwLCBjb250YWN0OiB7IGVtYWlsOiAnbW9vQGV4YW1wbGUuY29tJyB9fSxcbiAqICAgICAgICAgICAgICAgICAgICAgICB7IGFnZTogNDAsIGNvbnRhY3Q6IHsgZW1haWw6ICdiYWFAZXhhbXBsZS5jb20nIH19KTtcbiAqICAgICAgLy89PiB7IG5hbWU6ICdmcmVkJywgYWdlOiA0MCwgY29udGFjdDogeyBlbWFpbDogJ2JhYUBleGFtcGxlLmNvbScgfX1cbiAqL1xudmFyIG1lcmdlRGVlcFJpZ2h0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gbWVyZ2VEZWVwUmlnaHQobE9iaiwgck9iaikge1xuICByZXR1cm4gbWVyZ2VEZWVwV2l0aEtleShmdW5jdGlvbiAoaywgbFZhbCwgclZhbCkge1xuICAgIHJldHVybiByVmFsO1xuICB9LCBsT2JqLCByT2JqKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWVyZ2VEZWVwUmlnaHQ7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IF9pc09iamVjdCBmcm9tIFwiLi9pbnRlcm5hbC9faXNPYmplY3QuanNcIjtcbmltcG9ydCBtZXJnZVdpdGhLZXkgZnJvbSBcIi4vbWVyZ2VXaXRoS2V5LmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIHR3byBwcm92aWRlZCBvYmplY3RzLlxuICogSWYgYSBrZXkgZXhpc3RzIGluIGJvdGggb2JqZWN0czpcbiAqIC0gYW5kIGJvdGggYXNzb2NpYXRlZCB2YWx1ZXMgYXJlIGFsc28gb2JqZWN0cyB0aGVuIHRoZSB2YWx1ZXMgd2lsbCBiZVxuICogICByZWN1cnNpdmVseSBtZXJnZWQuXG4gKiAtIG90aGVyd2lzZSB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gaXMgYXBwbGllZCB0byB0aGUga2V5IGFuZCBhc3NvY2lhdGVkIHZhbHVlc1xuICogICB1c2luZyB0aGUgcmVzdWx0aW5nIHZhbHVlIGFzIHRoZSBuZXcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuXG4gKiBJZiBhIGtleSBvbmx5IGV4aXN0cyBpbiBvbmUgb2JqZWN0LCB0aGUgdmFsdWUgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleVxuICogb2YgdGhlIHJlc3VsdGluZyBvYmplY3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjQuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKFN0cmluZywgYSwgYSkgLT4gYSkgLT4ge2F9IC0+IHthfSAtPiB7YX1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gbE9ialxuICogQHBhcmFtIHtPYmplY3R9IHJPYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tZXJnZVdpdGhLZXksIFIubWVyZ2VEZWVwV2l0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGxldCBjb25jYXRWYWx1ZXMgPSAoaywgbCwgcikgPT4gayA9PSAndmFsdWVzJyA/IFIuY29uY2F0KGwsIHIpIDogclxuICogICAgICBSLm1lcmdlRGVlcFdpdGhLZXkoY29uY2F0VmFsdWVzLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgeyBhOiB0cnVlLCBjOiB7IHRoaW5nOiAnZm9vJywgdmFsdWVzOiBbMTAsIDIwXSB9fSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIHsgYjogdHJ1ZSwgYzogeyB0aGluZzogJ2JhcicsIHZhbHVlczogWzE1LCAzNV0gfX0pO1xuICogICAgICAvLz0+IHsgYTogdHJ1ZSwgYjogdHJ1ZSwgYzogeyB0aGluZzogJ2JhcicsIHZhbHVlczogWzEwLCAyMCwgMTUsIDM1XSB9fVxuICovXG52YXIgbWVyZ2VEZWVwV2l0aEtleSA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIG1lcmdlRGVlcFdpdGhLZXkoZm4sIGxPYmosIHJPYmopIHtcbiAgcmV0dXJuIG1lcmdlV2l0aEtleShmdW5jdGlvbiAoaywgbFZhbCwgclZhbCkge1xuICAgIGlmIChfaXNPYmplY3QobFZhbCkgJiYgX2lzT2JqZWN0KHJWYWwpKSB7XG4gICAgICByZXR1cm4gbWVyZ2VEZWVwV2l0aEtleShmbiwgbFZhbCwgclZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmbihrLCBsVmFsLCByVmFsKTtcbiAgICB9XG4gIH0sIGxPYmosIHJPYmopO1xufSk7XG5leHBvcnQgZGVmYXVsdCBtZXJnZURlZXBXaXRoS2V5OyIsImltcG9ydCBfb2JqZWN0QXNzaWduIGZyb20gXCIuL2ludGVybmFsL19vYmplY3RBc3NpZ24uanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBmaXJzdCBvYmplY3QgbWVyZ2VkIHdpdGhcbiAqIHRoZSBvd24gcHJvcGVydGllcyBvZiB0aGUgc2Vjb25kIG9iamVjdC4gSWYgYSBrZXkgZXhpc3RzIGluIGJvdGggb2JqZWN0cyxcbiAqIHRoZSB2YWx1ZSBmcm9tIHRoZSBmaXJzdCBvYmplY3Qgd2lsbCBiZSB1c2VkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge2s6IHZ9IC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7T2JqZWN0fSBsXG4gKiBAcGFyYW0ge09iamVjdH0gclxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHNlZSBSLm1lcmdlUmlnaHQsIFIubWVyZ2VEZWVwTGVmdCwgUi5tZXJnZVdpdGgsIFIubWVyZ2VXaXRoS2V5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tZXJnZUxlZnQoeyAnYWdlJzogNDAgfSwgeyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDEwIH0pO1xuICogICAgICAvLz0+IHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCB9XG4gKlxuICogICAgICBjb25zdCByZXNldFRvRGVmYXVsdCA9IFIubWVyZ2VMZWZ0KHt4OiAwfSk7XG4gKiAgICAgIHJlc2V0VG9EZWZhdWx0KHt4OiA1LCB5OiAyfSk7IC8vPT4ge3g6IDAsIHk6IDJ9XG4gKiBAc3ltYiBSLm1lcmdlTGVmdChhLCBiKSA9IHsuLi5iLCAuLi5hfVxuICovXG52YXIgbWVyZ2VMZWZ0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gbWVyZ2VMZWZ0KGwsIHIpIHtcbiAgcmV0dXJuIF9vYmplY3RBc3NpZ24oe30sIHIsIGwpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBtZXJnZUxlZnQ7IiwiaW1wb3J0IF9vYmplY3RBc3NpZ24gZnJvbSBcIi4vaW50ZXJuYWwvX29iamVjdEFzc2lnbi5qc1wiO1xuaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIGZpcnN0IG9iamVjdCBtZXJnZWQgd2l0aFxuICogdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBzZWNvbmQgb2JqZWN0LiBJZiBhIGtleSBleGlzdHMgaW4gYm90aCBvYmplY3RzLFxuICogdGhlIHZhbHVlIGZyb20gdGhlIHNlY29uZCBvYmplY3Qgd2lsbCBiZSB1c2VkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjI2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge2s6IHZ9IC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7T2JqZWN0fSBsXG4gKiBAcGFyYW0ge09iamVjdH0gclxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHNlZSBSLm1lcmdlTGVmdCwgUi5tZXJnZURlZXBSaWdodCwgUi5tZXJnZVdpdGgsIFIubWVyZ2VXaXRoS2V5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tZXJnZVJpZ2h0KHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiAxMCB9LCB7ICdhZ2UnOiA0MCB9KTtcbiAqICAgICAgLy89PiB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogNDAgfVxuICpcbiAqICAgICAgY29uc3Qgd2l0aERlZmF1bHRzID0gUi5tZXJnZVJpZ2h0KHt4OiAwLCB5OiAwfSk7XG4gKiAgICAgIHdpdGhEZWZhdWx0cyh7eTogMn0pOyAvLz0+IHt4OiAwLCB5OiAyfVxuICogQHN5bWIgUi5tZXJnZVJpZ2h0KGEsIGIpID0gey4uLmEsIC4uLmJ9XG4gKi9cbnZhciBtZXJnZVJpZ2h0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gbWVyZ2VSaWdodChsLCByKSB7XG4gIHJldHVybiBfb2JqZWN0QXNzaWduKHt9LCBsLCByKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWVyZ2VSaWdodDsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgbWVyZ2VXaXRoS2V5IGZyb20gXCIuL21lcmdlV2l0aEtleS5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSB0d28gcHJvdmlkZWQgb2JqZWN0cy4gSWZcbiAqIGEga2V5IGV4aXN0cyBpbiBib3RoIG9iamVjdHMsIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRoZSB2YWx1ZXNcbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIGVhY2ggb2JqZWN0LCB3aXRoIHRoZSByZXN1bHQgYmVpbmcgdXNlZCBhcyB0aGVcbiAqIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBvYmplY3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKGEsIGEpIC0+IGEpIC0+IHthfSAtPiB7YX0gLT4ge2F9XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtPYmplY3R9IGxcbiAqIEBwYXJhbSB7T2JqZWN0fSByXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWVyZ2VEZWVwV2l0aCwgUi5tZXJnZSwgUi5tZXJnZVdpdGhLZXlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1lcmdlV2l0aChSLmNvbmNhdCxcbiAqICAgICAgICAgICAgICAgICAgeyBhOiB0cnVlLCB2YWx1ZXM6IFsxMCwgMjBdIH0sXG4gKiAgICAgICAgICAgICAgICAgIHsgYjogdHJ1ZSwgdmFsdWVzOiBbMTUsIDM1XSB9KTtcbiAqICAgICAgLy89PiB7IGE6IHRydWUsIGI6IHRydWUsIHZhbHVlczogWzEwLCAyMCwgMTUsIDM1XSB9XG4gKi9cbnZhciBtZXJnZVdpdGggPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBtZXJnZVdpdGgoZm4sIGwsIHIpIHtcbiAgcmV0dXJuIG1lcmdlV2l0aEtleShmdW5jdGlvbiAoXywgX2wsIF9yKSB7XG4gICAgcmV0dXJuIGZuKF9sLCBfcik7XG4gIH0sIGwsIHIpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBtZXJnZVdpdGg7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IF9oYXMgZnJvbSBcIi4vaW50ZXJuYWwvX2hhcy5qc1wiO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSB0d28gcHJvdmlkZWQgb2JqZWN0cy4gSWZcbiAqIGEga2V5IGV4aXN0cyBpbiBib3RoIG9iamVjdHMsIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRoZSBrZXlcbiAqIGFuZCB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIGVhY2ggb2JqZWN0LCB3aXRoIHRoZSByZXN1bHQgYmVpbmdcbiAqIHVzZWQgYXMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBvYmplY3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKFN0cmluZywgYSwgYSkgLT4gYSkgLT4ge2F9IC0+IHthfSAtPiB7YX1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gbFxuICogQHBhcmFtIHtPYmplY3R9IHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tZXJnZURlZXBXaXRoS2V5LCBSLm1lcmdlLCBSLm1lcmdlV2l0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGxldCBjb25jYXRWYWx1ZXMgPSAoaywgbCwgcikgPT4gayA9PSAndmFsdWVzJyA/IFIuY29uY2F0KGwsIHIpIDogclxuICogICAgICBSLm1lcmdlV2l0aEtleShjb25jYXRWYWx1ZXMsXG4gKiAgICAgICAgICAgICAgICAgICAgIHsgYTogdHJ1ZSwgdGhpbmc6ICdmb28nLCB2YWx1ZXM6IFsxMCwgMjBdIH0sXG4gKiAgICAgICAgICAgICAgICAgICAgIHsgYjogdHJ1ZSwgdGhpbmc6ICdiYXInLCB2YWx1ZXM6IFsxNSwgMzVdIH0pO1xuICogICAgICAvLz0+IHsgYTogdHJ1ZSwgYjogdHJ1ZSwgdGhpbmc6ICdiYXInLCB2YWx1ZXM6IFsxMCwgMjAsIDE1LCAzNV0gfVxuICogQHN5bWIgUi5tZXJnZVdpdGhLZXkoZiwgeyB4OiAxLCB5OiAyIH0sIHsgeTogNSwgejogMyB9KSA9IHsgeDogMSwgeTogZigneScsIDIsIDUpLCB6OiAzIH1cbiAqL1xudmFyIG1lcmdlV2l0aEtleSA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIG1lcmdlV2l0aEtleShmbiwgbCwgcikge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIHZhciBrO1xuICBsID0gbCB8fCB7fTtcbiAgciA9IHIgfHwge307XG4gIGZvciAoayBpbiBsKSB7XG4gICAgaWYgKF9oYXMoaywgbCkpIHtcbiAgICAgIHJlc3VsdFtrXSA9IF9oYXMoaywgcikgPyBmbihrLCBsW2tdLCByW2tdKSA6IGxba107XG4gICAgfVxuICB9XG4gIGZvciAoayBpbiByKSB7XG4gICAgaWYgKF9oYXMoaywgcikgJiYgIV9oYXMoaywgcmVzdWx0KSkge1xuICAgICAgcmVzdWx0W2tdID0gcltrXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgbWVyZ2VXaXRoS2V5OyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcGFydGlhbCBjb3B5IG9mIGFuIG9iamVjdCBvbWl0dGluZyB0aGUga2V5cyBzcGVjaWZpZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIFtTdHJpbmddIC0+IHtTdHJpbmc6ICp9IC0+IHtTdHJpbmc6ICp9XG4gKiBAcGFyYW0ge0FycmF5fSBuYW1lcyBhbiBhcnJheSBvZiBTdHJpbmcgcHJvcGVydHkgbmFtZXMgdG8gb21pdCBmcm9tIHRoZSBuZXcgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY29weSBmcm9tXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRoIHByb3BlcnRpZXMgZnJvbSBgbmFtZXNgIG5vdCBvbiBpdC5cbiAqIEBzZWUgUi5waWNrXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5vbWl0KFsnYScsICdkJ10sIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2I6IDIsIGM6IDN9XG4gKi9cbnZhciBvbWl0ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gb21pdChuYW1lcywgb2JqKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgdmFyIGluZGV4ID0ge307XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgaW5kZXhbbmFtZXNbaWR4XV0gPSAxO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKCFpbmRleC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgcmVzdWx0W3Byb3BdID0gb2JqW3Byb3BdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5leHBvcnQgZGVmYXVsdCBvbWl0OyIsImltcG9ydCBfYXJpdHkgZnJvbSBcIi4vaW50ZXJuYWwvX2FyaXR5LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5cbi8qKlxuICogQWNjZXB0cyBhIGZ1bmN0aW9uIGBmbmAgYW5kIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGd1YXJkcyBpbnZvY2F0aW9uIG9mXG4gKiBgZm5gIHN1Y2ggdGhhdCBgZm5gIGNhbiBvbmx5IGV2ZXIgYmUgY2FsbGVkIG9uY2UsIG5vIG1hdHRlciBob3cgbWFueSB0aW1lc1xuICogdGhlIHJldHVybmVkIGZ1bmN0aW9uIGlzIGludm9rZWQuIFRoZSBmaXJzdCB2YWx1ZSBjYWxjdWxhdGVkIGlzIHJldHVybmVkIGluXG4gKiBzdWJzZXF1ZW50IGludm9jYXRpb25zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIChhLi4uIC0+IGIpIC0+IChhLi4uIC0+IGIpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gd3JhcCBpbiBhIGNhbGwtb25seS1vbmNlIHdyYXBwZXIuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIHdyYXBwZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYWRkT25lT25jZSA9IFIub25jZSh4ID0+IHggKyAxKTtcbiAqICAgICAgYWRkT25lT25jZSgxMCk7IC8vPT4gMTFcbiAqICAgICAgYWRkT25lT25jZShhZGRPbmVPbmNlKDUwKSk7IC8vPT4gMTFcbiAqL1xudmFyIG9uY2UgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiBvbmNlKGZuKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgdmFyIHJlc3VsdDtcbiAgcmV0dXJuIF9hcml0eShmbi5sZW5ndGgsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2FsbGVkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjYWxsZWQgPSB0cnVlO1xuICAgIHJlc3VsdCA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IG9uY2U7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuXG4vLyBgSWRlbnRpdHlgIGlzIGEgZnVuY3RvciB0aGF0IGhvbGRzIGEgc2luZ2xlIHZhbHVlLCB3aGVyZSBgbWFwYCBzaW1wbHlcbi8vIHRyYW5zZm9ybXMgdGhlIGhlbGQgdmFsdWUgd2l0aCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uXG52YXIgSWRlbnRpdHkgPSBmdW5jdGlvbiAoeCkge1xuICByZXR1cm4ge1xuICAgIHZhbHVlOiB4LFxuICAgIG1hcDogZnVuY3Rpb24gKGYpIHtcbiAgICAgIHJldHVybiBJZGVudGl0eShmKHgpKTtcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBcInNldHRpbmdcIiB0aGUgcG9ydGlvbiBvZiB0aGUgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmVcbiAqIGZvY3VzZWQgYnkgdGhlIGdpdmVuIGxlbnMgdG8gdGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG9cbiAqIHRoZSBmb2N1c2VkIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIExlbnMgcyBhIC0+IChhIC0+IGEpIC0+IHMgLT4gc1xuICogQHBhcmFtIHtMZW5zfSBsZW5zXG4gKiBAcGFyYW0geyp9IHZcbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi52aWV3LCBSLnNldCwgUi5sZW5zLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcCwgUi5sZW5zUGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IGhlYWRMZW5zID0gUi5sZW5zSW5kZXgoMCk7XG4gKlxuICogICAgICBSLm92ZXIoaGVhZExlbnMsIFIudG9VcHBlciwgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbJ0ZPTycsICdiYXInLCAnYmF6J11cbiAqL1xudmFyIG92ZXIgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MyhmdW5jdGlvbiBvdmVyKGxlbnMsIGYsIHgpIHtcbiAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBnZXR0ZXIgZnVuY3Rpb24gaXMgZmlyc3QgdHJhbnNmb3JtZWQgd2l0aCBgZmAsXG4gIC8vIHRoZW4gc2V0IGFzIHRoZSB2YWx1ZSBvZiBhbiBgSWRlbnRpdHlgLiBUaGlzIGlzIHRoZW4gbWFwcGVkIG92ZXIgd2l0aCB0aGVcbiAgLy8gc2V0dGVyIGZ1bmN0aW9uIG9mIHRoZSBsZW5zLlxuICByZXR1cm4gbGVucyhmdW5jdGlvbiAoeSkge1xuICAgIHJldHVybiBJZGVudGl0eShmKHkpKTtcbiAgfSkoeCkudmFsdWU7XG59KTtcbmV4cG9ydCBkZWZhdWx0IG92ZXI7IiwiaW1wb3J0IGZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCBqdXh0IGZyb20gXCIuL2p1eHQuanNcIjtcbmltcG9ydCByZWplY3QgZnJvbSBcIi4vcmVqZWN0LmpzXCI7XG5cbi8qKlxuICogVGFrZXMgYSBwcmVkaWNhdGUgYW5kIGEgbGlzdCBvciBvdGhlciBgRmlsdGVyYWJsZWAgb2JqZWN0IGFuZCByZXR1cm5zIHRoZVxuICogcGFpciBvZiBmaWx0ZXJhYmxlIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBvZiBlbGVtZW50cyB3aGljaCBkbyBhbmQgZG8gbm90XG4gKiBzYXRpc2Z5LCB0aGUgcHJlZGljYXRlLCByZXNwZWN0aXZlbHkuIEZpbHRlcmFibGUgb2JqZWN0cyBpbmNsdWRlIHBsYWluIG9iamVjdHMgb3IgYW55IG9iamVjdFxuICogdGhhdCBoYXMgYSBmaWx0ZXIgbWV0aG9kIHN1Y2ggYXMgYEFycmF5YC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjRcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIEZpbHRlcmFibGUgZiA9PiAoYSAtPiBCb29sZWFuKSAtPiBmIGEgLT4gW2YgYSwgZiBhXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCBBIHByZWRpY2F0ZSB0byBkZXRlcm1pbmUgd2hpY2ggc2lkZSB0aGUgZWxlbWVudCBiZWxvbmdzIHRvLlxuICogQHBhcmFtIHtBcnJheX0gZmlsdGVyYWJsZSB0aGUgbGlzdCAob3Igb3RoZXIgZmlsdGVyYWJsZSkgdG8gcGFydGl0aW9uLlxuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5LCBjb250YWluaW5nIGZpcnN0IHRoZSBzdWJzZXQgb2YgZWxlbWVudHMgdGhhdCBzYXRpc2Z5IHRoZVxuICogICAgICAgICBwcmVkaWNhdGUsIGFuZCBzZWNvbmQgdGhlIHN1YnNldCBvZiBlbGVtZW50cyB0aGF0IGRvIG5vdCBzYXRpc2Z5LlxuICogQHNlZSBSLmZpbHRlciwgUi5yZWplY3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnBhcnRpdGlvbihSLmluY2x1ZGVzKCdzJyksIFsnc3NzJywgJ3R0dCcsICdmb28nLCAnYmFycyddKTtcbiAqICAgICAgLy8gPT4gWyBbICdzc3MnLCAnYmFycycgXSwgIFsgJ3R0dCcsICdmb28nIF0gXVxuICpcbiAqICAgICAgUi5wYXJ0aXRpb24oUi5pbmNsdWRlcygncycpLCB7IGE6ICdzc3MnLCBiOiAndHR0JywgZm9vOiAnYmFycycgfSk7XG4gKiAgICAgIC8vID0+IFsgeyBhOiAnc3NzJywgZm9vOiAnYmFycycgfSwgeyBiOiAndHR0JyB9ICBdXG4gKi9cbnZhciBwYXJ0aXRpb24gPSAvKiNfX1BVUkVfXyovanV4dChbZmlsdGVyLCByZWplY3RdKTtcbmV4cG9ydCBkZWZhdWx0IHBhcnRpdGlvbjsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgX3BhdGggZnJvbSBcIi4vaW50ZXJuYWwvX3BhdGguanNcIjtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIGF0IGEgZ2l2ZW4gcGF0aC4gVGhlIG5vZGVzIG9mIHRoZSBwYXRoIGNhbiBiZSBhcmJpdHJhcnkgc3RyaW5ncyBvciBub24tbmVnYXRpdmUgaW50ZWdlcnMuXG4gKiBGb3IgYW55dGhpbmcgZWxzZSwgdGhlIHZhbHVlIGlzIHVuc3BlY2lmaWVkLiBJbnRlZ2VyIHBhdGhzIGFyZSBtZWFudCB0byBpbmRleCBhcnJheXMsIHN0cmluZ3MgYXJlIG1lYW50IGZvciBvYmplY3RzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludCB8IFN5bWJvbFxuICogQHNpZyBbSWR4XSAtPiB7YX0gLT4gYSB8IFVuZGVmaW5lZFxuICogQHNpZyBJZHggPSBTdHJpbmcgfCBOb25OZWdhdGl2ZUludFxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byB1c2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gcmV0cmlldmUgdGhlIG5lc3RlZCBwcm9wZXJ0eSBmcm9tLlxuICogQHJldHVybiB7Kn0gVGhlIGRhdGEgYXQgYHBhdGhgLlxuICogQHNlZSBSLnByb3AsIFIubnRoLCBSLmFzc29jUGF0aCwgUi5kaXNzb2NQYXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wYXRoKFsnYScsICdiJ10sIHthOiB7YjogMn19KTsgLy89PiAyXG4gKiAgICAgIFIucGF0aChbJ2EnLCAnYiddLCB7Yzoge2I6IDJ9fSk7IC8vPT4gdW5kZWZpbmVkXG4gKiAgICAgIFIucGF0aChbJ2EnLCAnYicsIDBdLCB7YToge2I6IFsxLCAyLCAzXX19KTsgLy89PiAxXG4gKiAgICAgIFIucGF0aChbJ2EnLCAnYicsIC0yXSwge2E6IHtiOiBbMSwgMiwgM119fSk7IC8vPT4gMlxuICogICAgICBSLnBhdGgoWzJdLCB7JzInOiAyfSk7IC8vPT4gMlxuICogICAgICBSLnBhdGgoWy0yXSwgeyctMic6ICdhJ30pOyAvLz0+IHVuZGVmaW5lZFxuICovXG5cbnZhciBwYXRoID0gLyojX19QVVJFX18qL19jdXJyeTIoX3BhdGgpO1xuZXhwb3J0IGRlZmF1bHQgcGF0aDsiLCJpbXBvcnQgX2N1cnJ5MyBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkzLmpzXCI7XG5pbXBvcnQgX3BhdGggZnJvbSBcIi4vaW50ZXJuYWwvX3BhdGguanNcIjtcbmltcG9ydCBkZWZhdWx0VG8gZnJvbSBcIi4vZGVmYXVsdFRvLmpzXCI7XG5cbi8qKlxuICogSWYgdGhlIGdpdmVuLCBub24tbnVsbCBvYmplY3QgaGFzIGEgdmFsdWUgYXQgdGhlIGdpdmVuIHBhdGgsIHJldHVybnMgdGhlXG4gKiB2YWx1ZSBhdCB0aGF0IHBhdGguIE90aGVyd2lzZSByZXR1cm5zIHRoZSBwcm92aWRlZCBkZWZhdWx0IHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE4LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgYSAtPiBbSWR4XSAtPiB7YX0gLT4gYVxuICogQHBhcmFtIHsqfSBkIFRoZSBkZWZhdWx0IHZhbHVlLlxuICogQHBhcmFtIHtBcnJheX0gcCBUaGUgcGF0aCB0byB1c2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcmV0cmlldmUgdGhlIG5lc3RlZCBwcm9wZXJ0eSBmcm9tLlxuICogQHJldHVybiB7Kn0gVGhlIGRhdGEgYXQgYHBhdGhgIG9mIHRoZSBzdXBwbGllZCBvYmplY3Qgb3IgdGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wYXRoT3IoJ04vQScsIFsnYScsICdiJ10sIHthOiB7YjogMn19KTsgLy89PiAyXG4gKiAgICAgIFIucGF0aE9yKCdOL0EnLCBbJ2EnLCAnYiddLCB7Yzoge2I6IDJ9fSk7IC8vPT4gXCJOL0FcIlxuICovXG52YXIgcGF0aE9yID0gLyojX19QVVJFX18qL19jdXJyeTMoZnVuY3Rpb24gcGF0aE9yKGQsIHAsIG9iaikge1xuICByZXR1cm4gZGVmYXVsdFRvKGQsIF9wYXRoKHAsIG9iaikpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBwYXRoT3I7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBwYXJ0aWFsIGNvcHkgb2YgYW4gb2JqZWN0IGNvbnRhaW5pbmcgb25seSB0aGUga2V5cyBzcGVjaWZpZWQuIElmXG4gKiB0aGUga2V5IGRvZXMgbm90IGV4aXN0LCB0aGUgcHJvcGVydHkgaXMgaWdub3JlZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgW2tdIC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7QXJyYXl9IG5hbWVzIGFuIGFycmF5IG9mIFN0cmluZyBwcm9wZXJ0eSBuYW1lcyB0byBjb3B5IG9udG8gYSBuZXcgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY29weSBmcm9tXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRoIG9ubHkgcHJvcGVydGllcyBmcm9tIGBuYW1lc2Agb24gaXQuXG4gKiBAc2VlIFIub21pdCwgUi5wcm9wc1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucGljayhbJ2EnLCAnZCddLCB7YTogMSwgYjogMiwgYzogMywgZDogNH0pOyAvLz0+IHthOiAxLCBkOiA0fVxuICogICAgICBSLnBpY2soWydhJywgJ2UnLCAnZiddLCB7YTogMSwgYjogMiwgYzogMywgZDogNH0pOyAvLz0+IHthOiAxfVxuICovXG52YXIgcGljayA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHBpY2sobmFtZXMsIG9iaikge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbmFtZXMubGVuZ3RoKSB7XG4gICAgaWYgKG5hbWVzW2lkeF0gaW4gb2JqKSB7XG4gICAgICByZXN1bHRbbmFtZXNbaWR4XV0gPSBvYmpbbmFtZXNbaWR4XV07XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHBpY2s7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBwYXJ0aWFsIGNvcHkgb2YgYW4gb2JqZWN0IGNvbnRhaW5pbmcgb25seSB0aGUga2V5cyB0aGF0IHNhdGlzZnlcbiAqIHRoZSBzdXBwbGllZCBwcmVkaWNhdGUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnICgodiwgaykgLT4gQm9vbGVhbikgLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCBBIHByZWRpY2F0ZSB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgYSBrZXlcbiAqICAgICAgICBzaG91bGQgYmUgaW5jbHVkZWQgb24gdGhlIG91dHB1dCBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY29weSBmcm9tXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRoIG9ubHkgcHJvcGVydGllcyB0aGF0IHNhdGlzZnkgYHByZWRgXG4gKiAgICAgICAgIG9uIGl0LlxuICogQHNlZSBSLnBpY2ssIFIuZmlsdGVyXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgaXNVcHBlckNhc2UgPSAodmFsLCBrZXkpID0+IGtleS50b1VwcGVyQ2FzZSgpID09PSBrZXk7XG4gKiAgICAgIFIucGlja0J5KGlzVXBwZXJDYXNlLCB7YTogMSwgYjogMiwgQTogMywgQjogNH0pOyAvLz0+IHtBOiAzLCBCOiA0fVxuICovXG52YXIgcGlja0J5ID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gcGlja0J5KHRlc3QsIG9iaikge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgaWYgKHRlc3Qob2JqW3Byb3BdLCBwcm9wLCBvYmopKSB7XG4gICAgICByZXN1bHRbcHJvcF0gPSBvYmpbcHJvcF07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHBpY2tCeTsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgbWFwIGZyb20gXCIuL21hcC5qc1wiO1xuaW1wb3J0IHByb3AgZnJvbSBcIi4vcHJvcC5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBieSBwbHVja2luZyB0aGUgc2FtZSBuYW1lZCBwcm9wZXJ0eSBvZmYgYWxsIG9iamVjdHMgaW5cbiAqIHRoZSBsaXN0IHN1cHBsaWVkLlxuICpcbiAqIGBwbHVja2Agd2lsbCB3b3JrIG9uXG4gKiBhbnkgW2Z1bmN0b3JdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjZnVuY3RvcikgaW5cbiAqIGFkZGl0aW9uIHRvIGFycmF5cywgYXMgaXQgaXMgZXF1aXZhbGVudCB0byBgUi5tYXAoUi5wcm9wKGspLCBmKWAuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBGdW5jdG9yIGYgPT4gayAtPiBmIHtrOiB2fSAtPiBmIHZcbiAqIEBwYXJhbSB7TnVtYmVyfFN0cmluZ30ga2V5IFRoZSBrZXkgbmFtZSB0byBwbHVjayBvZmYgb2YgZWFjaCBvYmplY3QuXG4gKiBAcGFyYW0ge0FycmF5fSBmIFRoZSBhcnJheSBvciBmdW5jdG9yIHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGtleS5cbiAqIEBzZWUgUi5wcm9qZWN0LCBSLnByb3AsIFIucHJvcHNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgZ2V0QWdlcyA9IFIucGx1Y2soJ2FnZScpO1xuICogICAgICBnZXRBZ2VzKFt7bmFtZTogJ2ZyZWQnLCBhZ2U6IDI5fSwge25hbWU6ICd3aWxtYScsIGFnZTogMjd9XSk7IC8vPT4gWzI5LCAyN11cbiAqXG4gKiAgICAgIFIucGx1Y2soMCwgW1sxLCAyXSwgWzMsIDRdXSk7ICAgICAgICAgICAgICAgLy89PiBbMSwgM11cbiAqICAgICAgUi5wbHVjaygndmFsJywge2E6IHt2YWw6IDN9LCBiOiB7dmFsOiA1fX0pOyAvLz0+IHthOiAzLCBiOiA1fVxuICogQHN5bWIgUi5wbHVjaygneCcsIFt7eDogMSwgeTogMn0sIHt4OiAzLCB5OiA0fSwge3g6IDUsIHk6IDZ9XSkgPSBbMSwgMywgNV1cbiAqIEBzeW1iIFIucGx1Y2soMCwgW1sxLCAyXSwgWzMsIDRdLCBbNSwgNl1dKSA9IFsxLCAzLCA1XVxuICovXG52YXIgcGx1Y2sgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBwbHVjayhwLCBsaXN0KSB7XG4gIHJldHVybiBtYXAocHJvcChwKSwgbGlzdCk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHBsdWNrOyIsImltcG9ydCBfY29uY2F0IGZyb20gXCIuL2ludGVybmFsL19jb25jYXQuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3Qgd2l0aCB0aGUgZ2l2ZW4gZWxlbWVudCBhdCB0aGUgZnJvbnQsIGZvbGxvd2VkIGJ5IHRoZVxuICogY29udGVudHMgb2YgdGhlIGxpc3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7Kn0gZWwgVGhlIGl0ZW0gdG8gYWRkIHRvIHRoZSBoZWFkIG9mIHRoZSBvdXRwdXQgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGFkZCB0byB0aGUgdGFpbCBvZiB0aGUgb3V0cHV0IGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgYXJyYXkuXG4gKiBAc2VlIFIuYXBwZW5kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wcmVwZW5kKCdmZWUnLCBbJ2ZpJywgJ2ZvJywgJ2Z1bSddKTsgLy89PiBbJ2ZlZScsICdmaScsICdmbycsICdmdW0nXVxuICovXG52YXIgcHJlcGVuZCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHByZXBlbmQoZWwsIGxpc3QpIHtcbiAgcmV0dXJuIF9jb25jYXQoW2VsXSwgbGlzdCk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHByZXBlbmQ7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9pc0ludGVnZXIgZnJvbSBcIi4vaW50ZXJuYWwvX2lzSW50ZWdlci5qc1wiO1xuaW1wb3J0IF9udGggZnJvbSBcIi4vaW50ZXJuYWwvX250aC5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdoZW4gc3VwcGxpZWQgYW4gb2JqZWN0IHJldHVybnMgdGhlIGluZGljYXRlZFxuICogcHJvcGVydHkgb2YgdGhhdCBvYmplY3QsIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnQgfCBTeW1ib2xcbiAqIEBzaWcgSWR4IC0+IHtzOiBhfSAtPiBhIHwgVW5kZWZpbmVkXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHAgVGhlIHByb3BlcnR5IG5hbWUgb3IgYXJyYXkgaW5kZXhcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBxdWVyeVxuICogQHJldHVybiB7Kn0gVGhlIHZhbHVlIGF0IGBvYmoucGAuXG4gKiBAc2VlIFIucGF0aCwgUi5wcm9wcywgUi5wbHVjaywgUi5wcm9qZWN0LCBSLm50aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucHJvcCgneCcsIHt4OiAxMDB9KTsgLy89PiAxMDBcbiAqICAgICAgUi5wcm9wKCd4Jywge30pOyAvLz0+IHVuZGVmaW5lZFxuICogICAgICBSLnByb3AoMCwgWzEwMF0pOyAvLz0+IDEwMFxuICogICAgICBSLmNvbXBvc2UoUi5pbmMsIFIucHJvcCgneCcpKSh7IHg6IDMgfSkgLy89PiA0XG4gKi9cblxudmFyIHByb3AgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiBwcm9wKHAsIG9iaikge1xuICBpZiAob2JqID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmV0dXJuIF9pc0ludGVnZXIocCkgPyBfbnRoKHAsIG9iaikgOiBvYmpbcF07XG59KTtcbmV4cG9ydCBkZWZhdWx0IHByb3A7IiwiaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuaW1wb3J0IHByb3AgZnJvbSBcIi4vcHJvcC5qc1wiO1xuaW1wb3J0IGVxdWFscyBmcm9tIFwiLi9lcXVhbHMuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcm9wZXJ0eSBpcyBlcXVhbCwgaW5cbiAqIFtgUi5lcXVhbHNgXSgjZXF1YWxzKSB0ZXJtcywgdG8gdGhlIGdpdmVuIHZhbHVlOyBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIFlvdSBjYW4gdGVzdCBtdWx0aXBsZSBwcm9wZXJ0aWVzIHdpdGggW2BSLndoZXJlRXFgXSgjd2hlcmVFcSksXG4gKiBhbmQgdGVzdCBuZXN0ZWQgcGF0aCBwcm9wZXJ0eSB3aXRoIFtgUi5wYXRoRXFgXSgjcGF0aEVxKS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBhIC0+IFN0cmluZyAtPiBPYmplY3QgLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIGNvbXBhcmUgdGhlIHByb3BlcnR5IHdpdGhcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByb3BlcnR5J3Mga2V5XG4gKiBAcGFyYW0geyp9IG9iaiBUaGUgb2JqZWN0IHRvIGNoZWNrIHRoZSBwcm9wZXJ0eSBpblxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSB2YWx1ZSBlcXVhbHMgdGhlIHNwZWNpZmllZCBvYmplY3QgcHJvcGVydHksXG4gKiAgICAgICAgIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQHNlZSBSLndoZXJlRXEsIFIucGF0aEVxLCBSLnByb3BTYXRpc2ZpZXMsIFIuZXF1YWxzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgYWJieSA9IHtuYW1lOiAnQWJieScsIGFnZTogNywgaGFpcjogJ2Jsb25kJ307XG4gKiAgICAgIGNvbnN0IGZyZWQgPSB7bmFtZTogJ0ZyZWQnLCBhZ2U6IDEyLCBoYWlyOiAnYnJvd24nfTtcbiAqICAgICAgY29uc3QgcnVzdHkgPSB7bmFtZTogJ1J1c3R5JywgYWdlOiAxMCwgaGFpcjogJ2Jyb3duJ307XG4gKiAgICAgIGNvbnN0IGFsb2lzID0ge25hbWU6ICdBbG9pcycsIGFnZTogMTUsIGRpc3Bvc2l0aW9uOiAnc3VybHknfTtcbiAqICAgICAgY29uc3Qga2lkcyA9IFthYmJ5LCBmcmVkLCBydXN0eSwgYWxvaXNdO1xuICogICAgICBjb25zdCBoYXNCcm93bkhhaXIgPSBSLnByb3BFcSgnYnJvd24nLCAnaGFpcicpO1xuICogICAgICBSLmZpbHRlcihoYXNCcm93bkhhaXIsIGtpZHMpOyAvLz0+IFtmcmVkLCBydXN0eV1cbiAqL1xudmFyIHByb3BFcSA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIHByb3BFcSh2YWwsIG5hbWUsIG9iaikge1xuICByZXR1cm4gZXF1YWxzKHZhbCwgcHJvcChuYW1lLCBvYmopKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgcHJvcEVxOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBwcm9wIGZyb20gXCIuL3Byb3AuanNcIjtcblxuLyoqXG4gKiBBY3RzIGFzIG11bHRpcGxlIGBwcm9wYDogYXJyYXkgb2Yga2V5cyBpbiwgYXJyYXkgb2YgdmFsdWVzIG91dC4gUHJlc2VydmVzXG4gKiBvcmRlci5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgW2tdIC0+IHtrOiB2fSAtPiBbdl1cbiAqIEBwYXJhbSB7QXJyYXl9IHBzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBmZXRjaFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHF1ZXJ5XG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIG9yIHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLlxuICogQHNlZSBSLnByb3AsIFIucGx1Y2ssIFIucHJvamVjdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucHJvcHMoWyd4JywgJ3knXSwge3g6IDEsIHk6IDJ9KTsgLy89PiBbMSwgMl1cbiAqICAgICAgUi5wcm9wcyhbJ2MnLCAnYScsICdiJ10sIHtiOiAyLCBhOiAxfSk7IC8vPT4gW3VuZGVmaW5lZCwgMSwgMl1cbiAqXG4gKiAgICAgIGNvbnN0IGZ1bGxOYW1lID0gUi5jb21wb3NlKFIuam9pbignICcpLCBSLnByb3BzKFsnZmlyc3QnLCAnbGFzdCddKSk7XG4gKiAgICAgIGZ1bGxOYW1lKHtsYXN0OiAnQnVsbGV0LVRvb3RoJywgYWdlOiAzMywgZmlyc3Q6ICdUb255J30pOyAvLz0+ICdUb255IEJ1bGxldC1Ub290aCdcbiAqL1xudmFyIHByb3BzID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gcHJvcHMocHMsIG9iaikge1xuICByZXR1cm4gcHMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIHByb3AocCwgb2JqKTtcbiAgfSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHByb3BzOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBfeFJlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9feFJlZHVjZS5qc1wiO1xuaW1wb3J0IF94d3JhcCBmcm9tIFwiLi9pbnRlcm5hbC9feHdyYXAuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGxpc3QsIHN1Y2Nlc3NpdmVseSBjYWxsaW5nXG4gKiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gYW5kIHBhc3NpbmcgaXQgYW4gYWNjdW11bGF0b3IgdmFsdWUgYW5kIHRoZSBjdXJyZW50XG4gKiB2YWx1ZSBmcm9tIHRoZSBhcnJheSwgYW5kIHRoZW4gcGFzc2luZyB0aGUgcmVzdWx0IHRvIHRoZSBuZXh0IGNhbGwuXG4gKlxuICogVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHJlY2VpdmVzIHR3byB2YWx1ZXM6ICooYWNjLCB2YWx1ZSkqLiBJdCBtYXkgdXNlXG4gKiBbYFIucmVkdWNlZGBdKCNyZWR1Y2VkKSB0byBzaG9ydGN1dCB0aGUgaXRlcmF0aW9uLlxuICpcbiAqIFRoZSBhcmd1bWVudHMnIG9yZGVyIG9mIFtgcmVkdWNlUmlnaHRgXSgjcmVkdWNlUmlnaHQpJ3MgaXRlcmF0b3IgZnVuY3Rpb25cbiAqIGlzICoodmFsdWUsIGFjYykqLlxuICpcbiAqIE5vdGU6IGBSLnJlZHVjZWAgZG9lcyBub3Qgc2tpcCBkZWxldGVkIG9yIHVuYXNzaWduZWQgaW5kaWNlcyAoc3BhcnNlXG4gKiBhcnJheXMpLCB1bmxpa2UgdGhlIG5hdGl2ZSBgQXJyYXkucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kLiBGb3IgbW9yZSBkZXRhaWxzXG4gKiBvbiB0aGlzIGJlaGF2aW9yLCBzZWU6XG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9yZWR1Y2UjRGVzY3JpcHRpb25cbiAqXG4gKiBCZSBjYXV0aW91cyBvZiBtdXRhdGluZyBhbmQgcmV0dXJuaW5nIHRoZSBhY2N1bXVsYXRvci4gSWYgeW91IHJldXNlIGl0IGFjcm9zc1xuICogaW52b2NhdGlvbnMsIGl0IHdpbGwgY29udGludWUgdG8gYWNjdW11bGF0ZSBvbnRvIHRoZSBzYW1lIHZhbHVlLiBUaGUgZ2VuZXJhbFxuICogcmVjb21tZW5kYXRpb24gaXMgdG8gYWx3YXlzIHJldHVybiBhIG5ldyB2YWx1ZS4gSWYgeW91IGNhbid0IGRvIHNvIGZvclxuICogcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlbiBiZSBzdXJlIHRvIHJlaW5pdGlhbGl6ZSB0aGUgYWNjdW11bGF0b3Igb24gZWFjaFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgcmVkdWNlYCBtZXRob2Qgb2YgdGhlIHRoaXJkIGFyZ3VtZW50LCBpZiBwcmVzZW50LiBXaGVuXG4gKiBkb2luZyBzbywgaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gaGFuZGxlIHRoZSBbYFIucmVkdWNlZGBdKCNyZWR1Y2VkKVxuICogc2hvcnRjdXRpbmcsIGFzIHRoaXMgaXMgbm90IGltcGxlbWVudGVkIGJ5IGByZWR1Y2VgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKChhLCBiKSAtPiBhKSAtPiBhIC0+IFtiXSAtPiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgaXRlcmF0b3IgZnVuY3Rpb24uIFJlY2VpdmVzIHR3byB2YWx1ZXMsIHRoZSBhY2N1bXVsYXRvciBhbmQgdGhlXG4gKiAgICAgICAgY3VycmVudCBlbGVtZW50IGZyb20gdGhlIGFycmF5LlxuICogQHBhcmFtIHsqfSBhY2MgVGhlIGFjY3VtdWxhdG9yIHZhbHVlLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHsqfSBUaGUgZmluYWwsIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQHNlZSBSLnJlZHVjZWQsIFIuYWRkSW5kZXgsIFIucmVkdWNlUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnJlZHVjZShSLnN1YnRyYWN0LCAwLCBbMSwgMiwgMywgNF0pIC8vID0+ICgoKCgwIC0gMSkgLSAyKSAtIDMpIC0gNCkgPSAtMTBcbiAqICAgICAgLy8gICAgICAgICAgLSAgICAgICAgICAgICAgIC0xMFxuICogICAgICAvLyAgICAgICAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgLy8gICAgICAgIC0gICA0ICAgICAgICAgICAtNiAgIDRcbiAqICAgICAgLy8gICAgICAgLyBcXCAgICAgICAgICAgICAgLyBcXFxuICogICAgICAvLyAgICAgIC0gICAzICAgPT0+ICAgICAtMyAgIDNcbiAqICAgICAgLy8gICAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgLy8gICAgLSAgIDIgICAgICAgICAgIC0xICAgMlxuICogICAgICAvLyAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgLy8gIDAgICAxICAgICAgICAgICAgMCAgIDFcbiAqXG4gKiBAc3ltYiBSLnJlZHVjZShmLCBhLCBbYiwgYywgZF0pID0gZihmKGYoYSwgYiksIGMpLCBkKVxuICovXG52YXIgcmVkdWNlID0gLyojX19QVVJFX18qL19jdXJyeTMoZnVuY3Rpb24gKHhmLCBhY2MsIGxpc3QpIHtcbiAgcmV0dXJuIF94UmVkdWNlKHR5cGVvZiB4ZiA9PT0gJ2Z1bmN0aW9uJyA/IF94d3JhcCh4ZikgOiB4ZiwgYWNjLCBsaXN0KTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgcmVkdWNlOyIsImltcG9ydCBfY2xvbmUgZnJvbSBcIi4vaW50ZXJuYWwvX2Nsb25lLmpzXCI7XG5pbXBvcnQgX2N1cnJ5TiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnlOLmpzXCI7XG5pbXBvcnQgX2Rpc3BhdGNoYWJsZSBmcm9tIFwiLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlLmpzXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwiLi9pbnRlcm5hbC9faGFzLmpzXCI7XG5pbXBvcnQgX3JlZHVjZWQgZnJvbSBcIi4vaW50ZXJuYWwvX3JlZHVjZWQuanNcIjtcbmltcG9ydCBfeFJlZHVjZSBmcm9tIFwiLi9pbnRlcm5hbC9feFJlZHVjZS5qc1wiO1xuaW1wb3J0IF94cmVkdWNlQnkgZnJvbSBcIi4vaW50ZXJuYWwvX3hyZWR1Y2VCeS5qc1wiO1xuaW1wb3J0IF94d3JhcCBmcm9tIFwiLi9pbnRlcm5hbC9feHdyYXAuanNcIjtcblxuLyoqXG4gKiBHcm91cHMgdGhlIGVsZW1lbnRzIG9mIHRoZSBsaXN0IGFjY29yZGluZyB0byB0aGUgcmVzdWx0IG9mIGNhbGxpbmdcbiAqIHRoZSBTdHJpbmctcmV0dXJuaW5nIGZ1bmN0aW9uIGBrZXlGbmAgb24gZWFjaCBlbGVtZW50IGFuZCByZWR1Y2VzIHRoZSBlbGVtZW50c1xuICogb2YgZWFjaCBncm91cCB0byBhIHNpbmdsZSB2YWx1ZSB2aWEgdGhlIHJlZHVjZXIgZnVuY3Rpb24gYHZhbHVlRm5gLlxuICpcbiAqIFRoZSB2YWx1ZSBmdW5jdGlvbiByZWNlaXZlcyB0d28gdmFsdWVzOiAqKGFjYywgdmFsdWUpKi4gSXQgbWF5IHVzZVxuICogW2BSLnJlZHVjZWRgXSgjcmVkdWNlZCkgdG8gc2hvcnQgY2lyY3VpdCB0aGUgaXRlcmF0aW9uLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGEgbW9yZSBnZW5lcmFsIFtgZ3JvdXBCeWBdKCNncm91cEJ5KSBmdW5jdGlvbi5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjAuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKChhLCBiKSAtPiBhKSAtPiBhIC0+IChiIC0+IFN0cmluZykgLT4gW2JdIC0+IHtTdHJpbmc6IGF9XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB2YWx1ZUZuIFRoZSBmdW5jdGlvbiB0aGF0IHJlZHVjZXMgdGhlIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXAgdG8gYSBzaW5nbGVcbiAqICAgICAgICB2YWx1ZS4gUmVjZWl2ZXMgdHdvIHZhbHVlcywgYWNjdW11bGF0b3IgZm9yIGEgcGFydGljdWxhciBncm91cCBhbmQgdGhlIGN1cnJlbnQgZWxlbWVudC5cbiAqIEBwYXJhbSB7Kn0gYWNjIFRoZSAoaW5pdGlhbCkgYWNjdW11bGF0b3IgdmFsdWUgZm9yIGVhY2ggZ3JvdXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlGbiBUaGUgZnVuY3Rpb24gdGhhdCBtYXBzIHRoZSBsaXN0J3MgZWxlbWVudCBpbnRvIGEga2V5LlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gZ3JvdXAuXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCB3aXRoIHRoZSBvdXRwdXQgb2YgYGtleUZuYCBmb3Iga2V5cywgbWFwcGVkIHRvIHRoZSBvdXRwdXQgb2ZcbiAqICAgICAgICAgYHZhbHVlRm5gIGZvciBlbGVtZW50cyB3aGljaCBwcm9kdWNlZCB0aGF0IGtleSB3aGVuIHBhc3NlZCB0byBga2V5Rm5gLlxuICogQHNlZSBSLmdyb3VwQnksIFIucmVkdWNlLCBSLnJlZHVjZWRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBncm91cE5hbWVzID0gKGFjYywge25hbWV9KSA9PiBhY2MuY29uY2F0KG5hbWUpXG4gKiAgICAgIGNvbnN0IHRvR3JhZGUgPSAoe3Njb3JlfSkgPT5cbiAqICAgICAgICBzY29yZSA8IDY1ID8gJ0YnIDpcbiAqICAgICAgICBzY29yZSA8IDcwID8gJ0QnIDpcbiAqICAgICAgICBzY29yZSA8IDgwID8gJ0MnIDpcbiAqICAgICAgICBzY29yZSA8IDkwID8gJ0InIDogJ0EnXG4gKlxuICogICAgICB2YXIgc3R1ZGVudHMgPSBbXG4gKiAgICAgICAge25hbWU6ICdBYmJ5Jywgc2NvcmU6IDgzfSxcbiAqICAgICAgICB7bmFtZTogJ0JhcnQnLCBzY29yZTogNjJ9LFxuICogICAgICAgIHtuYW1lOiAnQ3VydCcsIHNjb3JlOiA4OH0sXG4gKiAgICAgICAge25hbWU6ICdEb3JhJywgc2NvcmU6IDkyfSxcbiAqICAgICAgXVxuICpcbiAqICAgICAgcmVkdWNlQnkoZ3JvdXBOYW1lcywgW10sIHRvR3JhZGUsIHN0dWRlbnRzKVxuICogICAgICAvLz0+IHtcIkFcIjogW1wiRG9yYVwiXSwgXCJCXCI6IFtcIkFiYnlcIiwgXCJDdXJ0XCJdLCBcIkZcIjogW1wiQmFydFwiXX1cbiAqL1xudmFyIHJlZHVjZUJ5ID0gLyojX19QVVJFX18qL19jdXJyeU4oNCwgW10sIC8qI19fUFVSRV9fKi9fZGlzcGF0Y2hhYmxlKFtdLCBfeHJlZHVjZUJ5LCBmdW5jdGlvbiByZWR1Y2VCeSh2YWx1ZUZuLCB2YWx1ZUFjYywga2V5Rm4sIGxpc3QpIHtcbiAgdmFyIHhmID0gX3h3cmFwKGZ1bmN0aW9uIChhY2MsIGVsdCkge1xuICAgIHZhciBrZXkgPSBrZXlGbihlbHQpO1xuICAgIHZhciB2YWx1ZSA9IHZhbHVlRm4oX2hhcyhrZXksIGFjYykgPyBhY2Nba2V5XSA6IF9jbG9uZSh2YWx1ZUFjYywgZmFsc2UpLCBlbHQpO1xuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZVsnQEB0cmFuc2R1Y2VyL3JlZHVjZWQnXSkge1xuICAgICAgcmV0dXJuIF9yZWR1Y2VkKGFjYyk7XG4gICAgfVxuICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGFjYztcbiAgfSk7XG4gIHJldHVybiBfeFJlZHVjZSh4Ziwge30sIGxpc3QpO1xufSkpO1xuZXhwb3J0IGRlZmF1bHQgcmVkdWNlQnk7IiwiaW1wb3J0IF9jb21wbGVtZW50IGZyb20gXCIuL2ludGVybmFsL19jb21wbGVtZW50LmpzXCI7XG5pbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgZmlsdGVyIGZyb20gXCIuL2ZpbHRlci5qc1wiO1xuXG4vKipcbiAqIFRoZSBjb21wbGVtZW50IG9mIFtgZmlsdGVyYF0oI2ZpbHRlcikuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLiBGaWx0ZXJhYmxlXG4gKiBvYmplY3RzIGluY2x1ZGUgcGxhaW4gb2JqZWN0cyBvciBhbnkgb2JqZWN0IHRoYXQgaGFzIGEgZmlsdGVyIG1ldGhvZCBzdWNoXG4gKiBhcyBgQXJyYXlgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgRmlsdGVyYWJsZSBmID0+IChhIC0+IEJvb2xlYW4pIC0+IGYgYSAtPiBmIGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlcmFibGVcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHNlZSBSLmZpbHRlciwgUi50cmFuc2R1Y2UsIFIuYWRkSW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBpc09kZCA9IChuKSA9PiBuICUgMiAhPT0gMDtcbiAqXG4gKiAgICAgIFIucmVqZWN0KGlzT2RkLCBbMSwgMiwgMywgNF0pOyAvLz0+IFsyLCA0XVxuICpcbiAqICAgICAgUi5yZWplY3QoaXNPZGQsIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2I6IDIsIGQ6IDR9XG4gKi9cbnZhciByZWplY3QgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MihmdW5jdGlvbiByZWplY3QocHJlZCwgZmlsdGVyYWJsZSkge1xuICByZXR1cm4gZmlsdGVyKF9jb21wbGVtZW50KHByZWQpLCBmaWx0ZXJhYmxlKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgcmVqZWN0OyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBzdWItbGlzdCBvZiBgbGlzdGAgc3RhcnRpbmcgYXQgaW5kZXggYHN0YXJ0YCBhbmQgY29udGFpbmluZ1xuICogYGNvdW50YCBlbGVtZW50cy4gX05vdGUgdGhhdCB0aGlzIGlzIG5vdCBkZXN0cnVjdGl2ZV86IGl0IHJldHVybnMgYSBjb3B5IG9mXG4gKiB0aGUgbGlzdCB3aXRoIHRoZSBjaGFuZ2VzLlxuICogPHNtYWxsPk5vIGxpc3RzIGhhdmUgYmVlbiBoYXJtZWQgaW4gdGhlIGFwcGxpY2F0aW9uIG9mIHRoaXMgZnVuY3Rpb24uPC9zbWFsbD5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yLjJcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0IFRoZSBwb3NpdGlvbiB0byBzdGFydCByZW1vdmluZyBlbGVtZW50c1xuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVtb3ZlXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIHJlbW92ZSBmcm9tXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgQXJyYXkgd2l0aCBgY291bnRgIGVsZW1lbnRzIGZyb20gYHN0YXJ0YCByZW1vdmVkLlxuICogQHNlZSBSLndpdGhvdXRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnJlbW92ZSgyLCAzLCBbMSwyLDMsNCw1LDYsNyw4XSk7IC8vPT4gWzEsMiw2LDcsOF1cbiAqL1xudmFyIHJlbW92ZSA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIHJlbW92ZShzdGFydCwgY291bnQsIGxpc3QpIHtcbiAgdmFyIHJlc3VsdCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIDApO1xuICByZXN1bHQuc3BsaWNlKHN0YXJ0LCBjb3VudCk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHJlbW92ZTsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX2lzU3RyaW5nIGZyb20gXCIuL2ludGVybmFsL19pc1N0cmluZy5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBvciBzdHJpbmcgd2l0aCB0aGUgZWxlbWVudHMgb3IgY2hhcmFjdGVycyBpbiByZXZlcnNlXG4gKiBvcmRlci5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYV1cbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IGxpc3RcbiAqIEByZXR1cm4ge0FycmF5fFN0cmluZ31cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnJldmVyc2UoWzEsIDIsIDNdKTsgIC8vPT4gWzMsIDIsIDFdXG4gKiAgICAgIFIucmV2ZXJzZShbMSwgMl0pOyAgICAgLy89PiBbMiwgMV1cbiAqICAgICAgUi5yZXZlcnNlKFsxXSk7ICAgICAgICAvLz0+IFsxXVxuICogICAgICBSLnJldmVyc2UoW10pOyAgICAgICAgIC8vPT4gW11cbiAqXG4gKiAgICAgIFIucmV2ZXJzZSgnYWJjJyk7ICAgICAgLy89PiAnY2JhJ1xuICogICAgICBSLnJldmVyc2UoJ2FiJyk7ICAgICAgIC8vPT4gJ2JhJ1xuICogICAgICBSLnJldmVyc2UoJ2EnKTsgICAgICAgIC8vPT4gJ2EnXG4gKiAgICAgIFIucmV2ZXJzZSgnJyk7ICAgICAgICAgLy89PiAnJ1xuICovXG52YXIgcmV2ZXJzZSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIHJldmVyc2UobGlzdCkge1xuICByZXR1cm4gX2lzU3RyaW5nKGxpc3QpID8gbGlzdC5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpIDogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCwgMCkucmV2ZXJzZSgpO1xufSk7XG5leHBvcnQgZGVmYXVsdCByZXZlcnNlOyIsImltcG9ydCBfY3VycnkzIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTMuanNcIjtcbmltcG9ydCBhbHdheXMgZnJvbSBcIi4vYWx3YXlzLmpzXCI7XG5pbXBvcnQgb3ZlciBmcm9tIFwiLi9vdmVyLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIFwic2V0dGluZ1wiIHRoZSBwb3J0aW9uIG9mIHRoZSBnaXZlbiBkYXRhIHN0cnVjdHVyZVxuICogZm9jdXNlZCBieSB0aGUgZ2l2ZW4gbGVucyB0byB0aGUgZ2l2ZW4gdmFsdWUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTYuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgTGVucyBzIGEgLT4gYSAtPiBzIC0+IHNcbiAqIEBwYXJhbSB7TGVuc30gbGVuc1xuICogQHBhcmFtIHsqfSB2XG4gKiBAcGFyYW0geyp9IHhcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIudmlldywgUi5vdmVyLCBSLmxlbnMsIFIubGVuc0luZGV4LCBSLmxlbnNQcm9wLCBSLmxlbnNQYXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgY29uc3QgeExlbnMgPSBSLmxlbnNQcm9wKCd4Jyk7XG4gKlxuICogICAgICBSLnNldCh4TGVucywgNCwge3g6IDEsIHk6IDJ9KTsgIC8vPT4ge3g6IDQsIHk6IDJ9XG4gKiAgICAgIFIuc2V0KHhMZW5zLCA4LCB7eDogMSwgeTogMn0pOyAgLy89PiB7eDogOCwgeTogMn1cbiAqL1xudmFyIHNldCA9IC8qI19fUFVSRV9fKi9fY3VycnkzKGZ1bmN0aW9uIHNldChsZW5zLCB2LCB4KSB7XG4gIHJldHVybiBvdmVyKGxlbnMsIGFsd2F5cyh2KSwgeCk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHNldDsiLCJpbXBvcnQgX2NoZWNrRm9yTWV0aG9kIGZyb20gXCIuL2ludGVybmFsL19jaGVja0Zvck1ldGhvZC5qc1wiO1xuaW1wb3J0IF9jdXJyeTMgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5My5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBsaXN0IG9yIHN0cmluZyAob3Igb2JqZWN0IHdpdGggYSBgc2xpY2VgXG4gKiBtZXRob2QpIGZyb20gYGZyb21JbmRleGAgKGluY2x1c2l2ZSkgdG8gYHRvSW5kZXhgIChleGNsdXNpdmUpLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBzbGljZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjRcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBmcm9tSW5kZXggVGhlIHN0YXJ0IGluZGV4IChpbmNsdXNpdmUpLlxuICogQHBhcmFtIHtOdW1iZXJ9IHRvSW5kZXggVGhlIGVuZCBpbmRleCAoZXhjbHVzaXZlKS5cbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnNsaWNlKDEsIDMsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAgIC8vPT4gWydiJywgJ2MnXVxuICogICAgICBSLnNsaWNlKDEsIEluZmluaXR5LCBbJ2EnLCAnYicsICdjJywgJ2QnXSk7IC8vPT4gWydiJywgJ2MnLCAnZCddXG4gKiAgICAgIFIuc2xpY2UoMCwgLTEsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAgLy89PiBbJ2EnLCAnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgtMywgLTEsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAvLz0+IFsnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgwLCAzLCAncmFtZGEnKTsgICAgICAgICAgICAgICAgICAgICAvLz0+ICdyYW0nXG4gKi9cbnZhciBzbGljZSA9IC8qI19fUFVSRV9fKi9fY3VycnkzKCAvKiNfX1BVUkVfXyovX2NoZWNrRm9yTWV0aG9kKCdzbGljZScsIGZ1bmN0aW9uIHNsaWNlKGZyb21JbmRleCwgdG9JbmRleCwgbGlzdCkge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCwgZnJvbUluZGV4LCB0b0luZGV4KTtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IHNsaWNlOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgbGlzdCwgc29ydGVkIGFjY29yZGluZyB0byB0aGUgY29tcGFyYXRvciBmdW5jdGlvbixcbiAqIHdoaWNoIHNob3VsZCBhY2NlcHQgdHdvIHZhbHVlcyBhdCBhIHRpbWUgYW5kIHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGVcbiAqIGZpcnN0IHZhbHVlIGlzIHNtYWxsZXIsIGEgcG9zaXRpdmUgbnVtYmVyIGlmIGl0J3MgbGFyZ2VyLCBhbmQgemVybyBpZiB0aGV5XG4gKiBhcmUgZXF1YWwuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBpcyBhICoqY29weSoqIG9mIHRoZSBsaXN0LiBJdCBkb2VzIG5vdFxuICogbW9kaWZ5IHRoZSBvcmlnaW5hbC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYSwgYSkgLT4gTnVtYmVyKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIEEgc29ydGluZyBmdW5jdGlvbiA6OiBhIC0+IGIgLT4gSW50XG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIHNvcnRcbiAqIEByZXR1cm4ge0FycmF5fSBhIG5ldyBhcnJheSB3aXRoIGl0cyBlbGVtZW50cyBzb3J0ZWQgYnkgdGhlIGNvbXBhcmF0b3IgZnVuY3Rpb24uXG4gKiBAc2VlIFIuYXNjZW5kLCBSLmRlc2NlbmRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBjb25zdCBkaWZmID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gYSAtIGI7IH07XG4gKiAgICAgIFIuc29ydChkaWZmLCBbNCwyLDcsNV0pOyAvLz0+IFsyLCA0LCA1LCA3XVxuICovXG52YXIgc29ydCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHNvcnQoY29tcGFyYXRvciwgbGlzdCkge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCwgMCkuc29ydChjb21wYXJhdG9yKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgc29ydDsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5pbXBvcnQgZXF1YWxzIGZyb20gXCIuL2VxdWFscy5qc1wiO1xuaW1wb3J0IHRha2UgZnJvbSBcIi4vdGFrZS5qc1wiO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGxpc3Qgc3RhcnRzIHdpdGggdGhlIHByb3ZpZGVkIHN1Ymxpc3QuXG4gKlxuICogU2ltaWxhcmx5LCBjaGVja3MgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIHByb3ZpZGVkIHN1YnN0cmluZy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yNC4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2FdIC0+IEJvb2xlYW5cbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZyAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IHByZWZpeFxuICogQHBhcmFtIHsqfSBsaXN0XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHNlZSBSLmVuZHNXaXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5zdGFydHNXaXRoKCdhJywgJ2FiYycpICAgICAgICAgICAgICAgIC8vPT4gdHJ1ZVxuICogICAgICBSLnN0YXJ0c1dpdGgoJ2InLCAnYWJjJykgICAgICAgICAgICAgICAgLy89PiBmYWxzZVxuICogICAgICBSLnN0YXJ0c1dpdGgoWydhJ10sIFsnYScsICdiJywgJ2MnXSkgICAgLy89PiB0cnVlXG4gKiAgICAgIFIuc3RhcnRzV2l0aChbJ2InXSwgWydhJywgJ2InLCAnYyddKSAgICAvLz0+IGZhbHNlXG4gKi9cbnZhciBzdGFydHNXaXRoID0gLyojX19QVVJFX18qL19jdXJyeTIoZnVuY3Rpb24gKHByZWZpeCwgbGlzdCkge1xuICByZXR1cm4gZXF1YWxzKHRha2UocHJlZml4Lmxlbmd0aCwgbGlzdCksIHByZWZpeCk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0c1dpdGg7IiwiaW1wb3J0IF9jdXJyeTIgZnJvbSBcIi4vaW50ZXJuYWwvX2N1cnJ5Mi5qc1wiO1xuaW1wb3J0IF9kaXNwYXRjaGFibGUgZnJvbSBcIi4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qc1wiO1xuaW1wb3J0IF94dGFrZSBmcm9tIFwiLi9pbnRlcm5hbC9feHRha2UuanNcIjtcbmltcG9ydCBzbGljZSBmcm9tIFwiLi9zbGljZS5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGBuYCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gbGlzdCwgc3RyaW5nLCBvclxuICogdHJhbnNkdWNlci90cmFuc2Zvcm1lciAob3Igb2JqZWN0IHdpdGggYSBgdGFrZWAgbWV0aG9kKS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgdGFrZWAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHNpZyBOdW1iZXIgLT4gU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5kcm9wXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50YWtlKDEsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nXVxuICogICAgICBSLnRha2UoMiwgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbJ2ZvbycsICdiYXInXVxuICogICAgICBSLnRha2UoMywgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbJ2ZvbycsICdiYXInLCAnYmF6J11cbiAqICAgICAgUi50YWtlKDQsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nLCAnYmFyJywgJ2JheiddXG4gKiAgICAgIFIudGFrZSgzLCAncmFtZGEnKTsgICAgICAgICAgICAgICAvLz0+ICdyYW0nXG4gKlxuICogICAgICBjb25zdCBwZXJzb25uZWwgPSBbXG4gKiAgICAgICAgJ0RhdmUgQnJ1YmVjaycsXG4gKiAgICAgICAgJ1BhdWwgRGVzbW9uZCcsXG4gKiAgICAgICAgJ0V1Z2VuZSBXcmlnaHQnLFxuICogICAgICAgICdKb2UgTW9yZWxsbycsXG4gKiAgICAgICAgJ0dlcnJ5IE11bGxpZ2FuJyxcbiAqICAgICAgICAnQm9iIEJhdGVzJyxcbiAqICAgICAgICAnSm9lIERvZGdlJyxcbiAqICAgICAgICAnUm9uIENyb3R0eSdcbiAqICAgICAgXTtcbiAqXG4gKiAgICAgIGNvbnN0IHRha2VGaXZlID0gUi50YWtlKDUpO1xuICogICAgICB0YWtlRml2ZShwZXJzb25uZWwpO1xuICogICAgICAvLz0+IFsnRGF2ZSBCcnViZWNrJywgJ1BhdWwgRGVzbW9uZCcsICdFdWdlbmUgV3JpZ2h0JywgJ0pvZSBNb3JlbGxvJywgJ0dlcnJ5IE11bGxpZ2FuJ11cbiAqIEBzeW1iIFIudGFrZSgtMSwgW2EsIGJdKSA9IFthLCBiXVxuICogQHN5bWIgUi50YWtlKDAsIFthLCBiXSkgPSBbXVxuICogQHN5bWIgUi50YWtlKDEsIFthLCBiXSkgPSBbYV1cbiAqIEBzeW1iIFIudGFrZSgyLCBbYSwgYl0pID0gW2EsIGJdXG4gKi9cbnZhciB0YWtlID0gLyojX19QVVJFX18qL19jdXJyeTIoIC8qI19fUFVSRV9fKi9fZGlzcGF0Y2hhYmxlKFsndGFrZSddLCBfeHRha2UsIGZ1bmN0aW9uIHRha2UobiwgeHMpIHtcbiAgcmV0dXJuIHNsaWNlKDAsIG4gPCAwID8gSW5maW5pdHkgOiBuLCB4cyk7XG59KSk7XG5leHBvcnQgZGVmYXVsdCB0YWtlOyIsImltcG9ydCBfY3VycnkxIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTEuanNcIjtcbmltcG9ydCBfaGFzIGZyb20gXCIuL2ludGVybmFsL19oYXMuanNcIjtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3QgaW50byBhbiBhcnJheSBvZiBrZXksIHZhbHVlIGFycmF5cy4gT25seSB0aGUgb2JqZWN0J3NcbiAqIG93biBwcm9wZXJ0aWVzIGFyZSB1c2VkLlxuICogTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0IGFycmF5IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnRcbiAqIGFjcm9zcyBkaWZmZXJlbnQgSlMgcGxhdGZvcm1zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjQuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7U3RyaW5nOiAqfSAtPiBbW1N0cmluZywqXV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBleHRyYWN0IGZyb21cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBrZXksIHZhbHVlIGFycmF5cyBmcm9tIHRoZSBvYmplY3QncyBvd24gcHJvcGVydGllcy5cbiAqIEBzZWUgUi5mcm9tUGFpcnMsIFIua2V5cywgUi52YWx1ZXNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnRvUGFpcnMoe2E6IDEsIGI6IDIsIGM6IDN9KTsgLy89PiBbWydhJywgMV0sIFsnYicsIDJdLCBbJ2MnLCAzXV1cbiAqL1xudmFyIHRvUGFpcnMgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiB0b1BhaXJzKG9iaikge1xuICB2YXIgcGFpcnMgPSBbXTtcbiAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHtcbiAgICBpZiAoX2hhcyhwcm9wLCBvYmopKSB7XG4gICAgICBwYWlyc1twYWlycy5sZW5ndGhdID0gW3Byb3AsIG9ialtwcm9wXV07XG4gICAgfVxuICB9XG4gIHJldHVybiBwYWlycztcbn0pO1xuZXhwb3J0IGRlZmF1bHQgdG9QYWlyczsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQgX3RvU3RyaW5nIGZyb20gXCIuL2ludGVybmFsL190b1N0cmluZy5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdmFsdWUuIGBldmFsYCdpbmcgdGhlIG91dHB1dFxuICogc2hvdWxkIHJlc3VsdCBpbiBhIHZhbHVlIGVxdWl2YWxlbnQgdG8gdGhlIGlucHV0IHZhbHVlLiBNYW55IG9mIHRoZSBidWlsdC1pblxuICogYHRvU3RyaW5nYCBtZXRob2RzIGRvIG5vdCBzYXRpc2Z5IHRoaXMgcmVxdWlyZW1lbnQuXG4gKlxuICogSWYgdGhlIGdpdmVuIHZhbHVlIGlzIGFuIGBbb2JqZWN0IE9iamVjdF1gIHdpdGggYSBgdG9TdHJpbmdgIG1ldGhvZCBvdGhlclxuICogdGhhbiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AsIHRoaXMgbWV0aG9kIGlzIGludm9rZWQgd2l0aCBubyBhcmd1bWVudHNcbiAqIHRvIHByb2R1Y2UgdGhlIHJldHVybiB2YWx1ZS4gVGhpcyBtZWFucyB1c2VyLWRlZmluZWQgY29uc3RydWN0b3IgZnVuY3Rpb25zXG4gKiBjYW4gcHJvdmlkZSBhIHN1aXRhYmxlIGB0b1N0cmluZ2AgbWV0aG9kLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgZnVuY3Rpb24gUG9pbnQoeCwgeSkge1xuICogICAgICAgdGhpcy54ID0geDtcbiAqICAgICAgIHRoaXMueSA9IHk7XG4gKiAgICAgfVxuICpcbiAqICAgICBQb2ludC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAqICAgICAgIHJldHVybiAnbmV3IFBvaW50KCcgKyB0aGlzLnggKyAnLCAnICsgdGhpcy55ICsgJyknO1xuICogICAgIH07XG4gKlxuICogICAgIFIudG9TdHJpbmcobmV3IFBvaW50KDEsIDIpKTsgLy89PiAnbmV3IFBvaW50KDEsIDIpJ1xuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE0LjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBzaWcgKiAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50b1N0cmluZyg0Mik7IC8vPT4gJzQyJ1xuICogICAgICBSLnRvU3RyaW5nKCdhYmMnKTsgLy89PiAnXCJhYmNcIidcbiAqICAgICAgUi50b1N0cmluZyhbMSwgMiwgM10pOyAvLz0+ICdbMSwgMiwgM10nXG4gKiAgICAgIFIudG9TdHJpbmcoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9KTsgLy89PiAne1wiYmFyXCI6IDIsIFwiYmF6XCI6IDMsIFwiZm9vXCI6IDF9J1xuICogICAgICBSLnRvU3RyaW5nKG5ldyBEYXRlKCcyMDAxLTAyLTAzVDA0OjA1OjA2WicpKTsgLy89PiAnbmV3IERhdGUoXCIyMDAxLTAyLTAzVDA0OjA1OjA2LjAwMFpcIiknXG4gKi9cbnZhciB0b1N0cmluZyA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIHRvU3RyaW5nKHZhbCkge1xuICByZXR1cm4gX3RvU3RyaW5nKHZhbCwgW10pO1xufSk7XG5leHBvcnQgZGVmYXVsdCB0b1N0cmluZzsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5cbi8qKlxuICogR2l2ZXMgYSBzaW5nbGUtd29yZCBzdHJpbmcgZGVzY3JpcHRpb24gb2YgdGhlIChuYXRpdmUpIHR5cGUgb2YgYSB2YWx1ZSxcbiAqIHJldHVybmluZyBzdWNoIGFuc3dlcnMgYXMgJ09iamVjdCcsICdOdW1iZXInLCAnQXJyYXknLCBvciAnTnVsbCcuIERvZXMgbm90XG4gKiBhdHRlbXB0IHRvIGRpc3Rpbmd1aXNoIHVzZXIgT2JqZWN0IHR5cGVzIGFueSBmdXJ0aGVyLCByZXBvcnRpbmcgdGhlbSBhbGwgYXNcbiAqICdPYmplY3QnLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjguMFxuICogQGNhdGVnb3J5IFR5cGVcbiAqIEBzaWcgKiAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50eXBlKHt9KTsgLy89PiBcIk9iamVjdFwiXG4gKiAgICAgIFIudHlwZSgxKTsgLy89PiBcIk51bWJlclwiXG4gKiAgICAgIFIudHlwZShmYWxzZSk7IC8vPT4gXCJCb29sZWFuXCJcbiAqICAgICAgUi50eXBlKCdzJyk7IC8vPT4gXCJTdHJpbmdcIlxuICogICAgICBSLnR5cGUobnVsbCk7IC8vPT4gXCJOdWxsXCJcbiAqICAgICAgUi50eXBlKFtdKTsgLy89PiBcIkFycmF5XCJcbiAqICAgICAgUi50eXBlKC9bQS16XS8pOyAvLz0+IFwiUmVnRXhwXCJcbiAqICAgICAgUi50eXBlKCgpID0+IHt9KTsgLy89PiBcIkZ1bmN0aW9uXCJcbiAqICAgICAgUi50eXBlKGFzeW5jICgpID0+IHt9KTsgLy89PiBcIkFzeW5jRnVuY3Rpb25cIlxuICogICAgICBSLnR5cGUodW5kZWZpbmVkKTsgLy89PiBcIlVuZGVmaW5lZFwiXG4gKiAgICAgIFIudHlwZShCaWdJbnQoMTIzKSk7IC8vPT4gXCJCaWdJbnRcIlxuICovXG52YXIgdHlwZSA9IC8qI19fUFVSRV9fKi9fY3VycnkxKGZ1bmN0aW9uIHR5cGUodmFsKSB7XG4gIHJldHVybiB2YWwgPT09IG51bGwgPyAnTnVsbCcgOiB2YWwgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkuc2xpY2UoOCwgLTEpO1xufSk7XG5leHBvcnQgZGVmYXVsdCB0eXBlOyIsImltcG9ydCBpZGVudGl0eSBmcm9tIFwiLi9pZGVudGl0eS5qc1wiO1xuaW1wb3J0IHVuaXFCeSBmcm9tIFwiLi91bmlxQnkuanNcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyBvbmx5IG9uZSBjb3B5IG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAqIGxpc3QuIFtgUi5lcXVhbHNgXSgjZXF1YWxzKSBpcyB1c2VkIHRvIGRldGVybWluZSBlcXVhbGl0eS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIHVuaXF1ZSBpdGVtcy5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnVuaXEoWzEsIDEsIDIsIDFdKTsgLy89PiBbMSwgMl1cbiAqICAgICAgUi51bmlxKFsxLCAnMSddKTsgICAgIC8vPT4gWzEsICcxJ11cbiAqICAgICAgUi51bmlxKFtbNDJdLCBbNDJdXSk7IC8vPT4gW1s0Ml1dXG4gKi9cbnZhciB1bmlxID0gLyojX19QVVJFX18qL3VuaXFCeShpZGVudGl0eSk7XG5leHBvcnQgZGVmYXVsdCB1bmlxOyIsImltcG9ydCBfU2V0IGZyb20gXCIuL2ludGVybmFsL19TZXQuanNcIjtcbmltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcbmltcG9ydCBfZGlzcGF0Y2hhYmxlIGZyb20gXCIuL2ludGVybmFsL19kaXNwYXRjaGFibGUuanNcIjtcbmltcG9ydCBfeHVuaXFCeSBmcm9tIFwiLi9pbnRlcm5hbC9feHVuaXFCeS5qc1wiO1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIG9ubHkgb25lIGNvcHkgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBvcmlnaW5hbFxuICogbGlzdCwgYmFzZWQgdXBvbiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgYXBwbHlpbmcgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIHRvXG4gKiBlYWNoIGxpc3QgZWxlbWVudC4gUHJlZmVycyB0aGUgZmlyc3QgaXRlbSBpZiB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gcHJvZHVjZXNcbiAqIHRoZSBzYW1lIHZhbHVlIG9uIHR3byBpdGVtcy4gW2BSLmVxdWFsc2BdKCNlcXVhbHMpIGlzIHVzZWQgZm9yIGNvbXBhcmlzb24uXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IGIpIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEEgZnVuY3Rpb24gdXNlZCB0byBwcm9kdWNlIGEgdmFsdWUgdG8gdXNlIGR1cmluZyBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIHVuaXF1ZSBpdGVtcy5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnVuaXFCeShNYXRoLmFicywgWy0xLCAtNSwgMiwgMTAsIDEsIDJdKTsgLy89PiBbLTEsIC01LCAyLCAxMF1cbiAqL1xudmFyIHVuaXFCeSA9IC8qI19fUFVSRV9fKi9fY3VycnkyKCAvKiNfX1BVUkVfXyovX2Rpc3BhdGNoYWJsZShbXSwgX3h1bmlxQnksIGZ1bmN0aW9uIChmbiwgbGlzdCkge1xuICB2YXIgc2V0ID0gbmV3IF9TZXQoKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGFwcGxpZWRJdGVtLCBpdGVtO1xuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpdGVtID0gbGlzdFtpZHhdO1xuICAgIGFwcGxpZWRJdGVtID0gZm4oaXRlbSk7XG4gICAgaWYgKHNldC5hZGQoYXBwbGllZEl0ZW0pKSB7XG4gICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pKTtcbmV4cG9ydCBkZWZhdWx0IHVuaXFCeTsiLCJpbXBvcnQgX2N1cnJ5MSBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkxLmpzXCI7XG5pbXBvcnQga2V5cyBmcm9tIFwiLi9rZXlzLmpzXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBzdXBwbGllZCBvYmplY3QuXG4gKiBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBvdXRwdXQgYXJyYXkgaXMgbm90IGd1YXJhbnRlZWQgYWNyb3NzIGRpZmZlcmVudFxuICogSlMgcGxhdGZvcm1zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7azogdn0gLT4gW3ZdXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gZXh0cmFjdCB2YWx1ZXMgZnJvbVxuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHRoZSB2YWx1ZXMgb2YgdGhlIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzLlxuICogQHNlZSBSLnZhbHVlc0luLCBSLmtleXMsIFIudG9QYWlyc1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudmFsdWVzKHthOiAxLCBiOiAyLCBjOiAzfSk7IC8vPT4gWzEsIDIsIDNdXG4gKi9cbnZhciB2YWx1ZXMgPSAvKiNfX1BVUkVfXyovX2N1cnJ5MShmdW5jdGlvbiB2YWx1ZXMob2JqKSB7XG4gIHZhciBwcm9wcyA9IGtleXMob2JqKTtcbiAgdmFyIGxlbiA9IHByb3BzLmxlbmd0aDtcbiAgdmFyIHZhbHMgPSBbXTtcbiAgdmFyIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICB2YWxzW2lkeF0gPSBvYmpbcHJvcHNbaWR4XV07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHZhbHM7XG59KTtcbmV4cG9ydCBkZWZhdWx0IHZhbHVlczsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8vIGBDb25zdGAgaXMgYSBmdW5jdG9yIHRoYXQgZWZmZWN0aXZlbHkgaWdub3JlcyB0aGUgZnVuY3Rpb24gZ2l2ZW4gdG8gYG1hcGAuXG52YXIgQ29uc3QgPSBmdW5jdGlvbiAoeCkge1xuICByZXR1cm4ge1xuICAgIHZhbHVlOiB4LFxuICAgICdmYW50YXN5LWxhbmQvbWFwJzogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgXCJ2aWV3XCIgb2YgdGhlIGdpdmVuIGRhdGEgc3RydWN0dXJlLCBkZXRlcm1pbmVkIGJ5IHRoZSBnaXZlbiBsZW5zLlxuICogVGhlIGxlbnMncyBmb2N1cyBkZXRlcm1pbmVzIHdoaWNoIHBvcnRpb24gb2YgdGhlIGRhdGEgc3RydWN0dXJlIGlzIHZpc2libGUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTYuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgTGVucyBzIGEgLT4gcyAtPiBhXG4gKiBAcGFyYW0ge0xlbnN9IGxlbnNcbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5zZXQsIFIub3ZlciwgUi5sZW5zLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcCwgUi5sZW5zUGF0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGNvbnN0IHhMZW5zID0gUi5sZW5zUHJvcCgneCcpO1xuICpcbiAqICAgICAgUi52aWV3KHhMZW5zLCB7eDogMSwgeTogMn0pOyAgLy89PiAxXG4gKiAgICAgIFIudmlldyh4TGVucywge3g6IDQsIHk6IDJ9KTsgIC8vPT4gNFxuICovXG52YXIgdmlldyA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHZpZXcobGVucywgeCkge1xuICAvLyBVc2luZyBgQ29uc3RgIGVmZmVjdGl2ZWx5IGlnbm9yZXMgdGhlIHNldHRlciBmdW5jdGlvbiBvZiB0aGUgYGxlbnNgLFxuICAvLyBsZWF2aW5nIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgZ2V0dGVyIGZ1bmN0aW9uIHVubW9kaWZpZWQuXG4gIHJldHVybiBsZW5zKENvbnN0KSh4KS52YWx1ZTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgdmlldzsiLCJpbXBvcnQgX2N1cnJ5MiBmcm9tIFwiLi9pbnRlcm5hbC9fY3VycnkyLmpzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBsaXN0IG91dCBvZiB0aGUgdHdvIHN1cHBsaWVkIGJ5IHBhaXJpbmcgdXAgZXF1YWxseS1wb3NpdGlvbmVkXG4gKiBpdGVtcyBmcm9tIGJvdGggbGlzdHMuIFRoZSByZXR1cm5lZCBsaXN0IGlzIHRydW5jYXRlZCB0byB0aGUgbGVuZ3RoIG9mIHRoZVxuICogc2hvcnRlciBvZiB0aGUgdHdvIGlucHV0IGxpc3RzLlxuICogTm90ZTogYHppcGAgaXMgZXF1aXZhbGVudCB0byBgemlwV2l0aChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBbYSwgYl0gfSlgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFtiXSAtPiBbW2EsYl1dXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MSBUaGUgZmlyc3QgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MiBUaGUgc2Vjb25kIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG1hZGUgYnkgcGFpcmluZyB1cCBzYW1lLWluZGV4ZWQgZWxlbWVudHMgb2YgYGxpc3QxYCBhbmQgYGxpc3QyYC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnppcChbMSwgMiwgM10sIFsnYScsICdiJywgJ2MnXSk7IC8vPT4gW1sxLCAnYSddLCBbMiwgJ2InXSwgWzMsICdjJ11dXG4gKiBAc3ltYiBSLnppcChbYSwgYiwgY10sIFtkLCBlLCBmXSkgPSBbW2EsIGRdLCBbYiwgZV0sIFtjLCBmXV1cbiAqL1xudmFyIHppcCA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHppcChhLCBiKSB7XG4gIHZhciBsZW4gPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICB2YXIgcnYgPSBBcnJheShsZW4pO1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIHJ2W2lkeF0gPSBbYVtpZHhdLCBiW2lkeF1dO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBydjtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgemlwOyIsImltcG9ydCBfY3VycnkyIGZyb20gXCIuL2ludGVybmFsL19jdXJyeTIuanNcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG9iamVjdCBvdXQgb2YgYSBsaXN0IG9mIGtleXMgYW5kIGEgbGlzdCBvZiB2YWx1ZXMuXG4gKiBLZXkvdmFsdWUgcGFpcmluZyBpcyB0cnVuY2F0ZWQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlciBvZiB0aGUgdHdvIGxpc3RzLlxuICogTm90ZTogYHppcE9iamAgaXMgZXF1aXZhbGVudCB0byBgcGlwZSh6aXAsIGZyb21QYWlycylgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW1N0cmluZ10gLT4gWypdIC0+IHtTdHJpbmc6ICp9XG4gKiBAcGFyYW0ge0FycmF5fSBrZXlzIFRoZSBhcnJheSB0aGF0IHdpbGwgYmUgcHJvcGVydGllcyBvbiB0aGUgb3V0cHV0IG9iamVjdC5cbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgbGlzdCBvZiB2YWx1ZXMgb24gdGhlIG91dHB1dCBvYmplY3QuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBvYmplY3QgbWFkZSBieSBwYWlyaW5nIHVwIHNhbWUtaW5kZXhlZCBlbGVtZW50cyBvZiBga2V5c2AgYW5kIGB2YWx1ZXNgLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuemlwT2JqKFsnYScsICdiJywgJ2MnXSwgWzEsIDIsIDNdKTsgLy89PiB7YTogMSwgYjogMiwgYzogM31cbiAqL1xudmFyIHppcE9iaiA9IC8qI19fUFVSRV9fKi9fY3VycnkyKGZ1bmN0aW9uIHppcE9iaihrZXlzLCB2YWx1ZXMpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBNYXRoLm1pbihrZXlzLmxlbmd0aCwgdmFsdWVzLmxlbmd0aCk7XG4gIHZhciBvdXQgPSB7fTtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIG91dFtrZXlzW2lkeF1dID0gdmFsdWVzW2lkeF07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgemlwT2JqOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMjQsIFRoZSBDeXRvc2NhcGUgQ29uc29ydGl1bS5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mXG4gKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSDigJxTb2Z0d2FyZeKAnSksIHRvIGRlYWwgaW5cbiAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG9cbiAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzXG4gKiBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG9cbiAqIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIOKAnEFTIElT4oCdLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gIH0gOiBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgfSwgX3R5cGVvZihvYmopO1xufVxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eSQxKG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7XG4gIHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7XG59XG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG59XG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIHZhciBfaSA9IGFyciA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKF9pID09IG51bGwpIHJldHVybjtcbiAgdmFyIF9hcnIgPSBbXTtcbiAgdmFyIF9uID0gdHJ1ZTtcbiAgdmFyIF9kID0gZmFsc2U7XG4gIHZhciBfcywgX2U7XG4gIHRyeSB7XG4gICAgZm9yIChfaSA9IF9pLmNhbGwoYXJyKTsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gX2Fycjtcbn1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG4gIHJldHVybiBhcnIyO1xufVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7XG4gIHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdO1xuICBpZiAoIWl0KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKGl0KSBvID0gaXQ7XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICB2YXIgRiA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgczogRixcbiAgICAgICAgbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IG9baSsrXVxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIGU6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfSxcbiAgICAgICAgZjogRlxuICAgICAgfTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xuICB9XG4gIHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSxcbiAgICBkaWRFcnIgPSBmYWxzZSxcbiAgICBlcnI7XG4gIHJldHVybiB7XG4gICAgczogZnVuY3Rpb24gKCkge1xuICAgICAgaXQgPSBpdC5jYWxsKG8pO1xuICAgIH0sXG4gICAgbjogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7XG4gICAgICBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lO1xuICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgfSxcbiAgICBlOiBmdW5jdGlvbiAoZSkge1xuICAgICAgZGlkRXJyID0gdHJ1ZTtcbiAgICAgIGVyciA9IGU7XG4gICAgfSxcbiAgICBmOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXQucmV0dXJuICE9IG51bGwpIGl0LnJldHVybigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGRpZEVycikgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxudmFyIF93aW5kb3cgPSB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiB3aW5kb3c7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxudmFyIG5hdmlnYXRvciA9IF93aW5kb3cgPyBfd2luZG93Lm5hdmlnYXRvciA6IG51bGw7XG5fd2luZG93ID8gX3dpbmRvdy5kb2N1bWVudCA6IG51bGw7XG52YXIgdHlwZW9mc3RyID0gX3R5cGVvZignJyk7XG52YXIgdHlwZW9mb2JqID0gX3R5cGVvZih7fSk7XG52YXIgdHlwZW9mZm4gPSBfdHlwZW9mKGZ1bmN0aW9uICgpIHt9KTtcbnZhciB0eXBlb2ZodG1sZWxlID0gdHlwZW9mIEhUTUxFbGVtZW50ID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YoSFRNTEVsZW1lbnQpO1xudmFyIGluc3RhbmNlU3RyID0gZnVuY3Rpb24gaW5zdGFuY2VTdHIob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLmluc3RhbmNlU3RyaW5nICYmIGZuJDYob2JqLmluc3RhbmNlU3RyaW5nKSA/IG9iai5pbnN0YW5jZVN0cmluZygpIDogbnVsbDtcbn07XG5cbnZhciBzdHJpbmcgPSBmdW5jdGlvbiBzdHJpbmcob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiBfdHlwZW9mKG9iaikgPT0gdHlwZW9mc3RyO1xufTtcbnZhciBmbiQ2ID0gZnVuY3Rpb24gZm4ob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiBfdHlwZW9mKG9iaikgPT09IHR5cGVvZmZuO1xufTtcbnZhciBhcnJheSA9IGZ1bmN0aW9uIGFycmF5KG9iaikge1xuICByZXR1cm4gIWVsZW1lbnRPckNvbGxlY3Rpb24ob2JqKSAmJiAoQXJyYXkuaXNBcnJheSA/IEFycmF5LmlzQXJyYXkob2JqKSA6IG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIEFycmF5KTtcbn07XG52YXIgcGxhaW5PYmplY3QgPSBmdW5jdGlvbiBwbGFpbk9iamVjdChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIF90eXBlb2Yob2JqKSA9PT0gdHlwZW9mb2JqICYmICFhcnJheShvYmopICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0O1xufTtcbnZhciBvYmplY3QgPSBmdW5jdGlvbiBvYmplY3Qob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiBfdHlwZW9mKG9iaikgPT09IHR5cGVvZm9iajtcbn07XG52YXIgbnVtYmVyJDEgPSBmdW5jdGlvbiBudW1iZXIob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiBfdHlwZW9mKG9iaikgPT09IF90eXBlb2YoMSkgJiYgIWlzTmFOKG9iaik7XG59O1xudmFyIGludGVnZXIgPSBmdW5jdGlvbiBpbnRlZ2VyKG9iaikge1xuICByZXR1cm4gbnVtYmVyJDEob2JqKSAmJiBNYXRoLmZsb29yKG9iaikgPT09IG9iajtcbn07XG52YXIgaHRtbEVsZW1lbnQgPSBmdW5jdGlvbiBodG1sRWxlbWVudChvYmopIHtcbiAgaWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2ZodG1sZWxlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbCAhPSBvYmogJiYgb2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG4gIH1cbn07XG52YXIgZWxlbWVudE9yQ29sbGVjdGlvbiA9IGZ1bmN0aW9uIGVsZW1lbnRPckNvbGxlY3Rpb24ob2JqKSB7XG4gIHJldHVybiBlbGVtZW50KG9iaikgfHwgY29sbGVjdGlvbihvYmopO1xufTtcbnZhciBlbGVtZW50ID0gZnVuY3Rpb24gZWxlbWVudChvYmopIHtcbiAgcmV0dXJuIGluc3RhbmNlU3RyKG9iaikgPT09ICdjb2xsZWN0aW9uJyAmJiBvYmouX3ByaXZhdGUuc2luZ2xlO1xufTtcbnZhciBjb2xsZWN0aW9uID0gZnVuY3Rpb24gY29sbGVjdGlvbihvYmopIHtcbiAgcmV0dXJuIGluc3RhbmNlU3RyKG9iaikgPT09ICdjb2xsZWN0aW9uJyAmJiAhb2JqLl9wcml2YXRlLnNpbmdsZTtcbn07XG52YXIgY29yZSA9IGZ1bmN0aW9uIGNvcmUob2JqKSB7XG4gIHJldHVybiBpbnN0YW5jZVN0cihvYmopID09PSAnY29yZSc7XG59O1xudmFyIHN0eWxlc2hlZXQgPSBmdW5jdGlvbiBzdHlsZXNoZWV0KG9iaikge1xuICByZXR1cm4gaW5zdGFuY2VTdHIob2JqKSA9PT0gJ3N0eWxlc2hlZXQnO1xufTtcbnZhciBldmVudCA9IGZ1bmN0aW9uIGV2ZW50KG9iaikge1xuICByZXR1cm4gaW5zdGFuY2VTdHIob2JqKSA9PT0gJ2V2ZW50Jztcbn07XG52YXIgZW1wdHlTdHJpbmcgPSBmdW5jdGlvbiBlbXB0eVN0cmluZyhvYmopIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkIHx8IG9iaiA9PT0gbnVsbCkge1xuICAgIC8vIG51bGwgaXMgZW1wdHlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChvYmogPT09ICcnIHx8IG9iai5tYXRjaCgvXlxccyskLykpIHtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gZW1wdHkgc3RyaW5nIGlzIGVtcHR5XG4gIH1cblxuICByZXR1cm4gZmFsc2U7IC8vIG90aGVyd2lzZSwgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3ZlIGdvdFxufTtcbnZhciBkb21FbGVtZW50ID0gZnVuY3Rpb24gZG9tRWxlbWVudChvYmopIHtcbiAgaWYgKHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIHdlJ3JlIG5vdCBpbiBhIGJyb3dzZXIgc28gaXQgZG9lc24ndCBtYXR0ZXJcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG4gIH1cbn07XG52YXIgYm91bmRpbmdCb3ggPSBmdW5jdGlvbiBib3VuZGluZ0JveChvYmopIHtcbiAgcmV0dXJuIHBsYWluT2JqZWN0KG9iaikgJiYgbnVtYmVyJDEob2JqLngxKSAmJiBudW1iZXIkMShvYmoueDIpICYmIG51bWJlciQxKG9iai55MSkgJiYgbnVtYmVyJDEob2JqLnkyKTtcbn07XG52YXIgcHJvbWlzZSA9IGZ1bmN0aW9uIHByb21pc2Uob2JqKSB7XG4gIHJldHVybiBvYmplY3Qob2JqKSAmJiBmbiQ2KG9iai50aGVuKTtcbn07XG52YXIgbXMgPSBmdW5jdGlvbiBtcygpIHtcbiAgcmV0dXJuIG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9tc2llfHRyaWRlbnR8ZWRnZS9pKTtcbn07IC8vIHByb2JhYmx5IGEgYmV0dGVyIHdheSB0byBkZXRlY3QgdGhpcy4uLlxuXG52YXIgbWVtb2l6ZSQxID0gZnVuY3Rpb24gbWVtb2l6ZShmbiwga2V5Rm4pIHtcbiAgaWYgKCFrZXlGbikge1xuICAgIGtleUZuID0gZnVuY3Rpb24ga2V5Rm4oKSB7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICAgIH1cbiAgICAgIHZhciBhcmdzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcmdzLmpvaW4oJyQnKTtcbiAgICB9O1xuICB9XG4gIHZhciBtZW1vaXplZEZuID0gZnVuY3Rpb24gbWVtb2l6ZWRGbigpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIHJldDtcbiAgICB2YXIgayA9IGtleUZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIHZhciBjYWNoZSA9IG1lbW9pemVkRm4uY2FjaGU7XG4gICAgaWYgKCEocmV0ID0gY2FjaGVba10pKSB7XG4gICAgICByZXQgPSBjYWNoZVtrXSA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9O1xuICBtZW1vaXplZEZuLmNhY2hlID0ge307XG4gIHJldHVybiBtZW1vaXplZEZuO1xufTtcblxudmFyIGNhbWVsMmRhc2ggPSBtZW1vaXplJDEoZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbQS1aXSkvZywgZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gJy0nICsgdi50b0xvd2VyQ2FzZSgpO1xuICB9KTtcbn0pO1xudmFyIGRhc2gyY2FtZWwgPSBtZW1vaXplJDEoZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLygtXFx3KS9nLCBmdW5jdGlvbiAodikge1xuICAgIHJldHVybiB2WzFdLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufSk7XG52YXIgcHJlcGVuZENhbWVsID0gbWVtb2l6ZSQxKGZ1bmN0aW9uIChwcmVmaXgsIHN0cikge1xuICByZXR1cm4gcHJlZml4ICsgc3RyWzBdLnRvVXBwZXJDYXNlKCkgKyBzdHIuc3Vic3RyaW5nKDEpO1xufSwgZnVuY3Rpb24gKHByZWZpeCwgc3RyKSB7XG4gIHJldHVybiBwcmVmaXggKyAnJCcgKyBzdHI7XG59KTtcbnZhciBjYXBpdGFsaXplID0gZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHIpIHtcbiAgaWYgKGVtcHR5U3RyaW5nKHN0cikpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc3Vic3RyaW5nKDEpO1xufTtcblxudmFyIG51bWJlciA9ICcoPzpbLStdPyg/Oig/OlxcXFxkK3xcXFxcZCpcXFxcLlxcXFxkKykoPzpbRWVdWystXT9cXFxcZCspPykpJztcbnZhciByZ2JhID0gJ3JnYlthXT9cXFxcKCgnICsgbnVtYmVyICsgJ1slXT8pXFxcXHMqLFxcXFxzKignICsgbnVtYmVyICsgJ1slXT8pXFxcXHMqLFxcXFxzKignICsgbnVtYmVyICsgJ1slXT8pKD86XFxcXHMqLFxcXFxzKignICsgbnVtYmVyICsgJykpP1xcXFwpJztcbnZhciByZ2JhTm9CYWNrUmVmcyA9ICdyZ2JbYV0/XFxcXCgoPzonICsgbnVtYmVyICsgJ1slXT8pXFxcXHMqLFxcXFxzKig/OicgKyBudW1iZXIgKyAnWyVdPylcXFxccyosXFxcXHMqKD86JyArIG51bWJlciArICdbJV0/KSg/OlxcXFxzKixcXFxccyooPzonICsgbnVtYmVyICsgJykpP1xcXFwpJztcbnZhciBoc2xhID0gJ2hzbFthXT9cXFxcKCgnICsgbnVtYmVyICsgJylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIgKyAnWyVdKVxcXFxzKixcXFxccyooJyArIG51bWJlciArICdbJV0pKD86XFxcXHMqLFxcXFxzKignICsgbnVtYmVyICsgJykpP1xcXFwpJztcbnZhciBoc2xhTm9CYWNrUmVmcyA9ICdoc2xbYV0/XFxcXCgoPzonICsgbnVtYmVyICsgJylcXFxccyosXFxcXHMqKD86JyArIG51bWJlciArICdbJV0pXFxcXHMqLFxcXFxzKig/OicgKyBudW1iZXIgKyAnWyVdKSg/OlxcXFxzKixcXFxccyooPzonICsgbnVtYmVyICsgJykpP1xcXFwpJztcbnZhciBoZXgzID0gJ1xcXFwjWzAtOWEtZkEtRl17M30nO1xudmFyIGhleDYgPSAnXFxcXCNbMC05YS1mQS1GXXs2fSc7XG5cbnZhciBhc2NlbmRpbmcgPSBmdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICBpZiAoYSA8IGIpIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSBpZiAoYSA+IGIpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcbnZhciBkZXNjZW5kaW5nID0gZnVuY3Rpb24gZGVzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiAtMSAqIGFzY2VuZGluZyhhLCBiKTtcbn07XG5cbnZhciBleHRlbmQgPSBPYmplY3QuYXNzaWduICE9IG51bGwgPyBPYmplY3QuYXNzaWduLmJpbmQoT2JqZWN0KSA6IGZ1bmN0aW9uICh0Z3QpIHtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBvYmogPSBhcmdzW2ldO1xuICAgIGlmIChvYmogPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGtleXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBrID0ga2V5c1tqXTtcbiAgICAgIHRndFtrXSA9IG9ialtrXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRndDtcbn07XG5cbi8vIGdldCBbciwgZywgYl0gZnJvbSAjYWJjIG9yICNhYWJiY2NcbnZhciBoZXgydHVwbGUgPSBmdW5jdGlvbiBoZXgydHVwbGUoaGV4KSB7XG4gIGlmICghKGhleC5sZW5ndGggPT09IDQgfHwgaGV4Lmxlbmd0aCA9PT0gNykgfHwgaGV4WzBdICE9PSAnIycpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHNob3J0SGV4ID0gaGV4Lmxlbmd0aCA9PT0gNDtcbiAgdmFyIHIsIGcsIGI7XG4gIHZhciBiYXNlID0gMTY7XG4gIGlmIChzaG9ydEhleCkge1xuICAgIHIgPSBwYXJzZUludChoZXhbMV0gKyBoZXhbMV0sIGJhc2UpO1xuICAgIGcgPSBwYXJzZUludChoZXhbMl0gKyBoZXhbMl0sIGJhc2UpO1xuICAgIGIgPSBwYXJzZUludChoZXhbM10gKyBoZXhbM10sIGJhc2UpO1xuICB9IGVsc2Uge1xuICAgIHIgPSBwYXJzZUludChoZXhbMV0gKyBoZXhbMl0sIGJhc2UpO1xuICAgIGcgPSBwYXJzZUludChoZXhbM10gKyBoZXhbNF0sIGJhc2UpO1xuICAgIGIgPSBwYXJzZUludChoZXhbNV0gKyBoZXhbNl0sIGJhc2UpO1xuICB9XG4gIHJldHVybiBbciwgZywgYl07XG59O1xuXG4vLyBnZXQgW3IsIGcsIGIsIGFdIGZyb20gaHNsKDAsIDAsIDApIG9yIGhzbGEoMCwgMCwgMCwgMClcbnZhciBoc2wydHVwbGUgPSBmdW5jdGlvbiBoc2wydHVwbGUoaHNsKSB7XG4gIHZhciByZXQ7XG4gIHZhciBoLCBzLCBsLCBhLCByLCBnLCBiO1xuICBmdW5jdGlvbiBodWUycmdiKHAsIHEsIHQpIHtcbiAgICBpZiAodCA8IDApIHQgKz0gMTtcbiAgICBpZiAodCA+IDEpIHQgLT0gMTtcbiAgICBpZiAodCA8IDEgLyA2KSByZXR1cm4gcCArIChxIC0gcCkgKiA2ICogdDtcbiAgICBpZiAodCA8IDEgLyAyKSByZXR1cm4gcTtcbiAgICBpZiAodCA8IDIgLyAzKSByZXR1cm4gcCArIChxIC0gcCkgKiAoMiAvIDMgLSB0KSAqIDY7XG4gICAgcmV0dXJuIHA7XG4gIH1cbiAgdmFyIG0gPSBuZXcgUmVnRXhwKCdeJyArIGhzbGEgKyAnJCcpLmV4ZWMoaHNsKTtcbiAgaWYgKG0pIHtcbiAgICAvLyBnZXQgaHVlXG4gICAgaCA9IHBhcnNlSW50KG1bMV0pO1xuICAgIGlmIChoIDwgMCkge1xuICAgICAgaCA9ICgzNjAgLSAtMSAqIGggJSAzNjApICUgMzYwO1xuICAgIH0gZWxzZSBpZiAoaCA+IDM2MCkge1xuICAgICAgaCA9IGggJSAzNjA7XG4gICAgfVxuICAgIGggLz0gMzYwOyAvLyBub3JtYWxpc2Ugb24gWzAsIDFdXG5cbiAgICBzID0gcGFyc2VGbG9hdChtWzJdKTtcbiAgICBpZiAocyA8IDAgfHwgcyA+IDEwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gc2F0dXJhdGlvbiBpcyBbMCwgMTAwXVxuICAgIHMgPSBzIC8gMTAwOyAvLyBub3JtYWxpc2Ugb24gWzAsIDFdXG5cbiAgICBsID0gcGFyc2VGbG9hdChtWzNdKTtcbiAgICBpZiAobCA8IDAgfHwgbCA+IDEwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gbGlnaHRuZXNzIGlzIFswLCAxMDBdXG4gICAgbCA9IGwgLyAxMDA7IC8vIG5vcm1hbGlzZSBvbiBbMCwgMV1cblxuICAgIGEgPSBtWzRdO1xuICAgIGlmIChhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGEgPSBwYXJzZUZsb2F0KGEpO1xuICAgICAgaWYgKGEgPCAwIHx8IGEgPiAxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gYWxwaGEgaXMgWzAsIDFdXG4gICAgfVxuXG4gICAgLy8gbm93LCBjb252ZXJ0IHRvIHJnYlxuICAgIC8vIGNvZGUgZnJvbSBodHRwOi8vbWppamFja3Nvbi5jb20vMjAwOC8wMi9yZ2ItdG8taHNsLWFuZC1yZ2ItdG8taHN2LWNvbG9yLW1vZGVsLWNvbnZlcnNpb24tYWxnb3JpdGhtcy1pbi1qYXZhc2NyaXB0XG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgIHIgPSBnID0gYiA9IE1hdGgucm91bmQobCAqIDI1NSk7IC8vIGFjaHJvbWF0aWNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHEgPSBsIDwgMC41ID8gbCAqICgxICsgcykgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgdmFyIHAgPSAyICogbCAtIHE7XG4gICAgICByID0gTWF0aC5yb3VuZCgyNTUgKiBodWUycmdiKHAsIHEsIGggKyAxIC8gMykpO1xuICAgICAgZyA9IE1hdGgucm91bmQoMjU1ICogaHVlMnJnYihwLCBxLCBoKSk7XG4gICAgICBiID0gTWF0aC5yb3VuZCgyNTUgKiBodWUycmdiKHAsIHEsIGggLSAxIC8gMykpO1xuICAgIH1cbiAgICByZXQgPSBbciwgZywgYiwgYV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vIGdldCBbciwgZywgYiwgYV0gZnJvbSByZ2IoMCwgMCwgMCkgb3IgcmdiYSgwLCAwLCAwLCAwKVxudmFyIHJnYjJ0dXBsZSA9IGZ1bmN0aW9uIHJnYjJ0dXBsZShyZ2IpIHtcbiAgdmFyIHJldDtcbiAgdmFyIG0gPSBuZXcgUmVnRXhwKCdeJyArIHJnYmEgKyAnJCcpLmV4ZWMocmdiKTtcbiAgaWYgKG0pIHtcbiAgICByZXQgPSBbXTtcbiAgICB2YXIgaXNQY3QgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8PSAzOyBpKyspIHtcbiAgICAgIHZhciBjaGFubmVsID0gbVtpXTtcbiAgICAgIGlmIChjaGFubmVsW2NoYW5uZWwubGVuZ3RoIC0gMV0gPT09ICclJykge1xuICAgICAgICBpc1BjdFtpXSA9IHRydWU7XG4gICAgICB9XG4gICAgICBjaGFubmVsID0gcGFyc2VGbG9hdChjaGFubmVsKTtcbiAgICAgIGlmIChpc1BjdFtpXSkge1xuICAgICAgICBjaGFubmVsID0gY2hhbm5lbCAvIDEwMCAqIDI1NTsgLy8gbm9ybWFsaXNlIHRvIFswLCAyNTVdXG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFubmVsIDwgMCB8fCBjaGFubmVsID4gMjU1KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gaW52YWxpZCBjaGFubmVsIHZhbHVlXG5cbiAgICAgIHJldC5wdXNoKE1hdGguZmxvb3IoY2hhbm5lbCkpO1xuICAgIH1cbiAgICB2YXIgYXRMZWFzdE9uZUlzUGN0ID0gaXNQY3RbMV0gfHwgaXNQY3RbMl0gfHwgaXNQY3RbM107XG4gICAgdmFyIGFsbEFyZVBjdCA9IGlzUGN0WzFdICYmIGlzUGN0WzJdICYmIGlzUGN0WzNdO1xuICAgIGlmIChhdExlYXN0T25lSXNQY3QgJiYgIWFsbEFyZVBjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gbXVzdCBhbGwgYmUgcGVyY2VudCB2YWx1ZXMgaWYgb25lIGlzXG5cbiAgICB2YXIgYWxwaGEgPSBtWzRdO1xuICAgIGlmIChhbHBoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhbHBoYSA9IHBhcnNlRmxvYXQoYWxwaGEpO1xuICAgICAgaWYgKGFscGhhIDwgMCB8fCBhbHBoYSA+IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBpbnZhbGlkIGFscGhhIHZhbHVlXG5cbiAgICAgIHJldC5wdXNoKGFscGhhKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG52YXIgY29sb3JuYW1lMnR1cGxlID0gZnVuY3Rpb24gY29sb3JuYW1lMnR1cGxlKGNvbG9yKSB7XG4gIHJldHVybiBjb2xvcnNbY29sb3IudG9Mb3dlckNhc2UoKV07XG59O1xudmFyIGNvbG9yMnR1cGxlID0gZnVuY3Rpb24gY29sb3IydHVwbGUoY29sb3IpIHtcbiAgcmV0dXJuIChhcnJheShjb2xvcikgPyBjb2xvciA6IG51bGwpIHx8IGNvbG9ybmFtZTJ0dXBsZShjb2xvcikgfHwgaGV4MnR1cGxlKGNvbG9yKSB8fCByZ2IydHVwbGUoY29sb3IpIHx8IGhzbDJ0dXBsZShjb2xvcik7XG59O1xudmFyIGNvbG9ycyA9IHtcbiAgLy8gc3BlY2lhbCBjb2xvdXIgbmFtZXNcbiAgdHJhbnNwYXJlbnQ6IFswLCAwLCAwLCAwXSxcbiAgLy8gTkIgYWxwaGEgPT09IDBcblxuICAvLyByZWd1bGFyIGNvbG91cnNcbiAgYWxpY2VibHVlOiBbMjQwLCAyNDgsIDI1NV0sXG4gIGFudGlxdWV3aGl0ZTogWzI1MCwgMjM1LCAyMTVdLFxuICBhcXVhOiBbMCwgMjU1LCAyNTVdLFxuICBhcXVhbWFyaW5lOiBbMTI3LCAyNTUsIDIxMl0sXG4gIGF6dXJlOiBbMjQwLCAyNTUsIDI1NV0sXG4gIGJlaWdlOiBbMjQ1LCAyNDUsIDIyMF0sXG4gIGJpc3F1ZTogWzI1NSwgMjI4LCAxOTZdLFxuICBibGFjazogWzAsIDAsIDBdLFxuICBibGFuY2hlZGFsbW9uZDogWzI1NSwgMjM1LCAyMDVdLFxuICBibHVlOiBbMCwgMCwgMjU1XSxcbiAgYmx1ZXZpb2xldDogWzEzOCwgNDMsIDIyNl0sXG4gIGJyb3duOiBbMTY1LCA0MiwgNDJdLFxuICBidXJseXdvb2Q6IFsyMjIsIDE4NCwgMTM1XSxcbiAgY2FkZXRibHVlOiBbOTUsIDE1OCwgMTYwXSxcbiAgY2hhcnRyZXVzZTogWzEyNywgMjU1LCAwXSxcbiAgY2hvY29sYXRlOiBbMjEwLCAxMDUsIDMwXSxcbiAgY29yYWw6IFsyNTUsIDEyNywgODBdLFxuICBjb3JuZmxvd2VyYmx1ZTogWzEwMCwgMTQ5LCAyMzddLFxuICBjb3Juc2lsazogWzI1NSwgMjQ4LCAyMjBdLFxuICBjcmltc29uOiBbMjIwLCAyMCwgNjBdLFxuICBjeWFuOiBbMCwgMjU1LCAyNTVdLFxuICBkYXJrYmx1ZTogWzAsIDAsIDEzOV0sXG4gIGRhcmtjeWFuOiBbMCwgMTM5LCAxMzldLFxuICBkYXJrZ29sZGVucm9kOiBbMTg0LCAxMzQsIDExXSxcbiAgZGFya2dyYXk6IFsxNjksIDE2OSwgMTY5XSxcbiAgZGFya2dyZWVuOiBbMCwgMTAwLCAwXSxcbiAgZGFya2dyZXk6IFsxNjksIDE2OSwgMTY5XSxcbiAgZGFya2toYWtpOiBbMTg5LCAxODMsIDEwN10sXG4gIGRhcmttYWdlbnRhOiBbMTM5LCAwLCAxMzldLFxuICBkYXJrb2xpdmVncmVlbjogWzg1LCAxMDcsIDQ3XSxcbiAgZGFya29yYW5nZTogWzI1NSwgMTQwLCAwXSxcbiAgZGFya29yY2hpZDogWzE1MywgNTAsIDIwNF0sXG4gIGRhcmtyZWQ6IFsxMzksIDAsIDBdLFxuICBkYXJrc2FsbW9uOiBbMjMzLCAxNTAsIDEyMl0sXG4gIGRhcmtzZWFncmVlbjogWzE0MywgMTg4LCAxNDNdLFxuICBkYXJrc2xhdGVibHVlOiBbNzIsIDYxLCAxMzldLFxuICBkYXJrc2xhdGVncmF5OiBbNDcsIDc5LCA3OV0sXG4gIGRhcmtzbGF0ZWdyZXk6IFs0NywgNzksIDc5XSxcbiAgZGFya3R1cnF1b2lzZTogWzAsIDIwNiwgMjA5XSxcbiAgZGFya3Zpb2xldDogWzE0OCwgMCwgMjExXSxcbiAgZGVlcHBpbms6IFsyNTUsIDIwLCAxNDddLFxuICBkZWVwc2t5Ymx1ZTogWzAsIDE5MSwgMjU1XSxcbiAgZGltZ3JheTogWzEwNSwgMTA1LCAxMDVdLFxuICBkaW1ncmV5OiBbMTA1LCAxMDUsIDEwNV0sXG4gIGRvZGdlcmJsdWU6IFszMCwgMTQ0LCAyNTVdLFxuICBmaXJlYnJpY2s6IFsxNzgsIDM0LCAzNF0sXG4gIGZsb3JhbHdoaXRlOiBbMjU1LCAyNTAsIDI0MF0sXG4gIGZvcmVzdGdyZWVuOiBbMzQsIDEzOSwgMzRdLFxuICBmdWNoc2lhOiBbMjU1LCAwLCAyNTVdLFxuICBnYWluc2Jvcm86IFsyMjAsIDIyMCwgMjIwXSxcbiAgZ2hvc3R3aGl0ZTogWzI0OCwgMjQ4LCAyNTVdLFxuICBnb2xkOiBbMjU1LCAyMTUsIDBdLFxuICBnb2xkZW5yb2Q6IFsyMTgsIDE2NSwgMzJdLFxuICBncmF5OiBbMTI4LCAxMjgsIDEyOF0sXG4gIGdyZXk6IFsxMjgsIDEyOCwgMTI4XSxcbiAgZ3JlZW46IFswLCAxMjgsIDBdLFxuICBncmVlbnllbGxvdzogWzE3MywgMjU1LCA0N10sXG4gIGhvbmV5ZGV3OiBbMjQwLCAyNTUsIDI0MF0sXG4gIGhvdHBpbms6IFsyNTUsIDEwNSwgMTgwXSxcbiAgaW5kaWFucmVkOiBbMjA1LCA5MiwgOTJdLFxuICBpbmRpZ286IFs3NSwgMCwgMTMwXSxcbiAgaXZvcnk6IFsyNTUsIDI1NSwgMjQwXSxcbiAga2hha2k6IFsyNDAsIDIzMCwgMTQwXSxcbiAgbGF2ZW5kZXI6IFsyMzAsIDIzMCwgMjUwXSxcbiAgbGF2ZW5kZXJibHVzaDogWzI1NSwgMjQwLCAyNDVdLFxuICBsYXduZ3JlZW46IFsxMjQsIDI1MiwgMF0sXG4gIGxlbW9uY2hpZmZvbjogWzI1NSwgMjUwLCAyMDVdLFxuICBsaWdodGJsdWU6IFsxNzMsIDIxNiwgMjMwXSxcbiAgbGlnaHRjb3JhbDogWzI0MCwgMTI4LCAxMjhdLFxuICBsaWdodGN5YW46IFsyMjQsIDI1NSwgMjU1XSxcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IFsyNTAsIDI1MCwgMjEwXSxcbiAgbGlnaHRncmF5OiBbMjExLCAyMTEsIDIxMV0sXG4gIGxpZ2h0Z3JlZW46IFsxNDQsIDIzOCwgMTQ0XSxcbiAgbGlnaHRncmV5OiBbMjExLCAyMTEsIDIxMV0sXG4gIGxpZ2h0cGluazogWzI1NSwgMTgyLCAxOTNdLFxuICBsaWdodHNhbG1vbjogWzI1NSwgMTYwLCAxMjJdLFxuICBsaWdodHNlYWdyZWVuOiBbMzIsIDE3OCwgMTcwXSxcbiAgbGlnaHRza3libHVlOiBbMTM1LCAyMDYsIDI1MF0sXG4gIGxpZ2h0c2xhdGVncmF5OiBbMTE5LCAxMzYsIDE1M10sXG4gIGxpZ2h0c2xhdGVncmV5OiBbMTE5LCAxMzYsIDE1M10sXG4gIGxpZ2h0c3RlZWxibHVlOiBbMTc2LCAxOTYsIDIyMl0sXG4gIGxpZ2h0eWVsbG93OiBbMjU1LCAyNTUsIDIyNF0sXG4gIGxpbWU6IFswLCAyNTUsIDBdLFxuICBsaW1lZ3JlZW46IFs1MCwgMjA1LCA1MF0sXG4gIGxpbmVuOiBbMjUwLCAyNDAsIDIzMF0sXG4gIG1hZ2VudGE6IFsyNTUsIDAsIDI1NV0sXG4gIG1hcm9vbjogWzEyOCwgMCwgMF0sXG4gIG1lZGl1bWFxdWFtYXJpbmU6IFsxMDIsIDIwNSwgMTcwXSxcbiAgbWVkaXVtYmx1ZTogWzAsIDAsIDIwNV0sXG4gIG1lZGl1bW9yY2hpZDogWzE4NiwgODUsIDIxMV0sXG4gIG1lZGl1bXB1cnBsZTogWzE0NywgMTEyLCAyMTldLFxuICBtZWRpdW1zZWFncmVlbjogWzYwLCAxNzksIDExM10sXG4gIG1lZGl1bXNsYXRlYmx1ZTogWzEyMywgMTA0LCAyMzhdLFxuICBtZWRpdW1zcHJpbmdncmVlbjogWzAsIDI1MCwgMTU0XSxcbiAgbWVkaXVtdHVycXVvaXNlOiBbNzIsIDIwOSwgMjA0XSxcbiAgbWVkaXVtdmlvbGV0cmVkOiBbMTk5LCAyMSwgMTMzXSxcbiAgbWlkbmlnaHRibHVlOiBbMjUsIDI1LCAxMTJdLFxuICBtaW50Y3JlYW06IFsyNDUsIDI1NSwgMjUwXSxcbiAgbWlzdHlyb3NlOiBbMjU1LCAyMjgsIDIyNV0sXG4gIG1vY2Nhc2luOiBbMjU1LCAyMjgsIDE4MV0sXG4gIG5hdmFqb3doaXRlOiBbMjU1LCAyMjIsIDE3M10sXG4gIG5hdnk6IFswLCAwLCAxMjhdLFxuICBvbGRsYWNlOiBbMjUzLCAyNDUsIDIzMF0sXG4gIG9saXZlOiBbMTI4LCAxMjgsIDBdLFxuICBvbGl2ZWRyYWI6IFsxMDcsIDE0MiwgMzVdLFxuICBvcmFuZ2U6IFsyNTUsIDE2NSwgMF0sXG4gIG9yYW5nZXJlZDogWzI1NSwgNjksIDBdLFxuICBvcmNoaWQ6IFsyMTgsIDExMiwgMjE0XSxcbiAgcGFsZWdvbGRlbnJvZDogWzIzOCwgMjMyLCAxNzBdLFxuICBwYWxlZ3JlZW46IFsxNTIsIDI1MSwgMTUyXSxcbiAgcGFsZXR1cnF1b2lzZTogWzE3NSwgMjM4LCAyMzhdLFxuICBwYWxldmlvbGV0cmVkOiBbMjE5LCAxMTIsIDE0N10sXG4gIHBhcGF5YXdoaXA6IFsyNTUsIDIzOSwgMjEzXSxcbiAgcGVhY2hwdWZmOiBbMjU1LCAyMTgsIDE4NV0sXG4gIHBlcnU6IFsyMDUsIDEzMywgNjNdLFxuICBwaW5rOiBbMjU1LCAxOTIsIDIwM10sXG4gIHBsdW06IFsyMjEsIDE2MCwgMjIxXSxcbiAgcG93ZGVyYmx1ZTogWzE3NiwgMjI0LCAyMzBdLFxuICBwdXJwbGU6IFsxMjgsIDAsIDEyOF0sXG4gIHJlZDogWzI1NSwgMCwgMF0sXG4gIHJvc3licm93bjogWzE4OCwgMTQzLCAxNDNdLFxuICByb3lhbGJsdWU6IFs2NSwgMTA1LCAyMjVdLFxuICBzYWRkbGVicm93bjogWzEzOSwgNjksIDE5XSxcbiAgc2FsbW9uOiBbMjUwLCAxMjgsIDExNF0sXG4gIHNhbmR5YnJvd246IFsyNDQsIDE2NCwgOTZdLFxuICBzZWFncmVlbjogWzQ2LCAxMzksIDg3XSxcbiAgc2Vhc2hlbGw6IFsyNTUsIDI0NSwgMjM4XSxcbiAgc2llbm5hOiBbMTYwLCA4MiwgNDVdLFxuICBzaWx2ZXI6IFsxOTIsIDE5MiwgMTkyXSxcbiAgc2t5Ymx1ZTogWzEzNSwgMjA2LCAyMzVdLFxuICBzbGF0ZWJsdWU6IFsxMDYsIDkwLCAyMDVdLFxuICBzbGF0ZWdyYXk6IFsxMTIsIDEyOCwgMTQ0XSxcbiAgc2xhdGVncmV5OiBbMTEyLCAxMjgsIDE0NF0sXG4gIHNub3c6IFsyNTUsIDI1MCwgMjUwXSxcbiAgc3ByaW5nZ3JlZW46IFswLCAyNTUsIDEyN10sXG4gIHN0ZWVsYmx1ZTogWzcwLCAxMzAsIDE4MF0sXG4gIHRhbjogWzIxMCwgMTgwLCAxNDBdLFxuICB0ZWFsOiBbMCwgMTI4LCAxMjhdLFxuICB0aGlzdGxlOiBbMjE2LCAxOTEsIDIxNl0sXG4gIHRvbWF0bzogWzI1NSwgOTksIDcxXSxcbiAgdHVycXVvaXNlOiBbNjQsIDIyNCwgMjA4XSxcbiAgdmlvbGV0OiBbMjM4LCAxMzAsIDIzOF0sXG4gIHdoZWF0OiBbMjQ1LCAyMjIsIDE3OV0sXG4gIHdoaXRlOiBbMjU1LCAyNTUsIDI1NV0sXG4gIHdoaXRlc21va2U6IFsyNDUsIDI0NSwgMjQ1XSxcbiAgeWVsbG93OiBbMjU1LCAyNTUsIDBdLFxuICB5ZWxsb3dncmVlbjogWzE1NCwgMjA1LCA1MF1cbn07XG5cbi8vIHNldHMgdGhlIHZhbHVlIGluIGEgbWFwIChtYXAgbWF5IG5vdCBiZSBidWlsdClcbnZhciBzZXRNYXAgPSBmdW5jdGlvbiBzZXRNYXAob3B0aW9ucykge1xuICB2YXIgb2JqID0gb3B0aW9ucy5tYXA7XG4gIHZhciBrZXlzID0gb3B0aW9ucy5rZXlzO1xuICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmIChwbGFpbk9iamVjdChrZXkpKSB7XG4gICAgICB0aHJvdyBFcnJvcignVHJpZWQgdG8gc2V0IG1hcCB3aXRoIG9iamVjdCBrZXknKTtcbiAgICB9XG4gICAgaWYgKGkgPCBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgIC8vIGV4dGVuZCB0aGUgbWFwIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKG9ialtrZXldID09IG51bGwpIHtcbiAgICAgICAgb2JqW2tleV0gPSB7fTtcbiAgICAgIH1cbiAgICAgIG9iaiA9IG9ialtrZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzZXQgdGhlIHZhbHVlXG4gICAgICBvYmpba2V5XSA9IG9wdGlvbnMudmFsdWU7XG4gICAgfVxuICB9XG59O1xuXG4vLyBnZXRzIHRoZSB2YWx1ZSBpbiBhIG1hcCBldmVuIGlmIGl0J3Mgbm90IGJ1aWx0IGluIHBsYWNlc1xudmFyIGdldE1hcCA9IGZ1bmN0aW9uIGdldE1hcChvcHRpb25zKSB7XG4gIHZhciBvYmogPSBvcHRpb25zLm1hcDtcbiAgdmFyIGtleXMgPSBvcHRpb25zLmtleXM7XG4gIHZhciBsID0ga2V5cy5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgaWYgKHBsYWluT2JqZWN0KGtleSkpIHtcbiAgICAgIHRocm93IEVycm9yKCdUcmllZCB0byBnZXQgbWFwIHdpdGggb2JqZWN0IGtleScpO1xuICAgIH1cbiAgICBvYmogPSBvYmpba2V5XTtcbiAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxudmFyIGlzT2JqZWN0XzEgPSBpc09iamVjdDtcblxudmFyIGNvbW1vbmpzR2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDoge307XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZuLCBtb2R1bGUpIHtcblx0cmV0dXJuIG1vZHVsZSA9IHsgZXhwb3J0czoge30gfSwgZm4obW9kdWxlLCBtb2R1bGUuZXhwb3J0cyksIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgY29tbW9uanNHbG9iYWwgPT0gJ29iamVjdCcgJiYgY29tbW9uanNHbG9iYWwgJiYgY29tbW9uanNHbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgY29tbW9uanNHbG9iYWw7XG5cbnZhciBfZnJlZUdsb2JhbCA9IGZyZWVHbG9iYWw7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IF9mcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbnZhciBfcm9vdCA9IHJvb3Q7XG5cbi8qKlxuICogR2V0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlXG4gKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgRGF0ZVxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gKiB9LCBfLm5vdygpKTtcbiAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gKi9cbnZhciBub3cgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIF9yb290LkRhdGUubm93KCk7XG59O1xuXG52YXIgbm93XzEgPSBub3c7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGEgc2luZ2xlIHdoaXRlc3BhY2UgY2hhcmFjdGVyLiAqL1xudmFyIHJlV2hpdGVzcGFjZSA9IC9cXHMvO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1FbmRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2VcbiAqIGNoYXJhY3RlciBvZiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIuXG4gKi9cbmZ1bmN0aW9uIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpIHtcbiAgdmFyIGluZGV4ID0gc3RyaW5nLmxlbmd0aDtcblxuICB3aGlsZSAoaW5kZXgtLSAmJiByZVdoaXRlc3BhY2UudGVzdChzdHJpbmcuY2hhckF0KGluZGV4KSkpIHt9XG4gIHJldHVybiBpbmRleDtcbn1cblxudmFyIF90cmltbWVkRW5kSW5kZXggPSB0cmltbWVkRW5kSW5kZXg7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW1TdGFydCA9IC9eXFxzKy87XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udHJpbWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byB0cmltLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUcmltKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nXG4gICAgPyBzdHJpbmcuc2xpY2UoMCwgX3RyaW1tZWRFbmRJbmRleChzdHJpbmcpICsgMSkucmVwbGFjZShyZVRyaW1TdGFydCwgJycpXG4gICAgOiBzdHJpbmc7XG59XG5cbnZhciBfYmFzZVRyaW0gPSBiYXNlVHJpbTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sJDEgPSBfcm9vdC5TeW1ib2w7XG5cbnZhciBfU3ltYm9sID0gU3ltYm9sJDE7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byQ1ID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkkNCA9IG9iamVjdFByb3RvJDUuaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyQxID0gb2JqZWN0UHJvdG8kNS50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWckMSA9IF9TeW1ib2wgPyBfU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eSQ0LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnJDEpLFxuICAgICAgdGFnID0gdmFsdWVbc3ltVG9TdHJpbmdUYWckMV07XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZyQxXSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZyQxLmNhbGwodmFsdWUpO1xuICBpZiAodW5tYXNrZWQpIHtcbiAgICBpZiAoaXNPd24pIHtcbiAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnJDFdID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWckMV07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbnZhciBfZ2V0UmF3VGFnID0gZ2V0UmF3VGFnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8kNCA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvJDQudG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG59XG5cbnZhciBfb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RUb1N0cmluZztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXSc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gX1N5bWJvbCA/IF9TeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICB9XG4gIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICA/IF9nZXRSYXdUYWcodmFsdWUpXG4gICAgOiBfb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufVxuXG52YXIgX2Jhc2VHZXRUYWcgPSBiYXNlR2V0VGFnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxudmFyIGlzT2JqZWN0TGlrZV8xID0gaXNPYmplY3RMaWtlO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2VfMSh2YWx1ZSkgJiYgX2Jhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbnZhciBpc1N5bWJvbF8xID0gaXNTeW1ib2w7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbF8xKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0XzEodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3RfMShvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSBfYmFzZVRyaW0odmFsdWUpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxudmFyIHRvTnVtYmVyXzEgPSB0b051bWJlcjtcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCQxID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcbiAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG4gKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICpcbiAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICpcbiAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG4gKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gKlxuICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gKiAgICdsZWFkaW5nJzogdHJ1ZSxcbiAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAqIH0pKTtcbiAqXG4gKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsYXN0QXJncyxcbiAgICAgIGxhc3RUaGlzLFxuICAgICAgbWF4V2FpdCxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHRpbWVySWQsXG4gICAgICBsYXN0Q2FsbFRpbWUsXG4gICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICBtYXhpbmcgPSBmYWxzZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUJDEpO1xuICB9XG4gIHdhaXQgPSB0b051bWJlcl8xKHdhaXQpIHx8IDA7XG4gIGlmIChpc09iamVjdF8xKG9wdGlvbnMpKSB7XG4gICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXJfMShvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzO1xuXG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkge1xuICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICB0aW1lV2FpdGluZyA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgIHJldHVybiBtYXhpbmdcbiAgICAgID8gbmF0aXZlTWluKHRpbWVXYWl0aW5nLCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSlcbiAgICAgIDogdGltZVdhaXRpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgIHZhciB0aW1lID0gbm93XzEoKTtcbiAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICByZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO1xuICAgIH1cbiAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHJlbWFpbmluZ1dhaXQodGltZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICB0aW1lcklkID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gT25seSBpbnZva2UgaWYgd2UgaGF2ZSBgbGFzdEFyZ3NgIHdoaWNoIG1lYW5zIGBmdW5jYCBoYXMgYmVlblxuICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykge1xuICAgICAgcmV0dXJuIGludm9rZUZ1bmModGltZSk7XG4gICAgfVxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgfVxuICAgIGxhc3RJbnZva2VUaW1lID0gMDtcbiAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93XzEoKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3dfMSgpLFxuICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRlYm91bmNlZC5jYW5jZWwgPSBjYW5jZWw7XG4gIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICByZXR1cm4gZGVib3VuY2VkO1xufVxuXG52YXIgZGVib3VuY2VfMSA9IGRlYm91bmNlO1xuXG52YXIgcGVyZm9ybWFuY2UgPSBfd2luZG93ID8gX3dpbmRvdy5wZXJmb3JtYW5jZSA6IG51bGw7XG52YXIgcG5vdyA9IHBlcmZvcm1hbmNlICYmIHBlcmZvcm1hbmNlLm5vdyA/IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xufSA6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIERhdGUubm93KCk7XG59O1xudmFyIHJhZiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKF93aW5kb3cpIHtcbiAgICBpZiAoX3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgX3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKF93aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIF93aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChfd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgICAgICBfd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoX3dpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgICAgICBfd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBmbihwbm93KCkpO1xuICAgICAgfSwgMTAwMCAvIDYwKTtcbiAgICB9XG4gIH07XG59KCk7XG52YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKSB7XG4gIHJldHVybiByYWYoZm4pO1xufTtcbnZhciBwZXJmb3JtYW5jZU5vdyA9IHBub3c7XG5cbnZhciBERUZBVUxUX0hBU0hfU0VFRCA9IDkyNjE7XG52YXIgSyA9IDY1NTk5OyAvLyAzNyBhbHNvIHdvcmtzIHByZXR0eSB3ZWxsXG52YXIgREVGQVVMVF9IQVNIX1NFRURfQUxUID0gNTM4MTtcbnZhciBoYXNoSXRlcmFibGVJbnRzID0gZnVuY3Rpb24gaGFzaEl0ZXJhYmxlSW50cyhpdGVyYXRvcikge1xuICB2YXIgc2VlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogREVGQVVMVF9IQVNIX1NFRUQ7XG4gIC8vIHNkYm0vc3RyaW5nLWhhc2hcbiAgdmFyIGhhc2ggPSBzZWVkO1xuICB2YXIgZW50cnk7XG4gIGZvciAoOzspIHtcbiAgICBlbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICBpZiAoZW50cnkuZG9uZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGhhc2ggPSBoYXNoICogSyArIGVudHJ5LnZhbHVlIHwgMDtcbiAgfVxuICByZXR1cm4gaGFzaDtcbn07XG52YXIgaGFzaEludCA9IGZ1bmN0aW9uIGhhc2hJbnQobnVtKSB7XG4gIHZhciBzZWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBERUZBVUxUX0hBU0hfU0VFRDtcbiAgLy8gc2RibS9zdHJpbmctaGFzaFxuICByZXR1cm4gc2VlZCAqIEsgKyBudW0gfCAwO1xufTtcbnZhciBoYXNoSW50QWx0ID0gZnVuY3Rpb24gaGFzaEludEFsdChudW0pIHtcbiAgdmFyIHNlZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IERFRkFVTFRfSEFTSF9TRUVEX0FMVDtcbiAgLy8gZGpiMi9zdHJpbmctaGFzaFxuICByZXR1cm4gKHNlZWQgPDwgNSkgKyBzZWVkICsgbnVtIHwgMDtcbn07XG52YXIgY29tYmluZUhhc2hlcyA9IGZ1bmN0aW9uIGNvbWJpbmVIYXNoZXMoaGFzaDEsIGhhc2gyKSB7XG4gIHJldHVybiBoYXNoMSAqIDB4MjAwMDAwICsgaGFzaDI7XG59O1xudmFyIGNvbWJpbmVIYXNoZXNBcnJheSA9IGZ1bmN0aW9uIGNvbWJpbmVIYXNoZXNBcnJheShoYXNoZXMpIHtcbiAgcmV0dXJuIGhhc2hlc1swXSAqIDB4MjAwMDAwICsgaGFzaGVzWzFdO1xufTtcbnZhciBoYXNoQXJyYXlzID0gZnVuY3Rpb24gaGFzaEFycmF5cyhoYXNoZXMxLCBoYXNoZXMyKSB7XG4gIHJldHVybiBbaGFzaEludChoYXNoZXMxWzBdLCBoYXNoZXMyWzBdKSwgaGFzaEludEFsdChoYXNoZXMxWzFdLCBoYXNoZXMyWzFdKV07XG59O1xudmFyIGhhc2hJbnRzQXJyYXkgPSBmdW5jdGlvbiBoYXNoSW50c0FycmF5KGludHMsIHNlZWQpIHtcbiAgdmFyIGVudHJ5ID0ge1xuICAgIHZhbHVlOiAwLFxuICAgIGRvbmU6IGZhbHNlXG4gIH07XG4gIHZhciBpID0gMDtcbiAgdmFyIGxlbmd0aCA9IGludHMubGVuZ3RoO1xuICB2YXIgaXRlcmF0b3IgPSB7XG4gICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgIGVudHJ5LnZhbHVlID0gaW50c1tpKytdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cnkuZG9uZSA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGFzaEl0ZXJhYmxlSW50cyhpdGVyYXRvciwgc2VlZCk7XG59O1xudmFyIGhhc2hTdHJpbmcgPSBmdW5jdGlvbiBoYXNoU3RyaW5nKHN0ciwgc2VlZCkge1xuICB2YXIgZW50cnkgPSB7XG4gICAgdmFsdWU6IDAsXG4gICAgZG9uZTogZmFsc2VcbiAgfTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbGVuZ3RoID0gc3RyLmxlbmd0aDtcbiAgdmFyIGl0ZXJhdG9yID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICBlbnRyeS52YWx1ZSA9IHN0ci5jaGFyQ29kZUF0KGkrKyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnRyeS5kb25lID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBoYXNoSXRlcmFibGVJbnRzKGl0ZXJhdG9yLCBzZWVkKTtcbn07XG52YXIgaGFzaFN0cmluZ3MgPSBmdW5jdGlvbiBoYXNoU3RyaW5ncygpIHtcbiAgcmV0dXJuIGhhc2hTdHJpbmdzQXJyYXkoYXJndW1lbnRzKTtcbn07XG52YXIgaGFzaFN0cmluZ3NBcnJheSA9IGZ1bmN0aW9uIGhhc2hTdHJpbmdzQXJyYXkoc3Rycykge1xuICB2YXIgaGFzaDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHN0ciA9IHN0cnNbaV07XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIGhhc2ggPSBoYXNoU3RyaW5nKHN0cik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc2ggPSBoYXNoU3RyaW5nKHN0ciwgaGFzaCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBoYXNoO1xufTtcblxuLypnbG9iYWwgY29uc29sZSAqL1xudmFyIHdhcm5pbmdzRW5hYmxlZCA9IHRydWU7XG52YXIgd2FyblN1cHBvcnRlZCA9IGNvbnNvbGUud2FybiAhPSBudWxsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbnZhciB0cmFjZVN1cHBvcnRlZCA9IGNvbnNvbGUudHJhY2UgIT0gbnVsbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG5cbnZhciBNQVhfSU5UJDEgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCA5MDA3MTk5MjU0NzQwOTkxO1xudmFyIHRydWVpZnkgPSBmdW5jdGlvbiB0cnVlaWZ5KCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgZmFsc2lmeSA9IGZ1bmN0aW9uIGZhbHNpZnkoKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG52YXIgemVyb2lmeSA9IGZ1bmN0aW9uIHplcm9pZnkoKSB7XG4gIHJldHVybiAwO1xufTtcbnZhciBub29wJDEgPSBmdW5jdGlvbiBub29wKCkge307XG52YXIgZXJyb3IgPSBmdW5jdGlvbiBlcnJvcihtc2cpIHtcbiAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG59O1xudmFyIHdhcm5pbmdzID0gZnVuY3Rpb24gd2FybmluZ3MoZW5hYmxlZCkge1xuICBpZiAoZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgd2FybmluZ3NFbmFibGVkID0gISFlbmFibGVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB3YXJuaW5nc0VuYWJsZWQ7XG4gIH1cbn07XG52YXIgd2FybiA9IGZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgaWYgKCF3YXJuaW5ncygpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh3YXJuU3VwcG9ydGVkKSB7XG4gICAgY29uc29sZS53YXJuKG1zZyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2cobXNnKTtcbiAgICBpZiAodHJhY2VTdXBwb3J0ZWQpIHtcbiAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICB9XG4gIH1cbn07IC8qIGVzbGludC1lbmFibGUgKi9cblxudmFyIGNsb25lID0gZnVuY3Rpb24gY2xvbmUob2JqKSB7XG4gIHJldHVybiBleHRlbmQoe30sIG9iaik7XG59O1xuXG4vLyBnZXRzIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBhcmd1bWVudFxudmFyIGNvcHkgPSBmdW5jdGlvbiBjb3B5KG9iaikge1xuICBpZiAob2JqID09IG51bGwpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIGlmIChhcnJheShvYmopKSB7XG4gICAgcmV0dXJuIG9iai5zbGljZSgpO1xuICB9IGVsc2UgaWYgKHBsYWluT2JqZWN0KG9iaikpIHtcbiAgICByZXR1cm4gY2xvbmUob2JqKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG59O1xudmFyIGNvcHlBcnJheSQxID0gZnVuY3Rpb24gY29weUFycmF5KGFycikge1xuICByZXR1cm4gYXJyLnNsaWNlKCk7XG59O1xudmFyIHV1aWQgPSBmdW5jdGlvbiB1dWlkKGEsIGIgLyogcGxhY2Vob2xkZXJzICovKSB7XG4gIGZvciAoXG4gIC8vIGxvb3AgOilcbiAgYiA9IGEgPSAnJztcbiAgLy8gYiAtIHJlc3VsdCAsIGEgLSBudW1lcmljIGxldGlhYmxlXG4gIGErKyA8IDM2O1xuICAvL1xuICBiICs9IGEgKiA1MSAmIDUyIC8vIGlmIFwiYVwiIGlzIG5vdCA5IG9yIDE0IG9yIDE5IG9yIDI0XG4gID9cbiAgLy8gIHJldHVybiBhIHJhbmRvbSBudW1iZXIgb3IgNFxuICAoYSBeIDE1IC8vIGlmIFwiYVwiIGlzIG5vdCAxNVxuICA/XG4gIC8vIGdlbmVyYXRlIGEgcmFuZG9tIG51bWJlciBmcm9tIDAgdG8gMTVcbiAgOCBeIE1hdGgucmFuZG9tKCkgKiAoYSBeIDIwID8gMTYgOiA0KSAvLyB1bmxlc3MgXCJhXCIgaXMgMjAsIGluIHdoaWNoIGNhc2UgYSByYW5kb20gbnVtYmVyIGZyb20gOCB0byAxMVxuICA6IDQgLy8gIG90aGVyd2lzZSA0XG4gICkudG9TdHJpbmcoMTYpIDogJy0nIC8vICBpbiBvdGhlciBjYXNlcyAoaWYgXCJhXCIgaXMgOSwxNCwxOSwyNCkgaW5zZXJ0IFwiLVwiXG4gICkge1xuICB9XG4gIHJldHVybiBiO1xufTtcbnZhciBfc3RhdGljRW1wdHlPYmplY3QgPSB7fTtcbnZhciBzdGF0aWNFbXB0eU9iamVjdCA9IGZ1bmN0aW9uIHN0YXRpY0VtcHR5T2JqZWN0KCkge1xuICByZXR1cm4gX3N0YXRpY0VtcHR5T2JqZWN0O1xufTtcbnZhciBkZWZhdWx0cyRnID0gZnVuY3Rpb24gZGVmYXVsdHMoX2RlZmF1bHRzKSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoX2RlZmF1bHRzKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgdmFyIGZpbGxlZE9wdHMgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgdmFyIG9wdFZhbCA9IG9wdHMgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9wdHNba2V5XTtcbiAgICAgIGZpbGxlZE9wdHNba2V5XSA9IG9wdFZhbCA9PT0gdW5kZWZpbmVkID8gX2RlZmF1bHRzW2tleV0gOiBvcHRWYWw7XG4gICAgfVxuICAgIHJldHVybiBmaWxsZWRPcHRzO1xuICB9O1xufTtcbnZhciByZW1vdmVGcm9tQXJyYXkgPSBmdW5jdGlvbiByZW1vdmVGcm9tQXJyYXkoYXJyLCBlbGUsIG9uZUNvcHkpIHtcbiAgZm9yICh2YXIgaSA9IGFyci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChhcnJbaV0gPT09IGVsZSkge1xuICAgICAgYXJyLnNwbGljZShpLCAxKTtcbiAgICAgIGlmIChvbmVDb3B5KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbnZhciBjbGVhckFycmF5ID0gZnVuY3Rpb24gY2xlYXJBcnJheShhcnIpIHtcbiAgYXJyLnNwbGljZSgwLCBhcnIubGVuZ3RoKTtcbn07XG52YXIgcHVzaCA9IGZ1bmN0aW9uIHB1c2goYXJyLCBvdGhlckFycikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG90aGVyQXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsID0gb3RoZXJBcnJbaV07XG4gICAgYXJyLnB1c2goZWwpO1xuICB9XG59O1xudmFyIGdldFByZWZpeGVkUHJvcGVydHkgPSBmdW5jdGlvbiBnZXRQcmVmaXhlZFByb3BlcnR5KG9iaiwgcHJvcE5hbWUsIHByZWZpeCkge1xuICBpZiAocHJlZml4KSB7XG4gICAgcHJvcE5hbWUgPSBwcmVwZW5kQ2FtZWwocHJlZml4LCBwcm9wTmFtZSk7IC8vIGUuZy4gKGxhYmVsV2lkdGgsIHNvdXJjZSkgPT4gc291cmNlTGFiZWxXaWR0aFxuICB9XG5cbiAgcmV0dXJuIG9ialtwcm9wTmFtZV07XG59O1xudmFyIHNldFByZWZpeGVkUHJvcGVydHkgPSBmdW5jdGlvbiBzZXRQcmVmaXhlZFByb3BlcnR5KG9iaiwgcHJvcE5hbWUsIHByZWZpeCwgdmFsdWUpIHtcbiAgaWYgKHByZWZpeCkge1xuICAgIHByb3BOYW1lID0gcHJlcGVuZENhbWVsKHByZWZpeCwgcHJvcE5hbWUpOyAvLyBlLmcuIChsYWJlbFdpZHRoLCBzb3VyY2UpID0+IHNvdXJjZUxhYmVsV2lkdGhcbiAgfVxuXG4gIG9ialtwcm9wTmFtZV0gPSB2YWx1ZTtcbn07XG5cbi8qIGdsb2JhbCBNYXAgKi9cbnZhciBPYmplY3RNYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBPYmplY3RNYXAoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE9iamVjdE1hcCk7XG4gICAgdGhpcy5fb2JqID0ge307XG4gIH1cbiAgX2NyZWF0ZUNsYXNzKE9iamVjdE1hcCwgW3tcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChrZXksIHZhbCkge1xuICAgICAgdGhpcy5fb2JqW2tleV0gPSB2YWw7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWxldGUoa2V5KSB7XG4gICAgICB0aGlzLl9vYmpba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbGVhclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgIHRoaXMuX29iaiA9IHt9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX29ialtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fb2JqW2tleV07XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBPYmplY3RNYXA7XG59KCk7XG52YXIgTWFwJDIgPSB0eXBlb2YgTWFwICE9PSAndW5kZWZpbmVkJyA/IE1hcCA6IE9iamVjdE1hcDtcblxuLyogZ2xvYmFsIFNldCAqL1xuXG52YXIgdW5kZWYgPSBcInVuZGVmaW5lZFwiIDtcbnZhciBPYmplY3RTZXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBPYmplY3RTZXQoYXJyYXlPck9iamVjdFNldCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBPYmplY3RTZXQpO1xuICAgIHRoaXMuX29iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5zaXplID0gMDtcbiAgICBpZiAoYXJyYXlPck9iamVjdFNldCAhPSBudWxsKSB7XG4gICAgICB2YXIgYXJyO1xuICAgICAgaWYgKGFycmF5T3JPYmplY3RTZXQuaW5zdGFuY2VTdHJpbmcgIT0gbnVsbCAmJiBhcnJheU9yT2JqZWN0U2V0Lmluc3RhbmNlU3RyaW5nKCkgPT09IHRoaXMuaW5zdGFuY2VTdHJpbmcoKSkge1xuICAgICAgICBhcnIgPSBhcnJheU9yT2JqZWN0U2V0LnRvQXJyYXkoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFyciA9IGFycmF5T3JPYmplY3RTZXQ7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmFkZChhcnJbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfY3JlYXRlQ2xhc3MoT2JqZWN0U2V0LCBbe1xuICAgIGtleTogXCJpbnN0YW5jZVN0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnN0YW5jZVN0cmluZygpIHtcbiAgICAgIHJldHVybiAnc2V0JztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZCh2YWwpIHtcbiAgICAgIHZhciBvID0gdGhpcy5fb2JqO1xuICAgICAgaWYgKG9bdmFsXSAhPT0gMSkge1xuICAgICAgICBvW3ZhbF0gPSAxO1xuICAgICAgICB0aGlzLnNpemUrKztcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWxldGUodmFsKSB7XG4gICAgICB2YXIgbyA9IHRoaXMuX29iajtcbiAgICAgIGlmIChvW3ZhbF0gPT09IDEpIHtcbiAgICAgICAgb1t2YWxdID0gMDtcbiAgICAgICAgdGhpcy5zaXplLS07XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNsZWFyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgdGhpcy5fb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhcyh2YWwpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vYmpbdmFsXSA9PT0gMTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9BcnJheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0FycmF5KCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9vYmopLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5oYXMoa2V5KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb3JFYWNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvQXJyYXkoKS5mb3JFYWNoKGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgICB9XG4gIH1dKTtcbiAgcmV0dXJuIE9iamVjdFNldDtcbn0oKTtcbnZhciBTZXQkMSA9ICh0eXBlb2YgU2V0ID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YoU2V0KSkgIT09IHVuZGVmID8gU2V0IDogT2JqZWN0U2V0O1xuXG4vLyByZXByZXNlbnRzIGEgbm9kZSBvciBhbiBlZGdlXG52YXIgRWxlbWVudCA9IGZ1bmN0aW9uIEVsZW1lbnQoY3ksIHBhcmFtcykge1xuICB2YXIgcmVzdG9yZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcbiAgaWYgKGN5ID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSB1bmRlZmluZWQgfHwgIWNvcmUoY3kpKSB7XG4gICAgZXJyb3IoJ0FuIGVsZW1lbnQgbXVzdCBoYXZlIGEgY29yZSByZWZlcmVuY2UgYW5kIHBhcmFtZXRlcnMgc2V0Jyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBncm91cCA9IHBhcmFtcy5ncm91cDtcblxuICAvLyB0cnkgdG8gYXV0b21hdGljYWxseSBpbmZlciB0aGUgZ3JvdXAgaWYgdW5zcGVjaWZpZWRcbiAgaWYgKGdyb3VwID09IG51bGwpIHtcbiAgICBpZiAocGFyYW1zLmRhdGEgJiYgcGFyYW1zLmRhdGEuc291cmNlICE9IG51bGwgJiYgcGFyYW1zLmRhdGEudGFyZ2V0ICE9IG51bGwpIHtcbiAgICAgIGdyb3VwID0gJ2VkZ2VzJztcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JvdXAgPSAnbm9kZXMnO1xuICAgIH1cbiAgfVxuXG4gIC8vIHZhbGlkYXRlIGdyb3VwXG4gIGlmIChncm91cCAhPT0gJ25vZGVzJyAmJiBncm91cCAhPT0gJ2VkZ2VzJykge1xuICAgIGVycm9yKCdBbiBlbGVtZW50IG11c3QgYmUgb2YgdHlwZSBgbm9kZXNgIG9yIGBlZGdlc2A7IHlvdSBzcGVjaWZpZWQgYCcgKyBncm91cCArICdgJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gbWFrZSB0aGUgZWxlbWVudCBhcnJheS1saWtlLCBqdXN0IGxpa2UgYSBjb2xsZWN0aW9uXG4gIHRoaXMubGVuZ3RoID0gMTtcbiAgdGhpc1swXSA9IHRoaXM7XG5cbiAgLy8gTk9URTogd2hlbiBzb21ldGhpbmcgaXMgYWRkZWQgaGVyZSwgYWRkIGFsc28gdG8gZWxlLmpzb24oKVxuICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlID0ge1xuICAgIGN5OiBjeSxcbiAgICBzaW5nbGU6IHRydWUsXG4gICAgLy8gaW5kaWNhdGVzIHRoaXMgaXMgYW4gZWxlbWVudFxuICAgIGRhdGE6IHBhcmFtcy5kYXRhIHx8IHt9LFxuICAgIC8vIGRhdGEgb2JqZWN0XG4gICAgcG9zaXRpb246IHBhcmFtcy5wb3NpdGlvbiB8fCB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH0sXG4gICAgLy8gKHgsIHkpIHBvc2l0aW9uIHBhaXJcbiAgICBhdXRvV2lkdGg6IHVuZGVmaW5lZCxcbiAgICAvLyB3aWR0aCBhbmQgaGVpZ2h0IG9mIG5vZGVzIGNhbGN1bGF0ZWQgYnkgdGhlIHJlbmRlcmVyIHdoZW4gc2V0IHRvIHNwZWNpYWwgJ2F1dG8nIHZhbHVlXG4gICAgYXV0b0hlaWdodDogdW5kZWZpbmVkLFxuICAgIGF1dG9QYWRkaW5nOiB1bmRlZmluZWQsXG4gICAgY29tcG91bmRCb3VuZHNDbGVhbjogZmFsc2UsXG4gICAgLy8gd2hldGhlciB0aGUgY29tcG91bmQgZGltZW5zaW9ucyBuZWVkIHRvIGJlIHJlY2FsY3VsYXRlZCB0aGUgbmV4dCB0aW1lIGRpbWVuc2lvbnMgYXJlIHJlYWRcbiAgICBsaXN0ZW5lcnM6IFtdLFxuICAgIC8vIGFycmF5IG9mIGJvdW5kIGxpc3RlbmVyc1xuICAgIGdyb3VwOiBncm91cCxcbiAgICAvLyBzdHJpbmc7ICdub2Rlcycgb3IgJ2VkZ2VzJ1xuICAgIHN0eWxlOiB7fSxcbiAgICAvLyBwcm9wZXJ0aWVzIGFzIHNldCBieSB0aGUgc3R5bGVcbiAgICByc3R5bGU6IHt9LFxuICAgIC8vIHByb3BlcnRpZXMgZm9yIHN0eWxlIHNlbnQgZnJvbSB0aGUgcmVuZGVyZXIgdG8gdGhlIGNvcmVcbiAgICBzdHlsZUN4dHM6IFtdLFxuICAgIC8vIGFwcGxpZWQgc3R5bGUgY29udGV4dHMgZnJvbSB0aGUgc3R5bGVyXG4gICAgc3R5bGVLZXlzOiB7fSxcbiAgICAvLyBwZXItZ3JvdXAga2V5cyBvZiBzdHlsZSBwcm9wZXJ0eSB2YWx1ZXNcbiAgICByZW1vdmVkOiB0cnVlLFxuICAgIC8vIHdoZXRoZXIgaXQncyBpbnNpZGUgdGhlIHZpczsgdHJ1ZSBpZiByZW1vdmVkIChzZXQgdHJ1ZSBoZXJlIHNpbmNlIHdlIGNhbGwgcmVzdG9yZSlcbiAgICBzZWxlY3RlZDogcGFyYW1zLnNlbGVjdGVkID8gdHJ1ZSA6IGZhbHNlLFxuICAgIC8vIHdoZXRoZXIgaXQncyBzZWxlY3RlZFxuICAgIHNlbGVjdGFibGU6IHBhcmFtcy5zZWxlY3RhYmxlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcGFyYW1zLnNlbGVjdGFibGUgPyB0cnVlIDogZmFsc2UsXG4gICAgLy8gd2hldGhlciBpdCdzIHNlbGVjdGFibGVcbiAgICBsb2NrZWQ6IHBhcmFtcy5sb2NrZWQgPyB0cnVlIDogZmFsc2UsXG4gICAgLy8gd2hldGhlciB0aGUgZWxlbWVudCBpcyBsb2NrZWQgKGNhbm5vdCBiZSBtb3ZlZClcbiAgICBncmFiYmVkOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGdyYWJiZWQgYnkgdGhlIG1vdXNlOyByZW5kZXJlciBzZXRzIHRoaXMgcHJpdmF0ZWx5XG4gICAgZ3JhYmJhYmxlOiBwYXJhbXMuZ3JhYmJhYmxlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcGFyYW1zLmdyYWJiYWJsZSA/IHRydWUgOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHRoZSBlbGVtZW50IGNhbiBiZSBncmFiYmVkXG4gICAgcGFubmFibGU6IHBhcmFtcy5wYW5uYWJsZSA9PT0gdW5kZWZpbmVkID8gZ3JvdXAgPT09ICdlZGdlcycgPyB0cnVlIDogZmFsc2UgOiBwYXJhbXMucGFubmFibGUgPyB0cnVlIDogZmFsc2UsXG4gICAgLy8gd2hldGhlciB0aGUgZWxlbWVudCBoYXMgcGFzc3Rocm91Z2ggcGFubmluZyBlbmFibGVkXG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIGFjdGl2ZSBmcm9tIHVzZXIgaW50ZXJhY3Rpb25cbiAgICBjbGFzc2VzOiBuZXcgU2V0JDEoKSxcbiAgICAvLyBtYXAgKCBjbGFzc05hbWUgPT4gdHJ1ZSApXG4gICAgYW5pbWF0aW9uOiB7XG4gICAgICAvLyBvYmplY3QgZm9yIGN1cnJlbnRseS1ydW5uaW5nIGFuaW1hdGlvbnNcbiAgICAgIGN1cnJlbnQ6IFtdLFxuICAgICAgcXVldWU6IFtdXG4gICAgfSxcbiAgICByc2NyYXRjaDoge30sXG4gICAgLy8gb2JqZWN0IGluIHdoaWNoIHRoZSByZW5kZXJlciBjYW4gc3RvcmUgaW5mb3JtYXRpb25cbiAgICBzY3JhdGNoOiBwYXJhbXMuc2NyYXRjaCB8fCB7fSxcbiAgICAvLyBzY3JhdGNoIG9iamVjdHNcbiAgICBlZGdlczogW10sXG4gICAgLy8gYXJyYXkgb2YgY29ubmVjdGVkIGVkZ2VzXG4gICAgY2hpbGRyZW46IFtdLFxuICAgIC8vIGFycmF5IG9mIGNoaWxkcmVuXG4gICAgcGFyZW50OiBwYXJhbXMucGFyZW50ICYmIHBhcmFtcy5wYXJlbnQuaXNOb2RlKCkgPyBwYXJhbXMucGFyZW50IDogbnVsbCxcbiAgICAvLyBwYXJlbnQgcmVmXG4gICAgdHJhdmVyc2FsQ2FjaGU6IHt9LFxuICAgIC8vIGNhY2hlIG9mIG91dHB1dCBvZiB0cmF2ZXJzYWwgZnVuY3Rpb25zXG4gICAgYmFja2dyb3VuZGluZzogZmFsc2UsXG4gICAgLy8gd2hldGhlciBiYWNrZ3JvdW5kIGltYWdlcyBhcmUgbG9hZGluZ1xuICAgIGJiQ2FjaGU6IG51bGwsXG4gICAgLy8gY2FjaGUgb2YgdGhlIGN1cnJlbnQgYm91bmRpbmcgYm94XG4gICAgYmJDYWNoZVNoaWZ0OiB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH0sXG4gICAgLy8gc2hpZnQgYXBwbGllZCB0byBjYWNoZWQgYmIgdG8gYmUgYXBwbGllZCBvbiBuZXh0IGdldFxuICAgIGJvZHlCb3VuZHM6IG51bGwsXG4gICAgLy8gYm91bmRzIGNhY2hlIG9mIGVsZW1lbnQgYm9keSwgdy9vIG92ZXJsYXlcbiAgICBvdmVybGF5Qm91bmRzOiBudWxsLFxuICAgIC8vIGJvdW5kcyBjYWNoZSBvZiBlbGVtZW50IGJvZHksIGluY2x1ZGluZyBvdmVybGF5XG4gICAgbGFiZWxCb3VuZHM6IHtcbiAgICAgIC8vIGJvdW5kcyBjYWNoZSBvZiBsYWJlbHNcbiAgICAgIGFsbDogbnVsbCxcbiAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgIHRhcmdldDogbnVsbCxcbiAgICAgIG1haW46IG51bGxcbiAgICB9LFxuICAgIGFycm93Qm91bmRzOiB7XG4gICAgICAvLyBib3VuZHMgY2FjaGUgb2YgZWRnZSBhcnJvd3NcbiAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgIHRhcmdldDogbnVsbCxcbiAgICAgICdtaWQtc291cmNlJzogbnVsbCxcbiAgICAgICdtaWQtdGFyZ2V0JzogbnVsbFxuICAgIH1cbiAgfTtcbiAgaWYgKF9wLnBvc2l0aW9uLnggPT0gbnVsbCkge1xuICAgIF9wLnBvc2l0aW9uLnggPSAwO1xuICB9XG4gIGlmIChfcC5wb3NpdGlvbi55ID09IG51bGwpIHtcbiAgICBfcC5wb3NpdGlvbi55ID0gMDtcbiAgfVxuXG4gIC8vIHJlbmRlcmVkUG9zaXRpb24gb3ZlcnJpZGVzIGlmIHNwZWNpZmllZFxuICBpZiAocGFyYW1zLnJlbmRlcmVkUG9zaXRpb24pIHtcbiAgICB2YXIgcnBvcyA9IHBhcmFtcy5yZW5kZXJlZFBvc2l0aW9uO1xuICAgIHZhciBwYW4gPSBjeS5wYW4oKTtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICBfcC5wb3NpdGlvbiA9IHtcbiAgICAgIHg6IChycG9zLnggLSBwYW4ueCkgLyB6b29tLFxuICAgICAgeTogKHJwb3MueSAtIHBhbi55KSAvIHpvb21cbiAgICB9O1xuICB9XG4gIHZhciBjbGFzc2VzID0gW107XG4gIGlmIChhcnJheShwYXJhbXMuY2xhc3NlcykpIHtcbiAgICBjbGFzc2VzID0gcGFyYW1zLmNsYXNzZXM7XG4gIH0gZWxzZSBpZiAoc3RyaW5nKHBhcmFtcy5jbGFzc2VzKSkge1xuICAgIGNsYXNzZXMgPSBwYXJhbXMuY2xhc3Nlcy5zcGxpdCgvXFxzKy8pO1xuICB9XG4gIGZvciAodmFyIGkgPSAwLCBsID0gY2xhc3Nlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIgY2xzID0gY2xhc3Nlc1tpXTtcbiAgICBpZiAoIWNscyB8fCBjbHMgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgX3AuY2xhc3Nlcy5hZGQoY2xzKTtcbiAgfVxuICB0aGlzLmNyZWF0ZUVtaXR0ZXIoKTtcbiAgdmFyIGJ5cGFzcyA9IHBhcmFtcy5zdHlsZSB8fCBwYXJhbXMuY3NzO1xuICBpZiAoYnlwYXNzKSB7XG4gICAgd2FybignU2V0dGluZyBhIGBzdHlsZWAgYnlwYXNzIGF0IGVsZW1lbnQgY3JlYXRpb24gc2hvdWxkIGJlIGRvbmUgb25seSB3aGVuIGFic29sdXRlbHkgbmVjZXNzYXJ5LiAgVHJ5IHRvIHVzZSB0aGUgc3R5bGVzaGVldCBpbnN0ZWFkLicpO1xuICAgIHRoaXMuc3R5bGUoYnlwYXNzKTtcbiAgfVxuICBpZiAocmVzdG9yZSA9PT0gdW5kZWZpbmVkIHx8IHJlc3RvcmUpIHtcbiAgICB0aGlzLnJlc3RvcmUoKTtcbiAgfVxufTtcblxudmFyIGRlZmluZVNlYXJjaCA9IGZ1bmN0aW9uIGRlZmluZVNlYXJjaChwYXJhbXMpIHtcbiAgcGFyYW1zID0ge1xuICAgIGJmczogcGFyYW1zLmJmcyB8fCAhcGFyYW1zLmRmcyxcbiAgICBkZnM6IHBhcmFtcy5kZnMgfHwgIXBhcmFtcy5iZnNcbiAgfTtcblxuICAvLyBmcm9tIHBzZXVkb2NvZGUgb24gd2lraXBlZGlhXG4gIHJldHVybiBmdW5jdGlvbiBzZWFyY2hGbihyb290cywgZm4sIGRpcmVjdGVkKSB7XG4gICAgdmFyIG9wdGlvbnM7XG4gICAgaWYgKHBsYWluT2JqZWN0KHJvb3RzKSAmJiAhZWxlbWVudE9yQ29sbGVjdGlvbihyb290cykpIHtcbiAgICAgIG9wdGlvbnMgPSByb290cztcbiAgICAgIHJvb3RzID0gb3B0aW9ucy5yb290cyB8fCBvcHRpb25zLnJvb3Q7XG4gICAgICBmbiA9IG9wdGlvbnMudmlzaXQ7XG4gICAgICBkaXJlY3RlZCA9IG9wdGlvbnMuZGlyZWN0ZWQ7XG4gICAgfVxuICAgIGRpcmVjdGVkID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMiAmJiAhZm4kNihmbikgPyBmbiA6IGRpcmVjdGVkO1xuICAgIGZuID0gZm4kNihmbikgPyBmbiA6IGZ1bmN0aW9uICgpIHt9O1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgdmFyIHYgPSByb290cyA9IHN0cmluZyhyb290cykgPyB0aGlzLmZpbHRlcihyb290cykgOiByb290cztcbiAgICB2YXIgUSA9IFtdO1xuICAgIHZhciBjb25uZWN0ZWROb2RlcyA9IFtdO1xuICAgIHZhciBjb25uZWN0ZWRCeSA9IHt9O1xuICAgIHZhciBpZDJkZXB0aCA9IHt9O1xuICAgIHZhciBWID0ge307XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBmb3VuZDtcbiAgICB2YXIgX3RoaXMkYnlHcm91cCA9IHRoaXMuYnlHcm91cCgpLFxuICAgICAgbm9kZXMgPSBfdGhpcyRieUdyb3VwLm5vZGVzLFxuICAgICAgZWRnZXMgPSBfdGhpcyRieUdyb3VwLmVkZ2VzO1xuXG4gICAgLy8gZW5xdWV1ZSB2XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmkgPSB2W2ldO1xuICAgICAgdmFyIHZpSWQgPSB2aS5pZCgpO1xuICAgICAgaWYgKHZpLmlzTm9kZSgpKSB7XG4gICAgICAgIFEudW5zaGlmdCh2aSk7XG4gICAgICAgIGlmIChwYXJhbXMuYmZzKSB7XG4gICAgICAgICAgVlt2aUlkXSA9IHRydWU7XG4gICAgICAgICAgY29ubmVjdGVkTm9kZXMucHVzaCh2aSk7XG4gICAgICAgIH1cbiAgICAgICAgaWQyZGVwdGhbdmlJZF0gPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcCgpIHtcbiAgICAgIHZhciB2ID0gcGFyYW1zLmJmcyA/IFEuc2hpZnQoKSA6IFEucG9wKCk7XG4gICAgICB2YXIgdklkID0gdi5pZCgpO1xuICAgICAgaWYgKHBhcmFtcy5kZnMpIHtcbiAgICAgICAgaWYgKFZbdklkXSkge1xuICAgICAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XG4gICAgICAgIH1cbiAgICAgICAgVlt2SWRdID0gdHJ1ZTtcbiAgICAgICAgY29ubmVjdGVkTm9kZXMucHVzaCh2KTtcbiAgICAgIH1cbiAgICAgIHZhciBkZXB0aCA9IGlkMmRlcHRoW3ZJZF07XG4gICAgICB2YXIgcHJldkVkZ2UgPSBjb25uZWN0ZWRCeVt2SWRdO1xuICAgICAgdmFyIHNyYyA9IHByZXZFZGdlICE9IG51bGwgPyBwcmV2RWRnZS5zb3VyY2UoKSA6IG51bGw7XG4gICAgICB2YXIgdGd0ID0gcHJldkVkZ2UgIT0gbnVsbCA/IHByZXZFZGdlLnRhcmdldCgpIDogbnVsbDtcbiAgICAgIHZhciBwcmV2Tm9kZSA9IHByZXZFZGdlID09IG51bGwgPyB1bmRlZmluZWQgOiB2LnNhbWUoc3JjKSA/IHRndFswXSA6IHNyY1swXTtcbiAgICAgIHZhciByZXQgPSB2b2lkIDA7XG4gICAgICByZXQgPSBmbih2LCBwcmV2RWRnZSwgcHJldk5vZGUsIGorKywgZGVwdGgpO1xuICAgICAgaWYgKHJldCA9PT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZCA9IHY7XG4gICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICB9XG4gICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gXCJicmVha1wiO1xuICAgICAgfVxuICAgICAgdmFyIHZ3RWRnZXMgPSB2LmNvbm5lY3RlZEVkZ2VzKCkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiAoIWRpcmVjdGVkIHx8IGUuc291cmNlKCkuc2FtZSh2KSkgJiYgZWRnZXMuaGFzKGUpO1xuICAgICAgfSk7XG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCB2d0VkZ2VzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgdmFyIGUgPSB2d0VkZ2VzW19pMl07XG4gICAgICAgIHZhciB3ID0gZS5jb25uZWN0ZWROb2RlcygpLmZpbHRlcihmdW5jdGlvbiAobikge1xuICAgICAgICAgIHJldHVybiAhbi5zYW1lKHYpICYmIG5vZGVzLmhhcyhuKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB3SWQgPSB3LmlkKCk7XG4gICAgICAgIGlmICh3Lmxlbmd0aCAhPT0gMCAmJiAhVlt3SWRdKSB7XG4gICAgICAgICAgdyA9IHdbMF07XG4gICAgICAgICAgUS5wdXNoKHcpO1xuICAgICAgICAgIGlmIChwYXJhbXMuYmZzKSB7XG4gICAgICAgICAgICBWW3dJZF0gPSB0cnVlO1xuICAgICAgICAgICAgY29ubmVjdGVkTm9kZXMucHVzaCh3KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29ubmVjdGVkQnlbd0lkXSA9IGU7XG4gICAgICAgICAgaWQyZGVwdGhbd0lkXSA9IGlkMmRlcHRoW3ZJZF0gKyAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB3aGlsZSAoUS5sZW5ndGggIT09IDApIHtcbiAgICAgIHZhciBfcmV0ID0gX2xvb3AoKTtcbiAgICAgIGlmIChfcmV0ID09PSBcImNvbnRpbnVlXCIpIGNvbnRpbnVlO1xuICAgICAgaWYgKF9yZXQgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgfVxuICAgIHZhciBjb25uZWN0ZWRFbGVzID0gY3kuY29sbGVjdGlvbigpO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBjb25uZWN0ZWROb2Rlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBub2RlID0gY29ubmVjdGVkTm9kZXNbX2ldO1xuICAgICAgdmFyIGVkZ2UgPSBjb25uZWN0ZWRCeVtub2RlLmlkKCldO1xuICAgICAgaWYgKGVkZ2UgIT0gbnVsbCkge1xuICAgICAgICBjb25uZWN0ZWRFbGVzLnB1c2goZWRnZSk7XG4gICAgICB9XG4gICAgICBjb25uZWN0ZWRFbGVzLnB1c2gobm9kZSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBwYXRoOiBjeS5jb2xsZWN0aW9uKGNvbm5lY3RlZEVsZXMpLFxuICAgICAgZm91bmQ6IGN5LmNvbGxlY3Rpb24oZm91bmQpXG4gICAgfTtcbiAgfTtcbn07XG5cbi8vIHNlYXJjaCwgc3Bhbm5pbmcgdHJlZXMsIGV0Y1xudmFyIGVsZXNmbiR2ID0ge1xuICBicmVhZHRoRmlyc3RTZWFyY2g6IGRlZmluZVNlYXJjaCh7XG4gICAgYmZzOiB0cnVlXG4gIH0pLFxuICBkZXB0aEZpcnN0U2VhcmNoOiBkZWZpbmVTZWFyY2goe1xuICAgIGRmczogdHJ1ZVxuICB9KVxufTtcblxuLy8gbmljZSwgc2hvcnQgbWF0aGVtYXRpY2FsIGFsaWFzXG5lbGVzZm4kdi5iZnMgPSBlbGVzZm4kdi5icmVhZHRoRmlyc3RTZWFyY2g7XG5lbGVzZm4kdi5kZnMgPSBlbGVzZm4kdi5kZXB0aEZpcnN0U2VhcmNoO1xuXG52YXIgaGVhcCQxID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjguMFxuKGZ1bmN0aW9uKCkge1xuICB2YXIgSGVhcCwgZGVmYXVsdENtcCwgZmxvb3IsIGhlYXBpZnksIGhlYXBwb3AsIGhlYXBwdXNoLCBoZWFwcHVzaHBvcCwgaGVhcHJlcGxhY2UsIGluc29ydCwgbWluLCBubGFyZ2VzdCwgbnNtYWxsZXN0LCB1cGRhdGVJdGVtLCBfc2lmdGRvd24sIF9zaWZ0dXA7XG5cbiAgZmxvb3IgPSBNYXRoLmZsb29yLCBtaW4gPSBNYXRoLm1pbjtcblxuXG4gIC8qXG4gIERlZmF1bHQgY29tcGFyaXNvbiBmdW5jdGlvbiB0byBiZSB1c2VkXG4gICAqL1xuXG4gIGRlZmF1bHRDbXAgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgaWYgKHggPCB5KSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGlmICh4ID4geSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9O1xuXG5cbiAgLypcbiAgSW5zZXJ0IGl0ZW0geCBpbiBsaXN0IGEsIGFuZCBrZWVwIGl0IHNvcnRlZCBhc3N1bWluZyBhIGlzIHNvcnRlZC5cbiAgXG4gIElmIHggaXMgYWxyZWFkeSBpbiBhLCBpbnNlcnQgaXQgdG8gdGhlIHJpZ2h0IG9mIHRoZSByaWdodG1vc3QgeC5cbiAgXG4gIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGEubGVuZ3RoKSBib3VuZCB0aGUgc2xpY2VcbiAgb2YgYSB0byBiZSBzZWFyY2hlZC5cbiAgICovXG5cbiAgaW5zb3J0ID0gZnVuY3Rpb24oYSwgeCwgbG8sIGhpLCBjbXApIHtcbiAgICB2YXIgbWlkO1xuICAgIGlmIChsbyA9PSBudWxsKSB7XG4gICAgICBsbyA9IDA7XG4gICAgfVxuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgaWYgKGxvIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpO1xuICAgIH1cbiAgICBpZiAoaGkgPT0gbnVsbCkge1xuICAgICAgaGkgPSBhLmxlbmd0aDtcbiAgICB9XG4gICAgd2hpbGUgKGxvIDwgaGkpIHtcbiAgICAgIG1pZCA9IGZsb29yKChsbyArIGhpKSAvIDIpO1xuICAgICAgaWYgKGNtcCh4LCBhW21pZF0pIDwgMCkge1xuICAgICAgICBoaSA9IG1pZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvID0gbWlkICsgMTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChbXS5zcGxpY2UuYXBwbHkoYSwgW2xvLCBsbyAtIGxvXS5jb25jYXQoeCkpLCB4KTtcbiAgfTtcblxuXG4gIC8qXG4gIFB1c2ggaXRlbSBvbnRvIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC5cbiAgICovXG5cbiAgaGVhcHB1c2ggPSBmdW5jdGlvbihhcnJheSwgaXRlbSwgY21wKSB7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBhcnJheS5wdXNoKGl0ZW0pO1xuICAgIHJldHVybiBfc2lmdGRvd24oYXJyYXksIDAsIGFycmF5Lmxlbmd0aCAtIDEsIGNtcCk7XG4gIH07XG5cblxuICAvKlxuICBQb3AgdGhlIHNtYWxsZXN0IGl0ZW0gb2ZmIHRoZSBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuXG4gICAqL1xuXG4gIGhlYXBwb3AgPSBmdW5jdGlvbihhcnJheSwgY21wKSB7XG4gICAgdmFyIGxhc3RlbHQsIHJldHVybml0ZW07XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBsYXN0ZWx0ID0gYXJyYXkucG9wKCk7XG4gICAgaWYgKGFycmF5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuaXRlbSA9IGFycmF5WzBdO1xuICAgICAgYXJyYXlbMF0gPSBsYXN0ZWx0O1xuICAgICAgX3NpZnR1cChhcnJheSwgMCwgY21wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuaXRlbSA9IGxhc3RlbHQ7XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5pdGVtO1xuICB9O1xuXG5cbiAgLypcbiAgUG9wIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgc21hbGxlc3QgdmFsdWUsIGFuZCBhZGQgdGhlIG5ldyBpdGVtLlxuICBcbiAgVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGhlYXBwb3AoKSBmb2xsb3dlZCBieSBoZWFwcHVzaCgpLCBhbmQgY2FuIGJlXG4gIG1vcmUgYXBwcm9wcmlhdGUgd2hlbiB1c2luZyBhIGZpeGVkIHNpemUgaGVhcC4gTm90ZSB0aGF0IHRoZSB2YWx1ZVxuICByZXR1cm5lZCBtYXkgYmUgbGFyZ2VyIHRoYW4gaXRlbSEgVGhhdCBjb25zdHJhaW5zIHJlYXNvbmFibGUgdXNlIG9mXG4gIHRoaXMgcm91dGluZSB1bmxlc3Mgd3JpdHRlbiBhcyBwYXJ0IG9mIGEgY29uZGl0aW9uYWwgcmVwbGFjZW1lbnQ6XG4gICAgICBpZiBpdGVtID4gYXJyYXlbMF1cbiAgICAgICAgaXRlbSA9IGhlYXByZXBsYWNlKGFycmF5LCBpdGVtKVxuICAgKi9cblxuICBoZWFwcmVwbGFjZSA9IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBjbXApIHtcbiAgICB2YXIgcmV0dXJuaXRlbTtcbiAgICBpZiAoY21wID09IG51bGwpIHtcbiAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG4gICAgfVxuICAgIHJldHVybml0ZW0gPSBhcnJheVswXTtcbiAgICBhcnJheVswXSA9IGl0ZW07XG4gICAgX3NpZnR1cChhcnJheSwgMCwgY21wKTtcbiAgICByZXR1cm4gcmV0dXJuaXRlbTtcbiAgfTtcblxuXG4gIC8qXG4gIEZhc3QgdmVyc2lvbiBvZiBhIGhlYXBwdXNoIGZvbGxvd2VkIGJ5IGEgaGVhcHBvcC5cbiAgICovXG5cbiAgaGVhcHB1c2hwb3AgPSBmdW5jdGlvbihhcnJheSwgaXRlbSwgY21wKSB7XG4gICAgdmFyIF9yZWY7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICBpZiAoYXJyYXkubGVuZ3RoICYmIGNtcChhcnJheVswXSwgaXRlbSkgPCAwKSB7XG4gICAgICBfcmVmID0gW2FycmF5WzBdLCBpdGVtXSwgaXRlbSA9IF9yZWZbMF0sIGFycmF5WzBdID0gX3JlZlsxXTtcbiAgICAgIF9zaWZ0dXAoYXJyYXksIDAsIGNtcCk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xuICB9O1xuXG5cbiAgLypcbiAgVHJhbnNmb3JtIGxpc3QgaW50byBhIGhlYXAsIGluLXBsYWNlLCBpbiBPKGFycmF5Lmxlbmd0aCkgdGltZS5cbiAgICovXG5cbiAgaGVhcGlmeSA9IGZ1bmN0aW9uKGFycmF5LCBjbXApIHtcbiAgICB2YXIgaSwgX2ksIF9sZW4sIF9yZWYxLCBfcmVzdWx0cywgX3Jlc3VsdHMxO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgX3JlZjEgPSAoZnVuY3Rpb24oKSB7XG4gICAgICBfcmVzdWx0czEgPSBbXTtcbiAgICAgIGZvciAodmFyIF9qID0gMCwgX3JlZiA9IGZsb29yKGFycmF5Lmxlbmd0aCAvIDIpOyAwIDw9IF9yZWYgPyBfaiA8IF9yZWYgOiBfaiA+IF9yZWY7IDAgPD0gX3JlZiA/IF9qKysgOiBfai0tKXsgX3Jlc3VsdHMxLnB1c2goX2opOyB9XG4gICAgICByZXR1cm4gX3Jlc3VsdHMxO1xuICAgIH0pLmFwcGx5KHRoaXMpLnJldmVyc2UoKTtcbiAgICBfcmVzdWx0cyA9IFtdO1xuICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZjEubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgIGkgPSBfcmVmMVtfaV07XG4gICAgICBfcmVzdWx0cy5wdXNoKF9zaWZ0dXAoYXJyYXksIGksIGNtcCkpO1xuICAgIH1cbiAgICByZXR1cm4gX3Jlc3VsdHM7XG4gIH07XG5cblxuICAvKlxuICBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBnaXZlbiBpdGVtIGluIHRoZSBoZWFwLlxuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZXZlcnkgdGltZSB0aGUgaXRlbSBpcyBiZWluZyBtb2RpZmllZC5cbiAgICovXG5cbiAgdXBkYXRlSXRlbSA9IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBjbXApIHtcbiAgICB2YXIgcG9zO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgcG9zID0gYXJyYXkuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAocG9zID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBfc2lmdGRvd24oYXJyYXksIDAsIHBvcywgY21wKTtcbiAgICByZXR1cm4gX3NpZnR1cChhcnJheSwgcG9zLCBjbXApO1xuICB9O1xuXG5cbiAgLypcbiAgRmluZCB0aGUgbiBsYXJnZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cbiAgICovXG5cbiAgbmxhcmdlc3QgPSBmdW5jdGlvbihhcnJheSwgbiwgY21wKSB7XG4gICAgdmFyIGVsZW0sIHJlc3VsdCwgX2ksIF9sZW4sIF9yZWY7XG4gICAgaWYgKGNtcCA9PSBudWxsKSB7XG4gICAgICBjbXAgPSBkZWZhdWx0Q21wO1xuICAgIH1cbiAgICByZXN1bHQgPSBhcnJheS5zbGljZSgwLCBuKTtcbiAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGhlYXBpZnkocmVzdWx0LCBjbXApO1xuICAgIF9yZWYgPSBhcnJheS5zbGljZShuKTtcbiAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgIGVsZW0gPSBfcmVmW19pXTtcbiAgICAgIGhlYXBwdXNocG9wKHJlc3VsdCwgZWxlbSwgY21wKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KGNtcCkucmV2ZXJzZSgpO1xuICB9O1xuXG5cbiAgLypcbiAgRmluZCB0aGUgbiBzbWFsbGVzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuXG4gICAqL1xuXG4gIG5zbWFsbGVzdCA9IGZ1bmN0aW9uKGFycmF5LCBuLCBjbXApIHtcbiAgICB2YXIgZWxlbSwgbG9zLCByZXN1bHQsIF9pLCBfaiwgX2xlbiwgX3JlZiwgX3JlZjEsIF9yZXN1bHRzO1xuICAgIGlmIChjbXAgPT0gbnVsbCkge1xuICAgICAgY21wID0gZGVmYXVsdENtcDtcbiAgICB9XG4gICAgaWYgKG4gKiAxMCA8PSBhcnJheS5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdCA9IGFycmF5LnNsaWNlKDAsIG4pLnNvcnQoY21wKTtcbiAgICAgIGlmICghcmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgbG9zID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgIF9yZWYgPSBhcnJheS5zbGljZShuKTtcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICBlbGVtID0gX3JlZltfaV07XG4gICAgICAgIGlmIChjbXAoZWxlbSwgbG9zKSA8IDApIHtcbiAgICAgICAgICBpbnNvcnQocmVzdWx0LCBlbGVtLCAwLCBudWxsLCBjbXApO1xuICAgICAgICAgIHJlc3VsdC5wb3AoKTtcbiAgICAgICAgICBsb3MgPSByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBoZWFwaWZ5KGFycmF5LCBjbXApO1xuICAgIF9yZXN1bHRzID0gW107XG4gICAgZm9yIChfaiA9IDAsIF9yZWYxID0gbWluKG4sIGFycmF5Lmxlbmd0aCk7IDAgPD0gX3JlZjEgPyBfaiA8IF9yZWYxIDogX2ogPiBfcmVmMTsgMCA8PSBfcmVmMSA/ICsrX2ogOiAtLV9qKSB7XG4gICAgICBfcmVzdWx0cy5wdXNoKGhlYXBwb3AoYXJyYXksIGNtcCkpO1xuICAgIH1cbiAgICByZXR1cm4gX3Jlc3VsdHM7XG4gIH07XG5cbiAgX3NpZnRkb3duID0gZnVuY3Rpb24oYXJyYXksIHN0YXJ0cG9zLCBwb3MsIGNtcCkge1xuICAgIHZhciBuZXdpdGVtLCBwYXJlbnQsIHBhcmVudHBvcztcbiAgICBpZiAoY21wID09IG51bGwpIHtcbiAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG4gICAgfVxuICAgIG5ld2l0ZW0gPSBhcnJheVtwb3NdO1xuICAgIHdoaWxlIChwb3MgPiBzdGFydHBvcykge1xuICAgICAgcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDE7XG4gICAgICBwYXJlbnQgPSBhcnJheVtwYXJlbnRwb3NdO1xuICAgICAgaWYgKGNtcChuZXdpdGVtLCBwYXJlbnQpIDwgMCkge1xuICAgICAgICBhcnJheVtwb3NdID0gcGFyZW50O1xuICAgICAgICBwb3MgPSBwYXJlbnRwb3M7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBhcnJheVtwb3NdID0gbmV3aXRlbTtcbiAgfTtcblxuICBfc2lmdHVwID0gZnVuY3Rpb24oYXJyYXksIHBvcywgY21wKSB7XG4gICAgdmFyIGNoaWxkcG9zLCBlbmRwb3MsIG5ld2l0ZW0sIHJpZ2h0cG9zLCBzdGFydHBvcztcbiAgICBpZiAoY21wID09IG51bGwpIHtcbiAgICAgIGNtcCA9IGRlZmF1bHRDbXA7XG4gICAgfVxuICAgIGVuZHBvcyA9IGFycmF5Lmxlbmd0aDtcbiAgICBzdGFydHBvcyA9IHBvcztcbiAgICBuZXdpdGVtID0gYXJyYXlbcG9zXTtcbiAgICBjaGlsZHBvcyA9IDIgKiBwb3MgKyAxO1xuICAgIHdoaWxlIChjaGlsZHBvcyA8IGVuZHBvcykge1xuICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDE7XG4gICAgICBpZiAocmlnaHRwb3MgPCBlbmRwb3MgJiYgIShjbXAoYXJyYXlbY2hpbGRwb3NdLCBhcnJheVtyaWdodHBvc10pIDwgMCkpIHtcbiAgICAgICAgY2hpbGRwb3MgPSByaWdodHBvcztcbiAgICAgIH1cbiAgICAgIGFycmF5W3Bvc10gPSBhcnJheVtjaGlsZHBvc107XG4gICAgICBwb3MgPSBjaGlsZHBvcztcbiAgICAgIGNoaWxkcG9zID0gMiAqIHBvcyArIDE7XG4gICAgfVxuICAgIGFycmF5W3Bvc10gPSBuZXdpdGVtO1xuICAgIHJldHVybiBfc2lmdGRvd24oYXJyYXksIHN0YXJ0cG9zLCBwb3MsIGNtcCk7XG4gIH07XG5cbiAgSGVhcCA9IChmdW5jdGlvbigpIHtcbiAgICBIZWFwLnB1c2ggPSBoZWFwcHVzaDtcblxuICAgIEhlYXAucG9wID0gaGVhcHBvcDtcblxuICAgIEhlYXAucmVwbGFjZSA9IGhlYXByZXBsYWNlO1xuXG4gICAgSGVhcC5wdXNocG9wID0gaGVhcHB1c2hwb3A7XG5cbiAgICBIZWFwLmhlYXBpZnkgPSBoZWFwaWZ5O1xuXG4gICAgSGVhcC51cGRhdGVJdGVtID0gdXBkYXRlSXRlbTtcblxuICAgIEhlYXAubmxhcmdlc3QgPSBubGFyZ2VzdDtcblxuICAgIEhlYXAubnNtYWxsZXN0ID0gbnNtYWxsZXN0O1xuXG4gICAgZnVuY3Rpb24gSGVhcChjbXApIHtcbiAgICAgIHRoaXMuY21wID0gY21wICE9IG51bGwgPyBjbXAgOiBkZWZhdWx0Q21wO1xuICAgICAgdGhpcy5ub2RlcyA9IFtdO1xuICAgIH1cblxuICAgIEhlYXAucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gaGVhcHB1c2godGhpcy5ub2RlcywgeCwgdGhpcy5jbXApO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBoZWFwcG9wKHRoaXMubm9kZXMsIHRoaXMuY21wKTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXNbMF07XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXMuaW5kZXhPZih4KSAhPT0gLTE7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLnJlcGxhY2UgPSBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gaGVhcHJlcGxhY2UodGhpcy5ub2RlcywgeCwgdGhpcy5jbXApO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5wdXNocG9wID0gZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIGhlYXBwdXNocG9wKHRoaXMubm9kZXMsIHgsIHRoaXMuY21wKTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUuaGVhcGlmeSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGhlYXBpZnkodGhpcy5ub2RlcywgdGhpcy5jbXApO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS51cGRhdGVJdGVtID0gZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIHVwZGF0ZUl0ZW0odGhpcy5ub2RlcywgeCwgdGhpcy5jbXApO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXMgPSBbXTtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUuZW1wdHkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzLmxlbmd0aCA9PT0gMDtcbiAgICB9O1xuXG4gICAgSGVhcC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXMubGVuZ3RoO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGhlYXA7XG4gICAgICBoZWFwID0gbmV3IEhlYXAoKTtcbiAgICAgIGhlYXAubm9kZXMgPSB0aGlzLm5vZGVzLnNsaWNlKDApO1xuICAgICAgcmV0dXJuIGhlYXA7XG4gICAgfTtcblxuICAgIEhlYXAucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzLnNsaWNlKDApO1xuICAgIH07XG5cbiAgICBIZWFwLnByb3RvdHlwZS5pbnNlcnQgPSBIZWFwLnByb3RvdHlwZS5wdXNoO1xuXG4gICAgSGVhcC5wcm90b3R5cGUudG9wID0gSGVhcC5wcm90b3R5cGUucGVlaztcblxuICAgIEhlYXAucHJvdG90eXBlLmZyb250ID0gSGVhcC5wcm90b3R5cGUucGVlaztcblxuICAgIEhlYXAucHJvdG90eXBlLmhhcyA9IEhlYXAucHJvdG90eXBlLmNvbnRhaW5zO1xuXG4gICAgSGVhcC5wcm90b3R5cGUuY29weSA9IEhlYXAucHJvdG90eXBlLmNsb25lO1xuXG4gICAgcmV0dXJuIEhlYXA7XG5cbiAgfSkoKTtcblxuICAoZnVuY3Rpb24ocm9vdCwgZmFjdG9yeSkge1xuICAgIHtcbiAgICAgIHJldHVybiBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9XG4gIH0pKHRoaXMsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBIZWFwO1xuICB9KTtcblxufSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcblxudmFyIGhlYXAgPSBoZWFwJDE7XG5cbnZhciBkaWprc3RyYURlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIHJvb3Q6IG51bGwsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgZGlyZWN0ZWQ6IGZhbHNlXG59KTtcbnZhciBlbGVzZm4kdSA9IHtcbiAgZGlqa3N0cmE6IGZ1bmN0aW9uIGRpamtzdHJhKG9wdGlvbnMpIHtcbiAgICBpZiAoIXBsYWluT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgIHJvb3Q6IGFyZ3NbMF0sXG4gICAgICAgIHdlaWdodDogYXJnc1sxXSxcbiAgICAgICAgZGlyZWN0ZWQ6IGFyZ3NbMl1cbiAgICAgIH07XG4gICAgfVxuICAgIHZhciBfZGlqa3N0cmFEZWZhdWx0cyA9IGRpamtzdHJhRGVmYXVsdHMob3B0aW9ucyksXG4gICAgICByb290ID0gX2RpamtzdHJhRGVmYXVsdHMucm9vdCxcbiAgICAgIHdlaWdodCA9IF9kaWprc3RyYURlZmF1bHRzLndlaWdodCxcbiAgICAgIGRpcmVjdGVkID0gX2RpamtzdHJhRGVmYXVsdHMuZGlyZWN0ZWQ7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciB3ZWlnaHRGbiA9IHdlaWdodDtcbiAgICB2YXIgc291cmNlID0gc3RyaW5nKHJvb3QpID8gdGhpcy5maWx0ZXIocm9vdClbMF0gOiByb290WzBdO1xuICAgIHZhciBkaXN0ID0ge307XG4gICAgdmFyIHByZXYgPSB7fTtcbiAgICB2YXIga25vd25EaXN0ID0ge307XG4gICAgdmFyIF90aGlzJGJ5R3JvdXAgPSB0aGlzLmJ5R3JvdXAoKSxcbiAgICAgIG5vZGVzID0gX3RoaXMkYnlHcm91cC5ub2RlcyxcbiAgICAgIGVkZ2VzID0gX3RoaXMkYnlHcm91cC5lZGdlcztcbiAgICBlZGdlcy51bm1lcmdlQnkoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc0xvb3AoKTtcbiAgICB9KTtcbiAgICB2YXIgZ2V0RGlzdCA9IGZ1bmN0aW9uIGdldERpc3Qobm9kZSkge1xuICAgICAgcmV0dXJuIGRpc3Rbbm9kZS5pZCgpXTtcbiAgICB9O1xuICAgIHZhciBzZXREaXN0ID0gZnVuY3Rpb24gc2V0RGlzdChub2RlLCBkKSB7XG4gICAgICBkaXN0W25vZGUuaWQoKV0gPSBkO1xuICAgICAgUS51cGRhdGVJdGVtKG5vZGUpO1xuICAgIH07XG4gICAgdmFyIFEgPSBuZXcgaGVhcChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGdldERpc3QoYSkgLSBnZXREaXN0KGIpO1xuICAgIH0pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICBkaXN0W25vZGUuaWQoKV0gPSBub2RlLnNhbWUoc291cmNlKSA/IDAgOiBJbmZpbml0eTtcbiAgICAgIFEucHVzaChub2RlKTtcbiAgICB9XG4gICAgdmFyIGRpc3RCZXR3ZWVuID0gZnVuY3Rpb24gZGlzdEJldHdlZW4odSwgdikge1xuICAgICAgdmFyIHV2cyA9IChkaXJlY3RlZCA/IHUuZWRnZXNUbyh2KSA6IHUuZWRnZXNXaXRoKHYpKS5pbnRlcnNlY3QoZWRnZXMpO1xuICAgICAgdmFyIHNtYWxsZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICAgIHZhciBzbWFsbGVzdEVkZ2U7XG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdXZzLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgZWRnZSA9IHV2c1tfaV07XG4gICAgICAgIHZhciBfd2VpZ2h0ID0gd2VpZ2h0Rm4oZWRnZSk7XG4gICAgICAgIGlmIChfd2VpZ2h0IDwgc21hbGxlc3REaXN0YW5jZSB8fCAhc21hbGxlc3RFZGdlKSB7XG4gICAgICAgICAgc21hbGxlc3REaXN0YW5jZSA9IF93ZWlnaHQ7XG4gICAgICAgICAgc21hbGxlc3RFZGdlID0gZWRnZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWRnZTogc21hbGxlc3RFZGdlLFxuICAgICAgICBkaXN0OiBzbWFsbGVzdERpc3RhbmNlXG4gICAgICB9O1xuICAgIH07XG4gICAgd2hpbGUgKFEuc2l6ZSgpID4gMCkge1xuICAgICAgdmFyIHUgPSBRLnBvcCgpO1xuICAgICAgdmFyIHNtYWxsZXRzRGlzdCA9IGdldERpc3QodSk7XG4gICAgICB2YXIgdWlkID0gdS5pZCgpO1xuICAgICAga25vd25EaXN0W3VpZF0gPSBzbWFsbGV0c0Rpc3Q7XG4gICAgICBpZiAoc21hbGxldHNEaXN0ID09PSBJbmZpbml0eSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBuZWlnaGJvcnMgPSB1Lm5laWdoYm9yaG9vZCgpLmludGVyc2VjdChub2Rlcyk7XG4gICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBuZWlnaGJvcnMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICB2YXIgdiA9IG5laWdoYm9yc1tfaTJdO1xuICAgICAgICB2YXIgdmlkID0gdi5pZCgpO1xuICAgICAgICB2YXIgdkRpc3QgPSBkaXN0QmV0d2Vlbih1LCB2KTtcbiAgICAgICAgdmFyIGFsdCA9IHNtYWxsZXRzRGlzdCArIHZEaXN0LmRpc3Q7XG4gICAgICAgIGlmIChhbHQgPCBnZXREaXN0KHYpKSB7XG4gICAgICAgICAgc2V0RGlzdCh2LCBhbHQpO1xuICAgICAgICAgIHByZXZbdmlkXSA9IHtcbiAgICAgICAgICAgIG5vZGU6IHUsXG4gICAgICAgICAgICBlZGdlOiB2RGlzdC5lZGdlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBmb3JcbiAgICB9IC8vIHdoaWxlXG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlzdGFuY2VUbzogZnVuY3Rpb24gZGlzdGFuY2VUbyhub2RlKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBzdHJpbmcobm9kZSkgPyBub2Rlcy5maWx0ZXIobm9kZSlbMF0gOiBub2RlWzBdO1xuICAgICAgICByZXR1cm4ga25vd25EaXN0W3RhcmdldC5pZCgpXTtcbiAgICAgIH0sXG4gICAgICBwYXRoVG86IGZ1bmN0aW9uIHBhdGhUbyhub2RlKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBzdHJpbmcobm9kZSkgPyBub2Rlcy5maWx0ZXIobm9kZSlbMF0gOiBub2RlWzBdO1xuICAgICAgICB2YXIgUyA9IFtdO1xuICAgICAgICB2YXIgdSA9IHRhcmdldDtcbiAgICAgICAgdmFyIHVpZCA9IHUuaWQoKTtcbiAgICAgICAgaWYgKHRhcmdldC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgUy51bnNoaWZ0KHRhcmdldCk7XG4gICAgICAgICAgd2hpbGUgKHByZXZbdWlkXSkge1xuICAgICAgICAgICAgdmFyIHAgPSBwcmV2W3VpZF07XG4gICAgICAgICAgICBTLnVuc2hpZnQocC5lZGdlKTtcbiAgICAgICAgICAgIFMudW5zaGlmdChwLm5vZGUpO1xuICAgICAgICAgICAgdSA9IHAubm9kZTtcbiAgICAgICAgICAgIHVpZCA9IHUuaWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZXMuc3Bhd24oUyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcblxudmFyIGVsZXNmbiR0ID0ge1xuICAvLyBrcnVza2FsJ3MgYWxnb3JpdGhtIChmaW5kcyBtaW4gc3Bhbm5pbmcgdHJlZSwgYXNzdW1pbmcgdW5kaXJlY3RlZCBncmFwaClcbiAgLy8gaW1wbGVtZW50ZWQgZnJvbSBwc2V1ZG9jb2RlIGZyb20gd2lraXBlZGlhXG4gIGtydXNrYWw6IGZ1bmN0aW9uIGtydXNrYWwod2VpZ2h0Rm4pIHtcbiAgICB3ZWlnaHRGbiA9IHdlaWdodEZuIHx8IGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9O1xuICAgIHZhciBfdGhpcyRieUdyb3VwID0gdGhpcy5ieUdyb3VwKCksXG4gICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXMsXG4gICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXM7XG4gICAgdmFyIG51bU5vZGVzID0gbm9kZXMubGVuZ3RoO1xuICAgIHZhciBmb3Jlc3QgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuICAgIHZhciBBID0gbm9kZXM7IC8vIGFzc3VtZXMgYnlHcm91cCgpIGNyZWF0ZXMgbmV3IGNvbGxlY3Rpb25zIHRoYXQgY2FuIGJlIHNhZmVseSBtdXRhdGVkXG5cbiAgICB2YXIgZmluZFNldEluZGV4ID0gZnVuY3Rpb24gZmluZFNldEluZGV4KGVsZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3Jlc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZXMgPSBmb3Jlc3RbaV07XG4gICAgICAgIGlmIChlbGVzLmhhcyhlbGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gc3RhcnQgd2l0aCBvbmUgZm9yZXN0IHBlciBub2RlXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1Ob2RlczsgaSsrKSB7XG4gICAgICBmb3Jlc3RbaV0gPSB0aGlzLnNwYXduKG5vZGVzW2ldKTtcbiAgICB9XG4gICAgdmFyIFMgPSBlZGdlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gd2VpZ2h0Rm4oYSkgLSB3ZWlnaHRGbihiKTtcbiAgICB9KTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgUy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBlZGdlID0gU1tfaV07XG4gICAgICB2YXIgdSA9IGVkZ2Uuc291cmNlKClbMF07XG4gICAgICB2YXIgdiA9IGVkZ2UudGFyZ2V0KClbMF07XG4gICAgICB2YXIgc2V0VUluZGV4ID0gZmluZFNldEluZGV4KHUpO1xuICAgICAgdmFyIHNldFZJbmRleCA9IGZpbmRTZXRJbmRleCh2KTtcbiAgICAgIHZhciBzZXRVID0gZm9yZXN0W3NldFVJbmRleF07XG4gICAgICB2YXIgc2V0ViA9IGZvcmVzdFtzZXRWSW5kZXhdO1xuICAgICAgaWYgKHNldFVJbmRleCAhPT0gc2V0VkluZGV4KSB7XG4gICAgICAgIEEubWVyZ2UoZWRnZSk7XG5cbiAgICAgICAgLy8gY29tYmluZSBmb3Jlc3RzIGZvciB1IGFuZCB2XG4gICAgICAgIHNldFUubWVyZ2Uoc2V0Vik7XG4gICAgICAgIGZvcmVzdC5zcGxpY2Uoc2V0VkluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEE7XG4gIH1cbn07XG5cbnZhciBhU3RhckRlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIHJvb3Q6IG51bGwsXG4gIGdvYWw6IG51bGwsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgaGV1cmlzdGljOiBmdW5jdGlvbiBoZXVyaXN0aWMoZWRnZSkge1xuICAgIHJldHVybiAwO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2Vcbn0pO1xudmFyIGVsZXNmbiRzID0ge1xuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHBzZXVkb2NvZGUgZnJvbSB3aWtpcGVkaWFcbiAgYVN0YXI6IGZ1bmN0aW9uIGFTdGFyKG9wdGlvbnMpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIF9hU3RhckRlZmF1bHRzID0gYVN0YXJEZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgIHJvb3QgPSBfYVN0YXJEZWZhdWx0cy5yb290LFxuICAgICAgZ29hbCA9IF9hU3RhckRlZmF1bHRzLmdvYWwsXG4gICAgICBoZXVyaXN0aWMgPSBfYVN0YXJEZWZhdWx0cy5oZXVyaXN0aWMsXG4gICAgICBkaXJlY3RlZCA9IF9hU3RhckRlZmF1bHRzLmRpcmVjdGVkLFxuICAgICAgd2VpZ2h0ID0gX2FTdGFyRGVmYXVsdHMud2VpZ2h0O1xuICAgIHJvb3QgPSBjeS5jb2xsZWN0aW9uKHJvb3QpWzBdO1xuICAgIGdvYWwgPSBjeS5jb2xsZWN0aW9uKGdvYWwpWzBdO1xuICAgIHZhciBzaWQgPSByb290LmlkKCk7XG4gICAgdmFyIHRpZCA9IGdvYWwuaWQoKTtcbiAgICB2YXIgZ1Njb3JlID0ge307XG4gICAgdmFyIGZTY29yZSA9IHt9O1xuICAgIHZhciBjbG9zZWRTZXRJZHMgPSB7fTtcbiAgICB2YXIgb3BlblNldCA9IG5ldyBoZWFwKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZlNjb3JlW2EuaWQoKV0gLSBmU2NvcmVbYi5pZCgpXTtcbiAgICB9KTtcbiAgICB2YXIgb3BlblNldElkcyA9IG5ldyBTZXQkMSgpO1xuICAgIHZhciBjYW1lRnJvbSA9IHt9O1xuICAgIHZhciBjYW1lRnJvbUVkZ2UgPSB7fTtcbiAgICB2YXIgYWRkVG9PcGVuU2V0ID0gZnVuY3Rpb24gYWRkVG9PcGVuU2V0KGVsZSwgaWQpIHtcbiAgICAgIG9wZW5TZXQucHVzaChlbGUpO1xuICAgICAgb3BlblNldElkcy5hZGQoaWQpO1xuICAgIH07XG4gICAgdmFyIGNNaW4sIGNNaW5JZDtcbiAgICB2YXIgcG9wRnJvbU9wZW5TZXQgPSBmdW5jdGlvbiBwb3BGcm9tT3BlblNldCgpIHtcbiAgICAgIGNNaW4gPSBvcGVuU2V0LnBvcCgpO1xuICAgICAgY01pbklkID0gY01pbi5pZCgpO1xuICAgICAgb3BlblNldElkc1tcImRlbGV0ZVwiXShjTWluSWQpO1xuICAgIH07XG4gICAgdmFyIGlzSW5PcGVuU2V0ID0gZnVuY3Rpb24gaXNJbk9wZW5TZXQoaWQpIHtcbiAgICAgIHJldHVybiBvcGVuU2V0SWRzLmhhcyhpZCk7XG4gICAgfTtcbiAgICBhZGRUb09wZW5TZXQocm9vdCwgc2lkKTtcbiAgICBnU2NvcmVbc2lkXSA9IDA7XG4gICAgZlNjb3JlW3NpZF0gPSBoZXVyaXN0aWMocm9vdCk7XG5cbiAgICAvLyBDb3VudGVyXG4gICAgdmFyIHN0ZXBzID0gMDtcblxuICAgIC8vIE1haW4gbG9vcFxuICAgIHdoaWxlIChvcGVuU2V0LnNpemUoKSA+IDApIHtcbiAgICAgIHBvcEZyb21PcGVuU2V0KCk7XG4gICAgICBzdGVwcysrO1xuXG4gICAgICAvLyBJZiB3ZSd2ZSBmb3VuZCBvdXIgZ29hbCwgdGhlbiB3ZSBhcmUgZG9uZVxuICAgICAgaWYgKGNNaW5JZCA9PT0gdGlkKSB7XG4gICAgICAgIHZhciBwYXRoID0gW107XG4gICAgICAgIHZhciBwYXRoTm9kZSA9IGdvYWw7XG4gICAgICAgIHZhciBwYXRoTm9kZUlkID0gdGlkO1xuICAgICAgICB2YXIgcGF0aEVkZ2UgPSBjYW1lRnJvbUVkZ2VbcGF0aE5vZGVJZF07XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBwYXRoLnVuc2hpZnQocGF0aE5vZGUpO1xuICAgICAgICAgIGlmIChwYXRoRWRnZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBwYXRoLnVuc2hpZnQocGF0aEVkZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRoTm9kZSA9IGNhbWVGcm9tW3BhdGhOb2RlSWRdO1xuICAgICAgICAgIGlmIChwYXRoTm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcGF0aE5vZGVJZCA9IHBhdGhOb2RlLmlkKCk7XG4gICAgICAgICAgcGF0aEVkZ2UgPSBjYW1lRnJvbUVkZ2VbcGF0aE5vZGVJZF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmb3VuZDogdHJ1ZSxcbiAgICAgICAgICBkaXN0YW5jZTogZ1Njb3JlW2NNaW5JZF0sXG4gICAgICAgICAgcGF0aDogdGhpcy5zcGF3bihwYXRoKSxcbiAgICAgICAgICBzdGVwczogc3RlcHNcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGNNaW4gdG8gcHJvY2Vzc2VkIG5vZGVzXG4gICAgICBjbG9zZWRTZXRJZHNbY01pbklkXSA9IHRydWU7XG5cbiAgICAgIC8vIFVwZGF0ZSBzY29yZXMgZm9yIG5laWdoYm9ycyBvZiBjTWluXG4gICAgICAvLyBUYWtlIGludG8gYWNjb3VudCBpZiBncmFwaCBpcyBkaXJlY3RlZCBvciBub3RcbiAgICAgIHZhciB2d0VkZ2VzID0gY01pbi5fcHJpdmF0ZS5lZGdlcztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdndFZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZSA9IHZ3RWRnZXNbaV07XG5cbiAgICAgICAgLy8gZWRnZSBtdXN0IGJlIGluIHNldCBvZiBjYWxsaW5nIGVsZXNcbiAgICAgICAgaWYgKCF0aGlzLmhhc0VsZW1lbnRXaXRoSWQoZS5pZCgpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY01pbiBtdXN0IGJlIHRoZSBzb3VyY2Ugb2YgZWRnZSBpZiBkaXJlY3RlZFxuICAgICAgICBpZiAoZGlyZWN0ZWQgJiYgZS5kYXRhKCdzb3VyY2UnKSAhPT0gY01pbklkKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdTcmMgPSBlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgd1RndCA9IGUudGFyZ2V0KCk7XG4gICAgICAgIHZhciB3ID0gd1NyYy5pZCgpICE9PSBjTWluSWQgPyB3U3JjIDogd1RndDtcbiAgICAgICAgdmFyIHdpZCA9IHcuaWQoKTtcblxuICAgICAgICAvLyBub2RlIG11c3QgYmUgaW4gc2V0IG9mIGNhbGxpbmcgZWxlc1xuICAgICAgICBpZiAoIXRoaXMuaGFzRWxlbWVudFdpdGhJZCh3aWQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBub2RlIGlzIGluIGNsb3NlZFNldCwgaWdub3JlIGl0XG4gICAgICAgIGlmIChjbG9zZWRTZXRJZHNbd2lkXSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTmV3IHRlbnRhdGl2ZSBzY29yZSBmb3Igbm9kZSB3XG4gICAgICAgIHZhciB0ZW1wU2NvcmUgPSBnU2NvcmVbY01pbklkXSArIHdlaWdodChlKTtcblxuICAgICAgICAvLyBVcGRhdGUgZ1Njb3JlIGZvciBub2RlIHcgaWY6XG4gICAgICAgIC8vICAgdyBub3QgcHJlc2VudCBpbiBvcGVuU2V0XG4gICAgICAgIC8vIE9SXG4gICAgICAgIC8vICAgdGVudGF0aXZlIGdTY29yZSBpcyBsZXNzIHRoYW4gcHJldmlvdXMgdmFsdWVcblxuICAgICAgICAvLyB3IG5vdCBpbiBvcGVuU2V0XG4gICAgICAgIGlmICghaXNJbk9wZW5TZXQod2lkKSkge1xuICAgICAgICAgIGdTY29yZVt3aWRdID0gdGVtcFNjb3JlO1xuICAgICAgICAgIGZTY29yZVt3aWRdID0gdGVtcFNjb3JlICsgaGV1cmlzdGljKHcpO1xuICAgICAgICAgIGFkZFRvT3BlblNldCh3LCB3aWQpO1xuICAgICAgICAgIGNhbWVGcm9tW3dpZF0gPSBjTWluO1xuICAgICAgICAgIGNhbWVGcm9tRWRnZVt3aWRdID0gZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHcgYWxyZWFkeSBpbiBvcGVuU2V0LCBidXQgd2l0aCBncmVhdGVyIGdTY29yZVxuICAgICAgICBpZiAodGVtcFNjb3JlIDwgZ1Njb3JlW3dpZF0pIHtcbiAgICAgICAgICBnU2NvcmVbd2lkXSA9IHRlbXBTY29yZTtcbiAgICAgICAgICBmU2NvcmVbd2lkXSA9IHRlbXBTY29yZSArIGhldXJpc3RpYyh3KTtcbiAgICAgICAgICBjYW1lRnJvbVt3aWRdID0gY01pbjtcbiAgICAgICAgICBjYW1lRnJvbUVkZ2Vbd2lkXSA9IGU7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gRW5kIG9mIG5laWdoYm9ycyB1cGRhdGVcbiAgICB9IC8vIEVuZCBvZiBtYWluIGxvb3BcblxuICAgIC8vIElmIHdlJ3ZlIHJlYWNoZWQgaGVyZSwgdGhlbiB3ZSd2ZSBub3QgcmVhY2hlZCBvdXIgZ29hbFxuICAgIHJldHVybiB7XG4gICAgICBmb3VuZDogZmFsc2UsXG4gICAgICBkaXN0YW5jZTogdW5kZWZpbmVkLFxuICAgICAgcGF0aDogdW5kZWZpbmVkLFxuICAgICAgc3RlcHM6IHN0ZXBzXG4gICAgfTtcbiAgfVxufTsgLy8gZWxlc2ZuXG5cbnZhciBmbG95ZFdhcnNoYWxsRGVmYXVsdHMgPSBkZWZhdWx0cyRnKHtcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2Vcbn0pO1xudmFyIGVsZXNmbiRyID0ge1xuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHBzZXVkb2NvZGUgZnJvbSB3aWtpcGVkaWFcbiAgZmxveWRXYXJzaGFsbDogZnVuY3Rpb24gZmxveWRXYXJzaGFsbChvcHRpb25zKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBfZmxveWRXYXJzaGFsbERlZmF1bHQgPSBmbG95ZFdhcnNoYWxsRGVmYXVsdHMob3B0aW9ucyksXG4gICAgICB3ZWlnaHQgPSBfZmxveWRXYXJzaGFsbERlZmF1bHQud2VpZ2h0LFxuICAgICAgZGlyZWN0ZWQgPSBfZmxveWRXYXJzaGFsbERlZmF1bHQuZGlyZWN0ZWQ7XG4gICAgdmFyIHdlaWdodEZuID0gd2VpZ2h0O1xuICAgIHZhciBfdGhpcyRieUdyb3VwID0gdGhpcy5ieUdyb3VwKCksXG4gICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXMsXG4gICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXM7XG4gICAgdmFyIE4gPSBub2Rlcy5sZW5ndGg7XG4gICAgdmFyIE5zcSA9IE4gKiBOO1xuICAgIHZhciBpbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZihub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZXMuaW5kZXhPZihub2RlKTtcbiAgICB9O1xuICAgIHZhciBhdEluZGV4ID0gZnVuY3Rpb24gYXRJbmRleChpKSB7XG4gICAgICByZXR1cm4gbm9kZXNbaV07XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgZGlzdGFuY2UgbWF0cml4XG4gICAgdmFyIGRpc3QgPSBuZXcgQXJyYXkoTnNxKTtcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IE5zcTsgbisrKSB7XG4gICAgICB2YXIgaiA9IG4gJSBOO1xuICAgICAgdmFyIGkgPSAobiAtIGopIC8gTjtcbiAgICAgIGlmIChpID09PSBqKSB7XG4gICAgICAgIGRpc3Rbbl0gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzdFtuXSA9IEluZmluaXR5O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgbWF0cml4IHVzZWQgZm9yIHBhdGggcmVjb25zdHJ1Y3Rpb25cbiAgICAvLyBJbml0aWFsaXplIGRpc3RhbmNlIG1hdHJpeFxuICAgIHZhciBuZXh0ID0gbmV3IEFycmF5KE5zcSk7XG4gICAgdmFyIGVkZ2VOZXh0ID0gbmV3IEFycmF5KE5zcSk7XG5cbiAgICAvLyBQcm9jZXNzIGVkZ2VzXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGVkZ2VzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tfaV07XG4gICAgICB2YXIgc3JjID0gZWRnZS5zb3VyY2UoKVswXTtcbiAgICAgIHZhciB0Z3QgPSBlZGdlLnRhcmdldCgpWzBdO1xuICAgICAgaWYgKHNyYyA9PT0gdGd0KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBleGNsdWRlIGxvb3BzXG5cbiAgICAgIHZhciBzID0gaW5kZXhPZihzcmMpO1xuICAgICAgdmFyIHQgPSBpbmRleE9mKHRndCk7XG4gICAgICB2YXIgc3QgPSBzICogTiArIHQ7IC8vIHNvdXJjZSB0byB0YXJnZXQgaW5kZXhcbiAgICAgIHZhciBfd2VpZ2h0ID0gd2VpZ2h0Rm4oZWRnZSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgcHJvY2VzcyBhbm90aGVyIGVkZ2UgYmV0d2VlbiBzYW1lIDIgbm9kZXNcbiAgICAgIGlmIChkaXN0W3N0XSA+IF93ZWlnaHQpIHtcbiAgICAgICAgZGlzdFtzdF0gPSBfd2VpZ2h0O1xuICAgICAgICBuZXh0W3N0XSA9IHQ7XG4gICAgICAgIGVkZ2VOZXh0W3N0XSA9IGVkZ2U7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHVuZGlyZWN0ZWQgZ3JhcGgsIHByb2Nlc3MgJ3JldmVyc2VkJyBlZGdlXG4gICAgICBpZiAoIWRpcmVjdGVkKSB7XG4gICAgICAgIHZhciB0cyA9IHQgKiBOICsgczsgLy8gdGFyZ2V0IHRvIHNvdXJjZSBpbmRleFxuXG4gICAgICAgIGlmICghZGlyZWN0ZWQgJiYgZGlzdFt0c10gPiBfd2VpZ2h0KSB7XG4gICAgICAgICAgZGlzdFt0c10gPSBfd2VpZ2h0O1xuICAgICAgICAgIG5leHRbdHNdID0gcztcbiAgICAgICAgICBlZGdlTmV4dFt0c10gPSBlZGdlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWFpbiBsb29wXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBOOyBrKyspIHtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IE47IF9pMisrKSB7XG4gICAgICAgIHZhciBpayA9IF9pMiAqIE4gKyBrO1xuICAgICAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgTjsgX2orKykge1xuICAgICAgICAgIHZhciBpaiA9IF9pMiAqIE4gKyBfajtcbiAgICAgICAgICB2YXIga2ogPSBrICogTiArIF9qO1xuICAgICAgICAgIGlmIChkaXN0W2lrXSArIGRpc3Rba2pdIDwgZGlzdFtpal0pIHtcbiAgICAgICAgICAgIGRpc3RbaWpdID0gZGlzdFtpa10gKyBkaXN0W2tqXTtcbiAgICAgICAgICAgIG5leHRbaWpdID0gbmV4dFtpa107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBnZXRBcmdFbGUgPSBmdW5jdGlvbiBnZXRBcmdFbGUoZWxlKSB7XG4gICAgICByZXR1cm4gKHN0cmluZyhlbGUpID8gY3kuZmlsdGVyKGVsZSkgOiBlbGUpWzBdO1xuICAgIH07XG4gICAgdmFyIGluZGV4T2ZBcmdFbGUgPSBmdW5jdGlvbiBpbmRleE9mQXJnRWxlKGVsZSkge1xuICAgICAgcmV0dXJuIGluZGV4T2YoZ2V0QXJnRWxlKGVsZSkpO1xuICAgIH07XG4gICAgdmFyIHJlcyA9IHtcbiAgICAgIGRpc3RhbmNlOiBmdW5jdGlvbiBkaXN0YW5jZShmcm9tLCB0bykge1xuICAgICAgICB2YXIgaSA9IGluZGV4T2ZBcmdFbGUoZnJvbSk7XG4gICAgICAgIHZhciBqID0gaW5kZXhPZkFyZ0VsZSh0byk7XG4gICAgICAgIHJldHVybiBkaXN0W2kgKiBOICsgal07XG4gICAgICB9LFxuICAgICAgcGF0aDogZnVuY3Rpb24gcGF0aChmcm9tLCB0bykge1xuICAgICAgICB2YXIgaSA9IGluZGV4T2ZBcmdFbGUoZnJvbSk7XG4gICAgICAgIHZhciBqID0gaW5kZXhPZkFyZ0VsZSh0byk7XG4gICAgICAgIHZhciBmcm9tTm9kZSA9IGF0SW5kZXgoaSk7XG4gICAgICAgIGlmIChpID09PSBqKSB7XG4gICAgICAgICAgcmV0dXJuIGZyb21Ob2RlLmNvbGxlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV4dFtpICogTiArIGpdID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXRoID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICB2YXIgcHJldiA9IGk7XG4gICAgICAgIHZhciBlZGdlO1xuICAgICAgICBwYXRoLm1lcmdlKGZyb21Ob2RlKTtcbiAgICAgICAgd2hpbGUgKGkgIT09IGopIHtcbiAgICAgICAgICBwcmV2ID0gaTtcbiAgICAgICAgICBpID0gbmV4dFtpICogTiArIGpdO1xuICAgICAgICAgIGVkZ2UgPSBlZGdlTmV4dFtwcmV2ICogTiArIGldO1xuICAgICAgICAgIHBhdGgubWVyZ2UoZWRnZSk7XG4gICAgICAgICAgcGF0aC5tZXJnZShhdEluZGV4KGkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiByZXM7XG4gIH0gLy8gZmxveWRXYXJzaGFsbFxufTsgLy8gZWxlc2ZuXG5cbnZhciBiZWxsbWFuRm9yZERlZmF1bHRzID0gZGVmYXVsdHMkZyh7XG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfSxcbiAgZGlyZWN0ZWQ6IGZhbHNlLFxuICByb290OiBudWxsXG59KTtcbnZhciBlbGVzZm4kcSA9IHtcbiAgLy8gSW1wbGVtZW50ZWQgZnJvbSBwc2V1ZG9jb2RlIGZyb20gd2lraXBlZGlhXG4gIGJlbGxtYW5Gb3JkOiBmdW5jdGlvbiBiZWxsbWFuRm9yZChvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB2YXIgX2JlbGxtYW5Gb3JkRGVmYXVsdHMgPSBiZWxsbWFuRm9yZERlZmF1bHRzKG9wdGlvbnMpLFxuICAgICAgd2VpZ2h0ID0gX2JlbGxtYW5Gb3JkRGVmYXVsdHMud2VpZ2h0LFxuICAgICAgZGlyZWN0ZWQgPSBfYmVsbG1hbkZvcmREZWZhdWx0cy5kaXJlY3RlZCxcbiAgICAgIHJvb3QgPSBfYmVsbG1hbkZvcmREZWZhdWx0cy5yb290O1xuICAgIHZhciB3ZWlnaHRGbiA9IHdlaWdodDtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBfdGhpcyRieUdyb3VwID0gdGhpcy5ieUdyb3VwKCksXG4gICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXMsXG4gICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXM7XG4gICAgdmFyIG51bU5vZGVzID0gbm9kZXMubGVuZ3RoO1xuICAgIHZhciBpbmZvTWFwID0gbmV3IE1hcCQyKCk7XG4gICAgdmFyIGhhc05lZ2F0aXZlV2VpZ2h0Q3ljbGUgPSBmYWxzZTtcbiAgICB2YXIgbmVnYXRpdmVXZWlnaHRDeWNsZXMgPSBbXTtcbiAgICByb290ID0gY3kuY29sbGVjdGlvbihyb290KVswXTsgLy8gaW4gY2FzZSBzZWxlY3RvciBwYXNzZWRcblxuICAgIGVkZ2VzLnVubWVyZ2VCeShmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgcmV0dXJuIGVkZ2UuaXNMb29wKCk7XG4gICAgfSk7XG4gICAgdmFyIG51bUVkZ2VzID0gZWRnZXMubGVuZ3RoO1xuICAgIHZhciBnZXRJbmZvID0gZnVuY3Rpb24gZ2V0SW5mbyhub2RlKSB7XG4gICAgICB2YXIgb2JqID0gaW5mb01hcC5nZXQobm9kZS5pZCgpKTtcbiAgICAgIGlmICghb2JqKSB7XG4gICAgICAgIG9iaiA9IHt9O1xuICAgICAgICBpbmZvTWFwLnNldChub2RlLmlkKCksIG9iaik7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH07XG4gICAgdmFyIGdldE5vZGVGcm9tVG8gPSBmdW5jdGlvbiBnZXROb2RlRnJvbVRvKHRvKSB7XG4gICAgICByZXR1cm4gKHN0cmluZyh0bykgPyBjeS4kKHRvKSA6IHRvKVswXTtcbiAgICB9O1xuICAgIHZhciBkaXN0YW5jZVRvID0gZnVuY3Rpb24gZGlzdGFuY2VUbyh0bykge1xuICAgICAgcmV0dXJuIGdldEluZm8oZ2V0Tm9kZUZyb21Ubyh0bykpLmRpc3Q7XG4gICAgfTtcbiAgICB2YXIgcGF0aFRvID0gZnVuY3Rpb24gcGF0aFRvKHRvKSB7XG4gICAgICB2YXIgdGhpc1N0YXJ0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiByb290O1xuICAgICAgdmFyIGVuZCA9IGdldE5vZGVGcm9tVG8odG8pO1xuICAgICAgdmFyIHBhdGggPSBbXTtcbiAgICAgIHZhciBub2RlID0gZW5kO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLnNwYXduKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9nZXRJbmZvID0gZ2V0SW5mbyhub2RlKSxcbiAgICAgICAgICBlZGdlID0gX2dldEluZm8uZWRnZSxcbiAgICAgICAgICBwcmVkID0gX2dldEluZm8ucHJlZDtcbiAgICAgICAgcGF0aC51bnNoaWZ0KG5vZGVbMF0pO1xuICAgICAgICBpZiAobm9kZS5zYW1lKHRoaXNTdGFydCkgJiYgcGF0aC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVkZ2UgIT0gbnVsbCkge1xuICAgICAgICAgIHBhdGgudW5zaGlmdChlZGdlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gcHJlZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGVzLnNwYXduKHBhdGgpO1xuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXphdGlvbnMgeyBkaXN0LCBwcmVkLCBlZGdlIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bU5vZGVzOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICB2YXIgaW5mbyA9IGdldEluZm8obm9kZSk7XG4gICAgICBpZiAobm9kZS5zYW1lKHJvb3QpKSB7XG4gICAgICAgIGluZm8uZGlzdCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmZvLmRpc3QgPSBJbmZpbml0eTtcbiAgICAgIH1cbiAgICAgIGluZm8ucHJlZCA9IG51bGw7XG4gICAgICBpbmZvLmVkZ2UgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIEVkZ2VzIHJlbGF4YXRpb25cbiAgICB2YXIgcmVwbGFjZWRFZGdlID0gZmFsc2U7XG4gICAgdmFyIGNoZWNrRm9yRWRnZVJlcGxhY2VtZW50ID0gZnVuY3Rpb24gY2hlY2tGb3JFZGdlUmVwbGFjZW1lbnQobm9kZTEsIG5vZGUyLCBlZGdlLCBpbmZvMSwgaW5mbzIsIHdlaWdodCkge1xuICAgICAgdmFyIGRpc3QgPSBpbmZvMS5kaXN0ICsgd2VpZ2h0O1xuICAgICAgaWYgKGRpc3QgPCBpbmZvMi5kaXN0ICYmICFlZGdlLnNhbWUoaW5mbzEuZWRnZSkpIHtcbiAgICAgICAgaW5mbzIuZGlzdCA9IGRpc3Q7XG4gICAgICAgIGluZm8yLnByZWQgPSBub2RlMTtcbiAgICAgICAgaW5mbzIuZWRnZSA9IGVkZ2U7XG4gICAgICAgIHJlcGxhY2VkRWRnZSA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgbnVtTm9kZXM7IF9pKyspIHtcbiAgICAgIHJlcGxhY2VkRWRnZSA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgZSA9IDA7IGUgPCBudW1FZGdlczsgZSsrKSB7XG4gICAgICAgIHZhciBlZGdlID0gZWRnZXNbZV07XG4gICAgICAgIHZhciBzcmMgPSBlZGdlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgdGd0ID0gZWRnZS50YXJnZXQoKTtcbiAgICAgICAgdmFyIF93ZWlnaHQgPSB3ZWlnaHRGbihlZGdlKTtcbiAgICAgICAgdmFyIHNyY0luZm8gPSBnZXRJbmZvKHNyYyk7XG4gICAgICAgIHZhciB0Z3RJbmZvID0gZ2V0SW5mbyh0Z3QpO1xuICAgICAgICBjaGVja0ZvckVkZ2VSZXBsYWNlbWVudChzcmMsIHRndCwgZWRnZSwgc3JjSW5mbywgdGd0SW5mbywgX3dlaWdodCk7XG5cbiAgICAgICAgLy8gSWYgdW5kaXJlY3RlZCBncmFwaCwgd2UgbmVlZCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgJ3JldmVyc2UnIGVkZ2VcbiAgICAgICAgaWYgKCFkaXJlY3RlZCkge1xuICAgICAgICAgIGNoZWNrRm9yRWRnZVJlcGxhY2VtZW50KHRndCwgc3JjLCBlZGdlLCB0Z3RJbmZvLCBzcmNJbmZvLCBfd2VpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFyZXBsYWNlZEVkZ2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXBsYWNlZEVkZ2UpIHtcbiAgICAgIC8vIENoZWNrIGZvciBuZWdhdGl2ZSB3ZWlnaHQgY3ljbGVzXG4gICAgICB2YXIgbmVnYXRpdmVXZWlnaHRDeWNsZUlkcyA9IFtdO1xuICAgICAgZm9yICh2YXIgX2UgPSAwOyBfZSA8IG51bUVkZ2VzOyBfZSsrKSB7XG4gICAgICAgIHZhciBfZWRnZSA9IGVkZ2VzW19lXTtcbiAgICAgICAgdmFyIF9zcmMgPSBfZWRnZS5zb3VyY2UoKTtcbiAgICAgICAgdmFyIF90Z3QgPSBfZWRnZS50YXJnZXQoKTtcbiAgICAgICAgdmFyIF93ZWlnaHQyID0gd2VpZ2h0Rm4oX2VkZ2UpO1xuICAgICAgICB2YXIgc3JjRGlzdCA9IGdldEluZm8oX3NyYykuZGlzdDtcbiAgICAgICAgdmFyIHRndERpc3QgPSBnZXRJbmZvKF90Z3QpLmRpc3Q7XG4gICAgICAgIGlmIChzcmNEaXN0ICsgX3dlaWdodDIgPCB0Z3REaXN0IHx8ICFkaXJlY3RlZCAmJiB0Z3REaXN0ICsgX3dlaWdodDIgPCBzcmNEaXN0KSB7XG4gICAgICAgICAgaWYgKCFoYXNOZWdhdGl2ZVdlaWdodEN5Y2xlKSB7XG4gICAgICAgICAgICB3YXJuKCdHcmFwaCBjb250YWlucyBhIG5lZ2F0aXZlIHdlaWdodCBjeWNsZSBmb3IgQmVsbG1hbi1Gb3JkJyk7XG4gICAgICAgICAgICBoYXNOZWdhdGl2ZVdlaWdodEN5Y2xlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9wdGlvbnMuZmluZE5lZ2F0aXZlV2VpZ2h0Q3ljbGVzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdmFyIG5lZ2F0aXZlTm9kZXMgPSBbXTtcbiAgICAgICAgICAgIGlmIChzcmNEaXN0ICsgX3dlaWdodDIgPCB0Z3REaXN0KSB7XG4gICAgICAgICAgICAgIG5lZ2F0aXZlTm9kZXMucHVzaChfc3JjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZGlyZWN0ZWQgJiYgdGd0RGlzdCArIF93ZWlnaHQyIDwgc3JjRGlzdCkge1xuICAgICAgICAgICAgICBuZWdhdGl2ZU5vZGVzLnB1c2goX3RndCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbnVtTmVnYXRpdmVOb2RlcyA9IG5lZ2F0aXZlTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBudW1OZWdhdGl2ZU5vZGVzOyBuKyspIHtcbiAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gbmVnYXRpdmVOb2Rlc1tuXTtcbiAgICAgICAgICAgICAgdmFyIGN5Y2xlID0gW3N0YXJ0XTtcbiAgICAgICAgICAgICAgY3ljbGUucHVzaChnZXRJbmZvKHN0YXJ0KS5lZGdlKTtcbiAgICAgICAgICAgICAgdmFyIF9ub2RlID0gZ2V0SW5mbyhzdGFydCkucHJlZDtcbiAgICAgICAgICAgICAgd2hpbGUgKGN5Y2xlLmluZGV4T2YoX25vZGUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGN5Y2xlLnB1c2goX25vZGUpO1xuICAgICAgICAgICAgICAgIGN5Y2xlLnB1c2goZ2V0SW5mbyhfbm9kZSkuZWRnZSk7XG4gICAgICAgICAgICAgICAgX25vZGUgPSBnZXRJbmZvKF9ub2RlKS5wcmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGN5Y2xlID0gY3ljbGUuc2xpY2UoY3ljbGUuaW5kZXhPZihfbm9kZSkpO1xuICAgICAgICAgICAgICB2YXIgc21hbGxlc3RJZCA9IGN5Y2xlWzBdLmlkKCk7XG4gICAgICAgICAgICAgIHZhciBzbWFsbGVzdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgZm9yICh2YXIgYyA9IDI7IGMgPCBjeWNsZS5sZW5ndGg7IGMgKz0gMikge1xuICAgICAgICAgICAgICAgIGlmIChjeWNsZVtjXS5pZCgpIDwgc21hbGxlc3RJZCkge1xuICAgICAgICAgICAgICAgICAgc21hbGxlc3RJZCA9IGN5Y2xlW2NdLmlkKCk7XG4gICAgICAgICAgICAgICAgICBzbWFsbGVzdEluZGV4ID0gYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY3ljbGUgPSBjeWNsZS5zbGljZShzbWFsbGVzdEluZGV4KS5jb25jYXQoY3ljbGUuc2xpY2UoMCwgc21hbGxlc3RJbmRleCkpO1xuICAgICAgICAgICAgICBjeWNsZS5wdXNoKGN5Y2xlWzBdKTtcbiAgICAgICAgICAgICAgdmFyIGN5Y2xlSWQgPSBjeWNsZS5tYXAoZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsLmlkKCk7XG4gICAgICAgICAgICAgIH0pLmpvaW4oXCIsXCIpO1xuICAgICAgICAgICAgICBpZiAobmVnYXRpdmVXZWlnaHRDeWNsZUlkcy5pbmRleE9mKGN5Y2xlSWQpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG5lZ2F0aXZlV2VpZ2h0Q3ljbGVzLnB1c2goZWxlcy5zcGF3bihjeWNsZSkpO1xuICAgICAgICAgICAgICAgIG5lZ2F0aXZlV2VpZ2h0Q3ljbGVJZHMucHVzaChjeWNsZUlkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3RhbmNlVG86IGRpc3RhbmNlVG8sXG4gICAgICBwYXRoVG86IHBhdGhUbyxcbiAgICAgIGhhc05lZ2F0aXZlV2VpZ2h0Q3ljbGU6IGhhc05lZ2F0aXZlV2VpZ2h0Q3ljbGUsXG4gICAgICBuZWdhdGl2ZVdlaWdodEN5Y2xlczogbmVnYXRpdmVXZWlnaHRDeWNsZXNcbiAgICB9O1xuICB9IC8vIGJlbGxtYW5Gb3JkXG59OyAvLyBlbGVzZm5cblxudmFyIHNxcnQyID0gTWF0aC5zcXJ0KDIpO1xuXG4vLyBGdW5jdGlvbiB3aGljaCBjb2xhcHNlcyAyIChtZXRhKSBub2RlcyBpbnRvIG9uZVxuLy8gVXBkYXRlcyB0aGUgcmVtYWluaW5nIGVkZ2UgbGlzdHNcbi8vIFJlY2VpdmVzIGFzIGEgcGFyYW1hdGVyIHRoZSBlZGdlIHdoaWNoIGNhdXNlcyB0aGUgY29sbGFwc2VcbnZhciBjb2xsYXBzZSA9IGZ1bmN0aW9uIGNvbGxhcHNlKGVkZ2VJbmRleCwgbm9kZU1hcCwgcmVtYWluaW5nRWRnZXMpIHtcbiAgaWYgKHJlbWFpbmluZ0VkZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGVycm9yKFwiS2FyZ2VyLVN0ZWluIG11c3QgYmUgcnVuIG9uIGEgY29ubmVjdGVkIChzdWIpZ3JhcGhcIik7XG4gIH1cbiAgdmFyIGVkZ2VJbmZvID0gcmVtYWluaW5nRWRnZXNbZWRnZUluZGV4XTtcbiAgdmFyIHNvdXJjZUluID0gZWRnZUluZm9bMV07XG4gIHZhciB0YXJnZXRJbiA9IGVkZ2VJbmZvWzJdO1xuICB2YXIgcGFydGl0aW9uMSA9IG5vZGVNYXBbc291cmNlSW5dO1xuICB2YXIgcGFydGl0aW9uMiA9IG5vZGVNYXBbdGFyZ2V0SW5dO1xuICB2YXIgbmV3RWRnZXMgPSByZW1haW5pbmdFZGdlczsgLy8gcmUtdXNlIGFycmF5XG5cbiAgLy8gRGVsZXRlIGFsbCBlZGdlcyBiZXR3ZWVuIHBhcnRpdGlvbjEgYW5kIHBhcnRpdGlvbjJcbiAgZm9yICh2YXIgaSA9IG5ld0VkZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGVkZ2UgPSBuZXdFZGdlc1tpXTtcbiAgICB2YXIgc3JjID0gZWRnZVsxXTtcbiAgICB2YXIgdGd0ID0gZWRnZVsyXTtcbiAgICBpZiAobm9kZU1hcFtzcmNdID09PSBwYXJ0aXRpb24xICYmIG5vZGVNYXBbdGd0XSA9PT0gcGFydGl0aW9uMiB8fCBub2RlTWFwW3NyY10gPT09IHBhcnRpdGlvbjIgJiYgbm9kZU1hcFt0Z3RdID09PSBwYXJ0aXRpb24xKSB7XG4gICAgICBuZXdFZGdlcy5zcGxpY2UoaSwgMSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWxsIGVkZ2VzIHBvaW50aW5nIHRvIHBhcnRpdGlvbjIgc2hvdWxkIG5vdyBwb2ludCB0byBwYXJ0aXRpb24xXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBuZXdFZGdlcy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgX2VkZ2UgPSBuZXdFZGdlc1tfaV07XG4gICAgaWYgKF9lZGdlWzFdID09PSBwYXJ0aXRpb24yKSB7XG4gICAgICAvLyBDaGVjayBzb3VyY2VcbiAgICAgIG5ld0VkZ2VzW19pXSA9IF9lZGdlLnNsaWNlKCk7IC8vIGNvcHlcbiAgICAgIG5ld0VkZ2VzW19pXVsxXSA9IHBhcnRpdGlvbjE7XG4gICAgfSBlbHNlIGlmIChfZWRnZVsyXSA9PT0gcGFydGl0aW9uMikge1xuICAgICAgLy8gQ2hlY2sgdGFyZ2V0XG4gICAgICBuZXdFZGdlc1tfaV0gPSBfZWRnZS5zbGljZSgpOyAvLyBjb3B5XG4gICAgICBuZXdFZGdlc1tfaV1bMl0gPSBwYXJ0aXRpb24xO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1vdmUgYWxsIG5vZGVzIGZyb20gcGFydGl0aW9uMiB0byBwYXJ0aXRpb24xXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG5vZGVNYXAubGVuZ3RoOyBfaTIrKykge1xuICAgIGlmIChub2RlTWFwW19pMl0gPT09IHBhcnRpdGlvbjIpIHtcbiAgICAgIG5vZGVNYXBbX2kyXSA9IHBhcnRpdGlvbjE7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdFZGdlcztcbn07XG5cbi8vIENvbnRyYWN0cyBhIGdyYXBoIHVudGlsIHdlIHJlYWNoIGEgY2VydGFpbiBudW1iZXIgb2YgbWV0YSBub2Rlc1xudmFyIGNvbnRyYWN0VW50aWwgPSBmdW5jdGlvbiBjb250cmFjdFVudGlsKG1ldGFOb2RlTWFwLCByZW1haW5pbmdFZGdlcywgc2l6ZSwgc2l6ZUxpbWl0KSB7XG4gIHdoaWxlIChzaXplID4gc2l6ZUxpbWl0KSB7XG4gICAgLy8gQ2hvb3NlIGFuIGVkZ2UgcmFuZG9tbHlcbiAgICB2YXIgZWRnZUluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcmVtYWluaW5nRWRnZXMubGVuZ3RoKTtcblxuICAgIC8vIENvbGxhcHNlIGdyYXBoIGJhc2VkIG9uIGVkZ2VcbiAgICByZW1haW5pbmdFZGdlcyA9IGNvbGxhcHNlKGVkZ2VJbmRleCwgbWV0YU5vZGVNYXAsIHJlbWFpbmluZ0VkZ2VzKTtcbiAgICBzaXplLS07XG4gIH1cbiAgcmV0dXJuIHJlbWFpbmluZ0VkZ2VzO1xufTtcbnZhciBlbGVzZm4kcCA9IHtcbiAgLy8gQ29tcHV0ZXMgdGhlIG1pbmltdW0gY3V0IG9mIGFuIHVuZGlyZWN0ZWQgZ3JhcGhcbiAgLy8gUmV0dXJucyB0aGUgY29ycmVjdCBhbnN3ZXIgd2l0aCBoaWdoIHByb2JhYmlsaXR5XG4gIGthcmdlclN0ZWluOiBmdW5jdGlvbiBrYXJnZXJTdGVpbigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBfdGhpcyRieUdyb3VwID0gdGhpcy5ieUdyb3VwKCksXG4gICAgICBub2RlcyA9IF90aGlzJGJ5R3JvdXAubm9kZXMsXG4gICAgICBlZGdlcyA9IF90aGlzJGJ5R3JvdXAuZWRnZXM7XG4gICAgZWRnZXMudW5tZXJnZUJ5KGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICByZXR1cm4gZWRnZS5pc0xvb3AoKTtcbiAgICB9KTtcbiAgICB2YXIgbnVtTm9kZXMgPSBub2Rlcy5sZW5ndGg7XG4gICAgdmFyIG51bUVkZ2VzID0gZWRnZXMubGVuZ3RoO1xuICAgIHZhciBudW1JdGVyID0gTWF0aC5jZWlsKE1hdGgucG93KE1hdGgubG9nKG51bU5vZGVzKSAvIE1hdGguTE4yLCAyKSk7XG4gICAgdmFyIHN0b3BTaXplID0gTWF0aC5mbG9vcihudW1Ob2RlcyAvIHNxcnQyKTtcbiAgICBpZiAobnVtTm9kZXMgPCAyKSB7XG4gICAgICBlcnJvcignQXQgbGVhc3QgMiBub2RlcyBhcmUgcmVxdWlyZWQgZm9yIEthcmdlci1TdGVpbiBhbGdvcml0aG0nKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gTm93IHN0b3JlIGVkZ2UgZGVzdGluYXRpb24gYXMgaW5kZXhlc1xuICAgIC8vIEZvcm1hdCBmb3IgZWFjaCBlZGdlIChlZGdlIGluZGV4LCBzb3VyY2Ugbm9kZSBpbmRleCwgdGFyZ2V0IG5vZGUgaW5kZXgpXG4gICAgdmFyIGVkZ2VJbmRleGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1FZGdlczsgaSsrKSB7XG4gICAgICB2YXIgZSA9IGVkZ2VzW2ldO1xuICAgICAgZWRnZUluZGV4ZXMucHVzaChbaSwgbm9kZXMuaW5kZXhPZihlLnNvdXJjZSgpKSwgbm9kZXMuaW5kZXhPZihlLnRhcmdldCgpKV0pO1xuICAgIH1cblxuICAgIC8vIFdlIHdpbGwgc3RvcmUgdGhlIGJlc3QgY3V0IGZvdW5kIGhlcmVcbiAgICB2YXIgbWluQ3V0U2l6ZSA9IEluZmluaXR5O1xuICAgIHZhciBtaW5DdXRFZGdlSW5kZXhlcyA9IFtdO1xuICAgIHZhciBtaW5DdXROb2RlTWFwID0gbmV3IEFycmF5KG51bU5vZGVzKTtcblxuICAgIC8vIEluaXRpYWwgbWV0YSBub2RlIHBhcnRpdGlvblxuICAgIHZhciBtZXRhTm9kZU1hcCA9IG5ldyBBcnJheShudW1Ob2Rlcyk7XG4gICAgdmFyIG1ldGFOb2RlTWFwMiA9IG5ldyBBcnJheShudW1Ob2Rlcyk7XG4gICAgdmFyIGNvcHlOb2Rlc01hcCA9IGZ1bmN0aW9uIGNvcHlOb2Rlc01hcChmcm9tLCB0bykge1xuICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbnVtTm9kZXM7IF9pMysrKSB7XG4gICAgICAgIHRvW19pM10gPSBmcm9tW19pM107XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIE1haW4gbG9vcFxuICAgIGZvciAodmFyIGl0ZXIgPSAwOyBpdGVyIDw9IG51bUl0ZXI7IGl0ZXIrKykge1xuICAgICAgLy8gUmVzZXQgbWV0YSBub2RlIHBhcnRpdGlvblxuICAgICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDwgbnVtTm9kZXM7IF9pNCsrKSB7XG4gICAgICAgIG1ldGFOb2RlTWFwW19pNF0gPSBfaTQ7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnRyYWN0IHVudGlsIHN0b3AgcG9pbnQgKHN0b3BTaXplIG5vZGVzKVxuICAgICAgdmFyIGVkZ2VzU3RhdGUgPSBjb250cmFjdFVudGlsKG1ldGFOb2RlTWFwLCBlZGdlSW5kZXhlcy5zbGljZSgpLCBudW1Ob2Rlcywgc3RvcFNpemUpO1xuICAgICAgdmFyIGVkZ2VzU3RhdGUyID0gZWRnZXNTdGF0ZS5zbGljZSgpOyAvLyBjb3B5XG5cbiAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGNvbGFwc2VkIG5vZGVzIHN0YXRlXG4gICAgICBjb3B5Tm9kZXNNYXAobWV0YU5vZGVNYXAsIG1ldGFOb2RlTWFwMik7XG5cbiAgICAgIC8vIFJ1biAyIGl0ZXJhdGlvbnMgc3RhcnRpbmcgaW4gdGhlIHN0b3Agc3RhdGVcbiAgICAgIHZhciByZXMxID0gY29udHJhY3RVbnRpbChtZXRhTm9kZU1hcCwgZWRnZXNTdGF0ZSwgc3RvcFNpemUsIDIpO1xuICAgICAgdmFyIHJlczIgPSBjb250cmFjdFVudGlsKG1ldGFOb2RlTWFwMiwgZWRnZXNTdGF0ZTIsIHN0b3BTaXplLCAyKTtcblxuICAgICAgLy8gSXMgYW55IG9mIHRoZSAyIHJlc3VsdHMgdGhlIGJlc3QgY3V0IHNvIGZhcj9cbiAgICAgIGlmIChyZXMxLmxlbmd0aCA8PSByZXMyLmxlbmd0aCAmJiByZXMxLmxlbmd0aCA8IG1pbkN1dFNpemUpIHtcbiAgICAgICAgbWluQ3V0U2l6ZSA9IHJlczEubGVuZ3RoO1xuICAgICAgICBtaW5DdXRFZGdlSW5kZXhlcyA9IHJlczE7XG4gICAgICAgIGNvcHlOb2Rlc01hcChtZXRhTm9kZU1hcCwgbWluQ3V0Tm9kZU1hcCk7XG4gICAgICB9IGVsc2UgaWYgKHJlczIubGVuZ3RoIDw9IHJlczEubGVuZ3RoICYmIHJlczIubGVuZ3RoIDwgbWluQ3V0U2l6ZSkge1xuICAgICAgICBtaW5DdXRTaXplID0gcmVzMi5sZW5ndGg7XG4gICAgICAgIG1pbkN1dEVkZ2VJbmRleGVzID0gcmVzMjtcbiAgICAgICAgY29weU5vZGVzTWFwKG1ldGFOb2RlTWFwMiwgbWluQ3V0Tm9kZU1hcCk7XG4gICAgICB9XG4gICAgfSAvLyBlbmQgb2YgbWFpbiBsb29wXG5cbiAgICAvLyBDb25zdHJ1Y3QgcmVzdWx0XG4gICAgdmFyIGN1dCA9IHRoaXMuc3Bhd24obWluQ3V0RWRnZUluZGV4ZXMubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZWRnZXNbZVswXV07XG4gICAgfSkpO1xuICAgIHZhciBwYXJ0aXRpb24xID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciBwYXJ0aXRpb24yID0gdGhpcy5zcGF3bigpO1xuXG4gICAgLy8gdHJhdmVyc2UgbWV0YU5vZGVNYXAgZm9yIGJlc3QgY3V0XG4gICAgdmFyIHdpdG5lc3NOb2RlUGFydGl0aW9uID0gbWluQ3V0Tm9kZU1hcFswXTtcbiAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBtaW5DdXROb2RlTWFwLmxlbmd0aDsgX2k1KyspIHtcbiAgICAgIHZhciBwYXJ0aXRpb25JZCA9IG1pbkN1dE5vZGVNYXBbX2k1XTtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbX2k1XTtcbiAgICAgIGlmIChwYXJ0aXRpb25JZCA9PT0gd2l0bmVzc05vZGVQYXJ0aXRpb24pIHtcbiAgICAgICAgcGFydGl0aW9uMS5tZXJnZShub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnRpdGlvbjIubWVyZ2Uobm9kZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc3RydWN0IGNvbXBvbmVudHMgY29ycmVzcG9uZGluZyB0byBlYWNoIGRpc2pvaW50IHN1YnNldCBvZiBub2Rlc1xuICAgIHZhciBjb25zdHJ1Y3RDb21wb25lbnQgPSBmdW5jdGlvbiBjb25zdHJ1Y3RDb21wb25lbnQoc3Vic2V0KSB7XG4gICAgICB2YXIgY29tcG9uZW50ID0gX3RoaXMuc3Bhd24oKTtcbiAgICAgIHN1YnNldC5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGNvbXBvbmVudC5tZXJnZShub2RlKTtcbiAgICAgICAgbm9kZS5jb25uZWN0ZWRFZGdlcygpLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgICAvLyBlbnN1cmUgZWRnZSBpcyB3aXRoaW4gY2FsbGluZyBjb2xsZWN0aW9uIGFuZCBlZGdlIGlzIG5vdCBpbiBjdXRcbiAgICAgICAgICBpZiAoX3RoaXMuY29udGFpbnMoZWRnZSkgJiYgIWN1dC5jb250YWlucyhlZGdlKSkge1xuICAgICAgICAgICAgY29tcG9uZW50Lm1lcmdlKGVkZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfTtcbiAgICB2YXIgY29tcG9uZW50cyA9IFtjb25zdHJ1Y3RDb21wb25lbnQocGFydGl0aW9uMSksIGNvbnN0cnVjdENvbXBvbmVudChwYXJ0aXRpb24yKV07XG4gICAgdmFyIHJldCA9IHtcbiAgICAgIGN1dDogY3V0LFxuICAgICAgY29tcG9uZW50czogY29tcG9uZW50cyxcbiAgICAgIC8vIG4uYi4gcGFydGl0aW9ucyBhcmUgaW5jbHVkZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBvbGQgYXBpIHNwZWNcbiAgICAgIC8vIChjb3VsZCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHZlcnNpb24pXG4gICAgICBwYXJ0aXRpb24xOiBwYXJ0aXRpb24xLFxuICAgICAgcGFydGl0aW9uMjogcGFydGl0aW9uMlxuICAgIH07XG4gICAgcmV0dXJuIHJldDtcbiAgfVxufTsgLy8gZWxlc2ZuXG5cbnZhciBjb3B5UG9zaXRpb24gPSBmdW5jdGlvbiBjb3B5UG9zaXRpb24ocCkge1xuICByZXR1cm4ge1xuICAgIHg6IHAueCxcbiAgICB5OiBwLnlcbiAgfTtcbn07XG52YXIgbW9kZWxUb1JlbmRlcmVkUG9zaXRpb24gPSBmdW5jdGlvbiBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbihwLCB6b29tLCBwYW4pIHtcbiAgcmV0dXJuIHtcbiAgICB4OiBwLnggKiB6b29tICsgcGFuLngsXG4gICAgeTogcC55ICogem9vbSArIHBhbi55XG4gIH07XG59O1xudmFyIHJlbmRlcmVkVG9Nb2RlbFBvc2l0aW9uID0gZnVuY3Rpb24gcmVuZGVyZWRUb01vZGVsUG9zaXRpb24ocCwgem9vbSwgcGFuKSB7XG4gIHJldHVybiB7XG4gICAgeDogKHAueCAtIHBhbi54KSAvIHpvb20sXG4gICAgeTogKHAueSAtIHBhbi55KSAvIHpvb21cbiAgfTtcbn07XG52YXIgYXJyYXkycG9pbnQgPSBmdW5jdGlvbiBhcnJheTJwb2ludChhcnIpIHtcbiAgcmV0dXJuIHtcbiAgICB4OiBhcnJbMF0sXG4gICAgeTogYXJyWzFdXG4gIH07XG59O1xudmFyIG1pbiA9IGZ1bmN0aW9uIG1pbihhcnIpIHtcbiAgdmFyIGJlZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBhcnIubGVuZ3RoO1xuICB2YXIgbWluID0gSW5maW5pdHk7XG4gIGZvciAodmFyIGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7XG4gICAgdmFyIHZhbCA9IGFycltpXTtcbiAgICBpZiAoaXNGaW5pdGUodmFsKSkge1xuICAgICAgbWluID0gTWF0aC5taW4odmFsLCBtaW4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWluO1xufTtcbnZhciBtYXggPSBmdW5jdGlvbiBtYXgoYXJyKSB7XG4gIHZhciBiZWdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIGVuZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogYXJyLmxlbmd0aDtcbiAgdmFyIG1heCA9IC1JbmZpbml0eTtcbiAgZm9yICh2YXIgaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHtcbiAgICB2YXIgdmFsID0gYXJyW2ldO1xuICAgIGlmIChpc0Zpbml0ZSh2YWwpKSB7XG4gICAgICBtYXggPSBNYXRoLm1heCh2YWwsIG1heCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXg7XG59O1xudmFyIG1lYW4gPSBmdW5jdGlvbiBtZWFuKGFycikge1xuICB2YXIgYmVnaW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIHZhciBlbmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGFyci5sZW5ndGg7XG4gIHZhciB0b3RhbCA9IDA7XG4gIHZhciBuID0gMDtcbiAgZm9yICh2YXIgaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHtcbiAgICB2YXIgdmFsID0gYXJyW2ldO1xuICAgIGlmIChpc0Zpbml0ZSh2YWwpKSB7XG4gICAgICB0b3RhbCArPSB2YWw7XG4gICAgICBuKys7XG4gICAgfVxuICB9XG4gIHJldHVybiB0b3RhbCAvIG47XG59O1xudmFyIG1lZGlhbiA9IGZ1bmN0aW9uIG1lZGlhbihhcnIpIHtcbiAgdmFyIGJlZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBhcnIubGVuZ3RoO1xuICB2YXIgY29weSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogdHJ1ZTtcbiAgdmFyIHNvcnQgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHRydWU7XG4gIHZhciBpbmNsdWRlSG9sZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IHRydWU7XG4gIGlmIChjb3B5KSB7XG4gICAgYXJyID0gYXJyLnNsaWNlKGJlZ2luLCBlbmQpO1xuICB9IGVsc2Uge1xuICAgIGlmIChlbmQgPCBhcnIubGVuZ3RoKSB7XG4gICAgICBhcnIuc3BsaWNlKGVuZCwgYXJyLmxlbmd0aCAtIGVuZCk7XG4gICAgfVxuICAgIGlmIChiZWdpbiA+IDApIHtcbiAgICAgIGFyci5zcGxpY2UoMCwgYmVnaW4pO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFsbCBub24gZmluaXRlIChlLmcuIEluZmluaXR5LCBOYU4pIGVsZW1lbnRzIG11c3QgYmUgLUluZmluaXR5IHNvIHRoZXkgZ28gdG8gdGhlIHN0YXJ0XG4gIHZhciBvZmYgPSAwOyAvLyBvZmZzZXQgZnJvbSBub24tZmluaXRlIHZhbHVlc1xuICBmb3IgKHZhciBpID0gYXJyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIHYgPSBhcnJbaV07XG4gICAgaWYgKGluY2x1ZGVIb2xlcykge1xuICAgICAgaWYgKCFpc0Zpbml0ZSh2KSkge1xuICAgICAgICBhcnJbaV0gPSAtSW5maW5pdHk7XG4gICAgICAgIG9mZisrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBqdXN0IHJlbW92ZSBpdCBpZiB3ZSBkb24ndCB3YW50IHRvIGNvbnNpZGVyIGhvbGVzXG4gICAgICBhcnIuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxuICBpZiAoc29ydCkge1xuICAgIGFyci5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgfSk7IC8vIHJlcXVpcmVzIGNvcHkgPSB0cnVlIGlmIHlvdSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUgb3JpZ1xuICB9XG5cbiAgdmFyIGxlbiA9IGFyci5sZW5ndGg7XG4gIHZhciBtaWQgPSBNYXRoLmZsb29yKGxlbiAvIDIpO1xuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHJldHVybiBhcnJbbWlkICsgMSArIG9mZl07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChhcnJbbWlkIC0gMSArIG9mZl0gKyBhcnJbbWlkICsgb2ZmXSkgLyAyO1xuICB9XG59O1xudmFyIGRlZzJyYWQgPSBmdW5jdGlvbiBkZWcycmFkKGRlZykge1xuICByZXR1cm4gTWF0aC5QSSAqIGRlZyAvIDE4MDtcbn07XG52YXIgZ2V0QW5nbGVGcm9tRGlzcCA9IGZ1bmN0aW9uIGdldEFuZ2xlRnJvbURpc3AoZGlzcFgsIGRpc3BZKSB7XG4gIHJldHVybiBNYXRoLmF0YW4yKGRpc3BZLCBkaXNwWCkgLSBNYXRoLlBJIC8gMjtcbn07XG52YXIgbG9nMiA9IE1hdGgubG9nMiB8fCBmdW5jdGlvbiAobikge1xuICByZXR1cm4gTWF0aC5sb2cobikgLyBNYXRoLmxvZygyKTtcbn07XG52YXIgc2lnbnVtID0gZnVuY3Rpb24gc2lnbnVtKHgpIHtcbiAgaWYgKHggPiAwKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSBpZiAoeCA8IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG52YXIgZGlzdCA9IGZ1bmN0aW9uIGRpc3QocDEsIHAyKSB7XG4gIHJldHVybiBNYXRoLnNxcnQoc3FkaXN0KHAxLCBwMikpO1xufTtcbnZhciBzcWRpc3QgPSBmdW5jdGlvbiBzcWRpc3QocDEsIHAyKSB7XG4gIHZhciBkeCA9IHAyLnggLSBwMS54O1xuICB2YXIgZHkgPSBwMi55IC0gcDEueTtcbiAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xufTtcbnZhciBpblBsYWNlU3VtTm9ybWFsaXplID0gZnVuY3Rpb24gaW5QbGFjZVN1bU5vcm1hbGl6ZSh2KSB7XG4gIHZhciBsZW5ndGggPSB2Lmxlbmd0aDtcblxuICAvLyBGaXJzdCwgZ2V0IHN1bSBvZiBhbGwgZWxlbWVudHNcbiAgdmFyIHRvdGFsID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIHRvdGFsICs9IHZbaV07XG4gIH1cblxuICAvLyBOb3csIGRpdmlkZSBlYWNoIGJ5IHRoZSBzdW0gb2YgYWxsIGVsZW1lbnRzXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBsZW5ndGg7IF9pKyspIHtcbiAgICB2W19pXSA9IHZbX2ldIC8gdG90YWw7XG4gIH1cbiAgcmV0dXJuIHY7XG59O1xuXG4vLyBmcm9tIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQsOpemllcl9jdXJ2ZSNRdWFkcmF0aWNfY3VydmVzXG52YXIgcWJlemllckF0ID0gZnVuY3Rpb24gcWJlemllckF0KHAwLCBwMSwgcDIsIHQpIHtcbiAgcmV0dXJuICgxIC0gdCkgKiAoMSAtIHQpICogcDAgKyAyICogKDEgLSB0KSAqIHQgKiBwMSArIHQgKiB0ICogcDI7XG59O1xudmFyIHFiZXppZXJQdEF0ID0gZnVuY3Rpb24gcWJlemllclB0QXQocDAsIHAxLCBwMiwgdCkge1xuICByZXR1cm4ge1xuICAgIHg6IHFiZXppZXJBdChwMC54LCBwMS54LCBwMi54LCB0KSxcbiAgICB5OiBxYmV6aWVyQXQocDAueSwgcDEueSwgcDIueSwgdClcbiAgfTtcbn07XG52YXIgbGluZUF0ID0gZnVuY3Rpb24gbGluZUF0KHAwLCBwMSwgdCwgZCkge1xuICB2YXIgdmVjID0ge1xuICAgIHg6IHAxLnggLSBwMC54LFxuICAgIHk6IHAxLnkgLSBwMC55XG4gIH07XG4gIHZhciB2ZWNEaXN0ID0gZGlzdChwMCwgcDEpO1xuICB2YXIgbm9ybVZlYyA9IHtcbiAgICB4OiB2ZWMueCAvIHZlY0Rpc3QsXG4gICAgeTogdmVjLnkgLyB2ZWNEaXN0XG4gIH07XG4gIHQgPSB0ID09IG51bGwgPyAwIDogdDtcbiAgZCA9IGQgIT0gbnVsbCA/IGQgOiB0ICogdmVjRGlzdDtcbiAgcmV0dXJuIHtcbiAgICB4OiBwMC54ICsgbm9ybVZlYy54ICogZCxcbiAgICB5OiBwMC55ICsgbm9ybVZlYy55ICogZFxuICB9O1xufTtcbnZhciBib3VuZCA9IGZ1bmN0aW9uIGJvdW5kKG1pbiwgdmFsLCBtYXgpIHtcbiAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWwpKTtcbn07XG5cbi8vIG1ha2VzIGEgZnVsbCBiYiAoeDEsIHkxLCB4MiwgeTIsIHcsIGgpIGZyb20gaW1wbGljaXQgcGFyYW1zXG52YXIgbWFrZUJvdW5kaW5nQm94ID0gZnVuY3Rpb24gbWFrZUJvdW5kaW5nQm94KGJiKSB7XG4gIGlmIChiYiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHgxOiBJbmZpbml0eSxcbiAgICAgIHkxOiBJbmZpbml0eSxcbiAgICAgIHgyOiAtSW5maW5pdHksXG4gICAgICB5MjogLUluZmluaXR5LFxuICAgICAgdzogMCxcbiAgICAgIGg6IDBcbiAgICB9O1xuICB9IGVsc2UgaWYgKGJiLngxICE9IG51bGwgJiYgYmIueTEgIT0gbnVsbCkge1xuICAgIGlmIChiYi54MiAhPSBudWxsICYmIGJiLnkyICE9IG51bGwgJiYgYmIueDIgPj0gYmIueDEgJiYgYmIueTIgPj0gYmIueTEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHgxOiBiYi54MSxcbiAgICAgICAgeTE6IGJiLnkxLFxuICAgICAgICB4MjogYmIueDIsXG4gICAgICAgIHkyOiBiYi55MixcbiAgICAgICAgdzogYmIueDIgLSBiYi54MSxcbiAgICAgICAgaDogYmIueTIgLSBiYi55MVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGJiLncgIT0gbnVsbCAmJiBiYi5oICE9IG51bGwgJiYgYmIudyA+PSAwICYmIGJiLmggPj0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDE6IGJiLngxLFxuICAgICAgICB5MTogYmIueTEsXG4gICAgICAgIHgyOiBiYi54MSArIGJiLncsXG4gICAgICAgIHkyOiBiYi55MSArIGJiLmgsXG4gICAgICAgIHc6IGJiLncsXG4gICAgICAgIGg6IGJiLmhcbiAgICAgIH07XG4gICAgfVxuICB9XG59O1xudmFyIGNvcHlCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGNvcHlCb3VuZGluZ0JveChiYikge1xuICByZXR1cm4ge1xuICAgIHgxOiBiYi54MSxcbiAgICB4MjogYmIueDIsXG4gICAgdzogYmIudyxcbiAgICB5MTogYmIueTEsXG4gICAgeTI6IGJiLnkyLFxuICAgIGg6IGJiLmhcbiAgfTtcbn07XG52YXIgY2xlYXJCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGNsZWFyQm91bmRpbmdCb3goYmIpIHtcbiAgYmIueDEgPSBJbmZpbml0eTtcbiAgYmIueTEgPSBJbmZpbml0eTtcbiAgYmIueDIgPSAtSW5maW5pdHk7XG4gIGJiLnkyID0gLUluZmluaXR5O1xuICBiYi53ID0gMDtcbiAgYmIuaCA9IDA7XG59O1xudmFyIHNoaWZ0Qm91bmRpbmdCb3ggPSBmdW5jdGlvbiBzaGlmdEJvdW5kaW5nQm94KGJiLCBkeCwgZHkpIHtcbiAgcmV0dXJuIHtcbiAgICB4MTogYmIueDEgKyBkeCxcbiAgICB4MjogYmIueDIgKyBkeCxcbiAgICB5MTogYmIueTEgKyBkeSxcbiAgICB5MjogYmIueTIgKyBkeSxcbiAgICB3OiBiYi53LFxuICAgIGg6IGJiLmhcbiAgfTtcbn07XG52YXIgdXBkYXRlQm91bmRpbmdCb3ggPSBmdW5jdGlvbiB1cGRhdGVCb3VuZGluZ0JveChiYjEsIGJiMikge1xuICAvLyB1cGRhdGUgYmIxIHdpdGggYmIyIGJvdW5kc1xuXG4gIGJiMS54MSA9IE1hdGgubWluKGJiMS54MSwgYmIyLngxKTtcbiAgYmIxLngyID0gTWF0aC5tYXgoYmIxLngyLCBiYjIueDIpO1xuICBiYjEudyA9IGJiMS54MiAtIGJiMS54MTtcbiAgYmIxLnkxID0gTWF0aC5taW4oYmIxLnkxLCBiYjIueTEpO1xuICBiYjEueTIgPSBNYXRoLm1heChiYjEueTIsIGJiMi55Mik7XG4gIGJiMS5oID0gYmIxLnkyIC0gYmIxLnkxO1xufTtcbnZhciBleHBhbmRCb3VuZGluZ0JveEJ5UG9pbnQgPSBmdW5jdGlvbiBleHBhbmRCb3VuZGluZ0JveEJ5UG9pbnQoYmIsIHgsIHkpIHtcbiAgYmIueDEgPSBNYXRoLm1pbihiYi54MSwgeCk7XG4gIGJiLngyID0gTWF0aC5tYXgoYmIueDIsIHgpO1xuICBiYi53ID0gYmIueDIgLSBiYi54MTtcbiAgYmIueTEgPSBNYXRoLm1pbihiYi55MSwgeSk7XG4gIGJiLnkyID0gTWF0aC5tYXgoYmIueTIsIHkpO1xuICBiYi5oID0gYmIueTIgLSBiYi55MTtcbn07XG52YXIgZXhwYW5kQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBleHBhbmRCb3VuZGluZ0JveChiYikge1xuICB2YXIgcGFkZGluZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgYmIueDEgLT0gcGFkZGluZztcbiAgYmIueDIgKz0gcGFkZGluZztcbiAgYmIueTEgLT0gcGFkZGluZztcbiAgYmIueTIgKz0gcGFkZGluZztcbiAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gIGJiLmggPSBiYi55MiAtIGJiLnkxO1xuICByZXR1cm4gYmI7XG59O1xudmFyIGV4cGFuZEJvdW5kaW5nQm94U2lkZXMgPSBmdW5jdGlvbiBleHBhbmRCb3VuZGluZ0JveFNpZGVzKGJiKSB7XG4gIHZhciBwYWRkaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbMF07XG4gIHZhciB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQ7XG4gIGlmIChwYWRkaW5nLmxlbmd0aCA9PT0gMSkge1xuICAgIHRvcCA9IHJpZ2h0ID0gYm90dG9tID0gbGVmdCA9IHBhZGRpbmdbMF07XG4gIH0gZWxzZSBpZiAocGFkZGluZy5sZW5ndGggPT09IDIpIHtcbiAgICB0b3AgPSBib3R0b20gPSBwYWRkaW5nWzBdO1xuICAgIGxlZnQgPSByaWdodCA9IHBhZGRpbmdbMV07XG4gIH0gZWxzZSBpZiAocGFkZGluZy5sZW5ndGggPT09IDQpIHtcbiAgICB2YXIgX3BhZGRpbmcgPSBfc2xpY2VkVG9BcnJheShwYWRkaW5nLCA0KTtcbiAgICB0b3AgPSBfcGFkZGluZ1swXTtcbiAgICByaWdodCA9IF9wYWRkaW5nWzFdO1xuICAgIGJvdHRvbSA9IF9wYWRkaW5nWzJdO1xuICAgIGxlZnQgPSBfcGFkZGluZ1szXTtcbiAgfVxuICBiYi54MSAtPSBsZWZ0O1xuICBiYi54MiArPSByaWdodDtcbiAgYmIueTEgLT0gdG9wO1xuICBiYi55MiArPSBib3R0b207XG4gIGJiLncgPSBiYi54MiAtIGJiLngxO1xuICBiYi5oID0gYmIueTIgLSBiYi55MTtcbiAgcmV0dXJuIGJiO1xufTtcblxuLy8gYXNzaWduIHRoZSB2YWx1ZXMgb2YgYmIyIGludG8gYmIxXG52YXIgYXNzaWduQm91bmRpbmdCb3ggPSBmdW5jdGlvbiBhc3NpZ25Cb3VuZGluZ0JveChiYjEsIGJiMikge1xuICBiYjEueDEgPSBiYjIueDE7XG4gIGJiMS55MSA9IGJiMi55MTtcbiAgYmIxLngyID0gYmIyLngyO1xuICBiYjEueTIgPSBiYjIueTI7XG4gIGJiMS53ID0gYmIxLngyIC0gYmIxLngxO1xuICBiYjEuaCA9IGJiMS55MiAtIGJiMS55MTtcbn07XG52YXIgYm91bmRpbmdCb3hlc0ludGVyc2VjdCA9IGZ1bmN0aW9uIGJvdW5kaW5nQm94ZXNJbnRlcnNlY3QoYmIxLCBiYjIpIHtcbiAgLy8gY2FzZTogb25lIGJiIHRvIHJpZ2h0IG9mIG90aGVyXG4gIGlmIChiYjEueDEgPiBiYjIueDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGJiMi54MSA+IGJiMS54Mikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGNhc2U6IG9uZSBiYiB0byBsZWZ0IG9mIG90aGVyXG4gIGlmIChiYjEueDIgPCBiYjIueDEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGJiMi54MiA8IGJiMS54MSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGNhc2U6IG9uZSBiYiBhYm92ZSBvdGhlclxuICBpZiAoYmIxLnkyIDwgYmIyLnkxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChiYjIueTIgPCBiYjEueTEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBjYXNlOiBvbmUgYmIgYmVsb3cgb3RoZXJcbiAgaWYgKGJiMS55MSA+IGJiMi55Mikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoYmIyLnkxID4gYmIxLnkyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gb3RoZXJ3aXNlLCBtdXN0IGhhdmUgc29tZSBvdmVybGFwXG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBpbkJvdW5kaW5nQm94ID0gZnVuY3Rpb24gaW5Cb3VuZGluZ0JveChiYiwgeCwgeSkge1xuICByZXR1cm4gYmIueDEgPD0geCAmJiB4IDw9IGJiLngyICYmIGJiLnkxIDw9IHkgJiYgeSA8PSBiYi55Mjtcbn07XG52YXIgcG9pbnRJbkJvdW5kaW5nQm94ID0gZnVuY3Rpb24gcG9pbnRJbkJvdW5kaW5nQm94KGJiLCBwdCkge1xuICByZXR1cm4gaW5Cb3VuZGluZ0JveChiYiwgcHQueCwgcHQueSk7XG59O1xudmFyIGJvdW5kaW5nQm94SW5Cb3VuZGluZ0JveCA9IGZ1bmN0aW9uIGJvdW5kaW5nQm94SW5Cb3VuZGluZ0JveChiYjEsIGJiMikge1xuICByZXR1cm4gaW5Cb3VuZGluZ0JveChiYjEsIGJiMi54MSwgYmIyLnkxKSAmJiBpbkJvdW5kaW5nQm94KGJiMSwgYmIyLngyLCBiYjIueTIpO1xufTtcbnZhciByb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUgPSBmdW5jdGlvbiByb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUoeCwgeSwgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nKSB7XG4gIHZhciByYWRpdXMgPSBhcmd1bWVudHMubGVuZ3RoID4gNyAmJiBhcmd1bWVudHNbN10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s3XSA6ICdhdXRvJztcbiAgdmFyIGNvcm5lclJhZGl1cyA9IHJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCkgOiByYWRpdXM7XG4gIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgY29ybmVyUmFkaXVzID0gTWF0aC5taW4oY29ybmVyUmFkaXVzLCBoYWxmV2lkdGgsIGhhbGZIZWlnaHQpO1xuICB2YXIgZG9XaWR0aCA9IGNvcm5lclJhZGl1cyAhPT0gaGFsZldpZHRoLFxuICAgIGRvSGVpZ2h0ID0gY29ybmVyUmFkaXVzICE9PSBoYWxmSGVpZ2h0O1xuXG4gIC8vIENoZWNrIGludGVyc2VjdGlvbnMgd2l0aCBzdHJhaWdodCBsaW5lIHNlZ21lbnRzXG4gIHZhciBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuXG4gIC8vIFRvcCBzZWdtZW50LCBsZWZ0IHRvIHJpZ2h0XG4gIGlmIChkb1dpZHRoKSB7XG4gICAgdmFyIHRvcFN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICB2YXIgdG9wU3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0IC0gcGFkZGluZztcbiAgICB2YXIgdG9wRW5kWCA9IG5vZGVYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcbiAgICB2YXIgdG9wRW5kWSA9IHRvcFN0YXJ0WTtcbiAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgbm9kZVgsIG5vZGVZLCB0b3BTdGFydFgsIHRvcFN0YXJ0WSwgdG9wRW5kWCwgdG9wRW5kWSwgZmFsc2UpO1xuICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJpZ2h0IHNlZ21lbnQsIHRvcCB0byBib3R0b21cbiAgaWYgKGRvSGVpZ2h0KSB7XG4gICAgdmFyIHJpZ2h0U3RhcnRYID0gbm9kZVggKyBoYWxmV2lkdGggKyBwYWRkaW5nO1xuICAgIHZhciByaWdodFN0YXJ0WSA9IG5vZGVZIC0gaGFsZkhlaWdodCArIGNvcm5lclJhZGl1cyAtIHBhZGRpbmc7XG4gICAgdmFyIHJpZ2h0RW5kWCA9IHJpZ2h0U3RhcnRYO1xuICAgIHZhciByaWdodEVuZFkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBub2RlWCwgbm9kZVksIHJpZ2h0U3RhcnRYLCByaWdodFN0YXJ0WSwgcmlnaHRFbmRYLCByaWdodEVuZFksIGZhbHNlKTtcbiAgICBpZiAoc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgICB9XG4gIH1cblxuICAvLyBCb3R0b20gc2VnbWVudCwgbGVmdCB0byByaWdodFxuICBpZiAoZG9XaWR0aCkge1xuICAgIHZhciBib3R0b21TdGFydFggPSBub2RlWCAtIGhhbGZXaWR0aCArIGNvcm5lclJhZGl1cyAtIHBhZGRpbmc7XG4gICAgdmFyIGJvdHRvbVN0YXJ0WSA9IG5vZGVZICsgaGFsZkhlaWdodCArIHBhZGRpbmc7XG4gICAgdmFyIGJvdHRvbUVuZFggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG4gICAgdmFyIGJvdHRvbUVuZFkgPSBib3R0b21TdGFydFk7XG4gICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IGZpbml0ZUxpbmVzSW50ZXJzZWN0KHgsIHksIG5vZGVYLCBub2RlWSwgYm90dG9tU3RhcnRYLCBib3R0b21TdGFydFksIGJvdHRvbUVuZFgsIGJvdHRvbUVuZFksIGZhbHNlKTtcbiAgICBpZiAoc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgICB9XG4gIH1cblxuICAvLyBMZWZ0IHNlZ21lbnQsIHRvcCB0byBib3R0b21cbiAgaWYgKGRvSGVpZ2h0KSB7XG4gICAgdmFyIGxlZnRTdGFydFggPSBub2RlWCAtIGhhbGZXaWR0aCAtIHBhZGRpbmc7XG4gICAgdmFyIGxlZnRTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXMgLSBwYWRkaW5nO1xuICAgIHZhciBsZWZ0RW5kWCA9IGxlZnRTdGFydFg7XG4gICAgdmFyIGxlZnRFbmRZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcbiAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgbm9kZVgsIG5vZGVZLCBsZWZ0U3RhcnRYLCBsZWZ0U3RhcnRZLCBsZWZ0RW5kWCwgbGVmdEVuZFksIGZhbHNlKTtcbiAgICBpZiAoc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBpbnRlcnNlY3Rpb25zIHdpdGggYXJjIHNlZ21lbnRzXG4gIHZhciBhcmNJbnRlcnNlY3Rpb25zO1xuXG4gIC8vIFRvcCBMZWZ0XG4gIHtcbiAgICB2YXIgdG9wTGVmdENlbnRlclggPSBub2RlWCAtIGhhbGZXaWR0aCArIGNvcm5lclJhZGl1cztcbiAgICB2YXIgdG9wTGVmdENlbnRlclkgPSBub2RlWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXM7XG4gICAgYXJjSW50ZXJzZWN0aW9ucyA9IGludGVyc2VjdExpbmVDaXJjbGUoeCwgeSwgbm9kZVgsIG5vZGVZLCB0b3BMZWZ0Q2VudGVyWCwgdG9wTGVmdENlbnRlclksIGNvcm5lclJhZGl1cyArIHBhZGRpbmcpO1xuXG4gICAgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG4gICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMCAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdIDw9IHRvcExlZnRDZW50ZXJYICYmIGFyY0ludGVyc2VjdGlvbnNbMV0gPD0gdG9wTGVmdENlbnRlclkpIHtcbiAgICAgIHJldHVybiBbYXJjSW50ZXJzZWN0aW9uc1swXSwgYXJjSW50ZXJzZWN0aW9uc1sxXV07XG4gICAgfVxuICB9XG5cbiAgLy8gVG9wIFJpZ2h0XG4gIHtcbiAgICB2YXIgdG9wUmlnaHRDZW50ZXJYID0gbm9kZVggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXM7XG4gICAgdmFyIHRvcFJpZ2h0Q2VudGVyWSA9IG5vZGVZIC0gaGFsZkhlaWdodCArIGNvcm5lclJhZGl1cztcbiAgICBhcmNJbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0TGluZUNpcmNsZSh4LCB5LCBub2RlWCwgbm9kZVksIHRvcFJpZ2h0Q2VudGVyWCwgdG9wUmlnaHRDZW50ZXJZLCBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nKTtcblxuICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgIGlmIChhcmNJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDAgJiYgYXJjSW50ZXJzZWN0aW9uc1swXSA+PSB0b3BSaWdodENlbnRlclggJiYgYXJjSW50ZXJzZWN0aW9uc1sxXSA8PSB0b3BSaWdodENlbnRlclkpIHtcbiAgICAgIHJldHVybiBbYXJjSW50ZXJzZWN0aW9uc1swXSwgYXJjSW50ZXJzZWN0aW9uc1sxXV07XG4gICAgfVxuICB9XG5cbiAgLy8gQm90dG9tIFJpZ2h0XG4gIHtcbiAgICB2YXIgYm90dG9tUmlnaHRDZW50ZXJYID0gbm9kZVggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXM7XG4gICAgdmFyIGJvdHRvbVJpZ2h0Q2VudGVyWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cztcbiAgICBhcmNJbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0TGluZUNpcmNsZSh4LCB5LCBub2RlWCwgbm9kZVksIGJvdHRvbVJpZ2h0Q2VudGVyWCwgYm90dG9tUmlnaHRDZW50ZXJZLCBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nKTtcblxuICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgIGlmIChhcmNJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDAgJiYgYXJjSW50ZXJzZWN0aW9uc1swXSA+PSBib3R0b21SaWdodENlbnRlclggJiYgYXJjSW50ZXJzZWN0aW9uc1sxXSA+PSBib3R0b21SaWdodENlbnRlclkpIHtcbiAgICAgIHJldHVybiBbYXJjSW50ZXJzZWN0aW9uc1swXSwgYXJjSW50ZXJzZWN0aW9uc1sxXV07XG4gICAgfVxuICB9XG5cbiAgLy8gQm90dG9tIExlZnRcbiAge1xuICAgIHZhciBib3R0b21MZWZ0Q2VudGVyWCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzO1xuICAgIHZhciBib3R0b21MZWZ0Q2VudGVyWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cztcbiAgICBhcmNJbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0TGluZUNpcmNsZSh4LCB5LCBub2RlWCwgbm9kZVksIGJvdHRvbUxlZnRDZW50ZXJYLCBib3R0b21MZWZ0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7XG5cbiAgICAvLyBFbnN1cmUgdGhlIGludGVyc2VjdGlvbiBpcyBvbiB0aGUgZGVzaXJlZCBxdWFydGVyIG9mIHRoZSBjaXJjbGVcbiAgICBpZiAoYXJjSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwICYmIGFyY0ludGVyc2VjdGlvbnNbMF0gPD0gYm90dG9tTGVmdENlbnRlclggJiYgYXJjSW50ZXJzZWN0aW9uc1sxXSA+PSBib3R0b21MZWZ0Q2VudGVyWSkge1xuICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdOyAvLyBpZiBub3RoaW5nXG59O1xuXG52YXIgaW5MaW5lVmljaW5pdHkgPSBmdW5jdGlvbiBpbkxpbmVWaWNpbml0eSh4LCB5LCBseDEsIGx5MSwgbHgyLCBseTIsIHRvbGVyYW5jZSkge1xuICB2YXIgdCA9IHRvbGVyYW5jZTtcbiAgdmFyIHgxID0gTWF0aC5taW4obHgxLCBseDIpO1xuICB2YXIgeDIgPSBNYXRoLm1heChseDEsIGx4Mik7XG4gIHZhciB5MSA9IE1hdGgubWluKGx5MSwgbHkyKTtcbiAgdmFyIHkyID0gTWF0aC5tYXgobHkxLCBseTIpO1xuICByZXR1cm4geDEgLSB0IDw9IHggJiYgeCA8PSB4MiArIHQgJiYgeTEgLSB0IDw9IHkgJiYgeSA8PSB5MiArIHQ7XG59O1xudmFyIGluQmV6aWVyVmljaW5pdHkgPSBmdW5jdGlvbiBpbkJlemllclZpY2luaXR5KHgsIHksIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHRvbGVyYW5jZSkge1xuICB2YXIgYmIgPSB7XG4gICAgeDE6IE1hdGgubWluKHgxLCB4MywgeDIpIC0gdG9sZXJhbmNlLFxuICAgIHgyOiBNYXRoLm1heCh4MSwgeDMsIHgyKSArIHRvbGVyYW5jZSxcbiAgICB5MTogTWF0aC5taW4oeTEsIHkzLCB5MikgLSB0b2xlcmFuY2UsXG4gICAgeTI6IE1hdGgubWF4KHkxLCB5MywgeTIpICsgdG9sZXJhbmNlXG4gIH07XG5cbiAgLy8gaWYgb3V0c2lkZSB0aGUgcm91Z2ggYm91bmRpbmcgYm94IGZvciB0aGUgYmV6aWVyLCB0aGVuIGl0IGNhbid0IGJlIGEgaGl0XG4gIGlmICh4IDwgYmIueDEgfHwgeCA+IGJiLngyIHx8IHkgPCBiYi55MSB8fCB5ID4gYmIueTIpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnYmV6aWVyIG91dCBvZiByb3VnaCBiYicpXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIC8vIGNvbnNvbGUubG9nKCdkbyBtb3JlIGV4cGVuc2l2ZSBjaGVjaycpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xudmFyIHNvbHZlUXVhZHJhdGljID0gZnVuY3Rpb24gc29sdmVRdWFkcmF0aWMoYSwgYiwgYywgdmFsKSB7XG4gIGMgLT0gdmFsO1xuICB2YXIgciA9IGIgKiBiIC0gNCAqIGEgKiBjO1xuICBpZiAociA8IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIHNxcnRSID0gTWF0aC5zcXJ0KHIpO1xuICB2YXIgZGVub20gPSAyICogYTtcbiAgdmFyIHJvb3QxID0gKC1iICsgc3FydFIpIC8gZGVub207XG4gIHZhciByb290MiA9ICgtYiAtIHNxcnRSKSAvIGRlbm9tO1xuICByZXR1cm4gW3Jvb3QxLCByb290Ml07XG59O1xudmFyIHNvbHZlQ3ViaWMgPSBmdW5jdGlvbiBzb2x2ZUN1YmljKGEsIGIsIGMsIGQsIHJlc3VsdCkge1xuICAvLyBTb2x2ZXMgYSBjdWJpYyBmdW5jdGlvbiwgcmV0dXJucyByb290IGluIGZvcm0gW3IxLCBpMSwgcjIsIGkyLCByMywgaTNdLCB3aGVyZVxuICAvLyByIGlzIHRoZSByZWFsIGNvbXBvbmVudCwgaSBpcyB0aGUgaW1hZ2luYXJ5IGNvbXBvbmVudFxuXG4gIC8vIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDYXJkYW5vIG1ldGhvZCBmcm9tIHRoZSB5ZWFyIDE1NDVcbiAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DdWJpY19mdW5jdGlvbiNUaGVfbmF0dXJlX29mX3RoZV9yb290c1xuXG4gIHZhciBlcHNpbG9uID0gMC4wMDAwMTtcblxuICAvLyBhdm9pZCBkaXZpc2lvbiBieSB6ZXJvIHdoaWxlIGtlZXBpbmcgdGhlIG92ZXJhbGwgZXhwcmVzc2lvbiBjbG9zZSBpbiB2YWx1ZVxuICBpZiAoYSA9PT0gMCkge1xuICAgIGEgPSBlcHNpbG9uO1xuICB9XG4gIGIgLz0gYTtcbiAgYyAvPSBhO1xuICBkIC89IGE7XG4gIHZhciBkaXNjcmltaW5hbnQsIHEsIHIsIGR1bTEsIHMsIHQsIHRlcm0xLCByMTM7XG4gIHEgPSAoMy4wICogYyAtIGIgKiBiKSAvIDkuMDtcbiAgciA9IC0oMjcuMCAqIGQpICsgYiAqICg5LjAgKiBjIC0gMi4wICogKGIgKiBiKSk7XG4gIHIgLz0gNTQuMDtcbiAgZGlzY3JpbWluYW50ID0gcSAqIHEgKiBxICsgciAqIHI7XG4gIHJlc3VsdFsxXSA9IDA7XG4gIHRlcm0xID0gYiAvIDMuMDtcbiAgaWYgKGRpc2NyaW1pbmFudCA+IDApIHtcbiAgICBzID0gciArIE1hdGguc3FydChkaXNjcmltaW5hbnQpO1xuICAgIHMgPSBzIDwgMCA/IC1NYXRoLnBvdygtcywgMS4wIC8gMy4wKSA6IE1hdGgucG93KHMsIDEuMCAvIDMuMCk7XG4gICAgdCA9IHIgLSBNYXRoLnNxcnQoZGlzY3JpbWluYW50KTtcbiAgICB0ID0gdCA8IDAgPyAtTWF0aC5wb3coLXQsIDEuMCAvIDMuMCkgOiBNYXRoLnBvdyh0LCAxLjAgLyAzLjApO1xuICAgIHJlc3VsdFswXSA9IC10ZXJtMSArIHMgKyB0O1xuICAgIHRlcm0xICs9IChzICsgdCkgLyAyLjA7XG4gICAgcmVzdWx0WzRdID0gcmVzdWx0WzJdID0gLXRlcm0xO1xuICAgIHRlcm0xID0gTWF0aC5zcXJ0KDMuMCkgKiAoLXQgKyBzKSAvIDI7XG4gICAgcmVzdWx0WzNdID0gdGVybTE7XG4gICAgcmVzdWx0WzVdID0gLXRlcm0xO1xuICAgIHJldHVybjtcbiAgfVxuICByZXN1bHRbNV0gPSByZXN1bHRbM10gPSAwO1xuICBpZiAoZGlzY3JpbWluYW50ID09PSAwKSB7XG4gICAgcjEzID0gciA8IDAgPyAtTWF0aC5wb3coLXIsIDEuMCAvIDMuMCkgOiBNYXRoLnBvdyhyLCAxLjAgLyAzLjApO1xuICAgIHJlc3VsdFswXSA9IC10ZXJtMSArIDIuMCAqIHIxMztcbiAgICByZXN1bHRbNF0gPSByZXN1bHRbMl0gPSAtKHIxMyArIHRlcm0xKTtcbiAgICByZXR1cm47XG4gIH1cbiAgcSA9IC1xO1xuICBkdW0xID0gcSAqIHEgKiBxO1xuICBkdW0xID0gTWF0aC5hY29zKHIgLyBNYXRoLnNxcnQoZHVtMSkpO1xuICByMTMgPSAyLjAgKiBNYXRoLnNxcnQocSk7XG4gIHJlc3VsdFswXSA9IC10ZXJtMSArIHIxMyAqIE1hdGguY29zKGR1bTEgLyAzLjApO1xuICByZXN1bHRbMl0gPSAtdGVybTEgKyByMTMgKiBNYXRoLmNvcygoZHVtMSArIDIuMCAqIE1hdGguUEkpIC8gMy4wKTtcbiAgcmVzdWx0WzRdID0gLXRlcm0xICsgcjEzICogTWF0aC5jb3MoKGR1bTEgKyA0LjAgKiBNYXRoLlBJKSAvIDMuMCk7XG4gIHJldHVybjtcbn07XG52YXIgc3FkaXN0VG9RdWFkcmF0aWNCZXppZXIgPSBmdW5jdGlvbiBzcWRpc3RUb1F1YWRyYXRpY0Jlemllcih4LCB5LCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSB7XG4gIC8vIEZpbmQgbWluaW11bSBkaXN0YW5jZSBieSB1c2luZyB0aGUgbWluaW11bSBvZiB0aGUgZGlzdGFuY2VcbiAgLy8gZnVuY3Rpb24gYmV0d2VlbiB0aGUgZ2l2ZW4gcG9pbnQgYW5kIHRoZSBjdXJ2ZVxuXG4gIC8vIFRoaXMgZ2l2ZXMgdGhlIGNvZWZmaWNpZW50cyBvZiB0aGUgcmVzdWx0aW5nIGN1YmljIGVxdWF0aW9uXG4gIC8vIHdob3NlIHJvb3RzIHRlbGwgdXMgd2hlcmUgYSBwb3NzaWJsZSBtaW5pbXVtIGlzXG4gIC8vIChDb2VmZmljaWVudHMgYXJlIGRpdmlkZWQgYnkgNClcblxuICB2YXIgYSA9IDEuMCAqIHgxICogeDEgLSA0ICogeDEgKiB4MiArIDIgKiB4MSAqIHgzICsgNCAqIHgyICogeDIgLSA0ICogeDIgKiB4MyArIHgzICogeDMgKyB5MSAqIHkxIC0gNCAqIHkxICogeTIgKyAyICogeTEgKiB5MyArIDQgKiB5MiAqIHkyIC0gNCAqIHkyICogeTMgKyB5MyAqIHkzO1xuICB2YXIgYiA9IDEuMCAqIDkgKiB4MSAqIHgyIC0gMyAqIHgxICogeDEgLSAzICogeDEgKiB4MyAtIDYgKiB4MiAqIHgyICsgMyAqIHgyICogeDMgKyA5ICogeTEgKiB5MiAtIDMgKiB5MSAqIHkxIC0gMyAqIHkxICogeTMgLSA2ICogeTIgKiB5MiArIDMgKiB5MiAqIHkzO1xuICB2YXIgYyA9IDEuMCAqIDMgKiB4MSAqIHgxIC0gNiAqIHgxICogeDIgKyB4MSAqIHgzIC0geDEgKiB4ICsgMiAqIHgyICogeDIgKyAyICogeDIgKiB4IC0geDMgKiB4ICsgMyAqIHkxICogeTEgLSA2ICogeTEgKiB5MiArIHkxICogeTMgLSB5MSAqIHkgKyAyICogeTIgKiB5MiArIDIgKiB5MiAqIHkgLSB5MyAqIHk7XG4gIHZhciBkID0gMS4wICogeDEgKiB4MiAtIHgxICogeDEgKyB4MSAqIHggLSB4MiAqIHggKyB5MSAqIHkyIC0geTEgKiB5MSArIHkxICogeSAtIHkyICogeTtcblxuICAvLyBkZWJ1ZyhcImNvZWZmaWNpZW50czogXCIgKyBhIC8gYSArIFwiLCBcIiArIGIgLyBhICsgXCIsIFwiICsgYyAvIGEgKyBcIiwgXCIgKyBkIC8gYSk7XG5cbiAgdmFyIHJvb3RzID0gW107XG5cbiAgLy8gVXNlIHRoZSBjdWJpYyBzb2x2aW5nIGFsZ29yaXRobVxuICBzb2x2ZUN1YmljKGEsIGIsIGMsIGQsIHJvb3RzKTtcbiAgdmFyIHplcm9UaHJlc2hvbGQgPSAwLjAwMDAwMDE7XG4gIHZhciBwYXJhbXMgPSBbXTtcbiAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IDY7IGluZGV4ICs9IDIpIHtcbiAgICBpZiAoTWF0aC5hYnMocm9vdHNbaW5kZXggKyAxXSkgPCB6ZXJvVGhyZXNob2xkICYmIHJvb3RzW2luZGV4XSA+PSAwICYmIHJvb3RzW2luZGV4XSA8PSAxLjApIHtcbiAgICAgIHBhcmFtcy5wdXNoKHJvb3RzW2luZGV4XSk7XG4gICAgfVxuICB9XG4gIHBhcmFtcy5wdXNoKDEuMCk7XG4gIHBhcmFtcy5wdXNoKDAuMCk7XG4gIHZhciBtaW5EaXN0YW5jZVNxdWFyZWQgPSAtMTtcbiAgdmFyIGN1clgsIGN1clksIGRpc3RTcXVhcmVkO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgIGN1clggPSBNYXRoLnBvdygxLjAgLSBwYXJhbXNbaV0sIDIuMCkgKiB4MSArIDIuMCAqICgxIC0gcGFyYW1zW2ldKSAqIHBhcmFtc1tpXSAqIHgyICsgcGFyYW1zW2ldICogcGFyYW1zW2ldICogeDM7XG4gICAgY3VyWSA9IE1hdGgucG93KDEgLSBwYXJhbXNbaV0sIDIuMCkgKiB5MSArIDIgKiAoMS4wIC0gcGFyYW1zW2ldKSAqIHBhcmFtc1tpXSAqIHkyICsgcGFyYW1zW2ldICogcGFyYW1zW2ldICogeTM7XG4gICAgZGlzdFNxdWFyZWQgPSBNYXRoLnBvdyhjdXJYIC0geCwgMikgKyBNYXRoLnBvdyhjdXJZIC0geSwgMik7XG4gICAgLy8gZGVidWcoJ2Rpc3RhbmNlIGZvciBwYXJhbSAnICsgcGFyYW1zW2ldICsgXCI6IFwiICsgTWF0aC5zcXJ0KGRpc3RTcXVhcmVkKSk7XG4gICAgaWYgKG1pbkRpc3RhbmNlU3F1YXJlZCA+PSAwKSB7XG4gICAgICBpZiAoZGlzdFNxdWFyZWQgPCBtaW5EaXN0YW5jZVNxdWFyZWQpIHtcbiAgICAgICAgbWluRGlzdGFuY2VTcXVhcmVkID0gZGlzdFNxdWFyZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1pbkRpc3RhbmNlU3F1YXJlZCA9IGRpc3RTcXVhcmVkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWluRGlzdGFuY2VTcXVhcmVkO1xufTtcbnZhciBzcWRpc3RUb0Zpbml0ZUxpbmUgPSBmdW5jdGlvbiBzcWRpc3RUb0Zpbml0ZUxpbmUoeCwgeSwgeDEsIHkxLCB4MiwgeTIpIHtcbiAgdmFyIG9mZnNldCA9IFt4IC0geDEsIHkgLSB5MV07XG4gIHZhciBsaW5lID0gW3gyIC0geDEsIHkyIC0geTFdO1xuICB2YXIgbGluZVNxID0gbGluZVswXSAqIGxpbmVbMF0gKyBsaW5lWzFdICogbGluZVsxXTtcbiAgdmFyIGh5cFNxID0gb2Zmc2V0WzBdICogb2Zmc2V0WzBdICsgb2Zmc2V0WzFdICogb2Zmc2V0WzFdO1xuICB2YXIgZG90UHJvZHVjdCA9IG9mZnNldFswXSAqIGxpbmVbMF0gKyBvZmZzZXRbMV0gKiBsaW5lWzFdO1xuICB2YXIgYWRqU3EgPSBkb3RQcm9kdWN0ICogZG90UHJvZHVjdCAvIGxpbmVTcTtcbiAgaWYgKGRvdFByb2R1Y3QgPCAwKSB7XG4gICAgcmV0dXJuIGh5cFNxO1xuICB9XG4gIGlmIChhZGpTcSA+IGxpbmVTcSkge1xuICAgIHJldHVybiAoeCAtIHgyKSAqICh4IC0geDIpICsgKHkgLSB5MikgKiAoeSAtIHkyKTtcbiAgfVxuICByZXR1cm4gaHlwU3EgLSBhZGpTcTtcbn07XG52YXIgcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzID0gZnVuY3Rpb24gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIHBvaW50cykge1xuICB2YXIgeDEsIHkxLCB4MiwgeTI7XG4gIHZhciB5MztcblxuICAvLyBJbnRlcnNlY3Qgd2l0aCB2ZXJ0aWNhbCBsaW5lIHRocm91Z2ggKHgsIHkpXG4gIHZhciB1cCA9IDA7XG4gIC8vIGxldCBkb3duID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgeDEgPSBwb2ludHNbaSAqIDJdO1xuICAgIHkxID0gcG9pbnRzW2kgKiAyICsgMV07XG4gICAgaWYgKGkgKyAxIDwgcG9pbnRzLmxlbmd0aCAvIDIpIHtcbiAgICAgIHgyID0gcG9pbnRzWyhpICsgMSkgKiAyXTtcbiAgICAgIHkyID0gcG9pbnRzWyhpICsgMSkgKiAyICsgMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHgyID0gcG9pbnRzWyhpICsgMSAtIHBvaW50cy5sZW5ndGggLyAyKSAqIDJdO1xuICAgICAgeTIgPSBwb2ludHNbKGkgKyAxIC0gcG9pbnRzLmxlbmd0aCAvIDIpICogMiArIDFdO1xuICAgIH1cbiAgICBpZiAoeDEgPT0geCAmJiB4MiA9PSB4KSA7IGVsc2UgaWYgKHgxID49IHggJiYgeCA+PSB4MiB8fCB4MSA8PSB4ICYmIHggPD0geDIpIHtcbiAgICAgIHkzID0gKHggLSB4MSkgLyAoeDIgLSB4MSkgKiAoeTIgLSB5MSkgKyB5MTtcbiAgICAgIGlmICh5MyA+IHkpIHtcbiAgICAgICAgdXArKztcbiAgICAgIH1cblxuICAgICAgLy8gaWYoIHkzIDwgeSApe1xuICAgICAgLy8gZG93bisrO1xuICAgICAgLy8gfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gIH1cbiAgaWYgKHVwICUgMiA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbnZhciBwb2ludEluc2lkZVBvbHlnb24gPSBmdW5jdGlvbiBwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgYmFzZVBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgZGlyZWN0aW9uLCBwYWRkaW5nKSB7XG4gIHZhciB0cmFuc2Zvcm1lZFBvaW50cyA9IG5ldyBBcnJheShiYXNlUG9pbnRzLmxlbmd0aCk7XG5cbiAgLy8gR2l2ZXMgbmVnYXRpdmUgYW5nbGVcbiAgdmFyIGFuZ2xlO1xuICBpZiAoZGlyZWN0aW9uWzBdICE9IG51bGwpIHtcbiAgICBhbmdsZSA9IE1hdGguYXRhbihkaXJlY3Rpb25bMV0gLyBkaXJlY3Rpb25bMF0pO1xuICAgIGlmIChkaXJlY3Rpb25bMF0gPCAwKSB7XG4gICAgICBhbmdsZSA9IGFuZ2xlICsgTWF0aC5QSSAvIDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFuZ2xlID0gLWFuZ2xlIC0gTWF0aC5QSSAvIDI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGFuZ2xlID0gZGlyZWN0aW9uO1xuICB9XG4gIHZhciBjb3MgPSBNYXRoLmNvcygtYW5nbGUpO1xuICB2YXIgc2luID0gTWF0aC5zaW4oLWFuZ2xlKTtcblxuICAvLyAgICBjb25zb2xlLmxvZyhcImJhc2U6IFwiICsgYmFzZVBvaW50cyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhbnNmb3JtZWRQb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgdHJhbnNmb3JtZWRQb2ludHNbaSAqIDJdID0gd2lkdGggLyAyICogKGJhc2VQb2ludHNbaSAqIDJdICogY29zIC0gYmFzZVBvaW50c1tpICogMiArIDFdICogc2luKTtcbiAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMiArIDFdID0gaGVpZ2h0IC8gMiAqIChiYXNlUG9pbnRzW2kgKiAyICsgMV0gKiBjb3MgKyBiYXNlUG9pbnRzW2kgKiAyXSAqIHNpbik7XG4gICAgdHJhbnNmb3JtZWRQb2ludHNbaSAqIDJdICs9IGNlbnRlclg7XG4gICAgdHJhbnNmb3JtZWRQb2ludHNbaSAqIDIgKyAxXSArPSBjZW50ZXJZO1xuICB9XG4gIHZhciBwb2ludHM7XG4gIGlmIChwYWRkaW5nID4gMCkge1xuICAgIHZhciBleHBhbmRlZExpbmVTZXQgPSBleHBhbmRQb2x5Z29uKHRyYW5zZm9ybWVkUG9pbnRzLCAtcGFkZGluZyk7XG4gICAgcG9pbnRzID0gam9pbkxpbmVzKGV4cGFuZGVkTGluZVNldCk7XG4gIH0gZWxzZSB7XG4gICAgcG9pbnRzID0gdHJhbnNmb3JtZWRQb2ludHM7XG4gIH1cbiAgcmV0dXJuIHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBwb2ludHMpO1xufTtcbnZhciBwb2ludEluc2lkZVJvdW5kUG9seWdvbiA9IGZ1bmN0aW9uIHBvaW50SW5zaWRlUm91bmRQb2x5Z29uKHgsIHksIGJhc2VQb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lcnMpIHtcbiAgdmFyIGN1dFBvbHlnb25Qb2ludHMgPSBuZXcgQXJyYXkoYmFzZVBvaW50cy5sZW5ndGggKiAyKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3JuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNvcm5lciA9IGNvcm5lcnNbaV07XG4gICAgY3V0UG9seWdvblBvaW50c1tpICogNCArIDBdID0gY29ybmVyLnN0YXJ0WDtcbiAgICBjdXRQb2x5Z29uUG9pbnRzW2kgKiA0ICsgMV0gPSBjb3JuZXIuc3RhcnRZO1xuICAgIGN1dFBvbHlnb25Qb2ludHNbaSAqIDQgKyAyXSA9IGNvcm5lci5zdG9wWDtcbiAgICBjdXRQb2x5Z29uUG9pbnRzW2kgKiA0ICsgM10gPSBjb3JuZXIuc3RvcFk7XG4gICAgdmFyIHNxdWFyZWREaXN0YW5jZSA9IE1hdGgucG93KGNvcm5lci5jeCAtIHgsIDIpICsgTWF0aC5wb3coY29ybmVyLmN5IC0geSwgMik7XG4gICAgaWYgKHNxdWFyZWREaXN0YW5jZSA8PSBNYXRoLnBvdyhjb3JuZXIucmFkaXVzLCAyKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgY3V0UG9seWdvblBvaW50cyk7XG59O1xudmFyIGpvaW5MaW5lcyA9IGZ1bmN0aW9uIGpvaW5MaW5lcyhsaW5lU2V0KSB7XG4gIHZhciB2ZXJ0aWNlcyA9IG5ldyBBcnJheShsaW5lU2V0Lmxlbmd0aCAvIDIpO1xuICB2YXIgY3VycmVudExpbmVTdGFydFgsIGN1cnJlbnRMaW5lU3RhcnRZLCBjdXJyZW50TGluZUVuZFgsIGN1cnJlbnRMaW5lRW5kWTtcbiAgdmFyIG5leHRMaW5lU3RhcnRYLCBuZXh0TGluZVN0YXJ0WSwgbmV4dExpbmVFbmRYLCBuZXh0TGluZUVuZFk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZVNldC5sZW5ndGggLyA0OyBpKyspIHtcbiAgICBjdXJyZW50TGluZVN0YXJ0WCA9IGxpbmVTZXRbaSAqIDRdO1xuICAgIGN1cnJlbnRMaW5lU3RhcnRZID0gbGluZVNldFtpICogNCArIDFdO1xuICAgIGN1cnJlbnRMaW5lRW5kWCA9IGxpbmVTZXRbaSAqIDQgKyAyXTtcbiAgICBjdXJyZW50TGluZUVuZFkgPSBsaW5lU2V0W2kgKiA0ICsgM107XG4gICAgaWYgKGkgPCBsaW5lU2V0Lmxlbmd0aCAvIDQgLSAxKSB7XG4gICAgICBuZXh0TGluZVN0YXJ0WCA9IGxpbmVTZXRbKGkgKyAxKSAqIDRdO1xuICAgICAgbmV4dExpbmVTdGFydFkgPSBsaW5lU2V0WyhpICsgMSkgKiA0ICsgMV07XG4gICAgICBuZXh0TGluZUVuZFggPSBsaW5lU2V0WyhpICsgMSkgKiA0ICsgMl07XG4gICAgICBuZXh0TGluZUVuZFkgPSBsaW5lU2V0WyhpICsgMSkgKiA0ICsgM107XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRMaW5lU3RhcnRYID0gbGluZVNldFswXTtcbiAgICAgIG5leHRMaW5lU3RhcnRZID0gbGluZVNldFsxXTtcbiAgICAgIG5leHRMaW5lRW5kWCA9IGxpbmVTZXRbMl07XG4gICAgICBuZXh0TGluZUVuZFkgPSBsaW5lU2V0WzNdO1xuICAgIH1cbiAgICB2YXIgaW50ZXJzZWN0aW9uID0gZmluaXRlTGluZXNJbnRlcnNlY3QoY3VycmVudExpbmVTdGFydFgsIGN1cnJlbnRMaW5lU3RhcnRZLCBjdXJyZW50TGluZUVuZFgsIGN1cnJlbnRMaW5lRW5kWSwgbmV4dExpbmVTdGFydFgsIG5leHRMaW5lU3RhcnRZLCBuZXh0TGluZUVuZFgsIG5leHRMaW5lRW5kWSwgdHJ1ZSk7XG4gICAgdmVydGljZXNbaSAqIDJdID0gaW50ZXJzZWN0aW9uWzBdO1xuICAgIHZlcnRpY2VzW2kgKiAyICsgMV0gPSBpbnRlcnNlY3Rpb25bMV07XG4gIH1cbiAgcmV0dXJuIHZlcnRpY2VzO1xufTtcbnZhciBleHBhbmRQb2x5Z29uID0gZnVuY3Rpb24gZXhwYW5kUG9seWdvbihwb2ludHMsIHBhZCkge1xuICB2YXIgZXhwYW5kZWRMaW5lU2V0ID0gbmV3IEFycmF5KHBvaW50cy5sZW5ndGggKiAyKTtcbiAgdmFyIGN1cnJlbnRQb2ludFgsIGN1cnJlbnRQb2ludFksIG5leHRQb2ludFgsIG5leHRQb2ludFk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aCAvIDI7IGkrKykge1xuICAgIGN1cnJlbnRQb2ludFggPSBwb2ludHNbaSAqIDJdO1xuICAgIGN1cnJlbnRQb2ludFkgPSBwb2ludHNbaSAqIDIgKyAxXTtcbiAgICBpZiAoaSA8IHBvaW50cy5sZW5ndGggLyAyIC0gMSkge1xuICAgICAgbmV4dFBvaW50WCA9IHBvaW50c1soaSArIDEpICogMl07XG4gICAgICBuZXh0UG9pbnRZID0gcG9pbnRzWyhpICsgMSkgKiAyICsgMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRQb2ludFggPSBwb2ludHNbMF07XG4gICAgICBuZXh0UG9pbnRZID0gcG9pbnRzWzFdO1xuICAgIH1cblxuICAgIC8vIEN1cnJlbnQgbGluZTogW2N1cnJlbnRQb2ludFgsIGN1cnJlbnRQb2ludFldIHRvIFtuZXh0UG9pbnRYLCBuZXh0UG9pbnRZXVxuXG4gICAgLy8gQXNzdW1lIENDVyBwb2x5Z29uIHdpbmRpbmdcblxuICAgIHZhciBvZmZzZXRYID0gbmV4dFBvaW50WSAtIGN1cnJlbnRQb2ludFk7XG4gICAgdmFyIG9mZnNldFkgPSAtKG5leHRQb2ludFggLSBjdXJyZW50UG9pbnRYKTtcblxuICAgIC8vIE5vcm1hbGl6ZVxuICAgIHZhciBvZmZzZXRMZW5ndGggPSBNYXRoLnNxcnQob2Zmc2V0WCAqIG9mZnNldFggKyBvZmZzZXRZICogb2Zmc2V0WSk7XG4gICAgdmFyIG5vcm1hbGl6ZWRPZmZzZXRYID0gb2Zmc2V0WCAvIG9mZnNldExlbmd0aDtcbiAgICB2YXIgbm9ybWFsaXplZE9mZnNldFkgPSBvZmZzZXRZIC8gb2Zmc2V0TGVuZ3RoO1xuICAgIGV4cGFuZGVkTGluZVNldFtpICogNF0gPSBjdXJyZW50UG9pbnRYICsgbm9ybWFsaXplZE9mZnNldFggKiBwYWQ7XG4gICAgZXhwYW5kZWRMaW5lU2V0W2kgKiA0ICsgMV0gPSBjdXJyZW50UG9pbnRZICsgbm9ybWFsaXplZE9mZnNldFkgKiBwYWQ7XG4gICAgZXhwYW5kZWRMaW5lU2V0W2kgKiA0ICsgMl0gPSBuZXh0UG9pbnRYICsgbm9ybWFsaXplZE9mZnNldFggKiBwYWQ7XG4gICAgZXhwYW5kZWRMaW5lU2V0W2kgKiA0ICsgM10gPSBuZXh0UG9pbnRZICsgbm9ybWFsaXplZE9mZnNldFkgKiBwYWQ7XG4gIH1cbiAgcmV0dXJuIGV4cGFuZGVkTGluZVNldDtcbn07XG52YXIgaW50ZXJzZWN0TGluZUVsbGlwc2UgPSBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lRWxsaXBzZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCBlbGxpcHNlV3JhZGl1cywgZWxsaXBzZUhyYWRpdXMpIHtcbiAgdmFyIGRpc3BYID0gY2VudGVyWCAtIHg7XG4gIHZhciBkaXNwWSA9IGNlbnRlclkgLSB5O1xuICBkaXNwWCAvPSBlbGxpcHNlV3JhZGl1cztcbiAgZGlzcFkgLz0gZWxsaXBzZUhyYWRpdXM7XG4gIHZhciBsZW4gPSBNYXRoLnNxcnQoZGlzcFggKiBkaXNwWCArIGRpc3BZICogZGlzcFkpO1xuICB2YXIgbmV3TGVuZ3RoID0gbGVuIC0gMTtcbiAgaWYgKG5ld0xlbmd0aCA8IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIGxlblByb3BvcnRpb24gPSBuZXdMZW5ndGggLyBsZW47XG4gIHJldHVybiBbKGNlbnRlclggLSB4KSAqIGxlblByb3BvcnRpb24gKyB4LCAoY2VudGVyWSAtIHkpICogbGVuUHJvcG9ydGlvbiArIHldO1xufTtcbnZhciBjaGVja0luRWxsaXBzZSA9IGZ1bmN0aW9uIGNoZWNrSW5FbGxpcHNlKHgsIHksIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIHBhZGRpbmcpIHtcbiAgeCAtPSBjZW50ZXJYO1xuICB5IC09IGNlbnRlclk7XG4gIHggLz0gd2lkdGggLyAyICsgcGFkZGluZztcbiAgeSAvPSBoZWlnaHQgLyAyICsgcGFkZGluZztcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgPD0gMTtcbn07XG5cbi8vIFJldHVybnMgaW50ZXJzZWN0aW9ucyBvZiBpbmNyZWFzaW5nIGRpc3RhbmNlIGZyb20gbGluZSdzIHN0YXJ0IHBvaW50XG52YXIgaW50ZXJzZWN0TGluZUNpcmNsZSA9IGZ1bmN0aW9uIGludGVyc2VjdExpbmVDaXJjbGUoeDEsIHkxLCB4MiwgeTIsIGNlbnRlclgsIGNlbnRlclksIHJhZGl1cykge1xuICAvLyBDYWxjdWxhdGUgZCwgZGlyZWN0aW9uIHZlY3RvciBvZiBsaW5lXG4gIHZhciBkID0gW3gyIC0geDEsIHkyIC0geTFdOyAvLyBEaXJlY3Rpb24gdmVjdG9yIG9mIGxpbmVcbiAgdmFyIGYgPSBbeDEgLSBjZW50ZXJYLCB5MSAtIGNlbnRlclldO1xuICB2YXIgYSA9IGRbMF0gKiBkWzBdICsgZFsxXSAqIGRbMV07XG4gIHZhciBiID0gMiAqIChmWzBdICogZFswXSArIGZbMV0gKiBkWzFdKTtcbiAgdmFyIGMgPSBmWzBdICogZlswXSArIGZbMV0gKiBmWzFdIC0gcmFkaXVzICogcmFkaXVzO1xuICB2YXIgZGlzY3JpbWluYW50ID0gYiAqIGIgLSA0ICogYSAqIGM7XG4gIGlmIChkaXNjcmltaW5hbnQgPCAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciB0MSA9ICgtYiArIE1hdGguc3FydChkaXNjcmltaW5hbnQpKSAvICgyICogYSk7XG4gIHZhciB0MiA9ICgtYiAtIE1hdGguc3FydChkaXNjcmltaW5hbnQpKSAvICgyICogYSk7XG4gIHZhciB0TWluID0gTWF0aC5taW4odDEsIHQyKTtcbiAgdmFyIHRNYXggPSBNYXRoLm1heCh0MSwgdDIpO1xuICB2YXIgaW5SYW5nZVBhcmFtcyA9IFtdO1xuICBpZiAodE1pbiA+PSAwICYmIHRNaW4gPD0gMSkge1xuICAgIGluUmFuZ2VQYXJhbXMucHVzaCh0TWluKTtcbiAgfVxuICBpZiAodE1heCA+PSAwICYmIHRNYXggPD0gMSkge1xuICAgIGluUmFuZ2VQYXJhbXMucHVzaCh0TWF4KTtcbiAgfVxuICBpZiAoaW5SYW5nZVBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIG5lYXJJbnRlcnNlY3Rpb25YID0gaW5SYW5nZVBhcmFtc1swXSAqIGRbMF0gKyB4MTtcbiAgdmFyIG5lYXJJbnRlcnNlY3Rpb25ZID0gaW5SYW5nZVBhcmFtc1swXSAqIGRbMV0gKyB5MTtcbiAgaWYgKGluUmFuZ2VQYXJhbXMubGVuZ3RoID4gMSkge1xuICAgIGlmIChpblJhbmdlUGFyYW1zWzBdID09IGluUmFuZ2VQYXJhbXNbMV0pIHtcbiAgICAgIHJldHVybiBbbmVhckludGVyc2VjdGlvblgsIG5lYXJJbnRlcnNlY3Rpb25ZXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZhckludGVyc2VjdGlvblggPSBpblJhbmdlUGFyYW1zWzFdICogZFswXSArIHgxO1xuICAgICAgdmFyIGZhckludGVyc2VjdGlvblkgPSBpblJhbmdlUGFyYW1zWzFdICogZFsxXSArIHkxO1xuICAgICAgcmV0dXJuIFtuZWFySW50ZXJzZWN0aW9uWCwgbmVhckludGVyc2VjdGlvblksIGZhckludGVyc2VjdGlvblgsIGZhckludGVyc2VjdGlvblldO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW25lYXJJbnRlcnNlY3Rpb25YLCBuZWFySW50ZXJzZWN0aW9uWV07XG4gIH1cbn07XG52YXIgbWlkT2ZUaHJlZSA9IGZ1bmN0aW9uIG1pZE9mVGhyZWUoYSwgYiwgYykge1xuICBpZiAoYiA8PSBhICYmIGEgPD0gYyB8fCBjIDw9IGEgJiYgYSA8PSBiKSB7XG4gICAgcmV0dXJuIGE7XG4gIH0gZWxzZSBpZiAoYSA8PSBiICYmIGIgPD0gYyB8fCBjIDw9IGIgJiYgYiA8PSBhKSB7XG4gICAgcmV0dXJuIGI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGM7XG4gIH1cbn07XG5cbi8vICh4MSx5MSk9Pih4Mix5MikgaW50ZXJzZWN0IHdpdGggKHgzLHkzKT0+KHg0LHk0KVxudmFyIGZpbml0ZUxpbmVzSW50ZXJzZWN0ID0gZnVuY3Rpb24gZmluaXRlTGluZXNJbnRlcnNlY3QoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0LCBpbmZpbml0ZUxpbmVzKSB7XG4gIHZhciBkeDEzID0geDEgLSB4MztcbiAgdmFyIGR4MjEgPSB4MiAtIHgxO1xuICB2YXIgZHg0MyA9IHg0IC0geDM7XG4gIHZhciBkeTEzID0geTEgLSB5MztcbiAgdmFyIGR5MjEgPSB5MiAtIHkxO1xuICB2YXIgZHk0MyA9IHk0IC0geTM7XG4gIHZhciB1YV90ID0gZHg0MyAqIGR5MTMgLSBkeTQzICogZHgxMztcbiAgdmFyIHViX3QgPSBkeDIxICogZHkxMyAtIGR5MjEgKiBkeDEzO1xuICB2YXIgdV9iID0gZHk0MyAqIGR4MjEgLSBkeDQzICogZHkyMTtcbiAgaWYgKHVfYiAhPT0gMCkge1xuICAgIHZhciB1YSA9IHVhX3QgLyB1X2I7XG4gICAgdmFyIHViID0gdWJfdCAvIHVfYjtcbiAgICB2YXIgZmxwdFRocmVzaG9sZCA9IDAuMDAxO1xuICAgIHZhciBfbWluID0gMCAtIGZscHRUaHJlc2hvbGQ7XG4gICAgdmFyIF9tYXggPSAxICsgZmxwdFRocmVzaG9sZDtcbiAgICBpZiAoX21pbiA8PSB1YSAmJiB1YSA8PSBfbWF4ICYmIF9taW4gPD0gdWIgJiYgdWIgPD0gX21heCkge1xuICAgICAgcmV0dXJuIFt4MSArIHVhICogZHgyMSwgeTEgKyB1YSAqIGR5MjFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWluZmluaXRlTGluZXMpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFt4MSArIHVhICogZHgyMSwgeTEgKyB1YSAqIGR5MjFdO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodWFfdCA9PT0gMCB8fCB1Yl90ID09PSAwKSB7XG4gICAgICAvLyBQYXJhbGxlbCwgY29pbmNpZGVudCBsaW5lcy4gQ2hlY2sgaWYgb3ZlcmxhcFxuXG4gICAgICAvLyBDaGVjayBlbmRwb2ludCBvZiBzZWNvbmQgbGluZVxuICAgICAgaWYgKG1pZE9mVGhyZWUoeDEsIHgyLCB4NCkgPT09IHg0KSB7XG4gICAgICAgIHJldHVybiBbeDQsIHk0XTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgc3RhcnQgcG9pbnQgb2Ygc2Vjb25kIGxpbmVcbiAgICAgIGlmIChtaWRPZlRocmVlKHgxLCB4MiwgeDMpID09PSB4Mykge1xuICAgICAgICByZXR1cm4gW3gzLCB5M107XG4gICAgICB9XG5cbiAgICAgIC8vIEVuZHBvaW50IG9mIGZpcnN0IGxpbmVcbiAgICAgIGlmIChtaWRPZlRocmVlKHgzLCB4NCwgeDIpID09PSB4Mikge1xuICAgICAgICByZXR1cm4gW3gyLCB5Ml07XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBhcmFsbGVsLCBub24tY29pbmNpZGVudFxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxufTtcblxuLy8gbWF0aC5wb2x5Z29uSW50ZXJzZWN0TGluZSggeCwgeSwgYmFzZVBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZyApXG4vLyBpbnRlcnNlY3QgYSBub2RlIHBvbHlnb24gKHB0cyB0cmFuc2Zvcm1lZClcbi8vXG4vLyBtYXRoLnBvbHlnb25JbnRlcnNlY3RMaW5lKCB4LCB5LCBiYXNlUG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZIClcbi8vIGludGVyc2VjdCB0aGUgcG9pbnRzIChubyB0cmFuc2Zvcm0pXG52YXIgcG9seWdvbkludGVyc2VjdExpbmUgPSBmdW5jdGlvbiBwb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCBiYXNlUG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nKSB7XG4gIHZhciBpbnRlcnNlY3Rpb25zID0gW107XG4gIHZhciBpbnRlcnNlY3Rpb247XG4gIHZhciB0cmFuc2Zvcm1lZFBvaW50cyA9IG5ldyBBcnJheShiYXNlUG9pbnRzLmxlbmd0aCk7XG4gIHZhciBkb1RyYW5zZm9ybSA9IHRydWU7XG4gIGlmICh3aWR0aCA9PSBudWxsKSB7XG4gICAgZG9UcmFuc2Zvcm0gPSBmYWxzZTtcbiAgfVxuICB2YXIgcG9pbnRzO1xuICBpZiAoZG9UcmFuc2Zvcm0pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYW5zZm9ybWVkUG9pbnRzLmxlbmd0aCAvIDI7IGkrKykge1xuICAgICAgdHJhbnNmb3JtZWRQb2ludHNbaSAqIDJdID0gYmFzZVBvaW50c1tpICogMl0gKiB3aWR0aCArIGNlbnRlclg7XG4gICAgICB0cmFuc2Zvcm1lZFBvaW50c1tpICogMiArIDFdID0gYmFzZVBvaW50c1tpICogMiArIDFdICogaGVpZ2h0ICsgY2VudGVyWTtcbiAgICB9XG4gICAgaWYgKHBhZGRpbmcgPiAwKSB7XG4gICAgICB2YXIgZXhwYW5kZWRMaW5lU2V0ID0gZXhwYW5kUG9seWdvbih0cmFuc2Zvcm1lZFBvaW50cywgLXBhZGRpbmcpO1xuICAgICAgcG9pbnRzID0gam9pbkxpbmVzKGV4cGFuZGVkTGluZVNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvaW50cyA9IHRyYW5zZm9ybWVkUG9pbnRzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBwb2ludHMgPSBiYXNlUG9pbnRzO1xuICB9XG4gIHZhciBjdXJyZW50WCwgY3VycmVudFksIG5leHRYLCBuZXh0WTtcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgcG9pbnRzLmxlbmd0aCAvIDI7IF9pMisrKSB7XG4gICAgY3VycmVudFggPSBwb2ludHNbX2kyICogMl07XG4gICAgY3VycmVudFkgPSBwb2ludHNbX2kyICogMiArIDFdO1xuICAgIGlmIChfaTIgPCBwb2ludHMubGVuZ3RoIC8gMiAtIDEpIHtcbiAgICAgIG5leHRYID0gcG9pbnRzWyhfaTIgKyAxKSAqIDJdO1xuICAgICAgbmV4dFkgPSBwb2ludHNbKF9pMiArIDEpICogMiArIDFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0WCA9IHBvaW50c1swXTtcbiAgICAgIG5leHRZID0gcG9pbnRzWzFdO1xuICAgIH1cbiAgICBpbnRlcnNlY3Rpb24gPSBmaW5pdGVMaW5lc0ludGVyc2VjdCh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCBjdXJyZW50WCwgY3VycmVudFksIG5leHRYLCBuZXh0WSk7XG4gICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggIT09IDApIHtcbiAgICAgIGludGVyc2VjdGlvbnMucHVzaChpbnRlcnNlY3Rpb25bMF0sIGludGVyc2VjdGlvblsxXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbnRlcnNlY3Rpb25zO1xufTtcbnZhciByb3VuZFBvbHlnb25JbnRlcnNlY3RMaW5lID0gZnVuY3Rpb24gcm91bmRQb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCBiYXNlUG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nLCBjb3JuZXJzKSB7XG4gIHZhciBpbnRlcnNlY3Rpb25zID0gW107XG4gIHZhciBpbnRlcnNlY3Rpb247XG4gIHZhciBsaW5lcyA9IG5ldyBBcnJheShiYXNlUG9pbnRzLmxlbmd0aCAqIDIpO1xuICBjb3JuZXJzLmZvckVhY2goZnVuY3Rpb24gKGNvcm5lciwgaSkge1xuICAgIGlmIChpID09PSAwKSB7XG4gICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAyXSA9IGNvcm5lci5zdGFydFg7XG4gICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9IGNvcm5lci5zdGFydFk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVzW2kgKiA0IC0gMl0gPSBjb3JuZXIuc3RhcnRYO1xuICAgICAgbGluZXNbaSAqIDQgLSAxXSA9IGNvcm5lci5zdGFydFk7XG4gICAgfVxuICAgIGxpbmVzW2kgKiA0XSA9IGNvcm5lci5zdG9wWDtcbiAgICBsaW5lc1tpICogNCArIDFdID0gY29ybmVyLnN0b3BZO1xuICAgIGludGVyc2VjdGlvbiA9IGludGVyc2VjdExpbmVDaXJjbGUoeCwgeSwgY2VudGVyWCwgY2VudGVyWSwgY29ybmVyLmN4LCBjb3JuZXIuY3ksIGNvcm5lci5yYWRpdXMpO1xuICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoICE9PSAwKSB7XG4gICAgICBpbnRlcnNlY3Rpb25zLnB1c2goaW50ZXJzZWN0aW9uWzBdLCBpbnRlcnNlY3Rpb25bMV0pO1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoIC8gNDsgaSsrKSB7XG4gICAgaW50ZXJzZWN0aW9uID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgY2VudGVyWCwgY2VudGVyWSwgbGluZXNbaSAqIDRdLCBsaW5lc1tpICogNCArIDFdLCBsaW5lc1tpICogNCArIDJdLCBsaW5lc1tpICogNCArIDNdLCBmYWxzZSk7XG4gICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggIT09IDApIHtcbiAgICAgIGludGVyc2VjdGlvbnMucHVzaChpbnRlcnNlY3Rpb25bMF0sIGludGVyc2VjdGlvblsxXSk7XG4gICAgfVxuICB9XG4gIGlmIChpbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDIpIHtcbiAgICB2YXIgbG93ZXN0SW50ZXJzZWN0aW9uID0gW2ludGVyc2VjdGlvbnNbMF0sIGludGVyc2VjdGlvbnNbMV1dO1xuICAgIHZhciBsb3dlc3RTcXVhcmVkRGlzdGFuY2UgPSBNYXRoLnBvdyhsb3dlc3RJbnRlcnNlY3Rpb25bMF0gLSB4LCAyKSArIE1hdGgucG93KGxvd2VzdEludGVyc2VjdGlvblsxXSAtIHksIDIpO1xuICAgIGZvciAodmFyIF9pMyA9IDE7IF9pMyA8IGludGVyc2VjdGlvbnMubGVuZ3RoIC8gMjsgX2kzKyspIHtcbiAgICAgIHZhciBzcXVhcmVkRGlzdGFuY2UgPSBNYXRoLnBvdyhpbnRlcnNlY3Rpb25zW19pMyAqIDJdIC0geCwgMikgKyBNYXRoLnBvdyhpbnRlcnNlY3Rpb25zW19pMyAqIDIgKyAxXSAtIHksIDIpO1xuICAgICAgaWYgKHNxdWFyZWREaXN0YW5jZSA8PSBsb3dlc3RTcXVhcmVkRGlzdGFuY2UpIHtcbiAgICAgICAgbG93ZXN0SW50ZXJzZWN0aW9uWzBdID0gaW50ZXJzZWN0aW9uc1tfaTMgKiAyXTtcbiAgICAgICAgbG93ZXN0SW50ZXJzZWN0aW9uWzFdID0gaW50ZXJzZWN0aW9uc1tfaTMgKiAyICsgMV07XG4gICAgICAgIGxvd2VzdFNxdWFyZWREaXN0YW5jZSA9IHNxdWFyZWREaXN0YW5jZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxvd2VzdEludGVyc2VjdGlvbjtcbiAgfVxuICByZXR1cm4gaW50ZXJzZWN0aW9ucztcbn07XG52YXIgc2hvcnRlbkludGVyc2VjdGlvbiA9IGZ1bmN0aW9uIHNob3J0ZW5JbnRlcnNlY3Rpb24oaW50ZXJzZWN0aW9uLCBvZmZzZXQsIGFtb3VudCkge1xuICB2YXIgZGlzcCA9IFtpbnRlcnNlY3Rpb25bMF0gLSBvZmZzZXRbMF0sIGludGVyc2VjdGlvblsxXSAtIG9mZnNldFsxXV07XG4gIHZhciBsZW5ndGggPSBNYXRoLnNxcnQoZGlzcFswXSAqIGRpc3BbMF0gKyBkaXNwWzFdICogZGlzcFsxXSk7XG4gIHZhciBsZW5SYXRpbyA9IChsZW5ndGggLSBhbW91bnQpIC8gbGVuZ3RoO1xuICBpZiAobGVuUmF0aW8gPCAwKSB7XG4gICAgbGVuUmF0aW8gPSAwLjAwMDAxO1xuICB9XG4gIHJldHVybiBbb2Zmc2V0WzBdICsgbGVuUmF0aW8gKiBkaXNwWzBdLCBvZmZzZXRbMV0gKyBsZW5SYXRpbyAqIGRpc3BbMV1dO1xufTtcbnZhciBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUgPSBmdW5jdGlvbiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoc2lkZXMsIHJvdGF0aW9uUmFkaWFucykge1xuICB2YXIgcG9pbnRzID0gZ2VuZXJhdGVVbml0TmdvblBvaW50cyhzaWRlcywgcm90YXRpb25SYWRpYW5zKTtcbiAgcG9pbnRzID0gZml0UG9seWdvblRvU3F1YXJlKHBvaW50cyk7XG4gIHJldHVybiBwb2ludHM7XG59O1xudmFyIGZpdFBvbHlnb25Ub1NxdWFyZSA9IGZ1bmN0aW9uIGZpdFBvbHlnb25Ub1NxdWFyZShwb2ludHMpIHtcbiAgdmFyIHgsIHk7XG4gIHZhciBzaWRlcyA9IHBvaW50cy5sZW5ndGggLyAyO1xuICB2YXIgbWluWCA9IEluZmluaXR5LFxuICAgIG1pblkgPSBJbmZpbml0eSxcbiAgICBtYXhYID0gLUluZmluaXR5LFxuICAgIG1heFkgPSAtSW5maW5pdHk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2lkZXM7IGkrKykge1xuICAgIHggPSBwb2ludHNbMiAqIGldO1xuICAgIHkgPSBwb2ludHNbMiAqIGkgKyAxXTtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCk7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHgpO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5KTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSk7XG4gIH1cblxuICAvLyBzdHJldGNoIGZhY3RvcnNcbiAgdmFyIHN4ID0gMiAvIChtYXhYIC0gbWluWCk7XG4gIHZhciBzeSA9IDIgLyAobWF4WSAtIG1pblkpO1xuICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBzaWRlczsgX2k0KyspIHtcbiAgICB4ID0gcG9pbnRzWzIgKiBfaTRdID0gcG9pbnRzWzIgKiBfaTRdICogc3g7XG4gICAgeSA9IHBvaW50c1syICogX2k0ICsgMV0gPSBwb2ludHNbMiAqIF9pNCArIDFdICogc3k7XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIHgpO1xuICAgIG1heFggPSBNYXRoLm1heChtYXhYLCB4KTtcbiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgeSk7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHkpO1xuICB9XG4gIGlmIChtaW5ZIDwgLTEpIHtcbiAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBzaWRlczsgX2k1KyspIHtcbiAgICAgIHkgPSBwb2ludHNbMiAqIF9pNSArIDFdID0gcG9pbnRzWzIgKiBfaTUgKyAxXSArICgtMSAtIG1pblkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcG9pbnRzO1xufTtcbnZhciBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzID0gZnVuY3Rpb24gZ2VuZXJhdGVVbml0TmdvblBvaW50cyhzaWRlcywgcm90YXRpb25SYWRpYW5zKSB7XG4gIHZhciBpbmNyZW1lbnQgPSAxLjAgLyBzaWRlcyAqIDIgKiBNYXRoLlBJO1xuICB2YXIgc3RhcnRBbmdsZSA9IHNpZGVzICUgMiA9PT0gMCA/IE1hdGguUEkgLyAyLjAgKyBpbmNyZW1lbnQgLyAyLjAgOiBNYXRoLlBJIC8gMi4wO1xuICBzdGFydEFuZ2xlICs9IHJvdGF0aW9uUmFkaWFucztcbiAgdmFyIHBvaW50cyA9IG5ldyBBcnJheShzaWRlcyAqIDIpO1xuICB2YXIgY3VycmVudEFuZ2xlO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZGVzOyBpKyspIHtcbiAgICBjdXJyZW50QW5nbGUgPSBpICogaW5jcmVtZW50ICsgc3RhcnRBbmdsZTtcbiAgICBwb2ludHNbMiAqIGldID0gTWF0aC5jb3MoY3VycmVudEFuZ2xlKTsgLy8geFxuICAgIHBvaW50c1syICogaSArIDFdID0gTWF0aC5zaW4oLWN1cnJlbnRBbmdsZSk7IC8vIHlcbiAgfVxuXG4gIHJldHVybiBwb2ludHM7XG59O1xuXG4vLyBTZXQgdGhlIGRlZmF1bHQgcmFkaXVzLCB1bmxlc3MgaGFsZiBvZiB3aWR0aCBvciBoZWlnaHQgaXMgc21hbGxlciB0aGFuIGRlZmF1bHRcbnZhciBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyA9IGZ1bmN0aW9uIGdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpIHtcbiAgcmV0dXJuIE1hdGgubWluKHdpZHRoIC8gNCwgaGVpZ2h0IC8gNCwgOCk7XG59O1xuXG4vLyBTZXQgdGhlIGRlZmF1bHQgcmFkaXVzXG52YXIgZ2V0Um91bmRQb2x5Z29uUmFkaXVzID0gZnVuY3Rpb24gZ2V0Um91bmRQb2x5Z29uUmFkaXVzKHdpZHRoLCBoZWlnaHQpIHtcbiAgcmV0dXJuIE1hdGgubWluKHdpZHRoIC8gMTAsIGhlaWdodCAvIDEwLCA4KTtcbn07XG52YXIgZ2V0Q3V0UmVjdGFuZ2xlQ29ybmVyTGVuZ3RoID0gZnVuY3Rpb24gZ2V0Q3V0UmVjdGFuZ2xlQ29ybmVyTGVuZ3RoKCkge1xuICByZXR1cm4gODtcbn07XG52YXIgYmV6aWVyUHRzVG9RdWFkQ29lZmYgPSBmdW5jdGlvbiBiZXppZXJQdHNUb1F1YWRDb2VmZihwMCwgcDEsIHAyKSB7XG4gIHJldHVybiBbcDAgLSAyICogcDEgKyBwMiwgMiAqIChwMSAtIHAwKSwgcDBdO1xufTtcblxuLy8gZ2V0IGN1cnZlIHdpZHRoLCBoZWlnaHQsIGFuZCBjb250cm9sIHBvaW50IHBvc2l0aW9uIG9mZnNldHMgYXMgYSBwZXJjZW50YWdlIG9mIG5vZGUgaGVpZ2h0IC8gd2lkdGhcbnZhciBnZXRCYXJyZWxDdXJ2ZUNvbnN0YW50cyA9IGZ1bmN0aW9uIGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzKHdpZHRoLCBoZWlnaHQpIHtcbiAgcmV0dXJuIHtcbiAgICBoZWlnaHRPZmZzZXQ6IE1hdGgubWluKDE1LCAwLjA1ICogaGVpZ2h0KSxcbiAgICB3aWR0aE9mZnNldDogTWF0aC5taW4oMTAwLCAwLjI1ICogd2lkdGgpLFxuICAgIGN0cmxQdE9mZnNldFBjdDogMC4wNVxuICB9O1xufTtcblxudmFyIHBhZ2VSYW5rRGVmYXVsdHMgPSBkZWZhdWx0cyRnKHtcbiAgZGFtcGluZ0ZhY3RvcjogMC44LFxuICBwcmVjaXNpb246IDAuMDAwMDAxLFxuICBpdGVyYXRpb25zOiAyMDAsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KGVkZ2UpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxufSk7XG52YXIgZWxlc2ZuJG8gPSB7XG4gIHBhZ2VSYW5rOiBmdW5jdGlvbiBwYWdlUmFuayhvcHRpb25zKSB7XG4gICAgdmFyIF9wYWdlUmFua0RlZmF1bHRzID0gcGFnZVJhbmtEZWZhdWx0cyhvcHRpb25zKSxcbiAgICAgIGRhbXBpbmdGYWN0b3IgPSBfcGFnZVJhbmtEZWZhdWx0cy5kYW1waW5nRmFjdG9yLFxuICAgICAgcHJlY2lzaW9uID0gX3BhZ2VSYW5rRGVmYXVsdHMucHJlY2lzaW9uLFxuICAgICAgaXRlcmF0aW9ucyA9IF9wYWdlUmFua0RlZmF1bHRzLml0ZXJhdGlvbnMsXG4gICAgICB3ZWlnaHQgPSBfcGFnZVJhbmtEZWZhdWx0cy53ZWlnaHQ7XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgICB2YXIgX3RoaXMkYnlHcm91cCA9IHRoaXMuYnlHcm91cCgpLFxuICAgICAgbm9kZXMgPSBfdGhpcyRieUdyb3VwLm5vZGVzLFxuICAgICAgZWRnZXMgPSBfdGhpcyRieUdyb3VwLmVkZ2VzO1xuICAgIHZhciBudW1Ob2RlcyA9IG5vZGVzLmxlbmd0aDtcbiAgICB2YXIgbnVtTm9kZXNTcWQgPSBudW1Ob2RlcyAqIG51bU5vZGVzO1xuICAgIHZhciBudW1FZGdlcyA9IGVkZ2VzLmxlbmd0aDtcblxuICAgIC8vIENvbnN0cnVjdCB0cmFuc3Bvc2VkIGFkamFjZW5jeSBtYXRyaXhcbiAgICAvLyBGaXJzdCBsZXRzIGhhdmUgYSB6ZXJvZWQgbWF0cml4IG9mIHRoZSByaWdodCBzaXplXG4gICAgLy8gV2UnbGwgYWxzbyBrZWVwIHRyYWNrIG9mIHRoZSBzdW0gb2YgZWFjaCBjb2x1bW5cbiAgICB2YXIgbWF0cml4ID0gbmV3IEFycmF5KG51bU5vZGVzU3FkKTtcbiAgICB2YXIgY29sdW1uU3VtID0gbmV3IEFycmF5KG51bU5vZGVzKTtcbiAgICB2YXIgYWRkaXRpb25hbFByb2IgPSAoMSAtIGRhbXBpbmdGYWN0b3IpIC8gbnVtTm9kZXM7XG5cbiAgICAvLyBDcmVhdGUgbnVsbCBtYXRyaXhcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bU5vZGVzOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbnVtTm9kZXM7IGorKykge1xuICAgICAgICB2YXIgbiA9IGkgKiBudW1Ob2RlcyArIGo7XG4gICAgICAgIG1hdHJpeFtuXSA9IDA7XG4gICAgICB9XG4gICAgICBjb2x1bW5TdW1baV0gPSAwO1xuICAgIH1cblxuICAgIC8vIE5vdywgcHJvY2VzcyBlZGdlc1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBudW1FZGdlczsgX2krKykge1xuICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tfaV07XG4gICAgICB2YXIgc3JjSWQgPSBlZGdlLmRhdGEoJ3NvdXJjZScpO1xuICAgICAgdmFyIHRndElkID0gZWRnZS5kYXRhKCd0YXJnZXQnKTtcblxuICAgICAgLy8gRG9uJ3QgaW5jbHVkZSBsb29wcyBpbiB0aGUgbWF0cml4XG4gICAgICBpZiAoc3JjSWQgPT09IHRndElkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIHMgPSBub2Rlcy5pbmRleE9mSWQoc3JjSWQpO1xuICAgICAgdmFyIHQgPSBub2Rlcy5pbmRleE9mSWQodGd0SWQpO1xuICAgICAgdmFyIHcgPSB3ZWlnaHQoZWRnZSk7XG4gICAgICB2YXIgX24gPSB0ICogbnVtTm9kZXMgKyBzO1xuXG4gICAgICAvLyBVcGRhdGUgbWF0cml4XG4gICAgICBtYXRyaXhbX25dICs9IHc7XG5cbiAgICAgIC8vIFVwZGF0ZSBjb2x1bW4gc3VtXG4gICAgICBjb2x1bW5TdW1bc10gKz0gdztcbiAgICB9XG5cbiAgICAvLyBBZGQgYWRkaXRpb25hbCBwcm9iYWJpbGl0eSBiYXNlZCBvbiBkYW1waW5nIGZhY3RvclxuICAgIC8vIEFsc28sIHRha2UgaW50byBhY2NvdW50IGNvbHVtbnMgdGhhdCBoYXZlIHN1bSA9IDBcbiAgICB2YXIgcCA9IDEuMCAvIG51bU5vZGVzICsgYWRkaXRpb25hbFByb2I7IC8vIFNob3J0aGFuZFxuXG4gICAgLy8gVHJhdmVyc2UgbWF0cml4LCBjb2x1bW4gYnkgY29sdW1uXG4gICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IG51bU5vZGVzOyBfaisrKSB7XG4gICAgICBpZiAoY29sdW1uU3VtW19qXSA9PT0gMCkge1xuICAgICAgICAvLyBObyAnbGlua3MnIG91dCBmcm9tIG5vZGUganRoLCBhc3N1bWUgZXF1YWwgcHJvYmFiaWxpdHkgZm9yIGVhY2ggcG9zc2libGUgbm9kZVxuICAgICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBudW1Ob2RlczsgX2kyKyspIHtcbiAgICAgICAgICB2YXIgX24yID0gX2kyICogbnVtTm9kZXMgKyBfajtcbiAgICAgICAgICBtYXRyaXhbX24yXSA9IHA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vZGUganRoIGhhcyBvdXRnb2luZyBsaW5rLCBjb21wdXRlIG5vcm1hbGl6ZWQgcHJvYmFiaWxpdGllc1xuICAgICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBudW1Ob2RlczsgX2kzKyspIHtcbiAgICAgICAgICB2YXIgX24zID0gX2kzICogbnVtTm9kZXMgKyBfajtcbiAgICAgICAgICBtYXRyaXhbX24zXSA9IG1hdHJpeFtfbjNdIC8gY29sdW1uU3VtW19qXSArIGFkZGl0aW9uYWxQcm9iO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29tcHV0ZSBkb21pbmFudCBlaWdlbnZlY3RvciB1c2luZyBwb3dlciBtZXRob2RcbiAgICB2YXIgZWlnZW52ZWN0b3IgPSBuZXcgQXJyYXkobnVtTm9kZXMpO1xuICAgIHZhciB0ZW1wID0gbmV3IEFycmF5KG51bU5vZGVzKTtcbiAgICB2YXIgcHJldmlvdXM7XG5cbiAgICAvLyBTdGFydCB3aXRoIGEgdmVjdG9yIG9mIGFsbCAxJ3NcbiAgICAvLyBBbHNvLCBpbml0aWFsaXplIGEgbnVsbCB2ZWN0b3Igd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHNob3J0aGFuZFxuICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG51bU5vZGVzOyBfaTQrKykge1xuICAgICAgZWlnZW52ZWN0b3JbX2k0XSA9IDE7XG4gICAgfVxuICAgIGZvciAodmFyIGl0ZXIgPSAwOyBpdGVyIDwgaXRlcmF0aW9uczsgaXRlcisrKSB7XG4gICAgICAvLyBUZW1wIGFycmF5IHdpdGggYWxsIDAnc1xuICAgICAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgbnVtTm9kZXM7IF9pNSsrKSB7XG4gICAgICAgIHRlbXBbX2k1XSA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIE11bHRpcGx5IG1hdHJpeCB3aXRoIHByZXZpb3VzIHJlc3VsdFxuICAgICAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgbnVtTm9kZXM7IF9pNisrKSB7XG4gICAgICAgIGZvciAodmFyIF9qMiA9IDA7IF9qMiA8IG51bU5vZGVzOyBfajIrKykge1xuICAgICAgICAgIHZhciBfbjQgPSBfaTYgKiBudW1Ob2RlcyArIF9qMjtcbiAgICAgICAgICB0ZW1wW19pNl0gKz0gbWF0cml4W19uNF0gKiBlaWdlbnZlY3RvcltfajJdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpblBsYWNlU3VtTm9ybWFsaXplKHRlbXApO1xuICAgICAgcHJldmlvdXMgPSBlaWdlbnZlY3RvcjtcbiAgICAgIGVpZ2VudmVjdG9yID0gdGVtcDtcbiAgICAgIHRlbXAgPSBwcmV2aW91cztcbiAgICAgIHZhciBkaWZmID0gMDtcbiAgICAgIC8vIENvbXB1dGUgZGlmZmVyZW5jZSAoc3F1YXJlZCBtb2R1bGUpIG9mIGJvdGggdmVjdG9yc1xuICAgICAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgbnVtTm9kZXM7IF9pNysrKSB7XG4gICAgICAgIHZhciBkZWx0YSA9IHByZXZpb3VzW19pN10gLSBlaWdlbnZlY3RvcltfaTddO1xuICAgICAgICBkaWZmICs9IGRlbHRhICogZGVsdGE7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGRpZmZlcmVuY2UgaXMgbGVzcyB0aGFuIHRoZSBkZXNpcmVkIHRocmVzaG9sZCwgc3RvcCBpdGVyYXRpbmdcbiAgICAgIGlmIChkaWZmIDwgcHJlY2lzaW9uKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbnN0cnVjdCByZXN1bHRcbiAgICB2YXIgcmVzID0ge1xuICAgICAgcmFuazogZnVuY3Rpb24gcmFuayhub2RlKSB7XG4gICAgICAgIG5vZGUgPSBjeS5jb2xsZWN0aW9uKG5vZGUpWzBdO1xuICAgICAgICByZXR1cm4gZWlnZW52ZWN0b3Jbbm9kZXMuaW5kZXhPZihub2RlKV07XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gcmVzO1xuICB9IC8vIHBhZ2VSYW5rXG59OyAvLyBlbGVzZm5cblxudmFyIGRlZmF1bHRzJGYgPSBkZWZhdWx0cyRnKHtcbiAgcm9vdDogbnVsbCxcbiAgd2VpZ2h0OiBmdW5jdGlvbiB3ZWlnaHQoZWRnZSkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2UsXG4gIGFscGhhOiAwXG59KTtcbnZhciBlbGVzZm4kbiA9IHtcbiAgZGVncmVlQ2VudHJhbGl0eU5vcm1hbGl6ZWQ6IGZ1bmN0aW9uIGRlZ3JlZUNlbnRyYWxpdHlOb3JtYWxpemVkKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gZGVmYXVsdHMkZihvcHRpb25zKTtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICAgIHZhciBudW1Ob2RlcyA9IG5vZGVzLmxlbmd0aDtcbiAgICBpZiAoIW9wdGlvbnMuZGlyZWN0ZWQpIHtcbiAgICAgIHZhciBkZWdyZWVzID0ge307XG4gICAgICB2YXIgbWF4RGVncmVlID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTm9kZXM7IGkrKykge1xuICAgICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuXG4gICAgICAgIC8vIGFkZCBjdXJyZW50IG5vZGUgdG8gdGhlIGN1cnJlbnQgb3B0aW9ucyBvYmplY3QgYW5kIGNhbGwgZGVncmVlQ2VudHJhbGl0eVxuICAgICAgICBvcHRpb25zLnJvb3QgPSBub2RlO1xuICAgICAgICB2YXIgY3VyckRlZ3JlZSA9IHRoaXMuZGVncmVlQ2VudHJhbGl0eShvcHRpb25zKTtcbiAgICAgICAgaWYgKG1heERlZ3JlZSA8IGN1cnJEZWdyZWUuZGVncmVlKSB7XG4gICAgICAgICAgbWF4RGVncmVlID0gY3VyckRlZ3JlZS5kZWdyZWU7XG4gICAgICAgIH1cbiAgICAgICAgZGVncmVlc1tub2RlLmlkKCldID0gY3VyckRlZ3JlZS5kZWdyZWU7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZWdyZWU6IGZ1bmN0aW9uIGRlZ3JlZShub2RlKSB7XG4gICAgICAgICAgaWYgKG1heERlZ3JlZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdHJpbmcobm9kZSkpIHtcbiAgICAgICAgICAgIC8vIGZyb20gaXMgYSBzZWxlY3RvciBzdHJpbmdcbiAgICAgICAgICAgIG5vZGUgPSBjeS5maWx0ZXIobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkZWdyZWVzW25vZGUuaWQoKV0gLyBtYXhEZWdyZWU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpbmRlZ3JlZXMgPSB7fTtcbiAgICAgIHZhciBvdXRkZWdyZWVzID0ge307XG4gICAgICB2YXIgbWF4SW5kZWdyZWUgPSAwO1xuICAgICAgdmFyIG1heE91dGRlZ3JlZSA9IDA7XG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbnVtTm9kZXM7IF9pKyspIHtcbiAgICAgICAgdmFyIF9ub2RlID0gbm9kZXNbX2ldO1xuICAgICAgICB2YXIgaWQgPSBfbm9kZS5pZCgpO1xuXG4gICAgICAgIC8vIGFkZCBjdXJyZW50IG5vZGUgdG8gdGhlIGN1cnJlbnQgb3B0aW9ucyBvYmplY3QgYW5kIGNhbGwgZGVncmVlQ2VudHJhbGl0eVxuICAgICAgICBvcHRpb25zLnJvb3QgPSBfbm9kZTtcbiAgICAgICAgdmFyIF9jdXJyRGVncmVlID0gdGhpcy5kZWdyZWVDZW50cmFsaXR5KG9wdGlvbnMpO1xuICAgICAgICBpZiAobWF4SW5kZWdyZWUgPCBfY3VyckRlZ3JlZS5pbmRlZ3JlZSkgbWF4SW5kZWdyZWUgPSBfY3VyckRlZ3JlZS5pbmRlZ3JlZTtcbiAgICAgICAgaWYgKG1heE91dGRlZ3JlZSA8IF9jdXJyRGVncmVlLm91dGRlZ3JlZSkgbWF4T3V0ZGVncmVlID0gX2N1cnJEZWdyZWUub3V0ZGVncmVlO1xuICAgICAgICBpbmRlZ3JlZXNbaWRdID0gX2N1cnJEZWdyZWUuaW5kZWdyZWU7XG4gICAgICAgIG91dGRlZ3JlZXNbaWRdID0gX2N1cnJEZWdyZWUub3V0ZGVncmVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5kZWdyZWU6IGZ1bmN0aW9uIGluZGVncmVlKG5vZGUpIHtcbiAgICAgICAgICBpZiAobWF4SW5kZWdyZWUgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdHJpbmcobm9kZSkpIHtcbiAgICAgICAgICAgIC8vIGZyb20gaXMgYSBzZWxlY3RvciBzdHJpbmdcbiAgICAgICAgICAgIG5vZGUgPSBjeS5maWx0ZXIobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpbmRlZ3JlZXNbbm9kZS5pZCgpXSAvIG1heEluZGVncmVlO1xuICAgICAgICB9LFxuICAgICAgICBvdXRkZWdyZWU6IGZ1bmN0aW9uIG91dGRlZ3JlZShub2RlKSB7XG4gICAgICAgICAgaWYgKG1heE91dGRlZ3JlZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdHJpbmcobm9kZSkpIHtcbiAgICAgICAgICAgIC8vIGZyb20gaXMgYSBzZWxlY3RvciBzdHJpbmdcbiAgICAgICAgICAgIG5vZGUgPSBjeS5maWx0ZXIobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXRkZWdyZWVzW25vZGUuaWQoKV0gLyBtYXhPdXRkZWdyZWU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9LFxuICAvLyBkZWdyZWVDZW50cmFsaXR5Tm9ybWFsaXplZFxuXG4gIC8vIEltcGxlbWVudGVkIGZyb20gdGhlIGFsZ29yaXRobSBpbiBPcHNhaGwncyBwYXBlclxuICAvLyBcIk5vZGUgY2VudHJhbGl0eSBpbiB3ZWlnaHRlZCBuZXR3b3JrczogR2VuZXJhbGl6aW5nIGRlZ3JlZSBhbmQgc2hvcnRlc3QgcGF0aHNcIlxuICAvLyBjaGVjayB0aGUgaGVhZGluZyAyIFwiRGVncmVlXCJcbiAgZGVncmVlQ2VudHJhbGl0eTogZnVuY3Rpb24gZGVncmVlQ2VudHJhbGl0eShvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IGRlZmF1bHRzJGYob3B0aW9ucyk7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBjYWxsaW5nRWxlcyA9IHRoaXM7XG4gICAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIHJvb3QgPSBfb3B0aW9ucy5yb290LFxuICAgICAgd2VpZ2h0ID0gX29wdGlvbnMud2VpZ2h0LFxuICAgICAgZGlyZWN0ZWQgPSBfb3B0aW9ucy5kaXJlY3RlZCxcbiAgICAgIGFscGhhID0gX29wdGlvbnMuYWxwaGE7XG4gICAgcm9vdCA9IGN5LmNvbGxlY3Rpb24ocm9vdClbMF07XG4gICAgaWYgKCFkaXJlY3RlZCkge1xuICAgICAgdmFyIGNvbm5FZGdlcyA9IHJvb3QuY29ubmVjdGVkRWRnZXMoKS5pbnRlcnNlY3Rpb24oY2FsbGluZ0VsZXMpO1xuICAgICAgdmFyIGsgPSBjb25uRWRnZXMubGVuZ3RoO1xuICAgICAgdmFyIHMgPSAwO1xuXG4gICAgICAvLyBOb3csIHN1bSBlZGdlIHdlaWdodHNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ubkVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHMgKz0gd2VpZ2h0KGNvbm5FZGdlc1tpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZWdyZWU6IE1hdGgucG93KGssIDEgLSBhbHBoYSkgKiBNYXRoLnBvdyhzLCBhbHBoYSlcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlZGdlcyA9IHJvb3QuY29ubmVjdGVkRWRnZXMoKTtcbiAgICAgIHZhciBpbmNvbWluZyA9IGVkZ2VzLmZpbHRlcihmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICByZXR1cm4gZWRnZS50YXJnZXQoKS5zYW1lKHJvb3QpICYmIGNhbGxpbmdFbGVzLmhhcyhlZGdlKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIG91dGdvaW5nID0gZWRnZXMuZmlsdGVyKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgIHJldHVybiBlZGdlLnNvdXJjZSgpLnNhbWUocm9vdCkgJiYgY2FsbGluZ0VsZXMuaGFzKGVkZ2UpO1xuICAgICAgfSk7XG4gICAgICB2YXIga19pbiA9IGluY29taW5nLmxlbmd0aDtcbiAgICAgIHZhciBrX291dCA9IG91dGdvaW5nLmxlbmd0aDtcbiAgICAgIHZhciBzX2luID0gMDtcbiAgICAgIHZhciBzX291dCA9IDA7XG5cbiAgICAgIC8vIE5vdywgc3VtIGluY29taW5nIGVkZ2Ugd2VpZ2h0c1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgaW5jb21pbmcubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICBzX2luICs9IHdlaWdodChpbmNvbWluZ1tfaTJdKTtcbiAgICAgIH1cblxuICAgICAgLy8gTm93LCBzdW0gb3V0Z29pbmcgZWRnZSB3ZWlnaHRzXG4gICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBvdXRnb2luZy5sZW5ndGg7IF9pMysrKSB7XG4gICAgICAgIHNfb3V0ICs9IHdlaWdodChvdXRnb2luZ1tfaTNdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGluZGVncmVlOiBNYXRoLnBvdyhrX2luLCAxIC0gYWxwaGEpICogTWF0aC5wb3coc19pbiwgYWxwaGEpLFxuICAgICAgICBvdXRkZWdyZWU6IE1hdGgucG93KGtfb3V0LCAxIC0gYWxwaGEpICogTWF0aC5wb3coc19vdXQsIGFscGhhKVxuICAgICAgfTtcbiAgICB9XG4gIH0gLy8gZGVncmVlQ2VudHJhbGl0eVxufTsgLy8gZWxlc2ZuXG5cbi8vIG5pY2UsIHNob3J0IG1hdGhlbWF0aWNhbCBhbGlhc1xuZWxlc2ZuJG4uZGMgPSBlbGVzZm4kbi5kZWdyZWVDZW50cmFsaXR5O1xuZWxlc2ZuJG4uZGNuID0gZWxlc2ZuJG4uZGVncmVlQ2VudHJhbGl0eU5vcm1hbGlzZWQgPSBlbGVzZm4kbi5kZWdyZWVDZW50cmFsaXR5Tm9ybWFsaXplZDtcblxudmFyIGRlZmF1bHRzJGUgPSBkZWZhdWx0cyRnKHtcbiAgaGFybW9uaWM6IHRydWUsXG4gIHdlaWdodDogZnVuY3Rpb24gd2VpZ2h0KCkge1xuICAgIHJldHVybiAxO1xuICB9LFxuICBkaXJlY3RlZDogZmFsc2UsXG4gIHJvb3Q6IG51bGxcbn0pO1xudmFyIGVsZXNmbiRtID0ge1xuICBjbG9zZW5lc3NDZW50cmFsaXR5Tm9ybWFsaXplZDogZnVuY3Rpb24gY2xvc2VuZXNzQ2VudHJhbGl0eU5vcm1hbGl6ZWQob3B0aW9ucykge1xuICAgIHZhciBfZGVmYXVsdHMgPSBkZWZhdWx0cyRlKG9wdGlvbnMpLFxuICAgICAgaGFybW9uaWMgPSBfZGVmYXVsdHMuaGFybW9uaWMsXG4gICAgICB3ZWlnaHQgPSBfZGVmYXVsdHMud2VpZ2h0LFxuICAgICAgZGlyZWN0ZWQgPSBfZGVmYXVsdHMuZGlyZWN0ZWQ7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBjbG9zZW5lc3NlcyA9IHt9O1xuICAgIHZhciBtYXhDbG9zZW5lc3MgPSAwO1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgICB2YXIgZncgPSB0aGlzLmZsb3lkV2Fyc2hhbGwoe1xuICAgICAgd2VpZ2h0OiB3ZWlnaHQsXG4gICAgICBkaXJlY3RlZDogZGlyZWN0ZWRcbiAgICB9KTtcblxuICAgIC8vIENvbXB1dGUgY2xvc2VuZXNzIGZvciBldmVyeSBub2RlIGFuZCBmaW5kIHRoZSBtYXhpbXVtIGNsb3NlbmVzc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjdXJyQ2xvc2VuZXNzID0gMDtcbiAgICAgIHZhciBub2RlX2kgPSBub2Rlc1tpXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbm9kZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKGkgIT09IGopIHtcbiAgICAgICAgICB2YXIgZCA9IGZ3LmRpc3RhbmNlKG5vZGVfaSwgbm9kZXNbal0pO1xuICAgICAgICAgIGlmIChoYXJtb25pYykge1xuICAgICAgICAgICAgY3VyckNsb3NlbmVzcyArPSAxIC8gZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VyckNsb3NlbmVzcyArPSBkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFoYXJtb25pYykge1xuICAgICAgICBjdXJyQ2xvc2VuZXNzID0gMSAvIGN1cnJDbG9zZW5lc3M7XG4gICAgICB9XG4gICAgICBpZiAobWF4Q2xvc2VuZXNzIDwgY3VyckNsb3NlbmVzcykge1xuICAgICAgICBtYXhDbG9zZW5lc3MgPSBjdXJyQ2xvc2VuZXNzO1xuICAgICAgfVxuICAgICAgY2xvc2VuZXNzZXNbbm9kZV9pLmlkKCldID0gY3VyckNsb3NlbmVzcztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsb3NlbmVzczogZnVuY3Rpb24gY2xvc2VuZXNzKG5vZGUpIHtcbiAgICAgICAgaWYgKG1heENsb3NlbmVzcyA9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cmluZyhub2RlKSkge1xuICAgICAgICAgIC8vIGZyb20gaXMgYSBzZWxlY3RvciBzdHJpbmdcbiAgICAgICAgICBub2RlID0gY3kuZmlsdGVyKG5vZGUpWzBdLmlkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZnJvbSBpcyBhIG5vZGVcbiAgICAgICAgICBub2RlID0gbm9kZS5pZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9zZW5lc3Nlc1tub2RlXSAvIG1heENsb3NlbmVzcztcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHBzZXVkb2NvZGUgZnJvbSB3aWtpcGVkaWFcbiAgY2xvc2VuZXNzQ2VudHJhbGl0eTogZnVuY3Rpb24gY2xvc2VuZXNzQ2VudHJhbGl0eShvcHRpb25zKSB7XG4gICAgdmFyIF9kZWZhdWx0czIgPSBkZWZhdWx0cyRlKG9wdGlvbnMpLFxuICAgICAgcm9vdCA9IF9kZWZhdWx0czIucm9vdCxcbiAgICAgIHdlaWdodCA9IF9kZWZhdWx0czIud2VpZ2h0LFxuICAgICAgZGlyZWN0ZWQgPSBfZGVmYXVsdHMyLmRpcmVjdGVkLFxuICAgICAgaGFybW9uaWMgPSBfZGVmYXVsdHMyLmhhcm1vbmljO1xuICAgIHJvb3QgPSB0aGlzLmZpbHRlcihyb290KVswXTtcblxuICAgIC8vIHdlIG5lZWQgZGlzdGFuY2UgZnJvbSB0aGlzIG5vZGUgdG8gZXZlcnkgb3RoZXIgbm9kZVxuICAgIHZhciBkaWprc3RyYSA9IHRoaXMuZGlqa3N0cmEoe1xuICAgICAgcm9vdDogcm9vdCxcbiAgICAgIHdlaWdodDogd2VpZ2h0LFxuICAgICAgZGlyZWN0ZWQ6IGRpcmVjdGVkXG4gICAgfSk7XG4gICAgdmFyIHRvdGFsRGlzdGFuY2UgPSAwO1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbiA9IG5vZGVzW2ldO1xuICAgICAgaWYgKCFuLnNhbWUocm9vdCkpIHtcbiAgICAgICAgdmFyIGQgPSBkaWprc3RyYS5kaXN0YW5jZVRvKG4pO1xuICAgICAgICBpZiAoaGFybW9uaWMpIHtcbiAgICAgICAgICB0b3RhbERpc3RhbmNlICs9IDEgLyBkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvdGFsRGlzdGFuY2UgKz0gZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFybW9uaWMgPyB0b3RhbERpc3RhbmNlIDogMSAvIHRvdGFsRGlzdGFuY2U7XG4gIH0gLy8gY2xvc2VuZXNzQ2VudHJhbGl0eVxufTsgLy8gZWxlc2ZuXG5cbi8vIG5pY2UsIHNob3J0IG1hdGhlbWF0aWNhbCBhbGlhc1xuZWxlc2ZuJG0uY2MgPSBlbGVzZm4kbS5jbG9zZW5lc3NDZW50cmFsaXR5O1xuZWxlc2ZuJG0uY2NuID0gZWxlc2ZuJG0uY2xvc2VuZXNzQ2VudHJhbGl0eU5vcm1hbGlzZWQgPSBlbGVzZm4kbS5jbG9zZW5lc3NDZW50cmFsaXR5Tm9ybWFsaXplZDtcblxudmFyIGRlZmF1bHRzJGQgPSBkZWZhdWx0cyRnKHtcbiAgd2VpZ2h0OiBudWxsLFxuICBkaXJlY3RlZDogZmFsc2Vcbn0pO1xudmFyIGVsZXNmbiRsID0ge1xuICAvLyBJbXBsZW1lbnRlZCBmcm9tIHRoZSBhbGdvcml0aG0gaW4gdGhlIHBhcGVyIFwiT24gVmFyaWFudHMgb2YgU2hvcnRlc3QtUGF0aCBCZXR3ZWVubmVzcyBDZW50cmFsaXR5IGFuZCB0aGVpciBHZW5lcmljIENvbXB1dGF0aW9uXCIgYnkgVWxyaWsgQnJhbmRlc1xuICBiZXR3ZWVubmVzc0NlbnRyYWxpdHk6IGZ1bmN0aW9uIGJldHdlZW5uZXNzQ2VudHJhbGl0eShvcHRpb25zKSB7XG4gICAgdmFyIF9kZWZhdWx0cyA9IGRlZmF1bHRzJGQob3B0aW9ucyksXG4gICAgICBkaXJlY3RlZCA9IF9kZWZhdWx0cy5kaXJlY3RlZCxcbiAgICAgIHdlaWdodCA9IF9kZWZhdWx0cy53ZWlnaHQ7XG4gICAgdmFyIHdlaWdodGVkID0gd2VpZ2h0ICE9IG51bGw7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuXG4gICAgLy8gc3RhcnRpbmdcbiAgICB2YXIgViA9IHRoaXMubm9kZXMoKTtcbiAgICB2YXIgQSA9IHt9O1xuICAgIHZhciBfQyA9IHt9O1xuICAgIHZhciBtYXggPSAwO1xuICAgIHZhciBDID0ge1xuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWwpIHtcbiAgICAgICAgX0Nba2V5XSA9IHZhbDtcbiAgICAgICAgaWYgKHZhbCA+IG1heCkge1xuICAgICAgICAgIG1heCA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgICByZXR1cm4gX0Nba2V5XTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQSBjb250YWlucyB0aGUgbmVpZ2hib3Job29kcyBvZiBldmVyeSBub2RlXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBWLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdiA9IFZbaV07XG4gICAgICB2YXIgdmlkID0gdi5pZCgpO1xuICAgICAgaWYgKGRpcmVjdGVkKSB7XG4gICAgICAgIEFbdmlkXSA9IHYub3V0Z29lcnMoKS5ub2RlcygpOyAvLyBnZXQgb3V0Z29lcnMgb2YgZXZlcnkgbm9kZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQVt2aWRdID0gdi5vcGVuTmVpZ2hib3Job29kKCkubm9kZXMoKTsgLy8gZ2V0IG5laWdoYm9ycyBvZiBldmVyeSBub2RlXG4gICAgICB9XG5cbiAgICAgIEMuc2V0KHZpZCwgMCk7XG4gICAgfVxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKHMpIHtcbiAgICAgIHZhciBzaWQgPSBWW3NdLmlkKCk7XG4gICAgICB2YXIgUyA9IFtdOyAvLyBzdGFja1xuICAgICAgdmFyIFAgPSB7fTtcbiAgICAgIHZhciBnID0ge307XG4gICAgICB2YXIgZCA9IHt9O1xuICAgICAgdmFyIFEgPSBuZXcgaGVhcChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gZFthXSAtIGRbYl07XG4gICAgICB9KTsgLy8gcXVldWVcblxuICAgICAgLy8gaW5pdCBkaWN0aW9uYXJpZXNcbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBWLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgX3ZpZCA9IFZbX2ldLmlkKCk7XG4gICAgICAgIFBbX3ZpZF0gPSBbXTtcbiAgICAgICAgZ1tfdmlkXSA9IDA7XG4gICAgICAgIGRbX3ZpZF0gPSBJbmZpbml0eTtcbiAgICAgIH1cbiAgICAgIGdbc2lkXSA9IDE7IC8vIHNpZ21hXG4gICAgICBkW3NpZF0gPSAwOyAvLyBkaXN0YW5jZSB0byBzXG5cbiAgICAgIFEucHVzaChzaWQpO1xuICAgICAgd2hpbGUgKCFRLmVtcHR5KCkpIHtcbiAgICAgICAgdmFyIF92ID0gUS5wb3AoKTtcbiAgICAgICAgUy5wdXNoKF92KTtcbiAgICAgICAgaWYgKHdlaWdodGVkKSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBBW192XS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHcgPSBBW192XVtqXTtcbiAgICAgICAgICAgIHZhciB2RWxlID0gY3kuZ2V0RWxlbWVudEJ5SWQoX3YpO1xuICAgICAgICAgICAgdmFyIGVkZ2UgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAodkVsZS5lZGdlc1RvKHcpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgZWRnZSA9IHZFbGUuZWRnZXNUbyh3KVswXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVkZ2UgPSB3LmVkZ2VzVG8odkVsZSlbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZWRnZVdlaWdodCA9IHdlaWdodChlZGdlKTtcbiAgICAgICAgICAgIHcgPSB3LmlkKCk7XG4gICAgICAgICAgICBpZiAoZFt3XSA+IGRbX3ZdICsgZWRnZVdlaWdodCkge1xuICAgICAgICAgICAgICBkW3ddID0gZFtfdl0gKyBlZGdlV2VpZ2h0O1xuICAgICAgICAgICAgICBpZiAoUS5ub2Rlcy5pbmRleE9mKHcpIDwgMCkge1xuICAgICAgICAgICAgICAgIC8vaWYgdyBpcyBub3QgaW4gUVxuICAgICAgICAgICAgICAgIFEucHVzaCh3KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgcG9zaXRpb24gaWYgdyBpcyBpbiBRXG4gICAgICAgICAgICAgICAgUS51cGRhdGVJdGVtKHcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGdbd10gPSAwO1xuICAgICAgICAgICAgICBQW3ddID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZFt3XSA9PSBkW192XSArIGVkZ2VXZWlnaHQpIHtcbiAgICAgICAgICAgICAgZ1t3XSA9IGdbd10gKyBnW192XTtcbiAgICAgICAgICAgICAgUFt3XS5wdXNoKF92KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IEFbX3ZdLmxlbmd0aDsgX2orKykge1xuICAgICAgICAgICAgdmFyIF93ID0gQVtfdl1bX2pdLmlkKCk7XG4gICAgICAgICAgICBpZiAoZFtfd10gPT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgICAgUS5wdXNoKF93KTtcbiAgICAgICAgICAgICAgZFtfd10gPSBkW192XSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZFtfd10gPT0gZFtfdl0gKyAxKSB7XG4gICAgICAgICAgICAgIGdbX3ddID0gZ1tfd10gKyBnW192XTtcbiAgICAgICAgICAgICAgUFtfd10ucHVzaChfdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgZSA9IHt9O1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgVi5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIGVbVltfaTJdLmlkKCldID0gMDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChTLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIF93MiA9IFMucG9wKCk7XG4gICAgICAgIGZvciAodmFyIF9qMiA9IDA7IF9qMiA8IFBbX3cyXS5sZW5ndGg7IF9qMisrKSB7XG4gICAgICAgICAgdmFyIF92MiA9IFBbX3cyXVtfajJdO1xuICAgICAgICAgIGVbX3YyXSA9IGVbX3YyXSArIGdbX3YyXSAvIGdbX3cyXSAqICgxICsgZVtfdzJdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX3cyICE9IFZbc10uaWQoKSkge1xuICAgICAgICAgIEMuc2V0KF93MiwgQy5nZXQoX3cyKSArIGVbX3cyXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGZvciAodmFyIHMgPSAwOyBzIDwgVi5sZW5ndGg7IHMrKykge1xuICAgICAgX2xvb3Aocyk7XG4gICAgfVxuICAgIHZhciByZXQgPSB7XG4gICAgICBiZXR3ZWVubmVzczogZnVuY3Rpb24gYmV0d2Vlbm5lc3Mobm9kZSkge1xuICAgICAgICB2YXIgaWQgPSBjeS5jb2xsZWN0aW9uKG5vZGUpLmlkKCk7XG4gICAgICAgIHJldHVybiBDLmdldChpZCk7XG4gICAgICB9LFxuICAgICAgYmV0d2Vlbm5lc3NOb3JtYWxpemVkOiBmdW5jdGlvbiBiZXR3ZWVubmVzc05vcm1hbGl6ZWQobm9kZSkge1xuICAgICAgICBpZiAobWF4ID09IDApIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaWQgPSBjeS5jb2xsZWN0aW9uKG5vZGUpLmlkKCk7XG4gICAgICAgIHJldHVybiBDLmdldChpZCkgLyBtYXg7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIGFsaWFzXG4gICAgcmV0LmJldHdlZW5uZXNzTm9ybWFsaXNlZCA9IHJldC5iZXR3ZWVubmVzc05vcm1hbGl6ZWQ7XG4gICAgcmV0dXJuIHJldDtcbiAgfSAvLyBiZXR3ZWVubmVzc0NlbnRyYWxpdHlcbn07IC8vIGVsZXNmblxuXG4vLyBuaWNlLCBzaG9ydCBtYXRoZW1hdGljYWwgYWxpYXNcbmVsZXNmbiRsLmJjID0gZWxlc2ZuJGwuYmV0d2Vlbm5lc3NDZW50cmFsaXR5O1xuXG4vLyBJbXBsZW1lbnRlZCBieSBab2UgWGkgQHpvZXhpIGZvciBHU09DIDIwMTZcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBkZWZhdWx0cyRjID0gZGVmYXVsdHMkZyh7XG4gIGV4cGFuZEZhY3RvcjogMixcbiAgLy8gYWZmZWN0cyB0aW1lIG9mIGNvbXB1dGF0aW9uIGFuZCBjbHVzdGVyIGdyYW51bGFyaXR5IHRvIHNvbWUgZXh0ZW50OiBNICogTVxuICBpbmZsYXRlRmFjdG9yOiAyLFxuICAvLyBhZmZlY3RzIGNsdXN0ZXIgZ3JhbnVsYXJpdHkgKHRoZSBncmVhdGVyIHRoZSB2YWx1ZSwgdGhlIG1vcmUgY2x1c3RlcnMpOiBNKGksaikgLyBFKGopXG4gIG11bHRGYWN0b3I6IDEsXG4gIC8vIG9wdGlvbmFsIHNlbGYgbG9vcHMgZm9yIGVhY2ggbm9kZS4gVXNlIGEgbmV1dHJhbCB2YWx1ZSB0byBpbXByb3ZlIGNsdXN0ZXIgY29tcHV0YXRpb25zLlxuICBtYXhJdGVyYXRpb25zOiAyMCxcbiAgLy8gbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBvZiB0aGUgTUNMIGFsZ29yaXRobSBpbiBhIHNpbmdsZSBydW5cbiAgYXR0cmlidXRlczogW1xuICAvLyBhdHRyaWJ1dGVzL2ZlYXR1cmVzIHVzZWQgdG8gZ3JvdXAgbm9kZXMsIGllLiBzaW1pbGFyaXR5IHZhbHVlcyBiZXR3ZWVuIG5vZGVzXG4gIGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1dXG59KTtcbi8qIGVzbGludC1lbmFibGUgKi9cblxudmFyIHNldE9wdGlvbnMkMyA9IGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuICByZXR1cm4gZGVmYXVsdHMkYyhvcHRpb25zKTtcbn07XG4vKiBlc2xpbnQtZW5hYmxlICovXG5cbnZhciBnZXRTaW1pbGFyaXR5JDEgPSBmdW5jdGlvbiBnZXRTaW1pbGFyaXR5KGVkZ2UsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIHRvdGFsID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdG90YWwgKz0gYXR0cmlidXRlc1tpXShlZGdlKTtcbiAgfVxuICByZXR1cm4gdG90YWw7XG59O1xudmFyIGFkZExvb3BzID0gZnVuY3Rpb24gYWRkTG9vcHMoTSwgbiwgdmFsKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgTVtpICogbiArIGldID0gdmFsO1xuICB9XG59O1xudmFyIG5vcm1hbGl6ZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZShNLCBuKSB7XG4gIHZhciBzdW07XG4gIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG47IGNvbCsrKSB7XG4gICAgc3VtID0gMDtcbiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBuOyByb3crKykge1xuICAgICAgc3VtICs9IE1bcm93ICogbiArIGNvbF07XG4gICAgfVxuICAgIGZvciAodmFyIF9yb3cgPSAwOyBfcm93IDwgbjsgX3JvdysrKSB7XG4gICAgICBNW19yb3cgKiBuICsgY29sXSA9IE1bX3JvdyAqIG4gKyBjb2xdIC8gc3VtO1xuICAgIH1cbiAgfVxufTtcblxuLy8gVE9ETzogYmxvY2tlZCBtYXRyaXggbXVsdGlwbGljYXRpb24/XG52YXIgbW11bHQgPSBmdW5jdGlvbiBtbXVsdChBLCBCLCBuKSB7XG4gIHZhciBDID0gbmV3IEFycmF5KG4gKiBuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgQ1tpICogbiArIGpdID0gMDtcbiAgICB9XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBuOyBrKyspIHtcbiAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBuOyBfaisrKSB7XG4gICAgICAgIENbaSAqIG4gKyBfal0gKz0gQVtpICogbiArIGtdICogQltrICogbiArIF9qXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIEM7XG59O1xudmFyIGV4cGFuZCA9IGZ1bmN0aW9uIGV4cGFuZChNLCBuLCBleHBhbmRGYWN0b3IgLyoqIHBvd2VyICoqLykge1xuICB2YXIgX00gPSBNLnNsaWNlKDApO1xuICBmb3IgKHZhciBwID0gMTsgcCA8IGV4cGFuZEZhY3RvcjsgcCsrKSB7XG4gICAgTSA9IG1tdWx0KE0sIF9NLCBuKTtcbiAgfVxuICByZXR1cm4gTTtcbn07XG52YXIgaW5mbGF0ZSA9IGZ1bmN0aW9uIGluZmxhdGUoTSwgbiwgaW5mbGF0ZUZhY3RvciAvKiogciAqKi8pIHtcbiAgdmFyIF9NID0gbmV3IEFycmF5KG4gKiBuKTtcblxuICAvLyBNKGksaikgXiBpbmZsYXRlUG93ZXJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuICogbjsgaSsrKSB7XG4gICAgX01baV0gPSBNYXRoLnBvdyhNW2ldLCBpbmZsYXRlRmFjdG9yKTtcbiAgfVxuICBub3JtYWxpemUoX00sIG4pO1xuICByZXR1cm4gX007XG59O1xudmFyIGhhc0NvbnZlcmdlZCA9IGZ1bmN0aW9uIGhhc0NvbnZlcmdlZChNLCBfTSwgbjIsIHJvdW5kRmFjdG9yKSB7XG4gIC8vIENoZWNrIHRoYXQgYm90aCBtYXRyaWNlcyBoYXZlIHRoZSBzYW1lIGVsZW1lbnRzIChpLGopXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjI7IGkrKykge1xuICAgIHZhciB2MSA9IE1hdGgucm91bmQoTVtpXSAqIE1hdGgucG93KDEwLCByb3VuZEZhY3RvcikpIC8gTWF0aC5wb3coMTAsIHJvdW5kRmFjdG9yKTsgLy8gdHJ1bmNhdGUgdG8gJ3JvdW5kRmFjdG9yJyBkZWNpbWFsIHBsYWNlc1xuICAgIHZhciB2MiA9IE1hdGgucm91bmQoX01baV0gKiBNYXRoLnBvdygxMCwgcm91bmRGYWN0b3IpKSAvIE1hdGgucG93KDEwLCByb3VuZEZhY3Rvcik7XG4gICAgaWYgKHYxICE9PSB2Mikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgYXNzaWduJDIgPSBmdW5jdGlvbiBhc3NpZ24oTSwgbiwgbm9kZXMsIGN5KSB7XG4gIHZhciBjbHVzdGVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIHZhciBjbHVzdGVyID0gW107XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBuOyBqKyspIHtcbiAgICAgIC8vIFJvdy13aXNlIGF0dHJhY3RvcnMgYW5kIGVsZW1lbnRzIHRoYXQgdGhleSBhdHRyYWN0IGJlbG9uZyBpbiBzYW1lIGNsdXN0ZXJcbiAgICAgIGlmIChNYXRoLnJvdW5kKE1baSAqIG4gKyBqXSAqIDEwMDApIC8gMTAwMCA+IDApIHtcbiAgICAgICAgY2x1c3Rlci5wdXNoKG5vZGVzW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNsdXN0ZXIubGVuZ3RoICE9PSAwKSB7XG4gICAgICBjbHVzdGVycy5wdXNoKGN5LmNvbGxlY3Rpb24oY2x1c3RlcikpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIGlzRHVwbGljYXRlID0gZnVuY3Rpb24gaXNEdXBsaWNhdGUoYzEsIGMyKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYzEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWMyW2ldIHx8IGMxW2ldLmlkKCkgIT09IGMyW2ldLmlkKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIHJlbW92ZUR1cGxpY2F0ZXMgPSBmdW5jdGlvbiByZW1vdmVEdXBsaWNhdGVzKGNsdXN0ZXJzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNsdXN0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoaSAhPSBqICYmIGlzRHVwbGljYXRlKGNsdXN0ZXJzW2ldLCBjbHVzdGVyc1tqXSkpIHtcbiAgICAgICAgY2x1c3RlcnMuc3BsaWNlKGosIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIG1hcmtvdkNsdXN0ZXJpbmcgPSBmdW5jdGlvbiBtYXJrb3ZDbHVzdGVyaW5nKG9wdGlvbnMpIHtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgZWRnZXMgPSB0aGlzLmVkZ2VzKCk7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcblxuICAvLyBTZXQgcGFyYW1ldGVycyBvZiBhbGdvcml0aG06XG4gIHZhciBvcHRzID0gc2V0T3B0aW9ucyQzKG9wdGlvbnMpO1xuXG4gIC8vIE1hcCBlYWNoIG5vZGUgdG8gaXRzIHBvc2l0aW9uIGluIG5vZGUgYXJyYXlcbiAgdmFyIGlkMnBvc2l0aW9uID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZDJwb3NpdGlvbltub2Rlc1tpXS5pZCgpXSA9IGk7XG4gIH1cblxuICAvLyBHZW5lcmF0ZSBzdG9jaGFzdGljIG1hdHJpeCBNIGZyb20gaW5wdXQgZ3JhcGggRyAoc2hvdWxkIGJlIHN5bW1ldHJpYy91bmRpcmVjdGVkKVxuICB2YXIgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICBuMiA9IG4gKiBuO1xuICB2YXIgTSA9IG5ldyBBcnJheShuMiksXG4gICAgX007XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBuMjsgX2krKykge1xuICAgIE1bX2ldID0gMDtcbiAgfVxuICBmb3IgKHZhciBlID0gMDsgZSA8IGVkZ2VzLmxlbmd0aDsgZSsrKSB7XG4gICAgdmFyIGVkZ2UgPSBlZGdlc1tlXTtcbiAgICB2YXIgX2kyID0gaWQycG9zaXRpb25bZWRnZS5zb3VyY2UoKS5pZCgpXTtcbiAgICB2YXIgaiA9IGlkMnBvc2l0aW9uW2VkZ2UudGFyZ2V0KCkuaWQoKV07XG4gICAgdmFyIHNpbSA9IGdldFNpbWlsYXJpdHkkMShlZGdlLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgIE1bX2kyICogbiArIGpdICs9IHNpbTsgLy8gRyBzaG91bGQgYmUgc3ltbWV0cmljIGFuZCB1bmRpcmVjdGVkXG4gICAgTVtqICogbiArIF9pMl0gKz0gc2ltO1xuICB9XG5cbiAgLy8gQmVnaW4gTWFya292IGNsdXN0ZXIgYWxnb3JpdGhtXG5cbiAgLy8gU3RlcCAxOiBBZGQgc2VsZiBsb29wcyB0byBlYWNoIG5vZGUsIGllLiBhZGQgbXVsdEZhY3RvciB0byBtYXRyaXggZGlhZ29uYWxcbiAgYWRkTG9vcHMoTSwgbiwgb3B0cy5tdWx0RmFjdG9yKTtcblxuICAvLyBTdGVwIDI6IE0gPSBub3JtYWxpemUoIE0gKTtcbiAgbm9ybWFsaXplKE0sIG4pO1xuICB2YXIgaXNTdGlsbE1vdmluZyA9IHRydWU7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgd2hpbGUgKGlzU3RpbGxNb3ZpbmcgJiYgaXRlcmF0aW9ucyA8IG9wdHMubWF4SXRlcmF0aW9ucykge1xuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTtcblxuICAgIC8vIFN0ZXAgMzpcbiAgICBfTSA9IGV4cGFuZChNLCBuLCBvcHRzLmV4cGFuZEZhY3Rvcik7XG5cbiAgICAvLyBTdGVwIDQ6XG4gICAgTSA9IGluZmxhdGUoX00sIG4sIG9wdHMuaW5mbGF0ZUZhY3Rvcik7XG5cbiAgICAvLyBTdGVwIDU6IGNoZWNrIHRvIHNlZSBpZiB+c3RlYWR5IHN0YXRlIGhhcyBiZWVuIHJlYWNoZWRcbiAgICBpZiAoIWhhc0NvbnZlcmdlZChNLCBfTSwgbjIsIDQpKSB7XG4gICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgaXRlcmF0aW9ucysrO1xuICB9XG5cbiAgLy8gQnVpbGQgY2x1c3RlcnMgZnJvbSBtYXRyaXhcbiAgdmFyIGNsdXN0ZXJzID0gYXNzaWduJDIoTSwgbiwgbm9kZXMsIGN5KTtcblxuICAvLyBSZW1vdmUgZHVwbGljYXRlIGNsdXN0ZXJzIGR1ZSB0byBzeW1tZXRyeSBvZiBncmFwaCBhbmQgTSBtYXRyaXhcbiAgY2x1c3RlcnMgPSByZW1vdmVEdXBsaWNhdGVzKGNsdXN0ZXJzKTtcbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciBtYXJrb3ZDbHVzdGVyaW5nJDEgPSB7XG4gIG1hcmtvdkNsdXN0ZXJpbmc6IG1hcmtvdkNsdXN0ZXJpbmcsXG4gIG1jbDogbWFya292Q2x1c3RlcmluZ1xufTtcblxuLy8gQ29tbW9uIGRpc3RhbmNlIG1ldHJpY3MgZm9yIGNsdXN0ZXJpbmcgYWxnb3JpdGhtc1xudmFyIGlkZW50aXR5ID0gZnVuY3Rpb24gaWRlbnRpdHkoeCkge1xuICByZXR1cm4geDtcbn07XG52YXIgYWJzRGlmZiA9IGZ1bmN0aW9uIGFic0RpZmYocCwgcSkge1xuICByZXR1cm4gTWF0aC5hYnMocSAtIHApO1xufTtcbnZhciBhZGRBYnNEaWZmID0gZnVuY3Rpb24gYWRkQWJzRGlmZih0b3RhbCwgcCwgcSkge1xuICByZXR1cm4gdG90YWwgKyBhYnNEaWZmKHAsIHEpO1xufTtcbnZhciBhZGRTcXVhcmVkRGlmZiA9IGZ1bmN0aW9uIGFkZFNxdWFyZWREaWZmKHRvdGFsLCBwLCBxKSB7XG4gIHJldHVybiB0b3RhbCArIE1hdGgucG93KHEgLSBwLCAyKTtcbn07XG52YXIgc3FydCA9IGZ1bmN0aW9uIHNxcnQoeCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KHgpO1xufTtcbnZhciBtYXhBYnNEaWZmID0gZnVuY3Rpb24gbWF4QWJzRGlmZihjdXJyZW50TWF4LCBwLCBxKSB7XG4gIHJldHVybiBNYXRoLm1heChjdXJyZW50TWF4LCBhYnNEaWZmKHAsIHEpKTtcbn07XG52YXIgZ2V0RGlzdGFuY2UgPSBmdW5jdGlvbiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIGluaXQsIHZpc2l0KSB7XG4gIHZhciBwb3N0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiBpZGVudGl0eTtcbiAgdmFyIHJldCA9IGluaXQ7XG4gIHZhciBwLCBxO1xuICBmb3IgKHZhciBkaW0gPSAwOyBkaW0gPCBsZW5ndGg7IGRpbSsrKSB7XG4gICAgcCA9IGdldFAoZGltKTtcbiAgICBxID0gZ2V0UShkaW0pO1xuICAgIHJldCA9IHZpc2l0KHJldCwgcCwgcSk7XG4gIH1cbiAgcmV0dXJuIHBvc3QocmV0KTtcbn07XG52YXIgZGlzdGFuY2VzID0ge1xuICBldWNsaWRlYW46IGZ1bmN0aW9uIGV1Y2xpZGVhbihsZW5ndGgsIGdldFAsIGdldFEpIHtcbiAgICBpZiAobGVuZ3RoID49IDIpIHtcbiAgICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIDAsIGFkZFNxdWFyZWREaWZmLCBzcXJ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZm9yIHNpbmdsZSBhdHRyIGNhc2UsIG1vcmUgZWZmaWNpZW50IHRvIGF2b2lkIHNxcnRcbiAgICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIDAsIGFkZEFic0RpZmYpO1xuICAgIH1cbiAgfSxcbiAgc3F1YXJlZEV1Y2xpZGVhbjogZnVuY3Rpb24gc3F1YXJlZEV1Y2xpZGVhbihsZW5ndGgsIGdldFAsIGdldFEpIHtcbiAgICByZXR1cm4gZ2V0RGlzdGFuY2UobGVuZ3RoLCBnZXRQLCBnZXRRLCAwLCBhZGRTcXVhcmVkRGlmZik7XG4gIH0sXG4gIG1hbmhhdHRhbjogZnVuY3Rpb24gbWFuaGF0dGFuKGxlbmd0aCwgZ2V0UCwgZ2V0USkge1xuICAgIHJldHVybiBnZXREaXN0YW5jZShsZW5ndGgsIGdldFAsIGdldFEsIDAsIGFkZEFic0RpZmYpO1xuICB9LFxuICBtYXg6IGZ1bmN0aW9uIG1heChsZW5ndGgsIGdldFAsIGdldFEpIHtcbiAgICByZXR1cm4gZ2V0RGlzdGFuY2UobGVuZ3RoLCBnZXRQLCBnZXRRLCAtSW5maW5pdHksIG1heEFic0RpZmYpO1xuICB9XG59O1xuXG4vLyBpbiBjYXNlIHRoZSB1c2VyIGFjY2lkZW50YWxseSBkb2Vzbid0IHVzZSBjYW1lbCBjYXNlXG5kaXN0YW5jZXNbJ3NxdWFyZWQtZXVjbGlkZWFuJ10gPSBkaXN0YW5jZXNbJ3NxdWFyZWRFdWNsaWRlYW4nXTtcbmRpc3RhbmNlc1snc3F1YXJlZGV1Y2xpZGVhbiddID0gZGlzdGFuY2VzWydzcXVhcmVkRXVjbGlkZWFuJ107XG5mdW5jdGlvbiBjbHVzdGVyaW5nRGlzdGFuY2UgKG1ldGhvZCwgbGVuZ3RoLCBnZXRQLCBnZXRRLCBub2RlUCwgbm9kZVEpIHtcbiAgdmFyIGltcGw7XG4gIGlmIChmbiQ2KG1ldGhvZCkpIHtcbiAgICBpbXBsID0gbWV0aG9kO1xuICB9IGVsc2Uge1xuICAgIGltcGwgPSBkaXN0YW5jZXNbbWV0aG9kXSB8fCBkaXN0YW5jZXMuZXVjbGlkZWFuO1xuICB9XG4gIGlmIChsZW5ndGggPT09IDAgJiYgZm4kNihtZXRob2QpKSB7XG4gICAgcmV0dXJuIGltcGwobm9kZVAsIG5vZGVRKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW1wbChsZW5ndGgsIGdldFAsIGdldFEsIG5vZGVQLCBub2RlUSk7XG4gIH1cbn1cblxudmFyIGRlZmF1bHRzJGIgPSBkZWZhdWx0cyRnKHtcbiAgazogMixcbiAgbTogMixcbiAgc2Vuc2l0aXZpdHlUaHJlc2hvbGQ6IDAuMDAwMSxcbiAgZGlzdGFuY2U6ICdldWNsaWRlYW4nLFxuICBtYXhJdGVyYXRpb25zOiAxMCxcbiAgYXR0cmlidXRlczogW10sXG4gIHRlc3RNb2RlOiBmYWxzZSxcbiAgdGVzdENlbnRyb2lkczogbnVsbFxufSk7XG52YXIgc2V0T3B0aW9ucyQyID0gZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIHJldHVybiBkZWZhdWx0cyRiKG9wdGlvbnMpO1xufTtcblxudmFyIGdldERpc3QgPSBmdW5jdGlvbiBnZXREaXN0KHR5cGUsIG5vZGUsIGNlbnRyb2lkLCBhdHRyaWJ1dGVzLCBtb2RlKSB7XG4gIHZhciBub05vZGVQID0gbW9kZSAhPT0gJ2tNZWRvaWRzJztcbiAgdmFyIGdldFAgPSBub05vZGVQID8gZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gY2VudHJvaWRbaV07XG4gIH0gOiBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBhdHRyaWJ1dGVzW2ldKGNlbnRyb2lkKTtcbiAgfTtcbiAgdmFyIGdldFEgPSBmdW5jdGlvbiBnZXRRKGkpIHtcbiAgICByZXR1cm4gYXR0cmlidXRlc1tpXShub2RlKTtcbiAgfTtcbiAgdmFyIG5vZGVQID0gY2VudHJvaWQ7XG4gIHZhciBub2RlUSA9IG5vZGU7XG4gIHJldHVybiBjbHVzdGVyaW5nRGlzdGFuY2UodHlwZSwgYXR0cmlidXRlcy5sZW5ndGgsIGdldFAsIGdldFEsIG5vZGVQLCBub2RlUSk7XG59O1xudmFyIHJhbmRvbUNlbnRyb2lkcyA9IGZ1bmN0aW9uIHJhbmRvbUNlbnRyb2lkcyhub2RlcywgaywgYXR0cmlidXRlcykge1xuICB2YXIgbmRpbSA9IGF0dHJpYnV0ZXMubGVuZ3RoO1xuICB2YXIgbWluID0gbmV3IEFycmF5KG5kaW0pO1xuICB2YXIgbWF4ID0gbmV3IEFycmF5KG5kaW0pO1xuICB2YXIgY2VudHJvaWRzID0gbmV3IEFycmF5KGspO1xuICB2YXIgY2VudHJvaWQgPSBudWxsO1xuXG4gIC8vIEZpbmQgbWluLCBtYXggdmFsdWVzIGZvciBlYWNoIGF0dHJpYnV0ZSBkaW1lbnNpb25cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZGltOyBpKyspIHtcbiAgICBtaW5baV0gPSBub2Rlcy5taW4oYXR0cmlidXRlc1tpXSkudmFsdWU7XG4gICAgbWF4W2ldID0gbm9kZXMubWF4KGF0dHJpYnV0ZXNbaV0pLnZhbHVlO1xuICB9XG5cbiAgLy8gQnVpbGQgayBjZW50cm9pZHMsIGVhY2ggcmVwcmVzZW50ZWQgYXMgYW4gbi1kaW0gZmVhdHVyZSB2ZWN0b3JcbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBrOyBjKyspIHtcbiAgICBjZW50cm9pZCA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBuZGltOyBfaSsrKSB7XG4gICAgICBjZW50cm9pZFtfaV0gPSBNYXRoLnJhbmRvbSgpICogKG1heFtfaV0gLSBtaW5bX2ldKSArIG1pbltfaV07IC8vIHJhbmRvbSBpbml0aWFsIHZhbHVlXG4gICAgfVxuXG4gICAgY2VudHJvaWRzW2NdID0gY2VudHJvaWQ7XG4gIH1cbiAgcmV0dXJuIGNlbnRyb2lkcztcbn07XG52YXIgY2xhc3NpZnkgPSBmdW5jdGlvbiBjbGFzc2lmeShub2RlLCBjZW50cm9pZHMsIGRpc3RhbmNlLCBhdHRyaWJ1dGVzLCB0eXBlKSB7XG4gIHZhciBtaW4gPSBJbmZpbml0eTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjZW50cm9pZHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGlzdCA9IGdldERpc3QoZGlzdGFuY2UsIG5vZGUsIGNlbnRyb2lkc1tpXSwgYXR0cmlidXRlcywgdHlwZSk7XG4gICAgaWYgKGRpc3QgPCBtaW4pIHtcbiAgICAgIG1pbiA9IGRpc3Q7XG4gICAgICBpbmRleCA9IGk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmRleDtcbn07XG52YXIgYnVpbGRDbHVzdGVyID0gZnVuY3Rpb24gYnVpbGRDbHVzdGVyKGNlbnRyb2lkLCBub2RlcywgYXNzaWdubWVudCkge1xuICB2YXIgY2x1c3RlciA9IFtdO1xuICB2YXIgbm9kZSA9IG51bGw7XG4gIGZvciAodmFyIG4gPSAwOyBuIDwgbm9kZXMubGVuZ3RoOyBuKyspIHtcbiAgICBub2RlID0gbm9kZXNbbl07XG4gICAgaWYgKGFzc2lnbm1lbnRbbm9kZS5pZCgpXSA9PT0gY2VudHJvaWQpIHtcbiAgICAgIC8vY29uc29sZS5sb2coXCJOb2RlIFwiICsgbm9kZS5pZCgpICsgXCIgaXMgYXNzb2NpYXRlZCB3aXRoIG1lZG9pZCAjOiBcIiArIG0pO1xuICAgICAgY2x1c3Rlci5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2x1c3Rlcjtcbn07XG52YXIgaGF2ZVZhbHVlc0NvbnZlcmdlZCA9IGZ1bmN0aW9uIGhhdmVWYWx1ZXNDb252ZXJnZWQodjEsIHYyLCBzZW5zaXRpdml0eVRocmVzaG9sZCkge1xuICByZXR1cm4gTWF0aC5hYnModjIgLSB2MSkgPD0gc2Vuc2l0aXZpdHlUaHJlc2hvbGQ7XG59O1xudmFyIGhhdmVNYXRyaWNlc0NvbnZlcmdlZCA9IGZ1bmN0aW9uIGhhdmVNYXRyaWNlc0NvbnZlcmdlZCh2MSwgdjIsIHNlbnNpdGl2aXR5VGhyZXNob2xkKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdjEubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHYxW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgZGlmZiA9IE1hdGguYWJzKHYxW2ldW2pdIC0gdjJbaV1bal0pO1xuICAgICAgaWYgKGRpZmYgPiBzZW5zaXRpdml0eVRocmVzaG9sZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBzZWVuQmVmb3JlID0gZnVuY3Rpb24gc2VlbkJlZm9yZShub2RlLCBtZWRvaWRzLCBuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgaWYgKG5vZGUgPT09IG1lZG9pZHNbaV0pIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG52YXIgcmFuZG9tTWVkb2lkcyA9IGZ1bmN0aW9uIHJhbmRvbU1lZG9pZHMobm9kZXMsIGspIHtcbiAgdmFyIG1lZG9pZHMgPSBuZXcgQXJyYXkoayk7XG5cbiAgLy8gRm9yIHNtYWxsIGRhdGEgc2V0cywgdGhlIHByb2JhYmlsaXR5IG9mIG1lZG9pZCBjb25mbGljdCBpcyBncmVhdGVyLFxuICAvLyBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gb3IgY2hvc2UgdGhpcyBub2RlIGJlZm9yZS5cbiAgaWYgKG5vZGVzLmxlbmd0aCA8IDUwKSB7XG4gICAgLy8gUmFuZG9tbHkgc2VsZWN0IGsgbWVkb2lkcyBmcm9tIHRoZSBuIG5vZGVzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrOyBpKyspIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbm9kZXMubGVuZ3RoKV07XG5cbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgY2hvc2VuIHRoaXMgbm9kZSB0byBiZSBhIG1lZG9pZCwgZG9uJ3QgY2hvb3NlIGl0IGFnYWluIChmb3Igc21hbGwgZGF0YSBzZXRzKS5cbiAgICAgIC8vIEluc3RlYWQgY2hvb3NlIGEgZGlmZmVyZW50IHJhbmRvbSBub2RlLlxuICAgICAgd2hpbGUgKHNlZW5CZWZvcmUobm9kZSwgbWVkb2lkcywgaSkpIHtcbiAgICAgICAgbm9kZSA9IG5vZGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vZGVzLmxlbmd0aCldO1xuICAgICAgfVxuICAgICAgbWVkb2lkc1tpXSA9IG5vZGU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFJlbGF0aXZlbHkgbGFyZ2UgZGF0YSBzZXQsIHNvIHByZXR0eSBzYWZlIHRvIG5vdCBjaGVjayBhbmQganVzdCBzZWxlY3QgcmFuZG9tIG5vZGVzXG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgazsgX2kyKyspIHtcbiAgICAgIG1lZG9pZHNbX2kyXSA9IG5vZGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vZGVzLmxlbmd0aCldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWVkb2lkcztcbn07XG52YXIgZmluZENvc3QgPSBmdW5jdGlvbiBmaW5kQ29zdChwb3RlbnRpYWxOZXdNZWRvaWQsIGNsdXN0ZXIsIGF0dHJpYnV0ZXMpIHtcbiAgdmFyIGNvc3QgPSAwO1xuICBmb3IgKHZhciBuID0gMDsgbiA8IGNsdXN0ZXIubGVuZ3RoOyBuKyspIHtcbiAgICBjb3N0ICs9IGdldERpc3QoJ21hbmhhdHRhbicsIGNsdXN0ZXJbbl0sIHBvdGVudGlhbE5ld01lZG9pZCwgYXR0cmlidXRlcywgJ2tNZWRvaWRzJyk7XG4gIH1cbiAgcmV0dXJuIGNvc3Q7XG59O1xudmFyIGtNZWFucyA9IGZ1bmN0aW9uIGtNZWFucyhvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgbm9kZSA9IG51bGw7XG5cbiAgLy8gU2V0IHBhcmFtZXRlcnMgb2YgYWxnb3JpdGhtOiAjIG9mIGNsdXN0ZXJzLCBkaXN0YW5jZSBtZXRyaWMsIGV0Yy5cbiAgdmFyIG9wdHMgPSBzZXRPcHRpb25zJDIob3B0aW9ucyk7XG5cbiAgLy8gQmVnaW4gay1tZWFucyBhbGdvcml0aG1cbiAgdmFyIGNsdXN0ZXJzID0gbmV3IEFycmF5KG9wdHMuayk7XG4gIHZhciBhc3NpZ25tZW50ID0ge307XG4gIHZhciBjZW50cm9pZHM7XG5cbiAgLy8gU3RlcCAxOiBJbml0aWFsaXplIGNlbnRyb2lkIHBvc2l0aW9uc1xuICBpZiAob3B0cy50ZXN0TW9kZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0cy50ZXN0Q2VudHJvaWRzID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVE9ETzogaW1wbGVtZW50IGEgc2VlZGVkIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLlxuICAgICAgb3B0cy50ZXN0Q2VudHJvaWRzO1xuICAgICAgY2VudHJvaWRzID0gcmFuZG9tQ2VudHJvaWRzKG5vZGVzLCBvcHRzLmssIG9wdHMuYXR0cmlidXRlcyk7XG4gICAgfSBlbHNlIGlmIChfdHlwZW9mKG9wdHMudGVzdENlbnRyb2lkcykgPT09ICdvYmplY3QnKSB7XG4gICAgICBjZW50cm9pZHMgPSBvcHRzLnRlc3RDZW50cm9pZHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNlbnRyb2lkcyA9IHJhbmRvbUNlbnRyb2lkcyhub2Rlcywgb3B0cy5rLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjZW50cm9pZHMgPSByYW5kb21DZW50cm9pZHMobm9kZXMsIG9wdHMuaywgb3B0cy5hdHRyaWJ1dGVzKTtcbiAgfVxuICB2YXIgaXNTdGlsbE1vdmluZyA9IHRydWU7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgd2hpbGUgKGlzU3RpbGxNb3ZpbmcgJiYgaXRlcmF0aW9ucyA8IG9wdHMubWF4SXRlcmF0aW9ucykge1xuICAgIC8vIFN0ZXAgMjogQXNzaWduIG5vZGVzIHRvIHRoZSBuZWFyZXN0IGNlbnRyb2lkXG4gICAgZm9yICh2YXIgbiA9IDA7IG4gPCBub2Rlcy5sZW5ndGg7IG4rKykge1xuICAgICAgbm9kZSA9IG5vZGVzW25dO1xuICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGNsdXN0ZXIgdGhpcyBub2RlIGJlbG9uZ3MgdG86IG5vZGUgaWQgPT4gY2x1c3RlciAjXG4gICAgICBhc3NpZ25tZW50W25vZGUuaWQoKV0gPSBjbGFzc2lmeShub2RlLCBjZW50cm9pZHMsIG9wdHMuZGlzdGFuY2UsIG9wdHMuYXR0cmlidXRlcywgJ2tNZWFucycpO1xuICAgIH1cblxuICAgIC8vIFN0ZXAgMzogRm9yIGVhY2ggb2YgdGhlIGsgY2x1c3RlcnMsIHVwZGF0ZSBpdHMgY2VudHJvaWRcbiAgICBpc1N0aWxsTW92aW5nID0gZmFsc2U7XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBvcHRzLms7IGMrKykge1xuICAgICAgLy8gR2V0IGFsbCBub2RlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGNsdXN0ZXJcbiAgICAgIHZhciBjbHVzdGVyID0gYnVpbGRDbHVzdGVyKGMsIG5vZGVzLCBhc3NpZ25tZW50KTtcbiAgICAgIGlmIChjbHVzdGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBJZiBjbHVzdGVyIGlzIGVtcHR5LCBicmVhayBvdXQgZWFybHkgJiBtb3ZlIHRvIG5leHQgY2x1c3RlclxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGNlbnRyb2lkcyBieSBjYWxjdWxhdGluZyBhdmcgb2YgYWxsIG5vZGVzIHdpdGhpbiB0aGUgY2x1c3Rlci5cbiAgICAgIHZhciBuZGltID0gb3B0cy5hdHRyaWJ1dGVzLmxlbmd0aDtcbiAgICAgIHZhciBjZW50cm9pZCA9IGNlbnRyb2lkc1tjXTsgLy8gWyBkaW1fMSwgZGltXzIsIGRpbV8zLCAuLi4gLCBkaW1fbiBdXG4gICAgICB2YXIgbmV3Q2VudHJvaWQgPSBuZXcgQXJyYXkobmRpbSk7XG4gICAgICB2YXIgc3VtID0gbmV3IEFycmF5KG5kaW0pO1xuICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBuZGltOyBkKyspIHtcbiAgICAgICAgc3VtW2RdID0gMC4wO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsdXN0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBub2RlID0gY2x1c3RlcltpXTtcbiAgICAgICAgICBzdW1bZF0gKz0gb3B0cy5hdHRyaWJ1dGVzW2RdKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIG5ld0NlbnRyb2lkW2RdID0gc3VtW2RdIC8gY2x1c3Rlci5sZW5ndGg7XG5cbiAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGFsZ29yaXRobSBoYXMgY29udmVyZ2VkLCBpLmUuIHdoZW4gY2VudHJvaWRzIG5vIGxvbmdlciBjaGFuZ2VcbiAgICAgICAgaWYgKCFoYXZlVmFsdWVzQ29udmVyZ2VkKG5ld0NlbnRyb2lkW2RdLCBjZW50cm9pZFtkXSwgb3B0cy5zZW5zaXRpdml0eVRocmVzaG9sZCkpIHtcbiAgICAgICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2VudHJvaWRzW2NdID0gbmV3Q2VudHJvaWQ7XG4gICAgICBjbHVzdGVyc1tjXSA9IGN5LmNvbGxlY3Rpb24oY2x1c3Rlcik7XG4gICAgfVxuICAgIGl0ZXJhdGlvbnMrKztcbiAgfVxuICByZXR1cm4gY2x1c3RlcnM7XG59O1xudmFyIGtNZWRvaWRzID0gZnVuY3Rpb24ga01lZG9pZHMob3B0aW9ucykge1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgdmFyIG5vZGUgPSBudWxsO1xuICB2YXIgb3B0cyA9IHNldE9wdGlvbnMkMihvcHRpb25zKTtcblxuICAvLyBCZWdpbiBrLW1lZG9pZHMgYWxnb3JpdGhtXG4gIHZhciBjbHVzdGVycyA9IG5ldyBBcnJheShvcHRzLmspO1xuICB2YXIgbWVkb2lkcztcbiAgdmFyIGFzc2lnbm1lbnQgPSB7fTtcbiAgdmFyIGN1ckNvc3Q7XG4gIHZhciBtaW5Db3N0cyA9IG5ldyBBcnJheShvcHRzLmspOyAvLyBtaW5pbXVtIGNvc3QgY29uZmlndXJhdGlvbiBmb3IgZWFjaCBjbHVzdGVyXG5cbiAgLy8gU3RlcCAxOiBJbml0aWFsaXplIGsgbWVkb2lkc1xuICBpZiAob3B0cy50ZXN0TW9kZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0cy50ZXN0Q2VudHJvaWRzID09PSAnbnVtYmVyJykgOyBlbHNlIGlmIChfdHlwZW9mKG9wdHMudGVzdENlbnRyb2lkcykgPT09ICdvYmplY3QnKSB7XG4gICAgICBtZWRvaWRzID0gb3B0cy50ZXN0Q2VudHJvaWRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZWRvaWRzID0gcmFuZG9tTWVkb2lkcyhub2Rlcywgb3B0cy5rKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbWVkb2lkcyA9IHJhbmRvbU1lZG9pZHMobm9kZXMsIG9wdHMuayk7XG4gIH1cbiAgdmFyIGlzU3RpbGxNb3ZpbmcgPSB0cnVlO1xuICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gIHdoaWxlIChpc1N0aWxsTW92aW5nICYmIGl0ZXJhdGlvbnMgPCBvcHRzLm1heEl0ZXJhdGlvbnMpIHtcbiAgICAvLyBTdGVwIDI6IEFzc2lnbiBub2RlcyB0byB0aGUgbmVhcmVzdCBtZWRvaWRcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgICBub2RlID0gbm9kZXNbbl07XG4gICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggY2x1c3RlciB0aGlzIG5vZGUgYmVsb25ncyB0bzogbm9kZSBpZCA9PiBjbHVzdGVyICNcbiAgICAgIGFzc2lnbm1lbnRbbm9kZS5pZCgpXSA9IGNsYXNzaWZ5KG5vZGUsIG1lZG9pZHMsIG9wdHMuZGlzdGFuY2UsIG9wdHMuYXR0cmlidXRlcywgJ2tNZWRvaWRzJyk7XG4gICAgfVxuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTtcbiAgICAvLyBTdGVwIDM6IEZvciBlYWNoIG1lZG9pZCBtLCBhbmQgZm9yIGVhY2ggbm9kZSBhc3NvY2lhdGVkIHdpdGggbWVkaW9kIG0sXG4gICAgLy8gc2VsZWN0IHRoZSBub2RlIHdpdGggdGhlIGxvd2VzdCBjb25maWd1cmF0aW9uIGNvc3QgYXMgbmV3IG1lZG9pZC5cbiAgICBmb3IgKHZhciBtID0gMDsgbSA8IG1lZG9pZHMubGVuZ3RoOyBtKyspIHtcbiAgICAgIC8vIEdldCBhbGwgbm9kZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBtZWRvaWRcbiAgICAgIHZhciBjbHVzdGVyID0gYnVpbGRDbHVzdGVyKG0sIG5vZGVzLCBhc3NpZ25tZW50KTtcbiAgICAgIGlmIChjbHVzdGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBJZiBjbHVzdGVyIGlzIGVtcHR5LCBicmVhayBvdXQgZWFybHkgJiBtb3ZlIHRvIG5leHQgY2x1c3RlclxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG1pbkNvc3RzW21dID0gZmluZENvc3QobWVkb2lkc1ttXSwgY2x1c3Rlciwgb3B0cy5hdHRyaWJ1dGVzKTsgLy8gb3JpZ2luYWwgY29zdFxuXG4gICAgICAvLyBTZWxlY3QgZGlmZmVyZW50IG1lZG9pZCBpZiBpdHMgY29uZmlndXJhdGlvbiBoYXMgdGhlIGxvd2VzdCBjb3N0XG4gICAgICBmb3IgKHZhciBfbiA9IDA7IF9uIDwgY2x1c3Rlci5sZW5ndGg7IF9uKyspIHtcbiAgICAgICAgY3VyQ29zdCA9IGZpbmRDb3N0KGNsdXN0ZXJbX25dLCBjbHVzdGVyLCBvcHRzLmF0dHJpYnV0ZXMpO1xuICAgICAgICBpZiAoY3VyQ29zdCA8IG1pbkNvc3RzW21dKSB7XG4gICAgICAgICAgbWluQ29zdHNbbV0gPSBjdXJDb3N0O1xuICAgICAgICAgIG1lZG9pZHNbbV0gPSBjbHVzdGVyW19uXTtcbiAgICAgICAgICBpc1N0aWxsTW92aW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2x1c3RlcnNbbV0gPSBjeS5jb2xsZWN0aW9uKGNsdXN0ZXIpO1xuICAgIH1cbiAgICBpdGVyYXRpb25zKys7XG4gIH1cbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciB1cGRhdGVDZW50cm9pZHMgPSBmdW5jdGlvbiB1cGRhdGVDZW50cm9pZHMoY2VudHJvaWRzLCBub2RlcywgVSwgd2VpZ2h0LCBvcHRzKSB7XG4gIHZhciBudW1lcmF0b3IsIGRlbm9taW5hdG9yO1xuICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjZW50cm9pZHMubGVuZ3RoOyBjKyspIHtcbiAgICAgIHdlaWdodFtuXVtjXSA9IE1hdGgucG93KFVbbl1bY10sIG9wdHMubSk7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIF9jID0gMDsgX2MgPCBjZW50cm9pZHMubGVuZ3RoOyBfYysrKSB7XG4gICAgZm9yICh2YXIgZGltID0gMDsgZGltIDwgb3B0cy5hdHRyaWJ1dGVzLmxlbmd0aDsgZGltKyspIHtcbiAgICAgIG51bWVyYXRvciA9IDA7XG4gICAgICBkZW5vbWluYXRvciA9IDA7XG4gICAgICBmb3IgKHZhciBfbjIgPSAwOyBfbjIgPCBub2Rlcy5sZW5ndGg7IF9uMisrKSB7XG4gICAgICAgIG51bWVyYXRvciArPSB3ZWlnaHRbX24yXVtfY10gKiBvcHRzLmF0dHJpYnV0ZXNbZGltXShub2Rlc1tfbjJdKTtcbiAgICAgICAgZGVub21pbmF0b3IgKz0gd2VpZ2h0W19uMl1bX2NdO1xuICAgICAgfVxuICAgICAgY2VudHJvaWRzW19jXVtkaW1dID0gbnVtZXJhdG9yIC8gZGVub21pbmF0b3I7XG4gICAgfVxuICB9XG59O1xudmFyIHVwZGF0ZU1lbWJlcnNoaXAgPSBmdW5jdGlvbiB1cGRhdGVNZW1iZXJzaGlwKFUsIF9VLCBjZW50cm9pZHMsIG5vZGVzLCBvcHRzKSB7XG4gIC8vIFNhdmUgcHJldmlvdXMgc3RlcFxuICBmb3IgKHZhciBpID0gMDsgaSA8IFUubGVuZ3RoOyBpKyspIHtcbiAgICBfVVtpXSA9IFVbaV0uc2xpY2UoKTtcbiAgfVxuICB2YXIgc3VtLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yO1xuICB2YXIgcG93ID0gMiAvIChvcHRzLm0gLSAxKTtcbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBjZW50cm9pZHMubGVuZ3RoOyBjKyspIHtcbiAgICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGVzLmxlbmd0aDsgbisrKSB7XG4gICAgICBzdW0gPSAwO1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBjZW50cm9pZHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgLy8gYWdhaW5zdCBhbGwgb3RoZXIgY2VudHJvaWRzXG4gICAgICAgIG51bWVyYXRvciA9IGdldERpc3Qob3B0cy5kaXN0YW5jZSwgbm9kZXNbbl0sIGNlbnRyb2lkc1tjXSwgb3B0cy5hdHRyaWJ1dGVzLCAnY21lYW5zJyk7XG4gICAgICAgIGRlbm9taW5hdG9yID0gZ2V0RGlzdChvcHRzLmRpc3RhbmNlLCBub2Rlc1tuXSwgY2VudHJvaWRzW2tdLCBvcHRzLmF0dHJpYnV0ZXMsICdjbWVhbnMnKTtcbiAgICAgICAgc3VtICs9IE1hdGgucG93KG51bWVyYXRvciAvIGRlbm9taW5hdG9yLCBwb3cpO1xuICAgICAgfVxuICAgICAgVVtuXVtjXSA9IDEgLyBzdW07XG4gICAgfVxuICB9XG59O1xudmFyIGFzc2lnbiQxID0gZnVuY3Rpb24gYXNzaWduKG5vZGVzLCBVLCBvcHRzLCBjeSkge1xuICB2YXIgY2x1c3RlcnMgPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgZm9yICh2YXIgYyA9IDA7IGMgPCBjbHVzdGVycy5sZW5ndGg7IGMrKykge1xuICAgIGNsdXN0ZXJzW2NdID0gW107XG4gIH1cbiAgdmFyIG1heDtcbiAgdmFyIGluZGV4O1xuICBmb3IgKHZhciBuID0gMDsgbiA8IFUubGVuZ3RoOyBuKyspIHtcbiAgICAvLyBmb3IgZWFjaCBub2RlIChVIGlzIE4geCBDIG1hdHJpeClcbiAgICBtYXggPSAtSW5maW5pdHk7XG4gICAgaW5kZXggPSAtMTtcbiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggY2x1c3RlciB0aGUgbm9kZSBpcyBtb3N0IGxpa2VseSB0byBiZWxvbmcgaW5cbiAgICBmb3IgKHZhciBfYzIgPSAwOyBfYzIgPCBVWzBdLmxlbmd0aDsgX2MyKyspIHtcbiAgICAgIGlmIChVW25dW19jMl0gPiBtYXgpIHtcbiAgICAgICAgbWF4ID0gVVtuXVtfYzJdO1xuICAgICAgICBpbmRleCA9IF9jMjtcbiAgICAgIH1cbiAgICB9XG4gICAgY2x1c3RlcnNbaW5kZXhdLnB1c2gobm9kZXNbbl0pO1xuICB9XG5cbiAgLy8gVHVybiBldmVyeSBhcnJheSBpbnRvIGEgY29sbGVjdGlvbiBvZiBub2Rlc1xuICBmb3IgKHZhciBfYzMgPSAwOyBfYzMgPCBjbHVzdGVycy5sZW5ndGg7IF9jMysrKSB7XG4gICAgY2x1c3RlcnNbX2MzXSA9IGN5LmNvbGxlY3Rpb24oY2x1c3RlcnNbX2MzXSk7XG4gIH1cbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciBmdXp6eUNNZWFucyA9IGZ1bmN0aW9uIGZ1enp5Q01lYW5zKG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gIHZhciBvcHRzID0gc2V0T3B0aW9ucyQyKG9wdGlvbnMpO1xuXG4gIC8vIEJlZ2luIGZ1enp5IGMtbWVhbnMgYWxnb3JpdGhtXG4gIHZhciBjbHVzdGVycztcbiAgdmFyIGNlbnRyb2lkcztcbiAgdmFyIFU7XG4gIHZhciBfVTtcbiAgdmFyIHdlaWdodDtcblxuICAvLyBTdGVwIDE6IEluaXRpYWxpemUgbGV0aWFibGVzLlxuICBfVSA9IG5ldyBBcnJheShub2Rlcy5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTiB4IEMgbWF0cml4XG4gICAgX1VbaV0gPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgfVxuICBVID0gbmV3IEFycmF5KG5vZGVzLmxlbmd0aCk7XG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IG5vZGVzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAvLyBOIHggQyBtYXRyaXhcbiAgICBVW19pM10gPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgfVxuICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBub2Rlcy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgdmFyIHRvdGFsID0gMDtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9wdHMuazsgaisrKSB7XG4gICAgICBVW19pNF1bal0gPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgdG90YWwgKz0gVVtfaTRdW2pdO1xuICAgIH1cbiAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgb3B0cy5rOyBfaisrKSB7XG4gICAgICBVW19pNF1bX2pdID0gVVtfaTRdW19qXSAvIHRvdGFsO1xuICAgIH1cbiAgfVxuICBjZW50cm9pZHMgPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgb3B0cy5rOyBfaTUrKykge1xuICAgIGNlbnRyb2lkc1tfaTVdID0gbmV3IEFycmF5KG9wdHMuYXR0cmlidXRlcy5sZW5ndGgpO1xuICB9XG4gIHdlaWdodCA9IG5ldyBBcnJheShub2Rlcy5sZW5ndGgpO1xuICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBub2Rlcy5sZW5ndGg7IF9pNisrKSB7XG4gICAgLy8gTiB4IEMgbWF0cml4XG4gICAgd2VpZ2h0W19pNl0gPSBuZXcgQXJyYXkob3B0cy5rKTtcbiAgfVxuICAvLyBlbmQgaW5pdCBGQ01cblxuICB2YXIgaXNTdGlsbE1vdmluZyA9IHRydWU7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgd2hpbGUgKGlzU3RpbGxNb3ZpbmcgJiYgaXRlcmF0aW9ucyA8IG9wdHMubWF4SXRlcmF0aW9ucykge1xuICAgIGlzU3RpbGxNb3ZpbmcgPSBmYWxzZTtcblxuICAgIC8vIFN0ZXAgMjogQ2FsY3VsYXRlIHRoZSBjZW50cm9pZHMgZm9yIGVhY2ggc3RlcC5cbiAgICB1cGRhdGVDZW50cm9pZHMoY2VudHJvaWRzLCBub2RlcywgVSwgd2VpZ2h0LCBvcHRzKTtcblxuICAgIC8vIFN0ZXAgMzogVXBkYXRlIHRoZSBwYXJ0aXRpb24gbWF0cml4IFUuXG4gICAgdXBkYXRlTWVtYmVyc2hpcChVLCBfVSwgY2VudHJvaWRzLCBub2Rlcywgb3B0cyk7XG5cbiAgICAvLyBTdGVwIDQ6IENoZWNrIGZvciBjb252ZXJnZW5jZS5cbiAgICBpZiAoIWhhdmVNYXRyaWNlc0NvbnZlcmdlZChVLCBfVSwgb3B0cy5zZW5zaXRpdml0eVRocmVzaG9sZCkpIHtcbiAgICAgIGlzU3RpbGxNb3ZpbmcgPSB0cnVlO1xuICAgIH1cbiAgICBpdGVyYXRpb25zKys7XG4gIH1cblxuICAvLyBBc3NpZ24gbm9kZXMgdG8gY2x1c3RlcnMgd2l0aCBoaWdoZXN0IHByb2JhYmlsaXR5LlxuICBjbHVzdGVycyA9IGFzc2lnbiQxKG5vZGVzLCBVLCBvcHRzLCBjeSk7XG4gIHJldHVybiB7XG4gICAgY2x1c3RlcnM6IGNsdXN0ZXJzLFxuICAgIGRlZ3JlZU9mTWVtYmVyc2hpcDogVVxuICB9O1xufTtcbnZhciBrQ2x1c3RlcmluZyA9IHtcbiAga01lYW5zOiBrTWVhbnMsXG4gIGtNZWRvaWRzOiBrTWVkb2lkcyxcbiAgZnV6enlDTWVhbnM6IGZ1enp5Q01lYW5zLFxuICBmY206IGZ1enp5Q01lYW5zXG59O1xuXG4vLyBJbXBsZW1lbnRlZCBieSBab2UgWGkgQHpvZXhpIGZvciBHU09DIDIwMTZcbnZhciBkZWZhdWx0cyRhID0gZGVmYXVsdHMkZyh7XG4gIGRpc3RhbmNlOiAnZXVjbGlkZWFuJyxcbiAgLy8gZGlzdGFuY2UgbWV0cmljIHRvIGNvbXBhcmUgbm9kZXNcbiAgbGlua2FnZTogJ21pbicsXG4gIC8vIGxpbmthZ2UgY3JpdGVyaW9uIDogaG93IHRvIGRldGVybWluZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiBjbHVzdGVycyBvZiBub2Rlc1xuICBtb2RlOiAndGhyZXNob2xkJyxcbiAgLy8gbW9kZTondGhyZXNob2xkJyA9PiBjbHVzdGVycyBtdXN0IGJlIHRocmVzaG9sZCBkaXN0YW5jZSBhcGFydFxuICB0aHJlc2hvbGQ6IEluZmluaXR5LFxuICAvLyB0aGUgZGlzdGFuY2UgdGhyZXNob2xkXG4gIC8vIG1vZGU6J2RlbmRyb2dyYW0nID0+IHRoZSBub2RlcyBhcmUgb3JnYW5pc2VkIGFzIGxlYXZlcyBpbiBhIHRyZWUgKHNpYmxpbmdzIGFyZSBjbG9zZSksIG1lcmdpbmcgbWFrZXMgY2x1c3RlcnNcbiAgYWRkRGVuZHJvZ3JhbTogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gYWRkIHRoZSBkZW5kcm9ncmFtIHRvIHRoZSBncmFwaCBmb3Igdml6XG4gIGRlbmRyb2dyYW1EZXB0aDogMCxcbiAgLy8gZGVwdGggYXQgd2hpY2ggZGVuZHJvZ3JhbSBicmFuY2hlcyBhcmUgbWVyZ2VkIGludG8gdGhlIHJldHVybmVkIGNsdXN0ZXJzXG4gIGF0dHJpYnV0ZXM6IFtdIC8vIGFycmF5IG9mIGF0dHIgZnVuY3Rpb25zXG59KTtcblxudmFyIGxpbmthZ2VBbGlhc2VzID0ge1xuICAnc2luZ2xlJzogJ21pbicsXG4gICdjb21wbGV0ZSc6ICdtYXgnXG59O1xudmFyIHNldE9wdGlvbnMkMSA9IGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuICB2YXIgb3B0cyA9IGRlZmF1bHRzJGEob3B0aW9ucyk7XG4gIHZhciBwcmVmZXJyZWRBbGlhcyA9IGxpbmthZ2VBbGlhc2VzW29wdHMubGlua2FnZV07XG4gIGlmIChwcmVmZXJyZWRBbGlhcyAhPSBudWxsKSB7XG4gICAgb3B0cy5saW5rYWdlID0gcHJlZmVycmVkQWxpYXM7XG4gIH1cbiAgcmV0dXJuIG9wdHM7XG59O1xudmFyIG1lcmdlQ2xvc2VzdCA9IGZ1bmN0aW9uIG1lcmdlQ2xvc2VzdChjbHVzdGVycywgaW5kZXgsIGRpc3RzLCBtaW5zLCBvcHRzKSB7XG4gIC8vIEZpbmQgdHdvIGNsb3Nlc3QgY2x1c3RlcnMgZnJvbSBjYWNoZWQgbWluc1xuICB2YXIgbWluS2V5ID0gMDtcbiAgdmFyIG1pbiA9IEluZmluaXR5O1xuICB2YXIgZGlzdDtcbiAgdmFyIGF0dHJzID0gb3B0cy5hdHRyaWJ1dGVzO1xuICB2YXIgZ2V0RGlzdCA9IGZ1bmN0aW9uIGdldERpc3QobjEsIG4yKSB7XG4gICAgcmV0dXJuIGNsdXN0ZXJpbmdEaXN0YW5jZShvcHRzLmRpc3RhbmNlLCBhdHRycy5sZW5ndGgsIGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gYXR0cnNbaV0objEpO1xuICAgIH0sIGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gYXR0cnNbaV0objIpO1xuICAgIH0sIG4xLCBuMik7XG4gIH07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gY2x1c3RlcnNbaV0ua2V5O1xuICAgIHZhciBfZGlzdCA9IGRpc3RzW2tleV1bbWluc1trZXldXTtcbiAgICBpZiAoX2Rpc3QgPCBtaW4pIHtcbiAgICAgIG1pbktleSA9IGtleTtcbiAgICAgIG1pbiA9IF9kaXN0O1xuICAgIH1cbiAgfVxuICBpZiAob3B0cy5tb2RlID09PSAndGhyZXNob2xkJyAmJiBtaW4gPj0gb3B0cy50aHJlc2hvbGQgfHwgb3B0cy5tb2RlID09PSAnZGVuZHJvZ3JhbScgJiYgY2x1c3RlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBjMSA9IGluZGV4W21pbktleV07XG4gIHZhciBjMiA9IGluZGV4W21pbnNbbWluS2V5XV07XG4gIHZhciBtZXJnZWQ7XG5cbiAgLy8gTWVyZ2UgdHdvIGNsb3Nlc3QgY2x1c3RlcnNcbiAgaWYgKG9wdHMubW9kZSA9PT0gJ2RlbmRyb2dyYW0nKSB7XG4gICAgbWVyZ2VkID0ge1xuICAgICAgbGVmdDogYzEsXG4gICAgICByaWdodDogYzIsXG4gICAgICBrZXk6IGMxLmtleVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgbWVyZ2VkID0ge1xuICAgICAgdmFsdWU6IGMxLnZhbHVlLmNvbmNhdChjMi52YWx1ZSksXG4gICAgICBrZXk6IGMxLmtleVxuICAgIH07XG4gIH1cbiAgY2x1c3RlcnNbYzEuaW5kZXhdID0gbWVyZ2VkO1xuICBjbHVzdGVycy5zcGxpY2UoYzIuaW5kZXgsIDEpO1xuICBpbmRleFtjMS5rZXldID0gbWVyZ2VkO1xuXG4gIC8vIFVwZGF0ZSBkaXN0YW5jZXMgd2l0aCBuZXcgbWVyZ2VkIGNsdXN0ZXJcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGNsdXN0ZXJzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBjdXIgPSBjbHVzdGVyc1tfaV07XG4gICAgaWYgKGMxLmtleSA9PT0gY3VyLmtleSkge1xuICAgICAgZGlzdCA9IEluZmluaXR5O1xuICAgIH0gZWxzZSBpZiAob3B0cy5saW5rYWdlID09PSAnbWluJykge1xuICAgICAgZGlzdCA9IGRpc3RzW2MxLmtleV1bY3VyLmtleV07XG4gICAgICBpZiAoZGlzdHNbYzEua2V5XVtjdXIua2V5XSA+IGRpc3RzW2MyLmtleV1bY3VyLmtleV0pIHtcbiAgICAgICAgZGlzdCA9IGRpc3RzW2MyLmtleV1bY3VyLmtleV07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRzLmxpbmthZ2UgPT09ICdtYXgnKSB7XG4gICAgICBkaXN0ID0gZGlzdHNbYzEua2V5XVtjdXIua2V5XTtcbiAgICAgIGlmIChkaXN0c1tjMS5rZXldW2N1ci5rZXldIDwgZGlzdHNbYzIua2V5XVtjdXIua2V5XSkge1xuICAgICAgICBkaXN0ID0gZGlzdHNbYzIua2V5XVtjdXIua2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdHMubGlua2FnZSA9PT0gJ21lYW4nKSB7XG4gICAgICBkaXN0ID0gKGRpc3RzW2MxLmtleV1bY3VyLmtleV0gKiBjMS5zaXplICsgZGlzdHNbYzIua2V5XVtjdXIua2V5XSAqIGMyLnNpemUpIC8gKGMxLnNpemUgKyBjMi5zaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdHMubW9kZSA9PT0gJ2RlbmRyb2dyYW0nKSBkaXN0ID0gZ2V0RGlzdChjdXIudmFsdWUsIGMxLnZhbHVlKTtlbHNlIGRpc3QgPSBnZXREaXN0KGN1ci52YWx1ZVswXSwgYzEudmFsdWVbMF0pO1xuICAgIH1cbiAgICBkaXN0c1tjMS5rZXldW2N1ci5rZXldID0gZGlzdHNbY3VyLmtleV1bYzEua2V5XSA9IGRpc3Q7IC8vIGRpc3RhbmNlIG1hdHJpeCBpcyBzeW1tZXRyaWNcbiAgfVxuXG4gIC8vIFVwZGF0ZSBjYWNoZWQgbWluc1xuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBjbHVzdGVycy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIGtleTEgPSBjbHVzdGVyc1tfaTJdLmtleTtcbiAgICBpZiAobWluc1trZXkxXSA9PT0gYzEua2V5IHx8IG1pbnNba2V5MV0gPT09IGMyLmtleSkge1xuICAgICAgdmFyIF9taW4gPSBrZXkxO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjbHVzdGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIga2V5MiA9IGNsdXN0ZXJzW2pdLmtleTtcbiAgICAgICAgaWYgKGRpc3RzW2tleTFdW2tleTJdIDwgZGlzdHNba2V5MV1bX21pbl0pIHtcbiAgICAgICAgICBfbWluID0ga2V5MjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWluc1trZXkxXSA9IF9taW47XG4gICAgfVxuICAgIGNsdXN0ZXJzW19pMl0uaW5kZXggPSBfaTI7XG4gIH1cblxuICAvLyBDbGVhbiB1cCBtZXRhIGRhdGEgdXNlZCBmb3IgY2x1c3RlcmluZ1xuICBjMS5rZXkgPSBjMi5rZXkgPSBjMS5pbmRleCA9IGMyLmluZGV4ID0gbnVsbDtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIGdldEFsbENoaWxkcmVuID0gZnVuY3Rpb24gZ2V0QWxsQ2hpbGRyZW4ocm9vdCwgYXJyLCBjeSkge1xuICBpZiAoIXJvb3QpIHJldHVybjtcbiAgaWYgKHJvb3QudmFsdWUpIHtcbiAgICBhcnIucHVzaChyb290LnZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAocm9vdC5sZWZ0KSBnZXRBbGxDaGlsZHJlbihyb290LmxlZnQsIGFycik7XG4gICAgaWYgKHJvb3QucmlnaHQpIGdldEFsbENoaWxkcmVuKHJvb3QucmlnaHQsIGFycik7XG4gIH1cbn07XG52YXIgYnVpbGREZW5kcm9ncmFtID0gZnVuY3Rpb24gYnVpbGREZW5kcm9ncmFtKHJvb3QsIGN5KSB7XG4gIGlmICghcm9vdCkgcmV0dXJuICcnO1xuICBpZiAocm9vdC5sZWZ0ICYmIHJvb3QucmlnaHQpIHtcbiAgICB2YXIgbGVmdFN0ciA9IGJ1aWxkRGVuZHJvZ3JhbShyb290LmxlZnQsIGN5KTtcbiAgICB2YXIgcmlnaHRTdHIgPSBidWlsZERlbmRyb2dyYW0ocm9vdC5yaWdodCwgY3kpO1xuICAgIHZhciBub2RlID0gY3kuYWRkKHtcbiAgICAgIGdyb3VwOiAnbm9kZXMnLFxuICAgICAgZGF0YToge1xuICAgICAgICBpZDogbGVmdFN0ciArICcsJyArIHJpZ2h0U3RyXG4gICAgICB9XG4gICAgfSk7XG4gICAgY3kuYWRkKHtcbiAgICAgIGdyb3VwOiAnZWRnZXMnLFxuICAgICAgZGF0YToge1xuICAgICAgICBzb3VyY2U6IGxlZnRTdHIsXG4gICAgICAgIHRhcmdldDogbm9kZS5pZCgpXG4gICAgICB9XG4gICAgfSk7XG4gICAgY3kuYWRkKHtcbiAgICAgIGdyb3VwOiAnZWRnZXMnLFxuICAgICAgZGF0YToge1xuICAgICAgICBzb3VyY2U6IHJpZ2h0U3RyLFxuICAgICAgICB0YXJnZXQ6IG5vZGUuaWQoKVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBub2RlLmlkKCk7XG4gIH0gZWxzZSBpZiAocm9vdC52YWx1ZSkge1xuICAgIHJldHVybiByb290LnZhbHVlLmlkKCk7XG4gIH1cbn07XG52YXIgYnVpbGRDbHVzdGVyc0Zyb21UcmVlID0gZnVuY3Rpb24gYnVpbGRDbHVzdGVyc0Zyb21UcmVlKHJvb3QsIGssIGN5KSB7XG4gIGlmICghcm9vdCkgcmV0dXJuIFtdO1xuICB2YXIgbGVmdCA9IFtdLFxuICAgIHJpZ2h0ID0gW10sXG4gICAgbGVhdmVzID0gW107XG4gIGlmIChrID09PSAwKSB7XG4gICAgLy8gZG9uJ3QgY3V0IHRyZWUsIHNpbXBseSByZXR1cm4gYWxsIG5vZGVzIGFzIDEgc2luZ2xlIGNsdXN0ZXJcbiAgICBpZiAocm9vdC5sZWZ0KSBnZXRBbGxDaGlsZHJlbihyb290LmxlZnQsIGxlZnQpO1xuICAgIGlmIChyb290LnJpZ2h0KSBnZXRBbGxDaGlsZHJlbihyb290LnJpZ2h0LCByaWdodCk7XG4gICAgbGVhdmVzID0gbGVmdC5jb25jYXQocmlnaHQpO1xuICAgIHJldHVybiBbY3kuY29sbGVjdGlvbihsZWF2ZXMpXTtcbiAgfSBlbHNlIGlmIChrID09PSAxKSB7XG4gICAgLy8gY3V0IGF0IHJvb3RcblxuICAgIGlmIChyb290LnZhbHVlKSB7XG4gICAgICAvLyBsZWFmIG5vZGVcbiAgICAgIHJldHVybiBbY3kuY29sbGVjdGlvbihyb290LnZhbHVlKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyb290LmxlZnQpIGdldEFsbENoaWxkcmVuKHJvb3QubGVmdCwgbGVmdCk7XG4gICAgICBpZiAocm9vdC5yaWdodCkgZ2V0QWxsQ2hpbGRyZW4ocm9vdC5yaWdodCwgcmlnaHQpO1xuICAgICAgcmV0dXJuIFtjeS5jb2xsZWN0aW9uKGxlZnQpLCBjeS5jb2xsZWN0aW9uKHJpZ2h0KV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChyb290LnZhbHVlKSB7XG4gICAgICByZXR1cm4gW2N5LmNvbGxlY3Rpb24ocm9vdC52YWx1ZSldO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocm9vdC5sZWZ0KSBsZWZ0ID0gYnVpbGRDbHVzdGVyc0Zyb21UcmVlKHJvb3QubGVmdCwgayAtIDEsIGN5KTtcbiAgICAgIGlmIChyb290LnJpZ2h0KSByaWdodCA9IGJ1aWxkQ2x1c3RlcnNGcm9tVHJlZShyb290LnJpZ2h0LCBrIC0gMSwgY3kpO1xuICAgICAgcmV0dXJuIGxlZnQuY29uY2F0KHJpZ2h0KTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBoaWVyYXJjaGljYWxDbHVzdGVyaW5nID0gZnVuY3Rpb24gaGllcmFyY2hpY2FsQ2x1c3RlcmluZyhvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuXG4gIC8vIFNldCBwYXJhbWV0ZXJzIG9mIGFsZ29yaXRobTogbGlua2FnZSB0eXBlLCBkaXN0YW5jZSBtZXRyaWMsIGV0Yy5cbiAgdmFyIG9wdHMgPSBzZXRPcHRpb25zJDEob3B0aW9ucyk7XG4gIHZhciBhdHRycyA9IG9wdHMuYXR0cmlidXRlcztcbiAgdmFyIGdldERpc3QgPSBmdW5jdGlvbiBnZXREaXN0KG4xLCBuMikge1xuICAgIHJldHVybiBjbHVzdGVyaW5nRGlzdGFuY2Uob3B0cy5kaXN0YW5jZSwgYXR0cnMubGVuZ3RoLCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGF0dHJzW2ldKG4xKTtcbiAgICB9LCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGF0dHJzW2ldKG4yKTtcbiAgICB9LCBuMSwgbjIpO1xuICB9O1xuXG4gIC8vIEJlZ2luIGhpZXJhcmNoaWNhbCBhbGdvcml0aG1cbiAgdmFyIGNsdXN0ZXJzID0gW107XG4gIHZhciBkaXN0cyA9IFtdOyAvLyBkaXN0YW5jZXMgYmV0d2VlbiBlYWNoIHBhaXIgb2YgY2x1c3RlcnNcbiAgdmFyIG1pbnMgPSBbXTsgLy8gY2xvc2VzdCBjbHVzdGVyIGZvciBlYWNoIGNsdXN0ZXJcbiAgdmFyIGluZGV4ID0gW107IC8vIGhhc2ggb2YgYWxsIGNsdXN0ZXJzIGJ5IGtleVxuXG4gIC8vIEluIGFnZ2xvbWVyYXRpdmUgKGJvdHRvbS11cCkgY2x1c3RlcmluZywgZWFjaCBub2RlIHN0YXJ0cyBhcyBpdHMgb3duIGNsdXN0ZXJcbiAgZm9yICh2YXIgbiA9IDA7IG4gPCBub2Rlcy5sZW5ndGg7IG4rKykge1xuICAgIHZhciBjbHVzdGVyID0ge1xuICAgICAgdmFsdWU6IG9wdHMubW9kZSA9PT0gJ2RlbmRyb2dyYW0nID8gbm9kZXNbbl0gOiBbbm9kZXNbbl1dLFxuICAgICAga2V5OiBuLFxuICAgICAgaW5kZXg6IG5cbiAgICB9O1xuICAgIGNsdXN0ZXJzW25dID0gY2x1c3RlcjtcbiAgICBpbmRleFtuXSA9IGNsdXN0ZXI7XG4gICAgZGlzdHNbbl0gPSBbXTtcbiAgICBtaW5zW25dID0gMDtcbiAgfVxuXG4gIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiBlYWNoIHBhaXIgb2YgY2x1c3RlcnNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDw9IGk7IGorKykge1xuICAgICAgdmFyIGRpc3QgPSB2b2lkIDA7XG4gICAgICBpZiAob3B0cy5tb2RlID09PSAnZGVuZHJvZ3JhbScpIHtcbiAgICAgICAgLy8gbW9kZXMgc3RvcmUgY2x1c3RlciB2YWx1ZXMgZGlmZmVyZW50bHlcbiAgICAgICAgZGlzdCA9IGkgPT09IGogPyBJbmZpbml0eSA6IGdldERpc3QoY2x1c3RlcnNbaV0udmFsdWUsIGNsdXN0ZXJzW2pdLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3QgPSBpID09PSBqID8gSW5maW5pdHkgOiBnZXREaXN0KGNsdXN0ZXJzW2ldLnZhbHVlWzBdLCBjbHVzdGVyc1tqXS52YWx1ZVswXSk7XG4gICAgICB9XG4gICAgICBkaXN0c1tpXVtqXSA9IGRpc3Q7XG4gICAgICBkaXN0c1tqXVtpXSA9IGRpc3Q7XG4gICAgICBpZiAoZGlzdCA8IGRpc3RzW2ldW21pbnNbaV1dKSB7XG4gICAgICAgIG1pbnNbaV0gPSBqOyAvLyBDYWNoZSBtaW5zOiBjbG9zZXN0IGNsdXN0ZXIgdG8gY2x1c3RlciBpIGlzIGNsdXN0ZXIgalxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmQgdGhlIGNsb3Nlc3QgcGFpciBvZiBjbHVzdGVycyBhbmQgbWVyZ2UgdGhlbSBpbnRvIGEgc2luZ2xlIGNsdXN0ZXIuXG4gIC8vIFVwZGF0ZSBkaXN0YW5jZXMgYmV0d2VlbiBuZXcgY2x1c3RlciBhbmQgZWFjaCBvZiB0aGUgb2xkIGNsdXN0ZXJzLCBhbmQgbG9vcCB1bnRpbCB0aHJlc2hvbGQgcmVhY2hlZC5cbiAgdmFyIG1lcmdlZCA9IG1lcmdlQ2xvc2VzdChjbHVzdGVycywgaW5kZXgsIGRpc3RzLCBtaW5zLCBvcHRzKTtcbiAgd2hpbGUgKG1lcmdlZCkge1xuICAgIG1lcmdlZCA9IG1lcmdlQ2xvc2VzdChjbHVzdGVycywgaW5kZXgsIGRpc3RzLCBtaW5zLCBvcHRzKTtcbiAgfVxuICB2YXIgcmV0Q2x1c3RlcnM7XG5cbiAgLy8gRGVuZHJvZ3JhbSBtb2RlIGJ1aWxkcyB0aGUgaGllcmFyY2h5IGFuZCBhZGRzIGludGVybWVkaWFyeSBub2RlcyArIGVkZ2VzXG4gIC8vIGluIGFkZGl0aW9uIHRvIHJldHVybmluZyB0aGUgY2x1c3RlcnMuXG4gIGlmIChvcHRzLm1vZGUgPT09ICdkZW5kcm9ncmFtJykge1xuICAgIHJldENsdXN0ZXJzID0gYnVpbGRDbHVzdGVyc0Zyb21UcmVlKGNsdXN0ZXJzWzBdLCBvcHRzLmRlbmRyb2dyYW1EZXB0aCwgY3kpO1xuICAgIGlmIChvcHRzLmFkZERlbmRyb2dyYW0pIGJ1aWxkRGVuZHJvZ3JhbShjbHVzdGVyc1swXSwgY3kpO1xuICB9IGVsc2Uge1xuICAgIC8vIFJlZ3VsYXIgbW9kZSBzaW1wbHkgcmV0dXJucyB0aGUgY2x1c3RlcnNcblxuICAgIHJldENsdXN0ZXJzID0gbmV3IEFycmF5KGNsdXN0ZXJzLmxlbmd0aCk7XG4gICAgY2x1c3RlcnMuZm9yRWFjaChmdW5jdGlvbiAoY2x1c3RlciwgaSkge1xuICAgICAgLy8gQ2xlYW4gdXAgbWV0YSBkYXRhIHVzZWQgZm9yIGNsdXN0ZXJpbmdcbiAgICAgIGNsdXN0ZXIua2V5ID0gY2x1c3Rlci5pbmRleCA9IG51bGw7XG4gICAgICByZXRDbHVzdGVyc1tpXSA9IGN5LmNvbGxlY3Rpb24oY2x1c3Rlci52YWx1ZSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJldENsdXN0ZXJzO1xufTtcbnZhciBoaWVyYXJjaGljYWxDbHVzdGVyaW5nJDEgPSB7XG4gIGhpZXJhcmNoaWNhbENsdXN0ZXJpbmc6IGhpZXJhcmNoaWNhbENsdXN0ZXJpbmcsXG4gIGhjYTogaGllcmFyY2hpY2FsQ2x1c3RlcmluZ1xufTtcblxuLy8gSW1wbGVtZW50ZWQgYnkgWm9lIFhpIEB6b2V4aSBmb3IgR1NPQyAyMDE2XG52YXIgZGVmYXVsdHMkOSA9IGRlZmF1bHRzJGcoe1xuICBkaXN0YW5jZTogJ2V1Y2xpZGVhbicsXG4gIC8vIGRpc3RhbmNlIG1ldHJpYyB0byBjb21wYXJlIGF0dHJpYnV0ZXMgYmV0d2VlbiB0d28gbm9kZXNcbiAgcHJlZmVyZW5jZTogJ21lZGlhbicsXG4gIC8vIHN1aXRhYmlsaXR5IG9mIGEgZGF0YSBwb2ludCB0byBzZXJ2ZSBhcyBhbiBleGVtcGxhclxuICBkYW1waW5nOiAwLjgsXG4gIC8vIGRhbXBpbmcgZmFjdG9yIGJldHdlZW4gWzAuNSwgMSlcbiAgbWF4SXRlcmF0aW9uczogMTAwMCxcbiAgLy8gbWF4IG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHJ1blxuICBtaW5JdGVyYXRpb25zOiAxMDAsXG4gIC8vIG1pbiBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBydW4gaW4gb3JkZXIgZm9yIGNsdXN0ZXJpbmcgdG8gc3RvcFxuICBhdHRyaWJ1dGVzOiBbLy8gZnVuY3Rpb25zIHRvIHF1YW50aWZ5IHRoZSBzaW1pbGFyaXR5IGJldHdlZW4gYW55IHR3byBwb2ludHNcbiAgICAvLyBlLmcuIG5vZGUgPT4gbm9kZS5kYXRhKCd3ZWlnaHQnKVxuICBdXG59KTtcbnZhciBzZXRPcHRpb25zID0gZnVuY3Rpb24gc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gIHZhciBkbXAgPSBvcHRpb25zLmRhbXBpbmc7XG4gIHZhciBwcmVmID0gb3B0aW9ucy5wcmVmZXJlbmNlO1xuICBpZiAoISgwLjUgPD0gZG1wICYmIGRtcCA8IDEpKSB7XG4gICAgZXJyb3IoXCJEYW1waW5nIG11c3QgcmFuZ2Ugb24gWzAuNSwgMSkuICBHb3Q6IFwiLmNvbmNhdChkbXApKTtcbiAgfVxuICB2YXIgdmFsaWRQcmVmcyA9IFsnbWVkaWFuJywgJ21lYW4nLCAnbWluJywgJ21heCddO1xuICBpZiAoISh2YWxpZFByZWZzLnNvbWUoZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gdiA9PT0gcHJlZjtcbiAgfSkgfHwgbnVtYmVyJDEocHJlZikpKSB7XG4gICAgZXJyb3IoXCJQcmVmZXJlbmNlIG11c3QgYmUgb25lIG9mIFtcIi5jb25jYXQodmFsaWRQcmVmcy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICAgIHJldHVybiBcIidcIi5jb25jYXQocCwgXCInXCIpO1xuICAgIH0pLmpvaW4oJywgJyksIFwiXSBvciBhIG51bWJlci4gIEdvdDogXCIpLmNvbmNhdChwcmVmKSk7XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRzJDkob3B0aW9ucyk7XG59O1xuXG52YXIgZ2V0U2ltaWxhcml0eSA9IGZ1bmN0aW9uIGdldFNpbWlsYXJpdHkodHlwZSwgbjEsIG4yLCBhdHRyaWJ1dGVzKSB7XG4gIHZhciBhdHRyID0gZnVuY3Rpb24gYXR0cihuLCBpKSB7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXNbaV0obik7XG4gIH07XG5cbiAgLy8gbmIgbmVnYXRpdmUgYmVjYXVzZSBzaW1pbGFyaXR5IHNob3VsZCBoYXZlIGFuIGludmVyc2UgcmVsYXRpb25zaGlwIHRvIGRpc3RhbmNlXG4gIHJldHVybiAtY2x1c3RlcmluZ0Rpc3RhbmNlKHR5cGUsIGF0dHJpYnV0ZXMubGVuZ3RoLCBmdW5jdGlvbiAoaSkge1xuICAgIHJldHVybiBhdHRyKG4xLCBpKTtcbiAgfSwgZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gYXR0cihuMiwgaSk7XG4gIH0sIG4xLCBuMik7XG59O1xudmFyIGdldFByZWZlcmVuY2UgPSBmdW5jdGlvbiBnZXRQcmVmZXJlbmNlKFMsIHByZWZlcmVuY2UpIHtcbiAgLy8gbGFyZ2VyIHByZWZlcmVuY2UgPSBncmVhdGVyICMgb2YgY2x1c3RlcnNcbiAgdmFyIHAgPSBudWxsO1xuICBpZiAocHJlZmVyZW5jZSA9PT0gJ21lZGlhbicpIHtcbiAgICBwID0gbWVkaWFuKFMpO1xuICB9IGVsc2UgaWYgKHByZWZlcmVuY2UgPT09ICdtZWFuJykge1xuICAgIHAgPSBtZWFuKFMpO1xuICB9IGVsc2UgaWYgKHByZWZlcmVuY2UgPT09ICdtaW4nKSB7XG4gICAgcCA9IG1pbihTKTtcbiAgfSBlbHNlIGlmIChwcmVmZXJlbmNlID09PSAnbWF4Jykge1xuICAgIHAgPSBtYXgoUyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ3VzdG9tIHByZWZlcmVuY2UgbnVtYmVyLCBhcyBzZXQgYnkgdXNlclxuICAgIHAgPSBwcmVmZXJlbmNlO1xuICB9XG4gIHJldHVybiBwO1xufTtcbnZhciBmaW5kRXhlbXBsYXJzID0gZnVuY3Rpb24gZmluZEV4ZW1wbGFycyhuLCBSLCBBKSB7XG4gIHZhciBpbmRpY2VzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgaWYgKFJbaSAqIG4gKyBpXSArIEFbaSAqIG4gKyBpXSA+IDApIHtcbiAgICAgIGluZGljZXMucHVzaChpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluZGljZXM7XG59O1xudmFyIGFzc2lnbkNsdXN0ZXJzID0gZnVuY3Rpb24gYXNzaWduQ2x1c3RlcnMobiwgUywgZXhlbXBsYXJzKSB7XG4gIHZhciBjbHVzdGVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIHZhciBpbmRleCA9IC0xO1xuICAgIHZhciBtYXggPSAtSW5maW5pdHk7XG4gICAgZm9yICh2YXIgZWkgPSAwOyBlaSA8IGV4ZW1wbGFycy5sZW5ndGg7IGVpKyspIHtcbiAgICAgIHZhciBlID0gZXhlbXBsYXJzW2VpXTtcbiAgICAgIGlmIChTW2kgKiBuICsgZV0gPiBtYXgpIHtcbiAgICAgICAgaW5kZXggPSBlO1xuICAgICAgICBtYXggPSBTW2kgKiBuICsgZV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgIGNsdXN0ZXJzLnB1c2goaW5kZXgpO1xuICAgIH1cbiAgfVxuICBmb3IgKHZhciBfZWkgPSAwOyBfZWkgPCBleGVtcGxhcnMubGVuZ3RoOyBfZWkrKykge1xuICAgIGNsdXN0ZXJzW2V4ZW1wbGFyc1tfZWldXSA9IGV4ZW1wbGFyc1tfZWldO1xuICB9XG4gIHJldHVybiBjbHVzdGVycztcbn07XG52YXIgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduKG4sIFMsIGV4ZW1wbGFycykge1xuICB2YXIgY2x1c3RlcnMgPSBhc3NpZ25DbHVzdGVycyhuLCBTLCBleGVtcGxhcnMpO1xuICBmb3IgKHZhciBlaSA9IDA7IGVpIDwgZXhlbXBsYXJzLmxlbmd0aDsgZWkrKykge1xuICAgIHZhciBpaSA9IFtdO1xuICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY2x1c3RlcnMubGVuZ3RoOyBjKyspIHtcbiAgICAgIGlmIChjbHVzdGVyc1tjXSA9PT0gZXhlbXBsYXJzW2VpXSkge1xuICAgICAgICBpaS5wdXNoKGMpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgbWF4SSA9IC0xO1xuICAgIHZhciBtYXhTdW0gPSAtSW5maW5pdHk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpaS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGlpLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHN1bSArPSBTW2lpW2pdICogbiArIGlpW2ldXTtcbiAgICAgIH1cbiAgICAgIGlmIChzdW0gPiBtYXhTdW0pIHtcbiAgICAgICAgbWF4SSA9IGk7XG4gICAgICAgIG1heFN1bSA9IHN1bTtcbiAgICAgIH1cbiAgICB9XG4gICAgZXhlbXBsYXJzW2VpXSA9IGlpW21heEldO1xuICB9XG4gIGNsdXN0ZXJzID0gYXNzaWduQ2x1c3RlcnMobiwgUywgZXhlbXBsYXJzKTtcbiAgcmV0dXJuIGNsdXN0ZXJzO1xufTtcbnZhciBhZmZpbml0eVByb3BhZ2F0aW9uID0gZnVuY3Rpb24gYWZmaW5pdHlQcm9wYWdhdGlvbihvcHRpb25zKSB7XG4gIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcygpO1xuICB2YXIgb3B0cyA9IHNldE9wdGlvbnMob3B0aW9ucyk7XG5cbiAgLy8gTWFwIGVhY2ggbm9kZSB0byBpdHMgcG9zaXRpb24gaW4gbm9kZSBhcnJheVxuICB2YXIgaWQycG9zaXRpb24gPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGlkMnBvc2l0aW9uW25vZGVzW2ldLmlkKCldID0gaTtcbiAgfVxuXG4gIC8vIEJlZ2luIGFmZmluaXR5IHByb3BhZ2F0aW9uIGFsZ29yaXRobVxuXG4gIHZhciBuOyAvLyBudW1iZXIgb2YgZGF0YSBwb2ludHNcbiAgdmFyIG4yOyAvLyBzaXplIG9mIG1hdHJpY2VzXG4gIHZhciBTOyAvLyBzaW1pbGFyaXR5IG1hdHJpeCAoMUQgYXJyYXkpXG4gIHZhciBwOyAvLyBwcmVmZXJlbmNlL3N1aXRhYmlsaXR5IG9mIGEgZGF0YSBwb2ludCB0byBzZXJ2ZSBhcyBhbiBleGVtcGxhclxuICB2YXIgUjsgLy8gcmVzcG9uc2liaWxpdHkgbWF0cml4ICgxRCBhcnJheSlcbiAgdmFyIEE7IC8vIGF2YWlsYWJpbGl0eSBtYXRyaXggKDFEIGFycmF5KVxuXG4gIG4gPSBub2Rlcy5sZW5ndGg7XG4gIG4yID0gbiAqIG47XG5cbiAgLy8gSW5pdGlhbGl6ZSBhbmQgYnVpbGQgUyBzaW1pbGFyaXR5IG1hdHJpeFxuICBTID0gbmV3IEFycmF5KG4yKTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG4yOyBfaSsrKSB7XG4gICAgU1tfaV0gPSAtSW5maW5pdHk7IC8vIGZvciBjYXNlcyB3aGVyZSB0d28gZGF0YSBwb2ludHMgc2hvdWxkbid0IGJlIGxpbmtlZCB0b2dldGhlclxuICB9XG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbjsgX2kyKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgaWYgKF9pMiAhPT0gaikge1xuICAgICAgICBTW19pMiAqIG4gKyBqXSA9IGdldFNpbWlsYXJpdHkob3B0cy5kaXN0YW5jZSwgbm9kZXNbX2kyXSwgbm9kZXNbal0sIG9wdHMuYXR0cmlidXRlcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUGxhY2UgcHJlZmVyZW5jZXMgb24gdGhlIGRpYWdvbmFsIG9mIFNcbiAgcCA9IGdldFByZWZlcmVuY2UoUywgb3B0cy5wcmVmZXJlbmNlKTtcbiAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbjsgX2kzKyspIHtcbiAgICBTW19pMyAqIG4gKyBfaTNdID0gcDtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgUiByZXNwb25zaWJpbGl0eSBtYXRyaXhcbiAgUiA9IG5ldyBBcnJheShuMik7XG4gIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG4yOyBfaTQrKykge1xuICAgIFJbX2k0XSA9IDAuMDtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgQSBhdmFpbGFiaWxpdHkgbWF0cml4XG4gIEEgPSBuZXcgQXJyYXkobjIpO1xuICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBuMjsgX2k1KyspIHtcbiAgICBBW19pNV0gPSAwLjA7XG4gIH1cbiAgdmFyIG9sZCA9IG5ldyBBcnJheShuKTtcbiAgdmFyIFJwID0gbmV3IEFycmF5KG4pO1xuICB2YXIgc2UgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IG47IF9pNisrKSB7XG4gICAgb2xkW19pNl0gPSAwLjA7XG4gICAgUnBbX2k2XSA9IDAuMDtcbiAgICBzZVtfaTZdID0gMDtcbiAgfVxuICB2YXIgZSA9IG5ldyBBcnJheShuICogb3B0cy5taW5JdGVyYXRpb25zKTtcbiAgZm9yICh2YXIgX2k3ID0gMDsgX2k3IDwgZS5sZW5ndGg7IF9pNysrKSB7XG4gICAgZVtfaTddID0gMDtcbiAgfVxuICB2YXIgaXRlcjtcbiAgZm9yIChpdGVyID0gMDsgaXRlciA8IG9wdHMubWF4SXRlcmF0aW9uczsgaXRlcisrKSB7XG4gICAgLy8gbWFpbiBhbGdvcml0aG1pYyBsb29wXG5cbiAgICAvLyBVcGRhdGUgUiByZXNwb25zaWJpbGl0eSBtYXRyaXhcbiAgICBmb3IgKHZhciBfaTggPSAwOyBfaTggPCBuOyBfaTgrKykge1xuICAgICAgdmFyIG1heCA9IC1JbmZpbml0eSxcbiAgICAgICAgbWF4MiA9IC1JbmZpbml0eSxcbiAgICAgICAgbWF4SSA9IC0xLFxuICAgICAgICBBUyA9IDAuMDtcbiAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBuOyBfaisrKSB7XG4gICAgICAgIG9sZFtfal0gPSBSW19pOCAqIG4gKyBfal07XG4gICAgICAgIEFTID0gQVtfaTggKiBuICsgX2pdICsgU1tfaTggKiBuICsgX2pdO1xuICAgICAgICBpZiAoQVMgPj0gbWF4KSB7XG4gICAgICAgICAgbWF4MiA9IG1heDtcbiAgICAgICAgICBtYXggPSBBUztcbiAgICAgICAgICBtYXhJID0gX2o7XG4gICAgICAgIH0gZWxzZSBpZiAoQVMgPiBtYXgyKSB7XG4gICAgICAgICAgbWF4MiA9IEFTO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBfajIgPSAwOyBfajIgPCBuOyBfajIrKykge1xuICAgICAgICBSW19pOCAqIG4gKyBfajJdID0gKDEgLSBvcHRzLmRhbXBpbmcpICogKFNbX2k4ICogbiArIF9qMl0gLSBtYXgpICsgb3B0cy5kYW1waW5nICogb2xkW19qMl07XG4gICAgICB9XG4gICAgICBSW19pOCAqIG4gKyBtYXhJXSA9ICgxIC0gb3B0cy5kYW1waW5nKSAqIChTW19pOCAqIG4gKyBtYXhJXSAtIG1heDIpICsgb3B0cy5kYW1waW5nICogb2xkW21heEldO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBBIGF2YWlsYWJpbGl0eSBtYXRyaXhcbiAgICBmb3IgKHZhciBfaTkgPSAwOyBfaTkgPCBuOyBfaTkrKykge1xuICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICBmb3IgKHZhciBfajMgPSAwOyBfajMgPCBuOyBfajMrKykge1xuICAgICAgICBvbGRbX2ozXSA9IEFbX2ozICogbiArIF9pOV07XG4gICAgICAgIFJwW19qM10gPSBNYXRoLm1heCgwLCBSW19qMyAqIG4gKyBfaTldKTtcbiAgICAgICAgc3VtICs9IFJwW19qM107XG4gICAgICB9XG4gICAgICBzdW0gLT0gUnBbX2k5XTtcbiAgICAgIFJwW19pOV0gPSBSW19pOSAqIG4gKyBfaTldO1xuICAgICAgc3VtICs9IFJwW19pOV07XG4gICAgICBmb3IgKHZhciBfajQgPSAwOyBfajQgPCBuOyBfajQrKykge1xuICAgICAgICBBW19qNCAqIG4gKyBfaTldID0gKDEgLSBvcHRzLmRhbXBpbmcpICogTWF0aC5taW4oMCwgc3VtIC0gUnBbX2o0XSkgKyBvcHRzLmRhbXBpbmcgKiBvbGRbX2o0XTtcbiAgICAgIH1cbiAgICAgIEFbX2k5ICogbiArIF9pOV0gPSAoMSAtIG9wdHMuZGFtcGluZykgKiAoc3VtIC0gUnBbX2k5XSkgKyBvcHRzLmRhbXBpbmcgKiBvbGRbX2k5XTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgY29udmVyZ2VuY2VcbiAgICB2YXIgSyA9IDA7XG4gICAgZm9yICh2YXIgX2kxMCA9IDA7IF9pMTAgPCBuOyBfaTEwKyspIHtcbiAgICAgIHZhciBFID0gQVtfaTEwICogbiArIF9pMTBdICsgUltfaTEwICogbiArIF9pMTBdID4gMCA/IDEgOiAwO1xuICAgICAgZVtpdGVyICUgb3B0cy5taW5JdGVyYXRpb25zICogbiArIF9pMTBdID0gRTtcbiAgICAgIEsgKz0gRTtcbiAgICB9XG4gICAgaWYgKEsgPiAwICYmIChpdGVyID49IG9wdHMubWluSXRlcmF0aW9ucyAtIDEgfHwgaXRlciA9PSBvcHRzLm1heEl0ZXJhdGlvbnMgLSAxKSkge1xuICAgICAgdmFyIF9zdW0gPSAwO1xuICAgICAgZm9yICh2YXIgX2kxMSA9IDA7IF9pMTEgPCBuOyBfaTExKyspIHtcbiAgICAgICAgc2VbX2kxMV0gPSAwO1xuICAgICAgICBmb3IgKHZhciBfajUgPSAwOyBfajUgPCBvcHRzLm1pbkl0ZXJhdGlvbnM7IF9qNSsrKSB7XG4gICAgICAgICAgc2VbX2kxMV0gKz0gZVtfajUgKiBuICsgX2kxMV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlW19pMTFdID09PSAwIHx8IHNlW19pMTFdID09PSBvcHRzLm1pbkl0ZXJhdGlvbnMpIHtcbiAgICAgICAgICBfc3VtKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChfc3VtID09PSBuKSB7XG4gICAgICAgIC8vIHRoZW4gd2UgaGF2ZSBjb252ZXJnZW5jZVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBJZGVudGlmeSBleGVtcGxhcnMgKGNsdXN0ZXIgY2VudGVycylcbiAgdmFyIGV4ZW1wbGFyc0luZGljZXMgPSBmaW5kRXhlbXBsYXJzKG4sIFIsIEEpO1xuXG4gIC8vIEFzc2lnbiBub2RlcyB0byBjbHVzdGVyc1xuICB2YXIgY2x1c3RlckluZGljZXMgPSBhc3NpZ24obiwgUywgZXhlbXBsYXJzSW5kaWNlcyk7XG4gIHZhciBjbHVzdGVycyA9IHt9O1xuICBmb3IgKHZhciBjID0gMDsgYyA8IGV4ZW1wbGFyc0luZGljZXMubGVuZ3RoOyBjKyspIHtcbiAgICBjbHVzdGVyc1tleGVtcGxhcnNJbmRpY2VzW2NdXSA9IFtdO1xuICB9XG4gIGZvciAodmFyIF9pMTIgPSAwOyBfaTEyIDwgbm9kZXMubGVuZ3RoOyBfaTEyKyspIHtcbiAgICB2YXIgcG9zID0gaWQycG9zaXRpb25bbm9kZXNbX2kxMl0uaWQoKV07XG4gICAgdmFyIGNsdXN0ZXJJbmRleCA9IGNsdXN0ZXJJbmRpY2VzW3Bvc107XG4gICAgaWYgKGNsdXN0ZXJJbmRleCAhPSBudWxsKSB7XG4gICAgICAvLyB0aGUgbm9kZSBtYXkgaGF2ZSBub3QgYmVlbiBhc3NpZ25lZCBhIGNsdXN0ZXIgaWYgbm8gdmFsaWQgYXR0cmlidXRlcyB3ZXJlIHNwZWNpZmllZFxuICAgICAgY2x1c3RlcnNbY2x1c3RlckluZGV4XS5wdXNoKG5vZGVzW19pMTJdKTtcbiAgICB9XG4gIH1cbiAgdmFyIHJldENsdXN0ZXJzID0gbmV3IEFycmF5KGV4ZW1wbGFyc0luZGljZXMubGVuZ3RoKTtcbiAgZm9yICh2YXIgX2MgPSAwOyBfYyA8IGV4ZW1wbGFyc0luZGljZXMubGVuZ3RoOyBfYysrKSB7XG4gICAgcmV0Q2x1c3RlcnNbX2NdID0gY3kuY29sbGVjdGlvbihjbHVzdGVyc1tleGVtcGxhcnNJbmRpY2VzW19jXV0pO1xuICB9XG4gIHJldHVybiByZXRDbHVzdGVycztcbn07XG52YXIgYWZmaW5pdHlQcm9wYWdhdGlvbiQxID0ge1xuICBhZmZpbml0eVByb3BhZ2F0aW9uOiBhZmZpbml0eVByb3BhZ2F0aW9uLFxuICBhcDogYWZmaW5pdHlQcm9wYWdhdGlvblxufTtcblxudmFyIGhpZXJob2x6ZXJEZWZhdWx0cyA9IGRlZmF1bHRzJGcoe1xuICByb290OiB1bmRlZmluZWQsXG4gIGRpcmVjdGVkOiBmYWxzZVxufSk7XG52YXIgZWxlc2ZuJGsgPSB7XG4gIGhpZXJob2x6ZXI6IGZ1bmN0aW9uIGhpZXJob2x6ZXIob3B0aW9ucykge1xuICAgIGlmICghcGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgcm9vdDogYXJnc1swXSxcbiAgICAgICAgZGlyZWN0ZWQ6IGFyZ3NbMV1cbiAgICAgIH07XG4gICAgfVxuICAgIHZhciBfaGllcmhvbHplckRlZmF1bHRzID0gaGllcmhvbHplckRlZmF1bHRzKG9wdGlvbnMpLFxuICAgICAgcm9vdCA9IF9oaWVyaG9semVyRGVmYXVsdHMucm9vdCxcbiAgICAgIGRpcmVjdGVkID0gX2hpZXJob2x6ZXJEZWZhdWx0cy5kaXJlY3RlZDtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIGRmbGFnID0gZmFsc2U7XG4gICAgdmFyIG9kZEluO1xuICAgIHZhciBvZGRPdXQ7XG4gICAgdmFyIHN0YXJ0VmVydGV4O1xuICAgIGlmIChyb290KSBzdGFydFZlcnRleCA9IHN0cmluZyhyb290KSA/IHRoaXMuZmlsdGVyKHJvb3QpWzBdLmlkKCkgOiByb290WzBdLmlkKCk7XG4gICAgdmFyIG5vZGVzID0ge307XG4gICAgdmFyIGVkZ2VzID0ge307XG4gICAgaWYgKGRpcmVjdGVkKSB7XG4gICAgICBlbGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICAgICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgICAgIHZhciBpbmQgPSBlbGUuaW5kZWdyZWUodHJ1ZSk7XG4gICAgICAgICAgdmFyIG91dGQgPSBlbGUub3V0ZGVncmVlKHRydWUpO1xuICAgICAgICAgIHZhciBkMSA9IGluZCAtIG91dGQ7XG4gICAgICAgICAgdmFyIGQyID0gb3V0ZCAtIGluZDtcbiAgICAgICAgICBpZiAoZDEgPT0gMSkge1xuICAgICAgICAgICAgaWYgKG9kZEluKSBkZmxhZyA9IHRydWU7ZWxzZSBvZGRJbiA9IGlkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZDIgPT0gMSkge1xuICAgICAgICAgICAgaWYgKG9kZE91dCkgZGZsYWcgPSB0cnVlO2Vsc2Ugb2RkT3V0ID0gaWQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChkMiA+IDEgfHwgZDEgPiAxKSB7XG4gICAgICAgICAgICBkZmxhZyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGVzW2lkXSA9IFtdO1xuICAgICAgICAgIGVsZS5vdXRnb2VycygpLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGlmIChlLmlzRWRnZSgpKSBub2Rlc1tpZF0ucHVzaChlLmlkKCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVkZ2VzW2lkXSA9IFt1bmRlZmluZWQsIGVsZS50YXJnZXQoKS5pZCgpXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgICAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgICAgdmFyIGQgPSBlbGUuZGVncmVlKHRydWUpO1xuICAgICAgICAgIGlmIChkICUgMikge1xuICAgICAgICAgICAgaWYgKCFvZGRJbikgb2RkSW4gPSBpZDtlbHNlIGlmICghb2RkT3V0KSBvZGRPdXQgPSBpZDtlbHNlIGRmbGFnID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZXNbaWRdID0gW107XG4gICAgICAgICAgZWxlLmNvbm5lY3RlZEVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVzW2lkXS5wdXNoKGUuaWQoKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWRnZXNbaWRdID0gW2VsZS5zb3VyY2UoKS5pZCgpLCBlbGUudGFyZ2V0KCkuaWQoKV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgZm91bmQ6IGZhbHNlLFxuICAgICAgdHJhaWw6IHVuZGVmaW5lZFxuICAgIH07XG4gICAgaWYgKGRmbGFnKSByZXR1cm4gcmVzdWx0O2Vsc2UgaWYgKG9kZE91dCAmJiBvZGRJbikge1xuICAgICAgaWYgKGRpcmVjdGVkKSB7XG4gICAgICAgIGlmIChzdGFydFZlcnRleCAmJiBvZGRPdXQgIT0gc3RhcnRWZXJ0ZXgpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0VmVydGV4ID0gb2RkT3V0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHN0YXJ0VmVydGV4ICYmIG9kZE91dCAhPSBzdGFydFZlcnRleCAmJiBvZGRJbiAhPSBzdGFydFZlcnRleCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoIXN0YXJ0VmVydGV4KSB7XG4gICAgICAgICAgc3RhcnRWZXJ0ZXggPSBvZGRPdXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFzdGFydFZlcnRleCkgc3RhcnRWZXJ0ZXggPSBlbGVzWzBdLmlkKCk7XG4gICAgfVxuICAgIHZhciB3YWxrID0gZnVuY3Rpb24gd2Fsayh2KSB7XG4gICAgICB2YXIgY3VycmVudE5vZGUgPSB2O1xuICAgICAgdmFyIHN1YnRvdXIgPSBbdl07XG4gICAgICB2YXIgYWRqLCBhZGpUYWlsLCBhZGpIZWFkO1xuICAgICAgd2hpbGUgKG5vZGVzW2N1cnJlbnROb2RlXS5sZW5ndGgpIHtcbiAgICAgICAgYWRqID0gbm9kZXNbY3VycmVudE5vZGVdLnNoaWZ0KCk7XG4gICAgICAgIGFkalRhaWwgPSBlZGdlc1thZGpdWzBdO1xuICAgICAgICBhZGpIZWFkID0gZWRnZXNbYWRqXVsxXTtcbiAgICAgICAgaWYgKGN1cnJlbnROb2RlICE9IGFkakhlYWQpIHtcbiAgICAgICAgICBub2Rlc1thZGpIZWFkXSA9IG5vZGVzW2FkakhlYWRdLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGUgIT0gYWRqO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGN1cnJlbnROb2RlID0gYWRqSGVhZDtcbiAgICAgICAgfSBlbHNlIGlmICghZGlyZWN0ZWQgJiYgY3VycmVudE5vZGUgIT0gYWRqVGFpbCkge1xuICAgICAgICAgIG5vZGVzW2FkalRhaWxdID0gbm9kZXNbYWRqVGFpbF0uZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZSAhPSBhZGo7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY3VycmVudE5vZGUgPSBhZGpUYWlsO1xuICAgICAgICB9XG4gICAgICAgIHN1YnRvdXIudW5zaGlmdChhZGopO1xuICAgICAgICBzdWJ0b3VyLnVuc2hpZnQoY3VycmVudE5vZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1YnRvdXI7XG4gICAgfTtcbiAgICB2YXIgdHJhaWwgPSBbXTtcbiAgICB2YXIgc3VidG91ciA9IFtdO1xuICAgIHN1YnRvdXIgPSB3YWxrKHN0YXJ0VmVydGV4KTtcbiAgICB3aGlsZSAoc3VidG91ci5sZW5ndGggIT0gMSkge1xuICAgICAgaWYgKG5vZGVzW3N1YnRvdXJbMF1dLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHRyYWlsLnVuc2hpZnQoZWxlcy5nZXRFbGVtZW50QnlJZChzdWJ0b3VyLnNoaWZ0KCkpKTtcbiAgICAgICAgdHJhaWwudW5zaGlmdChlbGVzLmdldEVsZW1lbnRCeUlkKHN1YnRvdXIuc2hpZnQoKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3VidG91ciA9IHdhbGsoc3VidG91ci5zaGlmdCgpKS5jb25jYXQoc3VidG91cik7XG4gICAgICB9XG4gICAgfVxuICAgIHRyYWlsLnVuc2hpZnQoZWxlcy5nZXRFbGVtZW50QnlJZChzdWJ0b3VyLnNoaWZ0KCkpKTsgLy8gZmluYWwgbm9kZVxuXG4gICAgZm9yICh2YXIgZCBpbiBub2Rlcykge1xuICAgICAgaWYgKG5vZGVzW2RdLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQuZm91bmQgPSB0cnVlO1xuICAgIHJlc3VsdC50cmFpbCA9IHRoaXMuc3Bhd24odHJhaWwsIHRydWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbnZhciBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkID0gZnVuY3Rpb24gaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZCgpIHtcbiAgdmFyIGVsZXMgPSB0aGlzO1xuICB2YXIgbm9kZXMgPSB7fTtcbiAgdmFyIGlkID0gMDtcbiAgdmFyIGVkZ2VDb3VudCA9IDA7XG4gIHZhciBjb21wb25lbnRzID0gW107XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgdmlzaXRlZEVkZ2VzID0ge307XG4gIHZhciBidWlsZENvbXBvbmVudCA9IGZ1bmN0aW9uIGJ1aWxkQ29tcG9uZW50KHgsIHkpIHtcbiAgICB2YXIgaSA9IHN0YWNrLmxlbmd0aCAtIDE7XG4gICAgdmFyIGN1dHNldCA9IFtdO1xuICAgIHZhciBjb21wb25lbnQgPSBlbGVzLnNwYXduKCk7XG4gICAgd2hpbGUgKHN0YWNrW2ldLnggIT0geCB8fCBzdGFja1tpXS55ICE9IHkpIHtcbiAgICAgIGN1dHNldC5wdXNoKHN0YWNrLnBvcCgpLmVkZ2UpO1xuICAgICAgaS0tO1xuICAgIH1cbiAgICBjdXRzZXQucHVzaChzdGFjay5wb3AoKS5lZGdlKTtcbiAgICBjdXRzZXQuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgdmFyIGNvbm5lY3RlZE5vZGVzID0gZWRnZS5jb25uZWN0ZWROb2RlcygpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICAgIGNvbXBvbmVudC5tZXJnZShlZGdlKTtcbiAgICAgIGNvbm5lY3RlZE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIG5vZGVJZCA9IG5vZGUuaWQoKTtcbiAgICAgICAgdmFyIGNvbm5lY3RlZEVkZ2VzID0gbm9kZS5jb25uZWN0ZWRFZGdlcygpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICAgICAgY29tcG9uZW50Lm1lcmdlKG5vZGUpO1xuICAgICAgICBpZiAoIW5vZGVzW25vZGVJZF0uY3V0VmVydGV4KSB7XG4gICAgICAgICAgY29tcG9uZW50Lm1lcmdlKGNvbm5lY3RlZEVkZ2VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wb25lbnQubWVyZ2UoY29ubmVjdGVkRWRnZXMuZmlsdGVyKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgICByZXR1cm4gZWRnZS5pc0xvb3AoKTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICB9O1xuICB2YXIgYmljb25uZWN0ZWRTZWFyY2ggPSBmdW5jdGlvbiBiaWNvbm5lY3RlZFNlYXJjaChyb290LCBjdXJyZW50Tm9kZSwgcGFyZW50KSB7XG4gICAgaWYgKHJvb3QgPT09IHBhcmVudCkgZWRnZUNvdW50ICs9IDE7XG4gICAgbm9kZXNbY3VycmVudE5vZGVdID0ge1xuICAgICAgaWQ6IGlkLFxuICAgICAgbG93OiBpZCsrLFxuICAgICAgY3V0VmVydGV4OiBmYWxzZVxuICAgIH07XG4gICAgdmFyIGVkZ2VzID0gZWxlcy5nZXRFbGVtZW50QnlJZChjdXJyZW50Tm9kZSkuY29ubmVjdGVkRWRnZXMoKS5pbnRlcnNlY3Rpb24oZWxlcyk7XG4gICAgaWYgKGVkZ2VzLnNpemUoKSA9PT0gMCkge1xuICAgICAgY29tcG9uZW50cy5wdXNoKGVsZXMuc3Bhd24oZWxlcy5nZXRFbGVtZW50QnlJZChjdXJyZW50Tm9kZSkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNvdXJjZUlkLCB0YXJnZXRJZCwgb3RoZXJOb2RlSWQsIGVkZ2VJZDtcbiAgICAgIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgc291cmNlSWQgPSBlZGdlLnNvdXJjZSgpLmlkKCk7XG4gICAgICAgIHRhcmdldElkID0gZWRnZS50YXJnZXQoKS5pZCgpO1xuICAgICAgICBvdGhlck5vZGVJZCA9IHNvdXJjZUlkID09PSBjdXJyZW50Tm9kZSA/IHRhcmdldElkIDogc291cmNlSWQ7XG4gICAgICAgIGlmIChvdGhlck5vZGVJZCAhPT0gcGFyZW50KSB7XG4gICAgICAgICAgZWRnZUlkID0gZWRnZS5pZCgpO1xuICAgICAgICAgIGlmICghdmlzaXRlZEVkZ2VzW2VkZ2VJZF0pIHtcbiAgICAgICAgICAgIHZpc2l0ZWRFZGdlc1tlZGdlSWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICB4OiBjdXJyZW50Tm9kZSxcbiAgICAgICAgICAgICAgeTogb3RoZXJOb2RlSWQsXG4gICAgICAgICAgICAgIGVkZ2U6IGVkZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIShvdGhlck5vZGVJZCBpbiBub2RlcykpIHtcbiAgICAgICAgICAgIGJpY29ubmVjdGVkU2VhcmNoKHJvb3QsIG90aGVyTm9kZUlkLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICBub2Rlc1tjdXJyZW50Tm9kZV0ubG93ID0gTWF0aC5taW4obm9kZXNbY3VycmVudE5vZGVdLmxvdywgbm9kZXNbb3RoZXJOb2RlSWRdLmxvdyk7XG4gICAgICAgICAgICBpZiAobm9kZXNbY3VycmVudE5vZGVdLmlkIDw9IG5vZGVzW290aGVyTm9kZUlkXS5sb3cpIHtcbiAgICAgICAgICAgICAgbm9kZXNbY3VycmVudE5vZGVdLmN1dFZlcnRleCA9IHRydWU7XG4gICAgICAgICAgICAgIGJ1aWxkQ29tcG9uZW50KGN1cnJlbnROb2RlLCBvdGhlck5vZGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGVzW2N1cnJlbnROb2RlXS5sb3cgPSBNYXRoLm1pbihub2Rlc1tjdXJyZW50Tm9kZV0ubG93LCBub2Rlc1tvdGhlck5vZGVJZF0uaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICBlbGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIHZhciBub2RlSWQgPSBlbGUuaWQoKTtcbiAgICAgIGlmICghKG5vZGVJZCBpbiBub2RlcykpIHtcbiAgICAgICAgZWRnZUNvdW50ID0gMDtcbiAgICAgICAgYmljb25uZWN0ZWRTZWFyY2gobm9kZUlkLCBub2RlSWQpO1xuICAgICAgICBub2Rlc1tub2RlSWRdLmN1dFZlcnRleCA9IGVkZ2VDb3VudCA+IDE7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdmFyIGN1dFZlcnRpY2VzID0gT2JqZWN0LmtleXMobm9kZXMpLmZpbHRlcihmdW5jdGlvbiAoaWQpIHtcbiAgICByZXR1cm4gbm9kZXNbaWRdLmN1dFZlcnRleDtcbiAgfSkubWFwKGZ1bmN0aW9uIChpZCkge1xuICAgIHJldHVybiBlbGVzLmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgY3V0OiBlbGVzLnNwYXduKGN1dFZlcnRpY2VzKSxcbiAgICBjb21wb25lbnRzOiBjb21wb25lbnRzXG4gIH07XG59O1xudmFyIGhvcGNyb2Z0VGFyamFuQmljb25uZWN0ZWQkMSA9IHtcbiAgaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZDogaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZCxcbiAgaHRiYzogaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZCxcbiAgaHRiOiBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkLFxuICBob3Bjcm9mdFRhcmphbkJpY29ubmVjdGVkQ29tcG9uZW50czogaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZFxufTtcblxudmFyIHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkID0gZnVuY3Rpb24gdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQoKSB7XG4gIHZhciBlbGVzID0gdGhpcztcbiAgdmFyIG5vZGVzID0ge307XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBjb21wb25lbnRzID0gW107XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgY3V0ID0gZWxlcy5zcGF3bihlbGVzKTtcbiAgdmFyIHN0cm9uZ2x5Q29ubmVjdGVkU2VhcmNoID0gZnVuY3Rpb24gc3Ryb25nbHlDb25uZWN0ZWRTZWFyY2goc291cmNlTm9kZUlkKSB7XG4gICAgc3RhY2sucHVzaChzb3VyY2VOb2RlSWQpO1xuICAgIG5vZGVzW3NvdXJjZU5vZGVJZF0gPSB7XG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBsb3c6IGluZGV4KyssXG4gICAgICBleHBsb3JlZDogZmFsc2VcbiAgICB9O1xuICAgIHZhciBjb25uZWN0ZWRFZGdlcyA9IGVsZXMuZ2V0RWxlbWVudEJ5SWQoc291cmNlTm9kZUlkKS5jb25uZWN0ZWRFZGdlcygpLmludGVyc2VjdGlvbihlbGVzKTtcbiAgICBjb25uZWN0ZWRFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICB2YXIgdGFyZ2V0Tm9kZUlkID0gZWRnZS50YXJnZXQoKS5pZCgpO1xuICAgICAgaWYgKHRhcmdldE5vZGVJZCAhPT0gc291cmNlTm9kZUlkKSB7XG4gICAgICAgIGlmICghKHRhcmdldE5vZGVJZCBpbiBub2RlcykpIHtcbiAgICAgICAgICBzdHJvbmdseUNvbm5lY3RlZFNlYXJjaCh0YXJnZXROb2RlSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbm9kZXNbdGFyZ2V0Tm9kZUlkXS5leHBsb3JlZCkge1xuICAgICAgICAgIG5vZGVzW3NvdXJjZU5vZGVJZF0ubG93ID0gTWF0aC5taW4obm9kZXNbc291cmNlTm9kZUlkXS5sb3csIG5vZGVzW3RhcmdldE5vZGVJZF0ubG93KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChub2Rlc1tzb3VyY2VOb2RlSWRdLmluZGV4ID09PSBub2Rlc1tzb3VyY2VOb2RlSWRdLmxvdykge1xuICAgICAgdmFyIGNvbXBvbmVudE5vZGVzID0gZWxlcy5zcGF3bigpO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICB2YXIgbm9kZUlkID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGNvbXBvbmVudE5vZGVzLm1lcmdlKGVsZXMuZ2V0RWxlbWVudEJ5SWQobm9kZUlkKSk7XG4gICAgICAgIG5vZGVzW25vZGVJZF0ubG93ID0gbm9kZXNbc291cmNlTm9kZUlkXS5pbmRleDtcbiAgICAgICAgbm9kZXNbbm9kZUlkXS5leHBsb3JlZCA9IHRydWU7XG4gICAgICAgIGlmIChub2RlSWQgPT09IHNvdXJjZU5vZGVJZCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgY29tcG9uZW50RWRnZXMgPSBjb21wb25lbnROb2Rlcy5lZGdlc1dpdGgoY29tcG9uZW50Tm9kZXMpO1xuICAgICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudE5vZGVzLm1lcmdlKGNvbXBvbmVudEVkZ2VzKTtcbiAgICAgIGNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgICAgY3V0ID0gY3V0LmRpZmZlcmVuY2UoY29tcG9uZW50KTtcbiAgICB9XG4gIH07XG4gIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgdmFyIG5vZGVJZCA9IGVsZS5pZCgpO1xuICAgICAgaWYgKCEobm9kZUlkIGluIG5vZGVzKSkge1xuICAgICAgICBzdHJvbmdseUNvbm5lY3RlZFNlYXJjaChub2RlSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiB7XG4gICAgY3V0OiBjdXQsXG4gICAgY29tcG9uZW50czogY29tcG9uZW50c1xuICB9O1xufTtcbnZhciB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCQxID0ge1xuICB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZDogdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQsXG4gIHRzYzogdGFyamFuU3Ryb25nbHlDb25uZWN0ZWQsXG4gIHRzY2M6IHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkLFxuICB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZENvbXBvbmVudHM6IHRhcmphblN0cm9uZ2x5Q29ubmVjdGVkXG59O1xuXG52YXIgZWxlc2ZuJGogPSB7fTtcbltlbGVzZm4kdiwgZWxlc2ZuJHUsIGVsZXNmbiR0LCBlbGVzZm4kcywgZWxlc2ZuJHIsIGVsZXNmbiRxLCBlbGVzZm4kcCwgZWxlc2ZuJG8sIGVsZXNmbiRuLCBlbGVzZm4kbSwgZWxlc2ZuJGwsIG1hcmtvdkNsdXN0ZXJpbmckMSwga0NsdXN0ZXJpbmcsIGhpZXJhcmNoaWNhbENsdXN0ZXJpbmckMSwgYWZmaW5pdHlQcm9wYWdhdGlvbiQxLCBlbGVzZm4kaywgaG9wY3JvZnRUYXJqYW5CaWNvbm5lY3RlZCQxLCB0YXJqYW5TdHJvbmdseUNvbm5lY3RlZCQxXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoZWxlc2ZuJGosIHByb3BzKTtcbn0pO1xuXG4vKiFcbkVtYmVkZGFibGUgTWluaW11bSBTdHJpY3RseS1Db21wbGlhbnQgUHJvbWlzZXMvQSsgMS4xLjEgVGhlbmFibGVcbkNvcHlyaWdodCAoYykgMjAxMy0yMDE0IFJhbGYgUy4gRW5nZWxzY2hhbGwgKGh0dHA6Ly9lbmdlbHNjaGFsbC5jb20pXG5MaWNlbnNlZCB1bmRlciBUaGUgTUlUIExpY2Vuc2UgKGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQpXG4qL1xuXG4vKiAgcHJvbWlzZSBzdGF0ZXMgW1Byb21pc2VzL0ErIDIuMV0gICovXG52YXIgU1RBVEVfUEVORElORyA9IDA7IC8qICBbUHJvbWlzZXMvQSsgMi4xLjFdICAqL1xudmFyIFNUQVRFX0ZVTEZJTExFRCA9IDE7IC8qICBbUHJvbWlzZXMvQSsgMi4xLjJdICAqL1xudmFyIFNUQVRFX1JFSkVDVEVEID0gMjsgLyogIFtQcm9taXNlcy9BKyAyLjEuM10gICovXG5cbi8qICBwcm9taXNlIG9iamVjdCBjb25zdHJ1Y3RvciAgKi9cbnZhciBhcGkgPSBmdW5jdGlvbiBhcGkoZXhlY3V0b3IpIHtcbiAgLyogIG9wdGlvbmFsbHkgc3VwcG9ydCBub24tY29uc3RydWN0b3IvcGxhaW4tZnVuY3Rpb24gY2FsbCAgKi9cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIGFwaSkpIHJldHVybiBuZXcgYXBpKGV4ZWN1dG9yKTtcblxuICAvKiAgaW5pdGlhbGl6ZSBvYmplY3QgICovXG4gIHRoaXMuaWQgPSAnVGhlbmFibGUvMS4wLjcnO1xuICB0aGlzLnN0YXRlID0gU1RBVEVfUEVORElORzsgLyogIGluaXRpYWwgc3RhdGUgICovXG4gIHRoaXMuZnVsZmlsbFZhbHVlID0gdW5kZWZpbmVkOyAvKiAgaW5pdGlhbCB2YWx1ZSAgKi8gLyogIFtQcm9taXNlcy9BKyAxLjMsIDIuMS4yLjJdICAqL1xuICB0aGlzLnJlamVjdFJlYXNvbiA9IHVuZGVmaW5lZDsgLyogIGluaXRpYWwgcmVhc29uICovIC8qICBbUHJvbWlzZXMvQSsgMS41LCAyLjEuMy4yXSAgKi9cbiAgdGhpcy5vbkZ1bGZpbGxlZCA9IFtdOyAvKiAgaW5pdGlhbCBoYW5kbGVycyAgKi9cbiAgdGhpcy5vblJlamVjdGVkID0gW107IC8qICBpbml0aWFsIGhhbmRsZXJzICAqL1xuXG4gIC8qICBwcm92aWRlIG9wdGlvbmFsIGluZm9ybWF0aW9uLWhpZGluZyBwcm94eSAgKi9cbiAgdGhpcy5wcm94eSA9IHtcbiAgICB0aGVuOiB0aGlzLnRoZW4uYmluZCh0aGlzKVxuICB9O1xuXG4gIC8qICBzdXBwb3J0IG9wdGlvbmFsIGV4ZWN1dG9yIGZ1bmN0aW9uICAqL1xuICBpZiAodHlwZW9mIGV4ZWN1dG9yID09PSAnZnVuY3Rpb24nKSBleGVjdXRvci5jYWxsKHRoaXMsIHRoaXMuZnVsZmlsbC5iaW5kKHRoaXMpLCB0aGlzLnJlamVjdC5iaW5kKHRoaXMpKTtcbn07XG5cbi8qICBwcm9taXNlIEFQSSBtZXRob2RzICAqL1xuYXBpLnByb3RvdHlwZSA9IHtcbiAgLyogIHByb21pc2UgcmVzb2x2aW5nIG1ldGhvZHMgICovXG4gIGZ1bGZpbGw6IGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHtcbiAgICByZXR1cm4gZGVsaXZlcih0aGlzLCBTVEFURV9GVUxGSUxMRUQsICdmdWxmaWxsVmFsdWUnLCB2YWx1ZSk7XG4gIH0sXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIGRlbGl2ZXIodGhpcywgU1RBVEVfUkVKRUNURUQsICdyZWplY3RSZWFzb24nLCB2YWx1ZSk7XG4gIH0sXG4gIC8qICBcIlRoZSB0aGVuIE1ldGhvZFwiIFtQcm9taXNlcy9BKyAxLjEsIDEuMiwgMi4yXSAgKi9cbiAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgIHZhciBjdXJyID0gdGhpcztcbiAgICB2YXIgbmV4dCA9IG5ldyBhcGkoKTsgLyogIFtQcm9taXNlcy9BKyAyLjIuN10gICovXG4gICAgY3Vyci5vbkZ1bGZpbGxlZC5wdXNoKHJlc29sdmVyKG9uRnVsZmlsbGVkLCBuZXh0LCAnZnVsZmlsbCcpKTsgLyogIFtQcm9taXNlcy9BKyAyLjIuMi8yLjIuNl0gICovXG4gICAgY3Vyci5vblJlamVjdGVkLnB1c2gocmVzb2x2ZXIob25SZWplY3RlZCwgbmV4dCwgJ3JlamVjdCcpKTsgLyogIFtQcm9taXNlcy9BKyAyLjIuMy8yLjIuNl0gICovXG4gICAgZXhlY3V0ZShjdXJyKTtcbiAgICByZXR1cm4gbmV4dC5wcm94eTsgLyogIFtQcm9taXNlcy9BKyAyLjIuNywgMy4zXSAgKi9cbiAgfVxufTtcblxuLyogIGRlbGl2ZXIgYW4gYWN0aW9uICAqL1xudmFyIGRlbGl2ZXIgPSBmdW5jdGlvbiBkZWxpdmVyKGN1cnIsIHN0YXRlLCBuYW1lLCB2YWx1ZSkge1xuICBpZiAoY3Vyci5zdGF0ZSA9PT0gU1RBVEVfUEVORElORykge1xuICAgIGN1cnIuc3RhdGUgPSBzdGF0ZTsgLyogIFtQcm9taXNlcy9BKyAyLjEuMi4xLCAyLjEuMy4xXSAgKi9cbiAgICBjdXJyW25hbWVdID0gdmFsdWU7IC8qICBbUHJvbWlzZXMvQSsgMi4xLjIuMiwgMi4xLjMuMl0gICovXG4gICAgZXhlY3V0ZShjdXJyKTtcbiAgfVxuICByZXR1cm4gY3Vycjtcbn07XG5cbi8qICBleGVjdXRlIGFsbCBoYW5kbGVycyAgKi9cbnZhciBleGVjdXRlID0gZnVuY3Rpb24gZXhlY3V0ZShjdXJyKSB7XG4gIGlmIChjdXJyLnN0YXRlID09PSBTVEFURV9GVUxGSUxMRUQpIGV4ZWN1dGVfaGFuZGxlcnMoY3VyciwgJ29uRnVsZmlsbGVkJywgY3Vyci5mdWxmaWxsVmFsdWUpO2Vsc2UgaWYgKGN1cnIuc3RhdGUgPT09IFNUQVRFX1JFSkVDVEVEKSBleGVjdXRlX2hhbmRsZXJzKGN1cnIsICdvblJlamVjdGVkJywgY3Vyci5yZWplY3RSZWFzb24pO1xufTtcblxuLyogIGV4ZWN1dGUgcGFydGljdWxhciBzZXQgb2YgaGFuZGxlcnMgICovXG52YXIgZXhlY3V0ZV9oYW5kbGVycyA9IGZ1bmN0aW9uIGV4ZWN1dGVfaGFuZGxlcnMoY3VyciwgbmFtZSwgdmFsdWUpIHtcbiAgLyogZ2xvYmFsIHNldEltbWVkaWF0ZTogdHJ1ZSAqL1xuICAvKiBnbG9iYWwgc2V0VGltZW91dDogdHJ1ZSAqL1xuXG4gIC8qICBzaG9ydC1jaXJjdWl0IHByb2Nlc3NpbmcgICovXG4gIGlmIChjdXJyW25hbWVdLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIC8qICBpdGVyYXRlIG92ZXIgYWxsIGhhbmRsZXJzLCBleGFjdGx5IG9uY2UgICovXG4gIHZhciBoYW5kbGVycyA9IGN1cnJbbmFtZV07XG4gIGN1cnJbbmFtZV0gPSBbXTsgLyogIFtQcm9taXNlcy9BKyAyLjIuMi4zLCAyLjIuMy4zXSAgKi9cbiAgdmFyIGZ1bmMgPSBmdW5jdGlvbiBmdW5jKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGhhbmRsZXJzW2ldKHZhbHVlKTtcbiAgICB9IC8qICBbUHJvbWlzZXMvQSsgMi4yLjVdICAqL1xuICB9O1xuXG4gIC8qICBleGVjdXRlIHByb2NlZHVyZSBhc3luY2hyb25vdXNseSAgKi8gLyogIFtQcm9taXNlcy9BKyAyLjIuNCwgMy4xXSAgKi9cbiAgaWYgKHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHNldEltbWVkaWF0ZShmdW5jKTtlbHNlIHNldFRpbWVvdXQoZnVuYywgMCk7XG59O1xuXG4vKiAgZ2VuZXJhdGUgYSByZXNvbHZlciBmdW5jdGlvbiAgKi9cbnZhciByZXNvbHZlciA9IGZ1bmN0aW9uIHJlc29sdmVyKGNiLCBuZXh0LCBtZXRob2QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIC8qICBbUHJvbWlzZXMvQSsgMi4yLjEsIDIuMi43LjMsIDIuMi43LjRdICAqL1xuICAgICAgbmV4dFttZXRob2RdLmNhbGwobmV4dCwgdmFsdWUpOyAvKiAgW1Byb21pc2VzL0ErIDIuMi43LjMsIDIuMi43LjRdICAqL2Vsc2Uge1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGNiKHZhbHVlKTtcbiAgICAgIH0gLyogIFtQcm9taXNlcy9BKyAyLjIuMi4xLCAyLjIuMy4xLCAyLjIuNSwgMy4yXSAgKi8gY2F0Y2ggKGUpIHtcbiAgICAgICAgbmV4dC5yZWplY3QoZSk7IC8qICBbUHJvbWlzZXMvQSsgMi4yLjcuMl0gICovXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUobmV4dCwgcmVzdWx0KTsgLyogIFtQcm9taXNlcy9BKyAyLjIuNy4xXSAgKi9cbiAgICB9XG4gIH07XG59O1xuXG4vKiAgXCJQcm9taXNlIFJlc29sdXRpb24gUHJvY2VkdXJlXCIgICovIC8qICBbUHJvbWlzZXMvQSsgMi4zXSAgKi9cbnZhciByZXNvbHZlID0gZnVuY3Rpb24gcmVzb2x2ZShwcm9taXNlLCB4KSB7XG4gIC8qICBzYW5pdHkgY2hlY2sgYXJndW1lbnRzICAqLyAvKiAgW1Byb21pc2VzL0ErIDIuMy4xXSAgKi9cbiAgaWYgKHByb21pc2UgPT09IHggfHwgcHJvbWlzZS5wcm94eSA9PT0geCkge1xuICAgIHByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ2Nhbm5vdCByZXNvbHZlIHByb21pc2Ugd2l0aCBpdHNlbGYnKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogIHN1cmdpY2FsbHkgY2hlY2sgZm9yIGEgXCJ0aGVuXCIgbWV0aG9kXG4gICAgKG1haW5seSB0byBqdXN0IGNhbGwgdGhlIFwiZ2V0dGVyXCIgb2YgXCJ0aGVuXCIgb25seSBvbmNlKSAgKi9cbiAgdmFyIHRoZW47XG4gIGlmIChfdHlwZW9mKHgpID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsIHx8IHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoZW4gPSB4LnRoZW47XG4gICAgfSAvKiAgW1Byb21pc2VzL0ErIDIuMy4zLjEsIDMuNV0gICovIGNhdGNoIChlKSB7XG4gICAgICBwcm9taXNlLnJlamVjdChlKTsgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4yXSAgKi9cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvKiAgaGFuZGxlIG93biBUaGVuYWJsZXMgICAgW1Byb21pc2VzL0ErIDIuMy4yXVxuICAgIGFuZCBzaW1pbGFyIFwidGhlbmFibGVzXCIgW1Byb21pc2VzL0ErIDIuMy4zXSAgKi9cbiAgaWYgKHR5cGVvZiB0aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHJlc29sdmVkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIC8qICBjYWxsIHJldHJpZXZlZCBcInRoZW5cIiBtZXRob2QgKi8gLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zXSAgKi9cbiAgICAgIHRoZW4uY2FsbCh4LCAvKiAgcmVzb2x2ZVByb21pc2UgICovIC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMy4xXSAgKi9cbiAgICAgIGZ1bmN0aW9uICh5KSB7XG4gICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICByZXNvbHZlZCA9IHRydWU7IC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMy4zXSAgKi9cbiAgICAgICAgaWYgKHkgPT09IHgpIC8qICBbUHJvbWlzZXMvQSsgMy42XSAgKi9cbiAgICAgICAgICBwcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKCdjaXJjdWxhciB0aGVuYWJsZSBjaGFpbicpKTtlbHNlIHJlc29sdmUocHJvbWlzZSwgeSk7XG4gICAgICB9LCAvKiAgcmVqZWN0UHJvbWlzZSAgKi8gLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjJdICAqL1xuICAgICAgZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm47XG4gICAgICAgIHJlc29sdmVkID0gdHJ1ZTsgLyogIFtQcm9taXNlcy9BKyAyLjMuMy4zLjNdICAqL1xuICAgICAgICBwcm9taXNlLnJlamVjdChyKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghcmVzb2x2ZWQpIC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMy4zXSAgKi9cbiAgICAgICAgcHJvbWlzZS5yZWplY3QoZSk7IC8qICBbUHJvbWlzZXMvQSsgMi4zLjMuMy40XSAgKi9cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICAvKiAgaGFuZGxlIG90aGVyIHZhbHVlcyAgKi9cbiAgcHJvbWlzZS5mdWxmaWxsKHgpOyAvKiAgW1Byb21pc2VzL0ErIDIuMy40LCAyLjMuMy40XSAgKi9cbn07XG5cbi8vIHNvIHdlIGFsd2F5cyBoYXZlIFByb21pc2UuYWxsKClcbmFwaS5hbGwgPSBmdW5jdGlvbiAocHMpIHtcbiAgcmV0dXJuIG5ldyBhcGkoZnVuY3Rpb24gKHJlc29sdmVBbGwsIHJlamVjdEFsbCkge1xuICAgIHZhciB2YWxzID0gbmV3IEFycmF5KHBzLmxlbmd0aCk7XG4gICAgdmFyIGRvbmVDb3VudCA9IDA7XG4gICAgdmFyIGZ1bGZpbGwgPSBmdW5jdGlvbiBmdWxmaWxsKGksIHZhbCkge1xuICAgICAgdmFsc1tpXSA9IHZhbDtcbiAgICAgIGRvbmVDb3VudCsrO1xuICAgICAgaWYgKGRvbmVDb3VudCA9PT0gcHMubGVuZ3RoKSB7XG4gICAgICAgIHJlc29sdmVBbGwodmFscyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgdmFyIHAgPSBwc1tpXTtcbiAgICAgICAgdmFyIGlzUHJvbWlzZSA9IHAgIT0gbnVsbCAmJiBwLnRoZW4gIT0gbnVsbDtcbiAgICAgICAgaWYgKGlzUHJvbWlzZSkge1xuICAgICAgICAgIHAudGhlbihmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICBmdWxmaWxsKGksIHZhbCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgcmVqZWN0QWxsKGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHZhbCA9IHA7XG4gICAgICAgICAgZnVsZmlsbChpLCB2YWwpO1xuICAgICAgICB9XG4gICAgICB9KShpKTtcbiAgICB9XG4gIH0pO1xufTtcbmFwaS5yZXNvbHZlID0gZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4gbmV3IGFwaShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgcmVzb2x2ZSh2YWwpO1xuICB9KTtcbn07XG5hcGkucmVqZWN0ID0gZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4gbmV3IGFwaShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgcmVqZWN0KHZhbCk7XG4gIH0pO1xufTtcbnZhciBQcm9taXNlJDEgPSB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgPyBQcm9taXNlIDogYXBpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbnZhciBBbmltYXRpb24gPSBmdW5jdGlvbiBBbmltYXRpb24odGFyZ2V0LCBvcHRzLCBvcHRzMikge1xuICB2YXIgaXNDb3JlID0gY29yZSh0YXJnZXQpO1xuICB2YXIgaXNFbGUgPSAhaXNDb3JlO1xuICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlID0gZXh0ZW5kKHtcbiAgICBkdXJhdGlvbjogMTAwMFxuICB9LCBvcHRzLCBvcHRzMik7XG4gIF9wLnRhcmdldCA9IHRhcmdldDtcbiAgX3Auc3R5bGUgPSBfcC5zdHlsZSB8fCBfcC5jc3M7XG4gIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgX3AucGxheWluZyA9IGZhbHNlO1xuICBfcC5ob29rZWQgPSBmYWxzZTtcbiAgX3AuYXBwbHlpbmcgPSBmYWxzZTtcbiAgX3AucHJvZ3Jlc3MgPSAwO1xuICBfcC5jb21wbGV0ZXMgPSBbXTtcbiAgX3AuZnJhbWVzID0gW107XG4gIGlmIChfcC5jb21wbGV0ZSAmJiBmbiQ2KF9wLmNvbXBsZXRlKSkge1xuICAgIF9wLmNvbXBsZXRlcy5wdXNoKF9wLmNvbXBsZXRlKTtcbiAgfVxuICBpZiAoaXNFbGUpIHtcbiAgICB2YXIgcG9zID0gdGFyZ2V0LnBvc2l0aW9uKCk7XG4gICAgX3Auc3RhcnRQb3NpdGlvbiA9IF9wLnN0YXJ0UG9zaXRpb24gfHwge1xuICAgICAgeDogcG9zLngsXG4gICAgICB5OiBwb3MueVxuICAgIH07XG4gICAgX3Auc3RhcnRTdHlsZSA9IF9wLnN0YXJ0U3R5bGUgfHwgdGFyZ2V0LmN5KCkuc3R5bGUoKS5nZXRBbmltYXRpb25TdGFydFN0eWxlKHRhcmdldCwgX3Auc3R5bGUpO1xuICB9XG4gIGlmIChpc0NvcmUpIHtcbiAgICB2YXIgcGFuID0gdGFyZ2V0LnBhbigpO1xuICAgIF9wLnN0YXJ0UGFuID0ge1xuICAgICAgeDogcGFuLngsXG4gICAgICB5OiBwYW4ueVxuICAgIH07XG4gICAgX3Auc3RhcnRab29tID0gdGFyZ2V0Lnpvb20oKTtcbiAgfVxuXG4gIC8vIGZvciBmdXR1cmUgdGltZWxpbmUvYW5pbWF0aW9ucyBpbXBsXG4gIHRoaXMubGVuZ3RoID0gMTtcbiAgdGhpc1swXSA9IHRoaXM7XG59O1xudmFyIGFuaWZuID0gQW5pbWF0aW9uLnByb3RvdHlwZTtcbmV4dGVuZChhbmlmbiwge1xuICBpbnN0YW5jZVN0cmluZzogZnVuY3Rpb24gaW5zdGFuY2VTdHJpbmcoKSB7XG4gICAgcmV0dXJuICdhbmltYXRpb24nO1xuICB9LFxuICBob29rOiBmdW5jdGlvbiBob29rKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgaWYgKCFfcC5ob29rZWQpIHtcbiAgICAgIC8vIGFkZCB0byB0YXJnZXQncyBhbmltYXRpb24gcXVldWVcbiAgICAgIHZhciBxO1xuICAgICAgdmFyIHRBbmkgPSBfcC50YXJnZXQuX3ByaXZhdGUuYW5pbWF0aW9uO1xuICAgICAgaWYgKF9wLnF1ZXVlKSB7XG4gICAgICAgIHEgPSB0QW5pLnF1ZXVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcSA9IHRBbmkuY3VycmVudDtcbiAgICAgIH1cbiAgICAgIHEucHVzaCh0aGlzKTtcblxuICAgICAgLy8gYWRkIHRvIHRoZSBhbmltYXRpb24gbG9vcCBwb29sXG4gICAgICBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihfcC50YXJnZXQpKSB7XG4gICAgICAgIF9wLnRhcmdldC5jeSgpLmFkZFRvQW5pbWF0aW9uUG9vbChfcC50YXJnZXQpO1xuICAgICAgfVxuICAgICAgX3AuaG9va2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHBsYXk6IGZ1bmN0aW9uIHBsYXkoKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcblxuICAgIC8vIGF1dG9yZXdpbmRcbiAgICBpZiAoX3AucHJvZ3Jlc3MgPT09IDEpIHtcbiAgICAgIF9wLnByb2dyZXNzID0gMDtcbiAgICB9XG4gICAgX3AucGxheWluZyA9IHRydWU7XG4gICAgX3Auc3RhcnRlZCA9IGZhbHNlOyAvLyBuZWVkcyB0byBiZSBzdGFydGVkIGJ5IGFuaW1hdGlvbiBsb29wXG4gICAgX3Auc3RvcHBlZCA9IGZhbHNlO1xuICAgIHRoaXMuaG9vaygpO1xuXG4gICAgLy8gdGhlIGFuaW1hdGlvbiBsb29wIHdpbGwgc3RhcnQgdGhlIGFuaW1hdGlvbi4uLlxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHBsYXlpbmc6IGZ1bmN0aW9uIHBsYXlpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUucGxheWluZztcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgX3AuYXBwbHlpbmcgPSB0cnVlO1xuICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTsgLy8gbmVlZHMgdG8gYmUgc3RhcnRlZCBieSBhbmltYXRpb24gbG9vcFxuICAgIF9wLnN0b3BwZWQgPSBmYWxzZTtcbiAgICB0aGlzLmhvb2soKTtcblxuICAgIC8vIHRoZSBhbmltYXRpb24gbG9vcCB3aWxsIGFwcGx5IHRoZSBhbmltYXRpb24gYXQgdGhpcyBwcm9ncmVzc1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGFwcGx5aW5nOiBmdW5jdGlvbiBhcHBseWluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5hcHBseWluZztcbiAgfSxcbiAgcGF1c2U6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgX3AucGxheWluZyA9IGZhbHNlO1xuICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIF9wLnBsYXlpbmcgPSBmYWxzZTtcbiAgICBfcC5zdGFydGVkID0gZmFsc2U7XG4gICAgX3Auc3RvcHBlZCA9IHRydWU7IC8vIHRvIGJlIHJlbW92ZWQgZnJvbSBhbmltYXRpb24gcXVldWVzXG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmV3aW5kOiBmdW5jdGlvbiByZXdpbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3MoMCk7XG4gIH0sXG4gIGZhc3Rmb3J3YXJkOiBmdW5jdGlvbiBmYXN0Zm9yd2FyZCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmVzcygxKTtcbiAgfSxcbiAgdGltZTogZnVuY3Rpb24gdGltZSh0KSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gX3AucHJvZ3Jlc3MgKiBfcC5kdXJhdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3ModCAvIF9wLmR1cmF0aW9uKTtcbiAgICB9XG4gIH0sXG4gIHByb2dyZXNzOiBmdW5jdGlvbiBwcm9ncmVzcyhwKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgd2FzUGxheWluZyA9IF9wLnBsYXlpbmc7XG4gICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIF9wLnByb2dyZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgICB9XG4gICAgICBfcC5wcm9ncmVzcyA9IHA7XG4gICAgICBfcC5zdGFydGVkID0gZmFsc2U7XG4gICAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgICB0aGlzLnBsYXkoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGNvbXBsZXRlZDogZnVuY3Rpb24gY29tcGxldGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnByb2dyZXNzID09PSAxO1xuICB9LFxuICByZXZlcnNlOiBmdW5jdGlvbiByZXZlcnNlKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgdmFyIHdhc1BsYXlpbmcgPSBfcC5wbGF5aW5nO1xuICAgIGlmICh3YXNQbGF5aW5nKSB7XG4gICAgICB0aGlzLnBhdXNlKCk7XG4gICAgfVxuICAgIF9wLnByb2dyZXNzID0gMSAtIF9wLnByb2dyZXNzO1xuICAgIF9wLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB2YXIgc3dhcCA9IGZ1bmN0aW9uIHN3YXAoYSwgYikge1xuICAgICAgdmFyIF9wYSA9IF9wW2FdO1xuICAgICAgaWYgKF9wYSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIF9wW2FdID0gX3BbYl07XG4gICAgICBfcFtiXSA9IF9wYTtcbiAgICB9O1xuICAgIHN3YXAoJ3pvb20nLCAnc3RhcnRab29tJyk7XG4gICAgc3dhcCgncGFuJywgJ3N0YXJ0UGFuJyk7XG4gICAgc3dhcCgncG9zaXRpb24nLCAnc3RhcnRQb3NpdGlvbicpO1xuXG4gICAgLy8gc3dhcCBzdHlsZXNcbiAgICBpZiAoX3Auc3R5bGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3Auc3R5bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHByb3AgPSBfcC5zdHlsZVtpXTtcbiAgICAgICAgdmFyIG5hbWUgPSBwcm9wLm5hbWU7XG4gICAgICAgIHZhciBzdGFydFN0eWxlUHJvcCA9IF9wLnN0YXJ0U3R5bGVbbmFtZV07XG4gICAgICAgIF9wLnN0YXJ0U3R5bGVbbmFtZV0gPSBwcm9wO1xuICAgICAgICBfcC5zdHlsZVtpXSA9IHN0YXJ0U3R5bGVQcm9wO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgdGhpcy5wbGF5KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBwcm9taXNlOiBmdW5jdGlvbiBwcm9taXNlKHR5cGUpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciBhcnI7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdmcmFtZSc6XG4gICAgICAgIGFyciA9IF9wLmZyYW1lcztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgY2FzZSAnY29tcGxldGUnOlxuICAgICAgY2FzZSAnY29tcGxldGVkJzpcbiAgICAgICAgYXJyID0gX3AuY29tcGxldGVzO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBhcnIucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59KTtcbmFuaWZuLmNvbXBsZXRlID0gYW5pZm4uY29tcGxldGVkO1xuYW5pZm4ucnVuID0gYW5pZm4ucGxheTtcbmFuaWZuLnJ1bm5pbmcgPSBhbmlmbi5wbGF5aW5nO1xuXG52YXIgZGVmaW5lJDMgPSB7XG4gIGFuaW1hdGVkOiBmdW5jdGlvbiBhbmltYXRlZCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gYW5pbWF0ZWRJbXBsKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlbGZJc0FycmF5TGlrZSA9IHNlbGYubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgYWxsID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZiA6IFtzZWxmXTsgLy8gcHV0IGluIGFycmF5IGlmIG5vdCBhcnJheS1saWtlXG4gICAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5IHx8IHRoaXM7XG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBlbGUgPSBhbGxbMF07XG4gICAgICBpZiAoZWxlKSB7XG4gICAgICAgIHJldHVybiBlbGUuX3ByaXZhdGUuYW5pbWF0aW9uLmN1cnJlbnQubGVuZ3RoID4gMDtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICAvLyBhbmltYXRlZFxuXG4gIGNsZWFyUXVldWU6IGZ1bmN0aW9uIGNsZWFyUXVldWUoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGNsZWFyUXVldWVJbXBsKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlbGZJc0FycmF5TGlrZSA9IHNlbGYubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgYWxsID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZiA6IFtzZWxmXTsgLy8gcHV0IGluIGFycmF5IGlmIG5vdCBhcnJheS1saWtlXG4gICAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5IHx8IHRoaXM7XG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGFsbFtpXTtcbiAgICAgICAgZWxlLl9wcml2YXRlLmFuaW1hdGlvbi5xdWV1ZSA9IFtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfSxcbiAgLy8gY2xlYXJRdWV1ZVxuXG4gIGRlbGF5OiBmdW5jdGlvbiBkZWxheSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gZGVsYXlJbXBsKHRpbWUsIGNvbXBsZXRlKSB7XG4gICAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5IHx8IHRoaXM7XG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0ZSh7XG4gICAgICAgIGRlbGF5OiB0aW1lLFxuICAgICAgICBkdXJhdGlvbjogdGltZSxcbiAgICAgICAgY29tcGxldGU6IGNvbXBsZXRlXG4gICAgICB9KTtcbiAgICB9O1xuICB9LFxuICAvLyBkZWxheVxuXG4gIGRlbGF5QW5pbWF0aW9uOiBmdW5jdGlvbiBkZWxheUFuaW1hdGlvbigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gZGVsYXlBbmltYXRpb25JbXBsKHRpbWUsIGNvbXBsZXRlKSB7XG4gICAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5IHx8IHRoaXM7XG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0aW9uKHtcbiAgICAgICAgZGVsYXk6IHRpbWUsXG4gICAgICAgIGR1cmF0aW9uOiB0aW1lLFxuICAgICAgICBjb21wbGV0ZTogY29tcGxldGVcbiAgICAgIH0pO1xuICAgIH07XG4gIH0sXG4gIC8vIGRlbGF5XG5cbiAgYW5pbWF0aW9uOiBmdW5jdGlvbiBhbmltYXRpb24oKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGFuaW1hdGlvbkltcGwocHJvcGVydGllcywgcGFyYW1zKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIHZhciBpc0NvcmUgPSAhc2VsZklzQXJyYXlMaWtlO1xuICAgICAgdmFyIGlzRWxlcyA9ICFpc0NvcmU7XG4gICAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgICAgIHByb3BlcnRpZXMgPSBleHRlbmQoe30sIHByb3BlcnRpZXMsIHBhcmFtcyk7XG4gICAgICB2YXIgcHJvcGVydGllc0VtcHR5ID0gT2JqZWN0LmtleXMocHJvcGVydGllcykubGVuZ3RoID09PSAwO1xuICAgICAgaWYgKHByb3BlcnRpZXNFbXB0eSkge1xuICAgICAgICByZXR1cm4gbmV3IEFuaW1hdGlvbihhbGxbMF0sIHByb3BlcnRpZXMpOyAvLyBub3RoaW5nIHRvIGFuaW1hdGVcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BlcnRpZXMuZHVyYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wZXJ0aWVzLmR1cmF0aW9uID0gNDAwO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChwcm9wZXJ0aWVzLmR1cmF0aW9uKSB7XG4gICAgICAgIGNhc2UgJ3Nsb3cnOlxuICAgICAgICAgIHByb3BlcnRpZXMuZHVyYXRpb24gPSA2MDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Zhc3QnOlxuICAgICAgICAgIHByb3BlcnRpZXMuZHVyYXRpb24gPSAyMDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaXNFbGVzKSB7XG4gICAgICAgIHByb3BlcnRpZXMuc3R5bGUgPSBzdHlsZS5nZXRQcm9wc0xpc3QocHJvcGVydGllcy5zdHlsZSB8fCBwcm9wZXJ0aWVzLmNzcyk7XG4gICAgICAgIHByb3BlcnRpZXMuY3NzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKGlzRWxlcyAmJiBwcm9wZXJ0aWVzLnJlbmRlcmVkUG9zaXRpb24gIT0gbnVsbCkge1xuICAgICAgICB2YXIgcnBvcyA9IHByb3BlcnRpZXMucmVuZGVyZWRQb3NpdGlvbjtcbiAgICAgICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgICAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICAgICAgcHJvcGVydGllcy5wb3NpdGlvbiA9IHJlbmRlcmVkVG9Nb2RlbFBvc2l0aW9uKHJwb3MsIHpvb20sIHBhbik7XG4gICAgICB9XG5cbiAgICAgIC8vIG92ZXJyaWRlIHBhbiB3LyBwYW5CeSBpZiBzZXRcbiAgICAgIGlmIChpc0NvcmUgJiYgcHJvcGVydGllcy5wYW5CeSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBwYW5CeSA9IHByb3BlcnRpZXMucGFuQnk7XG4gICAgICAgIHZhciBjeVBhbiA9IGN5LnBhbigpO1xuICAgICAgICBwcm9wZXJ0aWVzLnBhbiA9IHtcbiAgICAgICAgICB4OiBjeVBhbi54ICsgcGFuQnkueCxcbiAgICAgICAgICB5OiBjeVBhbi55ICsgcGFuQnkueVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBvdmVycmlkZSBwYW4gdy8gY2VudGVyIGlmIHNldFxuICAgICAgdmFyIGNlbnRlciA9IHByb3BlcnRpZXMuY2VudGVyIHx8IHByb3BlcnRpZXMuY2VudHJlO1xuICAgICAgaWYgKGlzQ29yZSAmJiBjZW50ZXIgIT0gbnVsbCkge1xuICAgICAgICB2YXIgY2VudGVyUGFuID0gY3kuZ2V0Q2VudGVyUGFuKGNlbnRlci5lbGVzLCBwcm9wZXJ0aWVzLnpvb20pO1xuICAgICAgICBpZiAoY2VudGVyUGFuICE9IG51bGwpIHtcbiAgICAgICAgICBwcm9wZXJ0aWVzLnBhbiA9IGNlbnRlclBhbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBvdmVycmlkZSBwYW4gJiB6b29tIHcvIGZpdCBpZiBzZXRcbiAgICAgIGlmIChpc0NvcmUgJiYgcHJvcGVydGllcy5maXQgIT0gbnVsbCkge1xuICAgICAgICB2YXIgZml0ID0gcHJvcGVydGllcy5maXQ7XG4gICAgICAgIHZhciBmaXRWcCA9IGN5LmdldEZpdFZpZXdwb3J0KGZpdC5lbGVzIHx8IGZpdC5ib3VuZGluZ0JveCwgZml0LnBhZGRpbmcpO1xuICAgICAgICBpZiAoZml0VnAgIT0gbnVsbCkge1xuICAgICAgICAgIHByb3BlcnRpZXMucGFuID0gZml0VnAucGFuO1xuICAgICAgICAgIHByb3BlcnRpZXMuem9vbSA9IGZpdFZwLnpvb207XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gb3ZlcnJpZGUgem9vbSAoJiBwb3RlbnRpYWxseSBwYW4pIHcvIHpvb20gb2JqIGlmIHNldFxuICAgICAgaWYgKGlzQ29yZSAmJiBwbGFpbk9iamVjdChwcm9wZXJ0aWVzLnpvb20pKSB7XG4gICAgICAgIHZhciB2cCA9IGN5LmdldFpvb21lZFZpZXdwb3J0KHByb3BlcnRpZXMuem9vbSk7XG4gICAgICAgIGlmICh2cCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHZwLnpvb21lZCkge1xuICAgICAgICAgICAgcHJvcGVydGllcy56b29tID0gdnAuem9vbTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZwLnBhbm5lZCkge1xuICAgICAgICAgICAgcHJvcGVydGllcy5wYW4gPSB2cC5wYW47XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BlcnRpZXMuem9vbSA9IG51bGw7IC8vIGFuIGluYXZhbGlkIHpvb20gKGUuZy4gbm8gZGVsdGEpIGdldHMgYXV0b21hdGljYWxseSBkZXN0cm95ZWRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEFuaW1hdGlvbihhbGxbMF0sIHByb3BlcnRpZXMpO1xuICAgIH07XG4gIH0sXG4gIC8vIGFuaW1hdGVcblxuICBhbmltYXRlOiBmdW5jdGlvbiBhbmltYXRlKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBhbmltYXRlSW1wbChwcm9wZXJ0aWVzLCBwYXJhbXMpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzZWxmSXNBcnJheUxpa2UgPSBzZWxmLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGFsbCA9IHNlbGZJc0FycmF5TGlrZSA/IHNlbGYgOiBbc2VsZl07IC8vIHB1dCBpbiBhcnJheSBpZiBub3QgYXJyYXktbGlrZVxuICAgICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeSB8fCB0aGlzO1xuICAgICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgcHJvcGVydGllcyA9IGV4dGVuZCh7fSwgcHJvcGVydGllcywgcGFyYW1zKTtcbiAgICAgIH1cblxuICAgICAgLy8gbWFudWFsbHkgaG9vayBhbmQgcnVuIHRoZSBhbmltYXRpb25cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBhbGxbaV07XG4gICAgICAgIHZhciBxdWV1ZSA9IGVsZS5hbmltYXRlZCgpICYmIChwcm9wZXJ0aWVzLnF1ZXVlID09PSB1bmRlZmluZWQgfHwgcHJvcGVydGllcy5xdWV1ZSk7XG4gICAgICAgIHZhciBhbmkgPSBlbGUuYW5pbWF0aW9uKHByb3BlcnRpZXMsIHF1ZXVlID8ge1xuICAgICAgICAgIHF1ZXVlOiB0cnVlXG4gICAgICAgIH0gOiB1bmRlZmluZWQpO1xuICAgICAgICBhbmkucGxheSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gICAgfTtcbiAgfSxcblxuICAvLyBhbmltYXRlXG5cbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gc3RvcEltcGwoY2xlYXJRdWV1ZSwganVtcFRvRW5kKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZklzQXJyYXlMaWtlID0gc2VsZi5sZW5ndGggIT09IHVuZGVmaW5lZDtcbiAgICAgIHZhciBhbGwgPSBzZWxmSXNBcnJheUxpa2UgPyBzZWxmIDogW3NlbGZdOyAvLyBwdXQgaW4gYXJyYXkgaWYgbm90IGFycmF5LWxpa2VcbiAgICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3kgfHwgdGhpcztcbiAgICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gYWxsW2ldO1xuICAgICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICAgIHZhciBhbmlzID0gX3AuYW5pbWF0aW9uLmN1cnJlbnQ7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYW5pcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHZhciBhbmkgPSBhbmlzW2pdO1xuICAgICAgICAgIHZhciBhbmlfcCA9IGFuaS5fcHJpdmF0ZTtcbiAgICAgICAgICBpZiAoanVtcFRvRW5kKSB7XG4gICAgICAgICAgICAvLyBuZXh0IGl0ZXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGxvb3AsIHRoZSBhbmltYXRpb25cbiAgICAgICAgICAgIC8vIHdpbGwgZ28gc3RyYWlnaHQgdG8gdGhlIGVuZCBhbmQgYmUgcmVtb3ZlZFxuICAgICAgICAgICAgYW5pX3AuZHVyYXRpb24gPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNsZWFyIHRoZSBxdWV1ZSBvZiBmdXR1cmUgYW5pbWF0aW9uc1xuICAgICAgICBpZiAoY2xlYXJRdWV1ZSkge1xuICAgICAgICAgIF9wLmFuaW1hdGlvbi5xdWV1ZSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghanVtcFRvRW5kKSB7XG4gICAgICAgICAgX3AuYW5pbWF0aW9uLmN1cnJlbnQgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyB3ZSBoYXZlIHRvIG5vdGlmeSAodGhlIGFuaW1hdGlvbiBsb29wIGRvZXNuJ3QgZG8gaXQgZm9yIHVzIG9uIGBzdG9wYClcbiAgICAgIGN5Lm5vdGlmeSgnZHJhdycpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfSAvLyBzdG9wXG59OyAvLyBkZWZpbmVcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbnZhciBpc0FycmF5XzEgPSBpc0FycmF5O1xuXG4vKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVJc0RlZXBQcm9wID0gL1xcLnxcXFsoPzpbXltcXF1dKnwoW1wiJ10pKD86KD8hXFwxKVteXFxcXF18XFxcXC4pKj9cXDEpXFxdLyxcbiAgICByZUlzUGxhaW5Qcm9wID0gL15cXHcqJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lIGFuZCBub3QgYSBwcm9wZXJ0eSBwYXRoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkge1xuICBpZiAoaXNBcnJheV8xKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgdmFsdWUgPT0gbnVsbCB8fCBpc1N5bWJvbF8xKHZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpIHx8ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcbiAgICAob2JqZWN0ICE9IG51bGwgJiYgdmFsdWUgaW4gT2JqZWN0KG9iamVjdCkpO1xufVxuXG52YXIgX2lzS2V5ID0gaXNLZXk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhc3luY1RhZyA9ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHByb3h5VGFnID0gJ1tvYmplY3QgUHJveHldJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdF8xKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBfYmFzZUdldFRhZyh2YWx1ZSk7XG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG59XG5cbnZhciBpc0Z1bmN0aW9uXzEgPSBpc0Z1bmN0aW9uO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG52YXIgY29yZUpzRGF0YSA9IF9yb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxudmFyIF9jb3JlSnNEYXRhID0gY29yZUpzRGF0YTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbnZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhfY29yZUpzRGF0YSAmJiBfY29yZUpzRGF0YS5rZXlzICYmIF9jb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG59KCkpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcbiAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbn1cblxudmFyIF9pc01hc2tlZCA9IGlzTWFza2VkO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvJDEgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmckMSA9IGZ1bmNQcm90byQxLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmckMS5jYWxsKGZ1bmMpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoZnVuYyArICcnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG4gIHJldHVybiAnJztcbn1cblxudmFyIF90b1NvdXJjZSA9IHRvU291cmNlO1xuXG4vKipcbiAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICovXG52YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG52YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byQzID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkkMyA9IG9iamVjdFByb3RvJDMuaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG52YXIgcmVJc05hdGl2ZSA9IFJlZ0V4cCgnXicgK1xuICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSQzKS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJ1xuKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdF8xKHZhbHVlKSB8fCBfaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbl8xKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gIHJldHVybiBwYXR0ZXJuLnRlc3QoX3RvU291cmNlKHZhbHVlKSk7XG59XG5cbnZhciBfYmFzZUlzTmF0aXZlID0gYmFzZUlzTmF0aXZlO1xuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZSQxKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xufVxuXG52YXIgX2dldFZhbHVlID0gZ2V0VmFsdWUkMTtcblxuLyoqXG4gKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBpZiBpdCdzIG5hdGl2ZSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gIHZhciB2YWx1ZSA9IF9nZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gIHJldHVybiBfYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG52YXIgX2dldE5hdGl2ZSA9IGdldE5hdGl2ZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIG5hdGl2ZUNyZWF0ZSA9IF9nZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XG5cbnZhciBfbmF0aXZlQ3JlYXRlID0gbmF0aXZlQ3JlYXRlO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgSGFzaFxuICovXG5mdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBfbmF0aXZlQ3JlYXRlID8gX25hdGl2ZUNyZWF0ZShudWxsKSA6IHt9O1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG52YXIgX2hhc2hDbGVhciA9IGhhc2hDbGVhcjtcblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIF9oYXNoRGVsZXRlID0gaGFzaERlbGV0ZTtcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEJDEgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byQyID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkkMiA9IG9iamVjdFByb3RvJDIuaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogR2V0cyB0aGUgaGFzaCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIGlmIChfbmF0aXZlQ3JlYXRlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5XTtcbiAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCQxID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICB9XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eSQyLmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxudmFyIF9oYXNoR2V0ID0gaGFzaEdldDtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvJDEgPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSQxID0gb2JqZWN0UHJvdG8kMS5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHJldHVybiBfbmF0aXZlQ3JlYXRlID8gKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkKSA6IGhhc093blByb3BlcnR5JDEuY2FsbChkYXRhLCBrZXkpO1xufVxuXG52YXIgX2hhc2hIYXMgPSBoYXNoSGFzO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKlxuICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHRoaXMuc2l6ZSArPSB0aGlzLmhhcyhrZXkpID8gMCA6IDE7XG4gIGRhdGFba2V5XSA9IChfbmF0aXZlQ3JlYXRlICYmIHZhbHVlID09PSB1bmRlZmluZWQpID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbnZhciBfaGFzaFNldCA9IGhhc2hTZXQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBfaGFzaENsZWFyO1xuSGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddID0gX2hhc2hEZWxldGU7XG5IYXNoLnByb3RvdHlwZS5nZXQgPSBfaGFzaEdldDtcbkhhc2gucHJvdG90eXBlLmhhcyA9IF9oYXNoSGFzO1xuSGFzaC5wcm90b3R5cGUuc2V0ID0gX2hhc2hTZXQ7XG5cbnZhciBfSGFzaCA9IEhhc2g7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxudmFyIF9saXN0Q2FjaGVDbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xuXG4vKipcbiAqIFBlcmZvcm1zIGFcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gKlxuICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcSgnYScsICdhJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcShOYU4sIE5hTik7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPT09IG90aGVyIHx8ICh2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyKTtcbn1cblxudmFyIGVxXzEgPSBlcTtcblxuLyoqXG4gKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSBrZXkgVGhlIGtleSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LCBrZXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgaWYgKGVxXzEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xuICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG52YXIgX2Fzc29jSW5kZXhPZiA9IGFzc29jSW5kZXhPZjtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gX2Fzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgaWYgKGluZGV4ID09IGxhc3RJbmRleCkge1xuICAgIGRhdGEucG9wKCk7XG4gIH0gZWxzZSB7XG4gICAgc3BsaWNlLmNhbGwoZGF0YSwgaW5kZXgsIDEpO1xuICB9XG4gIC0tdGhpcy5zaXplO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxudmFyIF9saXN0Q2FjaGVEZWxldGUgPSBsaXN0Q2FjaGVEZWxldGU7XG5cbi8qKlxuICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBfYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IGRhdGFbaW5kZXhdWzFdO1xufVxuXG52YXIgX2xpc3RDYWNoZUdldCA9IGxpc3RDYWNoZUdldDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIF9hc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXywga2V5KSA+IC0xO1xufVxuXG52YXIgX2xpc3RDYWNoZUhhcyA9IGxpc3RDYWNoZUhhcztcblxuLyoqXG4gKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IF9hc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgKyt0aGlzLnNpemU7XG4gICAgZGF0YS5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0gZWxzZSB7XG4gICAgZGF0YVtpbmRleF1bMV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxudmFyIF9saXN0Q2FjaGVTZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG5MaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gX2xpc3RDYWNoZUNsZWFyO1xuTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBfbGlzdENhY2hlRGVsZXRlO1xuTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBfbGlzdENhY2hlR2V0O1xuTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBfbGlzdENhY2hlSGFzO1xuTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBfbGlzdENhY2hlU2V0O1xuXG52YXIgX0xpc3RDYWNoZSA9IExpc3RDYWNoZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIE1hcCQxID0gX2dldE5hdGl2ZShfcm9vdCwgJ01hcCcpO1xuXG52YXIgX01hcCA9IE1hcCQxO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkge1xuICB0aGlzLnNpemUgPSAwO1xuICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICdoYXNoJzogbmV3IF9IYXNoLFxuICAgICdtYXAnOiBuZXcgKF9NYXAgfHwgX0xpc3RDYWNoZSksXG4gICAgJ3N0cmluZyc6IG5ldyBfSGFzaFxuICB9O1xufVxuXG52YXIgX21hcENhY2hlQ2xlYXIgPSBtYXBDYWNoZUNsZWFyO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgdW5pcXVlIG9iamVjdCBrZXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuICAgID8gKHZhbHVlICE9PSAnX19wcm90b19fJylcbiAgICA6ICh2YWx1ZSA9PT0gbnVsbCk7XG59XG5cbnZhciBfaXNLZXlhYmxlID0gaXNLZXlhYmxlO1xuXG4vKipcbiAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hcCBkYXRhLlxuICovXG5mdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XG4gIHZhciBkYXRhID0gbWFwLl9fZGF0YV9fO1xuICByZXR1cm4gX2lzS2V5YWJsZShrZXkpXG4gICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICA6IGRhdGEubWFwO1xufVxuXG52YXIgX2dldE1hcERhdGEgPSBnZXRNYXBEYXRhO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSBfZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbnZhciBfbWFwQ2FjaGVEZWxldGUgPSBtYXBDYWNoZURlbGV0ZTtcblxuLyoqXG4gKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuICByZXR1cm4gX2dldE1hcERhdGEodGhpcywga2V5KS5nZXQoa2V5KTtcbn1cblxudmFyIF9tYXBDYWNoZUdldCA9IG1hcENhY2hlR2V0O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gX2dldE1hcERhdGEodGhpcywga2V5KS5oYXMoa2V5KTtcbn1cblxudmFyIF9tYXBDYWNoZUhhcyA9IG1hcENhY2hlSGFzO1xuXG4vKipcbiAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSBfZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLFxuICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgdGhpcy5zaXplICs9IGRhdGEuc2l6ZSA9PSBzaXplID8gMCA6IDE7XG4gIHJldHVybiB0aGlzO1xufVxuXG52YXIgX21hcENhY2hlU2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hcCBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBNYXBDYWNoZWAuXG5NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBfbWFwQ2FjaGVDbGVhcjtcbk1hcENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBfbWFwQ2FjaGVEZWxldGU7XG5NYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gX21hcENhY2hlR2V0O1xuTWFwQ2FjaGUucHJvdG90eXBlLmhhcyA9IF9tYXBDYWNoZUhhcztcbk1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBfbWFwQ2FjaGVTZXQ7XG5cbnZhciBfTWFwQ2FjaGUgPSBNYXBDYWNoZTtcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBtZW1vaXplcyB0aGUgcmVzdWx0IG9mIGBmdW5jYC4gSWYgYHJlc29sdmVyYCBpc1xuICogcHJvdmlkZWQsIGl0IGRldGVybWluZXMgdGhlIGNhY2hlIGtleSBmb3Igc3RvcmluZyB0aGUgcmVzdWx0IGJhc2VkIG9uIHRoZVxuICogYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGFyZ3VtZW50XG4gKiBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgbWFwIGNhY2hlIGtleS4gVGhlIGBmdW5jYFxuICogaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKlxuICogKipOb3RlOioqIFRoZSBjYWNoZSBpcyBleHBvc2VkIGFzIHRoZSBgY2FjaGVgIHByb3BlcnR5IG9uIHRoZSBtZW1vaXplZFxuICogZnVuY3Rpb24uIEl0cyBjcmVhdGlvbiBtYXkgYmUgY3VzdG9taXplZCBieSByZXBsYWNpbmcgdGhlIGBfLm1lbW9pemUuQ2FjaGVgXG4gKiBjb25zdHJ1Y3RvciB3aXRoIG9uZSB3aG9zZSBpbnN0YW5jZXMgaW1wbGVtZW50IHRoZVxuICogW2BNYXBgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1tYXAtcHJvdG90eXBlLW9iamVjdClcbiAqIG1ldGhvZCBpbnRlcmZhY2Ugb2YgYGNsZWFyYCwgYGRlbGV0ZWAsIGBnZXRgLCBgaGFzYCwgYW5kIGBzZXRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdjJzogMywgJ2QnOiA0IH07XG4gKlxuICogdmFyIHZhbHVlcyA9IF8ubWVtb2l6ZShfLnZhbHVlcyk7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsxLCAyXVxuICpcbiAqIHZhbHVlcyhvdGhlcik7XG4gKiAvLyA9PiBbMywgNF1cbiAqXG4gKiBvYmplY3QuYSA9IDI7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsxLCAyXVxuICpcbiAqIC8vIE1vZGlmeSB0aGUgcmVzdWx0IGNhY2hlLlxuICogdmFsdWVzLmNhY2hlLnNldChvYmplY3QsIFsnYScsICdiJ10pO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbJ2EnLCAnYiddXG4gKlxuICogLy8gUmVwbGFjZSBgXy5tZW1vaXplLkNhY2hlYC5cbiAqIF8ubWVtb2l6ZS5DYWNoZSA9IFdlYWtNYXA7XG4gKi9cbmZ1bmN0aW9uIG1lbW9pemUoZnVuYywgcmVzb2x2ZXIpIHtcbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicgfHwgKHJlc29sdmVyICE9IG51bGwgJiYgdHlwZW9mIHJlc29sdmVyICE9ICdmdW5jdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBrZXkgPSByZXNvbHZlciA/IHJlc29sdmVyLmFwcGx5KHRoaXMsIGFyZ3MpIDogYXJnc1swXSxcbiAgICAgICAgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcblxuICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXkpO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBtZW1vaXplZC5jYWNoZSA9IGNhY2hlLnNldChrZXksIHJlc3VsdCkgfHwgY2FjaGU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgbWVtb2l6ZWQuY2FjaGUgPSBuZXcgKG1lbW9pemUuQ2FjaGUgfHwgX01hcENhY2hlKTtcbiAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG4vLyBFeHBvc2UgYE1hcENhY2hlYC5cbm1lbW9pemUuQ2FjaGUgPSBfTWFwQ2FjaGU7XG5cbnZhciBtZW1vaXplXzEgPSBtZW1vaXplO1xuXG4vKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG52YXIgTUFYX01FTU9JWkVfU0laRSA9IDUwMDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gKiBjYWNoZSB3aGVuIGl0IGV4Y2VlZHMgYE1BWF9NRU1PSVpFX1NJWkVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZUNhcHBlZChmdW5jKSB7XG4gIHZhciByZXN1bHQgPSBtZW1vaXplXzEoZnVuYywgZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKGNhY2hlLnNpemUgPT09IE1BWF9NRU1PSVpFX1NJWkUpIHtcbiAgICAgIGNhY2hlLmNsZWFyKCk7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH0pO1xuXG4gIHZhciBjYWNoZSA9IHJlc3VsdC5jYWNoZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIF9tZW1vaXplQ2FwcGVkID0gbWVtb2l6ZUNhcHBlZDtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlUHJvcE5hbWUgPSAvW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2c7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBfbWVtb2l6ZUNhcHBlZChmdW5jdGlvbihzdHJpbmcpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpZiAoc3RyaW5nLmNoYXJDb2RlQXQoMCkgPT09IDQ2IC8qIC4gKi8pIHtcbiAgICByZXN1bHQucHVzaCgnJyk7XG4gIH1cbiAgc3RyaW5nLnJlcGxhY2UocmVQcm9wTmFtZSwgZnVuY3Rpb24obWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuICAgIHJlc3VsdC5wdXNoKHF1b3RlID8gc3ViU3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCAnJDEnKSA6IChudW1iZXIgfHwgbWF0Y2gpKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxudmFyIF9zdHJpbmdUb1BhdGggPSBzdHJpbmdUb1BhdGg7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbnZhciBfYXJyYXlNYXAgPSBhcnJheU1hcDtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkkMSA9IDEgLyAwO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbnZhciBzeW1ib2xQcm90byA9IF9TeW1ib2wgPyBfU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udG9TdHJpbmcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gIC8vIEV4aXQgZWFybHkgZm9yIHN0cmluZ3MgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSBoaXQgaW4gc29tZSBlbnZpcm9ubWVudHMuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzQXJyYXlfMSh2YWx1ZSkpIHtcbiAgICAvLyBSZWN1cnNpdmVseSBjb252ZXJ0IHZhbHVlcyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIHJldHVybiBfYXJyYXlNYXAodmFsdWUsIGJhc2VUb1N0cmluZykgKyAnJztcbiAgfVxuICBpZiAoaXNTeW1ib2xfMSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkkMSkgPyAnLTAnIDogcmVzdWx0O1xufVxuXG52YXIgX2Jhc2VUb1N0cmluZyA9IGJhc2VUb1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nLiBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgZm9yIGBudWxsYFxuICogYW5kIGB1bmRlZmluZWRgIHZhbHVlcy4gVGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvU3RyaW5nKG51bGwpO1xuICogLy8gPT4gJydcbiAqXG4gKiBfLnRvU3RyaW5nKC0wKTtcbiAqIC8vID0+ICctMCdcbiAqXG4gKiBfLnRvU3RyaW5nKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiAnMSwyLDMnXG4gKi9cbmZ1bmN0aW9uIHRvU3RyaW5nJDEodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IF9iYXNlVG9TdHJpbmcodmFsdWUpO1xufVxuXG52YXIgdG9TdHJpbmdfMSA9IHRvU3RyaW5nJDE7XG5cbi8qKlxuICogQ2FzdHMgYHZhbHVlYCB0byBhIHBhdGggYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICovXG5mdW5jdGlvbiBjYXN0UGF0aCh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5XzEodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBfaXNLZXkodmFsdWUsIG9iamVjdCkgPyBbdmFsdWVdIDogX3N0cmluZ1RvUGF0aCh0b1N0cmluZ18xKHZhbHVlKSk7XG59XG5cbnZhciBfY2FzdFBhdGggPSBjYXN0UGF0aDtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGtleSBpZiBpdCdzIG5vdCBhIHN0cmluZyBvciBzeW1ib2wuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICovXG5mdW5jdGlvbiB0b0tleSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sXzEodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxudmFyIF90b0tleSA9IHRvS2V5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHBhdGgpIHtcbiAgcGF0aCA9IF9jYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IDAsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICB3aGlsZSAob2JqZWN0ICE9IG51bGwgJiYgaW5kZXggPCBsZW5ndGgpIHtcbiAgICBvYmplY3QgPSBvYmplY3RbX3RvS2V5KHBhdGhbaW5kZXgrK10pXTtcbiAgfVxuICByZXR1cm4gKGluZGV4ICYmIGluZGV4ID09IGxlbmd0aCkgPyBvYmplY3QgOiB1bmRlZmluZWQ7XG59XG5cbnZhciBfYmFzZUdldCA9IGJhc2VHZXQ7XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXNcbiAqIGB1bmRlZmluZWRgLCB0aGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaW4gaXRzIHBsYWNlLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy43LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgJ2FbMF0uYi5jJyk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5nZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5nZXQob2JqZWN0LCAnYS5iLmMnLCAnZGVmYXVsdCcpO1xuICogLy8gPT4gJ2RlZmF1bHQnXG4gKi9cbmZ1bmN0aW9uIGdldChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBfYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG59XG5cbnZhciBnZXRfMSA9IGdldDtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIHZhciBmdW5jID0gX2dldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpO1xuICAgIGZ1bmMoe30sICcnLCB7fSk7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG52YXIgX2RlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGFzc2lnblZhbHVlYCBhbmQgYGFzc2lnbk1lcmdlVmFsdWVgIHdpdGhvdXRcbiAqIHZhbHVlIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgPT0gJ19fcHJvdG9fXycgJiYgX2RlZmluZVByb3BlcnR5KSB7XG4gICAgX2RlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7XG4gICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICdlbnVtZXJhYmxlJzogdHJ1ZSxcbiAgICAgICd2YWx1ZSc6IHZhbHVlLFxuICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIH1cbn1cblxudmFyIF9iYXNlQXNzaWduVmFsdWUgPSBiYXNlQXNzaWduVmFsdWU7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQXNzaWducyBgdmFsdWVgIHRvIGBrZXlgIG9mIGBvYmplY3RgIGlmIHRoZSBleGlzdGluZyB2YWx1ZSBpcyBub3QgZXF1aXZhbGVudFxuICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV07XG4gIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxXzEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgX2Jhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICB9XG59XG5cbnZhciBfYXNzaWduVmFsdWUgPSBhc3NpZ25WYWx1ZTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGUgPT0gJ251bWJlcicgfHxcbiAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG52YXIgX2lzSW5kZXggPSBpc0luZGV4O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNldGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikge1xuICBpZiAoIWlzT2JqZWN0XzEob2JqZWN0KSkge1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cbiAgcGF0aCA9IF9jYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxLFxuICAgICAgbmVzdGVkID0gb2JqZWN0O1xuXG4gIHdoaWxlIChuZXN0ZWQgIT0gbnVsbCAmJiArK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IF90b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJyB8fCBrZXkgPT09ICdjb25zdHJ1Y3RvcicgfHwga2V5ID09PSAncHJvdG90eXBlJykge1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggIT0gbGFzdEluZGV4KSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3RfMShvYmpWYWx1ZSlcbiAgICAgICAgICA/IG9ialZhbHVlXG4gICAgICAgICAgOiAoX2lzSW5kZXgocGF0aFtpbmRleCArIDFdKSA/IFtdIDoge30pO1xuICAgICAgfVxuICAgIH1cbiAgICBfYXNzaWduVmFsdWUobmVzdGVkLCBrZXksIG5ld1ZhbHVlKTtcbiAgICBuZXN0ZWQgPSBuZXN0ZWRba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG52YXIgX2Jhc2VTZXQgPSBiYXNlU2V0O1xuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgYSBwb3J0aW9uIG9mIGBwYXRoYCBkb2Vzbid0IGV4aXN0LFxuICogaXQncyBjcmVhdGVkLiBBcnJheXMgYXJlIGNyZWF0ZWQgZm9yIG1pc3NpbmcgaW5kZXggcHJvcGVydGllcyB3aGlsZSBvYmplY3RzXG4gKiBhcmUgY3JlYXRlZCBmb3IgYWxsIG90aGVyIG1pc3NpbmcgcHJvcGVydGllcy4gVXNlIGBfLnNldFdpdGhgIHRvIGN1c3RvbWl6ZVxuICogYHBhdGhgIGNyZWF0aW9uLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy43LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAqXG4gKiBfLnNldChvYmplY3QsICdhWzBdLmIuYycsIDQpO1xuICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcbiAqIC8vID0+IDRcbiAqXG4gKiBfLnNldChvYmplY3QsIFsneCcsICcwJywgJ3knLCAneiddLCA1KTtcbiAqIGNvbnNvbGUubG9nKG9iamVjdC54WzBdLnkueik7XG4gKiAvLyA9PiA1XG4gKi9cbmZ1bmN0aW9uIHNldChvYmplY3QsIHBhdGgsIHZhbHVlKSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IF9iYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpO1xufVxuXG52YXIgc2V0XzEgPSBzZXQ7XG5cbi8qKlxuICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgYHNvdXJjZWAgdG8gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuXG4gIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG52YXIgX2NvcHlBcnJheSA9IGNvcHlBcnJheTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9QYXRoKCdhLmIuYycpO1xuICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gKlxuICogXy50b1BhdGgoJ2FbMF0uYi5jJyk7XG4gKiAvLyA9PiBbJ2EnLCAnMCcsICdiJywgJ2MnXVxuICovXG5mdW5jdGlvbiB0b1BhdGgodmFsdWUpIHtcbiAgaWYgKGlzQXJyYXlfMSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gX2FycmF5TWFwKHZhbHVlLCBfdG9LZXkpO1xuICB9XG4gIHJldHVybiBpc1N5bWJvbF8xKHZhbHVlKSA/IFt2YWx1ZV0gOiBfY29weUFycmF5KF9zdHJpbmdUb1BhdGgodG9TdHJpbmdfMSh2YWx1ZSkpKTtcbn1cblxudmFyIHRvUGF0aF8xID0gdG9QYXRoO1xuXG52YXIgZGVmaW5lJDIgPSB7XG4gIC8vIGFjY2VzcyBkYXRhIGZpZWxkXG4gIGRhdGE6IGZ1bmN0aW9uIGRhdGEocGFyYW1zKSB7XG4gICAgdmFyIGRlZmF1bHRzID0ge1xuICAgICAgZmllbGQ6ICdkYXRhJyxcbiAgICAgIGJpbmRpbmdFdmVudDogJ2RhdGEnLFxuICAgICAgYWxsb3dCaW5kaW5nOiBmYWxzZSxcbiAgICAgIGFsbG93U2V0dGluZzogZmFsc2UsXG4gICAgICBhbGxvd0dldHRpbmc6IGZhbHNlLFxuICAgICAgc2V0dGluZ0V2ZW50OiAnZGF0YScsXG4gICAgICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogZmFsc2UsXG4gICAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgICBpbW11dGFibGVLZXlzOiB7fSxcbiAgICAgIC8vIGtleSA9PiB0cnVlIGlmIGltbXV0YWJsZVxuICAgICAgdXBkYXRlU3R5bGU6IGZhbHNlLFxuICAgICAgYmVmb3JlR2V0OiBmdW5jdGlvbiBiZWZvcmVHZXQoc2VsZikge30sXG4gICAgICBiZWZvcmVTZXQ6IGZ1bmN0aW9uIGJlZm9yZVNldChzZWxmLCBvYmopIHt9LFxuICAgICAgb25TZXQ6IGZ1bmN0aW9uIG9uU2V0KHNlbGYpIHt9LFxuICAgICAgY2FuU2V0OiBmdW5jdGlvbiBjYW5TZXQoc2VsZikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHBhcmFtcyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIHBhcmFtcyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGRhdGFJbXBsKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgcCA9IHBhcmFtcztcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBzZWxmSXNBcnJheUxpa2UgPSBzZWxmLmxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuICAgICAgdmFyIGFsbCA9IHNlbGZJc0FycmF5TGlrZSA/IHNlbGYgOiBbc2VsZl07IC8vIHB1dCBpbiBhcnJheSBpZiBub3QgYXJyYXktbGlrZVxuICAgICAgdmFyIHNpbmdsZSA9IHNlbGZJc0FycmF5TGlrZSA/IHNlbGZbMF0gOiBzZWxmO1xuXG4gICAgICAvLyAuZGF0YSgnZm9vJywgLi4uKVxuICAgICAgaWYgKHN0cmluZyhuYW1lKSkge1xuICAgICAgICAvLyBzZXQgb3IgZ2V0IHByb3BlcnR5XG4gICAgICAgIHZhciBpc1BhdGhMaWtlID0gbmFtZS5pbmRleE9mKCcuJykgIT09IC0xOyAvLyB0aGVyZSBtaWdodCBiZSBhIG5vcm1hbCBmaWVsZCB3aXRoIGEgZG90IFxuICAgICAgICB2YXIgcGF0aCA9IGlzUGF0aExpa2UgJiYgdG9QYXRoXzEobmFtZSk7XG5cbiAgICAgICAgLy8gLmRhdGEoJ2ZvbycpXG4gICAgICAgIGlmIChwLmFsbG93R2V0dGluZyAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gZ2V0XG5cbiAgICAgICAgICB2YXIgcmV0O1xuICAgICAgICAgIGlmIChzaW5nbGUpIHtcbiAgICAgICAgICAgIHAuYmVmb3JlR2V0KHNpbmdsZSk7XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgcGF0aCBhbmQgYSBmaWVsZCB3aXRoIHRoZSBzYW1lIG5hbWUgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgaWYgKHBhdGggJiYgc2luZ2xlLl9wcml2YXRlW3AuZmllbGRdW25hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0ID0gZ2V0XzEoc2luZ2xlLl9wcml2YXRlW3AuZmllbGRdLCBwYXRoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldCA9IHNpbmdsZS5fcHJpdmF0ZVtwLmZpZWxkXVtuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJldDtcblxuICAgICAgICAgIC8vIC5kYXRhKCdmb28nLCAnYmFyJylcbiAgICAgICAgfSBlbHNlIGlmIChwLmFsbG93U2V0dGluZyAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gc2V0XG4gICAgICAgICAgdmFyIHZhbGlkID0gIXAuaW1tdXRhYmxlS2V5c1tuYW1lXTtcbiAgICAgICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgICAgIHZhciBjaGFuZ2UgPSBfZGVmaW5lUHJvcGVydHkkMSh7fSwgbmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgcC5iZWZvcmVTZXQoc2VsZiwgY2hhbmdlKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gYWxsLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICB2YXIgZWxlID0gYWxsW2ldO1xuICAgICAgICAgICAgICBpZiAocC5jYW5TZXQoZWxlKSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXRoICYmIHNpbmdsZS5fcHJpdmF0ZVtwLmZpZWxkXVtuYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBzZXRfMShlbGUuX3ByaXZhdGVbcC5maWVsZF0sIHBhdGgsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZWxlLl9wcml2YXRlW3AuZmllbGRdW25hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSBtYXBwZXJzIGlmIGFza2VkXG4gICAgICAgICAgICBpZiAocC51cGRhdGVTdHlsZSkge1xuICAgICAgICAgICAgICBzZWxmLnVwZGF0ZVN0eWxlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNhbGwgb25TZXQgY2FsbGJhY2tcbiAgICAgICAgICAgIHAub25TZXQoc2VsZik7XG4gICAgICAgICAgICBpZiAocC5zZXR0aW5nVHJpZ2dlcnNFdmVudCkge1xuICAgICAgICAgICAgICBzZWxmW3AudHJpZ2dlckZuTmFtZV0ocC5zZXR0aW5nRXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC5kYXRhKHsgJ2Zvbyc6ICdiYXInIH0pXG4gICAgICB9IGVsc2UgaWYgKHAuYWxsb3dTZXR0aW5nICYmIHBsYWluT2JqZWN0KG5hbWUpKSB7XG4gICAgICAgIC8vIGV4dGVuZFxuICAgICAgICB2YXIgb2JqID0gbmFtZTtcbiAgICAgICAgdmFyIGssIHY7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgcC5iZWZvcmVTZXQoc2VsZiwgb2JqKTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGtleXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgayA9IGtleXNbX2ldO1xuICAgICAgICAgIHYgPSBvYmpba107XG4gICAgICAgICAgdmFyIF92YWxpZCA9ICFwLmltbXV0YWJsZUtleXNba107XG4gICAgICAgICAgaWYgKF92YWxpZCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhbGwubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgdmFyIF9lbGUgPSBhbGxbal07XG4gICAgICAgICAgICAgIGlmIChwLmNhblNldChfZWxlKSkge1xuICAgICAgICAgICAgICAgIF9lbGUuX3ByaXZhdGVbcC5maWVsZF1ba10gPSB2O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXBkYXRlIG1hcHBlcnMgaWYgYXNrZWRcbiAgICAgICAgaWYgKHAudXBkYXRlU3R5bGUpIHtcbiAgICAgICAgICBzZWxmLnVwZGF0ZVN0eWxlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjYWxsIG9uU2V0IGNhbGxiYWNrXG4gICAgICAgIHAub25TZXQoc2VsZik7XG4gICAgICAgIGlmIChwLnNldHRpbmdUcmlnZ2Vyc0V2ZW50KSB7XG4gICAgICAgICAgc2VsZltwLnRyaWdnZXJGbk5hbWVdKHAuc2V0dGluZ0V2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC5kYXRhKGZ1bmN0aW9uKCl7IC4uLiB9KVxuICAgICAgfSBlbHNlIGlmIChwLmFsbG93QmluZGluZyAmJiBmbiQ2KG5hbWUpKSB7XG4gICAgICAgIC8vIGJpbmQgdG8gZXZlbnRcbiAgICAgICAgdmFyIGZuID0gbmFtZTtcbiAgICAgICAgc2VsZi5vbihwLmJpbmRpbmdFdmVudCwgZm4pO1xuXG4gICAgICAgIC8vIC5kYXRhKClcbiAgICAgIH0gZWxzZSBpZiAocC5hbGxvd0dldHRpbmcgJiYgbmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGdldCB3aG9sZSBvYmplY3RcbiAgICAgICAgdmFyIF9yZXQ7XG4gICAgICAgIGlmIChzaW5nbGUpIHtcbiAgICAgICAgICBwLmJlZm9yZUdldChzaW5nbGUpO1xuICAgICAgICAgIF9yZXQgPSBzaW5nbGUuX3ByaXZhdGVbcC5maWVsZF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9yZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZjsgLy8gbWFpbnRhaW4gY2hhaW5hYmlsaXR5XG4gICAgfTsgLy8gZnVuY3Rpb25cbiAgfSxcblxuICAvLyBkYXRhXG5cbiAgLy8gcmVtb3ZlIGRhdGEgZmllbGRcbiAgcmVtb3ZlRGF0YTogZnVuY3Rpb24gcmVtb3ZlRGF0YShwYXJhbXMpIHtcbiAgICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgICBmaWVsZDogJ2RhdGEnLFxuICAgICAgZXZlbnQ6ICdkYXRhJyxcbiAgICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICAgIHRyaWdnZXJFdmVudDogZmFsc2UsXG4gICAgICBpbW11dGFibGVLZXlzOiB7fSAvLyBrZXkgPT4gdHJ1ZSBpZiBpbW11dGFibGVcbiAgICB9O1xuXG4gICAgcGFyYW1zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgcGFyYW1zKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gcmVtb3ZlRGF0YUltcGwobmFtZXMpIHtcbiAgICAgIHZhciBwID0gcGFyYW1zO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHNlbGZJc0FycmF5TGlrZSA9IHNlbGYubGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgICB2YXIgYWxsID0gc2VsZklzQXJyYXlMaWtlID8gc2VsZiA6IFtzZWxmXTsgLy8gcHV0IGluIGFycmF5IGlmIG5vdCBhcnJheS1saWtlXG5cbiAgICAgIC8vIC5yZW1vdmVEYXRhKCdmb28gYmFyJylcbiAgICAgIGlmIChzdHJpbmcobmFtZXMpKSB7XG4gICAgICAgIC8vIHRoZW4gZ2V0IHRoZSBsaXN0IG9mIGtleXMsIGFuZCBkZWxldGUgdGhlbVxuICAgICAgICB2YXIga2V5cyA9IG5hbWVzLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIHZhciBsID0ga2V5cy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgLy8gZGVsZXRlIGVhY2ggbm9uLWVtcHR5IGtleVxuICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmIChlbXB0eVN0cmluZyhrZXkpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHZhbGlkID0gIXAuaW1tdXRhYmxlS2V5c1trZXldOyAvLyBub3QgdmFsaWQgaWYgaW1tdXRhYmxlXG4gICAgICAgICAgaWYgKHZhbGlkKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpX2EgPSAwLCBsX2EgPSBhbGwubGVuZ3RoOyBpX2EgPCBsX2E7IGlfYSsrKSB7XG4gICAgICAgICAgICAgIGFsbFtpX2FdLl9wcml2YXRlW3AuZmllbGRdW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwLnRyaWdnZXJFdmVudCkge1xuICAgICAgICAgIHNlbGZbcC50cmlnZ2VyRm5OYW1lXShwLmV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC5yZW1vdmVEYXRhKClcbiAgICAgIH0gZWxzZSBpZiAobmFtZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyB0aGVuIGRlbGV0ZSBhbGwga2V5c1xuXG4gICAgICAgIGZvciAodmFyIF9pX2EgPSAwLCBfbF9hID0gYWxsLmxlbmd0aDsgX2lfYSA8IF9sX2E7IF9pX2ErKykge1xuICAgICAgICAgIHZhciBfcHJpdmF0ZUZpZWxkcyA9IGFsbFtfaV9hXS5fcHJpdmF0ZVtwLmZpZWxkXTtcbiAgICAgICAgICB2YXIgX2tleXMgPSBPYmplY3Qua2V5cyhfcHJpdmF0ZUZpZWxkcyk7XG4gICAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgX2tleXMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICAgICAgdmFyIF9rZXkgPSBfa2V5c1tfaTJdO1xuICAgICAgICAgICAgdmFyIHZhbGlkS2V5VG9EZWxldGUgPSAhcC5pbW11dGFibGVLZXlzW19rZXldO1xuICAgICAgICAgICAgaWYgKHZhbGlkS2V5VG9EZWxldGUpIHtcbiAgICAgICAgICAgICAgX3ByaXZhdGVGaWVsZHNbX2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwLnRyaWdnZXJFdmVudCkge1xuICAgICAgICAgIHNlbGZbcC50cmlnZ2VyRm5OYW1lXShwLmV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHNlbGY7IC8vIG1haW50YWluIGNoYWluaW5nXG4gICAgfTsgLy8gZnVuY3Rpb25cbiAgfSAvLyByZW1vdmVEYXRhXG59OyAvLyBkZWZpbmVcblxudmFyIGRlZmluZSQxID0ge1xuICBldmVudEFsaWFzZXNPbjogZnVuY3Rpb24gZXZlbnRBbGlhc2VzT24ocHJvdG8pIHtcbiAgICB2YXIgcCA9IHByb3RvO1xuICAgIHAuYWRkTGlzdGVuZXIgPSBwLmxpc3RlbiA9IHAuYmluZCA9IHAub247XG4gICAgcC51bmxpc3RlbiA9IHAudW5iaW5kID0gcC5vZmYgPSBwLnJlbW92ZUxpc3RlbmVyO1xuICAgIHAudHJpZ2dlciA9IHAuZW1pdDtcblxuICAgIC8vIHRoaXMgaXMganVzdCBhIHdyYXBwZXIgYWxpYXMgb2YgLm9uKClcbiAgICBwLnBvbiA9IHAucHJvbWlzZU9uID0gZnVuY3Rpb24gKGV2ZW50cywgc2VsZWN0b3IpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soZSkge1xuICAgICAgICAgIHNlbGYub2ZmLmFwcGx5KHNlbGYsIG9mZkFyZ3MpO1xuICAgICAgICAgIHJlc29sdmUoZSk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBvbkFyZ3MgPSBhcmdzLmNvbmNhdChbY2FsbGJhY2tdKTtcbiAgICAgICAgdmFyIG9mZkFyZ3MgPSBvbkFyZ3MuY29uY2F0KFtdKTtcbiAgICAgICAgc2VsZi5vbi5hcHBseShzZWxmLCBvbkFyZ3MpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxufTsgLy8gZGVmaW5lXG5cbi8vIHVzZSB0aGlzIG1vZHVsZSB0byBjaGVycnkgcGljayBmdW5jdGlvbnMgaW50byB5b3VyIHByb3RvdHlwZVxudmFyIGRlZmluZSA9IHt9O1xuW2RlZmluZSQzLCBkZWZpbmUkMiwgZGVmaW5lJDFdLmZvckVhY2goZnVuY3Rpb24gKG0pIHtcbiAgZXh0ZW5kKGRlZmluZSwgbSk7XG59KTtcblxudmFyIGVsZXNmbiRpID0ge1xuICBhbmltYXRlOiBkZWZpbmUuYW5pbWF0ZSgpLFxuICBhbmltYXRpb246IGRlZmluZS5hbmltYXRpb24oKSxcbiAgYW5pbWF0ZWQ6IGRlZmluZS5hbmltYXRlZCgpLFxuICBjbGVhclF1ZXVlOiBkZWZpbmUuY2xlYXJRdWV1ZSgpLFxuICBkZWxheTogZGVmaW5lLmRlbGF5KCksXG4gIGRlbGF5QW5pbWF0aW9uOiBkZWZpbmUuZGVsYXlBbmltYXRpb24oKSxcbiAgc3RvcDogZGVmaW5lLnN0b3AoKVxufTtcblxudmFyIGVsZXNmbiRoID0ge1xuICBjbGFzc2VzOiBmdW5jdGlvbiBjbGFzc2VzKF9jbGFzc2VzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChfY2xhc3NlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgcmV0ID0gW107XG4gICAgICBzZWxmWzBdLl9wcml2YXRlLmNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xzKSB7XG4gICAgICAgIHJldHVybiByZXQucHVzaChjbHMpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0gZWxzZSBpZiAoIWFycmF5KF9jbGFzc2VzKSkge1xuICAgICAgLy8gZXh0cmFjdCBjbGFzc2VzIGZyb20gc3RyaW5nXG4gICAgICBfY2xhc3NlcyA9IChfY2xhc3NlcyB8fCAnJykubWF0Y2goL1xcUysvZykgfHwgW107XG4gICAgfVxuICAgIHZhciBjaGFuZ2VkID0gW107XG4gICAgdmFyIGNsYXNzZXNTZXQgPSBuZXcgU2V0JDEoX2NsYXNzZXMpO1xuXG4gICAgLy8gY2hlY2sgYW5kIHVwZGF0ZSBlYWNoIGVsZVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VsZi5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGVsZSA9IHNlbGZbal07XG4gICAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgICB2YXIgZWxlQ2xhc3NlcyA9IF9wLmNsYXNzZXM7XG4gICAgICB2YXIgY2hhbmdlZEVsZSA9IGZhbHNlO1xuXG4gICAgICAvLyBjaGVjayBpZiBlbGUgaGFzIGFsbCBvZiB0aGUgcGFzc2VkIGNsYXNzZXNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX2NsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNscyA9IF9jbGFzc2VzW2ldO1xuICAgICAgICB2YXIgZWxlSGFzQ2xhc3MgPSBlbGVDbGFzc2VzLmhhcyhjbHMpO1xuICAgICAgICBpZiAoIWVsZUhhc0NsYXNzKSB7XG4gICAgICAgICAgY2hhbmdlZEVsZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gY2hlY2sgaWYgZWxlIGhhcyBjbGFzc2VzIG91dHNpZGUgb2YgdGhvc2UgcGFzc2VkXG4gICAgICBpZiAoIWNoYW5nZWRFbGUpIHtcbiAgICAgICAgY2hhbmdlZEVsZSA9IGVsZUNsYXNzZXMuc2l6ZSAhPT0gX2NsYXNzZXMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZWRFbGUpIHtcbiAgICAgICAgX3AuY2xhc3NlcyA9IGNsYXNzZXNTZXQ7XG4gICAgICAgIGNoYW5nZWQucHVzaChlbGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRyaWdnZXIgdXBkYXRlIHN0eWxlIG9uIHRob3NlIGVsZXMgdGhhdCBoYWQgY2xhc3MgY2hhbmdlc1xuICAgIGlmIChjaGFuZ2VkLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc3Bhd24oY2hhbmdlZCkudXBkYXRlU3R5bGUoKS5lbWl0KCdjbGFzcycpO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZjtcbiAgfSxcbiAgYWRkQ2xhc3M6IGZ1bmN0aW9uIGFkZENsYXNzKGNsYXNzZXMpIHtcbiAgICByZXR1cm4gdGhpcy50b2dnbGVDbGFzcyhjbGFzc2VzLCB0cnVlKTtcbiAgfSxcbiAgaGFzQ2xhc3M6IGZ1bmN0aW9uIGhhc0NsYXNzKGNsYXNzTmFtZSkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHJldHVybiBlbGUgIT0gbnVsbCAmJiBlbGUuX3ByaXZhdGUuY2xhc3Nlcy5oYXMoY2xhc3NOYW1lKTtcbiAgfSxcbiAgdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uIHRvZ2dsZUNsYXNzKGNsYXNzZXMsIHRvZ2dsZSkge1xuICAgIGlmICghYXJyYXkoY2xhc3NlcykpIHtcbiAgICAgIC8vIGV4dHJhY3QgY2xhc3NlcyBmcm9tIHN0cmluZ1xuICAgICAgY2xhc3NlcyA9IGNsYXNzZXMubWF0Y2goL1xcUysvZykgfHwgW107XG4gICAgfVxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgdG9nZ2xlVW5kZWZkID0gdG9nZ2xlID09PSB1bmRlZmluZWQ7XG4gICAgdmFyIGNoYW5nZWQgPSBbXTsgLy8gZWxlcyB3aG8gaGFkIGNsYXNzZXMgY2hhbmdlZFxuXG4gICAgZm9yICh2YXIgaSA9IDAsIGlsID0gc2VsZi5sZW5ndGg7IGkgPCBpbDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gc2VsZltpXTtcbiAgICAgIHZhciBlbGVDbGFzc2VzID0gZWxlLl9wcml2YXRlLmNsYXNzZXM7XG4gICAgICB2YXIgY2hhbmdlZEVsZSA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjbGFzc2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBjbHMgPSBjbGFzc2VzW2pdO1xuICAgICAgICB2YXIgaGFzQ2xhc3MgPSBlbGVDbGFzc2VzLmhhcyhjbHMpO1xuICAgICAgICB2YXIgY2hhbmdlZE5vdyA9IGZhbHNlO1xuICAgICAgICBpZiAodG9nZ2xlIHx8IHRvZ2dsZVVuZGVmZCAmJiAhaGFzQ2xhc3MpIHtcbiAgICAgICAgICBlbGVDbGFzc2VzLmFkZChjbHMpO1xuICAgICAgICAgIGNoYW5nZWROb3cgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCF0b2dnbGUgfHwgdG9nZ2xlVW5kZWZkICYmIGhhc0NsYXNzKSB7XG4gICAgICAgICAgZWxlQ2xhc3Nlc1tcImRlbGV0ZVwiXShjbHMpO1xuICAgICAgICAgIGNoYW5nZWROb3cgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hhbmdlZEVsZSAmJiBjaGFuZ2VkTm93KSB7XG4gICAgICAgICAgY2hhbmdlZC5wdXNoKGVsZSk7XG4gICAgICAgICAgY2hhbmdlZEVsZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gZm9yIGogY2xhc3Nlc1xuICAgIH0gLy8gZm9yIGkgZWxlc1xuXG4gICAgLy8gdHJpZ2dlciB1cGRhdGUgc3R5bGUgb24gdGhvc2UgZWxlcyB0aGF0IGhhZCBjbGFzcyBjaGFuZ2VzXG4gICAgaWYgKGNoYW5nZWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zcGF3bihjaGFuZ2VkKS51cGRhdGVTdHlsZSgpLmVtaXQoJ2NsYXNzJyk7XG4gICAgfVxuICAgIHJldHVybiBzZWxmO1xuICB9LFxuICByZW1vdmVDbGFzczogZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoY2xhc3Nlcykge1xuICAgIHJldHVybiB0aGlzLnRvZ2dsZUNsYXNzKGNsYXNzZXMsIGZhbHNlKTtcbiAgfSxcbiAgZmxhc2hDbGFzczogZnVuY3Rpb24gZmxhc2hDbGFzcyhjbGFzc2VzLCBkdXJhdGlvbikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoZHVyYXRpb24gPT0gbnVsbCkge1xuICAgICAgZHVyYXRpb24gPSAyNTA7XG4gICAgfSBlbHNlIGlmIChkdXJhdGlvbiA9PT0gMCkge1xuICAgICAgcmV0dXJuIHNlbGY7IC8vIG5vdGhpbmcgdG8gZG8gcmVhbGx5XG4gICAgfVxuXG4gICAgc2VsZi5hZGRDbGFzcyhjbGFzc2VzKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYucmVtb3ZlQ2xhc3MoY2xhc3Nlcyk7XG4gICAgfSwgZHVyYXRpb24pO1xuICAgIHJldHVybiBzZWxmO1xuICB9XG59O1xuZWxlc2ZuJGguY2xhc3NOYW1lID0gZWxlc2ZuJGguY2xhc3NOYW1lcyA9IGVsZXNmbiRoLmNsYXNzZXM7XG5cbi8vIHRva2VucyBpbiB0aGUgcXVlcnkgbGFuZ3VhZ2VcbnZhciB0b2tlbnMgPSB7XG4gIG1ldGFDaGFyOiAnW1xcXFwhXFxcXFwiXFxcXCNcXFxcJFxcXFwlXFxcXCZcXFxcXFwnXFxcXChcXFxcKVxcXFwqXFxcXCtcXFxcLFxcXFwuXFxcXC9cXFxcOlxcXFw7XFxcXDxcXFxcPVxcXFw+XFxcXD9cXFxcQFxcXFxbXFxcXF1cXFxcXlxcXFxgXFxcXHtcXFxcfFxcXFx9XFxcXH5dJyxcbiAgLy8gY2hhcnMgd2UgbmVlZCB0byBlc2NhcGUgaW4gbGV0IG5hbWVzLCBldGNcbiAgY29tcGFyYXRvck9wOiAnPXxcXFxcIT18Pnw+PXw8fDw9fFxcXFwkPXxcXFxcXj18XFxcXCo9JyxcbiAgLy8gYmluYXJ5IGNvbXBhcmlzb24gb3AgKHVzZWQgaW4gZGF0YSBzZWxlY3RvcnMpXG4gIGJvb2xPcDogJ1xcXFw/fFxcXFwhfFxcXFxeJyxcbiAgLy8gYm9vbGVhbiAodW5hcnkpIG9wZXJhdG9ycyAodXNlZCBpbiBkYXRhIHNlbGVjdG9ycylcbiAgc3RyaW5nOiAnXCIoPzpcXFxcXFxcXFwifFteXCJdKSpcIicgKyAnfCcgKyBcIicoPzpcXFxcXFxcXCd8W14nXSkqJ1wiLFxuICAvLyBzdHJpbmcgbGl0ZXJhbHMgKHVzZWQgaW4gZGF0YSBzZWxlY3RvcnMpIC0tIGRvdWJsZXF1b3RlcyB8IHNpbmdsZXF1b3Rlc1xuICBudW1iZXI6IG51bWJlcixcbiAgLy8gbnVtYmVyIGxpdGVyYWwgKHVzZWQgaW4gZGF0YSBzZWxlY3RvcnMpIC0tLSBlLmcuIDAuMTIzNCwgMTIzNCwgMTJlMTIzXG4gIG1ldGE6ICdkZWdyZWV8aW5kZWdyZWV8b3V0ZGVncmVlJyxcbiAgLy8gYWxsb3dlZCBtZXRhZGF0YSBmaWVsZHMgKGkuZS4gYWxsb3dlZCBmdW5jdGlvbnMgdG8gdXNlIGZyb20gQ29sbGVjdGlvbilcbiAgc2VwYXJhdG9yOiAnXFxcXHMqLFxcXFxzKicsXG4gIC8vIHF1ZXJpZXMgYXJlIHNlcGFyYXRlZCBieSBjb21tYXMsIGUuZy4gZWRnZVtmb28gPSAnYmFyJ10sIG5vZGUuc29tZUNsYXNzXG4gIGRlc2NlbmRhbnQ6ICdcXFxccysnLFxuICBjaGlsZDogJ1xcXFxzKz5cXFxccysnLFxuICBzdWJqZWN0OiAnXFxcXCQnLFxuICBncm91cDogJ25vZGV8ZWRnZXxcXFxcKicsXG4gIGRpcmVjdGVkRWRnZTogJ1xcXFxzKy0+XFxcXHMrJyxcbiAgdW5kaXJlY3RlZEVkZ2U6ICdcXFxccys8LT5cXFxccysnXG59O1xudG9rZW5zLnZhcmlhYmxlID0gJyg/OltcXFxcdy0uXXwoPzpcXFxcXFxcXCcgKyB0b2tlbnMubWV0YUNoYXIgKyAnKSkrJzsgLy8gYSB2YXJpYWJsZSBuYW1lIGNhbiBoYXZlIGxldHRlcnMsIG51bWJlcnMsIGRhc2hlcywgYW5kIHBlcmlvZHNcbnRva2Vucy5jbGFzc05hbWUgPSAnKD86W1xcXFx3LV18KD86XFxcXFxcXFwnICsgdG9rZW5zLm1ldGFDaGFyICsgJykpKyc7IC8vIGEgY2xhc3MgbmFtZSBoYXMgdGhlIHNhbWUgcnVsZXMgYXMgYSB2YXJpYWJsZSBleGNlcHQgaXQgY2FuJ3QgaGF2ZSBhICcuJyBpbiB0aGUgbmFtZVxudG9rZW5zLnZhbHVlID0gdG9rZW5zLnN0cmluZyArICd8JyArIHRva2Vucy5udW1iZXI7IC8vIGEgdmFsdWUgbGl0ZXJhbCwgZWl0aGVyIGEgc3RyaW5nIG9yIG51bWJlclxudG9rZW5zLmlkID0gdG9rZW5zLnZhcmlhYmxlOyAvLyBhbiBlbGVtZW50IGlkIChmb2xsb3dzIHZhcmlhYmxlIGNvbnZlbnRpb25zKVxuXG4oZnVuY3Rpb24gKCkge1xuICB2YXIgb3BzLCBvcCwgaTtcblxuICAvLyBhZGQgQCB2YXJpYW50cyB0byBjb21wYXJhdG9yT3BcbiAgb3BzID0gdG9rZW5zLmNvbXBhcmF0b3JPcC5zcGxpdCgnfCcpO1xuICBmb3IgKGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3AgPSBvcHNbaV07XG4gICAgdG9rZW5zLmNvbXBhcmF0b3JPcCArPSAnfEAnICsgb3A7XG4gIH1cblxuICAvLyBhZGQgISB2YXJpYW50cyB0byBjb21wYXJhdG9yT3BcbiAgb3BzID0gdG9rZW5zLmNvbXBhcmF0b3JPcC5zcGxpdCgnfCcpO1xuICBmb3IgKGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3AgPSBvcHNbaV07XG4gICAgaWYgKG9wLmluZGV4T2YoJyEnKSA+PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIHNraXAgb3BzIHRoYXQgZXhwbGljaXRseSBjb250YWluICFcbiAgICBpZiAob3AgPT09ICc9Jykge1xuICAgICAgY29udGludWU7XG4gICAgfSAvLyBza2lwID0gYi9jICE9IGlzIGV4cGxpY2l0bHkgZGVmaW5lZFxuXG4gICAgdG9rZW5zLmNvbXBhcmF0b3JPcCArPSAnfFxcXFwhJyArIG9wO1xuICB9XG59KSgpO1xuXG4vKipcbiAqIE1ha2UgYSBuZXcgcXVlcnkgb2JqZWN0XG4gKlxuICogQHByb3AgdHlwZSB7VHlwZX0gVGhlIHR5cGUgZW51bSAoaW50KSBvZiB0aGUgcXVlcnlcbiAqIEBwcm9wIGNoZWNrcyBMaXN0IG9mIGNoZWNrcyB0byBtYWtlIGFnYWluc3QgYW4gZWxlIHRvIHRlc3QgZm9yIGEgbWF0Y2hcbiAqL1xudmFyIG5ld1F1ZXJ5ID0gZnVuY3Rpb24gbmV3UXVlcnkoKSB7XG4gIHJldHVybiB7XG4gICAgY2hlY2tzOiBbXVxuICB9O1xufTtcblxuLyoqXG4gKiBBIGNoZWNrIHR5cGUgZW51bS1saWtlIG9iamVjdC4gIFVzZXMgaW50ZWdlciB2YWx1ZXMgZm9yIGZhc3QgbWF0Y2goKSBsb29rdXAuXG4gKiBUaGUgb3JkZXJpbmcgZG9lcyBub3QgbWF0dGVyIGFzIGxvbmcgYXMgdGhlIGludHMgYXJlIHVuaXF1ZS5cbiAqL1xudmFyIFR5cGUgPSB7XG4gIC8qKiBFLmcuIG5vZGUgKi9cbiAgR1JPVVA6IDAsXG4gIC8qKiBBIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgKi9cbiAgQ09MTEVDVElPTjogMSxcbiAgLyoqIEEgZmlsdGVyKGVsZSkgZnVuY3Rpb24gKi9cbiAgRklMVEVSOiAyLFxuICAvKiogRS5nLiBbZm9vID4gMV0gKi9cbiAgREFUQV9DT01QQVJFOiAzLFxuICAvKiogRS5nLiBbZm9vXSAqL1xuICBEQVRBX0VYSVNUOiA0LFxuICAvKiogRS5nLiBbP2Zvb10gKi9cbiAgREFUQV9CT09MOiA1LFxuICAvKiogRS5nLiBbW2RlZ3JlZSA+IDJdXSAqL1xuICBNRVRBX0NPTVBBUkU6IDYsXG4gIC8qKiBFLmcuIDpzZWxlY3RlZCAqL1xuICBTVEFURTogNyxcbiAgLyoqIEUuZy4gI2ZvbyAqL1xuICBJRDogOCxcbiAgLyoqIEUuZy4gLmZvbyAqL1xuICBDTEFTUzogOSxcbiAgLyoqIEUuZy4gI2ZvbyA8LT4gI2JhciAqL1xuICBVTkRJUkVDVEVEX0VER0U6IDEwLFxuICAvKiogRS5nLiAjZm9vIC0+ICNiYXIgKi9cbiAgRElSRUNURURfRURHRTogMTEsXG4gIC8qKiBFLmcuICQjZm9vIC0+ICNiYXIgKi9cbiAgTk9ERV9TT1VSQ0U6IDEyLFxuICAvKiogRS5nLiAjZm9vIC0+ICQjYmFyICovXG4gIE5PREVfVEFSR0VUOiAxMyxcbiAgLyoqIEUuZy4gJCNmb28gPC0+ICNiYXIgKi9cbiAgTk9ERV9ORUlHSEJPUjogMTQsXG4gIC8qKiBFLmcuICNmb28gPiAjYmFyICovXG4gIENISUxEOiAxNSxcbiAgLyoqIEUuZy4gI2ZvbyAjYmFyICovXG4gIERFU0NFTkRBTlQ6IDE2LFxuICAvKiogRS5nLiAkI2ZvbyA+ICNiYXIgKi9cbiAgUEFSRU5UOiAxNyxcbiAgLyoqIEUuZy4gJCNmb28gI2JhciAqL1xuICBBTkNFU1RPUjogMTgsXG4gIC8qKiBFLmcuICNmb28gPiAkYmFyID4gI2JheiAqL1xuICBDT01QT1VORF9TUExJVDogMTksXG4gIC8qKiBBbHdheXMgbWF0Y2hlcywgdXNlZnVsIHBsYWNlaG9sZGVyIGZvciBzdWJqZWN0IGluIGBDT01QT1VORF9TUExJVGAgKi9cbiAgVFJVRTogMjBcbn07XG5cbnZhciBzdGF0ZVNlbGVjdG9ycyA9IFt7XG4gIHNlbGVjdG9yOiAnOnNlbGVjdGVkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLnNlbGVjdGVkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6dW5zZWxlY3RlZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuc2VsZWN0ZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpzZWxlY3RhYmxlJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLnNlbGVjdGFibGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzp1bnNlbGVjdGFibGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLnNlbGVjdGFibGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpsb2NrZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUubG9ja2VkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6dW5sb2NrZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLmxvY2tlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnZpc2libGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUudmlzaWJsZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmhpZGRlbicsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUudmlzaWJsZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnRyYW5zcGFyZW50JyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLnRyYW5zcGFyZW50KCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6Z3JhYmJlZCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5ncmFiYmVkKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6ZnJlZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuZ3JhYmJlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnJlbW92ZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUucmVtb3ZlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmluc2lkZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUucmVtb3ZlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmdyYWJiYWJsZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5ncmFiYmFibGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzp1bmdyYWJiYWJsZScsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuZ3JhYmJhYmxlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6YW5pbWF0ZWQnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuYW5pbWF0ZWQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzp1bmFuaW1hdGVkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5hbmltYXRlZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOnBhcmVudCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc1BhcmVudCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmNoaWxkbGVzcycsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc0NoaWxkbGVzcygpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmNoaWxkJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICByZXR1cm4gZWxlLmlzQ2hpbGQoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpvcnBoYW4nLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNPcnBoYW4oKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpub25vcnBoYW4nLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNDaGlsZCgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmNvbXBvdW5kJyxcbiAgbWF0Y2hlczogZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICByZXR1cm4gZWxlLmlzUGFyZW50KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGUuc291cmNlKCkuaXNQYXJlbnQoKSB8fCBlbGUudGFyZ2V0KCkuaXNQYXJlbnQoKTtcbiAgICB9XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6bG9vcCcsXG4gIG1hdGNoZXM6IGZ1bmN0aW9uIG1hdGNoZXMoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5pc0xvb3AoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzpzaW1wbGUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuaXNTaW1wbGUoKTtcbiAgfVxufSwge1xuICBzZWxlY3RvcjogJzphY3RpdmUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuYWN0aXZlKCk7XG4gIH1cbn0sIHtcbiAgc2VsZWN0b3I6ICc6aW5hY3RpdmUnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLmFjdGl2ZSgpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOmJhY2tncm91bmRpbmcnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiBlbGUuYmFja2dyb3VuZGluZygpO1xuICB9XG59LCB7XG4gIHNlbGVjdG9yOiAnOm5vbmJhY2tncm91bmRpbmcnLFxuICBtYXRjaGVzOiBmdW5jdGlvbiBtYXRjaGVzKGVsZSkge1xuICAgIHJldHVybiAhZWxlLmJhY2tncm91bmRpbmcoKTtcbiAgfVxufV0uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAvLyBuLmIuIHNlbGVjdG9ycyB0aGF0IGFyZSBzdGFydGluZyBzdWJzdHJpbmdzIG9mIG90aGVycyBtdXN0IGhhdmUgdGhlIGxvbmdlciBvbmVzIGZpcnN0XG4gIHJldHVybiBkZXNjZW5kaW5nKGEuc2VsZWN0b3IsIGIuc2VsZWN0b3IpO1xufSk7XG52YXIgbG9va3VwID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsVG9GbiA9IHt9O1xuICB2YXIgcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZVNlbGVjdG9ycy5sZW5ndGg7IGkrKykge1xuICAgIHMgPSBzdGF0ZVNlbGVjdG9yc1tpXTtcbiAgICBzZWxUb0ZuW3Muc2VsZWN0b3JdID0gcy5tYXRjaGVzO1xuICB9XG4gIHJldHVybiBzZWxUb0ZuO1xufSgpO1xudmFyIHN0YXRlU2VsZWN0b3JNYXRjaGVzID0gZnVuY3Rpb24gc3RhdGVTZWxlY3Rvck1hdGNoZXMoc2VsLCBlbGUpIHtcbiAgcmV0dXJuIGxvb2t1cFtzZWxdKGVsZSk7XG59O1xudmFyIHN0YXRlU2VsZWN0b3JSZWdleCA9ICcoJyArIHN0YXRlU2VsZWN0b3JzLm1hcChmdW5jdGlvbiAocykge1xuICByZXR1cm4gcy5zZWxlY3Rvcjtcbn0pLmpvaW4oJ3wnKSArICcpJztcblxuLy8gd2hlbiBhIHRva2VuIGxpa2UgYSB2YXJpYWJsZSBoYXMgZXNjYXBlZCBtZXRhIGNoYXJhY3RlcnMsIHdlIG5lZWQgdG8gY2xlYW4gdGhlIGJhY2tzbGFzaGVzIG91dFxuLy8gc28gdGhhdCB2YWx1ZXMgZ2V0IGNvbXBhcmVkIHByb3Blcmx5IGluIFNlbGVjdG9yLmZpbHRlcigpXG52YXIgY2xlYW5NZXRhQ2hhcnMgPSBmdW5jdGlvbiBjbGVhbk1ldGFDaGFycyhzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFxcXFxcKCcgKyB0b2tlbnMubWV0YUNoYXIgKyAnKScsICdnJyksIGZ1bmN0aW9uIChtYXRjaCwgJDEpIHtcbiAgICByZXR1cm4gJDE7XG4gIH0pO1xufTtcbnZhciByZXBsYWNlTGFzdFF1ZXJ5ID0gZnVuY3Rpb24gcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgZXhhbWluaW5nUXVlcnksIHJlcGxhY2VtZW50UXVlcnkpIHtcbiAgc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV0gPSByZXBsYWNlbWVudFF1ZXJ5O1xufTtcblxuLy8gTk9URTogYWRkIG5ldyBleHByZXNzaW9uIHN5bnRheCBoZXJlIHRvIGhhdmUgaXQgcmVjb2duaXNlZCBieSB0aGUgcGFyc2VyO1xuLy8gLSBhIHF1ZXJ5IGNvbnRhaW5zIGFsbCBhZGphY2VudCAoaS5lLiBubyBzZXBhcmF0b3IgaW4gYmV0d2VlbikgZXhwcmVzc2lvbnM7XG4vLyAtIHRoZSBjdXJyZW50IHF1ZXJ5IGlzIHN0b3JlZCBpbiBzZWxlY3RvcltpXVxuLy8gLSB5b3UgbmVlZCB0byBjaGVjayB0aGUgcXVlcnkgb2JqZWN0cyBpbiBtYXRjaCgpIGZvciBpdCBhY3R1YWxseSBmaWx0ZXIgcHJvcGVybHksIGJ1dCB0aGF0J3MgcHJldHR5IHN0cmFpZ2h0IGZvcndhcmRcbnZhciBleHBycyA9IFt7XG4gIG5hbWU6ICdncm91cCcsXG4gIC8vIGp1c3QgdXNlZCBmb3IgaWRlbnRpZnlpbmcgd2hlbiBkZWJ1Z2dpbmdcbiAgcXVlcnk6IHRydWUsXG4gIHJlZ2V4OiAnKCcgKyB0b2tlbnMuZ3JvdXAgKyAnKScsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWYpIHtcbiAgICB2YXIgX3JlZjIgPSBfc2xpY2VkVG9BcnJheShfcmVmLCAxKSxcbiAgICAgIGdyb3VwID0gX3JlZjJbMF07XG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5HUk9VUCxcbiAgICAgIHZhbHVlOiBncm91cCA9PT0gJyonID8gZ3JvdXAgOiBncm91cCArICdzJ1xuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdzdGF0ZScsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogc3RhdGVTZWxlY3RvclJlZ2V4LFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5LCBfcmVmMykge1xuICAgIHZhciBfcmVmNCA9IF9zbGljZWRUb0FycmF5KF9yZWYzLCAxKSxcbiAgICAgIHN0YXRlID0gX3JlZjRbMF07XG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5TVEFURSxcbiAgICAgIHZhbHVlOiBzdGF0ZVxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdpZCcsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFwjKCcgKyB0b2tlbnMuaWQgKyAnKScsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnksIF9yZWY1KSB7XG4gICAgdmFyIF9yZWY2ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjUsIDEpLFxuICAgICAgaWQgPSBfcmVmNlswXTtcbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLklELFxuICAgICAgdmFsdWU6IGNsZWFuTWV0YUNoYXJzKGlkKVxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdjbGFzc05hbWUnLFxuICBxdWVyeTogdHJ1ZSxcbiAgcmVnZXg6ICdcXFxcLignICsgdG9rZW5zLmNsYXNzTmFtZSArICcpJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZjcpIHtcbiAgICB2YXIgX3JlZjggPSBfc2xpY2VkVG9BcnJheShfcmVmNywgMSksXG4gICAgICBjbGFzc05hbWUgPSBfcmVmOFswXTtcbiAgICBxdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICB0eXBlOiBUeXBlLkNMQVNTLFxuICAgICAgdmFsdWU6IGNsZWFuTWV0YUNoYXJzKGNsYXNzTmFtZSlcbiAgICB9KTtcbiAgfVxufSwge1xuICBuYW1lOiAnZGF0YUV4aXN0cycsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFxbXFxcXHMqKCcgKyB0b2tlbnMudmFyaWFibGUgKyAnKVxcXFxzKlxcXFxdJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZjkpIHtcbiAgICB2YXIgX3JlZjEwID0gX3NsaWNlZFRvQXJyYXkoX3JlZjksIDEpLFxuICAgICAgdmFyaWFibGUgPSBfcmVmMTBbMF07XG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5EQVRBX0VYSVNULFxuICAgICAgZmllbGQ6IGNsZWFuTWV0YUNoYXJzKHZhcmlhYmxlKVxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdkYXRhQ29tcGFyZScsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFxbXFxcXHMqKCcgKyB0b2tlbnMudmFyaWFibGUgKyAnKVxcXFxzKignICsgdG9rZW5zLmNvbXBhcmF0b3JPcCArICcpXFxcXHMqKCcgKyB0b2tlbnMudmFsdWUgKyAnKVxcXFxzKlxcXFxdJyxcbiAgcG9wdWxhdGU6IGZ1bmN0aW9uIHBvcHVsYXRlKHNlbGVjdG9yLCBxdWVyeSwgX3JlZjExKSB7XG4gICAgdmFyIF9yZWYxMiA9IF9zbGljZWRUb0FycmF5KF9yZWYxMSwgMyksXG4gICAgICB2YXJpYWJsZSA9IF9yZWYxMlswXSxcbiAgICAgIGNvbXBhcmF0b3JPcCA9IF9yZWYxMlsxXSxcbiAgICAgIHZhbHVlID0gX3JlZjEyWzJdO1xuICAgIHZhciB2YWx1ZUlzU3RyaW5nID0gbmV3IFJlZ0V4cCgnXicgKyB0b2tlbnMuc3RyaW5nICsgJyQnKS5leGVjKHZhbHVlKSAhPSBudWxsO1xuICAgIGlmICh2YWx1ZUlzU3RyaW5nKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGggLSAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICB9XG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5EQVRBX0NPTVBBUkUsXG4gICAgICBmaWVsZDogY2xlYW5NZXRhQ2hhcnModmFyaWFibGUpLFxuICAgICAgb3BlcmF0b3I6IGNvbXBhcmF0b3JPcCxcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICdkYXRhQm9vbCcsXG4gIHF1ZXJ5OiB0cnVlLFxuICByZWdleDogJ1xcXFxbXFxcXHMqKCcgKyB0b2tlbnMuYm9vbE9wICsgJylcXFxccyooJyArIHRva2Vucy52YXJpYWJsZSArICcpXFxcXHMqXFxcXF0nLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5LCBfcmVmMTMpIHtcbiAgICB2YXIgX3JlZjE0ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjEzLCAyKSxcbiAgICAgIGJvb2xPcCA9IF9yZWYxNFswXSxcbiAgICAgIHZhcmlhYmxlID0gX3JlZjE0WzFdO1xuICAgIHF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgIHR5cGU6IFR5cGUuREFUQV9CT09MLFxuICAgICAgZmllbGQ6IGNsZWFuTWV0YUNoYXJzKHZhcmlhYmxlKSxcbiAgICAgIG9wZXJhdG9yOiBib29sT3BcbiAgICB9KTtcbiAgfVxufSwge1xuICBuYW1lOiAnbWV0YUNvbXBhcmUnLFxuICBxdWVyeTogdHJ1ZSxcbiAgcmVnZXg6ICdcXFxcW1xcXFxbXFxcXHMqKCcgKyB0b2tlbnMubWV0YSArICcpXFxcXHMqKCcgKyB0b2tlbnMuY29tcGFyYXRvck9wICsgJylcXFxccyooJyArIHRva2Vucy5udW1iZXIgKyAnKVxcXFxzKlxcXFxdXFxcXF0nLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5LCBfcmVmMTUpIHtcbiAgICB2YXIgX3JlZjE2ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjE1LCAzKSxcbiAgICAgIG1ldGEgPSBfcmVmMTZbMF0sXG4gICAgICBjb21wYXJhdG9yT3AgPSBfcmVmMTZbMV0sXG4gICAgICBudW1iZXIgPSBfcmVmMTZbMl07XG4gICAgcXVlcnkuY2hlY2tzLnB1c2goe1xuICAgICAgdHlwZTogVHlwZS5NRVRBX0NPTVBBUkUsXG4gICAgICBmaWVsZDogY2xlYW5NZXRhQ2hhcnMobWV0YSksXG4gICAgICBvcGVyYXRvcjogY29tcGFyYXRvck9wLFxuICAgICAgdmFsdWU6IHBhcnNlRmxvYXQobnVtYmVyKVxuICAgIH0pO1xuICB9XG59LCB7XG4gIG5hbWU6ICduZXh0UXVlcnknLFxuICBzZXBhcmF0b3I6IHRydWUsXG4gIHJlZ2V4OiB0b2tlbnMuc2VwYXJhdG9yLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5KSB7XG4gICAgdmFyIGN1cnJlbnRTdWJqZWN0ID0gc2VsZWN0b3IuY3VycmVudFN1YmplY3Q7XG4gICAgdmFyIGVkZ2VDb3VudCA9IHNlbGVjdG9yLmVkZ2VDb3VudDtcbiAgICB2YXIgY29tcG91bmRDb3VudCA9IHNlbGVjdG9yLmNvbXBvdW5kQ291bnQ7XG4gICAgdmFyIGxhc3RRID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV07XG4gICAgaWYgKGN1cnJlbnRTdWJqZWN0ICE9IG51bGwpIHtcbiAgICAgIGxhc3RRLnN1YmplY3QgPSBjdXJyZW50U3ViamVjdDtcbiAgICAgIHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID0gbnVsbDtcbiAgICB9XG4gICAgbGFzdFEuZWRnZUNvdW50ID0gZWRnZUNvdW50O1xuICAgIGxhc3RRLmNvbXBvdW5kQ291bnQgPSBjb21wb3VuZENvdW50O1xuICAgIHNlbGVjdG9yLmVkZ2VDb3VudCA9IDA7XG4gICAgc2VsZWN0b3IuY29tcG91bmRDb3VudCA9IDA7XG5cbiAgICAvLyBnbyBvbiB0byBuZXh0IHF1ZXJ5XG4gICAgdmFyIG5leHRRdWVyeSA9IHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCsrXSA9IG5ld1F1ZXJ5KCk7XG4gICAgcmV0dXJuIG5leHRRdWVyeTsgLy8gdGhpcyBpcyB0aGUgbmV3IHF1ZXJ5IHRvIGJlIGZpbGxlZCBieSB0aGUgZm9sbG93aW5nIGV4cHJzXG4gIH1cbn0sIHtcbiAgbmFtZTogJ2RpcmVjdGVkRWRnZScsXG4gIHNlcGFyYXRvcjogdHJ1ZSxcbiAgcmVnZXg6IHRva2Vucy5kaXJlY3RlZEVkZ2UsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPT0gbnVsbCkge1xuICAgICAgLy8gdW5kaXJlY3RlZCBlZGdlXG4gICAgICB2YXIgZWRnZVF1ZXJ5ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBzb3VyY2UgPSBxdWVyeTtcbiAgICAgIHZhciB0YXJnZXQgPSBuZXdRdWVyeSgpO1xuICAgICAgZWRnZVF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5ESVJFQ1RFRF9FREdFLFxuICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICAgIH0pO1xuXG4gICAgICAvLyB0aGUgcXVlcnkgaW4gdGhlIHNlbGVjdG9yIHNob3VsZCBiZSB0aGUgZWRnZSByYXRoZXIgdGhhbiB0aGUgc291cmNlXG4gICAgICByZXBsYWNlTGFzdFF1ZXJ5KHNlbGVjdG9yLCBxdWVyeSwgZWRnZVF1ZXJ5KTtcbiAgICAgIHNlbGVjdG9yLmVkZ2VDb3VudCsrO1xuXG4gICAgICAvLyB3ZSdyZSBub3cgcG9wdWxhdGluZyB0aGUgdGFyZ2V0IHF1ZXJ5IHdpdGggZXhwcmVzc2lvbnMgdGhhdCBmb2xsb3dcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNvdXJjZS90YXJnZXRcbiAgICAgIHZhciBzcmNUZ3RRID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBfc291cmNlID0gcXVlcnk7XG4gICAgICB2YXIgX3RhcmdldCA9IG5ld1F1ZXJ5KCk7XG4gICAgICBzcmNUZ3RRLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5OT0RFX1NPVVJDRSxcbiAgICAgICAgc291cmNlOiBfc291cmNlLFxuICAgICAgICB0YXJnZXQ6IF90YXJnZXRcbiAgICAgIH0pO1xuXG4gICAgICAvLyB0aGUgcXVlcnkgaW4gdGhlIHNlbGVjdG9yIHNob3VsZCBiZSB0aGUgbmVpZ2hib3VyaG9vZCByYXRoZXIgdGhhbiB0aGUgbm9kZVxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIHNyY1RndFEpO1xuICAgICAgc2VsZWN0b3IuZWRnZUNvdW50Kys7XG4gICAgICByZXR1cm4gX3RhcmdldDsgLy8gbm93IHBvcHVsYXRpbmcgdGhlIHRhcmdldCB3aXRoIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbnNcbiAgICB9XG4gIH1cbn0sIHtcbiAgbmFtZTogJ3VuZGlyZWN0ZWRFZGdlJyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLnVuZGlyZWN0ZWRFZGdlLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5KSB7XG4gICAgaWYgKHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID09IG51bGwpIHtcbiAgICAgIC8vIHVuZGlyZWN0ZWQgZWRnZVxuICAgICAgdmFyIGVkZ2VRdWVyeSA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgc291cmNlID0gcXVlcnk7XG4gICAgICB2YXIgdGFyZ2V0ID0gbmV3UXVlcnkoKTtcbiAgICAgIGVkZ2VRdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuVU5ESVJFQ1RFRF9FREdFLFxuICAgICAgICBub2RlczogW3NvdXJjZSwgdGFyZ2V0XVxuICAgICAgfSk7XG5cbiAgICAgIC8vIHRoZSBxdWVyeSBpbiB0aGUgc2VsZWN0b3Igc2hvdWxkIGJlIHRoZSBlZGdlIHJhdGhlciB0aGFuIHRoZSBzb3VyY2VcbiAgICAgIHJlcGxhY2VMYXN0UXVlcnkoc2VsZWN0b3IsIHF1ZXJ5LCBlZGdlUXVlcnkpO1xuICAgICAgc2VsZWN0b3IuZWRnZUNvdW50Kys7XG5cbiAgICAgIC8vIHdlJ3JlIG5vdyBwb3B1bGF0aW5nIHRoZSB0YXJnZXQgcXVlcnkgd2l0aCBleHByZXNzaW9ucyB0aGF0IGZvbGxvd1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbmVpZ2hib3VyaG9vZFxuICAgICAgdmFyIG5ob29kUSA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgbm9kZSA9IHF1ZXJ5O1xuICAgICAgdmFyIG5laWdoYm9yID0gbmV3UXVlcnkoKTtcbiAgICAgIG5ob29kUS5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuTk9ERV9ORUlHSEJPUixcbiAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgbmVpZ2hib3I6IG5laWdoYm9yXG4gICAgICB9KTtcblxuICAgICAgLy8gdGhlIHF1ZXJ5IGluIHRoZSBzZWxlY3RvciBzaG91bGQgYmUgdGhlIG5laWdoYm91cmhvb2QgcmF0aGVyIHRoYW4gdGhlIG5vZGVcbiAgICAgIHJlcGxhY2VMYXN0UXVlcnkoc2VsZWN0b3IsIHF1ZXJ5LCBuaG9vZFEpO1xuICAgICAgcmV0dXJuIG5laWdoYm9yOyAvLyBub3cgcG9wdWxhdGluZyB0aGUgbmVpZ2hib3Igd2l0aCBmb2xsb3dpbmcgZXhwcmVzc2lvbnNcbiAgICB9XG4gIH1cbn0sIHtcbiAgbmFtZTogJ2NoaWxkJyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLmNoaWxkLFxuICBwb3B1bGF0ZTogZnVuY3Rpb24gcG9wdWxhdGUoc2VsZWN0b3IsIHF1ZXJ5KSB7XG4gICAgaWYgKHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID09IG51bGwpIHtcbiAgICAgIC8vIGRlZmF1bHQ6IGNoaWxkIHF1ZXJ5XG4gICAgICB2YXIgcGFyZW50Q2hpbGRRdWVyeSA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgY2hpbGQgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCAtIDFdO1xuICAgICAgcGFyZW50Q2hpbGRRdWVyeS5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuQ0hJTEQsXG4gICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICBjaGlsZDogY2hpbGRcbiAgICAgIH0pO1xuXG4gICAgICAvLyB0aGUgcXVlcnkgaW4gdGhlIHNlbGVjdG9yIHNob3VsZCBiZSB0aGUgJz4nIGl0c2VsZlxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIHBhcmVudENoaWxkUXVlcnkpO1xuICAgICAgc2VsZWN0b3IuY29tcG91bmRDb3VudCsrO1xuXG4gICAgICAvLyB3ZSdyZSBub3cgcG9wdWxhdGluZyB0aGUgY2hpbGQgcXVlcnkgd2l0aCBleHByZXNzaW9ucyB0aGF0IGZvbGxvd1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPT09IHF1ZXJ5KSB7XG4gICAgICAvLyBjb21wb3VuZCBzcGxpdCBxdWVyeVxuICAgICAgdmFyIGNvbXBvdW5kID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBsZWZ0ID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV07XG4gICAgICB2YXIgcmlnaHQgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIHN1YmplY3QgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIF9jaGlsZCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgX3BhcmVudCA9IG5ld1F1ZXJ5KCk7XG5cbiAgICAgIC8vIHNldCB1cCB0aGUgcm9vdCBjb21wb3VuZCBxXG4gICAgICBjb21wb3VuZC5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuQ09NUE9VTkRfU1BMSVQsXG4gICAgICAgIGxlZnQ6IGxlZnQsXG4gICAgICAgIHJpZ2h0OiByaWdodCxcbiAgICAgICAgc3ViamVjdDogc3ViamVjdFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHBvcHVsYXRlIHRoZSBzdWJqZWN0IGFuZCByZXBsYWNlIHRoZSBxIGF0IHRoZSBvbGQgc3BvdCAod2l0aGluIGxlZnQpIHdpdGggVFJVRVxuICAgICAgc3ViamVjdC5jaGVja3MgPSBxdWVyeS5jaGVja3M7IC8vIHRha2UgdGhlIGNoZWNrcyBmcm9tIHRoZSBsZWZ0XG4gICAgICBxdWVyeS5jaGVja3MgPSBbe1xuICAgICAgICB0eXBlOiBUeXBlLlRSVUVcbiAgICAgIH1dOyAvLyBjaGVja3MgdW5kZXIgbGVmdCByZWZzIHRoZSBzdWJqZWN0IGltcGxpY2l0bHlcblxuICAgICAgLy8gc2V0IHVwIHRoZSByaWdodCBxXG4gICAgICBfcGFyZW50LmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5UUlVFXG4gICAgICB9KTsgLy8gcGFyZW50IGltcGxpY2l0bHkgcmVmcyB0aGUgc3ViamVjdFxuICAgICAgcmlnaHQuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLlBBUkVOVCxcbiAgICAgICAgLy8gdHlwZSBpcyBzd2FwcGVkIG9uIHJpZ2h0IHNpZGUgcXVlcmllc1xuICAgICAgICBwYXJlbnQ6IF9wYXJlbnQsXG4gICAgICAgIGNoaWxkOiBfY2hpbGQgLy8gZW1wdHkgZm9yIG5vd1xuICAgICAgfSk7XG5cbiAgICAgIHJlcGxhY2VMYXN0UXVlcnkoc2VsZWN0b3IsIGxlZnQsIGNvbXBvdW5kKTtcblxuICAgICAgLy8gdXBkYXRlIHRoZSByZWYgc2luY2Ugd2UgbW92ZWQgdGhpbmdzIGFyb3VuZCBmb3IgYHF1ZXJ5YFxuICAgICAgc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPSBzdWJqZWN0O1xuICAgICAgc2VsZWN0b3IuY29tcG91bmRDb3VudCsrO1xuICAgICAgcmV0dXJuIF9jaGlsZDsgLy8gbm93IHBvcHVsYXRpbmcgdGhlIHJpZ2h0IHNpZGUncyBjaGlsZFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBwYXJlbnQgcXVlcnlcbiAgICAgIC8vIGluZm8gZm9yIHBhcmVudCBxdWVyeVxuICAgICAgdmFyIF9wYXJlbnQyID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBfY2hpbGQyID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBwY1FDaGVja3MgPSBbe1xuICAgICAgICB0eXBlOiBUeXBlLlBBUkVOVCxcbiAgICAgICAgcGFyZW50OiBfcGFyZW50MixcbiAgICAgICAgY2hpbGQ6IF9jaGlsZDJcbiAgICAgIH1dO1xuXG4gICAgICAvLyB0aGUgcGFyZW50LWNoaWxkIHF1ZXJ5IHRha2VzIHRoZSBwbGFjZSBvZiB0aGUgcXVlcnkgcHJldmlvdXNseSBiZWluZyBwb3B1bGF0ZWRcbiAgICAgIF9wYXJlbnQyLmNoZWNrcyA9IHF1ZXJ5LmNoZWNrczsgLy8gdGhlIHByZXZpb3VzIHF1ZXJ5IGNvbnRhaW5zIHRoZSBjaGVja3MgZm9yIHRoZSBwYXJlbnRcbiAgICAgIHF1ZXJ5LmNoZWNrcyA9IHBjUUNoZWNrczsgLy8gcGMgcXVlcnkgdGFrZXMgb3ZlclxuXG4gICAgICBzZWxlY3Rvci5jb21wb3VuZENvdW50Kys7XG4gICAgICByZXR1cm4gX2NoaWxkMjsgLy8gd2UncmUgbm93IHBvcHVsYXRpbmcgdGhlIGNoaWxkXG4gICAgfVxuICB9XG59LCB7XG4gIG5hbWU6ICdkZXNjZW5kYW50JyxcbiAgc2VwYXJhdG9yOiB0cnVlLFxuICByZWdleDogdG9rZW5zLmRlc2NlbmRhbnQsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgPT0gbnVsbCkge1xuICAgICAgLy8gZGVmYXVsdDogZGVzY2VuZGFudCBxdWVyeVxuICAgICAgdmFyIGFuY0NoUXVlcnkgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGRlc2NlbmRhbnQgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGFuY2VzdG9yID0gc2VsZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV07XG4gICAgICBhbmNDaFF1ZXJ5LmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5ERVNDRU5EQU5ULFxuICAgICAgICBhbmNlc3RvcjogYW5jZXN0b3IsXG4gICAgICAgIGRlc2NlbmRhbnQ6IGRlc2NlbmRhbnRcbiAgICAgIH0pO1xuXG4gICAgICAvLyB0aGUgcXVlcnkgaW4gdGhlIHNlbGVjdG9yIHNob3VsZCBiZSB0aGUgJz4nIGl0c2VsZlxuICAgICAgcmVwbGFjZUxhc3RRdWVyeShzZWxlY3RvciwgcXVlcnksIGFuY0NoUXVlcnkpO1xuICAgICAgc2VsZWN0b3IuY29tcG91bmRDb3VudCsrO1xuXG4gICAgICAvLyB3ZSdyZSBub3cgcG9wdWxhdGluZyB0aGUgZGVzY2VuZGFudCBxdWVyeSB3aXRoIGV4cHJlc3Npb25zIHRoYXQgZm9sbG93XG4gICAgICByZXR1cm4gZGVzY2VuZGFudDtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID09PSBxdWVyeSkge1xuICAgICAgLy8gY29tcG91bmQgc3BsaXQgcXVlcnlcbiAgICAgIHZhciBjb21wb3VuZCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgbGVmdCA9IHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIHJpZ2h0ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBzdWJqZWN0ID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBfZGVzY2VuZGFudCA9IG5ld1F1ZXJ5KCk7XG4gICAgICB2YXIgX2FuY2VzdG9yID0gbmV3UXVlcnkoKTtcblxuICAgICAgLy8gc2V0IHVwIHRoZSByb290IGNvbXBvdW5kIHFcbiAgICAgIGNvbXBvdW5kLmNoZWNrcy5wdXNoKHtcbiAgICAgICAgdHlwZTogVHlwZS5DT01QT1VORF9TUExJVCxcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgICBzdWJqZWN0OiBzdWJqZWN0XG4gICAgICB9KTtcblxuICAgICAgLy8gcG9wdWxhdGUgdGhlIHN1YmplY3QgYW5kIHJlcGxhY2UgdGhlIHEgYXQgdGhlIG9sZCBzcG90ICh3aXRoaW4gbGVmdCkgd2l0aCBUUlVFXG4gICAgICBzdWJqZWN0LmNoZWNrcyA9IHF1ZXJ5LmNoZWNrczsgLy8gdGFrZSB0aGUgY2hlY2tzIGZyb20gdGhlIGxlZnRcbiAgICAgIHF1ZXJ5LmNoZWNrcyA9IFt7XG4gICAgICAgIHR5cGU6IFR5cGUuVFJVRVxuICAgICAgfV07IC8vIGNoZWNrcyB1bmRlciBsZWZ0IHJlZnMgdGhlIHN1YmplY3QgaW1wbGljaXRseVxuXG4gICAgICAvLyBzZXQgdXAgdGhlIHJpZ2h0IHFcbiAgICAgIF9hbmNlc3Rvci5jaGVja3MucHVzaCh7XG4gICAgICAgIHR5cGU6IFR5cGUuVFJVRVxuICAgICAgfSk7IC8vIGFuY2VzdG9yIGltcGxpY2l0bHkgcmVmcyB0aGUgc3ViamVjdFxuICAgICAgcmlnaHQuY2hlY2tzLnB1c2goe1xuICAgICAgICB0eXBlOiBUeXBlLkFOQ0VTVE9SLFxuICAgICAgICAvLyB0eXBlIGlzIHN3YXBwZWQgb24gcmlnaHQgc2lkZSBxdWVyaWVzXG4gICAgICAgIGFuY2VzdG9yOiBfYW5jZXN0b3IsXG4gICAgICAgIGRlc2NlbmRhbnQ6IF9kZXNjZW5kYW50IC8vIGVtcHR5IGZvciBub3dcbiAgICAgIH0pO1xuXG4gICAgICByZXBsYWNlTGFzdFF1ZXJ5KHNlbGVjdG9yLCBsZWZ0LCBjb21wb3VuZCk7XG5cbiAgICAgIC8vIHVwZGF0ZSB0aGUgcmVmIHNpbmNlIHdlIG1vdmVkIHRoaW5ncyBhcm91bmQgZm9yIGBxdWVyeWBcbiAgICAgIHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID0gc3ViamVjdDtcbiAgICAgIHNlbGVjdG9yLmNvbXBvdW5kQ291bnQrKztcbiAgICAgIHJldHVybiBfZGVzY2VuZGFudDsgLy8gbm93IHBvcHVsYXRpbmcgdGhlIHJpZ2h0IHNpZGUncyBkZXNjZW5kYW50XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFuY2VzdG9yIHF1ZXJ5XG4gICAgICAvLyBpbmZvIGZvciBwYXJlbnQgcXVlcnlcbiAgICAgIHZhciBfYW5jZXN0b3IyID0gbmV3UXVlcnkoKTtcbiAgICAgIHZhciBfZGVzY2VuZGFudDIgPSBuZXdRdWVyeSgpO1xuICAgICAgdmFyIGFkUUNoZWNrcyA9IFt7XG4gICAgICAgIHR5cGU6IFR5cGUuQU5DRVNUT1IsXG4gICAgICAgIGFuY2VzdG9yOiBfYW5jZXN0b3IyLFxuICAgICAgICBkZXNjZW5kYW50OiBfZGVzY2VuZGFudDJcbiAgICAgIH1dO1xuXG4gICAgICAvLyB0aGUgcGFyZW50LWNoaWxkIHF1ZXJ5IHRha2VzIHRoZSBwbGFjZSBvZiB0aGUgcXVlcnkgcHJldmlvdXNseSBiZWluZyBwb3B1bGF0ZWRcbiAgICAgIF9hbmNlc3RvcjIuY2hlY2tzID0gcXVlcnkuY2hlY2tzOyAvLyB0aGUgcHJldmlvdXMgcXVlcnkgY29udGFpbnMgdGhlIGNoZWNrcyBmb3IgdGhlIHBhcmVudFxuICAgICAgcXVlcnkuY2hlY2tzID0gYWRRQ2hlY2tzOyAvLyBwYyBxdWVyeSB0YWtlcyBvdmVyXG5cbiAgICAgIHNlbGVjdG9yLmNvbXBvdW5kQ291bnQrKztcbiAgICAgIHJldHVybiBfZGVzY2VuZGFudDI7IC8vIHdlJ3JlIG5vdyBwb3B1bGF0aW5nIHRoZSBjaGlsZFxuICAgIH1cbiAgfVxufSwge1xuICBuYW1lOiAnc3ViamVjdCcsXG4gIG1vZGlmaWVyOiB0cnVlLFxuICByZWdleDogdG9rZW5zLnN1YmplY3QsXG4gIHBvcHVsYXRlOiBmdW5jdGlvbiBwb3B1bGF0ZShzZWxlY3RvciwgcXVlcnkpIHtcbiAgICBpZiAoc2VsZWN0b3IuY3VycmVudFN1YmplY3QgIT0gbnVsbCAmJiBzZWxlY3Rvci5jdXJyZW50U3ViamVjdCAhPT0gcXVlcnkpIHtcbiAgICAgIHdhcm4oJ1JlZGVmaW5pdGlvbiBvZiBzdWJqZWN0IGluIHNlbGVjdG9yIGAnICsgc2VsZWN0b3IudG9TdHJpbmcoKSArICdgJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHNlbGVjdG9yLmN1cnJlbnRTdWJqZWN0ID0gcXVlcnk7XG4gICAgdmFyIHRvcFEgPSBzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGggLSAxXTtcbiAgICB2YXIgdG9wQ2hrID0gdG9wUS5jaGVja3NbMF07XG4gICAgdmFyIHRvcFR5cGUgPSB0b3BDaGsgPT0gbnVsbCA/IG51bGwgOiB0b3BDaGsudHlwZTtcbiAgICBpZiAodG9wVHlwZSA9PT0gVHlwZS5ESVJFQ1RFRF9FREdFKSB7XG4gICAgICAvLyBkaXJlY3RlZCBlZGdlIHdpdGggc3ViamVjdCBvbiB0aGUgdGFyZ2V0XG5cbiAgICAgIC8vIGNoYW5nZSB0byB0YXJnZXQgbm9kZSBjaGVja1xuICAgICAgdG9wQ2hrLnR5cGUgPSBUeXBlLk5PREVfVEFSR0VUO1xuICAgIH0gZWxzZSBpZiAodG9wVHlwZSA9PT0gVHlwZS5VTkRJUkVDVEVEX0VER0UpIHtcbiAgICAgIC8vIHVuZGlyZWN0ZWQgZWRnZSB3aXRoIHN1YmplY3Qgb24gdGhlIHNlY29uZCBub2RlXG5cbiAgICAgIC8vIGNoYW5nZSB0byBuZWlnaGJvciBjaGVja1xuICAgICAgdG9wQ2hrLnR5cGUgPSBUeXBlLk5PREVfTkVJR0hCT1I7XG4gICAgICB0b3BDaGsubm9kZSA9IHRvcENoay5ub2Rlc1sxXTsgLy8gc2Vjb25kIG5vZGUgaXMgc3ViamVjdFxuICAgICAgdG9wQ2hrLm5laWdoYm9yID0gdG9wQ2hrLm5vZGVzWzBdO1xuXG4gICAgICAvLyBjbGVhbiB1cCB1bnVzZWQgZmllbGRzIGZvciBuZXcgdHlwZVxuICAgICAgdG9wQ2hrLm5vZGVzID0gbnVsbDtcbiAgICB9XG4gIH1cbn1dO1xuZXhwcnMuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICByZXR1cm4gZS5yZWdleE9iaiA9IG5ldyBSZWdFeHAoJ14nICsgZS5yZWdleCk7XG59KTtcblxuLyoqXG4gKiBPZiBhbGwgdGhlIGV4cHJlc3Npb25zLCBmaW5kIHRoZSBmaXJzdCBtYXRjaCBpbiB0aGUgcmVtYWluaW5nIHRleHQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtYWluaW5nIFRoZSByZW1haW5pbmcgdGV4dCB0byBwYXJzZVxuICogQHJldHVybnMgVGhlIG1hdGNoZWQgZXhwcmVzc2lvbiBhbmQgdGhlIG5ld2x5IHJlbWFpbmluZyB0ZXh0IGB7IGV4cHIsIG1hdGNoLCBuYW1lLCByZW1haW5pbmcgfWBcbiAqL1xudmFyIGNvbnN1bWVFeHByID0gZnVuY3Rpb24gY29uc3VtZUV4cHIocmVtYWluaW5nKSB7XG4gIHZhciBleHByO1xuICB2YXIgbWF0Y2g7XG4gIHZhciBuYW1lO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IGV4cHJzLmxlbmd0aDsgaisrKSB7XG4gICAgdmFyIGUgPSBleHByc1tqXTtcbiAgICB2YXIgbiA9IGUubmFtZTtcbiAgICB2YXIgbSA9IHJlbWFpbmluZy5tYXRjaChlLnJlZ2V4T2JqKTtcbiAgICBpZiAobSAhPSBudWxsKSB7XG4gICAgICBtYXRjaCA9IG07XG4gICAgICBleHByID0gZTtcbiAgICAgIG5hbWUgPSBuO1xuICAgICAgdmFyIGNvbnN1bWVkID0gbVswXTtcbiAgICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZy5zdWJzdHJpbmcoY29uc3VtZWQubGVuZ3RoKTtcbiAgICAgIGJyZWFrOyAvLyB3ZSd2ZSBjb25zdW1lZCBvbmUgZXhwciwgc28gd2UgY2FuIHJldHVybiBub3dcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGV4cHI6IGV4cHIsXG4gICAgbWF0Y2g6IG1hdGNoLFxuICAgIG5hbWU6IG5hbWUsXG4gICAgcmVtYWluaW5nOiByZW1haW5pbmdcbiAgfTtcbn07XG5cbi8qKlxuICogQ29uc3VtZSBhbGwgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlbWFpbmluZyBUaGUgdGV4dCB0byBjb25zdW1lXG4gKiBAcmV0dXJucyBUaGUgdGV4dCB3aXRoIHRoZSBsZWFkaW5nIHdoaXRlc3BhY2UgcmVtb3ZlZFxuICovXG52YXIgY29uc3VtZVdoaXRlc3BhY2UgPSBmdW5jdGlvbiBjb25zdW1lV2hpdGVzcGFjZShyZW1haW5pbmcpIHtcbiAgdmFyIG1hdGNoID0gcmVtYWluaW5nLm1hdGNoKC9eXFxzKy8pO1xuICBpZiAobWF0Y2gpIHtcbiAgICB2YXIgY29uc3VtZWQgPSBtYXRjaFswXTtcbiAgICByZW1haW5pbmcgPSByZW1haW5pbmcuc3Vic3RyaW5nKGNvbnN1bWVkLmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIHJlbWFpbmluZztcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIHN0cmluZyBhbmQgc3RvcmUgdGhlIHBhcnNlZCByZXByZXNlbnRhdGlvbiBpbiB0aGUgU2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHN0cmluZ1xuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBzZWxlY3RvciB3YXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZCwgYGZhbHNlYCBvdGhlcndpc2VcbiAqL1xudmFyIHBhcnNlID0gZnVuY3Rpb24gcGFyc2Uoc2VsZWN0b3IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcmVtYWluaW5nID0gc2VsZi5pbnB1dFRleHQgPSBzZWxlY3RvcjtcbiAgdmFyIGN1cnJlbnRRdWVyeSA9IHNlbGZbMF0gPSBuZXdRdWVyeSgpO1xuICBzZWxmLmxlbmd0aCA9IDE7XG4gIHJlbWFpbmluZyA9IGNvbnN1bWVXaGl0ZXNwYWNlKHJlbWFpbmluZyk7IC8vIGdldCByaWQgb2YgbGVhZGluZyB3aGl0ZXNwYWNlXG5cbiAgZm9yICg7Oykge1xuICAgIHZhciBleHBySW5mbyA9IGNvbnN1bWVFeHByKHJlbWFpbmluZyk7XG4gICAgaWYgKGV4cHJJbmZvLmV4cHIgPT0gbnVsbCkge1xuICAgICAgd2FybignVGhlIHNlbGVjdG9yIGAnICsgc2VsZWN0b3IgKyAnYGlzIGludmFsaWQnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyZ3MgPSBleHBySW5mby5tYXRjaC5zbGljZSgxKTtcblxuICAgICAgLy8gbGV0IHRoZSB0b2tlbiBwb3B1bGF0ZSB0aGUgc2VsZWN0b3Igb2JqZWN0IGluIGN1cnJlbnRRdWVyeVxuICAgICAgdmFyIHJldCA9IGV4cHJJbmZvLmV4cHIucG9wdWxhdGUoc2VsZiwgY3VycmVudFF1ZXJ5LCBhcmdzKTtcbiAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gZXhpdCBpZiBwb3B1bGF0aW9uIGZhaWxlZFxuICAgICAgfSBlbHNlIGlmIChyZXQgIT0gbnVsbCkge1xuICAgICAgICBjdXJyZW50UXVlcnkgPSByZXQ7IC8vIGNoYW5nZSB0aGUgY3VycmVudCBxdWVyeSB0byBiZSBmaWxsZWQgaWYgdGhlIGV4cHIgc3BlY2lmaWVzXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVtYWluaW5nID0gZXhwckluZm8ucmVtYWluaW5nO1xuXG4gICAgLy8gd2UncmUgZG9uZSB3aGVuIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIHBhcnNlXG4gICAgaWYgKHJlbWFpbmluZy5tYXRjaCgvXlxccyokLykpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB2YXIgbGFzdFEgPSBzZWxmW3NlbGYubGVuZ3RoIC0gMV07XG4gIGlmIChzZWxmLmN1cnJlbnRTdWJqZWN0ICE9IG51bGwpIHtcbiAgICBsYXN0US5zdWJqZWN0ID0gc2VsZi5jdXJyZW50U3ViamVjdDtcbiAgfVxuICBsYXN0US5lZGdlQ291bnQgPSBzZWxmLmVkZ2VDb3VudDtcbiAgbGFzdFEuY29tcG91bmRDb3VudCA9IHNlbGYuY29tcG91bmRDb3VudDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHEgPSBzZWxmW2ldO1xuXG4gICAgLy8gaW4gZnV0dXJlLCB0aGlzIGNvdWxkIHBvdGVudGlhbGx5IGJlIGFsbG93ZWQgaWYgdGhlcmUgd2VyZSBvcGVyYXRvciBwcmVjZWRlbmNlIGFuZCBkZXRlY3Rpb24gb2YgaW52YWxpZCBjb21iaW5hdGlvbnNcbiAgICBpZiAocS5jb21wb3VuZENvdW50ID4gMCAmJiBxLmVkZ2VDb3VudCA+IDApIHtcbiAgICAgIHdhcm4oJ1RoZSBzZWxlY3RvciBgJyArIHNlbGVjdG9yICsgJ2AgaXMgaW52YWxpZCBiZWNhdXNlIGl0IHVzZXMgYm90aCBhIGNvbXBvdW5kIHNlbGVjdG9yIGFuZCBhbiBlZGdlIHNlbGVjdG9yJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChxLmVkZ2VDb3VudCA+IDEpIHtcbiAgICAgIHdhcm4oJ1RoZSBzZWxlY3RvciBgJyArIHNlbGVjdG9yICsgJ2AgaXMgaW52YWxpZCBiZWNhdXNlIGl0IHVzZXMgbXVsdGlwbGUgZWRnZSBzZWxlY3RvcnMnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHEuZWRnZUNvdW50ID09PSAxKSB7XG4gICAgICB3YXJuKCdUaGUgc2VsZWN0b3IgYCcgKyBzZWxlY3RvciArICdgIGlzIGRlcHJlY2F0ZWQuICBFZGdlIHNlbGVjdG9ycyBkbyBub3QgdGFrZSBlZmZlY3Qgb24gY2hhbmdlcyB0byBzb3VyY2UgYW5kIHRhcmdldCBub2RlcyBhZnRlciBhbiBlZGdlIGlzIGFkZGVkLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gIFVzZSBhIGNsYXNzIG9yIGRhdGEgc2VsZWN0b3Igb24gZWRnZXMgaW5zdGVhZCwgdXBkYXRpbmcgdGhlIGNsYXNzIG9yIGRhdGEgb2YgYW4gZWRnZSB3aGVuIHlvdXIgYXBwIGRldGVjdHMgYSBjaGFuZ2UgaW4gc291cmNlIG9yIHRhcmdldCBub2Rlcy4nKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7IC8vIHN1Y2Nlc3Ncbn07XG5cbi8qKlxuICogR2V0IHRoZSBzZWxlY3RvciByZXByZXNlbnRlZCBhcyBhIHN0cmluZy4gIFRoaXMgdmFsdWUgdXNlcyBkZWZhdWx0IGZvcm1hdHRpbmcsXG4gKiBzbyB0aGluZ3MgbGlrZSBzcGFjaW5nIG1heSBkaWZmZXIgZnJvbSB0aGUgaW5wdXQgdGV4dCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbGVjdG9yIHN0cmluZ1xuICovXG52YXIgdG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgaWYgKHRoaXMudG9TdHJpbmdDYWNoZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMudG9TdHJpbmdDYWNoZTtcbiAgfVxuICB2YXIgY2xlYW4gPSBmdW5jdGlvbiBjbGVhbihvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gIH07XG4gIHZhciBjbGVhblZhbCA9IGZ1bmN0aW9uIGNsZWFuVmFsKHZhbCkge1xuICAgIGlmIChzdHJpbmcodmFsKSkge1xuICAgICAgcmV0dXJuICdcIicgKyB2YWwgKyAnXCInO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY2xlYW4odmFsKTtcbiAgICB9XG4gIH07XG4gIHZhciBzcGFjZSA9IGZ1bmN0aW9uIHNwYWNlKHZhbCkge1xuICAgIHJldHVybiAnICcgKyB2YWwgKyAnICc7XG4gIH07XG4gIHZhciBjaGVja1RvU3RyaW5nID0gZnVuY3Rpb24gY2hlY2tUb1N0cmluZyhjaGVjaywgc3ViamVjdCkge1xuICAgIHZhciB0eXBlID0gY2hlY2sudHlwZSxcbiAgICAgIHZhbHVlID0gY2hlY2sudmFsdWU7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFR5cGUuR1JPVVA6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgZ3JvdXAgPSBjbGVhbih2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGdyb3VwLnN1YnN0cmluZygwLCBncm91cC5sZW5ndGggLSAxKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLkRBVEFfQ09NUEFSRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBmaWVsZCA9IGNoZWNrLmZpZWxkLFxuICAgICAgICAgICAgb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcjtcbiAgICAgICAgICByZXR1cm4gJ1snICsgZmllbGQgKyBzcGFjZShjbGVhbihvcGVyYXRvcikpICsgY2xlYW5WYWwodmFsdWUpICsgJ10nO1xuICAgICAgICB9XG4gICAgICBjYXNlIFR5cGUuREFUQV9CT09MOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9vcGVyYXRvciA9IGNoZWNrLm9wZXJhdG9yLFxuICAgICAgICAgICAgX2ZpZWxkID0gY2hlY2suZmllbGQ7XG4gICAgICAgICAgcmV0dXJuICdbJyArIGNsZWFuKF9vcGVyYXRvcikgKyBfZmllbGQgKyAnXSc7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHlwZS5EQVRBX0VYSVNUOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9maWVsZDIgPSBjaGVjay5maWVsZDtcbiAgICAgICAgICByZXR1cm4gJ1snICsgX2ZpZWxkMiArICddJztcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLk1FVEFfQ09NUEFSRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfb3BlcmF0b3IyID0gY2hlY2sub3BlcmF0b3IsXG4gICAgICAgICAgICBfZmllbGQzID0gY2hlY2suZmllbGQ7XG4gICAgICAgICAgcmV0dXJuICdbWycgKyBfZmllbGQzICsgc3BhY2UoY2xlYW4oX29wZXJhdG9yMikpICsgY2xlYW5WYWwodmFsdWUpICsgJ11dJztcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLlNUQVRFOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICBjYXNlIFR5cGUuSUQ6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gJyMnICsgdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHlwZS5DTEFTUzpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiAnLicgKyB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLlBBUkVOVDpcbiAgICAgIGNhc2UgVHlwZS5DSElMRDpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBxdWVyeVRvU3RyaW5nKGNoZWNrLnBhcmVudCwgc3ViamVjdCkgKyBzcGFjZSgnPicpICsgcXVlcnlUb1N0cmluZyhjaGVjay5jaGlsZCwgc3ViamVjdCk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHlwZS5BTkNFU1RPUjpcbiAgICAgIGNhc2UgVHlwZS5ERVNDRU5EQU5UOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHF1ZXJ5VG9TdHJpbmcoY2hlY2suYW5jZXN0b3IsIHN1YmplY3QpICsgJyAnICsgcXVlcnlUb1N0cmluZyhjaGVjay5kZXNjZW5kYW50LCBzdWJqZWN0KTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBUeXBlLkNPTVBPVU5EX1NQTElUOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxocyA9IHF1ZXJ5VG9TdHJpbmcoY2hlY2subGVmdCwgc3ViamVjdCk7XG4gICAgICAgICAgdmFyIHN1YiA9IHF1ZXJ5VG9TdHJpbmcoY2hlY2suc3ViamVjdCwgc3ViamVjdCk7XG4gICAgICAgICAgdmFyIHJocyA9IHF1ZXJ5VG9TdHJpbmcoY2hlY2sucmlnaHQsIHN1YmplY3QpO1xuICAgICAgICAgIHJldHVybiBsaHMgKyAobGhzLmxlbmd0aCA+IDAgPyAnICcgOiAnJykgKyBzdWIgKyByaHM7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHlwZS5UUlVFOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgcXVlcnlUb1N0cmluZyA9IGZ1bmN0aW9uIHF1ZXJ5VG9TdHJpbmcocXVlcnksIHN1YmplY3QpIHtcbiAgICByZXR1cm4gcXVlcnkuY2hlY2tzLnJlZHVjZShmdW5jdGlvbiAoc3RyLCBjaGssIGkpIHtcbiAgICAgIHJldHVybiBzdHIgKyAoc3ViamVjdCA9PT0gcXVlcnkgJiYgaSA9PT0gMCA/ICckJyA6ICcnKSArIGNoZWNrVG9TdHJpbmcoY2hrLCBzdWJqZWN0KTtcbiAgICB9LCAnJyk7XG4gIH07XG4gIHZhciBzdHIgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHF1ZXJ5ID0gdGhpc1tpXTtcbiAgICBzdHIgKz0gcXVlcnlUb1N0cmluZyhxdWVyeSwgcXVlcnkuc3ViamVjdCk7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMSAmJiBpIDwgdGhpcy5sZW5ndGggLSAxKSB7XG4gICAgICBzdHIgKz0gJywgJztcbiAgICB9XG4gIH1cbiAgdGhpcy50b1N0cmluZ0NhY2hlID0gc3RyO1xuICByZXR1cm4gc3RyO1xufTtcbnZhciBwYXJzZSQxID0ge1xuICBwYXJzZTogcGFyc2UsXG4gIHRvU3RyaW5nOiB0b1N0cmluZ1xufTtcblxudmFyIHZhbENtcCA9IGZ1bmN0aW9uIHZhbENtcChmaWVsZFZhbCwgb3BlcmF0b3IsIHZhbHVlKSB7XG4gIHZhciBtYXRjaGVzO1xuICB2YXIgaXNGaWVsZFN0ciA9IHN0cmluZyhmaWVsZFZhbCk7XG4gIHZhciBpc0ZpZWxkTnVtID0gbnVtYmVyJDEoZmllbGRWYWwpO1xuICB2YXIgaXNWYWxTdHIgPSBzdHJpbmcodmFsdWUpO1xuICB2YXIgZmllbGRTdHIsIHZhbFN0cjtcbiAgdmFyIGNhc2VJbnNlbnNpdGl2ZSA9IGZhbHNlO1xuICB2YXIgbm90RXhwciA9IGZhbHNlO1xuICB2YXIgaXNJbmVxQ21wID0gZmFsc2U7XG4gIGlmIChvcGVyYXRvci5pbmRleE9mKCchJykgPj0gMCkge1xuICAgIG9wZXJhdG9yID0gb3BlcmF0b3IucmVwbGFjZSgnIScsICcnKTtcbiAgICBub3RFeHByID0gdHJ1ZTtcbiAgfVxuICBpZiAob3BlcmF0b3IuaW5kZXhPZignQCcpID49IDApIHtcbiAgICBvcGVyYXRvciA9IG9wZXJhdG9yLnJlcGxhY2UoJ0AnLCAnJyk7XG4gICAgY2FzZUluc2Vuc2l0aXZlID0gdHJ1ZTtcbiAgfVxuICBpZiAoaXNGaWVsZFN0ciB8fCBpc1ZhbFN0ciB8fCBjYXNlSW5zZW5zaXRpdmUpIHtcbiAgICBmaWVsZFN0ciA9ICFpc0ZpZWxkU3RyICYmICFpc0ZpZWxkTnVtID8gJycgOiAnJyArIGZpZWxkVmFsO1xuICAgIHZhbFN0ciA9ICcnICsgdmFsdWU7XG4gIH1cblxuICAvLyBpZiB3ZSdyZSBkb2luZyBhIGNhc2UgaW5zZW5zaXRpdmUgY29tcGFyaXNvbiwgdGhlbiB3ZSdyZSB1c2luZyBhIFNUUklORyBjb21wYXJpc29uXG4gIC8vIGV2ZW4gaWYgd2UncmUgY29tcGFyaW5nIG51bWJlcnNcbiAgaWYgKGNhc2VJbnNlbnNpdGl2ZSkge1xuICAgIGZpZWxkVmFsID0gZmllbGRTdHIgPSBmaWVsZFN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbHVlID0gdmFsU3RyID0gdmFsU3RyLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgIGNhc2UgJyo9JzpcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFN0ci5pbmRleE9mKHZhbFN0cikgPj0gMDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJyQ9JzpcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFN0ci5pbmRleE9mKHZhbFN0ciwgZmllbGRTdHIubGVuZ3RoIC0gdmFsU3RyLmxlbmd0aCkgPj0gMDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ149JzpcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFN0ci5pbmRleE9mKHZhbFN0cikgPT09IDA7XG4gICAgICBicmVhaztcbiAgICBjYXNlICc9JzpcbiAgICAgIG1hdGNoZXMgPSBmaWVsZFZhbCA9PT0gdmFsdWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlICc+JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPiB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJz49JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPj0gdmFsdWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlICc8JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPCB2YWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJzw9JzpcbiAgICAgIGlzSW5lcUNtcCA9IHRydWU7XG4gICAgICBtYXRjaGVzID0gZmllbGRWYWwgPD0gdmFsdWU7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgbWF0Y2hlcyA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICAvLyBhcHBseSB0aGUgbm90IG9wLCBidXQgbnVsbCB2YWxzIGZvciBpbmVxdWFsaXRpZXMgc2hvdWxkIGFsd2F5cyBzdGF5IG5vbi1tYXRjaGluZ1xuICBpZiAobm90RXhwciAmJiAoZmllbGRWYWwgIT0gbnVsbCB8fCAhaXNJbmVxQ21wKSkge1xuICAgIG1hdGNoZXMgPSAhbWF0Y2hlcztcbiAgfVxuICByZXR1cm4gbWF0Y2hlcztcbn07XG52YXIgYm9vbENtcCA9IGZ1bmN0aW9uIGJvb2xDbXAoZmllbGRWYWwsIG9wZXJhdG9yKSB7XG4gIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICBjYXNlICc/JzpcbiAgICAgIHJldHVybiBmaWVsZFZhbCA/IHRydWUgOiBmYWxzZTtcbiAgICBjYXNlICchJzpcbiAgICAgIHJldHVybiBmaWVsZFZhbCA/IGZhbHNlIDogdHJ1ZTtcbiAgICBjYXNlICdeJzpcbiAgICAgIHJldHVybiBmaWVsZFZhbCA9PT0gdW5kZWZpbmVkO1xuICB9XG59O1xudmFyIGV4aXN0Q21wID0gZnVuY3Rpb24gZXhpc3RDbXAoZmllbGRWYWwpIHtcbiAgcmV0dXJuIGZpZWxkVmFsICE9PSB1bmRlZmluZWQ7XG59O1xudmFyIGRhdGEkMSA9IGZ1bmN0aW9uIGRhdGEoZWxlLCBmaWVsZCkge1xuICByZXR1cm4gZWxlLmRhdGEoZmllbGQpO1xufTtcbnZhciBtZXRhID0gZnVuY3Rpb24gbWV0YShlbGUsIGZpZWxkKSB7XG4gIHJldHVybiBlbGVbZmllbGRdKCk7XG59O1xuXG4vKiogQSBsb29rdXAgb2YgYG1hdGNoKGNoZWNrLCBlbGUpYCBmdW5jdGlvbnMgYnkgYFR5cGVgIGludCAqL1xudmFyIG1hdGNoID0gW107XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBxdWVyeSBtYXRjaGVzIGZvciB0aGUgZWxlbWVudFxuICogQHBhcmFtIHF1ZXJ5IFRoZSBgeyB0eXBlLCB2YWx1ZSwgLi4uIH1gIHF1ZXJ5IG9iamVjdFxuICogQHBhcmFtIGVsZSBUaGUgZWxlbWVudCB0byBjb21wYXJlIGFnYWluc3RcbiovXG52YXIgbWF0Y2hlcyQxID0gZnVuY3Rpb24gbWF0Y2hlcyhxdWVyeSwgZWxlKSB7XG4gIHJldHVybiBxdWVyeS5jaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoaykge1xuICAgIHJldHVybiBtYXRjaFtjaGsudHlwZV0oY2hrLCBlbGUpO1xuICB9KTtcbn07XG5tYXRjaFtUeXBlLkdST1VQXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBncm91cCA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gZ3JvdXAgPT09ICcqJyB8fCBncm91cCA9PT0gZWxlLmdyb3VwKCk7XG59O1xubWF0Y2hbVHlwZS5TVEFURV0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICB2YXIgc3RhdGVTZWxlY3RvciA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gc3RhdGVTZWxlY3Rvck1hdGNoZXMoc3RhdGVTZWxlY3RvciwgZWxlKTtcbn07XG5tYXRjaFtUeXBlLklEXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBpZCA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gZWxlLmlkKCkgPT09IGlkO1xufTtcbm1hdGNoW1R5cGUuQ0xBU1NdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGNscyA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gZWxlLmhhc0NsYXNzKGNscyk7XG59O1xubWF0Y2hbVHlwZS5NRVRBX0NPTVBBUkVdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGZpZWxkID0gY2hlY2suZmllbGQsXG4gICAgb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcixcbiAgICB2YWx1ZSA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gdmFsQ21wKG1ldGEoZWxlLCBmaWVsZCksIG9wZXJhdG9yLCB2YWx1ZSk7XG59O1xubWF0Y2hbVHlwZS5EQVRBX0NPTVBBUkVdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGZpZWxkID0gY2hlY2suZmllbGQsXG4gICAgb3BlcmF0b3IgPSBjaGVjay5vcGVyYXRvcixcbiAgICB2YWx1ZSA9IGNoZWNrLnZhbHVlO1xuICByZXR1cm4gdmFsQ21wKGRhdGEkMShlbGUsIGZpZWxkKSwgb3BlcmF0b3IsIHZhbHVlKTtcbn07XG5tYXRjaFtUeXBlLkRBVEFfQk9PTF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICB2YXIgZmllbGQgPSBjaGVjay5maWVsZCxcbiAgICBvcGVyYXRvciA9IGNoZWNrLm9wZXJhdG9yO1xuICByZXR1cm4gYm9vbENtcChkYXRhJDEoZWxlLCBmaWVsZCksIG9wZXJhdG9yKTtcbn07XG5tYXRjaFtUeXBlLkRBVEFfRVhJU1RdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgdmFyIGZpZWxkID0gY2hlY2suZmllbGQ7XG4gICAgY2hlY2sub3BlcmF0b3I7XG4gIHJldHVybiBleGlzdENtcChkYXRhJDEoZWxlLCBmaWVsZCkpO1xufTtcbm1hdGNoW1R5cGUuVU5ESVJFQ1RFRF9FREdFXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBxQSA9IGNoZWNrLm5vZGVzWzBdO1xuICB2YXIgcUIgPSBjaGVjay5ub2Rlc1sxXTtcbiAgdmFyIHNyYyA9IGVsZS5zb3VyY2UoKTtcbiAgdmFyIHRndCA9IGVsZS50YXJnZXQoKTtcbiAgcmV0dXJuIG1hdGNoZXMkMShxQSwgc3JjKSAmJiBtYXRjaGVzJDEocUIsIHRndCkgfHwgbWF0Y2hlcyQxKHFCLCBzcmMpICYmIG1hdGNoZXMkMShxQSwgdGd0KTtcbn07XG5tYXRjaFtUeXBlLk5PREVfTkVJR0hCT1JdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgcmV0dXJuIG1hdGNoZXMkMShjaGVjay5ub2RlLCBlbGUpICYmIGVsZS5uZWlnaGJvcmhvb2QoKS5zb21lKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuIG4uaXNOb2RlKCkgJiYgbWF0Y2hlcyQxKGNoZWNrLm5laWdoYm9yLCBuKTtcbiAgfSk7XG59O1xubWF0Y2hbVHlwZS5ESVJFQ1RFRF9FREdFXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzJDEoY2hlY2suc291cmNlLCBlbGUuc291cmNlKCkpICYmIG1hdGNoZXMkMShjaGVjay50YXJnZXQsIGVsZS50YXJnZXQoKSk7XG59O1xubWF0Y2hbVHlwZS5OT0RFX1NPVVJDRV0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLnNvdXJjZSwgZWxlKSAmJiBlbGUub3V0Z29lcnMoKS5zb21lKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuIG4uaXNOb2RlKCkgJiYgbWF0Y2hlcyQxKGNoZWNrLnRhcmdldCwgbik7XG4gIH0pO1xufTtcbm1hdGNoW1R5cGUuTk9ERV9UQVJHRVRdID0gZnVuY3Rpb24gKGNoZWNrLCBlbGUpIHtcbiAgcmV0dXJuIG1hdGNoZXMkMShjaGVjay50YXJnZXQsIGVsZSkgJiYgZWxlLmluY29tZXJzKCkuc29tZShmdW5jdGlvbiAobikge1xuICAgIHJldHVybiBuLmlzTm9kZSgpICYmIG1hdGNoZXMkMShjaGVjay5zb3VyY2UsIG4pO1xuICB9KTtcbn07XG5tYXRjaFtUeXBlLkNISUxEXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzJDEoY2hlY2suY2hpbGQsIGVsZSkgJiYgbWF0Y2hlcyQxKGNoZWNrLnBhcmVudCwgZWxlLnBhcmVudCgpKTtcbn07XG5tYXRjaFtUeXBlLlBBUkVOVF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLnBhcmVudCwgZWxlKSAmJiBlbGUuY2hpbGRyZW4oKS5zb21lKGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuIG1hdGNoZXMkMShjaGVjay5jaGlsZCwgYyk7XG4gIH0pO1xufTtcbm1hdGNoW1R5cGUuREVTQ0VOREFOVF0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLmRlc2NlbmRhbnQsIGVsZSkgJiYgZWxlLmFuY2VzdG9ycygpLnNvbWUoZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLmFuY2VzdG9yLCBhKTtcbiAgfSk7XG59O1xubWF0Y2hbVHlwZS5BTkNFU1RPUl0gPSBmdW5jdGlvbiAoY2hlY2ssIGVsZSkge1xuICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLmFuY2VzdG9yLCBlbGUpICYmIGVsZS5kZXNjZW5kYW50cygpLnNvbWUoZnVuY3Rpb24gKGQpIHtcbiAgICByZXR1cm4gbWF0Y2hlcyQxKGNoZWNrLmRlc2NlbmRhbnQsIGQpO1xuICB9KTtcbn07XG5tYXRjaFtUeXBlLkNPTVBPVU5EX1NQTElUXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHJldHVybiBtYXRjaGVzJDEoY2hlY2suc3ViamVjdCwgZWxlKSAmJiBtYXRjaGVzJDEoY2hlY2subGVmdCwgZWxlKSAmJiBtYXRjaGVzJDEoY2hlY2sucmlnaHQsIGVsZSk7XG59O1xubWF0Y2hbVHlwZS5UUlVFXSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xubWF0Y2hbVHlwZS5DT0xMRUNUSU9OXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBjb2xsZWN0aW9uID0gY2hlY2sudmFsdWU7XG4gIHJldHVybiBjb2xsZWN0aW9uLmhhcyhlbGUpO1xufTtcbm1hdGNoW1R5cGUuRklMVEVSXSA9IGZ1bmN0aW9uIChjaGVjaywgZWxlKSB7XG4gIHZhciBmaWx0ZXIgPSBjaGVjay52YWx1ZTtcbiAgcmV0dXJuIGZpbHRlcihlbGUpO1xufTtcblxuLy8gZmlsdGVyIGFuIGV4aXN0aW5nIGNvbGxlY3Rpb25cbnZhciBmaWx0ZXIgPSBmdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgLy8gZm9yIDEgaWQgI2ZvbyBxdWVyaWVzLCBqdXN0IGdldCB0aGUgZWxlbWVudFxuICBpZiAoc2VsZi5sZW5ndGggPT09IDEgJiYgc2VsZlswXS5jaGVja3MubGVuZ3RoID09PSAxICYmIHNlbGZbMF0uY2hlY2tzWzBdLnR5cGUgPT09IFR5cGUuSUQpIHtcbiAgICByZXR1cm4gY29sbGVjdGlvbi5nZXRFbGVtZW50QnlJZChzZWxmWzBdLmNoZWNrc1swXS52YWx1ZSkuY29sbGVjdGlvbigpO1xuICB9XG4gIHZhciBzZWxlY3RvckZ1bmN0aW9uID0gZnVuY3Rpb24gc2VsZWN0b3JGdW5jdGlvbihlbGVtZW50KSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWxmLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgcXVlcnkgPSBzZWxmW2pdO1xuICAgICAgaWYgKG1hdGNoZXMkMShxdWVyeSwgZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgaWYgKHNlbGYudGV4dCgpID09IG51bGwpIHtcbiAgICBzZWxlY3RvckZ1bmN0aW9uID0gZnVuY3Rpb24gc2VsZWN0b3JGdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGNvbGxlY3Rpb24uZmlsdGVyKHNlbGVjdG9yRnVuY3Rpb24pO1xufTsgLy8gZmlsdGVyXG5cbi8vIGRvZXMgc2VsZWN0b3IgbWF0Y2ggYSBzaW5nbGUgZWxlbWVudD9cbnZhciBtYXRjaGVzID0gZnVuY3Rpb24gbWF0Y2hlcyhlbGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IHNlbGYubGVuZ3RoOyBqKyspIHtcbiAgICB2YXIgcXVlcnkgPSBzZWxmW2pdO1xuICAgIGlmIChtYXRjaGVzJDEocXVlcnksIGVsZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59OyAvLyBtYXRjaGVzXG5cbnZhciBtYXRjaGluZyA9IHtcbiAgbWF0Y2hlczogbWF0Y2hlcyxcbiAgZmlsdGVyOiBmaWx0ZXJcbn07XG5cbnZhciBTZWxlY3RvciA9IGZ1bmN0aW9uIFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIHRoaXMuaW5wdXRUZXh0ID0gc2VsZWN0b3I7XG4gIHRoaXMuY3VycmVudFN1YmplY3QgPSBudWxsO1xuICB0aGlzLmNvbXBvdW5kQ291bnQgPSAwO1xuICB0aGlzLmVkZ2VDb3VudCA9IDA7XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgaWYgKHNlbGVjdG9yID09IG51bGwgfHwgc3RyaW5nKHNlbGVjdG9yKSAmJiBzZWxlY3Rvci5tYXRjaCgvXlxccyokLykpIDsgZWxzZSBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihzZWxlY3RvcikpIHtcbiAgICB0aGlzLmFkZFF1ZXJ5KHtcbiAgICAgIGNoZWNrczogW3tcbiAgICAgICAgdHlwZTogVHlwZS5DT0xMRUNUSU9OLFxuICAgICAgICB2YWx1ZTogc2VsZWN0b3IuY29sbGVjdGlvbigpXG4gICAgICB9XVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGZuJDYoc2VsZWN0b3IpKSB7XG4gICAgdGhpcy5hZGRRdWVyeSh7XG4gICAgICBjaGVja3M6IFt7XG4gICAgICAgIHR5cGU6IFR5cGUuRklMVEVSLFxuICAgICAgICB2YWx1ZTogc2VsZWN0b3JcbiAgICAgIH1dXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoc3RyaW5nKHNlbGVjdG9yKSkge1xuICAgIGlmICghdGhpcy5wYXJzZShzZWxlY3RvcikpIHtcbiAgICAgIHRoaXMuaW52YWxpZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGVycm9yKCdBIHNlbGVjdG9yIG11c3QgYmUgY3JlYXRlZCBmcm9tIGEgc3RyaW5nOyBmb3VuZCAnKTtcbiAgfVxufTtcbnZhciBzZWxmbiA9IFNlbGVjdG9yLnByb3RvdHlwZTtcbltwYXJzZSQxLCBtYXRjaGluZ10uZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICByZXR1cm4gZXh0ZW5kKHNlbGZuLCBwKTtcbn0pO1xuc2VsZm4udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuaW5wdXRUZXh0O1xufTtcbnNlbGZuLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxlbmd0aDtcbn07XG5zZWxmbi5lcSA9IGZ1bmN0aW9uIChpKSB7XG4gIHJldHVybiB0aGlzW2ldO1xufTtcbnNlbGZuLnNhbWVUZXh0ID0gZnVuY3Rpb24gKG90aGVyU2VsKSB7XG4gIHJldHVybiAhdGhpcy5pbnZhbGlkICYmICFvdGhlclNlbC5pbnZhbGlkICYmIHRoaXMudGV4dCgpID09PSBvdGhlclNlbC50ZXh0KCk7XG59O1xuc2VsZm4uYWRkUXVlcnkgPSBmdW5jdGlvbiAocSkge1xuICB0aGlzW3RoaXMubGVuZ3RoKytdID0gcTtcbn07XG5zZWxmbi5zZWxlY3RvciA9IHNlbGZuLnRvU3RyaW5nO1xuXG52YXIgZWxlc2ZuJGcgPSB7XG4gIGFsbEFyZTogZnVuY3Rpb24gYWxsQXJlKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbE9iaiA9IG5ldyBTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgcmV0dXJuIHRoaXMuZXZlcnkoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIHNlbE9iai5tYXRjaGVzKGVsZSk7XG4gICAgfSk7XG4gIH0sXG4gIGlzOiBmdW5jdGlvbiBpcyhzZWxlY3Rvcikge1xuICAgIHZhciBzZWxPYmogPSBuZXcgU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIHJldHVybiB0aGlzLnNvbWUoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIHNlbE9iai5tYXRjaGVzKGVsZSk7XG4gICAgfSk7XG4gIH0sXG4gIHNvbWU6IGZ1bmN0aW9uIHNvbWUoZm4sIHRoaXNBcmcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZXQgPSAhdGhpc0FyZyA/IGZuKHRoaXNbaV0sIGksIHRoaXMpIDogZm4uYXBwbHkodGhpc0FyZywgW3RoaXNbaV0sIGksIHRoaXNdKTtcbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGZuLCB0aGlzQXJnKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmV0ID0gIXRoaXNBcmcgPyBmbih0aGlzW2ldLCBpLCB0aGlzKSA6IGZuLmFwcGx5KHRoaXNBcmcsIFt0aGlzW2ldLCBpLCB0aGlzXSk7XG4gICAgICBpZiAoIXJldCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBzYW1lOiBmdW5jdGlvbiBzYW1lKGNvbGxlY3Rpb24pIHtcbiAgICAvLyBjaGVhcCBjb2xsZWN0aW9uIHJlZiBjaGVja1xuICAgIGlmICh0aGlzID09PSBjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29sbGVjdGlvbiA9IHRoaXMuY3koKS5jb2xsZWN0aW9uKGNvbGxlY3Rpb24pO1xuICAgIHZhciB0aGlzTGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgdmFyIGNvbGxlY3Rpb25MZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblxuICAgIC8vIGNoZWFwIGxlbmd0aCBjaGVja1xuICAgIGlmICh0aGlzTGVuZ3RoICE9PSBjb2xsZWN0aW9uTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gY2hlYXAgZWxlbWVudCByZWYgY2hlY2tcbiAgICBpZiAodGhpc0xlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXNbMF0gPT09IGNvbGxlY3Rpb25bMF07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV2ZXJ5KGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uLmhhc0VsZW1lbnRXaXRoSWQoZWxlLmlkKCkpO1xuICAgIH0pO1xuICB9LFxuICBhbnlTYW1lOiBmdW5jdGlvbiBhbnlTYW1lKGNvbGxlY3Rpb24pIHtcbiAgICBjb2xsZWN0aW9uID0gdGhpcy5jeSgpLmNvbGxlY3Rpb24oY29sbGVjdGlvbik7XG4gICAgcmV0dXJuIHRoaXMuc29tZShmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbi5oYXNFbGVtZW50V2l0aElkKGVsZS5pZCgpKTtcbiAgICB9KTtcbiAgfSxcbiAgYWxsQXJlTmVpZ2hib3JzOiBmdW5jdGlvbiBhbGxBcmVOZWlnaGJvcnMoY29sbGVjdGlvbikge1xuICAgIGNvbGxlY3Rpb24gPSB0aGlzLmN5KCkuY29sbGVjdGlvbihjb2xsZWN0aW9uKTtcbiAgICB2YXIgbmhvb2QgPSB0aGlzLm5laWdoYm9yaG9vZCgpO1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmV2ZXJ5KGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBuaG9vZC5oYXNFbGVtZW50V2l0aElkKGVsZS5pZCgpKTtcbiAgICB9KTtcbiAgfSxcbiAgY29udGFpbnM6IGZ1bmN0aW9uIGNvbnRhaW5zKGNvbGxlY3Rpb24pIHtcbiAgICBjb2xsZWN0aW9uID0gdGhpcy5jeSgpLmNvbGxlY3Rpb24oY29sbGVjdGlvbik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmV2ZXJ5KGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBzZWxmLmhhc0VsZW1lbnRXaXRoSWQoZWxlLmlkKCkpO1xuICAgIH0pO1xuICB9XG59O1xuZWxlc2ZuJGcuYWxsQXJlTmVpZ2hib3VycyA9IGVsZXNmbiRnLmFsbEFyZU5laWdoYm9ycztcbmVsZXNmbiRnLmhhcyA9IGVsZXNmbiRnLmNvbnRhaW5zO1xuZWxlc2ZuJGcuZXF1YWwgPSBlbGVzZm4kZy5lcXVhbHMgPSBlbGVzZm4kZy5zYW1lO1xuXG52YXIgY2FjaGUgPSBmdW5jdGlvbiBjYWNoZShmbiwgbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gdHJhdmVyc2FsQ2FjaGUoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCkge1xuICAgIHZhciBzZWxlY3Rvck9yRWxlcyA9IGFyZzE7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciBrZXk7XG4gICAgaWYgKHNlbGVjdG9yT3JFbGVzID09IG51bGwpIHtcbiAgICAgIGtleSA9ICcnO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihzZWxlY3Rvck9yRWxlcykgJiYgc2VsZWN0b3JPckVsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBrZXkgPSBzZWxlY3Rvck9yRWxlcy5pZCgpO1xuICAgIH1cbiAgICBpZiAoZWxlcy5sZW5ndGggPT09IDEgJiYga2V5KSB7XG4gICAgICB2YXIgX3AgPSBlbGVzWzBdLl9wcml2YXRlO1xuICAgICAgdmFyIHRjaCA9IF9wLnRyYXZlcnNhbENhY2hlID0gX3AudHJhdmVyc2FsQ2FjaGUgfHwge307XG4gICAgICB2YXIgY2ggPSB0Y2hbbmFtZV0gPSB0Y2hbbmFtZV0gfHwgW107XG4gICAgICB2YXIgaGFzaCA9IGhhc2hTdHJpbmcoa2V5KTtcbiAgICAgIHZhciBjYWNoZUhpdCA9IGNoW2hhc2hdO1xuICAgICAgaWYgKGNhY2hlSGl0KSB7XG4gICAgICAgIHJldHVybiBjYWNoZUhpdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjaFtoYXNoXSA9IGZuLmNhbGwoZWxlcywgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKGVsZXMsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpO1xuICAgIH1cbiAgfTtcbn07XG5cbnZhciBlbGVzZm4kZiA9IHtcbiAgcGFyZW50OiBmdW5jdGlvbiBwYXJlbnQoc2VsZWN0b3IpIHtcbiAgICB2YXIgcGFyZW50cyA9IFtdO1xuXG4gICAgLy8gb3B0aW1pc2F0aW9uIGZvciBzaW5nbGUgZWxlIGNhbGxcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzWzBdLl9wcml2YXRlLnBhcmVudDtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIHZhciBfcGFyZW50ID0gZWxlLl9wcml2YXRlLnBhcmVudDtcbiAgICAgIGlmIChfcGFyZW50KSB7XG4gICAgICAgIHBhcmVudHMucHVzaChfcGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocGFyZW50cywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgcGFyZW50czogZnVuY3Rpb24gcGFyZW50cyhzZWxlY3Rvcikge1xuICAgIHZhciBwYXJlbnRzID0gW107XG4gICAgdmFyIGVsZXMgPSB0aGlzLnBhcmVudCgpO1xuICAgIHdoaWxlIChlbGVzLm5vbmVtcHR5KCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgcGFyZW50cy5wdXNoKGVsZSk7XG4gICAgICB9XG4gICAgICBlbGVzID0gZWxlcy5wYXJlbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24ocGFyZW50cywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgY29tbW9uQW5jZXN0b3JzOiBmdW5jdGlvbiBjb21tb25BbmNlc3RvcnMoc2VsZWN0b3IpIHtcbiAgICB2YXIgYW5jZXN0b3JzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICB2YXIgcGFyZW50cyA9IGVsZS5wYXJlbnRzKCk7XG4gICAgICBhbmNlc3RvcnMgPSBhbmNlc3RvcnMgfHwgcGFyZW50cztcbiAgICAgIGFuY2VzdG9ycyA9IGFuY2VzdG9ycy5pbnRlcnNlY3QocGFyZW50cyk7IC8vIGN1cnJlbnQgbGlzdCBtdXN0IGJlIGNvbW1vbiB3aXRoIGN1cnJlbnQgZWxlIHBhcmVudHMgc2V0XG4gICAgfVxuXG4gICAgcmV0dXJuIGFuY2VzdG9ycy5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICBvcnBoYW5zOiBmdW5jdGlvbiBvcnBoYW5zKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RkRmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNPcnBoYW4oKTtcbiAgICB9KS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICBub25vcnBoYW5zOiBmdW5jdGlvbiBub25vcnBoYW5zKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RkRmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNDaGlsZCgpO1xuICAgIH0pLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sXG4gIGNoaWxkcmVuOiBjYWNoZShmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgdmFyIGVsZUNoaWxkcmVuID0gZWxlLl9wcml2YXRlLmNoaWxkcmVuO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlbGVDaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGVsZUNoaWxkcmVuW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oY2hpbGRyZW4sIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sICdjaGlsZHJlbicpLFxuICBzaWJsaW5nczogZnVuY3Rpb24gc2libGluZ3Moc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQoKS5jaGlsZHJlbigpLm5vdCh0aGlzKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LFxuICBpc1BhcmVudDogZnVuY3Rpb24gaXNQYXJlbnQoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKSAmJiBlbGUuX3ByaXZhdGUuY2hpbGRyZW4ubGVuZ3RoICE9PSAwO1xuICAgIH1cbiAgfSxcbiAgaXNDaGlsZGxlc3M6IGZ1bmN0aW9uIGlzQ2hpbGRsZXNzKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCkgJiYgZWxlLl9wcml2YXRlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gIH0sXG4gIGlzQ2hpbGQ6IGZ1bmN0aW9uIGlzQ2hpbGQoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKSAmJiBlbGUuX3ByaXZhdGUucGFyZW50ICE9IG51bGw7XG4gICAgfVxuICB9LFxuICBpc09ycGhhbjogZnVuY3Rpb24gaXNPcnBoYW4oKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKSAmJiBlbGUuX3ByaXZhdGUucGFyZW50ID09IG51bGw7XG4gICAgfVxuICB9LFxuICBkZXNjZW5kYW50czogZnVuY3Rpb24gZGVzY2VuZGFudHMoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgICBmdW5jdGlvbiBhZGQoZWxlcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgICBlbGVtZW50cy5wdXNoKGVsZSk7XG4gICAgICAgIGlmIChlbGUuY2hpbGRyZW4oKS5ub25lbXB0eSgpKSB7XG4gICAgICAgICAgYWRkKGVsZS5jaGlsZHJlbigpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBhZGQodGhpcy5jaGlsZHJlbigpKTtcbiAgICByZXR1cm4gdGhpcy5zcGF3bihlbGVtZW50cywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGZvckVhY2hDb21wb3VuZChlbGVzLCBmbiwgaW5jbHVkZVNlbGYsIHJlY3Vyc2l2ZVN0ZXApIHtcbiAgdmFyIHEgPSBbXTtcbiAgdmFyIGRpZCA9IG5ldyBTZXQkMSgpO1xuICB2YXIgY3kgPSBlbGVzLmN5KCk7XG4gIHZhciBoYXNDb21wb3VuZHMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIGlmIChpbmNsdWRlU2VsZikge1xuICAgICAgcS5wdXNoKGVsZSk7XG4gICAgfSBlbHNlIGlmIChoYXNDb21wb3VuZHMpIHtcbiAgICAgIHJlY3Vyc2l2ZVN0ZXAocSwgZGlkLCBlbGUpO1xuICAgIH1cbiAgfVxuICB3aGlsZSAocS5sZW5ndGggPiAwKSB7XG4gICAgdmFyIF9lbGUgPSBxLnNoaWZ0KCk7XG4gICAgZm4oX2VsZSk7XG4gICAgZGlkLmFkZChfZWxlLmlkKCkpO1xuICAgIGlmIChoYXNDb21wb3VuZHMpIHtcbiAgICAgIHJlY3Vyc2l2ZVN0ZXAocSwgZGlkLCBfZWxlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVsZXM7XG59XG5mdW5jdGlvbiBhZGRDaGlsZHJlbihxLCBkaWQsIGVsZSkge1xuICBpZiAoZWxlLmlzUGFyZW50KCkpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBlbGUuX3ByaXZhdGUuY2hpbGRyZW47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBpZiAoIWRpZC5oYXMoY2hpbGQuaWQoKSkpIHtcbiAgICAgICAgcS5wdXNoKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gdmVyeSBlZmZpY2llbnQgdmVyc2lvbiBvZiBlbGVzLmFkZCggZWxlcy5kZXNjZW5kYW50cygpICkuZm9yRWFjaCgpXG4vLyBmb3IgaW50ZXJuYWwgdXNlXG5lbGVzZm4kZi5mb3JFYWNoRG93biA9IGZ1bmN0aW9uIChmbikge1xuICB2YXIgaW5jbHVkZVNlbGYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gIHJldHVybiBmb3JFYWNoQ29tcG91bmQodGhpcywgZm4sIGluY2x1ZGVTZWxmLCBhZGRDaGlsZHJlbik7XG59O1xuZnVuY3Rpb24gYWRkUGFyZW50KHEsIGRpZCwgZWxlKSB7XG4gIGlmIChlbGUuaXNDaGlsZCgpKSB7XG4gICAgdmFyIHBhcmVudCA9IGVsZS5fcHJpdmF0ZS5wYXJlbnQ7XG4gICAgaWYgKCFkaWQuaGFzKHBhcmVudC5pZCgpKSkge1xuICAgICAgcS5wdXNoKHBhcmVudCk7XG4gICAgfVxuICB9XG59XG5lbGVzZm4kZi5mb3JFYWNoVXAgPSBmdW5jdGlvbiAoZm4pIHtcbiAgdmFyIGluY2x1ZGVTZWxmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICByZXR1cm4gZm9yRWFjaENvbXBvdW5kKHRoaXMsIGZuLCBpbmNsdWRlU2VsZiwgYWRkUGFyZW50KTtcbn07XG5mdW5jdGlvbiBhZGRQYXJlbnRBbmRDaGlsZHJlbihxLCBkaWQsIGVsZSkge1xuICBhZGRQYXJlbnQocSwgZGlkLCBlbGUpO1xuICBhZGRDaGlsZHJlbihxLCBkaWQsIGVsZSk7XG59XG5lbGVzZm4kZi5mb3JFYWNoVXBBbmREb3duID0gZnVuY3Rpb24gKGZuKSB7XG4gIHZhciBpbmNsdWRlU2VsZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgcmV0dXJuIGZvckVhY2hDb21wb3VuZCh0aGlzLCBmbiwgaW5jbHVkZVNlbGYsIGFkZFBhcmVudEFuZENoaWxkcmVuKTtcbn07XG5cbi8vIGFsaWFzZXNcbmVsZXNmbiRmLmFuY2VzdG9ycyA9IGVsZXNmbiRmLnBhcmVudHM7XG5cbnZhciBmbiQ1LCBlbGVzZm4kZTtcbmZuJDUgPSBlbGVzZm4kZSA9IHtcbiAgZGF0YTogZGVmaW5lLmRhdGEoe1xuICAgIGZpZWxkOiAnZGF0YScsXG4gICAgYmluZGluZ0V2ZW50OiAnZGF0YScsXG4gICAgYWxsb3dCaW5kaW5nOiB0cnVlLFxuICAgIGFsbG93U2V0dGluZzogdHJ1ZSxcbiAgICBzZXR0aW5nRXZlbnQ6ICdkYXRhJyxcbiAgICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogdHJ1ZSxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgYWxsb3dHZXR0aW5nOiB0cnVlLFxuICAgIGltbXV0YWJsZUtleXM6IHtcbiAgICAgICdpZCc6IHRydWUsXG4gICAgICAnc291cmNlJzogdHJ1ZSxcbiAgICAgICd0YXJnZXQnOiB0cnVlLFxuICAgICAgJ3BhcmVudCc6IHRydWVcbiAgICB9LFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pLFxuICByZW1vdmVEYXRhOiBkZWZpbmUucmVtb3ZlRGF0YSh7XG4gICAgZmllbGQ6ICdkYXRhJyxcbiAgICBldmVudDogJ2RhdGEnLFxuICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICB0cmlnZ2VyRXZlbnQ6IHRydWUsXG4gICAgaW1tdXRhYmxlS2V5czoge1xuICAgICAgJ2lkJzogdHJ1ZSxcbiAgICAgICdzb3VyY2UnOiB0cnVlLFxuICAgICAgJ3RhcmdldCc6IHRydWUsXG4gICAgICAncGFyZW50JzogdHJ1ZVxuICAgIH0sXG4gICAgdXBkYXRlU3R5bGU6IHRydWVcbiAgfSksXG4gIHNjcmF0Y2g6IGRlZmluZS5kYXRhKHtcbiAgICBmaWVsZDogJ3NjcmF0Y2gnLFxuICAgIGJpbmRpbmdFdmVudDogJ3NjcmF0Y2gnLFxuICAgIGFsbG93QmluZGluZzogdHJ1ZSxcbiAgICBhbGxvd1NldHRpbmc6IHRydWUsXG4gICAgc2V0dGluZ0V2ZW50OiAnc2NyYXRjaCcsXG4gICAgc2V0dGluZ1RyaWdnZXJzRXZlbnQ6IHRydWUsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIGFsbG93R2V0dGluZzogdHJ1ZSxcbiAgICB1cGRhdGVTdHlsZTogdHJ1ZVxuICB9KSxcbiAgcmVtb3ZlU2NyYXRjaDogZGVmaW5lLnJlbW92ZURhdGEoe1xuICAgIGZpZWxkOiAnc2NyYXRjaCcsXG4gICAgZXZlbnQ6ICdzY3JhdGNoJyxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgdHJpZ2dlckV2ZW50OiB0cnVlLFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pLFxuICByc2NyYXRjaDogZGVmaW5lLmRhdGEoe1xuICAgIGZpZWxkOiAncnNjcmF0Y2gnLFxuICAgIGFsbG93QmluZGluZzogZmFsc2UsXG4gICAgYWxsb3dTZXR0aW5nOiB0cnVlLFxuICAgIHNldHRpbmdUcmlnZ2Vyc0V2ZW50OiBmYWxzZSxcbiAgICBhbGxvd0dldHRpbmc6IHRydWVcbiAgfSksXG4gIHJlbW92ZVJzY3JhdGNoOiBkZWZpbmUucmVtb3ZlRGF0YSh7XG4gICAgZmllbGQ6ICdyc2NyYXRjaCcsXG4gICAgdHJpZ2dlckV2ZW50OiBmYWxzZVxuICB9KSxcbiAgaWQ6IGZ1bmN0aW9uIGlkKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICB9XG4gIH1cbn07XG5cbi8vIGFsaWFzZXNcbmZuJDUuYXR0ciA9IGZuJDUuZGF0YTtcbmZuJDUucmVtb3ZlQXR0ciA9IGZuJDUucmVtb3ZlRGF0YTtcbnZhciBkYXRhID0gZWxlc2ZuJGU7XG5cbnZhciBlbGVzZm4kZCA9IHt9O1xuZnVuY3Rpb24gZGVmaW5lRGVncmVlRnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpbmNsdWRlTG9vcHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKGluY2x1ZGVMb29wcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpbmNsdWRlTG9vcHMgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoc2VsZi5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNlbGYuaXNOb2RlKCkgJiYgIXNlbGYucmVtb3ZlZCgpKSB7XG4gICAgICB2YXIgZGVncmVlID0gMDtcbiAgICAgIHZhciBub2RlID0gc2VsZlswXTtcbiAgICAgIHZhciBjb25uZWN0ZWRFZGdlcyA9IG5vZGUuX3ByaXZhdGUuZWRnZXM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbm5lY3RlZEVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlZGdlID0gY29ubmVjdGVkRWRnZXNbaV07XG4gICAgICAgIGlmICghaW5jbHVkZUxvb3BzICYmIGVkZ2UuaXNMb29wKCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBkZWdyZWUgKz0gY2FsbGJhY2sobm9kZSwgZWRnZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVncmVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9O1xufVxuZXh0ZW5kKGVsZXNmbiRkLCB7XG4gIGRlZ3JlZTogZGVmaW5lRGVncmVlRnVuY3Rpb24oZnVuY3Rpb24gKG5vZGUsIGVkZ2UpIHtcbiAgICBpZiAoZWRnZS5zb3VyY2UoKS5zYW1lKGVkZ2UudGFyZ2V0KCkpKSB7XG4gICAgICByZXR1cm4gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9KSxcbiAgaW5kZWdyZWU6IGRlZmluZURlZ3JlZUZ1bmN0aW9uKGZ1bmN0aW9uIChub2RlLCBlZGdlKSB7XG4gICAgaWYgKGVkZ2UudGFyZ2V0KCkuc2FtZShub2RlKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSksXG4gIG91dGRlZ3JlZTogZGVmaW5lRGVncmVlRnVuY3Rpb24oZnVuY3Rpb24gKG5vZGUsIGVkZ2UpIHtcbiAgICBpZiAoZWRnZS5zb3VyY2UoKS5zYW1lKG5vZGUpKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9KVxufSk7XG5mdW5jdGlvbiBkZWZpbmVEZWdyZWVCb3VuZHNGdW5jdGlvbihkZWdyZWVGbiwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpbmNsdWRlTG9vcHMpIHtcbiAgICB2YXIgcmV0O1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gbm9kZXNbaV07XG4gICAgICB2YXIgZGVncmVlID0gZWxlW2RlZ3JlZUZuXShpbmNsdWRlTG9vcHMpO1xuICAgICAgaWYgKGRlZ3JlZSAhPT0gdW5kZWZpbmVkICYmIChyZXQgPT09IHVuZGVmaW5lZCB8fCBjYWxsYmFjayhkZWdyZWUsIHJldCkpKSB7XG4gICAgICAgIHJldCA9IGRlZ3JlZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcbn1cbmV4dGVuZChlbGVzZm4kZCwge1xuICBtaW5EZWdyZWU6IGRlZmluZURlZ3JlZUJvdW5kc0Z1bmN0aW9uKCdkZWdyZWUnLCBmdW5jdGlvbiAoZGVncmVlLCBtaW4pIHtcbiAgICByZXR1cm4gZGVncmVlIDwgbWluO1xuICB9KSxcbiAgbWF4RGVncmVlOiBkZWZpbmVEZWdyZWVCb3VuZHNGdW5jdGlvbignZGVncmVlJywgZnVuY3Rpb24gKGRlZ3JlZSwgbWF4KSB7XG4gICAgcmV0dXJuIGRlZ3JlZSA+IG1heDtcbiAgfSksXG4gIG1pbkluZGVncmVlOiBkZWZpbmVEZWdyZWVCb3VuZHNGdW5jdGlvbignaW5kZWdyZWUnLCBmdW5jdGlvbiAoZGVncmVlLCBtaW4pIHtcbiAgICByZXR1cm4gZGVncmVlIDwgbWluO1xuICB9KSxcbiAgbWF4SW5kZWdyZWU6IGRlZmluZURlZ3JlZUJvdW5kc0Z1bmN0aW9uKCdpbmRlZ3JlZScsIGZ1bmN0aW9uIChkZWdyZWUsIG1heCkge1xuICAgIHJldHVybiBkZWdyZWUgPiBtYXg7XG4gIH0pLFxuICBtaW5PdXRkZWdyZWU6IGRlZmluZURlZ3JlZUJvdW5kc0Z1bmN0aW9uKCdvdXRkZWdyZWUnLCBmdW5jdGlvbiAoZGVncmVlLCBtaW4pIHtcbiAgICByZXR1cm4gZGVncmVlIDwgbWluO1xuICB9KSxcbiAgbWF4T3V0ZGVncmVlOiBkZWZpbmVEZWdyZWVCb3VuZHNGdW5jdGlvbignb3V0ZGVncmVlJywgZnVuY3Rpb24gKGRlZ3JlZSwgbWF4KSB7XG4gICAgcmV0dXJuIGRlZ3JlZSA+IG1heDtcbiAgfSlcbn0pO1xuZXh0ZW5kKGVsZXNmbiRkLCB7XG4gIHRvdGFsRGVncmVlOiBmdW5jdGlvbiB0b3RhbERlZ3JlZShpbmNsdWRlTG9vcHMpIHtcbiAgICB2YXIgdG90YWwgPSAwO1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0b3RhbCArPSBub2Rlc1tpXS5kZWdyZWUoaW5jbHVkZUxvb3BzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRvdGFsO1xuICB9XG59KTtcblxudmFyIGZuJDQsIGVsZXNmbiRjO1xudmFyIGJlZm9yZVBvc2l0aW9uU2V0ID0gZnVuY3Rpb24gYmVmb3JlUG9zaXRpb25TZXQoZWxlcywgbmV3UG9zLCBzaWxlbnQpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgaWYgKCFlbGUubG9ja2VkKCkpIHtcbiAgICAgIHZhciBvbGRQb3MgPSBlbGUuX3ByaXZhdGUucG9zaXRpb247XG4gICAgICB2YXIgZGVsdGEgPSB7XG4gICAgICAgIHg6IG5ld1Bvcy54ICE9IG51bGwgPyBuZXdQb3MueCAtIG9sZFBvcy54IDogMCxcbiAgICAgICAgeTogbmV3UG9zLnkgIT0gbnVsbCA/IG5ld1Bvcy55IC0gb2xkUG9zLnkgOiAwXG4gICAgICB9O1xuICAgICAgaWYgKGVsZS5pc1BhcmVudCgpICYmICEoZGVsdGEueCA9PT0gMCAmJiBkZWx0YS55ID09PSAwKSkge1xuICAgICAgICBlbGUuY2hpbGRyZW4oKS5zaGlmdChkZWx0YSwgc2lsZW50KTtcbiAgICAgIH1cbiAgICAgIGVsZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgICB9XG4gIH1cbn07XG52YXIgcG9zaXRpb25EZWYgPSB7XG4gIGZpZWxkOiAncG9zaXRpb24nLFxuICBiaW5kaW5nRXZlbnQ6ICdwb3NpdGlvbicsXG4gIGFsbG93QmluZGluZzogdHJ1ZSxcbiAgYWxsb3dTZXR0aW5nOiB0cnVlLFxuICBzZXR0aW5nRXZlbnQ6ICdwb3NpdGlvbicsXG4gIHNldHRpbmdUcmlnZ2Vyc0V2ZW50OiB0cnVlLFxuICB0cmlnZ2VyRm5OYW1lOiAnZW1pdEFuZE5vdGlmeScsXG4gIGFsbG93R2V0dGluZzogdHJ1ZSxcbiAgdmFsaWRLZXlzOiBbJ3gnLCAneSddLFxuICBiZWZvcmVHZXQ6IGZ1bmN0aW9uIGJlZm9yZUdldChlbGUpIHtcbiAgICBlbGUudXBkYXRlQ29tcG91bmRCb3VuZHMoKTtcbiAgfSxcbiAgYmVmb3JlU2V0OiBmdW5jdGlvbiBiZWZvcmVTZXQoZWxlcywgbmV3UG9zKSB7XG4gICAgYmVmb3JlUG9zaXRpb25TZXQoZWxlcywgbmV3UG9zLCBmYWxzZSk7XG4gIH0sXG4gIG9uU2V0OiBmdW5jdGlvbiBvblNldChlbGVzKSB7XG4gICAgZWxlcy5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKTtcbiAgfSxcbiAgY2FuU2V0OiBmdW5jdGlvbiBjYW5TZXQoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUubG9ja2VkKCk7XG4gIH1cbn07XG5mbiQ0ID0gZWxlc2ZuJGMgPSB7XG4gIHBvc2l0aW9uOiBkZWZpbmUuZGF0YShwb3NpdGlvbkRlZiksXG4gIC8vIHBvc2l0aW9uIGJ1dCBubyBub3RpZmljYXRpb24gdG8gcmVuZGVyZXJcbiAgc2lsZW50UG9zaXRpb246IGRlZmluZS5kYXRhKGV4dGVuZCh7fSwgcG9zaXRpb25EZWYsIHtcbiAgICBhbGxvd0JpbmRpbmc6IGZhbHNlLFxuICAgIGFsbG93U2V0dGluZzogdHJ1ZSxcbiAgICBzZXR0aW5nVHJpZ2dlcnNFdmVudDogZmFsc2UsXG4gICAgYWxsb3dHZXR0aW5nOiBmYWxzZSxcbiAgICBiZWZvcmVTZXQ6IGZ1bmN0aW9uIGJlZm9yZVNldChlbGVzLCBuZXdQb3MpIHtcbiAgICAgIGJlZm9yZVBvc2l0aW9uU2V0KGVsZXMsIG5ld1BvcywgdHJ1ZSk7XG4gICAgfSxcbiAgICBvblNldDogZnVuY3Rpb24gb25TZXQoZWxlcykge1xuICAgICAgZWxlcy5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKTtcbiAgICB9XG4gIH0pKSxcbiAgcG9zaXRpb25zOiBmdW5jdGlvbiBwb3NpdGlvbnMocG9zLCBzaWxlbnQpIHtcbiAgICBpZiAocGxhaW5PYmplY3QocG9zKSkge1xuICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICB0aGlzLnNpbGVudFBvc2l0aW9uKHBvcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvc2l0aW9uKHBvcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmbiQ2KHBvcykpIHtcbiAgICAgIHZhciBfZm4gPSBwb3M7XG4gICAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgICBjeS5zdGFydEJhdGNoKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICAgIHZhciBfcG9zID0gdm9pZCAwO1xuICAgICAgICBpZiAoX3BvcyA9IF9mbihlbGUsIGkpKSB7XG4gICAgICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICAgICAgZWxlLnNpbGVudFBvc2l0aW9uKF9wb3MpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbGUucG9zaXRpb24oX3Bvcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjeS5lbmRCYXRjaCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICBzaWxlbnRQb3NpdGlvbnM6IGZ1bmN0aW9uIHNpbGVudFBvc2l0aW9ucyhwb3MpIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbnMocG9zLCB0cnVlKTtcbiAgfSxcbiAgc2hpZnQ6IGZ1bmN0aW9uIHNoaWZ0KGRpbSwgdmFsLCBzaWxlbnQpIHtcbiAgICB2YXIgZGVsdGE7XG4gICAgaWYgKHBsYWluT2JqZWN0KGRpbSkpIHtcbiAgICAgIGRlbHRhID0ge1xuICAgICAgICB4OiBudW1iZXIkMShkaW0ueCkgPyBkaW0ueCA6IDAsXG4gICAgICAgIHk6IG51bWJlciQxKGRpbS55KSA/IGRpbS55IDogMFxuICAgICAgfTtcbiAgICAgIHNpbGVudCA9IHZhbDtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyhkaW0pICYmIG51bWJlciQxKHZhbCkpIHtcbiAgICAgIGRlbHRhID0ge1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwXG4gICAgICB9O1xuICAgICAgZGVsdGFbZGltXSA9IHZhbDtcbiAgICB9XG4gICAgaWYgKGRlbHRhICE9IG51bGwpIHtcbiAgICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICAgIGN5LnN0YXJ0QmF0Y2goKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gdGhpc1tpXTtcblxuICAgICAgICAvLyBleGNsdWRlIGFueSBub2RlIHRoYXQgaXMgYSBkZXNjZW5kYW50IG9mIHRoZSBjYWxsaW5nIGNvbGxlY3Rpb25cbiAgICAgICAgaWYgKGN5Lmhhc0NvbXBvdW5kTm9kZXMoKSAmJiBlbGUuaXNDaGlsZCgpICYmIGVsZS5hbmNlc3RvcnMoKS5hbnlTYW1lKHRoaXMpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBvcyA9IGVsZS5wb3NpdGlvbigpO1xuICAgICAgICB2YXIgbmV3UG9zID0ge1xuICAgICAgICAgIHg6IHBvcy54ICsgZGVsdGEueCxcbiAgICAgICAgICB5OiBwb3MueSArIGRlbHRhLnlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICAgIGVsZS5zaWxlbnRQb3NpdGlvbihuZXdQb3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZS5wb3NpdGlvbihuZXdQb3MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjeS5lbmRCYXRjaCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgc2lsZW50U2hpZnQ6IGZ1bmN0aW9uIHNpbGVudFNoaWZ0KGRpbSwgdmFsKSB7XG4gICAgaWYgKHBsYWluT2JqZWN0KGRpbSkpIHtcbiAgICAgIHRoaXMuc2hpZnQoZGltLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyhkaW0pICYmIG51bWJlciQxKHZhbCkpIHtcbiAgICAgIHRoaXMuc2hpZnQoZGltLCB2YWwsIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgLy8gZ2V0L3NldCB0aGUgcmVuZGVyZWQgKGkuZS4gb24gc2NyZWVuKSBwb3NpdG9uIG9mIHRoZSBlbGVtZW50XG4gIHJlbmRlcmVkUG9zaXRpb246IGZ1bmN0aW9uIHJlbmRlcmVkUG9zaXRpb24oZGltLCB2YWwpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgIHZhciBycG9zID0gcGxhaW5PYmplY3QoZGltKSA/IGRpbSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgc2V0dGluZyA9IHJwb3MgIT09IHVuZGVmaW5lZCB8fCB2YWwgIT09IHVuZGVmaW5lZCAmJiBzdHJpbmcoZGltKTtcbiAgICBpZiAoZWxlICYmIGVsZS5pc05vZGUoKSkge1xuICAgICAgLy8gbXVzdCBoYXZlIGFuIGVsZW1lbnQgYW5kIG11c3QgYmUgYSBub2RlIHRvIHJldHVybiBwb3NpdGlvblxuICAgICAgaWYgKHNldHRpbmcpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIF9lbGUgPSB0aGlzW2ldO1xuICAgICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gc2V0IG9uZSBkaW1lbnNpb25cbiAgICAgICAgICAgIF9lbGUucG9zaXRpb24oZGltLCAodmFsIC0gcGFuW2RpbV0pIC8gem9vbSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChycG9zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHNldCB3aG9sZSBwb3NpdGlvblxuICAgICAgICAgICAgX2VsZS5wb3NpdGlvbihyZW5kZXJlZFRvTW9kZWxQb3NpdGlvbihycG9zLCB6b29tLCBwYW4pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGdldHRpbmdcbiAgICAgICAgdmFyIHBvcyA9IGVsZS5wb3NpdGlvbigpO1xuICAgICAgICBycG9zID0gbW9kZWxUb1JlbmRlcmVkUG9zaXRpb24ocG9zLCB6b29tLCBwYW4pO1xuICAgICAgICBpZiAoZGltID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyB0aGVuIHJldHVybiB0aGUgd2hvbGUgcmVuZGVyZWQgcG9zaXRpb25cbiAgICAgICAgICByZXR1cm4gcnBvcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0aGVuIHJldHVybiB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvblxuICAgICAgICAgIHJldHVybiBycG9zW2RpbV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFzZXR0aW5nKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBmb3IgZW1wdHkgY29sbGVjdGlvbiBjYXNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgLy8gZ2V0L3NldCB0aGUgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHBhcmVudFxuICByZWxhdGl2ZVBvc2l0aW9uOiBmdW5jdGlvbiByZWxhdGl2ZVBvc2l0aW9uKGRpbSwgdmFsKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciBwcG9zID0gcGxhaW5PYmplY3QoZGltKSA/IGRpbSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgc2V0dGluZyA9IHBwb3MgIT09IHVuZGVmaW5lZCB8fCB2YWwgIT09IHVuZGVmaW5lZCAmJiBzdHJpbmcoZGltKTtcbiAgICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgICBpZiAoZWxlICYmIGVsZS5pc05vZGUoKSkge1xuICAgICAgLy8gbXVzdCBoYXZlIGFuIGVsZW1lbnQgYW5kIG11c3QgYmUgYSBub2RlIHRvIHJldHVybiBwb3NpdGlvblxuICAgICAgaWYgKHNldHRpbmcpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIF9lbGUyID0gdGhpc1tpXTtcbiAgICAgICAgICB2YXIgcGFyZW50ID0gaGFzQ29tcG91bmROb2RlcyA/IF9lbGUyLnBhcmVudCgpIDogbnVsbDtcbiAgICAgICAgICB2YXIgaGFzUGFyZW50ID0gcGFyZW50ICYmIHBhcmVudC5sZW5ndGggPiAwO1xuICAgICAgICAgIHZhciByZWxhdGl2ZVRvUGFyZW50ID0gaGFzUGFyZW50O1xuICAgICAgICAgIGlmIChoYXNQYXJlbnQpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudFswXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG9yaWdpbiA9IHJlbGF0aXZlVG9QYXJlbnQgPyBwYXJlbnQucG9zaXRpb24oKSA6IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHNldCBvbmUgZGltZW5zaW9uXG4gICAgICAgICAgICBfZWxlMi5wb3NpdGlvbihkaW0sIHZhbCArIG9yaWdpbltkaW1dKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBwb3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gc2V0IHdob2xlIHBvc2l0aW9uXG4gICAgICAgICAgICBfZWxlMi5wb3NpdGlvbih7XG4gICAgICAgICAgICAgIHg6IHBwb3MueCArIG9yaWdpbi54LFxuICAgICAgICAgICAgICB5OiBwcG9zLnkgKyBvcmlnaW4ueVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBnZXR0aW5nXG4gICAgICAgIHZhciBwb3MgPSBlbGUucG9zaXRpb24oKTtcbiAgICAgICAgdmFyIF9wYXJlbnQgPSBoYXNDb21wb3VuZE5vZGVzID8gZWxlLnBhcmVudCgpIDogbnVsbDtcbiAgICAgICAgdmFyIF9oYXNQYXJlbnQgPSBfcGFyZW50ICYmIF9wYXJlbnQubGVuZ3RoID4gMDtcbiAgICAgICAgdmFyIF9yZWxhdGl2ZVRvUGFyZW50ID0gX2hhc1BhcmVudDtcbiAgICAgICAgaWYgKF9oYXNQYXJlbnQpIHtcbiAgICAgICAgICBfcGFyZW50ID0gX3BhcmVudFswXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX29yaWdpbiA9IF9yZWxhdGl2ZVRvUGFyZW50ID8gX3BhcmVudC5wb3NpdGlvbigpIDoge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9O1xuICAgICAgICBwcG9zID0ge1xuICAgICAgICAgIHg6IHBvcy54IC0gX29yaWdpbi54LFxuICAgICAgICAgIHk6IHBvcy55IC0gX29yaWdpbi55XG4gICAgICAgIH07XG4gICAgICAgIGlmIChkaW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSB3aG9sZSByZW5kZXJlZCBwb3NpdGlvblxuICAgICAgICAgIHJldHVybiBwcG9zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSBzcGVjaWZpZWQgZGltZW5zaW9uXG4gICAgICAgICAgcmV0dXJuIHBwb3NbZGltXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXNldHRpbmcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIGZvciBlbXB0eSBjb2xsZWN0aW9uIGNhc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfVxufTtcblxuLy8gYWxpYXNlc1xuZm4kNC5tb2RlbFBvc2l0aW9uID0gZm4kNC5wb2ludCA9IGZuJDQucG9zaXRpb247XG5mbiQ0Lm1vZGVsUG9zaXRpb25zID0gZm4kNC5wb2ludHMgPSBmbiQ0LnBvc2l0aW9ucztcbmZuJDQucmVuZGVyZWRQb2ludCA9IGZuJDQucmVuZGVyZWRQb3NpdGlvbjtcbmZuJDQucmVsYXRpdmVQb2ludCA9IGZuJDQucmVsYXRpdmVQb3NpdGlvbjtcbnZhciBwb3NpdGlvbiA9IGVsZXNmbiRjO1xuXG52YXIgZm4kMywgZWxlc2ZuJGI7XG5mbiQzID0gZWxlc2ZuJGIgPSB7fTtcbmVsZXNmbiRiLnJlbmRlcmVkQm91bmRpbmdCb3ggPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB2YXIgYmIgPSB0aGlzLmJvdW5kaW5nQm94KG9wdGlvbnMpO1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIHZhciB6b29tID0gY3kuem9vbSgpO1xuICB2YXIgcGFuID0gY3kucGFuKCk7XG4gIHZhciB4MSA9IGJiLngxICogem9vbSArIHBhbi54O1xuICB2YXIgeDIgPSBiYi54MiAqIHpvb20gKyBwYW4ueDtcbiAgdmFyIHkxID0gYmIueTEgKiB6b29tICsgcGFuLnk7XG4gIHZhciB5MiA9IGJiLnkyICogem9vbSArIHBhbi55O1xuICByZXR1cm4ge1xuICAgIHgxOiB4MSxcbiAgICB4MjogeDIsXG4gICAgeTE6IHkxLFxuICAgIHkyOiB5MixcbiAgICB3OiB4MiAtIHgxLFxuICAgIGg6IHkyIC0geTFcbiAgfTtcbn07XG5lbGVzZm4kYi5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzaWxlbnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIGlmICghY3kuc3R5bGVFbmFibGVkKCkgfHwgIWN5Lmhhc0NvbXBvdW5kTm9kZXMoKSkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHRoaXMuZm9yRWFjaFVwKGZ1bmN0aW9uIChlbGUpIHtcbiAgICBpZiAoZWxlLmlzUGFyZW50KCkpIHtcbiAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgIF9wLmNvbXBvdW5kQm91bmRzQ2xlYW4gPSBmYWxzZTtcbiAgICAgIF9wLmJiQ2FjaGUgPSBudWxsO1xuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgZWxlLmVtaXRBbmROb3RpZnkoJ2JvdW5kcycpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcbmVsZXNmbiRiLnVwZGF0ZUNvbXBvdW5kQm91bmRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZm9yY2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG5cbiAgLy8gbm90IHBvc3NpYmxlIHRvIGRvIG9uIG5vbi1jb21wb3VuZCBncmFwaHMgb3Igd2l0aCB0aGUgc3R5bGUgZGlzYWJsZWRcbiAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSB8fCAhY3kuaGFzQ29tcG91bmROb2RlcygpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzYXZlIGN5Y2xlcyB3aGVuIGJhdGNoaW5nIC0tIGJ1dCBib3VuZHMgd2lsbCBiZSBzdGFsZSAob3Igbm90IGV4aXN0IHlldClcbiAgaWYgKCFmb3JjZSAmJiBjeS5iYXRjaGluZygpKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlKHBhcmVudCkge1xuICAgIGlmICghcGFyZW50LmlzUGFyZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIF9wID0gcGFyZW50Ll9wcml2YXRlO1xuICAgIHZhciBjaGlsZHJlbiA9IHBhcmVudC5jaGlsZHJlbigpO1xuICAgIHZhciBpbmNsdWRlTGFiZWxzID0gcGFyZW50LnBzdHlsZSgnY29tcG91bmQtc2l6aW5nLXdydC1sYWJlbHMnKS52YWx1ZSA9PT0gJ2luY2x1ZGUnO1xuICAgIHZhciBtaW4gPSB7XG4gICAgICB3aWR0aDoge1xuICAgICAgICB2YWw6IHBhcmVudC5wc3R5bGUoJ21pbi13aWR0aCcpLnBmVmFsdWUsXG4gICAgICAgIGxlZnQ6IHBhcmVudC5wc3R5bGUoJ21pbi13aWR0aC1iaWFzLWxlZnQnKSxcbiAgICAgICAgcmlnaHQ6IHBhcmVudC5wc3R5bGUoJ21pbi13aWR0aC1iaWFzLXJpZ2h0JylcbiAgICAgIH0sXG4gICAgICBoZWlnaHQ6IHtcbiAgICAgICAgdmFsOiBwYXJlbnQucHN0eWxlKCdtaW4taGVpZ2h0JykucGZWYWx1ZSxcbiAgICAgICAgdG9wOiBwYXJlbnQucHN0eWxlKCdtaW4taGVpZ2h0LWJpYXMtdG9wJyksXG4gICAgICAgIGJvdHRvbTogcGFyZW50LnBzdHlsZSgnbWluLWhlaWdodC1iaWFzLWJvdHRvbScpXG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgYmIgPSBjaGlsZHJlbi5ib3VuZGluZ0JveCh7XG4gICAgICBpbmNsdWRlTGFiZWxzOiBpbmNsdWRlTGFiZWxzLFxuICAgICAgaW5jbHVkZU92ZXJsYXlzOiBmYWxzZSxcbiAgICAgIC8vIHVwZGF0aW5nIHRoZSBjb21wb3VuZCBib3VuZHMgaGFwcGVucyBvdXRzaWRlIG9mIHRoZSByZWd1bGFyXG4gICAgICAvLyBjYWNoZSBjeWNsZSAoaS5lLiBiZWZvcmUgZmlyZWQgZXZlbnRzKVxuICAgICAgdXNlQ2FjaGU6IGZhbHNlXG4gICAgfSk7XG4gICAgdmFyIHBvcyA9IF9wLnBvc2l0aW9uO1xuXG4gICAgLy8gaWYgY2hpbGRyZW4gdGFrZSB1cCB6ZXJvIGFyZWEgdGhlbiBrZWVwIHBvc2l0aW9uIGFuZCBmYWxsIGJhY2sgb24gc3R5bGVzaGVldCB3L2hcbiAgICBpZiAoYmIudyA9PT0gMCB8fCBiYi5oID09PSAwKSB7XG4gICAgICBiYiA9IHtcbiAgICAgICAgdzogcGFyZW50LnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlLFxuICAgICAgICBoOiBwYXJlbnQucHN0eWxlKCdoZWlnaHQnKS5wZlZhbHVlXG4gICAgICB9O1xuICAgICAgYmIueDEgPSBwb3MueCAtIGJiLncgLyAyO1xuICAgICAgYmIueDIgPSBwb3MueCArIGJiLncgLyAyO1xuICAgICAgYmIueTEgPSBwb3MueSAtIGJiLmggLyAyO1xuICAgICAgYmIueTIgPSBwb3MueSArIGJiLmggLyAyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21wdXRlQmlhc1ZhbHVlcyhwcm9wRGlmZiwgcHJvcEJpYXMsIHByb3BCaWFzQ29tcGxlbWVudCkge1xuICAgICAgdmFyIGJpYXNEaWZmID0gMDtcbiAgICAgIHZhciBiaWFzQ29tcGxlbWVudERpZmYgPSAwO1xuICAgICAgdmFyIGJpYXNUb3RhbCA9IHByb3BCaWFzICsgcHJvcEJpYXNDb21wbGVtZW50O1xuICAgICAgaWYgKHByb3BEaWZmID4gMCAmJiBiaWFzVG90YWwgPiAwKSB7XG4gICAgICAgIGJpYXNEaWZmID0gcHJvcEJpYXMgLyBiaWFzVG90YWwgKiBwcm9wRGlmZjtcbiAgICAgICAgYmlhc0NvbXBsZW1lbnREaWZmID0gcHJvcEJpYXNDb21wbGVtZW50IC8gYmlhc1RvdGFsICogcHJvcERpZmY7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiaWFzRGlmZjogYmlhc0RpZmYsXG4gICAgICAgIGJpYXNDb21wbGVtZW50RGlmZjogYmlhc0NvbXBsZW1lbnREaWZmXG4gICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21wdXRlUGFkZGluZ1ZhbHVlcyh3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nT2JqZWN0LCByZWxhdGl2ZVRvKSB7XG4gICAgICAvLyBBc3N1bWluZyBwZXJjZW50YWdlIGlzIG51bWJlciBmcm9tIDAgdG8gMVxuICAgICAgaWYgKHBhZGRpbmdPYmplY3QudW5pdHMgPT09ICclJykge1xuICAgICAgICBzd2l0Y2ggKHJlbGF0aXZlVG8pIHtcbiAgICAgICAgICBjYXNlICd3aWR0aCc6XG4gICAgICAgICAgICByZXR1cm4gd2lkdGggPiAwID8gcGFkZGluZ09iamVjdC5wZlZhbHVlICogd2lkdGggOiAwO1xuICAgICAgICAgIGNhc2UgJ2hlaWdodCc6XG4gICAgICAgICAgICByZXR1cm4gaGVpZ2h0ID4gMCA/IHBhZGRpbmdPYmplY3QucGZWYWx1ZSAqIGhlaWdodCA6IDA7XG4gICAgICAgICAgY2FzZSAnYXZlcmFnZSc6XG4gICAgICAgICAgICByZXR1cm4gd2lkdGggPiAwICYmIGhlaWdodCA+IDAgPyBwYWRkaW5nT2JqZWN0LnBmVmFsdWUgKiAod2lkdGggKyBoZWlnaHQpIC8gMiA6IDA7XG4gICAgICAgICAgY2FzZSAnbWluJzpcbiAgICAgICAgICAgIHJldHVybiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCA/IHdpZHRoID4gaGVpZ2h0ID8gcGFkZGluZ09iamVjdC5wZlZhbHVlICogaGVpZ2h0IDogcGFkZGluZ09iamVjdC5wZlZhbHVlICogd2lkdGggOiAwO1xuICAgICAgICAgIGNhc2UgJ21heCc6XG4gICAgICAgICAgICByZXR1cm4gd2lkdGggPiAwICYmIGhlaWdodCA+IDAgPyB3aWR0aCA+IGhlaWdodCA/IHBhZGRpbmdPYmplY3QucGZWYWx1ZSAqIHdpZHRoIDogcGFkZGluZ09iamVjdC5wZlZhbHVlICogaGVpZ2h0IDogMDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocGFkZGluZ09iamVjdC51bml0cyA9PT0gJ3B4Jykge1xuICAgICAgICByZXR1cm4gcGFkZGluZ09iamVjdC5wZlZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBsZWZ0VmFsID0gbWluLndpZHRoLmxlZnQudmFsdWU7XG4gICAgaWYgKG1pbi53aWR0aC5sZWZ0LnVuaXRzID09PSAncHgnICYmIG1pbi53aWR0aC52YWwgPiAwKSB7XG4gICAgICBsZWZ0VmFsID0gbGVmdFZhbCAqIDEwMCAvIG1pbi53aWR0aC52YWw7XG4gICAgfVxuICAgIHZhciByaWdodFZhbCA9IG1pbi53aWR0aC5yaWdodC52YWx1ZTtcbiAgICBpZiAobWluLndpZHRoLnJpZ2h0LnVuaXRzID09PSAncHgnICYmIG1pbi53aWR0aC52YWwgPiAwKSB7XG4gICAgICByaWdodFZhbCA9IHJpZ2h0VmFsICogMTAwIC8gbWluLndpZHRoLnZhbDtcbiAgICB9XG4gICAgdmFyIHRvcFZhbCA9IG1pbi5oZWlnaHQudG9wLnZhbHVlO1xuICAgIGlmIChtaW4uaGVpZ2h0LnRvcC51bml0cyA9PT0gJ3B4JyAmJiBtaW4uaGVpZ2h0LnZhbCA+IDApIHtcbiAgICAgIHRvcFZhbCA9IHRvcFZhbCAqIDEwMCAvIG1pbi5oZWlnaHQudmFsO1xuICAgIH1cbiAgICB2YXIgYm90dG9tVmFsID0gbWluLmhlaWdodC5ib3R0b20udmFsdWU7XG4gICAgaWYgKG1pbi5oZWlnaHQuYm90dG9tLnVuaXRzID09PSAncHgnICYmIG1pbi5oZWlnaHQudmFsID4gMCkge1xuICAgICAgYm90dG9tVmFsID0gYm90dG9tVmFsICogMTAwIC8gbWluLmhlaWdodC52YWw7XG4gICAgfVxuICAgIHZhciB3aWR0aEJpYXNEaWZmcyA9IGNvbXB1dGVCaWFzVmFsdWVzKG1pbi53aWR0aC52YWwgLSBiYi53LCBsZWZ0VmFsLCByaWdodFZhbCk7XG4gICAgdmFyIGRpZmZMZWZ0ID0gd2lkdGhCaWFzRGlmZnMuYmlhc0RpZmY7XG4gICAgdmFyIGRpZmZSaWdodCA9IHdpZHRoQmlhc0RpZmZzLmJpYXNDb21wbGVtZW50RGlmZjtcbiAgICB2YXIgaGVpZ2h0Qmlhc0RpZmZzID0gY29tcHV0ZUJpYXNWYWx1ZXMobWluLmhlaWdodC52YWwgLSBiYi5oLCB0b3BWYWwsIGJvdHRvbVZhbCk7XG4gICAgdmFyIGRpZmZUb3AgPSBoZWlnaHRCaWFzRGlmZnMuYmlhc0RpZmY7XG4gICAgdmFyIGRpZmZCb3R0b20gPSBoZWlnaHRCaWFzRGlmZnMuYmlhc0NvbXBsZW1lbnREaWZmO1xuICAgIF9wLmF1dG9QYWRkaW5nID0gY29tcHV0ZVBhZGRpbmdWYWx1ZXMoYmIudywgYmIuaCwgcGFyZW50LnBzdHlsZSgncGFkZGluZycpLCBwYXJlbnQucHN0eWxlKCdwYWRkaW5nLXJlbGF0aXZlLXRvJykudmFsdWUpO1xuICAgIF9wLmF1dG9XaWR0aCA9IE1hdGgubWF4KGJiLncsIG1pbi53aWR0aC52YWwpO1xuICAgIHBvcy54ID0gKC1kaWZmTGVmdCArIGJiLngxICsgYmIueDIgKyBkaWZmUmlnaHQpIC8gMjtcbiAgICBfcC5hdXRvSGVpZ2h0ID0gTWF0aC5tYXgoYmIuaCwgbWluLmhlaWdodC52YWwpO1xuICAgIHBvcy55ID0gKC1kaWZmVG9wICsgYmIueTEgKyBiYi55MiArIGRpZmZCb3R0b20pIC8gMjtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgaWYgKCFfcC5jb21wb3VuZEJvdW5kc0NsZWFuIHx8IGZvcmNlKSB7XG4gICAgICB1cGRhdGUoZWxlKTtcbiAgICAgIGlmICghY3kuYmF0Y2hpbmcoKSkge1xuICAgICAgICBfcC5jb21wb3VuZEJvdW5kc0NsZWFuID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xudmFyIG5vbmluZiA9IGZ1bmN0aW9uIG5vbmluZih4KSB7XG4gIGlmICh4ID09PSBJbmZpbml0eSB8fCB4ID09PSAtSW5maW5pdHkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4geDtcbn07XG52YXIgdXBkYXRlQm91bmRzID0gZnVuY3Rpb24gdXBkYXRlQm91bmRzKGIsIHgxLCB5MSwgeDIsIHkyKSB7XG4gIC8vIGRvbid0IHVwZGF0ZSB3aXRoIHplcm8gYXJlYSBib3hlc1xuICBpZiAoeDIgLSB4MSA9PT0gMCB8fCB5MiAtIHkxID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gZG9uJ3QgdXBkYXRlIHdpdGggbnVsbCBkaW1cbiAgaWYgKHgxID09IG51bGwgfHwgeTEgPT0gbnVsbCB8fCB4MiA9PSBudWxsIHx8IHkyID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYi54MSA9IHgxIDwgYi54MSA/IHgxIDogYi54MTtcbiAgYi54MiA9IHgyID4gYi54MiA/IHgyIDogYi54MjtcbiAgYi55MSA9IHkxIDwgYi55MSA/IHkxIDogYi55MTtcbiAgYi55MiA9IHkyID4gYi55MiA/IHkyIDogYi55MjtcbiAgYi53ID0gYi54MiAtIGIueDE7XG4gIGIuaCA9IGIueTIgLSBiLnkxO1xufTtcbnZhciB1cGRhdGVCb3VuZHNGcm9tQm94ID0gZnVuY3Rpb24gdXBkYXRlQm91bmRzRnJvbUJveChiLCBiMikge1xuICBpZiAoYjIgPT0gbnVsbCkge1xuICAgIHJldHVybiBiO1xuICB9XG4gIHJldHVybiB1cGRhdGVCb3VuZHMoYiwgYjIueDEsIGIyLnkxLCBiMi54MiwgYjIueTIpO1xufTtcbnZhciBwcmVmaXhlZFByb3BlcnR5ID0gZnVuY3Rpb24gcHJlZml4ZWRQcm9wZXJ0eShvYmosIGZpZWxkLCBwcmVmaXgpIHtcbiAgcmV0dXJuIGdldFByZWZpeGVkUHJvcGVydHkob2JqLCBmaWVsZCwgcHJlZml4KTtcbn07XG52YXIgdXBkYXRlQm91bmRzRnJvbUFycm93ID0gZnVuY3Rpb24gdXBkYXRlQm91bmRzRnJvbUFycm93KGJvdW5kcywgZWxlLCBwcmVmaXgpIHtcbiAgaWYgKGVsZS5jeSgpLmhlYWRsZXNzKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcnN0eWxlID0gX3AucnN0eWxlO1xuICB2YXIgaGFsZkFyVyA9IHJzdHlsZS5hcnJvd1dpZHRoIC8gMjtcbiAgdmFyIGFycm93VHlwZSA9IGVsZS5wc3R5bGUocHJlZml4ICsgJy1hcnJvdy1zaGFwZScpLnZhbHVlO1xuICB2YXIgeDtcbiAgdmFyIHk7XG4gIGlmIChhcnJvd1R5cGUgIT09ICdub25lJykge1xuICAgIGlmIChwcmVmaXggPT09ICdzb3VyY2UnKSB7XG4gICAgICB4ID0gcnN0eWxlLnNyY1g7XG4gICAgICB5ID0gcnN0eWxlLnNyY1k7XG4gICAgfSBlbHNlIGlmIChwcmVmaXggPT09ICd0YXJnZXQnKSB7XG4gICAgICB4ID0gcnN0eWxlLnRndFg7XG4gICAgICB5ID0gcnN0eWxlLnRndFk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHggPSByc3R5bGUubWlkWDtcbiAgICAgIHkgPSByc3R5bGUubWlkWTtcbiAgICB9XG5cbiAgICAvLyBhbHdheXMgc3RvcmUgdGhlIGluZGl2aWR1YWwgYXJyb3cgYm91bmRzXG4gICAgdmFyIGJicyA9IF9wLmFycm93Qm91bmRzID0gX3AuYXJyb3dCb3VuZHMgfHwge307XG4gICAgdmFyIGJiID0gYmJzW3ByZWZpeF0gPSBiYnNbcHJlZml4XSB8fCB7fTtcbiAgICBiYi54MSA9IHggLSBoYWxmQXJXO1xuICAgIGJiLnkxID0geSAtIGhhbGZBclc7XG4gICAgYmIueDIgPSB4ICsgaGFsZkFyVztcbiAgICBiYi55MiA9IHkgKyBoYWxmQXJXO1xuICAgIGJiLncgPSBiYi54MiAtIGJiLngxO1xuICAgIGJiLmggPSBiYi55MiAtIGJiLnkxO1xuICAgIGV4cGFuZEJvdW5kaW5nQm94KGJiLCAxKTtcbiAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBiYi54MSwgYmIueTEsIGJiLngyLCBiYi55Mik7XG4gIH1cbn07XG52YXIgdXBkYXRlQm91bmRzRnJvbUxhYmVsID0gZnVuY3Rpb24gdXBkYXRlQm91bmRzRnJvbUxhYmVsKGJvdW5kcywgZWxlLCBwcmVmaXgpIHtcbiAgaWYgKGVsZS5jeSgpLmhlYWRsZXNzKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHByZWZpeERhc2g7XG4gIGlmIChwcmVmaXgpIHtcbiAgICBwcmVmaXhEYXNoID0gcHJlZml4ICsgJy0nO1xuICB9IGVsc2Uge1xuICAgIHByZWZpeERhc2ggPSAnJztcbiAgfVxuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciByc3R5bGUgPSBfcC5yc3R5bGU7XG4gIHZhciBsYWJlbCA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICdsYWJlbCcpLnN0clZhbHVlO1xuICBpZiAobGFiZWwpIHtcbiAgICB2YXIgaGFsaWduID0gZWxlLnBzdHlsZSgndGV4dC1oYWxpZ24nKTtcbiAgICB2YXIgdmFsaWduID0gZWxlLnBzdHlsZSgndGV4dC12YWxpZ24nKTtcbiAgICB2YXIgbGFiZWxXaWR0aCA9IHByZWZpeGVkUHJvcGVydHkocnN0eWxlLCAnbGFiZWxXaWR0aCcsIHByZWZpeCk7XG4gICAgdmFyIGxhYmVsSGVpZ2h0ID0gcHJlZml4ZWRQcm9wZXJ0eShyc3R5bGUsICdsYWJlbEhlaWdodCcsIHByZWZpeCk7XG4gICAgdmFyIGxhYmVsWCA9IHByZWZpeGVkUHJvcGVydHkocnN0eWxlLCAnbGFiZWxYJywgcHJlZml4KTtcbiAgICB2YXIgbGFiZWxZID0gcHJlZml4ZWRQcm9wZXJ0eShyc3R5bGUsICdsYWJlbFknLCBwcmVmaXgpO1xuICAgIHZhciBtYXJnaW5YID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ3RleHQtbWFyZ2luLXgnKS5wZlZhbHVlO1xuICAgIHZhciBtYXJnaW5ZID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ3RleHQtbWFyZ2luLXknKS5wZlZhbHVlO1xuICAgIHZhciBpc0VkZ2UgPSBlbGUuaXNFZGdlKCk7XG4gICAgdmFyIHJvdGF0aW9uID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ3RleHQtcm90YXRpb24nKTtcbiAgICB2YXIgb3V0bGluZVdpZHRoID0gZWxlLnBzdHlsZSgndGV4dC1vdXRsaW5lLXdpZHRoJykucGZWYWx1ZTtcbiAgICB2YXIgYm9yZGVyV2lkdGggPSBlbGUucHN0eWxlKCd0ZXh0LWJvcmRlci13aWR0aCcpLnBmVmFsdWU7XG4gICAgdmFyIGhhbGZCb3JkZXJXaWR0aCA9IGJvcmRlcldpZHRoIC8gMjtcbiAgICB2YXIgcGFkZGluZyA9IGVsZS5wc3R5bGUoJ3RleHQtYmFja2dyb3VuZC1wYWRkaW5nJykucGZWYWx1ZTtcbiAgICB2YXIgbWFyZ2luT2ZFcnJvciA9IDI7IC8vIGV4cGFuZCB0byB3b3JrIGFyb3VuZCBicm93c2VyIGRpbWVuc2lvbiBpbmFjY3VyYWNpZXNcblxuICAgIHZhciBsaCA9IGxhYmVsSGVpZ2h0O1xuICAgIHZhciBsdyA9IGxhYmVsV2lkdGg7XG4gICAgdmFyIGx3XzIgPSBsdyAvIDI7XG4gICAgdmFyIGxoXzIgPSBsaCAvIDI7XG4gICAgdmFyIGx4MSwgbHgyLCBseTEsIGx5MjtcbiAgICBpZiAoaXNFZGdlKSB7XG4gICAgICBseDEgPSBsYWJlbFggLSBsd18yO1xuICAgICAgbHgyID0gbGFiZWxYICsgbHdfMjtcbiAgICAgIGx5MSA9IGxhYmVsWSAtIGxoXzI7XG4gICAgICBseTIgPSBsYWJlbFkgKyBsaF8yO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKGhhbGlnbi52YWx1ZSkge1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBseDEgPSBsYWJlbFggLSBsdztcbiAgICAgICAgICBseDIgPSBsYWJlbFg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgbHgxID0gbGFiZWxYIC0gbHdfMjtcbiAgICAgICAgICBseDIgPSBsYWJlbFggKyBsd18yO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgbHgxID0gbGFiZWxYO1xuICAgICAgICAgIGx4MiA9IGxhYmVsWCArIGx3O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh2YWxpZ24udmFsdWUpIHtcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICBseTEgPSBsYWJlbFkgLSBsaDtcbiAgICAgICAgICBseTIgPSBsYWJlbFk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgbHkxID0gbGFiZWxZIC0gbGhfMjtcbiAgICAgICAgICBseTIgPSBsYWJlbFkgKyBsaF8yO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIGx5MSA9IGxhYmVsWTtcbiAgICAgICAgICBseTIgPSBsYWJlbFkgKyBsaDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzaGlmdCBieSBtYXJnaW4gYW5kIGV4cGFuZCBieSBvdXRsaW5lIGFuZCBib3JkZXJcbiAgICBseDEgKz0gbWFyZ2luWCAtIE1hdGgubWF4KG91dGxpbmVXaWR0aCwgaGFsZkJvcmRlcldpZHRoKSAtIHBhZGRpbmcgLSBtYXJnaW5PZkVycm9yO1xuICAgIGx4MiArPSBtYXJnaW5YICsgTWF0aC5tYXgob3V0bGluZVdpZHRoLCBoYWxmQm9yZGVyV2lkdGgpICsgcGFkZGluZyArIG1hcmdpbk9mRXJyb3I7XG4gICAgbHkxICs9IG1hcmdpblkgLSBNYXRoLm1heChvdXRsaW5lV2lkdGgsIGhhbGZCb3JkZXJXaWR0aCkgLSBwYWRkaW5nIC0gbWFyZ2luT2ZFcnJvcjtcbiAgICBseTIgKz0gbWFyZ2luWSArIE1hdGgubWF4KG91dGxpbmVXaWR0aCwgaGFsZkJvcmRlcldpZHRoKSArIHBhZGRpbmcgKyBtYXJnaW5PZkVycm9yO1xuXG4gICAgLy8gYWx3YXlzIHN0b3JlIHRoZSB1bnJvdGF0ZWQgbGFiZWwgYm91bmRzIHNlcGFyYXRlbHlcbiAgICB2YXIgYmJQcmVmaXggPSBwcmVmaXggfHwgJ21haW4nO1xuICAgIHZhciBiYnMgPSBfcC5sYWJlbEJvdW5kcztcbiAgICB2YXIgYmIgPSBiYnNbYmJQcmVmaXhdID0gYmJzW2JiUHJlZml4XSB8fCB7fTtcbiAgICBiYi54MSA9IGx4MTtcbiAgICBiYi55MSA9IGx5MTtcbiAgICBiYi54MiA9IGx4MjtcbiAgICBiYi55MiA9IGx5MjtcbiAgICBiYi53ID0gbHgyIC0gbHgxO1xuICAgIGJiLmggPSBseTIgLSBseTE7XG4gICAgdmFyIGlzQXV0b3JvdGF0ZSA9IGlzRWRnZSAmJiByb3RhdGlvbi5zdHJWYWx1ZSA9PT0gJ2F1dG9yb3RhdGUnO1xuICAgIHZhciBpc1BmVmFsdWUgPSByb3RhdGlvbi5wZlZhbHVlICE9IG51bGwgJiYgcm90YXRpb24ucGZWYWx1ZSAhPT0gMDtcbiAgICBpZiAoaXNBdXRvcm90YXRlIHx8IGlzUGZWYWx1ZSkge1xuICAgICAgdmFyIHRoZXRhID0gaXNBdXRvcm90YXRlID8gcHJlZml4ZWRQcm9wZXJ0eShfcC5yc3R5bGUsICdsYWJlbEFuZ2xlJywgcHJlZml4KSA6IHJvdGF0aW9uLnBmVmFsdWU7XG4gICAgICB2YXIgY29zID0gTWF0aC5jb3ModGhldGEpO1xuICAgICAgdmFyIHNpbiA9IE1hdGguc2luKHRoZXRhKTtcblxuICAgICAgLy8gcm90YXRpb24gcG9pbnQgKGRlZmF1bHQgdmFsdWUgZm9yIGNlbnRlci1jZW50ZXIpXG4gICAgICB2YXIgeG8gPSAobHgxICsgbHgyKSAvIDI7XG4gICAgICB2YXIgeW8gPSAobHkxICsgbHkyKSAvIDI7XG4gICAgICBpZiAoIWlzRWRnZSkge1xuICAgICAgICBzd2l0Y2ggKGhhbGlnbi52YWx1ZSkge1xuICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgeG8gPSBseDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICB4byA9IGx4MTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodmFsaWduLnZhbHVlKSB7XG4gICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgIHlvID0gbHkyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgIHlvID0gbHkxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciByb3RhdGUgPSBmdW5jdGlvbiByb3RhdGUoeCwgeSkge1xuICAgICAgICB4ID0geCAtIHhvO1xuICAgICAgICB5ID0geSAtIHlvO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IHggKiBjb3MgLSB5ICogc2luICsgeG8sXG4gICAgICAgICAgeTogeCAqIHNpbiArIHkgKiBjb3MgKyB5b1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIHZhciBweDF5MSA9IHJvdGF0ZShseDEsIGx5MSk7XG4gICAgICB2YXIgcHgxeTIgPSByb3RhdGUobHgxLCBseTIpO1xuICAgICAgdmFyIHB4MnkxID0gcm90YXRlKGx4MiwgbHkxKTtcbiAgICAgIHZhciBweDJ5MiA9IHJvdGF0ZShseDIsIGx5Mik7XG4gICAgICBseDEgPSBNYXRoLm1pbihweDF5MS54LCBweDF5Mi54LCBweDJ5MS54LCBweDJ5Mi54KTtcbiAgICAgIGx4MiA9IE1hdGgubWF4KHB4MXkxLngsIHB4MXkyLngsIHB4MnkxLngsIHB4MnkyLngpO1xuICAgICAgbHkxID0gTWF0aC5taW4ocHgxeTEueSwgcHgxeTIueSwgcHgyeTEueSwgcHgyeTIueSk7XG4gICAgICBseTIgPSBNYXRoLm1heChweDF5MS55LCBweDF5Mi55LCBweDJ5MS55LCBweDJ5Mi55KTtcbiAgICB9XG4gICAgdmFyIGJiUHJlZml4Um90ID0gYmJQcmVmaXggKyAnUm90JztcbiAgICB2YXIgYmJSb3QgPSBiYnNbYmJQcmVmaXhSb3RdID0gYmJzW2JiUHJlZml4Um90XSB8fCB7fTtcbiAgICBiYlJvdC54MSA9IGx4MTtcbiAgICBiYlJvdC55MSA9IGx5MTtcbiAgICBiYlJvdC54MiA9IGx4MjtcbiAgICBiYlJvdC55MiA9IGx5MjtcbiAgICBiYlJvdC53ID0gbHgyIC0gbHgxO1xuICAgIGJiUm90LmggPSBseTIgLSBseTE7XG4gICAgdXBkYXRlQm91bmRzKGJvdW5kcywgbHgxLCBseTEsIGx4MiwgbHkyKTtcbiAgICB1cGRhdGVCb3VuZHMoX3AubGFiZWxCb3VuZHMuYWxsLCBseDEsIGx5MSwgbHgyLCBseTIpO1xuICB9XG4gIHJldHVybiBib3VuZHM7XG59O1xudmFyIHVwZGF0ZUJvdW5kc0Zyb21PdXRsaW5lID0gZnVuY3Rpb24gdXBkYXRlQm91bmRzRnJvbU91dGxpbmUoYm91bmRzLCBlbGUpIHtcbiAgaWYgKGVsZS5jeSgpLmhlYWRsZXNzKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG91dGxpbmVPcGFjaXR5ID0gZWxlLnBzdHlsZSgnb3V0bGluZS1vcGFjaXR5JykudmFsdWU7XG4gIHZhciBvdXRsaW5lV2lkdGggPSBlbGUucHN0eWxlKCdvdXRsaW5lLXdpZHRoJykudmFsdWU7XG4gIGlmIChvdXRsaW5lT3BhY2l0eSA+IDAgJiYgb3V0bGluZVdpZHRoID4gMCkge1xuICAgIHZhciBvdXRsaW5lT2Zmc2V0ID0gZWxlLnBzdHlsZSgnb3V0bGluZS1vZmZzZXQnKS52YWx1ZTtcbiAgICB2YXIgbm9kZVNoYXBlID0gZWxlLnBzdHlsZSgnc2hhcGUnKS52YWx1ZTtcbiAgICB2YXIgb3V0bGluZVNpemUgPSBvdXRsaW5lV2lkdGggKyBvdXRsaW5lT2Zmc2V0O1xuICAgIHZhciBzY2FsZVggPSAoYm91bmRzLncgKyBvdXRsaW5lU2l6ZSAqIDIpIC8gYm91bmRzLnc7XG4gICAgdmFyIHNjYWxlWSA9IChib3VuZHMuaCArIG91dGxpbmVTaXplICogMikgLyBib3VuZHMuaDtcbiAgICB2YXIgeE9mZnNldCA9IDA7XG4gICAgdmFyIHlPZmZzZXQgPSAwO1xuICAgIGlmIChbXCJkaWFtb25kXCIsIFwicGVudGFnb25cIiwgXCJyb3VuZC10cmlhbmdsZVwiXS5pbmNsdWRlcyhub2RlU2hhcGUpKSB7XG4gICAgICBzY2FsZVggPSAoYm91bmRzLncgKyBvdXRsaW5lU2l6ZSAqIDIuNCkgLyBib3VuZHMudztcbiAgICAgIHlPZmZzZXQgPSAtb3V0bGluZVNpemUgLyAzLjY7XG4gICAgfSBlbHNlIGlmIChbXCJjb25jYXZlLWhleGFnb25cIiwgXCJyaG9tYm9pZFwiLCBcInJpZ2h0LXJob21ib2lkXCJdLmluY2x1ZGVzKG5vZGVTaGFwZSkpIHtcbiAgICAgIHNjYWxlWCA9IChib3VuZHMudyArIG91dGxpbmVTaXplICogMi40KSAvIGJvdW5kcy53O1xuICAgIH0gZWxzZSBpZiAobm9kZVNoYXBlID09PSBcInN0YXJcIikge1xuICAgICAgc2NhbGVYID0gKGJvdW5kcy53ICsgb3V0bGluZVNpemUgKiAyLjgpIC8gYm91bmRzLnc7XG4gICAgICBzY2FsZVkgPSAoYm91bmRzLmggKyBvdXRsaW5lU2l6ZSAqIDIuNikgLyBib3VuZHMuaDtcbiAgICAgIHlPZmZzZXQgPSAtb3V0bGluZVNpemUgLyAzLjg7XG4gICAgfSBlbHNlIGlmIChub2RlU2hhcGUgPT09IFwidHJpYW5nbGVcIikge1xuICAgICAgc2NhbGVYID0gKGJvdW5kcy53ICsgb3V0bGluZVNpemUgKiAyLjgpIC8gYm91bmRzLnc7XG4gICAgICBzY2FsZVkgPSAoYm91bmRzLmggKyBvdXRsaW5lU2l6ZSAqIDIuNCkgLyBib3VuZHMuaDtcbiAgICAgIHlPZmZzZXQgPSAtb3V0bGluZVNpemUgLyAxLjQ7XG4gICAgfSBlbHNlIGlmIChub2RlU2hhcGUgPT09IFwidmVlXCIpIHtcbiAgICAgIHNjYWxlWCA9IChib3VuZHMudyArIG91dGxpbmVTaXplICogNC40KSAvIGJvdW5kcy53O1xuICAgICAgc2NhbGVZID0gKGJvdW5kcy5oICsgb3V0bGluZVNpemUgKiAzLjgpIC8gYm91bmRzLmg7XG4gICAgICB5T2Zmc2V0ID0gLW91dGxpbmVTaXplICogLjU7XG4gICAgfVxuICAgIHZhciBoRGVsdGEgPSBib3VuZHMuaCAqIHNjYWxlWSAtIGJvdW5kcy5oO1xuICAgIHZhciB3RGVsdGEgPSBib3VuZHMudyAqIHNjYWxlWCAtIGJvdW5kcy53O1xuICAgIGV4cGFuZEJvdW5kaW5nQm94U2lkZXMoYm91bmRzLCBbTWF0aC5jZWlsKGhEZWx0YSAvIDIpLCBNYXRoLmNlaWwod0RlbHRhIC8gMildKTtcbiAgICBpZiAoeE9mZnNldCAhPSAwIHx8IHlPZmZzZXQgIT09IDApIHtcbiAgICAgIHZhciBvQm91bmRzID0gc2hpZnRCb3VuZGluZ0JveChib3VuZHMsIHhPZmZzZXQsIHlPZmZzZXQpO1xuICAgICAgdXBkYXRlQm91bmRpbmdCb3goYm91bmRzLCBvQm91bmRzKTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIGdldCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBlbGVtZW50cyAoaW4gcmF3IG1vZGVsIHBvc2l0aW9uKVxudmFyIGJvdW5kaW5nQm94SW1wbCA9IGZ1bmN0aW9uIGJvdW5kaW5nQm94SW1wbChlbGUsIG9wdGlvbnMpIHtcbiAgdmFyIGN5ID0gZWxlLl9wcml2YXRlLmN5O1xuICB2YXIgc3R5bGVFbmFibGVkID0gY3kuc3R5bGVFbmFibGVkKCk7XG4gIHZhciBoZWFkbGVzcyA9IGN5LmhlYWRsZXNzKCk7XG4gIHZhciBib3VuZHMgPSBtYWtlQm91bmRpbmdCb3goKTtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgaXNOb2RlID0gZWxlLmlzTm9kZSgpO1xuICB2YXIgaXNFZGdlID0gZWxlLmlzRWRnZSgpO1xuICB2YXIgZXgxLCBleDIsIGV5MSwgZXkyOyAvLyBleHRyZW1hIG9mIGJvZHkgLyBsaW5lc1xuICB2YXIgeCwgeTsgLy8gbm9kZSBwb3NcbiAgdmFyIHJzdHlsZSA9IF9wLnJzdHlsZTtcbiAgdmFyIG1hbnVhbEV4cGFuc2lvbiA9IGlzTm9kZSAmJiBzdHlsZUVuYWJsZWQgPyBlbGUucHN0eWxlKCdib3VuZHMtZXhwYW5zaW9uJykucGZWYWx1ZSA6IFswXTtcblxuICAvLyBtdXN0IHVzZSBgZGlzcGxheWAgcHJvcCBvbmx5LCBhcyByZWFkaW5nIGBjb21wb3VuZC53aWR0aCgpYCBjYXVzZXMgcmVjdXJzaW9uXG4gIC8vIChvdGhlciBmYWN0b3JzIGxpa2Ugd2lkdGggdmFsdWVzIHdpbGwgYmUgY29uc2lkZXJlZCBsYXRlciBpbiB0aGlzIGZ1bmN0aW9uIGFueXdheSlcbiAgdmFyIGlzRGlzcGxheWVkID0gZnVuY3Rpb24gaXNEaXNwbGF5ZWQoZWxlKSB7XG4gICAgcmV0dXJuIGVsZS5wc3R5bGUoJ2Rpc3BsYXknKS52YWx1ZSAhPT0gJ25vbmUnO1xuICB9O1xuICB2YXIgZGlzcGxheWVkID0gIXN0eWxlRW5hYmxlZCB8fCBpc0Rpc3BsYXllZChlbGUpXG5cbiAgLy8gbXVzdCB0YWtlIGludG8gYWNjb3VudCBjb25uZWN0ZWQgbm9kZXMgYi9jIG9mIGltcGxpY2l0IGVkZ2UgaGlkaW5nIG9uIGRpc3BsYXk6bm9uZSBub2RlXG4gICYmICghaXNFZGdlIHx8IGlzRGlzcGxheWVkKGVsZS5zb3VyY2UoKSkgJiYgaXNEaXNwbGF5ZWQoZWxlLnRhcmdldCgpKSk7XG4gIGlmIChkaXNwbGF5ZWQpIHtcbiAgICAvLyBkaXNwbGF5ZWQgc3VmZmljZXMsIHNpbmNlIHdlIHdpbGwgZmluZCB6ZXJvIGFyZWEgZWxlcyBhbnl3YXlcbiAgICB2YXIgb3ZlcmxheU9wYWNpdHkgPSAwO1xuICAgIHZhciBvdmVybGF5UGFkZGluZyA9IDA7XG4gICAgaWYgKHN0eWxlRW5hYmxlZCAmJiBvcHRpb25zLmluY2x1ZGVPdmVybGF5cykge1xuICAgICAgb3ZlcmxheU9wYWNpdHkgPSBlbGUucHN0eWxlKCdvdmVybGF5LW9wYWNpdHknKS52YWx1ZTtcbiAgICAgIGlmIChvdmVybGF5T3BhY2l0eSAhPT0gMCkge1xuICAgICAgICBvdmVybGF5UGFkZGluZyA9IGVsZS5wc3R5bGUoJ292ZXJsYXktcGFkZGluZycpLnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgdW5kZXJsYXlPcGFjaXR5ID0gMDtcbiAgICB2YXIgdW5kZXJsYXlQYWRkaW5nID0gMDtcbiAgICBpZiAoc3R5bGVFbmFibGVkICYmIG9wdGlvbnMuaW5jbHVkZVVuZGVybGF5cykge1xuICAgICAgdW5kZXJsYXlPcGFjaXR5ID0gZWxlLnBzdHlsZSgndW5kZXJsYXktb3BhY2l0eScpLnZhbHVlO1xuICAgICAgaWYgKHVuZGVybGF5T3BhY2l0eSAhPT0gMCkge1xuICAgICAgICB1bmRlcmxheVBhZGRpbmcgPSBlbGUucHN0eWxlKCd1bmRlcmxheS1wYWRkaW5nJykudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBwYWRkaW5nID0gTWF0aC5tYXgob3ZlcmxheVBhZGRpbmcsIHVuZGVybGF5UGFkZGluZyk7XG4gICAgdmFyIHcgPSAwO1xuICAgIHZhciB3SGFsZiA9IDA7XG4gICAgaWYgKHN0eWxlRW5hYmxlZCkge1xuICAgICAgdyA9IGVsZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgICAgIHdIYWxmID0gdyAvIDI7XG4gICAgfVxuICAgIGlmIChpc05vZGUgJiYgb3B0aW9ucy5pbmNsdWRlTm9kZXMpIHtcbiAgICAgIHZhciBwb3MgPSBlbGUucG9zaXRpb24oKTtcbiAgICAgIHggPSBwb3MueDtcbiAgICAgIHkgPSBwb3MueTtcbiAgICAgIHZhciBfdyA9IGVsZS5vdXRlcldpZHRoKCk7XG4gICAgICB2YXIgaGFsZlcgPSBfdyAvIDI7XG4gICAgICB2YXIgaCA9IGVsZS5vdXRlckhlaWdodCgpO1xuICAgICAgdmFyIGhhbGZIID0gaCAvIDI7XG5cbiAgICAgIC8vIGhhbmRsZSBub2RlIGRpbWVuc2lvbnNcbiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgZXgxID0geCAtIGhhbGZXO1xuICAgICAgZXgyID0geCArIGhhbGZXO1xuICAgICAgZXkxID0geSAtIGhhbGZIO1xuICAgICAgZXkyID0geSArIGhhbGZIO1xuICAgICAgdXBkYXRlQm91bmRzKGJvdW5kcywgZXgxLCBleTEsIGV4MiwgZXkyKTtcbiAgICAgIGlmIChzdHlsZUVuYWJsZWQgJiYgb3B0aW9ucy5pbmNsdWRlT3V0bGluZXMpIHtcbiAgICAgICAgdXBkYXRlQm91bmRzRnJvbU91dGxpbmUoYm91bmRzLCBlbGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNFZGdlICYmIG9wdGlvbnMuaW5jbHVkZUVkZ2VzKSB7XG4gICAgICBpZiAoc3R5bGVFbmFibGVkICYmICFoZWFkbGVzcykge1xuICAgICAgICB2YXIgY3VydmVTdHlsZSA9IGVsZS5wc3R5bGUoJ2N1cnZlLXN0eWxlJykuc3RyVmFsdWU7XG5cbiAgICAgICAgLy8gaGFuZGxlIGVkZ2UgZGltZW5zaW9ucyAocm91Z2ggYm94IGVzdGltYXRlKVxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgZXgxID0gTWF0aC5taW4ocnN0eWxlLnNyY1gsIHJzdHlsZS5taWRYLCByc3R5bGUudGd0WCk7XG4gICAgICAgIGV4MiA9IE1hdGgubWF4KHJzdHlsZS5zcmNYLCByc3R5bGUubWlkWCwgcnN0eWxlLnRndFgpO1xuICAgICAgICBleTEgPSBNYXRoLm1pbihyc3R5bGUuc3JjWSwgcnN0eWxlLm1pZFksIHJzdHlsZS50Z3RZKTtcbiAgICAgICAgZXkyID0gTWF0aC5tYXgocnN0eWxlLnNyY1ksIHJzdHlsZS5taWRZLCByc3R5bGUudGd0WSk7XG5cbiAgICAgICAgLy8gdGFrZSBpbnRvIGFjY291bnQgZWRnZSB3aWR0aFxuICAgICAgICBleDEgLT0gd0hhbGY7XG4gICAgICAgIGV4MiArPSB3SGFsZjtcbiAgICAgICAgZXkxIC09IHdIYWxmO1xuICAgICAgICBleTIgKz0gd0hhbGY7XG4gICAgICAgIHVwZGF0ZUJvdW5kcyhib3VuZHMsIGV4MSwgZXkxLCBleDIsIGV5Mik7XG5cbiAgICAgICAgLy8gcHJlY2lzZSBlZGdlc1xuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgaWYgKGN1cnZlU3R5bGUgPT09ICdoYXlzdGFjaycpIHtcbiAgICAgICAgICB2YXIgaHB0cyA9IHJzdHlsZS5oYXlzdGFja1B0cztcbiAgICAgICAgICBpZiAoaHB0cyAmJiBocHRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgZXgxID0gaHB0c1swXS54O1xuICAgICAgICAgICAgZXkxID0gaHB0c1swXS55O1xuICAgICAgICAgICAgZXgyID0gaHB0c1sxXS54O1xuICAgICAgICAgICAgZXkyID0gaHB0c1sxXS55O1xuICAgICAgICAgICAgaWYgKGV4MSA+IGV4Mikge1xuICAgICAgICAgICAgICB2YXIgdGVtcCA9IGV4MTtcbiAgICAgICAgICAgICAgZXgxID0gZXgyO1xuICAgICAgICAgICAgICBleDIgPSB0ZW1wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV5MSA+IGV5Mikge1xuICAgICAgICAgICAgICB2YXIgX3RlbXAgPSBleTE7XG4gICAgICAgICAgICAgIGV5MSA9IGV5MjtcbiAgICAgICAgICAgICAgZXkyID0gX3RlbXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEgLSB3SGFsZiwgZXkxIC0gd0hhbGYsIGV4MiArIHdIYWxmLCBleTIgKyB3SGFsZik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGN1cnZlU3R5bGUgPT09ICdiZXppZXInIHx8IGN1cnZlU3R5bGUgPT09ICd1bmJ1bmRsZWQtYmV6aWVyJyB8fCBjdXJ2ZVN0eWxlLmVuZHNXaXRoKCdzZWdtZW50cycpIHx8IGN1cnZlU3R5bGUuZW5kc1dpdGgoJ3RheGknKSkge1xuICAgICAgICAgIHZhciBwdHM7XG4gICAgICAgICAgc3dpdGNoIChjdXJ2ZVN0eWxlKSB7XG4gICAgICAgICAgICBjYXNlICdiZXppZXInOlxuICAgICAgICAgICAgY2FzZSAndW5idW5kbGVkLWJlemllcic6XG4gICAgICAgICAgICAgIHB0cyA9IHJzdHlsZS5iZXppZXJQdHM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2VnbWVudHMnOlxuICAgICAgICAgICAgY2FzZSAndGF4aSc6XG4gICAgICAgICAgICBjYXNlICdyb3VuZC1zZWdtZW50cyc6XG4gICAgICAgICAgICBjYXNlICdyb3VuZC10YXhpJzpcbiAgICAgICAgICAgICAgcHRzID0gcnN0eWxlLmxpbmVQdHM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgIHZhciBwdCA9IHB0c1tqXTtcbiAgICAgICAgICAgICAgZXgxID0gcHQueCAtIHdIYWxmO1xuICAgICAgICAgICAgICBleDIgPSBwdC54ICsgd0hhbGY7XG4gICAgICAgICAgICAgIGV5MSA9IHB0LnkgLSB3SGFsZjtcbiAgICAgICAgICAgICAgZXkyID0gcHQueSArIHdIYWxmO1xuICAgICAgICAgICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEsIGV5MSwgZXgyLCBleTIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBiZXppZXItbGlrZSBvciBzZWdtZW50LWxpa2UgZWRnZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaGVhZGxlc3Mgb3Igc3R5bGUgZGlzYWJsZWRcblxuICAgICAgICAvLyBmYWxsYmFjayBvbiBzb3VyY2UgYW5kIHRhcmdldCBwb3NpdGlvbnNcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgdmFyIG4xID0gZWxlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgbjFwb3MgPSBuMS5wb3NpdGlvbigpO1xuICAgICAgICB2YXIgbjIgPSBlbGUudGFyZ2V0KCk7XG4gICAgICAgIHZhciBuMnBvcyA9IG4yLnBvc2l0aW9uKCk7XG4gICAgICAgIGV4MSA9IG4xcG9zLng7XG4gICAgICAgIGV4MiA9IG4ycG9zLng7XG4gICAgICAgIGV5MSA9IG4xcG9zLnk7XG4gICAgICAgIGV5MiA9IG4ycG9zLnk7XG4gICAgICAgIGlmIChleDEgPiBleDIpIHtcbiAgICAgICAgICB2YXIgX3RlbXAyID0gZXgxO1xuICAgICAgICAgIGV4MSA9IGV4MjtcbiAgICAgICAgICBleDIgPSBfdGVtcDI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV5MSA+IGV5Mikge1xuICAgICAgICAgIHZhciBfdGVtcDMgPSBleTE7XG4gICAgICAgICAgZXkxID0gZXkyO1xuICAgICAgICAgIGV5MiA9IF90ZW1wMztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRha2UgaW50byBhY2NvdW50IGVkZ2Ugd2lkdGhcbiAgICAgICAgZXgxIC09IHdIYWxmO1xuICAgICAgICBleDIgKz0gd0hhbGY7XG4gICAgICAgIGV5MSAtPSB3SGFsZjtcbiAgICAgICAgZXkyICs9IHdIYWxmO1xuICAgICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEsIGV5MSwgZXgyLCBleTIpO1xuICAgICAgfSAvLyBoZWFkbGVzcyBvciBzdHlsZSBkaXNhYmxlZFxuICAgIH0gLy8gZWRnZXNcblxuICAgIC8vIGhhbmRsZSBlZGdlIGFycm93IHNpemVcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBpZiAoc3R5bGVFbmFibGVkICYmIG9wdGlvbnMuaW5jbHVkZUVkZ2VzICYmIGlzRWRnZSkge1xuICAgICAgdXBkYXRlQm91bmRzRnJvbUFycm93KGJvdW5kcywgZWxlLCAnbWlkLXNvdXJjZScpO1xuICAgICAgdXBkYXRlQm91bmRzRnJvbUFycm93KGJvdW5kcywgZWxlLCAnbWlkLXRhcmdldCcpO1xuICAgICAgdXBkYXRlQm91bmRzRnJvbUFycm93KGJvdW5kcywgZWxlLCAnc291cmNlJyk7XG4gICAgICB1cGRhdGVCb3VuZHNGcm9tQXJyb3coYm91bmRzLCBlbGUsICd0YXJnZXQnKTtcbiAgICB9XG5cbiAgICAvLyBnaG9zdFxuICAgIC8vLy8vLy8vXG5cbiAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICB2YXIgZ2hvc3QgPSBlbGUucHN0eWxlKCdnaG9zdCcpLnZhbHVlID09PSAneWVzJztcbiAgICAgIGlmIChnaG9zdCkge1xuICAgICAgICB2YXIgZ3ggPSBlbGUucHN0eWxlKCdnaG9zdC1vZmZzZXQteCcpLnBmVmFsdWU7XG4gICAgICAgIHZhciBneSA9IGVsZS5wc3R5bGUoJ2dob3N0LW9mZnNldC15JykucGZWYWx1ZTtcbiAgICAgICAgdXBkYXRlQm91bmRzKGJvdW5kcywgYm91bmRzLngxICsgZ3gsIGJvdW5kcy55MSArIGd5LCBib3VuZHMueDIgKyBneCwgYm91bmRzLnkyICsgZ3kpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFsd2F5cyBzdG9yZSB0aGUgYm9keSBib3VuZHMgc2VwYXJhdGVseSBmcm9tIHRoZSBsYWJlbHNcbiAgICB2YXIgYmJCb2R5ID0gX3AuYm9keUJvdW5kcyA9IF9wLmJvZHlCb3VuZHMgfHwge307XG4gICAgYXNzaWduQm91bmRpbmdCb3goYmJCb2R5LCBib3VuZHMpO1xuICAgIGV4cGFuZEJvdW5kaW5nQm94U2lkZXMoYmJCb2R5LCBtYW51YWxFeHBhbnNpb24pO1xuICAgIGV4cGFuZEJvdW5kaW5nQm94KGJiQm9keSwgMSk7IC8vIGV4cGFuZCB0byB3b3JrIGFyb3VuZCBicm93c2VyIGRpbWVuc2lvbiBpbmFjY3VyYWNpZXNcblxuICAgIC8vIG92ZXJsYXlcbiAgICAvLy8vLy8vLy8vXG5cbiAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICBleDEgPSBib3VuZHMueDE7XG4gICAgICBleDIgPSBib3VuZHMueDI7XG4gICAgICBleTEgPSBib3VuZHMueTE7XG4gICAgICBleTIgPSBib3VuZHMueTI7XG4gICAgICB1cGRhdGVCb3VuZHMoYm91bmRzLCBleDEgLSBwYWRkaW5nLCBleTEgLSBwYWRkaW5nLCBleDIgKyBwYWRkaW5nLCBleTIgKyBwYWRkaW5nKTtcbiAgICB9XG5cbiAgICAvLyBhbHdheXMgc3RvcmUgdGhlIGJvZHkgYm91bmRzIHNlcGFyYXRlbHkgZnJvbSB0aGUgbGFiZWxzXG4gICAgdmFyIGJiT3ZlcmxheSA9IF9wLm92ZXJsYXlCb3VuZHMgPSBfcC5vdmVybGF5Qm91bmRzIHx8IHt9O1xuICAgIGFzc2lnbkJvdW5kaW5nQm94KGJiT3ZlcmxheSwgYm91bmRzKTtcbiAgICBleHBhbmRCb3VuZGluZ0JveFNpZGVzKGJiT3ZlcmxheSwgbWFudWFsRXhwYW5zaW9uKTtcbiAgICBleHBhbmRCb3VuZGluZ0JveChiYk92ZXJsYXksIDEpOyAvLyBleHBhbmQgdG8gd29yayBhcm91bmQgYnJvd3NlciBkaW1lbnNpb24gaW5hY2N1cmFjaWVzXG5cbiAgICAvLyBoYW5kbGUgbGFiZWwgZGltZW5zaW9uc1xuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICB2YXIgYmJMYWJlbHMgPSBfcC5sYWJlbEJvdW5kcyA9IF9wLmxhYmVsQm91bmRzIHx8IHt9O1xuICAgIGlmIChiYkxhYmVscy5hbGwgIT0gbnVsbCkge1xuICAgICAgY2xlYXJCb3VuZGluZ0JveChiYkxhYmVscy5hbGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYkxhYmVscy5hbGwgPSBtYWtlQm91bmRpbmdCb3goKTtcbiAgICB9XG4gICAgaWYgKHN0eWxlRW5hYmxlZCAmJiBvcHRpb25zLmluY2x1ZGVMYWJlbHMpIHtcbiAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVNYWluTGFiZWxzKSB7XG4gICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21MYWJlbChib3VuZHMsIGVsZSwgbnVsbCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNFZGdlKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVTb3VyY2VMYWJlbHMpIHtcbiAgICAgICAgICB1cGRhdGVCb3VuZHNGcm9tTGFiZWwoYm91bmRzLCBlbGUsICdzb3VyY2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlVGFyZ2V0TGFiZWxzKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRzRnJvbUxhYmVsKGJvdW5kcywgZWxlLCAndGFyZ2V0Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIHN0eWxlIGVuYWJsZWQgZm9yIGxhYmVsc1xuICB9IC8vIGlmIGRpc3BsYXllZFxuXG4gIGJvdW5kcy54MSA9IG5vbmluZihib3VuZHMueDEpO1xuICBib3VuZHMueTEgPSBub25pbmYoYm91bmRzLnkxKTtcbiAgYm91bmRzLngyID0gbm9uaW5mKGJvdW5kcy54Mik7XG4gIGJvdW5kcy55MiA9IG5vbmluZihib3VuZHMueTIpO1xuICBib3VuZHMudyA9IG5vbmluZihib3VuZHMueDIgLSBib3VuZHMueDEpO1xuICBib3VuZHMuaCA9IG5vbmluZihib3VuZHMueTIgLSBib3VuZHMueTEpO1xuICBpZiAoYm91bmRzLncgPiAwICYmIGJvdW5kcy5oID4gMCAmJiBkaXNwbGF5ZWQpIHtcbiAgICBleHBhbmRCb3VuZGluZ0JveFNpZGVzKGJvdW5kcywgbWFudWFsRXhwYW5zaW9uKTtcblxuICAgIC8vIGV4cGFuZCBib3VuZHMgYnkgMSBiZWNhdXNlIGFudGlhbGlhc2luZyBjYW4gaW5jcmVhc2UgdGhlIHZpc3VhbC9lZmZlY3RpdmUgc2l6ZSBieSAxIG9uIGFsbCBzaWRlc1xuICAgIGV4cGFuZEJvdW5kaW5nQm94KGJvdW5kcywgMSk7XG4gIH1cbiAgcmV0dXJuIGJvdW5kcztcbn07XG52YXIgZ2V0S2V5ID0gZnVuY3Rpb24gZ2V0S2V5KG9wdHMpIHtcbiAgdmFyIGkgPSAwO1xuICB2YXIgdGYgPSBmdW5jdGlvbiB0Zih2YWwpIHtcbiAgICByZXR1cm4gKHZhbCA/IDEgOiAwKSA8PCBpKys7XG4gIH07XG4gIHZhciBrZXkgPSAwO1xuICBrZXkgKz0gdGYob3B0cy5pbmN1ZGVOb2Rlcyk7XG4gIGtleSArPSB0ZihvcHRzLmluY2x1ZGVFZGdlcyk7XG4gIGtleSArPSB0ZihvcHRzLmluY2x1ZGVMYWJlbHMpO1xuICBrZXkgKz0gdGYob3B0cy5pbmNsdWRlTWFpbkxhYmVscyk7XG4gIGtleSArPSB0ZihvcHRzLmluY2x1ZGVTb3VyY2VMYWJlbHMpO1xuICBrZXkgKz0gdGYob3B0cy5pbmNsdWRlVGFyZ2V0TGFiZWxzKTtcbiAga2V5ICs9IHRmKG9wdHMuaW5jbHVkZU92ZXJsYXlzKTtcbiAga2V5ICs9IHRmKG9wdHMuaW5jbHVkZU91dGxpbmVzKTtcbiAgcmV0dXJuIGtleTtcbn07XG52YXIgZ2V0Qm91bmRpbmdCb3hQb3NLZXkgPSBmdW5jdGlvbiBnZXRCb3VuZGluZ0JveFBvc0tleShlbGUpIHtcbiAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgIHZhciBwMSA9IGVsZS5zb3VyY2UoKS5wb3NpdGlvbigpO1xuICAgIHZhciBwMiA9IGVsZS50YXJnZXQoKS5wb3NpdGlvbigpO1xuICAgIHZhciByID0gZnVuY3Rpb24gcih4KSB7XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZCh4KTtcbiAgICB9O1xuICAgIHJldHVybiBoYXNoSW50c0FycmF5KFtyKHAxLngpLCByKHAxLnkpLCByKHAyLngpLCByKHAyLnkpXSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG52YXIgY2FjaGVkQm91bmRpbmdCb3hJbXBsID0gZnVuY3Rpb24gY2FjaGVkQm91bmRpbmdCb3hJbXBsKGVsZSwgb3B0cykge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBiYjtcbiAgdmFyIGlzRWRnZSA9IGVsZS5pc0VkZ2UoKTtcbiAgdmFyIGtleSA9IG9wdHMgPT0gbnVsbCA/IGRlZkJiT3B0c0tleSA6IGdldEtleShvcHRzKTtcbiAgdmFyIHVzaW5nRGVmT3B0cyA9IGtleSA9PT0gZGVmQmJPcHRzS2V5O1xuICB2YXIgY3VyclBvc0tleSA9IGdldEJvdW5kaW5nQm94UG9zS2V5KGVsZSk7XG4gIHZhciBpc1Bvc0tleVNhbWUgPSBfcC5iYkNhY2hlUG9zS2V5ID09PSBjdXJyUG9zS2V5O1xuICB2YXIgdXNlQ2FjaGUgPSBvcHRzLnVzZUNhY2hlICYmIGlzUG9zS2V5U2FtZTtcbiAgdmFyIGlzRGlydHkgPSBmdW5jdGlvbiBpc0RpcnR5KGVsZSkge1xuICAgIHJldHVybiBlbGUuX3ByaXZhdGUuYmJDYWNoZSA9PSBudWxsIHx8IGVsZS5fcHJpdmF0ZS5zdHlsZURpcnR5O1xuICB9O1xuICB2YXIgbmVlZFJlY2FsYyA9ICF1c2VDYWNoZSB8fCBpc0RpcnR5KGVsZSkgfHwgaXNFZGdlICYmIGlzRGlydHkoZWxlLnNvdXJjZSgpKSB8fCBpc0RpcnR5KGVsZS50YXJnZXQoKSk7XG4gIGlmIChuZWVkUmVjYWxjKSB7XG4gICAgaWYgKCFpc1Bvc0tleVNhbWUpIHtcbiAgICAgIGVsZS5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUodXNlQ2FjaGUpO1xuICAgIH1cbiAgICBiYiA9IGJvdW5kaW5nQm94SW1wbChlbGUsIGRlZkJiT3B0cyk7XG4gICAgX3AuYmJDYWNoZSA9IGJiO1xuICAgIF9wLmJiQ2FjaGVQb3NLZXkgPSBjdXJyUG9zS2V5O1xuICB9IGVsc2Uge1xuICAgIGJiID0gX3AuYmJDYWNoZTtcbiAgfVxuXG4gIC8vIG5vdCB1c2luZyBkZWYgb3B0cyA9PiBuZWVkIHRvIGJ1aWxkIHVwIGJiIGZyb20gY29tYmluYXRpb24gb2Ygc3ViIGJic1xuICBpZiAoIXVzaW5nRGVmT3B0cykge1xuICAgIHZhciBpc05vZGUgPSBlbGUuaXNOb2RlKCk7XG4gICAgYmIgPSBtYWtlQm91bmRpbmdCb3goKTtcbiAgICBpZiAob3B0cy5pbmNsdWRlTm9kZXMgJiYgaXNOb2RlIHx8IG9wdHMuaW5jbHVkZUVkZ2VzICYmICFpc05vZGUpIHtcbiAgICAgIGlmIChvcHRzLmluY2x1ZGVPdmVybGF5cykge1xuICAgICAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJiLCBfcC5vdmVybGF5Qm91bmRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVwZGF0ZUJvdW5kc0Zyb21Cb3goYmIsIF9wLmJvZHlCb3VuZHMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3B0cy5pbmNsdWRlTGFiZWxzKSB7XG4gICAgICBpZiAob3B0cy5pbmNsdWRlTWFpbkxhYmVscyAmJiAoIWlzRWRnZSB8fCBvcHRzLmluY2x1ZGVTb3VyY2VMYWJlbHMgJiYgb3B0cy5pbmNsdWRlVGFyZ2V0TGFiZWxzKSkge1xuICAgICAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJiLCBfcC5sYWJlbEJvdW5kcy5hbGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9wdHMuaW5jbHVkZU1haW5MYWJlbHMpIHtcbiAgICAgICAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJiLCBfcC5sYWJlbEJvdW5kcy5tYWluUm90KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5pbmNsdWRlU291cmNlTGFiZWxzKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRzRnJvbUJveChiYiwgX3AubGFiZWxCb3VuZHMuc291cmNlUm90KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5pbmNsdWRlVGFyZ2V0TGFiZWxzKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRzRnJvbUJveChiYiwgX3AubGFiZWxCb3VuZHMudGFyZ2V0Um90KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBiYi53ID0gYmIueDIgLSBiYi54MTtcbiAgICBiYi5oID0gYmIueTIgLSBiYi55MTtcbiAgfVxuICByZXR1cm4gYmI7XG59O1xudmFyIGRlZkJiT3B0cyA9IHtcbiAgaW5jbHVkZU5vZGVzOiB0cnVlLFxuICBpbmNsdWRlRWRnZXM6IHRydWUsXG4gIGluY2x1ZGVMYWJlbHM6IHRydWUsXG4gIGluY2x1ZGVNYWluTGFiZWxzOiB0cnVlLFxuICBpbmNsdWRlU291cmNlTGFiZWxzOiB0cnVlLFxuICBpbmNsdWRlVGFyZ2V0TGFiZWxzOiB0cnVlLFxuICBpbmNsdWRlT3ZlcmxheXM6IHRydWUsXG4gIGluY2x1ZGVVbmRlcmxheXM6IHRydWUsXG4gIGluY2x1ZGVPdXRsaW5lczogdHJ1ZSxcbiAgdXNlQ2FjaGU6IHRydWVcbn07XG52YXIgZGVmQmJPcHRzS2V5ID0gZ2V0S2V5KGRlZkJiT3B0cyk7XG52YXIgZmlsbGVkQmJPcHRzID0gZGVmYXVsdHMkZyhkZWZCYk9wdHMpO1xuZWxlc2ZuJGIuYm91bmRpbmdCb3ggPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB2YXIgYm91bmRzO1xuXG4gIC8vIHRoZSBtYWluIHVzZWNhc2UgaXMgZWxlLmJvdW5kaW5nQm94KCkgZm9yIGEgc2luZ2xlIGVsZW1lbnQgd2l0aCBuby9kZWYgb3B0aW9uc1xuICAvLyBzcGVjaWZpZWQgcy50LiB0aGUgY2FjaGUgaXMgdXNlZCwgc28gY2hlY2sgZm9yIHRoaXMgY2FzZSB0byBtYWtlIGl0IGZhc3RlciBieVxuICAvLyBhdm9pZGluZyB0aGUgb3ZlcmhlYWQgb2YgdGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uXG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzWzBdLl9wcml2YXRlLmJiQ2FjaGUgIT0gbnVsbCAmJiAhdGhpc1swXS5fcHJpdmF0ZS5zdHlsZURpcnR5ICYmIChvcHRpb25zID09PSB1bmRlZmluZWQgfHwgb3B0aW9ucy51c2VDYWNoZSA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMudXNlQ2FjaGUgPT09IHRydWUpKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucyA9IGRlZkJiT3B0cztcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IGZpbGxlZEJiT3B0cyhvcHRpb25zKTtcbiAgICB9XG4gICAgYm91bmRzID0gY2FjaGVkQm91bmRpbmdCb3hJbXBsKHRoaXNbMF0sIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIGJvdW5kcyA9IG1ha2VCb3VuZGluZ0JveCgpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IGRlZkJiT3B0cztcbiAgICB2YXIgb3B0cyA9IGZpbGxlZEJiT3B0cyhvcHRpb25zKTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIGN5ID0gZWxlcy5jeSgpO1xuICAgIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5zdHlsZUVuYWJsZWQoKTtcbiAgICBpZiAoc3R5bGVFbmFibGVkKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgICAgdmFyIGN1cnJQb3NLZXkgPSBnZXRCb3VuZGluZ0JveFBvc0tleShlbGUpO1xuICAgICAgICB2YXIgaXNQb3NLZXlTYW1lID0gX3AuYmJDYWNoZVBvc0tleSA9PT0gY3VyclBvc0tleTtcbiAgICAgICAgdmFyIHVzZUNhY2hlID0gb3B0cy51c2VDYWNoZSAmJiBpc1Bvc0tleVNhbWUgJiYgIV9wLnN0eWxlRGlydHk7XG4gICAgICAgIGVsZS5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUodXNlQ2FjaGUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNvbXBvdW5kQm91bmRzKCFvcHRpb25zLnVzZUNhY2hlKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZWxlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfZWxlID0gZWxlc1tfaV07XG4gICAgICB1cGRhdGVCb3VuZHNGcm9tQm94KGJvdW5kcywgY2FjaGVkQm91bmRpbmdCb3hJbXBsKF9lbGUsIG9wdHMpKTtcbiAgICB9XG4gIH1cbiAgYm91bmRzLngxID0gbm9uaW5mKGJvdW5kcy54MSk7XG4gIGJvdW5kcy55MSA9IG5vbmluZihib3VuZHMueTEpO1xuICBib3VuZHMueDIgPSBub25pbmYoYm91bmRzLngyKTtcbiAgYm91bmRzLnkyID0gbm9uaW5mKGJvdW5kcy55Mik7XG4gIGJvdW5kcy53ID0gbm9uaW5mKGJvdW5kcy54MiAtIGJvdW5kcy54MSk7XG4gIGJvdW5kcy5oID0gbm9uaW5mKGJvdW5kcy55MiAtIGJvdW5kcy55MSk7XG4gIHJldHVybiBib3VuZHM7XG59O1xuZWxlc2ZuJGIuZGlydHlCb3VuZGluZ0JveENhY2hlID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgX3AgPSB0aGlzW2ldLl9wcml2YXRlO1xuICAgIF9wLmJiQ2FjaGUgPSBudWxsO1xuICAgIF9wLmJiQ2FjaGVQb3NLZXkgPSBudWxsO1xuICAgIF9wLmJvZHlCb3VuZHMgPSBudWxsO1xuICAgIF9wLm92ZXJsYXlCb3VuZHMgPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLmFsbCA9IG51bGw7XG4gICAgX3AubGFiZWxCb3VuZHMuc291cmNlID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy50YXJnZXQgPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLm1haW4gPSBudWxsO1xuICAgIF9wLmxhYmVsQm91bmRzLnNvdXJjZVJvdCA9IG51bGw7XG4gICAgX3AubGFiZWxCb3VuZHMudGFyZ2V0Um90ID0gbnVsbDtcbiAgICBfcC5sYWJlbEJvdW5kcy5tYWluUm90ID0gbnVsbDtcbiAgICBfcC5hcnJvd0JvdW5kcy5zb3VyY2UgPSBudWxsO1xuICAgIF9wLmFycm93Qm91bmRzLnRhcmdldCA9IG51bGw7XG4gICAgX3AuYXJyb3dCb3VuZHNbJ21pZC1zb3VyY2UnXSA9IG51bGw7XG4gICAgX3AuYXJyb3dCb3VuZHNbJ21pZC10YXJnZXQnXSA9IG51bGw7XG4gIH1cbiAgdGhpcy5lbWl0QW5kTm90aWZ5KCdib3VuZHMnKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBwcml2YXRlIGhlbHBlciB0byBnZXQgYm91bmRpbmcgYm94IGZvciBjdXN0b20gbm9kZSBwb3NpdGlvbnNcbi8vIC0gZ29vZCBmb3IgcGVyZiBpbiBjZXJ0YWluIGNhc2VzIGJ1dCBjdXJyZW50bHkgcmVxdWlyZXMgZGlydHlpbmcgdGhlIHJlbmRlcmVkIHN0eWxlXG4vLyAtIHdvdWxkIGJlIGJldHRlciB0byBub3QgbW9kaWZ5IHRoZSBub2RlcyBidXQgdGhlIG5vZGVzIGFyZSByZWFkIGRpcmVjdGx5IGV2ZXJ5d2hlcmUgaW4gdGhlIHJlbmRlcmVyLi4uXG4vLyAtIHRyeSB0byB1c2UgZm9yIG9ubHkgdGhpbmdzIGxpa2UgZGlzY3JldGUgbGF5b3V0cyB3aGVyZSB0aGUgbm9kZSBwb3NpdGlvbiB3b3VsZCBjaGFuZ2UgYW55d2F5XG5lbGVzZm4kYi5ib3VuZGluZ0JveEF0ID0gZnVuY3Rpb24gKGZuKSB7XG4gIHZhciBub2RlcyA9IHRoaXMubm9kZXMoKTtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgaGFzQ29tcG91bmROb2RlcyA9IGN5Lmhhc0NvbXBvdW5kTm9kZXMoKTtcbiAgdmFyIHBhcmVudHMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gIGlmIChoYXNDb21wb3VuZE5vZGVzKSB7XG4gICAgcGFyZW50cyA9IG5vZGVzLmZpbHRlcihmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUuaXNQYXJlbnQoKTtcbiAgICB9KTtcbiAgICBub2RlcyA9IG5vZGVzLm5vdChwYXJlbnRzKTtcbiAgfVxuICBpZiAocGxhaW5PYmplY3QoZm4pKSB7XG4gICAgdmFyIG9iaiA9IGZuO1xuICAgIGZuID0gZnVuY3Rpb24gZm4oKSB7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH07XG4gIH1cbiAgdmFyIHN0b3JlT2xkUG9zID0gZnVuY3Rpb24gc3RvcmVPbGRQb3Mobm9kZSwgaSkge1xuICAgIHJldHVybiBub2RlLl9wcml2YXRlLmJiQXRPbGRQb3MgPSBmbihub2RlLCBpKTtcbiAgfTtcbiAgdmFyIGdldE9sZFBvcyA9IGZ1bmN0aW9uIGdldE9sZFBvcyhub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuX3ByaXZhdGUuYmJBdE9sZFBvcztcbiAgfTtcbiAgY3kuc3RhcnRCYXRjaCgpO1xuICBub2Rlcy5mb3JFYWNoKHN0b3JlT2xkUG9zKS5zaWxlbnRQb3NpdGlvbnMoZm4pO1xuICBpZiAoaGFzQ29tcG91bmROb2Rlcykge1xuICAgIHBhcmVudHMuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG4gICAgcGFyZW50cy5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgICBwYXJlbnRzLnVwZGF0ZUNvbXBvdW5kQm91bmRzKHRydWUpOyAvLyBmb3JjZSB1cGRhdGUgYi9jIHdlJ3JlIGluc2lkZSBhIGJhdGNoIGN5Y2xlXG4gIH1cblxuICB2YXIgYmIgPSBjb3B5Qm91bmRpbmdCb3godGhpcy5ib3VuZGluZ0JveCh7XG4gICAgdXNlQ2FjaGU6IGZhbHNlXG4gIH0pKTtcbiAgbm9kZXMuc2lsZW50UG9zaXRpb25zKGdldE9sZFBvcyk7XG4gIGlmIChoYXNDb21wb3VuZE5vZGVzKSB7XG4gICAgcGFyZW50cy5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKTtcbiAgICBwYXJlbnRzLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgIHBhcmVudHMudXBkYXRlQ29tcG91bmRCb3VuZHModHJ1ZSk7IC8vIGZvcmNlIHVwZGF0ZSBiL2Mgd2UncmUgaW5zaWRlIGEgYmF0Y2ggY3ljbGVcbiAgfVxuXG4gIGN5LmVuZEJhdGNoKCk7XG4gIHJldHVybiBiYjtcbn07XG5mbiQzLmJvdW5kaW5nYm94ID0gZm4kMy5iYiA9IGZuJDMuYm91bmRpbmdCb3g7XG5mbiQzLnJlbmRlcmVkQm91bmRpbmdib3ggPSBmbiQzLnJlbmRlcmVkQm91bmRpbmdCb3g7XG52YXIgYm91bmRzID0gZWxlc2ZuJGI7XG5cbnZhciBmbiQyLCBlbGVzZm4kYTtcbmZuJDIgPSBlbGVzZm4kYSA9IHt9O1xudmFyIGRlZmluZURpbUZucyA9IGZ1bmN0aW9uIGRlZmluZURpbUZucyhvcHRzKSB7XG4gIG9wdHMudXBwZXJjYXNlTmFtZSA9IGNhcGl0YWxpemUob3B0cy5uYW1lKTtcbiAgb3B0cy5hdXRvTmFtZSA9ICdhdXRvJyArIG9wdHMudXBwZXJjYXNlTmFtZTtcbiAgb3B0cy5sYWJlbE5hbWUgPSAnbGFiZWwnICsgb3B0cy51cHBlcmNhc2VOYW1lO1xuICBvcHRzLm91dGVyTmFtZSA9ICdvdXRlcicgKyBvcHRzLnVwcGVyY2FzZU5hbWU7XG4gIG9wdHMudXBwZXJjYXNlT3V0ZXJOYW1lID0gY2FwaXRhbGl6ZShvcHRzLm91dGVyTmFtZSk7XG4gIGZuJDJbb3B0cy5uYW1lXSA9IGZ1bmN0aW9uIGRpbUltcGwoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciBjeSA9IF9wLmN5O1xuICAgIHZhciBzdHlsZUVuYWJsZWQgPSBjeS5fcHJpdmF0ZS5zdHlsZUVuYWJsZWQ7XG4gICAgaWYgKGVsZSkge1xuICAgICAgaWYgKHN0eWxlRW5hYmxlZCkge1xuICAgICAgICBpZiAoZWxlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgICBlbGUudXBkYXRlQ29tcG91bmRCb3VuZHMoKTtcbiAgICAgICAgICByZXR1cm4gX3Bbb3B0cy5hdXRvTmFtZV0gfHwgMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZCA9IGVsZS5wc3R5bGUob3B0cy5uYW1lKTtcbiAgICAgICAgc3dpdGNoIChkLnN0clZhbHVlKSB7XG4gICAgICAgICAgY2FzZSAnbGFiZWwnOlxuICAgICAgICAgICAgZWxlLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSgpO1xuICAgICAgICAgICAgcmV0dXJuIF9wLnJzdHlsZVtvcHRzLmxhYmVsTmFtZV0gfHwgMDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGQucGZWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBmbiQyWydvdXRlcicgKyBvcHRzLnVwcGVyY2FzZU5hbWVdID0gZnVuY3Rpb24gb3V0ZXJEaW1JbXBsKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgY3kgPSBfcC5jeTtcbiAgICB2YXIgc3R5bGVFbmFibGVkID0gY3kuX3ByaXZhdGUuc3R5bGVFbmFibGVkO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIGlmIChzdHlsZUVuYWJsZWQpIHtcbiAgICAgICAgdmFyIGRpbSA9IGVsZVtvcHRzLm5hbWVdKCk7XG4gICAgICAgIHZhciBib3JkZXIgPSBlbGUucHN0eWxlKCdib3JkZXItd2lkdGgnKS5wZlZhbHVlOyAvLyBuLmIuIDEvMiBlYWNoIHNpZGVcbiAgICAgICAgdmFyIHBhZGRpbmcgPSAyICogZWxlLnBhZGRpbmcoKTtcbiAgICAgICAgcmV0dXJuIGRpbSArIGJvcmRlciArIHBhZGRpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGZuJDJbJ3JlbmRlcmVkJyArIG9wdHMudXBwZXJjYXNlTmFtZV0gPSBmdW5jdGlvbiByZW5kZXJlZERpbUltcGwoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgdmFyIGQgPSBlbGVbb3B0cy5uYW1lXSgpO1xuICAgICAgcmV0dXJuIGQgKiB0aGlzLmN5KCkuem9vbSgpO1xuICAgIH1cbiAgfTtcbiAgZm4kMlsncmVuZGVyZWQnICsgb3B0cy51cHBlcmNhc2VPdXRlck5hbWVdID0gZnVuY3Rpb24gcmVuZGVyZWRPdXRlckRpbUltcGwoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgdmFyIG9kID0gZWxlW29wdHMub3V0ZXJOYW1lXSgpO1xuICAgICAgcmV0dXJuIG9kICogdGhpcy5jeSgpLnpvb20oKTtcbiAgICB9XG4gIH07XG59O1xuZGVmaW5lRGltRm5zKHtcbiAgbmFtZTogJ3dpZHRoJ1xufSk7XG5kZWZpbmVEaW1GbnMoe1xuICBuYW1lOiAnaGVpZ2h0J1xufSk7XG5lbGVzZm4kYS5wYWRkaW5nID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlID0gdGhpc1swXTtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICBpZiAoZWxlLmlzUGFyZW50KCkpIHtcbiAgICBlbGUudXBkYXRlQ29tcG91bmRCb3VuZHMoKTtcbiAgICBpZiAoX3AuYXV0b1BhZGRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIF9wLmF1dG9QYWRkaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlLnBzdHlsZSgncGFkZGluZycpLnBmVmFsdWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBlbGUucHN0eWxlKCdwYWRkaW5nJykucGZWYWx1ZTtcbiAgfVxufTtcbmVsZXNmbiRhLnBhZGRlZEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIHJldHVybiBlbGUuaGVpZ2h0KCkgKyAyICogZWxlLnBhZGRpbmcoKTtcbn07XG5lbGVzZm4kYS5wYWRkZWRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIHJldHVybiBlbGUud2lkdGgoKSArIDIgKiBlbGUucGFkZGluZygpO1xufTtcbnZhciB3aWR0aEhlaWdodCA9IGVsZXNmbiRhO1xuXG52YXIgaWZFZGdlID0gZnVuY3Rpb24gaWZFZGdlKGVsZSwgZ2V0VmFsdWUpIHtcbiAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgIHJldHVybiBnZXRWYWx1ZShlbGUpO1xuICB9XG59O1xudmFyIGlmRWRnZVJlbmRlcmVkUG9zaXRpb24gPSBmdW5jdGlvbiBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9uKGVsZSwgZ2V0UG9pbnQpIHtcbiAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgIHZhciBjeSA9IGVsZS5jeSgpO1xuICAgIHJldHVybiBtb2RlbFRvUmVuZGVyZWRQb3NpdGlvbihnZXRQb2ludChlbGUpLCBjeS56b29tKCksIGN5LnBhbigpKTtcbiAgfVxufTtcbnZhciBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9ucyA9IGZ1bmN0aW9uIGlmRWRnZVJlbmRlcmVkUG9zaXRpb25zKGVsZSwgZ2V0UG9pbnRzKSB7XG4gIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICB2YXIgY3kgPSBlbGUuY3koKTtcbiAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgcmV0dXJuIGdldFBvaW50cyhlbGUpLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgcmV0dXJuIG1vZGVsVG9SZW5kZXJlZFBvc2l0aW9uKHAsIHpvb20sIHBhbik7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgY29udHJvbFBvaW50cyA9IGZ1bmN0aW9uIGNvbnRyb2xQb2ludHMoZWxlKSB7XG4gIHJldHVybiBlbGUucmVuZGVyZXIoKS5nZXRDb250cm9sUG9pbnRzKGVsZSk7XG59O1xudmFyIHNlZ21lbnRQb2ludHMgPSBmdW5jdGlvbiBzZWdtZW50UG9pbnRzKGVsZSkge1xuICByZXR1cm4gZWxlLnJlbmRlcmVyKCkuZ2V0U2VnbWVudFBvaW50cyhlbGUpO1xufTtcbnZhciBzb3VyY2VFbmRwb2ludCA9IGZ1bmN0aW9uIHNvdXJjZUVuZHBvaW50KGVsZSkge1xuICByZXR1cm4gZWxlLnJlbmRlcmVyKCkuZ2V0U291cmNlRW5kcG9pbnQoZWxlKTtcbn07XG52YXIgdGFyZ2V0RW5kcG9pbnQgPSBmdW5jdGlvbiB0YXJnZXRFbmRwb2ludChlbGUpIHtcbiAgcmV0dXJuIGVsZS5yZW5kZXJlcigpLmdldFRhcmdldEVuZHBvaW50KGVsZSk7XG59O1xudmFyIG1pZHBvaW50ID0gZnVuY3Rpb24gbWlkcG9pbnQoZWxlKSB7XG4gIHJldHVybiBlbGUucmVuZGVyZXIoKS5nZXRFZGdlTWlkcG9pbnQoZWxlKTtcbn07XG52YXIgcHRzID0ge1xuICBjb250cm9sUG9pbnRzOiB7XG4gICAgZ2V0OiBjb250cm9sUG9pbnRzLFxuICAgIG11bHQ6IHRydWVcbiAgfSxcbiAgc2VnbWVudFBvaW50czoge1xuICAgIGdldDogc2VnbWVudFBvaW50cyxcbiAgICBtdWx0OiB0cnVlXG4gIH0sXG4gIHNvdXJjZUVuZHBvaW50OiB7XG4gICAgZ2V0OiBzb3VyY2VFbmRwb2ludFxuICB9LFxuICB0YXJnZXRFbmRwb2ludDoge1xuICAgIGdldDogdGFyZ2V0RW5kcG9pbnRcbiAgfSxcbiAgbWlkcG9pbnQ6IHtcbiAgICBnZXQ6IG1pZHBvaW50XG4gIH1cbn07XG52YXIgcmVuZGVyZWROYW1lID0gZnVuY3Rpb24gcmVuZGVyZWROYW1lKG5hbWUpIHtcbiAgcmV0dXJuICdyZW5kZXJlZCcgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnN1YnN0cigxKTtcbn07XG52YXIgZWRnZVBvaW50cyA9IE9iamVjdC5rZXlzKHB0cykucmVkdWNlKGZ1bmN0aW9uIChvYmosIG5hbWUpIHtcbiAgdmFyIHNwZWMgPSBwdHNbbmFtZV07XG4gIHZhciByTmFtZSA9IHJlbmRlcmVkTmFtZShuYW1lKTtcbiAgb2JqW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpZkVkZ2UodGhpcywgc3BlYy5nZXQpO1xuICB9O1xuICBpZiAoc3BlYy5tdWx0KSB7XG4gICAgb2JqW3JOYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBpZkVkZ2VSZW5kZXJlZFBvc2l0aW9ucyh0aGlzLCBzcGVjLmdldCk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBvYmpbck5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGlmRWRnZVJlbmRlcmVkUG9zaXRpb24odGhpcywgc3BlYy5nZXQpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn0sIHt9KTtcblxudmFyIGRpbWVuc2lvbnMgPSBleHRlbmQoe30sIHBvc2l0aW9uLCBib3VuZHMsIHdpZHRoSGVpZ2h0LCBlZGdlUG9pbnRzKTtcblxuLyohXG5FdmVudCBvYmplY3QgYmFzZWQgb24galF1ZXJ5IGV2ZW50cywgTUlUIGxpY2Vuc2VcblxuaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2UvXG5odHRwczovL3RsZHJsZWdhbC5jb20vbGljZW5zZS9taXQtbGljZW5zZVxuaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvYmxvYi9tYXN0ZXIvc3JjL2V2ZW50LmpzXG4qL1xuXG52YXIgRXZlbnQgPSBmdW5jdGlvbiBFdmVudChzcmMsIHByb3BzKSB7XG4gIHRoaXMucmVjeWNsZShzcmMsIHByb3BzKTtcbn07XG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbFxuRXZlbnQucHJvdG90eXBlID0ge1xuICBpbnN0YW5jZVN0cmluZzogZnVuY3Rpb24gaW5zdGFuY2VTdHJpbmcoKSB7XG4gICAgcmV0dXJuICdldmVudCc7XG4gIH0sXG4gIHJlY3ljbGU6IGZ1bmN0aW9uIHJlY3ljbGUoc3JjLCBwcm9wcykge1xuICAgIHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5GYWxzZTtcbiAgICBpZiAoc3JjICE9IG51bGwgJiYgc3JjLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAvLyBCcm93c2VyIEV2ZW50IG9iamVjdFxuICAgICAgdGhpcy50eXBlID0gc3JjLnR5cGU7XG5cbiAgICAgIC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkXG4gICAgICAvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgPyByZXR1cm5UcnVlIDogcmV0dXJuRmFsc2U7XG4gICAgfSBlbHNlIGlmIChzcmMgIT0gbnVsbCAmJiBzcmMudHlwZSkge1xuICAgICAgLy8gUGxhaW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIGV2ZW50IGRldGFpbHNcbiAgICAgIHByb3BzID0gc3JjO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFdmVudCBzdHJpbmdcbiAgICAgIHRoaXMudHlwZSA9IHNyYztcbiAgICB9XG5cbiAgICAvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdFxuICAgIGlmIChwcm9wcyAhPSBudWxsKSB7XG4gICAgICAvLyBtb3JlIGVmZmljaWVudCB0byBtYW51YWxseSBjb3B5IGZpZWxkcyB3ZSB1c2VcbiAgICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IHByb3BzLm9yaWdpbmFsRXZlbnQ7XG4gICAgICB0aGlzLnR5cGUgPSBwcm9wcy50eXBlICE9IG51bGwgPyBwcm9wcy50eXBlIDogdGhpcy50eXBlO1xuICAgICAgdGhpcy5jeSA9IHByb3BzLmN5O1xuICAgICAgdGhpcy50YXJnZXQgPSBwcm9wcy50YXJnZXQ7XG4gICAgICB0aGlzLnBvc2l0aW9uID0gcHJvcHMucG9zaXRpb247XG4gICAgICB0aGlzLnJlbmRlcmVkUG9zaXRpb24gPSBwcm9wcy5yZW5kZXJlZFBvc2l0aW9uO1xuICAgICAgdGhpcy5uYW1lc3BhY2UgPSBwcm9wcy5uYW1lc3BhY2U7XG4gICAgICB0aGlzLmxheW91dCA9IHByb3BzLmxheW91dDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3kgIT0gbnVsbCAmJiB0aGlzLnBvc2l0aW9uICE9IG51bGwgJiYgdGhpcy5yZW5kZXJlZFBvc2l0aW9uID09IG51bGwpIHtcbiAgICAgIC8vIGNyZWF0ZSBhIHJlbmRlcmVkIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSBwYXNzZWQgcG9zaXRpb25cbiAgICAgIHZhciBwb3MgPSB0aGlzLnBvc2l0aW9uO1xuICAgICAgdmFyIHpvb20gPSB0aGlzLmN5Lnpvb20oKTtcbiAgICAgIHZhciBwYW4gPSB0aGlzLmN5LnBhbigpO1xuICAgICAgdGhpcy5yZW5kZXJlZFBvc2l0aW9uID0ge1xuICAgICAgICB4OiBwb3MueCAqIHpvb20gKyBwYW4ueCxcbiAgICAgICAgeTogcG9zLnkgKiB6b29tICsgcGFuLnlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmVcbiAgICB0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gIH0sXG4gIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7XG4gICAgdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG4gICAgaWYgKCFlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgcHJldmVudERlZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnRcbiAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSxcbiAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oKSB7XG4gICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG4gICAgdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG4gICAgaWYgKCFlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50XG4gICAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfSxcbiAgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbiBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSB7XG4gICAgdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG4gICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfSxcbiAgaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSxcbiAgaXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuICBpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2Vcbn07XG5cbnZhciBldmVudFJlZ2V4ID0gL14oW14uXSspKFxcLig/OlteLl0rKSk/JC87IC8vIHJlZ2V4IGZvciBtYXRjaGluZyBldmVudCBzdHJpbmdzIChlLmcuIFwiY2xpY2submFtZXNwYWNlXCIpXG52YXIgdW5pdmVyc2FsTmFtZXNwYWNlID0gJy4qJzsgLy8gbWF0Y2hlcyBhcyBpZiBubyBuYW1lc3BhY2Ugc3BlY2lmaWVkIGFuZCBwcmV2ZW50cyB1c2VycyBmcm9tIHVuYmluZGluZyBhY2NpZGVudGFsbHlcblxudmFyIGRlZmF1bHRzJDggPSB7XG4gIHF1YWxpZmllckNvbXBhcmU6IGZ1bmN0aW9uIHF1YWxpZmllckNvbXBhcmUocTEsIHEyKSB7XG4gICAgcmV0dXJuIHExID09PSBxMjtcbiAgfSxcbiAgZXZlbnRNYXRjaGVzOiBmdW5jdGlvbiBldmVudE1hdGNoZXMoIC8qY29udGV4dCwgbGlzdGVuZXIsIGV2ZW50T2JqKi9cbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGFkZEV2ZW50RmllbGRzOiBmdW5jdGlvbiBhZGRFdmVudEZpZWxkcyggLypjb250ZXh0LCBldnQqL1xuICApIHt9LFxuICBjYWxsYmFja0NvbnRleHQ6IGZ1bmN0aW9uIGNhbGxiYWNrQ29udGV4dChjb250ZXh0IC8qLCBsaXN0ZW5lciwgZXZlbnRPYmoqLykge1xuICAgIHJldHVybiBjb250ZXh0O1xuICB9LFxuICBiZWZvcmVFbWl0OiBmdW5jdGlvbiBiZWZvcmVFbWl0KCAvKiBjb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmogKi9cbiAgKSB7fSxcbiAgYWZ0ZXJFbWl0OiBmdW5jdGlvbiBhZnRlckVtaXQoIC8qIGNvbnRleHQsIGxpc3RlbmVyLCBldmVudE9iaiAqL1xuICApIHt9LFxuICBidWJibGU6IGZ1bmN0aW9uIGJ1YmJsZSggLypjb250ZXh0Ki9cbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBwYXJlbnQ6IGZ1bmN0aW9uIHBhcmVudCggLypjb250ZXh0Ki9cbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIGNvbnRleHQ6IG51bGxcbn07XG52YXIgZGVmYXVsdHNLZXlzID0gT2JqZWN0LmtleXMoZGVmYXVsdHMkOCk7XG52YXIgZW1wdHlPcHRzID0ge307XG5mdW5jdGlvbiBFbWl0dGVyKCkge1xuICB2YXIgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZW1wdHlPcHRzO1xuICB2YXIgY29udGV4dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAvLyBtaWNyby1vcHRpbWlzYXRpb24gdnMgT2JqZWN0LmFzc2lnbigpIC0tIHJlZHVjZXMgRWxlbWVudCBpbnN0YW50aWF0aW9uIHRpbWVcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWZhdWx0c0tleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gZGVmYXVsdHNLZXlzW2ldO1xuICAgIHRoaXNba2V5XSA9IG9wdHNba2V5XSB8fCBkZWZhdWx0cyQ4W2tleV07XG4gIH1cbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dCB8fCB0aGlzLmNvbnRleHQ7XG4gIHRoaXMubGlzdGVuZXJzID0gW107XG4gIHRoaXMuZW1pdHRpbmcgPSAwO1xufVxudmFyIHAgPSBFbWl0dGVyLnByb3RvdHlwZTtcbnZhciBmb3JFYWNoRXZlbnQgPSBmdW5jdGlvbiBmb3JFYWNoRXZlbnQoc2VsZiwgaGFuZGxlciwgZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mLCBjb25mT3ZlcnJpZGVzKSB7XG4gIGlmIChmbiQ2KHF1YWxpZmllcikpIHtcbiAgICBjYWxsYmFjayA9IHF1YWxpZmllcjtcbiAgICBxdWFsaWZpZXIgPSBudWxsO1xuICB9XG4gIGlmIChjb25mT3ZlcnJpZGVzKSB7XG4gICAgaWYgKGNvbmYgPT0gbnVsbCkge1xuICAgICAgY29uZiA9IGNvbmZPdmVycmlkZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmYgPSBleHRlbmQoe30sIGNvbmYsIGNvbmZPdmVycmlkZXMpO1xuICAgIH1cbiAgfVxuICB2YXIgZXZlbnRMaXN0ID0gYXJyYXkoZXZlbnRzKSA/IGV2ZW50cyA6IGV2ZW50cy5zcGxpdCgvXFxzKy8pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBldnQgPSBldmVudExpc3RbaV07XG4gICAgaWYgKGVtcHR5U3RyaW5nKGV2dCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgbWF0Y2ggPSBldnQubWF0Y2goZXZlbnRSZWdleCk7IC8vIHR5cGVbLm5hbWVzcGFjZV1cblxuICAgIGlmIChtYXRjaCkge1xuICAgICAgdmFyIHR5cGUgPSBtYXRjaFsxXTtcbiAgICAgIHZhciBuYW1lc3BhY2UgPSBtYXRjaFsyXSA/IG1hdGNoWzJdIDogbnVsbDtcbiAgICAgIHZhciByZXQgPSBoYW5kbGVyKHNlbGYsIGV2dCwgdHlwZSwgbmFtZXNwYWNlLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKTtcbiAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyBhbGxvdyBleGl0aW5nIGVhcmx5XG4gICAgfVxuICB9XG59O1xuXG52YXIgbWFrZUV2ZW50T2JqID0gZnVuY3Rpb24gbWFrZUV2ZW50T2JqKHNlbGYsIG9iaikge1xuICBzZWxmLmFkZEV2ZW50RmllbGRzKHNlbGYuY29udGV4dCwgb2JqKTtcbiAgcmV0dXJuIG5ldyBFdmVudChvYmoudHlwZSwgb2JqKTtcbn07XG52YXIgZm9yRWFjaEV2ZW50T2JqID0gZnVuY3Rpb24gZm9yRWFjaEV2ZW50T2JqKHNlbGYsIGhhbmRsZXIsIGV2ZW50cykge1xuICBpZiAoZXZlbnQoZXZlbnRzKSkge1xuICAgIGhhbmRsZXIoc2VsZiwgZXZlbnRzKTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAocGxhaW5PYmplY3QoZXZlbnRzKSkge1xuICAgIGhhbmRsZXIoc2VsZiwgbWFrZUV2ZW50T2JqKHNlbGYsIGV2ZW50cykpO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgZXZlbnRMaXN0ID0gYXJyYXkoZXZlbnRzKSA/IGV2ZW50cyA6IGV2ZW50cy5zcGxpdCgvXFxzKy8pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBldnQgPSBldmVudExpc3RbaV07XG4gICAgaWYgKGVtcHR5U3RyaW5nKGV2dCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgbWF0Y2ggPSBldnQubWF0Y2goZXZlbnRSZWdleCk7IC8vIHR5cGVbLm5hbWVzcGFjZV1cblxuICAgIGlmIChtYXRjaCkge1xuICAgICAgdmFyIHR5cGUgPSBtYXRjaFsxXTtcbiAgICAgIHZhciBuYW1lc3BhY2UgPSBtYXRjaFsyXSA/IG1hdGNoWzJdIDogbnVsbDtcbiAgICAgIHZhciBldmVudE9iaiA9IG1ha2VFdmVudE9iaihzZWxmLCB7XG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgICB0YXJnZXQ6IHNlbGYuY29udGV4dFxuICAgICAgfSk7XG4gICAgICBoYW5kbGVyKHNlbGYsIGV2ZW50T2JqKTtcbiAgICB9XG4gIH1cbn07XG5wLm9uID0gcC5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudHMsIHF1YWxpZmllciwgY2FsbGJhY2ssIGNvbmYsIGNvbmZPdmVycmlkZXMpIHtcbiAgZm9yRWFjaEV2ZW50KHRoaXMsIGZ1bmN0aW9uIChzZWxmLCBldmVudCwgdHlwZSwgbmFtZXNwYWNlLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKSB7XG4gICAgaWYgKGZuJDYoY2FsbGJhY2spKSB7XG4gICAgICBzZWxmLmxpc3RlbmVycy5wdXNoKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAvLyBmdWxsIGV2ZW50IHN0cmluZ1xuICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICAgIC8vIGNhbGxiYWNrIHRvIHJ1blxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAvLyB0aGUgZXZlbnQgdHlwZSAoZS5nLiAnY2xpY2snKVxuICAgICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgICAgLy8gdGhlIGV2ZW50IG5hbWVzcGFjZSAoZS5nLiBcIi5mb29cIilcbiAgICAgICAgcXVhbGlmaWVyOiBxdWFsaWZpZXIsXG4gICAgICAgIC8vIGEgcmVzdHJpY3Rpb24gb24gd2hldGhlciB0byBtYXRjaCB0aGlzIGVtaXR0ZXJcbiAgICAgICAgY29uZjogY29uZiAvLyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mLCBjb25mT3ZlcnJpZGVzKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xucC5vbmUgPSBmdW5jdGlvbiAoZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKSB7XG4gIHJldHVybiB0aGlzLm9uKGV2ZW50cywgcXVhbGlmaWVyLCBjYWxsYmFjaywgY29uZiwge1xuICAgIG9uZTogdHJ1ZVxuICB9KTtcbn07XG5wLnJlbW92ZUxpc3RlbmVyID0gcC5vZmYgPSBmdW5jdGlvbiAoZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIGlmICh0aGlzLmVtaXR0aW5nICE9PSAwKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMgPSBjb3B5QXJyYXkkMSh0aGlzLmxpc3RlbmVycyk7XG4gIH1cbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzO1xuICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChpKSB7XG4gICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgIGZvckVhY2hFdmVudChfdGhpcywgZnVuY3Rpb24gKHNlbGYsIGV2ZW50LCB0eXBlLCBuYW1lc3BhY2UsIHF1YWxpZmllciwgY2FsbGJhY2sgLyosIGNvbmYqLykge1xuICAgICAgaWYgKChsaXN0ZW5lci50eXBlID09PSB0eXBlIHx8IGV2ZW50cyA9PT0gJyonKSAmJiAoIW5hbWVzcGFjZSAmJiBsaXN0ZW5lci5uYW1lc3BhY2UgIT09ICcuKicgfHwgbGlzdGVuZXIubmFtZXNwYWNlID09PSBuYW1lc3BhY2UpICYmICghcXVhbGlmaWVyIHx8IHNlbGYucXVhbGlmaWVyQ29tcGFyZShsaXN0ZW5lci5xdWFsaWZpZXIsIHF1YWxpZmllcikpICYmICghY2FsbGJhY2sgfHwgbGlzdGVuZXIuY2FsbGJhY2sgPT09IGNhbGxiYWNrKSkge1xuICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSwgZXZlbnRzLCBxdWFsaWZpZXIsIGNhbGxiYWNrLCBjb25mKTtcbiAgfTtcbiAgZm9yICh2YXIgaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIF9sb29wKGkpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcbnAucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5yZW1vdmVMaXN0ZW5lcignKicpO1xufTtcbnAuZW1pdCA9IHAudHJpZ2dlciA9IGZ1bmN0aW9uIChldmVudHMsIGV4dHJhUGFyYW1zLCBtYW51YWxDYWxsYmFjaykge1xuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnM7XG4gIHZhciBudW1MaXN0ZW5lcnNCZWZvcmVFbWl0ID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgdGhpcy5lbWl0dGluZysrO1xuICBpZiAoIWFycmF5KGV4dHJhUGFyYW1zKSkge1xuICAgIGV4dHJhUGFyYW1zID0gW2V4dHJhUGFyYW1zXTtcbiAgfVxuICBmb3JFYWNoRXZlbnRPYmoodGhpcywgZnVuY3Rpb24gKHNlbGYsIGV2ZW50T2JqKSB7XG4gICAgaWYgKG1hbnVhbENhbGxiYWNrICE9IG51bGwpIHtcbiAgICAgIGxpc3RlbmVycyA9IFt7XG4gICAgICAgIGV2ZW50OiBldmVudE9iai5ldmVudCxcbiAgICAgICAgdHlwZTogZXZlbnRPYmoudHlwZSxcbiAgICAgICAgbmFtZXNwYWNlOiBldmVudE9iai5uYW1lc3BhY2UsXG4gICAgICAgIGNhbGxiYWNrOiBtYW51YWxDYWxsYmFja1xuICAgICAgfV07XG4gICAgICBudW1MaXN0ZW5lcnNCZWZvcmVFbWl0ID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgICB9XG4gICAgdmFyIF9sb29wMiA9IGZ1bmN0aW9uIF9sb29wMihpKSB7XG4gICAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07XG4gICAgICBpZiAobGlzdGVuZXIudHlwZSA9PT0gZXZlbnRPYmoudHlwZSAmJiAoIWxpc3RlbmVyLm5hbWVzcGFjZSB8fCBsaXN0ZW5lci5uYW1lc3BhY2UgPT09IGV2ZW50T2JqLm5hbWVzcGFjZSB8fCBsaXN0ZW5lci5uYW1lc3BhY2UgPT09IHVuaXZlcnNhbE5hbWVzcGFjZSkgJiYgc2VsZi5ldmVudE1hdGNoZXMoc2VsZi5jb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmopKSB7XG4gICAgICAgIHZhciBhcmdzID0gW2V2ZW50T2JqXTtcbiAgICAgICAgaWYgKGV4dHJhUGFyYW1zICE9IG51bGwpIHtcbiAgICAgICAgICBwdXNoKGFyZ3MsIGV4dHJhUGFyYW1zKTtcbiAgICAgICAgfVxuICAgICAgICBzZWxmLmJlZm9yZUVtaXQoc2VsZi5jb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmopO1xuICAgICAgICBpZiAobGlzdGVuZXIuY29uZiAmJiBsaXN0ZW5lci5jb25mLm9uZSkge1xuICAgICAgICAgIHNlbGYubGlzdGVuZXJzID0gc2VsZi5saXN0ZW5lcnMuZmlsdGVyKGZ1bmN0aW9uIChsKSB7XG4gICAgICAgICAgICByZXR1cm4gbCAhPT0gbGlzdGVuZXI7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRleHQgPSBzZWxmLmNhbGxiYWNrQ29udGV4dChzZWxmLmNvbnRleHQsIGxpc3RlbmVyLCBldmVudE9iaik7XG4gICAgICAgIHZhciByZXQgPSBsaXN0ZW5lci5jYWxsYmFjay5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgc2VsZi5hZnRlckVtaXQoc2VsZi5jb250ZXh0LCBsaXN0ZW5lciwgZXZlbnRPYmopO1xuICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgIGV2ZW50T2JqLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGV2ZW50T2JqLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gaWYgbGlzdGVuZXIgbWF0Y2hlc1xuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1MaXN0ZW5lcnNCZWZvcmVFbWl0OyBpKyspIHtcbiAgICAgIF9sb29wMihpKTtcbiAgICB9IC8vIGZvciBsaXN0ZW5lclxuXG4gICAgaWYgKHNlbGYuYnViYmxlKHNlbGYuY29udGV4dCkgJiYgIWV2ZW50T2JqLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgIHNlbGYucGFyZW50KHNlbGYuY29udGV4dCkuZW1pdChldmVudE9iaiwgZXh0cmFQYXJhbXMpO1xuICAgIH1cbiAgfSwgZXZlbnRzKTtcbiAgdGhpcy5lbWl0dGluZy0tO1xuICByZXR1cm4gdGhpcztcbn07XG5cbnZhciBlbWl0dGVyT3B0aW9ucyQxID0ge1xuICBxdWFsaWZpZXJDb21wYXJlOiBmdW5jdGlvbiBxdWFsaWZpZXJDb21wYXJlKHNlbGVjdG9yMSwgc2VsZWN0b3IyKSB7XG4gICAgaWYgKHNlbGVjdG9yMSA9PSBudWxsIHx8IHNlbGVjdG9yMiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3IxID09IG51bGwgJiYgc2VsZWN0b3IyID09IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzZWxlY3RvcjEuc2FtZVRleHQoc2VsZWN0b3IyKTtcbiAgICB9XG4gIH0sXG4gIGV2ZW50TWF0Y2hlczogZnVuY3Rpb24gZXZlbnRNYXRjaGVzKGVsZSwgbGlzdGVuZXIsIGV2ZW50T2JqKSB7XG4gICAgdmFyIHNlbGVjdG9yID0gbGlzdGVuZXIucXVhbGlmaWVyO1xuICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZWxlICE9PSBldmVudE9iai50YXJnZXQgJiYgZWxlbWVudChldmVudE9iai50YXJnZXQpICYmIHNlbGVjdG9yLm1hdGNoZXMoZXZlbnRPYmoudGFyZ2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGFkZEV2ZW50RmllbGRzOiBmdW5jdGlvbiBhZGRFdmVudEZpZWxkcyhlbGUsIGV2dCkge1xuICAgIGV2dC5jeSA9IGVsZS5jeSgpO1xuICAgIGV2dC50YXJnZXQgPSBlbGU7XG4gIH0sXG4gIGNhbGxiYWNrQ29udGV4dDogZnVuY3Rpb24gY2FsbGJhY2tDb250ZXh0KGVsZSwgbGlzdGVuZXIsIGV2ZW50T2JqKSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyLnF1YWxpZmllciAhPSBudWxsID8gZXZlbnRPYmoudGFyZ2V0IDogZWxlO1xuICB9LFxuICBiZWZvcmVFbWl0OiBmdW5jdGlvbiBiZWZvcmVFbWl0KGNvbnRleHQsIGxpc3RlbmVyIC8qLCBldmVudE9iaiovKSB7XG4gICAgaWYgKGxpc3RlbmVyLmNvbmYgJiYgbGlzdGVuZXIuY29uZi5vbmNlKSB7XG4gICAgICBsaXN0ZW5lci5jb25mLm9uY2VDb2xsZWN0aW9uLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmV2ZW50LCBsaXN0ZW5lci5xdWFsaWZpZXIsIGxpc3RlbmVyLmNhbGxiYWNrKTtcbiAgICB9XG4gIH0sXG4gIGJ1YmJsZTogZnVuY3Rpb24gYnViYmxlKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBwYXJlbnQ6IGZ1bmN0aW9uIHBhcmVudChlbGUpIHtcbiAgICByZXR1cm4gZWxlLmlzQ2hpbGQoKSA/IGVsZS5wYXJlbnQoKSA6IGVsZS5jeSgpO1xuICB9XG59O1xudmFyIGFyZ1NlbGVjdG9yJDEgPSBmdW5jdGlvbiBhcmdTZWxlY3RvcihhcmcpIHtcbiAgaWYgKHN0cmluZyhhcmcpKSB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3RvcihhcmcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhcmc7XG4gIH1cbn07XG52YXIgZWxlc2ZuJDkgPSB7XG4gIGNyZWF0ZUVtaXR0ZXI6IGZ1bmN0aW9uIGNyZWF0ZUVtaXR0ZXIoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgIGlmICghX3AuZW1pdHRlcikge1xuICAgICAgICBfcC5lbWl0dGVyID0gbmV3IEVtaXR0ZXIoZW1pdHRlck9wdGlvbnMkMSwgZWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGVtaXR0ZXI6IGZ1bmN0aW9uIGVtaXR0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZW1pdHRlcjtcbiAgfSxcbiAgb246IGZ1bmN0aW9uIG9uKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGFyZ1NlbCA9IGFyZ1NlbGVjdG9yJDEoc2VsZWN0b3IpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBlbGUuZW1pdHRlcigpLm9uKGV2ZW50cywgYXJnU2VsLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB2YXIgYXJnU2VsID0gYXJnU2VsZWN0b3IkMShzZWxlY3Rvcik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkucmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBhcmdTZWwsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIHJlbW92ZUFsbExpc3RlbmVyczogZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBlbGUuZW1pdHRlcigpLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgb25lOiBmdW5jdGlvbiBvbmUoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB2YXIgYXJnU2VsID0gYXJnU2VsZWN0b3IkMShzZWxlY3Rvcik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICAgIGVsZS5lbWl0dGVyKCkub25lKGV2ZW50cywgYXJnU2VsLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBvbmNlOiBmdW5jdGlvbiBvbmNlKGV2ZW50cywgc2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGFyZ1NlbCA9IGFyZ1NlbGVjdG9yJDEoc2VsZWN0b3IpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBlbGUuZW1pdHRlcigpLm9uKGV2ZW50cywgYXJnU2VsLCBjYWxsYmFjaywge1xuICAgICAgICBvbmNlOiB0cnVlLFxuICAgICAgICBvbmNlQ29sbGVjdGlvbjogdGhpc1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICBlbWl0OiBmdW5jdGlvbiBlbWl0KGV2ZW50cywgZXh0cmFQYXJhbXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgZWxlLmVtaXR0ZXIoKS5lbWl0KGV2ZW50cywgZXh0cmFQYXJhbXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZW1pdEFuZE5vdGlmeTogZnVuY3Rpb24gZW1pdEFuZE5vdGlmeShldmVudCwgZXh0cmFQYXJhbXMpIHtcbiAgICAvLyBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGVtcHR5IGNvbGxlY3Rpb25zIGRvbid0IG5lZWQgdG8gbm90aWZ5IGFueXRoaW5nXG5cbiAgICAvLyBub3RpZnkgcmVuZGVyZXJcbiAgICB0aGlzLmN5KCkubm90aWZ5KGV2ZW50LCB0aGlzKTtcbiAgICB0aGlzLmVtaXQoZXZlbnQsIGV4dHJhUGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufTtcbmRlZmluZS5ldmVudEFsaWFzZXNPbihlbGVzZm4kOSk7XG5cbnZhciBlbGVzZm4kOCA9IHtcbiAgbm9kZXM6IGZ1bmN0aW9uIG5vZGVzKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCk7XG4gICAgfSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgZWRnZXM6IGZ1bmN0aW9uIGVkZ2VzKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNFZGdlKCk7XG4gICAgfSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfSxcbiAgLy8gaW50ZXJuYWwgaGVscGVyIHRvIGdldCBub2RlcyBhbmQgZWRnZXMgYXMgc2VwYXJhdGUgY29sbGVjdGlvbnMgd2l0aCBzaW5nbGUgaXRlcmF0aW9uIG92ZXIgZWxlbWVudHNcbiAgYnlHcm91cDogZnVuY3Rpb24gYnlHcm91cCgpIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIGVkZ2VzID0gdGhpcy5zcGF3bigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgIG5vZGVzLnB1c2goZWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVkZ2VzLnB1c2goZWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGVzOiBub2RlcyxcbiAgICAgIGVkZ2VzOiBlZGdlc1xuICAgIH07XG4gIH0sXG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKF9maWx0ZXIsIHRoaXNBcmcpIHtcbiAgICBpZiAoX2ZpbHRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBjaGVjayB0aGlzIGZpcnN0IGIvYyBpdCdzIHRoZSBtb3N0IGNvbW1vbi9wZXJmb3JtYW50IGNhc2VcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nKF9maWx0ZXIpIHx8IGVsZW1lbnRPckNvbGxlY3Rpb24oX2ZpbHRlcikpIHtcbiAgICAgIHJldHVybiBuZXcgU2VsZWN0b3IoX2ZpbHRlcikuZmlsdGVyKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoZm4kNihfZmlsdGVyKSkge1xuICAgICAgdmFyIGZpbHRlckVsZXMgPSB0aGlzLnNwYXduKCk7XG4gICAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgIHZhciBpbmNsdWRlID0gdGhpc0FyZyA/IF9maWx0ZXIuYXBwbHkodGhpc0FyZywgW2VsZSwgaSwgZWxlc10pIDogX2ZpbHRlcihlbGUsIGksIGVsZXMpO1xuICAgICAgICBpZiAoaW5jbHVkZSkge1xuICAgICAgICAgIGZpbHRlckVsZXMucHVzaChlbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmlsdGVyRWxlcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oKTsgLy8gaWYgbm90IGhhbmRsZWQgYnkgYWJvdmUsIGdpdmUgJ2VtIGFuIGVtcHR5IGNvbGxlY3Rpb25cbiAgfSxcblxuICBub3Q6IGZ1bmN0aW9uIG5vdCh0b1JlbW92ZSkge1xuICAgIGlmICghdG9SZW1vdmUpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RyaW5nKHRvUmVtb3ZlKSkge1xuICAgICAgICB0b1JlbW92ZSA9IHRoaXMuZmlsdGVyKHRvUmVtb3ZlKTtcbiAgICAgIH1cbiAgICAgIHZhciBlbGVtZW50cyA9IHRoaXMuc3Bhd24oKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXNbaV07XG4gICAgICAgIHZhciByZW1vdmUgPSB0b1JlbW92ZS5oYXMoZWxlbWVudCk7XG4gICAgICAgIGlmICghcmVtb3ZlKSB7XG4gICAgICAgICAgZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVsZW1lbnRzO1xuICAgIH1cbiAgfSxcbiAgYWJzb2x1dGVDb21wbGVtZW50OiBmdW5jdGlvbiBhYnNvbHV0ZUNvbXBsZW1lbnQoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHJldHVybiBjeS5tdXRhYmxlRWxlbWVudHMoKS5ub3QodGhpcyk7XG4gIH0sXG4gIGludGVyc2VjdDogZnVuY3Rpb24gaW50ZXJzZWN0KG90aGVyKSB7XG4gICAgLy8gaWYgYSBzZWxlY3RvciBpcyBzcGVjaWZpZWQsIHRoZW4gZmlsdGVyIGJ5IGl0IGluc3RlYWRcbiAgICBpZiAoc3RyaW5nKG90aGVyKSkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gb3RoZXI7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH1cbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIGNvbDEgPSB0aGlzO1xuICAgIHZhciBjb2wyID0gb3RoZXI7XG4gICAgdmFyIGNvbDFTbWFsbGVyID0gdGhpcy5sZW5ndGggPCBvdGhlci5sZW5ndGg7XG4gICAgdmFyIGNvbFMgPSBjb2wxU21hbGxlciA/IGNvbDEgOiBjb2wyO1xuICAgIHZhciBjb2xMID0gY29sMVNtYWxsZXIgPyBjb2wyIDogY29sMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbFMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBjb2xTW2ldO1xuICAgICAgaWYgKGNvbEwuaGFzKGVsZSkpIHtcbiAgICAgICAgZWxlbWVudHMucHVzaChlbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHM7XG4gIH0sXG4gIHhvcjogZnVuY3Rpb24geG9yKG90aGVyKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgICBpZiAoc3RyaW5nKG90aGVyKSkge1xuICAgICAgb3RoZXIgPSBjeS4kKG90aGVyKTtcbiAgICB9XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5zcGF3bigpO1xuICAgIHZhciBjb2wxID0gdGhpcztcbiAgICB2YXIgY29sMiA9IG90aGVyO1xuICAgIHZhciBhZGQgPSBmdW5jdGlvbiBhZGQoY29sLCBvdGhlcikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2wubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGNvbFtpXTtcbiAgICAgICAgdmFyIGlkID0gZWxlLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgICAgIHZhciBpbk90aGVyID0gb3RoZXIuaGFzRWxlbWVudFdpdGhJZChpZCk7XG4gICAgICAgIGlmICghaW5PdGhlcikge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgYWRkKGNvbDEsIGNvbDIpO1xuICAgIGFkZChjb2wyLCBjb2wxKTtcbiAgICByZXR1cm4gZWxlbWVudHM7XG4gIH0sXG4gIGRpZmY6IGZ1bmN0aW9uIGRpZmYob3RoZXIpIHtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICAgIGlmIChzdHJpbmcob3RoZXIpKSB7XG4gICAgICBvdGhlciA9IGN5LiQob3RoZXIpO1xuICAgIH1cbiAgICB2YXIgbGVmdCA9IHRoaXMuc3Bhd24oKTtcbiAgICB2YXIgcmlnaHQgPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIGJvdGggPSB0aGlzLnNwYXduKCk7XG4gICAgdmFyIGNvbDEgPSB0aGlzO1xuICAgIHZhciBjb2wyID0gb3RoZXI7XG4gICAgdmFyIGFkZCA9IGZ1bmN0aW9uIGFkZChjb2wsIG90aGVyLCByZXRFbGVzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gY29sW2ldO1xuICAgICAgICB2YXIgaWQgPSBlbGUuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICAgICAgdmFyIGluT3RoZXIgPSBvdGhlci5oYXNFbGVtZW50V2l0aElkKGlkKTtcbiAgICAgICAgaWYgKGluT3RoZXIpIHtcbiAgICAgICAgICBib3RoLm1lcmdlKGVsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0RWxlcy5wdXNoKGVsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGFkZChjb2wxLCBjb2wyLCBsZWZ0KTtcbiAgICBhZGQoY29sMiwgY29sMSwgcmlnaHQpO1xuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgYm90aDogYm90aFxuICAgIH07XG4gIH0sXG4gIGFkZDogZnVuY3Rpb24gYWRkKHRvQWRkKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgICBpZiAoIXRvQWRkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHN0cmluZyh0b0FkZCkpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IHRvQWRkO1xuICAgICAgdG9BZGQgPSBjeS5tdXRhYmxlRWxlbWVudHMoKS5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH1cbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLnNwYXduU2VsZigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9BZGQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0b0FkZFtpXTtcbiAgICAgIHZhciBhZGQgPSAhdGhpcy5oYXMoZWxlKTtcbiAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgZWxlbWVudHMucHVzaChlbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHM7XG4gIH0sXG4gIC8vIGluIHBsYWNlIG1lcmdlIG9uIGNhbGxpbmcgY29sbGVjdGlvblxuICBtZXJnZTogZnVuY3Rpb24gbWVyZ2UodG9BZGQpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciBjeSA9IF9wLmN5O1xuICAgIGlmICghdG9BZGQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAodG9BZGQgJiYgc3RyaW5nKHRvQWRkKSkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gdG9BZGQ7XG4gICAgICB0b0FkZCA9IGN5Lm11dGFibGVFbGVtZW50cygpLmZpbHRlcihzZWxlY3Rvcik7XG4gICAgfVxuICAgIHZhciBtYXAgPSBfcC5tYXA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b0FkZC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRvQWRkRWxlID0gdG9BZGRbaV07XG4gICAgICB2YXIgaWQgPSB0b0FkZEVsZS5fcHJpdmF0ZS5kYXRhLmlkO1xuICAgICAgdmFyIGFkZCA9ICFtYXAuaGFzKGlkKTtcbiAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5sZW5ndGgrKztcbiAgICAgICAgdGhpc1tpbmRleF0gPSB0b0FkZEVsZTtcbiAgICAgICAgbWFwLnNldChpZCwge1xuICAgICAgICAgIGVsZTogdG9BZGRFbGUsXG4gICAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICB1bm1lcmdlQXQ6IGZ1bmN0aW9uIHVubWVyZ2VBdChpKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgbWFwID0gX3AubWFwO1xuXG4gICAgLy8gcmVtb3ZlIGVsZVxuICAgIHRoaXNbaV0gPSB1bmRlZmluZWQ7XG4gICAgbWFwW1wiZGVsZXRlXCJdKGlkKTtcbiAgICB2YXIgdW5tZXJnZWRMYXN0RWxlID0gaSA9PT0gdGhpcy5sZW5ndGggLSAxO1xuXG4gICAgLy8gcmVwbGFjZSBlbXB0eSBzcG90IHdpdGggbGFzdCBlbGUgaW4gY29sbGVjdGlvblxuICAgIGlmICh0aGlzLmxlbmd0aCA+IDEgJiYgIXVubWVyZ2VkTGFzdEVsZSkge1xuICAgICAgdmFyIGxhc3RFbGVJID0gdGhpcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGxhc3RFbGUgPSB0aGlzW2xhc3RFbGVJXTtcbiAgICAgIHZhciBsYXN0RWxlSWQgPSBsYXN0RWxlLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgICB0aGlzW2xhc3RFbGVJXSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXNbaV0gPSBsYXN0RWxlO1xuICAgICAgbWFwLnNldChsYXN0RWxlSWQsIHtcbiAgICAgICAgZWxlOiBsYXN0RWxlLFxuICAgICAgICBpbmRleDogaVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gdGhlIGNvbGxlY3Rpb24gaXMgbm93IDEgZWxlIHNtYWxsZXJcbiAgICB0aGlzLmxlbmd0aC0tO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICAvLyByZW1vdmUgc2luZ2xlIGVsZSBpbiBwbGFjZSBpbiBjYWxsaW5nIGNvbGxlY3Rpb25cbiAgdW5tZXJnZU9uZTogZnVuY3Rpb24gdW5tZXJnZU9uZShlbGUpIHtcbiAgICBlbGUgPSBlbGVbMF07XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgaWQgPSBlbGUuX3ByaXZhdGUuZGF0YS5pZDtcbiAgICB2YXIgbWFwID0gX3AubWFwO1xuICAgIHZhciBlbnRyeSA9IG1hcC5nZXQoaWQpO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIHJldHVybiB0aGlzOyAvLyBubyBuZWVkIHRvIHJlbW92ZVxuICAgIH1cblxuICAgIHZhciBpID0gZW50cnkuaW5kZXg7XG4gICAgdGhpcy51bm1lcmdlQXQoaSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIC8vIHJlbW92ZSBlbGVzIGluIHBsYWNlIG9uIGNhbGxpbmcgY29sbGVjdGlvblxuICB1bm1lcmdlOiBmdW5jdGlvbiB1bm1lcmdlKHRvUmVtb3ZlKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5fcHJpdmF0ZS5jeTtcbiAgICBpZiAoIXRvUmVtb3ZlKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHRvUmVtb3ZlICYmIHN0cmluZyh0b1JlbW92ZSkpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IHRvUmVtb3ZlO1xuICAgICAgdG9SZW1vdmUgPSBjeS5tdXRhYmxlRWxlbWVudHMoKS5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnVubWVyZ2VPbmUodG9SZW1vdmVbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICB1bm1lcmdlQnk6IGZ1bmN0aW9uIHVubWVyZ2VCeSh0b1JtRm4pIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICBpZiAodG9SbUZuKGVsZSkpIHtcbiAgICAgICAgdGhpcy51bm1lcmdlQXQoaSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBtYXA6IGZ1bmN0aW9uIG1hcChtYXBGbiwgdGhpc0FyZykge1xuICAgIHZhciBhcnIgPSBbXTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgIHZhciByZXQgPSB0aGlzQXJnID8gbWFwRm4uYXBwbHkodGhpc0FyZywgW2VsZSwgaSwgZWxlc10pIDogbWFwRm4oZWxlLCBpLCBlbGVzKTtcbiAgICAgIGFyci5wdXNoKHJldCk7XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG4gIH0sXG4gIHJlZHVjZTogZnVuY3Rpb24gcmVkdWNlKGZuLCBpbml0aWFsVmFsdWUpIHtcbiAgICB2YXIgdmFsID0gaW5pdGlhbFZhbHVlO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbCA9IGZuKHZhbCwgZWxlc1tpXSwgaSwgZWxlcyk7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH0sXG4gIG1heDogZnVuY3Rpb24gbWF4KHZhbEZuLCB0aGlzQXJnKSB7XG4gICAgdmFyIG1heCA9IC1JbmZpbml0eTtcbiAgICB2YXIgbWF4RWxlO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgdmFyIHZhbCA9IHRoaXNBcmcgPyB2YWxGbi5hcHBseSh0aGlzQXJnLCBbZWxlLCBpLCBlbGVzXSkgOiB2YWxGbihlbGUsIGksIGVsZXMpO1xuICAgICAgaWYgKHZhbCA+IG1heCkge1xuICAgICAgICBtYXggPSB2YWw7XG4gICAgICAgIG1heEVsZSA9IGVsZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBtYXgsXG4gICAgICBlbGU6IG1heEVsZVxuICAgIH07XG4gIH0sXG4gIG1pbjogZnVuY3Rpb24gbWluKHZhbEZuLCB0aGlzQXJnKSB7XG4gICAgdmFyIG1pbiA9IEluZmluaXR5O1xuICAgIHZhciBtaW5FbGU7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICB2YXIgdmFsID0gdGhpc0FyZyA/IHZhbEZuLmFwcGx5KHRoaXNBcmcsIFtlbGUsIGksIGVsZXNdKSA6IHZhbEZuKGVsZSwgaSwgZWxlcyk7XG4gICAgICBpZiAodmFsIDwgbWluKSB7XG4gICAgICAgIG1pbiA9IHZhbDtcbiAgICAgICAgbWluRWxlID0gZWxlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IG1pbixcbiAgICAgIGVsZTogbWluRWxlXG4gICAgfTtcbiAgfVxufTtcblxuLy8gYWxpYXNlc1xudmFyIGZuJDEgPSBlbGVzZm4kODtcbmZuJDFbJ3UnXSA9IGZuJDFbJ3wnXSA9IGZuJDFbJysnXSA9IGZuJDEudW5pb24gPSBmbiQxLm9yID0gZm4kMS5hZGQ7XG5mbiQxWydcXFxcJ10gPSBmbiQxWychJ10gPSBmbiQxWyctJ10gPSBmbiQxLmRpZmZlcmVuY2UgPSBmbiQxLnJlbGF0aXZlQ29tcGxlbWVudCA9IGZuJDEuc3VidHJhY3QgPSBmbiQxLm5vdDtcbmZuJDFbJ24nXSA9IGZuJDFbJyYnXSA9IGZuJDFbJy4nXSA9IGZuJDEuYW5kID0gZm4kMS5pbnRlcnNlY3Rpb24gPSBmbiQxLmludGVyc2VjdDtcbmZuJDFbJ14nXSA9IGZuJDFbJygrKSddID0gZm4kMVsnKC0pJ10gPSBmbiQxLnN5bW1ldHJpY0RpZmZlcmVuY2UgPSBmbiQxLnN5bWRpZmYgPSBmbiQxLnhvcjtcbmZuJDEuZm5GaWx0ZXIgPSBmbiQxLmZpbHRlckZuID0gZm4kMS5zdGRGaWx0ZXIgPSBmbiQxLmZpbHRlcjtcbmZuJDEuY29tcGxlbWVudCA9IGZuJDEuYWJzY29tcCA9IGZuJDEuYWJzb2x1dGVDb21wbGVtZW50O1xuXG52YXIgZWxlc2ZuJDcgPSB7XG4gIGlzTm9kZTogZnVuY3Rpb24gaXNOb2RlKCkge1xuICAgIHJldHVybiB0aGlzLmdyb3VwKCkgPT09ICdub2Rlcyc7XG4gIH0sXG4gIGlzRWRnZTogZnVuY3Rpb24gaXNFZGdlKCkge1xuICAgIHJldHVybiB0aGlzLmdyb3VwKCkgPT09ICdlZGdlcyc7XG4gIH0sXG4gIGlzTG9vcDogZnVuY3Rpb24gaXNMb29wKCkge1xuICAgIHJldHVybiB0aGlzLmlzRWRnZSgpICYmIHRoaXMuc291cmNlKClbMF0gPT09IHRoaXMudGFyZ2V0KClbMF07XG4gIH0sXG4gIGlzU2ltcGxlOiBmdW5jdGlvbiBpc1NpbXBsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0VkZ2UoKSAmJiB0aGlzLnNvdXJjZSgpWzBdICE9PSB0aGlzLnRhcmdldCgpWzBdO1xuICB9LFxuICBncm91cDogZnVuY3Rpb24gZ3JvdXAoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5ncm91cDtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogIEVsZW1lbnRzIGFyZSBkcmF3biBpbiBhIHNwZWNpZmljIG9yZGVyIGJhc2VkIG9uIGNvbXBvdW5kIGRlcHRoIChsb3cgdG8gaGlnaCksIHRoZSBlbGVtZW50IHR5cGUgKG5vZGVzIGFib3ZlIGVkZ2VzKSxcbiAqICBhbmQgei1pbmRleCAobG93IHRvIGhpZ2gpLiAgVGhlc2Ugc3R5bGVzIGFmZmVjdCBob3cgdGhpcyBhcHBsaWVzOlxuICpcbiAqICB6LWNvbXBvdW5kLWRlcHRoOiBNYXkgYmUgYGJvdHRvbSB8IG9ycGhhbiB8IGF1dG8gfCB0b3BgLiAgVGhlIGZpcnN0IGRyYXduIGlzIGBib3R0b21gLCB0aGVuIGBvcnBoYW5gIHdoaWNoIGlzIHRoZVxuICogICAgICBzYW1lIGRlcHRoIGFzIHRoZSByb290IG9mIHRoZSBjb21wb3VuZCBncmFwaCwgZm9sbG93ZWQgYnkgdGhlIGRlZmF1bHQgdmFsdWUgYGF1dG9gIHdoaWNoIGRyYXdzIGluIG9yZGVyIGZyb21cbiAqICAgICAgcm9vdCB0byBsZWF2ZXMgb2YgdGhlIGNvbXBvdW5kIGdyYXBoLiAgVGhlIGxhc3QgZHJhd24gaXMgYHRvcGAuXG4gKiAgei1pbmRleC1jb21wYXJlOiBNYXkgYmUgYGF1dG8gfCBtYW51YWxgLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGF1dG9gIHdoaWNoIGFsd2F5cyBkcmF3cyBlZGdlcyB1bmRlciBub2Rlcy5cbiAqICAgICAgYG1hbnVhbGAgaWdub3JlcyB0aGlzIGNvbnZlbnRpb24gYW5kIGRyYXdzIGJhc2VkIG9uIHRoZSBgei1pbmRleGAgdmFsdWUgc2V0dGluZy5cbiAqICB6LWluZGV4OiBBbiBpbnRlZ2VyIHZhbHVlIHRoYXQgYWZmZWN0cyB0aGUgcmVsYXRpdmUgZHJhdyBvcmRlciBvZiBlbGVtZW50cy4gIEluIGdlbmVyYWwsIGFuIGVsZW1lbnQgd2l0aCBhIGhpZ2hlclxuICogICAgICBgei1pbmRleGAgd2lsbCBiZSBkcmF3biBvbiB0b3Agb2YgYW4gZWxlbWVudCB3aXRoIGEgbG93ZXIgYHotaW5kZXhgLlxuICovXG52YXIgekluZGV4U29ydCA9IGZ1bmN0aW9uIHpJbmRleFNvcnQoYSwgYikge1xuICB2YXIgY3kgPSBhLmN5KCk7XG4gIHZhciBoYXNDb21wb3VuZE5vZGVzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICBmdW5jdGlvbiBnZXREZXB0aChlbGUpIHtcbiAgICB2YXIgc3R5bGUgPSBlbGUucHN0eWxlKCd6LWNvbXBvdW5kLWRlcHRoJyk7XG4gICAgaWYgKHN0eWxlLnZhbHVlID09PSAnYXV0bycpIHtcbiAgICAgIHJldHVybiBoYXNDb21wb3VuZE5vZGVzID8gZWxlLnpEZXB0aCgpIDogMDtcbiAgICB9IGVsc2UgaWYgKHN0eWxlLnZhbHVlID09PSAnYm90dG9tJykge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gZWxzZSBpZiAoc3R5bGUudmFsdWUgPT09ICd0b3AnKSB7XG4gICAgICByZXR1cm4gTUFYX0lOVCQxO1xuICAgIH1cbiAgICAvLyAnb3JwaGFuJ1xuICAgIHJldHVybiAwO1xuICB9XG4gIHZhciBkZXB0aERpZmYgPSBnZXREZXB0aChhKSAtIGdldERlcHRoKGIpO1xuICBpZiAoZGVwdGhEaWZmICE9PSAwKSB7XG4gICAgcmV0dXJuIGRlcHRoRGlmZjtcbiAgfVxuICBmdW5jdGlvbiBnZXRFbGVEZXB0aChlbGUpIHtcbiAgICB2YXIgc3R5bGUgPSBlbGUucHN0eWxlKCd6LWluZGV4LWNvbXBhcmUnKTtcbiAgICBpZiAoc3R5bGUudmFsdWUgPT09ICdhdXRvJykge1xuICAgICAgcmV0dXJuIGVsZS5pc05vZGUoKSA/IDEgOiAwO1xuICAgIH1cbiAgICAvLyAnbWFudWFsJ1xuICAgIHJldHVybiAwO1xuICB9XG4gIHZhciBlbGVEaWZmID0gZ2V0RWxlRGVwdGgoYSkgLSBnZXRFbGVEZXB0aChiKTtcbiAgaWYgKGVsZURpZmYgIT09IDApIHtcbiAgICByZXR1cm4gZWxlRGlmZjtcbiAgfVxuICB2YXIgekRpZmYgPSBhLnBzdHlsZSgnei1pbmRleCcpLnZhbHVlIC0gYi5wc3R5bGUoJ3otaW5kZXgnKS52YWx1ZTtcbiAgaWYgKHpEaWZmICE9PSAwKSB7XG4gICAgcmV0dXJuIHpEaWZmO1xuICB9XG4gIC8vIGNvbXBhcmUgaW5kaWNlcyBpbiB0aGUgY29yZSAob3JkZXIgYWRkZWQgdG8gZ3JhcGggdy8gbGFzdCBvbiB0b3ApXG4gIHJldHVybiBhLnBvb2xJbmRleCgpIC0gYi5wb29sSW5kZXgoKTtcbn07XG5cbnZhciBlbGVzZm4kNiA9IHtcbiAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChmbiwgdGhpc0FyZykge1xuICAgIGlmIChmbiQ2KGZuKSkge1xuICAgICAgdmFyIE4gPSB0aGlzLmxlbmd0aDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgICB2YXIgcmV0ID0gdGhpc0FyZyA/IGZuLmFwcGx5KHRoaXNBcmcsIFtlbGUsIGksIHRoaXNdKSA6IGZuKGVsZSwgaSwgdGhpcyk7XG4gICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gLy8gZXhpdCBlYWNoIGVhcmx5IG9uIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICB0b0FycmF5OiBmdW5jdGlvbiB0b0FycmF5KCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJyYXkucHVzaCh0aGlzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9LFxuICBzbGljZTogZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIHZhciB0aGlzU2l6ZSA9IHRoaXMubGVuZ3RoO1xuICAgIGlmIChlbmQgPT0gbnVsbCkge1xuICAgICAgZW5kID0gdGhpc1NpemU7XG4gICAgfVxuICAgIGlmIChzdGFydCA9PSBudWxsKSB7XG4gICAgICBzdGFydCA9IDA7XG4gICAgfVxuICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgIHN0YXJ0ID0gdGhpc1NpemUgKyBzdGFydDtcbiAgICB9XG4gICAgaWYgKGVuZCA8IDApIHtcbiAgICAgIGVuZCA9IHRoaXNTaXplICsgZW5kO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPj0gMCAmJiBpIDwgZW5kICYmIGkgPCB0aGlzU2l6ZTsgaSsrKSB7XG4gICAgICBhcnJheS5wdXNoKHRoaXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bihhcnJheSk7XG4gIH0sXG4gIHNpemU6IGZ1bmN0aW9uIHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoO1xuICB9LFxuICBlcTogZnVuY3Rpb24gZXEoaSkge1xuICAgIHJldHVybiB0aGlzW2ldIHx8IHRoaXMuc3Bhd24oKTtcbiAgfSxcbiAgZmlyc3Q6IGZ1bmN0aW9uIGZpcnN0KCkge1xuICAgIHJldHVybiB0aGlzWzBdIHx8IHRoaXMuc3Bhd24oKTtcbiAgfSxcbiAgbGFzdDogZnVuY3Rpb24gbGFzdCgpIHtcbiAgICByZXR1cm4gdGhpc1t0aGlzLmxlbmd0aCAtIDFdIHx8IHRoaXMuc3Bhd24oKTtcbiAgfSxcbiAgZW1wdHk6IGZ1bmN0aW9uIGVtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMDtcbiAgfSxcbiAgbm9uZW1wdHk6IGZ1bmN0aW9uIG5vbmVtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy5lbXB0eSgpO1xuICB9LFxuICBzb3J0OiBmdW5jdGlvbiBzb3J0KHNvcnRGbikge1xuICAgIGlmICghZm4kNihzb3J0Rm4pKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdmFyIHNvcnRlZCA9IHRoaXMudG9BcnJheSgpLnNvcnQoc29ydEZuKTtcbiAgICByZXR1cm4gdGhpcy5zcGF3bihzb3J0ZWQpO1xuICB9LFxuICBzb3J0QnlaSW5kZXg6IGZ1bmN0aW9uIHNvcnRCeVpJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0KHpJbmRleFNvcnQpO1xuICB9LFxuICB6RGVwdGg6IGZ1bmN0aW9uIHpEZXB0aCgpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoIWVsZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBsZXQgY3kgPSBlbGUuY3koKTtcbiAgICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gICAgdmFyIGdyb3VwID0gX3AuZ3JvdXA7XG4gICAgaWYgKGdyb3VwID09PSAnbm9kZXMnKSB7XG4gICAgICB2YXIgZGVwdGggPSBfcC5kYXRhLnBhcmVudCA/IGVsZS5wYXJlbnRzKCkuc2l6ZSgpIDogMDtcbiAgICAgIGlmICghZWxlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgcmV0dXJuIE1BWF9JTlQkMSAtIDE7IC8vIGNoaWxkbGVzcyBub2RlcyBhbHdheXMgb24gdG9wXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZXB0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNyYyA9IF9wLnNvdXJjZTtcbiAgICAgIHZhciB0Z3QgPSBfcC50YXJnZXQ7XG4gICAgICB2YXIgc3JjRGVwdGggPSBzcmMuekRlcHRoKCk7XG4gICAgICB2YXIgdGd0RGVwdGggPSB0Z3QuekRlcHRoKCk7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoc3JjRGVwdGgsIHRndERlcHRoLCAwKTsgLy8gZGVwdGggb2YgZGVlcGVzdCBwYXJlbnRcbiAgICB9XG4gIH1cbn07XG5cbmVsZXNmbiQ2LmVhY2ggPSBlbGVzZm4kNi5mb3JFYWNoO1xudmFyIGRlZmluZVN5bWJvbEl0ZXJhdG9yID0gZnVuY3Rpb24gZGVmaW5lU3ltYm9sSXRlcmF0b3IoKSB7XG4gIHZhciB0eXBlb2ZVbmRlZiA9IFwidW5kZWZpbmVkXCIgO1xuICB2YXIgaXNJdGVyYXRvclN1cHBvcnRlZCA9ICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YoU3ltYm9sKSkgIT0gdHlwZW9mVW5kZWYgJiYgX3R5cGVvZihTeW1ib2wuaXRlcmF0b3IpICE9IHR5cGVvZlVuZGVmOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgaWYgKGlzSXRlcmF0b3JTdXBwb3J0ZWQpIHtcbiAgICBlbGVzZm4kNltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICAgIHZhciBlbnRyeSA9IHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgIH07XG4gICAgICB2YXIgaSA9IDA7XG4gICAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgICByZXR1cm4gX2RlZmluZVByb3BlcnR5JDEoe1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBlbnRyeS52YWx1ZSA9IF90aGlzW2krK107XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgZW50cnkuZG9uZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBlbnRyeTtcbiAgICAgICAgfVxuICAgICAgfSwgU3ltYm9sLml0ZXJhdG9yLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG59O1xuZGVmaW5lU3ltYm9sSXRlcmF0b3IoKTtcblxudmFyIGdldExheW91dERpbWVuc2lvbk9wdGlvbnMgPSBkZWZhdWx0cyRnKHtcbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzOiBmYWxzZVxufSk7XG52YXIgZWxlc2ZuJDUgPSB7XG4gIC8vIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgbm9kZSBkaW1lbnNpb25zIHsgeCwgeSB9IGJhc2VkIG9uIG9wdGlvbnMgZ2l2ZW5cbiAgbGF5b3V0RGltZW5zaW9uczogZnVuY3Rpb24gbGF5b3V0RGltZW5zaW9ucyhvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IGdldExheW91dERpbWVuc2lvbk9wdGlvbnMob3B0aW9ucyk7XG4gICAgdmFyIGRpbXM7XG4gICAgaWYgKCF0aGlzLnRha2VzVXBTcGFjZSgpKSB7XG4gICAgICBkaW1zID0ge1xuICAgICAgICB3OiAwLFxuICAgICAgICBoOiAwXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5ub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHMpIHtcbiAgICAgIHZhciBiYkRpbSA9IHRoaXMuYm91bmRpbmdCb3goKTtcbiAgICAgIGRpbXMgPSB7XG4gICAgICAgIHc6IGJiRGltLncsXG4gICAgICAgIGg6IGJiRGltLmhcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpbXMgPSB7XG4gICAgICAgIHc6IHRoaXMub3V0ZXJXaWR0aCgpLFxuICAgICAgICBoOiB0aGlzLm91dGVySGVpZ2h0KClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gc2FuaXRpc2UgdGhlIGRpbWVuc2lvbnMgZm9yIGV4dGVybmFsIGxheW91dHMgKGF2b2lkIGRpdmlzaW9uIGJ5IHplcm8pXG4gICAgaWYgKGRpbXMudyA9PT0gMCB8fCBkaW1zLmggPT09IDApIHtcbiAgICAgIGRpbXMudyA9IGRpbXMuaCA9IDE7XG4gICAgfVxuICAgIHJldHVybiBkaW1zO1xuICB9LFxuICAvLyB1c2luZyBzdGFuZGFyZCBsYXlvdXQgb3B0aW9ucywgYXBwbHkgcG9zaXRpb24gZnVuY3Rpb24gKHcvIG9yIHcvbyBhbmltYXRpb24pXG4gIGxheW91dFBvc2l0aW9uczogZnVuY3Rpb24gbGF5b3V0UG9zaXRpb25zKGxheW91dCwgb3B0aW9ucywgZm4pIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCkuZmlsdGVyKGZ1bmN0aW9uIChuKSB7XG4gICAgICByZXR1cm4gIW4uaXNQYXJlbnQoKTtcbiAgICB9KTtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIGxheW91dEVsZXMgPSBvcHRpb25zLmVsZXM7IC8vIG5vZGVzICYgZWRnZXNcbiAgICB2YXIgZ2V0TWVtb2l6ZUtleSA9IGZ1bmN0aW9uIGdldE1lbW9pemVLZXkobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUuaWQoKTtcbiAgICB9O1xuICAgIHZhciBmbk1lbSA9IG1lbW9pemUkMShmbiwgZ2V0TWVtb2l6ZUtleSk7IC8vIG1lbW9pemVkIHZlcnNpb24gb2YgcG9zaXRpb24gZnVuY3Rpb25cblxuICAgIGxheW91dC5lbWl0KHtcbiAgICAgIHR5cGU6ICdsYXlvdXRzdGFydCcsXG4gICAgICBsYXlvdXQ6IGxheW91dFxuICAgIH0pO1xuICAgIGxheW91dC5hbmltYXRpb25zID0gW107XG4gICAgdmFyIGNhbGN1bGF0ZVNwYWNpbmcgPSBmdW5jdGlvbiBjYWxjdWxhdGVTcGFjaW5nKHNwYWNpbmcsIG5vZGVzQmIsIHBvcykge1xuICAgICAgdmFyIGNlbnRlciA9IHtcbiAgICAgICAgeDogbm9kZXNCYi54MSArIG5vZGVzQmIudyAvIDIsXG4gICAgICAgIHk6IG5vZGVzQmIueTEgKyBub2Rlc0JiLmggLyAyXG4gICAgICB9O1xuICAgICAgdmFyIHNwYWNpbmdWZWN0b3IgPSB7XG4gICAgICAgIC8vIHNjYWxlIGZyb20gY2VudGVyIG9mIGJvdW5kaW5nIGJveCAobm90IG5lY2Vzc2FyaWx5IDAsMClcbiAgICAgICAgeDogKHBvcy54IC0gY2VudGVyLngpICogc3BhY2luZyxcbiAgICAgICAgeTogKHBvcy55IC0gY2VudGVyLnkpICogc3BhY2luZ1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGNlbnRlci54ICsgc3BhY2luZ1ZlY3Rvci54LFxuICAgICAgICB5OiBjZW50ZXIueSArIHNwYWNpbmdWZWN0b3IueVxuICAgICAgfTtcbiAgICB9O1xuICAgIHZhciB1c2VTcGFjaW5nRmFjdG9yID0gb3B0aW9ucy5zcGFjaW5nRmFjdG9yICYmIG9wdGlvbnMuc3BhY2luZ0ZhY3RvciAhPT0gMTtcbiAgICB2YXIgc3BhY2luZ0JiID0gZnVuY3Rpb24gc3BhY2luZ0JiKCkge1xuICAgICAgaWYgKCF1c2VTcGFjaW5nRmFjdG9yKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHZhciBwb3MgPSBmbk1lbShub2RlLCBpKTtcbiAgICAgICAgZXhwYW5kQm91bmRpbmdCb3hCeVBvaW50KGJiLCBwb3MueCwgcG9zLnkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJiO1xuICAgIH07XG4gICAgdmFyIGJiID0gc3BhY2luZ0JiKCk7XG4gICAgdmFyIGdldEZpbmFsUG9zID0gbWVtb2l6ZSQxKGZ1bmN0aW9uIChub2RlLCBpKSB7XG4gICAgICB2YXIgbmV3UG9zID0gZm5NZW0obm9kZSwgaSk7XG4gICAgICBpZiAodXNlU3BhY2luZ0ZhY3Rvcikge1xuICAgICAgICB2YXIgc3BhY2luZyA9IE1hdGguYWJzKG9wdGlvbnMuc3BhY2luZ0ZhY3Rvcik7XG4gICAgICAgIG5ld1BvcyA9IGNhbGN1bGF0ZVNwYWNpbmcoc3BhY2luZywgYmIsIG5ld1Bvcyk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy50cmFuc2Zvcm0gIT0gbnVsbCkge1xuICAgICAgICBuZXdQb3MgPSBvcHRpb25zLnRyYW5zZm9ybShub2RlLCBuZXdQb3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld1BvcztcbiAgICB9LCBnZXRNZW1vaXplS2V5KTtcbiAgICBpZiAob3B0aW9ucy5hbmltYXRlKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHZhciBuZXdQb3MgPSBnZXRGaW5hbFBvcyhub2RlLCBpKTtcbiAgICAgICAgdmFyIGFuaW1hdGVOb2RlID0gb3B0aW9ucy5hbmltYXRlRmlsdGVyID09IG51bGwgfHwgb3B0aW9ucy5hbmltYXRlRmlsdGVyKG5vZGUsIGkpO1xuICAgICAgICBpZiAoYW5pbWF0ZU5vZGUpIHtcbiAgICAgICAgICB2YXIgYW5pID0gbm9kZS5hbmltYXRpb24oe1xuICAgICAgICAgICAgcG9zaXRpb246IG5ld1BvcyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBvcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgICAgICAgZWFzaW5nOiBvcHRpb25zLmFuaW1hdGlvbkVhc2luZ1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGxheW91dC5hbmltYXRpb25zLnB1c2goYW5pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlLnBvc2l0aW9uKG5ld1Bvcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLmZpdCkge1xuICAgICAgICB2YXIgZml0QW5pID0gY3kuYW5pbWF0aW9uKHtcbiAgICAgICAgICBmaXQ6IHtcbiAgICAgICAgICAgIGJvdW5kaW5nQm94OiBsYXlvdXRFbGVzLmJvdW5kaW5nQm94QXQoZ2V0RmluYWxQb3MpLFxuICAgICAgICAgICAgcGFkZGluZzogb3B0aW9ucy5wYWRkaW5nXG4gICAgICAgICAgfSxcbiAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5hbmltYXRpb25EdXJhdGlvbixcbiAgICAgICAgICBlYXNpbmc6IG9wdGlvbnMuYW5pbWF0aW9uRWFzaW5nXG4gICAgICAgIH0pO1xuICAgICAgICBsYXlvdXQuYW5pbWF0aW9ucy5wdXNoKGZpdEFuaSk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuem9vbSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMucGFuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIHpvb21QYW5BbmkgPSBjeS5hbmltYXRpb24oe1xuICAgICAgICAgIHpvb206IG9wdGlvbnMuem9vbSxcbiAgICAgICAgICBwYW46IG9wdGlvbnMucGFuLFxuICAgICAgICAgIGR1cmF0aW9uOiBvcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgICAgIGVhc2luZzogb3B0aW9ucy5hbmltYXRpb25FYXNpbmdcbiAgICAgICAgfSk7XG4gICAgICAgIGxheW91dC5hbmltYXRpb25zLnB1c2goem9vbVBhbkFuaSk7XG4gICAgICB9XG4gICAgICBsYXlvdXQuYW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChhbmkpIHtcbiAgICAgICAgcmV0dXJuIGFuaS5wbGF5KCk7XG4gICAgICB9KTtcbiAgICAgIGxheW91dC5vbmUoJ2xheW91dHJlYWR5Jywgb3B0aW9ucy5yZWFkeSk7XG4gICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdsYXlvdXRyZWFkeScsXG4gICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICB9KTtcbiAgICAgIFByb21pc2UkMS5hbGwobGF5b3V0LmFuaW1hdGlvbnMubWFwKGZ1bmN0aW9uIChhbmkpIHtcbiAgICAgICAgcmV0dXJuIGFuaS5wcm9taXNlKCk7XG4gICAgICB9KSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxheW91dC5vbmUoJ2xheW91dHN0b3AnLCBvcHRpb25zLnN0b3ApO1xuICAgICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgICAgdHlwZTogJ2xheW91dHN0b3AnLFxuICAgICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVzLnBvc2l0aW9ucyhnZXRGaW5hbFBvcyk7XG4gICAgICBpZiAob3B0aW9ucy5maXQpIHtcbiAgICAgICAgY3kuZml0KG9wdGlvbnMuZWxlcywgb3B0aW9ucy5wYWRkaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnpvb20gIT0gbnVsbCkge1xuICAgICAgICBjeS56b29tKG9wdGlvbnMuem9vbSk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5wYW4pIHtcbiAgICAgICAgY3kucGFuKG9wdGlvbnMucGFuKTtcbiAgICAgIH1cbiAgICAgIGxheW91dC5vbmUoJ2xheW91dHJlYWR5Jywgb3B0aW9ucy5yZWFkeSk7XG4gICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdsYXlvdXRyZWFkeScsXG4gICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICB9KTtcbiAgICAgIGxheW91dC5vbmUoJ2xheW91dHN0b3AnLCBvcHRpb25zLnN0b3ApO1xuICAgICAgbGF5b3V0LmVtaXQoe1xuICAgICAgICB0eXBlOiAnbGF5b3V0c3RvcCcsXG4gICAgICAgIGxheW91dDogbGF5b3V0XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgbGF5b3V0OiBmdW5jdGlvbiBsYXlvdXQob3B0aW9ucykge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICByZXR1cm4gY3kubWFrZUxheW91dChleHRlbmQoe30sIG9wdGlvbnMsIHtcbiAgICAgIGVsZXM6IHRoaXNcbiAgICB9KSk7XG4gIH1cbn07XG5cbi8vIGFsaWFzZXM6XG5lbGVzZm4kNS5jcmVhdGVMYXlvdXQgPSBlbGVzZm4kNS5tYWtlTGF5b3V0ID0gZWxlc2ZuJDUubGF5b3V0O1xuXG5mdW5jdGlvbiBzdHlsZUNhY2hlKGtleSwgZm4sIGVsZSkge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBjYWNoZSA9IF9wLnN0eWxlQ2FjaGUgPSBfcC5zdHlsZUNhY2hlIHx8IFtdO1xuICB2YXIgdmFsO1xuICBpZiAoKHZhbCA9IGNhY2hlW2tleV0pICE9IG51bGwpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9IGVsc2Uge1xuICAgIHZhbCA9IGNhY2hlW2tleV0gPSBmbihlbGUpO1xuICAgIHJldHVybiB2YWw7XG4gIH1cbn1cbmZ1bmN0aW9uIGNhY2hlU3R5bGVGdW5jdGlvbihrZXksIGZuKSB7XG4gIGtleSA9IGhhc2hTdHJpbmcoa2V5KTtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNhY2hlZFN0eWxlRnVuY3Rpb24oZWxlKSB7XG4gICAgcmV0dXJuIHN0eWxlQ2FjaGUoa2V5LCBmbiwgZWxlKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNhY2hlUHJvdG90eXBlU3R5bGVGdW5jdGlvbihrZXksIGZuKSB7XG4gIGtleSA9IGhhc2hTdHJpbmcoa2V5KTtcbiAgdmFyIHNlbGZGbiA9IGZ1bmN0aW9uIHNlbGZGbihlbGUpIHtcbiAgICByZXR1cm4gZm4uY2FsbChlbGUpO1xuICB9O1xuICByZXR1cm4gZnVuY3Rpb24gY2FjaGVkUHJvdG90eXBlU3R5bGVGdW5jdGlvbigpIHtcbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gc3R5bGVDYWNoZShrZXksIHNlbGZGbiwgZWxlKTtcbiAgICB9XG4gIH07XG59XG52YXIgZWxlc2ZuJDQgPSB7XG4gIHJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZTogZnVuY3Rpb24gcmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKHVzZUNhY2hlKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIHZhciByZW5kZXJlciA9IGN5LnJlbmRlcmVyKCk7XG4gICAgdmFyIHN0eWxlRW5hYmxlZCA9IGN5LnN0eWxlRW5hYmxlZCgpO1xuICAgIGlmIChyZW5kZXJlciAmJiBzdHlsZUVuYWJsZWQpIHtcbiAgICAgIHJlbmRlcmVyLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZSh0aGlzLCB1c2VDYWNoZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBkaXJ0eVN0eWxlQ2FjaGU6IGZ1bmN0aW9uIGRpcnR5U3R5bGVDYWNoZSgpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgdmFyIGRpcnR5ID0gZnVuY3Rpb24gZGlydHkoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLl9wcml2YXRlLnN0eWxlQ2FjaGUgPSBudWxsO1xuICAgIH07XG4gICAgaWYgKGN5Lmhhc0NvbXBvdW5kTm9kZXMoKSkge1xuICAgICAgdmFyIGVsZXM7XG4gICAgICBlbGVzID0gdGhpcy5zcGF3blNlbGYoKS5tZXJnZSh0aGlzLmRlc2NlbmRhbnRzKCkpLm1lcmdlKHRoaXMucGFyZW50cygpKTtcbiAgICAgIGVsZXMubWVyZ2UoZWxlcy5jb25uZWN0ZWRFZGdlcygpKTtcbiAgICAgIGVsZXMuZm9yRWFjaChkaXJ0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIGRpcnR5KGVsZSk7XG4gICAgICAgIGVsZS5jb25uZWN0ZWRFZGdlcygpLmZvckVhY2goZGlydHkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICAvLyBmdWxseSB1cGRhdGVzIChyZWNhbGN1bGF0ZXMpIHRoZSBzdHlsZSBmb3IgdGhlIGVsZW1lbnRzXG4gIHVwZGF0ZVN0eWxlOiBmdW5jdGlvbiB1cGRhdGVTdHlsZShub3RpZnlSZW5kZXJlcikge1xuICAgIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmIChjeS5iYXRjaGluZygpKSB7XG4gICAgICB2YXIgYkVsZXMgPSBjeS5fcHJpdmF0ZS5iYXRjaFN0eWxlRWxlcztcbiAgICAgIGJFbGVzLm1lcmdlKHRoaXMpO1xuICAgICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nIGFuZCBleGl0IGVhcmx5IHdoZW4gYmF0Y2hpbmdcbiAgICB9XG5cbiAgICB2YXIgaGFzQ29tcG91bmRzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICAgIHZhciB1cGRhdGVkRWxlcyA9IHRoaXM7XG4gICAgbm90aWZ5UmVuZGVyZXIgPSBub3RpZnlSZW5kZXJlciB8fCBub3RpZnlSZW5kZXJlciA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGZhbHNlO1xuICAgIGlmIChoYXNDb21wb3VuZHMpIHtcbiAgICAgIC8vIHRoZW4gYWRkIGV2ZXJ5dGhpbmcgdXAgYW5kIGRvd24gZm9yIGNvbXBvdW5kIHNlbGVjdG9yIGNoZWNrc1xuICAgICAgdXBkYXRlZEVsZXMgPSB0aGlzLnNwYXduU2VsZigpLm1lcmdlKHRoaXMuZGVzY2VuZGFudHMoKSkubWVyZ2UodGhpcy5wYXJlbnRzKCkpO1xuICAgIH1cblxuICAgIC8vIGxldCBjaGFuZ2VkRWxlcyA9IHN0eWxlLmFwcGx5KCB1cGRhdGVkRWxlcyApO1xuICAgIHZhciBjaGFuZ2VkRWxlcyA9IHVwZGF0ZWRFbGVzO1xuICAgIGlmIChub3RpZnlSZW5kZXJlcikge1xuICAgICAgY2hhbmdlZEVsZXMuZW1pdEFuZE5vdGlmeSgnc3R5bGUnKTsgLy8gbGV0IHJlbmRlcmVyIGtub3cgd2UgY2hhbmdlZCBzdHlsZVxuICAgIH0gZWxzZSB7XG4gICAgICBjaGFuZ2VkRWxlcy5lbWl0KCdzdHlsZScpOyAvLyBqdXN0IGZpcmUgdGhlIGV2ZW50XG4gICAgfVxuXG4gICAgdXBkYXRlZEVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLl9wcml2YXRlLnN0eWxlRGlydHkgPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIC8vIHByaXZhdGU6IGNsZWFycyBkaXJ0eSBmbGFnIGFuZCByZWNhbGN1bGF0ZXMgc3R5bGVcbiAgY2xlYW5TdHlsZTogZnVuY3Rpb24gY2xlYW5TdHlsZSgpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgaWYgKGVsZS5fcHJpdmF0ZS5zdHlsZURpcnR5KSB7XG4gICAgICAgIC8vIG4uYi4gdGhpcyBmbGFnIHNob3VsZCBiZSBzZXQgYmVmb3JlIGFwcGx5KCkgdG8gYXZvaWQgcG90ZW50aWFsIGluZmluaXRlIHJlY3Vyc2lvblxuICAgICAgICBlbGUuX3ByaXZhdGUuc3R5bGVEaXJ0eSA9IGZhbHNlO1xuICAgICAgICBjeS5zdHlsZSgpLmFwcGx5KGVsZSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvLyBnZXQgdGhlIGludGVybmFsIHBhcnNlZCBzdHlsZSBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlcbiAgcGFyc2VkU3R5bGU6IGZ1bmN0aW9uIHBhcnNlZFN0eWxlKHByb3BlcnR5KSB7XG4gICAgdmFyIGluY2x1ZGVOb25EZWZhdWx0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciBjeSA9IGVsZS5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVsZSkge1xuICAgICAgdGhpcy5jbGVhblN0eWxlKCk7XG4gICAgICB2YXIgb3ZlcnJpZGRlblN0eWxlID0gZWxlLl9wcml2YXRlLnN0eWxlW3Byb3BlcnR5XTtcbiAgICAgIGlmIChvdmVycmlkZGVuU3R5bGUgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGRlblN0eWxlO1xuICAgICAgfSBlbHNlIGlmIChpbmNsdWRlTm9uRGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gY3kuc3R5bGUoKS5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBudW1lcmljU3R5bGU6IGZ1bmN0aW9uIG51bWVyaWNTdHlsZShwcm9wZXJ0eSkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmICghZWxlLmN5KCkuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVsZSkge1xuICAgICAgdmFyIHBzdHlsZSA9IGVsZS5wc3R5bGUocHJvcGVydHkpO1xuICAgICAgcmV0dXJuIHBzdHlsZS5wZlZhbHVlICE9PSB1bmRlZmluZWQgPyBwc3R5bGUucGZWYWx1ZSA6IHBzdHlsZS52YWx1ZTtcbiAgICB9XG4gIH0sXG4gIG51bWVyaWNTdHlsZVVuaXRzOiBmdW5jdGlvbiBudW1lcmljU3R5bGVVbml0cyhwcm9wZXJ0eSkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmICghZWxlLmN5KCkuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5wc3R5bGUocHJvcGVydHkpLnVuaXRzO1xuICAgIH1cbiAgfSxcbiAgLy8gZ2V0IHRoZSBzcGVjaWZpZWQgY3NzIHByb3BlcnR5IGFzIGEgcmVuZGVyZWQgdmFsdWUgKGkuZS4gb24tc2NyZWVuIHZhbHVlKVxuICAvLyBvciBnZXQgdGhlIHdob2xlIHJlbmRlcmVkIHN0eWxlIGlmIG5vIHByb3BlcnR5IHNwZWNpZmllZCAoTkIgZG9lc24ndCBhbGxvdyBzZXR0aW5nKVxuICByZW5kZXJlZFN0eWxlOiBmdW5jdGlvbiByZW5kZXJlZFN0eWxlKHByb3BlcnR5KSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2YXIgZWxlID0gdGhpc1swXTtcbiAgICBpZiAoZWxlKSB7XG4gICAgICByZXR1cm4gY3kuc3R5bGUoKS5nZXRSZW5kZXJlZFN0eWxlKGVsZSwgcHJvcGVydHkpO1xuICAgIH1cbiAgfSxcbiAgLy8gcmVhZCB0aGUgY2FsY3VsYXRlZCBjc3Mgc3R5bGUgb2YgdGhlIGVsZW1lbnQgb3Igb3ZlcnJpZGUgdGhlIHN0eWxlICh2aWEgYSBieXBhc3MpXG4gIHN0eWxlOiBmdW5jdGlvbiBzdHlsZShuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdmFyIHVwZGF0ZVRyYW5zaXRpb25zID0gZmFsc2U7XG4gICAgdmFyIHN0eWxlID0gY3kuc3R5bGUoKTtcbiAgICBpZiAocGxhaW5PYmplY3QobmFtZSkpIHtcbiAgICAgIC8vIHRoZW4gZXh0ZW5kIHRoZSBieXBhc3NcbiAgICAgIHZhciBwcm9wcyA9IG5hbWU7XG4gICAgICBzdHlsZS5hcHBseUJ5cGFzcyh0aGlzLCBwcm9wcywgdXBkYXRlVHJhbnNpdGlvbnMpO1xuICAgICAgdGhpcy5lbWl0QW5kTm90aWZ5KCdzdHlsZScpOyAvLyBsZXQgdGhlIHJlbmRlcmVyIGtub3cgd2UndmUgdXBkYXRlZCBzdHlsZVxuICAgIH0gZWxzZSBpZiAoc3RyaW5nKG5hbWUpKSB7XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyB0aGVuIGdldCB0aGUgcHJvcGVydHkgZnJvbSB0aGUgc3R5bGVcbiAgICAgICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgICAgIGlmIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gc3R5bGUuZ2V0U3R5bGVQcm9wZXJ0eVZhbHVlKGVsZSwgbmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZW1wdHkgY29sbGVjdGlvbiA9PiBjYW4ndCBnZXQgYW55IHZhbHVlXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGVuIHNldCB0aGUgYnlwYXNzIHdpdGggdGhlIHByb3BlcnR5IHZhbHVlXG4gICAgICAgIHN0eWxlLmFwcGx5QnlwYXNzKHRoaXMsIG5hbWUsIHZhbHVlLCB1cGRhdGVUcmFuc2l0aW9ucyk7XG4gICAgICAgIHRoaXMuZW1pdEFuZE5vdGlmeSgnc3R5bGUnKTsgLy8gbGV0IHRoZSByZW5kZXJlciBrbm93IHdlJ3ZlIHVwZGF0ZWQgc3R5bGVcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIF9lbGUgPSB0aGlzWzBdO1xuICAgICAgaWYgKF9lbGUpIHtcbiAgICAgICAgcmV0dXJuIHN0eWxlLmdldFJhd1N0eWxlKF9lbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZW1wdHkgY29sbGVjdGlvbiA9PiBjYW4ndCBnZXQgYW55IHZhbHVlXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgcmVtb3ZlU3R5bGU6IGZ1bmN0aW9uIHJlbW92ZVN0eWxlKG5hbWVzKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2YXIgdXBkYXRlVHJhbnNpdGlvbnMgPSBmYWxzZTtcbiAgICB2YXIgc3R5bGUgPSBjeS5zdHlsZSgpO1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICBpZiAobmFtZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgICAgICBzdHlsZS5yZW1vdmVBbGxCeXBhc3NlcyhlbGUsIHVwZGF0ZVRyYW5zaXRpb25zKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZXMgPSBuYW1lcy5zcGxpdCgvXFxzKy8pO1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGVsZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBfZWxlMiA9IGVsZXNbX2ldO1xuICAgICAgICBzdHlsZS5yZW1vdmVCeXBhc3NlcyhfZWxlMiwgbmFtZXMsIHVwZGF0ZVRyYW5zaXRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5lbWl0QW5kTm90aWZ5KCdzdHlsZScpOyAvLyBsZXQgdGhlIHJlbmRlcmVyIGtub3cgd2UndmUgdXBkYXRlZCBzdHlsZVxuXG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcbiAgICB0aGlzLmNzcygnZGlzcGxheScsICdlbGVtZW50Jyk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgaGlkZTogZnVuY3Rpb24gaGlkZSgpIHtcbiAgICB0aGlzLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgZWZmZWN0aXZlT3BhY2l0eTogZnVuY3Rpb24gZWZmZWN0aXZlT3BhY2l0eSgpIHtcbiAgICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHZhciBoYXNDb21wb3VuZE5vZGVzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgIHZhciBwYXJlbnRPcGFjaXR5ID0gZWxlLnBzdHlsZSgnb3BhY2l0eScpLnZhbHVlO1xuICAgICAgaWYgKCFoYXNDb21wb3VuZE5vZGVzKSB7XG4gICAgICAgIHJldHVybiBwYXJlbnRPcGFjaXR5O1xuICAgICAgfVxuICAgICAgdmFyIHBhcmVudHMgPSAhX3AuZGF0YS5wYXJlbnQgPyBudWxsIDogZWxlLnBhcmVudHMoKTtcbiAgICAgIGlmIChwYXJlbnRzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2ldO1xuICAgICAgICAgIHZhciBvcGFjaXR5ID0gcGFyZW50LnBzdHlsZSgnb3BhY2l0eScpLnZhbHVlO1xuICAgICAgICAgIHBhcmVudE9wYWNpdHkgPSBvcGFjaXR5ICogcGFyZW50T3BhY2l0eTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcmVudE9wYWNpdHk7XG4gICAgfVxuICB9LFxuICB0cmFuc3BhcmVudDogZnVuY3Rpb24gdHJhbnNwYXJlbnQoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBlbGUuY3koKS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gICAgaWYgKGVsZSkge1xuICAgICAgaWYgKCFoYXNDb21wb3VuZE5vZGVzKSB7XG4gICAgICAgIHJldHVybiBlbGUucHN0eWxlKCdvcGFjaXR5JykudmFsdWUgPT09IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWxlLmVmZmVjdGl2ZU9wYWNpdHkoKSA9PT0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGJhY2tncm91bmRpbmc6IGZ1bmN0aW9uIGJhY2tncm91bmRpbmcoKSB7XG4gICAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgcmV0dXJuIGVsZS5fcHJpdmF0ZS5iYWNrZ3JvdW5kaW5nID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG59O1xuZnVuY3Rpb24gY2hlY2tDb21wb3VuZChlbGUsIHBhcmVudE9rKSB7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHBhcmVudHMgPSBfcC5kYXRhLnBhcmVudCA/IGVsZS5wYXJlbnRzKCkgOiBudWxsO1xuICBpZiAocGFyZW50cykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhcmVudCA9IHBhcmVudHNbaV07XG4gICAgICBpZiAoIXBhcmVudE9rKHBhcmVudCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGRlZmluZURlcml2ZWRTdGF0ZUZ1bmN0aW9uKHNwZWNzKSB7XG4gIHZhciBvayA9IHNwZWNzLm9rO1xuICB2YXIgZWRnZU9rVmlhTm9kZSA9IHNwZWNzLmVkZ2VPa1ZpYU5vZGUgfHwgc3BlY3Mub2s7XG4gIHZhciBwYXJlbnRPayA9IHNwZWNzLnBhcmVudE9rIHx8IHNwZWNzLm9rO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjeSA9IHRoaXMuY3koKTtcbiAgICBpZiAoIWN5LnN0eWxlRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIGhhc0NvbXBvdW5kTm9kZXMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gICAgaWYgKGVsZSkge1xuICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgaWYgKCFvayhlbGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgICAgcmV0dXJuICFoYXNDb21wb3VuZE5vZGVzIHx8IGNoZWNrQ29tcG91bmQoZWxlLCBwYXJlbnRPayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgc3JjID0gX3Auc291cmNlO1xuICAgICAgICB2YXIgdGd0ID0gX3AudGFyZ2V0O1xuICAgICAgICByZXR1cm4gZWRnZU9rVmlhTm9kZShzcmMpICYmICghaGFzQ29tcG91bmROb2RlcyB8fCBjaGVja0NvbXBvdW5kKHNyYywgZWRnZU9rVmlhTm9kZSkpICYmIChzcmMgPT09IHRndCB8fCBlZGdlT2tWaWFOb2RlKHRndCkgJiYgKCFoYXNDb21wb3VuZE5vZGVzIHx8IGNoZWNrQ29tcG91bmQodGd0LCBlZGdlT2tWaWFOb2RlKSkpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbnZhciBlbGVUYWtlc1VwU3BhY2UgPSBjYWNoZVN0eWxlRnVuY3Rpb24oJ2VsZVRha2VzVXBTcGFjZScsIGZ1bmN0aW9uIChlbGUpIHtcbiAgcmV0dXJuIGVsZS5wc3R5bGUoJ2Rpc3BsYXknKS52YWx1ZSA9PT0gJ2VsZW1lbnQnICYmIGVsZS53aWR0aCgpICE9PSAwICYmIChlbGUuaXNOb2RlKCkgPyBlbGUuaGVpZ2h0KCkgIT09IDAgOiB0cnVlKTtcbn0pO1xuZWxlc2ZuJDQudGFrZXNVcFNwYWNlID0gY2FjaGVQcm90b3R5cGVTdHlsZUZ1bmN0aW9uKCd0YWtlc1VwU3BhY2UnLCBkZWZpbmVEZXJpdmVkU3RhdGVGdW5jdGlvbih7XG4gIG9rOiBlbGVUYWtlc1VwU3BhY2Vcbn0pKTtcbnZhciBlbGVJbnRlcmFjdGl2ZSA9IGNhY2hlU3R5bGVGdW5jdGlvbignZWxlSW50ZXJhY3RpdmUnLCBmdW5jdGlvbiAoZWxlKSB7XG4gIHJldHVybiBlbGUucHN0eWxlKCdldmVudHMnKS52YWx1ZSA9PT0gJ3llcycgJiYgZWxlLnBzdHlsZSgndmlzaWJpbGl0eScpLnZhbHVlID09PSAndmlzaWJsZScgJiYgZWxlVGFrZXNVcFNwYWNlKGVsZSk7XG59KTtcbnZhciBwYXJlbnRJbnRlcmFjdGl2ZSA9IGNhY2hlU3R5bGVGdW5jdGlvbigncGFyZW50SW50ZXJhY3RpdmUnLCBmdW5jdGlvbiAocGFyZW50KSB7XG4gIHJldHVybiBwYXJlbnQucHN0eWxlKCd2aXNpYmlsaXR5JykudmFsdWUgPT09ICd2aXNpYmxlJyAmJiBlbGVUYWtlc1VwU3BhY2UocGFyZW50KTtcbn0pO1xuZWxlc2ZuJDQuaW50ZXJhY3RpdmUgPSBjYWNoZVByb3RvdHlwZVN0eWxlRnVuY3Rpb24oJ2ludGVyYWN0aXZlJywgZGVmaW5lRGVyaXZlZFN0YXRlRnVuY3Rpb24oe1xuICBvazogZWxlSW50ZXJhY3RpdmUsXG4gIHBhcmVudE9rOiBwYXJlbnRJbnRlcmFjdGl2ZSxcbiAgZWRnZU9rVmlhTm9kZTogZWxlVGFrZXNVcFNwYWNlXG59KSk7XG5lbGVzZm4kNC5ub25pbnRlcmFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIGlmIChlbGUpIHtcbiAgICByZXR1cm4gIWVsZS5pbnRlcmFjdGl2ZSgpO1xuICB9XG59O1xudmFyIGVsZVZpc2libGUgPSBjYWNoZVN0eWxlRnVuY3Rpb24oJ2VsZVZpc2libGUnLCBmdW5jdGlvbiAoZWxlKSB7XG4gIHJldHVybiBlbGUucHN0eWxlKCd2aXNpYmlsaXR5JykudmFsdWUgPT09ICd2aXNpYmxlJyAmJiBlbGUucHN0eWxlKCdvcGFjaXR5JykucGZWYWx1ZSAhPT0gMCAmJiBlbGVUYWtlc1VwU3BhY2UoZWxlKTtcbn0pO1xudmFyIGVkZ2VWaXNpYmxlVmlhTm9kZSA9IGVsZVRha2VzVXBTcGFjZTtcbmVsZXNmbiQ0LnZpc2libGUgPSBjYWNoZVByb3RvdHlwZVN0eWxlRnVuY3Rpb24oJ3Zpc2libGUnLCBkZWZpbmVEZXJpdmVkU3RhdGVGdW5jdGlvbih7XG4gIG9rOiBlbGVWaXNpYmxlLFxuICBlZGdlT2tWaWFOb2RlOiBlZGdlVmlzaWJsZVZpYU5vZGVcbn0pKTtcbmVsZXNmbiQ0LmhpZGRlbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIGlmIChlbGUpIHtcbiAgICByZXR1cm4gIWVsZS52aXNpYmxlKCk7XG4gIH1cbn07XG5lbGVzZm4kNC5pc0J1bmRsZWRCZXppZXIgPSBjYWNoZVByb3RvdHlwZVN0eWxlRnVuY3Rpb24oJ2lzQnVuZGxlZEJlemllcicsIGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLmN5KCkuc3R5bGVFbmFibGVkKCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuICF0aGlzLnJlbW92ZWQoKSAmJiB0aGlzLnBzdHlsZSgnY3VydmUtc3R5bGUnKS52YWx1ZSA9PT0gJ2JlemllcicgJiYgdGhpcy50YWtlc1VwU3BhY2UoKTtcbn0pO1xuZWxlc2ZuJDQuYnlwYXNzID0gZWxlc2ZuJDQuY3NzID0gZWxlc2ZuJDQuc3R5bGU7XG5lbGVzZm4kNC5yZW5kZXJlZENzcyA9IGVsZXNmbiQ0LnJlbmRlcmVkU3R5bGU7XG5lbGVzZm4kNC5yZW1vdmVCeXBhc3MgPSBlbGVzZm4kNC5yZW1vdmVDc3MgPSBlbGVzZm4kNC5yZW1vdmVTdHlsZTtcbmVsZXNmbiQ0LnBzdHlsZSA9IGVsZXNmbiQ0LnBhcnNlZFN0eWxlO1xuXG52YXIgZWxlc2ZuJDMgPSB7fTtcbmZ1bmN0aW9uIGRlZmluZVN3aXRjaEZ1bmN0aW9uKHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHZhciBjaGFuZ2VkRWxlcyA9IFtdO1xuXG4gICAgLy8gZS5nLiBjeS5ub2RlcygpLnNlbGVjdCggZGF0YSwgaGFuZGxlciApXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICB2YXIgZGF0YSA9IGFyZ3NbMF07XG4gICAgICB2YXIgaGFuZGxlciA9IGFyZ3NbMV07XG4gICAgICB0aGlzLm9uKHBhcmFtcy5ldmVudCwgZGF0YSwgaGFuZGxlcik7XG4gICAgfVxuXG4gICAgLy8gZS5nLiBjeS5ub2RlcygpLnNlbGVjdCggaGFuZGxlciApXG4gICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgZm4kNihhcmdzWzBdKSkge1xuICAgICAgdmFyIF9oYW5kbGVyID0gYXJnc1swXTtcbiAgICAgIHRoaXMub24ocGFyYW1zLmV2ZW50LCBfaGFuZGxlcik7XG4gICAgfVxuXG4gICAgLy8gZS5nLiBjeS5ub2RlcygpLnNlbGVjdCgpXG4gICAgLy8gZS5nLiAocHJpdmF0ZSkgY3kubm9kZXMoKS5zZWxlY3QoWyd0YXBzZWxlY3QnXSlcbiAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMCB8fCBhcmdzLmxlbmd0aCA9PT0gMSAmJiBhcnJheShhcmdzWzBdKSkge1xuICAgICAgdmFyIGFkZGxFdmVudHMgPSBhcmdzLmxlbmd0aCA9PT0gMSA/IGFyZ3NbMF0gOiBudWxsO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgICAgICB2YXIgYWJsZSA9ICFwYXJhbXMuYWJsZUZpZWxkIHx8IGVsZS5fcHJpdmF0ZVtwYXJhbXMuYWJsZUZpZWxkXTtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBlbGUuX3ByaXZhdGVbcGFyYW1zLmZpZWxkXSAhPSBwYXJhbXMudmFsdWU7XG4gICAgICAgIGlmIChwYXJhbXMub3ZlcnJpZGVBYmxlKSB7XG4gICAgICAgICAgdmFyIG92ZXJyaWRlQWJsZSA9IHBhcmFtcy5vdmVycmlkZUFibGUoZWxlKTtcbiAgICAgICAgICBpZiAob3ZlcnJpZGVBYmxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFibGUgPSBvdmVycmlkZUFibGU7XG4gICAgICAgICAgICBpZiAoIW92ZXJyaWRlQWJsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0gLy8gdG8gc2F2ZSBjeWNsZXMgYXNzdW1lIG5vdCBhYmxlIGZvciBhbGwgb24gb3ZlcnJpZGVcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWJsZSkge1xuICAgICAgICAgIGVsZS5fcHJpdmF0ZVtwYXJhbXMuZmllbGRdID0gcGFyYW1zLnZhbHVlO1xuICAgICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICBjaGFuZ2VkRWxlcy5wdXNoKGVsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgY2hhbmdlZENvbGwgPSB0aGlzLnNwYXduKGNoYW5nZWRFbGVzKTtcbiAgICAgIGNoYW5nZWRDb2xsLnVwZGF0ZVN0eWxlKCk7IC8vIGNoYW5nZSBvZiBzdGF0ZSA9PiBwb3NzaWJsZSBjaGFuZ2Ugb2Ygc3R5bGVcbiAgICAgIGNoYW5nZWRDb2xsLmVtaXQocGFyYW1zLmV2ZW50KTtcbiAgICAgIGlmIChhZGRsRXZlbnRzKSB7XG4gICAgICAgIGNoYW5nZWRDb2xsLmVtaXQoYWRkbEV2ZW50cyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuZnVuY3Rpb24gZGVmaW5lU3dpdGNoU2V0KHBhcmFtcykge1xuICBlbGVzZm4kM1twYXJhbXMuZmllbGRdID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIGlmIChlbGUpIHtcbiAgICAgIGlmIChwYXJhbXMub3ZlcnJpZGVGaWVsZCkge1xuICAgICAgICB2YXIgdmFsID0gcGFyYW1zLm92ZXJyaWRlRmllbGQoZWxlKTtcbiAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVsZS5fcHJpdmF0ZVtwYXJhbXMuZmllbGRdO1xuICAgIH1cbiAgfTtcbiAgZWxlc2ZuJDNbcGFyYW1zLm9uXSA9IGRlZmluZVN3aXRjaEZ1bmN0aW9uKHtcbiAgICBldmVudDogcGFyYW1zLm9uLFxuICAgIGZpZWxkOiBwYXJhbXMuZmllbGQsXG4gICAgYWJsZUZpZWxkOiBwYXJhbXMuYWJsZUZpZWxkLFxuICAgIG92ZXJyaWRlQWJsZTogcGFyYW1zLm92ZXJyaWRlQWJsZSxcbiAgICB2YWx1ZTogdHJ1ZVxuICB9KTtcbiAgZWxlc2ZuJDNbcGFyYW1zLm9mZl0gPSBkZWZpbmVTd2l0Y2hGdW5jdGlvbih7XG4gICAgZXZlbnQ6IHBhcmFtcy5vZmYsXG4gICAgZmllbGQ6IHBhcmFtcy5maWVsZCxcbiAgICBhYmxlRmllbGQ6IHBhcmFtcy5hYmxlRmllbGQsXG4gICAgb3ZlcnJpZGVBYmxlOiBwYXJhbXMub3ZlcnJpZGVBYmxlLFxuICAgIHZhbHVlOiBmYWxzZVxuICB9KTtcbn1cbmRlZmluZVN3aXRjaFNldCh7XG4gIGZpZWxkOiAnbG9ja2VkJyxcbiAgb3ZlcnJpZGVGaWVsZDogZnVuY3Rpb24gb3ZlcnJpZGVGaWVsZChlbGUpIHtcbiAgICByZXR1cm4gZWxlLmN5KCkuYXV0b2xvY2soKSA/IHRydWUgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIG9uOiAnbG9jaycsXG4gIG9mZjogJ3VubG9jaydcbn0pO1xuZGVmaW5lU3dpdGNoU2V0KHtcbiAgZmllbGQ6ICdncmFiYmFibGUnLFxuICBvdmVycmlkZUZpZWxkOiBmdW5jdGlvbiBvdmVycmlkZUZpZWxkKGVsZSkge1xuICAgIHJldHVybiBlbGUuY3koKS5hdXRvdW5ncmFiaWZ5KCkgfHwgZWxlLnBhbm5hYmxlKCkgPyBmYWxzZSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgb246ICdncmFiaWZ5JyxcbiAgb2ZmOiAndW5ncmFiaWZ5J1xufSk7XG5kZWZpbmVTd2l0Y2hTZXQoe1xuICBmaWVsZDogJ3NlbGVjdGVkJyxcbiAgYWJsZUZpZWxkOiAnc2VsZWN0YWJsZScsXG4gIG92ZXJyaWRlQWJsZTogZnVuY3Rpb24gb3ZlcnJpZGVBYmxlKGVsZSkge1xuICAgIHJldHVybiBlbGUuY3koKS5hdXRvdW5zZWxlY3RpZnkoKSA/IGZhbHNlIDogdW5kZWZpbmVkO1xuICB9LFxuICBvbjogJ3NlbGVjdCcsXG4gIG9mZjogJ3Vuc2VsZWN0J1xufSk7XG5kZWZpbmVTd2l0Y2hTZXQoe1xuICBmaWVsZDogJ3NlbGVjdGFibGUnLFxuICBvdmVycmlkZUZpZWxkOiBmdW5jdGlvbiBvdmVycmlkZUZpZWxkKGVsZSkge1xuICAgIHJldHVybiBlbGUuY3koKS5hdXRvdW5zZWxlY3RpZnkoKSA/IGZhbHNlIDogdW5kZWZpbmVkO1xuICB9LFxuICBvbjogJ3NlbGVjdGlmeScsXG4gIG9mZjogJ3Vuc2VsZWN0aWZ5J1xufSk7XG5lbGVzZm4kMy5kZXNlbGVjdCA9IGVsZXNmbiQzLnVuc2VsZWN0O1xuZWxlc2ZuJDMuZ3JhYmJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIGlmIChlbGUpIHtcbiAgICByZXR1cm4gZWxlLl9wcml2YXRlLmdyYWJiZWQ7XG4gIH1cbn07XG5kZWZpbmVTd2l0Y2hTZXQoe1xuICBmaWVsZDogJ2FjdGl2ZScsXG4gIG9uOiAnYWN0aXZhdGUnLFxuICBvZmY6ICd1bmFjdGl2YXRlJ1xufSk7XG5kZWZpbmVTd2l0Y2hTZXQoe1xuICBmaWVsZDogJ3Bhbm5hYmxlJyxcbiAgb246ICdwYW5pZnknLFxuICBvZmY6ICd1bnBhbmlmeSdcbn0pO1xuZWxlc2ZuJDMuaW5hY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICBpZiAoZWxlKSB7XG4gICAgcmV0dXJuICFlbGUuX3ByaXZhdGUuYWN0aXZlO1xuICB9XG59O1xuXG52YXIgZWxlc2ZuJDIgPSB7fTtcblxuLy8gREFHIGZ1bmN0aW9uc1xuLy8vLy8vLy8vLy8vLy8vL1xuXG52YXIgZGVmaW5lRGFnRXh0cmVtaXR5ID0gZnVuY3Rpb24gZGVmaW5lRGFnRXh0cmVtaXR5KHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24gZGFnRXh0cmVtaXR5SW1wbChzZWxlY3Rvcikge1xuICAgIHZhciBlbGVzID0gdGhpcztcbiAgICB2YXIgcmV0ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgIGlmICghZWxlLmlzTm9kZSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGRpc3F1YWxpZmllZCA9IGZhbHNlO1xuICAgICAgdmFyIGVkZ2VzID0gZWxlLmNvbm5lY3RlZEVkZ2VzKCk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVkZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlZGdlID0gZWRnZXNbal07XG4gICAgICAgIHZhciBzcmMgPSBlZGdlLnNvdXJjZSgpO1xuICAgICAgICB2YXIgdGd0ID0gZWRnZS50YXJnZXQoKTtcbiAgICAgICAgaWYgKHBhcmFtcy5ub0luY29taW5nRWRnZXMgJiYgdGd0ID09PSBlbGUgJiYgc3JjICE9PSBlbGUgfHwgcGFyYW1zLm5vT3V0Z29pbmdFZGdlcyAmJiBzcmMgPT09IGVsZSAmJiB0Z3QgIT09IGVsZSkge1xuICAgICAgICAgIGRpc3F1YWxpZmllZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZGlzcXVhbGlmaWVkKSB7XG4gICAgICAgIHJldC5wdXNoKGVsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKHJldCwgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfTtcbn07XG52YXIgZGVmaW5lRGFnT25lSG9wID0gZnVuY3Rpb24gZGVmaW5lRGFnT25lSG9wKHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZXMgPSB0aGlzO1xuICAgIHZhciBvRWxlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICBpZiAoIWVsZS5pc05vZGUoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBlZGdlcyA9IGVsZS5jb25uZWN0ZWRFZGdlcygpO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlZGdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZWRnZSA9IGVkZ2VzW2pdO1xuICAgICAgICB2YXIgc3JjID0gZWRnZS5zb3VyY2UoKTtcbiAgICAgICAgdmFyIHRndCA9IGVkZ2UudGFyZ2V0KCk7XG4gICAgICAgIGlmIChwYXJhbXMub3V0Z29pbmcgJiYgc3JjID09PSBlbGUpIHtcbiAgICAgICAgICBvRWxlcy5wdXNoKGVkZ2UpO1xuICAgICAgICAgIG9FbGVzLnB1c2godGd0KTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMuaW5jb21pbmcgJiYgdGd0ID09PSBlbGUpIHtcbiAgICAgICAgICBvRWxlcy5wdXNoKGVkZ2UpO1xuICAgICAgICAgIG9FbGVzLnB1c2goc3JjKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bihvRWxlcywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfTtcbn07XG52YXIgZGVmaW5lRGFnQWxsSG9wcyA9IGZ1bmN0aW9uIGRlZmluZURhZ0FsbEhvcHMocGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgdmFyIHNFbGVzID0gW107XG4gICAgdmFyIHNFbGVzSWRzID0ge307XG4gICAgZm9yICg7Oykge1xuICAgICAgdmFyIG5leHQgPSBwYXJhbXMub3V0Z29pbmcgPyBlbGVzLm91dGdvZXJzKCkgOiBlbGVzLmluY29tZXJzKCk7XG4gICAgICBpZiAobmV4dC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIGRvbmUgaWYgbm9uZSBsZWZ0XG5cbiAgICAgIHZhciBuZXdOZXh0ID0gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5leHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG4gPSBuZXh0W2ldO1xuICAgICAgICB2YXIgbmlkID0gbi5pZCgpO1xuICAgICAgICBpZiAoIXNFbGVzSWRzW25pZF0pIHtcbiAgICAgICAgICBzRWxlc0lkc1tuaWRdID0gdHJ1ZTtcbiAgICAgICAgICBzRWxlcy5wdXNoKG4pO1xuICAgICAgICAgIG5ld05leHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIW5ld05leHQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIGRvbmUgaWYgdG91Y2hlZCBhbGwgb3V0Z29lcnMgYWxyZWFkeVxuXG4gICAgICBlbGVzID0gbmV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3Bhd24oc0VsZXMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH07XG59O1xuZWxlc2ZuJDIuY2xlYXJUcmF2ZXJzYWxDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpc1tpXS5fcHJpdmF0ZS50cmF2ZXJzYWxDYWNoZSA9IG51bGw7XG4gIH1cbn07XG5leHRlbmQoZWxlc2ZuJDIsIHtcbiAgLy8gZ2V0IHRoZSByb290IG5vZGVzIGluIHRoZSBEQUdcbiAgcm9vdHM6IGRlZmluZURhZ0V4dHJlbWl0eSh7XG4gICAgbm9JbmNvbWluZ0VkZ2VzOiB0cnVlXG4gIH0pLFxuICAvLyBnZXQgdGhlIGxlYWYgbm9kZXMgaW4gdGhlIERBR1xuICBsZWF2ZXM6IGRlZmluZURhZ0V4dHJlbWl0eSh7XG4gICAgbm9PdXRnb2luZ0VkZ2VzOiB0cnVlXG4gIH0pLFxuICAvLyBub3JtYWxseSBjYWxsZWQgY2hpbGRyZW4gaW4gZ3JhcGggdGhlb3J5XG4gIC8vIHRoZXNlIG5vZGVzID1lZGdlcz0+IG91dGdvaW5nIG5vZGVzXG4gIG91dGdvZXJzOiBjYWNoZShkZWZpbmVEYWdPbmVIb3Aoe1xuICAgIG91dGdvaW5nOiB0cnVlXG4gIH0pLCAnb3V0Z29lcnMnKSxcbiAgLy8gYWthIERBRyBkZXNjZW5kYW50c1xuICBzdWNjZXNzb3JzOiBkZWZpbmVEYWdBbGxIb3BzKHtcbiAgICBvdXRnb2luZzogdHJ1ZVxuICB9KSxcbiAgLy8gbm9ybWFsbHkgY2FsbGVkIHBhcmVudHMgaW4gZ3JhcGggdGhlb3J5XG4gIC8vIHRoZXNlIG5vZGVzIDw9ZWRnZXM9IGluY29taW5nIG5vZGVzXG4gIGluY29tZXJzOiBjYWNoZShkZWZpbmVEYWdPbmVIb3Aoe1xuICAgIGluY29taW5nOiB0cnVlXG4gIH0pLCAnaW5jb21lcnMnKSxcbiAgLy8gYWthIERBRyBhbmNlc3RvcnNcbiAgcHJlZGVjZXNzb3JzOiBkZWZpbmVEYWdBbGxIb3BzKHtcbiAgICBpbmNvbWluZzogdHJ1ZVxuICB9KVxufSk7XG5cbi8vIE5laWdoYm91cmhvb2QgZnVuY3Rpb25zXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5leHRlbmQoZWxlc2ZuJDIsIHtcbiAgbmVpZ2hib3Job29kOiBjYWNoZShmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gZm9yIGFsbCBub2Rlc1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIHZhciBjb25uZWN0ZWRFZGdlcyA9IG5vZGUuY29ubmVjdGVkRWRnZXMoKTtcblxuICAgICAgLy8gZm9yIGVhY2ggY29ubmVjdGVkIGVkZ2UsIGFkZCB0aGUgZWRnZSBhbmQgdGhlIG90aGVyIG5vZGVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29ubmVjdGVkRWRnZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBjb25uZWN0ZWRFZGdlc1tqXTtcbiAgICAgICAgdmFyIHNyYyA9IGVkZ2Uuc291cmNlKCk7XG4gICAgICAgIHZhciB0Z3QgPSBlZGdlLnRhcmdldCgpO1xuICAgICAgICB2YXIgb3RoZXJOb2RlID0gbm9kZSA9PT0gc3JjID8gdGd0IDogc3JjO1xuXG4gICAgICAgIC8vIG5lZWQgY2hlY2sgaW4gY2FzZSBvZiBsb29wXG4gICAgICAgIGlmIChvdGhlck5vZGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2gob3RoZXJOb2RlWzBdKTsgLy8gYWRkIG5vZGUgMSBob3AgYXdheVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIGNvbm5lY3RlZCBlZGdlXG4gICAgICAgIGVsZW1lbnRzLnB1c2goZWRnZVswXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKGVsZW1lbnRzLCB0cnVlKS5maWx0ZXIoc2VsZWN0b3IpO1xuICB9LCAnbmVpZ2hib3Job29kJyksXG4gIGNsb3NlZE5laWdoYm9yaG9vZDogZnVuY3Rpb24gY2xvc2VkTmVpZ2hib3Job29kKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMubmVpZ2hib3Job29kKCkuYWRkKHRoaXMpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sXG4gIG9wZW5OZWlnaGJvcmhvb2Q6IGZ1bmN0aW9uIG9wZW5OZWlnaGJvcmhvb2Qoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5uZWlnaGJvcmhvb2Qoc2VsZWN0b3IpO1xuICB9XG59KTtcblxuLy8gYWxpYXNlc1xuZWxlc2ZuJDIubmVpZ2hib3VyaG9vZCA9IGVsZXNmbiQyLm5laWdoYm9yaG9vZDtcbmVsZXNmbiQyLmNsb3NlZE5laWdoYm91cmhvb2QgPSBlbGVzZm4kMi5jbG9zZWROZWlnaGJvcmhvb2Q7XG5lbGVzZm4kMi5vcGVuTmVpZ2hib3VyaG9vZCA9IGVsZXNmbiQyLm9wZW5OZWlnaGJvcmhvb2Q7XG5cbi8vIEVkZ2UgZnVuY3Rpb25zXG4vLy8vLy8vLy8vLy8vLy8vL1xuXG5leHRlbmQoZWxlc2ZuJDIsIHtcbiAgc291cmNlOiBjYWNoZShmdW5jdGlvbiBzb3VyY2VJbXBsKHNlbGVjdG9yKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgdmFyIHNyYztcbiAgICBpZiAoZWxlKSB7XG4gICAgICBzcmMgPSBlbGUuX3ByaXZhdGUuc291cmNlIHx8IGVsZS5jeSgpLmNvbGxlY3Rpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIHNyYyAmJiBzZWxlY3RvciA/IHNyYy5maWx0ZXIoc2VsZWN0b3IpIDogc3JjO1xuICB9LCAnc291cmNlJyksXG4gIHRhcmdldDogY2FjaGUoZnVuY3Rpb24gdGFyZ2V0SW1wbChzZWxlY3Rvcikge1xuICAgIHZhciBlbGUgPSB0aGlzWzBdO1xuICAgIHZhciB0Z3Q7XG4gICAgaWYgKGVsZSkge1xuICAgICAgdGd0ID0gZWxlLl9wcml2YXRlLnRhcmdldCB8fCBlbGUuY3koKS5jb2xsZWN0aW9uKCk7XG4gICAgfVxuICAgIHJldHVybiB0Z3QgJiYgc2VsZWN0b3IgPyB0Z3QuZmlsdGVyKHNlbGVjdG9yKSA6IHRndDtcbiAgfSwgJ3RhcmdldCcpLFxuICBzb3VyY2VzOiBkZWZpbmVTb3VyY2VGdW5jdGlvbih7XG4gICAgYXR0cjogJ3NvdXJjZSdcbiAgfSksXG4gIHRhcmdldHM6IGRlZmluZVNvdXJjZUZ1bmN0aW9uKHtcbiAgICBhdHRyOiAndGFyZ2V0J1xuICB9KVxufSk7XG5mdW5jdGlvbiBkZWZpbmVTb3VyY2VGdW5jdGlvbihwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNvdXJjZUltcGwoc2VsZWN0b3IpIHtcbiAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsZSA9IHRoaXNbaV07XG4gICAgICB2YXIgc3JjID0gZWxlLl9wcml2YXRlW3BhcmFtcy5hdHRyXTtcbiAgICAgIGlmIChzcmMpIHtcbiAgICAgICAgc291cmNlcy5wdXNoKHNyYyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKHNvdXJjZXMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH07XG59XG5leHRlbmQoZWxlc2ZuJDIsIHtcbiAgZWRnZXNXaXRoOiBjYWNoZShkZWZpbmVFZGdlc1dpdGhGdW5jdGlvbigpLCAnZWRnZXNXaXRoJyksXG4gIGVkZ2VzVG86IGNhY2hlKGRlZmluZUVkZ2VzV2l0aEZ1bmN0aW9uKHtcbiAgICB0aGlzSXNTcmM6IHRydWVcbiAgfSksICdlZGdlc1RvJylcbn0pO1xuZnVuY3Rpb24gZGVmaW5lRWRnZXNXaXRoRnVuY3Rpb24ocGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbiBlZGdlc1dpdGhJbXBsKG90aGVyTm9kZXMpIHtcbiAgICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICAgIHZhciBwID0gcGFyYW1zIHx8IHt9O1xuXG4gICAgLy8gZ2V0IGVsZW1lbnRzIGlmIGEgc2VsZWN0b3IgaXMgc3BlY2lmaWVkXG4gICAgaWYgKHN0cmluZyhvdGhlck5vZGVzKSkge1xuICAgICAgb3RoZXJOb2RlcyA9IGN5LiQob3RoZXJOb2Rlcyk7XG4gICAgfVxuICAgIGZvciAodmFyIGggPSAwOyBoIDwgb3RoZXJOb2Rlcy5sZW5ndGg7IGgrKykge1xuICAgICAgdmFyIGVkZ2VzID0gb3RoZXJOb2Rlc1toXS5fcHJpdmF0ZS5lZGdlcztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcbiAgICAgICAgdmFyIGVkZ2VEYXRhID0gZWRnZS5fcHJpdmF0ZS5kYXRhO1xuICAgICAgICB2YXIgdGhpc1RvT3RoZXIgPSB0aGlzLmhhc0VsZW1lbnRXaXRoSWQoZWRnZURhdGEuc291cmNlKSAmJiBvdGhlck5vZGVzLmhhc0VsZW1lbnRXaXRoSWQoZWRnZURhdGEudGFyZ2V0KTtcbiAgICAgICAgdmFyIG90aGVyVG9UaGlzID0gb3RoZXJOb2Rlcy5oYXNFbGVtZW50V2l0aElkKGVkZ2VEYXRhLnNvdXJjZSkgJiYgdGhpcy5oYXNFbGVtZW50V2l0aElkKGVkZ2VEYXRhLnRhcmdldCk7XG4gICAgICAgIHZhciBlZGdlQ29ubmVjdHNUaGlzQW5kT3RoZXIgPSB0aGlzVG9PdGhlciB8fCBvdGhlclRvVGhpcztcbiAgICAgICAgaWYgKCFlZGdlQ29ubmVjdHNUaGlzQW5kT3RoZXIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocC50aGlzSXNTcmMgfHwgcC50aGlzSXNUZ3QpIHtcbiAgICAgICAgICBpZiAocC50aGlzSXNTcmMgJiYgIXRoaXNUb090aGVyKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHAudGhpc0lzVGd0ICYmICFvdGhlclRvVGhpcykge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzLnB1c2goZWRnZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKGVsZW1lbnRzLCB0cnVlKTtcbiAgfTtcbn1cbmV4dGVuZChlbGVzZm4kMiwge1xuICBjb25uZWN0ZWRFZGdlczogY2FjaGUoZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgdmFyIHJldEVsZXMgPSBbXTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IGVsZXNbaV07XG4gICAgICBpZiAoIW5vZGUuaXNOb2RlKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgZWRnZXMgPSBub2RlLl9wcml2YXRlLmVkZ2VzO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlZGdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZWRnZSA9IGVkZ2VzW2pdO1xuICAgICAgICByZXRFbGVzLnB1c2goZWRnZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKHJldEVsZXMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sICdjb25uZWN0ZWRFZGdlcycpLFxuICBjb25uZWN0ZWROb2RlczogY2FjaGUoZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgdmFyIHJldEVsZXMgPSBbXTtcbiAgICB2YXIgZWxlcyA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWRnZSA9IGVsZXNbaV07XG4gICAgICBpZiAoIWVkZ2UuaXNFZGdlKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXRFbGVzLnB1c2goZWRnZS5zb3VyY2UoKVswXSk7XG4gICAgICByZXRFbGVzLnB1c2goZWRnZS50YXJnZXQoKVswXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwYXduKHJldEVsZXMsIHRydWUpLmZpbHRlcihzZWxlY3Rvcik7XG4gIH0sICdjb25uZWN0ZWROb2RlcycpLFxuICBwYXJhbGxlbEVkZ2VzOiBjYWNoZShkZWZpbmVQYXJhbGxlbEVkZ2VzRnVuY3Rpb24oKSwgJ3BhcmFsbGVsRWRnZXMnKSxcbiAgY29kaXJlY3RlZEVkZ2VzOiBjYWNoZShkZWZpbmVQYXJhbGxlbEVkZ2VzRnVuY3Rpb24oe1xuICAgIGNvZGlyZWN0ZWQ6IHRydWVcbiAgfSksICdjb2RpcmVjdGVkRWRnZXMnKVxufSk7XG5mdW5jdGlvbiBkZWZpbmVQYXJhbGxlbEVkZ2VzRnVuY3Rpb24ocGFyYW1zKSB7XG4gIHZhciBkZWZhdWx0cyA9IHtcbiAgICBjb2RpcmVjdGVkOiBmYWxzZVxuICB9O1xuICBwYXJhbXMgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBwYXJhbXMpO1xuICByZXR1cm4gZnVuY3Rpb24gcGFyYWxsZWxFZGdlc0ltcGwoc2VsZWN0b3IpIHtcbiAgICAvLyBtaWNyby1vcHRpbWlzZWQgZm9yIHJlbmRlcmVyXG4gICAgdmFyIGVsZW1lbnRzID0gW107XG4gICAgdmFyIGVkZ2VzID0gdGhpcy5lZGdlcygpO1xuICAgIHZhciBwID0gcGFyYW1zO1xuXG4gICAgLy8gbG9vayBhdCBhbGwgdGhlIGVkZ2VzIGluIHRoZSBjb2xsZWN0aW9uXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVkZ2UxID0gZWRnZXNbaV07XG4gICAgICB2YXIgZWRnZTFfcCA9IGVkZ2UxLl9wcml2YXRlO1xuICAgICAgdmFyIHNyYzEgPSBlZGdlMV9wLnNvdXJjZTtcbiAgICAgIHZhciBzcmNpZDEgPSBzcmMxLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgICB2YXIgdGd0aWQxID0gZWRnZTFfcC5kYXRhLnRhcmdldDtcbiAgICAgIHZhciBzcmNFZGdlczEgPSBzcmMxLl9wcml2YXRlLmVkZ2VzO1xuXG4gICAgICAvLyBsb29rIGF0IGVkZ2VzIGNvbm5lY3RlZCB0byB0aGUgc3JjIG5vZGUgb2YgdGhpcyBlZGdlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNyY0VkZ2VzMS5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZWRnZTIgPSBzcmNFZGdlczFbal07XG4gICAgICAgIHZhciBlZGdlMmRhdGEgPSBlZGdlMi5fcHJpdmF0ZS5kYXRhO1xuICAgICAgICB2YXIgdGd0aWQyID0gZWRnZTJkYXRhLnRhcmdldDtcbiAgICAgICAgdmFyIHNyY2lkMiA9IGVkZ2UyZGF0YS5zb3VyY2U7XG4gICAgICAgIHZhciBjb2RpcmVjdGVkID0gdGd0aWQyID09PSB0Z3RpZDEgJiYgc3JjaWQyID09PSBzcmNpZDE7XG4gICAgICAgIHZhciBvcHBkaXJlY3RlZCA9IHNyY2lkMSA9PT0gdGd0aWQyICYmIHRndGlkMSA9PT0gc3JjaWQyO1xuICAgICAgICBpZiAocC5jb2RpcmVjdGVkICYmIGNvZGlyZWN0ZWQgfHwgIXAuY29kaXJlY3RlZCAmJiAoY29kaXJlY3RlZCB8fCBvcHBkaXJlY3RlZCkpIHtcbiAgICAgICAgICBlbGVtZW50cy5wdXNoKGVkZ2UyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGF3bihlbGVtZW50cywgdHJ1ZSkuZmlsdGVyKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuLy8gTWlzYyBmdW5jdGlvbnNcbi8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4dGVuZChlbGVzZm4kMiwge1xuICBjb21wb25lbnRzOiBmdW5jdGlvbiBjb21wb25lbnRzKHJvb3QpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGN5ID0gc2VsZi5jeSgpO1xuICAgIHZhciB2aXNpdGVkID0gY3kuY29sbGVjdGlvbigpO1xuICAgIHZhciB1bnZpc2l0ZWQgPSByb290ID09IG51bGwgPyBzZWxmLm5vZGVzKCkgOiByb290Lm5vZGVzKCk7XG4gICAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgICBpZiAocm9vdCAhPSBudWxsICYmIHVudmlzaXRlZC5lbXB0eSgpKSB7XG4gICAgICAvLyByb290IG1heSBjb250YWluIG9ubHkgZWRnZXNcbiAgICAgIHVudmlzaXRlZCA9IHJvb3Quc291cmNlcygpOyAvLyBkb2Vzbid0IG1hdHRlciB3aGljaCBub2RlIHRvIHVzZSAodW5kaXJlY3RlZCksIHNvIGp1c3QgdXNlIHRoZSBzb3VyY2Ugc2lkZXNcbiAgICB9XG5cbiAgICB2YXIgdmlzaXRJbkNvbXBvbmVudCA9IGZ1bmN0aW9uIHZpc2l0SW5Db21wb25lbnQobm9kZSwgY29tcG9uZW50KSB7XG4gICAgICB2aXNpdGVkLm1lcmdlKG5vZGUpO1xuICAgICAgdW52aXNpdGVkLnVubWVyZ2Uobm9kZSk7XG4gICAgICBjb21wb25lbnQubWVyZ2Uobm9kZSk7XG4gICAgfTtcbiAgICBpZiAodW52aXNpdGVkLmVtcHR5KCkpIHtcbiAgICAgIHJldHVybiBzZWxmLnNwYXduKCk7XG4gICAgfVxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgICAgLy8gZWFjaCBpdGVyYXRpb24geWllbGRzIGEgY29tcG9uZW50XG4gICAgICB2YXIgY21wdCA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgIGNvbXBvbmVudHMucHVzaChjbXB0KTtcbiAgICAgIHZhciByb290ID0gdW52aXNpdGVkWzBdO1xuICAgICAgdmlzaXRJbkNvbXBvbmVudChyb290LCBjbXB0KTtcbiAgICAgIHNlbGYuYmZzKHtcbiAgICAgICAgZGlyZWN0ZWQ6IGZhbHNlLFxuICAgICAgICByb290czogcm9vdCxcbiAgICAgICAgdmlzaXQ6IGZ1bmN0aW9uIHZpc2l0KHYpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRJbkNvbXBvbmVudCh2LCBjbXB0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjbXB0LmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgbm9kZS5jb25uZWN0ZWRFZGdlcygpLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAvLyBjb25uZWN0ZWRFZGdlcygpIHVzdWFsbHkgY2FjaGVkXG4gICAgICAgICAgaWYgKHNlbGYuaGFzKGUpICYmIGNtcHQuaGFzKGUuc291cmNlKCkpICYmIGNtcHQuaGFzKGUudGFyZ2V0KCkpKSB7XG4gICAgICAgICAgICAvLyBoYXMoKSBpcyBjaGVhcFxuICAgICAgICAgICAgY21wdC5tZXJnZShlKTsgLy8gZm9yRWFjaCgpIG9ubHkgY29uc2lkZXJzIG5vZGVzIC0tIHNldHMgTiBhdCBjYWxsIHRpbWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBkbyB7XG4gICAgICBfbG9vcCgpO1xuICAgIH0gd2hpbGUgKHVudmlzaXRlZC5sZW5ndGggPiAwKTtcbiAgICByZXR1cm4gY29tcG9uZW50cztcbiAgfSxcbiAgY29tcG9uZW50OiBmdW5jdGlvbiBjb21wb25lbnQoKSB7XG4gICAgdmFyIGVsZSA9IHRoaXNbMF07XG4gICAgcmV0dXJuIGVsZS5jeSgpLm11dGFibGVFbGVtZW50cygpLmNvbXBvbmVudHMoZWxlKVswXTtcbiAgfVxufSk7XG5lbGVzZm4kMi5jb21wb25lbnRzT2YgPSBlbGVzZm4kMi5jb21wb25lbnRzO1xuXG4vLyByZXByZXNlbnRzIGEgc2V0IG9mIG5vZGVzLCBlZGdlcywgb3IgYm90aCB0b2dldGhlclxudmFyIENvbGxlY3Rpb24gPSBmdW5jdGlvbiBDb2xsZWN0aW9uKGN5LCBlbGVtZW50cykge1xuICB2YXIgdW5pcXVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgdmFyIHJlbW92ZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuICBpZiAoY3kgPT09IHVuZGVmaW5lZCkge1xuICAgIGVycm9yKCdBIGNvbGxlY3Rpb24gbXVzdCBoYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBjb3JlJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXAgPSBuZXcgTWFwJDIoKTtcbiAgdmFyIGNyZWF0ZWRFbGVtZW50cyA9IGZhbHNlO1xuICBpZiAoIWVsZW1lbnRzKSB7XG4gICAgZWxlbWVudHMgPSBbXTtcbiAgfSBlbHNlIGlmIChlbGVtZW50cy5sZW5ndGggPiAwICYmIHBsYWluT2JqZWN0KGVsZW1lbnRzWzBdKSAmJiAhZWxlbWVudChlbGVtZW50c1swXSkpIHtcbiAgICBjcmVhdGVkRWxlbWVudHMgPSB0cnVlO1xuXG4gICAgLy8gbWFrZSBlbGVtZW50cyBmcm9tIGpzb24gYW5kIHJlc3RvcmUgYWxsIGF0IG9uY2UgbGF0ZXJcbiAgICB2YXIgZWxlcyA9IFtdO1xuICAgIHZhciBlbGVzSWRzID0gbmV3IFNldCQxKCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBqc29uID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoanNvbi5kYXRhID09IG51bGwpIHtcbiAgICAgICAganNvbi5kYXRhID0ge307XG4gICAgICB9XG4gICAgICB2YXIgX2RhdGEgPSBqc29uLmRhdGE7XG5cbiAgICAgIC8vIG1ha2Ugc3VyZSBuZXdseSBjcmVhdGVkIGVsZW1lbnRzIGhhdmUgdmFsaWQgaWRzXG4gICAgICBpZiAoX2RhdGEuaWQgPT0gbnVsbCkge1xuICAgICAgICBfZGF0YS5pZCA9IHV1aWQoKTtcbiAgICAgIH0gZWxzZSBpZiAoY3kuaGFzRWxlbWVudFdpdGhJZChfZGF0YS5pZCkgfHwgZWxlc0lkcy5oYXMoX2RhdGEuaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBjYW4ndCBjcmVhdGUgZWxlbWVudCBpZiBwcmlvciBpZCBhbHJlYWR5IGV4aXN0c1xuICAgICAgfVxuXG4gICAgICB2YXIgZWxlID0gbmV3IEVsZW1lbnQoY3ksIGpzb24sIGZhbHNlKTtcbiAgICAgIGVsZXMucHVzaChlbGUpO1xuICAgICAgZWxlc0lkcy5hZGQoX2RhdGEuaWQpO1xuICAgIH1cbiAgICBlbGVtZW50cyA9IGVsZXM7XG4gIH1cbiAgdGhpcy5sZW5ndGggPSAwO1xuICBmb3IgKHZhciBfaSA9IDAsIF9sID0gZWxlbWVudHMubGVuZ3RoOyBfaSA8IF9sOyBfaSsrKSB7XG4gICAgdmFyIGVsZW1lbnQkMSA9IGVsZW1lbnRzW19pXVswXTsgLy8gWzBdIGluIGNhc2UgZWxlbWVudHMgaXMgYW4gYXJyYXkgb2YgY29sbGVjdGlvbnMsIHJhdGhlciB0aGFuIGFycmF5IG9mIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnQkMSA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGlkID0gZWxlbWVudCQxLl9wcml2YXRlLmRhdGEuaWQ7XG4gICAgaWYgKCF1bmlxdWUgfHwgIW1hcC5oYXMoaWQpKSB7XG4gICAgICBpZiAodW5pcXVlKSB7XG4gICAgICAgIG1hcC5zZXQoaWQsIHtcbiAgICAgICAgICBpbmRleDogdGhpcy5sZW5ndGgsXG4gICAgICAgICAgZWxlOiBlbGVtZW50JDFcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzW3RoaXMubGVuZ3RoXSA9IGVsZW1lbnQkMTtcbiAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgfVxuICB9XG4gIHRoaXMuX3ByaXZhdGUgPSB7XG4gICAgZWxlczogdGhpcyxcbiAgICBjeTogY3ksXG4gICAgZ2V0IG1hcCgpIHtcbiAgICAgIGlmICh0aGlzLmxhenlNYXAgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlYnVpbGRNYXAoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmxhenlNYXA7XG4gICAgfSxcbiAgICBzZXQgbWFwKG0pIHtcbiAgICAgIHRoaXMubGF6eU1hcCA9IG07XG4gICAgfSxcbiAgICByZWJ1aWxkTWFwOiBmdW5jdGlvbiByZWJ1aWxkTWFwKCkge1xuICAgICAgdmFyIG0gPSB0aGlzLmxhenlNYXAgPSBuZXcgTWFwJDIoKTtcbiAgICAgIHZhciBlbGVzID0gdGhpcy5lbGVzO1xuICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgZWxlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIHZhciBfZWxlID0gZWxlc1tfaTJdO1xuICAgICAgICBtLnNldChfZWxlLmlkKCksIHtcbiAgICAgICAgICBpbmRleDogX2kyLFxuICAgICAgICAgIGVsZTogX2VsZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGlmICh1bmlxdWUpIHtcbiAgICB0aGlzLl9wcml2YXRlLm1hcCA9IG1hcDtcbiAgfVxuXG4gIC8vIHJlc3RvcmUgdGhlIGVsZW1lbnRzIGlmIHdlIGNyZWF0ZWQgdGhlbSBmcm9tIGpzb25cbiAgaWYgKGNyZWF0ZWRFbGVtZW50cyAmJiAhcmVtb3ZlZCkge1xuICAgIHRoaXMucmVzdG9yZSgpO1xuICB9XG59O1xuXG4vLyBGdW5jdGlvbnNcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLy8ga2VlcCB0aGUgcHJvdG90eXBlcyBpbiBzeW5jIChhbiBlbGVtZW50IGhhcyB0aGUgc2FtZSBmdW5jdGlvbnMgYXMgYSBjb2xsZWN0aW9uKVxuLy8gYW5kIHVzZSBlbGVmbiBhbmQgZWxlc2ZuIGFzIHNob3J0aGFuZHMgdG8gdGhlIHByb3RvdHlwZXNcbnZhciBlbGVzZm4kMSA9IEVsZW1lbnQucHJvdG90eXBlID0gQ29sbGVjdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEFycmF5LnByb3RvdHlwZSk7XG5lbGVzZm4kMS5pbnN0YW5jZVN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdjb2xsZWN0aW9uJztcbn07XG5lbGVzZm4kMS5zcGF3biA9IGZ1bmN0aW9uIChlbGVzLCB1bmlxdWUpIHtcbiAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKHRoaXMuY3koKSwgZWxlcywgdW5pcXVlKTtcbn07XG5lbGVzZm4kMS5zcGF3blNlbGYgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnNwYXduKHRoaXMpO1xufTtcbmVsZXNmbiQxLmN5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5jeTtcbn07XG5lbGVzZm4kMS5yZW5kZXJlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuY3kucmVuZGVyZXIoKTtcbn07XG5lbGVzZm4kMS5lbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpc1swXTtcbn07XG5lbGVzZm4kMS5jb2xsZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICBpZiAoY29sbGVjdGlvbih0aGlzKSkge1xuICAgIHJldHVybiB0aGlzO1xuICB9IGVsc2Uge1xuICAgIC8vIGFuIGVsZW1lbnRcbiAgICByZXR1cm4gbmV3IENvbGxlY3Rpb24odGhpcy5fcHJpdmF0ZS5jeSwgW3RoaXNdKTtcbiAgfVxufTtcbmVsZXNmbiQxLnVuaXF1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKHRoaXMuX3ByaXZhdGUuY3ksIHRoaXMsIHRydWUpO1xufTtcbmVsZXNmbiQxLmhhc0VsZW1lbnRXaXRoSWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgaWQgPSAnJyArIGlkOyAvLyBpZCBtdXN0IGJlIHN0cmluZ1xuXG4gIHJldHVybiB0aGlzLl9wcml2YXRlLm1hcC5oYXMoaWQpO1xufTtcbmVsZXNmbiQxLmdldEVsZW1lbnRCeUlkID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlkID0gJycgKyBpZDsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcblxuICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICB2YXIgZW50cnkgPSB0aGlzLl9wcml2YXRlLm1hcC5nZXQoaWQpO1xuICByZXR1cm4gZW50cnkgPyBlbnRyeS5lbGUgOiBuZXcgQ29sbGVjdGlvbihjeSk7IC8vIGdldCBlbGUgb3IgZW1wdHkgY29sbGVjdGlvblxufTtcblxuZWxlc2ZuJDEuJGlkID0gZWxlc2ZuJDEuZ2V0RWxlbWVudEJ5SWQ7XG5lbGVzZm4kMS5wb29sSW5kZXggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gIHZhciBlbGVzID0gY3kuX3ByaXZhdGUuZWxlbWVudHM7XG4gIHZhciBpZCA9IHRoaXNbMF0uX3ByaXZhdGUuZGF0YS5pZDtcbiAgcmV0dXJuIGVsZXMuX3ByaXZhdGUubWFwLmdldChpZCkuaW5kZXg7XG59O1xuZWxlc2ZuJDEuaW5kZXhPZiA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdmFyIGlkID0gZWxlWzBdLl9wcml2YXRlLmRhdGEuaWQ7XG4gIHJldHVybiB0aGlzLl9wcml2YXRlLm1hcC5nZXQoaWQpLmluZGV4O1xufTtcbmVsZXNmbiQxLmluZGV4T2ZJZCA9IGZ1bmN0aW9uIChpZCkge1xuICBpZCA9ICcnICsgaWQ7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG5cbiAgcmV0dXJuIHRoaXMuX3ByaXZhdGUubWFwLmdldChpZCkuaW5kZXg7XG59O1xuZWxlc2ZuJDEuanNvbiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGVsZSA9IHRoaXMuZWxlbWVudCgpO1xuICB2YXIgY3kgPSB0aGlzLmN5KCk7XG4gIGlmIChlbGUgPT0gbnVsbCAmJiBvYmopIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSAvLyBjYW4ndCBzZXQgdG8gbm8gZWxlc1xuXG4gIGlmIChlbGUgPT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gLy8gY2FuJ3QgZ2V0IGZyb20gbm8gZWxlc1xuXG4gIHZhciBwID0gZWxlLl9wcml2YXRlO1xuICBpZiAocGxhaW5PYmplY3Qob2JqKSkge1xuICAgIC8vIHNldFxuXG4gICAgY3kuc3RhcnRCYXRjaCgpO1xuICAgIGlmIChvYmouZGF0YSkge1xuICAgICAgZWxlLmRhdGEob2JqLmRhdGEpO1xuICAgICAgdmFyIF9kYXRhMiA9IHAuZGF0YTtcbiAgICAgIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICAgICAgLy8gc291cmNlIGFuZCB0YXJnZXQgYXJlIGltbXV0YWJsZSB2aWEgZGF0YSgpXG4gICAgICAgIHZhciBtb3ZlID0gZmFsc2U7XG4gICAgICAgIHZhciBzcGVjID0ge307XG4gICAgICAgIHZhciBzcmMgPSBvYmouZGF0YS5zb3VyY2U7XG4gICAgICAgIHZhciB0Z3QgPSBvYmouZGF0YS50YXJnZXQ7XG4gICAgICAgIGlmIChzcmMgIT0gbnVsbCAmJiBzcmMgIT0gX2RhdGEyLnNvdXJjZSkge1xuICAgICAgICAgIHNwZWMuc291cmNlID0gJycgKyBzcmM7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG4gICAgICAgICAgbW92ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRndCAhPSBudWxsICYmIHRndCAhPSBfZGF0YTIudGFyZ2V0KSB7XG4gICAgICAgICAgc3BlYy50YXJnZXQgPSAnJyArIHRndDsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcbiAgICAgICAgICBtb3ZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW92ZSkge1xuICAgICAgICAgIGVsZSA9IGVsZS5tb3ZlKHNwZWMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBwYXJlbnQgaXMgaW1tdXRhYmxlIHZpYSBkYXRhKClcbiAgICAgICAgdmFyIG5ld1BhcmVudFZhbFNwZWNkID0gKCdwYXJlbnQnIGluIG9iai5kYXRhKTtcbiAgICAgICAgdmFyIHBhcmVudCA9IG9iai5kYXRhLnBhcmVudDtcbiAgICAgICAgaWYgKG5ld1BhcmVudFZhbFNwZWNkICYmIChwYXJlbnQgIT0gbnVsbCB8fCBfZGF0YTIucGFyZW50ICE9IG51bGwpICYmIHBhcmVudCAhPSBfZGF0YTIucGFyZW50KSB7XG4gICAgICAgICAgaWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBjYW4ndCBzZXQgdW5kZWZpbmVkIGltcGVyYXRpdmVseSwgc28gdXNlIG51bGxcbiAgICAgICAgICAgIHBhcmVudCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcGFyZW50ID0gJycgKyBwYXJlbnQ7IC8vIGlkIG11c3QgYmUgc3RyaW5nXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZWxlID0gZWxlLm1vdmUoe1xuICAgICAgICAgICAgcGFyZW50OiBwYXJlbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAob2JqLnBvc2l0aW9uKSB7XG4gICAgICBlbGUucG9zaXRpb24ob2JqLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBpZ25vcmUgZ3JvdXAgLS0gaW1tdXRhYmxlXG5cbiAgICB2YXIgY2hlY2tTd2l0Y2ggPSBmdW5jdGlvbiBjaGVja1N3aXRjaChrLCB0cnVlRm5OYW1lLCBmYWxzZUZuTmFtZSkge1xuICAgICAgdmFyIG9ial9rID0gb2JqW2tdO1xuICAgICAgaWYgKG9ial9rICE9IG51bGwgJiYgb2JqX2sgIT09IHBba10pIHtcbiAgICAgICAgaWYgKG9ial9rKSB7XG4gICAgICAgICAgZWxlW3RydWVGbk5hbWVdKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlW2ZhbHNlRm5OYW1lXSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBjaGVja1N3aXRjaCgncmVtb3ZlZCcsICdyZW1vdmUnLCAncmVzdG9yZScpO1xuICAgIGNoZWNrU3dpdGNoKCdzZWxlY3RlZCcsICdzZWxlY3QnLCAndW5zZWxlY3QnKTtcbiAgICBjaGVja1N3aXRjaCgnc2VsZWN0YWJsZScsICdzZWxlY3RpZnknLCAndW5zZWxlY3RpZnknKTtcbiAgICBjaGVja1N3aXRjaCgnbG9ja2VkJywgJ2xvY2snLCAndW5sb2NrJyk7XG4gICAgY2hlY2tTd2l0Y2goJ2dyYWJiYWJsZScsICdncmFiaWZ5JywgJ3VuZ3JhYmlmeScpO1xuICAgIGNoZWNrU3dpdGNoKCdwYW5uYWJsZScsICdwYW5pZnknLCAndW5wYW5pZnknKTtcbiAgICBpZiAob2JqLmNsYXNzZXMgIT0gbnVsbCkge1xuICAgICAgZWxlLmNsYXNzZXMob2JqLmNsYXNzZXMpO1xuICAgIH1cbiAgICBjeS5lbmRCYXRjaCgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9IGVsc2UgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gZ2V0XG5cbiAgICB2YXIganNvbiA9IHtcbiAgICAgIGRhdGE6IGNvcHkocC5kYXRhKSxcbiAgICAgIHBvc2l0aW9uOiBjb3B5KHAucG9zaXRpb24pLFxuICAgICAgZ3JvdXA6IHAuZ3JvdXAsXG4gICAgICByZW1vdmVkOiBwLnJlbW92ZWQsXG4gICAgICBzZWxlY3RlZDogcC5zZWxlY3RlZCxcbiAgICAgIHNlbGVjdGFibGU6IHAuc2VsZWN0YWJsZSxcbiAgICAgIGxvY2tlZDogcC5sb2NrZWQsXG4gICAgICBncmFiYmFibGU6IHAuZ3JhYmJhYmxlLFxuICAgICAgcGFubmFibGU6IHAucGFubmFibGUsXG4gICAgICBjbGFzc2VzOiBudWxsXG4gICAgfTtcbiAgICBqc29uLmNsYXNzZXMgPSAnJztcbiAgICB2YXIgaSA9IDA7XG4gICAgcC5jbGFzc2VzLmZvckVhY2goZnVuY3Rpb24gKGNscykge1xuICAgICAgcmV0dXJuIGpzb24uY2xhc3NlcyArPSBpKysgPT09IDAgPyBjbHMgOiAnICcgKyBjbHM7XG4gICAgfSk7XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbn07XG5lbGVzZm4kMS5qc29ucyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGpzb25zID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSB0aGlzW2ldO1xuICAgIHZhciBqc29uID0gZWxlLmpzb24oKTtcbiAgICBqc29ucy5wdXNoKGpzb24pO1xuICB9XG4gIHJldHVybiBqc29ucztcbn07XG5lbGVzZm4kMS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeSgpO1xuICB2YXIgZWxlc0FyciA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gdGhpc1tpXTtcbiAgICB2YXIganNvbiA9IGVsZS5qc29uKCk7XG4gICAgdmFyIGNsb25lID0gbmV3IEVsZW1lbnQoY3ksIGpzb24sIGZhbHNlKTsgLy8gTkIgbm8gcmVzdG9yZVxuXG4gICAgZWxlc0Fyci5wdXNoKGNsb25lKTtcbiAgfVxuICByZXR1cm4gbmV3IENvbGxlY3Rpb24oY3ksIGVsZXNBcnIpO1xufTtcbmVsZXNmbiQxLmNvcHkgPSBlbGVzZm4kMS5jbG9uZTtcbmVsZXNmbiQxLnJlc3RvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBub3RpZnlSZW5kZXJlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcbiAgdmFyIGFkZFRvUG9vbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY3kgPSBzZWxmLmN5KCk7XG4gIHZhciBjeV9wID0gY3kuX3ByaXZhdGU7XG5cbiAgLy8gY3JlYXRlIGFycmF5cyBvZiBub2RlcyBhbmQgZWRnZXMsIHNpbmNlIHdlIG5lZWQgdG9cbiAgLy8gcmVzdG9yZSB0aGUgbm9kZXMgZmlyc3RcbiAgdmFyIG5vZGVzID0gW107XG4gIHZhciBlZGdlcyA9IFtdO1xuICB2YXIgZWxlbWVudHM7XG4gIGZvciAodmFyIF9pMyA9IDAsIGwgPSBzZWxmLmxlbmd0aDsgX2kzIDwgbDsgX2kzKyspIHtcbiAgICB2YXIgZWxlID0gc2VsZltfaTNdO1xuICAgIGlmIChhZGRUb1Bvb2wgJiYgIWVsZS5yZW1vdmVkKCkpIHtcbiAgICAgIC8vIGRvbid0IG5lZWQgdG8gaGFuZGxlIHRoaXMgZWxlXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBrZWVwIG5vZGVzIGZpcnN0IGluIHRoZSBhcnJheSBhbmQgZWRnZXMgYWZ0ZXJcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICAvLyBwdXQgdG8gZnJvbnQgb2YgYXJyYXkgaWYgbm9kZVxuICAgICAgbm9kZXMucHVzaChlbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBwdXQgdG8gZW5kIG9mIGFycmF5IGlmIGVkZ2VcbiAgICAgIGVkZ2VzLnB1c2goZWxlKTtcbiAgICB9XG4gIH1cbiAgZWxlbWVudHMgPSBub2Rlcy5jb25jYXQoZWRnZXMpO1xuICB2YXIgaTtcbiAgdmFyIHJlbW92ZUZyb21FbGVtZW50cyA9IGZ1bmN0aW9uIHJlbW92ZUZyb21FbGVtZW50cygpIHtcbiAgICBlbGVtZW50cy5zcGxpY2UoaSwgMSk7XG4gICAgaS0tO1xuICB9O1xuXG4gIC8vIG5vdywgcmVzdG9yZSBlYWNoIGVsZW1lbnRcbiAgZm9yIChpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9lbGUyID0gZWxlbWVudHNbaV07XG4gICAgdmFyIF9wcml2YXRlID0gX2VsZTIuX3ByaXZhdGU7XG4gICAgdmFyIF9kYXRhMyA9IF9wcml2YXRlLmRhdGE7XG5cbiAgICAvLyB0aGUgdHJhdmVyc2FsIGNhY2hlIHNob3VsZCBzdGFydCBmcmVzaCB3aGVuIGVsZSBpcyBhZGRlZFxuICAgIF9lbGUyLmNsZWFyVHJhdmVyc2FsQ2FjaGUoKTtcblxuICAgIC8vIHNldCBpZCBhbmQgdmFsaWRhdGVcbiAgICBpZiAoIWFkZFRvUG9vbCAmJiAhX3ByaXZhdGUucmVtb3ZlZCkgOyBlbHNlIGlmIChfZGF0YTMuaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgX2RhdGEzLmlkID0gdXVpZCgpO1xuICAgIH0gZWxzZSBpZiAobnVtYmVyJDEoX2RhdGEzLmlkKSkge1xuICAgICAgX2RhdGEzLmlkID0gJycgKyBfZGF0YTMuaWQ7IC8vIG5vdyBpdCdzIGEgc3RyaW5nXG4gICAgfSBlbHNlIGlmIChlbXB0eVN0cmluZyhfZGF0YTMuaWQpIHx8ICFzdHJpbmcoX2RhdGEzLmlkKSkge1xuICAgICAgZXJyb3IoJ0NhbiBub3QgY3JlYXRlIGVsZW1lbnQgd2l0aCBpbnZhbGlkIHN0cmluZyBJRCBgJyArIF9kYXRhMy5pZCArICdgJyk7XG5cbiAgICAgIC8vIGNhbid0IGNyZWF0ZSBlbGVtZW50IGlmIGl0IGhhcyBlbXB0eSBzdHJpbmcgYXMgaWQgb3Igbm9uLXN0cmluZyBpZFxuICAgICAgcmVtb3ZlRnJvbUVsZW1lbnRzKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKGN5Lmhhc0VsZW1lbnRXaXRoSWQoX2RhdGEzLmlkKSkge1xuICAgICAgZXJyb3IoJ0NhbiBub3QgY3JlYXRlIHNlY29uZCBlbGVtZW50IHdpdGggSUQgYCcgKyBfZGF0YTMuaWQgKyAnYCcpO1xuXG4gICAgICAvLyBjYW4ndCBjcmVhdGUgZWxlbWVudCBpZiBvbmUgYWxyZWFkeSBoYXMgdGhhdCBpZFxuICAgICAgcmVtb3ZlRnJvbUVsZW1lbnRzKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGlkID0gX2RhdGEzLmlkOyAvLyBpZCBpcyBmaW5hbGlzZWQsIG5vdyBsZXQncyBrZWVwIGEgcmVmXG5cbiAgICBpZiAoX2VsZTIuaXNOb2RlKCkpIHtcbiAgICAgIC8vIGV4dHJhIGNoZWNrcyBmb3Igbm9kZXNcbiAgICAgIHZhciBwb3MgPSBfcHJpdmF0ZS5wb3NpdGlvbjtcblxuICAgICAgLy8gbWFrZSBzdXJlIHRoZSBub2RlcyBoYXZlIGEgZGVmaW5lZCBwb3NpdGlvblxuXG4gICAgICBpZiAocG9zLnggPT0gbnVsbCkge1xuICAgICAgICBwb3MueCA9IDA7XG4gICAgICB9XG4gICAgICBpZiAocG9zLnkgPT0gbnVsbCkge1xuICAgICAgICBwb3MueSA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChfZWxlMi5pc0VkZ2UoKSkge1xuICAgICAgLy8gZXh0cmEgY2hlY2tzIGZvciBlZGdlc1xuXG4gICAgICB2YXIgZWRnZSA9IF9lbGUyO1xuICAgICAgdmFyIGZpZWxkcyA9IFsnc291cmNlJywgJ3RhcmdldCddO1xuICAgICAgdmFyIGZpZWxkc0xlbmd0aCA9IGZpZWxkcy5sZW5ndGg7XG4gICAgICB2YXIgYmFkU291cmNlT3JUYXJnZXQgPSBmYWxzZTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZmllbGRzTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2pdO1xuICAgICAgICB2YXIgdmFsID0gX2RhdGEzW2ZpZWxkXTtcbiAgICAgICAgaWYgKG51bWJlciQxKHZhbCkpIHtcbiAgICAgICAgICB2YWwgPSBfZGF0YTNbZmllbGRdID0gJycgKyBfZGF0YTNbZmllbGRdOyAvLyBub3cgc3RyaW5nXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09PSAnJykge1xuICAgICAgICAgIC8vIGNhbid0IGNyZWF0ZSBpZiBzb3VyY2Ugb3IgdGFyZ2V0IGlzIG5vdCBkZWZpbmVkIHByb3Blcmx5XG4gICAgICAgICAgZXJyb3IoJ0NhbiBub3QgY3JlYXRlIGVkZ2UgYCcgKyBpZCArICdgIHdpdGggdW5zcGVjaWZpZWQgJyArIGZpZWxkKTtcbiAgICAgICAgICBiYWRTb3VyY2VPclRhcmdldCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIWN5Lmhhc0VsZW1lbnRXaXRoSWQodmFsKSkge1xuICAgICAgICAgIC8vIGNhbid0IGNyZWF0ZSBlZGdlIGlmIG9uZSBvZiBpdHMgbm9kZXMgZG9lc24ndCBleGlzdFxuICAgICAgICAgIGVycm9yKCdDYW4gbm90IGNyZWF0ZSBlZGdlIGAnICsgaWQgKyAnYCB3aXRoIG5vbmV4aXN0YW50ICcgKyBmaWVsZCArICcgYCcgKyB2YWwgKyAnYCcpO1xuICAgICAgICAgIGJhZFNvdXJjZU9yVGFyZ2V0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGJhZFNvdXJjZU9yVGFyZ2V0KSB7XG4gICAgICAgIHJlbW92ZUZyb21FbGVtZW50cygpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gY2FuJ3QgY3JlYXRlIHRoaXNcblxuICAgICAgdmFyIHNyYyA9IGN5LmdldEVsZW1lbnRCeUlkKF9kYXRhMy5zb3VyY2UpO1xuICAgICAgdmFyIHRndCA9IGN5LmdldEVsZW1lbnRCeUlkKF9kYXRhMy50YXJnZXQpO1xuXG4gICAgICAvLyBvbmx5IG9uZSBlZGdlIGluIG5vZGUgaWYgbG9vcFxuICAgICAgaWYgKHNyYy5zYW1lKHRndCkpIHtcbiAgICAgICAgc3JjLl9wcml2YXRlLmVkZ2VzLnB1c2goZWRnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcmMuX3ByaXZhdGUuZWRnZXMucHVzaChlZGdlKTtcbiAgICAgICAgdGd0Ll9wcml2YXRlLmVkZ2VzLnB1c2goZWRnZSk7XG4gICAgICB9XG4gICAgICBlZGdlLl9wcml2YXRlLnNvdXJjZSA9IHNyYztcbiAgICAgIGVkZ2UuX3ByaXZhdGUudGFyZ2V0ID0gdGd0O1xuICAgIH0gLy8gaWYgaXMgZWRnZVxuXG4gICAgLy8gY3JlYXRlIG1vY2sgaWRzIC8gaW5kZXhlcyBtYXBzIGZvciBlbGVtZW50IHNvIGl0IGNhbiBiZSB1c2VkIGxpa2UgY29sbGVjdGlvbnNcbiAgICBfcHJpdmF0ZS5tYXAgPSBuZXcgTWFwJDIoKTtcbiAgICBfcHJpdmF0ZS5tYXAuc2V0KGlkLCB7XG4gICAgICBlbGU6IF9lbGUyLFxuICAgICAgaW5kZXg6IDBcbiAgICB9KTtcbiAgICBfcHJpdmF0ZS5yZW1vdmVkID0gZmFsc2U7XG4gICAgaWYgKGFkZFRvUG9vbCkge1xuICAgICAgY3kuYWRkVG9Qb29sKF9lbGUyKTtcbiAgICB9XG4gIH0gLy8gZm9yIGVhY2ggZWxlbWVudFxuXG4gIC8vIGRvIGNvbXBvdW5kIG5vZGUgc2FuaXR5IGNoZWNrc1xuICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBub2Rlcy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgLy8gZWFjaCBub2RlXG4gICAgdmFyIG5vZGUgPSBub2Rlc1tfaTRdO1xuICAgIHZhciBfZGF0YTQgPSBub2RlLl9wcml2YXRlLmRhdGE7XG4gICAgaWYgKG51bWJlciQxKF9kYXRhNC5wYXJlbnQpKSB7XG4gICAgICAvLyB0aGVuIGF1dG9tYWtlIHN0cmluZ1xuICAgICAgX2RhdGE0LnBhcmVudCA9ICcnICsgX2RhdGE0LnBhcmVudDtcbiAgICB9XG4gICAgdmFyIHBhcmVudElkID0gX2RhdGE0LnBhcmVudDtcbiAgICB2YXIgc3BlY2lmaWVkUGFyZW50ID0gcGFyZW50SWQgIT0gbnVsbDtcbiAgICBpZiAoc3BlY2lmaWVkUGFyZW50IHx8IG5vZGUuX3ByaXZhdGUucGFyZW50KSB7XG4gICAgICB2YXIgcGFyZW50ID0gbm9kZS5fcHJpdmF0ZS5wYXJlbnQgPyBjeS5jb2xsZWN0aW9uKCkubWVyZ2Uobm9kZS5fcHJpdmF0ZS5wYXJlbnQpIDogY3kuZ2V0RWxlbWVudEJ5SWQocGFyZW50SWQpO1xuICAgICAgaWYgKHBhcmVudC5lbXB0eSgpKSB7XG4gICAgICAgIC8vIG5vbi1leGlzdGFudCBwYXJlbnQ7IGp1c3QgcmVtb3ZlIGl0XG4gICAgICAgIF9kYXRhNC5wYXJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2UgaWYgKHBhcmVudFswXS5yZW1vdmVkKCkpIHtcbiAgICAgICAgd2FybignTm9kZSBhZGRlZCB3aXRoIG1pc3NpbmcgcGFyZW50LCByZWZlcmVuY2UgdG8gcGFyZW50IHJlbW92ZWQnKTtcbiAgICAgICAgX2RhdGE0LnBhcmVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgbm9kZS5fcHJpdmF0ZS5wYXJlbnQgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNlbGZBc1BhcmVudCA9IGZhbHNlO1xuICAgICAgICB2YXIgYW5jZXN0b3IgPSBwYXJlbnQ7XG4gICAgICAgIHdoaWxlICghYW5jZXN0b3IuZW1wdHkoKSkge1xuICAgICAgICAgIGlmIChub2RlLnNhbWUoYW5jZXN0b3IpKSB7XG4gICAgICAgICAgICAvLyBtYXJrIHNlbGYgYXMgcGFyZW50IGFuZCByZW1vdmUgZnJvbSBkYXRhXG4gICAgICAgICAgICBzZWxmQXNQYXJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgX2RhdGE0LnBhcmVudCA9IHVuZGVmaW5lZDsgLy8gcmVtb3ZlIHBhcmVudCByZWZlcmVuY2VcblxuICAgICAgICAgICAgLy8gZXhpdCBvciB3ZSBsb29wIGZvcmV2ZXJcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2VsZkFzUGFyZW50KSB7XG4gICAgICAgICAgLy8gY29ubmVjdCB3aXRoIGNoaWxkcmVuXG4gICAgICAgICAgcGFyZW50WzBdLl9wcml2YXRlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICAgICAgbm9kZS5fcHJpdmF0ZS5wYXJlbnQgPSBwYXJlbnRbMF07XG5cbiAgICAgICAgICAvLyBsZXQgdGhlIGNvcmUga25vdyB3ZSBoYXZlIGEgY29tcG91bmQgZ3JhcGhcbiAgICAgICAgICBjeV9wLmhhc0NvbXBvdW5kTm9kZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IC8vIGVsc2VcbiAgICB9IC8vIGlmIHNwZWNpZmllZCBwYXJlbnRcbiAgfSAvLyBmb3IgZWFjaCBub2RlXG5cbiAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgcmVzdG9yZWQgPSBlbGVtZW50cy5sZW5ndGggPT09IHNlbGYubGVuZ3RoID8gc2VsZiA6IG5ldyBDb2xsZWN0aW9uKGN5LCBlbGVtZW50cyk7XG4gICAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgcmVzdG9yZWQubGVuZ3RoOyBfaTUrKykge1xuICAgICAgdmFyIF9lbGUzID0gcmVzdG9yZWRbX2k1XTtcbiAgICAgIGlmIChfZWxlMy5pc05vZGUoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkaW5nIGFuIGVkZ2UgaW52YWxpZGF0ZXMgdGhlIHRyYXZlcnNhbCBjYWNoZXMgZm9yIHRoZSBwYXJhbGxlbCBlZGdlc1xuICAgICAgX2VsZTMucGFyYWxsZWxFZGdlcygpLmNsZWFyVHJhdmVyc2FsQ2FjaGUoKTtcblxuICAgICAgLy8gYWRkaW5nIGFuIGVkZ2UgaW52YWxpZGF0ZXMgdGhlIHRyYXZlcnNhbCBjYWNoZSBmb3IgdGhlIGNvbm5lY3RlZCBub2Rlc1xuICAgICAgX2VsZTMuc291cmNlKCkuY2xlYXJUcmF2ZXJzYWxDYWNoZSgpO1xuICAgICAgX2VsZTMudGFyZ2V0KCkuY2xlYXJUcmF2ZXJzYWxDYWNoZSgpO1xuICAgIH1cbiAgICB2YXIgdG9VcGRhdGVTdHlsZTtcbiAgICBpZiAoY3lfcC5oYXNDb21wb3VuZE5vZGVzKSB7XG4gICAgICB0b1VwZGF0ZVN0eWxlID0gY3kuY29sbGVjdGlvbigpLm1lcmdlKHJlc3RvcmVkKS5tZXJnZShyZXN0b3JlZC5jb25uZWN0ZWROb2RlcygpKS5tZXJnZShyZXN0b3JlZC5wYXJlbnQoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRvVXBkYXRlU3R5bGUgPSByZXN0b3JlZDtcbiAgICB9XG4gICAgdG9VcGRhdGVTdHlsZS5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKS51cGRhdGVTdHlsZShub3RpZnlSZW5kZXJlcik7XG4gICAgaWYgKG5vdGlmeVJlbmRlcmVyKSB7XG4gICAgICByZXN0b3JlZC5lbWl0QW5kTm90aWZ5KCdhZGQnKTtcbiAgICB9IGVsc2UgaWYgKGFkZFRvUG9vbCkge1xuICAgICAgcmVzdG9yZWQuZW1pdCgnYWRkJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzZWxmOyAvLyBjaGFpbmFiaWxpdHlcbn07XG5cbmVsZXNmbiQxLnJlbW92ZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBlbGUgPSB0aGlzWzBdO1xuICByZXR1cm4gZWxlICYmIGVsZS5fcHJpdmF0ZS5yZW1vdmVkO1xufTtcbmVsZXNmbiQxLmluc2lkZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVsZSA9IHRoaXNbMF07XG4gIHJldHVybiBlbGUgJiYgIWVsZS5fcHJpdmF0ZS5yZW1vdmVkO1xufTtcbmVsZXNmbiQxLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vdGlmeVJlbmRlcmVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICB2YXIgcmVtb3ZlRnJvbVBvb2wgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGVsZXNUb1JlbW92ZSA9IFtdO1xuICB2YXIgZWxlc1RvUmVtb3ZlSWRzID0ge307XG4gIHZhciBjeSA9IHNlbGYuX3ByaXZhdGUuY3k7XG5cbiAgLy8gYWRkIGNvbm5lY3RlZCBlZGdlc1xuICBmdW5jdGlvbiBhZGRDb25uZWN0ZWRFZGdlcyhub2RlKSB7XG4gICAgdmFyIGVkZ2VzID0gbm9kZS5fcHJpdmF0ZS5lZGdlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhZGQoZWRnZXNbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFkZCBkZXNjZW5kYW50IG5vZGVzXG4gIGZ1bmN0aW9uIGFkZENoaWxkcmVuKG5vZGUpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLl9wcml2YXRlLmNoaWxkcmVuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFkZChjaGlsZHJlbltpXSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGFkZChlbGUpIHtcbiAgICB2YXIgYWxyZWFkeUFkZGVkID0gZWxlc1RvUmVtb3ZlSWRzW2VsZS5pZCgpXTtcbiAgICBpZiAocmVtb3ZlRnJvbVBvb2wgJiYgZWxlLnJlbW92ZWQoKSB8fCBhbHJlYWR5QWRkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlc1RvUmVtb3ZlSWRzW2VsZS5pZCgpXSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIGVsZXNUb1JlbW92ZS5wdXNoKGVsZSk7IC8vIG5vZGVzIGFyZSByZW1vdmVkIGxhc3RcblxuICAgICAgYWRkQ29ubmVjdGVkRWRnZXMoZWxlKTtcbiAgICAgIGFkZENoaWxkcmVuKGVsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZXNUb1JlbW92ZS51bnNoaWZ0KGVsZSk7IC8vIGVkZ2VzIGFyZSByZW1vdmVkIGZpcnN0XG4gICAgfVxuICB9XG5cbiAgLy8gbWFrZSB0aGUgbGlzdCBvZiBlbGVtZW50cyB0byByZW1vdmVcbiAgLy8gKG1heSBiZSByZW1vdmluZyBtb3JlIHRoYW4gc3BlY2lmaWVkIGR1ZSB0byBjb25uZWN0ZWQgZWRnZXMgZXRjKVxuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gc2VsZi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIgZWxlID0gc2VsZltpXTtcbiAgICBhZGQoZWxlKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVFZGdlUmVmKG5vZGUsIGVkZ2UpIHtcbiAgICB2YXIgY29ubmVjdGVkRWRnZXMgPSBub2RlLl9wcml2YXRlLmVkZ2VzO1xuICAgIHJlbW92ZUZyb21BcnJheShjb25uZWN0ZWRFZGdlcywgZWRnZSk7XG5cbiAgICAvLyByZW1vdmluZyBhbiBlZGdlcyBpbnZhbGlkYXRlcyB0aGUgdHJhdmVyc2FsIGNhY2hlIGZvciBpdHMgbm9kZXNcbiAgICBub2RlLmNsZWFyVHJhdmVyc2FsQ2FjaGUoKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVQYXJhbGxlbFJlZihwbGxFZGdlKSB7XG4gICAgLy8gcmVtb3ZpbmcgYW4gZWRnZSBpbnZhbGlkYXRlcyB0aGUgdHJhdmVyc2FsIGNhY2hlcyBmb3IgdGhlIHBhcmFsbGVsIGVkZ2VzXG4gICAgcGxsRWRnZS5jbGVhclRyYXZlcnNhbENhY2hlKCk7XG4gIH1cbiAgdmFyIGFsdGVyZWRQYXJlbnRzID0gW107XG4gIGFsdGVyZWRQYXJlbnRzLmlkcyA9IHt9O1xuICBmdW5jdGlvbiByZW1vdmVDaGlsZFJlZihwYXJlbnQsIGVsZSkge1xuICAgIGVsZSA9IGVsZVswXTtcbiAgICBwYXJlbnQgPSBwYXJlbnRbMF07XG4gICAgdmFyIGNoaWxkcmVuID0gcGFyZW50Ll9wcml2YXRlLmNoaWxkcmVuO1xuICAgIHZhciBwaWQgPSBwYXJlbnQuaWQoKTtcbiAgICByZW1vdmVGcm9tQXJyYXkoY2hpbGRyZW4sIGVsZSk7IC8vIHJlbW92ZSBwYXJlbnQgPT4gY2hpbGQgcmVmXG5cbiAgICBlbGUuX3ByaXZhdGUucGFyZW50ID0gbnVsbDsgLy8gcmVtb3ZlIGNoaWxkID0+IHBhcmVudCByZWZcblxuICAgIGlmICghYWx0ZXJlZFBhcmVudHMuaWRzW3BpZF0pIHtcbiAgICAgIGFsdGVyZWRQYXJlbnRzLmlkc1twaWRdID0gdHJ1ZTtcbiAgICAgIGFsdGVyZWRQYXJlbnRzLnB1c2gocGFyZW50KTtcbiAgICB9XG4gIH1cbiAgc2VsZi5kaXJ0eUNvbXBvdW5kQm91bmRzQ2FjaGUoKTtcbiAgaWYgKHJlbW92ZUZyb21Qb29sKSB7XG4gICAgY3kucmVtb3ZlRnJvbVBvb2woZWxlc1RvUmVtb3ZlKTsgLy8gcmVtb3ZlIGZyb20gY29yZSBwb29sXG4gIH1cblxuICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBlbGVzVG9SZW1vdmUubGVuZ3RoOyBfaTYrKykge1xuICAgIHZhciBfZWxlNCA9IGVsZXNUb1JlbW92ZVtfaTZdO1xuICAgIGlmIChfZWxlNC5pc0VkZ2UoKSkge1xuICAgICAgLy8gcmVtb3ZlIHJlZmVyZW5jZXMgdG8gdGhpcyBlZGdlIGluIGl0cyBjb25uZWN0ZWQgbm9kZXNcbiAgICAgIHZhciBzcmMgPSBfZWxlNC5zb3VyY2UoKVswXTtcbiAgICAgIHZhciB0Z3QgPSBfZWxlNC50YXJnZXQoKVswXTtcbiAgICAgIHJlbW92ZUVkZ2VSZWYoc3JjLCBfZWxlNCk7XG4gICAgICByZW1vdmVFZGdlUmVmKHRndCwgX2VsZTQpO1xuICAgICAgdmFyIHBsbEVkZ2VzID0gX2VsZTQucGFyYWxsZWxFZGdlcygpO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwbGxFZGdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgcGxsRWRnZSA9IHBsbEVkZ2VzW2pdO1xuICAgICAgICByZW1vdmVQYXJhbGxlbFJlZihwbGxFZGdlKTtcbiAgICAgICAgaWYgKHBsbEVkZ2UuaXNCdW5kbGVkQmV6aWVyKCkpIHtcbiAgICAgICAgICBwbGxFZGdlLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJlbW92ZSByZWZlcmVuY2UgdG8gcGFyZW50XG4gICAgICB2YXIgcGFyZW50ID0gX2VsZTQucGFyZW50KCk7XG4gICAgICBpZiAocGFyZW50Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICByZW1vdmVDaGlsZFJlZihwYXJlbnQsIF9lbGU0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlbW92ZUZyb21Qb29sKSB7XG4gICAgICAvLyBtYXJrIGFzIHJlbW92ZWRcbiAgICAgIF9lbGU0Ll9wcml2YXRlLnJlbW92ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgY29tcG91bmQgZ3JhcGggb3Igbm90XG4gIHZhciBlbGVzU3RpbGxJbnNpZGUgPSBjeS5fcHJpdmF0ZS5lbGVtZW50cztcbiAgY3kuX3ByaXZhdGUuaGFzQ29tcG91bmROb2RlcyA9IGZhbHNlO1xuICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCBlbGVzU3RpbGxJbnNpZGUubGVuZ3RoOyBfaTcrKykge1xuICAgIHZhciBfZWxlNSA9IGVsZXNTdGlsbEluc2lkZVtfaTddO1xuICAgIGlmIChfZWxlNS5pc1BhcmVudCgpKSB7XG4gICAgICBjeS5fcHJpdmF0ZS5oYXNDb21wb3VuZE5vZGVzID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB2YXIgcmVtb3ZlZEVsZW1lbnRzID0gbmV3IENvbGxlY3Rpb24odGhpcy5jeSgpLCBlbGVzVG9SZW1vdmUpO1xuICBpZiAocmVtb3ZlZEVsZW1lbnRzLnNpemUoKSA+IDApIHtcbiAgICAvLyBtdXN0IG1hbnVhbGx5IG5vdGlmeSBzaW5jZSB0cmlnZ2VyIHdvbid0IGRvIHRoaXMgYXV0b21hdGljYWxseSBvbmNlIHJlbW92ZWRcblxuICAgIGlmIChub3RpZnlSZW5kZXJlcikge1xuICAgICAgcmVtb3ZlZEVsZW1lbnRzLmVtaXRBbmROb3RpZnkoJ3JlbW92ZScpO1xuICAgIH0gZWxzZSBpZiAocmVtb3ZlRnJvbVBvb2wpIHtcbiAgICAgIHJlbW92ZWRFbGVtZW50cy5lbWl0KCdyZW1vdmUnKTtcbiAgICB9XG4gIH1cblxuICAvLyB0aGUgcGFyZW50cyB3aG8gd2VyZSBtb2RpZmllZCBieSB0aGUgcmVtb3ZhbCBuZWVkIHRoZWlyIHN0eWxlIHVwZGF0ZWRcbiAgZm9yICh2YXIgX2k4ID0gMDsgX2k4IDwgYWx0ZXJlZFBhcmVudHMubGVuZ3RoOyBfaTgrKykge1xuICAgIHZhciBfZWxlNiA9IGFsdGVyZWRQYXJlbnRzW19pOF07XG4gICAgaWYgKCFyZW1vdmVGcm9tUG9vbCB8fCAhX2VsZTYucmVtb3ZlZCgpKSB7XG4gICAgICBfZWxlNi51cGRhdGVTdHlsZSgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVtb3ZlZEVsZW1lbnRzO1xufTtcbmVsZXNmbiQxLm1vdmUgPSBmdW5jdGlvbiAoc3RydWN0KSB7XG4gIHZhciBjeSA9IHRoaXMuX3ByaXZhdGUuY3k7XG4gIHZhciBlbGVzID0gdGhpcztcblxuICAvLyBqdXN0IGNsZWFuIHVwIHJlZnMsIGNhY2hlcywgZXRjLiBpbiB0aGUgc2FtZSB3YXkgYXMgd2hlbiByZW1vdmluZyBhbmQgdGhlbiByZXN0b3JpbmdcbiAgLy8gKG91ciBjYWxscyB0byByZW1vdmUvcmVzdG9yZSBkbyBub3QgcmVtb3ZlIGZyb20gdGhlIGdyYXBoIG9yIG1ha2UgZXZlbnRzKVxuICB2YXIgbm90aWZ5UmVuZGVyZXIgPSBmYWxzZTtcbiAgdmFyIG1vZGlmeVBvb2wgPSBmYWxzZTtcbiAgdmFyIHRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoaWQpIHtcbiAgICByZXR1cm4gaWQgPT0gbnVsbCA/IGlkIDogJycgKyBpZDtcbiAgfTsgLy8gaWQgbXVzdCBiZSBzdHJpbmdcblxuICBpZiAoc3RydWN0LnNvdXJjZSAhPT0gdW5kZWZpbmVkIHx8IHN0cnVjdC50YXJnZXQgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBzcmNJZCA9IHRvU3RyaW5nKHN0cnVjdC5zb3VyY2UpO1xuICAgIHZhciB0Z3RJZCA9IHRvU3RyaW5nKHN0cnVjdC50YXJnZXQpO1xuICAgIHZhciBzcmNFeGlzdHMgPSBzcmNJZCAhPSBudWxsICYmIGN5Lmhhc0VsZW1lbnRXaXRoSWQoc3JjSWQpO1xuICAgIHZhciB0Z3RFeGlzdHMgPSB0Z3RJZCAhPSBudWxsICYmIGN5Lmhhc0VsZW1lbnRXaXRoSWQodGd0SWQpO1xuICAgIGlmIChzcmNFeGlzdHMgfHwgdGd0RXhpc3RzKSB7XG4gICAgICBjeS5iYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGF2b2lkIGR1cGxpY2F0ZSBzdHlsZSB1cGRhdGVzXG4gICAgICAgIGVsZXMucmVtb3ZlKG5vdGlmeVJlbmRlcmVyLCBtb2RpZnlQb29sKTsgLy8gY2xlYW4gdXAgcmVmcyBldGMuXG4gICAgICAgIGVsZXMuZW1pdEFuZE5vdGlmeSgnbW92ZW91dCcpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICAgICAgICB2YXIgX2RhdGE1ID0gZWxlLl9wcml2YXRlLmRhdGE7XG4gICAgICAgICAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgICAgICAgICAgaWYgKHNyY0V4aXN0cykge1xuICAgICAgICAgICAgICBfZGF0YTUuc291cmNlID0gc3JjSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGd0RXhpc3RzKSB7XG4gICAgICAgICAgICAgIF9kYXRhNS50YXJnZXQgPSB0Z3RJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxlcy5yZXN0b3JlKG5vdGlmeVJlbmRlcmVyLCBtb2RpZnlQb29sKTsgLy8gbWFrZSBuZXcgcmVmcywgc3R5bGUsIGV0Yy5cbiAgICAgIH0pO1xuXG4gICAgICBlbGVzLmVtaXRBbmROb3RpZnkoJ21vdmUnKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc3RydWN0LnBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gbW92ZSBub2RlIHRvIG5ldyBwYXJlbnRcbiAgICB2YXIgcGFyZW50SWQgPSB0b1N0cmluZyhzdHJ1Y3QucGFyZW50KTtcbiAgICB2YXIgcGFyZW50RXhpc3RzID0gcGFyZW50SWQgPT09IG51bGwgfHwgY3kuaGFzRWxlbWVudFdpdGhJZChwYXJlbnRJZCk7XG4gICAgaWYgKHBhcmVudEV4aXN0cykge1xuICAgICAgdmFyIHBpZFRvQXNzaWduID0gcGFyZW50SWQgPT09IG51bGwgPyB1bmRlZmluZWQgOiBwYXJlbnRJZDtcbiAgICAgIGN5LmJhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gYXZvaWQgZHVwbGljYXRlIHN0eWxlIHVwZGF0ZXNcbiAgICAgICAgdmFyIHVwZGF0ZWQgPSBlbGVzLnJlbW92ZShub3RpZnlSZW5kZXJlciwgbW9kaWZ5UG9vbCk7IC8vIGNsZWFuIHVwIHJlZnMgZXRjLlxuICAgICAgICB1cGRhdGVkLmVtaXRBbmROb3RpZnkoJ21vdmVvdXQnKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgICAgdmFyIF9kYXRhNiA9IGVsZS5fcHJpdmF0ZS5kYXRhO1xuICAgICAgICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgICAgICAgIF9kYXRhNi5wYXJlbnQgPSBwaWRUb0Fzc2lnbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlZC5yZXN0b3JlKG5vdGlmeVJlbmRlcmVyLCBtb2RpZnlQb29sKTsgLy8gbWFrZSBuZXcgcmVmcywgc3R5bGUsIGV0Yy5cbiAgICAgIH0pO1xuXG4gICAgICBlbGVzLmVtaXRBbmROb3RpZnkoJ21vdmUnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuW2VsZXNmbiRqLCBlbGVzZm4kaSwgZWxlc2ZuJGgsIGVsZXNmbiRnLCBlbGVzZm4kZiwgZGF0YSwgZWxlc2ZuJGQsIGRpbWVuc2lvbnMsIGVsZXNmbiQ5LCBlbGVzZm4kOCwgZWxlc2ZuJDcsIGVsZXNmbiQ2LCBlbGVzZm4kNSwgZWxlc2ZuJDQsIGVsZXNmbiQzLCBlbGVzZm4kMl0uZm9yRWFjaChmdW5jdGlvbiAocHJvcHMpIHtcbiAgZXh0ZW5kKGVsZXNmbiQxLCBwcm9wcyk7XG59KTtcblxudmFyIGNvcmVmbiQ5ID0ge1xuICBhZGQ6IGZ1bmN0aW9uIGFkZChvcHRzKSB7XG4gICAgdmFyIGVsZW1lbnRzO1xuICAgIHZhciBjeSA9IHRoaXM7XG5cbiAgICAvLyBhZGQgdGhlIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnRPckNvbGxlY3Rpb24ob3B0cykpIHtcbiAgICAgIHZhciBlbGVzID0gb3B0cztcbiAgICAgIGlmIChlbGVzLl9wcml2YXRlLmN5ID09PSBjeSkge1xuICAgICAgICAvLyBzYW1lIGluc3RhbmNlID0+IGp1c3QgcmVzdG9yZVxuICAgICAgICBlbGVtZW50cyA9IGVsZXMucmVzdG9yZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBjb3B5IGZyb20ganNvblxuICAgICAgICB2YXIganNvbnMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgICAganNvbnMucHVzaChlbGUuanNvbigpKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50cyA9IG5ldyBDb2xsZWN0aW9uKGN5LCBqc29ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc3BlY2lmeSBhbiBhcnJheSBvZiBvcHRpb25zXG4gICAgZWxzZSBpZiAoYXJyYXkob3B0cykpIHtcbiAgICAgIHZhciBfanNvbnMgPSBvcHRzO1xuICAgICAgZWxlbWVudHMgPSBuZXcgQ29sbGVjdGlvbihjeSwgX2pzb25zKTtcbiAgICB9XG5cbiAgICAvLyBzcGVjaWZ5IHZpYSBvcHRzLm5vZGVzIGFuZCBvcHRzLmVkZ2VzXG4gICAgZWxzZSBpZiAocGxhaW5PYmplY3Qob3B0cykgJiYgKGFycmF5KG9wdHMubm9kZXMpIHx8IGFycmF5KG9wdHMuZWRnZXMpKSkge1xuICAgICAgdmFyIGVsZXNCeUdyb3VwID0gb3B0cztcbiAgICAgIHZhciBfanNvbnMyID0gW107XG4gICAgICB2YXIgZ3JzID0gWydub2RlcycsICdlZGdlcyddO1xuICAgICAgZm9yICh2YXIgX2kgPSAwLCBpbCA9IGdycy5sZW5ndGg7IF9pIDwgaWw7IF9pKyspIHtcbiAgICAgICAgdmFyIGdyb3VwID0gZ3JzW19pXTtcbiAgICAgICAgdmFyIGVsZXNBcnJheSA9IGVsZXNCeUdyb3VwW2dyb3VwXTtcbiAgICAgICAgaWYgKGFycmF5KGVsZXNBcnJheSkpIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMCwgamwgPSBlbGVzQXJyYXkubGVuZ3RoOyBqIDwgamw7IGorKykge1xuICAgICAgICAgICAgdmFyIGpzb24gPSBleHRlbmQoe1xuICAgICAgICAgICAgICBncm91cDogZ3JvdXBcbiAgICAgICAgICAgIH0sIGVsZXNBcnJheVtqXSk7XG4gICAgICAgICAgICBfanNvbnMyLnB1c2goanNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbGVtZW50cyA9IG5ldyBDb2xsZWN0aW9uKGN5LCBfanNvbnMyKTtcbiAgICB9XG5cbiAgICAvLyBzcGVjaWZ5IG9wdGlvbnMgZm9yIG9uZSBlbGVtZW50XG4gICAgZWxzZSB7XG4gICAgICB2YXIgX2pzb24gPSBvcHRzO1xuICAgICAgZWxlbWVudHMgPSBuZXcgRWxlbWVudChjeSwgX2pzb24pLmNvbGxlY3Rpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LFxuICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShjb2xsZWN0aW9uKSB7XG4gICAgaWYgKGVsZW1lbnRPckNvbGxlY3Rpb24oY29sbGVjdGlvbikpIDsgZWxzZSBpZiAoc3RyaW5nKGNvbGxlY3Rpb24pKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBjb2xsZWN0aW9uO1xuICAgICAgY29sbGVjdGlvbiA9IHRoaXMuJChzZWxlY3Rvcik7XG4gICAgfVxuICAgIHJldHVybiBjb2xsZWN0aW9uLnJlbW92ZSgpO1xuICB9XG59O1xuXG4vKiBnbG9iYWwgRmxvYXQzMkFycmF5ICovXG5cbi8qISBCZXppZXIgY3VydmUgZnVuY3Rpb24gZ2VuZXJhdG9yLiBDb3B5cmlnaHQgR2FldGFuIFJlbmF1ZGVhdS4gTUlUIExpY2Vuc2U6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTUlUX0xpY2Vuc2UgKi9cbmZ1bmN0aW9uIGdlbmVyYXRlQ3ViaWNCZXppZXIobVgxLCBtWTEsIG1YMiwgbVkyKSB7XG4gIHZhciBORVdUT05fSVRFUkFUSU9OUyA9IDQsXG4gICAgTkVXVE9OX01JTl9TTE9QRSA9IDAuMDAxLFxuICAgIFNVQkRJVklTSU9OX1BSRUNJU0lPTiA9IDAuMDAwMDAwMSxcbiAgICBTVUJESVZJU0lPTl9NQVhfSVRFUkFUSU9OUyA9IDEwLFxuICAgIGtTcGxpbmVUYWJsZVNpemUgPSAxMSxcbiAgICBrU2FtcGxlU3RlcFNpemUgPSAxLjAgLyAoa1NwbGluZVRhYmxlU2l6ZSAtIDEuMCksXG4gICAgZmxvYXQzMkFycmF5U3VwcG9ydGVkID0gdHlwZW9mIEZsb2F0MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCc7XG5cbiAgLyogTXVzdCBjb250YWluIGZvdXIgYXJndW1lbnRzLiAqL1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gNCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qIEFyZ3VtZW50cyBtdXN0IGJlIG51bWJlcnMuICovXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbaV0gIT09IFwibnVtYmVyXCIgfHwgaXNOYU4oYXJndW1lbnRzW2ldKSB8fCAhaXNGaW5pdGUoYXJndW1lbnRzW2ldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qIFggdmFsdWVzIG11c3QgYmUgaW4gdGhlIFswLCAxXSByYW5nZS4gKi9cbiAgbVgxID0gTWF0aC5taW4obVgxLCAxKTtcbiAgbVgyID0gTWF0aC5taW4obVgyLCAxKTtcbiAgbVgxID0gTWF0aC5tYXgobVgxLCAwKTtcbiAgbVgyID0gTWF0aC5tYXgobVgyLCAwKTtcbiAgdmFyIG1TYW1wbGVWYWx1ZXMgPSBmbG9hdDMyQXJyYXlTdXBwb3J0ZWQgPyBuZXcgRmxvYXQzMkFycmF5KGtTcGxpbmVUYWJsZVNpemUpIDogbmV3IEFycmF5KGtTcGxpbmVUYWJsZVNpemUpO1xuICBmdW5jdGlvbiBBKGFBMSwgYUEyKSB7XG4gICAgcmV0dXJuIDEuMCAtIDMuMCAqIGFBMiArIDMuMCAqIGFBMTtcbiAgfVxuICBmdW5jdGlvbiBCKGFBMSwgYUEyKSB7XG4gICAgcmV0dXJuIDMuMCAqIGFBMiAtIDYuMCAqIGFBMTtcbiAgfVxuICBmdW5jdGlvbiBDKGFBMSkge1xuICAgIHJldHVybiAzLjAgKiBhQTE7XG4gIH1cbiAgZnVuY3Rpb24gY2FsY0JlemllcihhVCwgYUExLCBhQTIpIHtcbiAgICByZXR1cm4gKChBKGFBMSwgYUEyKSAqIGFUICsgQihhQTEsIGFBMikpICogYVQgKyBDKGFBMSkpICogYVQ7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0U2xvcGUoYVQsIGFBMSwgYUEyKSB7XG4gICAgcmV0dXJuIDMuMCAqIEEoYUExLCBhQTIpICogYVQgKiBhVCArIDIuMCAqIEIoYUExLCBhQTIpICogYVQgKyBDKGFBMSk7XG4gIH1cbiAgZnVuY3Rpb24gbmV3dG9uUmFwaHNvbkl0ZXJhdGUoYVgsIGFHdWVzc1QpIHtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgTkVXVE9OX0lURVJBVElPTlM7ICsrX2kpIHtcbiAgICAgIHZhciBjdXJyZW50U2xvcGUgPSBnZXRTbG9wZShhR3Vlc3NULCBtWDEsIG1YMik7XG4gICAgICBpZiAoY3VycmVudFNsb3BlID09PSAwLjApIHtcbiAgICAgICAgcmV0dXJuIGFHdWVzc1Q7XG4gICAgICB9XG4gICAgICB2YXIgY3VycmVudFggPSBjYWxjQmV6aWVyKGFHdWVzc1QsIG1YMSwgbVgyKSAtIGFYO1xuICAgICAgYUd1ZXNzVCAtPSBjdXJyZW50WCAvIGN1cnJlbnRTbG9wZTtcbiAgICB9XG4gICAgcmV0dXJuIGFHdWVzc1Q7XG4gIH1cbiAgZnVuY3Rpb24gY2FsY1NhbXBsZVZhbHVlcygpIHtcbiAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBrU3BsaW5lVGFibGVTaXplOyArK19pMikge1xuICAgICAgbVNhbXBsZVZhbHVlc1tfaTJdID0gY2FsY0JlemllcihfaTIgKiBrU2FtcGxlU3RlcFNpemUsIG1YMSwgbVgyKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gYmluYXJ5U3ViZGl2aWRlKGFYLCBhQSwgYUIpIHtcbiAgICB2YXIgY3VycmVudFgsXG4gICAgICBjdXJyZW50VCxcbiAgICAgIGkgPSAwO1xuICAgIGRvIHtcbiAgICAgIGN1cnJlbnRUID0gYUEgKyAoYUIgLSBhQSkgLyAyLjA7XG4gICAgICBjdXJyZW50WCA9IGNhbGNCZXppZXIoY3VycmVudFQsIG1YMSwgbVgyKSAtIGFYO1xuICAgICAgaWYgKGN1cnJlbnRYID4gMC4wKSB7XG4gICAgICAgIGFCID0gY3VycmVudFQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhQSA9IGN1cnJlbnRUO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKE1hdGguYWJzKGN1cnJlbnRYKSA+IFNVQkRJVklTSU9OX1BSRUNJU0lPTiAmJiArK2kgPCBTVUJESVZJU0lPTl9NQVhfSVRFUkFUSU9OUyk7XG4gICAgcmV0dXJuIGN1cnJlbnRUO1xuICB9XG4gIGZ1bmN0aW9uIGdldFRGb3JYKGFYKSB7XG4gICAgdmFyIGludGVydmFsU3RhcnQgPSAwLjAsXG4gICAgICBjdXJyZW50U2FtcGxlID0gMSxcbiAgICAgIGxhc3RTYW1wbGUgPSBrU3BsaW5lVGFibGVTaXplIC0gMTtcbiAgICBmb3IgKDsgY3VycmVudFNhbXBsZSAhPT0gbGFzdFNhbXBsZSAmJiBtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGVdIDw9IGFYOyArK2N1cnJlbnRTYW1wbGUpIHtcbiAgICAgIGludGVydmFsU3RhcnQgKz0ga1NhbXBsZVN0ZXBTaXplO1xuICAgIH1cbiAgICAtLWN1cnJlbnRTYW1wbGU7XG4gICAgdmFyIGRpc3QgPSAoYVggLSBtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGVdKSAvIChtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGUgKyAxXSAtIG1TYW1wbGVWYWx1ZXNbY3VycmVudFNhbXBsZV0pLFxuICAgICAgZ3Vlc3NGb3JUID0gaW50ZXJ2YWxTdGFydCArIGRpc3QgKiBrU2FtcGxlU3RlcFNpemUsXG4gICAgICBpbml0aWFsU2xvcGUgPSBnZXRTbG9wZShndWVzc0ZvclQsIG1YMSwgbVgyKTtcbiAgICBpZiAoaW5pdGlhbFNsb3BlID49IE5FV1RPTl9NSU5fU0xPUEUpIHtcbiAgICAgIHJldHVybiBuZXd0b25SYXBoc29uSXRlcmF0ZShhWCwgZ3Vlc3NGb3JUKTtcbiAgICB9IGVsc2UgaWYgKGluaXRpYWxTbG9wZSA9PT0gMC4wKSB7XG4gICAgICByZXR1cm4gZ3Vlc3NGb3JUO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYmluYXJ5U3ViZGl2aWRlKGFYLCBpbnRlcnZhbFN0YXJ0LCBpbnRlcnZhbFN0YXJ0ICsga1NhbXBsZVN0ZXBTaXplKTtcbiAgICB9XG4gIH1cbiAgdmFyIF9wcmVjb21wdXRlZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBwcmVjb21wdXRlKCkge1xuICAgIF9wcmVjb21wdXRlZCA9IHRydWU7XG4gICAgaWYgKG1YMSAhPT0gbVkxIHx8IG1YMiAhPT0gbVkyKSB7XG4gICAgICBjYWxjU2FtcGxlVmFsdWVzKCk7XG4gICAgfVxuICB9XG4gIHZhciBmID0gZnVuY3Rpb24gZihhWCkge1xuICAgIGlmICghX3ByZWNvbXB1dGVkKSB7XG4gICAgICBwcmVjb21wdXRlKCk7XG4gICAgfVxuICAgIGlmIChtWDEgPT09IG1ZMSAmJiBtWDIgPT09IG1ZMikge1xuICAgICAgcmV0dXJuIGFYO1xuICAgIH1cbiAgICBpZiAoYVggPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAoYVggPT09IDEpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gY2FsY0JlemllcihnZXRURm9yWChhWCksIG1ZMSwgbVkyKTtcbiAgfTtcbiAgZi5nZXRDb250cm9sUG9pbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBbe1xuICAgICAgeDogbVgxLFxuICAgICAgeTogbVkxXG4gICAgfSwge1xuICAgICAgeDogbVgyLFxuICAgICAgeTogbVkyXG4gICAgfV07XG4gIH07XG4gIHZhciBzdHIgPSBcImdlbmVyYXRlQmV6aWVyKFwiICsgW21YMSwgbVkxLCBtWDIsIG1ZMl0gKyBcIilcIjtcbiAgZi50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9O1xuICByZXR1cm4gZjtcbn1cblxuLyohIFJ1bmdlLUt1dHRhIHNwcmluZyBwaHlzaWNzIGZ1bmN0aW9uIGdlbmVyYXRvci4gQWRhcHRlZCBmcm9tIEZyYW1lci5qcywgY29weXJpZ2h0IEtvZW4gQm9rLiBNSVQgTGljZW5zZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NSVRfTGljZW5zZSAqL1xuLyogR2l2ZW4gYSB0ZW5zaW9uLCBmcmljdGlvbiwgYW5kIGR1cmF0aW9uLCBhIHNpbXVsYXRpb24gYXQgNjBGUFMgd2lsbCBmaXJzdCBydW4gd2l0aG91dCBhIGRlZmluZWQgZHVyYXRpb24gaW4gb3JkZXIgdG8gY2FsY3VsYXRlIHRoZSBmdWxsIHBhdGguIEEgc2Vjb25kIHBhc3NcbiAgIHRoZW4gYWRqdXN0cyB0aGUgdGltZSBkZWx0YSAtLSB1c2luZyB0aGUgcmVsYXRpb24gYmV0d2VlbiBhY3R1YWwgdGltZSBhbmQgZHVyYXRpb24gLS0gdG8gY2FsY3VsYXRlIHRoZSBwYXRoIGZvciB0aGUgZHVyYXRpb24tY29uc3RyYWluZWQgYW5pbWF0aW9uLiAqL1xudmFyIGdlbmVyYXRlU3ByaW5nUks0ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBzcHJpbmdBY2NlbGVyYXRpb25Gb3JTdGF0ZShzdGF0ZSkge1xuICAgIHJldHVybiAtc3RhdGUudGVuc2lvbiAqIHN0YXRlLnggLSBzdGF0ZS5mcmljdGlvbiAqIHN0YXRlLnY7XG4gIH1cbiAgZnVuY3Rpb24gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKGluaXRpYWxTdGF0ZSwgZHQsIGRlcml2YXRpdmUpIHtcbiAgICB2YXIgc3RhdGUgPSB7XG4gICAgICB4OiBpbml0aWFsU3RhdGUueCArIGRlcml2YXRpdmUuZHggKiBkdCxcbiAgICAgIHY6IGluaXRpYWxTdGF0ZS52ICsgZGVyaXZhdGl2ZS5kdiAqIGR0LFxuICAgICAgdGVuc2lvbjogaW5pdGlhbFN0YXRlLnRlbnNpb24sXG4gICAgICBmcmljdGlvbjogaW5pdGlhbFN0YXRlLmZyaWN0aW9uXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgZHg6IHN0YXRlLnYsXG4gICAgICBkdjogc3ByaW5nQWNjZWxlcmF0aW9uRm9yU3RhdGUoc3RhdGUpXG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBzcHJpbmdJbnRlZ3JhdGVTdGF0ZShzdGF0ZSwgZHQpIHtcbiAgICB2YXIgYSA9IHtcbiAgICAgICAgZHg6IHN0YXRlLnYsXG4gICAgICAgIGR2OiBzcHJpbmdBY2NlbGVyYXRpb25Gb3JTdGF0ZShzdGF0ZSlcbiAgICAgIH0sXG4gICAgICBiID0gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKHN0YXRlLCBkdCAqIDAuNSwgYSksXG4gICAgICBjID0gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKHN0YXRlLCBkdCAqIDAuNSwgYiksXG4gICAgICBkID0gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKHN0YXRlLCBkdCwgYyksXG4gICAgICBkeGR0ID0gMS4wIC8gNi4wICogKGEuZHggKyAyLjAgKiAoYi5keCArIGMuZHgpICsgZC5keCksXG4gICAgICBkdmR0ID0gMS4wIC8gNi4wICogKGEuZHYgKyAyLjAgKiAoYi5kdiArIGMuZHYpICsgZC5kdik7XG4gICAgc3RhdGUueCA9IHN0YXRlLnggKyBkeGR0ICogZHQ7XG4gICAgc3RhdGUudiA9IHN0YXRlLnYgKyBkdmR0ICogZHQ7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBzcHJpbmdSSzRGYWN0b3J5KHRlbnNpb24sIGZyaWN0aW9uLCBkdXJhdGlvbikge1xuICAgIHZhciBpbml0U3RhdGUgPSB7XG4gICAgICAgIHg6IC0xLFxuICAgICAgICB2OiAwLFxuICAgICAgICB0ZW5zaW9uOiBudWxsLFxuICAgICAgICBmcmljdGlvbjogbnVsbFxuICAgICAgfSxcbiAgICAgIHBhdGggPSBbMF0sXG4gICAgICB0aW1lX2xhcHNlZCA9IDAsXG4gICAgICB0b2xlcmFuY2UgPSAxIC8gMTAwMDAsXG4gICAgICBEVCA9IDE2IC8gMTAwMCxcbiAgICAgIGhhdmVfZHVyYXRpb24sXG4gICAgICBkdCxcbiAgICAgIGxhc3Rfc3RhdGU7XG4gICAgdGVuc2lvbiA9IHBhcnNlRmxvYXQodGVuc2lvbikgfHwgNTAwO1xuICAgIGZyaWN0aW9uID0gcGFyc2VGbG9hdChmcmljdGlvbikgfHwgMjA7XG4gICAgZHVyYXRpb24gPSBkdXJhdGlvbiB8fCBudWxsO1xuICAgIGluaXRTdGF0ZS50ZW5zaW9uID0gdGVuc2lvbjtcbiAgICBpbml0U3RhdGUuZnJpY3Rpb24gPSBmcmljdGlvbjtcbiAgICBoYXZlX2R1cmF0aW9uID0gZHVyYXRpb24gIT09IG51bGw7XG5cbiAgICAvKiBDYWxjdWxhdGUgdGhlIGFjdHVhbCB0aW1lIGl0IHRha2VzIGZvciB0aGlzIGFuaW1hdGlvbiB0byBjb21wbGV0ZSB3aXRoIHRoZSBwcm92aWRlZCBjb25kaXRpb25zLiAqL1xuICAgIGlmIChoYXZlX2R1cmF0aW9uKSB7XG4gICAgICAvKiBSdW4gdGhlIHNpbXVsYXRpb24gd2l0aG91dCBhIGR1cmF0aW9uLiAqL1xuICAgICAgdGltZV9sYXBzZWQgPSBzcHJpbmdSSzRGYWN0b3J5KHRlbnNpb24sIGZyaWN0aW9uKTtcbiAgICAgIC8qIENvbXB1dGUgdGhlIGFkanVzdGVkIHRpbWUgZGVsdGEuICovXG4gICAgICBkdCA9IHRpbWVfbGFwc2VkIC8gZHVyYXRpb24gKiBEVDtcbiAgICB9IGVsc2Uge1xuICAgICAgZHQgPSBEVDtcbiAgICB9XG4gICAgZm9yICg7Oykge1xuICAgICAgLyogTmV4dC9zdGVwIGZ1bmN0aW9uIC4qL1xuICAgICAgbGFzdF9zdGF0ZSA9IHNwcmluZ0ludGVncmF0ZVN0YXRlKGxhc3Rfc3RhdGUgfHwgaW5pdFN0YXRlLCBkdCk7XG4gICAgICAvKiBTdG9yZSB0aGUgcG9zaXRpb24uICovXG4gICAgICBwYXRoLnB1c2goMSArIGxhc3Rfc3RhdGUueCk7XG4gICAgICB0aW1lX2xhcHNlZCArPSAxNjtcbiAgICAgIC8qIElmIHRoZSBjaGFuZ2UgdGhyZXNob2xkIGlzIHJlYWNoZWQsIGJyZWFrLiAqL1xuICAgICAgaWYgKCEoTWF0aC5hYnMobGFzdF9zdGF0ZS54KSA+IHRvbGVyYW5jZSAmJiBNYXRoLmFicyhsYXN0X3N0YXRlLnYpID4gdG9sZXJhbmNlKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJZiBkdXJhdGlvbiBpcyBub3QgZGVmaW5lZCwgcmV0dXJuIHRoZSBhY3R1YWwgdGltZSByZXF1aXJlZCBmb3IgY29tcGxldGluZyB0aGlzIGFuaW1hdGlvbi4gT3RoZXJ3aXNlLCByZXR1cm4gYSBjbG9zdXJlIHRoYXQgaG9sZHMgdGhlXG4gICAgICAgY29tcHV0ZWQgcGF0aCBhbmQgcmV0dXJucyBhIHNuYXBzaG90IG9mIHRoZSBwb3NpdGlvbiBhY2NvcmRpbmcgdG8gYSBnaXZlbiBwZXJjZW50Q29tcGxldGUuICovXG4gICAgcmV0dXJuICFoYXZlX2R1cmF0aW9uID8gdGltZV9sYXBzZWQgOiBmdW5jdGlvbiAocGVyY2VudENvbXBsZXRlKSB7XG4gICAgICByZXR1cm4gcGF0aFtwZXJjZW50Q29tcGxldGUgKiAocGF0aC5sZW5ndGggLSAxKSB8IDBdO1xuICAgIH07XG4gIH07XG59KCk7XG5cbnZhciBjdWJpY0JlemllciA9IGZ1bmN0aW9uIGN1YmljQmV6aWVyKHQxLCBwMSwgdDIsIHAyKSB7XG4gIHZhciBiZXppZXIgPSBnZW5lcmF0ZUN1YmljQmV6aWVyKHQxLCBwMSwgdDIsIHAyKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzdGFydCwgZW5kLCBwZXJjZW50KSB7XG4gICAgcmV0dXJuIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIGJlemllcihwZXJjZW50KTtcbiAgfTtcbn07XG52YXIgZWFzaW5ncyA9IHtcbiAgJ2xpbmVhcic6IGZ1bmN0aW9uIGxpbmVhcihzdGFydCwgZW5kLCBwZXJjZW50KSB7XG4gICAgcmV0dXJuIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIHBlcmNlbnQ7XG4gIH0sXG4gIC8vIGRlZmF1bHQgZWFzaW5nc1xuICAnZWFzZSc6IGN1YmljQmV6aWVyKDAuMjUsIDAuMSwgMC4yNSwgMSksXG4gICdlYXNlLWluJzogY3ViaWNCZXppZXIoMC40MiwgMCwgMSwgMSksXG4gICdlYXNlLW91dCc6IGN1YmljQmV6aWVyKDAsIDAsIDAuNTgsIDEpLFxuICAnZWFzZS1pbi1vdXQnOiBjdWJpY0JlemllcigwLjQyLCAwLCAwLjU4LCAxKSxcbiAgLy8gc2luZVxuICAnZWFzZS1pbi1zaW5lJzogY3ViaWNCZXppZXIoMC40NywgMCwgMC43NDUsIDAuNzE1KSxcbiAgJ2Vhc2Utb3V0LXNpbmUnOiBjdWJpY0JlemllcigwLjM5LCAwLjU3NSwgMC41NjUsIDEpLFxuICAnZWFzZS1pbi1vdXQtc2luZSc6IGN1YmljQmV6aWVyKDAuNDQ1LCAwLjA1LCAwLjU1LCAwLjk1KSxcbiAgLy8gcXVhZFxuICAnZWFzZS1pbi1xdWFkJzogY3ViaWNCZXppZXIoMC41NSwgMC4wODUsIDAuNjgsIDAuNTMpLFxuICAnZWFzZS1vdXQtcXVhZCc6IGN1YmljQmV6aWVyKDAuMjUsIDAuNDYsIDAuNDUsIDAuOTQpLFxuICAnZWFzZS1pbi1vdXQtcXVhZCc6IGN1YmljQmV6aWVyKDAuNDU1LCAwLjAzLCAwLjUxNSwgMC45NTUpLFxuICAvLyBjdWJpY1xuICAnZWFzZS1pbi1jdWJpYyc6IGN1YmljQmV6aWVyKDAuNTUsIDAuMDU1LCAwLjY3NSwgMC4xOSksXG4gICdlYXNlLW91dC1jdWJpYyc6IGN1YmljQmV6aWVyKDAuMjE1LCAwLjYxLCAwLjM1NSwgMSksXG4gICdlYXNlLWluLW91dC1jdWJpYyc6IGN1YmljQmV6aWVyKDAuNjQ1LCAwLjA0NSwgMC4zNTUsIDEpLFxuICAvLyBxdWFydFxuICAnZWFzZS1pbi1xdWFydCc6IGN1YmljQmV6aWVyKDAuODk1LCAwLjAzLCAwLjY4NSwgMC4yMiksXG4gICdlYXNlLW91dC1xdWFydCc6IGN1YmljQmV6aWVyKDAuMTY1LCAwLjg0LCAwLjQ0LCAxKSxcbiAgJ2Vhc2UtaW4tb3V0LXF1YXJ0JzogY3ViaWNCZXppZXIoMC43NywgMCwgMC4xNzUsIDEpLFxuICAvLyBxdWludFxuICAnZWFzZS1pbi1xdWludCc6IGN1YmljQmV6aWVyKDAuNzU1LCAwLjA1LCAwLjg1NSwgMC4wNiksXG4gICdlYXNlLW91dC1xdWludCc6IGN1YmljQmV6aWVyKDAuMjMsIDEsIDAuMzIsIDEpLFxuICAnZWFzZS1pbi1vdXQtcXVpbnQnOiBjdWJpY0JlemllcigwLjg2LCAwLCAwLjA3LCAxKSxcbiAgLy8gZXhwb1xuICAnZWFzZS1pbi1leHBvJzogY3ViaWNCZXppZXIoMC45NSwgMC4wNSwgMC43OTUsIDAuMDM1KSxcbiAgJ2Vhc2Utb3V0LWV4cG8nOiBjdWJpY0JlemllcigwLjE5LCAxLCAwLjIyLCAxKSxcbiAgJ2Vhc2UtaW4tb3V0LWV4cG8nOiBjdWJpY0JlemllcigxLCAwLCAwLCAxKSxcbiAgLy8gY2lyY1xuICAnZWFzZS1pbi1jaXJjJzogY3ViaWNCZXppZXIoMC42LCAwLjA0LCAwLjk4LCAwLjMzNSksXG4gICdlYXNlLW91dC1jaXJjJzogY3ViaWNCZXppZXIoMC4wNzUsIDAuODIsIDAuMTY1LCAxKSxcbiAgJ2Vhc2UtaW4tb3V0LWNpcmMnOiBjdWJpY0JlemllcigwLjc4NSwgMC4xMzUsIDAuMTUsIDAuODYpLFxuICAvLyB1c2VyIHBhcmFtIGVhc2luZ3MuLi5cblxuICAnc3ByaW5nJzogZnVuY3Rpb24gc3ByaW5nKHRlbnNpb24sIGZyaWN0aW9uLCBkdXJhdGlvbikge1xuICAgIGlmIChkdXJhdGlvbiA9PT0gMCkge1xuICAgICAgLy8gY2FuJ3QgZ2V0IGEgc3ByaW5nIHcvIGR1cmF0aW9uIDBcbiAgICAgIHJldHVybiBlYXNpbmdzLmxpbmVhcjsgLy8gZHVyYXRpb24gMCA9PiBqdW1wIHRvIGVuZCBzbyBpbXBsIGRvZXNuJ3QgbWF0dGVyXG4gICAgfVxuXG4gICAgdmFyIHNwcmluZyA9IGdlbmVyYXRlU3ByaW5nUks0KHRlbnNpb24sIGZyaWN0aW9uLCBkdXJhdGlvbik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGFydCwgZW5kLCBwZXJjZW50KSB7XG4gICAgICByZXR1cm4gc3RhcnQgKyAoZW5kIC0gc3RhcnQpICogc3ByaW5nKHBlcmNlbnQpO1xuICAgIH07XG4gIH0sXG4gICdjdWJpYy1iZXppZXInOiBjdWJpY0JlemllclxufTtcblxuZnVuY3Rpb24gZ2V0RWFzZWRWYWx1ZSh0eXBlLCBzdGFydCwgZW5kLCBwZXJjZW50LCBlYXNpbmdGbikge1xuICBpZiAocGVyY2VudCA9PT0gMSkge1xuICAgIHJldHVybiBlbmQ7XG4gIH1cbiAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcbiAgICByZXR1cm4gZW5kO1xuICB9XG4gIHZhciB2YWwgPSBlYXNpbmdGbihzdGFydCwgZW5kLCBwZXJjZW50KTtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgaWYgKHR5cGUucm91bmRWYWx1ZSB8fCB0eXBlLmNvbG9yKSB7XG4gICAgdmFsID0gTWF0aC5yb3VuZCh2YWwpO1xuICB9XG4gIGlmICh0eXBlLm1pbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsID0gTWF0aC5tYXgodmFsLCB0eXBlLm1pbik7XG4gIH1cbiAgaWYgKHR5cGUubWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWwgPSBNYXRoLm1pbih2YWwsIHR5cGUubWF4KTtcbiAgfVxuICByZXR1cm4gdmFsO1xufVxuZnVuY3Rpb24gZ2V0VmFsdWUocHJvcCwgc3BlYykge1xuICBpZiAocHJvcC5wZlZhbHVlICE9IG51bGwgfHwgcHJvcC52YWx1ZSAhPSBudWxsKSB7XG4gICAgaWYgKHByb3AucGZWYWx1ZSAhPSBudWxsICYmIChzcGVjID09IG51bGwgfHwgc3BlYy50eXBlLnVuaXRzICE9PSAnJScpKSB7XG4gICAgICByZXR1cm4gcHJvcC5wZlZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJvcC52YWx1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHByb3A7XG4gIH1cbn1cbmZ1bmN0aW9uIGVhc2Uoc3RhcnRQcm9wLCBlbmRQcm9wLCBwZXJjZW50LCBlYXNpbmdGbiwgcHJvcFNwZWMpIHtcbiAgdmFyIHR5cGUgPSBwcm9wU3BlYyAhPSBudWxsID8gcHJvcFNwZWMudHlwZSA6IG51bGw7XG4gIGlmIChwZXJjZW50IDwgMCkge1xuICAgIHBlcmNlbnQgPSAwO1xuICB9IGVsc2UgaWYgKHBlcmNlbnQgPiAxKSB7XG4gICAgcGVyY2VudCA9IDE7XG4gIH1cbiAgdmFyIHN0YXJ0ID0gZ2V0VmFsdWUoc3RhcnRQcm9wLCBwcm9wU3BlYyk7XG4gIHZhciBlbmQgPSBnZXRWYWx1ZShlbmRQcm9wLCBwcm9wU3BlYyk7XG4gIGlmIChudW1iZXIkMShzdGFydCkgJiYgbnVtYmVyJDEoZW5kKSkge1xuICAgIHJldHVybiBnZXRFYXNlZFZhbHVlKHR5cGUsIHN0YXJ0LCBlbmQsIHBlcmNlbnQsIGVhc2luZ0ZuKTtcbiAgfSBlbHNlIGlmIChhcnJheShzdGFydCkgJiYgYXJyYXkoZW5kKSkge1xuICAgIHZhciBlYXNlZEFyciA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5kLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2kgPSBzdGFydFtpXTtcbiAgICAgIHZhciBlaSA9IGVuZFtpXTtcbiAgICAgIGlmIChzaSAhPSBudWxsICYmIGVpICE9IG51bGwpIHtcbiAgICAgICAgdmFyIHZhbCA9IGdldEVhc2VkVmFsdWUodHlwZSwgc2ksIGVpLCBwZXJjZW50LCBlYXNpbmdGbik7XG4gICAgICAgIGVhc2VkQXJyLnB1c2godmFsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVhc2VkQXJyLnB1c2goZWkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWFzZWRBcnI7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RlcCQxKHNlbGYsIGFuaSwgbm93LCBpc0NvcmUpIHtcbiAgdmFyIGlzRWxlcyA9ICFpc0NvcmU7XG4gIHZhciBfcCA9IHNlbGYuX3ByaXZhdGU7XG4gIHZhciBhbmlfcCA9IGFuaS5fcHJpdmF0ZTtcbiAgdmFyIHBFYXNpbmcgPSBhbmlfcC5lYXNpbmc7XG4gIHZhciBzdGFydFRpbWUgPSBhbmlfcC5zdGFydFRpbWU7XG4gIHZhciBjeSA9IGlzQ29yZSA/IHNlbGYgOiBzZWxmLmN5KCk7XG4gIHZhciBzdHlsZSA9IGN5LnN0eWxlKCk7XG4gIGlmICghYW5pX3AuZWFzaW5nSW1wbCkge1xuICAgIGlmIChwRWFzaW5nID09IG51bGwpIHtcbiAgICAgIC8vIHVzZSBkZWZhdWx0XG4gICAgICBhbmlfcC5lYXNpbmdJbXBsID0gZWFzaW5nc1snbGluZWFyJ107XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZW4gZGVmaW5lIHcvIG5hbWVcbiAgICAgIHZhciBlYXNpbmdWYWxzO1xuICAgICAgaWYgKHN0cmluZyhwRWFzaW5nKSkge1xuICAgICAgICB2YXIgZWFzaW5nUHJvcCA9IHN0eWxlLnBhcnNlKCd0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbicsIHBFYXNpbmcpO1xuICAgICAgICBlYXNpbmdWYWxzID0gZWFzaW5nUHJvcC52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRoZW4gYXNzdW1lIHByZXBhcnNlZCBhcnJheVxuICAgICAgICBlYXNpbmdWYWxzID0gcEVhc2luZztcbiAgICAgIH1cbiAgICAgIHZhciBuYW1lLCBhcmdzO1xuICAgICAgaWYgKHN0cmluZyhlYXNpbmdWYWxzKSkge1xuICAgICAgICBuYW1lID0gZWFzaW5nVmFscztcbiAgICAgICAgYXJncyA9IFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmFtZSA9IGVhc2luZ1ZhbHNbMV07XG4gICAgICAgIGFyZ3MgPSBlYXNpbmdWYWxzLnNsaWNlKDIpLm1hcChmdW5jdGlvbiAobikge1xuICAgICAgICAgIHJldHVybiArbjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIGNyZWF0ZSB3aXRoIGFyZ3NcbiAgICAgICAgaWYgKG5hbWUgPT09ICdzcHJpbmcnKSB7XG4gICAgICAgICAgYXJncy5wdXNoKGFuaV9wLmR1cmF0aW9uKTsgLy8gbmVlZCBkdXJhdGlvbiB0byBnZW5lcmF0ZSBzcHJpbmdcbiAgICAgICAgfVxuXG4gICAgICAgIGFuaV9wLmVhc2luZ0ltcGwgPSBlYXNpbmdzW25hbWVdLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc3RhdGljIGltcGwgYnkgbmFtZVxuICAgICAgICBhbmlfcC5lYXNpbmdJbXBsID0gZWFzaW5nc1tuYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIGVhc2luZyA9IGFuaV9wLmVhc2luZ0ltcGw7XG4gIHZhciBwZXJjZW50O1xuICBpZiAoYW5pX3AuZHVyYXRpb24gPT09IDApIHtcbiAgICBwZXJjZW50ID0gMTtcbiAgfSBlbHNlIHtcbiAgICBwZXJjZW50ID0gKG5vdyAtIHN0YXJ0VGltZSkgLyBhbmlfcC5kdXJhdGlvbjtcbiAgfVxuICBpZiAoYW5pX3AuYXBwbHlpbmcpIHtcbiAgICBwZXJjZW50ID0gYW5pX3AucHJvZ3Jlc3M7XG4gIH1cbiAgaWYgKHBlcmNlbnQgPCAwKSB7XG4gICAgcGVyY2VudCA9IDA7XG4gIH0gZWxzZSBpZiAocGVyY2VudCA+IDEpIHtcbiAgICBwZXJjZW50ID0gMTtcbiAgfVxuICBpZiAoYW5pX3AuZGVsYXkgPT0gbnVsbCkge1xuICAgIC8vIHRoZW4gdXBkYXRlXG5cbiAgICB2YXIgc3RhcnRQb3MgPSBhbmlfcC5zdGFydFBvc2l0aW9uO1xuICAgIHZhciBlbmRQb3MgPSBhbmlfcC5wb3NpdGlvbjtcbiAgICBpZiAoZW5kUG9zICYmIGlzRWxlcyAmJiAhc2VsZi5sb2NrZWQoKSkge1xuICAgICAgdmFyIG5ld1BvcyA9IHt9O1xuICAgICAgaWYgKHZhbGlkKHN0YXJ0UG9zLngsIGVuZFBvcy54KSkge1xuICAgICAgICBuZXdQb3MueCA9IGVhc2Uoc3RhcnRQb3MueCwgZW5kUG9zLngsIHBlcmNlbnQsIGVhc2luZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsaWQoc3RhcnRQb3MueSwgZW5kUG9zLnkpKSB7XG4gICAgICAgIG5ld1Bvcy55ID0gZWFzZShzdGFydFBvcy55LCBlbmRQb3MueSwgcGVyY2VudCwgZWFzaW5nKTtcbiAgICAgIH1cbiAgICAgIHNlbGYucG9zaXRpb24obmV3UG9zKTtcbiAgICB9XG4gICAgdmFyIHN0YXJ0UGFuID0gYW5pX3Auc3RhcnRQYW47XG4gICAgdmFyIGVuZFBhbiA9IGFuaV9wLnBhbjtcbiAgICB2YXIgcGFuID0gX3AucGFuO1xuICAgIHZhciBhbmltYXRpbmdQYW4gPSBlbmRQYW4gIT0gbnVsbCAmJiBpc0NvcmU7XG4gICAgaWYgKGFuaW1hdGluZ1Bhbikge1xuICAgICAgaWYgKHZhbGlkKHN0YXJ0UGFuLngsIGVuZFBhbi54KSkge1xuICAgICAgICBwYW4ueCA9IGVhc2Uoc3RhcnRQYW4ueCwgZW5kUGFuLngsIHBlcmNlbnQsIGVhc2luZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsaWQoc3RhcnRQYW4ueSwgZW5kUGFuLnkpKSB7XG4gICAgICAgIHBhbi55ID0gZWFzZShzdGFydFBhbi55LCBlbmRQYW4ueSwgcGVyY2VudCwgZWFzaW5nKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuZW1pdCgncGFuJyk7XG4gICAgfVxuICAgIHZhciBzdGFydFpvb20gPSBhbmlfcC5zdGFydFpvb207XG4gICAgdmFyIGVuZFpvb20gPSBhbmlfcC56b29tO1xuICAgIHZhciBhbmltYXRpbmdab29tID0gZW5kWm9vbSAhPSBudWxsICYmIGlzQ29yZTtcbiAgICBpZiAoYW5pbWF0aW5nWm9vbSkge1xuICAgICAgaWYgKHZhbGlkKHN0YXJ0Wm9vbSwgZW5kWm9vbSkpIHtcbiAgICAgICAgX3Auem9vbSA9IGJvdW5kKF9wLm1pblpvb20sIGVhc2Uoc3RhcnRab29tLCBlbmRab29tLCBwZXJjZW50LCBlYXNpbmcpLCBfcC5tYXhab29tKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuZW1pdCgnem9vbScpO1xuICAgIH1cbiAgICBpZiAoYW5pbWF0aW5nUGFuIHx8IGFuaW1hdGluZ1pvb20pIHtcbiAgICAgIHNlbGYuZW1pdCgndmlld3BvcnQnKTtcbiAgICB9XG4gICAgdmFyIHByb3BzID0gYW5pX3Auc3R5bGU7XG4gICAgaWYgKHByb3BzICYmIHByb3BzLmxlbmd0aCA+IDAgJiYgaXNFbGVzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwcm9wID0gcHJvcHNbaV07XG4gICAgICAgIHZhciBfbmFtZSA9IHByb3AubmFtZTtcbiAgICAgICAgdmFyIGVuZCA9IHByb3A7XG4gICAgICAgIHZhciBzdGFydCA9IGFuaV9wLnN0YXJ0U3R5bGVbX25hbWVdO1xuICAgICAgICB2YXIgcHJvcFNwZWMgPSBzdHlsZS5wcm9wZXJ0aWVzW3N0YXJ0Lm5hbWVdO1xuICAgICAgICB2YXIgZWFzZWRWYWwgPSBlYXNlKHN0YXJ0LCBlbmQsIHBlcmNlbnQsIGVhc2luZywgcHJvcFNwZWMpO1xuICAgICAgICBzdHlsZS5vdmVycmlkZUJ5cGFzcyhzZWxmLCBfbmFtZSwgZWFzZWRWYWwpO1xuICAgICAgfSAvLyBmb3IgcHJvcHNcblxuICAgICAgc2VsZi5lbWl0KCdzdHlsZScpO1xuICAgIH0gLy8gaWZcbiAgfVxuXG4gIGFuaV9wLnByb2dyZXNzID0gcGVyY2VudDtcbiAgcmV0dXJuIHBlcmNlbnQ7XG59XG5mdW5jdGlvbiB2YWxpZChzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PSBudWxsIHx8IGVuZCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChudW1iZXIkMShzdGFydCkgJiYgbnVtYmVyJDEoZW5kKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKHN0YXJ0ICYmIGVuZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gc3RhcnRBbmltYXRpb24oc2VsZiwgYW5pLCBub3csIGlzQ29yZSkge1xuICB2YXIgYW5pX3AgPSBhbmkuX3ByaXZhdGU7XG4gIGFuaV9wLnN0YXJ0ZWQgPSB0cnVlO1xuICBhbmlfcC5zdGFydFRpbWUgPSBub3cgLSBhbmlfcC5wcm9ncmVzcyAqIGFuaV9wLmR1cmF0aW9uO1xufVxuXG5mdW5jdGlvbiBzdGVwQWxsKG5vdywgY3kpIHtcbiAgdmFyIGVsZXMgPSBjeS5fcHJpdmF0ZS5hbmlFbGVzO1xuICB2YXIgZG9uZUVsZXMgPSBbXTtcbiAgZnVuY3Rpb24gc3RlcE9uZShlbGUsIGlzQ29yZSkge1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgY3VycmVudCA9IF9wLmFuaW1hdGlvbi5jdXJyZW50O1xuICAgIHZhciBxdWV1ZSA9IF9wLmFuaW1hdGlvbi5xdWV1ZTtcbiAgICB2YXIgcmFuQW5pcyA9IGZhbHNlO1xuXG4gICAgLy8gaWYgbm90aGluZyBjdXJyZW50bHkgYW5pbWF0aW5nLCBnZXQgc29tZXRoaW5nIGZyb20gdGhlIHF1ZXVlXG4gICAgaWYgKGN1cnJlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICB2YXIgbmV4dCA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICBpZiAobmV4dCkge1xuICAgICAgICBjdXJyZW50LnB1c2gobmV4dCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBjYWxsYmFja3MgPSBmdW5jdGlvbiBjYWxsYmFja3MoX2NhbGxiYWNrcykge1xuICAgICAgZm9yICh2YXIgaiA9IF9jYWxsYmFja3MubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgdmFyIGNiID0gX2NhbGxiYWNrc1tqXTtcbiAgICAgICAgY2IoKTtcbiAgICAgIH1cbiAgICAgIF9jYWxsYmFja3Muc3BsaWNlKDAsIF9jYWxsYmFja3MubGVuZ3RoKTtcbiAgICB9O1xuXG4gICAgLy8gc3RlcCBhbmQgcmVtb3ZlIGlmIGRvbmVcbiAgICBmb3IgKHZhciBpID0gY3VycmVudC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGFuaSA9IGN1cnJlbnRbaV07XG4gICAgICB2YXIgYW5pX3AgPSBhbmkuX3ByaXZhdGU7XG4gICAgICBpZiAoYW5pX3Auc3RvcHBlZCkge1xuICAgICAgICBjdXJyZW50LnNwbGljZShpLCAxKTtcbiAgICAgICAgYW5pX3AuaG9va2VkID0gZmFsc2U7XG4gICAgICAgIGFuaV9wLnBsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgYW5pX3Auc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICBjYWxsYmFja3MoYW5pX3AuZnJhbWVzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIWFuaV9wLnBsYXlpbmcgJiYgIWFuaV9wLmFwcGx5aW5nKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBhbiBhcHBseSgpIHdoaWxlIHBsYXlpbmcgc2hvdWxkbid0IGRvIGFueXRoaW5nXG4gICAgICBpZiAoYW5pX3AucGxheWluZyAmJiBhbmlfcC5hcHBseWluZykge1xuICAgICAgICBhbmlfcC5hcHBseWluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCFhbmlfcC5zdGFydGVkKSB7XG4gICAgICAgIHN0YXJ0QW5pbWF0aW9uKGVsZSwgYW5pLCBub3cpO1xuICAgICAgfVxuICAgICAgc3RlcCQxKGVsZSwgYW5pLCBub3csIGlzQ29yZSk7XG4gICAgICBpZiAoYW5pX3AuYXBwbHlpbmcpIHtcbiAgICAgICAgYW5pX3AuYXBwbHlpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrcyhhbmlfcC5mcmFtZXMpO1xuICAgICAgaWYgKGFuaV9wLnN0ZXAgIT0gbnVsbCkge1xuICAgICAgICBhbmlfcC5zdGVwKG5vdyk7XG4gICAgICB9XG4gICAgICBpZiAoYW5pLmNvbXBsZXRlZCgpKSB7XG4gICAgICAgIGN1cnJlbnQuc3BsaWNlKGksIDEpO1xuICAgICAgICBhbmlfcC5ob29rZWQgPSBmYWxzZTtcbiAgICAgICAgYW5pX3AucGxheWluZyA9IGZhbHNlO1xuICAgICAgICBhbmlfcC5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIGNhbGxiYWNrcyhhbmlfcC5jb21wbGV0ZXMpO1xuICAgICAgfVxuICAgICAgcmFuQW5pcyA9IHRydWU7XG4gICAgfVxuICAgIGlmICghaXNDb3JlICYmIGN1cnJlbnQubGVuZ3RoID09PSAwICYmIHF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZG9uZUVsZXMucHVzaChlbGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmFuQW5pcztcbiAgfSAvLyBzdGVwRWxlbWVudFxuXG4gIC8vIGhhbmRsZSBhbGwgZWxlc1xuICB2YXIgcmFuRWxlQW5pID0gZmFsc2U7XG4gIGZvciAodmFyIGUgPSAwOyBlIDwgZWxlcy5sZW5ndGg7IGUrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2VdO1xuICAgIHZhciBoYW5kbGVkVGhpc0VsZSA9IHN0ZXBPbmUoZWxlKTtcbiAgICByYW5FbGVBbmkgPSByYW5FbGVBbmkgfHwgaGFuZGxlZFRoaXNFbGU7XG4gIH0gLy8gZWFjaCBlbGVtZW50XG5cbiAgdmFyIHJhbkNvcmVBbmkgPSBzdGVwT25lKGN5LCB0cnVlKTtcblxuICAvLyBub3RpZnkgcmVuZGVyZXJcbiAgaWYgKHJhbkVsZUFuaSB8fCByYW5Db3JlQW5pKSB7XG4gICAgaWYgKGVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgY3kubm90aWZ5KCdkcmF3JywgZWxlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN5Lm5vdGlmeSgnZHJhdycpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlbW92ZSBlbGVtZW50cyBmcm9tIGxpc3Qgb2YgY3VycmVudGx5IGFuaW1hdGluZyBpZiBpdHMgcXVldWVzIGFyZSBlbXB0eVxuICBlbGVzLnVubWVyZ2UoZG9uZUVsZXMpO1xuICBjeS5lbWl0KCdzdGVwJyk7XG59IC8vIHN0ZXBBbGxcblxudmFyIGNvcmVmbiQ4ID0ge1xuICAvLyBwdWxsIGluIGFuaW1hdGlvbiBmdW5jdGlvbnNcbiAgYW5pbWF0ZTogZGVmaW5lLmFuaW1hdGUoKSxcbiAgYW5pbWF0aW9uOiBkZWZpbmUuYW5pbWF0aW9uKCksXG4gIGFuaW1hdGVkOiBkZWZpbmUuYW5pbWF0ZWQoKSxcbiAgY2xlYXJRdWV1ZTogZGVmaW5lLmNsZWFyUXVldWUoKSxcbiAgZGVsYXk6IGRlZmluZS5kZWxheSgpLFxuICBkZWxheUFuaW1hdGlvbjogZGVmaW5lLmRlbGF5QW5pbWF0aW9uKCksXG4gIHN0b3A6IGRlZmluZS5zdG9wKCksXG4gIGFkZFRvQW5pbWF0aW9uUG9vbDogZnVuY3Rpb24gYWRkVG9BbmltYXRpb25Qb29sKGVsZXMpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIGlmICghY3kuc3R5bGVFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIHNhdmUgY3ljbGVzIHdoZW4gbm8gc3R5bGUgdXNlZFxuXG4gICAgY3kuX3ByaXZhdGUuYW5pRWxlcy5tZXJnZShlbGVzKTtcbiAgfSxcbiAgc3RvcEFuaW1hdGlvbkxvb3A6IGZ1bmN0aW9uIHN0b3BBbmltYXRpb25Mb29wKCkge1xuICAgIHRoaXMuX3ByaXZhdGUuYW5pbWF0aW9uc1J1bm5pbmcgPSBmYWxzZTtcbiAgfSxcbiAgc3RhcnRBbmltYXRpb25Mb29wOiBmdW5jdGlvbiBzdGFydEFuaW1hdGlvbkxvb3AoKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICBjeS5fcHJpdmF0ZS5hbmltYXRpb25zUnVubmluZyA9IHRydWU7XG4gICAgaWYgKCFjeS5zdHlsZUVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gc2F2ZSBjeWNsZXMgd2hlbiBubyBzdHlsZSB1c2VkXG5cbiAgICAvLyBOQiB0aGUgYW5pbWF0aW9uIGxvb3Agd2lsbCBleGVjIGluIGhlYWRsZXNzIGVudmlyb25tZW50cyBpZiBzdHlsZSBlbmFibGVkXG4gICAgLy8gYW5kIGV4cGxpY2l0IGN5LmRlc3Ryb3koKSBpcyBuZWNlc3NhcnkgdG8gc3RvcCB0aGUgbG9vcFxuXG4gICAgZnVuY3Rpb24gaGVhZGxlc3NTdGVwKCkge1xuICAgICAgaWYgKCFjeS5fcHJpdmF0ZS5hbmltYXRpb25zUnVubmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gYW5pbWF0aW9uU3RlcChub3cpIHtcbiAgICAgICAgc3RlcEFsbChub3csIGN5KTtcbiAgICAgICAgaGVhZGxlc3NTdGVwKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIHJlbmRlcmVyID0gY3kucmVuZGVyZXIoKTtcbiAgICBpZiAocmVuZGVyZXIgJiYgcmVuZGVyZXIuYmVmb3JlUmVuZGVyKSB7XG4gICAgICAvLyBsZXQgdGhlIHJlbmRlcmVyIHNjaGVkdWxlIGFuaW1hdGlvbnNcbiAgICAgIHJlbmRlcmVyLmJlZm9yZVJlbmRlcihmdW5jdGlvbiByZW5kZXJlckFuaW1hdGlvblN0ZXAod2lsbERyYXcsIG5vdykge1xuICAgICAgICBzdGVwQWxsKG5vdywgY3kpO1xuICAgICAgfSwgcmVuZGVyZXIuYmVmb3JlUmVuZGVyUHJpb3JpdGllcy5hbmltYXRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbWFuYWdlIHRoZSBhbmltYXRpb24gbG9vcCBvdXJzZWx2ZXNcbiAgICAgIGhlYWRsZXNzU3RlcCgpOyAvLyBmaXJzdCBjYWxsXG4gICAgfVxuICB9XG59O1xuXG52YXIgZW1pdHRlck9wdGlvbnMgPSB7XG4gIHF1YWxpZmllckNvbXBhcmU6IGZ1bmN0aW9uIHF1YWxpZmllckNvbXBhcmUoc2VsZWN0b3IxLCBzZWxlY3RvcjIpIHtcbiAgICBpZiAoc2VsZWN0b3IxID09IG51bGwgfHwgc2VsZWN0b3IyID09IG51bGwpIHtcbiAgICAgIHJldHVybiBzZWxlY3RvcjEgPT0gbnVsbCAmJiBzZWxlY3RvcjIgPT0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNlbGVjdG9yMS5zYW1lVGV4dChzZWxlY3RvcjIpO1xuICAgIH1cbiAgfSxcbiAgZXZlbnRNYXRjaGVzOiBmdW5jdGlvbiBldmVudE1hdGNoZXMoY3ksIGxpc3RlbmVyLCBldmVudE9iaikge1xuICAgIHZhciBzZWxlY3RvciA9IGxpc3RlbmVyLnF1YWxpZmllcjtcbiAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGN5ICE9PSBldmVudE9iai50YXJnZXQgJiYgZWxlbWVudChldmVudE9iai50YXJnZXQpICYmIHNlbGVjdG9yLm1hdGNoZXMoZXZlbnRPYmoudGFyZ2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGFkZEV2ZW50RmllbGRzOiBmdW5jdGlvbiBhZGRFdmVudEZpZWxkcyhjeSwgZXZ0KSB7XG4gICAgZXZ0LmN5ID0gY3k7XG4gICAgZXZ0LnRhcmdldCA9IGN5O1xuICB9LFxuICBjYWxsYmFja0NvbnRleHQ6IGZ1bmN0aW9uIGNhbGxiYWNrQ29udGV4dChjeSwgbGlzdGVuZXIsIGV2ZW50T2JqKSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyLnF1YWxpZmllciAhPSBudWxsID8gZXZlbnRPYmoudGFyZ2V0IDogY3k7XG4gIH1cbn07XG52YXIgYXJnU2VsZWN0b3IgPSBmdW5jdGlvbiBhcmdTZWxlY3RvcihhcmcpIHtcbiAgaWYgKHN0cmluZyhhcmcpKSB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3RvcihhcmcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhcmc7XG4gIH1cbn07XG52YXIgZWxlc2ZuID0ge1xuICBjcmVhdGVFbWl0dGVyOiBmdW5jdGlvbiBjcmVhdGVFbWl0dGVyKCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgaWYgKCFfcC5lbWl0dGVyKSB7XG4gICAgICBfcC5lbWl0dGVyID0gbmV3IEVtaXR0ZXIoZW1pdHRlck9wdGlvbnMsIHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZW1pdHRlcjogZnVuY3Rpb24gZW1pdHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbWl0dGVyO1xuICB9LFxuICBvbjogZnVuY3Rpb24gb24oZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5vbihldmVudHMsIGFyZ1NlbGVjdG9yKHNlbGVjdG9yKSwgY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5yZW1vdmVMaXN0ZW5lcihldmVudHMsIGFyZ1NlbGVjdG9yKHNlbGVjdG9yKSwgY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICByZW1vdmVBbGxMaXN0ZW5lcnM6IGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycygpIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgb25lOiBmdW5jdGlvbiBvbmUoZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5vbmUoZXZlbnRzLCBhcmdTZWxlY3RvcihzZWxlY3RvciksIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgb25jZTogZnVuY3Rpb24gb25jZShldmVudHMsIHNlbGVjdG9yLCBjYWxsYmFjaykge1xuICAgIHRoaXMuZW1pdHRlcigpLm9uZShldmVudHMsIGFyZ1NlbGVjdG9yKHNlbGVjdG9yKSwgY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBlbWl0OiBmdW5jdGlvbiBlbWl0KGV2ZW50cywgZXh0cmFQYXJhbXMpIHtcbiAgICB0aGlzLmVtaXR0ZXIoKS5lbWl0KGV2ZW50cywgZXh0cmFQYXJhbXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBlbWl0QW5kTm90aWZ5OiBmdW5jdGlvbiBlbWl0QW5kTm90aWZ5KGV2ZW50LCBlbGVzKSB7XG4gICAgdGhpcy5lbWl0KGV2ZW50KTtcbiAgICB0aGlzLm5vdGlmeShldmVudCwgZWxlcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn07XG5kZWZpbmUuZXZlbnRBbGlhc2VzT24oZWxlc2ZuKTtcblxudmFyIGNvcmVmbiQ3ID0ge1xuICBwbmc6IGZ1bmN0aW9uIHBuZyhvcHRpb25zKSB7XG4gICAgdmFyIHJlbmRlcmVyID0gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlcjtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gcmVuZGVyZXIucG5nKG9wdGlvbnMpO1xuICB9LFxuICBqcGc6IGZ1bmN0aW9uIGpwZyhvcHRpb25zKSB7XG4gICAgdmFyIHJlbmRlcmVyID0gdGhpcy5fcHJpdmF0ZS5yZW5kZXJlcjtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLmJnID0gb3B0aW9ucy5iZyB8fCAnI2ZmZic7XG4gICAgcmV0dXJuIHJlbmRlcmVyLmpwZyhvcHRpb25zKTtcbiAgfVxufTtcbmNvcmVmbiQ3LmpwZWcgPSBjb3JlZm4kNy5qcGc7XG5cbnZhciBjb3JlZm4kNiA9IHtcbiAgbGF5b3V0OiBmdW5jdGlvbiBsYXlvdXQob3B0aW9ucykge1xuICAgIHZhciBjeSA9IHRoaXM7XG4gICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0xheW91dCBvcHRpb25zIG11c3QgYmUgc3BlY2lmaWVkIHRvIG1ha2UgYSBsYXlvdXQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubmFtZSA9PSBudWxsKSB7XG4gICAgICBlcnJvcignQSBgbmFtZWAgbXVzdCBiZSBzcGVjaWZpZWQgdG8gbWFrZSBhIGxheW91dCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgICB2YXIgTGF5b3V0ID0gY3kuZXh0ZW5zaW9uKCdsYXlvdXQnLCBuYW1lKTtcbiAgICBpZiAoTGF5b3V0ID09IG51bGwpIHtcbiAgICAgIGVycm9yKCdObyBzdWNoIGxheW91dCBgJyArIG5hbWUgKyAnYCBmb3VuZC4gIERpZCB5b3UgZm9yZ2V0IHRvIGltcG9ydCBpdCBhbmQgYGN5dG9zY2FwZS51c2UoKWAgaXQ/Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBlbGVzO1xuICAgIGlmIChzdHJpbmcob3B0aW9ucy5lbGVzKSkge1xuICAgICAgZWxlcyA9IGN5LiQob3B0aW9ucy5lbGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlcyA9IG9wdGlvbnMuZWxlcyAhPSBudWxsID8gb3B0aW9ucy5lbGVzIDogY3kuJCgpO1xuICAgIH1cbiAgICB2YXIgbGF5b3V0ID0gbmV3IExheW91dChleHRlbmQoe30sIG9wdGlvbnMsIHtcbiAgICAgIGN5OiBjeSxcbiAgICAgIGVsZXM6IGVsZXNcbiAgICB9KSk7XG4gICAgcmV0dXJuIGxheW91dDtcbiAgfVxufTtcbmNvcmVmbiQ2LmNyZWF0ZUxheW91dCA9IGNvcmVmbiQ2Lm1ha2VMYXlvdXQgPSBjb3JlZm4kNi5sYXlvdXQ7XG5cbnZhciBjb3JlZm4kNSA9IHtcbiAgbm90aWZ5OiBmdW5jdGlvbiBub3RpZnkoZXZlbnROYW1lLCBldmVudEVsZXMpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmICh0aGlzLmJhdGNoaW5nKCkpIHtcbiAgICAgIF9wLmJhdGNoTm90aWZpY2F0aW9ucyA9IF9wLmJhdGNoTm90aWZpY2F0aW9ucyB8fCB7fTtcbiAgICAgIHZhciBlbGVzID0gX3AuYmF0Y2hOb3RpZmljYXRpb25zW2V2ZW50TmFtZV0gPSBfcC5iYXRjaE5vdGlmaWNhdGlvbnNbZXZlbnROYW1lXSB8fCB0aGlzLmNvbGxlY3Rpb24oKTtcbiAgICAgIGlmIChldmVudEVsZXMgIT0gbnVsbCkge1xuICAgICAgICBlbGVzLm1lcmdlKGV2ZW50RWxlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm47IC8vIG5vdGlmaWNhdGlvbnMgYXJlIGRpc2FibGVkIGR1cmluZyBiYXRjaGluZ1xuICAgIH1cblxuICAgIGlmICghX3Aubm90aWZpY2F0aW9uc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGV4aXQgb24gZGlzYWJsZWRcblxuICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXIoKTtcblxuICAgIC8vIGV4aXQgaWYgZGVzdHJveSgpIGNhbGxlZCBvbiBjb3JlIG9yIHJlbmRlcmVyIGluIGJldHdlZW4gZnJhbWVzICMxNDk5ICMxNTI4XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkKCkgfHwgIXJlbmRlcmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlbmRlcmVyLm5vdGlmeShldmVudE5hbWUsIGV2ZW50RWxlcyk7XG4gIH0sXG4gIG5vdGlmaWNhdGlvbnM6IGZ1bmN0aW9uIG5vdGlmaWNhdGlvbnMoYm9vbCkge1xuICAgIHZhciBwID0gdGhpcy5fcHJpdmF0ZTtcbiAgICBpZiAoYm9vbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcC5ub3RpZmljYXRpb25zRW5hYmxlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcC5ub3RpZmljYXRpb25zRW5hYmxlZCA9IGJvb2wgPyB0cnVlIDogZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBub05vdGlmaWNhdGlvbnM6IGZ1bmN0aW9uIG5vTm90aWZpY2F0aW9ucyhjYWxsYmFjaykge1xuICAgIHRoaXMubm90aWZpY2F0aW9ucyhmYWxzZSk7XG4gICAgY2FsbGJhY2soKTtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnModHJ1ZSk7XG4gIH0sXG4gIGJhdGNoaW5nOiBmdW5jdGlvbiBiYXRjaGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5iYXRjaENvdW50ID4gMDtcbiAgfSxcbiAgc3RhcnRCYXRjaDogZnVuY3Rpb24gc3RhcnRCYXRjaCgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmIChfcC5iYXRjaENvdW50ID09IG51bGwpIHtcbiAgICAgIF9wLmJhdGNoQ291bnQgPSAwO1xuICAgIH1cbiAgICBpZiAoX3AuYmF0Y2hDb3VudCA9PT0gMCkge1xuICAgICAgX3AuYmF0Y2hTdHlsZUVsZXMgPSB0aGlzLmNvbGxlY3Rpb24oKTtcbiAgICAgIF9wLmJhdGNoTm90aWZpY2F0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBfcC5iYXRjaENvdW50Kys7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGVuZEJhdGNoOiBmdW5jdGlvbiBlbmRCYXRjaCgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmIChfcC5iYXRjaENvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgX3AuYmF0Y2hDb3VudC0tO1xuICAgIGlmIChfcC5iYXRjaENvdW50ID09PSAwKSB7XG4gICAgICAvLyB1cGRhdGUgc3R5bGUgZm9yIGRpcnR5IGVsZXNcbiAgICAgIF9wLmJhdGNoU3R5bGVFbGVzLnVwZGF0ZVN0eWxlKCk7XG4gICAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyKCk7XG5cbiAgICAgIC8vIG5vdGlmeSB0aGUgcmVuZGVyZXIgb2YgcXVldWVkIGVsZXMgYW5kIGV2ZW50IHR5cGVzXG4gICAgICBPYmplY3Qua2V5cyhfcC5iYXRjaE5vdGlmaWNhdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICB2YXIgZWxlcyA9IF9wLmJhdGNoTm90aWZpY2F0aW9uc1tldmVudE5hbWVdO1xuICAgICAgICBpZiAoZWxlcy5lbXB0eSgpKSB7XG4gICAgICAgICAgcmVuZGVyZXIubm90aWZ5KGV2ZW50TmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVuZGVyZXIubm90aWZ5KGV2ZW50TmFtZSwgZWxlcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgYmF0Y2g6IGZ1bmN0aW9uIGJhdGNoKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5zdGFydEJhdGNoKCk7XG4gICAgY2FsbGJhY2soKTtcbiAgICB0aGlzLmVuZEJhdGNoKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICBiYXRjaERhdGE6IGZ1bmN0aW9uIGJhdGNoRGF0YShtYXApIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIHJldHVybiB0aGlzLmJhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpZHMgPSBPYmplY3Qua2V5cyhtYXApO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGlkID0gaWRzW2ldO1xuICAgICAgICB2YXIgZGF0YSA9IG1hcFtpZF07XG4gICAgICAgIHZhciBlbGUgPSBjeS5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICAgIGVsZS5kYXRhKGRhdGEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xuXG52YXIgcmVuZGVyZXJEZWZhdWx0cyA9IGRlZmF1bHRzJGcoe1xuICBoaWRlRWRnZXNPblZpZXdwb3J0OiBmYWxzZSxcbiAgdGV4dHVyZU9uVmlld3BvcnQ6IGZhbHNlLFxuICBtb3Rpb25CbHVyOiBmYWxzZSxcbiAgbW90aW9uQmx1ck9wYWNpdHk6IDAuMDUsXG4gIHBpeGVsUmF0aW86IHVuZGVmaW5lZCxcbiAgZGVza3RvcFRhcFRocmVzaG9sZDogNCxcbiAgdG91Y2hUYXBUaHJlc2hvbGQ6IDgsXG4gIHdoZWVsU2Vuc2l0aXZpdHk6IDEsXG4gIGRlYnVnOiBmYWxzZSxcbiAgc2hvd0ZwczogZmFsc2Vcbn0pO1xudmFyIGNvcmVmbiQ0ID0ge1xuICByZW5kZXJUbzogZnVuY3Rpb24gcmVuZGVyVG8oY29udGV4dCwgem9vbSwgcGFuLCBweFJhdGlvKSB7XG4gICAgdmFyIHIgPSB0aGlzLl9wcml2YXRlLnJlbmRlcmVyO1xuICAgIHIucmVuZGVyVG8oY29udGV4dCwgem9vbSwgcGFuLCBweFJhdGlvKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmVuZGVyZXI6IGZ1bmN0aW9uIHJlbmRlcmVyKCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnJlbmRlcmVyO1xuICB9LFxuICBmb3JjZVJlbmRlcjogZnVuY3Rpb24gZm9yY2VSZW5kZXIoKSB7XG4gICAgdGhpcy5ub3RpZnkoJ2RyYXcnKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcmVzaXplOiBmdW5jdGlvbiByZXNpemUoKSB7XG4gICAgdGhpcy5pbnZhbGlkYXRlU2l6ZSgpO1xuICAgIHRoaXMuZW1pdEFuZE5vdGlmeSgncmVzaXplJyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGluaXRSZW5kZXJlcjogZnVuY3Rpb24gaW5pdFJlbmRlcmVyKG9wdGlvbnMpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIHZhciBSZW5kZXJlclByb3RvID0gY3kuZXh0ZW5zaW9uKCdyZW5kZXJlcicsIG9wdGlvbnMubmFtZSk7XG4gICAgaWYgKFJlbmRlcmVyUHJvdG8gPT0gbnVsbCkge1xuICAgICAgZXJyb3IoXCJDYW4gbm90IGluaXRpYWxpc2U6IE5vIHN1Y2ggcmVuZGVyZXIgYFwiLmNvbmNhdChvcHRpb25zLm5hbWUsIFwiYCBmb3VuZC4gRGlkIHlvdSBmb3JnZXQgdG8gaW1wb3J0IGl0IGFuZCBgY3l0b3NjYXBlLnVzZSgpYCBpdD9cIikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy53aGVlbFNlbnNpdGl2aXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHdhcm4oXCJZb3UgaGF2ZSBzZXQgYSBjdXN0b20gd2hlZWwgc2Vuc2l0aXZpdHkuICBUaGlzIHdpbGwgbWFrZSB5b3VyIGFwcCB6b29tIHVubmF0dXJhbGx5IHdoZW4gdXNpbmcgbWFpbnN0cmVhbSBtaWNlLiAgWW91IHNob3VsZCBjaGFuZ2UgdGhpcyB2YWx1ZSBmcm9tIHRoZSBkZWZhdWx0IG9ubHkgaWYgeW91IGNhbiBndWFyYW50ZWUgdGhhdCBhbGwgeW91ciB1c2VycyB3aWxsIHVzZSB0aGUgc2FtZSBoYXJkd2FyZSBhbmQgT1MgY29uZmlndXJhdGlvbiBhcyB5b3VyIGN1cnJlbnQgbWFjaGluZS5cIik7XG4gICAgfVxuICAgIHZhciByT3B0cyA9IHJlbmRlcmVyRGVmYXVsdHMob3B0aW9ucyk7XG4gICAgck9wdHMuY3kgPSBjeTtcbiAgICBjeS5fcHJpdmF0ZS5yZW5kZXJlciA9IG5ldyBSZW5kZXJlclByb3RvKHJPcHRzKTtcbiAgICB0aGlzLm5vdGlmeSgnaW5pdCcpO1xuICB9LFxuICBkZXN0cm95UmVuZGVyZXI6IGZ1bmN0aW9uIGRlc3Ryb3lSZW5kZXJlcigpIHtcbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIGN5Lm5vdGlmeSgnZGVzdHJveScpOyAvLyBkZXN0cm95IHRoZSByZW5kZXJlclxuXG4gICAgdmFyIGRvbUVsZSA9IGN5LmNvbnRhaW5lcigpO1xuICAgIGlmIChkb21FbGUpIHtcbiAgICAgIGRvbUVsZS5fY3lyZWcgPSBudWxsO1xuICAgICAgd2hpbGUgKGRvbUVsZS5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZG9tRWxlLnJlbW92ZUNoaWxkKGRvbUVsZS5jaGlsZE5vZGVzWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY3kuX3ByaXZhdGUucmVuZGVyZXIgPSBudWxsOyAvLyB0byBiZSBleHRyYSBzYWZlLCByZW1vdmUgdGhlIHJlZlxuICAgIGN5Lm11dGFibGVFbGVtZW50cygpLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgICAgX3AucnNjcmF0Y2ggPSB7fTtcbiAgICAgIF9wLnJzdHlsZSA9IHt9O1xuICAgICAgX3AuYW5pbWF0aW9uLmN1cnJlbnQgPSBbXTtcbiAgICAgIF9wLmFuaW1hdGlvbi5xdWV1ZSA9IFtdO1xuICAgIH0pO1xuICB9LFxuICBvblJlbmRlcjogZnVuY3Rpb24gb25SZW5kZXIoZm4pIHtcbiAgICByZXR1cm4gdGhpcy5vbigncmVuZGVyJywgZm4pO1xuICB9LFxuICBvZmZSZW5kZXI6IGZ1bmN0aW9uIG9mZlJlbmRlcihmbikge1xuICAgIHJldHVybiB0aGlzLm9mZigncmVuZGVyJywgZm4pO1xuICB9XG59O1xuY29yZWZuJDQuaW52YWxpZGF0ZURpbWVuc2lvbnMgPSBjb3JlZm4kNC5yZXNpemU7XG5cbnZhciBjb3JlZm4kMyA9IHtcbiAgLy8gZ2V0IGEgY29sbGVjdGlvblxuICAvLyAtIGVtcHR5IGNvbGxlY3Rpb24gb24gbm8gYXJnc1xuICAvLyAtIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgaW4gdGhlIGdyYXBoIG9uIHNlbGVjdG9yIGFyZ1xuICAvLyAtIGd1YXJhbnRlZSBhIHJldHVybmVkIGNvbGxlY3Rpb24gd2hlbiBlbGVtZW50cyBvciBjb2xsZWN0aW9uIHNwZWNpZmllZFxuICBjb2xsZWN0aW9uOiBmdW5jdGlvbiBjb2xsZWN0aW9uKGVsZXMsIG9wdHMpIHtcbiAgICBpZiAoc3RyaW5nKGVsZXMpKSB7XG4gICAgICByZXR1cm4gdGhpcy4kKGVsZXMpO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihlbGVzKSkge1xuICAgICAgcmV0dXJuIGVsZXMuY29sbGVjdGlvbigpO1xuICAgIH0gZWxzZSBpZiAoYXJyYXkoZWxlcykpIHtcbiAgICAgIGlmICghb3B0cykge1xuICAgICAgICBvcHRzID0ge307XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IENvbGxlY3Rpb24odGhpcywgZWxlcywgb3B0cy51bmlxdWUsIG9wdHMucmVtb3ZlZCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbih0aGlzKTtcbiAgfSxcbiAgbm9kZXM6IGZ1bmN0aW9uIG5vZGVzKHNlbGVjdG9yKSB7XG4gICAgdmFyIG5vZGVzID0gdGhpcy4kKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiBlbGUuaXNOb2RlKCk7XG4gICAgfSk7XG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gbm9kZXMuZmlsdGVyKHNlbGVjdG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGVzO1xuICB9LFxuICBlZGdlczogZnVuY3Rpb24gZWRnZXMoc2VsZWN0b3IpIHtcbiAgICB2YXIgZWRnZXMgPSB0aGlzLiQoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgcmV0dXJuIGVsZS5pc0VkZ2UoKTtcbiAgICB9KTtcbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBlZGdlcy5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gZWRnZXM7XG4gIH0sXG4gIC8vIHNlYXJjaCB0aGUgZ3JhcGggbGlrZSBqUXVlcnlcbiAgJDogZnVuY3Rpb24gJChzZWxlY3Rvcikge1xuICAgIHZhciBlbGVzID0gdGhpcy5fcHJpdmF0ZS5lbGVtZW50cztcbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBlbGVzLmZpbHRlcihzZWxlY3Rvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGVzLnNwYXduU2VsZigpO1xuICAgIH1cbiAgfSxcbiAgbXV0YWJsZUVsZW1lbnRzOiBmdW5jdGlvbiBtdXRhYmxlRWxlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZWxlbWVudHM7XG4gIH1cbn07XG5cbi8vIGFsaWFzZXNcbmNvcmVmbiQzLmVsZW1lbnRzID0gY29yZWZuJDMuZmlsdGVyID0gY29yZWZuJDMuJDtcblxudmFyIHN0eWZuJDggPSB7fTtcblxuLy8ga2V5cyBmb3Igc3R5bGUgYmxvY2tzLCBlLmcuIHR0ZmZ0dFxudmFyIFRSVUUgPSAndCc7XG52YXIgRkFMU0UgPSAnZic7XG5cbi8vIChwb3RlbnRpYWxseSBleHBlbnNpdmUgY2FsY3VsYXRpb24pXG4vLyBhcHBseSB0aGUgc3R5bGUgdG8gdGhlIGVsZW1lbnQgYmFzZWQgb25cbi8vIC0gaXRzIGJ5cGFzc1xuLy8gLSB3aGF0IHNlbGVjdG9ycyBtYXRjaCBpdFxuc3R5Zm4kOC5hcHBseSA9IGZ1bmN0aW9uIChlbGVzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIF9wID0gc2VsZi5fcHJpdmF0ZTtcbiAgdmFyIGN5ID0gX3AuY3k7XG4gIHZhciB1cGRhdGVkRWxlcyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgZm9yICh2YXIgaWUgPSAwOyBpZSA8IGVsZXMubGVuZ3RoOyBpZSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaWVdO1xuICAgIHZhciBjeHRNZXRhID0gc2VsZi5nZXRDb250ZXh0TWV0YShlbGUpO1xuICAgIGlmIChjeHRNZXRhLmVtcHR5KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGN4dFN0eWxlID0gc2VsZi5nZXRDb250ZXh0U3R5bGUoY3h0TWV0YSk7XG4gICAgdmFyIGFwcCA9IHNlbGYuYXBwbHlDb250ZXh0U3R5bGUoY3h0TWV0YSwgY3h0U3R5bGUsIGVsZSk7XG4gICAgaWYgKGVsZS5fcHJpdmF0ZS5hcHBsaWVkSW5pdFN0eWxlKSB7XG4gICAgICBzZWxmLnVwZGF0ZVRyYW5zaXRpb25zKGVsZSwgYXBwLmRpZmZQcm9wcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZS5fcHJpdmF0ZS5hcHBsaWVkSW5pdFN0eWxlID0gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIGhpbnRzRGlmZiA9IHNlbGYudXBkYXRlU3R5bGVIaW50cyhlbGUpO1xuICAgIGlmIChoaW50c0RpZmYpIHtcbiAgICAgIHVwZGF0ZWRFbGVzLnB1c2goZWxlKTtcbiAgICB9XG4gIH0gLy8gZm9yIGVsZW1lbnRzXG5cbiAgcmV0dXJuIHVwZGF0ZWRFbGVzO1xufTtcbnN0eWZuJDguZ2V0UHJvcGVydGllc0RpZmYgPSBmdW5jdGlvbiAob2xkQ3h0S2V5LCBuZXdDeHRLZXkpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY2FjaGUgPSBzZWxmLl9wcml2YXRlLnByb3BEaWZmcyA9IHNlbGYuX3ByaXZhdGUucHJvcERpZmZzIHx8IHt9O1xuICB2YXIgZHVhbEN4dEtleSA9IG9sZEN4dEtleSArICctJyArIG5ld0N4dEtleTtcbiAgdmFyIGNhY2hlZFZhbCA9IGNhY2hlW2R1YWxDeHRLZXldO1xuICBpZiAoY2FjaGVkVmFsKSB7XG4gICAgcmV0dXJuIGNhY2hlZFZhbDtcbiAgfVxuICB2YXIgZGlmZlByb3BzID0gW107XG4gIHZhciBhZGRlZFByb3AgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN4dCA9IHNlbGZbaV07XG4gICAgdmFyIG9sZEhhc0N4dCA9IG9sZEN4dEtleVtpXSA9PT0gVFJVRTtcbiAgICB2YXIgbmV3SGFzQ3h0ID0gbmV3Q3h0S2V5W2ldID09PSBUUlVFO1xuICAgIHZhciBjeHRIYXNEaWZmZWQgPSBvbGRIYXNDeHQgIT09IG5ld0hhc0N4dDtcbiAgICB2YXIgY3h0SGFzTWFwcGVkUHJvcHMgPSBjeHQubWFwcGVkUHJvcGVydGllcy5sZW5ndGggPiAwO1xuICAgIGlmIChjeHRIYXNEaWZmZWQgfHwgbmV3SGFzQ3h0ICYmIGN4dEhhc01hcHBlZFByb3BzKSB7XG4gICAgICB2YXIgcHJvcHMgPSB2b2lkIDA7XG4gICAgICBpZiAoY3h0SGFzRGlmZmVkICYmIGN4dEhhc01hcHBlZFByb3BzKSB7XG4gICAgICAgIHByb3BzID0gY3h0LnByb3BlcnRpZXM7IC8vIHN1ZmZpY2VzIGIvYyBtYXBwZWRQcm9wZXJ0aWVzIGlzIGEgc3Vic2V0IG9mIHByb3BlcnRpZXNcbiAgICAgIH0gZWxzZSBpZiAoY3h0SGFzRGlmZmVkKSB7XG4gICAgICAgIHByb3BzID0gY3h0LnByb3BlcnRpZXM7IC8vIG5lZWQgdG8gY2hlY2sgdGhlbSBhbGxcbiAgICAgIH0gZWxzZSBpZiAoY3h0SGFzTWFwcGVkUHJvcHMpIHtcbiAgICAgICAgcHJvcHMgPSBjeHQubWFwcGVkUHJvcGVydGllczsgLy8gb25seSBuZWVkIHRvIGNoZWNrIG1hcHBlZFxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByb3BzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBwcm9wID0gcHJvcHNbal07XG4gICAgICAgIHZhciBuYW1lID0gcHJvcC5uYW1lO1xuXG4gICAgICAgIC8vIGlmIGEgbGF0ZXIgY29udGV4dCBvdmVycmlkZXMgdGhpcyBwcm9wZXJ0eSwgdGhlbiB0aGUgZmFjdCB0aGF0IHRoaXMgY29udGV4dCBoYXMgc3dpdGNoZWQvZGlmZmVkIGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgIC8vIChzZW1pIGV4cGVuc2l2ZSBjaGVjayBzaW5jZSBpdCBtYWtlcyB0aGlzIGZ1bmN0aW9uIE8obl4yKSBvbiBjb250ZXh0IGxlbmd0aCwgYnV0IHdvcnRoIGl0IHNpbmNlIG92ZXJhbGwgcmVzdWx0XG4gICAgICAgIC8vIGlzIGNhY2hlZClcbiAgICAgICAgdmFyIGxhdGVyQ3h0T3ZlcnJpZGVzID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGsgPSBpICsgMTsgayA8IHNlbGYubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICB2YXIgbGF0ZXJDeHQgPSBzZWxmW2tdO1xuICAgICAgICAgIHZhciBoYXNMYXRlckN4dCA9IG5ld0N4dEtleVtrXSA9PT0gVFJVRTtcbiAgICAgICAgICBpZiAoIWhhc0xhdGVyQ3h0KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IC8vIGNhbid0IG92ZXJyaWRlIHVubGVzcyB0aGUgY29udGV4dCBpcyBhY3RpdmVcblxuICAgICAgICAgIGxhdGVyQ3h0T3ZlcnJpZGVzID0gbGF0ZXJDeHQucHJvcGVydGllc1twcm9wLm5hbWVdICE9IG51bGw7XG4gICAgICAgICAgaWYgKGxhdGVyQ3h0T3ZlcnJpZGVzKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9IC8vIGV4aXQgZWFybHkgYXMgbG9uZyBhcyBvbmUgbGF0ZXIgY29udGV4dCBvdmVycmlkZXNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYWRkZWRQcm9wW25hbWVdICYmICFsYXRlckN4dE92ZXJyaWRlcykge1xuICAgICAgICAgIGFkZGVkUHJvcFtuYW1lXSA9IHRydWU7XG4gICAgICAgICAgZGlmZlByb3BzLnB1c2gobmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gZm9yIHByb3BzXG4gICAgfSAvLyBpZlxuICB9IC8vIGZvciBjb250ZXh0c1xuXG4gIGNhY2hlW2R1YWxDeHRLZXldID0gZGlmZlByb3BzO1xuICByZXR1cm4gZGlmZlByb3BzO1xufTtcbnN0eWZuJDguZ2V0Q29udGV4dE1ldGEgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGN4dEtleSA9ICcnO1xuICB2YXIgZGlmZlByb3BzO1xuICB2YXIgcHJldktleSA9IGVsZS5fcHJpdmF0ZS5zdHlsZUN4dEtleSB8fCAnJztcblxuICAvLyBnZXQgdGhlIGN4dCBrZXlcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNvbnRleHQgPSBzZWxmW2ldO1xuICAgIHZhciBjb250ZXh0U2VsZWN0b3JNYXRjaGVzID0gY29udGV4dC5zZWxlY3RvciAmJiBjb250ZXh0LnNlbGVjdG9yLm1hdGNoZXMoZWxlKTsgLy8gTkI6IGNvbnRleHQuc2VsZWN0b3IgbWF5IGJlIG51bGwgZm9yICdjb3JlJ1xuXG4gICAgaWYgKGNvbnRleHRTZWxlY3Rvck1hdGNoZXMpIHtcbiAgICAgIGN4dEtleSArPSBUUlVFO1xuICAgIH0gZWxzZSB7XG4gICAgICBjeHRLZXkgKz0gRkFMU0U7XG4gICAgfVxuICB9IC8vIGZvciBjb250ZXh0XG5cbiAgZGlmZlByb3BzID0gc2VsZi5nZXRQcm9wZXJ0aWVzRGlmZihwcmV2S2V5LCBjeHRLZXkpO1xuICBlbGUuX3ByaXZhdGUuc3R5bGVDeHRLZXkgPSBjeHRLZXk7XG4gIHJldHVybiB7XG4gICAga2V5OiBjeHRLZXksXG4gICAgZGlmZlByb3BOYW1lczogZGlmZlByb3BzLFxuICAgIGVtcHR5OiBkaWZmUHJvcHMubGVuZ3RoID09PSAwXG4gIH07XG59O1xuXG4vLyBnZXRzIGEgY29tcHV0ZWQgZWxlIHN0eWxlIG9iamVjdCBiYXNlZCBvbiBtYXRjaGVkIGNvbnRleHRzXG5zdHlmbiQ4LmdldENvbnRleHRTdHlsZSA9IGZ1bmN0aW9uIChjeHRNZXRhKSB7XG4gIHZhciBjeHRLZXkgPSBjeHRNZXRhLmtleTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY3h0U3R5bGVzID0gdGhpcy5fcHJpdmF0ZS5jb250ZXh0U3R5bGVzID0gdGhpcy5fcHJpdmF0ZS5jb250ZXh0U3R5bGVzIHx8IHt9O1xuXG4gIC8vIGlmIGFscmVhZHkgY29tcHV0ZWQgc3R5bGUsIHJldHVybmVkIGNhY2hlZCBjb3B5XG4gIGlmIChjeHRTdHlsZXNbY3h0S2V5XSkge1xuICAgIHJldHVybiBjeHRTdHlsZXNbY3h0S2V5XTtcbiAgfVxuICB2YXIgc3R5bGUgPSB7XG4gICAgX3ByaXZhdGU6IHtcbiAgICAgIGtleTogY3h0S2V5XG4gICAgfVxuICB9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY3h0ID0gc2VsZltpXTtcbiAgICB2YXIgaGFzQ3h0ID0gY3h0S2V5W2ldID09PSBUUlVFO1xuICAgIGlmICghaGFzQ3h0KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBjeHQucHJvcGVydGllcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIHByb3AgPSBjeHQucHJvcGVydGllc1tqXTtcbiAgICAgIHN0eWxlW3Byb3AubmFtZV0gPSBwcm9wO1xuICAgIH1cbiAgfVxuICBjeHRTdHlsZXNbY3h0S2V5XSA9IHN0eWxlO1xuICByZXR1cm4gc3R5bGU7XG59O1xuc3R5Zm4kOC5hcHBseUNvbnRleHRTdHlsZSA9IGZ1bmN0aW9uIChjeHRNZXRhLCBjeHRTdHlsZSwgZWxlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGRpZmZQcm9wcyA9IGN4dE1ldGEuZGlmZlByb3BOYW1lcztcbiAgdmFyIHJldERpZmZQcm9wcyA9IHt9O1xuICB2YXIgdHlwZXMgPSBzZWxmLnR5cGVzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGRpZmZQcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkaWZmUHJvcE5hbWUgPSBkaWZmUHJvcHNbaV07XG4gICAgdmFyIGN4dFByb3AgPSBjeHRTdHlsZVtkaWZmUHJvcE5hbWVdO1xuICAgIHZhciBlbGVQcm9wID0gZWxlLnBzdHlsZShkaWZmUHJvcE5hbWUpO1xuICAgIGlmICghY3h0UHJvcCkge1xuICAgICAgLy8gbm8gY29udGV4dCBwcm9wIG1lYW5zIGRlbGV0ZVxuICAgICAgaWYgKCFlbGVQcm9wKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBubyBleGlzdGluZyBwcm9wIG1lYW5zIG5vdGhpbmcgbmVlZHMgdG8gYmUgcmVtb3ZlZFxuICAgICAgICAvLyBuYiBhZmZlY3RzIGluaXRpYWwgYXBwbGljYXRpb24gb24gbWFwcGVkIHZhbHVlcyBsaWtlIGNvbnRyb2wtcG9pbnQtZGlzdGFuY2VzXG4gICAgICB9IGVsc2UgaWYgKGVsZVByb3AuYnlwYXNzKSB7XG4gICAgICAgIGN4dFByb3AgPSB7XG4gICAgICAgICAgbmFtZTogZGlmZlByb3BOYW1lLFxuICAgICAgICAgIGRlbGV0ZUJ5cGFzc2VkOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjeHRQcm9wID0ge1xuICAgICAgICAgIG5hbWU6IGRpZmZQcm9wTmFtZSxcbiAgICAgICAgICBcImRlbGV0ZVwiOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2F2ZSBjeWNsZXMgd2hlbiB0aGUgY29udGV4dCBwcm9wIGRvZXNuJ3QgbmVlZCB0byBiZSBhcHBsaWVkXG4gICAgaWYgKGVsZVByb3AgPT09IGN4dFByb3ApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIHNhdmUgY3ljbGVzIHdoZW4gYSBtYXBwZWQgY29udGV4dCBwcm9wIGRvZXNuJ3QgbmVlZCB0byBiZSBhcHBsaWVkXG4gICAgaWYgKGN4dFByb3AubWFwcGVkID09PSB0eXBlcy5mbiAvLyBjb250ZXh0IHByb3AgaXMgZnVuY3Rpb24gbWFwcGVyXG4gICAgJiYgZWxlUHJvcCAhPSBudWxsIC8vIHNvbWUgcHJvcHMgY2FuIGJlIG51bGwgZXZlbiBieSBkZWZhdWx0IChlLmcuIGEgcHJvcCB0aGF0IG92ZXJyaWRlcyBhbm90aGVyIG9uZSlcbiAgICAmJiBlbGVQcm9wLm1hcHBpbmcgIT0gbnVsbCAvLyBlbGUgcHJvcCBpcyBhIGNvbmNyZXRlIHZhbHVlIGZyb20gZnJvbSBhIG1hcHBlclxuICAgICYmIGVsZVByb3AubWFwcGluZy52YWx1ZSA9PT0gY3h0UHJvcC52YWx1ZSAvLyB0aGUgY3VycmVudCBwcm9wIG9uIHRoZSBlbGUgaXMgYSBmbGF0IHByb3AgdmFsdWUgZm9yIHRoZSBmdW5jdGlvbiBtYXBwZXJcbiAgICApIHtcbiAgICAgIC8vIE5CIGRvbid0IHdyaXRlIHRvIGN4dFByb3AsIGFzIGl0J3Mgc2hhcmVkIGFtb25nIGVsZXMgKHN0b3JlZCBpbiBzdHlsZXNoZWV0KVxuICAgICAgdmFyIG1hcHBpbmcgPSBlbGVQcm9wLm1hcHBpbmc7IC8vIGNhbiB3cml0ZSB0byBtYXBwaW5nLCBhcyBpdCdzIGEgcGVyLWVsZSBjb3B5XG4gICAgICB2YXIgZm5WYWx1ZSA9IG1hcHBpbmcuZm5WYWx1ZSA9IGN4dFByb3AudmFsdWUoZWxlKTsgLy8gdGVtcG9yYXJpbHkgY2FjaGUgdGhlIHZhbHVlIGluIGNhc2Ugb2YgYSBtaXNzXG5cbiAgICAgIGlmIChmblZhbHVlID09PSBtYXBwaW5nLnByZXZGblZhbHVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgcmV0RGlmZlByb3AgPSByZXREaWZmUHJvcHNbZGlmZlByb3BOYW1lXSA9IHtcbiAgICAgIHByZXY6IGVsZVByb3BcbiAgICB9O1xuICAgIHNlbGYuYXBwbHlQYXJzZWRQcm9wZXJ0eShlbGUsIGN4dFByb3ApO1xuICAgIHJldERpZmZQcm9wLm5leHQgPSBlbGUucHN0eWxlKGRpZmZQcm9wTmFtZSk7XG4gICAgaWYgKHJldERpZmZQcm9wLm5leHQgJiYgcmV0RGlmZlByb3AubmV4dC5ieXBhc3MpIHtcbiAgICAgIHJldERpZmZQcm9wLm5leHQgPSByZXREaWZmUHJvcC5uZXh0LmJ5cGFzc2VkO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGRpZmZQcm9wczogcmV0RGlmZlByb3BzXG4gIH07XG59O1xuc3R5Zm4kOC51cGRhdGVTdHlsZUhpbnRzID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHByb3BOYW1lcyA9IHNlbGYucHJvcGVydHlHcm91cE5hbWVzO1xuICB2YXIgcHJvcEdyS2V5cyA9IHNlbGYucHJvcGVydHlHcm91cEtleXM7XG4gIHZhciBwcm9wSGFzaCA9IGZ1bmN0aW9uIHByb3BIYXNoKGVsZSwgcHJvcE5hbWVzLCBzZWVkS2V5KSB7XG4gICAgcmV0dXJuIHNlbGYuZ2V0UHJvcGVydGllc0hhc2goZWxlLCBwcm9wTmFtZXMsIHNlZWRLZXkpO1xuICB9O1xuICB2YXIgb2xkU3R5bGVLZXkgPSBfcC5zdHlsZUtleTtcbiAgaWYgKGVsZS5yZW1vdmVkKCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGlzTm9kZSA9IF9wLmdyb3VwID09PSAnbm9kZXMnO1xuXG4gIC8vIGdldCB0aGUgc3R5bGUga2V5IGhhc2hlcyBwZXIgcHJvcCBncm91cFxuICAvLyBidXQgbGF6aWx5IC0tIG9ubHkgdXNlIG5vbi1kZWZhdWx0IHByb3AgdmFsdWVzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGhhc2hlc1xuICAvL1xuXG4gIHZhciBvdmVycmlkZGVuU3R5bGVzID0gZWxlLl9wcml2YXRlLnN0eWxlO1xuICBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhvdmVycmlkZGVuU3R5bGVzKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wR3JLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGdyS2V5ID0gcHJvcEdyS2V5c1tpXTtcbiAgICBfcC5zdHlsZUtleXNbZ3JLZXldID0gW0RFRkFVTFRfSEFTSF9TRUVELCBERUZBVUxUX0hBU0hfU0VFRF9BTFRdO1xuICB9XG4gIHZhciB1cGRhdGVHcktleTEgPSBmdW5jdGlvbiB1cGRhdGVHcktleTEodmFsLCBncktleSkge1xuICAgIHJldHVybiBfcC5zdHlsZUtleXNbZ3JLZXldWzBdID0gaGFzaEludCh2YWwsIF9wLnN0eWxlS2V5c1tncktleV1bMF0pO1xuICB9O1xuICB2YXIgdXBkYXRlR3JLZXkyID0gZnVuY3Rpb24gdXBkYXRlR3JLZXkyKHZhbCwgZ3JLZXkpIHtcbiAgICByZXR1cm4gX3Auc3R5bGVLZXlzW2dyS2V5XVsxXSA9IGhhc2hJbnRBbHQodmFsLCBfcC5zdHlsZUtleXNbZ3JLZXldWzFdKTtcbiAgfTtcbiAgdmFyIHVwZGF0ZUdyS2V5ID0gZnVuY3Rpb24gdXBkYXRlR3JLZXkodmFsLCBncktleSkge1xuICAgIHVwZGF0ZUdyS2V5MSh2YWwsIGdyS2V5KTtcbiAgICB1cGRhdGVHcktleTIodmFsLCBncktleSk7XG4gIH07XG4gIHZhciB1cGRhdGVHcktleVdTdHIgPSBmdW5jdGlvbiB1cGRhdGVHcktleVdTdHIoc3RyVmFsLCBncktleSkge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3RyVmFsLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgY2ggPSBzdHJWYWwuY2hhckNvZGVBdChqKTtcbiAgICAgIHVwZGF0ZUdyS2V5MShjaCwgZ3JLZXkpO1xuICAgICAgdXBkYXRlR3JLZXkyKGNoLCBncktleSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIC0gaGFzaGluZyB3b3JrcyBvbiAzMiBiaXQgaW50cyBiL2Mgd2UgdXNlIGJpdHdpc2Ugb3BzXG4gIC8vIC0gc21hbGwgbnVtYmVycyBnZXQgY3V0IG9mZiAoZS5nLiAwLjEyMyBpcyBzZWVuIGFzIDAgYnkgdGhlIGhhc2hpbmcgZnVuY3Rpb24pXG4gIC8vIC0gcmFpc2UgdXAgc21hbGwgbnVtYmVycyBzbyBtb3JlIHNpZ25pZmljYW50IGRpZ2l0cyBhcmUgc2VlbiBieSBoYXNoaW5nXG4gIC8vIC0gbWFrZSBzbWFsbCBudW1iZXJzIGxhcmdlciB0aGFuIGEgbm9ybWFsIHZhbHVlIHRvIGF2b2lkIGNvbGxpc2lvbnNcbiAgLy8gLSB3b3JrcyBpbiBwcmFjdGljZSBhbmQgaXQncyByZWxhdGl2ZWx5IGNoZWFwXG4gIHZhciBOID0gMjAwMDAwMDAwMDtcbiAgdmFyIGNsZWFuTnVtID0gZnVuY3Rpb24gY2xlYW5OdW0odmFsKSB7XG4gICAgcmV0dXJuIC0xMjggPCB2YWwgJiYgdmFsIDwgMTI4ICYmIE1hdGguZmxvb3IodmFsKSAhPT0gdmFsID8gTiAtICh2YWwgKiAxMDI0IHwgMCkgOiB2YWw7XG4gIH07XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBwcm9wTmFtZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIG5hbWUgPSBwcm9wTmFtZXNbX2ldO1xuICAgIHZhciBwYXJzZWRQcm9wID0gb3ZlcnJpZGRlblN0eWxlc1tuYW1lXTtcbiAgICBpZiAocGFyc2VkUHJvcCA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIHByb3BJbmZvID0gdGhpcy5wcm9wZXJ0aWVzW25hbWVdO1xuICAgIHZhciB0eXBlID0gcHJvcEluZm8udHlwZTtcbiAgICB2YXIgX2dyS2V5ID0gcHJvcEluZm8uZ3JvdXBLZXk7XG4gICAgdmFyIG5vcm1hbGl6ZWROdW1iZXJWYWwgPSB2b2lkIDA7XG4gICAgaWYgKHByb3BJbmZvLmhhc2hPdmVycmlkZSAhPSBudWxsKSB7XG4gICAgICBub3JtYWxpemVkTnVtYmVyVmFsID0gcHJvcEluZm8uaGFzaE92ZXJyaWRlKGVsZSwgcGFyc2VkUHJvcCk7XG4gICAgfSBlbHNlIGlmIChwYXJzZWRQcm9wLnBmVmFsdWUgIT0gbnVsbCkge1xuICAgICAgbm9ybWFsaXplZE51bWJlclZhbCA9IHBhcnNlZFByb3AucGZWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBtaWdodCBub3QgYmUgYSBudW1iZXIgaWYgaXQgYWxsb3dzIGVudW1zXG4gICAgdmFyIG51bWJlclZhbCA9IHByb3BJbmZvLmVudW1zID09IG51bGwgPyBwYXJzZWRQcm9wLnZhbHVlIDogbnVsbDtcbiAgICB2YXIgaGF2ZU5vcm1OdW0gPSBub3JtYWxpemVkTnVtYmVyVmFsICE9IG51bGw7XG4gICAgdmFyIGhhdmVVbml0ZWROdW0gPSBudW1iZXJWYWwgIT0gbnVsbDtcbiAgICB2YXIgaGF2ZU51bSA9IGhhdmVOb3JtTnVtIHx8IGhhdmVVbml0ZWROdW07XG4gICAgdmFyIHVuaXRzID0gcGFyc2VkUHJvcC51bml0cztcblxuICAgIC8vIG51bWJlcnMgYXJlIGNoZWFwZXIgdG8gaGFzaCB0aGFuIHN0cmluZ3NcbiAgICAvLyAxIGhhc2ggb3AgdnMgbiBoYXNoIG9wcyAoZm9yIGxlbmd0aCBuIHN0cmluZylcbiAgICBpZiAodHlwZS5udW1iZXIgJiYgaGF2ZU51bSAmJiAhdHlwZS5tdWx0aXBsZSkge1xuICAgICAgdmFyIHYgPSBoYXZlTm9ybU51bSA/IG5vcm1hbGl6ZWROdW1iZXJWYWwgOiBudW1iZXJWYWw7XG4gICAgICB1cGRhdGVHcktleShjbGVhbk51bSh2KSwgX2dyS2V5KTtcbiAgICAgIGlmICghaGF2ZU5vcm1OdW0gJiYgdW5pdHMgIT0gbnVsbCkge1xuICAgICAgICB1cGRhdGVHcktleVdTdHIodW5pdHMsIF9ncktleSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwZGF0ZUdyS2V5V1N0cihwYXJzZWRQcm9wLnN0clZhbHVlLCBfZ3JLZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIG92ZXJhbGwgc3R5bGUga2V5XG4gIC8vXG5cbiAgdmFyIGhhc2ggPSBbREVGQVVMVF9IQVNIX1NFRUQsIERFRkFVTFRfSEFTSF9TRUVEX0FMVF07XG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHByb3BHcktleXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBfZ3JLZXkyID0gcHJvcEdyS2V5c1tfaTJdO1xuICAgIHZhciBnckhhc2ggPSBfcC5zdHlsZUtleXNbX2dyS2V5Ml07XG4gICAgaGFzaFswXSA9IGhhc2hJbnQoZ3JIYXNoWzBdLCBoYXNoWzBdKTtcbiAgICBoYXNoWzFdID0gaGFzaEludEFsdChnckhhc2hbMV0sIGhhc2hbMV0pO1xuICB9XG4gIF9wLnN0eWxlS2V5ID0gY29tYmluZUhhc2hlcyhoYXNoWzBdLCBoYXNoWzFdKTtcblxuICAvLyBsYWJlbCBkaW1zXG4gIC8vXG5cbiAgdmFyIHNrID0gX3Auc3R5bGVLZXlzO1xuICBfcC5sYWJlbERpbXNLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkoc2subGFiZWxEaW1lbnNpb25zKTtcbiAgdmFyIGxhYmVsS2V5cyA9IHByb3BIYXNoKGVsZSwgWydsYWJlbCddLCBzay5sYWJlbERpbWVuc2lvbnMpO1xuICBfcC5sYWJlbEtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShsYWJlbEtleXMpO1xuICBfcC5sYWJlbFN0eWxlS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KGhhc2hBcnJheXMoc2suY29tbW9uTGFiZWwsIGxhYmVsS2V5cykpO1xuICBpZiAoIWlzTm9kZSkge1xuICAgIHZhciBzb3VyY2VMYWJlbEtleXMgPSBwcm9wSGFzaChlbGUsIFsnc291cmNlLWxhYmVsJ10sIHNrLmxhYmVsRGltZW5zaW9ucyk7XG4gICAgX3Auc291cmNlTGFiZWxLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkoc291cmNlTGFiZWxLZXlzKTtcbiAgICBfcC5zb3VyY2VMYWJlbFN0eWxlS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KGhhc2hBcnJheXMoc2suY29tbW9uTGFiZWwsIHNvdXJjZUxhYmVsS2V5cykpO1xuICAgIHZhciB0YXJnZXRMYWJlbEtleXMgPSBwcm9wSGFzaChlbGUsIFsndGFyZ2V0LWxhYmVsJ10sIHNrLmxhYmVsRGltZW5zaW9ucyk7XG4gICAgX3AudGFyZ2V0TGFiZWxLZXkgPSBjb21iaW5lSGFzaGVzQXJyYXkodGFyZ2V0TGFiZWxLZXlzKTtcbiAgICBfcC50YXJnZXRMYWJlbFN0eWxlS2V5ID0gY29tYmluZUhhc2hlc0FycmF5KGhhc2hBcnJheXMoc2suY29tbW9uTGFiZWwsIHRhcmdldExhYmVsS2V5cykpO1xuICB9XG5cbiAgLy8gbm9kZVxuICAvL1xuXG4gIGlmIChpc05vZGUpIHtcbiAgICB2YXIgX3Akc3R5bGVLZXlzID0gX3Auc3R5bGVLZXlzLFxuICAgICAgbm9kZUJvZHkgPSBfcCRzdHlsZUtleXMubm9kZUJvZHksXG4gICAgICBub2RlQm9yZGVyID0gX3Akc3R5bGVLZXlzLm5vZGVCb3JkZXIsXG4gICAgICBub2RlT3V0bGluZSA9IF9wJHN0eWxlS2V5cy5ub2RlT3V0bGluZSxcbiAgICAgIGJhY2tncm91bmRJbWFnZSA9IF9wJHN0eWxlS2V5cy5iYWNrZ3JvdW5kSW1hZ2UsXG4gICAgICBjb21wb3VuZCA9IF9wJHN0eWxlS2V5cy5jb21wb3VuZCxcbiAgICAgIHBpZSA9IF9wJHN0eWxlS2V5cy5waWU7XG4gICAgdmFyIG5vZGVLZXlzID0gW25vZGVCb2R5LCBub2RlQm9yZGVyLCBub2RlT3V0bGluZSwgYmFja2dyb3VuZEltYWdlLCBjb21wb3VuZCwgcGllXS5maWx0ZXIoZnVuY3Rpb24gKGspIHtcbiAgICAgIHJldHVybiBrICE9IG51bGw7XG4gICAgfSkucmVkdWNlKGhhc2hBcnJheXMsIFtERUZBVUxUX0hBU0hfU0VFRCwgREVGQVVMVF9IQVNIX1NFRURfQUxUXSk7XG4gICAgX3Aubm9kZUtleSA9IGNvbWJpbmVIYXNoZXNBcnJheShub2RlS2V5cyk7XG4gICAgX3AuaGFzUGllID0gcGllICE9IG51bGwgJiYgcGllWzBdICE9PSBERUZBVUxUX0hBU0hfU0VFRCAmJiBwaWVbMV0gIT09IERFRkFVTFRfSEFTSF9TRUVEX0FMVDtcbiAgfVxuICByZXR1cm4gb2xkU3R5bGVLZXkgIT09IF9wLnN0eWxlS2V5O1xufTtcbnN0eWZuJDguY2xlYXJTdHlsZUhpbnRzID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIF9wLnN0eWxlQ3h0S2V5ID0gJyc7XG4gIF9wLnN0eWxlS2V5cyA9IHt9O1xuICBfcC5zdHlsZUtleSA9IG51bGw7XG4gIF9wLmxhYmVsS2V5ID0gbnVsbDtcbiAgX3AubGFiZWxTdHlsZUtleSA9IG51bGw7XG4gIF9wLnNvdXJjZUxhYmVsS2V5ID0gbnVsbDtcbiAgX3Auc291cmNlTGFiZWxTdHlsZUtleSA9IG51bGw7XG4gIF9wLnRhcmdldExhYmVsS2V5ID0gbnVsbDtcbiAgX3AudGFyZ2V0TGFiZWxTdHlsZUtleSA9IG51bGw7XG4gIF9wLm5vZGVLZXkgPSBudWxsO1xuICBfcC5oYXNQaWUgPSBudWxsO1xufTtcblxuLy8gYXBwbHkgYSBwcm9wZXJ0eSB0byB0aGUgc3R5bGUgKGZvciBpbnRlcm5hbCB1c2UpXG4vLyByZXR1cm5zIHdoZXRoZXIgYXBwbGljYXRpb24gd2FzIHN1Y2Nlc3NmdWxcbi8vXG4vLyBub3csIHRoaXMgZnVuY3Rpb24gZmxhdHRlbnMgdGhlIHByb3BlcnR5LCBhbmQgaGVyZSdzIGhvdzpcbi8vXG4vLyBmb3IgcGFyc2VkUHJvcDp7IGJ5cGFzczogdHJ1ZSwgZGVsZXRlQnlwYXNzOiB0cnVlIH1cbi8vIG5vIHByb3BlcnR5IGlzIGdlbmVyYXRlZCwgaW5zdGVhZCB0aGUgYnlwYXNzIHByb3BlcnR5IGluIHRoZVxuLy8gZWxlbWVudCdzIHN0eWxlIGlzIHJlcGxhY2VkIGJ5IHdoYXQncyBwb2ludGVkIHRvIGJ5IHRoZSBgYnlwYXNzZWRgXG4vLyBmaWVsZCBpbiB0aGUgYnlwYXNzIHByb3BlcnR5IChpLmUuIHJlc3RvcmluZyB0aGUgcHJvcGVydHkgdGhlXG4vLyBieXBhc3Mgd2FzIG92ZXJyaWRpbmcpXG4vL1xuLy8gZm9yIHBhcnNlZFByb3A6eyBtYXBwZWQ6IHRydXRoeSB9XG4vLyB0aGUgZ2VuZXJhdGVkIGZsYXR0ZW5lZFByb3A6eyBtYXBwaW5nOiBwcm9wIH1cbi8vXG4vLyBmb3IgcGFyc2VkUHJvcDp7IGJ5cGFzczogdHJ1ZSB9XG4vLyB0aGUgZ2VuZXJhdGVkIGZsYXR0ZW5lZFByb3A6eyBieXBhc3NlZDogcGFyc2VkUHJvcCB9XG5zdHlmbiQ4LmFwcGx5UGFyc2VkUHJvcGVydHkgPSBmdW5jdGlvbiAoZWxlLCBwYXJzZWRQcm9wKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHByb3AgPSBwYXJzZWRQcm9wO1xuICB2YXIgc3R5bGUgPSBlbGUuX3ByaXZhdGUuc3R5bGU7XG4gIHZhciBmbGF0UHJvcDtcbiAgdmFyIHR5cGVzID0gc2VsZi50eXBlcztcbiAgdmFyIHR5cGUgPSBzZWxmLnByb3BlcnRpZXNbcHJvcC5uYW1lXS50eXBlO1xuICB2YXIgcHJvcElzQnlwYXNzID0gcHJvcC5ieXBhc3M7XG4gIHZhciBvcmlnUHJvcCA9IHN0eWxlW3Byb3AubmFtZV07XG4gIHZhciBvcmlnUHJvcElzQnlwYXNzID0gb3JpZ1Byb3AgJiYgb3JpZ1Byb3AuYnlwYXNzO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBmbGF0UHJvcE1hcHBpbmcgPSAnbWFwcGluZyc7XG4gIHZhciBnZXRWYWwgPSBmdW5jdGlvbiBnZXRWYWwocCkge1xuICAgIGlmIChwID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAocC5wZlZhbHVlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBwLnBmVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwLnZhbHVlO1xuICAgIH1cbiAgfTtcbiAgdmFyIGNoZWNrVHJpZ2dlcnMgPSBmdW5jdGlvbiBjaGVja1RyaWdnZXJzKCkge1xuICAgIHZhciBmcm9tVmFsID0gZ2V0VmFsKG9yaWdQcm9wKTtcbiAgICB2YXIgdG9WYWwgPSBnZXRWYWwocHJvcCk7XG4gICAgc2VsZi5jaGVja1RyaWdnZXJzKGVsZSwgcHJvcC5uYW1lLCBmcm9tVmFsLCB0b1ZhbCk7XG4gIH07XG5cbiAgLy8gZWRnZSBzYW5pdHkgY2hlY2tzIHRvIHByZXZlbnQgdGhlIGNsaWVudCBmcm9tIG1ha2luZyBzZXJpb3VzIG1pc3Rha2VzXG4gIGlmIChwYXJzZWRQcm9wLm5hbWUgPT09ICdjdXJ2ZS1zdHlsZScgJiYgZWxlLmlzRWRnZSgpICYmIChcbiAgLy8gbG9vcHMgbXVzdCBiZSBidW5kbGVkIGJlemllcnNcbiAgcGFyc2VkUHJvcC52YWx1ZSAhPT0gJ2JlemllcicgJiYgZWxlLmlzTG9vcCgpIHx8XG4gIC8vIGVkZ2VzIGNvbm5lY3RlZCB0byBjb21wb3VuZCBub2RlcyBjYW4gbm90IGJlIGhheXN0YWNrc1xuICBwYXJzZWRQcm9wLnZhbHVlID09PSAnaGF5c3RhY2snICYmIChlbGUuc291cmNlKCkuaXNQYXJlbnQoKSB8fCBlbGUudGFyZ2V0KCkuaXNQYXJlbnQoKSkpKSB7XG4gICAgcHJvcCA9IHBhcnNlZFByb3AgPSB0aGlzLnBhcnNlKHBhcnNlZFByb3AubmFtZSwgJ2JlemllcicsIHByb3BJc0J5cGFzcyk7XG4gIH1cbiAgaWYgKHByb3BbXCJkZWxldGVcIl0pIHtcbiAgICAvLyBkZWxldGUgdGhlIHByb3BlcnR5IGFuZCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgb24gZmFsc2V5IHZhbHVlXG4gICAgc3R5bGVbcHJvcC5uYW1lXSA9IHVuZGVmaW5lZDtcbiAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHByb3AuZGVsZXRlQnlwYXNzZWQpIHtcbiAgICAvLyBkZWxldGUgdGhlIHByb3BlcnR5IHRoYXQgdGhlXG4gICAgaWYgKCFvcmlnUHJvcCkge1xuICAgICAgY2hlY2tUcmlnZ2VycygpO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIGNhbid0IGRlbGV0ZSBpZiBubyBwcm9wXG4gICAgfSBlbHNlIGlmIChvcmlnUHJvcC5ieXBhc3MpIHtcbiAgICAgIC8vIGRlbGV0ZSBieXBhc3NlZFxuICAgICAgb3JpZ1Byb3AuYnlwYXNzZWQgPSB1bmRlZmluZWQ7XG4gICAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyB3ZSdyZSB1bnN1Y2Nlc3NmdWwgZGVsZXRpbmcgdGhlIGJ5cGFzc2VkXG4gICAgfVxuICB9XG5cbiAgLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBkZWxldGUgdGhlIGN1cnJlbnQgYnlwYXNzXG4gIGlmIChwcm9wLmRlbGV0ZUJ5cGFzcykge1xuICAgIC8vIHRoZW4gdGhpcyBwcm9wZXJ0eSBpcyBqdXN0IGhlcmUgdG8gaW5kaWNhdGUgd2UgbmVlZCB0byBkZWxldGVcbiAgICBpZiAoIW9yaWdQcm9wKSB7XG4gICAgICBjaGVja1RyaWdnZXJzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gcHJvcGVydHkgaXMgYWxyZWFkeSBub3QgZGVmaW5lZFxuICAgIH0gZWxzZSBpZiAob3JpZ1Byb3AuYnlwYXNzKSB7XG4gICAgICAvLyB0aGVuIHJlcGxhY2UgdGhlIGJ5cGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBvcmlnaW5hbFxuICAgICAgLy8gYmVjYXVzZSB0aGUgYnlwYXNzZWQgcHJvcGVydHkgd2FzIGFscmVhZHkgYXBwbGllZCAoYW5kIHRoZXJlZm9yZSBwYXJzZWQpLCB3ZSBjYW4ganVzdCByZXBsYWNlIGl0IChubyByZWFwcGx5aW5nIG5lY2Vzc2FyeSlcbiAgICAgIHN0eWxlW3Byb3AubmFtZV0gPSBvcmlnUHJvcC5ieXBhc3NlZDtcbiAgICAgIGNoZWNrVHJpZ2dlcnMoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIHdlJ3JlIHVuc3VjY2Vzc2Z1bCBkZWxldGluZyB0aGUgYnlwYXNzXG4gICAgfVxuICB9XG5cbiAgdmFyIHByaW50TWFwcGluZ0VyciA9IGZ1bmN0aW9uIHByaW50TWFwcGluZ0VycigpIHtcbiAgICB3YXJuKCdEbyBub3QgYXNzaWduIG1hcHBpbmdzIHRvIGVsZW1lbnRzIHdpdGhvdXQgY29ycmVzcG9uZGluZyBkYXRhIChpLmUuIGVsZSBgJyArIGVsZS5pZCgpICsgJ2AgaGFzIG5vIG1hcHBpbmcgZm9yIHByb3BlcnR5IGAnICsgcHJvcC5uYW1lICsgJ2Agd2l0aCBkYXRhIGZpZWxkIGAnICsgcHJvcC5maWVsZCArICdgKTsgdHJ5IGEgYFsnICsgcHJvcC5maWVsZCArICddYCBzZWxlY3RvciB0byBsaW1pdCBzY29wZSB0byBlbGVtZW50cyB3aXRoIGAnICsgcHJvcC5maWVsZCArICdgIGRlZmluZWQnKTtcbiAgfTtcblxuICAvLyBwdXQgdGhlIHByb3BlcnR5IGluIHRoZSBzdHlsZSBvYmplY3RzXG4gIHN3aXRjaCAocHJvcC5tYXBwZWQpIHtcbiAgICAvLyBmbGF0dGVuIHRoZSBwcm9wZXJ0eSBpZiBtYXBwZWRcbiAgICBjYXNlIHR5cGVzLm1hcERhdGE6XG4gICAgICB7XG4gICAgICAgIC8vIGZsYXR0ZW4gdGhlIGZpZWxkIChlLmcuIGRhdGEuZm9vLmJhcilcbiAgICAgICAgdmFyIGZpZWxkcyA9IHByb3AuZmllbGQuc3BsaXQoJy4nKTtcbiAgICAgICAgdmFyIGZpZWxkVmFsID0gX3AuZGF0YTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoICYmIGZpZWxkVmFsOyBpKyspIHtcbiAgICAgICAgICB2YXIgZmllbGQgPSBmaWVsZHNbaV07XG4gICAgICAgICAgZmllbGRWYWwgPSBmaWVsZFZhbFtmaWVsZF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpZWxkVmFsID09IG51bGwpIHtcbiAgICAgICAgICBwcmludE1hcHBpbmdFcnIoKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBlcmNlbnQ7XG4gICAgICAgIGlmICghbnVtYmVyJDEoZmllbGRWYWwpKSB7XG4gICAgICAgICAgLy8gdGhlbiBkb24ndCBhcHBseSBhbmQgZmFsbCBiYWNrIG9uIHRoZSBleGlzdGluZyBzdHlsZVxuICAgICAgICAgIHdhcm4oJ0RvIG5vdCB1c2UgY29udGludW91cyBtYXBwZXJzIHdpdGhvdXQgc3BlY2lmeWluZyBudW1lcmljIGRhdGEgKGkuZS4gYCcgKyBwcm9wLmZpZWxkICsgJzogJyArIGZpZWxkVmFsICsgJ2AgZm9yIGAnICsgZWxlLmlkKCkgKyAnYCBpcyBub24tbnVtZXJpYyknKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGZpZWxkV2lkdGggPSBwcm9wLmZpZWxkTWF4IC0gcHJvcC5maWVsZE1pbjtcbiAgICAgICAgICBpZiAoZmllbGRXaWR0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gc2FmZXR5IGNoZWNrIC0tIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkgYXMgbm8gcHJvcHMgb2YgemVybyByYW5nZSBzaG91bGQgYmUgcGFzc2VkIGhlcmVcbiAgICAgICAgICAgIHBlcmNlbnQgPSAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZXJjZW50ID0gKGZpZWxkVmFsIC0gcHJvcC5maWVsZE1pbikgLyBmaWVsZFdpZHRoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0byBib3VuZCBwZXJjZW50IHZhbHVlXG4gICAgICAgIGlmIChwZXJjZW50IDwgMCkge1xuICAgICAgICAgIHBlcmNlbnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHBlcmNlbnQgPiAxKSB7XG4gICAgICAgICAgcGVyY2VudCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUuY29sb3IpIHtcbiAgICAgICAgICB2YXIgcjEgPSBwcm9wLnZhbHVlTWluWzBdO1xuICAgICAgICAgIHZhciByMiA9IHByb3AudmFsdWVNYXhbMF07XG4gICAgICAgICAgdmFyIGcxID0gcHJvcC52YWx1ZU1pblsxXTtcbiAgICAgICAgICB2YXIgZzIgPSBwcm9wLnZhbHVlTWF4WzFdO1xuICAgICAgICAgIHZhciBiMSA9IHByb3AudmFsdWVNaW5bMl07XG4gICAgICAgICAgdmFyIGIyID0gcHJvcC52YWx1ZU1heFsyXTtcbiAgICAgICAgICB2YXIgYTEgPSBwcm9wLnZhbHVlTWluWzNdID09IG51bGwgPyAxIDogcHJvcC52YWx1ZU1pblszXTtcbiAgICAgICAgICB2YXIgYTIgPSBwcm9wLnZhbHVlTWF4WzNdID09IG51bGwgPyAxIDogcHJvcC52YWx1ZU1heFszXTtcbiAgICAgICAgICB2YXIgY2xyID0gW01hdGgucm91bmQocjEgKyAocjIgLSByMSkgKiBwZXJjZW50KSwgTWF0aC5yb3VuZChnMSArIChnMiAtIGcxKSAqIHBlcmNlbnQpLCBNYXRoLnJvdW5kKGIxICsgKGIyIC0gYjEpICogcGVyY2VudCksIE1hdGgucm91bmQoYTEgKyAoYTIgLSBhMSkgKiBwZXJjZW50KV07XG4gICAgICAgICAgZmxhdFByb3AgPSB7XG4gICAgICAgICAgICAvLyBjb2xvdXJzIGFyZSBzaW1wbGUsIHNvIGp1c3QgY3JlYXRlIHRoZSBmbGF0IHByb3BlcnR5IGluc3RlYWQgb2YgZXhwZW5zaXZlIHN0cmluZyBwYXJzaW5nXG4gICAgICAgICAgICBieXBhc3M6IHByb3AuYnlwYXNzLFxuICAgICAgICAgICAgLy8gd2UncmUgYSBieXBhc3MgaWYgdGhlIG1hcHBpbmcgcHJvcGVydHkgaXMgYSBieXBhc3NcbiAgICAgICAgICAgIG5hbWU6IHByb3AubmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiBjbHIsXG4gICAgICAgICAgICBzdHJWYWx1ZTogJ3JnYignICsgY2xyWzBdICsgJywgJyArIGNsclsxXSArICcsICcgKyBjbHJbMl0gKyAnKSdcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUubnVtYmVyKSB7XG4gICAgICAgICAgdmFyIGNhbGNWYWx1ZSA9IHByb3AudmFsdWVNaW4gKyAocHJvcC52YWx1ZU1heCAtIHByb3AudmFsdWVNaW4pICogcGVyY2VudDtcbiAgICAgICAgICBmbGF0UHJvcCA9IHRoaXMucGFyc2UocHJvcC5uYW1lLCBjYWxjVmFsdWUsIHByb3AuYnlwYXNzLCBmbGF0UHJvcE1hcHBpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gY2FuIG9ubHkgbWFwIHRvIGNvbG91cnMgYW5kIG51bWJlcnNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmxhdFByb3ApIHtcbiAgICAgICAgICAvLyBpZiB3ZSBjYW4ndCBmbGF0dGVuIHRoZSBwcm9wZXJ0eSwgdGhlbiBkb24ndCBhcHBseSB0aGUgcHJvcGVydHkgYW5kIGZhbGwgYmFjayBvbiB0aGUgZXhpc3Rpbmcgc3R5bGVcbiAgICAgICAgICBwcmludE1hcHBpbmdFcnIoKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZmxhdFByb3AubWFwcGluZyA9IHByb3A7IC8vIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIG1hcHBpbmdcbiAgICAgICAgcHJvcCA9IGZsYXRQcm9wOyAvLyB0aGUgZmxhdHRlbmVkIChtYXBwZWQpIHByb3BlcnR5IGlzIHRoZSBvbmUgd2Ugd2FudFxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgLy8gZGlyZWN0IG1hcHBpbmdcbiAgICBjYXNlIHR5cGVzLmRhdGE6XG4gICAgICB7XG4gICAgICAgIC8vIGZsYXR0ZW4gdGhlIGZpZWxkIChlLmcuIGRhdGEuZm9vLmJhcilcbiAgICAgICAgdmFyIF9maWVsZHMgPSBwcm9wLmZpZWxkLnNwbGl0KCcuJyk7XG4gICAgICAgIHZhciBfZmllbGRWYWwgPSBfcC5kYXRhO1xuICAgICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBfZmllbGRzLmxlbmd0aCAmJiBfZmllbGRWYWw7IF9pMysrKSB7XG4gICAgICAgICAgdmFyIF9maWVsZCA9IF9maWVsZHNbX2kzXTtcbiAgICAgICAgICBfZmllbGRWYWwgPSBfZmllbGRWYWxbX2ZpZWxkXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2ZpZWxkVmFsICE9IG51bGwpIHtcbiAgICAgICAgICBmbGF0UHJvcCA9IHRoaXMucGFyc2UocHJvcC5uYW1lLCBfZmllbGRWYWwsIHByb3AuYnlwYXNzLCBmbGF0UHJvcE1hcHBpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZmxhdFByb3ApIHtcbiAgICAgICAgICAvLyBpZiB3ZSBjYW4ndCBmbGF0dGVuIHRoZSBwcm9wZXJ0eSwgdGhlbiBkb24ndCBhcHBseSBhbmQgZmFsbCBiYWNrIG9uIHRoZSBleGlzdGluZyBzdHlsZVxuICAgICAgICAgIHByaW50TWFwcGluZ0VycigpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmbGF0UHJvcC5tYXBwaW5nID0gcHJvcDsgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgbWFwcGluZ1xuICAgICAgICBwcm9wID0gZmxhdFByb3A7IC8vIHRoZSBmbGF0dGVuZWQgKG1hcHBlZCkgcHJvcGVydHkgaXMgdGhlIG9uZSB3ZSB3YW50XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgY2FzZSB0eXBlcy5mbjpcbiAgICAgIHtcbiAgICAgICAgdmFyIGZuID0gcHJvcC52YWx1ZTtcbiAgICAgICAgdmFyIGZuUmV0VmFsID0gcHJvcC5mblZhbHVlICE9IG51bGwgPyBwcm9wLmZuVmFsdWUgOiBmbihlbGUpOyAvLyBjaGVjayBmb3IgY2FjaGVkIHZhbHVlIGJlZm9yZSBjYWxsaW5nIGZ1bmN0aW9uXG5cbiAgICAgICAgcHJvcC5wcmV2Rm5WYWx1ZSA9IGZuUmV0VmFsO1xuICAgICAgICBpZiAoZm5SZXRWYWwgPT0gbnVsbCkge1xuICAgICAgICAgIHdhcm4oJ0N1c3RvbSBmdW5jdGlvbiBtYXBwZXJzIG1heSBub3QgcmV0dXJuIG51bGwgKGkuZS4gYCcgKyBwcm9wLm5hbWUgKyAnYCBmb3IgZWxlIGAnICsgZWxlLmlkKCkgKyAnYCBpcyBudWxsKScpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmbGF0UHJvcCA9IHRoaXMucGFyc2UocHJvcC5uYW1lLCBmblJldFZhbCwgcHJvcC5ieXBhc3MsIGZsYXRQcm9wTWFwcGluZyk7XG4gICAgICAgIGlmICghZmxhdFByb3ApIHtcbiAgICAgICAgICB3YXJuKCdDdXN0b20gZnVuY3Rpb24gbWFwcGVycyBtYXkgbm90IHJldHVybiBpbnZhbGlkIHZhbHVlcyBmb3IgdGhlIHByb3BlcnR5IHR5cGUgKGkuZS4gYCcgKyBwcm9wLm5hbWUgKyAnYCBmb3IgZWxlIGAnICsgZWxlLmlkKCkgKyAnYCBpcyBpbnZhbGlkKScpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmbGF0UHJvcC5tYXBwaW5nID0gY29weShwcm9wKTsgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgbWFwcGluZ1xuICAgICAgICBwcm9wID0gZmxhdFByb3A7IC8vIHRoZSBmbGF0dGVuZWQgKG1hcHBlZCkgcHJvcGVydHkgaXMgdGhlIG9uZSB3ZSB3YW50XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICBicmVhaztcbiAgICAvLyBqdXN0IHNldCB0aGUgcHJvcGVydHlcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gbm90IGEgdmFsaWQgbWFwcGluZ1xuICB9XG5cbiAgLy8gaWYgdGhlIHByb3BlcnR5IGlzIGEgYnlwYXNzIHByb3BlcnR5LCB0aGVuIGxpbmsgdGhlIHJlc3VsdGFudCBwcm9wZXJ0eSB0byB0aGUgb3JpZ2luYWwgb25lXG4gIGlmIChwcm9wSXNCeXBhc3MpIHtcbiAgICBpZiAob3JpZ1Byb3BJc0J5cGFzcykge1xuICAgICAgLy8gdGhlbiB0aGlzIGJ5cGFzcyBvdmVycmlkZXMgdGhlIGV4aXN0aW5nIG9uZVxuICAgICAgcHJvcC5ieXBhc3NlZCA9IG9yaWdQcm9wLmJ5cGFzc2VkOyAvLyBzdGVhbCBieXBhc3NlZCBwcm9wIGZyb20gb2xkIGJ5cGFzc1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGVuIGxpbmsgdGhlIG9yaWcgcHJvcCB0byB0aGUgbmV3IGJ5cGFzc1xuICAgICAgcHJvcC5ieXBhc3NlZCA9IG9yaWdQcm9wO1xuICAgIH1cbiAgICBzdHlsZVtwcm9wLm5hbWVdID0gcHJvcDsgLy8gYW5kIHNldFxuICB9IGVsc2Uge1xuICAgIC8vIHByb3AgaXMgbm90IGJ5cGFzc1xuICAgIGlmIChvcmlnUHJvcElzQnlwYXNzKSB7XG4gICAgICAvLyB0aGVuIGtlZXAgdGhlIG9yaWcgcHJvcCAoc2luY2UgaXQncyBhIGJ5cGFzcykgYW5kIGxpbmsgdG8gdGhlIG5ldyBwcm9wXG4gICAgICBvcmlnUHJvcC5ieXBhc3NlZCA9IHByb3A7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZW4ganVzdCByZXBsYWNlIHRoZSBvbGQgcHJvcCB3aXRoIHRoZSBuZXcgb25lXG4gICAgICBzdHlsZVtwcm9wLm5hbWVdID0gcHJvcDtcbiAgICB9XG4gIH1cbiAgY2hlY2tUcmlnZ2VycygpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5zdHlmbiQ4LmNsZWFuRWxlbWVudHMgPSBmdW5jdGlvbiAoZWxlcywga2VlcEJ5cGFzc2VzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHRoaXMuY2xlYXJTdHlsZUhpbnRzKGVsZSk7XG4gICAgZWxlLmRpcnR5Q29tcG91bmRCb3VuZHNDYWNoZSgpO1xuICAgIGVsZS5kaXJ0eUJvdW5kaW5nQm94Q2FjaGUoKTtcbiAgICBpZiAoIWtlZXBCeXBhc3Nlcykge1xuICAgICAgZWxlLl9wcml2YXRlLnN0eWxlID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdHlsZSA9IGVsZS5fcHJpdmF0ZS5zdHlsZTtcbiAgICAgIHZhciBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhzdHlsZSk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByb3BOYW1lcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgcHJvcE5hbWUgPSBwcm9wTmFtZXNbal07XG4gICAgICAgIHZhciBlbGVQcm9wID0gc3R5bGVbcHJvcE5hbWVdO1xuICAgICAgICBpZiAoZWxlUHJvcCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKGVsZVByb3AuYnlwYXNzKSB7XG4gICAgICAgICAgICBlbGVQcm9wLmJ5cGFzc2VkID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3R5bGVbcHJvcE5hbWVdID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbi8vIHVwZGF0ZXMgdGhlIHZpc3VhbCBzdHlsZSBmb3IgYWxsIGVsZW1lbnRzICh1c2VmdWwgZm9yIG1hbnVhbCBzdHlsZSBtb2RpZmljYXRpb24gYWZ0ZXIgaW5pdClcbnN0eWZuJDgudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICB2YXIgZWxlcyA9IGN5Lm11dGFibGVFbGVtZW50cygpO1xuICBlbGVzLnVwZGF0ZVN0eWxlKCk7XG59O1xuXG4vLyBkaWZmUHJvcHMgOiB7IG5hbWUgPT4geyBwcmV2LCBuZXh0IH0gfVxuc3R5Zm4kOC51cGRhdGVUcmFuc2l0aW9ucyA9IGZ1bmN0aW9uIChlbGUsIGRpZmZQcm9wcykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHByb3BzID0gZWxlLnBzdHlsZSgndHJhbnNpdGlvbi1wcm9wZXJ0eScpLnZhbHVlO1xuICB2YXIgZHVyYXRpb24gPSBlbGUucHN0eWxlKCd0cmFuc2l0aW9uLWR1cmF0aW9uJykucGZWYWx1ZTtcbiAgdmFyIGRlbGF5ID0gZWxlLnBzdHlsZSgndHJhbnNpdGlvbi1kZWxheScpLnBmVmFsdWU7XG4gIGlmIChwcm9wcy5sZW5ndGggPiAwICYmIGR1cmF0aW9uID4gMCkge1xuICAgIHZhciBzdHlsZSA9IHt9O1xuXG4gICAgLy8gYnVpbGQgdXAgdGhlIHN0eWxlIHRvIGFuaW1hdGUgdG93YXJkc1xuICAgIHZhciBhbnlQcmV2ID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wc1tpXTtcbiAgICAgIHZhciBzdHlQcm9wID0gZWxlLnBzdHlsZShwcm9wKTtcbiAgICAgIHZhciBkaWZmUHJvcCA9IGRpZmZQcm9wc1twcm9wXTtcbiAgICAgIGlmICghZGlmZlByb3ApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgcHJldlByb3AgPSBkaWZmUHJvcC5wcmV2O1xuICAgICAgdmFyIGZyb21Qcm9wID0gcHJldlByb3A7XG4gICAgICB2YXIgdG9Qcm9wID0gZGlmZlByb3AubmV4dCAhPSBudWxsID8gZGlmZlByb3AubmV4dCA6IHN0eVByb3A7XG4gICAgICB2YXIgZGlmZiA9IGZhbHNlO1xuICAgICAgdmFyIGluaXRWYWwgPSB2b2lkIDA7XG4gICAgICB2YXIgaW5pdER0ID0gMC4wMDAwMDE7IC8vIGRlbHRhIHRpbWUgJSB2YWx1ZSBmb3IgaW5pdFZhbCAoYWxsb3dzIGFuaW1hdGluZyBvdXQgb2YgaW5pdCB6ZXJvIG9wYWNpdHkpXG5cbiAgICAgIGlmICghZnJvbVByb3ApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnNpZGVyIHB4IHZhbHVlc1xuICAgICAgaWYgKG51bWJlciQxKGZyb21Qcm9wLnBmVmFsdWUpICYmIG51bWJlciQxKHRvUHJvcC5wZlZhbHVlKSkge1xuICAgICAgICBkaWZmID0gdG9Qcm9wLnBmVmFsdWUgLSBmcm9tUHJvcC5wZlZhbHVlOyAvLyBub256ZXJvIGlzIHRydXRoeVxuICAgICAgICBpbml0VmFsID0gZnJvbVByb3AucGZWYWx1ZSArIGluaXREdCAqIGRpZmY7XG5cbiAgICAgICAgLy8gY29uc2lkZXIgbnVtZXJpY2FsIHZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChudW1iZXIkMShmcm9tUHJvcC52YWx1ZSkgJiYgbnVtYmVyJDEodG9Qcm9wLnZhbHVlKSkge1xuICAgICAgICBkaWZmID0gdG9Qcm9wLnZhbHVlIC0gZnJvbVByb3AudmFsdWU7IC8vIG5vbnplcm8gaXMgdHJ1dGh5XG4gICAgICAgIGluaXRWYWwgPSBmcm9tUHJvcC52YWx1ZSArIGluaXREdCAqIGRpZmY7XG5cbiAgICAgICAgLy8gY29uc2lkZXIgY29sb3VyIHZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChhcnJheShmcm9tUHJvcC52YWx1ZSkgJiYgYXJyYXkodG9Qcm9wLnZhbHVlKSkge1xuICAgICAgICBkaWZmID0gZnJvbVByb3AudmFsdWVbMF0gIT09IHRvUHJvcC52YWx1ZVswXSB8fCBmcm9tUHJvcC52YWx1ZVsxXSAhPT0gdG9Qcm9wLnZhbHVlWzFdIHx8IGZyb21Qcm9wLnZhbHVlWzJdICE9PSB0b1Byb3AudmFsdWVbMl07XG4gICAgICAgIGluaXRWYWwgPSBmcm9tUHJvcC5zdHJWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdGhlIHByZXZpb3VzIHZhbHVlIGlzIGdvb2QgZm9yIGFuIGFuaW1hdGlvbiBvbmx5IGlmIGl0J3MgZGlmZmVyZW50XG4gICAgICBpZiAoZGlmZikge1xuICAgICAgICBzdHlsZVtwcm9wXSA9IHRvUHJvcC5zdHJWYWx1ZTsgLy8gdG8gdmFsXG4gICAgICAgIHRoaXMuYXBwbHlCeXBhc3MoZWxlLCBwcm9wLCBpbml0VmFsKTsgLy8gZnJvbSB2YWxcbiAgICAgICAgYW55UHJldiA9IHRydWU7XG4gICAgICB9XG4gICAgfSAvLyBlbmQgaWYgcHJvcHMgYWxsb3cgYW5pXG5cbiAgICAvLyBjYW4ndCB0cmFuc2l0aW9uIGlmIHRoZXJlJ3Mgbm90aGluZyBwcmV2aW91cyB0byB0cmFuc2l0aW9uIGZyb21cbiAgICBpZiAoIWFueVByZXYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgX3AudHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgICBlbGUuZGVsYXlBbmltYXRpb24oZGVsYXkpLnBsYXkoKS5wcm9taXNlKCkudGhlbihyZXNvbHZlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBlbGUuYW5pbWF0aW9uKHtcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgIGVhc2luZzogZWxlLnBzdHlsZSgndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nKS52YWx1ZSxcbiAgICAgICAgcXVldWU6IGZhbHNlXG4gICAgICB9KS5wbGF5KCkucHJvbWlzZSgpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgLy8gaWYoICFpc0J5cGFzcyApe1xuICAgICAgc2VsZi5yZW1vdmVCeXBhc3NlcyhlbGUsIHByb3BzKTtcbiAgICAgIGVsZS5lbWl0QW5kTm90aWZ5KCdzdHlsZScpO1xuICAgICAgLy8gfVxuXG4gICAgICBfcC50cmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoX3AudHJhbnNpdGlvbmluZykge1xuICAgIHRoaXMucmVtb3ZlQnlwYXNzZXMoZWxlLCBwcm9wcyk7XG4gICAgZWxlLmVtaXRBbmROb3RpZnkoJ3N0eWxlJyk7XG4gICAgX3AudHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICB9XG59O1xuc3R5Zm4kOC5jaGVja1RyaWdnZXIgPSBmdW5jdGlvbiAoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUsIGdldFRyaWdnZXIsIG9uVHJpZ2dlcikge1xuICB2YXIgcHJvcCA9IHRoaXMucHJvcGVydGllc1tuYW1lXTtcbiAgdmFyIHRyaWdnZXJDaGVjayA9IGdldFRyaWdnZXIocHJvcCk7XG4gIGlmICh0cmlnZ2VyQ2hlY2sgIT0gbnVsbCAmJiB0cmlnZ2VyQ2hlY2soZnJvbVZhbHVlLCB0b1ZhbHVlKSkge1xuICAgIG9uVHJpZ2dlcihwcm9wKTtcbiAgfVxufTtcbnN0eWZuJDguY2hlY2taT3JkZXJUcmlnZ2VyID0gZnVuY3Rpb24gKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIHRoaXMuY2hlY2tUcmlnZ2VyKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlLCBmdW5jdGlvbiAocHJvcCkge1xuICAgIHJldHVybiBwcm9wLnRyaWdnZXJzWk9yZGVyO1xuICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMuX3ByaXZhdGUuY3kubm90aWZ5KCd6b3JkZXInLCBlbGUpO1xuICB9KTtcbn07XG5zdHlmbiQ4LmNoZWNrQm91bmRzVHJpZ2dlciA9IGZ1bmN0aW9uIChlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSkge1xuICB0aGlzLmNoZWNrVHJpZ2dlcihlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSwgZnVuY3Rpb24gKHByb3ApIHtcbiAgICByZXR1cm4gcHJvcC50cmlnZ2Vyc0JvdW5kcztcbiAgfSwgZnVuY3Rpb24gKHByb3ApIHtcbiAgICBlbGUuZGlydHlDb21wb3VuZEJvdW5kc0NhY2hlKCk7XG4gICAgZWxlLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuXG4gICAgLy8gaWYgdGhlIHByb3AgY2hhbmdlIG1ha2VzIHRoZSBiYiBvZiBwbGwgYmV6aWVyIGVkZ2VzIGludmFsaWQsXG4gICAgLy8gdGhlbiBkaXJ0eSB0aGUgcGxsIGVkZ2UgYmIgY2FjaGUgYXMgd2VsbFxuICAgIGlmIChcbiAgICAvLyBvbmx5IGZvciBiZXppZXJzIC0tIHNvIHBlcmZvcm1hbmNlIG9mIG90aGVyIGVkZ2VzIGlzbid0IGFmZmVjdGVkXG4gICAgcHJvcC50cmlnZ2Vyc0JvdW5kc09mUGFyYWxsZWxCZXppZXJzICYmIG5hbWUgPT09ICdjdXJ2ZS1zdHlsZScgJiYgKGZyb21WYWx1ZSA9PT0gJ2JlemllcicgfHwgdG9WYWx1ZSA9PT0gJ2JlemllcicpKSB7XG4gICAgICBlbGUucGFyYWxsZWxFZGdlcygpLmZvckVhY2goZnVuY3Rpb24gKHBsbEVkZ2UpIHtcbiAgICAgICAgaWYgKHBsbEVkZ2UuaXNCdW5kbGVkQmV6aWVyKCkpIHtcbiAgICAgICAgICBwbGxFZGdlLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHByb3AudHJpZ2dlcnNCb3VuZHNPZkNvbm5lY3RlZEVkZ2VzICYmIG5hbWUgPT09ICdkaXNwbGF5JyAmJiAoZnJvbVZhbHVlID09PSAnbm9uZScgfHwgdG9WYWx1ZSA9PT0gJ25vbmUnKSkge1xuICAgICAgZWxlLmNvbm5lY3RlZEVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICBlZGdlLmRpcnR5Qm91bmRpbmdCb3hDYWNoZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn07XG5zdHlmbiQ4LmNoZWNrVHJpZ2dlcnMgPSBmdW5jdGlvbiAoZWxlLCBuYW1lLCBmcm9tVmFsdWUsIHRvVmFsdWUpIHtcbiAgZWxlLmRpcnR5U3R5bGVDYWNoZSgpO1xuICB0aGlzLmNoZWNrWk9yZGVyVHJpZ2dlcihlbGUsIG5hbWUsIGZyb21WYWx1ZSwgdG9WYWx1ZSk7XG4gIHRoaXMuY2hlY2tCb3VuZHNUcmlnZ2VyKGVsZSwgbmFtZSwgZnJvbVZhbHVlLCB0b1ZhbHVlKTtcbn07XG5cbnZhciBzdHlmbiQ3ID0ge307XG5cbi8vIGJ5cGFzc2VzIGFyZSBhcHBsaWVkIHRvIGFuIGV4aXN0aW5nIHN0eWxlIG9uIGFuIGVsZW1lbnQsIGFuZCBqdXN0IHRhY2tlZCBvbiB0ZW1wb3JhcmlseVxuLy8gcmV0dXJucyB0cnVlIGlmZiBhcHBsaWNhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBmb3IgYXQgbGVhc3QgMSBzcGVjaWZpZWQgcHJvcGVydHlcbnN0eWZuJDcuYXBwbHlCeXBhc3MgPSBmdW5jdGlvbiAoZWxlcywgbmFtZSwgdmFsdWUsIHVwZGF0ZVRyYW5zaXRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHByb3BzID0gW107XG4gIHZhciBpc0J5cGFzcyA9IHRydWU7XG5cbiAgLy8gcHV0IGFsbCB0aGUgcHJvcGVydGllcyAoY2FuIHNwZWNpZnkgb25lIG9yIG1hbnkpIGluIGFuIGFycmF5IGFmdGVyIHBhcnNpbmcgdGhlbVxuICBpZiAobmFtZSA9PT0gJyonIHx8IG5hbWUgPT09ICcqKicpIHtcbiAgICAvLyBhcHBseSB0byBhbGwgcHJvcGVydHkgbmFtZXNcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcHJvcCA9IHNlbGYucHJvcGVydGllc1tpXTtcbiAgICAgICAgdmFyIF9uYW1lID0gcHJvcC5uYW1lO1xuICAgICAgICB2YXIgcGFyc2VkUHJvcCA9IHRoaXMucGFyc2UoX25hbWUsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgaWYgKHBhcnNlZFByb3ApIHtcbiAgICAgICAgICBwcm9wcy5wdXNoKHBhcnNlZFByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHN0cmluZyhuYW1lKSkge1xuICAgIC8vIHRoZW4gcGFyc2UgdGhlIHNpbmdsZSBwcm9wZXJ0eVxuICAgIHZhciBfcGFyc2VkUHJvcCA9IHRoaXMucGFyc2UobmFtZSwgdmFsdWUsIHRydWUpO1xuICAgIGlmIChfcGFyc2VkUHJvcCkge1xuICAgICAgcHJvcHMucHVzaChfcGFyc2VkUHJvcCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHBsYWluT2JqZWN0KG5hbWUpKSB7XG4gICAgLy8gdGhlbiBwYXJzZSBlYWNoIHByb3BlcnR5XG4gICAgdmFyIHNwZWNpZmllZFByb3BzID0gbmFtZTtcbiAgICB1cGRhdGVUcmFuc2l0aW9ucyA9IHZhbHVlO1xuICAgIHZhciBuYW1lcyA9IE9iamVjdC5rZXlzKHNwZWNpZmllZFByb3BzKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbmFtZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX25hbWUyID0gbmFtZXNbX2ldO1xuICAgICAgdmFyIF92YWx1ZSA9IHNwZWNpZmllZFByb3BzW19uYW1lMl07XG4gICAgICBpZiAoX3ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdHJ5IGNhbWVsIGNhc2UgbmFtZSB0b29cbiAgICAgICAgX3ZhbHVlID0gc3BlY2lmaWVkUHJvcHNbZGFzaDJjYW1lbChfbmFtZTIpXTtcbiAgICAgIH1cbiAgICAgIGlmIChfdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgX3BhcnNlZFByb3AyID0gdGhpcy5wYXJzZShfbmFtZTIsIF92YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIGlmIChfcGFyc2VkUHJvcDIpIHtcbiAgICAgICAgICBwcm9wcy5wdXNoKF9wYXJzZWRQcm9wMik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gY2FuJ3QgZG8gYW55dGhpbmcgd2l0aG91dCB3ZWxsIGRlZmluZWQgcHJvcGVydGllc1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHdlJ3ZlIGZhaWxlZCBpZiB0aGVyZSBhcmUgbm8gdmFsaWQgcHJvcGVydGllc1xuICBpZiAocHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gbm93LCBhcHBseSB0aGUgYnlwYXNzIHByb3BlcnRpZXMgb24gdGhlIGVsZW1lbnRzXG4gIHZhciByZXQgPSBmYWxzZTsgLy8gcmV0dXJuIHRydWUgaWYgYXQgbGVhc3Qgb25lIHN1Y2Nlc2Z1bCBieXBhc3MgYXBwbGllZFxuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBlbGVzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAvLyBmb3IgZWFjaCBlbGVcbiAgICB2YXIgZWxlID0gZWxlc1tfaTJdO1xuICAgIHZhciBkaWZmUHJvcHMgPSB7fTtcbiAgICB2YXIgZGlmZlByb3AgPSB2b2lkIDA7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgICAgLy8gZm9yIGVhY2ggcHJvcFxuICAgICAgdmFyIF9wcm9wID0gcHJvcHNbal07XG4gICAgICBpZiAodXBkYXRlVHJhbnNpdGlvbnMpIHtcbiAgICAgICAgdmFyIHByZXZQcm9wID0gZWxlLnBzdHlsZShfcHJvcC5uYW1lKTtcbiAgICAgICAgZGlmZlByb3AgPSBkaWZmUHJvcHNbX3Byb3AubmFtZV0gPSB7XG4gICAgICAgICAgcHJldjogcHJldlByb3BcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldCA9IHRoaXMuYXBwbHlQYXJzZWRQcm9wZXJ0eShlbGUsIGNvcHkoX3Byb3ApKSB8fCByZXQ7XG4gICAgICBpZiAodXBkYXRlVHJhbnNpdGlvbnMpIHtcbiAgICAgICAgZGlmZlByb3AubmV4dCA9IGVsZS5wc3R5bGUoX3Byb3AubmFtZSk7XG4gICAgICB9XG4gICAgfSAvLyBmb3IgcHJvcHNcblxuICAgIGlmIChyZXQpIHtcbiAgICAgIHRoaXMudXBkYXRlU3R5bGVIaW50cyhlbGUpO1xuICAgIH1cbiAgICBpZiAodXBkYXRlVHJhbnNpdGlvbnMpIHtcbiAgICAgIHRoaXMudXBkYXRlVHJhbnNpdGlvbnMoZWxlLCBkaWZmUHJvcHMsIGlzQnlwYXNzKTtcbiAgICB9XG4gIH0gLy8gZm9yIGVsZXNcblxuICByZXR1cm4gcmV0O1xufTtcblxuLy8gb25seSB1c2VmdWwgaW4gc3BlY2lmaWMgY2FzZXMgbGlrZSBhbmltYXRpb25cbnN0eWZuJDcub3ZlcnJpZGVCeXBhc3MgPSBmdW5jdGlvbiAoZWxlcywgbmFtZSwgdmFsdWUpIHtcbiAgbmFtZSA9IGNhbWVsMmRhc2gobmFtZSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHZhciBwcm9wID0gZWxlLl9wcml2YXRlLnN0eWxlW25hbWVdO1xuICAgIHZhciB0eXBlID0gdGhpcy5wcm9wZXJ0aWVzW25hbWVdLnR5cGU7XG4gICAgdmFyIGlzQ29sb3IgPSB0eXBlLmNvbG9yO1xuICAgIHZhciBpc011bHRpID0gdHlwZS5tdXRpcGxlO1xuICAgIHZhciBvbGRWYWx1ZSA9ICFwcm9wID8gbnVsbCA6IHByb3AucGZWYWx1ZSAhPSBudWxsID8gcHJvcC5wZlZhbHVlIDogcHJvcC52YWx1ZTtcbiAgICBpZiAoIXByb3AgfHwgIXByb3AuYnlwYXNzKSB7XG4gICAgICAvLyBuZWVkIGEgYnlwYXNzIGlmIG9uZSBkb2Vzbid0IGV4aXN0XG4gICAgICB0aGlzLmFwcGx5QnlwYXNzKGVsZSwgbmFtZSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wLnZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAocHJvcC5wZlZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgcHJvcC5wZlZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNDb2xvcikge1xuICAgICAgICBwcm9wLnN0clZhbHVlID0gJ3JnYignICsgdmFsdWUuam9pbignLCcpICsgJyknO1xuICAgICAgfSBlbHNlIGlmIChpc011bHRpKSB7XG4gICAgICAgIHByb3Auc3RyVmFsdWUgPSB2YWx1ZS5qb2luKCcgJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wLnN0clZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlU3R5bGVIaW50cyhlbGUpO1xuICAgIH1cbiAgICB0aGlzLmNoZWNrVHJpZ2dlcnMoZWxlLCBuYW1lLCBvbGRWYWx1ZSwgdmFsdWUpO1xuICB9XG59O1xuc3R5Zm4kNy5yZW1vdmVBbGxCeXBhc3NlcyA9IGZ1bmN0aW9uIChlbGVzLCB1cGRhdGVUcmFuc2l0aW9ucykge1xuICByZXR1cm4gdGhpcy5yZW1vdmVCeXBhc3NlcyhlbGVzLCB0aGlzLnByb3BlcnR5TmFtZXMsIHVwZGF0ZVRyYW5zaXRpb25zKTtcbn07XG5zdHlmbiQ3LnJlbW92ZUJ5cGFzc2VzID0gZnVuY3Rpb24gKGVsZXMsIHByb3BzLCB1cGRhdGVUcmFuc2l0aW9ucykge1xuICB2YXIgaXNCeXBhc3MgPSB0cnVlO1xuICBmb3IgKHZhciBqID0gMDsgaiA8IGVsZXMubGVuZ3RoOyBqKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tqXTtcbiAgICB2YXIgZGlmZlByb3BzID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBwcm9wc1tpXTtcbiAgICAgIHZhciBwcm9wID0gdGhpcy5wcm9wZXJ0aWVzW25hbWVdO1xuICAgICAgdmFyIHByZXZQcm9wID0gZWxlLnBzdHlsZShwcm9wLm5hbWUpO1xuICAgICAgaWYgKCFwcmV2UHJvcCB8fCAhcHJldlByb3AuYnlwYXNzKSB7XG4gICAgICAgIC8vIGlmIGEgYnlwYXNzIGRvZXNuJ3QgZXhpc3QgZm9yIHRoZSBwcm9wLCBub3RoaW5nIG5lZWRzIHRvIGJlIHJlbW92ZWRcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSAnJzsgLy8gZW1wdHkgPT4gcmVtb3ZlIGJ5cGFzc1xuICAgICAgdmFyIHBhcnNlZFByb3AgPSB0aGlzLnBhcnNlKG5hbWUsIHZhbHVlLCB0cnVlKTtcbiAgICAgIHZhciBkaWZmUHJvcCA9IGRpZmZQcm9wc1twcm9wLm5hbWVdID0ge1xuICAgICAgICBwcmV2OiBwcmV2UHJvcFxuICAgICAgfTtcbiAgICAgIHRoaXMuYXBwbHlQYXJzZWRQcm9wZXJ0eShlbGUsIHBhcnNlZFByb3ApO1xuICAgICAgZGlmZlByb3AubmV4dCA9IGVsZS5wc3R5bGUocHJvcC5uYW1lKTtcbiAgICB9IC8vIGZvciBwcm9wc1xuXG4gICAgdGhpcy51cGRhdGVTdHlsZUhpbnRzKGVsZSk7XG4gICAgaWYgKHVwZGF0ZVRyYW5zaXRpb25zKSB7XG4gICAgICB0aGlzLnVwZGF0ZVRyYW5zaXRpb25zKGVsZSwgZGlmZlByb3BzLCBpc0J5cGFzcyk7XG4gICAgfVxuICB9IC8vIGZvciBlbGVzXG59O1xuXG52YXIgc3R5Zm4kNiA9IHt9O1xuXG4vLyBnZXRzIHdoYXQgYW4gZW0gc2l6ZSBjb3JyZXNwb25kcyB0byBpbiBwaXhlbHMgcmVsYXRpdmUgdG8gYSBkb20gZWxlbWVudFxuc3R5Zm4kNi5nZXRFbVNpemVJblBpeGVscyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHB4ID0gdGhpcy5jb250YWluZXJDc3MoJ2ZvbnQtc2l6ZScpO1xuICBpZiAocHggIT0gbnVsbCkge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHB4KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMTsgLy8gZm9yIGhlYWRsZXNzXG4gIH1cbn07XG5cbi8vIGdldHMgY3NzIHByb3BlcnR5IGZyb20gdGhlIGNvcmUgY29udGFpbmVyXG5zdHlmbiQ2LmNvbnRhaW5lckNzcyA9IGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICB2YXIgY3kgPSB0aGlzLl9wcml2YXRlLmN5O1xuICB2YXIgZG9tRWxlbWVudCA9IGN5LmNvbnRhaW5lcigpO1xuICB2YXIgY29udGFpbmVyV2luZG93ID0gY3kud2luZG93KCk7XG4gIGlmIChjb250YWluZXJXaW5kb3cgJiYgZG9tRWxlbWVudCAmJiBjb250YWluZXJXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSkge1xuICAgIHJldHVybiBjb250YWluZXJXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb21FbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKHByb3BOYW1lKTtcbiAgfVxufTtcblxudmFyIHN0eWZuJDUgPSB7fTtcblxuLy8gZ2V0cyB0aGUgcmVuZGVyZWQgc3R5bGUgZm9yIGFuIGVsZW1lbnRcbnN0eWZuJDUuZ2V0UmVuZGVyZWRTdHlsZSA9IGZ1bmN0aW9uIChlbGUsIHByb3ApIHtcbiAgaWYgKHByb3ApIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHlsZVByb3BlcnR5VmFsdWUoZWxlLCBwcm9wLCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSYXdTdHlsZShlbGUsIHRydWUpO1xuICB9XG59O1xuXG4vLyBnZXRzIHRoZSByYXcgc3R5bGUgZm9yIGFuIGVsZW1lbnRcbnN0eWZuJDUuZ2V0UmF3U3R5bGUgPSBmdW5jdGlvbiAoZWxlLCBpc1JlbmRlcmVkVmFsKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgZWxlID0gZWxlWzBdOyAvLyBpbnN1cmUgaXQncyBhbiBlbGVtZW50XG5cbiAgaWYgKGVsZSkge1xuICAgIHZhciByc3R5bGUgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBzZWxmLnByb3BlcnRpZXNbaV07XG4gICAgICB2YXIgdmFsID0gc2VsZi5nZXRTdHlsZVByb3BlcnR5VmFsdWUoZWxlLCBwcm9wLm5hbWUsIGlzUmVuZGVyZWRWYWwpO1xuICAgICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICAgIHJzdHlsZVtwcm9wLm5hbWVdID0gdmFsO1xuICAgICAgICByc3R5bGVbZGFzaDJjYW1lbChwcm9wLm5hbWUpXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJzdHlsZTtcbiAgfVxufTtcbnN0eWZuJDUuZ2V0SW5kZXhlZFN0eWxlID0gZnVuY3Rpb24gKGVsZSwgcHJvcGVydHksIHN1YnByb3BlcnR5LCBpbmRleCkge1xuICB2YXIgcHN0eWxlID0gZWxlLnBzdHlsZShwcm9wZXJ0eSlbc3VicHJvcGVydHldW2luZGV4XTtcbiAgcmV0dXJuIHBzdHlsZSAhPSBudWxsID8gcHN0eWxlIDogZWxlLmN5KCkuc3R5bGUoKS5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHkpW3N1YnByb3BlcnR5XVswXTtcbn07XG5zdHlmbiQ1LmdldFN0eWxlUHJvcGVydHlWYWx1ZSA9IGZ1bmN0aW9uIChlbGUsIHByb3BOYW1lLCBpc1JlbmRlcmVkVmFsKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgZWxlID0gZWxlWzBdOyAvLyBpbnN1cmUgaXQncyBhbiBlbGVtZW50XG5cbiAgaWYgKGVsZSkge1xuICAgIHZhciBwcm9wID0gc2VsZi5wcm9wZXJ0aWVzW3Byb3BOYW1lXTtcbiAgICBpZiAocHJvcC5hbGlhcykge1xuICAgICAgcHJvcCA9IHByb3AucG9pbnRzVG87XG4gICAgfVxuICAgIHZhciB0eXBlID0gcHJvcC50eXBlO1xuICAgIHZhciBzdHlsZVByb3AgPSBlbGUucHN0eWxlKHByb3AubmFtZSk7XG4gICAgaWYgKHN0eWxlUHJvcCkge1xuICAgICAgdmFyIHZhbHVlID0gc3R5bGVQcm9wLnZhbHVlLFxuICAgICAgICB1bml0cyA9IHN0eWxlUHJvcC51bml0cyxcbiAgICAgICAgc3RyVmFsdWUgPSBzdHlsZVByb3Auc3RyVmFsdWU7XG4gICAgICBpZiAoaXNSZW5kZXJlZFZhbCAmJiB0eXBlLm51bWJlciAmJiB2YWx1ZSAhPSBudWxsICYmIG51bWJlciQxKHZhbHVlKSkge1xuICAgICAgICB2YXIgem9vbSA9IGVsZS5jeSgpLnpvb20oKTtcbiAgICAgICAgdmFyIGdldFJlbmRlcmVkVmFsdWUgPSBmdW5jdGlvbiBnZXRSZW5kZXJlZFZhbHVlKHZhbCkge1xuICAgICAgICAgIHJldHVybiB2YWwgKiB6b29tO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgZ2V0VmFsdWVTdHJpbmdXaXRoVW5pdHMgPSBmdW5jdGlvbiBnZXRWYWx1ZVN0cmluZ1dpdGhVbml0cyh2YWwsIHVuaXRzKSB7XG4gICAgICAgICAgcmV0dXJuIGdldFJlbmRlcmVkVmFsdWUodmFsKSArIHVuaXRzO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgaXNBcnJheVZhbHVlID0gYXJyYXkodmFsdWUpO1xuICAgICAgICB2YXIgaGF2ZVVuaXRzID0gaXNBcnJheVZhbHVlID8gdW5pdHMuZXZlcnkoZnVuY3Rpb24gKHUpIHtcbiAgICAgICAgICByZXR1cm4gdSAhPSBudWxsO1xuICAgICAgICB9KSA6IHVuaXRzICE9IG51bGw7XG4gICAgICAgIGlmIChoYXZlVW5pdHMpIHtcbiAgICAgICAgICBpZiAoaXNBcnJheVZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKGZ1bmN0aW9uICh2LCBpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZVN0cmluZ1dpdGhVbml0cyh2LCB1bml0c1tpXSk7XG4gICAgICAgICAgICB9KS5qb2luKCcgJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZVN0cmluZ1dpdGhVbml0cyh2YWx1ZSwgdW5pdHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaXNBcnJheVZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgIHJldHVybiBzdHJpbmcodikgPyB2IDogJycgKyBnZXRSZW5kZXJlZFZhbHVlKHYpO1xuICAgICAgICAgICAgfSkuam9pbignICcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJycgKyBnZXRSZW5kZXJlZFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RyVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3RyVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuc3R5Zm4kNS5nZXRBbmltYXRpb25TdGFydFN0eWxlID0gZnVuY3Rpb24gKGVsZSwgYW5pUHJvcHMpIHtcbiAgdmFyIHJzdHlsZSA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFuaVByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGFuaVByb3AgPSBhbmlQcm9wc1tpXTtcbiAgICB2YXIgbmFtZSA9IGFuaVByb3AubmFtZTtcbiAgICB2YXIgc3R5bGVQcm9wID0gZWxlLnBzdHlsZShuYW1lKTtcbiAgICBpZiAoc3R5bGVQcm9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHRoZW4gbWFrZSBhIHByb3Agb2YgaXRcbiAgICAgIGlmIChwbGFpbk9iamVjdChzdHlsZVByb3ApKSB7XG4gICAgICAgIHN0eWxlUHJvcCA9IHRoaXMucGFyc2UobmFtZSwgc3R5bGVQcm9wLnN0clZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0eWxlUHJvcCA9IHRoaXMucGFyc2UobmFtZSwgc3R5bGVQcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0eWxlUHJvcCkge1xuICAgICAgcnN0eWxlW25hbWVdID0gc3R5bGVQcm9wO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcnN0eWxlO1xufTtcbnN0eWZuJDUuZ2V0UHJvcHNMaXN0ID0gZnVuY3Rpb24gKHByb3BzT2JqKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHJzdHlsZSA9IFtdO1xuICB2YXIgc3R5bGUgPSBwcm9wc09iajtcbiAgdmFyIHByb3BzID0gc2VsZi5wcm9wZXJ0aWVzO1xuICBpZiAoc3R5bGUpIHtcbiAgICB2YXIgbmFtZXMgPSBPYmplY3Qua2V5cyhzdHlsZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgIHZhciB2YWwgPSBzdHlsZVtuYW1lXTtcbiAgICAgIHZhciBwcm9wID0gcHJvcHNbbmFtZV0gfHwgcHJvcHNbY2FtZWwyZGFzaChuYW1lKV07XG4gICAgICB2YXIgc3R5bGVQcm9wID0gdGhpcy5wYXJzZShwcm9wLm5hbWUsIHZhbCk7XG4gICAgICBpZiAoc3R5bGVQcm9wKSB7XG4gICAgICAgIHJzdHlsZS5wdXNoKHN0eWxlUHJvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByc3R5bGU7XG59O1xuc3R5Zm4kNS5nZXROb25EZWZhdWx0UHJvcGVydGllc0hhc2ggPSBmdW5jdGlvbiAoZWxlLCBwcm9wTmFtZXMsIHNlZWQpIHtcbiAgdmFyIGhhc2ggPSBzZWVkLnNsaWNlKCk7XG4gIHZhciBuYW1lLCB2YWwsIHN0clZhbCwgY2hWYWw7XG4gIHZhciBpLCBqO1xuICBmb3IgKGkgPSAwOyBpIDwgcHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbmFtZSA9IHByb3BOYW1lc1tpXTtcbiAgICB2YWwgPSBlbGUucHN0eWxlKG5hbWUsIGZhbHNlKTtcbiAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAodmFsLnBmVmFsdWUgIT0gbnVsbCkge1xuICAgICAgaGFzaFswXSA9IGhhc2hJbnQoY2hWYWwsIGhhc2hbMF0pO1xuICAgICAgaGFzaFsxXSA9IGhhc2hJbnRBbHQoY2hWYWwsIGhhc2hbMV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJWYWwgPSB2YWwuc3RyVmFsdWU7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgc3RyVmFsLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNoVmFsID0gc3RyVmFsLmNoYXJDb2RlQXQoaik7XG4gICAgICAgIGhhc2hbMF0gPSBoYXNoSW50KGNoVmFsLCBoYXNoWzBdKTtcbiAgICAgICAgaGFzaFsxXSA9IGhhc2hJbnRBbHQoY2hWYWwsIGhhc2hbMV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gaGFzaDtcbn07XG5zdHlmbiQ1LmdldFByb3BlcnRpZXNIYXNoID0gc3R5Zm4kNS5nZXROb25EZWZhdWx0UHJvcGVydGllc0hhc2g7XG5cbnZhciBzdHlmbiQ0ID0ge307XG5zdHlmbiQ0LmFwcGVuZEZyb21Kc29uID0gZnVuY3Rpb24gKGpzb24pIHtcbiAgdmFyIHN0eWxlID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBqc29uLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNvbnRleHQgPSBqc29uW2ldO1xuICAgIHZhciBzZWxlY3RvciA9IGNvbnRleHQuc2VsZWN0b3I7XG4gICAgdmFyIHByb3BzID0gY29udGV4dC5zdHlsZSB8fCBjb250ZXh0LmNzcztcbiAgICB2YXIgbmFtZXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XG4gICAgc3R5bGUuc2VsZWN0b3Ioc2VsZWN0b3IpOyAvLyBhcHBseSBzZWxlY3RvclxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBuYW1lcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIG5hbWUgPSBuYW1lc1tqXTtcbiAgICAgIHZhciB2YWx1ZSA9IHByb3BzW25hbWVdO1xuICAgICAgc3R5bGUuY3NzKG5hbWUsIHZhbHVlKTsgLy8gYXBwbHkgcHJvcGVydHlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3R5bGU7XG59O1xuXG4vLyBhY2Nlc3NpYmxlIGN5LnN0eWxlKCkgZnVuY3Rpb25cbnN0eWZuJDQuZnJvbUpzb24gPSBmdW5jdGlvbiAoanNvbikge1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICBzdHlsZS5yZXNldFRvRGVmYXVsdCgpO1xuICBzdHlsZS5hcHBlbmRGcm9tSnNvbihqc29uKTtcbiAgcmV0dXJuIHN0eWxlO1xufTtcblxuLy8gZ2V0IGpzb24gZnJvbSBjeS5zdHlsZSgpIGFwaVxuc3R5Zm4kNC5qc29uID0gZnVuY3Rpb24gKCkge1xuICB2YXIganNvbiA9IFtdO1xuICBmb3IgKHZhciBpID0gdGhpcy5kZWZhdWx0TGVuZ3RoOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjeHQgPSB0aGlzW2ldO1xuICAgIHZhciBzZWxlY3RvciA9IGN4dC5zZWxlY3RvcjtcbiAgICB2YXIgcHJvcHMgPSBjeHQucHJvcGVydGllcztcbiAgICB2YXIgY3NzID0ge307XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wc1tqXTtcbiAgICAgIGNzc1twcm9wLm5hbWVdID0gcHJvcC5zdHJWYWx1ZTtcbiAgICB9XG4gICAganNvbi5wdXNoKHtcbiAgICAgIHNlbGVjdG9yOiAhc2VsZWN0b3IgPyAnY29yZScgOiBzZWxlY3Rvci50b1N0cmluZygpLFxuICAgICAgc3R5bGU6IGNzc1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBqc29uO1xufTtcblxudmFyIHN0eWZuJDMgPSB7fTtcbnN0eWZuJDMuYXBwZW5kRnJvbVN0cmluZyA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICB2YXIgcmVtYWluaW5nID0gJycgKyBzdHJpbmc7XG4gIHZhciBzZWxBbmRCbG9ja1N0cjtcbiAgdmFyIGJsb2NrUmVtO1xuICB2YXIgcHJvcEFuZFZhbFN0cjtcblxuICAvLyByZW1vdmUgY29tbWVudHMgZnJvbSB0aGUgc3R5bGUgc3RyaW5nXG4gIHJlbWFpbmluZyA9IHJlbWFpbmluZy5yZXBsYWNlKC9bL11bKl0oXFxzfC4pKz9bKl1bL10vZywgJycpO1xuICBmdW5jdGlvbiByZW1vdmVTZWxBbmRCbG9ja0Zyb21SZW1haW5pbmcoKSB7XG4gICAgLy8gcmVtb3ZlIHRoZSBwYXJzZWQgc2VsZWN0b3IgYW5kIGJsb2NrIGZyb20gdGhlIHJlbWFpbmluZyB0ZXh0IHRvIHBhcnNlXG4gICAgaWYgKHJlbWFpbmluZy5sZW5ndGggPiBzZWxBbmRCbG9ja1N0ci5sZW5ndGgpIHtcbiAgICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZy5zdWJzdHIoc2VsQW5kQmxvY2tTdHIubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVtYWluaW5nID0gJyc7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHJlbW92ZVByb3BBbmRWYWxGcm9tUmVtKCkge1xuICAgIC8vIHJlbW92ZSB0aGUgcGFyc2VkIHByb3BlcnR5IGFuZCB2YWx1ZSBmcm9tIHRoZSByZW1haW5pbmcgYmxvY2sgdGV4dCB0byBwYXJzZVxuICAgIGlmIChibG9ja1JlbS5sZW5ndGggPiBwcm9wQW5kVmFsU3RyLmxlbmd0aCkge1xuICAgICAgYmxvY2tSZW0gPSBibG9ja1JlbS5zdWJzdHIocHJvcEFuZFZhbFN0ci5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBibG9ja1JlbSA9ICcnO1xuICAgIH1cbiAgfVxuICBmb3IgKDs7KSB7XG4gICAgdmFyIG5vdGhpbmdMZWZ0VG9QYXJzZSA9IHJlbWFpbmluZy5tYXRjaCgvXlxccyokLyk7XG4gICAgaWYgKG5vdGhpbmdMZWZ0VG9QYXJzZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBzZWxBbmRCbG9jayA9IHJlbWFpbmluZy5tYXRjaCgvXlxccyooKD86LnxcXHMpKz8pXFxzKlxceygoPzoufFxccykrPylcXH0vKTtcbiAgICBpZiAoIXNlbEFuZEJsb2NrKSB7XG4gICAgICB3YXJuKCdIYWx0aW5nIHN0eWxlc2hlZXQgcGFyc2luZzogU3RyaW5nIHN0eWxlc2hlZXQgY29udGFpbnMgbW9yZSB0byBwYXJzZSBidXQgbm8gc2VsZWN0b3IgYW5kIGJsb2NrIGZvdW5kIGluOiAnICsgcmVtYWluaW5nKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzZWxBbmRCbG9ja1N0ciA9IHNlbEFuZEJsb2NrWzBdO1xuXG4gICAgLy8gcGFyc2UgdGhlIHNlbGVjdG9yXG4gICAgdmFyIHNlbGVjdG9yU3RyID0gc2VsQW5kQmxvY2tbMV07XG4gICAgaWYgKHNlbGVjdG9yU3RyICE9PSAnY29yZScpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IG5ldyBTZWxlY3RvcihzZWxlY3RvclN0cik7XG4gICAgICBpZiAoc2VsZWN0b3IuaW52YWxpZCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwYXJzaW5nIG9mIGJsb2NrOiBJbnZhbGlkIHNlbGVjdG9yIGZvdW5kIGluIHN0cmluZyBzdHlsZXNoZWV0OiAnICsgc2VsZWN0b3JTdHIpO1xuXG4gICAgICAgIC8vIHNraXAgdGhpcyBzZWxlY3RvciBhbmQgYmxvY2tcbiAgICAgICAgcmVtb3ZlU2VsQW5kQmxvY2tGcm9tUmVtYWluaW5nKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHBhcnNlIHRoZSBibG9jayBvZiBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcbiAgICB2YXIgYmxvY2tTdHIgPSBzZWxBbmRCbG9ja1syXTtcbiAgICB2YXIgaW52YWxpZEJsb2NrID0gZmFsc2U7XG4gICAgYmxvY2tSZW0gPSBibG9ja1N0cjtcbiAgICB2YXIgcHJvcHMgPSBbXTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICB2YXIgX25vdGhpbmdMZWZ0VG9QYXJzZSA9IGJsb2NrUmVtLm1hdGNoKC9eXFxzKiQvKTtcbiAgICAgIGlmIChfbm90aGluZ0xlZnRUb1BhcnNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BBbmRWYWwgPSBibG9ja1JlbS5tYXRjaCgvXlxccyooLis/KVxccyo6XFxzKiguKz8pKD86XFxzKjt8XFxzKiQpLyk7XG4gICAgICBpZiAoIXByb3BBbmRWYWwpIHtcbiAgICAgICAgd2FybignU2tpcHBpbmcgcGFyc2luZyBvZiBibG9jazogSW52YWxpZCBmb3JtYXR0aW5nIG9mIHN0eWxlIHByb3BlcnR5IGFuZCB2YWx1ZSBkZWZpbml0aW9ucyBmb3VuZCBpbjonICsgYmxvY2tTdHIpO1xuICAgICAgICBpbnZhbGlkQmxvY2sgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHByb3BBbmRWYWxTdHIgPSBwcm9wQW5kVmFsWzBdO1xuICAgICAgdmFyIHByb3BTdHIgPSBwcm9wQW5kVmFsWzFdO1xuICAgICAgdmFyIHZhbFN0ciA9IHByb3BBbmRWYWxbMl07XG4gICAgICB2YXIgcHJvcCA9IHNlbGYucHJvcGVydGllc1twcm9wU3RyXTtcbiAgICAgIGlmICghcHJvcCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwcm9wZXJ0eTogSW52YWxpZCBwcm9wZXJ0eSBuYW1lIGluOiAnICsgcHJvcEFuZFZhbFN0cik7XG5cbiAgICAgICAgLy8gc2tpcCB0aGlzIHByb3BlcnR5IGluIHRoZSBibG9ja1xuICAgICAgICByZW1vdmVQcm9wQW5kVmFsRnJvbVJlbSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBwYXJzZWRQcm9wID0gc3R5bGUucGFyc2UocHJvcFN0ciwgdmFsU3RyKTtcbiAgICAgIGlmICghcGFyc2VkUHJvcCkge1xuICAgICAgICB3YXJuKCdTa2lwcGluZyBwcm9wZXJ0eTogSW52YWxpZCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluOiAnICsgcHJvcEFuZFZhbFN0cik7XG5cbiAgICAgICAgLy8gc2tpcCB0aGlzIHByb3BlcnR5IGluIHRoZSBibG9ja1xuICAgICAgICByZW1vdmVQcm9wQW5kVmFsRnJvbVJlbSgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHByb3BzLnB1c2goe1xuICAgICAgICBuYW1lOiBwcm9wU3RyLFxuICAgICAgICB2YWw6IHZhbFN0clxuICAgICAgfSk7XG4gICAgICByZW1vdmVQcm9wQW5kVmFsRnJvbVJlbSgpO1xuICAgIH1cbiAgICBpZiAoaW52YWxpZEJsb2NrKSB7XG4gICAgICByZW1vdmVTZWxBbmRCbG9ja0Zyb21SZW1haW5pbmcoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIHB1dCB0aGUgcGFyc2VkIGJsb2NrIGluIHRoZSBzdHlsZVxuICAgIHN0eWxlLnNlbGVjdG9yKHNlbGVjdG9yU3RyKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgX3Byb3AgPSBwcm9wc1tpXTtcbiAgICAgIHN0eWxlLmNzcyhfcHJvcC5uYW1lLCBfcHJvcC52YWwpO1xuICAgIH1cbiAgICByZW1vdmVTZWxBbmRCbG9ja0Zyb21SZW1haW5pbmcoKTtcbiAgfVxuICByZXR1cm4gc3R5bGU7XG59O1xuc3R5Zm4kMy5mcm9tU3RyaW5nID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgc3R5bGUgPSB0aGlzO1xuICBzdHlsZS5yZXNldFRvRGVmYXVsdCgpO1xuICBzdHlsZS5hcHBlbmRGcm9tU3RyaW5nKHN0cmluZyk7XG4gIHJldHVybiBzdHlsZTtcbn07XG5cbnZhciBzdHlmbiQyID0ge307XG4oZnVuY3Rpb24gKCkge1xuICB2YXIgbnVtYmVyJDEgPSBudW1iZXI7XG4gIHZhciByZ2JhID0gcmdiYU5vQmFja1JlZnM7XG4gIHZhciBoc2xhID0gaHNsYU5vQmFja1JlZnM7XG4gIHZhciBoZXgzJDEgPSBoZXgzO1xuICB2YXIgaGV4NiQxID0gaGV4NjtcbiAgdmFyIGRhdGEgPSBmdW5jdGlvbiBkYXRhKHByZWZpeCkge1xuICAgIHJldHVybiAnXicgKyBwcmVmaXggKyAnXFxcXHMqXFxcXChcXFxccyooW1xcXFx3XFxcXC5dKylcXFxccypcXFxcKSQnO1xuICB9O1xuICB2YXIgbWFwRGF0YSA9IGZ1bmN0aW9uIG1hcERhdGEocHJlZml4KSB7XG4gICAgdmFyIG1hcEFyZyA9IG51bWJlciQxICsgJ3xcXFxcdyt8JyArIHJnYmEgKyAnfCcgKyBoc2xhICsgJ3wnICsgaGV4MyQxICsgJ3wnICsgaGV4NiQxO1xuICAgIHJldHVybiAnXicgKyBwcmVmaXggKyAnXFxcXHMqXFxcXCgoW1xcXFx3XFxcXC5dKylcXFxccypcXFxcLFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKlxcXFwsXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqLFxcXFxzKignICsgbWFwQXJnICsgJylcXFxccypcXFxcLFxcXFxzKignICsgbWFwQXJnICsgJylcXFxcKSQnO1xuICB9O1xuICB2YXIgdXJsUmVnZXhlcyA9IFsnXnVybFxcXFxzKlxcXFwoXFxcXHMqW1xcJ1wiXT8oLis/KVtcXCdcIl0/XFxcXHMqXFxcXCkkJywgJ14obm9uZSkkJywgJ14oLispJCddO1xuXG4gIC8vIGVhY2ggdmlzdWFsIHN0eWxlIHByb3BlcnR5IGhhcyBhIHR5cGUgYW5kIG5lZWRzIHRvIGJlIHZhbGlkYXRlZCBhY2NvcmRpbmcgdG8gaXRcbiAgc3R5Zm4kMi50eXBlcyA9IHtcbiAgICB0aW1lOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICB1bml0czogJ3N8bXMnLFxuICAgICAgaW1wbGljaXRVbml0czogJ21zJ1xuICAgIH0sXG4gICAgcGVyY2VudDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxMDAsXG4gICAgICB1bml0czogJyUnLFxuICAgICAgaW1wbGljaXRVbml0czogJyUnXG4gICAgfSxcbiAgICBwZXJjZW50YWdlczoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxMDAsXG4gICAgICB1bml0czogJyUnLFxuICAgICAgaW1wbGljaXRVbml0czogJyUnLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIHplcm9PbmVOdW1iZXI6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogMSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICB6ZXJvT25lTnVtYmVyczoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxLFxuICAgICAgdW5pdGxlc3M6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgbk9uZU9uZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAtMSxcbiAgICAgIG1heDogMSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBub25OZWdhdGl2ZUludDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgaW50ZWdlcjogdHJ1ZSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBub25OZWdhdGl2ZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIHBvc2l0aW9uOiB7XG4gICAgICBlbnVtczogWydwYXJlbnQnLCAnb3JpZ2luJ11cbiAgICB9LFxuICAgIG5vZGVTaXplOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBlbnVtczogWydsYWJlbCddXG4gICAgfSxcbiAgICBudW1iZXI6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIHVuaXRsZXNzOiB0cnVlXG4gICAgfSxcbiAgICBudW1iZXJzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICB1bml0bGVzczogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBwb3NpdGl2ZU51bWJlcjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgdW5pdGxlc3M6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBzdHJpY3RNaW46IHRydWVcbiAgICB9LFxuICAgIHNpemU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMFxuICAgIH0sXG4gICAgYmlkaXJlY3Rpb25hbFNpemU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgYmlkaXJlY3Rpb25hbFNpemVNYXliZVBlcmNlbnQ6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIGFsbG93UGVyY2VudDogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgYmlkaXJlY3Rpb25hbFNpemVzOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgLy8gYWxsb3dzIG5lZ2F0aXZlXG4gICAgc2l6ZU1heWJlUGVyY2VudDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbWluOiAwLFxuICAgICAgYWxsb3dQZXJjZW50OiB0cnVlXG4gICAgfSxcbiAgICBheGlzRGlyZWN0aW9uOiB7XG4gICAgICBlbnVtczogWydob3Jpem9udGFsJywgJ2xlZnR3YXJkJywgJ3JpZ2h0d2FyZCcsICd2ZXJ0aWNhbCcsICd1cHdhcmQnLCAnZG93bndhcmQnLCAnYXV0byddXG4gICAgfSxcbiAgICBwYWRkaW5nUmVsYXRpdmVUbzoge1xuICAgICAgZW51bXM6IFsnd2lkdGgnLCAnaGVpZ2h0JywgJ2F2ZXJhZ2UnLCAnbWluJywgJ21heCddXG4gICAgfSxcbiAgICBiZ1dIOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICBhbGxvd1BlcmNlbnQ6IHRydWUsXG4gICAgICBlbnVtczogWydhdXRvJ10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdQb3M6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIGFsbG93UGVyY2VudDogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBiZ1JlbGF0aXZlVG86IHtcbiAgICAgIGVudW1zOiBbJ2lubmVyJywgJ2luY2x1ZGUtcGFkZGluZyddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnUmVwZWF0OiB7XG4gICAgICBlbnVtczogWydyZXBlYXQnLCAncmVwZWF0LXgnLCAncmVwZWF0LXknLCAnbm8tcmVwZWF0J10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdGaXQ6IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAnY29udGFpbicsICdjb3ZlciddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnQ3Jvc3NPcmlnaW46IHtcbiAgICAgIGVudW1zOiBbJ2Fub255bW91cycsICd1c2UtY3JlZGVudGlhbHMnLCAnbnVsbCddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGJnQ2xpcDoge1xuICAgICAgZW51bXM6IFsnbm9uZScsICdub2RlJ10sXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgYmdDb250YWlubWVudDoge1xuICAgICAgZW51bXM6IFsnaW5zaWRlJywgJ292ZXInXSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBjb2xvcjoge1xuICAgICAgY29sb3I6IHRydWVcbiAgICB9LFxuICAgIGNvbG9yczoge1xuICAgICAgY29sb3I6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZVxuICAgIH0sXG4gICAgZmlsbDoge1xuICAgICAgZW51bXM6IFsnc29saWQnLCAnbGluZWFyLWdyYWRpZW50JywgJ3JhZGlhbC1ncmFkaWVudCddXG4gICAgfSxcbiAgICBib29sOiB7XG4gICAgICBlbnVtczogWyd5ZXMnLCAnbm8nXVxuICAgIH0sXG4gICAgYm9vbHM6IHtcbiAgICAgIGVudW1zOiBbJ3llcycsICdubyddLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIGxpbmVTdHlsZToge1xuICAgICAgZW51bXM6IFsnc29saWQnLCAnZG90dGVkJywgJ2Rhc2hlZCddXG4gICAgfSxcbiAgICBsaW5lQ2FwOiB7XG4gICAgICBlbnVtczogWydidXR0JywgJ3JvdW5kJywgJ3NxdWFyZSddXG4gICAgfSxcbiAgICBsaW5lUG9zaXRpb246IHtcbiAgICAgIGVudW1zOiBbJ2NlbnRlcicsICdpbnNpZGUnLCAnb3V0c2lkZSddXG4gICAgfSxcbiAgICBsaW5lSm9pbjoge1xuICAgICAgZW51bXM6IFsncm91bmQnLCAnYmV2ZWwnLCAnbWl0ZXInXVxuICAgIH0sXG4gICAgYm9yZGVyU3R5bGU6IHtcbiAgICAgIGVudW1zOiBbJ3NvbGlkJywgJ2RvdHRlZCcsICdkYXNoZWQnLCAnZG91YmxlJ11cbiAgICB9LFxuICAgIGN1cnZlU3R5bGU6IHtcbiAgICAgIGVudW1zOiBbJ2JlemllcicsICd1bmJ1bmRsZWQtYmV6aWVyJywgJ2hheXN0YWNrJywgJ3NlZ21lbnRzJywgJ3N0cmFpZ2h0JywgJ3N0cmFpZ2h0LXRyaWFuZ2xlJywgJ3RheGknLCAncm91bmQtc2VnbWVudHMnLCAncm91bmQtdGF4aSddXG4gICAgfSxcbiAgICByYWRpdXNUeXBlOiB7XG4gICAgICBlbnVtczogWydhcmMtcmFkaXVzJywgJ2luZmx1ZW5jZS1yYWRpdXMnXSxcbiAgICAgIG11bHRpcGxlOiB0cnVlXG4gICAgfSxcbiAgICBmb250RmFtaWx5OiB7XG4gICAgICByZWdleDogJ14oW1xcXFx3LSBcXFxcXCJdKyg/OlxcXFxzKixcXFxccypbXFxcXHctIFxcXFxcIl0rKSopJCdcbiAgICB9LFxuICAgIGZvbnRTdHlsZToge1xuICAgICAgZW51bXM6IFsnaXRhbGljJywgJ25vcm1hbCcsICdvYmxpcXVlJ11cbiAgICB9LFxuICAgIGZvbnRXZWlnaHQ6IHtcbiAgICAgIGVudW1zOiBbJ25vcm1hbCcsICdib2xkJywgJ2JvbGRlcicsICdsaWdodGVyJywgJzEwMCcsICcyMDAnLCAnMzAwJywgJzQwMCcsICc1MDAnLCAnNjAwJywgJzgwMCcsICc5MDAnLCAxMDAsIDIwMCwgMzAwLCA0MDAsIDUwMCwgNjAwLCA3MDAsIDgwMCwgOTAwXVxuICAgIH0sXG4gICAgdGV4dERlY29yYXRpb246IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAndW5kZXJsaW5lJywgJ292ZXJsaW5lJywgJ2xpbmUtdGhyb3VnaCddXG4gICAgfSxcbiAgICB0ZXh0VHJhbnNmb3JtOiB7XG4gICAgICBlbnVtczogWydub25lJywgJ3VwcGVyY2FzZScsICdsb3dlcmNhc2UnXVxuICAgIH0sXG4gICAgdGV4dFdyYXA6IHtcbiAgICAgIGVudW1zOiBbJ25vbmUnLCAnd3JhcCcsICdlbGxpcHNpcyddXG4gICAgfSxcbiAgICB0ZXh0T3ZlcmZsb3dXcmFwOiB7XG4gICAgICBlbnVtczogWyd3aGl0ZXNwYWNlJywgJ2FueXdoZXJlJ11cbiAgICB9LFxuICAgIHRleHRCYWNrZ3JvdW5kU2hhcGU6IHtcbiAgICAgIGVudW1zOiBbJ3JlY3RhbmdsZScsICdyb3VuZHJlY3RhbmdsZScsICdyb3VuZC1yZWN0YW5nbGUnXVxuICAgIH0sXG4gICAgbm9kZVNoYXBlOiB7XG4gICAgICBlbnVtczogWydyZWN0YW5nbGUnLCAncm91bmRyZWN0YW5nbGUnLCAncm91bmQtcmVjdGFuZ2xlJywgJ2N1dHJlY3RhbmdsZScsICdjdXQtcmVjdGFuZ2xlJywgJ2JvdHRvbXJvdW5kcmVjdGFuZ2xlJywgJ2JvdHRvbS1yb3VuZC1yZWN0YW5nbGUnLCAnYmFycmVsJywgJ2VsbGlwc2UnLCAndHJpYW5nbGUnLCAncm91bmQtdHJpYW5nbGUnLCAnc3F1YXJlJywgJ3BlbnRhZ29uJywgJ3JvdW5kLXBlbnRhZ29uJywgJ2hleGFnb24nLCAncm91bmQtaGV4YWdvbicsICdjb25jYXZlaGV4YWdvbicsICdjb25jYXZlLWhleGFnb24nLCAnaGVwdGFnb24nLCAncm91bmQtaGVwdGFnb24nLCAnb2N0YWdvbicsICdyb3VuZC1vY3RhZ29uJywgJ3RhZycsICdyb3VuZC10YWcnLCAnc3RhcicsICdkaWFtb25kJywgJ3JvdW5kLWRpYW1vbmQnLCAndmVlJywgJ3Job21ib2lkJywgJ3JpZ2h0LXJob21ib2lkJywgJ3BvbHlnb24nXVxuICAgIH0sXG4gICAgb3ZlcmxheVNoYXBlOiB7XG4gICAgICBlbnVtczogWydyb3VuZHJlY3RhbmdsZScsICdyb3VuZC1yZWN0YW5nbGUnLCAnZWxsaXBzZSddXG4gICAgfSxcbiAgICBjb3JuZXJSYWRpdXM6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG1pbjogMCxcbiAgICAgIHVuaXRzOiAncHh8ZW0nLFxuICAgICAgaW1wbGljaXRVbml0czogJ3B4JyxcbiAgICAgIGVudW1zOiBbJ2F1dG8nXVxuICAgIH0sXG4gICAgY29tcG91bmRJbmNsdWRlTGFiZWxzOiB7XG4gICAgICBlbnVtczogWydpbmNsdWRlJywgJ2V4Y2x1ZGUnXVxuICAgIH0sXG4gICAgYXJyb3dTaGFwZToge1xuICAgICAgZW51bXM6IFsndGVlJywgJ3RyaWFuZ2xlJywgJ3RyaWFuZ2xlLXRlZScsICdjaXJjbGUtdHJpYW5nbGUnLCAndHJpYW5nbGUtY3Jvc3MnLCAndHJpYW5nbGUtYmFja2N1cnZlJywgJ3ZlZScsICdzcXVhcmUnLCAnY2lyY2xlJywgJ2RpYW1vbmQnLCAnY2hldnJvbicsICdub25lJ11cbiAgICB9LFxuICAgIGFycm93RmlsbDoge1xuICAgICAgZW51bXM6IFsnZmlsbGVkJywgJ2hvbGxvdyddXG4gICAgfSxcbiAgICBhcnJvd1dpZHRoOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICB1bml0czogJyV8cHh8ZW0nLFxuICAgICAgaW1wbGljaXRVbml0czogJ3B4JyxcbiAgICAgIGVudW1zOiBbJ21hdGNoLWxpbmUnXVxuICAgIH0sXG4gICAgZGlzcGxheToge1xuICAgICAgZW51bXM6IFsnZWxlbWVudCcsICdub25lJ11cbiAgICB9LFxuICAgIHZpc2liaWxpdHk6IHtcbiAgICAgIGVudW1zOiBbJ2hpZGRlbicsICd2aXNpYmxlJ11cbiAgICB9LFxuICAgIHpDb21wb3VuZERlcHRoOiB7XG4gICAgICBlbnVtczogWydib3R0b20nLCAnb3JwaGFuJywgJ2F1dG8nLCAndG9wJ11cbiAgICB9LFxuICAgIHpJbmRleENvbXBhcmU6IHtcbiAgICAgIGVudW1zOiBbJ2F1dG8nLCAnbWFudWFsJ11cbiAgICB9LFxuICAgIHZhbGlnbjoge1xuICAgICAgZW51bXM6IFsndG9wJywgJ2NlbnRlcicsICdib3R0b20nXVxuICAgIH0sXG4gICAgaGFsaWduOiB7XG4gICAgICBlbnVtczogWydsZWZ0JywgJ2NlbnRlcicsICdyaWdodCddXG4gICAgfSxcbiAgICBqdXN0aWZpY2F0aW9uOiB7XG4gICAgICBlbnVtczogWydsZWZ0JywgJ2NlbnRlcicsICdyaWdodCcsICdhdXRvJ11cbiAgICB9LFxuICAgIHRleHQ6IHtcbiAgICAgIHN0cmluZzogdHJ1ZVxuICAgIH0sXG4gICAgZGF0YToge1xuICAgICAgbWFwcGluZzogdHJ1ZSxcbiAgICAgIHJlZ2V4OiBkYXRhKCdkYXRhJylcbiAgICB9LFxuICAgIGxheW91dERhdGE6IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICByZWdleDogZGF0YSgnbGF5b3V0RGF0YScpXG4gICAgfSxcbiAgICBzY3JhdGNoOiB7XG4gICAgICBtYXBwaW5nOiB0cnVlLFxuICAgICAgcmVnZXg6IGRhdGEoJ3NjcmF0Y2gnKVxuICAgIH0sXG4gICAgbWFwRGF0YToge1xuICAgICAgbWFwcGluZzogdHJ1ZSxcbiAgICAgIHJlZ2V4OiBtYXBEYXRhKCdtYXBEYXRhJylcbiAgICB9LFxuICAgIG1hcExheW91dERhdGE6IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICByZWdleDogbWFwRGF0YSgnbWFwTGF5b3V0RGF0YScpXG4gICAgfSxcbiAgICBtYXBTY3JhdGNoOiB7XG4gICAgICBtYXBwaW5nOiB0cnVlLFxuICAgICAgcmVnZXg6IG1hcERhdGEoJ21hcFNjcmF0Y2gnKVxuICAgIH0sXG4gICAgZm46IHtcbiAgICAgIG1hcHBpbmc6IHRydWUsXG4gICAgICBmbjogdHJ1ZVxuICAgIH0sXG4gICAgdXJsOiB7XG4gICAgICByZWdleGVzOiB1cmxSZWdleGVzLFxuICAgICAgc2luZ2xlUmVnZXhNYXRjaFZhbHVlOiB0cnVlXG4gICAgfSxcbiAgICB1cmxzOiB7XG4gICAgICByZWdleGVzOiB1cmxSZWdleGVzLFxuICAgICAgc2luZ2xlUmVnZXhNYXRjaFZhbHVlOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWVcbiAgICB9LFxuICAgIHByb3BMaXN0OiB7XG4gICAgICBwcm9wTGlzdDogdHJ1ZVxuICAgIH0sXG4gICAgYW5nbGU6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIHVuaXRzOiAnZGVnfHJhZCcsXG4gICAgICBpbXBsaWNpdFVuaXRzOiAncmFkJ1xuICAgIH0sXG4gICAgdGV4dFJvdGF0aW9uOiB7XG4gICAgICBudW1iZXI6IHRydWUsXG4gICAgICB1bml0czogJ2RlZ3xyYWQnLFxuICAgICAgaW1wbGljaXRVbml0czogJ3JhZCcsXG4gICAgICBlbnVtczogWydub25lJywgJ2F1dG9yb3RhdGUnXVxuICAgIH0sXG4gICAgcG9seWdvblBvaW50TGlzdDoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBldmVuTXVsdGlwbGU6IHRydWUsXG4gICAgICBtaW46IC0xLFxuICAgICAgbWF4OiAxLFxuICAgICAgdW5pdGxlc3M6IHRydWVcbiAgICB9LFxuICAgIGVkZ2VEaXN0YW5jZXM6IHtcbiAgICAgIGVudW1zOiBbJ2ludGVyc2VjdGlvbicsICdub2RlLXBvc2l0aW9uJywgJ2VuZHBvaW50cyddXG4gICAgfSxcbiAgICBlZGdlRW5kcG9pbnQ6IHtcbiAgICAgIG51bWJlcjogdHJ1ZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgdW5pdHM6ICclfHB4fGVtfGRlZ3xyYWQnLFxuICAgICAgaW1wbGljaXRVbml0czogJ3B4JyxcbiAgICAgIGVudW1zOiBbJ2luc2lkZS10by1ub2RlJywgJ291dHNpZGUtdG8tbm9kZScsICdvdXRzaWRlLXRvLW5vZGUtb3ItbGFiZWwnLCAnb3V0c2lkZS10by1saW5lJywgJ291dHNpZGUtdG8tbGluZS1vci1sYWJlbCddLFxuICAgICAgc2luZ2xlRW51bTogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSh2YWxBcnIsIHVuaXRzQXJyKSB7XG4gICAgICAgIHN3aXRjaCAodmFsQXJyLmxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIC8vIGNhbiBiZSAlIG9yIHB4IG9ubHlcbiAgICAgICAgICAgIHJldHVybiB1bml0c0FyclswXSAhPT0gJ2RlZycgJiYgdW5pdHNBcnJbMF0gIT09ICdyYWQnICYmIHVuaXRzQXJyWzFdICE9PSAnZGVnJyAmJiB1bml0c0FyclsxXSAhPT0gJ3JhZCc7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgLy8gY2FuIGJlIGVudW0sIGRlZywgb3IgcmFkIG9ubHlcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcodmFsQXJyWzBdKSB8fCB1bml0c0FyclswXSA9PT0gJ2RlZycgfHwgdW5pdHNBcnJbMF0gPT09ICdyYWQnO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGVhc2luZzoge1xuICAgICAgcmVnZXhlczogWydeKHNwcmluZylcXFxccypcXFxcKFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKixcXFxccyooJyArIG51bWJlciQxICsgJylcXFxccypcXFxcKSQnLCAnXihjdWJpYy1iZXppZXIpXFxcXHMqXFxcXChcXFxccyooJyArIG51bWJlciQxICsgJylcXFxccyosXFxcXHMqKCcgKyBudW1iZXIkMSArICcpXFxcXHMqLFxcXFxzKignICsgbnVtYmVyJDEgKyAnKVxcXFxzKixcXFxccyooJyArIG51bWJlciQxICsgJylcXFxccypcXFxcKSQnXSxcbiAgICAgIGVudW1zOiBbJ2xpbmVhcicsICdlYXNlJywgJ2Vhc2UtaW4nLCAnZWFzZS1vdXQnLCAnZWFzZS1pbi1vdXQnLCAnZWFzZS1pbi1zaW5lJywgJ2Vhc2Utb3V0LXNpbmUnLCAnZWFzZS1pbi1vdXQtc2luZScsICdlYXNlLWluLXF1YWQnLCAnZWFzZS1vdXQtcXVhZCcsICdlYXNlLWluLW91dC1xdWFkJywgJ2Vhc2UtaW4tY3ViaWMnLCAnZWFzZS1vdXQtY3ViaWMnLCAnZWFzZS1pbi1vdXQtY3ViaWMnLCAnZWFzZS1pbi1xdWFydCcsICdlYXNlLW91dC1xdWFydCcsICdlYXNlLWluLW91dC1xdWFydCcsICdlYXNlLWluLXF1aW50JywgJ2Vhc2Utb3V0LXF1aW50JywgJ2Vhc2UtaW4tb3V0LXF1aW50JywgJ2Vhc2UtaW4tZXhwbycsICdlYXNlLW91dC1leHBvJywgJ2Vhc2UtaW4tb3V0LWV4cG8nLCAnZWFzZS1pbi1jaXJjJywgJ2Vhc2Utb3V0LWNpcmMnLCAnZWFzZS1pbi1vdXQtY2lyYyddXG4gICAgfSxcbiAgICBncmFkaWVudERpcmVjdGlvbjoge1xuICAgICAgZW51bXM6IFsndG8tYm90dG9tJywgJ3RvLXRvcCcsICd0by1sZWZ0JywgJ3RvLXJpZ2h0JywgJ3RvLWJvdHRvbS1yaWdodCcsICd0by1ib3R0b20tbGVmdCcsICd0by10b3AtcmlnaHQnLCAndG8tdG9wLWxlZnQnLCAndG8tcmlnaHQtYm90dG9tJywgJ3RvLWxlZnQtYm90dG9tJywgJ3RvLXJpZ2h0LXRvcCcsICd0by1sZWZ0LXRvcCcgLy8gZGlmZmVyZW50IG9yZGVyXG4gICAgICBdXG4gICAgfSxcblxuICAgIGJvdW5kc0V4cGFuc2lvbjoge1xuICAgICAgbnVtYmVyOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBtaW46IDAsXG4gICAgICB2YWxpZGF0ZTogZnVuY3Rpb24gdmFsaWRhdGUodmFsQXJyKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSB2YWxBcnIubGVuZ3RoO1xuICAgICAgICByZXR1cm4gbGVuZ3RoID09PSAxIHx8IGxlbmd0aCA9PT0gMiB8fCBsZW5ndGggPT09IDQ7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgZGlmZiA9IHtcbiAgICB6ZXJvTm9uWmVybzogZnVuY3Rpb24gemVyb05vblplcm8odmFsMSwgdmFsMikge1xuICAgICAgaWYgKCh2YWwxID09IG51bGwgfHwgdmFsMiA9PSBudWxsKSAmJiB2YWwxICE9PSB2YWwyKSB7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBudWxsIGNhc2VzIGNvdWxkIHJlcHJlc2VudCBhbnkgdmFsdWVcbiAgICAgIH1cbiAgICAgIGlmICh2YWwxID09IDAgJiYgdmFsMiAhPSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmICh2YWwxICE9IDAgJiYgdmFsMiA9PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0sXG4gICAgYW55OiBmdW5jdGlvbiBhbnkodmFsMSwgdmFsMikge1xuICAgICAgcmV0dXJuIHZhbDEgIT0gdmFsMjtcbiAgICB9LFxuICAgIGVtcHR5Tm9uRW1wdHk6IGZ1bmN0aW9uIGVtcHR5Tm9uRW1wdHkoc3RyMSwgc3RyMikge1xuICAgICAgdmFyIGVtcHR5MSA9IGVtcHR5U3RyaW5nKHN0cjEpO1xuICAgICAgdmFyIGVtcHR5MiA9IGVtcHR5U3RyaW5nKHN0cjIpO1xuICAgICAgcmV0dXJuIGVtcHR5MSAmJiAhZW1wdHkyIHx8ICFlbXB0eTEgJiYgZW1wdHkyO1xuICAgIH1cbiAgfTtcblxuICAvLyBkZWZpbmUgdmlzdWFsIHN0eWxlIHByb3BlcnRpZXNcbiAgLy9cbiAgLy8gLSBuLmIuIGFkZGluZyBhIG5ldyBncm91cCBvZiBwcm9wcyBtYXkgcmVxdWlyZSB1cGRhdGVzIHRvIHVwZGF0ZVN0eWxlSGludHMoKVxuICAvLyAtIGFkZGluZyBuZXcgcHJvcHMgdG8gYW4gZXhpc3RpbmcgZ3JvdXAgZ2V0cyBoYW5kbGVkIGF1dG9tYXRpY2FsbHlcblxuICB2YXIgdCA9IHN0eWZuJDIudHlwZXM7XG4gIHZhciBtYWluTGFiZWwgPSBbe1xuICAgIG5hbWU6ICdsYWJlbCcsXG4gICAgdHlwZTogdC50ZXh0LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueSxcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5lbXB0eU5vbkVtcHR5XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1yb3RhdGlvbicsXG4gICAgdHlwZTogdC50ZXh0Um90YXRpb24sXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1tYXJnaW4teCcsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW1hcmdpbi15JyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIHNvdXJjZUxhYmVsID0gW3tcbiAgICBuYW1lOiAnc291cmNlLWxhYmVsJyxcbiAgICB0eXBlOiB0LnRleHQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc291cmNlLXRleHQtcm90YXRpb24nLFxuICAgIHR5cGU6IHQudGV4dFJvdGF0aW9uLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NvdXJjZS10ZXh0LW1hcmdpbi14JyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NvdXJjZS10ZXh0LW1hcmdpbi15JyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NvdXJjZS10ZXh0LW9mZnNldCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIHRhcmdldExhYmVsID0gW3tcbiAgICBuYW1lOiAndGFyZ2V0LWxhYmVsJyxcbiAgICB0eXBlOiB0LnRleHQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGFyZ2V0LXRleHQtcm90YXRpb24nLFxuICAgIHR5cGU6IHQudGV4dFJvdGF0aW9uLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RhcmdldC10ZXh0LW1hcmdpbi14JyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RhcmdldC10ZXh0LW1hcmdpbi15JyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RhcmdldC10ZXh0LW9mZnNldCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIGxhYmVsRGltZW5zaW9ucyA9IFt7XG4gICAgbmFtZTogJ2ZvbnQtZmFtaWx5JyxcbiAgICB0eXBlOiB0LmZvbnRGYW1pbHksXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZm9udC1zdHlsZScsXG4gICAgdHlwZTogdC5mb250U3R5bGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZm9udC13ZWlnaHQnLFxuICAgIHR5cGU6IHQuZm9udFdlaWdodCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdmb250LXNpemUnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LXRyYW5zZm9ybScsXG4gICAgdHlwZTogdC50ZXh0VHJhbnNmb3JtLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtd3JhcCcsXG4gICAgdHlwZTogdC50ZXh0V3JhcCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW92ZXJmbG93LXdyYXAnLFxuICAgIHR5cGU6IHQudGV4dE92ZXJmbG93V3JhcCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW1heC13aWR0aCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtb3V0bGluZS13aWR0aCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtaGVpZ2h0JyxcbiAgICB0eXBlOiB0LnBvc2l0aXZlTnVtYmVyLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIGNvbW1vbkxhYmVsID0gW3tcbiAgICBuYW1lOiAndGV4dC12YWxpZ24nLFxuICAgIHR5cGU6IHQudmFsaWduLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtaGFsaWduJyxcbiAgICB0eXBlOiB0LmhhbGlnbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdjb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtb3V0bGluZS1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtb3V0bGluZS1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWJhY2tncm91bmQtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWJhY2tncm91bmQtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1iYWNrZ3JvdW5kLXBhZGRpbmcnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWJvcmRlci1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LWJvcmRlci1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtYm9yZGVyLXdpZHRoJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1ib3JkZXItc3R5bGUnLFxuICAgIHR5cGU6IHQuYm9yZGVyU3R5bGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1iYWNrZ3JvdW5kLXNoYXBlJyxcbiAgICB0eXBlOiB0LnRleHRCYWNrZ3JvdW5kU2hhcGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGV4dC1qdXN0aWZpY2F0aW9uJyxcbiAgICB0eXBlOiB0Lmp1c3RpZmljYXRpb25cbiAgfV07XG4gIHZhciBiZWhhdmlvciA9IFt7XG4gICAgbmFtZTogJ2V2ZW50cycsXG4gICAgdHlwZTogdC5ib29sLFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RleHQtZXZlbnRzJyxcbiAgICB0eXBlOiB0LmJvb2wsXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuYW55XG4gIH1dO1xuICB2YXIgdmlzaWJpbGl0eSA9IFt7XG4gICAgbmFtZTogJ2Rpc3BsYXknLFxuICAgIHR5cGU6IHQuZGlzcGxheSxcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5hbnksXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55LFxuICAgIHRyaWdnZXJzQm91bmRzT2ZDb25uZWN0ZWRFZGdlczogdHJ1ZVxuICB9LCB7XG4gICAgbmFtZTogJ3Zpc2liaWxpdHknLFxuICAgIHR5cGU6IHQudmlzaWJpbGl0eSxcbiAgICB0cmlnZ2Vyc1pPcmRlcjogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdvcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXIsXG4gICAgdHJpZ2dlcnNaT3JkZXI6IGRpZmYuemVyb05vblplcm9cbiAgfSwge1xuICAgIG5hbWU6ICd0ZXh0LW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ21pbi16b29tZWQtZm9udC1zaXplJyxcbiAgICB0eXBlOiB0LnNpemVcbiAgfSwge1xuICAgIG5hbWU6ICd6LWNvbXBvdW5kLWRlcHRoJyxcbiAgICB0eXBlOiB0LnpDb21wb3VuZERlcHRoLFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3otaW5kZXgtY29tcGFyZScsXG4gICAgdHlwZTogdC56SW5kZXhDb21wYXJlLFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3otaW5kZXgnLFxuICAgIHR5cGU6IHQubnVtYmVyLFxuICAgIHRyaWdnZXJzWk9yZGVyOiBkaWZmLmFueVxuICB9XTtcbiAgdmFyIG92ZXJsYXkgPSBbe1xuICAgIG5hbWU6ICdvdmVybGF5LXBhZGRpbmcnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdvdmVybGF5LWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnb3ZlcmxheS1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXIsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuemVyb05vblplcm9cbiAgfSwge1xuICAgIG5hbWU6ICdvdmVybGF5LXNoYXBlJyxcbiAgICB0eXBlOiB0Lm92ZXJsYXlTaGFwZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdvdmVybGF5LWNvcm5lci1yYWRpdXMnLFxuICAgIHR5cGU6IHQuY29ybmVyUmFkaXVzXG4gIH1dO1xuICB2YXIgdW5kZXJsYXkgPSBbe1xuICAgIG5hbWU6ICd1bmRlcmxheS1wYWRkaW5nJyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndW5kZXJsYXktY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICd1bmRlcmxheS1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXIsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuemVyb05vblplcm9cbiAgfSwge1xuICAgIG5hbWU6ICd1bmRlcmxheS1zaGFwZScsXG4gICAgdHlwZTogdC5vdmVybGF5U2hhcGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndW5kZXJsYXktY29ybmVyLXJhZGl1cycsXG4gICAgdHlwZTogdC5jb3JuZXJSYWRpdXNcbiAgfV07XG4gIHZhciB0cmFuc2l0aW9uID0gW3tcbiAgICBuYW1lOiAndHJhbnNpdGlvbi1wcm9wZXJ0eScsXG4gICAgdHlwZTogdC5wcm9wTGlzdFxuICB9LCB7XG4gICAgbmFtZTogJ3RyYW5zaXRpb24tZHVyYXRpb24nLFxuICAgIHR5cGU6IHQudGltZVxuICB9LCB7XG4gICAgbmFtZTogJ3RyYW5zaXRpb24tZGVsYXknLFxuICAgIHR5cGU6IHQudGltZVxuICB9LCB7XG4gICAgbmFtZTogJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJyxcbiAgICB0eXBlOiB0LmVhc2luZ1xuICB9XTtcbiAgdmFyIG5vZGVTaXplSGFzaE92ZXJyaWRlID0gZnVuY3Rpb24gbm9kZVNpemVIYXNoT3ZlcnJpZGUoZWxlLCBwYXJzZWRQcm9wKSB7XG4gICAgaWYgKHBhcnNlZFByb3AudmFsdWUgPT09ICdsYWJlbCcpIHtcbiAgICAgIHJldHVybiAtZWxlLnBvb2xJbmRleCgpOyAvLyBubyBoYXNoIGtleSBoaXRzIGlzIHVzaW5nIGxhYmVsIHNpemUgKGhpdHJhdGUgZm9yIHBlcmYgcHJvYmFibHkgbG93IGFueXdheSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhcnNlZFByb3AucGZWYWx1ZTtcbiAgICB9XG4gIH07XG4gIHZhciBub2RlQm9keSA9IFt7XG4gICAgbmFtZTogJ2hlaWdodCcsXG4gICAgdHlwZTogdC5ub2RlU2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnksXG4gICAgaGFzaE92ZXJyaWRlOiBub2RlU2l6ZUhhc2hPdmVycmlkZVxuICB9LCB7XG4gICAgbmFtZTogJ3dpZHRoJyxcbiAgICB0eXBlOiB0Lm5vZGVTaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueSxcbiAgICBoYXNoT3ZlcnJpZGU6IG5vZGVTaXplSGFzaE92ZXJyaWRlXG4gIH0sIHtcbiAgICBuYW1lOiAnc2hhcGUnLFxuICAgIHR5cGU6IHQubm9kZVNoYXBlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NoYXBlLXBvbHlnb24tcG9pbnRzJyxcbiAgICB0eXBlOiB0LnBvbHlnb25Qb2ludExpc3QsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnY29ybmVyLXJhZGl1cycsXG4gICAgdHlwZTogdC5jb3JuZXJSYWRpdXNcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1maWxsJyxcbiAgICB0eXBlOiB0LmZpbGxcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtYmxhY2tlbicsXG4gICAgdHlwZTogdC5uT25lT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1ncmFkaWVudC1zdG9wLWNvbG9ycycsXG4gICAgdHlwZTogdC5jb2xvcnNcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJyxcbiAgICB0eXBlOiB0LnBlcmNlbnRhZ2VzXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1ncmFkaWVudC1kaXJlY3Rpb24nLFxuICAgIHR5cGU6IHQuZ3JhZGllbnREaXJlY3Rpb25cbiAgfSwge1xuICAgIG5hbWU6ICdwYWRkaW5nJyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAncGFkZGluZy1yZWxhdGl2ZS10bycsXG4gICAgdHlwZTogdC5wYWRkaW5nUmVsYXRpdmVUbyxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdib3VuZHMtZXhwYW5zaW9uJyxcbiAgICB0eXBlOiB0LmJvdW5kc0V4cGFuc2lvbixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBub2RlQm9yZGVyID0gW3tcbiAgICBuYW1lOiAnYm9yZGVyLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnYm9yZGVyLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci13aWR0aCcsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci1zdHlsZScsXG4gICAgdHlwZTogdC5ib3JkZXJTdHlsZVxuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci1jYXAnLFxuICAgIHR5cGU6IHQubGluZUNhcFxuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci1qb2luJyxcbiAgICB0eXBlOiB0LmxpbmVKb2luXG4gIH0sIHtcbiAgICBuYW1lOiAnYm9yZGVyLWRhc2gtcGF0dGVybicsXG4gICAgdHlwZTogdC5udW1iZXJzXG4gIH0sIHtcbiAgICBuYW1lOiAnYm9yZGVyLWRhc2gtb2Zmc2V0JyxcbiAgICB0eXBlOiB0Lm51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ2JvcmRlci1wb3NpdGlvbicsXG4gICAgdHlwZTogdC5saW5lUG9zaXRpb25cbiAgfV07XG4gIHZhciBub2RlT3V0bGluZSA9IFt7XG4gICAgbmFtZTogJ291dGxpbmUtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdvdXRsaW5lLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ291dGxpbmUtd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdvdXRsaW5lLXN0eWxlJyxcbiAgICB0eXBlOiB0LmJvcmRlclN0eWxlXG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0bGluZS1vZmZzZXQnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBiYWNrZ3JvdW5kSW1hZ2UgPSBbe1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWltYWdlJyxcbiAgICB0eXBlOiB0LnVybHNcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWltYWdlLWNyb3Nzb3JpZ2luJyxcbiAgICB0eXBlOiB0LmJnQ3Jvc3NPcmlnaW5cbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWltYWdlLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlcnNcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWltYWdlLWNvbnRhaW5tZW50JyxcbiAgICB0eXBlOiB0LmJnQ29udGFpbm1lbnRcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWltYWdlLXNtb290aGluZycsXG4gICAgdHlwZTogdC5ib29sc1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtcG9zaXRpb24teCcsXG4gICAgdHlwZTogdC5iZ1Bvc1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtcG9zaXRpb24teScsXG4gICAgdHlwZTogdC5iZ1Bvc1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtd2lkdGgtcmVsYXRpdmUtdG8nLFxuICAgIHR5cGU6IHQuYmdSZWxhdGl2ZVRvXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1oZWlnaHQtcmVsYXRpdmUtdG8nLFxuICAgIHR5cGU6IHQuYmdSZWxhdGl2ZVRvXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1yZXBlYXQnLFxuICAgIHR5cGU6IHQuYmdSZXBlYXRcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWZpdCcsXG4gICAgdHlwZTogdC5iZ0ZpdFxuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtY2xpcCcsXG4gICAgdHlwZTogdC5iZ0NsaXBcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLXdpZHRoJyxcbiAgICB0eXBlOiB0LmJnV0hcbiAgfSwge1xuICAgIG5hbWU6ICdiYWNrZ3JvdW5kLWhlaWdodCcsXG4gICAgdHlwZTogdC5iZ1dIXG4gIH0sIHtcbiAgICBuYW1lOiAnYmFja2dyb3VuZC1vZmZzZXQteCcsXG4gICAgdHlwZTogdC5iZ1Bvc1xuICB9LCB7XG4gICAgbmFtZTogJ2JhY2tncm91bmQtb2Zmc2V0LXknLFxuICAgIHR5cGU6IHQuYmdQb3NcbiAgfV07XG4gIHZhciBjb21wb3VuZCA9IFt7XG4gICAgbmFtZTogJ3Bvc2l0aW9uJyxcbiAgICB0eXBlOiB0LnBvc2l0aW9uLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2NvbXBvdW5kLXNpemluZy13cnQtbGFiZWxzJyxcbiAgICB0eXBlOiB0LmNvbXBvdW5kSW5jbHVkZUxhYmVscyxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdtaW4td2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdtaW4td2lkdGgtYmlhcy1sZWZ0JyxcbiAgICB0eXBlOiB0LnNpemVNYXliZVBlcmNlbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLXdpZHRoLWJpYXMtcmlnaHQnLFxuICAgIHR5cGU6IHQuc2l6ZU1heWJlUGVyY2VudCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdtaW4taGVpZ2h0JyxcbiAgICB0eXBlOiB0LnNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnbWluLWhlaWdodC1iaWFzLXRvcCcsXG4gICAgdHlwZTogdC5zaXplTWF5YmVQZXJjZW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ21pbi1oZWlnaHQtYmlhcy1ib3R0b20nLFxuICAgIHR5cGU6IHQuc2l6ZU1heWJlUGVyY2VudCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBlZGdlTGluZSA9IFt7XG4gICAgbmFtZTogJ2xpbmUtc3R5bGUnLFxuICAgIHR5cGU6IHQubGluZVN0eWxlXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtZmlsbCcsXG4gICAgdHlwZTogdC5maWxsXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1jYXAnLFxuICAgIHR5cGU6IHQubGluZUNhcFxuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1kYXNoLXBhdHRlcm4nLFxuICAgIHR5cGU6IHQubnVtYmVyc1xuICB9LCB7XG4gICAgbmFtZTogJ2xpbmUtZGFzaC1vZmZzZXQnLFxuICAgIHR5cGU6IHQubnVtYmVyXG4gIH0sIHtcbiAgICBuYW1lOiAnbGluZS1ncmFkaWVudC1zdG9wLWNvbG9ycycsXG4gICAgdHlwZTogdC5jb2xvcnNcbiAgfSwge1xuICAgIG5hbWU6ICdsaW5lLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJyxcbiAgICB0eXBlOiB0LnBlcmNlbnRhZ2VzXG4gIH0sIHtcbiAgICBuYW1lOiAnY3VydmUtc3R5bGUnLFxuICAgIHR5cGU6IHQuY3VydmVTdHlsZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnksXG4gICAgdHJpZ2dlcnNCb3VuZHNPZlBhcmFsbGVsQmV6aWVyczogdHJ1ZVxuICB9LCB7XG4gICAgbmFtZTogJ2hheXN0YWNrLXJhZGl1cycsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3NvdXJjZS1lbmRwb2ludCcsXG4gICAgdHlwZTogdC5lZGdlRW5kcG9pbnQsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGFyZ2V0LWVuZHBvaW50JyxcbiAgICB0eXBlOiB0LmVkZ2VFbmRwb2ludCxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdjb250cm9sLXBvaW50LXN0ZXAtc2l6ZScsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2VzJyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplcyxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdjb250cm9sLXBvaW50LXdlaWdodHMnLFxuICAgIHR5cGU6IHQubnVtYmVycyxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdzZWdtZW50LWRpc3RhbmNlcycsXG4gICAgdHlwZTogdC5iaWRpcmVjdGlvbmFsU2l6ZXMsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc2VnbWVudC13ZWlnaHRzJyxcbiAgICB0eXBlOiB0Lm51bWJlcnMsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc2VnbWVudC1yYWRpaScsXG4gICAgdHlwZTogdC5udW1iZXJzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3JhZGl1cy10eXBlJyxcbiAgICB0eXBlOiB0LnJhZGl1c1R5cGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAndGF4aS10dXJuJyxcbiAgICB0eXBlOiB0LmJpZGlyZWN0aW9uYWxTaXplTWF5YmVQZXJjZW50LFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RheGktdHVybi1taW4tZGlzdGFuY2UnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICd0YXhpLWRpcmVjdGlvbicsXG4gICAgdHlwZTogdC5heGlzRGlyZWN0aW9uLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RheGktcmFkaXVzJyxcbiAgICB0eXBlOiB0Lm51bWJlcixcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdlZGdlLWRpc3RhbmNlcycsXG4gICAgdHlwZTogdC5lZGdlRGlzdGFuY2VzLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2Fycm93LXNjYWxlJyxcbiAgICB0eXBlOiB0LnBvc2l0aXZlTnVtYmVyLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2xvb3AtZGlyZWN0aW9uJyxcbiAgICB0eXBlOiB0LmFuZ2xlLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ2xvb3Atc3dlZXAnLFxuICAgIHR5cGU6IHQuYW5nbGUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnc291cmNlLWRpc3RhbmNlLWZyb20tbm9kZScsXG4gICAgdHlwZTogdC5zaXplLFxuICAgIHRyaWdnZXJzQm91bmRzOiBkaWZmLmFueVxuICB9LCB7XG4gICAgbmFtZTogJ3RhcmdldC1kaXN0YW5jZS1mcm9tLW5vZGUnLFxuICAgIHR5cGU6IHQuc2l6ZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfV07XG4gIHZhciBnaG9zdCA9IFt7XG4gICAgbmFtZTogJ2dob3N0JyxcbiAgICB0eXBlOiB0LmJvb2wsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZ2hvc3Qtb2Zmc2V0LXgnLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZ2hvc3Qtb2Zmc2V0LXknLFxuICAgIHR5cGU6IHQuYmlkaXJlY3Rpb25hbFNpemUsXG4gICAgdHJpZ2dlcnNCb3VuZHM6IGRpZmYuYW55XG4gIH0sIHtcbiAgICBuYW1lOiAnZ2hvc3Qtb3BhY2l0eScsXG4gICAgdHlwZTogdC56ZXJvT25lTnVtYmVyXG4gIH1dO1xuICB2YXIgY29yZSA9IFt7XG4gICAgbmFtZTogJ3NlbGVjdGlvbi1ib3gtY29sb3InLFxuICAgIHR5cGU6IHQuY29sb3JcbiAgfSwge1xuICAgIG5hbWU6ICdzZWxlY3Rpb24tYm94LW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9LCB7XG4gICAgbmFtZTogJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnc2VsZWN0aW9uLWJveC1ib3JkZXItd2lkdGgnLFxuICAgIHR5cGU6IHQuc2l6ZVxuICB9LCB7XG4gICAgbmFtZTogJ2FjdGl2ZS1iZy1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2FjdGl2ZS1iZy1vcGFjaXR5JyxcbiAgICB0eXBlOiB0Lnplcm9PbmVOdW1iZXJcbiAgfSwge1xuICAgIG5hbWU6ICdhY3RpdmUtYmctc2l6ZScsXG4gICAgdHlwZTogdC5zaXplXG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0c2lkZS10ZXh0dXJlLWJnLWNvbG9yJyxcbiAgICB0eXBlOiB0LmNvbG9yXG4gIH0sIHtcbiAgICBuYW1lOiAnb3V0c2lkZS10ZXh0dXJlLWJnLW9wYWNpdHknLFxuICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICB9XTtcblxuICAvLyBwaWUgYmFja2dyb3VuZHMgZm9yIG5vZGVzXG4gIHZhciBwaWUgPSBbXTtcbiAgc3R5Zm4kMi5waWVCYWNrZ3JvdW5kTiA9IDE2OyAvLyBiZWNhdXNlIHRoZSBwaWUgcHJvcGVydGllcyBhcmUgbnVtYmVyZWQsIGdpdmUgYWNjZXNzIHRvIGEgY29uc3RhbnQgTiAoZm9yIHJlbmRlcmVyIHVzZSlcbiAgcGllLnB1c2goe1xuICAgIG5hbWU6ICdwaWUtc2l6ZScsXG4gICAgdHlwZTogdC5zaXplTWF5YmVQZXJjZW50XG4gIH0pO1xuICBmb3IgKHZhciBpID0gMTsgaSA8PSBzdHlmbiQyLnBpZUJhY2tncm91bmROOyBpKyspIHtcbiAgICBwaWUucHVzaCh7XG4gICAgICBuYW1lOiAncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLWNvbG9yJyxcbiAgICAgIHR5cGU6IHQuY29sb3JcbiAgICB9KTtcbiAgICBwaWUucHVzaCh7XG4gICAgICBuYW1lOiAncGllLScgKyBpICsgJy1iYWNrZ3JvdW5kLXNpemUnLFxuICAgICAgdHlwZTogdC5wZXJjZW50XG4gICAgfSk7XG4gICAgcGllLnB1c2goe1xuICAgICAgbmFtZTogJ3BpZS0nICsgaSArICctYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICAgIHR5cGU6IHQuemVyb09uZU51bWJlclxuICAgIH0pO1xuICB9XG5cbiAgLy8gZWRnZSBhcnJvd3NcbiAgdmFyIGVkZ2VBcnJvdyA9IFtdO1xuICB2YXIgYXJyb3dQcmVmaXhlcyA9IHN0eWZuJDIuYXJyb3dQcmVmaXhlcyA9IFsnc291cmNlJywgJ21pZC1zb3VyY2UnLCAndGFyZ2V0JywgJ21pZC10YXJnZXQnXTtcbiAgW3tcbiAgICBuYW1lOiAnYXJyb3ctc2hhcGUnLFxuICAgIHR5cGU6IHQuYXJyb3dTaGFwZSxcbiAgICB0cmlnZ2Vyc0JvdW5kczogZGlmZi5hbnlcbiAgfSwge1xuICAgIG5hbWU6ICdhcnJvdy1jb2xvcicsXG4gICAgdHlwZTogdC5jb2xvclxuICB9LCB7XG4gICAgbmFtZTogJ2Fycm93LWZpbGwnLFxuICAgIHR5cGU6IHQuYXJyb3dGaWxsXG4gIH0sIHtcbiAgICBuYW1lOiAnYXJyb3ctd2lkdGgnLFxuICAgIHR5cGU6IHQuYXJyb3dXaWR0aFxuICB9XS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgYXJyb3dQcmVmaXhlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICAgIHZhciBuYW1lID0gcHJlZml4ICsgJy0nICsgcHJvcC5uYW1lO1xuICAgICAgdmFyIHR5cGUgPSBwcm9wLnR5cGUsXG4gICAgICAgIHRyaWdnZXJzQm91bmRzID0gcHJvcC50cmlnZ2Vyc0JvdW5kcztcbiAgICAgIGVkZ2VBcnJvdy5wdXNoKHtcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgdHJpZ2dlcnNCb3VuZHM6IHRyaWdnZXJzQm91bmRzXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSwge30pO1xuICB2YXIgcHJvcHMgPSBzdHlmbiQyLnByb3BlcnRpZXMgPSBbXS5jb25jYXQoYmVoYXZpb3IsIHRyYW5zaXRpb24sIHZpc2liaWxpdHksIG92ZXJsYXksIHVuZGVybGF5LCBnaG9zdCwgY29tbW9uTGFiZWwsIGxhYmVsRGltZW5zaW9ucywgbWFpbkxhYmVsLCBzb3VyY2VMYWJlbCwgdGFyZ2V0TGFiZWwsIG5vZGVCb2R5LCBub2RlQm9yZGVyLCBub2RlT3V0bGluZSwgYmFja2dyb3VuZEltYWdlLCBwaWUsIGNvbXBvdW5kLCBlZGdlTGluZSwgZWRnZUFycm93LCBjb3JlKTtcbiAgdmFyIHByb3BHcm91cHMgPSBzdHlmbiQyLnByb3BlcnR5R3JvdXBzID0ge1xuICAgIC8vIGNvbW1vbiB0byBhbGwgZWxlc1xuICAgIGJlaGF2aW9yOiBiZWhhdmlvcixcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uLFxuICAgIHZpc2liaWxpdHk6IHZpc2liaWxpdHksXG4gICAgb3ZlcmxheTogb3ZlcmxheSxcbiAgICB1bmRlcmxheTogdW5kZXJsYXksXG4gICAgZ2hvc3Q6IGdob3N0LFxuICAgIC8vIGxhYmVsc1xuICAgIGNvbW1vbkxhYmVsOiBjb21tb25MYWJlbCxcbiAgICBsYWJlbERpbWVuc2lvbnM6IGxhYmVsRGltZW5zaW9ucyxcbiAgICBtYWluTGFiZWw6IG1haW5MYWJlbCxcbiAgICBzb3VyY2VMYWJlbDogc291cmNlTGFiZWwsXG4gICAgdGFyZ2V0TGFiZWw6IHRhcmdldExhYmVsLFxuICAgIC8vIG5vZGUgcHJvcHNcbiAgICBub2RlQm9keTogbm9kZUJvZHksXG4gICAgbm9kZUJvcmRlcjogbm9kZUJvcmRlcixcbiAgICBub2RlT3V0bGluZTogbm9kZU91dGxpbmUsXG4gICAgYmFja2dyb3VuZEltYWdlOiBiYWNrZ3JvdW5kSW1hZ2UsXG4gICAgcGllOiBwaWUsXG4gICAgY29tcG91bmQ6IGNvbXBvdW5kLFxuICAgIC8vIGVkZ2UgcHJvcHNcbiAgICBlZGdlTGluZTogZWRnZUxpbmUsXG4gICAgZWRnZUFycm93OiBlZGdlQXJyb3csXG4gICAgY29yZTogY29yZVxuICB9O1xuICB2YXIgcHJvcEdyb3VwTmFtZXMgPSBzdHlmbiQyLnByb3BlcnR5R3JvdXBOYW1lcyA9IHt9O1xuICB2YXIgcHJvcEdyb3VwS2V5cyA9IHN0eWZuJDIucHJvcGVydHlHcm91cEtleXMgPSBPYmplY3Qua2V5cyhwcm9wR3JvdXBzKTtcbiAgcHJvcEdyb3VwS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBwcm9wR3JvdXBOYW1lc1trZXldID0gcHJvcEdyb3Vwc1trZXldLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgcmV0dXJuIHByb3AubmFtZTtcbiAgICB9KTtcbiAgICBwcm9wR3JvdXBzW2tleV0uZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgcmV0dXJuIHByb3AuZ3JvdXBLZXkgPSBrZXk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIGRlZmluZSBhbGlhc2VzXG4gIHZhciBhbGlhc2VzID0gc3R5Zm4kMi5hbGlhc2VzID0gW3tcbiAgICBuYW1lOiAnY29udGVudCcsXG4gICAgcG9pbnRzVG86ICdsYWJlbCdcbiAgfSwge1xuICAgIG5hbWU6ICdjb250cm9sLXBvaW50LWRpc3RhbmNlJyxcbiAgICBwb2ludHNUbzogJ2NvbnRyb2wtcG9pbnQtZGlzdGFuY2VzJ1xuICB9LCB7XG4gICAgbmFtZTogJ2NvbnRyb2wtcG9pbnQtd2VpZ2h0JyxcbiAgICBwb2ludHNUbzogJ2NvbnRyb2wtcG9pbnQtd2VpZ2h0cydcbiAgfSwge1xuICAgIG5hbWU6ICdzZWdtZW50LWRpc3RhbmNlJyxcbiAgICBwb2ludHNUbzogJ3NlZ21lbnQtZGlzdGFuY2VzJ1xuICB9LCB7XG4gICAgbmFtZTogJ3NlZ21lbnQtd2VpZ2h0JyxcbiAgICBwb2ludHNUbzogJ3NlZ21lbnQtd2VpZ2h0cydcbiAgfSwge1xuICAgIG5hbWU6ICdzZWdtZW50LXJhZGl1cycsXG4gICAgcG9pbnRzVG86ICdzZWdtZW50LXJhZGlpJ1xuICB9LCB7XG4gICAgbmFtZTogJ2VkZ2UtdGV4dC1yb3RhdGlvbicsXG4gICAgcG9pbnRzVG86ICd0ZXh0LXJvdGF0aW9uJ1xuICB9LCB7XG4gICAgbmFtZTogJ3BhZGRpbmctbGVmdCcsXG4gICAgcG9pbnRzVG86ICdwYWRkaW5nJ1xuICB9LCB7XG4gICAgbmFtZTogJ3BhZGRpbmctcmlnaHQnLFxuICAgIHBvaW50c1RvOiAncGFkZGluZydcbiAgfSwge1xuICAgIG5hbWU6ICdwYWRkaW5nLXRvcCcsXG4gICAgcG9pbnRzVG86ICdwYWRkaW5nJ1xuICB9LCB7XG4gICAgbmFtZTogJ3BhZGRpbmctYm90dG9tJyxcbiAgICBwb2ludHNUbzogJ3BhZGRpbmcnXG4gIH1dO1xuXG4gIC8vIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXNcbiAgc3R5Zm4kMi5wcm9wZXJ0eU5hbWVzID0gcHJvcHMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIHAubmFtZTtcbiAgfSk7XG5cbiAgLy8gYWxsb3cgYWNjZXNzIG9mIHByb3BlcnRpZXMgYnkgbmFtZSAoIGUuZy4gc3R5bGUucHJvcGVydGllcy5oZWlnaHQgKVxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgcHJvcHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIHByb3AgPSBwcm9wc1tfaV07XG4gICAgcHJvcHNbcHJvcC5uYW1lXSA9IHByb3A7IC8vIGFsbG93IGxvb2t1cCBieSBuYW1lXG4gIH1cblxuICAvLyBtYXAgYWxpYXNlc1xuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBhbGlhc2VzLmxlbmd0aDsgX2kyKyspIHtcbiAgICB2YXIgYWxpYXMgPSBhbGlhc2VzW19pMl07XG4gICAgdmFyIHBvaW50c1RvUHJvcCA9IHByb3BzW2FsaWFzLnBvaW50c1RvXTtcbiAgICB2YXIgYWxpYXNQcm9wID0ge1xuICAgICAgbmFtZTogYWxpYXMubmFtZSxcbiAgICAgIGFsaWFzOiB0cnVlLFxuICAgICAgcG9pbnRzVG86IHBvaW50c1RvUHJvcFxuICAgIH07XG5cbiAgICAvLyBhZGQgYWxpYXMgcHJvcCBmb3IgcGFyc2luZ1xuICAgIHByb3BzLnB1c2goYWxpYXNQcm9wKTtcbiAgICBwcm9wc1thbGlhcy5uYW1lXSA9IGFsaWFzUHJvcDsgLy8gYWxsb3cgbG9va3VwIGJ5IG5hbWVcbiAgfVxufSkoKTtcblxuc3R5Zm4kMi5nZXREZWZhdWx0UHJvcGVydHkgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gdGhpcy5nZXREZWZhdWx0UHJvcGVydGllcygpW25hbWVdO1xufTtcbnN0eWZuJDIuZ2V0RGVmYXVsdFByb3BlcnRpZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gIGlmIChfcC5kZWZhdWx0UHJvcGVydGllcyAhPSBudWxsKSB7XG4gICAgcmV0dXJuIF9wLmRlZmF1bHRQcm9wZXJ0aWVzO1xuICB9XG4gIHZhciByYXdQcm9wcyA9IGV4dGVuZCh7XG4gICAgLy8gY29yZSBwcm9wc1xuICAgICdzZWxlY3Rpb24tYm94LWNvbG9yJzogJyNkZGQnLFxuICAgICdzZWxlY3Rpb24tYm94LW9wYWNpdHknOiAwLjY1LFxuICAgICdzZWxlY3Rpb24tYm94LWJvcmRlci1jb2xvcic6ICcjYWFhJyxcbiAgICAnc2VsZWN0aW9uLWJveC1ib3JkZXItd2lkdGgnOiAxLFxuICAgICdhY3RpdmUtYmctY29sb3InOiAnYmxhY2snLFxuICAgICdhY3RpdmUtYmctb3BhY2l0eSc6IDAuMTUsXG4gICAgJ2FjdGl2ZS1iZy1zaXplJzogMzAsXG4gICAgJ291dHNpZGUtdGV4dHVyZS1iZy1jb2xvcic6ICcjMDAwJyxcbiAgICAnb3V0c2lkZS10ZXh0dXJlLWJnLW9wYWNpdHknOiAwLjEyNSxcbiAgICAvLyBjb21tb24gbm9kZS9lZGdlIHByb3BzXG4gICAgJ2V2ZW50cyc6ICd5ZXMnLFxuICAgICd0ZXh0LWV2ZW50cyc6ICdubycsXG4gICAgJ3RleHQtdmFsaWduJzogJ3RvcCcsXG4gICAgJ3RleHQtaGFsaWduJzogJ2NlbnRlcicsXG4gICAgJ3RleHQtanVzdGlmaWNhdGlvbic6ICdhdXRvJyxcbiAgICAnbGluZS1oZWlnaHQnOiAxLFxuICAgICdjb2xvcic6ICcjMDAwJyxcbiAgICAndGV4dC1vdXRsaW5lLWNvbG9yJzogJyMwMDAnLFxuICAgICd0ZXh0LW91dGxpbmUtd2lkdGgnOiAwLFxuICAgICd0ZXh0LW91dGxpbmUtb3BhY2l0eSc6IDEsXG4gICAgJ3RleHQtb3BhY2l0eSc6IDEsXG4gICAgJ3RleHQtZGVjb3JhdGlvbic6ICdub25lJyxcbiAgICAndGV4dC10cmFuc2Zvcm0nOiAnbm9uZScsXG4gICAgJ3RleHQtd3JhcCc6ICdub25lJyxcbiAgICAndGV4dC1vdmVyZmxvdy13cmFwJzogJ3doaXRlc3BhY2UnLFxuICAgICd0ZXh0LW1heC13aWR0aCc6IDk5OTksXG4gICAgJ3RleHQtYmFja2dyb3VuZC1jb2xvcic6ICcjMDAwJyxcbiAgICAndGV4dC1iYWNrZ3JvdW5kLW9wYWNpdHknOiAwLFxuICAgICd0ZXh0LWJhY2tncm91bmQtc2hhcGUnOiAncmVjdGFuZ2xlJyxcbiAgICAndGV4dC1iYWNrZ3JvdW5kLXBhZGRpbmcnOiAwLFxuICAgICd0ZXh0LWJvcmRlci1vcGFjaXR5JzogMCxcbiAgICAndGV4dC1ib3JkZXItd2lkdGgnOiAwLFxuICAgICd0ZXh0LWJvcmRlci1zdHlsZSc6ICdzb2xpZCcsXG4gICAgJ3RleHQtYm9yZGVyLWNvbG9yJzogJyMwMDAnLFxuICAgICdmb250LWZhbWlseSc6ICdIZWx2ZXRpY2EgTmV1ZSwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmJyxcbiAgICAnZm9udC1zdHlsZSc6ICdub3JtYWwnLFxuICAgICdmb250LXdlaWdodCc6ICdub3JtYWwnLFxuICAgICdmb250LXNpemUnOiAxNixcbiAgICAnbWluLXpvb21lZC1mb250LXNpemUnOiAwLFxuICAgICd0ZXh0LXJvdGF0aW9uJzogJ25vbmUnLFxuICAgICdzb3VyY2UtdGV4dC1yb3RhdGlvbic6ICdub25lJyxcbiAgICAndGFyZ2V0LXRleHQtcm90YXRpb24nOiAnbm9uZScsXG4gICAgJ3Zpc2liaWxpdHknOiAndmlzaWJsZScsXG4gICAgJ2Rpc3BsYXknOiAnZWxlbWVudCcsXG4gICAgJ29wYWNpdHknOiAxLFxuICAgICd6LWNvbXBvdW5kLWRlcHRoJzogJ2F1dG8nLFxuICAgICd6LWluZGV4LWNvbXBhcmUnOiAnYXV0bycsXG4gICAgJ3otaW5kZXgnOiAwLFxuICAgICdsYWJlbCc6ICcnLFxuICAgICd0ZXh0LW1hcmdpbi14JzogMCxcbiAgICAndGV4dC1tYXJnaW4teSc6IDAsXG4gICAgJ3NvdXJjZS1sYWJlbCc6ICcnLFxuICAgICdzb3VyY2UtdGV4dC1vZmZzZXQnOiAwLFxuICAgICdzb3VyY2UtdGV4dC1tYXJnaW4teCc6IDAsXG4gICAgJ3NvdXJjZS10ZXh0LW1hcmdpbi15JzogMCxcbiAgICAndGFyZ2V0LWxhYmVsJzogJycsXG4gICAgJ3RhcmdldC10ZXh0LW9mZnNldCc6IDAsXG4gICAgJ3RhcmdldC10ZXh0LW1hcmdpbi14JzogMCxcbiAgICAndGFyZ2V0LXRleHQtbWFyZ2luLXknOiAwLFxuICAgICdvdmVybGF5LW9wYWNpdHknOiAwLFxuICAgICdvdmVybGF5LWNvbG9yJzogJyMwMDAnLFxuICAgICdvdmVybGF5LXBhZGRpbmcnOiAxMCxcbiAgICAnb3ZlcmxheS1zaGFwZSc6ICdyb3VuZC1yZWN0YW5nbGUnLFxuICAgICdvdmVybGF5LWNvcm5lci1yYWRpdXMnOiAnYXV0bycsXG4gICAgJ3VuZGVybGF5LW9wYWNpdHknOiAwLFxuICAgICd1bmRlcmxheS1jb2xvcic6ICcjMDAwJyxcbiAgICAndW5kZXJsYXktcGFkZGluZyc6IDEwLFxuICAgICd1bmRlcmxheS1zaGFwZSc6ICdyb3VuZC1yZWN0YW5nbGUnLFxuICAgICd1bmRlcmxheS1jb3JuZXItcmFkaXVzJzogJ2F1dG8nLFxuICAgICd0cmFuc2l0aW9uLXByb3BlcnR5JzogJ25vbmUnLFxuICAgICd0cmFuc2l0aW9uLWR1cmF0aW9uJzogMCxcbiAgICAndHJhbnNpdGlvbi1kZWxheSc6IDAsXG4gICAgJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJzogJ2xpbmVhcicsXG4gICAgLy8gbm9kZSBwcm9wc1xuICAgICdiYWNrZ3JvdW5kLWJsYWNrZW4nOiAwLFxuICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyM5OTknLFxuICAgICdiYWNrZ3JvdW5kLWZpbGwnOiAnc29saWQnLFxuICAgICdiYWNrZ3JvdW5kLW9wYWNpdHknOiAxLFxuICAgICdiYWNrZ3JvdW5kLWltYWdlJzogJ25vbmUnLFxuICAgICdiYWNrZ3JvdW5kLWltYWdlLWNyb3Nzb3JpZ2luJzogJ2Fub255bW91cycsXG4gICAgJ2JhY2tncm91bmQtaW1hZ2Utb3BhY2l0eSc6IDEsXG4gICAgJ2JhY2tncm91bmQtaW1hZ2UtY29udGFpbm1lbnQnOiAnaW5zaWRlJyxcbiAgICAnYmFja2dyb3VuZC1pbWFnZS1zbW9vdGhpbmcnOiAneWVzJyxcbiAgICAnYmFja2dyb3VuZC1wb3NpdGlvbi14JzogJzUwJScsXG4gICAgJ2JhY2tncm91bmQtcG9zaXRpb24teSc6ICc1MCUnLFxuICAgICdiYWNrZ3JvdW5kLW9mZnNldC14JzogMCxcbiAgICAnYmFja2dyb3VuZC1vZmZzZXQteSc6IDAsXG4gICAgJ2JhY2tncm91bmQtd2lkdGgtcmVsYXRpdmUtdG8nOiAnaW5jbHVkZS1wYWRkaW5nJyxcbiAgICAnYmFja2dyb3VuZC1oZWlnaHQtcmVsYXRpdmUtdG8nOiAnaW5jbHVkZS1wYWRkaW5nJyxcbiAgICAnYmFja2dyb3VuZC1yZXBlYXQnOiAnbm8tcmVwZWF0JyxcbiAgICAnYmFja2dyb3VuZC1maXQnOiAnbm9uZScsXG4gICAgJ2JhY2tncm91bmQtY2xpcCc6ICdub2RlJyxcbiAgICAnYmFja2dyb3VuZC13aWR0aCc6ICdhdXRvJyxcbiAgICAnYmFja2dyb3VuZC1oZWlnaHQnOiAnYXV0bycsXG4gICAgJ2JvcmRlci1jb2xvcic6ICcjMDAwJyxcbiAgICAnYm9yZGVyLW9wYWNpdHknOiAxLFxuICAgICdib3JkZXItd2lkdGgnOiAwLFxuICAgICdib3JkZXItc3R5bGUnOiAnc29saWQnLFxuICAgICdib3JkZXItZGFzaC1wYXR0ZXJuJzogWzQsIDJdLFxuICAgICdib3JkZXItZGFzaC1vZmZzZXQnOiAwLFxuICAgICdib3JkZXItY2FwJzogJ2J1dHQnLFxuICAgICdib3JkZXItam9pbic6ICdtaXRlcicsXG4gICAgJ2JvcmRlci1wb3NpdGlvbic6ICdjZW50ZXInLFxuICAgICdvdXRsaW5lLWNvbG9yJzogJyM5OTknLFxuICAgICdvdXRsaW5lLW9wYWNpdHknOiAxLFxuICAgICdvdXRsaW5lLXdpZHRoJzogMCxcbiAgICAnb3V0bGluZS1vZmZzZXQnOiAwLFxuICAgICdvdXRsaW5lLXN0eWxlJzogJ3NvbGlkJyxcbiAgICAnaGVpZ2h0JzogMzAsXG4gICAgJ3dpZHRoJzogMzAsXG4gICAgJ3NoYXBlJzogJ2VsbGlwc2UnLFxuICAgICdzaGFwZS1wb2x5Z29uLXBvaW50cyc6ICctMSwgLTEsICAgMSwgLTEsICAgMSwgMSwgICAtMSwgMScsXG4gICAgJ2Nvcm5lci1yYWRpdXMnOiAnYXV0bycsXG4gICAgJ2JvdW5kcy1leHBhbnNpb24nOiAwLFxuICAgIC8vIG5vZGUgZ3JhZGllbnRcbiAgICAnYmFja2dyb3VuZC1ncmFkaWVudC1kaXJlY3Rpb24nOiAndG8tYm90dG9tJyxcbiAgICAnYmFja2dyb3VuZC1ncmFkaWVudC1zdG9wLWNvbG9ycyc6ICcjOTk5JyxcbiAgICAnYmFja2dyb3VuZC1ncmFkaWVudC1zdG9wLXBvc2l0aW9ucyc6ICcwJScsXG4gICAgLy8gZ2hvc3QgcHJvcHNcbiAgICAnZ2hvc3QnOiAnbm8nLFxuICAgICdnaG9zdC1vZmZzZXQteSc6IDAsXG4gICAgJ2dob3N0LW9mZnNldC14JzogMCxcbiAgICAnZ2hvc3Qtb3BhY2l0eSc6IDAsXG4gICAgLy8gY29tcG91bmQgcHJvcHNcbiAgICAncGFkZGluZyc6IDAsXG4gICAgJ3BhZGRpbmctcmVsYXRpdmUtdG8nOiAnd2lkdGgnLFxuICAgICdwb3NpdGlvbic6ICdvcmlnaW4nLFxuICAgICdjb21wb3VuZC1zaXppbmctd3J0LWxhYmVscyc6ICdpbmNsdWRlJyxcbiAgICAnbWluLXdpZHRoJzogMCxcbiAgICAnbWluLXdpZHRoLWJpYXMtbGVmdCc6IDAsXG4gICAgJ21pbi13aWR0aC1iaWFzLXJpZ2h0JzogMCxcbiAgICAnbWluLWhlaWdodCc6IDAsXG4gICAgJ21pbi1oZWlnaHQtYmlhcy10b3AnOiAwLFxuICAgICdtaW4taGVpZ2h0LWJpYXMtYm90dG9tJzogMFxuICB9LCB7XG4gICAgLy8gbm9kZSBwaWUgYmdcbiAgICAncGllLXNpemUnOiAnMTAwJSdcbiAgfSwgW3tcbiAgICBuYW1lOiAncGllLXt7aX19LWJhY2tncm91bmQtY29sb3InLFxuICAgIHZhbHVlOiAnYmxhY2snXG4gIH0sIHtcbiAgICBuYW1lOiAncGllLXt7aX19LWJhY2tncm91bmQtc2l6ZScsXG4gICAgdmFsdWU6ICcwJSdcbiAgfSwge1xuICAgIG5hbWU6ICdwaWUte3tpfX0tYmFja2dyb3VuZC1vcGFjaXR5JyxcbiAgICB2YWx1ZTogMVxuICB9XS5yZWR1Y2UoZnVuY3Rpb24gKGNzcywgcHJvcCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IHN0eWZuJDIucGllQmFja2dyb3VuZE47IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBwcm9wLm5hbWUucmVwbGFjZSgne3tpfX0nLCBpKTtcbiAgICAgIHZhciB2YWwgPSBwcm9wLnZhbHVlO1xuICAgICAgY3NzW25hbWVdID0gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gY3NzO1xuICB9LCB7fSksIHtcbiAgICAvLyBlZGdlIHByb3BzXG4gICAgJ2xpbmUtc3R5bGUnOiAnc29saWQnLFxuICAgICdsaW5lLWNvbG9yJzogJyM5OTknLFxuICAgICdsaW5lLWZpbGwnOiAnc29saWQnLFxuICAgICdsaW5lLWNhcCc6ICdidXR0JyxcbiAgICAnbGluZS1vcGFjaXR5JzogMSxcbiAgICAnbGluZS1ncmFkaWVudC1zdG9wLWNvbG9ycyc6ICcjOTk5JyxcbiAgICAnbGluZS1ncmFkaWVudC1zdG9wLXBvc2l0aW9ucyc6ICcwJScsXG4gICAgJ2NvbnRyb2wtcG9pbnQtc3RlcC1zaXplJzogNDAsXG4gICAgJ2NvbnRyb2wtcG9pbnQtd2VpZ2h0cyc6IDAuNSxcbiAgICAnc2VnbWVudC13ZWlnaHRzJzogMC41LFxuICAgICdzZWdtZW50LWRpc3RhbmNlcyc6IDIwLFxuICAgICdzZWdtZW50LXJhZGlpJzogMTUsXG4gICAgJ3JhZGl1cy10eXBlJzogJ2FyYy1yYWRpdXMnLFxuICAgICd0YXhpLXR1cm4nOiAnNTAlJyxcbiAgICAndGF4aS1yYWRpdXMnOiAxNSxcbiAgICAndGF4aS10dXJuLW1pbi1kaXN0YW5jZSc6IDEwLFxuICAgICd0YXhpLWRpcmVjdGlvbic6ICdhdXRvJyxcbiAgICAnZWRnZS1kaXN0YW5jZXMnOiAnaW50ZXJzZWN0aW9uJyxcbiAgICAnY3VydmUtc3R5bGUnOiAnaGF5c3RhY2snLFxuICAgICdoYXlzdGFjay1yYWRpdXMnOiAwLFxuICAgICdhcnJvdy1zY2FsZSc6IDEsXG4gICAgJ2xvb3AtZGlyZWN0aW9uJzogJy00NWRlZycsXG4gICAgJ2xvb3Atc3dlZXAnOiAnLTkwZGVnJyxcbiAgICAnc291cmNlLWRpc3RhbmNlLWZyb20tbm9kZSc6IDAsXG4gICAgJ3RhcmdldC1kaXN0YW5jZS1mcm9tLW5vZGUnOiAwLFxuICAgICdzb3VyY2UtZW5kcG9pbnQnOiAnb3V0c2lkZS10by1ub2RlJyxcbiAgICAndGFyZ2V0LWVuZHBvaW50JzogJ291dHNpZGUtdG8tbm9kZScsXG4gICAgJ2xpbmUtZGFzaC1wYXR0ZXJuJzogWzYsIDNdLFxuICAgICdsaW5lLWRhc2gtb2Zmc2V0JzogMFxuICB9LCBbe1xuICAgIG5hbWU6ICdhcnJvdy1zaGFwZScsXG4gICAgdmFsdWU6ICdub25lJ1xuICB9LCB7XG4gICAgbmFtZTogJ2Fycm93LWNvbG9yJyxcbiAgICB2YWx1ZTogJyM5OTknXG4gIH0sIHtcbiAgICBuYW1lOiAnYXJyb3ctZmlsbCcsXG4gICAgdmFsdWU6ICdmaWxsZWQnXG4gIH0sIHtcbiAgICBuYW1lOiAnYXJyb3ctd2lkdGgnLFxuICAgIHZhbHVlOiAxXG4gIH1dLnJlZHVjZShmdW5jdGlvbiAoY3NzLCBwcm9wKSB7XG4gICAgc3R5Zm4kMi5hcnJvd1ByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkge1xuICAgICAgdmFyIG5hbWUgPSBwcmVmaXggKyAnLScgKyBwcm9wLm5hbWU7XG4gICAgICB2YXIgdmFsID0gcHJvcC52YWx1ZTtcbiAgICAgIGNzc1tuYW1lXSA9IHZhbDtcbiAgICB9KTtcbiAgICByZXR1cm4gY3NzO1xuICB9LCB7fSkpO1xuICB2YXIgcGFyc2VkUHJvcHMgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHJvcCA9IHRoaXMucHJvcGVydGllc1tpXTtcbiAgICBpZiAocHJvcC5wb2ludHNUbykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBuYW1lID0gcHJvcC5uYW1lO1xuICAgIHZhciB2YWwgPSByYXdQcm9wc1tuYW1lXTtcbiAgICB2YXIgcGFyc2VkUHJvcCA9IHRoaXMucGFyc2UobmFtZSwgdmFsKTtcbiAgICBwYXJzZWRQcm9wc1tuYW1lXSA9IHBhcnNlZFByb3A7XG4gIH1cbiAgX3AuZGVmYXVsdFByb3BlcnRpZXMgPSBwYXJzZWRQcm9wcztcbiAgcmV0dXJuIF9wLmRlZmF1bHRQcm9wZXJ0aWVzO1xufTtcbnN0eWZuJDIuYWRkRGVmYXVsdFN0eWxlc2hlZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc2VsZWN0b3IoJzpwYXJlbnQnKS5jc3Moe1xuICAgICdzaGFwZSc6ICdyZWN0YW5nbGUnLFxuICAgICdwYWRkaW5nJzogMTAsXG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnI2VlZScsXG4gICAgJ2JvcmRlci1jb2xvcic6ICcjY2NjJyxcbiAgICAnYm9yZGVyLXdpZHRoJzogMVxuICB9KS5zZWxlY3RvcignZWRnZScpLmNzcyh7XG4gICAgJ3dpZHRoJzogM1xuICB9KS5zZWxlY3RvcignOmxvb3AnKS5jc3Moe1xuICAgICdjdXJ2ZS1zdHlsZSc6ICdiZXppZXInXG4gIH0pLnNlbGVjdG9yKCdlZGdlOmNvbXBvdW5kJykuY3NzKHtcbiAgICAnY3VydmUtc3R5bGUnOiAnYmV6aWVyJyxcbiAgICAnc291cmNlLWVuZHBvaW50JzogJ291dHNpZGUtdG8tbGluZScsXG4gICAgJ3RhcmdldC1lbmRwb2ludCc6ICdvdXRzaWRlLXRvLWxpbmUnXG4gIH0pLnNlbGVjdG9yKCc6c2VsZWN0ZWQnKS5jc3Moe1xuICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJyMwMTY5RDknLFxuICAgICdsaW5lLWNvbG9yJzogJyMwMTY5RDknLFxuICAgICdzb3VyY2UtYXJyb3ctY29sb3InOiAnIzAxNjlEOScsXG4gICAgJ3RhcmdldC1hcnJvdy1jb2xvcic6ICcjMDE2OUQ5JyxcbiAgICAnbWlkLXNvdXJjZS1hcnJvdy1jb2xvcic6ICcjMDE2OUQ5JyxcbiAgICAnbWlkLXRhcmdldC1hcnJvdy1jb2xvcic6ICcjMDE2OUQ5J1xuICB9KS5zZWxlY3RvcignOnBhcmVudDpzZWxlY3RlZCcpLmNzcyh7XG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnI0NDRTFGOScsXG4gICAgJ2JvcmRlci1jb2xvcic6ICcjYWVjOGU1J1xuICB9KS5zZWxlY3RvcignOmFjdGl2ZScpLmNzcyh7XG4gICAgJ292ZXJsYXktY29sb3InOiAnYmxhY2snLFxuICAgICdvdmVybGF5LXBhZGRpbmcnOiAxMCxcbiAgICAnb3ZlcmxheS1vcGFjaXR5JzogMC4yNVxuICB9KTtcbiAgdGhpcy5kZWZhdWx0TGVuZ3RoID0gdGhpcy5sZW5ndGg7XG59O1xuXG52YXIgc3R5Zm4kMSA9IHt9O1xuXG4vLyBhIGNhY2hpbmcgbGF5ZXIgZm9yIHByb3BlcnR5IHBhcnNpbmdcbnN0eWZuJDEucGFyc2UgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgLy8gZnVuY3Rpb24gdmFsdWVzIGNhbid0IGJlIGNhY2hlZCBpbiBhbGwgY2FzZXMsIGFuZCB0aGVyZSBpc24ndCBtdWNoIGJlbmVmaXQgb2YgY2FjaGluZyB0aGVtIGFueXdheVxuICBpZiAoZm4kNih2YWx1ZSkpIHtcbiAgICByZXR1cm4gc2VsZi5wYXJzZUltcGxXYXJuKG5hbWUsIHZhbHVlLCBwcm9wSXNCeXBhc3MsIHByb3BJc0ZsYXQpO1xuICB9XG4gIHZhciBmbGF0S2V5ID0gcHJvcElzRmxhdCA9PT0gJ21hcHBpbmcnIHx8IHByb3BJc0ZsYXQgPT09IHRydWUgfHwgcHJvcElzRmxhdCA9PT0gZmFsc2UgfHwgcHJvcElzRmxhdCA9PSBudWxsID8gJ2RvbnRjYXJlJyA6IHByb3BJc0ZsYXQ7XG4gIHZhciBieXBhc3NLZXkgPSBwcm9wSXNCeXBhc3MgPyAndCcgOiAnZic7XG4gIHZhciB2YWx1ZUtleSA9ICcnICsgdmFsdWU7XG4gIHZhciBhcmdIYXNoID0gaGFzaFN0cmluZ3MobmFtZSwgdmFsdWVLZXksIGJ5cGFzc0tleSwgZmxhdEtleSk7XG4gIHZhciBwcm9wQ2FjaGUgPSBzZWxmLnByb3BDYWNoZSA9IHNlbGYucHJvcENhY2hlIHx8IFtdO1xuICB2YXIgcmV0O1xuICBpZiAoIShyZXQgPSBwcm9wQ2FjaGVbYXJnSGFzaF0pKSB7XG4gICAgcmV0ID0gcHJvcENhY2hlW2FyZ0hhc2hdID0gc2VsZi5wYXJzZUltcGxXYXJuKG5hbWUsIHZhbHVlLCBwcm9wSXNCeXBhc3MsIHByb3BJc0ZsYXQpO1xuICB9XG5cbiAgLy8gLSBieXBhc3NlcyBjYW4ndCBiZSBzaGFyZWQgYi9jIHRoZSB2YWx1ZSBjYW4gYmUgY2hhbmdlZCBieSBhbmltYXRpb25zIG9yIG90aGVyd2lzZSBvdmVycmlkZGVuXG4gIC8vIC0gbWFwcGluZ3MgY2FuJ3QgYmUgc2hhcmVkIGIvYyBtYXBwaW5ncyBhcmUgcGVyLWVsZW1lbnRcbiAgaWYgKHByb3BJc0J5cGFzcyB8fCBwcm9wSXNGbGF0ID09PSAnbWFwcGluZycpIHtcbiAgICAvLyBuZWVkIGEgY29weSBzaW5jZSBwcm9wcyBhcmUgbXV0YXRlZCBsYXRlciBpbiB0aGVpciBsaWZlY3ljbGVzXG4gICAgcmV0ID0gY29weShyZXQpO1xuICAgIGlmIChyZXQpIHtcbiAgICAgIHJldC52YWx1ZSA9IGNvcHkocmV0LnZhbHVlKTsgLy8gYmVjYXVzZSBpdCBjb3VsZCBiZSBhbiBhcnJheSwgZS5nLiBjb2xvdXJcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcbnN0eWZuJDEucGFyc2VJbXBsV2FybiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgcHJvcElzQnlwYXNzLCBwcm9wSXNGbGF0KSB7XG4gIHZhciBwcm9wID0gdGhpcy5wYXJzZUltcGwobmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCk7XG4gIGlmICghcHJvcCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgd2FybihcIlRoZSBzdHlsZSBwcm9wZXJ0eSBgXCIuY29uY2F0KG5hbWUsIFwiOiBcIikuY29uY2F0KHZhbHVlLCBcImAgaXMgaW52YWxpZFwiKSk7XG4gIH1cbiAgaWYgKHByb3AgJiYgKHByb3AubmFtZSA9PT0gJ3dpZHRoJyB8fCBwcm9wLm5hbWUgPT09ICdoZWlnaHQnKSAmJiB2YWx1ZSA9PT0gJ2xhYmVsJykge1xuICAgIHdhcm4oJ1RoZSBzdHlsZSB2YWx1ZSBvZiBgbGFiZWxgIGlzIGRlcHJlY2F0ZWQgZm9yIGAnICsgcHJvcC5uYW1lICsgJ2AnKTtcbiAgfVxuICByZXR1cm4gcHJvcDtcbn07XG5cbi8vIHBhcnNlIGEgcHJvcGVydHk7IHJldHVybiBudWxsIG9uIGludmFsaWQ7IHJldHVybiBwYXJzZWQgcHJvcGVydHkgb3RoZXJ3aXNlXG4vLyBmaWVsZHMgOlxuLy8gLSBuYW1lIDogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5XG4vLyAtIHZhbHVlIDogdGhlIHBhcnNlZCwgbmF0aXZlLXR5cGVkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eVxuLy8gLSBzdHJWYWx1ZSA6IGEgc3RyaW5nIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvcGVydHkgdmFsdWUgaW4gdmFsaWQgY3NzXG4vLyAtIGJ5cGFzcyA6IHRydWUgaWZmIHRoZSBwcm9wZXJ0eSBpcyBhIGJ5cGFzcyBwcm9wZXJ0eVxuc3R5Zm4kMS5wYXJzZUltcGwgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIHByb3BJc0J5cGFzcywgcHJvcElzRmxhdCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIG5hbWUgPSBjYW1lbDJkYXNoKG5hbWUpOyAvLyBtYWtlIHN1cmUgdGhlIHByb3BlcnR5IG5hbWUgaXMgaW4gZGFzaCBmb3JtIChlLmcuICdwcm9wZXJ0eS1uYW1lJyBub3QgJ3Byb3BlcnR5TmFtZScpXG5cbiAgdmFyIHByb3BlcnR5ID0gc2VsZi5wcm9wZXJ0aWVzW25hbWVdO1xuICB2YXIgcGFzc2VkVmFsdWUgPSB2YWx1ZTtcbiAgdmFyIHR5cGVzID0gc2VsZi50eXBlcztcbiAgaWYgKCFwcm9wZXJ0eSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIHJldHVybiBudWxsIG9uIHByb3BlcnR5IG9mIHVua25vd24gbmFtZVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIGNhbid0IGFzc2lnbiB1bmRlZmluZWRcblxuICAvLyB0aGUgcHJvcGVydHkgbWF5IGJlIGFuIGFsaWFzXG4gIGlmIChwcm9wZXJ0eS5hbGlhcykge1xuICAgIHByb3BlcnR5ID0gcHJvcGVydHkucG9pbnRzVG87XG4gICAgbmFtZSA9IHByb3BlcnR5Lm5hbWU7XG4gIH1cbiAgdmFyIHZhbHVlSXNTdHJpbmcgPSBzdHJpbmcodmFsdWUpO1xuICBpZiAodmFsdWVJc1N0cmluZykge1xuICAgIC8vIHRyaW0gdGhlIHZhbHVlIHRvIG1ha2UgcGFyc2luZyBlYXNpZXJcbiAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcbiAgfVxuICB2YXIgdHlwZSA9IHByb3BlcnR5LnR5cGU7XG4gIGlmICghdHlwZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIG5vIHR5cGUsIG5vIGx1Y2tcblxuICAvLyBjaGVjayBpZiBieXBhc3MgaXMgbnVsbCBvciBlbXB0eSBzdHJpbmcgKGkuZS4gaW5kaWNhdGlvbiB0byBkZWxldGUgYnlwYXNzIHByb3BlcnR5KVxuICBpZiAocHJvcElzQnlwYXNzICYmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBieXBhc3M6IHRydWUsXG4gICAgICBkZWxldGVCeXBhc3M6IHRydWVcbiAgICB9O1xuICB9XG5cbiAgLy8gY2hlY2sgaWYgdmFsdWUgaXMgYSBmdW5jdGlvbiB1c2VkIGFzIGEgbWFwcGVyXG4gIGlmIChmbiQ2KHZhbHVlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgc3RyVmFsdWU6ICdmbicsXG4gICAgICBtYXBwZWQ6IHR5cGVzLmZuLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuICB9XG5cbiAgLy8gY2hlY2sgaWYgdmFsdWUgaXMgbWFwcGVkXG4gIHZhciBkYXRhLCBtYXBEYXRhO1xuICBpZiAoIXZhbHVlSXNTdHJpbmcgfHwgcHJvcElzRmxhdCB8fCB2YWx1ZS5sZW5ndGggPCA3IHx8IHZhbHVlWzFdICE9PSAnYScpIDsgZWxzZSBpZiAodmFsdWUubGVuZ3RoID49IDcgJiYgdmFsdWVbMF0gPT09ICdkJyAmJiAoZGF0YSA9IG5ldyBSZWdFeHAodHlwZXMuZGF0YS5yZWdleCkuZXhlYyh2YWx1ZSkpKSB7XG4gICAgaWYgKHByb3BJc0J5cGFzcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gbWFwcGVycyBub3QgYWxsb3dlZCBpbiBieXBhc3NcblxuICAgIHZhciBtYXBwZWQgPSB0eXBlcy5kYXRhO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgIG1hcHBlZDogbWFwcGVkLFxuICAgICAgZmllbGQ6IGRhdGFbMV0sXG4gICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgIH07XG4gIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID49IDEwICYmIHZhbHVlWzBdID09PSAnbScgJiYgKG1hcERhdGEgPSBuZXcgUmVnRXhwKHR5cGVzLm1hcERhdGEucmVnZXgpLmV4ZWModmFsdWUpKSkge1xuICAgIGlmIChwcm9wSXNCeXBhc3MpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIG1hcHBlcnMgbm90IGFsbG93ZWQgaW4gYnlwYXNzXG4gICAgaWYgKHR5cGUubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIGltcG9zc2libGUgdG8gbWFwIHRvIG51bVxuXG4gICAgdmFyIF9tYXBwZWQgPSB0eXBlcy5tYXBEYXRhO1xuXG4gICAgLy8gd2UgY2FuIG1hcCBvbmx5IGlmIHRoZSB0eXBlIGlzIGEgY29sb3VyIG9yIGEgbnVtYmVyXG4gICAgaWYgKCEodHlwZS5jb2xvciB8fCB0eXBlLm51bWJlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHZhbHVlTWluID0gdGhpcy5wYXJzZShuYW1lLCBtYXBEYXRhWzRdKTsgLy8gcGFyc2UgdG8gdmFsaWRhdGVcbiAgICBpZiAoIXZhbHVlTWluIHx8IHZhbHVlTWluLm1hcHBlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gY2FuJ3QgYmUgaW52YWxpZCBvciBtYXBwZWRcblxuICAgIHZhciB2YWx1ZU1heCA9IHRoaXMucGFyc2UobmFtZSwgbWFwRGF0YVs1XSk7IC8vIHBhcnNlIHRvIHZhbGlkYXRlXG4gICAgaWYgKCF2YWx1ZU1heCB8fCB2YWx1ZU1heC5tYXBwZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIGNhbid0IGJlIGludmFsaWQgb3IgbWFwcGVkXG5cbiAgICAvLyBjaGVjayBpZiB2YWx1ZU1pbiBhbmQgdmFsdWVNYXggYXJlIHRoZSBzYW1lXG4gICAgaWYgKHZhbHVlTWluLnBmVmFsdWUgPT09IHZhbHVlTWF4LnBmVmFsdWUgfHwgdmFsdWVNaW4uc3RyVmFsdWUgPT09IHZhbHVlTWF4LnN0clZhbHVlKSB7XG4gICAgICB3YXJuKCdgJyArIG5hbWUgKyAnOiAnICsgdmFsdWUgKyAnYCBpcyBub3QgYSB2YWxpZCBtYXBwZXIgYmVjYXVzZSB0aGUgb3V0cHV0IHJhbmdlIGlzIHplcm87IGNvbnZlcnRpbmcgdG8gYCcgKyBuYW1lICsgJzogJyArIHZhbHVlTWluLnN0clZhbHVlICsgJ2AnKTtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlKG5hbWUsIHZhbHVlTWluLnN0clZhbHVlKTsgLy8gY2FuJ3QgbWFrZSBtdWNoIG9mIGEgbWFwcGVyIHdpdGhvdXQgYSByYW5nZVxuICAgIH0gZWxzZSBpZiAodHlwZS5jb2xvcikge1xuICAgICAgdmFyIGMxID0gdmFsdWVNaW4udmFsdWU7XG4gICAgICB2YXIgYzIgPSB2YWx1ZU1heC52YWx1ZTtcbiAgICAgIHZhciBzYW1lID0gYzFbMF0gPT09IGMyWzBdIC8vIHJlZFxuICAgICAgJiYgYzFbMV0gPT09IGMyWzFdIC8vIGdyZWVuXG4gICAgICAmJiBjMVsyXSA9PT0gYzJbMl0gLy8gYmx1ZVxuICAgICAgJiYgKFxuICAgICAgLy8gb3B0aW9uYWwgYWxwaGFcbiAgICAgIGMxWzNdID09PSBjMlszXSAvLyBzYW1lIGFscGhhIG91dHJpZ2h0XG4gICAgICB8fCAoYzFbM10gPT0gbnVsbCB8fCBjMVszXSA9PT0gMSAvLyBmdWxsIG9wYWNpdHkgZm9yIGNvbG91ciAxP1xuICAgICAgKSAmJiAoYzJbM10gPT0gbnVsbCB8fCBjMlszXSA9PT0gMSkgLy8gZnVsbCBvcGFjaXR5IGZvciBjb2xvdXIgMj9cbiAgICAgICk7XG5cbiAgICAgIGlmIChzYW1lKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gLy8gY2FuJ3QgbWFrZSBhIG1hcHBlciB3aXRob3V0IGEgcmFuZ2VcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiBtYXBEYXRhLFxuICAgICAgc3RyVmFsdWU6ICcnICsgdmFsdWUsXG4gICAgICBtYXBwZWQ6IF9tYXBwZWQsXG4gICAgICBmaWVsZDogbWFwRGF0YVsxXSxcbiAgICAgIGZpZWxkTWluOiBwYXJzZUZsb2F0KG1hcERhdGFbMl0pLFxuICAgICAgLy8gbWluICYgbWF4IGFyZSBudW1lcmljXG4gICAgICBmaWVsZE1heDogcGFyc2VGbG9hdChtYXBEYXRhWzNdKSxcbiAgICAgIHZhbHVlTWluOiB2YWx1ZU1pbi52YWx1ZSxcbiAgICAgIHZhbHVlTWF4OiB2YWx1ZU1heC52YWx1ZSxcbiAgICAgIGJ5cGFzczogcHJvcElzQnlwYXNzXG4gICAgfTtcbiAgfVxuICBpZiAodHlwZS5tdWx0aXBsZSAmJiBwcm9wSXNGbGF0ICE9PSAnbXVsdGlwbGUnKSB7XG4gICAgdmFyIHZhbHM7XG4gICAgaWYgKHZhbHVlSXNTdHJpbmcpIHtcbiAgICAgIHZhbHMgPSB2YWx1ZS5zcGxpdCgvXFxzKy8pO1xuICAgIH0gZWxzZSBpZiAoYXJyYXkodmFsdWUpKSB7XG4gICAgICB2YWxzID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHMgPSBbdmFsdWVdO1xuICAgIH1cbiAgICBpZiAodHlwZS5ldmVuTXVsdGlwbGUgJiYgdmFscy5sZW5ndGggJSAyICE9PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHZhbEFyciA9IFtdO1xuICAgIHZhciB1bml0c0FyciA9IFtdO1xuICAgIHZhciBwZlZhbEFyciA9IFtdO1xuICAgIHZhciBzdHJWYWwgPSAnJztcbiAgICB2YXIgaGFzRW51bSA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHAgPSBzZWxmLnBhcnNlKG5hbWUsIHZhbHNbaV0sIHByb3BJc0J5cGFzcywgJ211bHRpcGxlJyk7XG4gICAgICBoYXNFbnVtID0gaGFzRW51bSB8fCBzdHJpbmcocC52YWx1ZSk7XG4gICAgICB2YWxBcnIucHVzaChwLnZhbHVlKTtcbiAgICAgIHBmVmFsQXJyLnB1c2gocC5wZlZhbHVlICE9IG51bGwgPyBwLnBmVmFsdWUgOiBwLnZhbHVlKTtcbiAgICAgIHVuaXRzQXJyLnB1c2gocC51bml0cyk7XG4gICAgICBzdHJWYWwgKz0gKGkgPiAwID8gJyAnIDogJycpICsgcC5zdHJWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGUudmFsaWRhdGUgJiYgIXR5cGUudmFsaWRhdGUodmFsQXJyLCB1bml0c0FycikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodHlwZS5zaW5nbGVFbnVtICYmIGhhc0VudW0pIHtcbiAgICAgIGlmICh2YWxBcnIubGVuZ3RoID09PSAxICYmIHN0cmluZyh2YWxBcnJbMF0pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICB2YWx1ZTogdmFsQXJyWzBdLFxuICAgICAgICAgIHN0clZhbHVlOiB2YWxBcnJbMF0sXG4gICAgICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiB2YWxBcnIsXG4gICAgICBwZlZhbHVlOiBwZlZhbEFycixcbiAgICAgIHN0clZhbHVlOiBzdHJWYWwsXG4gICAgICBieXBhc3M6IHByb3BJc0J5cGFzcyxcbiAgICAgIHVuaXRzOiB1bml0c0FyclxuICAgIH07XG4gIH1cblxuICAvLyBzZXZlcmFsIHR5cGVzIGFsc28gYWxsb3cgZW51bXNcbiAgdmFyIGNoZWNrRW51bXMgPSBmdW5jdGlvbiBjaGVja0VudW1zKCkge1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCB0eXBlLmVudW1zLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIGVuID0gdHlwZS5lbnVtc1tfaV07XG4gICAgICBpZiAoZW4gPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgc3RyVmFsdWU6ICcnICsgdmFsdWUsXG4gICAgICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgLy8gY2hlY2sgdGhlIHR5cGUgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgb2JqZWN0XG4gIGlmICh0eXBlLm51bWJlcikge1xuICAgIHZhciB1bml0cztcbiAgICB2YXIgaW1wbGljaXRVbml0cyA9ICdweCc7IC8vIG5vdCBzZXQgPT4gcHhcblxuICAgIGlmICh0eXBlLnVuaXRzKSB7XG4gICAgICAvLyB1c2Ugc3BlY2lmaWVkIHVuaXRzIGlmIHNldFxuICAgICAgdW5pdHMgPSB0eXBlLnVuaXRzO1xuICAgIH1cbiAgICBpZiAodHlwZS5pbXBsaWNpdFVuaXRzKSB7XG4gICAgICBpbXBsaWNpdFVuaXRzID0gdHlwZS5pbXBsaWNpdFVuaXRzO1xuICAgIH1cbiAgICBpZiAoIXR5cGUudW5pdGxlc3MpIHtcbiAgICAgIGlmICh2YWx1ZUlzU3RyaW5nKSB7XG4gICAgICAgIHZhciB1bml0c1JlZ2V4ID0gJ3B4fGVtJyArICh0eXBlLmFsbG93UGVyY2VudCA/ICd8XFxcXCUnIDogJycpO1xuICAgICAgICBpZiAodW5pdHMpIHtcbiAgICAgICAgICB1bml0c1JlZ2V4ID0gdW5pdHM7XG4gICAgICAgIH0gLy8gb25seSBhbGxvdyBleHBsaWNpdCB1bml0cyBpZiBzbyBzZXRcbiAgICAgICAgdmFyIG1hdGNoID0gdmFsdWUubWF0Y2goJ14oJyArIG51bWJlciArICcpKCcgKyB1bml0c1JlZ2V4ICsgJyk/JyArICckJyk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHZhbHVlID0gbWF0Y2hbMV07XG4gICAgICAgICAgdW5pdHMgPSBtYXRjaFsyXSB8fCBpbXBsaWNpdFVuaXRzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCF1bml0cyB8fCB0eXBlLmltcGxpY2l0VW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBpbXBsaWNpdFVuaXRzOyAvLyBpbXBsaWNpdGx5IHB4IGlmIHVuc3BlY2lmaWVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcblxuICAgIC8vIGlmIG5vdCBhIG51bWJlciBhbmQgZW51bXMgbm90IGFsbG93ZWQsIHRoZW4gdGhlIHZhbHVlIGlzIGludmFsaWRcbiAgICBpZiAoaXNOYU4odmFsdWUpICYmIHR5cGUuZW51bXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhpcyBudW1iZXIgdHlwZSBhbHNvIGFjY2VwdHMgc3BlY2lhbCBrZXl3b3JkcyBpbiBwbGFjZSBvZiBudW1iZXJzXG4gICAgLy8gKGkuZS4gYGxlZnRgLCBgYXV0b2AsIGV0YylcbiAgICBpZiAoaXNOYU4odmFsdWUpICYmIHR5cGUuZW51bXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWUgPSBwYXNzZWRWYWx1ZTtcbiAgICAgIHJldHVybiBjaGVja0VudW1zKCk7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdmFsdWUgbXVzdCBiZSBhbiBpbnRlZ2VyXG4gICAgaWYgKHR5cGUuaW50ZWdlciAmJiAhaW50ZWdlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIHZhbHVlIGlzIHdpdGhpbiByYW5nZVxuICAgIGlmICh0eXBlLm1pbiAhPT0gdW5kZWZpbmVkICYmICh2YWx1ZSA8IHR5cGUubWluIHx8IHR5cGUuc3RyaWN0TWluICYmIHZhbHVlID09PSB0eXBlLm1pbikgfHwgdHlwZS5tYXggIT09IHVuZGVmaW5lZCAmJiAodmFsdWUgPiB0eXBlLm1heCB8fCB0eXBlLnN0cmljdE1heCAmJiB2YWx1ZSA9PT0gdHlwZS5tYXgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHJldCA9IHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBzdHJWYWx1ZTogJycgKyB2YWx1ZSArICh1bml0cyA/IHVuaXRzIDogJycpLFxuICAgICAgdW5pdHM6IHVuaXRzLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuXG4gICAgLy8gbm9ybWFsaXNlIHZhbHVlIGluIHBpeGVsc1xuICAgIGlmICh0eXBlLnVuaXRsZXNzIHx8IHVuaXRzICE9PSAncHgnICYmIHVuaXRzICE9PSAnZW0nKSB7XG4gICAgICByZXQucGZWYWx1ZSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXQucGZWYWx1ZSA9IHVuaXRzID09PSAncHgnIHx8ICF1bml0cyA/IHZhbHVlIDogdGhpcy5nZXRFbVNpemVJblBpeGVscygpICogdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gbm9ybWFsaXNlIHZhbHVlIGluIG1zXG4gICAgaWYgKHVuaXRzID09PSAnbXMnIHx8IHVuaXRzID09PSAncycpIHtcbiAgICAgIHJldC5wZlZhbHVlID0gdW5pdHMgPT09ICdtcycgPyB2YWx1ZSA6IDEwMDAgKiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBub3JtYWxpc2UgdmFsdWUgaW4gcmFkXG4gICAgaWYgKHVuaXRzID09PSAnZGVnJyB8fCB1bml0cyA9PT0gJ3JhZCcpIHtcbiAgICAgIHJldC5wZlZhbHVlID0gdW5pdHMgPT09ICdyYWQnID8gdmFsdWUgOiBkZWcycmFkKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBub3JtYWxpemUgdmFsdWUgaW4gJVxuICAgIGlmICh1bml0cyA9PT0gJyUnKSB7XG4gICAgICByZXQucGZWYWx1ZSA9IHZhbHVlIC8gMTAwO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9IGVsc2UgaWYgKHR5cGUucHJvcExpc3QpIHtcbiAgICB2YXIgcHJvcHMgPSBbXTtcbiAgICB2YXIgcHJvcHNTdHIgPSAnJyArIHZhbHVlO1xuICAgIGlmIChwcm9wc1N0ciA9PT0gJ25vbmUnKSA7IGVsc2Uge1xuICAgICAgLy8gZ28gb3ZlciBlYWNoIHByb3BcblxuICAgICAgdmFyIHByb3BzU3BsaXQgPSBwcm9wc1N0ci5zcGxpdCgvXFxzKixcXHMqfFxccysvKTtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHByb3BzU3BsaXQubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICB2YXIgcHJvcE5hbWUgPSBwcm9wc1NwbGl0W19pMl0udHJpbSgpO1xuICAgICAgICBpZiAoc2VsZi5wcm9wZXJ0aWVzW3Byb3BOYW1lXSkge1xuICAgICAgICAgIHByb3BzLnB1c2gocHJvcE5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhcm4oJ2AnICsgcHJvcE5hbWUgKyAnYCBpcyBub3QgYSB2YWxpZCBwcm9wZXJ0eSBuYW1lJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IHByb3BzLFxuICAgICAgc3RyVmFsdWU6IHByb3BzLmxlbmd0aCA9PT0gMCA/ICdub25lJyA6IHByb3BzLmpvaW4oJyAnKSxcbiAgICAgIGJ5cGFzczogcHJvcElzQnlwYXNzXG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlLmNvbG9yKSB7XG4gICAgdmFyIHR1cGxlID0gY29sb3IydHVwbGUodmFsdWUpO1xuICAgIGlmICghdHVwbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiB0dXBsZSxcbiAgICAgIHBmVmFsdWU6IHR1cGxlLFxuICAgICAgc3RyVmFsdWU6ICdyZ2IoJyArIHR1cGxlWzBdICsgJywnICsgdHVwbGVbMV0gKyAnLCcgKyB0dXBsZVsyXSArICcpJyxcbiAgICAgIC8vIG4uYi4gbm8gc3BhY2VzIGIvYyBvZiBtdWx0aXBsZSBzdXBwb3J0XG4gICAgICBieXBhc3M6IHByb3BJc0J5cGFzc1xuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZS5yZWdleCB8fCB0eXBlLnJlZ2V4ZXMpIHtcbiAgICAvLyBmaXJzdCBjaGVjayBlbnVtc1xuICAgIGlmICh0eXBlLmVudW1zKSB7XG4gICAgICB2YXIgZW51bVByb3AgPSBjaGVja0VudW1zKCk7XG4gICAgICBpZiAoZW51bVByb3ApIHtcbiAgICAgICAgcmV0dXJuIGVudW1Qcm9wO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgcmVnZXhlcyA9IHR5cGUucmVnZXhlcyA/IHR5cGUucmVnZXhlcyA6IFt0eXBlLnJlZ2V4XTtcbiAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCByZWdleGVzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAocmVnZXhlc1tfaTNdKTsgLy8gbWFrZSBhIHJlZ2V4IGZyb20gdGhlIHR5cGUgc3RyaW5nXG4gICAgICB2YXIgbSA9IHJlZ2V4LmV4ZWModmFsdWUpO1xuICAgICAgaWYgKG0pIHtcbiAgICAgICAgLy8gcmVnZXggbWF0Y2hlc1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgdmFsdWU6IHR5cGUuc2luZ2xlUmVnZXhNYXRjaFZhbHVlID8gbVsxXSA6IG0sXG4gICAgICAgICAgc3RyVmFsdWU6ICcnICsgdmFsdWUsXG4gICAgICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7IC8vIGRpZG4ndCBtYXRjaCBhbnlcbiAgfSBlbHNlIGlmICh0eXBlLnN0cmluZykge1xuICAgIC8vIGp1c3QgcmV0dXJuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogJycgKyB2YWx1ZSxcbiAgICAgIHN0clZhbHVlOiAnJyArIHZhbHVlLFxuICAgICAgYnlwYXNzOiBwcm9wSXNCeXBhc3NcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGUuZW51bXMpIHtcbiAgICAvLyBjaGVjayBlbnVtcyBsYXN0IGJlY2F1c2UgaXQncyBhIGNvbWJvIHR5cGUgaW4gb3RoZXJzXG4gICAgcmV0dXJuIGNoZWNrRW51bXMoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDsgLy8gbm90IGEgdHlwZSB3ZSBjYW4gaGFuZGxlXG4gIH1cbn07XG5cbnZhciBTdHlsZSA9IGZ1bmN0aW9uIFN0eWxlKGN5KSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTdHlsZSkpIHtcbiAgICByZXR1cm4gbmV3IFN0eWxlKGN5KTtcbiAgfVxuICBpZiAoIWNvcmUoY3kpKSB7XG4gICAgZXJyb3IoJ0Egc3R5bGUgbXVzdCBoYXZlIGEgY29yZSByZWZlcmVuY2UnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5fcHJpdmF0ZSA9IHtcbiAgICBjeTogY3ksXG4gICAgY29yZVN0eWxlOiB7fVxuICB9O1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucmVzZXRUb0RlZmF1bHQoKTtcbn07XG52YXIgc3R5Zm4gPSBTdHlsZS5wcm90b3R5cGU7XG5zdHlmbi5pbnN0YW5jZVN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdzdHlsZSc7XG59O1xuXG4vLyByZW1vdmUgYWxsIGNvbnRleHRzXG5zdHlmbi5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgdmFyIGN5ID0gX3AuY3k7XG4gIHZhciBlbGVzID0gY3kuZWxlbWVudHMoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpc1tpXSA9IHVuZGVmaW5lZDtcbiAgfVxuICB0aGlzLmxlbmd0aCA9IDA7XG4gIF9wLmNvbnRleHRTdHlsZXMgPSB7fTtcbiAgX3AucHJvcERpZmZzID0ge307XG4gIHRoaXMuY2xlYW5FbGVtZW50cyhlbGVzLCB0cnVlKTtcbiAgZWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICB2YXIgZWxlX3AgPSBlbGVbMF0uX3ByaXZhdGU7XG4gICAgZWxlX3Auc3R5bGVEaXJ0eSA9IHRydWU7XG4gICAgZWxlX3AuYXBwbGllZEluaXRTdHlsZSA9IGZhbHNlO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG5zdHlmbi5yZXNldFRvRGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5jbGVhcigpO1xuICB0aGlzLmFkZERlZmF1bHRTdHlsZXNoZWV0KCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gYnVpbGRzIGEgc3R5bGUgb2JqZWN0IGZvciB0aGUgJ2NvcmUnIHNlbGVjdG9yXG5zdHlmbi5jb3JlID0gZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gIHJldHVybiB0aGlzLl9wcml2YXRlLmNvcmVTdHlsZVtwcm9wTmFtZV0gfHwgdGhpcy5nZXREZWZhdWx0UHJvcGVydHkocHJvcE5hbWUpO1xufTtcblxuLy8gY3JlYXRlIGEgbmV3IGNvbnRleHQgZnJvbSB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yIHN0cmluZyBhbmQgc3dpdGNoIHRvIHRoYXQgY29udGV4dFxuc3R5Zm4uc2VsZWN0b3IgPSBmdW5jdGlvbiAoc2VsZWN0b3JTdHIpIHtcbiAgLy8gJ2NvcmUnIGlzIGEgc3BlY2lhbCBjYXNlIGFuZCBkb2VzIG5vdCBuZWVkIGEgc2VsZWN0b3JcbiAgdmFyIHNlbGVjdG9yID0gc2VsZWN0b3JTdHIgPT09ICdjb3JlJyA/IG51bGwgOiBuZXcgU2VsZWN0b3Ioc2VsZWN0b3JTdHIpO1xuICB2YXIgaSA9IHRoaXMubGVuZ3RoKys7IC8vIG5ldyBjb250ZXh0IG1lYW5zIG5ldyBpbmRleFxuICB0aGlzW2ldID0ge1xuICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICBwcm9wZXJ0aWVzOiBbXSxcbiAgICBtYXBwZWRQcm9wZXJ0aWVzOiBbXSxcbiAgICBpbmRleDogaVxuICB9O1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbi8vIGFkZCBvbmUgb3IgbWFueSBjc3MgcnVsZXMgdG8gdGhlIGN1cnJlbnQgY29udGV4dFxuc3R5Zm4uY3NzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICB2YXIgbWFwID0gYXJnc1swXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBzZWxmLnByb3BlcnRpZXNbaV07XG4gICAgICB2YXIgbWFwVmFsID0gbWFwW3Byb3AubmFtZV07XG4gICAgICBpZiAobWFwVmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWFwVmFsID0gbWFwW2Rhc2gyY2FtZWwocHJvcC5uYW1lKV07XG4gICAgICB9XG4gICAgICBpZiAobWFwVmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jc3NSdWxlKHByb3AubmFtZSwgbWFwVmFsKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICB0aGlzLmNzc1J1bGUoYXJnc1swXSwgYXJnc1sxXSk7XG4gIH1cblxuICAvLyBkbyBub3RoaW5nIGlmIGFyZ3MgYXJlIGludmFsaWRcblxuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbnN0eWZuLnN0eWxlID0gc3R5Zm4uY3NzO1xuXG4vLyBhZGQgYSBzaW5nbGUgY3NzIHJ1bGUgdG8gdGhlIGN1cnJlbnQgY29udGV4dFxuc3R5Zm4uY3NzUnVsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAvLyBuYW1lLXZhbHVlIHBhaXJcbiAgdmFyIHByb3BlcnR5ID0gdGhpcy5wYXJzZShuYW1lLCB2YWx1ZSk7XG5cbiAgLy8gYWRkIHByb3BlcnR5IHRvIGN1cnJlbnQgY29udGV4dCBpZiB2YWxpZFxuICBpZiAocHJvcGVydHkpIHtcbiAgICB2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTtcbiAgICB0aGlzW2ldLnByb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7XG4gICAgdGhpc1tpXS5wcm9wZXJ0aWVzW3Byb3BlcnR5Lm5hbWVdID0gcHJvcGVydHk7IC8vIGFsbG93IGFjY2VzcyBieSBuYW1lIGFzIHdlbGxcblxuICAgIGlmIChwcm9wZXJ0eS5uYW1lLm1hdGNoKC9waWUtKFxcZCspLWJhY2tncm91bmQtc2l6ZS8pICYmIHByb3BlcnR5LnZhbHVlKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLmhhc1BpZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChwcm9wZXJ0eS5tYXBwZWQpIHtcbiAgICAgIHRoaXNbaV0ubWFwcGVkUHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICAvLyBhZGQgdG8gY29yZSBzdHlsZSBpZiBuZWNlc3NhcnlcbiAgICB2YXIgY3VycmVudFNlbGVjdG9ySXNDb3JlID0gIXRoaXNbaV0uc2VsZWN0b3I7XG4gICAgaWYgKGN1cnJlbnRTZWxlY3RvcklzQ29yZSkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5jb3JlU3R5bGVbcHJvcGVydHkubmFtZV0gPSBwcm9wZXJ0eTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG5zdHlmbi5hcHBlbmQgPSBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgaWYgKHN0eWxlc2hlZXQoc3R5bGUpKSB7XG4gICAgc3R5bGUuYXBwZW5kVG9TdHlsZSh0aGlzKTtcbiAgfSBlbHNlIGlmIChhcnJheShzdHlsZSkpIHtcbiAgICB0aGlzLmFwcGVuZEZyb21Kc29uKHN0eWxlKTtcbiAgfSBlbHNlIGlmIChzdHJpbmcoc3R5bGUpKSB7XG4gICAgdGhpcy5hcHBlbmRGcm9tU3RyaW5nKHN0eWxlKTtcbiAgfSAvLyB5b3UgcHJvYmFibHkgd291bGRuJ3Qgd2FudCB0byBhcHBlbmQgYSBTdHlsZSwgc2luY2UgeW91J2QgZHVwbGljYXRlIHRoZSBkZWZhdWx0IHBhcnRzXG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzdGF0aWMgZnVuY3Rpb25cblN0eWxlLmZyb21Kc29uID0gZnVuY3Rpb24gKGN5LCBqc29uKSB7XG4gIHZhciBzdHlsZSA9IG5ldyBTdHlsZShjeSk7XG4gIHN0eWxlLmZyb21Kc29uKGpzb24pO1xuICByZXR1cm4gc3R5bGU7XG59O1xuU3R5bGUuZnJvbVN0cmluZyA9IGZ1bmN0aW9uIChjeSwgc3RyaW5nKSB7XG4gIHJldHVybiBuZXcgU3R5bGUoY3kpLmZyb21TdHJpbmcoc3RyaW5nKTtcbn07XG5bc3R5Zm4kOCwgc3R5Zm4kNywgc3R5Zm4kNiwgc3R5Zm4kNSwgc3R5Zm4kNCwgc3R5Zm4kMywgc3R5Zm4kMiwgc3R5Zm4kMV0uZm9yRWFjaChmdW5jdGlvbiAocHJvcHMpIHtcbiAgZXh0ZW5kKHN0eWZuLCBwcm9wcyk7XG59KTtcblN0eWxlLnR5cGVzID0gc3R5Zm4udHlwZXM7XG5TdHlsZS5wcm9wZXJ0aWVzID0gc3R5Zm4ucHJvcGVydGllcztcblN0eWxlLnByb3BlcnR5R3JvdXBzID0gc3R5Zm4ucHJvcGVydHlHcm91cHM7XG5TdHlsZS5wcm9wZXJ0eUdyb3VwTmFtZXMgPSBzdHlmbi5wcm9wZXJ0eUdyb3VwTmFtZXM7XG5TdHlsZS5wcm9wZXJ0eUdyb3VwS2V5cyA9IHN0eWZuLnByb3BlcnR5R3JvdXBLZXlzO1xuXG52YXIgY29yZWZuJDIgPSB7XG4gIHN0eWxlOiBmdW5jdGlvbiBzdHlsZShuZXdTdHlsZSkge1xuICAgIGlmIChuZXdTdHlsZSkge1xuICAgICAgdmFyIHMgPSB0aGlzLnNldFN0eWxlKG5ld1N0eWxlKTtcbiAgICAgIHMudXBkYXRlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnN0eWxlO1xuICB9LFxuICBzZXRTdHlsZTogZnVuY3Rpb24gc2V0U3R5bGUoc3R5bGUpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmIChzdHlsZXNoZWV0KHN0eWxlKSkge1xuICAgICAgX3Auc3R5bGUgPSBzdHlsZS5nZW5lcmF0ZVN0eWxlKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoYXJyYXkoc3R5bGUpKSB7XG4gICAgICBfcC5zdHlsZSA9IFN0eWxlLmZyb21Kc29uKHRoaXMsIHN0eWxlKTtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyhzdHlsZSkpIHtcbiAgICAgIF9wLnN0eWxlID0gU3R5bGUuZnJvbVN0cmluZyh0aGlzLCBzdHlsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9wLnN0eWxlID0gU3R5bGUodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiBfcC5zdHlsZTtcbiAgfSxcbiAgLy8gZS5nLiBjeS5kYXRhKCkgY2hhbmdlZCA9PiByZWNhbGMgZWxlIG1hcHBlcnNcbiAgdXBkYXRlU3R5bGU6IGZ1bmN0aW9uIHVwZGF0ZVN0eWxlKCkge1xuICAgIHRoaXMubXV0YWJsZUVsZW1lbnRzKCkudXBkYXRlU3R5bGUoKTsgLy8ganVzdCBzZW5kIHRvIGFsbCBlbGVzXG4gIH1cbn07XG5cbnZhciBkZWZhdWx0U2VsZWN0aW9uVHlwZSA9ICdzaW5nbGUnO1xudmFyIGNvcmVmbiQxID0ge1xuICBhdXRvbG9jazogZnVuY3Rpb24gYXV0b2xvY2soYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUuYXV0b2xvY2sgPSBib29sID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5hdXRvbG9jaztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgYXV0b3VuZ3JhYmlmeTogZnVuY3Rpb24gYXV0b3VuZ3JhYmlmeShib29sKSB7XG4gICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5hdXRvdW5ncmFiaWZ5ID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuYXV0b3VuZ3JhYmlmeTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgYXV0b3Vuc2VsZWN0aWZ5OiBmdW5jdGlvbiBhdXRvdW5zZWxlY3RpZnkoYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ByaXZhdGUuYXV0b3Vuc2VsZWN0aWZ5ID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuYXV0b3Vuc2VsZWN0aWZ5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICBzZWxlY3Rpb25UeXBlOiBmdW5jdGlvbiBzZWxlY3Rpb25UeXBlKHNlbFR5cGUpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIGlmIChfcC5zZWxlY3Rpb25UeXBlID09IG51bGwpIHtcbiAgICAgIF9wLnNlbGVjdGlvblR5cGUgPSBkZWZhdWx0U2VsZWN0aW9uVHlwZTtcbiAgICB9XG4gICAgaWYgKHNlbFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHNlbFR5cGUgPT09ICdhZGRpdGl2ZScgfHwgc2VsVHlwZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgX3Auc2VsZWN0aW9uVHlwZSA9IHNlbFR5cGU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBfcC5zZWxlY3Rpb25UeXBlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgcGFubmluZ0VuYWJsZWQ6IGZ1bmN0aW9uIHBhbm5pbmdFbmFibGVkKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUucGFubmluZ0VuYWJsZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIHVzZXJQYW5uaW5nRW5hYmxlZDogZnVuY3Rpb24gdXNlclBhbm5pbmdFbmFibGVkKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLnVzZXJQYW5uaW5nRW5hYmxlZCA9IGJvb2wgPyB0cnVlIDogZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnVzZXJQYW5uaW5nRW5hYmxlZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgem9vbWluZ0VuYWJsZWQ6IGZ1bmN0aW9uIHpvb21pbmdFbmFibGVkKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLnpvb21pbmdFbmFibGVkID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuem9vbWluZ0VuYWJsZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIHVzZXJab29taW5nRW5hYmxlZDogZnVuY3Rpb24gdXNlclpvb21pbmdFbmFibGVkKGJvb2wpIHtcbiAgICBpZiAoYm9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wcml2YXRlLnVzZXJab29taW5nRW5hYmxlZCA9IGJvb2wgPyB0cnVlIDogZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLnVzZXJab29taW5nRW5hYmxlZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgYm94U2VsZWN0aW9uRW5hYmxlZDogZnVuY3Rpb24gYm94U2VsZWN0aW9uRW5hYmxlZChib29sKSB7XG4gICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5ib3hTZWxlY3Rpb25FbmFibGVkID0gYm9vbCA/IHRydWUgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuYm94U2VsZWN0aW9uRW5hYmxlZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgcGFuOiBmdW5jdGlvbiBwYW4oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIHBhbiA9IHRoaXMuX3ByaXZhdGUucGFuO1xuICAgIHZhciBkaW0sIHZhbCwgZGltcywgeCwgeTtcbiAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIC8vIC5wYW4oKVxuICAgICAgICByZXR1cm4gcGFuO1xuICAgICAgY2FzZSAxOlxuICAgICAgICBpZiAoc3RyaW5nKGFyZ3NbMF0pKSB7XG4gICAgICAgICAgLy8gLnBhbigneCcpXG4gICAgICAgICAgZGltID0gYXJnc1swXTtcbiAgICAgICAgICByZXR1cm4gcGFuW2RpbV07XG4gICAgICAgIH0gZWxzZSBpZiAocGxhaW5PYmplY3QoYXJnc1swXSkpIHtcbiAgICAgICAgICAvLyAucGFuKHsgeDogMCwgeTogMTAwIH0pXG4gICAgICAgICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGltcyA9IGFyZ3NbMF07XG4gICAgICAgICAgeCA9IGRpbXMueDtcbiAgICAgICAgICB5ID0gZGltcy55O1xuICAgICAgICAgIGlmIChudW1iZXIkMSh4KSkge1xuICAgICAgICAgICAgcGFuLnggPSB4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobnVtYmVyJDEoeSkpIHtcbiAgICAgICAgICAgIHBhbi55ID0geTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5lbWl0KCdwYW4gdmlld3BvcnQnKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgLy8gLnBhbigneCcsIDEwMClcbiAgICAgICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZGltID0gYXJnc1swXTtcbiAgICAgICAgdmFsID0gYXJnc1sxXTtcbiAgICAgICAgaWYgKChkaW0gPT09ICd4JyB8fCBkaW0gPT09ICd5JykgJiYgbnVtYmVyJDEodmFsKSkge1xuICAgICAgICAgIHBhbltkaW1dID0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdCgncGFuIHZpZXdwb3J0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gaW52YWxpZFxuICAgIH1cblxuICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIHBhbkJ5OiBmdW5jdGlvbiBwYW5CeShhcmcwLCBhcmcxKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIHBhbiA9IHRoaXMuX3ByaXZhdGUucGFuO1xuICAgIHZhciBkaW0sIHZhbCwgZGltcywgeCwgeTtcbiAgICBpZiAoIXRoaXMuX3ByaXZhdGUucGFubmluZ0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIGlmIChwbGFpbk9iamVjdChhcmcwKSkge1xuICAgICAgICAgIC8vIC5wYW5CeSh7IHg6IDAsIHk6IDEwMCB9KVxuICAgICAgICAgIGRpbXMgPSBhcmdzWzBdO1xuICAgICAgICAgIHggPSBkaW1zLng7XG4gICAgICAgICAgeSA9IGRpbXMueTtcbiAgICAgICAgICBpZiAobnVtYmVyJDEoeCkpIHtcbiAgICAgICAgICAgIHBhbi54ICs9IHg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChudW1iZXIkMSh5KSkge1xuICAgICAgICAgICAgcGFuLnkgKz0geTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5lbWl0KCdwYW4gdmlld3BvcnQnKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgLy8gLnBhbkJ5KCd4JywgMTAwKVxuICAgICAgICBkaW0gPSBhcmcwO1xuICAgICAgICB2YWwgPSBhcmcxO1xuICAgICAgICBpZiAoKGRpbSA9PT0gJ3gnIHx8IGRpbSA9PT0gJ3knKSAmJiBudW1iZXIkMSh2YWwpKSB7XG4gICAgICAgICAgcGFuW2RpbV0gKz0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdCgncGFuIHZpZXdwb3J0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gaW52YWxpZFxuICAgIH1cblxuICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIGZpdDogZnVuY3Rpb24gZml0KGVsZW1lbnRzLCBwYWRkaW5nKSB7XG4gICAgdmFyIHZpZXdwb3J0U3RhdGUgPSB0aGlzLmdldEZpdFZpZXdwb3J0KGVsZW1lbnRzLCBwYWRkaW5nKTtcbiAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICAgIF9wLnpvb20gPSB2aWV3cG9ydFN0YXRlLnpvb207XG4gICAgICBfcC5wYW4gPSB2aWV3cG9ydFN0YXRlLnBhbjtcbiAgICAgIHRoaXMuZW1pdCgncGFuIHpvb20gdmlld3BvcnQnKTtcbiAgICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICBnZXRGaXRWaWV3cG9ydDogZnVuY3Rpb24gZ2V0Rml0Vmlld3BvcnQoZWxlbWVudHMsIHBhZGRpbmcpIHtcbiAgICBpZiAobnVtYmVyJDEoZWxlbWVudHMpICYmIHBhZGRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZWxlbWVudHMgaXMgb3B0aW9uYWxcbiAgICAgIHBhZGRpbmcgPSBlbGVtZW50cztcbiAgICAgIGVsZW1lbnRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3ByaXZhdGUucGFubmluZ0VuYWJsZWQgfHwgIXRoaXMuX3ByaXZhdGUuem9vbWluZ0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGJiO1xuICAgIGlmIChzdHJpbmcoZWxlbWVudHMpKSB7XG4gICAgICB2YXIgc2VsID0gZWxlbWVudHM7XG4gICAgICBlbGVtZW50cyA9IHRoaXMuJChzZWwpO1xuICAgIH0gZWxzZSBpZiAoYm91bmRpbmdCb3goZWxlbWVudHMpKSB7XG4gICAgICAvLyBhc3N1bWUgYmJcbiAgICAgIHZhciBiYmUgPSBlbGVtZW50cztcbiAgICAgIGJiID0ge1xuICAgICAgICB4MTogYmJlLngxLFxuICAgICAgICB5MTogYmJlLnkxLFxuICAgICAgICB4MjogYmJlLngyLFxuICAgICAgICB5MjogYmJlLnkyXG4gICAgICB9O1xuICAgICAgYmIudyA9IGJiLngyIC0gYmIueDE7XG4gICAgICBiYi5oID0gYmIueTIgLSBiYi55MTtcbiAgICB9IGVsc2UgaWYgKCFlbGVtZW50T3JDb2xsZWN0aW9uKGVsZW1lbnRzKSkge1xuICAgICAgZWxlbWVudHMgPSB0aGlzLm11dGFibGVFbGVtZW50cygpO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudE9yQ29sbGVjdGlvbihlbGVtZW50cykgJiYgZWxlbWVudHMuZW1wdHkoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gY2FuJ3QgZml0IHRvIG5vdGhpbmdcblxuICAgIGJiID0gYmIgfHwgZWxlbWVudHMuYm91bmRpbmdCb3goKTtcbiAgICB2YXIgdyA9IHRoaXMud2lkdGgoKTtcbiAgICB2YXIgaCA9IHRoaXMuaGVpZ2h0KCk7XG4gICAgdmFyIHpvb207XG4gICAgcGFkZGluZyA9IG51bWJlciQxKHBhZGRpbmcpID8gcGFkZGluZyA6IDA7XG4gICAgaWYgKCFpc05hTih3KSAmJiAhaXNOYU4oaCkgJiYgdyA+IDAgJiYgaCA+IDAgJiYgIWlzTmFOKGJiLncpICYmICFpc05hTihiYi5oKSAmJiBiYi53ID4gMCAmJiBiYi5oID4gMCkge1xuICAgICAgem9vbSA9IE1hdGgubWluKCh3IC0gMiAqIHBhZGRpbmcpIC8gYmIudywgKGggLSAyICogcGFkZGluZykgLyBiYi5oKTtcblxuICAgICAgLy8gY3JvcCB6b29tXG4gICAgICB6b29tID0gem9vbSA+IHRoaXMuX3ByaXZhdGUubWF4Wm9vbSA/IHRoaXMuX3ByaXZhdGUubWF4Wm9vbSA6IHpvb207XG4gICAgICB6b29tID0gem9vbSA8IHRoaXMuX3ByaXZhdGUubWluWm9vbSA/IHRoaXMuX3ByaXZhdGUubWluWm9vbSA6IHpvb207XG4gICAgICB2YXIgcGFuID0ge1xuICAgICAgICAvLyBub3cgcGFuIHRvIG1pZGRsZVxuICAgICAgICB4OiAodyAtIHpvb20gKiAoYmIueDEgKyBiYi54MikpIC8gMixcbiAgICAgICAgeTogKGggLSB6b29tICogKGJiLnkxICsgYmIueTIpKSAvIDJcbiAgICAgIH07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB6b29tOiB6b29tLFxuICAgICAgICBwYW46IHBhblxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9LFxuICB6b29tUmFuZ2U6IGZ1bmN0aW9uIHpvb21SYW5nZShtaW4sIG1heCkge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgaWYgKG1heCA9PSBudWxsKSB7XG4gICAgICB2YXIgb3B0cyA9IG1pbjtcbiAgICAgIG1pbiA9IG9wdHMubWluO1xuICAgICAgbWF4ID0gb3B0cy5tYXg7XG4gICAgfVxuICAgIGlmIChudW1iZXIkMShtaW4pICYmIG51bWJlciQxKG1heCkgJiYgbWluIDw9IG1heCkge1xuICAgICAgX3AubWluWm9vbSA9IG1pbjtcbiAgICAgIF9wLm1heFpvb20gPSBtYXg7XG4gICAgfSBlbHNlIGlmIChudW1iZXIkMShtaW4pICYmIG1heCA9PT0gdW5kZWZpbmVkICYmIG1pbiA8PSBfcC5tYXhab29tKSB7XG4gICAgICBfcC5taW5ab29tID0gbWluO1xuICAgIH0gZWxzZSBpZiAobnVtYmVyJDEobWF4KSAmJiBtaW4gPT09IHVuZGVmaW5lZCAmJiBtYXggPj0gX3AubWluWm9vbSkge1xuICAgICAgX3AubWF4Wm9vbSA9IG1heDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIG1pblpvb206IGZ1bmN0aW9uIG1pblpvb20oem9vbSkge1xuICAgIGlmICh6b29tID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLm1pblpvb207XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnpvb21SYW5nZSh7XG4gICAgICAgIG1pbjogem9vbVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICBtYXhab29tOiBmdW5jdGlvbiBtYXhab29tKHpvb20pIHtcbiAgICBpZiAoem9vbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5tYXhab29tO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy56b29tUmFuZ2Uoe1xuICAgICAgICBtYXg6IHpvb21cbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgZ2V0Wm9vbWVkVmlld3BvcnQ6IGZ1bmN0aW9uIGdldFpvb21lZFZpZXdwb3J0KHBhcmFtcykge1xuICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgdmFyIGN1cnJlbnRQYW4gPSBfcC5wYW47XG4gICAgdmFyIGN1cnJlbnRab29tID0gX3Auem9vbTtcbiAgICB2YXIgcG9zOyAvLyBpbiByZW5kZXJlZCBweFxuICAgIHZhciB6b29tO1xuICAgIHZhciBiYWlsID0gZmFsc2U7XG4gICAgaWYgKCFfcC56b29taW5nRW5hYmxlZCkge1xuICAgICAgLy8gem9vbWluZyBkaXNhYmxlZFxuICAgICAgYmFpbCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChudW1iZXIkMShwYXJhbXMpKSB7XG4gICAgICAvLyB0aGVuIHNldCB0aGUgem9vbVxuICAgICAgem9vbSA9IHBhcmFtcztcbiAgICB9IGVsc2UgaWYgKHBsYWluT2JqZWN0KHBhcmFtcykpIHtcbiAgICAgIC8vIHRoZW4gem9vbSBhYm91dCBhIHBvaW50XG4gICAgICB6b29tID0gcGFyYW1zLmxldmVsO1xuICAgICAgaWYgKHBhcmFtcy5wb3NpdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIHBvcyA9IG1vZGVsVG9SZW5kZXJlZFBvc2l0aW9uKHBhcmFtcy5wb3NpdGlvbiwgY3VycmVudFpvb20sIGN1cnJlbnRQYW4pO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMucmVuZGVyZWRQb3NpdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIHBvcyA9IHBhcmFtcy5yZW5kZXJlZFBvc2l0aW9uO1xuICAgICAgfVxuICAgICAgaWYgKHBvcyAhPSBudWxsICYmICFfcC5wYW5uaW5nRW5hYmxlZCkge1xuICAgICAgICAvLyBwYW5uaW5nIGRpc2FibGVkXG4gICAgICAgIGJhaWwgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNyb3Agem9vbVxuICAgIHpvb20gPSB6b29tID4gX3AubWF4Wm9vbSA/IF9wLm1heFpvb20gOiB6b29tO1xuICAgIHpvb20gPSB6b29tIDwgX3AubWluWm9vbSA/IF9wLm1pblpvb20gOiB6b29tO1xuXG4gICAgLy8gY2FuJ3Qgem9vbSB3aXRoIGludmFsaWQgcGFyYW1zXG4gICAgaWYgKGJhaWwgfHwgIW51bWJlciQxKHpvb20pIHx8IHpvb20gPT09IGN1cnJlbnRab29tIHx8IHBvcyAhPSBudWxsICYmICghbnVtYmVyJDEocG9zLngpIHx8ICFudW1iZXIkMShwb3MueSkpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHBvcyAhPSBudWxsKSB7XG4gICAgICAvLyBzZXQgem9vbSBhYm91dCBwb3NpdGlvblxuICAgICAgdmFyIHBhbjEgPSBjdXJyZW50UGFuO1xuICAgICAgdmFyIHpvb20xID0gY3VycmVudFpvb207XG4gICAgICB2YXIgem9vbTIgPSB6b29tO1xuICAgICAgdmFyIHBhbjIgPSB7XG4gICAgICAgIHg6IC16b29tMiAvIHpvb20xICogKHBvcy54IC0gcGFuMS54KSArIHBvcy54LFxuICAgICAgICB5OiAtem9vbTIgLyB6b29tMSAqIChwb3MueSAtIHBhbjEueSkgKyBwb3MueVxuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHpvb21lZDogdHJ1ZSxcbiAgICAgICAgcGFubmVkOiB0cnVlLFxuICAgICAgICB6b29tOiB6b29tMixcbiAgICAgICAgcGFuOiBwYW4yXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBqdXN0IHNldCB0aGUgem9vbVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgem9vbWVkOiB0cnVlLFxuICAgICAgICBwYW5uZWQ6IGZhbHNlLFxuICAgICAgICB6b29tOiB6b29tLFxuICAgICAgICBwYW46IGN1cnJlbnRQYW5cbiAgICAgIH07XG4gICAgfVxuICB9LFxuICB6b29tOiBmdW5jdGlvbiB6b29tKHBhcmFtcykge1xuICAgIGlmIChwYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZ2V0XG4gICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS56b29tO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzZXRcbiAgICAgIHZhciB2cCA9IHRoaXMuZ2V0Wm9vbWVkVmlld3BvcnQocGFyYW1zKTtcbiAgICAgIHZhciBfcCA9IHRoaXMuX3ByaXZhdGU7XG4gICAgICBpZiAodnAgPT0gbnVsbCB8fCAhdnAuem9vbWVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgX3Auem9vbSA9IHZwLnpvb207XG4gICAgICBpZiAodnAucGFubmVkKSB7XG4gICAgICAgIF9wLnBhbi54ID0gdnAucGFuLng7XG4gICAgICAgIF9wLnBhbi55ID0gdnAucGFuLnk7XG4gICAgICB9XG4gICAgICB0aGlzLmVtaXQoJ3pvb20nICsgKHZwLnBhbm5lZCA/ICcgcGFuJyA6ICcnKSArICcgdmlld3BvcnQnKTtcbiAgICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gICAgfVxuICB9LFxuXG4gIHZpZXdwb3J0OiBmdW5jdGlvbiB2aWV3cG9ydChvcHRzKSB7XG4gICAgdmFyIF9wID0gdGhpcy5fcHJpdmF0ZTtcbiAgICB2YXIgem9vbURlZmQgPSB0cnVlO1xuICAgIHZhciBwYW5EZWZkID0gdHJ1ZTtcbiAgICB2YXIgZXZlbnRzID0gW107IC8vIHRvIHRyaWdnZXJcbiAgICB2YXIgem9vbUZhaWxlZCA9IGZhbHNlO1xuICAgIHZhciBwYW5GYWlsZWQgPSBmYWxzZTtcbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAoIW51bWJlciQxKG9wdHMuem9vbSkpIHtcbiAgICAgIHpvb21EZWZkID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICghcGxhaW5PYmplY3Qob3B0cy5wYW4pKSB7XG4gICAgICBwYW5EZWZkID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICghem9vbURlZmQgJiYgIXBhbkRlZmQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAoem9vbURlZmQpIHtcbiAgICAgIHZhciB6ID0gb3B0cy56b29tO1xuICAgICAgaWYgKHogPCBfcC5taW5ab29tIHx8IHogPiBfcC5tYXhab29tIHx8ICFfcC56b29taW5nRW5hYmxlZCkge1xuICAgICAgICB6b29tRmFpbGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9wLnpvb20gPSB6O1xuICAgICAgICBldmVudHMucHVzaCgnem9vbScpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocGFuRGVmZCAmJiAoIXpvb21GYWlsZWQgfHwgIW9wdHMuY2FuY2VsT25GYWlsZWRab29tKSAmJiBfcC5wYW5uaW5nRW5hYmxlZCkge1xuICAgICAgdmFyIHAgPSBvcHRzLnBhbjtcbiAgICAgIGlmIChudW1iZXIkMShwLngpKSB7XG4gICAgICAgIF9wLnBhbi54ID0gcC54O1xuICAgICAgICBwYW5GYWlsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChudW1iZXIkMShwLnkpKSB7XG4gICAgICAgIF9wLnBhbi55ID0gcC55O1xuICAgICAgICBwYW5GYWlsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghcGFuRmFpbGVkKSB7XG4gICAgICAgIGV2ZW50cy5wdXNoKCdwYW4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBldmVudHMucHVzaCgndmlld3BvcnQnKTtcbiAgICAgIHRoaXMuZW1pdChldmVudHMuam9pbignICcpKTtcbiAgICAgIHRoaXMubm90aWZ5KCd2aWV3cG9ydCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgfSxcblxuICBjZW50ZXI6IGZ1bmN0aW9uIGNlbnRlcihlbGVtZW50cykge1xuICAgIHZhciBwYW4gPSB0aGlzLmdldENlbnRlclBhbihlbGVtZW50cyk7XG4gICAgaWYgKHBhbikge1xuICAgICAgdGhpcy5fcHJpdmF0ZS5wYW4gPSBwYW47XG4gICAgICB0aGlzLmVtaXQoJ3BhbiB2aWV3cG9ydCcpO1xuICAgICAgdGhpcy5ub3RpZnkoJ3ZpZXdwb3J0Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIGdldENlbnRlclBhbjogZnVuY3Rpb24gZ2V0Q2VudGVyUGFuKGVsZW1lbnRzLCB6b29tKSB7XG4gICAgaWYgKCF0aGlzLl9wcml2YXRlLnBhbm5pbmdFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdHJpbmcoZWxlbWVudHMpKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBlbGVtZW50cztcbiAgICAgIGVsZW1lbnRzID0gdGhpcy5tdXRhYmxlRWxlbWVudHMoKS5maWx0ZXIoc2VsZWN0b3IpO1xuICAgIH0gZWxzZSBpZiAoIWVsZW1lbnRPckNvbGxlY3Rpb24oZWxlbWVudHMpKSB7XG4gICAgICBlbGVtZW50cyA9IHRoaXMubXV0YWJsZUVsZW1lbnRzKCk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGNhbid0IGNlbnRyZSBwYW4gdG8gbm90aGluZ1xuXG4gICAgdmFyIGJiID0gZWxlbWVudHMuYm91bmRpbmdCb3goKTtcbiAgICB2YXIgdyA9IHRoaXMud2lkdGgoKTtcbiAgICB2YXIgaCA9IHRoaXMuaGVpZ2h0KCk7XG4gICAgem9vbSA9IHpvb20gPT09IHVuZGVmaW5lZCA/IHRoaXMuX3ByaXZhdGUuem9vbSA6IHpvb207XG4gICAgdmFyIHBhbiA9IHtcbiAgICAgIC8vIG1pZGRsZVxuICAgICAgeDogKHcgLSB6b29tICogKGJiLngxICsgYmIueDIpKSAvIDIsXG4gICAgICB5OiAoaCAtIHpvb20gKiAoYmIueTEgKyBiYi55MikpIC8gMlxuICAgIH07XG4gICAgcmV0dXJuIHBhbjtcbiAgfSxcbiAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgIGlmICghdGhpcy5fcHJpdmF0ZS5wYW5uaW5nRW5hYmxlZCB8fCAhdGhpcy5fcHJpdmF0ZS56b29taW5nRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMudmlld3BvcnQoe1xuICAgICAgcGFuOiB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDBcbiAgICAgIH0sXG4gICAgICB6b29tOiAxXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG4gIH0sXG5cbiAgaW52YWxpZGF0ZVNpemU6IGZ1bmN0aW9uIGludmFsaWRhdGVTaXplKCkge1xuICAgIHRoaXMuX3ByaXZhdGUuc2l6ZUNhY2hlID0gbnVsbDtcbiAgfSxcbiAgc2l6ZTogZnVuY3Rpb24gc2l6ZSgpIHtcbiAgICB2YXIgX3AgPSB0aGlzLl9wcml2YXRlO1xuICAgIHZhciBjb250YWluZXIgPSBfcC5jb250YWluZXI7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICByZXR1cm4gX3Auc2l6ZUNhY2hlID0gX3Auc2l6ZUNhY2hlIHx8IChjb250YWluZXIgPyBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3R5bGUgPSBjeS53aW5kb3coKS5nZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lcik7XG4gICAgICB2YXIgdmFsID0gZnVuY3Rpb24gdmFsKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKSk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGg6IGNvbnRhaW5lci5jbGllbnRXaWR0aCAtIHZhbCgncGFkZGluZy1sZWZ0JykgLSB2YWwoJ3BhZGRpbmctcmlnaHQnKSxcbiAgICAgICAgaGVpZ2h0OiBjb250YWluZXIuY2xpZW50SGVpZ2h0IC0gdmFsKCdwYWRkaW5nLXRvcCcpIC0gdmFsKCdwYWRkaW5nLWJvdHRvbScpXG4gICAgICB9O1xuICAgIH0oKSA6IHtcbiAgICAgIC8vIGZhbGxiYWNrIGlmIG5vIGNvbnRhaW5lciAobm90IDAgYi9jIGNhbiBiZSB1c2VkIGZvciBkaXZpZGluZyBldGMpXG4gICAgICB3aWR0aDogMSxcbiAgICAgIGhlaWdodDogMVxuICAgIH0pO1xuICB9LFxuICB3aWR0aDogZnVuY3Rpb24gd2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZSgpLndpZHRoO1xuICB9LFxuICBoZWlnaHQ6IGZ1bmN0aW9uIGhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5zaXplKCkuaGVpZ2h0O1xuICB9LFxuICBleHRlbnQ6IGZ1bmN0aW9uIGV4dGVudCgpIHtcbiAgICB2YXIgcGFuID0gdGhpcy5fcHJpdmF0ZS5wYW47XG4gICAgdmFyIHpvb20gPSB0aGlzLl9wcml2YXRlLnpvb207XG4gICAgdmFyIHJiID0gdGhpcy5yZW5kZXJlZEV4dGVudCgpO1xuICAgIHZhciBiID0ge1xuICAgICAgeDE6IChyYi54MSAtIHBhbi54KSAvIHpvb20sXG4gICAgICB4MjogKHJiLngyIC0gcGFuLngpIC8gem9vbSxcbiAgICAgIHkxOiAocmIueTEgLSBwYW4ueSkgLyB6b29tLFxuICAgICAgeTI6IChyYi55MiAtIHBhbi55KSAvIHpvb21cbiAgICB9O1xuICAgIGIudyA9IGIueDIgLSBiLngxO1xuICAgIGIuaCA9IGIueTIgLSBiLnkxO1xuICAgIHJldHVybiBiO1xuICB9LFxuICByZW5kZXJlZEV4dGVudDogZnVuY3Rpb24gcmVuZGVyZWRFeHRlbnQoKSB7XG4gICAgdmFyIHdpZHRoID0gdGhpcy53aWR0aCgpO1xuICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpO1xuICAgIHJldHVybiB7XG4gICAgICB4MTogMCxcbiAgICAgIHkxOiAwLFxuICAgICAgeDI6IHdpZHRoLFxuICAgICAgeTI6IGhlaWdodCxcbiAgICAgIHc6IHdpZHRoLFxuICAgICAgaDogaGVpZ2h0XG4gICAgfTtcbiAgfSxcbiAgbXVsdGlDbGlja0RlYm91bmNlVGltZTogZnVuY3Rpb24gbXVsdGlDbGlja0RlYm91bmNlVGltZShfaW50KSB7XG4gICAgaWYgKF9pbnQpIHRoaXMuX3ByaXZhdGUubXVsdGlDbGlja0RlYm91bmNlVGltZSA9IF9pbnQ7ZWxzZSByZXR1cm4gdGhpcy5fcHJpdmF0ZS5tdWx0aUNsaWNrRGVib3VuY2VUaW1lO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9XG59O1xuXG4vLyBhbGlhc2VzXG5jb3JlZm4kMS5jZW50cmUgPSBjb3JlZm4kMS5jZW50ZXI7XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5jb3JlZm4kMS5hdXRvbG9ja05vZGVzID0gY29yZWZuJDEuYXV0b2xvY2s7XG5jb3JlZm4kMS5hdXRvdW5ncmFiaWZ5Tm9kZXMgPSBjb3JlZm4kMS5hdXRvdW5ncmFiaWZ5O1xuXG52YXIgZm4gPSB7XG4gIGRhdGE6IGRlZmluZS5kYXRhKHtcbiAgICBmaWVsZDogJ2RhdGEnLFxuICAgIGJpbmRpbmdFdmVudDogJ2RhdGEnLFxuICAgIGFsbG93QmluZGluZzogdHJ1ZSxcbiAgICBhbGxvd1NldHRpbmc6IHRydWUsXG4gICAgc2V0dGluZ0V2ZW50OiAnZGF0YScsXG4gICAgc2V0dGluZ1RyaWdnZXJzRXZlbnQ6IHRydWUsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIGFsbG93R2V0dGluZzogdHJ1ZSxcbiAgICB1cGRhdGVTdHlsZTogdHJ1ZVxuICB9KSxcbiAgcmVtb3ZlRGF0YTogZGVmaW5lLnJlbW92ZURhdGEoe1xuICAgIGZpZWxkOiAnZGF0YScsXG4gICAgZXZlbnQ6ICdkYXRhJyxcbiAgICB0cmlnZ2VyRm5OYW1lOiAndHJpZ2dlcicsXG4gICAgdHJpZ2dlckV2ZW50OiB0cnVlLFxuICAgIHVwZGF0ZVN0eWxlOiB0cnVlXG4gIH0pLFxuICBzY3JhdGNoOiBkZWZpbmUuZGF0YSh7XG4gICAgZmllbGQ6ICdzY3JhdGNoJyxcbiAgICBiaW5kaW5nRXZlbnQ6ICdzY3JhdGNoJyxcbiAgICBhbGxvd0JpbmRpbmc6IHRydWUsXG4gICAgYWxsb3dTZXR0aW5nOiB0cnVlLFxuICAgIHNldHRpbmdFdmVudDogJ3NjcmF0Y2gnLFxuICAgIHNldHRpbmdUcmlnZ2Vyc0V2ZW50OiB0cnVlLFxuICAgIHRyaWdnZXJGbk5hbWU6ICd0cmlnZ2VyJyxcbiAgICBhbGxvd0dldHRpbmc6IHRydWUsXG4gICAgdXBkYXRlU3R5bGU6IHRydWVcbiAgfSksXG4gIHJlbW92ZVNjcmF0Y2g6IGRlZmluZS5yZW1vdmVEYXRhKHtcbiAgICBmaWVsZDogJ3NjcmF0Y2gnLFxuICAgIGV2ZW50OiAnc2NyYXRjaCcsXG4gICAgdHJpZ2dlckZuTmFtZTogJ3RyaWdnZXInLFxuICAgIHRyaWdnZXJFdmVudDogdHJ1ZSxcbiAgICB1cGRhdGVTdHlsZTogdHJ1ZVxuICB9KVxufTtcblxuLy8gYWxpYXNlc1xuZm4uYXR0ciA9IGZuLmRhdGE7XG5mbi5yZW1vdmVBdHRyID0gZm4ucmVtb3ZlRGF0YTtcblxudmFyIENvcmUgPSBmdW5jdGlvbiBDb3JlKG9wdHMpIHtcbiAgdmFyIGN5ID0gdGhpcztcbiAgb3B0cyA9IGV4dGVuZCh7fSwgb3B0cyk7XG4gIHZhciBjb250YWluZXIgPSBvcHRzLmNvbnRhaW5lcjtcblxuICAvLyBhbGxvdyBmb3IgcGFzc2luZyBhIHdyYXBwZWQganF1ZXJ5IG9iamVjdFxuICAvLyBlLmcuIGN5dG9zY2FwZSh7IGNvbnRhaW5lcjogJCgnI2N5JykgfSlcbiAgaWYgKGNvbnRhaW5lciAmJiAhaHRtbEVsZW1lbnQoY29udGFpbmVyKSAmJiBodG1sRWxlbWVudChjb250YWluZXJbMF0pKSB7XG4gICAgY29udGFpbmVyID0gY29udGFpbmVyWzBdO1xuICB9XG4gIHZhciByZWcgPSBjb250YWluZXIgPyBjb250YWluZXIuX2N5cmVnIDogbnVsbDsgLy8gZS5nLiBhbHJlYWR5IHJlZ2lzdGVyZWQgc29tZSBpbmZvIChlLmcuIHJlYWRpZXMpIHZpYSBqcXVlcnlcbiAgcmVnID0gcmVnIHx8IHt9O1xuICBpZiAocmVnICYmIHJlZy5jeSkge1xuICAgIHJlZy5jeS5kZXN0cm95KCk7XG4gICAgcmVnID0ge307IC8vIG9sZCBpbnN0YW5jZSA9PiByZXBsYWNlIHJlZyBjb21wbGV0ZWx5XG4gIH1cblxuICB2YXIgcmVhZGllcyA9IHJlZy5yZWFkaWVzID0gcmVnLnJlYWRpZXMgfHwgW107XG4gIGlmIChjb250YWluZXIpIHtcbiAgICBjb250YWluZXIuX2N5cmVnID0gcmVnO1xuICB9IC8vIG1ha2Ugc3VyZSBjb250YWluZXIgYXNzb2MnZCByZWcgcG9pbnRzIHRvIHRoaXMgY3lcbiAgcmVnLmN5ID0gY3k7XG4gIHZhciBoZWFkID0gX3dpbmRvdyAhPT0gdW5kZWZpbmVkICYmIGNvbnRhaW5lciAhPT0gdW5kZWZpbmVkICYmICFvcHRzLmhlYWRsZXNzO1xuICB2YXIgb3B0aW9ucyA9IG9wdHM7XG4gIG9wdGlvbnMubGF5b3V0ID0gZXh0ZW5kKHtcbiAgICBuYW1lOiBoZWFkID8gJ2dyaWQnIDogJ251bGwnXG4gIH0sIG9wdGlvbnMubGF5b3V0KTtcbiAgb3B0aW9ucy5yZW5kZXJlciA9IGV4dGVuZCh7XG4gICAgbmFtZTogaGVhZCA/ICdjYW52YXMnIDogJ251bGwnXG4gIH0sIG9wdGlvbnMucmVuZGVyZXIpO1xuICB2YXIgZGVmVmFsID0gZnVuY3Rpb24gZGVmVmFsKGRlZiwgdmFsLCBhbHRWYWwpIHtcbiAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfSBlbHNlIGlmIChhbHRWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGFsdFZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRlZjtcbiAgICB9XG4gIH07XG4gIHZhciBfcCA9IHRoaXMuX3ByaXZhdGUgPSB7XG4gICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgLy8gaHRtbCBkb20gZWxlIGNvbnRhaW5lclxuICAgIHJlYWR5OiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIHJlYWR5IGhhcyBiZWVuIHRyaWdnZXJlZFxuICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgLy8gY2FjaGVkIG9wdGlvbnNcbiAgICBlbGVtZW50czogbmV3IENvbGxlY3Rpb24odGhpcyksXG4gICAgLy8gZWxlbWVudHMgaW4gdGhlIGdyYXBoXG4gICAgbGlzdGVuZXJzOiBbXSxcbiAgICAvLyBsaXN0IG9mIGxpc3RlbmVyc1xuICAgIGFuaUVsZXM6IG5ldyBDb2xsZWN0aW9uKHRoaXMpLFxuICAgIC8vIGVsZW1lbnRzIGJlaW5nIGFuaW1hdGVkXG4gICAgZGF0YTogb3B0aW9ucy5kYXRhIHx8IHt9LFxuICAgIC8vIGRhdGEgZm9yIHRoZSBjb3JlXG4gICAgc2NyYXRjaDoge30sXG4gICAgLy8gc2NyYXRjaCBvYmplY3QgZm9yIGNvcmVcbiAgICBsYXlvdXQ6IG51bGwsXG4gICAgcmVuZGVyZXI6IG51bGwsXG4gICAgZGVzdHJveWVkOiBmYWxzZSxcbiAgICAvLyB3aGV0aGVyIGRlc3Ryb3kgd2FzIGNhbGxlZFxuICAgIG5vdGlmaWNhdGlvbnNFbmFibGVkOiB0cnVlLFxuICAgIC8vIHdoZXRoZXIgbm90aWZpY2F0aW9ucyBhcmUgc2VudCB0byB0aGUgcmVuZGVyZXJcbiAgICBtaW5ab29tOiAxZS01MCxcbiAgICBtYXhab29tOiAxZTUwLFxuICAgIHpvb21pbmdFbmFibGVkOiBkZWZWYWwodHJ1ZSwgb3B0aW9ucy56b29taW5nRW5hYmxlZCksXG4gICAgdXNlclpvb21pbmdFbmFibGVkOiBkZWZWYWwodHJ1ZSwgb3B0aW9ucy51c2VyWm9vbWluZ0VuYWJsZWQpLFxuICAgIHBhbm5pbmdFbmFibGVkOiBkZWZWYWwodHJ1ZSwgb3B0aW9ucy5wYW5uaW5nRW5hYmxlZCksXG4gICAgdXNlclBhbm5pbmdFbmFibGVkOiBkZWZWYWwodHJ1ZSwgb3B0aW9ucy51c2VyUGFubmluZ0VuYWJsZWQpLFxuICAgIGJveFNlbGVjdGlvbkVuYWJsZWQ6IGRlZlZhbCh0cnVlLCBvcHRpb25zLmJveFNlbGVjdGlvbkVuYWJsZWQpLFxuICAgIGF1dG9sb2NrOiBkZWZWYWwoZmFsc2UsIG9wdGlvbnMuYXV0b2xvY2ssIG9wdGlvbnMuYXV0b2xvY2tOb2RlcyksXG4gICAgYXV0b3VuZ3JhYmlmeTogZGVmVmFsKGZhbHNlLCBvcHRpb25zLmF1dG91bmdyYWJpZnksIG9wdGlvbnMuYXV0b3VuZ3JhYmlmeU5vZGVzKSxcbiAgICBhdXRvdW5zZWxlY3RpZnk6IGRlZlZhbChmYWxzZSwgb3B0aW9ucy5hdXRvdW5zZWxlY3RpZnkpLFxuICAgIHN0eWxlRW5hYmxlZDogb3B0aW9ucy5zdHlsZUVuYWJsZWQgPT09IHVuZGVmaW5lZCA/IGhlYWQgOiBvcHRpb25zLnN0eWxlRW5hYmxlZCxcbiAgICB6b29tOiBudW1iZXIkMShvcHRpb25zLnpvb20pID8gb3B0aW9ucy56b29tIDogMSxcbiAgICBwYW46IHtcbiAgICAgIHg6IHBsYWluT2JqZWN0KG9wdGlvbnMucGFuKSAmJiBudW1iZXIkMShvcHRpb25zLnBhbi54KSA/IG9wdGlvbnMucGFuLnggOiAwLFxuICAgICAgeTogcGxhaW5PYmplY3Qob3B0aW9ucy5wYW4pICYmIG51bWJlciQxKG9wdGlvbnMucGFuLnkpID8gb3B0aW9ucy5wYW4ueSA6IDBcbiAgICB9LFxuICAgIGFuaW1hdGlvbjoge1xuICAgICAgLy8gb2JqZWN0IGZvciBjdXJyZW50bHktcnVubmluZyBhbmltYXRpb25zXG4gICAgICBjdXJyZW50OiBbXSxcbiAgICAgIHF1ZXVlOiBbXVxuICAgIH0sXG4gICAgaGFzQ29tcG91bmROb2RlczogZmFsc2UsXG4gICAgbXVsdGlDbGlja0RlYm91bmNlVGltZTogZGVmVmFsKDI1MCwgb3B0aW9ucy5tdWx0aUNsaWNrRGVib3VuY2VUaW1lKVxuICB9O1xuICB0aGlzLmNyZWF0ZUVtaXR0ZXIoKTtcblxuICAvLyBzZXQgc2VsZWN0aW9uIHR5cGVcbiAgdGhpcy5zZWxlY3Rpb25UeXBlKG9wdGlvbnMuc2VsZWN0aW9uVHlwZSk7XG5cbiAgLy8gaW5pdCB6b29tIGJvdW5kc1xuICB0aGlzLnpvb21SYW5nZSh7XG4gICAgbWluOiBvcHRpb25zLm1pblpvb20sXG4gICAgbWF4OiBvcHRpb25zLm1heFpvb21cbiAgfSk7XG4gIHZhciBsb2FkRXh0RGF0YSA9IGZ1bmN0aW9uIGxvYWRFeHREYXRhKGV4dERhdGEsIG5leHQpIHtcbiAgICB2YXIgYW55SXNQcm9taXNlID0gZXh0RGF0YS5zb21lKHByb21pc2UpO1xuICAgIGlmIChhbnlJc1Byb21pc2UpIHtcbiAgICAgIHJldHVybiBQcm9taXNlJDEuYWxsKGV4dERhdGEpLnRoZW4obmV4dCk7IC8vIGxvYWQgYWxsIGRhdGEgYXN5bmNocm9ub3VzbHksIHRoZW4gZXhlYyByZXN0IG9mIGluaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dChleHREYXRhKTsgLy8gZXhlYyBzeW5jaHJvbm91c2x5IGZvciBjb252ZW5pZW5jZVxuICAgIH1cbiAgfTtcblxuICAvLyBzdGFydCB3aXRoIHRoZSBkZWZhdWx0IHN0eWxlc2hlZXQgc28gd2UgaGF2ZSBzb21ldGhpbmcgYmVmb3JlIGxvYWRpbmcgYW4gZXh0ZXJuYWwgc3R5bGVzaGVldFxuICBpZiAoX3Auc3R5bGVFbmFibGVkKSB7XG4gICAgY3kuc2V0U3R5bGUoW10pO1xuICB9XG5cbiAgLy8gY3JlYXRlIHRoZSByZW5kZXJlclxuICB2YXIgcmVuZGVyZXJPcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zLCBvcHRpb25zLnJlbmRlcmVyKTsgLy8gYWxsb3cgcmVuZGVyaW5nIGhpbnRzIGluIHRvcCBsZXZlbCBvcHRpb25zXG4gIGN5LmluaXRSZW5kZXJlcihyZW5kZXJlck9wdGlvbnMpO1xuICB2YXIgc2V0RWxlc0FuZExheW91dCA9IGZ1bmN0aW9uIHNldEVsZXNBbmRMYXlvdXQoZWxlbWVudHMsIG9ubG9hZCwgb25kb25lKSB7XG4gICAgY3kubm90aWZpY2F0aW9ucyhmYWxzZSk7XG5cbiAgICAvLyByZW1vdmUgb2xkIGVsZW1lbnRzXG4gICAgdmFyIG9sZEVsZXMgPSBjeS5tdXRhYmxlRWxlbWVudHMoKTtcbiAgICBpZiAob2xkRWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBvbGRFbGVzLnJlbW92ZSgpO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudHMgIT0gbnVsbCkge1xuICAgICAgaWYgKHBsYWluT2JqZWN0KGVsZW1lbnRzKSB8fCBhcnJheShlbGVtZW50cykpIHtcbiAgICAgICAgY3kuYWRkKGVsZW1lbnRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY3kub25lKCdsYXlvdXRyZWFkeScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBjeS5ub3RpZmljYXRpb25zKHRydWUpO1xuICAgICAgY3kuZW1pdChlKTsgLy8gd2UgbWlzc2VkIHRoaXMgZXZlbnQgYnkgdHVybmluZyBub3RpZmljYXRpb25zIG9mZiwgc28gcGFzcyBpdCBvblxuXG4gICAgICBjeS5vbmUoJ2xvYWQnLCBvbmxvYWQpO1xuICAgICAgY3kuZW1pdEFuZE5vdGlmeSgnbG9hZCcpO1xuICAgIH0pLm9uZSgnbGF5b3V0c3RvcCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGN5Lm9uZSgnZG9uZScsIG9uZG9uZSk7XG4gICAgICBjeS5lbWl0KCdkb25lJyk7XG4gICAgfSk7XG4gICAgdmFyIGxheW91dE9wdHMgPSBleHRlbmQoe30sIGN5Ll9wcml2YXRlLm9wdGlvbnMubGF5b3V0KTtcbiAgICBsYXlvdXRPcHRzLmVsZXMgPSBjeS5lbGVtZW50cygpO1xuICAgIGN5LmxheW91dChsYXlvdXRPcHRzKS5ydW4oKTtcbiAgfTtcbiAgbG9hZEV4dERhdGEoW29wdGlvbnMuc3R5bGUsIG9wdGlvbnMuZWxlbWVudHNdLCBmdW5jdGlvbiAodGhlbnMpIHtcbiAgICB2YXIgaW5pdFN0eWxlID0gdGhlbnNbMF07XG4gICAgdmFyIGluaXRFbGVzID0gdGhlbnNbMV07XG5cbiAgICAvLyBpbml0IHN0eWxlXG4gICAgaWYgKF9wLnN0eWxlRW5hYmxlZCkge1xuICAgICAgY3kuc3R5bGUoKS5hcHBlbmQoaW5pdFN0eWxlKTtcbiAgICB9XG5cbiAgICAvLyBpbml0aWFsIGxvYWRcbiAgICBzZXRFbGVzQW5kTGF5b3V0KGluaXRFbGVzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBvbnJlYWR5XG4gICAgICBjeS5zdGFydEFuaW1hdGlvbkxvb3AoKTtcbiAgICAgIF9wLnJlYWR5ID0gdHJ1ZTtcblxuICAgICAgLy8gaWYgYSByZWFkeSBjYWxsYmFjayBpcyBzcGVjaWZpZWQgYXMgYW4gb3B0aW9uLCB0aGUgYmluZCBpdFxuICAgICAgaWYgKGZuJDYob3B0aW9ucy5yZWFkeSkpIHtcbiAgICAgICAgY3kub24oJ3JlYWR5Jywgb3B0aW9ucy5yZWFkeSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGJpbmQgYWxsIHRoZSByZWFkeSBoYW5kbGVycyByZWdpc3RlcmVkIGJlZm9yZSBjcmVhdGluZyB0aGlzIGluc3RhbmNlXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlYWRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZuID0gcmVhZGllc1tpXTtcbiAgICAgICAgY3kub24oJ3JlYWR5JywgZm4pO1xuICAgICAgfVxuICAgICAgaWYgKHJlZykge1xuICAgICAgICByZWcucmVhZGllcyA9IFtdO1xuICAgICAgfSAvLyBjbGVhciBiL2Mgd2UndmUgYm91bmQgdGhlbSBhbGwgYW5kIGRvbid0IHdhbnQgdG8ga2VlcCBpdCBhcm91bmQgaW4gY2FzZSBhIG5ldyBjb3JlIHVzZXMgdGhlIHNhbWUgZGl2IGV0Y1xuXG4gICAgICBjeS5lbWl0KCdyZWFkeScpO1xuICAgIH0sIG9wdGlvbnMuZG9uZSk7XG4gIH0pO1xufTtcbnZhciBjb3JlZm4gPSBDb3JlLnByb3RvdHlwZTsgLy8gc2hvcnQgYWxpYXNcblxuZXh0ZW5kKGNvcmVmbiwge1xuICBpbnN0YW5jZVN0cmluZzogZnVuY3Rpb24gaW5zdGFuY2VTdHJpbmcoKSB7XG4gICAgcmV0dXJuICdjb3JlJztcbiAgfSxcbiAgaXNSZWFkeTogZnVuY3Rpb24gaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5yZWFkeTtcbiAgfSxcbiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZGVzdHJveWVkO1xuICB9LFxuICByZWFkeTogZnVuY3Rpb24gcmVhZHkoZm4pIHtcbiAgICBpZiAodGhpcy5pc1JlYWR5KCkpIHtcbiAgICAgIHRoaXMuZW1pdHRlcigpLmVtaXQoJ3JlYWR5JywgW10sIGZuKTsgLy8ganVzdCBjYWxscyBmbiBhcyB0aG91Z2ggdHJpZ2dlcmVkIHZpYSByZWFkeSBldmVudFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uKCdyZWFkeScsIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICBpZiAoY3kuZGVzdHJveWVkKCkpIHJldHVybjtcbiAgICBjeS5zdG9wQW5pbWF0aW9uTG9vcCgpO1xuICAgIGN5LmRlc3Ryb3lSZW5kZXJlcigpO1xuICAgIHRoaXMuZW1pdCgnZGVzdHJveScpO1xuICAgIGN5Ll9wcml2YXRlLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgcmV0dXJuIGN5O1xuICB9LFxuICBoYXNFbGVtZW50V2l0aElkOiBmdW5jdGlvbiBoYXNFbGVtZW50V2l0aElkKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUuZWxlbWVudHMuaGFzRWxlbWVudFdpdGhJZChpZCk7XG4gIH0sXG4gIGdldEVsZW1lbnRCeUlkOiBmdW5jdGlvbiBnZXRFbGVtZW50QnlJZChpZCkge1xuICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmVsZW1lbnRzLmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgfSxcbiAgaGFzQ29tcG91bmROb2RlczogZnVuY3Rpb24gaGFzQ29tcG91bmROb2RlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5oYXNDb21wb3VuZE5vZGVzO1xuICB9LFxuICBoZWFkbGVzczogZnVuY3Rpb24gaGVhZGxlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByaXZhdGUucmVuZGVyZXIuaXNIZWFkbGVzcygpO1xuICB9LFxuICBzdHlsZUVuYWJsZWQ6IGZ1bmN0aW9uIHN0eWxlRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5zdHlsZUVuYWJsZWQ7XG4gIH0sXG4gIGFkZFRvUG9vbDogZnVuY3Rpb24gYWRkVG9Qb29sKGVsZXMpIHtcbiAgICB0aGlzLl9wcml2YXRlLmVsZW1lbnRzLm1lcmdlKGVsZXMpO1xuICAgIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xuICB9LFxuXG4gIHJlbW92ZUZyb21Qb29sOiBmdW5jdGlvbiByZW1vdmVGcm9tUG9vbChlbGVzKSB7XG4gICAgdGhpcy5fcHJpdmF0ZS5lbGVtZW50cy51bm1lcmdlKGVsZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjb250YWluZXI6IGZ1bmN0aW9uIGNvbnRhaW5lcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5jb250YWluZXIgfHwgbnVsbDtcbiAgfSxcbiAgd2luZG93OiBmdW5jdGlvbiB3aW5kb3coKSB7XG4gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuX3ByaXZhdGUuY29udGFpbmVyO1xuICAgIGlmIChjb250YWluZXIgPT0gbnVsbCkgcmV0dXJuIF93aW5kb3c7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSB0aGlzLl9wcml2YXRlLmNvbnRhaW5lci5vd25lckRvY3VtZW50O1xuICAgIGlmIChvd25lckRvY3VtZW50ID09PSB1bmRlZmluZWQgfHwgb3duZXJEb2N1bWVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gX3dpbmRvdztcbiAgICB9XG4gICAgcmV0dXJuIG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgX3dpbmRvdztcbiAgfSxcbiAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KGNvbnRhaW5lcikge1xuICAgIGlmIChjb250YWluZXIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgY3kgPSB0aGlzO1xuICAgIHZhciBfcCA9IGN5Ll9wcml2YXRlO1xuICAgIHZhciBvcHRpb25zID0gX3Aub3B0aW9ucztcbiAgICBpZiAoIWh0bWxFbGVtZW50KGNvbnRhaW5lcikgJiYgaHRtbEVsZW1lbnQoY29udGFpbmVyWzBdKSkge1xuICAgICAgY29udGFpbmVyID0gY29udGFpbmVyWzBdO1xuICAgIH1cbiAgICBjeS5zdG9wQW5pbWF0aW9uTG9vcCgpO1xuICAgIGN5LmRlc3Ryb3lSZW5kZXJlcigpO1xuICAgIF9wLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICBfcC5zdHlsZUVuYWJsZWQgPSB0cnVlO1xuICAgIGN5LmludmFsaWRhdGVTaXplKCk7XG4gICAgY3kuaW5pdFJlbmRlcmVyKGV4dGVuZCh7fSwgb3B0aW9ucywgb3B0aW9ucy5yZW5kZXJlciwge1xuICAgICAgLy8gYWxsb3cgY3VzdG9tIHJlbmRlcmVyIG5hbWUgdG8gYmUgcmUtdXNlZCwgb3RoZXJ3aXNlIHVzZSBjYW52YXNcbiAgICAgIG5hbWU6IG9wdGlvbnMucmVuZGVyZXIubmFtZSA9PT0gJ251bGwnID8gJ2NhbnZhcycgOiBvcHRpb25zLnJlbmRlcmVyLm5hbWVcbiAgICB9KSk7XG4gICAgY3kuc3RhcnRBbmltYXRpb25Mb29wKCk7XG4gICAgY3kuc3R5bGUob3B0aW9ucy5zdHlsZSk7XG4gICAgY3kuZW1pdCgnbW91bnQnKTtcbiAgICByZXR1cm4gY3k7XG4gIH0sXG4gIHVubW91bnQ6IGZ1bmN0aW9uIHVubW91bnQoKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICBjeS5zdG9wQW5pbWF0aW9uTG9vcCgpO1xuICAgIGN5LmRlc3Ryb3lSZW5kZXJlcigpO1xuICAgIGN5LmluaXRSZW5kZXJlcih7XG4gICAgICBuYW1lOiAnbnVsbCdcbiAgICB9KTtcbiAgICBjeS5lbWl0KCd1bm1vdW50Jyk7XG4gICAgcmV0dXJuIGN5O1xuICB9LFxuICBvcHRpb25zOiBmdW5jdGlvbiBvcHRpb25zKCkge1xuICAgIHJldHVybiBjb3B5KHRoaXMuX3ByaXZhdGUub3B0aW9ucyk7XG4gIH0sXG4gIGpzb246IGZ1bmN0aW9uIGpzb24ob2JqKSB7XG4gICAgdmFyIGN5ID0gdGhpcztcbiAgICB2YXIgX3AgPSBjeS5fcHJpdmF0ZTtcbiAgICB2YXIgZWxlcyA9IGN5Lm11dGFibGVFbGVtZW50cygpO1xuICAgIHZhciBnZXRGcmVzaFJlZiA9IGZ1bmN0aW9uIGdldEZyZXNoUmVmKGVsZSkge1xuICAgICAgcmV0dXJuIGN5LmdldEVsZW1lbnRCeUlkKGVsZS5pZCgpKTtcbiAgICB9O1xuICAgIGlmIChwbGFpbk9iamVjdChvYmopKSB7XG4gICAgICAvLyBzZXRcblxuICAgICAgY3kuc3RhcnRCYXRjaCgpO1xuICAgICAgaWYgKG9iai5lbGVtZW50cykge1xuICAgICAgICB2YXIgaWRJbkpzb24gPSB7fTtcbiAgICAgICAgdmFyIHVwZGF0ZUVsZXMgPSBmdW5jdGlvbiB1cGRhdGVFbGVzKGpzb25zLCBncikge1xuICAgICAgICAgIHZhciB0b0FkZCA9IFtdO1xuICAgICAgICAgIHZhciB0b01vZCA9IFtdO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwganNvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBqc29uID0ganNvbnNbaV07XG4gICAgICAgICAgICBpZiAoIWpzb24uZGF0YS5pZCkge1xuICAgICAgICAgICAgICB3YXJuKCdjeS5qc29uKCkgY2Fubm90IGhhbmRsZSBlbGVtZW50cyB3aXRob3V0IGFuIElEIGF0dHJpYnV0ZScpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBpZCA9ICcnICsganNvbi5kYXRhLmlkOyAvLyBpZCBtdXN0IGJlIHN0cmluZ1xuICAgICAgICAgICAgdmFyIGVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgICAgIGlkSW5Kc29uW2lkXSA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZWxlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAvLyBleGlzdGluZyBlbGVtZW50IHNob3VsZCBiZSB1cGRhdGVkXG4gICAgICAgICAgICAgIHRvTW9kLnB1c2goe1xuICAgICAgICAgICAgICAgIGVsZTogZWxlLFxuICAgICAgICAgICAgICAgIGpzb246IGpzb25cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBvdGhlcndpc2Ugc2hvdWxkIGJlIGFkZGVkXG4gICAgICAgICAgICAgIGlmIChncikge1xuICAgICAgICAgICAgICAgIGpzb24uZ3JvdXAgPSBncjtcbiAgICAgICAgICAgICAgICB0b0FkZC5wdXNoKGpzb24pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRvQWRkLnB1c2goanNvbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY3kuYWRkKHRvQWRkKTtcbiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdG9Nb2QubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgX3RvTW9kJF9pID0gdG9Nb2RbX2ldLFxuICAgICAgICAgICAgICBfZWxlID0gX3RvTW9kJF9pLmVsZSxcbiAgICAgICAgICAgICAgX2pzb24gPSBfdG9Nb2QkX2kuanNvbjtcbiAgICAgICAgICAgIF9lbGUuanNvbihfanNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoYXJyYXkob2JqLmVsZW1lbnRzKSkge1xuICAgICAgICAgIC8vIGVsZW1lbnRzOiBbXVxuICAgICAgICAgIHVwZGF0ZUVsZXMob2JqLmVsZW1lbnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBlbGVtZW50czogeyBub2RlczogW10sIGVkZ2VzOiBbXSB9XG4gICAgICAgICAgdmFyIGdycyA9IFsnbm9kZXMnLCAnZWRnZXMnXTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGdyID0gZ3JzW2ldO1xuICAgICAgICAgICAgdmFyIGVsZW1lbnRzID0gb2JqLmVsZW1lbnRzW2dyXTtcbiAgICAgICAgICAgIGlmIChhcnJheShlbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgdXBkYXRlRWxlcyhlbGVtZW50cywgZ3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50c1RvUmVtb3ZlID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICBlbGVzLmZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgcmV0dXJuICFpZEluSnNvbltlbGUuaWQoKV07XG4gICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgIGlmIChlbGUuaXNQYXJlbnQoKSkge1xuICAgICAgICAgICAgcGFyZW50c1RvUmVtb3ZlLm1lcmdlKGVsZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZS5yZW1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHNvIHRoYXQgY2hpbGRyZW4gYXJlIG5vdCByZW1vdmVkIHcvcGFyZW50XG4gICAgICAgIHBhcmVudHNUb1JlbW92ZS5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlLmNoaWxkcmVuKCkubW92ZSh7XG4gICAgICAgICAgICBwYXJlbnQ6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gaW50ZXJtZWRpYXRlIHBhcmVudHMgbWF5IGJlIG1vdmVkIGJ5IHByaW9yIGxpbmUsIHNvIG1ha2Ugc3VyZSB3ZSByZW1vdmUgYnkgZnJlc2ggcmVmc1xuICAgICAgICBwYXJlbnRzVG9SZW1vdmUuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGdldEZyZXNoUmVmKGVsZSkucmVtb3ZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKG9iai5zdHlsZSkge1xuICAgICAgICBjeS5zdHlsZShvYmouc3R5bGUpO1xuICAgICAgfVxuICAgICAgaWYgKG9iai56b29tICE9IG51bGwgJiYgb2JqLnpvb20gIT09IF9wLnpvb20pIHtcbiAgICAgICAgY3kuem9vbShvYmouem9vbSk7XG4gICAgICB9XG4gICAgICBpZiAob2JqLnBhbikge1xuICAgICAgICBpZiAob2JqLnBhbi54ICE9PSBfcC5wYW4ueCB8fCBvYmoucGFuLnkgIT09IF9wLnBhbi55KSB7XG4gICAgICAgICAgY3kucGFuKG9iai5wYW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob2JqLmRhdGEpIHtcbiAgICAgICAgY3kuZGF0YShvYmouZGF0YSk7XG4gICAgICB9XG4gICAgICB2YXIgZmllbGRzID0gWydtaW5ab29tJywgJ21heFpvb20nLCAnem9vbWluZ0VuYWJsZWQnLCAndXNlclpvb21pbmdFbmFibGVkJywgJ3Bhbm5pbmdFbmFibGVkJywgJ3VzZXJQYW5uaW5nRW5hYmxlZCcsICdib3hTZWxlY3Rpb25FbmFibGVkJywgJ2F1dG9sb2NrJywgJ2F1dG91bmdyYWJpZnknLCAnYXV0b3Vuc2VsZWN0aWZ5JywgJ211bHRpQ2xpY2tEZWJvdW5jZVRpbWUnXTtcbiAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IGZpZWxkcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgIHZhciBmID0gZmllbGRzW19pMl07XG4gICAgICAgIGlmIChvYmpbZl0gIT0gbnVsbCkge1xuICAgICAgICAgIGN5W2ZdKG9ialtmXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN5LmVuZEJhdGNoKCk7XG4gICAgICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZ2V0XG4gICAgICB2YXIgZmxhdCA9ICEhb2JqO1xuICAgICAgdmFyIGpzb24gPSB7fTtcbiAgICAgIGlmIChmbGF0KSB7XG4gICAgICAgIGpzb24uZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzKCkubWFwKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlLmpzb24oKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uLmVsZW1lbnRzID0ge307XG4gICAgICAgIGVsZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgdmFyIGdyb3VwID0gZWxlLmdyb3VwKCk7XG4gICAgICAgICAgaWYgKCFqc29uLmVsZW1lbnRzW2dyb3VwXSkge1xuICAgICAgICAgICAganNvbi5lbGVtZW50c1tncm91cF0gPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAganNvbi5lbGVtZW50c1tncm91cF0ucHVzaChlbGUuanNvbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fcHJpdmF0ZS5zdHlsZUVuYWJsZWQpIHtcbiAgICAgICAganNvbi5zdHlsZSA9IGN5LnN0eWxlKCkuanNvbigpO1xuICAgICAgfVxuICAgICAganNvbi5kYXRhID0gY29weShjeS5kYXRhKCkpO1xuICAgICAgdmFyIG9wdGlvbnMgPSBfcC5vcHRpb25zO1xuICAgICAganNvbi56b29taW5nRW5hYmxlZCA9IF9wLnpvb21pbmdFbmFibGVkO1xuICAgICAganNvbi51c2VyWm9vbWluZ0VuYWJsZWQgPSBfcC51c2VyWm9vbWluZ0VuYWJsZWQ7XG4gICAgICBqc29uLnpvb20gPSBfcC56b29tO1xuICAgICAganNvbi5taW5ab29tID0gX3AubWluWm9vbTtcbiAgICAgIGpzb24ubWF4Wm9vbSA9IF9wLm1heFpvb207XG4gICAgICBqc29uLnBhbm5pbmdFbmFibGVkID0gX3AucGFubmluZ0VuYWJsZWQ7XG4gICAgICBqc29uLnVzZXJQYW5uaW5nRW5hYmxlZCA9IF9wLnVzZXJQYW5uaW5nRW5hYmxlZDtcbiAgICAgIGpzb24ucGFuID0gY29weShfcC5wYW4pO1xuICAgICAganNvbi5ib3hTZWxlY3Rpb25FbmFibGVkID0gX3AuYm94U2VsZWN0aW9uRW5hYmxlZDtcbiAgICAgIGpzb24ucmVuZGVyZXIgPSBjb3B5KG9wdGlvbnMucmVuZGVyZXIpO1xuICAgICAganNvbi5oaWRlRWRnZXNPblZpZXdwb3J0ID0gb3B0aW9ucy5oaWRlRWRnZXNPblZpZXdwb3J0O1xuICAgICAganNvbi50ZXh0dXJlT25WaWV3cG9ydCA9IG9wdGlvbnMudGV4dHVyZU9uVmlld3BvcnQ7XG4gICAgICBqc29uLndoZWVsU2Vuc2l0aXZpdHkgPSBvcHRpb25zLndoZWVsU2Vuc2l0aXZpdHk7XG4gICAgICBqc29uLm1vdGlvbkJsdXIgPSBvcHRpb25zLm1vdGlvbkJsdXI7XG4gICAgICBqc29uLm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUgPSBvcHRpb25zLm11bHRpQ2xpY2tEZWJvdW5jZVRpbWU7XG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gIH1cbn0pO1xuY29yZWZuLiRpZCA9IGNvcmVmbi5nZXRFbGVtZW50QnlJZDtcbltjb3JlZm4kOSwgY29yZWZuJDgsIGVsZXNmbiwgY29yZWZuJDcsIGNvcmVmbiQ2LCBjb3JlZm4kNSwgY29yZWZuJDQsIGNvcmVmbiQzLCBjb3JlZm4kMiwgY29yZWZuJDEsIGZuXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoY29yZWZuLCBwcm9wcyk7XG59KTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBkZWZhdWx0cyQ3ID0ge1xuICBmaXQ6IHRydWUsXG4gIC8vIHdoZXRoZXIgdG8gZml0IHRoZSB2aWV3cG9ydCB0byB0aGUgZ3JhcGhcbiAgZGlyZWN0ZWQ6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRoZSB0cmVlIGlzIGRpcmVjdGVkIGRvd253YXJkcyAob3IgZWRnZXMgY2FuIHBvaW50IGluIGFueSBkaXJlY3Rpb24gaWYgZmFsc2UpXG4gIHBhZGRpbmc6IDMwLFxuICAvLyBwYWRkaW5nIG9uIGZpdFxuICBjaXJjbGU6IGZhbHNlLFxuICAvLyBwdXQgZGVwdGhzIGluIGNvbmNlbnRyaWMgY2lyY2xlcyBpZiB0cnVlLCBwdXQgZGVwdGhzIHRvcCBkb3duIGlmIGZhbHNlXG4gIGdyaWQ6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIGNyZWF0ZSBhbiBldmVuIGdyaWQgaW50byB3aGljaCB0aGUgREFHIGlzIHBsYWNlZCAoY2lyY2xlOmZhbHNlIG9ubHkpXG4gIHNwYWNpbmdGYWN0b3I6IDEuNzUsXG4gIC8vIHBvc2l0aXZlIHNwYWNpbmcgZmFjdG9yLCBsYXJnZXIgPT4gbW9yZSBzcGFjZSBiZXR3ZWVuIG5vZGVzIChOLkIuIG4vYSBpZiBjYXVzZXMgb3ZlcmxhcClcbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIGF2b2lkT3ZlcmxhcDogdHJ1ZSxcbiAgLy8gcHJldmVudHMgbm9kZSBvdmVybGFwLCBtYXkgb3ZlcmZsb3cgYm91bmRpbmdCb3ggaWYgbm90IGVub3VnaCBzcGFjZVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxuICByb290czogdW5kZWZpbmVkLFxuICAvLyB0aGUgcm9vdHMgb2YgdGhlIHRyZWVzXG4gIGRlcHRoU29ydDogdW5kZWZpbmVkLFxuICAvLyBhIHNvcnRpbmcgZnVuY3Rpb24gdG8gb3JkZXIgbm9kZXMgYXQgZXF1YWwgZGVwdGguIGUuZy4gZnVuY3Rpb24oYSwgYil7IHJldHVybiBhLmRhdGEoJ3dlaWdodCcpIC0gYi5kYXRhKCd3ZWlnaHQnKSB9XG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWQsXG4gIGFuaW1hdGVGaWx0ZXI6IGZ1bmN0aW9uIGFuaW1hdGVGaWx0ZXIobm9kZSwgaSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyBhIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSBhbmltYXRlZC4gIEFsbCBub2RlcyBhbmltYXRlZCBieSBkZWZhdWx0IG9uIGFuaW1hdGUgZW5hYmxlZC4gIE5vbi1hbmltYXRlZCBub2RlcyBhcmUgcG9zaXRpb25lZCBpbW1lZGlhdGVseSB3aGVuIHRoZSBsYXlvdXQgc3RhcnRzXG4gIHJlYWR5OiB1bmRlZmluZWQsXG4gIC8vIGNhbGxiYWNrIG9uIGxheW91dHJlYWR5XG4gIHN0b3A6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0c3RvcFxuICB0cmFuc2Zvcm06IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlLCBwb3NpdGlvbikge1xuICAgIHJldHVybiBwb3NpdGlvbjtcbiAgfSAvLyB0cmFuc2Zvcm0gYSBnaXZlbiBub2RlIHBvc2l0aW9uLiBVc2VmdWwgZm9yIGNoYW5naW5nIGZsb3cgZGlyZWN0aW9uIGluIGRpc2NyZXRlIGxheW91dHNcbn07XG5cbnZhciBkZXByZWNhdGVkT3B0aW9uRGVmYXVsdHMgPSB7XG4gIG1heGltYWw6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHNoaWZ0IG5vZGVzIGRvd24gdGhlaXIgbmF0dXJhbCBCRlMgZGVwdGhzIGluIG9yZGVyIHRvIGF2b2lkIHVwd2FyZHMgZWRnZXMgKERBR1Mgb25seSk7IHNldHRpbmcgYWN5Y2xpYyB0byB0cnVlIHNldHMgbWF4aW1hbCB0byB0cnVlIGFsc29cbiAgYWN5Y2xpYzogZmFsc2UgLy8gd2hldGhlciB0aGUgdHJlZSBpcyBhY3ljbGljIGFuZCB0aHVzIGEgbm9kZSBjb3VsZCBiZSBzaGlmdGVkIChkdWUgdG8gdGhlIG1heGltYWwgb3B0aW9uKSBtdWx0aXBsZSB0aW1lcyB3aXRob3V0IGNhdXNpbmcgYW4gaW5maW5pdGUgbG9vcDsgc2V0dGluZyB0byB0cnVlIHNldHMgbWF4aW1hbCB0byB0cnVlIGFsc287IGlmIHlvdSBhcmUgdW5jZXJ0YWluIHdoZXRoZXIgYSB0cmVlIGlzIGFjeWNsaWMsIHNldCB0byBmYWxzZSB0byBhdm9pZCBwb3RlbnRpYWwgaW5maW5pdGUgbG9vcHNcbn07XG5cbi8qIGVzbGludC1lbmFibGUgKi9cblxudmFyIGdldEluZm8gPSBmdW5jdGlvbiBnZXRJbmZvKGVsZSkge1xuICByZXR1cm4gZWxlLnNjcmF0Y2goJ2JyZWFkdGhmaXJzdCcpO1xufTtcbnZhciBzZXRJbmZvID0gZnVuY3Rpb24gc2V0SW5mbyhlbGUsIG9iaikge1xuICByZXR1cm4gZWxlLnNjcmF0Y2goJ2JyZWFkdGhmaXJzdCcsIG9iaik7XG59O1xuZnVuY3Rpb24gQnJlYWR0aEZpcnN0TGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cyQ3LCBkZXByZWNhdGVkT3B0aW9uRGVmYXVsdHMsIG9wdGlvbnMpO1xufVxuQnJlYWR0aEZpcnN0TGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwYXJhbXMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBvcHRpb25zID0gcGFyYW1zO1xuICB2YXIgY3kgPSBwYXJhbXMuY3k7XG4gIHZhciBlbGVzID0gb3B0aW9ucy5lbGVzO1xuICB2YXIgbm9kZXMgPSBlbGVzLm5vZGVzKCkuZmlsdGVyKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuICFuLmlzUGFyZW50KCk7XG4gIH0pO1xuICB2YXIgZ3JhcGggPSBlbGVzO1xuICB2YXIgZGlyZWN0ZWQgPSBvcHRpb25zLmRpcmVjdGVkO1xuICB2YXIgbWF4aW1hbCA9IG9wdGlvbnMuYWN5Y2xpYyB8fCBvcHRpb25zLm1heGltYWwgfHwgb3B0aW9ucy5tYXhpbWFsQWRqdXN0bWVudHMgPiAwOyAvLyBtYXhpbWFsQWRqdXN0bWVudHMgZm9yIGNvbXBhdC4gdy8gb2xkIGNvZGU7IGFsc28sIHNldHRpbmcgYWN5Y2xpYyB0byB0cnVlIHNldHMgbWF4aW1hbCB0byB0cnVlXG5cbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG4gIHZhciByb290cztcbiAgaWYgKGVsZW1lbnRPckNvbGxlY3Rpb24ob3B0aW9ucy5yb290cykpIHtcbiAgICByb290cyA9IG9wdGlvbnMucm9vdHM7XG4gIH0gZWxzZSBpZiAoYXJyYXkob3B0aW9ucy5yb290cykpIHtcbiAgICB2YXIgcm9vdHNBcnJheSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0aW9ucy5yb290cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkID0gb3B0aW9ucy5yb290c1tpXTtcbiAgICAgIHZhciBlbGUgPSBjeS5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICByb290c0FycmF5LnB1c2goZWxlKTtcbiAgICB9XG4gICAgcm9vdHMgPSBjeS5jb2xsZWN0aW9uKHJvb3RzQXJyYXkpO1xuICB9IGVsc2UgaWYgKHN0cmluZyhvcHRpb25zLnJvb3RzKSkge1xuICAgIHJvb3RzID0gY3kuJChvcHRpb25zLnJvb3RzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoZGlyZWN0ZWQpIHtcbiAgICAgIHJvb3RzID0gbm9kZXMucm9vdHMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNvbXBvbmVudHMgPSBlbGVzLmNvbXBvbmVudHMoKTtcbiAgICAgIHJvb3RzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoX2kpIHtcbiAgICAgICAgdmFyIGNvbXAgPSBjb21wb25lbnRzW19pXTtcbiAgICAgICAgdmFyIG1heERlZ3JlZSA9IGNvbXAubWF4RGVncmVlKGZhbHNlKTtcbiAgICAgICAgdmFyIGNvbXBSb290cyA9IGNvbXAuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlLmRlZ3JlZShmYWxzZSkgPT09IG1heERlZ3JlZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJvb3RzID0gcm9vdHMuYWRkKGNvbXBSb290cyk7XG4gICAgICB9O1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIF9sb29wKF9pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIGRlcHRocyA9IFtdO1xuICB2YXIgZm91bmRCeUJmcyA9IHt9O1xuICB2YXIgYWRkVG9EZXB0aCA9IGZ1bmN0aW9uIGFkZFRvRGVwdGgoZWxlLCBkKSB7XG4gICAgaWYgKGRlcHRoc1tkXSA9PSBudWxsKSB7XG4gICAgICBkZXB0aHNbZF0gPSBbXTtcbiAgICB9XG4gICAgdmFyIGkgPSBkZXB0aHNbZF0ubGVuZ3RoO1xuICAgIGRlcHRoc1tkXS5wdXNoKGVsZSk7XG4gICAgc2V0SW5mbyhlbGUsIHtcbiAgICAgIGluZGV4OiBpLFxuICAgICAgZGVwdGg6IGRcbiAgICB9KTtcbiAgfTtcbiAgdmFyIGNoYW5nZURlcHRoID0gZnVuY3Rpb24gY2hhbmdlRGVwdGgoZWxlLCBuZXdEZXB0aCkge1xuICAgIHZhciBfZ2V0SW5mbyA9IGdldEluZm8oZWxlKSxcbiAgICAgIGRlcHRoID0gX2dldEluZm8uZGVwdGgsXG4gICAgICBpbmRleCA9IF9nZXRJbmZvLmluZGV4O1xuICAgIGRlcHRoc1tkZXB0aF1baW5kZXhdID0gbnVsbDtcbiAgICBhZGRUb0RlcHRoKGVsZSwgbmV3RGVwdGgpO1xuICB9O1xuXG4gIC8vIGZpbmQgdGhlIGRlcHRocyBvZiB0aGUgbm9kZXNcbiAgZ3JhcGguYmZzKHtcbiAgICByb290czogcm9vdHMsXG4gICAgZGlyZWN0ZWQ6IG9wdGlvbnMuZGlyZWN0ZWQsXG4gICAgdmlzaXQ6IGZ1bmN0aW9uIHZpc2l0KG5vZGUsIGVkZ2UsIHBOb2RlLCBpLCBkZXB0aCkge1xuICAgICAgdmFyIGVsZSA9IG5vZGVbMF07XG4gICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICAgIGFkZFRvRGVwdGgoZWxlLCBkZXB0aCk7XG4gICAgICBmb3VuZEJ5QmZzW2lkXSA9IHRydWU7XG4gICAgfVxuICB9KTtcblxuICAvLyBjaGVjayBmb3Igbm9kZXMgbm90IGZvdW5kIGJ5IGJmc1xuICB2YXIgb3JwaGFuTm9kZXMgPSBbXTtcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBfZWxlID0gbm9kZXNbX2kyXTtcbiAgICBpZiAoZm91bmRCeUJmc1tfZWxlLmlkKCldKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3JwaGFuTm9kZXMucHVzaChfZWxlKTtcbiAgICB9XG4gIH1cblxuICAvLyBhc3NpZ24gdGhlIG5vZGVzIGEgZGVwdGggYW5kIGluZGV4XG5cbiAgdmFyIGFzc2lnbkRlcHRoc0F0ID0gZnVuY3Rpb24gYXNzaWduRGVwdGhzQXQoaSkge1xuICAgIHZhciBlbGVzID0gZGVwdGhzW2ldO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWxlcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIF9lbGUyID0gZWxlc1tqXTtcbiAgICAgIGlmIChfZWxlMiA9PSBudWxsKSB7XG4gICAgICAgIGVsZXMuc3BsaWNlKGosIDEpO1xuICAgICAgICBqLS07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgc2V0SW5mbyhfZWxlMiwge1xuICAgICAgICBkZXB0aDogaSxcbiAgICAgICAgaW5kZXg6IGpcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgdmFyIGFzc2lnbkRlcHRocyA9IGZ1bmN0aW9uIGFzc2lnbkRlcHRocygpIHtcbiAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBkZXB0aHMubGVuZ3RoOyBfaTMrKykge1xuICAgICAgYXNzaWduRGVwdGhzQXQoX2kzKTtcbiAgICB9XG4gIH07XG4gIHZhciBhZGp1c3RNYXhpbWFsbHkgPSBmdW5jdGlvbiBhZGp1c3RNYXhpbWFsbHkoZWxlLCBzaGlmdGVkKSB7XG4gICAgdmFyIGVJbmZvID0gZ2V0SW5mbyhlbGUpO1xuICAgIHZhciBpbmNvbWVycyA9IGVsZS5pbmNvbWVycygpLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcbiAgICAgIHJldHVybiBlbC5pc05vZGUoKSAmJiBlbGVzLmhhcyhlbCk7XG4gICAgfSk7XG4gICAgdmFyIG1heERlcHRoID0gLTE7XG4gICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBpbmNvbWVycy5sZW5ndGg7IGsrKykge1xuICAgICAgdmFyIGluY21yID0gaW5jb21lcnNba107XG4gICAgICB2YXIgaUluZm8gPSBnZXRJbmZvKGluY21yKTtcbiAgICAgIG1heERlcHRoID0gTWF0aC5tYXgobWF4RGVwdGgsIGlJbmZvLmRlcHRoKTtcbiAgICB9XG4gICAgaWYgKGVJbmZvLmRlcHRoIDw9IG1heERlcHRoKSB7XG4gICAgICBpZiAoIW9wdGlvbnMuYWN5Y2xpYyAmJiBzaGlmdGVkW2lkXSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBuZXdEZXB0aCA9IG1heERlcHRoICsgMTtcbiAgICAgIGNoYW5nZURlcHRoKGVsZSwgbmV3RGVwdGgpO1xuICAgICAgc2hpZnRlZFtpZF0gPSBuZXdEZXB0aDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLy8gZm9yIHRoZSBkaXJlY3RlZCBjYXNlLCB0cnkgdG8gbWFrZSB0aGUgZWRnZXMgYWxsIGdvIGRvd24gKGkuZS4gZGVwdGggaSA9PiBkZXB0aCBpICsgMSlcbiAgaWYgKGRpcmVjdGVkICYmIG1heGltYWwpIHtcbiAgICB2YXIgUSA9IFtdO1xuICAgIHZhciBzaGlmdGVkID0ge307XG4gICAgdmFyIGVucXVldWUgPSBmdW5jdGlvbiBlbnF1ZXVlKG4pIHtcbiAgICAgIHJldHVybiBRLnB1c2gobik7XG4gICAgfTtcbiAgICB2YXIgZGVxdWV1ZSA9IGZ1bmN0aW9uIGRlcXVldWUoKSB7XG4gICAgICByZXR1cm4gUS5zaGlmdCgpO1xuICAgIH07XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgcmV0dXJuIFEucHVzaChuKTtcbiAgICB9KTtcbiAgICB3aGlsZSAoUS5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgX2VsZTMgPSBkZXF1ZXVlKCk7XG4gICAgICB2YXIgZGlkU2hpZnQgPSBhZGp1c3RNYXhpbWFsbHkoX2VsZTMsIHNoaWZ0ZWQpO1xuICAgICAgaWYgKGRpZFNoaWZ0KSB7XG4gICAgICAgIF9lbGUzLm91dGdvZXJzKCkuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIHJldHVybiBlbC5pc05vZGUoKSAmJiBlbGVzLmhhcyhlbCk7XG4gICAgICAgIH0pLmZvckVhY2goZW5xdWV1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGRpZFNoaWZ0ID09PSBudWxsKSB7XG4gICAgICAgIHdhcm4oJ0RldGVjdGVkIGRvdWJsZSBtYXhpbWFsIHNoaWZ0IGZvciBub2RlIGAnICsgX2VsZTMuaWQoKSArICdgLiAgQmFpbGluZyBtYXhpbWFsIGFkanVzdG1lbnQgZHVlIHRvIGN5Y2xlLiAgVXNlIGBvcHRpb25zLm1heGltYWw6IHRydWVgIG9ubHkgb24gREFHcy4nKTtcbiAgICAgICAgYnJlYWs7IC8vIGV4aXQgb24gZmFpbHVyZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzc2lnbkRlcHRocygpOyAvLyBjbGVhciBob2xlc1xuXG4gIC8vIGZpbmQgbWluIGRpc3RhbmNlIHdlIG5lZWQgdG8gbGVhdmUgYmV0d2VlbiBub2Rlc1xuICB2YXIgbWluRGlzdGFuY2UgPSAwO1xuICBpZiAob3B0aW9ucy5hdm9pZE92ZXJsYXApIHtcbiAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBub2Rlcy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgICB2YXIgbiA9IG5vZGVzW19pNF07XG4gICAgICB2YXIgbmJiID0gbi5sYXlvdXREaW1lbnNpb25zKG9wdGlvbnMpO1xuICAgICAgdmFyIHcgPSBuYmIudztcbiAgICAgIHZhciBoID0gbmJiLmg7XG4gICAgICBtaW5EaXN0YW5jZSA9IE1hdGgubWF4KG1pbkRpc3RhbmNlLCB3LCBoKTtcbiAgICB9XG4gIH1cblxuICAvLyBnZXQgdGhlIHdlaWdodGVkIHBlcmNlbnQgZm9yIGFuIGVsZW1lbnQgYmFzZWQgb24gaXRzIGNvbm5lY3Rpdml0eSB0byBvdGhlciBsZXZlbHNcbiAgdmFyIGNhY2hlZFdlaWdodGVkUGVyY2VudCA9IHt9O1xuICB2YXIgZ2V0V2VpZ2h0ZWRQZXJjZW50ID0gZnVuY3Rpb24gZ2V0V2VpZ2h0ZWRQZXJjZW50KGVsZSkge1xuICAgIGlmIChjYWNoZWRXZWlnaHRlZFBlcmNlbnRbZWxlLmlkKCldKSB7XG4gICAgICByZXR1cm4gY2FjaGVkV2VpZ2h0ZWRQZXJjZW50W2VsZS5pZCgpXTtcbiAgICB9XG4gICAgdmFyIGVsZURlcHRoID0gZ2V0SW5mbyhlbGUpLmRlcHRoO1xuICAgIHZhciBuZWlnaGJvcnMgPSBlbGUubmVpZ2hib3Job29kKCk7XG4gICAgdmFyIHBlcmNlbnQgPSAwO1xuICAgIHZhciBzYW1wbGVzID0gMDtcbiAgICBmb3IgKHZhciBfaTUgPSAwOyBfaTUgPCBuZWlnaGJvcnMubGVuZ3RoOyBfaTUrKykge1xuICAgICAgdmFyIG5laWdoYm9yID0gbmVpZ2hib3JzW19pNV07XG4gICAgICBpZiAobmVpZ2hib3IuaXNFZGdlKCkgfHwgbmVpZ2hib3IuaXNQYXJlbnQoKSB8fCAhbm9kZXMuaGFzKG5laWdoYm9yKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBiZiA9IGdldEluZm8obmVpZ2hib3IpO1xuICAgICAgaWYgKGJmID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBiZi5pbmRleDtcbiAgICAgIHZhciBkZXB0aCA9IGJmLmRlcHRoO1xuXG4gICAgICAvLyB1bmFzc2lnbmVkIG5laWdoYm91cnMgc2hvdWxkbid0IGFmZmVjdCB0aGUgb3JkZXJpbmdcbiAgICAgIGlmIChpbmRleCA9PSBudWxsIHx8IGRlcHRoID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgbkRlcHRoID0gZGVwdGhzW2RlcHRoXS5sZW5ndGg7XG4gICAgICBpZiAoZGVwdGggPCBlbGVEZXB0aCkge1xuICAgICAgICAvLyBvbmx5IGdldCBpbmZsdWVuY2VkIGJ5IGVsZW1lbnRzIGFib3ZlXG4gICAgICAgIHBlcmNlbnQgKz0gaW5kZXggLyBuRGVwdGg7XG4gICAgICAgIHNhbXBsZXMrKztcbiAgICAgIH1cbiAgICB9XG4gICAgc2FtcGxlcyA9IE1hdGgubWF4KDEsIHNhbXBsZXMpO1xuICAgIHBlcmNlbnQgPSBwZXJjZW50IC8gc2FtcGxlcztcbiAgICBpZiAoc2FtcGxlcyA9PT0gMCkge1xuICAgICAgLy8gcHV0IGxvbmUgbm9kZXMgYXQgdGhlIHN0YXJ0XG4gICAgICBwZXJjZW50ID0gMDtcbiAgICB9XG4gICAgY2FjaGVkV2VpZ2h0ZWRQZXJjZW50W2VsZS5pZCgpXSA9IHBlcmNlbnQ7XG4gICAgcmV0dXJuIHBlcmNlbnQ7XG4gIH07XG5cbiAgLy8gcmVhcnJhbmdlIHRoZSBpbmRpY2VzIGluIGVhY2ggZGVwdGggbGV2ZWwgYmFzZWQgb24gY29ubmVjdGl2aXR5XG5cbiAgdmFyIHNvcnRGbiA9IGZ1bmN0aW9uIHNvcnRGbihhLCBiKSB7XG4gICAgdmFyIGFwY3QgPSBnZXRXZWlnaHRlZFBlcmNlbnQoYSk7XG4gICAgdmFyIGJwY3QgPSBnZXRXZWlnaHRlZFBlcmNlbnQoYik7XG4gICAgdmFyIGRpZmYgPSBhcGN0IC0gYnBjdDtcbiAgICBpZiAoZGlmZiA9PT0gMCkge1xuICAgICAgcmV0dXJuIGFzY2VuZGluZyhhLmlkKCksIGIuaWQoKSk7IC8vIG1ha2Ugc3VyZSBzb3J0IGRvZXNuJ3QgaGF2ZSBkb24ndC1jYXJlIGNvbXBhcmlzb25zXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkaWZmO1xuICAgIH1cbiAgfTtcbiAgaWYgKG9wdGlvbnMuZGVwdGhTb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBzb3J0Rm4gPSBvcHRpb25zLmRlcHRoU29ydDtcbiAgfVxuXG4gIC8vIHNvcnQgZWFjaCBsZXZlbCB0byBtYWtlIGNvbm5lY3RlZCBub2RlcyBjbG9zZXJcbiAgZm9yICh2YXIgX2k2ID0gMDsgX2k2IDwgZGVwdGhzLmxlbmd0aDsgX2k2KyspIHtcbiAgICBkZXB0aHNbX2k2XS5zb3J0KHNvcnRGbik7XG4gICAgYXNzaWduRGVwdGhzQXQoX2k2KTtcbiAgfVxuXG4gIC8vIGFzc2lnbiBvcnBoYW4gbm9kZXMgdG8gYSBuZXcgdG9wLWxldmVsIGRlcHRoXG4gIHZhciBvcnBoYW5EZXB0aCA9IFtdO1xuICBmb3IgKHZhciBfaTcgPSAwOyBfaTcgPCBvcnBoYW5Ob2Rlcy5sZW5ndGg7IF9pNysrKSB7XG4gICAgb3JwaGFuRGVwdGgucHVzaChvcnBoYW5Ob2Rlc1tfaTddKTtcbiAgfVxuICBkZXB0aHMudW5zaGlmdChvcnBoYW5EZXB0aCk7XG4gIGFzc2lnbkRlcHRocygpO1xuICB2YXIgYmlnZ2VzdERlcHRoU2l6ZSA9IDA7XG4gIGZvciAodmFyIF9pOCA9IDA7IF9pOCA8IGRlcHRocy5sZW5ndGg7IF9pOCsrKSB7XG4gICAgYmlnZ2VzdERlcHRoU2l6ZSA9IE1hdGgubWF4KGRlcHRoc1tfaThdLmxlbmd0aCwgYmlnZ2VzdERlcHRoU2l6ZSk7XG4gIH1cbiAgdmFyIGNlbnRlciA9IHtcbiAgICB4OiBiYi54MSArIGJiLncgLyAyLFxuICAgIHk6IGJiLngxICsgYmIuaCAvIDJcbiAgfTtcbiAgdmFyIG1heERlcHRoU2l6ZSA9IGRlcHRocy5yZWR1Y2UoZnVuY3Rpb24gKG1heCwgZWxlcykge1xuICAgIHJldHVybiBNYXRoLm1heChtYXgsIGVsZXMubGVuZ3RoKTtcbiAgfSwgMCk7XG4gIHZhciBnZXRQb3NpdGlvbiA9IGZ1bmN0aW9uIGdldFBvc2l0aW9uKGVsZSkge1xuICAgIHZhciBfZ2V0SW5mbzIgPSBnZXRJbmZvKGVsZSksXG4gICAgICBkZXB0aCA9IF9nZXRJbmZvMi5kZXB0aCxcbiAgICAgIGluZGV4ID0gX2dldEluZm8yLmluZGV4O1xuICAgIHZhciBkZXB0aFNpemUgPSBkZXB0aHNbZGVwdGhdLmxlbmd0aDtcbiAgICB2YXIgZGlzdGFuY2VYID0gTWF0aC5tYXgoYmIudyAvICgob3B0aW9ucy5ncmlkID8gbWF4RGVwdGhTaXplIDogZGVwdGhTaXplKSArIDEpLCBtaW5EaXN0YW5jZSk7XG4gICAgdmFyIGRpc3RhbmNlWSA9IE1hdGgubWF4KGJiLmggLyAoZGVwdGhzLmxlbmd0aCArIDEpLCBtaW5EaXN0YW5jZSk7XG4gICAgdmFyIHJhZGl1c1N0ZXBTaXplID0gTWF0aC5taW4oYmIudyAvIDIgLyBkZXB0aHMubGVuZ3RoLCBiYi5oIC8gMiAvIGRlcHRocy5sZW5ndGgpO1xuICAgIHJhZGl1c1N0ZXBTaXplID0gTWF0aC5tYXgocmFkaXVzU3RlcFNpemUsIG1pbkRpc3RhbmNlKTtcbiAgICBpZiAoIW9wdGlvbnMuY2lyY2xlKSB7XG4gICAgICB2YXIgZXBvcyA9IHtcbiAgICAgICAgeDogY2VudGVyLnggKyAoaW5kZXggKyAxIC0gKGRlcHRoU2l6ZSArIDEpIC8gMikgKiBkaXN0YW5jZVgsXG4gICAgICAgIHk6IChkZXB0aCArIDEpICogZGlzdGFuY2VZXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGVwb3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByYWRpdXMgPSByYWRpdXNTdGVwU2l6ZSAqIGRlcHRoICsgcmFkaXVzU3RlcFNpemUgLSAoZGVwdGhzLmxlbmd0aCA+IDAgJiYgZGVwdGhzWzBdLmxlbmd0aCA8PSAzID8gcmFkaXVzU3RlcFNpemUgLyAyIDogMCk7XG4gICAgICB2YXIgdGhldGEgPSAyICogTWF0aC5QSSAvIGRlcHRoc1tkZXB0aF0ubGVuZ3RoICogaW5kZXg7XG4gICAgICBpZiAoZGVwdGggPT09IDAgJiYgZGVwdGhzWzBdLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByYWRpdXMgPSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogY2VudGVyLnggKyByYWRpdXMgKiBNYXRoLmNvcyh0aGV0YSksXG4gICAgICAgIHk6IGNlbnRlci55ICsgcmFkaXVzICogTWF0aC5zaW4odGhldGEpXG4gICAgICB9O1xuICAgIH1cbiAgfTtcbiAgZWxlcy5ub2RlcygpLmxheW91dFBvc2l0aW9ucyh0aGlzLCBvcHRpb25zLCBnZXRQb3NpdGlvbik7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxudmFyIGRlZmF1bHRzJDYgPSB7XG4gIGZpdDogdHJ1ZSxcbiAgLy8gd2hldGhlciB0byBmaXQgdGhlIHZpZXdwb3J0IHRvIHRoZSBncmFwaFxuICBwYWRkaW5nOiAzMCxcbiAgLy8gdGhlIHBhZGRpbmcgb24gZml0XG4gIGJvdW5kaW5nQm94OiB1bmRlZmluZWQsXG4gIC8vIGNvbnN0cmFpbiBsYXlvdXQgYm91bmRzOyB7IHgxLCB5MSwgeDIsIHkyIH0gb3IgeyB4MSwgeTEsIHcsIGggfVxuICBhdm9pZE92ZXJsYXA6IHRydWUsXG4gIC8vIHByZXZlbnRzIG5vZGUgb3ZlcmxhcCwgbWF5IG92ZXJmbG93IGJvdW5kaW5nQm94IGFuZCByYWRpdXMgaWYgbm90IGVub3VnaCBzcGFjZVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxuICBzcGFjaW5nRmFjdG9yOiB1bmRlZmluZWQsXG4gIC8vIEFwcGxpZXMgYSBtdWx0aXBsaWNhdGl2ZSBmYWN0b3IgKD4wKSB0byBleHBhbmQgb3IgY29tcHJlc3MgdGhlIG92ZXJhbGwgYXJlYSB0aGF0IHRoZSBub2RlcyB0YWtlIHVwXG4gIHJhZGl1czogdW5kZWZpbmVkLFxuICAvLyB0aGUgcmFkaXVzIG9mIHRoZSBjaXJjbGVcbiAgc3RhcnRBbmdsZTogMyAvIDIgKiBNYXRoLlBJLFxuICAvLyB3aGVyZSBub2RlcyBzdGFydCBpbiByYWRpYW5zXG4gIHN3ZWVwOiB1bmRlZmluZWQsXG4gIC8vIGhvdyBtYW55IHJhZGlhbnMgc2hvdWxkIGJlIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGUgKGRlZmF1bHRzIHRvIGZ1bGwgY2lyY2xlKVxuICBjbG9ja3dpc2U6IHRydWUsXG4gIC8vIHdoZXRoZXIgdGhlIGxheW91dCBzaG91bGQgZ28gY2xvY2t3aXNlICh0cnVlKSBvciBjb3VudGVyY2xvY2t3aXNlL2FudGljbG9ja3dpc2UgKGZhbHNlKVxuICBzb3J0OiB1bmRlZmluZWQsXG4gIC8vIGEgc29ydGluZyBmdW5jdGlvbiB0byBvcmRlciB0aGUgbm9kZXM7IGUuZy4gZnVuY3Rpb24oYSwgYil7IHJldHVybiBhLmRhdGEoJ3dlaWdodCcpIC0gYi5kYXRhKCd3ZWlnaHQnKSB9XG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0cyBcbn07XG5cbmZ1bmN0aW9uIENpcmNsZUxheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMkNiwgb3B0aW9ucyk7XG59XG5DaXJjbGVMYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHBhcmFtcyA9IHRoaXMub3B0aW9ucztcbiAgdmFyIG9wdGlvbnMgPSBwYXJhbXM7XG4gIHZhciBjeSA9IHBhcmFtcy5jeTtcbiAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG4gIHZhciBjbG9ja3dpc2UgPSBvcHRpb25zLmNvdW50ZXJjbG9ja3dpc2UgIT09IHVuZGVmaW5lZCA/ICFvcHRpb25zLmNvdW50ZXJjbG9ja3dpc2UgOiBvcHRpb25zLmNsb2Nrd2lzZTtcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpLm5vdCgnOnBhcmVudCcpO1xuICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgbm9kZXMgPSBub2Rlcy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gIH1cbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG4gIHZhciBjZW50ZXIgPSB7XG4gICAgeDogYmIueDEgKyBiYi53IC8gMixcbiAgICB5OiBiYi55MSArIGJiLmggLyAyXG4gIH07XG4gIHZhciBzd2VlcCA9IG9wdGlvbnMuc3dlZXAgPT09IHVuZGVmaW5lZCA/IDIgKiBNYXRoLlBJIC0gMiAqIE1hdGguUEkgLyBub2Rlcy5sZW5ndGggOiBvcHRpb25zLnN3ZWVwO1xuICB2YXIgZFRoZXRhID0gc3dlZXAgLyBNYXRoLm1heCgxLCBub2Rlcy5sZW5ndGggLSAxKTtcbiAgdmFyIHI7XG4gIHZhciBtaW5EaXN0YW5jZSA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbiA9IG5vZGVzW2ldO1xuICAgIHZhciBuYmIgPSBuLmxheW91dERpbWVuc2lvbnMob3B0aW9ucyk7XG4gICAgdmFyIHcgPSBuYmIudztcbiAgICB2YXIgaCA9IG5iYi5oO1xuICAgIG1pbkRpc3RhbmNlID0gTWF0aC5tYXgobWluRGlzdGFuY2UsIHcsIGgpO1xuICB9XG4gIGlmIChudW1iZXIkMShvcHRpb25zLnJhZGl1cykpIHtcbiAgICByID0gb3B0aW9ucy5yYWRpdXM7XG4gIH0gZWxzZSBpZiAobm9kZXMubGVuZ3RoIDw9IDEpIHtcbiAgICByID0gMDtcbiAgfSBlbHNlIHtcbiAgICByID0gTWF0aC5taW4oYmIuaCwgYmIudykgLyAyIC0gbWluRGlzdGFuY2U7XG4gIH1cblxuICAvLyBjYWxjdWxhdGUgdGhlIHJhZGl1c1xuICBpZiAobm9kZXMubGVuZ3RoID4gMSAmJiBvcHRpb25zLmF2b2lkT3ZlcmxhcCkge1xuICAgIC8vIGJ1dCBvbmx5IGlmIG1vcmUgdGhhbiBvbmUgbm9kZSAoY2FuJ3Qgb3ZlcmxhcClcbiAgICBtaW5EaXN0YW5jZSAqPSAxLjc1OyAvLyBqdXN0IHRvIGhhdmUgc29tZSBuaWNlIHNwYWNpbmdcblxuICAgIHZhciBkY29zID0gTWF0aC5jb3MoZFRoZXRhKSAtIE1hdGguY29zKDApO1xuICAgIHZhciBkc2luID0gTWF0aC5zaW4oZFRoZXRhKSAtIE1hdGguc2luKDApO1xuICAgIHZhciByTWluID0gTWF0aC5zcXJ0KG1pbkRpc3RhbmNlICogbWluRGlzdGFuY2UgLyAoZGNvcyAqIGRjb3MgKyBkc2luICogZHNpbikpOyAvLyBzLnQuIG5vIG5vZGVzIG92ZXJsYXBwaW5nXG4gICAgciA9IE1hdGgubWF4KHJNaW4sIHIpO1xuICB9XG4gIHZhciBnZXRQb3MgPSBmdW5jdGlvbiBnZXRQb3MoZWxlLCBpKSB7XG4gICAgdmFyIHRoZXRhID0gb3B0aW9ucy5zdGFydEFuZ2xlICsgaSAqIGRUaGV0YSAqIChjbG9ja3dpc2UgPyAxIDogLTEpO1xuICAgIHZhciByeCA9IHIgKiBNYXRoLmNvcyh0aGV0YSk7XG4gICAgdmFyIHJ5ID0gciAqIE1hdGguc2luKHRoZXRhKTtcbiAgICB2YXIgcG9zID0ge1xuICAgICAgeDogY2VudGVyLnggKyByeCxcbiAgICAgIHk6IGNlbnRlci55ICsgcnlcbiAgICB9O1xuICAgIHJldHVybiBwb3M7XG4gIH07XG4gIGVsZXMubm9kZXMoKS5sYXlvdXRQb3NpdGlvbnModGhpcywgb3B0aW9ucywgZ2V0UG9zKTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG52YXIgZGVmYXVsdHMkNSA9IHtcbiAgZml0OiB0cnVlLFxuICAvLyB3aGV0aGVyIHRvIGZpdCB0aGUgdmlld3BvcnQgdG8gdGhlIGdyYXBoXG4gIHBhZGRpbmc6IDMwLFxuICAvLyB0aGUgcGFkZGluZyBvbiBmaXRcbiAgc3RhcnRBbmdsZTogMyAvIDIgKiBNYXRoLlBJLFxuICAvLyB3aGVyZSBub2RlcyBzdGFydCBpbiByYWRpYW5zXG4gIHN3ZWVwOiB1bmRlZmluZWQsXG4gIC8vIGhvdyBtYW55IHJhZGlhbnMgc2hvdWxkIGJlIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGUgKGRlZmF1bHRzIHRvIGZ1bGwgY2lyY2xlKVxuICBjbG9ja3dpc2U6IHRydWUsXG4gIC8vIHdoZXRoZXIgdGhlIGxheW91dCBzaG91bGQgZ28gY2xvY2t3aXNlICh0cnVlKSBvciBjb3VudGVyY2xvY2t3aXNlL2FudGljbG9ja3dpc2UgKGZhbHNlKVxuICBlcXVpZGlzdGFudDogZmFsc2UsXG4gIC8vIHdoZXRoZXIgbGV2ZWxzIGhhdmUgYW4gZXF1YWwgcmFkaWFsIGRpc3RhbmNlIGJldHdlbiB0aGVtLCBtYXkgY2F1c2UgYm91bmRpbmcgYm94IG92ZXJmbG93XG4gIG1pbk5vZGVTcGFjaW5nOiAxMCxcbiAgLy8gbWluIHNwYWNpbmcgYmV0d2VlbiBvdXRzaWRlIG9mIG5vZGVzICh1c2VkIGZvciByYWRpdXMgYWRqdXN0bWVudClcbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIGF2b2lkT3ZlcmxhcDogdHJ1ZSxcbiAgLy8gcHJldmVudHMgbm9kZSBvdmVybGFwLCBtYXkgb3ZlcmZsb3cgYm91bmRpbmdCb3ggaWYgbm90IGVub3VnaCBzcGFjZVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxuICBoZWlnaHQ6IHVuZGVmaW5lZCxcbiAgLy8gaGVpZ2h0IG9mIGxheW91dCBhcmVhIChvdmVycmlkZXMgY29udGFpbmVyIGhlaWdodClcbiAgd2lkdGg6IHVuZGVmaW5lZCxcbiAgLy8gd2lkdGggb2YgbGF5b3V0IGFyZWEgKG92ZXJyaWRlcyBjb250YWluZXIgd2lkdGgpXG4gIHNwYWNpbmdGYWN0b3I6IHVuZGVmaW5lZCxcbiAgLy8gQXBwbGllcyBhIG11bHRpcGxpY2F0aXZlIGZhY3RvciAoPjApIHRvIGV4cGFuZCBvciBjb21wcmVzcyB0aGUgb3ZlcmFsbCBhcmVhIHRoYXQgdGhlIG5vZGVzIHRha2UgdXBcbiAgY29uY2VudHJpYzogZnVuY3Rpb24gY29uY2VudHJpYyhub2RlKSB7XG4gICAgLy8gcmV0dXJucyBudW1lcmljIHZhbHVlIGZvciBlYWNoIG5vZGUsIHBsYWNpbmcgaGlnaGVyIG5vZGVzIGluIGxldmVscyB0b3dhcmRzIHRoZSBjZW50cmVcbiAgICByZXR1cm4gbm9kZS5kZWdyZWUoKTtcbiAgfSxcbiAgbGV2ZWxXaWR0aDogZnVuY3Rpb24gbGV2ZWxXaWR0aChub2Rlcykge1xuICAgIC8vIHRoZSB2YXJpYXRpb24gb2YgY29uY2VudHJpYyB2YWx1ZXMgaW4gZWFjaCBsZXZlbFxuICAgIHJldHVybiBub2Rlcy5tYXhEZWdyZWUoKSAvIDQ7XG4gIH0sXG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0c1xufTtcblxuZnVuY3Rpb24gQ29uY2VudHJpY0xheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMkNSwgb3B0aW9ucyk7XG59XG5Db25jZW50cmljTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwYXJhbXMgPSB0aGlzLm9wdGlvbnM7XG4gIHZhciBvcHRpb25zID0gcGFyYW1zO1xuICB2YXIgY2xvY2t3aXNlID0gb3B0aW9ucy5jb3VudGVyY2xvY2t3aXNlICE9PSB1bmRlZmluZWQgPyAhb3B0aW9ucy5jb3VudGVyY2xvY2t3aXNlIDogb3B0aW9ucy5jbG9ja3dpc2U7XG4gIHZhciBjeSA9IHBhcmFtcy5jeTtcbiAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG4gIHZhciBub2RlcyA9IGVsZXMubm9kZXMoKS5ub3QoJzpwYXJlbnQnKTtcbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG4gIHZhciBjZW50ZXIgPSB7XG4gICAgeDogYmIueDEgKyBiYi53IC8gMixcbiAgICB5OiBiYi55MSArIGJiLmggLyAyXG4gIH07XG4gIHZhciBub2RlVmFsdWVzID0gW107IC8vIHsgbm9kZSwgdmFsdWUgfVxuICB2YXIgbWF4Tm9kZVNpemUgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICB2YXIgdmFsdWUgPSB2b2lkIDA7XG5cbiAgICAvLyBjYWxjdWxhdGUgdGhlIG5vZGUgdmFsdWVcbiAgICB2YWx1ZSA9IG9wdGlvbnMuY29uY2VudHJpYyhub2RlKTtcbiAgICBub2RlVmFsdWVzLnB1c2goe1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgbm9kZTogbm9kZVxuICAgIH0pO1xuXG4gICAgLy8gZm9yIHN0eWxlIG1hcHBpbmdcbiAgICBub2RlLl9wcml2YXRlLnNjcmF0Y2guY29uY2VudHJpYyA9IHZhbHVlO1xuICB9XG5cbiAgLy8gaW4gY2FzZSB3ZSB1c2VkIHRoZSBgY29uY2VudHJpY2AgaW4gc3R5bGVcbiAgbm9kZXMudXBkYXRlU3R5bGUoKTtcblxuICAvLyBjYWxjdWxhdGUgbWF4IHNpemUgbm93IGJhc2VkIG9uIHBvdGVudGlhbGx5IHVwZGF0ZWQgbWFwcGVyc1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbm9kZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIF9ub2RlID0gbm9kZXNbX2ldO1xuICAgIHZhciBuYmIgPSBfbm9kZS5sYXlvdXREaW1lbnNpb25zKG9wdGlvbnMpO1xuICAgIG1heE5vZGVTaXplID0gTWF0aC5tYXgobWF4Tm9kZVNpemUsIG5iYi53LCBuYmIuaCk7XG4gIH1cblxuICAvLyBzb3J0IG5vZGUgdmFsdWVzIGluIGRlc2NyZWFzaW5nIG9yZGVyXG4gIG5vZGVWYWx1ZXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLnZhbHVlIC0gYS52YWx1ZTtcbiAgfSk7XG4gIHZhciBsZXZlbFdpZHRoID0gb3B0aW9ucy5sZXZlbFdpZHRoKG5vZGVzKTtcblxuICAvLyBwdXQgdGhlIHZhbHVlcyBpbnRvIGxldmVsc1xuICB2YXIgbGV2ZWxzID0gW1tdXTtcbiAgdmFyIGN1cnJlbnRMZXZlbCA9IGxldmVsc1swXTtcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbm9kZVZhbHVlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIHZhbCA9IG5vZGVWYWx1ZXNbX2kyXTtcbiAgICBpZiAoY3VycmVudExldmVsLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBkaWZmID0gTWF0aC5hYnMoY3VycmVudExldmVsWzBdLnZhbHVlIC0gdmFsLnZhbHVlKTtcbiAgICAgIGlmIChkaWZmID49IGxldmVsV2lkdGgpIHtcbiAgICAgICAgY3VycmVudExldmVsID0gW107XG4gICAgICAgIGxldmVscy5wdXNoKGN1cnJlbnRMZXZlbCk7XG4gICAgICB9XG4gICAgfVxuICAgIGN1cnJlbnRMZXZlbC5wdXNoKHZhbCk7XG4gIH1cblxuICAvLyBjcmVhdGUgcG9zaXRpb25zIGZyb20gbGV2ZWxzXG5cbiAgdmFyIG1pbkRpc3QgPSBtYXhOb2RlU2l6ZSArIG9wdGlvbnMubWluTm9kZVNwYWNpbmc7IC8vIG1pbiBkaXN0IGJldHdlZW4gbm9kZXNcblxuICBpZiAoIW9wdGlvbnMuYXZvaWRPdmVybGFwKSB7XG4gICAgLy8gdGhlbiBzdHJpY3RseSBjb25zdHJhaW4gdG8gYmJcbiAgICB2YXIgZmlyc3RMdmxIYXNNdWx0aSA9IGxldmVscy5sZW5ndGggPiAwICYmIGxldmVsc1swXS5sZW5ndGggPiAxO1xuICAgIHZhciBtYXhSID0gTWF0aC5taW4oYmIudywgYmIuaCkgLyAyIC0gbWluRGlzdDtcbiAgICB2YXIgclN0ZXAgPSBtYXhSIC8gKGxldmVscy5sZW5ndGggKyBmaXJzdEx2bEhhc011bHRpID8gMSA6IDApO1xuICAgIG1pbkRpc3QgPSBNYXRoLm1pbihtaW5EaXN0LCByU3RlcCk7XG4gIH1cblxuICAvLyBmaW5kIHRoZSBtZXRyaWNzIGZvciBlYWNoIGxldmVsXG4gIHZhciByID0gMDtcbiAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgbGV2ZWxzLmxlbmd0aDsgX2kzKyspIHtcbiAgICB2YXIgbGV2ZWwgPSBsZXZlbHNbX2kzXTtcbiAgICB2YXIgc3dlZXAgPSBvcHRpb25zLnN3ZWVwID09PSB1bmRlZmluZWQgPyAyICogTWF0aC5QSSAtIDIgKiBNYXRoLlBJIC8gbGV2ZWwubGVuZ3RoIDogb3B0aW9ucy5zd2VlcDtcbiAgICB2YXIgZFRoZXRhID0gbGV2ZWwuZFRoZXRhID0gc3dlZXAgLyBNYXRoLm1heCgxLCBsZXZlbC5sZW5ndGggLSAxKTtcblxuICAgIC8vIGNhbGN1bGF0ZSB0aGUgcmFkaXVzXG4gICAgaWYgKGxldmVsLmxlbmd0aCA+IDEgJiYgb3B0aW9ucy5hdm9pZE92ZXJsYXApIHtcbiAgICAgIC8vIGJ1dCBvbmx5IGlmIG1vcmUgdGhhbiBvbmUgbm9kZSAoY2FuJ3Qgb3ZlcmxhcClcbiAgICAgIHZhciBkY29zID0gTWF0aC5jb3MoZFRoZXRhKSAtIE1hdGguY29zKDApO1xuICAgICAgdmFyIGRzaW4gPSBNYXRoLnNpbihkVGhldGEpIC0gTWF0aC5zaW4oMCk7XG4gICAgICB2YXIgck1pbiA9IE1hdGguc3FydChtaW5EaXN0ICogbWluRGlzdCAvIChkY29zICogZGNvcyArIGRzaW4gKiBkc2luKSk7IC8vIHMudC4gbm8gbm9kZXMgb3ZlcmxhcHBpbmdcblxuICAgICAgciA9IE1hdGgubWF4KHJNaW4sIHIpO1xuICAgIH1cbiAgICBsZXZlbC5yID0gcjtcbiAgICByICs9IG1pbkRpc3Q7XG4gIH1cbiAgaWYgKG9wdGlvbnMuZXF1aWRpc3RhbnQpIHtcbiAgICB2YXIgckRlbHRhTWF4ID0gMDtcbiAgICB2YXIgX3IgPSAwO1xuICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IGxldmVscy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgICB2YXIgX2xldmVsID0gbGV2ZWxzW19pNF07XG4gICAgICB2YXIgckRlbHRhID0gX2xldmVsLnIgLSBfcjtcbiAgICAgIHJEZWx0YU1heCA9IE1hdGgubWF4KHJEZWx0YU1heCwgckRlbHRhKTtcbiAgICB9XG4gICAgX3IgPSAwO1xuICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IGxldmVscy5sZW5ndGg7IF9pNSsrKSB7XG4gICAgICB2YXIgX2xldmVsMiA9IGxldmVsc1tfaTVdO1xuICAgICAgaWYgKF9pNSA9PT0gMCkge1xuICAgICAgICBfciA9IF9sZXZlbDIucjtcbiAgICAgIH1cbiAgICAgIF9sZXZlbDIuciA9IF9yO1xuICAgICAgX3IgKz0gckRlbHRhTWF4O1xuICAgIH1cbiAgfVxuXG4gIC8vIGNhbGN1bGF0ZSB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgdmFyIHBvcyA9IHt9OyAvLyBpZCA9PiBwb3NpdGlvblxuICBmb3IgKHZhciBfaTYgPSAwOyBfaTYgPCBsZXZlbHMubGVuZ3RoOyBfaTYrKykge1xuICAgIHZhciBfbGV2ZWwzID0gbGV2ZWxzW19pNl07XG4gICAgdmFyIF9kVGhldGEgPSBfbGV2ZWwzLmRUaGV0YTtcbiAgICB2YXIgX3IyID0gX2xldmVsMy5yO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgX2xldmVsMy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIF92YWwgPSBfbGV2ZWwzW2pdO1xuICAgICAgdmFyIHRoZXRhID0gb3B0aW9ucy5zdGFydEFuZ2xlICsgKGNsb2Nrd2lzZSA/IDEgOiAtMSkgKiBfZFRoZXRhICogajtcbiAgICAgIHZhciBwID0ge1xuICAgICAgICB4OiBjZW50ZXIueCArIF9yMiAqIE1hdGguY29zKHRoZXRhKSxcbiAgICAgICAgeTogY2VudGVyLnkgKyBfcjIgKiBNYXRoLnNpbih0aGV0YSlcbiAgICAgIH07XG4gICAgICBwb3NbX3ZhbC5ub2RlLmlkKCldID0gcDtcbiAgICB9XG4gIH1cblxuICAvLyBwb3NpdGlvbiB0aGUgbm9kZXNcbiAgZWxlcy5ub2RlcygpLmxheW91dFBvc2l0aW9ucyh0aGlzLCBvcHRpb25zLCBmdW5jdGlvbiAoZWxlKSB7XG4gICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgcmV0dXJuIHBvc1tpZF07XG4gIH0pO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbi8qXG5UaGUgQ29TRSBsYXlvdXQgd2FzIHdyaXR0ZW4gYnkgR2VyYXJkbyBIdWNrLlxuaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL2luL2dlcmFyZG9odWNrL1xuXG5CYXNlZCBvbiB0aGUgZm9sbG93aW5nIGFydGljbGU6XG5odHRwOi8vZGwuYWNtLm9yZy9jaXRhdGlvbi5jZm0/aWQ9MTQ5ODA0N1xuXG5Nb2RpZmljYXRpb25zIHRyYWNrZWQgb24gR2l0aHViLlxuKi9cbnZhciBERUJVRztcblxuLyoqXG4gKiBAYnJpZWYgOiAgZGVmYXVsdCBsYXlvdXQgb3B0aW9uc1xuICovXG52YXIgZGVmYXVsdHMkNCA9IHtcbiAgLy8gQ2FsbGVkIG9uIGBsYXlvdXRyZWFkeWBcbiAgcmVhZHk6IGZ1bmN0aW9uIHJlYWR5KCkge30sXG4gIC8vIENhbGxlZCBvbiBgbGF5b3V0c3RvcGBcbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHt9LFxuICAvLyBXaGV0aGVyIHRvIGFuaW1hdGUgd2hpbGUgcnVubmluZyB0aGUgbGF5b3V0XG4gIC8vIHRydWUgOiBBbmltYXRlIGNvbnRpbnVvdXNseSBhcyB0aGUgbGF5b3V0IGlzIHJ1bm5pbmdcbiAgLy8gZmFsc2UgOiBKdXN0IHNob3cgdGhlIGVuZCByZXN1bHRcbiAgLy8gJ2VuZCcgOiBBbmltYXRlIHdpdGggdGhlIGVuZCByZXN1bHQsIGZyb20gdGhlIGluaXRpYWwgcG9zaXRpb25zIHRvIHRoZSBlbmQgcG9zaXRpb25zXG4gIGFuaW1hdGU6IHRydWUsXG4gIC8vIEVhc2luZyBvZiB0aGUgYW5pbWF0aW9uIGZvciBhbmltYXRlOidlbmQnXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBUaGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBmb3IgYW5pbWF0ZTonZW5kJ1xuICBhbmltYXRpb25EdXJhdGlvbjogdW5kZWZpbmVkLFxuICAvLyBBIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSBhbmltYXRlZFxuICAvLyBBbGwgbm9kZXMgYW5pbWF0ZWQgYnkgZGVmYXVsdCBvbiBhbmltYXRlIGVuYWJsZWRcbiAgLy8gTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIFRoZSBsYXlvdXQgYW5pbWF0ZXMgb25seSBhZnRlciB0aGlzIG1hbnkgbWlsbGlzZWNvbmRzIGZvciBhbmltYXRlOnRydWVcbiAgLy8gKHByZXZlbnRzIGZsYXNoaW5nIG9uIGZhc3QgcnVucylcbiAgYW5pbWF0aW9uVGhyZXNob2xkOiAyNTAsXG4gIC8vIE51bWJlciBvZiBpdGVyYXRpb25zIGJldHdlZW4gY29uc2VjdXRpdmUgc2NyZWVuIHBvc2l0aW9ucyB1cGRhdGVcbiAgcmVmcmVzaDogMjAsXG4gIC8vIFdoZXRoZXIgdG8gZml0IHRoZSBuZXR3b3JrIHZpZXcgYWZ0ZXIgd2hlbiBkb25lXG4gIGZpdDogdHJ1ZSxcbiAgLy8gUGFkZGluZyBvbiBmaXRcbiAgcGFkZGluZzogMzAsXG4gIC8vIENvbnN0cmFpbiBsYXlvdXQgYm91bmRzOyB7IHgxLCB5MSwgeDIsIHkyIH0gb3IgeyB4MSwgeTEsIHcsIGggfVxuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBSYW5kb21pemUgdGhlIGluaXRpYWwgcG9zaXRpb25zIG9mIHRoZSBub2RlcyAodHJ1ZSkgb3IgdXNlIGV4aXN0aW5nIHBvc2l0aW9ucyAoZmFsc2UpXG4gIHJhbmRvbWl6ZTogZmFsc2UsXG4gIC8vIEV4dHJhIHNwYWNpbmcgYmV0d2VlbiBjb21wb25lbnRzIGluIG5vbi1jb21wb3VuZCBncmFwaHNcbiAgY29tcG9uZW50U3BhY2luZzogNDAsXG4gIC8vIE5vZGUgcmVwdWxzaW9uIChub24gb3ZlcmxhcHBpbmcpIG11bHRpcGxpZXJcbiAgbm9kZVJlcHVsc2lvbjogZnVuY3Rpb24gbm9kZVJlcHVsc2lvbihub2RlKSB7XG4gICAgcmV0dXJuIDIwNDg7XG4gIH0sXG4gIC8vIE5vZGUgcmVwdWxzaW9uIChvdmVybGFwcGluZykgbXVsdGlwbGllclxuICBub2RlT3ZlcmxhcDogNCxcbiAgLy8gSWRlYWwgZWRnZSAobm9uIG5lc3RlZCkgbGVuZ3RoXG4gIGlkZWFsRWRnZUxlbmd0aDogZnVuY3Rpb24gaWRlYWxFZGdlTGVuZ3RoKGVkZ2UpIHtcbiAgICByZXR1cm4gMzI7XG4gIH0sXG4gIC8vIERpdmlzb3IgdG8gY29tcHV0ZSBlZGdlIGZvcmNlc1xuICBlZGdlRWxhc3RpY2l0eTogZnVuY3Rpb24gZWRnZUVsYXN0aWNpdHkoZWRnZSkge1xuICAgIHJldHVybiAzMjtcbiAgfSxcbiAgLy8gTmVzdGluZyBmYWN0b3IgKG11bHRpcGxpZXIpIHRvIGNvbXB1dGUgaWRlYWwgZWRnZSBsZW5ndGggZm9yIG5lc3RlZCBlZGdlc1xuICBuZXN0aW5nRmFjdG9yOiAxLjIsXG4gIC8vIEdyYXZpdHkgZm9yY2UgKGNvbnN0YW50KVxuICBncmF2aXR5OiAxLFxuICAvLyBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHBlcmZvcm1cbiAgbnVtSXRlcjogMTAwMCxcbiAgLy8gSW5pdGlhbCB0ZW1wZXJhdHVyZSAobWF4aW11bSBub2RlIGRpc3BsYWNlbWVudClcbiAgaW5pdGlhbFRlbXA6IDEwMDAsXG4gIC8vIENvb2xpbmcgZmFjdG9yIChob3cgdGhlIHRlbXBlcmF0dXJlIGlzIHJlZHVjZWQgYmV0d2VlbiBjb25zZWN1dGl2ZSBpdGVyYXRpb25zXG4gIGNvb2xpbmdGYWN0b3I6IDAuOTksXG4gIC8vIExvd2VyIHRlbXBlcmF0dXJlIHRocmVzaG9sZCAoYmVsb3cgdGhpcyBwb2ludCB0aGUgbGF5b3V0IHdpbGwgZW5kKVxuICBtaW5UZW1wOiAxLjBcbn07XG5cbi8qKlxuICogQGJyaWVmICAgICAgIDogY29uc3RydWN0b3JcbiAqIEBhcmcgb3B0aW9ucyA6IG9iamVjdCBjb250YWluaW5nIGxheW91dCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIENvc2VMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzJDQsIG9wdGlvbnMpO1xuICB0aGlzLm9wdGlvbnMubGF5b3V0ID0gdGhpcztcblxuICAvLyBFeGNsdWRlIGFueSBlZGdlIHRoYXQgaGFzIGEgc291cmNlIG9yIHRhcmdldCBub2RlIHRoYXQgaXMgbm90IGluIHRoZSBzZXQgb2YgcGFzc2VkLWluIG5vZGVzXG4gIHZhciBub2RlcyA9IHRoaXMub3B0aW9ucy5lbGVzLm5vZGVzKCk7XG4gIHZhciBlZGdlcyA9IHRoaXMub3B0aW9ucy5lbGVzLmVkZ2VzKCk7XG4gIHZhciBub3RFZGdlcyA9IGVkZ2VzLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgIHZhciBzb3VyY2VJZCA9IGUuc291cmNlKCkuZGF0YSgnaWQnKTtcbiAgICB2YXIgdGFyZ2V0SWQgPSBlLnRhcmdldCgpLmRhdGEoJ2lkJyk7XG4gICAgdmFyIGhhc1NvdXJjZSA9IG5vZGVzLnNvbWUoZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJldHVybiBuLmRhdGEoJ2lkJykgPT09IHNvdXJjZUlkO1xuICAgIH0pO1xuICAgIHZhciBoYXNUYXJnZXQgPSBub2Rlcy5zb21lKGZ1bmN0aW9uIChuKSB7XG4gICAgICByZXR1cm4gbi5kYXRhKCdpZCcpID09PSB0YXJnZXRJZDtcbiAgICB9KTtcbiAgICByZXR1cm4gIWhhc1NvdXJjZSB8fCAhaGFzVGFyZ2V0O1xuICB9KTtcbiAgdGhpcy5vcHRpb25zLmVsZXMgPSB0aGlzLm9wdGlvbnMuZWxlcy5ub3Qobm90RWRnZXMpO1xufVxuXG4vKipcbiAqIEBicmllZiA6IHJ1bnMgdGhlIGxheW91dFxuICovXG5Db3NlTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgbGF5b3V0ID0gdGhpcztcbiAgbGF5b3V0LnN0b3BwZWQgPSBmYWxzZTtcbiAgaWYgKG9wdGlvbnMuYW5pbWF0ZSA9PT0gdHJ1ZSB8fCBvcHRpb25zLmFuaW1hdGUgPT09IGZhbHNlKSB7XG4gICAgbGF5b3V0LmVtaXQoe1xuICAgICAgdHlwZTogJ2xheW91dHN0YXJ0JyxcbiAgICAgIGxheW91dDogbGF5b3V0XG4gICAgfSk7XG4gIH1cblxuICAvLyBTZXQgREVCVUcgLSBHbG9iYWwgdmFyaWFibGVcbiAgaWYgKHRydWUgPT09IG9wdGlvbnMuZGVidWcpIHtcbiAgICBERUJVRyA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgREVCVUcgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgbGF5b3V0IGluZm9cbiAgdmFyIGxheW91dEluZm8gPSBjcmVhdGVMYXlvdXRJbmZvKGN5LCBsYXlvdXQsIG9wdGlvbnMpO1xuXG4gIC8vIFNob3cgTGF5b3V0SW5mbyBjb250ZW50cyBpZiBkZWJ1Z2dpbmdcbiAgaWYgKERFQlVHKSB7XG4gICAgcHJpbnRMYXlvdXRJbmZvKGxheW91dEluZm8pO1xuICB9XG5cbiAgLy8gSWYgcmVxdWlyZWQsIHJhbmRvbWl6ZSBub2RlIHBvc2l0aW9uc1xuICBpZiAob3B0aW9ucy5yYW5kb21pemUpIHtcbiAgICByYW5kb21pemVQb3NpdGlvbnMobGF5b3V0SW5mbyk7XG4gIH1cbiAgdmFyIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gIHZhciByZWZyZXNoID0gZnVuY3Rpb24gcmVmcmVzaCgpIHtcbiAgICByZWZyZXNoUG9zaXRpb25zKGxheW91dEluZm8sIGN5LCBvcHRpb25zKTtcblxuICAgIC8vIEZpdCB0aGUgZ3JhcGggaWYgbmVjZXNzYXJ5XG4gICAgaWYgKHRydWUgPT09IG9wdGlvbnMuZml0KSB7XG4gICAgICBjeS5maXQob3B0aW9ucy5wYWRkaW5nKTtcbiAgICB9XG4gIH07XG4gIHZhciBtYWluTG9vcCA9IGZ1bmN0aW9uIG1haW5Mb29wKGkpIHtcbiAgICBpZiAobGF5b3V0LnN0b3BwZWQgfHwgaSA+PSBvcHRpb25zLm51bUl0ZXIpIHtcbiAgICAgIC8vIGxvZ0RlYnVnKFwiTGF5b3V0IG1hbnVhbGx5IHN0b3BwZWQuIFN0b3BwaW5nIGNvbXB1dGF0aW9uIGluIHN0ZXAgXCIgKyBpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBEbyBvbmUgc3RlcCBpbiB0aGUgcGhpc2ljYWwgc2ltdWxhdGlvblxuICAgIHN0ZXAobGF5b3V0SW5mbywgb3B0aW9ucyk7XG5cbiAgICAvLyBVcGRhdGUgdGVtcGVyYXR1cmVcbiAgICBsYXlvdXRJbmZvLnRlbXBlcmF0dXJlID0gbGF5b3V0SW5mby50ZW1wZXJhdHVyZSAqIG9wdGlvbnMuY29vbGluZ0ZhY3RvcjtcbiAgICAvLyBsb2dEZWJ1ZyhcIk5ldyB0ZW1wZXJhdHVyZTogXCIgKyBsYXlvdXRJbmZvLnRlbXBlcmF0dXJlKTtcblxuICAgIGlmIChsYXlvdXRJbmZvLnRlbXBlcmF0dXJlIDwgb3B0aW9ucy5taW5UZW1wKSB7XG4gICAgICAvLyBsb2dEZWJ1ZyhcIlRlbXBlcmF0dXJlIGRyb3AgYmVsb3cgbWluaW11bSB0aHJlc2hvbGQuIFN0b3BwaW5nIGNvbXB1dGF0aW9uIGluIHN0ZXAgXCIgKyBpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIHZhciBkb25lID0gZnVuY3Rpb24gZG9uZSgpIHtcbiAgICBpZiAob3B0aW9ucy5hbmltYXRlID09PSB0cnVlIHx8IG9wdGlvbnMuYW5pbWF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJlZnJlc2goKTtcblxuICAgICAgLy8gTGF5b3V0IGhhcyBmaW5pc2hlZFxuICAgICAgbGF5b3V0Lm9uZSgnbGF5b3V0c3RvcCcsIG9wdGlvbnMuc3RvcCk7XG4gICAgICBsYXlvdXQuZW1pdCh7XG4gICAgICAgIHR5cGU6ICdsYXlvdXRzdG9wJyxcbiAgICAgICAgbGF5b3V0OiBsYXlvdXRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbm9kZXMgPSBvcHRpb25zLmVsZXMubm9kZXMoKTtcbiAgICAgIHZhciBnZXRTY2FsZWRQb3MgPSBnZXRTY2FsZUluQm91bmRzRm4obGF5b3V0SW5mbywgb3B0aW9ucywgbm9kZXMpO1xuICAgICAgbm9kZXMubGF5b3V0UG9zaXRpb25zKGxheW91dCwgb3B0aW9ucywgZ2V0U2NhbGVkUG9zKTtcbiAgICB9XG4gIH07XG4gIHZhciBpID0gMDtcbiAgdmFyIGxvb3BSZXQgPSB0cnVlO1xuICBpZiAob3B0aW9ucy5hbmltYXRlID09PSB0cnVlKSB7XG4gICAgdmFyIGZyYW1lID0gZnVuY3Rpb24gZnJhbWUoKSB7XG4gICAgICB2YXIgZiA9IDA7XG4gICAgICB3aGlsZSAobG9vcFJldCAmJiBmIDwgb3B0aW9ucy5yZWZyZXNoKSB7XG4gICAgICAgIGxvb3BSZXQgPSBtYWluTG9vcChpKTtcbiAgICAgICAgaSsrO1xuICAgICAgICBmKys7XG4gICAgICB9XG4gICAgICBpZiAoIWxvb3BSZXQpIHtcbiAgICAgICAgLy8gaXQncyBkb25lXG4gICAgICAgIHNlcGFyYXRlQ29tcG9uZW50cyhsYXlvdXRJbmZvLCBvcHRpb25zKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5vdyA9IHBlcmZvcm1hbmNlTm93KCk7XG4gICAgICAgIGlmIChub3cgLSBzdGFydFRpbWUgPj0gb3B0aW9ucy5hbmltYXRpb25UaHJlc2hvbGQpIHtcbiAgICAgICAgICByZWZyZXNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZyYW1lKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZyYW1lKCk7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKGxvb3BSZXQpIHtcbiAgICAgIGxvb3BSZXQgPSBtYWluTG9vcChpKTtcbiAgICAgIGkrKztcbiAgICB9XG4gICAgc2VwYXJhdGVDb21wb25lbnRzKGxheW91dEluZm8sIG9wdGlvbnMpO1xuICAgIGRvbmUoKTtcbiAgfVxuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbi8qKlxuICogQGJyaWVmIDogY2FsbGVkIG9uIGNvbnRpbnVvdXMgbGF5b3V0cyB0byBzdG9wIHRoZW0gYmVmb3JlIHRoZXkgZmluaXNoXG4gKi9cbkNvc2VMYXlvdXQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuc3RvcHBlZCA9IHRydWU7XG4gIGlmICh0aGlzLnRocmVhZCkge1xuICAgIHRoaXMudGhyZWFkLnN0b3AoKTtcbiAgfVxuICB0aGlzLmVtaXQoJ2xheW91dHN0b3AnKTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG5Db3NlTGF5b3V0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy50aHJlYWQpIHtcbiAgICB0aGlzLnRocmVhZC5zdG9wKCk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG4vKipcbiAqIEBicmllZiAgICAgOiBDcmVhdGVzIGFuIG9iamVjdCB3aGljaCBpcyBjb250YWlucyBhbGwgdGhlIGRhdGFcbiAqICAgICAgICAgICAgICB1c2VkIGluIHRoZSBsYXlvdXQgcHJvY2Vzc1xuICogQGFyZyBjeSAgICA6IGN5dG9zY2FwZS5qcyBvYmplY3RcbiAqIEByZXR1cm4gICAgOiBsYXlvdXRJbmZvIG9iamVjdCBpbml0aWFsaXplZFxuICovXG52YXIgY3JlYXRlTGF5b3V0SW5mbyA9IGZ1bmN0aW9uIGNyZWF0ZUxheW91dEluZm8oY3ksIGxheW91dCwgb3B0aW9ucykge1xuICAvLyBTaG9ydGN1dFxuICB2YXIgZWRnZXMgPSBvcHRpb25zLmVsZXMuZWRnZXMoKTtcbiAgdmFyIG5vZGVzID0gb3B0aW9ucy5lbGVzLm5vZGVzKCk7XG4gIHZhciBiYiA9IG1ha2VCb3VuZGluZ0JveChvcHRpb25zLmJvdW5kaW5nQm94ID8gb3B0aW9ucy5ib3VuZGluZ0JveCA6IHtcbiAgICB4MTogMCxcbiAgICB5MTogMCxcbiAgICB3OiBjeS53aWR0aCgpLFxuICAgIGg6IGN5LmhlaWdodCgpXG4gIH0pO1xuICB2YXIgbGF5b3V0SW5mbyA9IHtcbiAgICBpc0NvbXBvdW5kOiBjeS5oYXNDb21wb3VuZE5vZGVzKCksXG4gICAgbGF5b3V0Tm9kZXM6IFtdLFxuICAgIGlkVG9JbmRleDoge30sXG4gICAgbm9kZVNpemU6IG5vZGVzLnNpemUoKSxcbiAgICBncmFwaFNldDogW10sXG4gICAgaW5kZXhUb0dyYXBoOiBbXSxcbiAgICBsYXlvdXRFZGdlczogW10sXG4gICAgZWRnZVNpemU6IGVkZ2VzLnNpemUoKSxcbiAgICB0ZW1wZXJhdHVyZTogb3B0aW9ucy5pbml0aWFsVGVtcCxcbiAgICBjbGllbnRXaWR0aDogYmIudyxcbiAgICBjbGllbnRIZWlnaHQ6IGJiLmgsXG4gICAgYm91bmRpbmdCb3g6IGJiXG4gIH07XG4gIHZhciBjb21wb25lbnRzID0gb3B0aW9ucy5lbGVzLmNvbXBvbmVudHMoKTtcbiAgdmFyIGlkMmNtcHRJZCA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tpXTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbXBvbmVudC5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIG5vZGUgPSBjb21wb25lbnRbal07XG4gICAgICBpZDJjbXB0SWRbbm9kZS5pZCgpXSA9IGk7XG4gICAgfVxuICB9XG5cbiAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBub2RlcywgY3JlYXRpbmcgbGF5b3V0IG5vZGVzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ub2RlU2l6ZTsgaSsrKSB7XG4gICAgdmFyIG4gPSBub2Rlc1tpXTtcbiAgICB2YXIgbmJiID0gbi5sYXlvdXREaW1lbnNpb25zKG9wdGlvbnMpO1xuICAgIHZhciB0ZW1wTm9kZSA9IHt9O1xuICAgIHRlbXBOb2RlLmlzTG9ja2VkID0gbi5sb2NrZWQoKTtcbiAgICB0ZW1wTm9kZS5pZCA9IG4uZGF0YSgnaWQnKTtcbiAgICB0ZW1wTm9kZS5wYXJlbnRJZCA9IG4uZGF0YSgncGFyZW50Jyk7XG4gICAgdGVtcE5vZGUuY21wdElkID0gaWQyY21wdElkW24uaWQoKV07XG4gICAgdGVtcE5vZGUuY2hpbGRyZW4gPSBbXTtcbiAgICB0ZW1wTm9kZS5wb3NpdGlvblggPSBuLnBvc2l0aW9uKCd4Jyk7XG4gICAgdGVtcE5vZGUucG9zaXRpb25ZID0gbi5wb3NpdGlvbigneScpO1xuICAgIHRlbXBOb2RlLm9mZnNldFggPSAwO1xuICAgIHRlbXBOb2RlLm9mZnNldFkgPSAwO1xuICAgIHRlbXBOb2RlLmhlaWdodCA9IG5iYi53O1xuICAgIHRlbXBOb2RlLndpZHRoID0gbmJiLmg7XG4gICAgdGVtcE5vZGUubWF4WCA9IHRlbXBOb2RlLnBvc2l0aW9uWCArIHRlbXBOb2RlLndpZHRoIC8gMjtcbiAgICB0ZW1wTm9kZS5taW5YID0gdGVtcE5vZGUucG9zaXRpb25YIC0gdGVtcE5vZGUud2lkdGggLyAyO1xuICAgIHRlbXBOb2RlLm1heFkgPSB0ZW1wTm9kZS5wb3NpdGlvblkgKyB0ZW1wTm9kZS5oZWlnaHQgLyAyO1xuICAgIHRlbXBOb2RlLm1pblkgPSB0ZW1wTm9kZS5wb3NpdGlvblkgLSB0ZW1wTm9kZS5oZWlnaHQgLyAyO1xuICAgIHRlbXBOb2RlLnBhZExlZnQgPSBwYXJzZUZsb2F0KG4uc3R5bGUoJ3BhZGRpbmcnKSk7XG4gICAgdGVtcE5vZGUucGFkUmlnaHQgPSBwYXJzZUZsb2F0KG4uc3R5bGUoJ3BhZGRpbmcnKSk7XG4gICAgdGVtcE5vZGUucGFkVG9wID0gcGFyc2VGbG9hdChuLnN0eWxlKCdwYWRkaW5nJykpO1xuICAgIHRlbXBOb2RlLnBhZEJvdHRvbSA9IHBhcnNlRmxvYXQobi5zdHlsZSgncGFkZGluZycpKTtcblxuICAgIC8vIGZvcmNlc1xuICAgIHRlbXBOb2RlLm5vZGVSZXB1bHNpb24gPSBmbiQ2KG9wdGlvbnMubm9kZVJlcHVsc2lvbikgPyBvcHRpb25zLm5vZGVSZXB1bHNpb24obikgOiBvcHRpb25zLm5vZGVSZXB1bHNpb247XG5cbiAgICAvLyBBZGQgbmV3IG5vZGVcbiAgICBsYXlvdXRJbmZvLmxheW91dE5vZGVzLnB1c2godGVtcE5vZGUpO1xuICAgIC8vIEFkZCBlbnRyeSB0byBpZC1pbmRleCBtYXBcbiAgICBsYXlvdXRJbmZvLmlkVG9JbmRleFt0ZW1wTm9kZS5pZF0gPSBpO1xuICB9XG5cbiAgLy8gSW5saW5lIGltcGxlbWVudGF0aW9uIG9mIGEgcXVldWUsIHVzZWQgZm9yIHRyYXZlcnNpbmcgdGhlIGdyYXBoIGluIEJGUyBvcmRlclxuICB2YXIgcXVldWUgPSBbXTtcbiAgdmFyIHN0YXJ0ID0gMDsgLy8gUG9pbnRzIHRvIHRoZSBzdGFydCB0aGUgcXVldWVcbiAgdmFyIGVuZCA9IC0xOyAvLyBQb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcblxuICB2YXIgdGVtcEdyYXBoID0gW107XG5cbiAgLy8gU2Vjb25kIHBhc3MgdG8gYWRkIGNoaWxkIGluZm9ybWF0aW9uIGFuZFxuICAvLyBpbml0aWFsaXplIHF1ZXVlIGZvciBoaWVyYXJjaGljYWwgdHJhdmVyc2FsXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ub2RlU2l6ZTsgaSsrKSB7XG4gICAgdmFyIG4gPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2ldO1xuICAgIHZhciBwX2lkID0gbi5wYXJlbnRJZDtcbiAgICAvLyBDaGVjayBpZiBub2RlIG4gaGFzIGEgcGFyZW50IG5vZGVcbiAgICBpZiAobnVsbCAhPSBwX2lkKSB7XG4gICAgICAvLyBBZGQgbm9kZSBJZCB0byBwYXJlbnQncyBsaXN0IG9mIGNoaWxkcmVuXG4gICAgICBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W3BfaWRdXS5jaGlsZHJlbi5wdXNoKG4uaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBhIG5vZGUgZG9lc24ndCBoYXZlIGEgcGFyZW50LCB0aGVuIGl0J3MgaW4gdGhlIHJvb3QgZ3JhcGhcbiAgICAgIHF1ZXVlWysrZW5kXSA9IG4uaWQ7XG4gICAgICB0ZW1wR3JhcGgucHVzaChuLmlkKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgcm9vdCBncmFwaCB0byBncmFwaFNldFxuICBsYXlvdXRJbmZvLmdyYXBoU2V0LnB1c2godGVtcEdyYXBoKTtcblxuICAvLyBUcmF2ZXJzZSB0aGUgZ3JhcGgsIGxldmVsIGJ5IGxldmVsLFxuICB3aGlsZSAoc3RhcnQgPD0gZW5kKSB7XG4gICAgLy8gR2V0IHRoZSBub2RlIHRvIHZpc2l0IGFuZCByZW1vdmUgaXQgZnJvbSBxdWV1ZVxuICAgIHZhciBub2RlX2lkID0gcXVldWVbc3RhcnQrK107XG4gICAgdmFyIG5vZGVfaXggPSBsYXlvdXRJbmZvLmlkVG9JbmRleFtub2RlX2lkXTtcbiAgICB2YXIgbm9kZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbm9kZV9peF07XG4gICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQWRkIGNoaWxkcmVuIG5vZGVzIGFzIGEgbmV3IGdyYXBoIHRvIGdyYXBoIHNldFxuICAgICAgbGF5b3V0SW5mby5ncmFwaFNldC5wdXNoKGNoaWxkcmVuKTtcbiAgICAgIC8vIEFkZCBjaGlsZHJlbiB0byBxdWUgcXVldWUgdG8gYmUgdmlzaXRlZFxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBxdWV1ZVsrK2VuZF0gPSBjaGlsZHJlbltpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDcmVhdGUgaW5kZXhUb0dyYXBoIG1hcFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8uZ3JhcGhTZXQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZ3JhcGggPSBsYXlvdXRJbmZvLmdyYXBoU2V0W2ldO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ3JhcGgubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBpbmRleCA9IGxheW91dEluZm8uaWRUb0luZGV4W2dyYXBoW2pdXTtcbiAgICAgIGxheW91dEluZm8uaW5kZXhUb0dyYXBoW2luZGV4XSA9IGk7XG4gICAgfVxuICB9XG5cbiAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBlZGdlcywgY3JlYXRpbmcgTGF5b3V0IEVkZ2VzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5lZGdlU2l6ZTsgaSsrKSB7XG4gICAgdmFyIGUgPSBlZGdlc1tpXTtcbiAgICB2YXIgdGVtcEVkZ2UgPSB7fTtcbiAgICB0ZW1wRWRnZS5pZCA9IGUuZGF0YSgnaWQnKTtcbiAgICB0ZW1wRWRnZS5zb3VyY2VJZCA9IGUuZGF0YSgnc291cmNlJyk7XG4gICAgdGVtcEVkZ2UudGFyZ2V0SWQgPSBlLmRhdGEoJ3RhcmdldCcpO1xuXG4gICAgLy8gQ29tcHV0ZSBpZGVhbCBsZW5ndGhcbiAgICB2YXIgaWRlYWxMZW5ndGggPSBmbiQ2KG9wdGlvbnMuaWRlYWxFZGdlTGVuZ3RoKSA/IG9wdGlvbnMuaWRlYWxFZGdlTGVuZ3RoKGUpIDogb3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGg7XG4gICAgdmFyIGVsYXN0aWNpdHkgPSBmbiQ2KG9wdGlvbnMuZWRnZUVsYXN0aWNpdHkpID8gb3B0aW9ucy5lZGdlRWxhc3RpY2l0eShlKSA6IG9wdGlvbnMuZWRnZUVsYXN0aWNpdHk7XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGFuIGludGVyIGdyYXBoIGVkZ2VcbiAgICB2YXIgc291cmNlSXggPSBsYXlvdXRJbmZvLmlkVG9JbmRleFt0ZW1wRWRnZS5zb3VyY2VJZF07XG4gICAgdmFyIHRhcmdldEl4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbdGVtcEVkZ2UudGFyZ2V0SWRdO1xuICAgIHZhciBzb3VyY2VHcmFwaCA9IGxheW91dEluZm8uaW5kZXhUb0dyYXBoW3NvdXJjZUl4XTtcbiAgICB2YXIgdGFyZ2V0R3JhcGggPSBsYXlvdXRJbmZvLmluZGV4VG9HcmFwaFt0YXJnZXRJeF07XG4gICAgaWYgKHNvdXJjZUdyYXBoICE9IHRhcmdldEdyYXBoKSB7XG4gICAgICAvLyBGaW5kIGxvd2VzdCBjb21tb24gZ3JhcGggYW5jZXN0b3JcbiAgICAgIHZhciBsY2EgPSBmaW5kTENBKHRlbXBFZGdlLnNvdXJjZUlkLCB0ZW1wRWRnZS50YXJnZXRJZCwgbGF5b3V0SW5mbyk7XG5cbiAgICAgIC8vIENvbXB1dGUgc3VtIG9mIG5vZGUgZGVwdGhzLCByZWxhdGl2ZSB0byBsY2EgZ3JhcGhcbiAgICAgIHZhciBsY2FHcmFwaCA9IGxheW91dEluZm8uZ3JhcGhTZXRbbGNhXTtcbiAgICAgIHZhciBkZXB0aCA9IDA7XG5cbiAgICAgIC8vIFNvdXJjZSBkZXB0aFxuICAgICAgdmFyIHRlbXBOb2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tzb3VyY2VJeF07XG4gICAgICB3aGlsZSAoLTEgPT09IGxjYUdyYXBoLmluZGV4T2YodGVtcE5vZGUuaWQpKSB7XG4gICAgICAgIHRlbXBOb2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFt0ZW1wTm9kZS5wYXJlbnRJZF1dO1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuXG4gICAgICAvLyBUYXJnZXQgZGVwdGhcbiAgICAgIHRlbXBOb2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1t0YXJnZXRJeF07XG4gICAgICB3aGlsZSAoLTEgPT09IGxjYUdyYXBoLmluZGV4T2YodGVtcE5vZGUuaWQpKSB7XG4gICAgICAgIHRlbXBOb2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFt0ZW1wTm9kZS5wYXJlbnRJZF1dO1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuXG4gICAgICAvLyBsb2dEZWJ1ZygnTENBIG9mIG5vZGVzICcgKyB0ZW1wRWRnZS5zb3VyY2VJZCArICcgYW5kICcgKyB0ZW1wRWRnZS50YXJnZXRJZCArXG4gICAgICAvLyAgXCIuIEluZGV4OiBcIiArIGxjYSArIFwiIENvbnRlbnRzOiBcIiArIGxjYUdyYXBoLnRvU3RyaW5nKCkgK1xuICAgICAgLy8gIFwiLiBEZXB0aDogXCIgKyBkZXB0aCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBpZGVhbExlbmd0aFxuICAgICAgaWRlYWxMZW5ndGggKj0gZGVwdGggKiBvcHRpb25zLm5lc3RpbmdGYWN0b3I7XG4gICAgfVxuICAgIHRlbXBFZGdlLmlkZWFsTGVuZ3RoID0gaWRlYWxMZW5ndGg7XG4gICAgdGVtcEVkZ2UuZWxhc3RpY2l0eSA9IGVsYXN0aWNpdHk7XG4gICAgbGF5b3V0SW5mby5sYXlvdXRFZGdlcy5wdXNoKHRlbXBFZGdlKTtcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHJldHVybiBsYXlvdXRJbmZvIG9iamVjdFxuICByZXR1cm4gbGF5b3V0SW5mbztcbn07XG5cbi8qKlxuICogQGJyaWVmIDogVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgaW5kZXggb2YgdGhlIGxvd2VzdCBjb21tb25cbiAqICAgICAgICAgIGdyYXBoIGFuY2VzdG9yIGJldHdlZW4gMiBub2RlcyBpbiB0aGUgc3VidHJlZVxuICogICAgICAgICAgKGZyb20gdGhlIGdyYXBoIGhpZXJhcmNoeSBpbmR1Y2VkIHRyZWUpIHdob3NlXG4gKiAgICAgICAgICByb290IGlzIGdyYXBoSXhcbiAqXG4gKiBAYXJnIG5vZGUxOiBub2RlMSdzIElEXG4gKiBAYXJnIG5vZGUyOiBub2RlMidzIElEXG4gKiBAYXJnIGxheW91dEluZm86IGxheW91dEluZm8gb2JqZWN0XG4gKlxuICovXG52YXIgZmluZExDQSA9IGZ1bmN0aW9uIGZpbmRMQ0Eobm9kZTEsIG5vZGUyLCBsYXlvdXRJbmZvKSB7XG4gIC8vIEZpbmQgdGhlaXIgY29tbW9uIGFuY2VzdGVyLCBzdGFydGluZyBmcm9tIHRoZSByb290IGdyYXBoXG4gIHZhciByZXMgPSBmaW5kTENBX2F1eChub2RlMSwgbm9kZTIsIDAsIGxheW91dEluZm8pO1xuICBpZiAoMiA+IHJlcy5jb3VudCkge1xuICAgIC8vIElmIGF1eCBmdW5jdGlvbiBjb3VsZG4ndCBmaW5kIHRoZSBjb21tb24gYW5jZXN0ZXIsXG4gICAgLy8gdGhlbiBpdCBpcyB0aGUgcm9vdCBncmFwaFxuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXMuZ3JhcGg7XG4gIH1cbn07XG5cbi8qKlxuICogQGJyaWVmICAgICAgICAgIDogQXV4aWxpYXJ5IGZ1bmN0aW9uIHVzZWQgZm9yIExDQSBjb21wdXRhdGlvblxuICpcbiAqIEBhcmcgbm9kZTEgICAgICA6IG5vZGUxJ3MgSURcbiAqIEBhcmcgbm9kZTIgICAgICA6IG5vZGUyJ3MgSURcbiAqIEBhcmcgZ3JhcGhJeCAgICA6IHN1YmdyYXBoIGluZGV4XG4gKiBAYXJnIGxheW91dEluZm8gOiBsYXlvdXRJbmZvIG9iamVjdFxuICpcbiAqIEByZXR1cm4gICAgICAgICA6IG9iamVjdCBvZiB0aGUgZm9ybSB7Y291bnQ6IFgsIGdyYXBoOiBZfSwgd2hlcmU6XG4gKiAgICAgICAgICAgICAgICAgICBYIGlzIHRoZSBudW1iZXIgb2YgYW5jZXN0b3JzIChtYXg6IDIpIGZvdW5kIGluXG4gKiAgICAgICAgICAgICAgICAgICBncmFwaEl4IChhbmQgaXQncyBzdWJncmFwaHMpLFxuICogICAgICAgICAgICAgICAgICAgWSBpcyB0aGUgZ3JhcGggaW5kZXggb2YgdGhlIGxvd2VzdCBncmFwaCBjb250YWluaW5nXG4gKiAgICAgICAgICAgICAgICAgICBhbGwgWCBub2Rlc1xuICovXG52YXIgZmluZExDQV9hdXggPSBmdW5jdGlvbiBmaW5kTENBX2F1eChub2RlMSwgbm9kZTIsIGdyYXBoSXgsIGxheW91dEluZm8pIHtcbiAgdmFyIGdyYXBoID0gbGF5b3V0SW5mby5ncmFwaFNldFtncmFwaEl4XTtcbiAgLy8gSWYgYm90aCBub2RlcyBiZWxvbmdzIHRvIGdyYXBoSXhcbiAgaWYgKC0xIDwgZ3JhcGguaW5kZXhPZihub2RlMSkgJiYgLTEgPCBncmFwaC5pbmRleE9mKG5vZGUyKSkge1xuICAgIHJldHVybiB7XG4gICAgICBjb3VudDogMixcbiAgICAgIGdyYXBoOiBncmFwaEl4XG4gICAgfTtcbiAgfVxuXG4gIC8vIE1ha2UgcmVjdXJzaXZlIGNhbGxzIGZvciBhbGwgc3ViZ3JhcGhzXG4gIHZhciBjID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBncmFwaC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlSWQgPSBncmFwaFtpXTtcbiAgICB2YXIgbm9kZUl4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbbm9kZUlkXTtcbiAgICB2YXIgY2hpbGRyZW4gPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW25vZGVJeF0uY2hpbGRyZW47XG5cbiAgICAvLyBJZiB0aGUgbm9kZSBoYXMgbm8gY2hpbGQsIHNraXAgaXRcbiAgICBpZiAoMCA9PT0gY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGNoaWxkR3JhcGhJeCA9IGxheW91dEluZm8uaW5kZXhUb0dyYXBoW2xheW91dEluZm8uaWRUb0luZGV4W2NoaWxkcmVuWzBdXV07XG4gICAgdmFyIHJlc3VsdCA9IGZpbmRMQ0FfYXV4KG5vZGUxLCBub2RlMiwgY2hpbGRHcmFwaEl4LCBsYXlvdXRJbmZvKTtcbiAgICBpZiAoMCA9PT0gcmVzdWx0LmNvdW50KSB7XG4gICAgICAvLyBOZWl0aGVyIG5vZGUxIG5vciBub2RlMiBhcmUgcHJlc2VudCBpbiB0aGlzIHN1YmdyYXBoXG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKDEgPT09IHJlc3VsdC5jb3VudCkge1xuICAgICAgLy8gT25lIG9mIChub2RlMSwgbm9kZTIpIGlzIHByZXNlbnQgaW4gdGhpcyBzdWJncmFwaFxuICAgICAgYysrO1xuICAgICAgaWYgKDIgPT09IGMpIHtcbiAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBmb3VuZCBib3RoIG5vZGVzLCBubyBuZWVkIHRvIGtlZXAgc2VhcmNoaW5nXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCb3RoIG5vZGVzIGFyZSBwcmVzZW50IGluIHRoaXMgc3ViZ3JhcGhcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgY291bnQ6IGMsXG4gICAgZ3JhcGg6IGdyYXBoSXhcbiAgfTtcbn07XG5cbi8qKlxuICogQGJyaWVmOiBwcmludHNMYXlvdXRJbmZvIGludG8ganMgY29uc29sZVxuICogICAgICAgICBPbmx5IHVzZWQgZm9yIGRlYmJ1Z2luZ1xuICovXG52YXIgcHJpbnRMYXlvdXRJbmZvOyBcblxuLyoqXG4gKiBAYnJpZWYgOiBSYW5kb21pemVzIHRoZSBwb3NpdGlvbiBvZiBhbGwgbm9kZXNcbiAqL1xudmFyIHJhbmRvbWl6ZVBvc2l0aW9ucyA9IGZ1bmN0aW9uIHJhbmRvbWl6ZVBvc2l0aW9ucyhsYXlvdXRJbmZvLCBjeSkge1xuICB2YXIgd2lkdGggPSBsYXlvdXRJbmZvLmNsaWVudFdpZHRoO1xuICB2YXIgaGVpZ2h0ID0gbGF5b3V0SW5mby5jbGllbnRIZWlnaHQ7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ub2RlU2l6ZTsgaSsrKSB7XG4gICAgdmFyIG4gPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2ldO1xuXG4gICAgLy8gTm8gbmVlZCB0byByYW5kb21pemUgY29tcG91bmQgbm9kZXMgb3IgbG9ja2VkIG5vZGVzXG4gICAgaWYgKDAgPT09IG4uY2hpbGRyZW4ubGVuZ3RoICYmICFuLmlzTG9ja2VkKSB7XG4gICAgICBuLnBvc2l0aW9uWCA9IE1hdGgucmFuZG9tKCkgKiB3aWR0aDtcbiAgICAgIG4ucG9zaXRpb25ZID0gTWF0aC5yYW5kb20oKSAqIGhlaWdodDtcbiAgICB9XG4gIH1cbn07XG52YXIgZ2V0U2NhbGVJbkJvdW5kc0ZuID0gZnVuY3Rpb24gZ2V0U2NhbGVJbkJvdW5kc0ZuKGxheW91dEluZm8sIG9wdGlvbnMsIG5vZGVzKSB7XG4gIHZhciBiYiA9IGxheW91dEluZm8uYm91bmRpbmdCb3g7XG4gIHZhciBjb3NlQkIgPSB7XG4gICAgeDE6IEluZmluaXR5LFxuICAgIHgyOiAtSW5maW5pdHksXG4gICAgeTE6IEluZmluaXR5LFxuICAgIHkyOiAtSW5maW5pdHlcbiAgfTtcbiAgaWYgKG9wdGlvbnMuYm91bmRpbmdCb3gpIHtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICB2YXIgbG5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W25vZGUuZGF0YSgnaWQnKV1dO1xuICAgICAgY29zZUJCLngxID0gTWF0aC5taW4oY29zZUJCLngxLCBsbm9kZS5wb3NpdGlvblgpO1xuICAgICAgY29zZUJCLngyID0gTWF0aC5tYXgoY29zZUJCLngyLCBsbm9kZS5wb3NpdGlvblgpO1xuICAgICAgY29zZUJCLnkxID0gTWF0aC5taW4oY29zZUJCLnkxLCBsbm9kZS5wb3NpdGlvblkpO1xuICAgICAgY29zZUJCLnkyID0gTWF0aC5tYXgoY29zZUJCLnkyLCBsbm9kZS5wb3NpdGlvblkpO1xuICAgIH0pO1xuICAgIGNvc2VCQi53ID0gY29zZUJCLngyIC0gY29zZUJCLngxO1xuICAgIGNvc2VCQi5oID0gY29zZUJCLnkyIC0gY29zZUJCLnkxO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoZWxlLCBpKSB7XG4gICAgdmFyIGxub2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtlbGUuZGF0YSgnaWQnKV1dO1xuICAgIGlmIChvcHRpb25zLmJvdW5kaW5nQm94KSB7XG4gICAgICAvLyB0aGVuIGFkZCBleHRyYSBib3VuZGluZyBib3ggY29uc3RyYWludFxuICAgICAgdmFyIHBjdFggPSAobG5vZGUucG9zaXRpb25YIC0gY29zZUJCLngxKSAvIGNvc2VCQi53O1xuICAgICAgdmFyIHBjdFkgPSAobG5vZGUucG9zaXRpb25ZIC0gY29zZUJCLnkxKSAvIGNvc2VCQi5oO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogYmIueDEgKyBwY3RYICogYmIudyxcbiAgICAgICAgeTogYmIueTEgKyBwY3RZICogYmIuaFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogbG5vZGUucG9zaXRpb25YLFxuICAgICAgICB5OiBsbm9kZS5wb3NpdGlvbllcbiAgICAgIH07XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBAYnJpZWYgICAgICAgICAgOiBVcGRhdGVzIHRoZSBwb3NpdGlvbnMgb2Ygbm9kZXMgaW4gdGhlIG5ldHdvcmtcbiAqIEBhcmcgbGF5b3V0SW5mbyA6IExheW91dEluZm8gb2JqZWN0XG4gKiBAYXJnIGN5ICAgICAgICAgOiBDeXRvc2NhcGUgb2JqZWN0XG4gKiBAYXJnIG9wdGlvbnMgICAgOiBMYXlvdXQgb3B0aW9uc1xuICovXG52YXIgcmVmcmVzaFBvc2l0aW9ucyA9IGZ1bmN0aW9uIHJlZnJlc2hQb3NpdGlvbnMobGF5b3V0SW5mbywgY3ksIG9wdGlvbnMpIHtcbiAgLy8gdmFyIHMgPSAnUmVmcmVzaGluZyBwb3NpdGlvbnMnO1xuICAvLyBsb2dEZWJ1ZyhzKTtcblxuICB2YXIgbGF5b3V0ID0gb3B0aW9ucy5sYXlvdXQ7XG4gIHZhciBub2RlcyA9IG9wdGlvbnMuZWxlcy5ub2RlcygpO1xuICB2YXIgZ2V0U2NhbGVkUG9zID0gZ2V0U2NhbGVJbkJvdW5kc0ZuKGxheW91dEluZm8sIG9wdGlvbnMsIG5vZGVzKTtcbiAgbm9kZXMucG9zaXRpb25zKGdldFNjYWxlZFBvcyk7XG5cbiAgLy8gVHJpZ2dlciBsYXlvdXRSZWFkeSBvbmx5IG9uIGZpcnN0IGNhbGxcbiAgaWYgKHRydWUgIT09IGxheW91dEluZm8ucmVhZHkpIHtcbiAgICAvLyBzID0gJ1RyaWdnZXJpbmcgbGF5b3V0cmVhZHknO1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuICAgIGxheW91dEluZm8ucmVhZHkgPSB0cnVlO1xuICAgIGxheW91dC5vbmUoJ2xheW91dHJlYWR5Jywgb3B0aW9ucy5yZWFkeSk7XG4gICAgbGF5b3V0LmVtaXQoe1xuICAgICAgdHlwZTogJ2xheW91dHJlYWR5JyxcbiAgICAgIGxheW91dDogdGhpc1xuICAgIH0pO1xuICB9XG59O1xuXG4vKipcbiAqIEBicmllZiA6IExvZ3MgYSBkZWJ1ZyBtZXNzYWdlIGluIEpTIGNvbnNvbGUsIGlmIERFQlVHIGlzIE9OXG4gKi9cbi8vIHZhciBsb2dEZWJ1ZyA9IGZ1bmN0aW9uKHRleHQpIHtcbi8vICAgaWYgKERFQlVHKSB7XG4vLyAgICAgY29uc29sZS5kZWJ1Zyh0ZXh0KTtcbi8vICAgfVxuLy8gfTtcblxuLyoqXG4gKiBAYnJpZWYgICAgICAgICAgOiBQZXJmb3JtcyBvbmUgaXRlcmF0aW9uIG9mIHRoZSBwaHlzaWNhbCBzaW11bGF0aW9uXG4gKiBAYXJnIGxheW91dEluZm8gOiBMYXlvdXRJbmZvIG9iamVjdCBhbHJlYWR5IGluaXRpYWxpemVkXG4gKiBAYXJnIGN5ICAgICAgICAgOiBDeXRvc2NhcGUgb2JqZWN0XG4gKiBAYXJnIG9wdGlvbnMgICAgOiBMYXlvdXQgb3B0aW9uc1xuICovXG52YXIgc3RlcCA9IGZ1bmN0aW9uIHN0ZXAobGF5b3V0SW5mbywgb3B0aW9ucywgX3N0ZXApIHtcbiAgLy8gdmFyIHMgPSBcIlxcblxcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcIjtcbiAgLy8gcyArPSBcIlxcblNURVA6IFwiICsgc3RlcDtcbiAgLy8gcyArPSBcIlxcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcXG5cIjtcbiAgLy8gbG9nRGVidWcocyk7XG5cbiAgLy8gQ2FsY3VsYXRlIG5vZGUgcmVwdWxzaW9uc1xuICBjYWxjdWxhdGVOb2RlRm9yY2VzKGxheW91dEluZm8sIG9wdGlvbnMpO1xuICAvLyBDYWxjdWxhdGUgZWRnZSBmb3JjZXNcbiAgY2FsY3VsYXRlRWRnZUZvcmNlcyhsYXlvdXRJbmZvKTtcbiAgLy8gQ2FsY3VsYXRlIGdyYXZpdHkgZm9yY2VzXG4gIGNhbGN1bGF0ZUdyYXZpdHlGb3JjZXMobGF5b3V0SW5mbywgb3B0aW9ucyk7XG4gIC8vIFByb3BhZ2F0ZSBmb3JjZXMgZnJvbSBwYXJlbnQgdG8gY2hpbGRcbiAgcHJvcGFnYXRlRm9yY2VzKGxheW91dEluZm8pO1xuICAvLyBVcGRhdGUgcG9zaXRpb25zIGJhc2VkIG9uIGNhbGN1bGF0ZWQgZm9yY2VzXG4gIHVwZGF0ZVBvc2l0aW9ucyhsYXlvdXRJbmZvKTtcbn07XG5cbi8qKlxuICogQGJyaWVmIDogQ29tcHV0ZXMgdGhlIG5vZGUgcmVwdWxzaW9uIGZvcmNlc1xuICovXG52YXIgY2FsY3VsYXRlTm9kZUZvcmNlcyA9IGZ1bmN0aW9uIGNhbGN1bGF0ZU5vZGVGb3JjZXMobGF5b3V0SW5mbywgb3B0aW9ucykge1xuICAvLyBHbyB0aHJvdWdoIGVhY2ggb2YgdGhlIGdyYXBocyBpbiBncmFwaFNldFxuICAvLyBOb2RlcyBvbmx5IHJlcGVsIGVhY2ggb3RoZXIgaWYgdGhleSBiZWxvbmcgdG8gdGhlIHNhbWUgZ3JhcGhcbiAgLy8gdmFyIHMgPSAnY2FsY3VsYXRlTm9kZUZvcmNlcyc7XG4gIC8vIGxvZ0RlYnVnKHMpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8uZ3JhcGhTZXQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZ3JhcGggPSBsYXlvdXRJbmZvLmdyYXBoU2V0W2ldO1xuICAgIHZhciBudW1Ob2RlcyA9IGdyYXBoLmxlbmd0aDtcblxuICAgIC8vIHMgPSBcIlNldDogXCIgKyBncmFwaC50b1N0cmluZygpO1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuXG4gICAgLy8gTm93IGdldCBhbGwgdGhlIHBhaXJzIG9mIG5vZGVzXG4gICAgLy8gT25seSBnZXQgZWFjaCBwYWlyIG9uY2UsIChBLCBCKSA9IChCLCBBKVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbnVtTm9kZXM7IGorKykge1xuICAgICAgdmFyIG5vZGUxID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtncmFwaFtqXV1dO1xuICAgICAgZm9yICh2YXIgayA9IGogKyAxOyBrIDwgbnVtTm9kZXM7IGsrKykge1xuICAgICAgICB2YXIgbm9kZTIgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2xheW91dEluZm8uaWRUb0luZGV4W2dyYXBoW2tdXV07XG4gICAgICAgIG5vZGVSZXB1bHNpb24obm9kZTEsIG5vZGUyLCBsYXlvdXRJbmZvLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG52YXIgcmFuZG9tRGlzdGFuY2UgPSBmdW5jdGlvbiByYW5kb21EaXN0YW5jZShtYXgpIHtcbiAgcmV0dXJuIC1tYXggKyAyICogbWF4ICogTWF0aC5yYW5kb20oKTtcbn07XG5cbi8qKlxuICogQGJyaWVmIDogQ29tcHV0ZSB0aGUgbm9kZSByZXB1bHNpb24gZm9yY2VzIGJldHdlZW4gYSBwYWlyIG9mIG5vZGVzXG4gKi9cbnZhciBub2RlUmVwdWxzaW9uID0gZnVuY3Rpb24gbm9kZVJlcHVsc2lvbihub2RlMSwgbm9kZTIsIGxheW91dEluZm8sIG9wdGlvbnMpIHtcbiAgLy8gdmFyIHMgPSBcIk5vZGUgcmVwdWxzaW9uLiBOb2RlMTogXCIgKyBub2RlMS5pZCArIFwiIE5vZGUyOiBcIiArIG5vZGUyLmlkO1xuXG4gIHZhciBjbXB0SWQxID0gbm9kZTEuY21wdElkO1xuICB2YXIgY21wdElkMiA9IG5vZGUyLmNtcHRJZDtcbiAgaWYgKGNtcHRJZDEgIT09IGNtcHRJZDIgJiYgIWxheW91dEluZm8uaXNDb21wb3VuZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEdldCBkaXJlY3Rpb24gb2YgbGluZSBjb25uZWN0aW5nIGJvdGggbm9kZSBjZW50ZXJzXG4gIHZhciBkaXJlY3Rpb25YID0gbm9kZTIucG9zaXRpb25YIC0gbm9kZTEucG9zaXRpb25YO1xuICB2YXIgZGlyZWN0aW9uWSA9IG5vZGUyLnBvc2l0aW9uWSAtIG5vZGUxLnBvc2l0aW9uWTtcbiAgdmFyIG1heFJhbmREaXN0ID0gMTtcbiAgLy8gcyArPSBcIlxcbmRpcmVjdGlvblg6IFwiICsgZGlyZWN0aW9uWCArIFwiLCBkaXJlY3Rpb25ZOiBcIiArIGRpcmVjdGlvblk7XG5cbiAgLy8gSWYgYm90aCBjZW50ZXJzIGFyZSB0aGUgc2FtZSwgYXBwbHkgYSByYW5kb20gZm9yY2VcbiAgaWYgKDAgPT09IGRpcmVjdGlvblggJiYgMCA9PT0gZGlyZWN0aW9uWSkge1xuICAgIGRpcmVjdGlvblggPSByYW5kb21EaXN0YW5jZShtYXhSYW5kRGlzdCk7XG4gICAgZGlyZWN0aW9uWSA9IHJhbmRvbURpc3RhbmNlKG1heFJhbmREaXN0KTtcbiAgfVxuICB2YXIgb3ZlcmxhcCA9IG5vZGVzT3ZlcmxhcChub2RlMSwgbm9kZTIsIGRpcmVjdGlvblgsIGRpcmVjdGlvblkpO1xuICBpZiAob3ZlcmxhcCA+IDApIHtcbiAgICAvLyBzICs9IFwiXFxuTm9kZXMgRE8gb3ZlcmxhcC5cIjtcbiAgICAvLyBzICs9IFwiXFxuT3ZlcmxhcDogXCIgKyBvdmVybGFwO1xuICAgIC8vIElmIG5vZGVzIG92ZXJsYXAsIHJlcHVsc2lvbiBmb3JjZSBpcyBwcm9wb3J0aW9uYWxcbiAgICAvLyB0byB0aGUgb3ZlcmxhcFxuICAgIHZhciBmb3JjZSA9IG9wdGlvbnMubm9kZU92ZXJsYXAgKiBvdmVybGFwO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgbW9kdWxlIGFuZCBjb21wb25lbnRzIG9mIHRoZSBmb3JjZSB2ZWN0b3JcbiAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGlyZWN0aW9uWCAqIGRpcmVjdGlvblggKyBkaXJlY3Rpb25ZICogZGlyZWN0aW9uWSk7XG4gICAgLy8gcyArPSBcIlxcbkRpc3RhbmNlOiBcIiArIGRpc3RhbmNlO1xuICAgIHZhciBmb3JjZVggPSBmb3JjZSAqIGRpcmVjdGlvblggLyBkaXN0YW5jZTtcbiAgICB2YXIgZm9yY2VZID0gZm9yY2UgKiBkaXJlY3Rpb25ZIC8gZGlzdGFuY2U7XG4gIH0gZWxzZSB7XG4gICAgLy8gcyArPSBcIlxcbk5vZGVzIGRvIE5PVCBvdmVybGFwLlwiO1xuICAgIC8vIElmIHRoZXJlJ3Mgbm8gb3ZlcmxhcCwgZm9yY2UgaXMgaW52ZXJzZWx5IHByb3BvcnRpb25hbFxuICAgIC8vIHRvIHNxdWFyZWQgZGlzdGFuY2VcblxuICAgIC8vIEdldCBjbGlwcGluZyBwb2ludHMgZm9yIGJvdGggbm9kZXNcbiAgICB2YXIgcG9pbnQxID0gZmluZENsaXBwaW5nUG9pbnQobm9kZTEsIGRpcmVjdGlvblgsIGRpcmVjdGlvblkpO1xuICAgIHZhciBwb2ludDIgPSBmaW5kQ2xpcHBpbmdQb2ludChub2RlMiwgLTEgKiBkaXJlY3Rpb25YLCAtMSAqIGRpcmVjdGlvblkpO1xuXG4gICAgLy8gVXNlIGNsaXBwaW5nIHBvaW50cyB0byBjb21wdXRlIGRpc3RhbmNlXG4gICAgdmFyIGRpc3RhbmNlWCA9IHBvaW50Mi54IC0gcG9pbnQxLng7XG4gICAgdmFyIGRpc3RhbmNlWSA9IHBvaW50Mi55IC0gcG9pbnQxLnk7XG4gICAgdmFyIGRpc3RhbmNlU3FyID0gZGlzdGFuY2VYICogZGlzdGFuY2VYICsgZGlzdGFuY2VZICogZGlzdGFuY2VZO1xuICAgIHZhciBkaXN0YW5jZSA9IE1hdGguc3FydChkaXN0YW5jZVNxcik7XG4gICAgLy8gcyArPSBcIlxcbkRpc3RhbmNlOiBcIiArIGRpc3RhbmNlO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgbW9kdWxlIGFuZCBjb21wb25lbnRzIG9mIHRoZSBmb3JjZSB2ZWN0b3JcbiAgICB2YXIgZm9yY2UgPSAobm9kZTEubm9kZVJlcHVsc2lvbiArIG5vZGUyLm5vZGVSZXB1bHNpb24pIC8gZGlzdGFuY2VTcXI7XG4gICAgdmFyIGZvcmNlWCA9IGZvcmNlICogZGlzdGFuY2VYIC8gZGlzdGFuY2U7XG4gICAgdmFyIGZvcmNlWSA9IGZvcmNlICogZGlzdGFuY2VZIC8gZGlzdGFuY2U7XG4gIH1cblxuICAvLyBBcHBseSBmb3JjZVxuICBpZiAoIW5vZGUxLmlzTG9ja2VkKSB7XG4gICAgbm9kZTEub2Zmc2V0WCAtPSBmb3JjZVg7XG4gICAgbm9kZTEub2Zmc2V0WSAtPSBmb3JjZVk7XG4gIH1cbiAgaWYgKCFub2RlMi5pc0xvY2tlZCkge1xuICAgIG5vZGUyLm9mZnNldFggKz0gZm9yY2VYO1xuICAgIG5vZGUyLm9mZnNldFkgKz0gZm9yY2VZO1xuICB9XG5cbiAgLy8gcyArPSBcIlxcbkZvcmNlWDogXCIgKyBmb3JjZVggKyBcIiBGb3JjZVk6IFwiICsgZm9yY2VZO1xuICAvLyBsb2dEZWJ1ZyhzKTtcblxuICByZXR1cm47XG59O1xuXG4vKipcbiAqIEBicmllZiAgOiBEZXRlcm1pbmVzIHdoZXRoZXIgdHdvIG5vZGVzIG92ZXJsYXAgb3Igbm90XG4gKiBAcmV0dXJuIDogQW1vdW50IG9mIG92ZXJsYXBwaW5nICgwID0+IG5vIG92ZXJsYXApXG4gKi9cbnZhciBub2Rlc092ZXJsYXAgPSBmdW5jdGlvbiBub2Rlc092ZXJsYXAobm9kZTEsIG5vZGUyLCBkWCwgZFkpIHtcbiAgaWYgKGRYID4gMCkge1xuICAgIHZhciBvdmVybGFwWCA9IG5vZGUxLm1heFggLSBub2RlMi5taW5YO1xuICB9IGVsc2Uge1xuICAgIHZhciBvdmVybGFwWCA9IG5vZGUyLm1heFggLSBub2RlMS5taW5YO1xuICB9XG4gIGlmIChkWSA+IDApIHtcbiAgICB2YXIgb3ZlcmxhcFkgPSBub2RlMS5tYXhZIC0gbm9kZTIubWluWTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgb3ZlcmxhcFkgPSBub2RlMi5tYXhZIC0gbm9kZTEubWluWTtcbiAgfVxuICBpZiAob3ZlcmxhcFggPj0gMCAmJiBvdmVybGFwWSA+PSAwKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydChvdmVybGFwWCAqIG92ZXJsYXBYICsgb3ZlcmxhcFkgKiBvdmVybGFwWSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbi8qKlxuICogQGJyaWVmIDogRmluZHMgdGhlIHBvaW50IGluIHdoaWNoIGFuIGVkZ2UgKGRpcmVjdGlvbiBkWCwgZFkpIGludGVyc2VjdHNcbiAqICAgICAgICAgIHRoZSByZWN0YW5ndWxhciBib3VuZGluZyBib3ggb2YgaXQncyBzb3VyY2UvdGFyZ2V0IG5vZGVcbiAqL1xudmFyIGZpbmRDbGlwcGluZ1BvaW50ID0gZnVuY3Rpb24gZmluZENsaXBwaW5nUG9pbnQobm9kZSwgZFgsIGRZKSB7XG4gIC8vIFNob3JjdXRzXG4gIHZhciBYID0gbm9kZS5wb3NpdGlvblg7XG4gIHZhciBZID0gbm9kZS5wb3NpdGlvblk7XG4gIHZhciBIID0gbm9kZS5oZWlnaHQgfHwgMTtcbiAgdmFyIFcgPSBub2RlLndpZHRoIHx8IDE7XG4gIHZhciBkaXJTbG9wZSA9IGRZIC8gZFg7XG4gIHZhciBub2RlU2xvcGUgPSBIIC8gVztcblxuICAvLyB2YXIgcyA9ICdDb21wdXRpbmcgY2xpcHBpbmcgcG9pbnQgb2Ygbm9kZSAnICsgbm9kZS5pZCArXG4gIC8vICAgXCIgLiBIZWlnaHQ6ICBcIiArIEggKyBcIiwgV2lkdGg6IFwiICsgVyArXG4gIC8vICAgXCJcXG5EaXJlY3Rpb24gXCIgKyBkWCArIFwiLCBcIiArIGRZO1xuICAvL1xuICAvLyBDb21wdXRlIGludGVyc2VjdGlvblxuICB2YXIgcmVzID0ge307XG5cbiAgLy8gQ2FzZTogVmVydGljYWwgZGlyZWN0aW9uICh1cClcbiAgaWYgKDAgPT09IGRYICYmIDAgPCBkWSkge1xuICAgIHJlcy54ID0gWDtcbiAgICAvLyBzICs9IFwiXFxuVXAgZGlyZWN0aW9uXCI7XG4gICAgcmVzLnkgPSBZICsgSCAvIDI7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8vIENhc2U6IFZlcnRpY2FsIGRpcmVjdGlvbiAoZG93bilcbiAgaWYgKDAgPT09IGRYICYmIDAgPiBkWSkge1xuICAgIHJlcy54ID0gWDtcbiAgICByZXMueSA9IFkgKyBIIC8gMjtcbiAgICAvLyBzICs9IFwiXFxuRG93biBkaXJlY3Rpb25cIjtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvLyBDYXNlOiBJbnRlcnNlY3RzIHRoZSByaWdodCBib3JkZXJcbiAgaWYgKDAgPCBkWCAmJiAtMSAqIG5vZGVTbG9wZSA8PSBkaXJTbG9wZSAmJiBkaXJTbG9wZSA8PSBub2RlU2xvcGUpIHtcbiAgICByZXMueCA9IFggKyBXIC8gMjtcbiAgICByZXMueSA9IFkgKyBXICogZFkgLyAyIC8gZFg7XG4gICAgLy8gcyArPSBcIlxcblJpZ2h0Ym9yZGVyXCI7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLy8gQ2FzZTogSW50ZXJzZWN0cyB0aGUgbGVmdCBib3JkZXJcbiAgaWYgKDAgPiBkWCAmJiAtMSAqIG5vZGVTbG9wZSA8PSBkaXJTbG9wZSAmJiBkaXJTbG9wZSA8PSBub2RlU2xvcGUpIHtcbiAgICByZXMueCA9IFggLSBXIC8gMjtcbiAgICByZXMueSA9IFkgLSBXICogZFkgLyAyIC8gZFg7XG4gICAgLy8gcyArPSBcIlxcbkxlZnRib3JkZXJcIjtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvLyBDYXNlOiBJbnRlcnNlY3RzIHRoZSB0b3AgYm9yZGVyXG4gIGlmICgwIDwgZFkgJiYgKGRpclNsb3BlIDw9IC0xICogbm9kZVNsb3BlIHx8IGRpclNsb3BlID49IG5vZGVTbG9wZSkpIHtcbiAgICByZXMueCA9IFggKyBIICogZFggLyAyIC8gZFk7XG4gICAgcmVzLnkgPSBZICsgSCAvIDI7XG4gICAgLy8gcyArPSBcIlxcblRvcCBib3JkZXJcIjtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvLyBDYXNlOiBJbnRlcnNlY3RzIHRoZSBib3R0b20gYm9yZGVyXG4gIGlmICgwID4gZFkgJiYgKGRpclNsb3BlIDw9IC0xICogbm9kZVNsb3BlIHx8IGRpclNsb3BlID49IG5vZGVTbG9wZSkpIHtcbiAgICByZXMueCA9IFggLSBIICogZFggLyAyIC8gZFk7XG4gICAgcmVzLnkgPSBZIC0gSCAvIDI7XG4gICAgLy8gcyArPSBcIlxcbkJvdHRvbSBib3JkZXJcIjtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvLyBzICs9IFwiXFxuQ2xpcHBpbmcgcG9pbnQgZm91bmQgYXQgXCIgKyByZXMueCArIFwiLCBcIiArIHJlcy55O1xuICAvLyBsb2dEZWJ1ZyhzKTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbi8qKlxuICogQGJyaWVmIDogQ2FsY3VsYXRlcyBhbGwgZWRnZSBmb3JjZXNcbiAqL1xudmFyIGNhbGN1bGF0ZUVkZ2VGb3JjZXMgPSBmdW5jdGlvbiBjYWxjdWxhdGVFZGdlRm9yY2VzKGxheW91dEluZm8sIG9wdGlvbnMpIHtcbiAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBlZGdlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8uZWRnZVNpemU7IGkrKykge1xuICAgIC8vIEdldCBlZGdlLCBzb3VyY2UgJiB0YXJnZXQgbm9kZXNcbiAgICB2YXIgZWRnZSA9IGxheW91dEluZm8ubGF5b3V0RWRnZXNbaV07XG4gICAgdmFyIHNvdXJjZUl4ID0gbGF5b3V0SW5mby5pZFRvSW5kZXhbZWRnZS5zb3VyY2VJZF07XG4gICAgdmFyIHNvdXJjZSA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbc291cmNlSXhdO1xuICAgIHZhciB0YXJnZXRJeCA9IGxheW91dEluZm8uaWRUb0luZGV4W2VkZ2UudGFyZ2V0SWRdO1xuICAgIHZhciB0YXJnZXQgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW3RhcmdldEl4XTtcblxuICAgIC8vIEdldCBkaXJlY3Rpb24gb2YgbGluZSBjb25uZWN0aW5nIGJvdGggbm9kZSBjZW50ZXJzXG4gICAgdmFyIGRpcmVjdGlvblggPSB0YXJnZXQucG9zaXRpb25YIC0gc291cmNlLnBvc2l0aW9uWDtcbiAgICB2YXIgZGlyZWN0aW9uWSA9IHRhcmdldC5wb3NpdGlvblkgLSBzb3VyY2UucG9zaXRpb25ZO1xuXG4gICAgLy8gSWYgYm90aCBjZW50ZXJzIGFyZSB0aGUgc2FtZSwgZG8gbm90aGluZy5cbiAgICAvLyBBIHJhbmRvbSBmb3JjZSBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQgYXMgbm9kZSByZXB1bHNpb25cbiAgICBpZiAoMCA9PT0gZGlyZWN0aW9uWCAmJiAwID09PSBkaXJlY3Rpb25ZKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgY2xpcHBpbmcgcG9pbnRzIGZvciBib3RoIG5vZGVzXG4gICAgdmFyIHBvaW50MSA9IGZpbmRDbGlwcGluZ1BvaW50KHNvdXJjZSwgZGlyZWN0aW9uWCwgZGlyZWN0aW9uWSk7XG4gICAgdmFyIHBvaW50MiA9IGZpbmRDbGlwcGluZ1BvaW50KHRhcmdldCwgLTEgKiBkaXJlY3Rpb25YLCAtMSAqIGRpcmVjdGlvblkpO1xuICAgIHZhciBseCA9IHBvaW50Mi54IC0gcG9pbnQxLng7XG4gICAgdmFyIGx5ID0gcG9pbnQyLnkgLSBwb2ludDEueTtcbiAgICB2YXIgbCA9IE1hdGguc3FydChseCAqIGx4ICsgbHkgKiBseSk7XG4gICAgdmFyIGZvcmNlID0gTWF0aC5wb3coZWRnZS5pZGVhbExlbmd0aCAtIGwsIDIpIC8gZWRnZS5lbGFzdGljaXR5O1xuICAgIGlmICgwICE9PSBsKSB7XG4gICAgICB2YXIgZm9yY2VYID0gZm9yY2UgKiBseCAvIGw7XG4gICAgICB2YXIgZm9yY2VZID0gZm9yY2UgKiBseSAvIGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmb3JjZVggPSAwO1xuICAgICAgdmFyIGZvcmNlWSA9IDA7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoaXMgZm9yY2UgdG8gdGFyZ2V0IGFuZCBzb3VyY2Ugbm9kZXNcbiAgICBpZiAoIXNvdXJjZS5pc0xvY2tlZCkge1xuICAgICAgc291cmNlLm9mZnNldFggKz0gZm9yY2VYO1xuICAgICAgc291cmNlLm9mZnNldFkgKz0gZm9yY2VZO1xuICAgIH1cbiAgICBpZiAoIXRhcmdldC5pc0xvY2tlZCkge1xuICAgICAgdGFyZ2V0Lm9mZnNldFggLT0gZm9yY2VYO1xuICAgICAgdGFyZ2V0Lm9mZnNldFkgLT0gZm9yY2VZO1xuICAgIH1cblxuICAgIC8vIHZhciBzID0gJ0VkZ2UgZm9yY2UgYmV0d2VlbiBub2RlcyAnICsgc291cmNlLmlkICsgJyBhbmQgJyArIHRhcmdldC5pZDtcbiAgICAvLyBzICs9IFwiXFxuRGlzdGFuY2U6IFwiICsgbCArIFwiIEZvcmNlOiAoXCIgKyBmb3JjZVggKyBcIiwgXCIgKyBmb3JjZVkgKyBcIilcIjtcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBDb21wdXRlcyBncmF2aXR5IGZvcmNlcyBmb3IgYWxsIG5vZGVzXG4gKi9cbnZhciBjYWxjdWxhdGVHcmF2aXR5Rm9yY2VzID0gZnVuY3Rpb24gY2FsY3VsYXRlR3Jhdml0eUZvcmNlcyhsYXlvdXRJbmZvLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLmdyYXZpdHkgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGRpc3RUaHJlc2hvbGQgPSAxO1xuXG4gIC8vIHZhciBzID0gJ2NhbGN1bGF0ZUdyYXZpdHlGb3JjZXMnO1xuICAvLyBsb2dEZWJ1ZyhzKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLmdyYXBoU2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGdyYXBoID0gbGF5b3V0SW5mby5ncmFwaFNldFtpXTtcbiAgICB2YXIgbnVtTm9kZXMgPSBncmFwaC5sZW5ndGg7XG5cbiAgICAvLyBzID0gXCJTZXQ6IFwiICsgZ3JhcGgudG9TdHJpbmcoKTtcbiAgICAvLyBsb2dEZWJ1ZyhzKTtcblxuICAgIC8vIENvbXB1dGUgZ3JhcGggY2VudGVyXG4gICAgaWYgKDAgPT09IGkpIHtcbiAgICAgIHZhciBjZW50ZXJYID0gbGF5b3V0SW5mby5jbGllbnRIZWlnaHQgLyAyO1xuICAgICAgdmFyIGNlbnRlclkgPSBsYXlvdXRJbmZvLmNsaWVudFdpZHRoIC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gR2V0IFBhcmVudCBub2RlIGZvciB0aGlzIGdyYXBoLCBhbmQgdXNlIGl0cyBwb3NpdGlvbiBhcyBjZW50ZXJcbiAgICAgIHZhciB0ZW1wID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtncmFwaFswXV1dO1xuICAgICAgdmFyIHBhcmVudCA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbbGF5b3V0SW5mby5pZFRvSW5kZXhbdGVtcC5wYXJlbnRJZF1dO1xuICAgICAgdmFyIGNlbnRlclggPSBwYXJlbnQucG9zaXRpb25YO1xuICAgICAgdmFyIGNlbnRlclkgPSBwYXJlbnQucG9zaXRpb25ZO1xuICAgIH1cbiAgICAvLyBzID0gXCJDZW50ZXIgZm91bmQgYXQ6IFwiICsgY2VudGVyWCArIFwiLCBcIiArIGNlbnRlclk7XG4gICAgLy8gbG9nRGVidWcocyk7XG5cbiAgICAvLyBBcHBseSBmb3JjZSB0byBhbGwgbm9kZXMgaW4gZ3JhcGhcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG51bU5vZGVzOyBqKyspIHtcbiAgICAgIHZhciBub2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtncmFwaFtqXV1dO1xuICAgICAgLy8gcyA9IFwiTm9kZTogXCIgKyBub2RlLmlkO1xuXG4gICAgICBpZiAobm9kZS5pc0xvY2tlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBkeCA9IGNlbnRlclggLSBub2RlLnBvc2l0aW9uWDtcbiAgICAgIHZhciBkeSA9IGNlbnRlclkgLSBub2RlLnBvc2l0aW9uWTtcbiAgICAgIHZhciBkID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcbiAgICAgIGlmIChkID4gZGlzdFRocmVzaG9sZCkge1xuICAgICAgICB2YXIgZnggPSBvcHRpb25zLmdyYXZpdHkgKiBkeCAvIGQ7XG4gICAgICAgIHZhciBmeSA9IG9wdGlvbnMuZ3Jhdml0eSAqIGR5IC8gZDtcbiAgICAgICAgbm9kZS5vZmZzZXRYICs9IGZ4O1xuICAgICAgICBub2RlLm9mZnNldFkgKz0gZnk7XG4gICAgICAgIC8vIHMgKz0gXCI6IEFwcGxpZWQgZm9yY2U6IFwiICsgZnggKyBcIiwgXCIgKyBmeTtcbiAgICAgIH1cbiAgICAgIC8vIGxvZ0RlYnVnKHMpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBAYnJpZWYgICAgICAgICAgOiBUaGlzIGZ1bmN0aW9uIHByb3BhZ2F0ZXMgdGhlIGV4aXN0aW5nIG9mZnNldHMgZnJvbVxuICogICAgICAgICAgICAgICAgICAgcGFyZW50IG5vZGVzIHRvIGl0cyBkZXNjZW5kZW50cy5cbiAqIEBhcmcgbGF5b3V0SW5mbyA6IGxheW91dEluZm8gT2JqZWN0XG4gKiBAYXJnIGN5ICAgICAgICAgOiBjeXRvc2NhcGUgT2JqZWN0XG4gKiBAYXJnIG9wdGlvbnMgICAgOiBMYXlvdXQgb3B0aW9uc1xuICovXG52YXIgcHJvcGFnYXRlRm9yY2VzID0gZnVuY3Rpb24gcHJvcGFnYXRlRm9yY2VzKGxheW91dEluZm8sIG9wdGlvbnMpIHtcbiAgLy8gSW5saW5lIGltcGxlbWVudGF0aW9uIG9mIGEgcXVldWUsIHVzZWQgZm9yIHRyYXZlcnNpbmcgdGhlIGdyYXBoIGluIEJGUyBvcmRlclxuICB2YXIgcXVldWUgPSBbXTtcbiAgdmFyIHN0YXJ0ID0gMDsgLy8gUG9pbnRzIHRvIHRoZSBzdGFydCB0aGUgcXVldWVcbiAgdmFyIGVuZCA9IC0xOyAvLyBQb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcblxuICAvLyBsb2dEZWJ1ZygncHJvcGFnYXRlRm9yY2VzJyk7XG5cbiAgLy8gU3RhcnQgYnkgdmlzaXRpbmcgdGhlIG5vZGVzIGluIHRoZSByb290IGdyYXBoXG4gIHF1ZXVlLnB1c2guYXBwbHkocXVldWUsIGxheW91dEluZm8uZ3JhcGhTZXRbMF0pO1xuICBlbmQgKz0gbGF5b3V0SW5mby5ncmFwaFNldFswXS5sZW5ndGg7XG5cbiAgLy8gVHJhdmVyc2UgdGhlIGdyYXBoLCBsZXZlbCBieSBsZXZlbCxcbiAgd2hpbGUgKHN0YXJ0IDw9IGVuZCkge1xuICAgIC8vIEdldCB0aGUgbm9kZSB0byB2aXNpdCBhbmQgcmVtb3ZlIGl0IGZyb20gcXVldWVcbiAgICB2YXIgbm9kZUlkID0gcXVldWVbc3RhcnQrK107XG4gICAgdmFyIG5vZGVJbmRleCA9IGxheW91dEluZm8uaWRUb0luZGV4W25vZGVJZF07XG4gICAgdmFyIG5vZGUgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW25vZGVJbmRleF07XG4gICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcblxuICAgIC8vIFdlIG9ubHkgbmVlZCB0byBwcm9jZXNzIHRoZSBub2RlIGlmIGl0J3MgY29tcG91bmRcbiAgICBpZiAoMCA8IGNoaWxkcmVuLmxlbmd0aCAmJiAhbm9kZS5pc0xvY2tlZCkge1xuICAgICAgdmFyIG9mZlggPSBub2RlLm9mZnNldFg7XG4gICAgICB2YXIgb2ZmWSA9IG5vZGUub2Zmc2V0WTtcblxuICAgICAgLy8gdmFyIHMgPSBcIlByb3BhZ2F0aW5nIG9mZnNldCBmcm9tIHBhcmVudCBub2RlIDogXCIgKyBub2RlLmlkICtcbiAgICAgIC8vICAgXCIuIE9mZnNldFg6IFwiICsgb2ZmWCArIFwiLiBPZmZzZXRZOiBcIiArIG9mZlk7XG4gICAgICAvLyBzICs9IFwiXFxuIENoaWxkcmVuOiBcIiArIGNoaWxkcmVuLnRvU3RyaW5nKCk7XG4gICAgICAvLyBsb2dEZWJ1ZyhzKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGROb2RlID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtjaGlsZHJlbltpXV1dO1xuICAgICAgICAvLyBQcm9wYWdhdGUgb2Zmc2V0XG4gICAgICAgIGNoaWxkTm9kZS5vZmZzZXRYICs9IG9mZlg7XG4gICAgICAgIGNoaWxkTm9kZS5vZmZzZXRZICs9IG9mZlk7XG4gICAgICAgIC8vIEFkZCBjaGlsZHJlbiB0byBxdWV1ZSB0byBiZSB2aXNpdGVkXG4gICAgICAgIHF1ZXVlWysrZW5kXSA9IGNoaWxkcmVuW2ldO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNldCBwYXJlbnQgb2Zmc2V0c1xuICAgICAgbm9kZS5vZmZzZXRYID0gMDtcbiAgICAgIG5vZGUub2Zmc2V0WSA9IDA7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEBicmllZiA6IFVwZGF0ZXMgdGhlIGxheW91dCBtb2RlbCBwb3NpdGlvbnMsIGJhc2VkIG9uXG4gKiAgICAgICAgICB0aGUgYWNjdW11bGF0ZWQgZm9yY2VzXG4gKi9cbnZhciB1cGRhdGVQb3NpdGlvbnMgPSBmdW5jdGlvbiB1cGRhdGVQb3NpdGlvbnMobGF5b3V0SW5mbywgb3B0aW9ucykge1xuICAvLyB2YXIgcyA9ICdVcGRhdGluZyBwb3NpdGlvbnMnO1xuICAvLyBsb2dEZWJ1ZyhzKTtcblxuICAvLyBSZXNldCBib3VuZGFyaWVzIGZvciBjb21wb3VuZCBub2Rlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheW91dEluZm8ubm9kZVNpemU7IGkrKykge1xuICAgIHZhciBuID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tpXTtcbiAgICBpZiAoMCA8IG4uY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAvLyBsb2dEZWJ1ZyhcIlJlc2V0dGluZyBib3VuZGFyaWVzIG9mIGNvbXBvdW5kIG5vZGU6IFwiICsgbi5pZCk7XG4gICAgICBuLm1heFggPSB1bmRlZmluZWQ7XG4gICAgICBuLm1pblggPSB1bmRlZmluZWQ7XG4gICAgICBuLm1heFkgPSB1bmRlZmluZWQ7XG4gICAgICBuLm1pblkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5b3V0SW5mby5ub2RlU2l6ZTsgaSsrKSB7XG4gICAgdmFyIG4gPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzW2ldO1xuICAgIGlmICgwIDwgbi5jaGlsZHJlbi5sZW5ndGggfHwgbi5pc0xvY2tlZCkge1xuICAgICAgLy8gTm8gbmVlZCB0byBzZXQgY29tcG91bmQgb3IgbG9ja2VkIG5vZGUgcG9zaXRpb25cbiAgICAgIC8vIGxvZ0RlYnVnKFwiU2tpcHBpbmcgcG9zaXRpb24gdXBkYXRlIG9mIG5vZGU6IFwiICsgbi5pZCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gcyA9IFwiTm9kZTogXCIgKyBuLmlkICsgXCIgUHJldmlvdXMgcG9zaXRpb246IChcIiArXG4gICAgLy8gbi5wb3NpdGlvblggKyBcIiwgXCIgKyBuLnBvc2l0aW9uWSArIFwiKS5cIjtcblxuICAgIC8vIExpbWl0IGRpc3BsYWNlbWVudCBpbiBvcmRlciB0byBpbXByb3ZlIHN0YWJpbGl0eVxuICAgIHZhciB0ZW1wRm9yY2UgPSBsaW1pdEZvcmNlKG4ub2Zmc2V0WCwgbi5vZmZzZXRZLCBsYXlvdXRJbmZvLnRlbXBlcmF0dXJlKTtcbiAgICBuLnBvc2l0aW9uWCArPSB0ZW1wRm9yY2UueDtcbiAgICBuLnBvc2l0aW9uWSArPSB0ZW1wRm9yY2UueTtcbiAgICBuLm9mZnNldFggPSAwO1xuICAgIG4ub2Zmc2V0WSA9IDA7XG4gICAgbi5taW5YID0gbi5wb3NpdGlvblggLSBuLndpZHRoO1xuICAgIG4ubWF4WCA9IG4ucG9zaXRpb25YICsgbi53aWR0aDtcbiAgICBuLm1pblkgPSBuLnBvc2l0aW9uWSAtIG4uaGVpZ2h0O1xuICAgIG4ubWF4WSA9IG4ucG9zaXRpb25ZICsgbi5oZWlnaHQ7XG4gICAgLy8gcyArPSBcIiBOZXcgUG9zaXRpb246IChcIiArIG4ucG9zaXRpb25YICsgXCIsIFwiICsgbi5wb3NpdGlvblkgKyBcIikuXCI7XG4gICAgLy8gbG9nRGVidWcocyk7XG5cbiAgICAvLyBVcGRhdGUgYW5jZXN0cnkgYm91ZGFyaWVzXG4gICAgdXBkYXRlQW5jZXN0cnlCb3VuZGFyaWVzKG4sIGxheW91dEluZm8pO1xuICB9XG5cbiAgLy8gVXBkYXRlIHNpemUsIHBvc2l0aW9uIG9mIGNvbXB1bmQgbm9kZXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXlvdXRJbmZvLm5vZGVTaXplOyBpKyspIHtcbiAgICB2YXIgbiA9IGxheW91dEluZm8ubGF5b3V0Tm9kZXNbaV07XG4gICAgaWYgKDAgPCBuLmNoaWxkcmVuLmxlbmd0aCAmJiAhbi5pc0xvY2tlZCkge1xuICAgICAgbi5wb3NpdGlvblggPSAobi5tYXhYICsgbi5taW5YKSAvIDI7XG4gICAgICBuLnBvc2l0aW9uWSA9IChuLm1heFkgKyBuLm1pblkpIC8gMjtcbiAgICAgIG4ud2lkdGggPSBuLm1heFggLSBuLm1pblg7XG4gICAgICBuLmhlaWdodCA9IG4ubWF4WSAtIG4ubWluWTtcbiAgICAgIC8vIHMgPSBcIlVwZGF0aW5nIHBvc2l0aW9uLCBzaXplIG9mIGNvbXBvdW5kIG5vZGUgXCIgKyBuLmlkO1xuICAgICAgLy8gcyArPSBcIlxcblBvc2l0aW9uWDogXCIgKyBuLnBvc2l0aW9uWCArIFwiLCBQb3NpdGlvblk6IFwiICsgbi5wb3NpdGlvblk7XG4gICAgICAvLyBzICs9IFwiXFxuV2lkdGg6IFwiICsgbi53aWR0aCArIFwiLCBIZWlnaHQ6IFwiICsgbi5oZWlnaHQ7XG4gICAgICAvLyBsb2dEZWJ1ZyhzKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQGJyaWVmIDogTGltaXRzIGEgZm9yY2UgKGZvcmNlWCwgZm9yY2VZKSB0byBiZSBub3RcbiAqICAgICAgICAgIGdyZWF0ZXIgKGluIG1vZHVsbykgdGhhbiBtYXguXG4gOCAgICAgICAgICBQcmVzZXJ2ZXMgZm9yY2UgZGlyZWN0aW9uLlxuICAqL1xudmFyIGxpbWl0Rm9yY2UgPSBmdW5jdGlvbiBsaW1pdEZvcmNlKGZvcmNlWCwgZm9yY2VZLCBtYXgpIHtcbiAgLy8gdmFyIHMgPSBcIkxpbWl0aW5nIGZvcmNlOiAoXCIgKyBmb3JjZVggKyBcIiwgXCIgKyBmb3JjZVkgKyBcIikuIE1heDogXCIgKyBtYXg7XG4gIHZhciBmb3JjZSA9IE1hdGguc3FydChmb3JjZVggKiBmb3JjZVggKyBmb3JjZVkgKiBmb3JjZVkpO1xuICBpZiAoZm9yY2UgPiBtYXgpIHtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgeDogbWF4ICogZm9yY2VYIC8gZm9yY2UsXG4gICAgICB5OiBtYXggKiBmb3JjZVkgLyBmb3JjZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdmFyIHJlcyA9IHtcbiAgICAgIHg6IGZvcmNlWCxcbiAgICAgIHk6IGZvcmNlWVxuICAgIH07XG4gIH1cblxuICAvLyBzICs9IFwiLlxcblJlc3VsdDogKFwiICsgcmVzLnggKyBcIiwgXCIgKyByZXMueSArIFwiKVwiO1xuICAvLyBsb2dEZWJ1ZyhzKTtcblxuICByZXR1cm4gcmVzO1xufTtcblxuLyoqXG4gKiBAYnJpZWYgOiBGdW5jdGlvbiB1c2VkIGZvciBrZWVwaW5nIHRyYWNrIG9mIGNvbXBvdW5kIG5vZGVcbiAqICAgICAgICAgIHNpemVzLCBzaW5jZSB0aGV5IHNob3VsZCBib3VuZCBhbGwgdGhlaXIgc3Vibm9kZXMuXG4gKi9cbnZhciB1cGRhdGVBbmNlc3RyeUJvdW5kYXJpZXMgPSBmdW5jdGlvbiB1cGRhdGVBbmNlc3RyeUJvdW5kYXJpZXMobm9kZSwgbGF5b3V0SW5mbykge1xuICAvLyB2YXIgcyA9IFwiUHJvcGFnYXRpbmcgbmV3IHBvc2l0aW9uL3NpemUgb2Ygbm9kZSBcIiArIG5vZGUuaWQ7XG4gIHZhciBwYXJlbnRJZCA9IG5vZGUucGFyZW50SWQ7XG4gIGlmIChudWxsID09IHBhcmVudElkKSB7XG4gICAgLy8gSWYgdGhlcmUncyBubyBwYXJlbnQsIHdlIGFyZSBkb25lXG4gICAgLy8gcyArPSBcIi4gTm8gcGFyZW50IG5vZGUuXCI7XG4gICAgLy8gbG9nRGVidWcocyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gR2V0IFBhcmVudCBOb2RlXG4gIHZhciBwID0gbGF5b3V0SW5mby5sYXlvdXROb2Rlc1tsYXlvdXRJbmZvLmlkVG9JbmRleFtwYXJlbnRJZF1dO1xuICB2YXIgZmxhZyA9IGZhbHNlO1xuXG4gIC8vIE1heFhcbiAgaWYgKG51bGwgPT0gcC5tYXhYIHx8IG5vZGUubWF4WCArIHAucGFkUmlnaHQgPiBwLm1heFgpIHtcbiAgICBwLm1heFggPSBub2RlLm1heFggKyBwLnBhZFJpZ2h0O1xuICAgIGZsYWcgPSB0cnVlO1xuICAgIC8vIHMgKz0gXCJcXG5OZXcgbWF4WCBmb3IgcGFyZW50IG5vZGUgXCIgKyBwLmlkICsgXCI6IFwiICsgcC5tYXhYO1xuICB9XG5cbiAgLy8gTWluWFxuICBpZiAobnVsbCA9PSBwLm1pblggfHwgbm9kZS5taW5YIC0gcC5wYWRMZWZ0IDwgcC5taW5YKSB7XG4gICAgcC5taW5YID0gbm9kZS5taW5YIC0gcC5wYWRMZWZ0O1xuICAgIGZsYWcgPSB0cnVlO1xuICAgIC8vIHMgKz0gXCJcXG5OZXcgbWluWCBmb3IgcGFyZW50IG5vZGUgXCIgKyBwLmlkICsgXCI6IFwiICsgcC5taW5YO1xuICB9XG5cbiAgLy8gTWF4WVxuICBpZiAobnVsbCA9PSBwLm1heFkgfHwgbm9kZS5tYXhZICsgcC5wYWRCb3R0b20gPiBwLm1heFkpIHtcbiAgICBwLm1heFkgPSBub2RlLm1heFkgKyBwLnBhZEJvdHRvbTtcbiAgICBmbGFnID0gdHJ1ZTtcbiAgICAvLyBzICs9IFwiXFxuTmV3IG1heFkgZm9yIHBhcmVudCBub2RlIFwiICsgcC5pZCArIFwiOiBcIiArIHAubWF4WTtcbiAgfVxuXG4gIC8vIE1pbllcbiAgaWYgKG51bGwgPT0gcC5taW5ZIHx8IG5vZGUubWluWSAtIHAucGFkVG9wIDwgcC5taW5ZKSB7XG4gICAgcC5taW5ZID0gbm9kZS5taW5ZIC0gcC5wYWRUb3A7XG4gICAgZmxhZyA9IHRydWU7XG4gICAgLy8gcyArPSBcIlxcbk5ldyBtaW5ZIGZvciBwYXJlbnQgbm9kZSBcIiArIHAuaWQgKyBcIjogXCIgKyBwLm1pblk7XG4gIH1cblxuICAvLyBJZiB1cGRhdGVkIGJvdW5kYXJpZXMsIHByb3BhZ2F0ZSBjaGFuZ2VzIHVwd2FyZFxuICBpZiAoZmxhZykge1xuICAgIC8vIGxvZ0RlYnVnKHMpO1xuICAgIHJldHVybiB1cGRhdGVBbmNlc3RyeUJvdW5kYXJpZXMocCwgbGF5b3V0SW5mbyk7XG4gIH1cblxuICAvLyBzICs9IFwiLiBObyBjaGFuZ2VzIGluIGJvdW5kYXJpZXMvcG9zaXRpb24gb2YgcGFyZW50IG5vZGUgXCIgKyBwLmlkO1xuICAvLyBsb2dEZWJ1ZyhzKTtcbiAgcmV0dXJuO1xufTtcbnZhciBzZXBhcmF0ZUNvbXBvbmVudHMgPSBmdW5jdGlvbiBzZXBhcmF0ZUNvbXBvbmVudHMobGF5b3V0SW5mbywgb3B0aW9ucykge1xuICB2YXIgbm9kZXMgPSBsYXlvdXRJbmZvLmxheW91dE5vZGVzO1xuICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICB2YXIgY2lkID0gbm9kZS5jbXB0SWQ7XG4gICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbY2lkXSA9IGNvbXBvbmVudHNbY2lkXSB8fCBbXTtcbiAgICBjb21wb25lbnQucHVzaChub2RlKTtcbiAgfVxuICB2YXIgdG90YWxBID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGMgPSBjb21wb25lbnRzW2ldO1xuICAgIGlmICghYykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGMueDEgPSBJbmZpbml0eTtcbiAgICBjLngyID0gLUluZmluaXR5O1xuICAgIGMueTEgPSBJbmZpbml0eTtcbiAgICBjLnkyID0gLUluZmluaXR5O1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgYy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIG4gPSBjW2pdO1xuICAgICAgYy54MSA9IE1hdGgubWluKGMueDEsIG4ucG9zaXRpb25YIC0gbi53aWR0aCAvIDIpO1xuICAgICAgYy54MiA9IE1hdGgubWF4KGMueDIsIG4ucG9zaXRpb25YICsgbi53aWR0aCAvIDIpO1xuICAgICAgYy55MSA9IE1hdGgubWluKGMueTEsIG4ucG9zaXRpb25ZIC0gbi5oZWlnaHQgLyAyKTtcbiAgICAgIGMueTIgPSBNYXRoLm1heChjLnkyLCBuLnBvc2l0aW9uWSArIG4uaGVpZ2h0IC8gMik7XG4gICAgfVxuICAgIGMudyA9IGMueDIgLSBjLngxO1xuICAgIGMuaCA9IGMueTIgLSBjLnkxO1xuICAgIHRvdGFsQSArPSBjLncgKiBjLmg7XG4gIH1cbiAgY29tcG9uZW50cy5zb3J0KGZ1bmN0aW9uIChjMSwgYzIpIHtcbiAgICByZXR1cm4gYzIudyAqIGMyLmggLSBjMS53ICogYzEuaDtcbiAgfSk7XG4gIHZhciB4ID0gMDtcbiAgdmFyIHkgPSAwO1xuICB2YXIgdXNlZFcgPSAwO1xuICB2YXIgcm93SCA9IDA7XG4gIHZhciBtYXhSb3dXID0gTWF0aC5zcXJ0KHRvdGFsQSkgKiBsYXlvdXRJbmZvLmNsaWVudFdpZHRoIC8gbGF5b3V0SW5mby5jbGllbnRIZWlnaHQ7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjID0gY29tcG9uZW50c1tpXTtcbiAgICBpZiAoIWMpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBuID0gY1tqXTtcbiAgICAgIGlmICghbi5pc0xvY2tlZCkge1xuICAgICAgICBuLnBvc2l0aW9uWCArPSB4IC0gYy54MTtcbiAgICAgICAgbi5wb3NpdGlvblkgKz0geSAtIGMueTE7XG4gICAgICB9XG4gICAgfVxuICAgIHggKz0gYy53ICsgb3B0aW9ucy5jb21wb25lbnRTcGFjaW5nO1xuICAgIHVzZWRXICs9IGMudyArIG9wdGlvbnMuY29tcG9uZW50U3BhY2luZztcbiAgICByb3dIID0gTWF0aC5tYXgocm93SCwgYy5oKTtcbiAgICBpZiAodXNlZFcgPiBtYXhSb3dXKSB7XG4gICAgICB5ICs9IHJvd0ggKyBvcHRpb25zLmNvbXBvbmVudFNwYWNpbmc7XG4gICAgICB4ID0gMDtcbiAgICAgIHVzZWRXID0gMDtcbiAgICAgIHJvd0ggPSAwO1xuICAgIH1cbiAgfVxufTtcblxudmFyIGRlZmF1bHRzJDMgPSB7XG4gIGZpdDogdHJ1ZSxcbiAgLy8gd2hldGhlciB0byBmaXQgdGhlIHZpZXdwb3J0IHRvIHRoZSBncmFwaFxuICBwYWRkaW5nOiAzMCxcbiAgLy8gcGFkZGluZyB1c2VkIG9uIGZpdFxuICBib3VuZGluZ0JveDogdW5kZWZpbmVkLFxuICAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgYXZvaWRPdmVybGFwOiB0cnVlLFxuICAvLyBwcmV2ZW50cyBub2RlIG92ZXJsYXAsIG1heSBvdmVyZmxvdyBib3VuZGluZ0JveCBpZiBub3QgZW5vdWdoIHNwYWNlXG4gIGF2b2lkT3ZlcmxhcFBhZGRpbmc6IDEwLFxuICAvLyBleHRyYSBzcGFjaW5nIGFyb3VuZCBub2RlcyB3aGVuIGF2b2lkT3ZlcmxhcDogdHJ1ZVxuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBFeGNsdWRlcyB0aGUgbGFiZWwgd2hlbiBjYWxjdWxhdGluZyBub2RlIGJvdW5kaW5nIGJveGVzIGZvciB0aGUgbGF5b3V0IGFsZ29yaXRobVxuICBzcGFjaW5nRmFjdG9yOiB1bmRlZmluZWQsXG4gIC8vIEFwcGxpZXMgYSBtdWx0aXBsaWNhdGl2ZSBmYWN0b3IgKD4wKSB0byBleHBhbmQgb3IgY29tcHJlc3MgdGhlIG92ZXJhbGwgYXJlYSB0aGF0IHRoZSBub2RlcyB0YWtlIHVwXG4gIGNvbmRlbnNlOiBmYWxzZSxcbiAgLy8gdXNlcyBhbGwgYXZhaWxhYmxlIHNwYWNlIG9uIGZhbHNlLCB1c2VzIG1pbmltYWwgc3BhY2Ugb24gdHJ1ZVxuICByb3dzOiB1bmRlZmluZWQsXG4gIC8vIGZvcmNlIG51bSBvZiByb3dzIGluIHRoZSBncmlkXG4gIGNvbHM6IHVuZGVmaW5lZCxcbiAgLy8gZm9yY2UgbnVtIG9mIGNvbHVtbnMgaW4gdGhlIGdyaWRcbiAgcG9zaXRpb246IGZ1bmN0aW9uIHBvc2l0aW9uKG5vZGUpIHt9LFxuICAvLyByZXR1cm5zIHsgcm93LCBjb2wgfSBmb3IgZWxlbWVudFxuICBzb3J0OiB1bmRlZmluZWQsXG4gIC8vIGEgc29ydGluZyBmdW5jdGlvbiB0byBvcmRlciB0aGUgbm9kZXM7IGUuZy4gZnVuY3Rpb24oYSwgYil7IHJldHVybiBhLmRhdGEoJ3dlaWdodCcpIC0gYi5kYXRhKCd3ZWlnaHQnKSB9XG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0cyBcbn07XG5cbmZ1bmN0aW9uIEdyaWRMYXlvdXQob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoe30sIGRlZmF1bHRzJDMsIG9wdGlvbnMpO1xufVxuR3JpZExheW91dC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcGFyYW1zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgb3B0aW9ucyA9IHBhcmFtcztcbiAgdmFyIGN5ID0gcGFyYW1zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIG5vZGVzID0gZWxlcy5ub2RlcygpLm5vdCgnOnBhcmVudCcpO1xuICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgbm9kZXMgPSBub2Rlcy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gIH1cbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG4gIGlmIChiYi5oID09PSAwIHx8IGJiLncgPT09IDApIHtcbiAgICBlbGVzLm5vZGVzKCkubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGJiLngxLFxuICAgICAgICB5OiBiYi55MVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICAvLyB3aWR0aC9oZWlnaHQgKiBzcGxpdHNeMiA9IGNlbGxzIHdoZXJlIHNwbGl0cyBpcyBudW1iZXIgb2YgdGltZXMgdG8gc3BsaXQgd2lkdGhcbiAgICB2YXIgY2VsbHMgPSBub2Rlcy5zaXplKCk7XG4gICAgdmFyIHNwbGl0cyA9IE1hdGguc3FydChjZWxscyAqIGJiLmggLyBiYi53KTtcbiAgICB2YXIgcm93cyA9IE1hdGgucm91bmQoc3BsaXRzKTtcbiAgICB2YXIgY29scyA9IE1hdGgucm91bmQoYmIudyAvIGJiLmggKiBzcGxpdHMpO1xuICAgIHZhciBzbWFsbCA9IGZ1bmN0aW9uIHNtYWxsKHZhbCkge1xuICAgICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1pbihyb3dzLCBjb2xzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBtaW4gPSBNYXRoLm1pbihyb3dzLCBjb2xzKTtcbiAgICAgICAgaWYgKG1pbiA9PSByb3dzKSB7XG4gICAgICAgICAgcm93cyA9IHZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2xzID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgbGFyZ2UgPSBmdW5jdGlvbiBsYXJnZSh2YWwpIHtcbiAgICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgocm93cywgY29scyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbWF4ID0gTWF0aC5tYXgocm93cywgY29scyk7XG4gICAgICAgIGlmIChtYXggPT0gcm93cykge1xuICAgICAgICAgIHJvd3MgPSB2YWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29scyA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdmFyIG9Sb3dzID0gb3B0aW9ucy5yb3dzO1xuICAgIHZhciBvQ29scyA9IG9wdGlvbnMuY29scyAhPSBudWxsID8gb3B0aW9ucy5jb2xzIDogb3B0aW9ucy5jb2x1bW5zO1xuXG4gICAgLy8gaWYgcm93cyBvciBjb2x1bW5zIHdlcmUgc2V0IGluIG9wdGlvbnMsIHVzZSB0aG9zZSB2YWx1ZXNcbiAgICBpZiAob1Jvd3MgIT0gbnVsbCAmJiBvQ29scyAhPSBudWxsKSB7XG4gICAgICByb3dzID0gb1Jvd3M7XG4gICAgICBjb2xzID0gb0NvbHM7XG4gICAgfSBlbHNlIGlmIChvUm93cyAhPSBudWxsICYmIG9Db2xzID09IG51bGwpIHtcbiAgICAgIHJvd3MgPSBvUm93cztcbiAgICAgIGNvbHMgPSBNYXRoLmNlaWwoY2VsbHMgLyByb3dzKTtcbiAgICB9IGVsc2UgaWYgKG9Sb3dzID09IG51bGwgJiYgb0NvbHMgIT0gbnVsbCkge1xuICAgICAgY29scyA9IG9Db2xzO1xuICAgICAgcm93cyA9IE1hdGguY2VpbChjZWxscyAvIGNvbHMpO1xuICAgIH1cblxuICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIGF1dG9tYXRpYyB2YWx1ZXMgYW5kIGFkanVzdCBhY2NvcmRpbmdseVxuXG4gICAgLy8gaWYgcm91bmRpbmcgd2FzIHVwLCBzZWUgaWYgd2UgY2FuIHJlZHVjZSByb3dzIG9yIGNvbHVtbnNcbiAgICBlbHNlIGlmIChjb2xzICogcm93cyA+IGNlbGxzKSB7XG4gICAgICB2YXIgc20gPSBzbWFsbCgpO1xuICAgICAgdmFyIGxnID0gbGFyZ2UoKTtcblxuICAgICAgLy8gcmVkdWNpbmcgdGhlIHNtYWxsIHNpZGUgdGFrZXMgYXdheSB0aGUgbW9zdCBjZWxscywgc28gdHJ5IGl0IGZpcnN0XG4gICAgICBpZiAoKHNtIC0gMSkgKiBsZyA+PSBjZWxscykge1xuICAgICAgICBzbWFsbChzbSAtIDEpO1xuICAgICAgfSBlbHNlIGlmICgobGcgLSAxKSAqIHNtID49IGNlbGxzKSB7XG4gICAgICAgIGxhcmdlKGxnIC0gMSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIHJvdW5kaW5nIHdhcyB0b28gbG93LCBhZGQgcm93cyBvciBjb2x1bW5zXG4gICAgICB3aGlsZSAoY29scyAqIHJvd3MgPCBjZWxscykge1xuICAgICAgICB2YXIgX3NtID0gc21hbGwoKTtcbiAgICAgICAgdmFyIF9sZyA9IGxhcmdlKCk7XG5cbiAgICAgICAgLy8gdHJ5IHRvIGFkZCB0byBsYXJnZXIgc2lkZSBmaXJzdCAoYWRkcyBsZXNzIGluIG11bHRpcGxpY2F0aW9uKVxuICAgICAgICBpZiAoKF9sZyArIDEpICogX3NtID49IGNlbGxzKSB7XG4gICAgICAgICAgbGFyZ2UoX2xnICsgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc21hbGwoX3NtICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGNlbGxXaWR0aCA9IGJiLncgLyBjb2xzO1xuICAgIHZhciBjZWxsSGVpZ2h0ID0gYmIuaCAvIHJvd3M7XG4gICAgaWYgKG9wdGlvbnMuY29uZGVuc2UpIHtcbiAgICAgIGNlbGxXaWR0aCA9IDA7XG4gICAgICBjZWxsSGVpZ2h0ID0gMDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuYXZvaWRPdmVybGFwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHZhciBwb3MgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uO1xuICAgICAgICBpZiAocG9zLnggPT0gbnVsbCB8fCBwb3MueSA9PSBudWxsKSB7XG4gICAgICAgICAgLy8gZm9yIGJiXG4gICAgICAgICAgcG9zLnggPSAwO1xuICAgICAgICAgIHBvcy55ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmJiID0gbm9kZS5sYXlvdXREaW1lbnNpb25zKG9wdGlvbnMpO1xuICAgICAgICB2YXIgcCA9IG9wdGlvbnMuYXZvaWRPdmVybGFwUGFkZGluZztcbiAgICAgICAgdmFyIHcgPSBuYmIudyArIHA7XG4gICAgICAgIHZhciBoID0gbmJiLmggKyBwO1xuICAgICAgICBjZWxsV2lkdGggPSBNYXRoLm1heChjZWxsV2lkdGgsIHcpO1xuICAgICAgICBjZWxsSGVpZ2h0ID0gTWF0aC5tYXgoY2VsbEhlaWdodCwgaCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBjZWxsVXNlZCA9IHt9OyAvLyBlLmcuICdjLTAtMicgPT4gdHJ1ZVxuXG4gICAgdmFyIHVzZWQgPSBmdW5jdGlvbiB1c2VkKHJvdywgY29sKSB7XG4gICAgICByZXR1cm4gY2VsbFVzZWRbJ2MtJyArIHJvdyArICctJyArIGNvbF0gPyB0cnVlIDogZmFsc2U7XG4gICAgfTtcbiAgICB2YXIgdXNlID0gZnVuY3Rpb24gdXNlKHJvdywgY29sKSB7XG4gICAgICBjZWxsVXNlZFsnYy0nICsgcm93ICsgJy0nICsgY29sXSA9IHRydWU7XG4gICAgfTtcblxuICAgIC8vIHRvIGtlZXAgdHJhY2sgb2YgY3VycmVudCBjZWxsIHBvc2l0aW9uXG4gICAgdmFyIHJvdyA9IDA7XG4gICAgdmFyIGNvbCA9IDA7XG4gICAgdmFyIG1vdmVUb05leHRDZWxsID0gZnVuY3Rpb24gbW92ZVRvTmV4dENlbGwoKSB7XG4gICAgICBjb2wrKztcbiAgICAgIGlmIChjb2wgPj0gY29scykge1xuICAgICAgICBjb2wgPSAwO1xuICAgICAgICByb3crKztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gZ2V0IGEgY2FjaGUgb2YgYWxsIHRoZSBtYW51YWwgcG9zaXRpb25zXG4gICAgdmFyIGlkMm1hblBvcyA9IHt9O1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBub2Rlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfbm9kZSA9IG5vZGVzW19pXTtcbiAgICAgIHZhciByY1BvcyA9IG9wdGlvbnMucG9zaXRpb24oX25vZGUpO1xuICAgICAgaWYgKHJjUG9zICYmIChyY1Bvcy5yb3cgIT09IHVuZGVmaW5lZCB8fCByY1Bvcy5jb2wgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLy8gbXVzdCBoYXZlIGF0IGxlYXN0IHJvdyBvciBjb2wgZGVmJ2RcbiAgICAgICAgdmFyIF9wb3MgPSB7XG4gICAgICAgICAgcm93OiByY1Bvcy5yb3csXG4gICAgICAgICAgY29sOiByY1Bvcy5jb2xcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKF9wb3MuY29sID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBmaW5kIHVudXNlZCBjb2xcbiAgICAgICAgICBfcG9zLmNvbCA9IDA7XG4gICAgICAgICAgd2hpbGUgKHVzZWQoX3Bvcy5yb3csIF9wb3MuY29sKSkge1xuICAgICAgICAgICAgX3Bvcy5jb2wrKztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoX3Bvcy5yb3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIGZpbmQgdW51c2VkIHJvd1xuICAgICAgICAgIF9wb3Mucm93ID0gMDtcbiAgICAgICAgICB3aGlsZSAodXNlZChfcG9zLnJvdywgX3Bvcy5jb2wpKSB7XG4gICAgICAgICAgICBfcG9zLnJvdysrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZDJtYW5Qb3NbX25vZGUuaWQoKV0gPSBfcG9zO1xuICAgICAgICB1c2UoX3Bvcy5yb3csIF9wb3MuY29sKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGdldFBvcyA9IGZ1bmN0aW9uIGdldFBvcyhlbGVtZW50LCBpKSB7XG4gICAgICB2YXIgeCwgeTtcbiAgICAgIGlmIChlbGVtZW50LmxvY2tlZCgpIHx8IGVsZW1lbnQuaXNQYXJlbnQoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIHNlZSBpZiB3ZSBoYXZlIGEgbWFudWFsIHBvc2l0aW9uIHNldFxuICAgICAgdmFyIHJjUG9zID0gaWQybWFuUG9zW2VsZW1lbnQuaWQoKV07XG4gICAgICBpZiAocmNQb3MpIHtcbiAgICAgICAgeCA9IHJjUG9zLmNvbCAqIGNlbGxXaWR0aCArIGNlbGxXaWR0aCAvIDIgKyBiYi54MTtcbiAgICAgICAgeSA9IHJjUG9zLnJvdyAqIGNlbGxIZWlnaHQgKyBjZWxsSGVpZ2h0IC8gMiArIGJiLnkxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIHNldCBhdXRvbWF0aWNhbGx5XG5cbiAgICAgICAgd2hpbGUgKHVzZWQocm93LCBjb2wpKSB7XG4gICAgICAgICAgbW92ZVRvTmV4dENlbGwoKTtcbiAgICAgICAgfVxuICAgICAgICB4ID0gY29sICogY2VsbFdpZHRoICsgY2VsbFdpZHRoIC8gMiArIGJiLngxO1xuICAgICAgICB5ID0gcm93ICogY2VsbEhlaWdodCArIGNlbGxIZWlnaHQgLyAyICsgYmIueTE7XG4gICAgICAgIHVzZShyb3csIGNvbCk7XG4gICAgICAgIG1vdmVUb05leHRDZWxsKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5XG4gICAgICB9O1xuICAgIH07XG4gICAgbm9kZXMubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGdldFBvcyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG4vLyBkZWZhdWx0IGxheW91dCBvcHRpb25zXG52YXIgZGVmYXVsdHMkMiA9IHtcbiAgcmVhZHk6IGZ1bmN0aW9uIHJlYWR5KCkge30sXG4gIC8vIG9uIGxheW91dHJlYWR5XG4gIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7fSAvLyBvbiBsYXlvdXRzdG9wXG59O1xuXG4vLyBjb25zdHJ1Y3RvclxuLy8gb3B0aW9ucyA6IG9iamVjdCBjb250YWluaW5nIGxheW91dCBvcHRpb25zXG5mdW5jdGlvbiBOdWxsTGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cyQyLCBvcHRpb25zKTtcbn1cblxuLy8gcnVucyB0aGUgbGF5b3V0XG5OdWxsTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlczsgLy8gZWxlbWVudHMgdG8gY29uc2lkZXIgaW4gdGhlIGxheW91dFxuICB2YXIgbGF5b3V0ID0gdGhpcztcblxuICAvLyBjeSBpcyBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlZCBmb3IgdXMgaW4gdGhlIGNvbnN0cnVjdG9yXG4gIC8vIChkaXNhYmxlIGVzbGludCBmb3IgbmV4dCBsaW5lIGFzIHRoaXMgc2VydmVzIGFzIGV4YW1wbGUgbGF5b3V0IGNvZGUgdG8gZXh0ZXJuYWwgZGV2ZWxvcGVycylcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIG9wdGlvbnMuY3k7XG4gIGxheW91dC5lbWl0KCdsYXlvdXRzdGFydCcpO1xuXG4gIC8vIHB1dHMgYWxsIG5vZGVzIGF0ICgwLCAwKVxuICAvLyBuLmIuIG1vc3QgbGF5b3V0cyB3b3VsZCB1c2UgbGF5b3V0UG9zaXRpb25zKCksIGluc3RlYWQgb2YgcG9zaXRpb25zKCkgYW5kIG1hbnVhbCBldmVudHNcbiAgZWxlcy5ub2RlcygpLnBvc2l0aW9ucyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gdHJpZ2dlciBsYXlvdXRyZWFkeSB3aGVuIGVhY2ggbm9kZSBoYXMgaGFkIGl0cyBwb3NpdGlvbiBzZXQgYXQgbGVhc3Qgb25jZVxuICBsYXlvdXQub25lKCdsYXlvdXRyZWFkeScsIG9wdGlvbnMucmVhZHkpO1xuICBsYXlvdXQuZW1pdCgnbGF5b3V0cmVhZHknKTtcblxuICAvLyB0cmlnZ2VyIGxheW91dHN0b3Agd2hlbiB0aGUgbGF5b3V0IHN0b3BzIChlLmcuIGZpbmlzaGVzKVxuICBsYXlvdXQub25lKCdsYXlvdXRzdG9wJywgb3B0aW9ucy5zdG9wKTtcbiAgbGF5b3V0LmVtaXQoJ2xheW91dHN0b3AnKTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG4vLyBjYWxsZWQgb24gY29udGludW91cyBsYXlvdXRzIHRvIHN0b3AgdGhlbSBiZWZvcmUgdGhleSBmaW5pc2hcbk51bGxMYXlvdXQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxudmFyIGRlZmF1bHRzJDEgPSB7XG4gIHBvc2l0aW9uczogdW5kZWZpbmVkLFxuICAvLyBtYXAgb2YgKG5vZGUgaWQpID0+IChwb3NpdGlvbiBvYmopOyBvciBmdW5jdGlvbihub2RlKXsgcmV0dXJuIHNvbVBvczsgfVxuICB6b29tOiB1bmRlZmluZWQsXG4gIC8vIHRoZSB6b29tIGxldmVsIHRvIHNldCAocHJvYiB3YW50IGZpdCA9IGZhbHNlIGlmIHNldClcbiAgcGFuOiB1bmRlZmluZWQsXG4gIC8vIHRoZSBwYW4gbGV2ZWwgdG8gc2V0IChwcm9iIHdhbnQgZml0ID0gZmFsc2UgaWYgc2V0KVxuICBmaXQ6IHRydWUsXG4gIC8vIHdoZXRoZXIgdG8gZml0IHRvIHZpZXdwb3J0XG4gIHBhZGRpbmc6IDMwLFxuICAvLyBwYWRkaW5nIG9uIGZpdFxuICBzcGFjaW5nRmFjdG9yOiB1bmRlZmluZWQsXG4gIC8vIEFwcGxpZXMgYSBtdWx0aXBsaWNhdGl2ZSBmYWN0b3IgKD4wKSB0byBleHBhbmQgb3IgY29tcHJlc3MgdGhlIG92ZXJhbGwgYXJlYSB0aGF0IHRoZSBub2RlcyB0YWtlIHVwXG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0c1xufTtcblxuZnVuY3Rpb24gUHJlc2V0TGF5b3V0KG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cyQxLCBvcHRpb25zKTtcbn1cblByZXNldExheW91dC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgdmFyIGVsZXMgPSBvcHRpb25zLmVsZXM7XG4gIHZhciBub2RlcyA9IGVsZXMubm9kZXMoKTtcbiAgdmFyIHBvc0lzRm4gPSBmbiQ2KG9wdGlvbnMucG9zaXRpb25zKTtcbiAgZnVuY3Rpb24gZ2V0UG9zaXRpb24obm9kZSkge1xuICAgIGlmIChvcHRpb25zLnBvc2l0aW9ucyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY29weVBvc2l0aW9uKG5vZGUucG9zaXRpb24oKSk7XG4gICAgfVxuICAgIGlmIChwb3NJc0ZuKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5wb3NpdGlvbnMobm9kZSk7XG4gICAgfVxuICAgIHZhciBwb3MgPSBvcHRpb25zLnBvc2l0aW9uc1tub2RlLl9wcml2YXRlLmRhdGEuaWRdO1xuICAgIGlmIChwb3MgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBwb3M7XG4gIH1cbiAgbm9kZXMubGF5b3V0UG9zaXRpb25zKHRoaXMsIG9wdGlvbnMsIGZ1bmN0aW9uIChub2RlLCBpKSB7XG4gICAgdmFyIHBvc2l0aW9uID0gZ2V0UG9zaXRpb24obm9kZSk7XG4gICAgaWYgKG5vZGUubG9ja2VkKCkgfHwgcG9zaXRpb24gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH0pO1xuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgZml0OiB0cnVlLFxuICAvLyB3aGV0aGVyIHRvIGZpdCB0byB2aWV3cG9ydFxuICBwYWRkaW5nOiAzMCxcbiAgLy8gZml0IHBhZGRpbmdcbiAgYm91bmRpbmdCb3g6IHVuZGVmaW5lZCxcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHM7IHsgeDEsIHkxLCB4MiwgeTIgfSBvciB7IHgxLCB5MSwgdywgaCB9XG4gIGFuaW1hdGU6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHRvIHRyYW5zaXRpb24gdGhlIG5vZGUgcG9zaXRpb25zXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gIC8vIGR1cmF0aW9uIG9mIGFuaW1hdGlvbiBpbiBtcyBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZzogdW5kZWZpbmVkLFxuICAvLyBlYXNpbmcgb2YgYW5pbWF0aW9uIGlmIGVuYWJsZWRcbiAgYW5pbWF0ZUZpbHRlcjogZnVuY3Rpb24gYW5pbWF0ZUZpbHRlcihub2RlLCBpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIGEgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIGFuaW1hdGVkLiAgQWxsIG5vZGVzIGFuaW1hdGVkIGJ5IGRlZmF1bHQgb24gYW5pbWF0ZSBlbmFibGVkLiAgTm9uLWFuaW1hdGVkIG5vZGVzIGFyZSBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGxheW91dCBzdGFydHNcbiAgcmVhZHk6IHVuZGVmaW5lZCxcbiAgLy8gY2FsbGJhY2sgb24gbGF5b3V0cmVhZHlcbiAgc3RvcDogdW5kZWZpbmVkLFxuICAvLyBjYWxsYmFjayBvbiBsYXlvdXRzdG9wXG4gIHRyYW5zZm9ybTogZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUsIHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9IC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0cyBcbn07XG5cbmZ1bmN0aW9uIFJhbmRvbUxheW91dChvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xufVxuUmFuZG9tTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgY3kgPSBvcHRpb25zLmN5O1xuICB2YXIgZWxlcyA9IG9wdGlvbnMuZWxlcztcbiAgdmFyIGJiID0gbWFrZUJvdW5kaW5nQm94KG9wdGlvbnMuYm91bmRpbmdCb3ggPyBvcHRpb25zLmJvdW5kaW5nQm94IDoge1xuICAgIHgxOiAwLFxuICAgIHkxOiAwLFxuICAgIHc6IGN5LndpZHRoKCksXG4gICAgaDogY3kuaGVpZ2h0KClcbiAgfSk7XG4gIHZhciBnZXRQb3MgPSBmdW5jdGlvbiBnZXRQb3Mobm9kZSwgaSkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBiYi54MSArIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIGJiLncpLFxuICAgICAgeTogYmIueTEgKyBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiBiYi5oKVxuICAgIH07XG4gIH07XG4gIGVsZXMubm9kZXMoKS5sYXlvdXRQb3NpdGlvbnModGhpcywgb3B0aW9ucywgZ2V0UG9zKTtcbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG52YXIgbGF5b3V0ID0gW3tcbiAgbmFtZTogJ2JyZWFkdGhmaXJzdCcsXG4gIGltcGw6IEJyZWFkdGhGaXJzdExheW91dFxufSwge1xuICBuYW1lOiAnY2lyY2xlJyxcbiAgaW1wbDogQ2lyY2xlTGF5b3V0XG59LCB7XG4gIG5hbWU6ICdjb25jZW50cmljJyxcbiAgaW1wbDogQ29uY2VudHJpY0xheW91dFxufSwge1xuICBuYW1lOiAnY29zZScsXG4gIGltcGw6IENvc2VMYXlvdXRcbn0sIHtcbiAgbmFtZTogJ2dyaWQnLFxuICBpbXBsOiBHcmlkTGF5b3V0XG59LCB7XG4gIG5hbWU6ICdudWxsJyxcbiAgaW1wbDogTnVsbExheW91dFxufSwge1xuICBuYW1lOiAncHJlc2V0JyxcbiAgaW1wbDogUHJlc2V0TGF5b3V0XG59LCB7XG4gIG5hbWU6ICdyYW5kb20nLFxuICBpbXBsOiBSYW5kb21MYXlvdXRcbn1dO1xuXG5mdW5jdGlvbiBOdWxsUmVuZGVyZXIob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB0aGlzLm5vdGlmaWNhdGlvbnMgPSAwOyAvLyBmb3IgdGVzdGluZ1xufVxuXG52YXIgbm9vcCA9IGZ1bmN0aW9uIG5vb3AoKSB7fTtcbnZhciB0aHJvd0ltZ0VyciA9IGZ1bmN0aW9uIHRocm93SW1nRXJyKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0EgaGVhZGxlc3MgaW5zdGFuY2UgY2FuIG5vdCByZW5kZXIgaW1hZ2VzJyk7XG59O1xuTnVsbFJlbmRlcmVyLnByb3RvdHlwZSA9IHtcbiAgcmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlOiBub29wLFxuICBub3RpZnk6IGZ1bmN0aW9uIG5vdGlmeSgpIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMrKztcbiAgfSxcbiAgaW5pdDogbm9vcCxcbiAgaXNIZWFkbGVzczogZnVuY3Rpb24gaXNIZWFkbGVzcygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgcG5nOiB0aHJvd0ltZ0VycixcbiAganBnOiB0aHJvd0ltZ0VyclxufTtcblxudmFyIEJScCRmID0ge307XG5CUnAkZi5hcnJvd1NoYXBlV2lkdGggPSAwLjM7XG5CUnAkZi5yZWdpc3RlckFycm93U2hhcGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgYXJyb3dTaGFwZXMgPSB0aGlzLmFycm93U2hhcGVzID0ge307XG4gIHZhciByZW5kZXJlciA9IHRoaXM7XG5cbiAgLy8gQ29udHJhY3QgZm9yIGFycm93IHNoYXBlczpcbiAgLy8gMCwgMCBpcyBhcnJvdyB0aXBcbiAgLy8gKDAsIDEpIGlzIGRpcmVjdGlvbiB0b3dhcmRzIG5vZGVcbiAgLy8gKDEsIDApIGlzIHJpZ2h0XG4gIC8vXG4gIC8vIGZ1bmN0aW9uYWwgYXBpOlxuICAvLyBjb2xsaWRlOiBjaGVjayB4LCB5IGluIHNoYXBlXG4gIC8vIHJvdWdoQ29sbGlkZTogY2FsbGVkIGJlZm9yZSBjb2xsaWRlLCBubyBmYWxzZSBuZWdhdGl2ZXNcbiAgLy8gZHJhdzogZHJhd1xuICAvLyBzcGFjaW5nOiBkaXN0KGFycm93VGlwLCBub2RlQm91bmRhcnkpXG4gIC8vIGdhcDogZGlzdChlZGdlVGlwLCBub2RlQm91bmRhcnkpLCBlZGdlVGlwIG1heSAhPSBhcnJvd1RpcFxuXG4gIHZhciBiYkNvbGxpZGUgPSBmdW5jdGlvbiBiYkNvbGxpZGUoeCwgeSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgsIHBhZGRpbmcpIHtcbiAgICB2YXIgeDEgPSB0cmFuc2xhdGlvbi54IC0gc2l6ZSAvIDIgLSBwYWRkaW5nO1xuICAgIHZhciB4MiA9IHRyYW5zbGF0aW9uLnggKyBzaXplIC8gMiArIHBhZGRpbmc7XG4gICAgdmFyIHkxID0gdHJhbnNsYXRpb24ueSAtIHNpemUgLyAyIC0gcGFkZGluZztcbiAgICB2YXIgeTIgPSB0cmFuc2xhdGlvbi55ICsgc2l6ZSAvIDIgKyBwYWRkaW5nO1xuICAgIHZhciBpbnNpZGUgPSB4MSA8PSB4ICYmIHggPD0geDIgJiYgeTEgPD0geSAmJiB5IDw9IHkyO1xuICAgIHJldHVybiBpbnNpZGU7XG4gIH07XG4gIHZhciB0cmFuc2Zvcm0gPSBmdW5jdGlvbiB0cmFuc2Zvcm0oeCwgeSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uKSB7XG4gICAgdmFyIHhSb3RhdGVkID0geCAqIE1hdGguY29zKGFuZ2xlKSAtIHkgKiBNYXRoLnNpbihhbmdsZSk7XG4gICAgdmFyIHlSb3RhdGVkID0geCAqIE1hdGguc2luKGFuZ2xlKSArIHkgKiBNYXRoLmNvcyhhbmdsZSk7XG4gICAgdmFyIHhTY2FsZWQgPSB4Um90YXRlZCAqIHNpemU7XG4gICAgdmFyIHlTY2FsZWQgPSB5Um90YXRlZCAqIHNpemU7XG4gICAgdmFyIHhUcmFuc2xhdGVkID0geFNjYWxlZCArIHRyYW5zbGF0aW9uLng7XG4gICAgdmFyIHlUcmFuc2xhdGVkID0geVNjYWxlZCArIHRyYW5zbGF0aW9uLnk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHhUcmFuc2xhdGVkLFxuICAgICAgeTogeVRyYW5zbGF0ZWRcbiAgICB9O1xuICB9O1xuICB2YXIgdHJhbnNmb3JtUG9pbnRzID0gZnVuY3Rpb24gdHJhbnNmb3JtUG9pbnRzKHB0cywgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uKSB7XG4gICAgdmFyIHJldFB0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICB2YXIgeCA9IHB0c1tpXTtcbiAgICAgIHZhciB5ID0gcHRzW2kgKyAxXTtcbiAgICAgIHJldFB0cy5wdXNoKHRyYW5zZm9ybSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldFB0cztcbiAgfTtcbiAgdmFyIHBvaW50c1RvQXJyID0gZnVuY3Rpb24gcG9pbnRzVG9BcnIocHRzKSB7XG4gICAgdmFyIHJldCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcCA9IHB0c1tpXTtcbiAgICAgIHJldC5wdXNoKHAueCwgcC55KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcbiAgdmFyIHN0YW5kYXJkR2FwID0gZnVuY3Rpb24gc3RhbmRhcmRHYXAoZWRnZSkge1xuICAgIHJldHVybiBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlICogZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykucGZWYWx1ZSAqIDI7XG4gIH07XG4gIHZhciBkZWZpbmVBcnJvd1NoYXBlID0gZnVuY3Rpb24gZGVmaW5lQXJyb3dTaGFwZShuYW1lLCBkZWZuKSB7XG4gICAgaWYgKHN0cmluZyhkZWZuKSkge1xuICAgICAgZGVmbiA9IGFycm93U2hhcGVzW2RlZm5dO1xuICAgIH1cbiAgICBhcnJvd1NoYXBlc1tuYW1lXSA9IGV4dGVuZCh7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgcG9pbnRzOiBbLTAuMTUsIC0wLjMsIDAuMTUsIC0wLjMsIDAuMTUsIDAuMywgLTAuMTUsIDAuM10sXG4gICAgICBjb2xsaWRlOiBmdW5jdGlvbiBjb2xsaWRlKHgsIHksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgcGFkZGluZykge1xuICAgICAgICB2YXIgcG9pbnRzID0gcG9pbnRzVG9BcnIodHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplICsgMiAqIHBhZGRpbmcsIGFuZ2xlLCB0cmFuc2xhdGlvbikpO1xuICAgICAgICB2YXIgaW5zaWRlID0gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIHBvaW50cyk7XG4gICAgICAgIHJldHVybiBpbnNpZGU7XG4gICAgICB9LFxuICAgICAgcm91Z2hDb2xsaWRlOiBiYkNvbGxpZGUsXG4gICAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbikge1xuICAgICAgICB2YXIgcG9pbnRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCgncG9seWdvbicpKGNvbnRleHQsIHBvaW50cyk7XG4gICAgICB9LFxuICAgICAgc3BhY2luZzogZnVuY3Rpb24gc3BhY2luZyhlZGdlKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSxcbiAgICAgIGdhcDogc3RhbmRhcmRHYXBcbiAgICB9LCBkZWZuKTtcbiAgfTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnbm9uZScsIHtcbiAgICBjb2xsaWRlOiBmYWxzaWZ5LFxuICAgIHJvdWdoQ29sbGlkZTogZmFsc2lmeSxcbiAgICBkcmF3OiBub29wJDEsXG4gICAgc3BhY2luZzogemVyb2lmeSxcbiAgICBnYXA6IHplcm9pZnlcbiAgfSk7XG4gIGRlZmluZUFycm93U2hhcGUoJ3RyaWFuZ2xlJywge1xuICAgIHBvaW50czogWy0wLjE1LCAtMC4zLCAwLCAwLCAwLjE1LCAtMC4zXVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnYXJyb3cnLCAndHJpYW5nbGUnKTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndHJpYW5nbGUtYmFja2N1cnZlJywge1xuICAgIHBvaW50czogYXJyb3dTaGFwZXNbJ3RyaWFuZ2xlJ10ucG9pbnRzLFxuICAgIGNvbnRyb2xQb2ludDogWzAsIC0wLjE1XSxcbiAgICByb3VnaENvbGxpZGU6IGJiQ29sbGlkZSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKSB7XG4gICAgICB2YXIgcHRzVHJhbnMgPSB0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICB2YXIgY3RybFB0ID0gdGhpcy5jb250cm9sUG9pbnQ7XG4gICAgICB2YXIgY3RybFB0VHJhbnMgPSB0cmFuc2Zvcm0oY3RybFB0WzBdLCBjdHJsUHRbMV0sIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCh0aGlzLm5hbWUpKGNvbnRleHQsIHB0c1RyYW5zLCBjdHJsUHRUcmFucyk7XG4gICAgfSxcbiAgICBnYXA6IGZ1bmN0aW9uIGdhcChlZGdlKSB7XG4gICAgICByZXR1cm4gc3RhbmRhcmRHYXAoZWRnZSkgKiAwLjg7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndHJpYW5nbGUtdGVlJywge1xuICAgIHBvaW50czogWzAsIDAsIDAuMTUsIC0wLjMsIC0wLjE1LCAtMC4zLCAwLCAwXSxcbiAgICBwb2ludHNUZWU6IFstMC4xNSwgLTAuNCwgLTAuMTUsIC0wLjUsIDAuMTUsIC0wLjUsIDAuMTUsIC0wLjRdLFxuICAgIGNvbGxpZGU6IGZ1bmN0aW9uIGNvbGxpZGUoeCwgeSwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgsIHBhZGRpbmcpIHtcbiAgICAgIHZhciB0cmlQdHMgPSBwb2ludHNUb0Fycih0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUgKyAyICogcGFkZGluZywgYW5nbGUsIHRyYW5zbGF0aW9uKSk7XG4gICAgICB2YXIgdGVlUHRzID0gcG9pbnRzVG9BcnIodHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzVGVlLCBzaXplICsgMiAqIHBhZGRpbmcsIGFuZ2xlLCB0cmFuc2xhdGlvbikpO1xuICAgICAgdmFyIGluc2lkZSA9IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCB0cmlQdHMpIHx8IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCB0ZWVQdHMpO1xuICAgICAgcmV0dXJuIGluc2lkZTtcbiAgICB9LFxuICAgIGRyYXc6IGZ1bmN0aW9uIGRyYXcoY29udGV4dCwgc2l6ZSwgYW5nbGUsIHRyYW5zbGF0aW9uLCBlZGdlV2lkdGgpIHtcbiAgICAgIHZhciB0cmlQdHMgPSB0cmFuc2Zvcm1Qb2ludHModGhpcy5wb2ludHMsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICB2YXIgdGVlUHRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzVGVlLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwodGhpcy5uYW1lKShjb250ZXh0LCB0cmlQdHMsIHRlZVB0cyk7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnY2lyY2xlLXRyaWFuZ2xlJywge1xuICAgIHJhZGl1czogMC4xNSxcbiAgICBwb2ludHNUcjogWzAsIC0wLjE1LCAwLjE1LCAtMC40NSwgLTAuMTUsIC0wLjQ1LCAwLCAtMC4xNV0sXG4gICAgY29sbGlkZTogZnVuY3Rpb24gY29sbGlkZSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCwgcGFkZGluZykge1xuICAgICAgdmFyIHQgPSB0cmFuc2xhdGlvbjtcbiAgICAgIHZhciBjaXJjbGVJbnNpZGUgPSBNYXRoLnBvdyh0LnggLSB4LCAyKSArIE1hdGgucG93KHQueSAtIHksIDIpIDw9IE1hdGgucG93KChzaXplICsgMiAqIHBhZGRpbmcpICogdGhpcy5yYWRpdXMsIDIpO1xuICAgICAgdmFyIHRyaVB0cyA9IHBvaW50c1RvQXJyKHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50cywgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgIHJldHVybiBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgdHJpUHRzKSB8fCBjaXJjbGVJbnNpZGU7XG4gICAgfSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKSB7XG4gICAgICB2YXIgdHJpUHRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzVHIsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbik7XG4gICAgICByZW5kZXJlci5hcnJvd1NoYXBlSW1wbCh0aGlzLm5hbWUpKGNvbnRleHQsIHRyaVB0cywgdHJhbnNsYXRpb24ueCwgdHJhbnNsYXRpb24ueSwgdGhpcy5yYWRpdXMgKiBzaXplKTtcbiAgICB9LFxuICAgIHNwYWNpbmc6IGZ1bmN0aW9uIHNwYWNpbmcoZWRnZSkge1xuICAgICAgcmV0dXJuIHJlbmRlcmVyLmdldEFycm93V2lkdGgoZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZSwgZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWUpICogdGhpcy5yYWRpdXM7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndHJpYW5nbGUtY3Jvc3MnLCB7XG4gICAgcG9pbnRzOiBbMCwgMCwgMC4xNSwgLTAuMywgLTAuMTUsIC0wLjMsIDAsIDBdLFxuICAgIGJhc2VDcm9zc0xpbmVQdHM6IFstMC4xNSwgLTAuNCxcbiAgICAvLyBmaXJzdCBoYWxmIG9mIHRoZSByZWN0YW5nbGVcbiAgICAtMC4xNSwgLTAuNCwgMC4xNSwgLTAuNCxcbiAgICAvLyBzZWNvbmQgaGFsZiBvZiB0aGUgcmVjdGFuZ2xlXG4gICAgMC4xNSwgLTAuNF0sXG4gICAgY3Jvc3NMaW5lUHRzOiBmdW5jdGlvbiBjcm9zc0xpbmVQdHMoc2l6ZSwgZWRnZVdpZHRoKSB7XG4gICAgICAvLyBzaGlmdCBwb2ludHMgc28gdGhhdCB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgY3Jvc3MgcG9pbnRzIG1hdGNoZXMgZWRnZSB3aWR0aFxuICAgICAgdmFyIHAgPSB0aGlzLmJhc2VDcm9zc0xpbmVQdHMuc2xpY2UoKTtcbiAgICAgIHZhciBzaGlmdEZhY3RvciA9IGVkZ2VXaWR0aCAvIHNpemU7XG4gICAgICB2YXIgeTAgPSAzO1xuICAgICAgdmFyIHkxID0gNTtcbiAgICAgIHBbeTBdID0gcFt5MF0gLSBzaGlmdEZhY3RvcjtcbiAgICAgIHBbeTFdID0gcFt5MV0gLSBzaGlmdEZhY3RvcjtcbiAgICAgIHJldHVybiBwO1xuICAgIH0sXG4gICAgY29sbGlkZTogZnVuY3Rpb24gY29sbGlkZSh4LCB5LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCwgcGFkZGluZykge1xuICAgICAgdmFyIHRyaVB0cyA9IHBvaW50c1RvQXJyKHRyYW5zZm9ybVBvaW50cyh0aGlzLnBvaW50cywgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgIHZhciB0ZWVQdHMgPSBwb2ludHNUb0Fycih0cmFuc2Zvcm1Qb2ludHModGhpcy5jcm9zc0xpbmVQdHMoc2l6ZSwgZWRnZVdpZHRoKSwgc2l6ZSArIDIgKiBwYWRkaW5nLCBhbmdsZSwgdHJhbnNsYXRpb24pKTtcbiAgICAgIHZhciBpbnNpZGUgPSBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgdHJpUHRzKSB8fCBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgdGVlUHRzKTtcbiAgICAgIHJldHVybiBpbnNpZGU7XG4gICAgfSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoKSB7XG4gICAgICB2YXIgdHJpUHRzID0gdHJhbnNmb3JtUG9pbnRzKHRoaXMucG9pbnRzLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgdmFyIGNyb3NzTGluZVB0cyA9IHRyYW5zZm9ybVBvaW50cyh0aGlzLmNyb3NzTGluZVB0cyhzaXplLCBlZGdlV2lkdGgpLCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24pO1xuICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwodGhpcy5uYW1lKShjb250ZXh0LCB0cmlQdHMsIGNyb3NzTGluZVB0cyk7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgndmVlJywge1xuICAgIHBvaW50czogWy0wLjE1LCAtMC4zLCAwLCAwLCAwLjE1LCAtMC4zLCAwLCAtMC4xNV0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIHN0YW5kYXJkR2FwKGVkZ2UpICogMC41MjU7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnY2lyY2xlJywge1xuICAgIHJhZGl1czogMC4xNSxcbiAgICBjb2xsaWRlOiBmdW5jdGlvbiBjb2xsaWRlKHgsIHksIHNpemUsIGFuZ2xlLCB0cmFuc2xhdGlvbiwgZWRnZVdpZHRoLCBwYWRkaW5nKSB7XG4gICAgICB2YXIgdCA9IHRyYW5zbGF0aW9uO1xuICAgICAgdmFyIGluc2lkZSA9IE1hdGgucG93KHQueCAtIHgsIDIpICsgTWF0aC5wb3codC55IC0geSwgMikgPD0gTWF0aC5wb3coKHNpemUgKyAyICogcGFkZGluZykgKiB0aGlzLnJhZGl1cywgMik7XG4gICAgICByZXR1cm4gaW5zaWRlO1xuICAgIH0sXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCkge1xuICAgICAgcmVuZGVyZXIuYXJyb3dTaGFwZUltcGwodGhpcy5uYW1lKShjb250ZXh0LCB0cmFuc2xhdGlvbi54LCB0cmFuc2xhdGlvbi55LCB0aGlzLnJhZGl1cyAqIHNpemUpO1xuICAgIH0sXG4gICAgc3BhY2luZzogZnVuY3Rpb24gc3BhY2luZyhlZGdlKSB7XG4gICAgICByZXR1cm4gcmVuZGVyZXIuZ2V0QXJyb3dXaWR0aChlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlLCBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZSkgKiB0aGlzLnJhZGl1cztcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCd0ZWUnLCB7XG4gICAgcG9pbnRzOiBbLTAuMTUsIDAsIC0wLjE1LCAtMC4xLCAwLjE1LCAtMC4xLCAwLjE1LCAwXSxcbiAgICBzcGFjaW5nOiBmdW5jdGlvbiBzcGFjaW5nKGVkZ2UpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9KTtcbiAgZGVmaW5lQXJyb3dTaGFwZSgnc3F1YXJlJywge1xuICAgIHBvaW50czogWy0wLjE1LCAwLjAwLCAwLjE1LCAwLjAwLCAwLjE1LCAtMC4zLCAtMC4xNSwgLTAuM11cbiAgfSk7XG4gIGRlZmluZUFycm93U2hhcGUoJ2RpYW1vbmQnLCB7XG4gICAgcG9pbnRzOiBbLTAuMTUsIC0wLjE1LCAwLCAtMC4zLCAwLjE1LCAtMC4xNSwgMCwgMF0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIGVkZ2UucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWUgKiBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZTtcbiAgICB9XG4gIH0pO1xuICBkZWZpbmVBcnJvd1NoYXBlKCdjaGV2cm9uJywge1xuICAgIHBvaW50czogWzAsIDAsIC0wLjE1LCAtMC4xNSwgLTAuMSwgLTAuMiwgMCwgLTAuMSwgMC4xLCAtMC4yLCAwLjE1LCAtMC4xNV0sXG4gICAgZ2FwOiBmdW5jdGlvbiBnYXAoZWRnZSkge1xuICAgICAgcmV0dXJuIDAuOTUgKiBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlICogZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWU7XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBCUnAkZSA9IHt9O1xuXG4vLyBQcm9qZWN0IG1vdXNlXG5CUnAkZS5wcm9qZWN0SW50b1ZpZXdwb3J0ID0gZnVuY3Rpb24gKGNsaWVudFgsIGNsaWVudFkpIHtcbiAgdmFyIGN5ID0gdGhpcy5jeTtcbiAgdmFyIG9mZnNldHMgPSB0aGlzLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMoKTtcbiAgdmFyIG9mZnNldExlZnQgPSBvZmZzZXRzWzBdO1xuICB2YXIgb2Zmc2V0VG9wID0gb2Zmc2V0c1sxXTtcbiAgdmFyIHNjYWxlID0gb2Zmc2V0c1s0XTtcbiAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgdmFyIHggPSAoKGNsaWVudFggLSBvZmZzZXRMZWZ0KSAvIHNjYWxlIC0gcGFuLngpIC8gem9vbTtcbiAgdmFyIHkgPSAoKGNsaWVudFkgLSBvZmZzZXRUb3ApIC8gc2NhbGUgLSBwYW4ueSkgLyB6b29tO1xuICByZXR1cm4gW3gsIHldO1xufTtcbkJScCRlLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmNvbnRhaW5lckJCKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyQkI7XG4gIH1cbiAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyO1xuICB2YXIgcmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHN0eWxlID0gdGhpcy5jeS53aW5kb3coKS5nZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lcik7XG4gIHZhciBzdHlsZVZhbHVlID0gZnVuY3Rpb24gc3R5bGVWYWx1ZShuYW1lKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKSk7XG4gIH07XG4gIHZhciBwYWRkaW5nID0ge1xuICAgIGxlZnQ6IHN0eWxlVmFsdWUoJ3BhZGRpbmctbGVmdCcpLFxuICAgIHJpZ2h0OiBzdHlsZVZhbHVlKCdwYWRkaW5nLXJpZ2h0JyksXG4gICAgdG9wOiBzdHlsZVZhbHVlKCdwYWRkaW5nLXRvcCcpLFxuICAgIGJvdHRvbTogc3R5bGVWYWx1ZSgncGFkZGluZy1ib3R0b20nKVxuICB9O1xuICB2YXIgYm9yZGVyID0ge1xuICAgIGxlZnQ6IHN0eWxlVmFsdWUoJ2JvcmRlci1sZWZ0LXdpZHRoJyksXG4gICAgcmlnaHQ6IHN0eWxlVmFsdWUoJ2JvcmRlci1yaWdodC13aWR0aCcpLFxuICAgIHRvcDogc3R5bGVWYWx1ZSgnYm9yZGVyLXRvcC13aWR0aCcpLFxuICAgIGJvdHRvbTogc3R5bGVWYWx1ZSgnYm9yZGVyLWJvdHRvbS13aWR0aCcpXG4gIH07XG4gIHZhciBjbGllbnRXaWR0aCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aDtcbiAgdmFyIGNsaWVudEhlaWdodCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XG4gIHZhciBwYWRkaW5nSG9yID0gcGFkZGluZy5sZWZ0ICsgcGFkZGluZy5yaWdodDtcbiAgdmFyIHBhZGRpbmdWZXIgPSBwYWRkaW5nLnRvcCArIHBhZGRpbmcuYm90dG9tO1xuICB2YXIgYm9yZGVySG9yID0gYm9yZGVyLmxlZnQgKyBib3JkZXIucmlnaHQ7XG4gIHZhciBzY2FsZSA9IHJlY3Qud2lkdGggLyAoY2xpZW50V2lkdGggKyBib3JkZXJIb3IpO1xuICB2YXIgdW5zY2FsZWRXID0gY2xpZW50V2lkdGggLSBwYWRkaW5nSG9yO1xuICB2YXIgdW5zY2FsZWRIID0gY2xpZW50SGVpZ2h0IC0gcGFkZGluZ1ZlcjtcbiAgdmFyIGxlZnQgPSByZWN0LmxlZnQgKyBwYWRkaW5nLmxlZnQgKyBib3JkZXIubGVmdDtcbiAgdmFyIHRvcCA9IHJlY3QudG9wICsgcGFkZGluZy50b3AgKyBib3JkZXIudG9wO1xuICByZXR1cm4gdGhpcy5jb250YWluZXJCQiA9IFtsZWZ0LCB0b3AsIHVuc2NhbGVkVywgdW5zY2FsZWRILCBzY2FsZV07XG59O1xuQlJwJGUuaW52YWxpZGF0ZUNvbnRhaW5lckNsaWVudENvb3Jkc0NhY2hlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNvbnRhaW5lckJCID0gbnVsbDtcbn07XG5CUnAkZS5maW5kTmVhcmVzdEVsZW1lbnQgPSBmdW5jdGlvbiAoeCwgeSwgaW50ZXJhY3RpdmVFbGVtZW50c09ubHksIGlzVG91Y2gpIHtcbiAgcmV0dXJuIHRoaXMuZmluZE5lYXJlc3RFbGVtZW50cyh4LCB5LCBpbnRlcmFjdGl2ZUVsZW1lbnRzT25seSwgaXNUb3VjaClbMF07XG59O1xuQlJwJGUuZmluZE5lYXJlc3RFbGVtZW50cyA9IGZ1bmN0aW9uICh4LCB5LCBpbnRlcmFjdGl2ZUVsZW1lbnRzT25seSwgaXNUb3VjaCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGVsZXMgPSByLmdldENhY2hlZFpTb3J0ZWRFbGVzKCk7XG4gIHZhciBuZWFyID0gW107IC8vIDEgbm9kZSBtYXgsIDEgZWRnZSBtYXhcbiAgdmFyIHpvb20gPSByLmN5Lnpvb20oKTtcbiAgdmFyIGhhc0NvbXBvdW5kcyA9IHIuY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICB2YXIgZWRnZVRocmVzaG9sZCA9IChpc1RvdWNoID8gMjQgOiA4KSAvIHpvb207XG4gIHZhciBub2RlVGhyZXNob2xkID0gKGlzVG91Y2ggPyA4IDogMikgLyB6b29tO1xuICB2YXIgbGFiZWxUaHJlc2hvbGQgPSAoaXNUb3VjaCA/IDggOiAyKSAvIHpvb207XG4gIHZhciBtaW5TcURpc3QgPSBJbmZpbml0eTtcbiAgdmFyIG5lYXJFZGdlO1xuICB2YXIgbmVhck5vZGU7XG4gIGlmIChpbnRlcmFjdGl2ZUVsZW1lbnRzT25seSkge1xuICAgIGVsZXMgPSBlbGVzLmludGVyYWN0aXZlO1xuICB9XG4gIGZ1bmN0aW9uIGFkZEVsZShlbGUsIHNxRGlzdCkge1xuICAgIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICAgIGlmIChuZWFyTm9kZSkge1xuICAgICAgICByZXR1cm47IC8vIGNhbid0IHJlcGxhY2Ugbm9kZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmVhck5vZGUgPSBlbGU7XG4gICAgICAgIG5lYXIucHVzaChlbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWxlLmlzRWRnZSgpICYmIChzcURpc3QgPT0gbnVsbCB8fCBzcURpc3QgPCBtaW5TcURpc3QpKSB7XG4gICAgICBpZiAobmVhckVkZ2UpIHtcbiAgICAgICAgLy8gdGhlbiByZXBsYWNlIGV4aXN0aW5nIGVkZ2VcbiAgICAgICAgLy8gY2FuIHJlcGxhY2Ugb25seSBpZiBzYW1lIHotaW5kZXhcbiAgICAgICAgaWYgKG5lYXJFZGdlLnBzdHlsZSgnei1jb21wb3VuZC1kZXB0aCcpLnZhbHVlID09PSBlbGUucHN0eWxlKCd6LWNvbXBvdW5kLWRlcHRoJykudmFsdWUgJiYgbmVhckVkZ2UucHN0eWxlKCd6LWNvbXBvdW5kLWRlcHRoJykudmFsdWUgPT09IGVsZS5wc3R5bGUoJ3otY29tcG91bmQtZGVwdGgnKS52YWx1ZSkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVhci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5lYXJbaV0uaXNFZGdlKCkpIHtcbiAgICAgICAgICAgICAgbmVhcltpXSA9IGVsZTtcbiAgICAgICAgICAgICAgbmVhckVkZ2UgPSBlbGU7XG4gICAgICAgICAgICAgIG1pblNxRGlzdCA9IHNxRGlzdCAhPSBudWxsID8gc3FEaXN0IDogbWluU3FEaXN0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5lYXIucHVzaChlbGUpO1xuICAgICAgICBuZWFyRWRnZSA9IGVsZTtcbiAgICAgICAgbWluU3FEaXN0ID0gc3FEaXN0ICE9IG51bGwgPyBzcURpc3QgOiBtaW5TcURpc3Q7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGNoZWNrTm9kZShub2RlKSB7XG4gICAgdmFyIHdpZHRoID0gbm9kZS5vdXRlcldpZHRoKCkgKyAyICogbm9kZVRocmVzaG9sZDtcbiAgICB2YXIgaGVpZ2h0ID0gbm9kZS5vdXRlckhlaWdodCgpICsgMiAqIG5vZGVUaHJlc2hvbGQ7XG4gICAgdmFyIGh3ID0gd2lkdGggLyAyO1xuICAgIHZhciBoaCA9IGhlaWdodCAvIDI7XG4gICAgdmFyIHBvcyA9IG5vZGUucG9zaXRpb24oKTtcbiAgICB2YXIgY29ybmVyUmFkaXVzID0gbm9kZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZSA9PT0gJ2F1dG8nID8gJ2F1dG8nIDogbm9kZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS5wZlZhbHVlO1xuICAgIHZhciBycyA9IG5vZGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgaWYgKHBvcy54IC0gaHcgPD0geCAmJiB4IDw9IHBvcy54ICsgaHcgLy8gYmIgY2hlY2sgeFxuICAgICYmIHBvcy55IC0gaGggPD0geSAmJiB5IDw9IHBvcy55ICsgaGggLy8gYmIgY2hlY2sgeVxuICAgICkge1xuICAgICAgdmFyIHNoYXBlID0gci5ub2RlU2hhcGVzW3NlbGYuZ2V0Tm9kZVNoYXBlKG5vZGUpXTtcbiAgICAgIGlmIChzaGFwZS5jaGVja1BvaW50KHgsIHksIDAsIHdpZHRoLCBoZWlnaHQsIHBvcy54LCBwb3MueSwgY29ybmVyUmFkaXVzLCBycykpIHtcbiAgICAgICAgYWRkRWxlKG5vZGUsIDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gY2hlY2tFZGdlKGVkZ2UpIHtcbiAgICB2YXIgX3AgPSBlZGdlLl9wcml2YXRlO1xuICAgIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuICAgIHZhciBzdHlsZVdpZHRoID0gZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgICB2YXIgc2NhbGUgPSBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZTtcbiAgICB2YXIgd2lkdGggPSBzdHlsZVdpZHRoIC8gMiArIGVkZ2VUaHJlc2hvbGQ7IC8vIG1vcmUgbGlrZSBhIGRpc3RhbmNlIHJhZGl1cyBmcm9tIGNlbnRyZVxuICAgIHZhciB3aWR0aFNxID0gd2lkdGggKiB3aWR0aDtcbiAgICB2YXIgd2lkdGgyID0gd2lkdGggKiAyO1xuICAgIHZhciBzcmMgPSBfcC5zb3VyY2U7XG4gICAgdmFyIHRndCA9IF9wLnRhcmdldDtcbiAgICB2YXIgc3FEaXN0O1xuICAgIGlmIChycy5lZGdlVHlwZSA9PT0gJ3NlZ21lbnRzJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3N0cmFpZ2h0JyB8fCBycy5lZGdlVHlwZSA9PT0gJ2hheXN0YWNrJykge1xuICAgICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpICsgMyA8IHB0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBpZiAoaW5MaW5lVmljaW5pdHkoeCwgeSwgcHRzW2ldLCBwdHNbaSArIDFdLCBwdHNbaSArIDJdLCBwdHNbaSArIDNdLCB3aWR0aDIpICYmIHdpZHRoU3EgPiAoc3FEaXN0ID0gc3FkaXN0VG9GaW5pdGVMaW5lKHgsIHksIHB0c1tpXSwgcHRzW2kgKyAxXSwgcHRzW2kgKyAyXSwgcHRzW2kgKyAzXSkpKSB7XG4gICAgICAgICAgYWRkRWxlKGVkZ2UsIHNxRGlzdCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJzLmVkZ2VUeXBlID09PSAnYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ211bHRpYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3NlbGYnIHx8IHJzLmVkZ2VUeXBlID09PSAnY29tcG91bmQnKSB7XG4gICAgICB2YXIgcHRzID0gcnMuYWxscHRzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgKyA1IDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGlmIChpbkJlemllclZpY2luaXR5KHgsIHksIHB0c1tpXSwgcHRzW2kgKyAxXSwgcHRzW2kgKyAyXSwgcHRzW2kgKyAzXSwgcHRzW2kgKyA0XSwgcHRzW2kgKyA1XSwgd2lkdGgyKSAmJiB3aWR0aFNxID4gKHNxRGlzdCA9IHNxZGlzdFRvUXVhZHJhdGljQmV6aWVyKHgsIHksIHB0c1tpXSwgcHRzW2kgKyAxXSwgcHRzW2kgKyAyXSwgcHRzW2kgKyAzXSwgcHRzW2kgKyA0XSwgcHRzW2kgKyA1XSkpKSB7XG4gICAgICAgICAgYWRkRWxlKGVkZ2UsIHNxRGlzdCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB3ZSdyZSBjbG9zZSB0byB0aGUgZWRnZSBidXQgZGlkbid0IGhpdCBpdCwgbWF5YmUgd2UgaGl0IGl0cyBhcnJvd3NcblxuICAgIHZhciBzcmMgPSBzcmMgfHwgX3Auc291cmNlO1xuICAgIHZhciB0Z3QgPSB0Z3QgfHwgX3AudGFyZ2V0O1xuICAgIHZhciBhclNpemUgPSBzZWxmLmdldEFycm93V2lkdGgoc3R5bGVXaWR0aCwgc2NhbGUpO1xuICAgIHZhciBhcnJvd3MgPSBbe1xuICAgICAgbmFtZTogJ3NvdXJjZScsXG4gICAgICB4OiBycy5hcnJvd1N0YXJ0WCxcbiAgICAgIHk6IHJzLmFycm93U3RhcnRZLFxuICAgICAgYW5nbGU6IHJzLnNyY0Fycm93QW5nbGVcbiAgICB9LCB7XG4gICAgICBuYW1lOiAndGFyZ2V0JyxcbiAgICAgIHg6IHJzLmFycm93RW5kWCxcbiAgICAgIHk6IHJzLmFycm93RW5kWSxcbiAgICAgIGFuZ2xlOiBycy50Z3RBcnJvd0FuZ2xlXG4gICAgfSwge1xuICAgICAgbmFtZTogJ21pZC1zb3VyY2UnLFxuICAgICAgeDogcnMubWlkWCxcbiAgICAgIHk6IHJzLm1pZFksXG4gICAgICBhbmdsZTogcnMubWlkc3JjQXJyb3dBbmdsZVxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdtaWQtdGFyZ2V0JyxcbiAgICAgIHg6IHJzLm1pZFgsXG4gICAgICB5OiBycy5taWRZLFxuICAgICAgYW5nbGU6IHJzLm1pZHRndEFycm93QW5nbGVcbiAgICB9XTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGFyID0gYXJyb3dzW2ldO1xuICAgICAgdmFyIHNoYXBlID0gci5hcnJvd1NoYXBlc1tlZGdlLnBzdHlsZShhci5uYW1lICsgJy1hcnJvdy1zaGFwZScpLnZhbHVlXTtcbiAgICAgIHZhciBlZGdlV2lkdGggPSBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICAgICAgaWYgKHNoYXBlLnJvdWdoQ29sbGlkZSh4LCB5LCBhclNpemUsIGFyLmFuZ2xlLCB7XG4gICAgICAgIHg6IGFyLngsXG4gICAgICAgIHk6IGFyLnlcbiAgICAgIH0sIGVkZ2VXaWR0aCwgZWRnZVRocmVzaG9sZCkgJiYgc2hhcGUuY29sbGlkZSh4LCB5LCBhclNpemUsIGFyLmFuZ2xlLCB7XG4gICAgICAgIHg6IGFyLngsXG4gICAgICAgIHk6IGFyLnlcbiAgICAgIH0sIGVkZ2VXaWR0aCwgZWRnZVRocmVzaG9sZCkpIHtcbiAgICAgICAgYWRkRWxlKGVkZ2UpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmb3IgY29tcG91bmQgZ3JhcGhzLCBoaXR0aW5nIGVkZ2UgbWF5IGFjdHVhbGx5IHdhbnQgYSBjb25uZWN0ZWQgbm9kZSBpbnN0ZWFkIChiL2MgZWRnZSBtYXkgaGF2ZSBncmVhdGVyIHotaW5kZXggcHJlY2VkZW5jZSlcbiAgICBpZiAoaGFzQ29tcG91bmRzICYmIG5lYXIubGVuZ3RoID4gMCkge1xuICAgICAgY2hlY2tOb2RlKHNyYyk7XG4gICAgICBjaGVja05vZGUodGd0KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHJlcHJvcChvYmosIG5hbWUsIHByZSkge1xuICAgIHJldHVybiBnZXRQcmVmaXhlZFByb3BlcnR5KG9iaiwgbmFtZSwgcHJlKTtcbiAgfVxuICBmdW5jdGlvbiBjaGVja0xhYmVsKGVsZSwgcHJlZml4KSB7XG4gICAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICAgIHZhciB0aCA9IGxhYmVsVGhyZXNob2xkO1xuICAgIHZhciBwcmVmaXhEYXNoO1xuICAgIGlmIChwcmVmaXgpIHtcbiAgICAgIHByZWZpeERhc2ggPSBwcmVmaXggKyAnLSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpeERhc2ggPSAnJztcbiAgICB9XG4gICAgZWxlLmJvdW5kaW5nQm94KCk7XG4gICAgdmFyIGJiID0gX3AubGFiZWxCb3VuZHNbcHJlZml4IHx8ICdtYWluJ107XG4gICAgdmFyIHRleHQgPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAnbGFiZWwnKS52YWx1ZTtcbiAgICB2YXIgZXZlbnRzRW5hYmxlZCA9IGVsZS5wc3R5bGUoJ3RleHQtZXZlbnRzJykuc3RyVmFsdWUgPT09ICd5ZXMnO1xuICAgIGlmICghZXZlbnRzRW5hYmxlZCB8fCAhdGV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbHggPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxYJywgcHJlZml4KTtcbiAgICB2YXIgbHkgPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxZJywgcHJlZml4KTtcbiAgICB2YXIgdGhldGEgPSBwcmVwcm9wKF9wLnJzY3JhdGNoLCAnbGFiZWxBbmdsZScsIHByZWZpeCk7XG4gICAgdmFyIG94ID0gZWxlLnBzdHlsZShwcmVmaXhEYXNoICsgJ3RleHQtbWFyZ2luLXgnKS5wZlZhbHVlO1xuICAgIHZhciBveSA9IGVsZS5wc3R5bGUocHJlZml4RGFzaCArICd0ZXh0LW1hcmdpbi15JykucGZWYWx1ZTtcbiAgICB2YXIgbHgxID0gYmIueDEgLSB0aCAtIG94OyAvLyAoLW94LCAtb3kpIGFzIGJiIGFscmVhZHkgaW5jbHVkZXMgbWFyZ2luXG4gICAgdmFyIGx4MiA9IGJiLngyICsgdGggLSBveDsgLy8gYW5kIHJvdGF0aW9uIGlzIGFib3V0IChseCwgbHkpXG4gICAgdmFyIGx5MSA9IGJiLnkxIC0gdGggLSBveTtcbiAgICB2YXIgbHkyID0gYmIueTIgKyB0aCAtIG95O1xuICAgIGlmICh0aGV0YSkge1xuICAgICAgdmFyIGNvcyA9IE1hdGguY29zKHRoZXRhKTtcbiAgICAgIHZhciBzaW4gPSBNYXRoLnNpbih0aGV0YSk7XG4gICAgICB2YXIgcm90YXRlID0gZnVuY3Rpb24gcm90YXRlKHgsIHkpIHtcbiAgICAgICAgeCA9IHggLSBseDtcbiAgICAgICAgeSA9IHkgLSBseTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiB4ICogY29zIC0geSAqIHNpbiArIGx4LFxuICAgICAgICAgIHk6IHggKiBzaW4gKyB5ICogY29zICsgbHlcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICB2YXIgcHgxeTEgPSByb3RhdGUobHgxLCBseTEpO1xuICAgICAgdmFyIHB4MXkyID0gcm90YXRlKGx4MSwgbHkyKTtcbiAgICAgIHZhciBweDJ5MSA9IHJvdGF0ZShseDIsIGx5MSk7XG4gICAgICB2YXIgcHgyeTIgPSByb3RhdGUobHgyLCBseTIpO1xuICAgICAgdmFyIHBvaW50cyA9IFtcbiAgICAgIC8vIHdpdGggdGhlIG1hcmdpbiBhZGRlZCBhZnRlciB0aGUgcm90YXRpb24gaXMgYXBwbGllZFxuICAgICAgcHgxeTEueCArIG94LCBweDF5MS55ICsgb3ksIHB4MnkxLnggKyBveCwgcHgyeTEueSArIG95LCBweDJ5Mi54ICsgb3gsIHB4MnkyLnkgKyBveSwgcHgxeTIueCArIG94LCBweDF5Mi55ICsgb3ldO1xuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBwb2ludHMpKSB7XG4gICAgICAgIGFkZEVsZShlbGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZG8gYSBjaGVhcGVyIGJiIGNoZWNrXG4gICAgICBpZiAoaW5Cb3VuZGluZ0JveChiYiwgeCwgeSkpIHtcbiAgICAgICAgYWRkRWxlKGVsZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmb3IgKHZhciBpID0gZWxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIC8vIHJldmVyc2Ugb3JkZXIgZm9yIHByZWNlZGVuY2VcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICBjaGVja05vZGUoZWxlKSB8fCBjaGVja0xhYmVsKGVsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZW4gZWRnZVxuICAgICAgY2hlY2tFZGdlKGVsZSkgfHwgY2hlY2tMYWJlbChlbGUpIHx8IGNoZWNrTGFiZWwoZWxlLCAnc291cmNlJykgfHwgY2hlY2tMYWJlbChlbGUsICd0YXJnZXQnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lYXI7XG59O1xuXG4vLyAnR2l2ZSBtZSBldmVyeXRoaW5nIGZyb20gdGhpcyBib3gnXG5CUnAkZS5nZXRBbGxJbkJveCA9IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5Mikge1xuICB2YXIgZWxlcyA9IHRoaXMuZ2V0Q2FjaGVkWlNvcnRlZEVsZXMoKS5pbnRlcmFjdGl2ZTtcbiAgdmFyIGJveCA9IFtdO1xuICB2YXIgeDFjID0gTWF0aC5taW4oeDEsIHgyKTtcbiAgdmFyIHgyYyA9IE1hdGgubWF4KHgxLCB4Mik7XG4gIHZhciB5MWMgPSBNYXRoLm1pbih5MSwgeTIpO1xuICB2YXIgeTJjID0gTWF0aC5tYXgoeTEsIHkyKTtcbiAgeDEgPSB4MWM7XG4gIHgyID0geDJjO1xuICB5MSA9IHkxYztcbiAgeTIgPSB5MmM7XG4gIHZhciBib3hCYiA9IG1ha2VCb3VuZGluZ0JveCh7XG4gICAgeDE6IHgxLFxuICAgIHkxOiB5MSxcbiAgICB4MjogeDIsXG4gICAgeTI6IHkyXG4gIH0pO1xuICBmb3IgKHZhciBlID0gMDsgZSA8IGVsZXMubGVuZ3RoOyBlKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tlXTtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICB2YXIgbm9kZSA9IGVsZTtcbiAgICAgIHZhciBub2RlQmIgPSBub2RlLmJvdW5kaW5nQm94KHtcbiAgICAgICAgaW5jbHVkZU5vZGVzOiB0cnVlLFxuICAgICAgICBpbmNsdWRlRWRnZXM6IGZhbHNlLFxuICAgICAgICBpbmNsdWRlTGFiZWxzOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBpZiAoYm91bmRpbmdCb3hlc0ludGVyc2VjdChib3hCYiwgbm9kZUJiKSAmJiAhYm91bmRpbmdCb3hJbkJvdW5kaW5nQm94KG5vZGVCYiwgYm94QmIpKSB7XG4gICAgICAgIGJveC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZWRnZSA9IGVsZTtcbiAgICAgIHZhciBfcCA9IGVkZ2UuX3ByaXZhdGU7XG4gICAgICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgICAgIGlmIChycy5zdGFydFggIT0gbnVsbCAmJiBycy5zdGFydFkgIT0gbnVsbCAmJiAhaW5Cb3VuZGluZ0JveChib3hCYiwgcnMuc3RhcnRYLCBycy5zdGFydFkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHJzLmVuZFggIT0gbnVsbCAmJiBycy5lbmRZICE9IG51bGwgJiYgIWluQm91bmRpbmdCb3goYm94QmIsIHJzLmVuZFgsIHJzLmVuZFkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHJzLmVkZ2VUeXBlID09PSAnYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ211bHRpYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3NlbGYnIHx8IHJzLmVkZ2VUeXBlID09PSAnY29tcG91bmQnIHx8IHJzLmVkZ2VUeXBlID09PSAnc2VnbWVudHMnIHx8IHJzLmVkZ2VUeXBlID09PSAnaGF5c3RhY2snKSB7XG4gICAgICAgIHZhciBwdHMgPSBfcC5yc3R5bGUuYmV6aWVyUHRzIHx8IF9wLnJzdHlsZS5saW5lUHRzIHx8IF9wLnJzdHlsZS5oYXlzdGFja1B0cztcbiAgICAgICAgdmFyIGFsbEluc2lkZSA9IHRydWU7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFwb2ludEluQm91bmRpbmdCb3goYm94QmIsIHB0c1tpXSkpIHtcbiAgICAgICAgICAgIGFsbEluc2lkZSA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhbGxJbnNpZGUpIHtcbiAgICAgICAgICBib3gucHVzaChlZGdlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChycy5lZGdlVHlwZSA9PT0gJ2hheXN0YWNrJyB8fCBycy5lZGdlVHlwZSA9PT0gJ3N0cmFpZ2h0Jykge1xuICAgICAgICBib3gucHVzaChlZGdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJveDtcbn07XG5cbnZhciBCUnAkZCA9IHt9O1xuQlJwJGQuY2FsY3VsYXRlQXJyb3dBbmdsZXMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgaXNIYXlzdGFjayA9IHJzLmVkZ2VUeXBlID09PSAnaGF5c3RhY2snO1xuICB2YXIgaXNCZXppZXIgPSBycy5lZGdlVHlwZSA9PT0gJ2Jlemllcic7XG4gIHZhciBpc011bHRpYmV6aWVyID0gcnMuZWRnZVR5cGUgPT09ICdtdWx0aWJlemllcic7XG4gIHZhciBpc1NlZ21lbnRzID0gcnMuZWRnZVR5cGUgPT09ICdzZWdtZW50cyc7XG4gIHZhciBpc0NvbXBvdW5kID0gcnMuZWRnZVR5cGUgPT09ICdjb21wb3VuZCc7XG4gIHZhciBpc1NlbGYgPSBycy5lZGdlVHlwZSA9PT0gJ3NlbGYnO1xuXG4gIC8vIERpc3BsYWNlbWVudCBnaXZlcyBkaXJlY3Rpb24gZm9yIGFycm93aGVhZCBvcmllbnRhdGlvblxuICB2YXIgZGlzcFgsIGRpc3BZO1xuICB2YXIgc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFksIG1pZFgsIG1pZFk7XG4gIGlmIChpc0hheXN0YWNrKSB7XG4gICAgc3RhcnRYID0gcnMuaGF5c3RhY2tQdHNbMF07XG4gICAgc3RhcnRZID0gcnMuaGF5c3RhY2tQdHNbMV07XG4gICAgZW5kWCA9IHJzLmhheXN0YWNrUHRzWzJdO1xuICAgIGVuZFkgPSBycy5oYXlzdGFja1B0c1szXTtcbiAgfSBlbHNlIHtcbiAgICBzdGFydFggPSBycy5hcnJvd1N0YXJ0WDtcbiAgICBzdGFydFkgPSBycy5hcnJvd1N0YXJ0WTtcbiAgICBlbmRYID0gcnMuYXJyb3dFbmRYO1xuICAgIGVuZFkgPSBycy5hcnJvd0VuZFk7XG4gIH1cbiAgbWlkWCA9IHJzLm1pZFg7XG4gIG1pZFkgPSBycy5taWRZO1xuXG4gIC8vIHNvdXJjZVxuICAvL1xuXG4gIGlmIChpc1NlZ21lbnRzKSB7XG4gICAgZGlzcFggPSBzdGFydFggLSBycy5zZWdwdHNbMF07XG4gICAgZGlzcFkgPSBzdGFydFkgLSBycy5zZWdwdHNbMV07XG4gIH0gZWxzZSBpZiAoaXNNdWx0aWJlemllciB8fCBpc0NvbXBvdW5kIHx8IGlzU2VsZiB8fCBpc0Jlemllcikge1xuICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG4gICAgdmFyIGJYID0gcWJlemllckF0KHB0c1swXSwgcHRzWzJdLCBwdHNbNF0sIDAuMSk7XG4gICAgdmFyIGJZID0gcWJlemllckF0KHB0c1sxXSwgcHRzWzNdLCBwdHNbNV0sIDAuMSk7XG4gICAgZGlzcFggPSBzdGFydFggLSBiWDtcbiAgICBkaXNwWSA9IHN0YXJ0WSAtIGJZO1xuICB9IGVsc2Uge1xuICAgIGRpc3BYID0gc3RhcnRYIC0gbWlkWDtcbiAgICBkaXNwWSA9IHN0YXJ0WSAtIG1pZFk7XG4gIH1cbiAgcnMuc3JjQXJyb3dBbmdsZSA9IGdldEFuZ2xlRnJvbURpc3AoZGlzcFgsIGRpc3BZKTtcblxuICAvLyBtaWQgdGFyZ2V0XG4gIC8vXG5cbiAgdmFyIG1pZFggPSBycy5taWRYO1xuICB2YXIgbWlkWSA9IHJzLm1pZFk7XG4gIGlmIChpc0hheXN0YWNrKSB7XG4gICAgbWlkWCA9IChzdGFydFggKyBlbmRYKSAvIDI7XG4gICAgbWlkWSA9IChzdGFydFkgKyBlbmRZKSAvIDI7XG4gIH1cbiAgZGlzcFggPSBlbmRYIC0gc3RhcnRYO1xuICBkaXNwWSA9IGVuZFkgLSBzdGFydFk7XG4gIGlmIChpc1NlZ21lbnRzKSB7XG4gICAgdmFyIHB0cyA9IHJzLmFsbHB0cztcbiAgICBpZiAocHRzLmxlbmd0aCAvIDIgJSAyID09PSAwKSB7XG4gICAgICB2YXIgaTIgPSBwdHMubGVuZ3RoIC8gMjtcbiAgICAgIHZhciBpMSA9IGkyIC0gMjtcbiAgICAgIGRpc3BYID0gcHRzW2kyXSAtIHB0c1tpMV07XG4gICAgICBkaXNwWSA9IHB0c1tpMiArIDFdIC0gcHRzW2kxICsgMV07XG4gICAgfSBlbHNlIGlmIChycy5pc1JvdW5kKSB7XG4gICAgICBkaXNwWCA9IHJzLm1pZFZlY3RvclsxXTtcbiAgICAgIGRpc3BZID0gLXJzLm1pZFZlY3RvclswXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGkyID0gcHRzLmxlbmd0aCAvIDIgLSAxO1xuICAgICAgdmFyIGkxID0gaTIgLSAyO1xuICAgICAgZGlzcFggPSBwdHNbaTJdIC0gcHRzW2kxXTtcbiAgICAgIGRpc3BZID0gcHRzW2kyICsgMV0gLSBwdHNbaTEgKyAxXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNNdWx0aWJlemllciB8fCBpc0NvbXBvdW5kIHx8IGlzU2VsZikge1xuICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG4gICAgdmFyIGNwdHMgPSBycy5jdHJscHRzO1xuICAgIHZhciBicDB4LCBicDB5O1xuICAgIHZhciBicDF4LCBicDF5O1xuICAgIGlmIChjcHRzLmxlbmd0aCAvIDIgJSAyID09PSAwKSB7XG4gICAgICB2YXIgcDAgPSBwdHMubGVuZ3RoIC8gMiAtIDE7IC8vIHN0YXJ0cHRcbiAgICAgIHZhciBpYyA9IHAwICsgMjtcbiAgICAgIHZhciBwMSA9IGljICsgMjtcbiAgICAgIGJwMHggPSBxYmV6aWVyQXQocHRzW3AwXSwgcHRzW2ljXSwgcHRzW3AxXSwgMC4wKTtcbiAgICAgIGJwMHkgPSBxYmV6aWVyQXQocHRzW3AwICsgMV0sIHB0c1tpYyArIDFdLCBwdHNbcDEgKyAxXSwgMC4wKTtcbiAgICAgIGJwMXggPSBxYmV6aWVyQXQocHRzW3AwXSwgcHRzW2ljXSwgcHRzW3AxXSwgMC4wMDAxKTtcbiAgICAgIGJwMXkgPSBxYmV6aWVyQXQocHRzW3AwICsgMV0sIHB0c1tpYyArIDFdLCBwdHNbcDEgKyAxXSwgMC4wMDAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGljID0gcHRzLmxlbmd0aCAvIDIgLSAxOyAvLyBjdHJwdFxuICAgICAgdmFyIHAwID0gaWMgLSAyOyAvLyBzdGFydHB0XG4gICAgICB2YXIgcDEgPSBpYyArIDI7IC8vIGVuZHB0XG5cbiAgICAgIGJwMHggPSBxYmV6aWVyQXQocHRzW3AwXSwgcHRzW2ljXSwgcHRzW3AxXSwgMC40OTk5KTtcbiAgICAgIGJwMHkgPSBxYmV6aWVyQXQocHRzW3AwICsgMV0sIHB0c1tpYyArIDFdLCBwdHNbcDEgKyAxXSwgMC40OTk5KTtcbiAgICAgIGJwMXggPSBxYmV6aWVyQXQocHRzW3AwXSwgcHRzW2ljXSwgcHRzW3AxXSwgMC41KTtcbiAgICAgIGJwMXkgPSBxYmV6aWVyQXQocHRzW3AwICsgMV0sIHB0c1tpYyArIDFdLCBwdHNbcDEgKyAxXSwgMC41KTtcbiAgICB9XG4gICAgZGlzcFggPSBicDF4IC0gYnAweDtcbiAgICBkaXNwWSA9IGJwMXkgLSBicDB5O1xuICB9XG4gIHJzLm1pZHRndEFycm93QW5nbGUgPSBnZXRBbmdsZUZyb21EaXNwKGRpc3BYLCBkaXNwWSk7XG4gIHJzLm1pZERpc3BYID0gZGlzcFg7XG4gIHJzLm1pZERpc3BZID0gZGlzcFk7XG5cbiAgLy8gbWlkIHNvdXJjZVxuICAvL1xuXG4gIGRpc3BYICo9IC0xO1xuICBkaXNwWSAqPSAtMTtcbiAgaWYgKGlzU2VnbWVudHMpIHtcbiAgICB2YXIgcHRzID0gcnMuYWxscHRzO1xuICAgIGlmIChwdHMubGVuZ3RoIC8gMiAlIDIgPT09IDApIDsgZWxzZSBpZiAoIXJzLmlzUm91bmQpIHtcbiAgICAgIHZhciBpMiA9IHB0cy5sZW5ndGggLyAyIC0gMTtcbiAgICAgIHZhciBpMyA9IGkyICsgMjtcbiAgICAgIGRpc3BYID0gLShwdHNbaTNdIC0gcHRzW2kyXSk7XG4gICAgICBkaXNwWSA9IC0ocHRzW2kzICsgMV0gLSBwdHNbaTIgKyAxXSk7XG4gICAgfVxuICB9XG4gIHJzLm1pZHNyY0Fycm93QW5nbGUgPSBnZXRBbmdsZUZyb21EaXNwKGRpc3BYLCBkaXNwWSk7XG5cbiAgLy8gdGFyZ2V0XG4gIC8vXG5cbiAgaWYgKGlzU2VnbWVudHMpIHtcbiAgICBkaXNwWCA9IGVuZFggLSBycy5zZWdwdHNbcnMuc2VncHRzLmxlbmd0aCAtIDJdO1xuICAgIGRpc3BZID0gZW5kWSAtIHJzLnNlZ3B0c1tycy5zZWdwdHMubGVuZ3RoIC0gMV07XG4gIH0gZWxzZSBpZiAoaXNNdWx0aWJlemllciB8fCBpc0NvbXBvdW5kIHx8IGlzU2VsZiB8fCBpc0Jlemllcikge1xuICAgIHZhciBwdHMgPSBycy5hbGxwdHM7XG4gICAgdmFyIGwgPSBwdHMubGVuZ3RoO1xuICAgIHZhciBiWCA9IHFiZXppZXJBdChwdHNbbCAtIDZdLCBwdHNbbCAtIDRdLCBwdHNbbCAtIDJdLCAwLjkpO1xuICAgIHZhciBiWSA9IHFiZXppZXJBdChwdHNbbCAtIDVdLCBwdHNbbCAtIDNdLCBwdHNbbCAtIDFdLCAwLjkpO1xuICAgIGRpc3BYID0gZW5kWCAtIGJYO1xuICAgIGRpc3BZID0gZW5kWSAtIGJZO1xuICB9IGVsc2Uge1xuICAgIGRpc3BYID0gZW5kWCAtIG1pZFg7XG4gICAgZGlzcFkgPSBlbmRZIC0gbWlkWTtcbiAgfVxuICBycy50Z3RBcnJvd0FuZ2xlID0gZ2V0QW5nbGVGcm9tRGlzcChkaXNwWCwgZGlzcFkpO1xufTtcbkJScCRkLmdldEFycm93V2lkdGggPSBCUnAkZC5nZXRBcnJvd0hlaWdodCA9IGZ1bmN0aW9uIChlZGdlV2lkdGgsIHNjYWxlKSB7XG4gIHZhciBjYWNoZSA9IHRoaXMuYXJyb3dXaWR0aENhY2hlID0gdGhpcy5hcnJvd1dpZHRoQ2FjaGUgfHwge307XG4gIHZhciBjYWNoZWRWYWwgPSBjYWNoZVtlZGdlV2lkdGggKyAnLCAnICsgc2NhbGVdO1xuICBpZiAoY2FjaGVkVmFsKSB7XG4gICAgcmV0dXJuIGNhY2hlZFZhbDtcbiAgfVxuICBjYWNoZWRWYWwgPSBNYXRoLm1heChNYXRoLnBvdyhlZGdlV2lkdGggKiAxMy4zNywgMC45KSwgMjkpICogc2NhbGU7XG4gIGNhY2hlW2VkZ2VXaWR0aCArICcsICcgKyBzY2FsZV0gPSBjYWNoZWRWYWw7XG4gIHJldHVybiBjYWNoZWRWYWw7XG59O1xuXG4vKipcbiAqIEV4cGxhaW5lZCBieSBCbGluZG1hbjY3IGF0IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NDg1NjkyNS8xMTAyODgyOFxuICovXG5cbi8vIERlY2xhcmUgcmV1c2VkIHZhcmlhYmxlIHRvIGF2b2lkIHJlYWxsb2NhdGluZyB2YXJpYWJsZXMgZXZlcnkgdGltZSB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkXG52YXIgeCxcbiAgeSxcbiAgdjEgPSB7fSxcbiAgdjIgPSB7fSxcbiAgc2luQSxcbiAgc2luQTkwLFxuICByYWREaXJlY3Rpb24sXG4gIGRyYXdEaXJlY3Rpb24sXG4gIGFuZ2xlLFxuICBoYWxmQW5nbGUsXG4gIGNSYWRpdXMsXG4gIGxlbk91dCxcbiAgcmFkaXVzLFxuICBsaW1pdDtcbnZhciBzdGFydFgsIHN0YXJ0WSwgc3RvcFgsIHN0b3BZO1xudmFyIGxhc3RQb2ludDtcblxuLy8gY29udmVydCAyIHBvaW50cyBpbnRvIHZlY3RvciBmb3JtLCBwb2xhciBmb3JtLCBhbmQgbm9ybWFsaXNlZFxudmFyIGFzVmVjID0gZnVuY3Rpb24gYXNWZWMocCwgcHAsIHYpIHtcbiAgdi54ID0gcHAueCAtIHAueDtcbiAgdi55ID0gcHAueSAtIHAueTtcbiAgdi5sZW4gPSBNYXRoLnNxcnQodi54ICogdi54ICsgdi55ICogdi55KTtcbiAgdi5ueCA9IHYueCAvIHYubGVuO1xuICB2Lm55ID0gdi55IC8gdi5sZW47XG4gIHYuYW5nID0gTWF0aC5hdGFuMih2Lm55LCB2Lm54KTtcbn07XG52YXIgaW52ZXJ0VmVjID0gZnVuY3Rpb24gaW52ZXJ0VmVjKG9yaWdpbmFsViwgaW52ZXJ0ZWRWKSB7XG4gIGludmVydGVkVi54ID0gb3JpZ2luYWxWLnggKiAtMTtcbiAgaW52ZXJ0ZWRWLnkgPSBvcmlnaW5hbFYueSAqIC0xO1xuICBpbnZlcnRlZFYubnggPSBvcmlnaW5hbFYubnggKiAtMTtcbiAgaW52ZXJ0ZWRWLm55ID0gb3JpZ2luYWxWLm55ICogLTE7XG4gIGludmVydGVkVi5hbmcgPSBvcmlnaW5hbFYuYW5nID4gMCA/IC0oTWF0aC5QSSAtIG9yaWdpbmFsVi5hbmcpIDogTWF0aC5QSSArIG9yaWdpbmFsVi5hbmc7XG59O1xudmFyIGNhbGNDb3JuZXJBcmMgPSBmdW5jdGlvbiBjYWxjQ29ybmVyQXJjKHByZXZpb3VzUG9pbnQsIGN1cnJlbnRQb2ludCwgbmV4dFBvaW50LCByYWRpdXNNYXgsIGlzQXJjUmFkaXVzKSB7XG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUGFydCAxXG4gIHByZXZpb3VzUG9pbnQgIT09IGxhc3RQb2ludCA/IGFzVmVjKGN1cnJlbnRQb2ludCwgcHJldmlvdXNQb2ludCwgdjEpIDogaW52ZXJ0VmVjKHYyLCB2MSk7IC8vIEF2b2lkIHJlY2FsY3VsYXRpbmcgdmVjIGlmIGl0IGlzIHRoZSBpbnZlcnQgb2YgdGhlIGxhc3Qgb25lIGNhbGN1bGF0ZWRcbiAgYXNWZWMoY3VycmVudFBvaW50LCBuZXh0UG9pbnQsIHYyKTtcbiAgc2luQSA9IHYxLm54ICogdjIubnkgLSB2MS5ueSAqIHYyLm54O1xuICBzaW5BOTAgPSB2MS5ueCAqIHYyLm54IC0gdjEubnkgKiAtdjIubnk7XG4gIGFuZ2xlID0gTWF0aC5hc2luKE1hdGgubWF4KC0xLCBNYXRoLm1pbigxLCBzaW5BKSkpO1xuICBpZiAoTWF0aC5hYnMoYW5nbGUpIDwgMWUtNikge1xuICAgIHggPSBjdXJyZW50UG9pbnQueDtcbiAgICB5ID0gY3VycmVudFBvaW50Lnk7XG4gICAgY1JhZGl1cyA9IHJhZGl1cyA9IDA7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgcmFkRGlyZWN0aW9uID0gMTtcbiAgZHJhd0RpcmVjdGlvbiA9IGZhbHNlO1xuICBpZiAoc2luQTkwIDwgMCkge1xuICAgIGlmIChhbmdsZSA8IDApIHtcbiAgICAgIGFuZ2xlID0gTWF0aC5QSSArIGFuZ2xlO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbmdsZSA9IE1hdGguUEkgLSBhbmdsZTtcbiAgICAgIHJhZERpcmVjdGlvbiA9IC0xO1xuICAgICAgZHJhd0RpcmVjdGlvbiA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChhbmdsZSA+IDApIHtcbiAgICAgIHJhZERpcmVjdGlvbiA9IC0xO1xuICAgICAgZHJhd0RpcmVjdGlvbiA9IHRydWU7XG4gICAgfVxuICB9XG4gIGlmIChjdXJyZW50UG9pbnQucmFkaXVzICE9PSB1bmRlZmluZWQpIHtcbiAgICByYWRpdXMgPSBjdXJyZW50UG9pbnQucmFkaXVzO1xuICB9IGVsc2Uge1xuICAgIHJhZGl1cyA9IHJhZGl1c01heDtcbiAgfVxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFBhcnQgMlxuICBoYWxmQW5nbGUgPSBhbmdsZSAvIDI7XG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBsaW1pdCA9IE1hdGgubWluKHYxLmxlbiAvIDIsIHYyLmxlbiAvIDIpO1xuICBpZiAoaXNBcmNSYWRpdXMpIHtcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUGFydCAzXG4gICAgbGVuT3V0ID0gTWF0aC5hYnMoTWF0aC5jb3MoaGFsZkFuZ2xlKSAqIHJhZGl1cyAvIE1hdGguc2luKGhhbGZBbmdsZSkpO1xuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFNwZWNpYWwgcGFydCBBXG4gICAgaWYgKGxlbk91dCA+IGxpbWl0KSB7XG4gICAgICBsZW5PdXQgPSBsaW1pdDtcbiAgICAgIGNSYWRpdXMgPSBNYXRoLmFicyhsZW5PdXQgKiBNYXRoLnNpbihoYWxmQW5nbGUpIC8gTWF0aC5jb3MoaGFsZkFuZ2xlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNSYWRpdXMgPSByYWRpdXM7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxlbk91dCA9IE1hdGgubWluKGxpbWl0LCByYWRpdXMpO1xuICAgIGNSYWRpdXMgPSBNYXRoLmFicyhsZW5PdXQgKiBNYXRoLnNpbihoYWxmQW5nbGUpIC8gTWF0aC5jb3MoaGFsZkFuZ2xlKSk7XG4gIH1cbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUGFydCA0XG4gIHN0b3BYID0gY3VycmVudFBvaW50LnggKyB2Mi5ueCAqIGxlbk91dDtcbiAgc3RvcFkgPSBjdXJyZW50UG9pbnQueSArIHYyLm55ICogbGVuT3V0O1xuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFBhcnQgNVxuICB4ID0gc3RvcFggLSB2Mi5ueSAqIGNSYWRpdXMgKiByYWREaXJlY3Rpb247XG4gIHkgPSBzdG9wWSArIHYyLm54ICogY1JhZGl1cyAqIHJhZERpcmVjdGlvbjtcbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBBZGRpdGlvbmFsIFBhcnQgOiBjYWxjdWxhdGUgc3RhcnQgcG9pbnQgRVxuICBzdGFydFggPSBjdXJyZW50UG9pbnQueCArIHYxLm54ICogbGVuT3V0O1xuICBzdGFydFkgPSBjdXJyZW50UG9pbnQueSArIHYxLm55ICogbGVuT3V0O1xuXG4gIC8vIFNhdmUgbGFzdCBwb2ludCB0byBhdm9pZCByZWNhbGN1bGF0aW5nIHZlY3RvciB3aGVuIG5vdCBuZWVkZWRcbiAgbGFzdFBvaW50ID0gY3VycmVudFBvaW50O1xufTtcblxuLyoqXG4gKiBEcmF3IGNvcm5lciBwcm92aWRlZCBieSB7QGxpbmsgZ2V0Um91bmRDb3JuZXJ9XG4gKlxuICogQHBhcmFtIGN0eCA6Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG4gKiBAcGFyYW0gcm91bmRDb3JuZXIge3tjeDpudW1iZXIsIGN5Om51bWJlciwgcmFkaXVzOm51bWJlciwgZW5kQW5nbGU6IG51bWJlciwgc3RhcnRBbmdsZTogbnVtYmVyLCBjb3VudGVyQ2xvY2t3aXNlOiBib29sZWFufX1cbiAqL1xuZnVuY3Rpb24gZHJhd1ByZXBhcmVkUm91bmRDb3JuZXIoY3R4LCByb3VuZENvcm5lcikge1xuICBpZiAocm91bmRDb3JuZXIucmFkaXVzID09PSAwKSBjdHgubGluZVRvKHJvdW5kQ29ybmVyLmN4LCByb3VuZENvcm5lci5jeSk7ZWxzZSBjdHguYXJjKHJvdW5kQ29ybmVyLmN4LCByb3VuZENvcm5lci5jeSwgcm91bmRDb3JuZXIucmFkaXVzLCByb3VuZENvcm5lci5zdGFydEFuZ2xlLCByb3VuZENvcm5lci5lbmRBbmdsZSwgcm91bmRDb3JuZXIuY291bnRlckNsb2Nrd2lzZSk7XG59XG5cbi8qKlxuICogR2V0IHJvdW5kIGNvcm5lciBmcm9tIGEgcG9pbnQgYW5kIGl0cyBwcmV2aW91cyBhbmQgbmV4dCBuZWlnaGJvdXJzIGluIGEgcGF0aFxuICpcbiAqIEBwYXJhbSBwcmV2aW91c1BvaW50IHt7eDogbnVtYmVyLCB5Om51bWJlciwgcmFkaXVzOiBudW1iZXI/fX1cbiAqIEBwYXJhbSBjdXJyZW50UG9pbnQge3t4OiBudW1iZXIsIHk6bnVtYmVyLCByYWRpdXM6IG51bWJlcj99fVxuICogQHBhcmFtIG5leHRQb2ludCB7e3g6IG51bWJlciwgeTpudW1iZXIsIHJhZGl1czogbnVtYmVyP319XG4gKiBAcGFyYW0gcmFkaXVzTWF4IDpudW1iZXJcbiAqIEBwYXJhbSBpc0FyY1JhZGl1cyA6Ym9vbGVhblxuICogQHJldHVybiB7e1xuICogY3g6bnVtYmVyLCBjeTpudW1iZXIsIHJhZGl1czpudW1iZXIsXG4gKiBzdGFydFg6bnVtYmVyLCBzdGFydFk6bnVtYmVyLFxuICogc3RvcFg6bnVtYmVyLCBzdG9wWTogbnVtYmVyLFxuICogZW5kQW5nbGU6IG51bWJlciwgc3RhcnRBbmdsZTogbnVtYmVyLCBjb3VudGVyQ2xvY2t3aXNlOiBib29sZWFuXG4gKiB9fVxuICovXG5mdW5jdGlvbiBnZXRSb3VuZENvcm5lcihwcmV2aW91c1BvaW50LCBjdXJyZW50UG9pbnQsIG5leHRQb2ludCwgcmFkaXVzTWF4KSB7XG4gIHZhciBpc0FyY1JhZGl1cyA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgaWYgKHJhZGl1c01heCA9PT0gMCB8fCBjdXJyZW50UG9pbnQucmFkaXVzID09PSAwKSByZXR1cm4ge1xuICAgIGN4OiBjdXJyZW50UG9pbnQueCxcbiAgICBjeTogY3VycmVudFBvaW50LnksXG4gICAgcmFkaXVzOiAwLFxuICAgIHN0YXJ0WDogY3VycmVudFBvaW50LngsXG4gICAgc3RhcnRZOiBjdXJyZW50UG9pbnQueSxcbiAgICBzdG9wWDogY3VycmVudFBvaW50LngsXG4gICAgc3RvcFk6IGN1cnJlbnRQb2ludC55LFxuICAgIHN0YXJ0QW5nbGU6IHVuZGVmaW5lZCxcbiAgICBlbmRBbmdsZTogdW5kZWZpbmVkLFxuICAgIGNvdW50ZXJDbG9ja3dpc2U6IHVuZGVmaW5lZFxuICB9O1xuICBjYWxjQ29ybmVyQXJjKHByZXZpb3VzUG9pbnQsIGN1cnJlbnRQb2ludCwgbmV4dFBvaW50LCByYWRpdXNNYXgsIGlzQXJjUmFkaXVzKTtcbiAgcmV0dXJuIHtcbiAgICBjeDogeCxcbiAgICBjeTogeSxcbiAgICByYWRpdXM6IGNSYWRpdXMsXG4gICAgc3RhcnRYOiBzdGFydFgsXG4gICAgc3RhcnRZOiBzdGFydFksXG4gICAgc3RvcFg6IHN0b3BYLFxuICAgIHN0b3BZOiBzdG9wWSxcbiAgICBzdGFydEFuZ2xlOiB2MS5hbmcgKyBNYXRoLlBJIC8gMiAqIHJhZERpcmVjdGlvbixcbiAgICBlbmRBbmdsZTogdjIuYW5nIC0gTWF0aC5QSSAvIDIgKiByYWREaXJlY3Rpb24sXG4gICAgY291bnRlckNsb2Nrd2lzZTogZHJhd0RpcmVjdGlvblxuICB9O1xufVxuXG52YXIgQlJwJGMgPSB7fTtcbkJScCRjLmZpbmRNaWRwdFB0c0V0YyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbykge1xuICB2YXIgcG9zUHRzID0gcGFpckluZm8ucG9zUHRzLFxuICAgIGludGVyc2VjdGlvblB0cyA9IHBhaXJJbmZvLmludGVyc2VjdGlvblB0cyxcbiAgICB2ZWN0b3JOb3JtSW52ZXJzZSA9IHBhaXJJbmZvLnZlY3Rvck5vcm1JbnZlcnNlO1xuICB2YXIgbWlkcHRQdHM7XG5cbiAgLy8gbi5iLiBhc3N1bWVzIGFsbCBlZGdlcyBpbiBiZXppZXIgYnVuZGxlIGhhdmUgc2FtZSBlbmRwb2ludHMgc3BlY2lmaWVkXG4gIHZhciBzcmNNYW5FbmRwdCA9IGVkZ2UucHN0eWxlKCdzb3VyY2UtZW5kcG9pbnQnKTtcbiAgdmFyIHRndE1hbkVuZHB0ID0gZWRnZS5wc3R5bGUoJ3RhcmdldC1lbmRwb2ludCcpO1xuICB2YXIgaGF2ZU1hbnVhbEVuZFB0cyA9IHNyY01hbkVuZHB0LnVuaXRzICE9IG51bGwgJiYgdGd0TWFuRW5kcHQudW5pdHMgIT0gbnVsbDtcbiAgdmFyIHJlY2FsY1ZlY3Rvck5vcm1JbnZlcnNlID0gZnVuY3Rpb24gcmVjYWxjVmVjdG9yTm9ybUludmVyc2UoeDEsIHkxLCB4MiwgeTIpIHtcbiAgICB2YXIgZHkgPSB5MiAtIHkxO1xuICAgIHZhciBkeCA9IHgyIC0geDE7XG4gICAgdmFyIGwgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgIHJldHVybiB7XG4gICAgICB4OiAtZHkgLyBsLFxuICAgICAgeTogZHggLyBsXG4gICAgfTtcbiAgfTtcbiAgdmFyIGVkZ2VEaXN0YW5jZXMgPSBlZGdlLnBzdHlsZSgnZWRnZS1kaXN0YW5jZXMnKS52YWx1ZTtcbiAgc3dpdGNoIChlZGdlRGlzdGFuY2VzKSB7XG4gICAgY2FzZSAnbm9kZS1wb3NpdGlvbic6XG4gICAgICBtaWRwdFB0cyA9IHBvc1B0cztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ludGVyc2VjdGlvbic6XG4gICAgICBtaWRwdFB0cyA9IGludGVyc2VjdGlvblB0cztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2VuZHBvaW50cyc6XG4gICAgICB7XG4gICAgICAgIGlmIChoYXZlTWFudWFsRW5kUHRzKSB7XG4gICAgICAgICAgdmFyIF90aGlzJG1hbnVhbEVuZHB0VG9QeCA9IHRoaXMubWFudWFsRW5kcHRUb1B4KGVkZ2Uuc291cmNlKClbMF0sIHNyY01hbkVuZHB0KSxcbiAgICAgICAgICAgIF90aGlzJG1hbnVhbEVuZHB0VG9QeDIgPSBfc2xpY2VkVG9BcnJheShfdGhpcyRtYW51YWxFbmRwdFRvUHgsIDIpLFxuICAgICAgICAgICAgeDEgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHgyWzBdLFxuICAgICAgICAgICAgeTEgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHgyWzFdO1xuICAgICAgICAgIHZhciBfdGhpcyRtYW51YWxFbmRwdFRvUHgzID0gdGhpcy5tYW51YWxFbmRwdFRvUHgoZWRnZS50YXJnZXQoKVswXSwgdGd0TWFuRW5kcHQpLFxuICAgICAgICAgICAgX3RoaXMkbWFudWFsRW5kcHRUb1B4NCA9IF9zbGljZWRUb0FycmF5KF90aGlzJG1hbnVhbEVuZHB0VG9QeDMsIDIpLFxuICAgICAgICAgICAgeDIgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHg0WzBdLFxuICAgICAgICAgICAgeTIgPSBfdGhpcyRtYW51YWxFbmRwdFRvUHg0WzFdO1xuICAgICAgICAgIHZhciBlbmRQdHMgPSB7XG4gICAgICAgICAgICB4MTogeDEsXG4gICAgICAgICAgICB5MTogeTEsXG4gICAgICAgICAgICB4MjogeDIsXG4gICAgICAgICAgICB5MjogeTJcbiAgICAgICAgICB9O1xuICAgICAgICAgIHZlY3Rvck5vcm1JbnZlcnNlID0gcmVjYWxjVmVjdG9yTm9ybUludmVyc2UoeDEsIHkxLCB4MiwgeTIpO1xuICAgICAgICAgIG1pZHB0UHRzID0gZW5kUHRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdhcm4oXCJFZGdlIFwiLmNvbmNhdChlZGdlLmlkKCksIFwiIGhhcyBlZGdlLWRpc3RhbmNlczplbmRwb2ludHMgc3BlY2lmaWVkIHdpdGhvdXQgbWFudWFsIGVuZHBvaW50cyBzcGVjaWZpZWQgdmlhIHNvdXJjZS1lbmRwb2ludCBhbmQgdGFyZ2V0LWVuZHBvaW50LiAgRmFsbGluZyBiYWNrIG9uIGVkZ2UtZGlzdGFuY2VzOmludGVyc2VjdGlvbiAoZGVmYXVsdCkuXCIpKTtcbiAgICAgICAgICBtaWRwdFB0cyA9IGludGVyc2VjdGlvblB0czsgLy8gYmFjayB0byBkZWZhdWx0XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIG1pZHB0UHRzOiBtaWRwdFB0cyxcbiAgICB2ZWN0b3JOb3JtSW52ZXJzZTogdmVjdG9yTm9ybUludmVyc2VcbiAgfTtcbn07XG5CUnAkYy5maW5kSGF5c3RhY2tQb2ludHMgPSBmdW5jdGlvbiAoZWRnZXMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgICB2YXIgcnMgPSBfcC5yc2NyYXRjaDtcbiAgICBpZiAoIXJzLmhheXN0YWNrKSB7XG4gICAgICB2YXIgYW5nbGUgPSBNYXRoLnJhbmRvbSgpICogMiAqIE1hdGguUEk7XG4gICAgICBycy5zb3VyY2UgPSB7XG4gICAgICAgIHg6IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgeTogTWF0aC5zaW4oYW5nbGUpXG4gICAgICB9O1xuICAgICAgYW5nbGUgPSBNYXRoLnJhbmRvbSgpICogMiAqIE1hdGguUEk7XG4gICAgICBycy50YXJnZXQgPSB7XG4gICAgICAgIHg6IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgeTogTWF0aC5zaW4oYW5nbGUpXG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgc3JjID0gX3Auc291cmNlO1xuICAgIHZhciB0Z3QgPSBfcC50YXJnZXQ7XG4gICAgdmFyIHNyY1BvcyA9IHNyYy5wb3NpdGlvbigpO1xuICAgIHZhciB0Z3RQb3MgPSB0Z3QucG9zaXRpb24oKTtcbiAgICB2YXIgc3JjVyA9IHNyYy53aWR0aCgpO1xuICAgIHZhciB0Z3RXID0gdGd0LndpZHRoKCk7XG4gICAgdmFyIHNyY0ggPSBzcmMuaGVpZ2h0KCk7XG4gICAgdmFyIHRndEggPSB0Z3QuaGVpZ2h0KCk7XG4gICAgdmFyIHJhZGl1cyA9IGVkZ2UucHN0eWxlKCdoYXlzdGFjay1yYWRpdXMnKS52YWx1ZTtcbiAgICB2YXIgaGFsZlJhZGl1cyA9IHJhZGl1cyAvIDI7IC8vIGIvYyBoYXZlIHRvIGhhbGYgd2lkdGgvaGVpZ2h0XG5cbiAgICBycy5oYXlzdGFja1B0cyA9IHJzLmFsbHB0cyA9IFtycy5zb3VyY2UueCAqIHNyY1cgKiBoYWxmUmFkaXVzICsgc3JjUG9zLngsIHJzLnNvdXJjZS55ICogc3JjSCAqIGhhbGZSYWRpdXMgKyBzcmNQb3MueSwgcnMudGFyZ2V0LnggKiB0Z3RXICogaGFsZlJhZGl1cyArIHRndFBvcy54LCBycy50YXJnZXQueSAqIHRndEggKiBoYWxmUmFkaXVzICsgdGd0UG9zLnldO1xuICAgIHJzLm1pZFggPSAocnMuYWxscHRzWzBdICsgcnMuYWxscHRzWzJdKSAvIDI7XG4gICAgcnMubWlkWSA9IChycy5hbGxwdHNbMV0gKyBycy5hbGxwdHNbM10pIC8gMjtcblxuICAgIC8vIGFsd2F5cyBvdmVycmlkZSBhcyBoYXlzdGFjayBpbiBjYXNlIHNldCB0byBkaWZmZXJlbnQgdHlwZSBwcmV2aW91c2x5XG4gICAgcnMuZWRnZVR5cGUgPSAnaGF5c3RhY2snO1xuICAgIHJzLmhheXN0YWNrID0gdHJ1ZTtcbiAgICB0aGlzLnN0b3JlRWRnZVByb2plY3Rpb25zKGVkZ2UpO1xuICAgIHRoaXMuY2FsY3VsYXRlQXJyb3dBbmdsZXMoZWRnZSk7XG4gICAgdGhpcy5yZWNhbGN1bGF0ZUVkZ2VMYWJlbFByb2plY3Rpb25zKGVkZ2UpO1xuICAgIHRoaXMuY2FsY3VsYXRlTGFiZWxBbmdsZXMoZWRnZSk7XG4gIH1cbn07XG5CUnAkYy5maW5kU2VnbWVudHNQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSwgcGFpckluZm8pIHtcbiAgLy8gU2VnbWVudHMgKG11bHRpcGxlIHN0cmFpZ2h0IGxpbmVzKVxuXG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBzZWdtZW50V3MgPSBlZGdlLnBzdHlsZSgnc2VnbWVudC13ZWlnaHRzJyk7XG4gIHZhciBzZWdtZW50RHMgPSBlZGdlLnBzdHlsZSgnc2VnbWVudC1kaXN0YW5jZXMnKTtcbiAgdmFyIHNlZ21lbnRScyA9IGVkZ2UucHN0eWxlKCdzZWdtZW50LXJhZGlpJyk7XG4gIHZhciBzZWdtZW50VHMgPSBlZGdlLnBzdHlsZSgncmFkaXVzLXR5cGUnKTtcbiAgdmFyIHNlZ21lbnRzTiA9IE1hdGgubWluKHNlZ21lbnRXcy5wZlZhbHVlLmxlbmd0aCwgc2VnbWVudERzLnBmVmFsdWUubGVuZ3RoKTtcbiAgdmFyIGxhc3RSYWRpdXMgPSBzZWdtZW50UnMucGZWYWx1ZVtzZWdtZW50UnMucGZWYWx1ZS5sZW5ndGggLSAxXTtcbiAgdmFyIGxhc3RSYWRpdXNUeXBlID0gc2VnbWVudFRzLnBmVmFsdWVbc2VnbWVudFRzLnBmVmFsdWUubGVuZ3RoIC0gMV07XG4gIHJzLmVkZ2VUeXBlID0gJ3NlZ21lbnRzJztcbiAgcnMuc2VncHRzID0gW107XG4gIHJzLnJhZGlpID0gW107XG4gIHJzLmlzQXJjUmFkaXVzID0gW107XG4gIGZvciAodmFyIHMgPSAwOyBzIDwgc2VnbWVudHNOOyBzKyspIHtcbiAgICB2YXIgdyA9IHNlZ21lbnRXcy5wZlZhbHVlW3NdO1xuICAgIHZhciBkID0gc2VnbWVudERzLnBmVmFsdWVbc107XG4gICAgdmFyIHcxID0gMSAtIHc7XG4gICAgdmFyIHcyID0gdztcbiAgICB2YXIgX3RoaXMkZmluZE1pZHB0UHRzRXRjID0gdGhpcy5maW5kTWlkcHRQdHNFdGMoZWRnZSwgcGFpckluZm8pLFxuICAgICAgbWlkcHRQdHMgPSBfdGhpcyRmaW5kTWlkcHRQdHNFdGMubWlkcHRQdHMsXG4gICAgICB2ZWN0b3JOb3JtSW52ZXJzZSA9IF90aGlzJGZpbmRNaWRwdFB0c0V0Yy52ZWN0b3JOb3JtSW52ZXJzZTtcbiAgICB2YXIgYWRqdXN0ZWRNaWRwdCA9IHtcbiAgICAgIHg6IG1pZHB0UHRzLngxICogdzEgKyBtaWRwdFB0cy54MiAqIHcyLFxuICAgICAgeTogbWlkcHRQdHMueTEgKiB3MSArIG1pZHB0UHRzLnkyICogdzJcbiAgICB9O1xuICAgIHJzLnNlZ3B0cy5wdXNoKGFkanVzdGVkTWlkcHQueCArIHZlY3Rvck5vcm1JbnZlcnNlLnggKiBkLCBhZGp1c3RlZE1pZHB0LnkgKyB2ZWN0b3JOb3JtSW52ZXJzZS55ICogZCk7XG4gICAgcnMucmFkaWkucHVzaChzZWdtZW50UnMucGZWYWx1ZVtzXSAhPT0gdW5kZWZpbmVkID8gc2VnbWVudFJzLnBmVmFsdWVbc10gOiBsYXN0UmFkaXVzKTtcbiAgICBycy5pc0FyY1JhZGl1cy5wdXNoKChzZWdtZW50VHMucGZWYWx1ZVtzXSAhPT0gdW5kZWZpbmVkID8gc2VnbWVudFRzLnBmVmFsdWVbc10gOiBsYXN0UmFkaXVzVHlwZSkgPT09ICdhcmMtcmFkaXVzJyk7XG4gIH1cbn07XG5CUnAkYy5maW5kTG9vcFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbywgaSwgZWRnZUlzVW5idW5kbGVkKSB7XG4gIC8vIFNlbGYtZWRnZVxuXG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBkaXJDb3VudHMgPSBwYWlySW5mby5kaXJDb3VudHMsXG4gICAgc3JjUG9zID0gcGFpckluZm8uc3JjUG9zO1xuICB2YXIgY3RybHB0RGlzdHMgPSBlZGdlLnBzdHlsZSgnY29udHJvbC1wb2ludC1kaXN0YW5jZXMnKTtcbiAgdmFyIGN0cmxwdERpc3QgPSBjdHJscHREaXN0cyA/IGN0cmxwdERpc3RzLnBmVmFsdWVbMF0gOiB1bmRlZmluZWQ7XG4gIHZhciBsb29wRGlyID0gZWRnZS5wc3R5bGUoJ2xvb3AtZGlyZWN0aW9uJykucGZWYWx1ZTtcbiAgdmFyIGxvb3BTd3AgPSBlZGdlLnBzdHlsZSgnbG9vcC1zd2VlcCcpLnBmVmFsdWU7XG4gIHZhciBzdGVwU2l6ZSA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LXN0ZXAtc2l6ZScpLnBmVmFsdWU7XG4gIHJzLmVkZ2VUeXBlID0gJ3NlbGYnO1xuICB2YXIgaiA9IGk7XG4gIHZhciBsb29wRGlzdCA9IHN0ZXBTaXplO1xuICBpZiAoZWRnZUlzVW5idW5kbGVkKSB7XG4gICAgaiA9IDA7XG4gICAgbG9vcERpc3QgPSBjdHJscHREaXN0O1xuICB9XG4gIHZhciBsb29wQW5nbGUgPSBsb29wRGlyIC0gTWF0aC5QSSAvIDI7XG4gIHZhciBvdXRBbmdsZSA9IGxvb3BBbmdsZSAtIGxvb3BTd3AgLyAyO1xuICB2YXIgaW5BbmdsZSA9IGxvb3BBbmdsZSArIGxvb3BTd3AgLyAyO1xuXG4gIC8vIGluY3JlYXNlIGJ5IHN0ZXAgc2l6ZSBmb3Igb3ZlcmxhcHBpbmcgbG9vcHMsIGtleWVkIG9uIGRpcmVjdGlvbiBhbmQgc3dlZXAgdmFsdWVzXG4gIHZhciBkYyA9IFN0cmluZyhsb29wRGlyICsgJ18nICsgbG9vcFN3cCk7XG4gIGogPSBkaXJDb3VudHNbZGNdID09PSB1bmRlZmluZWQgPyBkaXJDb3VudHNbZGNdID0gMCA6ICsrZGlyQ291bnRzW2RjXTtcbiAgcnMuY3RybHB0cyA9IFtzcmNQb3MueCArIE1hdGguY29zKG91dEFuZ2xlKSAqIDEuNCAqIGxvb3BEaXN0ICogKGogLyAzICsgMSksIHNyY1Bvcy55ICsgTWF0aC5zaW4ob3V0QW5nbGUpICogMS40ICogbG9vcERpc3QgKiAoaiAvIDMgKyAxKSwgc3JjUG9zLnggKyBNYXRoLmNvcyhpbkFuZ2xlKSAqIDEuNCAqIGxvb3BEaXN0ICogKGogLyAzICsgMSksIHNyY1Bvcy55ICsgTWF0aC5zaW4oaW5BbmdsZSkgKiAxLjQgKiBsb29wRGlzdCAqIChqIC8gMyArIDEpXTtcbn07XG5CUnAkYy5maW5kQ29tcG91bmRMb29wUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UsIHBhaXJJbmZvLCBpLCBlZGdlSXNVbmJ1bmRsZWQpIHtcbiAgLy8gQ29tcG91bmQgZWRnZVxuXG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHJzLmVkZ2VUeXBlID0gJ2NvbXBvdW5kJztcbiAgdmFyIHNyY1BvcyA9IHBhaXJJbmZvLnNyY1BvcyxcbiAgICB0Z3RQb3MgPSBwYWlySW5mby50Z3RQb3MsXG4gICAgc3JjVyA9IHBhaXJJbmZvLnNyY1csXG4gICAgc3JjSCA9IHBhaXJJbmZvLnNyY0gsXG4gICAgdGd0VyA9IHBhaXJJbmZvLnRndFcsXG4gICAgdGd0SCA9IHBhaXJJbmZvLnRndEg7XG4gIHZhciBzdGVwU2l6ZSA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LXN0ZXAtc2l6ZScpLnBmVmFsdWU7XG4gIHZhciBjdHJscHREaXN0cyA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LWRpc3RhbmNlcycpO1xuICB2YXIgY3RybHB0RGlzdCA9IGN0cmxwdERpc3RzID8gY3RybHB0RGlzdHMucGZWYWx1ZVswXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGogPSBpO1xuICB2YXIgbG9vcERpc3QgPSBzdGVwU2l6ZTtcbiAgaWYgKGVkZ2VJc1VuYnVuZGxlZCkge1xuICAgIGogPSAwO1xuICAgIGxvb3BEaXN0ID0gY3RybHB0RGlzdDtcbiAgfVxuICB2YXIgbG9vcFcgPSA1MDtcbiAgdmFyIGxvb3BhUG9zID0ge1xuICAgIHg6IHNyY1Bvcy54IC0gc3JjVyAvIDIsXG4gICAgeTogc3JjUG9zLnkgLSBzcmNIIC8gMlxuICB9O1xuICB2YXIgbG9vcGJQb3MgPSB7XG4gICAgeDogdGd0UG9zLnggLSB0Z3RXIC8gMixcbiAgICB5OiB0Z3RQb3MueSAtIHRndEggLyAyXG4gIH07XG4gIHZhciBsb29wUG9zID0ge1xuICAgIHg6IE1hdGgubWluKGxvb3BhUG9zLngsIGxvb3BiUG9zLngpLFxuICAgIHk6IE1hdGgubWluKGxvb3BhUG9zLnksIGxvb3BiUG9zLnkpXG4gIH07XG5cbiAgLy8gYXZvaWRzIGNhc2VzIHdpdGggaW1wb3NzaWJsZSBiZXppZXJzXG4gIHZhciBtaW5Db21wb3VuZFN0cmV0Y2ggPSAwLjU7XG4gIHZhciBjb21wb3VuZFN0cmV0Y2hBID0gTWF0aC5tYXgobWluQ29tcG91bmRTdHJldGNoLCBNYXRoLmxvZyhzcmNXICogMC4wMSkpO1xuICB2YXIgY29tcG91bmRTdHJldGNoQiA9IE1hdGgubWF4KG1pbkNvbXBvdW5kU3RyZXRjaCwgTWF0aC5sb2codGd0VyAqIDAuMDEpKTtcbiAgcnMuY3RybHB0cyA9IFtsb29wUG9zLngsIGxvb3BQb3MueSAtICgxICsgTWF0aC5wb3cobG9vcFcsIDEuMTIpIC8gMTAwKSAqIGxvb3BEaXN0ICogKGogLyAzICsgMSkgKiBjb21wb3VuZFN0cmV0Y2hBLCBsb29wUG9zLnggLSAoMSArIE1hdGgucG93KGxvb3BXLCAxLjEyKSAvIDEwMCkgKiBsb29wRGlzdCAqIChqIC8gMyArIDEpICogY29tcG91bmRTdHJldGNoQiwgbG9vcFBvcy55XTtcbn07XG5CUnAkYy5maW5kU3RyYWlnaHRFZGdlUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgLy8gU3RyYWlnaHQgZWRnZSB3aXRoaW4gYnVuZGxlXG5cbiAgZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaC5lZGdlVHlwZSA9ICdzdHJhaWdodCc7XG59O1xuQlJwJGMuZmluZEJlemllclBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbywgaSwgZWRnZUlzVW5idW5kbGVkLCBlZGdlSXNTd2FwcGVkKSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciBzdGVwU2l6ZSA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LXN0ZXAtc2l6ZScpLnBmVmFsdWU7XG4gIHZhciBjdHJscHREaXN0cyA9IGVkZ2UucHN0eWxlKCdjb250cm9sLXBvaW50LWRpc3RhbmNlcycpO1xuICB2YXIgY3RybHB0V3MgPSBlZGdlLnBzdHlsZSgnY29udHJvbC1wb2ludC13ZWlnaHRzJyk7XG4gIHZhciBiZXppZXJOID0gY3RybHB0RGlzdHMgJiYgY3RybHB0V3MgPyBNYXRoLm1pbihjdHJscHREaXN0cy52YWx1ZS5sZW5ndGgsIGN0cmxwdFdzLnZhbHVlLmxlbmd0aCkgOiAxO1xuICB2YXIgY3RybHB0RGlzdCA9IGN0cmxwdERpc3RzID8gY3RybHB0RGlzdHMucGZWYWx1ZVswXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGN0cmxwdFdlaWdodCA9IGN0cmxwdFdzLnZhbHVlWzBdO1xuXG4gIC8vIChNdWx0aSliZXppZXJcblxuICB2YXIgbXVsdGkgPSBlZGdlSXNVbmJ1bmRsZWQ7XG4gIHJzLmVkZ2VUeXBlID0gbXVsdGkgPyAnbXVsdGliZXppZXInIDogJ2Jlemllcic7XG4gIHJzLmN0cmxwdHMgPSBbXTtcbiAgZm9yICh2YXIgYiA9IDA7IGIgPCBiZXppZXJOOyBiKyspIHtcbiAgICB2YXIgbm9ybWN0cmxwdERpc3QgPSAoMC41IC0gcGFpckluZm8uZWxlcy5sZW5ndGggLyAyICsgaSkgKiBzdGVwU2l6ZSAqIChlZGdlSXNTd2FwcGVkID8gLTEgOiAxKTtcbiAgICB2YXIgbWFuY3RybHB0RGlzdCA9IHZvaWQgMDtcbiAgICB2YXIgc2lnbiA9IHNpZ251bShub3JtY3RybHB0RGlzdCk7XG4gICAgaWYgKG11bHRpKSB7XG4gICAgICBjdHJscHREaXN0ID0gY3RybHB0RGlzdHMgPyBjdHJscHREaXN0cy5wZlZhbHVlW2JdIDogc3RlcFNpemU7IC8vIGZhbGwgYmFjayBvbiBzdGVwIHNpemVcbiAgICAgIGN0cmxwdFdlaWdodCA9IGN0cmxwdFdzLnZhbHVlW2JdO1xuICAgIH1cbiAgICBpZiAoZWRnZUlzVW5idW5kbGVkKSB7XG4gICAgICAvLyBtdWx0aSBvciBzaW5nbGUgdW5idW5kbGVkXG4gICAgICBtYW5jdHJscHREaXN0ID0gY3RybHB0RGlzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFuY3RybHB0RGlzdCA9IGN0cmxwdERpc3QgIT09IHVuZGVmaW5lZCA/IHNpZ24gKiBjdHJscHREaXN0IDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YXIgZGlzdGFuY2VGcm9tTWlkcG9pbnQgPSBtYW5jdHJscHREaXN0ICE9PSB1bmRlZmluZWQgPyBtYW5jdHJscHREaXN0IDogbm9ybWN0cmxwdERpc3Q7XG4gICAgdmFyIHcxID0gMSAtIGN0cmxwdFdlaWdodDtcbiAgICB2YXIgdzIgPSBjdHJscHRXZWlnaHQ7XG4gICAgdmFyIF90aGlzJGZpbmRNaWRwdFB0c0V0YzIgPSB0aGlzLmZpbmRNaWRwdFB0c0V0YyhlZGdlLCBwYWlySW5mbyksXG4gICAgICBtaWRwdFB0cyA9IF90aGlzJGZpbmRNaWRwdFB0c0V0YzIubWlkcHRQdHMsXG4gICAgICB2ZWN0b3JOb3JtSW52ZXJzZSA9IF90aGlzJGZpbmRNaWRwdFB0c0V0YzIudmVjdG9yTm9ybUludmVyc2U7XG4gICAgdmFyIGFkanVzdGVkTWlkcHQgPSB7XG4gICAgICB4OiBtaWRwdFB0cy54MSAqIHcxICsgbWlkcHRQdHMueDIgKiB3MixcbiAgICAgIHk6IG1pZHB0UHRzLnkxICogdzEgKyBtaWRwdFB0cy55MiAqIHcyXG4gICAgfTtcbiAgICBycy5jdHJscHRzLnB1c2goYWRqdXN0ZWRNaWRwdC54ICsgdmVjdG9yTm9ybUludmVyc2UueCAqIGRpc3RhbmNlRnJvbU1pZHBvaW50LCBhZGp1c3RlZE1pZHB0LnkgKyB2ZWN0b3JOb3JtSW52ZXJzZS55ICogZGlzdGFuY2VGcm9tTWlkcG9pbnQpO1xuICB9XG59O1xuQlJwJGMuZmluZFRheGlQb2ludHMgPSBmdW5jdGlvbiAoZWRnZSwgcGFpckluZm8pIHtcbiAgLy8gVGF4aWNhYiBnZW9tZXRyeSB3aXRoIHR3byB0dXJucyBtYXhpbXVtXG5cbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgcnMuZWRnZVR5cGUgPSAnc2VnbWVudHMnO1xuICB2YXIgVkVSVElDQUwgPSAndmVydGljYWwnO1xuICB2YXIgSE9SSVpPTlRBTCA9ICdob3Jpem9udGFsJztcbiAgdmFyIExFRlRXQVJEID0gJ2xlZnR3YXJkJztcbiAgdmFyIFJJR0hUV0FSRCA9ICdyaWdodHdhcmQnO1xuICB2YXIgRE9XTldBUkQgPSAnZG93bndhcmQnO1xuICB2YXIgVVBXQVJEID0gJ3Vwd2FyZCc7XG4gIHZhciBBVVRPID0gJ2F1dG8nO1xuICB2YXIgcG9zUHRzID0gcGFpckluZm8ucG9zUHRzLFxuICAgIHNyY1cgPSBwYWlySW5mby5zcmNXLFxuICAgIHNyY0ggPSBwYWlySW5mby5zcmNILFxuICAgIHRndFcgPSBwYWlySW5mby50Z3RXLFxuICAgIHRndEggPSBwYWlySW5mby50Z3RIO1xuICB2YXIgZWRnZURpc3RhbmNlcyA9IGVkZ2UucHN0eWxlKCdlZGdlLWRpc3RhbmNlcycpLnZhbHVlO1xuICB2YXIgZEluY2x1ZGVzTm9kZUJvZHkgPSBlZGdlRGlzdGFuY2VzICE9PSAnbm9kZS1wb3NpdGlvbic7XG4gIHZhciB0YXhpRGlyID0gZWRnZS5wc3R5bGUoJ3RheGktZGlyZWN0aW9uJykudmFsdWU7XG4gIHZhciByYXdUYXhpRGlyID0gdGF4aURpcjsgLy8gdW5wcm9jZXNzZWQgdmFsdWVcbiAgdmFyIHRheGlUdXJuID0gZWRnZS5wc3R5bGUoJ3RheGktdHVybicpO1xuICB2YXIgdHVybklzUGVyY2VudCA9IHRheGlUdXJuLnVuaXRzID09PSAnJSc7XG4gIHZhciB0YXhpVHVyblBmVmFsID0gdGF4aVR1cm4ucGZWYWx1ZTtcbiAgdmFyIHR1cm5Jc05lZ2F0aXZlID0gdGF4aVR1cm5QZlZhbCA8IDA7IC8vIGkuZS4gZnJvbSB0YXJnZXQgc2lkZVxuICB2YXIgbWluRCA9IGVkZ2UucHN0eWxlKCd0YXhpLXR1cm4tbWluLWRpc3RhbmNlJykucGZWYWx1ZTtcbiAgdmFyIGR3ID0gZEluY2x1ZGVzTm9kZUJvZHkgPyAoc3JjVyArIHRndFcpIC8gMiA6IDA7XG4gIHZhciBkaCA9IGRJbmNsdWRlc05vZGVCb2R5ID8gKHNyY0ggKyB0Z3RIKSAvIDIgOiAwO1xuICB2YXIgcGR4ID0gcG9zUHRzLngyIC0gcG9zUHRzLngxO1xuICB2YXIgcGR5ID0gcG9zUHRzLnkyIC0gcG9zUHRzLnkxO1xuXG4gIC8vIHRha2UgYXdheSB0aGUgZWZmZWN0aXZlIHcvaCBmcm9tIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGRlbHRhIHZhbHVlXG4gIHZhciBzdWJEV0ggPSBmdW5jdGlvbiBzdWJEV0goZHh5LCBkd2gpIHtcbiAgICBpZiAoZHh5ID4gMCkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KGR4eSAtIGR3aCwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBNYXRoLm1pbihkeHkgKyBkd2gsIDApO1xuICAgIH1cbiAgfTtcbiAgdmFyIGR4ID0gc3ViRFdIKHBkeCwgZHcpO1xuICB2YXIgZHkgPSBzdWJEV0gocGR5LCBkaCk7XG4gIHZhciBpc0V4cGxpY2l0RGlyID0gZmFsc2U7XG4gIGlmIChyYXdUYXhpRGlyID09PSBBVVRPKSB7XG4gICAgdGF4aURpciA9IE1hdGguYWJzKGR4KSA+IE1hdGguYWJzKGR5KSA/IEhPUklaT05UQUwgOiBWRVJUSUNBTDtcbiAgfSBlbHNlIGlmIChyYXdUYXhpRGlyID09PSBVUFdBUkQgfHwgcmF3VGF4aURpciA9PT0gRE9XTldBUkQpIHtcbiAgICB0YXhpRGlyID0gVkVSVElDQUw7XG4gICAgaXNFeHBsaWNpdERpciA9IHRydWU7XG4gIH0gZWxzZSBpZiAocmF3VGF4aURpciA9PT0gTEVGVFdBUkQgfHwgcmF3VGF4aURpciA9PT0gUklHSFRXQVJEKSB7XG4gICAgdGF4aURpciA9IEhPUklaT05UQUw7XG4gICAgaXNFeHBsaWNpdERpciA9IHRydWU7XG4gIH1cbiAgdmFyIGlzVmVydCA9IHRheGlEaXIgPT09IFZFUlRJQ0FMO1xuICB2YXIgbCA9IGlzVmVydCA/IGR5IDogZHg7XG4gIHZhciBwbCA9IGlzVmVydCA/IHBkeSA6IHBkeDtcbiAgdmFyIHNnbkwgPSBzaWdudW0ocGwpO1xuICB2YXIgZm9yY2VkRGlyID0gZmFsc2U7XG4gIGlmICghKGlzRXhwbGljaXREaXIgJiYgKHR1cm5Jc1BlcmNlbnQgfHwgdHVybklzTmVnYXRpdmUpKSAvLyBmb3JjaW5nIGluIHRoaXMgY2FzZSB3b3VsZCBjYXVzZSB3ZWlyZCBncm93aW5nIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb25cbiAgJiYgKHJhd1RheGlEaXIgPT09IERPV05XQVJEICYmIHBsIDwgMCB8fCByYXdUYXhpRGlyID09PSBVUFdBUkQgJiYgcGwgPiAwIHx8IHJhd1RheGlEaXIgPT09IExFRlRXQVJEICYmIHBsID4gMCB8fCByYXdUYXhpRGlyID09PSBSSUdIVFdBUkQgJiYgcGwgPCAwKSkge1xuICAgIHNnbkwgKj0gLTE7XG4gICAgbCA9IHNnbkwgKiBNYXRoLmFicyhsKTtcbiAgICBmb3JjZWREaXIgPSB0cnVlO1xuICB9XG4gIHZhciBkO1xuICBpZiAodHVybklzUGVyY2VudCkge1xuICAgIHZhciBwID0gdGF4aVR1cm5QZlZhbCA8IDAgPyAxICsgdGF4aVR1cm5QZlZhbCA6IHRheGlUdXJuUGZWYWw7XG4gICAgZCA9IHAgKiBsO1xuICB9IGVsc2Uge1xuICAgIHZhciBrID0gdGF4aVR1cm5QZlZhbCA8IDAgPyBsIDogMDtcbiAgICBkID0gayArIHRheGlUdXJuUGZWYWwgKiBzZ25MO1xuICB9XG4gIHZhciBnZXRJc1Rvb0Nsb3NlID0gZnVuY3Rpb24gZ2V0SXNUb29DbG9zZShkKSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKGQpIDwgbWluRCB8fCBNYXRoLmFicyhkKSA+PSBNYXRoLmFicyhsKTtcbiAgfTtcbiAgdmFyIGlzVG9vQ2xvc2VTcmMgPSBnZXRJc1Rvb0Nsb3NlKGQpO1xuICB2YXIgaXNUb29DbG9zZVRndCA9IGdldElzVG9vQ2xvc2UoTWF0aC5hYnMobCkgLSBNYXRoLmFicyhkKSk7XG4gIHZhciBpc1Rvb0Nsb3NlID0gaXNUb29DbG9zZVNyYyB8fCBpc1Rvb0Nsb3NlVGd0O1xuICBpZiAoaXNUb29DbG9zZSAmJiAhZm9yY2VkRGlyKSB7XG4gICAgLy8gbm9uLWlkZWFsIHJvdXRpbmdcbiAgICBpZiAoaXNWZXJ0KSB7XG4gICAgICAvLyB2ZXJ0aWNhbCBmYWxsYmFja3NcbiAgICAgIHZhciBsU2hhcGVJbnNpZGVTcmMgPSBNYXRoLmFicyhwbCkgPD0gc3JjSCAvIDI7XG4gICAgICB2YXIgbFNoYXBlSW5zaWRlVGd0ID0gTWF0aC5hYnMocGR4KSA8PSB0Z3RXIC8gMjtcbiAgICAgIGlmIChsU2hhcGVJbnNpZGVTcmMpIHtcbiAgICAgICAgLy8gaG9yaXpvbnRhbCBaLXNoYXBlIChkaXJlY3Rpb24gbm90IHJlc3BlY3RlZClcbiAgICAgICAgdmFyIHggPSAocG9zUHRzLngxICsgcG9zUHRzLngyKSAvIDI7XG4gICAgICAgIHZhciB5MSA9IHBvc1B0cy55MSxcbiAgICAgICAgICB5MiA9IHBvc1B0cy55MjtcbiAgICAgICAgcnMuc2VncHRzID0gW3gsIHkxLCB4LCB5Ml07XG4gICAgICB9IGVsc2UgaWYgKGxTaGFwZUluc2lkZVRndCkge1xuICAgICAgICAvLyB2ZXJ0aWNhbCBaLXNoYXBlIChkaXN0YW5jZSBub3QgcmVzcGVjdGVkKVxuICAgICAgICB2YXIgeSA9IChwb3NQdHMueTEgKyBwb3NQdHMueTIpIC8gMjtcbiAgICAgICAgdmFyIHgxID0gcG9zUHRzLngxLFxuICAgICAgICAgIHgyID0gcG9zUHRzLngyO1xuICAgICAgICBycy5zZWdwdHMgPSBbeDEsIHksIHgyLCB5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEwtc2hhcGUgZmFsbGJhY2sgKHR1cm4gZGlzdGFuY2Ugbm90IHJlc3BlY3RlZCwgYnV0IHdvcmtzIHdlbGwgd2l0aCB0cmVlIHNpYmxpbmdzKVxuICAgICAgICBycy5zZWdwdHMgPSBbcG9zUHRzLngxLCBwb3NQdHMueTJdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBob3Jpem9udGFsIGZhbGxiYWNrc1xuICAgICAgdmFyIF9sU2hhcGVJbnNpZGVTcmMgPSBNYXRoLmFicyhwbCkgPD0gc3JjVyAvIDI7XG4gICAgICB2YXIgX2xTaGFwZUluc2lkZVRndCA9IE1hdGguYWJzKHBkeSkgPD0gdGd0SCAvIDI7XG4gICAgICBpZiAoX2xTaGFwZUluc2lkZVNyYykge1xuICAgICAgICAvLyB2ZXJ0aWNhbCBaLXNoYXBlIChkaXJlY3Rpb24gbm90IHJlc3BlY3RlZClcbiAgICAgICAgdmFyIF95ID0gKHBvc1B0cy55MSArIHBvc1B0cy55MikgLyAyO1xuICAgICAgICB2YXIgX3ggPSBwb3NQdHMueDEsXG4gICAgICAgICAgX3gyID0gcG9zUHRzLngyO1xuICAgICAgICBycy5zZWdwdHMgPSBbX3gsIF95LCBfeDIsIF95XTtcbiAgICAgIH0gZWxzZSBpZiAoX2xTaGFwZUluc2lkZVRndCkge1xuICAgICAgICAvLyBob3Jpem9udGFsIFotc2hhcGUgKHR1cm4gZGlzdGFuY2Ugbm90IHJlc3BlY3RlZClcbiAgICAgICAgdmFyIF94MyA9IChwb3NQdHMueDEgKyBwb3NQdHMueDIpIC8gMjtcbiAgICAgICAgdmFyIF95MiA9IHBvc1B0cy55MSxcbiAgICAgICAgICBfeTMgPSBwb3NQdHMueTI7XG4gICAgICAgIHJzLnNlZ3B0cyA9IFtfeDMsIF95MiwgX3gzLCBfeTNdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTC1zaGFwZSAodHVybiBkaXN0YW5jZSBub3QgcmVzcGVjdGVkLCBidXQgd29ya3Mgd2VsbCBmb3IgdHJlZSBzaWJsaW5ncylcbiAgICAgICAgcnMuc2VncHRzID0gW3Bvc1B0cy54MiwgcG9zUHRzLnkxXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gaWRlYWwgcm91dGluZ1xuICAgIGlmIChpc1ZlcnQpIHtcbiAgICAgIHZhciBfeTQgPSBwb3NQdHMueTEgKyBkICsgKGRJbmNsdWRlc05vZGVCb2R5ID8gc3JjSCAvIDIgKiBzZ25MIDogMCk7XG4gICAgICB2YXIgX3g0ID0gcG9zUHRzLngxLFxuICAgICAgICBfeDUgPSBwb3NQdHMueDI7XG4gICAgICBycy5zZWdwdHMgPSBbX3g0LCBfeTQsIF94NSwgX3k0XTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaG9yaXpvbnRhbFxuICAgICAgdmFyIF94NiA9IHBvc1B0cy54MSArIGQgKyAoZEluY2x1ZGVzTm9kZUJvZHkgPyBzcmNXIC8gMiAqIHNnbkwgOiAwKTtcbiAgICAgIHZhciBfeTUgPSBwb3NQdHMueTEsXG4gICAgICAgIF95NiA9IHBvc1B0cy55MjtcbiAgICAgIHJzLnNlZ3B0cyA9IFtfeDYsIF95NSwgX3g2LCBfeTZdO1xuICAgIH1cbiAgfVxuICBpZiAocnMuaXNSb3VuZCkge1xuICAgIHZhciByYWRpdXMgPSBlZGdlLnBzdHlsZSgndGF4aS1yYWRpdXMnKS52YWx1ZTtcbiAgICB2YXIgaXNBcmNSYWRpdXMgPSBlZGdlLnBzdHlsZSgncmFkaXVzLXR5cGUnKS52YWx1ZVswXSA9PT0gJ2FyYy1yYWRpdXMnO1xuICAgIHJzLnJhZGlpID0gbmV3IEFycmF5KHJzLnNlZ3B0cy5sZW5ndGggLyAyKS5maWxsKHJhZGl1cyk7XG4gICAgcnMuaXNBcmNSYWRpdXMgPSBuZXcgQXJyYXkocnMuc2VncHRzLmxlbmd0aCAvIDIpLmZpbGwoaXNBcmNSYWRpdXMpO1xuICB9XG59O1xuQlJwJGMudHJ5VG9Db3JyZWN0SW52YWxpZFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlLCBwYWlySW5mbykge1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuXG4gIC8vIGNhbiBvbmx5IGNvcnJlY3QgYmV6aWVycyBmb3Igbm93Li4uXG4gIGlmIChycy5lZGdlVHlwZSA9PT0gJ2JlemllcicpIHtcbiAgICB2YXIgc3JjUG9zID0gcGFpckluZm8uc3JjUG9zLFxuICAgICAgdGd0UG9zID0gcGFpckluZm8udGd0UG9zLFxuICAgICAgc3JjVyA9IHBhaXJJbmZvLnNyY1csXG4gICAgICBzcmNIID0gcGFpckluZm8uc3JjSCxcbiAgICAgIHRndFcgPSBwYWlySW5mby50Z3RXLFxuICAgICAgdGd0SCA9IHBhaXJJbmZvLnRndEgsXG4gICAgICBzcmNTaGFwZSA9IHBhaXJJbmZvLnNyY1NoYXBlLFxuICAgICAgdGd0U2hhcGUgPSBwYWlySW5mby50Z3RTaGFwZSxcbiAgICAgIHNyY0Nvcm5lclJhZGl1cyA9IHBhaXJJbmZvLnNyY0Nvcm5lclJhZGl1cyxcbiAgICAgIHRndENvcm5lclJhZGl1cyA9IHBhaXJJbmZvLnRndENvcm5lclJhZGl1cyxcbiAgICAgIHNyY1JzID0gcGFpckluZm8uc3JjUnMsXG4gICAgICB0Z3RScyA9IHBhaXJJbmZvLnRndFJzO1xuICAgIHZhciBiYWRTdGFydCA9ICFudW1iZXIkMShycy5zdGFydFgpIHx8ICFudW1iZXIkMShycy5zdGFydFkpO1xuICAgIHZhciBiYWRBU3RhcnQgPSAhbnVtYmVyJDEocnMuYXJyb3dTdGFydFgpIHx8ICFudW1iZXIkMShycy5hcnJvd1N0YXJ0WSk7XG4gICAgdmFyIGJhZEVuZCA9ICFudW1iZXIkMShycy5lbmRYKSB8fCAhbnVtYmVyJDEocnMuZW5kWSk7XG4gICAgdmFyIGJhZEFFbmQgPSAhbnVtYmVyJDEocnMuYXJyb3dFbmRYKSB8fCAhbnVtYmVyJDEocnMuYXJyb3dFbmRZKTtcbiAgICB2YXIgbWluQ3BBRGlzdEZhY3RvciA9IDM7XG4gICAgdmFyIGFycm93VyA9IHRoaXMuZ2V0QXJyb3dXaWR0aChlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlLCBlZGdlLnBzdHlsZSgnYXJyb3ctc2NhbGUnKS52YWx1ZSkgKiB0aGlzLmFycm93U2hhcGVXaWR0aDtcbiAgICB2YXIgbWluQ3BBRGlzdCA9IG1pbkNwQURpc3RGYWN0b3IgKiBhcnJvd1c7XG4gICAgdmFyIHN0YXJ0QUNwRGlzdCA9IGRpc3Qoe1xuICAgICAgeDogcnMuY3RybHB0c1swXSxcbiAgICAgIHk6IHJzLmN0cmxwdHNbMV1cbiAgICB9LCB7XG4gICAgICB4OiBycy5zdGFydFgsXG4gICAgICB5OiBycy5zdGFydFlcbiAgICB9KTtcbiAgICB2YXIgY2xvc2VTdGFydEFDcCA9IHN0YXJ0QUNwRGlzdCA8IG1pbkNwQURpc3Q7XG4gICAgdmFyIGVuZEFDcERpc3QgPSBkaXN0KHtcbiAgICAgIHg6IHJzLmN0cmxwdHNbMF0sXG4gICAgICB5OiBycy5jdHJscHRzWzFdXG4gICAgfSwge1xuICAgICAgeDogcnMuZW5kWCxcbiAgICAgIHk6IHJzLmVuZFlcbiAgICB9KTtcbiAgICB2YXIgY2xvc2VFbmRBQ3AgPSBlbmRBQ3BEaXN0IDwgbWluQ3BBRGlzdDtcbiAgICB2YXIgb3ZlcmxhcHBpbmcgPSBmYWxzZTtcbiAgICBpZiAoYmFkU3RhcnQgfHwgYmFkQVN0YXJ0IHx8IGNsb3NlU3RhcnRBQ3ApIHtcbiAgICAgIG92ZXJsYXBwaW5nID0gdHJ1ZTtcblxuICAgICAgLy8gcHJvamVjdCBjb250cm9sIHBvaW50IGFsb25nIGxpbmUgZnJvbSBzcmMgY2VudHJlIHRvIG91dHNpZGUgdGhlIHNyYyBzaGFwZVxuICAgICAgLy8gKG90aGVyd2lzZSBpbnRlcnNlY3Rpb24gd2lsbCB5aWVsZCBub3RoaW5nKVxuICAgICAgdmFyIGNwRCA9IHtcbiAgICAgICAgLy8gZGVsdGFcbiAgICAgICAgeDogcnMuY3RybHB0c1swXSAtIHNyY1Bvcy54LFxuICAgICAgICB5OiBycy5jdHJscHRzWzFdIC0gc3JjUG9zLnlcbiAgICAgIH07XG4gICAgICB2YXIgY3BMID0gTWF0aC5zcXJ0KGNwRC54ICogY3BELnggKyBjcEQueSAqIGNwRC55KTsgLy8gbGVuZ3RoIG9mIGxpbmVcbiAgICAgIHZhciBjcE0gPSB7XG4gICAgICAgIC8vIG5vcm1hbGlzZWQgZGVsdGFcbiAgICAgICAgeDogY3BELnggLyBjcEwsXG4gICAgICAgIHk6IGNwRC55IC8gY3BMXG4gICAgICB9O1xuICAgICAgdmFyIHJhZGl1cyA9IE1hdGgubWF4KHNyY1csIHNyY0gpO1xuICAgICAgdmFyIGNwUHJvaiA9IHtcbiAgICAgICAgLy8gKjIgcmFkaXVzIGd1YXJhbnRlZXMgb3V0c2lkZSBzaGFwZVxuICAgICAgICB4OiBycy5jdHJscHRzWzBdICsgY3BNLnggKiAyICogcmFkaXVzLFxuICAgICAgICB5OiBycy5jdHJscHRzWzFdICsgY3BNLnkgKiAyICogcmFkaXVzXG4gICAgICB9O1xuICAgICAgdmFyIHNyY0N0cmxQdEludG4gPSBzcmNTaGFwZS5pbnRlcnNlY3RMaW5lKHNyY1Bvcy54LCBzcmNQb3MueSwgc3JjVywgc3JjSCwgY3BQcm9qLngsIGNwUHJvai55LCAwLCBzcmNDb3JuZXJSYWRpdXMsIHNyY1JzKTtcbiAgICAgIGlmIChjbG9zZVN0YXJ0QUNwKSB7XG4gICAgICAgIHJzLmN0cmxwdHNbMF0gPSBycy5jdHJscHRzWzBdICsgY3BNLnggKiAobWluQ3BBRGlzdCAtIHN0YXJ0QUNwRGlzdCk7XG4gICAgICAgIHJzLmN0cmxwdHNbMV0gPSBycy5jdHJscHRzWzFdICsgY3BNLnkgKiAobWluQ3BBRGlzdCAtIHN0YXJ0QUNwRGlzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBycy5jdHJscHRzWzBdID0gc3JjQ3RybFB0SW50blswXSArIGNwTS54ICogbWluQ3BBRGlzdDtcbiAgICAgICAgcnMuY3RybHB0c1sxXSA9IHNyY0N0cmxQdEludG5bMV0gKyBjcE0ueSAqIG1pbkNwQURpc3Q7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChiYWRFbmQgfHwgYmFkQUVuZCB8fCBjbG9zZUVuZEFDcCkge1xuICAgICAgb3ZlcmxhcHBpbmcgPSB0cnVlO1xuXG4gICAgICAvLyBwcm9qZWN0IGNvbnRyb2wgcG9pbnQgYWxvbmcgbGluZSBmcm9tIHRndCBjZW50cmUgdG8gb3V0c2lkZSB0aGUgdGd0IHNoYXBlXG4gICAgICAvLyAob3RoZXJ3aXNlIGludGVyc2VjdGlvbiB3aWxsIHlpZWxkIG5vdGhpbmcpXG4gICAgICB2YXIgX2NwRCA9IHtcbiAgICAgICAgLy8gZGVsdGFcbiAgICAgICAgeDogcnMuY3RybHB0c1swXSAtIHRndFBvcy54LFxuICAgICAgICB5OiBycy5jdHJscHRzWzFdIC0gdGd0UG9zLnlcbiAgICAgIH07XG4gICAgICB2YXIgX2NwTCA9IE1hdGguc3FydChfY3BELnggKiBfY3BELnggKyBfY3BELnkgKiBfY3BELnkpOyAvLyBsZW5ndGggb2YgbGluZVxuICAgICAgdmFyIF9jcE0gPSB7XG4gICAgICAgIC8vIG5vcm1hbGlzZWQgZGVsdGFcbiAgICAgICAgeDogX2NwRC54IC8gX2NwTCxcbiAgICAgICAgeTogX2NwRC55IC8gX2NwTFxuICAgICAgfTtcbiAgICAgIHZhciBfcmFkaXVzID0gTWF0aC5tYXgoc3JjVywgc3JjSCk7XG4gICAgICB2YXIgX2NwUHJvaiA9IHtcbiAgICAgICAgLy8gKjIgcmFkaXVzIGd1YXJhbnRlZXMgb3V0c2lkZSBzaGFwZVxuICAgICAgICB4OiBycy5jdHJscHRzWzBdICsgX2NwTS54ICogMiAqIF9yYWRpdXMsXG4gICAgICAgIHk6IHJzLmN0cmxwdHNbMV0gKyBfY3BNLnkgKiAyICogX3JhZGl1c1xuICAgICAgfTtcbiAgICAgIHZhciB0Z3RDdHJsUHRJbnRuID0gdGd0U2hhcGUuaW50ZXJzZWN0TGluZSh0Z3RQb3MueCwgdGd0UG9zLnksIHRndFcsIHRndEgsIF9jcFByb2oueCwgX2NwUHJvai55LCAwLCB0Z3RDb3JuZXJSYWRpdXMsIHRndFJzKTtcbiAgICAgIGlmIChjbG9zZUVuZEFDcCkge1xuICAgICAgICBycy5jdHJscHRzWzBdID0gcnMuY3RybHB0c1swXSArIF9jcE0ueCAqIChtaW5DcEFEaXN0IC0gZW5kQUNwRGlzdCk7XG4gICAgICAgIHJzLmN0cmxwdHNbMV0gPSBycy5jdHJscHRzWzFdICsgX2NwTS55ICogKG1pbkNwQURpc3QgLSBlbmRBQ3BEaXN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJzLmN0cmxwdHNbMF0gPSB0Z3RDdHJsUHRJbnRuWzBdICsgX2NwTS54ICogbWluQ3BBRGlzdDtcbiAgICAgICAgcnMuY3RybHB0c1sxXSA9IHRndEN0cmxQdEludG5bMV0gKyBfY3BNLnkgKiBtaW5DcEFEaXN0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3ZlcmxhcHBpbmcpIHtcbiAgICAgIC8vIHJlY2FsYyBlbmRwdHNcbiAgICAgIHRoaXMuZmluZEVuZHBvaW50cyhlZGdlKTtcbiAgICB9XG4gIH1cbn07XG5CUnAkYy5zdG9yZUFsbHB0cyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIGlmIChycy5lZGdlVHlwZSA9PT0gJ211bHRpYmV6aWVyJyB8fCBycy5lZGdlVHlwZSA9PT0gJ2JlemllcicgfHwgcnMuZWRnZVR5cGUgPT09ICdzZWxmJyB8fCBycy5lZGdlVHlwZSA9PT0gJ2NvbXBvdW5kJykge1xuICAgIHJzLmFsbHB0cyA9IFtdO1xuICAgIHJzLmFsbHB0cy5wdXNoKHJzLnN0YXJ0WCwgcnMuc3RhcnRZKTtcbiAgICBmb3IgKHZhciBiID0gMDsgYiArIDEgPCBycy5jdHJscHRzLmxlbmd0aDsgYiArPSAyKSB7XG4gICAgICAvLyBjdHJsIHB0IGl0c2VsZlxuICAgICAgcnMuYWxscHRzLnB1c2gocnMuY3RybHB0c1tiXSwgcnMuY3RybHB0c1tiICsgMV0pO1xuXG4gICAgICAvLyB0aGUgbWlkcHQgYmV0d2VlbiBjdHJscHRzIGFzIGludGVybWVkaWF0ZSBkZXN0aW5hdGlvbiBwdHNcbiAgICAgIGlmIChiICsgMyA8IHJzLmN0cmxwdHMubGVuZ3RoKSB7XG4gICAgICAgIHJzLmFsbHB0cy5wdXNoKChycy5jdHJscHRzW2JdICsgcnMuY3RybHB0c1tiICsgMl0pIC8gMiwgKHJzLmN0cmxwdHNbYiArIDFdICsgcnMuY3RybHB0c1tiICsgM10pIC8gMik7XG4gICAgICB9XG4gICAgfVxuICAgIHJzLmFsbHB0cy5wdXNoKHJzLmVuZFgsIHJzLmVuZFkpO1xuICAgIHZhciBtLCBtdDtcbiAgICBpZiAocnMuY3RybHB0cy5sZW5ndGggLyAyICUgMiA9PT0gMCkge1xuICAgICAgbSA9IHJzLmFsbHB0cy5sZW5ndGggLyAyIC0gMTtcbiAgICAgIHJzLm1pZFggPSBycy5hbGxwdHNbbV07XG4gICAgICBycy5taWRZID0gcnMuYWxscHRzW20gKyAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHJzLmFsbHB0cy5sZW5ndGggLyAyIC0gMztcbiAgICAgIG10ID0gMC41O1xuICAgICAgcnMubWlkWCA9IHFiZXppZXJBdChycy5hbGxwdHNbbV0sIHJzLmFsbHB0c1ttICsgMl0sIHJzLmFsbHB0c1ttICsgNF0sIG10KTtcbiAgICAgIHJzLm1pZFkgPSBxYmV6aWVyQXQocnMuYWxscHRzW20gKyAxXSwgcnMuYWxscHRzW20gKyAzXSwgcnMuYWxscHRzW20gKyA1XSwgbXQpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChycy5lZGdlVHlwZSA9PT0gJ3N0cmFpZ2h0Jykge1xuICAgIC8vIG5lZWQgdG8gY2FsYyB0aGVzZSBhZnRlciBlbmRwdHNcbiAgICBycy5hbGxwdHMgPSBbcnMuc3RhcnRYLCBycy5zdGFydFksIHJzLmVuZFgsIHJzLmVuZFldO1xuXG4gICAgLy8gZGVmYXVsdCBtaWRwdCBmb3IgbGFiZWxzIGV0Y1xuICAgIHJzLm1pZFggPSAocnMuc3RhcnRYICsgcnMuZW5kWCArIHJzLmFycm93U3RhcnRYICsgcnMuYXJyb3dFbmRYKSAvIDQ7XG4gICAgcnMubWlkWSA9IChycy5zdGFydFkgKyBycy5lbmRZICsgcnMuYXJyb3dTdGFydFkgKyBycy5hcnJvd0VuZFkpIC8gNDtcbiAgfSBlbHNlIGlmIChycy5lZGdlVHlwZSA9PT0gJ3NlZ21lbnRzJykge1xuICAgIHJzLmFsbHB0cyA9IFtdO1xuICAgIHJzLmFsbHB0cy5wdXNoKHJzLnN0YXJ0WCwgcnMuc3RhcnRZKTtcbiAgICBycy5hbGxwdHMucHVzaC5hcHBseShycy5hbGxwdHMsIHJzLnNlZ3B0cyk7XG4gICAgcnMuYWxscHRzLnB1c2gocnMuZW5kWCwgcnMuZW5kWSk7XG4gICAgaWYgKHJzLmlzUm91bmQpIHtcbiAgICAgIHJzLnJvdW5kQ29ybmVycyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDI7IGkgKyAzIDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHZhciByYWRpdXMgPSBycy5yYWRpaVtpIC8gMiAtIDFdO1xuICAgICAgICB2YXIgaXNBcmNSYWRpdXMgPSBycy5pc0FyY1JhZGl1c1tpIC8gMiAtIDFdO1xuICAgICAgICBycy5yb3VuZENvcm5lcnMucHVzaChnZXRSb3VuZENvcm5lcih7XG4gICAgICAgICAgeDogcnMuYWxscHRzW2kgLSAyXSxcbiAgICAgICAgICB5OiBycy5hbGxwdHNbaSAtIDFdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBycy5hbGxwdHNbaV0sXG4gICAgICAgICAgeTogcnMuYWxscHRzW2kgKyAxXSxcbiAgICAgICAgICByYWRpdXM6IHJhZGl1c1xuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcnMuYWxscHRzW2kgKyAyXSxcbiAgICAgICAgICB5OiBycy5hbGxwdHNbaSArIDNdXG4gICAgICAgIH0sIHJhZGl1cywgaXNBcmNSYWRpdXMpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJzLnNlZ3B0cy5sZW5ndGggJSA0ID09PSAwKSB7XG4gICAgICB2YXIgaTIgPSBycy5zZWdwdHMubGVuZ3RoIC8gMjtcbiAgICAgIHZhciBpMSA9IGkyIC0gMjtcbiAgICAgIHJzLm1pZFggPSAocnMuc2VncHRzW2kxXSArIHJzLnNlZ3B0c1tpMl0pIC8gMjtcbiAgICAgIHJzLm1pZFkgPSAocnMuc2VncHRzW2kxICsgMV0gKyBycy5zZWdwdHNbaTIgKyAxXSkgLyAyO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2kgPSBycy5zZWdwdHMubGVuZ3RoIC8gMiAtIDE7XG4gICAgICBpZiAoIXJzLmlzUm91bmQpIHtcbiAgICAgICAgcnMubWlkWCA9IHJzLnNlZ3B0c1tfaV07XG4gICAgICAgIHJzLm1pZFkgPSBycy5zZWdwdHNbX2kgKyAxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwb2ludCA9IHtcbiAgICAgICAgICB4OiBycy5zZWdwdHNbX2ldLFxuICAgICAgICAgIHk6IHJzLnNlZ3B0c1tfaSArIDFdXG4gICAgICAgIH07XG4gICAgICAgIHZhciBjb3JuZXIgPSBycy5yb3VuZENvcm5lcnNbX2kgLyAyXTtcbiAgICAgICAgdmFyIHYgPSBbcG9pbnQueCAtIGNvcm5lci5jeCwgcG9pbnQueSAtIGNvcm5lci5jeV07XG4gICAgICAgIHZhciBmYWN0b3IgPSBjb3JuZXIucmFkaXVzIC8gTWF0aC5zcXJ0KE1hdGgucG93KHZbMF0sIDIpICsgTWF0aC5wb3codlsxXSwgMikpO1xuICAgICAgICB2ID0gdi5tYXAoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICByZXR1cm4gYyAqIGZhY3RvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJzLm1pZFggPSBjb3JuZXIuY3ggKyB2WzBdO1xuICAgICAgICBycy5taWRZID0gY29ybmVyLmN5ICsgdlsxXTtcbiAgICAgICAgcnMubWlkVmVjdG9yID0gdjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5CUnAkYy5jaGVja0ZvckludmFsaWRFZGdlV2FybmluZyA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gIHZhciBycyA9IGVkZ2VbMF0uX3ByaXZhdGUucnNjcmF0Y2g7XG4gIGlmIChycy5ub2Rlc092ZXJsYXAgfHwgbnVtYmVyJDEocnMuc3RhcnRYKSAmJiBudW1iZXIkMShycy5zdGFydFkpICYmIG51bWJlciQxKHJzLmVuZFgpICYmIG51bWJlciQxKHJzLmVuZFkpKSB7XG4gICAgcnMubG9nZ2VkRXJyID0gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFycy5sb2dnZWRFcnIpIHtcbiAgICAgIHJzLmxvZ2dlZEVyciA9IHRydWU7XG4gICAgICB3YXJuKCdFZGdlIGAnICsgZWRnZS5pZCgpICsgJ2AgaGFzIGludmFsaWQgZW5kcG9pbnRzIGFuZCBzbyBpdCBpcyBpbXBvc3NpYmxlIHRvIGRyYXcuICBBZGp1c3QgeW91ciBlZGdlIHN0eWxlIChlLmcuIGNvbnRyb2wgcG9pbnRzKSBhY2NvcmRpbmdseSBvciB1c2UgYW4gYWx0ZXJuYXRpdmUgZWRnZSB0eXBlLiAgVGhpcyBpcyBleHBlY3RlZCBiZWhhdmlvdXIgd2hlbiB0aGUgc291cmNlIG5vZGUgYW5kIHRoZSB0YXJnZXQgbm9kZSBvdmVybGFwLicpO1xuICAgIH1cbiAgfVxufTtcbkJScCRjLmZpbmRFZGdlQ29udHJvbFBvaW50cyA9IGZ1bmN0aW9uIChlZGdlcykge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICBpZiAoIWVkZ2VzIHx8IGVkZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjeSA9IHIuY3k7XG4gIHZhciBoYXNDb21wb3VuZHMgPSBjeS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gIHZhciBoYXNoVGFibGUgPSB7XG4gICAgbWFwOiBuZXcgTWFwJDIoKSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldChwYWlySWQpIHtcbiAgICAgIHZhciBtYXAyID0gdGhpcy5tYXAuZ2V0KHBhaXJJZFswXSk7XG4gICAgICBpZiAobWFwMiAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBtYXAyLmdldChwYWlySWRbMV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChwYWlySWQsIHZhbCkge1xuICAgICAgdmFyIG1hcDIgPSB0aGlzLm1hcC5nZXQocGFpcklkWzBdKTtcbiAgICAgIGlmIChtYXAyID09IG51bGwpIHtcbiAgICAgICAgbWFwMiA9IG5ldyBNYXAkMigpO1xuICAgICAgICB0aGlzLm1hcC5zZXQocGFpcklkWzBdLCBtYXAyKTtcbiAgICAgIH1cbiAgICAgIG1hcDIuc2V0KHBhaXJJZFsxXSwgdmFsKTtcbiAgICB9XG4gIH07XG4gIHZhciBwYWlySWRzID0gW107XG4gIHZhciBoYXlzdGFja0VkZ2VzID0gW107XG5cbiAgLy8gY3JlYXRlIGEgdGFibGUgb2YgZWRnZSAoc3JjLCB0Z3QpID0+IGxpc3Qgb2YgZWRnZXMgYmV0d2VlbiB0aGVtXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWRnZSA9IGVkZ2VzW2ldO1xuICAgIHZhciBfcCA9IGVkZ2UuX3ByaXZhdGU7XG4gICAgdmFyIGN1cnZlU3R5bGUgPSBlZGdlLnBzdHlsZSgnY3VydmUtc3R5bGUnKS52YWx1ZTtcblxuICAgIC8vIGlnbm9yZSBlZGdlcyB3aG8gYXJlIG5vdCB0byBiZSBkaXNwbGF5ZWRcbiAgICAvLyB0aGV5IHNob3VsZG4ndCB0YWtlIHVwIHNwYWNlXG4gICAgaWYgKGVkZ2UucmVtb3ZlZCgpIHx8ICFlZGdlLnRha2VzVXBTcGFjZSgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGN1cnZlU3R5bGUgPT09ICdoYXlzdGFjaycpIHtcbiAgICAgIGhheXN0YWNrRWRnZXMucHVzaChlZGdlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgZWRnZUlzVW5idW5kbGVkID0gY3VydmVTdHlsZSA9PT0gJ3VuYnVuZGxlZC1iZXppZXInIHx8IGN1cnZlU3R5bGUuZW5kc1dpdGgoJ3NlZ21lbnRzJykgfHwgY3VydmVTdHlsZSA9PT0gJ3N0cmFpZ2h0JyB8fCBjdXJ2ZVN0eWxlID09PSAnc3RyYWlnaHQtdHJpYW5nbGUnIHx8IGN1cnZlU3R5bGUuZW5kc1dpdGgoJ3RheGknKTtcbiAgICB2YXIgZWRnZUlzQmV6aWVyID0gY3VydmVTdHlsZSA9PT0gJ3VuYnVuZGxlZC1iZXppZXInIHx8IGN1cnZlU3R5bGUgPT09ICdiZXppZXInO1xuICAgIHZhciBzcmMgPSBfcC5zb3VyY2U7XG4gICAgdmFyIHRndCA9IF9wLnRhcmdldDtcbiAgICB2YXIgc3JjSW5kZXggPSBzcmMucG9vbEluZGV4KCk7XG4gICAgdmFyIHRndEluZGV4ID0gdGd0LnBvb2xJbmRleCgpO1xuICAgIHZhciBwYWlySWQgPSBbc3JjSW5kZXgsIHRndEluZGV4XS5zb3J0KCk7XG4gICAgdmFyIHRhYmxlRW50cnkgPSBoYXNoVGFibGUuZ2V0KHBhaXJJZCk7XG4gICAgaWYgKHRhYmxlRW50cnkgPT0gbnVsbCkge1xuICAgICAgdGFibGVFbnRyeSA9IHtcbiAgICAgICAgZWxlczogW11cbiAgICAgIH07XG4gICAgICBoYXNoVGFibGUuc2V0KHBhaXJJZCwgdGFibGVFbnRyeSk7XG4gICAgICBwYWlySWRzLnB1c2gocGFpcklkKTtcbiAgICB9XG4gICAgdGFibGVFbnRyeS5lbGVzLnB1c2goZWRnZSk7XG4gICAgaWYgKGVkZ2VJc1VuYnVuZGxlZCkge1xuICAgICAgdGFibGVFbnRyeS5oYXNVbmJ1bmRsZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoZWRnZUlzQmV6aWVyKSB7XG4gICAgICB0YWJsZUVudHJ5Lmhhc0JlemllciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gZm9yIGVhY2ggcGFpciAoc3JjLCB0Z3QpLCBjcmVhdGUgdGhlIGN0cmwgcHRzXG4gIC8vIE5lc3RlZCBmb3IgbG9vcCBpcyBPSzsgdG90YWwgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgZm9yIGJvdGggbG9vcHMgPSBlZGdlQ291bnRcbiAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AocCkge1xuICAgIHZhciBwYWlySWQgPSBwYWlySWRzW3BdO1xuICAgIHZhciBwYWlySW5mbyA9IGhhc2hUYWJsZS5nZXQocGFpcklkKTtcbiAgICB2YXIgc3dhcHBlZHBhaXJJbmZvID0gdm9pZCAwO1xuICAgIGlmICghcGFpckluZm8uaGFzVW5idW5kbGVkKSB7XG4gICAgICB2YXIgcGxsRWRnZXMgPSBwYWlySW5mby5lbGVzWzBdLnBhcmFsbGVsRWRnZXMoKS5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUuaXNCdW5kbGVkQmV6aWVyKCk7XG4gICAgICB9KTtcbiAgICAgIGNsZWFyQXJyYXkocGFpckluZm8uZWxlcyk7XG4gICAgICBwbGxFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgIHJldHVybiBwYWlySW5mby5lbGVzLnB1c2goZWRnZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gZm9yIGVhY2ggcGFpciBpZCwgdGhlIGVkZ2VzIHNob3VsZCBiZSBzb3J0ZWQgYnkgaW5kZXhcbiAgICAgIHBhaXJJbmZvLmVsZXMuc29ydChmdW5jdGlvbiAoZWRnZTEsIGVkZ2UyKSB7XG4gICAgICAgIHJldHVybiBlZGdlMS5wb29sSW5kZXgoKSAtIGVkZ2UyLnBvb2xJbmRleCgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciBmaXJzdEVkZ2UgPSBwYWlySW5mby5lbGVzWzBdO1xuICAgIHZhciBzcmMgPSBmaXJzdEVkZ2Uuc291cmNlKCk7XG4gICAgdmFyIHRndCA9IGZpcnN0RWRnZS50YXJnZXQoKTtcblxuICAgIC8vIG1ha2Ugc3VyZSBzcmMvdGd0IGRpc3RpbmN0aW9uIGlzIGNvbnNpc3RlbnQgdy5yLnQuIHBhaXJJZFxuICAgIGlmIChzcmMucG9vbEluZGV4KCkgPiB0Z3QucG9vbEluZGV4KCkpIHtcbiAgICAgIHZhciB0ZW1wID0gc3JjO1xuICAgICAgc3JjID0gdGd0O1xuICAgICAgdGd0ID0gdGVtcDtcbiAgICB9XG4gICAgdmFyIHNyY1BvcyA9IHBhaXJJbmZvLnNyY1BvcyA9IHNyYy5wb3NpdGlvbigpO1xuICAgIHZhciB0Z3RQb3MgPSBwYWlySW5mby50Z3RQb3MgPSB0Z3QucG9zaXRpb24oKTtcbiAgICB2YXIgc3JjVyA9IHBhaXJJbmZvLnNyY1cgPSBzcmMub3V0ZXJXaWR0aCgpO1xuICAgIHZhciBzcmNIID0gcGFpckluZm8uc3JjSCA9IHNyYy5vdXRlckhlaWdodCgpO1xuICAgIHZhciB0Z3RXID0gcGFpckluZm8udGd0VyA9IHRndC5vdXRlcldpZHRoKCk7XG4gICAgdmFyIHRndEggPSBwYWlySW5mby50Z3RIID0gdGd0Lm91dGVySGVpZ2h0KCk7XG4gICAgdmFyIHNyY1NoYXBlID0gcGFpckluZm8uc3JjU2hhcGUgPSByLm5vZGVTaGFwZXNbX3RoaXMuZ2V0Tm9kZVNoYXBlKHNyYyldO1xuICAgIHZhciB0Z3RTaGFwZSA9IHBhaXJJbmZvLnRndFNoYXBlID0gci5ub2RlU2hhcGVzW190aGlzLmdldE5vZGVTaGFwZSh0Z3QpXTtcbiAgICB2YXIgc3JjQ29ybmVyUmFkaXVzID0gcGFpckluZm8uc3JjQ29ybmVyUmFkaXVzID0gc3JjLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnZhbHVlID09PSAnYXV0bycgPyAnYXV0bycgOiBzcmMucHN0eWxlKCdjb3JuZXItcmFkaXVzJykucGZWYWx1ZTtcbiAgICB2YXIgdGd0Q29ybmVyUmFkaXVzID0gcGFpckluZm8udGd0Q29ybmVyUmFkaXVzID0gdGd0LnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnZhbHVlID09PSAnYXV0bycgPyAnYXV0bycgOiB0Z3QucHN0eWxlKCdjb3JuZXItcmFkaXVzJykucGZWYWx1ZTtcbiAgICB2YXIgdGd0UnMgPSBwYWlySW5mby50Z3RScyA9IHRndC5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICB2YXIgc3JjUnMgPSBwYWlySW5mby5zcmNScyA9IHNyYy5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICBwYWlySW5mby5kaXJDb3VudHMgPSB7XG4gICAgICAnbm9ydGgnOiAwLFxuICAgICAgJ3dlc3QnOiAwLFxuICAgICAgJ3NvdXRoJzogMCxcbiAgICAgICdlYXN0JzogMCxcbiAgICAgICdub3J0aHdlc3QnOiAwLFxuICAgICAgJ3NvdXRod2VzdCc6IDAsXG4gICAgICAnbm9ydGhlYXN0JzogMCxcbiAgICAgICdzb3V0aGVhc3QnOiAwXG4gICAgfTtcbiAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBwYWlySW5mby5lbGVzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgIHZhciBfZWRnZSA9IHBhaXJJbmZvLmVsZXNbX2kyXTtcbiAgICAgIHZhciBycyA9IF9lZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgICAgdmFyIF9jdXJ2ZVN0eWxlID0gX2VkZ2UucHN0eWxlKCdjdXJ2ZS1zdHlsZScpLnZhbHVlO1xuICAgICAgdmFyIF9lZGdlSXNVbmJ1bmRsZWQgPSBfY3VydmVTdHlsZSA9PT0gJ3VuYnVuZGxlZC1iZXppZXInIHx8IF9jdXJ2ZVN0eWxlLmVuZHNXaXRoKCdzZWdtZW50cycpIHx8IF9jdXJ2ZVN0eWxlLmVuZHNXaXRoKCd0YXhpJyk7XG5cbiAgICAgIC8vIHdoZXRoZXIgdGhlIG5vcm1hbGlzZWQgcGFpciBvcmRlciBpcyB0aGUgcmV2ZXJzZSBvZiB0aGUgZWRnZSdzIHNyYy10Z3Qgb3JkZXJcbiAgICAgIHZhciBlZGdlSXNTd2FwcGVkID0gIXNyYy5zYW1lKF9lZGdlLnNvdXJjZSgpKTtcbiAgICAgIGlmICghcGFpckluZm8uY2FsY3VsYXRlZEludGVyc2VjdGlvbiAmJiBzcmMgIT09IHRndCAmJiAocGFpckluZm8uaGFzQmV6aWVyIHx8IHBhaXJJbmZvLmhhc1VuYnVuZGxlZCkpIHtcbiAgICAgICAgcGFpckluZm8uY2FsY3VsYXRlZEludGVyc2VjdGlvbiA9IHRydWU7XG5cbiAgICAgICAgLy8gcHQgb3V0c2lkZSBzcmMgc2hhcGUgdG8gY2FsYyBkaXN0YW5jZS9kaXNwbGFjZW1lbnQgZnJvbSBzcmMgdG8gdGd0XG4gICAgICAgIHZhciBzcmNPdXRzaWRlID0gc3JjU2hhcGUuaW50ZXJzZWN0TGluZShzcmNQb3MueCwgc3JjUG9zLnksIHNyY1csIHNyY0gsIHRndFBvcy54LCB0Z3RQb3MueSwgMCwgc3JjQ29ybmVyUmFkaXVzLCBzcmNScyk7XG4gICAgICAgIHZhciBzcmNJbnRuID0gcGFpckluZm8uc3JjSW50biA9IHNyY091dHNpZGU7XG5cbiAgICAgICAgLy8gcHQgb3V0c2lkZSB0Z3Qgc2hhcGUgdG8gY2FsYyBkaXN0YW5jZS9kaXNwbGFjZW1lbnQgZnJvbSBzcmMgdG8gdGd0XG4gICAgICAgIHZhciB0Z3RPdXRzaWRlID0gdGd0U2hhcGUuaW50ZXJzZWN0TGluZSh0Z3RQb3MueCwgdGd0UG9zLnksIHRndFcsIHRndEgsIHNyY1Bvcy54LCBzcmNQb3MueSwgMCwgdGd0Q29ybmVyUmFkaXVzLCB0Z3RScyk7XG4gICAgICAgIHZhciB0Z3RJbnRuID0gcGFpckluZm8udGd0SW50biA9IHRndE91dHNpZGU7XG4gICAgICAgIHZhciBpbnRlcnNlY3Rpb25QdHMgPSBwYWlySW5mby5pbnRlcnNlY3Rpb25QdHMgPSB7XG4gICAgICAgICAgeDE6IHNyY091dHNpZGVbMF0sXG4gICAgICAgICAgeDI6IHRndE91dHNpZGVbMF0sXG4gICAgICAgICAgeTE6IHNyY091dHNpZGVbMV0sXG4gICAgICAgICAgeTI6IHRndE91dHNpZGVbMV1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHBvc1B0cyA9IHBhaXJJbmZvLnBvc1B0cyA9IHtcbiAgICAgICAgICB4MTogc3JjUG9zLngsXG4gICAgICAgICAgeDI6IHRndFBvcy54LFxuICAgICAgICAgIHkxOiBzcmNQb3MueSxcbiAgICAgICAgICB5MjogdGd0UG9zLnlcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGR5ID0gdGd0T3V0c2lkZVsxXSAtIHNyY091dHNpZGVbMV07XG4gICAgICAgIHZhciBkeCA9IHRndE91dHNpZGVbMF0gLSBzcmNPdXRzaWRlWzBdO1xuICAgICAgICB2YXIgbCA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgICAgIHZhciB2ZWN0b3IgPSBwYWlySW5mby52ZWN0b3IgPSB7XG4gICAgICAgICAgeDogZHgsXG4gICAgICAgICAgeTogZHlcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHZlY3Rvck5vcm0gPSBwYWlySW5mby52ZWN0b3JOb3JtID0ge1xuICAgICAgICAgIHg6IHZlY3Rvci54IC8gbCxcbiAgICAgICAgICB5OiB2ZWN0b3IueSAvIGxcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHZlY3Rvck5vcm1JbnZlcnNlID0ge1xuICAgICAgICAgIHg6IC12ZWN0b3JOb3JtLnksXG4gICAgICAgICAgeTogdmVjdG9yTm9ybS54XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gaWYgbm9kZSBzaGFwZXMgb3ZlcmxhcCwgdGhlbiBubyBjdHJsIHB0cyB0byBkcmF3XG4gICAgICAgIHBhaXJJbmZvLm5vZGVzT3ZlcmxhcCA9ICFudW1iZXIkMShsKSB8fCB0Z3RTaGFwZS5jaGVja1BvaW50KHNyY091dHNpZGVbMF0sIHNyY091dHNpZGVbMV0sIDAsIHRndFcsIHRndEgsIHRndFBvcy54LCB0Z3RQb3MueSwgdGd0Q29ybmVyUmFkaXVzLCB0Z3RScykgfHwgc3JjU2hhcGUuY2hlY2tQb2ludCh0Z3RPdXRzaWRlWzBdLCB0Z3RPdXRzaWRlWzFdLCAwLCBzcmNXLCBzcmNILCBzcmNQb3MueCwgc3JjUG9zLnksIHNyY0Nvcm5lclJhZGl1cywgc3JjUnMpO1xuICAgICAgICBwYWlySW5mby52ZWN0b3JOb3JtSW52ZXJzZSA9IHZlY3Rvck5vcm1JbnZlcnNlO1xuICAgICAgICBzd2FwcGVkcGFpckluZm8gPSB7XG4gICAgICAgICAgbm9kZXNPdmVybGFwOiBwYWlySW5mby5ub2Rlc092ZXJsYXAsXG4gICAgICAgICAgZGlyQ291bnRzOiBwYWlySW5mby5kaXJDb3VudHMsXG4gICAgICAgICAgY2FsY3VsYXRlZEludGVyc2VjdGlvbjogdHJ1ZSxcbiAgICAgICAgICBoYXNCZXppZXI6IHBhaXJJbmZvLmhhc0JlemllcixcbiAgICAgICAgICBoYXNVbmJ1bmRsZWQ6IHBhaXJJbmZvLmhhc1VuYnVuZGxlZCxcbiAgICAgICAgICBlbGVzOiBwYWlySW5mby5lbGVzLFxuICAgICAgICAgIHNyY1BvczogdGd0UG9zLFxuICAgICAgICAgIHRndFBvczogc3JjUG9zLFxuICAgICAgICAgIHNyY1c6IHRndFcsXG4gICAgICAgICAgc3JjSDogdGd0SCxcbiAgICAgICAgICB0Z3RXOiBzcmNXLFxuICAgICAgICAgIHRndEg6IHNyY0gsXG4gICAgICAgICAgc3JjSW50bjogdGd0SW50bixcbiAgICAgICAgICB0Z3RJbnRuOiBzcmNJbnRuLFxuICAgICAgICAgIHNyY1NoYXBlOiB0Z3RTaGFwZSxcbiAgICAgICAgICB0Z3RTaGFwZTogc3JjU2hhcGUsXG4gICAgICAgICAgcG9zUHRzOiB7XG4gICAgICAgICAgICB4MTogcG9zUHRzLngyLFxuICAgICAgICAgICAgeTE6IHBvc1B0cy55MixcbiAgICAgICAgICAgIHgyOiBwb3NQdHMueDEsXG4gICAgICAgICAgICB5MjogcG9zUHRzLnkxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbnRlcnNlY3Rpb25QdHM6IHtcbiAgICAgICAgICAgIHgxOiBpbnRlcnNlY3Rpb25QdHMueDIsXG4gICAgICAgICAgICB5MTogaW50ZXJzZWN0aW9uUHRzLnkyLFxuICAgICAgICAgICAgeDI6IGludGVyc2VjdGlvblB0cy54MSxcbiAgICAgICAgICAgIHkyOiBpbnRlcnNlY3Rpb25QdHMueTFcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZlY3Rvcjoge1xuICAgICAgICAgICAgeDogLXZlY3Rvci54LFxuICAgICAgICAgICAgeTogLXZlY3Rvci55XG4gICAgICAgICAgfSxcbiAgICAgICAgICB2ZWN0b3JOb3JtOiB7XG4gICAgICAgICAgICB4OiAtdmVjdG9yTm9ybS54LFxuICAgICAgICAgICAgeTogLXZlY3Rvck5vcm0ueVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmVjdG9yTm9ybUludmVyc2U6IHtcbiAgICAgICAgICAgIHg6IC12ZWN0b3JOb3JtSW52ZXJzZS54LFxuICAgICAgICAgICAgeTogLXZlY3Rvck5vcm1JbnZlcnNlLnlcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YXIgcGFzc2VkUGFpckluZm8gPSBlZGdlSXNTd2FwcGVkID8gc3dhcHBlZHBhaXJJbmZvIDogcGFpckluZm87XG4gICAgICBycy5ub2Rlc092ZXJsYXAgPSBwYXNzZWRQYWlySW5mby5ub2Rlc092ZXJsYXA7XG4gICAgICBycy5zcmNJbnRuID0gcGFzc2VkUGFpckluZm8uc3JjSW50bjtcbiAgICAgIHJzLnRndEludG4gPSBwYXNzZWRQYWlySW5mby50Z3RJbnRuO1xuICAgICAgcnMuaXNSb3VuZCA9IF9jdXJ2ZVN0eWxlLnN0YXJ0c1dpdGgoJ3JvdW5kJyk7XG4gICAgICBpZiAoaGFzQ29tcG91bmRzICYmIChzcmMuaXNQYXJlbnQoKSB8fCBzcmMuaXNDaGlsZCgpIHx8IHRndC5pc1BhcmVudCgpIHx8IHRndC5pc0NoaWxkKCkpICYmIChzcmMucGFyZW50cygpLmFueVNhbWUodGd0KSB8fCB0Z3QucGFyZW50cygpLmFueVNhbWUoc3JjKSB8fCBzcmMuc2FtZSh0Z3QpICYmIHNyYy5pc1BhcmVudCgpKSkge1xuICAgICAgICBfdGhpcy5maW5kQ29tcG91bmRMb29wUG9pbnRzKF9lZGdlLCBwYXNzZWRQYWlySW5mbywgX2kyLCBfZWRnZUlzVW5idW5kbGVkKTtcbiAgICAgIH0gZWxzZSBpZiAoc3JjID09PSB0Z3QpIHtcbiAgICAgICAgX3RoaXMuZmluZExvb3BQb2ludHMoX2VkZ2UsIHBhc3NlZFBhaXJJbmZvLCBfaTIsIF9lZGdlSXNVbmJ1bmRsZWQpO1xuICAgICAgfSBlbHNlIGlmIChfY3VydmVTdHlsZS5lbmRzV2l0aCgnc2VnbWVudHMnKSkge1xuICAgICAgICBfdGhpcy5maW5kU2VnbWVudHNQb2ludHMoX2VkZ2UsIHBhc3NlZFBhaXJJbmZvKTtcbiAgICAgIH0gZWxzZSBpZiAoX2N1cnZlU3R5bGUuZW5kc1dpdGgoJ3RheGknKSkge1xuICAgICAgICBfdGhpcy5maW5kVGF4aVBvaW50cyhfZWRnZSwgcGFzc2VkUGFpckluZm8pO1xuICAgICAgfSBlbHNlIGlmIChfY3VydmVTdHlsZSA9PT0gJ3N0cmFpZ2h0JyB8fCAhX2VkZ2VJc1VuYnVuZGxlZCAmJiBwYWlySW5mby5lbGVzLmxlbmd0aCAlIDIgPT09IDEgJiYgX2kyID09PSBNYXRoLmZsb29yKHBhaXJJbmZvLmVsZXMubGVuZ3RoIC8gMikpIHtcbiAgICAgICAgX3RoaXMuZmluZFN0cmFpZ2h0RWRnZVBvaW50cyhfZWRnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5maW5kQmV6aWVyUG9pbnRzKF9lZGdlLCBwYXNzZWRQYWlySW5mbywgX2kyLCBfZWRnZUlzVW5idW5kbGVkLCBlZGdlSXNTd2FwcGVkKTtcbiAgICAgIH1cbiAgICAgIF90aGlzLmZpbmRFbmRwb2ludHMoX2VkZ2UpO1xuICAgICAgX3RoaXMudHJ5VG9Db3JyZWN0SW52YWxpZFBvaW50cyhfZWRnZSwgcGFzc2VkUGFpckluZm8pO1xuICAgICAgX3RoaXMuY2hlY2tGb3JJbnZhbGlkRWRnZVdhcm5pbmcoX2VkZ2UpO1xuICAgICAgX3RoaXMuc3RvcmVBbGxwdHMoX2VkZ2UpO1xuICAgICAgX3RoaXMuc3RvcmVFZGdlUHJvamVjdGlvbnMoX2VkZ2UpO1xuICAgICAgX3RoaXMuY2FsY3VsYXRlQXJyb3dBbmdsZXMoX2VkZ2UpO1xuICAgICAgX3RoaXMucmVjYWxjdWxhdGVFZGdlTGFiZWxQcm9qZWN0aW9ucyhfZWRnZSk7XG4gICAgICBfdGhpcy5jYWxjdWxhdGVMYWJlbEFuZ2xlcyhfZWRnZSk7XG4gICAgfSAvLyBmb3IgcGFpciBlZGdlc1xuICB9O1xuICBmb3IgKHZhciBwID0gMDsgcCA8IHBhaXJJZHMubGVuZ3RoOyBwKyspIHtcbiAgICBfbG9vcChwKTtcbiAgfSAvLyBmb3IgcGFpciBpZHNcblxuICAvLyBoYXlzdGFja3MgYXZvaWQgdGhlIGV4cGVuc2Ugb2YgcGFpckluZm8gc3R1ZmYgKGludGVyc2VjdGlvbnMgZXRjLilcbiAgdGhpcy5maW5kSGF5c3RhY2tQb2ludHMoaGF5c3RhY2tFZGdlcyk7XG59O1xuZnVuY3Rpb24gZ2V0UHRzKHB0cykge1xuICB2YXIgcmV0UHRzID0gW107XG4gIGlmIChwdHMgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHB0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciB4ID0gcHRzW2ldO1xuICAgIHZhciB5ID0gcHRzW2kgKyAxXTtcbiAgICByZXRQdHMucHVzaCh7XG4gICAgICB4OiB4LFxuICAgICAgeTogeVxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXRQdHM7XG59XG5CUnAkYy5nZXRTZWdtZW50UG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIHR5cGUgPSBycy5lZGdlVHlwZTtcbiAgaWYgKHR5cGUgPT09ICdzZWdtZW50cycpIHtcbiAgICB0aGlzLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZShlZGdlKTtcbiAgICByZXR1cm4gZ2V0UHRzKHJzLnNlZ3B0cyk7XG4gIH1cbn07XG5CUnAkYy5nZXRDb250cm9sUG9pbnRzID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIHR5cGUgPSBycy5lZGdlVHlwZTtcbiAgaWYgKHR5cGUgPT09ICdiZXppZXInIHx8IHR5cGUgPT09ICdtdWx0aWJlemllcicgfHwgdHlwZSA9PT0gJ3NlbGYnIHx8IHR5cGUgPT09ICdjb21wb3VuZCcpIHtcbiAgICB0aGlzLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZShlZGdlKTtcbiAgICByZXR1cm4gZ2V0UHRzKHJzLmN0cmxwdHMpO1xuICB9XG59O1xuQlJwJGMuZ2V0RWRnZU1pZHBvaW50ID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIHJzID0gZWRnZVswXS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdGhpcy5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUoZWRnZSk7XG4gIHJldHVybiB7XG4gICAgeDogcnMubWlkWCxcbiAgICB5OiBycy5taWRZXG4gIH07XG59O1xuXG52YXIgQlJwJGIgPSB7fTtcbkJScCRiLm1hbnVhbEVuZHB0VG9QeCA9IGZ1bmN0aW9uIChub2RlLCBwcm9wKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIG5wb3MgPSBub2RlLnBvc2l0aW9uKCk7XG4gIHZhciB3ID0gbm9kZS5vdXRlcldpZHRoKCk7XG4gIHZhciBoID0gbm9kZS5vdXRlckhlaWdodCgpO1xuICB2YXIgcnMgPSBub2RlLl9wcml2YXRlLnJzY3JhdGNoO1xuICBpZiAocHJvcC52YWx1ZS5sZW5ndGggPT09IDIpIHtcbiAgICB2YXIgcCA9IFtwcm9wLnBmVmFsdWVbMF0sIHByb3AucGZWYWx1ZVsxXV07XG4gICAgaWYgKHByb3AudW5pdHNbMF0gPT09ICclJykge1xuICAgICAgcFswXSA9IHBbMF0gKiB3O1xuICAgIH1cbiAgICBpZiAocHJvcC51bml0c1sxXSA9PT0gJyUnKSB7XG4gICAgICBwWzFdID0gcFsxXSAqIGg7XG4gICAgfVxuICAgIHBbMF0gKz0gbnBvcy54O1xuICAgIHBbMV0gKz0gbnBvcy55O1xuICAgIHJldHVybiBwO1xuICB9IGVsc2Uge1xuICAgIHZhciBhbmdsZSA9IHByb3AucGZWYWx1ZVswXTtcbiAgICBhbmdsZSA9IC1NYXRoLlBJIC8gMiArIGFuZ2xlOyAvLyBzdGFydCBhdCAxMiBvJ2Nsb2NrXG5cbiAgICB2YXIgbCA9IDIgKiBNYXRoLm1heCh3LCBoKTtcbiAgICB2YXIgX3AgPSBbbnBvcy54ICsgTWF0aC5jb3MoYW5nbGUpICogbCwgbnBvcy55ICsgTWF0aC5zaW4oYW5nbGUpICogbF07XG4gICAgcmV0dXJuIHIubm9kZVNoYXBlc1t0aGlzLmdldE5vZGVTaGFwZShub2RlKV0uaW50ZXJzZWN0TGluZShucG9zLngsIG5wb3MueSwgdywgaCwgX3BbMF0sIF9wWzFdLCAwLCBub2RlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnZhbHVlID09PSAnYXV0bycgPyAnYXV0bycgOiBub2RlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWUsIHJzKTtcbiAgfVxufTtcbkJScCRiLmZpbmRFbmRwb2ludHMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBpbnRlcnNlY3Q7XG4gIHZhciBzb3VyY2UgPSBlZGdlLnNvdXJjZSgpWzBdO1xuICB2YXIgdGFyZ2V0ID0gZWRnZS50YXJnZXQoKVswXTtcbiAgdmFyIHNyY1BvcyA9IHNvdXJjZS5wb3NpdGlvbigpO1xuICB2YXIgdGd0UG9zID0gdGFyZ2V0LnBvc2l0aW9uKCk7XG4gIHZhciB0Z3RBclNoYXBlID0gZWRnZS5wc3R5bGUoJ3RhcmdldC1hcnJvdy1zaGFwZScpLnZhbHVlO1xuICB2YXIgc3JjQXJTaGFwZSA9IGVkZ2UucHN0eWxlKCdzb3VyY2UtYXJyb3ctc2hhcGUnKS52YWx1ZTtcbiAgdmFyIHRndERpc3QgPSBlZGdlLnBzdHlsZSgndGFyZ2V0LWRpc3RhbmNlLWZyb20tbm9kZScpLnBmVmFsdWU7XG4gIHZhciBzcmNEaXN0ID0gZWRnZS5wc3R5bGUoJ3NvdXJjZS1kaXN0YW5jZS1mcm9tLW5vZGUnKS5wZlZhbHVlO1xuICB2YXIgc3JjUnMgPSBzb3VyY2UuX3ByaXZhdGUucnNjcmF0Y2g7XG4gIHZhciB0Z3RScyA9IHRhcmdldC5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIGN1cnZlU3R5bGUgPSBlZGdlLnBzdHlsZSgnY3VydmUtc3R5bGUnKS52YWx1ZTtcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIGV0ID0gcnMuZWRnZVR5cGU7XG4gIHZhciB0YXhpID0gY3VydmVTdHlsZSA9PT0gJ3RheGknO1xuICB2YXIgc2VsZiA9IGV0ID09PSAnc2VsZicgfHwgZXQgPT09ICdjb21wb3VuZCc7XG4gIHZhciBiZXppZXIgPSBldCA9PT0gJ2JlemllcicgfHwgZXQgPT09ICdtdWx0aWJlemllcicgfHwgc2VsZjtcbiAgdmFyIG11bHRpID0gZXQgIT09ICdiZXppZXInO1xuICB2YXIgbGluZXMgPSBldCA9PT0gJ3N0cmFpZ2h0JyB8fCBldCA9PT0gJ3NlZ21lbnRzJztcbiAgdmFyIHNlZ21lbnRzID0gZXQgPT09ICdzZWdtZW50cyc7XG4gIHZhciBoYXNFbmRwdHMgPSBiZXppZXIgfHwgbXVsdGkgfHwgbGluZXM7XG4gIHZhciBvdmVycmlkZUVuZHB0cyA9IHNlbGYgfHwgdGF4aTtcbiAgdmFyIHNyY01hbkVuZHB0ID0gZWRnZS5wc3R5bGUoJ3NvdXJjZS1lbmRwb2ludCcpO1xuICB2YXIgc3JjTWFuRW5kcHRWYWwgPSBvdmVycmlkZUVuZHB0cyA/ICdvdXRzaWRlLXRvLW5vZGUnIDogc3JjTWFuRW5kcHQudmFsdWU7XG4gIHZhciBzcmNDb3JuZXJSYWRpdXMgPSBzb3VyY2UucHN0eWxlKCdjb3JuZXItcmFkaXVzJykudmFsdWUgPT09ICdhdXRvJyA/ICdhdXRvJyA6IHNvdXJjZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS5wZlZhbHVlO1xuICB2YXIgdGd0TWFuRW5kcHQgPSBlZGdlLnBzdHlsZSgndGFyZ2V0LWVuZHBvaW50Jyk7XG4gIHZhciB0Z3RNYW5FbmRwdFZhbCA9IG92ZXJyaWRlRW5kcHRzID8gJ291dHNpZGUtdG8tbm9kZScgOiB0Z3RNYW5FbmRwdC52YWx1ZTtcbiAgdmFyIHRndENvcm5lclJhZGl1cyA9IHRhcmdldC5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZSA9PT0gJ2F1dG8nID8gJ2F1dG8nIDogdGFyZ2V0LnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWU7XG4gIHJzLnNyY01hbkVuZHB0ID0gc3JjTWFuRW5kcHQ7XG4gIHJzLnRndE1hbkVuZHB0ID0gdGd0TWFuRW5kcHQ7XG4gIHZhciBwMTsgLy8gbGFzdCBrbm93biBwb2ludCBvZiBlZGdlIG9uIHRhcmdldCBzaWRlXG4gIHZhciBwMjsgLy8gbGFzdCBrbm93biBwb2ludCBvZiBlZGdlIG9uIHNvdXJjZSBzaWRlXG5cbiAgdmFyIHAxX2k7IC8vIHBvaW50IHRvIGludGVyc2VjdCB3aXRoIHRhcmdldCBzaGFwZVxuICB2YXIgcDJfaTsgLy8gcG9pbnQgdG8gaW50ZXJzZWN0IHdpdGggc291cmNlIHNoYXBlXG5cbiAgaWYgKGJlemllcikge1xuICAgIHZhciBjcFN0YXJ0ID0gW3JzLmN0cmxwdHNbMF0sIHJzLmN0cmxwdHNbMV1dO1xuICAgIHZhciBjcEVuZCA9IG11bHRpID8gW3JzLmN0cmxwdHNbcnMuY3RybHB0cy5sZW5ndGggLSAyXSwgcnMuY3RybHB0c1tycy5jdHJscHRzLmxlbmd0aCAtIDFdXSA6IGNwU3RhcnQ7XG4gICAgcDEgPSBjcEVuZDtcbiAgICBwMiA9IGNwU3RhcnQ7XG4gIH0gZWxzZSBpZiAobGluZXMpIHtcbiAgICB2YXIgc3JjQXJyb3dGcm9tUHQgPSAhc2VnbWVudHMgPyBbdGd0UG9zLngsIHRndFBvcy55XSA6IHJzLnNlZ3B0cy5zbGljZSgwLCAyKTtcbiAgICB2YXIgdGd0QXJyb3dGcm9tUHQgPSAhc2VnbWVudHMgPyBbc3JjUG9zLngsIHNyY1Bvcy55XSA6IHJzLnNlZ3B0cy5zbGljZShycy5zZWdwdHMubGVuZ3RoIC0gMik7XG4gICAgcDEgPSB0Z3RBcnJvd0Zyb21QdDtcbiAgICBwMiA9IHNyY0Fycm93RnJvbVB0O1xuICB9XG4gIGlmICh0Z3RNYW5FbmRwdFZhbCA9PT0gJ2luc2lkZS10by1ub2RlJykge1xuICAgIGludGVyc2VjdCA9IFt0Z3RQb3MueCwgdGd0UG9zLnldO1xuICB9IGVsc2UgaWYgKHRndE1hbkVuZHB0LnVuaXRzKSB7XG4gICAgaW50ZXJzZWN0ID0gdGhpcy5tYW51YWxFbmRwdFRvUHgodGFyZ2V0LCB0Z3RNYW5FbmRwdCk7XG4gIH0gZWxzZSBpZiAodGd0TWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUnKSB7XG4gICAgaW50ZXJzZWN0ID0gcnMudGd0SW50bjsgLy8gdXNlIGNhY2hlZCB2YWx1ZSBmcm9tIGN0cmxwdCBjYWxjXG4gIH0gZWxzZSB7XG4gICAgaWYgKHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1ub2RlJyB8fCB0Z3RNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbm9kZS1vci1sYWJlbCcpIHtcbiAgICAgIHAxX2kgPSBwMTtcbiAgICB9IGVsc2UgaWYgKHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lJyB8fCB0Z3RNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZS1vci1sYWJlbCcpIHtcbiAgICAgIHAxX2kgPSBbc3JjUG9zLngsIHNyY1Bvcy55XTtcbiAgICB9XG4gICAgaW50ZXJzZWN0ID0gci5ub2RlU2hhcGVzW3RoaXMuZ2V0Tm9kZVNoYXBlKHRhcmdldCldLmludGVyc2VjdExpbmUodGd0UG9zLngsIHRndFBvcy55LCB0YXJnZXQub3V0ZXJXaWR0aCgpLCB0YXJnZXQub3V0ZXJIZWlnaHQoKSwgcDFfaVswXSwgcDFfaVsxXSwgMCwgdGd0Q29ybmVyUmFkaXVzLCB0Z3RScyk7XG4gICAgaWYgKHRndE1hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1ub2RlLW9yLWxhYmVsJyB8fCB0Z3RNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZS1vci1sYWJlbCcpIHtcbiAgICAgIHZhciB0cnMgPSB0YXJnZXQuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgICB2YXIgbHcgPSB0cnMubGFiZWxXaWR0aDtcbiAgICAgIHZhciBsaCA9IHRycy5sYWJlbEhlaWdodDtcbiAgICAgIHZhciBseCA9IHRycy5sYWJlbFg7XG4gICAgICB2YXIgbHkgPSB0cnMubGFiZWxZO1xuICAgICAgdmFyIGx3MiA9IGx3IC8gMjtcbiAgICAgIHZhciBsaDIgPSBsaCAvIDI7XG4gICAgICB2YXIgdmEgPSB0YXJnZXQucHN0eWxlKCd0ZXh0LXZhbGlnbicpLnZhbHVlO1xuICAgICAgaWYgKHZhID09PSAndG9wJykge1xuICAgICAgICBseSAtPSBsaDI7XG4gICAgICB9IGVsc2UgaWYgKHZhID09PSAnYm90dG9tJykge1xuICAgICAgICBseSArPSBsaDI7XG4gICAgICB9XG4gICAgICB2YXIgaGEgPSB0YXJnZXQucHN0eWxlKCd0ZXh0LWhhbGlnbicpLnZhbHVlO1xuICAgICAgaWYgKGhhID09PSAnbGVmdCcpIHtcbiAgICAgICAgbHggLT0gbHcyO1xuICAgICAgfSBlbHNlIGlmIChoYSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICBseCArPSBsdzI7XG4gICAgICB9XG4gICAgICB2YXIgbGFiZWxJbnRlcnNlY3QgPSBwb2x5Z29uSW50ZXJzZWN0TGluZShwMV9pWzBdLCBwMV9pWzFdLCBbbHggLSBsdzIsIGx5IC0gbGgyLCBseCArIGx3MiwgbHkgLSBsaDIsIGx4ICsgbHcyLCBseSArIGxoMiwgbHggLSBsdzIsIGx5ICsgbGgyXSwgdGd0UG9zLngsIHRndFBvcy55KTtcbiAgICAgIGlmIChsYWJlbEludGVyc2VjdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciByZWZQdCA9IHNyY1BvcztcbiAgICAgICAgdmFyIGludFNxZGlzdCA9IHNxZGlzdChyZWZQdCwgYXJyYXkycG9pbnQoaW50ZXJzZWN0KSk7XG4gICAgICAgIHZhciBsYWJJbnRTcWRpc3QgPSBzcWRpc3QocmVmUHQsIGFycmF5MnBvaW50KGxhYmVsSW50ZXJzZWN0KSk7XG4gICAgICAgIHZhciBtaW5TcURpc3QgPSBpbnRTcWRpc3Q7XG4gICAgICAgIGlmIChsYWJJbnRTcWRpc3QgPCBpbnRTcWRpc3QpIHtcbiAgICAgICAgICBpbnRlcnNlY3QgPSBsYWJlbEludGVyc2VjdDtcbiAgICAgICAgICBtaW5TcURpc3QgPSBsYWJJbnRTcWRpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhYmVsSW50ZXJzZWN0Lmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICB2YXIgbGFiSW50MlNxRGlzdCA9IHNxZGlzdChyZWZQdCwge1xuICAgICAgICAgICAgeDogbGFiZWxJbnRlcnNlY3RbMl0sXG4gICAgICAgICAgICB5OiBsYWJlbEludGVyc2VjdFszXVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChsYWJJbnQyU3FEaXN0IDwgbWluU3FEaXN0KSB7XG4gICAgICAgICAgICBpbnRlcnNlY3QgPSBbbGFiZWxJbnRlcnNlY3RbMl0sIGxhYmVsSW50ZXJzZWN0WzNdXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIGFycm93RW5kID0gc2hvcnRlbkludGVyc2VjdGlvbihpbnRlcnNlY3QsIHAxLCByLmFycm93U2hhcGVzW3RndEFyU2hhcGVdLnNwYWNpbmcoZWRnZSkgKyB0Z3REaXN0KTtcbiAgdmFyIGVkZ2VFbmQgPSBzaG9ydGVuSW50ZXJzZWN0aW9uKGludGVyc2VjdCwgcDEsIHIuYXJyb3dTaGFwZXNbdGd0QXJTaGFwZV0uZ2FwKGVkZ2UpICsgdGd0RGlzdCk7XG4gIHJzLmVuZFggPSBlZGdlRW5kWzBdO1xuICBycy5lbmRZID0gZWRnZUVuZFsxXTtcbiAgcnMuYXJyb3dFbmRYID0gYXJyb3dFbmRbMF07XG4gIHJzLmFycm93RW5kWSA9IGFycm93RW5kWzFdO1xuICBpZiAoc3JjTWFuRW5kcHRWYWwgPT09ICdpbnNpZGUtdG8tbm9kZScpIHtcbiAgICBpbnRlcnNlY3QgPSBbc3JjUG9zLngsIHNyY1Bvcy55XTtcbiAgfSBlbHNlIGlmIChzcmNNYW5FbmRwdC51bml0cykge1xuICAgIGludGVyc2VjdCA9IHRoaXMubWFudWFsRW5kcHRUb1B4KHNvdXJjZSwgc3JjTWFuRW5kcHQpO1xuICB9IGVsc2UgaWYgKHNyY01hbkVuZHB0VmFsID09PSAnb3V0c2lkZS10by1saW5lJykge1xuICAgIGludGVyc2VjdCA9IHJzLnNyY0ludG47IC8vIHVzZSBjYWNoZWQgdmFsdWUgZnJvbSBjdHJscHQgY2FsY1xuICB9IGVsc2Uge1xuICAgIGlmIChzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbm9kZScgfHwgc3JjTWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLW5vZGUtb3ItbGFiZWwnKSB7XG4gICAgICBwMl9pID0gcDI7XG4gICAgfSBlbHNlIGlmIChzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbGluZScgfHwgc3JjTWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUtb3ItbGFiZWwnKSB7XG4gICAgICBwMl9pID0gW3RndFBvcy54LCB0Z3RQb3MueV07XG4gICAgfVxuICAgIGludGVyc2VjdCA9IHIubm9kZVNoYXBlc1t0aGlzLmdldE5vZGVTaGFwZShzb3VyY2UpXS5pbnRlcnNlY3RMaW5lKHNyY1Bvcy54LCBzcmNQb3MueSwgc291cmNlLm91dGVyV2lkdGgoKSwgc291cmNlLm91dGVySGVpZ2h0KCksIHAyX2lbMF0sIHAyX2lbMV0sIDAsIHNyY0Nvcm5lclJhZGl1cywgc3JjUnMpO1xuICAgIGlmIChzcmNNYW5FbmRwdFZhbCA9PT0gJ291dHNpZGUtdG8tbm9kZS1vci1sYWJlbCcgfHwgc3JjTWFuRW5kcHRWYWwgPT09ICdvdXRzaWRlLXRvLWxpbmUtb3ItbGFiZWwnKSB7XG4gICAgICB2YXIgc3JzID0gc291cmNlLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgICAgdmFyIF9sdyA9IHNycy5sYWJlbFdpZHRoO1xuICAgICAgdmFyIF9saCA9IHNycy5sYWJlbEhlaWdodDtcbiAgICAgIHZhciBfbHggPSBzcnMubGFiZWxYO1xuICAgICAgdmFyIF9seSA9IHNycy5sYWJlbFk7XG4gICAgICB2YXIgX2x3MiA9IF9sdyAvIDI7XG4gICAgICB2YXIgX2xoMiA9IF9saCAvIDI7XG4gICAgICB2YXIgX3ZhID0gc291cmNlLnBzdHlsZSgndGV4dC12YWxpZ24nKS52YWx1ZTtcbiAgICAgIGlmIChfdmEgPT09ICd0b3AnKSB7XG4gICAgICAgIF9seSAtPSBfbGgyO1xuICAgICAgfSBlbHNlIGlmIChfdmEgPT09ICdib3R0b20nKSB7XG4gICAgICAgIF9seSArPSBfbGgyO1xuICAgICAgfVxuICAgICAgdmFyIF9oYSA9IHNvdXJjZS5wc3R5bGUoJ3RleHQtaGFsaWduJykudmFsdWU7XG4gICAgICBpZiAoX2hhID09PSAnbGVmdCcpIHtcbiAgICAgICAgX2x4IC09IF9sdzI7XG4gICAgICB9IGVsc2UgaWYgKF9oYSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICBfbHggKz0gX2x3MjtcbiAgICAgIH1cbiAgICAgIHZhciBfbGFiZWxJbnRlcnNlY3QgPSBwb2x5Z29uSW50ZXJzZWN0TGluZShwMl9pWzBdLCBwMl9pWzFdLCBbX2x4IC0gX2x3MiwgX2x5IC0gX2xoMiwgX2x4ICsgX2x3MiwgX2x5IC0gX2xoMiwgX2x4ICsgX2x3MiwgX2x5ICsgX2xoMiwgX2x4IC0gX2x3MiwgX2x5ICsgX2xoMl0sIHNyY1Bvcy54LCBzcmNQb3MueSk7XG4gICAgICBpZiAoX2xhYmVsSW50ZXJzZWN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIF9yZWZQdCA9IHRndFBvcztcbiAgICAgICAgdmFyIF9pbnRTcWRpc3QgPSBzcWRpc3QoX3JlZlB0LCBhcnJheTJwb2ludChpbnRlcnNlY3QpKTtcbiAgICAgICAgdmFyIF9sYWJJbnRTcWRpc3QgPSBzcWRpc3QoX3JlZlB0LCBhcnJheTJwb2ludChfbGFiZWxJbnRlcnNlY3QpKTtcbiAgICAgICAgdmFyIF9taW5TcURpc3QgPSBfaW50U3FkaXN0O1xuICAgICAgICBpZiAoX2xhYkludFNxZGlzdCA8IF9pbnRTcWRpc3QpIHtcbiAgICAgICAgICBpbnRlcnNlY3QgPSBbX2xhYmVsSW50ZXJzZWN0WzBdLCBfbGFiZWxJbnRlcnNlY3RbMV1dO1xuICAgICAgICAgIF9taW5TcURpc3QgPSBfbGFiSW50U3FkaXN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChfbGFiZWxJbnRlcnNlY3QubGVuZ3RoID4gMikge1xuICAgICAgICAgIHZhciBfbGFiSW50MlNxRGlzdCA9IHNxZGlzdChfcmVmUHQsIHtcbiAgICAgICAgICAgIHg6IF9sYWJlbEludGVyc2VjdFsyXSxcbiAgICAgICAgICAgIHk6IF9sYWJlbEludGVyc2VjdFszXVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChfbGFiSW50MlNxRGlzdCA8IF9taW5TcURpc3QpIHtcbiAgICAgICAgICAgIGludGVyc2VjdCA9IFtfbGFiZWxJbnRlcnNlY3RbMl0sIF9sYWJlbEludGVyc2VjdFszXV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHZhciBhcnJvd1N0YXJ0ID0gc2hvcnRlbkludGVyc2VjdGlvbihpbnRlcnNlY3QsIHAyLCByLmFycm93U2hhcGVzW3NyY0FyU2hhcGVdLnNwYWNpbmcoZWRnZSkgKyBzcmNEaXN0KTtcbiAgdmFyIGVkZ2VTdGFydCA9IHNob3J0ZW5JbnRlcnNlY3Rpb24oaW50ZXJzZWN0LCBwMiwgci5hcnJvd1NoYXBlc1tzcmNBclNoYXBlXS5nYXAoZWRnZSkgKyBzcmNEaXN0KTtcbiAgcnMuc3RhcnRYID0gZWRnZVN0YXJ0WzBdO1xuICBycy5zdGFydFkgPSBlZGdlU3RhcnRbMV07XG4gIHJzLmFycm93U3RhcnRYID0gYXJyb3dTdGFydFswXTtcbiAgcnMuYXJyb3dTdGFydFkgPSBhcnJvd1N0YXJ0WzFdO1xuICBpZiAoaGFzRW5kcHRzKSB7XG4gICAgaWYgKCFudW1iZXIkMShycy5zdGFydFgpIHx8ICFudW1iZXIkMShycy5zdGFydFkpIHx8ICFudW1iZXIkMShycy5lbmRYKSB8fCAhbnVtYmVyJDEocnMuZW5kWSkpIHtcbiAgICAgIHJzLmJhZExpbmUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBycy5iYWRMaW5lID0gZmFsc2U7XG4gICAgfVxuICB9XG59O1xuQlJwJGIuZ2V0U291cmNlRW5kcG9pbnQgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICB0aGlzLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZShlZGdlKTtcbiAgc3dpdGNoIChycy5lZGdlVHlwZSkge1xuICAgIGNhc2UgJ2hheXN0YWNrJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHJzLmhheXN0YWNrUHRzWzBdLFxuICAgICAgICB5OiBycy5oYXlzdGFja1B0c1sxXVxuICAgICAgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogcnMuYXJyb3dTdGFydFgsXG4gICAgICAgIHk6IHJzLmFycm93U3RhcnRZXG4gICAgICB9O1xuICB9XG59O1xuQlJwJGIuZ2V0VGFyZ2V0RW5kcG9pbnQgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcnMgPSBlZGdlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICB0aGlzLnJlY2FsY3VsYXRlUmVuZGVyZWRTdHlsZShlZGdlKTtcbiAgc3dpdGNoIChycy5lZGdlVHlwZSkge1xuICAgIGNhc2UgJ2hheXN0YWNrJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHJzLmhheXN0YWNrUHRzWzJdLFxuICAgICAgICB5OiBycy5oYXlzdGFja1B0c1szXVxuICAgICAgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogcnMuYXJyb3dFbmRYLFxuICAgICAgICB5OiBycy5hcnJvd0VuZFlcbiAgICAgIH07XG4gIH1cbn07XG5cbnZhciBCUnAkYSA9IHt9O1xuZnVuY3Rpb24gcHVzaEJlemllclB0cyhyLCBlZGdlLCBwdHMpIHtcbiAgdmFyIHFiZXppZXJBdCQxID0gZnVuY3Rpb24gcWJlemllckF0JDEocDEsIHAyLCBwMywgdCkge1xuICAgIHJldHVybiBxYmV6aWVyQXQocDEsIHAyLCBwMywgdCk7XG4gIH07XG4gIHZhciBfcCA9IGVkZ2UuX3ByaXZhdGU7XG4gIHZhciBicHRzID0gX3AucnN0eWxlLmJlemllclB0cztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByLmJlemllclByb2pQY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHAgPSByLmJlemllclByb2pQY3RzW2ldO1xuICAgIGJwdHMucHVzaCh7XG4gICAgICB4OiBxYmV6aWVyQXQkMShwdHNbMF0sIHB0c1syXSwgcHRzWzRdLCBwKSxcbiAgICAgIHk6IHFiZXppZXJBdCQxKHB0c1sxXSwgcHRzWzNdLCBwdHNbNV0sIHApXG4gICAgfSk7XG4gIH1cbn1cbkJScCRhLnN0b3JlRWRnZVByb2plY3Rpb25zID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHZhciBldCA9IHJzLmVkZ2VUeXBlO1xuXG4gIC8vIGNsZWFyIHRoZSBjYWNoZWQgcG9pbnRzIHN0YXRlXG4gIF9wLnJzdHlsZS5iZXppZXJQdHMgPSBudWxsO1xuICBfcC5yc3R5bGUubGluZVB0cyA9IG51bGw7XG4gIF9wLnJzdHlsZS5oYXlzdGFja1B0cyA9IG51bGw7XG4gIGlmIChldCA9PT0gJ211bHRpYmV6aWVyJyB8fCBldCA9PT0gJ2JlemllcicgfHwgZXQgPT09ICdzZWxmJyB8fCBldCA9PT0gJ2NvbXBvdW5kJykge1xuICAgIF9wLnJzdHlsZS5iZXppZXJQdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSArIDUgPCBycy5hbGxwdHMubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgIHB1c2hCZXppZXJQdHModGhpcywgZWRnZSwgcnMuYWxscHRzLnNsaWNlKGksIGkgKyA2KSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGV0ID09PSAnc2VnbWVudHMnKSB7XG4gICAgdmFyIGxwdHMgPSBfcC5yc3R5bGUubGluZVB0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpICsgMSA8IHJzLmFsbHB0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgbHB0cy5wdXNoKHtcbiAgICAgICAgeDogcnMuYWxscHRzW2ldLFxuICAgICAgICB5OiBycy5hbGxwdHNbaSArIDFdXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXQgPT09ICdoYXlzdGFjaycpIHtcbiAgICB2YXIgaHB0cyA9IHJzLmhheXN0YWNrUHRzO1xuICAgIF9wLnJzdHlsZS5oYXlzdGFja1B0cyA9IFt7XG4gICAgICB4OiBocHRzWzBdLFxuICAgICAgeTogaHB0c1sxXVxuICAgIH0sIHtcbiAgICAgIHg6IGhwdHNbMl0sXG4gICAgICB5OiBocHRzWzNdXG4gICAgfV07XG4gIH1cbiAgX3AucnN0eWxlLmFycm93V2lkdGggPSB0aGlzLmdldEFycm93V2lkdGgoZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZSwgZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWUpICogdGhpcy5hcnJvd1NoYXBlV2lkdGg7XG59O1xuQlJwJGEucmVjYWxjdWxhdGVFZGdlUHJvamVjdGlvbnMgPSBmdW5jdGlvbiAoZWRnZXMpIHtcbiAgdGhpcy5maW5kRWRnZUNvbnRyb2xQb2ludHMoZWRnZXMpO1xufTtcblxuLyogZ2xvYmFsIGRvY3VtZW50ICovXG5cbnZhciBCUnAkOSA9IHt9O1xuQlJwJDkucmVjYWxjdWxhdGVOb2RlTGFiZWxQcm9qZWN0aW9uID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgdmFyIGNvbnRlbnQgPSBub2RlLnBzdHlsZSgnbGFiZWwnKS5zdHJWYWx1ZTtcbiAgaWYgKGVtcHR5U3RyaW5nKGNvbnRlbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciB0ZXh0WCwgdGV4dFk7XG4gIHZhciBfcCA9IG5vZGUuX3ByaXZhdGU7XG4gIHZhciBub2RlV2lkdGggPSBub2RlLndpZHRoKCk7XG4gIHZhciBub2RlSGVpZ2h0ID0gbm9kZS5oZWlnaHQoKTtcbiAgdmFyIHBhZGRpbmcgPSBub2RlLnBhZGRpbmcoKTtcbiAgdmFyIG5vZGVQb3MgPSBub2RlLnBvc2l0aW9uKCk7XG4gIHZhciB0ZXh0SGFsaWduID0gbm9kZS5wc3R5bGUoJ3RleHQtaGFsaWduJykuc3RyVmFsdWU7XG4gIHZhciB0ZXh0VmFsaWduID0gbm9kZS5wc3R5bGUoJ3RleHQtdmFsaWduJykuc3RyVmFsdWU7XG4gIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuICB2YXIgcnN0eWxlID0gX3AucnN0eWxlO1xuICBzd2l0Y2ggKHRleHRIYWxpZ24pIHtcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIHRleHRYID0gbm9kZVBvcy54IC0gbm9kZVdpZHRoIC8gMiAtIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyaWdodCc6XG4gICAgICB0ZXh0WCA9IG5vZGVQb3MueCArIG5vZGVXaWR0aCAvIDIgKyBwYWRkaW5nO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGUuZy4gY2VudGVyXG4gICAgICB0ZXh0WCA9IG5vZGVQb3MueDtcbiAgfVxuICBzd2l0Y2ggKHRleHRWYWxpZ24pIHtcbiAgICBjYXNlICd0b3AnOlxuICAgICAgdGV4dFkgPSBub2RlUG9zLnkgLSBub2RlSGVpZ2h0IC8gMiAtIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdib3R0b20nOlxuICAgICAgdGV4dFkgPSBub2RlUG9zLnkgKyBub2RlSGVpZ2h0IC8gMiArIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gZS5nLiBtaWRkbGVcbiAgICAgIHRleHRZID0gbm9kZVBvcy55O1xuICB9XG4gIHJzLmxhYmVsWCA9IHRleHRYO1xuICBycy5sYWJlbFkgPSB0ZXh0WTtcbiAgcnN0eWxlLmxhYmVsWCA9IHRleHRYO1xuICByc3R5bGUubGFiZWxZID0gdGV4dFk7XG4gIHRoaXMuY2FsY3VsYXRlTGFiZWxBbmdsZXMobm9kZSk7XG4gIHRoaXMuYXBwbHlMYWJlbERpbWVuc2lvbnMobm9kZSk7XG59O1xudmFyIGxpbmVBbmdsZUZyb21EZWx0YSA9IGZ1bmN0aW9uIGxpbmVBbmdsZUZyb21EZWx0YShkeCwgZHkpIHtcbiAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuKGR5IC8gZHgpO1xuICBpZiAoZHggPT09IDAgJiYgYW5nbGUgPCAwKSB7XG4gICAgYW5nbGUgPSBhbmdsZSAqIC0xO1xuICB9XG4gIHJldHVybiBhbmdsZTtcbn07XG52YXIgbGluZUFuZ2xlID0gZnVuY3Rpb24gbGluZUFuZ2xlKHAwLCBwMSkge1xuICB2YXIgZHggPSBwMS54IC0gcDAueDtcbiAgdmFyIGR5ID0gcDEueSAtIHAwLnk7XG4gIHJldHVybiBsaW5lQW5nbGVGcm9tRGVsdGEoZHgsIGR5KTtcbn07XG52YXIgYmV6aWVyQW5nbGUgPSBmdW5jdGlvbiBiZXppZXJBbmdsZShwMCwgcDEsIHAyLCB0KSB7XG4gIHZhciB0MCA9IGJvdW5kKDAsIHQgLSAwLjAwMSwgMSk7XG4gIHZhciB0MSA9IGJvdW5kKDAsIHQgKyAwLjAwMSwgMSk7XG4gIHZhciBscDAgPSBxYmV6aWVyUHRBdChwMCwgcDEsIHAyLCB0MCk7XG4gIHZhciBscDEgPSBxYmV6aWVyUHRBdChwMCwgcDEsIHAyLCB0MSk7XG4gIHJldHVybiBsaW5lQW5nbGUobHAwLCBscDEpO1xufTtcbkJScCQ5LnJlY2FsY3VsYXRlRWRnZUxhYmVsUHJvamVjdGlvbnMgPSBmdW5jdGlvbiAoZWRnZSkge1xuICB2YXIgcDtcbiAgdmFyIF9wID0gZWRnZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGNvbnRlbnQgPSB7XG4gICAgbWlkOiBlZGdlLnBzdHlsZSgnbGFiZWwnKS5zdHJWYWx1ZSxcbiAgICBzb3VyY2U6IGVkZ2UucHN0eWxlKCdzb3VyY2UtbGFiZWwnKS5zdHJWYWx1ZSxcbiAgICB0YXJnZXQ6IGVkZ2UucHN0eWxlKCd0YXJnZXQtbGFiZWwnKS5zdHJWYWx1ZVxuICB9O1xuICBpZiAoY29udGVudC5taWQgfHwgY29udGVudC5zb3VyY2UgfHwgY29udGVudC50YXJnZXQpIDsgZWxzZSB7XG4gICAgcmV0dXJuOyAvLyBubyBsYWJlbHMgPT4gbm8gY2FsY3NcbiAgfVxuXG4gIC8vIGFkZCBjZW50ZXIgcG9pbnQgdG8gc3R5bGUgc28gYm91bmRpbmcgYm94IGNhbGN1bGF0aW9ucyBjYW4gdXNlIGl0XG4gIC8vXG4gIHAgPSB7XG4gICAgeDogcnMubWlkWCxcbiAgICB5OiBycy5taWRZXG4gIH07XG4gIHZhciBzZXRScyA9IGZ1bmN0aW9uIHNldFJzKHByb3BOYW1lLCBwcmVmaXgsIHZhbHVlKSB7XG4gICAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgcHJvcE5hbWUsIHByZWZpeCwgdmFsdWUpO1xuICAgIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnN0eWxlLCBwcm9wTmFtZSwgcHJlZml4LCB2YWx1ZSk7XG4gIH07XG4gIHNldFJzKCdsYWJlbFgnLCBudWxsLCBwLngpO1xuICBzZXRScygnbGFiZWxZJywgbnVsbCwgcC55KTtcbiAgdmFyIG1pZEFuZ2xlID0gbGluZUFuZ2xlRnJvbURlbHRhKHJzLm1pZERpc3BYLCBycy5taWREaXNwWSk7XG4gIHNldFJzKCdsYWJlbEF1dG9BbmdsZScsIG51bGwsIG1pZEFuZ2xlKTtcbiAgdmFyIGNyZWF0ZUNvbnRyb2xQb2ludEluZm8gPSBmdW5jdGlvbiBjcmVhdGVDb250cm9sUG9pbnRJbmZvKCkge1xuICAgIGlmIChjcmVhdGVDb250cm9sUG9pbnRJbmZvLmNhY2hlKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQ29udHJvbFBvaW50SW5mby5jYWNoZTtcbiAgICB9IC8vIHVzZSBjYWNoZSBzbyBvbmx5IDF4IHBlciBlZGdlXG5cbiAgICB2YXIgY3RybHB0cyA9IFtdO1xuXG4gICAgLy8gc3RvcmUgZWFjaCBjdHJscHQgaW5mbyBpbml0XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgKyA1IDwgcnMuYWxscHRzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICB2YXIgcDAgPSB7XG4gICAgICAgIHg6IHJzLmFsbHB0c1tpXSxcbiAgICAgICAgeTogcnMuYWxscHRzW2kgKyAxXVxuICAgICAgfTtcbiAgICAgIHZhciBwMSA9IHtcbiAgICAgICAgeDogcnMuYWxscHRzW2kgKyAyXSxcbiAgICAgICAgeTogcnMuYWxscHRzW2kgKyAzXVxuICAgICAgfTsgLy8gY3RybHB0XG4gICAgICB2YXIgcDIgPSB7XG4gICAgICAgIHg6IHJzLmFsbHB0c1tpICsgNF0sXG4gICAgICAgIHk6IHJzLmFsbHB0c1tpICsgNV1cbiAgICAgIH07XG4gICAgICBjdHJscHRzLnB1c2goe1xuICAgICAgICBwMDogcDAsXG4gICAgICAgIHAxOiBwMSxcbiAgICAgICAgcDI6IHAyLFxuICAgICAgICBzdGFydERpc3Q6IDAsXG4gICAgICAgIGxlbmd0aDogMCxcbiAgICAgICAgc2VnbWVudHM6IFtdXG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIGJwdHMgPSBfcC5yc3R5bGUuYmV6aWVyUHRzO1xuICAgIHZhciBuUHJvanMgPSByLmJlemllclByb2pQY3RzLmxlbmd0aDtcbiAgICBmdW5jdGlvbiBhZGRTZWdtZW50KGNwLCBwMCwgcDEsIHQwLCB0MSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGRpc3QocDAsIHAxKTtcbiAgICAgIHZhciBwcmV2U2VnbWVudCA9IGNwLnNlZ21lbnRzW2NwLnNlZ21lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIHNlZ21lbnQgPSB7XG4gICAgICAgIHAwOiBwMCxcbiAgICAgICAgcDE6IHAxLFxuICAgICAgICB0MDogdDAsXG4gICAgICAgIHQxOiB0MSxcbiAgICAgICAgc3RhcnREaXN0OiBwcmV2U2VnbWVudCA/IHByZXZTZWdtZW50LnN0YXJ0RGlzdCArIHByZXZTZWdtZW50Lmxlbmd0aCA6IDAsXG4gICAgICAgIGxlbmd0aDogbGVuZ3RoXG4gICAgICB9O1xuICAgICAgY3Auc2VnbWVudHMucHVzaChzZWdtZW50KTtcbiAgICAgIGNwLmxlbmd0aCArPSBsZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGVhY2ggY3RybHB0IHdpdGggc2VnbWVudCBpbmZvXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGN0cmxwdHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgY3AgPSBjdHJscHRzW19pXTtcbiAgICAgIHZhciBwcmV2Q3AgPSBjdHJscHRzW19pIC0gMV07XG4gICAgICBpZiAocHJldkNwKSB7XG4gICAgICAgIGNwLnN0YXJ0RGlzdCA9IHByZXZDcC5zdGFydERpc3QgKyBwcmV2Q3AubGVuZ3RoO1xuICAgICAgfVxuICAgICAgYWRkU2VnbWVudChjcCwgY3AucDAsIGJwdHNbX2kgKiBuUHJvanNdLCAwLCByLmJlemllclByb2pQY3RzWzBdKTsgLy8gZmlyc3RcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuUHJvanMgLSAxOyBqKyspIHtcbiAgICAgICAgYWRkU2VnbWVudChjcCwgYnB0c1tfaSAqIG5Qcm9qcyArIGpdLCBicHRzW19pICogblByb2pzICsgaiArIDFdLCByLmJlemllclByb2pQY3RzW2pdLCByLmJlemllclByb2pQY3RzW2ogKyAxXSk7XG4gICAgICB9XG4gICAgICBhZGRTZWdtZW50KGNwLCBicHRzW19pICogblByb2pzICsgblByb2pzIC0gMV0sIGNwLnAyLCByLmJlemllclByb2pQY3RzW25Qcm9qcyAtIDFdLCAxKTsgLy8gbGFzdFxuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVDb250cm9sUG9pbnRJbmZvLmNhY2hlID0gY3RybHB0cztcbiAgfTtcbiAgdmFyIGNhbGN1bGF0ZUVuZFByb2plY3Rpb24gPSBmdW5jdGlvbiBjYWxjdWxhdGVFbmRQcm9qZWN0aW9uKHByZWZpeCkge1xuICAgIHZhciBhbmdsZTtcbiAgICB2YXIgaXNTcmMgPSBwcmVmaXggPT09ICdzb3VyY2UnO1xuICAgIGlmICghY29udGVudFtwcmVmaXhdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBvZmZzZXQgPSBlZGdlLnBzdHlsZShwcmVmaXggKyAnLXRleHQtb2Zmc2V0JykucGZWYWx1ZTtcbiAgICBzd2l0Y2ggKHJzLmVkZ2VUeXBlKSB7XG4gICAgICBjYXNlICdzZWxmJzpcbiAgICAgIGNhc2UgJ2NvbXBvdW5kJzpcbiAgICAgIGNhc2UgJ2Jlemllcic6XG4gICAgICBjYXNlICdtdWx0aWJlemllcic6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgY3BzID0gY3JlYXRlQ29udHJvbFBvaW50SW5mbygpO1xuICAgICAgICAgIHZhciBzZWxlY3RlZDtcbiAgICAgICAgICB2YXIgc3RhcnREaXN0ID0gMDtcbiAgICAgICAgICB2YXIgdG90YWxEaXN0ID0gMDtcblxuICAgICAgICAgIC8vIGZpbmQgdGhlIHNlZ21lbnQgd2UncmUgb25cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIF9jcCA9IGNwc1tpc1NyYyA/IGkgOiBjcHMubGVuZ3RoIC0gMSAtIGldO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBfY3Auc2VnbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgdmFyIF9zZWcgPSBfY3Auc2VnbWVudHNbaXNTcmMgPyBqIDogX2NwLnNlZ21lbnRzLmxlbmd0aCAtIDEgLSBqXTtcbiAgICAgICAgICAgICAgdmFyIGxhc3RTZWcgPSBpID09PSBjcHMubGVuZ3RoIC0gMSAmJiBqID09PSBfY3Auc2VnbWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgc3RhcnREaXN0ID0gdG90YWxEaXN0O1xuICAgICAgICAgICAgICB0b3RhbERpc3QgKz0gX3NlZy5sZW5ndGg7XG4gICAgICAgICAgICAgIGlmICh0b3RhbERpc3QgPj0gb2Zmc2V0IHx8IGxhc3RTZWcpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHtcbiAgICAgICAgICAgICAgICAgIGNwOiBfY3AsXG4gICAgICAgICAgICAgICAgICBzZWdtZW50OiBfc2VnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgY3AgPSBzZWxlY3RlZC5jcDtcbiAgICAgICAgICB2YXIgc2VnID0gc2VsZWN0ZWQuc2VnbWVudDtcbiAgICAgICAgICB2YXIgdFNlZ21lbnQgPSAob2Zmc2V0IC0gc3RhcnREaXN0KSAvIHNlZy5sZW5ndGg7XG4gICAgICAgICAgdmFyIHNlZ0R0ID0gc2VnLnQxIC0gc2VnLnQwO1xuICAgICAgICAgIHZhciB0ID0gaXNTcmMgPyBzZWcudDAgKyBzZWdEdCAqIHRTZWdtZW50IDogc2VnLnQxIC0gc2VnRHQgKiB0U2VnbWVudDtcbiAgICAgICAgICB0ID0gYm91bmQoMCwgdCwgMSk7XG4gICAgICAgICAgcCA9IHFiZXppZXJQdEF0KGNwLnAwLCBjcC5wMSwgY3AucDIsIHQpO1xuICAgICAgICAgIGFuZ2xlID0gYmV6aWVyQW5nbGUoY3AucDAsIGNwLnAxLCBjcC5wMiwgdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmFpZ2h0JzpcbiAgICAgIGNhc2UgJ3NlZ21lbnRzJzpcbiAgICAgIGNhc2UgJ2hheXN0YWNrJzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBkID0gMCxcbiAgICAgICAgICAgIGRpLFxuICAgICAgICAgICAgZDA7XG4gICAgICAgICAgdmFyIHAwLCBwMTtcbiAgICAgICAgICB2YXIgbCA9IHJzLmFsbHB0cy5sZW5ndGg7XG4gICAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyICsgMyA8IGw7IF9pMiArPSAyKSB7XG4gICAgICAgICAgICBpZiAoaXNTcmMpIHtcbiAgICAgICAgICAgICAgcDAgPSB7XG4gICAgICAgICAgICAgICAgeDogcnMuYWxscHRzW19pMl0sXG4gICAgICAgICAgICAgICAgeTogcnMuYWxscHRzW19pMiArIDFdXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHAxID0ge1xuICAgICAgICAgICAgICAgIHg6IHJzLmFsbHB0c1tfaTIgKyAyXSxcbiAgICAgICAgICAgICAgICB5OiBycy5hbGxwdHNbX2kyICsgM11cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHAwID0ge1xuICAgICAgICAgICAgICAgIHg6IHJzLmFsbHB0c1tsIC0gMiAtIF9pMl0sXG4gICAgICAgICAgICAgICAgeTogcnMuYWxscHRzW2wgLSAxIC0gX2kyXVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBwMSA9IHtcbiAgICAgICAgICAgICAgICB4OiBycy5hbGxwdHNbbCAtIDQgLSBfaTJdLFxuICAgICAgICAgICAgICAgIHk6IHJzLmFsbHB0c1tsIC0gMyAtIF9pMl1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpID0gZGlzdChwMCwgcDEpO1xuICAgICAgICAgICAgZDAgPSBkO1xuICAgICAgICAgICAgZCArPSBkaTtcbiAgICAgICAgICAgIGlmIChkID49IG9mZnNldCkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHBEID0gb2Zmc2V0IC0gZDA7XG4gICAgICAgICAgdmFyIF90ID0gcEQgLyBkaTtcbiAgICAgICAgICBfdCA9IGJvdW5kKDAsIF90LCAxKTtcbiAgICAgICAgICBwID0gbGluZUF0KHAwLCBwMSwgX3QpO1xuICAgICAgICAgIGFuZ2xlID0gbGluZUFuZ2xlKHAwLCBwMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0UnMoJ2xhYmVsWCcsIHByZWZpeCwgcC54KTtcbiAgICBzZXRScygnbGFiZWxZJywgcHJlZml4LCBwLnkpO1xuICAgIHNldFJzKCdsYWJlbEF1dG9BbmdsZScsIHByZWZpeCwgYW5nbGUpO1xuICB9O1xuICBjYWxjdWxhdGVFbmRQcm9qZWN0aW9uKCdzb3VyY2UnKTtcbiAgY2FsY3VsYXRlRW5kUHJvamVjdGlvbigndGFyZ2V0Jyk7XG4gIHRoaXMuYXBwbHlMYWJlbERpbWVuc2lvbnMoZWRnZSk7XG59O1xuQlJwJDkuYXBwbHlMYWJlbERpbWVuc2lvbnMgPSBmdW5jdGlvbiAoZWxlKSB7XG4gIHRoaXMuYXBwbHlQcmVmaXhlZExhYmVsRGltZW5zaW9ucyhlbGUpO1xuICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgdGhpcy5hcHBseVByZWZpeGVkTGFiZWxEaW1lbnNpb25zKGVsZSwgJ3NvdXJjZScpO1xuICAgIHRoaXMuYXBwbHlQcmVmaXhlZExhYmVsRGltZW5zaW9ucyhlbGUsICd0YXJnZXQnKTtcbiAgfVxufTtcbkJScCQ5LmFwcGx5UHJlZml4ZWRMYWJlbERpbWVuc2lvbnMgPSBmdW5jdGlvbiAoZWxlLCBwcmVmaXgpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgdGV4dCA9IHRoaXMuZ2V0TGFiZWxUZXh0KGVsZSwgcHJlZml4KTtcbiAgdmFyIGxhYmVsRGltcyA9IHRoaXMuY2FsY3VsYXRlTGFiZWxEaW1lbnNpb25zKGVsZSwgdGV4dCk7XG4gIHZhciBsaW5lSGVpZ2h0ID0gZWxlLnBzdHlsZSgnbGluZS1oZWlnaHQnKS5wZlZhbHVlO1xuICB2YXIgdGV4dFdyYXAgPSBlbGUucHN0eWxlKCd0ZXh0LXdyYXAnKS5zdHJWYWx1ZTtcbiAgdmFyIGxpbmVzID0gZ2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgJ2xhYmVsV3JhcENhY2hlZExpbmVzJywgcHJlZml4KSB8fCBbXTtcbiAgdmFyIG51bUxpbmVzID0gdGV4dFdyYXAgIT09ICd3cmFwJyA/IDEgOiBNYXRoLm1heChsaW5lcy5sZW5ndGgsIDEpO1xuICB2YXIgbm9ybVBlckxpbmVIZWlnaHQgPSBsYWJlbERpbXMuaGVpZ2h0IC8gbnVtTGluZXM7XG4gIHZhciBsYWJlbExpbmVIZWlnaHQgPSBub3JtUGVyTGluZUhlaWdodCAqIGxpbmVIZWlnaHQ7XG4gIHZhciB3aWR0aCA9IGxhYmVsRGltcy53aWR0aDtcbiAgdmFyIGhlaWdodCA9IGxhYmVsRGltcy5oZWlnaHQgKyAobnVtTGluZXMgLSAxKSAqIChsaW5lSGVpZ2h0IC0gMSkgKiBub3JtUGVyTGluZUhlaWdodDtcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc3R5bGUsICdsYWJlbFdpZHRoJywgcHJlZml4LCB3aWR0aCk7XG4gIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnNjcmF0Y2gsICdsYWJlbFdpZHRoJywgcHJlZml4LCB3aWR0aCk7XG4gIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnN0eWxlLCAnbGFiZWxIZWlnaHQnLCBwcmVmaXgsIGhlaWdodCk7XG4gIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnNjcmF0Y2gsICdsYWJlbEhlaWdodCcsIHByZWZpeCwgaGVpZ2h0KTtcbiAgc2V0UHJlZml4ZWRQcm9wZXJ0eShfcC5yc2NyYXRjaCwgJ2xhYmVsTGluZUhlaWdodCcsIHByZWZpeCwgbGFiZWxMaW5lSGVpZ2h0KTtcbn07XG5CUnAkOS5nZXRMYWJlbFRleHQgPSBmdW5jdGlvbiAoZWxlLCBwcmVmaXgpIHtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcGZkID0gcHJlZml4ID8gcHJlZml4ICsgJy0nIDogJyc7XG4gIHZhciB0ZXh0ID0gZWxlLnBzdHlsZShwZmQgKyAnbGFiZWwnKS5zdHJWYWx1ZTtcbiAgdmFyIHRleHRUcmFuc2Zvcm0gPSBlbGUucHN0eWxlKCd0ZXh0LXRyYW5zZm9ybScpLnZhbHVlO1xuICB2YXIgcnNjcmF0Y2ggPSBmdW5jdGlvbiByc2NyYXRjaChwcm9wTmFtZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHNldFByZWZpeGVkUHJvcGVydHkoX3AucnNjcmF0Y2gsIHByb3BOYW1lLCBwcmVmaXgsIHZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldFByZWZpeGVkUHJvcGVydHkoX3AucnNjcmF0Y2gsIHByb3BOYW1lLCBwcmVmaXgpO1xuICAgIH1cbiAgfTtcblxuICAvLyBmb3IgZW1wdHkgdGV4dCwgc2tpcCBhbGwgcHJvY2Vzc2luZ1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgaWYgKHRleHRUcmFuc2Zvcm0gPT0gJ25vbmUnKSA7IGVsc2UgaWYgKHRleHRUcmFuc2Zvcm0gPT0gJ3VwcGVyY2FzZScpIHtcbiAgICB0ZXh0ID0gdGV4dC50b1VwcGVyQ2FzZSgpO1xuICB9IGVsc2UgaWYgKHRleHRUcmFuc2Zvcm0gPT0gJ2xvd2VyY2FzZScpIHtcbiAgICB0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHZhciB3cmFwU3R5bGUgPSBlbGUucHN0eWxlKCd0ZXh0LXdyYXAnKS52YWx1ZTtcbiAgaWYgKHdyYXBTdHlsZSA9PT0gJ3dyYXAnKSB7XG4gICAgdmFyIGxhYmVsS2V5ID0gcnNjcmF0Y2goJ2xhYmVsS2V5Jyk7XG5cbiAgICAvLyBzYXZlIHJlY2FsYyBpZiB0aGUgbGFiZWwgaXMgdGhlIHNhbWUgYXMgYmVmb3JlXG4gICAgaWYgKGxhYmVsS2V5ICE9IG51bGwgJiYgcnNjcmF0Y2goJ2xhYmVsV3JhcEtleScpID09PSBsYWJlbEtleSkge1xuICAgICAgcmV0dXJuIHJzY3JhdGNoKCdsYWJlbFdyYXBDYWNoZWRUZXh0Jyk7XG4gICAgfVxuICAgIHZhciB6d3NwID0gXCJcXHUyMDBCXCI7XG4gICAgdmFyIGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgdmFyIG1heFcgPSBlbGUucHN0eWxlKCd0ZXh0LW1heC13aWR0aCcpLnBmVmFsdWU7XG4gICAgdmFyIG92ZXJmbG93ID0gZWxlLnBzdHlsZSgndGV4dC1vdmVyZmxvdy13cmFwJykudmFsdWU7XG4gICAgdmFyIG92ZXJmbG93QW55ID0gb3ZlcmZsb3cgPT09ICdhbnl3aGVyZSc7XG4gICAgdmFyIHdyYXBwZWRMaW5lcyA9IFtdO1xuICAgIHZhciB3b3Jkc1JlZ2V4ID0gL1tcXHNcXHUyMDBiXSsvO1xuICAgIHZhciB3b3JkU2VwYXJhdG9yID0gb3ZlcmZsb3dBbnkgPyAnJyA6ICcgJztcbiAgICBmb3IgKHZhciBsID0gMDsgbCA8IGxpbmVzLmxlbmd0aDsgbCsrKSB7XG4gICAgICB2YXIgbGluZSA9IGxpbmVzW2xdO1xuICAgICAgdmFyIGxpbmVEaW1zID0gdGhpcy5jYWxjdWxhdGVMYWJlbERpbWVuc2lvbnMoZWxlLCBsaW5lKTtcbiAgICAgIHZhciBsaW5lVyA9IGxpbmVEaW1zLndpZHRoO1xuICAgICAgaWYgKG92ZXJmbG93QW55KSB7XG4gICAgICAgIHZhciBwcm9jZXNzZWRMaW5lID0gbGluZS5zcGxpdCgnJykuam9pbih6d3NwKTtcbiAgICAgICAgbGluZSA9IHByb2Nlc3NlZExpbmU7XG4gICAgICB9XG4gICAgICBpZiAobGluZVcgPiBtYXhXKSB7XG4gICAgICAgIC8vIGxpbmUgaXMgdG9vIGxvbmdcbiAgICAgICAgdmFyIHdvcmRzID0gbGluZS5zcGxpdCh3b3Jkc1JlZ2V4KTtcbiAgICAgICAgdmFyIHN1YmxpbmUgPSAnJztcbiAgICAgICAgZm9yICh2YXIgdyA9IDA7IHcgPCB3b3Jkcy5sZW5ndGg7IHcrKykge1xuICAgICAgICAgIHZhciB3b3JkID0gd29yZHNbd107XG4gICAgICAgICAgdmFyIHRlc3RMaW5lID0gc3VibGluZS5sZW5ndGggPT09IDAgPyB3b3JkIDogc3VibGluZSArIHdvcmRTZXBhcmF0b3IgKyB3b3JkO1xuICAgICAgICAgIHZhciB0ZXN0RGltcyA9IHRoaXMuY2FsY3VsYXRlTGFiZWxEaW1lbnNpb25zKGVsZSwgdGVzdExpbmUpO1xuICAgICAgICAgIHZhciB0ZXN0VyA9IHRlc3REaW1zLndpZHRoO1xuICAgICAgICAgIGlmICh0ZXN0VyA8PSBtYXhXKSB7XG4gICAgICAgICAgICAvLyB3b3JkIGZpdHMgb24gY3VycmVudCBsaW5lXG4gICAgICAgICAgICBzdWJsaW5lICs9IHdvcmQgKyB3b3JkU2VwYXJhdG9yO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB3b3JkIHN0YXJ0cyBuZXcgbGluZVxuICAgICAgICAgICAgaWYgKHN1YmxpbmUpIHtcbiAgICAgICAgICAgICAgd3JhcHBlZExpbmVzLnB1c2goc3VibGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWJsaW5lID0gd29yZCArIHdvcmRTZXBhcmF0b3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgdGhlcmUncyByZW1haW5pbmcgdGV4dCwgcHV0IGl0IGluIGEgd3JhcHBlZCBsaW5lXG4gICAgICAgIGlmICghc3VibGluZS5tYXRjaCgvXltcXHNcXHUyMDBiXSskLykpIHtcbiAgICAgICAgICB3cmFwcGVkTGluZXMucHVzaChzdWJsaW5lKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbGluZSBpcyBhbHJlYWR5IHNob3J0IGVub3VnaFxuICAgICAgICB3cmFwcGVkTGluZXMucHVzaChsaW5lKTtcbiAgICAgIH1cbiAgICB9IC8vIGZvclxuXG4gICAgcnNjcmF0Y2goJ2xhYmVsV3JhcENhY2hlZExpbmVzJywgd3JhcHBlZExpbmVzKTtcbiAgICB0ZXh0ID0gcnNjcmF0Y2goJ2xhYmVsV3JhcENhY2hlZFRleHQnLCB3cmFwcGVkTGluZXMuam9pbignXFxuJykpO1xuICAgIHJzY3JhdGNoKCdsYWJlbFdyYXBLZXknLCBsYWJlbEtleSk7XG4gIH0gZWxzZSBpZiAod3JhcFN0eWxlID09PSAnZWxsaXBzaXMnKSB7XG4gICAgdmFyIF9tYXhXID0gZWxlLnBzdHlsZSgndGV4dC1tYXgtd2lkdGgnKS5wZlZhbHVlO1xuICAgIHZhciBlbGxpcHNpemVkID0gJyc7XG4gICAgdmFyIGVsbGlwc2lzID0gXCJcXHUyMDI2XCI7XG4gICAgdmFyIGluY0xhc3RDaCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyhlbGUsIHRleHQpLndpZHRoIDwgX21heFcpIHtcbiAgICAgIC8vIHRoZSBsYWJlbCBhbHJlYWR5IGZpdHNcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3aWR0aFdpdGhOZXh0Q2ggPSB0aGlzLmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyhlbGUsIGVsbGlwc2l6ZWQgKyB0ZXh0W2ldICsgZWxsaXBzaXMpLndpZHRoO1xuICAgICAgaWYgKHdpZHRoV2l0aE5leHRDaCA+IF9tYXhXKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZWxsaXBzaXplZCArPSB0ZXh0W2ldO1xuICAgICAgaWYgKGkgPT09IHRleHQubGVuZ3RoIC0gMSkge1xuICAgICAgICBpbmNMYXN0Q2ggPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWluY0xhc3RDaCkge1xuICAgICAgZWxsaXBzaXplZCArPSBlbGxpcHNpcztcbiAgICB9XG4gICAgcmV0dXJuIGVsbGlwc2l6ZWQ7XG4gIH0gLy8gaWYgZWxsaXBzaXplXG5cbiAgcmV0dXJuIHRleHQ7XG59O1xuQlJwJDkuZ2V0TGFiZWxKdXN0aWZpY2F0aW9uID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIganVzdGlmaWNhdGlvbiA9IGVsZS5wc3R5bGUoJ3RleHQtanVzdGlmaWNhdGlvbicpLnN0clZhbHVlO1xuICB2YXIgdGV4dEhhbGlnbiA9IGVsZS5wc3R5bGUoJ3RleHQtaGFsaWduJykuc3RyVmFsdWU7XG4gIGlmIChqdXN0aWZpY2F0aW9uID09PSAnYXV0bycpIHtcbiAgICBpZiAoZWxlLmlzTm9kZSgpKSB7XG4gICAgICBzd2l0Y2ggKHRleHRIYWxpZ24pIHtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICByZXR1cm4gJ2xlZnQnO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAnY2VudGVyJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdjZW50ZXInO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ganVzdGlmaWNhdGlvbjtcbiAgfVxufTtcbkJScCQ5LmNhbGN1bGF0ZUxhYmVsRGltZW5zaW9ucyA9IGZ1bmN0aW9uIChlbGUsIHRleHQpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgY2FjaGVLZXkgPSBoYXNoU3RyaW5nKHRleHQsIGVsZS5fcHJpdmF0ZS5sYWJlbERpbXNLZXkpO1xuICB2YXIgY2FjaGUgPSByLmxhYmVsRGltQ2FjaGUgfHwgKHIubGFiZWxEaW1DYWNoZSA9IFtdKTtcbiAgdmFyIGV4aXN0aW5nVmFsID0gY2FjaGVbY2FjaGVLZXldO1xuICBpZiAoZXhpc3RpbmdWYWwgIT0gbnVsbCkge1xuICAgIHJldHVybiBleGlzdGluZ1ZhbDtcbiAgfVxuICB2YXIgcGFkZGluZyA9IDA7IC8vIGFkZCBwYWRkaW5nIGFyb3VuZCB0ZXh0IGRpbXMsIGFzIHRoZSBtZWFzdXJlbWVudCBpc24ndCB0aGF0IGFjY3VyYXRlXG4gIHZhciBmU3R5bGUgPSBlbGUucHN0eWxlKCdmb250LXN0eWxlJykuc3RyVmFsdWU7XG4gIHZhciBzaXplID0gZWxlLnBzdHlsZSgnZm9udC1zaXplJykucGZWYWx1ZTtcbiAgdmFyIGZhbWlseSA9IGVsZS5wc3R5bGUoJ2ZvbnQtZmFtaWx5Jykuc3RyVmFsdWU7XG4gIHZhciB3ZWlnaHQgPSBlbGUucHN0eWxlKCdmb250LXdlaWdodCcpLnN0clZhbHVlO1xuICB2YXIgY2FudmFzID0gdGhpcy5sYWJlbENhbGNDYW52YXM7XG4gIHZhciBjMmQgPSB0aGlzLmxhYmVsQ2FsY0NhbnZhc0NvbnRleHQ7XG4gIGlmICghY2FudmFzKSB7XG4gICAgY2FudmFzID0gdGhpcy5sYWJlbENhbGNDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjMmQgPSB0aGlzLmxhYmVsQ2FsY0NhbnZhc0NvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICB2YXIgZHMgPSBjYW52YXMuc3R5bGU7XG4gICAgZHMucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGRzLmxlZnQgPSAnLTk5OTlweCc7XG4gICAgZHMudG9wID0gJy05OTk5cHgnO1xuICAgIGRzLnpJbmRleCA9ICctMSc7XG4gICAgZHMudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgIGRzLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gIH1cbiAgYzJkLmZvbnQgPSBcIlwiLmNvbmNhdChmU3R5bGUsIFwiIFwiKS5jb25jYXQod2VpZ2h0LCBcIiBcIikuY29uY2F0KHNpemUsIFwicHggXCIpLmNvbmNhdChmYW1pbHkpO1xuICB2YXIgd2lkdGggPSAwO1xuICB2YXIgaGVpZ2h0ID0gMDtcbiAgdmFyIGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbGluZSA9IGxpbmVzW2ldO1xuICAgIHZhciBtZXRyaWNzID0gYzJkLm1lYXN1cmVUZXh0KGxpbmUpO1xuICAgIHZhciB3ID0gTWF0aC5jZWlsKG1ldHJpY3Mud2lkdGgpO1xuICAgIHZhciBoID0gc2l6ZTtcbiAgICB3aWR0aCA9IE1hdGgubWF4KHcsIHdpZHRoKTtcbiAgICBoZWlnaHQgKz0gaDtcbiAgfVxuICB3aWR0aCArPSBwYWRkaW5nO1xuICBoZWlnaHQgKz0gcGFkZGluZztcbiAgcmV0dXJuIGNhY2hlW2NhY2hlS2V5XSA9IHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn07XG5CUnAkOS5jYWxjdWxhdGVMYWJlbEFuZ2xlID0gZnVuY3Rpb24gKGVsZSwgcHJlZml4KSB7XG4gIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgdmFyIHJzID0gX3AucnNjcmF0Y2g7XG4gIHZhciBpc0VkZ2UgPSBlbGUuaXNFZGdlKCk7XG4gIHZhciBwcmVmaXhEYXNoID0gcHJlZml4ID8gcHJlZml4ICsgJy0nIDogJyc7XG4gIHZhciByb3QgPSBlbGUucHN0eWxlKHByZWZpeERhc2ggKyAndGV4dC1yb3RhdGlvbicpO1xuICB2YXIgcm90U3RyID0gcm90LnN0clZhbHVlO1xuICBpZiAocm90U3RyID09PSAnbm9uZScpIHtcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIGlmIChpc0VkZ2UgJiYgcm90U3RyID09PSAnYXV0b3JvdGF0ZScpIHtcbiAgICByZXR1cm4gcnMubGFiZWxBdXRvQW5nbGU7XG4gIH0gZWxzZSBpZiAocm90U3RyID09PSAnYXV0b3JvdGF0ZScpIHtcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcm90LnBmVmFsdWU7XG4gIH1cbn07XG5CUnAkOS5jYWxjdWxhdGVMYWJlbEFuZ2xlcyA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgaXNFZGdlID0gZWxlLmlzRWRnZSgpO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuICBycy5sYWJlbEFuZ2xlID0gci5jYWxjdWxhdGVMYWJlbEFuZ2xlKGVsZSk7XG4gIGlmIChpc0VkZ2UpIHtcbiAgICBycy5zb3VyY2VMYWJlbEFuZ2xlID0gci5jYWxjdWxhdGVMYWJlbEFuZ2xlKGVsZSwgJ3NvdXJjZScpO1xuICAgIHJzLnRhcmdldExhYmVsQW5nbGUgPSByLmNhbGN1bGF0ZUxhYmVsQW5nbGUoZWxlLCAndGFyZ2V0Jyk7XG4gIH1cbn07XG5cbnZhciBCUnAkOCA9IHt9O1xudmFyIFRPT19TTUFMTF9DVVRfUkVDVCA9IDI4O1xudmFyIHdhcm5lZEN1dFJlY3QgPSBmYWxzZTtcbkJScCQ4LmdldE5vZGVTaGFwZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIHNoYXBlID0gbm9kZS5wc3R5bGUoJ3NoYXBlJykudmFsdWU7XG4gIGlmIChzaGFwZSA9PT0gJ2N1dHJlY3RhbmdsZScgJiYgKG5vZGUud2lkdGgoKSA8IFRPT19TTUFMTF9DVVRfUkVDVCB8fCBub2RlLmhlaWdodCgpIDwgVE9PX1NNQUxMX0NVVF9SRUNUKSkge1xuICAgIGlmICghd2FybmVkQ3V0UmVjdCkge1xuICAgICAgd2FybignVGhlIGBjdXRyZWN0YW5nbGVgIG5vZGUgc2hhcGUgY2FuIG5vdCBiZSB1c2VkIGF0IHNtYWxsIHNpemVzIHNvIGByZWN0YW5nbGVgIGlzIHVzZWQgaW5zdGVhZCcpO1xuICAgICAgd2FybmVkQ3V0UmVjdCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiAncmVjdGFuZ2xlJztcbiAgfVxuICBpZiAobm9kZS5pc1BhcmVudCgpKSB7XG4gICAgaWYgKHNoYXBlID09PSAncmVjdGFuZ2xlJyB8fCBzaGFwZSA9PT0gJ3JvdW5kcmVjdGFuZ2xlJyB8fCBzaGFwZSA9PT0gJ3JvdW5kLXJlY3RhbmdsZScgfHwgc2hhcGUgPT09ICdjdXRyZWN0YW5nbGUnIHx8IHNoYXBlID09PSAnY3V0LXJlY3RhbmdsZScgfHwgc2hhcGUgPT09ICdiYXJyZWwnKSB7XG4gICAgICByZXR1cm4gc2hhcGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAncmVjdGFuZ2xlJztcbiAgICB9XG4gIH1cbiAgaWYgKHNoYXBlID09PSAncG9seWdvbicpIHtcbiAgICB2YXIgcG9pbnRzID0gbm9kZS5wc3R5bGUoJ3NoYXBlLXBvbHlnb24tcG9pbnRzJykudmFsdWU7XG4gICAgcmV0dXJuIHIubm9kZVNoYXBlcy5tYWtlUG9seWdvbihwb2ludHMpLm5hbWU7XG4gIH1cbiAgcmV0dXJuIHNoYXBlO1xufTtcblxudmFyIEJScCQ3ID0ge307XG5CUnAkNy5yZWdpc3RlckNhbGN1bGF0aW9uTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY3kgPSB0aGlzLmN5O1xuICB2YXIgZWxlc1RvVXBkYXRlID0gY3kuY29sbGVjdGlvbigpO1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBlbnF1ZXVlID0gZnVuY3Rpb24gZW5xdWV1ZShlbGVzKSB7XG4gICAgdmFyIGRpcnR5U3R5bGVDYWNoZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gICAgZWxlc1RvVXBkYXRlLm1lcmdlKGVsZXMpO1xuICAgIGlmIChkaXJ0eVN0eWxlQ2FjaGVzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICAgICAgdmFyIHJzdHlsZSA9IF9wLnJzdHlsZTtcbiAgICAgICAgcnN0eWxlLmNsZWFuID0gZmFsc2U7XG4gICAgICAgIHJzdHlsZS5jbGVhbkNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgci5iaW5kZXIoY3kpLm9uKCdib3VuZHMuKiBkaXJ0eS4qJywgZnVuY3Rpb24gb25EaXJ0eUJvdW5kcyhlKSB7XG4gICAgdmFyIGVsZSA9IGUudGFyZ2V0O1xuICAgIGVucXVldWUoZWxlKTtcbiAgfSkub24oJ3N0eWxlLiogYmFja2dyb3VuZC4qJywgZnVuY3Rpb24gb25EaXJ0eVN0eWxlKGUpIHtcbiAgICB2YXIgZWxlID0gZS50YXJnZXQ7XG4gICAgZW5xdWV1ZShlbGUsIGZhbHNlKTtcbiAgfSk7XG4gIHZhciB1cGRhdGVFbGVDYWxjcyA9IGZ1bmN0aW9uIHVwZGF0ZUVsZUNhbGNzKHdpbGxEcmF3KSB7XG4gICAgaWYgKHdpbGxEcmF3KSB7XG4gICAgICB2YXIgZm5zID0gci5vblVwZGF0ZUVsZUNhbGNzRm5zO1xuXG4gICAgICAvLyBiZWNhdXNlIHdlIG5lZWQgdG8gaGF2ZSB1cC10by1kYXRlIHN0eWxlIChlLmcuIHN0eWxlc2hlZXQgbWFwcGVycylcbiAgICAgIC8vIGJlZm9yZSBjYWxjdWxhdGluZyByZW5kZXJlZCBzdHlsZSAoYW5kIHBzdHlsZSBtaWdodCBub3QgYmUgY2FsbGVkIHlldClcbiAgICAgIGVsZXNUb1VwZGF0ZS5jbGVhblN0eWxlKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXNUb1VwZGF0ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlID0gZWxlc1RvVXBkYXRlW2ldO1xuICAgICAgICB2YXIgcnN0eWxlID0gZWxlLl9wcml2YXRlLnJzdHlsZTtcbiAgICAgICAgaWYgKGVsZS5pc05vZGUoKSAmJiAhcnN0eWxlLmNsZWFuQ29ubmVjdGVkKSB7XG4gICAgICAgICAgZW5xdWV1ZShlbGUuY29ubmVjdGVkRWRnZXMoKSk7XG4gICAgICAgICAgcnN0eWxlLmNsZWFuQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZucykge1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZm5zLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgIHZhciBmbiA9IGZuc1tfaV07XG4gICAgICAgICAgZm4od2lsbERyYXcsIGVsZXNUb1VwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHIucmVjYWxjdWxhdGVSZW5kZXJlZFN0eWxlKGVsZXNUb1VwZGF0ZSk7XG4gICAgICBlbGVzVG9VcGRhdGUgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgfVxuICB9O1xuICByLmZsdXNoUmVuZGVyZWRTdHlsZVF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgIHVwZGF0ZUVsZUNhbGNzKHRydWUpO1xuICB9O1xuICByLmJlZm9yZVJlbmRlcih1cGRhdGVFbGVDYWxjcywgci5iZWZvcmVSZW5kZXJQcmlvcml0aWVzLmVsZUNhbGNzKTtcbn07XG5CUnAkNy5vblVwZGF0ZUVsZUNhbGNzID0gZnVuY3Rpb24gKGZuKSB7XG4gIHZhciBmbnMgPSB0aGlzLm9uVXBkYXRlRWxlQ2FsY3NGbnMgPSB0aGlzLm9uVXBkYXRlRWxlQ2FsY3NGbnMgfHwgW107XG4gIGZucy5wdXNoKGZuKTtcbn07XG5CUnAkNy5yZWNhbGN1bGF0ZVJlbmRlcmVkU3R5bGUgPSBmdW5jdGlvbiAoZWxlcywgdXNlQ2FjaGUpIHtcbiAgdmFyIGlzQ2xlYW5Db25uZWN0ZWQgPSBmdW5jdGlvbiBpc0NsZWFuQ29ubmVjdGVkKGVsZSkge1xuICAgIHJldHVybiBlbGUuX3ByaXZhdGUucnN0eWxlLmNsZWFuQ29ubmVjdGVkO1xuICB9O1xuICB2YXIgZWRnZXMgPSBbXTtcbiAgdmFyIG5vZGVzID0gW107XG5cbiAgLy8gdGhlIHJlbmRlcmVyIGNhbid0IGJlIHVzZWQgZm9yIGNhbGNzIHdoZW4gZGVzdHJveWVkLCBlLmcuIGVsZS5ib3VuZGluZ0JveCgpXG4gIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHVzZSBjYWNoZSBieSBkZWZhdWx0IGZvciBwZXJmXG4gIGlmICh1c2VDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdXNlQ2FjaGUgPSB0cnVlO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHZhciBfcCA9IGVsZS5fcHJpdmF0ZTtcbiAgICB2YXIgcnN0eWxlID0gX3AucnN0eWxlO1xuXG4gICAgLy8gYW4gZWRnZSBtYXkgYmUgaW1wbGljaXRseSBkaXJ0eSBiL2Mgb2Ygb25lIG9mIGl0cyBjb25uZWN0ZWQgbm9kZXNcbiAgICAvLyAoYW5kIGEgcmVxdWVzdCBmb3IgcmVjYWxjIG1heSBjb21lIGluIGJldHdlZW4gZnJhbWVzKVxuICAgIGlmIChlbGUuaXNFZGdlKCkgJiYgKCFpc0NsZWFuQ29ubmVjdGVkKGVsZS5zb3VyY2UoKSkgfHwgIWlzQ2xlYW5Db25uZWN0ZWQoZWxlLnRhcmdldCgpKSkpIHtcbiAgICAgIHJzdHlsZS5jbGVhbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIG9ubHkgdXBkYXRlIGlmIGRpcnR5IGFuZCBpbiBncmFwaFxuICAgIGlmICh1c2VDYWNoZSAmJiByc3R5bGUuY2xlYW4gfHwgZWxlLnJlbW92ZWQoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gb25seSB1cGRhdGUgaWYgbm90IGRpc3BsYXk6IG5vbmVcbiAgICBpZiAoZWxlLnBzdHlsZSgnZGlzcGxheScpLnZhbHVlID09PSAnbm9uZScpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoX3AuZ3JvdXAgPT09ICdub2RlcycpIHtcbiAgICAgIG5vZGVzLnB1c2goZWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZWRnZXNcbiAgICAgIGVkZ2VzLnB1c2goZWxlKTtcbiAgICB9XG4gICAgcnN0eWxlLmNsZWFuID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIHVwZGF0ZSBub2RlIGRhdGEgZnJvbSBwcm9qZWN0aW9uc1xuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBub2Rlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIF9lbGUgPSBub2Rlc1tfaTJdO1xuICAgIHZhciBfcDIgPSBfZWxlLl9wcml2YXRlO1xuICAgIHZhciBfcnN0eWxlID0gX3AyLnJzdHlsZTtcbiAgICB2YXIgcG9zID0gX2VsZS5wb3NpdGlvbigpO1xuICAgIHRoaXMucmVjYWxjdWxhdGVOb2RlTGFiZWxQcm9qZWN0aW9uKF9lbGUpO1xuICAgIF9yc3R5bGUubm9kZVggPSBwb3MueDtcbiAgICBfcnN0eWxlLm5vZGVZID0gcG9zLnk7XG4gICAgX3JzdHlsZS5ub2RlVyA9IF9lbGUucHN0eWxlKCd3aWR0aCcpLnBmVmFsdWU7XG4gICAgX3JzdHlsZS5ub2RlSCA9IF9lbGUucHN0eWxlKCdoZWlnaHQnKS5wZlZhbHVlO1xuICB9XG4gIHRoaXMucmVjYWxjdWxhdGVFZGdlUHJvamVjdGlvbnMoZWRnZXMpO1xuXG4gIC8vIHVwZGF0ZSBlZGdlIGRhdGEgZnJvbSBwcm9qZWN0aW9uc1xuICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPCBlZGdlcy5sZW5ndGg7IF9pMysrKSB7XG4gICAgdmFyIF9lbGUyID0gZWRnZXNbX2kzXTtcbiAgICB2YXIgX3AzID0gX2VsZTIuX3ByaXZhdGU7XG4gICAgdmFyIF9yc3R5bGUyID0gX3AzLnJzdHlsZTtcbiAgICB2YXIgcnMgPSBfcDMucnNjcmF0Y2g7XG5cbiAgICAvLyB1cGRhdGUgcnN0eWxlIHBvc2l0aW9uc1xuICAgIF9yc3R5bGUyLnNyY1ggPSBycy5hcnJvd1N0YXJ0WDtcbiAgICBfcnN0eWxlMi5zcmNZID0gcnMuYXJyb3dTdGFydFk7XG4gICAgX3JzdHlsZTIudGd0WCA9IHJzLmFycm93RW5kWDtcbiAgICBfcnN0eWxlMi50Z3RZID0gcnMuYXJyb3dFbmRZO1xuICAgIF9yc3R5bGUyLm1pZFggPSBycy5taWRYO1xuICAgIF9yc3R5bGUyLm1pZFkgPSBycy5taWRZO1xuICAgIF9yc3R5bGUyLmxhYmVsQW5nbGUgPSBycy5sYWJlbEFuZ2xlO1xuICAgIF9yc3R5bGUyLnNvdXJjZUxhYmVsQW5nbGUgPSBycy5zb3VyY2VMYWJlbEFuZ2xlO1xuICAgIF9yc3R5bGUyLnRhcmdldExhYmVsQW5nbGUgPSBycy50YXJnZXRMYWJlbEFuZ2xlO1xuICB9XG59O1xuXG52YXIgQlJwJDYgPSB7fTtcbkJScCQ2LnVwZGF0ZUNhY2hlZEdyYWJiZWRFbGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZWxlcyA9IHRoaXMuY2FjaGVkWlNvcnRlZEVsZXM7XG4gIGlmICghZWxlcykge1xuICAgIC8vIGp1c3QgbGV0IHRoaXMgYmUgcmVjYWxjdWxhdGVkIG9uIHRoZSBuZXh0IHogc29ydCB0aWNrXG4gICAgcmV0dXJuO1xuICB9XG4gIGVsZXMuZHJhZyA9IFtdO1xuICBlbGVzLm5vbmRyYWcgPSBbXTtcbiAgdmFyIGdyYWJUYXJnZXRzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGUgPSBlbGVzW2ldO1xuICAgIHZhciBycyA9IGVsZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgICBpZiAoZWxlLmdyYWJiZWQoKSAmJiAhZWxlLmlzUGFyZW50KCkpIHtcbiAgICAgIGdyYWJUYXJnZXRzLnB1c2goZWxlKTtcbiAgICB9IGVsc2UgaWYgKHJzLmluRHJhZ0xheWVyKSB7XG4gICAgICBlbGVzLmRyYWcucHVzaChlbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVzLm5vbmRyYWcucHVzaChlbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHB1dCB0aGUgZ3JhYiB0YXJnZXQgbm9kZXMgbGFzdCBzbyBpdCdzIG9uIHRvcCBvZiBpdHMgbmVpZ2hib3VyaG9vZFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGdyYWJUYXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGdyYWJUYXJnZXRzW2ldO1xuICAgIGVsZXMuZHJhZy5wdXNoKGVsZSk7XG4gIH1cbn07XG5CUnAkNi5pbnZhbGlkYXRlQ2FjaGVkWlNvcnRlZEVsZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuY2FjaGVkWlNvcnRlZEVsZXMgPSBudWxsO1xufTtcbkJScCQ2LmdldENhY2hlZFpTb3J0ZWRFbGVzID0gZnVuY3Rpb24gKGZvcmNlUmVjYWxjKSB7XG4gIGlmIChmb3JjZVJlY2FsYyB8fCAhdGhpcy5jYWNoZWRaU29ydGVkRWxlcykge1xuICAgIHZhciBlbGVzID0gdGhpcy5jeS5tdXRhYmxlRWxlbWVudHMoKS50b0FycmF5KCk7XG4gICAgZWxlcy5zb3J0KHpJbmRleFNvcnQpO1xuICAgIGVsZXMuaW50ZXJhY3RpdmUgPSBlbGVzLmZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmludGVyYWN0aXZlKCk7XG4gICAgfSk7XG4gICAgdGhpcy5jYWNoZWRaU29ydGVkRWxlcyA9IGVsZXM7XG4gICAgdGhpcy51cGRhdGVDYWNoZWRHcmFiYmVkRWxlcygpO1xuICB9IGVsc2Uge1xuICAgIGVsZXMgPSB0aGlzLmNhY2hlZFpTb3J0ZWRFbGVzO1xuICB9XG4gIHJldHVybiBlbGVzO1xufTtcblxudmFyIEJScCQ1ID0ge307XG5bQlJwJGUsIEJScCRkLCBCUnAkYywgQlJwJGIsIEJScCRhLCBCUnAkOSwgQlJwJDgsIEJScCQ3LCBCUnAkNl0uZm9yRWFjaChmdW5jdGlvbiAocHJvcHMpIHtcbiAgZXh0ZW5kKEJScCQ1LCBwcm9wcyk7XG59KTtcblxudmFyIEJScCQ0ID0ge307XG5CUnAkNC5nZXRDYWNoZWRJbWFnZSA9IGZ1bmN0aW9uICh1cmwsIGNyb3NzT3JpZ2luLCBvbkxvYWQpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgaW1hZ2VDYWNoZSA9IHIuaW1hZ2VDYWNoZSA9IHIuaW1hZ2VDYWNoZSB8fCB7fTtcbiAgdmFyIGNhY2hlID0gaW1hZ2VDYWNoZVt1cmxdO1xuICBpZiAoY2FjaGUpIHtcbiAgICBpZiAoIWNhY2hlLmltYWdlLmNvbXBsZXRlKSB7XG4gICAgICBjYWNoZS5pbWFnZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlLmltYWdlO1xuICB9IGVsc2Uge1xuICAgIGNhY2hlID0gaW1hZ2VDYWNoZVt1cmxdID0gaW1hZ2VDYWNoZVt1cmxdIHx8IHt9O1xuICAgIHZhciBpbWFnZSA9IGNhY2hlLmltYWdlID0gbmV3IEltYWdlKCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcblxuICAgIGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpO1xuICAgIGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgaW1hZ2UuZXJyb3IgPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgLy8gIzE1ODIgc2FmYXJpIGRvZXNuJ3QgbG9hZCBkYXRhIHVyaXMgd2l0aCBjcm9zc09yaWdpbiBwcm9wZXJseVxuICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjM5NzhcbiAgICB2YXIgZGF0YVVyaVByZWZpeCA9ICdkYXRhOic7XG4gICAgdmFyIGlzRGF0YVVyaSA9IHVybC5zdWJzdHJpbmcoMCwgZGF0YVVyaVByZWZpeC5sZW5ndGgpLnRvTG93ZXJDYXNlKCkgPT09IGRhdGFVcmlQcmVmaXg7XG4gICAgaWYgKCFpc0RhdGFVcmkpIHtcbiAgICAgIC8vIGlmIGNyb3Nzb3JpZ2luIGlzICdudWxsJyhzdHJpbmdpZmllZCksIHRoZW4gbWFudWFsbHkgc2V0IGl0IHRvIG51bGwgXG4gICAgICBjcm9zc09yaWdpbiA9IGNyb3NzT3JpZ2luID09PSAnbnVsbCcgPyBudWxsIDogY3Jvc3NPcmlnaW47XG4gICAgICBpbWFnZS5jcm9zc09yaWdpbiA9IGNyb3NzT3JpZ2luOyAvLyBwcmV2ZW50IHRhaW50ZWQgY2FudmFzXG4gICAgfVxuXG4gICAgaW1hZ2Uuc3JjID0gdXJsO1xuICAgIHJldHVybiBpbWFnZTtcbiAgfVxufTtcblxudmFyIEJScCQzID0ge307XG5cbi8qIGdsb2JhbCBkb2N1bWVudCwgd2luZG93LCBSZXNpemVPYnNlcnZlciwgTXV0YXRpb25PYnNlcnZlciAqL1xuXG5CUnAkMy5yZWdpc3RlckJpbmRpbmcgPSBmdW5jdGlvbiAodGFyZ2V0LCBldmVudCwgaGFuZGxlciwgdXNlQ2FwdHVyZSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cywgWzFdKTsgLy8gY29weVxuICB2YXIgYiA9IHRoaXMuYmluZGVyKHRhcmdldCk7XG4gIHJldHVybiBiLm9uLmFwcGx5KGIsIGFyZ3MpO1xufTtcbkJScCQzLmJpbmRlciA9IGZ1bmN0aW9uICh0Z3QpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgY29udGFpbmVyV2luZG93ID0gci5jeS53aW5kb3coKTtcbiAgdmFyIHRndElzRG9tID0gdGd0ID09PSBjb250YWluZXJXaW5kb3cgfHwgdGd0ID09PSBjb250YWluZXJXaW5kb3cuZG9jdW1lbnQgfHwgdGd0ID09PSBjb250YWluZXJXaW5kb3cuZG9jdW1lbnQuYm9keSB8fCBkb21FbGVtZW50KHRndCk7XG4gIGlmIChyLnN1cHBvcnRzUGFzc2l2ZUV2ZW50cyA9PSBudWxsKSB7XG4gICAgLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vV0lDRy9FdmVudExpc3RlbmVyT3B0aW9ucy9ibG9iL2doLXBhZ2VzL2V4cGxhaW5lci5tZCNmZWF0dXJlLWRldGVjdGlvblxuICAgIHZhciBzdXBwb3J0c1Bhc3NpdmUgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgdmFyIG9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnRhaW5lcldpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBub3Qgc3VwcG9ydGVkXG4gICAgfVxuICAgIHIuc3VwcG9ydHNQYXNzaXZlRXZlbnRzID0gc3VwcG9ydHNQYXNzaXZlO1xuICB9XG4gIHZhciBvbiA9IGZ1bmN0aW9uIG9uKGV2ZW50LCBoYW5kbGVyLCB1c2VDYXB0dXJlKSB7XG4gICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIGlmICh0Z3RJc0RvbSAmJiByLnN1cHBvcnRzUGFzc2l2ZUV2ZW50cykge1xuICAgICAgLy8gcmVwbGFjZSB1c2VDYXB0dXJlIHcvIG9wdHMgb2JqXG4gICAgICBhcmdzWzJdID0ge1xuICAgICAgICBjYXB0dXJlOiB1c2VDYXB0dXJlICE9IG51bGwgPyB1c2VDYXB0dXJlIDogZmFsc2UsXG4gICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgICBvbmNlOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgci5iaW5kaW5ncy5wdXNoKHtcbiAgICAgIHRhcmdldDogdGd0LFxuICAgICAgYXJnczogYXJnc1xuICAgIH0pO1xuICAgICh0Z3QuYWRkRXZlbnRMaXN0ZW5lciB8fCB0Z3Qub24pLmFwcGx5KHRndCwgYXJncyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIHJldHVybiB7XG4gICAgb246IG9uLFxuICAgIGFkZEV2ZW50TGlzdGVuZXI6IG9uLFxuICAgIGFkZExpc3RlbmVyOiBvbixcbiAgICBiaW5kOiBvblxuICB9O1xufTtcbkJScCQzLm5vZGVJc0RyYWdnYWJsZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gIHJldHVybiBub2RlICYmIG5vZGUuaXNOb2RlKCkgJiYgIW5vZGUubG9ja2VkKCkgJiYgbm9kZS5ncmFiYmFibGUoKTtcbn07XG5CUnAkMy5ub2RlSXNHcmFiYmFibGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICByZXR1cm4gdGhpcy5ub2RlSXNEcmFnZ2FibGUobm9kZSkgJiYgbm9kZS5pbnRlcmFjdGl2ZSgpO1xufTtcbkJScCQzLmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGNvbnRhaW5lcldpbmRvdyA9IHIuY3kud2luZG93KCk7XG4gIHZhciBpc1NlbGVjdGVkID0gZnVuY3Rpb24gaXNTZWxlY3RlZChlbGUpIHtcbiAgICByZXR1cm4gZWxlLnNlbGVjdGVkKCk7XG4gIH07XG4gIHZhciB0cmlnZ2VyRXZlbnRzID0gZnVuY3Rpb24gdHJpZ2dlckV2ZW50cyh0YXJnZXQsIG5hbWVzLCBlLCBwb3NpdGlvbikge1xuICAgIGlmICh0YXJnZXQgPT0gbnVsbCkge1xuICAgICAgdGFyZ2V0ID0gci5jeTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgIHRhcmdldC5lbWl0KHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdHlwZTogbmFtZSxcbiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIHZhciBpc011bHRTZWxLZXlEb3duID0gZnVuY3Rpb24gaXNNdWx0U2VsS2V5RG93bihlKSB7XG4gICAgcmV0dXJuIGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IGUuY3RybEtleTsgLy8gbWF5YmUgZS5hbHRLZXlcbiAgfTtcblxuICB2YXIgYWxsb3dQYW5uaW5nUGFzc3Rocm91Z2ggPSBmdW5jdGlvbiBhbGxvd1Bhbm5pbmdQYXNzdGhyb3VnaChkb3duLCBkb3ducykge1xuICAgIHZhciBhbGxvd1Bhc3N0aHJvdWdoID0gdHJ1ZTtcbiAgICBpZiAoci5jeS5oYXNDb21wb3VuZE5vZGVzKCkgJiYgZG93biAmJiBkb3duLnBhbm5hYmxlKCkpIHtcbiAgICAgIC8vIGEgZ3JhYmJhYmxlIGNvbXBvdW5kIG5vZGUgYmVsb3cgdGhlIGVsZSA9PiBubyBwYXNzdGhyb3VnaCBwYW5uaW5nXG4gICAgICBmb3IgKHZhciBpID0gMDsgZG93bnMgJiYgaSA8IGRvd25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBkb3duID0gZG93bnNbaV07XG5cbiAgICAgICAgLy9pZiBhbnkgcGFyZW50IG5vZGUgaW4gZXZlbnQgaGllcmFyY2h5IGlzbid0IHBhbm5hYmxlLCByZWplY3QgcGFzc3Rocm91Z2hcbiAgICAgICAgaWYgKGRvd24uaXNOb2RlKCkgJiYgZG93bi5pc1BhcmVudCgpICYmICFkb3duLnBhbm5hYmxlKCkpIHtcbiAgICAgICAgICBhbGxvd1Bhc3N0aHJvdWdoID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYWxsb3dQYXNzdGhyb3VnaCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBhbGxvd1Bhc3N0aHJvdWdoO1xuICB9O1xuICB2YXIgc2V0R3JhYmJlZCA9IGZ1bmN0aW9uIHNldEdyYWJiZWQoZWxlKSB7XG4gICAgZWxlWzBdLl9wcml2YXRlLmdyYWJiZWQgPSB0cnVlO1xuICB9O1xuICB2YXIgc2V0RnJlZWQgPSBmdW5jdGlvbiBzZXRGcmVlZChlbGUpIHtcbiAgICBlbGVbMF0uX3ByaXZhdGUuZ3JhYmJlZCA9IGZhbHNlO1xuICB9O1xuICB2YXIgc2V0SW5EcmFnTGF5ZXIgPSBmdW5jdGlvbiBzZXRJbkRyYWdMYXllcihlbGUpIHtcbiAgICBlbGVbMF0uX3ByaXZhdGUucnNjcmF0Y2guaW5EcmFnTGF5ZXIgPSB0cnVlO1xuICB9O1xuICB2YXIgc2V0T3V0RHJhZ0xheWVyID0gZnVuY3Rpb24gc2V0T3V0RHJhZ0xheWVyKGVsZSkge1xuICAgIGVsZVswXS5fcHJpdmF0ZS5yc2NyYXRjaC5pbkRyYWdMYXllciA9IGZhbHNlO1xuICB9O1xuICB2YXIgc2V0R3JhYlRhcmdldCA9IGZ1bmN0aW9uIHNldEdyYWJUYXJnZXQoZWxlKSB7XG4gICAgZWxlWzBdLl9wcml2YXRlLnJzY3JhdGNoLmlzR3JhYlRhcmdldCA9IHRydWU7XG4gIH07XG4gIHZhciByZW1vdmVHcmFiVGFyZ2V0ID0gZnVuY3Rpb24gcmVtb3ZlR3JhYlRhcmdldChlbGUpIHtcbiAgICBlbGVbMF0uX3ByaXZhdGUucnNjcmF0Y2guaXNHcmFiVGFyZ2V0ID0gZmFsc2U7XG4gIH07XG4gIHZhciBhZGRUb0RyYWdMaXN0ID0gZnVuY3Rpb24gYWRkVG9EcmFnTGlzdChlbGUsIG9wdHMpIHtcbiAgICB2YXIgbGlzdCA9IG9wdHMuYWRkVG9MaXN0O1xuICAgIHZhciBsaXN0SGFzRWxlID0gbGlzdC5oYXMoZWxlKTtcbiAgICBpZiAoIWxpc3RIYXNFbGUgJiYgZWxlLmdyYWJiYWJsZSgpICYmICFlbGUubG9ja2VkKCkpIHtcbiAgICAgIGxpc3QubWVyZ2UoZWxlKTtcbiAgICAgIHNldEdyYWJiZWQoZWxlKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBjaGlsZCBub2RlcyBhbmQgaW5uZXIgZWRnZXNcbiAgLy8gb2YgYSBjb21wb3VuZCBub2RlIHRvIGJlIGRyYWdnZWQgYXMgd2VsbCBhcyB0aGUgZ3JhYmJlZCBhbmQgc2VsZWN0ZWQgbm9kZXNcbiAgdmFyIGFkZERlc2NlbmRhbnRzVG9EcmFnID0gZnVuY3Rpb24gYWRkRGVzY2VuZGFudHNUb0RyYWcobm9kZSwgb3B0cykge1xuICAgIGlmICghbm9kZS5jeSgpLmhhc0NvbXBvdW5kTm9kZXMoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob3B0cy5pbkRyYWdMYXllciA9PSBudWxsICYmIG9wdHMuYWRkVG9MaXN0ID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIG5vdGhpbmcgdG8gZG9cblxuICAgIHZhciBpbm5lck5vZGVzID0gbm9kZS5kZXNjZW5kYW50cygpO1xuICAgIGlmIChvcHRzLmluRHJhZ0xheWVyKSB7XG4gICAgICBpbm5lck5vZGVzLmZvckVhY2goc2V0SW5EcmFnTGF5ZXIpO1xuICAgICAgaW5uZXJOb2Rlcy5jb25uZWN0ZWRFZGdlcygpLmZvckVhY2goc2V0SW5EcmFnTGF5ZXIpO1xuICAgIH1cbiAgICBpZiAob3B0cy5hZGRUb0xpc3QpIHtcbiAgICAgIGFkZFRvRHJhZ0xpc3QoaW5uZXJOb2Rlcywgb3B0cyk7XG4gICAgfVxuICB9O1xuXG4gIC8vIGFkZHMgdGhlIGdpdmVuIG5vZGVzIGFuZCBpdHMgbmVpZ2hib3VyaG9vZCB0byB0aGUgZHJhZyBsYXllclxuICB2YXIgYWRkTm9kZXNUb0RyYWcgPSBmdW5jdGlvbiBhZGROb2Rlc1RvRHJhZyhub2Rlcywgb3B0cykge1xuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIHZhciBoYXNDb21wb3VuZE5vZGVzID0gbm9kZXMuY3koKS5oYXNDb21wb3VuZE5vZGVzKCk7XG4gICAgaWYgKG9wdHMuaW5EcmFnTGF5ZXIpIHtcbiAgICAgIG5vZGVzLmZvckVhY2goc2V0SW5EcmFnTGF5ZXIpO1xuICAgICAgbm9kZXMubmVpZ2hib3Job29kKCkuc3RkRmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgcmV0dXJuICFoYXNDb21wb3VuZE5vZGVzIHx8IGVsZS5pc0VkZ2UoKTtcbiAgICAgIH0pLmZvckVhY2goc2V0SW5EcmFnTGF5ZXIpO1xuICAgIH1cbiAgICBpZiAob3B0cy5hZGRUb0xpc3QpIHtcbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICBhZGRUb0RyYWdMaXN0KGVsZSwgb3B0cyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgYWRkRGVzY2VuZGFudHNUb0RyYWcobm9kZXMsIG9wdHMpOyAvLyBhbHdheXMgYWRkIHRvIGRyYWdcblxuICAgIC8vIGFsc28gYWRkIG5vZGVzIGFuZCBlZGdlcyByZWxhdGVkIHRvIHRoZSB0b3Btb3N0IGFuY2VzdG9yXG4gICAgdXBkYXRlQW5jZXN0b3JzSW5EcmFnTGF5ZXIobm9kZXMsIHtcbiAgICAgIGluRHJhZ0xheWVyOiBvcHRzLmluRHJhZ0xheWVyXG4gICAgfSk7XG4gICAgci51cGRhdGVDYWNoZWRHcmFiYmVkRWxlcygpO1xuICB9O1xuICB2YXIgYWRkTm9kZVRvRHJhZyA9IGFkZE5vZGVzVG9EcmFnO1xuICB2YXIgZnJlZURyYWdnZWRFbGVtZW50cyA9IGZ1bmN0aW9uIGZyZWVEcmFnZ2VkRWxlbWVudHMoZ3JhYmJlZEVsZXMpIHtcbiAgICBpZiAoIWdyYWJiZWRFbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8ganVzdCBnbyBvdmVyIGFsbCBlbGVtZW50cyByYXRoZXIgdGhhbiBkb2luZyBhIGJ1bmNoIG9mIChwb3NzaWJseSBleHBlbnNpdmUpIHRyYXZlcnNhbHNcbiAgICByLmdldENhY2hlZFpTb3J0ZWRFbGVzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICBzZXRGcmVlZChlbGUpO1xuICAgICAgc2V0T3V0RHJhZ0xheWVyKGVsZSk7XG4gICAgICByZW1vdmVHcmFiVGFyZ2V0KGVsZSk7XG4gICAgfSk7XG4gICAgci51cGRhdGVDYWNoZWRHcmFiYmVkRWxlcygpO1xuICB9O1xuXG4gIC8vIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggYW5jZXN0b3Igbm9kZXMgYW5kIGVkZ2VzIHNob3VsZCBnb1xuICAvLyB0byB0aGUgZHJhZyBsYXllciAob3Igc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBkcmFnIGxheWVyKS5cbiAgdmFyIHVwZGF0ZUFuY2VzdG9yc0luRHJhZ0xheWVyID0gZnVuY3Rpb24gdXBkYXRlQW5jZXN0b3JzSW5EcmFnTGF5ZXIobm9kZSwgb3B0cykge1xuICAgIGlmIChvcHRzLmluRHJhZ0xheWVyID09IG51bGwgJiYgb3B0cy5hZGRUb0xpc3QgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gbm90aGluZyB0byBkb1xuXG4gICAgaWYgKCFub2RlLmN5KCkuaGFzQ29tcG91bmROb2RlcygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZmluZCB0b3AtbGV2ZWwgcGFyZW50XG4gICAgdmFyIHBhcmVudCA9IG5vZGUuYW5jZXN0b3JzKCkub3JwaGFucygpO1xuXG4gICAgLy8gbm8gcGFyZW50IG5vZGU6IG5vIG5vZGVzIHRvIGFkZCB0byB0aGUgZHJhZyBsYXllclxuICAgIGlmIChwYXJlbnQuc2FtZShub2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbm9kZXMgPSBwYXJlbnQuZGVzY2VuZGFudHMoKS5zcGF3blNlbGYoKS5tZXJnZShwYXJlbnQpLnVubWVyZ2Uobm9kZSkudW5tZXJnZShub2RlLmRlc2NlbmRhbnRzKCkpO1xuICAgIHZhciBlZGdlcyA9IG5vZGVzLmNvbm5lY3RlZEVkZ2VzKCk7XG4gICAgaWYgKG9wdHMuaW5EcmFnTGF5ZXIpIHtcbiAgICAgIGVkZ2VzLmZvckVhY2goc2V0SW5EcmFnTGF5ZXIpO1xuICAgICAgbm9kZXMuZm9yRWFjaChzZXRJbkRyYWdMYXllcik7XG4gICAgfVxuICAgIGlmIChvcHRzLmFkZFRvTGlzdCkge1xuICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIGFkZFRvRHJhZ0xpc3QoZWxlLCBvcHRzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgdmFyIGJsdXJBY3RpdmVEb21FbGVtZW50ID0gZnVuY3Rpb24gYmx1ckFjdGl2ZURvbUVsZW1lbnQoKSB7XG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIgIT0gbnVsbCkge1xuICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgfVxuICB9O1xuICB2YXIgaGF2ZU11dGF0aW9uc0FwaSA9IHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAndW5kZWZpbmVkJztcbiAgdmFyIGhhdmVSZXNpemVPYnNlcnZlckFwaSA9IHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCc7XG5cbiAgLy8gd2F0Y2ggZm9yIHdoZW4gdGhlIGN5IGNvbnRhaW5lciBpcyByZW1vdmVkIGZyb20gdGhlIGRvbVxuICBpZiAoaGF2ZU11dGF0aW9uc0FwaSkge1xuICAgIHIucmVtb3ZlT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAobXV0bnMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXV0bnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG11dG4gPSBtdXRuc1tpXTtcbiAgICAgICAgdmFyIHJOb2RlcyA9IG11dG4ucmVtb3ZlZE5vZGVzO1xuICAgICAgICBpZiAock5vZGVzKSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByTm9kZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciByTm9kZSA9IHJOb2Rlc1tqXTtcbiAgICAgICAgICAgIGlmIChyTm9kZSA9PT0gci5jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgci5kZXN0cm95KCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChyLmNvbnRhaW5lci5wYXJlbnROb2RlKSB7XG4gICAgICByLnJlbW92ZU9ic2VydmVyLm9ic2VydmUoci5jb250YWluZXIucGFyZW50Tm9kZSwge1xuICAgICAgICBjaGlsZExpc3Q6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ0RPTU5vZGVSZW1vdmVkJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHIuZGVzdHJveSgpO1xuICAgIH0pO1xuICB9XG4gIHZhciBvblJlc2l6ZSA9IGRlYm91bmNlXzEoZnVuY3Rpb24gKCkge1xuICAgIHIuY3kucmVzaXplKCk7XG4gIH0sIDEwMCk7XG4gIGlmIChoYXZlTXV0YXRpb25zQXBpKSB7XG4gICAgci5zdHlsZU9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIob25SZXNpemUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgICByLnN0eWxlT2JzZXJ2ZXIub2JzZXJ2ZShyLmNvbnRhaW5lciwge1xuICAgICAgYXR0cmlidXRlczogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgLy8gYXV0byByZXNpemVcbiAgci5yZWdpc3RlckJpbmRpbmcoY29udGFpbmVyV2luZG93LCAncmVzaXplJywgb25SZXNpemUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgaWYgKGhhdmVSZXNpemVPYnNlcnZlckFwaSkge1xuICAgIHIucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIob25SZXNpemUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgICByLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoci5jb250YWluZXIpO1xuICB9XG4gIHZhciBmb3JFYWNoVXAgPSBmdW5jdGlvbiBmb3JFYWNoVXAoZG9tRWxlLCBmbikge1xuICAgIHdoaWxlIChkb21FbGUgIT0gbnVsbCkge1xuICAgICAgZm4oZG9tRWxlKTtcbiAgICAgIGRvbUVsZSA9IGRvbUVsZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgfTtcbiAgdmFyIGludmFsaWRhdGVDb29yZHMgPSBmdW5jdGlvbiBpbnZhbGlkYXRlQ29vcmRzKCkge1xuICAgIHIuaW52YWxpZGF0ZUNvbnRhaW5lckNsaWVudENvb3Jkc0NhY2hlKCk7XG4gIH07XG4gIGZvckVhY2hVcChyLmNvbnRhaW5lciwgZnVuY3Rpb24gKGRvbUVsZSkge1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKGRvbUVsZSwgJ3RyYW5zaXRpb25lbmQnLCBpbnZhbGlkYXRlQ29vcmRzKTtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhkb21FbGUsICdhbmltYXRpb25lbmQnLCBpbnZhbGlkYXRlQ29vcmRzKTtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhkb21FbGUsICdzY3JvbGwnLCBpbnZhbGlkYXRlQ29vcmRzKTtcbiAgfSk7XG5cbiAgLy8gc3RvcCByaWdodCBjbGljayBtZW51IGZyb20gYXBwZWFyaW5nIG9uIGN5XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnY29udGV4dG1lbnUnLCBmdW5jdGlvbiAoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG4gIHZhciBpbkJveFNlbGVjdGlvbiA9IGZ1bmN0aW9uIGluQm94U2VsZWN0aW9uKCkge1xuICAgIHJldHVybiByLnNlbGVjdGlvbls0XSAhPT0gMDtcbiAgfTtcbiAgdmFyIGV2ZW50SW5Db250YWluZXIgPSBmdW5jdGlvbiBldmVudEluQ29udGFpbmVyKGUpIHtcbiAgICAvLyBzYXZlIGN5Y2xlcyBpZiBtb3VzZSBldmVudHMgYXJlbid0IHRvIGJlIGNhcHR1cmVkXG4gICAgdmFyIGNvbnRhaW5lclBhZ2VDb29yZHMgPSByLmZpbmRDb250YWluZXJDbGllbnRDb29yZHMoKTtcbiAgICB2YXIgeCA9IGNvbnRhaW5lclBhZ2VDb29yZHNbMF07XG4gICAgdmFyIHkgPSBjb250YWluZXJQYWdlQ29vcmRzWzFdO1xuICAgIHZhciB3aWR0aCA9IGNvbnRhaW5lclBhZ2VDb29yZHNbMl07XG4gICAgdmFyIGhlaWdodCA9IGNvbnRhaW5lclBhZ2VDb29yZHNbM107XG4gICAgdmFyIHBvc2l0aW9ucyA9IGUudG91Y2hlcyA/IGUudG91Y2hlcyA6IFtlXTtcbiAgICB2YXIgYXRMZWFzdE9uZVBvc0luc2lkZSA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcCA9IHBvc2l0aW9uc1tpXTtcbiAgICAgIGlmICh4IDw9IHAuY2xpZW50WCAmJiBwLmNsaWVudFggPD0geCArIHdpZHRoICYmIHkgPD0gcC5jbGllbnRZICYmIHAuY2xpZW50WSA8PSB5ICsgaGVpZ2h0KSB7XG4gICAgICAgIGF0TGVhc3RPbmVQb3NJbnNpZGUgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFhdExlYXN0T25lUG9zSW5zaWRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBjb250YWluZXIgPSByLmNvbnRhaW5lcjtcbiAgICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgdmFyIHRQYXJlbnQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICB2YXIgY29udGFpbmVySXNUYXJnZXQgPSBmYWxzZTtcbiAgICB3aGlsZSAodFBhcmVudCkge1xuICAgICAgaWYgKHRQYXJlbnQgPT09IGNvbnRhaW5lcikge1xuICAgICAgICBjb250YWluZXJJc1RhcmdldCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdFBhcmVudCA9IHRQYXJlbnQucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgaWYgKCFjb250YWluZXJJc1RhcmdldCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gaWYgdGFyZ2V0IGlzIG91dGlzZGUgY3kgY29udGFpbmVyLCB0aGVuIHRoaXMgZXZlbnQgaXMgbm90IGZvciB1c1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLy8gUHJpbWFyeSBrZXlcbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdtb3VzZWRvd24nLCBmdW5jdGlvbiBtb3VzZWRvd25IYW5kbGVyKGUpIHtcbiAgICBpZiAoIWV2ZW50SW5Db250YWluZXIoZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGJsdXJBY3RpdmVEb21FbGVtZW50KCk7XG4gICAgci5ob3ZlckRhdGEuY2FwdHVyZSA9IHRydWU7XG4gICAgci5ob3ZlckRhdGEud2hpY2ggPSBlLndoaWNoO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIGdwb3MgPSBbZS5jbGllbnRYLCBlLmNsaWVudFldO1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZ3Bvc1swXSwgZ3Bvc1sxXSk7XG4gICAgdmFyIHNlbGVjdCA9IHIuc2VsZWN0aW9uO1xuICAgIHZhciBuZWFycyA9IHIuZmluZE5lYXJlc3RFbGVtZW50cyhwb3NbMF0sIHBvc1sxXSwgdHJ1ZSwgZmFsc2UpO1xuICAgIHZhciBuZWFyID0gbmVhcnNbMF07XG4gICAgdmFyIGRyYWdnZWRFbGVtZW50cyA9IHIuZHJhZ0RhdGEucG9zc2libGVEcmFnRWxlbWVudHM7XG4gICAgci5ob3ZlckRhdGEubWRvd25Qb3MgPSBwb3M7XG4gICAgci5ob3ZlckRhdGEubWRvd25HUG9zID0gZ3BvcztcbiAgICB2YXIgY2hlY2tGb3JUYXBob2xkID0gZnVuY3Rpb24gY2hlY2tGb3JUYXBob2xkKCkge1xuICAgICAgci5ob3ZlckRhdGEudGFwaG9sZENhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgY2xlYXJUaW1lb3V0KHIuaG92ZXJEYXRhLnRhcGhvbGRUaW1lb3V0KTtcbiAgICAgIHIuaG92ZXJEYXRhLnRhcGhvbGRUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChyLmhvdmVyRGF0YS50YXBob2xkQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBlbGUgPSByLmhvdmVyRGF0YS5kb3duO1xuICAgICAgICAgIGlmIChlbGUpIHtcbiAgICAgICAgICAgIGVsZS5lbWl0KHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgICAgdHlwZTogJ3RhcGhvbGQnLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN5LmVtaXQoe1xuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICB0eXBlOiAndGFwaG9sZCcsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIHIudGFwaG9sZER1cmF0aW9uKTtcbiAgICB9O1xuXG4gICAgLy8gUmlnaHQgY2xpY2sgYnV0dG9uXG4gICAgaWYgKGUud2hpY2ggPT0gMykge1xuICAgICAgci5ob3ZlckRhdGEuY3h0U3RhcnRlZCA9IHRydWU7XG4gICAgICB2YXIgY3h0RXZ0ID0ge1xuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0eXBlOiAnY3h0dGFwc3RhcnQnLFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChuZWFyKSB7XG4gICAgICAgIG5lYXIuYWN0aXZhdGUoKTtcbiAgICAgICAgbmVhci5lbWl0KGN4dEV2dCk7XG4gICAgICAgIHIuaG92ZXJEYXRhLmRvd24gPSBuZWFyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3kuZW1pdChjeHRFdnQpO1xuICAgICAgfVxuICAgICAgci5ob3ZlckRhdGEuZG93blRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgIHIuaG92ZXJEYXRhLmN4dERyYWdnZWQgPSBmYWxzZTtcblxuICAgICAgLy8gUHJpbWFyeSBidXR0b25cbiAgICB9IGVsc2UgaWYgKGUud2hpY2ggPT0gMSkge1xuICAgICAgaWYgKG5lYXIpIHtcbiAgICAgICAgbmVhci5hY3RpdmF0ZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbGVtZW50IGRyYWdnaW5nXG4gICAgICB7XG4gICAgICAgIC8vIElmIHNvbWV0aGluZyBpcyB1bmRlciB0aGUgY3Vyc29yIGFuZCBpdCBpcyBkcmFnZ2FibGUsIHByZXBhcmUgdG8gZ3JhYiBpdFxuICAgICAgICBpZiAobmVhciAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHIubm9kZUlzR3JhYmJhYmxlKG5lYXIpKSB7XG4gICAgICAgICAgICB2YXIgbWFrZUV2ZW50ID0gZnVuY3Rpb24gbWFrZUV2ZW50KHR5cGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgdHJpZ2dlckdyYWIgPSBmdW5jdGlvbiB0cmlnZ2VyR3JhYihlbGUpIHtcbiAgICAgICAgICAgICAgZWxlLmVtaXQobWFrZUV2ZW50KCdncmFiJykpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNldEdyYWJUYXJnZXQobmVhcik7XG4gICAgICAgICAgICBpZiAoIW5lYXIuc2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMgPSByLmRyYWdEYXRhLnBvc3NpYmxlRHJhZ0VsZW1lbnRzID0gY3kuY29sbGVjdGlvbigpO1xuICAgICAgICAgICAgICBhZGROb2RlVG9EcmFnKG5lYXIsIHtcbiAgICAgICAgICAgICAgICBhZGRUb0xpc3Q6IGRyYWdnZWRFbGVtZW50c1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgbmVhci5lbWl0KG1ha2VFdmVudCgnZ3JhYm9uJykpLmVtaXQobWFrZUV2ZW50KCdncmFiJykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZHJhZ2dlZEVsZW1lbnRzID0gci5kcmFnRGF0YS5wb3NzaWJsZURyYWdFbGVtZW50cyA9IGN5LmNvbGxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkTm9kZXMgPSBjeS4kKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlLmlzTm9kZSgpICYmIGVsZS5zZWxlY3RlZCgpICYmIHIubm9kZUlzR3JhYmJhYmxlKGVsZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBhZGROb2Rlc1RvRHJhZyhzZWxlY3RlZE5vZGVzLCB7XG4gICAgICAgICAgICAgICAgYWRkVG9MaXN0OiBkcmFnZ2VkRWxlbWVudHNcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIG5lYXIuZW1pdChtYWtlRXZlbnQoJ2dyYWJvbicpKTtcbiAgICAgICAgICAgICAgc2VsZWN0ZWROb2Rlcy5mb3JFYWNoKHRyaWdnZXJHcmFiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHIuaG92ZXJEYXRhLmRvd24gPSBuZWFyO1xuICAgICAgICByLmhvdmVyRGF0YS5kb3ducyA9IG5lYXJzO1xuICAgICAgICByLmhvdmVyRGF0YS5kb3duVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50cyhuZWFyLCBbJ21vdXNlZG93bicsICd0YXBzdGFydCcsICd2bW91c2Vkb3duJ10sIGUsIHtcbiAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICB5OiBwb3NbMV1cbiAgICAgIH0pO1xuICAgICAgaWYgKG5lYXIgPT0gbnVsbCkge1xuICAgICAgICBzZWxlY3RbNF0gPSAxO1xuICAgICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB7XG4gICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICB9O1xuICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICByLnJlZHJhdygpO1xuICAgICAgfSBlbHNlIGlmIChuZWFyLnBhbm5hYmxlKCkpIHtcbiAgICAgICAgc2VsZWN0WzRdID0gMTsgLy8gZm9yIGZ1dHVyZSBwYW5cbiAgICAgIH1cblxuICAgICAgY2hlY2tGb3JUYXBob2xkKCk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBzZWxlY3Rpb24gYm94IGNvb3JkaW5hdGVzXG4gICAgc2VsZWN0WzBdID0gc2VsZWN0WzJdID0gcG9zWzBdO1xuICAgIHNlbGVjdFsxXSA9IHNlbGVjdFszXSA9IHBvc1sxXTtcbiAgfSwgZmFsc2UpO1xuICByLnJlZ2lzdGVyQmluZGluZyhjb250YWluZXJXaW5kb3csICdtb3VzZW1vdmUnLCBmdW5jdGlvbiBtb3VzZW1vdmVIYW5kbGVyKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgdmFyIGNhcHR1cmUgPSByLmhvdmVyRGF0YS5jYXB0dXJlO1xuICAgIGlmICghY2FwdHVyZSAmJiAhZXZlbnRJbkNvbnRhaW5lcihlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICB2YXIgY3kgPSByLmN5O1xuICAgIHZhciB6b29tID0gY3kuem9vbSgpO1xuICAgIHZhciBncG9zID0gW2UuY2xpZW50WCwgZS5jbGllbnRZXTtcbiAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGdwb3NbMF0sIGdwb3NbMV0pO1xuICAgIHZhciBtZG93blBvcyA9IHIuaG92ZXJEYXRhLm1kb3duUG9zO1xuICAgIHZhciBtZG93bkdQb3MgPSByLmhvdmVyRGF0YS5tZG93bkdQb3M7XG4gICAgdmFyIHNlbGVjdCA9IHIuc2VsZWN0aW9uO1xuICAgIHZhciBuZWFyID0gbnVsbDtcbiAgICBpZiAoIXIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyAmJiAhci5ob3ZlckRhdGEuZHJhZ2dpbmcgJiYgIXIuaG92ZXJEYXRhLnNlbGVjdGluZykge1xuICAgICAgbmVhciA9IHIuZmluZE5lYXJlc3RFbGVtZW50KHBvc1swXSwgcG9zWzFdLCB0cnVlLCBmYWxzZSk7XG4gICAgfVxuICAgIHZhciBsYXN0ID0gci5ob3ZlckRhdGEubGFzdDtcbiAgICB2YXIgZG93biA9IHIuaG92ZXJEYXRhLmRvd247XG4gICAgdmFyIGRpc3AgPSBbcG9zWzBdIC0gc2VsZWN0WzJdLCBwb3NbMV0gLSBzZWxlY3RbM11dO1xuICAgIHZhciBkcmFnZ2VkRWxlbWVudHMgPSByLmRyYWdEYXRhLnBvc3NpYmxlRHJhZ0VsZW1lbnRzO1xuICAgIHZhciBpc092ZXJUaHJlc2hvbGREcmFnO1xuICAgIGlmIChtZG93bkdQb3MpIHtcbiAgICAgIHZhciBkeCA9IGdwb3NbMF0gLSBtZG93bkdQb3NbMF07XG4gICAgICB2YXIgZHgyID0gZHggKiBkeDtcbiAgICAgIHZhciBkeSA9IGdwb3NbMV0gLSBtZG93bkdQb3NbMV07XG4gICAgICB2YXIgZHkyID0gZHkgKiBkeTtcbiAgICAgIHZhciBkaXN0MiA9IGR4MiArIGR5MjtcbiAgICAgIHIuaG92ZXJEYXRhLmlzT3ZlclRocmVzaG9sZERyYWcgPSBpc092ZXJUaHJlc2hvbGREcmFnID0gZGlzdDIgPj0gci5kZXNrdG9wVGFwVGhyZXNob2xkMjtcbiAgICB9XG4gICAgdmFyIG11bHRTZWxLZXlEb3duID0gaXNNdWx0U2VsS2V5RG93bihlKTtcbiAgICBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgci5ob3ZlckRhdGEudGFwaG9sZENhbmNlbGxlZCA9IHRydWU7XG4gICAgfVxuICAgIHZhciB1cGRhdGVEcmFnRGVsdGEgPSBmdW5jdGlvbiB1cGRhdGVEcmFnRGVsdGEoKSB7XG4gICAgICB2YXIgZHJhZ0RlbHRhID0gci5ob3ZlckRhdGEuZHJhZ0RlbHRhID0gci5ob3ZlckRhdGEuZHJhZ0RlbHRhIHx8IFtdO1xuICAgICAgaWYgKGRyYWdEZWx0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZHJhZ0RlbHRhLnB1c2goZGlzcFswXSk7XG4gICAgICAgIGRyYWdEZWx0YS5wdXNoKGRpc3BbMV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJhZ0RlbHRhWzBdICs9IGRpc3BbMF07XG4gICAgICAgIGRyYWdEZWx0YVsxXSArPSBkaXNwWzFdO1xuICAgICAgfVxuICAgIH07XG4gICAgcHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgIHRyaWdnZXJFdmVudHMobmVhciwgWydtb3VzZW1vdmUnLCAndm1vdXNlbW92ZScsICd0YXBkcmFnJ10sIGUsIHtcbiAgICAgIHg6IHBvc1swXSxcbiAgICAgIHk6IHBvc1sxXVxuICAgIH0pO1xuICAgIHZhciBnb0ludG9Cb3hNb2RlID0gZnVuY3Rpb24gZ29JbnRvQm94TW9kZSgpIHtcbiAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIGlmICghci5ob3ZlckRhdGEuc2VsZWN0aW5nKSB7XG4gICAgICAgIGN5LmVtaXQoe1xuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgdHlwZTogJ2JveHN0YXJ0JyxcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHNlbGVjdFs0XSA9IDE7XG4gICAgICByLmhvdmVyRGF0YS5zZWxlY3RpbmcgPSB0cnVlO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIHIucmVkcmF3KCk7XG4gICAgfTtcblxuICAgIC8vIHRyaWdnZXIgY29udGV4dCBkcmFnIGlmIHJtb3VzZSBkb3duXG4gICAgaWYgKHIuaG92ZXJEYXRhLndoaWNoID09PSAzKSB7XG4gICAgICAvLyBidXQgb25seSBpZiBvdmVyIHRocmVzaG9sZFxuICAgICAgaWYgKGlzT3ZlclRocmVzaG9sZERyYWcpIHtcbiAgICAgICAgdmFyIGN4dEV2dCA9IHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHR5cGU6ICdjeHRkcmFnJyxcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoZG93bikge1xuICAgICAgICAgIGRvd24uZW1pdChjeHRFdnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN5LmVtaXQoY3h0RXZ0KTtcbiAgICAgICAgfVxuICAgICAgICByLmhvdmVyRGF0YS5jeHREcmFnZ2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFyLmhvdmVyRGF0YS5jeHRPdmVyIHx8IG5lYXIgIT09IHIuaG92ZXJEYXRhLmN4dE92ZXIpIHtcbiAgICAgICAgICBpZiAoci5ob3ZlckRhdGEuY3h0T3Zlcikge1xuICAgICAgICAgICAgci5ob3ZlckRhdGEuY3h0T3Zlci5lbWl0KHtcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgICAgdHlwZTogJ2N4dGRyYWdvdXQnLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHIuaG92ZXJEYXRhLmN4dE92ZXIgPSBuZWFyO1xuICAgICAgICAgIGlmIChuZWFyKSB7XG4gICAgICAgICAgICBuZWFyLmVtaXQoe1xuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICB0eXBlOiAnY3h0ZHJhZ292ZXInLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSBkcmFnIHBhbm5pbmcgdGhlIGVudGlyZSBncmFwaFxuICAgIH0gZWxzZSBpZiAoci5ob3ZlckRhdGEuZHJhZ2dpbmcpIHtcbiAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgIGlmIChjeS5wYW5uaW5nRW5hYmxlZCgpICYmIGN5LnVzZXJQYW5uaW5nRW5hYmxlZCgpKSB7XG4gICAgICAgIHZhciBkZWx0YVA7XG4gICAgICAgIGlmIChyLmhvdmVyRGF0YS5qdXN0U3RhcnRlZFBhbikge1xuICAgICAgICAgIHZhciBtZFBvcyA9IHIuaG92ZXJEYXRhLm1kb3duUG9zO1xuICAgICAgICAgIGRlbHRhUCA9IHtcbiAgICAgICAgICAgIHg6IChwb3NbMF0gLSBtZFBvc1swXSkgKiB6b29tLFxuICAgICAgICAgICAgeTogKHBvc1sxXSAtIG1kUG9zWzFdKSAqIHpvb21cbiAgICAgICAgICB9O1xuICAgICAgICAgIHIuaG92ZXJEYXRhLmp1c3RTdGFydGVkUGFuID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsdGFQID0ge1xuICAgICAgICAgICAgeDogZGlzcFswXSAqIHpvb20sXG4gICAgICAgICAgICB5OiBkaXNwWzFdICogem9vbVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY3kucGFuQnkoZGVsdGFQKTtcbiAgICAgICAgY3kuZW1pdCgnZHJhZ3BhbicpO1xuICAgICAgICByLmhvdmVyRGF0YS5kcmFnZ2VkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gTmVlZHMgcmVwcm9qZWN0IGR1ZSB0byBwYW4gY2hhbmdpbmcgdmlld3BvcnRcbiAgICAgIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG5cbiAgICAgIC8vIENoZWNrcyBwcmltYXJ5IGJ1dHRvbiBkb3duICYgb3V0IG9mIHRpbWUgJiBtb3VzZSBub3QgbW92ZWQgbXVjaFxuICAgIH0gZWxzZSBpZiAoc2VsZWN0WzRdID09IDEgJiYgKGRvd24gPT0gbnVsbCB8fCBkb3duLnBhbm5hYmxlKCkpKSB7XG4gICAgICBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgICBpZiAoIXIuaG92ZXJEYXRhLmRyYWdnaW5nICYmIGN5LmJveFNlbGVjdGlvbkVuYWJsZWQoKSAmJiAobXVsdFNlbEtleURvd24gfHwgIWN5LnBhbm5pbmdFbmFibGVkKCkgfHwgIWN5LnVzZXJQYW5uaW5nRW5hYmxlZCgpKSkge1xuICAgICAgICAgIGdvSW50b0JveE1vZGUoKTtcbiAgICAgICAgfSBlbHNlIGlmICghci5ob3ZlckRhdGEuc2VsZWN0aW5nICYmIGN5LnBhbm5pbmdFbmFibGVkKCkgJiYgY3kudXNlclBhbm5pbmdFbmFibGVkKCkpIHtcbiAgICAgICAgICB2YXIgYWxsb3dQYXNzdGhyb3VnaCA9IGFsbG93UGFubmluZ1Bhc3N0aHJvdWdoKGRvd24sIHIuaG92ZXJEYXRhLmRvd25zKTtcbiAgICAgICAgICBpZiAoYWxsb3dQYXNzdGhyb3VnaCkge1xuICAgICAgICAgICAgci5ob3ZlckRhdGEuZHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgci5ob3ZlckRhdGEuanVzdFN0YXJ0ZWRQYW4gPSB0cnVlO1xuICAgICAgICAgICAgc2VsZWN0WzRdID0gMDtcbiAgICAgICAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IGFycmF5MnBvaW50KG1kb3duUG9zKTtcbiAgICAgICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgICAgICByLnJlZHJhdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZG93biAmJiBkb3duLnBhbm5hYmxlKCkgJiYgZG93bi5hY3RpdmUoKSkge1xuICAgICAgICAgIGRvd24udW5hY3RpdmF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkb3duICYmIGRvd24ucGFubmFibGUoKSAmJiBkb3duLmFjdGl2ZSgpKSB7XG4gICAgICAgIGRvd24udW5hY3RpdmF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKCghZG93biB8fCAhZG93bi5ncmFiYmVkKCkpICYmIG5lYXIgIT0gbGFzdCkge1xuICAgICAgICBpZiAobGFzdCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudHMobGFzdCwgWydtb3VzZW91dCcsICd0YXBkcmFnb3V0J10sIGUsIHtcbiAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZWFyKSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50cyhuZWFyLCBbJ21vdXNlb3ZlcicsICd0YXBkcmFnb3ZlciddLCBlLCB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByLmhvdmVyRGF0YS5sYXN0ID0gbmVhcjtcbiAgICAgIH1cbiAgICAgIGlmIChkb3duKSB7XG4gICAgICAgIGlmIChpc092ZXJUaHJlc2hvbGREcmFnKSB7XG4gICAgICAgICAgLy8gdGhlbiB3ZSBjYW4gdGFrZSBhY3Rpb25cblxuICAgICAgICAgIGlmIChjeS5ib3hTZWxlY3Rpb25FbmFibGVkKCkgJiYgbXVsdFNlbEtleURvd24pIHtcbiAgICAgICAgICAgIC8vIHRoZW4gc2VsZWN0aW9uIG92ZXJyaWRlc1xuICAgICAgICAgICAgaWYgKGRvd24gJiYgZG93bi5ncmFiYmVkKCkpIHtcbiAgICAgICAgICAgICAgZnJlZURyYWdnZWRFbGVtZW50cyhkcmFnZ2VkRWxlbWVudHMpO1xuICAgICAgICAgICAgICBkb3duLmVtaXQoJ2ZyZWVvbicpO1xuICAgICAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMuZW1pdCgnZnJlZScpO1xuICAgICAgICAgICAgICBpZiAoci5kcmFnRGF0YS5kaWREcmFnKSB7XG4gICAgICAgICAgICAgICAgZG93bi5lbWl0KCdkcmFnZnJlZW9uJyk7XG4gICAgICAgICAgICAgICAgZHJhZ2dlZEVsZW1lbnRzLmVtaXQoJ2RyYWdmcmVlJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdvSW50b0JveE1vZGUoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGRvd24gJiYgZG93bi5ncmFiYmVkKCkgJiYgci5ub2RlSXNEcmFnZ2FibGUoZG93bikpIHtcbiAgICAgICAgICAgIC8vIGRyYWcgbm9kZVxuICAgICAgICAgICAgdmFyIGp1c3RTdGFydGVkRHJhZyA9ICFyLmRyYWdEYXRhLmRpZERyYWc7XG4gICAgICAgICAgICBpZiAoanVzdFN0YXJ0ZWREcmFnKSB7XG4gICAgICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgci5kcmFnRGF0YS5kaWREcmFnID0gdHJ1ZTsgLy8gaW5kaWNhdGUgdGhhdCB3ZSBhY3R1YWxseSBkaWQgZHJhZyB0aGUgbm9kZVxuXG4gICAgICAgICAgICAvLyBub3csIGFkZCB0aGUgZWxlbWVudHMgdG8gdGhlIGRyYWcgbGF5ZXIgaWYgbm90IGRvbmUgYWxyZWFkeVxuICAgICAgICAgICAgaWYgKCFyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMpIHtcbiAgICAgICAgICAgICAgYWRkTm9kZXNUb0RyYWcoZHJhZ2dlZEVsZW1lbnRzLCB7XG4gICAgICAgICAgICAgICAgaW5EcmFnTGF5ZXI6IHRydWVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdG90YWxTaGlmdCA9IHtcbiAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgeTogMFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChudW1iZXIkMShkaXNwWzBdKSAmJiBudW1iZXIkMShkaXNwWzFdKSkge1xuICAgICAgICAgICAgICB0b3RhbFNoaWZ0LnggKz0gZGlzcFswXTtcbiAgICAgICAgICAgICAgdG90YWxTaGlmdC55ICs9IGRpc3BbMV07XG4gICAgICAgICAgICAgIGlmIChqdXN0U3RhcnRlZERyYWcpIHtcbiAgICAgICAgICAgICAgICB2YXIgZHJhZ0RlbHRhID0gci5ob3ZlckRhdGEuZHJhZ0RlbHRhO1xuICAgICAgICAgICAgICAgIGlmIChkcmFnRGVsdGEgJiYgbnVtYmVyJDEoZHJhZ0RlbHRhWzBdKSAmJiBudW1iZXIkMShkcmFnRGVsdGFbMV0pKSB7XG4gICAgICAgICAgICAgICAgICB0b3RhbFNoaWZ0LnggKz0gZHJhZ0RlbHRhWzBdO1xuICAgICAgICAgICAgICAgICAgdG90YWxTaGlmdC55ICs9IGRyYWdEZWx0YVsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyA9IHRydWU7XG4gICAgICAgICAgICBkcmFnZ2VkRWxlbWVudHMuc2lsZW50U2hpZnQodG90YWxTaGlmdCkuZW1pdCgncG9zaXRpb24gZHJhZycpO1xuICAgICAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgICAgICByLnJlZHJhdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBvdGhlcndpc2Ugc2F2ZSBkcmFnIGRlbHRhIGZvciB3aGVuIHdlIGFjdHVhbGx5IHN0YXJ0IGRyYWdnaW5nIHNvIHRoZSByZWxhdGl2ZSBncmFiIHBvcyBpcyBjb25zdGFudFxuICAgICAgICAgIHVwZGF0ZURyYWdEZWx0YSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHByZXZlbnQgdGhlIGRyYWdnaW5nIGZyb20gdHJpZ2dlcmluZyB0ZXh0IHNlbGVjdGlvbiBvbiB0aGUgcGFnZVxuICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgIH1cbiAgICBzZWxlY3RbMl0gPSBwb3NbMF07XG4gICAgc2VsZWN0WzNdID0gcG9zWzFdO1xuICAgIGlmIChwcmV2ZW50RGVmYXVsdCkge1xuICAgICAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKGUucHJldmVudERlZmF1bHQpIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbiAgdmFyIGNsaWNrVGltZW91dCwgZGlkRG91YmxlQ2xpY2ssIHByZXZDbGlja1RpbWVTdGFtcDtcbiAgci5yZWdpc3RlckJpbmRpbmcoY29udGFpbmVyV2luZG93LCAnbW91c2V1cCcsIGZ1bmN0aW9uIG1vdXNldXBIYW5kbGVyKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgdmFyIGNhcHR1cmUgPSByLmhvdmVyRGF0YS5jYXB0dXJlO1xuICAgIGlmICghY2FwdHVyZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByLmhvdmVyRGF0YS5jYXB0dXJlID0gZmFsc2U7XG4gICAgdmFyIGN5ID0gci5jeTtcbiAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICB2YXIgc2VsZWN0ID0gci5zZWxlY3Rpb247XG4gICAgdmFyIG5lYXIgPSByLmZpbmROZWFyZXN0RWxlbWVudChwb3NbMF0sIHBvc1sxXSwgdHJ1ZSwgZmFsc2UpO1xuICAgIHZhciBkcmFnZ2VkRWxlbWVudHMgPSByLmRyYWdEYXRhLnBvc3NpYmxlRHJhZ0VsZW1lbnRzO1xuICAgIHZhciBkb3duID0gci5ob3ZlckRhdGEuZG93bjtcbiAgICB2YXIgbXVsdFNlbEtleURvd24gPSBpc011bHRTZWxLZXlEb3duKGUpO1xuICAgIGlmIChyLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24pIHtcbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICByLnJlZHJhdygpO1xuICAgIH1cbiAgICByLmhvdmVyRGF0YS50YXBob2xkQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7IC8vIG5vdCBhY3RpdmUgYmcgbm93XG5cbiAgICBpZiAoZG93bikge1xuICAgICAgZG93bi51bmFjdGl2YXRlKCk7XG4gICAgfVxuICAgIGlmIChyLmhvdmVyRGF0YS53aGljaCA9PT0gMykge1xuICAgICAgdmFyIGN4dEV2dCA9IHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdHlwZTogJ2N4dHRhcGVuZCcsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKGRvd24pIHtcbiAgICAgICAgZG93bi5lbWl0KGN4dEV2dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjeS5lbWl0KGN4dEV2dCk7XG4gICAgICB9XG4gICAgICBpZiAoIXIuaG92ZXJEYXRhLmN4dERyYWdnZWQpIHtcbiAgICAgICAgdmFyIGN4dFRhcCA9IHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHR5cGU6ICdjeHR0YXAnLFxuICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChkb3duKSB7XG4gICAgICAgICAgZG93bi5lbWl0KGN4dFRhcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3kuZW1pdChjeHRUYXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByLmhvdmVyRGF0YS5jeHREcmFnZ2VkID0gZmFsc2U7XG4gICAgICByLmhvdmVyRGF0YS53aGljaCA9IG51bGw7XG4gICAgfSBlbHNlIGlmIChyLmhvdmVyRGF0YS53aGljaCA9PT0gMSkge1xuICAgICAgdHJpZ2dlckV2ZW50cyhuZWFyLCBbJ21vdXNldXAnLCAndGFwZW5kJywgJ3Ztb3VzZXVwJ10sIGUsIHtcbiAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICB5OiBwb3NbMV1cbiAgICAgIH0pO1xuICAgICAgaWYgKCFyLmRyYWdEYXRhLmRpZERyYWcgJiZcbiAgICAgIC8vIGRpZG4ndCBtb3ZlIGEgbm9kZSBhcm91bmRcbiAgICAgICFyLmhvdmVyRGF0YS5kcmFnZ2VkICYmXG4gICAgICAvLyBkaWRuJ3QgcGFuXG4gICAgICAhci5ob3ZlckRhdGEuc2VsZWN0aW5nICYmXG4gICAgICAvLyBub3QgYm94IHNlbGVjdGlvblxuICAgICAgIXIuaG92ZXJEYXRhLmlzT3ZlclRocmVzaG9sZERyYWcgLy8gZGlkbid0IG1vdmUgdG9vIG11Y2hcbiAgICAgICkge1xuICAgICAgICB0cmlnZ2VyRXZlbnRzKGRvd24sIFtcImNsaWNrXCIsIFwidGFwXCIsIFwidmNsaWNrXCJdLCBlLCB7XG4gICAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICB9KTtcbiAgICAgICAgZGlkRG91YmxlQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgaWYgKGUudGltZVN0YW1wIC0gcHJldkNsaWNrVGltZVN0YW1wIDw9IGN5Lm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUoKSkge1xuICAgICAgICAgIGNsaWNrVGltZW91dCAmJiBjbGVhclRpbWVvdXQoY2xpY2tUaW1lb3V0KTtcbiAgICAgICAgICBkaWREb3VibGVDbGljayA9IHRydWU7XG4gICAgICAgICAgcHJldkNsaWNrVGltZVN0YW1wID0gbnVsbDtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnRzKGRvd24sIFtcImRibGNsaWNrXCIsIFwiZGJsdGFwXCIsIFwidmRibGNsaWNrXCJdLCBlLCB7XG4gICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICB5OiBwb3NbMV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbGlja1RpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChkaWREb3VibGVDbGljaykgcmV0dXJuO1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50cyhkb3duLCBbXCJvbmVjbGlja1wiLCBcIm9uZXRhcFwiLCBcInZvbmVjbGlja1wiXSwgZSwge1xuICAgICAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSwgY3kubXVsdGlDbGlja0RlYm91bmNlVGltZSgpKTtcbiAgICAgICAgICBwcmV2Q2xpY2tUaW1lU3RhbXAgPSBlLnRpbWVTdGFtcDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEZXNlbGVjdCBhbGwgZWxlbWVudHMgaWYgbm90aGluZyBpcyBjdXJyZW50bHkgdW5kZXIgdGhlIG1vdXNlIGN1cnNvciBhbmQgd2UgYXJlbid0IGRyYWdnaW5nIHNvbWV0aGluZ1xuICAgICAgaWYgKGRvd24gPT0gbnVsbCAvLyBub3QgbW91c2Vkb3duIG9uIG5vZGVcbiAgICAgICYmICFyLmRyYWdEYXRhLmRpZERyYWcgLy8gZGlkbid0IG1vdmUgdGhlIG5vZGUgYXJvdW5kXG4gICAgICAmJiAhci5ob3ZlckRhdGEuc2VsZWN0aW5nIC8vIG5vdCBib3ggc2VsZWN0aW9uXG4gICAgICAmJiAhci5ob3ZlckRhdGEuZHJhZ2dlZCAvLyBkaWRuJ3QgcGFuXG4gICAgICAmJiAhaXNNdWx0U2VsS2V5RG93bihlKSkge1xuICAgICAgICBjeS4kKGlzU2VsZWN0ZWQpLnVuc2VsZWN0KFsndGFwdW5zZWxlY3QnXSk7XG4gICAgICAgIGlmIChkcmFnZ2VkRWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHIuZHJhZ0RhdGEucG9zc2libGVEcmFnRWxlbWVudHMgPSBkcmFnZ2VkRWxlbWVudHMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNpbmdsZSBzZWxlY3Rpb25cbiAgICAgIGlmIChuZWFyID09IGRvd24gJiYgIXIuZHJhZ0RhdGEuZGlkRHJhZyAmJiAhci5ob3ZlckRhdGEuc2VsZWN0aW5nKSB7XG4gICAgICAgIGlmIChuZWFyICE9IG51bGwgJiYgbmVhci5fcHJpdmF0ZS5zZWxlY3RhYmxlKSB7XG4gICAgICAgICAgaWYgKHIuaG92ZXJEYXRhLmRyYWdnaW5nKSA7IGVsc2UgaWYgKGN5LnNlbGVjdGlvblR5cGUoKSA9PT0gJ2FkZGl0aXZlJyB8fCBtdWx0U2VsS2V5RG93bikge1xuICAgICAgICAgICAgaWYgKG5lYXIuc2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgICBuZWFyLnVuc2VsZWN0KFsndGFwdW5zZWxlY3QnXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBuZWFyLnNlbGVjdChbJ3RhcHNlbGVjdCddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFtdWx0U2VsS2V5RG93bikge1xuICAgICAgICAgICAgICBjeS4kKGlzU2VsZWN0ZWQpLnVubWVyZ2UobmVhcikudW5zZWxlY3QoWyd0YXB1bnNlbGVjdCddKTtcbiAgICAgICAgICAgICAgbmVhci5zZWxlY3QoWyd0YXBzZWxlY3QnXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoci5ob3ZlckRhdGEuc2VsZWN0aW5nKSB7XG4gICAgICAgIHZhciBib3ggPSBjeS5jb2xsZWN0aW9uKHIuZ2V0QWxsSW5Cb3goc2VsZWN0WzBdLCBzZWxlY3RbMV0sIHNlbGVjdFsyXSwgc2VsZWN0WzNdKSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgIGlmIChib3gubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGN5LmVtaXQoe1xuICAgICAgICAgIHR5cGU6ICdib3hlbmQnLFxuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgIHg6IHBvc1swXSxcbiAgICAgICAgICAgIHk6IHBvc1sxXVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBlbGVXb3VsZEJlU2VsZWN0ZWQgPSBmdW5jdGlvbiBlbGVXb3VsZEJlU2VsZWN0ZWQoZWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZS5zZWxlY3RhYmxlKCkgJiYgIWVsZS5zZWxlY3RlZCgpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoY3kuc2VsZWN0aW9uVHlwZSgpID09PSAnYWRkaXRpdmUnKSB7XG4gICAgICAgICAgYm94LmVtaXQoJ2JveCcpLnN0ZEZpbHRlcihlbGVXb3VsZEJlU2VsZWN0ZWQpLnNlbGVjdCgpLmVtaXQoJ2JveHNlbGVjdCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghbXVsdFNlbEtleURvd24pIHtcbiAgICAgICAgICAgIGN5LiQoaXNTZWxlY3RlZCkudW5tZXJnZShib3gpLnVuc2VsZWN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJveC5lbWl0KCdib3gnKS5zdGRGaWx0ZXIoZWxlV291bGRCZVNlbGVjdGVkKS5zZWxlY3QoKS5lbWl0KCdib3hzZWxlY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFsd2F5cyBuZWVkIHJlZHJhdyBpbiBjYXNlIGVsZXMgdW5zZWxlY3RhYmxlXG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbmNlbCBkcmFnIHBhblxuICAgICAgaWYgKHIuaG92ZXJEYXRhLmRyYWdnaW5nKSB7XG4gICAgICAgIHIuaG92ZXJEYXRhLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICByLnJlZHJhdygpO1xuICAgICAgfVxuICAgICAgaWYgKCFzZWxlY3RbNF0pIHtcbiAgICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICB2YXIgZG93bldhc0dyYWJiZWQgPSBkb3duICYmIGRvd24uZ3JhYmJlZCgpO1xuICAgICAgICBmcmVlRHJhZ2dlZEVsZW1lbnRzKGRyYWdnZWRFbGVtZW50cyk7XG4gICAgICAgIGlmIChkb3duV2FzR3JhYmJlZCkge1xuICAgICAgICAgIGRvd24uZW1pdCgnZnJlZW9uJyk7XG4gICAgICAgICAgZHJhZ2dlZEVsZW1lbnRzLmVtaXQoJ2ZyZWUnKTtcbiAgICAgICAgICBpZiAoci5kcmFnRGF0YS5kaWREcmFnKSB7XG4gICAgICAgICAgICBkb3duLmVtaXQoJ2RyYWdmcmVlb24nKTtcbiAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50cy5lbWl0KCdkcmFnZnJlZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gZWxzZSBub3QgcmlnaHQgbW91c2VcblxuICAgIHNlbGVjdFs0XSA9IDA7XG4gICAgci5ob3ZlckRhdGEuZG93biA9IG51bGw7XG4gICAgci5ob3ZlckRhdGEuY3h0U3RhcnRlZCA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLnNlbGVjdGluZyA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLmlzT3ZlclRocmVzaG9sZERyYWcgPSBmYWxzZTtcbiAgICByLmRyYWdEYXRhLmRpZERyYWcgPSBmYWxzZTtcbiAgICByLmhvdmVyRGF0YS5kcmFnZ2VkID0gZmFsc2U7XG4gICAgci5ob3ZlckRhdGEuZHJhZ0RlbHRhID0gW107XG4gICAgci5ob3ZlckRhdGEubWRvd25Qb3MgPSBudWxsO1xuICAgIHIuaG92ZXJEYXRhLm1kb3duR1BvcyA9IG51bGw7XG4gIH0sIGZhbHNlKTtcbiAgdmFyIHdoZWVsSGFuZGxlciA9IGZ1bmN0aW9uIHdoZWVsSGFuZGxlcihlKSB7XG4gICAgaWYgKHIuc2Nyb2xsaW5nUGFnZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gd2hpbGUgc2Nyb2xsaW5nLCBpZ25vcmUgd2hlZWwtdG8tem9vbVxuXG4gICAgdmFyIGN5ID0gci5jeTtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgdmFyIHJwb3MgPSBbcG9zWzBdICogem9vbSArIHBhbi54LCBwb3NbMV0gKiB6b29tICsgcGFuLnldO1xuICAgIGlmIChyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgfHwgci5ob3ZlckRhdGEuZHJhZ2dpbmcgfHwgci5ob3ZlckRhdGEuY3h0U3RhcnRlZCB8fCBpbkJveFNlbGVjdGlvbigpKSB7XG4gICAgICAvLyBpZiBwYW4gZHJhZ2dpbmcgb3IgY3h0IGRyYWdnaW5nLCB3aGVlbCBtb3ZlbWVudHMgbWFrZSBubyB6b29tXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjeS5wYW5uaW5nRW5hYmxlZCgpICYmIGN5LnVzZXJQYW5uaW5nRW5hYmxlZCgpICYmIGN5Lnpvb21pbmdFbmFibGVkKCkgJiYgY3kudXNlclpvb21pbmdFbmFibGVkKCkpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHIuZGF0YS53aGVlbFpvb21pbmcgPSB0cnVlO1xuICAgICAgY2xlYXJUaW1lb3V0KHIuZGF0YS53aGVlbFRpbWVvdXQpO1xuICAgICAgci5kYXRhLndoZWVsVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICByLmRhdGEud2hlZWxab29taW5nID0gZmFsc2U7XG4gICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICByLnJlZHJhdygpO1xuICAgICAgfSwgMTUwKTtcbiAgICAgIHZhciBkaWZmO1xuICAgICAgaWYgKGUuZGVsdGFZICE9IG51bGwpIHtcbiAgICAgICAgZGlmZiA9IGUuZGVsdGFZIC8gLTI1MDtcbiAgICAgIH0gZWxzZSBpZiAoZS53aGVlbERlbHRhWSAhPSBudWxsKSB7XG4gICAgICAgIGRpZmYgPSBlLndoZWVsRGVsdGFZIC8gMTAwMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpZmYgPSBlLndoZWVsRGVsdGEgLyAxMDAwO1xuICAgICAgfVxuICAgICAgZGlmZiA9IGRpZmYgKiByLndoZWVsU2Vuc2l0aXZpdHk7XG4gICAgICB2YXIgbmVlZHNXaGVlbEZpeCA9IGUuZGVsdGFNb2RlID09PSAxO1xuICAgICAgaWYgKG5lZWRzV2hlZWxGaXgpIHtcbiAgICAgICAgLy8gZml4ZXMgc2xvdyB3aGVlbCBldmVudHMgb24gZmYvbGludXggYW5kIGZmL3dpbmRvd3NcbiAgICAgICAgZGlmZiAqPSAzMztcbiAgICAgIH1cbiAgICAgIHZhciBuZXdab29tID0gY3kuem9vbSgpICogTWF0aC5wb3coMTAsIGRpZmYpO1xuICAgICAgaWYgKGUudHlwZSA9PT0gJ2dlc3R1cmVjaGFuZ2UnKSB7XG4gICAgICAgIG5ld1pvb20gPSByLmdlc3R1cmVTdGFydFpvb20gKiBlLnNjYWxlO1xuICAgICAgfVxuICAgICAgY3kuem9vbSh7XG4gICAgICAgIGxldmVsOiBuZXdab29tLFxuICAgICAgICByZW5kZXJlZFBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogcnBvc1swXSxcbiAgICAgICAgICB5OiBycG9zWzFdXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY3kuZW1pdChlLnR5cGUgPT09ICdnZXN0dXJlY2hhbmdlJyA/ICdwaW5jaHpvb20nIDogJ3Njcm9sbHpvb20nKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gRnVuY3Rpb25zIHRvIGhlbHAgd2l0aCB3aGV0aGVyIG1vdXNlIHdoZWVsIHNob3VsZCB0cmlnZ2VyIHpvb21pbmdcbiAgLy8gLS1cbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICd3aGVlbCcsIHdoZWVsSGFuZGxlciwgdHJ1ZSk7XG5cbiAgLy8gZGlzYWJsZSBub25zdGFuZGFyZCB3aGVlbCBldmVudHNcbiAgLy8gci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdtb3VzZXdoZWVsJywgd2hlZWxIYW5kbGVyLCB0cnVlKTtcbiAgLy8gci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdET01Nb3VzZVNjcm9sbCcsIHdoZWVsSGFuZGxlciwgdHJ1ZSk7XG4gIC8vIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAnTW96TW91c2VQaXhlbFNjcm9sbCcsIHdoZWVsSGFuZGxlciwgdHJ1ZSk7IC8vIG9sZGVyIGZpcmVmb3hcblxuICByLnJlZ2lzdGVyQmluZGluZyhjb250YWluZXJXaW5kb3csICdzY3JvbGwnLCBmdW5jdGlvbiBzY3JvbGxIYW5kbGVyKGUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgci5zY3JvbGxpbmdQYWdlID0gdHJ1ZTtcbiAgICBjbGVhclRpbWVvdXQoci5zY3JvbGxpbmdQYWdlVGltZW91dCk7XG4gICAgci5zY3JvbGxpbmdQYWdlVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgci5zY3JvbGxpbmdQYWdlID0gZmFsc2U7XG4gICAgfSwgMjUwKTtcbiAgfSwgdHJ1ZSk7XG5cbiAgLy8gZGVza3RvcCBzYWZhcmkgcGluY2ggdG8gem9vbSBzdGFydFxuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ2dlc3R1cmVzdGFydCcsIGZ1bmN0aW9uIGdlc3R1cmVTdGFydEhhbmRsZXIoZSkge1xuICAgIHIuZ2VzdHVyZVN0YXJ0Wm9vbSA9IHIuY3kuem9vbSgpO1xuICAgIGlmICghci5oYXNUb3VjaFN0YXJ0ZWQpIHtcbiAgICAgIC8vIGRvbid0IGFmZmVjdCB0b3VjaCBkZXZpY2VzIGxpa2UgaXBob25lXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9LCB0cnVlKTtcbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdnZXN0dXJlY2hhbmdlJywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoIXIuaGFzVG91Y2hTdGFydGVkKSB7XG4gICAgICAvLyBkb24ndCBhZmZlY3QgdG91Y2ggZGV2aWNlcyBsaWtlIGlwaG9uZVxuICAgICAgd2hlZWxIYW5kbGVyKGUpO1xuICAgIH1cbiAgfSwgdHJ1ZSk7XG5cbiAgLy8gRnVuY3Rpb25zIHRvIGhlbHAgd2l0aCBoYW5kbGluZyBtb3VzZW91dC9tb3VzZW92ZXIgb24gdGhlIEN5dG9zY2FwZSBjb250YWluZXJcbiAgLy8gSGFuZGxlIG1vdXNlb3V0IG9uIEN5dG9zY2FwZSBjb250YWluZXJcbiAgci5yZWdpc3RlckJpbmRpbmcoci5jb250YWluZXIsICdtb3VzZW91dCcsIGZ1bmN0aW9uIG1vdXNlT3V0SGFuZGxlcihlKSB7XG4gICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgci5jeS5lbWl0KHtcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICB0eXBlOiAnbW91c2VvdXQnLFxuICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgeDogcG9zWzBdLFxuICAgICAgICB5OiBwb3NbMV1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgZmFsc2UpO1xuICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ21vdXNlb3ZlcicsIGZ1bmN0aW9uIG1vdXNlT3ZlckhhbmRsZXIoZSkge1xuICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgIHIuY3kuZW1pdCh7XG4gICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgdHlwZTogJ21vdXNlb3ZlcicsXG4gICAgICBwb3NpdGlvbjoge1xuICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgIHk6IHBvc1sxXVxuICAgICAgfVxuICAgIH0pO1xuICB9LCBmYWxzZSk7XG4gIHZhciBmMXgxLCBmMXkxLCBmMngxLCBmMnkxOyAvLyBzdGFydGluZyBwb2ludHMgZm9yIHBpbmNoLXRvLXpvb21cbiAgdmFyIGRpc3RhbmNlMSwgZGlzdGFuY2UxU3E7IC8vIGluaXRpYWwgZGlzdGFuY2UgYmV0d2VlbiBmaW5nZXIgMSBhbmQgZmluZ2VyIDIgZm9yIHBpbmNoLXRvLXpvb21cbiAgdmFyIGNlbnRlcjEsIG1vZGVsQ2VudGVyMTsgLy8gY2VudGVyIHBvaW50IG9uIHN0YXJ0IHBpbmNoIHRvIHpvb21cbiAgdmFyIG9mZnNldExlZnQsIG9mZnNldFRvcDtcbiAgdmFyIGNvbnRhaW5lcldpZHRoLCBjb250YWluZXJIZWlnaHQ7XG4gIHZhciB0d29GaW5nZXJzU3RhcnRJbnNpZGU7XG4gIHZhciBkaXN0YW5jZSA9IGZ1bmN0aW9uIGRpc3RhbmNlKHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCgoeDIgLSB4MSkgKiAoeDIgLSB4MSkgKyAoeTIgLSB5MSkgKiAoeTIgLSB5MSkpO1xuICB9O1xuICB2YXIgZGlzdGFuY2VTcSA9IGZ1bmN0aW9uIGRpc3RhbmNlU3EoeDEsIHkxLCB4MiwgeTIpIHtcbiAgICByZXR1cm4gKHgyIC0geDEpICogKHgyIC0geDEpICsgKHkyIC0geTEpICogKHkyIC0geTEpO1xuICB9O1xuICB2YXIgdG91Y2hzdGFydEhhbmRsZXI7XG4gIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAndG91Y2hzdGFydCcsIHRvdWNoc3RhcnRIYW5kbGVyID0gZnVuY3Rpb24gdG91Y2hzdGFydEhhbmRsZXIoZSkge1xuICAgIHIuaGFzVG91Y2hTdGFydGVkID0gdHJ1ZTtcbiAgICBpZiAoIWV2ZW50SW5Db250YWluZXIoZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYmx1ckFjdGl2ZURvbUVsZW1lbnQoKTtcbiAgICByLnRvdWNoRGF0YS5jYXB0dXJlID0gdHJ1ZTtcbiAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgdmFyIGN5ID0gci5jeTtcbiAgICB2YXIgbm93ID0gci50b3VjaERhdGEubm93O1xuICAgIHZhciBlYXJsaWVyID0gci50b3VjaERhdGEuZWFybGllcjtcbiAgICBpZiAoZS50b3VjaGVzWzBdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICBub3dbMF0gPSBwb3NbMF07XG4gICAgICBub3dbMV0gPSBwb3NbMV07XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMV0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzFdLmNsaWVudFgsIGUudG91Y2hlc1sxXS5jbGllbnRZKTtcbiAgICAgIG5vd1syXSA9IHBvc1swXTtcbiAgICAgIG5vd1szXSA9IHBvc1sxXTtcbiAgICB9XG4gICAgaWYgKGUudG91Y2hlc1syXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMl0uY2xpZW50WCwgZS50b3VjaGVzWzJdLmNsaWVudFkpO1xuICAgICAgbm93WzRdID0gcG9zWzBdO1xuICAgICAgbm93WzVdID0gcG9zWzFdO1xuICAgIH1cblxuICAgIC8vIHJlY29yZCBzdGFydGluZyBwb2ludHMgZm9yIHBpbmNoLXRvLXpvb21cbiAgICBpZiAoZS50b3VjaGVzWzFdKSB7XG4gICAgICByLnRvdWNoRGF0YS5zaW5nbGVUb3VjaE1vdmVkID0gdHJ1ZTtcbiAgICAgIGZyZWVEcmFnZ2VkRWxlbWVudHMoci5kcmFnRGF0YS50b3VjaERyYWdFbGVzKTtcbiAgICAgIHZhciBvZmZzZXRzID0gci5maW5kQ29udGFpbmVyQ2xpZW50Q29vcmRzKCk7XG4gICAgICBvZmZzZXRMZWZ0ID0gb2Zmc2V0c1swXTtcbiAgICAgIG9mZnNldFRvcCA9IG9mZnNldHNbMV07XG4gICAgICBjb250YWluZXJXaWR0aCA9IG9mZnNldHNbMl07XG4gICAgICBjb250YWluZXJIZWlnaHQgPSBvZmZzZXRzWzNdO1xuICAgICAgZjF4MSA9IGUudG91Y2hlc1swXS5jbGllbnRYIC0gb2Zmc2V0TGVmdDtcbiAgICAgIGYxeTEgPSBlLnRvdWNoZXNbMF0uY2xpZW50WSAtIG9mZnNldFRvcDtcbiAgICAgIGYyeDEgPSBlLnRvdWNoZXNbMV0uY2xpZW50WCAtIG9mZnNldExlZnQ7XG4gICAgICBmMnkxID0gZS50b3VjaGVzWzFdLmNsaWVudFkgLSBvZmZzZXRUb3A7XG4gICAgICB0d29GaW5nZXJzU3RhcnRJbnNpZGUgPSAwIDw9IGYxeDEgJiYgZjF4MSA8PSBjb250YWluZXJXaWR0aCAmJiAwIDw9IGYyeDEgJiYgZjJ4MSA8PSBjb250YWluZXJXaWR0aCAmJiAwIDw9IGYxeTEgJiYgZjF5MSA8PSBjb250YWluZXJIZWlnaHQgJiYgMCA8PSBmMnkxICYmIGYyeTEgPD0gY29udGFpbmVySGVpZ2h0O1xuICAgICAgdmFyIHBhbiA9IGN5LnBhbigpO1xuICAgICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgICBkaXN0YW5jZTEgPSBkaXN0YW5jZShmMXgxLCBmMXkxLCBmMngxLCBmMnkxKTtcbiAgICAgIGRpc3RhbmNlMVNxID0gZGlzdGFuY2VTcShmMXgxLCBmMXkxLCBmMngxLCBmMnkxKTtcbiAgICAgIGNlbnRlcjEgPSBbKGYxeDEgKyBmMngxKSAvIDIsIChmMXkxICsgZjJ5MSkgLyAyXTtcbiAgICAgIG1vZGVsQ2VudGVyMSA9IFsoY2VudGVyMVswXSAtIHBhbi54KSAvIHpvb20sIChjZW50ZXIxWzFdIC0gcGFuLnkpIC8gem9vbV07XG5cbiAgICAgIC8vIGNvbnNpZGVyIGNvbnRleHQgdGFwXG4gICAgICB2YXIgY3h0RGlzdFRocmVzaG9sZCA9IDIwMDtcbiAgICAgIHZhciBjeHREaXN0VGhyZXNob2xkU3EgPSBjeHREaXN0VGhyZXNob2xkICogY3h0RGlzdFRocmVzaG9sZDtcbiAgICAgIGlmIChkaXN0YW5jZTFTcSA8IGN4dERpc3RUaHJlc2hvbGRTcSAmJiAhZS50b3VjaGVzWzJdKSB7XG4gICAgICAgIHZhciBuZWFyMSA9IHIuZmluZE5lYXJlc3RFbGVtZW50KG5vd1swXSwgbm93WzFdLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdmFyIG5lYXIyID0gci5maW5kTmVhcmVzdEVsZW1lbnQobm93WzJdLCBub3dbM10sIHRydWUsIHRydWUpO1xuICAgICAgICBpZiAobmVhcjEgJiYgbmVhcjEuaXNOb2RlKCkpIHtcbiAgICAgICAgICBuZWFyMS5hY3RpdmF0ZSgpLmVtaXQoe1xuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgIHR5cGU6ICdjeHR0YXBzdGFydCcsXG4gICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0ID0gbmVhcjE7XG4gICAgICAgIH0gZWxzZSBpZiAobmVhcjIgJiYgbmVhcjIuaXNOb2RlKCkpIHtcbiAgICAgICAgICBuZWFyMi5hY3RpdmF0ZSgpLmVtaXQoe1xuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICAgIHR5cGU6ICdjeHR0YXBzdGFydCcsXG4gICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0ID0gbmVhcjI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3kuZW1pdCh7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgdHlwZTogJ2N4dHRhcHN0YXJ0JyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIudG91Y2hEYXRhLnN0YXJ0KSB7XG4gICAgICAgICAgci50b3VjaERhdGEuc3RhcnQuX3ByaXZhdGUuZ3JhYmJlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHIudG91Y2hEYXRhLmN4dCA9IHRydWU7XG4gICAgICAgIHIudG91Y2hEYXRhLmN4dERyYWdnZWQgPSBmYWxzZTtcbiAgICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICByLnJlZHJhdygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIC8vIGlnbm9yZVxuXG4gICAgICAvLyBzYWZhcmkgb24gaW9zIHBhbnMgdGhlIHBhZ2Ugb3RoZXJ3aXNlIChub3JtYWxseSB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gcHJldmVudGRlZmF1bHQgb24gdG91Y2htb3ZlLi4uKVxuICAgICAgaWYgKGN5LmJveFNlbGVjdGlvbkVuYWJsZWQoKSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlLnRvdWNoZXNbMV0pIDsgZWxzZSBpZiAoZS50b3VjaGVzWzBdKSB7XG4gICAgICB2YXIgbmVhcnMgPSByLmZpbmROZWFyZXN0RWxlbWVudHMobm93WzBdLCBub3dbMV0sIHRydWUsIHRydWUpO1xuICAgICAgdmFyIG5lYXIgPSBuZWFyc1swXTtcbiAgICAgIGlmIChuZWFyICE9IG51bGwpIHtcbiAgICAgICAgbmVhci5hY3RpdmF0ZSgpO1xuICAgICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG5lYXI7XG4gICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0cyA9IG5lYXJzO1xuICAgICAgICBpZiAoci5ub2RlSXNHcmFiYmFibGUobmVhcikpIHtcbiAgICAgICAgICB2YXIgZHJhZ2dlZEVsZXMgPSByLmRyYWdEYXRhLnRvdWNoRHJhZ0VsZXMgPSBjeS5jb2xsZWN0aW9uKCk7XG4gICAgICAgICAgdmFyIHNlbGVjdGVkTm9kZXMgPSBudWxsO1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICAgIGlmIChuZWFyLnNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIC8vIHJlc2V0IGRyYWcgZWxlbWVudHMsIHNpbmNlIG5lYXIgd2lsbCBiZSBhZGRlZCBhZ2FpblxuXG4gICAgICAgICAgICBzZWxlY3RlZE5vZGVzID0gY3kuJChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlbGUuc2VsZWN0ZWQoKSAmJiByLm5vZGVJc0dyYWJiYWJsZShlbGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhZGROb2Rlc1RvRHJhZyhzZWxlY3RlZE5vZGVzLCB7XG4gICAgICAgICAgICAgIGFkZFRvTGlzdDogZHJhZ2dlZEVsZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZGROb2RlVG9EcmFnKG5lYXIsIHtcbiAgICAgICAgICAgICAgYWRkVG9MaXN0OiBkcmFnZ2VkRWxlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldEdyYWJUYXJnZXQobmVhcik7XG4gICAgICAgICAgdmFyIG1ha2VFdmVudCA9IGZ1bmN0aW9uIG1ha2VFdmVudCh0eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIG5lYXIuZW1pdChtYWtlRXZlbnQoJ2dyYWJvbicpKTtcbiAgICAgICAgICBpZiAoc2VsZWN0ZWROb2Rlcykge1xuICAgICAgICAgICAgc2VsZWN0ZWROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICAgIG4uZW1pdChtYWtlRXZlbnQoJ2dyYWInKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmVhci5lbWl0KG1ha2VFdmVudCgnZ3JhYicpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudHMobmVhciwgWyd0b3VjaHN0YXJ0JywgJ3RhcHN0YXJ0JywgJ3Ztb3VzZWRvd24nXSwgZSwge1xuICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgIHk6IG5vd1sxXVxuICAgICAgfSk7XG4gICAgICBpZiAobmVhciA9PSBudWxsKSB7XG4gICAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHtcbiAgICAgICAgICB4OiBwb3NbMF0sXG4gICAgICAgICAgeTogcG9zWzFdXG4gICAgICAgIH07XG4gICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRhcCwgdGFwaG9sZFxuICAgICAgLy8gLS0tLS1cblxuICAgICAgci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCA9IGZhbHNlO1xuICAgICAgci50b3VjaERhdGEuc2luZ2xlVG91Y2hTdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICAgIGNsZWFyVGltZW91dChyLnRvdWNoRGF0YS50YXBob2xkVGltZW91dCk7XG4gICAgICByLnRvdWNoRGF0YS50YXBob2xkVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoci50b3VjaERhdGEuc2luZ2xlVG91Y2hNb3ZlZCA9PT0gZmFsc2UgJiYgIXIucGluY2hpbmcgLy8gaWYgcGluY2hpbmcsIHRoZW4gdGFwaG9sZCB1bnNlbGVjdCBzaG91bGRuJ3QgdGFrZSBlZmZlY3RcbiAgICAgICAgJiYgIXIudG91Y2hEYXRhLnNlbGVjdGluZyAvLyBib3ggc2VsZWN0aW9uIHNob3VsZG4ndCBhbGxvdyB0YXBob2xkIHRocm91Z2hcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50cyhyLnRvdWNoRGF0YS5zdGFydCwgWyd0YXBob2xkJ10sIGUsIHtcbiAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCByLnRhcGhvbGREdXJhdGlvbik7XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID49IDEpIHtcbiAgICAgIHZhciBzUG9zID0gci50b3VjaERhdGEuc3RhcnRQb3NpdGlvbiA9IFtudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNQb3NbaV0gPSBlYXJsaWVyW2ldID0gbm93W2ldO1xuICAgICAgfVxuICAgICAgdmFyIHRvdWNoMCA9IGUudG91Y2hlc1swXTtcbiAgICAgIHIudG91Y2hEYXRhLnN0YXJ0R1Bvc2l0aW9uID0gW3RvdWNoMC5jbGllbnRYLCB0b3VjaDAuY2xpZW50WV07XG4gICAgfVxuICB9LCBmYWxzZSk7XG4gIHZhciB0b3VjaG1vdmVIYW5kbGVyO1xuICByLnJlZ2lzdGVyQmluZGluZyh3aW5kb3csICd0b3VjaG1vdmUnLCB0b3VjaG1vdmVIYW5kbGVyID0gZnVuY3Rpb24gdG91Y2htb3ZlSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIHZhciBjYXB0dXJlID0gci50b3VjaERhdGEuY2FwdHVyZTtcbiAgICBpZiAoIWNhcHR1cmUgJiYgIWV2ZW50SW5Db250YWluZXIoZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHNlbGVjdCA9IHIuc2VsZWN0aW9uO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIG5vdyA9IHIudG91Y2hEYXRhLm5vdztcbiAgICB2YXIgZWFybGllciA9IHIudG91Y2hEYXRhLmVhcmxpZXI7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgaWYgKGUudG91Y2hlc1swXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFkpO1xuICAgICAgbm93WzBdID0gcG9zWzBdO1xuICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgIH1cbiAgICBpZiAoZS50b3VjaGVzWzFdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1sxXS5jbGllbnRYLCBlLnRvdWNoZXNbMV0uY2xpZW50WSk7XG4gICAgICBub3dbMl0gPSBwb3NbMF07XG4gICAgICBub3dbM10gPSBwb3NbMV07XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzJdLmNsaWVudFgsIGUudG91Y2hlc1syXS5jbGllbnRZKTtcbiAgICAgIG5vd1s0XSA9IHBvc1swXTtcbiAgICAgIG5vd1s1XSA9IHBvc1sxXTtcbiAgICB9XG4gICAgdmFyIHN0YXJ0R1BvcyA9IHIudG91Y2hEYXRhLnN0YXJ0R1Bvc2l0aW9uO1xuICAgIHZhciBpc092ZXJUaHJlc2hvbGREcmFnO1xuICAgIGlmIChjYXB0dXJlICYmIGUudG91Y2hlc1swXSAmJiBzdGFydEdQb3MpIHtcbiAgICAgIHZhciBkaXNwID0gW107XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5vdy5sZW5ndGg7IGorKykge1xuICAgICAgICBkaXNwW2pdID0gbm93W2pdIC0gZWFybGllcltqXTtcbiAgICAgIH1cbiAgICAgIHZhciBkeCA9IGUudG91Y2hlc1swXS5jbGllbnRYIC0gc3RhcnRHUG9zWzBdO1xuICAgICAgdmFyIGR4MiA9IGR4ICogZHg7XG4gICAgICB2YXIgZHkgPSBlLnRvdWNoZXNbMF0uY2xpZW50WSAtIHN0YXJ0R1Bvc1sxXTtcbiAgICAgIHZhciBkeTIgPSBkeSAqIGR5O1xuICAgICAgdmFyIGRpc3QyID0gZHgyICsgZHkyO1xuICAgICAgaXNPdmVyVGhyZXNob2xkRHJhZyA9IGRpc3QyID49IHIudG91Y2hUYXBUaHJlc2hvbGQyO1xuICAgIH1cblxuICAgIC8vIGNvbnRleHQgc3dpcGUgY2FuY2VsbGluZ1xuICAgIGlmIChjYXB0dXJlICYmIHIudG91Y2hEYXRhLmN4dCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdmFyIGYxeDIgPSBlLnRvdWNoZXNbMF0uY2xpZW50WCAtIG9mZnNldExlZnQsXG4gICAgICAgIGYxeTIgPSBlLnRvdWNoZXNbMF0uY2xpZW50WSAtIG9mZnNldFRvcDtcbiAgICAgIHZhciBmMngyID0gZS50b3VjaGVzWzFdLmNsaWVudFggLSBvZmZzZXRMZWZ0LFxuICAgICAgICBmMnkyID0gZS50b3VjaGVzWzFdLmNsaWVudFkgLSBvZmZzZXRUb3A7XG4gICAgICAvLyB2YXIgZGlzdGFuY2UyID0gZGlzdGFuY2UoIGYxeDIsIGYxeTIsIGYyeDIsIGYyeTIgKTtcbiAgICAgIHZhciBkaXN0YW5jZTJTcSA9IGRpc3RhbmNlU3EoZjF4MiwgZjF5MiwgZjJ4MiwgZjJ5Mik7XG4gICAgICB2YXIgZmFjdG9yU3EgPSBkaXN0YW5jZTJTcSAvIGRpc3RhbmNlMVNxO1xuICAgICAgdmFyIGRpc3RUaHJlc2hvbGQgPSAxNTA7XG4gICAgICB2YXIgZGlzdFRocmVzaG9sZFNxID0gZGlzdFRocmVzaG9sZCAqIGRpc3RUaHJlc2hvbGQ7XG4gICAgICB2YXIgZmFjdG9yVGhyZXNob2xkID0gMS41O1xuICAgICAgdmFyIGZhY3RvclRocmVzaG9sZFNxID0gZmFjdG9yVGhyZXNob2xkICogZmFjdG9yVGhyZXNob2xkO1xuXG4gICAgICAvLyBjYW5jZWwgY3R4IGdlc3R1cmVzIGlmIHRoZSBkaXN0YW5jZSBiL3QgdGhlIGZpbmdlcnMgaW5jcmVhc2VzXG4gICAgICBpZiAoZmFjdG9yU3EgPj0gZmFjdG9yVGhyZXNob2xkU3EgfHwgZGlzdGFuY2UyU3EgPj0gZGlzdFRocmVzaG9sZFNxKSB7XG4gICAgICAgIHIudG91Y2hEYXRhLmN4dCA9IGZhbHNlO1xuICAgICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICAgIHZhciBjeHRFdnQgPSB7XG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICB0eXBlOiAnY3h0dGFwZW5kJyxcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoci50b3VjaERhdGEuc3RhcnQpIHtcbiAgICAgICAgICByLnRvdWNoRGF0YS5zdGFydC51bmFjdGl2YXRlKCkuZW1pdChjeHRFdnQpO1xuICAgICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0ID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjeS5lbWl0KGN4dEV2dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb250ZXh0IHN3aXBlXG4gICAgaWYgKGNhcHR1cmUgJiYgci50b3VjaERhdGEuY3h0KSB7XG4gICAgICB2YXIgY3h0RXZ0ID0ge1xuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0eXBlOiAnY3h0ZHJhZycsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIGlmIChyLnRvdWNoRGF0YS5zdGFydCkge1xuICAgICAgICByLnRvdWNoRGF0YS5zdGFydC5lbWl0KGN4dEV2dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjeS5lbWl0KGN4dEV2dCk7XG4gICAgICB9XG4gICAgICBpZiAoci50b3VjaERhdGEuc3RhcnQpIHtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQuX3ByaXZhdGUuZ3JhYmJlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgci50b3VjaERhdGEuY3h0RHJhZ2dlZCA9IHRydWU7XG4gICAgICB2YXIgbmVhciA9IHIuZmluZE5lYXJlc3RFbGVtZW50KG5vd1swXSwgbm93WzFdLCB0cnVlLCB0cnVlKTtcbiAgICAgIGlmICghci50b3VjaERhdGEuY3h0T3ZlciB8fCBuZWFyICE9PSByLnRvdWNoRGF0YS5jeHRPdmVyKSB7XG4gICAgICAgIGlmIChyLnRvdWNoRGF0YS5jeHRPdmVyKSB7XG4gICAgICAgICAgci50b3VjaERhdGEuY3h0T3Zlci5lbWl0KHtcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICB0eXBlOiAnY3h0ZHJhZ291dCcsXG4gICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHIudG91Y2hEYXRhLmN4dE92ZXIgPSBuZWFyO1xuICAgICAgICBpZiAobmVhcikge1xuICAgICAgICAgIG5lYXIuZW1pdCh7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgdHlwZTogJ2N4dGRyYWdvdmVyJyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gYm94IHNlbGVjdGlvblxuICAgIH0gZWxzZSBpZiAoY2FwdHVyZSAmJiBlLnRvdWNoZXNbMl0gJiYgY3kuYm94U2VsZWN0aW9uRW5hYmxlZCgpKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmxhc3RUaHJlZVRvdWNoID0gK25ldyBEYXRlKCk7XG4gICAgICBpZiAoIXIudG91Y2hEYXRhLnNlbGVjdGluZykge1xuICAgICAgICBjeS5lbWl0KHtcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgIHR5cGU6ICdib3hzdGFydCcsXG4gICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByLnRvdWNoRGF0YS5zZWxlY3RpbmcgPSB0cnVlO1xuICAgICAgci50b3VjaERhdGEuZGlkU2VsZWN0ID0gdHJ1ZTtcbiAgICAgIHNlbGVjdFs0XSA9IDE7XG4gICAgICBpZiAoIXNlbGVjdCB8fCBzZWxlY3QubGVuZ3RoID09PSAwIHx8IHNlbGVjdFswXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNlbGVjdFswXSA9IChub3dbMF0gKyBub3dbMl0gKyBub3dbNF0pIC8gMztcbiAgICAgICAgc2VsZWN0WzFdID0gKG5vd1sxXSArIG5vd1szXSArIG5vd1s1XSkgLyAzO1xuICAgICAgICBzZWxlY3RbMl0gPSAobm93WzBdICsgbm93WzJdICsgbm93WzRdKSAvIDMgKyAxO1xuICAgICAgICBzZWxlY3RbM10gPSAobm93WzFdICsgbm93WzNdICsgbm93WzVdKSAvIDMgKyAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0WzJdID0gKG5vd1swXSArIG5vd1syXSArIG5vd1s0XSkgLyAzO1xuICAgICAgICBzZWxlY3RbM10gPSAobm93WzFdICsgbm93WzNdICsgbm93WzVdKSAvIDM7XG4gICAgICB9XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcblxuICAgICAgLy8gcGluY2ggdG8gem9vbVxuICAgIH0gZWxzZSBpZiAoY2FwdHVyZSAmJiBlLnRvdWNoZXNbMV0gJiYgIXIudG91Y2hEYXRhLmRpZFNlbGVjdCAvLyBkb24ndCBhbGxvdyBib3ggc2VsZWN0aW9uIHRvIGRlZ3JhZGUgdG8gcGluY2gtdG8tem9vbVxuICAgICYmIGN5Lnpvb21pbmdFbmFibGVkKCkgJiYgY3kucGFubmluZ0VuYWJsZWQoKSAmJiBjeS51c2VyWm9vbWluZ0VuYWJsZWQoKSAmJiBjeS51c2VyUGFubmluZ0VuYWJsZWQoKSkge1xuICAgICAgLy8gdHdvIGZpbmdlcnMgPT4gcGluY2ggdG8gem9vbVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIHZhciBkcmFnZ2VkRWxlcyA9IHIuZHJhZ0RhdGEudG91Y2hEcmFnRWxlcztcbiAgICAgIGlmIChkcmFnZ2VkRWxlcykge1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkcmFnZ2VkRWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBkZV9wID0gZHJhZ2dlZEVsZXNbaV0uX3ByaXZhdGU7XG4gICAgICAgICAgZGVfcC5ncmFiYmVkID0gZmFsc2U7XG4gICAgICAgICAgZGVfcC5yc2NyYXRjaC5pbkRyYWdMYXllciA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgX3N0YXJ0ID0gci50b3VjaERhdGEuc3RhcnQ7XG5cbiAgICAgIC8vICh4MiwgeTIpIGZvciBmaW5nZXJzIDEgYW5kIDJcbiAgICAgIHZhciBmMXgyID0gZS50b3VjaGVzWzBdLmNsaWVudFggLSBvZmZzZXRMZWZ0LFxuICAgICAgICBmMXkyID0gZS50b3VjaGVzWzBdLmNsaWVudFkgLSBvZmZzZXRUb3A7XG4gICAgICB2YXIgZjJ4MiA9IGUudG91Y2hlc1sxXS5jbGllbnRYIC0gb2Zmc2V0TGVmdCxcbiAgICAgICAgZjJ5MiA9IGUudG91Y2hlc1sxXS5jbGllbnRZIC0gb2Zmc2V0VG9wO1xuICAgICAgdmFyIGRpc3RhbmNlMiA9IGRpc3RhbmNlKGYxeDIsIGYxeTIsIGYyeDIsIGYyeTIpO1xuICAgICAgLy8gdmFyIGRpc3RhbmNlMlNxID0gZGlzdGFuY2VTcSggZjF4MiwgZjF5MiwgZjJ4MiwgZjJ5MiApO1xuICAgICAgLy8gdmFyIGZhY3RvciA9IE1hdGguc3FydCggZGlzdGFuY2UyU3EgKSAvIE1hdGguc3FydCggZGlzdGFuY2UxU3EgKTtcbiAgICAgIHZhciBmYWN0b3IgPSBkaXN0YW5jZTIgLyBkaXN0YW5jZTE7XG4gICAgICBpZiAodHdvRmluZ2Vyc1N0YXJ0SW5zaWRlKSB7XG4gICAgICAgIC8vIGRlbHRhIGZpbmdlcjFcbiAgICAgICAgdmFyIGRmMXggPSBmMXgyIC0gZjF4MTtcbiAgICAgICAgdmFyIGRmMXkgPSBmMXkyIC0gZjF5MTtcblxuICAgICAgICAvLyBkZWx0YSBmaW5nZXIgMlxuICAgICAgICB2YXIgZGYyeCA9IGYyeDIgLSBmMngxO1xuICAgICAgICB2YXIgZGYyeSA9IGYyeTIgLSBmMnkxO1xuXG4gICAgICAgIC8vIHRyYW5zbGF0aW9uIGlzIHRoZSBub3JtYWxpc2VkIHZlY3RvciBvZiB0aGUgdHdvIGZpbmdlcnMgbW92ZW1lbnRcbiAgICAgICAgLy8gaS5lLiBzbyBwaW5jaGluZyBjYW5jZWxzIG91dCBhbmQgbW92aW5nIHRvZ2V0aGVyIHBhbnNcbiAgICAgICAgdmFyIHR4ID0gKGRmMXggKyBkZjJ4KSAvIDI7XG4gICAgICAgIHZhciB0eSA9IChkZjF5ICsgZGYyeSkgLyAyO1xuXG4gICAgICAgIC8vIG5vdyBjYWxjdWxhdGUgdGhlIHpvb21cbiAgICAgICAgdmFyIHpvb20xID0gY3kuem9vbSgpO1xuICAgICAgICB2YXIgem9vbTIgPSB6b29tMSAqIGZhY3RvcjtcbiAgICAgICAgdmFyIHBhbjEgPSBjeS5wYW4oKTtcblxuICAgICAgICAvLyB0aGUgbW9kZWwgY2VudGVyIHBvaW50IGNvbnZlcnRlZCB0byB0aGUgY3VycmVudCByZW5kZXJlZCBwb3NcbiAgICAgICAgdmFyIGN0cnggPSBtb2RlbENlbnRlcjFbMF0gKiB6b29tMSArIHBhbjEueDtcbiAgICAgICAgdmFyIGN0cnkgPSBtb2RlbENlbnRlcjFbMV0gKiB6b29tMSArIHBhbjEueTtcbiAgICAgICAgdmFyIHBhbjIgPSB7XG4gICAgICAgICAgeDogLXpvb20yIC8gem9vbTEgKiAoY3RyeCAtIHBhbjEueCAtIHR4KSArIGN0cngsXG4gICAgICAgICAgeTogLXpvb20yIC8gem9vbTEgKiAoY3RyeSAtIHBhbjEueSAtIHR5KSArIGN0cnlcbiAgICAgICAgfTtcblxuICAgICAgICAvLyByZW1vdmUgZHJhZ2dlZCBlbGVzXG4gICAgICAgIGlmIChfc3RhcnQgJiYgX3N0YXJ0LmFjdGl2ZSgpKSB7XG4gICAgICAgICAgdmFyIGRyYWdnZWRFbGVzID0gci5kcmFnRGF0YS50b3VjaERyYWdFbGVzO1xuICAgICAgICAgIGZyZWVEcmFnZ2VkRWxlbWVudHMoZHJhZ2dlZEVsZXMpO1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICAgIF9zdGFydC51bmFjdGl2YXRlKCkuZW1pdCgnZnJlZW9uJyk7XG4gICAgICAgICAgZHJhZ2dlZEVsZXMuZW1pdCgnZnJlZScpO1xuICAgICAgICAgIGlmIChyLmRyYWdEYXRhLmRpZERyYWcpIHtcbiAgICAgICAgICAgIF9zdGFydC5lbWl0KCdkcmFnZnJlZW9uJyk7XG4gICAgICAgICAgICBkcmFnZ2VkRWxlcy5lbWl0KCdkcmFnZnJlZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjeS52aWV3cG9ydCh7XG4gICAgICAgICAgem9vbTogem9vbTIsXG4gICAgICAgICAgcGFuOiBwYW4yLFxuICAgICAgICAgIGNhbmNlbE9uRmFpbGVkWm9vbTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgY3kuZW1pdCgncGluY2h6b29tJyk7XG4gICAgICAgIGRpc3RhbmNlMSA9IGRpc3RhbmNlMjtcbiAgICAgICAgZjF4MSA9IGYxeDI7XG4gICAgICAgIGYxeTEgPSBmMXkyO1xuICAgICAgICBmMngxID0gZjJ4MjtcbiAgICAgICAgZjJ5MSA9IGYyeTI7XG4gICAgICAgIHIucGluY2hpbmcgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZS1wcm9qZWN0XG4gICAgICBpZiAoZS50b3VjaGVzWzBdKSB7XG4gICAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzBdLmNsaWVudFgsIGUudG91Y2hlc1swXS5jbGllbnRZKTtcbiAgICAgICAgbm93WzBdID0gcG9zWzBdO1xuICAgICAgICBub3dbMV0gPSBwb3NbMV07XG4gICAgICB9XG4gICAgICBpZiAoZS50b3VjaGVzWzFdKSB7XG4gICAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzFdLmNsaWVudFgsIGUudG91Y2hlc1sxXS5jbGllbnRZKTtcbiAgICAgICAgbm93WzJdID0gcG9zWzBdO1xuICAgICAgICBub3dbM10gPSBwb3NbMV07XG4gICAgICB9XG4gICAgICBpZiAoZS50b3VjaGVzWzJdKSB7XG4gICAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzJdLmNsaWVudFgsIGUudG91Y2hlc1syXS5jbGllbnRZKTtcbiAgICAgICAgbm93WzRdID0gcG9zWzBdO1xuICAgICAgICBub3dbNV0gPSBwb3NbMV07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlLnRvdWNoZXNbMF0gJiYgIXIudG91Y2hEYXRhLmRpZFNlbGVjdCAvLyBkb24ndCBhbGxvdyBib3ggc2VsZWN0aW9uIHRvIGRlZ3JhZGUgdG8gc2luZ2xlIGZpbmdlciBldmVudHMgbGlrZSBwYW5uaW5nXG4gICAgKSB7XG4gICAgICB2YXIgc3RhcnQgPSByLnRvdWNoRGF0YS5zdGFydDtcbiAgICAgIHZhciBsYXN0ID0gci50b3VjaERhdGEubGFzdDtcbiAgICAgIHZhciBuZWFyO1xuICAgICAgaWYgKCFyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgJiYgIXIuc3dpcGVQYW5uaW5nKSB7XG4gICAgICAgIG5lYXIgPSByLmZpbmROZWFyZXN0RWxlbWVudChub3dbMF0sIG5vd1sxXSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoY2FwdHVyZSAmJiBzdGFydCAhPSBudWxsKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gZHJhZ2dpbmcgbm9kZXNcbiAgICAgIGlmIChjYXB0dXJlICYmIHN0YXJ0ICE9IG51bGwgJiYgci5ub2RlSXNEcmFnZ2FibGUoc3RhcnQpKSB7XG4gICAgICAgIGlmIChpc092ZXJUaHJlc2hvbGREcmFnKSB7XG4gICAgICAgICAgLy8gdGhlbiBkcmFnZ2luZyBjYW4gaGFwcGVuXG4gICAgICAgICAgdmFyIGRyYWdnZWRFbGVzID0gci5kcmFnRGF0YS50b3VjaERyYWdFbGVzO1xuICAgICAgICAgIHZhciBqdXN0U3RhcnRlZERyYWcgPSAhci5kcmFnRGF0YS5kaWREcmFnO1xuICAgICAgICAgIGlmIChqdXN0U3RhcnRlZERyYWcpIHtcbiAgICAgICAgICAgIGFkZE5vZGVzVG9EcmFnKGRyYWdnZWRFbGVzLCB7XG4gICAgICAgICAgICAgIGluRHJhZ0xheWVyOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgci5kcmFnRGF0YS5kaWREcmFnID0gdHJ1ZTtcbiAgICAgICAgICB2YXIgdG90YWxTaGlmdCA9IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAobnVtYmVyJDEoZGlzcFswXSkgJiYgbnVtYmVyJDEoZGlzcFsxXSkpIHtcbiAgICAgICAgICAgIHRvdGFsU2hpZnQueCArPSBkaXNwWzBdO1xuICAgICAgICAgICAgdG90YWxTaGlmdC55ICs9IGRpc3BbMV07XG4gICAgICAgICAgICBpZiAoanVzdFN0YXJ0ZWREcmFnKSB7XG4gICAgICAgICAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgICAgICAgICB2YXIgZHJhZ0RlbHRhID0gci50b3VjaERhdGEuZHJhZ0RlbHRhO1xuICAgICAgICAgICAgICBpZiAoZHJhZ0RlbHRhICYmIG51bWJlciQxKGRyYWdEZWx0YVswXSkgJiYgbnVtYmVyJDEoZHJhZ0RlbHRhWzFdKSkge1xuICAgICAgICAgICAgICAgIHRvdGFsU2hpZnQueCArPSBkcmFnRGVsdGFbMF07XG4gICAgICAgICAgICAgICAgdG90YWxTaGlmdC55ICs9IGRyYWdEZWx0YVsxXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgPSB0cnVlO1xuICAgICAgICAgIGRyYWdnZWRFbGVzLnNpbGVudFNoaWZ0KHRvdGFsU2hpZnQpLmVtaXQoJ3Bvc2l0aW9uIGRyYWcnKTtcbiAgICAgICAgICByLnJlZHJhd0hpbnQoJ2RyYWcnLCB0cnVlKTtcbiAgICAgICAgICBpZiAoci50b3VjaERhdGEuc3RhcnRQb3NpdGlvblswXSA9PSBlYXJsaWVyWzBdICYmIHIudG91Y2hEYXRhLnN0YXJ0UG9zaXRpb25bMV0gPT0gZWFybGllclsxXSkge1xuICAgICAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHIucmVkcmF3KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gb3RoZXJ3aXNlIGtlZXAgdHJhY2sgb2YgZHJhZyBkZWx0YSBmb3IgbGF0ZXJcbiAgICAgICAgICB2YXIgZHJhZ0RlbHRhID0gci50b3VjaERhdGEuZHJhZ0RlbHRhID0gci50b3VjaERhdGEuZHJhZ0RlbHRhIHx8IFtdO1xuICAgICAgICAgIGlmIChkcmFnRGVsdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBkcmFnRGVsdGEucHVzaChkaXNwWzBdKTtcbiAgICAgICAgICAgIGRyYWdEZWx0YS5wdXNoKGRpc3BbMV0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkcmFnRGVsdGFbMF0gKz0gZGlzcFswXTtcbiAgICAgICAgICAgIGRyYWdEZWx0YVsxXSArPSBkaXNwWzFdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyB0b3VjaG1vdmVcbiAgICAgIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50cyhzdGFydCB8fCBuZWFyLCBbJ3RvdWNobW92ZScsICd0YXBkcmFnJywgJ3Ztb3VzZW1vdmUnXSwgZSwge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICgoIXN0YXJ0IHx8ICFzdGFydC5ncmFiYmVkKCkpICYmIG5lYXIgIT0gbGFzdCkge1xuICAgICAgICAgIGlmIChsYXN0KSB7XG4gICAgICAgICAgICBsYXN0LmVtaXQoe1xuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICAgICAgICB0eXBlOiAndGFwZHJhZ291dCcsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5lYXIpIHtcbiAgICAgICAgICAgIG5lYXIuZW1pdCh7XG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgICAgICAgIHR5cGU6ICd0YXBkcmFnb3ZlcicsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICAgIHk6IG5vd1sxXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgci50b3VjaERhdGEubGFzdCA9IG5lYXI7XG4gICAgICB9XG5cbiAgICAgIC8vIGNoZWNrIHRvIGNhbmNlbCB0YXBob2xkXG4gICAgICBpZiAoY2FwdHVyZSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vdy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChub3dbaV0gJiYgci50b3VjaERhdGEuc3RhcnRQb3NpdGlvbltpXSAmJiBpc092ZXJUaHJlc2hvbGREcmFnKSB7XG4gICAgICAgICAgICByLnRvdWNoRGF0YS5zaW5nbGVUb3VjaE1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gcGFubmluZ1xuICAgICAgaWYgKGNhcHR1cmUgJiYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQucGFubmFibGUoKSkgJiYgY3kucGFubmluZ0VuYWJsZWQoKSAmJiBjeS51c2VyUGFubmluZ0VuYWJsZWQoKSkge1xuICAgICAgICB2YXIgYWxsb3dQYXNzdGhyb3VnaCA9IGFsbG93UGFubmluZ1Bhc3N0aHJvdWdoKHN0YXJ0LCByLnRvdWNoRGF0YS5zdGFydHMpO1xuICAgICAgICBpZiAoYWxsb3dQYXNzdGhyb3VnaCkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBpZiAoIXIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbikge1xuICAgICAgICAgICAgci5kYXRhLmJnQWN0aXZlUG9zaXN0aW9uID0gYXJyYXkycG9pbnQoci50b3VjaERhdGEuc3RhcnRQb3NpdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyLnN3aXBlUGFubmluZykge1xuICAgICAgICAgICAgY3kucGFuQnkoe1xuICAgICAgICAgICAgICB4OiBkaXNwWzBdICogem9vbSxcbiAgICAgICAgICAgICAgeTogZGlzcFsxXSAqIHpvb21cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY3kuZW1pdCgnZHJhZ3BhbicpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNPdmVyVGhyZXNob2xkRHJhZykge1xuICAgICAgICAgICAgci5zd2lwZVBhbm5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgY3kucGFuQnkoe1xuICAgICAgICAgICAgICB4OiBkeCAqIHpvb20sXG4gICAgICAgICAgICAgIHk6IGR5ICogem9vbVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjeS5lbWl0KCdkcmFncGFuJyk7XG4gICAgICAgICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgICAgICAgc3RhcnQudW5hY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgICAgICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmUtcHJvamVjdFxuICAgICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICAgIG5vd1swXSA9IHBvc1swXTtcbiAgICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5vdy5sZW5ndGg7IGorKykge1xuICAgICAgZWFybGllcltqXSA9IG5vd1tqXTtcbiAgICB9XG5cbiAgICAvLyB0aGUgYWN0aXZlIGJnIGluZGljYXRvciBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIG1ha2luZyBhIHN3aXBlIHRoYXQgaXMgbmVpdGhlciBmb3IgZHJhZ2dpbmcgbm9kZXMgb3IgcGFubmluZ1xuICAgIGlmIChjYXB0dXJlICYmIGUudG91Y2hlcy5sZW5ndGggPiAwICYmICFyLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXMgJiYgIXIuc3dpcGVQYW5uaW5nICYmIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiAhPSBudWxsKSB7XG4gICAgICByLmRhdGEuYmdBY3RpdmVQb3Npc3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICByLnJlZHJhd0hpbnQoJ3NlbGVjdCcsIHRydWUpO1xuICAgICAgci5yZWRyYXcoKTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbiAgdmFyIHRvdWNoY2FuY2VsSGFuZGxlcjtcbiAgci5yZWdpc3RlckJpbmRpbmcoY29udGFpbmVyV2luZG93LCAndG91Y2hjYW5jZWwnLCB0b3VjaGNhbmNlbEhhbmRsZXIgPSBmdW5jdGlvbiB0b3VjaGNhbmNlbEhhbmRsZXIoZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgc3RhcnQgPSByLnRvdWNoRGF0YS5zdGFydDtcbiAgICByLnRvdWNoRGF0YS5jYXB0dXJlID0gZmFsc2U7XG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICBzdGFydC51bmFjdGl2YXRlKCk7XG4gICAgfVxuICB9KTtcbiAgdmFyIHRvdWNoZW5kSGFuZGxlciwgZGlkRG91YmxlVG91Y2gsIHRvdWNoVGltZW91dCwgcHJldlRvdWNoVGltZVN0YW1wO1xuICByLnJlZ2lzdGVyQmluZGluZyhjb250YWluZXJXaW5kb3csICd0b3VjaGVuZCcsIHRvdWNoZW5kSGFuZGxlciA9IGZ1bmN0aW9uIHRvdWNoZW5kSGFuZGxlcihlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciBzdGFydCA9IHIudG91Y2hEYXRhLnN0YXJ0O1xuICAgIHZhciBjYXB0dXJlID0gci50b3VjaERhdGEuY2FwdHVyZTtcbiAgICBpZiAoY2FwdHVyZSkge1xuICAgICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgci50b3VjaERhdGEuY2FwdHVyZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBzZWxlY3QgPSByLnNlbGVjdGlvbjtcbiAgICByLnN3aXBlUGFubmluZyA9IGZhbHNlO1xuICAgIHIuaG92ZXJEYXRhLmRyYWdnaW5nRWxlcyA9IGZhbHNlO1xuICAgIHZhciBjeSA9IHIuY3k7XG4gICAgdmFyIHpvb20gPSBjeS56b29tKCk7XG4gICAgdmFyIG5vdyA9IHIudG91Y2hEYXRhLm5vdztcbiAgICB2YXIgZWFybGllciA9IHIudG91Y2hEYXRhLmVhcmxpZXI7XG4gICAgaWYgKGUudG91Y2hlc1swXSkge1xuICAgICAgdmFyIHBvcyA9IHIucHJvamVjdEludG9WaWV3cG9ydChlLnRvdWNoZXNbMF0uY2xpZW50WCwgZS50b3VjaGVzWzBdLmNsaWVudFkpO1xuICAgICAgbm93WzBdID0gcG9zWzBdO1xuICAgICAgbm93WzFdID0gcG9zWzFdO1xuICAgIH1cbiAgICBpZiAoZS50b3VjaGVzWzFdKSB7XG4gICAgICB2YXIgcG9zID0gci5wcm9qZWN0SW50b1ZpZXdwb3J0KGUudG91Y2hlc1sxXS5jbGllbnRYLCBlLnRvdWNoZXNbMV0uY2xpZW50WSk7XG4gICAgICBub3dbMl0gPSBwb3NbMF07XG4gICAgICBub3dbM10gPSBwb3NbMV07XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIHZhciBwb3MgPSByLnByb2plY3RJbnRvVmlld3BvcnQoZS50b3VjaGVzWzJdLmNsaWVudFgsIGUudG91Y2hlc1syXS5jbGllbnRZKTtcbiAgICAgIG5vd1s0XSA9IHBvc1swXTtcbiAgICAgIG5vd1s1XSA9IHBvc1sxXTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICBzdGFydC51bmFjdGl2YXRlKCk7XG4gICAgfVxuICAgIHZhciBjdHhUYXBlbmQ7XG4gICAgaWYgKHIudG91Y2hEYXRhLmN4dCkge1xuICAgICAgY3R4VGFwZW5kID0ge1xuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0eXBlOiAnY3h0dGFwZW5kJyxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgeTogbm93WzFdXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgc3RhcnQuZW1pdChjdHhUYXBlbmQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3kuZW1pdChjdHhUYXBlbmQpO1xuICAgICAgfVxuICAgICAgaWYgKCFyLnRvdWNoRGF0YS5jeHREcmFnZ2VkKSB7XG4gICAgICAgIHZhciBjdHhUYXAgPSB7XG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgICB0eXBlOiAnY3h0dGFwJyxcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgeTogbm93WzFdXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgICBzdGFydC5lbWl0KGN0eFRhcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3kuZW1pdChjdHhUYXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoci50b3VjaERhdGEuc3RhcnQpIHtcbiAgICAgICAgci50b3VjaERhdGEuc3RhcnQuX3ByaXZhdGUuZ3JhYmJlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgci50b3VjaERhdGEuY3h0ID0gZmFsc2U7XG4gICAgICByLnRvdWNoRGF0YS5zdGFydCA9IG51bGw7XG4gICAgICByLnJlZHJhdygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG5vIG1vcmUgYm94IHNlbGVjdGlvbiBpZiB3ZSBkb24ndCBoYXZlIHRocmVlIGZpbmdlcnNcbiAgICBpZiAoIWUudG91Y2hlc1syXSAmJiBjeS5ib3hTZWxlY3Rpb25FbmFibGVkKCkgJiYgci50b3VjaERhdGEuc2VsZWN0aW5nKSB7XG4gICAgICByLnRvdWNoRGF0YS5zZWxlY3RpbmcgPSBmYWxzZTtcbiAgICAgIHZhciBib3ggPSBjeS5jb2xsZWN0aW9uKHIuZ2V0QWxsSW5Cb3goc2VsZWN0WzBdLCBzZWxlY3RbMV0sIHNlbGVjdFsyXSwgc2VsZWN0WzNdKSk7XG4gICAgICBzZWxlY3RbMF0gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbMV0gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbMl0gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbM10gPSB1bmRlZmluZWQ7XG4gICAgICBzZWxlY3RbNF0gPSAwO1xuICAgICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgICAgIGN5LmVtaXQoe1xuICAgICAgICB0eXBlOiAnYm94ZW5kJyxcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgeTogbm93WzFdXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdmFyIGVsZVdvdWxkQmVTZWxlY3RlZCA9IGZ1bmN0aW9uIGVsZVdvdWxkQmVTZWxlY3RlZChlbGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZS5zZWxlY3RhYmxlKCkgJiYgIWVsZS5zZWxlY3RlZCgpO1xuICAgICAgfTtcbiAgICAgIGJveC5lbWl0KCdib3gnKS5zdGRGaWx0ZXIoZWxlV291bGRCZVNlbGVjdGVkKS5zZWxlY3QoKS5lbWl0KCdib3hzZWxlY3QnKTtcbiAgICAgIGlmIChib3gubm9uZW1wdHkoKSkge1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHIucmVkcmF3KCk7XG4gICAgfVxuICAgIGlmIChzdGFydCAhPSBudWxsKSB7XG4gICAgICBzdGFydC51bmFjdGl2YXRlKCk7XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXNbMl0pIHtcbiAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChlLnRvdWNoZXNbMV0pIDsgZWxzZSBpZiAoZS50b3VjaGVzWzBdKSA7IGVsc2UgaWYgKCFlLnRvdWNoZXNbMF0pIHtcbiAgICAgIHIuZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHIucmVkcmF3SGludCgnc2VsZWN0JywgdHJ1ZSk7XG4gICAgICB2YXIgZHJhZ2dlZEVsZXMgPSByLmRyYWdEYXRhLnRvdWNoRHJhZ0VsZXM7XG4gICAgICBpZiAoc3RhcnQgIT0gbnVsbCkge1xuICAgICAgICB2YXIgc3RhcnRXYXNHcmFiYmVkID0gc3RhcnQuX3ByaXZhdGUuZ3JhYmJlZDtcbiAgICAgICAgZnJlZURyYWdnZWRFbGVtZW50cyhkcmFnZ2VkRWxlcyk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgICAgaWYgKHN0YXJ0V2FzR3JhYmJlZCkge1xuICAgICAgICAgIHN0YXJ0LmVtaXQoJ2ZyZWVvbicpO1xuICAgICAgICAgIGRyYWdnZWRFbGVzLmVtaXQoJ2ZyZWUnKTtcbiAgICAgICAgICBpZiAoci5kcmFnRGF0YS5kaWREcmFnKSB7XG4gICAgICAgICAgICBzdGFydC5lbWl0KCdkcmFnZnJlZW9uJyk7XG4gICAgICAgICAgICBkcmFnZ2VkRWxlcy5lbWl0KCdkcmFnZnJlZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnRzKHN0YXJ0LCBbJ3RvdWNoZW5kJywgJ3RhcGVuZCcsICd2bW91c2V1cCcsICd0YXBkcmFnb3V0J10sIGUsIHtcbiAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgeTogbm93WzFdXG4gICAgICAgIH0pO1xuICAgICAgICBzdGFydC51bmFjdGl2YXRlKCk7XG4gICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0ID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBuZWFyID0gci5maW5kTmVhcmVzdEVsZW1lbnQobm93WzBdLCBub3dbMV0sIHRydWUsIHRydWUpO1xuICAgICAgICB0cmlnZ2VyRXZlbnRzKG5lYXIsIFsndG91Y2hlbmQnLCAndGFwZW5kJywgJ3Ztb3VzZXVwJywgJ3RhcGRyYWdvdXQnXSwgZSwge1xuICAgICAgICAgIHg6IG5vd1swXSxcbiAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB2YXIgZHggPSByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uWzBdIC0gbm93WzBdO1xuICAgICAgdmFyIGR4MiA9IGR4ICogZHg7XG4gICAgICB2YXIgZHkgPSByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uWzFdIC0gbm93WzFdO1xuICAgICAgdmFyIGR5MiA9IGR5ICogZHk7XG4gICAgICB2YXIgZGlzdDIgPSBkeDIgKyBkeTI7XG4gICAgICB2YXIgcmRpc3QyID0gZGlzdDIgKiB6b29tICogem9vbTtcblxuICAgICAgLy8gVGFwIGV2ZW50LCByb3VnaGx5IHNhbWUgYXMgbW91c2UgY2xpY2sgZXZlbnQgZm9yIHRvdWNoXG4gICAgICBpZiAoIXIudG91Y2hEYXRhLnNpbmdsZVRvdWNoTW92ZWQpIHtcbiAgICAgICAgaWYgKCFzdGFydCkge1xuICAgICAgICAgIGN5LiQoJzpzZWxlY3RlZCcpLnVuc2VsZWN0KFsndGFwdW5zZWxlY3QnXSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50cyhzdGFydCwgWyd0YXAnLCAndmNsaWNrJ10sIGUsIHtcbiAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgeTogbm93WzFdXG4gICAgICAgIH0pO1xuICAgICAgICBkaWREb3VibGVUb3VjaCA9IGZhbHNlO1xuICAgICAgICBpZiAoZS50aW1lU3RhbXAgLSBwcmV2VG91Y2hUaW1lU3RhbXAgPD0gY3kubXVsdGlDbGlja0RlYm91bmNlVGltZSgpKSB7XG4gICAgICAgICAgdG91Y2hUaW1lb3V0ICYmIGNsZWFyVGltZW91dCh0b3VjaFRpbWVvdXQpO1xuICAgICAgICAgIGRpZERvdWJsZVRvdWNoID0gdHJ1ZTtcbiAgICAgICAgICBwcmV2VG91Y2hUaW1lU3RhbXAgPSBudWxsO1xuICAgICAgICAgIHRyaWdnZXJFdmVudHMoc3RhcnQsIFsnZGJsdGFwJywgJ3ZkYmxjbGljayddLCBlLCB7XG4gICAgICAgICAgICB4OiBub3dbMF0sXG4gICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b3VjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChkaWREb3VibGVUb3VjaCkgcmV0dXJuO1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50cyhzdGFydCwgWydvbmV0YXAnLCAndm9uZWNsaWNrJ10sIGUsIHtcbiAgICAgICAgICAgICAgeDogbm93WzBdLFxuICAgICAgICAgICAgICB5OiBub3dbMV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIGN5Lm11bHRpQ2xpY2tEZWJvdW5jZVRpbWUoKSk7XG4gICAgICAgICAgcHJldlRvdWNoVGltZVN0YW1wID0gZS50aW1lU3RhbXA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUHJlcGFyZSB0byBzZWxlY3QgdGhlIGN1cnJlbnRseSB0b3VjaGVkIG5vZGUsIG9ubHkgaWYgaXQgaGFzbid0IGJlZW4gZHJhZ2dlZCBwYXN0IGEgY2VydGFpbiBkaXN0YW5jZVxuICAgICAgaWYgKHN0YXJ0ICE9IG51bGwgJiYgIXIuZHJhZ0RhdGEuZGlkRHJhZyAvLyBkaWRuJ3QgZHJhZyBub2RlcyBhcm91bmRcbiAgICAgICYmIHN0YXJ0Ll9wcml2YXRlLnNlbGVjdGFibGUgJiYgcmRpc3QyIDwgci50b3VjaFRhcFRocmVzaG9sZDIgJiYgIXIucGluY2hpbmcgLy8gcGluY2ggdG8gem9vbSBzaG91bGQgbm90IGFmZmVjdCBzZWxlY3Rpb25cbiAgICAgICkge1xuICAgICAgICBpZiAoY3kuc2VsZWN0aW9uVHlwZSgpID09PSAnc2luZ2xlJykge1xuICAgICAgICAgIGN5LiQoaXNTZWxlY3RlZCkudW5tZXJnZShzdGFydCkudW5zZWxlY3QoWyd0YXB1bnNlbGVjdCddKTtcbiAgICAgICAgICBzdGFydC5zZWxlY3QoWyd0YXBzZWxlY3QnXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHN0YXJ0LnNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHN0YXJ0LnVuc2VsZWN0KFsndGFwdW5zZWxlY3QnXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0LnNlbGVjdChbJ3RhcHNlbGVjdCddKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICByLnRvdWNoRGF0YS5zaW5nbGVUb3VjaE1vdmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBub3cubGVuZ3RoOyBqKyspIHtcbiAgICAgIGVhcmxpZXJbal0gPSBub3dbal07XG4gICAgfVxuICAgIHIuZHJhZ0RhdGEuZGlkRHJhZyA9IGZhbHNlOyAvLyByZXNldCBmb3IgbmV4dCB0b3VjaHN0YXJ0XG5cbiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgci50b3VjaERhdGEuZHJhZ0RlbHRhID0gW107XG4gICAgICByLnRvdWNoRGF0YS5zdGFydFBvc2l0aW9uID0gW251bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGxdO1xuICAgICAgci50b3VjaERhdGEuc3RhcnRHUG9zaXRpb24gPSBudWxsO1xuICAgICAgci50b3VjaERhdGEuZGlkU2VsZWN0ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoIDwgMikge1xuICAgICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gdGhlIG9sZCBzdGFydCBnbG9iYWwgcG9zJ24gbWF5IG5vdCBiZSB0aGUgc2FtZSBmaW5nZXIgdGhhdCByZW1haW5zXG4gICAgICAgIHIudG91Y2hEYXRhLnN0YXJ0R1Bvc2l0aW9uID0gW2UudG91Y2hlc1swXS5jbGllbnRYLCBlLnRvdWNoZXNbMF0uY2xpZW50WV07XG4gICAgICB9XG4gICAgICByLnBpbmNoaW5nID0gZmFsc2U7XG4gICAgICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgICAgIHIucmVkcmF3KCk7XG4gICAgfVxuXG4gICAgLy9yLnJlZHJhdygpO1xuICB9LCBmYWxzZSk7XG5cbiAgLy8gZmFsbGJhY2sgY29tcGF0aWJpbGl0eSBsYXllciBmb3IgbXMgcG9pbnRlciBldmVudHNcbiAgaWYgKHR5cGVvZiBUb3VjaEV2ZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgIHZhciBwb2ludGVycyA9IFtdO1xuICAgIHZhciBtYWtlVG91Y2ggPSBmdW5jdGlvbiBtYWtlVG91Y2goZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2xpZW50WDogZS5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiBlLmNsaWVudFksXG4gICAgICAgIGZvcmNlOiAxLFxuICAgICAgICBpZGVudGlmaWVyOiBlLnBvaW50ZXJJZCxcbiAgICAgICAgcGFnZVg6IGUucGFnZVgsXG4gICAgICAgIHBhZ2VZOiBlLnBhZ2VZLFxuICAgICAgICByYWRpdXNYOiBlLndpZHRoIC8gMixcbiAgICAgICAgcmFkaXVzWTogZS5oZWlnaHQgLyAyLFxuICAgICAgICBzY3JlZW5YOiBlLnNjcmVlblgsXG4gICAgICAgIHNjcmVlblk6IGUuc2NyZWVuWSxcbiAgICAgICAgdGFyZ2V0OiBlLnRhcmdldFxuICAgICAgfTtcbiAgICB9O1xuICAgIHZhciBtYWtlUG9pbnRlciA9IGZ1bmN0aW9uIG1ha2VQb2ludGVyKGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV2ZW50OiBlLFxuICAgICAgICB0b3VjaDogbWFrZVRvdWNoKGUpXG4gICAgICB9O1xuICAgIH07XG4gICAgdmFyIGFkZFBvaW50ZXIgPSBmdW5jdGlvbiBhZGRQb2ludGVyKGUpIHtcbiAgICAgIHBvaW50ZXJzLnB1c2gobWFrZVBvaW50ZXIoZSkpO1xuICAgIH07XG4gICAgdmFyIHJlbW92ZVBvaW50ZXIgPSBmdW5jdGlvbiByZW1vdmVQb2ludGVyKGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHAgPSBwb2ludGVyc1tpXTtcbiAgICAgICAgaWYgKHAuZXZlbnQucG9pbnRlcklkID09PSBlLnBvaW50ZXJJZCkge1xuICAgICAgICAgIHBvaW50ZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciB1cGRhdGVQb2ludGVyID0gZnVuY3Rpb24gdXBkYXRlUG9pbnRlcihlKSB7XG4gICAgICB2YXIgcCA9IHBvaW50ZXJzLmZpbHRlcihmdW5jdGlvbiAocCkge1xuICAgICAgICByZXR1cm4gcC5ldmVudC5wb2ludGVySWQgPT09IGUucG9pbnRlcklkO1xuICAgICAgfSlbMF07XG4gICAgICBwLmV2ZW50ID0gZTtcbiAgICAgIHAudG91Y2ggPSBtYWtlVG91Y2goZSk7XG4gICAgfTtcbiAgICB2YXIgYWRkVG91Y2hlc1RvRXZlbnQgPSBmdW5jdGlvbiBhZGRUb3VjaGVzVG9FdmVudChlKSB7XG4gICAgICBlLnRvdWNoZXMgPSBwb2ludGVycy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcmV0dXJuIHAudG91Y2g7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHZhciBwb2ludGVySXNNb3VzZSA9IGZ1bmN0aW9uIHBvaW50ZXJJc01vdXNlKGUpIHtcbiAgICAgIHJldHVybiBlLnBvaW50ZXJUeXBlID09PSAnbW91c2UnIHx8IGUucG9pbnRlclR5cGUgPT09IDQ7XG4gICAgfTtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ3BvaW50ZXJkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChwb2ludGVySXNNb3VzZShlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIG1vdXNlIGFscmVhZHkgaGFuZGxlZFxuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBhZGRQb2ludGVyKGUpO1xuICAgICAgYWRkVG91Y2hlc1RvRXZlbnQoZSk7XG4gICAgICB0b3VjaHN0YXJ0SGFuZGxlcihlKTtcbiAgICB9KTtcbiAgICByLnJlZ2lzdGVyQmluZGluZyhyLmNvbnRhaW5lciwgJ3BvaW50ZXJ1cCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAocG9pbnRlcklzTW91c2UoZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBtb3VzZSBhbHJlYWR5IGhhbmRsZWRcblxuICAgICAgcmVtb3ZlUG9pbnRlcihlKTtcbiAgICAgIGFkZFRvdWNoZXNUb0V2ZW50KGUpO1xuICAgICAgdG91Y2hlbmRIYW5kbGVyKGUpO1xuICAgIH0pO1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAncG9pbnRlcmNhbmNlbCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAocG9pbnRlcklzTW91c2UoZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBtb3VzZSBhbHJlYWR5IGhhbmRsZWRcblxuICAgICAgcmVtb3ZlUG9pbnRlcihlKTtcbiAgICAgIGFkZFRvdWNoZXNUb0V2ZW50KGUpO1xuICAgICAgdG91Y2hjYW5jZWxIYW5kbGVyKGUpO1xuICAgIH0pO1xuICAgIHIucmVnaXN0ZXJCaW5kaW5nKHIuY29udGFpbmVyLCAncG9pbnRlcm1vdmUnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKHBvaW50ZXJJc01vdXNlKGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gbW91c2UgYWxyZWFkeSBoYW5kbGVkXG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHVwZGF0ZVBvaW50ZXIoZSk7XG4gICAgICBhZGRUb3VjaGVzVG9FdmVudChlKTtcbiAgICAgIHRvdWNobW92ZUhhbmRsZXIoZSk7XG4gICAgfSk7XG4gIH1cbn07XG5cbnZhciBCUnAkMiA9IHt9O1xuQlJwJDIuZ2VuZXJhdGVQb2x5Z29uID0gZnVuY3Rpb24gKG5hbWUsIHBvaW50cykge1xuICByZXR1cm4gdGhpcy5ub2RlU2hhcGVzW25hbWVdID0ge1xuICAgIHJlbmRlcmVyOiB0aGlzLFxuICAgIG5hbWU6IG5hbWUsXG4gICAgcG9pbnRzOiBwb2ludHMsXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCgncG9seWdvbicsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHRoaXMucG9pbnRzKTtcbiAgICB9LFxuICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIGludGVyc2VjdExpbmUobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHJldHVybiBwb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCB0aGlzLnBvaW50cywgbm9kZVgsIG5vZGVZLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIsIHBhZGRpbmcpO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHJldHVybiBwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIFswLCAtMV0sIHBhZGRpbmcpO1xuICAgIH1cbiAgfTtcbn07XG5CUnAkMi5nZW5lcmF0ZUVsbGlwc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbJ2VsbGlwc2UnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAnZWxsaXBzZScsXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCh0aGlzLm5hbWUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpO1xuICAgIH0sXG4gICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gaW50ZXJzZWN0TGluZShub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcsIGNvcm5lclJhZGl1cykge1xuICAgICAgcmV0dXJuIGludGVyc2VjdExpbmVFbGxpcHNlKHgsIHksIG5vZGVYLCBub2RlWSwgd2lkdGggLyAyICsgcGFkZGluZywgaGVpZ2h0IC8gMiArIHBhZGRpbmcpO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHJldHVybiBjaGVja0luRWxsaXBzZSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBwYWRkaW5nKTtcbiAgICB9XG4gIH07XG59O1xuQlJwJDIuZ2VuZXJhdGVSb3VuZFBvbHlnb24gPSBmdW5jdGlvbiAobmFtZSwgcG9pbnRzKSB7XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbbmFtZV0gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogbmFtZSxcbiAgICBwb2ludHM6IHBvaW50cyxcbiAgICBnZXRPckNyZWF0ZUNvcm5lcnM6IGZ1bmN0aW9uIGdldE9yQ3JlYXRlQ29ybmVycyhjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzLCBmaWVsZCkge1xuICAgICAgaWYgKHJzW2ZpZWxkXSAhPT0gdW5kZWZpbmVkICYmIHJzW2ZpZWxkICsgJy1jeCddID09PSBjZW50ZXJYICYmIHJzW2ZpZWxkICsgJy1jeSddID09PSBjZW50ZXJZKSB7XG4gICAgICAgIHJldHVybiByc1tmaWVsZF07XG4gICAgICB9XG4gICAgICByc1tmaWVsZF0gPSBuZXcgQXJyYXkocG9pbnRzLmxlbmd0aCAvIDIpO1xuICAgICAgcnNbZmllbGQgKyAnLWN4J10gPSBjZW50ZXJYO1xuICAgICAgcnNbZmllbGQgKyAnLWN5J10gPSBjZW50ZXJZO1xuICAgICAgdmFyIGhhbGZXID0gd2lkdGggLyAyO1xuICAgICAgdmFyIGhhbGZIID0gaGVpZ2h0IC8gMjtcbiAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRQb2x5Z29uUmFkaXVzKHdpZHRoLCBoZWlnaHQpIDogY29ybmVyUmFkaXVzO1xuICAgICAgdmFyIHAgPSBuZXcgQXJyYXkocG9pbnRzLmxlbmd0aCAvIDIpO1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHBvaW50cy5sZW5ndGggLyAyOyBfaSsrKSB7XG4gICAgICAgIHBbX2ldID0ge1xuICAgICAgICAgIHg6IGNlbnRlclggKyBoYWxmVyAqIHBvaW50c1tfaSAqIDJdLFxuICAgICAgICAgIHk6IGNlbnRlclkgKyBoYWxmSCAqIHBvaW50c1tfaSAqIDIgKyAxXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIGksXG4gICAgICAgIHAxLFxuICAgICAgICBwMixcbiAgICAgICAgcDMsXG4gICAgICAgIGxlbiA9IHAubGVuZ3RoO1xuICAgICAgcDEgPSBwW2xlbiAtIDFdO1xuICAgICAgLy8gZm9yIGVhY2ggcG9pbnRcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBwMiA9IHBbaSAlIGxlbl07XG4gICAgICAgIHAzID0gcFsoaSArIDEpICUgbGVuXTtcbiAgICAgICAgcnNbZmllbGRdW2ldID0gZ2V0Um91bmRDb3JuZXIocDEsIHAyLCBwMywgY29ybmVyUmFkaXVzKTtcbiAgICAgICAgcDEgPSBwMjtcbiAgICAgICAgcDIgPSBwMztcbiAgICAgIH1cbiAgICAgIHJldHVybiByc1tmaWVsZF07XG4gICAgfSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cywgcnMpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCgncm91bmQtcG9seWdvbicsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHRoaXMucG9pbnRzLCB0aGlzLmdldE9yQ3JlYXRlQ29ybmVycyhjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzLCAnZHJhd0Nvcm5lcnMnKSk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZywgY29ybmVyUmFkaXVzLCBycykge1xuICAgICAgcmV0dXJuIHJvdW5kUG9seWdvbkludGVyc2VjdExpbmUoeCwgeSwgdGhpcy5wb2ludHMsIG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZywgdGhpcy5nZXRPckNyZWF0ZUNvcm5lcnMobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzLCAnY29ybmVycycpKTtcbiAgICB9LFxuICAgIGNoZWNrUG9pbnQ6IGZ1bmN0aW9uIGNoZWNrUG9pbnQoeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSwgY29ybmVyUmFkaXVzLCBycykge1xuICAgICAgcmV0dXJuIHBvaW50SW5zaWRlUm91bmRQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB0aGlzLmdldE9yQ3JlYXRlQ29ybmVycyhjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHJzLCAnY29ybmVycycpKTtcbiAgICB9XG4gIH07XG59O1xuQlJwJDIuZ2VuZXJhdGVSb3VuZFJlY3RhbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1sncm91bmQtcmVjdGFuZ2xlJ10gPSB0aGlzLm5vZGVTaGFwZXNbJ3JvdW5kcmVjdGFuZ2xlJ10gPSB7XG4gICAgcmVuZGVyZXI6IHRoaXMsXG4gICAgbmFtZTogJ3JvdW5kLXJlY3RhbmdsZScsXG4gICAgcG9pbnRzOiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCksXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCh0aGlzLm5hbWUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHRoaXMucG9pbnRzLCBjb3JuZXJSYWRpdXMpO1xuICAgIH0sXG4gICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gaW50ZXJzZWN0TGluZShub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcsIGNvcm5lclJhZGl1cykge1xuICAgICAgcmV0dXJuIHJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSh4LCB5LCBub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcsIGNvcm5lclJhZGl1cyk7XG4gICAgfSxcbiAgICBjaGVja1BvaW50OiBmdW5jdGlvbiBjaGVja1BvaW50KHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIGNvcm5lclJhZGl1cykge1xuICAgICAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCkgOiBjb3JuZXJSYWRpdXM7XG4gICAgICBjb3JuZXJSYWRpdXMgPSBNYXRoLm1pbihoYWxmV2lkdGgsIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyk7XG4gICAgICB2YXIgZGlhbSA9IGNvcm5lclJhZGl1cyAqIDI7XG5cbiAgICAgIC8vIENoZWNrIGhCb3hcbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQgLSBkaWFtLCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSBkaWFtLCBoZWlnaHQsIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayB0b3AgbGVmdCBxdWFydGVyIGNpcmNsZVxuICAgICAgaWYgKGNoZWNrSW5FbGxpcHNlKHgsIHksIGRpYW0sIGRpYW0sIGNlbnRlclggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXMsIGNlbnRlclkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdG9wIHJpZ2h0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cywgY2VudGVyWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBib3R0b20gcmlnaHQgcXVhcnRlciBjaXJjbGVcbiAgICAgIGlmIChjaGVja0luRWxsaXBzZSh4LCB5LCBkaWFtLCBkaWFtLCBjZW50ZXJYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzLCBjZW50ZXJZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cywgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGJvdHRvbSBsZWZ0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCAtIGhhbGZXaWR0aCArIGNvcm5lclJhZGl1cywgY2VudGVyWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbn07XG5CUnAkMi5nZW5lcmF0ZUN1dFJlY3RhbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubm9kZVNoYXBlc1snY3V0LXJlY3RhbmdsZSddID0gdGhpcy5ub2RlU2hhcGVzWydjdXRyZWN0YW5nbGUnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAnY3V0LXJlY3RhbmdsZScsXG4gICAgY29ybmVyTGVuZ3RoOiBnZXRDdXRSZWN0YW5nbGVDb3JuZXJMZW5ndGgoKSxcbiAgICBwb2ludHM6IGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cykge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgbnVsbCwgY29ybmVyUmFkaXVzKTtcbiAgICB9LFxuICAgIGdlbmVyYXRlQ3V0VHJpYW5nbGVQdHM6IGZ1bmN0aW9uIGdlbmVyYXRlQ3V0VHJpYW5nbGVQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSwgY29ybmVyUmFkaXVzKSB7XG4gICAgICB2YXIgY2wgPSBjb3JuZXJSYWRpdXMgPT09ICdhdXRvJyA/IHRoaXMuY29ybmVyTGVuZ3RoIDogY29ybmVyUmFkaXVzO1xuICAgICAgdmFyIGhoID0gaGVpZ2h0IC8gMjtcbiAgICAgIHZhciBodyA9IHdpZHRoIC8gMjtcbiAgICAgIHZhciB4QmVnaW4gPSBjZW50ZXJYIC0gaHc7XG4gICAgICB2YXIgeEVuZCA9IGNlbnRlclggKyBodztcbiAgICAgIHZhciB5QmVnaW4gPSBjZW50ZXJZIC0gaGg7XG4gICAgICB2YXIgeUVuZCA9IGNlbnRlclkgKyBoaDtcblxuICAgICAgLy8gcG9pbnRzIGFyZSBpbiBjbG9ja3dpc2Ugb3JkZXIsIGlubmVyIChpbWFnaW5hcnkpIHRyaWFuZ2xlIHB0IG9uIFs0LCA1XVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9wTGVmdDogW3hCZWdpbiwgeUJlZ2luICsgY2wsIHhCZWdpbiArIGNsLCB5QmVnaW4sIHhCZWdpbiArIGNsLCB5QmVnaW4gKyBjbF0sXG4gICAgICAgIHRvcFJpZ2h0OiBbeEVuZCAtIGNsLCB5QmVnaW4sIHhFbmQsIHlCZWdpbiArIGNsLCB4RW5kIC0gY2wsIHlCZWdpbiArIGNsXSxcbiAgICAgICAgYm90dG9tUmlnaHQ6IFt4RW5kLCB5RW5kIC0gY2wsIHhFbmQgLSBjbCwgeUVuZCwgeEVuZCAtIGNsLCB5RW5kIC0gY2xdLFxuICAgICAgICBib3R0b21MZWZ0OiBbeEJlZ2luICsgY2wsIHlFbmQsIHhCZWdpbiwgeUVuZCAtIGNsLCB4QmVnaW4gKyBjbCwgeUVuZCAtIGNsXVxuICAgICAgfTtcbiAgICB9LFxuICAgIGludGVyc2VjdExpbmU6IGZ1bmN0aW9uIGludGVyc2VjdExpbmUobm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHZhciBjUHRzID0gdGhpcy5nZW5lcmF0ZUN1dFRyaWFuZ2xlUHRzKHdpZHRoICsgMiAqIHBhZGRpbmcsIGhlaWdodCArIDIgKiBwYWRkaW5nLCBub2RlWCwgbm9kZVksIGNvcm5lclJhZGl1cyk7XG4gICAgICB2YXIgcHRzID0gW10uY29uY2F0LmFwcGx5KFtdLCBbY1B0cy50b3BMZWZ0LnNwbGljZSgwLCA0KSwgY1B0cy50b3BSaWdodC5zcGxpY2UoMCwgNCksIGNQdHMuYm90dG9tUmlnaHQuc3BsaWNlKDAsIDQpLCBjUHRzLmJvdHRvbUxlZnQuc3BsaWNlKDAsIDQpXSk7XG4gICAgICByZXR1cm4gcG9seWdvbkludGVyc2VjdExpbmUoeCwgeSwgcHRzLCBub2RlWCwgbm9kZVkpO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHZhciBjbCA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gdGhpcy5jb3JuZXJMZW5ndGggOiBjb3JuZXJSYWRpdXM7XG4gICAgICAvLyBDaGVjayBoQm94XG4gICAgICBpZiAocG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHRoaXMucG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0IC0gMiAqIGNsLCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSAyICogY2wsIGhlaWdodCwgWzAsIC0xXSwgcGFkZGluZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICB2YXIgY3V0VHJpYW5nbGVQdHMgPSB0aGlzLmdlbmVyYXRlQ3V0VHJpYW5nbGVQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSk7XG4gICAgICByZXR1cm4gcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIGN1dFRyaWFuZ2xlUHRzLnRvcExlZnQpIHx8IHBvaW50SW5zaWRlUG9seWdvblBvaW50cyh4LCB5LCBjdXRUcmlhbmdsZVB0cy50b3BSaWdodCkgfHwgcG9pbnRJbnNpZGVQb2x5Z29uUG9pbnRzKHgsIHksIGN1dFRyaWFuZ2xlUHRzLmJvdHRvbVJpZ2h0KSB8fCBwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgY3V0VHJpYW5nbGVQdHMuYm90dG9tTGVmdCk7XG4gICAgfVxuICB9O1xufTtcbkJScCQyLmdlbmVyYXRlQmFycmVsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5ub2RlU2hhcGVzWydiYXJyZWwnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAnYmFycmVsJyxcbiAgICBwb2ludHM6IGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKSxcbiAgICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lclJhZGl1cykge1xuICAgICAgdGhpcy5yZW5kZXJlci5ub2RlU2hhcGVJbXBsKHRoaXMubmFtZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgfSxcbiAgICBpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZywgY29ybmVyUmFkaXVzKSB7XG4gICAgICAvLyB1c2UgdHdvIGZpeGVkIHQgdmFsdWVzIGZvciB0aGUgYmV6aWVyIGN1cnZlIGFwcHJveGltYXRpb25cblxuICAgICAgdmFyIHQwID0gMC4xNTtcbiAgICAgIHZhciB0MSA9IDAuNTtcbiAgICAgIHZhciB0MiA9IDAuODU7XG4gICAgICB2YXIgYlB0cyA9IHRoaXMuZ2VuZXJhdGVCYXJyZWxCZXppZXJQdHMod2lkdGggKyAyICogcGFkZGluZywgaGVpZ2h0ICsgMiAqIHBhZGRpbmcsIG5vZGVYLCBub2RlWSk7XG4gICAgICB2YXIgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyA9IGZ1bmN0aW9uIGFwcHJveGltYXRlQmFycmVsQ3VydmVQdHMocHRzKSB7XG4gICAgICAgIC8vIGFwcHJveGltYXRlIGN1cnZlIHB0cyBiYXNlZCBvbiB0aGUgdHdvIHQgdmFsdWVzXG4gICAgICAgIHZhciBtMCA9IHFiZXppZXJQdEF0KHtcbiAgICAgICAgICB4OiBwdHNbMF0sXG4gICAgICAgICAgeTogcHRzWzFdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBwdHNbMl0sXG4gICAgICAgICAgeTogcHRzWzNdXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB4OiBwdHNbNF0sXG4gICAgICAgICAgeTogcHRzWzVdXG4gICAgICAgIH0sIHQwKTtcbiAgICAgICAgdmFyIG0xID0gcWJlemllclB0QXQoe1xuICAgICAgICAgIHg6IHB0c1swXSxcbiAgICAgICAgICB5OiBwdHNbMV1cbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IHB0c1syXSxcbiAgICAgICAgICB5OiBwdHNbM11cbiAgICAgICAgfSwge1xuICAgICAgICAgIHg6IHB0c1s0XSxcbiAgICAgICAgICB5OiBwdHNbNV1cbiAgICAgICAgfSwgdDEpO1xuICAgICAgICB2YXIgbTIgPSBxYmV6aWVyUHRBdCh7XG4gICAgICAgICAgeDogcHRzWzBdLFxuICAgICAgICAgIHk6IHB0c1sxXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcHRzWzJdLFxuICAgICAgICAgIHk6IHB0c1szXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogcHRzWzRdLFxuICAgICAgICAgIHk6IHB0c1s1XVxuICAgICAgICB9LCB0Mik7XG4gICAgICAgIHJldHVybiBbcHRzWzBdLCBwdHNbMV0sIG0wLngsIG0wLnksIG0xLngsIG0xLnksIG0yLngsIG0yLnksIHB0c1s0XSwgcHRzWzVdXTtcbiAgICAgIH07XG4gICAgICB2YXIgcHRzID0gW10uY29uY2F0KGFwcHJveGltYXRlQmFycmVsQ3VydmVQdHMoYlB0cy50b3BMZWZ0KSwgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyhiUHRzLnRvcFJpZ2h0KSwgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyhiUHRzLmJvdHRvbVJpZ2h0KSwgYXBwcm94aW1hdGVCYXJyZWxDdXJ2ZVB0cyhiUHRzLmJvdHRvbUxlZnQpKTtcbiAgICAgIHJldHVybiBwb2x5Z29uSW50ZXJzZWN0TGluZSh4LCB5LCBwdHMsIG5vZGVYLCBub2RlWSk7XG4gICAgfSxcbiAgICBnZW5lcmF0ZUJhcnJlbEJlemllclB0czogZnVuY3Rpb24gZ2VuZXJhdGVCYXJyZWxCZXppZXJQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSkge1xuICAgICAgdmFyIGhoID0gaGVpZ2h0IC8gMjtcbiAgICAgIHZhciBodyA9IHdpZHRoIC8gMjtcbiAgICAgIHZhciB4QmVnaW4gPSBjZW50ZXJYIC0gaHc7XG4gICAgICB2YXIgeEVuZCA9IGNlbnRlclggKyBodztcbiAgICAgIHZhciB5QmVnaW4gPSBjZW50ZXJZIC0gaGg7XG4gICAgICB2YXIgeUVuZCA9IGNlbnRlclkgKyBoaDtcbiAgICAgIHZhciBjdXJ2ZUNvbnN0YW50cyA9IGdldEJhcnJlbEN1cnZlQ29uc3RhbnRzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdmFyIGhPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy5oZWlnaHRPZmZzZXQ7XG4gICAgICB2YXIgd09mZnNldCA9IGN1cnZlQ29uc3RhbnRzLndpZHRoT2Zmc2V0O1xuICAgICAgdmFyIGN0cmxQdFhPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy5jdHJsUHRPZmZzZXRQY3QgKiB3aWR0aDtcblxuICAgICAgLy8gcG9pbnRzIGFyZSBpbiBjbG9ja3dpc2Ugb3JkZXIsIGlubmVyIChpbWFnaW5hcnkpIGNvbnRyb2wgcHQgb24gWzQsIDVdXG4gICAgICB2YXIgcHRzID0ge1xuICAgICAgICB0b3BMZWZ0OiBbeEJlZ2luLCB5QmVnaW4gKyBoT2Zmc2V0LCB4QmVnaW4gKyBjdHJsUHRYT2Zmc2V0LCB5QmVnaW4sIHhCZWdpbiArIHdPZmZzZXQsIHlCZWdpbl0sXG4gICAgICAgIHRvcFJpZ2h0OiBbeEVuZCAtIHdPZmZzZXQsIHlCZWdpbiwgeEVuZCAtIGN0cmxQdFhPZmZzZXQsIHlCZWdpbiwgeEVuZCwgeUJlZ2luICsgaE9mZnNldF0sXG4gICAgICAgIGJvdHRvbVJpZ2h0OiBbeEVuZCwgeUVuZCAtIGhPZmZzZXQsIHhFbmQgLSBjdHJsUHRYT2Zmc2V0LCB5RW5kLCB4RW5kIC0gd09mZnNldCwgeUVuZF0sXG4gICAgICAgIGJvdHRvbUxlZnQ6IFt4QmVnaW4gKyB3T2Zmc2V0LCB5RW5kLCB4QmVnaW4gKyBjdHJsUHRYT2Zmc2V0LCB5RW5kLCB4QmVnaW4sIHlFbmQgLSBoT2Zmc2V0XVxuICAgICAgfTtcbiAgICAgIHB0cy50b3BMZWZ0LmlzVG9wID0gdHJ1ZTtcbiAgICAgIHB0cy50b3BSaWdodC5pc1RvcCA9IHRydWU7XG4gICAgICBwdHMuYm90dG9tTGVmdC5pc0JvdHRvbSA9IHRydWU7XG4gICAgICBwdHMuYm90dG9tUmlnaHQuaXNCb3R0b20gPSB0cnVlO1xuICAgICAgcmV0dXJuIHB0cztcbiAgICB9LFxuICAgIGNoZWNrUG9pbnQ6IGZ1bmN0aW9uIGNoZWNrUG9pbnQoeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSwgY29ybmVyUmFkaXVzKSB7XG4gICAgICB2YXIgY3VydmVDb25zdGFudHMgPSBnZXRCYXJyZWxDdXJ2ZUNvbnN0YW50cyh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHZhciBoT2Zmc2V0ID0gY3VydmVDb25zdGFudHMuaGVpZ2h0T2Zmc2V0O1xuICAgICAgdmFyIHdPZmZzZXQgPSBjdXJ2ZUNvbnN0YW50cy53aWR0aE9mZnNldDtcblxuICAgICAgLy8gQ2hlY2sgaEJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCAtIDIgKiBoT2Zmc2V0LCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSAyICogd09mZnNldCwgaGVpZ2h0LCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBiYXJyZWxDdXJ2ZVB0cyA9IHRoaXMuZ2VuZXJhdGVCYXJyZWxCZXppZXJQdHMod2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSk7XG4gICAgICB2YXIgZ2V0Q3VydmVUID0gZnVuY3Rpb24gZ2V0Q3VydmVUKHgsIHksIGN1cnZlUHRzKSB7XG4gICAgICAgIHZhciB4MCA9IGN1cnZlUHRzWzRdO1xuICAgICAgICB2YXIgeDEgPSBjdXJ2ZVB0c1syXTtcbiAgICAgICAgdmFyIHgyID0gY3VydmVQdHNbMF07XG4gICAgICAgIHZhciB5MCA9IGN1cnZlUHRzWzVdO1xuICAgICAgICAvLyB2YXIgeTEgPSBjdXJ2ZVB0c1sgMyBdO1xuICAgICAgICB2YXIgeTIgPSBjdXJ2ZVB0c1sxXTtcbiAgICAgICAgdmFyIHhNaW4gPSBNYXRoLm1pbih4MCwgeDIpO1xuICAgICAgICB2YXIgeE1heCA9IE1hdGgubWF4KHgwLCB4Mik7XG4gICAgICAgIHZhciB5TWluID0gTWF0aC5taW4oeTAsIHkyKTtcbiAgICAgICAgdmFyIHlNYXggPSBNYXRoLm1heCh5MCwgeTIpO1xuICAgICAgICBpZiAoeE1pbiA8PSB4ICYmIHggPD0geE1heCAmJiB5TWluIDw9IHkgJiYgeSA8PSB5TWF4KSB7XG4gICAgICAgICAgdmFyIGNvZWZmID0gYmV6aWVyUHRzVG9RdWFkQ29lZmYoeDAsIHgxLCB4Mik7XG4gICAgICAgICAgdmFyIHJvb3RzID0gc29sdmVRdWFkcmF0aWMoY29lZmZbMF0sIGNvZWZmWzFdLCBjb2VmZlsyXSwgeCk7XG4gICAgICAgICAgdmFyIHZhbGlkUm9vdHMgPSByb290cy5maWx0ZXIoZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICAgIHJldHVybiAwIDw9IHIgJiYgciA8PSAxO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICh2YWxpZFJvb3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZFJvb3RzWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICB2YXIgY3VydmVSZWdpb25zID0gT2JqZWN0LmtleXMoYmFycmVsQ3VydmVQdHMpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdXJ2ZVJlZ2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvcm5lciA9IGN1cnZlUmVnaW9uc1tpXTtcbiAgICAgICAgdmFyIGNvcm5lclB0cyA9IGJhcnJlbEN1cnZlUHRzW2Nvcm5lcl07XG4gICAgICAgIHZhciB0ID0gZ2V0Q3VydmVUKHgsIHksIGNvcm5lclB0cyk7XG4gICAgICAgIGlmICh0ID09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgeTAgPSBjb3JuZXJQdHNbNV07XG4gICAgICAgIHZhciB5MSA9IGNvcm5lclB0c1szXTtcbiAgICAgICAgdmFyIHkyID0gY29ybmVyUHRzWzFdO1xuICAgICAgICB2YXIgYmV6WSA9IHFiZXppZXJBdCh5MCwgeTEsIHkyLCB0KTtcbiAgICAgICAgaWYgKGNvcm5lclB0cy5pc1RvcCAmJiBiZXpZIDw9IHkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29ybmVyUHRzLmlzQm90dG9tICYmIHkgPD0gYmV6WSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xufTtcbkJScCQyLmdlbmVyYXRlQm90dG9tUm91bmRyZWN0YW5nbGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLm5vZGVTaGFwZXNbJ2JvdHRvbS1yb3VuZC1yZWN0YW5nbGUnXSA9IHRoaXMubm9kZVNoYXBlc1snYm90dG9tcm91bmRyZWN0YW5nbGUnXSA9IHtcbiAgICByZW5kZXJlcjogdGhpcyxcbiAgICBuYW1lOiAnYm90dG9tLXJvdW5kLXJlY3RhbmdsZScsXG4gICAgcG9pbnRzOiBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCksXG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubm9kZVNoYXBlSW1wbCh0aGlzLm5hbWUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHRoaXMucG9pbnRzLCBjb3JuZXJSYWRpdXMpO1xuICAgIH0sXG4gICAgaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gaW50ZXJzZWN0TGluZShub2RlWCwgbm9kZVksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcsIGNvcm5lclJhZGl1cykge1xuICAgICAgdmFyIHRvcFN0YXJ0WCA9IG5vZGVYIC0gKHdpZHRoIC8gMiArIHBhZGRpbmcpO1xuICAgICAgdmFyIHRvcFN0YXJ0WSA9IG5vZGVZIC0gKGhlaWdodCAvIDIgKyBwYWRkaW5nKTtcbiAgICAgIHZhciB0b3BFbmRZID0gdG9wU3RhcnRZO1xuICAgICAgdmFyIHRvcEVuZFggPSBub2RlWCArICh3aWR0aCAvIDIgKyBwYWRkaW5nKTtcbiAgICAgIHZhciB0b3BJbnRlcnNlY3Rpb25zID0gZmluaXRlTGluZXNJbnRlcnNlY3QoeCwgeSwgbm9kZVgsIG5vZGVZLCB0b3BTdGFydFgsIHRvcFN0YXJ0WSwgdG9wRW5kWCwgdG9wRW5kWSwgZmFsc2UpO1xuICAgICAgaWYgKHRvcEludGVyc2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gdG9wSW50ZXJzZWN0aW9ucztcbiAgICAgIH1cbiAgICAgIHJldHVybiByb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUoeCwgeSwgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nLCBjb3JuZXJSYWRpdXMpO1xuICAgIH0sXG4gICAgY2hlY2tQb2ludDogZnVuY3Rpb24gY2hlY2tQb2ludCh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpIHtcbiAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCkgOiBjb3JuZXJSYWRpdXM7XG4gICAgICB2YXIgZGlhbSA9IDIgKiBjb3JuZXJSYWRpdXM7XG5cbiAgICAgIC8vIENoZWNrIGhCb3hcbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb24oeCwgeSwgdGhpcy5wb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQgLSBkaWFtLCBbMCwgLTFdLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgaWYgKHBvaW50SW5zaWRlUG9seWdvbih4LCB5LCB0aGlzLnBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSBkaWFtLCBoZWlnaHQsIFswLCAtMV0sIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBjaGVjayBub24tcm91bmRlZCB0b3Agc2lkZVxuICAgICAgdmFyIG91dGVyV2lkdGggPSB3aWR0aCAvIDIgKyAyICogcGFkZGluZztcbiAgICAgIHZhciBvdXRlckhlaWdodCA9IGhlaWdodCAvIDIgKyAyICogcGFkZGluZztcbiAgICAgIHZhciBwb2ludHMgPSBbY2VudGVyWCAtIG91dGVyV2lkdGgsIGNlbnRlclkgLSBvdXRlckhlaWdodCwgY2VudGVyWCAtIG91dGVyV2lkdGgsIGNlbnRlclksIGNlbnRlclggKyBvdXRlcldpZHRoLCBjZW50ZXJZLCBjZW50ZXJYICsgb3V0ZXJXaWR0aCwgY2VudGVyWSAtIG91dGVySGVpZ2h0XTtcbiAgICAgIGlmIChwb2ludEluc2lkZVBvbHlnb25Qb2ludHMoeCwgeSwgcG9pbnRzKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgYm90dG9tIHJpZ2h0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSwgZGlhbSwgZGlhbSwgY2VudGVyWCArIHdpZHRoIC8gMiAtIGNvcm5lclJhZGl1cywgY2VudGVyWSArIGhlaWdodCAvIDIgLSBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBib3R0b20gbGVmdCBxdWFydGVyIGNpcmNsZVxuICAgICAgaWYgKGNoZWNrSW5FbGxpcHNlKHgsIHksIGRpYW0sIGRpYW0sIGNlbnRlclggLSB3aWR0aCAvIDIgKyBjb3JuZXJSYWRpdXMsIGNlbnRlclkgKyBoZWlnaHQgLyAyIC0gY29ybmVyUmFkaXVzLCBwYWRkaW5nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG59O1xuQlJwJDIucmVnaXN0ZXJOb2RlU2hhcGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbm9kZVNoYXBlcyA9IHRoaXMubm9kZVNoYXBlcyA9IHt9O1xuICB2YXIgcmVuZGVyZXIgPSB0aGlzO1xuICB0aGlzLmdlbmVyYXRlRWxsaXBzZSgpO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbigndHJpYW5nbGUnLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoMywgMCkpO1xuICB0aGlzLmdlbmVyYXRlUm91bmRQb2x5Z29uKCdyb3VuZC10cmlhbmdsZScsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSgzLCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdyZWN0YW5nbGUnLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCkpO1xuICBub2RlU2hhcGVzWydzcXVhcmUnXSA9IG5vZGVTaGFwZXNbJ3JlY3RhbmdsZSddO1xuICB0aGlzLmdlbmVyYXRlUm91bmRSZWN0YW5nbGUoKTtcbiAgdGhpcy5nZW5lcmF0ZUN1dFJlY3RhbmdsZSgpO1xuICB0aGlzLmdlbmVyYXRlQmFycmVsKCk7XG4gIHRoaXMuZ2VuZXJhdGVCb3R0b21Sb3VuZHJlY3RhbmdsZSgpO1xuICB7XG4gICAgdmFyIGRpYW1vbmRQb2ludHMgPSBbMCwgMSwgMSwgMCwgMCwgLTEsIC0xLCAwXTtcbiAgICB0aGlzLmdlbmVyYXRlUG9seWdvbignZGlhbW9uZCcsIGRpYW1vbmRQb2ludHMpO1xuICAgIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLWRpYW1vbmQnLCBkaWFtb25kUG9pbnRzKTtcbiAgfVxuICB0aGlzLmdlbmVyYXRlUG9seWdvbigncGVudGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNSwgMCkpO1xuICB0aGlzLmdlbmVyYXRlUm91bmRQb2x5Z29uKCdyb3VuZC1wZW50YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg1LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdoZXhhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDYsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVJvdW5kUG9seWdvbigncm91bmQtaGV4YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg2LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCdoZXB0YWdvbicsIGdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg3LCAwKSk7XG4gIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLWhlcHRhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDcsIDApKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ29jdGFnb24nLCBnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoOCwgMCkpO1xuICB0aGlzLmdlbmVyYXRlUm91bmRQb2x5Z29uKCdyb3VuZC1vY3RhZ29uJywgZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDgsIDApKTtcbiAgdmFyIHN0YXI1UG9pbnRzID0gbmV3IEFycmF5KDIwKTtcbiAge1xuICAgIHZhciBvdXRlclBvaW50cyA9IGdlbmVyYXRlVW5pdE5nb25Qb2ludHMoNSwgMCk7XG4gICAgdmFyIGlubmVyUG9pbnRzID0gZ2VuZXJhdGVVbml0TmdvblBvaW50cyg1LCBNYXRoLlBJIC8gNSk7XG5cbiAgICAvLyBPdXRlciByYWRpdXMgaXMgMTsgaW5uZXIgcmFkaXVzIG9mIHN0YXIgaXMgc21hbGxlclxuICAgIHZhciBpbm5lclJhZGl1cyA9IDAuNSAqICgzIC0gTWF0aC5zcXJ0KDUpKTtcbiAgICBpbm5lclJhZGl1cyAqPSAxLjU3O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5uZXJQb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgICBpbm5lclBvaW50c1tpICogMl0gKj0gaW5uZXJSYWRpdXM7XG4gICAgICBpbm5lclBvaW50c1tpICogMiArIDFdICo9IGlubmVyUmFkaXVzO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDIwIC8gNDsgaSsrKSB7XG4gICAgICBzdGFyNVBvaW50c1tpICogNF0gPSBvdXRlclBvaW50c1tpICogMl07XG4gICAgICBzdGFyNVBvaW50c1tpICogNCArIDFdID0gb3V0ZXJQb2ludHNbaSAqIDIgKyAxXTtcbiAgICAgIHN0YXI1UG9pbnRzW2kgKiA0ICsgMl0gPSBpbm5lclBvaW50c1tpICogMl07XG4gICAgICBzdGFyNVBvaW50c1tpICogNCArIDNdID0gaW5uZXJQb2ludHNbaSAqIDIgKyAxXTtcbiAgICB9XG4gIH1cbiAgc3RhcjVQb2ludHMgPSBmaXRQb2x5Z29uVG9TcXVhcmUoc3RhcjVQb2ludHMpO1xuICB0aGlzLmdlbmVyYXRlUG9seWdvbignc3RhcicsIHN0YXI1UG9pbnRzKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3ZlZScsIFstMSwgLTEsIDAsIC0wLjMzMywgMSwgLTEsIDAsIDFdKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3Job21ib2lkJywgWy0xLCAtMSwgMC4zMzMsIC0xLCAxLCAxLCAtMC4zMzMsIDFdKTtcbiAgdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ3JpZ2h0LXJob21ib2lkJywgWy0wLjMzMywgLTEsIDEsIC0xLCAwLjMzMywgMSwgLTEsIDFdKTtcbiAgdGhpcy5ub2RlU2hhcGVzWydjb25jYXZlaGV4YWdvbiddID0gdGhpcy5nZW5lcmF0ZVBvbHlnb24oJ2NvbmNhdmUtaGV4YWdvbicsIFstMSwgLTAuOTUsIC0wLjc1LCAwLCAtMSwgMC45NSwgMSwgMC45NSwgMC43NSwgMCwgMSwgLTAuOTVdKTtcbiAge1xuICAgIHZhciB0YWdQb2ludHMgPSBbLTEsIC0xLCAwLjI1LCAtMSwgMSwgMCwgMC4yNSwgMSwgLTEsIDFdO1xuICAgIHRoaXMuZ2VuZXJhdGVQb2x5Z29uKCd0YWcnLCB0YWdQb2ludHMpO1xuICAgIHRoaXMuZ2VuZXJhdGVSb3VuZFBvbHlnb24oJ3JvdW5kLXRhZycsIHRhZ1BvaW50cyk7XG4gIH1cbiAgbm9kZVNoYXBlcy5tYWtlUG9seWdvbiA9IGZ1bmN0aW9uIChwb2ludHMpIHtcbiAgICAvLyB1c2UgY2FjaGluZyBvbiB1c2VyLXNwZWNpZmllZCBwb2x5Z29ucyBzbyB0aGV5IGFyZSBhcyBmYXN0IGFzIG5hdGl2ZSBzaGFwZXNcblxuICAgIHZhciBrZXkgPSBwb2ludHMuam9pbignJCcpO1xuICAgIHZhciBuYW1lID0gJ3BvbHlnb24tJyArIGtleTtcbiAgICB2YXIgc2hhcGU7XG4gICAgaWYgKHNoYXBlID0gdGhpc1tuYW1lXSkge1xuICAgICAgLy8gZ290IGNhY2hlZCBzaGFwZVxuICAgICAgcmV0dXJuIHNoYXBlO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBhbmQgY2FjaGUgbmV3IHNoYXBlXG4gICAgcmV0dXJuIHJlbmRlcmVyLmdlbmVyYXRlUG9seWdvbihuYW1lLCBwb2ludHMpO1xuICB9O1xufTtcblxudmFyIEJScCQxID0ge307XG5CUnAkMS50aW1lVG9SZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJlZHJhd1RvdGFsVGltZSAvIHRoaXMucmVkcmF3Q291bnQ7XG59O1xuQlJwJDEucmVkcmF3ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwgc3RhdGljRW1wdHlPYmplY3QoKTtcbiAgdmFyIHIgPSB0aGlzO1xuICBpZiAoci5hdmVyYWdlUmVkcmF3VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgci5hdmVyYWdlUmVkcmF3VGltZSA9IDA7XG4gIH1cbiAgaWYgKHIubGFzdFJlZHJhd1RpbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHIubGFzdFJlZHJhd1RpbWUgPSAwO1xuICB9XG4gIGlmIChyLmxhc3REcmF3VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgci5sYXN0RHJhd1RpbWUgPSAwO1xuICB9XG4gIHIucmVxdWVzdGVkRnJhbWUgPSB0cnVlO1xuICByLnJlbmRlck9wdGlvbnMgPSBvcHRpb25zO1xufTtcbkJScCQxLmJlZm9yZVJlbmRlciA9IGZ1bmN0aW9uIChmbiwgcHJpb3JpdHkpIHtcbiAgLy8gdGhlIHJlbmRlcmVyIGNhbid0IGFkZCB0aWNrIGNhbGxiYWNrcyB3aGVuIGRlc3Ryb3llZFxuICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHByaW9yaXR5ID09IG51bGwpIHtcbiAgICBlcnJvcignUHJpb3JpdHkgaXMgbm90IG9wdGlvbmFsIGZvciBiZWZvcmVSZW5kZXInKTtcbiAgfVxuICB2YXIgY2JzID0gdGhpcy5iZWZvcmVSZW5kZXJDYWxsYmFja3M7XG4gIGNicy5wdXNoKHtcbiAgICBmbjogZm4sXG4gICAgcHJpb3JpdHk6IHByaW9yaXR5XG4gIH0pO1xuXG4gIC8vIGhpZ2hlciBwcmlvcml0eSBjYWxsYmFja3MgZXhlY3V0ZWQgZmlyc3RcbiAgY2JzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYi5wcmlvcml0eSAtIGEucHJpb3JpdHk7XG4gIH0pO1xufTtcbnZhciBiZWZvcmVSZW5kZXJDYWxsYmFja3MgPSBmdW5jdGlvbiBiZWZvcmVSZW5kZXJDYWxsYmFja3Mociwgd2lsbERyYXcsIHN0YXJ0VGltZSkge1xuICB2YXIgY2JzID0gci5iZWZvcmVSZW5kZXJDYWxsYmFja3M7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2JzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2JzW2ldLmZuKHdpbGxEcmF3LCBzdGFydFRpbWUpO1xuICB9XG59O1xuQlJwJDEuc3RhcnRSZW5kZXJMb29wID0gZnVuY3Rpb24gKCkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjeSA9IHIuY3k7XG4gIGlmIChyLnJlbmRlckxvb3BTdGFydGVkKSB7XG4gICAgcmV0dXJuO1xuICB9IGVsc2Uge1xuICAgIHIucmVuZGVyTG9vcFN0YXJ0ZWQgPSB0cnVlO1xuICB9XG4gIHZhciByZW5kZXJGbiA9IGZ1bmN0aW9uIHJlbmRlckZuKHJlcXVlc3RUaW1lKSB7XG4gICAgaWYgKHIuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjeS5iYXRjaGluZygpKSA7IGVsc2UgaWYgKHIucmVxdWVzdGVkRnJhbWUgJiYgIXIuc2tpcEZyYW1lKSB7XG4gICAgICBiZWZvcmVSZW5kZXJDYWxsYmFja3MociwgdHJ1ZSwgcmVxdWVzdFRpbWUpO1xuICAgICAgdmFyIHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gICAgICByLnJlbmRlcihyLnJlbmRlck9wdGlvbnMpO1xuICAgICAgdmFyIGVuZFRpbWUgPSByLmxhc3REcmF3VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gICAgICBpZiAoci5hdmVyYWdlUmVkcmF3VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHIuYXZlcmFnZVJlZHJhd1RpbWUgPSBlbmRUaW1lIC0gc3RhcnRUaW1lO1xuICAgICAgfVxuICAgICAgaWYgKHIucmVkcmF3Q291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByLnJlZHJhd0NvdW50ID0gMDtcbiAgICAgIH1cbiAgICAgIHIucmVkcmF3Q291bnQrKztcbiAgICAgIGlmIChyLnJlZHJhd1RvdGFsVGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHIucmVkcmF3VG90YWxUaW1lID0gMDtcbiAgICAgIH1cbiAgICAgIHZhciBkdXJhdGlvbiA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgICByLnJlZHJhd1RvdGFsVGltZSArPSBkdXJhdGlvbjtcbiAgICAgIHIubGFzdFJlZHJhd1RpbWUgPSBkdXJhdGlvbjtcblxuICAgICAgLy8gdXNlIGEgd2VpZ2h0ZWQgYXZlcmFnZSB3aXRoIGEgYmlhcyBmcm9tIHRoZSBwcmV2aW91cyBhdmVyYWdlIHNvIHdlIGRvbid0IHNwaWtlIHNvIGVhc2lseVxuICAgICAgci5hdmVyYWdlUmVkcmF3VGltZSA9IHIuYXZlcmFnZVJlZHJhd1RpbWUgLyAyICsgZHVyYXRpb24gLyAyO1xuICAgICAgci5yZXF1ZXN0ZWRGcmFtZSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBiZWZvcmVSZW5kZXJDYWxsYmFja3MociwgZmFsc2UsIHJlcXVlc3RUaW1lKTtcbiAgICB9XG4gICAgci5za2lwRnJhbWUgPSBmYWxzZTtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVuZGVyRm4pO1xuICB9O1xuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVuZGVyRm4pO1xufTtcblxudmFyIEJhc2VSZW5kZXJlciA9IGZ1bmN0aW9uIEJhc2VSZW5kZXJlcihvcHRpb25zKSB7XG4gIHRoaXMuaW5pdChvcHRpb25zKTtcbn07XG52YXIgQlIgPSBCYXNlUmVuZGVyZXI7XG52YXIgQlJwID0gQlIucHJvdG90eXBlO1xuQlJwLmNsaWVudEZ1bmN0aW9ucyA9IFsncmVkcmF3SGludCcsICdyZW5kZXInLCAncmVuZGVyVG8nLCAnbWF0Y2hDYW52YXNTaXplJywgJ25vZGVTaGFwZUltcGwnLCAnYXJyb3dTaGFwZUltcGwnXTtcbkJScC5pbml0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICByLm9wdGlvbnMgPSBvcHRpb25zO1xuICByLmN5ID0gb3B0aW9ucy5jeTtcbiAgdmFyIGN0ciA9IHIuY29udGFpbmVyID0gb3B0aW9ucy5jeS5jb250YWluZXIoKTtcbiAgdmFyIGNvbnRhaW5lcldpbmRvdyA9IHIuY3kud2luZG93KCk7XG5cbiAgLy8gcHJlcGVuZCBhIHN0eWxlc2hlZXQgaW4gdGhlIGhlYWQgc3VjaCB0aGF0XG4gIGlmIChjb250YWluZXJXaW5kb3cpIHtcbiAgICB2YXIgZG9jdW1lbnQgPSBjb250YWluZXJXaW5kb3cuZG9jdW1lbnQ7XG4gICAgdmFyIGhlYWQgPSBkb2N1bWVudC5oZWFkO1xuICAgIHZhciBzdHlsZXNoZWV0SWQgPSAnX19fX19fX19fX2N5dG9zY2FwZV9zdHlsZXNoZWV0JztcbiAgICB2YXIgY2xhc3NOYW1lID0gJ19fX19fX19fX19jeXRvc2NhcGVfY29udGFpbmVyJztcbiAgICB2YXIgc3R5bGVzaGVldEFscmVhZHlFeGlzdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzdHlsZXNoZWV0SWQpICE9IG51bGw7XG4gICAgaWYgKGN0ci5jbGFzc05hbWUuaW5kZXhPZihjbGFzc05hbWUpIDwgMCkge1xuICAgICAgY3RyLmNsYXNzTmFtZSA9IChjdHIuY2xhc3NOYW1lIHx8ICcnKSArICcgJyArIGNsYXNzTmFtZTtcbiAgICB9XG4gICAgaWYgKCFzdHlsZXNoZWV0QWxyZWFkeUV4aXN0cykge1xuICAgICAgdmFyIHN0eWxlc2hlZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgc3R5bGVzaGVldC5pZCA9IHN0eWxlc2hlZXRJZDtcbiAgICAgIHN0eWxlc2hlZXQudGV4dENvbnRlbnQgPSAnLicgKyBjbGFzc05hbWUgKyAnIHsgcG9zaXRpb246IHJlbGF0aXZlOyB9JztcbiAgICAgIGhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlc2hlZXQsIGhlYWQuY2hpbGRyZW5bMF0pOyAvLyBmaXJzdCBzbyBsb3dlc3QgcHJpb3JpdHlcbiAgICB9XG5cbiAgICB2YXIgY29tcHV0ZWRTdHlsZSA9IGNvbnRhaW5lcldpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGN0cik7XG4gICAgdmFyIHBvc2l0aW9uID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwb3NpdGlvbicpO1xuICAgIGlmIChwb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIHdhcm4oJ0EgQ3l0b3NjYXBlIGNvbnRhaW5lciBoYXMgc3R5bGUgcG9zaXRpb246c3RhdGljIGFuZCBzbyBjYW4gbm90IHVzZSBVSSBleHRlbnNpb25zIHByb3Blcmx5Jyk7XG4gICAgfVxuICB9XG4gIHIuc2VsZWN0aW9uID0gW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF07IC8vIENvb3JkaW5hdGVzIGZvciBzZWxlY3Rpb24gYm94LCBwbHVzIGVuYWJsZWQgZmxhZ1xuXG4gIHIuYmV6aWVyUHJvalBjdHMgPSBbMC4wNSwgMC4yMjUsIDAuNCwgMC41LCAwLjYsIDAuNzc1LCAwLjk1XTtcblxuICAvLy0tUG9pbnRlci1yZWxhdGVkIGRhdGFcbiAgci5ob3ZlckRhdGEgPSB7XG4gICAgZG93bjogbnVsbCxcbiAgICBsYXN0OiBudWxsLFxuICAgIGRvd25UaW1lOiBudWxsLFxuICAgIHRyaWdnZXJNb2RlOiBudWxsLFxuICAgIGRyYWdnaW5nOiBmYWxzZSxcbiAgICBpbml0aWFsUGFuOiBbbnVsbCwgbnVsbF0sXG4gICAgY2FwdHVyZTogZmFsc2VcbiAgfTtcbiAgci5kcmFnRGF0YSA9IHtcbiAgICBwb3NzaWJsZURyYWdFbGVtZW50czogW11cbiAgfTtcbiAgci50b3VjaERhdGEgPSB7XG4gICAgc3RhcnQ6IG51bGwsXG4gICAgY2FwdHVyZTogZmFsc2UsXG4gICAgLy8gVGhlc2UgMyBmaWVsZHMgcmVsYXRlZCB0byB0YXAsIHRhcGhvbGQgZXZlbnRzXG4gICAgc3RhcnRQb3NpdGlvbjogW251bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGxdLFxuICAgIHNpbmdsZVRvdWNoU3RhcnRUaW1lOiBudWxsLFxuICAgIHNpbmdsZVRvdWNoTW92ZWQ6IHRydWUsXG4gICAgbm93OiBbbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbF0sXG4gICAgZWFybGllcjogW251bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGxdXG4gIH07XG4gIHIucmVkcmF3cyA9IDA7XG4gIHIuc2hvd0ZwcyA9IG9wdGlvbnMuc2hvd0ZwcztcbiAgci5kZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG4gIHIuaGlkZUVkZ2VzT25WaWV3cG9ydCA9IG9wdGlvbnMuaGlkZUVkZ2VzT25WaWV3cG9ydDtcbiAgci50ZXh0dXJlT25WaWV3cG9ydCA9IG9wdGlvbnMudGV4dHVyZU9uVmlld3BvcnQ7XG4gIHIud2hlZWxTZW5zaXRpdml0eSA9IG9wdGlvbnMud2hlZWxTZW5zaXRpdml0eTtcbiAgci5tb3Rpb25CbHVyRW5hYmxlZCA9IG9wdGlvbnMubW90aW9uQmx1cjsgLy8gb24gYnkgZGVmYXVsdFxuICByLmZvcmNlZFBpeGVsUmF0aW8gPSBudW1iZXIkMShvcHRpb25zLnBpeGVsUmF0aW8pID8gb3B0aW9ucy5waXhlbFJhdGlvIDogbnVsbDtcbiAgci5tb3Rpb25CbHVyID0gb3B0aW9ucy5tb3Rpb25CbHVyOyAvLyBmb3IgaW5pdGlhbCBraWNrIG9mZlxuICByLm1vdGlvbkJsdXJPcGFjaXR5ID0gb3B0aW9ucy5tb3Rpb25CbHVyT3BhY2l0eTtcbiAgci5tb3Rpb25CbHVyVHJhbnNwYXJlbmN5ID0gMSAtIHIubW90aW9uQmx1ck9wYWNpdHk7XG4gIHIubW90aW9uQmx1clB4UmF0aW8gPSAxO1xuICByLm1iUHhSQmx1cnJ5ID0gMTsgLy8wLjg7XG4gIHIubWluTWJMb3dRdWFsRnJhbWVzID0gNDtcbiAgci5mdWxsUXVhbGl0eU1iID0gZmFsc2U7XG4gIHIuY2xlYXJlZEZvck1vdGlvbkJsdXIgPSBbXTtcbiAgci5kZXNrdG9wVGFwVGhyZXNob2xkID0gb3B0aW9ucy5kZXNrdG9wVGFwVGhyZXNob2xkO1xuICByLmRlc2t0b3BUYXBUaHJlc2hvbGQyID0gb3B0aW9ucy5kZXNrdG9wVGFwVGhyZXNob2xkICogb3B0aW9ucy5kZXNrdG9wVGFwVGhyZXNob2xkO1xuICByLnRvdWNoVGFwVGhyZXNob2xkID0gb3B0aW9ucy50b3VjaFRhcFRocmVzaG9sZDtcbiAgci50b3VjaFRhcFRocmVzaG9sZDIgPSBvcHRpb25zLnRvdWNoVGFwVGhyZXNob2xkICogb3B0aW9ucy50b3VjaFRhcFRocmVzaG9sZDtcbiAgci50YXBob2xkRHVyYXRpb24gPSA1MDA7XG4gIHIuYmluZGluZ3MgPSBbXTtcbiAgci5iZWZvcmVSZW5kZXJDYWxsYmFja3MgPSBbXTtcbiAgci5iZWZvcmVSZW5kZXJQcmlvcml0aWVzID0ge1xuICAgIC8vIGhpZ2hlciBwcmlvcml0eSBleGVjcyBiZWZvcmUgbG93ZXIgb25lXG4gICAgYW5pbWF0aW9uczogNDAwLFxuICAgIGVsZUNhbGNzOiAzMDAsXG4gICAgZWxlVHhyRGVxOiAyMDAsXG4gICAgbHlyVHhyRGVxOiAxNTAsXG4gICAgbHlyVHhyU2tpcDogMTAwXG4gIH07XG4gIHIucmVnaXN0ZXJOb2RlU2hhcGVzKCk7XG4gIHIucmVnaXN0ZXJBcnJvd1NoYXBlcygpO1xuICByLnJlZ2lzdGVyQ2FsY3VsYXRpb25MaXN0ZW5lcnMoKTtcbn07XG5CUnAubm90aWZ5ID0gZnVuY3Rpb24gKGV2ZW50TmFtZSwgZWxlcykge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBjeSA9IHIuY3k7XG5cbiAgLy8gdGhlIHJlbmRlcmVyIGNhbid0IGJlIG5vdGlmaWVkIGFmdGVyIGl0J3MgZGVzdHJveWVkXG4gIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZXZlbnROYW1lID09PSAnaW5pdCcpIHtcbiAgICByLmxvYWQoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGV2ZW50TmFtZSA9PT0gJ2Rlc3Ryb3knKSB7XG4gICAgci5kZXN0cm95KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChldmVudE5hbWUgPT09ICdhZGQnIHx8IGV2ZW50TmFtZSA9PT0gJ3JlbW92ZScgfHwgZXZlbnROYW1lID09PSAnbW92ZScgJiYgY3kuaGFzQ29tcG91bmROb2RlcygpIHx8IGV2ZW50TmFtZSA9PT0gJ2xvYWQnIHx8IGV2ZW50TmFtZSA9PT0gJ3pvcmRlcicgfHwgZXZlbnROYW1lID09PSAnbW91bnQnKSB7XG4gICAgci5pbnZhbGlkYXRlQ2FjaGVkWlNvcnRlZEVsZXMoKTtcbiAgfVxuICBpZiAoZXZlbnROYW1lID09PSAndmlld3BvcnQnKSB7XG4gICAgci5yZWRyYXdIaW50KCdzZWxlY3QnLCB0cnVlKTtcbiAgfVxuICBpZiAoZXZlbnROYW1lID09PSAnbG9hZCcgfHwgZXZlbnROYW1lID09PSAncmVzaXplJyB8fCBldmVudE5hbWUgPT09ICdtb3VudCcpIHtcbiAgICByLmludmFsaWRhdGVDb250YWluZXJDbGllbnRDb29yZHNDYWNoZSgpO1xuICAgIHIubWF0Y2hDYW52YXNTaXplKHIuY29udGFpbmVyKTtcbiAgfVxuICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gIHRoaXMuc3RhcnRSZW5kZXJMb29wKCk7XG4gIHRoaXMucmVkcmF3KCk7XG59O1xuQlJwLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByID0gdGhpcztcbiAgci5kZXN0cm95ZWQgPSB0cnVlO1xuICByLmN5LnN0b3BBbmltYXRpb25Mb29wKCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgci5iaW5kaW5ncy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBiaW5kaW5nID0gci5iaW5kaW5nc1tpXTtcbiAgICB2YXIgYiA9IGJpbmRpbmc7XG4gICAgdmFyIHRndCA9IGIudGFyZ2V0O1xuICAgICh0Z3Qub2ZmIHx8IHRndC5yZW1vdmVFdmVudExpc3RlbmVyKS5hcHBseSh0Z3QsIGIuYXJncyk7XG4gIH1cbiAgci5iaW5kaW5ncyA9IFtdO1xuICByLmJlZm9yZVJlbmRlckNhbGxiYWNrcyA9IFtdO1xuICByLm9uVXBkYXRlRWxlQ2FsY3NGbnMgPSBbXTtcbiAgaWYgKHIucmVtb3ZlT2JzZXJ2ZXIpIHtcbiAgICByLnJlbW92ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfVxuICBpZiAoci5zdHlsZU9ic2VydmVyKSB7XG4gICAgci5zdHlsZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfVxuICBpZiAoci5yZXNpemVPYnNlcnZlcikge1xuICAgIHIucmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9XG4gIGlmIChyLmxhYmVsQ2FsY0Rpdikge1xuICAgIHRyeSB7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHIubGFiZWxDYWxjRGl2KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGllMTAgaXNzdWUgIzEwMTRcbiAgICB9XG4gIH1cbn07XG5CUnAuaXNIZWFkbGVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufTtcbltCUnAkZiwgQlJwJDUsIEJScCQ0LCBCUnAkMywgQlJwJDIsIEJScCQxXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoQlJwLCBwcm9wcyk7XG59KTtcblxudmFyIGZ1bGxGcHNUaW1lID0gMTAwMCAvIDYwOyAvLyBhc3N1bWUgNjAgZnJhbWVzIHBlciBzZWNvbmRcblxudmFyIGRlZnMgPSB7XG4gIHNldHVwRGVxdWV1ZWluZzogZnVuY3Rpb24gc2V0dXBEZXF1ZXVlaW5nKG9wdHMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gc2V0dXBEZXF1ZXVlaW5nSW1wbCgpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciByID0gdGhpcy5yZW5kZXJlcjtcbiAgICAgIGlmIChzZWxmLmRlcXVldWVpbmdTZXR1cCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLmRlcXVldWVpbmdTZXR1cCA9IHRydWU7XG4gICAgICB9XG4gICAgICB2YXIgcXVldWVSZWRyYXcgPSBkZWJvdW5jZV8xKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgci5yZWRyYXdIaW50KCdlbGVzJywgdHJ1ZSk7XG4gICAgICAgIHIucmVkcmF3SGludCgnZHJhZycsIHRydWUpO1xuICAgICAgICByLnJlZHJhdygpO1xuICAgICAgfSwgb3B0cy5kZXFSZWRyYXdUaHJlc2hvbGQpO1xuICAgICAgdmFyIGRlcXVldWUgPSBmdW5jdGlvbiBkZXF1ZXVlKHdpbGxEcmF3LCBmcmFtZVN0YXJ0VGltZSkge1xuICAgICAgICB2YXIgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgICAgICAgdmFyIGF2Z1JlbmRlclRpbWUgPSByLmF2ZXJhZ2VSZWRyYXdUaW1lO1xuICAgICAgICB2YXIgcmVuZGVyVGltZSA9IHIubGFzdFJlZHJhd1RpbWU7XG4gICAgICAgIHZhciBkZXFkID0gW107XG4gICAgICAgIHZhciBleHRlbnQgPSByLmN5LmV4dGVudCgpO1xuICAgICAgICB2YXIgcGl4ZWxSYXRpbyA9IHIuZ2V0UGl4ZWxSYXRpbygpO1xuXG4gICAgICAgIC8vIGlmIHdlIGFyZW4ndCBpbiBhIHRpY2sgdGhhdCBjYXVzZXMgYSBkcmF3LCB0aGVuIHRoZSByZW5kZXJlZCBzdHlsZVxuICAgICAgICAvLyBxdWV1ZSB3b24ndCBhdXRvbWF0aWNhbGx5IGJlIGZsdXNoZWQgYmVmb3JlIGRlcXVldWVpbmcgc3RhcnRzXG4gICAgICAgIGlmICghd2lsbERyYXcpIHtcbiAgICAgICAgICByLmZsdXNoUmVuZGVyZWRTdHlsZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuICAgICAgICAgIHZhciBub3cgPSBwZXJmb3JtYW5jZU5vdygpO1xuICAgICAgICAgIHZhciBkdXJhdGlvbiA9IG5vdyAtIHN0YXJ0VGltZTtcbiAgICAgICAgICB2YXIgZnJhbWVEdXJhdGlvbiA9IG5vdyAtIGZyYW1lU3RhcnRUaW1lO1xuICAgICAgICAgIGlmIChyZW5kZXJUaW1lIDwgZnVsbEZwc1RpbWUpIHtcbiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHJlbmRlcmluZyBmYXN0ZXIgdGhhbiB0aGUgaWRlYWwgZnBzLCB0aGVuIGRvIGRlcXVldWVpbmdcbiAgICAgICAgICAgIC8vIGR1cmluZyBhbGwgb2YgdGhlIHJlbWFpbmluZyBmcmFtZSB0aW1lXG5cbiAgICAgICAgICAgIHZhciB0aW1lQXZhaWxhYmxlID0gZnVsbEZwc1RpbWUgLSAod2lsbERyYXcgPyBhdmdSZW5kZXJUaW1lIDogMCk7XG4gICAgICAgICAgICBpZiAoZnJhbWVEdXJhdGlvbiA+PSBvcHRzLmRlcUZhc3RDb3N0ICogdGltZUF2YWlsYWJsZSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHdpbGxEcmF3KSB7XG4gICAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+PSBvcHRzLmRlcUNvc3QgKiByZW5kZXJUaW1lIHx8IGR1cmF0aW9uID49IG9wdHMuZGVxQXZnQ29zdCAqIGF2Z1JlbmRlclRpbWUpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChmcmFtZUR1cmF0aW9uID49IG9wdHMuZGVxTm9EcmF3Q29zdCAqIGZ1bGxGcHNUaW1lKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgdGhpc0RlcWQgPSBvcHRzLmRlcShzZWxmLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgICAgICAgIGlmICh0aGlzRGVxZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXNEZXFkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGRlcWQucHVzaCh0aGlzRGVxZFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNhbGxiYWNrcyBvbiBkZXF1ZXVlXG4gICAgICAgIGlmIChkZXFkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBvcHRzLm9uRGVxZChzZWxmLCBkZXFkKTtcbiAgICAgICAgICBpZiAoIXdpbGxEcmF3ICYmIG9wdHMuc2hvdWxkUmVkcmF3KHNlbGYsIGRlcWQsIHBpeGVsUmF0aW8sIGV4dGVudCkpIHtcbiAgICAgICAgICAgIHF1ZXVlUmVkcmF3KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIHByaW9yaXR5ID0gb3B0cy5wcmlvcml0eSB8fCBub29wJDE7XG4gICAgICByLmJlZm9yZVJlbmRlcihkZXF1ZXVlLCBwcmlvcml0eShzZWxmKSk7XG4gICAgfTtcbiAgfVxufTtcblxuLy8gQWxsb3dzIGxvb2t1cHMgZm9yIChlbGUsIGx2bCkgPT4gY2FjaGUuXG4vLyBVc2VzIGtleXMgc28gZWxlbWVudHMgbWF5IHNoYXJlIHRoZSBzYW1lIGNhY2hlLlxudmFyIEVsZW1lbnRUZXh0dXJlQ2FjaGVMb29rdXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBFbGVtZW50VGV4dHVyZUNhY2hlTG9va3VwKGdldEtleSkge1xuICAgIHZhciBkb2VzRWxlSW52YWxpZGF0ZUtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2lmeTtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cCk7XG4gICAgdGhpcy5pZHNCeUtleSA9IG5ldyBNYXAkMigpO1xuICAgIHRoaXMua2V5Rm9ySWQgPSBuZXcgTWFwJDIoKTtcbiAgICB0aGlzLmNhY2hlc0J5THZsID0gbmV3IE1hcCQyKCk7XG4gICAgdGhpcy5sdmxzID0gW107XG4gICAgdGhpcy5nZXRLZXkgPSBnZXRLZXk7XG4gICAgdGhpcy5kb2VzRWxlSW52YWxpZGF0ZUtleSA9IGRvZXNFbGVJbnZhbGlkYXRlS2V5O1xuICB9XG4gIF9jcmVhdGVDbGFzcyhFbGVtZW50VGV4dHVyZUNhY2hlTG9va3VwLCBbe1xuICAgIGtleTogXCJnZXRJZHNGb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0SWRzRm9yKGtleSkge1xuICAgICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICAgIGVycm9yKFwiQ2FuIG5vdCBnZXQgaWQgbGlzdCBmb3IgbnVsbCBrZXlcIik7XG4gICAgICB9XG4gICAgICB2YXIgaWRzQnlLZXkgPSB0aGlzLmlkc0J5S2V5O1xuICAgICAgdmFyIGlkcyA9IHRoaXMuaWRzQnlLZXkuZ2V0KGtleSk7XG4gICAgICBpZiAoIWlkcykge1xuICAgICAgICBpZHMgPSBuZXcgU2V0JDEoKTtcbiAgICAgICAgaWRzQnlLZXkuc2V0KGtleSwgaWRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpZHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZElkRm9yS2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZElkRm9yS2V5KGtleSwgaWQpIHtcbiAgICAgIGlmIChrZXkgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmdldElkc0ZvcihrZXkpLmFkZChpZCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZUlkRm9yS2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlbGV0ZUlkRm9yS2V5KGtleSwgaWQpIHtcbiAgICAgIGlmIChrZXkgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmdldElkc0ZvcihrZXkpW1wiZGVsZXRlXCJdKGlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TnVtYmVyT2ZJZHNGb3JLZXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TnVtYmVyT2ZJZHNGb3JLZXkoa2V5KSB7XG4gICAgICBpZiAoa2V5ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRJZHNGb3Ioa2V5KS5zaXplO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVLZXlNYXBwaW5nRm9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZUtleU1hcHBpbmdGb3IoZWxlKSB7XG4gICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICAgIHZhciBwcmV2S2V5ID0gdGhpcy5rZXlGb3JJZC5nZXQoaWQpO1xuICAgICAgdmFyIGN1cnJLZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICAgICAgdGhpcy5kZWxldGVJZEZvcktleShwcmV2S2V5LCBpZCk7XG4gICAgICB0aGlzLmFkZElkRm9yS2V5KGN1cnJLZXksIGlkKTtcbiAgICAgIHRoaXMua2V5Rm9ySWQuc2V0KGlkLCBjdXJyS2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlS2V5TWFwcGluZ0ZvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWxldGVLZXlNYXBwaW5nRm9yKGVsZSkge1xuICAgICAgdmFyIGlkID0gZWxlLmlkKCk7XG4gICAgICB2YXIgcHJldktleSA9IHRoaXMua2V5Rm9ySWQuZ2V0KGlkKTtcbiAgICAgIHRoaXMuZGVsZXRlSWRGb3JLZXkocHJldktleSwgaWQpO1xuICAgICAgdGhpcy5rZXlGb3JJZFtcImRlbGV0ZVwiXShpZCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImtleUhhc0NoYW5nZWRGb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24ga2V5SGFzQ2hhbmdlZEZvcihlbGUpIHtcbiAgICAgIHZhciBpZCA9IGVsZS5pZCgpO1xuICAgICAgdmFyIHByZXZLZXkgPSB0aGlzLmtleUZvcklkLmdldChpZCk7XG4gICAgICB2YXIgbmV3S2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHJldHVybiBwcmV2S2V5ICE9PSBuZXdLZXk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzSW52YWxpZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc0ludmFsaWQoZWxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5rZXlIYXNDaGFuZ2VkRm9yKGVsZSkgfHwgdGhpcy5kb2VzRWxlSW52YWxpZGF0ZUtleShlbGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDYWNoZXNBdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDYWNoZXNBdChsdmwpIHtcbiAgICAgIHZhciBjYWNoZXNCeUx2bCA9IHRoaXMuY2FjaGVzQnlMdmwsXG4gICAgICAgIGx2bHMgPSB0aGlzLmx2bHM7XG4gICAgICB2YXIgY2FjaGVzID0gY2FjaGVzQnlMdmwuZ2V0KGx2bCk7XG4gICAgICBpZiAoIWNhY2hlcykge1xuICAgICAgICBjYWNoZXMgPSBuZXcgTWFwJDIoKTtcbiAgICAgICAgY2FjaGVzQnlMdmwuc2V0KGx2bCwgY2FjaGVzKTtcbiAgICAgICAgbHZscy5wdXNoKGx2bCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FjaGVzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDYWNoZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDYWNoZShrZXksIGx2bCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVzQXQobHZsKS5nZXQoa2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChlbGUsIGx2bCkge1xuICAgICAgdmFyIGtleSA9IHRoaXMuZ2V0S2V5KGVsZSk7XG4gICAgICB2YXIgY2FjaGUgPSB0aGlzLmdldENhY2hlKGtleSwgbHZsKTtcblxuICAgICAgLy8gZ2V0dGluZyBmb3IgYW4gZWxlbWVudCBtYXkgbmVlZCB0byBhZGQgdG8gdGhlIGlkIGxpc3QgYi9jIGVsZXMgY2FuIHNoYXJlIGtleXNcbiAgICAgIGlmIChjYWNoZSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMudXBkYXRlS2V5TWFwcGluZ0ZvcihlbGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRGb3JDYWNoZWRLZXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Rm9yQ2FjaGVkS2V5KGVsZSwgbHZsKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5rZXlGb3JJZC5nZXQoZWxlLmlkKCkpOyAvLyBuLmIuIHVzZSBjYWNoZWQga2V5LCBub3QgbmV3bHkgY29tcHV0ZWQga2V5XG4gICAgICB2YXIgY2FjaGUgPSB0aGlzLmdldENhY2hlKGtleSwgbHZsKTtcbiAgICAgIHJldHVybiBjYWNoZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzQ2FjaGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzQ2FjaGUoa2V5LCBsdmwpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldENhY2hlc0F0KGx2bCkuaGFzKGtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXMoZWxlLCBsdmwpIHtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICAgICAgcmV0dXJuIHRoaXMuaGFzQ2FjaGUoa2V5LCBsdmwpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRDYWNoZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRDYWNoZShrZXksIGx2bCwgY2FjaGUpIHtcbiAgICAgIGNhY2hlLmtleSA9IGtleTtcbiAgICAgIHRoaXMuZ2V0Q2FjaGVzQXQobHZsKS5zZXQoa2V5LCBjYWNoZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoZWxlLCBsdmwsIGNhY2hlKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHRoaXMuc2V0Q2FjaGUoa2V5LCBsdmwsIGNhY2hlKTtcbiAgICAgIHRoaXMudXBkYXRlS2V5TWFwcGluZ0ZvcihlbGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWxldGVDYWNoZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWxldGVDYWNoZShrZXksIGx2bCkge1xuICAgICAgdGhpcy5nZXRDYWNoZXNBdChsdmwpW1wiZGVsZXRlXCJdKGtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVsZXRlKGVsZSwgbHZsKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5nZXRLZXkoZWxlKTtcbiAgICAgIHRoaXMuZGVsZXRlQ2FjaGUoa2V5LCBsdmwpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnZhbGlkYXRlS2V5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludmFsaWRhdGVLZXkoa2V5KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgdGhpcy5sdmxzLmZvckVhY2goZnVuY3Rpb24gKGx2bCkge1xuICAgICAgICByZXR1cm4gX3RoaXMuZGVsZXRlQ2FjaGUoa2V5LCBsdmwpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyB0cnVlIGlmIG5vIG90aGVyIGVsZXMgcmVmZXJlbmNlIHRoZSBpbnZhbGlkYXRlZCBjYWNoZSAobi5iLiBvdGhlciBlbGVzIG1heSBuZWVkIHRoZSBjYWNoZSB3aXRoIHRoZSBzYW1lIGtleSlcbiAgfSwge1xuICAgIGtleTogXCJpbnZhbGlkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludmFsaWRhdGUoZWxlKSB7XG4gICAgICB2YXIgaWQgPSBlbGUuaWQoKTtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmtleUZvcklkLmdldChpZCk7IC8vIG4uYi4gdXNlIHN0b3JlZCBrZXkgcmF0aGVyIHRoYW4gY3VycmVudCAocG90ZW50aWFsIGtleSlcblxuICAgICAgdGhpcy5kZWxldGVLZXlNYXBwaW5nRm9yKGVsZSk7XG4gICAgICB2YXIgZW50aXJlS2V5SW52YWxpZGF0ZWQgPSB0aGlzLmRvZXNFbGVJbnZhbGlkYXRlS2V5KGVsZSk7XG4gICAgICBpZiAoZW50aXJlS2V5SW52YWxpZGF0ZWQpIHtcbiAgICAgICAgLy8gY2xlYXIgbWFwcGluZyBmb3IgY3VycmVudCBrZXlcbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlS2V5KGtleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50aXJlS2V5SW52YWxpZGF0ZWQgfHwgdGhpcy5nZXROdW1iZXJPZklkc0ZvcktleShrZXkpID09PSAwO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gRWxlbWVudFRleHR1cmVDYWNoZUxvb2t1cDtcbn0oKTtcblxudmFyIG1pblR4ckggPSAyNTsgLy8gdGhlIHNpemUgb2YgdGhlIHRleHR1cmUgY2FjaGUgZm9yIHNtYWxsIGhlaWdodCBlbGVzIChzcGVjaWFsIGNhc2UpXG52YXIgdHhyU3RlcEggPSA1MDsgLy8gdGhlIG1pbiBzaXplIG9mIHRoZSByZWd1bGFyIGNhY2hlLCBhbmQgdGhlIHNpemUgaXQgaW5jcmVhc2VzIHdpdGggZWFjaCBzdGVwIHVwXG52YXIgbWluTHZsJDEgPSAtNDsgLy8gd2hlbiBzY2FsaW5nIHNtYWxsZXIgdGhhbiB0aGF0IHdlIGRvbid0IG5lZWQgdG8gcmUtcmVuZGVyXG52YXIgbWF4THZsJDEgPSAzOyAvLyB3aGVuIGxhcmdlciB0aGFuIHRoaXMgc2NhbGUganVzdCByZW5kZXIgZGlyZWN0bHkgKGNhY2hpbmcgaXMgbm90IGhlbHBmdWwpXG52YXIgbWF4Wm9vbSQxID0gNy45OTsgLy8gYmV5b25kIHRoaXMgem9vbSBsZXZlbCwgbGF5ZXJlZCB0ZXh0dXJlcyBhcmUgbm90IHVzZWRcbnZhciBlbGVUeHJTcGFjaW5nID0gODsgLy8gc3BhY2luZyBiZXR3ZWVuIGVsZW1lbnRzIG9uIHRleHR1cmVzIHRvIGF2b2lkIGJsaXR0aW5nIG92ZXJsYXBzXG52YXIgZGVmVHhyV2lkdGggPSAxMDI0OyAvLyBkZWZhdWx0L21pbmltdW0gdGV4dHVyZSB3aWR0aFxudmFyIG1heFR4clcgPSAxMDI0OyAvLyB0aGUgbWF4aW11bSB3aWR0aCBvZiBhIHRleHR1cmVcbnZhciBtYXhUeHJIID0gMTAyNDsgLy8gdGhlIG1heGltdW0gaGVpZ2h0IG9mIGEgdGV4dHVyZVxudmFyIG1pblV0aWxpdHkgPSAwLjI7IC8vIGlmIHVzYWdlIG9mIHRleHR1cmUgaXMgbGVzcyB0aGFuIHRoaXMsIGl0IGlzIHJldGlyZWRcbnZhciBtYXhGdWxsbmVzcyA9IDAuODsgLy8gZnVsbG5lc3Mgb2YgdGV4dHVyZSBhZnRlciB3aGljaCBxdWV1ZSByZW1vdmFsIGlzIGNoZWNrZWRcbnZhciBtYXhGdWxsbmVzc0NoZWNrcyA9IDEwOyAvLyBkZXF1ZXVlZCBhZnRlciB0aGlzIG1hbnkgY2hlY2tzXG52YXIgZGVxQ29zdCQxID0gMC4xNTsgLy8gJSBvZiBhZGQnbCByZW5kZXJpbmcgY29zdCBhbGxvd2VkIGZvciBkZXF1ZXVpbmcgZWxlIGNhY2hlcyBlYWNoIGZyYW1lXG52YXIgZGVxQXZnQ29zdCQxID0gMC4xOyAvLyAlIG9mIGFkZCdsIHJlbmRlcmluZyBjb3N0IGNvbXBhcmVkIHRvIGF2ZXJhZ2Ugb3ZlcmFsbCByZWRyYXcgdGltZVxudmFyIGRlcU5vRHJhd0Nvc3QkMSA9IDAuOTsgLy8gJSBvZiBhdmcgZnJhbWUgdGltZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBkZXF1ZXVlaW5nIHdoZW4gbm90IGRyYXdpbmdcbnZhciBkZXFGYXN0Q29zdCQxID0gMC45OyAvLyAlIG9mIGZyYW1lIHRpbWUgdG8gYmUgdXNlZCB3aGVuID42MGZwc1xudmFyIGRlcVJlZHJhd1RocmVzaG9sZCQxID0gMTAwOyAvLyB0aW1lIHRvIGJhdGNoIHJlZHJhd3MgdG9nZXRoZXIgZnJvbSBkZXF1ZXVlaW5nIHRvIGFsbG93IG1vcmUgZGVxdWV1ZWluZyBjYWxjcyB0byBoYXBwZW4gaW4gdGhlIG1lYW53aGlsZVxudmFyIG1heERlcVNpemUkMSA9IDE7IC8vIG51bWJlciBvZiBlbGVzIHRvIGRlcXVldWUgYW5kIHJlbmRlciBhdCBoaWdoZXIgdGV4dHVyZSBpbiBlYWNoIGJhdGNoXG5cbnZhciBnZXRUeHJSZWFzb25zID0ge1xuICBkZXF1ZXVlOiAnZGVxdWV1ZScsXG4gIGRvd25zY2FsZTogJ2Rvd25zY2FsZScsXG4gIGhpZ2hRdWFsaXR5OiAnaGlnaFF1YWxpdHknXG59O1xudmFyIGluaXREZWZhdWx0cyA9IGRlZmF1bHRzJGcoe1xuICBnZXRLZXk6IG51bGwsXG4gIGRvZXNFbGVJbnZhbGlkYXRlS2V5OiBmYWxzaWZ5LFxuICBkcmF3RWxlbWVudDogbnVsbCxcbiAgZ2V0Qm91bmRpbmdCb3g6IG51bGwsXG4gIGdldFJvdGF0aW9uUG9pbnQ6IG51bGwsXG4gIGdldFJvdGF0aW9uT2Zmc2V0OiBudWxsLFxuICBpc1Zpc2libGU6IHRydWVpZnksXG4gIGFsbG93RWRnZVR4ckNhY2hpbmc6IHRydWUsXG4gIGFsbG93UGFyZW50VHhyQ2FjaGluZzogdHJ1ZVxufSk7XG52YXIgRWxlbWVudFRleHR1cmVDYWNoZSA9IGZ1bmN0aW9uIEVsZW1lbnRUZXh0dXJlQ2FjaGUocmVuZGVyZXIsIGluaXRPcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICBzZWxmLm9uRGVxdWV1ZXMgPSBbXTtcbiAgdmFyIG9wdHMgPSBpbml0RGVmYXVsdHMoaW5pdE9wdGlvbnMpO1xuICBleHRlbmQoc2VsZiwgb3B0cyk7XG4gIHNlbGYubG9va3VwID0gbmV3IEVsZW1lbnRUZXh0dXJlQ2FjaGVMb29rdXAob3B0cy5nZXRLZXksIG9wdHMuZG9lc0VsZUludmFsaWRhdGVLZXkpO1xuICBzZWxmLnNldHVwRGVxdWV1ZWluZygpO1xufTtcbnZhciBFVENwID0gRWxlbWVudFRleHR1cmVDYWNoZS5wcm90b3R5cGU7XG5FVENwLnJlYXNvbnMgPSBnZXRUeHJSZWFzb25zO1xuXG4vLyB0aGUgbGlzdCBvZiB0ZXh0dXJlcyBpbiB3aGljaCBuZXcgc3VidGV4dHVyZXMgZm9yIGVsZW1lbnRzIGNhbiBiZSBwbGFjZWRcbkVUQ3AuZ2V0VGV4dHVyZVF1ZXVlID0gZnVuY3Rpb24gKHR4ckgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLmVsZUltZ0NhY2hlcyA9IHNlbGYuZWxlSW1nQ2FjaGVzIHx8IHt9O1xuICByZXR1cm4gc2VsZi5lbGVJbWdDYWNoZXNbdHhySF0gPSBzZWxmLmVsZUltZ0NhY2hlc1t0eHJIXSB8fCBbXTtcbn07XG5cbi8vIHRoZSBsaXN0IG9mIHVzdXNlZCB0ZXh0dXJlcyB3aGljaCBjYW4gYmUgcmVjeWNsZWQgKGluIHVzZSBpbiB0ZXh0dXJlIHF1ZXVlKVxuRVRDcC5nZXRSZXRpcmVkVGV4dHVyZVF1ZXVlID0gZnVuY3Rpb24gKHR4ckgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcnR4dHJRcyA9IHNlbGYuZWxlSW1nQ2FjaGVzLnJldGlyZWQgPSBzZWxmLmVsZUltZ0NhY2hlcy5yZXRpcmVkIHx8IHt9O1xuICB2YXIgcnR4dHJRID0gcnR4dHJRc1t0eHJIXSA9IHJ0eHRyUXNbdHhySF0gfHwgW107XG4gIHJldHVybiBydHh0clE7XG59O1xuXG4vLyBxdWV1ZSBvZiBlbGVtZW50IGRyYXcgcmVxdWVzdHMgYXQgZGlmZmVyZW50IHNjYWxlIGxldmVsc1xuRVRDcC5nZXRFbGVtZW50UXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHEgPSBzZWxmLmVsZUNhY2hlUXVldWUgPSBzZWxmLmVsZUNhY2hlUXVldWUgfHwgbmV3IGhlYXAoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYi5yZXFzIC0gYS5yZXFzO1xuICB9KTtcbiAgcmV0dXJuIHE7XG59O1xuXG4vLyBxdWV1ZSBvZiBlbGVtZW50IGRyYXcgcmVxdWVzdHMgYXQgZGlmZmVyZW50IHNjYWxlIGxldmVscyAoZWxlbWVudCBpZCBsb29rdXApXG5FVENwLmdldEVsZW1lbnRLZXlUb1F1ZXVlID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBrMnEgPSBzZWxmLmVsZUtleVRvQ2FjaGVRdWV1ZSA9IHNlbGYuZWxlS2V5VG9DYWNoZVF1ZXVlIHx8IHt9O1xuICByZXR1cm4gazJxO1xufTtcbkVUQ3AuZ2V0RWxlbWVudCA9IGZ1bmN0aW9uIChlbGUsIGJiLCBweFJhdGlvLCBsdmwsIHJlYXNvbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByID0gdGhpcy5yZW5kZXJlcjtcbiAgdmFyIHpvb20gPSByLmN5Lnpvb20oKTtcbiAgdmFyIGxvb2t1cCA9IHRoaXMubG9va3VwO1xuICBpZiAoIWJiIHx8IGJiLncgPT09IDAgfHwgYmIuaCA9PT0gMCB8fCBpc05hTihiYi53KSB8fCBpc05hTihiYi5oKSB8fCAhZWxlLnZpc2libGUoKSB8fCBlbGUucmVtb3ZlZCgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKCFzZWxmLmFsbG93RWRnZVR4ckNhY2hpbmcgJiYgZWxlLmlzRWRnZSgpIHx8ICFzZWxmLmFsbG93UGFyZW50VHhyQ2FjaGluZyAmJiBlbGUuaXNQYXJlbnQoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChsdmwgPT0gbnVsbCkge1xuICAgIGx2bCA9IE1hdGguY2VpbChsb2cyKHpvb20gKiBweFJhdGlvKSk7XG4gIH1cbiAgaWYgKGx2bCA8IG1pbkx2bCQxKSB7XG4gICAgbHZsID0gbWluTHZsJDE7XG4gIH0gZWxzZSBpZiAoem9vbSA+PSBtYXhab29tJDEgfHwgbHZsID4gbWF4THZsJDEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgc2NhbGUgPSBNYXRoLnBvdygyLCBsdmwpO1xuICB2YXIgZWxlU2NhbGVkSCA9IGJiLmggKiBzY2FsZTtcbiAgdmFyIGVsZVNjYWxlZFcgPSBiYi53ICogc2NhbGU7XG4gIHZhciBzY2FsZWRMYWJlbFNob3duID0gci5lbGVUZXh0QmlnZ2VyVGhhbk1pbihlbGUsIHNjYWxlKTtcbiAgaWYgKCF0aGlzLmlzVmlzaWJsZShlbGUsIHNjYWxlZExhYmVsU2hvd24pKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGVsZUNhY2hlID0gbG9va3VwLmdldChlbGUsIGx2bCk7XG5cbiAgLy8gaWYgdGhpcyBnZXQgd2FzIG9uIGFuIHVudXNlZC9pbnZhbGlkYXRlZCBjYWNoZSwgdGhlbiByZXN0b3JlIHRoZSB0ZXh0dXJlIHVzYWdlIG1ldHJpY1xuICBpZiAoZWxlQ2FjaGUgJiYgZWxlQ2FjaGUuaW52YWxpZGF0ZWQpIHtcbiAgICBlbGVDYWNoZS5pbnZhbGlkYXRlZCA9IGZhbHNlO1xuICAgIGVsZUNhY2hlLnRleHR1cmUuaW52YWxpZGF0ZWRXaWR0aCAtPSBlbGVDYWNoZS53aWR0aDtcbiAgfVxuICBpZiAoZWxlQ2FjaGUpIHtcbiAgICByZXR1cm4gZWxlQ2FjaGU7XG4gIH1cbiAgdmFyIHR4ckg7IC8vIHdoaWNoIHRleHR1cmUgaGVpZ2h0IHRoaXMgZWxlIGJlbG9uZ3MgdG9cblxuICBpZiAoZWxlU2NhbGVkSCA8PSBtaW5UeHJIKSB7XG4gICAgdHhySCA9IG1pblR4ckg7XG4gIH0gZWxzZSBpZiAoZWxlU2NhbGVkSCA8PSB0eHJTdGVwSCkge1xuICAgIHR4ckggPSB0eHJTdGVwSDtcbiAgfSBlbHNlIHtcbiAgICB0eHJIID0gTWF0aC5jZWlsKGVsZVNjYWxlZEggLyB0eHJTdGVwSCkgKiB0eHJTdGVwSDtcbiAgfVxuICBpZiAoZWxlU2NhbGVkSCA+IG1heFR4ckggfHwgZWxlU2NhbGVkVyA+IG1heFR4clcpIHtcbiAgICByZXR1cm4gbnVsbDsgLy8gY2FjaGluZyBsYXJnZSBlbGVtZW50cyBpcyBub3QgZWZmaWNpZW50XG4gIH1cblxuICB2YXIgdHhyUSA9IHNlbGYuZ2V0VGV4dHVyZVF1ZXVlKHR4ckgpO1xuXG4gIC8vIGZpcnN0IHRyeSB0aGUgc2Vjb25kIGxhc3Qgb25lIGluIGNhc2UgaXQgaGFzIHNwYWNlIGF0IHRoZSBlbmRcbiAgdmFyIHR4ciA9IHR4clFbdHhyUS5sZW5ndGggLSAyXTtcbiAgdmFyIGFkZE5ld1R4ciA9IGZ1bmN0aW9uIGFkZE5ld1R4cigpIHtcbiAgICByZXR1cm4gc2VsZi5yZWN5Y2xlVGV4dHVyZSh0eHJILCBlbGVTY2FsZWRXKSB8fCBzZWxmLmFkZFRleHR1cmUodHhySCwgZWxlU2NhbGVkVyk7XG4gIH07XG5cbiAgLy8gdHJ5IHRoZSBsYXN0IG9uZSBpZiB0aGVyZSBpcyBubyBzZWNvbmQgbGFzdCBvbmVcbiAgaWYgKCF0eHIpIHtcbiAgICB0eHIgPSB0eHJRW3R4clEubGVuZ3RoIC0gMV07XG4gIH1cblxuICAvLyBpZiB0aGUgbGFzdCBvbmUgZG9lc24ndCBleGlzdCwgd2UgbmVlZCBhIGZpcnN0IG9uZVxuICBpZiAoIXR4cikge1xuICAgIHR4ciA9IGFkZE5ld1R4cigpO1xuICB9XG5cbiAgLy8gaWYgdGhlcmUncyBubyByb29tIGluIHRoZSBjdXJyZW50IHRleHR1cmUsIHdlIG5lZWQgYSBuZXcgb25lXG4gIGlmICh0eHIud2lkdGggLSB0eHIudXNlZFdpZHRoIDwgZWxlU2NhbGVkVykge1xuICAgIHR4ciA9IGFkZE5ld1R4cigpO1xuICB9XG4gIHZhciBzY2FsYWJsZUZyb20gPSBmdW5jdGlvbiBzY2FsYWJsZUZyb20ob3RoZXJDYWNoZSkge1xuICAgIHJldHVybiBvdGhlckNhY2hlICYmIG90aGVyQ2FjaGUuc2NhbGVkTGFiZWxTaG93biA9PT0gc2NhbGVkTGFiZWxTaG93bjtcbiAgfTtcbiAgdmFyIGRlcWluZyA9IHJlYXNvbiAmJiByZWFzb24gPT09IGdldFR4clJlYXNvbnMuZGVxdWV1ZTtcbiAgdmFyIGhpZ2hRdWFsaXR5UmVxID0gcmVhc29uICYmIHJlYXNvbiA9PT0gZ2V0VHhyUmVhc29ucy5oaWdoUXVhbGl0eTtcbiAgdmFyIGRvd25zY2FsZVJlcSA9IHJlYXNvbiAmJiByZWFzb24gPT09IGdldFR4clJlYXNvbnMuZG93bnNjYWxlO1xuICB2YXIgaGlnaGVyQ2FjaGU7IC8vIHRoZSBuZWFyZXN0IGNhY2hlIHdpdGggYSBoaWdoZXIgbGV2ZWxcbiAgZm9yICh2YXIgbCA9IGx2bCArIDE7IGwgPD0gbWF4THZsJDE7IGwrKykge1xuICAgIHZhciBjID0gbG9va3VwLmdldChlbGUsIGwpO1xuICAgIGlmIChjKSB7XG4gICAgICBoaWdoZXJDYWNoZSA9IGM7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdmFyIG9uZVVwQ2FjaGUgPSBoaWdoZXJDYWNoZSAmJiBoaWdoZXJDYWNoZS5sZXZlbCA9PT0gbHZsICsgMSA/IGhpZ2hlckNhY2hlIDogbnVsbDtcbiAgdmFyIGRvd25zY2FsZSA9IGZ1bmN0aW9uIGRvd25zY2FsZSgpIHtcbiAgICB0eHIuY29udGV4dC5kcmF3SW1hZ2Uob25lVXBDYWNoZS50ZXh0dXJlLmNhbnZhcywgb25lVXBDYWNoZS54LCAwLCBvbmVVcENhY2hlLndpZHRoLCBvbmVVcENhY2hlLmhlaWdodCwgdHhyLnVzZWRXaWR0aCwgMCwgZWxlU2NhbGVkVywgZWxlU2NhbGVkSCk7XG4gIH07XG5cbiAgLy8gcmVzZXQgZWxlIGFyZWEgaW4gdGV4dHVyZVxuICB0eHIuY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gIHR4ci5jb250ZXh0LmNsZWFyUmVjdCh0eHIudXNlZFdpZHRoLCAwLCBlbGVTY2FsZWRXLCB0eHJIKTtcbiAgaWYgKHNjYWxhYmxlRnJvbShvbmVVcENhY2hlKSkge1xuICAgIC8vIHRoZW4gd2UgY2FuIHJlbGF0aXZlbHkgY2hlYXBseSByZXNjYWxlIHRoZSBleGlzdGluZyBpbWFnZSB3L28gcmVyZW5kZXJpbmdcbiAgICBkb3duc2NhbGUoKTtcbiAgfSBlbHNlIGlmIChzY2FsYWJsZUZyb20oaGlnaGVyQ2FjaGUpKSB7XG4gICAgLy8gdGhlbiB1c2UgdGhlIGhpZ2hlciBjYWNoZSBmb3Igbm93IGFuZCBxdWV1ZSB0aGUgbmV4dCBsZXZlbCBkb3duXG4gICAgLy8gdG8gY2hlYXBseSBzY2FsZSB0b3dhcmRzIHRoZSBzbWFsbGVyIGxldmVsXG5cbiAgICBpZiAoaGlnaFF1YWxpdHlSZXEpIHtcbiAgICAgIGZvciAodmFyIF9sID0gaGlnaGVyQ2FjaGUubGV2ZWw7IF9sID4gbHZsOyBfbC0tKSB7XG4gICAgICAgIG9uZVVwQ2FjaGUgPSBzZWxmLmdldEVsZW1lbnQoZWxlLCBiYiwgcHhSYXRpbywgX2wsIGdldFR4clJlYXNvbnMuZG93bnNjYWxlKTtcbiAgICAgIH1cbiAgICAgIGRvd25zY2FsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnF1ZXVlRWxlbWVudChlbGUsIGhpZ2hlckNhY2hlLmxldmVsIC0gMSk7XG4gICAgICByZXR1cm4gaGlnaGVyQ2FjaGU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBsb3dlckNhY2hlOyAvLyB0aGUgbmVhcmVzdCBjYWNoZSB3aXRoIGEgbG93ZXIgbGV2ZWxcbiAgICBpZiAoIWRlcWluZyAmJiAhaGlnaFF1YWxpdHlSZXEgJiYgIWRvd25zY2FsZVJlcSkge1xuICAgICAgZm9yICh2YXIgX2wyID0gbHZsIC0gMTsgX2wyID49IG1pbkx2bCQxOyBfbDItLSkge1xuICAgICAgICB2YXIgX2MgPSBsb29rdXAuZ2V0KGVsZSwgX2wyKTtcbiAgICAgICAgaWYgKF9jKSB7XG4gICAgICAgICAgbG93ZXJDYWNoZSA9IF9jO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzY2FsYWJsZUZyb20obG93ZXJDYWNoZSkpIHtcbiAgICAgIC8vIHRoZW4gdXNlIHRoZSBsb3dlciBxdWFsaXR5IGNhY2hlIGZvciBub3cgYW5kIHF1ZXVlIHRoZSBiZXR0ZXIgb25lIGZvciBsYXRlclxuXG4gICAgICBzZWxmLnF1ZXVlRWxlbWVudChlbGUsIGx2bCk7XG4gICAgICByZXR1cm4gbG93ZXJDYWNoZTtcbiAgICB9XG4gICAgdHhyLmNvbnRleHQudHJhbnNsYXRlKHR4ci51c2VkV2lkdGgsIDApO1xuICAgIHR4ci5jb250ZXh0LnNjYWxlKHNjYWxlLCBzY2FsZSk7XG4gICAgdGhpcy5kcmF3RWxlbWVudCh0eHIuY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgZmFsc2UpO1xuICAgIHR4ci5jb250ZXh0LnNjYWxlKDEgLyBzY2FsZSwgMSAvIHNjYWxlKTtcbiAgICB0eHIuY29udGV4dC50cmFuc2xhdGUoLXR4ci51c2VkV2lkdGgsIDApO1xuICB9XG4gIGVsZUNhY2hlID0ge1xuICAgIHg6IHR4ci51c2VkV2lkdGgsXG4gICAgdGV4dHVyZTogdHhyLFxuICAgIGxldmVsOiBsdmwsXG4gICAgc2NhbGU6IHNjYWxlLFxuICAgIHdpZHRoOiBlbGVTY2FsZWRXLFxuICAgIGhlaWdodDogZWxlU2NhbGVkSCxcbiAgICBzY2FsZWRMYWJlbFNob3duOiBzY2FsZWRMYWJlbFNob3duXG4gIH07XG4gIHR4ci51c2VkV2lkdGggKz0gTWF0aC5jZWlsKGVsZVNjYWxlZFcgKyBlbGVUeHJTcGFjaW5nKTtcbiAgdHhyLmVsZUNhY2hlcy5wdXNoKGVsZUNhY2hlKTtcbiAgbG9va3VwLnNldChlbGUsIGx2bCwgZWxlQ2FjaGUpO1xuICBzZWxmLmNoZWNrVGV4dHVyZUZ1bGxuZXNzKHR4cik7XG4gIHJldHVybiBlbGVDYWNoZTtcbn07XG5FVENwLmludmFsaWRhdGVFbGVtZW50cyA9IGZ1bmN0aW9uIChlbGVzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMuaW52YWxpZGF0ZUVsZW1lbnQoZWxlc1tpXSk7XG4gIH1cbn07XG5FVENwLmludmFsaWRhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGVsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBsb29rdXAgPSBzZWxmLmxvb2t1cDtcbiAgdmFyIGNhY2hlcyA9IFtdO1xuICB2YXIgaW52YWxpZCA9IGxvb2t1cC5pc0ludmFsaWQoZWxlKTtcbiAgaWYgKCFpbnZhbGlkKSB7XG4gICAgcmV0dXJuOyAvLyBvdmVycmlkZSB0aGUgaW52YWxpZGF0aW9uIHJlcXVlc3QgaWYgdGhlIGVsZW1lbnQga2V5IGhhcyBub3QgY2hhbmdlZFxuICB9XG5cbiAgZm9yICh2YXIgbHZsID0gbWluTHZsJDE7IGx2bCA8PSBtYXhMdmwkMTsgbHZsKyspIHtcbiAgICB2YXIgY2FjaGUgPSBsb29rdXAuZ2V0Rm9yQ2FjaGVkS2V5KGVsZSwgbHZsKTtcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlcy5wdXNoKGNhY2hlKTtcbiAgICB9XG4gIH1cbiAgdmFyIG5vT3RoZXJFbGVzVXNlQ2FjaGUgPSBsb29rdXAuaW52YWxpZGF0ZShlbGUpO1xuICBpZiAobm9PdGhlckVsZXNVc2VDYWNoZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgX2NhY2hlID0gY2FjaGVzW2ldO1xuICAgICAgdmFyIHR4ciA9IF9jYWNoZS50ZXh0dXJlO1xuXG4gICAgICAvLyByZW1vdmUgc3BhY2UgZnJvbSB0aGUgdGV4dHVyZSBpdCBiZWxvbmdzIHRvXG4gICAgICB0eHIuaW52YWxpZGF0ZWRXaWR0aCArPSBfY2FjaGUud2lkdGg7XG5cbiAgICAgIC8vIG1hcmsgdGhlIGNhY2hlIGFzIGludmFsaWRhdGVkXG4gICAgICBfY2FjaGUuaW52YWxpZGF0ZWQgPSB0cnVlO1xuXG4gICAgICAvLyByZXRpcmUgdGhlIHRleHR1cmUgaWYgaXRzIHV0aWxpdHkgaXMgbG93XG4gICAgICBzZWxmLmNoZWNrVGV4dHVyZVV0aWxpdHkodHhyKTtcbiAgICB9XG4gIH1cblxuICAvLyByZW1vdmUgZnJvbSBxdWV1ZSBzaW5jZSB0aGUgb2xkIHJlcSB3YXMgZm9yIHRoZSBvbGQgc3RhdGVcbiAgc2VsZi5yZW1vdmVGcm9tUXVldWUoZWxlKTtcbn07XG5FVENwLmNoZWNrVGV4dHVyZVV0aWxpdHkgPSBmdW5jdGlvbiAodHhyKSB7XG4gIC8vIGludmFsaWRhdGUgYWxsIGVudHJpZXMgaW4gdGhlIGNhY2hlIGlmIHRoZSBjYWNoZSBzaXplIGlzIHNtYWxsXG4gIGlmICh0eHIuaW52YWxpZGF0ZWRXaWR0aCA+PSBtaW5VdGlsaXR5ICogdHhyLndpZHRoKSB7XG4gICAgdGhpcy5yZXRpcmVUZXh0dXJlKHR4cik7XG4gIH1cbn07XG5FVENwLmNoZWNrVGV4dHVyZUZ1bGxuZXNzID0gZnVuY3Rpb24gKHR4cikge1xuICAvLyBpZiB0ZXh0dXJlIGhhcyBiZWVuIG1vc3RseSBmaWxsZWQgYW5kIHBhc3NlZCBvdmVyIHNldmVyYWwgdGltZXMsIHJlbW92ZVxuICAvLyBpdCBmcm9tIHRoZSBxdWV1ZSBzbyB3ZSBkb24ndCBuZWVkIHRvIHdhc3RlIHRpbWUgbG9va2luZyBhdCBpdCB0byBwdXQgbmV3IHRoaW5nc1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHR4clEgPSBzZWxmLmdldFRleHR1cmVRdWV1ZSh0eHIuaGVpZ2h0KTtcbiAgaWYgKHR4ci51c2VkV2lkdGggLyB0eHIud2lkdGggPiBtYXhGdWxsbmVzcyAmJiB0eHIuZnVsbG5lc3NDaGVja3MgPj0gbWF4RnVsbG5lc3NDaGVja3MpIHtcbiAgICByZW1vdmVGcm9tQXJyYXkodHhyUSwgdHhyKTtcbiAgfSBlbHNlIHtcbiAgICB0eHIuZnVsbG5lc3NDaGVja3MrKztcbiAgfVxufTtcbkVUQ3AucmV0aXJlVGV4dHVyZSA9IGZ1bmN0aW9uICh0eHIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgdHhySCA9IHR4ci5oZWlnaHQ7XG4gIHZhciB0eHJRID0gc2VsZi5nZXRUZXh0dXJlUXVldWUodHhySCk7XG4gIHZhciBsb29rdXAgPSB0aGlzLmxvb2t1cDtcblxuICAvLyByZXRpcmUgdGhlIHRleHR1cmUgZnJvbSB0aGUgYWN0aXZlIC8gc2VhcmNoYWJsZSBxdWV1ZTpcblxuICByZW1vdmVGcm9tQXJyYXkodHhyUSwgdHhyKTtcbiAgdHhyLnJldGlyZWQgPSB0cnVlO1xuXG4gIC8vIHJlbW92ZSB0aGUgcmVmcyBmcm9tIHRoZSBlbGVzIHRvIHRoZSBjYWNoZXM6XG5cbiAgdmFyIGVsZUNhY2hlcyA9IHR4ci5lbGVDYWNoZXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlQ2FjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZUNhY2hlID0gZWxlQ2FjaGVzW2ldO1xuICAgIGxvb2t1cC5kZWxldGVDYWNoZShlbGVDYWNoZS5rZXksIGVsZUNhY2hlLmxldmVsKTtcbiAgfVxuICBjbGVhckFycmF5KGVsZUNhY2hlcyk7XG5cbiAgLy8gYWRkIHRoZSB0ZXh0dXJlIHRvIGEgcmV0aXJlZCBxdWV1ZSBzbyBpdCBjYW4gYmUgcmVjeWNsZWQgaW4gZnV0dXJlOlxuXG4gIHZhciBydHh0clEgPSBzZWxmLmdldFJldGlyZWRUZXh0dXJlUXVldWUodHhySCk7XG4gIHJ0eHRyUS5wdXNoKHR4cik7XG59O1xuRVRDcC5hZGRUZXh0dXJlID0gZnVuY3Rpb24gKHR4ckgsIG1pblcpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgdHhyUSA9IHNlbGYuZ2V0VGV4dHVyZVF1ZXVlKHR4ckgpO1xuICB2YXIgdHhyID0ge307XG4gIHR4clEucHVzaCh0eHIpO1xuICB0eHIuZWxlQ2FjaGVzID0gW107XG4gIHR4ci5oZWlnaHQgPSB0eHJIO1xuICB0eHIud2lkdGggPSBNYXRoLm1heChkZWZUeHJXaWR0aCwgbWluVyk7XG4gIHR4ci51c2VkV2lkdGggPSAwO1xuICB0eHIuaW52YWxpZGF0ZWRXaWR0aCA9IDA7XG4gIHR4ci5mdWxsbmVzc0NoZWNrcyA9IDA7XG4gIHR4ci5jYW52YXMgPSBzZWxmLnJlbmRlcmVyLm1ha2VPZmZzY3JlZW5DYW52YXModHhyLndpZHRoLCB0eHIuaGVpZ2h0KTtcbiAgdHhyLmNvbnRleHQgPSB0eHIuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gIHJldHVybiB0eHI7XG59O1xuRVRDcC5yZWN5Y2xlVGV4dHVyZSA9IGZ1bmN0aW9uICh0eHJILCBtaW5XKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHR4clEgPSBzZWxmLmdldFRleHR1cmVRdWV1ZSh0eHJIKTtcbiAgdmFyIHJ0eHRyUSA9IHNlbGYuZ2V0UmV0aXJlZFRleHR1cmVRdWV1ZSh0eHJIKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBydHh0clEubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdHhyID0gcnR4dHJRW2ldO1xuICAgIGlmICh0eHIud2lkdGggPj0gbWluVykge1xuICAgICAgdHhyLnJldGlyZWQgPSBmYWxzZTtcbiAgICAgIHR4ci51c2VkV2lkdGggPSAwO1xuICAgICAgdHhyLmludmFsaWRhdGVkV2lkdGggPSAwO1xuICAgICAgdHhyLmZ1bGxuZXNzQ2hlY2tzID0gMDtcbiAgICAgIGNsZWFyQXJyYXkodHhyLmVsZUNhY2hlcyk7XG4gICAgICB0eHIuY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICB0eHIuY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdHhyLndpZHRoLCB0eHIuaGVpZ2h0KTtcbiAgICAgIHJlbW92ZUZyb21BcnJheShydHh0clEsIHR4cik7XG4gICAgICB0eHJRLnB1c2godHhyKTtcbiAgICAgIHJldHVybiB0eHI7XG4gICAgfVxuICB9XG59O1xuRVRDcC5xdWV1ZUVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlLCBsdmwpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcSA9IHNlbGYuZ2V0RWxlbWVudFF1ZXVlKCk7XG4gIHZhciBrMnEgPSBzZWxmLmdldEVsZW1lbnRLZXlUb1F1ZXVlKCk7XG4gIHZhciBrZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICB2YXIgZXhpc3RpbmdSZXEgPSBrMnFba2V5XTtcbiAgaWYgKGV4aXN0aW5nUmVxKSB7XG4gICAgLy8gdXNlIHRoZSBtYXggbHZsIGIvYyBpbiBiZXR3ZWVuIGx2bHMgYXJlIGNoZWFwIHRvIG1ha2VcbiAgICBleGlzdGluZ1JlcS5sZXZlbCA9IE1hdGgubWF4KGV4aXN0aW5nUmVxLmxldmVsLCBsdmwpO1xuICAgIGV4aXN0aW5nUmVxLmVsZXMubWVyZ2UoZWxlKTtcbiAgICBleGlzdGluZ1JlcS5yZXFzKys7XG4gICAgcS51cGRhdGVJdGVtKGV4aXN0aW5nUmVxKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcmVxID0ge1xuICAgICAgZWxlczogZWxlLnNwYXduKCkubWVyZ2UoZWxlKSxcbiAgICAgIGxldmVsOiBsdmwsXG4gICAgICByZXFzOiAxLFxuICAgICAga2V5OiBrZXlcbiAgICB9O1xuICAgIHEucHVzaChyZXEpO1xuICAgIGsycVtrZXldID0gcmVxO1xuICB9XG59O1xuRVRDcC5kZXF1ZXVlID0gZnVuY3Rpb24gKHB4UmF0aW8gLyosIGV4dGVudCovKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHEgPSBzZWxmLmdldEVsZW1lbnRRdWV1ZSgpO1xuICB2YXIgazJxID0gc2VsZi5nZXRFbGVtZW50S2V5VG9RdWV1ZSgpO1xuICB2YXIgZGVxdWV1ZWQgPSBbXTtcbiAgdmFyIGxvb2t1cCA9IHNlbGYubG9va3VwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1heERlcVNpemUkMTsgaSsrKSB7XG4gICAgaWYgKHEuc2l6ZSgpID4gMCkge1xuICAgICAgdmFyIHJlcSA9IHEucG9wKCk7XG4gICAgICB2YXIga2V5ID0gcmVxLmtleTtcbiAgICAgIHZhciBlbGUgPSByZXEuZWxlc1swXTsgLy8gYWxsIGVsZXMgaGF2ZSB0aGUgc2FtZSBrZXlcbiAgICAgIHZhciBjYWNoZUV4aXN0cyA9IGxvb2t1cC5oYXNDYWNoZShlbGUsIHJlcS5sZXZlbCk7XG5cbiAgICAgIC8vIGNsZWFyIG91dCB0aGUga2V5IHRvIHJlcSBsb29rdXBcbiAgICAgIGsycVtrZXldID0gbnVsbDtcblxuICAgICAgLy8gZGVxdWV1ZWluZyBpc24ndCBuZWNlc3Nhcnkgd2l0aCBhbiBleGlzdGluZyBjYWNoZVxuICAgICAgaWYgKGNhY2hlRXhpc3RzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZGVxdWV1ZWQucHVzaChyZXEpO1xuICAgICAgdmFyIGJiID0gc2VsZi5nZXRCb3VuZGluZ0JveChlbGUpO1xuICAgICAgc2VsZi5nZXRFbGVtZW50KGVsZSwgYmIsIHB4UmF0aW8sIHJlcS5sZXZlbCwgZ2V0VHhyUmVhc29ucy5kZXF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXF1ZXVlZDtcbn07XG5FVENwLnJlbW92ZUZyb21RdWV1ZSA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcSA9IHNlbGYuZ2V0RWxlbWVudFF1ZXVlKCk7XG4gIHZhciBrMnEgPSBzZWxmLmdldEVsZW1lbnRLZXlUb1F1ZXVlKCk7XG4gIHZhciBrZXkgPSB0aGlzLmdldEtleShlbGUpO1xuICB2YXIgcmVxID0gazJxW2tleV07XG4gIGlmIChyZXEgIT0gbnVsbCkge1xuICAgIGlmIChyZXEuZWxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIHJlbW92ZSBpZiBsYXN0IGVsZSBpbiB0aGUgcmVxXG4gICAgICAvLyBicmluZyB0byBmcm9udCBvZiBxdWV1ZVxuICAgICAgcmVxLnJlcXMgPSBNQVhfSU5UJDE7XG4gICAgICBxLnVwZGF0ZUl0ZW0ocmVxKTtcbiAgICAgIHEucG9wKCk7IC8vIHJlbW92ZSBmcm9tIHF1ZXVlXG5cbiAgICAgIGsycVtrZXldID0gbnVsbDsgLy8gcmVtb3ZlIGZyb20gbG9va3VwIG1hcFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2UganVzdCByZW1vdmUgZWxlIGZyb20gcmVxXG4gICAgICByZXEuZWxlcy51bm1lcmdlKGVsZSk7XG4gICAgfVxuICB9XG59O1xuRVRDcC5vbkRlcXVldWUgPSBmdW5jdGlvbiAoZm4pIHtcbiAgdGhpcy5vbkRlcXVldWVzLnB1c2goZm4pO1xufTtcbkVUQ3Aub2ZmRGVxdWV1ZSA9IGZ1bmN0aW9uIChmbikge1xuICByZW1vdmVGcm9tQXJyYXkodGhpcy5vbkRlcXVldWVzLCBmbik7XG59O1xuRVRDcC5zZXR1cERlcXVldWVpbmcgPSBkZWZzLnNldHVwRGVxdWV1ZWluZyh7XG4gIGRlcVJlZHJhd1RocmVzaG9sZDogZGVxUmVkcmF3VGhyZXNob2xkJDEsXG4gIGRlcUNvc3Q6IGRlcUNvc3QkMSxcbiAgZGVxQXZnQ29zdDogZGVxQXZnQ29zdCQxLFxuICBkZXFOb0RyYXdDb3N0OiBkZXFOb0RyYXdDb3N0JDEsXG4gIGRlcUZhc3RDb3N0OiBkZXFGYXN0Q29zdCQxLFxuICBkZXE6IGZ1bmN0aW9uIGRlcShzZWxmLCBweFJhdGlvLCBleHRlbnQpIHtcbiAgICByZXR1cm4gc2VsZi5kZXF1ZXVlKHB4UmF0aW8sIGV4dGVudCk7XG4gIH0sXG4gIG9uRGVxZDogZnVuY3Rpb24gb25EZXFkKHNlbGYsIGRlcWQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYub25EZXF1ZXVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGZuID0gc2VsZi5vbkRlcXVldWVzW2ldO1xuICAgICAgZm4oZGVxZCk7XG4gICAgfVxuICB9LFxuICBzaG91bGRSZWRyYXc6IGZ1bmN0aW9uIHNob3VsZFJlZHJhdyhzZWxmLCBkZXFkLCBweFJhdGlvLCBleHRlbnQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGVzID0gZGVxZFtpXS5lbGVzO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBlbGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBiYiA9IGVsZXNbal0uYm91bmRpbmdCb3goKTtcbiAgICAgICAgaWYgKGJvdW5kaW5nQm94ZXNJbnRlcnNlY3QoYmIsIGV4dGVudCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIHByaW9yaXR5OiBmdW5jdGlvbiBwcmlvcml0eShzZWxmKSB7XG4gICAgcmV0dXJuIHNlbGYucmVuZGVyZXIuYmVmb3JlUmVuZGVyUHJpb3JpdGllcy5lbGVUeHJEZXE7XG4gIH1cbn0pO1xuXG52YXIgZGVmTnVtTGF5ZXJzID0gMTsgLy8gZGVmYXVsdCBudW1iZXIgb2YgbGF5ZXJzIHRvIHVzZVxudmFyIG1pbkx2bCA9IC00OyAvLyB3aGVuIHNjYWxpbmcgc21hbGxlciB0aGFuIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byByZS1yZW5kZXJcbnZhciBtYXhMdmwgPSAyOyAvLyB3aGVuIGxhcmdlciB0aGFuIHRoaXMgc2NhbGUganVzdCByZW5kZXIgZGlyZWN0bHkgKGNhY2hpbmcgaXMgbm90IGhlbHBmdWwpXG52YXIgbWF4Wm9vbSA9IDMuOTk7IC8vIGJleW9uZCB0aGlzIHpvb20gbGV2ZWwsIGxheWVyZWQgdGV4dHVyZXMgYXJlIG5vdCB1c2VkXG52YXIgZGVxUmVkcmF3VGhyZXNob2xkID0gNTA7IC8vIHRpbWUgdG8gYmF0Y2ggcmVkcmF3cyB0b2dldGhlciBmcm9tIGRlcXVldWVpbmcgdG8gYWxsb3cgbW9yZSBkZXF1ZXVlaW5nIGNhbGNzIHRvIGhhcHBlbiBpbiB0aGUgbWVhbndoaWxlXG52YXIgcmVmaW5lRWxlRGVib3VuY2VUaW1lID0gNTA7IC8vIHRpbWUgdG8gZGVib3VuY2Ugc2hhcnBlciBlbGUgdGV4dHVyZSB1cGRhdGVzXG52YXIgZGVxQ29zdCA9IDAuMTU7IC8vICUgb2YgYWRkJ2wgcmVuZGVyaW5nIGNvc3QgYWxsb3dlZCBmb3IgZGVxdWV1aW5nIGVsZSBjYWNoZXMgZWFjaCBmcmFtZVxudmFyIGRlcUF2Z0Nvc3QgPSAwLjE7IC8vICUgb2YgYWRkJ2wgcmVuZGVyaW5nIGNvc3QgY29tcGFyZWQgdG8gYXZlcmFnZSBvdmVyYWxsIHJlZHJhdyB0aW1lXG52YXIgZGVxTm9EcmF3Q29zdCA9IDAuOTsgLy8gJSBvZiBhdmcgZnJhbWUgdGltZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBkZXF1ZXVlaW5nIHdoZW4gbm90IGRyYXdpbmdcbnZhciBkZXFGYXN0Q29zdCA9IDAuOTsgLy8gJSBvZiBmcmFtZSB0aW1lIHRvIGJlIHVzZWQgd2hlbiA+NjBmcHNcbnZhciBtYXhEZXFTaXplID0gMTsgLy8gbnVtYmVyIG9mIGVsZXMgdG8gZGVxdWV1ZSBhbmQgcmVuZGVyIGF0IGhpZ2hlciB0ZXh0dXJlIGluIGVhY2ggYmF0Y2hcbnZhciBpbnZhbGlkVGhyZXNob2xkID0gMjUwOyAvLyB0aW1lIHRocmVzaG9sZCBmb3IgZGlzYWJsaW5nIGIvYyBvZiBpbnZhbGlkYXRpb25zXG52YXIgbWF4TGF5ZXJBcmVhID0gNDAwMCAqIDQwMDA7IC8vIGxheWVycyBjYW4ndCBiZSBiaWdnZXIgdGhhbiB0aGlzXG52YXIgdXNlSGlnaFF1YWxpdHlFbGVUeHJSZXFzID0gdHJ1ZTsgLy8gd2hldGhlciB0byB1c2UgaGlnaCBxdWFsaXR5IGVsZSB0eHIgcmVxdWVzdHMgKGdlbmVyYWxseSBmYXN0ZXIgYW5kIGNoZWFwZXIgaW4gdGhlIGxvbmd0ZXJtKVxuXG4vLyB2YXIgbG9nID0gZnVuY3Rpb24oKXsgY29uc29sZS5sb2cuYXBwbHkoIGNvbnNvbGUsIGFyZ3VtZW50cyApOyB9O1xuXG52YXIgTGF5ZXJlZFRleHR1cmVDYWNoZSA9IGZ1bmN0aW9uIExheWVyZWRUZXh0dXJlQ2FjaGUocmVuZGVyZXIpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgciA9IHNlbGYucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgdmFyIGN5ID0gci5jeTtcbiAgc2VsZi5sYXllcnNCeUxldmVsID0ge307IC8vIGUuZy4gMiA9PiBbIGxheWVyMSwgbGF5ZXIyLCAuLi4sIGxheWVyTiBdXG5cbiAgc2VsZi5maXJzdEdldCA9IHRydWU7XG4gIHNlbGYubGFzdEludmFsaWRhdGlvblRpbWUgPSBwZXJmb3JtYW5jZU5vdygpIC0gMiAqIGludmFsaWRUaHJlc2hvbGQ7XG4gIHNlbGYuc2tpcHBpbmcgPSBmYWxzZTtcbiAgc2VsZi5lbGVUeHJEZXFzID0gY3kuY29sbGVjdGlvbigpO1xuICBzZWxmLnNjaGVkdWxlRWxlbWVudFJlZmluZW1lbnQgPSBkZWJvdW5jZV8xKGZ1bmN0aW9uICgpIHtcbiAgICBzZWxmLnJlZmluZUVsZW1lbnRUZXh0dXJlcyhzZWxmLmVsZVR4ckRlcXMpO1xuICAgIHNlbGYuZWxlVHhyRGVxcy51bm1lcmdlKHNlbGYuZWxlVHhyRGVxcyk7XG4gIH0sIHJlZmluZUVsZURlYm91bmNlVGltZSk7XG4gIHIuYmVmb3JlUmVuZGVyKGZ1bmN0aW9uICh3aWxsRHJhdywgbm93KSB7XG4gICAgaWYgKG5vdyAtIHNlbGYubGFzdEludmFsaWRhdGlvblRpbWUgPD0gaW52YWxpZFRocmVzaG9sZCkge1xuICAgICAgc2VsZi5za2lwcGluZyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuc2tpcHBpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH0sIHIuYmVmb3JlUmVuZGVyUHJpb3JpdGllcy5seXJUeHJTa2lwKTtcbiAgdmFyIHFTb3J0ID0gZnVuY3Rpb24gcVNvcnQoYSwgYikge1xuICAgIHJldHVybiBiLnJlcXMgLSBhLnJlcXM7XG4gIH07XG4gIHNlbGYubGF5ZXJzUXVldWUgPSBuZXcgaGVhcChxU29ydCk7XG4gIHNlbGYuc2V0dXBEZXF1ZXVlaW5nKCk7XG59O1xudmFyIExUQ3AgPSBMYXllcmVkVGV4dHVyZUNhY2hlLnByb3RvdHlwZTtcbnZhciBsYXllcklkUG9vbCA9IDA7XG52YXIgTUFYX0lOVCA9IE1hdGgucG93KDIsIDUzKSAtIDE7XG5MVENwLm1ha2VMYXllciA9IGZ1bmN0aW9uIChiYiwgbHZsKSB7XG4gIHZhciBzY2FsZSA9IE1hdGgucG93KDIsIGx2bCk7XG4gIHZhciB3ID0gTWF0aC5jZWlsKGJiLncgKiBzY2FsZSk7XG4gIHZhciBoID0gTWF0aC5jZWlsKGJiLmggKiBzY2FsZSk7XG4gIHZhciBjYW52YXMgPSB0aGlzLnJlbmRlcmVyLm1ha2VPZmZzY3JlZW5DYW52YXModywgaCk7XG4gIHZhciBsYXllciA9IHtcbiAgICBpZDogbGF5ZXJJZFBvb2wgPSArK2xheWVySWRQb29sICUgTUFYX0lOVCxcbiAgICBiYjogYmIsXG4gICAgbGV2ZWw6IGx2bCxcbiAgICB3aWR0aDogdyxcbiAgICBoZWlnaHQ6IGgsXG4gICAgY2FudmFzOiBjYW52YXMsXG4gICAgY29udGV4dDogY2FudmFzLmdldENvbnRleHQoJzJkJyksXG4gICAgZWxlczogW10sXG4gICAgZWxlc1F1ZXVlOiBbXSxcbiAgICByZXFzOiAwXG4gIH07XG5cbiAgLy8gbG9nKCdtYWtlIGxheWVyICVzIHdpdGggdyAlcyBhbmQgaCAlcyBhbmQgbHZsICVzJywgbGF5ZXIuaWQsIGxheWVyLndpZHRoLCBsYXllci5oZWlnaHQsIGxheWVyLmxldmVsKTtcblxuICB2YXIgY3h0ID0gbGF5ZXIuY29udGV4dDtcbiAgdmFyIGR4ID0gLWxheWVyLmJiLngxO1xuICB2YXIgZHkgPSAtbGF5ZXIuYmIueTE7XG5cbiAgLy8gZG8gdGhlIHRyYW5zZm9ybSBvbiBjcmVhdGlvbiB0byBzYXZlIGN5Y2xlcyAoaXQncyB0aGUgc2FtZSBmb3IgYWxsIGVsZXMpXG4gIGN4dC5zY2FsZShzY2FsZSwgc2NhbGUpO1xuICBjeHQudHJhbnNsYXRlKGR4LCBkeSk7XG4gIHJldHVybiBsYXllcjtcbn07XG5MVENwLmdldExheWVycyA9IGZ1bmN0aW9uIChlbGVzLCBweFJhdGlvLCBsdmwpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgciA9IHNlbGYucmVuZGVyZXI7XG4gIHZhciBjeSA9IHIuY3k7XG4gIHZhciB6b29tID0gY3kuem9vbSgpO1xuICB2YXIgZmlyc3RHZXQgPSBzZWxmLmZpcnN0R2V0O1xuICBzZWxmLmZpcnN0R2V0ID0gZmFsc2U7XG5cbiAgLy8gbG9nKCctLVxcbmdldCBsYXllcnMgd2l0aCAlcyBlbGVzJywgZWxlcy5sZW5ndGgpO1xuICAvL2xvZyBlbGVzLm1hcChmdW5jdGlvbihlbGUpeyByZXR1cm4gZWxlLmlkKCkgfSkgKTtcblxuICBpZiAobHZsID09IG51bGwpIHtcbiAgICBsdmwgPSBNYXRoLmNlaWwobG9nMih6b29tICogcHhSYXRpbykpO1xuICAgIGlmIChsdmwgPCBtaW5MdmwpIHtcbiAgICAgIGx2bCA9IG1pbkx2bDtcbiAgICB9IGVsc2UgaWYgKHpvb20gPj0gbWF4Wm9vbSB8fCBsdmwgPiBtYXhMdmwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBzZWxmLnZhbGlkYXRlTGF5ZXJzRWxlc09yZGVyaW5nKGx2bCwgZWxlcyk7XG4gIHZhciBsYXllcnNCeUx2bCA9IHNlbGYubGF5ZXJzQnlMZXZlbDtcbiAgdmFyIHNjYWxlID0gTWF0aC5wb3coMiwgbHZsKTtcbiAgdmFyIGxheWVycyA9IGxheWVyc0J5THZsW2x2bF0gPSBsYXllcnNCeUx2bFtsdmxdIHx8IFtdO1xuICB2YXIgYmI7XG4gIHZhciBsdmxDb21wbGV0ZSA9IHNlbGYubGV2ZWxJc0NvbXBsZXRlKGx2bCwgZWxlcyk7XG4gIHZhciB0bXBMYXllcnM7XG4gIHZhciBjaGVja1RlbXBMZXZlbHMgPSBmdW5jdGlvbiBjaGVja1RlbXBMZXZlbHMoKSB7XG4gICAgdmFyIGNhblVzZUFzVG1wTHZsID0gZnVuY3Rpb24gY2FuVXNlQXNUbXBMdmwobCkge1xuICAgICAgc2VsZi52YWxpZGF0ZUxheWVyc0VsZXNPcmRlcmluZyhsLCBlbGVzKTtcbiAgICAgIGlmIChzZWxmLmxldmVsSXNDb21wbGV0ZShsLCBlbGVzKSkge1xuICAgICAgICB0bXBMYXllcnMgPSBsYXllcnNCeUx2bFtsXTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgY2hlY2tMdmxzID0gZnVuY3Rpb24gY2hlY2tMdmxzKGRpcikge1xuICAgICAgaWYgKHRtcExheWVycykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBsID0gbHZsICsgZGlyOyBtaW5MdmwgPD0gbCAmJiBsIDw9IG1heEx2bDsgbCArPSBkaXIpIHtcbiAgICAgICAgaWYgKGNhblVzZUFzVG1wTHZsKGwpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGNoZWNrTHZscygrMSk7XG4gICAgY2hlY2tMdmxzKC0xKTtcblxuICAgIC8vIHJlbW92ZSB0aGUgaW52YWxpZCBsYXllcnM7IHRoZXkgd2lsbCBiZSByZXBsYWNlZCBhcyBuZWVkZWQgbGF0ZXIgaW4gdGhpcyBmdW5jdGlvblxuICAgIGZvciAodmFyIGkgPSBsYXllcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBsYXllciA9IGxheWVyc1tpXTtcbiAgICAgIGlmIChsYXllci5pbnZhbGlkKSB7XG4gICAgICAgIHJlbW92ZUZyb21BcnJheShsYXllcnMsIGxheWVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGlmICghbHZsQ29tcGxldGUpIHtcbiAgICAvLyBpZiB0aGUgY3VycmVudCBsZXZlbCBpcyBpbmNvbXBsZXRlLCB0aGVuIHVzZSB0aGUgY2xvc2VzdCwgYmVzdCBxdWFsaXR5IGxheWVyc2V0IHRlbXBvcmFyaWx5XG4gICAgLy8gYW5kIGxhdGVyIHF1ZXVlIHRoZSBjdXJyZW50IGxheWVyc2V0IHNvIHdlIGNhbiBnZXQgdGhlIHByb3BlciBxdWFsaXR5IGxldmVsIHNvb25cblxuICAgIGNoZWNrVGVtcExldmVscygpO1xuICB9IGVsc2Uge1xuICAgIC8vIGxvZygnbGV2ZWwgY29tcGxldGUsIHVzaW5nIGV4aXN0aW5nIGxheWVyc1xcbi0tJyk7XG4gICAgcmV0dXJuIGxheWVycztcbiAgfVxuICB2YXIgZ2V0QmIgPSBmdW5jdGlvbiBnZXRCYigpIHtcbiAgICBpZiAoIWJiKSB7XG4gICAgICBiYiA9IG1ha2VCb3VuZGluZ0JveCgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHVwZGF0ZUJvdW5kaW5nQm94KGJiLCBlbGVzW2ldLmJvdW5kaW5nQm94KCkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmI7XG4gIH07XG4gIHZhciBtYWtlTGF5ZXIgPSBmdW5jdGlvbiBtYWtlTGF5ZXIob3B0cykge1xuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIHZhciBhZnRlciA9IG9wdHMuYWZ0ZXI7XG4gICAgZ2V0QmIoKTtcbiAgICB2YXIgYXJlYSA9IGJiLncgKiBzY2FsZSAqIChiYi5oICogc2NhbGUpO1xuICAgIGlmIChhcmVhID4gbWF4TGF5ZXJBcmVhKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIGxheWVyID0gc2VsZi5tYWtlTGF5ZXIoYmIsIGx2bCk7XG4gICAgaWYgKGFmdGVyICE9IG51bGwpIHtcbiAgICAgIHZhciBpbmRleCA9IGxheWVycy5pbmRleE9mKGFmdGVyKSArIDE7XG4gICAgICBsYXllcnMuc3BsaWNlKGluZGV4LCAwLCBsYXllcik7XG4gICAgfSBlbHNlIGlmIChvcHRzLmluc2VydCA9PT0gdW5kZWZpbmVkIHx8IG9wdHMuaW5zZXJ0KSB7XG4gICAgICAvLyBubyBhZnRlciBzcGVjaWZpZWQgPT4gZmlyc3QgbGF5ZXIgbWFkZSBzbyBwdXQgYXQgc3RhcnRcbiAgICAgIGxheWVycy51bnNoaWZ0KGxheWVyKTtcbiAgICB9XG5cbiAgICAvLyBpZiggdG1wTGF5ZXJzICl7XG4gICAgLy9zZWxmLnF1ZXVlTGF5ZXIoIGxheWVyICk7XG4gICAgLy8gfVxuXG4gICAgcmV0dXJuIGxheWVyO1xuICB9O1xuICBpZiAoc2VsZi5za2lwcGluZyAmJiAhZmlyc3RHZXQpIHtcbiAgICAvLyBsb2coJ3NraXAgbGF5ZXJzJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBsb2coJ2RvIGxheWVycycpO1xuXG4gIHZhciBsYXllciA9IG51bGw7XG4gIHZhciBtYXhFbGVzUGVyTGF5ZXIgPSBlbGVzLmxlbmd0aCAvIGRlZk51bUxheWVycztcbiAgdmFyIGFsbG93TGF6eVF1ZXVlaW5nID0gIWZpcnN0R2V0O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICB2YXIgcnMgPSBlbGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgdmFyIGNhY2hlcyA9IHJzLmltZ0xheWVyQ2FjaGVzID0gcnMuaW1nTGF5ZXJDYWNoZXMgfHwge307XG5cbiAgICAvLyBsb2coJ2xvb2sgYXQgZWxlJywgZWxlLmlkKCkpO1xuXG4gICAgdmFyIGV4aXN0aW5nTGF5ZXIgPSBjYWNoZXNbbHZsXTtcbiAgICBpZiAoZXhpc3RpbmdMYXllcikge1xuICAgICAgLy8gcmV1c2UgbGF5ZXIgZm9yIGxhdGVyIGVsZXNcbiAgICAgIC8vIGxvZygncmV1c2UgbGF5ZXIgZm9yJywgZWxlLmlkKCkpO1xuICAgICAgbGF5ZXIgPSBleGlzdGluZ0xheWVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghbGF5ZXIgfHwgbGF5ZXIuZWxlcy5sZW5ndGggPj0gbWF4RWxlc1BlckxheWVyIHx8ICFib3VuZGluZ0JveEluQm91bmRpbmdCb3gobGF5ZXIuYmIsIGVsZS5ib3VuZGluZ0JveCgpKSkge1xuICAgICAgLy8gbG9nKCdtYWtlIG5ldyBsYXllciBmb3IgZWxlICVzJywgZWxlLmlkKCkpO1xuXG4gICAgICBsYXllciA9IG1ha2VMYXllcih7XG4gICAgICAgIGluc2VydDogdHJ1ZSxcbiAgICAgICAgYWZ0ZXI6IGxheWVyXG4gICAgICB9KTtcblxuICAgICAgLy8gaWYgbm93IGxheWVyIGNhbiBiZSBidWlsdCB0aGVuIHdlIGNhbid0IHVzZSBsYXllcnMgYXQgdGhpcyBsZXZlbFxuICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gbG9nKCduZXcgbGF5ZXIgd2l0aCBpZCAlcycsIGxheWVyLmlkKTtcbiAgICB9XG5cbiAgICBpZiAodG1wTGF5ZXJzIHx8IGFsbG93TGF6eVF1ZXVlaW5nKSB7XG4gICAgICAvLyBsb2coJ3F1ZXVlIGVsZSAlcyBpbiBsYXllciAlcycsIGVsZS5pZCgpLCBsYXllci5pZCk7XG4gICAgICBzZWxmLnF1ZXVlTGF5ZXIobGF5ZXIsIGVsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGxvZygnZHJhdyBlbGUgJXMgaW4gbGF5ZXIgJXMnLCBlbGUuaWQoKSwgbGF5ZXIuaWQpO1xuICAgICAgc2VsZi5kcmF3RWxlSW5MYXllcihsYXllciwgZWxlLCBsdmwsIHB4UmF0aW8pO1xuICAgIH1cbiAgICBsYXllci5lbGVzLnB1c2goZWxlKTtcbiAgICBjYWNoZXNbbHZsXSA9IGxheWVyO1xuICB9XG5cbiAgLy8gbG9nKCctLScpO1xuXG4gIGlmICh0bXBMYXllcnMpIHtcbiAgICAvLyB0aGVuIHdlIG9ubHkgcXVldWVkIHRoZSBjdXJyZW50IGxheWVyc2V0IGFuZCBjYW4ndCBkcmF3IGl0IHlldFxuICAgIHJldHVybiB0bXBMYXllcnM7XG4gIH1cbiAgaWYgKGFsbG93TGF6eVF1ZXVlaW5nKSB7XG4gICAgLy8gbG9nKCdsYXp5IHF1ZXVlIGxldmVsJywgbHZsKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gbGF5ZXJzO1xufTtcblxuLy8gYSBsYXllciBtYXkgd2FudCB0byB1c2UgYW4gZWxlIGNhY2hlIG9mIGEgaGlnaGVyIGxldmVsIHRvIGF2b2lkIGJsdXJyaW5lc3Ncbi8vIHNvIHRoZSBsYXllciBsZXZlbCBtaWdodCBub3QgZXF1YWwgdGhlIGVsZSBsZXZlbFxuTFRDcC5nZXRFbGVMZXZlbEZvckxheWVyTGV2ZWwgPSBmdW5jdGlvbiAobHZsLCBweFJhdGlvKSB7XG4gIHJldHVybiBsdmw7XG59O1xuTFRDcC5kcmF3RWxlSW5MYXllciA9IGZ1bmN0aW9uIChsYXllciwgZWxlLCBsdmwsIHB4UmF0aW8pIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgciA9IHRoaXMucmVuZGVyZXI7XG4gIHZhciBjb250ZXh0ID0gbGF5ZXIuY29udGV4dDtcbiAgdmFyIGJiID0gZWxlLmJvdW5kaW5nQm94KCk7XG4gIGlmIChiYi53ID09PSAwIHx8IGJiLmggPT09IDAgfHwgIWVsZS52aXNpYmxlKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbHZsID0gc2VsZi5nZXRFbGVMZXZlbEZvckxheWVyTGV2ZWwobHZsLCBweFJhdGlvKTtcbiAge1xuICAgIHIuc2V0SW1nU21vb3RoaW5nKGNvbnRleHQsIGZhbHNlKTtcbiAgfVxuICB7XG4gICAgci5kcmF3Q2FjaGVkRWxlbWVudChjb250ZXh0LCBlbGUsIG51bGwsIG51bGwsIGx2bCwgdXNlSGlnaFF1YWxpdHlFbGVUeHJSZXFzKTtcbiAgfVxuICB7XG4gICAgci5zZXRJbWdTbW9vdGhpbmcoY29udGV4dCwgdHJ1ZSk7XG4gIH1cbn07XG5MVENwLmxldmVsSXNDb21wbGV0ZSA9IGZ1bmN0aW9uIChsdmwsIGVsZXMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgbGF5ZXJzID0gc2VsZi5sYXllcnNCeUxldmVsW2x2bF07XG4gIGlmICghbGF5ZXJzIHx8IGxheWVycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIG51bUVsZXNJbkxheWVycyA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxheWVyID0gbGF5ZXJzW2ldO1xuXG4gICAgLy8gaWYgdGhlcmUgYXJlIGFueSBlbGVzIG5lZWRlZCB0byBiZSBkcmF3biB5ZXQsIHRoZSBsZXZlbCBpcyBub3QgY29tcGxldGVcbiAgICBpZiAobGF5ZXIucmVxcyA+IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgbGF5ZXIgaXMgaW52YWxpZCwgdGhlIGxldmVsIGlzIG5vdCBjb21wbGV0ZVxuICAgIGlmIChsYXllci5pbnZhbGlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIG51bUVsZXNJbkxheWVycyArPSBsYXllci5lbGVzLmxlbmd0aDtcbiAgfVxuXG4gIC8vIHdlIHNob3VsZCBoYXZlIGV4YWN0bHkgdGhlIG51bWJlciBvZiBlbGVzIHBhc3NlZCBpbiB0byBiZSBjb21wbGV0ZVxuICBpZiAobnVtRWxlc0luTGF5ZXJzICE9PSBlbGVzLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5MVENwLnZhbGlkYXRlTGF5ZXJzRWxlc09yZGVyaW5nID0gZnVuY3Rpb24gKGx2bCwgZWxlcykge1xuICB2YXIgbGF5ZXJzID0gdGhpcy5sYXllcnNCeUxldmVsW2x2bF07XG4gIGlmICghbGF5ZXJzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gaWYgaW4gYSBsYXllciB0aGUgZWxlcyBhcmUgbm90IGluIHRoZSBzYW1lIG9yZGVyLCB0aGVuIHRoZSBsYXllciBpcyBpbnZhbGlkXG4gIC8vIChpLmUuIHRoZXJlIGlzIGFuIGVsZSBpbiBiZXR3ZWVuIHRoZSBlbGVzIGluIHRoZSBsYXllcilcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBsYXllciA9IGxheWVyc1tpXTtcbiAgICB2YXIgb2Zmc2V0ID0gLTE7XG5cbiAgICAvLyBmaW5kIHRoZSBvZmZzZXRcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGVsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChsYXllci5lbGVzWzBdID09PSBlbGVzW2pdKSB7XG4gICAgICAgIG9mZnNldCA9IGo7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgLy8gdGhlbiB0aGUgbGF5ZXIgaGFzIG5vbmV4aXN0ZW50IGVsZW1lbnRzIGFuZCBpcyBpbnZhbGlkXG4gICAgICB0aGlzLmludmFsaWRhdGVMYXllcihsYXllcik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyB0aGUgZWxlcyBpbiB0aGUgbGF5ZXIgbXVzdCBiZSBpbiB0aGUgc2FtZSBjb250aW51b3VzIG9yZGVyLCBlbHNlIHRoZSBsYXllciBpcyBpbnZhbGlkXG5cbiAgICB2YXIgbyA9IG9mZnNldDtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxheWVyLmVsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChsYXllci5lbGVzW2pdICE9PSBlbGVzW28gKyBqXSkge1xuICAgICAgICAvLyBsb2coJ2ludmFsaWRhdGUgYmFzZWQgb24gb3JkZXJpbmcnLCBsYXllci5pZCk7XG5cbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlTGF5ZXIobGF5ZXIpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5MVENwLnVwZGF0ZUVsZW1lbnRzSW5MYXllcnMgPSBmdW5jdGlvbiAoZWxlcywgdXBkYXRlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGlzRWxlcyA9IGVsZW1lbnQoZWxlc1swXSk7XG5cbiAgLy8gY29sbGVjdCB1ZHBhdGVkIGVsZW1lbnRzIChjYXNjYWRlZCBmcm9tIHRoZSBsYXllcnMpIGFuZCB1cGRhdGUgZWFjaFxuICAvLyBsYXllciBpdHNlbGYgYWxvbmcgdGhlIHdheVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmVxID0gaXNFbGVzID8gbnVsbCA6IGVsZXNbaV07XG4gICAgdmFyIGVsZSA9IGlzRWxlcyA/IGVsZXNbaV0gOiBlbGVzW2ldLmVsZTtcbiAgICB2YXIgcnMgPSBlbGUuX3ByaXZhdGUucnNjcmF0Y2g7XG4gICAgdmFyIGNhY2hlcyA9IHJzLmltZ0xheWVyQ2FjaGVzID0gcnMuaW1nTGF5ZXJDYWNoZXMgfHwge307XG4gICAgZm9yICh2YXIgbCA9IG1pbkx2bDsgbCA8PSBtYXhMdmw7IGwrKykge1xuICAgICAgdmFyIGxheWVyID0gY2FjaGVzW2xdO1xuICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdXBkYXRlIGlzIGEgcmVxdWVzdCBmcm9tIHRoZSBlbGUgY2FjaGUsIHRoZW4gaXQgYWZmZWN0cyBvbmx5XG4gICAgICAvLyB0aGUgbWF0Y2hpbmcgbGV2ZWxcbiAgICAgIGlmIChyZXEgJiYgc2VsZi5nZXRFbGVMZXZlbEZvckxheWVyTGV2ZWwobGF5ZXIubGV2ZWwpICE9PSByZXEubGV2ZWwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB1cGRhdGUobGF5ZXIsIGVsZSwgcmVxKTtcbiAgICB9XG4gIH1cbn07XG5MVENwLmhhdmVMYXllcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGhhdmVMYXllcnMgPSBmYWxzZTtcbiAgZm9yICh2YXIgbCA9IG1pbkx2bDsgbCA8PSBtYXhMdmw7IGwrKykge1xuICAgIHZhciBsYXllcnMgPSBzZWxmLmxheWVyc0J5TGV2ZWxbbF07XG4gICAgaWYgKGxheWVycyAmJiBsYXllcnMubGVuZ3RoID4gMCkge1xuICAgICAgaGF2ZUxheWVycyA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhhdmVMYXllcnM7XG59O1xuTFRDcC5pbnZhbGlkYXRlRWxlbWVudHMgPSBmdW5jdGlvbiAoZWxlcykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmIChlbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBzZWxmLmxhc3RJbnZhbGlkYXRpb25UaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcblxuICAvLyBsb2coJ3VwZGF0ZSBpbnZhbGlkYXRlIGxheWVyIHRpbWUgZnJvbSBlbGVzJyk7XG5cbiAgaWYgKGVsZXMubGVuZ3RoID09PSAwIHx8ICFzZWxmLmhhdmVMYXllcnMoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBzZWxmLnVwZGF0ZUVsZW1lbnRzSW5MYXllcnMoZWxlcywgZnVuY3Rpb24gaW52YWxBc3NvY0xheWVycyhsYXllciwgZWxlLCByZXEpIHtcbiAgICBzZWxmLmludmFsaWRhdGVMYXllcihsYXllcik7XG4gIH0pO1xufTtcbkxUQ3AuaW52YWxpZGF0ZUxheWVyID0gZnVuY3Rpb24gKGxheWVyKSB7XG4gIC8vIGxvZygndXBkYXRlIGludmFsaWRhdGUgbGF5ZXIgdGltZScpO1xuXG4gIHRoaXMubGFzdEludmFsaWRhdGlvblRpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuICBpZiAobGF5ZXIuaW52YWxpZCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBzYXZlIGN5Y2xlc1xuXG4gIHZhciBsdmwgPSBsYXllci5sZXZlbDtcbiAgdmFyIGVsZXMgPSBsYXllci5lbGVzO1xuICB2YXIgbGF5ZXJzID0gdGhpcy5sYXllcnNCeUxldmVsW2x2bF07XG5cbiAgLy8gbG9nKCdpbnZhbGlkYXRlIGxheWVyJywgbGF5ZXIuaWQgKTtcblxuICByZW1vdmVGcm9tQXJyYXkobGF5ZXJzLCBsYXllcik7XG4gIC8vIGxheWVyLmVsZXMgPSBbXTtcblxuICBsYXllci5lbGVzUXVldWUgPSBbXTtcbiAgbGF5ZXIuaW52YWxpZCA9IHRydWU7XG4gIGlmIChsYXllci5yZXBsYWNlbWVudCkge1xuICAgIGxheWVyLnJlcGxhY2VtZW50LmludmFsaWQgPSB0cnVlO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjYWNoZXMgPSBlbGVzW2ldLl9wcml2YXRlLnJzY3JhdGNoLmltZ0xheWVyQ2FjaGVzO1xuICAgIGlmIChjYWNoZXMpIHtcbiAgICAgIGNhY2hlc1tsdmxdID0gbnVsbDtcbiAgICB9XG4gIH1cbn07XG5MVENwLnJlZmluZUVsZW1lbnRUZXh0dXJlcyA9IGZ1bmN0aW9uIChlbGVzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICAvLyBsb2coJ3JlZmluZScsIGVsZXMubGVuZ3RoKTtcblxuICBzZWxmLnVwZGF0ZUVsZW1lbnRzSW5MYXllcnMoZWxlcywgZnVuY3Rpb24gcmVmaW5lRWFjaEVsZShsYXllciwgZWxlLCByZXEpIHtcbiAgICB2YXIgckx5ciA9IGxheWVyLnJlcGxhY2VtZW50O1xuICAgIGlmICghckx5cikge1xuICAgICAgckx5ciA9IGxheWVyLnJlcGxhY2VtZW50ID0gc2VsZi5tYWtlTGF5ZXIobGF5ZXIuYmIsIGxheWVyLmxldmVsKTtcbiAgICAgIHJMeXIucmVwbGFjZXMgPSBsYXllcjtcbiAgICAgIHJMeXIuZWxlcyA9IGxheWVyLmVsZXM7XG5cbiAgICAgIC8vIGxvZygnbWFrZSByZXBsYWNlbWVudCBsYXllciAlcyBmb3IgJXMgd2l0aCBsZXZlbCAlcycsIHJMeXIuaWQsIGxheWVyLmlkLCByTHlyLmxldmVsKTtcbiAgICB9XG5cbiAgICBpZiAoIXJMeXIucmVxcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByTHlyLmVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2VsZi5xdWV1ZUxheWVyKHJMeXIsIHJMeXIuZWxlc1tpXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGxvZygncXVldWUgcmVwbGFjZW1lbnQgbGF5ZXIgcmVmaW5lbWVudCcsIHJMeXIuaWQpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5MVENwLmVucXVldWVFbGVtZW50UmVmaW5lbWVudCA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgdGhpcy5lbGVUeHJEZXFzLm1lcmdlKGVsZSk7XG4gIHRoaXMuc2NoZWR1bGVFbGVtZW50UmVmaW5lbWVudCgpO1xufTtcbkxUQ3AucXVldWVMYXllciA9IGZ1bmN0aW9uIChsYXllciwgZWxlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHEgPSBzZWxmLmxheWVyc1F1ZXVlO1xuICB2YXIgZWxlc1EgPSBsYXllci5lbGVzUXVldWU7XG4gIHZhciBoYXNJZCA9IGVsZXNRLmhhc0lkID0gZWxlc1EuaGFzSWQgfHwge307XG5cbiAgLy8gaWYgYSBsYXllciBpcyBnb2luZyB0byBiZSByZXBsYWNlZCwgcXVldWluZyBpcyBhIHdhc3RlIG9mIHRpbWVcbiAgaWYgKGxheWVyLnJlcGxhY2VtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChlbGUpIHtcbiAgICBpZiAoaGFzSWRbZWxlLmlkKCldKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZXNRLnB1c2goZWxlKTtcbiAgICBoYXNJZFtlbGUuaWQoKV0gPSB0cnVlO1xuICB9XG4gIGlmIChsYXllci5yZXFzKSB7XG4gICAgbGF5ZXIucmVxcysrO1xuICAgIHEudXBkYXRlSXRlbShsYXllcik7XG4gIH0gZWxzZSB7XG4gICAgbGF5ZXIucmVxcyA9IDE7XG4gICAgcS5wdXNoKGxheWVyKTtcbiAgfVxufTtcbkxUQ3AuZGVxdWV1ZSA9IGZ1bmN0aW9uIChweFJhdGlvKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHEgPSBzZWxmLmxheWVyc1F1ZXVlO1xuICB2YXIgZGVxZCA9IFtdO1xuICB2YXIgZWxlRGVxcyA9IDA7XG4gIHdoaWxlIChlbGVEZXFzIDwgbWF4RGVxU2l6ZSkge1xuICAgIGlmIChxLnNpemUoKSA9PT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBsYXllciA9IHEucGVlaygpO1xuXG4gICAgLy8gaWYgYSBsYXllciBoYXMgYmVlbiBvciB3aWxsIGJlIHJlcGxhY2VkLCB0aGVuIGRvbid0IHdhc3RlIHRpbWUgd2l0aCBpdFxuICAgIGlmIChsYXllci5yZXBsYWNlbWVudCkge1xuICAgICAgLy8gbG9nKCdsYXllciAlcyBpbiBxdWV1ZSBza2lwcGVkIGIvYyBpdCBhbHJlYWR5IGhhcyBhIHJlcGxhY2VtZW50JywgbGF5ZXIuaWQpO1xuICAgICAgcS5wb3AoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGlmIHRoaXMgaXMgYSByZXBsYWNlbWVudCBsYXllciB0aGF0IGhhcyBiZWVuIHN1cGVyY2VkZWQsIHRoZW4gZm9yZ2V0IGl0XG4gICAgaWYgKGxheWVyLnJlcGxhY2VzICYmIGxheWVyICE9PSBsYXllci5yZXBsYWNlcy5yZXBsYWNlbWVudCkge1xuICAgICAgLy8gbG9nKCdsYXllciBpcyBubyBsb25nZXIgdGhlIG1vc3QgdXB0b2RhdGUgcmVwbGFjZW1lbnQ7IGRlcXVldWVkJywgbGF5ZXIuaWQpXG4gICAgICBxLnBvcCgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChsYXllci5pbnZhbGlkKSB7XG4gICAgICAvLyBsb2coJ3JlcGxhY2VtZW50IGxheWVyICVzIGlzIGludmFsaWQ7IGRlcXVldWVkJywgbGF5ZXIuaWQpO1xuICAgICAgcS5wb3AoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgZWxlID0gbGF5ZXIuZWxlc1F1ZXVlLnNoaWZ0KCk7XG4gICAgaWYgKGVsZSkge1xuICAgICAgLy8gbG9nKCdkZXF1ZXVlIGxheWVyICVzJywgbGF5ZXIuaWQpO1xuXG4gICAgICBzZWxmLmRyYXdFbGVJbkxheWVyKGxheWVyLCBlbGUsIGxheWVyLmxldmVsLCBweFJhdGlvKTtcbiAgICAgIGVsZURlcXMrKztcbiAgICB9XG4gICAgaWYgKGRlcWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyB3ZSBuZWVkIG9ubHkgb25lIGVudHJ5IGluIGRlcWQgdG8gcXVldWUgcmVkcmF3aW5nIGV0Y1xuICAgICAgZGVxZC5wdXNoKHRydWUpO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSBsYXllciBoYXMgYWxsIGl0cyBlbGVzIGRvbmUsIHRoZW4gcmVtb3ZlIGZyb20gdGhlIHF1ZXVlXG4gICAgaWYgKGxheWVyLmVsZXNRdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHEucG9wKCk7XG4gICAgICBsYXllci5yZXFzID0gMDtcblxuICAgICAgLy8gbG9nKCdkZXF1ZXVlIG9mIGxheWVyICVzIGNvbXBsZXRlJywgbGF5ZXIuaWQpO1xuXG4gICAgICAvLyB3aGVuIGEgcmVwbGFjZW1lbnQgbGF5ZXIgaXMgZGVxdWV1ZWQsIGl0IHJlcGxhY2VzIHRoZSBvbGQgbGF5ZXIgaW4gdGhlIGxldmVsXG4gICAgICBpZiAobGF5ZXIucmVwbGFjZXMpIHtcbiAgICAgICAgc2VsZi5hcHBseUxheWVyUmVwbGFjZW1lbnQobGF5ZXIpO1xuICAgICAgfVxuICAgICAgc2VsZi5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXFkO1xufTtcbkxUQ3AuYXBwbHlMYXllclJlcGxhY2VtZW50ID0gZnVuY3Rpb24gKGxheWVyKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGxheWVyc0luTGV2ZWwgPSBzZWxmLmxheWVyc0J5TGV2ZWxbbGF5ZXIubGV2ZWxdO1xuICB2YXIgcmVwbGFjZWQgPSBsYXllci5yZXBsYWNlcztcbiAgdmFyIGluZGV4ID0gbGF5ZXJzSW5MZXZlbC5pbmRleE9mKHJlcGxhY2VkKTtcblxuICAvLyBpZiB0aGUgcmVwbGFjZWQgbGF5ZXIgaXMgbm90IGluIHRoZSBhY3RpdmUgbGlzdCBmb3IgdGhlIGxldmVsLCB0aGVuIHJlcGxhY2luZ1xuICAvLyByZWZzIHdvdWxkIGJlIGEgbWlzdGFrZSAoaS5lLiBvdmVyd3JpdGluZyB0aGUgdHJ1ZSBhY3RpdmUgbGF5ZXIpXG4gIGlmIChpbmRleCA8IDAgfHwgcmVwbGFjZWQuaW52YWxpZCkge1xuICAgIC8vIGxvZygncmVwbGFjZW1lbnQgbGF5ZXIgd291bGQgaGF2ZSBubyBlZmZlY3QnLCBsYXllci5pZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxheWVyc0luTGV2ZWxbaW5kZXhdID0gbGF5ZXI7IC8vIHJlcGxhY2UgbGV2ZWwgcmVmXG5cbiAgLy8gcmVwbGFjZSByZWZzIGluIGVsZXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllci5lbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9wID0gbGF5ZXIuZWxlc1tpXS5fcHJpdmF0ZTtcbiAgICB2YXIgY2FjaGUgPSBfcC5pbWdMYXllckNhY2hlcyA9IF9wLmltZ0xheWVyQ2FjaGVzIHx8IHt9O1xuICAgIGlmIChjYWNoZSkge1xuICAgICAgY2FjaGVbbGF5ZXIubGV2ZWxdID0gbGF5ZXI7XG4gICAgfVxuICB9XG5cbiAgLy8gbG9nKCdhcHBseSByZXBsYWNlbWVudCBsYXllciAlcyBvdmVyICVzJywgbGF5ZXIuaWQsIHJlcGxhY2VkLmlkKTtcblxuICBzZWxmLnJlcXVlc3RSZWRyYXcoKTtcbn07XG5MVENwLnJlcXVlc3RSZWRyYXcgPSBkZWJvdW5jZV8xKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHIgPSB0aGlzLnJlbmRlcmVyO1xuICByLnJlZHJhd0hpbnQoJ2VsZXMnLCB0cnVlKTtcbiAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gIHIucmVkcmF3KCk7XG59LCAxMDApO1xuTFRDcC5zZXR1cERlcXVldWVpbmcgPSBkZWZzLnNldHVwRGVxdWV1ZWluZyh7XG4gIGRlcVJlZHJhd1RocmVzaG9sZDogZGVxUmVkcmF3VGhyZXNob2xkLFxuICBkZXFDb3N0OiBkZXFDb3N0LFxuICBkZXFBdmdDb3N0OiBkZXFBdmdDb3N0LFxuICBkZXFOb0RyYXdDb3N0OiBkZXFOb0RyYXdDb3N0LFxuICBkZXFGYXN0Q29zdDogZGVxRmFzdENvc3QsXG4gIGRlcTogZnVuY3Rpb24gZGVxKHNlbGYsIHB4UmF0aW8pIHtcbiAgICByZXR1cm4gc2VsZi5kZXF1ZXVlKHB4UmF0aW8pO1xuICB9LFxuICBvbkRlcWQ6IG5vb3AkMSxcbiAgc2hvdWxkUmVkcmF3OiB0cnVlaWZ5LFxuICBwcmlvcml0eTogZnVuY3Rpb24gcHJpb3JpdHkoc2VsZikge1xuICAgIHJldHVybiBzZWxmLnJlbmRlcmVyLmJlZm9yZVJlbmRlclByaW9yaXRpZXMubHlyVHhyRGVxO1xuICB9XG59KTtcblxudmFyIENScCRhID0ge307XG52YXIgaW1wbDtcbmZ1bmN0aW9uIHBvbHlnb24oY29udGV4dCwgcG9pbnRzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHB0ID0gcG9pbnRzW2ldO1xuICAgIGNvbnRleHQubGluZVRvKHB0LngsIHB0LnkpO1xuICB9XG59XG5mdW5jdGlvbiB0cmlhbmdsZUJhY2tjdXJ2ZShjb250ZXh0LCBwb2ludHMsIGNvbnRyb2xQb2ludCkge1xuICB2YXIgZmlyc3RQdDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHQgPSBwb2ludHNbaV07XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIGZpcnN0UHQgPSBwdDtcbiAgICB9XG4gICAgY29udGV4dC5saW5lVG8ocHQueCwgcHQueSk7XG4gIH1cbiAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgZmlyc3RQdC54LCBmaXJzdFB0LnkpO1xufVxuZnVuY3Rpb24gdHJpYW5nbGVUZWUoY29udGV4dCwgdHJpYW5nbGVQb2ludHMsIHRlZVBvaW50cykge1xuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9XG4gIHZhciB0cmlQdHMgPSB0cmlhbmdsZVBvaW50cztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmlQdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHQgPSB0cmlQdHNbaV07XG4gICAgY29udGV4dC5saW5lVG8ocHQueCwgcHQueSk7XG4gIH1cbiAgdmFyIHRlZVB0cyA9IHRlZVBvaW50cztcbiAgdmFyIGZpcnN0VGVlUHQgPSB0ZWVQb2ludHNbMF07XG4gIGNvbnRleHQubW92ZVRvKGZpcnN0VGVlUHQueCwgZmlyc3RUZWVQdC55KTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCB0ZWVQdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHQgPSB0ZWVQdHNbaV07XG4gICAgY29udGV4dC5saW5lVG8ocHQueCwgcHQueSk7XG4gIH1cbiAgaWYgKGNvbnRleHQuY2xvc2VQYXRoKSB7XG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgfVxufVxuZnVuY3Rpb24gY2lyY2xlVHJpYW5nbGUoY29udGV4dCwgdHJpYW5nbGVQb2ludHMsIHJ4LCByeSwgcikge1xuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9XG4gIGNvbnRleHQuYXJjKHJ4LCByeSwgciwgMCwgTWF0aC5QSSAqIDIsIGZhbHNlKTtcbiAgdmFyIHRyaVB0cyA9IHRyaWFuZ2xlUG9pbnRzO1xuICB2YXIgZmlyc3RUclB0ID0gdHJpUHRzWzBdO1xuICBjb250ZXh0Lm1vdmVUbyhmaXJzdFRyUHQueCwgZmlyc3RUclB0LnkpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRyaVB0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwdCA9IHRyaVB0c1tpXTtcbiAgICBjb250ZXh0LmxpbmVUbyhwdC54LCBwdC55KTtcbiAgfVxuICBpZiAoY29udGV4dC5jbG9zZVBhdGgpIHtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICB9XG59XG5mdW5jdGlvbiBjaXJjbGUoY29udGV4dCwgcngsIHJ5LCByKSB7XG4gIGNvbnRleHQuYXJjKHJ4LCByeSwgciwgMCwgTWF0aC5QSSAqIDIsIGZhbHNlKTtcbn1cbkNScCRhLmFycm93U2hhcGVJbXBsID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIChpbXBsIHx8IChpbXBsID0ge1xuICAgICdwb2x5Z29uJzogcG9seWdvbixcbiAgICAndHJpYW5nbGUtYmFja2N1cnZlJzogdHJpYW5nbGVCYWNrY3VydmUsXG4gICAgJ3RyaWFuZ2xlLXRlZSc6IHRyaWFuZ2xlVGVlLFxuICAgICdjaXJjbGUtdHJpYW5nbGUnOiBjaXJjbGVUcmlhbmdsZSxcbiAgICAndHJpYW5nbGUtY3Jvc3MnOiB0cmlhbmdsZVRlZSxcbiAgICAnY2lyY2xlJzogY2lyY2xlXG4gIH0pKVtuYW1lXTtcbn07XG5cbnZhciBDUnAkOSA9IHt9O1xuQ1JwJDkuZHJhd0VsZW1lbnQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBzaGlmdFRvT3JpZ2luV2l0aEJiLCBzaG93TGFiZWwsIHNob3dPdmVybGF5LCBzaG93T3BhY2l0eSkge1xuICB2YXIgciA9IHRoaXM7XG4gIGlmIChlbGUuaXNOb2RlKCkpIHtcbiAgICByLmRyYXdOb2RlKGNvbnRleHQsIGVsZSwgc2hpZnRUb09yaWdpbldpdGhCYiwgc2hvd0xhYmVsLCBzaG93T3ZlcmxheSwgc2hvd09wYWNpdHkpO1xuICB9IGVsc2Uge1xuICAgIHIuZHJhd0VkZ2UoY29udGV4dCwgZWxlLCBzaGlmdFRvT3JpZ2luV2l0aEJiLCBzaG93TGFiZWwsIHNob3dPdmVybGF5LCBzaG93T3BhY2l0eSk7XG4gIH1cbn07XG5DUnAkOS5kcmF3RWxlbWVudE92ZXJsYXkgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlKSB7XG4gIHZhciByID0gdGhpcztcbiAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgIHIuZHJhd05vZGVPdmVybGF5KGNvbnRleHQsIGVsZSk7XG4gIH0gZWxzZSB7XG4gICAgci5kcmF3RWRnZU92ZXJsYXkoY29udGV4dCwgZWxlKTtcbiAgfVxufTtcbkNScCQ5LmRyYXdFbGVtZW50VW5kZXJsYXkgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlKSB7XG4gIHZhciByID0gdGhpcztcbiAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgIHIuZHJhd05vZGVVbmRlcmxheShjb250ZXh0LCBlbGUpO1xuICB9IGVsc2Uge1xuICAgIHIuZHJhd0VkZ2VVbmRlcmxheShjb250ZXh0LCBlbGUpO1xuICB9XG59O1xuQ1JwJDkuZHJhd0NhY2hlZEVsZW1lbnRQb3J0aW9uID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgZWxlVHhyQ2FjaGUsIHB4UmF0aW8sIGx2bCwgcmVhc29uLCBnZXRSb3RhdGlvbiwgZ2V0T3BhY2l0eSkge1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBiYiA9IGVsZVR4ckNhY2hlLmdldEJvdW5kaW5nQm94KGVsZSk7XG4gIGlmIChiYi53ID09PSAwIHx8IGJiLmggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH0gLy8gaWdub3JlIHplcm8gc2l6ZSBjYXNlXG5cbiAgdmFyIGVsZUNhY2hlID0gZWxlVHhyQ2FjaGUuZ2V0RWxlbWVudChlbGUsIGJiLCBweFJhdGlvLCBsdmwsIHJlYXNvbik7XG4gIGlmIChlbGVDYWNoZSAhPSBudWxsKSB7XG4gICAgdmFyIG9wYWNpdHkgPSBnZXRPcGFjaXR5KHIsIGVsZSk7XG4gICAgaWYgKG9wYWNpdHkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRoZXRhID0gZ2V0Um90YXRpb24ociwgZWxlKTtcbiAgICB2YXIgeDEgPSBiYi54MSxcbiAgICAgIHkxID0gYmIueTEsXG4gICAgICB3ID0gYmIudyxcbiAgICAgIGggPSBiYi5oO1xuICAgIHZhciB4LCB5LCBzeCwgc3ksIHNtb290aDtcbiAgICBpZiAodGhldGEgIT09IDApIHtcbiAgICAgIHZhciByb3RQdCA9IGVsZVR4ckNhY2hlLmdldFJvdGF0aW9uUG9pbnQoZWxlKTtcbiAgICAgIHN4ID0gcm90UHQueDtcbiAgICAgIHN5ID0gcm90UHQueTtcbiAgICAgIGNvbnRleHQudHJhbnNsYXRlKHN4LCBzeSk7XG4gICAgICBjb250ZXh0LnJvdGF0ZSh0aGV0YSk7XG4gICAgICBzbW9vdGggPSByLmdldEltZ1Ntb290aGluZyhjb250ZXh0KTtcbiAgICAgIGlmICghc21vb3RoKSB7XG4gICAgICAgIHIuc2V0SW1nU21vb3RoaW5nKGNvbnRleHQsIHRydWUpO1xuICAgICAgfVxuICAgICAgdmFyIG9mZiA9IGVsZVR4ckNhY2hlLmdldFJvdGF0aW9uT2Zmc2V0KGVsZSk7XG4gICAgICB4ID0gb2ZmLng7XG4gICAgICB5ID0gb2ZmLnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHggPSB4MTtcbiAgICAgIHkgPSB5MTtcbiAgICB9XG4gICAgdmFyIG9sZEdsb2JhbEFscGhhO1xuICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICBvbGRHbG9iYWxBbHBoYSA9IGNvbnRleHQuZ2xvYmFsQWxwaGE7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb2xkR2xvYmFsQWxwaGEgKiBvcGFjaXR5O1xuICAgIH1cbiAgICBjb250ZXh0LmRyYXdJbWFnZShlbGVDYWNoZS50ZXh0dXJlLmNhbnZhcywgZWxlQ2FjaGUueCwgMCwgZWxlQ2FjaGUud2lkdGgsIGVsZUNhY2hlLmhlaWdodCwgeCwgeSwgdywgaCk7XG4gICAgaWYgKG9wYWNpdHkgIT09IDEpIHtcbiAgICAgIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBvbGRHbG9iYWxBbHBoYTtcbiAgICB9XG4gICAgaWYgKHRoZXRhICE9PSAwKSB7XG4gICAgICBjb250ZXh0LnJvdGF0ZSgtdGhldGEpO1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoLXN4LCAtc3kpO1xuICAgICAgaWYgKCFzbW9vdGgpIHtcbiAgICAgICAgci5zZXRJbWdTbW9vdGhpbmcoY29udGV4dCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBlbGVUeHJDYWNoZS5kcmF3RWxlbWVudChjb250ZXh0LCBlbGUpOyAvLyBkaXJlY3QgZHJhdyBmYWxsYmFja1xuICB9XG59O1xuXG52YXIgZ2V0WmVyb1JvdGF0aW9uID0gZnVuY3Rpb24gZ2V0WmVyb1JvdGF0aW9uKCkge1xuICByZXR1cm4gMDtcbn07XG52YXIgZ2V0TGFiZWxSb3RhdGlvbiA9IGZ1bmN0aW9uIGdldExhYmVsUm90YXRpb24ociwgZWxlKSB7XG4gIHJldHVybiByLmdldFRleHRBbmdsZShlbGUsIG51bGwpO1xufTtcbnZhciBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uID0gZnVuY3Rpb24gZ2V0U291cmNlTGFiZWxSb3RhdGlvbihyLCBlbGUpIHtcbiAgcmV0dXJuIHIuZ2V0VGV4dEFuZ2xlKGVsZSwgJ3NvdXJjZScpO1xufTtcbnZhciBnZXRUYXJnZXRMYWJlbFJvdGF0aW9uID0gZnVuY3Rpb24gZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvbihyLCBlbGUpIHtcbiAgcmV0dXJuIHIuZ2V0VGV4dEFuZ2xlKGVsZSwgJ3RhcmdldCcpO1xufTtcbnZhciBnZXRPcGFjaXR5ID0gZnVuY3Rpb24gZ2V0T3BhY2l0eShyLCBlbGUpIHtcbiAgcmV0dXJuIGVsZS5lZmZlY3RpdmVPcGFjaXR5KCk7XG59O1xudmFyIGdldFRleHRPcGFjaXR5ID0gZnVuY3Rpb24gZ2V0VGV4dE9wYWNpdHkoZSwgZWxlKSB7XG4gIHJldHVybiBlbGUucHN0eWxlKCd0ZXh0LW9wYWNpdHknKS5wZlZhbHVlICogZWxlLmVmZmVjdGl2ZU9wYWNpdHkoKTtcbn07XG5DUnAkOS5kcmF3Q2FjaGVkRWxlbWVudCA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIHB4UmF0aW8sIGV4dGVudCwgbHZsLCByZXF1ZXN0SGlnaFF1YWxpdHkpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgX3IkZGF0YSA9IHIuZGF0YSxcbiAgICBlbGVUeHJDYWNoZSA9IF9yJGRhdGEuZWxlVHhyQ2FjaGUsXG4gICAgbGJsVHhyQ2FjaGUgPSBfciRkYXRhLmxibFR4ckNhY2hlLFxuICAgIHNsYlR4ckNhY2hlID0gX3IkZGF0YS5zbGJUeHJDYWNoZSxcbiAgICB0bGJUeHJDYWNoZSA9IF9yJGRhdGEudGxiVHhyQ2FjaGU7XG4gIHZhciBiYiA9IGVsZS5ib3VuZGluZ0JveCgpO1xuICB2YXIgcmVhc29uID0gcmVxdWVzdEhpZ2hRdWFsaXR5ID09PSB0cnVlID8gZWxlVHhyQ2FjaGUucmVhc29ucy5oaWdoUXVhbGl0eSA6IG51bGw7XG4gIGlmIChiYi53ID09PSAwIHx8IGJiLmggPT09IDAgfHwgIWVsZS52aXNpYmxlKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFleHRlbnQgfHwgYm91bmRpbmdCb3hlc0ludGVyc2VjdChiYiwgZXh0ZW50KSkge1xuICAgIHZhciBpc0VkZ2UgPSBlbGUuaXNFZGdlKCk7XG4gICAgdmFyIGJhZExpbmUgPSBlbGUuZWxlbWVudCgpLl9wcml2YXRlLnJzY3JhdGNoLmJhZExpbmU7XG4gICAgci5kcmF3RWxlbWVudFVuZGVybGF5KGNvbnRleHQsIGVsZSk7XG4gICAgci5kcmF3Q2FjaGVkRWxlbWVudFBvcnRpb24oY29udGV4dCwgZWxlLCBlbGVUeHJDYWNoZSwgcHhSYXRpbywgbHZsLCByZWFzb24sIGdldFplcm9Sb3RhdGlvbiwgZ2V0T3BhY2l0eSk7XG4gICAgaWYgKCFpc0VkZ2UgfHwgIWJhZExpbmUpIHtcbiAgICAgIHIuZHJhd0NhY2hlZEVsZW1lbnRQb3J0aW9uKGNvbnRleHQsIGVsZSwgbGJsVHhyQ2FjaGUsIHB4UmF0aW8sIGx2bCwgcmVhc29uLCBnZXRMYWJlbFJvdGF0aW9uLCBnZXRUZXh0T3BhY2l0eSk7XG4gICAgfVxuICAgIGlmIChpc0VkZ2UgJiYgIWJhZExpbmUpIHtcbiAgICAgIHIuZHJhd0NhY2hlZEVsZW1lbnRQb3J0aW9uKGNvbnRleHQsIGVsZSwgc2xiVHhyQ2FjaGUsIHB4UmF0aW8sIGx2bCwgcmVhc29uLCBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uLCBnZXRUZXh0T3BhY2l0eSk7XG4gICAgICByLmRyYXdDYWNoZWRFbGVtZW50UG9ydGlvbihjb250ZXh0LCBlbGUsIHRsYlR4ckNhY2hlLCBweFJhdGlvLCBsdmwsIHJlYXNvbiwgZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvbiwgZ2V0VGV4dE9wYWNpdHkpO1xuICAgIH1cbiAgICByLmRyYXdFbGVtZW50T3ZlcmxheShjb250ZXh0LCBlbGUpO1xuICB9XG59O1xuQ1JwJDkuZHJhd0VsZW1lbnRzID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZXMpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlID0gZWxlc1tpXTtcbiAgICByLmRyYXdFbGVtZW50KGNvbnRleHQsIGVsZSk7XG4gIH1cbn07XG5DUnAkOS5kcmF3Q2FjaGVkRWxlbWVudHMgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlcywgcHhSYXRpbywgZXh0ZW50KSB7XG4gIHZhciByID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgci5kcmF3Q2FjaGVkRWxlbWVudChjb250ZXh0LCBlbGUsIHB4UmF0aW8sIGV4dGVudCk7XG4gIH1cbn07XG5DUnAkOS5kcmF3Q2FjaGVkTm9kZXMgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlcywgcHhSYXRpbywgZXh0ZW50KSB7XG4gIHZhciByID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZSA9IGVsZXNbaV07XG4gICAgaWYgKCFlbGUuaXNOb2RlKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByLmRyYXdDYWNoZWRFbGVtZW50KGNvbnRleHQsIGVsZSwgcHhSYXRpbywgZXh0ZW50KTtcbiAgfVxufTtcbkNScCQ5LmRyYXdMYXllcmVkRWxlbWVudHMgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlcywgcHhSYXRpbywgZXh0ZW50KSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIGxheWVycyA9IHIuZGF0YS5seXJUeHJDYWNoZS5nZXRMYXllcnMoZWxlcywgcHhSYXRpbyk7XG4gIGlmIChsYXllcnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxheWVyID0gbGF5ZXJzW2ldO1xuICAgICAgdmFyIGJiID0gbGF5ZXIuYmI7XG4gICAgICBpZiAoYmIudyA9PT0gMCB8fCBiYi5oID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29udGV4dC5kcmF3SW1hZ2UobGF5ZXIuY2FudmFzLCBiYi54MSwgYmIueTEsIGJiLncsIGJiLmgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBmYWxsIGJhY2sgb24gcGxhaW4gY2FjaGluZyBpZiBubyBsYXllcnNcbiAgICByLmRyYXdDYWNoZWRFbGVtZW50cyhjb250ZXh0LCBlbGVzLCBweFJhdGlvLCBleHRlbnQpO1xuICB9XG59O1xuXG52YXIgQ1JwJDggPSB7fTtcbkNScCQ4LmRyYXdFZGdlID0gZnVuY3Rpb24gKGNvbnRleHQsIGVkZ2UsIHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgdmFyIGRyYXdMYWJlbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogdHJ1ZTtcbiAgdmFyIHNob3VsZERyYXdPdmVybGF5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0cnVlO1xuICB2YXIgc2hvdWxkRHJhd09wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IHRydWU7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgaWYgKHNob3VsZERyYXdPcGFjaXR5ICYmICFlZGdlLnZpc2libGUoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGlmIGJlemllciBjdHJsIHB0cyBjYW4gbm90IGJlIGNhbGN1bGF0ZWQsIHRoZW4gZGllXG4gIGlmIChycy5iYWRMaW5lIHx8IHJzLmFsbHB0cyA9PSBudWxsIHx8IGlzTmFOKHJzLmFsbHB0c1swXSkpIHtcbiAgICAvLyBpc05hTiBpbiBjYXNlIGVkZ2UgaXMgaW1wb3NzaWJsZSBhbmQgYnJvd3NlciBidWdzIChlLmcuIHNhZmFyaSlcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGJiO1xuICBpZiAoc2hpZnRUb09yaWdpbldpdGhCYikge1xuICAgIGJiID0gc2hpZnRUb09yaWdpbldpdGhCYjtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgtYmIueDEsIC1iYi55MSk7XG4gIH1cbiAgdmFyIG9wYWNpdHkgPSBzaG91bGREcmF3T3BhY2l0eSA/IGVkZ2UucHN0eWxlKCdvcGFjaXR5JykudmFsdWUgOiAxO1xuICB2YXIgbGluZU9wYWNpdHkgPSBzaG91bGREcmF3T3BhY2l0eSA/IGVkZ2UucHN0eWxlKCdsaW5lLW9wYWNpdHknKS52YWx1ZSA6IDE7XG4gIHZhciBjdXJ2ZVN0eWxlID0gZWRnZS5wc3R5bGUoJ2N1cnZlLXN0eWxlJykudmFsdWU7XG4gIHZhciBsaW5lU3R5bGUgPSBlZGdlLnBzdHlsZSgnbGluZS1zdHlsZScpLnZhbHVlO1xuICB2YXIgZWRnZVdpZHRoID0gZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgdmFyIGxpbmVDYXAgPSBlZGdlLnBzdHlsZSgnbGluZS1jYXAnKS52YWx1ZTtcbiAgdmFyIGVmZmVjdGl2ZUxpbmVPcGFjaXR5ID0gb3BhY2l0eSAqIGxpbmVPcGFjaXR5O1xuICAvLyBzZXBhcmF0ZSBhcnJvdyBvcGFjaXR5IHdvdWxkIHJlcXVpcmUgYXJyb3ctb3BhY2l0eSBwcm9wZXJ0eVxuICB2YXIgZWZmZWN0aXZlQXJyb3dPcGFjaXR5ID0gb3BhY2l0eSAqIGxpbmVPcGFjaXR5O1xuICB2YXIgZHJhd0xpbmUgPSBmdW5jdGlvbiBkcmF3TGluZSgpIHtcbiAgICB2YXIgc3Ryb2tlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZWZmZWN0aXZlTGluZU9wYWNpdHk7XG4gICAgaWYgKGN1cnZlU3R5bGUgPT09ICdzdHJhaWdodC10cmlhbmdsZScpIHtcbiAgICAgIHIuZWxlU3Ryb2tlU3R5bGUoY29udGV4dCwgZWRnZSwgc3Ryb2tlT3BhY2l0eSk7XG4gICAgICByLmRyYXdFZGdlVHJpYW5nbGVQYXRoKGVkZ2UsIGNvbnRleHQsIHJzLmFsbHB0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gZWRnZVdpZHRoO1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gbGluZUNhcDtcbiAgICAgIHIuZWxlU3Ryb2tlU3R5bGUoY29udGV4dCwgZWRnZSwgc3Ryb2tlT3BhY2l0eSk7XG4gICAgICByLmRyYXdFZGdlUGF0aChlZGdlLCBjb250ZXh0LCBycy5hbGxwdHMsIGxpbmVTdHlsZSk7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSAnYnV0dCc7IC8vIHJlc2V0IGZvciBvdGhlciBkcmF3aW5nIGZ1bmN0aW9uc1xuICAgIH1cbiAgfTtcblxuICB2YXIgZHJhd092ZXJsYXkgPSBmdW5jdGlvbiBkcmF3T3ZlcmxheSgpIHtcbiAgICBpZiAoIXNob3VsZERyYXdPdmVybGF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHIuZHJhd0VkZ2VPdmVybGF5KGNvbnRleHQsIGVkZ2UpO1xuICB9O1xuICB2YXIgZHJhd1VuZGVybGF5ID0gZnVuY3Rpb24gZHJhd1VuZGVybGF5KCkge1xuICAgIGlmICghc2hvdWxkRHJhd092ZXJsYXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgci5kcmF3RWRnZVVuZGVybGF5KGNvbnRleHQsIGVkZ2UpO1xuICB9O1xuICB2YXIgZHJhd0Fycm93cyA9IGZ1bmN0aW9uIGRyYXdBcnJvd3MoKSB7XG4gICAgdmFyIGFycm93T3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZWZmZWN0aXZlQXJyb3dPcGFjaXR5O1xuICAgIHIuZHJhd0Fycm93aGVhZHMoY29udGV4dCwgZWRnZSwgYXJyb3dPcGFjaXR5KTtcbiAgfTtcbiAgdmFyIGRyYXdUZXh0ID0gZnVuY3Rpb24gZHJhd1RleHQoKSB7XG4gICAgci5kcmF3RWxlbWVudFRleHQoY29udGV4dCwgZWRnZSwgbnVsbCwgZHJhd0xhYmVsKTtcbiAgfTtcbiAgY29udGV4dC5saW5lSm9pbiA9ICdyb3VuZCc7XG4gIHZhciBnaG9zdCA9IGVkZ2UucHN0eWxlKCdnaG9zdCcpLnZhbHVlID09PSAneWVzJztcbiAgaWYgKGdob3N0KSB7XG4gICAgdmFyIGd4ID0gZWRnZS5wc3R5bGUoJ2dob3N0LW9mZnNldC14JykucGZWYWx1ZTtcbiAgICB2YXIgZ3kgPSBlZGdlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXknKS5wZlZhbHVlO1xuICAgIHZhciBnaG9zdE9wYWNpdHkgPSBlZGdlLnBzdHlsZSgnZ2hvc3Qtb3BhY2l0eScpLnZhbHVlO1xuICAgIHZhciBlZmZlY3RpdmVHaG9zdE9wYWNpdHkgPSBlZmZlY3RpdmVMaW5lT3BhY2l0eSAqIGdob3N0T3BhY2l0eTtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZShneCwgZ3kpO1xuICAgIGRyYXdMaW5lKGVmZmVjdGl2ZUdob3N0T3BhY2l0eSk7XG4gICAgZHJhd0Fycm93cyhlZmZlY3RpdmVHaG9zdE9wYWNpdHkpO1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC1neCwgLWd5KTtcbiAgfVxuICBkcmF3VW5kZXJsYXkoKTtcbiAgZHJhd0xpbmUoKTtcbiAgZHJhd0Fycm93cygpO1xuICBkcmF3T3ZlcmxheSgpO1xuICBkcmF3VGV4dCgpO1xuICBpZiAoc2hpZnRUb09yaWdpbldpdGhCYikge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKGJiLngxLCBiYi55MSk7XG4gIH1cbn07XG52YXIgZHJhd0VkZ2VPdmVybGF5VW5kZXJsYXkgPSBmdW5jdGlvbiBkcmF3RWRnZU92ZXJsYXlVbmRlcmxheShvdmVybGF5T3JVbmRlcmxheSkge1xuICBpZiAoIVsnb3ZlcmxheScsICd1bmRlcmxheSddLmluY2x1ZGVzKG92ZXJsYXlPclVuZGVybGF5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdGF0ZScpO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoY29udGV4dCwgZWRnZSkge1xuICAgIGlmICghZWRnZS52aXNpYmxlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG9wYWNpdHkgPSBlZGdlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItb3BhY2l0eVwiKSkudmFsdWU7XG4gICAgaWYgKG9wYWNpdHkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHIgPSB0aGlzO1xuICAgIHZhciB1c2VQYXRocyA9IHIudXNlUGF0aHMoKTtcbiAgICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgIHZhciBwYWRkaW5nID0gZWRnZS5wc3R5bGUoXCJcIi5jb25jYXQob3ZlcmxheU9yVW5kZXJsYXksIFwiLXBhZGRpbmdcIikpLnBmVmFsdWU7XG4gICAgdmFyIHdpZHRoID0gMiAqIHBhZGRpbmc7XG4gICAgdmFyIGNvbG9yID0gZWRnZS5wc3R5bGUoXCJcIi5jb25jYXQob3ZlcmxheU9yVW5kZXJsYXksIFwiLWNvbG9yXCIpKS52YWx1ZTtcbiAgICBjb250ZXh0LmxpbmVXaWR0aCA9IHdpZHRoO1xuICAgIGlmIChycy5lZGdlVHlwZSA9PT0gJ3NlbGYnICYmICF1c2VQYXRocykge1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gJ2J1dHQnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSAncm91bmQnO1xuICAgIH1cbiAgICByLmNvbG9yU3Ryb2tlU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gICAgci5kcmF3RWRnZVBhdGgoZWRnZSwgY29udGV4dCwgcnMuYWxscHRzLCAnc29saWQnKTtcbiAgfTtcbn07XG5DUnAkOC5kcmF3RWRnZU92ZXJsYXkgPSBkcmF3RWRnZU92ZXJsYXlVbmRlcmxheSgnb3ZlcmxheScpO1xuQ1JwJDguZHJhd0VkZ2VVbmRlcmxheSA9IGRyYXdFZGdlT3ZlcmxheVVuZGVybGF5KCd1bmRlcmxheScpO1xuQ1JwJDguZHJhd0VkZ2VQYXRoID0gZnVuY3Rpb24gKGVkZ2UsIGNvbnRleHQsIHB0cywgdHlwZSkge1xuICB2YXIgcnMgPSBlZGdlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgY2FudmFzQ3h0ID0gY29udGV4dDtcbiAgdmFyIHBhdGg7XG4gIHZhciBwYXRoQ2FjaGVIaXQgPSBmYWxzZTtcbiAgdmFyIHVzZVBhdGhzID0gdGhpcy51c2VQYXRocygpO1xuICB2YXIgbGluZURhc2hQYXR0ZXJuID0gZWRnZS5wc3R5bGUoJ2xpbmUtZGFzaC1wYXR0ZXJuJykucGZWYWx1ZTtcbiAgdmFyIGxpbmVEYXNoT2Zmc2V0ID0gZWRnZS5wc3R5bGUoJ2xpbmUtZGFzaC1vZmZzZXQnKS5wZlZhbHVlO1xuICBpZiAodXNlUGF0aHMpIHtcbiAgICB2YXIgcGF0aENhY2hlS2V5ID0gcHRzLmpvaW4oJyQnKTtcbiAgICB2YXIga2V5TWF0Y2hlcyA9IHJzLnBhdGhDYWNoZUtleSAmJiBycy5wYXRoQ2FjaGVLZXkgPT09IHBhdGhDYWNoZUtleTtcbiAgICBpZiAoa2V5TWF0Y2hlcykge1xuICAgICAgcGF0aCA9IGNvbnRleHQgPSBycy5wYXRoQ2FjaGU7XG4gICAgICBwYXRoQ2FjaGVIaXQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoID0gY29udGV4dCA9IG5ldyBQYXRoMkQoKTtcbiAgICAgIHJzLnBhdGhDYWNoZUtleSA9IHBhdGhDYWNoZUtleTtcbiAgICAgIHJzLnBhdGhDYWNoZSA9IHBhdGg7XG4gICAgfVxuICB9XG4gIGlmIChjYW52YXNDeHQuc2V0TGluZURhc2gpIHtcbiAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2RvdHRlZCc6XG4gICAgICAgIGNhbnZhc0N4dC5zZXRMaW5lRGFzaChbMSwgMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Rhc2hlZCc6XG4gICAgICAgIGNhbnZhc0N4dC5zZXRMaW5lRGFzaChsaW5lRGFzaFBhdHRlcm4pO1xuICAgICAgICBjYW52YXNDeHQubGluZURhc2hPZmZzZXQgPSBsaW5lRGFzaE9mZnNldDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzb2xpZCc6XG4gICAgICAgIGNhbnZhc0N4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoIXBhdGhDYWNoZUhpdCAmJiAhcnMuYmFkTGluZSkge1xuICAgIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICB9XG4gICAgY29udGV4dC5tb3ZlVG8ocHRzWzBdLCBwdHNbMV0pO1xuICAgIHN3aXRjaCAocnMuZWRnZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2Jlemllcic6XG4gICAgICBjYXNlICdzZWxmJzpcbiAgICAgIGNhc2UgJ2NvbXBvdW5kJzpcbiAgICAgIGNhc2UgJ211bHRpYmV6aWVyJzpcbiAgICAgICAgZm9yICh2YXIgaSA9IDI7IGkgKyAzIDwgcHRzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgICAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKHB0c1tpXSwgcHRzW2kgKyAxXSwgcHRzW2kgKyAyXSwgcHRzW2kgKyAzXSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdHJhaWdodCc6XG4gICAgICBjYXNlICdoYXlzdGFjayc6XG4gICAgICAgIGZvciAodmFyIF9pID0gMjsgX2kgKyAxIDwgcHRzLmxlbmd0aDsgX2kgKz0gMikge1xuICAgICAgICAgIGNvbnRleHQubGluZVRvKHB0c1tfaV0sIHB0c1tfaSArIDFdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlZ21lbnRzJzpcbiAgICAgICAgaWYgKHJzLmlzUm91bmQpIHtcbiAgICAgICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIocnMucm91bmRDb3JuZXJzKSxcbiAgICAgICAgICAgIF9zdGVwO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICAgICAgICB2YXIgY29ybmVyID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgICAgIGRyYXdQcmVwYXJlZFJvdW5kQ29ybmVyKGNvbnRleHQsIGNvcm5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBfaXRlcmF0b3IuZigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250ZXh0LmxpbmVUbyhwdHNbcHRzLmxlbmd0aCAtIDJdLCBwdHNbcHRzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKHZhciBfaTIgPSAyOyBfaTIgKyAxIDwgcHRzLmxlbmd0aDsgX2kyICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnRleHQubGluZVRvKHB0c1tfaTJdLCBwdHNbX2kyICsgMV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgY29udGV4dCA9IGNhbnZhc0N4dDtcbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgY29udGV4dC5zdHJva2UocGF0aCk7XG4gIH0gZWxzZSB7XG4gICAgY29udGV4dC5zdHJva2UoKTtcbiAgfVxuXG4gIC8vIHJlc2V0IGFueSBsaW5lIGRhc2hlc1xuICBpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuICAgIC8vIGZvciB2ZXJ5IG91dG9mZGF0ZSBicm93c2Vyc1xuICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICB9XG59O1xuQ1JwJDguZHJhd0VkZ2VUcmlhbmdsZVBhdGggPSBmdW5jdGlvbiAoZWRnZSwgY29udGV4dCwgcHRzKSB7XG4gIC8vIHVzZSBsaW5lIHN0cm9rZSBzdHlsZSBmb3IgdHJpYW5nbGUgZmlsbCBzdHlsZVxuICBjb250ZXh0LmZpbGxTdHlsZSA9IGNvbnRleHQuc3Ryb2tlU3R5bGU7XG4gIHZhciBlZGdlV2lkdGggPSBlZGdlLnBzdHlsZSgnd2lkdGgnKS5wZlZhbHVlO1xuICBmb3IgKHZhciBpID0gMDsgaSArIDEgPCBwdHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgdmVjdG9yID0gW3B0c1tpICsgMl0gLSBwdHNbaV0sIHB0c1tpICsgM10gLSBwdHNbaSArIDFdXTtcbiAgICB2YXIgbGVuZ3RoID0gTWF0aC5zcXJ0KHZlY3RvclswXSAqIHZlY3RvclswXSArIHZlY3RvclsxXSAqIHZlY3RvclsxXSk7XG4gICAgdmFyIG5vcm1hbCA9IFt2ZWN0b3JbMV0gLyBsZW5ndGgsIC12ZWN0b3JbMF0gLyBsZW5ndGhdO1xuICAgIHZhciB0cmlhbmdsZUhlYWQgPSBbbm9ybWFsWzBdICogZWRnZVdpZHRoIC8gMiwgbm9ybWFsWzFdICogZWRnZVdpZHRoIC8gMl07XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0Lm1vdmVUbyhwdHNbaV0gLSB0cmlhbmdsZUhlYWRbMF0sIHB0c1tpICsgMV0gLSB0cmlhbmdsZUhlYWRbMV0pO1xuICAgIGNvbnRleHQubGluZVRvKHB0c1tpXSArIHRyaWFuZ2xlSGVhZFswXSwgcHRzW2kgKyAxXSArIHRyaWFuZ2xlSGVhZFsxXSk7XG4gICAgY29udGV4dC5saW5lVG8ocHRzW2kgKyAyXSwgcHRzW2kgKyAzXSk7XG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgfVxufTtcbkNScCQ4LmRyYXdBcnJvd2hlYWRzID0gZnVuY3Rpb24gKGNvbnRleHQsIGVkZ2UsIG9wYWNpdHkpIHtcbiAgdmFyIHJzID0gZWRnZS5fcHJpdmF0ZS5yc2NyYXRjaDtcbiAgdmFyIGlzSGF5c3RhY2sgPSBycy5lZGdlVHlwZSA9PT0gJ2hheXN0YWNrJztcbiAgaWYgKCFpc0hheXN0YWNrKSB7XG4gICAgdGhpcy5kcmF3QXJyb3doZWFkKGNvbnRleHQsIGVkZ2UsICdzb3VyY2UnLCBycy5hcnJvd1N0YXJ0WCwgcnMuYXJyb3dTdGFydFksIHJzLnNyY0Fycm93QW5nbGUsIG9wYWNpdHkpO1xuICB9XG4gIHRoaXMuZHJhd0Fycm93aGVhZChjb250ZXh0LCBlZGdlLCAnbWlkLXRhcmdldCcsIHJzLm1pZFgsIHJzLm1pZFksIHJzLm1pZHRndEFycm93QW5nbGUsIG9wYWNpdHkpO1xuICB0aGlzLmRyYXdBcnJvd2hlYWQoY29udGV4dCwgZWRnZSwgJ21pZC1zb3VyY2UnLCBycy5taWRYLCBycy5taWRZLCBycy5taWRzcmNBcnJvd0FuZ2xlLCBvcGFjaXR5KTtcbiAgaWYgKCFpc0hheXN0YWNrKSB7XG4gICAgdGhpcy5kcmF3QXJyb3doZWFkKGNvbnRleHQsIGVkZ2UsICd0YXJnZXQnLCBycy5hcnJvd0VuZFgsIHJzLmFycm93RW5kWSwgcnMudGd0QXJyb3dBbmdsZSwgb3BhY2l0eSk7XG4gIH1cbn07XG5DUnAkOC5kcmF3QXJyb3doZWFkID0gZnVuY3Rpb24gKGNvbnRleHQsIGVkZ2UsIHByZWZpeCwgeCwgeSwgYW5nbGUsIG9wYWNpdHkpIHtcbiAgaWYgKGlzTmFOKHgpIHx8IHggPT0gbnVsbCB8fCBpc05hTih5KSB8fCB5ID09IG51bGwgfHwgaXNOYU4oYW5nbGUpIHx8IGFuZ2xlID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgYXJyb3dTaGFwZSA9IGVkZ2UucHN0eWxlKHByZWZpeCArICctYXJyb3ctc2hhcGUnKS52YWx1ZTtcbiAgaWYgKGFycm93U2hhcGUgPT09ICdub25lJykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgYXJyb3dDbGVhckZpbGwgPSBlZGdlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LWZpbGwnKS52YWx1ZSA9PT0gJ2hvbGxvdycgPyAnYm90aCcgOiAnZmlsbGVkJztcbiAgdmFyIGFycm93RmlsbCA9IGVkZ2UucHN0eWxlKHByZWZpeCArICctYXJyb3ctZmlsbCcpLnZhbHVlO1xuICB2YXIgZWRnZVdpZHRoID0gZWRnZS5wc3R5bGUoJ3dpZHRoJykucGZWYWx1ZTtcbiAgdmFyIHBBcnJvd1dpZHRoID0gZWRnZS5wc3R5bGUocHJlZml4ICsgJy1hcnJvdy13aWR0aCcpO1xuICB2YXIgYXJyb3dXaWR0aCA9IHBBcnJvd1dpZHRoLnZhbHVlID09PSAnbWF0Y2gtbGluZScgPyBlZGdlV2lkdGggOiBwQXJyb3dXaWR0aC5wZlZhbHVlO1xuICBpZiAocEFycm93V2lkdGgudW5pdHMgPT09ICclJykgYXJyb3dXaWR0aCAqPSBlZGdlV2lkdGg7XG4gIHZhciBlZGdlT3BhY2l0eSA9IGVkZ2UucHN0eWxlKCdvcGFjaXR5JykudmFsdWU7XG4gIGlmIChvcGFjaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICBvcGFjaXR5ID0gZWRnZU9wYWNpdHk7XG4gIH1cbiAgdmFyIGdjbyA9IGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO1xuICBpZiAob3BhY2l0eSAhPT0gMSB8fCBhcnJvd0ZpbGwgPT09ICdob2xsb3cnKSB7XG4gICAgLy8gdGhlbiBleHRyYSBjbGVhciBpcyBuZWVkZWRcbiAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdkZXN0aW5hdGlvbi1vdXQnO1xuICAgIHNlbGYuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgMjU1LCAyNTUsIDI1NSwgMSk7XG4gICAgc2VsZi5jb2xvclN0cm9rZVN0eWxlKGNvbnRleHQsIDI1NSwgMjU1LCAyNTUsIDEpO1xuICAgIHNlbGYuZHJhd0Fycm93U2hhcGUoZWRnZSwgY29udGV4dCwgYXJyb3dDbGVhckZpbGwsIGVkZ2VXaWR0aCwgYXJyb3dTaGFwZSwgYXJyb3dXaWR0aCwgeCwgeSwgYW5nbGUpO1xuICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gZ2NvO1xuICB9IC8vIG90aGVyd2lzZSwgdGhlIG9wYXF1ZSBhcnJvdyBjbGVhcnMgaXQgZm9yIGZyZWUgOilcblxuICB2YXIgY29sb3IgPSBlZGdlLnBzdHlsZShwcmVmaXggKyAnLWFycm93LWNvbG9yJykudmFsdWU7XG4gIHNlbGYuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gIHNlbGYuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdLCBvcGFjaXR5KTtcbiAgc2VsZi5kcmF3QXJyb3dTaGFwZShlZGdlLCBjb250ZXh0LCBhcnJvd0ZpbGwsIGVkZ2VXaWR0aCwgYXJyb3dTaGFwZSwgYXJyb3dXaWR0aCwgeCwgeSwgYW5nbGUpO1xufTtcbkNScCQ4LmRyYXdBcnJvd1NoYXBlID0gZnVuY3Rpb24gKGVkZ2UsIGNvbnRleHQsIGZpbGwsIGVkZ2VXaWR0aCwgc2hhcGUsIHNoYXBlV2lkdGgsIHgsIHksIGFuZ2xlKSB7XG4gIHZhciByID0gdGhpcztcbiAgdmFyIHVzZVBhdGhzID0gdGhpcy51c2VQYXRocygpICYmIHNoYXBlICE9PSAndHJpYW5nbGUtY3Jvc3MnO1xuICB2YXIgcGF0aENhY2hlSGl0ID0gZmFsc2U7XG4gIHZhciBwYXRoO1xuICB2YXIgY2FudmFzQ29udGV4dCA9IGNvbnRleHQ7XG4gIHZhciB0cmFuc2xhdGlvbiA9IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcbiAgdmFyIHNjYWxlID0gZWRnZS5wc3R5bGUoJ2Fycm93LXNjYWxlJykudmFsdWU7XG4gIHZhciBzaXplID0gdGhpcy5nZXRBcnJvd1dpZHRoKGVkZ2VXaWR0aCwgc2NhbGUpO1xuICB2YXIgc2hhcGVJbXBsID0gci5hcnJvd1NoYXBlc1tzaGFwZV07XG4gIGlmICh1c2VQYXRocykge1xuICAgIHZhciBjYWNoZSA9IHIuYXJyb3dQYXRoQ2FjaGUgPSByLmFycm93UGF0aENhY2hlIHx8IFtdO1xuICAgIHZhciBrZXkgPSBoYXNoU3RyaW5nKHNoYXBlKTtcbiAgICB2YXIgY2FjaGVkUGF0aCA9IGNhY2hlW2tleV07XG4gICAgaWYgKGNhY2hlZFBhdGggIT0gbnVsbCkge1xuICAgICAgcGF0aCA9IGNvbnRleHQgPSBjYWNoZWRQYXRoO1xuICAgICAgcGF0aENhY2hlSGl0ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aCA9IGNvbnRleHQgPSBuZXcgUGF0aDJEKCk7XG4gICAgICBjYWNoZVtrZXldID0gcGF0aDtcbiAgICB9XG4gIH1cbiAgaWYgKCFwYXRoQ2FjaGVIaXQpIHtcbiAgICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgfVxuICAgIGlmICh1c2VQYXRocykge1xuICAgICAgLy8gc3RvcmUgaW4gdGhlIHBhdGggY2FjaGUgd2l0aCB2YWx1ZXMgZWFzaWx5IG1hbmlwdWxhdGVkIGxhdGVyXG4gICAgICBzaGFwZUltcGwuZHJhdyhjb250ZXh0LCAxLCAwLCB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDBcbiAgICAgIH0sIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaGFwZUltcGwuZHJhdyhjb250ZXh0LCBzaXplLCBhbmdsZSwgdHJhbnNsYXRpb24sIGVkZ2VXaWR0aCk7XG4gICAgfVxuICAgIGlmIChjb250ZXh0LmNsb3NlUGF0aCkge1xuICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB9XG4gIH1cbiAgY29udGV4dCA9IGNhbnZhc0NvbnRleHQ7XG4gIGlmICh1c2VQYXRocykge1xuICAgIC8vIHNldCB0cmFuc2Zvcm0gdG8gYXJyb3cgcG9zaXRpb24vb3JpZW50YXRpb25cbiAgICBjb250ZXh0LnRyYW5zbGF0ZSh4LCB5KTtcbiAgICBjb250ZXh0LnJvdGF0ZShhbmdsZSk7XG4gICAgY29udGV4dC5zY2FsZShzaXplLCBzaXplKTtcbiAgfVxuICBpZiAoZmlsbCA9PT0gJ2ZpbGxlZCcgfHwgZmlsbCA9PT0gJ2JvdGgnKSB7XG4gICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICBjb250ZXh0LmZpbGwocGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIH1cbiAgfVxuICBpZiAoZmlsbCA9PT0gJ2hvbGxvdycgfHwgZmlsbCA9PT0gJ2JvdGgnKSB7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSBzaGFwZVdpZHRoIC8gKHVzZVBhdGhzID8gc2l6ZSA6IDEpO1xuICAgIGNvbnRleHQubGluZUpvaW4gPSAnbWl0ZXInO1xuICAgIGlmICh1c2VQYXRocykge1xuICAgICAgY29udGV4dC5zdHJva2UocGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgfVxuICB9XG4gIGlmICh1c2VQYXRocykge1xuICAgIC8vIHJlc2V0IHRyYW5zZm9ybSBieSBhcHBseWluZyBpbnZlcnNlXG4gICAgY29udGV4dC5zY2FsZSgxIC8gc2l6ZSwgMSAvIHNpemUpO1xuICAgIGNvbnRleHQucm90YXRlKC1hbmdsZSk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLXgsIC15KTtcbiAgfVxufTtcblxudmFyIENScCQ3ID0ge307XG5DUnAkNy5zYWZlRHJhd0ltYWdlID0gZnVuY3Rpb24gKGNvbnRleHQsIGltZywgaXgsIGl5LCBpdywgaWgsIHgsIHksIHcsIGgpIHtcbiAgLy8gZGV0ZWN0IHByb2JsZW1hdGljIGNhc2VzIGZvciBvbGQgYnJvd3NlcnMgd2l0aCBiYWQgaW1hZ2VzIChjaGVhcGVyIHRoYW4gdHJ5LWNhdGNoKVxuICBpZiAoaXcgPD0gMCB8fCBpaCA8PSAwIHx8IHcgPD0gMCB8fCBoIDw9IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIGl4LCBpeSwgaXcsIGloLCB4LCB5LCB3LCBoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHdhcm4oZSk7XG4gIH1cbn07XG5DUnAkNy5kcmF3SW5zY3JpYmVkSW1hZ2UgPSBmdW5jdGlvbiAoY29udGV4dCwgaW1nLCBub2RlLCBpbmRleCwgbm9kZU9wYWNpdHkpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgcG9zID0gbm9kZS5wb3NpdGlvbigpO1xuICB2YXIgbm9kZVggPSBwb3MueDtcbiAgdmFyIG5vZGVZID0gcG9zLnk7XG4gIHZhciBzdHlsZU9iaiA9IG5vZGUuY3koKS5zdHlsZSgpO1xuICB2YXIgZ2V0SW5kZXhlZFN0eWxlID0gc3R5bGVPYmouZ2V0SW5kZXhlZFN0eWxlLmJpbmQoc3R5bGVPYmopO1xuICB2YXIgZml0ID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWZpdCcsICd2YWx1ZScsIGluZGV4KTtcbiAgdmFyIHJlcGVhdCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1yZXBlYXQnLCAndmFsdWUnLCBpbmRleCk7XG4gIHZhciBub2RlVyA9IG5vZGUud2lkdGgoKTtcbiAgdmFyIG5vZGVIID0gbm9kZS5oZWlnaHQoKTtcbiAgdmFyIHBhZGRpbmdYMiA9IG5vZGUucGFkZGluZygpICogMjtcbiAgdmFyIG5vZGVUVyA9IG5vZGVXICsgKGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC13aWR0aC1yZWxhdGl2ZS10bycsICd2YWx1ZScsIGluZGV4KSA9PT0gJ2lubmVyJyA/IDAgOiBwYWRkaW5nWDIpO1xuICB2YXIgbm9kZVRIID0gbm9kZUggKyAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWhlaWdodC1yZWxhdGl2ZS10bycsICd2YWx1ZScsIGluZGV4KSA9PT0gJ2lubmVyJyA/IDAgOiBwYWRkaW5nWDIpO1xuICB2YXIgcnMgPSBub2RlLl9wcml2YXRlLnJzY3JhdGNoO1xuICB2YXIgY2xpcCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1jbGlwJywgJ3ZhbHVlJywgaW5kZXgpO1xuICB2YXIgc2hvdWxkQ2xpcCA9IGNsaXAgPT09ICdub2RlJztcbiAgdmFyIGltZ09wYWNpdHkgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtaW1hZ2Utb3BhY2l0eScsICd2YWx1ZScsIGluZGV4KSAqIG5vZGVPcGFjaXR5O1xuICB2YXIgc21vb3RoID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWltYWdlLXNtb290aGluZycsICd2YWx1ZScsIGluZGV4KTtcbiAgdmFyIGNvcm5lclJhZGl1cyA9IG5vZGUucHN0eWxlKCdjb3JuZXItcmFkaXVzJykudmFsdWU7XG4gIGlmIChjb3JuZXJSYWRpdXMgIT09ICdhdXRvJykgY29ybmVyUmFkaXVzID0gbm9kZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS5wZlZhbHVlO1xuICB2YXIgaW1nVyA9IGltZy53aWR0aCB8fCBpbWcuY2FjaGVkVztcbiAgdmFyIGltZ0ggPSBpbWcuaGVpZ2h0IHx8IGltZy5jYWNoZWRIO1xuXG4gIC8vIHdvcmthcm91bmQgZm9yIGJyb2tlbiBicm93c2VycyBsaWtlIGllXG4gIGlmIChudWxsID09IGltZ1cgfHwgbnVsbCA9PSBpbWdIKSB7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpbWcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbiAgICBpbWdXID0gaW1nLmNhY2hlZFcgPSBpbWcud2lkdGggfHwgaW1nLm9mZnNldFdpZHRoO1xuICAgIGltZ0ggPSBpbWcuY2FjaGVkSCA9IGltZy5oZWlnaHQgfHwgaW1nLm9mZnNldEhlaWdodDtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGltZyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgfVxuXG4gIHZhciB3ID0gaW1nVztcbiAgdmFyIGggPSBpbWdIO1xuICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoJywgJ3ZhbHVlJywgaW5kZXgpICE9PSAnYXV0bycpIHtcbiAgICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXdpZHRoJywgJ3VuaXRzJywgaW5kZXgpID09PSAnJScpIHtcbiAgICAgIHcgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtd2lkdGgnLCAncGZWYWx1ZScsIGluZGV4KSAqIG5vZGVUVztcbiAgICB9IGVsc2Uge1xuICAgICAgdyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC13aWR0aCcsICdwZlZhbHVlJywgaW5kZXgpO1xuICAgIH1cbiAgfVxuICBpZiAoZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWhlaWdodCcsICd2YWx1ZScsIGluZGV4KSAhPT0gJ2F1dG8nKSB7XG4gICAgaWYgKGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1oZWlnaHQnLCAndW5pdHMnLCBpbmRleCkgPT09ICclJykge1xuICAgICAgaCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1oZWlnaHQnLCAncGZWYWx1ZScsIGluZGV4KSAqIG5vZGVUSDtcbiAgICB9IGVsc2Uge1xuICAgICAgaCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1oZWlnaHQnLCAncGZWYWx1ZScsIGluZGV4KTtcbiAgICB9XG4gIH1cbiAgaWYgKHcgPT09IDAgfHwgaCA9PT0gMCkge1xuICAgIHJldHVybjsgLy8gbm8gcG9pbnQgaW4gZHJhd2luZyBlbXB0eSBpbWFnZSAoYW5kIGNocm9tZSBpcyBicm9rZW4gaW4gdGhpcyBjYXNlKVxuICB9XG5cbiAgaWYgKGZpdCA9PT0gJ2NvbnRhaW4nKSB7XG4gICAgdmFyIHNjYWxlID0gTWF0aC5taW4obm9kZVRXIC8gdywgbm9kZVRIIC8gaCk7XG4gICAgdyAqPSBzY2FsZTtcbiAgICBoICo9IHNjYWxlO1xuICB9IGVsc2UgaWYgKGZpdCA9PT0gJ2NvdmVyJykge1xuICAgIHZhciBzY2FsZSA9IE1hdGgubWF4KG5vZGVUVyAvIHcsIG5vZGVUSCAvIGgpO1xuICAgIHcgKj0gc2NhbGU7XG4gICAgaCAqPSBzY2FsZTtcbiAgfVxuICB2YXIgeCA9IG5vZGVYIC0gbm9kZVRXIC8gMjsgLy8gbGVmdFxuICB2YXIgcG9zWFVuaXRzID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXgnLCAndW5pdHMnLCBpbmRleCk7XG4gIHZhciBwb3NYUGZWYWwgPSBnZXRJbmRleGVkU3R5bGUobm9kZSwgJ2JhY2tncm91bmQtcG9zaXRpb24teCcsICdwZlZhbHVlJywgaW5kZXgpO1xuICBpZiAocG9zWFVuaXRzID09PSAnJScpIHtcbiAgICB4ICs9IChub2RlVFcgLSB3KSAqIHBvc1hQZlZhbDtcbiAgfSBlbHNlIHtcbiAgICB4ICs9IHBvc1hQZlZhbDtcbiAgfVxuICB2YXIgb2ZmWFVuaXRzID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLW9mZnNldC14JywgJ3VuaXRzJywgaW5kZXgpO1xuICB2YXIgb2ZmWFBmVmFsID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLW9mZnNldC14JywgJ3BmVmFsdWUnLCBpbmRleCk7XG4gIGlmIChvZmZYVW5pdHMgPT09ICclJykge1xuICAgIHggKz0gKG5vZGVUVyAtIHcpICogb2ZmWFBmVmFsO1xuICB9IGVsc2Uge1xuICAgIHggKz0gb2ZmWFBmVmFsO1xuICB9XG4gIHZhciB5ID0gbm9kZVkgLSBub2RlVEggLyAyOyAvLyB0b3BcbiAgdmFyIHBvc1lVbml0cyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1wb3NpdGlvbi15JywgJ3VuaXRzJywgaW5kZXgpO1xuICB2YXIgcG9zWVBmVmFsID0gZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLXBvc2l0aW9uLXknLCAncGZWYWx1ZScsIGluZGV4KTtcbiAgaWYgKHBvc1lVbml0cyA9PT0gJyUnKSB7XG4gICAgeSArPSAobm9kZVRIIC0gaCkgKiBwb3NZUGZWYWw7XG4gIH0gZWxzZSB7XG4gICAgeSArPSBwb3NZUGZWYWw7XG4gIH1cbiAgdmFyIG9mZllVbml0cyA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1vZmZzZXQteScsICd1bml0cycsIGluZGV4KTtcbiAgdmFyIG9mZllQZlZhbCA9IGdldEluZGV4ZWRTdHlsZShub2RlLCAnYmFja2dyb3VuZC1vZmZzZXQteScsICdwZlZhbHVlJywgaW5kZXgpO1xuICBpZiAob2ZmWVVuaXRzID09PSAnJScpIHtcbiAgICB5ICs9IChub2RlVEggLSBoKSAqIG9mZllQZlZhbDtcbiAgfSBlbHNlIHtcbiAgICB5ICs9IG9mZllQZlZhbDtcbiAgfVxuICBpZiAocnMucGF0aENhY2hlKSB7XG4gICAgeCAtPSBub2RlWDtcbiAgICB5IC09IG5vZGVZO1xuICAgIG5vZGVYID0gMDtcbiAgICBub2RlWSA9IDA7XG4gIH1cbiAgdmFyIGdBbHBoYSA9IGNvbnRleHQuZ2xvYmFsQWxwaGE7XG4gIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBpbWdPcGFjaXR5O1xuICB2YXIgc21vb3RoaW5nRW5hYmxlZCA9IHIuZ2V0SW1nU21vb3RoaW5nKGNvbnRleHQpO1xuICB2YXIgaXNTbW9vdGhpbmdTd2l0Y2hlZCA9IGZhbHNlO1xuICBpZiAoc21vb3RoID09PSAnbm8nICYmIHNtb290aGluZ0VuYWJsZWQpIHtcbiAgICByLnNldEltZ1Ntb290aGluZyhjb250ZXh0LCBmYWxzZSk7XG4gICAgaXNTbW9vdGhpbmdTd2l0Y2hlZCA9IHRydWU7XG4gIH0gZWxzZSBpZiAoc21vb3RoID09PSAneWVzJyAmJiAhc21vb3RoaW5nRW5hYmxlZCkge1xuICAgIHIuc2V0SW1nU21vb3RoaW5nKGNvbnRleHQsIHRydWUpO1xuICAgIGlzU21vb3RoaW5nU3dpdGNoZWQgPSB0cnVlO1xuICB9XG4gIGlmIChyZXBlYXQgPT09ICduby1yZXBlYXQnKSB7XG4gICAgaWYgKHNob3VsZENsaXApIHtcbiAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgaWYgKHJzLnBhdGhDYWNoZSkge1xuICAgICAgICBjb250ZXh0LmNsaXAocnMucGF0aENhY2hlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHIubm9kZVNoYXBlc1tyLmdldE5vZGVTaGFwZShub2RlKV0uZHJhdyhjb250ZXh0LCBub2RlWCwgbm9kZVksIG5vZGVUVywgbm9kZVRILCBjb3JuZXJSYWRpdXMsIHJzKTtcbiAgICAgICAgY29udGV4dC5jbGlwKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHIuc2FmZURyYXdJbWFnZShjb250ZXh0LCBpbWcsIDAsIDAsIGltZ1csIGltZ0gsIHgsIHksIHcsIGgpO1xuICAgIGlmIChzaG91bGRDbGlwKSB7XG4gICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIHBhdHRlcm4gPSBjb250ZXh0LmNyZWF0ZVBhdHRlcm4oaW1nLCByZXBlYXQpO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gcGF0dGVybjtcbiAgICByLm5vZGVTaGFwZXNbci5nZXROb2RlU2hhcGUobm9kZSldLmRyYXcoY29udGV4dCwgbm9kZVgsIG5vZGVZLCBub2RlVFcsIG5vZGVUSCwgY29ybmVyUmFkaXVzLCBycyk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoeCwgeSk7XG4gICAgY29udGV4dC5maWxsKCk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLXgsIC15KTtcbiAgfVxuICBjb250ZXh0Lmdsb2JhbEFscGhhID0gZ0FscGhhO1xuICBpZiAoaXNTbW9vdGhpbmdTd2l0Y2hlZCkge1xuICAgIHIuc2V0SW1nU21vb3RoaW5nKGNvbnRleHQsIHNtb290aGluZ0VuYWJsZWQpO1xuICB9XG59O1xuXG52YXIgQ1JwJDYgPSB7fTtcbkNScCQ2LmVsZVRleHRCaWdnZXJUaGFuTWluID0gZnVuY3Rpb24gKGVsZSwgc2NhbGUpIHtcbiAgaWYgKCFzY2FsZSkge1xuICAgIHZhciB6b29tID0gZWxlLmN5KCkuem9vbSgpO1xuICAgIHZhciBweFJhdGlvID0gdGhpcy5nZXRQaXhlbFJhdGlvKCk7XG4gICAgdmFyIGx2bCA9IE1hdGguY2VpbChsb2cyKHpvb20gKiBweFJhdGlvKSk7IC8vIHRoZSBlZmZlY3RpdmUgdGV4dHVyZSBsZXZlbFxuXG4gICAgc2NhbGUgPSBNYXRoLnBvdygyLCBsdmwpO1xuICB9XG4gIHZhciBjb21wdXRlZFNpemUgPSBlbGUucHN0eWxlKCdmb250LXNpemUnKS5wZlZhbHVlICogc2NhbGU7XG4gIHZhciBtaW5TaXplID0gZWxlLnBzdHlsZSgnbWluLXpvb21lZC1mb250LXNpemUnKS5wZlZhbHVlO1xuICBpZiAoY29tcHV0ZWRTaXplIDwgbWluU2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5DUnAkNi5kcmF3RWxlbWVudFRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBzaGlmdFRvT3JpZ2luV2l0aEJiLCBmb3JjZSwgcHJlZml4KSB7XG4gIHZhciB1c2VFbGVPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiB0cnVlO1xuICB2YXIgciA9IHRoaXM7XG4gIGlmIChmb3JjZSA9PSBudWxsKSB7XG4gICAgaWYgKHVzZUVsZU9wYWNpdHkgJiYgIXIuZWxlVGV4dEJpZ2dlclRoYW5NaW4oZWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSBlbHNlIGlmIChmb3JjZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgIHZhciBsYWJlbCA9IGVsZS5wc3R5bGUoJ2xhYmVsJyk7XG4gICAgaWYgKCFsYWJlbCB8fCAhbGFiZWwudmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGp1c3RpZmljYXRpb24gPSByLmdldExhYmVsSnVzdGlmaWNhdGlvbihlbGUpO1xuICAgIGNvbnRleHQudGV4dEFsaWduID0ganVzdGlmaWNhdGlvbjtcbiAgICBjb250ZXh0LnRleHRCYXNlbGluZSA9ICdib3R0b20nO1xuICB9IGVsc2Uge1xuICAgIHZhciBiYWRMaW5lID0gZWxlLmVsZW1lbnQoKS5fcHJpdmF0ZS5yc2NyYXRjaC5iYWRMaW5lO1xuICAgIHZhciBfbGFiZWwgPSBlbGUucHN0eWxlKCdsYWJlbCcpO1xuICAgIHZhciBzcmNMYWJlbCA9IGVsZS5wc3R5bGUoJ3NvdXJjZS1sYWJlbCcpO1xuICAgIHZhciB0Z3RMYWJlbCA9IGVsZS5wc3R5bGUoJ3RhcmdldC1sYWJlbCcpO1xuICAgIGlmIChiYWRMaW5lIHx8ICghX2xhYmVsIHx8ICFfbGFiZWwudmFsdWUpICYmICghc3JjTGFiZWwgfHwgIXNyY0xhYmVsLnZhbHVlKSAmJiAoIXRndExhYmVsIHx8ICF0Z3RMYWJlbC52YWx1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29udGV4dC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICBjb250ZXh0LnRleHRCYXNlbGluZSA9ICdib3R0b20nO1xuICB9XG4gIHZhciBhcHBseVJvdGF0aW9uID0gIXNoaWZ0VG9PcmlnaW5XaXRoQmI7XG4gIHZhciBiYjtcbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBiYiA9IHNoaWZ0VG9PcmlnaW5XaXRoQmI7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWJiLngxLCAtYmIueTEpO1xuICB9XG4gIGlmIChwcmVmaXggPT0gbnVsbCkge1xuICAgIHIuZHJhd1RleHQoY29udGV4dCwgZWxlLCBudWxsLCBhcHBseVJvdGF0aW9uLCB1c2VFbGVPcGFjaXR5KTtcbiAgICBpZiAoZWxlLmlzRWRnZSgpKSB7XG4gICAgICByLmRyYXdUZXh0KGNvbnRleHQsIGVsZSwgJ3NvdXJjZScsIGFwcGx5Um90YXRpb24sIHVzZUVsZU9wYWNpdHkpO1xuICAgICAgci5kcmF3VGV4dChjb250ZXh0LCBlbGUsICd0YXJnZXQnLCBhcHBseVJvdGF0aW9uLCB1c2VFbGVPcGFjaXR5KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgci5kcmF3VGV4dChjb250ZXh0LCBlbGUsIHByZWZpeCwgYXBwbHlSb3RhdGlvbiwgdXNlRWxlT3BhY2l0eSk7XG4gIH1cbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZShiYi54MSwgYmIueTEpO1xuICB9XG59O1xuQ1JwJDYuZ2V0Rm9udENhY2hlID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgdmFyIGNhY2hlO1xuICB0aGlzLmZvbnRDYWNoZXMgPSB0aGlzLmZvbnRDYWNoZXMgfHwgW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5mb250Q2FjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2FjaGUgPSB0aGlzLmZvbnRDYWNoZXNbaV07XG4gICAgaWYgKGNhY2hlLmNvbnRleHQgPT09IGNvbnRleHQpIHtcbiAgICAgIHJldHVybiBjYWNoZTtcbiAgICB9XG4gIH1cbiAgY2FjaGUgPSB7XG4gICAgY29udGV4dDogY29udGV4dFxuICB9O1xuICB0aGlzLmZvbnRDYWNoZXMucHVzaChjYWNoZSk7XG4gIHJldHVybiBjYWNoZTtcbn07XG5cbi8vIHNldCB1cCBjYW52YXMgY29udGV4dCB3aXRoIGZvbnRcbi8vIHJldHVybnMgdHJhbnNmb3JtZWQgdGV4dCBzdHJpbmdcbkNScCQ2LnNldHVwVGV4dFN0eWxlID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSkge1xuICB2YXIgdXNlRWxlT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcbiAgLy8gRm9udCBzdHlsZVxuICB2YXIgbGFiZWxTdHlsZSA9IGVsZS5wc3R5bGUoJ2ZvbnQtc3R5bGUnKS5zdHJWYWx1ZTtcbiAgdmFyIGxhYmVsU2l6ZSA9IGVsZS5wc3R5bGUoJ2ZvbnQtc2l6ZScpLnBmVmFsdWUgKyAncHgnO1xuICB2YXIgbGFiZWxGYW1pbHkgPSBlbGUucHN0eWxlKCdmb250LWZhbWlseScpLnN0clZhbHVlO1xuICB2YXIgbGFiZWxXZWlnaHQgPSBlbGUucHN0eWxlKCdmb250LXdlaWdodCcpLnN0clZhbHVlO1xuICB2YXIgb3BhY2l0eSA9IHVzZUVsZU9wYWNpdHkgPyBlbGUuZWZmZWN0aXZlT3BhY2l0eSgpICogZWxlLnBzdHlsZSgndGV4dC1vcGFjaXR5JykudmFsdWUgOiAxO1xuICB2YXIgb3V0bGluZU9wYWNpdHkgPSBlbGUucHN0eWxlKCd0ZXh0LW91dGxpbmUtb3BhY2l0eScpLnZhbHVlICogb3BhY2l0eTtcbiAgdmFyIGNvbG9yID0gZWxlLnBzdHlsZSgnY29sb3InKS52YWx1ZTtcbiAgdmFyIG91dGxpbmVDb2xvciA9IGVsZS5wc3R5bGUoJ3RleHQtb3V0bGluZS1jb2xvcicpLnZhbHVlO1xuICBjb250ZXh0LmZvbnQgPSBsYWJlbFN0eWxlICsgJyAnICsgbGFiZWxXZWlnaHQgKyAnICcgKyBsYWJlbFNpemUgKyAnICcgKyBsYWJlbEZhbWlseTtcbiAgY29udGV4dC5saW5lSm9pbiA9ICdyb3VuZCc7IC8vIHNvIHRleHQgb3V0bGluZXMgYXJlbid0IGphZ2dlZFxuXG4gIHRoaXMuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gIHRoaXMuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBvdXRsaW5lQ29sb3JbMF0sIG91dGxpbmVDb2xvclsxXSwgb3V0bGluZUNvbG9yWzJdLCBvdXRsaW5lT3BhY2l0eSk7XG59O1xuXG4vLyBUT0RPIGVuc3VyZSByZS11c2VkXG5mdW5jdGlvbiByb3VuZFJlY3QoY3R4LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciByYWRpdXMgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IDU7XG4gIHZhciBzdHJva2UgPSBhcmd1bWVudHMubGVuZ3RoID4gNiA/IGFyZ3VtZW50c1s2XSA6IHVuZGVmaW5lZDtcbiAgY3R4LmJlZ2luUGF0aCgpO1xuICBjdHgubW92ZVRvKHggKyByYWRpdXMsIHkpO1xuICBjdHgubGluZVRvKHggKyB3aWR0aCAtIHJhZGl1cywgeSk7XG4gIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHggKyB3aWR0aCwgeSwgeCArIHdpZHRoLCB5ICsgcmFkaXVzKTtcbiAgY3R4LmxpbmVUbyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQgLSByYWRpdXMpO1xuICBjdHgucXVhZHJhdGljQ3VydmVUbyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHggKyB3aWR0aCAtIHJhZGl1cywgeSArIGhlaWdodCk7XG4gIGN0eC5saW5lVG8oeCArIHJhZGl1cywgeSArIGhlaWdodCk7XG4gIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHgsIHkgKyBoZWlnaHQsIHgsIHkgKyBoZWlnaHQgLSByYWRpdXMpO1xuICBjdHgubGluZVRvKHgsIHkgKyByYWRpdXMpO1xuICBjdHgucXVhZHJhdGljQ3VydmVUbyh4LCB5LCB4ICsgcmFkaXVzLCB5KTtcbiAgY3R4LmNsb3NlUGF0aCgpO1xuICBpZiAoc3Ryb2tlKSBjdHguc3Ryb2tlKCk7ZWxzZSBjdHguZmlsbCgpO1xufVxuQ1JwJDYuZ2V0VGV4dEFuZ2xlID0gZnVuY3Rpb24gKGVsZSwgcHJlZml4KSB7XG4gIHZhciB0aGV0YTtcbiAgdmFyIF9wID0gZWxlLl9wcml2YXRlO1xuICB2YXIgcnNjcmF0Y2ggPSBfcC5yc2NyYXRjaDtcbiAgdmFyIHBkYXNoID0gcHJlZml4ID8gcHJlZml4ICsgJy0nIDogJyc7XG4gIHZhciByb3RhdGlvbiA9IGVsZS5wc3R5bGUocGRhc2ggKyAndGV4dC1yb3RhdGlvbicpO1xuICB2YXIgdGV4dEFuZ2xlID0gZ2V0UHJlZml4ZWRQcm9wZXJ0eShyc2NyYXRjaCwgJ2xhYmVsQW5nbGUnLCBwcmVmaXgpO1xuICBpZiAocm90YXRpb24uc3RyVmFsdWUgPT09ICdhdXRvcm90YXRlJykge1xuICAgIHRoZXRhID0gZWxlLmlzRWRnZSgpID8gdGV4dEFuZ2xlIDogMDtcbiAgfSBlbHNlIGlmIChyb3RhdGlvbi5zdHJWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgdGhldGEgPSAwO1xuICB9IGVsc2Uge1xuICAgIHRoZXRhID0gcm90YXRpb24ucGZWYWx1ZTtcbiAgfVxuICByZXR1cm4gdGhldGE7XG59O1xuQ1JwJDYuZHJhd1RleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBwcmVmaXgpIHtcbiAgdmFyIGFwcGx5Um90YXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHRydWU7XG4gIHZhciB1c2VFbGVPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0cnVlO1xuICB2YXIgX3AgPSBlbGUuX3ByaXZhdGU7XG4gIHZhciByc2NyYXRjaCA9IF9wLnJzY3JhdGNoO1xuICB2YXIgcGFyZW50T3BhY2l0eSA9IHVzZUVsZU9wYWNpdHkgPyBlbGUuZWZmZWN0aXZlT3BhY2l0eSgpIDogMTtcbiAgaWYgKHVzZUVsZU9wYWNpdHkgJiYgKHBhcmVudE9wYWNpdHkgPT09IDAgfHwgZWxlLnBzdHlsZSgndGV4dC1vcGFjaXR5JykudmFsdWUgPT09IDApKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gdXNlICdtYWluJyBhcyBhbiBhbGlhcyBmb3IgdGhlIG1haW4gbGFiZWwgKGkuZS4gbnVsbCBwcmVmaXgpXG4gIGlmIChwcmVmaXggPT09ICdtYWluJykge1xuICAgIHByZWZpeCA9IG51bGw7XG4gIH1cbiAgdmFyIHRleHRYID0gZ2V0UHJlZml4ZWRQcm9wZXJ0eShyc2NyYXRjaCwgJ2xhYmVsWCcsIHByZWZpeCk7XG4gIHZhciB0ZXh0WSA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbFknLCBwcmVmaXgpO1xuICB2YXIgb3JnVGV4dFgsIG9yZ1RleHRZOyAvLyB1c2VkIGZvciByb3RhdGlvblxuICB2YXIgdGV4dCA9IHRoaXMuZ2V0TGFiZWxUZXh0KGVsZSwgcHJlZml4KTtcbiAgaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0ICE9PSAnJyAmJiAhaXNOYU4odGV4dFgpICYmICFpc05hTih0ZXh0WSkpIHtcbiAgICB0aGlzLnNldHVwVGV4dFN0eWxlKGNvbnRleHQsIGVsZSwgdXNlRWxlT3BhY2l0eSk7XG4gICAgdmFyIHBkYXNoID0gcHJlZml4ID8gcHJlZml4ICsgJy0nIDogJyc7XG4gICAgdmFyIHRleHRXID0gZ2V0UHJlZml4ZWRQcm9wZXJ0eShyc2NyYXRjaCwgJ2xhYmVsV2lkdGgnLCBwcmVmaXgpO1xuICAgIHZhciB0ZXh0SCA9IGdldFByZWZpeGVkUHJvcGVydHkocnNjcmF0Y2gsICdsYWJlbEhlaWdodCcsIHByZWZpeCk7XG4gICAgdmFyIG1hcmdpblggPSBlbGUucHN0eWxlKHBkYXNoICsgJ3RleHQtbWFyZ2luLXgnKS5wZlZhbHVlO1xuICAgIHZhciBtYXJnaW5ZID0gZWxlLnBzdHlsZShwZGFzaCArICd0ZXh0LW1hcmdpbi15JykucGZWYWx1ZTtcbiAgICB2YXIgaXNFZGdlID0gZWxlLmlzRWRnZSgpO1xuICAgIHZhciBoYWxpZ24gPSBlbGUucHN0eWxlKCd0ZXh0LWhhbGlnbicpLnZhbHVlO1xuICAgIHZhciB2YWxpZ24gPSBlbGUucHN0eWxlKCd0ZXh0LXZhbGlnbicpLnZhbHVlO1xuICAgIGlmIChpc0VkZ2UpIHtcbiAgICAgIGhhbGlnbiA9ICdjZW50ZXInO1xuICAgICAgdmFsaWduID0gJ2NlbnRlcic7XG4gICAgfVxuICAgIHRleHRYICs9IG1hcmdpblg7XG4gICAgdGV4dFkgKz0gbWFyZ2luWTtcbiAgICB2YXIgdGhldGE7XG4gICAgaWYgKCFhcHBseVJvdGF0aW9uKSB7XG4gICAgICB0aGV0YSA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoZXRhID0gdGhpcy5nZXRUZXh0QW5nbGUoZWxlLCBwcmVmaXgpO1xuICAgIH1cbiAgICBpZiAodGhldGEgIT09IDApIHtcbiAgICAgIG9yZ1RleHRYID0gdGV4dFg7XG4gICAgICBvcmdUZXh0WSA9IHRleHRZO1xuICAgICAgY29udGV4dC50cmFuc2xhdGUob3JnVGV4dFgsIG9yZ1RleHRZKTtcbiAgICAgIGNvbnRleHQucm90YXRlKHRoZXRhKTtcbiAgICAgIHRleHRYID0gMDtcbiAgICAgIHRleHRZID0gMDtcbiAgICB9XG4gICAgc3dpdGNoICh2YWxpZ24pIHtcbiAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgdGV4dFkgKz0gdGV4dEggLyAyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIHRleHRZICs9IHRleHRIO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIGJhY2tncm91bmRPcGFjaXR5ID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLW9wYWNpdHknKS52YWx1ZTtcbiAgICB2YXIgYm9yZGVyT3BhY2l0eSA9IGVsZS5wc3R5bGUoJ3RleHQtYm9yZGVyLW9wYWNpdHknKS52YWx1ZTtcbiAgICB2YXIgdGV4dEJvcmRlcldpZHRoID0gZWxlLnBzdHlsZSgndGV4dC1ib3JkZXItd2lkdGgnKS5wZlZhbHVlO1xuICAgIHZhciBiYWNrZ3JvdW5kUGFkZGluZyA9IGVsZS5wc3R5bGUoJ3RleHQtYmFja2dyb3VuZC1wYWRkaW5nJykucGZWYWx1ZTtcbiAgICB2YXIgc3R5bGVTaGFwZSA9IGVsZS5wc3R5bGUoJ3RleHQtYmFja2dyb3VuZC1zaGFwZScpLnN0clZhbHVlO1xuICAgIHZhciByb3VuZGVkID0gc3R5bGVTaGFwZS5pbmRleE9mKCdyb3VuZCcpID09PSAwO1xuICAgIHZhciByb3VuZFJhZGl1cyA9IDI7XG4gICAgaWYgKGJhY2tncm91bmRPcGFjaXR5ID4gMCB8fCB0ZXh0Qm9yZGVyV2lkdGggPiAwICYmIGJvcmRlck9wYWNpdHkgPiAwKSB7XG4gICAgICB2YXIgYmdYID0gdGV4dFggLSBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIHN3aXRjaCAoaGFsaWduKSB7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIGJnWCAtPSB0ZXh0VztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICBiZ1ggLT0gdGV4dFcgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFyIGJnWSA9IHRleHRZIC0gdGV4dEggLSBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIHZhciBiZ1cgPSB0ZXh0VyArIDIgKiBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIHZhciBiZ0ggPSB0ZXh0SCArIDIgKiBiYWNrZ3JvdW5kUGFkZGluZztcbiAgICAgIGlmIChiYWNrZ3JvdW5kT3BhY2l0eSA+IDApIHtcbiAgICAgICAgdmFyIHRleHRGaWxsID0gY29udGV4dC5maWxsU3R5bGU7XG4gICAgICAgIHZhciB0ZXh0QmFja2dyb3VuZENvbG9yID0gZWxlLnBzdHlsZSgndGV4dC1iYWNrZ3JvdW5kLWNvbG9yJykudmFsdWU7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJ3JnYmEoJyArIHRleHRCYWNrZ3JvdW5kQ29sb3JbMF0gKyAnLCcgKyB0ZXh0QmFja2dyb3VuZENvbG9yWzFdICsgJywnICsgdGV4dEJhY2tncm91bmRDb2xvclsyXSArICcsJyArIGJhY2tncm91bmRPcGFjaXR5ICogcGFyZW50T3BhY2l0eSArICcpJztcbiAgICAgICAgaWYgKHJvdW5kZWQpIHtcbiAgICAgICAgICByb3VuZFJlY3QoY29udGV4dCwgYmdYLCBiZ1ksIGJnVywgYmdILCByb3VuZFJhZGl1cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5maWxsUmVjdChiZ1gsIGJnWSwgYmdXLCBiZ0gpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gdGV4dEZpbGw7XG4gICAgICB9XG4gICAgICBpZiAodGV4dEJvcmRlcldpZHRoID4gMCAmJiBib3JkZXJPcGFjaXR5ID4gMCkge1xuICAgICAgICB2YXIgdGV4dFN0cm9rZSA9IGNvbnRleHQuc3Ryb2tlU3R5bGU7XG4gICAgICAgIHZhciB0ZXh0TGluZVdpZHRoID0gY29udGV4dC5saW5lV2lkdGg7XG4gICAgICAgIHZhciB0ZXh0Qm9yZGVyQ29sb3IgPSBlbGUucHN0eWxlKCd0ZXh0LWJvcmRlci1jb2xvcicpLnZhbHVlO1xuICAgICAgICB2YXIgdGV4dEJvcmRlclN0eWxlID0gZWxlLnBzdHlsZSgndGV4dC1ib3JkZXItc3R5bGUnKS52YWx1ZTtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9ICdyZ2JhKCcgKyB0ZXh0Qm9yZGVyQ29sb3JbMF0gKyAnLCcgKyB0ZXh0Qm9yZGVyQ29sb3JbMV0gKyAnLCcgKyB0ZXh0Qm9yZGVyQ29sb3JbMl0gKyAnLCcgKyBib3JkZXJPcGFjaXR5ICogcGFyZW50T3BhY2l0eSArICcpJztcbiAgICAgICAgY29udGV4dC5saW5lV2lkdGggPSB0ZXh0Qm9yZGVyV2lkdGg7XG4gICAgICAgIGlmIChjb250ZXh0LnNldExpbmVEYXNoKSB7XG4gICAgICAgICAgLy8gZm9yIHZlcnkgb3V0b2ZkYXRlIGJyb3dzZXJzXG4gICAgICAgICAgc3dpdGNoICh0ZXh0Qm9yZGVyU3R5bGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RvdHRlZCc6XG4gICAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goWzEsIDFdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkYXNoZWQnOlxuICAgICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFs0LCAyXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZG91YmxlJzpcbiAgICAgICAgICAgICAgY29udGV4dC5saW5lV2lkdGggPSB0ZXh0Qm9yZGVyV2lkdGggLyA0OyAvLyA1MCUgcmVzZXJ2ZWQgZm9yIHdoaXRlIGJldHdlZW4gdGhlIHR3byBib3JkZXJzXG4gICAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NvbGlkJzpcbiAgICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocm91bmRlZCkge1xuICAgICAgICAgIHJvdW5kUmVjdChjb250ZXh0LCBiZ1gsIGJnWSwgYmdXLCBiZ0gsIHJvdW5kUmFkaXVzLCAnc3Ryb2tlJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5zdHJva2VSZWN0KGJnWCwgYmdZLCBiZ1csIGJnSCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRleHRCb3JkZXJTdHlsZSA9PT0gJ2RvdWJsZScpIHtcbiAgICAgICAgICB2YXIgd2hpdGVXaWR0aCA9IHRleHRCb3JkZXJXaWR0aCAvIDI7XG4gICAgICAgICAgaWYgKHJvdW5kZWQpIHtcbiAgICAgICAgICAgIHJvdW5kUmVjdChjb250ZXh0LCBiZ1ggKyB3aGl0ZVdpZHRoLCBiZ1kgKyB3aGl0ZVdpZHRoLCBiZ1cgLSB3aGl0ZVdpZHRoICogMiwgYmdIIC0gd2hpdGVXaWR0aCAqIDIsIHJvdW5kUmFkaXVzLCAnc3Ryb2tlJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRleHQuc3Ryb2tlUmVjdChiZ1ggKyB3aGl0ZVdpZHRoLCBiZ1kgKyB3aGl0ZVdpZHRoLCBiZ1cgLSB3aGl0ZVdpZHRoICogMiwgYmdIIC0gd2hpdGVXaWR0aCAqIDIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAgIC8vIGZvciB2ZXJ5IG91dG9mZGF0ZSBicm93c2Vyc1xuICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQubGluZVdpZHRoID0gdGV4dExpbmVXaWR0aDtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHRleHRTdHJva2U7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBsaW5lV2lkdGggPSAyICogZWxlLnBzdHlsZSgndGV4dC1vdXRsaW5lLXdpZHRoJykucGZWYWx1ZTsgLy8gKjIgYi9jIHRoZSBzdHJva2UgaXMgZHJhd24gY2VudHJlZCBvbiB0aGUgbWlkZGxlXG5cbiAgICBpZiAobGluZVdpZHRoID4gMCkge1xuICAgICAgY29udGV4dC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG4gICAgfVxuICAgIGlmIChlbGUucHN0eWxlKCd0ZXh0LXdyYXAnKS52YWx1ZSA9PT0gJ3dyYXAnKSB7XG4gICAgICB2YXIgbGluZXMgPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxXcmFwQ2FjaGVkTGluZXMnLCBwcmVmaXgpO1xuICAgICAgdmFyIGxpbmVIZWlnaHQgPSBnZXRQcmVmaXhlZFByb3BlcnR5KHJzY3JhdGNoLCAnbGFiZWxMaW5lSGVpZ2h0JywgcHJlZml4KTtcbiAgICAgIHZhciBoYWxmVGV4dFcgPSB0ZXh0VyAvIDI7XG4gICAgICB2YXIganVzdGlmaWNhdGlvbiA9IHRoaXMuZ2V0TGFiZWxKdXN0aWZpY2F0aW9uKGVsZSk7XG4gICAgICBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ2F1dG8nKSA7IGVsc2UgaWYgKGhhbGlnbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIC8vIGF1dG8ganVzdGlmaWNhdGlvbiA6IHJpZ2h0XG4gICAgICAgIGlmIChqdXN0aWZpY2F0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICB0ZXh0WCArPSAtdGV4dFc7XG4gICAgICAgIH0gZWxzZSBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICB0ZXh0WCArPSAtaGFsZlRleHRXO1xuICAgICAgICB9IC8vIGVsc2Ugc2FtZSBhcyBhdXRvXG4gICAgICB9IGVsc2UgaWYgKGhhbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgLy8gYXV0byBqdXN0ZmljYXRpb24gOiBjZW50ZXJcbiAgICAgICAgaWYgKGp1c3RpZmljYXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgIHRleHRYICs9IC1oYWxmVGV4dFc7XG4gICAgICAgIH0gZWxzZSBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIHRleHRYICs9IGhhbGZUZXh0VztcbiAgICAgICAgfSAvLyBlbHNlIHNhbWUgYXMgYXV0b1xuICAgICAgfSBlbHNlIGlmIChoYWxpZ24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgLy8gYXV0byBqdXN0aWZpY2F0aW9uIDogbGVmdFxuICAgICAgICBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICB0ZXh0WCArPSBoYWxmVGV4dFc7XG4gICAgICAgIH0gZWxzZSBpZiAoanVzdGlmaWNhdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIHRleHRYICs9IHRleHRXO1xuICAgICAgICB9IC8vIGVsc2Ugc2FtZSBhcyBhdXRvXG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAodmFsaWduKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgdGV4dFkgLT0gKGxpbmVzLmxlbmd0aCAtIDEpICogbGluZUhlaWdodDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICB0ZXh0WSAtPSAobGluZXMubGVuZ3RoIC0gMSkgKiBsaW5lSGVpZ2h0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBsaW5lcy5sZW5ndGg7IGwrKykge1xuICAgICAgICBpZiAobGluZVdpZHRoID4gMCkge1xuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlVGV4dChsaW5lc1tsXSwgdGV4dFgsIHRleHRZKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmZpbGxUZXh0KGxpbmVzW2xdLCB0ZXh0WCwgdGV4dFkpO1xuICAgICAgICB0ZXh0WSArPSBsaW5lSGVpZ2h0O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobGluZVdpZHRoID4gMCkge1xuICAgICAgICBjb250ZXh0LnN0cm9rZVRleHQodGV4dCwgdGV4dFgsIHRleHRZKTtcbiAgICAgIH1cbiAgICAgIGNvbnRleHQuZmlsbFRleHQodGV4dCwgdGV4dFgsIHRleHRZKTtcbiAgICB9XG4gICAgaWYgKHRoZXRhICE9PSAwKSB7XG4gICAgICBjb250ZXh0LnJvdGF0ZSgtdGhldGEpO1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoLW9yZ1RleHRYLCAtb3JnVGV4dFkpO1xuICAgIH1cbiAgfVxufTtcblxuLyogZ2xvYmFsIFBhdGgyRCAqL1xudmFyIENScCQ1ID0ge307XG5DUnAkNS5kcmF3Tm9kZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBub2RlLCBzaGlmdFRvT3JpZ2luV2l0aEJiKSB7XG4gIHZhciBkcmF3TGFiZWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHRydWU7XG4gIHZhciBzaG91bGREcmF3T3ZlcmxheSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgdmFyIHNob3VsZERyYXdPcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiB0cnVlO1xuICB2YXIgciA9IHRoaXM7XG4gIHZhciBub2RlV2lkdGgsIG5vZGVIZWlnaHQ7XG4gIHZhciBfcCA9IG5vZGUuX3ByaXZhdGU7XG4gIHZhciBycyA9IF9wLnJzY3JhdGNoO1xuICB2YXIgcG9zID0gbm9kZS5wb3NpdGlvbigpO1xuICBpZiAoIW51bWJlciQxKHBvcy54KSB8fCAhbnVtYmVyJDEocG9zLnkpKSB7XG4gICAgcmV0dXJuOyAvLyBjYW4ndCBkcmF3IG5vZGUgd2l0aCB1bmRlZmluZWQgcG9zaXRpb25cbiAgfVxuXG4gIGlmIChzaG91bGREcmF3T3BhY2l0eSAmJiAhbm9kZS52aXNpYmxlKCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGVsZU9wYWNpdHkgPSBzaG91bGREcmF3T3BhY2l0eSA/IG5vZGUuZWZmZWN0aXZlT3BhY2l0eSgpIDogMTtcbiAgdmFyIHVzZVBhdGhzID0gci51c2VQYXRocygpO1xuICB2YXIgcGF0aDtcbiAgdmFyIHBhdGhDYWNoZUhpdCA9IGZhbHNlO1xuICB2YXIgcGFkZGluZyA9IG5vZGUucGFkZGluZygpO1xuICBub2RlV2lkdGggPSBub2RlLndpZHRoKCkgKyAyICogcGFkZGluZztcbiAgbm9kZUhlaWdodCA9IG5vZGUuaGVpZ2h0KCkgKyAyICogcGFkZGluZztcblxuICAvL1xuICAvLyBzZXR1cCBzaGlmdFxuXG4gIHZhciBiYjtcbiAgaWYgKHNoaWZ0VG9PcmlnaW5XaXRoQmIpIHtcbiAgICBiYiA9IHNoaWZ0VG9PcmlnaW5XaXRoQmI7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWJiLngxLCAtYmIueTEpO1xuICB9XG5cbiAgLy9cbiAgLy8gbG9hZCBiZyBpbWFnZVxuXG4gIHZhciBiZ0ltZ1Byb3AgPSBub2RlLnBzdHlsZSgnYmFja2dyb3VuZC1pbWFnZScpO1xuICB2YXIgdXJscyA9IGJnSW1nUHJvcC52YWx1ZTtcbiAgdmFyIHVybERlZmluZWQgPSBuZXcgQXJyYXkodXJscy5sZW5ndGgpO1xuICB2YXIgaW1hZ2UgPSBuZXcgQXJyYXkodXJscy5sZW5ndGgpO1xuICB2YXIgbnVtSW1hZ2VzID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHVybCA9IHVybHNbaV07XG4gICAgdmFyIGRlZmQgPSB1cmxEZWZpbmVkW2ldID0gdXJsICE9IG51bGwgJiYgdXJsICE9PSAnbm9uZSc7XG4gICAgaWYgKGRlZmQpIHtcbiAgICAgIHZhciBiZ0ltZ0Nyb3NzT3JpZ2luID0gbm9kZS5jeSgpLnN0eWxlKCkuZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWltYWdlLWNyb3Nzb3JpZ2luJywgJ3ZhbHVlJywgaSk7XG4gICAgICBudW1JbWFnZXMrKztcblxuICAgICAgLy8gZ2V0IGltYWdlLCBhbmQgaWYgbm90IGxvYWRlZCB0aGVuIGFzayB0byByZWRyYXcgd2hlbiBsYXRlciBsb2FkZWRcbiAgICAgIGltYWdlW2ldID0gci5nZXRDYWNoZWRJbWFnZSh1cmwsIGJnSW1nQ3Jvc3NPcmlnaW4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3AuYmFja2dyb3VuZFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIG5vZGUuZW1pdEFuZE5vdGlmeSgnYmFja2dyb3VuZCcpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy9cbiAgLy8gc2V0dXAgc3R5bGVzXG5cbiAgdmFyIGRhcmtuZXNzID0gbm9kZS5wc3R5bGUoJ2JhY2tncm91bmQtYmxhY2tlbicpLnZhbHVlO1xuICB2YXIgYm9yZGVyV2lkdGggPSBub2RlLnBzdHlsZSgnYm9yZGVyLXdpZHRoJykucGZWYWx1ZTtcbiAgdmFyIGJnT3BhY2l0eSA9IG5vZGUucHN0eWxlKCdiYWNrZ3JvdW5kLW9wYWNpdHknKS52YWx1ZSAqIGVsZU9wYWNpdHk7XG4gIHZhciBib3JkZXJDb2xvciA9IG5vZGUucHN0eWxlKCdib3JkZXItY29sb3InKS52YWx1ZTtcbiAgdmFyIGJvcmRlclN0eWxlID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1zdHlsZScpLnZhbHVlO1xuICB2YXIgYm9yZGVySm9pbiA9IG5vZGUucHN0eWxlKCdib3JkZXItam9pbicpLnZhbHVlO1xuICB2YXIgYm9yZGVyQ2FwID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1jYXAnKS52YWx1ZTtcbiAgdmFyIGJvcmRlclBvc2l0aW9uID0gbm9kZS5wc3R5bGUoJ2JvcmRlci1wb3NpdGlvbicpLnZhbHVlO1xuICB2YXIgYm9yZGVyUGF0dGVybiA9IG5vZGUucHN0eWxlKCdib3JkZXItZGFzaC1wYXR0ZXJuJykucGZWYWx1ZTtcbiAgdmFyIGJvcmRlck9mZnNldCA9IG5vZGUucHN0eWxlKCdib3JkZXItZGFzaC1vZmZzZXQnKS5wZlZhbHVlO1xuICB2YXIgYm9yZGVyT3BhY2l0eSA9IG5vZGUucHN0eWxlKCdib3JkZXItb3BhY2l0eScpLnZhbHVlICogZWxlT3BhY2l0eTtcbiAgdmFyIG91dGxpbmVXaWR0aCA9IG5vZGUucHN0eWxlKCdvdXRsaW5lLXdpZHRoJykucGZWYWx1ZTtcbiAgdmFyIG91dGxpbmVDb2xvciA9IG5vZGUucHN0eWxlKCdvdXRsaW5lLWNvbG9yJykudmFsdWU7XG4gIHZhciBvdXRsaW5lU3R5bGUgPSBub2RlLnBzdHlsZSgnb3V0bGluZS1zdHlsZScpLnZhbHVlO1xuICB2YXIgb3V0bGluZU9wYWNpdHkgPSBub2RlLnBzdHlsZSgnb3V0bGluZS1vcGFjaXR5JykudmFsdWUgKiBlbGVPcGFjaXR5O1xuICB2YXIgb3V0bGluZU9mZnNldCA9IG5vZGUucHN0eWxlKCdvdXRsaW5lLW9mZnNldCcpLnZhbHVlO1xuICB2YXIgY29ybmVyUmFkaXVzID0gbm9kZS5wc3R5bGUoJ2Nvcm5lci1yYWRpdXMnKS52YWx1ZTtcbiAgaWYgKGNvcm5lclJhZGl1cyAhPT0gJ2F1dG8nKSBjb3JuZXJSYWRpdXMgPSBub2RlLnBzdHlsZSgnY29ybmVyLXJhZGl1cycpLnBmVmFsdWU7XG4gIHZhciBzZXR1cFNoYXBlQ29sb3IgPSBmdW5jdGlvbiBzZXR1cFNoYXBlQ29sb3IoKSB7XG4gICAgdmFyIGJnT3B5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBiZ09wYWNpdHk7XG4gICAgci5lbGVGaWxsU3R5bGUoY29udGV4dCwgbm9kZSwgYmdPcHkpO1xuICB9O1xuICB2YXIgc2V0dXBCb3JkZXJDb2xvciA9IGZ1bmN0aW9uIHNldHVwQm9yZGVyQ29sb3IoKSB7XG4gICAgdmFyIGJkck9weSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogYm9yZGVyT3BhY2l0eTtcbiAgICByLmNvbG9yU3Ryb2tlU3R5bGUoY29udGV4dCwgYm9yZGVyQ29sb3JbMF0sIGJvcmRlckNvbG9yWzFdLCBib3JkZXJDb2xvclsyXSwgYmRyT3B5KTtcbiAgfTtcbiAgdmFyIHNldHVwT3V0bGluZUNvbG9yID0gZnVuY3Rpb24gc2V0dXBPdXRsaW5lQ29sb3IoKSB7XG4gICAgdmFyIG90bG5PcHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG91dGxpbmVPcGFjaXR5O1xuICAgIHIuY29sb3JTdHJva2VTdHlsZShjb250ZXh0LCBvdXRsaW5lQ29sb3JbMF0sIG91dGxpbmVDb2xvclsxXSwgb3V0bGluZUNvbG9yWzJdLCBvdGxuT3B5KTtcbiAgfTtcblxuICAvL1xuICAvLyBzZXR1cCBzaGFwZVxuXG4gIHZhciBnZXRQYXRoID0gZnVuY3Rpb24gZ2V0UGF0aCh3aWR0aCwgaGVpZ2h0LCBzaGFwZSwgcG9pbnRzKSB7XG4gICAgdmFyIHBhdGhDYWNoZSA9IHIubm9kZVBhdGhDYWNoZSA9IHIubm9kZVBhdGhDYWNoZSB8fCBbXTtcbiAgICB2YXIga2V5ID0gaGFzaFN0cmluZ3Moc2hhcGUgPT09ICdwb2x5Z29uJyA/IHNoYXBlICsgJywnICsgcG9pbnRzLmpvaW4oJywnKSA6IHNoYXBlLCAnJyArIGhlaWdodCwgJycgKyB3aWR0aCwgJycgKyBjb3JuZXJSYWRpdXMpO1xuICAgIHZhciBjYWNoZWRQYXRoID0gcGF0aENhY2hlW2tleV07XG4gICAgdmFyIHBhdGg7XG4gICAgdmFyIGNhY2hlSGl0ID0gZmFsc2U7XG4gICAgaWYgKGNhY2hlZFBhdGggIT0gbnVsbCkge1xuICAgICAgcGF0aCA9IGNhY2hlZFBhdGg7XG4gICAgICBjYWNoZUhpdCA9IHRydWU7XG4gICAgICBycy5wYXRoQ2FjaGUgPSBwYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoID0gbmV3IFBhdGgyRCgpO1xuICAgICAgcGF0aENhY2hlW2tleV0gPSBycy5wYXRoQ2FjaGUgPSBwYXRoO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogcGF0aCxcbiAgICAgIGNhY2hlSGl0OiBjYWNoZUhpdFxuICAgIH07XG4gIH07XG4gIHZhciBzdHlsZVNoYXBlID0gbm9kZS5wc3R5bGUoJ3NoYXBlJykuc3RyVmFsdWU7XG4gIHZhciBzaGFwZVB0cyA9IG5vZGUucHN0eWxlKCdzaGFwZS1wb2x5Z29uLXBvaW50cycpLnBmVmFsdWU7XG4gIGlmICh1c2VQYXRocykge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKHBvcy54LCBwb3MueSk7XG4gICAgdmFyIHNoYXBlUGF0aCA9IGdldFBhdGgobm9kZVdpZHRoLCBub2RlSGVpZ2h0LCBzdHlsZVNoYXBlLCBzaGFwZVB0cyk7XG4gICAgcGF0aCA9IHNoYXBlUGF0aC5wYXRoO1xuICAgIHBhdGhDYWNoZUhpdCA9IHNoYXBlUGF0aC5jYWNoZUhpdDtcbiAgfVxuICB2YXIgZHJhd1NoYXBlID0gZnVuY3Rpb24gZHJhd1NoYXBlKCkge1xuICAgIGlmICghcGF0aENhY2hlSGl0KSB7XG4gICAgICB2YXIgbnBvcyA9IHBvcztcbiAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICBucG9zID0ge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgci5ub2RlU2hhcGVzW3IuZ2V0Tm9kZVNoYXBlKG5vZGUpXS5kcmF3KHBhdGggfHwgY29udGV4dCwgbnBvcy54LCBucG9zLnksIG5vZGVXaWR0aCwgbm9kZUhlaWdodCwgY29ybmVyUmFkaXVzLCBycyk7XG4gICAgfVxuICAgIGlmICh1c2VQYXRocykge1xuICAgICAgY29udGV4dC5maWxsKHBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICB9XG4gIH07XG4gIHZhciBkcmF3SW1hZ2VzID0gZnVuY3Rpb24gZHJhd0ltYWdlcygpIHtcbiAgICB2YXIgbm9kZU9wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGVsZU9wYWNpdHk7XG4gICAgdmFyIGluc2lkZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICB2YXIgcHJldkJnaW5nID0gX3AuYmFja2dyb3VuZGluZztcbiAgICB2YXIgdG90YWxDb21wbGV0ZWQgPSAwO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBpbWFnZS5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBiZ0NvbnRhaW5tZW50ID0gbm9kZS5jeSgpLnN0eWxlKCkuZ2V0SW5kZXhlZFN0eWxlKG5vZGUsICdiYWNrZ3JvdW5kLWltYWdlLWNvbnRhaW5tZW50JywgJ3ZhbHVlJywgX2kpO1xuICAgICAgaWYgKGluc2lkZSAmJiBiZ0NvbnRhaW5tZW50ID09PSAnb3ZlcicgfHwgIWluc2lkZSAmJiBiZ0NvbnRhaW5tZW50ID09PSAnaW5zaWRlJykge1xuICAgICAgICB0b3RhbENvbXBsZXRlZCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh1cmxEZWZpbmVkW19pXSAmJiBpbWFnZVtfaV0uY29tcGxldGUgJiYgIWltYWdlW19pXS5lcnJvcikge1xuICAgICAgICB0b3RhbENvbXBsZXRlZCsrO1xuICAgICAgICByLmRyYXdJbnNjcmliZWRJbWFnZShjb250ZXh0LCBpbWFnZVtfaV0sIG5vZGUsIF9pLCBub2RlT3BhY2l0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIF9wLmJhY2tncm91bmRpbmcgPSAhKHRvdGFsQ29tcGxldGVkID09PSBudW1JbWFnZXMpO1xuICAgIGlmIChwcmV2QmdpbmcgIT09IF9wLmJhY2tncm91bmRpbmcpIHtcbiAgICAgIC8vIHVwZGF0ZSBzdHlsZSBiL2MgOmJhY2tncm91bmRpbmcgc3RhdGUgY2hhbmdlZFxuICAgICAgbm9kZS51cGRhdGVTdHlsZShmYWxzZSk7XG4gICAgfVxuICB9O1xuICB2YXIgZHJhd1BpZSA9IGZ1bmN0aW9uIGRyYXdQaWUoKSB7XG4gICAgdmFyIHJlZHJhd1NoYXBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICB2YXIgcGllT3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZWxlT3BhY2l0eTtcbiAgICBpZiAoci5oYXNQaWUobm9kZSkpIHtcbiAgICAgIHIuZHJhd1BpZShjb250ZXh0LCBub2RlLCBwaWVPcGFjaXR5KTtcblxuICAgICAgLy8gcmVkcmF3L3Jlc3RvcmUgcGF0aCBpZiBzdGVwcyBhZnRlciBwaWUgbmVlZCBpdFxuICAgICAgaWYgKHJlZHJhd1NoYXBlKSB7XG4gICAgICAgIGlmICghdXNlUGF0aHMpIHtcbiAgICAgICAgICByLm5vZGVTaGFwZXNbci5nZXROb2RlU2hhcGUobm9kZSldLmRyYXcoY29udGV4dCwgcG9zLngsIHBvcy55LCBub2RlV2lkdGgsIG5vZGVIZWlnaHQsIGNvcm5lclJhZGl1cywgcnMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgZGFya2VuID0gZnVuY3Rpb24gZGFya2VuKCkge1xuICAgIHZhciBkYXJrZW5PcGFjaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBlbGVPcGFjaXR5O1xuICAgIHZhciBvcGFjaXR5ID0gKGRhcmtuZXNzID4gMCA/IGRhcmtuZXNzIDogLWRhcmtuZXNzKSAqIGRhcmtlbk9wYWNpdHk7XG4gICAgdmFyIGMgPSBkYXJrbmVzcyA+IDAgPyAwIDogMjU1O1xuICAgIGlmIChkYXJrbmVzcyAhPT0gMCkge1xuICAgICAgci5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBjLCBjLCBjLCBvcGFjaXR5KTtcbiAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICBjb250ZXh0LmZpbGwocGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHZhciBkcmF3Qm9yZGVyID0gZnVuY3Rpb24gZHJhd0JvcmRlcigpIHtcbiAgICBpZiAoYm9yZGVyV2lkdGggPiAwKSB7XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGJvcmRlcldpZHRoO1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gYm9yZGVyQ2FwO1xuICAgICAgY29udGV4dC5saW5lSm9pbiA9IGJvcmRlckpvaW47XG4gICAgICBpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICAgICAgc3dpdGNoIChib3JkZXJTdHlsZSkge1xuICAgICAgICAgIGNhc2UgJ2RvdHRlZCc6XG4gICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFsxLCAxXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdkYXNoZWQnOlxuICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChib3JkZXJQYXR0ZXJuKTtcbiAgICAgICAgICAgIGNvbnRleHQubGluZURhc2hPZmZzZXQgPSBib3JkZXJPZmZzZXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdzb2xpZCc6XG4gICAgICAgICAgY2FzZSAnZG91YmxlJzpcbiAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goW10pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChib3JkZXJQb3NpdGlvbiAhPT0gJ2NlbnRlcicpIHtcbiAgICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICAgIGNvbnRleHQubGluZVdpZHRoICo9IDI7XG4gICAgICAgIGlmIChib3JkZXJQb3NpdGlvbiA9PT0gJ2luc2lkZScpIHtcbiAgICAgICAgICB1c2VQYXRocyA/IGNvbnRleHQuY2xpcChwYXRoKSA6IGNvbnRleHQuY2xpcCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciByZWdpb24gPSBuZXcgUGF0aDJEKCk7XG4gICAgICAgICAgcmVnaW9uLnJlY3QoLW5vZGVXaWR0aCAvIDIgLSBib3JkZXJXaWR0aCwgLW5vZGVIZWlnaHQgLyAyIC0gYm9yZGVyV2lkdGgsIG5vZGVXaWR0aCArIDIgKiBib3JkZXJXaWR0aCwgbm9kZUhlaWdodCArIDIgKiBib3JkZXJXaWR0aCk7XG4gICAgICAgICAgcmVnaW9uLmFkZFBhdGgocGF0aCk7XG4gICAgICAgICAgY29udGV4dC5jbGlwKHJlZ2lvbiwgJ2V2ZW5vZGQnKTtcbiAgICAgICAgfVxuICAgICAgICB1c2VQYXRocyA/IGNvbnRleHQuc3Ryb2tlKHBhdGgpIDogY29udGV4dC5zdHJva2UoKTtcbiAgICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1c2VQYXRocyA/IGNvbnRleHQuc3Ryb2tlKHBhdGgpIDogY29udGV4dC5zdHJva2UoKTtcbiAgICAgIH1cbiAgICAgIGlmIChib3JkZXJTdHlsZSA9PT0gJ2RvdWJsZScpIHtcbiAgICAgICAgY29udGV4dC5saW5lV2lkdGggPSBib3JkZXJXaWR0aCAvIDM7XG4gICAgICAgIHZhciBnY28gPSBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbjtcbiAgICAgICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnZGVzdGluYXRpb24tb3V0JztcbiAgICAgICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAgICAgY29udGV4dC5zdHJva2UocGF0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5zdHJva2UoKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGdjbztcbiAgICAgIH1cblxuICAgICAgLy8gcmVzZXQgaW4gY2FzZSB3ZSBjaGFuZ2VkIHRoZSBib3JkZXIgc3R5bGVcbiAgICAgIGlmIChjb250ZXh0LnNldExpbmVEYXNoKSB7XG4gICAgICAgIC8vIGZvciB2ZXJ5IG91dG9mZGF0ZSBicm93c2Vyc1xuICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFtdKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHZhciBkcmF3T3V0bGluZSA9IGZ1bmN0aW9uIGRyYXdPdXRsaW5lKCkge1xuICAgIGlmIChvdXRsaW5lV2lkdGggPiAwKSB7XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IG91dGxpbmVXaWR0aDtcbiAgICAgIGNvbnRleHQubGluZUNhcCA9ICdidXR0JztcbiAgICAgIGlmIChjb250ZXh0LnNldExpbmVEYXNoKSB7XG4gICAgICAgIC8vIGZvciB2ZXJ5IG91dG9mZGF0ZSBicm93c2Vyc1xuICAgICAgICBzd2l0Y2ggKG91dGxpbmVTdHlsZSkge1xuICAgICAgICAgIGNhc2UgJ2RvdHRlZCc6XG4gICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFsxLCAxXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdkYXNoZWQnOlxuICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbNCwgMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnc29saWQnOlxuICAgICAgICAgIGNhc2UgJ2RvdWJsZSc6XG4gICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKFtdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgbnBvcyA9IHBvcztcbiAgICAgIGlmICh1c2VQYXRocykge1xuICAgICAgICBucG9zID0ge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIHNoYXBlID0gci5nZXROb2RlU2hhcGUobm9kZSk7XG4gICAgICB2YXIgYldpZHRoID0gYm9yZGVyV2lkdGg7XG4gICAgICBpZiAoYm9yZGVyUG9zaXRpb24gPT09ICdpbnNpZGUnKSBiV2lkdGggPSAwO1xuICAgICAgaWYgKGJvcmRlclBvc2l0aW9uID09PSAnb3V0c2lkZScpIGJXaWR0aCAqPSAyO1xuICAgICAgdmFyIHNjYWxlWCA9IChub2RlV2lkdGggKyBiV2lkdGggKyAob3V0bGluZVdpZHRoICsgb3V0bGluZU9mZnNldCkpIC8gbm9kZVdpZHRoO1xuICAgICAgdmFyIHNjYWxlWSA9IChub2RlSGVpZ2h0ICsgYldpZHRoICsgKG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQpKSAvIG5vZGVIZWlnaHQ7XG4gICAgICB2YXIgc1dpZHRoID0gbm9kZVdpZHRoICogc2NhbGVYO1xuICAgICAgdmFyIHNIZWlnaHQgPSBub2RlSGVpZ2h0ICogc2NhbGVZO1xuICAgICAgdmFyIHBvaW50cyA9IHIubm9kZVNoYXBlc1tzaGFwZV0ucG9pbnRzO1xuICAgICAgdmFyIF9wYXRoO1xuICAgICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAgIHZhciBvdXRsaW5lUGF0aCA9IGdldFBhdGgoc1dpZHRoLCBzSGVpZ2h0LCBzaGFwZSwgcG9pbnRzKTtcbiAgICAgICAgX3BhdGggPSBvdXRsaW5lUGF0aC5wYXRoO1xuICAgICAgfVxuXG4gICAgICAvLyBkcmF3IHRoZSBvdXRsaW5lIHBhdGgsIGVpdGhlciBieSB1c2luZyBleHBhbmRlZCBwb2ludHMgb3IgYnkgc2NhbGluZyBcbiAgICAgIC8vIHRoZSBkaW1lbnNpb25zLCBkZXBlbmRpbmcgb24gc2hhcGVcbiAgICAgIGlmIChzaGFwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICAgICAgci5kcmF3RWxsaXBzZVBhdGgoX3BhdGggfHwgY29udGV4dCwgbnBvcy54LCBucG9zLnksIHNXaWR0aCwgc0hlaWdodCk7XG4gICAgICB9IGVsc2UgaWYgKFsncm91bmQtZGlhbW9uZCcsICdyb3VuZC1oZXB0YWdvbicsICdyb3VuZC1oZXhhZ29uJywgJ3JvdW5kLW9jdGFnb24nLCAncm91bmQtcGVudGFnb24nLCAncm91bmQtcG9seWdvbicsICdyb3VuZC10cmlhbmdsZScsICdyb3VuZC10YWcnXS5pbmNsdWRlcyhzaGFwZSkpIHtcbiAgICAgICAgdmFyIHNNdWx0ID0gMDtcbiAgICAgICAgdmFyIG9mZnNldFggPSAwO1xuICAgICAgICB2YXIgb2Zmc2V0WSA9IDA7XG4gICAgICAgIGlmIChzaGFwZSA9PT0gJ3JvdW5kLWRpYW1vbmQnKSB7XG4gICAgICAgICAgc011bHQgPSAoYldpZHRoICsgb3V0bGluZU9mZnNldCArIG91dGxpbmVXaWR0aCkgKiAxLjQ7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdyb3VuZC1oZXB0YWdvbicpIHtcbiAgICAgICAgICBzTXVsdCA9IChiV2lkdGggKyBvdXRsaW5lT2Zmc2V0ICsgb3V0bGluZVdpZHRoKSAqIDEuMDc1O1xuICAgICAgICAgIG9mZnNldFkgPSAtKGJXaWR0aCAvIDIgKyBvdXRsaW5lT2Zmc2V0ICsgb3V0bGluZVdpZHRoKSAvIDM1O1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAncm91bmQtaGV4YWdvbicpIHtcbiAgICAgICAgICBzTXVsdCA9IChiV2lkdGggKyBvdXRsaW5lT2Zmc2V0ICsgb3V0bGluZVdpZHRoKSAqIDEuMTI7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdyb3VuZC1wZW50YWdvbicpIHtcbiAgICAgICAgICBzTXVsdCA9IChiV2lkdGggKyBvdXRsaW5lT2Zmc2V0ICsgb3V0bGluZVdpZHRoKSAqIDEuMTM7XG4gICAgICAgICAgb2Zmc2V0WSA9IC0oYldpZHRoIC8gMiArIG91dGxpbmVPZmZzZXQgKyBvdXRsaW5lV2lkdGgpIC8gMTU7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGUgPT09ICdyb3VuZC10YWcnKSB7XG4gICAgICAgICAgc011bHQgPSAoYldpZHRoICsgb3V0bGluZU9mZnNldCArIG91dGxpbmVXaWR0aCkgKiAxLjEyO1xuICAgICAgICAgIG9mZnNldFggPSAoYldpZHRoIC8gMiArIG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQpICogLjA3O1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAncm91bmQtdHJpYW5nbGUnKSB7XG4gICAgICAgICAgc011bHQgPSAoYldpZHRoICsgb3V0bGluZU9mZnNldCArIG91dGxpbmVXaWR0aCkgKiAoTWF0aC5QSSAvIDIpO1xuICAgICAgICAgIG9mZnNldFkgPSAtKGJXaWR0aCArIG91dGxpbmVPZmZzZXQgLyAyICsgb3V0bGluZVdpZHRoKSAvIE1hdGguUEk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNNdWx0ICE9PSAwKSB7XG4gICAgICAgICAgc2NhbGVYID0gKG5vZGVXaWR0aCArIHNNdWx0KSAvIG5vZGVXaWR0aDtcbiAgICAgICAgICBzV2lkdGggPSBub2RlV2lkdGggKiBzY2FsZVg7XG4gICAgICAgICAgaWYgKCFbJ3JvdW5kLWhleGFnb24nLCAncm91bmQtdGFnJ10uaW5jbHVkZXMoc2hhcGUpKSB7XG4gICAgICAgICAgICBzY2FsZVkgPSAobm9kZUhlaWdodCArIHNNdWx0KSAvIG5vZGVIZWlnaHQ7XG4gICAgICAgICAgICBzSGVpZ2h0ID0gbm9kZUhlaWdodCAqIHNjYWxlWTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29ybmVyUmFkaXVzID0gY29ybmVyUmFkaXVzID09PSAnYXV0bycgPyBnZXRSb3VuZFBvbHlnb25SYWRpdXMoc1dpZHRoLCBzSGVpZ2h0KSA6IGNvcm5lclJhZGl1cztcbiAgICAgICAgdmFyIGhhbGZXID0gc1dpZHRoIC8gMjtcbiAgICAgICAgdmFyIGhhbGZIID0gc0hlaWdodCAvIDI7XG4gICAgICAgIHZhciByYWRpdXMgPSBjb3JuZXJSYWRpdXMgKyAoYldpZHRoICsgb3V0bGluZVdpZHRoICsgb3V0bGluZU9mZnNldCkgLyAyO1xuICAgICAgICB2YXIgcCA9IG5ldyBBcnJheShwb2ludHMubGVuZ3RoIC8gMik7XG4gICAgICAgIHZhciBjb3JuZXJzID0gbmV3IEFycmF5KHBvaW50cy5sZW5ndGggLyAyKTtcbiAgICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgcG9pbnRzLmxlbmd0aCAvIDI7IF9pMysrKSB7XG4gICAgICAgICAgcFtfaTNdID0ge1xuICAgICAgICAgICAgeDogbnBvcy54ICsgb2Zmc2V0WCArIGhhbGZXICogcG9pbnRzW19pMyAqIDJdLFxuICAgICAgICAgICAgeTogbnBvcy55ICsgb2Zmc2V0WSArIGhhbGZIICogcG9pbnRzW19pMyAqIDIgKyAxXVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9pMixcbiAgICAgICAgICBwMSxcbiAgICAgICAgICBwMixcbiAgICAgICAgICBwMyxcbiAgICAgICAgICBsZW4gPSBwLmxlbmd0aDtcbiAgICAgICAgcDEgPSBwW2xlbiAtIDFdO1xuICAgICAgICAvLyBmb3IgZWFjaCBwb2ludFxuICAgICAgICBmb3IgKF9pMiA9IDA7IF9pMiA8IGxlbjsgX2kyKyspIHtcbiAgICAgICAgICBwMiA9IHBbX2kyICUgbGVuXTtcbiAgICAgICAgICBwMyA9IHBbKF9pMiArIDEpICUgbGVuXTtcbiAgICAgICAgICBjb3JuZXJzW19pMl0gPSBnZXRSb3VuZENvcm5lcihwMSwgcDIsIHAzLCByYWRpdXMpO1xuICAgICAgICAgIHAxID0gcDI7XG4gICAgICAgICAgcDIgPSBwMztcbiAgICAgICAgfVxuICAgICAgICByLmRyYXdSb3VuZFBvbHlnb25QYXRoKF9wYXRoIHx8IGNvbnRleHQsIG5wb3MueCArIG9mZnNldFgsIG5wb3MueSArIG9mZnNldFksIG5vZGVXaWR0aCAqIHNjYWxlWCwgbm9kZUhlaWdodCAqIHNjYWxlWSwgcG9pbnRzLCBjb3JuZXJzKTtcbiAgICAgIH0gZWxzZSBpZiAoWydyb3VuZHJlY3RhbmdsZScsICdyb3VuZC1yZWN0YW5nbGUnXS5pbmNsdWRlcyhzaGFwZSkpIHtcbiAgICAgICAgY29ybmVyUmFkaXVzID0gY29ybmVyUmFkaXVzID09PSAnYXV0bycgPyBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyhzV2lkdGgsIHNIZWlnaHQpIDogY29ybmVyUmFkaXVzO1xuICAgICAgICByLmRyYXdSb3VuZFJlY3RhbmdsZVBhdGgoX3BhdGggfHwgY29udGV4dCwgbnBvcy54LCBucG9zLnksIHNXaWR0aCwgc0hlaWdodCwgY29ybmVyUmFkaXVzICsgKGJXaWR0aCArIG91dGxpbmVXaWR0aCArIG91dGxpbmVPZmZzZXQpIC8gMik7XG4gICAgICB9IGVsc2UgaWYgKFsnY3V0cmVjdGFuZ2xlJywgJ2N1dC1yZWN0YW5nbGUnXS5pbmNsdWRlcyhzaGFwZSkpIHtcbiAgICAgICAgY29ybmVyUmFkaXVzID0gY29ybmVyUmFkaXVzID09PSAnYXV0bycgPyBnZXRDdXRSZWN0YW5nbGVDb3JuZXJMZW5ndGgoKSA6IGNvcm5lclJhZGl1cztcbiAgICAgICAgci5kcmF3Q3V0UmVjdGFuZ2xlUGF0aChfcGF0aCB8fCBjb250ZXh0LCBucG9zLngsIG5wb3MueSwgc1dpZHRoLCBzSGVpZ2h0LCBudWxsLCBjb3JuZXJSYWRpdXMgKyAoYldpZHRoICsgb3V0bGluZVdpZHRoICsgb3V0bGluZU9mZnNldCkgLyA0KTtcbiAgICAgIH0gZWxzZSBpZiAoWydib3R0b21yb3VuZHJlY3RhbmdsZScsICdib3R0b20tcm91bmQtcmVjdGFuZ2xlJ10uaW5jbHVkZXMoc2hhcGUpKSB7XG4gICAgICAgIGNvcm5lclJhZGl1cyA9IGNvcm5lclJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMoc1dpZHRoLCBzSGVpZ2h0KSA6IGNvcm5lclJhZGl1cztcbiAgICAgICAgci5kcmF3Qm90dG9tUm91bmRSZWN0YW5nbGVQYXRoKF9wYXRoIHx8IGNvbnRleHQsIG5wb3MueCwgbnBvcy55LCBzV2lkdGgsIHNIZWlnaHQsIGNvcm5lclJhZGl1cyArIChiV2lkdGggKyBvdXRsaW5lV2lkdGggKyBvdXRsaW5lT2Zmc2V0KSAvIDIpO1xuICAgICAgfSBlbHNlIGlmIChzaGFwZSA9PT0gXCJiYXJyZWxcIikge1xuICAgICAgICByLmRyYXdCYXJyZWxQYXRoKF9wYXRoIHx8IGNvbnRleHQsIG5wb3MueCwgbnBvcy55LCBzV2lkdGgsIHNIZWlnaHQpO1xuICAgICAgfSBlbHNlIGlmIChzaGFwZS5zdGFydHNXaXRoKFwicG9seWdvblwiKSB8fCBbJ3Job21ib2lkJywgJ3JpZ2h0LXJob21ib2lkJywgJ3JvdW5kLXRhZycsICd0YWcnLCAndmVlJ10uaW5jbHVkZXMoc2hhcGUpKSB7XG4gICAgICAgIHZhciBwYWQgPSAoYldpZHRoICsgb3V0bGluZVdpZHRoICsgb3V0bGluZU9mZnNldCkgLyBub2RlV2lkdGg7XG4gICAgICAgIHBvaW50cyA9IGpvaW5MaW5lcyhleHBhbmRQb2x5Z29uKHBvaW50cywgcGFkKSk7XG4gICAgICAgIHIuZHJhd1BvbHlnb25QYXRoKF9wYXRoIHx8IGNvbnRleHQsIG5wb3MueCwgbnBvcy55LCBub2RlV2lkdGgsIG5vZGVIZWlnaHQsIHBvaW50cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgX3BhZCA9IChiV2lkdGggKyBvdXRsaW5lV2lkdGggKyBvdXRsaW5lT2Zmc2V0KSAvIG5vZGVXaWR0aDtcbiAgICAgICAgcG9pbnRzID0gam9pbkxpbmVzKGV4cGFuZFBvbHlnb24ocG9pbnRzLCAtX3BhZCkpO1xuICAgICAgICByLmRyYXdQb2x5Z29uUGF0aChfcGF0aCB8fCBjb250ZXh0LCBucG9zLngsIG5wb3MueSwgbm9kZVdpZHRoLCBub2RlSGVpZ2h0LCBwb2ludHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKF9wYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICB9XG4gICAgICBpZiAob3V0bGluZVN0eWxlID09PSAnZG91YmxlJykge1xuICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGJXaWR0aCAvIDM7XG4gICAgICAgIHZhciBnY28gPSBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbjtcbiAgICAgICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnZGVzdGluYXRpb24tb3V0JztcbiAgICAgICAgaWYgKHVzZVBhdGhzKSB7XG4gICAgICAgICAgY29udGV4dC5zdHJva2UoX3BhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBnY287XG4gICAgICB9XG5cbiAgICAgIC8vIHJlc2V0IGluIGNhc2Ugd2UgY2hhbmdlZCB0aGUgYm9yZGVyIHN0eWxlXG4gICAgICBpZiAoY29udGV4dC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbXSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgZHJhd092ZXJsYXkgPSBmdW5jdGlvbiBkcmF3T3ZlcmxheSgpIHtcbiAgICBpZiAoc2hvdWxkRHJhd092ZXJsYXkpIHtcbiAgICAgIHIuZHJhd05vZGVPdmVybGF5KGNvbnRleHQsIG5vZGUsIHBvcywgbm9kZVdpZHRoLCBub2RlSGVpZ2h0KTtcbiAgICB9XG4gIH07XG4gIHZhciBkcmF3VW5kZXJsYXkgPSBmdW5jdGlvbiBkcmF3VW5kZXJsYXkoKSB7XG4gICAgaWYgKHNob3VsZERyYXdPdmVybGF5KSB7XG4gICAgICByLmRyYXdOb2RlVW5kZXJsYXkoY29udGV4dCwgbm9kZSwgcG9zLCBub2RlV2lkdGgsIG5vZGVIZWlnaHQpO1xuICAgIH1cbiAgfTtcbiAgdmFyIGRyYXdUZXh0ID0gZnVuY3Rpb24gZHJhd1RleHQoKSB7XG4gICAgci5kcmF3RWxlbWVudFRleHQoY29udGV4dCwgbm9kZSwgbnVsbCwgZHJhd0xhYmVsKTtcbiAgfTtcbiAgdmFyIGdob3N0ID0gbm9kZS5wc3R5bGUoJ2dob3N0JykudmFsdWUgPT09ICd5ZXMnO1xuICBpZiAoZ2hvc3QpIHtcbiAgICB2YXIgZ3ggPSBub2RlLnBzdHlsZSgnZ2hvc3Qtb2Zmc2V0LXgnKS5wZlZhbHVlO1xuICAgIHZhciBneSA9IG5vZGUucHN0eWxlKCdnaG9zdC1vZmZzZXQteScpLnBmVmFsdWU7XG4gICAgdmFyIGdob3N0T3BhY2l0eSA9IG5vZGUucHN0eWxlKCdnaG9zdC1vcGFjaXR5JykudmFsdWU7XG4gICAgdmFyIGVmZkdob3N0T3BhY2l0eSA9IGdob3N0T3BhY2l0eSAqIGVsZU9wYWNpdHk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoZ3gsIGd5KTtcbiAgICBzZXR1cE91dGxpbmVDb2xvcigpO1xuICAgIGRyYXdPdXRsaW5lKCk7XG4gICAgc2V0dXBTaGFwZUNvbG9yKGdob3N0T3BhY2l0eSAqIGJnT3BhY2l0eSk7XG4gICAgZHJhd1NoYXBlKCk7XG4gICAgZHJhd0ltYWdlcyhlZmZHaG9zdE9wYWNpdHksIHRydWUpO1xuICAgIHNldHVwQm9yZGVyQ29sb3IoZ2hvc3RPcGFjaXR5ICogYm9yZGVyT3BhY2l0eSk7XG4gICAgZHJhd0JvcmRlcigpO1xuICAgIGRyYXdQaWUoZGFya25lc3MgIT09IDAgfHwgYm9yZGVyV2lkdGggIT09IDApO1xuICAgIGRyYXdJbWFnZXMoZWZmR2hvc3RPcGFjaXR5LCBmYWxzZSk7XG4gICAgZGFya2VuKGVmZkdob3N0T3BhY2l0eSk7XG4gICAgY29udGV4dC50cmFuc2xhdGUoLWd4LCAtZ3kpO1xuICB9XG4gIGlmICh1c2VQYXRocykge1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC1wb3MueCwgLXBvcy55KTtcbiAgfVxuICBkcmF3VW5kZXJsYXkoKTtcbiAgaWYgKHVzZVBhdGhzKSB7XG4gICAgY29udGV4dC50cmFuc2xhdGUocG9zLngsIHBvcy55KTtcbiAgfVxuICBzZXR1cE91dGxpbmVDb2xvcigpO1xuICBkcmF3T3V0bGluZSgpO1xuICBzZXR1cFNoYXBlQ29sb3IoKTtcbiAgZHJhd1NoYXBlKCk7XG4gIGRyYXdJbWFnZXMoZWxlT3BhY2l0eSwgdHJ1ZSk7XG4gIHNldHVwQm9yZGVyQ29sb3IoKTtcbiAgZHJhd0JvcmRlcigpO1xuICBkcmF3UGllKGRhcmtuZXNzICE9PSAwIHx8IGJvcmRlcldpZHRoICE9PSAwKTtcbiAgZHJhd0ltYWdlcyhlbGVPcGFjaXR5LCBmYWxzZSk7XG4gIGRhcmtlbigpO1xuICBpZiAodXNlUGF0aHMpIHtcbiAgICBjb250ZXh0LnRyYW5zbGF0ZSgtcG9zLngsIC1wb3MueSk7XG4gIH1cbiAgZHJhd1RleHQoKTtcbiAgZHJhd092ZXJsYXkoKTtcblxuICAvL1xuICAvLyBjbGVhbiB1cCBzaGlmdFxuXG4gIGlmIChzaGlmdFRvT3JpZ2luV2l0aEJiKSB7XG4gICAgY29udGV4dC50cmFuc2xhdGUoYmIueDEsIGJiLnkxKTtcbiAgfVxufTtcbnZhciBkcmF3Tm9kZU92ZXJsYXlVbmRlcmxheSA9IGZ1bmN0aW9uIGRyYXdOb2RlT3ZlcmxheVVuZGVybGF5KG92ZXJsYXlPclVuZGVybGF5KSB7XG4gIGlmICghWydvdmVybGF5JywgJ3VuZGVybGF5J10uaW5jbHVkZXMob3ZlcmxheU9yVW5kZXJsYXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0YXRlJyk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIChjb250ZXh0LCBub2RlLCBwb3MsIG5vZGVXaWR0aCwgbm9kZUhlaWdodCkge1xuICAgIHZhciByID0gdGhpcztcbiAgICBpZiAoIW5vZGUudmlzaWJsZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBwYWRkaW5nID0gbm9kZS5wc3R5bGUoXCJcIi5jb25jYXQob3ZlcmxheU9yVW5kZXJsYXksIFwiLXBhZGRpbmdcIikpLnBmVmFsdWU7XG4gICAgdmFyIG9wYWNpdHkgPSBub2RlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItb3BhY2l0eVwiKSkudmFsdWU7XG4gICAgdmFyIGNvbG9yID0gbm9kZS5wc3R5bGUoXCJcIi5jb25jYXQob3ZlcmxheU9yVW5kZXJsYXksIFwiLWNvbG9yXCIpKS52YWx1ZTtcbiAgICB2YXIgc2hhcGUgPSBub2RlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItc2hhcGVcIikpLnZhbHVlO1xuICAgIHZhciByYWRpdXMgPSBub2RlLnBzdHlsZShcIlwiLmNvbmNhdChvdmVybGF5T3JVbmRlcmxheSwgXCItY29ybmVyLXJhZGl1c1wiKSkudmFsdWU7XG4gICAgaWYgKG9wYWNpdHkgPiAwKSB7XG4gICAgICBwb3MgPSBwb3MgfHwgbm9kZS5wb3NpdGlvbigpO1xuICAgICAgaWYgKG5vZGVXaWR0aCA9PSBudWxsIHx8IG5vZGVIZWlnaHQgPT0gbnVsbCkge1xuICAgICAgICB2YXIgX3BhZGRpbmcgPSBub2RlLnBhZGRpbmcoKTtcbiAgICAgICAgbm9kZVdpZHRoID0gbm9kZS53aWR0aCgpICsgMiAqIF9wYWRkaW5nO1xuICAgICAgICBub2RlSGVpZ2h0ID0gbm9kZS5oZWlnaHQoKSArIDIgKiBfcGFkZGluZztcbiAgICAgIH1cbiAgICAgIHIuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gICAgICByLm5vZGVTaGFwZXNbc2hhcGVdLmRyYXcoY29udGV4dCwgcG9zLngsIHBvcy55LCBub2RlV2lkdGggKyBwYWRkaW5nICogMiwgbm9kZUhlaWdodCArIHBhZGRpbmcgKiAyLCByYWRpdXMpO1xuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgfVxuICB9O1xufTtcbkNScCQ1LmRyYXdOb2RlT3ZlcmxheSA9IGRyYXdOb2RlT3ZlcmxheVVuZGVybGF5KCdvdmVybGF5Jyk7XG5DUnAkNS5kcmF3Tm9kZVVuZGVybGF5ID0gZHJhd05vZGVPdmVybGF5VW5kZXJsYXkoJ3VuZGVybGF5Jyk7XG5cbi8vIGRvZXMgdGhlIG5vZGUgaGF2ZSBhdCBsZWFzdCBvbmUgcGllIHBpZWNlP1xuQ1JwJDUuaGFzUGllID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgbm9kZSA9IG5vZGVbMF07IC8vIGVuc3VyZSBlbGUgcmVmXG5cbiAgcmV0dXJuIG5vZGUuX3ByaXZhdGUuaGFzUGllO1xufTtcbkNScCQ1LmRyYXdQaWUgPSBmdW5jdGlvbiAoY29udGV4dCwgbm9kZSwgbm9kZU9wYWNpdHksIHBvcykge1xuICBub2RlID0gbm9kZVswXTsgLy8gZW5zdXJlIGVsZSByZWZcbiAgcG9zID0gcG9zIHx8IG5vZGUucG9zaXRpb24oKTtcbiAgdmFyIGN5U3R5bGUgPSBub2RlLmN5KCkuc3R5bGUoKTtcbiAgdmFyIHBpZVNpemUgPSBub2RlLnBzdHlsZSgncGllLXNpemUnKTtcbiAgdmFyIHggPSBwb3MueDtcbiAgdmFyIHkgPSBwb3MueTtcbiAgdmFyIG5vZGVXID0gbm9kZS53aWR0aCgpO1xuICB2YXIgbm9kZUggPSBub2RlLmhlaWdodCgpO1xuICB2YXIgcmFkaXVzID0gTWF0aC5taW4obm9kZVcsIG5vZGVIKSAvIDI7IC8vIG11c3QgZml0IGluIG5vZGVcbiAgdmFyIGxhc3RQZXJjZW50ID0gMDsgLy8gd2hhdCAlIHRvIGNvbnRpbnVlIGRyYXdpbmcgcGllIHNsaWNlcyBmcm9tIG9uIFswLCAxXVxuICB2YXIgdXNlUGF0aHMgPSB0aGlzLnVzZVBhdGhzKCk7XG4gIGlmICh1c2VQYXRocykge1xuICAgIHggPSAwO1xuICAgIHkgPSAwO1xuICB9XG4gIGlmIChwaWVTaXplLnVuaXRzID09PSAnJScpIHtcbiAgICByYWRpdXMgPSByYWRpdXMgKiBwaWVTaXplLnBmVmFsdWU7XG4gIH0gZWxzZSBpZiAocGllU2l6ZS5wZlZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByYWRpdXMgPSBwaWVTaXplLnBmVmFsdWUgLyAyO1xuICB9XG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IGN5U3R5bGUucGllQmFja2dyb3VuZE47IGkrKykge1xuICAgIC8vIDEuLk5cbiAgICB2YXIgc2l6ZSA9IG5vZGUucHN0eWxlKCdwaWUtJyArIGkgKyAnLWJhY2tncm91bmQtc2l6ZScpLnZhbHVlO1xuICAgIHZhciBjb2xvciA9IG5vZGUucHN0eWxlKCdwaWUtJyArIGkgKyAnLWJhY2tncm91bmQtY29sb3InKS52YWx1ZTtcbiAgICB2YXIgb3BhY2l0eSA9IG5vZGUucHN0eWxlKCdwaWUtJyArIGkgKyAnLWJhY2tncm91bmQtb3BhY2l0eScpLnZhbHVlICogbm9kZU9wYWNpdHk7XG4gICAgdmFyIHBlcmNlbnQgPSBzaXplIC8gMTAwOyAvLyBtYXAgaW50ZWdlciByYW5nZSBbMCwgMTAwXSB0byBbMCwgMV1cblxuICAgIC8vIHBlcmNlbnQgY2FuJ3QgcHVzaCBiZXlvbmQgMVxuICAgIGlmIChwZXJjZW50ICsgbGFzdFBlcmNlbnQgPiAxKSB7XG4gICAgICBwZXJjZW50ID0gMSAtIGxhc3RQZXJjZW50O1xuICAgIH1cbiAgICB2YXIgYW5nbGVTdGFydCA9IDEuNSAqIE1hdGguUEkgKyAyICogTWF0aC5QSSAqIGxhc3RQZXJjZW50OyAvLyBzdGFydCBhdCAxMiBvJ2Nsb2NrIGFuZCBnbyBjbG9ja3dpc2VcbiAgICB2YXIgYW5nbGVEZWx0YSA9IDIgKiBNYXRoLlBJICogcGVyY2VudDtcbiAgICB2YXIgYW5nbGVFbmQgPSBhbmdsZVN0YXJ0ICsgYW5nbGVEZWx0YTtcblxuICAgIC8vIGlnbm9yZSBpZlxuICAgIC8vIC0gemVybyBzaXplXG4gICAgLy8gLSB3ZSdyZSBhbHJlYWR5IGJleW9uZCB0aGUgZnVsbCBjaXJjbGVcbiAgICAvLyAtIGFkZGluZyB0aGUgY3VycmVudCBzbGljZSB3b3VsZCBnbyBiZXlvbmQgdGhlIGZ1bGwgY2lyY2xlXG4gICAgaWYgKHNpemUgPT09IDAgfHwgbGFzdFBlcmNlbnQgPj0gMSB8fCBsYXN0UGVyY2VudCArIHBlcmNlbnQgPiAxKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0Lm1vdmVUbyh4LCB5KTtcbiAgICBjb250ZXh0LmFyYyh4LCB5LCByYWRpdXMsIGFuZ2xlU3RhcnQsIGFuZ2xlRW5kKTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSwgb3BhY2l0eSk7XG4gICAgY29udGV4dC5maWxsKCk7XG4gICAgbGFzdFBlcmNlbnQgKz0gcGVyY2VudDtcbiAgfVxufTtcblxudmFyIENScCQ0ID0ge307XG52YXIgbW90aW9uQmx1ckRlbGF5ID0gMTAwO1xuXG4vLyB2YXIgaXNGaXJlZm94ID0gdHlwZW9mIEluc3RhbGxUcmlnZ2VyICE9PSAndW5kZWZpbmVkJztcblxuQ1JwJDQuZ2V0UGl4ZWxSYXRpbyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNvbnRleHQgPSB0aGlzLmRhdGEuY29udGV4dHNbMF07XG4gIGlmICh0aGlzLmZvcmNlZFBpeGVsUmF0aW8gIT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLmZvcmNlZFBpeGVsUmF0aW87XG4gIH1cbiAgdmFyIGJhY2tpbmdTdG9yZSA9IGNvbnRleHQuYmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjb250ZXh0LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY29udGV4dC5tb3pCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IGNvbnRleHQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IGNvbnRleHQub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgY29udGV4dC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IDE7XG4gIHJldHVybiAod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSkgLyBiYWNraW5nU3RvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbn07XG5cbkNScCQ0LnBhaW50Q2FjaGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICB2YXIgY2FjaGVzID0gdGhpcy5wYWludENhY2hlcyA9IHRoaXMucGFpbnRDYWNoZXMgfHwgW107XG4gIHZhciBuZWVkVG9DcmVhdGVDYWNoZSA9IHRydWU7XG4gIHZhciBjYWNoZTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjYWNoZSA9IGNhY2hlc1tpXTtcbiAgICBpZiAoY2FjaGUuY29udGV4dCA9PT0gY29udGV4dCkge1xuICAgICAgbmVlZFRvQ3JlYXRlQ2FjaGUgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAobmVlZFRvQ3JlYXRlQ2FjaGUpIHtcbiAgICBjYWNoZSA9IHtcbiAgICAgIGNvbnRleHQ6IGNvbnRleHRcbiAgICB9O1xuICAgIGNhY2hlcy5wdXNoKGNhY2hlKTtcbiAgfVxuICByZXR1cm4gY2FjaGU7XG59O1xuQ1JwJDQuY3JlYXRlR3JhZGllbnRTdHlsZUZvciA9IGZ1bmN0aW9uIChjb250ZXh0LCBzaGFwZVN0eWxlTmFtZSwgZWxlLCBmaWxsLCBvcGFjaXR5KSB7XG4gIHZhciBncmFkaWVudFN0eWxlO1xuICB2YXIgdXNlUGF0aHMgPSB0aGlzLnVzZVBhdGhzKCk7XG4gIHZhciBjb2xvcnMgPSBlbGUucHN0eWxlKHNoYXBlU3R5bGVOYW1lICsgJy1ncmFkaWVudC1zdG9wLWNvbG9ycycpLnZhbHVlLFxuICAgIHBvc2l0aW9ucyA9IGVsZS5wc3R5bGUoc2hhcGVTdHlsZU5hbWUgKyAnLWdyYWRpZW50LXN0b3AtcG9zaXRpb25zJykucGZWYWx1ZTtcbiAgaWYgKGZpbGwgPT09ICdyYWRpYWwtZ3JhZGllbnQnKSB7XG4gICAgaWYgKGVsZS5pc0VkZ2UoKSkge1xuICAgICAgdmFyIHN0YXJ0ID0gZWxlLnNvdXJjZUVuZHBvaW50KCksXG4gICAgICAgIGVuZCA9IGVsZS50YXJnZXRFbmRwb2ludCgpLFxuICAgICAgICBtaWQgPSBlbGUubWlkcG9pbnQoKTtcbiAgICAgIHZhciBkMSA9IGRpc3Qoc3RhcnQsIG1pZCk7XG4gICAgICB2YXIgZDIgPSBkaXN0KGVuZCwgbWlkKTtcbiAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZVJhZGlhbEdyYWRpZW50KG1pZC54LCBtaWQueSwgMCwgbWlkLngsIG1pZC55LCBNYXRoLm1heChkMSwgZDIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHBvcyA9IHVzZVBhdGhzID8ge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9IDogZWxlLnBvc2l0aW9uKCksXG4gICAgICAgIHdpZHRoID0gZWxlLnBhZGRlZFdpZHRoKCksXG4gICAgICAgIGhlaWdodCA9IGVsZS5wYWRkZWRIZWlnaHQoKTtcbiAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZVJhZGlhbEdyYWRpZW50KHBvcy54LCBwb3MueSwgMCwgcG9zLngsIHBvcy55LCBNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChlbGUuaXNFZGdlKCkpIHtcbiAgICAgIHZhciBfc3RhcnQgPSBlbGUuc291cmNlRW5kcG9pbnQoKSxcbiAgICAgICAgX2VuZCA9IGVsZS50YXJnZXRFbmRwb2ludCgpO1xuICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3N0YXJ0LngsIF9zdGFydC55LCBfZW5kLngsIF9lbmQueSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfcG9zID0gdXNlUGF0aHMgPyB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH0gOiBlbGUucG9zaXRpb24oKSxcbiAgICAgICAgX3dpZHRoID0gZWxlLnBhZGRlZFdpZHRoKCksXG4gICAgICAgIF9oZWlnaHQgPSBlbGUucGFkZGVkSGVpZ2h0KCksXG4gICAgICAgIGhhbGZXaWR0aCA9IF93aWR0aCAvIDIsXG4gICAgICAgIGhhbGZIZWlnaHQgPSBfaGVpZ2h0IC8gMjtcbiAgICAgIHZhciBkaXJlY3Rpb24gPSBlbGUucHN0eWxlKCdiYWNrZ3JvdW5kLWdyYWRpZW50LWRpcmVjdGlvbicpLnZhbHVlO1xuICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgICAgY2FzZSAndG8tYm90dG9tJzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLngsIF9wb3MueSAtIGhhbGZIZWlnaHQsIF9wb3MueCwgX3Bvcy55ICsgaGFsZkhlaWdodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvLXRvcCc6XG4gICAgICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3Bvcy54LCBfcG9zLnkgKyBoYWxmSGVpZ2h0LCBfcG9zLngsIF9wb3MueSAtIGhhbGZIZWlnaHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0by1sZWZ0JzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSwgX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0by1yaWdodCc6XG4gICAgICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnksIF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG8tYm90dG9tLXJpZ2h0JzpcbiAgICAgICAgY2FzZSAndG8tcmlnaHQtYm90dG9tJzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggLSBoYWxmV2lkdGgsIF9wb3MueSAtIGhhbGZIZWlnaHQsIF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55ICsgaGFsZkhlaWdodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvLXRvcC1yaWdodCc6XG4gICAgICAgIGNhc2UgJ3RvLXJpZ2h0LXRvcCc6XG4gICAgICAgICAgZ3JhZGllbnRTdHlsZSA9IGNvbnRleHQuY3JlYXRlTGluZWFyR3JhZGllbnQoX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkgKyBoYWxmSGVpZ2h0LCBfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSAtIGhhbGZIZWlnaHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0by1ib3R0b20tbGVmdCc6XG4gICAgICAgIGNhc2UgJ3RvLWxlZnQtYm90dG9tJzpcbiAgICAgICAgICBncmFkaWVudFN0eWxlID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChfcG9zLnggKyBoYWxmV2lkdGgsIF9wb3MueSAtIGhhbGZIZWlnaHQsIF9wb3MueCAtIGhhbGZXaWR0aCwgX3Bvcy55ICsgaGFsZkhlaWdodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvLXRvcC1sZWZ0JzpcbiAgICAgICAgY2FzZSAndG8tbGVmdC10b3AnOlxuICAgICAgICAgIGdyYWRpZW50U3R5bGUgPSBjb250ZXh0LmNyZWF0ZUxpbmVhckdyYWRpZW50KF9wb3MueCArIGhhbGZXaWR0aCwgX3Bvcy55ICsgaGFsZkhlaWdodCwgX3Bvcy54IC0gaGFsZldpZHRoLCBfcG9zLnkgLSBoYWxmSGVpZ2h0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCFncmFkaWVudFN0eWxlKSByZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBncmFkaWVudCBzdHlsZVxuXG4gIHZhciBoYXNQb3NpdGlvbnMgPSBwb3NpdGlvbnMubGVuZ3RoID09PSBjb2xvcnMubGVuZ3RoO1xuICB2YXIgbGVuZ3RoID0gY29sb3JzLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGdyYWRpZW50U3R5bGUuYWRkQ29sb3JTdG9wKGhhc1Bvc2l0aW9ucyA/IHBvc2l0aW9uc1tpXSA6IGkgLyAobGVuZ3RoIC0gMSksICdyZ2JhKCcgKyBjb2xvcnNbaV1bMF0gKyAnLCcgKyBjb2xvcnNbaV1bMV0gKyAnLCcgKyBjb2xvcnNbaV1bMl0gKyAnLCcgKyBvcGFjaXR5ICsgJyknKTtcbiAgfVxuICByZXR1cm4gZ3JhZGllbnRTdHlsZTtcbn07XG5DUnAkNC5ncmFkaWVudEZpbGxTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCBlbGUsIGZpbGwsIG9wYWNpdHkpIHtcbiAgdmFyIGdyYWRpZW50U3R5bGUgPSB0aGlzLmNyZWF0ZUdyYWRpZW50U3R5bGVGb3IoY29udGV4dCwgJ2JhY2tncm91bmQnLCBlbGUsIGZpbGwsIG9wYWNpdHkpO1xuICBpZiAoIWdyYWRpZW50U3R5bGUpIHJldHVybiBudWxsOyAvLyBlcnJvclxuICBjb250ZXh0LmZpbGxTdHlsZSA9IGdyYWRpZW50U3R5bGU7XG59O1xuQ1JwJDQuY29sb3JGaWxsU3R5bGUgPSBmdW5jdGlvbiAoY29udGV4dCwgciwgZywgYiwgYSkge1xuICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKCcgKyByICsgJywnICsgZyArICcsJyArIGIgKyAnLCcgKyBhICsgJyknO1xuICAvLyB0dXJuIG9mZiBmb3Igbm93LCBzZWVtcyBjb250ZXh0IGRvZXMgaXRzIG93biBjYWNoaW5nXG5cbiAgLy8gdmFyIGNhY2hlID0gdGhpcy5wYWludENhY2hlKGNvbnRleHQpO1xuXG4gIC8vIHZhciBmaWxsU3R5bGUgPSAncmdiYSgnICsgciArICcsJyArIGcgKyAnLCcgKyBiICsgJywnICsgYSArICcpJztcblxuICAvLyBpZiggY2FjaGUuZmlsbFN0eWxlICE9PSBmaWxsU3R5bGUgKXtcbiAgLy8gICBjb250ZXh0LmZpbGxTdHlsZSA9IGNhY2hlLmZpbGxTdHlsZSA9IGZpbGxTdHlsZTtcbiAgLy8gfVxufTtcblxuQ1JwJDQuZWxlRmlsbFN0eWxlID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgb3BhY2l0eSkge1xuICB2YXIgYmFja2dyb3VuZEZpbGwgPSBlbGUucHN0eWxlKCdiYWNrZ3JvdW5kLWZpbGwnKS52YWx1ZTtcbiAgaWYgKGJhY2tncm91bmRGaWxsID09PSAnbGluZWFyLWdyYWRpZW50JyB8fCBiYWNrZ3JvdW5kRmlsbCA9PT0gJ3JhZGlhbC1ncmFkaWVudCcpIHtcbiAgICB0aGlzLmdyYWRpZW50RmlsbFN0eWxlKGNvbnRleHQsIGVsZSwgYmFja2dyb3VuZEZpbGwsIG9wYWNpdHkpO1xuICB9IGVsc2Uge1xuICAgIHZhciBiYWNrZ3JvdW5kQ29sb3IgPSBlbGUucHN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJykudmFsdWU7XG4gICAgdGhpcy5jb2xvckZpbGxTdHlsZShjb250ZXh0LCBiYWNrZ3JvdW5kQ29sb3JbMF0sIGJhY2tncm91bmRDb2xvclsxXSwgYmFja2dyb3VuZENvbG9yWzJdLCBvcGFjaXR5KTtcbiAgfVxufTtcbkNScCQ0LmdyYWRpZW50U3Ryb2tlU3R5bGUgPSBmdW5jdGlvbiAoY29udGV4dCwgZWxlLCBmaWxsLCBvcGFjaXR5KSB7XG4gIHZhciBncmFkaWVudFN0eWxlID0gdGhpcy5jcmVhdGVHcmFkaWVudFN0eWxlRm9yKGNvbnRleHQsICdsaW5lJywgZWxlLCBmaWxsLCBvcGFjaXR5KTtcbiAgaWYgKCFncmFkaWVudFN0eWxlKSByZXR1cm4gbnVsbDsgLy8gZXJyb3JcbiAgY29udGV4dC5zdHJva2VTdHlsZSA9IGdyYWRpZW50U3R5bGU7XG59O1xuQ1JwJDQuY29sb3JTdHJva2VTdHlsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCByLCBnLCBiLCBhKSB7XG4gIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmdiYSgnICsgciArICcsJyArIGcgKyAnLCcgKyBiICsgJywnICsgYSArICcpJztcbiAgLy8gdHVybiBvZmYgZm9yIG5vdywgc2VlbXMgY29udGV4dCBkb2VzIGl0cyBvd24gY2FjaGluZ1xuXG4gIC8vIHZhciBjYWNoZSA9IHRoaXMucGFpbnRDYWNoZShjb250ZXh0KTtcblxuICAvLyB2YXIgc3Ryb2tlU3R5bGUgPSAncmdiYSgnICsgciArICcsJyArIGcgKyAnLCcgKyBiICsgJywnICsgYSArICcpJztcblxuICAvLyBpZiggY2FjaGUuc3Ryb2tlU3R5bGUgIT09IHN0cm9rZVN0eWxlICl7XG4gIC8vICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGNhY2hlLnN0cm9rZVN0eWxlID0gc3Ryb2tlU3R5bGU7XG4gIC8vIH1cbn07XG5cbkNScCQ0LmVsZVN0cm9rZVN0eWxlID0gZnVuY3Rpb24gKGNvbnRleHQsIGVsZSwgb3BhY2l0eSkge1xuICB2YXIgbGluZUZpbGwgPSBlbGUucHN0eWxlKCdsaW5lLWZpbGwnKS52YWx1ZTtcbiAgaWYgKGxpbmVGaWxsID09PSAnbGluZWFyLWdyYWRpZW50JyB8fCBsaW5lRmlsbCA9PT0gJ3JhZGlhbC1ncmFkaWVudCcpIHtcbiAgICB0aGlzLmdyYWRpZW50U3Ryb2tlU3R5bGUoY29udGV4dCwgZWxlLCBsaW5lRmlsbCwgb3BhY2l0eSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxpbmVDb2xvciA9IGVsZS5wc3R5bGUoJ2xpbmUtY29sb3InKS52YWx1ZTtcbiAgICB0aGlzLmNvbG9yU3Ryb2tlU3R5bGUoY29udGV4dCwgbGluZUNvbG9yWzBdLCBsaW5lQ29sb3JbMV0sIGxpbmVDb2xvclsyXSwgb3BhY2l0eSk7XG4gIH1cbn07XG5cbi8vIFJlc2l6ZSBjYW52YXNcbkNScCQ0Lm1hdGNoQ2FudmFzU2l6ZSA9IGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICB2YXIgZGF0YSA9IHIuZGF0YTtcbiAgdmFyIGJiID0gci5maW5kQ29udGFpbmVyQ2xpZW50Q29vcmRzKCk7XG4gIHZhciB3aWR0aCA9IGJiWzJdO1xuICB2YXIgaGVpZ2h0ID0gYmJbM107XG4gIHZhciBwaXhlbFJhdGlvID0gci5nZXRQaXhlbFJhdGlvKCk7XG4gIHZhciBtYlB4UmF0aW8gPSByLm1vdGlvbkJsdXJQeFJhdGlvO1xuICBpZiAoY29udGFpbmVyID09PSByLmRhdGEuYnVmZmVyQ2FudmFzZXNbci5NT1RJT05CTFVSX0JVRkZFUl9OT0RFXSB8fCBjb250YWluZXIgPT09IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLk1PVElPTkJMVVJfQlVGRkVSX0RSQUddKSB7XG4gICAgcGl4ZWxSYXRpbyA9IG1iUHhSYXRpbztcbiAgfVxuICB2YXIgY2FudmFzV2lkdGggPSB3aWR0aCAqIHBpeGVsUmF0aW87XG4gIHZhciBjYW52YXNIZWlnaHQgPSBoZWlnaHQgKiBwaXhlbFJhdGlvO1xuICB2YXIgY2FudmFzO1xuICBpZiAoY2FudmFzV2lkdGggPT09IHIuY2FudmFzV2lkdGggJiYgY2FudmFzSGVpZ2h0ID09PSByLmNhbnZhc0hlaWdodCkge1xuICAgIHJldHVybjsgLy8gc2F2ZSBjeWNsZXMgaWYgc2FtZVxuICB9XG5cbiAgci5mb250Q2FjaGVzID0gbnVsbDsgLy8gcmVzaXppbmcgcmVzZXRzIHRoZSBzdHlsZVxuXG4gIHZhciBjYW52YXNDb250YWluZXIgPSBkYXRhLmNhbnZhc0NvbnRhaW5lcjtcbiAgY2FudmFzQ29udGFpbmVyLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuICBjYW52YXNDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByLkNBTlZBU19MQVlFUlM7IGkrKykge1xuICAgIGNhbnZhcyA9IGRhdGEuY2FudmFzZXNbaV07XG4gICAgY2FudmFzLndpZHRoID0gY2FudmFzV2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGNhbnZhc0hlaWdodDtcbiAgICBjYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByLkJVRkZFUl9DT1VOVDsgaSsrKSB7XG4gICAgY2FudmFzID0gZGF0YS5idWZmZXJDYW52YXNlc1tpXTtcbiAgICBjYW52YXMud2lkdGggPSBjYW52YXNXaWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gY2FudmFzSGVpZ2h0O1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgfVxuICByLnRleHR1cmVNdWx0ID0gMTtcbiAgaWYgKHBpeGVsUmF0aW8gPD0gMSkge1xuICAgIGNhbnZhcyA9IGRhdGEuYnVmZmVyQ2FudmFzZXNbci5URVhUVVJFX0JVRkZFUl07XG4gICAgci50ZXh0dXJlTXVsdCA9IDI7XG4gICAgY2FudmFzLndpZHRoID0gY2FudmFzV2lkdGggKiByLnRleHR1cmVNdWx0O1xuICAgIGNhbnZhcy5oZWlnaHQgPSBjYW52YXNIZWlnaHQgKiByLnRleHR1cmVNdWx0O1xuICB9XG4gIHIuY2FudmFzV2lkdGggPSBjYW52YXNXaWR0aDtcbiAgci5jYW52YXNIZWlnaHQgPSBjYW52YXNIZWlnaHQ7XG59O1xuQ1JwJDQucmVuZGVyVG8gPSBmdW5jdGlvbiAoY3h0LCB6b29tLCBwYW4sIHB4UmF0aW8pIHtcbiAgdGhpcy5yZW5kZXIoe1xuICAgIGZvcmNlZENvbnRleHQ6IGN4dCxcbiAgICBmb3JjZWRab29tOiB6b29tLFxuICAgIGZvcmNlZFBhbjogcGFuLFxuICAgIGRyYXdBbGxMYXllcnM6IHRydWUsXG4gICAgZm9yY2VkUHhSYXRpbzogcHhSYXRpb1xuICB9KTtcbn07XG5DUnAkNC5yZW5kZXIgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCBzdGF0aWNFbXB0eU9iamVjdCgpO1xuICB2YXIgZm9yY2VkQ29udGV4dCA9IG9wdGlvbnMuZm9yY2VkQ29udGV4dDtcbiAgdmFyIGRyYXdBbGxMYXllcnMgPSBvcHRpb25zLmRyYXdBbGxMYXllcnM7XG4gIHZhciBkcmF3T25seU5vZGVMYXllciA9IG9wdGlvbnMuZHJhd09ubHlOb2RlTGF5ZXI7XG4gIHZhciBmb3JjZWRab29tID0gb3B0aW9ucy5mb3JjZWRab29tO1xuICB2YXIgZm9yY2VkUGFuID0gb3B0aW9ucy5mb3JjZWRQYW47XG4gIHZhciByID0gdGhpcztcbiAgdmFyIHBpeGVsUmF0aW8gPSBvcHRpb25zLmZvcmNlZFB4UmF0aW8gPT09IHVuZGVmaW5lZCA/IHRoaXMuZ2V0UGl4ZWxSYXRpbygpIDogb3B0aW9ucy5mb3JjZWRQeFJhdGlvO1xuICB2YXIgY3kgPSByLmN5O1xuICB2YXIgZGF0YSA9IHIuZGF0YTtcbiAgdmFyIG5lZWREcmF3ID0gZGF0YS5jYW52YXNOZWVkc1JlZHJhdztcbiAgdmFyIHRleHR1cmVEcmF3ID0gci50ZXh0dXJlT25WaWV3cG9ydCAmJiAhZm9yY2VkQ29udGV4dCAmJiAoci5waW5jaGluZyB8fCByLmhvdmVyRGF0YS5kcmFnZ2luZyB8fCByLnN3aXBlUGFubmluZyB8fCByLmRhdGEud2hlZWxab29taW5nKTtcbiAgdmFyIG1vdGlvbkJsdXIgPSBvcHRpb25zLm1vdGlvbkJsdXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubW90aW9uQmx1ciA6IHIubW90aW9uQmx1cjtcbiAgdmFyIG1iUHhSYXRpbyA9IHIubW90aW9uQmx1clB4UmF0aW87XG4gIHZhciBoYXNDb21wb3VuZE5vZGVzID0gY3kuaGFzQ29tcG91bmROb2RlcygpO1xuICB2YXIgaW5Ob2RlRHJhZ0dlc3R1cmUgPSByLmhvdmVyRGF0YS5kcmFnZ2luZ0VsZXM7XG4gIHZhciBpbkJveFNlbGVjdGlvbiA9IHIuaG92ZXJEYXRhLnNlbGVjdGluZyB8fCByLnRvdWNoRGF0YS5zZWxlY3RpbmcgPyB0cnVlIDogZmFsc2U7XG4gIG1vdGlvbkJsdXIgPSBtb3Rpb25CbHVyICYmICFmb3JjZWRDb250ZXh0ICYmIHIubW90aW9uQmx1ckVuYWJsZWQgJiYgIWluQm94U2VsZWN0aW9uO1xuICB2YXIgbW90aW9uQmx1ckZhZGVFZmZlY3QgPSBtb3Rpb25CbHVyO1xuICBpZiAoIWZvcmNlZENvbnRleHQpIHtcbiAgICBpZiAoci5wcmV2UHhSYXRpbyAhPT0gcGl4ZWxSYXRpbykge1xuICAgICAgci5pbnZhbGlkYXRlQ29udGFpbmVyQ2xpZW50Q29vcmRzQ2FjaGUoKTtcbiAgICAgIHIubWF0Y2hDYW52YXNTaXplKHIuY29udGFpbmVyKTtcbiAgICAgIHIucmVkcmF3SGludCgnZWxlcycsIHRydWUpO1xuICAgICAgci5yZWRyYXdIaW50KCdkcmFnJywgdHJ1ZSk7XG4gICAgfVxuICAgIHIucHJldlB4UmF0aW8gPSBwaXhlbFJhdGlvO1xuICB9XG4gIGlmICghZm9yY2VkQ29udGV4dCAmJiByLm1vdGlvbkJsdXJUaW1lb3V0KSB7XG4gICAgY2xlYXJUaW1lb3V0KHIubW90aW9uQmx1clRpbWVvdXQpO1xuICB9XG4gIGlmIChtb3Rpb25CbHVyKSB7XG4gICAgaWYgKHIubWJGcmFtZXMgPT0gbnVsbCkge1xuICAgICAgci5tYkZyYW1lcyA9IDA7XG4gICAgfVxuICAgIHIubWJGcmFtZXMrKztcbiAgICBpZiAoci5tYkZyYW1lcyA8IDMpIHtcbiAgICAgIC8vIG5lZWQgc2V2ZXJhbCBmcmFtZXMgYmVmb3JlIGV2ZW4gaGlnaCBxdWFsaXR5IG1vdGlvbmJsdXJcbiAgICAgIG1vdGlvbkJsdXJGYWRlRWZmZWN0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gZ28gdG8gbG93ZXIgcXVhbGl0eSBibHVycnkgZnJhbWVzIHdoZW4gc2V2ZXJhbCBtL2IgZnJhbWVzIGhhdmUgYmVlbiByZW5kZXJlZCAoYXZvaWRzIGZsYXNoaW5nKVxuICAgIGlmIChyLm1iRnJhbWVzID4gci5taW5NYkxvd1F1YWxGcmFtZXMpIHtcbiAgICAgIC8vci5mdWxsUXVhbGl0eU1iID0gZmFsc2U7XG4gICAgICByLm1vdGlvbkJsdXJQeFJhdGlvID0gci5tYlB4UkJsdXJyeTtcbiAgICB9XG4gIH1cbiAgaWYgKHIuY2xlYXJpbmdNb3Rpb25CbHVyKSB7XG4gICAgci5tb3Rpb25CbHVyUHhSYXRpbyA9IDE7XG4gIH1cblxuICAvLyBiL2MgZHJhd1RvQ29udGV4dCgpIG1heSBiZSBhc3luYyB3LnIudC4gcmVkcmF3KCksIGtlZXAgdHJhY2sgb2YgbGFzdCB0ZXh0dXJlIGZyYW1lXG4gIC8vIGJlY2F1c2UgYSByb2d1ZSBhc3luYyB0ZXh0dXJlIGZyYW1lIHdvdWxkIGNsZWFyIG5lZWREcmF3XG4gIGlmIChyLnRleHR1cmVEcmF3TGFzdEZyYW1lICYmICF0ZXh0dXJlRHJhdykge1xuICAgIG5lZWREcmF3W3IuTk9ERV0gPSB0cnVlO1xuICAgIG5lZWREcmF3W3IuU0VMRUNUX0JPWF0gPSB0cnVlO1xuICB9XG4gIHZhciBzdHlsZSA9IGN5LnN0eWxlKCk7XG4gIHZhciB6b29tID0gY3kuem9vbSgpO1xuICB2YXIgZWZmZWN0aXZlWm9vbSA9IGZvcmNlZFpvb20gIT09IHVuZGVmaW5lZCA/IGZvcmNlZFpvb20gOiB6b29tO1xuICB2YXIgcGFuID0gY3kucGFuKCk7XG4gIHZhciBlZmZlY3RpdmVQYW4gPSB7XG4gICAgeDogcGFuLngsXG4gICAgeTogcGFuLnlcbiAgfTtcbiAgdmFyIHZwID0ge1xuICAgIHpvb206IHpvb20sXG4gICAgcGFuOiB7XG4gICAgICB4OiBwYW4ueCxcbiAgICAgIHk6IHBhbi55XG4gICAgfVxuICB9O1xuICB2YXIgcHJldlZwID0gci5wcmV2Vmlld3BvcnQ7XG4gIHZhciB2aWV3cG9ydElzRGlmZiA9IHByZXZWcCA9PT0gdW5kZWZpbmVkIHx8IHZwLnpvb20gIT09IHByZXZWcC56b29tIHx8IHZwLnBhbi54ICE9PSBwcmV2VnAucGFuLnggfHwgdnAucGFuLnkgIT09IHByZXZWcC5wYW4ueTtcblxuICAvLyB3ZSB3YW50IHRoZSBsb3cgcXVhbGl0eSBtb3Rpb25ibHVyIG9ubHkgd2hlbiB0aGUgdmlld3BvcnQgaXMgYmVpbmcgbWFuaXB1bGF0ZWQgZXRjICh3aGVyZSBpdCdzIG5vdCBub3RpY2VkKVxuICBpZiAoIXZpZXdwb3J0SXNEaWZmICYmICEoaW5Ob2RlRHJhZ0dlc3R1cmUgJiYgIWhhc0NvbXBvdW5kTm9kZXMpKSB7XG4gICAgci5tb3Rpb25CbHVyUHhSYXRpbyA9IDE7XG4gIH1cbiAgaWYgKGZvcmNlZFBhbikge1xuICAgIGVmZmVjdGl2ZVBhbiA9IGZvcmNlZFBhbjtcbiAgfVxuXG4gIC8vIGFwcGx5IHBpeGVsIHJhdGlvXG5cbiAgZWZmZWN0aXZlWm9vbSAqPSBwaXhlbFJhdGlvO1xuICBlZmZlY3RpdmVQYW4ueCAqPSBwaXhlbFJhdGlvO1xuICBlZmZlY3RpdmVQYW4ueSAqPSBwaXhlbFJhdGlvO1xuICB2YXIgZWxlcyA9IHIuZ2V0Q2FjaGVkWlNvcnRlZEVsZXMoKTtcbiAgZnVuY3Rpb24gbWJjbGVhcihjb250ZXh0LCB4LCB5LCB3LCBoKSB7XG4gICAgdmFyIGdjbyA9IGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO1xuICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW91dCc7XG4gICAgci5jb2xvckZpbGxTdHlsZShjb250ZXh0LCAyNTUsIDI1NSwgMjU1LCByLm1vdGlvbkJsdXJUcmFuc3BhcmVuY3kpO1xuICAgIGNvbnRleHQuZmlsbFJlY3QoeCwgeSwgdywgaCk7XG4gICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBnY287XG4gIH1cbiAgZnVuY3Rpb24gc2V0Q29udGV4dFRyYW5zZm9ybShjb250ZXh0LCBjbGVhcikge1xuICAgIHZhciBlUGFuLCBlWm9vbSwgdywgaDtcbiAgICBpZiAoIXIuY2xlYXJpbmdNb3Rpb25CbHVyICYmIChjb250ZXh0ID09PSBkYXRhLmJ1ZmZlckNvbnRleHRzW3IuTU9USU9OQkxVUl9CVUZGRVJfTk9ERV0gfHwgY29udGV4dCA9PT0gZGF0YS5idWZmZXJDb250ZXh0c1tyLk1PVElPTkJMVVJfQlVGRkVSX0RSQUddKSkge1xuICAgICAgZVBhbiA9IHtcbiAgICAgICAgeDogcGFuLnggKiBtYlB4UmF0aW8sXG4gICAgICAgIHk6IHBhbi55ICogbWJQeFJhdGlvXG4gICAgICB9O1xuICAgICAgZVpvb20gPSB6b29tICogbWJQeFJhdGlvO1xuICAgICAgdyA9IHIuY2FudmFzV2lkdGggKiBtYlB4UmF0aW87XG4gICAgICBoID0gci5jYW52YXNIZWlnaHQgKiBtYlB4UmF0aW87XG4gICAgfSBlbHNlIHtcbiAgICAgIGVQYW4gPSBlZmZlY3RpdmVQYW47XG4gICAgICBlWm9vbSA9IGVmZmVjdGl2ZVpvb207XG4gICAgICB3ID0gci5jYW52YXNXaWR0aDtcbiAgICAgIGggPSByLmNhbnZhc0hlaWdodDtcbiAgICB9XG4gICAgY29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgaWYgKGNsZWFyID09PSAnbW90aW9uQmx1cicpIHtcbiAgICAgIG1iY2xlYXIoY29udGV4dCwgMCwgMCwgdywgaCk7XG4gICAgfSBlbHNlIGlmICghZm9yY2VkQ29udGV4dCAmJiAoY2xlYXIgPT09IHVuZGVmaW5lZCB8fCBjbGVhcikpIHtcbiAgICAgIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xuICAgIH1cbiAgICBpZiAoIWRyYXdBbGxMYXllcnMpIHtcbiAgICAgIGNvbnRleHQudHJhbnNsYXRlKGVQYW4ueCwgZVBhbi55KTtcbiAgICAgIGNvbnRleHQuc2NhbGUoZVpvb20sIGVab29tKTtcbiAgICB9XG4gICAgaWYgKGZvcmNlZFBhbikge1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoZm9yY2VkUGFuLngsIGZvcmNlZFBhbi55KTtcbiAgICB9XG4gICAgaWYgKGZvcmNlZFpvb20pIHtcbiAgICAgIGNvbnRleHQuc2NhbGUoZm9yY2VkWm9vbSwgZm9yY2VkWm9vbSk7XG4gICAgfVxuICB9XG4gIGlmICghdGV4dHVyZURyYXcpIHtcbiAgICByLnRleHR1cmVEcmF3TGFzdEZyYW1lID0gZmFsc2U7XG4gIH1cbiAgaWYgKHRleHR1cmVEcmF3KSB7XG4gICAgci50ZXh0dXJlRHJhd0xhc3RGcmFtZSA9IHRydWU7XG4gICAgaWYgKCFyLnRleHR1cmVDYWNoZSkge1xuICAgICAgci50ZXh0dXJlQ2FjaGUgPSB7fTtcbiAgICAgIHIudGV4dHVyZUNhY2hlLmJiID0gY3kubXV0YWJsZUVsZW1lbnRzKCkuYm91bmRpbmdCb3goKTtcbiAgICAgIHIudGV4dHVyZUNhY2hlLnRleHR1cmUgPSByLmRhdGEuYnVmZmVyQ2FudmFzZXNbci5URVhUVVJFX0JVRkZFUl07XG4gICAgICB2YXIgY3h0ID0gci5kYXRhLmJ1ZmZlckNvbnRleHRzW3IuVEVYVFVSRV9CVUZGRVJdO1xuICAgICAgY3h0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgIGN4dC5jbGVhclJlY3QoMCwgMCwgci5jYW52YXNXaWR0aCAqIHIudGV4dHVyZU11bHQsIHIuY2FudmFzSGVpZ2h0ICogci50ZXh0dXJlTXVsdCk7XG4gICAgICByLnJlbmRlcih7XG4gICAgICAgIGZvcmNlZENvbnRleHQ6IGN4dCxcbiAgICAgICAgZHJhd09ubHlOb2RlTGF5ZXI6IHRydWUsXG4gICAgICAgIGZvcmNlZFB4UmF0aW86IHBpeGVsUmF0aW8gKiByLnRleHR1cmVNdWx0XG4gICAgICB9KTtcbiAgICAgIHZhciB2cCA9IHIudGV4dHVyZUNhY2hlLnZpZXdwb3J0ID0ge1xuICAgICAgICB6b29tOiBjeS56b29tKCksXG4gICAgICAgIHBhbjogY3kucGFuKCksXG4gICAgICAgIHdpZHRoOiByLmNhbnZhc1dpZHRoLFxuICAgICAgICBoZWlnaHQ6IHIuY2FudmFzSGVpZ2h0XG4gICAgICB9O1xuICAgICAgdnAubXBhbiA9IHtcbiAgICAgICAgeDogKDAgLSB2cC5wYW4ueCkgLyB2cC56b29tLFxuICAgICAgICB5OiAoMCAtIHZwLnBhbi55KSAvIHZwLnpvb21cbiAgICAgIH07XG4gICAgfVxuICAgIG5lZWREcmF3W3IuRFJBR10gPSBmYWxzZTtcbiAgICBuZWVkRHJhd1tyLk5PREVdID0gZmFsc2U7XG4gICAgdmFyIGNvbnRleHQgPSBkYXRhLmNvbnRleHRzW3IuTk9ERV07XG4gICAgdmFyIHRleHR1cmUgPSByLnRleHR1cmVDYWNoZS50ZXh0dXJlO1xuICAgIHZhciB2cCA9IHIudGV4dHVyZUNhY2hlLnZpZXdwb3J0O1xuICAgIGNvbnRleHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgIGlmIChtb3Rpb25CbHVyKSB7XG4gICAgICBtYmNsZWFyKGNvbnRleHQsIDAsIDAsIHZwLndpZHRoLCB2cC5oZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB2cC53aWR0aCwgdnAuaGVpZ2h0KTtcbiAgICB9XG4gICAgdmFyIG91dHNpZGVCZ0NvbG9yID0gc3R5bGUuY29yZSgnb3V0c2lkZS10ZXh0dXJlLWJnLWNvbG9yJykudmFsdWU7XG4gICAgdmFyIG91dHNpZGVCZ09wYWNpdHkgPSBzdHlsZS5jb3JlKCdvdXRzaWRlLXRleHR1cmUtYmctb3BhY2l0eScpLnZhbHVlO1xuICAgIHIuY29sb3JGaWxsU3R5bGUoY29udGV4dCwgb3V0c2lkZUJnQ29sb3JbMF0sIG91dHNpZGVCZ0NvbG9yWzFdLCBvdXRzaWRlQmdDb2xvclsyXSwgb3V0c2lkZUJnT3BhY2l0eSk7XG4gICAgY29udGV4dC5maWxsUmVjdCgwLCAwLCB2cC53aWR0aCwgdnAuaGVpZ2h0KTtcbiAgICB2YXIgem9vbSA9IGN5Lnpvb20oKTtcbiAgICBzZXRDb250ZXh0VHJhbnNmb3JtKGNvbnRleHQsIGZhbHNlKTtcbiAgICBjb250ZXh0LmNsZWFyUmVjdCh2cC5tcGFuLngsIHZwLm1wYW4ueSwgdnAud2lkdGggLyB2cC56b29tIC8gcGl4ZWxSYXRpbywgdnAuaGVpZ2h0IC8gdnAuem9vbSAvIHBpeGVsUmF0aW8pO1xuICAgIGNvbnRleHQuZHJhd0ltYWdlKHRleHR1cmUsIHZwLm1wYW4ueCwgdnAubXBhbi55LCB2cC53aWR0aCAvIHZwLnpvb20gLyBwaXhlbFJhdGlvLCB2cC5oZWlnaHQgLyB2cC56b29tIC8gcGl4ZWxSYXRpbyk7XG4gIH0gZWxzZSBpZiAoci50ZXh0dXJlT25WaWV3cG9ydCAmJiAhZm9yY2VkQ29udGV4dCkge1xuICAgIC8vIGNsZWFyIHRoZSBjYWNoZSBzaW5jZSB3ZSBkb24ndCBuZWVkIGl0XG4gICAgci50ZXh0dXJlQ2FjaGUgPSBudWxsO1xuICB9XG4gIHZhciBleHRlbnQgPSBjeS5leHRlbnQoKTtcbiAgdmFyIHZwTWFuaXAgPSByLnBpbmNoaW5nIHx8IHIuaG92ZXJEYXRhLmRyYWdnaW5nIHx8IHIuc3dpcGVQYW5uaW5nIHx8IHIuZGF0YS53aGVlbFpvb21pbmcgfHwgci5ob3ZlckRhdGEuZHJhZ2dpbmdFbGVzIHx8IHIuY3kuYW5pbWF0ZWQoKTtcbiAgdmFyIGhpZGVFZGdlcyA9IHIuaGlkZUVkZ2VzT25WaWV3cG9ydCAmJiB2cE1hbmlwO1xuICB2YXIgbmVlZE1iQ2xlYXIgPSBbXTtcbiAgbmVlZE1iQ2xlYXJbci5OT0RFXSA9ICFuZWVkRHJhd1tyLk5PREVdICYmIG1vdGlvbkJsdXIgJiYgIXIuY2xlYXJlZEZvck1vdGlvbkJsdXJbci5OT0RFXSB8fCByLmNsZWFyaW5nTW90aW9uQmx1cjtcbiAgaWYgKG5lZWRNYkNsZWFyW3IuTk9ERV0pIHtcbiAgICByLmNsZWFyZWRGb3JNb3Rpb25CbHVyW3IuTk9ERV0gPSB0cnVlO1xuICB9XG4gIG5lZWRNYkNsZWFyW3IuRFJBR10gPSAhbmVlZERyYXdbci5EUkFHXSAmJiBtb3Rpb25CbHVyICYmICFyLmNsZWFyZWRGb3JNb3Rpb25CbHVyW3IuRFJBR10gfHwgci5jbGVhcmluZ01vdGlvbkJsdXI7XG4gIGlmIChuZWVkTWJDbGVhcltyLkRSQUddKSB7XG4gICAgci5jbGVhcmVkRm9yTW90aW9uQmx1cltyLkRSQUddID0gdHJ1ZTtcbiAgfVxuICBpZiAobmVlZERyYXdbci5OT0RFXSB8fCBkcmF3QWxsTGF5ZXJzIHx8IGRyYXdPbmx5Tm9kZUxheWVyIHx8IG5lZWRNYkNsZWFyW3IuTk9ERV0pIHtcbiAgICB2YXIgdXNlQnVmZmVyID0gbW90aW9uQmx1ciAmJiAhbmVlZE1iQ2xlYXJbci5OT0RFXSAmJiBtYlB4UmF0aW8gIT09IDE7XG4gICAgdmFyIGNvbnRleHQgPSBmb3JjZWRDb250ZXh0IHx8ICh1c2VCdWZmZXIgPyByLmRhdGEuYnVmZmVyQ29udGV4dHNbci5NT1RJT05CTFVSX0JVRkZFUl9OT0RFXSA6IGRhdGEuY29udGV4dHNbci5OT0RFXSk7XG4gICAgdmFyIGNsZWFyID0gbW90aW9uQmx1ciAmJiAhdXNlQnVmZmVyID8gJ21vdGlvbkJsdXInIDogdW5kZWZpbmVkO1xuICAgIHNldENvbnRleHRUcmFuc2Zvcm0oY29udGV4dCwgY2xlYXIpO1xuICAgIGlmIChoaWRlRWRnZXMpIHtcbiAgICAgIHIuZHJhd0NhY2hlZE5vZGVzKGNvbnRleHQsIGVsZXMubm9uZHJhZywgcGl4ZWxSYXRpbywgZXh0ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgci5kcmF3TGF5ZXJlZEVsZW1lbnRzKGNvbnRleHQsIGVsZXMubm9uZHJhZywgcGl4ZWxSYXRpbywgZXh0ZW50KTtcbiAgICB9XG4gICAgaWYgKHIuZGVidWcpIHtcbiAgICAgIHIuZHJhd0RlYnVnUG9pbnRzKGNvbnRleHQsIGVsZXMubm9uZHJhZyk7XG4gICAgfVxuICAgIGlmICghZHJhd0FsbExheWVycyAmJiAhbW90aW9uQmx1cikge1xuICAgICAgbmVlZERyYXdbci5OT0RFXSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoIWRyYXdPbmx5Tm9kZUxheWVyICYmIChuZWVkRHJhd1tyLkRSQUddIHx8IGRyYXdBbGxMYXllcnMgfHwgbmVlZE1iQ2xlYXJbci5EUkFHXSkpIHtcbiAgICB2YXIgdXNlQnVmZmVyID0gbW90aW9uQmx1ciAmJiAhbmVlZE1iQ2xlYXJbci5EUkFHXSAmJiBtYlB4UmF0aW8gIT09IDE7XG4gICAgdmFyIGNvbnRleHQgPSBmb3JjZWRDb250ZXh0IHx8ICh1c2VCdWZmZXIgPyByLmRhdGEuYnVmZmVyQ29udGV4dHNbci5NT1RJT05CTFVSX0JVRkZFUl9EUkFHXSA6IGRhdGEuY29udGV4dHNbci5EUkFHXSk7XG4gICAgc2V0Q29udGV4dFRyYW5zZm9ybShjb250ZXh0LCBtb3Rpb25CbHVyICYmICF1c2VCdWZmZXIgPyAnbW90aW9uQmx1cicgOiB1bmRlZmluZWQpO1xuICAgIGlmIChoaWRlRWRnZXMpIHtcbiAgICAgIHIuZHJhd0NhY2hlZE5vZGVzKGNvbnRleHQsIGVsZXMuZHJhZywgcGl4ZWxSYXRpbywgZXh0ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgci5kcmF3Q2FjaGVkRWxlbWVudHMoY29udGV4dCwgZWxlcy5kcmFnLCBwaXhlbFJhdGlvLCBleHRlbnQpO1xuICAgIH1cbiAgICBpZiAoci5kZWJ1Zykge1xuICAgICAgci5kcmF3RGVidWdQb2ludHMoY29udGV4dCwgZWxlcy5kcmFnKTtcbiAgICB9XG4gICAgaWYgKCFkcmF3QWxsTGF5ZXJzICYmICFtb3Rpb25CbHVyKSB7XG4gICAgICBuZWVkRHJhd1tyLkRSQUddID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmIChyLnNob3dGcHMgfHwgIWRyYXdPbmx5Tm9kZUxheWVyICYmIG5lZWREcmF3W3IuU0VMRUNUX0JPWF0gJiYgIWRyYXdBbGxMYXllcnMpIHtcbiAgICB2YXIgY29udGV4dCA9IGZvcmNlZENvbnRleHQgfHwgZGF0YS5jb250ZXh0c1tyLlNFTEVDVF9CT1hdO1xuICAgIHNldENvbnRleHRUcmFuc2Zvcm0oY29udGV4dCk7XG4gICAgaWYgKHIuc2VsZWN0aW9uWzRdID09IDEgJiYgKHIuaG92ZXJEYXRhLnNlbGVjdGluZyB8fCByLnRvdWNoRGF0YS5zZWxlY3RpbmcpKSB7XG4gICAgICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICAgICAgdmFyIGJvcmRlcldpZHRoID0gc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1ib3JkZXItd2lkdGgnKS52YWx1ZSAvIHpvb207XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGJvcmRlcldpZHRoO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAncmdiYSgnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1jb2xvcicpLnZhbHVlWzBdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1jb2xvcicpLnZhbHVlWzFdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1jb2xvcicpLnZhbHVlWzJdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1vcGFjaXR5JykudmFsdWUgKyAnKSc7XG4gICAgICBjb250ZXh0LmZpbGxSZWN0KHIuc2VsZWN0aW9uWzBdLCByLnNlbGVjdGlvblsxXSwgci5zZWxlY3Rpb25bMl0gLSByLnNlbGVjdGlvblswXSwgci5zZWxlY3Rpb25bM10gLSByLnNlbGVjdGlvblsxXSk7XG4gICAgICBpZiAoYm9yZGVyV2lkdGggPiAwKSB7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmdiYSgnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1ib3JkZXItY29sb3InKS52YWx1ZVswXSArICcsJyArIHN0eWxlLmNvcmUoJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJykudmFsdWVbMV0gKyAnLCcgKyBzdHlsZS5jb3JlKCdzZWxlY3Rpb24tYm94LWJvcmRlci1jb2xvcicpLnZhbHVlWzJdICsgJywnICsgc3R5bGUuY29yZSgnc2VsZWN0aW9uLWJveC1vcGFjaXR5JykudmFsdWUgKyAnKSc7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlUmVjdChyLnNlbGVjdGlvblswXSwgci5zZWxlY3Rpb25bMV0sIHIuc2VsZWN0aW9uWzJdIC0gci5zZWxlY3Rpb25bMF0sIHIuc2VsZWN0aW9uWzNdIC0gci5zZWxlY3Rpb25bMV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGF0YS5iZ0FjdGl2ZVBvc2lzdGlvbiAmJiAhci5ob3ZlckRhdGEuc2VsZWN0aW5nKSB7XG4gICAgICB2YXIgem9vbSA9IHIuY3kuem9vbSgpO1xuICAgICAgdmFyIHBvcyA9IGRhdGEuYmdBY3RpdmVQb3Npc3Rpb247XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKCcgKyBzdHlsZS5jb3JlKCdhY3RpdmUtYmctY29sb3InKS52YWx1ZVswXSArICcsJyArIHN0eWxlLmNvcmUoJ2FjdGl2ZS1iZy1jb2xvcicpLnZhbHVlWzFdICsgJywnICsgc3R5bGUuY29yZSgnYWN0aXZlLWJnLWNvbG9yJykudmFsdWVbMl0gKyAnLCcgKyBzdHlsZS5jb3JlKCdhY3RpdmUtYmctb3BhY2l0eScpLnZhbHVlICsgJyknO1xuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgIGNvbnRleHQuYXJjKHBvcy54LCBwb3MueSwgc3R5bGUuY29yZSgnYWN0aXZlLWJnLXNpemUnKS5wZlZhbHVlIC8gem9vbSwgMCwgMiAqIE1hdGguUEkpO1xuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgfVxuICAgIHZhciB0aW1lVG9SZW5kZXIgPSByLmxhc3RSZWRyYXdUaW1lO1xuICAgIGlmIChyLnNob3dGcHMgJiYgdGltZVRvUmVuZGVyKSB7XG4gICAgICB0aW1lVG9SZW5kZXIgPSBNYXRoLnJvdW5kKHRpbWVUb1JlbmRlcik7XG4gICAgICB2YXIgZnBzID0gTWF0aC5yb3VuZCgxMDAwIC8gdGltZVRvUmVuZGVyKTtcbiAgICAgIGNvbnRleHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAncmdiYSgyNTUsIDAsIDAsIDAuNzUpJztcbiAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAncmdiYSgyNTUsIDAsIDAsIDAuNzUpJztcbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gMTtcbiAgICAgIGNvbnRleHQuZmlsbFRleHQoJzEgZnJhbWUgPSAnICsgdGltZVRvUmVuZGVyICsgJyBtcyA9ICcgKyBmcHMgKyAnIGZwcycsIDAsIDIwKTtcbiAgICAgIHZhciBtYXhGcHMgPSA2MDtcbiAgICAgIGNvbnRleHQuc3Ryb2tlUmVjdCgwLCAzMCwgMjUwLCAyMCk7XG4gICAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDMwLCAyNTAgKiBNYXRoLm1pbihmcHMgLyBtYXhGcHMsIDEpLCAyMCk7XG4gICAgfVxuICAgIGlmICghZHJhd0FsbExheWVycykge1xuICAgICAgbmVlZERyYXdbci5TRUxFQ1RfQk9YXSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIG1vdGlvbmJsdXI6IGJsaXQgcmVuZGVyZWQgYmx1cnJ5IGZyYW1lc1xuICBpZiAobW90aW9uQmx1ciAmJiBtYlB4UmF0aW8gIT09IDEpIHtcbiAgICB2YXIgY3h0Tm9kZSA9IGRhdGEuY29udGV4dHNbci5OT0RFXTtcbiAgICB2YXIgdHh0Tm9kZSA9IHIuZGF0YS5idWZmZXJDYW52YXNlc1tyLk1PVElPTkJMVVJfQlVGRkVSX05PREVdO1xuICAgIHZhciBjeHREcmFnID0gZGF0YS5jb250ZXh0c1tyLkRSQUddO1xuICAgIHZhciB0eHREcmFnID0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW3IuTU9USU9OQkxVUl9CVUZGRVJfRFJBR107XG4gICAgdmFyIGRyYXdNb3Rpb25CbHVyID0gZnVuY3Rpb24gZHJhd01vdGlvbkJsdXIoY3h0LCB0eHQsIG5lZWRDbGVhcikge1xuICAgICAgY3h0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgIGlmIChuZWVkQ2xlYXIgfHwgIW1vdGlvbkJsdXJGYWRlRWZmZWN0KSB7XG4gICAgICAgIGN4dC5jbGVhclJlY3QoMCwgMCwgci5jYW52YXNXaWR0aCwgci5jYW52YXNIZWlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWJjbGVhcihjeHQsIDAsIDAsIHIuY2FudmFzV2lkdGgsIHIuY2FudmFzSGVpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHZhciBweHIgPSBtYlB4UmF0aW87XG4gICAgICBjeHQuZHJhd0ltYWdlKHR4dCxcbiAgICAgIC8vIGltZ1xuICAgICAgMCwgMCxcbiAgICAgIC8vIHN4LCBzeVxuICAgICAgci5jYW52YXNXaWR0aCAqIHB4ciwgci5jYW52YXNIZWlnaHQgKiBweHIsXG4gICAgICAvLyBzdywgc2hcbiAgICAgIDAsIDAsXG4gICAgICAvLyB4LCB5XG4gICAgICByLmNhbnZhc1dpZHRoLCByLmNhbnZhc0hlaWdodCAvLyB3LCBoXG4gICAgICApO1xuICAgIH07XG5cbiAgICBpZiAobmVlZERyYXdbci5OT0RFXSB8fCBuZWVkTWJDbGVhcltyLk5PREVdKSB7XG4gICAgICBkcmF3TW90aW9uQmx1cihjeHROb2RlLCB0eHROb2RlLCBuZWVkTWJDbGVhcltyLk5PREVdKTtcbiAgICAgIG5lZWREcmF3W3IuTk9ERV0gPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5lZWREcmF3W3IuRFJBR10gfHwgbmVlZE1iQ2xlYXJbci5EUkFHXSkge1xuICAgICAgZHJhd01vdGlvbkJsdXIoY3h0RHJhZywgdHh0RHJhZywgbmVlZE1iQ2xlYXJbci5EUkFHXSk7XG4gICAgICBuZWVkRHJhd1tyLkRSQUddID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHIucHJldlZpZXdwb3J0ID0gdnA7XG4gIGlmIChyLmNsZWFyaW5nTW90aW9uQmx1cikge1xuICAgIHIuY2xlYXJpbmdNb3Rpb25CbHVyID0gZmFsc2U7XG4gICAgci5tb3Rpb25CbHVyQ2xlYXJlZCA9IHRydWU7XG4gICAgci5tb3Rpb25CbHVyID0gdHJ1ZTtcbiAgfVxuICBpZiAobW90aW9uQmx1cikge1xuICAgIHIubW90aW9uQmx1clRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHIubW90aW9uQmx1clRpbWVvdXQgPSBudWxsO1xuICAgICAgci5jbGVhcmVkRm9yTW90aW9uQmx1cltyLk5PREVdID0gZmFsc2U7XG4gICAgICByLmNsZWFyZWRGb3JNb3Rpb25CbHVyW3IuRFJBR10gPSBmYWxzZTtcbiAgICAgIHIubW90aW9uQmx1ciA9IGZhbHNlO1xuICAgICAgci5jbGVhcmluZ01vdGlvbkJsdXIgPSAhdGV4dHVyZURyYXc7XG4gICAgICByLm1iRnJhbWVzID0gMDtcbiAgICAgIG5lZWREcmF3W3IuTk9ERV0gPSB0cnVlO1xuICAgICAgbmVlZERyYXdbci5EUkFHXSA9IHRydWU7XG4gICAgICByLnJlZHJhdygpO1xuICAgIH0sIG1vdGlvbkJsdXJEZWxheSk7XG4gIH1cbiAgaWYgKCFmb3JjZWRDb250ZXh0KSB7XG4gICAgY3kuZW1pdCgncmVuZGVyJyk7XG4gIH1cbn07XG5cbnZhciBDUnAkMyA9IHt9O1xuXG4vLyBATyBQb2x5Z29uIGRyYXdpbmdcbkNScCQzLmRyYXdQb2x5Z29uUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMpIHtcbiAgdmFyIGhhbGZXID0gd2lkdGggLyAyO1xuICB2YXIgaGFsZkggPSBoZWlnaHQgLyAyO1xuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9XG4gIGNvbnRleHQubW92ZVRvKHggKyBoYWxmVyAqIHBvaW50c1swXSwgeSArIGhhbGZIICogcG9pbnRzWzFdKTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBwb2ludHMubGVuZ3RoIC8gMjsgaSsrKSB7XG4gICAgY29udGV4dC5saW5lVG8oeCArIGhhbGZXICogcG9pbnRzW2kgKiAyXSwgeSArIGhhbGZIICogcG9pbnRzW2kgKiAyICsgMV0pO1xuICB9XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG59O1xuQ1JwJDMuZHJhd1JvdW5kUG9seWdvblBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzLCBjb3JuZXJzKSB7XG4gIGNvcm5lcnMuZm9yRWFjaChmdW5jdGlvbiAoY29ybmVyKSB7XG4gICAgcmV0dXJuIGRyYXdQcmVwYXJlZFJvdW5kQ29ybmVyKGNvbnRleHQsIGNvcm5lcik7XG4gIH0pO1xuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcblxuLy8gUm91bmQgcmVjdGFuZ2xlIGRyYXdpbmdcbkNScCQzLmRyYXdSb3VuZFJlY3RhbmdsZVBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzKSB7XG4gIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgdmFyIGNvcm5lclJhZGl1cyA9IHJhZGl1cyA9PT0gJ2F1dG8nID8gZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCkgOiBNYXRoLm1pbihyYWRpdXMsIGhhbGZIZWlnaHQsIGhhbGZXaWR0aCk7XG4gIGlmIChjb250ZXh0LmJlZ2luUGF0aCkge1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIH1cblxuICAvLyBTdGFydCBhdCB0b3AgbWlkZGxlXG4gIGNvbnRleHQubW92ZVRvKHgsIHkgLSBoYWxmSGVpZ2h0KTtcbiAgLy8gQXJjIGZyb20gbWlkZGxlIHRvcCB0byByaWdodCBzaWRlXG4gIGNvbnRleHQuYXJjVG8oeCArIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQsIHggKyBoYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyk7XG4gIC8vIEFyYyBmcm9tIHJpZ2h0IHNpZGUgdG8gYm90dG9tXG4gIGNvbnRleHQuYXJjVG8oeCArIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQsIHgsIHkgKyBoYWxmSGVpZ2h0LCBjb3JuZXJSYWRpdXMpO1xuICAvLyBBcmMgZnJvbSBib3R0b20gdG8gbGVmdCBzaWRlXG4gIGNvbnRleHQuYXJjVG8oeCAtIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQsIHggLSBoYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyk7XG4gIC8vIEFyYyBmcm9tIGxlZnQgc2lkZSB0byB0b3BCb3JkZXJcbiAgY29udGV4dC5hcmNUbyh4IC0gaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCwgeCwgeSAtIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyk7XG4gIC8vIEpvaW4gbGluZVxuICBjb250ZXh0LmxpbmVUbyh4LCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG59O1xuQ1JwJDMuZHJhd0JvdHRvbVJvdW5kUmVjdGFuZ2xlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpIHtcbiAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICB2YXIgY29ybmVyUmFkaXVzID0gcmFkaXVzID09PSAnYXV0bycgPyBnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KSA6IHJhZGl1cztcbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuXG4gIC8vIFN0YXJ0IGF0IHRvcCBtaWRkbGVcbiAgY29udGV4dC5tb3ZlVG8oeCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQubGluZVRvKHggKyBoYWxmV2lkdGgsIHkpO1xuICBjb250ZXh0LmFyY1RvKHggKyBoYWxmV2lkdGgsIHkgKyBoYWxmSGVpZ2h0LCB4LCB5ICsgaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzKTtcbiAgY29udGV4dC5hcmNUbyh4IC0gaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCAtIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzKTtcbiAgY29udGV4dC5saW5lVG8oeCAtIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4LCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQuY2xvc2VQYXRoKCk7XG59O1xuQ1JwJDMuZHJhd0N1dFJlY3RhbmdsZVBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzLCBjb3JuZXJzKSB7XG4gIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgdmFyIGNvcm5lckxlbmd0aCA9IGNvcm5lcnMgPT09ICdhdXRvJyA/IGdldEN1dFJlY3RhbmdsZUNvcm5lckxlbmd0aCgpIDogY29ybmVycztcbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuICBjb250ZXh0Lm1vdmVUbyh4IC0gaGFsZldpZHRoICsgY29ybmVyTGVuZ3RoLCB5IC0gaGFsZkhlaWdodCk7XG4gIGNvbnRleHQubGluZVRvKHggKyBoYWxmV2lkdGggLSBjb3JuZXJMZW5ndGgsIHkgLSBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCArIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJMZW5ndGgpO1xuICBjb250ZXh0LmxpbmVUbyh4ICsgaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCAtIGNvcm5lckxlbmd0aCk7XG4gIGNvbnRleHQubGluZVRvKHggKyBoYWxmV2lkdGggLSBjb3JuZXJMZW5ndGgsIHkgKyBoYWxmSGVpZ2h0KTtcbiAgY29udGV4dC5saW5lVG8oeCAtIGhhbGZXaWR0aCArIGNvcm5lckxlbmd0aCwgeSArIGhhbGZIZWlnaHQpO1xuICBjb250ZXh0LmxpbmVUbyh4IC0gaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCAtIGNvcm5lckxlbmd0aCk7XG4gIGNvbnRleHQubGluZVRvKHggLSBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyTGVuZ3RoKTtcbiAgY29udGV4dC5jbG9zZVBhdGgoKTtcbn07XG5DUnAkMy5kcmF3QmFycmVsUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgdmFyIHhCZWdpbiA9IHggLSBoYWxmV2lkdGg7XG4gIHZhciB4RW5kID0geCArIGhhbGZXaWR0aDtcbiAgdmFyIHlCZWdpbiA9IHkgLSBoYWxmSGVpZ2h0O1xuICB2YXIgeUVuZCA9IHkgKyBoYWxmSGVpZ2h0O1xuICB2YXIgYmFycmVsQ3VydmVDb25zdGFudHMgPSBnZXRCYXJyZWxDdXJ2ZUNvbnN0YW50cyh3aWR0aCwgaGVpZ2h0KTtcbiAgdmFyIHdPZmZzZXQgPSBiYXJyZWxDdXJ2ZUNvbnN0YW50cy53aWR0aE9mZnNldDtcbiAgdmFyIGhPZmZzZXQgPSBiYXJyZWxDdXJ2ZUNvbnN0YW50cy5oZWlnaHRPZmZzZXQ7XG4gIHZhciBjdHJsUHRYT2Zmc2V0ID0gYmFycmVsQ3VydmVDb25zdGFudHMuY3RybFB0T2Zmc2V0UGN0ICogd09mZnNldDtcbiAgaWYgKGNvbnRleHQuYmVnaW5QYXRoKSB7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgfVxuICBjb250ZXh0Lm1vdmVUbyh4QmVnaW4sIHlCZWdpbiArIGhPZmZzZXQpO1xuICBjb250ZXh0LmxpbmVUbyh4QmVnaW4sIHlFbmQgLSBoT2Zmc2V0KTtcbiAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKHhCZWdpbiArIGN0cmxQdFhPZmZzZXQsIHlFbmQsIHhCZWdpbiArIHdPZmZzZXQsIHlFbmQpO1xuICBjb250ZXh0LmxpbmVUbyh4RW5kIC0gd09mZnNldCwgeUVuZCk7XG4gIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbyh4RW5kIC0gY3RybFB0WE9mZnNldCwgeUVuZCwgeEVuZCwgeUVuZCAtIGhPZmZzZXQpO1xuICBjb250ZXh0LmxpbmVUbyh4RW5kLCB5QmVnaW4gKyBoT2Zmc2V0KTtcbiAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKHhFbmQgLSBjdHJsUHRYT2Zmc2V0LCB5QmVnaW4sIHhFbmQgLSB3T2Zmc2V0LCB5QmVnaW4pO1xuICBjb250ZXh0LmxpbmVUbyh4QmVnaW4gKyB3T2Zmc2V0LCB5QmVnaW4pO1xuICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oeEJlZ2luICsgY3RybFB0WE9mZnNldCwgeUJlZ2luLCB4QmVnaW4sIHlCZWdpbiArIGhPZmZzZXQpO1xuICBjb250ZXh0LmNsb3NlUGF0aCgpO1xufTtcbnZhciBzaW4wID0gTWF0aC5zaW4oMCk7XG52YXIgY29zMCA9IE1hdGguY29zKDApO1xudmFyIHNpbiA9IHt9O1xudmFyIGNvcyA9IHt9O1xudmFyIGVsbGlwc2VTdGVwU2l6ZSA9IE1hdGguUEkgLyA0MDtcbmZvciAodmFyIGkgPSAwICogTWF0aC5QSTsgaSA8IDIgKiBNYXRoLlBJOyBpICs9IGVsbGlwc2VTdGVwU2l6ZSkge1xuICBzaW5baV0gPSBNYXRoLnNpbihpKTtcbiAgY29zW2ldID0gTWF0aC5jb3MoaSk7XG59XG5DUnAkMy5kcmF3RWxsaXBzZVBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCkge1xuICBpZiAoY29udGV4dC5iZWdpblBhdGgpIHtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICB9XG4gIGlmIChjb250ZXh0LmVsbGlwc2UpIHtcbiAgICBjb250ZXh0LmVsbGlwc2UoY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLyAyLCBoZWlnaHQgLyAyLCAwLCAwLCAyICogTWF0aC5QSSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHhQb3MsIHlQb3M7XG4gICAgdmFyIHJ3ID0gd2lkdGggLyAyO1xuICAgIHZhciByaCA9IGhlaWdodCAvIDI7XG4gICAgZm9yICh2YXIgaSA9IDAgKiBNYXRoLlBJOyBpIDwgMiAqIE1hdGguUEk7IGkgKz0gZWxsaXBzZVN0ZXBTaXplKSB7XG4gICAgICB4UG9zID0gY2VudGVyWCAtIHJ3ICogc2luW2ldICogc2luMCArIHJ3ICogY29zW2ldICogY29zMDtcbiAgICAgIHlQb3MgPSBjZW50ZXJZICsgcmggKiBjb3NbaV0gKiBzaW4wICsgcmggKiBzaW5baV0gKiBjb3MwO1xuICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgY29udGV4dC5tb3ZlVG8oeFBvcywgeVBvcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0LmxpbmVUbyh4UG9zLCB5UG9zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29udGV4dC5jbG9zZVBhdGgoKTtcbn07XG5cbi8qIGdsb2JhbCBhdG9iLCBBcnJheUJ1ZmZlciwgVWludDhBcnJheSwgQmxvYiAqL1xudmFyIENScCQyID0ge307XG5DUnAkMi5jcmVhdGVCdWZmZXIgPSBmdW5jdGlvbiAodywgaCkge1xuICB2YXIgYnVmZmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgYnVmZmVyLndpZHRoID0gdztcbiAgYnVmZmVyLmhlaWdodCA9IGg7XG4gIHJldHVybiBbYnVmZmVyLCBidWZmZXIuZ2V0Q29udGV4dCgnMmQnKV07XG59O1xuQ1JwJDIuYnVmZmVyQ2FudmFzSW1hZ2UgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB2YXIgY3kgPSB0aGlzLmN5O1xuICB2YXIgZWxlcyA9IGN5Lm11dGFibGVFbGVtZW50cygpO1xuICB2YXIgYmIgPSBlbGVzLmJvdW5kaW5nQm94KCk7XG4gIHZhciBjdHJSZWN0ID0gdGhpcy5maW5kQ29udGFpbmVyQ2xpZW50Q29vcmRzKCk7XG4gIHZhciB3aWR0aCA9IG9wdGlvbnMuZnVsbCA/IE1hdGguY2VpbChiYi53KSA6IGN0clJlY3RbMl07XG4gIHZhciBoZWlnaHQgPSBvcHRpb25zLmZ1bGwgPyBNYXRoLmNlaWwoYmIuaCkgOiBjdHJSZWN0WzNdO1xuICB2YXIgc3BlY2RNYXhEaW1zID0gbnVtYmVyJDEob3B0aW9ucy5tYXhXaWR0aCkgfHwgbnVtYmVyJDEob3B0aW9ucy5tYXhIZWlnaHQpO1xuICB2YXIgcHhSYXRpbyA9IHRoaXMuZ2V0UGl4ZWxSYXRpbygpO1xuICB2YXIgc2NhbGUgPSAxO1xuICBpZiAob3B0aW9ucy5zY2FsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgd2lkdGggKj0gb3B0aW9ucy5zY2FsZTtcbiAgICBoZWlnaHQgKj0gb3B0aW9ucy5zY2FsZTtcbiAgICBzY2FsZSA9IG9wdGlvbnMuc2NhbGU7XG4gIH0gZWxzZSBpZiAoc3BlY2RNYXhEaW1zKSB7XG4gICAgdmFyIG1heFNjYWxlVyA9IEluZmluaXR5O1xuICAgIHZhciBtYXhTY2FsZUggPSBJbmZpbml0eTtcbiAgICBpZiAobnVtYmVyJDEob3B0aW9ucy5tYXhXaWR0aCkpIHtcbiAgICAgIG1heFNjYWxlVyA9IHNjYWxlICogb3B0aW9ucy5tYXhXaWR0aCAvIHdpZHRoO1xuICAgIH1cbiAgICBpZiAobnVtYmVyJDEob3B0aW9ucy5tYXhIZWlnaHQpKSB7XG4gICAgICBtYXhTY2FsZUggPSBzY2FsZSAqIG9wdGlvbnMubWF4SGVpZ2h0IC8gaGVpZ2h0O1xuICAgIH1cbiAgICBzY2FsZSA9IE1hdGgubWluKG1heFNjYWxlVywgbWF4U2NhbGVIKTtcbiAgICB3aWR0aCAqPSBzY2FsZTtcbiAgICBoZWlnaHQgKj0gc2NhbGU7XG4gIH1cbiAgaWYgKCFzcGVjZE1heERpbXMpIHtcbiAgICB3aWR0aCAqPSBweFJhdGlvO1xuICAgIGhlaWdodCAqPSBweFJhdGlvO1xuICAgIHNjYWxlICo9IHB4UmF0aW87XG4gIH1cbiAgdmFyIGJ1ZmZDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gIGJ1ZmZDYW52YXMud2lkdGggPSB3aWR0aDtcbiAgYnVmZkNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIGJ1ZmZDYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gIGJ1ZmZDYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgdmFyIGJ1ZmZDeHQgPSBidWZmQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgLy8gUmFzdGVyaXplIHRoZSBsYXllcnMsIGJ1dCBvbmx5IGlmIGNvbnRhaW5lciBoYXMgbm9uemVybyBzaXplXG4gIGlmICh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkge1xuICAgIGJ1ZmZDeHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGJ1ZmZDeHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJztcbiAgICB2YXIgenNvcnRlZEVsZXMgPSB0aGlzLmdldENhY2hlZFpTb3J0ZWRFbGVzKCk7XG4gICAgaWYgKG9wdGlvbnMuZnVsbCkge1xuICAgICAgLy8gZHJhdyB0aGUgZnVsbCBib3VuZHMgb2YgdGhlIGdyYXBoXG4gICAgICBidWZmQ3h0LnRyYW5zbGF0ZSgtYmIueDEgKiBzY2FsZSwgLWJiLnkxICogc2NhbGUpO1xuICAgICAgYnVmZkN4dC5zY2FsZShzY2FsZSwgc2NhbGUpO1xuICAgICAgdGhpcy5kcmF3RWxlbWVudHMoYnVmZkN4dCwgenNvcnRlZEVsZXMpO1xuICAgICAgYnVmZkN4dC5zY2FsZSgxIC8gc2NhbGUsIDEgLyBzY2FsZSk7XG4gICAgICBidWZmQ3h0LnRyYW5zbGF0ZShiYi54MSAqIHNjYWxlLCBiYi55MSAqIHNjYWxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZHJhdyB0aGUgY3VycmVudCB2aWV3XG4gICAgICB2YXIgcGFuID0gY3kucGFuKCk7XG4gICAgICB2YXIgdHJhbnNsYXRpb24gPSB7XG4gICAgICAgIHg6IHBhbi54ICogc2NhbGUsXG4gICAgICAgIHk6IHBhbi55ICogc2NhbGVcbiAgICAgIH07XG4gICAgICBzY2FsZSAqPSBjeS56b29tKCk7XG4gICAgICBidWZmQ3h0LnRyYW5zbGF0ZSh0cmFuc2xhdGlvbi54LCB0cmFuc2xhdGlvbi55KTtcbiAgICAgIGJ1ZmZDeHQuc2NhbGUoc2NhbGUsIHNjYWxlKTtcbiAgICAgIHRoaXMuZHJhd0VsZW1lbnRzKGJ1ZmZDeHQsIHpzb3J0ZWRFbGVzKTtcbiAgICAgIGJ1ZmZDeHQuc2NhbGUoMSAvIHNjYWxlLCAxIC8gc2NhbGUpO1xuICAgICAgYnVmZkN4dC50cmFuc2xhdGUoLXRyYW5zbGF0aW9uLngsIC10cmFuc2xhdGlvbi55KTtcbiAgICB9XG5cbiAgICAvLyBuZWVkIHRvIGZpbGwgYmcgYXQgZW5kIGxpa2UgdGhpcyBpbiBvcmRlciB0byBmaWxsIGNsZWFyZWQgdHJhbnNwYXJlbnQgcGl4ZWxzIGluIGpwZ3NcbiAgICBpZiAob3B0aW9ucy5iZykge1xuICAgICAgYnVmZkN4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnZGVzdGluYXRpb24tb3Zlcic7XG4gICAgICBidWZmQ3h0LmZpbGxTdHlsZSA9IG9wdGlvbnMuYmc7XG4gICAgICBidWZmQ3h0LnJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBidWZmQ3h0LmZpbGwoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJ1ZmZDYW52YXM7XG59O1xuZnVuY3Rpb24gYjY0VG9CbG9iKGI2NCwgbWltZVR5cGUpIHtcbiAgdmFyIGJ5dGVzID0gYXRvYihiNjQpO1xuICB2YXIgYnVmZiA9IG5ldyBBcnJheUJ1ZmZlcihieXRlcy5sZW5ndGgpO1xuICB2YXIgYnVmZlVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBidWZmVWludDhbaV0gPSBieXRlcy5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBuZXcgQmxvYihbYnVmZl0sIHtcbiAgICB0eXBlOiBtaW1lVHlwZVxuICB9KTtcbn1cbmZ1bmN0aW9uIGI2NFVyaVRvQjY0KGI2NHVyaSkge1xuICB2YXIgaSA9IGI2NHVyaS5pbmRleE9mKCcsJyk7XG4gIHJldHVybiBiNjR1cmkuc3Vic3RyKGkgKyAxKTtcbn1cbmZ1bmN0aW9uIG91dHB1dChvcHRpb25zLCBjYW52YXMsIG1pbWVUeXBlKSB7XG4gIHZhciBnZXRCNjRVcmkgPSBmdW5jdGlvbiBnZXRCNjRVcmkoKSB7XG4gICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwobWltZVR5cGUsIG9wdGlvbnMucXVhbGl0eSk7XG4gIH07XG4gIHN3aXRjaCAob3B0aW9ucy5vdXRwdXQpIHtcbiAgICBjYXNlICdibG9iLXByb21pc2UnOlxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbnZhcy50b0Jsb2IoZnVuY3Rpb24gKGJsb2IpIHtcbiAgICAgICAgICAgIGlmIChibG9iICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShibG9iKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ2BjYW52YXMudG9CbG9iKClgIHNlbnQgYSBudWxsIHZhbHVlIGluIGl0cyBjYWxsYmFjaycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBtaW1lVHlwZSwgb3B0aW9ucy5xdWFsaXR5KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIGNhc2UgJ2Jsb2InOlxuICAgICAgcmV0dXJuIGI2NFRvQmxvYihiNjRVcmlUb0I2NChnZXRCNjRVcmkoKSksIG1pbWVUeXBlKTtcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgcmV0dXJuIGI2NFVyaVRvQjY0KGdldEI2NFVyaSgpKTtcbiAgICBjYXNlICdiYXNlNjR1cmknOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZ2V0QjY0VXJpKCk7XG4gIH1cbn1cbkNScCQyLnBuZyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHJldHVybiBvdXRwdXQob3B0aW9ucywgdGhpcy5idWZmZXJDYW52YXNJbWFnZShvcHRpb25zKSwgJ2ltYWdlL3BuZycpO1xufTtcbkNScCQyLmpwZyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHJldHVybiBvdXRwdXQob3B0aW9ucywgdGhpcy5idWZmZXJDYW52YXNJbWFnZShvcHRpb25zKSwgJ2ltYWdlL2pwZWcnKTtcbn07XG5cbnZhciBDUnAkMSA9IHt9O1xuQ1JwJDEubm9kZVNoYXBlSW1wbCA9IGZ1bmN0aW9uIChuYW1lLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMsIGNvcm5lcnMpIHtcbiAgc3dpdGNoIChuYW1lKSB7XG4gICAgY2FzZSAnZWxsaXBzZSc6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3RWxsaXBzZVBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgY2FzZSAncG9seWdvbic6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3UG9seWdvblBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzKTtcbiAgICBjYXNlICdyb3VuZC1wb2x5Z29uJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdSb3VuZFBvbHlnb25QYXRoKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBvaW50cywgY29ybmVycyk7XG4gICAgY2FzZSAncm91bmRyZWN0YW5nbGUnOlxuICAgIGNhc2UgJ3JvdW5kLXJlY3RhbmdsZSc6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3Um91bmRSZWN0YW5nbGVQYXRoKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIGNvcm5lcnMpO1xuICAgIGNhc2UgJ2N1dHJlY3RhbmdsZSc6XG4gICAgY2FzZSAnY3V0LXJlY3RhbmdsZSc6XG4gICAgICByZXR1cm4gdGhpcy5kcmF3Q3V0UmVjdGFuZ2xlUGF0aChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMsIGNvcm5lcnMpO1xuICAgIGNhc2UgJ2JvdHRvbXJvdW5kcmVjdGFuZ2xlJzpcbiAgICBjYXNlICdib3R0b20tcm91bmQtcmVjdGFuZ2xlJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdCb3R0b21Sb3VuZFJlY3RhbmdsZVBhdGgoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgY29ybmVycyk7XG4gICAgY2FzZSAnYmFycmVsJzpcbiAgICAgIHJldHVybiB0aGlzLmRyYXdCYXJyZWxQYXRoKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQpO1xuICB9XG59O1xuXG52YXIgQ1IgPSBDYW52YXNSZW5kZXJlcjtcbnZhciBDUnAgPSBDYW52YXNSZW5kZXJlci5wcm90b3R5cGU7XG5DUnAuQ0FOVkFTX0xBWUVSUyA9IDM7XG4vL1xuQ1JwLlNFTEVDVF9CT1ggPSAwO1xuQ1JwLkRSQUcgPSAxO1xuQ1JwLk5PREUgPSAyO1xuQ1JwLkJVRkZFUl9DT1VOVCA9IDM7XG4vL1xuQ1JwLlRFWFRVUkVfQlVGRkVSID0gMDtcbkNScC5NT1RJT05CTFVSX0JVRkZFUl9OT0RFID0gMTtcbkNScC5NT1RJT05CTFVSX0JVRkZFUl9EUkFHID0gMjtcbmZ1bmN0aW9uIENhbnZhc1JlbmRlcmVyKG9wdGlvbnMpIHtcbiAgdmFyIHIgPSB0aGlzO1xuICByLmRhdGEgPSB7XG4gICAgY2FudmFzZXM6IG5ldyBBcnJheShDUnAuQ0FOVkFTX0xBWUVSUyksXG4gICAgY29udGV4dHM6IG5ldyBBcnJheShDUnAuQ0FOVkFTX0xBWUVSUyksXG4gICAgY2FudmFzTmVlZHNSZWRyYXc6IG5ldyBBcnJheShDUnAuQ0FOVkFTX0xBWUVSUyksXG4gICAgYnVmZmVyQ2FudmFzZXM6IG5ldyBBcnJheShDUnAuQlVGRkVSX0NPVU5UKSxcbiAgICBidWZmZXJDb250ZXh0czogbmV3IEFycmF5KENScC5DQU5WQVNfTEFZRVJTKVxuICB9O1xuICB2YXIgdGFwSGxPZmZBdHRyID0gJy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcic7XG4gIHZhciB0YXBIbE9mZlN0eWxlID0gJ3JnYmEoMCwwLDAsMCknO1xuICByLmRhdGEuY2FudmFzQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgdmFyIGNvbnRhaW5lclN0eWxlID0gci5kYXRhLmNhbnZhc0NvbnRhaW5lci5zdHlsZTtcbiAgci5kYXRhLmNhbnZhc0NvbnRhaW5lci5zdHlsZVt0YXBIbE9mZkF0dHJdID0gdGFwSGxPZmZTdHlsZTtcbiAgY29udGFpbmVyU3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICBjb250YWluZXJTdHlsZS56SW5kZXggPSAnMCc7XG4gIGNvbnRhaW5lclN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gIHZhciBjb250YWluZXIgPSBvcHRpb25zLmN5LmNvbnRhaW5lcigpO1xuICBjb250YWluZXIuYXBwZW5kQ2hpbGQoci5kYXRhLmNhbnZhc0NvbnRhaW5lcik7XG4gIGNvbnRhaW5lci5zdHlsZVt0YXBIbE9mZkF0dHJdID0gdGFwSGxPZmZTdHlsZTtcbiAgdmFyIHN0eWxlTWFwID0ge1xuICAgICctd2Via2l0LXVzZXItc2VsZWN0JzogJ25vbmUnLFxuICAgICctbW96LXVzZXItc2VsZWN0JzogJy1tb3otbm9uZScsXG4gICAgJ3VzZXItc2VsZWN0JzogJ25vbmUnLFxuICAgICctd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3InOiAncmdiYSgwLDAsMCwwKScsXG4gICAgJ291dGxpbmUtc3R5bGUnOiAnbm9uZSdcbiAgfTtcbiAgaWYgKG1zKCkpIHtcbiAgICBzdHlsZU1hcFsnLW1zLXRvdWNoLWFjdGlvbiddID0gJ25vbmUnO1xuICAgIHN0eWxlTWFwWyd0b3VjaC1hY3Rpb24nXSA9ICdub25lJztcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IENScC5DQU5WQVNfTEFZRVJTOyBpKyspIHtcbiAgICB2YXIgY2FudmFzID0gci5kYXRhLmNhbnZhc2VzW2ldID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICByLmRhdGEuY29udGV4dHNbaV0gPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBPYmplY3Qua2V5cyhzdHlsZU1hcCkuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgY2FudmFzLnN0eWxlW2tdID0gc3R5bGVNYXBba107XG4gICAgfSk7XG4gICAgY2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBjYW52YXMuc2V0QXR0cmlidXRlKCdkYXRhLWlkJywgJ2xheWVyJyArIGkpO1xuICAgIGNhbnZhcy5zdHlsZS56SW5kZXggPSBTdHJpbmcoQ1JwLkNBTlZBU19MQVlFUlMgLSBpKTtcbiAgICByLmRhdGEuY2FudmFzQ29udGFpbmVyLmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgci5kYXRhLmNhbnZhc05lZWRzUmVkcmF3W2ldID0gZmFsc2U7XG4gIH1cbiAgci5kYXRhLnRvcENhbnZhcyA9IHIuZGF0YS5jYW52YXNlc1swXTtcbiAgci5kYXRhLmNhbnZhc2VzW0NScC5OT0RFXS5zZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnLCAnbGF5ZXInICsgQ1JwLk5PREUgKyAnLW5vZGUnKTtcbiAgci5kYXRhLmNhbnZhc2VzW0NScC5TRUxFQ1RfQk9YXS5zZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnLCAnbGF5ZXInICsgQ1JwLlNFTEVDVF9CT1ggKyAnLXNlbGVjdGJveCcpO1xuICByLmRhdGEuY2FudmFzZXNbQ1JwLkRSQUddLnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsICdsYXllcicgKyBDUnAuRFJBRyArICctZHJhZycpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IENScC5CVUZGRVJfQ09VTlQ7IGkrKykge1xuICAgIHIuZGF0YS5idWZmZXJDYW52YXNlc1tpXSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgci5kYXRhLmJ1ZmZlckNvbnRleHRzW2ldID0gci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldLmdldENvbnRleHQoJzJkJyk7XG4gICAgci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICByLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0uc2V0QXR0cmlidXRlKCdkYXRhLWlkJywgJ2J1ZmZlcicgKyBpKTtcbiAgICByLmRhdGEuYnVmZmVyQ2FudmFzZXNbaV0uc3R5bGUuekluZGV4ID0gU3RyaW5nKC1pIC0gMSk7XG4gICAgci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAvL3IuZGF0YS5jYW52YXNDb250YWluZXIuYXBwZW5kQ2hpbGQoci5kYXRhLmJ1ZmZlckNhbnZhc2VzW2ldKTtcbiAgfVxuXG4gIHIucGF0aHNFbmFibGVkID0gdHJ1ZTtcbiAgdmFyIGVtcHR5QmIgPSBtYWtlQm91bmRpbmdCb3goKTtcbiAgdmFyIGdldEJveENlbnRlciA9IGZ1bmN0aW9uIGdldEJveENlbnRlcihiYikge1xuICAgIHJldHVybiB7XG4gICAgICB4OiAoYmIueDEgKyBiYi54MikgLyAyLFxuICAgICAgeTogKGJiLnkxICsgYmIueTIpIC8gMlxuICAgIH07XG4gIH07XG4gIHZhciBnZXRDZW50ZXJPZmZzZXQgPSBmdW5jdGlvbiBnZXRDZW50ZXJPZmZzZXQoYmIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogLWJiLncgLyAyLFxuICAgICAgeTogLWJiLmggLyAyXG4gICAgfTtcbiAgfTtcbiAgdmFyIGJhY2tncm91bmRUaW1lc3RhbXBIYXNDaGFuZ2VkID0gZnVuY3Rpb24gYmFja2dyb3VuZFRpbWVzdGFtcEhhc0NoYW5nZWQoZWxlKSB7XG4gICAgdmFyIF9wID0gZWxlWzBdLl9wcml2YXRlO1xuICAgIHZhciBzYW1lID0gX3Aub2xkQmFja2dyb3VuZFRpbWVzdGFtcCA9PT0gX3AuYmFja2dyb3VuZFRpbWVzdGFtcDtcbiAgICByZXR1cm4gIXNhbWU7XG4gIH07XG4gIHZhciBnZXRTdHlsZUtleSA9IGZ1bmN0aW9uIGdldFN0eWxlS2V5KGVsZSkge1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUubm9kZUtleTtcbiAgfTtcbiAgdmFyIGdldExhYmVsS2V5ID0gZnVuY3Rpb24gZ2V0TGFiZWxLZXkoZWxlKSB7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS5sYWJlbFN0eWxlS2V5O1xuICB9O1xuICB2YXIgZ2V0U291cmNlTGFiZWxLZXkgPSBmdW5jdGlvbiBnZXRTb3VyY2VMYWJlbEtleShlbGUpIHtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLnNvdXJjZUxhYmVsU3R5bGVLZXk7XG4gIH07XG4gIHZhciBnZXRUYXJnZXRMYWJlbEtleSA9IGZ1bmN0aW9uIGdldFRhcmdldExhYmVsS2V5KGVsZSkge1xuICAgIHJldHVybiBlbGVbMF0uX3ByaXZhdGUudGFyZ2V0TGFiZWxTdHlsZUtleTtcbiAgfTtcbiAgdmFyIGRyYXdFbGVtZW50ID0gZnVuY3Rpb24gZHJhd0VsZW1lbnQoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgdXNlRWxlT3BhY2l0eSkge1xuICAgIHJldHVybiByLmRyYXdFbGVtZW50KGNvbnRleHQsIGVsZSwgYmIsIGZhbHNlLCBmYWxzZSwgdXNlRWxlT3BhY2l0eSk7XG4gIH07XG4gIHZhciBkcmF3TGFiZWwgPSBmdW5jdGlvbiBkcmF3TGFiZWwoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgdXNlRWxlT3BhY2l0eSkge1xuICAgIHJldHVybiByLmRyYXdFbGVtZW50VGV4dChjb250ZXh0LCBlbGUsIGJiLCBzY2FsZWRMYWJlbFNob3duLCAnbWFpbicsIHVzZUVsZU9wYWNpdHkpO1xuICB9O1xuICB2YXIgZHJhd1NvdXJjZUxhYmVsID0gZnVuY3Rpb24gZHJhd1NvdXJjZUxhYmVsKGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sIHVzZUVsZU9wYWNpdHkpIHtcbiAgICByZXR1cm4gci5kcmF3RWxlbWVudFRleHQoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgJ3NvdXJjZScsIHVzZUVsZU9wYWNpdHkpO1xuICB9O1xuICB2YXIgZHJhd1RhcmdldExhYmVsID0gZnVuY3Rpb24gZHJhd1RhcmdldExhYmVsKGNvbnRleHQsIGVsZSwgYmIsIHNjYWxlZExhYmVsU2hvd24sIHVzZUVsZU9wYWNpdHkpIHtcbiAgICByZXR1cm4gci5kcmF3RWxlbWVudFRleHQoY29udGV4dCwgZWxlLCBiYiwgc2NhbGVkTGFiZWxTaG93biwgJ3RhcmdldCcsIHVzZUVsZU9wYWNpdHkpO1xuICB9O1xuICB2YXIgZ2V0RWxlbWVudEJveCA9IGZ1bmN0aW9uIGdldEVsZW1lbnRCb3goZWxlKSB7XG4gICAgZWxlLmJvdW5kaW5nQm94KCk7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS5ib2R5Qm91bmRzO1xuICB9O1xuICB2YXIgZ2V0TGFiZWxCb3ggPSBmdW5jdGlvbiBnZXRMYWJlbEJveChlbGUpIHtcbiAgICBlbGUuYm91bmRpbmdCb3goKTtcbiAgICByZXR1cm4gZWxlWzBdLl9wcml2YXRlLmxhYmVsQm91bmRzLm1haW4gfHwgZW1wdHlCYjtcbiAgfTtcbiAgdmFyIGdldFNvdXJjZUxhYmVsQm94ID0gZnVuY3Rpb24gZ2V0U291cmNlTGFiZWxCb3goZWxlKSB7XG4gICAgZWxlLmJvdW5kaW5nQm94KCk7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS5sYWJlbEJvdW5kcy5zb3VyY2UgfHwgZW1wdHlCYjtcbiAgfTtcbiAgdmFyIGdldFRhcmdldExhYmVsQm94ID0gZnVuY3Rpb24gZ2V0VGFyZ2V0TGFiZWxCb3goZWxlKSB7XG4gICAgZWxlLmJvdW5kaW5nQm94KCk7XG4gICAgcmV0dXJuIGVsZVswXS5fcHJpdmF0ZS5sYWJlbEJvdW5kcy50YXJnZXQgfHwgZW1wdHlCYjtcbiAgfTtcbiAgdmFyIGlzTGFiZWxWaXNpYmxlQXRTY2FsZSA9IGZ1bmN0aW9uIGlzTGFiZWxWaXNpYmxlQXRTY2FsZShlbGUsIHNjYWxlZExhYmVsU2hvd24pIHtcbiAgICByZXR1cm4gc2NhbGVkTGFiZWxTaG93bjtcbiAgfTtcbiAgdmFyIGdldEVsZW1lbnRSb3RhdGlvblBvaW50ID0gZnVuY3Rpb24gZ2V0RWxlbWVudFJvdGF0aW9uUG9pbnQoZWxlKSB7XG4gICAgcmV0dXJuIGdldEJveENlbnRlcihnZXRFbGVtZW50Qm94KGVsZSkpO1xuICB9O1xuICB2YXIgYWRkVGV4dE1hcmdpbiA9IGZ1bmN0aW9uIGFkZFRleHRNYXJnaW4ocHJlZml4LCBwdCwgZWxlKSB7XG4gICAgdmFyIHByZSA9IHByZWZpeCA/IHByZWZpeCArICctJyA6ICcnO1xuICAgIHJldHVybiB7XG4gICAgICB4OiBwdC54ICsgZWxlLnBzdHlsZShwcmUgKyAndGV4dC1tYXJnaW4teCcpLnBmVmFsdWUsXG4gICAgICB5OiBwdC55ICsgZWxlLnBzdHlsZShwcmUgKyAndGV4dC1tYXJnaW4teScpLnBmVmFsdWVcbiAgICB9O1xuICB9O1xuICB2YXIgZ2V0UnNQdCA9IGZ1bmN0aW9uIGdldFJzUHQoZWxlLCB4LCB5KSB7XG4gICAgdmFyIHJzID0gZWxlWzBdLl9wcml2YXRlLnJzY3JhdGNoO1xuICAgIHJldHVybiB7XG4gICAgICB4OiByc1t4XSxcbiAgICAgIHk6IHJzW3ldXG4gICAgfTtcbiAgfTtcbiAgdmFyIGdldExhYmVsUm90YXRpb25Qb2ludCA9IGZ1bmN0aW9uIGdldExhYmVsUm90YXRpb25Qb2ludChlbGUpIHtcbiAgICByZXR1cm4gYWRkVGV4dE1hcmdpbignJywgZ2V0UnNQdChlbGUsICdsYWJlbFgnLCAnbGFiZWxZJyksIGVsZSk7XG4gIH07XG4gIHZhciBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uUG9pbnQgPSBmdW5jdGlvbiBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uUG9pbnQoZWxlKSB7XG4gICAgcmV0dXJuIGFkZFRleHRNYXJnaW4oJ3NvdXJjZScsIGdldFJzUHQoZWxlLCAnc291cmNlTGFiZWxYJywgJ3NvdXJjZUxhYmVsWScpLCBlbGUpO1xuICB9O1xuICB2YXIgZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvblBvaW50ID0gZnVuY3Rpb24gZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvblBvaW50KGVsZSkge1xuICAgIHJldHVybiBhZGRUZXh0TWFyZ2luKCd0YXJnZXQnLCBnZXRSc1B0KGVsZSwgJ3RhcmdldExhYmVsWCcsICd0YXJnZXRMYWJlbFknKSwgZWxlKTtcbiAgfTtcbiAgdmFyIGdldEVsZW1lbnRSb3RhdGlvbk9mZnNldCA9IGZ1bmN0aW9uIGdldEVsZW1lbnRSb3RhdGlvbk9mZnNldChlbGUpIHtcbiAgICByZXR1cm4gZ2V0Q2VudGVyT2Zmc2V0KGdldEVsZW1lbnRCb3goZWxlKSk7XG4gIH07XG4gIHZhciBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uT2Zmc2V0ID0gZnVuY3Rpb24gZ2V0U291cmNlTGFiZWxSb3RhdGlvbk9mZnNldChlbGUpIHtcbiAgICByZXR1cm4gZ2V0Q2VudGVyT2Zmc2V0KGdldFNvdXJjZUxhYmVsQm94KGVsZSkpO1xuICB9O1xuICB2YXIgZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvbk9mZnNldCA9IGZ1bmN0aW9uIGdldFRhcmdldExhYmVsUm90YXRpb25PZmZzZXQoZWxlKSB7XG4gICAgcmV0dXJuIGdldENlbnRlck9mZnNldChnZXRUYXJnZXRMYWJlbEJveChlbGUpKTtcbiAgfTtcbiAgdmFyIGdldExhYmVsUm90YXRpb25PZmZzZXQgPSBmdW5jdGlvbiBnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0KGVsZSkge1xuICAgIHZhciBiYiA9IGdldExhYmVsQm94KGVsZSk7XG4gICAgdmFyIHAgPSBnZXRDZW50ZXJPZmZzZXQoZ2V0TGFiZWxCb3goZWxlKSk7XG4gICAgaWYgKGVsZS5pc05vZGUoKSkge1xuICAgICAgc3dpdGNoIChlbGUucHN0eWxlKCd0ZXh0LWhhbGlnbicpLnZhbHVlKSB7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIHAueCA9IC1iYi53O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgcC54ID0gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZWxlLnBzdHlsZSgndGV4dC12YWxpZ24nKS52YWx1ZSkge1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgIHAueSA9IC1iYi5oO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHAueSA9IDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9O1xuICB2YXIgZWxlVHhyQ2FjaGUgPSByLmRhdGEuZWxlVHhyQ2FjaGUgPSBuZXcgRWxlbWVudFRleHR1cmVDYWNoZShyLCB7XG4gICAgZ2V0S2V5OiBnZXRTdHlsZUtleSxcbiAgICBkb2VzRWxlSW52YWxpZGF0ZUtleTogYmFja2dyb3VuZFRpbWVzdGFtcEhhc0NoYW5nZWQsXG4gICAgZHJhd0VsZW1lbnQ6IGRyYXdFbGVtZW50LFxuICAgIGdldEJvdW5kaW5nQm94OiBnZXRFbGVtZW50Qm94LFxuICAgIGdldFJvdGF0aW9uUG9pbnQ6IGdldEVsZW1lbnRSb3RhdGlvblBvaW50LFxuICAgIGdldFJvdGF0aW9uT2Zmc2V0OiBnZXRFbGVtZW50Um90YXRpb25PZmZzZXQsXG4gICAgYWxsb3dFZGdlVHhyQ2FjaGluZzogZmFsc2UsXG4gICAgYWxsb3dQYXJlbnRUeHJDYWNoaW5nOiBmYWxzZVxuICB9KTtcbiAgdmFyIGxibFR4ckNhY2hlID0gci5kYXRhLmxibFR4ckNhY2hlID0gbmV3IEVsZW1lbnRUZXh0dXJlQ2FjaGUociwge1xuICAgIGdldEtleTogZ2V0TGFiZWxLZXksXG4gICAgZHJhd0VsZW1lbnQ6IGRyYXdMYWJlbCxcbiAgICBnZXRCb3VuZGluZ0JveDogZ2V0TGFiZWxCb3gsXG4gICAgZ2V0Um90YXRpb25Qb2ludDogZ2V0TGFiZWxSb3RhdGlvblBvaW50LFxuICAgIGdldFJvdGF0aW9uT2Zmc2V0OiBnZXRMYWJlbFJvdGF0aW9uT2Zmc2V0LFxuICAgIGlzVmlzaWJsZTogaXNMYWJlbFZpc2libGVBdFNjYWxlXG4gIH0pO1xuICB2YXIgc2xiVHhyQ2FjaGUgPSByLmRhdGEuc2xiVHhyQ2FjaGUgPSBuZXcgRWxlbWVudFRleHR1cmVDYWNoZShyLCB7XG4gICAgZ2V0S2V5OiBnZXRTb3VyY2VMYWJlbEtleSxcbiAgICBkcmF3RWxlbWVudDogZHJhd1NvdXJjZUxhYmVsLFxuICAgIGdldEJvdW5kaW5nQm94OiBnZXRTb3VyY2VMYWJlbEJveCxcbiAgICBnZXRSb3RhdGlvblBvaW50OiBnZXRTb3VyY2VMYWJlbFJvdGF0aW9uUG9pbnQsXG4gICAgZ2V0Um90YXRpb25PZmZzZXQ6IGdldFNvdXJjZUxhYmVsUm90YXRpb25PZmZzZXQsXG4gICAgaXNWaXNpYmxlOiBpc0xhYmVsVmlzaWJsZUF0U2NhbGVcbiAgfSk7XG4gIHZhciB0bGJUeHJDYWNoZSA9IHIuZGF0YS50bGJUeHJDYWNoZSA9IG5ldyBFbGVtZW50VGV4dHVyZUNhY2hlKHIsIHtcbiAgICBnZXRLZXk6IGdldFRhcmdldExhYmVsS2V5LFxuICAgIGRyYXdFbGVtZW50OiBkcmF3VGFyZ2V0TGFiZWwsXG4gICAgZ2V0Qm91bmRpbmdCb3g6IGdldFRhcmdldExhYmVsQm94LFxuICAgIGdldFJvdGF0aW9uUG9pbnQ6IGdldFRhcmdldExhYmVsUm90YXRpb25Qb2ludCxcbiAgICBnZXRSb3RhdGlvbk9mZnNldDogZ2V0VGFyZ2V0TGFiZWxSb3RhdGlvbk9mZnNldCxcbiAgICBpc1Zpc2libGU6IGlzTGFiZWxWaXNpYmxlQXRTY2FsZVxuICB9KTtcbiAgdmFyIGx5clR4ckNhY2hlID0gci5kYXRhLmx5clR4ckNhY2hlID0gbmV3IExheWVyZWRUZXh0dXJlQ2FjaGUocik7XG4gIHIub25VcGRhdGVFbGVDYWxjcyhmdW5jdGlvbiBpbnZhbGlkYXRlVGV4dHVyZUNhY2hlcyh3aWxsRHJhdywgZWxlcykge1xuICAgIC8vIGVhY2ggY2FjaGUgc2hvdWxkIGNoZWNrIGZvciBzdWIta2V5IGRpZmYgdG8gc2VlIHRoYXQgdGhlIHVwZGF0ZSBhZmZlY3RzIHRoYXQgY2FjaGUgcGFydGljdWxhcmx5XG4gICAgZWxlVHhyQ2FjaGUuaW52YWxpZGF0ZUVsZW1lbnRzKGVsZXMpO1xuICAgIGxibFR4ckNhY2hlLmludmFsaWRhdGVFbGVtZW50cyhlbGVzKTtcbiAgICBzbGJUeHJDYWNoZS5pbnZhbGlkYXRlRWxlbWVudHMoZWxlcyk7XG4gICAgdGxiVHhyQ2FjaGUuaW52YWxpZGF0ZUVsZW1lbnRzKGVsZXMpO1xuXG4gICAgLy8gYW55IGNoYW5nZSBpbnZhbGlkYXRlcyB0aGUgbGF5ZXJzXG4gICAgbHlyVHhyQ2FjaGUuaW52YWxpZGF0ZUVsZW1lbnRzKGVsZXMpO1xuXG4gICAgLy8gdXBkYXRlIHRoZSBvbGQgYmcgdGltZXN0YW1wIHNvIGRpZmZzIGNhbiBiZSBkb25lIGluIHRoZSBlbGUgdHhyIGNhY2hlc1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBlbGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9wID0gZWxlc1tfaV0uX3ByaXZhdGU7XG4gICAgICBfcC5vbGRCYWNrZ3JvdW5kVGltZXN0YW1wID0gX3AuYmFja2dyb3VuZFRpbWVzdGFtcDtcbiAgICB9XG4gIH0pO1xuICB2YXIgcmVmaW5lSW5MYXllcnMgPSBmdW5jdGlvbiByZWZpbmVJbkxheWVycyhyZXFzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXFzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBseXJUeHJDYWNoZS5lbnF1ZXVlRWxlbWVudFJlZmluZW1lbnQocmVxc1tpXS5lbGUpO1xuICAgIH1cbiAgfTtcbiAgZWxlVHhyQ2FjaGUub25EZXF1ZXVlKHJlZmluZUluTGF5ZXJzKTtcbiAgbGJsVHhyQ2FjaGUub25EZXF1ZXVlKHJlZmluZUluTGF5ZXJzKTtcbiAgc2xiVHhyQ2FjaGUub25EZXF1ZXVlKHJlZmluZUluTGF5ZXJzKTtcbiAgdGxiVHhyQ2FjaGUub25EZXF1ZXVlKHJlZmluZUluTGF5ZXJzKTtcbn1cbkNScC5yZWRyYXdIaW50ID0gZnVuY3Rpb24gKGdyb3VwLCBib29sKSB7XG4gIHZhciByID0gdGhpcztcbiAgc3dpdGNoIChncm91cCkge1xuICAgIGNhc2UgJ2VsZXMnOlxuICAgICAgci5kYXRhLmNhbnZhc05lZWRzUmVkcmF3W0NScC5OT0RFXSA9IGJvb2w7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkcmFnJzpcbiAgICAgIHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tDUnAuRFJBR10gPSBib29sO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHIuZGF0YS5jYW52YXNOZWVkc1JlZHJhd1tDUnAuU0VMRUNUX0JPWF0gPSBib29sO1xuICAgICAgYnJlYWs7XG4gIH1cbn07XG5cbi8vIHdoZXRoZXIgdG8gdXNlIFBhdGgyRCBjYWNoaW5nIGZvciBkcmF3aW5nXG52YXIgcGF0aHNJbXBsZCA9IHR5cGVvZiBQYXRoMkQgIT09ICd1bmRlZmluZWQnO1xuQ1JwLnBhdGgyZEVuYWJsZWQgPSBmdW5jdGlvbiAob24pIHtcbiAgaWYgKG9uID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdGhpcy5wYXRoc0VuYWJsZWQ7XG4gIH1cbiAgdGhpcy5wYXRoc0VuYWJsZWQgPSBvbiA/IHRydWUgOiBmYWxzZTtcbn07XG5DUnAudXNlUGF0aHMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBwYXRoc0ltcGxkICYmIHRoaXMucGF0aHNFbmFibGVkO1xufTtcbkNScC5zZXRJbWdTbW9vdGhpbmcgPSBmdW5jdGlvbiAoY29udGV4dCwgYm9vbCkge1xuICBpZiAoY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgIT0gbnVsbCkge1xuICAgIGNvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gYm9vbDtcbiAgfSBlbHNlIHtcbiAgICBjb250ZXh0LndlYmtpdEltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGJvb2w7XG4gICAgY29udGV4dC5tb3pJbWFnZVNtb290aGluZ0VuYWJsZWQgPSBib29sO1xuICAgIGNvbnRleHQubXNJbWFnZVNtb290aGluZ0VuYWJsZWQgPSBib29sO1xuICB9XG59O1xuQ1JwLmdldEltZ1Ntb290aGluZyA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gIGlmIChjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIGNvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb250ZXh0LndlYmtpdEltYWdlU21vb3RoaW5nRW5hYmxlZCB8fCBjb250ZXh0Lm1vekltYWdlU21vb3RoaW5nRW5hYmxlZCB8fCBjb250ZXh0Lm1zSW1hZ2VTbW9vdGhpbmdFbmFibGVkO1xuICB9XG59O1xuQ1JwLm1ha2VPZmZzY3JlZW5DYW52YXMgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuICB2YXIgY2FudmFzO1xuICBpZiAoKHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihPZmZzY3JlZW5DYW52YXMpKSAhPT0gKFwidW5kZWZpbmVkXCIgKSkge1xuICAgIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7XG4gIH0gZWxzZSB7XG4gICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG4gIHJldHVybiBjYW52YXM7XG59O1xuW0NScCRhLCBDUnAkOSwgQ1JwJDgsIENScCQ3LCBDUnAkNiwgQ1JwJDUsIENScCQ0LCBDUnAkMywgQ1JwJDIsIENScCQxXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wcykge1xuICBleHRlbmQoQ1JwLCBwcm9wcyk7XG59KTtcblxudmFyIHJlbmRlcmVyID0gW3tcbiAgbmFtZTogJ251bGwnLFxuICBpbXBsOiBOdWxsUmVuZGVyZXJcbn0sIHtcbiAgbmFtZTogJ2Jhc2UnLFxuICBpbXBsOiBCUlxufSwge1xuICBuYW1lOiAnY2FudmFzJyxcbiAgaW1wbDogQ1Jcbn1dO1xuXG52YXIgaW5jRXh0cyA9IFt7XG4gIHR5cGU6ICdsYXlvdXQnLFxuICBleHRlbnNpb25zOiBsYXlvdXRcbn0sIHtcbiAgdHlwZTogJ3JlbmRlcmVyJyxcbiAgZXh0ZW5zaW9uczogcmVuZGVyZXJcbn1dO1xuXG4vLyByZWdpc3RlcmVkIGV4dGVuc2lvbnMgdG8gY3l0b3NjYXBlLCBpbmRleGVkIGJ5IG5hbWVcbnZhciBleHRlbnNpb25zID0ge307XG5cbi8vIHJlZ2lzdGVyZWQgbW9kdWxlcyBmb3IgZXh0ZW5zaW9ucywgaW5kZXhlZCBieSBuYW1lXG52YXIgbW9kdWxlcyA9IHt9O1xuZnVuY3Rpb24gc2V0RXh0ZW5zaW9uKHR5cGUsIG5hbWUsIHJlZ2lzdHJhbnQpIHtcbiAgdmFyIGV4dCA9IHJlZ2lzdHJhbnQ7XG4gIHZhciBvdmVycmlkZUVyciA9IGZ1bmN0aW9uIG92ZXJyaWRlRXJyKGZpZWxkKSB7XG4gICAgd2FybignQ2FuIG5vdCByZWdpc3RlciBgJyArIG5hbWUgKyAnYCBmb3IgYCcgKyB0eXBlICsgJ2Agc2luY2UgYCcgKyBmaWVsZCArICdgIGFscmVhZHkgZXhpc3RzIGluIHRoZSBwcm90b3R5cGUgYW5kIGNhbiBub3QgYmUgb3ZlcnJpZGRlbicpO1xuICB9O1xuICBpZiAodHlwZSA9PT0gJ2NvcmUnKSB7XG4gICAgaWYgKENvcmUucHJvdG90eXBlW25hbWVdKSB7XG4gICAgICByZXR1cm4gb3ZlcnJpZGVFcnIobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIENvcmUucHJvdG90eXBlW25hbWVdID0gcmVnaXN0cmFudDtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NvbGxlY3Rpb24nKSB7XG4gICAgaWYgKENvbGxlY3Rpb24ucHJvdG90eXBlW25hbWVdKSB7XG4gICAgICByZXR1cm4gb3ZlcnJpZGVFcnIobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIENvbGxlY3Rpb24ucHJvdG90eXBlW25hbWVdID0gcmVnaXN0cmFudDtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2xheW91dCcpIHtcbiAgICAvLyBmaWxsIGluIG1pc3NpbmcgbGF5b3V0IGZ1bmN0aW9ucyBpbiB0aGUgcHJvdG90eXBlXG5cbiAgICB2YXIgTGF5b3V0ID0gZnVuY3Rpb24gTGF5b3V0KG9wdGlvbnMpIHtcbiAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICByZWdpc3RyYW50LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgICAgIC8vIG1ha2Ugc3VyZSBsYXlvdXQgaGFzIF9wcml2YXRlIGZvciB1c2Ugdy8gc3RkIGFwaXMgbGlrZSAub24oKVxuICAgICAgaWYgKCFwbGFpbk9iamVjdCh0aGlzLl9wcml2YXRlKSkge1xuICAgICAgICB0aGlzLl9wcml2YXRlID0ge307XG4gICAgICB9XG4gICAgICB0aGlzLl9wcml2YXRlLmN5ID0gb3B0aW9ucy5jeTtcbiAgICAgIHRoaXMuX3ByaXZhdGUubGlzdGVuZXJzID0gW107XG4gICAgICB0aGlzLmNyZWF0ZUVtaXR0ZXIoKTtcbiAgICB9O1xuICAgIHZhciBsYXlvdXRQcm90byA9IExheW91dC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHJlZ2lzdHJhbnQucHJvdG90eXBlKTtcbiAgICB2YXIgb3B0TGF5b3V0Rm5zID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRMYXlvdXRGbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBmbk5hbWUgPSBvcHRMYXlvdXRGbnNbaV07XG4gICAgICBsYXlvdXRQcm90b1tmbk5hbWVdID0gbGF5b3V0UHJvdG9bZm5OYW1lXSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBlaXRoZXIgLnN0YXJ0KCkgb3IgLnJ1bigpIGlzIGRlZmluZWQsIHNvIGF1dG9nZW4gdGhlIG90aGVyXG4gICAgaWYgKGxheW91dFByb3RvLnN0YXJ0ICYmICFsYXlvdXRQcm90by5ydW4pIHtcbiAgICAgIGxheW91dFByb3RvLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zdGFydCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICghbGF5b3V0UHJvdG8uc3RhcnQgJiYgbGF5b3V0UHJvdG8ucnVuKSB7XG4gICAgICBsYXlvdXRQcm90by5zdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ydW4oKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgcmVnU3RvcCA9IHJlZ2lzdHJhbnQucHJvdG90eXBlLnN0b3A7XG4gICAgbGF5b3V0UHJvdG8uc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBvcHRzID0gdGhpcy5vcHRpb25zO1xuICAgICAgaWYgKG9wdHMgJiYgb3B0cy5hbmltYXRlKSB7XG4gICAgICAgIHZhciBhbmlzID0gdGhpcy5hbmltYXRpb25zO1xuICAgICAgICBpZiAoYW5pcykge1xuICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhbmlzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYW5pc1tfaV0uc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlZ1N0b3ApIHtcbiAgICAgICAgcmVnU3RvcC5jYWxsKHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbWl0KCdsYXlvdXRzdG9wJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIGlmICghbGF5b3V0UHJvdG8uZGVzdHJveSkge1xuICAgICAgbGF5b3V0UHJvdG8uZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9O1xuICAgIH1cbiAgICBsYXlvdXRQcm90by5jeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcml2YXRlLmN5O1xuICAgIH07XG4gICAgdmFyIGdldEN5ID0gZnVuY3Rpb24gZ2V0Q3kobGF5b3V0KSB7XG4gICAgICByZXR1cm4gbGF5b3V0Ll9wcml2YXRlLmN5O1xuICAgIH07XG4gICAgdmFyIGVtaXR0ZXJPcHRzID0ge1xuICAgICAgYWRkRXZlbnRGaWVsZHM6IGZ1bmN0aW9uIGFkZEV2ZW50RmllbGRzKGxheW91dCwgZXZ0KSB7XG4gICAgICAgIGV2dC5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgICAgIGV2dC5jeSA9IGdldEN5KGxheW91dCk7XG4gICAgICAgIGV2dC50YXJnZXQgPSBsYXlvdXQ7XG4gICAgICB9LFxuICAgICAgYnViYmxlOiBmdW5jdGlvbiBidWJibGUoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIHBhcmVudDogZnVuY3Rpb24gcGFyZW50KGxheW91dCkge1xuICAgICAgICByZXR1cm4gZ2V0Q3kobGF5b3V0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGV4dGVuZChsYXlvdXRQcm90bywge1xuICAgICAgY3JlYXRlRW1pdHRlcjogZnVuY3Rpb24gY3JlYXRlRW1pdHRlcigpIHtcbiAgICAgICAgdGhpcy5fcHJpdmF0ZS5lbWl0dGVyID0gbmV3IEVtaXR0ZXIoZW1pdHRlck9wdHMsIHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBlbWl0dGVyOiBmdW5jdGlvbiBlbWl0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJpdmF0ZS5lbWl0dGVyO1xuICAgICAgfSxcbiAgICAgIG9uOiBmdW5jdGlvbiBvbihldnQsIGNiKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLm9uKGV2dCwgY2IpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBvbmU6IGZ1bmN0aW9uIG9uZShldnQsIGNiKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLm9uZShldnQsIGNiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgb25jZTogZnVuY3Rpb24gb25jZShldnQsIGNiKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlcigpLm9uZShldnQsIGNiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgcmVtb3ZlTGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2dCwgY2IpIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyKCkucmVtb3ZlTGlzdGVuZXIoZXZ0LCBjYik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZUFsbExpc3RlbmVyczogZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKCkge1xuICAgICAgICB0aGlzLmVtaXR0ZXIoKS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgICAgZW1pdDogZnVuY3Rpb24gZW1pdChldnQsIHBhcmFtcykge1xuICAgICAgICB0aGlzLmVtaXR0ZXIoKS5lbWl0KGV2dCwgcGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZGVmaW5lLmV2ZW50QWxpYXNlc09uKGxheW91dFByb3RvKTtcbiAgICBleHQgPSBMYXlvdXQ7IC8vIHJlcGxhY2Ugd2l0aCBvdXIgd3JhcHBlZCBsYXlvdXRcbiAgfSBlbHNlIGlmICh0eXBlID09PSAncmVuZGVyZXInICYmIG5hbWUgIT09ICdudWxsJyAmJiBuYW1lICE9PSAnYmFzZScpIHtcbiAgICAvLyB1c2VyIHJlZ2lzdGVyZWQgcmVuZGVyZXJzIGluaGVyaXQgZnJvbSBiYXNlXG5cbiAgICB2YXIgQmFzZVJlbmRlcmVyID0gZ2V0RXh0ZW5zaW9uKCdyZW5kZXJlcicsICdiYXNlJyk7XG4gICAgdmFyIGJQcm90byA9IEJhc2VSZW5kZXJlci5wcm90b3R5cGU7XG4gICAgdmFyIFJlZ2lzdHJhbnRSZW5kZXJlciA9IHJlZ2lzdHJhbnQ7XG4gICAgdmFyIHJQcm90byA9IHJlZ2lzdHJhbnQucHJvdG90eXBlO1xuICAgIHZhciBSZW5kZXJlciA9IGZ1bmN0aW9uIFJlbmRlcmVyKCkge1xuICAgICAgQmFzZVJlbmRlcmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBSZWdpc3RyYW50UmVuZGVyZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIHZhciBwcm90byA9IFJlbmRlcmVyLnByb3RvdHlwZTtcbiAgICBmb3IgKHZhciBwTmFtZSBpbiBiUHJvdG8pIHtcbiAgICAgIHZhciBwVmFsID0gYlByb3RvW3BOYW1lXTtcbiAgICAgIHZhciBleGlzdHNJblIgPSByUHJvdG9bcE5hbWVdICE9IG51bGw7XG4gICAgICBpZiAoZXhpc3RzSW5SKSB7XG4gICAgICAgIHJldHVybiBvdmVycmlkZUVycihwTmFtZSk7XG4gICAgICB9XG4gICAgICBwcm90b1twTmFtZV0gPSBwVmFsOyAvLyB0YWtlIGltcGwgZnJvbSBiYXNlXG4gICAgfVxuXG4gICAgZm9yICh2YXIgX3BOYW1lIGluIHJQcm90bykge1xuICAgICAgcHJvdG9bX3BOYW1lXSA9IHJQcm90b1tfcE5hbWVdOyAvLyB0YWtlIGltcGwgZnJvbSByZWdpc3RyYW50XG4gICAgfVxuXG4gICAgYlByb3RvLmNsaWVudEZ1bmN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBwcm90b1tuYW1lXSA9IHByb3RvW25hbWVdIHx8IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXJyb3IoJ1JlbmRlcmVyIGRvZXMgbm90IGltcGxlbWVudCBgcmVuZGVyZXIuJyArIG5hbWUgKyAnKClgIG9uIGl0cyBwcm90b3R5cGUnKTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgZXh0ID0gUmVuZGVyZXI7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ19fcHJvdG9fXycgfHwgdHlwZSA9PT0gJ2NvbnN0cnVjdG9yJyB8fCB0eXBlID09PSAncHJvdG90eXBlJykge1xuICAgIC8vIHRvIGF2b2lkIHBvdGVudGlhbCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gICAgcmV0dXJuIGVycm9yKHR5cGUgKyAnIGlzIGFuIGlsbGVnYWwgdHlwZSB0byBiZSByZWdpc3RlcmVkLCBwb3NzaWJseSBsZWFkIHRvIHByb3RvdHlwZSBwb2xsdXRpb25zJyk7XG4gIH1cbiAgcmV0dXJuIHNldE1hcCh7XG4gICAgbWFwOiBleHRlbnNpb25zLFxuICAgIGtleXM6IFt0eXBlLCBuYW1lXSxcbiAgICB2YWx1ZTogZXh0XG4gIH0pO1xufVxuZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uKHR5cGUsIG5hbWUpIHtcbiAgcmV0dXJuIGdldE1hcCh7XG4gICAgbWFwOiBleHRlbnNpb25zLFxuICAgIGtleXM6IFt0eXBlLCBuYW1lXVxuICB9KTtcbn1cbmZ1bmN0aW9uIHNldE1vZHVsZSh0eXBlLCBuYW1lLCBtb2R1bGVUeXBlLCBtb2R1bGVOYW1lLCByZWdpc3RyYW50KSB7XG4gIHJldHVybiBzZXRNYXAoe1xuICAgIG1hcDogbW9kdWxlcyxcbiAgICBrZXlzOiBbdHlwZSwgbmFtZSwgbW9kdWxlVHlwZSwgbW9kdWxlTmFtZV0sXG4gICAgdmFsdWU6IHJlZ2lzdHJhbnRcbiAgfSk7XG59XG5mdW5jdGlvbiBnZXRNb2R1bGUodHlwZSwgbmFtZSwgbW9kdWxlVHlwZSwgbW9kdWxlTmFtZSkge1xuICByZXR1cm4gZ2V0TWFwKHtcbiAgICBtYXA6IG1vZHVsZXMsXG4gICAga2V5czogW3R5cGUsIG5hbWUsIG1vZHVsZVR5cGUsIG1vZHVsZU5hbWVdXG4gIH0pO1xufVxudmFyIGV4dGVuc2lvbiA9IGZ1bmN0aW9uIGV4dGVuc2lvbigpIHtcbiAgLy8gZS5nLiBleHRlbnNpb24oJ3JlbmRlcmVyJywgJ3N2ZycpXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLy8gZS5nLiBleHRlbnNpb24oJ3JlbmRlcmVyJywgJ3N2ZycsIHsgLi4uIH0pXG4gIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICByZXR1cm4gc2V0RXh0ZW5zaW9uLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIH1cblxuICAvLyBlLmcuIGV4dGVuc2lvbigncmVuZGVyZXInLCAnc3ZnJywgJ25vZGVTaGFwZScsICdlbGxpcHNlJylcbiAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCkge1xuICAgIHJldHVybiBnZXRNb2R1bGUuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgfVxuXG4gIC8vIGUuZy4gZXh0ZW5zaW9uKCdyZW5kZXJlcicsICdzdmcnLCAnbm9kZVNoYXBlJywgJ2VsbGlwc2UnLCB7IC4uLiB9KVxuICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA1KSB7XG4gICAgcmV0dXJuIHNldE1vZHVsZS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9IGVsc2Uge1xuICAgIGVycm9yKCdJbnZhbGlkIGV4dGVuc2lvbiBhY2Nlc3Mgc3ludGF4Jyk7XG4gIH1cbn07XG5cbi8vIGFsbG93cyBhIGNvcmUgaW5zdGFuY2UgdG8gYWNjZXNzIGV4dGVuc2lvbnMgaW50ZXJuYWxseVxuQ29yZS5wcm90b3R5cGUuZXh0ZW5zaW9uID0gZXh0ZW5zaW9uO1xuXG4vLyBpbmNsdWRlZCBleHRlbnNpb25zXG5pbmNFeHRzLmZvckVhY2goZnVuY3Rpb24gKGdyb3VwKSB7XG4gIGdyb3VwLmV4dGVuc2lvbnMuZm9yRWFjaChmdW5jdGlvbiAoZXh0KSB7XG4gICAgc2V0RXh0ZW5zaW9uKGdyb3VwLnR5cGUsIGV4dC5uYW1lLCBleHQuaW1wbCk7XG4gIH0pO1xufSk7XG5cbi8vIGEgZHVtbXkgc3R5bGVzaGVldCBvYmplY3QgdGhhdCBkb2Vzbid0IG5lZWQgYSByZWZlcmVuY2UgdG8gdGhlIGNvcmVcbi8vICh1c2VmdWwgZm9yIGluaXQpXG52YXIgU3R5bGVzaGVldCA9IGZ1bmN0aW9uIFN0eWxlc2hlZXQoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTdHlsZXNoZWV0KSkge1xuICAgIHJldHVybiBuZXcgU3R5bGVzaGVldCgpO1xuICB9XG4gIHRoaXMubGVuZ3RoID0gMDtcbn07XG52YXIgc2hlZXRmbiA9IFN0eWxlc2hlZXQucHJvdG90eXBlO1xuc2hlZXRmbi5pbnN0YW5jZVN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICdzdHlsZXNoZWV0Jztcbn07XG5cbi8vIGp1c3Qgc3RvcmUgdGhlIHNlbGVjdG9yIHRvIGJlIHBhcnNlZCBsYXRlclxuc2hlZXRmbi5zZWxlY3RvciA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICB2YXIgaSA9IHRoaXMubGVuZ3RoKys7XG4gIHRoaXNbaV0gPSB7XG4gICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgIHByb3BlcnRpZXM6IFtdXG4gIH07XG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxuLy8ganVzdCBzdG9yZSB0aGUgcHJvcGVydHkgdG8gYmUgcGFyc2VkIGxhdGVyXG5zaGVldGZuLmNzcyA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICB2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTtcbiAgaWYgKHN0cmluZyhuYW1lKSkge1xuICAgIHRoaXNbaV0ucHJvcGVydGllcy5wdXNoKHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWVcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChwbGFpbk9iamVjdChuYW1lKSkge1xuICAgIHZhciBtYXAgPSBuYW1lO1xuICAgIHZhciBwcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhtYXApO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcHJvcE5hbWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcE5hbWVzW2pdO1xuICAgICAgdmFyIG1hcFZhbCA9IG1hcFtrZXldO1xuICAgICAgaWYgKG1hcFZhbCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIHByb3AgPSBTdHlsZS5wcm9wZXJ0aWVzW2tleV0gfHwgU3R5bGUucHJvcGVydGllc1tkYXNoMmNhbWVsKGtleSldO1xuICAgICAgaWYgKHByb3AgPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBfbmFtZSA9IHByb3AubmFtZTtcbiAgICAgIHZhciBfdmFsdWUgPSBtYXBWYWw7XG4gICAgICB0aGlzW2ldLnByb3BlcnRpZXMucHVzaCh7XG4gICAgICAgIG5hbWU6IF9uYW1lLFxuICAgICAgICB2YWx1ZTogX3ZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7IC8vIGNoYWluaW5nXG59O1xuXG5zaGVldGZuLnN0eWxlID0gc2hlZXRmbi5jc3M7XG5cbi8vIGdlbmVyYXRlIGEgcmVhbCBzdHlsZSBvYmplY3QgZnJvbSB0aGUgZHVtbXkgc3R5bGVzaGVldFxuc2hlZXRmbi5nZW5lcmF0ZVN0eWxlID0gZnVuY3Rpb24gKGN5KSB7XG4gIHZhciBzdHlsZSA9IG5ldyBTdHlsZShjeSk7XG4gIHJldHVybiB0aGlzLmFwcGVuZFRvU3R5bGUoc3R5bGUpO1xufTtcblxuLy8gYXBwZW5kIGEgZHVtbXkgc3R5bGVzaGVldCBvYmplY3Qgb24gYSByZWFsIHN0eWxlIG9iamVjdFxuc2hlZXRmbi5hcHBlbmRUb1N0eWxlID0gZnVuY3Rpb24gKHN0eWxlKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjb250ZXh0ID0gdGhpc1tpXTtcbiAgICB2YXIgc2VsZWN0b3IgPSBjb250ZXh0LnNlbGVjdG9yO1xuICAgIHZhciBwcm9wcyA9IGNvbnRleHQucHJvcGVydGllcztcbiAgICBzdHlsZS5zZWxlY3RvcihzZWxlY3Rvcik7IC8vIGFwcGx5IHNlbGVjdG9yXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByb3BzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgcHJvcCA9IHByb3BzW2pdO1xuICAgICAgc3R5bGUuY3NzKHByb3AubmFtZSwgcHJvcC52YWx1ZSk7IC8vIGFwcGx5IHByb3BlcnR5XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0eWxlO1xufTtcblxudmFyIHZlcnNpb24gPSBcIjMuMjkuMlwiO1xuXG52YXIgY3l0b3NjYXBlID0gZnVuY3Rpb24gY3l0b3NjYXBlKG9wdGlvbnMpIHtcbiAgLy8gaWYgbm8gb3B0aW9ucyBzcGVjaWZpZWQsIHVzZSBkZWZhdWx0XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICAvLyBjcmVhdGUgaW5zdGFuY2VcbiAgaWYgKHBsYWluT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIG5ldyBDb3JlKG9wdGlvbnMpO1xuICB9XG5cbiAgLy8gYWxsb3cgZm9yIHJlZ2lzdHJhdGlvbiBvZiBleHRlbnNpb25zXG4gIGVsc2UgaWYgKHN0cmluZyhvcHRpb25zKSkge1xuICAgIHJldHVybiBleHRlbnNpb24uYXBwbHkoZXh0ZW5zaW9uLCBhcmd1bWVudHMpO1xuICB9XG59O1xuXG4vLyBlLmcuIGN5dG9zY2FwZS51c2UoIHJlcXVpcmUoJ2N5dG9zY2FwZS1mb28nKSwgYmFyIClcbmN5dG9zY2FwZS51c2UgPSBmdW5jdGlvbiAoZXh0KSB7XG4gIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsgLy8gYXJncyB0byBwYXNzIHRvIGV4dFxuXG4gIGFyZ3MudW5zaGlmdChjeXRvc2NhcGUpOyAvLyBjeXRvc2NhcGUgaXMgZmlyc3QgYXJnIHRvIGV4dFxuXG4gIGV4dC5hcHBseShudWxsLCBhcmdzKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuY3l0b3NjYXBlLndhcm5pbmdzID0gZnVuY3Rpb24gKGJvb2wpIHtcbiAgcmV0dXJuIHdhcm5pbmdzKGJvb2wpO1xufTtcblxuLy8gcmVwbGFjZWQgYnkgYnVpbGQgc3lzdGVtXG5jeXRvc2NhcGUudmVyc2lvbiA9IHZlcnNpb247XG5cbi8vIGV4cG9zZSBwdWJsaWMgYXBpcyAobW9zdGx5IGZvciBleHRlbnNpb25zKVxuY3l0b3NjYXBlLnN0eWxlc2hlZXQgPSBjeXRvc2NhcGUuU3R5bGVzaGVldCA9IFN0eWxlc2hlZXQ7XG5cbmV4cG9ydCB7IGN5dG9zY2FwZSBhcyBkZWZhdWx0IH07XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHRsb2FkZWQ6IGZhbHNlLFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdGlmICghKG1vZHVsZUlkIGluIF9fd2VicGFja19tb2R1bGVzX18pKSB7XG5cdFx0ZGVsZXRlIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgbW9kdWxlSWQgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG5cdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGU7IH07XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBkZWZpbml0aW9uKSB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqLCBwcm9wKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTsgfSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0bW9kdWxlLnBhdGhzID0gW107XG5cdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0cmV0dXJuIG1vZHVsZTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5uYyA9IHVuZGVmaW5lZDsiLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgKi9cbnZhciBnID1cbiAgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWxUaGlzKSB8fFxuICAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsKSB8fFxuICB7fVxuXG52YXIgc3VwcG9ydCA9IHtcbiAgc2VhcmNoUGFyYW1zOiAnVVJMU2VhcmNoUGFyYW1zJyBpbiBnLFxuICBpdGVyYWJsZTogJ1N5bWJvbCcgaW4gZyAmJiAnaXRlcmF0b3InIGluIFN5bWJvbCxcbiAgYmxvYjpcbiAgICAnRmlsZVJlYWRlcicgaW4gZyAmJlxuICAgICdCbG9iJyBpbiBnICYmXG4gICAgKGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IEJsb2IoKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9KSgpLFxuICBmb3JtRGF0YTogJ0Zvcm1EYXRhJyBpbiBnLFxuICBhcnJheUJ1ZmZlcjogJ0FycmF5QnVmZmVyJyBpbiBnXG59XG5cbmZ1bmN0aW9uIGlzRGF0YVZpZXcob2JqKSB7XG4gIHJldHVybiBvYmogJiYgRGF0YVZpZXcucHJvdG90eXBlLmlzUHJvdG90eXBlT2Yob2JqKVxufVxuXG5pZiAoc3VwcG9ydC5hcnJheUJ1ZmZlcikge1xuICB2YXIgdmlld0NsYXNzZXMgPSBbXG4gICAgJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgICdbb2JqZWN0IFVpbnQzMkFycmF5XScsXG4gICAgJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgJ1tvYmplY3QgRmxvYXQ2NEFycmF5XSdcbiAgXVxuXG4gIHZhciBpc0FycmF5QnVmZmVyVmlldyA9XG4gICAgQXJyYXlCdWZmZXIuaXNWaWV3IHx8XG4gICAgZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHZpZXdDbGFzc2VzLmluZGV4T2YoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikpID4gLTFcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5hbWUobmFtZSkge1xuICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgbmFtZSA9IFN0cmluZyhuYW1lKVxuICB9XG4gIGlmICgvW15hLXowLTlcXC0jJCUmJyorLl5fYHx+IV0vaS50ZXN0KG5hbWUpIHx8IG5hbWUgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGZpZWxkIG5hbWU6IFwiJyArIG5hbWUgKyAnXCInKVxuICB9XG4gIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKClcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVmFsdWUodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSlcbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cblxuLy8gQnVpbGQgYSBkZXN0cnVjdGl2ZSBpdGVyYXRvciBmb3IgdGhlIHZhbHVlIGxpc3RcbmZ1bmN0aW9uIGl0ZXJhdG9yRm9yKGl0ZW1zKSB7XG4gIHZhciBpdGVyYXRvciA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGl0ZW1zLnNoaWZ0KClcbiAgICAgIHJldHVybiB7ZG9uZTogdmFsdWUgPT09IHVuZGVmaW5lZCwgdmFsdWU6IHZhbHVlfVxuICAgIH1cbiAgfVxuXG4gIGlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7XG4gICAgaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGl0ZXJhdG9yXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIZWFkZXJzKGhlYWRlcnMpIHtcbiAgdGhpcy5tYXAgPSB7fVxuXG4gIGlmIChoZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgdGhpcy5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgfSwgdGhpcylcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGhlYWRlcnMpKSB7XG4gICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKGhlYWRlcikge1xuICAgICAgaWYgKGhlYWRlci5sZW5ndGggIT0gMikge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdIZWFkZXJzIGNvbnN0cnVjdG9yOiBleHBlY3RlZCBuYW1lL3ZhbHVlIHBhaXIgdG8gYmUgbGVuZ3RoIDIsIGZvdW5kJyArIGhlYWRlci5sZW5ndGgpXG4gICAgICB9XG4gICAgICB0aGlzLmFwcGVuZChoZWFkZXJbMF0sIGhlYWRlclsxXSlcbiAgICB9LCB0aGlzKVxuICB9IGVsc2UgaWYgKGhlYWRlcnMpIHtcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhoZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHRoaXMuYXBwZW5kKG5hbWUsIGhlYWRlcnNbbmFtZV0pXG4gICAgfSwgdGhpcylcbiAgfVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICBuYW1lID0gbm9ybWFsaXplTmFtZShuYW1lKVxuICB2YWx1ZSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKVxuICB2YXIgb2xkVmFsdWUgPSB0aGlzLm1hcFtuYW1lXVxuICB0aGlzLm1hcFtuYW1lXSA9IG9sZFZhbHVlID8gb2xkVmFsdWUgKyAnLCAnICsgdmFsdWUgOiB2YWx1ZVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBmdW5jdGlvbihuYW1lKSB7XG4gIGRlbGV0ZSB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihuYW1lKSB7XG4gIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpXG4gIHJldHVybiB0aGlzLmhhcyhuYW1lKSA/IHRoaXMubWFwW25hbWVdIDogbnVsbFxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbihuYW1lKSB7XG4gIHJldHVybiB0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShub3JtYWxpemVOYW1lKG5hbWUpKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgZm9yICh2YXIgbmFtZSBpbiB0aGlzLm1hcCkge1xuICAgIGlmICh0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB0aGlzLm1hcFtuYW1lXSwgbmFtZSwgdGhpcylcbiAgICB9XG4gIH1cbn1cblxuSGVhZGVycy5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXRlbXMgPSBbXVxuICB0aGlzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICBpdGVtcy5wdXNoKG5hbWUpXG4gIH0pXG4gIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbn1cblxuSGVhZGVycy5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgIGl0ZW1zLnB1c2godmFsdWUpXG4gIH0pXG4gIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbn1cblxuSGVhZGVycy5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXRlbXMgPSBbXVxuICB0aGlzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICBpdGVtcy5wdXNoKFtuYW1lLCB2YWx1ZV0pXG4gIH0pXG4gIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbn1cblxuaWYgKHN1cHBvcnQuaXRlcmFibGUpIHtcbiAgSGVhZGVycy5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IEhlYWRlcnMucHJvdG90eXBlLmVudHJpZXNcbn1cblxuZnVuY3Rpb24gY29uc3VtZWQoYm9keSkge1xuICBpZiAoYm9keS5fbm9Cb2R5KSByZXR1cm5cbiAgaWYgKGJvZHkuYm9keVVzZWQpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJykpXG4gIH1cbiAgYm9keS5ib2R5VXNlZCA9IHRydWVcbn1cblxuZnVuY3Rpb24gZmlsZVJlYWRlclJlYWR5KHJlYWRlcikge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVzb2x2ZShyZWFkZXIucmVzdWx0KVxuICAgIH1cbiAgICByZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVqZWN0KHJlYWRlci5lcnJvcilcbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9iQXNBcnJheUJ1ZmZlcihibG9iKSB7XG4gIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXG4gIHZhciBwcm9taXNlID0gZmlsZVJlYWRlclJlYWR5KHJlYWRlcilcbiAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpXG4gIHJldHVybiBwcm9taXNlXG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9iQXNUZXh0KGJsb2IpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcbiAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKVxuICB2YXIgbWF0Y2ggPSAvY2hhcnNldD0oW0EtWmEtejAtOV8tXSspLy5leGVjKGJsb2IudHlwZSlcbiAgdmFyIGVuY29kaW5nID0gbWF0Y2ggPyBtYXRjaFsxXSA6ICd1dGYtOCdcbiAgcmVhZGVyLnJlYWRBc1RleHQoYmxvYiwgZW5jb2RpbmcpXG4gIHJldHVybiBwcm9taXNlXG59XG5cbmZ1bmN0aW9uIHJlYWRBcnJheUJ1ZmZlckFzVGV4dChidWYpIHtcbiAgdmFyIHZpZXcgPSBuZXcgVWludDhBcnJheShidWYpXG4gIHZhciBjaGFycyA9IG5ldyBBcnJheSh2aWV3Lmxlbmd0aClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXcubGVuZ3RoOyBpKyspIHtcbiAgICBjaGFyc1tpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodmlld1tpXSlcbiAgfVxuICByZXR1cm4gY2hhcnMuam9pbignJylcbn1cblxuZnVuY3Rpb24gYnVmZmVyQ2xvbmUoYnVmKSB7XG4gIGlmIChidWYuc2xpY2UpIHtcbiAgICByZXR1cm4gYnVmLnNsaWNlKDApXG4gIH0gZWxzZSB7XG4gICAgdmFyIHZpZXcgPSBuZXcgVWludDhBcnJheShidWYuYnl0ZUxlbmd0aClcbiAgICB2aWV3LnNldChuZXcgVWludDhBcnJheShidWYpKVxuICAgIHJldHVybiB2aWV3LmJ1ZmZlclxuICB9XG59XG5cbmZ1bmN0aW9uIEJvZHkoKSB7XG4gIHRoaXMuYm9keVVzZWQgPSBmYWxzZVxuXG4gIHRoaXMuX2luaXRCb2R5ID0gZnVuY3Rpb24oYm9keSkge1xuICAgIC8qXG4gICAgICBmZXRjaC1tb2NrIHdyYXBzIHRoZSBSZXNwb25zZSBvYmplY3QgaW4gYW4gRVM2IFByb3h5IHRvXG4gICAgICBwcm92aWRlIHVzZWZ1bCB0ZXN0IGhhcm5lc3MgZmVhdHVyZXMgc3VjaCBhcyBmbHVzaC4gSG93ZXZlciwgb25cbiAgICAgIEVTNSBicm93c2VycyB3aXRob3V0IGZldGNoIG9yIFByb3h5IHN1cHBvcnQgcG9sbHlmaWxscyBtdXN0IGJlIHVzZWQ7XG4gICAgICB0aGUgcHJveHktcG9sbHlmaWxsIGlzIHVuYWJsZSB0byBwcm94eSBhbiBhdHRyaWJ1dGUgdW5sZXNzIGl0IGV4aXN0c1xuICAgICAgb24gdGhlIG9iamVjdCBiZWZvcmUgdGhlIFByb3h5IGlzIGNyZWF0ZWQuIFRoaXMgY2hhbmdlIGVuc3VyZXNcbiAgICAgIFJlc3BvbnNlLmJvZHlVc2VkIGV4aXN0cyBvbiB0aGUgaW5zdGFuY2UsIHdoaWxlIG1haW50YWluaW5nIHRoZVxuICAgICAgc2VtYW50aWMgb2Ygc2V0dGluZyBSZXF1ZXN0LmJvZHlVc2VkIGluIHRoZSBjb25zdHJ1Y3RvciBiZWZvcmVcbiAgICAgIF9pbml0Qm9keSBpcyBjYWxsZWQuXG4gICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1hc3NpZ25cbiAgICB0aGlzLmJvZHlVc2VkID0gdGhpcy5ib2R5VXNlZFxuICAgIHRoaXMuX2JvZHlJbml0ID0gYm9keVxuICAgIGlmICghYm9keSkge1xuICAgICAgdGhpcy5fbm9Cb2R5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gJydcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmJsb2IgJiYgQmxvYi5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgdGhpcy5fYm9keUJsb2IgPSBib2R5XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmZvcm1EYXRhICYmIEZvcm1EYXRhLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5Rm9ybURhdGEgPSBib2R5XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LnNlYXJjaFBhcmFtcyAmJiBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keS50b1N0cmluZygpXG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIHN1cHBvcnQuYmxvYiAmJiBpc0RhdGFWaWV3KGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIgPSBidWZmZXJDbG9uZShib2R5LmJ1ZmZlcilcbiAgICAgIC8vIElFIDEwLTExIGNhbid0IGhhbmRsZSBhIERhdGFWaWV3IGJvZHkuXG4gICAgICB0aGlzLl9ib2R5SW5pdCA9IG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlciAmJiAoQXJyYXlCdWZmZXIucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkgfHwgaXNBcnJheUJ1ZmZlclZpZXcoYm9keSkpKSB7XG4gICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIgPSBidWZmZXJDbG9uZShib2R5KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYm9keSlcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpKSB7XG4gICAgICBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgnKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QmxvYiAmJiB0aGlzLl9ib2R5QmxvYi50eXBlKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsIHRoaXMuX2JvZHlCbG9iLnR5cGUpXG4gICAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICB0aGlzLmJsb2IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZWplY3RlZCA9IGNvbnN1bWVkKHRoaXMpXG4gICAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdGVkXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9ib2R5QmxvYikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlCbG9iKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSkpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlGb3JtRGF0YSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgYmxvYicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5VGV4dF0pKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRoaXMuYXJyYXlCdWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICB2YXIgaXNDb25zdW1lZCA9IGNvbnN1bWVkKHRoaXMpXG4gICAgICBpZiAoaXNDb25zdW1lZCkge1xuICAgICAgICByZXR1cm4gaXNDb25zdW1lZFxuICAgICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodGhpcy5fYm9keUFycmF5QnVmZmVyKSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5idWZmZXIuc2xpY2UoXG4gICAgICAgICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnl0ZU9mZnNldCxcbiAgICAgICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlT2Zmc2V0ICsgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUFycmF5QnVmZmVyKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5ibG9iKSB7XG4gICAgICByZXR1cm4gdGhpcy5ibG9iKCkudGhlbihyZWFkQmxvYkFzQXJyYXlCdWZmZXIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgYXMgQXJyYXlCdWZmZXInKVxuICAgIH1cbiAgfVxuXG4gIHRoaXMudGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZWplY3RlZCA9IGNvbnN1bWVkKHRoaXMpXG4gICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gcmVqZWN0ZWRcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fYm9keUJsb2IpIHtcbiAgICAgIHJldHVybiByZWFkQmxvYkFzVGV4dCh0aGlzLl9ib2R5QmxvYilcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZWFkQXJyYXlCdWZmZXJBc1RleHQodGhpcy5fYm9keUFycmF5QnVmZmVyKSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlGb3JtRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIHRleHQnKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlUZXh0KVxuICAgIH1cbiAgfVxuXG4gIGlmIChzdXBwb3J0LmZvcm1EYXRhKSB7XG4gICAgdGhpcy5mb3JtRGF0YSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oZGVjb2RlKVxuICAgIH1cbiAgfVxuXG4gIHRoaXMuanNvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKEpTT04ucGFyc2UpXG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIVFRQIG1ldGhvZHMgd2hvc2UgY2FwaXRhbGl6YXRpb24gc2hvdWxkIGJlIG5vcm1hbGl6ZWRcbnZhciBtZXRob2RzID0gWydDT05ORUNUJywgJ0RFTEVURScsICdHRVQnLCAnSEVBRCcsICdPUFRJT05TJywgJ1BBVENIJywgJ1BPU1QnLCAnUFVUJywgJ1RSQUNFJ11cblxuZnVuY3Rpb24gbm9ybWFsaXplTWV0aG9kKG1ldGhvZCkge1xuICB2YXIgdXBjYXNlZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gIHJldHVybiBtZXRob2RzLmluZGV4T2YodXBjYXNlZCkgPiAtMSA/IHVwY2FzZWQgOiBtZXRob2Rcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJlcXVlc3QoaW5wdXQsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlcXVlc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGxlYXNlIHVzZSB0aGUgXCJuZXdcIiBvcGVyYXRvciwgdGhpcyBET00gb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi4nKVxuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgdmFyIGJvZHkgPSBvcHRpb25zLmJvZHlcblxuICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7XG4gICAgaWYgKGlucHV0LmJvZHlVc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKVxuICAgIH1cbiAgICB0aGlzLnVybCA9IGlucHV0LnVybFxuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBpbnB1dC5jcmVkZW50aWFsc1xuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbnB1dC5oZWFkZXJzKVxuICAgIH1cbiAgICB0aGlzLm1ldGhvZCA9IGlucHV0Lm1ldGhvZFxuICAgIHRoaXMubW9kZSA9IGlucHV0Lm1vZGVcbiAgICB0aGlzLnNpZ25hbCA9IGlucHV0LnNpZ25hbFxuICAgIGlmICghYm9keSAmJiBpbnB1dC5fYm9keUluaXQgIT0gbnVsbCkge1xuICAgICAgYm9keSA9IGlucHV0Ll9ib2R5SW5pdFxuICAgICAgaW5wdXQuYm9keVVzZWQgPSB0cnVlXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMudXJsID0gU3RyaW5nKGlucHV0KVxuICB9XG5cbiAgdGhpcy5jcmVkZW50aWFscyA9IG9wdGlvbnMuY3JlZGVudGlhbHMgfHwgdGhpcy5jcmVkZW50aWFscyB8fCAnc2FtZS1vcmlnaW4nXG4gIGlmIChvcHRpb25zLmhlYWRlcnMgfHwgIXRoaXMuaGVhZGVycykge1xuICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycylcbiAgfVxuICB0aGlzLm1ldGhvZCA9IG5vcm1hbGl6ZU1ldGhvZChvcHRpb25zLm1ldGhvZCB8fCB0aGlzLm1ldGhvZCB8fCAnR0VUJylcbiAgdGhpcy5tb2RlID0gb3B0aW9ucy5tb2RlIHx8IHRoaXMubW9kZSB8fCBudWxsXG4gIHRoaXMuc2lnbmFsID0gb3B0aW9ucy5zaWduYWwgfHwgdGhpcy5zaWduYWwgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoJ0Fib3J0Q29udHJvbGxlcicgaW4gZykge1xuICAgICAgdmFyIGN0cmwgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICByZXR1cm4gY3RybC5zaWduYWw7XG4gICAgfVxuICB9KCkpO1xuICB0aGlzLnJlZmVycmVyID0gbnVsbFxuXG4gIGlmICgodGhpcy5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMubWV0aG9kID09PSAnSEVBRCcpICYmIGJvZHkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb2R5IG5vdCBhbGxvd2VkIGZvciBHRVQgb3IgSEVBRCByZXF1ZXN0cycpXG4gIH1cbiAgdGhpcy5faW5pdEJvZHkoYm9keSlcblxuICBpZiAodGhpcy5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMubWV0aG9kID09PSAnSEVBRCcpIHtcbiAgICBpZiAob3B0aW9ucy5jYWNoZSA9PT0gJ25vLXN0b3JlJyB8fCBvcHRpb25zLmNhY2hlID09PSAnbm8tY2FjaGUnKSB7XG4gICAgICAvLyBTZWFyY2ggZm9yIGEgJ18nIHBhcmFtZXRlciBpbiB0aGUgcXVlcnkgc3RyaW5nXG4gICAgICB2YXIgcmVQYXJhbVNlYXJjaCA9IC8oWz8mXSlfPVteJl0qL1xuICAgICAgaWYgKHJlUGFyYW1TZWFyY2gudGVzdCh0aGlzLnVybCkpIHtcbiAgICAgICAgLy8gSWYgaXQgYWxyZWFkeSBleGlzdHMgdGhlbiBzZXQgdGhlIHZhbHVlIHdpdGggdGhlIGN1cnJlbnQgdGltZVxuICAgICAgICB0aGlzLnVybCA9IHRoaXMudXJsLnJlcGxhY2UocmVQYXJhbVNlYXJjaCwgJyQxXz0nICsgbmV3IERhdGUoKS5nZXRUaW1lKCkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPdGhlcndpc2UgYWRkIGEgbmV3ICdfJyBwYXJhbWV0ZXIgdG8gdGhlIGVuZCB3aXRoIHRoZSBjdXJyZW50IHRpbWVcbiAgICAgICAgdmFyIHJlUXVlcnlTdHJpbmcgPSAvXFw/L1xuICAgICAgICB0aGlzLnVybCArPSAocmVRdWVyeVN0cmluZy50ZXN0KHRoaXMudXJsKSA/ICcmJyA6ICc/JykgKyAnXz0nICsgbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuUmVxdWVzdC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMsIHtib2R5OiB0aGlzLl9ib2R5SW5pdH0pXG59XG5cbmZ1bmN0aW9uIGRlY29kZShib2R5KSB7XG4gIHZhciBmb3JtID0gbmV3IEZvcm1EYXRhKClcbiAgYm9keVxuICAgIC50cmltKClcbiAgICAuc3BsaXQoJyYnKVxuICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGJ5dGVzKSB7XG4gICAgICBpZiAoYnl0ZXMpIHtcbiAgICAgICAgdmFyIHNwbGl0ID0gYnl0ZXMuc3BsaXQoJz0nKVxuICAgICAgICB2YXIgbmFtZSA9IHNwbGl0LnNoaWZ0KCkucmVwbGFjZSgvXFwrL2csICcgJylcbiAgICAgICAgdmFyIHZhbHVlID0gc3BsaXQuam9pbignPScpLnJlcGxhY2UoL1xcKy9nLCAnICcpXG4gICAgICAgIGZvcm0uYXBwZW5kKGRlY29kZVVSSUNvbXBvbmVudChuYW1lKSwgZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSlcbiAgICAgIH1cbiAgICB9KVxuICByZXR1cm4gZm9ybVxufVxuXG5mdW5jdGlvbiBwYXJzZUhlYWRlcnMocmF3SGVhZGVycykge1xuICB2YXIgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcbiAgLy8gUmVwbGFjZSBpbnN0YW5jZXMgb2YgXFxyXFxuIGFuZCBcXG4gZm9sbG93ZWQgYnkgYXQgbGVhc3Qgb25lIHNwYWNlIG9yIGhvcml6b250YWwgdGFiIHdpdGggYSBzcGFjZVxuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMlxuICB2YXIgcHJlUHJvY2Vzc2VkSGVhZGVycyA9IHJhd0hlYWRlcnMucmVwbGFjZSgvXFxyP1xcbltcXHQgXSsvZywgJyAnKVxuICAvLyBBdm9pZGluZyBzcGxpdCB2aWEgcmVnZXggdG8gd29yayBhcm91bmQgYSBjb21tb24gSUUxMSBidWcgd2l0aCB0aGUgY29yZS1qcyAzLjYuMCByZWdleCBwb2x5ZmlsbFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ2l0aHViL2ZldGNoL2lzc3Vlcy83NDhcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzc1MVxuICBwcmVQcm9jZXNzZWRIZWFkZXJzXG4gICAgLnNwbGl0KCdcXHInKVxuICAgIC5tYXAoZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICByZXR1cm4gaGVhZGVyLmluZGV4T2YoJ1xcbicpID09PSAwID8gaGVhZGVyLnN1YnN0cigxLCBoZWFkZXIubGVuZ3RoKSA6IGhlYWRlclxuICAgIH0pXG4gICAgLmZvckVhY2goZnVuY3Rpb24obGluZSkge1xuICAgICAgdmFyIHBhcnRzID0gbGluZS5zcGxpdCgnOicpXG4gICAgICB2YXIga2V5ID0gcGFydHMuc2hpZnQoKS50cmltKClcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gcGFydHMuam9pbignOicpLnRyaW0oKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGhlYWRlcnMuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdSZXNwb25zZSAnICsgZXJyb3IubWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIHJldHVybiBoZWFkZXJzXG59XG5cbkJvZHkuY2FsbChSZXF1ZXN0LnByb3RvdHlwZSlcblxuZXhwb3J0IGZ1bmN0aW9uIFJlc3BvbnNlKGJvZHlJbml0LCBvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZXNwb25zZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQbGVhc2UgdXNlIHRoZSBcIm5ld1wiIG9wZXJhdG9yLCB0aGlzIERPTSBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLicpXG4gIH1cbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9XG4gIH1cblxuICB0aGlzLnR5cGUgPSAnZGVmYXVsdCdcbiAgdGhpcy5zdGF0dXMgPSBvcHRpb25zLnN0YXR1cyA9PT0gdW5kZWZpbmVkID8gMjAwIDogb3B0aW9ucy5zdGF0dXNcbiAgaWYgKHRoaXMuc3RhdHVzIDwgMjAwIHx8IHRoaXMuc3RhdHVzID4gNTk5KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJGYWlsZWQgdG8gY29uc3RydWN0ICdSZXNwb25zZSc6IFRoZSBzdGF0dXMgcHJvdmlkZWQgKDApIGlzIG91dHNpZGUgdGhlIHJhbmdlIFsyMDAsIDU5OV0uXCIpXG4gIH1cbiAgdGhpcy5vayA9IHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMFxuICB0aGlzLnN0YXR1c1RleHQgPSBvcHRpb25zLnN0YXR1c1RleHQgPT09IHVuZGVmaW5lZCA/ICcnIDogJycgKyBvcHRpb25zLnN0YXR1c1RleHRcbiAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKVxuICB0aGlzLnVybCA9IG9wdGlvbnMudXJsIHx8ICcnXG4gIHRoaXMuX2luaXRCb2R5KGJvZHlJbml0KVxufVxuXG5Cb2R5LmNhbGwoUmVzcG9uc2UucHJvdG90eXBlKVxuXG5SZXNwb25zZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBSZXNwb25zZSh0aGlzLl9ib2R5SW5pdCwge1xuICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgc3RhdHVzVGV4dDogdGhpcy5zdGF0dXNUZXh0LFxuICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHRoaXMuaGVhZGVycyksXG4gICAgdXJsOiB0aGlzLnVybFxuICB9KVxufVxuXG5SZXNwb25zZS5lcnJvciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UobnVsbCwge3N0YXR1czogMjAwLCBzdGF0dXNUZXh0OiAnJ30pXG4gIHJlc3BvbnNlLm9rID0gZmFsc2VcbiAgcmVzcG9uc2Uuc3RhdHVzID0gMFxuICByZXNwb25zZS50eXBlID0gJ2Vycm9yJ1xuICByZXR1cm4gcmVzcG9uc2Vcbn1cblxudmFyIHJlZGlyZWN0U3RhdHVzZXMgPSBbMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhdXG5cblJlc3BvbnNlLnJlZGlyZWN0ID0gZnVuY3Rpb24odXJsLCBzdGF0dXMpIHtcbiAgaWYgKHJlZGlyZWN0U3RhdHVzZXMuaW5kZXhPZihzdGF0dXMpID09PSAtMSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0YXR1cyBjb2RlJylcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwge3N0YXR1czogc3RhdHVzLCBoZWFkZXJzOiB7bG9jYXRpb246IHVybH19KVxufVxuXG5leHBvcnQgdmFyIERPTUV4Y2VwdGlvbiA9IGcuRE9NRXhjZXB0aW9uXG50cnkge1xuICBuZXcgRE9NRXhjZXB0aW9uKClcbn0gY2F0Y2ggKGVycikge1xuICBET01FeGNlcHRpb24gPSBmdW5jdGlvbihtZXNzYWdlLCBuYW1lKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZVxuICAgIHRoaXMubmFtZSA9IG5hbWVcbiAgICB2YXIgZXJyb3IgPSBFcnJvcihtZXNzYWdlKVxuICAgIHRoaXMuc3RhY2sgPSBlcnJvci5zdGFja1xuICB9XG4gIERPTUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSlcbiAgRE9NRXhjZXB0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERPTUV4Y2VwdGlvblxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2goaW5wdXQsIGluaXQpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIGluaXQpXG5cbiAgICBpZiAocmVxdWVzdC5zaWduYWwgJiYgcmVxdWVzdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuIHJlamVjdChuZXcgRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSlcbiAgICB9XG5cbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcblxuICAgIGZ1bmN0aW9uIGFib3J0WGhyKCkge1xuICAgICAgeGhyLmFib3J0KClcbiAgICB9XG5cbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgc3RhdHVzVGV4dDogeGhyLnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHBhcnNlSGVhZGVycyh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkgfHwgJycpXG4gICAgICB9XG4gICAgICAvLyBUaGlzIGNoZWNrIGlmIHNwZWNpZmljYWxseSBmb3Igd2hlbiBhIHVzZXIgZmV0Y2hlcyBhIGZpbGUgbG9jYWxseSBmcm9tIHRoZSBmaWxlIHN5c3RlbVxuICAgICAgLy8gT25seSBpZiB0aGUgc3RhdHVzIGlzIG91dCBvZiBhIG5vcm1hbCByYW5nZVxuICAgICAgaWYgKHJlcXVlc3QudXJsLmluZGV4T2YoJ2ZpbGU6Ly8nKSA9PT0gMCAmJiAoeGhyLnN0YXR1cyA8IDIwMCB8fCB4aHIuc3RhdHVzID4gNTk5KSkge1xuICAgICAgICBvcHRpb25zLnN0YXR1cyA9IDIwMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnMuc3RhdHVzID0geGhyLnN0YXR1cztcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMudXJsID0gJ3Jlc3BvbnNlVVJMJyBpbiB4aHIgPyB4aHIucmVzcG9uc2VVUkwgOiBvcHRpb25zLmhlYWRlcnMuZ2V0KCdYLVJlcXVlc3QtVVJMJylcbiAgICAgIHZhciBib2R5ID0gJ3Jlc3BvbnNlJyBpbiB4aHIgPyB4aHIucmVzcG9uc2UgOiB4aHIucmVzcG9uc2VUZXh0XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZXNvbHZlKG5ldyBSZXNwb25zZShib2R5LCBvcHRpb25zKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKCdOZXR3b3JrIHJlcXVlc3QgZmFpbGVkJykpXG4gICAgICB9LCAwKVxuICAgIH1cblxuICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKCdOZXR3b3JrIHJlcXVlc3QgdGltZWQgb3V0JykpXG4gICAgICB9LCAwKVxuICAgIH1cblxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZWplY3QobmV3IERPTUV4Y2VwdGlvbignQWJvcnRlZCcsICdBYm9ydEVycm9yJykpXG4gICAgICB9LCAwKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpeFVybCh1cmwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cmwgPT09ICcnICYmIGcubG9jYXRpb24uaHJlZiA/IGcubG9jYXRpb24uaHJlZiA6IHVybFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gdXJsXG4gICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9wZW4ocmVxdWVzdC5tZXRob2QsIGZpeFVybChyZXF1ZXN0LnVybCksIHRydWUpXG5cbiAgICBpZiAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ2luY2x1ZGUnKSB7XG4gICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ29taXQnKSB7XG4gICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoJ3Jlc3BvbnNlVHlwZScgaW4geGhyKSB7XG4gICAgICBpZiAoc3VwcG9ydC5ibG9iKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYidcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHN1cHBvcnQuYXJyYXlCdWZmZXJcbiAgICAgICkge1xuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJ1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpbml0ICYmIHR5cGVvZiBpbml0LmhlYWRlcnMgPT09ICdvYmplY3QnICYmICEoaW5pdC5oZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycyB8fCAoZy5IZWFkZXJzICYmIGluaXQuaGVhZGVycyBpbnN0YW5jZW9mIGcuSGVhZGVycykpKSB7XG4gICAgICB2YXIgbmFtZXMgPSBbXTtcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGluaXQuaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIG5hbWVzLnB1c2gobm9ybWFsaXplTmFtZShuYW1lKSlcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgbm9ybWFsaXplVmFsdWUoaW5pdC5oZWFkZXJzW25hbWVdKSlcbiAgICAgIH0pXG4gICAgICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAobmFtZXMuaW5kZXhPZihuYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdC5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0LnNpZ25hbCkge1xuICAgICAgcmVxdWVzdC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydFhocilcblxuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBET05FIChzdWNjZXNzIG9yIGZhaWx1cmUpXG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgIHJlcXVlc3Quc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRYaHIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIuc2VuZCh0eXBlb2YgcmVxdWVzdC5fYm9keUluaXQgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHJlcXVlc3QuX2JvZHlJbml0KVxuICB9KVxufVxuXG5mZXRjaC5wb2x5ZmlsbCA9IHRydWVcblxuaWYgKCFnLmZldGNoKSB7XG4gIGcuZmV0Y2ggPSBmZXRjaFxuICBnLkhlYWRlcnMgPSBIZWFkZXJzXG4gIGcuUmVxdWVzdCA9IFJlcXVlc3RcbiAgZy5SZXNwb25zZSA9IFJlc3BvbnNlXG59XG4iLCJpbXBvcnQge0Rhc2hSZW5kZXJlcn0gZnJvbSAnLi9EYXNoUmVuZGVyZXInO1xuaW1wb3J0ICcuL3V0aWxzL2NsaWVudHNpZGVGdW5jdGlvbnMnO1xuXG4vLyBtYWtlIERhc2hSZW5kZXJlciBnbG9iYWxseSBhdmFpbGFibGVcbndpbmRvdy5EYXNoUmVuZGVyZXIgPSBEYXNoUmVuZGVyZXI7XG4iXSwibmFtZXMiOlsiUHJvcFR5cGVzIiwiUmVhY3QiLCJ1c2VTdGF0ZSIsInVzZUVmZmVjdCIsIlByb3ZpZGVyIiwiU3RvcmUiLCJBcHBDb250YWluZXIiLCJnZXRDb25maWdGcm9tRE9NIiwiaW5pdGlhbGl6ZVdlYlNvY2tldCIsImRpc2Nvbm5lY3RXZWJTb2NrZXQiLCJBcHBQcm92aWRlciIsIl9yZWYiLCJfcmVmJGhvb2tzIiwiaG9va3MiLCJsYXlvdXRfcHJlIiwibGF5b3V0X3Bvc3QiLCJyZXF1ZXN0X3ByZSIsInJlcXVlc3RfcG9zdCIsImNhbGxiYWNrX3Jlc29sdmVkIiwicmVxdWVzdF9yZWZyZXNoX2p3dCIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsInN0b3JlIiwiX2NvbmZpZyR3ZWJzb2NrZXQiLCJfY29uZmlnJHdlYnNvY2tldDIiLCJfY29uZmlnJHdlYnNvY2tldDMiLCJjb25maWciLCJ3ZWJzb2NrZXQiLCJlbmFibGVkIiwidXJsIiwid29ya2VyX3VybCIsImZ1bGxDb25maWciLCJfb2JqZWN0U3ByZWFkIiwiZmV0Y2giLCJjcmVkZW50aWFscyIsImhlYWRlcnMiLCJBY2NlcHQiLCJjcmVhdGVFbGVtZW50IiwicHJvcFR5cGVzIiwic2hhcGUiLCJmdW5jIiwiYW55IiwiZmlsdGVyIiwibWFwIiwicGF0aCIsIlN0b3JlT2JzZXJ2ZXIiLCJfY3JlYXRlQ2xhc3MiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjayIsIl9kZWZpbmVQcm9wZXJ0eSIsIm9ic2VydmVyIiwiaW5wdXRzIiwiQXJyYXkiLCJpc0FycmF5IiwiRXJyb3IiLCJhZGQiLCJyZW1vdmUiLCJfX2ZpbmFsaXplX18iLCJfX2luaXRfXyIsIl90aGlzJF91bnN1YnNjcmliZSIsIl91bnN1YnNjcmliZSIsImNhbGwiLCJfc3RvcmUiLCJzdWJzY3JpYmUiLCJub3RpZnkiLCJfb2JzZXJ2ZXJzIiwiZm9yRWFjaCIsIm8iLCJsYXN0U3RhdGUiLCJwdXNoIiwiaW5wdXRQYXRocyIsInAiLCJzcGxpdCIsInRyaWdnZXJlZCIsInN0YXRlIiwiZ2V0U3RhdGUiLCJpIiwic3BsaWNlIiwiZmluZEluZGV4IiwiZGVmYXVsdCIsImUiLCJ0IiwiciIsIlN5bWJvbCIsIm4iLCJpdGVyYXRvciIsInRvU3RyaW5nVGFnIiwiYyIsInByb3RvdHlwZSIsIkdlbmVyYXRvciIsInUiLCJPYmplY3QiLCJjcmVhdGUiLCJfcmVnZW5lcmF0b3JEZWZpbmUyIiwiZiIsInkiLCJHIiwidiIsImEiLCJkIiwiYmluZCIsImxlbmd0aCIsImwiLCJUeXBlRXJyb3IiLCJkb25lIiwidmFsdWUiLCJyZXR1cm4iLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImRpc3BsYXlOYW1lIiwiX3JlZ2VuZXJhdG9yIiwidyIsIm0iLCJkZWZpbmVQcm9wZXJ0eSIsIl9yZWdlbmVyYXRvckRlZmluZSIsIl9pbnZva2UiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3VtZW50cyIsImFwcGx5IiwiX25leHQiLCJfdGhyb3ciLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJfYXJyYXlXaXRob3V0SG9sZXMiLCJfaXRlcmFibGVUb0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiX25vbkl0ZXJhYmxlU3ByZWFkIiwiZnJvbSIsIl9hcnJheUxpa2VUb0FycmF5IiwiX2FycmF5V2l0aEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheUxpbWl0IiwiX25vbkl0ZXJhYmxlUmVzdCIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJ0ZXN0IiwibmV4dCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfdG9Qcm9wZXJ0eUtleSIsIl90b1ByaW1pdGl2ZSIsIl90eXBlb2YiLCJ0b1ByaW1pdGl2ZSIsIlN0cmluZyIsIk51bWJlciIsImNvbmNhdCIsImZsYXR0ZW4iLCJpbnRlcnNlY3Rpb24iLCJtZXJnZURlZXBSaWdodCIsInBpY2siLCJwbHVjayIsInZhbHVlcyIsInRvUGFpcnMiLCJ6aXAiLCJhc3NvY1BhdGgiLCJTVEFUVVMiLCJKV1RfRVhQSVJFRF9NRVNTQUdFIiwiTUFYX0FVVEhfUkVUUklFUyIsIkNhbGxiYWNrQWN0aW9uVHlwZSIsIkNhbGxiYWNrQWdncmVnYXRlQWN0aW9uVHlwZSIsImlzTXVsdGlWYWx1ZWQiLCJzdHJpbmdpZnlJZCIsImlzTXVsdGlPdXRwdXRQcm9wIiwidXJsQmFzZSIsImdldENTUkZIZWFkZXIiLCJkaXNwYXRjaEVycm9yIiwic2V0UGF0aHMiLCJjcmVhdGVBY3Rpb24iLCJhZGRIdHRwSGVhZGVycyIsIm5vdGlmeU9ic2VydmVycyIsInVwZGF0ZVByb3BzIiwicGFyc2VQYXRjaFByb3BzIiwiY29tcHV0ZVBhdGhzIiwiZ2V0UGF0aCIsInJlcXVlc3REZXBlbmRlbmNpZXMiLCJsb2FkTGlicmFyeSIsInBhcnNlUE1DSWQiLCJyZXBsYWNlUE1DIiwibG9hZGVkIiwibG9hZGluZyIsImdldENvbXBvbmVudExheW91dCIsImdldFdvcmtlckNsaWVudCIsImlzV2ViU29ja2V0RW5hYmxlZCIsImlzV2ViU29ja2V0QXZhaWxhYmxlIiwiYWRkQmxvY2tlZENhbGxiYWNrcyIsIkFkZEJsb2NrZWQiLCJhZGRDb21wbGV0ZWRDYWxsYmFja3MiLCJBZGRDb21wbGV0ZWQiLCJhZGRFeGVjdXRlZENhbGxiYWNrcyIsIkFkZEV4ZWN1dGVkIiwiYWRkRXhlY3V0aW5nQ2FsbGJhY2tzIiwiQWRkRXhlY3V0aW5nIiwiYWRkUHJpb3JpdGl6ZWRDYWxsYmFja3MiLCJBZGRQcmlvcml0aXplZCIsImFkZFJlcXVlc3RlZENhbGxiYWNrcyIsIkFkZFJlcXVlc3RlZCIsImFkZFN0b3JlZENhbGxiYWNrcyIsIkFkZFN0b3JlZCIsImFkZFdhdGNoZWRDYWxsYmFja3MiLCJBZGRXYXRjaGVkIiwicmVtb3ZlRXhlY3V0ZWRDYWxsYmFja3MiLCJSZW1vdmVFeGVjdXRlZCIsInJlbW92ZUJsb2NrZWRDYWxsYmFja3MiLCJSZW1vdmVCbG9ja2VkIiwicmVtb3ZlRXhlY3V0aW5nQ2FsbGJhY2tzIiwiUmVtb3ZlRXhlY3V0aW5nIiwicmVtb3ZlUHJpb3JpdGl6ZWRDYWxsYmFja3MiLCJSZW1vdmVQcmlvcml0aXplZCIsInJlbW92ZVJlcXVlc3RlZENhbGxiYWNrcyIsIlJlbW92ZVJlcXVlc3RlZCIsInJlbW92ZVN0b3JlZENhbGxiYWNrcyIsIlJlbW92ZVN0b3JlZCIsInJlbW92ZVdhdGNoZWRDYWxsYmFja3MiLCJSZW1vdmVXYXRjaGVkIiwiYWdncmVnYXRlQ2FsbGJhY2tzIiwiQWdncmVnYXRlIiwidXBkYXRlUmVzb3VyY2VVc2FnZSIsImFkZENhbGxiYWNrSm9iIiwicmVtb3ZlQ2FsbGJhY2tKb2IiLCJzZXRDYWxsYmFja0pvYk91dGRhdGVkIiwidW53cmFwSWZOb3RNdWx0aSIsInBhdGhzIiwiaWRQcm9wcyIsInNwZWMiLCJhbnlWYWxzIiwiZGVwVHlwZSIsIm1zZyIsImFsbG93X29wdGlvbmFsIiwiaXNTdHIiLCJpZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJwcm9wZXJ0eSIsInN0cnMiLCJqb2luIiwiZmlsbFZhbHMiLCJsYXlvdXQiLCJjYiIsInNwZWNzIiwiYWxsb3dBbGxNaXNzaW5nIiwidW5kZWZpbmVkIiwiZ2V0dGVyIiwiZ2V0SW5wdXRzIiwiZXJyb3JzIiwiZW1wdHlNdWx0aVZhbHVlcyIsImlucHV0VmFscyIsImlucHV0TGlzdCIsIl91bndyYXBJZk5vdE11bHRpIiwicGF0aF8iLCJfdW53cmFwSWZOb3RNdWx0aTIiLCJpbnB1dEVycm9yIiwicmVmRXJyIiwiZXJyIiwiaW5kZXhPZiIsImNvbnNvbGUiLCJlcnJvciIsIm9ianMiLCJSZWZlcmVuY2VFcnJvciIsImdldFZhbHMiLCJpbnB1dCIsInppcElmQXJyYXkiLCJiIiwid2luZG93IiwiZGFzaF9jbGllbnRzaWRlIiwibm9fdXBkYXRlIiwiY2xlYW5PdXRwdXRQcm9wIiwiaGFuZGxlQ2xpZW50c2lkZSIsIl94IiwiX3gyIiwiX3gzIiwiX3g0IiwiX2hhbmRsZUNsaWVudHNpZGUiLCJfY2FsbGVlMiIsImRpc3BhdGNoIiwiY2xpZW50c2lkZV9mdW5jdGlvbiIsInBheWxvYWQiLCJkYyIsIm91dHB1dHMiLCJyZXF1ZXN0VGltZSIsImlucHV0RGljdCIsInN0YXRlRGljdCIsInJlc3VsdCIsInN0YXR1cyIsIl9kYyRuYW1lc3BhY2UiLCJfcmV0dXJuVmFsdWUiLCJuYW1lc3BhY2UiLCJmdW5jdGlvbl9uYW1lIiwiYXJncyIsInJldHVyblZhbHVlIiwidG90YWxUaW1lIiwicmVzb3VyY2VzIiwiX3Q0IiwiX2NvbnRleHQzIiwiZGVzY3JpcHRpb24iLCJEYXRlIiwibm93IiwiaW5wdXRzVG9EaWN0IiwiT0siLCJjYWxsYmFja19jb250ZXh0IiwiY2hhbmdlZFByb3BJZHMiLCJwcm9wX2lkIiwidHJpZ2dlcmVkX2lkIiwiZ2V0VHJpZ2dlcmVkSWQiLCJpbnB1dHNfbGlzdCIsInN0YXRlc19saXN0Iiwic3RhdGVzIiwib3V0cHV0c19saXN0IiwiX3JlZjEwIiwiX3JlZjExIiwib3V0aSIsInJldGkiLCJfcmVmMTIiLCJfcmVmMTMiLCJvdXRpaiIsInJldGlqIiwiaWRTdHIiLCJkYXRhRm9ySWQiLCJQcmV2ZW50VXBkYXRlIiwiUFJFVkVOVF9VUERBVEUiLCJDTElFTlRTSURFX0VSUk9SIiwiX19kYXNoX3NlcnZlciIsIl9fZGFzaF9jbGllbnQiLCJfX2Rhc2hfdXBsb2FkIiwiX19kYXNoX2Rvd25sb2FkIiwidWkiLCJvdXRwdXQiLCJ1c2FnZSIsInVwZGF0ZUNvbXBvbmVudCIsImNvbXBvbmVudF9pZCIsInByb3BzIiwiX2dldFN0YXRlIiwiY29tcG9uZW50UGF0aCIsInN1cHByZXNzX2NhbGxiYWNrX2V4Y2VwdGlvbnMiLCJpdGVtcGF0aCIsInJlbmRlclR5cGUiLCJzaWRlVXBkYXRlIiwicmVkdWNlIiwiYWNjIiwiX3JlZjIiLCJfcmVmMyIsImNvbXBvbmVudElkIiwicHJvcE5hbWUiLCJyZXBsYWNlZElkcyIsInN0YXJ0c1dpdGgiLCJfcGFyc2VQTUNJZCIsIl9wYXJzZVBNQ0lkMiIsImluY2x1ZGVzIiwiX2lkJHNwbGl0IiwiX2lkJHNwbGl0MiIsInJlcCIsIl9yZWY0IiwiX29sZENvbXBvbmVudCIsIl9yZWY1Iiwib2xkQ29tcG9uZW50Iiwib2xkUHJvcHMiLCJwYXRjaGVkUHJvcHMiLCJldmVudHMiLCJoYW5kbGVTZXJ2ZXJzaWRlIiwiYmFja2dyb3VuZCIsImFkZGl0aW9uYWxBcmdzIiwicnVubmluZyIsImJvZHkiLCJjYWNoZUtleSIsImpvYiIsInJ1bm5pbmdPZmYiLCJwcm9ncmVzc0RlZmF1bHQiLCJtb3JlQXJncyIsImZldGNoQ2FsbGJhY2siLCJuZXdCb2R5IiwiYWRkQXJnIiwiZGVsaW0iLCJ0bXBCb2R5IiwicGFyc2UiLCJfcmVmNiIsIl9yZWY3Iiwia2V5IiwiX3JlZjgiLCJfcmVmOSIsIl8iLCJfXyIsInNpbmdsZSIsIm1ldGhvZCIsInJlamVjdCIsImhhbmRsZU91dHB1dCIsInJlcyIsImNhbGxiYWNrSm9iIiwiY2FsbGJhY2tKb2JzIiwib3V0ZGF0ZWQiLCJqb2JJZCIsInJlY29yZFByb2ZpbGUiLCJnZXQiLCJ0aW1pbmdIZWFkZXJzIiwiaGVhZGVyIiwiZHVyIiwibWF0Y2giLCJmaW5pc2hMaW5lIiwiZGF0YSIsIm11bHRpIiwicmVzcG9uc2UiLCJzdWJzdHIiLCJsYXN0SW5kZXhPZiIsImNvbXBsZXRlSm9iIiwianNvbiIsImpvYkluZm8iLCJjYW5jZWxJbnB1dHMiLCJjYW5jZWwiLCJwcm9ncmVzcyIsImRpc3QiLCJhbGwiLCJzZXRUaW1lb3V0IiwiaGFuZGxlIiwiaW50ZXJ2YWwiLCJoYW5kbGVFcnJvciIsIk5PX1JFU1BPTlNFIiwiaGFuZGxlV2Vic29ja2V0Q2FsbGJhY2siLCJfeDUiLCJfeDYiLCJfeDciLCJfeDgiLCJfeDkiLCJfaGFuZGxlV2Vic29ja2V0Q2FsbGJhY2siLCJfY2FsbGVlMyIsIndvcmtlckNsaWVudCIsImNhbGxiYWNrRGF0YSIsIl9yZWYxNCIsImNhbGxiYWNrUmVzcG9uc2UiLCJfdG90YWxUaW1lIiwiX3Q1IiwiX2NvbnRleHQ0IiwiZW5zdXJlQ29ubmVjdGVkIiwic2VuZENhbGxiYWNrIiwibWVzc2FnZSIsImlucHV0c2kiLCJpaSIsIl9pbnB1dHNpJGlpJHZhbHVlIiwiaWRfc3RyIiwiX2lucHV0c19saXN0JGkkdmFsdWUiLCJ0cmlnIiwic3Vic3RyaW5nIiwiZXhlY3V0ZUNhbGxiYWNrIiwiX3JlZjAiLCJhbGxPdXRwdXRzIiwiX2NiJGNhbGxiYWNrIiwiY2FsbGJhY2siLCJkeW5hbWljX2NyZWF0b3IiLCJpblZhbHMiLCJleGVjdXRpb25Qcm9taXNlIiwib3V0cHV0RXJyb3JzIiwib3V0IiwiX3Vud3JhcElmTm90TXVsdGkzIiwiX3Vud3JhcElmTm90TXVsdGk0IiwiZXJyaSIsIl9fZXhlY3V0ZSIsIl9yZWYxIiwiX2NhbGxlZSIsImxvYWRpbmdPdXRwdXRzIiwicGFyc2VkQ2hhbmdlZFByb3BzSWRzIiwiY3VycmVudExheW91dCIsIm5ld0NvbmZpZyIsIm5ld0hlYWRlcnMiLCJsYXN0RXJyb3IiLCJqc29uT3V0cHV0IiwidXNlV2ViU29ja2V0IiwiX2xvb3AiLCJfcmV0IiwicmV0cnkiLCJfdDIiLCJfdDMiLCJfY29udGV4dDIiLCJfb3V0JHByb3BlcnR5IiwicHJvcElkIiwib3V0cHV0UGF0aCIsImRhdGFQYXRoIiwib3V0cHV0VmFsdWUiLCJuZXdQcm9wcyIsImludGVyIiwiX2RhdGEiLCJfY3VycmVudExheW91dCIsIm9sZEp3dCIsIm5ld0p3dCIsIl90IiwiX2NvbnRleHQiLCJVTkFVVEhPUklaRUQiLCJCQURfUkVRVUVTVCIsInRleHQiLCJBdXRob3JpemF0aW9uIiwiX3JlZ2VuZXJhdG9yVmFsdWVzIiwibmV3Q2IiLCJhc3NvYyIsImRpZmZlcmVuY2UiLCJpc0VtcHR5IiwibWVyZ2VXaXRoIiwicGFydGl0aW9uIiwicGlja0J5IiwiemlwT2JqIiwiYWRkQWxsUmVzb2x2ZWRGcm9tT3V0cHV0cyIsImdldEFueVZhbHMiLCJnZXRVbmZpbHRlcmVkTGF5b3V0Q2FsbGJhY2tzIiwiaWRNYXRjaCIsInNwbGl0SWRBbmRQcm9wIiwiRElSRUNUIiwiSU5ESVJFQ1QiLCJtZXJnZU1heCIsIk1hdGgiLCJtYXgiLCJjb21iaW5lSWRBbmRQcm9wIiwiZ2V0Q2FsbGJhY2tzQnlJbnB1dCIsImdyYXBocyIsInByb3AiLCJjaGFuZ2VUeXBlIiwid2l0aFByaW9yaXR5IiwibWF0Y2hlcyIsImlkQW5kUHJvcCIsImNhbGxiYWNrcyIsImlucHV0TWFwIiwicmVzb2x2ZURlcHMiLCJfa2V5cyIsInNvcnQiLCJ2YWxzIiwia2V5U3RyIiwicGF0dGVybnMiLCJpbnB1dFBhdHRlcm5zIiwicGF0dGVybiIsInRyaWdnZXJBbnlWYWxzIiwicHJpb3JpdHkiLCJnZXRQcmlvcml0eSIsInRvdWNoZWRPdXRwdXRzIiwidG91Y2hlZENiSWRzIiwidG91Y2hlZCIsInJlc29sdmVkSWQiLCJnZXRPdXRwdXRzIiwidW5zaGlmdCIsIm1pbiIsImdldEFsbFN1YnNlcXVlbnRPdXRwdXRzRm9yQ2FsbGJhY2siLCJnZXRSZWFkeUNhbGxiYWNrcyIsImNhbmRpZGF0ZXMiLCJvdXRwdXRzTWFwIiwiYWxsVG91Y2hlZE91dHB1dHMiLCJhc3NpZ24iLCJkaWZmZXJlbmNlQmFzZWRPbklkIiwic29tZSIsImNicCIsImdldExheW91dENhbGxiYWNrcyIsIm9wdGlvbnMiLCJleGNsdXNpb25zIiwiX3BhcnRpdGlvbiIsIl9wYXJ0aXRpb24yIiwiaW5jbHVkZWQiLCJleGNsdWRlZCIsImZpbHRlclJvb3QiLCJyb290SWQiLCJwcmV2aW91cyIsImV4ZWN1dGlvbkdyb3VwIiwicmFuZG9tIiwiZ2V0VW5pcXVlSWRlbnRpZmllciIsIl9yZWY2JGNhbGxiYWNrIiwiaWRQYXJ0cyIsImluY2x1ZGVPYnNlcnZlcnMiLCJwcm9wZXJ0aWVzIiwibWFrZVJlc29sdmVkQ2FsbGJhY2siLCJpbml0aWFsQ2FsbCIsInBydW5lQ2FsbGJhY2tzIiwiX3BhcnRpdGlvbjMiLCJfcGFydGl0aW9uNCIsInJlbW92ZWQiLCJfcGFydGl0aW9uNSIsIl9wYXJ0aXRpb242IiwibW9kaWZpZWQiLCJhZGRlZCIsInJlZktleXMiLCJyZWZWYWxzIiwicmVmUGF0dGVyblZhbHMiLCJpZFBhdHRlcm4iLCJwYXR0ZXJuVmFscyIsImtleVBhdGhzIiwiSXNMb2FkaW5nQWN0aW9uVHlwZSIsInNldElzTG9hZGluZyIsIlNldCIsImFwcGVuZCIsImRpc3NvY1BhdGgiLCJlbXB0eSIsImVxdWFscyIsImhhcyIsImluc2VydCIsImlzIiwicHJlcGVuZCIsInJldmVyc2UiLCJpc1BhdGNoIiwib2JqIiwiZ2V0TG9jYXRpb25JbmRleCIsImdldExvY2F0aW9uUGF0aCIsImxvY2F0aW9uIiwiY3VycmVudCIsIlBhdGNoQnVpbGRlciIsIm9wZXJhdGlvbnMiLCJvcGVyYXRpb24iLCJwYXJhbXMiLCJtZXJnZSIsImV4dGVuZCIsImRlbGV0ZSIsImluZGV4Iiwic3ViIiwibXVsIiwiZGl2IiwiY2xlYXIiLCJidWlsZCIsIl9fZGFzaF9wYXRjaF91cGRhdGUiLCJwYXRjaEhhbmRsZXJzIiwiQXNzaWduIiwicGF0Y2hPcGVyYXRpb24iLCJNZXJnZSIsInByZXYiLCJFeHRlbmQiLCJEZWxldGUiLCJJbnNlcnQiLCJBcHBlbmQiLCJQcmVwZW5kIiwiQWRkIiwiU3ViIiwiTXVsIiwiRGl2IiwiQ2xlYXIiLCJSZXZlcnNlIiwiUmVtb3ZlIiwiaXRlbSIsImhhbmRsZVBhdGNoIiwicHJldmlvdXNWYWx1ZSIsInBhdGNoVmFsdWUiLCJyZWR1Y2VkVmFsdWUiLCJwYXRjaCIsImhhbmRsZXIiLCJwcmV2aW91c1Byb3BzIiwiX2kiLCJfT2JqZWN0JGtleXMiLCJ2YWwiLCJkaXNzb2MiLCJnZXRBbGxQTUNJZHMiLCJ0cmlnZ2VyS2V5Iiwia2V5c09mSWRzIiwiaWRLZXkiLCJleHRyYXMiLCJyZXBsYWNlZCIsInRyaWdnZXJWYWx1ZSIsImJhdGNoIiwic2V0R3JhcGhzIiwiYXBpVGh1bmsiLCJyZXNldCIsImNvbmZpZ0VsZW1lbnQiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwidGV4dENvbnRlbnQiLCJEYXNoQ29udGV4dCIsInVzZURhc2hDb250ZXh0IiwiZ2V0U3RvcmVzIiwiRXh0ZXJuYWxXcmFwcGVyIiwiRGV2dG9vbENvbnRleHQiLCJ1c2VEZXZ0b29sIiwidXNlRGV2dG9vbE1lbnVCdXR0b25DbGFzc05hbWUiLCJnZXRMYXlvdXQiLCJjb21wb25lbnRQYXRoT3JJZCIsImRzIiwiX2RzJHkkZ2V0U3RhdGUiLCJkYXNoX2NvbXBvbmVudF9hcGkiLCJkZXZ0b29sIiwidXBkYXRlVGl0bGUiLCJpc0xvYWRpbmciLCJ1cGRhdGVfdGl0bGUiLCJ0aXRsZSIsIm11dGF0aW9uT2JzZXJ2ZXIiLCJfZ2V0U3RhdGUyIiwiX29ic2VydmVyJG11dGF0aW9uT2JzIiwiZGlzY29ubmVjdCIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJxdWVyeVNlbGVjdG9yIiwib2JzZXJ2ZSIsInN1YnRyZWUiLCJjaGlsZExpc3QiLCJhdHRyaWJ1dGVzIiwiY2hhcmFjdGVyRGF0YSIsImlzTmlsIiwicGF0aE9yIiwicGFyc2VJZldpbGRjYXJkIiwiaGFuZGxlQXN5bmNFcnJvciIsImFwcGx5UGVyc2lzdGVuY2UiLCJwcnVuZVBlcnNpc3RlbmNlIiwiZXhlY3V0ZWQiLCJhcHBseVByb3BzIiwidXBkYXRlZFByb3BzIiwiX2FwcGx5UGVyc2lzdGVuY2UiLCJzb3VyY2UiLCJyZXF1ZXN0ZWRDYWxsYmFja3MiLCJzdG9yZWRDYWxsYmFja3MiLCJfY2IkcHJlZGVjZXNzb3JzIiwicHJlZGVjZXNzb3JzIiwiZXhlY3V0aW9uUmVzdWx0IiwiZW50cmllcyIsInBhcnNlZElkIiwiX2dldFN0YXRlMyIsIm9sZExheW91dCIsIm9sZFBhdGhzIiwiYXBwbGllZFByb3BzIiwicmNiIiwiYmFzZVBhdGgiLCJvbGRPYmoiLCJjaGlsZHJlblByb3BzIiwidHlwZSIsIl9fZGFzaHByaXZhdGVfY2hpbGRyZW5Qcm9wcyIsImhhbmRsZVBhdGhzIiwiY2hpbGRyZW4iLCJvbGRDaGlsZHJlbiIsIm9sZENoaWxkcmVuUGF0aCIsIm9QYXRocyIsImNodW5rUGF0aCIsInJlbW92ZWRBcnJheUlucHV0c09ubHkiLCJuZXdQYXRocyIsInJlY29tcHV0ZWQiLCJjaGlsZHJlblByb3AiLCJfY2hpbGRyZW5Qcm9wJHNwbGl0JG0iLCJfY2hpbGRyZW5Qcm9wJHNwbGl0JG0yIiwiZnJvbnRQYXRoIiwiZnJvbnRPYmoiLCJjaGlsZHJlblByb3BQYXRoIiwiYWRkZWRQcm9wcyIsImsiLCJfZ2V0U3RhdGU0IiwiY3VycmVudEdyYXBocyIsImV4ZWN1dGlvbk1ldGEiLCJhbGxQcm9wcyIsIm5vX291dHB1dCIsImlucHRzIiwibnMiLCJmbiIsImZpbmQiLCJnZXRBcHBTdGF0ZSIsImV4ZWN1dGluZyIsImRlZmVycmVkIiwic2tpcHBlZE9yUmVhZHkiLCJ3YXRjaGVkIiwiYXBwTGlmZWN5Y2xlIiwiY3VycmVudENiIiwiX2NiIiwiZ2V0UGVuZGluZ0NhbGxiYWNrcyIsInBlbmRpbmdDYWxsYmFja3MiLCJub25QZXJzaXN0ZW50Q2FsbGJhY2tzIiwicGVyc2lzdGVudCIsIkJvb2xlYW4iLCJpc0FwcFJlYWR5Iiwic29ydFByaW9yaXR5IiwiYzEiLCJjMiIsIl9jMSRwcmlvcml0eSIsIl9jMiRwcmlvcml0eSIsImdldFN0YXNoIiwiZmxhdE91dHB1dHMiLCJhbGxQcm9wSWRzIiwicmVxT3V0IiwiaWRPdXQiLCJnZXRJZHMiLCJpdGVtcyIsInVuaXF1ZUlkcyIsIk1hcCIsInVuaXF1ZUl0ZW1zIiwiX29ic2VydmVyIiwiX2dldFN0YXRlJGNhbGxiYWNrcyIsInByaW9yaXRpemVkIiwiYXZhaWxhYmxlIiwic3luY0NhbGxiYWNrcyIsImFzeW5jQ2FsbGJhY2tzIiwicGlja2VkU3luY0NhbGxiYWNrcyIsInBpY2tlZEFzeW5jQ2FsbGJhY2tzIiwiaXNSZWFkeSIsImJsb2NrZWQiLCJleGVjdXRpbmdDYWxsYmFjayIsImdyb3VwQnkiLCJtZXJnZUxlZnQiLCJ3YWl0Iiwic3RvcmVkIiwicmVxdWVzdGVkIiwiaW5pdGlhbFJlcXVlc3RlZCIsInJDaXJjdWxhcnMiLCJyRHVwbGljYXRlcyIsInJNZXJnZWREdXBsaWNhdGVzIiwicER1cGxpY2F0ZXMiLCJiRHVwbGljYXRlcyIsImVEdXBsaWNhdGVzIiwid0R1cGxpY2F0ZXMiLCJfcHJ1bmVDYWxsYmFja3MiLCJyQWRkZWQiLCJyUmVtb3ZlZCIsIl9wcnVuZUNhbGxiYWNrczIiLCJwQWRkZWQiLCJwUmVtb3ZlZCIsIl9wcnVuZUNhbGxiYWNrczMiLCJiQWRkZWQiLCJiUmVtb3ZlZCIsIl9wcnVuZUNhbGxiYWNrczQiLCJlQWRkZWQiLCJlUmVtb3ZlZCIsIl9wcnVuZUNhbGxiYWNrczUiLCJ3QWRkZWQiLCJ3UmVtb3ZlZCIsInJlYWR5Q2FsbGJhY2tzIiwib2xkQmxvY2tlZCIsIm5ld0Jsb2NrZWQiLCJwZW5kaW5nR3JvdXBzIiwiZHJvcHBlZCIsImdyb3VwIiwiaW5pdGlhbCIsImdyb3VwV2l0aG91dEluaXRpYWwiLCJleGciLCJyZWFkeUNhbGxiYWNrIiwiYmxvY2tlZEJ5QXNzdW1wdGlvbnMiLCJfY2IkcHJlZGVjZXNzb3JzMiIsImdjYiIsInVwZGF0ZWQiLCJudWxsR3JvdXBDYWxsYmFja3MiLCJncm91cENhbGxiYWNrcyIsImV4ZWN1dGlvbkdyb3VwcyIsImV4ZWN1dGlvbkdyb3VwQ2FsbGJhY2tzIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJfbiIsIkYiLCJzIiwicGFyc2VDb21wb25lbnRJZCIsImVuZHNXaXRoIiwiX3VudXNlZCIsIl9pbml0aWFsaXplV2ViU29ja2V0Iiwid3NBdmFpbGFibGUiLCJwcm9jZXNzU2V0UHJvcHMiLCJ3YXNEaXNjb25uZWN0ZWQiLCJ3c1VybCIsIlNoYXJlZFdvcmtlciIsIndhcm4iLCJyYXdQcm9wcyIsInByb2Nlc3NlZFByb3BzIiwidXBkYXRlZFN0YXRlIiwib25TZXRQcm9wcyIsIm9uU2V0UHJvcHNCYXRjaCIsInBheWxvYWRzIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJvbkdldFByb3BzUmVxdWVzdCIsInJlcXVlc3RJZCIsImNvbXBvbmVudFByb3BzIiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsInNlbmRHZXRQcm9wc1Jlc3BvbnNlIiwib25Db25uZWN0ZWQiLCJsb2ciLCJwZXJzaXN0ZW50Q2FsbGJhY2tzIiwibm9PdXRwdXQiLCJyZXNvbHZlZCIsIm9uRGlzY29ubmVjdGVkIiwicmVhc29uIiwib25FcnJvciIsImNvZGUiLCJidWlsZFdlYlNvY2tldFVybCIsImNvbm5lY3QiLCJpbmFjdGl2aXR5X3RpbWVvdXQiLCJhZGRFdmVudExpc3RlbmVyIiwidmlzaWJpbGl0eVN0YXRlIiwiY29ubmVjdGVkIiwibm90aWZ5VGFiVmlzaWJsZSIsImNhdGNoIiwid3NQcm90b2NvbCIsInByb3RvY29sIiwiaG9zdCIsInNldEpvYiIsInJlbW92ZUpvYiIsInNldE91dGRhdGVkIiwiYWN0aW9uIiwiREVGQVVMVF9TVEFURSIsImNvbXBsZXRlZCIsInRyYW5zZm9ybXMiLCJmaWVsZHMiLCJtdXRhdGVDb21wbGV0ZWQiLCJtdXRhdGVDYWxsYmFja3MiLCJ0cmFuc2Zvcm0iLCJmaWVsZCIsImxvYWQiLCJsb2FkUGF0aCIsIm9uY2UiLCJjcmVhdGVTdG9yZSIsImFwcGx5TWlkZGxld2FyZSIsInRodW5rIiwiY3JlYXRlUmVkdWNlciIsImRvY3VtZW50VGl0bGUiLCJleGVjdXRlZENhbGxiYWNrcyIsImV4ZWN1dGluZ0NhbGxiYWNrcyIsInByaW9yaXRpemVkQ2FsbGJhY2tzIiwiUmVuZGVyZXJTdG9yZSIsInN0b3JlT2JzZXJ2ZXIiLCJyZWR1Y2VyIiwibWlkZGxld2FyZSIsIl9fc3RvcmUiLCJzZXRTdG9yZSIsImRhc2hfc3RvcmVzIiwic2V0T2JzZXJ2ZXJzIiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwiY3JlYXRlQXBwU3RvcmUiLCJyZWR1eERURUMiLCJfX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9DT01QT1NFX18iLCJhY3Rpb25zRGVueWxpc3QiLCJtb2R1bGUiLCJob3QiLCJhY2NlcHQiLCJuZXh0Um9vdFJlZHVjZXIiLCJyZXF1aXJlIiwicmVwbGFjZVJlZHVjZXIiLCJpbml0aWFsaXplU3RvcmUiLCJvbWl0IiwiX0FycmF5Iiwic2V0X3Byb3BzIiwiaWRPclBhdGgiLCJfZHMkeSIsImludmFsaWRQcm90b2NvbHMiLCJuZXdMaW5lcyIsImN0cmxDaGFycyIsImh0bWxFbnRpdGllcyIsImNsZWFuX3VybCIsImZhbGxiYWNrIiwiY2xlYW5lZCIsInJlcGxhY2UiLCJkZWMiLCJmcm9tQ2hhckNvZGUiLCJ0cmltIiwicmVzb3VyY2UiLCJwcm9tIiwiaGVhZCIsImVsZW1lbnQiLCJzcmMiLCJhc3luYyIsIm9ubG9hZCIsIm9uZXJyb3IiLCJhcHBlbmRDaGlsZCIsImhyZWYiLCJyZWwiLCJjYWNoZWRSZW5kZXJlcklkIiwiZ2V0UmVuZGVyZXJJZCIsImNyeXB0byIsInJhbmRvbVVVSUQiLCJzdG9yZXMiLCJkdXJhdGlvbiIsIl9yZXNvbHZlIiwiX2RlZmluZVByb3BlcnRpZXMiLCJXb3JrZXJNZXNzYWdlVHlwZSIsIldvcmtlckNsaWVudCIsInJlbmRlcmVySWQiLCJfY29ubmVjdCIsIndvcmtlclVybCIsInNlcnZlclVybCIsImluYWN0aXZpdHlUaW1lb3V0IiwiaGVhcnRiZWF0SW50ZXJ2YWwiLCJ3b3JrZXIiLCJwb3J0Iiwib25tZXNzYWdlIiwiaGFuZGxlTWVzc2FnZSIsImNvbm5lY3Rpb25Qcm9taXNlIiwiY29ubmVjdGlvblJlc29sdmUiLCJzdGFydCIsInBvc3RNZXNzYWdlIiwiQ09OTkVDVCIsIkRJU0NPTk5FQ1QiLCJjbG9zZSIsImlzQ29ubmVjdGVkIiwiX3N0ZXAkdmFsdWUiLCJwZW5kaW5nIiwiX2Vuc3VyZUNvbm5lY3RlZCIsImhlYXJ0YmVhdF9pbnRlcnZhbCIsIl9zZW5kQ2FsbGJhY2siLCJfdGhpczIiLCJyZXF1ZXN0Q291bnRlciIsInNldCIsIkNBTExCQUNLX1JFUVVFU1QiLCJHRVRfUFJPUFNfUkVTUE9OU0UiLCJUQUJfVklTSUJMRSIsImV2ZW50IiwiQ09OTkVDVEVEIiwiRElTQ09OTkVDVEVEIiwiX3N0ZXAyJHZhbHVlIiwiX21lc3NhZ2UkcGF5bG9hZCIsIkNBTExCQUNLX1JFU1BPTlNFIiwiU0VUX1BST1BTIiwiU0VUX1BST1BTX0JBVENIIiwiR0VUX1BST1BTX1JFUVVFU1QiLCJFUlJPUiIsIl9tZXNzYWdlJHBheWxvYWQyIiwiX21lc3NhZ2UkcGF5bG9hZDMiLCJ3b3JrZXJDbGllbnRJbnN0YW5jZSIsIl9jb25maWckd2Vic29ja2V0NCIsIl9jb25maWckd2Vic29ja2V0NSIsImNoZWNrUHJvcFR5cGVzIiwicHJvcFR5cGVFcnJvckhhbmRsZXIiLCJ2YWxpZGF0ZUNvbXBvbmVudCIsIkNoZWNrZWRDb21wb25lbnQiLCJjb21wb25lbnQiLCJlcnJvck1lc3NhZ2UiLCJ1c2VDYWxsYmFjayIsInVzZUNvbnRleHQiLCJ1c2VNZW1vIiwidXNlU3RvcmUiLCJ1c2VTZWxlY3RvciIsInVzZURpc3BhdGNoIiwiY3JlYXRlQ29udGV4dCIsIkRhc2hDb250ZXh0UHJvdmlkZXIiLCJzdHJpbmdQYXRoIiwiZXh0cmFQYXRoIiwicmF3UGF0aCIsImZpbHRlckZ1bmMiLCJsb2FkaW5nUGF0aCIsInVzZUxvYWRpbmciLCJjdHhWYWx1ZSIsImN0eCIsInVzZVJlZiIsIm1lcmdlUmlnaHQiLCJtYXBPYmpJbmRleGVkIiwiQ29tcG9uZW50RXJyb3JCb3VuZGFyeSIsInJlc2V0Q29tcG9uZW50U3RhdGUiLCJnZXRXYXRjaGVkS2V5cyIsImlzRHJ5Q29tcG9uZW50IiwiY2hlY2tSZW5kZXJUeXBlUHJvcCIsInN0cmluZ2lmeVBhdGgiLCJSZWdpc3RyeSIsImlzU2ltcGxlQ29tcG9uZW50Iiwic2VsZWN0RGFzaFByb3BzIiwic2VsZWN0RGFzaFByb3BzRXF1YWxpdHlGbiIsInNlbGVjdENvbmZpZyIsIkRhc2hXcmFwcGVyIiwiX2Rhc2hwcml2YXRlX2Vycm9yIiwiX3Bhc3NlZENvbXBvbmVudCIsIl9uZXdSZW5kZXIiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfZXhjbHVkZWQiLCJtZW1vaXplZEtleXMiLCJuZXdSZW5kZXIiLCJmcmVzaFJlbmRlcnMiLCJyZW5kZXJlZFBhdGgiLCJyZW5kZXJDb21wb25lbnQiLCJyZW5kZXJDb21wb25lbnRQcm9wcyIsInJlbmRlckgiLCJfdXNlU2VsZWN0b3IiLCJfdXNlU2VsZWN0b3IyIiwiaCIsImNoYW5nZWRQcm9wcyIsInNldFByb3BzIiwiX3JlbmRlckNvbXBvbmVudFByb3BzIiwiX2Rhc2hfZXJyb3IiLCJyZXN0UHJvcHMiLCJfZXhjbHVkZWQyIiwiY3VycmVudFN0YXRlIiwid2F0Y2hlZEtleXMiLCJjcmVhdGVDb250YWluZXIiLCJjb250YWluZXIiLCJjb250YWluZXJQYXRoIiwiX2NoaWxkTmV3UmVuZGVyIiwiX2NvbnRhaW5lciRwcm9wcyIsIndyYXBDaGlsZHJlblByb3AiLCJub2RlIiwiY2hpbGRyZW5QYXRoIiwiZXh0cmFQcm9wcyIsInNldEh5ZHJhdGVkUHJvcHMiLCJjaGlsZE5ld1JlbmRlciIsImhhbmRsZU9iamVjdCIsIm9wYXRoIiwibm9kZVZhbHVlIiwiX25vZGUiLCJiYWNrUGF0aCIsImZvdW5kIiwiaGFzT2JqZWN0IiwiZmlyc3ROb2RlIiwiZWwiLCJlbGVtZW50UGF0aCIsImxpc3RWYWx1ZSIsImZyb250IiwiZHluYW1pYyIsImhhc0JhY2siLCJqIiwiY3VyIiwiZHluVmFsdWUiLCJhUGF0aCIsImh5ZHJhdGVGdW5jIiwiaHlkcmF0ZWRQcm9wcyIsImh5ZHJhdGVkQ2hpbGRyZW4iLCJwcm9wc19jaGVjayIsImh5ZHJhdGVkIiwiaXNWYWxpZEVsZW1lbnQiLCJjb21wb25lbnRUeXBlIiwiYWRkQ29tcG9uZW50VG9MYXlvdXQiLCJyZW1vdmVDb21wb25lbnQiLCJfcmVmJHRlbXAiLCJ0ZW1wIiwiaW5zZXJ0ZWQiLCJzZXRJbnNlcnRlZCIsImNoZWNrRGFzaENoaWxkcmVuVXBkYXRlIiwicHJldmlvdXNIYXNoZXMiLCJpc0ZpcnN0TGV2ZWxQcm9wc0NoaWxkIiwidXBkYXRlZFBhdGgiLCJzdHJQYXRoIiwidXBkYXRlZFNlZ21lbnRzIiwiZnVsbFNlZ21lbnRzIiwic3RhcnRzV2l0aFBhdGgiLCJldmVyeSIsInNlZyIsInJlbWFpbmluZ1NlZ21lbnRzIiwicHJvcHNDb3VudCIsImRldGVybWluZUNoYW5nZWRQcm9wcyIsImNvbWJpbmVkSGFzaCIsImxheW91dEhhc2hlcyIsInBhdGhIYXNoIiwiX2lzRmlyc3RMZXZlbFByb3BzQ2hpIiwiX2lzRmlyc3RMZXZlbFByb3BzQ2hpMiIsImRlc2NlbmRhbnQiLCJwcmV2aW91c0hhc2giLCJoYXNoIiwiX19fIiwiX19fXyIsImNvbXBvbmVudERlZmluaXRpb24iLCJsYXlvdXRQYXRoIiwiR2xvYmFsRXJyb3JDb250YWluZXIiLCJoeWRyYXRlSW5pdGlhbE91dHB1dHMiLCJzZXRMYXlvdXQiLCJjb21wdXRlR3JhcGhzIiwiRXZlbnRFbWl0dGVyIiwiVW5jb25uZWN0ZWRDb250YWluZXIiLCJkZXBlbmRlbmNpZXNSZXF1ZXN0IiwibGF5b3V0UmVxdWVzdCIsImVycm9yTG9hZGluZyIsInNldEVycm9yTG9hZGluZyIsInJlbmRlcmVkVHJlZSIsInN0b3JlRWZmZWN0IiwiZW1pdCIsInNlcnZlX2xvY2FsbHkiLCJfZGFzaFBsb3RseUpTVVJMIiwicmVxdWVzdHNfcGF0aG5hbWVfcHJlZml4IiwicGxvdGx5anNfdXJsIiwiY29udGVudCIsImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiwiX19odG1sIiwiY2xhc3NOYW1lIiwiRnJhZ21lbnQiLCJjb21wb25lbnRzIiwiZmluYWxMYXlvdXQiLCJoYXNFcnJvciIsImZyb250RW5kIiwiYmFja0VuZCIsIm9uZU9mIiwib2JqZWN0IiwiaGlzdG9yeSIsIkNvbnRhaW5lciIsIkFQSUNvbnRyb2xsZXIiLCJMb2FkaW5nIiwiVG9vbGJhciIsIlJlbG9hZGVyIiwic2V0SG9va3MiLCJzZXRDb25maWciLCJtZW1vaXplV2l0aCIsImlkZW50aXR5IiwiVW5jb25uZWN0ZWRBcHBDb250YWluZXIiLCJfUmVhY3QkQ29tcG9uZW50IiwiX2NhbGxTdXBlciIsIl9pbmhlcml0cyIsIlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQiLCJyZW5kZXIiLCJzaG93X3VuZG9fcmVkbyIsIkNvbXBvbmVudCIsIlJlYWN0RE9NIiwiRGFzaFJlbmRlcmVyIiwiY3JlYXRlUm9vdCIsInJvb3QiLCJsb2dXYXJuaW5nT25jZSIsIkdFVCIsImZldGNoQ29uZmlnIiwiX2JvZHkiLCJQT1NUIiwicmVxdWVzdCIsImVuZHBvaW50Iiwic2V0Q29ubmVjdGlvblN0YXR1cyIsIl9ib2R5MiIsImNvbnRlbnRUeXBlIiwiX3NldENvbm5lY3Rpb25TdGF0dXMiLCJiYWNrRW5kQ29ubmVjdGVkIiwiYWN0aW9uTGlzdCIsIk9OX1BST1BfQ0hBTkdFIiwiU0VUX1JFUVVFU1RfUVVFVUUiLCJTRVRfR1JBUEhTIiwiU0VUX1BBVEhTIiwiU0VUX0xBWU9VVCIsIlNFVF9BUFBfTElGRUNZQ0xFIiwiU0VUX0NPTkZJRyIsIkFERF9IVFRQX0hFQURFUlMiLCJPTl9FUlJPUiIsIlNFVF9IT09LUyIsIklOU0VSVF9DT01QT05FTlQiLCJSRU1PVkVfQ09NUE9ORU5UIiwiUkVTRVRfQ09NUE9ORU5UX1NUQVRFIiwiZ2V0QWN0aW9uIiwiRGVwR3JhcGgiLCJpc051bWVyaWMiLCJhcCIsImV2b2x2ZSIsImZvckVhY2hPYmpJbmRleGVkIiwiY3Jhd2xMYXlvdXQiLCJBTEwiLCJ3aWxkIiwiTUFUQ0giLCJBTExTTUFMTEVSIiwiZXhwYW5kIiwid2lsZGNhcmRzIiwiYWxsb3dlZFdpbGRjYXJkcyIsIk91dHB1dCIsIklucHV0IiwiU3RhdGUiLCJ3aWxkY2FyZFZhbFR5cGVzIiwiaWRJbnZhbGlkQ2hhcnMiLCJpc1dpbGRjYXJkSWQiLCJwYXJzZVdpbGRjYXJkSWQiLCJwYXJzZU11bHRpcGxlT3V0cHV0cyIsIm91dHB1dElkQW5kUHJvcCIsImRvdFBvcyIsInN0cmluZ2lmeVZhbCIsInBhcnRzIiwiaWRWYWxTb3J0IiwiYklzTnVtZXJpYyIsImFOIiwiYk4iLCJhSXNCb29sIiwidmFsQmVmb3JlIiwidmFsQWZ0ZXIiLCJhZGRNYXAiLCJkZXBNYXAiLCJkZXBlbmRlbmN5IiwiaWRNYXAiLCJhZGRQYXR0ZXJuIiwiaWRTcGVjIiwidmFsdWVzS2V5IiwicHJvcE1hcCIsInZhbHVlTWFwIiwidmFsTWF0Y2giLCJvZmZsb2FkUGF0dGVybnMiLCJwYXR0ZXJuc01hcCIsInRhcmdldE1hcCIsInZhbGlkYXRlRGVwZW5kZW5jaWVzIiwicGFyc2VkRGVwZW5kZW5jaWVzIiwib3V0U3RycyIsIm91dE9ianMiLCJkZXAiLCJoYXNPdXRwdXRzIiwicHJldmVudF9pbml0aWFsX2NhbGwiLCJjbHMiLCJpZFByb3AiLCJ2YWxpZGF0ZUFyZyIsImZpbmREdXBsaWNhdGVPdXRwdXRzIiwiZmluZE1pc21hdGNoZWRXaWxkY2FyZHMiLCJpbnZhbGlkQ2hhcnMiLCJuZXdPdXRwdXRTdHJzIiwibmV3T3V0cHV0T2JqcyIsImlkT2JqIiwic2VsZk92ZXJsYXAiLCJ3aWxkY2FyZE92ZXJsYXAiLCJvdGhlck92ZXJsYXAiLCJpZFByb3AyIiwiY2hlY2tJbk91dE92ZXJsYXAiLCJvdXRJZCIsIm91dFByb3AiLCJpbl8iLCJpbklkIiwiaW5Qcm9wIiwiX2ZpbmRXaWxkY2FyZEtleXMiLCJmaW5kV2lsZGNhcmRLZXlzIiwib3V0ME1hdGNoS2V5cyIsIm1hdGNoS2V5cyIsIm91dHB1dHNIYXZlTWF0Y2giLCJhcmciLCJfZmluZFdpbGRjYXJkS2V5czIiLCJhbGxzbWFsbGVyS2V5cyIsImRpZmZLZXlzIiwiZGlmZiIsIm91dERlc2MiLCJtYXRjaFdpbGRLZXlzIiwiYVdpbGQiLCJiV2lsZCIsImlkS2V5cyIsImlkVmFscyIsIl9pdGVyYXRvcjMiLCJfc3RlcDMiLCJpZDIiLCJwcm9wZXJ0eTIiLCJ2YWxpZGF0ZUNhbGxiYWNrc1RvTGF5b3V0Iiwic3RhdGVfIiwibGF5b3V0XyIsInBhdGhzXyIsInZhbGlkYXRlSWRzIiwidmFsaWRhdGlvbl9sYXlvdXQiLCJvdXRwdXRNYXAiLCJvdXRwdXRQYXR0ZXJucyIsInRhaWwiLCJtaXNzaW5nSWQiLCJ2YWxpZGF0ZVByb3AiLCJpZFBhdGgiLCJyYXdQcm9wIiwibGFzdCIsImNoYXJBdCIsInZhbGlkYXRlSWRQYXR0ZXJuUHJvcCIsImlkUmVzb2x2ZWQiLCJjYWxsYmFja0lkc0NoZWNrZWRGb3JTdGF0ZSIsInZhbGlkYXRlU3RhdGUiLCJ2YWxpZGF0ZU1hcCIsImRvU3RhdGUiLCJmY2IiLCJvcHRpb25hbCIsImRlcHMiLCJ2YWxpZGF0ZVBhdHRlcm5zIiwia2V5UGF0dGVybnMiLCJfbG9vcDIiLCJkZXBlbmRlbmNpZXMiLCJtdWx0aUdyYXBoIiwicGVyZm9ybWFuY2UiLCJ3aWxkY2FyZFBsYWNlaG9sZGVycyIsImZpeElkcyIsIndyYXBwZWRERSIsImxpbmVzIiwidmFsaWRhdGVfY2FsbGJhY2tzIiwib3V0cHV0UGF0dGVybk1hcCIsImlucHV0UGF0dGVybk1hcCIsImZpbmFsR3JhcGhzIiwiTXVsdGlHcmFwaCIsImV4YWN0Iiwia2V5UGxhY2Vob2xkZXJzIiwibWFrZUFsbElkcyIsIm91dElkRmluYWwiLCJpZExpc3QiLCJ0ZXN0VmFscyIsIm91dFZhbEluZGV4IiwibmV3VmFscyIsIm91dHB1dFRhZyIsImR1cGxpY2F0ZU91dHB1dHMiLCJjYkluIiwiY2JPdXQiLCJhZGRJbnB1dFRvTXVsdGkiLCJpbklkUHJvcCIsIm91dElkUHJvcCIsImZpcnN0UGFzcyIsImFkZE5vZGUiLCJhZGREZXBlbmRlbmN5IiwiYWRkT3V0cHV0VG9NdWx0aSIsImluT2JqIiwiaW5JZExpc3QiLCJfZmluZFdpbGRjYXJkS2V5czMiLCJmaXJzdFNpbmdsZU91dHB1dCIsImZpbmFsRGVwZW5kZW5jeSIsImFsc29JbnB1dCIsIm91dElkTGlzdCIsInRlbXBPdXRJZFByb3AiLCJvdXRJZE5hbWUiLCJpbnB1dE9iamVjdCIsImR1cGVPdXRJZFByb3AiLCJvcmlnaW5hbE5hbWUiLCJuZXdOYW1lIiwiY250IiwiaW5OYW1lIiwib3V0TmFtZSIsImVuZCIsImNhbGxiYWNrR3JhcGhUaW1lIiwidG9GaXhlZCIsInBhdHRlcm5WYWwiLCJyZWZJbmRleCIsInJlZlBhdHRlcm5WYWwiLCJnZXRDYWxsYmFja0J5T3V0cHV0IiwiYWRkUmVzb2x2ZWRGcm9tT3V0cHV0cyIsIm91dFBhdHRlcm4iLCJvdXRzIiwib3V0MEtleXMiLCJvdXQwUGF0dGVyblZhbHMiLCJmb3VuZENiSWRzIiwib3V0VmFscyIsInNpbmdsZU91dFBhdHRlcm4iLCJhbnlTZWVuIiwib3V0U2V0IiwibWF0Y2hTdHIiLCJuZXdQcm9wIiwibGF5b3V0Q2h1bmsiLCJvcHRzIiwib3V0cHV0c09ubHkiLCJhZGRDYWxsYmFjayIsImZvdW5kSW5kZXgiLCJmb3VuZENiIiwiYWRkQ2FsbGJhY2tJZkFycmF5IiwiaW5pIiwiaW5paiIsImhhbmRsZU9uZUlkIiwib3V0SWRDYWxsYmFja3MiLCJpbklkQ2FsbGJhY2tzIiwibWF5YmVBZGRDYWxsYmFjayIsImhhbmRsZVRoaXNDYWxsYmFjayIsImNoaWxkIiwiY29va2llIiwicmVjb3JkVWlFZGl0Iiwic2V0QXBwTGlmZWN5Y2xlIiwic2V0UmVxdWVzdFF1ZXVlIiwiaW5zZXJ0Q29tcG9uZW50Iiwib25Qcm9wQ2hhbmdlIiwiaHRtbCIsInRyaWdnZXJEZWZhdWx0U3RhdGUiLCJ0b2tlbk5hbWUiLCJjc3JmX3Rva2VuX25hbWUiLCJoZWFkZXJOYW1lIiwiY3NyZl9oZWFkZXJfbmFtZSIsImNvb2tpZXMiLCJ0b2tlbiIsIm92ZXJhbGxPcmRlciIsImxheW91dENhbGxiYWNrcyIsInNwZWNpYWxDYWxsYmFja3MiLCJpc05vT3V0cHV0IiwiaXNOb0lucHV0IiwiaW5wIiwicmVkbyIsIm1vdmVIaXN0b3J5IiwidW5kbyIsInJldmVydCIsImZ1dHVyZSIsInBhc3QiLCJ0YXJnZXRzIiwicHJvbWlzZXMiLCJyZW5kZXJlZCIsInJlc29sdmVSZW5kZXJlZCIsInBhdGhPZklkIiwidGFyZ2V0IiwicmVhZHkiLCJyYWNlIiwicHJvcEVxIiwic3ViVHJlZSIsInN0YXJ0aW5nUGF0aCIsIm9sZFN0cnMiLCJvbGRPYmpzIiwiZGlmZkhlYWQiLCJzcExlbiIsIm9sZFZhbFBhdGhzIiwib2xkS2V5cyIsIm9sZGllIiwicGF0aE9iaiIsImhhc1VybEJhc2UiLCJoYXNSZXFQcmVmaXgiLCJiYXNlIiwidXJsX2Jhc2VfcGF0aG5hbWUiLCJwcm9wc0NoaWxkcmVuIiwiY3VycmVudFBhdGgiLCJvYmpPZiIsImJhY2siLCJjaGlsZE9iaiIsImNoaWxkUGF0aCIsIm5ld1BhdGgiLCJjdXJQYXRoIiwib1ZhbHVlIiwiX2NyYXdsTGF5b3V0IiwiX2V2Iiwib24iLCJsaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIiwiaWR4IiwiX2xlbiIsIl9rZXkiLCJfdGhpczMiLCJfbGVuMiIsIl9rZXkyIiwiUmVhY3RQcm9wVHlwZXNTZWNyZXQiLCJ0eXBlU3BlY3MiLCJjb21wb25lbnROYW1lIiwiZ2V0U3RhY2siLCJ0eXBlU3BlY05hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsImV4Iiwic3RhY2siLCJib29sIiwiaXNSZXF1aXJlZCIsImNvbXBhcmF0b3IiLCJsdCIsImhvdF9yZWxvYWQiLCJfcHJvcHMkY29uZmlnJGhvdF9yZWwiLCJtYXhfcmV0cnkiLCJkaXNhYmxlZCIsImludGVydmFsSWQiLCJwYWNrYWdlcyIsIl9yZXRyeSIsIl9oZWFkIiwiY2xlYXJJbnRlcnZhbCIsInNldFN0YXRlIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwicHJldlN0YXRlIiwicmVsb2FkUmVxdWVzdCIsImhhcmQiLCJ3YXNfY3NzIiwiZmlsZXMiLCJpc19jc3MiLCJub2Rlc1RvRGlzYWJsZSIsIml0IiwiZXZhbHVhdGUiLCJpdGVyYXRlTmV4dCIsInNldEF0dHJpYnV0ZSIsImxpbmsiLCJyZWxvYWQiLCJhbGVydCIsImNvbXBvbmVudERpZE1vdW50IiwiX3RoaXMkcHJvcHMiLCJfdGhpcyRzdGF0ZSIsInNldEludGVydmFsIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMiLCJkZWZhdWx0UHJvcHMiLCJzdHJpbmciLCJudW1iZXIiLCJVbmNvbm5lY3RlZFRvb2xiYXIiLCJ1bmRvTGluayIsIm9uQ2xpY2siLCJyZWRvTGluayIsIkN5dG9zY2FwZSIsIkN5dG9zY2FwZUNvbXBvbmVudCIsImRhZ3JlIiwiZmNvc2UiLCJKU09OVHJlZSIsInN0eWxlc2hlZXQiLCJ1cGRhdGVTZWxlY3RlZE5vZGUiLCJ1cGRhdGVDaGFuZ2VkUHJvcHMiLCJ1cGRhdGVDYWxsYmFjayIsInVzZSIsImdlbmVyYXRlRWxlbWVudHMiLCJwcm9maWxlIiwiZXh0cmFMaW5rcyIsImNvbnN1bWVkIiwiZWxlbWVudHMiLCJzdHJ1Y3R1cmUiLCJyZWNvcmROb2RlIiwicmF3UHJvcGVydHkiLCJpZFR5cGUiLCJwYXJlbnRJZCIsImNoaWxkSWQiLCJsYWJlbCIsInBhcmVudCIsInJlY29yZEVkZ2UiLCJ2aXNpYmxlSW5kZXgiLCJoaWRkZW4iLCJjYlByb2ZpbGUiLCJjb3VudCIsInRpbWUiLCJ0b3RhbCIsIm1vZGUiLCJyb3VuZCIsImxvYWRpbmdTZXQiLCJlcnJvclNldCIsIm5vZGVJZCIsImNoaWxkSWRzIiwiY2hpbGRGcm9tIiwiY2hpbGRUbyIsInJlZHVjZVN0YXR1cyIsImxhdGVzdCIsImZsYXR0ZW5PdXRwdXRzIiwiZmxhdHRlbklucHV0cyIsImluQXJyYXkiLCJmaW5hbCIsImluSXRlbSIsImNsZWFuT3V0cHV0SWQiLCJvdXRwdXRJZCIsImFnZyIsImNiUHJlZml4TGVuIiwiZGFncmVMYXlvdXQiLCJwYWRkaW5nIiwicmFua2VyIiwiZm9yY2VMYXlvdXQiLCJhbmltYXRlIiwibGF5b3V0cyIsInNwYWNpbmdGYWN0b3IiLCJub2RlU2VwIiwicmFua1NlcCIsInJhbmtEaXIiLCJmb3JjZSIsIkNhbGxiYWNrR3JhcGgiLCJjaGFuZ2VkIiwibGlmZWN5Y2xlU3RhdGUiLCJzZWxlY3RlZCIsInNldFNlbGVjdGVkIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJjeXRvc2NhcGUiLCJzZXRDeXRvc2NhcGUiLCJncmFwaExheW91dCIsImNob3NlblR5cGUiLCJfY2hvc2VuVHlwZSIsImxheW91dFNlbGVjdG9yIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJsYXlvdXRUeXBlIiwic2V0TGF5b3V0VHlwZSIsInVzZUN5dG9zY2FwZUVmZmVjdCIsImVmZmVjdCIsImNvbmRpdGlvbiIsImdldENvbXBvbmVudCIsImhhc1BhdHRlcm5zIiwiZ2V0UHJvcFZhbHVlIiwic2V0UHJlc2V0TGF5b3V0IiwiX2xheW91dFNlbGVjdG9yJGN1cnJlIiwiY3kiLCJwb3NpdGlvbnMiLCJub2RlcyIsImVhY2giLCJwb3NpdGlvbiIsImZpdCIsInpvb20iLCJwYW4iLCJlbGVtZW50TmFtZSIsImVsZW1lbnRJbmZvIiwiX2dldENvbXBvbmVudCIsInJlc3QiLCJjYWxsYmFja091dHB1dElkIiwibmV0d29yayIsImNvbXB1dGUiLCJhdmciLCJ0aW1pbmciLCJkb3dubG9hZCIsInVwbG9hZCIsImN5TGF5b3V0Iiwic3R5bGUiLCJ3aWR0aCIsImhlaWdodCIsInRoZW1lIiwibGFiZWxSZW5kZXJlciIsImdldEl0ZW1TdHJpbmciLCJpdGVtVHlwZSIsInNob3VsZEV4cGFuZE5vZGUiLCJrZXlOYW1lIiwibGV2ZWwiLCJvbkNoYW5nZSIsInJlZiIsIlVuY29ubmVjdGVkQ2FsbGJhY2tHcmFwaENvbnRhaW5lciIsIl9Db21wb25lbnQiLCJjb21wb25lbnREaWRDYXRjaCIsImluZm8iLCJteUlEIiwiZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIiwiQ2FsbGJhY2tHcmFwaENvbnRhaW5lciIsInNlbGVjdG9yIiwiZGlzcGxheSIsImNvbG9yIiwiZ2hvc3QiLCJvcGFjaXR5IiwiU1RBVFVTTUFQIiwiZ2V0RWRnZVR5cGVzIiwiY29ubmVjdGVkRWRnZXMiLCJhc2NlbmQiLCJjb2xsZWN0aW9uIiwidmlzaXRlZCIsImVkZ2VzIiwicGFyZW50cyIsInNvdXJjZXMiLCJhbmNlc3RvcnMiLCJkZXNjZW5kIiwiYWRkQ2xhc3MiLCJvdGhlciIsImFic29sdXRlQ29tcGxlbWVudCIsInJlbW92ZUNsYXNzIiwiZmxhc2hUaW1lIiwiZmxhc2hDbGFzcyIsImVkZ2VzVG8iLCJhdmdUaW1lIiwiaGFzQ2xhc3MiLCJ0aW1lTGVmdCIsInByZXZDaGlsZHJlbiIsIkNvbGxhcHNlSWNvbiIsIndlcmt6ZXVnQ3NzIiwiRnJvbnRFbmRFcnJvciIsImNvbGxhcHNlZCIsImlzTGlzdEl0ZW0iLCJpbkFsZXJ0c1RyYXkiLCJjYXJkQ2xhc3NlcyIsImVycm9ySGVhZGVyIiwidGltZXN0YW1wIiwidG9Mb2NhbGVUaW1lU3RyaW5nIiwiRXJyb3JDb250ZW50IiwiQmFja2VuZEVycm9yIiwiaWZyYW1lUmVmIiwic2V0SGVpZ2h0IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInNyY0RvYyIsImJvcmRlciIsIk1BWF9NRVNTQUdFX0xFTkdUSCIsIlVuY29ubmVjdGVkRXJyb3JDb250ZW50IiwiaXNGdWxsSHRtbERvYyIsInRvTG93ZXJDYXNlIiwiaXNIdG1sRnJhZ21lbnQiLCJsaW5lIiwiZXJyb3JQcm9wVHlwZXMiLCJGcm9udEVuZEVycm9yQ29udGFpbmVyIiwiY2xpY2tIYW5kbGVyIiwiZXJyb3JFbGVtZW50cyIsImFycmF5IiwiRGVidWdNZW51IiwiVW5jb25uZWN0ZWRHbG9iYWxFcnJvckNvbnRhaW5lciIsImhvdFJlbG9hZCIsIkNoZWNrSWNvbiIsIkNsb2NrSWNvbiIsIkVycm9ySWNvbiIsIkdyYXBoSWNvbiIsIk9mZkljb24iLCJFeHBhbmQiLCJWZXJzaW9uSW5mbyIsIlBsb3RseUNsb3VkIiwiRGV2dG9vbFByb3ZpZGVyIiwiY2xhc3NlcyIsInZhcmlhbnQiLCJ2YXJpYW50MiIsImlzQ29sbGFwc2VkIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsIk1lbnVDb250ZW50IiwiX2NvbmZpZyRkZXZfdG9vbHMiLCJwb3B1cCIsInRvZ2dsZUVycm9ycyIsImVyckNvdW50IiwidG9nZ2xlQ2FsbGJhY2tHcmFwaCIsIl9TdGF0dXNJY29uIiwiY3VzdG9tIiwiZGV2X3Rvb2xzIiwiX2RldnRvb2wkcHJvcHMiLCJjb21wIiwibGVmdCIsInJpZ2h0IiwicGxvdGx5X2Nsb3VkX2luc3RhbGxlZCIsImZpbGwiLCJtYXJnaW5SaWdodCIsIkRlYnVnIiwiX3VzZURldnRvb2wiLCJzZXRQb3B1cCIsInNldENvbGxhcHNlZCIsInRvZ2dsZUNvbGxhcHNlZCIsInNldEl0ZW0iLCJwb3B1cENvbnRlbnQiLCJtZW51Q29udGVudCIsInBvcHVwTmFtZSIsIkNsb3VkU2xhc2hJY29uIiwiQ0xPVURfUE9QVVAiLCJpc09wZW4iLCJvbkNvcHkiLCJuYXZpZ2F0b3IiLCJjbGlwYm9hcmQiLCJ3cml0ZVRleHQiLCJEQVlfSU5fTVMiLCJjb21wYXJlVmVyc2lvbnMiLCJ2MSIsInYyIiwidjFQYXJ0cyIsInYyUGFydHMiLCJwYXJ0MSIsInBhcnQyIiwicmVxdWVzdERhc2hWZXJzaW9uSW5mbyIsIl9yZXF1ZXN0RGFzaFZlcnNpb25JbmZvIiwiY3VycmVudERhc2hWZXJzaW9uIiwiZGFzaFZlcnNpb25VcmwiLCJweXRob25WZXJzaW9uIiwiZGRrVmVyc2lvbiIsInBsb3RseVZlcnNpb24iLCJjYWNoZWRWZXJzaW9uSW5mbyIsImNhY2hlZE5ld0Rhc2hWZXJzaW9uTGluayIsImxhc3RGZXRjaGVkIiwicXVlcnlQYXJhbXMiLCJkYXNoX3ZlcnNpb24iLCJkYXNoX3ZlcnNpb25fdXJsIiwicHl0aG9uX3ZlcnNpb24iLCJkZGtfdmVyc2lvbiIsInBsb3RseV92ZXJzaW9uIiwidmVyc2lvbiIsInNob3VsZFJlcXVlc3REYXNoVmVyc2lvbiIsIlVSTFNlYXJjaFBhcmFtcyIsImRpc2FibGVfdmVyc2lvbl9jaGVjayIsInNob3dOb3RpZmljYXRpb25zIiwic2hvdWxkU2hvd1VwZ3JhZGVOb3RpZmljYXRpb24iLCJuZXdEYXNoVmVyc2lvbiIsImxhc3REaXNtaXNzZWQiLCJsYXN0RGlzbWlzc2VkVmVyc2lvbiIsInNldE5ld0Rhc2hWZXJzaW9uIiwibmV3RGFzaFZlcnNpb25MaW5rIiwic2V0TmV3RGFzaFZlcnNpb25MaW5rIiwidXBncmFkZVRvb2x0aXBPcGVuZWQiLCJzZXRVcGdyYWRlVG9vbHRpcE9wZW5lZCIsInNldERvbnRTaG93QWdhaW4iLCJzZXRSZW1pbmRNZUxhdGVyIiwic2V0U2tpcFRoaXNWZXJzaW9uIiwiaGlkZVVwZ3JhZGVUb29sdGlwIiwiUkVESVJFQ1RfVVJJX1BBVEhOQU1FIiwiT0FVVEhfQ09PS0lFX05BTUUiLCJtZXNzYWdlUGFydHMiLCJpbnZhbGlkUHJvcFBhdGgiLCJleHBlY3RlZFByb3BUeXBlIiwiaW52YWxpZFByb3BUeXBlUHJvdmlkZWQiLCJqc29uU3VwcGxpZWRWYWx1ZSIsIlNJTVBMRV9DT01QT05FTlRfVFlQRVMiLCJsZW5zUGF0aCIsInN0b3JlUHJlZml4Iiwia2V5UHJlZml4TWF0Y2giLCJwcmVmaXgiLCJzZXBhcmF0b3IiLCJmdWxsU3RyIiwiZnVsbExlbiIsIlVOREVGSU5FRCIsIl9wYXJzZSIsIl9zdHJpbmdpZnkiLCJXZWJTdG9yZSIsIl9uYW1lIiwiX3N0b3JhZ2UiLCJoYXNJdGVtIiwiX3NldEl0ZW0iLCJyZW1vdmVJdGVtIiwia2V5UHJlZml4IiwiZnVsbFByZWZpeCIsImtleU1hdGNoIiwia2V5c1RvUmVtb3ZlIiwiZnVsbEtleSIsIk1lbVN0b3JlIiwicG93IiwibG9uZ1N0cmluZyIsIm1lbW9yeSIsImJhY2tFbmRzIiwibG9jYWwiLCJzZXNzaW9uIiwidHJ5R2V0V2ViU3RvcmUiLCJmYWxsYmFja1N0b3JlIiwic3RvcmVUZXN0IiwidGVzdEtleSIsImdldFN0b3JlIiwibm9vcFRyYW5zZm9ybSIsImV4dHJhY3QiLCJwcm9wVmFsdWUiLCJzdG9yZWRWYWx1ZSIsIl9wcm9wVmFsdWUiLCJnZXRUcmFuc2Zvcm0iLCJwcm9wUGFydCIsInBlcnNpc3RlbmNlVHJhbnNmb3JtcyIsImdldFZhbHNLZXkiLCJwZXJzaXN0ZWRQcm9wIiwicGVyc2lzdGVuY2UiLCJnZXRQcm9wcyIsImdldFZhbCIsImRhc2hQZXJzaXN0ZW5jZSIsInBlcnNpc3RlZF9wcm9wcyIsInBlcnNpc3RlbmNlX3R5cGUiLCJjYW5QZXJzaXN0IiwiX2dldFByb3BzIiwiaXNQZXJzaXN0ZW5jZU1pc21hdGNoIiwiX3BlcnNpc3RlZFByb3Akc3BsaXQiLCJfcGVyc2lzdGVkUHJvcCRzcGxpdDIiLCJzdG9yYWdlIiwiX2dldFRyYW5zZm9ybSIsInZhbHNLZXkiLCJvcmlnaW5hbFZhbCIsIm5ld1ZhbCIsImxheSIsInBlcnNpc3RlbmNlTW9kcyIsIlVORE8iLCJtb2RQcm9wIiwidXBkYXRlIiwiX3N0b3JhZ2UkZ2V0SXRlbSIsIl9zdG9yYWdlJGdldEl0ZW0yIiwiZnJvbVZhbCIsInRvVmFsIiwiX3BlcnNpc3RlZFByb3Akc3BsaXQzIiwiX3BlcnNpc3RlZFByb3Akc3BsaXQ0IiwiX2dldFByb3BzMiIsImxheW91dE91dCIsIl9nZXRQcm9wczMiLCJnZXRGaW5hbCIsInByZXZWYWwiLCJmaW5hbFBlcnNpc3RlbmNlIiwiZmluYWxQZXJzaXN0ZW5jZVR5cGUiLCJmaW5hbFBlcnNpc3RlZFByb3BzIiwicGVyc2lzdGVuY2VDaGFuZ2VkIiwibm90SW5OZXdQcm9wcyIsImRlcGVyc2lzdGVkUHJvcHMiLCJmaW5hbFN0b3JhZ2UiLCJjcmVhdGVBcGlSZWR1Y2VyIiwiQXBpUmVkdWNlciIsIm5ld1N0YXRlIiwiX2FjdGlvbiRwYXlsb2FkIiwibmV3UmVxdWVzdCIsImluaXRpYWxDaGFuZ2UiLCJjaGlsZHJlbl9wcm9wcyIsInN0YXRlTGlzdCIsIlNUQVJURUQiLCJIWURSQVRFRCIsIkRFU1RST1lFRCIsImluaXRpYWxHcmFwaCIsImluaXRpYWxFcnJvciIsImluaXRpYWxIaXN0b3J5IiwicHJlc2VudCIsIm5ld1Bhc3QiLCJuZXdGdXR1cmUiLCJjdXN0b21Ib29rcyIsImJlYXIiLCJ2aWV3IiwicHJvcFBhdGgiLCJleGlzdGluZ1Byb3BzIiwibWVyZ2VkUHJvcHMiLCJpbml0aWFsUGF0aHMiLCJjbG9uZSIsImRlZmF1bHRQcm9maWxlIiwiZGVmYXVsdFN0YXRlIiwic3RhdHVzTWFwcGVkIiwiY2JSZXNvdXJjZXMiLCJ0b3RhbFJlc291cmNlcyIsInVzZXIiLCJjb21iaW5lUmVkdWNlcnMiLCJhcGlSZXF1ZXN0cyIsImFjdGlvblBhdGgiLCJwcmVmaXhTdHIiLCJmcm9tRW50cmllcyIsIm1haW5SZWR1Y2VyIiwiZ2V0SW5wdXRIaXN0b3J5U3RhdGUiLCJyZWNvcmRDaGFuZ2VzIiwicmVmUHJvcHMiLCJoaXN0b3J5RW50cnkiLCJwcm9wS2V5IiwicmVjb3JkSGlzdG9yeSIsIm5leHRTdGF0ZSIsInJlbG9hZGVyUmVkdWNlciIsImV4cG9ydHMiLCJwYXJzZUNvb2tpZSIsInN0cmluZ2lmeUNvb2tpZSIsInN0cmluZ2lmeVNldENvb2tpZSIsInNlcmlhbGl6ZSIsInBhcnNlU2V0Q29va2llIiwiY29va2llTmFtZVJlZ0V4cCIsImNvb2tpZVZhbHVlUmVnRXhwIiwiZG9tYWluVmFsdWVSZWdFeHAiLCJwYXRoVmFsdWVSZWdFeHAiLCJtYXhBZ2VSZWdFeHAiLCJfX3RvU3RyaW5nIiwiTnVsbE9iamVjdCIsIkMiLCJzdHIiLCJsZW4iLCJkZWNvZGUiLCJlcUlkeCIsImVxSW5kZXgiLCJlbmRJZHgiLCJlbmRJbmRleCIsInZhbHVlU2xpY2UiLCJlbmMiLCJlbmNvZGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJjb29raWVTdHJpbmdzIiwiX3ZhbCIsIl9vcHRzIiwibWF4QWdlIiwiaXNJbnRlZ2VyIiwiZG9tYWluIiwiZXhwaXJlcyIsImlzRGF0ZSIsImlzRmluaXRlIiwidmFsdWVPZiIsInRvVVRDU3RyaW5nIiwiaHR0cE9ubHkiLCJzZWN1cmUiLCJwYXJ0aXRpb25lZCIsInNhbWVTaXRlIiwic2V0Q29va2llIiwiYXR0ciIsImRhdGUiLCJjaGFyQ29kZUF0IiwiZGVjb2RlVVJJQ29tcG9uZW50Iiwid2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJmYWN0b3J5IiwiZGVmaW5lIiwiYW1kIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTQwX18iLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwidGd0Iiwic3JjcyIsIl9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJzbGljZUl0ZXJhdG9yIiwiYXJyIiwiX2FyciIsIl9kIiwiX2UiLCJfcyIsIkxpbmtlZExpc3QiLCJsYXlvdXRCYXNlIiwiYXV4aWxpYXJ5IiwiZ2V0VG9wTW9zdE5vZGVzIiwibm9kZXNNYXAiLCJyb290cyIsImVsZSIsImNvbm5lY3RDb21wb25lbnRzIiwiZWxlcyIsInRvcE1vc3ROb2RlcyIsImR1bW15Tm9kZXMiLCJxdWV1ZSIsInZpc2l0ZWRUb3BNb3N0Tm9kZXMiLCJjdXJyZW50TmVpZ2hib3IiLCJtaW5EZWdyZWVOb2RlIiwibWluRGVncmVlIiwibm9kZXNDb25uZWN0ZWRUb0R1bW15IiwiY21wdCIsImN1cnJlbnROb2RlIiwiY2hpbGRyZW5PZkN1cnJlbnROb2RlIiwiZGVzY2VuZGFudHMiLCJzaGlmdCIsIm5laWdoYm9yTm9kZXMiLCJuZWlnaGJvcmhvb2QiLCJlZGdlc1dpdGgiLCJuZWlnaGJvck5vZGUiLCJ1bmlvbiIsImNoaWxkcmVuT2ZOZWlnaGJvciIsInNpemUiLCJyZWxvY2F0ZUNvbXBvbmVudCIsIm9yaWdpbmFsQ2VudGVyIiwiY29tcG9uZW50UmVzdWx0IiwiZml4ZWROb2RlQ29uc3RyYWludCIsIm1pblhDb29yZCIsIlBPU0lUSVZFX0lORklOSVRZIiwibWF4WENvb3JkIiwiTkVHQVRJVkVfSU5GSU5JVFkiLCJtaW5ZQ29vcmQiLCJtYXhZQ29vcmQiLCJxdWFsaXR5IiwiX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiIsIl9kaWRJdGVyYXRvckVycm9yIiwiX2l0ZXJhdG9yRXJyb3IiLCJub2RlSW5kZXhlcyIsImN5Tm9kZSIsIm5vZGVCQiIsImJvdW5kaW5nQm94IiwibGVmdFgiLCJ4Q29vcmRzIiwicmlnaHRYIiwidG9wWSIsInlDb29yZHMiLCJib3R0b21ZIiwiZGlmZk9uWCIsIngiLCJkaWZmT25ZIiwiZ2V0UmVjdCIsIl9kaWZmT25YIiwiX2RpZmZPblkiLCJzZXRDZW50ZXIiLCJnZXRDZW50ZXJYIiwiZ2V0Q2VudGVyWSIsImNhbGNCb3VuZGluZ0JveCIsInBhcmVudE5vZGUiLCJNQVhfU0FGRV9JTlRFR0VSIiwiTUlOX1NBRkVfSU5URUdFUiIsInRvcCIsImJvdHRvbSIsIm5vZGVMZWZ0Iiwibm9kZVJpZ2h0Iiwibm9kZVRvcCIsIm5vZGVCb3R0b20iLCJub3QiLCJ0b3BMZWZ0WCIsInRvcExlZnRZIiwiY2FsY1BhcmVudHNXaXRob3V0Q2hpbGRyZW4iLCJwYXJlbnRzV2l0aG91dENoaWxkcmVuIiwiY2hlY2siLCJjc3MiLCJhdXgiLCJDb1NFTGF5b3V0IiwiQ29TRU5vZGUiLCJQb2ludEQiLCJEaW1lbnNpb25EIiwiTGF5b3V0Q29uc3RhbnRzIiwiRkRMYXlvdXRDb25zdGFudHMiLCJDb1NFQ29uc3RhbnRzIiwiY29zZUxheW91dCIsInNwZWN0cmFsUmVzdWx0IiwiaWRUb0xOb2RlIiwicmFuZG9taXplIiwiaXNGbiIsIm9wdEZuIiwib3B0IiwicHJvY2Vzc0NoaWxkcmVuTGlzdCIsInRoZUNoaWxkIiwiY2hpbGRyZW5fb2ZfY2hpbGRyZW4iLCJ0aGVOb2RlIiwiZGltZW5zaW9ucyIsImxheW91dERpbWVuc2lvbnMiLCJub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHMiLCJvdXRlcldpZHRoIiwib3V0ZXJIZWlnaHQiLCJpc1BhcmVudCIsImdyYXBoTWFuYWdlciIsInBhcnNlRmxvYXQiLCJwYXJlbnRJbmZvIiwibm9kZVJlcHVsc2lvbiIsInBhZGRpbmdMZWZ0IiwicGFyc2VJbnQiLCJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsImxhYmVsV2lkdGgiLCJpbmNsdWRlTGFiZWxzIiwiaW5jbHVkZU5vZGVzIiwiaW5jbHVkZU92ZXJsYXlzIiwibGFiZWxIZWlnaHQiLCJsYWJlbFBvc1ZlcnRpY2FsIiwibGFiZWxQb3NIb3Jpem9udGFsIiwiaXNOYU4iLCJyZWN0IiwidGhlTmV3R3JhcGgiLCJnZXRHcmFwaE1hbmFnZXIiLCJuZXdHcmFwaCIsInByb2Nlc3NFZGdlcyIsImdtIiwiaWRlYWxMZW5ndGhUb3RhbCIsImVkZ2VDb3VudCIsImVkZ2UiLCJzb3VyY2VOb2RlIiwidGFyZ2V0Tm9kZSIsImdldEVkZ2VzQmV0d2VlbiIsImUxIiwibmV3RWRnZSIsImlkZWFsTGVuZ3RoIiwiaWRlYWxFZGdlTGVuZ3RoIiwiZWRnZUVsYXN0aWNpdHkiLCJERUZBVUxUX0VER0VfTEVOR1RIIiwiTUlOX1JFUFVMU0lPTl9ESVNUIiwiREVGQVVMVF9SQURJQUxfU0VQQVJBVElPTiIsInByb2Nlc3NDb25zdHJhaW50cyIsImNvbnN0cmFpbnRzIiwiYWxpZ25tZW50Q29uc3RyYWludCIsInJlbGF0aXZlUGxhY2VtZW50Q29uc3RyYWludCIsIm5lc3RpbmdGYWN0b3IiLCJQRVJfTEVWRUxfSURFQUxfRURHRV9MRU5HVEhfRkFDVE9SIiwiZ3Jhdml0eSIsIkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSCIsIm51bUl0ZXIiLCJNQVhfSVRFUkFUSU9OUyIsImdyYXZpdHlSYW5nZSIsIkRFRkFVTFRfR1JBVklUWV9SQU5HRV9GQUNUT1IiLCJncmF2aXR5Q29tcG91bmQiLCJERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfU1RSRU5HVEgiLCJncmF2aXR5UmFuZ2VDb21wb3VuZCIsIkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9SQU5HRV9GQUNUT1IiLCJpbml0aWFsRW5lcmd5T25JbmNyZW1lbnRhbCIsIkRFRkFVTFRfQ09PTElOR19GQUNUT1JfSU5DUkVNRU5UQUwiLCJ0aWxpbmdDb21wYXJlQnkiLCJUSUxJTkdfQ09NUEFSRV9CWSIsIlFVQUxJVFkiLCJOT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMiLCJERUZBVUxUX0lOQ1JFTUVOVEFMIiwiQU5JTUFURSIsIlRJTEUiLCJ0aWxlIiwiVElMSU5HX1BBRERJTkdfVkVSVElDQUwiLCJ0aWxpbmdQYWRkaW5nVmVydGljYWwiLCJUSUxJTkdfUEFERElOR19IT1JJWk9OVEFMIiwidGlsaW5nUGFkZGluZ0hvcml6b250YWwiLCJQVVJFX0lOQ1JFTUVOVEFMIiwiREVGQVVMVF9VTklGT1JNX0xFQUZfTk9ERV9TSVpFUyIsInVuaWZvcm1Ob2RlRGltZW5zaW9ucyIsInN0ZXAiLCJUUkFOU0ZPUk1fT05fQ09OU1RSQUlOVF9IQU5ETElORyIsIkVORk9SQ0VfQ09OU1RSQUlOVFMiLCJBUFBMWV9MQVlPVVQiLCJUUkVFX1JFRFVDVElPTl9PTl9JTkNSRU1FTlRBTCIsIm5ld0dyYXBoTWFuYWdlciIsImFkZFJvb3QiLCJydW5MYXlvdXQiLCJkZXNjcmlwdG9yIiwiQ29uc3RydWN0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJpbnN0YW5jZSIsIl9yZXF1aXJlIiwic3BlY3RyYWxMYXlvdXQiLCJfcmVxdWlyZTIiLCJkZWZhdWx0cyIsImZyZWV6ZSIsImFuaW1hdGlvbkR1cmF0aW9uIiwiYW5pbWF0aW9uRWFzaW5nIiwicGFja0NvbXBvbmVudHMiLCJzYW1wbGluZ1R5cGUiLCJzYW1wbGVTaXplIiwibm9kZVNlcGFyYXRpb24iLCJwaVRvbCIsInN0b3AiLCJMYXlvdXQiLCJydW4iLCJjb3NlUmVzdWx0IiwiY29tcG9uZW50Q2VudGVycyIsInZlcnRpY2FsIiwiaG9yaXpvbnRhbCIsImNvbnN0cmFpbnRFeGlzdCIsImxheVV0aWwiLCJwYWNraW5nRW5hYmxlZCIsImxheW91dFV0aWxpdGllcyIsIngxIiwieTEiLCJ0b0JlVGlsZWROb2RlcyIsIl94Q29vcmRzIiwiX3lDb29yZHMiLCJ0ZW1wU3BlY3RyYWxSZXN1bHQiLCJpbmRleGVzVG9CZURlbGV0ZWQiLCJfYm91bmRpbmdCb3giLCJjb21wb25lbnRzRXZhbHVhdGVkIiwic3ViZ3JhcGhzIiwiaGlkZGVuRWxlcyIsInN1YmdyYXBoIiwibm9kZUluZGV4IiwiYm91bmRpbmdib3giLCJnZXRMZWZ0IiwiZ2V0VG9wIiwiZ2V0V2lkdGgiLCJnZXRIZWlnaHQiLCJzb3VyY2VOb2RlSW5kZXgiLCJ0YXJnZXROb2RlSW5kZXgiLCJzb3VyY2VDZW50ZXIiLCJ0YXJnZXRDZW50ZXIiLCJfcGFyZW50SW5mbyIsInN0YXJ0WCIsInN0YXJ0WSIsImVuZFgiLCJlbmRZIiwic2hpZnRSZXN1bHQiLCJzaGlmdHMiLCJuZXdYQ29vcmRzIiwiZHgiLCJuZXdZQ29vcmRzIiwiZHkiLCJfY291bnQiLCJub2RlUmVjdGFuZ2xlIiwiZ2V0UG9zaXRpb25zIiwicG9zIiwidGhlSWQiLCJfcG9zIiwiX2hpZGRlbkVsZXMiLCJsYXlvdXRQb3NpdGlvbnMiLCJNYXRyaXgiLCJTVkQiLCJwYXJlbnROb2RlcyIsInBhcmVudENoaWxkTWFwIiwiYWxsTm9kZXNOZWlnaGJvcmhvb2QiLCJzYW1wbGVzQ29sdW1uIiwibWluRGlzdGFuY2VzQ29sdW1uIiwiUEhJIiwiSU5WIiwiZmlyc3RTYW1wbGUiLCJub2RlU2l6ZSIsImluZmluaXR5Iiwic21hbGwiLCJyYW5kb21TYW1wbGVDUiIsInNhbXBsZSIsImZsYWciLCJmbG9vciIsIkJGUyIsInBpdm90Iiwic2FtcGxpbmdNZXRob2QiLCJkaXN0YW5jZSIsIm1heF9kaXN0IiwibWF4X2luZCIsIm5laWdoYm9ycyIsIl9pMiIsIl9pMyIsImFsbEJGUyIsIl9pNCIsIl9pNSIsIl9pNiIsIl9pNyIsIl9pOCIsIl9qIiwiU1ZEUmVzdWx0Iiwic3ZkIiwiYV9xIiwiUyIsImFfdSIsIlUiLCJhX3YiLCJWIiwibWF4X3MiLCJhX1NpZyIsIm11bHRNYXQiLCJ0cmFuc3Bvc2UiLCJwb3dlckl0ZXJhdGlvbiIsInRoZXRhMSIsInRoZXRhMiIsIlkxIiwiWTIiLCJWMSIsIlYyIiwibm9ybWFsaXplIiwiX2k5IiwibXVsdEdhbW1hIiwibXVsdEwiLCJkb3RQcm9kdWN0IiwiYWJzIiwiX2kxMCIsIl9pMTEiLCJtaW51c09wIiwibXVsdENvbnMiLCJfaTEyIiwic3FydCIsIl9pMTMiLCJlbGUyIiwiZWxlSW5kZXgiLCJkaXNjb25uZWN0ZWRJZCIsIl9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24yIiwiX2RpZEl0ZXJhdG9yRXJyb3IyIiwiX2l0ZXJhdG9yRXJyb3IyIiwiX2kxNCIsIl9pMTUiLCJmaXJzdE5vZGVQb3MiLCJmaXJzdE5vZGVXaWR0aCIsInNlY29uZE5vZGUiLCJzZWNvbmROb2RlV2lkdGgiLCJpbXBsIiwicmVnaXN0ZXIiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19leHBvcnRzX18iLCJvbmVPZlR5cGUiLCJwYW5uaW5nRW5hYmxlZCIsInVzZXJQYW5uaW5nRW5hYmxlZCIsIm1pblpvb20iLCJtYXhab29tIiwiem9vbWluZ0VuYWJsZWQiLCJ1c2VyWm9vbWluZ0VuYWJsZWQiLCJib3hTZWxlY3Rpb25FbmFibGVkIiwiYXV0b3VuZ3JhYmlmeSIsImF1dG9sb2NrIiwiYXV0b3Vuc2VsZWN0aWZ5IiwidG9Kc29uIiwiaGVhZGxlc3MiLCJzdHlsZUVuYWJsZWQiLCJoaWRlRWRnZXNPblZpZXdwb3J0IiwidGV4dHVyZU9uVmlld3BvcnQiLCJtb3Rpb25CbHVyIiwibW90aW9uQmx1ck9wYWNpdHkiLCJ3aGVlbFNlbnNpdGl2aXR5IiwicGl4ZWxSYXRpbyIsInNoYWxsb3dPYmpEaWZmIiwibWlzbWF0Y2hlcyIsImlzRGlmZkF0S2V5IiwiRSIsImciLCJwYXRjaEpzb24iLCJ2YWwyIiwiZnJvbUpzb24iLCJnZXRJZCIsImVsZTEiLCJPIiwic2NyYXRjaCIsIl9lJENvbXBvbmVudCIsImNvbnRhaW5lclJlZiIsImNyZWF0ZVJlZiIsImdsb2JhbCIsIl9jeSIsInVwZGF0ZUN5dG9zY2FwZSIsImRlc3Ryb3kiLCJfdGhpcyRwcm9wczIiLCJub3JtYWxpemVFbGVtZW50cyIsInN0YXRpYyIsIlJlYWN0UmVkdXhDb250ZXh0IiwiY3JlYXRlU3Vic2NyaXB0aW9uIiwidXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCIsImNvbnRleHQiLCJzZXJ2ZXJTdGF0ZSIsImNvbnRleHRWYWx1ZSIsInN1YnNjcmlwdGlvbiIsImdldFNlcnZlclN0YXRlIiwicHJldmlvdXNTdGF0ZSIsIm9uU3RhdGVDaGFuZ2UiLCJub3RpZnlOZXN0ZWRTdWJzIiwidHJ5U3Vic2NyaWJlIiwidHJ5VW5zdWJzY3JpYmUiLCJDb250ZXh0IiwiX2V4dGVuZHMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSIsImhvaXN0U3RhdGljcyIsImlzVmFsaWRFbGVtZW50VHlwZSIsImlzQ29udGV4dENvbnN1bWVyIiwiZGVmYXVsdFNlbGVjdG9yRmFjdG9yeSIsIm1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcnkiLCJtYXBTdGF0ZVRvUHJvcHNGYWN0b3J5IiwibWVyZ2VQcm9wc0ZhY3RvcnkiLCJzaGFsbG93RXF1YWwiLCJ3YXJuaW5nIiwibm90SW5pdGlhbGl6ZWQiLCJ1c2VTeW5jRXh0ZXJuYWxTdG9yZSIsImluaXRpYWxpemVDb25uZWN0IiwiRU1QVFlfQVJSQVkiLCJOT19TVUJTQ1JJUFRJT05fQVJSQVkiLCJzdHJpbmdpZnlDb21wb25lbnQiLCJDb21wIiwidXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdFdpdGhBcmdzIiwiZWZmZWN0RnVuYyIsImVmZmVjdEFyZ3MiLCJjYXB0dXJlV3JhcHBlclByb3BzIiwibGFzdFdyYXBwZXJQcm9wcyIsImxhc3RDaGlsZFByb3BzIiwicmVuZGVySXNTY2hlZHVsZWQiLCJ3cmFwcGVyUHJvcHMiLCJjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlIiwic3Vic2NyaWJlVXBkYXRlcyIsInNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyIsImNoaWxkUHJvcHNTZWxlY3RvciIsImlzTW91bnRlZCIsImFkZGl0aW9uYWxTdWJzY3JpYmVMaXN0ZW5lciIsImRpZFVuc3Vic2NyaWJlIiwibGFzdFRocm93bkVycm9yIiwiY2hlY2tGb3JVcGRhdGVzIiwibGF0ZXN0U3RvcmVTdGF0ZSIsIm5ld0NoaWxkUHJvcHMiLCJ1bnN1YnNjcmliZVdyYXBwZXIiLCJpbml0U3RhdGVVcGRhdGVzIiwic3RyaWN0RXF1YWwiLCJoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRQdXJlT3B0aW9uIiwibWFwU3RhdGVUb1Byb3BzIiwibWFwRGlzcGF0Y2hUb1Byb3BzIiwibWVyZ2VQcm9wcyIsInB1cmUiLCJfcmVmJGFyZVN0YXRlc0VxdWFsIiwiYXJlU3RhdGVzRXF1YWwiLCJfcmVmJGFyZU93blByb3BzRXF1YWwiLCJhcmVPd25Qcm9wc0VxdWFsIiwiX3JlZiRhcmVTdGF0ZVByb3BzRXF1IiwiYXJlU3RhdGVQcm9wc0VxdWFsIiwiX3JlZiRhcmVNZXJnZWRQcm9wc0VxIiwiYXJlTWVyZ2VkUHJvcHNFcXVhbCIsIl9yZWYkZm9yd2FyZFJlZiIsImZvcndhcmRSZWYiLCJfcmVmJGNvbnRleHQiLCJpbml0TWFwU3RhdGVUb1Byb3BzIiwiaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyIsImluaXRNZXJnZVByb3BzIiwid3JhcFdpdGhDb25uZWN0IiwiV3JhcHBlZENvbXBvbmVudCIsIndyYXBwZWRDb21wb25lbnROYW1lIiwic2VsZWN0b3JGYWN0b3J5T3B0aW9ucyIsIkNvbm5lY3RGdW5jdGlvbiIsIl91c2VNZW1vIiwicmVhY3RSZWR1eEZvcndhcmRlZFJlZiIsIl91c2VNZW1vMiIsInByb3BzQ29udGV4dCIsIkNvbnRleHRUb1VzZSIsIkNvbnN1bWVyIiwiZGlkU3RvcmVDb21lRnJvbVByb3BzIiwiZGlkU3RvcmVDb21lRnJvbUNvbnRleHQiLCJfdXNlTWVtbzMiLCJfdXNlTWVtbzQiLCJvdmVycmlkZGVuQ29udGV4dFZhbHVlIiwiaXNQcm9jZXNzaW5nRGlzcGF0Y2giLCJsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yIiwiYWN0dWFsQ2hpbGRQcm9wc1NlbGVjdG9yIiwic3Vic2NyaWJlRm9yUmVhY3QiLCJyZWFjdExpc3RlbmVyIiwiYWN0dWFsQ2hpbGRQcm9wcyIsInJlbmRlcmVkV3JhcHBlZENvbXBvbmVudCIsInJlbmRlcmVkQ2hpbGQiLCJfQ29ubmVjdCIsIm1lbW8iLCJDb25uZWN0IiwiX2ZvcndhcmRlZCIsImZvcndhcmRDb25uZWN0UmVmIiwiZm9yd2FyZGVkIiwiY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkiLCJiaW5kQWN0aW9uQ3JlYXRvcnMiLCJ3cmFwTWFwVG9Qcm9wc0NvbnN0YW50Iiwid3JhcE1hcFRvUHJvcHNGdW5jIiwidmVyaWZ5UGxhaW5PYmplY3QiLCJkZWZhdWx0TWVyZ2VQcm9wcyIsInN0YXRlUHJvcHMiLCJkaXNwYXRjaFByb3BzIiwib3duUHJvcHMiLCJ3cmFwTWVyZ2VQcm9wc0Z1bmMiLCJpbml0TWVyZ2VQcm9wc1Byb3h5IiwiaGFzUnVuT25jZSIsIm1lcmdlUHJvcHNQcm94eSIsIm5leHRNZXJnZWRQcm9wcyIsInZlcmlmeVN1YnNlbGVjdG9ycyIsInB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5IiwiaGFzUnVuQXRMZWFzdE9uY2UiLCJoYW5kbGVGaXJzdENhbGwiLCJmaXJzdFN0YXRlIiwiZmlyc3RPd25Qcm9wcyIsImhhbmRsZU5ld1Byb3BzQW5kTmV3U3RhdGUiLCJkZXBlbmRzT25Pd25Qcm9wcyIsImhhbmRsZU5ld1Byb3BzIiwiaGFuZGxlTmV3U3RhdGUiLCJuZXh0U3RhdGVQcm9wcyIsInN0YXRlUHJvcHNDaGFuZ2VkIiwiaGFuZGxlU3Vic2VxdWVudENhbGxzIiwibmV4dE93blByb3BzIiwicHJvcHNDaGFuZ2VkIiwic3RhdGVDaGFuZ2VkIiwicHVyZUZpbmFsUHJvcHNTZWxlY3RvciIsImZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkiLCJ2ZXJpZnkiLCJtZXRob2ROYW1lIiwiZ2V0Q29uc3RhbnQiLCJpbml0Q29uc3RhbnRTZWxlY3RvciIsImNvbnN0YW50IiwiY29uc3RhbnRTZWxlY3RvciIsImdldERlcGVuZHNPbk93blByb3BzIiwibWFwVG9Qcm9wcyIsImluaXRQcm94eVNlbGVjdG9yIiwicHJveHkiLCJtYXBUb1Byb3BzUHJveHkiLCJzdGF0ZU9yRGlzcGF0Y2giLCJkZXRlY3RGYWN0b3J5QW5kVmVyaWZ5IiwiY3JlYXRlRGlzcGF0Y2hIb29rIiwiY3JlYXRlU2VsZWN0b3JIb29rIiwiY3JlYXRlU3RvcmVIb29rIiwidXNlRGVmYXVsdFN0b3JlIiwidXNlUmVkdXhDb250ZXh0IiwidXNlRGVidWdWYWx1ZSIsInVzZURlZmF1bHRSZWR1eENvbnRleHQiLCJ1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciIsImluaXRpYWxpemVVc2VTZWxlY3RvciIsInJlZkVxdWFsaXR5IiwiZXF1YWxpdHlGbiIsIl91c2VSZWR1eENvbnRleHQiLCJzZWxlY3RlZFN0YXRlIiwiYWRkTmVzdGVkU3ViIiwidW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMiLCJzZXRCYXRjaCIsImdldEJhdGNoIiwiY3JlYXRlTGlzdGVuZXJDb2xsZWN0aW9uIiwiZmlyc3QiLCJsaXN0ZW5lcnMiLCJpc1N1YnNjcmliZWQiLCJ1bnN1YnNjcmliZSIsIm51bGxMaXN0ZW5lcnMiLCJwYXJlbnRTdWIiLCJoYW5kbGVDaGFuZ2VXcmFwcGVyIiwiZ2V0TGlzdGVuZXJzIiwiZGVmYXVsdE5vb3BCYXRjaCIsIm5ld0JhdGNoIiwiYWN0aW9uQ3JlYXRvcnMiLCJib3VuZEFjdGlvbkNyZWF0b3JzIiwiYWN0aW9uQ3JlYXRvciIsImlzUGxhaW5PYmplY3QiLCJwcm90byIsImJhc2VQcm90byIsIm9iakEiLCJvYmpCIiwia2V5c0EiLCJrZXlzQiIsInVzZUxheW91dEVmZmVjdCIsImNhblVzZURPTSIsIlJFQUNUX0VMRU1FTlRfVFlQRSIsImZvciIsIlJFQUNUX1BPUlRBTF9UWVBFIiwiUkVBQ1RfRlJBR01FTlRfVFlQRSIsIlJFQUNUX1NUUklDVF9NT0RFX1RZUEUiLCJSRUFDVF9QUk9GSUxFUl9UWVBFIiwiUkVBQ1RfUFJPVklERVJfVFlQRSIsIlJFQUNUX0NPTlRFWFRfVFlQRSIsIlJFQUNUX1NFUlZFUl9DT05URVhUX1RZUEUiLCJSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIiwiUkVBQ1RfU1VTUEVOU0VfVFlQRSIsIlJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSIsIlJFQUNUX01FTU9fVFlQRSIsIlJFQUNUX0xBWllfVFlQRSIsIlJFQUNUX09GRlNDUkVFTl9UWVBFIiwiZW5hYmxlU2NvcGVBUEkiLCJlbmFibGVDYWNoZUVsZW1lbnQiLCJlbmFibGVUcmFuc2l0aW9uVHJhY2luZyIsImVuYWJsZUxlZ2FjeUhpZGRlbiIsImVuYWJsZURlYnVnVHJhY2luZyIsIlJFQUNUX01PRFVMRV9SRUZFUkVOQ0UiLCIkJHR5cGVvZiIsImdldE1vZHVsZUlkIiwidHlwZU9mIiwiJCR0eXBlb2ZUeXBlIiwiQ29udGV4dENvbnN1bWVyIiwiQ29udGV4dFByb3ZpZGVyIiwiRWxlbWVudCIsIkZvcndhcmRSZWYiLCJMYXp5IiwiTWVtbyIsIlBvcnRhbCIsIlByb2ZpbGVyIiwiU3RyaWN0TW9kZSIsIlN1c3BlbnNlIiwiU3VzcGVuc2VMaXN0IiwiaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUiLCJoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlIiwiaXNBc3luY01vZGUiLCJpc0NvbmN1cnJlbnRNb2RlIiwiaXNDb250ZXh0UHJvdmlkZXIiLCJpc0VsZW1lbnQiLCJpc0ZvcndhcmRSZWYiLCJpc0ZyYWdtZW50IiwiaXNMYXp5IiwiaXNNZW1vIiwiaXNQb3J0YWwiLCJpc1Byb2ZpbGVyIiwiaXNTdHJpY3RNb2RlIiwiaXNTdXNwZW5zZSIsImlzU3VzcGVuc2VMaXN0IiwiX2N1cnJ5MiIsIl9kaXNwYXRjaGFibGUiLCJfeGFsbCIsImxpc3QiLCJfY3VycnkxIiwiYWx3YXlzIiwiX3hhbnkiLCJfY29uY2F0IiwiX3JlZHVjZSIsImFwcGx5RiIsImFwcGx5WCIsIl9jdXJyeTMiLCJfaGFzIiwiX2lzSW50ZWdlciIsIl9hc3NvYyIsIm5leHRPYmoiLCJfYXJpdHkiLCJ0aGlzT2JqIiwiX2Nsb25lIiwicHJlZCIsIl9pc0FycmF5IiwiX2lzRnVuY3Rpb24iLCJfaXNTdHJpbmciLCJfbWFwIiwiY3VycnlOIiwiY29udmVyZ2UiLCJhZnRlciIsImZucyIsIl9jdXJyeU4iLCJkZWZhdWx0VG8iLCJfU2V0Iiwic2Vjb25kIiwiZmlyc3RMZW4iLCJzZWNvbmRMZW4iLCJ0b0ZpbHRlck91dCIsIl9kaXNzb2MiLCJfc2hhbGxvd0Nsb25lT2JqZWN0IiwiX2lzQXJndW1lbnRzIiwiX2lzT2JqZWN0IiwiX2lzVHlwZWRBcnJheSIsIl9lcXVhbHMiLCJ0cmFuc2Zvcm1hdGlvbnMiLCJ0cmFuc2Zvcm1hdGlvbiIsIl9hcnJheVJlZHVjZSIsIl9maWx0ZXIiLCJfeGZpbHRlciIsImZpbHRlcmFibGUiLCJfeGZpbmQiLCJfeGZpbmRJbmRleCIsIl9tYWtlRmxhdCIsIl9jaGVja0Zvck1ldGhvZCIsImtleUxpc3QiLCJyZWR1Y2VCeSIsImhhc1BhdGgiLCJfcGF0aCIsIl9pZGVudGl0eSIsIl9pbmNsdWRlcyIsIl9pbmRleE9mIiwieHMiLCJlbHQiLCJfbmF0aXZlU2V0IiwiX2l0ZW1zIiwiaGFzT3JBZGQiLCJzaG91bGRBZGQiLCJwcmV2U2l6ZSIsIm5ld1NpemUiLCJJbmZpbml0eSIsImJJZHgiLCJhMCIsImExIiwiYTIiLCJhMyIsImE0IiwiYTUiLCJhNiIsImE3IiwiYTgiLCJhOSIsIl9hcnJheUZyb21JdGVyYXRvciIsIml0ZXIiLCJtZXRob2RuYW1lIiwiX2Nsb25lUmVnRXhwIiwiZGVlcCIsIl9PYmplY3RNYXAiLCJfaXNQcmltaXRpdmUiLCJjb3B5IiwiY29waWVkVmFsdWUiLCJjYWNoZWRDb3B5IiwicGFyYW0iLCJoYXNoZWRLZXkiLCJidWNrZXQiLCJSZWdFeHAiLCJmbGFncyIsImlnbm9yZUNhc2UiLCJtdWx0aWxpbmUiLCJzdGlja3kiLCJ1bmljb2RlIiwiZG90QWxsIiwiX2NvbXBsZW1lbnQiLCJzZXQxIiwic2V0MiIsImxlbjEiLCJsZW4yIiwiX2lzQXJyYXlMaWtlIiwic3ltSXRlcmF0b3IiLCJfY3JlYXRlUmVkdWNlIiwiYXJyYXlSZWR1Y2UiLCJtZXRob2RSZWR1Y2UiLCJpdGVyYWJsZVJlZHVjZSIsInhmIiwiX2lzUGxhY2Vob2xkZXIiLCJmMSIsImYyIiwiX2IiLCJfYSIsImYzIiwiX2MiLCJyZWNlaXZlZCIsImNvbWJpbmVkIiwiYXJnc0lkeCIsImNvbWJpbmVkSWR4IiwiaGFzUGxhY2Vob2xkZXIiLCJfaXNUcmFuc2Zvcm1lciIsIm1ldGhvZE5hbWVzIiwidHJhbnNkdWNlckNyZWF0b3IiLCJ0cmFuc2R1Y2VyIiwiX2luY2x1ZGVzV2l0aCIsIl9mdW5jdGlvbk5hbWUiLCJfb2JqZWN0SXMiLCJfdW5pcUNvbnRlbnRFcXVhbHMiLCJhSXRlcmF0b3IiLCJiSXRlcmF0b3IiLCJzdGFja0EiLCJzdGFja0IiLCJlcSIsImFJdGVtIiwidHlwZUEiLCJleHRlbmRlZFN0YWNrQSIsImV4dGVuZGVkU3RhY2tCIiwiaW5mIiwiaXNBcnJheUxpa2UiLCJyZWN1cnNpdmUiLCJmbGF0dCIsImpsZW4iLCJpbGVuIiwiZnVuY3RvciIsIl9udGgiLCJvZmZzZXQiLCJfb2JqZWN0QXNzaWduIiwibmV4dEtleSIsInBhdGhBciIsIl9xdW90ZSIsImVzY2FwZWQiLCJfaXRlcmFibGVSZWR1Y2UiLCJfbWV0aG9kUmVkdWNlIiwiX3JlZHVjZWQiLCJwYWQiLCJfdG9JU09TdHJpbmciLCJ0b0lTT1N0cmluZyIsImdldFVUQ0Z1bGxZZWFyIiwiZ2V0VVRDTW9udGgiLCJnZXRVVENEYXRlIiwiZ2V0VVRDSG91cnMiLCJnZXRVVENNaW51dGVzIiwiZ2V0VVRDU2Vjb25kcyIsImdldFVUQ01pbGxpc2Vjb25kcyIsIl90b1N0cmluZyIsInNlZW4iLCJyZWN1ciIsIm1hcFBhaXJzIiwiTmFOIiwicmVwciIsIl94QXJyYXlSZWR1Y2UiLCJfeEl0ZXJhYmxlUmVkdWNlIiwiX3hNZXRob2RSZWR1Y2UiLCJfeFJlZHVjZSIsIl94ZkJhc2UiLCJYQWxsIiwiaW5pdCIsIlhBbnkiLCJYRmlsdGVyIiwiWEZpbmQiLCJYRmluZEluZGV4IiwiWE1hcCIsIl94bWFwIiwiWFJlZHVjZUJ5IiwidmFsdWVGbiIsInZhbHVlQWNjIiwia2V5Rm4iLCJfeHJlZHVjZUJ5IiwiWFRha2UiLCJyZXQiLCJfeHRha2UiLCJYVW5pcUJ5IiwiX3h1bmlxQnkiLCJYV3JhcCIsIl94d3JhcCIsInVuaXEiLCJsaXN0MSIsImxpc3QyIiwidG9LZWVwIiwiaW52b2tlciIsImFyaXR5IiwiQ3RvciIsImp1eHQiLCJoYXNFbnVtQnVnIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJub25FbnVtZXJhYmxlUHJvcHMiLCJoYXNBcmdzRW51bUJ1ZyIsImNvbnRhaW5zIiwibklkeCIsImtzIiwiY2hlY2tBcmdzTGVuZ3RoIiwibGVucyIsInNldHRlciIsInRvRnVuY3RvckZuIiwiZm9jdXMiLCJzYWZlTWF4IiwibWF4QnlWYWx1ZSIsIm1heEJ5VHlwZSIsInN0cmluZ0EiLCJtYXhCeVN0cmluZ1ZhbHVlIiwia2V5R2VuIiwiY2FjaGUiLCJtZXJnZURlZXBXaXRoS2V5IiwibE9iaiIsInJPYmoiLCJsVmFsIiwiclZhbCIsIm1lcmdlV2l0aEtleSIsIl9sIiwiX3IiLCJuYW1lcyIsImNhbGxlZCIsIklkZW50aXR5Iiwib3ZlciIsInBzIiwiZnJvbUluZGV4IiwidG9JbmRleCIsInRha2UiLCJwYWlycyIsInVuaXFCeSIsImFwcGxpZWRJdGVtIiwiQ29uc3QiLCJmYW50YXN5TGFuZF9tYXAiLCJydiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/dash/dash-renderer/build/dash_renderer.min.js b/dash/dash-renderer/build/dash_renderer.min.js index 78078158a6..706da41fb0 100644 --- a/dash/dash-renderer/build/dash_renderer.min.js +++ b/dash/dash-renderer/build/dash_renderer.min.js @@ -1,2 +1,2 @@ /*! For license information please see dash_renderer.min.js.LICENSE.txt */ -(()=>{var t={296(t,e,r){var n;window,t.exports=(n=r(609),function(t){var e={};function r(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)r.d(n,o,function(e){return t[e]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=1)}([function(t,e){t.exports=n},function(t,e,r){"use strict";r.r(e),r.d(e,"asyncDecorator",function(){return i}),r.d(e,"inheritAsyncDecorator",function(){return u}),r.d(e,"isReady",function(){return c}),r.d(e,"History",function(){return f});var n=r(0);function o(t,e,r,n,o,a,i){try{var u=t[a](i),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function a(t){return function(){var e=this,r=arguments;return new Promise(function(n,a){var i=t.apply(e,r);function u(t){o(i,n,a,u,c,"next",t)}function c(t){o(i,n,a,u,c,"throw",t)}u(void 0)})}}var i=function(t,e){var r,o={isReady:new Promise(function(t){r=t}),get:Object(n.lazy)(function(){return Promise.resolve(e()).then(function(t){return setTimeout(a(regeneratorRuntime.mark(function t(){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,r(!0);case 2:o.isReady=!0;case 3:case"end":return t.stop()}},t)})),0),t})})};return Object.defineProperty(t,"_dashprivate_isLazyComponentReady",{get:function(){return o.isReady}}),o.get},u=function(t,e){Object.defineProperty(t,"_dashprivate_isLazyComponentReady",{get:function(){return c(e)}})},c=function(t){return t&&t._dashprivate_isLazyComponentReady};function s(t,e){for(var r=0;rp)l=t.lastIndexOf(";",f-1)+1;else{var d=a(t,l,f);void 0===u[d]&&(u[d]=s(a(t,f+1,p))),l=p+1}}while(l{var t=function(){};return t.prototype=Object.create(null),t})();function n(t,e,r){var n=t.indexOf(";",e);return-1===n?r:n}function o(t,e,r){var n=t.indexOf("=",e);return nn;){var i=t.charCodeAt(o-1);if(32!==i&&9!==i)break;o--}return t.slice(n,o)}function i(t){if(-1===t.indexOf("%"))return t;try{return decodeURIComponent(t)}catch(e){return t}}},712(t,e){"use strict";var r=Symbol.for("react.element"),n=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),u=Symbol.for("react.provider"),c=Symbol.for("react.context"),s=Symbol.for("react.server_context"),l=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),p=Symbol.for("react.suspense_list"),d=Symbol.for("react.memo"),h=Symbol.for("react.lazy");Symbol.for("react.offscreen");Symbol.for("react.module.reference"),e.isContextConsumer=function(t){return function(t){if("object"==typeof t&&null!==t){var e=t.$$typeof;switch(e){case r:switch(t=t.type){case o:case i:case a:case f:case p:return t;default:switch(t=t&&t.$$typeof){case s:case c:case l:case h:case d:case u:return t;default:return e}}case n:return e}}}(t)===c}},516(t,e,r){"use strict";t.exports=r(712)},217(t,e,r){"use strict";var n=r(601),o=r.n(n),a=r(314),i=r.n(a)()(o());i.push([t.id,"._dash-undo-redo {\n position: fixed;\n bottom: 30px;\n left: 30px;\n font-size: 20px;\n text-align: center;\n z-index: 9999;\n background-color: rgba(255, 255, 255, 0.9);\n}\n._dash-undo-redo > div {\n position: relative;\n}\n._dash-undo-redo-link {\n color: #0074d9;\n cursor: pointer;\n margin-left: 10px;\n margin-right: 10px;\n display: inline-block;\n opacity: 0.2;\n}\n._dash-undo-redo-link:hover {\n opacity: 1;\n}\n._dash-undo-redo-link ._dash-icon-undo {\n font-size: 20px;\n transform: rotate(270deg);\n}\n._dash-undo-redo-link ._dash-icon-redo {\n font-size: 20px;\n transform: rotate(90deg);\n}\n._dash-undo-redo-link ._dash-undo-redo-label {\n font-size: 15px;\n}\n",""]),e.A=i},314(t){"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map(function(e){var r="",n=void 0!==e[5];return e[4]&&(r+="@supports (".concat(e[4],") {")),e[2]&&(r+="@media ".concat(e[2]," {")),n&&(r+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),r+=t(e),n&&(r+="}"),e[2]&&(r+="}"),e[4]&&(r+="}"),r}).join("")},e.i=function(t,r,n,o,a){"string"==typeof t&&(t=[[null,t,void 0]]);var i={};if(n)for(var u=0;u0?" ".concat(l[5]):""," {").concat(l[1],"}")),l[5]=a),r&&(l[2]?(l[1]="@media ".concat(l[2]," {").concat(l[1],"}"),l[2]=r):l[2]=r),o&&(l[4]?(l[1]="@supports (".concat(l[4],") {").concat(l[1],"}"),l[4]=o):l[4]="".concat(o)),e.push(l))}},e}},601(t){"use strict";t.exports=function(t){return t[1]}},131(t,e){function r(t,e,r,n){var a={};return function(i){if(!a[i]){var u={},c=[],s=[];for(s.push({node:i,processed:!1});s.length>0;){var l=s[s.length-1],f=l.processed,p=l.node;if(f)s.pop(),c.pop(),u[p]=!1,a[p]=!0,e&&0!==t[p].length||r.push(p);else{if(a[p]){s.pop();continue}if(u[p]){if(n){s.pop();continue}throw c.push(p),new o(c)}u[p]=!0,c.push(p);for(var d=t[p],h=d.length-1;h>=0;h--)s.push({node:d[h],processed:!1});l.processed=!0}}}}}var n=e.w=function(t){this.nodes={},this.outgoingEdges={},this.incomingEdges={},this.circular=t&&!!t.circular};n.prototype={size:function(){return Object.keys(this.nodes).length},addNode:function(t,e){this.hasNode(t)||(this.nodes[t]=2===arguments.length?e:t,this.outgoingEdges[t]=[],this.incomingEdges[t]=[])},removeNode:function(t){this.hasNode(t)&&(delete this.nodes[t],delete this.outgoingEdges[t],delete this.incomingEdges[t],[this.incomingEdges,this.outgoingEdges].forEach(function(e){Object.keys(e).forEach(function(r){var n=e[r].indexOf(t);n>=0&&e[r].splice(n,1)},this)}))},hasNode:function(t){return this.nodes.hasOwnProperty(t)},getNodeData:function(t){if(this.hasNode(t))return this.nodes[t];throw new Error("Node does not exist: "+t)},setNodeData:function(t,e){if(!this.hasNode(t))throw new Error("Node does not exist: "+t);this.nodes[t]=e},addDependency:function(t,e){if(!this.hasNode(t))throw new Error("Node does not exist: "+t);if(!this.hasNode(e))throw new Error("Node does not exist: "+e);return-1===this.outgoingEdges[t].indexOf(e)&&this.outgoingEdges[t].push(e),-1===this.incomingEdges[e].indexOf(t)&&this.incomingEdges[e].push(t),!0},removeDependency:function(t,e){var r;this.hasNode(t)&&(r=this.outgoingEdges[t].indexOf(e))>=0&&this.outgoingEdges[t].splice(r,1),this.hasNode(e)&&(r=this.incomingEdges[e].indexOf(t))>=0&&this.incomingEdges[e].splice(r,1)},clone:function(){var t=this,e=new n;return Object.keys(t.nodes).forEach(function(r){e.nodes[r]=t.nodes[r],e.outgoingEdges[r]=t.outgoingEdges[r].slice(0),e.incomingEdges[r]=t.incomingEdges[r].slice(0)}),e},directDependenciesOf:function(t){if(this.hasNode(t))return this.outgoingEdges[t].slice(0);throw new Error("Node does not exist: "+t)},directDependantsOf:function(t){if(this.hasNode(t))return this.incomingEdges[t].slice(0);throw new Error("Node does not exist: "+t)},dependenciesOf:function(t,e){if(this.hasNode(t)){var n=[];r(this.outgoingEdges,e,n,this.circular)(t);var o=n.indexOf(t);return o>=0&&n.splice(o,1),n}throw new Error("Node does not exist: "+t)},dependantsOf:function(t,e){if(this.hasNode(t)){var n=[];r(this.incomingEdges,e,n,this.circular)(t);var o=n.indexOf(t);return o>=0&&n.splice(o,1),n}throw new Error("Node does not exist: "+t)},overallOrder:function(t){var e=this,n=[],o=Object.keys(this.nodes);if(0===o.length)return n;if(!this.circular){var a=r(this.outgoingEdges,!1,[],this.circular);o.forEach(function(t){a(t)})}var i=r(this.outgoingEdges,t,n,this.circular);return o.filter(function(t){return 0===e.incomingEdges[t].length}).forEach(function(t){i(t)}),this.circular&&o.filter(function(t){return-1===n.indexOf(t)}).forEach(function(t){i(t)}),n},entryNodes:function(){var t=this;return Object.keys(this.nodes).filter(function(e){return 0===t.incomingEdges[e].length})}},n.prototype.directDependentsOf=n.prototype.directDependantsOf,n.prototype.dependentsOf=n.prototype.dependantsOf;var o=function(t){var e="Dependency Cycle Found: "+t.join(" -> "),r=new Error(e);return r.cyclePath=t,Object.setPrototypeOf(r,Object.getPrototypeOf(this)),Error.captureStackTrace&&Error.captureStackTrace(r,o),r};o.prototype=Object.create(Error.prototype,{constructor:{value:Error,enumerable:!1,writable:!0,configurable:!0}}),Object.setPrototypeOf(o,Error)},365(t,e,r){"use strict";var n=r(886);t.exports=function(t){var e=typeof t;if("string"===e){var r=t;if(0===(t=+t)&&n(r))return!1}else if("number"!==e)return!1;return t-t<1}},146(t,e,r){"use strict";var n=r(363),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},u={};function c(t){return n.isMemo(t)?i:u[t.$$typeof]||o}u[n.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},u[n.Memo]=i;var s=Object.defineProperty,l=Object.getOwnPropertyNames,f=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,d=Object.getPrototypeOf,h=Object.prototype;t.exports=function t(e,r,n){if("string"!=typeof r){if(h){var o=d(r);o&&o!==h&&t(e,o,n)}var i=l(r);f&&(i=i.concat(f(r)));for(var u=c(e),y=c(r),v=0;v13)&&32!==e&&133!==e&&160!==e&&5760!==e&&6158!==e&&(e<8192||e>8205)&&8232!==e&&8233!==e&&8239!==e&&8287!==e&&8288!==e&&12288!==e&&65279!==e)return!1;return!0}},925(t){"use strict";t.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},799(t,e){"use strict";var r="function"==typeof Symbol&&Symbol.for,n=r?Symbol.for("react.element"):60103,o=r?Symbol.for("react.portal"):60106,a=r?Symbol.for("react.fragment"):60107,i=r?Symbol.for("react.strict_mode"):60108,u=r?Symbol.for("react.profiler"):60114,c=r?Symbol.for("react.provider"):60109,s=r?Symbol.for("react.context"):60110,l=r?Symbol.for("react.async_mode"):60111,f=r?Symbol.for("react.concurrent_mode"):60111,p=r?Symbol.for("react.forward_ref"):60112,d=r?Symbol.for("react.suspense"):60113,h=r?Symbol.for("react.suspense_list"):60120,y=r?Symbol.for("react.memo"):60115,v=r?Symbol.for("react.lazy"):60116,b=r?Symbol.for("react.block"):60121,m=r?Symbol.for("react.fundamental"):60117,g=r?Symbol.for("react.responder"):60118,w=r?Symbol.for("react.scope"):60119;function O(t){if("object"==typeof t&&null!==t){var e=t.$$typeof;switch(e){case n:switch(t=t.type){case l:case f:case a:case u:case i:case d:return t;default:switch(t=t&&t.$$typeof){case s:case p:case v:case y:case c:return t;default:return e}}case o:return e}}}function _(t){return O(t)===f}e.AsyncMode=l,e.ConcurrentMode=f,e.ContextConsumer=s,e.ContextProvider=c,e.Element=n,e.ForwardRef=p,e.Fragment=a,e.Lazy=v,e.Memo=y,e.Portal=o,e.Profiler=u,e.StrictMode=i,e.Suspense=d,e.isAsyncMode=function(t){return _(t)||O(t)===l},e.isConcurrentMode=_,e.isContextConsumer=function(t){return O(t)===s},e.isContextProvider=function(t){return O(t)===c},e.isElement=function(t){return"object"==typeof t&&null!==t&&t.$$typeof===n},e.isForwardRef=function(t){return O(t)===p},e.isFragment=function(t){return O(t)===a},e.isLazy=function(t){return O(t)===v},e.isMemo=function(t){return O(t)===y},e.isPortal=function(t){return O(t)===o},e.isProfiler=function(t){return O(t)===u},e.isStrictMode=function(t){return O(t)===i},e.isSuspense=function(t){return O(t)===d},e.isValidElementType=function(t){return"string"==typeof t||"function"==typeof t||t===a||t===f||t===u||t===i||t===d||t===h||"object"==typeof t&&null!==t&&(t.$$typeof===v||t.$$typeof===y||t.$$typeof===c||t.$$typeof===s||t.$$typeof===p||t.$$typeof===m||t.$$typeof===g||t.$$typeof===w||t.$$typeof===b)},e.typeOf=O},363(t,e,r){"use strict";t.exports=r(799)},72(t){"use strict";var e=[];function r(t){for(var r=-1,n=0;n0?" ".concat(r.layer):""," {")),n+=r.css,o&&(n+="}"),r.media&&(n+="}"),r.supports&&(n+="}");var a=r.sourceMap;a&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),e.styleTagTransform(n,t,e.options)}(e,t,r)},remove:function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(e)}}}},113(t){"use strict";t.exports=function(t,e){if(e.styleSheet)e.styleSheet.cssText=t;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(t))}}},63(t,e,r){"use strict";var n=r(609),o="function"==typeof Object.is?Object.is:function(t,e){return t===e&&(0!==t||1/t==1/e)||t!=t&&e!=e},a=n.useState,i=n.useEffect,u=n.useLayoutEffect,c=n.useDebugValue;function s(t){var e=t.getSnapshot;t=t.value;try{var r=e();return!o(t,r)}catch(t){return!0}}var l="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(t,e){return e()}:function(t,e){var r=e(),n=a({inst:{value:r,getSnapshot:e}}),o=n[0].inst,l=n[1];return u(function(){o.value=r,o.getSnapshot=e,s(o)&&l({inst:o})},[t,r,e]),i(function(){return s(o)&&l({inst:o}),t(function(){s(o)&&l({inst:o})})},[t]),c(r),r};e.useSyncExternalStore=void 0!==n.useSyncExternalStore?n.useSyncExternalStore:l},940(t,e,r){"use strict";var n=r(609),o=r(888),a="function"==typeof Object.is?Object.is:function(t,e){return t===e&&(0!==t||1/t==1/e)||t!=t&&e!=e},i=o.useSyncExternalStore,u=n.useRef,c=n.useEffect,s=n.useMemo,l=n.useDebugValue;e.useSyncExternalStoreWithSelector=function(t,e,r,n,o){var f=u(null);if(null===f.current){var p={hasValue:!1,value:null};f.current=p}else p=f.current;f=s(function(){function t(t){if(!c){if(c=!0,i=t,t=n(t),void 0!==o&&p.hasValue){var e=p.value;if(o(e,t))return u=e}return u=t}if(e=u,a(i,t))return e;var r=n(t);return void 0!==o&&o(e,r)?e:(i=t,u=r)}var i,u,c=!1,s=void 0===r?null:r;return[function(){return t(e())},null===s?void 0:function(){return t(s())}]},[e,r,n,o]);var d=i(t,f[0],f[1]);return c(function(){p.hasValue=!0,p.value=d},[d]),l(d),d}},888(t,e,r){"use strict";t.exports=r(63)},242(t,e,r){"use strict";t.exports=r(940)},609(t){"use strict";t.exports=window.React}},e={};function r(n){var o=e[n];if(void 0!==o)return o.exports;var a=e[n]={id:n,exports:{}};return t[n](a,a.exports,r),a.exports}r.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return r.d(e,{a:e}),e},r.d=(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r.nc=void 0,(()=>{"use strict";var t="undefined"!=typeof globalThis&&globalThis||"undefined"!=typeof self&&self||void 0!==r.g&&r.g||{},e="URLSearchParams"in t,n="Symbol"in t&&"iterator"in Symbol,o="FileReader"in t&&"Blob"in t&&function(){try{return new Blob,!0}catch(t){return!1}}(),a="FormData"in t,i="ArrayBuffer"in t;if(i)var u=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],c=ArrayBuffer.isView||function(t){return t&&u.indexOf(Object.prototype.toString.call(t))>-1};function s(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(t)||""===t)throw new TypeError('Invalid character in header field name: "'+t+'"');return t.toLowerCase()}function l(t){return"string"!=typeof t&&(t=String(t)),t}function f(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return n&&(e[Symbol.iterator]=function(){return e}),e}function p(t){this.map={},t instanceof p?t.forEach(function(t,e){this.append(e,t)},this):Array.isArray(t)?t.forEach(function(t){if(2!=t.length)throw new TypeError("Headers constructor: expected name/value pair to be length 2, found"+t.length);this.append(t[0],t[1])},this):t&&Object.getOwnPropertyNames(t).forEach(function(e){this.append(e,t[e])},this)}function d(t){if(!t._noBody)return t.bodyUsed?Promise.reject(new TypeError("Already read")):void(t.bodyUsed=!0)}function h(t){return new Promise(function(e,r){t.onload=function(){e(t.result)},t.onerror=function(){r(t.error)}})}function y(t){var e=new FileReader,r=h(e);return e.readAsArrayBuffer(t),r}function v(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function b(){return this.bodyUsed=!1,this._initBody=function(t){var r;this.bodyUsed=this.bodyUsed,this._bodyInit=t,t?"string"==typeof t?this._bodyText=t:o&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:a&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:e&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():i&&o&&(r=t)&&DataView.prototype.isPrototypeOf(r)?(this._bodyArrayBuffer=v(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):i&&(ArrayBuffer.prototype.isPrototypeOf(t)||c(t))?this._bodyArrayBuffer=v(t):this._bodyText=t=Object.prototype.toString.call(t):(this._noBody=!0,this._bodyText=""),this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):e&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},o&&(this.blob=function(){var t=d(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))}),this.arrayBuffer=function(){if(this._bodyArrayBuffer)return d(this)||(ArrayBuffer.isView(this._bodyArrayBuffer)?Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset,this._bodyArrayBuffer.byteOffset+this._bodyArrayBuffer.byteLength)):Promise.resolve(this._bodyArrayBuffer));if(o)return this.blob().then(y);throw new Error("could not read as ArrayBuffer")},this.text=function(){var t,e,r,n,o,a=d(this);if(a)return a;if(this._bodyBlob)return t=this._bodyBlob,r=h(e=new FileReader),o=(n=/charset=([A-Za-z0-9_-]+)/.exec(t.type))?n[1]:"utf-8",e.readAsText(t,o),r;if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),r=new Array(e.length),n=0;n-1?o:n),this.mode=r.mode||this.mode||null,this.signal=r.signal||this.signal||function(){if("AbortController"in t)return(new AbortController).signal}(),this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&a)throw new TypeError("Body not allowed for GET or HEAD requests");if(this._initBody(a),!("GET"!==this.method&&"HEAD"!==this.method||"no-store"!==r.cache&&"no-cache"!==r.cache)){var i=/([?&])_=[^&]*/;i.test(this.url)?this.url=this.url.replace(i,"$1_="+(new Date).getTime()):this.url+=(/\?/.test(this.url)?"&":"?")+"_="+(new Date).getTime()}}function w(t){var e=new FormData;return t.trim().split("&").forEach(function(t){if(t){var r=t.split("="),n=r.shift().replace(/\+/g," "),o=r.join("=").replace(/\+/g," ");e.append(decodeURIComponent(n),decodeURIComponent(o))}}),e}function O(t,e){if(!(this instanceof O))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');if(e||(e={}),this.type="default",this.status=void 0===e.status?200:e.status,this.status<200||this.status>599)throw new RangeError("Failed to construct 'Response': The status provided (0) is outside the range [200, 599].");this.ok=this.status>=200&&this.status<300,this.statusText=void 0===e.statusText?"":""+e.statusText,this.headers=new p(e.headers),this.url=e.url||"",this._initBody(t)}g.prototype.clone=function(){return new g(this,{body:this._bodyInit})},b.call(g.prototype),b.call(O.prototype),O.prototype.clone=function(){return new O(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new p(this.headers),url:this.url})},O.error=function(){var t=new O(null,{status:200,statusText:""});return t.ok=!1,t.status=0,t.type="error",t};var _=[301,302,303,307,308];O.redirect=function(t,e){if(-1===_.indexOf(e))throw new RangeError("Invalid status code");return new O(null,{status:e,headers:{location:t}})};var j=t.DOMException;try{new j}catch(t){(j=function(t,e){this.message=t,this.name=e;var r=Error(t);this.stack=r.stack}).prototype=Object.create(Error.prototype),j.prototype.constructor=j}function E(e,r){return new Promise(function(n,a){var u=new g(e,r);if(u.signal&&u.signal.aborted)return a(new j("Aborted","AbortError"));var c=new XMLHttpRequest;function f(){c.abort()}if(c.onload=function(){var t,e,r={statusText:c.statusText,headers:(t=c.getAllResponseHeaders()||"",e=new p,t.replace(/\r?\n[\t ]+/g," ").split("\r").map(function(t){return 0===t.indexOf("\n")?t.substr(1,t.length):t}).forEach(function(t){var r=t.split(":"),n=r.shift().trim();if(n){var o=r.join(":").trim();try{e.append(n,o)}catch(t){console.warn("Response "+t.message)}}}),e)};0===u.url.indexOf("file://")&&(c.status<200||c.status>599)?r.status=200:r.status=c.status,r.url="responseURL"in c?c.responseURL:r.headers.get("X-Request-URL");var o="response"in c?c.response:c.responseText;setTimeout(function(){n(new O(o,r))},0)},c.onerror=function(){setTimeout(function(){a(new TypeError("Network request failed"))},0)},c.ontimeout=function(){setTimeout(function(){a(new TypeError("Network request timed out"))},0)},c.onabort=function(){setTimeout(function(){a(new j("Aborted","AbortError"))},0)},c.open(u.method,function(e){try{return""===e&&t.location.href?t.location.href:e}catch(t){return e}}(u.url),!0),"include"===u.credentials?c.withCredentials=!0:"omit"===u.credentials&&(c.withCredentials=!1),"responseType"in c&&(o?c.responseType="blob":i&&(c.responseType="arraybuffer")),r&&"object"==typeof r.headers&&!(r.headers instanceof p||t.Headers&&r.headers instanceof t.Headers)){var d=[];Object.getOwnPropertyNames(r.headers).forEach(function(t){d.push(s(t)),c.setRequestHeader(t,l(r.headers[t]))}),u.headers.forEach(function(t,e){-1===d.indexOf(e)&&c.setRequestHeader(e,t)})}else u.headers.forEach(function(t,e){c.setRequestHeader(e,t)});u.signal&&(u.signal.addEventListener("abort",f),c.onreadystatechange=function(){4===c.readyState&&u.signal.removeEventListener("abort",f)}),c.send(void 0===u._bodyInit?null:u._bodyInit)})}E.polyfill=!0,t.fetch||(t.fetch=E,t.Headers=p,t.Request=g,t.Response=O)})(),(()=>{"use strict";var t=r(609),e=r.n(t),n=window.ReactDOM,o=r.n(n),a=window.PropTypes,i=r.n(a),u=r(888),c=r(242),s=function(t){t()},l=()=>s,f=(0,t.createContext)(null);function p(){return(0,t.useContext)(f)}var d=()=>{throw new Error("uSES not initialized!")},h=d,y=(t,e)=>t===e;function v(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:f,r=e===f?p:()=>(0,t.useContext)(e);return function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:y,o=r(),a=o.store,i=o.subscription,u=o.getServerState,c=h(i.addNestedSub,a.getState,u||a.getState,e,n);return(0,t.useDebugValue)(c),c}}var b=v();function m(){return m=Object.assign?Object.assign.bind():function(t){for(var e=1;e{throw new Error("Invalid value of type ".concat(typeof t," for ").concat(e," argument when connecting component ").concat(n.wrappedComponentName,"."))}}function T(t,e,r){return m({},r,t,e)}var x={notify(){},get:()=>[]};function C(t,e){var r,n=x;function o(){i.onStateChange&&i.onStateChange()}function a(){r||(r=e?e.addNestedSub(o):t.subscribe(o),n=function(){var t=l(),e=null,r=null;return{clear(){e=null,r=null},notify(){t(()=>{for(var t=e;t;)t.callback(),t=t.next})},get(){for(var t=[],r=e;r;)t.push(r),r=r.next;return t},subscribe(t){var n=!0,o=r={callback:t,next:null,prev:r};return o.prev?o.prev.next=o:e=o,function(){n&&null!==e&&(n=!1,o.next?o.next.prev=o.prev:r=o.prev,o.prev?o.prev.next=o.next:e=o.next)}}}}())}var i={addNestedSub:function(t){return a(),n.subscribe(t)},notifyNestedSubs:function(){n.notify()},handleChangeWrapper:o,isSubscribed:function(){return Boolean(r)},trySubscribe:a,tryUnsubscribe:function(){r&&(r(),r=void 0,n.clear(),n=x)},getListeners:()=>n};return i}var I="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement?t.useLayoutEffect:t.useEffect;function R(t,e){return t===e?0!==t||0!==e||1/t==1/e:t!=t&&e!=e}function D(t,e){if(R(t,e))return!0;if("object"!=typeof t||null===t||"object"!=typeof e||null===e)return!1;var r=Object.keys(t),n=Object.keys(e);if(r.length!==n.length)return!1;for(var o=0;ot.length)&&(e=t.length);for(var r=0,n=Array(e);r3&&void 0!==arguments[3]?arguments[3]:{},i=(a.pure,a.areStatesEqual),u=void 0===i?B:i,c=a.areOwnPropsEqual,s=void 0===c?D:c,l=a.areStatePropsEqual,p=void 0===l?D:l,d=a.areMergedPropsEqual,h=void 0===d?D:d,y=a.forwardRef,v=void 0!==y&&y,b=a.context,w=void 0===b?f:b,P=function(t){return t?"function"==typeof t?A(t):k(t,"mapStateToProps"):S(()=>({}))}(r),x=function(t){return t&&"object"==typeof t?S(e=>function(t,e){var r={},n=function(){var n=t[o];"function"==typeof n&&(r[o]=function(){return e(n(...arguments))})};for(var o in t)n();return r}(t,e)):t?"function"==typeof t?A(t):k(t,"mapDispatchToProps"):S(t=>({dispatch:t}))}(n),R=function(t){return t?"function"==typeof t?function(t){return function(e,r){r.displayName;var n,o=r.areMergedPropsEqual,a=!1;return function(e,r,i){var u=t(e,r,i);return a?o(u,n)||(n=u):(a=!0,n=u),n}}}(t):k(t,"mergeProps"):()=>T}(o),M=Boolean(r);return r=>{var n=r.displayName||r.name||"Component",o="Connect(".concat(n,")"),a={shouldHandleStateChanges:M,displayName:o,wrappedComponentName:n,WrappedComponent:r,initMapStateToProps:P,initMapDispatchToProps:x,initMergeProps:R,areStatesEqual:u,areStatePropsEqual:p,areOwnPropsEqual:s,areMergedPropsEqual:h};function i(n){var o=(0,t.useMemo)(()=>{var t=n.reactReduxForwardedRef,e=g(n,U);return[n.context,t,e]},[n]),i=N(o,3),u=i[0],c=i[1],s=i[2],l=(0,t.useMemo)(()=>u&&u.Consumer&&(0,_.isContextConsumer)(e().createElement(u.Consumer,null))?u:w,[u,w]),f=(0,t.useContext)(l),p=Boolean(n.store)&&Boolean(n.store.getState)&&Boolean(n.store.dispatch),d=Boolean(f)&&Boolean(f.store),h=p?n.store:f.store,y=d?f.getServerState:h.getState,v=(0,t.useMemo)(()=>function(t,e){var r=e.initMapStateToProps,n=e.initMapDispatchToProps,o=e.initMergeProps,a=g(e,j);return E(r(t,a),n(t,a),o(t,a),t,a)}(h.dispatch,a),[h]),b=(0,t.useMemo)(()=>{if(!M)return q;var t=C(h,p?void 0:f.subscription),e=t.notifyNestedSubs.bind(t);return[t,e]},[h,p,f]),O=N(b,2),S=O[0],P=O[1],A=(0,t.useMemo)(()=>p?f:m({},f,{subscription:S}),[p,f,S]),k=(0,t.useRef)(),T=(0,t.useRef)(s),x=(0,t.useRef)(),R=(0,t.useRef)(!1),D=((0,t.useRef)(!1),(0,t.useRef)(!1)),B=(0,t.useRef)();I(()=>(D.current=!0,()=>{D.current=!1}),[]);var F,H,$,J=(0,t.useMemo)(()=>()=>x.current&&s===T.current?x.current:v(h.getState(),s),[h,s]),W=(0,t.useMemo)(()=>t=>S?function(t,e,r,n,o,a,i,u,c,s,l){if(!t)return()=>{};var f=!1,p=null,d=()=>{if(!f&&u.current){var t,r,d=e.getState();try{t=n(d,o.current)}catch(t){r=t,p=t}r||(p=null),t===a.current?i.current||s():(a.current=t,c.current=t,i.current=!0,l())}};return r.onStateChange=d,r.trySubscribe(),d(),()=>{if(f=!0,r.tryUnsubscribe(),r.onStateChange=null,p)throw p}}(M,h,S,v,T,k,R,D,x,P,t):()=>{},[S]);F=G,H=[T,k,R,s,x,P],I(()=>F(...H),void 0);try{$=L(W,J,y?()=>v(y(),s):J)}catch(t){throw B.current&&(t.message+="\nThe error may be correlated with this previous error:\n".concat(B.current.stack,"\n\n")),t}I(()=>{B.current=void 0,x.current=void 0,k.current=$});var z=(0,t.useMemo)(()=>e().createElement(r,m({},$,{ref:c})),[c,r,$]);return(0,t.useMemo)(()=>M?e().createElement(l.Provider,{value:A},z):z,[l,z,A])}var c=e().memo(i);if(c.WrappedComponent=r,c.displayName=i.displayName=o,v){var l=e().forwardRef(function(t,r){return e().createElement(c,m({},t,{reactReduxForwardedRef:r}))});return l.displayName=o,l.WrappedComponent=r,O()(l,r)}return O()(c,r)}},H=function(r){var n=r.store,o=r.context,a=r.children,i=r.serverState,u=(0,t.useMemo)(()=>{var t=C(n);return{store:n,subscription:t,getServerState:i?()=>i:void 0}},[n,i]),c=(0,t.useMemo)(()=>n.getState(),[n]);I(()=>{var t=u.subscription;return t.onStateChange=t.notifyNestedSubs,t.trySubscribe(),c!==n.getState()&&t.notifyNestedSubs(),()=>{t.tryUnsubscribe(),t.onStateChange=void 0}},[u,c]);var s=o||f;return e().createElement(s.Provider,{value:u},a)};function $(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:f,r=e===f?p:()=>(0,t.useContext)(e);return function(){return r().store}}var J=$();function W(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:f,e=t===f?J:$(t);return function(){return e().dispatch}}var z,V,K=W();function Y(t,e){switch(t){case 0:return function(){return e.apply(this,arguments)};case 1:return function(t){return e.apply(this,arguments)};case 2:return function(t,r){return e.apply(this,arguments)};case 3:return function(t,r,n){return e.apply(this,arguments)};case 4:return function(t,r,n,o){return e.apply(this,arguments)};case 5:return function(t,r,n,o,a){return e.apply(this,arguments)};case 6:return function(t,r,n,o,a,i){return e.apply(this,arguments)};case 7:return function(t,r,n,o,a,i,u){return e.apply(this,arguments)};case 8:return function(t,r,n,o,a,i,u,c){return e.apply(this,arguments)};case 9:return function(t,r,n,o,a,i,u,c,s){return e.apply(this,arguments)};case 10:return function(t,r,n,o,a,i,u,c,s,l){return e.apply(this,arguments)};default:throw new Error("First argument to _arity must be a non-negative integer no greater than ten")}}function Q(t){return null!=t&&"object"==typeof t&&!0===t["@@functional/placeholder"]}function X(t){return function e(r){return 0===arguments.length||Q(r)?e:t.apply(this,arguments)}}z=c.useSyncExternalStoreWithSelector,h=z,(t=>{L=t})(u.useSyncExternalStore),V=n.unstable_batchedUpdates,s=V;var Z=X(function(t){var e,r=!1;return Y(t.length,function(){return r?e:(r=!0,e=t.apply(this,arguments))})}),tt=Z;function et(t){return et="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},et(t)}function rt(t,e,r){return(e=function(t){var e=function(t){if("object"!=et(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=et(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==et(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function nt(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function ot(t){for(var e=1;e=0;)mt(e=jt[r],t)&&!St(n,e)&&(n[n.length]=e),r-=1;return n}):X(function(t){return Object(t)!==t?[]:Object.keys(t)}),At=X(function(t){return null===t?"Null":void 0===t?"Undefined":Object.prototype.toString.call(t).slice(8,-1)});function kt(t,e,r,n){var o=vt(t);function a(t,e){return Tt(t,e,r.slice(),n.slice())}return!bt(function(t,e){return!bt(a,e,t)},vt(e),o)}function Tt(t,e,r,n){if(gt(t,e))return!0;var o,a,i=At(t);if(i!==At(e))return!1;if("function"==typeof t["fantasy-land/equals"]||"function"==typeof e["fantasy-land/equals"])return"function"==typeof t["fantasy-land/equals"]&&t["fantasy-land/equals"](e)&&"function"==typeof e["fantasy-land/equals"]&&e["fantasy-land/equals"](t);if("function"==typeof t.equals||"function"==typeof e.equals)return"function"==typeof t.equals&&t.equals(e)&&"function"==typeof e.equals&&e.equals(t);switch(i){case"Arguments":case"Array":case"Object":if("function"==typeof t.constructor&&"Promise"===(o=t.constructor,null==(a=String(o).match(/^function (\w*)/))?"":a[1]))return t===e;break;case"Boolean":case"Number":case"String":if(typeof t!=typeof e||!gt(t.valueOf(),e.valueOf()))return!1;break;case"Date":if(!gt(t.valueOf(),e.valueOf()))return!1;break;case"Error":return t.name===e.name&&t.message===e.message;case"RegExp":if(t.source!==e.source||t.global!==e.global||t.ignoreCase!==e.ignoreCase||t.multiline!==e.multiline||t.sticky!==e.sticky||t.unicode!==e.unicode)return!1}for(var u=r.length-1;u>=0;){if(r[u]===t)return n[u]===e;u-=1}switch(i){case"Map":return t.size===e.size&&kt(t.entries(),e.entries(),r.concat([t]),n.concat([e]));case"Set":return t.size===e.size&&kt(t.values(),e.values(),r.concat([t]),n.concat([e]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var c=Pt(t);if(c.length!==Pt(e).length)return!1;var s=r.concat([t]),l=n.concat([e]);for(u=c.length-1;u>=0;){var f=c[u];if(!mt(f,e)||!Tt(e[f],t[f],s,l))return!1;u-=1}return!0}var xt=yt(function(t,e){return Tt(t,e,[],[])});function Ct(t,e,r){var n,o;if("function"==typeof t.indexOf)switch(typeof e){case"number":if(0===e){for(n=1/e;r=0}var Rt=yt(It);function Dt(t){return function e(r,n,o){switch(arguments.length){case 0:return e;case 1:return Q(r)?e:yt(function(e,n){return t(r,e,n)});case 2:return Q(r)&&Q(n)?e:Q(r)?yt(function(e,r){return t(e,n,r)}):Q(n)?yt(function(e,n){return t(r,e,n)}):X(function(e){return t(r,n,e)});default:return Q(r)&&Q(n)&&Q(o)?e:Q(r)&&Q(n)?yt(function(e,r){return t(e,r,o)}):Q(r)&&Q(o)?yt(function(e,r){return t(e,n,r)}):Q(n)&&Q(o)?yt(function(e,n){return t(r,e,n)}):Q(r)?X(function(e){return t(e,n,o)}):Q(n)?X(function(e){return t(r,e,o)}):Q(o)?X(function(e){return t(r,n,e)}):t(r,n,o)}}}var Nt=Number.isInteger||function(t){return(0|t)===t};function Mt(t){return"[object String]"===Object.prototype.toString.call(t)}function Ut(t,e){var r=t<0?e.length+t:t;return Mt(e)?e.charAt(r):e[r]}function Lt(t,e){for(var r=e,n=0;n=0&&"[object Array]"===Object.prototype.toString.call(t)},Ft=X(function(t){return null==t}),Ht=Dt(function t(e,r,n){if(0===e.length)return r;var o=e[0];if(e.length>1){var a=!Ft(n)&&mt(o,n)&&"object"==typeof n[o]?n[o]:Nt(e[1])?[]:{};r=t(Array.prototype.slice.call(e,1),r,a)}return function(t,e,r){if(Nt(t)&&Bt(r)){var n=[].concat(r);return n[t]=e,n}var o={};for(var a in r)o[a]=r[a];return o[t]=e,o}(o,r,n)}),$t=Dt(function(t,e,r){return Ht([t],e,r)});function Jt(t,e){return function(){var r=arguments.length;if(0===r)return e();var n=arguments[r-1];return Bt(n)||"function"!=typeof n[t]?e.apply(this,arguments):n[t].apply(n,Array.prototype.slice.call(arguments,0,r-1))}}var Wt=yt(Jt("forEach",function(t,e){for(var r=e.length,n=0;n0&&t.hasOwnProperty(0)&&t.hasOwnProperty(t.length-1))});function de(t){return function e(r){for(var n,o,a,i=[],u=0,c=r.length;u=arguments.length)?c=e[i]:(c=arguments[o],o+=1),n[i]=c,Q(c)?u=!0:a-=1,i+=1}return!u&&a<=0?r.apply(this,n):Y(Math.max(0,a),me(t,n,r))}}var ge=yt(function(t,e){return 1===t?X(e):Y(t,me(t,[],e))}),we=ge,Oe=yt(ae(["fantasy-land/map","map"],be,function(t,e){switch(Object.prototype.toString.call(e)){case"[object Function]":return we(e.length,function(){return t.call(this,e.apply(this,arguments))});case"[object Object]":return oe(function(r,n){return r[n]=t(e[n]),r},{},Pt(e));default:return ye(t,e)}})),_e=Oe,je="undefined"!=typeof Symbol?Symbol.iterator:"@@iterator";function Ee(t,e,r){return function(n,o,a){if(pe(a))return t(n,o,a);if(null==a)return o;if("function"==typeof a["fantasy-land/reduce"])return e(n,o,a,"fantasy-land/reduce");if(null!=a[je])return r(n,o,a[je]());if("function"==typeof a.next)return r(n,o,a);if("function"==typeof a.reduce)return e(n,o,a,"reduce");throw new TypeError("reduce: list must be array or iterable")}}function Se(t,e,r){for(var n=0,o=r.length;n":qe(r,n)},n=function(t,e){return ye(function(e){return Ne(e)+": "+r(t[e])},e.slice().sort())};switch(Object.prototype.toString.call(t)){case"[object Arguments]":return"(function() { return arguments; }("+ye(r,t).join(", ")+"))";case"[object Array]":return"["+ye(r,t).concat(n(t,Le(function(t){return/^\d+$/.test(t)},Pt(t)))).join(", ")+"]";case"[object Boolean]":return"object"==typeof t?"new Boolean("+r(t.valueOf())+")":t.toString();case"[object Date]":return"new Date("+(isNaN(t.valueOf())?r(NaN):Ne(Ue(t)))+")";case"[object Map]":return"new Map("+r(Array.from(t))+")";case"[object Null]":return"null";case"[object Number]":return"object"==typeof t?"new Number("+r(t.valueOf())+")":1/t==-1/0?"-0":t.toString(10);case"[object Set]":return"new Set("+r(Array.from(t).sort())+")";case"[object String]":return"object"==typeof t?"new String("+r(t.valueOf())+")":Ne(t);case"[object Undefined]":return"undefined";default:if("function"==typeof t.toString){var o=t.toString();if("[object Object]"!==o)return o}return"{"+n(t,Pt(t)).join(", ")+"}"}}var Ge=X(function(t){return qe(t,[])}),Be=yt(function(t,e){if(Bt(t)){if(Bt(e))return t.concat(e);throw new TypeError(Ge(e)+" is not an array")}if(Mt(t)){if(Mt(e))return t+e;throw new TypeError(Ge(e)+" is not a string")}if(null!=t&&De(t["fantasy-land/concat"]))return t["fantasy-land/concat"](e);if(null!=t&&De(t.concat))return t.concat(e);throw new TypeError(Ge(t)+' does not have a method named "concat" or "fantasy-land/concat"')});function Fe(t){return t&&t["@@transducer/reduced"]?t:{"@@transducer/value":t,"@@transducer/reduced":!0}}var He=function(){function t(t,e){this.xf=e,this.f=t,this.all=!0}return t.prototype["@@transducer/init"]=ue,t.prototype["@@transducer/result"]=function(t){return this.all&&(t=this.xf["@@transducer/step"](t,!0)),this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,e){return this.f(e)||(this.all=!1,t=Fe(this.xf["@@transducer/step"](t,!1))),t},t}();function $e(t){return function(e){return new He(t,e)}}var Je=yt(ae(["all"],$e,function(t,e){for(var r=0;re!=e>t)return e>t?e:t}var n=r(t,e);if(void 0!==n)return n;var o=r(typeof t,typeof e);if(void 0!==o)return o===typeof t?t:e;var a=Ge(t),i=r(a,Ge(e));return void 0!==i&&i===a?t:e}),Ve=yt(function(t,e){return _e(re(t),e)}),Ke=yt(function(t,e){return we(Re(ze,0,Ve("length",e)),function(){var r=arguments,n=this;return t.apply(n,ye(function(t){return t.apply(n,r)},e))})}),Ye=Ke,Qe=X(function(t){return Ye(function(){return Array.prototype.slice.call(arguments,0)},t)})([fe,Le]);function Xe(t,e,r){var n,o=typeof t;switch(o){case"string":case"number":return 0===t&&1/t==-1/0?!!r._items["-0"]||(e&&(r._items["-0"]=!0),!1):null!==r._nativeSet?e?(n=r._nativeSet.size,r._nativeSet.add(t),r._nativeSet.size===n):r._nativeSet.has(t):o in r._items?t in r._items[o]||(e&&(r._items[o][t]=!0),!1):(e&&(r._items[o]={},r._items[o][t]=!0),!1);case"boolean":if(o in r._items){var a=t?1:0;return!!r._items[o][a]||(e&&(r._items[o][a]=!0),!1)}return e&&(r._items[o]=t?[!1,!0]:[!0,!1]),!1;case"function":return null!==r._nativeSet?e?(n=r._nativeSet.size,r._nativeSet.add(t),r._nativeSet.size===n):r._nativeSet.has(t):o in r._items?!!It(t,r._items[o])||(e&&r._items[o].push(t),!1):(e&&(r._items[o]=[t]),!1);case"undefined":return!!r._items[o]||(e&&(r._items[o]=!0),!1);case"object":if(null===t)return!!r._items.null||(e&&(r._items.null=!0),!1);default:return(o=Object.prototype.toString.call(t))in r._items?!!It(t,r._items[o])||(e&&r._items[o].push(t),!1):(e&&(r._items[o]=[t]),!1)}}var Ze=function(){function t(){this._nativeSet="function"==typeof Set?new Set:null,this._items={}}return t.prototype.add=function(t){return!Xe(t,!0,this)},t.prototype.has=function(t){return Xe(t,!1,this)},t}(),tr=yt(function(t,e){for(var r=[],n=0,o=t.length,a=e.length,i=new Ze,u=0;u=0&&this.i>=this.n?Fe(r):r},t}();function Nr(t){return function(e){return new Dr(t,e)}}var Mr=Dt(Jt("slice",function(t,e,r){return Array.prototype.slice.call(r,t,e)})),Ur=yt(ae(["take"],Nr,function(t,e){return Mr(0,t<0?1/0:t,e)})),Lr=yt(function(t,e){return xt(Ur(t.length,e),t)}),qr=yt(function(t,e){return"function"!=typeof e.indexOf||Bt(e)?Ct(e,t,0):e.indexOf(t)}),Gr=Dt(function(t,e,r){t=t=0?t:r.length;var n=Array.prototype.slice.call(r,0);return n.splice(t,0,e),n}),Br=function(){function t(t,e){this.xf=e,this.f=t,this.found=!1}return t.prototype["@@transducer/init"]=ue,t.prototype["@@transducer/result"]=function(t){return this.found||(t=this.xf["@@transducer/step"](t,void 0)),this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,e){return this.f(e)&&(this.found=!0,t=Fe(this.xf["@@transducer/step"](t,e))),t},t}();function Fr(t){return function(e){return new Br(t,e)}}var Hr=yt(ae(["find"],Fr,function(t,e){for(var r=0,n=e.length;rt.length)&&(e=t.length);for(var r=0,n=Array(e);r2&&void 0!==arguments[2]?arguments[2]:[],n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;if(Array.isArray(t))t.forEach((t,o)=>{if(n){var a=Ar(t=>Rt("{}",t),n);if(-1!==a){var i=Mr(0,a,n),u=Mr(a,n.length,n);if(i.length)Zr(Vt(i,t),e,Be(r,Be([o],i)),u);else{var c,s=u.map(t=>t.replace("{}","")).filter(t=>t),l=Be([o],s);for(var f in c=s.length?Vt(s,t):t){var p=c[f];Zr(p,e,Be(r,l.concat([f])))}}}else Zr(Vt(n,t),e,Be(r,Be([o],n)))}else Zr(t,e,Kr(o,r))});else if("Object"===At(t)){e(t,r);var o=Vt(Xr,t);if(o){var a=Be(r,Xr);Zr(o,e,a)}Gt([],[t.namespace,t.type],window.__dashprivate_childrenProps).forEach(n=>{if(n.includes("[]")){var o=(w=n.split("[]").map(t=>t.split(".").filter(t=>t)),O=2,function(t){if(Array.isArray(t))return t}(w)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,a,i,u=[],c=!0,s=!1;try{if(a=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=a.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(s)throw o}}return u}}(w,O)||function(t,e){if(t){if("string"==typeof t)return Yr(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Yr(t,e):void 0}}(w,O)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),a=o[0],i=o[1],u=Be(["props"],a),c=Be(r,u);Zr(Vt(u,t),e,c,i)}else if(n.includes("{}")){for(var s=n.split("."),l=[],f=[],p=!1,d=0;dthis.removeListener(t,e)}removeListener(t,e){var r=this._ev[t];if(r){var n=r.indexOf(e);n>-1&&r.splice(n,1)}}emit(t){for(var e=arguments.length,r=new Array(e>1?e-1:0),n=1;nt.apply(this,r))}once(t,e){var r=this,n=this.on(t,function(){n();for(var t=arguments.length,o=new Array(t),a=0;ae.some((e,r)=>t[r]!==e),c=e.length,s=c?fe(u,a):{},l={};return c&&cr((t,e)=>{var r=fe(t=>{var e=t.path;return u(e)},t);r.length&&(l[e]=r)},i),Zr(t,(t,r)=>{var n=Vt(["props","id"],t);if(n)if("object"==typeof n){var o=Object.keys(n).sort(),a=ne(o,n),u=o.join(","),c=l[u]=l[u]||[],f=i[u]||[],p={values:a,path:Be(e,r)},d=qr(p,f);-1===d?c.push(p):l[u]=Gr(d,p,c)}else s[n]=Be(e,r)}),{strs:s,objs:l,events:n||r.events}}function rn(t,e){if("object"==typeof e){var r=Object.keys(e).sort(),n=r.join(","),o=t.objs[n];if(!o)return!1;var a=ne(r,e),i=$r(Jr(a,"values"),o);return i&&i.path}return t.strs[e]}var nn=t=>{var e=t.type,r=t.namespace,n=window[r];if(n){if(n[e])return n[e];throw new Error("Component ".concat(e," not found in ").concat(r))}throw new Error("".concat(r," was not found."))};function on(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function an(t){for(var e=1;e=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,i=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return i=t.done,t},e:function(t){u=!0,a=t},f:function(){try{i||null==r.return||r.return()}finally{if(u)throw a}}}}function ln(t,e){if(t){if("string"==typeof t)return fn(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?fn(t,e):void 0}}function fn(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);rt.startsWith(".."),dn={wild:"ALL",multi:1},hn={wild:"MATCH"},yn={wild:"ALLSMALLER",multi:1,expand:1},vn={ALL:dn,MATCH:hn,ALLSMALLER:yn},bn={Output:{ALL:dn,MATCH:hn},Input:vn,State:vn},mn=["string","number","boolean"],gn=[".","{"];function wn(t){var e=t.lastIndexOf(".");return{id:On(t.substr(0,e)),property:t.substr(e+1)}}function On(t){return(t=>t.startsWith("{"))(t)?function(t){return _e(t=>Array.isArray(t)&&vn[t[0]]||t,JSON.parse(t))}(t):t}function _n(t){return"object"!=typeof t?t:"{"+Object.keys(t).sort().map(e=>{return JSON.stringify(e)+":"+((r=t[e])&&r.wild||JSON.stringify(r));var r}).join(",")+"}"}function jn(t,e){var r=ir()(e);if(ir()(t)){if(r){var n=Number(t),o=Number(e);return n>o?1:ne?1:tir()(t)?t-1:0,Sn=t=>"string"==typeof t?t+"z":"z";function Pn(t,e,r,n){var o=t[e]=t[e]||{};(o[r]=o[r]||[]).push(n)}function An(t,e,r,n){var o=Object.keys(e).sort(),a=o.join(","),i=ne(o,e),u=i.map(t=>"object"==typeof t&&null!==t?t.wild?t.wild:JSON.stringify(t):String(t)).join("|");t.has(a)||t.set(a,new Map);var c=t.get(a);c.has(r)||c.set(r,new Map);var s=c.get(r),l=s.get(u);l||(l={keys:o,values:i,callbacks:[]},s.set(u,l)),l.callbacks.push(n)}function kn(t,e){var r,n=sn(t.entries());try{for(n.s();!(r=n.n()).done;){var o=cn(r.value,2),a=o[0],i=o[1];e[a]={};var u,c=sn(i.entries());try{for(c.s();!(u=c.n()).done;){var s=cn(u.value,2),l=s[0],f=s[1];e[a][l]=Array.from(f.values())}}catch(t){c.e(t)}finally{c.f()}}}catch(t){n.e(t)}finally{n.f()}}var Tn=t=>{var e=cn(t,2),r=e[0],n=e[1],o=r&&r.wild,a=n&&n.wild;return o&&a?!(r===hn&&n===yn||r===yn&&n===hn):r===n||o||a};function xn(t,e){var r,n=t.id,o=t.property,a=Pt(n).sort(),i=ne(a,n),u=sn(e);try{for(u.s();!(r=u.n()).done;){var c=r.value,s=c.id;if(c.property===o&&"string"!=typeof s&&xt(Pt(s).sort(),a)&&We(Tn,sr(i,ne(a,s))))return c}}catch(t){u.e(t)}finally{u.f()}return!1}function Cn(t,e,r){var n=new or.w,o=performance.now(),a={},i=_e(mr({id:On})),u=_e(t=>{var e,r=t.output,n=t.no_output,o=mr({inputs:i,state:i},t);return n?(o.outputs=[],o.noOutput=!0):o.outputs=_e(t=>$t("out",!0,wn(t)),pn(r)?(e=r).substr(2,e.length-4).split("..."):[r]),o},t),c=!1;r.validate_callbacks&&function(t,e){var r={},n=[];t.forEach(t=>{var o=t.inputs,a=t.outputs,i=t.state,u=!0;1!==a.length||a[0].id||a[0].property||(u=!1);var c="In the callback for output(s):\n "+a.map(zn).join("\n ");!o.length&&t.prevent_initial_call&&e("A callback is missing Inputs",[c,"there are no `Input` elements.","Without `Input` elements, it will never get called.","","Subscribing to `Input` components will cause the","callback to be called whenever their values change.","","If you want a callback without inputs that fires on initial load,","set prevent_initial_call=False."]),[[a,"Output"],[o,"Input"],[i,"State"]].forEach(t=>{var r=cn(t,2),n=r[0],o=r[1];("Output"!==o||u)&&(Array.isArray(n)||e("Callback ".concat(o,"(s) must be an Array"),[c,"For ".concat(o,"(s) we found:"),JSON.stringify(n),"but we expected an Array."]),n.forEach((t,r)=>{!function(t,e,r,n,o){var a=t.id,i=t.property;if("string"==typeof i&&i||o("Callback property error",[e,"".concat(r,"[").concat(n,"].property = ").concat(JSON.stringify(i)),"but we expected `property` to be a non-empty string."]),"object"==typeof a)Qt(a)&&o("Callback item missing ID",[e,"".concat(r,"[").concat(n,"].id = {}"),"Every item linked to a callback needs an ID"]),cr((t,a)=>{a||o("Callback wildcard ID error",[e,"".concat(r,"[").concat(n,'].id has key "').concat(a,'"'),"Keys must be non-empty strings."]),"object"==typeof t&&t.wild?bn[r][t.wild]!==t&&o("Callback wildcard ID error",[e,"".concat(r,"[").concat(n,'].id["').concat(a,'"] = ').concat(t.wild),"Allowed wildcards for ".concat(r,"s are:"),Pt(bn[r]).join(", ")]):Rt(typeof t,mn)||o("Callback wildcard ID error",[e,"".concat(r,"[").concat(n,'].id["').concat(a,'"] = ').concat(JSON.stringify(t)),"Wildcard callback ID values must be either wildcards","or constants of one of these types:",mn.join(", ")])},a);else if("string"==typeof a){a||o("Callback item missing ID",[e,"".concat(r,"[").concat(n,'].id = "').concat(a,'"'),"Every item linked to a callback needs an ID"]);var u=gn.filter(t=>Rt(t,a));u.length&&o("Callback invalid ID string",[e,"".concat(r,"[").concat(n,"].id = '").concat(a,"'"),"characters '".concat(u.join("', '"),"' are not allowed.")])}else o("Callback ID type error",[e,"".concat(r,"[").concat(n,"].id = ").concat(JSON.stringify(a)),"IDs must be strings or wildcard-compatible objects."])}(t,c,o,r,e)}))}),u&&(function(t,e,r,n,o){var a={},i=[];t.forEach((t,u)=>{var c=t.id,s=t.property;if("string"==typeof c){var l=zn({id:c,property:s});a[l]?r("Duplicate callback Outputs",[e,"Output ".concat(u," (").concat(l,") is already used by this callback.")]):n[l]?r("Duplicate callback outputs",[e,"Output ".concat(u," (").concat(l,") is already in use."),"To resolve this, set `allow_duplicate=True` on","duplicate outputs, or combine the outputs into","one callback function, distinguishing the trigger","by using `dash.callback_context` if necessary."]):a[l]=1}else{var f={id:c,property:s},p=xn(f,i),d=p||xn(f,o);if(p||d){var h=zn(f),y=zn(p||d);r("Overlapping wildcard callback outputs",[e,"Output ".concat(u," (").concat(h,")"),"overlaps another output (".concat(y,")"),"used in ".concat(p?"this":"a different"," callback.")])}else i.push(f)}}),Pt(a).forEach(t=>{n[t]=1}),i.forEach(t=>{o.push(t)})}(a,c,e,r,n),function(t,e,r,n,o){var a=In(t.length?t[0].id:void 0).matchKeys;t.forEach((e,r)=>{r&&!xt(In(e.id).matchKeys,a)&&o("Mismatched `MATCH` wildcards across `Output`s",[n,"Output ".concat(r," (").concat(zn(e),")"),"does not have MATCH wildcards on the same keys as","Output 0 (".concat(zn(t[0]),")."),"MATCH wildcards must be on the same keys for all Outputs.","ALL wildcards need not match, only MATCH."])});var i=a.length>0;[[e,"Input"],[r,"State"]].forEach(e=>{var r=cn(e,2),u=r[0],c=r[1];u.forEach((e,r)=>{var u=In(e.id),s=u.matchKeys,l=u.allsmallerKeys,f=i?s.concat(l):l,p=tr(f,a);if(p.length){p.sort();var d=t.length?"Output 0 (".concat(zn(t[0]),")"):"the (absent) Output";o("`Input` / `State` wildcards not in `Output`s",[n,"".concat(c," ").concat(r," (").concat(zn(e),")"),"has MATCH or ALLSMALLER on key(s) ".concat(p.join(", ")),"where ".concat(d),"does not have a MATCH wildcard. Inputs and State do not","need every MATCH from the Output(s), but ALLSMALLER","requires a matching MATCH in the Output(s), and when","the Output(s) have any MATCH, Input/State MATCH keys","must be a subset of them."])}})})}(a,o,i,c,e))})}(u,(t,r)=>{c=!0,e(t,r)});var s={},l={},f=new Map,p=new Map,d={},h={},y={MultiGraph:n,outputMap:s,inputMap:l,outputPatterns:d,inputPatterns:h,callbacks:u};if(c)return y;function v(t,e){var r=[{}];return cr((t,n)=>{var o=a[n].vals,i=o.indexOf(e[n]),u=[t];t&&t.wild&&(u=t===yn?i>0?o.slice(0,i):[]:-1===i||t===dn?o:[e[n]]),r=jr(jr([$t(n)],u),r)},t),r}u.forEach(t=>{var e=t.outputs,r=t.inputs;e.concat(r).filter(t=>"object"==typeof t.id).forEach(t=>{cr((t,e)=>{a[e]||(a[e]={exact:[],expand:0});var r=a[e];t&&t.wild?t.expand&&(r.expand+=1):-1===r.exact.indexOf(t)&&r.exact.push(t)},t.id)})}),cr(t=>{var e=t.exact,r=t.expand,n=e.slice().sort(jn);if(r)for(var o=0;o2&&void 0!==arguments[2])||arguments[2];r.validate_callbacks&&(n.addNode(t),n.addDependency(t,e),o&&(g[g.length-1].push(t),w[w.length-1].push(e)))}u.forEach(t=>{var e=t.outputs,o=t.inputs;function a(t,e){r.validate_callbacks&&(n.addNode(e),o.forEach(r=>{var n=r.id,o=r.property;"object"==typeof n?v(n,t).forEach(t=>{O(zn({id:t,property:o}),e)}):O(zn(r),e)}))}g.push([]),w.push([]);var i=In(e.length?e[0].id:void 0).matchKeys,u=Ar(t=>!Nn(t.id),e),c=Tr({matchKeys:i,firstSingleOutput:u,outputs:e},t);e.forEach(t=>{var e,n=t.id,i=t.property;if(r.validate_callbacks&&(e=function(t,e){var r=t.id,n=t.property;return e.some(e=>{var o=e.id,a=e.property;if(n!==a||typeof r!=typeof o)return!1;if("string"==typeof r){if(r===o)return!0}else if(xn(e,[t]))return!0;return!1})}(t,o)),"object"==typeof n)r.validate_callbacks&&v(n,{}).forEach(t=>{var r={id:t,property:i},n=zn(r);e&&(m.push(r),n+=b),a(t,n)}),An(f,n,i,c);else{if(r.validate_callbacks){var u=zn(t);e&&(m.push(t),u+=b),a({},u)}Pn(s,n,i,c)}}),o.forEach(t=>{var e=t.id,r=t.property;"object"==typeof e?An(p,e,r,c):Pn(l,e,r,c)})}),d=kn(f,d),h=kn(p,h),m.forEach(t=>{for(var e=zn(t),r=e.concat(b),n=0;nt===e)&&(w[n].some(t=>t===r)||w[n].forEach(t=>{O(r,t,!1)}))});var _=performance.now();return window.dash_component_api||(window.dash_component_api={}),window.dash_component_api.callbackGraphTime=(_-o).toFixed(2),y}function In(t){var e=[],r=[];return"object"==typeof t&&(cr((t,n)=>{t===hn?e.push(n):t===yn&&r.push(n)},t),e.sort(),r.sort()),{matchKeys:e,allsmallerKeys:r}}function Rn(t,e,r,n,o,a){for(var i=0;it.multi,br(e))}function Mn(t,e,r,n){var o,a,i="";if("string"==typeof r){var u=(t.outputMap[r]||{})[n];u&&(a=u[0],o=ro())}else{var c=Object.keys(r).sort(),s=ne(c,r),l=c.join(","),f=(t.outputPatterns[l]||{})[n];if(f)for(var p=0;p{var r=e.id,u=ne(o,r),c=to(t,ro(o,u,a),Dn(a,u)),s=c.resolvedId;i[s]||(n.push(c),i[s]=!0)})}function Ln(t,e,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";return o=>{var a=o.matchKeys,i=o.firstSingleOutput,u=o.outputs;if(a.length){var c=u[i];if(c)Un(o,c,t(e)(c),r);else{var s={};u.forEach(n=>{var i=t(e)(n).filter(t=>{var e=JSON.stringify(ne(a,t.id));return!s[e]&&(s[e]=1,!0)});Un(o,n,i,r)})}}else{var l=to(o,t,n);r.push(l)}}}function qn(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function Gn(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);r{var e=t.id,r=t.property;return"".concat(_n(e),".").concat(r)};function Vn(t,e,r,n,o){var a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5],i=[],u=zn({id:r,property:n});if("string"==typeof r){var c=(t.inputMap[r]||{})[n];if(!c)return[];c.forEach(Ln(ro(),e,i))}else{var s=Object.keys(r).sort(),l=ne(s,r),f=s.join(","),p=(t.inputPatterns[f]||{})[n];if(!p)return[];p.forEach(t=>{if(Rn(s,l,t.values)){var r=Dn(t.values,l);t.callbacks.forEach(Ln(ro(s,l,t.values),e,i,r))}})}return i.forEach(r=>{r.changedPropIds[u]=o||$n,a&&(r.priority=Kn(t,e,r))}),i}function Kn(t,e,r){for(var n=[r],o={},a={},i=[];n.length;){n=fe(t=>{var e=a[t.resolvedId];return a[t.resolvedId]=!0,e},n);var u=fe(t=>!o[zn(t)],he(_e(t=>he(t.getOutputs(e)),n)));u.forEach(t=>o[zn(t)]=!0),(n=he(_e(r=>{var n=r.id,o=r.property;return Vn(t,e,n,o,Jn,!1)},u))).length&&i.push(n.length)}return i.unshift(i.length),_e(t=>Math.min(t,35).toString(36),i).join("")}var Yn=function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(!e.length)return[];var o=_e(zn,Re((e,r)=>Be(e,he(r.getOutputs(t))),[],r)),a={};if(o.forEach(t=>a[t]=!0),Object.keys(n).length){var i=he(_e(e=>function(t,e,r){for(var n=[r],o={};n.length;){var a=fe(t=>!o[zn(t)],he(_e(t=>he(t.getOutputs(e)),n)));o=Re((t,e)=>$t(zn(e),!0,t),o,a),n=he(_e(r=>{var n=r.id,o=r.property;return Vn(t,e,n,o,Jn,!1)},a))}return o}(n,t,e),r));i.length>0&&(a=Object.assign(i[0],...i))}return fe(e=>We(t=>!a[zn(t)],((t,e)=>t.filter(t=>!e.some(e=>zn(t)===zn(e))))(he(e.getInputs(t)),he(e.getOutputs(t)))),e)},Qn=(t,e,r,n)=>{for(var o=[],a=function(t,e,r,n){var o=n.outputsOnly,a=n.removedArrayInputsOnly,i=n.newPaths,u=n.chunkPath,c={},s=[];function l(t){if(t){var e=c[t.resolvedId];if(void 0!==e){var r=s[e];r.changedPropIds=Wn(r.changedPropIds,t.changedPropIds),t.initialCall&&(r.initialCall=!0)}else c[t.resolvedId]=s.length,s.push(t)}}function f(r,n,c){if(n)for(var s in n){var f=Mn(t,0,r,s);f&&(f.callback.prevent_initial_call||(f.initialCall=!0,l(f)))}if(!o&&c){var p=a?(y=_n(r),t=>t.getInputs(e).some(e=>!(!Array.isArray(e)||!e.some(t=>_n(t.id)===y)||(he(t.getOutputs(i)).length&&(t.initialCall=!0,t.changedPropIds={},l(t)),0)))):l,d=p;for(var h in u&&(d=t=>{We(Lr(u),Ve("path",he(t.getOutputs(e))))||p(t)}),c)Vn(t,e,r,h,Jn).forEach(d)}var y}return Zr(r,e=>{var r=Vt(["props","id"],e);if(r)if("string"!=typeof r||a){var n=Object.keys(r).sort().join(",");f(r,!a&&t.outputPatterns[n],t.inputPatterns[n])}else f(r,t.outputMap[r],t.inputMap[r])}),_e(r=>an(an({},r),{},{priority:Kn(t,e,r)}),s)}(t,e,r,n);;){var i=Fn(Qe(t=>{var r=t.callback.inputs,n=t.getInputs;return We(Nn,r)||!Qt(tr(_e(zn,he(n(e))),o))},a),2),u=i[0],c=i[1];if(!c.length)break;a=u,o=Be(o,_e(zn,he(_e(t=>(0,t.getOutputs)(e),c))))}if(n.filterRoot){var s=Vt(["props","id"],r);s&&(s=_n(s),a=a.filter(t=>t.callback.inputs.reduce((t,e)=>t||_n(e.id)==s&&n.filterRoot.includes(e.property),!1)))}var l=Math.random().toString(16);return _e(t=>Gn(Gn({},t),{},{executionGroup:l}),a)},Xn=t=>{var e=t.anyVals,r=t.callback,n=r.inputs,o=r.outputs,a=r.state,i=r.output,u=_e(zn,[...n,...o,...a]);return 0===o.length&&i&&u.push(i),Be(u,Array.isArray(e)?e:""===e?[]:[e]).join(",")};function Zn(t,e,r,n){return he(_e(e=>Vn(r,n,t,e),Pt(e)))}var to=(t,e,r)=>({callback:t,anyVals:r,resolvedId:t.output+r,getOutputs:r=>t.outputs.map(e(r)),getInputs:r=>t.inputs.map(e(r)),getState:r=>t.state.map(e(r)),changedPropIds:{},initialCall:!1});function eo(t,e){var r=Fn(Qe(t=>{var r=t.getOutputs,n=t.callback.outputs;return he(r(e)).length===n.length},t),2)[1],n=Fn(Qe(t=>{var r=t.getOutputs;return!he(r(e)).length},r),2)[1];return{added:_e(t=>$t("changedPropIds",er((t,r)=>rn(e,wn(r).id),t.changedPropIds),t),n),removed:r}}function ro(t,e,r){return n=>o=>{var a=o.id,i=o.property;if("string"==typeof a){var u=rn(n,a);return u?[{id:a,property:i,path:u}]:[]}var c=Object.keys(a).sort(),s=ne(c,a),l=c.join(","),f=n.objs[l];if(!f)return[];var p=[];return f.forEach(n=>{var o=n.values,a=n.path;Rn(c,o,s,t,e,r)&&p.push({id:nr(c,o),property:i,path:a})}),p}}var no={ON_PROP_CHANGE:1,SET_REQUEST_QUEUE:1,SET_GRAPHS:1,SET_PATHS:1,SET_LAYOUT:1,SET_APP_LIFECYCLE:1,SET_CONFIG:1,ADD_HTTP_HEADERS:1,ON_ERROR:1,SET_HOOKS:1,INSERT_COMPONENT:1,REMOVE_COMPONENT:1,RESET_COMPONENT_STATE:1},oo=t=>{if(no[t])return t;throw new Error("".concat(t," is not defined."))};function ao(t){var e={STARTED:"STARTED",HYDRATED:"HYDRATED",DESTROYED:"DESTROYED"};if(e[t])return e[t];throw new Error("".concat(t," is not a valid app state."))}var io,uo,co=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ao("STARTED"),e=arguments.length>1?arguments[1]:void 0;return e.type===oo("SET_APP_LIFECYCLE")?ao(e.payload):t};function so(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function lo(t){for(var e=1;e1?arguments[1]:void 0;return Re((t,e)=>null===e?t:e.type===uo.AddCompleted?((t,e)=>lo(lo({},t),{},{completed:t.completed+e.payload}))(t,e):((t,e)=>{var r=ho[e.type],n=yo[e.type];return r&&n&&0!==e.payload.length?lo(lo({},t),{},{[n]:r(t[n],e.payload)}):t})(t,e),arguments.length>0&&void 0!==arguments[0]?arguments[0]:po,t.type===uo.Aggregate?t.payload:[t])},bo=Dt(function t(e,r,n){return Zt(function(r,n,o){return Kt(n)&&Kt(o)?t(e,n,o):e(r,n,o)},r,n)}),mo=bo,go=yt(function(t,e){return mo(function(t,e,r){return r},t,e)});function wo(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=arguments.length>1?arguments[1]:void 0;return e.type===oo("SET_CONFIG")?(window.__dashprivate_childrenProps=go(window.__dashprivate_childrenProps||{},e.payload.children_props),e.payload):e.type===oo("ADD_HTTP_HEADERS")?go(t,{fetch:{headers:e.payload}}):t}var Oo={},_o=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Oo,e=arguments.length>1?arguments[1]:void 0;return"SET_GRAPHS"===e.type?e.payload:t},jo={frontEnd:[],backEnd:[],backEndConnected:!0};function Eo(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:jo,e=arguments.length>1?arguments[1]:void 0;switch(e.type){case"ON_ERROR":var r=t.frontEnd,n=t.backEnd,o=t.backEndConnected;return console.error(e.payload.error),"frontEnd"===e.payload.type?{frontEnd:[Tr(e.payload,{timestamp:new Date}),...r],backEnd:n,backEndConnected:o}:"backEnd"===e.payload.type?{frontEnd:r,backEnd:[Tr(e.payload,{timestamp:new Date}),...n],backEndConnected:o}:t;case"SET_CONNECTION_STATUS":return Tr(t,{backEndConnected:e.payload});default:return t}}var So={past:[],present:{},future:[]},Po=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:So;switch((arguments.length>1?arguments[1]:void 0).type){case"UNDO":var e=t.past,r=t.present,n=t.future,o=e[e.length-1];return{past:e.slice(0,e.length-1),present:o,future:[r,...n]};case"REDO":var a=t.past,i=t.present,u=t.future;return{past:[...a,i],present:u[0],future:u.slice(1)};case"REVERT":var c=t.past,s=t.future,l=c[c.length-1];return{past:c.slice(0,c.length-1),present:l,future:[...s]};default:return t}},Ao=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{layout_pre:null,layout_post:null,request_pre:null,request_post:null,callback_resolved:null,request_refresh_jwt:null,bear:!1},e=arguments.length>1?arguments[1]:void 0;return"SET_HOOKS"===e.type?e.payload:t};function ko(t,e,r){if(r||(r=new xo),o=typeof(n=t),null==n||"object"!=o&&"function"!=o)return t;var n,o,a,i=function(n){var o=r.get(t);if(o)return o;for(var a in r.set(t,n),t)Object.prototype.hasOwnProperty.call(t,a)&&(n[a]=e?ko(t[a],!0,r):t[a]);return n};switch(At(t)){case"Object":return i(Object.create(Object.getPrototypeOf(t)));case"Array":return i(Array(t.length));case"Date":return new Date(t.valueOf());case"RegExp":return a=t,new RegExp(a.source,a.flags?a.flags:(a.global?"g":"")+(a.ignoreCase?"i":"")+(a.multiline?"m":"")+(a.sticky?"y":"")+(a.unicode?"u":"")+(a.dotAll?"s":""));case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":return t.slice();default:return t}}var To,xo=function(){function t(){this.map={},this.length=0}return t.prototype.set=function(t,e){var r=this.hash(t),n=this.map[r];n||(this.map[r]=n=[]),n.push([t,e]),this.length+=1},t.prototype.hash=function(t){var e=[];for(var r in t)e.push(Object.prototype.toString.call(t[r]));return e.join()},t.prototype.get=function(t){if(this.length<=180){for(var e in this.map)for(var r=this.map[e],n=0;n0&&void 0!==arguments[0]?arguments[0]:qo,e=arguments.length>1?arguments[1]:void 0;if("UPDATE_RESOURCE_USAGE"===e.type){var r=e.payload,n=r.id,o=r.usage,a=r.status,i=Mo[a]||a,u={updated:[n],resources:t.resources,callbacks:t.callbacks,graphLayout:t.graphLayout};u.callbacks[n]=u.callbacks[n]||Co(Lo);var c=u.callbacks[n],s=c.resources,l=u.resources;if(c.count+=1,c.status.latest=i,c.status[i]=(c.status[i]||0)+1,c.result=e.payload.result,c.inputs=e.payload.inputs,c.state=e.payload.state,o){var f=o.__dash_client,p=o.__dash_server,d=o.__dash_upload,h=o.__dash_download,y=function(t,e){if(null==t)return{};var r,n,o=function(t,e){if(null==t)return{};var r={};for(var n in t)if({}.hasOwnProperty.call(t,n)){if(-1!==e.indexOf(n))continue;r[n]=t[n]}return r}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(n=0;n0&&void 0!==arguments[0]?arguments[0]:Bo};!function(t){t.Set="IsLoading.Set"}(To||(To={}));var Ho=function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],e=arguments.length>1?arguments[1]:void 0;return e.type===To.Set?e.payload:t},$o=function(t){return{value:t,"fantasy-land/map":function(){return this}}},Jo=yt(function(t,e){return t($o)(e).value}),Wo=yt(function(t,e){return function(r){return function(n){return _e(function(t){return e(t,n)},r(t(n)))}}}),zo=X(function(t){return Wo(function(e){return Lt(t,e)},Ht(t))}),Vo=Dt(function(t,e,r){var n=Array.prototype.slice.call(r,0);return n.splice(t,e),n}),Ko=yt(function t(e,r){if(null==r)return r;switch(e.length){case 0:return r;case 1:return function(t,e){if(null==e)return e;if(Nt(t)&&Bt(e))return Vo(t,1,e);var r={};for(var n in e)r[n]=e[n];return delete r[t],r}(e[0],r);default:var n=e[0],o=Array.prototype.slice.call(e,1);return null==r[n]?function(t,e){if(Nt(t)&&Bt(e))return[].concat(e);var r={};for(var n in e)r[n]=e[n];return r}(n,r):$t(n,t(o,r[n]),r)}});function Yo(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function Qo(t,e,r){return(e=function(t){var e=function(t){if("object"!=typeof t||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var Xo=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{components:[]},e=arguments.length>1?arguments[1]:void 0;if(e.type===oo("SET_LAYOUT"))return Array.isArray(e.payload)?t.components=[...e.payload]:t.components=function(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:Zo,e=arguments.length>1?arguments[1]:void 0;return e.type===oo("SET_PATHS")?e.payload:t},ea=yt(function(t,e){return Ko([t],e)});function ra(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;switch(e.type){case"ADD_CALLBACK_JOB":return((t,e)=>$t(t.jobId,t,e))(e.payload,t);case"REMOVE_CALLBACK_JOB":return((t,e)=>ea(t,e))(e.payload.jobId,t);case"CALLBACK_JOB_OUTDATED":return((t,e)=>Ht([t,"outdated"],!0,e))(e.payload.jobId,t);default:return t}}function na(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;switch(e.type){case"LOADED":return e.payload.reduce((t,e)=>{var r=[JSON.stringify(e.path)],n=Gt([],r,t);return Ht(r,n.filter(t=>t.property!==e.property),t)},t);case"LOADING":return e.payload.reduce((t,e)=>{var r=[JSON.stringify(e.path)],n=Gt([],r,t);return Rt(e,n)||n.push(e),Ht(r,n,t)},t);default:return t}}var oa=yt(function(t,e){return we(t+1,function(){var r=arguments[t];if(null!=r&&De(r[e]))return r[e].apply(r,Array.prototype.slice.call(arguments,0,t));throw new TypeError(Ge(r)+' does not have a method named "'+e+'"')})})(1,"join");function aa(t,r,n,o){var a=Tr(r,n);return Array.isArray(o)?e().createElement(t,a,...o):e().createElement(t,a,o)}function ia(t){return"Object"===At(t)&&Vr("type",t)&&Vr("namespace",t)&&Vr("props",t)}function ua(t){return oa(",",t)}function ca(t,e){return Vt(t,e.layout)}function sa(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;if(Rt(e.type,["UNDO_PROP_CHANGE","REDO_PROP_CHANGE","ON_PROP_CHANGE"])){var r=ua(e.payload.itempath),n=Gt(0,[r,"hash"],t);t=$t(r,{hash:n+1,changedProps:e.payload.props,renderType:e.payload.renderType},t)}else if("RESET_COMPONENT_STATE"===e.type){var o=e.payload.itempath;if(o){var a=ua(o);return Object.fromEntries(Object.entries(t).filter(t=>{return!(e=t,r=1,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,a,i,u=[],c=!0,s=!1;try{if(a=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=a.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(s)throw o}}return u}}(e,r)||function(t,e){if(t){if("string"==typeof t)return sa(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?sa(t,e):void 0}}(e,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0].startsWith(a);var e,r}))}}return t};function pa(){var t={appLifecycle:co,callbacks:vo,config:wo,error:Eo,graphs:_o,history:Po,hooks:Ao,profile:Go,changed:Fo,isLoading:Ho,layout:Xo,paths:ta,layoutHashes:fa,loading:na};return zt(e=>{var r;t[e]=(r=e,function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0,n=t;if(e.type===r){var o=e.payload,a=o.id,i={status:o.status,content:o.content};n=Array.isArray(a)?Ht(a,i,t):a?$t(a,i,t):Tr(t,i)}return n})},la),t.callbackJobs=ra,function(t){for(var e=Object.keys(t),r={},n=0;n{Vn(o,a,l,t).length&&(n.props[t]=s[t])})),n}function ha(t,e,r){return(e=function(t){var e=function(t){if("object"!=typeof t||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}class ya{constructor(t){ha(this,"_store",void 0),ha(this,"_unsubscribe",void 0),ha(this,"_observers",[]),ha(this,"observe",(t,e)=>{if("function"==typeof t){if(!Array.isArray(e))throw new Error("inputs must be an array");return this.add(t,e),()=>this.remove(t)}return this.add(t.observer,t.inputs),()=>this.remove(t.observer)}),ha(this,"setStore",t=>{this.__finalize__(),this.__init__(t)}),ha(this,"__finalize__",()=>{var t;return null===(t=this._unsubscribe)||void 0===t?void 0:t.call(this)}),ha(this,"__init__",t=>{this._store=t,t&&(this._unsubscribe=t.subscribe(this.notify)),this._observers.forEach(t=>{t.lastState=null})}),ha(this,"add",(t,e)=>this._observers.push({inputPaths:_e(t=>t.split("."),e),lastState:null,observer:t,triggered:!1})),ha(this,"notify",()=>{var t=this._store;if(t){var e=t.getState(),r=fe(t=>!t.triggered&&Rr(r=>Vt(r,e)!==Vt(r,t.lastState),t.inputPaths),this._observers);r.forEach(t=>{t.triggered=!0}),r.forEach(e=>{e.lastState=t.getState(),e.observer(t),e.triggered=!1})}}),ha(this,"remove",t=>this._observers.splice(this._observers.findIndex(e=>t===e.observer,this._observers),1)),this.__init__(t)}}var va=t=>{var e=t(),r=e.config,n=e.isLoading,o=null==r?void 0:r.update_title;o&&(n?document.title!==o&&(ba.title=document.title,document.title=o):document.title===o?document.title=ba.title:ba.title=document.title)},ba={inputs:["isLoading"],mutationObserver:void 0,observer:t=>{var e=t.getState,r=e().config;if(ba.config!==r){var n;ba.config=r,null===(n=ba.mutationObserver)||void 0===n||n.disconnect(),ba.mutationObserver=new MutationObserver(()=>va(e));var o=document.querySelector("title");o&&ba.mutationObserver.observe(o,{subtree:!0,childList:!0,attributes:!0,characterData:!0})}va(e)}},ma=ba,ga=X(function(t){var e=[];for(var r in t)mt(r,t)&&(e[e.length]=[r,t[r]]);return e}),wa=yt(function(t,e){for(var r={},n=0;n1?r-1:0),o=1;ot.length)&&(e=t.length);for(var r=0,n=Array(e);re===t||e.substr(0,n)===r}var Ua=t=>"U"===t?void 0:JSON.parse(t||null),La=t=>void 0===t?"U":JSON.stringify(t);class qa{constructor(t){this._name=t,this._storage=window[t]}hasItem(t){return null!==this._storage.getItem(Da+t)}getItem(t){return Ua(this._storage.getItem(Da+t))}_setItem(t,e){this._storage.setItem(Da+t,La(e))}setItem(t,e,r){try{this._setItem(t,e)}catch(e){r(Na("".concat(t," failed to save in ").concat(this._name,". Persisted props may be lost.")))}}removeItem(t){this._storage.removeItem(Da+t)}clear(t){for(var e=Ma(Da+(t||""),t?".":""),r=[],n=0;nthis._storage.removeItem(t),r)}}var Ga={memory:new class{constructor(){this._data={}}hasItem(t){return t in this._data}getItem(t){return Ua(this._data[t])}setItem(t,e){this._data[t]=La(e)}removeItem(t){delete this._data[t]}clear(t){t?zt(t=>delete this._data[t],fe(Ma(t,"."),Pt(this._data))):this._data={}}}},Ba={local:"localStorage",session:"sessionStorage"};function Fa(t,e){return Ga[t]||(Ga[t]=function(t,e){var r=new qa(t),n=Ga.memory,o=function(){for(var t="Spam",e=2;e<16;e++)t+=t;return t}(),a=Da+"x.x";try{return r._setItem(a,o),r.getItem(a)!==o?(e(Na("".concat(t," init failed set/get, falling back to memory"))),n):(r.removeItem(a),r)}catch(r){e(Na("".concat(t," init first try failed; clearing and retrying")))}try{if(r.clear(),r._setItem(a,o),r.getItem(a)!==o)throw new Error("nope");return r.removeItem(a),e(Na("".concat(t," init set/get succeeded after clearing!"))),r}catch(r){return e(Na("".concat(t," init still failed, falling back to memory"))),n}}(Ba[t],e)),Ga[t]}var Ha={extract:t=>t,apply:(t,e)=>t},$a=(t,e,r)=>t.persistenceTransforms&&t.persistenceTransforms[e]?r?t.persistenceTransforms[e][r]:t.persistenceTransforms[e]:Ha,Ja=(t,e,r)=>"".concat(_n(t),".").concat(e,".").concat(JSON.stringify(r)),Wa=t=>{var e=t.props,r=t.type,n=t.namespace;if(!r||!n)return{props:e};var o=e.id,a=e.persistence,i=nn(t),u=t=>e[t]||(i.defaultProps||i.dashPersistence||{})[t],c=u("persisted_props"),s=u("persistence_type");return{canPersist:o&&c&&s,id:o,props:e,element:i,persistence:a,persisted_props:c,persistence_type:s}};function za(t,e){return Array.isArray(t)?t.map(t=>ia(t)?Ka(t,t,[],e):t):Ka(t,t,[],e)}function Va(t,e,r,n,o,a,i){if(e.hasItem(t)){var u=Ia(e.getItem(t),2),c=u[0],s=u[1],l=i?c:s,f=i?s:c,p=Ia(o.split("."),2),d=p[0],h=p[1],y=$a(r,d,h);xt(l,y.extract(n[d]))?a[d]=y.apply(f,d in a?a[d]:n[d]):e.removeItem(t)}}function Ka(t,e,r,n){var o=Wa(e),a=o.canPersist,i=o.id,u=o.props,c=o.element,s=o.persistence,l=o.persisted_props,f=o.persistence_type,p=t;if(a&&s){var d=Fa(f,n),h={};for(var y in zt(t=>Va(Ja(i,t,s),d,c,u,t,h),l),h)p=Ca(zo(r.concat("props",y)),h[y],p)}var v=u.children;return Array.isArray(v)?v.forEach((t,e)=>{"Object"===At(t)&&t.props&&(p=Ka(p,t,r.concat("props","children",e),n))}):"Object"===At(v)&&v.props&&(p=Ka(p,v,r.concat("props","children"),n)),p}function Ya(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function a(r,n,o,a){var c=n&&n.prototype instanceof u?n:u,s=Object.create(c.prototype);return Qa(s,"_invoke",function(r,n,o){var a,u,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:d,f:d.bind(t,4),d:function(e,r){return a=e,u=0,c=t,p.n=r,i}};function d(r,n){for(u=r,c=n,e=0;!f&&s&&!o&&e3?(o=h===n)&&(c=a[(u=a[4])?5:(u=3,3)],a[4]=a[5]=t):a[0]<=d&&((o=r<2&&dn||n>h)&&(a[4]=r,a[5]=n,p.n=h,u=0))}if(o||r>1)return i;throw f=!0,n}return function(o,l,h){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,h),u=l,c=h;(e=u<2?t:c)||!f;){a||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,a){if(u||(o="next"),e=a[o]){if(!(e=e.call(a,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=a.return)&&e.call(a),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);a=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==i)break}catch(e){a=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,a),!0),s}var i={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(Qa(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,Qa(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,Qa(f,"constructor",s),Qa(s,"constructor",c),c.displayName="GeneratorFunction",Qa(s,o,"GeneratorFunction"),Qa(f),Qa(f,o,"Generator"),Qa(f,n,function(){return this}),Qa(f,"toString",function(){return"[object Generator]"}),(Ya=function(){return{w:a,m:p}})()}function Qa(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}Qa=function(t,e,r,n){function a(e,r){Qa(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(a("next",0),a("throw",1),a("return",2))},Qa(t,e,r,n)}function Xa(t,e,r,n,o,a,i){try{var u=t[a](i),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}var Za=Pa(oo("ON_ERROR")),ti=Pa(oo("SET_APP_LIFECYCLE")),ei=Pa(oo("SET_CONFIG")),ri=Pa(oo("ADD_HTTP_HEADERS")),ni=Pa(oo("SET_GRAPHS")),oi=Pa(oo("SET_HOOKS")),ai=Pa(oo("SET_LAYOUT")),ii=Pa(oo("SET_PATHS")),ui=(Pa(oo("SET_REQUEST_QUEUE")),Pa(oo("INSERT_COMPONENT"))),ci=Pa(oo("REMOVE_COMPONENT")),si=Pa(oo("ON_PROP_CHANGE")),li=Pa(oo("RESET_COMPONENT_STATE"));function fi(t){return(e,r)=>{!function(t,e,r){var n=Wa(t),o=n.canPersist,a=n.id,i=n.props,u=n.element,c=n.persistence,s=n.persisted_props,l=n.persistence_type,f=void 0!==(null==e?void 0:e.persistence)&&e.persistence!==c;o&&c&&!f&&zt(t=>{var n=Ia(t.split("."),2),o=n[0],s=n[1];if(void 0!==e[o]){var f=Fa(l,r),p=$a(u,o,s).extract,d=Ja(a,t,c),h=p(i[o]),y=p(e[o]);if(h!==y){f.hasItem(d)&&(h=f.getItem(d)[1]);var v=void 0===h?[y]:[y,h];f.setItem(d,v,r)}}},s)}(Vt(t.itempath,r().layout),t.props,e),e(si(t))}}var pi=t=>(e,r)=>t(Za({type:"backEnd",error:{message:e,html:r.join("\n")}}));var di=tt(console.warn);function hi(t){try{var e=t&&t.csrf_token_name||"_csrf_token",r=t&&t.csrf_header_name||"X-CSRFToken",n=Aa.qg(document.cookie)[e];return n?{[r]:n}:{}}catch(t){return di(t),{}}}var yi=mi("REDO"),vi=mi("UNDO"),bi=mi("REVERT");function mi(t){return function(e,r){var n=r(),o=n.history,a=n.paths;e(Pa(t)());var i=("REDO"===t?o.future[0]:o.past[o.past.length-1])||{},u=i.id,c=i.props;u&&(e(Pa("UNDO_PROP_CHANGE")({itempath:rn(a,u),props:c})),e(gi({id:u,props:c})))}}function gi(t){var e=t.id,r=t.props;return function(){var t,n=(t=Ya().m(function t(n,o){var a,i,u;return Ya().w(function(t){for(;;)switch(t.n){case 0:a=o(),i=a.graphs,u=a.paths,n(Su(Zn(e,r,i,u)));case 1:return t.a(2)}},t)}),function(){var e=this,r=arguments;return new Promise(function(n,o){var a=t.apply(e,r);function i(t){Xa(a,n,o,i,u,"next",t)}function u(t){Xa(a,n,o,i,u,"throw",t)}i(void 0)})});return function(t,e){return n.apply(this,arguments)}}()}function wi(t,e,r){if(t&&"function"==typeof t.text)t.text().then(t=>{r(Za({type:"backEnd",error:{message:e,html:t}}))});else{var n=t instanceof Error?t:{message:e,html:t};r(Za({type:"backEnd",error:n}))}}var Oi=yt(function(t,e){return e instanceof t||null!=e&&(e.constructor===t||"Object"===t.name&&"object"==typeof e)}),_i=yt(function(t,e){return gr([t],e)}),ji=X(function(t){return Mt(t)?t.split("").reverse().join(""):Array.prototype.slice.call(t,0).reverse()});function Ei(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function Si(t){for(var e=1;e{var r=e.params,n=e.location;return Ht(n,r.value,t)},Merge:(t,e)=>{var r=Vt(e.location,t);return Ht(e.location,Si(Si({},r),e.params.value),t)},Extend:(t,e)=>{var r=Vt(e.location,t);return Ht(e.location,Be(r,e.params.value),t)},Delete:(t,e)=>Ko(e.location,t),Insert:(t,e)=>{var r=Vt(e.location,t);return Ht(e.location,Gr(ki(e.params.index,r),e.params.value,r),t)},Append:(t,e)=>{var r=Vt(e.location,t);return Ht(e.location,Kr(e.params.value,r),t)},Prepend:(t,e)=>{var r=Vt(e.location,t);return Ht(e.location,_i(e.params.value,r),t)},Add:(t,e)=>{var r=Vt(e.location,t);return Ht(e.location,r+e.params.value,t)},Sub:(t,e)=>{var r=Vt(e.location,t);return Ht(e.location,r-e.params.value,t)},Mul:(t,e)=>{var r=Vt(e.location,t);return Ht(e.location,r*e.params.value,t)},Div:(t,e)=>{var r=Vt(e.location,t);return Ht(e.location,r/e.params.value,t)},Clear:(t,e)=>{var r=Vt(e.location,t);return Ht(e.location,Yt(r),t)},Reverse:(t,e)=>{var r=Vt(e.location,t);return Ht(e.location,ji(r),t)},Remove:(t,e)=>{var r=Vt(e.location,t);return Ht(e.location,r.filter(t=>!xt(t,e.params.value)),t)}};function Ci(t,e){for(var r=t,n=0;n3?(o=h===n)&&(c=a[(u=a[4])?5:(u=3,3)],a[4]=a[5]=t):a[0]<=d&&((o=r<2&&dn||n>h)&&(a[4]=r,a[5]=n,p.n=h,u=0))}if(o||r>1)return i;throw f=!0,n}return function(o,l,h){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,h),u=l,c=h;(e=u<2?t:c)||!f;){a||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,a){if(u||(o="next"),e=a[o]){if(!(e=e.call(a,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=a.return)&&e.call(a),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);a=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==i)break}catch(e){a=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,a),!0),s}var i={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(Di(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,Di(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,Di(f,"constructor",s),Di(s,"constructor",c),c.displayName="GeneratorFunction",Di(s,o,"GeneratorFunction"),Di(f),Di(f,o,"Generator"),Di(f,n,function(){return this}),Di(f,"toString",function(){return"[object Generator]"}),(Ri=function(){return{w:a,m:p}})()}function Di(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}Di=function(t,e,r,n){function a(e,r){Di(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(a("next",0),a("throw",1),a("return",2))},Di(t,e,r,n)}function Ni(t,e,r,n,o,a,i){try{var u=t[a](i),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}var Mi=tt(console.warn),Ui={GET:function(t,e,r,n){return fetch(t,go(e,{method:"GET",headers:hi(n)}))},POST:function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return fetch(t,go(e,{method:"POST",headers:hi(arguments.length>3?arguments[3]:void 0),body:r?JSON.stringify(r):null}))}};function Li(t,e,r,n,o){return function(){var a,i=(a=Ri().m(function a(i,u){var c,s,l,f,p,d,h,y,v,b,m;return Ri().w(function(a){for(;;)switch(a.p=a.n){case 0:d=function(t){u().error.backEndConnected!==t&&i({type:"SET_CONNECTION_STATUS",payload:t})},c=u(),s=c.config,l=c.hooks,f=null,p="".concat(Qr(s)).concat(t),i({type:r,payload:{id:n,status:"loading"}}),a.p=1,y=0;case 2:if(!(y<=1)){a.n=11;break}return a.p=3,a.n=4,Ui[e](p,s.fetch,o,s);case 4:h=a.v,a.n=6;break;case 5:return a.p=5,a.v,console.log("fetch error",h),d(!1),a.a(2);case 6:if(401!==h.status&&400!==h.status){a.n=9;break}if(!l.request_refresh_jwt){a.n=9;break}return a.n=7,h.text();case 7:if(!a.v.includes(Io)){a.n=9;break}return a.n=8,l.request_refresh_jwt(s.fetch.headers.Authorization.substr(7));case 8:if(!(v=a.v)){a.n=9;break}return f={Authorization:"Bearer ".concat(v)},s=go(s,{fetch:{headers:f}}),a.a(3,10);case 9:return a.a(3,11);case 10:y++,a.n=2;break;case 11:if(b=h.headers.get("content-type"),f&&i(ri(f)),d(!0),!b||-1===b.indexOf("application/json")){a.n=12;break}return a.a(2,h.json().then(t=>(i({type:r,payload:{status:h.status,content:t,id:n}}),t)));case 12:return a.n=13,h.text();case 13:return m=a.v,Mi("Response is missing header: content-type: application/json"),a.a(2,i({type:r,payload:{id:n,status:h.status,content:m}}));case 14:a.p=14,wi(a.v,"Error from API call: "+t,i);case 15:return a.a(2)}},a,null,[[3,5],[1,14]])}),function(){var t=this,e=arguments;return new Promise(function(r,n){var o=a.apply(t,e);function i(t){Ni(o,r,n,i,u,"next",t)}function u(t){Ni(o,r,n,i,u,"throw",t)}i(void 0)})});return function(t,e){return i.apply(this,arguments)}}()}function qi(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function Gi(t){for(var e=1;e{n.onload=()=>{t()},n.onerror=t=>e(t)}),null==r||r.appendChild(n)}else if("_css_dist"===t.type){var o=document.createElement("link");o.href=t.url,o.rel="stylesheet",e=new Promise((t,e)=>{o.onload=()=>{t()},o.onerror=t=>e(t)}),null==r||r.appendChild(o)}return e}function Hi(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);rn.reduce((e,r,n)=>(e[r]=t.values[n],e),{})).filter(e=>xt(ea(r,e),ea(r,t)))}var Wi,zi=Pa("LOADING"),Vi=Pa("LOADED"),Ki=null;function Yi(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,a,i,u=[],c=!0,s=!1;try{if(a=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=a.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(s)throw o}}return u}}(t,e)||Xi(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Qi(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=Xi(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,i=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return i=t.done,t},e:function(t){u=!0,a=t},f:function(){try{i||null==r.return||r.return()}finally{if(u)throw a}}}}function Xi(t,e){if(t){if("string"==typeof t)return Zi(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Zi(t,e):void 0}}function Zi(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r3?(o=h===n)&&(c=a[(u=a[4])?5:(u=3,3)],a[4]=a[5]=t):a[0]<=d&&((o=r<2&&dn||n>h)&&(a[4]=r,a[5]=n,p.n=h,u=0))}if(o||r>1)return i;throw f=!0,n}return function(o,l,h){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,h),u=l,c=h;(e=u<2?t:c)||!f;){a||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,a){if(u||(o="next"),e=a[o]){if(!(e=e.call(a,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=a.return)&&e.call(a),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);a=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==i)break}catch(e){a=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,a),!0),s}var i={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(eu(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,eu(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,eu(f,"constructor",s),eu(s,"constructor",c),c.displayName="GeneratorFunction",eu(s,o,"GeneratorFunction"),eu(f),eu(f,o,"Generator"),eu(f,n,function(){return this}),eu(f,"toString",function(){return"[object Generator]"}),(tu=function(){return{w:a,m:p}})()}function eu(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}eu=function(t,e,r,n){function a(e,r){eu(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(a("next",0),a("throw",1),a("return",2))},eu(t,e,r,n)}function ru(t,e,r,n,o,a,i){try{var u=t[a](i),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function nu(t){return function(){var e=this,r=arguments;return new Promise(function(n,o){var a=t.apply(e,r);function i(t){ru(a,n,o,i,u,"next",t)}function u(t){ru(a,n,o,i,u,"throw",t)}i(void 0)})}}function ou(t,e,r){return(e=function(t){var e=function(t){if("object"!=typeof t||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}!function(t){t.CONNECT="connect",t.DISCONNECT="disconnect",t.CALLBACK_REQUEST="callback_request",t.GET_PROPS_RESPONSE="get_props_response",t.TAB_VISIBLE="tab_visible",t.CONNECTED="connected",t.DISCONNECTED="disconnected",t.CALLBACK_RESPONSE="callback_response",t.SET_PROPS="set_props",t.SET_PROPS_BATCH="set_props_batch",t.GET_PROPS_REQUEST="get_props_request",t.ERROR="error"}(Wi||(Wi={}));class au{constructor(){ou(this,"worker",null),ou(this,"rendererId",void 0),ou(this,"pendingCallbacks",new Map),ou(this,"requestCounter",0),ou(this,"isConnected",!1),ou(this,"connectionPromise",null),ou(this,"connectionResolve",null),ou(this,"onSetProps",null),ou(this,"onSetPropsBatch",null),ou(this,"onGetPropsRequest",null),ou(this,"onConnected",null),ou(this,"onDisconnected",null),ou(this,"onError",null),this.rendererId=(Ki||(Ki="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"".concat(Date.now(),"-").concat(Math.random().toString(36).slice(2))),Ki)}connect(t,e,r,n){var o=this;return nu(tu().m(function a(){return tu().w(function(a){for(;;)switch(a.n){case 0:if(!o.worker){a.n=1;break}return a.a(2);case 1:return o.worker=new SharedWorker(t,{name:"dash-ws-worker"}),o.worker.port.onmessage=o.handleMessage.bind(o),o.connectionPromise=new Promise(t=>{o.connectionResolve=t}),o.worker.port.start(),o.worker.port.postMessage({type:Wi.CONNECT,rendererId:o.rendererId,payload:{serverUrl:e,inactivityTimeout:r,heartbeatInterval:n}}),a.n=2,o.connectionPromise;case 2:return a.a(2)}},a)}))()}disconnect(){this.worker&&(this.worker.port.postMessage({type:Wi.DISCONNECT,rendererId:this.rendererId}),this.worker.port.close(),this.worker=null),this.isConnected=!1,this.connectionPromise=null,this.connectionResolve=null;var t,e=Qi(this.pendingCallbacks);try{for(e.s();!(t=e.n()).done;)Yi(t.value,2)[1].resolve({status:"prevent_update"})}catch(t){e.e(t)}finally{e.f()}this.pendingCallbacks.clear()}ensureConnected(t){var e=this;return nu(tu().m(function r(){var n,o,a,i,u;return tu().w(function(r){for(;;)switch(r.n){case 0:if(!e.isConnected){r.n=1;break}return r.a(2);case 1:if(!e.connectionPromise){r.n=3;break}return r.n=2,e.connectionPromise;case 2:case 6:return r.a(2);case 3:if(null!==(n=t.websocket)&&void 0!==n&&n.url&&null!==(o=t.websocket)&&void 0!==o&&o.worker_url){r.n=4;break}throw new Error("WebSocket config not available");case 4:if("undefined"!=typeof SharedWorker){r.n=5;break}throw new Error("SharedWorker not supported");case 5:return a="https:"===window.location.protocol?"wss:":"ws:",i=window.location.host,u="".concat(a,"//").concat(i).concat(t.websocket.url),r.n=6,e.connect(t.websocket.worker_url,u,t.websocket.inactivity_timeout,t.websocket.heartbeat_interval)}},r)}))()}sendCallback(t){var e=this;return nu(tu().m(function r(){var n;return tu().w(function(r){for(;;)switch(r.n){case 0:if(!e.connectionPromise||e.isConnected){r.n=1;break}return r.n=1,e.connectionPromise;case 1:if(e.worker){r.n=2;break}throw new Error("Worker not connected");case 2:return n="".concat(e.rendererId,"-").concat(++e.requestCounter),r.a(2,new Promise((r,o)=>{e.pendingCallbacks.set(n,{resolve:r,reject:o}),e.worker.port.postMessage({type:Wi.CALLBACK_REQUEST,rendererId:e.rendererId,requestId:n,payload:t})}))}},r)}))()}sendGetPropsResponse(t,e){this.worker&&this.isConnected&&this.worker.port.postMessage({type:Wi.GET_PROPS_RESPONSE,rendererId:this.rendererId,requestId:t,payload:e})}get connected(){return this.isConnected}notifyTabVisible(){this.worker&&this.isConnected&&this.worker.port.postMessage({type:Wi.TAB_VISIBLE,rendererId:this.rendererId})}handleMessage(t){var e=t.data;switch(e.type){case Wi.CONNECTED:this.isConnected=!0,this.connectionResolve&&(this.connectionResolve(),this.connectionResolve=null),this.onConnected&&this.onConnected();break;case Wi.DISCONNECTED:this.isConnected=!1;var r,n,o=Qi(this.pendingCallbacks);try{for(o.s();!(r=o.n()).done;)Yi(r.value,2)[1].resolve({status:"prevent_update"})}catch(t){o.e(t)}finally{o.f()}this.pendingCallbacks.clear(),this.onDisconnected&&this.onDisconnected(null===(n=e.payload)||void 0===n?void 0:n.reason);break;case Wi.CALLBACK_RESPONSE:var a=e.requestId,i=this.pendingCallbacks.get(a);i&&(this.pendingCallbacks.delete(a),i.resolve(e.payload));break;case Wi.SET_PROPS:this.onSetProps&&this.onSetProps(e.payload);break;case Wi.SET_PROPS_BATCH:this.onSetPropsBatch&&this.onSetPropsBatch(e.payload);break;case Wi.GET_PROPS_REQUEST:this.onGetPropsRequest&&this.onGetPropsRequest(e.requestId,e.payload);break;case Wi.ERROR:var u,c;this.onError&&this.onError((null===(u=e.payload)||void 0===u?void 0:u.message)||"Unknown error",null===(c=e.payload)||void 0===c?void 0:c.code)}}}var iu=null;function uu(){return iu||(iu=new au),iu}function cu(t){var e;return!(null===(e=t.websocket)||void 0===e||!e.enabled||"undefined"==typeof SharedWorker)}function su(t){var e,r;return!(null===(e=t.websocket)||void 0===e||!e.url||null===(r=t.websocket)||void 0===r||!r.worker_url||"undefined"==typeof SharedWorker)}function lu(t){if(null!=t){var e=t["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],r=0;if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length))return{next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}}}throw new TypeError(typeof t+" is not iterable")}function fu(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function a(r,n,o,a){var c=n&&n.prototype instanceof u?n:u,s=Object.create(c.prototype);return pu(s,"_invoke",function(r,n,o){var a,u,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:d,f:d.bind(t,4),d:function(e,r){return a=e,u=0,c=t,p.n=r,i}};function d(r,n){for(u=r,c=n,e=0;!f&&s&&!o&&e3?(o=h===n)&&(c=a[(u=a[4])?5:(u=3,3)],a[4]=a[5]=t):a[0]<=d&&((o=r<2&&dn||n>h)&&(a[4]=r,a[5]=n,p.n=h,u=0))}if(o||r>1)return i;throw f=!0,n}return function(o,l,h){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,h),u=l,c=h;(e=u<2?t:c)||!f;){a||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,a){if(u||(o="next"),e=a[o]){if(!(e=e.call(a,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=a.return)&&e.call(a),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);a=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==i)break}catch(e){a=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,a),!0),s}var i={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(pu(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,pu(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,pu(f,"constructor",s),pu(s,"constructor",c),c.displayName="GeneratorFunction",pu(s,o,"GeneratorFunction"),pu(f),pu(f,o,"Generator"),pu(f,n,function(){return this}),pu(f,"toString",function(){return"[object Generator]"}),(fu=function(){return{w:a,m:p}})()}function pu(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}pu=function(t,e,r,n){function a(e,r){pu(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(a("next",0),a("throw",1),a("return",2))},pu(t,e,r,n)}function du(t,e,r,n,o,a,i){try{var u=t[a](i),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function hu(t){return function(){var e=this,r=arguments;return new Promise(function(n,o){var a=t.apply(e,r);function i(t){du(a,n,o,i,u,"next",t)}function u(t){du(a,n,o,i,u,"throw",t)}i(void 0)})}}function yu(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,a,i,u=[],c=!0,s=!1;try{if(a=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=a.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(s)throw o}}return u}}(t,e)||function(t,e){if(t){if("string"==typeof t)return vu(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?vu(t,e):void 0}}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function vu(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r5&&void 0!==arguments[5]&&arguments[5],i="Input"===o?r.getInputs:r.getState,u=[],c=0,s=i(t).map((a,i)=>{var s=yu(Gu(t,a.map(t=>{var r=t.id,n=t.property,o=t.path;return{id:r,property:n,value:Vt([...o,"props",n],e)}}),n[i],r.anyVals,o),2),l=s[0],f=s[1];return Nn(n[i])&&!l.length&&c++,f&&u.push(f),l});if(u.length){if(a&&u.length+c===s.length)return null;Fu(u,t)}return s}function Fu(t,e){var r=t[0];throw-1!==r.indexOf("logged above")&&console.error(e.objs),new ReferenceError(r)}var Hu=t=>Array.isArray(t)?Ve("value",t):t.value,$u=(t,e)=>Array.isArray(t)?e===window.dash_clientside.no_update?sr(t,[e]):sr(t,e):[[t,e]];function Ju(t){return t.split("@")[0]}function Wu(t,e,r,n){return zu.apply(this,arguments)}function zu(){return zu=hu(fu().m(function t(e,r,n,o){var a,i,u,c,s,l,f,p,d,h,y,v,b,m,g,w,O;return fu().w(function(t){for(;;)switch(t.p=t.n){case 0:if((a=window.dash_clientside=window.dash_clientside||{}).no_update||(Object.defineProperty(a,"no_update",{value:{description:"Return to prevent updating an Output."},writable:!1}),Object.defineProperty(a,"PreventUpdate",{value:{description:"Throw to prevent updating all Outputs."},writable:!1})),i=o.inputs,u=o.outputs,c=o.state,s=Date.now(),l=Xu(i),f=Xu(c),p={},d=Ro,t.p=1,y=r.namespace,v=r.function_name,b=i.map(Hu),c&&(b=Be(b,c.map(Hu))),a.callback_context={},a.callback_context.triggered=o.changedPropIds.map(t=>({prop_id:t,value:l[t]})),a.callback_context.triggered_id=Zu(o.changedPropIds),a.callback_context.inputs_list=i,a.callback_context.inputs=l,a.callback_context.states_list=c,a.callback_context.states=f,a.callback_context.outputs_list=u,m=a[y][v](...b),delete a.callback_context,"function"!=typeof(null===(h=m)||void 0===h?void 0:h.then)){t.n=3;break}return t.n=2,m;case 2:m=t.v;case 3:u&&$u(u,m).forEach(t=>{var e=yu(t,2),r=e[0],n=e[1];$u(r,n).forEach(t=>{var e=yu(t,2),r=e[0],n=e[1],o=r.id,i=r.property,u=_n(o),c=p[u]=p[u]||{};n!==a.no_update&&(c[Ju(i)]=n)})}),t.n=6;break;case 4:if(t.p=4,(O=t.v)!==a.PreventUpdate){t.n=5;break}d=Do,t.n=6;break;case 5:throw d="CLIENTSIDE_ERROR",O;case 6:return t.p=6,delete a.callback_context,g=Date.now()-s,w={__dash_server:g,__dash_client:g,__dash_upload:0,__dash_download:0},n.ui&&e(Mu({id:o.output,usage:w,status:d,result:p,inputs:i,state:c})),t.f(6);case 7:return t.a(2,p)}},t,null,[[1,4,6,7]])})),zu.apply(this,arguments)}function Vu(t,e){return function(r,n){ga(t).reduce((t,r,o)=>{var a,i=yu(r,2),u=i[0],c=i[1],s=u,l=[];if(u.startsWith("{")){var f=yu($i(u),2);s=f[0],a=f[1],l=function(t,e,r,n){var o=[],a={};return ga(t).forEach(i=>{var u,c,s=(c=2,function(t){if(Array.isArray(t))return t}(u=i)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,a,i,u=[],c=!0,s=!1;try{if(a=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=a.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(s)throw o}}return u}}(u,c)||function(t,e){if(t){if("string"==typeof t)return Hi(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Hi(t,e):void 0}}(u,c)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),l=s[0],f=s[1];if(!o.length)if(Array.isArray(f)){var p=(e.parsedChangedPropsIds[r]||e.parsedChangedPropsIds[0])[l];f.includes("MATCH")?a[l]=p:f.includes("ALL")?o=Ji(t,n(),l):f.includes("ALLSMALLER")&&(o=Ji(t,n(),l).filter(t=>t[l]{t.push([e,d])}),t},[]).forEach(t=>{var o,a=yu(t,2),i=a[0],u=a[1],c=n(),s=rn(c.paths,i),l={props:{}};s&&(l=ca(s,c));var f=Ii(u,(null===(o=l)||void 0===o?void 0:o.props)||{});r(function(t,e,r){return function(n,o){var a=o(),i=a.paths,u=a.config,c=rn(i,t);c?(n(fi({props:e,itempath:c,renderType:"callback"})),n(gi({id:t,props:e}))):u.suppress_callback_exceptions||pi(n)("ID running component not found in layout",["Component defined in running keyword not found in layout.",'Component id: "'.concat(_n(t),'"'),"This ID was used in the callback(s) for Output(s):","".concat(r.output),"You can suppress this exception by setting","`suppress_callback_exceptions=True`."])}}(i,f,e)),s&&r(ii(en(mu(mu({},l),{},{props:mu(mu({},l.props),f)}),[...s],c.paths,c.paths.events)))})}}function Ku(t,e,r,n,o,a,i,u){e.request_pre&&e.request_pre(n);var c,s,l,f,p=Date.now(),d=JSON.stringify(n),h=a;return u&&(t(Vu(u.running,n)),l=u.runningOff),new Promise((a,u)=>{var y=h=>{var y=h.status;if(s){var v=i().callbackJobs[s];if(null!=v&&v.outdated)return t(Lu({jobId:s})),a({})}function m(e){if(r.ui){var o={__dash_server:0,__dash_client:Date.now()-p,__dash_upload:d.length,__dash_download:Number(h.headers.get("Content-Length"))};(h.headers.get("Server-Timing")||"").split(",").forEach(t=>{var e=t.split(";")[0],r=t.match(/;dur=[0-9.]+/);r&&(o[e]=Number(r[0].slice(5)))}),t(Mu({id:n.output,usage:o,status:y,result:e,inputs:n.inputs,state:n.state}))}}var g=t=>{var r,o=t.multi,i=t.response;if(e.request_post&&e.request_post(n,i),o)r=i;else{var u=n.output,c=u.substr(0,u.lastIndexOf("."));r={[c]:i.props}}m(r),a(r)},w=()=>{s&&t(Lu({jobId:s})),l&&t(Vu(l,n)),f&&t(Vu(f,n))};y===Ro?h.json().then(e=>{if(!c&&e.cacheKey&&(c=e.cacheKey),!s&&e.job){var r={jobId:e.job,cacheKey:e.cacheKey,cancelInputs:e.cancel,progressDefault:e.progressDefault,output:JSON.stringify(n.outputs)};t(Uu(r)),s=e.job}e.sideUpdate&&t(Vu(e.sideUpdate,n)),e.progress&&t(Vu(e.progress,n)),!f&&e.progressDefault&&(f=e.progressDefault),o&&void 0===e.response?setTimeout(b,void 0!==o.interval?o.interval:500):e.dist?Promise.all(e.dist.map(Fi)).then(()=>{w(),g(e)}):(w(),g(e))}):y===Do?(w(),m({}),a({})):(w(),u(h))},v=()=>{r.ui&&t(Mu({id:n.output,status:No,result:{},inputs:n.inputs,state:n.state})),u(new Error("Callback failed: the server did not respond."))},b=()=>{(()=>{var t=hi(r),e="".concat(Qr(r),"_dash-update-component"),n=d,o=(t,r)=>{var n="?";e.includes("?")&&(n="&"),e="".concat(e).concat(n).concat(t,"=").concat(r)};if(c||s){c&&o("cacheKey",c),s&&o("job",s);for(var a=JSON.parse(n),i=0;i{var e=yu(t,2),r=e[0],n=e[1];return o(r,n)}),h=h.filter(t=>{var e=yu(t,3);return e[0],e[1],!e[2]})),fetch(e,go(r.fetch,{method:"POST",headers:t,body:n}))})().then(y,v)};b()})}function Yu(t,e,r,n,o){return Qu.apply(this,arguments)}function Qu(){return Qu=hu(fu().m(function t(e,r,n,o,a){var i,u,c,s,l,f,p,d,h,y,v,b,m,g;return fu().w(function(t){for(;;)switch(t.p=t.n){case 0:return r.request_pre&&r.request_pre(o),i=Date.now(),a&&(e(Vu(a.running,o)),u=a.runningOff),c=uu(),t.p=1,t.n=2,c.ensureConnected(n);case 2:return t.n=3,c.sendCallback(o);case 3:if(s=t.v,u&&e(Vu(u,o)),"prevent_update"!==s.status){t.n=4;break}return n.ui&&(l=Date.now()-i,e(Mu({id:o.output,usage:{__dash_server:l,__dash_client:l,__dash_upload:0,__dash_download:0},status:Do,result:{},inputs:o.inputs,state:o.state}))),t.a(2,{});case 4:if("error"!==s.status){t.n=5;break}throw new Error(s.message||"Callback error");case 5:return null!=(f=s.data)&&f.sideUpdate&&e(Vu(f.sideUpdate,o)),h=(d=f||{}).multi,y=d.response,r.request_post&&r.request_post(o,y),h?p=y:(v=o.output,b=v.substr(0,v.lastIndexOf(".")),p={[b]:null==y?void 0:y.props}),n.ui&&(m=Date.now()-i,e(Mu({id:o.output,usage:{__dash_server:m,__dash_client:m,__dash_upload:0,__dash_download:0},status:Ro,result:p||{},inputs:o.inputs,state:o.state}))),t.a(2,p||{});case 6:throw t.p=6,g=t.v,u&&e(Vu(u,o)),n.ui&&e(Mu({id:o.output,status:No,result:{},inputs:o.inputs,state:o.state})),g;case 7:return t.a(2)}},t,null,[[1,6]])})),Qu.apply(this,arguments)}function Xu(t){if(!t)return{};for(var e={},r=0;r{var n=yu(Gu(o,_e(wa(["id","property"]),e),t.callback.outputs[r],t.anyVals,"Output"),2),a=n[0],i=n[1];m.push(a),i&&g.push(i)}),g.length)return he(b).length&&Fu(g,o),mu(mu({},t),{},{executionPromise:null});var w=function(){var i=hu(fu().m(function i(){var s,l,p,g,w,O,_,j,E,S,P,A,k,T,x,C,I;return fu().w(function(i){for(;;)switch(i.p=i.n){case 0:if(s=he(m).map(t=>{var e;return{path:rn(o,t.id),property:null===(e=t.property)||void 0===e?void 0:e.split("@")[0],id:_n(t.id)}}),u(zi(s)),i.p=1,l=Pt(t.changedPropIds),p=l.map(t=>t.startsWith("{")?$i(t)[0]:t),g={output:f,outputs:pn(f)?m:m[0],inputs:b,changedPropIds:l,parsedChangedPropsIds:p,state:t.callback.state.length?Bu(o,a,t,d,"State"):void 0},!h){i.n=5;break}return i.p=2,i.n=3,Wu(u,h,e,g);case 3:return w=i.v,O=c().layout,he(m).forEach(t=>{var e=Ju(t.property),r=rn(o,t.id),n=[_n(t.id),e],a=Vt(n,w);if(void 0!==a){var i=Vt(r.concat(["props"]),O)||{},u=Ii({[e]:a},i);w=Ht(n,u[e],w)}}),i.a(2,{data:w,payload:g});case 4:return i.p=4,C=i.v,i.a(2,{error:C,payload:g});case 5:_=e,j=null,S=[],P=JSON.stringify(g.outputs),br(c().callbackJobs).forEach(e=>{P===e.output&&(S.push(["oldJob",e.jobId,!0]),u(qu({jobId:e.jobId}))),e.cancelInputs&&vr(e.cancelInputs,t.callback.inputs).length&&(S.push(["cancelJob",e.jobId]),e.progressDefault&&u(Vu(e.progressDefault,g)))}),A=!y&&(cu(e)||t.callback.websocket&&su(e)),k=fu().m(function a(){var i,s,l,f,p;return fu().w(function(a){for(;;)switch(a.p=a.n){case 0:if(a.p=0,!A){a.n=2;break}return a.n=1,Yu(u,r,_,g,t.callback.running);case 1:i=a.v,a.n=4;break;case 2:return a.n=3,Ku(u,r,_,g,y,S.length?S:void 0,c,t.callback.running);case 3:i=a.v;case 4:return j&&u(ri(j)),s=c().layout,he(m).forEach(t=>{var e=Ju(t.property),r=rn(o,t.id),n=[_n(t.id),e],a=Vt(n,i);if(void 0!==a){var u=Vt(r.concat(["props"]),s)||{},c=Ii({[e]:a},u);i=Ht(n,c[e],i)}}),v&&setTimeout(()=>u((t,e)=>{(0,n.unstable_batchedUpdates)(()=>{var r=e().graphs;t(ni(Gi(Gi({},r),{},{reset:!0}))),t(Li("_dash-dependencies","GET","dependenciesRequest"))})}),0),a.a(2,{v:{data:i,payload:g}});case 5:if(a.p=5,p=a.v,E=p,!(x<=1)||401!==p.status&&400!==p.status){a.n=8;break}return a.n=6,p.text();case 6:if(!a.v.includes(Io)){a.n=8;break}if(null===r.request_refresh_jwt){a.n=8;break}return l=null,e.fetch.headers.Authorization&&(l=e.fetch.headers.Authorization.substr(7)),a.n=7,r.request_refresh_jwt(l);case 7:if(!(f=a.v)){a.n=8;break}return j={Authorization:"Bearer ".concat(f)},_=go(e,{fetch:{headers:j}}),a.a(2,0);case 8:return a.a(2,1)}},a,null,[[0,5]])}),x=0;case 6:if(!(x<=1)){i.n=11;break}return i.d(lu(k()),7);case 7:if(0!==(T=i.v)){i.n=8;break}return i.a(3,10);case 8:if(1!==T){i.n=9;break}return i.a(3,11);case 9:if(!T){i.n=10;break}return i.a(2,T.v);case 10:x++,i.n=6;break;case 11:return i.a(2,{error:E,payload:null});case 12:return i.p=12,I=i.v,i.a(2,{error:I,payload:null});case 13:return i.p=13,u(Vi(s)),i.f(13);case 14:return i.a(2)}},i,null,[[2,4],[1,12,13,14]])}));return function(){return i.apply(this,arguments)}}();return mu(mu({},t),{},{executionPromise:w()})}catch(e){return mu(mu({},t),{},{executionPromise:{error:e,payload:null}})}}function ec(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function rc(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);r{var e=t.dispatch,r=t.getState,n=r().callbacks.executed;var o=[],a=[];n.forEach(t=>{var n,i=Be(null!==(n=t.predecessors)&&void 0!==n?n:[],[t.callback]),u=t.callback,c=u.clientside_function,s=u.output,l=t.executionResult;if(!Ft(l)){var f=l.data,p=l.error,d=l.payload;if(void 0!==f&&(Object.entries(f).forEach(t=>{var n=oc(t,2),a=n[0],u=n[1],c=On(a),s=r(),l=s.graphs,f=s.layout,p=s.paths,d=function(t,n){var o=r(),a=o.layout,i=rn(o.paths,t);if(!i)return!1;n=function(t,e,r){var n=Wa(t),o=n.canPersist,a=n.id,i=n.props,u=n.persistence,c=n.persisted_props,s=n.persistence_type,l=n.element,f=(t,r)=>t in e?e[t]:r,p=f("persistence",u);if(!o||!u&&!p)return e;var d=f("persistence_type",s),h=f("persisted_props",c),y=p!==u||d!==s||h!==c,v=t=>!(t.split(".")[0]in e),b={},m=i;if(y&&u){var g=Fa(s,r);zt(t=>Va(Ja(a,t,u),g,l,i,t,b,!0),fe(v,c)),m=Tr(i,b)}if(p&&y){var w=Fa(d,r);zt(t=>Va(Ja(a,t,p),w,l,m,t,b),fe(v,h))}return y?Tr(e,b):e}(Vt(i,a),n,e);var u=za({props:n},e).props;return e(fi({itempath:i,props:u,source:"response",renderType:"callback"})),u}(c,u);o=Be(o,he(_e(t=>Vn(l,p,c,t,!0),Pt(u))).map(t=>rc(rc({},t),{},{predecessors:i})));var h=rn(p,c);if(h){var y=Vt(h,f),v=Gt("defaultValue",[y.namespace,y.type],window.__dashprivate_childrenProps),b=function(t,n,a){var u=arguments.length>3&&void 0!==arguments[3]&&arguments[3],c=en(t,a,r().paths);e(ii(c)),o=Be(o,Qn(l,c,t,{chunkPath:a,filterRoot:u}).map(t=>rc(rc({},t),{},{predecessors:i}))),o=Be(o,Qn(l,p,n,{removedArrayInputsOnly:!0,newPaths:c,chunkPath:a,filterRoot:u}).map(t=>rc(rc({},t),{},{predecessors:i})))},m=!1;["children"].concat(v).forEach(t=>{if(!m)if(t.includes("[]")){var e=oc(t.split("[]").map(t=>t.split(".").filter(t=>t)),1)[0];if(!Vt(e,d))return;b(rc(rc({},y),{},{props:rc(rc({},y.props),d)}),y,h,Pt(d)),m=!0}else{var r=t.split("."),n=Vt(r,d);if(!n)return;var o=Be(rn(p,c),["props"].concat(r)),a=Vt(o,f);b(n,a,o)}});var g=er((t,e)=>!(e in u),d);if(!Qt(g)){var w=r(),O=w.graphs,_=w.paths;o=Be(o,Zn(a,g,O,_).map(t=>rc(rc({},t),{},{predecessors:i})))}}}),a.push(rc(rc({},t),{},{executionMeta:{allProps:_e(zn,he(t.getOutputs(r().paths))),updatedProps:he(_e(t=>{var e=oc(t,2),r=e[0],n=e[1];return _e(t=>zn({id:r,property:t}),Pt(n))},ga(f)))}}))),void 0!==p){var h;if(t.callback.no_output){var y=Pt(t.changedPropIds).join(", ");h="Callback error with no output from input ".concat(y)}else{var v=d?_e(zn,he([d.outputs])).join(", "):s;h="Callback error updating ".concat(v)}if(c){var b=c.namespace,m=c.function_name;h+=" via clientside function ".concat(b,".").concat(m)}wi(p,h,e),a.push(rc(rc({},t),{},{executionMeta:{allProps:_e(zn,he(t.getOutputs(r().paths))),updatedProps:[]}}))}}}),e(Nu([n.length?ku(n):null,n.length?Ou(n.length):null,a.length?Pu(a):null,o.length?Su(o):null]))},inputs:["callbacks.executed"]},uc=ic;function cc(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function a(r,n,o,a){var c=n&&n.prototype instanceof u?n:u,s=Object.create(c.prototype);return sc(s,"_invoke",function(r,n,o){var a,u,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:d,f:d.bind(t,4),d:function(e,r){return a=e,u=0,c=t,p.n=r,i}};function d(r,n){for(u=r,c=n,e=0;!f&&s&&!o&&e3?(o=h===n)&&(c=a[(u=a[4])?5:(u=3,3)],a[4]=a[5]=t):a[0]<=d&&((o=r<2&&dn||n>h)&&(a[4]=r,a[5]=n,p.n=h,u=0))}if(o||r>1)return i;throw f=!0,n}return function(o,l,h){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,h),u=l,c=h;(e=u<2?t:c)||!f;){a||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,a){if(u||(o="next"),e=a[o]){if(!(e=e.call(a,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=a.return)&&e.call(a),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);a=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==i)break}catch(e){a=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,a),!0),s}var i={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(sc(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,sc(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,sc(f,"constructor",s),sc(s,"constructor",c),c.displayName="GeneratorFunction",sc(s,o,"GeneratorFunction"),sc(f),sc(f,o,"Generator"),sc(f,n,function(){return this}),sc(f,"toString",function(){return"[object Generator]"}),(cc=function(){return{w:a,m:p}})()}function sc(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}sc=function(t,e,r,n){function a(e,r){sc(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(a("next",0),a("throw",1),a("return",2))},sc(t,e,r,n)}function lc(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function fc(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);r{var e,r,n=t.dispatch,o=t.getState,a=o().callbacks.executing,i=(e=Qe(t=>t.executionPromise instanceof Promise,a),r=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,a,i,u=[],c=!0,s=!1;try{if(a=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=a.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(s)throw o}}return u}}(e,r)||function(t,e){if(t){if("string"==typeof t)return hc(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?hc(t,e):void 0}}(e,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),u=i[0],c=i[1];n(Nu([a.length?xu(a):null,u.length?Au(u):null,c.length?_u(c.map(t=>$t("executionResult",t.executionPromise,t))):null])),u.forEach(function(){var t,e=(t=cc().m(function t(e){var r,a,i,u,c,s;return cc().w(function(t){for(;;)switch(t.n){case 0:return t.n=1,e.executionPromise;case 1:if(r=t.v,a=o(),i=a.callbacks.watched,u=a.appLifecycle,c=a.hooks.callback_resolved,u===ao("HYDRATED")){t.n=2;break}return t.a(2);case 2:if(c&&c(e.callback,r),s=$r(t=>t===e||t.executionPromise===e.executionPromise,i)){t.n=3;break}return t.a(2);case 3:n(Nu([Du([s]),_u([fc(fc({},s),{},{executionResult:r})])]));case 4:return t.a(2)}},t)}),function(){var e=this,r=arguments;return new Promise(function(n,o){var a=t.apply(e,r);function i(t){dc(a,n,o,i,u,"next",t)}function u(t){dc(a,n,o,i,u,"throw",t)}i(void 0)})});return function(t){return e.apply(this,arguments)}}())},inputs:["callbacks.executing"]},vc=yt(function(t,e){for(var r={},n={},o=0,a=t.length;oArray().concat(...br(vc(["stored","completed"],t))),mc=Pa(To.Set),gc={observer:t=>{var e=t.dispatch,r=(0,t.getState)(),n=r.callbacks,o=r.isLoading,a=bc(n).filter(t=>!t.callback.persistent),i=Boolean(a.length);o!==i&&e(mc(i))},inputs:["callbacks"]},wc=gc,Oc=yt(function(t,e){return Array.prototype.slice.call(e,0).sort(t)}),_c=r(296),jc=(t,e,r)=>{if(!r.length)return!0;var n=[],o=e.events,a=new Promise(t=>{o.once("rendered",t)});return r.forEach(r=>{var o=rn(e,r);if(o){var i=Vt(o,t);if(i){var u=nn(i),c=(0,_c.isReady)(u);c&&"function"==typeof c.then&&n.push(Promise.race([c,a.then(()=>document.getElementById(_n(r))&&c)]))}}}),!n.length||Promise.all(n)};function Ec(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function a(r,n,o,a){var c=n&&n.prototype instanceof u?n:u,s=Object.create(c.prototype);return Sc(s,"_invoke",function(r,n,o){var a,u,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:d,f:d.bind(t,4),d:function(e,r){return a=e,u=0,c=t,p.n=r,i}};function d(r,n){for(u=r,c=n,e=0;!f&&s&&!o&&e3?(o=h===n)&&(c=a[(u=a[4])?5:(u=3,3)],a[4]=a[5]=t):a[0]<=d&&((o=r<2&&dn||n>h)&&(a[4]=r,a[5]=n,p.n=h,u=0))}if(o||r>1)return i;throw f=!0,n}return function(o,l,h){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,h),u=l,c=h;(e=u<2?t:c)||!f;){a||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,a){if(u||(o="next"),e=a[o]){if(!(e=e.call(a,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=a.return)&&e.call(a),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);a=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==i)break}catch(e){a=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,a),!0),s}var i={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(Sc(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,Sc(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,Sc(f,"constructor",s),Sc(s,"constructor",c),c.displayName="GeneratorFunction",Sc(s,o,"GeneratorFunction"),Sc(f),Sc(f,o,"Generator"),Sc(f,n,function(){return this}),Sc(f,"toString",function(){return"[object Generator]"}),(Ec=function(){return{w:a,m:p}})()}function Sc(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}Sc=function(t,e,r,n){function a(e,r){Sc(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(a("next",0),a("throw",1),a("return",2))},Sc(t,e,r,n)}function Pc(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function Ac(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);r{var r,n;return(null!==(r=t.priority)&&void 0!==r?r:"")>(null!==(n=e.priority)&&void 0!==n?n:"")?-1:1},Dc=(t,e)=>{var r=(0,t.getOutputs)(e),n=he(r),o=[],a={};return n.forEach(t=>{var e=t.id,r=t.property,n=_n(e);(a[n]=a[n]||[]).push(r),o.push(zn({id:n,property:r}))}),{allOutputs:r,allPropIds:o}},Nc=(t,e)=>{var r=[...he(t.getInputs(e)),...he(t.getState(e))],n=new Map(r.map(t=>[_n(t.id),t]));return Array.from(n.values())},Mc={observer:function(){var t=Ic(Ec().m(function t(e){var r,n,o,a,i,u,c,s,l,f,p,d,h,y,v,b,m,g,w,O,_;return Ec().w(function(t){for(;;)switch(t.n){case 0:if(r=e.dispatch,n=e.getState,o=n(),a=o.callbacks,i=a.executing,u=a.watched,c=o.config,s=o.hooks,l=o.layout,f=o.paths,p=o.appLifecycle,d=n(),h=d.callbacks.prioritized,p===ao("HYDRATED")){t.n=1;break}return t.a(2);case 1:y=Math.max(0,12-i.length-u.length),h=Oc(Rc,h),v=Qe(t=>!0===jc(l,f,Nc(t,f)),h),b=Tc(v,2),m=b[0],g=b[1],w=m.slice(0,y),O=g.slice(0,y-w.length),w.length&&r(Nu([Cu(w),ju(_e(t=>tc(t,c,s,f,l,Dc(t,f),r,n),w))])),O.length&&(_=_e(t=>Ac(Ac(Ac({},t),Dc(t,f)),{},{isReady:jc(l,f,Nc(t,f))}),O),r(Nu([Cu(O),wu(_)])),_.forEach(function(){var t=Ic(Ec().m(function t(e){var o,a,i;return Ec().w(function(t){for(;;)switch(t.n){case 0:return t.n=1,e.isReady;case 1:if(o=n(),a=o.callbacks.blocked,$r(t=>t===e||t.isReady===e.isReady,a)){t.n=2;break}return t.a(2);case 2:i=tc(e,c,s,f,l,e,r,n),r(Nu([Tu([e]),ju([i])]));case 3:return t.a(2)}},t)}));return function(e){return t.apply(this,arguments)}}()));case 2:return t.a(2)}},t)}));return function(e){return t.apply(this,arguments)}}(),inputs:["callbacks.prioritized","callbacks.completed"]},Uc=Mc,Lc=function(){function t(t,e,r,n){this.valueFn=t,this.valueAcc=e,this.keyFn=r,this.xf=n,this.inputs={}}return t.prototype["@@transducer/init"]=ue,t.prototype["@@transducer/result"]=function(t){var e;for(e in this.inputs)if(mt(e,this.inputs)&&(t=this.xf["@@transducer/step"](t,this.inputs[e]))["@@transducer/reduced"]){t=t["@@transducer/value"];break}return this.inputs=null,this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,e){var r=this.keyFn(e);return this.inputs[r]=this.inputs[r]||[r,ko(this.valueAcc,!1)],this.inputs[r][1]=this.valueFn(this.inputs[r][1],e),t},t}();function qc(t,e,r){return function(n){return new Lc(t,e,r,n)}}var Gc=yt(Jt("groupBy",me(4,[],ae([],qc,function(t,e,r,n){var o=Ie(function(n,o){var a=r(o),i=t(mt(a,n)?n[a]:ko(e,!1),o);return i&&i["@@transducer/reduced"]?Fe(n):(n[a]=i,n)});return xe(o,{},n)}))(function(t,e){return t.push(e),t},[]))),Bc=yt(function(t,e){return kr({},e,t)});function Fc(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function a(r,n,o,a){var c=n&&n.prototype instanceof u?n:u,s=Object.create(c.prototype);return Hc(s,"_invoke",function(r,n,o){var a,u,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:d,f:d.bind(t,4),d:function(e,r){return a=e,u=0,c=t,p.n=r,i}};function d(r,n){for(u=r,c=n,e=0;!f&&s&&!o&&e3?(o=h===n)&&(c=a[(u=a[4])?5:(u=3,3)],a[4]=a[5]=t):a[0]<=d&&((o=r<2&&dn||n>h)&&(a[4]=r,a[5]=n,p.n=h,u=0))}if(o||r>1)return i;throw f=!0,n}return function(o,l,h){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,h),u=l,c=h;(e=u<2?t:c)||!f;){a||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,a){if(u||(o="next"),e=a[o]){if(!(e=e.call(a,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=a.return)&&e.call(a),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);a=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==i)break}catch(e){a=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,a),!0),s}var i={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(Hc(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,Hc(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,Hc(f,"constructor",s),Hc(s,"constructor",c),c.displayName="GeneratorFunction",Hc(s,o,"GeneratorFunction"),Hc(f),Hc(f,o,"Generator"),Hc(f,n,function(){return this}),Hc(f,"toString",function(){return"[object Generator]"}),(Fc=function(){return{w:a,m:p}})()}function Hc(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}Hc=function(t,e,r,n){function a(e,r){Hc(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(a("next",0),a("throw",1),a("return",2))},Hc(t,e,r,n)}function $c(t,e,r,n,o,a,i){try{var u=t[a](i),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}var Jc=function(){var t,e=(t=Fc().m(function t(e){var r,n;return Fc().w(function(t){for(;;)if(0===t.n)return n=new Promise(t=>r=t),setTimeout(r,e),t.a(2,n)},t)}),function(){var e=this,r=arguments;return new Promise(function(n,o){var a=t.apply(e,r);function i(t){$c(a,n,o,i,u,"next",t)}function u(t){$c(a,n,o,i,u,"throw",t)}i(void 0)})});return function(t){return e.apply(this,arguments)}}();function Wc(t){if(null!=t){var e=t["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],r=0;if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length))return{next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}}}throw new TypeError(typeof t+" is not iterable")}function zc(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function a(r,n,o,a){var c=n&&n.prototype instanceof u?n:u,s=Object.create(c.prototype);return Vc(s,"_invoke",function(r,n,o){var a,u,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:d,f:d.bind(t,4),d:function(e,r){return a=e,u=0,c=t,p.n=r,i}};function d(r,n){for(u=r,c=n,e=0;!f&&s&&!o&&e3?(o=h===n)&&(c=a[(u=a[4])?5:(u=3,3)],a[4]=a[5]=t):a[0]<=d&&((o=r<2&&dn||n>h)&&(a[4]=r,a[5]=n,p.n=h,u=0))}if(o||r>1)return i;throw f=!0,n}return function(o,l,h){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,h),u=l,c=h;(e=u<2?t:c)||!f;){a||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,a){if(u||(o="next"),e=a[o]){if(!(e=e.call(a,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=a.return)&&e.call(a),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);a=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==i)break}catch(e){a=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,a),!0),s}var i={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(Vc(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,Vc(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,Vc(f,"constructor",s),Vc(s,"constructor",c),c.displayName="GeneratorFunction",Vc(s,o,"GeneratorFunction"),Vc(f),Vc(f,o,"Generator"),Vc(f,n,function(){return this}),Vc(f,"toString",function(){return"[object Generator]"}),(zc=function(){return{w:a,m:p}})()}function Vc(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}Vc=function(t,e,r,n){function a(e,r){Vc(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(a("next",0),a("throw",1),a("return",2))},Vc(t,e,r,n)}function Kc(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function Yc(t){for(var e=1;e{var e;return Rt(t.callback,null!==(e=t.predecessors)&&void 0!==e?e:[])},y),y=tr(y,m),g=[],w=[],br(Gc(Xn,y)).forEach(t=>{if(1===t.length)w.push(t[0]);else{var e=t.find(t=>t.initialCall);e&&g.push(e);var r=t.filter(t=>t!==e);1===r.length?w.push(r[0]):(g=Be(g,r),w.push(Bc({changedPropIds:Re(ee(Math.max),{},Ve("changedPropIds",r)),executionGroup:fe(t=>Boolean(t),Ve("executionGroup",r)).slice(-1)[0]},r.slice(-1)[0])))}}),O=he(_e(t=>t.slice(0,-1),br(Gc(Xn,Be(u,y=w))))),_=he(_e(t=>t.slice(0,-1),br(Gc(Xn,Be(c,y))))),j=he(_e(t=>t.slice(0,-1),br(Gc(Xn,Be(s,y))))),E=he(_e(t=>t.slice(0,-1),br(Gc(Xn,Be(l,y))))),S=eo(y,p),P=S.added,A=S.removed,k=eo(u,p),T=k.added,x=k.removed,C=eo(c,p),I=C.added,R=C.removed,D=eo(s,p),N=D.added,M=D.removed,U=eo(l,p),L=U.added,q=U.removed,y=Be(tr(y,A),P),G=Yn(p,y,b,d),B=[],F=[],G.length||!y.length||y.length!==b.length){t.n=4;break}H=y.slice(0),$=zc().m(function t(){var e,r,n;return zc().w(function(t){for(;;)switch(t.n){case 0:e=H[0],G.push(e),H=H.slice(1),H=Yn(p,H,G),r=tr(H,H),n=fe(t=>!t.predecessors||!Rt(e.callback,t.predecessors),r),B=Be(B,n),F=Be(F,n.map(t=>{var r;return Yc(Yc({},t),{},{predecessors:Be(null!==(r=t.predecessors)&&void 0!==r?r:[],[e.callback])})}));case 1:return t.a(2)}},t)});case 2:if(!H.length){t.n=4;break}return t.d(Wc($()),3);case 3:t.n=2;break;case 4:y=Be(tr(y,B),F),J=Gc(t=>t.executionGroup,fe(t=>!Ft(t.executionGroup),f)),W=fe(t=>{if(!t.executionGroup||!J[t.executionGroup]||!J[t.executionGroup].length)return!1;var e=_e(zn,he(t.getInputs(p))),r=he(_e(t=>t.executionMeta.allProps,J[t.executionGroup])),n=he(_e(t=>t.executionMeta.updatedProps,J[t.executionGroup]));return Qt(vr(e,n))&&Qt(tr(e,r))&&!We(Nn,t.callback.inputs)},G),y=tr(y,W),G=tr(G,W),y=tr(y,G),z=tr(y,v),V=tr(v,y),r(Nu([z.length?Su(z):null,V.length?Iu(V):null,O.length?Cu(O):null,_.length?Tu(_):null,j.length?xu(j):null,E.length?Du(E):null,x.length?Cu(x):null,T.length?Eu(T):null,R.length?Tu(R):null,I.length?wu(I):null,M.length?xu(M):null,N.length?ju(N):null,q.length?Du(q):null,L.length?Au(L):null,G.length?Eu(G):null]));case 5:return t.a(2)}},t)}),function(){var e=this,r=arguments;return new Promise(function(n,o){var a=t.apply(e,r);function i(t){Xc(a,n,o,i,u,"next",t)}function u(t){Xc(a,n,o,i,u,"throw",t)}i(void 0)})});return function(t){return e.apply(this,arguments)}}(),inputs:["callbacks.requested","callbacks.completed"]},ts=Zc;function es(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,a,i,u=[],c=!0,s=!1;try{if(a=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=a.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(s)throw o}}return u}}(t,e)||function(t,e){if(t){if("string"==typeof t)return rs(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?rs(t,e):void 0}}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function rs(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r{var e=t.dispatch,r=t.getState,n=r().callbacks,o=bc(n),a=r().callbacks.stored,i=es(Qe(t=>Ft(t.executionGroup),a),2),u=i[0],c=i[1],s=Gc(t=>t.executionGroup,c),l=Gc(t=>t.executionGroup,fe(t=>!Ft(t.executionGroup),o)),f=Re((t,e)=>{var r=es(e,2),n=r[0],o=r[1];return l[n]?t:Be(t,o)},[],ga(s));e(Nu([u.length?Ru(u):null,f.length?Ru(f):null]))},inputs:["callbacks.stored","callbacks.completed"]},os=ns;function as(t,e,r){return(e=function(t){var e=function(t){if("object"!=typeof t||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}class is{constructor(){as(this,"__store",void 0),as(this,"storeObserver",new ya),as(this,"setObservers",tt(()=>{var t=this.storeObserver.observe;t(ma),t(wc),t(ts),t(Uc),t(yc),t(uc),t(os)})),as(this,"createAppStore",(t,e)=>{this.__store=st(t,e),this.storeObserver.setStore(this.__store);var r=window.dash_stores=window.dash_stores||[];r.includes(this.__store)||r.push(this.__store),this.setObservers()}),as(this,"initializeStore",t=>{if(this.__store&&!t)return this.__store;var e=function(){return function(t){return function(e,r){var n=e||{},o=n.history,a=n.config,i=n.hooks,u=e;return"RELOAD"===r.type?u={history:o,config:a,hooks:i}:"SET_CONFIG"===r.type&&(u={hooks:i}),t(u,r)}}((t=pa(),function(e,r){var n=r.type,o=r.payload;if("ON_PROP_CHANGE"===n){var a=da(o,e,!0);a&&!Qt(a.props)&&(e.history.present=a)}var i=t(e,r);if("ON_PROP_CHANGE"===n&&"response"!==o.source){var u=da(o,i);u&&!Qt(u.props)&&(i.history={past:[...i.history.past,e.history.present],present:u,future:[]})}return i}));var t}();return this.createAppStore(e,ft(ht)),t||(window.store=this.__store),this.__store}),this.__store=this.initializeStore()}get store(){return this.__store}}class us extends t.Component{constructor(t){super(t)}render(){return e().createElement("div",{id:"_dash-app-content"},this.props.children)}}us.propTypes={children:i().object};var cs=us,ss=["String","Number","Null","Boolean"],ls=t=>Rt(At(t),ss),fs=yt(function(t,e){return oe(function(r,n){return r[n]=t(e[n],n,e),r},{},Pt(e))}),ps=fs;class ds extends t.Component{constructor(t){super(t),this.state={myID:t.componentId,oldChildren:null,hasError:!1}}static getDerivedStateFromError(t){return{hasError:!0}}componentDidCatch(t,e){var r=this.props.dispatch;r(Za({myID:this.state.myID,type:"frontEnd",error:t,info:e})),r(bi)}componentDidUpdate(t,e){var r=t.children;this.state.hasError||r===e.oldChildren||r===this.props.children||this.setState({oldChildren:r})}render(){var t=this.state,e=t.hasError,r=t.oldChildren;return e?r:this.props.children}}ds.propTypes={children:i().object,componentId:i().string,error:i().object,dispatch:i().func};var hs=ds;function ys(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,a,i,u=[],c=!0,s=!1;try{if(a=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=a.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(s)throw o}}return u}}(t,e)||function(t,e){if(t){if("string"==typeof t)return vs(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?vs(t,e):void 0}}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function vs(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r4&&void 0!==arguments[4]?arguments[4]:null,a=[];for(var i in t)if(t.hasOwnProperty(i)){var u=void 0;try{"function"!=typeof t[i]?(u=Error((n||"React class")+": "+r+" type `"+i+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+typeof t[i]+"`.")).name="Invariant Violation":u=t[i](e,i,n,r,null,Os())}catch(t){u=t}if(!u||u instanceof Error||a.push((n||"React class")+": type specification of "+r+" `"+i+"` is invalid; the type checker function must return `null` or an `Error` but returned a "+typeof u+". You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument)."),u instanceof Error){var c=o&&o()||"";a.push("Failed "+r+" type: "+u.message+c)}}return a.join("\n\n")}(e.propTypes,r,"component prop",e);return a&&function(t,e,r){var n,o=t.split("`");if(Rt("is marked as required",t)){var a=o[1];n="".concat(a," in ").concat(r),e.id&&(n+=' with ID "'.concat(e.id,'"')),n+=" is required but it was not provided."}else if(Rt("Bad object",t))n=t.split("supplied to ")[0]+"supplied to ".concat(r)+".\nBad"+t.split(".\nBad")[1];else{if(!Rt("Invalid ",t)||!Rt(" supplied to ",t))throw new Error(t);var i=o[1];if(n="Invalid argument `".concat(i,"` passed into ").concat(r),e.id&&(n+=' with ID "'.concat(e.id,'"')),n+=".",Rt(", expected ",t)){var u=t.split(", expected ")[1];n+="\nExpected ".concat(u)}if(Rt(" of type `",t)){var c=t.split(" of type `")[1].split("`")[0];n+="\nWas supplied type `".concat(c,"`.")}if(Vr(i,e)){var s=JSON.stringify(e[i],null,2);s&&(Rt("\n",s)?n+="\nValue provided: \n".concat(s):n+="\nValue provided: ".concat(s))}}throw new Error(n)}(a,r,o.type),n}var js=e().createContext({});function Es(r){var n=r.children,o=r.componentPath,a=(0,t.useMemo)(()=>JSON.stringify(o),[o]),i=J(),u=(0,t.useCallback)(t=>{var e=t||{},r=e.extraPath,n=e.rawPath,u=e.filterFunc,c=[a];r?c=[JSON.stringify(Be(o,r))]:n&&(c=[JSON.stringify(n)]);var s=Gt([],c,i.getState().loading);return u?s.filter(u).length>0:s.length>0},[a]),c=(0,t.useCallback)(t=>{var e=t||{},r=e.filterFunc,n=e.extraPath,i=e.rawPath;return b(t=>{var e=[a];n?e=[JSON.stringify(Be(o,n))]:i&&(e=[JSON.stringify(i)]);var u=Gt([],e,t.loading);return r?u.filter(r).length>0:u.length>0})},[a]),s=(0,t.useMemo)(()=>({componentPath:o,isLoading:u,useLoading:c,useSelector:b,useStore:J,useDispatch:K}),[a]);return e().createElement(js.Provider,{value:s},n)}var Ss=["componentPath","_dashprivate_error","_passedComponent","_newRender"],Ps=["_dash_error"];function As(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function ks(t,e,r){return(e=function(t){var e=function(t){if("object"!=typeof t||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function Ts(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);re=>{var r,n,o=ca(t,e),a=ua(t);r="dashChildrenUpdate"in Gt({},[null==(n=o)?void 0:n.namespace,null==n?void 0:n.type],window)?function(t,e){var r,n=0,o={};return Object.entries(t.layoutHashes).forEach(t=>{var a=ys(t,2),i=a[0],u=a[1],c=((t,e)=>{var r=t.split(","),n=e.split(",");if(!n.every((t,e)=>r[e]===t))return[!1,[]];var o=r.slice(n.length);return[o.filter(t=>"props"===t).length<2,o]})(i,e),s=ys(c,2),l=s[0],f=s[1];if(l){var p=Gt({},[i],bs);n+=Gt(0,["hash"],u),p!==u&&(i!==e?(Object.assign(o,{[f[1]]:!0}),r="components"):(Object.assign(o,Gt({},["changedProps"],u)),r=Gt({},["renderType"],u)),bs[i]=u)}}),{hash:n,changedProps:o,renderType:r}}(e,a):e.layoutHashes[a];var i=0,u={},c="";return r&&(i=r.hash,u=r.changedProps,c=r.renderType),[o,null==o?void 0:o.props,i,u,c]})(u),ms),i=5,function(t){if(Array.isArray(t))return t}(a)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,a,i,u=[],c=!0,s=!1;try{if(a=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=a.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(s)throw o}}return u}}(a,i)||function(t,e){if(t){if("string"==typeof t)return Ts(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Ts(t,e):void 0}}(a,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),j=_[0],E=_[1],S=_[2],P=_[3],A=_[4];m=j,g=E,w=S,(0,t.useMemo)(()=>{l?(h.current=!0,w=0,y.current+=1,w in d.current&&delete d.current[w]):h.current=!1,v.current=u},[l]);var k,T=(0,t.useCallback)((t,n,o)=>{var a;return ls(m)?m:e().createElement(r,{key:null!=t&&null!==(a=t.props)&&void 0!==a&&a.id?_n(t.props.id):ua(n),_dashprivate_error:c,componentPath:n,_passedComponent:t,_newRender:o})},[]),x=(0,t.useCallback)((t,e,r)=>Array.isArray(t)?t.map((t,n)=>ia(t)?T(t,Be(u,["props",...e,n]),r):t):ia(t)?T(t,Be(u,["props",...e]),r):t,[u]),C=function(t){for(var e=1;e{var e=g.id,r=t._dash_error,o=xs(t,Ps);p((t,a)=>{var i=a(),u=i.graphs,c=ca(v.current,i);if(c){var s=c.props;if(s){var l=er((t,e)=>!xt(t,s[e]),o);if(r&&t(Za({type:"frontEnd",error:r})),!Qt(l)){var f=function(t,e,r){if(!(t&&r&&e.length))return[];if("string"==typeof t){var n=r.inputMap[t];return n?e.filter(t=>n[t]):[]}var o=Object.keys(t).sort(),a=ne(o,t),i=o.join(","),u=r.inputPatterns[i];return u?e.filter(t=>{var e=u[t];return e&&e.some(t=>Rn(o,a,t.values))}):[]}(e,Pt(l),u);(0,n.unstable_batchedUpdates)(()=>{f.length&&t(gi({id:e,props:wa(f,l)})),t(fi({props:l,itempath:v.current,renderType:"internal"}))})}}}})}},f);"dashRenderType"in Gt({},[null==(k=m)?void 0:k.namespace,null==k?void 0:k.type],window)&&(C.dashRenderType=h.current?"parent":P?A:"parent"),(0,t.useEffect)(()=>{l&&p(li({itempath:u}))},[l]);var I=null;return w in d.current&&!h.current&&(I=e().isValidElement(d.current[w])?d.current[w]:null),I||(I=(()=>{if(h.current&&(m=s,g=null==s?void 0:s.props),!m)return null;var t,r=nn(m),n=((t,e)=>{for(var r=Gt([],["children_props",null==t?void 0:t.namespace,null==t?void 0:t.type],O),n=Tr(ea("children",e),C),o=function(){var t=r[a],e=0;(t.split(".")[0].replace("[]","").replace("{}","")in P||h.current||!w)&&(e={});var o=(t,r)=>ps((t,n)=>x(t,[...r,n],e),t);if(t.includes(".")){var i,u,c=t.split(".");if(t.includes("[]")){var s,l=[],f=[],p=!1,d=!1;if(c.forEach(t=>{p?t.includes("{}")?(d=!0,f.push(t.replace("{}",""))):f.push(t):t.includes("[]")?(p=!0,t.includes("{}")?(d=!0,l.push(t.replace("{}","").replace("[]",""))):l.push(t.replace("[]",""))):t.includes("{}")?(d=!0,l.push(t.replace("{}",""))):l.push(t)}),void 0===(i=Vt(l,n))||null===(s=i)||void 0===s||!s.length)return 0;if(!Vt(f,i[0]))return 0;u=i.map((t,r)=>{var n,a=Be(l,Be([r],f));return n=d?f.length?o(Vt(f,t),a):o(t,a):x(Vt(f,t),a,e),Ht(f,n,t)}),c=l}else if(t.includes("{}")){for(var y=[],v=[],b=!1,m=[],g=0;gx(b?Vt(m,t):t,Be(v,b?Be([r],m):[r]),e),_),c=v)}else{if(void 0===(i=Vt(c,n)))return 0;u=x(i,c,e)}n=Ht(c,u,n)}else if(t.includes("{}")){var j=t.replace("{}",""),E=t.includes("[]");E&&(j=j.replace("[]",""));var S=n[j];if(void 0!==S)if(E)for(var A=0;A3?(o=h===n)&&(c=a[(u=a[4])?5:(u=3,3)],a[4]=a[5]=t):a[0]<=d&&((o=r<2&&dn||n>h)&&(a[4]=r,a[5]=n,p.n=h,u=0))}if(o||r>1)return i;throw f=!0,n}return function(o,l,h){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,h),u=l,c=h;(e=u<2?t:c)||!f;){a||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,a){if(u||(o="next"),e=a[o]){if(!(e=e.call(a,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=a.return)&&e.call(a),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);a=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==i)break}catch(e){a=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,a),!0),s}var i={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(Rs(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,Rs(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,Rs(f,"constructor",s),Rs(s,"constructor",c),c.displayName="GeneratorFunction",Rs(s,o,"GeneratorFunction"),Rs(f),Rs(f,o,"Generator"),Rs(f,n,function(){return this}),Rs(f,"toString",function(){return"[object Generator]"}),(Is=function(){return{w:a,m:p}})()}function Rs(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}Rs=function(t,e,r,n){function a(e,r){Rs(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(a("next",0),a("throw",1),a("return",2))},Rs(t,e,r,n)}function Ds(t,e,r,n,o,a,i){try{var u=t[a](i),c=u.value}catch(t){return void r(t)}u.done?e(c):Promise.resolve(c).then(n,o)}function Ns(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r{var n,o,a=r.appLifecycle,i=r.config,u=r.dependenciesRequest,c=r.error,s=r.layoutRequest,l=r.layout,f=(n=(0,t.useState)(!1),o=2,function(t){if(Array.isArray(t))return t}(n)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,a,i,u=[],c=!0,s=!1;try{if(a=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=a.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(s)throw o}}return u}}(n,o)||function(t,e){if(t){if("string"==typeof t)return Ns(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Ns(t,e):void 0}}(n,o)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),p=f[0],d=f[1],h=(0,t.useRef)(null);h.current||(h.current=new tn);var y,v=(0,t.useRef)(!1);return(0,t.useEffect)(Us.bind(null,r,h,d)),(0,t.useEffect)(()=>{var t;v.current&&(t=Is().m(function t(){return Is().w(function(t){for(;;)switch(t.n){case 0:return v.current=!1,t.n=1,Jc(0);case 1:h.current.emit("rendered");case 2:return t.a(2)}},t)}),function(){var e=this,r=arguments;return new Promise(function(n,o){var a=t.apply(e,r);function i(t){Ds(a,n,o,i,u,"next",t)}function u(t){Ds(a,n,o,i,u,"throw",t)}i(void 0)})})()}),(0,t.useEffect)(()=>{i.serve_locally?window._dashPlotlyJSURL="".concat(i.requests_pathname_prefix,"_dash-component-suites/plotly/package_data/plotly.min.js"):window._dashPlotlyJSURL=i.plotlyjs_url},[]),s.status&&!Rt(s.status,[Ro,"loading"])?y=i.ui?e().createElement("div",{dangerouslySetInnerHTML:{__html:s.content}}):e().createElement("div",{className:"_dash-error"},"Error loading layout"):p||u.status&&!Rt(u.status,[Ro,"loading"])?y=i.ui?e().createElement("div",{dangerouslySetInnerHTML:{__html:u.content}}):e().createElement("div",{className:"_dash-error"},"Error loading dependencies"):a===ao("HYDRATED")?(v.current=!0,y=e().createElement(e().Fragment,null,Array.isArray(l.components)?l.components.map((t,r)=>ls(t)?t:e().createElement(Cs,{_dashprivate_error:c,componentPath:["components",r],key:r})):e().createElement(Cs,{_dashprivate_error:c,componentPath:["components"]}))):y=e().createElement("div",{className:"_dash-loading"},"Loading..."),i&&!0===i.ui?e().createElement(cs,null,y):y};function Us(t,e,r){var o=t.appLifecycle,a=t.dependenciesRequest,i=t.dispatch,u=t.error,c=t.graphs,s=t.hooks,l=t.layout,f=t.layoutRequest,p=t.config;(0,n.unstable_batchedUpdates)(()=>{if(Qt(f))"function"==typeof s.layout_pre&&s.layout_pre(),i(Li("_dash-layout","GET","layoutRequest"));else if(f.status===Ro&&Qt(l.components)){"function"==typeof s.layout_post&&s.layout_post(f.content);var t=za(f.content,i);i(ii(en(t,["components"],null,e.current))),i(ai(t))}if(Qt(a)?i(Li("_dash-dependencies","GET","dependenciesRequest")):a.status===Ro&&(Qt(c)||c.reset)&&i(ni(Cn(a.content,pi(i),p))),a.status===Ro&&!Qt(c)&&f.status===Ro&&!Qt(l.components)&&o===ao("STARTED")){var n=!1;try{i((pi(i),function(t,e){!function(t,e){var r,n,o=t.config,a=t.graphs,i=t.layout,u=t.paths,c=!o.suppress_callback_exceptions;c&&o.validation_layout?(r=o.validation_layout,n=en(r,[],null,u.events)):(r=i,n=u);var s=a.outputMap,l=a.inputMap,f=a.outputPatterns,p=a.inputPatterns;function d(t){return"This ID was used in the callback(s) for Output(s):\n "+t.map(t=>t.outputs.map(zn).join(", ")).join("\n ")}function h(t,r,n){e("ID not found in layout",["Attempting to connect a callback ".concat(r," item to component:"),' "'.concat(_n(t),'"'),"but no components with that id exist in the layout.","","If you are assigning callbacks to components that are","generated by other callbacks (and therefore not in the","initial layout), you can suppress this exception by setting","`suppress_callback_exceptions=True`.",d(n)])}function y(t,n,o,a,i){var u=o.split("@")[0],c=Vt(n,r),s=nn(c);if(s&&s.propTypes&&!s.propTypes[u]){for(var l in s.propTypes){var f=l.length-1;if("*"===l.charAt(f)&&u.substr(0,f)===l.substr(0,f))return}var p=c.type,h=c.namespace;e("Invalid prop for this component",['Property "'.concat(u,'" was used with component ID:')," ".concat(JSON.stringify(t)),"in one of the ".concat(a," items of a callback."),"This ID is assigned to a ".concat(h,".").concat(p," component"),"in the layout, which does not support this property.",d(i)])}}function v(t,e,r,o){ro()(n)({id:t,property:e}).forEach(t=>{y(t.id,t.path,e,r,o)})}var b={};function m(t){var e=t.state,r=t.output;if(!b[r]){b[r]=1;var o="State";e.forEach(e=>{var r=e.id,a=e.property;if("string"==typeof r){var i=rn(n,r);i?y(r,i,a,o,[t]):c&&h(r,o,[t])}else vr([hn,yn],br(r)).length||v(r,a,o,[t])})}}function g(t,e,r){var o=function(o){var a=t[o],i=he(br(a));if(i.reduce((t,e)=>{if(!1===t||e.optional)return t;var r=Be(e.outputs,e.inputs,e.states).filter(t=>t.id===o);return!r.length||We(t=>t.allow_optional,r)},!0))return 1;var u=rn(n,o);if(u)for(var s in a){var l=a[s];y(o,u,s,e,l),r&&l.forEach(m)}else c&&h(o,e,i)};for(var a in t)o(a)}function w(t,e,r){for(var n in t){var o=t[n],a=function(t){o[t].forEach(n=>{var o=n.keys,a=n.values,i=n.callbacks;v(nr(o,a),t,e,i),r&&i.forEach(m)})};for(var i in o)a(i)}}g(s,"Output",!0),g(l,"Input"),w(f,"Output",!0),w(p,"Input")}(e(),pi(t)),function(t,e){var r=e(),n=r.graphs,o=r.paths,a=r.layout;try{n.MultiGraph.overallOrder()}catch(e){t(Za({type:"backEnd",error:{message:"Circular Dependencies",html:e.toString()}}))}var i=Qn(n,o,a.components,{outputsOnly:!0}),u=(n.callbacks||[]).reduce((t,e)=>{if(e.prevent_initial_call)return t;var r=e.noOutput,n=!e.noOutput&&0===e.inputs.length;if(!r&&!n)return t;var a=to(e,ro(),"");return a.initialCall=!0,r?(0===e.inputs.length||a.getInputs(o).some(t=>Array.isArray(t)?t.length>0:t))&&t.push(a):a.getOutputs(o).some(t=>Array.isArray(t)?t.length>0:t)&&t.push(a),t},[]);t(Su([...i,...u]))}(t,e),t(ti(ao("HYDRATED")))}))}catch(t){u.frontEnd.length||u.backEnd.length||i(Za({type:"backEnd",error:t})),n=!0}finally{r(n)}}})}Ms.propTypes={appLifecycle:i().oneOf([ao("STARTED"),ao("HYDRATED"),ao("DESTROYED")]),dispatch:i().func,dependenciesRequest:i().object,graphs:i().object,hooks:i().object,layoutRequest:i().object,layout:i().any,history:i().any,error:i().object,config:i().object};var Ls=F(t=>({appLifecycle:t.appLifecycle,dependenciesRequest:t.dependenciesRequest,hooks:t.hooks,layoutRequest:t.layoutRequest,layout:t.layout,graphs:t.graphs,history:t.history,error:t.error,config:t.config}),t=>({dispatch:t}))(Ms);function qs(t){return t.isLoading?e().createElement("div",{className:"_dash-loading-callback"}):null}qs.propTypes={isLoading:i().bool.isRequired};var Gs=F(t=>({isLoading:t.isLoading}))(qs),Bs=r(72),Fs=r.n(Bs),Hs=r(825),$s=r.n(Hs),Js=r(659),Ws=r.n(Js),zs=r(56),Vs=r.n(zs),Ks=r(540),Ys=r.n(Ks),Qs=r(113),Xs=r.n(Qs),Zs=r(217),tl={};function el(t){var r=t.dispatch,n=t.history,o=e().createElement("span",{key:"undoLink",className:"_dash-undo-redo-link",onClick:()=>r(vi)},e().createElement("div",{className:"_dash-icon-undo"},"↺"),e().createElement("div",{className:"_dash-undo-redo-label"},"undo")),a=e().createElement("span",{key:"redoLink",className:"_dash-undo-redo-link",onClick:()=>r(yi)},e().createElement("div",{className:"_dash-icon-redo"},"↻"),e().createElement("div",{className:"_dash-undo-redo-label"},"redo"));return e().createElement("div",{className:"_dash-undo-redo"},e().createElement("div",null,n.past.length>0?o:null,n.future.length>0?a:null))}tl.styleTagTransform=Xs(),tl.setAttributes=Vs(),tl.insert=Ws().bind(null,"head"),tl.domAPI=$s(),tl.insertStyleElement=Ys(),Fs()(Zs.A,tl),Zs.A&&Zs.A.locals&&Zs.A.locals,el.propTypes={history:i().object,dispatch:i().func};var rl=F(t=>({history:t.history}),t=>({dispatch:t}))(el),nl=X(function(t){return function(e,r){return t(e,r)?-1:t(r,e)?1:0}}),ol=yt(function(t,e){return tt.length)&&(e=t.length);for(var r=0,n=Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,i=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return i=t.done,t},e:function(t){u=!0,a=t},f:function(){try{i||null==r.return||r.return()}finally{if(u)throw a}}}}(r.content.files);try{for(i.s();!(o=i.n()).done;){var u=o.value;if(!u.is_css){a=!1;break}a=!0;for(var c=[],s=document.evaluate('//link[contains(@href, "'.concat(u.url,'")]'),this._head),l=s.iterateNext();l;)c.push(l),l=s.iterateNext();if(zt(t=>t.setAttribute("disabled","disabled"),c),u.modified>0){var f=document.createElement("link");f.href="".concat(u.url,"?m=").concat(u.modified),f.type="text/css",f.rel="stylesheet",this._head.appendChild(f)}}}catch(t){i.e(t)}finally{i.f()}a||window.location.reload()}else null!==this.state.intervalId&&500===r.status&&(this._retry>this.state.max_retry&&(this.clearInterval(),window.alert("Hot reloading is disabled after failing ".concat(this._retry," times. ")+"Please check your application for errors, then refresh the page.")),this._retry++)}componentDidMount(){var t=this.props,e=t.dispatch,r=t.reloadRequest,n=this.state,o=n.disabled,a=n.interval;if(!o&&!this.state.intervalId){var i=window.setInterval(()=>{"loading"!==r.status&&e(Li("_reload-hash","GET","reloadRequest"))},a);this.setState({intervalId:i})}}componentWillUnmount(){!this.state.disabled&&this.state.intervalId&&this.clearInterval()}render(){return null}}il.defaultProps={},il.propTypes={id:i().string,config:i().object,reloadRequest:i().object,dispatch:i().func,interval:i().number};var ul=F(t=>({config:t.config,reloadRequest:t.reloadRequest}),t=>({dispatch:t}))(il);function cl(){var t=document.getElementById("_dash-config");return JSON.parse(null!=t&&t.textContent?null==t?void 0:t.textContent:"{}")}var sl=yt(function(t,e){var r={};return Y(e.length,function(){var n=t.apply(this,arguments);return mt(n,r)||(r[n]=e.apply(this,arguments)),r[n]})}),ll=sl;function fl(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function pl(t){for(var e=1;e({history:t.history,config:t.config}),t=>({dispatch:t}))(hl);function vl(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function a(r,n,o,a){var c=n&&n.prototype instanceof u?n:u,s=Object.create(c.prototype);return bl(s,"_invoke",function(r,n,o){var a,u,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:d,f:d.bind(t,4),d:function(e,r){return a=e,u=0,c=t,p.n=r,i}};function d(r,n){for(u=r,c=n,e=0;!f&&s&&!o&&e3?(o=h===n)&&(c=a[(u=a[4])?5:(u=3,3)],a[4]=a[5]=t):a[0]<=d&&((o=r<2&&dn||n>h)&&(a[4]=r,a[5]=n,p.n=h,u=0))}if(o||r>1)return i;throw f=!0,n}return function(o,l,h){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&d(l,h),u=l,c=h;(e=u<2?t:c)||!f;){a||(u?u<3?(u>1&&(p.n=-1),d(u,c)):p.n=c:p.v=c);try{if(s=2,a){if(u||(o="next"),e=a[o]){if(!(e=e.call(a,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,u<2&&(u=0)}else 1===u&&(e=a.return)&&e.call(a),u<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),u=1);a=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==i)break}catch(e){a=t,u=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,a),!0),s}var i={};function u(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(bl(e={},n,function(){return this}),e),f=s.prototype=u.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,bl(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,bl(f,"constructor",s),bl(s,"constructor",c),c.displayName="GeneratorFunction",bl(s,o,"GeneratorFunction"),bl(f),bl(f,o,"Generator"),bl(f,n,function(){return this}),bl(f,"toString",function(){return"[object Generator]"}),(vl=function(){return{w:a,m:p}})()}function bl(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}bl=function(t,e,r,n){function a(e,r){bl(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(a("next",0),a("throw",1),a("return",2))},bl(t,e,r,n)}function ml(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return gl(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?gl(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,i=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return i=t.done,t},e:function(t){u=!0,a=t},f:function(){try{i||null==r.return||r.return()}finally{if(u)throw a}}}}function gl(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r{var r=t.componentId,n=t.props,o=El(r),a=e.getState(),i=rn(a.paths,o);if(i){var u=Vt(i,a.layout),c=(null==u?void 0:u.props)||{},s=Ii(n,c);if(e.dispatch(fi({props:s,itempath:i,renderType:"websocket"})),e.dispatch(gi({id:o,props:s})),u){var l=e.getState();e.dispatch(ii(en(Ol(Ol({},u),{},{props:Ol(Ol({},c),s)}),[...i],l.paths,l.paths.events)))}}else console.warn("SET_PROPS: Component ".concat(r," not found in layout"))},i.onSetProps=u,i.onSetPropsBatch=t=>{(0,n.unstable_batchedUpdates)(()=>{var e,r=ml(t);try{for(r.s();!(e=r.n()).done;){var n=e.value;u(n)}}catch(t){r.e(t)}finally{r.f()}})},i.onGetPropsRequest=(t,r)=>{var n=r.componentId,o=r.properties,a=El(n),u=e.getState(),c=rn(u.paths,a),s={};if(c){var l=Vt([...c,"props"],u.layout);if(l){var f,p=ml(o);try{for(p.s();!(f=p.n()).done;){var d=f.value;s[d]=l[d]}}catch(t){p.e(t)}finally{p.f()}}}else console.warn("GET_PROPS_REQUEST: Component ".concat(n," not found in layout"));i.sendGetPropsResponse(t,s)},c=!1,i.onConnected=()=>{if(console.log("[Dash] WebSocket connected"),c){console.log("[Dash] Reconnected - re-triggering persistent callbacks");var t=e.getState().graphs;if(null!=t&&t.callbacks){var r=t.callbacks.reduce((t,e)=>{if(e.noOutput&&0===e.inputs.length){var r=to(e,ro(),"");r.initialCall=!0,t.push(r)}return t},[]);r.length>0&&(console.log("[Dash] Re-triggering ".concat(r.length," persistent callback(s)")),e.dispatch(Su(r)))}}},i.onDisconnected=t=>{console.log("[Dash] WebSocket disconnected: ".concat(t)),c=!0},i.onError=(t,e)=>{console.error("[Dash] WebSocket error: ".concat(t),e)},s=Pl(r),t.p=3,t.n=4,i.connect(r.websocket.worker_url,s,r.websocket.inactivity_timeout);case 4:t.n=6;break;case 5:t.p=5,l=t.v,console.error("[Dash] Failed to connect to WebSocket worker:",l);case 6:document.addEventListener("visibilitychange",()=>{"visible"===document.visibilityState&&(i.connected?i.notifyTabVisible():(console.log("[Dash] Tab visible, reconnecting WebSocket..."),i.ensureConnected(r).catch(t=>console.error("[Dash] Failed to reconnect:",t))))});case 7:return t.a(2)}},t,null,[[3,5]])}),Sl=function(){var e=this,r=arguments;return new Promise(function(n,o){var a=t.apply(e,r);function i(t){jl(a,n,o,i,u,"next",t)}function u(t){jl(a,n,o,i,u,"throw",t)}i(void 0)})},Sl.apply(this,arguments)}function Pl(t){var e;if(null===(e=t.websocket)||void 0===e||!e.url)throw new Error("WebSocket URL not configured");var r="https:"===window.location.protocol?"wss:":"ws:",n=window.location.host;return"".concat(r,"//").concat(n).concat(t.websocket.url)}function Al(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function kl(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);r{var n,o,a=r.hooks,i=void 0===a?{layout_pre:null,layout_post:null,request_pre:null,request_post:null,callback_resolved:null,request_refresh_jwt:null}:a,u=(n=(0,t.useState)(()=>new is),o=1,function(t){if(Array.isArray(t))return t}(n)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,a,i,u=[],c=!0,s=!1;try{if(a=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=a.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(s)throw o}}return u}}(n,o)||function(t,e){if(t){if("string"==typeof t)return xl(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?xl(t,e):void 0}}(n,o)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0].store;return(0,t.useEffect)(()=>{var t,e,r,n=cl();if(null!==(t=n.websocket)&&void 0!==t&&t.enabled||null!==(e=n.websocket)&&void 0!==e&&e.url&&null!==(r=n.websocket)&&void 0!==r&&r.worker_url){var o=kl(kl({},n),{},{fetch:{credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}}});!function(t,e){Sl.apply(this,arguments)}(u,o)}return()=>{uu().disconnect()}},[u]),e().createElement(H,{store:u},e().createElement(yl,{hooks:i}))};Cl.propTypes={hooks:i().shape({layout_pre:i().func,layout_post:i().func,request_pre:i().func,request_post:i().func,callback_resolved:i().func,request_refresh_jwt:i().func})};var Il=Cl;function Rl(){return window.dash_stores=window.dash_stores||[]}function Dl(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r(0,t.useContext)(Nl);function Ul(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function Ll(t){for(var e=1;e{var t;return l((t={component:i,componentPath:u},(e,r)=>{var n=r().paths;e(ui(t)),e(ii(en(t.component,t.componentPath,n)))})),d(!0),()=>{s&&l(ci({componentPath:u}))}},[]),(0,t.useEffect)(()=>{(0,n.unstable_batchedUpdates)(()=>{l(fi({itempath:u,props:i.props})),i.props.id&&l(gi({id:i.props.id,props:i.props}))})},[i.props]),p?e().createElement(Cs,{componentPath:u}):null},DashContext:js,useDashContext:function(){var e=(0,t.useContext)(js);return e||console.error("Dash Context was not found, component was rendered without a wrapper. Use `window.dash_component_api.ExternalWrapper` to make sure the component is properly connected."),e||{}},getLayout:function(t){for(var e=Rl(),r=0;r{var r=Ml().popup;return(0,t.useMemo)(()=>{var t="dash-debug-menu__button";return r===e?t+" dash-debug-menu__button--selected":t},[r])}}});var Gl=/^([^\w]*)(javascript|vbscript)/im,Bl=/&(tab|newline);/gi,Fl=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,Hl=/&#(\w+)(^\w|;)?/g,$l=window.dash_clientside=window.dash_clientside||{};$l.set_props=function(t,e){for(var r=Rl(),n=0;n1&&void 0!==arguments[1]?arguments[1]:"about:blank";if(""===t)return t;var r=t.replace(Bl,"").replace(Fl,"").replace(Hl,(t,e)=>String.fromCharCode(e)).trim();return Gl.test(r)?e:t}:$l.clean_url,$l.Patch=class{constructor(){Pi(this,"operations",[])}assign(t,e){return this.operations.push({operation:"Assign",location:t,params:{value:e}}),this}merge(t,e){return this.operations.push({operation:"Merge",location:t,params:{value:e}}),this}extend(t,e){return this.operations.push({operation:"Extend",location:t,params:{value:e}}),this}delete(t){return this.operations.push({operation:"Delete",location:t,params:{}}),this}insert(t,e,r){return this.operations.push({operation:"Insert",location:t,params:{index:e,value:r}}),this}append(t,e){return this.operations.push({operation:"Append",location:t,params:{value:e}}),this}prepend(t,e){return this.operations.push({operation:"Prepend",location:t,params:{value:e}}),this}add(t,e){return this.operations.push({operation:"Add",location:t,params:{value:e}}),this}sub(t,e){return this.operations.push({operation:"Sub",location:t,params:{value:e}}),this}mul(t,e){return this.operations.push({operation:"Mul",location:t,params:{value:e}}),this}div(t,e){return this.operations.push({operation:"Div",location:t,params:{value:e}}),this}clear(t){return this.operations.push({operation:"Clear",location:t,params:{}}),this}reverse(t){return this.operations.push({operation:"Reverse",location:t,params:{}}),this}remove(t,e){return this.operations.push({operation:"Remove",location:t,params:{value:e}}),this}build(){return{__dash_patch_update:"__dash_patch_update",operations:this.operations}}},window.DashRenderer=class{constructor(t){var r=document.getElementById("react-entry-point");o().createRoot?o().createRoot(r).render(e().createElement(Il,{hooks:t})):o().render(e().createElement(Il,{hooks:t}),r)}}})(),window.dash_renderer={}})(); \ No newline at end of file +!function(){var t={296:function(t,e,r){var n;window,t.exports=(n=r(609),function(t){var e={};function r(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)r.d(n,o,function(e){return t[e]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=1)}([function(t,e){t.exports=n},function(t,e,r){"use strict";r.r(e),r.d(e,"asyncDecorator",function(){return u}),r.d(e,"inheritAsyncDecorator",function(){return a}),r.d(e,"isReady",function(){return c}),r.d(e,"History",function(){return f});var n=r(0);function o(t,e,r,n,o,i,u){try{var a=t[i](u),c=a.value}catch(t){return void r(t)}a.done?e(c):Promise.resolve(c).then(n,o)}function i(t){return function(){var e=this,r=arguments;return new Promise(function(n,i){var u=t.apply(e,r);function a(t){o(u,n,i,a,c,"next",t)}function c(t){o(u,n,i,a,c,"throw",t)}a(void 0)})}}var u=function(t,e){var r,o={isReady:new Promise(function(t){r=t}),get:Object(n.lazy)(function(){return Promise.resolve(e()).then(function(t){return setTimeout(i(regeneratorRuntime.mark(function t(){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,r(!0);case 2:o.isReady=!0;case 3:case"end":return t.stop()}},t)})),0),t})})};return Object.defineProperty(t,"_dashprivate_isLazyComponentReady",{get:function(){return o.isReady}}),o.get},a=function(t,e){Object.defineProperty(t,"_dashprivate_isLazyComponentReady",{get:function(){return c(e)}})},c=function(t){return t&&t._dashprivate_isLazyComponentReady};function s(t,e){for(var r=0;rp)l=t.lastIndexOf(";",f-1)+1;else{var y=i(t,l,f);void 0===a[y]&&(a[y]=s(i(t,f+1,p))),l=p+1}}while(ln;){var u=t.charCodeAt(o-1);if(32!==u&&9!==u)break;o--}return t.slice(n,o)}function u(t){if(-1===t.indexOf("%"))return t;try{return decodeURIComponent(t)}catch(e){return t}}},712:function(t,e){"use strict";function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}var n=Symbol.for("react.element"),o=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),u=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),c=Symbol.for("react.provider"),s=Symbol.for("react.context"),l=Symbol.for("react.server_context"),f=Symbol.for("react.forward_ref"),p=Symbol.for("react.suspense"),y=Symbol.for("react.suspense_list"),d=Symbol.for("react.memo"),h=Symbol.for("react.lazy");Symbol.for("react.offscreen");Symbol.for("react.module.reference"),e.isContextConsumer=function(t){return function(t){if("object"===r(t)&&null!==t){var e=t.$$typeof;switch(e){case n:switch(t=t.type){case i:case a:case u:case p:case y:return t;default:switch(t=t&&t.$$typeof){case l:case s:case f:case h:case d:case c:return t;default:return e}}case o:return e}}}(t)===s}},516:function(t,e,r){"use strict";t.exports=r(712)},217:function(t,e,r){"use strict";var n=r(601),o=r.n(n),i=r(314),u=r.n(i)()(o());u.push([t.id,"._dash-undo-redo {\n position: fixed;\n bottom: 30px;\n left: 30px;\n font-size: 20px;\n text-align: center;\n z-index: 9999;\n background-color: rgba(255, 255, 255, 0.9);\n}\n._dash-undo-redo > div {\n position: relative;\n}\n._dash-undo-redo-link {\n color: #0074d9;\n cursor: pointer;\n margin-left: 10px;\n margin-right: 10px;\n display: inline-block;\n opacity: 0.2;\n}\n._dash-undo-redo-link:hover {\n opacity: 1;\n}\n._dash-undo-redo-link ._dash-icon-undo {\n font-size: 20px;\n transform: rotate(270deg);\n}\n._dash-undo-redo-link ._dash-icon-redo {\n font-size: 20px;\n transform: rotate(90deg);\n}\n._dash-undo-redo-link ._dash-undo-redo-label {\n font-size: 15px;\n}\n",""]),e.A=u},314:function(t){"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map(function(e){var r="",n=void 0!==e[5];return e[4]&&(r+="@supports (".concat(e[4],") {")),e[2]&&(r+="@media ".concat(e[2]," {")),n&&(r+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),r+=t(e),n&&(r+="}"),e[2]&&(r+="}"),e[4]&&(r+="}"),r}).join("")},e.i=function(t,r,n,o,i){"string"==typeof t&&(t=[[null,t,void 0]]);var u={};if(n)for(var a=0;a0?" ".concat(l[5]):""," {").concat(l[1],"}")),l[5]=i),r&&(l[2]?(l[1]="@media ".concat(l[2]," {").concat(l[1],"}"),l[2]=r):l[2]=r),o&&(l[4]?(l[1]="@supports (".concat(l[4],") {").concat(l[1],"}"),l[4]=o):l[4]="".concat(o)),e.push(l))}},e}},601:function(t){"use strict";t.exports=function(t){return t[1]}},131:function(t,e){function r(t,e,r,n){var i={};return function(u){if(!i[u]){var a={},c=[],s=[];for(s.push({node:u,processed:!1});s.length>0;){var l=s[s.length-1],f=l.processed,p=l.node;if(f)s.pop(),c.pop(),a[p]=!1,i[p]=!0,e&&0!==t[p].length||r.push(p);else{if(i[p]){s.pop();continue}if(a[p]){if(n){s.pop();continue}throw c.push(p),new o(c)}a[p]=!0,c.push(p);for(var y=t[p],d=y.length-1;d>=0;d--)s.push({node:y[d],processed:!1});l.processed=!0}}}}}var n=e.w=function(t){this.nodes={},this.outgoingEdges={},this.incomingEdges={},this.circular=t&&!!t.circular};n.prototype={size:function(){return Object.keys(this.nodes).length},addNode:function(t,e){this.hasNode(t)||(this.nodes[t]=2===arguments.length?e:t,this.outgoingEdges[t]=[],this.incomingEdges[t]=[])},removeNode:function(t){this.hasNode(t)&&(delete this.nodes[t],delete this.outgoingEdges[t],delete this.incomingEdges[t],[this.incomingEdges,this.outgoingEdges].forEach(function(e){Object.keys(e).forEach(function(r){var n=e[r].indexOf(t);n>=0&&e[r].splice(n,1)},this)}))},hasNode:function(t){return this.nodes.hasOwnProperty(t)},getNodeData:function(t){if(this.hasNode(t))return this.nodes[t];throw new Error("Node does not exist: "+t)},setNodeData:function(t,e){if(!this.hasNode(t))throw new Error("Node does not exist: "+t);this.nodes[t]=e},addDependency:function(t,e){if(!this.hasNode(t))throw new Error("Node does not exist: "+t);if(!this.hasNode(e))throw new Error("Node does not exist: "+e);return-1===this.outgoingEdges[t].indexOf(e)&&this.outgoingEdges[t].push(e),-1===this.incomingEdges[e].indexOf(t)&&this.incomingEdges[e].push(t),!0},removeDependency:function(t,e){var r;this.hasNode(t)&&(r=this.outgoingEdges[t].indexOf(e))>=0&&this.outgoingEdges[t].splice(r,1),this.hasNode(e)&&(r=this.incomingEdges[e].indexOf(t))>=0&&this.incomingEdges[e].splice(r,1)},clone:function(){var t=this,e=new n;return Object.keys(t.nodes).forEach(function(r){e.nodes[r]=t.nodes[r],e.outgoingEdges[r]=t.outgoingEdges[r].slice(0),e.incomingEdges[r]=t.incomingEdges[r].slice(0)}),e},directDependenciesOf:function(t){if(this.hasNode(t))return this.outgoingEdges[t].slice(0);throw new Error("Node does not exist: "+t)},directDependantsOf:function(t){if(this.hasNode(t))return this.incomingEdges[t].slice(0);throw new Error("Node does not exist: "+t)},dependenciesOf:function(t,e){if(this.hasNode(t)){var n=[];r(this.outgoingEdges,e,n,this.circular)(t);var o=n.indexOf(t);return o>=0&&n.splice(o,1),n}throw new Error("Node does not exist: "+t)},dependantsOf:function(t,e){if(this.hasNode(t)){var n=[];r(this.incomingEdges,e,n,this.circular)(t);var o=n.indexOf(t);return o>=0&&n.splice(o,1),n}throw new Error("Node does not exist: "+t)},overallOrder:function(t){var e=this,n=[],o=Object.keys(this.nodes);if(0===o.length)return n;if(!this.circular){var i=r(this.outgoingEdges,!1,[],this.circular);o.forEach(function(t){i(t)})}var u=r(this.outgoingEdges,t,n,this.circular);return o.filter(function(t){return 0===e.incomingEdges[t].length}).forEach(function(t){u(t)}),this.circular&&o.filter(function(t){return-1===n.indexOf(t)}).forEach(function(t){u(t)}),n},entryNodes:function(){var t=this;return Object.keys(this.nodes).filter(function(e){return 0===t.incomingEdges[e].length})}},n.prototype.directDependentsOf=n.prototype.directDependantsOf,n.prototype.dependentsOf=n.prototype.dependantsOf;var o=function(t){var e="Dependency Cycle Found: "+t.join(" -> "),r=new Error(e);return r.cyclePath=t,Object.setPrototypeOf(r,Object.getPrototypeOf(this)),Error.captureStackTrace&&Error.captureStackTrace(r,o),r};o.prototype=Object.create(Error.prototype,{constructor:{value:Error,enumerable:!1,writable:!0,configurable:!0}}),Object.setPrototypeOf(o,Error)},365:function(t,e,r){"use strict";var n=r(886);t.exports=function(t){var e=typeof t;if("string"===e){var r=t;if(0===(t=+t)&&n(r))return!1}else if("number"!==e)return!1;return t-t<1}},146:function(t,e,r){"use strict";var n=r(363),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},i={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},u={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},a={};function c(t){return n.isMemo(t)?u:a[t.$$typeof]||o}a[n.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},a[n.Memo]=u;var s=Object.defineProperty,l=Object.getOwnPropertyNames,f=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,y=Object.getPrototypeOf,d=Object.prototype;t.exports=function t(e,r,n){if("string"!=typeof r){if(d){var o=y(r);o&&o!==d&&t(e,o,n)}var u=l(r);f&&(u=u.concat(f(r)));for(var a=c(e),h=c(r),v=0;v13)&&32!==e&&133!==e&&160!==e&&5760!==e&&6158!==e&&(e<8192||e>8205)&&8232!==e&&8233!==e&&8239!==e&&8287!==e&&8288!==e&&12288!==e&&65279!==e)return!1;return!0}},925:function(t){"use strict";t.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},799:function(t,e){"use strict";var r="function"==typeof Symbol&&Symbol.for,n=r?Symbol.for("react.element"):60103,o=r?Symbol.for("react.portal"):60106,i=r?Symbol.for("react.fragment"):60107,u=r?Symbol.for("react.strict_mode"):60108,a=r?Symbol.for("react.profiler"):60114,c=r?Symbol.for("react.provider"):60109,s=r?Symbol.for("react.context"):60110,l=r?Symbol.for("react.async_mode"):60111,f=r?Symbol.for("react.concurrent_mode"):60111,p=r?Symbol.for("react.forward_ref"):60112,y=r?Symbol.for("react.suspense"):60113,d=r?Symbol.for("react.suspense_list"):60120,h=r?Symbol.for("react.memo"):60115,v=r?Symbol.for("react.lazy"):60116,b=r?Symbol.for("react.block"):60121,m=r?Symbol.for("react.fundamental"):60117,g=r?Symbol.for("react.responder"):60118,w=r?Symbol.for("react.scope"):60119;function O(t){if("object"==typeof t&&null!==t){var e=t.$$typeof;switch(e){case n:switch(t=t.type){case l:case f:case i:case a:case u:case y:return t;default:switch(t=t&&t.$$typeof){case s:case p:case v:case h:case c:return t;default:return e}}case o:return e}}}function S(t){return O(t)===f}e.AsyncMode=l,e.ConcurrentMode=f,e.ContextConsumer=s,e.ContextProvider=c,e.Element=n,e.ForwardRef=p,e.Fragment=i,e.Lazy=v,e.Memo=h,e.Portal=o,e.Profiler=a,e.StrictMode=u,e.Suspense=y,e.isAsyncMode=function(t){return S(t)||O(t)===l},e.isConcurrentMode=S,e.isContextConsumer=function(t){return O(t)===s},e.isContextProvider=function(t){return O(t)===c},e.isElement=function(t){return"object"==typeof t&&null!==t&&t.$$typeof===n},e.isForwardRef=function(t){return O(t)===p},e.isFragment=function(t){return O(t)===i},e.isLazy=function(t){return O(t)===v},e.isMemo=function(t){return O(t)===h},e.isPortal=function(t){return O(t)===o},e.isProfiler=function(t){return O(t)===a},e.isStrictMode=function(t){return O(t)===u},e.isSuspense=function(t){return O(t)===y},e.isValidElementType=function(t){return"string"==typeof t||"function"==typeof t||t===i||t===f||t===a||t===u||t===y||t===d||"object"==typeof t&&null!==t&&(t.$$typeof===v||t.$$typeof===h||t.$$typeof===c||t.$$typeof===s||t.$$typeof===p||t.$$typeof===m||t.$$typeof===g||t.$$typeof===w||t.$$typeof===b)},e.typeOf=O},363:function(t,e,r){"use strict";t.exports=r(799)},72:function(t){"use strict";var e=[];function r(t){for(var r=-1,n=0;n0?" ".concat(r.layer):""," {")),n+=r.css,o&&(n+="}"),r.media&&(n+="}"),r.supports&&(n+="}");var i=r.sourceMap;i&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),e.styleTagTransform(n,t,e.options)}(e,t,r)},remove:function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(e)}}}},113:function(t){"use strict";t.exports=function(t,e){if(e.styleSheet)e.styleSheet.cssText=t;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(t))}}},63:function(t,e,r){"use strict";var n=r(609),o="function"==typeof Object.is?Object.is:function(t,e){return t===e&&(0!==t||1/t==1/e)||t!=t&&e!=e},i=n.useState,u=n.useEffect,a=n.useLayoutEffect,c=n.useDebugValue;function s(t){var e=t.getSnapshot;t=t.value;try{var r=e();return!o(t,r)}catch(t){return!0}}var l="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(t,e){return e()}:function(t,e){var r=e(),n=i({inst:{value:r,getSnapshot:e}}),o=n[0].inst,l=n[1];return a(function(){o.value=r,o.getSnapshot=e,s(o)&&l({inst:o})},[t,r,e]),u(function(){return s(o)&&l({inst:o}),t(function(){s(o)&&l({inst:o})})},[t]),c(r),r};e.useSyncExternalStore=void 0!==n.useSyncExternalStore?n.useSyncExternalStore:l},940:function(t,e,r){"use strict";var n=r(609),o=r(888),i="function"==typeof Object.is?Object.is:function(t,e){return t===e&&(0!==t||1/t==1/e)||t!=t&&e!=e},u=o.useSyncExternalStore,a=n.useRef,c=n.useEffect,s=n.useMemo,l=n.useDebugValue;e.useSyncExternalStoreWithSelector=function(t,e,r,n,o){var f=a(null);if(null===f.current){var p={hasValue:!1,value:null};f.current=p}else p=f.current;f=s(function(){function t(t){if(!c){if(c=!0,u=t,t=n(t),void 0!==o&&p.hasValue){var e=p.value;if(o(e,t))return a=e}return a=t}if(e=a,i(u,t))return e;var r=n(t);return void 0!==o&&o(e,r)?e:(u=t,a=r)}var u,a,c=!1,s=void 0===r?null:r;return[function(){return t(e())},null===s?void 0:function(){return t(s())}]},[e,r,n,o]);var y=u(t,f[0],f[1]);return c(function(){p.hasValue=!0,p.value=y},[y]),l(y),y}},888:function(t,e,r){"use strict";t.exports=r(63)},242:function(t,e,r){"use strict";t.exports=r(940)},609:function(t){"use strict";t.exports=window.React}},e={};function r(n){var o=e[n];if(void 0!==o)return o.exports;var i=e[n]={id:n,exports:{}};return t[n](i,i.exports,r),i.exports}r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,{a:e}),e},r.d=function(t,e){for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.nc=void 0,function(){"use strict";var t="undefined"!=typeof globalThis&&globalThis||"undefined"!=typeof self&&self||void 0!==r.g&&r.g||{},e="URLSearchParams"in t,n="Symbol"in t&&"iterator"in Symbol,o="FileReader"in t&&"Blob"in t&&function(){try{return new Blob,!0}catch(t){return!1}}(),i="FormData"in t,u="ArrayBuffer"in t;if(u)var a=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],c=ArrayBuffer.isView||function(t){return t&&a.indexOf(Object.prototype.toString.call(t))>-1};function s(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(t)||""===t)throw new TypeError('Invalid character in header field name: "'+t+'"');return t.toLowerCase()}function l(t){return"string"!=typeof t&&(t=String(t)),t}function f(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return n&&(e[Symbol.iterator]=function(){return e}),e}function p(t){this.map={},t instanceof p?t.forEach(function(t,e){this.append(e,t)},this):Array.isArray(t)?t.forEach(function(t){if(2!=t.length)throw new TypeError("Headers constructor: expected name/value pair to be length 2, found"+t.length);this.append(t[0],t[1])},this):t&&Object.getOwnPropertyNames(t).forEach(function(e){this.append(e,t[e])},this)}function y(t){if(!t._noBody)return t.bodyUsed?Promise.reject(new TypeError("Already read")):void(t.bodyUsed=!0)}function d(t){return new Promise(function(e,r){t.onload=function(){e(t.result)},t.onerror=function(){r(t.error)}})}function h(t){var e=new FileReader,r=d(e);return e.readAsArrayBuffer(t),r}function v(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function b(){return this.bodyUsed=!1,this._initBody=function(t){var r;this.bodyUsed=this.bodyUsed,this._bodyInit=t,t?"string"==typeof t?this._bodyText=t:o&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:i&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:e&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():u&&o&&(r=t)&&DataView.prototype.isPrototypeOf(r)?(this._bodyArrayBuffer=v(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):u&&(ArrayBuffer.prototype.isPrototypeOf(t)||c(t))?this._bodyArrayBuffer=v(t):this._bodyText=t=Object.prototype.toString.call(t):(this._noBody=!0,this._bodyText=""),this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):e&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},o&&(this.blob=function(){var t=y(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))}),this.arrayBuffer=function(){if(this._bodyArrayBuffer)return y(this)||(ArrayBuffer.isView(this._bodyArrayBuffer)?Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset,this._bodyArrayBuffer.byteOffset+this._bodyArrayBuffer.byteLength)):Promise.resolve(this._bodyArrayBuffer));if(o)return this.blob().then(h);throw new Error("could not read as ArrayBuffer")},this.text=function(){var t,e,r,n,o,i=y(this);if(i)return i;if(this._bodyBlob)return t=this._bodyBlob,r=d(e=new FileReader),o=(n=/charset=([A-Za-z0-9_-]+)/.exec(t.type))?n[1]:"utf-8",e.readAsText(t,o),r;if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),r=new Array(e.length),n=0;n-1?o:n),this.mode=r.mode||this.mode||null,this.signal=r.signal||this.signal||function(){if("AbortController"in t)return(new AbortController).signal}(),this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&i)throw new TypeError("Body not allowed for GET or HEAD requests");if(this._initBody(i),!("GET"!==this.method&&"HEAD"!==this.method||"no-store"!==r.cache&&"no-cache"!==r.cache)){var u=/([?&])_=[^&]*/;u.test(this.url)?this.url=this.url.replace(u,"$1_="+(new Date).getTime()):this.url+=(/\?/.test(this.url)?"&":"?")+"_="+(new Date).getTime()}}function w(t){var e=new FormData;return t.trim().split("&").forEach(function(t){if(t){var r=t.split("="),n=r.shift().replace(/\+/g," "),o=r.join("=").replace(/\+/g," ");e.append(decodeURIComponent(n),decodeURIComponent(o))}}),e}function O(t,e){if(!(this instanceof O))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');if(e||(e={}),this.type="default",this.status=void 0===e.status?200:e.status,this.status<200||this.status>599)throw new RangeError("Failed to construct 'Response': The status provided (0) is outside the range [200, 599].");this.ok=this.status>=200&&this.status<300,this.statusText=void 0===e.statusText?"":""+e.statusText,this.headers=new p(e.headers),this.url=e.url||"",this._initBody(t)}g.prototype.clone=function(){return new g(this,{body:this._bodyInit})},b.call(g.prototype),b.call(O.prototype),O.prototype.clone=function(){return new O(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new p(this.headers),url:this.url})},O.error=function(){var t=new O(null,{status:200,statusText:""});return t.ok=!1,t.status=0,t.type="error",t};var S=[301,302,303,307,308];O.redirect=function(t,e){if(-1===S.indexOf(e))throw new RangeError("Invalid status code");return new O(null,{status:e,headers:{location:t}})};var j=t.DOMException;try{new j}catch(t){(j=function(t,e){this.message=t,this.name=e;var r=Error(t);this.stack=r.stack}).prototype=Object.create(Error.prototype),j.prototype.constructor=j}function _(e,r){return new Promise(function(n,i){var a=new g(e,r);if(a.signal&&a.signal.aborted)return i(new j("Aborted","AbortError"));var c=new XMLHttpRequest;function f(){c.abort()}if(c.onload=function(){var t,e,r={statusText:c.statusText,headers:(t=c.getAllResponseHeaders()||"",e=new p,t.replace(/\r?\n[\t ]+/g," ").split("\r").map(function(t){return 0===t.indexOf("\n")?t.substr(1,t.length):t}).forEach(function(t){var r=t.split(":"),n=r.shift().trim();if(n){var o=r.join(":").trim();try{e.append(n,o)}catch(t){console.warn("Response "+t.message)}}}),e)};0===a.url.indexOf("file://")&&(c.status<200||c.status>599)?r.status=200:r.status=c.status,r.url="responseURL"in c?c.responseURL:r.headers.get("X-Request-URL");var o="response"in c?c.response:c.responseText;setTimeout(function(){n(new O(o,r))},0)},c.onerror=function(){setTimeout(function(){i(new TypeError("Network request failed"))},0)},c.ontimeout=function(){setTimeout(function(){i(new TypeError("Network request timed out"))},0)},c.onabort=function(){setTimeout(function(){i(new j("Aborted","AbortError"))},0)},c.open(a.method,function(e){try{return""===e&&t.location.href?t.location.href:e}catch(t){return e}}(a.url),!0),"include"===a.credentials?c.withCredentials=!0:"omit"===a.credentials&&(c.withCredentials=!1),"responseType"in c&&(o?c.responseType="blob":u&&(c.responseType="arraybuffer")),r&&"object"==typeof r.headers&&!(r.headers instanceof p||t.Headers&&r.headers instanceof t.Headers)){var y=[];Object.getOwnPropertyNames(r.headers).forEach(function(t){y.push(s(t)),c.setRequestHeader(t,l(r.headers[t]))}),a.headers.forEach(function(t,e){-1===y.indexOf(e)&&c.setRequestHeader(e,t)})}else a.headers.forEach(function(t,e){c.setRequestHeader(e,t)});a.signal&&(a.signal.addEventListener("abort",f),c.onreadystatechange=function(){4===c.readyState&&a.signal.removeEventListener("abort",f)}),c.send(void 0===a._bodyInit?null:a._bodyInit)})}_.polyfill=!0,t.fetch||(t.fetch=_,t.Headers=p,t.Request=g,t.Response=O)}(),function(){"use strict";var t=r(609),e=r.n(t),n=window.ReactDOM,o=r.n(n),i=window.PropTypes,u=r.n(i),a=r(888),c=r(242),s=function(t){t()},l=function(){return s},f=(0,t.createContext)(null);function p(){return(0,t.useContext)(f)}var y=function(){throw new Error("uSES not initialized!")},d=y,h=function(t,e){return t===e};function v(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:f,r=e===f?p:function(){return(0,t.useContext)(e)};return function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:h,o=r(),i=o.store,u=o.subscription,a=o.getServerState,c=d(u.addNestedSub,i.getState,a||i.getState,e,n);return(0,t.useDebugValue)(c),c}}var b=v();function m(){return m=Object.assign?Object.assign.bind():function(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);r3&&void 0!==arguments[3]?arguments[3]:{},u=(i.pure,i.areStatesEqual),a=void 0===u?J:u,c=i.areOwnPropsEqual,s=void 0===c?U:c,l=i.areStatePropsEqual,p=void 0===l?U:l,y=i.areMergedPropsEqual,d=void 0===y?U:y,h=i.forwardRef,v=void 0!==h&&h,b=i.context,w=void 0===b?f:b,P=function(t){return t?"function"==typeof t?A(t):T(t,"mapStateToProps"):E(function(){return{}})}(r),k=function(t){return t&&"object"===x(t)?E(function(e){return function(t,e){var r={},n=function(){var n=t[o];"function"==typeof n&&(r[o]=function(){return e(n.apply(void 0,arguments))})};for(var o in t)n();return r}(t,e)}):t?"function"==typeof t?A(t):T(t,"mapDispatchToProps"):E(function(t){return{dispatch:t}})}(n),C=function(t){return t?"function"==typeof t?function(t){return function(e,r){r.displayName;var n,o=r.areMergedPropsEqual,i=!1;return function(e,r,u){var a=t(e,r,u);return i?o(a,n)||(n=a):(i=!0,n=a),n}}}(t):T(t,"mergeProps"):function(){return I}}(o),N=Boolean(r);return function(r){var n=r.displayName||r.name||"Component",o="Connect(".concat(n,")"),i={shouldHandleStateChanges:N,displayName:o,wrappedComponentName:n,WrappedComponent:r,initMapStateToProps:P,initMapDispatchToProps:k,initMergeProps:C,areStatesEqual:a,areStatePropsEqual:p,areOwnPropsEqual:s,areMergedPropsEqual:d};function u(n){var o=(0,t.useMemo)(function(){var t=n.reactReduxForwardedRef,e=g(n,B);return[n.context,t,e]},[n]),u=L(o,3),a=u[0],c=u[1],s=u[2],l=(0,t.useMemo)(function(){return a&&a.Consumer&&(0,S.isContextConsumer)(e().createElement(a.Consumer,null))?a:w},[a,w]),f=(0,t.useContext)(l),p=Boolean(n.store)&&Boolean(n.store.getState)&&Boolean(n.store.dispatch),y=Boolean(f)&&Boolean(f.store),d=p?n.store:f.store,h=y?f.getServerState:d.getState,v=(0,t.useMemo)(function(){return function(t,e){var r=e.initMapStateToProps,n=e.initMapDispatchToProps,o=e.initMergeProps,i=g(e,j);return _(r(t,i),n(t,i),o(t,i),t,i)}(d.dispatch,i)},[d]),b=(0,t.useMemo)(function(){if(!N)return H;var t=R(d,p?void 0:f.subscription),e=t.notifyNestedSubs.bind(t);return[t,e]},[d,p,f]),O=L(b,2),E=O[0],P=O[1],A=(0,t.useMemo)(function(){return p?f:m({},f,{subscription:E})},[p,f,E]),k=(0,t.useRef)(),T=(0,t.useRef)(s),x=(0,t.useRef)(),I=(0,t.useRef)(!1),C=((0,t.useRef)(!1),(0,t.useRef)(!1)),M=(0,t.useRef)();D(function(){return C.current=!0,function(){C.current=!1}},[]);var U,J,W,z=(0,t.useMemo)(function(){return function(){return x.current&&s===T.current?x.current:v(d.getState(),s)}},[d,s]),V=(0,t.useMemo)(function(){return function(t){return E?function(t,e,r,n,o,i,u,a,c,s,l){if(!t)return function(){};var f=!1,p=null,y=function(){if(!f&&a.current){var t,r,y=e.getState();try{t=n(y,o.current)}catch(t){r=t,p=t}r||(p=null),t===i.current?u.current||s():(i.current=t,c.current=t,u.current=!0,l())}};return r.onStateChange=y,r.trySubscribe(),y(),function(){if(f=!0,r.tryUnsubscribe(),r.onStateChange=null,p)throw p}}(N,d,E,v,T,k,I,C,x,P,t):function(){}}},[E]);U=$,J=[T,k,I,s,x,P],D(function(){return U.apply(void 0,function(t){if(Array.isArray(t))return G(t)}(t=J)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||q(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}());var t},void 0);try{W=F(V,z,h?function(){return v(h(),s)}:z)}catch(t){throw M.current&&(t.message+="\nThe error may be correlated with this previous error:\n".concat(M.current.stack,"\n\n")),t}D(function(){M.current=void 0,x.current=void 0,k.current=W});var K=(0,t.useMemo)(function(){return e().createElement(r,m({},W,{ref:c}))},[c,r,W]);return(0,t.useMemo)(function(){return N?e().createElement(l.Provider,{value:A},K):K},[l,K,A])}var c=e().memo(u);if(c.WrappedComponent=r,c.displayName=u.displayName=o,v){var l=e().forwardRef(function(t,r){return e().createElement(c,m({},t,{reactReduxForwardedRef:r}))});return l.displayName=o,l.WrappedComponent=r,O()(l,r)}return O()(c,r)}},z=function(r){var n=r.store,o=r.context,i=r.children,u=r.serverState,a=(0,t.useMemo)(function(){var t=R(n);return{store:n,subscription:t,getServerState:u?function(){return u}:void 0}},[n,u]),c=(0,t.useMemo)(function(){return n.getState()},[n]);D(function(){var t=a.subscription;return t.onStateChange=t.notifyNestedSubs,t.trySubscribe(),c!==n.getState()&&t.notifyNestedSubs(),function(){t.tryUnsubscribe(),t.onStateChange=void 0}},[a,c]);var s=o||f;return e().createElement(s.Provider,{value:a},i)};function V(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:f,r=e===f?p:function(){return(0,t.useContext)(e)};return function(){return r().store}}var K=V();function Y(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:f,e=t===f?K:V(t);return function(){return e().dispatch}}var Q,X,Z=Y();function tt(t,e){switch(t){case 0:return function(){return e.apply(this,arguments)};case 1:return function(t){return e.apply(this,arguments)};case 2:return function(t,r){return e.apply(this,arguments)};case 3:return function(t,r,n){return e.apply(this,arguments)};case 4:return function(t,r,n,o){return e.apply(this,arguments)};case 5:return function(t,r,n,o,i){return e.apply(this,arguments)};case 6:return function(t,r,n,o,i,u){return e.apply(this,arguments)};case 7:return function(t,r,n,o,i,u,a){return e.apply(this,arguments)};case 8:return function(t,r,n,o,i,u,a,c){return e.apply(this,arguments)};case 9:return function(t,r,n,o,i,u,a,c,s){return e.apply(this,arguments)};case 10:return function(t,r,n,o,i,u,a,c,s,l){return e.apply(this,arguments)};default:throw new Error("First argument to _arity must be a non-negative integer no greater than ten")}}function et(t){return et="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},et(t)}function rt(t){return null!=t&&"object"===et(t)&&!0===t["@@functional/placeholder"]}function nt(t){return function e(r){return 0===arguments.length||rt(r)?e:t.apply(this,arguments)}}Q=c.useSyncExternalStoreWithSelector,d=Q,function(t){F=t}(a.useSyncExternalStore),X=n.unstable_batchedUpdates,s=X;var ot=nt(function(t){var e,r=!1;return tt(t.length,function(){return r?e:(r=!0,e=t.apply(this,arguments))})}),it=ot;function ut(t){return ut="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},ut(t)}function at(t,e,r){return(e=function(t){var e=function(t){if("object"!=ut(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=ut(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==ut(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function ct(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function st(t){for(var e=1;e=0;)jt(e=Tt[r],t)&&!It(n,e)&&(n[n.length]=e),r-=1;return n}):nt(function(t){return Object(t)!==t?[]:Object.keys(t)}),Rt=nt(function(t){return null===t?"Null":void 0===t?"Undefined":Object.prototype.toString.call(t).slice(8,-1)});function Dt(t){return Dt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Dt(t)}function Nt(t,e,r,n){var o=Ot(t);function i(t,e){return Mt(t,e,r.slice(),n.slice())}return!St(function(t,e){return!St(i,e,t)},Ot(e),o)}function Mt(t,e,r,n){if(_t(t,e))return!0;var o,i,u=Rt(t);if(u!==Rt(e))return!1;if("function"==typeof t["fantasy-land/equals"]||"function"==typeof e["fantasy-land/equals"])return"function"==typeof t["fantasy-land/equals"]&&t["fantasy-land/equals"](e)&&"function"==typeof e["fantasy-land/equals"]&&e["fantasy-land/equals"](t);if("function"==typeof t.equals||"function"==typeof e.equals)return"function"==typeof t.equals&&t.equals(e)&&"function"==typeof e.equals&&e.equals(t);switch(u){case"Arguments":case"Array":case"Object":if("function"==typeof t.constructor&&"Promise"===(o=t.constructor,null==(i=String(o).match(/^function (\w*)/))?"":i[1]))return t===e;break;case"Boolean":case"Number":case"String":if(Dt(t)!==Dt(e)||!_t(t.valueOf(),e.valueOf()))return!1;break;case"Date":if(!_t(t.valueOf(),e.valueOf()))return!1;break;case"Error":return t.name===e.name&&t.message===e.message;case"RegExp":if(t.source!==e.source||t.global!==e.global||t.ignoreCase!==e.ignoreCase||t.multiline!==e.multiline||t.sticky!==e.sticky||t.unicode!==e.unicode)return!1}for(var a=r.length-1;a>=0;){if(r[a]===t)return n[a]===e;a-=1}switch(u){case"Map":return t.size===e.size&&Nt(t.entries(),e.entries(),r.concat([t]),n.concat([e]));case"Set":return t.size===e.size&&Nt(t.values(),e.values(),r.concat([t]),n.concat([e]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var c=Ct(t);if(c.length!==Ct(e).length)return!1;var s=r.concat([t]),l=n.concat([e]);for(a=c.length-1;a>=0;){var f=c[a];if(!jt(f,e)||!Mt(e[f],t[f],s,l))return!1;a-=1}return!0}var Ut=wt(function(t,e){return Mt(t,e,[],[])});function Lt(t){return Lt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Lt(t)}function qt(t,e,r){var n,o;if("function"==typeof t.indexOf)switch(Lt(e)){case"number":if(0===e){for(n=1/e;r=0}var Bt=wt(Gt);function Ft(t){return function e(r,n,o){switch(arguments.length){case 0:return e;case 1:return rt(r)?e:wt(function(e,n){return t(r,e,n)});case 2:return rt(r)&&rt(n)?e:rt(r)?wt(function(e,r){return t(e,n,r)}):rt(n)?wt(function(e,n){return t(r,e,n)}):nt(function(e){return t(r,n,e)});default:return rt(r)&&rt(n)&&rt(o)?e:rt(r)&&rt(n)?wt(function(e,r){return t(e,r,o)}):rt(r)&&rt(o)?wt(function(e,r){return t(e,n,r)}):rt(n)&&rt(o)?wt(function(e,n){return t(r,e,n)}):rt(r)?nt(function(e){return t(e,n,o)}):rt(n)?nt(function(e){return t(r,e,o)}):rt(o)?nt(function(e){return t(r,n,e)}):t(r,n,o)}}}var Ht=Number.isInteger||function(t){return(0|t)===t};function $t(t){return"[object String]"===Object.prototype.toString.call(t)}function Jt(t,e){var r=t<0?e.length+t:t;return $t(e)?e.charAt(r):e[r]}function Wt(t,e){for(var r=e,n=0;n=0&&"[object Array]"===Object.prototype.toString.call(t)},Yt=nt(function(t){return null==t});function Qt(t){return Qt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Qt(t)}var Xt=Ft(function t(e,r,n){if(0===e.length)return r;var o=e[0];if(e.length>1){var i=!Yt(n)&&jt(o,n)&&"object"===Qt(n[o])?n[o]:Ht(e[1])?[]:{};r=t(Array.prototype.slice.call(e,1),r,i)}return function(t,e,r){if(Ht(t)&&Kt(r)){var n=[].concat(r);return n[t]=e,n}var o={};for(var i in r)o[i]=r[i];return o[t]=e,o}(o,r,n)}),Zt=Ft(function(t,e,r){return Xt([t],e,r)});function te(t,e){return function(){var r=arguments.length;if(0===r)return e();var n=arguments[r-1];return Kt(n)||"function"!=typeof n[t]?e.apply(this,arguments):n[t].apply(n,Array.prototype.slice.call(arguments,0,r-1))}}var ee=wt(te("forEach",function(t,e){for(var r=e.length,n=0;n0&&t.hasOwnProperty(0)&&t.hasOwnProperty(t.length-1))});function _e(t){return function e(r){for(var n,o,i,u=[],a=0,c=r.length;a=arguments.length)?c=e[u]:(c=arguments[o],o+=1),n[u]=c,rt(c)?a=!0:i-=1,u+=1}return!a&&i<=0?r.apply(this,n):tt(Math.max(0,i),Te(t,n,r))}}var xe=wt(function(t,e){return 1===t?nt(e):tt(t,Te(t,[],e))}),Ie=xe,Ce=wt(he(["fantasy-land/map","map"],ke,function(t,e){switch(Object.prototype.toString.call(e)){case"[object Function]":return Ie(e.length,function(){return t.call(this,e.apply(this,arguments))});case"[object Object]":return de(function(r,n){return r[n]=t(e[n]),r},{},Ct(e));default:return Pe(t,e)}})),Re=Ce,De="undefined"!=typeof Symbol?Symbol.iterator:"@@iterator";function Ne(t,e,r){return function(n,o,i){if(je(i))return t(n,o,i);if(null==i)return o;if("function"==typeof i["fantasy-land/reduce"])return e(n,o,i,"fantasy-land/reduce");if(null!=i[De])return r(n,o,i[De]());if("function"==typeof i.next)return r(n,o,i);if("function"==typeof i.reduce)return e(n,o,i,"reduce");throw new TypeError("reduce: list must be array or iterable")}}function Me(t,e,r){for(var n=0,o=r.length;n":Xe(r,n)},n=function(t,e){return Pe(function(e){return We(e)+": "+r(t[e])},e.slice().sort())};switch(Object.prototype.toString.call(t)){case"[object Arguments]":return"(function() { return arguments; }("+Pe(r,t).join(", ")+"))";case"[object Array]":return"["+Pe(r,t).concat(n(t,Ye(function(t){return/^\d+$/.test(t)},Ct(t)))).join(", ")+"]";case"[object Boolean]":return"object"===Qe(t)?"new Boolean("+r(t.valueOf())+")":t.toString();case"[object Date]":return"new Date("+(isNaN(t.valueOf())?r(NaN):We(Ve(t)))+")";case"[object Map]":return"new Map("+r(Array.from(t))+")";case"[object Null]":return"null";case"[object Number]":return"object"===Qe(t)?"new Number("+r(t.valueOf())+")":1/t==-1/0?"-0":t.toString(10);case"[object Set]":return"new Set("+r(Array.from(t).sort())+")";case"[object String]":return"object"===Qe(t)?"new String("+r(t.valueOf())+")":We(t);case"[object Undefined]":return"undefined";default:if("function"==typeof t.toString){var o=t.toString();if("[object Object]"!==o)return o}return"{"+n(t,Ct(t)).join(", ")+"}"}}var Ze=nt(function(t){return Xe(t,[])}),tr=wt(function(t,e){if(Kt(t)){if(Kt(e))return t.concat(e);throw new TypeError(Ze(e)+" is not an array")}if($t(t)){if($t(e))return t+e;throw new TypeError(Ze(e)+" is not a string")}if(null!=t&&Je(t["fantasy-land/concat"]))return t["fantasy-land/concat"](e);if(null!=t&&Je(t.concat))return t.concat(e);throw new TypeError(Ze(t)+' does not have a method named "concat" or "fantasy-land/concat"')});function er(t){return t&&t["@@transducer/reduced"]?t:{"@@transducer/value":t,"@@transducer/reduced":!0}}var rr=function(){function t(t,e){this.xf=e,this.f=t,this.all=!0}return t.prototype["@@transducer/init"]=be,t.prototype["@@transducer/result"]=function(t){return this.all&&(t=this.xf["@@transducer/step"](t,!0)),this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,e){return this.f(e)||(this.all=!1,t=er(this.xf["@@transducer/step"](t,!1))),t},t}();function nr(t){return function(e){return new rr(t,e)}}var or=wt(he(["all"],nr,function(t,e){for(var r=0;re!=e>t)return e>t?e:t}var n=r(t,e);if(void 0!==n)return n;var o=r(ur(t),ur(e));if(void 0!==o)return o===ur(t)?t:e;var i=Ze(t),u=r(i,Ze(e));return void 0!==u&&u===i?t:e}),cr=wt(function(t,e){return Re(pe(t),e)}),sr=wt(function(t,e){return Ie($e(ar,0,cr("length",e)),function(){var r=arguments,n=this;return t.apply(n,Pe(function(t){return t.apply(n,r)},e))})}),lr=sr,fr=nt(function(t){return lr(function(){return Array.prototype.slice.call(arguments,0)},t)}),pr=fr([Oe,Ye]);function yr(t){return yr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},yr(t)}function dr(t,e,r){var n,o=yr(t);switch(o){case"string":case"number":return 0===t&&1/t==-1/0?!!r._items["-0"]||(e&&(r._items["-0"]=!0),!1):null!==r._nativeSet?e?(n=r._nativeSet.size,r._nativeSet.add(t),r._nativeSet.size===n):r._nativeSet.has(t):o in r._items?t in r._items[o]||(e&&(r._items[o][t]=!0),!1):(e&&(r._items[o]={},r._items[o][t]=!0),!1);case"boolean":if(o in r._items){var i=t?1:0;return!!r._items[o][i]||(e&&(r._items[o][i]=!0),!1)}return e&&(r._items[o]=t?[!1,!0]:[!0,!1]),!1;case"function":return null!==r._nativeSet?e?(n=r._nativeSet.size,r._nativeSet.add(t),r._nativeSet.size===n):r._nativeSet.has(t):o in r._items?!!Gt(t,r._items[o])||(e&&r._items[o].push(t),!1):(e&&(r._items[o]=[t]),!1);case"undefined":return!!r._items[o]||(e&&(r._items[o]=!0),!1);case"object":if(null===t)return!!r._items.null||(e&&(r._items.null=!0),!1);default:return(o=Object.prototype.toString.call(t))in r._items?!!Gt(t,r._items[o])||(e&&r._items[o].push(t),!1):(e&&(r._items[o]=[t]),!1)}}var hr=function(){function t(){this._nativeSet="function"==typeof Set?new Set:null,this._items={}}return t.prototype.add=function(t){return!dr(t,!0,this)},t.prototype.has=function(t){return dr(t,!1,this)},t}(),vr=wt(function(t,e){for(var r=[],n=0,o=t.length,i=e.length,u=new hr,a=0;a=0&&this.i>=this.n?er(r):r},t}();function Xr(t){return function(e){return new Qr(t,e)}}var Zr=Ft(te("slice",function(t,e,r){return Array.prototype.slice.call(r,t,e)})),tn=wt(he(["take"],Xr,function(t,e){return Zr(0,t<0?1/0:t,e)})),en=wt(function(t,e){return Ut(tn(t.length,e),t)}),rn=wt(function(t,e){return"function"!=typeof e.indexOf||Kt(e)?qt(e,t,0):e.indexOf(t)}),nn=Ft(function(t,e,r){t=t=0?t:r.length;var n=Array.prototype.slice.call(r,0);return n.splice(t,0,e),n}),on=function(){function t(t,e){this.xf=e,this.f=t,this.found=!1}return t.prototype["@@transducer/init"]=be,t.prototype["@@transducer/result"]=function(t){return this.found||(t=this.xf["@@transducer/step"](t,void 0)),this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,e){return this.f(e)&&(this.found=!0,t=er(this.xf["@@transducer/step"](t,e))),t},t}();function un(t){return function(e){return new on(t,e)}}var an=wt(he(["find"],un,function(t,e){for(var r=0,n=e.length;rt.length)&&(e=t.length);for(var r=0,n=Array(e);r2&&void 0!==arguments[2]?arguments[2]:[],n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;if(Array.isArray(t))t.forEach(function(t,o){if(n){var i=$r(function(t){return Bt("{}",t)},n);if(-1!==i){var u=Zr(0,i,n),a=Zr(i,n.length,n);if(u.length)Sn(ne(u,t),e,tr(r,tr([o],u)),a);else{var c,s=a.map(function(t){return t.replace("{}","")}).filter(function(t){return t}),l=tr([o],s);for(var f in c=s.length?ne(s,t):t){var p=c[f];Sn(p,e,tr(r,l.concat([f])))}}}else Sn(ne(n,t),e,tr(r,tr([o],n)))}else Sn(t,e,yn(o,r))});else if("Object"===Rt(t)){e(t,r);var o=ne(On,t);if(o){var i=tr(r,On);Sn(o,e,i)}Vt([],[t.namespace,t.type],window.__dashprivate_childrenProps).forEach(function(n){if(n.includes("[]")){var o=(w=n.split("[]").map(function(t){return t.split(".").filter(function(t){return t})}),O=2,function(t){if(Array.isArray(t))return t}(w)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,u,a=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(a.push(n.value),a.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(u=r.return(),Object(u)!==u))return}finally{if(s)throw o}}return a}}(w,O)||mn(w,O)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),i=o[0],u=o[1],a=tr(["props"],i),c=tr(r,a);Sn(ne(a,t),e,c,u)}else if(n.includes("{}")){for(var s=n.split("."),l=[],f=[],p=!1,y=0;y-1&&r.splice(n,1)}}},{key:"emit",value:function(t){for(var e=this,r=arguments.length,n=new Array(r>1?r-1:0),o=1;o=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,u=!0,a=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return u=t.done,t},e:function(t){a=!0,i=t},f:function(){try{u||null==r.return||r.return()}finally{if(a)throw i}}}}function Rn(t,e){if(t){if("string"==typeof t)return Dn(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Dn(t,e):void 0}}function Dn(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);ro?1:ne?1:t0;[[e,"Input"],[r,"State"]].forEach(function(e){var r=In(e,2),a=r[0],c=r[1];a.forEach(function(e,r){var a=ro(e.id),s=a.matchKeys,l=a.allsmallerKeys,f=u?s.concat(l):l,p=vr(f,i);if(p.length){p.sort();var y=t.length?"Output 0 (".concat(Oo(t[0]),")"):"the (absent) Output";o("`Input` / `State` wildcards not in `Output`s",[n,"".concat(c," ").concat(r," (").concat(Oo(e),")"),"has MATCH or ALLSMALLER on key(s) ".concat(p.join(", ")),"where ".concat(y),"does not have a MATCH wildcard. Inputs and State do not","need every MATCH from the Output(s), but ALLSMALLER","requires a matching MATCH in the Output(s), and when","the Output(s) have any MATCH, Input/State MATCH keys","must be a subset of them."])}})})}(i,o,u,c,e))})}(a,function(t,r){c=!0,e(t,r)});var s={},l={},f=new Map,p=new Map,y={},d={},h={MultiGraph:n,outputMap:s,inputMap:l,outputPatterns:y,inputPatterns:d,callbacks:a};if(c)return h;function v(t,e){var r=[{}];return _r(function(t,n){var o=i[n].vals,u=o.indexOf(e[n]),a=[t];t&&t.wild&&(a=t===qn?u>0?o.slice(0,u):[]:-1===u||t===Un?o:[e[n]]),r=Gr(Gr([Zt(n)],a),r)},t),r}a.forEach(function(t){var e=t.outputs,r=t.inputs;e.concat(r).filter(function(t){return"object"===Nn(t.id)}).forEach(function(t){_r(function(t,e){i[e]||(i[e]={exact:[],expand:0});var r=i[e];t&&t.wild?t.expand&&(r.expand+=1):-1===r.exact.indexOf(t)&&r.exact.push(t)},t.id)})}),_r(function(t){var e=t.exact,r=t.expand,n=e.slice().sort(zn);if(r)for(var o=0;o2&&void 0!==arguments[2])||arguments[2];r.validate_callbacks&&(n.addNode(t),n.addDependency(t,e),o&&(g[g.length-1].push(t),w[w.length-1].push(e)))}a.forEach(function(t){var e=t.outputs,o=t.inputs;function i(t,e){r.validate_callbacks&&(n.addNode(e),o.forEach(function(r){var n=r.id,o=r.property;"object"===Nn(n)?v(n,t).forEach(function(t){O(Oo({id:t,property:o}),e)}):O(Oo(r),e)}))}g.push([]),w.push([]);var u=ro(e.length?e[0].id:void 0).matchKeys,a=$r(function(t){return!io(t.id)},e),c=Wr({matchKeys:u,firstSingleOutput:a,outputs:e},t);e.forEach(function(t){var e,n=t.id,u=t.property;if(r.validate_callbacks&&(e=function(t,e){var r=t.id,n=t.property;return e.some(function(e){var o=e.id,i=e.property;if(n!==i||Nn(r)!==Nn(o))return!1;if("string"==typeof r){if(r===o)return!0}else if(to(e,[t]))return!0;return!1})}(t,o)),"object"===Nn(n))r.validate_callbacks&&v(n,{}).forEach(function(t){var r={id:t,property:u},n=Oo(r);e&&(m.push(r),n+=b),i(t,n)}),Qn(f,n,u,c);else{if(r.validate_callbacks){var a=Oo(t);e&&(m.push(t),a+=b),i({},a)}Yn(s,n,u,c)}}),o.forEach(function(t){var e=t.id,r=t.property;"object"===Nn(e)?Qn(p,e,r,c):Yn(l,e,r,c)})}),y=Xn(f,y),d=Xn(p,d),m.forEach(function(t){for(var e=Oo(t),r=e.concat(b),n=0;n3&&void 0!==arguments[3]?arguments[3]:"";return function(o){var i=o.matchKeys,u=o.firstSingleOutput,a=o.outputs;if(i.length){var c=a[u];if(c)ao(o,c,t(e)(c),r);else{var s={};a.forEach(function(n){var u=t(e)(n).filter(function(t){var e=JSON.stringify(ye(i,t.id));return!s[e]&&(s[e]=1,!0)});ao(o,n,u,r)})}}else{var l=ko(o,t,n);r.push(l)}}}function so(t){return so="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},so(t)}function lo(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function fo(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);r5&&void 0!==arguments[5])||arguments[5],u=[],a=Oo({id:r,property:n});if("string"==typeof r){var c=(t.inputMap[r]||{})[n];if(!c)return[];c.forEach(co(xo(),e,u))}else{var s=Object.keys(r).sort(),l=ye(s,r),f=s.join(","),p=(t.inputPatterns[f]||{})[n];if(!p)return[];p.forEach(function(t){if(no(s,l,t.values)){var r=oo(t.values,l);t.callbacks.forEach(co(xo(s,l,t.values),e,u,r))}})}return u.forEach(function(r){r.changedPropIds[a]=o||mo,i&&(r.priority=jo(t,e,r))}),u}function jo(t,e,r){for(var n=[r],o={},i={},u=[];n.length;){n=Oe(function(t){var e=i[t.resolvedId];return i[t.resolvedId]=!0,e},n);var a=Oe(function(t){return!o[Oo(t)]},Ee(Re(function(t){return Ee(t.getOutputs(e))},n)));a.forEach(function(t){return o[Oo(t)]=!0}),(n=Ee(Re(function(r){var n=r.id,o=r.property;return So(t,e,n,o,go,!1)},a))).length&&u.push(n.length)}return u.unshift(u.length),Re(function(t){return Math.min(t,35).toString(36)},u).join("")}var _o=function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(!e.length)return[];var o=Re(Oo,$e(function(e,r){return tr(e,Ee(r.getOutputs(t)))},[],r)),i={};if(o.forEach(function(t){return i[t]=!0}),Object.keys(n).length){var u=Ee(Re(function(e){return function(t,e,r){for(var n=[r],o={};n.length;){var i=Oe(function(t){return!o[Oo(t)]},Ee(Re(function(t){return Ee(t.getOutputs(e))},n)));o=$e(function(t,e){return Zt(Oo(e),!0,t)},o,i),n=Ee(Re(function(r){var n=r.id,o=r.property;return So(t,e,n,o,go,!1)},i))}return o}(n,t,e)},r));u.length>0&&(i=Object.assign.apply(Object,[u[0]].concat(ho(u))))}return Oe(function(e){return ir(function(t){return!i[Oo(t)]},function(t,e){return t.filter(function(t){return!e.some(function(e){return Oo(t)===Oo(e)})})}(Ee(e.getInputs(t)),Ee(e.getOutputs(t))))},e)},Eo=function(t,e,r,n){for(var o=[],i=function(t,e,r,n){var o=n.outputsOnly,i=n.removedArrayInputsOnly,u=n.newPaths,a=n.chunkPath,c={},s=[];function l(t){if(t){var e=c[t.resolvedId];if(void 0!==e){var r=s[e];r.changedPropIds=wo(r.changedPropIds,t.changedPropIds),t.initialCall&&(r.initialCall=!0)}else c[t.resolvedId]=s.length,s.push(t)}}function f(r,n,c){if(n)for(var s in n){var f=uo(t,0,r,s);f&&(f.callback.prevent_initial_call||(f.initialCall=!0,l(f)))}if(!o&&c){var p=i?(h=Wn(r),function(t){return t.getInputs(e).some(function(e){return!(!Array.isArray(e)||!e.some(function(t){return Wn(t.id)===h})||(Ee(t.getOutputs(u)).length&&(t.initialCall=!0,t.changedPropIds={},l(t)),0))})}):l,y=p;for(var d in a&&(y=function(t){ir(en(a),cr("path",Ee(t.getOutputs(e))))||p(t)}),c)So(t,e,r,d,go).forEach(y)}var h}return Sn(r,function(e){var r=ne(["props","id"],e);if(r)if("string"!=typeof r||i){var n=Object.keys(r).sort().join(",");f(r,!i&&t.outputPatterns[n],t.inputPatterns[n])}else f(r,t.outputMap[r],t.inputMap[r])}),Re(function(r){return Tn(Tn({},r),{},{priority:jo(t,e,r)})},s)}(t,e,r,n);;){var u=yo(pr(function(t){var r=t.callback.inputs,n=t.getInputs;return ir(io,r)||!ae(vr(Re(Oo,Ee(n(e))),o))},i),2),a=u[0],c=u[1];if(!c.length)break;i=a,o=tr(o,Re(Oo,Ee(Re(function(t){return(0,t.getOutputs)(e)},c))))}if(n.filterRoot){var s=ne(["props","id"],r);s&&(s=Wn(s),i=i.filter(function(t){return t.callback.inputs.reduce(function(t,e){return t||Wn(e.id)==s&&n.filterRoot.includes(e.property)},!1)}))}var l=Math.random().toString(16);return Re(function(t){return fo(fo({},t),{},{executionGroup:l})},i)},Po=function(t){var e=t.anyVals,r=t.callback,n=r.inputs,o=r.outputs,i=r.state,u=r.output,a=Re(Oo,[].concat(ho(n),ho(o),ho(i)));return 0===o.length&&u&&a.push(u),tr(a,Array.isArray(e)?e:""===e?[]:[e]).join(",")};function Ao(t,e,r,n){return Ee(Re(function(e){return So(r,n,t,e)},Ct(e)))}var ko=function(t,e,r){return{callback:t,anyVals:r,resolvedId:t.output+r,getOutputs:function(r){return t.outputs.map(e(r))},getInputs:function(r){return t.inputs.map(e(r))},getState:function(r){return t.state.map(e(r))},changedPropIds:{},initialCall:!1}};function To(t,e){var r=yo(pr(function(t){var r=t.getOutputs,n=t.callback.outputs;return Ee(r(e)).length===n.length},t),2)[1],n=yo(pr(function(t){var r=t.getOutputs;return!Ee(r(e)).length},r),2)[1];return{added:Re(function(t){return Zt("changedPropIds",br(function(t,r){return Pn(e,$n(r).id)},t.changedPropIds),t)},n),removed:r}}function xo(t,e,r){return function(n){return function(o){var i=o.id,u=o.property;if("string"==typeof i){var a=Pn(n,i);return a?[{id:i,property:u,path:a}]:[]}var c=Object.keys(i).sort(),s=ye(c,i),l=c.join(","),f=n.objs[l];if(!f)return[];var p=[];return f.forEach(function(n){var o=n.values,i=n.path;no(c,o,s,t,e,r)&&p.push({id:gr(c,o),property:u,path:i})}),p}}}var Io={ON_PROP_CHANGE:1,SET_REQUEST_QUEUE:1,SET_GRAPHS:1,SET_PATHS:1,SET_LAYOUT:1,SET_APP_LIFECYCLE:1,SET_CONFIG:1,ADD_HTTP_HEADERS:1,ON_ERROR:1,SET_HOOKS:1,INSERT_COMPONENT:1,REMOVE_COMPONENT:1,RESET_COMPONENT_STATE:1},Co=function(t){if(Io[t])return t;throw new Error("".concat(t," is not defined."))};function Ro(t){var e={STARTED:"STARTED",HYDRATED:"HYDRATED",DESTROYED:"DESTROYED"};if(e[t])return e[t];throw new Error("".concat(t," is not a valid app state."))}var Do,No,Mo=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Ro("STARTED"),e=arguments.length>1?arguments[1]:void 0;return e.type===Co("SET_APP_LIFECYCLE")?Ro(e.payload):t};function Uo(t){return Uo="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Uo(t)}function Lo(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function qo(t){for(var e=1;e1?arguments[1]:void 0;return $e(function(t,e){return null===e?t:e.type===No.AddCompleted?function(t,e){return qo(qo({},t),{},{completed:t.completed+e.payload})}(t,e):function(t,e){var r=Fo[e.type],n=Ho[e.type];return r&&n&&0!==e.payload.length?qo(qo({},t),{},{[n]:r(t[n],e.payload)}):t}(t,e)},arguments.length>0&&void 0!==arguments[0]?arguments[0]:Bo,t.type===No.Aggregate?t.payload:[t])},Jo=Ft(function t(e,r,n){return se(function(r,n,o){return oe(n)&&oe(o)?t(e,n,o):e(r,n,o)},r,n)}),Wo=Jo,zo=wt(function(t,e){return Wo(function(t,e,r){return r},t,e)});function Vo(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=arguments.length>1?arguments[1]:void 0;return e.type===Co("SET_CONFIG")?(window.__dashprivate_childrenProps=zo(window.__dashprivate_childrenProps||{},e.payload.children_props),e.payload):e.type===Co("ADD_HTTP_HEADERS")?zo(t,{fetch:{headers:e.payload}}):t}var Ko={},Yo=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Ko,e=arguments.length>1?arguments[1]:void 0;return"SET_GRAPHS"===e.type?e.payload:t};function Qo(t){return function(t){if(Array.isArray(t))return Xo(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return Xo(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Xo(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Xo(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r0&&void 0!==arguments[0]?arguments[0]:Zo,e=arguments.length>1?arguments[1]:void 0;switch(e.type){case"ON_ERROR":var r=t.frontEnd,n=t.backEnd,o=t.backEndConnected;return console.error(e.payload.error),"frontEnd"===e.payload.type?{frontEnd:[Wr(e.payload,{timestamp:new Date})].concat(Qo(r)),backEnd:n,backEndConnected:o}:"backEnd"===e.payload.type?{frontEnd:r,backEnd:[Wr(e.payload,{timestamp:new Date})].concat(Qo(n)),backEndConnected:o}:t;case"SET_CONNECTION_STATUS":return Wr(t,{backEndConnected:e.payload});default:return t}}function ei(t){return function(t){if(Array.isArray(t))return ri(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return ri(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?ri(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ri(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r0&&void 0!==arguments[0]?arguments[0]:ni;switch((arguments.length>1?arguments[1]:void 0).type){case"UNDO":var e=t.past,r=t.present,n=t.future,o=e[e.length-1];return{past:e.slice(0,e.length-1),present:o,future:[r].concat(ei(n))};case"REDO":var i=t.past,u=t.present,a=t.future,c=a[0],s=a.slice(1);return{past:[].concat(ei(i),[u]),present:c,future:s};case"REVERT":var l=t.past,f=t.future,p=l[l.length-1];return{past:l.slice(0,l.length-1),present:p,future:ei(f)};default:return t}},ii=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{layout_pre:null,layout_post:null,request_pre:null,request_post:null,callback_resolved:null,request_refresh_jwt:null,bear:!1},e=arguments.length>1?arguments[1]:void 0;return"SET_HOOKS"===e.type?e.payload:t};function ui(t){return ui="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},ui(t)}function ai(t,e,r){if(r||(r=new si),o=ui(n=t),null==n||"object"!=o&&"function"!=o)return t;var n,o,i,u=function(n){var o=r.get(t);if(o)return o;for(var i in r.set(t,n),t)Object.prototype.hasOwnProperty.call(t,i)&&(n[i]=e?ai(t[i],!0,r):t[i]);return n};switch(Rt(t)){case"Object":return u(Object.create(Object.getPrototypeOf(t)));case"Array":return u(Array(t.length));case"Date":return new Date(t.valueOf());case"RegExp":return i=t,new RegExp(i.source,i.flags?i.flags:(i.global?"g":"")+(i.ignoreCase?"i":"")+(i.multiline?"m":"")+(i.sticky?"y":"")+(i.unicode?"u":"")+(i.dotAll?"s":""));case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":return t.slice();default:return t}}var ci,si=function(){function t(){this.map={},this.length=0}return t.prototype.set=function(t,e){var r=this.hash(t),n=this.map[r];n||(this.map[r]=n=[]),n.push([t,e]),this.length+=1},t.prototype.hash=function(t){var e=[];for(var r in t)e.push(Object.prototype.toString.call(t[r]));return e.join()},t.prototype.get=function(t){if(this.length<=180){for(var e in this.map)for(var r=this.map[e],n=0;n0&&void 0!==arguments[0]?arguments[0]:mi,e=arguments.length>1?arguments[1]:void 0;if("UPDATE_RESOURCE_USAGE"===e.type){var r=e.payload,n=r.id,o=r.usage,i=r.status,u=hi[i]||i,a={updated:[n],resources:t.resources,callbacks:t.callbacks,graphLayout:t.graphLayout};a.callbacks[n]=a.callbacks[n]||li(bi);var c=a.callbacks[n],s=c.resources,l=a.resources;if(c.count+=1,c.status.latest=u,c.status[u]=(c.status[u]||0)+1,c.result=e.payload.result,c.inputs=e.payload.inputs,c.state=e.payload.state,o){var f=o.__dash_client,p=o.__dash_server,y=o.__dash_upload,d=o.__dash_download,h=function(t,e){if(null==t)return{};var r,n,o=function(t,e){if(null==t)return{};var r={};for(var n in t)if({}.hasOwnProperty.call(t,n)){if(-1!==e.indexOf(n))continue;r[n]=t[n]}return r}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n0&&void 0!==arguments[0]?arguments[0]:wi};!function(t){t.Set="IsLoading.Set"}(ci||(ci={}));var Si=function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],e=arguments.length>1?arguments[1]:void 0;return e.type===ci.Set?e.payload:t},ji=function(t){return{value:t,"fantasy-land/map":function(){return this}}},_i=wt(function(t,e){return t(ji)(e).value}),Ei=wt(function(t,e){return function(r){return function(n){return Re(function(t){return e(t,n)},r(t(n)))}}}),Pi=nt(function(t){return Ei(function(e){return Wt(t,e)},Xt(t))}),Ai=Ft(function(t,e,r){var n=Array.prototype.slice.call(r,0);return n.splice(t,e),n}),ki=wt(function t(e,r){if(null==r)return r;switch(e.length){case 0:return r;case 1:return function(t,e){if(null==e)return e;if(Ht(t)&&Kt(e))return Ai(t,1,e);var r={};for(var n in e)r[n]=e[n];return delete r[t],r}(e[0],r);default:var n=e[0],o=Array.prototype.slice.call(e,1);return null==r[n]?function(t,e){if(Ht(t)&&Kt(e))return[].concat(e);var r={};for(var n in e)r[n]=e[n];return r}(n,r):Zt(n,t(o,r[n]),r)}});function Ti(t){return Ti="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ti(t)}function xi(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function Ii(t,e,r){return(e=function(t){var e=function(t){if("object"!=Ti(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=Ti(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==Ti(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function Ci(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r0&&void 0!==arguments[0]?arguments[0]:{components:[]},r=arguments.length>1?arguments[1]:void 0;if(r.type===Co("SET_LAYOUT"))return Array.isArray(r.payload)?e.components=function(t){if(Array.isArray(t))return Ci(t)}(t=r.payload)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return Ci(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Ci(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}():e.components=function(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:Di,e=arguments.length>1?arguments[1]:void 0;return e.type===Co("SET_PATHS")?e.payload:t},Mi=wt(function(t,e){return ki([t],e)});function Ui(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;switch(e.type){case"ADD_CALLBACK_JOB":return function(t,e){return Zt(t.jobId,t,e)}(e.payload,t);case"REMOVE_CALLBACK_JOB":return function(t,e){return Mi(t,e)}(e.payload.jobId,t);case"CALLBACK_JOB_OUTDATED":return function(t,e){return Xt([t,"outdated"],!0,e)}(e.payload.jobId,t);default:return t}}function Li(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;switch(e.type){case"LOADED":return e.payload.reduce(function(t,e){var r=[JSON.stringify(e.path)],n=Vt([],r,t);return Xt(r,n.filter(function(t){return t.property!==e.property}),t)},t);case"LOADING":return e.payload.reduce(function(t,e){var r=[JSON.stringify(e.path)],n=Vt([],r,t);return Bt(e,n)||n.push(e),Xt(r,n,t)},t);default:return t}}var qi=wt(function(t,e){return Ie(t+1,function(){var r=arguments[t];if(null!=r&&Je(r[e]))return r[e].apply(r,Array.prototype.slice.call(arguments,0,t));throw new TypeError(Ze(r)+' does not have a method named "'+e+'"')})}),Gi=qi(1,"join");function Bi(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);rt.length)&&(e=t.length);for(var r=0,n=Array(e);r0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;if(Bt(e.type,["UNDO_PROP_CHANGE","REDO_PROP_CHANGE","ON_PROP_CHANGE"])){var r=$i(e.payload.itempath),n=Vt(0,[r,"hash"],t);t=Zt(r,{hash:n+1,changedProps:e.payload.props,renderType:e.payload.renderType},t)}else if("RESET_COMPONENT_STATE"===e.type){var o=e.payload.itempath;if(o){var i=$i(o);return Object.fromEntries(Object.entries(t).filter(function(t){return!(e=t,r=1,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,u,a=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(a.push(n.value),a.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(u=r.return(),Object(u)!==u))return}finally{if(s)throw o}}return a}}(e,r)||Wi(e,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0].startsWith(i);var e,r}))}}return t};function Yi(){var t={appLifecycle:Mo,callbacks:$o,config:Vo,error:ti,graphs:Yo,history:oi,hooks:ii,profile:gi,changed:Oi,isLoading:Si,layout:Ri,paths:Ni,layoutHashes:Ki,loading:Li};return re(function(e){var r;t[e]=(r=e,function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0,n=t;if(e.type===r){var o=e.payload,i=o.id,u={status:o.status,content:o.content};n=Array.isArray(i)?Xt(i,u,t):i?Zt(i,u,t):Wr(t,u)}return n})},Vi),t.callbackJobs=Ui,function(t){for(var e=Object.keys(t),r={},n=0;n1?r-1:0),o=1;ot.length)&&(e=t.length);for(var r=0,n=Array(e);r3?(o=d===n)&&(c=i[(a=i[4])?5:(a=3,3)],i[4]=i[5]=t):i[0]<=y&&((o=r<2&&yn||n>d)&&(i[4]=r,i[5]=n,p.n=d,a=0))}if(o||r>1)return u;throw f=!0,n}return function(o,l,d){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&y(l,d),a=l,c=d;(e=a<2?t:c)||!f;){i||(a?a<3?(a>1&&(p.n=-1),y(a,c)):p.n=c:p.v=c);try{if(s=2,i){if(a||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,a<2&&(a=0)}else 1===a&&(e=i.return)&&e.call(i),a<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),a=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==u)break}catch(e){i=t,a=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var u={};function a(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):($u(e={},n,function(){return this}),e),f=s.prototype=a.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,$u(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,$u(f,"constructor",s),$u(s,"constructor",c),c.displayName="GeneratorFunction",$u(s,o,"GeneratorFunction"),$u(f),$u(f,o,"Generator"),$u(f,n,function(){return this}),$u(f,"toString",function(){return"[object Generator]"}),(Hu=function(){return{w:i,m:p}})()}function $u(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}$u=function(t,e,r,n){function i(e,r){$u(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},$u(t,e,r,n)}function Ju(t,e,r,n,o,i,u){try{var a=t[i](u),c=a.value}catch(t){return void r(t)}a.done?e(c):Promise.resolve(c).then(n,o)}function Wu(t){return function(t){if(Array.isArray(t))return zu(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return zu(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?zu(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function zu(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r3?(o=d===n)&&(c=i[(a=i[4])?5:(a=3,3)],i[4]=i[5]=t):i[0]<=y&&((o=r<2&&yn||n>d)&&(i[4]=r,i[5]=n,p.n=d,a=0))}if(o||r>1)return u;throw f=!0,n}return function(o,l,d){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&y(l,d),a=l,c=d;(e=a<2?t:c)||!f;){i||(a?a<3?(a>1&&(p.n=-1),y(a,c)):p.n=c:p.v=c);try{if(s=2,i){if(a||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,a<2&&(a=0)}else 1===a&&(e=i.return)&&e.call(i),a<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),a=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==u)break}catch(e){i=t,a=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var u={};function a(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(Da(e={},n,function(){return this}),e),f=s.prototype=a.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,Da(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,Da(f,"constructor",s),Da(s,"constructor",c),c.displayName="GeneratorFunction",Da(s,o,"GeneratorFunction"),Da(f),Da(f,o,"Generator"),Da(f,n,function(){return this}),Da(f,"toString",function(){return"[object Generator]"}),(Ra=function(){return{w:i,m:p}})()}function Da(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}Da=function(t,e,r,n){function i(e,r){Da(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},Da(t,e,r,n)}function Na(t,e,r,n,o,i,u){try{var a=t[i](u),c=a.value}catch(t){return void r(t)}a.done?e(c):Promise.resolve(c).then(n,o)}var Ma=it(console.warn),Ua={GET:function(t,e,r,n){return fetch(t,zo(e,{method:"GET",headers:sa(n)}))},POST:function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return fetch(t,zo(e,{method:"POST",headers:sa(arguments.length>3?arguments[3]:void 0),body:r?JSON.stringify(r):null}))}};function La(t,e,r,n,o){return function(){var i,u=(i=Ra().m(function i(u,a){var c,s,l,f,p,y,d,h,v,b,m;return Ra().w(function(i){for(;;)switch(i.p=i.n){case 0:y=function(t){a().error.backEndConnected!==t&&u({type:"SET_CONNECTION_STATUS",payload:t})},c=a(),s=c.config,l=c.hooks,f=null,p="".concat(wn(s)).concat(t),u({type:r,payload:{id:n,status:"loading"}}),i.p=1,h=0;case 2:if(!(h<=1)){i.n=11;break}return i.p=3,i.n=4,Ua[e](p,s.fetch,o,s);case 4:d=i.v,i.n=6;break;case 5:return i.p=5,i.v,console.log("fetch error",d),y(!1),i.a(2);case 6:if(401!==d.status&&400!==d.status){i.n=9;break}if(!l.request_refresh_jwt){i.n=9;break}return i.n=7,d.text();case 7:if(!i.v.includes(fi)){i.n=9;break}return i.n=8,l.request_refresh_jwt(s.fetch.headers.Authorization.substr(7));case 8:if(!(v=i.v)){i.n=9;break}return f={Authorization:"Bearer ".concat(v)},s=zo(s,{fetch:{headers:f}}),i.a(3,10);case 9:return i.a(3,11);case 10:h++,i.n=2;break;case 11:if(b=d.headers.get("content-type"),f&&u(Qu(f)),y(!0),!b||-1===b.indexOf("application/json")){i.n=12;break}return i.a(2,d.json().then(function(t){return u({type:r,payload:{status:d.status,content:t,id:n}}),t}));case 12:return i.n=13,d.text();case 13:return m=i.v,Ma("Response is missing header: content-type: application/json"),i.a(2,u({type:r,payload:{id:n,status:d.status,content:m}}));case 14:i.p=14,ha(i.v,"Error from API call: "+t,u);case 15:return i.a(2)}},i,null,[[3,5],[1,14]])}),function(){var t=this,e=arguments;return new Promise(function(r,n){var o=i.apply(t,e);function u(t){Na(o,r,n,u,a,"next",t)}function a(t){Na(o,r,n,u,a,"throw",t)}u(void 0)})});return function(t,e){return u.apply(this,arguments)}}()}function qa(t){return qa="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},qa(t)}function Ga(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function Ba(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,u=!0,a=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return u=t.done,t},e:function(t){a=!0,i=t},f:function(){try{u||null==r.return||r.return()}finally{if(a)throw i}}}}function tc(t,e){if(t){if("string"==typeof t)return ec(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?ec(t,e):void 0}}function ec(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r3?(o=d===n)&&(c=i[(a=i[4])?5:(a=3,3)],i[4]=i[5]=t):i[0]<=y&&((o=r<2&&yn||n>d)&&(i[4]=r,i[5]=n,p.n=d,a=0))}if(o||r>1)return u;throw f=!0,n}return function(o,l,d){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&y(l,d),a=l,c=d;(e=a<2?t:c)||!f;){i||(a?a<3?(a>1&&(p.n=-1),y(a,c)):p.n=c:p.v=c);try{if(s=2,i){if(a||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,a<2&&(a=0)}else 1===a&&(e=i.return)&&e.call(i),a<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),a=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==u)break}catch(e){i=t,a=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var u={};function a(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(nc(e={},n,function(){return this}),e),f=s.prototype=a.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,nc(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,nc(f,"constructor",s),nc(s,"constructor",c),c.displayName="GeneratorFunction",nc(s,o,"GeneratorFunction"),nc(f),nc(f,o,"Generator"),nc(f,n,function(){return this}),nc(f,"toString",function(){return"[object Generator]"}),(rc=function(){return{w:i,m:p}})()}function nc(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}nc=function(t,e,r,n){function i(e,r){nc(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},nc(t,e,r,n)}function oc(t,e,r,n,o,i,u){try{var a=t[i](u),c=a.value}catch(t){return void r(t)}a.done?e(c):Promise.resolve(c).then(n,o)}function ic(t){return function(){var e=this,r=arguments;return new Promise(function(n,o){var i=t.apply(e,r);function u(t){oc(i,n,o,u,a,"next",t)}function a(t){oc(i,n,o,u,a,"throw",t)}u(void 0)})}}function uc(t,e){for(var r=0;r=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}}}throw new TypeError(dc(t)+" is not iterable")}function vc(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function i(r,n,o,i){var c=n&&n.prototype instanceof a?n:a,s=Object.create(c.prototype);return bc(s,"_invoke",function(r,n,o){var i,a,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:y,f:y.bind(t,4),d:function(e,r){return i=e,a=0,c=t,p.n=r,u}};function y(r,n){for(a=r,c=n,e=0;!f&&s&&!o&&e3?(o=d===n)&&(c=i[(a=i[4])?5:(a=3,3)],i[4]=i[5]=t):i[0]<=y&&((o=r<2&&yn||n>d)&&(i[4]=r,i[5]=n,p.n=d,a=0))}if(o||r>1)return u;throw f=!0,n}return function(o,l,d){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&y(l,d),a=l,c=d;(e=a<2?t:c)||!f;){i||(a?a<3?(a>1&&(p.n=-1),y(a,c)):p.n=c:p.v=c);try{if(s=2,i){if(a||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,a<2&&(a=0)}else 1===a&&(e=i.return)&&e.call(i),a<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),a=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==u)break}catch(e){i=t,a=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var u={};function a(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(bc(e={},n,function(){return this}),e),f=s.prototype=a.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,bc(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,bc(f,"constructor",s),bc(s,"constructor",c),c.displayName="GeneratorFunction",bc(s,o,"GeneratorFunction"),bc(f),bc(f,o,"Generator"),bc(f,n,function(){return this}),bc(f,"toString",function(){return"[object Generator]"}),(vc=function(){return{w:i,m:p}})()}function bc(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}bc=function(t,e,r,n){function i(e,r){bc(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},bc(t,e,r,n)}function mc(t,e,r,n,o,i,u){try{var a=t[i](u),c=a.value}catch(t){return void r(t)}a.done?e(c):Promise.resolve(c).then(n,o)}function gc(t){return function(){var e=this,r=arguments;return new Promise(function(n,o){var i=t.apply(e,r);function u(t){mc(i,n,o,u,a,"next",t)}function a(t){mc(i,n,o,u,a,"throw",t)}u(void 0)})}}function wc(t){return function(t){if(Array.isArray(t))return jc(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||Sc(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Oc(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,u,a=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(a.push(n.value),a.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(u=r.return(),Object(u)!==u))return}finally{if(s)throw o}}return a}}(t,e)||Sc(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Sc(t,e){if(t){if("string"==typeof t)return jc(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?jc(t,e):void 0}}function jc(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r5&&void 0!==arguments[5]&&arguments[5],u="Input"===o?r.getInputs:r.getState,a=[],c=0,s=u(t).map(function(i,u){var s=Oc(zc(t,i.map(function(t){var r=t.id,n=t.property,o=t.path;return{id:r,property:n,value:ne([].concat(wc(o),["props",n]),e)}}),n[u],r.anyVals,o),2),l=s[0],f=s[1];return io(n[u])&&!l.length&&c++,f&&a.push(f),l});if(a.length){if(i&&a.length+c===s.length)return null;Kc(a,t)}return s}function Kc(t,e){var r=t[0];throw-1!==r.indexOf("logged above")&&console.error(e.objs),new ReferenceError(r)}var Yc=function(t){return Array.isArray(t)?cr("value",t):t.value},Qc=function(t,e){return Array.isArray(t)?e===window.dash_clientside.no_update?Er(t,[e]):Er(t,e):[[t,e]]};function Xc(t){return t.split("@")[0]}function Zc(t,e,r,n){return ts.apply(this,arguments)}function ts(){return ts=gc(vc().m(function t(e,r,n,o){var i,u,a,c,s,l,f,p,y,d,h,v,b,m,g,w,O,S;return vc().w(function(t){for(;;)switch(t.p=t.n){case 0:if((i=window.dash_clientside=window.dash_clientside||{}).no_update||(Object.defineProperty(i,"no_update",{value:{description:"Return to prevent updating an Output."},writable:!1}),Object.defineProperty(i,"PreventUpdate",{value:{description:"Throw to prevent updating all Outputs."},writable:!1})),u=o.inputs,a=o.outputs,c=o.state,s=Date.now(),l=is(u),f=is(c),p={},y=pi,t.p=1,v=r.namespace,b=r.function_name,m=u.map(Yc),c&&(m=tr(m,c.map(Yc))),i.callback_context={},i.callback_context.triggered=o.changedPropIds.map(function(t){return{prop_id:t,value:l[t]}}),i.callback_context.triggered_id=us(o.changedPropIds),i.callback_context.inputs_list=u,i.callback_context.inputs=l,i.callback_context.states_list=c,i.callback_context.states=f,i.callback_context.outputs_list=a,g=(d=i[v])[b].apply(d,wc(m)),delete i.callback_context,"function"!=typeof(null===(h=g)||void 0===h?void 0:h.then)){t.n=3;break}return t.n=2,g;case 2:g=t.v;case 3:a&&Qc(a,g).forEach(function(t){var e=Oc(t,2),r=e[0],n=e[1];Qc(r,n).forEach(function(t){var e=Oc(t,2),r=e[0],n=e[1],o=r.id,u=r.property,a=Wn(o),c=p[a]=p[a]||{};n!==i.no_update&&(c[Xc(u)]=n)})}),t.n=6;break;case 4:if(t.p=4,(S=t.v)!==i.PreventUpdate){t.n=5;break}y=yi,t.n=6;break;case 5:throw y="CLIENTSIDE_ERROR",S;case 6:return t.p=6,delete i.callback_context,w=Date.now()-s,O={__dash_server:w,__dash_client:w,__dash_upload:0,__dash_download:0},n.ui&&e(Hc({id:o.output,usage:O,status:y,result:p,inputs:u,state:c})),t.f(6);case 7:return t.a(2,p)}},t,null,[[1,4,6,7]])})),ts.apply(this,arguments)}function es(t,e){return function(r,n){au(t).reduce(function(t,r,o){var i,u=Oc(r,2),a=u[0],c=u[1],s=a,l=[];if(a.startsWith("{")){var f=Oc(Ja(a),2);s=f[0],i=f[1],l=function(t,e,r,n){var o=[],i={};return au(t).forEach(function(u){var a,c,s=(c=2,function(t){if(Array.isArray(t))return t}(a=u)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,u,a=[],c=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(a.push(n.value),a.length!==e);c=!0);}catch(t){s=!0,o=t}finally{try{if(!c&&null!=r.return&&(u=r.return(),Object(u)!==u))return}finally{if(s)throw o}}return a}}(a,c)||function(t,e){if(t){if("string"==typeof t)return $a(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?$a(t,e):void 0}}(a,c)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),l=s[0],f=s[1];if(!o.length)if(Array.isArray(f)){var p=(e.parsedChangedPropsIds[r]||e.parsedChangedPropsIds[0])[l];f.includes("MATCH")?i[l]=p:f.includes("ALL")?o=Wa(t,n(),l):f.includes("ALLSMALLER")&&(o=Wa(t,n(),l).filter(function(t){return t[l]t.length)&&(e=t.length);for(var r=0,n=Array(e);r3&&void 0!==arguments[3]&&arguments[3],c=En(t,i,r().paths);e(ea(c)),o=tr(o,Eo(l,c,t,{chunkPath:i,filterRoot:a}).map(function(t){return ls(ls({},t),{},{predecessors:u})})),o=tr(o,Eo(l,p,n,{removedArrayInputsOnly:!0,newPaths:c,chunkPath:i,filterRoot:a}).map(function(t){return ls(ls({},t),{},{predecessors:u})}))},m=!1;["children"].concat(v).forEach(function(t){if(!m)if(t.includes("[]")){var e=ps(t.split("[]").map(function(t){return t.split(".").filter(function(t){return t})}),1)[0];if(!ne(e,y))return;b(ls(ls({},h),{},{props:ls(ls({},h.props),y)}),h,d,Ct(y)),m=!0}else{var r=t.split("."),n=ne(r,y);if(!n)return;var o=tr(Pn(p,c),["props"].concat(r)),i=ne(o,f);b(n,i,o)}});var g=br(function(t,e){return!(e in a)},y);if(!ae(g)){var w=r(),O=w.graphs,S=w.paths;o=tr(o,Ao(i,g,O,S).map(function(t){return ls(ls({},t),{},{predecessors:u})}))}}}),i.push(ls(ls({},t),{},{executionMeta:{allProps:Re(Oo,Ee(t.getOutputs(r().paths))),updatedProps:Ee(Re(function(t){var e=ps(t,2),r=e[0],n=e[1];return Re(function(t){return Oo({id:r,property:t})},Ct(n))},au(f)))}}))),void 0!==p){var d;if(t.callback.no_output){var h=Ct(t.changedPropIds).join(", ");d="Callback error with no output from input ".concat(h)}else{var v=y?Re(Oo,Ee([y.outputs])).join(", "):s;d="Callback error updating ".concat(v)}if(c){var b=c.namespace,m=c.function_name;d+=" via clientside function ".concat(b,".").concat(m)}ha(p,d,e),i.push(ls(ls({},t),{},{executionMeta:{allProps:Re(Oo,Ee(t.getOutputs(r().paths))),updatedProps:[]}}))}}}),e(Fc([n.length?Nc(n):null,n.length?kc(n.length):null,i.length?Rc(i):null,o.length?Cc(o):null]))},inputs:["callbacks.executed"]},hs=ds;function vs(t){return vs="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},vs(t)}function bs(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function i(r,n,o,i){var c=n&&n.prototype instanceof a?n:a,s=Object.create(c.prototype);return ms(s,"_invoke",function(r,n,o){var i,a,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:y,f:y.bind(t,4),d:function(e,r){return i=e,a=0,c=t,p.n=r,u}};function y(r,n){for(a=r,c=n,e=0;!f&&s&&!o&&e3?(o=d===n)&&(c=i[(a=i[4])?5:(a=3,3)],i[4]=i[5]=t):i[0]<=y&&((o=r<2&&yn||n>d)&&(i[4]=r,i[5]=n,p.n=d,a=0))}if(o||r>1)return u;throw f=!0,n}return function(o,l,d){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&y(l,d),a=l,c=d;(e=a<2?t:c)||!f;){i||(a?a<3?(a>1&&(p.n=-1),y(a,c)):p.n=c:p.v=c);try{if(s=2,i){if(a||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,a<2&&(a=0)}else 1===a&&(e=i.return)&&e.call(i),a<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),a=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==u)break}catch(e){i=t,a=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var u={};function a(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(ms(e={},n,function(){return this}),e),f=s.prototype=a.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,ms(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,ms(f,"constructor",s),ms(s,"constructor",c),c.displayName="GeneratorFunction",ms(s,o,"GeneratorFunction"),ms(f),ms(f,o,"Generator"),ms(f,n,function(){return this}),ms(f,"toString",function(){return"[object Generator]"}),(bs=function(){return{w:i,m:p}})()}function ms(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}ms=function(t,e,r,n){function i(e,r){ms(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},ms(t,e,r,n)}function gs(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function ws(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);rt.length)&&(e=t.length);for(var r=0,n=Array(e);r3?(o=d===n)&&(c=i[(a=i[4])?5:(a=3,3)],i[4]=i[5]=t):i[0]<=y&&((o=r<2&&yn||n>d)&&(i[4]=r,i[5]=n,p.n=d,a=0))}if(o||r>1)return u;throw f=!0,n}return function(o,l,d){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&y(l,d),a=l,c=d;(e=a<2?t:c)||!f;){i||(a?a<3?(a>1&&(p.n=-1),y(a,c)):p.n=c:p.v=c);try{if(s=2,i){if(a||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,a<2&&(a=0)}else 1===a&&(e=i.return)&&e.call(i),a<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),a=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==u)break}catch(e){i=t,a=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var u={};function a(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(Us(e={},n,function(){return this}),e),f=s.prototype=a.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,Us(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,Us(f,"constructor",s),Us(s,"constructor",c),c.displayName="GeneratorFunction",Us(s,o,"GeneratorFunction"),Us(f),Us(f,o,"Generator"),Us(f,n,function(){return this}),Us(f,"toString",function(){return"[object Generator]"}),(Ms=function(){return{w:i,m:p}})()}function Us(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}Us=function(t,e,r,n){function i(e,r){Us(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},Us(t,e,r,n)}function Ls(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function qs(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);r(null!==(n=e.priority)&&void 0!==n?n:"")?-1:1},Vs=function(t,e){var r=(0,t.getOutputs)(e),n=Ee(r),o=[],i={};return n.forEach(function(t){var e=t.id,r=t.property,n=Wn(e);(i[n]=i[n]||[]).push(r),o.push(Oo({id:n,property:r}))}),{allOutputs:r,allPropIds:o}},Ks=function(t,e){var r=[].concat($s(Ee(t.getInputs(e))),$s(Ee(t.getState(e)))),n=new Map(r.map(function(t){return[Wn(t.id),t]}));return Array.from(n.values())},Ys={observer:function(){var t=Hs(Ms().m(function t(e){var r,n,o,i,u,a,c,s,l,f,p,y,d,h,v,b,m,g,w,O,S;return Ms().w(function(t){for(;;)switch(t.n){case 0:if(r=e.dispatch,n=e.getState,o=n(),i=o.callbacks,u=i.executing,a=i.watched,c=o.config,s=o.hooks,l=o.layout,f=o.paths,p=o.appLifecycle,y=n(),d=y.callbacks.prioritized,p===Ro("HYDRATED")){t.n=1;break}return t.a(2);case 1:h=Math.max(0,12-u.length-a.length),d=Cs(zs,d),v=pr(function(t){return!0===Ds(l,f,Ks(t,f))},d),b=Bs(v,2),m=b[0],g=b[1],w=m.slice(0,h),O=g.slice(0,h-w.length),w.length&&r(Fc([Lc(w),xc(Re(function(t){return as(t,c,s,f,l,Vs(t,f),r,n)},w))])),O.length&&(S=Re(function(t){return qs(qs(qs({},t),Vs(t,f)),{},{isReady:Ds(l,f,Ks(t,f))})},O),r(Fc([Lc(O),Ac(S)])),S.forEach(function(){var t=Hs(Ms().m(function t(e){var o,i,u;return Ms().w(function(t){for(;;)switch(t.n){case 0:return t.n=1,e.isReady;case 1:if(o=n(),i=o.callbacks.blocked,cn(function(t){return t===e||t.isReady===e.isReady},i)){t.n=2;break}return t.a(2);case 2:u=as(e,c,s,f,l,e,r,n),r(Fc([Mc([e]),xc([u])]));case 3:return t.a(2)}},t)}));return function(e){return t.apply(this,arguments)}}()));case 2:return t.a(2)}},t)}));return function(e){return t.apply(this,arguments)}}(),inputs:["callbacks.prioritized","callbacks.completed"]},Qs=Ys,Xs=function(){function t(t,e,r,n){this.valueFn=t,this.valueAcc=e,this.keyFn=r,this.xf=n,this.inputs={}}return t.prototype["@@transducer/init"]=be,t.prototype["@@transducer/result"]=function(t){var e;for(e in this.inputs)if(jt(e,this.inputs)&&(t=this.xf["@@transducer/step"](t,this.inputs[e]))["@@transducer/reduced"]){t=t["@@transducer/value"];break}return this.inputs=null,this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,e){var r=this.keyFn(e);return this.inputs[r]=this.inputs[r]||[r,ai(this.valueAcc,!1)],this.inputs[r][1]=this.valueFn(this.inputs[r][1],e),t},t}();function Zs(t,e,r){return function(n){return new Xs(t,e,r,n)}}var tl=wt(te("groupBy",Te(4,[],he([],Zs,function(t,e,r,n){var o=He(function(n,o){var i=r(o),u=t(jt(i,n)?n[i]:ai(e,!1),o);return u&&u["@@transducer/reduced"]?er(n):(n[i]=u,n)});return Be(o,{},n)}))(function(t,e){return t.push(e),t},[]))),el=wt(function(t,e){return Jr({},e,t)});function rl(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function i(r,n,o,i){var c=n&&n.prototype instanceof a?n:a,s=Object.create(c.prototype);return nl(s,"_invoke",function(r,n,o){var i,a,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:y,f:y.bind(t,4),d:function(e,r){return i=e,a=0,c=t,p.n=r,u}};function y(r,n){for(a=r,c=n,e=0;!f&&s&&!o&&e3?(o=d===n)&&(c=i[(a=i[4])?5:(a=3,3)],i[4]=i[5]=t):i[0]<=y&&((o=r<2&&yn||n>d)&&(i[4]=r,i[5]=n,p.n=d,a=0))}if(o||r>1)return u;throw f=!0,n}return function(o,l,d){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&y(l,d),a=l,c=d;(e=a<2?t:c)||!f;){i||(a?a<3?(a>1&&(p.n=-1),y(a,c)):p.n=c:p.v=c);try{if(s=2,i){if(a||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,a<2&&(a=0)}else 1===a&&(e=i.return)&&e.call(i),a<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),a=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==u)break}catch(e){i=t,a=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var u={};function a(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(nl(e={},n,function(){return this}),e),f=s.prototype=a.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,nl(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,nl(f,"constructor",s),nl(s,"constructor",c),c.displayName="GeneratorFunction",nl(s,o,"GeneratorFunction"),nl(f),nl(f,o,"Generator"),nl(f,n,function(){return this}),nl(f,"toString",function(){return"[object Generator]"}),(rl=function(){return{w:i,m:p}})()}function nl(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}nl=function(t,e,r,n){function i(e,r){nl(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},nl(t,e,r,n)}function ol(t,e,r,n,o,i,u){try{var a=t[i](u),c=a.value}catch(t){return void r(t)}a.done?e(c):Promise.resolve(c).then(n,o)}var il=function(){var t,e=(t=rl().m(function t(e){var r,n;return rl().w(function(t){for(;;)if(0===t.n)return n=new Promise(function(t){return r=t}),setTimeout(r,e),t.a(2,n)},t)}),function(){var e=this,r=arguments;return new Promise(function(n,o){var i=t.apply(e,r);function u(t){ol(i,n,o,u,a,"next",t)}function a(t){ol(i,n,o,u,a,"throw",t)}u(void 0)})});return function(t){return e.apply(this,arguments)}}();function ul(t){return ul="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},ul(t)}function al(t){if(null!=t){var e=t["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],r=0;if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length))return{next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}}}throw new TypeError(ul(t)+" is not iterable")}function cl(){var t,e,r="function"==typeof Symbol?Symbol:{},n=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function i(r,n,o,i){var c=n&&n.prototype instanceof a?n:a,s=Object.create(c.prototype);return sl(s,"_invoke",function(r,n,o){var i,a,c,s=0,l=o||[],f=!1,p={p:0,n:0,v:t,a:y,f:y.bind(t,4),d:function(e,r){return i=e,a=0,c=t,p.n=r,u}};function y(r,n){for(a=r,c=n,e=0;!f&&s&&!o&&e3?(o=d===n)&&(c=i[(a=i[4])?5:(a=3,3)],i[4]=i[5]=t):i[0]<=y&&((o=r<2&&yn||n>d)&&(i[4]=r,i[5]=n,p.n=d,a=0))}if(o||r>1)return u;throw f=!0,n}return function(o,l,d){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&y(l,d),a=l,c=d;(e=a<2?t:c)||!f;){i||(a?a<3?(a>1&&(p.n=-1),y(a,c)):p.n=c:p.v=c);try{if(s=2,i){if(a||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,a<2&&(a=0)}else 1===a&&(e=i.return)&&e.call(i),a<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),a=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==u)break}catch(e){i=t,a=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var u={};function a(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(sl(e={},n,function(){return this}),e),f=s.prototype=a.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,sl(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,sl(f,"constructor",s),sl(s,"constructor",c),c.displayName="GeneratorFunction",sl(s,o,"GeneratorFunction"),sl(f),sl(f,o,"Generator"),sl(f,n,function(){return this}),sl(f,"toString",function(){return"[object Generator]"}),(cl=function(){return{w:i,m:p}})()}function sl(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}sl=function(t,e,r,n){function i(e,r){sl(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},sl(t,e,r,n)}function ll(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function fl(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);rt.length)&&(e=t.length);for(var r=0,n=Array(e);r4&&void 0!==arguments[4]?arguments[4]:null,i=[];for(var u in t)if(t.hasOwnProperty(u)){var a=void 0;try{"function"!=typeof t[u]?(a=Error((n||"React class")+": "+r+" type `"+u+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+Xl(t[u])+"`.")).name="Invariant Violation":a=t[u](e,u,n,r,null,Ql())}catch(t){a=t}if(!a||a instanceof Error||i.push((n||"React class")+": type specification of "+r+" `"+u+"` is invalid; the type checker function must return `null` or an `Error` but returned a "+Xl(a)+". You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument)."),a instanceof Error){var c=o&&o()||"";i.push("Failed "+r+" type: "+a.message+c)}}return i.join("\n\n")}(e.propTypes,r,"component prop",e);return i&&function(t,e,r){var n,o=t.split("`");if(Bt("is marked as required",t)){var i=o[1];n="".concat(i," in ").concat(r),e.id&&(n+=' with ID "'.concat(e.id,'"')),n+=" is required but it was not provided."}else if(Bt("Bad object",t))n=t.split("supplied to ")[0]+"supplied to ".concat(r)+".\nBad"+t.split(".\nBad")[1];else{if(!Bt("Invalid ",t)||!Bt(" supplied to ",t))throw new Error(t);var u=o[1];if(n="Invalid argument `".concat(u,"` passed into ").concat(r),e.id&&(n+=' with ID "'.concat(e.id,'"')),n+=".",Bt(", expected ",t)){var a=t.split(", expected ")[1];n+="\nExpected ".concat(a)}if(Bt(" of type `",t)){var c=t.split(" of type `")[1].split("`")[0];n+="\nWas supplied type `".concat(c,"`.")}if(pn(u,e)){var s=JSON.stringify(e[u],null,2);s&&(Bt("\n",s)?n+="\nValue provided: \n".concat(s):n+="\nValue provided: ".concat(s))}}throw new Error(n)}(i,r,o.type),n}var tf=e().createContext({});function ef(r){var n=r.children,o=r.componentPath,i=(0,t.useMemo)(function(){return JSON.stringify(o)},[o]),u=K(),a=(0,t.useCallback)(function(t){var e=t||{},r=e.extraPath,n=e.rawPath,a=e.filterFunc,c=[i];r?c=[JSON.stringify(tr(o,r))]:n&&(c=[JSON.stringify(n)]);var s=Vt([],c,u.getState().loading);return a?s.filter(a).length>0:s.length>0},[i]),c=(0,t.useCallback)(function(t){var e=t||{},r=e.filterFunc,n=e.extraPath,u=e.rawPath;return b(function(t){var e=[i];n?e=[JSON.stringify(tr(o,n))]:u&&(e=[JSON.stringify(u)]);var a=Vt([],e,t.loading);return r?a.filter(r).length>0:a.length>0})},[i]),s=(0,t.useMemo)(function(){return{componentPath:o,isLoading:a,useLoading:c,useSelector:b,useStore:K,useDispatch:Z}},[i]);return e().createElement(tf.Provider,{value:s},n)}function rf(t){return rf="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},rf(t)}var nf=["componentPath","_dashprivate_error","_passedComponent","_newRender"],of=["_dash_error"];function uf(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function af(t,e,r){return(e=function(t){var e=function(t){if("object"!=rf(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var r=e.call(t,"string");if("object"!=rf(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==rf(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function cf(t){return function(t){if(Array.isArray(t))return lf(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||sf(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function sf(t,e){if(t){if("string"==typeof t)return lf(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?lf(t,e):void 0}}function lf(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r3?(o=d===n)&&(c=i[(a=i[4])?5:(a=3,3)],i[4]=i[5]=t):i[0]<=y&&((o=r<2&&yn||n>d)&&(i[4]=r,i[5]=n,p.n=d,a=0))}if(o||r>1)return u;throw f=!0,n}return function(o,l,d){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&y(l,d),a=l,c=d;(e=a<2?t:c)||!f;){i||(a?a<3?(a>1&&(p.n=-1),y(a,c)):p.n=c:p.v=c);try{if(s=2,i){if(a||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,a<2&&(a=0)}else 1===a&&(e=i.return)&&e.call(i),a<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),a=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==u)break}catch(e){i=t,a=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var u={};function a(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(df(e={},n,function(){return this}),e),f=s.prototype=a.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,df(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,df(f,"constructor",s),df(s,"constructor",c),c.displayName="GeneratorFunction",df(s,o,"GeneratorFunction"),df(f),df(f,o,"Generator"),df(f,n,function(){return this}),df(f,"toString",function(){return"[object Generator]"}),(yf=function(){return{w:i,m:p}})()}function df(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}df=function(t,e,r,n){function i(e,r){df(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},df(t,e,r,n)}function hf(t,e,r,n,o,i,u){try{var a=t[i](u),c=a.value}catch(t){return void r(t)}a.done?e(c):Promise.resolve(c).then(n,o)}function vf(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r0:t}))&&t.push(i):i.getOutputs(o).some(function(t){return Array.isArray(t)?t.length>0:t})&&t.push(i),t},[]);t(Cc([].concat(Wu(u),Wu(a))))}(t,e),t(Ku(Ro("HYDRATED")))}))}catch(t){a.frontEnd.length||a.backEnd.length||u(Vu({type:"backEnd",error:t})),n=!0}finally{r(n)}}})}bf.propTypes={appLifecycle:u().oneOf([Ro("STARTED"),Ro("HYDRATED"),Ro("DESTROYED")]),dispatch:u().func,dependenciesRequest:u().object,graphs:u().object,hooks:u().object,layoutRequest:u().object,layout:u().any,history:u().any,error:u().object,config:u().object};var gf=W(function(t){return{appLifecycle:t.appLifecycle,dependenciesRequest:t.dependenciesRequest,hooks:t.hooks,layoutRequest:t.layoutRequest,layout:t.layout,graphs:t.graphs,history:t.history,error:t.error,config:t.config}},function(t){return{dispatch:t}})(bf);function wf(t){return t.isLoading?e().createElement("div",{className:"_dash-loading-callback"}):null}wf.propTypes={isLoading:u().bool.isRequired};var Of=W(function(t){return{isLoading:t.isLoading}})(wf),Sf=r(72),jf=r.n(Sf),_f=r(825),Ef=r.n(_f),Pf=r(659),Af=r.n(Pf),kf=r(56),Tf=r.n(kf),xf=r(540),If=r.n(xf),Cf=r(113),Rf=r.n(Cf),Df=r(217),Nf={};function Mf(t){var r=t.dispatch,n=t.history,o=e().createElement("span",{key:"undoLink",className:"_dash-undo-redo-link",onClick:function(){return r(fa)}},e().createElement("div",{className:"_dash-icon-undo"},"↺"),e().createElement("div",{className:"_dash-undo-redo-label"},"undo")),i=e().createElement("span",{key:"redoLink",className:"_dash-undo-redo-link",onClick:function(){return r(la)}},e().createElement("div",{className:"_dash-icon-redo"},"↻"),e().createElement("div",{className:"_dash-undo-redo-label"},"redo"));return e().createElement("div",{className:"_dash-undo-redo"},e().createElement("div",null,n.past.length>0?o:null,n.future.length>0?i:null))}Nf.styleTagTransform=Rf(),Nf.setAttributes=Tf(),Nf.insert=Af().bind(null,"head"),Nf.domAPI=Ef(),Nf.insertStyleElement=If(),jf()(Df.A,Nf),Df.A&&Df.A.locals&&Df.A.locals,Mf.propTypes={history:u().object,dispatch:u().func};var Uf=W(function(t){return{history:t.history}},function(t){return{dispatch:t}})(Mf),Lf=nt(function(t){return function(e,r){return t(e,r)?-1:t(r,e)?1:0}}),qf=wt(function(t,e){return tt.length)&&(e=t.length);for(var r=0,n=Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,u=!0,a=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return u=t.done,t},e:function(t){a=!0,i=t},f:function(){try{u||null==r.return||r.return()}finally{if(a)throw i}}}}(r.content.files);try{for(u.s();!(o=u.n()).done;){var a=o.value;if(!a.is_css){i=!1;break}i=!0;for(var c=[],s=document.evaluate('//link[contains(@href, "'.concat(a.url,'")]'),this._head),l=s.iterateNext();l;)c.push(l),l=s.iterateNext();if(re(function(t){return t.setAttribute("disabled","disabled")},c),a.modified>0){var f=document.createElement("link");f.href="".concat(a.url,"?m=").concat(a.modified),f.type="text/css",f.rel="stylesheet",this._head.appendChild(f)}}}catch(t){u.e(t)}finally{u.f()}i||window.location.reload()}else null!==this.state.intervalId&&500===r.status&&(this._retry>this.state.max_retry&&(this.clearInterval(),window.alert("Hot reloading is disabled after failing ".concat(this._retry," times. ")+"Please check your application for errors, then refresh the page.")),this._retry++)}},{key:"componentDidMount",value:function(){var t=this.props,e=t.dispatch,r=t.reloadRequest,n=this.state,o=n.disabled,i=n.interval;if(!o&&!this.state.intervalId){var u=window.setInterval(function(){"loading"!==r.status&&e(La("_reload-hash","GET","reloadRequest"))},i);this.setState({intervalId:u})}}},{key:"componentWillUnmount",value:function(){!this.state.disabled&&this.state.intervalId&&this.clearInterval()}},{key:"render",value:function(){return null}}],o=[{key:"getDerivedStateFromProps",value:function(t){return ae(t.reloadRequest)||"loading"===t.reloadRequest.status?null:{reloadRequest:t.reloadRequest}}}],n&&Ff(r.prototype,n),o&&Ff(r,o),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,n,o}(e().Component);zf.defaultProps={},zf.propTypes={id:u().string,config:u().object,reloadRequest:u().object,dispatch:u().func,interval:u().number};var Vf=W(function(t){return{config:t.config,reloadRequest:t.reloadRequest}},function(t){return{dispatch:t}})(zf);function Kf(){var t=document.getElementById("_dash-config");return JSON.parse(null!=t&&t.textContent?null==t?void 0:t.textContent:"{}")}var Yf=wt(function(t,e){var r={};return tt(e.length,function(){var n=t.apply(this,arguments);return jt(n,r)||(r[n]=e.apply(this,arguments)),r[n]})}),Qf=Yf;function Xf(t){return Xf="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Xf(t)}function Zf(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function tp(t){for(var e=1;e3?(o=d===n)&&(c=i[(a=i[4])?5:(a=3,3)],i[4]=i[5]=t):i[0]<=y&&((o=r<2&&yn||n>d)&&(i[4]=r,i[5]=n,p.n=d,a=0))}if(o||r>1)return u;throw f=!0,n}return function(o,l,d){if(s>1)throw TypeError("Generator is already running");for(f&&1===l&&y(l,d),a=l,c=d;(e=a<2?t:c)||!f;){i||(a?a<3?(a>1&&(p.n=-1),y(a,c)):p.n=c:p.v=c);try{if(s=2,i){if(a||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,a<2&&(a=0)}else 1===a&&(e=i.return)&&e.call(i),a<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),a=1);i=t}else if((e=(f=p.n<0)?c:r.call(n,p))!==u)break}catch(e){i=t,a=1,c=e}finally{s=1}}return{value:e,done:f}}}(r,o,i),!0),s}var u={};function a(){}function c(){}function s(){}e=Object.getPrototypeOf;var l=[][n]?e(e([][n]())):(fp(e={},n,function(){return this}),e),f=s.prototype=a.prototype=Object.create(l);function p(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,s):(t.__proto__=s,fp(t,o,"GeneratorFunction")),t.prototype=Object.create(f),t}return c.prototype=s,fp(f,"constructor",s),fp(s,"constructor",c),c.displayName="GeneratorFunction",fp(s,o,"GeneratorFunction"),fp(f),fp(f,o,"Generator"),fp(f,n,function(){return this}),fp(f,"toString",function(){return"[object Generator]"}),(lp=function(){return{w:i,m:p}})()}function fp(t,e,r,n){var o=Object.defineProperty;try{o({},"",{})}catch(t){o=0}fp=function(t,e,r,n){function i(e,r){fp(t,e,function(t){return this._invoke(e,r,t)})}e?o?o(t,e,{value:r,enumerable:!n,configurable:!n,writable:!n}):t[e]=r:(i("next",0),i("throw",1),i("return",2))},fp(t,e,r,n)}function pp(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=dp(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,u=!0,a=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return u=t.done,t},e:function(t){a=!0,i=t},f:function(){try{u||null==r.return||r.return()}finally{if(a)throw i}}}}function yp(t){return function(t){if(Array.isArray(t))return hp(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||dp(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function dp(t,e){if(t){if("string"==typeof t)return hp(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?hp(t,e):void 0}}function hp(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r0&&(console.log("[Dash] Re-triggering ".concat(r.length," persistent callback(s)")),e.dispatch(Cc(r)))}}},u.onDisconnected=function(t){console.log("[Dash] WebSocket disconnected: ".concat(t)),c=!0},u.onError=function(t,e){console.error("[Dash] WebSocket error: ".concat(t),e)},s=Sp(r),t.p=3,t.n=4,u.connect(r.websocket.worker_url,s,r.websocket.inactivity_timeout);case 4:t.n=6;break;case 5:t.p=5,l=t.v,console.error("[Dash] Failed to connect to WebSocket worker:",l);case 6:document.addEventListener("visibilitychange",function(){"visible"===document.visibilityState&&(u.connected?u.notifyTabVisible():(console.log("[Dash] Tab visible, reconnecting WebSocket..."),u.ensureConnected(r).catch(function(t){return console.error("[Dash] Failed to reconnect:",t)})))});case 7:return t.a(2)}},t,null,[[3,5]])}),Op=function(){var e=this,r=arguments;return new Promise(function(n,o){var i=t.apply(e,r);function u(t){gp(i,n,o,u,a,"next",t)}function a(t){gp(i,n,o,u,a,"throw",t)}u(void 0)})},Op.apply(this,arguments)}function Sp(t){var e;if(null===(e=t.websocket)||void 0===e||!e.url)throw new Error("WebSocket URL not configured");var r="https:"===window.location.protocol?"wss:":"ws:",n=window.location.host;return"".concat(r,"//").concat(n).concat(t.websocket.url)}function jp(t){return jp="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},jp(t)}function _p(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function Ep(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=Array(e);rt.length)&&(e=t.length);for(var r=0,n=Array(e);rt.length)&&(e=t.length);for(var r=0,n=Array(e);r1&&void 0!==arguments[1]?arguments[1]:"about:blank";if(""===t)return t;var r=t.replace(Wp,"").replace(zp,"").replace(Vp,function(t,e){return String.fromCharCode(e)}).trim();return Jp.test(r)?e:t}:Kp.clean_url,Kp.Patch=Ta,window.DashRenderer=Lp}(),window.dash_renderer={}}(); \ No newline at end of file diff --git a/dash/dash_table/DataTable.py b/dash/dash_table/DataTable.py index d7333b46e3..57eb030385 100644 --- a/dash/dash_table/DataTable.py +++ b/dash/dash_table/DataTable.py @@ -4,16 +4,22 @@ from typing_extensions import TypedDict, NotRequired, Literal # noqa: F401 from dash.development.base_component import Component, _explicitize_args +try: + from dash.types import NumberType # noqa: F401 +except ImportError: + # Backwards compatibility for dash<=4.1.0 + if typing.TYPE_CHECKING: + raise + NumberType = typing.Union[ # noqa: F401 + typing.SupportsFloat, typing.SupportsInt, typing.SupportsComplex + ] + ComponentSingleType = typing.Union[str, int, float, Component, None] ComponentType = typing.Union[ ComponentSingleType, typing.Sequence[ComponentSingleType], ] -NumberType = typing.Union[ - typing.SupportsFloat, typing.SupportsInt, typing.SupportsComplex -] - class DataTable(Component): """A DataTable component. @@ -1565,16 +1571,24 @@ def __init__( style_filter: typing.Optional[dict] = None, style_header: typing.Optional[dict] = None, style_cell_conditional: typing.Optional[ - typing.Sequence["StyleCellConditional"] + typing.Sequence[ + typing.Union["StyleCellConditional", typing.Dict[str, typing.Any]] + ] ] = None, style_data_conditional: typing.Optional[ - typing.Sequence["StyleDataConditional"] + typing.Sequence[ + typing.Union["StyleDataConditional", typing.Dict[str, typing.Any]] + ] ] = None, style_filter_conditional: typing.Optional[ - typing.Sequence["StyleFilterConditional"] + typing.Sequence[ + typing.Union["StyleFilterConditional", typing.Dict[str, typing.Any]] + ] ] = None, style_header_conditional: typing.Optional[ - typing.Sequence["StyleHeaderConditional"] + typing.Sequence[ + typing.Union["StyleHeaderConditional", typing.Dict[str, typing.Any]] + ] ] = None, virtualization: typing.Optional[bool] = None, derived_filter_query_structure: typing.Optional[dict] = None, diff --git a/dash/dash_table/async-export.js b/dash/dash_table/async-export.js index f3ae580877..287dc18526 100644 --- a/dash/dash_table/async-export.js +++ b/dash/dash_table/async-export.js @@ -1,3 +1,3 @@ /*! For license information please see async-export.js.LICENSE.txt */ -(self.webpackChunkdash_table=self.webpackChunkdash_table||[]).push([[404],{1454(e){var t={version:"1.15.0"};t[437]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[620]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàąçêëèïîćÄĄĘęłôöĆûùŚÖܢ٥śƒŹŻóÓńŃźż¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[737]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[850]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[852]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘ꬟Ⱥ«»░▒▓│┤ÁÂĚŞ╣║╗╝Żż┐└┴┬├─┼Ăă╚╔╩╦╠═╬¤đĐĎËďŇÍÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÝţ´­˝˛ˇ˘§÷¸°¨˙űŘř■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[857]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞ𿮬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ºªÊËÈ�ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµ�×ÚÛÙìÿ¯´­±�¾¶§÷¸°¨·¹³²■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[861]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèÐðÞÄÅÉæÆôöþûÝýÖÜø£Ø₧ƒáíóúÁÍÓÚ¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[865]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñѪº¿⌐¬½¼¡«¤░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[866]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[874]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€����…�����������‘’“”•–—�������� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[895]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ČüéďäĎŤčěĚĹÍľǪÄÁÉžŽôöÓůÚýÖÜŠĽÝŘťáíóúňŇŮÔšřŕŔ¼§«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[932]=function(){var e,t=[],r={},n=[];for(n[0]="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~���������������������������������。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚��������������������������������".split(""),e=0;e!=n[0].length;++e)65533!==n[0][e].charCodeAt(0)&&(r[n[0][e]]=0+e,t[0+e]=n[0][e]);for(n[129]="���������������������������������������������������������������� 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈〉《》「」『』【】+-±×�÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓�����������∈∋⊆⊇⊂⊃∪∩��������∧∨¬⇒⇔∀∃�����������∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬�������ʼn♯♭♪†‡¶����◯���".split(""),e=0;e!=n[129].length;++e)65533!==n[129][e].charCodeAt(0)&&(r[n[129][e]]=33024+e,t[33024+e]=n[129][e]);for(n[130]="�������������������������������������������������������������������������������0123456789�������ABCDEFGHIJKLMNOPQRSTUVWXYZ�������abcdefghijklmnopqrstuvwxyz����ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん��������������".split(""),e=0;e!=n[130].length;++e)65533!==n[130][e].charCodeAt(0)&&(r[n[130][e]]=33280+e,t[33280+e]=n[130][e]);for(n[131]="����������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミ�ムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ��������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�����������������������������������������".split(""),e=0;e!=n[131].length;++e)65533!==n[131][e].charCodeAt(0)&&(r[n[131][e]]=33536+e,t[33536+e]=n[131][e]);for(n[132]="����������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмн�опрстуфхцчшщъыьэюя�������������─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂�����������������������������������������������������������������".split(""),e=0;e!=n[132].length;++e)65533!==n[132][e].charCodeAt(0)&&(r[n[132][e]]=33792+e,t[33792+e]=n[132][e]);for(n[135]="����������������������������������������������������������������①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ�㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡��������㍻�〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪���������������������������������������������������������������������������������������������������".split(""),e=0;e!=n[135].length;++e)65533!==n[135][e].charCodeAt(0)&&(r[n[135][e]]=34560+e,t[34560+e]=n[135][e]);for(n[136]="���������������������������������������������������������������������������������������������������������������������������������������������������������������亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭���".split(""),e=0;e!=n[136].length;++e)65533!==n[136][e].charCodeAt(0)&&(r[n[136][e]]=34816+e,t[34816+e]=n[136][e]);for(n[137]="����������������������������������������������������������������院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円�園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改���".split(""),e=0;e!=n[137].length;++e)65533!==n[137][e].charCodeAt(0)&&(r[n[137][e]]=35072+e,t[35072+e]=n[137][e]);for(n[138]="����������������������������������������������������������������魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫�橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄���".split(""),e=0;e!=n[138].length;++e)65533!==n[138][e].charCodeAt(0)&&(r[n[138][e]]=35328+e,t[35328+e]=n[138][e]);for(n[139]="����������������������������������������������������������������機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救�朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈���".split(""),e=0;e!=n[139].length;++e)65533!==n[139][e].charCodeAt(0)&&(r[n[139][e]]=35584+e,t[35584+e]=n[139][e]);for(n[140]="����������������������������������������������������������������掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨�劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向���".split(""),e=0;e!=n[140].length;++e)65533!==n[140][e].charCodeAt(0)&&(r[n[140][e]]=35840+e,t[35840+e]=n[140][e]);for(n[141]="����������������������������������������������������������������后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降�項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷���".split(""),e=0;e!=n[141].length;++e)65533!==n[141][e].charCodeAt(0)&&(r[n[141][e]]=36096+e,t[36096+e]=n[141][e]);for(n[142]="����������������������������������������������������������������察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止�死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周���".split(""),e=0;e!=n[142].length;++e)65533!==n[142][e].charCodeAt(0)&&(r[n[142][e]]=36352+e,t[36352+e]=n[142][e]);for(n[143]="����������������������������������������������������������������宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳�準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾���".split(""),e=0;e!=n[143].length;++e)65533!==n[143][e].charCodeAt(0)&&(r[n[143][e]]=36608+e,t[36608+e]=n[143][e]);for(n[144]="����������������������������������������������������������������拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨�逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線���".split(""),e=0;e!=n[144].length;++e)65533!==n[144][e].charCodeAt(0)&&(r[n[144][e]]=36864+e,t[36864+e]=n[144][e]);for(n[145]="����������������������������������������������������������������繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻�操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只���".split(""),e=0;e!=n[145].length;++e)65533!==n[145][e].charCodeAt(0)&&(r[n[145][e]]=37120+e,t[37120+e]=n[145][e]);for(n[146]="����������������������������������������������������������������叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄�逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓���".split(""),e=0;e!=n[146].length;++e)65533!==n[146][e].charCodeAt(0)&&(r[n[146][e]]=37376+e,t[37376+e]=n[146][e]);for(n[147]="����������������������������������������������������������������邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬�凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入���".split(""),e=0;e!=n[147].length;++e)65533!==n[147][e].charCodeAt(0)&&(r[n[147][e]]=37632+e,t[37632+e]=n[147][e]);for(n[148]="����������������������������������������������������������������如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅�楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美���".split(""),e=0;e!=n[148].length;++e)65533!==n[148][e].charCodeAt(0)&&(r[n[148][e]]=37888+e,t[37888+e]=n[148][e]);for(n[149]="����������������������������������������������������������������鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷�斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋���".split(""),e=0;e!=n[149].length;++e)65533!==n[149][e].charCodeAt(0)&&(r[n[149][e]]=38144+e,t[38144+e]=n[149][e]);for(n[150]="����������������������������������������������������������������法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆�摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒���".split(""),e=0;e!=n[150].length;++e)65533!==n[150][e].charCodeAt(0)&&(r[n[150][e]]=38400+e,t[38400+e]=n[150][e]);for(n[151]="����������������������������������������������������������������諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲�沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯���".split(""),e=0;e!=n[151].length;++e)65533!==n[151][e].charCodeAt(0)&&(r[n[151][e]]=38656+e,t[38656+e]=n[151][e]);for(n[152]="����������������������������������������������������������������蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕��������������������������������������������弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲���".split(""),e=0;e!=n[152].length;++e)65533!==n[152][e].charCodeAt(0)&&(r[n[152][e]]=38912+e,t[38912+e]=n[152][e]);for(n[153]="����������������������������������������������������������������僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭�凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨���".split(""),e=0;e!=n[153].length;++e)65533!==n[153][e].charCodeAt(0)&&(r[n[153][e]]=39168+e,t[39168+e]=n[153][e]);for(n[154]="����������������������������������������������������������������咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸�噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩���".split(""),e=0;e!=n[154].length;++e)65533!==n[154][e].charCodeAt(0)&&(r[n[154][e]]=39424+e,t[39424+e]=n[154][e]);for(n[155]="����������������������������������������������������������������奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀�它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏���".split(""),e=0;e!=n[155].length;++e)65533!==n[155][e].charCodeAt(0)&&(r[n[155][e]]=39680+e,t[39680+e]=n[155][e]);for(n[156]="����������������������������������������������������������������廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠�怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛���".split(""),e=0;e!=n[156].length;++e)65533!==n[156][e].charCodeAt(0)&&(r[n[156][e]]=39936+e,t[39936+e]=n[156][e]);for(n[157]="����������������������������������������������������������������戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫�捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼���".split(""),e=0;e!=n[157].length;++e)65533!==n[157][e].charCodeAt(0)&&(r[n[157][e]]=40192+e,t[40192+e]=n[157][e]);for(n[158]="����������������������������������������������������������������曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎�梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣���".split(""),e=0;e!=n[158].length;++e)65533!==n[158][e].charCodeAt(0)&&(r[n[158][e]]=40448+e,t[40448+e]=n[158][e]);for(n[159]="����������������������������������������������������������������檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯�麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌���".split(""),e=0;e!=n[159].length;++e)65533!==n[159][e].charCodeAt(0)&&(r[n[159][e]]=40704+e,t[40704+e]=n[159][e]);for(n[224]="����������������������������������������������������������������漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝�烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱���".split(""),e=0;e!=n[224].length;++e)65533!==n[224][e].charCodeAt(0)&&(r[n[224][e]]=57344+e,t[57344+e]=n[224][e]);for(n[225]="����������������������������������������������������������������瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿�痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬���".split(""),e=0;e!=n[225].length;++e)65533!==n[225][e].charCodeAt(0)&&(r[n[225][e]]=57600+e,t[57600+e]=n[225][e]);for(n[226]="����������������������������������������������������������������磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰�窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆���".split(""),e=0;e!=n[226].length;++e)65533!==n[226][e].charCodeAt(0)&&(r[n[226][e]]=57856+e,t[57856+e]=n[226][e]);for(n[227]="����������������������������������������������������������������紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷�縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋���".split(""),e=0;e!=n[227].length;++e)65533!==n[227][e].charCodeAt(0)&&(r[n[227][e]]=58112+e,t[58112+e]=n[227][e]);for(n[228]="����������������������������������������������������������������隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤�艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈���".split(""),e=0;e!=n[228].length;++e)65533!==n[228][e].charCodeAt(0)&&(r[n[228][e]]=58368+e,t[58368+e]=n[228][e]);for(n[229]="����������������������������������������������������������������蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬�蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞���".split(""),e=0;e!=n[229].length;++e)65533!==n[229][e].charCodeAt(0)&&(r[n[229][e]]=58624+e,t[58624+e]=n[229][e]);for(n[230]="����������������������������������������������������������������襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧�諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊���".split(""),e=0;e!=n[230].length;++e)65533!==n[230][e].charCodeAt(0)&&(r[n[230][e]]=58880+e,t[58880+e]=n[230][e]);for(n[231]="����������������������������������������������������������������蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜�轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮���".split(""),e=0;e!=n[231].length;++e)65533!==n[231][e].charCodeAt(0)&&(r[n[231][e]]=59136+e,t[59136+e]=n[231][e]);for(n[232]="����������������������������������������������������������������錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙�閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰���".split(""),e=0;e!=n[232].length;++e)65533!==n[232][e].charCodeAt(0)&&(r[n[232][e]]=59392+e,t[59392+e]=n[232][e]);for(n[233]="����������������������������������������������������������������顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃�騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈���".split(""),e=0;e!=n[233].length;++e)65533!==n[233][e].charCodeAt(0)&&(r[n[233][e]]=59648+e,t[59648+e]=n[233][e]);for(n[234]="����������������������������������������������������������������鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯�黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙�������������������������������������������������������������������������������������������".split(""),e=0;e!=n[234].length;++e)65533!==n[234][e].charCodeAt(0)&&(r[n[234][e]]=59904+e,t[59904+e]=n[234][e]);for(n[237]="����������������������������������������������������������������纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏�塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱���".split(""),e=0;e!=n[237].length;++e)65533!==n[237][e].charCodeAt(0)&&(r[n[237][e]]=60672+e,t[60672+e]=n[237][e]);for(n[238]="����������������������������������������������������������������犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙�蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑��ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ¬¦'"���".split(""),e=0;e!=n[238].length;++e)65533!==n[238][e].charCodeAt(0)&&(r[n[238][e]]=60928+e,t[60928+e]=n[238][e]);for(n[250]="����������������������������������������������������������������ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ¬¦'"㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊�兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯���".split(""),e=0;e!=n[250].length;++e)65533!==n[250][e].charCodeAt(0)&&(r[n[250][e]]=64e3+e,t[64e3+e]=n[250][e]);for(n[251]="����������������������������������������������������������������涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神�祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙���".split(""),e=0;e!=n[251].length;++e)65533!==n[251][e].charCodeAt(0)&&(r[n[251][e]]=64256+e,t[64256+e]=n[251][e]);for(n[252]="����������������������������������������������������������������髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������".split(""),e=0;e!=n[252].length;++e)65533!==n[252][e].charCodeAt(0)&&(r[n[252][e]]=64512+e,t[64512+e]=n[252][e]);return{enc:r,dec:t}}(),t[936]=function(){var e,t=[],r={},n=[];for(n[0]="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�������������������������������������������������������������������������������������������������������������������������������".split(""),e=0;e!=n[0].length;++e)65533!==n[0][e].charCodeAt(0)&&(r[n[0][e]]=0+e,t[0+e]=n[0][e]);for(n[129]="����������������������������������������������������������������丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪乫乬乭乮乯乲乴乵乶乷乸乹乺乻乼乽乿亀亁亂亃亄亅亇亊�亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂伃伄伅伆伇伈伋伌伒伓伔伕伖伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾伿佀佁佂佄佅佇佈佉佊佋佌佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢�".split(""),e=0;e!=n[129].length;++e)65533!==n[129][e].charCodeAt(0)&&(r[n[129][e]]=33024+e,t[33024+e]=n[129][e]);for(n[130]="����������������������������������������������������������������侤侫侭侰侱侲侳侴侶侷侸侹侺侻侼侽侾俀俁係俆俇俈俉俋俌俍俒俓俔俕俖俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿倀倁倂倃倄倅倆倇倈倉倊�個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯倰倱倲倳倴倵倶倷倸倹倻倽倿偀偁偂偄偅偆偉偊偋偍偐偑偒偓偔偖偗偘偙偛偝偞偟偠偡偢偣偤偦偧偨偩偪偫偭偮偯偰偱偲偳側偵偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎傏傐傑傒傓傔傕傖傗傘備傚傛傜傝傞傟傠傡傢傤傦傪傫傭傮傯傰傱傳傴債傶傷傸傹傼�".split(""),e=0;e!=n[130].length;++e)65533!==n[130][e].charCodeAt(0)&&(r[n[130][e]]=33280+e,t[33280+e]=n[130][e]);for(n[131]="����������������������������������������������������������������傽傾傿僀僁僂僃僄僅僆僇僈僉僊僋僌働僎僐僑僒僓僔僕僗僘僙僛僜僝僞僟僠僡僢僣僤僥僨僩僪僫僯僰僱僲僴僶僷僸價僺僼僽僾僿儀儁儂儃億儅儈�儉儊儌儍儎儏儐儑儓儔儕儖儗儘儙儚儛儜儝儞償儠儢儣儤儥儦儧儨儩優儫儬儭儮儯儰儱儲儳儴儵儶儷儸儹儺儻儼儽儾兂兇兊兌兎兏児兒兓兗兘兙兛兝兞兟兠兡兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦冧冨冩冪冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒凓凔凕凖凗�".split(""),e=0;e!=n[131].length;++e)65533!==n[131][e].charCodeAt(0)&&(r[n[131][e]]=33536+e,t[33536+e]=n[131][e]);for(n[132]="����������������������������������������������������������������凘凙凚凜凞凟凢凣凥処凧凨凩凪凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄剅剆則剈剉剋剎剏剒剓剕剗剘�剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳剴創剶剷剸剹剺剻剼剾劀劃劄劅劆劇劉劊劋劌劍劎劏劑劒劔劕劖劗劘劙劚劜劤劥劦劧劮劯劰労劵劶劷劸効劺劻劼劽勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務勚勛勜勝勞勠勡勢勣勥勦勧勨勩勪勫勬勭勮勯勱勲勳勴勵勶勷勸勻勼勽匁匂匃匄匇匉匊匋匌匎�".split(""),e=0;e!=n[132].length;++e)65533!==n[132][e].charCodeAt(0)&&(r[n[132][e]]=33792+e,t[33792+e]=n[132][e]);for(n[133]="����������������������������������������������������������������匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯匰匱匲匳匴匵匶匷匸匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏�厐厑厒厓厔厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯厰厱厲厳厴厵厷厸厹厺厼厽厾叀參叄叅叆叇収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝呞呟呠呡呣呥呧呩呪呫呬呭呮呯呰呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡�".split(""),e=0;e!=n[133].length;++e)65533!==n[133][e].charCodeAt(0)&&(r[n[133][e]]=34048+e,t[34048+e]=n[133][e]);for(n[134]="����������������������������������������������������������������咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠員哢哣哤哫哬哯哰哱哴哵哶哷哸哹哻哾唀唂唃唄唅唈唊唋唌唍唎唒唓唕唖唗唘唙唚唜唝唞唟唡唥唦�唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋啌啍啎問啑啒啓啔啗啘啙啚啛啝啞啟啠啢啣啨啩啫啯啰啱啲啳啴啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠喡喢喣喤喥喦喨喩喪喫喬喭單喯喰喲喴営喸喺喼喿嗀嗁嗂嗃嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗嗘嗙嗚嗛嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸嗹嗺嗻嗼嗿嘂嘃嘄嘅�".split(""),e=0;e!=n[134].length;++e)65533!==n[134][e].charCodeAt(0)&&(r[n[134][e]]=34304+e,t[34304+e]=n[134][e]);for(n[135]="����������������������������������������������������������������嘆嘇嘊嘋嘍嘐嘑嘒嘓嘔嘕嘖嘗嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀噁噂噃噄噅噆噇噈噉噊噋噏噐噑噒噓噕噖噚噛噝噞噟噠噡�噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽噾噿嚀嚁嚂嚃嚄嚇嚈嚉嚊嚋嚌嚍嚐嚑嚒嚔嚕嚖嚗嚘嚙嚚嚛嚜嚝嚞嚟嚠嚡嚢嚤嚥嚦嚧嚨嚩嚪嚫嚬嚭嚮嚰嚱嚲嚳嚴嚵嚶嚸嚹嚺嚻嚽嚾嚿囀囁囂囃囄囅囆囇囈囉囋囌囍囎囏囐囑囒囓囕囖囘囙囜団囥囦囧囨囩囪囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國圌圍圎圏圐圑�".split(""),e=0;e!=n[135].length;++e)65533!==n[135][e].charCodeAt(0)&&(r[n[135][e]]=34560+e,t[34560+e]=n[135][e]);for(n[136]="����������������������������������������������������������������園圓圔圕圖圗團圙圚圛圝圞圠圡圢圤圥圦圧圫圱圲圴圵圶圷圸圼圽圿坁坃坄坅坆坈坉坋坒坓坔坕坖坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀�垁垇垈垉垊垍垎垏垐垑垔垕垖垗垘垙垚垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹垺垻垼垽垾垿埀埁埄埅埆埇埈埉埊埌埍埐埑埓埖埗埛埜埞埡埢埣埥埦埧埨埩埪埫埬埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥堦堧堨堩堫堬堭堮堯報堲堳場堶堷堸堹堺堻堼堽�".split(""),e=0;e!=n[136].length;++e)65533!==n[136][e].charCodeAt(0)&&(r[n[136][e]]=34816+e,t[34816+e]=n[136][e]);for(n[137]="����������������������������������������������������������������堾堿塀塁塂塃塅塆塇塈塉塊塋塎塏塐塒塓塕塖塗塙塚塛塜塝塟塠塡塢塣塤塦塧塨塩塪塭塮塯塰塱塲塳塴塵塶塷塸塹塺塻塼塽塿墂墄墆墇墈墊墋墌�墍墎墏墐墑墔墕墖増墘墛墜墝墠墡墢墣墤墥墦墧墪墫墬墭墮墯墰墱墲墳墴墵墶墷墸墹墺墻墽墾墿壀壂壃壄壆壇壈壉壊壋壌壍壎壏壐壒壓壔壖壗壘壙壚壛壜壝壞壟壠壡壢壣壥壦壧壨壩壪壭壯壱売壴壵壷壸壺壻壼壽壾壿夀夁夃夅夆夈変夊夋夌夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻�".split(""),e=0;e!=n[137].length;++e)65533!==n[137][e].charCodeAt(0)&&(r[n[137][e]]=35072+e,t[35072+e]=n[137][e]);for(n[138]="����������������������������������������������������������������夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛奜奝奞奟奡奣奤奦奧奨奩奪奫奬奭奮奯奰奱奲奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦�妧妬妭妰妱妳妴妵妶妷妸妺妼妽妿姀姁姂姃姄姅姇姈姉姌姍姎姏姕姖姙姛姞姟姠姡姢姤姦姧姩姪姫姭姮姯姰姱姲姳姴姵姶姷姸姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪娫娬娭娮娯娰娳娵娷娸娹娺娻娽娾娿婁婂婃婄婅婇婈婋婌婍婎婏婐婑婒婓婔婖婗婘婙婛婜婝婞婟婠�".split(""),e=0;e!=n[138].length;++e)65533!==n[138][e].charCodeAt(0)&&(r[n[138][e]]=35328+e,t[35328+e]=n[138][e]);for(n[139]="����������������������������������������������������������������婡婣婤婥婦婨婩婫婬婭婮婯婰婱婲婳婸婹婻婼婽婾媀媁媂媃媄媅媆媇媈媉媊媋媌媍媎媏媐媑媓媔媕媖媗媘媙媜媝媞媟媠媡媢媣媤媥媦媧媨媩媫媬�媭媮媯媰媱媴媶媷媹媺媻媼媽媿嫀嫃嫄嫅嫆嫇嫈嫊嫋嫍嫎嫏嫐嫑嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬嫭嫮嫯嫰嫲嫳嫴嫵嫶嫷嫸嫹嫺嫻嫼嫽嫾嫿嬀嬁嬂嬃嬄嬅嬆嬇嬈嬊嬋嬌嬍嬎嬏嬐嬑嬒嬓嬔嬕嬘嬙嬚嬛嬜嬝嬞嬟嬠嬡嬢嬣嬤嬥嬦嬧嬨嬩嬪嬫嬬嬭嬮嬯嬰嬱嬳嬵嬶嬸嬹嬺嬻嬼嬽嬾嬿孁孂孃孄孅孆孇�".split(""),e=0;e!=n[139].length;++e)65533!==n[139][e].charCodeAt(0)&&(r[n[139][e]]=35584+e,t[35584+e]=n[139][e]);for(n[140]="����������������������������������������������������������������孈孉孊孋孌孍孎孏孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏�寑寔寕寖寗寘寙寚寛寜寠寢寣實寧審寪寫寬寭寯寱寲寳寴寵寶寷寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧屨屩屪屫屬屭屰屲屳屴屵屶屷屸屻屼屽屾岀岃岄岅岆岇岉岊岋岎岏岒岓岕岝岞岟岠岡岤岥岦岧岨�".split(""),e=0;e!=n[140].length;++e)65533!==n[140][e].charCodeAt(0)&&(r[n[140][e]]=35840+e,t[35840+e]=n[140][e]);for(n[141]="����������������������������������������������������������������岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅峆峇峈峉峊峌峍峎峏峐峑峓峔峕峖峗峘峚峛峜峝峞峟峠峢峣峧峩峫峬峮峯峱峲峳峴峵島峷峸峹峺峼峽峾峿崀�崁崄崅崈崉崊崋崌崍崏崐崑崒崓崕崗崘崙崚崜崝崟崠崡崢崣崥崨崪崫崬崯崰崱崲崳崵崶崷崸崹崺崻崼崿嵀嵁嵂嵃嵄嵅嵆嵈嵉嵍嵎嵏嵐嵑嵒嵓嵔嵕嵖嵗嵙嵚嵜嵞嵟嵠嵡嵢嵣嵤嵥嵦嵧嵨嵪嵭嵮嵰嵱嵲嵳嵵嵶嵷嵸嵹嵺嵻嵼嵽嵾嵿嶀嶁嶃嶄嶅嶆嶇嶈嶉嶊嶋嶌嶍嶎嶏嶐嶑嶒嶓嶔嶕嶖嶗嶘嶚嶛嶜嶞嶟嶠�".split(""),e=0;e!=n[141].length;++e)65533!==n[141][e].charCodeAt(0)&&(r[n[141][e]]=36096+e,t[36096+e]=n[141][e]);for(n[142]="����������������������������������������������������������������嶡嶢嶣嶤嶥嶦嶧嶨嶩嶪嶫嶬嶭嶮嶯嶰嶱嶲嶳嶴嶵嶶嶸嶹嶺嶻嶼嶽嶾嶿巀巁巂巃巄巆巇巈巉巊巋巌巎巏巐巑巒巓巔巕巖巗巘巙巚巜巟巠巣巤巪巬巭�巰巵巶巸巹巺巻巼巿帀帄帇帉帊帋帍帎帒帓帗帞帟帠帡帢帣帤帥帨帩帪師帬帯帰帲帳帴帵帶帹帺帾帿幀幁幃幆幇幈幉幊幋幍幎幏幐幑幒幓幖幗幘幙幚幜幝幟幠幣幤幥幦幧幨幩幪幫幬幭幮幯幰幱幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨庩庪庫庬庮庯庰庱庲庴庺庻庼庽庿廀廁廂廃廄廅�".split(""),e=0;e!=n[142].length;++e)65533!==n[142][e].charCodeAt(0)&&(r[n[142][e]]=36352+e,t[36352+e]=n[142][e]);for(n[143]="����������������������������������������������������������������廆廇廈廋廌廍廎廏廐廔廕廗廘廙廚廜廝廞廟廠廡廢廣廤廥廦廧廩廫廬廭廮廯廰廱廲廳廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤�弨弫弬弮弰弲弳弴張弶強弸弻弽弾弿彁彂彃彄彅彆彇彈彉彊彋彌彍彎彏彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢徣徤徥徦徧復徫徬徯徰徱徲徳徴徶徸徹徺徻徾徿忀忁忂忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇�".split(""),e=0;e!=n[143].length;++e)65533!==n[143][e].charCodeAt(0)&&(r[n[143][e]]=36608+e,t[36608+e]=n[143][e]);for(n[144]="����������������������������������������������������������������怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰怱怲怳怴怶怷怸怹怺怽怾恀恄恅恆恇恈恉恊恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀�悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽悾悿惀惁惂惃惄惇惈惉惌惍惎惏惐惒惓惔惖惗惙惛惞惡惢惣惤惥惪惱惲惵惷惸惻惼惽惾惿愂愃愄愅愇愊愋愌愐愑愒愓愔愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬愭愮愯愰愱愲愳愴愵愶愷愸愹愺愻愼愽愾慀慁慂慃慄慅慆�".split(""),e=0;e!=n[144].length;++e)65533!==n[144][e].charCodeAt(0)&&(r[n[144][e]]=36864+e,t[36864+e]=n[144][e]);for(n[145]="����������������������������������������������������������������慇慉態慍慏慐慒慓慔慖慗慘慙慚慛慜慞慟慠慡慣慤慥慦慩慪慫慬慭慮慯慱慲慳慴慶慸慹慺慻慼慽慾慿憀憁憂憃憄憅憆憇憈憉憊憌憍憏憐憑憒憓憕�憖憗憘憙憚憛憜憞憟憠憡憢憣憤憥憦憪憫憭憮憯憰憱憲憳憴憵憶憸憹憺憻憼憽憿懀懁懃懄懅懆懇應懌懍懎懏懐懓懕懖懗懘懙懚懛懜懝懞懟懠懡懢懣懤懥懧懨懩懪懫懬懭懮懯懰懱懲懳懴懶懷懸懹懺懻懼懽懾戀戁戂戃戄戅戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸戹戺戻戼扂扄扅扆扊�".split(""),e=0;e!=n[145].length;++e)65533!==n[145][e].charCodeAt(0)&&(r[n[145][e]]=37120+e,t[37120+e]=n[145][e]);for(n[146]="����������������������������������������������������������������扏扐払扖扗扙扚扜扝扞扟扠扡扢扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋抌抍抎抏抐抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁�拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳挴挵挶挷挸挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖捗捘捙捚捛捜捝捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙掚掛掜掝掞掟採掤掦掫掯掱掲掵掶掹掻掽掿揀�".split(""),e=0;e!=n[146].length;++e)65533!==n[146][e].charCodeAt(0)&&(r[n[146][e]]=37376+e,t[37376+e]=n[146][e]);for(n[147]="����������������������������������������������������������������揁揂揃揅揇揈揊揋揌揑揓揔揕揗揘揙揚換揜揝揟揢揤揥揦揧揨揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆搇搈搉搊損搎搑搒搕搖搗搘搙搚搝搟搢搣搤�搥搧搨搩搫搮搯搰搱搲搳搵搶搷搸搹搻搼搾摀摂摃摉摋摌摍摎摏摐摑摓摕摖摗摙摚摛摜摝摟摠摡摢摣摤摥摦摨摪摫摬摮摯摰摱摲摳摴摵摶摷摻摼摽摾摿撀撁撃撆撈撉撊撋撌撍撎撏撐撓撔撗撘撚撛撜撝撟撠撡撢撣撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆擇擈擉擊擋擌擏擑擓擔擕擖擙據�".split(""),e=0;e!=n[147].length;++e)65533!==n[147][e].charCodeAt(0)&&(r[n[147][e]]=37632+e,t[37632+e]=n[147][e]);for(n[148]="����������������������������������������������������������������擛擜擝擟擠擡擣擥擧擨擩擪擫擬擭擮擯擰擱擲擳擴擵擶擷擸擹擺擻擼擽擾擿攁攂攃攄攅攆攇攈攊攋攌攍攎攏攐攑攓攔攕攖攗攙攚攛攜攝攞攟攠攡�攢攣攤攦攧攨攩攪攬攭攰攱攲攳攷攺攼攽敀敁敂敃敄敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數敹敺敻敼敽敾敿斀斁斂斃斄斅斆斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱斲斳斴斵斶斷斸斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘旙旚旛旜旝旞旟旡旣旤旪旫�".split(""),e=0;e!=n[148].length;++e)65533!==n[148][e].charCodeAt(0)&&(r[n[148][e]]=37888+e,t[37888+e]=n[148][e]);for(n[149]="����������������������������������������������������������������旲旳旴旵旸旹旻旼旽旾旿昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷昸昹昺昻昽昿晀時晄晅晆晇晈晉晊晍晎晐晑晘�晙晛晜晝晞晠晢晣晥晧晩晪晫晬晭晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘暙暚暛暜暞暟暠暡暢暣暤暥暦暩暪暫暬暭暯暰暱暲暳暵暶暷暸暺暻暼暽暿曀曁曂曃曄曅曆曇曈曉曊曋曌曍曎曏曐曑曒曓曔曕曖曗曘曚曞曟曠曡曢曣曤曥曧曨曪曫曬曭曮曯曱曵曶書曺曻曽朁朂會�".split(""),e=0;e!=n[149].length;++e)65533!==n[149][e].charCodeAt(0)&&(r[n[149][e]]=38144+e,t[38144+e]=n[149][e]);for(n[150]="����������������������������������������������������������������朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠朡朢朣朤朥朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗杘杙杚杛杝杢杣杤杦杧杫杬杮東杴杶�杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹枺枻枼枽枾枿柀柂柅柆柇柈柉柊柋柌柍柎柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵柶柷柸柹柺査柼柾栁栂栃栄栆栍栐栒栔栕栘栙栚栛栜栞栟栠栢栣栤栥栦栧栨栫栬栭栮栯栰栱栴栵栶栺栻栿桇桋桍桏桒桖桗桘桙桚桛�".split(""),e=0;e!=n[150].length;++e)65533!==n[150][e].charCodeAt(0)&&(r[n[150][e]]=38400+e,t[38400+e]=n[150][e]);for(n[151]="����������������������������������������������������������������桜桝桞桟桪桬桭桮桯桰桱桲桳桵桸桹桺桻桼桽桾桿梀梂梄梇梈梉梊梋梌梍梎梐梑梒梔梕梖梘梙梚梛梜條梞梟梠梡梣梤梥梩梪梫梬梮梱梲梴梶梷梸�梹梺梻梼梽梾梿棁棃棄棅棆棇棈棊棌棎棏棐棑棓棔棖棗棙棛棜棝棞棟棡棢棤棥棦棧棨棩棪棫棬棭棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆椇椈椉椊椌椏椑椓椔椕椖椗椘椙椚椛検椝椞椡椢椣椥椦椧椨椩椪椫椬椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃楄楅楆楇楈楉楊楋楌楍楎楏楐楑楒楓楕楖楘楙楛楜楟�".split(""),e=0;e!=n[151].length;++e)65533!==n[151][e].charCodeAt(0)&&(r[n[151][e]]=38656+e,t[38656+e]=n[151][e]);for(n[152]="����������������������������������������������������������������楡楢楤楥楧楨楩楪楬業楯楰楲楳楴極楶楺楻楽楾楿榁榃榅榊榋榌榎榏榐榑榒榓榖榗榙榚榝榞榟榠榡榢榣榤榥榦榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽�榾榿槀槂槃槄槅槆槇槈槉構槍槏槑槒槓槕槖槗様槙槚槜槝槞槡槢槣槤槥槦槧槨槩槪槫槬槮槯槰槱槳槴槵槶槷槸槹槺槻槼槾樀樁樂樃樄樅樆樇樈樉樋樌樍樎樏樐樑樒樓樔樕樖標樚樛樜樝樞樠樢樣樤樥樦樧権樫樬樭樮樰樲樳樴樶樷樸樹樺樻樼樿橀橁橂橃橅橆橈橉橊橋橌橍橎橏橑橒橓橔橕橖橗橚�".split(""),e=0;e!=n[152].length;++e)65533!==n[152][e].charCodeAt(0)&&(r[n[152][e]]=38912+e,t[38912+e]=n[152][e]);for(n[153]="����������������������������������������������������������������橜橝橞機橠橢橣橤橦橧橨橩橪橫橬橭橮橯橰橲橳橴橵橶橷橸橺橻橽橾橿檁檂檃檅檆檇檈檉檊檋檌檍檏檒檓檔檕檖檘檙檚檛檜檝檞檟檡檢檣檤檥檦�檧檨檪檭檮檯檰檱檲檳檴檵檶檷檸檹檺檻檼檽檾檿櫀櫁櫂櫃櫄櫅櫆櫇櫈櫉櫊櫋櫌櫍櫎櫏櫐櫑櫒櫓櫔櫕櫖櫗櫘櫙櫚櫛櫜櫝櫞櫟櫠櫡櫢櫣櫤櫥櫦櫧櫨櫩櫪櫫櫬櫭櫮櫯櫰櫱櫲櫳櫴櫵櫶櫷櫸櫹櫺櫻櫼櫽櫾櫿欀欁欂欃欄欅欆欇欈欉權欋欌欍欎欏欐欑欒欓欔欕欖欗欘欙欚欛欜欝欞欟欥欦欨欩欪欫欬欭欮�".split(""),e=0;e!=n[153].length;++e)65533!==n[153][e].charCodeAt(0)&&(r[n[153][e]]=39168+e,t[39168+e]=n[153][e]);for(n[154]="����������������������������������������������������������������欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍歎歏歐歑歒歓歔歕歖歗歘歚歛歜歝歞歟歠歡歨歩歫歬歭歮歯歰歱歲歳歴歵歶歷歸歺歽歾歿殀殅殈�殌殎殏殐殑殔殕殗殘殙殜殝殞殟殠殢殣殤殥殦殧殨殩殫殬殭殮殯殰殱殲殶殸殹殺殻殼殽殾毀毃毄毆毇毈毉毊毌毎毐毑毘毚毜毝毞毟毠毢毣毤毥毦毧毨毩毬毭毮毰毱毲毴毶毷毸毺毻毼毾毿氀氁氂氃氄氈氉氊氋氌氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋汌汍汎汏汑汒汓汖汘�".split(""),e=0;e!=n[154].length;++e)65533!==n[154][e].charCodeAt(0)&&(r[n[154][e]]=39424+e,t[39424+e]=n[154][e]);for(n[155]="����������������������������������������������������������������汙汚汢汣汥汦汧汫汬汭汮汯汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘�泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟洠洡洢洣洤洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽浾浿涀涁涃涄涆涇涊涋涍涏涐涒涖涗涘涙涚涜涢涥涬涭涰涱涳涴涶涷涹涺涻涼涽涾淁淂淃淈淉淊�".split(""),e=0;e!=n[155].length;++e)65533!==n[155][e].charCodeAt(0)&&(r[n[155][e]]=39680+e,t[39680+e]=n[155][e]);for(n[156]="����������������������������������������������������������������淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽淾淿渀渁渂渃渄渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵�渶渷渹渻渼渽渾渿湀湁湂湅湆湇湈湉湊湋湌湏湐湑湒湕湗湙湚湜湝湞湠湡湢湣湤湥湦湧湨湩湪湬湭湯湰湱湲湳湴湵湶湷湸湹湺湻湼湽満溁溂溄溇溈溊溋溌溍溎溑溒溓溔溕準溗溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪滫滬滭滮滯�".split(""),e=0;e!=n[156].length;++e)65533!==n[156][e].charCodeAt(0)&&(r[n[156][e]]=39936+e,t[39936+e]=n[156][e]);for(n[157]="����������������������������������������������������������������滰滱滲滳滵滶滷滸滺滻滼滽滾滿漀漁漃漄漅漇漈漊漋漌漍漎漐漑漒漖漗漘漙漚漛漜漝漞漟漡漢漣漥漦漧漨漬漮漰漲漴漵漷漸漹漺漻漼漽漿潀潁潂�潃潄潅潈潉潊潌潎潏潐潑潒潓潔潕潖潗潙潚潛潝潟潠潡潣潤潥潧潨潩潪潫潬潯潰潱潳潵潶潷潹潻潽潾潿澀澁澂澃澅澆澇澊澋澏澐澑澒澓澔澕澖澗澘澙澚澛澝澞澟澠澢澣澤澥澦澨澩澪澫澬澭澮澯澰澱澲澴澵澷澸澺澻澼澽澾澿濁濃濄濅濆濇濈濊濋濌濍濎濏濐濓濔濕濖濗濘濙濚濛濜濝濟濢濣濤濥�".split(""),e=0;e!=n[157].length;++e)65533!==n[157][e].charCodeAt(0)&&(r[n[157][e]]=40192+e,t[40192+e]=n[157][e]);for(n[158]="����������������������������������������������������������������濦濧濨濩濪濫濬濭濰濱濲濳濴濵濶濷濸濹濺濻濼濽濾濿瀀瀁瀂瀃瀄瀅瀆瀇瀈瀉瀊瀋瀌瀍瀎瀏瀐瀒瀓瀔瀕瀖瀗瀘瀙瀜瀝瀞瀟瀠瀡瀢瀤瀥瀦瀧瀨瀩瀪�瀫瀬瀭瀮瀯瀰瀱瀲瀳瀴瀶瀷瀸瀺瀻瀼瀽瀾瀿灀灁灂灃灄灅灆灇灈灉灊灋灍灎灐灑灒灓灔灕灖灗灘灙灚灛灜灝灟灠灡灢灣灤灥灦灧灨灩灪灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞炟炠炡炢炣炤炥炦炧炨炩炪炰炲炴炵炶為炾炿烄烅烆烇烉烋烌烍烎烏烐烑烒烓烔烕烖烗烚�".split(""),e=0;e!=n[158].length;++e)65533!==n[158][e].charCodeAt(0)&&(r[n[158][e]]=40448+e,t[40448+e]=n[158][e]);for(n[159]="����������������������������������������������������������������烜烝烞烠烡烢烣烥烪烮烰烱烲烳烴烵烶烸烺烻烼烾烿焀焁焂焃焄焅焆焇焈焋焌焍焎焏焑焒焔焗焛焜焝焞焟焠無焢焣焤焥焧焨焩焪焫焬焭焮焲焳焴�焵焷焸焹焺焻焼焽焾焿煀煁煂煃煄煆煇煈煉煋煍煏煐煑煒煓煔煕煖煗煘煙煚煛煝煟煠煡煢煣煥煩煪煫煬煭煯煰煱煴煵煶煷煹煻煼煾煿熀熁熂熃熅熆熇熈熉熋熌熍熎熐熑熒熓熕熖熗熚熛熜熝熞熡熢熣熤熥熦熧熩熪熫熭熮熯熰熱熲熴熶熷熸熺熻熼熽熾熿燀燁燂燄燅燆燇燈燉燊燋燌燍燏燐燑燒燓�".split(""),e=0;e!=n[159].length;++e)65533!==n[159][e].charCodeAt(0)&&(r[n[159][e]]=40704+e,t[40704+e]=n[159][e]);for(n[160]="����������������������������������������������������������������燖燗燘燙燚燛燜燝燞營燡燢燣燤燦燨燩燪燫燬燭燯燰燱燲燳燴燵燶燷燸燺燻燼燽燾燿爀爁爂爃爄爅爇爈爉爊爋爌爍爎爏爐爑爒爓爔爕爖爗爘爙爚�爛爜爞爟爠爡爢爣爤爥爦爧爩爫爭爮爯爲爳爴爺爼爾牀牁牂牃牄牅牆牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅犆犇犈犉犌犎犐犑犓犔犕犖犗犘犙犚犛犜犝犞犠犡犢犣犤犥犦犧犨犩犪犫犮犱犲犳犵犺犻犼犽犾犿狀狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛�".split(""),e=0;e!=n[160].length;++e)65533!==n[160][e].charCodeAt(0)&&(r[n[160][e]]=40960+e,t[40960+e]=n[160][e]);for(n[161]="����������������������������������������������������������������������������������������������������������������������������������������������������������������� 、。·ˉˇ¨〃々—~‖…‘’“”〔〕〈〉《》「」『』〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓�".split(""),e=0;e!=n[161].length;++e)65533!==n[161][e].charCodeAt(0)&&(r[n[161][e]]=41216+e,t[41216+e]=n[161][e]);for(n[162]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ������⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩��㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩��ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ���".split(""),e=0;e!=n[162].length;++e)65533!==n[162][e].charCodeAt(0)&&(r[n[162][e]]=41472+e,t[41472+e]=n[162][e]);for(n[163]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������!"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�".split(""),e=0;e!=n[163].length;++e)65533!==n[163][e].charCodeAt(0)&&(r[n[163][e]]=41728+e,t[41728+e]=n[163][e]);for(n[164]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������".split(""),e=0;e!=n[164].length;++e)65533!==n[164][e].charCodeAt(0)&&(r[n[164][e]]=41984+e,t[41984+e]=n[164][e]);for(n[165]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������".split(""),e=0;e!=n[165].length;++e)65533!==n[165][e].charCodeAt(0)&&(r[n[165][e]]=42240+e,t[42240+e]=n[165][e]);for(n[166]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�������︵︶︹︺︿﹀︽︾﹁﹂﹃﹄��︻︼︷︸︱�︳︴����������".split(""),e=0;e!=n[166].length;++e)65533!==n[166][e].charCodeAt(0)&&(r[n[166][e]]=42496+e,t[42496+e]=n[166][e]);for(n[167]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������".split(""),e=0;e!=n[167].length;++e)65533!==n[167][e].charCodeAt(0)&&(r[n[167][e]]=42752+e,t[42752+e]=n[167][e]);for(n[168]="����������������������������������������������������������������ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳▁▂▃▄▅▆▇�█▉▊▋▌▍▎▏▓▔▕▼▽◢◣◤◥☉⊕〒〝〞�����������āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑ�ńň�ɡ����ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ����������������������".split(""),e=0;e!=n[168].length;++e)65533!==n[168][e].charCodeAt(0)&&(r[n[168][e]]=43008+e,t[43008+e]=n[168][e]);for(n[169]="����������������������������������������������������������������〡〢〣〤〥〦〧〨〩㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰¬¦�℡㈱�‐���ー゛゜ヽヾ〆ゝゞ﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹔﹕﹖﹗﹙﹚﹛﹜﹝﹞﹟﹠﹡�﹢﹣﹤﹥﹦﹨﹩﹪﹫�������������〇�������������─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋����������������".split(""),e=0;e!=n[169].length;++e)65533!==n[169][e].charCodeAt(0)&&(r[n[169][e]]=43264+e,t[43264+e]=n[169][e]);for(n[170]="����������������������������������������������������������������狜狝狟狢狣狤狥狦狧狪狫狵狶狹狽狾狿猀猂猄猅猆猇猈猉猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀獁獂獃獄獅獆獇獈�獉獊獋獌獎獏獑獓獔獕獖獘獙獚獛獜獝獞獟獡獢獣獤獥獦獧獨獩獪獫獮獰獱�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[170].length;++e)65533!==n[170][e].charCodeAt(0)&&(r[n[170][e]]=43520+e,t[43520+e]=n[170][e]);for(n[171]="����������������������������������������������������������������獲獳獴獵獶獷獸獹獺獻獼獽獿玀玁玂玃玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣玤玥玦玧玨玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃珄珅珆珇�珋珌珎珒珓珔珕珖珗珘珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳珴珵珶珷�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[171].length;++e)65533!==n[171][e].charCodeAt(0)&&(r[n[171][e]]=43776+e,t[43776+e]=n[171][e]);for(n[172]="����������������������������������������������������������������珸珹珺珻珼珽現珿琀琁琂琄琇琈琋琌琍琎琑琒琓琔琕琖琗琘琙琜琝琞琟琠琡琣琤琧琩琫琭琯琱琲琷琸琹琺琻琽琾琿瑀瑂瑃瑄瑅瑆瑇瑈瑉瑊瑋瑌瑍�瑎瑏瑐瑑瑒瑓瑔瑖瑘瑝瑠瑡瑢瑣瑤瑥瑦瑧瑨瑩瑪瑫瑬瑮瑯瑱瑲瑳瑴瑵瑸瑹瑺�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[172].length;++e)65533!==n[172][e].charCodeAt(0)&&(r[n[172][e]]=44032+e,t[44032+e]=n[172][e]);for(n[173]="����������������������������������������������������������������瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑璒璓璔璕璖璗璘璙璚璛璝璟璠璡璢璣璤璥璦璪璫璬璭璮璯環璱璲璳璴璵璶璷璸璹璻璼璽璾璿瓀瓁瓂瓃瓄瓅瓆瓇�瓈瓉瓊瓋瓌瓍瓎瓏瓐瓑瓓瓔瓕瓖瓗瓘瓙瓚瓛瓝瓟瓡瓥瓧瓨瓩瓪瓫瓬瓭瓰瓱瓲�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[173].length;++e)65533!==n[173][e].charCodeAt(0)&&(r[n[173][e]]=44288+e,t[44288+e]=n[173][e]);for(n[174]="����������������������������������������������������������������瓳瓵瓸瓹瓺瓻瓼瓽瓾甀甁甂甃甅甆甇甈甉甊甋甌甎甐甒甔甕甖甗甛甝甞甠甡產産甤甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘�畝畞畟畠畡畢畣畤畧畨畩畫畬畭畮畯異畱畳畵當畷畺畻畼畽畾疀疁疂疄疅疇�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[174].length;++e)65533!==n[174][e].charCodeAt(0)&&(r[n[174][e]]=44544+e,t[44544+e]=n[174][e]);for(n[175]="����������������������������������������������������������������疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦疧疨疩疪疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇�瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[175].length;++e)65533!==n[175][e].charCodeAt(0)&&(r[n[175][e]]=44800+e,t[44800+e]=n[175][e]);for(n[176]="����������������������������������������������������������������癅癆癇癈癉癊癋癎癏癐癑癒癓癕癗癘癙癚癛癝癟癠癡癢癤癥癦癧癨癩癪癬癭癮癰癱癲癳癴癵癶癷癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛�皜皝皞皟皠皡皢皣皥皦皧皨皩皪皫皬皭皯皰皳皵皶皷皸皹皺皻皼皽皾盀盁盃啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥�".split(""),e=0;e!=n[176].length;++e)65533!==n[176][e].charCodeAt(0)&&(r[n[176][e]]=45056+e,t[45056+e]=n[176][e]);for(n[177]="����������������������������������������������������������������盄盇盉盋盌盓盕盙盚盜盝盞盠盡盢監盤盦盧盨盩盪盫盬盭盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎眏眐眑眒眓眔眕眖眗眘眛眜眝眞眡眣眤眥眧眪眫�眬眮眰眱眲眳眴眹眻眽眾眿睂睄睅睆睈睉睊睋睌睍睎睏睒睓睔睕睖睗睘睙睜薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳�".split(""),e=0;e!=n[177].length;++e)65533!==n[177][e].charCodeAt(0)&&(r[n[177][e]]=45312+e,t[45312+e]=n[177][e]);for(n[178]="����������������������������������������������������������������睝睞睟睠睤睧睩睪睭睮睯睰睱睲睳睴睵睶睷睸睺睻睼瞁瞂瞃瞆瞇瞈瞉瞊瞋瞏瞐瞓瞔瞕瞖瞗瞘瞙瞚瞛瞜瞝瞞瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶瞷瞸瞹瞺�瞼瞾矀矁矂矃矄矅矆矇矈矉矊矋矌矎矏矐矑矒矓矔矕矖矘矙矚矝矞矟矠矡矤病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖�".split(""),e=0;e!=n[178].length;++e)65533!==n[178][e].charCodeAt(0)&&(r[n[178][e]]=45568+e,t[45568+e]=n[178][e]);for(n[179]="����������������������������������������������������������������矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃砄砅砆砇砈砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚�硛硜硞硟硠硡硢硣硤硥硦硧硨硩硯硰硱硲硳硴硵硶硸硹硺硻硽硾硿碀碁碂碃场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚�".split(""),e=0;e!=n[179].length;++e)65533!==n[179][e].charCodeAt(0)&&(r[n[179][e]]=45824+e,t[45824+e]=n[179][e]);for(n[180]="����������������������������������������������������������������碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨碩碪碫碬碭碮碯碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚磛磜磝磞磟磠磡磢磣�磤磥磦磧磩磪磫磭磮磯磰磱磳磵磶磸磹磻磼磽磾磿礀礂礃礄礆礇礈礉礊礋礌础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮�".split(""),e=0;e!=n[180].length;++e)65533!==n[180][e].charCodeAt(0)&&(r[n[180][e]]=46080+e,t[46080+e]=n[180][e]);for(n[181]="����������������������������������������������������������������礍礎礏礐礑礒礔礕礖礗礘礙礚礛礜礝礟礠礡礢礣礥礦礧礨礩礪礫礬礭礮礯礰礱礲礳礵礶礷礸礹礽礿祂祃祄祅祇祊祋祌祍祎祏祐祑祒祔祕祘祙祡祣�祤祦祩祪祫祬祮祰祱祲祳祴祵祶祹祻祼祽祾祿禂禃禆禇禈禉禋禌禍禎禐禑禒怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠�".split(""),e=0;e!=n[181].length;++e)65533!==n[181][e].charCodeAt(0)&&(r[n[181][e]]=46336+e,t[46336+e]=n[181][e]);for(n[182]="����������������������������������������������������������������禓禔禕禖禗禘禙禛禜禝禞禟禠禡禢禣禤禥禦禨禩禪禫禬禭禮禯禰禱禲禴禵禶禷禸禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙秚秛秜秝秞秠秡秢秥秨秪�秬秮秱秲秳秴秵秶秷秹秺秼秾秿稁稄稅稇稈稉稊稌稏稐稑稒稓稕稖稘稙稛稜丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二�".split(""),e=0;e!=n[182].length;++e)65533!==n[182][e].charCodeAt(0)&&(r[n[182][e]]=46592+e,t[46592+e]=n[182][e]);for(n[183]="����������������������������������������������������������������稝稟稡稢稤稥稦稧稨稩稪稫稬稭種稯稰稱稲稴稵稶稸稺稾穀穁穂穃穄穅穇穈穉穊穋穌積穎穏穐穒穓穔穕穖穘穙穚穛穜穝穞穟穠穡穢穣穤穥穦穧穨�穩穪穫穬穭穮穯穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服�".split(""),e=0;e!=n[183].length;++e)65533!==n[183][e].charCodeAt(0)&&(r[n[183][e]]=46848+e,t[46848+e]=n[183][e]);for(n[184]="����������������������������������������������������������������窣窤窧窩窪窫窮窯窰窱窲窴窵窶窷窸窹窺窻窼窽窾竀竁竂竃竄竅竆竇竈竉竊竌竍竎竏竐竑竒竓竔竕竗竘竚竛竜竝竡竢竤竧竨竩竪竫竬竮竰竱竲竳�竴竵競竷竸竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹�".split(""),e=0;e!=n[184].length;++e)65533!==n[184][e].charCodeAt(0)&&(r[n[184][e]]=47104+e,t[47104+e]=n[184][e]);for(n[185]="����������������������������������������������������������������笯笰笲笴笵笶笷笹笻笽笿筀筁筂筃筄筆筈筊筍筎筓筕筗筙筜筞筟筡筣筤筥筦筧筨筩筪筫筬筭筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆箇箈箉箊箋箌箎箏�箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹箺箻箼箽箾箿節篂篃範埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈�".split(""),e=0;e!=n[185].length;++e)65533!==n[185][e].charCodeAt(0)&&(r[n[185][e]]=47360+e,t[47360+e]=n[185][e]);for(n[186]="����������������������������������������������������������������篅篈築篊篋篍篎篏篐篒篔篕篖篗篘篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲篳篴篵篶篸篹篺篻篽篿簀簁簂簃簄簅簆簈簉簊簍簎簐簑簒簓簔簕簗簘簙�簚簛簜簝簞簠簡簢簣簤簥簨簩簫簬簭簮簯簰簱簲簳簴簵簶簷簹簺簻簼簽簾籂骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖�".split(""),e=0;e!=n[186].length;++e)65533!==n[186][e].charCodeAt(0)&&(r[n[186][e]]=47616+e,t[47616+e]=n[186][e]);for(n[187]="����������������������������������������������������������������籃籄籅籆籇籈籉籊籋籌籎籏籐籑籒籓籔籕籖籗籘籙籚籛籜籝籞籟籠籡籢籣籤籥籦籧籨籩籪籫籬籭籮籯籰籱籲籵籶籷籸籹籺籾籿粀粁粂粃粄粅粆粇�粈粊粋粌粍粎粏粐粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴粵粶粷粸粺粻弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕�".split(""),e=0;e!=n[187].length;++e)65533!==n[187][e].charCodeAt(0)&&(r[n[187][e]]=47872+e,t[47872+e]=n[187][e]);for(n[188]="����������������������������������������������������������������粿糀糂糃糄糆糉糋糎糏糐糑糒糓糔糘糚糛糝糞糡糢糣糤糥糦糧糩糪糫糬糭糮糰糱糲糳糴糵糶糷糹糺糼糽糾糿紀紁紂紃約紅紆紇紈紉紋紌納紎紏紐�紑紒紓純紕紖紗紘紙級紛紜紝紞紟紡紣紤紥紦紨紩紪紬紭紮細紱紲紳紴紵紶肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件�".split(""),e=0;e!=n[188].length;++e)65533!==n[188][e].charCodeAt(0)&&(r[n[188][e]]=48128+e,t[48128+e]=n[188][e]);for(n[189]="����������������������������������������������������������������紷紸紹紺紻紼紽紾紿絀絁終絃組絅絆絇絈絉絊絋経絍絎絏結絑絒絓絔絕絖絗絘絙絚絛絜絝絞絟絠絡絢絣絤絥給絧絨絩絪絫絬絭絯絰統絲絳絴絵絶�絸絹絺絻絼絽絾絿綀綁綂綃綄綅綆綇綈綉綊綋綌綍綎綏綐綑綒經綔綕綖綗綘健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸�".split(""),e=0;e!=n[189].length;++e)65533!==n[189][e].charCodeAt(0)&&(r[n[189][e]]=48384+e,t[48384+e]=n[189][e]);for(n[190]="����������������������������������������������������������������継続綛綜綝綞綟綠綡綢綣綤綥綧綨綩綪綫綬維綯綰綱網綳綴綵綶綷綸綹綺綻綼綽綾綿緀緁緂緃緄緅緆緇緈緉緊緋緌緍緎総緐緑緒緓緔緕緖緗緘緙�線緛緜緝緞緟締緡緢緣緤緥緦緧編緩緪緫緬緭緮緯緰緱緲緳練緵緶緷緸緹緺尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻�".split(""),e=0;e!=n[190].length;++e)65533!==n[190][e].charCodeAt(0)&&(r[n[190][e]]=48640+e,t[48640+e]=n[190][e]);for(n[191]="����������������������������������������������������������������緻緼緽緾緿縀縁縂縃縄縅縆縇縈縉縊縋縌縍縎縏縐縑縒縓縔縕縖縗縘縙縚縛縜縝縞縟縠縡縢縣縤縥縦縧縨縩縪縫縬縭縮縯縰縱縲縳縴縵縶縷縸縹�縺縼總績縿繀繂繃繄繅繆繈繉繊繋繌繍繎繏繐繑繒繓織繕繖繗繘繙繚繛繜繝俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀�".split(""),e=0;e!=n[191].length;++e)65533!==n[191][e].charCodeAt(0)&&(r[n[191][e]]=48896+e,t[48896+e]=n[191][e]);for(n[192]="����������������������������������������������������������������繞繟繠繡繢繣繤繥繦繧繨繩繪繫繬繭繮繯繰繱繲繳繴繵繶繷繸繹繺繻繼繽繾繿纀纁纃纄纅纆纇纈纉纊纋續纍纎纏纐纑纒纓纔纕纖纗纘纙纚纜纝纞�纮纴纻纼绖绤绬绹缊缐缞缷缹缻缼缽缾缿罀罁罃罆罇罈罉罊罋罌罍罎罏罒罓馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐�".split(""),e=0;e!=n[192].length;++e)65533!==n[192][e].charCodeAt(0)&&(r[n[192][e]]=49152+e,t[49152+e]=n[192][e]);for(n[193]="����������������������������������������������������������������罖罙罛罜罝罞罠罣罤罥罦罧罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂羃羄羅羆羇羈羉羋羍羏羐羑羒羓羕羖羗羘羙羛羜羠羢羣羥羦羨義羪羫羬羭羮羱�羳羴羵羶羷羺羻羾翀翂翃翄翆翇翈翉翋翍翏翐翑習翓翖翗翙翚翛翜翝翞翢翣痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿�".split(""),e=0;e!=n[193].length;++e)65533!==n[193][e].charCodeAt(0)&&(r[n[193][e]]=49408+e,t[49408+e]=n[193][e]);for(n[194]="����������������������������������������������������������������翤翧翨翪翫翬翭翯翲翴翵翶翷翸翹翺翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫耬耭耮耯耰耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗�聙聛聜聝聞聟聠聡聢聣聤聥聦聧聨聫聬聭聮聯聰聲聳聴聵聶職聸聹聺聻聼聽隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫�".split(""),e=0;e!=n[194].length;++e)65533!==n[194][e].charCodeAt(0)&&(r[n[194][e]]=49664+e,t[49664+e]=n[194][e]);for(n[195]="����������������������������������������������������������������聾肁肂肅肈肊肍肎肏肐肑肒肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇胈胉胊胋胏胐胑胒胓胔胕胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋�脌脕脗脙脛脜脝脟脠脡脢脣脤脥脦脧脨脩脪脫脭脮脰脳脴脵脷脹脺脻脼脽脿谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸�".split(""),e=0;e!=n[195].length;++e)65533!==n[195][e].charCodeAt(0)&&(r[n[195][e]]=49920+e,t[49920+e]=n[195][e]);for(n[196]="����������������������������������������������������������������腀腁腂腃腄腅腇腉腍腎腏腒腖腗腘腛腜腝腞腟腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃膄膅膆膇膉膋膌膍膎膐膒膓膔膕膖膗膙膚膞膟膠膡膢膤膥�膧膩膫膬膭膮膯膰膱膲膴膵膶膷膸膹膼膽膾膿臄臅臇臈臉臋臍臎臏臐臑臒臓摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁�".split(""),e=0;e!=n[196].length;++e)65533!==n[196][e].charCodeAt(0)&&(r[n[196][e]]=50176+e,t[50176+e]=n[196][e]);for(n[197]="����������������������������������������������������������������臔臕臖臗臘臙臚臛臜臝臞臟臠臡臢臤臥臦臨臩臫臮臯臰臱臲臵臶臷臸臹臺臽臿舃與興舉舊舋舎舏舑舓舕舖舗舘舙舚舝舠舤舥舦舧舩舮舲舺舼舽舿�艀艁艂艃艅艆艈艊艌艍艎艐艑艒艓艔艕艖艗艙艛艜艝艞艠艡艢艣艤艥艦艧艩拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗�".split(""),e=0;e!=n[197].length;++e)65533!==n[197][e].charCodeAt(0)&&(r[n[197][e]]=50432+e,t[50432+e]=n[197][e]);for(n[198]="����������������������������������������������������������������艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸�苺苼苽苾苿茀茊茋茍茐茒茓茖茘茙茝茞茟茠茡茢茣茤茥茦茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐�".split(""),e=0;e!=n[198].length;++e)65533!==n[198][e].charCodeAt(0)&&(r[n[198][e]]=50688+e,t[50688+e]=n[198][e]);for(n[199]="����������������������������������������������������������������茾茿荁荂荄荅荈荊荋荌荍荎荓荕荖荗荘荙荝荢荰荱荲荳荴荵荶荹荺荾荿莀莁莂莃莄莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡莢莣莤莥莦莧莬莭莮�莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠�".split(""),e=0;e!=n[199].length;++e)65533!==n[199][e].charCodeAt(0)&&(r[n[199][e]]=50944+e,t[50944+e]=n[199][e]);for(n[200]="����������������������������������������������������������������菮華菳菴菵菶菷菺菻菼菾菿萀萂萅萇萈萉萊萐萒萓萔萕萖萗萙萚萛萞萟萠萡萢萣萩萪萫萬萭萮萯萰萲萳萴萵萶萷萹萺萻萾萿葀葁葂葃葄葅葇葈葉�葊葋葌葍葎葏葐葒葓葔葕葖葘葝葞葟葠葢葤葥葦葧葨葪葮葯葰葲葴葷葹葻葼取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁�".split(""),e=0;e!=n[200].length;++e)65533!==n[200][e].charCodeAt(0)&&(r[n[200][e]]=51200+e,t[51200+e]=n[200][e]);for(n[201]="����������������������������������������������������������������葽葾葿蒀蒁蒃蒄蒅蒆蒊蒍蒏蒐蒑蒒蒓蒔蒕蒖蒘蒚蒛蒝蒞蒟蒠蒢蒣蒤蒥蒦蒧蒨蒩蒪蒫蒬蒭蒮蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗�蓘蓙蓚蓛蓜蓞蓡蓢蓤蓧蓨蓩蓪蓫蓭蓮蓯蓱蓲蓳蓴蓵蓶蓷蓸蓹蓺蓻蓽蓾蔀蔁蔂伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳�".split(""),e=0;e!=n[201].length;++e)65533!==n[201][e].charCodeAt(0)&&(r[n[201][e]]=51456+e,t[51456+e]=n[201][e]);for(n[202]="����������������������������������������������������������������蔃蔄蔅蔆蔇蔈蔉蔊蔋蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢蔣蔤蔥蔦蔧蔨蔩蔪蔭蔮蔯蔰蔱蔲蔳蔴蔵蔶蔾蔿蕀蕁蕂蕄蕅蕆蕇蕋蕌蕍蕎蕏蕐蕑蕒蕓蕔蕕�蕗蕘蕚蕛蕜蕝蕟蕠蕡蕢蕣蕥蕦蕧蕩蕪蕫蕬蕭蕮蕯蕰蕱蕳蕵蕶蕷蕸蕼蕽蕿薀薁省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱�".split(""),e=0;e!=n[202].length;++e)65533!==n[202][e].charCodeAt(0)&&(r[n[202][e]]=51712+e,t[51712+e]=n[202][e]);for(n[203]="����������������������������������������������������������������薂薃薆薈薉薊薋薌薍薎薐薑薒薓薔薕薖薗薘薙薚薝薞薟薠薡薢薣薥薦薧薩薫薬薭薱薲薳薴薵薶薸薺薻薼薽薾薿藀藂藃藄藅藆藇藈藊藋藌藍藎藑藒�藔藖藗藘藙藚藛藝藞藟藠藡藢藣藥藦藧藨藪藫藬藭藮藯藰藱藲藳藴藵藶藷藸恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔�".split(""),e=0;e!=n[203].length;++e)65533!==n[203][e].charCodeAt(0)&&(r[n[203][e]]=51968+e,t[51968+e]=n[203][e]);for(n[204]="����������������������������������������������������������������藹藺藼藽藾蘀蘁蘂蘃蘄蘆蘇蘈蘉蘊蘋蘌蘍蘎蘏蘐蘒蘓蘔蘕蘗蘘蘙蘚蘛蘜蘝蘞蘟蘠蘡蘢蘣蘤蘥蘦蘨蘪蘫蘬蘭蘮蘯蘰蘱蘲蘳蘴蘵蘶蘷蘹蘺蘻蘽蘾蘿虀�虁虂虃虄虅虆虇虈虉虊虋虌虒虓處虖虗虘虙虛虜虝號虠虡虣虤虥虦虧虨虩虪獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃�".split(""),e=0;e!=n[204].length;++e)65533!==n[204][e].charCodeAt(0)&&(r[n[204][e]]=52224+e,t[52224+e]=n[204][e]);for(n[205]="����������������������������������������������������������������虭虯虰虲虳虴虵虶虷虸蚃蚄蚅蚆蚇蚈蚉蚎蚏蚐蚑蚒蚔蚖蚗蚘蚙蚚蚛蚞蚟蚠蚡蚢蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻蚼蚽蚾蚿蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜�蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威�".split(""),e=0;e!=n[205].length;++e)65533!==n[205][e].charCodeAt(0)&&(r[n[205][e]]=52480+e,t[52480+e]=n[205][e]);for(n[206]="����������������������������������������������������������������蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀蝁蝂蝃蝄蝅蝆蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚蝛蝜蝝蝞蝟蝡蝢蝦蝧蝨蝩蝪蝫蝬蝭蝯蝱蝲蝳蝵�蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎螏螐螑螒螔螕螖螘螙螚螛螜螝螞螠螡螢螣螤巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺�".split(""),e=0;e!=n[206].length;++e)65533!==n[206][e].charCodeAt(0)&&(r[n[206][e]]=52736+e,t[52736+e]=n[206][e]);for(n[207]="����������������������������������������������������������������螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁蟂蟃蟄蟅蟇蟈蟉蟌蟍蟎蟏蟐蟔蟕蟖蟗蟘蟙蟚蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯蟰蟱蟲蟳蟴蟵蟶蟷蟸�蟺蟻蟼蟽蟿蠀蠁蠂蠄蠅蠆蠇蠈蠉蠋蠌蠍蠎蠏蠐蠑蠒蠔蠗蠘蠙蠚蠜蠝蠞蠟蠠蠣稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓�".split(""),e=0;e!=n[207].length;++e)65533!==n[207][e].charCodeAt(0)&&(r[n[207][e]]=52992+e,t[52992+e]=n[207][e]);for(n[208]="����������������������������������������������������������������蠤蠥蠦蠧蠨蠩蠪蠫蠬蠭蠮蠯蠰蠱蠳蠴蠵蠶蠷蠸蠺蠻蠽蠾蠿衁衂衃衆衇衈衉衊衋衎衏衐衑衒術衕衖衘衚衛衜衝衞衟衠衦衧衪衭衯衱衳衴衵衶衸衹衺�衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗袘袙袚袛袝袞袟袠袡袣袥袦袧袨袩袪小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄�".split(""),e=0;e!=n[208].length;++e)65533!==n[208][e].charCodeAt(0)&&(r[n[208][e]]=53248+e,t[53248+e]=n[208][e]);for(n[209]="����������������������������������������������������������������袬袮袯袰袲袳袴袵袶袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚裛補裝裞裠裡裦裧裩裪裫裬裭裮裯裲裵裶裷裺裻製裿褀褁褃褄褅褆複褈�褉褋褌褍褎褏褑褔褕褖褗褘褜褝褞褟褠褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶�".split(""),e=0;e!=n[209].length;++e)65533!==n[209][e].charCodeAt(0)&&(r[n[209][e]]=53504+e,t[53504+e]=n[209][e]);for(n[210]="����������������������������������������������������������������褸褹褺褻褼褽褾褿襀襂襃襅襆襇襈襉襊襋襌襍襎襏襐襑襒襓襔襕襖襗襘襙襚襛襜襝襠襡襢襣襤襥襧襨襩襪襫襬襭襮襯襰襱襲襳襴襵襶襷襸襹襺襼�襽襾覀覂覄覅覇覈覉覊見覌覍覎規覐覑覒覓覔覕視覗覘覙覚覛覜覝覞覟覠覡摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐�".split(""),e=0;e!=n[210].length;++e)65533!==n[210][e].charCodeAt(0)&&(r[n[210][e]]=53760+e,t[53760+e]=n[210][e]);for(n[211]="����������������������������������������������������������������覢覣覤覥覦覧覨覩親覫覬覭覮覯覰覱覲観覴覵覶覷覸覹覺覻覼覽覾覿觀觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴觵觶觷觸觹觺�觻觼觽觾觿訁訂訃訄訅訆計訉訊訋訌訍討訏訐訑訒訓訔訕訖託記訙訚訛訜訝印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉�".split(""),e=0;e!=n[211].length;++e)65533!==n[211][e].charCodeAt(0)&&(r[n[211][e]]=54016+e,t[54016+e]=n[211][e]);for(n[212]="����������������������������������������������������������������訞訟訠訡訢訣訤訥訦訧訨訩訪訫訬設訮訯訰許訲訳訴訵訶訷訸訹診註証訽訿詀詁詂詃詄詅詆詇詉詊詋詌詍詎詏詐詑詒詓詔評詖詗詘詙詚詛詜詝詞�詟詠詡詢詣詤詥試詧詨詩詪詫詬詭詮詯詰話該詳詴詵詶詷詸詺詻詼詽詾詿誀浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧�".split(""),e=0;e!=n[212].length;++e)65533!==n[212][e].charCodeAt(0)&&(r[n[212][e]]=54272+e,t[54272+e]=n[212][e]);for(n[213]="����������������������������������������������������������������誁誂誃誄誅誆誇誈誋誌認誎誏誐誑誒誔誕誖誗誘誙誚誛誜誝語誟誠誡誢誣誤誥誦誧誨誩說誫説読誮誯誰誱課誳誴誵誶誷誸誹誺誻誼誽誾調諀諁諂�諃諄諅諆談諈諉諊請諌諍諎諏諐諑諒諓諔諕論諗諘諙諚諛諜諝諞諟諠諡諢諣铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政�".split(""),e=0;e!=n[213].length;++e)65533!==n[213][e].charCodeAt(0)&&(r[n[213][e]]=54528+e,t[54528+e]=n[213][e]);for(n[214]="����������������������������������������������������������������諤諥諦諧諨諩諪諫諬諭諮諯諰諱諲諳諴諵諶諷諸諹諺諻諼諽諾諿謀謁謂謃謄謅謆謈謉謊謋謌謍謎謏謐謑謒謓謔謕謖謗謘謙謚講謜謝謞謟謠謡謢謣�謤謥謧謨謩謪謫謬謭謮謯謰謱謲謳謴謵謶謷謸謹謺謻謼謽謾謿譀譁譂譃譄譅帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑�".split(""),e=0;e!=n[214].length;++e)65533!==n[214][e].charCodeAt(0)&&(r[n[214][e]]=54784+e,t[54784+e]=n[214][e]);for(n[215]="����������������������������������������������������������������譆譇譈證譊譋譌譍譎譏譐譑譒譓譔譕譖譗識譙譚譛譜譝譞譟譠譡譢譣譤譥譧譨譩譪譫譭譮譯議譱譲譳譴譵譶護譸譹譺譻譼譽譾譿讀讁讂讃讄讅讆�讇讈讉變讋讌讍讎讏讐讑讒讓讔讕讖讗讘讙讚讛讜讝讞讟讬讱讻诇诐诪谉谞住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座������".split(""),e=0;e!=n[215].length;++e)65533!==n[215][e].charCodeAt(0)&&(r[n[215][e]]=55040+e,t[55040+e]=n[215][e]);for(n[216]="����������������������������������������������������������������谸谹谺谻谼谽谾谿豀豂豃豄豅豈豊豋豍豎豏豐豑豒豓豔豖豗豘豙豛豜豝豞豟豠豣豤豥豦豧豨豩豬豭豮豯豰豱豲豴豵豶豷豻豼豽豾豿貀貁貃貄貆貇�貈貋貍貎貏貐貑貒貓貕貖貗貙貚貛貜貝貞貟負財貢貣貤貥貦貧貨販貪貫責貭亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝�".split(""),e=0;e!=n[216].length;++e)65533!==n[216][e].charCodeAt(0)&&(r[n[216][e]]=55296+e,t[55296+e]=n[216][e]);for(n[217]="����������������������������������������������������������������貮貯貰貱貲貳貴貵貶買貸貹貺費貼貽貾貿賀賁賂賃賄賅賆資賈賉賊賋賌賍賎賏賐賑賒賓賔賕賖賗賘賙賚賛賜賝賞賟賠賡賢賣賤賥賦賧賨賩質賫賬�賭賮賯賰賱賲賳賴賵賶賷賸賹賺賻購賽賾賿贀贁贂贃贄贅贆贇贈贉贊贋贌贍佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼�".split(""),e=0;e!=n[217].length;++e)65533!==n[217][e].charCodeAt(0)&&(r[n[217][e]]=55552+e,t[55552+e]=n[217][e]);for(n[218]="����������������������������������������������������������������贎贏贐贑贒贓贔贕贖贗贘贙贚贛贜贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸赹赺赻赼赽赾赿趀趂趃趆趇趈趉趌趍趎趏趐趒趓趕趖趗趘趙趚趛趜趝趞趠趡�趢趤趥趦趧趨趩趪趫趬趭趮趯趰趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺�".split(""),e=0;e!=n[218].length;++e)65533!==n[218][e].charCodeAt(0)&&(r[n[218][e]]=55808+e,t[55808+e]=n[218][e]);for(n[219]="����������������������������������������������������������������跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾跿踀踁踂踃踄踆踇踈踋踍踎踐踑踒踓踕踖踗踘踙踚踛踜踠踡踤踥踦踧踨踫踭踰踲踳踴踶踷踸踻踼踾�踿蹃蹅蹆蹌蹍蹎蹏蹐蹓蹔蹕蹖蹗蹘蹚蹛蹜蹝蹞蹟蹠蹡蹢蹣蹤蹥蹧蹨蹪蹫蹮蹱邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝�".split(""),e=0;e!=n[219].length;++e)65533!==n[219][e].charCodeAt(0)&&(r[n[219][e]]=56064+e,t[56064+e]=n[219][e]);for(n[220]="����������������������������������������������������������������蹳蹵蹷蹸蹹蹺蹻蹽蹾躀躂躃躄躆躈躉躊躋躌躍躎躑躒躓躕躖躗躘躙躚躛躝躟躠躡躢躣躤躥躦躧躨躩躪躭躮躰躱躳躴躵躶躷躸躹躻躼躽躾躿軀軁軂�軃軄軅軆軇軈軉車軋軌軍軏軐軑軒軓軔軕軖軗軘軙軚軛軜軝軞軟軠軡転軣軤堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥�".split(""),e=0;e!=n[220].length;++e)65533!==n[220][e].charCodeAt(0)&&(r[n[220][e]]=56320+e,t[56320+e]=n[220][e]);for(n[221]="����������������������������������������������������������������軥軦軧軨軩軪軫軬軭軮軯軰軱軲軳軴軵軶軷軸軹軺軻軼軽軾軿輀輁輂較輄輅輆輇輈載輊輋輌輍輎輏輐輑輒輓輔輕輖輗輘輙輚輛輜輝輞輟輠輡輢輣�輤輥輦輧輨輩輪輫輬輭輮輯輰輱輲輳輴輵輶輷輸輹輺輻輼輽輾輿轀轁轂轃轄荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺�".split(""),e=0;e!=n[221].length;++e)65533!==n[221][e].charCodeAt(0)&&(r[n[221][e]]=56576+e,t[56576+e]=n[221][e]);for(n[222]="����������������������������������������������������������������轅轆轇轈轉轊轋轌轍轎轏轐轑轒轓轔轕轖轗轘轙轚轛轜轝轞轟轠轡轢轣轤轥轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆�迉迊迋迌迍迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖�".split(""),e=0;e!=n[222].length;++e)65533!==n[222][e].charCodeAt(0)&&(r[n[222][e]]=56832+e,t[56832+e]=n[222][e]);for(n[223]="����������������������������������������������������������������這逜連逤逥逧逨逩逪逫逬逰週進逳逴逷逹逺逽逿遀遃遅遆遈遉遊運遌過達違遖遙遚遜遝遞遟遠遡遤遦遧適遪遫遬遯遰遱遲遳遶遷選遹遺遻遼遾邁�還邅邆邇邉邊邌邍邎邏邐邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼�".split(""),e=0;e!=n[223].length;++e)65533!==n[223][e].charCodeAt(0)&&(r[n[223][e]]=57088+e,t[57088+e]=n[223][e]);for(n[224]="����������������������������������������������������������������郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅鄆鄇鄈鄉鄊鄋鄌鄍鄎鄏鄐鄑鄒鄓鄔鄕鄖鄗鄘鄚鄛鄜�鄝鄟鄠鄡鄤鄥鄦鄧鄨鄩鄪鄫鄬鄭鄮鄰鄲鄳鄴鄵鄶鄷鄸鄺鄻鄼鄽鄾鄿酀酁酂酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼�".split(""),e=0;e!=n[224].length;++e)65533!==n[224][e].charCodeAt(0)&&(r[n[224][e]]=57344+e,t[57344+e]=n[224][e]);for(n[225]="����������������������������������������������������������������酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀醁醂醃醄醆醈醊醎醏醓醔醕醖醗醘醙醜醝醞醟醠醡醤醥醦醧醨醩醫醬醰醱醲醳醶醷醸醹醻�醼醽醾醿釀釁釂釃釄釅釆釈釋釐釒釓釔釕釖釗釘釙釚釛針釞釟釠釡釢釣釤釥帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺�".split(""),e=0;e!=n[225].length;++e)65533!==n[225][e].charCodeAt(0)&&(r[n[225][e]]=57600+e,t[57600+e]=n[225][e]);for(n[226]="����������������������������������������������������������������釦釧釨釩釪釫釬釭釮釯釰釱釲釳釴釵釶釷釸釹釺釻釼釽釾釿鈀鈁鈂鈃鈄鈅鈆鈇鈈鈉鈊鈋鈌鈍鈎鈏鈐鈑鈒鈓鈔鈕鈖鈗鈘鈙鈚鈛鈜鈝鈞鈟鈠鈡鈢鈣鈤�鈥鈦鈧鈨鈩鈪鈫鈬鈭鈮鈯鈰鈱鈲鈳鈴鈵鈶鈷鈸鈹鈺鈻鈼鈽鈾鈿鉀鉁鉂鉃鉄鉅狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂�".split(""),e=0;e!=n[226].length;++e)65533!==n[226][e].charCodeAt(0)&&(r[n[226][e]]=57856+e,t[57856+e]=n[226][e]);for(n[227]="����������������������������������������������������������������鉆鉇鉈鉉鉊鉋鉌鉍鉎鉏鉐鉑鉒鉓鉔鉕鉖鉗鉘鉙鉚鉛鉜鉝鉞鉟鉠鉡鉢鉣鉤鉥鉦鉧鉨鉩鉪鉫鉬鉭鉮鉯鉰鉱鉲鉳鉵鉶鉷鉸鉹鉺鉻鉼鉽鉾鉿銀銁銂銃銄銅�銆銇銈銉銊銋銌銍銏銐銑銒銓銔銕銖銗銘銙銚銛銜銝銞銟銠銡銢銣銤銥銦銧恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾�".split(""),e=0;e!=n[227].length;++e)65533!==n[227][e].charCodeAt(0)&&(r[n[227][e]]=58112+e,t[58112+e]=n[227][e]);for(n[228]="����������������������������������������������������������������銨銩銪銫銬銭銯銰銱銲銳銴銵銶銷銸銹銺銻銼銽銾銿鋀鋁鋂鋃鋄鋅鋆鋇鋉鋊鋋鋌鋍鋎鋏鋐鋑鋒鋓鋔鋕鋖鋗鋘鋙鋚鋛鋜鋝鋞鋟鋠鋡鋢鋣鋤鋥鋦鋧鋨�鋩鋪鋫鋬鋭鋮鋯鋰鋱鋲鋳鋴鋵鋶鋷鋸鋹鋺鋻鋼鋽鋾鋿錀錁錂錃錄錅錆錇錈錉洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑�".split(""),e=0;e!=n[228].length;++e)65533!==n[228][e].charCodeAt(0)&&(r[n[228][e]]=58368+e,t[58368+e]=n[228][e]);for(n[229]="����������������������������������������������������������������錊錋錌錍錎錏錐錑錒錓錔錕錖錗錘錙錚錛錜錝錞錟錠錡錢錣錤錥錦錧錨錩錪錫錬錭錮錯錰錱録錳錴錵錶錷錸錹錺錻錼錽錿鍀鍁鍂鍃鍄鍅鍆鍇鍈鍉�鍊鍋鍌鍍鍎鍏鍐鍑鍒鍓鍔鍕鍖鍗鍘鍙鍚鍛鍜鍝鍞鍟鍠鍡鍢鍣鍤鍥鍦鍧鍨鍩鍫濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣�".split(""),e=0;e!=n[229].length;++e)65533!==n[229][e].charCodeAt(0)&&(r[n[229][e]]=58624+e,t[58624+e]=n[229][e]);for(n[230]="����������������������������������������������������������������鍬鍭鍮鍯鍰鍱鍲鍳鍴鍵鍶鍷鍸鍹鍺鍻鍼鍽鍾鍿鎀鎁鎂鎃鎄鎅鎆鎇鎈鎉鎊鎋鎌鎍鎎鎐鎑鎒鎓鎔鎕鎖鎗鎘鎙鎚鎛鎜鎝鎞鎟鎠鎡鎢鎣鎤鎥鎦鎧鎨鎩鎪鎫�鎬鎭鎮鎯鎰鎱鎲鎳鎴鎵鎶鎷鎸鎹鎺鎻鎼鎽鎾鎿鏀鏁鏂鏃鏄鏅鏆鏇鏈鏉鏋鏌鏍妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩�".split(""),e=0;e!=n[230].length;++e)65533!==n[230][e].charCodeAt(0)&&(r[n[230][e]]=58880+e,t[58880+e]=n[230][e]);for(n[231]="����������������������������������������������������������������鏎鏏鏐鏑鏒鏓鏔鏕鏗鏘鏙鏚鏛鏜鏝鏞鏟鏠鏡鏢鏣鏤鏥鏦鏧鏨鏩鏪鏫鏬鏭鏮鏯鏰鏱鏲鏳鏴鏵鏶鏷鏸鏹鏺鏻鏼鏽鏾鏿鐀鐁鐂鐃鐄鐅鐆鐇鐈鐉鐊鐋鐌鐍�鐎鐏鐐鐑鐒鐓鐔鐕鐖鐗鐘鐙鐚鐛鐜鐝鐞鐟鐠鐡鐢鐣鐤鐥鐦鐧鐨鐩鐪鐫鐬鐭鐮纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬�".split(""),e=0;e!=n[231].length;++e)65533!==n[231][e].charCodeAt(0)&&(r[n[231][e]]=59136+e,t[59136+e]=n[231][e]);for(n[232]="����������������������������������������������������������������鐯鐰鐱鐲鐳鐴鐵鐶鐷鐸鐹鐺鐻鐼鐽鐿鑀鑁鑂鑃鑄鑅鑆鑇鑈鑉鑊鑋鑌鑍鑎鑏鑐鑑鑒鑓鑔鑕鑖鑗鑘鑙鑚鑛鑜鑝鑞鑟鑠鑡鑢鑣鑤鑥鑦鑧鑨鑩鑪鑬鑭鑮鑯�鑰鑱鑲鑳鑴鑵鑶鑷鑸鑹鑺鑻鑼鑽鑾鑿钀钁钂钃钄钑钖钘铇铏铓铔铚铦铻锜锠琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹�".split(""),e=0;e!=n[232].length;++e)65533!==n[232][e].charCodeAt(0)&&(r[n[232][e]]=59392+e,t[59392+e]=n[232][e]);for(n[233]="����������������������������������������������������������������锧锳锽镃镈镋镕镚镠镮镴镵長镸镹镺镻镼镽镾門閁閂閃閄閅閆閇閈閉閊開閌閍閎閏閐閑閒間閔閕閖閗閘閙閚閛閜閝閞閟閠閡関閣閤閥閦閧閨閩閪�閫閬閭閮閯閰閱閲閳閴閵閶閷閸閹閺閻閼閽閾閿闀闁闂闃闄闅闆闇闈闉闊闋椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋�".split(""),e=0;e!=n[233].length;++e)65533!==n[233][e].charCodeAt(0)&&(r[n[233][e]]=59648+e,t[59648+e]=n[233][e]);for(n[234]="����������������������������������������������������������������闌闍闎闏闐闑闒闓闔闕闖闗闘闙闚闛關闝闞闟闠闡闢闣闤闥闦闧闬闿阇阓阘阛阞阠阣阤阥阦阧阨阩阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗�陘陙陚陜陝陞陠陣陥陦陫陭陮陯陰陱陳陸陹険陻陼陽陾陿隀隁隂隃隄隇隉隊辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰�".split(""),e=0;e!=n[234].length;++e)65533!==n[234][e].charCodeAt(0)&&(r[n[234][e]]=59904+e,t[59904+e]=n[234][e]);for(n[235]="����������������������������������������������������������������隌階隑隒隓隕隖隚際隝隞隟隠隡隢隣隤隥隦隨隩險隫隬隭隮隯隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖雗雘雙雚雛雜雝雞雟雡離難雤雥雦雧雫�雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗霘霙霚霛霝霟霠搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻�".split(""),e=0;e!=n[235].length;++e)65533!==n[235][e].charCodeAt(0)&&(r[n[235][e]]=60160+e,t[60160+e]=n[235][e]);for(n[236]="����������������������������������������������������������������霡霢霣霤霥霦霧霨霩霫霬霮霯霱霳霴霵霶霷霺霻霼霽霿靀靁靂靃靄靅靆靇靈靉靊靋靌靍靎靏靐靑靔靕靗靘靚靜靝靟靣靤靦靧靨靪靫靬靭靮靯靰靱�靲靵靷靸靹靺靻靽靾靿鞀鞁鞂鞃鞄鞆鞇鞈鞉鞊鞌鞎鞏鞐鞓鞕鞖鞗鞙鞚鞛鞜鞝臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐�".split(""),e=0;e!=n[236].length;++e)65533!==n[236][e].charCodeAt(0)&&(r[n[236][e]]=60416+e,t[60416+e]=n[236][e]);for(n[237]="����������������������������������������������������������������鞞鞟鞡鞢鞤鞥鞦鞧鞨鞩鞪鞬鞮鞰鞱鞳鞵鞶鞷鞸鞹鞺鞻鞼鞽鞾鞿韀韁韂韃韄韅韆韇韈韉韊韋韌韍韎韏韐韑韒韓韔韕韖韗韘韙韚韛韜韝韞韟韠韡韢韣�韤韥韨韮韯韰韱韲韴韷韸韹韺韻韼韽韾響頀頁頂頃頄項順頇須頉頊頋頌頍頎怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨�".split(""),e=0;e!=n[237].length;++e)65533!==n[237][e].charCodeAt(0)&&(r[n[237][e]]=60672+e,t[60672+e]=n[237][e]);for(n[238]="����������������������������������������������������������������頏預頑頒頓頔頕頖頗領頙頚頛頜頝頞頟頠頡頢頣頤頥頦頧頨頩頪頫頬頭頮頯頰頱頲頳頴頵頶頷頸頹頺頻頼頽頾頿顀顁顂顃顄顅顆顇顈顉顊顋題額�顎顏顐顑顒顓顔顕顖顗願顙顚顛顜顝類顟顠顡顢顣顤顥顦顧顨顩顪顫顬顭顮睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪�".split(""),e=0;e!=n[238].length;++e)65533!==n[238][e].charCodeAt(0)&&(r[n[238][e]]=60928+e,t[60928+e]=n[238][e]);for(n[239]="����������������������������������������������������������������顯顰顱顲顳顴颋颎颒颕颙颣風颩颪颫颬颭颮颯颰颱颲颳颴颵颶颷颸颹颺颻颼颽颾颿飀飁飂飃飄飅飆飇飈飉飊飋飌飍飏飐飔飖飗飛飜飝飠飡飢飣飤�飥飦飩飪飫飬飭飮飯飰飱飲飳飴飵飶飷飸飹飺飻飼飽飾飿餀餁餂餃餄餅餆餇铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔�".split(""),e=0;e!=n[239].length;++e)65533!==n[239][e].charCodeAt(0)&&(r[n[239][e]]=61184+e,t[61184+e]=n[239][e]);for(n[240]="����������������������������������������������������������������餈餉養餋餌餎餏餑餒餓餔餕餖餗餘餙餚餛餜餝餞餟餠餡餢餣餤餥餦餧館餩餪餫餬餭餯餰餱餲餳餴餵餶餷餸餹餺餻餼餽餾餿饀饁饂饃饄饅饆饇饈饉�饊饋饌饍饎饏饐饑饒饓饖饗饘饙饚饛饜饝饞饟饠饡饢饤饦饳饸饹饻饾馂馃馉稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙�".split(""),e=0;e!=n[240].length;++e)65533!==n[240][e].charCodeAt(0)&&(r[n[240][e]]=61440+e,t[61440+e]=n[240][e]);for(n[241]="����������������������������������������������������������������馌馎馚馛馜馝馞馟馠馡馢馣馤馦馧馩馪馫馬馭馮馯馰馱馲馳馴馵馶馷馸馹馺馻馼馽馾馿駀駁駂駃駄駅駆駇駈駉駊駋駌駍駎駏駐駑駒駓駔駕駖駗駘�駙駚駛駜駝駞駟駠駡駢駣駤駥駦駧駨駩駪駫駬駭駮駯駰駱駲駳駴駵駶駷駸駹瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃�".split(""),e=0;e!=n[241].length;++e)65533!==n[241][e].charCodeAt(0)&&(r[n[241][e]]=61696+e,t[61696+e]=n[241][e]);for(n[242]="����������������������������������������������������������������駺駻駼駽駾駿騀騁騂騃騄騅騆騇騈騉騊騋騌騍騎騏騐騑騒験騔騕騖騗騘騙騚騛騜騝騞騟騠騡騢騣騤騥騦騧騨騩騪騫騬騭騮騯騰騱騲騳騴騵騶騷騸�騹騺騻騼騽騾騿驀驁驂驃驄驅驆驇驈驉驊驋驌驍驎驏驐驑驒驓驔驕驖驗驘驙颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒�".split(""),e=0;e!=n[242].length;++e)65533!==n[242][e].charCodeAt(0)&&(r[n[242][e]]=61952+e,t[61952+e]=n[242][e]);for(n[243]="����������������������������������������������������������������驚驛驜驝驞驟驠驡驢驣驤驥驦驧驨驩驪驫驲骃骉骍骎骔骕骙骦骩骪骫骬骭骮骯骲骳骴骵骹骻骽骾骿髃髄髆髇髈髉髊髍髎髏髐髒體髕髖髗髙髚髛髜�髝髞髠髢髣髤髥髧髨髩髪髬髮髰髱髲髳髴髵髶髷髸髺髼髽髾髿鬀鬁鬂鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋�".split(""),e=0;e!=n[243].length;++e)65533!==n[243][e].charCodeAt(0)&&(r[n[243][e]]=62208+e,t[62208+e]=n[243][e]);for(n[244]="����������������������������������������������������������������鬇鬉鬊鬋鬌鬍鬎鬐鬑鬒鬔鬕鬖鬗鬘鬙鬚鬛鬜鬝鬞鬠鬡鬢鬤鬥鬦鬧鬨鬩鬪鬫鬬鬭鬮鬰鬱鬳鬴鬵鬶鬷鬸鬹鬺鬽鬾鬿魀魆魊魋魌魎魐魒魓魕魖魗魘魙魚�魛魜魝魞魟魠魡魢魣魤魥魦魧魨魩魪魫魬魭魮魯魰魱魲魳魴魵魶魷魸魹魺魻簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤�".split(""),e=0;e!=n[244].length;++e)65533!==n[244][e].charCodeAt(0)&&(r[n[244][e]]=62464+e,t[62464+e]=n[244][e]);for(n[245]="����������������������������������������������������������������魼魽魾魿鮀鮁鮂鮃鮄鮅鮆鮇鮈鮉鮊鮋鮌鮍鮎鮏鮐鮑鮒鮓鮔鮕鮖鮗鮘鮙鮚鮛鮜鮝鮞鮟鮠鮡鮢鮣鮤鮥鮦鮧鮨鮩鮪鮫鮬鮭鮮鮯鮰鮱鮲鮳鮴鮵鮶鮷鮸鮹鮺�鮻鮼鮽鮾鮿鯀鯁鯂鯃鯄鯅鯆鯇鯈鯉鯊鯋鯌鯍鯎鯏鯐鯑鯒鯓鯔鯕鯖鯗鯘鯙鯚鯛酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜�".split(""),e=0;e!=n[245].length;++e)65533!==n[245][e].charCodeAt(0)&&(r[n[245][e]]=62720+e,t[62720+e]=n[245][e]);for(n[246]="����������������������������������������������������������������鯜鯝鯞鯟鯠鯡鯢鯣鯤鯥鯦鯧鯨鯩鯪鯫鯬鯭鯮鯯鯰鯱鯲鯳鯴鯵鯶鯷鯸鯹鯺鯻鯼鯽鯾鯿鰀鰁鰂鰃鰄鰅鰆鰇鰈鰉鰊鰋鰌鰍鰎鰏鰐鰑鰒鰓鰔鰕鰖鰗鰘鰙鰚�鰛鰜鰝鰞鰟鰠鰡鰢鰣鰤鰥鰦鰧鰨鰩鰪鰫鰬鰭鰮鰯鰰鰱鰲鰳鰴鰵鰶鰷鰸鰹鰺鰻觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋�".split(""),e=0;e!=n[246].length;++e)65533!==n[246][e].charCodeAt(0)&&(r[n[246][e]]=62976+e,t[62976+e]=n[246][e]);for(n[247]="����������������������������������������������������������������鰼鰽鰾鰿鱀鱁鱂鱃鱄鱅鱆鱇鱈鱉鱊鱋鱌鱍鱎鱏鱐鱑鱒鱓鱔鱕鱖鱗鱘鱙鱚鱛鱜鱝鱞鱟鱠鱡鱢鱣鱤鱥鱦鱧鱨鱩鱪鱫鱬鱭鱮鱯鱰鱱鱲鱳鱴鱵鱶鱷鱸鱹鱺�鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾鲿鳀鳁鳂鳈鳉鳑鳒鳚鳛鳠鳡鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄�".split(""),e=0;e!=n[247].length;++e)65533!==n[247][e].charCodeAt(0)&&(r[n[247][e]]=63232+e,t[63232+e]=n[247][e]);for(n[248]="����������������������������������������������������������������鳣鳤鳥鳦鳧鳨鳩鳪鳫鳬鳭鳮鳯鳰鳱鳲鳳鳴鳵鳶鳷鳸鳹鳺鳻鳼鳽鳾鳿鴀鴁鴂鴃鴄鴅鴆鴇鴈鴉鴊鴋鴌鴍鴎鴏鴐鴑鴒鴓鴔鴕鴖鴗鴘鴙鴚鴛鴜鴝鴞鴟鴠鴡�鴢鴣鴤鴥鴦鴧鴨鴩鴪鴫鴬鴭鴮鴯鴰鴱鴲鴳鴴鴵鴶鴷鴸鴹鴺鴻鴼鴽鴾鴿鵀鵁鵂�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[248].length;++e)65533!==n[248][e].charCodeAt(0)&&(r[n[248][e]]=63488+e,t[63488+e]=n[248][e]);for(n[249]="����������������������������������������������������������������鵃鵄鵅鵆鵇鵈鵉鵊鵋鵌鵍鵎鵏鵐鵑鵒鵓鵔鵕鵖鵗鵘鵙鵚鵛鵜鵝鵞鵟鵠鵡鵢鵣鵤鵥鵦鵧鵨鵩鵪鵫鵬鵭鵮鵯鵰鵱鵲鵳鵴鵵鵶鵷鵸鵹鵺鵻鵼鵽鵾鵿鶀鶁�鶂鶃鶄鶅鶆鶇鶈鶉鶊鶋鶌鶍鶎鶏鶐鶑鶒鶓鶔鶕鶖鶗鶘鶙鶚鶛鶜鶝鶞鶟鶠鶡鶢�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[249].length;++e)65533!==n[249][e].charCodeAt(0)&&(r[n[249][e]]=63744+e,t[63744+e]=n[249][e]);for(n[250]="����������������������������������������������������������������鶣鶤鶥鶦鶧鶨鶩鶪鶫鶬鶭鶮鶯鶰鶱鶲鶳鶴鶵鶶鶷鶸鶹鶺鶻鶼鶽鶾鶿鷀鷁鷂鷃鷄鷅鷆鷇鷈鷉鷊鷋鷌鷍鷎鷏鷐鷑鷒鷓鷔鷕鷖鷗鷘鷙鷚鷛鷜鷝鷞鷟鷠鷡�鷢鷣鷤鷥鷦鷧鷨鷩鷪鷫鷬鷭鷮鷯鷰鷱鷲鷳鷴鷵鷶鷷鷸鷹鷺鷻鷼鷽鷾鷿鸀鸁鸂�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[250].length;++e)65533!==n[250][e].charCodeAt(0)&&(r[n[250][e]]=64e3+e,t[64e3+e]=n[250][e]);for(n[251]="����������������������������������������������������������������鸃鸄鸅鸆鸇鸈鸉鸊鸋鸌鸍鸎鸏鸐鸑鸒鸓鸔鸕鸖鸗鸘鸙鸚鸛鸜鸝鸞鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴鹵鹶鹷鹸鹹鹺鹻鹼鹽麀�麁麃麄麅麆麉麊麌麍麎麏麐麑麔麕麖麗麘麙麚麛麜麞麠麡麢麣麤麥麧麨麩麪�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[251].length;++e)65533!==n[251][e].charCodeAt(0)&&(r[n[251][e]]=64256+e,t[64256+e]=n[251][e]);for(n[252]="����������������������������������������������������������������麫麬麭麮麯麰麱麲麳麵麶麷麹麺麼麿黀黁黂黃黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰黱黲黳黴黵黶黷黸黺黽黿鼀鼁鼂鼃鼄鼅�鼆鼇鼈鼉鼊鼌鼏鼑鼒鼔鼕鼖鼘鼚鼛鼜鼝鼞鼟鼡鼣鼤鼥鼦鼧鼨鼩鼪鼫鼭鼮鼰鼱�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[252].length;++e)65533!==n[252][e].charCodeAt(0)&&(r[n[252][e]]=64512+e,t[64512+e]=n[252][e]);for(n[253]="����������������������������������������������������������������鼲鼳鼴鼵鼶鼸鼺鼼鼿齀齁齂齃齅齆齇齈齉齊齋齌齍齎齏齒齓齔齕齖齗齘齙齚齛齜齝齞齟齠齡齢齣齤齥齦齧齨齩齪齫齬齭齮齯齰齱齲齳齴齵齶齷齸�齹齺齻齼齽齾龁龂龍龎龏龐龑龒龓龔龕龖龗龘龜龝龞龡龢龣龤龥郎凉秊裏隣�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[253].length;++e)65533!==n[253][e].charCodeAt(0)&&(r[n[253][e]]=64768+e,t[64768+e]=n[253][e]);for(n[254]="����������������������������������������������������������������兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������".split(""),e=0;e!=n[254].length;++e)65533!==n[254][e].charCodeAt(0)&&(r[n[254][e]]=65024+e,t[65024+e]=n[254][e]);return{enc:r,dec:t}}(),t[949]=function(){var e,t=[],r={},n=[];for(n[0]="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������".split(""),e=0;e!=n[0].length;++e)65533!==n[0][e].charCodeAt(0)&&(r[n[0][e]]=0+e,t[0+e]=n[0][e]);for(n[129]="�����������������������������������������������������������������갂갃갅갆갋갌갍갎갏갘갞갟갡갢갣갥갦갧갨갩갪갫갮갲갳갴������갵갶갷갺갻갽갾갿걁걂걃걄걅걆걇걈걉걊걌걎걏걐걑걒걓걕������걖걗걙걚걛걝걞걟걠걡걢걣걤걥걦걧걨걩걪걫걬걭걮걯걲걳걵걶걹걻걼걽걾걿겂겇겈겍겎겏겑겒겓겕겖겗겘겙겚겛겞겢겣겤겥겦겧겫겭겮겱겲겳겴겵겶겷겺겾겿곀곂곃곅곆곇곉곊곋곍곎곏곐곑곒곓곔곖곘곙곚곛곜곝곞곟곢곣곥곦곩곫곭곮곲곴곷곸곹곺곻곾곿괁괂괃괅괇괈괉괊괋괎괐괒괓�".split(""),e=0;e!=n[129].length;++e)65533!==n[129][e].charCodeAt(0)&&(r[n[129][e]]=33024+e,t[33024+e]=n[129][e]);for(n[130]="�����������������������������������������������������������������괔괕괖괗괙괚괛괝괞괟괡괢괣괤괥괦괧괨괪괫괮괯괰괱괲괳������괶괷괹괺괻괽괾괿굀굁굂굃굆굈굊굋굌굍굎굏굑굒굓굕굖굗������굙굚굛굜굝굞굟굠굢굤굥굦굧굨굩굪굫굮굯굱굲굷굸굹굺굾궀궃궄궅궆궇궊궋궍궎궏궑궒궓궔궕궖궗궘궙궚궛궞궟궠궡궢궣궥궦궧궨궩궪궫궬궭궮궯궰궱궲궳궴궵궶궸궹궺궻궼궽궾궿귂귃귅귆귇귉귊귋귌귍귎귏귒귔귕귖귗귘귙귚귛귝귞귟귡귢귣귥귦귧귨귩귪귫귬귭귮귯귰귱귲귳귴귵귶귷�".split(""),e=0;e!=n[130].length;++e)65533!==n[130][e].charCodeAt(0)&&(r[n[130][e]]=33280+e,t[33280+e]=n[130][e]);for(n[131]="�����������������������������������������������������������������귺귻귽귾긂긃긄긅긆긇긊긌긎긏긐긑긒긓긕긖긗긘긙긚긛긜������긝긞긟긠긡긢긣긤긥긦긧긨긩긪긫긬긭긮긯긲긳긵긶긹긻긼������긽긾긿깂깄깇깈깉깋깏깑깒깓깕깗깘깙깚깛깞깢깣깤깦깧깪깫깭깮깯깱깲깳깴깵깶깷깺깾깿꺀꺁꺂꺃꺆꺇꺈꺉꺊꺋꺍꺎꺏꺐꺑꺒꺓꺔꺕꺖꺗꺘꺙꺚꺛꺜꺝꺞꺟꺠꺡꺢꺣꺤꺥꺦꺧꺨꺩꺪꺫꺬꺭꺮꺯꺰꺱꺲꺳꺴꺵꺶꺷꺸꺹꺺꺻꺿껁껂껃껅껆껇껈껉껊껋껎껒껓껔껕껖껗껚껛껝껞껟껠껡껢껣껤껥�".split(""),e=0;e!=n[131].length;++e)65533!==n[131][e].charCodeAt(0)&&(r[n[131][e]]=33536+e,t[33536+e]=n[131][e]);for(n[132]="�����������������������������������������������������������������껦껧껩껪껬껮껯껰껱껲껳껵껶껷껹껺껻껽껾껿꼀꼁꼂꼃꼄꼅������꼆꼉꼊꼋꼌꼎꼏꼑꼒꼓꼔꼕꼖꼗꼘꼙꼚꼛꼜꼝꼞꼟꼠꼡꼢꼣������꼤꼥꼦꼧꼨꼩꼪꼫꼮꼯꼱꼳꼵꼶꼷꼸꼹꼺꼻꼾꽀꽄꽅꽆꽇꽊꽋꽌꽍꽎꽏꽑꽒꽓꽔꽕꽖꽗꽘꽙꽚꽛꽞꽟꽠꽡꽢꽣꽦꽧꽨꽩꽪꽫꽬꽭꽮꽯꽰꽱꽲꽳꽴꽵꽶꽷꽸꽺꽻꽼꽽꽾꽿꾁꾂꾃꾅꾆꾇꾉꾊꾋꾌꾍꾎꾏꾒꾓꾔꾖꾗꾘꾙꾚꾛꾝꾞꾟꾠꾡꾢꾣꾤꾥꾦꾧꾨꾩꾪꾫꾬꾭꾮꾯꾰꾱꾲꾳꾴꾵꾶꾷꾺꾻꾽꾾�".split(""),e=0;e!=n[132].length;++e)65533!==n[132][e].charCodeAt(0)&&(r[n[132][e]]=33792+e,t[33792+e]=n[132][e]);for(n[133]="�����������������������������������������������������������������꾿꿁꿂꿃꿄꿅꿆꿊꿌꿏꿐꿑꿒꿓꿕꿖꿗꿘꿙꿚꿛꿝꿞꿟꿠꿡������꿢꿣꿤꿥꿦꿧꿪꿫꿬꿭꿮꿯꿲꿳꿵꿶꿷꿹꿺꿻꿼꿽꿾꿿뀂뀃������뀅뀆뀇뀈뀉뀊뀋뀍뀎뀏뀑뀒뀓뀕뀖뀗뀘뀙뀚뀛뀞뀟뀠뀡뀢뀣뀤뀥뀦뀧뀩뀪뀫뀬뀭뀮뀯뀰뀱뀲뀳뀴뀵뀶뀷뀸뀹뀺뀻뀼뀽뀾뀿끀끁끂끃끆끇끉끋끍끏끐끑끒끖끘끚끛끜끞끟끠끡끢끣끤끥끦끧끨끩끪끫끬끭끮끯끰끱끲끳끴끵끶끷끸끹끺끻끾끿낁낂낃낅낆낇낈낉낊낋낎낐낒낓낔낕낖낗낛낝낞낣낤�".split(""),e=0;e!=n[133].length;++e)65533!==n[133][e].charCodeAt(0)&&(r[n[133][e]]=34048+e,t[34048+e]=n[133][e]);for(n[134]="�����������������������������������������������������������������낥낦낧낪낰낲낶낷낹낺낻낽낾낿냀냁냂냃냆냊냋냌냍냎냏냒������냓냕냖냗냙냚냛냜냝냞냟냡냢냣냤냦냧냨냩냪냫냬냭냮냯냰������냱냲냳냴냵냶냷냸냹냺냻냼냽냾냿넀넁넂넃넄넅넆넇넊넍넎넏넑넔넕넖넗넚넞넟넠넡넢넦넧넩넪넫넭넮넯넰넱넲넳넶넺넻넼넽넾넿녂녃녅녆녇녉녊녋녌녍녎녏녒녓녖녗녙녚녛녝녞녟녡녢녣녤녥녦녧녨녩녪녫녬녭녮녯녰녱녲녳녴녵녶녷녺녻녽녾녿놁놃놄놅놆놇놊놌놎놏놐놑놕놖놗놙놚놛놝�".split(""),e=0;e!=n[134].length;++e)65533!==n[134][e].charCodeAt(0)&&(r[n[134][e]]=34304+e,t[34304+e]=n[134][e]);for(n[135]="�����������������������������������������������������������������놞놟놠놡놢놣놤놥놦놧놩놪놫놬놭놮놯놰놱놲놳놴놵놶놷놸������놹놺놻놼놽놾놿뇀뇁뇂뇃뇄뇅뇆뇇뇈뇉뇊뇋뇍뇎뇏뇑뇒뇓뇕������뇖뇗뇘뇙뇚뇛뇞뇠뇡뇢뇣뇤뇥뇦뇧뇪뇫뇭뇮뇯뇱뇲뇳뇴뇵뇶뇷뇸뇺뇼뇾뇿눀눁눂눃눆눇눉눊눍눎눏눐눑눒눓눖눘눚눛눜눝눞눟눡눢눣눤눥눦눧눨눩눪눫눬눭눮눯눰눱눲눳눵눶눷눸눹눺눻눽눾눿뉀뉁뉂뉃뉄뉅뉆뉇뉈뉉뉊뉋뉌뉍뉎뉏뉐뉑뉒뉓뉔뉕뉖뉗뉙뉚뉛뉝뉞뉟뉡뉢뉣뉤뉥뉦뉧뉪뉫뉬뉭뉮�".split(""),e=0;e!=n[135].length;++e)65533!==n[135][e].charCodeAt(0)&&(r[n[135][e]]=34560+e,t[34560+e]=n[135][e]);for(n[136]="�����������������������������������������������������������������뉯뉰뉱뉲뉳뉶뉷뉸뉹뉺뉻뉽뉾뉿늀늁늂늃늆늇늈늊늋늌늍늎������늏늒늓늕늖늗늛늜늝늞늟늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷������늸늹늺늻늼늽늾늿닀닁닂닃닄닅닆닇닊닋닍닎닏닑닓닔닕닖닗닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉댊댋댌댍댎댏댒댖댗댘댙댚댛댝댞댟댠댡댢댣댤댥댦댧댨댩댪댫댬댭댮댯댰댱댲댳댴댵댶댷댸댹댺댻댼댽댾댿덀덁덂덃덄덅덆덇덈덉덊덋덌덍덎덏덐덑덒덓덗덙덚덝덠덡덢덣�".split(""),e=0;e!=n[136].length;++e)65533!==n[136][e].charCodeAt(0)&&(r[n[136][e]]=34816+e,t[34816+e]=n[136][e]);for(n[137]="�����������������������������������������������������������������덦덨덪덬덭덯덲덳덵덶덷덹덺덻덼덽덾덿뎂뎆뎇뎈뎉뎊뎋뎍������뎎뎏뎑뎒뎓뎕뎖뎗뎘뎙뎚뎛뎜뎝뎞뎟뎢뎣뎤뎥뎦뎧뎩뎪뎫뎭������뎮뎯뎰뎱뎲뎳뎴뎵뎶뎷뎸뎹뎺뎻뎼뎽뎾뎿돀돁돂돃돆돇돉돊돍돏돑돒돓돖돘돚돜돞돟돡돢돣돥돦돧돩돪돫돬돭돮돯돰돱돲돳돴돵돶돷돸돹돺돻돽돾돿됀됁됂됃됄됅됆됇됈됉됊됋됌됍됎됏됑됒됓됔됕됖됗됙됚됛됝됞됟됡됢됣됤됥됦됧됪됬됭됮됯됰됱됲됳됵됶됷됸됹됺됻됼됽됾됿둀둁둂둃둄�".split(""),e=0;e!=n[137].length;++e)65533!==n[137][e].charCodeAt(0)&&(r[n[137][e]]=35072+e,t[35072+e]=n[137][e]);for(n[138]="�����������������������������������������������������������������둅둆둇둈둉둊둋둌둍둎둏둒둓둕둖둗둙둚둛둜둝둞둟둢둤둦������둧둨둩둪둫둭둮둯둰둱둲둳둴둵둶둷둸둹둺둻둼둽둾둿뒁뒂������뒃뒄뒅뒆뒇뒉뒊뒋뒌뒍뒎뒏뒐뒑뒒뒓뒔뒕뒖뒗뒘뒙뒚뒛뒜뒞뒟뒠뒡뒢뒣뒥뒦뒧뒩뒪뒫뒭뒮뒯뒰뒱뒲뒳뒴뒶뒸뒺뒻뒼뒽뒾뒿듁듂듃듅듆듇듉듊듋듌듍듎듏듑듒듓듔듖듗듘듙듚듛듞듟듡듢듥듧듨듩듪듫듮듰듲듳듴듵듶듷듹듺듻듼듽듾듿딀딁딂딃딄딅딆딇딈딉딊딋딌딍딎딏딐딑딒딓딖딗딙딚딝�".split(""),e=0;e!=n[138].length;++e)65533!==n[138][e].charCodeAt(0)&&(r[n[138][e]]=35328+e,t[35328+e]=n[138][e]);for(n[139]="�����������������������������������������������������������������딞딟딠딡딢딣딦딫딬딭딮딯딲딳딵딶딷딹딺딻딼딽딾딿땂땆������땇땈땉땊땎땏땑땒땓땕땖땗땘땙땚땛땞땢땣땤땥땦땧땨땩땪������땫땬땭땮땯땰땱땲땳땴땵땶땷땸땹땺땻땼땽땾땿떀떁떂떃떄떅떆떇떈떉떊떋떌떍떎떏떐떑떒떓떔떕떖떗떘떙떚떛떜떝떞떟떢떣떥떦떧떩떬떭떮떯떲떶떷떸떹떺떾떿뗁뗂뗃뗅뗆뗇뗈뗉뗊뗋뗎뗒뗓뗔뗕뗖뗗뗙뗚뗛뗜뗝뗞뗟뗠뗡뗢뗣뗤뗥뗦뗧뗨뗩뗪뗫뗭뗮뗯뗰뗱뗲뗳뗴뗵뗶뗷뗸뗹뗺뗻뗼뗽뗾뗿�".split(""),e=0;e!=n[139].length;++e)65533!==n[139][e].charCodeAt(0)&&(r[n[139][e]]=35584+e,t[35584+e]=n[139][e]);for(n[140]="�����������������������������������������������������������������똀똁똂똃똄똅똆똇똈똉똊똋똌똍똎똏똒똓똕똖똗똙똚똛똜똝������똞똟똠똡똢똣똤똦똧똨똩똪똫똭똮똯똰똱똲똳똵똶똷똸똹똺������똻똼똽똾똿뙀뙁뙂뙃뙄뙅뙆뙇뙉뙊뙋뙌뙍뙎뙏뙐뙑뙒뙓뙔뙕뙖뙗뙘뙙뙚뙛뙜뙝뙞뙟뙠뙡뙢뙣뙥뙦뙧뙩뙪뙫뙬뙭뙮뙯뙰뙱뙲뙳뙴뙵뙶뙷뙸뙹뙺뙻뙼뙽뙾뙿뚀뚁뚂뚃뚄뚅뚆뚇뚈뚉뚊뚋뚌뚍뚎뚏뚐뚑뚒뚓뚔뚕뚖뚗뚘뚙뚚뚛뚞뚟뚡뚢뚣뚥뚦뚧뚨뚩뚪뚭뚮뚯뚰뚲뚳뚴뚵뚶뚷뚸뚹뚺뚻뚼뚽뚾뚿뛀뛁뛂�".split(""),e=0;e!=n[140].length;++e)65533!==n[140][e].charCodeAt(0)&&(r[n[140][e]]=35840+e,t[35840+e]=n[140][e]);for(n[141]="�����������������������������������������������������������������뛃뛄뛅뛆뛇뛈뛉뛊뛋뛌뛍뛎뛏뛐뛑뛒뛓뛕뛖뛗뛘뛙뛚뛛뛜뛝������뛞뛟뛠뛡뛢뛣뛤뛥뛦뛧뛨뛩뛪뛫뛬뛭뛮뛯뛱뛲뛳뛵뛶뛷뛹뛺������뛻뛼뛽뛾뛿뜂뜃뜄뜆뜇뜈뜉뜊뜋뜌뜍뜎뜏뜐뜑뜒뜓뜔뜕뜖뜗뜘뜙뜚뜛뜜뜝뜞뜟뜠뜡뜢뜣뜤뜥뜦뜧뜪뜫뜭뜮뜱뜲뜳뜴뜵뜶뜷뜺뜼뜽뜾뜿띀띁띂띃띅띆띇띉띊띋띍띎띏띐띑띒띓띖띗띘띙띚띛띜띝띞띟띡띢띣띥띦띧띩띪띫띬띭띮띯띲띴띶띷띸띹띺띻띾띿랁랂랃랅랆랇랈랉랊랋랎랓랔랕랚랛랝랞�".split(""),e=0;e!=n[141].length;++e)65533!==n[141][e].charCodeAt(0)&&(r[n[141][e]]=36096+e,t[36096+e]=n[141][e]);for(n[142]="�����������������������������������������������������������������랟랡랢랣랤랥랦랧랪랮랯랰랱랲랳랶랷랹랺랻랼랽랾랿럀럁������럂럃럄럅럆럈럊럋럌럍럎럏럐럑럒럓럔럕럖럗럘럙럚럛럜럝������럞럟럠럡럢럣럤럥럦럧럨럩럪럫럮럯럱럲럳럵럶럷럸럹럺럻럾렂렃렄렅렆렊렋렍렎렏렑렒렓렔렕렖렗렚렜렞렟렠렡렢렣렦렧렩렪렫렭렮렯렰렱렲렳렶렺렻렼렽렾렿롁롂롃롅롆롇롈롉롊롋롌롍롎롏롐롒롔롕롖롗롘롙롚롛롞롟롡롢롣롥롦롧롨롩롪롫롮롰롲롳롴롵롶롷롹롺롻롽롾롿뢀뢁뢂뢃뢄�".split(""),e=0;e!=n[142].length;++e)65533!==n[142][e].charCodeAt(0)&&(r[n[142][e]]=36352+e,t[36352+e]=n[142][e]);for(n[143]="�����������������������������������������������������������������뢅뢆뢇뢈뢉뢊뢋뢌뢎뢏뢐뢑뢒뢓뢔뢕뢖뢗뢘뢙뢚뢛뢜뢝뢞뢟������뢠뢡뢢뢣뢤뢥뢦뢧뢩뢪뢫뢬뢭뢮뢯뢱뢲뢳뢵뢶뢷뢹뢺뢻뢼뢽������뢾뢿룂룄룆룇룈룉룊룋룍룎룏룑룒룓룕룖룗룘룙룚룛룜룞룠룢룣룤룥룦룧룪룫룭룮룯룱룲룳룴룵룶룷룺룼룾룿뤀뤁뤂뤃뤅뤆뤇뤈뤉뤊뤋뤌뤍뤎뤏뤐뤑뤒뤓뤔뤕뤖뤗뤙뤚뤛뤜뤝뤞뤟뤡뤢뤣뤤뤥뤦뤧뤨뤩뤪뤫뤬뤭뤮뤯뤰뤱뤲뤳뤴뤵뤶뤷뤸뤹뤺뤻뤾뤿륁륂륃륅륆륇륈륉륊륋륍륎륐륒륓륔륕륖륗�".split(""),e=0;e!=n[143].length;++e)65533!==n[143][e].charCodeAt(0)&&(r[n[143][e]]=36608+e,t[36608+e]=n[143][e]);for(n[144]="�����������������������������������������������������������������륚륛륝륞륟륡륢륣륤륥륦륧륪륬륮륯륰륱륲륳륶륷륹륺륻륽������륾륿릀릁릂릃릆릈릋릌릏릐릑릒릓릔릕릖릗릘릙릚릛릜릝릞������릟릠릡릢릣릤릥릦릧릨릩릪릫릮릯릱릲릳릵릶릷릸릹릺릻릾맀맂맃맄맅맆맇맊맋맍맓맔맕맖맗맚맜맟맠맢맦맧맩맪맫맭맮맯맰맱맲맳맶맻맼맽맾맿먂먃먄먅먆먇먉먊먋먌먍먎먏먐먑먒먓먔먖먗먘먙먚먛먜먝먞먟먠먡먢먣먤먥먦먧먨먩먪먫먬먭먮먯먰먱먲먳먴먵먶먷먺먻먽먾먿멁멃멄멅멆�".split(""),e=0;e!=n[144].length;++e)65533!==n[144][e].charCodeAt(0)&&(r[n[144][e]]=36864+e,t[36864+e]=n[144][e]);for(n[145]="�����������������������������������������������������������������멇멊멌멏멐멑멒멖멗멙멚멛멝멞멟멠멡멢멣멦멪멫멬멭멮멯������멲멳멵멶멷멹멺멻멼멽멾멿몀몁몂몆몈몉몊몋몍몎몏몐몑몒������몓몔몕몖몗몘몙몚몛몜몝몞몟몠몡몢몣몤몥몦몧몪몭몮몯몱몳몴몵몶몷몺몼몾몿뫀뫁뫂뫃뫅뫆뫇뫉뫊뫋뫌뫍뫎뫏뫐뫑뫒뫓뫔뫕뫖뫗뫚뫛뫜뫝뫞뫟뫠뫡뫢뫣뫤뫥뫦뫧뫨뫩뫪뫫뫬뫭뫮뫯뫰뫱뫲뫳뫴뫵뫶뫷뫸뫹뫺뫻뫽뫾뫿묁묂묃묅묆묇묈묉묊묋묌묎묐묒묓묔묕묖묗묙묚묛묝묞묟묡묢묣묤묥묦묧�".split(""),e=0;e!=n[145].length;++e)65533!==n[145][e].charCodeAt(0)&&(r[n[145][e]]=37120+e,t[37120+e]=n[145][e]);for(n[146]="�����������������������������������������������������������������묨묪묬묭묮묯묰묱묲묳묷묹묺묿뭀뭁뭂뭃뭆뭈뭊뭋뭌뭎뭑뭒������뭓뭕뭖뭗뭙뭚뭛뭜뭝뭞뭟뭠뭢뭤뭥뭦뭧뭨뭩뭪뭫뭭뭮뭯뭰뭱������뭲뭳뭴뭵뭶뭷뭸뭹뭺뭻뭼뭽뭾뭿뮀뮁뮂뮃뮄뮅뮆뮇뮉뮊뮋뮍뮎뮏뮑뮒뮓뮔뮕뮖뮗뮘뮙뮚뮛뮜뮝뮞뮟뮠뮡뮢뮣뮥뮦뮧뮩뮪뮫뮭뮮뮯뮰뮱뮲뮳뮵뮶뮸뮹뮺뮻뮼뮽뮾뮿믁믂믃믅믆믇믉믊믋믌믍믎믏믑믒믔믕믖믗믘믙믚믛믜믝믞믟믠믡믢믣믤믥믦믧믨믩믪믫믬믭믮믯믰믱믲믳믴믵믶믷믺믻믽믾밁�".split(""),e=0;e!=n[146].length;++e)65533!==n[146][e].charCodeAt(0)&&(r[n[146][e]]=37376+e,t[37376+e]=n[146][e]);for(n[147]="�����������������������������������������������������������������밃밄밅밆밇밊밎밐밒밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵������밶밷밹밺밻밼밽밾밿뱂뱆뱇뱈뱊뱋뱎뱏뱑뱒뱓뱔뱕뱖뱗뱘뱙������뱚뱛뱜뱞뱟뱠뱡뱢뱣뱤뱥뱦뱧뱨뱩뱪뱫뱬뱭뱮뱯뱰뱱뱲뱳뱴뱵뱶뱷뱸뱹뱺뱻뱼뱽뱾뱿벀벁벂벃벆벇벉벊벍벏벐벑벒벓벖벘벛벜벝벞벟벢벣벥벦벩벪벫벬벭벮벯벲벶벷벸벹벺벻벾벿볁볂볃볅볆볇볈볉볊볋볌볎볒볓볔볖볗볙볚볛볝볞볟볠볡볢볣볤볥볦볧볨볩볪볫볬볭볮볯볰볱볲볳볷볹볺볻볽�".split(""),e=0;e!=n[147].length;++e)65533!==n[147][e].charCodeAt(0)&&(r[n[147][e]]=37632+e,t[37632+e]=n[147][e]);for(n[148]="�����������������������������������������������������������������볾볿봀봁봂봃봆봈봊봋봌봍봎봏봑봒봓봕봖봗봘봙봚봛봜봝������봞봟봠봡봢봣봥봦봧봨봩봪봫봭봮봯봰봱봲봳봴봵봶봷봸봹������봺봻봼봽봾봿뵁뵂뵃뵄뵅뵆뵇뵊뵋뵍뵎뵏뵑뵒뵓뵔뵕뵖뵗뵚뵛뵜뵝뵞뵟뵠뵡뵢뵣뵥뵦뵧뵩뵪뵫뵬뵭뵮뵯뵰뵱뵲뵳뵴뵵뵶뵷뵸뵹뵺뵻뵼뵽뵾뵿붂붃붅붆붋붌붍붎붏붒붔붖붗붘붛붝붞붟붠붡붢붣붥붦붧붨붩붪붫붬붭붮붯붱붲붳붴붵붶붷붹붺붻붼붽붾붿뷀뷁뷂뷃뷄뷅뷆뷇뷈뷉뷊뷋뷌뷍뷎뷏뷐뷑�".split(""),e=0;e!=n[148].length;++e)65533!==n[148][e].charCodeAt(0)&&(r[n[148][e]]=37888+e,t[37888+e]=n[148][e]);for(n[149]="�����������������������������������������������������������������뷒뷓뷖뷗뷙뷚뷛뷝뷞뷟뷠뷡뷢뷣뷤뷥뷦뷧뷨뷪뷫뷬뷭뷮뷯뷱������뷲뷳뷵뷶뷷뷹뷺뷻뷼뷽뷾뷿븁븂븄븆븇븈븉븊븋븎븏븑븒븓������븕븖븗븘븙븚븛븞븠븡븢븣븤븥븦븧븨븩븪븫븬븭븮븯븰븱븲븳븴븵븶븷븸븹븺븻븼븽븾븿빀빁빂빃빆빇빉빊빋빍빏빐빑빒빓빖빘빜빝빞빟빢빣빥빦빧빩빫빬빭빮빯빲빶빷빸빹빺빾빿뺁뺂뺃뺅뺆뺇뺈뺉뺊뺋뺎뺒뺓뺔뺕뺖뺗뺚뺛뺜뺝뺞뺟뺠뺡뺢뺣뺤뺥뺦뺧뺩뺪뺫뺬뺭뺮뺯뺰뺱뺲뺳뺴뺵뺶뺷�".split(""),e=0;e!=n[149].length;++e)65533!==n[149][e].charCodeAt(0)&&(r[n[149][e]]=38144+e,t[38144+e]=n[149][e]);for(n[150]="�����������������������������������������������������������������뺸뺹뺺뺻뺼뺽뺾뺿뻀뻁뻂뻃뻄뻅뻆뻇뻈뻉뻊뻋뻌뻍뻎뻏뻒뻓������뻕뻖뻙뻚뻛뻜뻝뻞뻟뻡뻢뻦뻧뻨뻩뻪뻫뻭뻮뻯뻰뻱뻲뻳뻴뻵������뻶뻷뻸뻹뻺뻻뻼뻽뻾뻿뼀뼂뼃뼄뼅뼆뼇뼊뼋뼌뼍뼎뼏뼐뼑뼒뼓뼔뼕뼖뼗뼚뼞뼟뼠뼡뼢뼣뼤뼥뼦뼧뼨뼩뼪뼫뼬뼭뼮뼯뼰뼱뼲뼳뼴뼵뼶뼷뼸뼹뼺뼻뼼뼽뼾뼿뽂뽃뽅뽆뽇뽉뽊뽋뽌뽍뽎뽏뽒뽓뽔뽖뽗뽘뽙뽚뽛뽜뽝뽞뽟뽠뽡뽢뽣뽤뽥뽦뽧뽨뽩뽪뽫뽬뽭뽮뽯뽰뽱뽲뽳뽴뽵뽶뽷뽸뽹뽺뽻뽼뽽뽾뽿뾀뾁뾂�".split(""),e=0;e!=n[150].length;++e)65533!==n[150][e].charCodeAt(0)&&(r[n[150][e]]=38400+e,t[38400+e]=n[150][e]);for(n[151]="�����������������������������������������������������������������뾃뾄뾅뾆뾇뾈뾉뾊뾋뾌뾍뾎뾏뾐뾑뾒뾓뾕뾖뾗뾘뾙뾚뾛뾜뾝������뾞뾟뾠뾡뾢뾣뾤뾥뾦뾧뾨뾩뾪뾫뾬뾭뾮뾯뾱뾲뾳뾴뾵뾶뾷뾸������뾹뾺뾻뾼뾽뾾뾿뿀뿁뿂뿃뿄뿆뿇뿈뿉뿊뿋뿎뿏뿑뿒뿓뿕뿖뿗뿘뿙뿚뿛뿝뿞뿠뿢뿣뿤뿥뿦뿧뿨뿩뿪뿫뿬뿭뿮뿯뿰뿱뿲뿳뿴뿵뿶뿷뿸뿹뿺뿻뿼뿽뿾뿿쀀쀁쀂쀃쀄쀅쀆쀇쀈쀉쀊쀋쀌쀍쀎쀏쀐쀑쀒쀓쀔쀕쀖쀗쀘쀙쀚쀛쀜쀝쀞쀟쀠쀡쀢쀣쀤쀥쀦쀧쀨쀩쀪쀫쀬쀭쀮쀯쀰쀱쀲쀳쀴쀵쀶쀷쀸쀹쀺쀻쀽쀾쀿�".split(""),e=0;e!=n[151].length;++e)65533!==n[151][e].charCodeAt(0)&&(r[n[151][e]]=38656+e,t[38656+e]=n[151][e]);for(n[152]="�����������������������������������������������������������������쁀쁁쁂쁃쁄쁅쁆쁇쁈쁉쁊쁋쁌쁍쁎쁏쁐쁒쁓쁔쁕쁖쁗쁙쁚쁛������쁝쁞쁟쁡쁢쁣쁤쁥쁦쁧쁪쁫쁬쁭쁮쁯쁰쁱쁲쁳쁴쁵쁶쁷쁸쁹������쁺쁻쁼쁽쁾쁿삀삁삂삃삄삅삆삇삈삉삊삋삌삍삎삏삒삓삕삖삗삙삚삛삜삝삞삟삢삤삦삧삨삩삪삫삮삱삲삷삸삹삺삻삾샂샃샄샆샇샊샋샍샎샏샑샒샓샔샕샖샗샚샞샟샠샡샢샣샦샧샩샪샫샭샮샯샰샱샲샳샶샸샺샻샼샽샾샿섁섂섃섅섆섇섉섊섋섌섍섎섏섑섒섓섔섖섗섘섙섚섛섡섢섥섨섩섪섫섮�".split(""),e=0;e!=n[152].length;++e)65533!==n[152][e].charCodeAt(0)&&(r[n[152][e]]=38912+e,t[38912+e]=n[152][e]);for(n[153]="�����������������������������������������������������������������섲섳섴섵섷섺섻섽섾섿셁셂셃셄셅셆셇셊셎셏셐셑셒셓셖셗������셙셚셛셝셞셟셠셡셢셣셦셪셫셬셭셮셯셱셲셳셵셶셷셹셺셻������셼셽셾셿솀솁솂솃솄솆솇솈솉솊솋솏솑솒솓솕솗솘솙솚솛솞솠솢솣솤솦솧솪솫솭솮솯솱솲솳솴솵솶솷솸솹솺솻솼솾솿쇀쇁쇂쇃쇅쇆쇇쇉쇊쇋쇍쇎쇏쇐쇑쇒쇓쇕쇖쇙쇚쇛쇜쇝쇞쇟쇡쇢쇣쇥쇦쇧쇩쇪쇫쇬쇭쇮쇯쇲쇴쇵쇶쇷쇸쇹쇺쇻쇾쇿숁숂숃숅숆숇숈숉숊숋숎숐숒숓숔숕숖숗숚숛숝숞숡숢숣�".split(""),e=0;e!=n[153].length;++e)65533!==n[153][e].charCodeAt(0)&&(r[n[153][e]]=39168+e,t[39168+e]=n[153][e]);for(n[154]="�����������������������������������������������������������������숤숥숦숧숪숬숮숰숳숵숶숷숸숹숺숻숼숽숾숿쉀쉁쉂쉃쉄쉅������쉆쉇쉉쉊쉋쉌쉍쉎쉏쉒쉓쉕쉖쉗쉙쉚쉛쉜쉝쉞쉟쉡쉢쉣쉤쉦������쉧쉨쉩쉪쉫쉮쉯쉱쉲쉳쉵쉶쉷쉸쉹쉺쉻쉾슀슂슃슄슅슆슇슊슋슌슍슎슏슑슒슓슔슕슖슗슙슚슜슞슟슠슡슢슣슦슧슩슪슫슮슯슰슱슲슳슶슸슺슻슼슽슾슿싀싁싂싃싄싅싆싇싈싉싊싋싌싍싎싏싐싑싒싓싔싕싖싗싘싙싚싛싞싟싡싢싥싦싧싨싩싪싮싰싲싳싴싵싷싺싽싾싿쌁쌂쌃쌄쌅쌆쌇쌊쌋쌎쌏�".split(""),e=0;e!=n[154].length;++e)65533!==n[154][e].charCodeAt(0)&&(r[n[154][e]]=39424+e,t[39424+e]=n[154][e]);for(n[155]="�����������������������������������������������������������������쌐쌑쌒쌖쌗쌙쌚쌛쌝쌞쌟쌠쌡쌢쌣쌦쌧쌪쌫쌬쌭쌮쌯쌰쌱쌲������쌳쌴쌵쌶쌷쌸쌹쌺쌻쌼쌽쌾쌿썀썁썂썃썄썆썇썈썉썊썋썌썍������썎썏썐썑썒썓썔썕썖썗썘썙썚썛썜썝썞썟썠썡썢썣썤썥썦썧썪썫썭썮썯썱썳썴썵썶썷썺썻썾썿쎀쎁쎂쎃쎅쎆쎇쎉쎊쎋쎍쎎쎏쎐쎑쎒쎓쎔쎕쎖쎗쎘쎙쎚쎛쎜쎝쎞쎟쎠쎡쎢쎣쎤쎥쎦쎧쎨쎩쎪쎫쎬쎭쎮쎯쎰쎱쎲쎳쎴쎵쎶쎷쎸쎹쎺쎻쎼쎽쎾쎿쏁쏂쏃쏄쏅쏆쏇쏈쏉쏊쏋쏌쏍쏎쏏쏐쏑쏒쏓쏔쏕쏖쏗쏚�".split(""),e=0;e!=n[155].length;++e)65533!==n[155][e].charCodeAt(0)&&(r[n[155][e]]=39680+e,t[39680+e]=n[155][e]);for(n[156]="�����������������������������������������������������������������쏛쏝쏞쏡쏣쏤쏥쏦쏧쏪쏫쏬쏮쏯쏰쏱쏲쏳쏶쏷쏹쏺쏻쏼쏽쏾������쏿쐀쐁쐂쐃쐄쐅쐆쐇쐉쐊쐋쐌쐍쐎쐏쐑쐒쐓쐔쐕쐖쐗쐘쐙쐚������쐛쐜쐝쐞쐟쐠쐡쐢쐣쐥쐦쐧쐨쐩쐪쐫쐭쐮쐯쐱쐲쐳쐵쐶쐷쐸쐹쐺쐻쐾쐿쑀쑁쑂쑃쑄쑅쑆쑇쑉쑊쑋쑌쑍쑎쑏쑐쑑쑒쑓쑔쑕쑖쑗쑘쑙쑚쑛쑜쑝쑞쑟쑠쑡쑢쑣쑦쑧쑩쑪쑫쑭쑮쑯쑰쑱쑲쑳쑶쑷쑸쑺쑻쑼쑽쑾쑿쒁쒂쒃쒄쒅쒆쒇쒈쒉쒊쒋쒌쒍쒎쒏쒐쒑쒒쒓쒕쒖쒗쒘쒙쒚쒛쒝쒞쒟쒠쒡쒢쒣쒤쒥쒦쒧쒨쒩�".split(""),e=0;e!=n[156].length;++e)65533!==n[156][e].charCodeAt(0)&&(r[n[156][e]]=39936+e,t[39936+e]=n[156][e]);for(n[157]="�����������������������������������������������������������������쒪쒫쒬쒭쒮쒯쒰쒱쒲쒳쒴쒵쒶쒷쒹쒺쒻쒽쒾쒿쓀쓁쓂쓃쓄쓅������쓆쓇쓈쓉쓊쓋쓌쓍쓎쓏쓐쓑쓒쓓쓔쓕쓖쓗쓘쓙쓚쓛쓜쓝쓞쓟������쓠쓡쓢쓣쓤쓥쓦쓧쓨쓪쓫쓬쓭쓮쓯쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂씃씄씅씆씇씈씉씊씋씍씎씏씑씒씓씕씖씗씘씙씚씛씝씞씟씠씡씢씣씤씥씦씧씪씫씭씮씯씱씲씳씴씵씶씷씺씼씾씿앀앁앂앃앆앇앋앏앐앑앒앖앚앛앜앟앢앣앥앦앧앩앪앫앬앭앮앯앲앶앷앸앹앺앻앾앿얁얂얃얅얆얈얉얊얋얎얐얒얓얔�".split(""),e=0;e!=n[157].length;++e)65533!==n[157][e].charCodeAt(0)&&(r[n[157][e]]=40192+e,t[40192+e]=n[157][e]);for(n[158]="�����������������������������������������������������������������얖얙얚얛얝얞얟얡얢얣얤얥얦얧얨얪얫얬얭얮얯얰얱얲얳얶������얷얺얿엀엁엂엃엋엍엏엒엓엕엖엗엙엚엛엜엝엞엟엢엤엦엧������엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋옍옎옏옑옒옓옔옕옖옗옚옝옞옟옠옡옢옣옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉왊왋왌왍왎왏왒왖왗왘왙왚왛왞왟왡왢왣왤왥왦왧왨왩왪왫왭왮왰왲왳왴왵왶왷왺왻왽왾왿욁욂욃욄욅욆욇욊욌욎욏욐욑욒욓욖욗욙욚욛욝욞욟욠욡욢욣욦�".split(""),e=0;e!=n[158].length;++e)65533!==n[158][e].charCodeAt(0)&&(r[n[158][e]]=40448+e,t[40448+e]=n[158][e]);for(n[159]="�����������������������������������������������������������������욨욪욫욬욭욮욯욲욳욵욶욷욻욼욽욾욿웂웄웆웇웈웉웊웋웎������웏웑웒웓웕웖웗웘웙웚웛웞웟웢웣웤웥웦웧웪웫웭웮웯웱웲������웳웴웵웶웷웺웻웼웾웿윀윁윂윃윆윇윉윊윋윍윎윏윐윑윒윓윖윘윚윛윜윝윞윟윢윣윥윦윧윩윪윫윬윭윮윯윲윴윶윸윹윺윻윾윿읁읂읃읅읆읇읈읉읋읎읐읙읚읛읝읞읟읡읢읣읤읥읦읧읩읪읬읭읮읯읰읱읲읳읶읷읹읺읻읿잀잁잂잆잋잌잍잏잒잓잕잙잛잜잝잞잟잢잧잨잩잪잫잮잯잱잲잳잵잶잷�".split(""),e=0;e!=n[159].length;++e)65533!==n[159][e].charCodeAt(0)&&(r[n[159][e]]=40704+e,t[40704+e]=n[159][e]);for(n[160]="�����������������������������������������������������������������잸잹잺잻잾쟂쟃쟄쟅쟆쟇쟊쟋쟍쟏쟑쟒쟓쟔쟕쟖쟗쟙쟚쟛쟜������쟞쟟쟠쟡쟢쟣쟥쟦쟧쟩쟪쟫쟭쟮쟯쟰쟱쟲쟳쟴쟵쟶쟷쟸쟹쟺������쟻쟼쟽쟾쟿젂젃젅젆젇젉젋젌젍젎젏젒젔젗젘젙젚젛젞젟젡젢젣젥젦젧젨젩젪젫젮젰젲젳젴젵젶젷젹젺젻젽젾젿졁졂졃졄졅졆졇졊졋졎졏졐졑졒졓졕졖졗졘졙졚졛졜졝졞졟졠졡졢졣졤졥졦졧졨졩졪졫졬졭졮졯졲졳졵졶졷졹졻졼졽졾졿좂좄좈좉좊좎좏좐좑좒좓좕좖좗좘좙좚좛좜좞좠좢좣좤�".split(""),e=0;e!=n[160].length;++e)65533!==n[160][e].charCodeAt(0)&&(r[n[160][e]]=40960+e,t[40960+e]=n[160][e]);for(n[161]="�����������������������������������������������������������������좥좦좧좩좪좫좬좭좮좯좰좱좲좳좴좵좶좷좸좹좺좻좾좿죀죁������죂죃죅죆죇죉죊죋죍죎죏죐죑죒죓죖죘죚죛죜죝죞죟죢죣죥������죦죧죨죩죪죫죬죭죮죯죰죱죲죳죴죶죷죸죹죺죻죾죿줁줂줃줇줈줉줊줋줎 、。·‥…¨〃­―∥\∼‘’“”〔〕〈〉《》「」『』【】±×÷≠≤≥∞∴°′″℃Å¢£¥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨¬�".split(""),e=0;e!=n[161].length;++e)65533!==n[161][e].charCodeAt(0)&&(r[n[161][e]]=41216+e,t[41216+e]=n[161][e]);for(n[162]="�����������������������������������������������������������������줐줒줓줔줕줖줗줙줚줛줜줝줞줟줠줡줢줣줤줥줦줧줨줩줪줫������줭줮줯줰줱줲줳줵줶줷줸줹줺줻줼줽줾줿쥀쥁쥂쥃쥄쥅쥆쥇������쥈쥉쥊쥋쥌쥍쥎쥏쥒쥓쥕쥖쥗쥙쥚쥛쥜쥝쥞쥟쥢쥤쥥쥦쥧쥨쥩쥪쥫쥭쥮쥯⇒⇔∀∃´~ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®������������������������".split(""),e=0;e!=n[162].length;++e)65533!==n[162][e].charCodeAt(0)&&(r[n[162][e]]=41472+e,t[41472+e]=n[162][e]);for(n[163]="�����������������������������������������������������������������쥱쥲쥳쥵쥶쥷쥸쥹쥺쥻쥽쥾쥿즀즁즂즃즄즅즆즇즊즋즍즎즏������즑즒즓즔즕즖즗즚즜즞즟즠즡즢즣즤즥즦즧즨즩즪즫즬즭즮������즯즰즱즲즳즴즵즶즷즸즹즺즻즼즽즾즿짂짃짅짆짉짋짌짍짎짏짒짔짗짘짛!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[₩]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�".split(""),e=0;e!=n[163].length;++e)65533!==n[163][e].charCodeAt(0)&&(r[n[163][e]]=41728+e,t[41728+e]=n[163][e]);for(n[164]="�����������������������������������������������������������������짞짟짡짣짥짦짨짩짪짫짮짲짳짴짵짶짷짺짻짽짾짿쨁쨂쨃쨄������쨅쨆쨇쨊쨎쨏쨐쨑쨒쨓쨕쨖쨗쨙쨚쨛쨜쨝쨞쨟쨠쨡쨢쨣쨤쨥������쨦쨧쨨쨪쨫쨬쨭쨮쨯쨰쨱쨲쨳쨴쨵쨶쨷쨸쨹쨺쨻쨼쨽쨾쨿쩀쩁쩂쩃쩄쩅쩆ㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅃㅄㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣㅤㅥㅦㅧㅨㅩㅪㅫㅬㅭㅮㅯㅰㅱㅲㅳㅴㅵㅶㅷㅸㅹㅺㅻㅼㅽㅾㅿㆀㆁㆂㆃㆄㆅㆆㆇㆈㆉㆊㆋㆌㆍㆎ�".split(""),e=0;e!=n[164].length;++e)65533!==n[164][e].charCodeAt(0)&&(r[n[164][e]]=41984+e,t[41984+e]=n[164][e]);for(n[165]="�����������������������������������������������������������������쩇쩈쩉쩊쩋쩎쩏쩑쩒쩓쩕쩖쩗쩘쩙쩚쩛쩞쩢쩣쩤쩥쩦쩧쩩쩪������쩫쩬쩭쩮쩯쩰쩱쩲쩳쩴쩵쩶쩷쩸쩹쩺쩻쩼쩾쩿쪀쪁쪂쪃쪅쪆������쪇쪈쪉쪊쪋쪌쪍쪎쪏쪐쪑쪒쪓쪔쪕쪖쪗쪙쪚쪛쪜쪝쪞쪟쪠쪡쪢쪣쪤쪥쪦쪧ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ�����ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ�������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�������".split(""),e=0;e!=n[165].length;++e)65533!==n[165][e].charCodeAt(0)&&(r[n[165][e]]=42240+e,t[42240+e]=n[165][e]);for(n[166]="�����������������������������������������������������������������쪨쪩쪪쪫쪬쪭쪮쪯쪰쪱쪲쪳쪴쪵쪶쪷쪸쪹쪺쪻쪾쪿쫁쫂쫃쫅������쫆쫇쫈쫉쫊쫋쫎쫐쫒쫔쫕쫖쫗쫚쫛쫜쫝쫞쫟쫡쫢쫣쫤쫥쫦쫧������쫨쫩쫪쫫쫭쫮쫯쫰쫱쫲쫳쫵쫶쫷쫸쫹쫺쫻쫼쫽쫾쫿쬀쬁쬂쬃쬄쬅쬆쬇쬉쬊─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂┒┑┚┙┖┕┎┍┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀╁╃╄╅╆╇╈╉╊���������������������������".split(""),e=0;e!=n[166].length;++e)65533!==n[166][e].charCodeAt(0)&&(r[n[166][e]]=42496+e,t[42496+e]=n[166][e]);for(n[167]="�����������������������������������������������������������������쬋쬌쬍쬎쬏쬑쬒쬓쬕쬖쬗쬙쬚쬛쬜쬝쬞쬟쬢쬣쬤쬥쬦쬧쬨쬩������쬪쬫쬬쬭쬮쬯쬰쬱쬲쬳쬴쬵쬶쬷쬸쬹쬺쬻쬼쬽쬾쬿쭀쭂쭃쭄������쭅쭆쭇쭊쭋쭍쭎쭏쭑쭒쭓쭔쭕쭖쭗쭚쭛쭜쭞쭟쭠쭡쭢쭣쭥쭦쭧쭨쭩쭪쭫쭬㎕㎖㎗ℓ㎘㏄㎣㎤㎥㎦㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㏊㎍㎎㎏㏏㎈㎉㏈㎧㎨㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎀㎁㎂㎃㎄㎺㎻㎼㎽㎾㎿㎐㎑㎒㎓㎔Ω㏀㏁㎊㎋㎌㏖㏅㎭㎮㎯㏛㎩㎪㎫㎬㏝㏐㏓㏃㏉㏜㏆����������������".split(""),e=0;e!=n[167].length;++e)65533!==n[167][e].charCodeAt(0)&&(r[n[167][e]]=42752+e,t[42752+e]=n[167][e]);for(n[168]="�����������������������������������������������������������������쭭쭮쭯쭰쭱쭲쭳쭴쭵쭶쭷쭺쭻쭼쭽쭾쭿쮀쮁쮂쮃쮄쮅쮆쮇쮈������쮉쮊쮋쮌쮍쮎쮏쮐쮑쮒쮓쮔쮕쮖쮗쮘쮙쮚쮛쮝쮞쮟쮠쮡쮢쮣������쮤쮥쮦쮧쮨쮩쮪쮫쮬쮭쮮쮯쮰쮱쮲쮳쮴쮵쮶쮷쮹쮺쮻쮼쮽쮾쮿쯀쯁쯂쯃쯄ÆÐªĦ�IJ�ĿŁØŒºÞŦŊ�㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮½⅓⅔¼¾⅛⅜⅝⅞�".split(""),e=0;e!=n[168].length;++e)65533!==n[168][e].charCodeAt(0)&&(r[n[168][e]]=43008+e,t[43008+e]=n[168][e]);for(n[169]="�����������������������������������������������������������������쯅쯆쯇쯈쯉쯊쯋쯌쯍쯎쯏쯐쯑쯒쯓쯕쯖쯗쯘쯙쯚쯛쯜쯝쯞쯟������쯠쯡쯢쯣쯥쯦쯨쯪쯫쯬쯭쯮쯯쯰쯱쯲쯳쯴쯵쯶쯷쯸쯹쯺쯻쯼������쯽쯾쯿찀찁찂찃찄찅찆찇찈찉찊찋찎찏찑찒찓찕찖찗찘찙찚찛찞찟찠찣찤æđðħıijĸŀłøœßþŧŋʼn㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗㈘㈙㈚㈛⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂¹²³⁴ⁿ₁₂₃₄�".split(""),e=0;e!=n[169].length;++e)65533!==n[169][e].charCodeAt(0)&&(r[n[169][e]]=43264+e,t[43264+e]=n[169][e]);for(n[170]="�����������������������������������������������������������������찥찦찪찫찭찯찱찲찳찴찵찶찷찺찿챀챁챂챃챆챇챉챊챋챍챎������챏챐챑챒챓챖챚챛챜챝챞챟챡챢챣챥챧챩챪챫챬챭챮챯챱챲������챳챴챶챷챸챹챺챻챼챽챾챿첀첁첂첃첄첅첆첇첈첉첊첋첌첍첎첏첐첑첒첓ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������".split(""),e=0;e!=n[170].length;++e)65533!==n[170][e].charCodeAt(0)&&(r[n[170][e]]=43520+e,t[43520+e]=n[170][e]);for(n[171]="�����������������������������������������������������������������첔첕첖첗첚첛첝첞첟첡첢첣첤첥첦첧첪첮첯첰첱첲첳첶첷첹������첺첻첽첾첿쳀쳁쳂쳃쳆쳈쳊쳋쳌쳍쳎쳏쳑쳒쳓쳕쳖쳗쳘쳙쳚������쳛쳜쳝쳞쳟쳠쳡쳢쳣쳥쳦쳧쳨쳩쳪쳫쳭쳮쳯쳱쳲쳳쳴쳵쳶쳷쳸쳹쳺쳻쳼쳽ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������".split(""),e=0;e!=n[171].length;++e)65533!==n[171][e].charCodeAt(0)&&(r[n[171][e]]=43776+e,t[43776+e]=n[171][e]);for(n[172]="�����������������������������������������������������������������쳾쳿촀촂촃촄촅촆촇촊촋촍촎촏촑촒촓촔촕촖촗촚촜촞촟촠������촡촢촣촥촦촧촩촪촫촭촮촯촰촱촲촳촴촵촶촷촸촺촻촼촽촾������촿쵀쵁쵂쵃쵄쵅쵆쵇쵈쵉쵊쵋쵌쵍쵎쵏쵐쵑쵒쵓쵔쵕쵖쵗쵘쵙쵚쵛쵝쵞쵟АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������".split(""),e=0;e!=n[172].length;++e)65533!==n[172][e].charCodeAt(0)&&(r[n[172][e]]=44032+e,t[44032+e]=n[172][e]);for(n[173]="�����������������������������������������������������������������쵡쵢쵣쵥쵦쵧쵨쵩쵪쵫쵮쵰쵲쵳쵴쵵쵶쵷쵹쵺쵻쵼쵽쵾쵿춀������춁춂춃춄춅춆춇춉춊춋춌춍춎춏춐춑춒춓춖춗춙춚춛춝춞춟������춠춡춢춣춦춨춪춫춬춭춮춯춱춲춳춴춵춶춷춸춹춺춻춼춽춾춿췀췁췂췃췅�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[173].length;++e)65533!==n[173][e].charCodeAt(0)&&(r[n[173][e]]=44288+e,t[44288+e]=n[173][e]);for(n[174]="�����������������������������������������������������������������췆췇췈췉췊췋췍췎췏췑췒췓췔췕췖췗췘췙췚췛췜췝췞췟췠췡������췢췣췤췥췦췧췩췪췫췭췮췯췱췲췳췴췵췶췷췺췼췾췿츀츁츂������츃츅츆츇츉츊츋츍츎츏츐츑츒츓츕츖츗츘츚츛츜츝츞츟츢츣츥츦츧츩츪츫�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[174].length;++e)65533!==n[174][e].charCodeAt(0)&&(r[n[174][e]]=44544+e,t[44544+e]=n[174][e]);for(n[175]="�����������������������������������������������������������������츬츭츮츯츲츴츶츷츸츹츺츻츼츽츾츿칀칁칂칃칄칅칆칇칈칉������칊칋칌칍칎칏칐칑칒칓칔칕칖칗칚칛칝칞칢칣칤칥칦칧칪칬������칮칯칰칱칲칳칶칷칹칺칻칽칾칿캀캁캂캃캆캈캊캋캌캍캎캏캒캓캕캖캗캙�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[175].length;++e)65533!==n[175][e].charCodeAt(0)&&(r[n[175][e]]=44800+e,t[44800+e]=n[175][e]);for(n[176]="�����������������������������������������������������������������캚캛캜캝캞캟캢캦캧캨캩캪캫캮캯캰캱캲캳캴캵캶캷캸캹캺������캻캼캽캾캿컀컂컃컄컅컆컇컈컉컊컋컌컍컎컏컐컑컒컓컔컕������컖컗컘컙컚컛컜컝컞컟컠컡컢컣컦컧컩컪컭컮컯컰컱컲컳컶컺컻컼컽컾컿가각간갇갈갉갊감갑값갓갔강갖갗같갚갛개객갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆�".split(""),e=0;e!=n[176].length;++e)65533!==n[176][e].charCodeAt(0)&&(r[n[176][e]]=45056+e,t[45056+e]=n[176][e]);for(n[177]="�����������������������������������������������������������������켂켃켅켆켇켉켊켋켌켍켎켏켒켔켖켗켘켙켚켛켝켞켟켡켢켣������켥켦켧켨켩켪켫켮켲켳켴켵켶켷켹켺켻켼켽켾켿콀콁콂콃콄������콅콆콇콈콉콊콋콌콍콎콏콐콑콒콓콖콗콙콚콛콝콞콟콠콡콢콣콦콨콪콫콬괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸�".split(""),e=0;e!=n[177].length;++e)65533!==n[177][e].charCodeAt(0)&&(r[n[177][e]]=45312+e,t[45312+e]=n[177][e]);for(n[178]="�����������������������������������������������������������������콭콮콯콲콳콵콶콷콹콺콻콼콽콾콿쾁쾂쾃쾄쾆쾇쾈쾉쾊쾋쾍������쾎쾏쾐쾑쾒쾓쾔쾕쾖쾗쾘쾙쾚쾛쾜쾝쾞쾟쾠쾢쾣쾤쾥쾦쾧쾩������쾪쾫쾬쾭쾮쾯쾱쾲쾳쾴쾵쾶쾷쾸쾹쾺쾻쾼쾽쾾쾿쿀쿁쿂쿃쿅쿆쿇쿈쿉쿊쿋깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙�".split(""),e=0;e!=n[178].length;++e)65533!==n[178][e].charCodeAt(0)&&(r[n[178][e]]=45568+e,t[45568+e]=n[178][e]);for(n[179]="�����������������������������������������������������������������쿌쿍쿎쿏쿐쿑쿒쿓쿔쿕쿖쿗쿘쿙쿚쿛쿜쿝쿞쿟쿢쿣쿥쿦쿧쿩������쿪쿫쿬쿭쿮쿯쿲쿴쿶쿷쿸쿹쿺쿻쿽쿾쿿퀁퀂퀃퀅퀆퀇퀈퀉퀊������퀋퀌퀍퀎퀏퀐퀒퀓퀔퀕퀖퀗퀙퀚퀛퀜퀝퀞퀟퀠퀡퀢퀣퀤퀥퀦퀧퀨퀩퀪퀫퀬끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫났낭낮낯낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝�".split(""),e=0;e!=n[179].length;++e)65533!==n[179][e].charCodeAt(0)&&(r[n[179][e]]=45824+e,t[45824+e]=n[179][e]);for(n[180]="�����������������������������������������������������������������퀮퀯퀰퀱퀲퀳퀶퀷퀹퀺퀻퀽퀾퀿큀큁큂큃큆큈큊큋큌큍큎큏������큑큒큓큕큖큗큙큚큛큜큝큞큟큡큢큣큤큥큦큧큨큩큪큫큮큯������큱큲큳큵큶큷큸큹큺큻큾큿킀킂킃킄킅킆킇킈킉킊킋킌킍킎킏킐킑킒킓킔뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫달닭닮닯닳담답닷닸당닺닻닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥�".split(""),e=0;e!=n[180].length;++e)65533!==n[180][e].charCodeAt(0)&&(r[n[180][e]]=46080+e,t[46080+e]=n[180][e]);for(n[181]="�����������������������������������������������������������������킕킖킗킘킙킚킛킜킝킞킟킠킡킢킣킦킧킩킪킫킭킮킯킰킱킲������킳킶킸킺킻킼킽킾킿탂탃탅탆탇탊탋탌탍탎탏탒탖탗탘탙탚������탛탞탟탡탢탣탥탦탧탨탩탪탫탮탲탳탴탵탶탷탹탺탻탼탽탾탿턀턁턂턃턄덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸�".split(""),e=0;e!=n[181].length;++e)65533!==n[181][e].charCodeAt(0)&&(r[n[181][e]]=46336+e,t[46336+e]=n[181][e]);for(n[182]="�����������������������������������������������������������������턅턆턇턈턉턊턋턌턎턏턐턑턒턓턔턕턖턗턘턙턚턛턜턝턞턟������턠턡턢턣턤턥턦턧턨턩턪턫턬턭턮턯턲턳턵턶턷턹턻턼턽턾������턿텂텆텇텈텉텊텋텎텏텑텒텓텕텖텗텘텙텚텛텞텠텢텣텤텥텦텧텩텪텫텭땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗�".split(""),e=0;e!=n[182].length;++e)65533!==n[182][e].charCodeAt(0)&&(r[n[182][e]]=46592+e,t[46592+e]=n[182][e]);for(n[183]="�����������������������������������������������������������������텮텯텰텱텲텳텴텵텶텷텸텹텺텻텽텾텿톀톁톂톃톅톆톇톉톊������톋톌톍톎톏톐톑톒톓톔톕톖톗톘톙톚톛톜톝톞톟톢톣톥톦톧������톩톪톫톬톭톮톯톲톴톶톷톸톹톻톽톾톿퇁퇂퇃퇄퇅퇆퇇퇈퇉퇊퇋퇌퇍퇎퇏래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩�".split(""),e=0;e!=n[183].length;++e)65533!==n[183][e].charCodeAt(0)&&(r[n[183][e]]=46848+e,t[46848+e]=n[183][e]);for(n[184]="�����������������������������������������������������������������퇐퇑퇒퇓퇔퇕퇖퇗퇙퇚퇛퇜퇝퇞퇟퇠퇡퇢퇣퇤퇥퇦퇧퇨퇩퇪������퇫퇬퇭퇮퇯퇰퇱퇲퇳퇵퇶퇷퇹퇺퇻퇼퇽퇾퇿툀툁툂툃툄툅툆������툈툊툋툌툍툎툏툑툒툓툔툕툖툗툘툙툚툛툜툝툞툟툠툡툢툣툤툥툦툧툨툩륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많맏말맑맒맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼�".split(""),e=0;e!=n[184].length;++e)65533!==n[184][e].charCodeAt(0)&&(r[n[184][e]]=47104+e,t[47104+e]=n[184][e]);for(n[185]="�����������������������������������������������������������������툪툫툮툯툱툲툳툵툶툷툸툹툺툻툾퉀퉂퉃퉄퉅퉆퉇퉉퉊퉋퉌������퉍퉎퉏퉐퉑퉒퉓퉔퉕퉖퉗퉘퉙퉚퉛퉝퉞퉟퉠퉡퉢퉣퉥퉦퉧퉨������퉩퉪퉫퉬퉭퉮퉯퉰퉱퉲퉳퉴퉵퉶퉷퉸퉹퉺퉻퉼퉽퉾퉿튂튃튅튆튇튉튊튋튌묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바박밖밗반받발밝밞밟밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗�".split(""),e=0;e!=n[185].length;++e)65533!==n[185][e].charCodeAt(0)&&(r[n[185][e]]=47360+e,t[47360+e]=n[185][e]);for(n[186]="�����������������������������������������������������������������튍튎튏튒튓튔튖튗튘튙튚튛튝튞튟튡튢튣튥튦튧튨튩튪튫튭������튮튯튰튲튳튴튵튶튷튺튻튽튾틁틃틄틅틆틇틊틌틍틎틏틐틑������틒틓틕틖틗틙틚틛틝틞틟틠틡틢틣틦틧틨틩틪틫틬틭틮틯틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤�".split(""),e=0;e!=n[186].length;++e)65533!==n[186][e].charCodeAt(0)&&(r[n[186][e]]=47616+e,t[47616+e]=n[186][e]);for(n[187]="�����������������������������������������������������������������틻틼틽틾틿팂팄팆팇팈팉팊팋팏팑팒팓팕팗팘팙팚팛팞팢팣������팤팦팧팪팫팭팮팯팱팲팳팴팵팶팷팺팾팿퍀퍁퍂퍃퍆퍇퍈퍉������퍊퍋퍌퍍퍎퍏퍐퍑퍒퍓퍔퍕퍖퍗퍘퍙퍚퍛퍜퍝퍞퍟퍠퍡퍢퍣퍤퍥퍦퍧퍨퍩빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤�".split(""),e=0;e!=n[187].length;++e)65533!==n[187][e].charCodeAt(0)&&(r[n[187][e]]=47872+e,t[47872+e]=n[187][e]);for(n[188]="�����������������������������������������������������������������퍪퍫퍬퍭퍮퍯퍰퍱퍲퍳퍴퍵퍶퍷퍸퍹퍺퍻퍾퍿펁펂펃펅펆펇������펈펉펊펋펎펒펓펔펕펖펗펚펛펝펞펟펡펢펣펤펥펦펧펪펬펮������펯펰펱펲펳펵펶펷펹펺펻펽펾펿폀폁폂폃폆폇폊폋폌폍폎폏폑폒폓폔폕폖샥샨샬샴샵샷샹섀섄섈섐섕서석섞섟선섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭�".split(""),e=0;e!=n[188].length;++e)65533!==n[188][e].charCodeAt(0)&&(r[n[188][e]]=48128+e,t[48128+e]=n[188][e]);for(n[189]="�����������������������������������������������������������������폗폙폚폛폜폝폞폟폠폢폤폥폦폧폨폩폪폫폮폯폱폲폳폵폶폷������폸폹폺폻폾퐀퐂퐃퐄퐅퐆퐇퐉퐊퐋퐌퐍퐎퐏퐐퐑퐒퐓퐔퐕퐖������퐗퐘퐙퐚퐛퐜퐞퐟퐠퐡퐢퐣퐤퐥퐦퐧퐨퐩퐪퐫퐬퐭퐮퐯퐰퐱퐲퐳퐴퐵퐶퐷숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰�".split(""),e=0;e!=n[189].length;++e)65533!==n[189][e].charCodeAt(0)&&(r[n[189][e]]=48384+e,t[48384+e]=n[189][e]);for(n[190]="�����������������������������������������������������������������퐸퐹퐺퐻퐼퐽퐾퐿푁푂푃푅푆푇푈푉푊푋푌푍푎푏푐푑푒푓������푔푕푖푗푘푙푚푛푝푞푟푡푢푣푥푦푧푨푩푪푫푬푮푰푱푲������푳푴푵푶푷푺푻푽푾풁풃풄풅풆풇풊풌풎풏풐풑풒풓풕풖풗풘풙풚풛풜풝쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄업없엇었엉엊엌엎�".split(""),e=0;e!=n[190].length;++e)65533!==n[190][e].charCodeAt(0)&&(r[n[190][e]]=48640+e,t[48640+e]=n[190][e]);for(n[191]="�����������������������������������������������������������������풞풟풠풡풢풣풤풥풦풧풨풪풫풬풭풮풯풰풱풲풳풴풵풶풷풸������풹풺풻풼풽풾풿퓀퓁퓂퓃퓄퓅퓆퓇퓈퓉퓊퓋퓍퓎퓏퓑퓒퓓퓕������퓖퓗퓘퓙퓚퓛퓝퓞퓠퓡퓢퓣퓤퓥퓦퓧퓩퓪퓫퓭퓮퓯퓱퓲퓳퓴퓵퓶퓷퓹퓺퓼에엑엔엘엠엡엣엥여역엮연열엶엷염엽엾엿였영옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨�".split(""),e=0;e!=n[191].length;++e)65533!==n[191][e].charCodeAt(0)&&(r[n[191][e]]=48896+e,t[48896+e]=n[191][e]);for(n[192]="�����������������������������������������������������������������퓾퓿픀픁픂픃픅픆픇픉픊픋픍픎픏픐픑픒픓픖픘픙픚픛픜픝������픞픟픠픡픢픣픤픥픦픧픨픩픪픫픬픭픮픯픰픱픲픳픴픵픶픷������픸픹픺픻픾픿핁핂핃핅핆핇핈핉핊핋핎핐핒핓핔핕핖핗핚핛핝핞핟핡핢핣웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응읒읓읔읕읖읗의읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊�".split(""),e=0;e!=n[192].length;++e)65533!==n[192][e].charCodeAt(0)&&(r[n[192][e]]=49152+e,t[49152+e]=n[192][e]);for(n[193]="�����������������������������������������������������������������핤핦핧핪핬핮핯핰핱핲핳핶핷핹핺핻핽핾핿햀햁햂햃햆햊햋������햌햍햎햏햑햒햓햔햕햖햗햘햙햚햛햜햝햞햟햠햡햢햣햤햦햧������햨햩햪햫햬햭햮햯햰햱햲햳햴햵햶햷햸햹햺햻햼햽햾햿헀헁헂헃헄헅헆헇점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓�".split(""),e=0;e!=n[193].length;++e)65533!==n[193][e].charCodeAt(0)&&(r[n[193][e]]=49408+e,t[49408+e]=n[193][e]);for(n[194]="�����������������������������������������������������������������헊헋헍헎헏헑헓헔헕헖헗헚헜헞헟헠헡헢헣헦헧헩헪헫헭헮������헯헰헱헲헳헶헸헺헻헼헽헾헿혂혃혅혆혇혉혊혋혌혍혎혏혒������혖혗혘혙혚혛혝혞혟혡혢혣혥혦혧혨혩혪혫혬혮혯혰혱혲혳혴혵혶혷혺혻징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻�".split(""),e=0;e!=n[194].length;++e)65533!==n[194][e].charCodeAt(0)&&(r[n[194][e]]=49664+e,t[49664+e]=n[194][e]);for(n[195]="�����������������������������������������������������������������혽혾혿홁홂홃홄홆홇홊홌홎홏홐홒홓홖홗홙홚홛홝홞홟홠홡������홢홣홤홥홦홨홪홫홬홭홮홯홲홳홵홶홷홸홹홺홻홼홽홾홿횀������횁횂횄횆횇횈횉횊횋횎횏횑횒횓횕횖횗횘횙횚횛횜횞횠횢횣횤횥횦횧횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층�".split(""),e=0;e!=n[195].length;++e)65533!==n[195][e].charCodeAt(0)&&(r[n[195][e]]=49920+e,t[49920+e]=n[195][e]);for(n[196]="�����������������������������������������������������������������횫횭횮횯횱횲횳횴횵횶횷횸횺횼횽횾횿훀훁훂훃훆훇훉훊훋������훍훎훏훐훒훓훕훖훘훚훛훜훝훞훟훡훢훣훥훦훧훩훪훫훬훭������훮훯훱훲훳훴훶훷훸훹훺훻훾훿휁휂휃휅휆휇휈휉휊휋휌휍휎휏휐휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼�".split(""),e=0;e!=n[196].length;++e)65533!==n[196][e].charCodeAt(0)&&(r[n[196][e]]=50176+e,t[50176+e]=n[196][e]);for(n[197]="�����������������������������������������������������������������휕휖휗휚휛휝휞휟휡휢휣휤휥휦휧휪휬휮휯휰휱휲휳휶휷휹������휺휻휽휾휿흀흁흂흃흅흆흈흊흋흌흍흎흏흒흓흕흚흛흜흝흞������흟흢흤흦흧흨흪흫흭흮흯흱흲흳흵흶흷흸흹흺흻흾흿힀힂힃힄힅힆힇힊힋큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜�".split(""),e=0;e!=n[197].length;++e)65533!==n[197][e].charCodeAt(0)&&(r[n[197][e]]=50432+e,t[50432+e]=n[197][e]);for(n[198]="�����������������������������������������������������������������힍힎힏힑힒힓힔힕힖힗힚힜힞힟힠힡힢힣������������������������������������������������������������������������������퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁�".split(""),e=0;e!=n[198].length;++e)65533!==n[198][e].charCodeAt(0)&&(r[n[198][e]]=50688+e,t[50688+e]=n[198][e]);for(n[199]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠�".split(""),e=0;e!=n[199].length;++e)65533!==n[199][e].charCodeAt(0)&&(r[n[199][e]]=50944+e,t[50944+e]=n[199][e]);for(n[200]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝�".split(""),e=0;e!=n[200].length;++e)65533!==n[200][e].charCodeAt(0)&&(r[n[200][e]]=51200+e,t[51200+e]=n[200][e]);for(n[202]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕刻却各恪慤殼珏脚覺角閣侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間乫喝曷渴碣竭葛褐蝎鞨勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕�".split(""),e=0;e!=n[202].length;++e)65533!==n[202][e].charCodeAt(0)&&(r[n[202][e]]=51712+e,t[51712+e]=n[202][e]);for(n[203]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開喀客坑更粳羹醵倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸乾件健巾建愆楗腱虔蹇鍵騫乞傑杰桀儉劍劒檢�".split(""),e=0;e!=n[203].length;++e)65533!==n[203][e].charCodeAt(0)&&(r[n[203][e]]=51968+e,t[51968+e]=n[203][e]);for(n[204]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������瞼鈐黔劫怯迲偈憩揭擊格檄激膈覡隔堅牽犬甄絹繭肩見譴遣鵑抉決潔結缺訣兼慊箝謙鉗鎌京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨係啓堺契季屆悸戒桂械�".split(""),e=0;e!=n[204].length;++e)65533!==n[204][e].charCodeAt(0)&&(r[n[204][e]]=52224+e,t[52224+e]=n[204][e]);for(n[205]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������棨溪界癸磎稽系繫繼計誡谿階鷄古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓哭斛曲梏穀谷鵠困坤崑昆梱棍滾琨袞鯤汨滑骨供公共功孔工恐恭拱控攻珙空蚣貢鞏串寡戈果瓜�".split(""),e=0;e!=n[205].length;++e)65533!==n[205][e].charCodeAt(0)&&(r[n[205][e]]=52480+e,t[52480+e]=n[205][e]);for(n[206]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������科菓誇課跨過鍋顆廓槨藿郭串冠官寬慣棺款灌琯瓘管罐菅觀貫關館刮恝括适侊光匡壙廣曠洸炚狂珖筐胱鑛卦掛罫乖傀塊壞怪愧拐槐魁宏紘肱轟交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久九仇俱具勾�".split(""),e=0;e!=n[206].length;++e)65533!==n[206][e].charCodeAt(0)&&(r[n[206][e]]=52736+e,t[52736+e]=n[206][e]);for(n[207]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局菊鞠鞫麴君窘群裙軍郡堀屈掘窟宮弓穹窮芎躬倦券勸卷圈拳捲權淃眷厥獗蕨蹶闕机櫃潰詭軌饋句晷歸貴�".split(""),e=0;e!=n[207].length;++e)65533!==n[207][e].charCodeAt(0)&&(r[n[207][e]]=52992+e,t[52992+e]=n[207][e]);for(n[208]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������鬼龜叫圭奎揆槻珪硅窺竅糾葵規赳逵閨勻均畇筠菌鈞龜橘克剋劇戟棘極隙僅劤勤懃斤根槿瑾筋芹菫覲謹近饉契今妗擒昑檎琴禁禽芩衾衿襟金錦伋及急扱汲級給亘兢矜肯企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣�".split(""),e=0;e!=n[208].length;++e)65533!==n[208][e].charCodeAt(0)&&(r[n[208][e]]=53248+e,t[53248+e]=n[208][e]);for(n[209]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒緊佶吉拮桔金喫儺喇奈娜懦懶拏拿癩羅蘿螺裸邏那樂洛烙珞落諾酪駱亂卵暖欄煖爛蘭難鸞捏捺南嵐枏楠湳濫男藍襤拉�".split(""),e=0;e!=n[209].length;++e)65533!==n[209][e].charCodeAt(0)&&(r[n[209][e]]=53504+e,t[53504+e]=n[209][e]);for(n[210]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������納臘蠟衲囊娘廊朗浪狼郎乃來內奈柰耐冷女年撚秊念恬拈捻寧寗努勞奴弩怒擄櫓爐瑙盧老蘆虜路露駑魯鷺碌祿綠菉錄鹿論壟弄濃籠聾膿農惱牢磊腦賂雷尿壘屢樓淚漏累縷陋嫩訥杻紐勒肋凜凌稜綾能菱陵尼泥匿溺多茶�".split(""),e=0;e!=n[210].length;++e)65533!==n[210][e].charCodeAt(0)&&(r[n[210][e]]=53760+e,t[53760+e]=n[210][e]);for(n[211]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛撻澾獺疸達啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟沓畓答踏遝唐堂塘幢戇撞棠當糖螳黨代垈坮大對岱帶待戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃�".split(""),e=0;e!=n[211].length;++e)65533!==n[211][e].charCodeAt(0)&&(r[n[211][e]]=54016+e,t[54016+e]=n[211][e]);for(n[212]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������棹櫂淘渡滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜毒瀆牘犢獨督禿篤纛讀墩惇敦旽暾沌焞燉豚頓乭突仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅兜斗杜枓痘竇荳讀豆逗頭屯臀芚遁遯鈍得嶝橙燈登等藤謄鄧騰喇懶拏癩羅�".split(""),e=0;e!=n[212].length;++e)65533!==n[212][e].charCodeAt(0)&&(r[n[212][e]]=54272+e,t[54272+e]=n[212][e]);for(n[213]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������蘿螺裸邏樂洛烙珞絡落諾酪駱丹亂卵欄欒瀾爛蘭鸞剌辣嵐擥攬欖濫籃纜藍襤覽拉臘蠟廊朗浪狼琅瑯螂郞來崍徠萊冷掠略亮倆兩凉梁樑粮粱糧良諒輛量侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷瀝礫轢靂憐戀攣漣�".split(""),e=0;e!=n[213].length;++e)65533!==n[213][e].charCodeAt(0)&&(r[n[213][e]]=54528+e,t[54528+e]=n[213][e]);for(n[214]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������煉璉練聯蓮輦連鍊冽列劣洌烈裂廉斂殮濂簾獵令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡例澧禮醴隷勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵碌祿綠菉錄鹿麓論壟弄朧瀧瓏籠聾儡瀨牢磊賂賚賴雷了僚寮廖料燎療瞭聊蓼�".split(""),e=0;e!=n[214].length;++e)65533!==n[214][e].charCodeAt(0)&&(r[n[214][e]]=54784+e,t[54784+e]=n[214][e]);for(n[215]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������遼鬧龍壘婁屢樓淚漏瘻累縷蔞褸鏤陋劉旒柳榴流溜瀏琉瑠留瘤硫謬類六戮陸侖倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾菱陵俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉吝潾燐璘藺躪隣鱗麟林淋琳臨霖砬�".split(""),e=0;e!=n[215].length;++e)65533!==n[215][e].charCodeAt(0)&&(r[n[215][e]]=55040+e,t[55040+e]=n[215][e]);for(n[216]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻唜抹末沫茉襪靺亡妄忘忙望網罔芒茫莽輞邙埋妹媒寐昧枚梅每煤罵買賣邁魅脈貊陌驀麥孟氓猛盲盟萌冪覓免冕勉棉沔眄眠綿緬面麵滅�".split(""),e=0;e!=n[216].length;++e)65533!==n[216][e].charCodeAt(0)&&(r[n[216][e]]=55296+e,t[55296+e]=n[216][e]);for(n[217]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������蔑冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌木沐牧目睦穆鶩歿沒夢朦蒙卯墓妙廟描昴杳渺猫竗苗錨務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡墨默們刎吻問文�".split(""),e=0;e!=n[217].length;++e)65533!==n[217][e].charCodeAt(0)&&(r[n[217][e]]=55552+e,t[55552+e]=n[217][e]);for(n[218]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������汶紊紋聞蚊門雯勿沕物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴岷悶愍憫敏旻旼民泯玟珉緡閔密蜜謐剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯勃拔撥渤潑�".split(""),e=0;e!=n[218].length;++e)65533!==n[218][e].charCodeAt(0)&&(r[n[218][e]]=55808+e,t[55808+e]=n[218][e]);for(n[219]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������發跋醱鉢髮魃倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪伯佰帛柏栢白百魄幡樊煩燔番磻繁蕃藩飜伐筏罰閥凡帆梵氾汎泛犯範范法琺僻劈壁擘檗璧癖�".split(""),e=0;e!=n[219].length;++e)65533!==n[219][e].charCodeAt(0)&&(r[n[219][e]]=56064+e,t[56064+e]=n[219][e]);for(n[220]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������碧蘗闢霹便卞弁變辨辯邊別瞥鱉鼈丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈保堡報寶普步洑湺潽珤甫菩補褓譜輔伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒本乶俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳不付俯傅剖副否咐埠夫婦�".split(""),e=0;e!=n[220].length;++e)65533!==n[220][e].charCodeAt(0)&&(r[n[220][e]]=56320+e,t[56320+e]=n[220][e]);for(n[221]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰不佛弗彿拂崩朋棚硼繃鵬丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥�".split(""),e=0;e!=n[221].length;++e)65533!==n[221][e].charCodeAt(0)&&(r[n[221][e]]=56576+e,t[56576+e]=n[221][e]);for(n[222]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������脾臂菲蜚裨誹譬費鄙非飛鼻嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻憑氷聘騁乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝削數朔索�".split(""),e=0;e!=n[222].length;++e)65533!==n[222][e].charCodeAt(0)&&(r[n[222][e]]=56832+e,t[56832+e]=n[222][e]);for(n[223]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������傘刪山散汕珊産疝算蒜酸霰乷撒殺煞薩三參杉森渗芟蔘衫揷澁鈒颯上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署�".split(""),e=0;e!=n[223].length;++e)65533!==n[223][e].charCodeAt(0)&&(r[n[223][e]]=57088+e,t[57088+e]=n[223][e]);for(n[224]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������胥舒薯西誓逝鋤黍鼠夕奭席惜昔晳析汐淅潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮卨屑楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾贍閃陝攝涉燮葉城姓宬性惺成星晟猩珹盛省筬�".split(""),e=0;e!=n[224].length;++e)65533!==n[224][e].charCodeAt(0)&&(r[n[224][e]]=57344+e,t[57344+e]=n[224][e]);for(n[225]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������聖聲腥誠醒世勢歲洗稅笹細說貰召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷俗屬束涑粟續謖贖速孫巽損蓀遜飡率宋悚松淞訟誦送頌刷殺灑碎鎖衰釗修受嗽囚垂壽嫂守岫峀帥愁�".split(""),e=0;e!=n[225].length;++e)65533!==n[225][e].charCodeAt(0)&&(r[n[225][e]]=57600+e,t[57600+e]=n[225][e]);for(n[226]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚叔塾夙孰宿淑潚熟琡璹肅菽巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴戌術述鉥崇崧�".split(""),e=0;e!=n[226].length;++e)65533!==n[226][e].charCodeAt(0)&&(r[n[226][e]]=57856+e,t[57856+e]=n[226][e]);for(n[227]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������嵩瑟膝蝨濕拾習褶襲丞乘僧勝升承昇繩蠅陞侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺埴寔式息拭植殖湜熄篒蝕識軾食飾伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅失室實悉審尋心沁�".split(""),e=0;e!=n[227].length;++e)65533!==n[227][e].charCodeAt(0)&&(r[n[227][e]]=58112+e,t[58112+e]=n[227][e]);for(n[228]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������沈深瀋甚芯諶什十拾雙氏亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷安岸按晏案眼雁鞍顔鮟斡謁軋閼唵岩巖庵暗癌菴闇壓押狎鴨仰央怏昻殃秧鴦厓哀埃崖愛曖涯碍艾隘靄厄扼掖液縊腋額�".split(""),e=0;e!=n[228].length;++e)65533!==n[228][e].charCodeAt(0)&&(r[n[228][e]]=58368+e,t[58368+e]=n[228][e]);for(n[229]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������櫻罌鶯鸚也倻冶夜惹揶椰爺耶若野弱掠略約若葯蒻藥躍亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養圄御於漁瘀禦語馭魚齬億憶抑檍臆偃堰彦焉言諺孼蘖俺儼嚴奄掩淹嶪業円予余勵呂女如廬�".split(""),e=0;e!=n[229].length;++e)65533!==n[229][e].charCodeAt(0)&&(r[n[229][e]]=58624+e,t[58624+e]=n[229][e]);for(n[230]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎亦力域役易曆歷疫繹譯轢逆驛嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶列劣咽悅涅烈熱裂說閱厭廉念捻染殮炎焰琰艶苒�".split(""),e=0;e!=n[230].length;++e)65533!==n[230][e].charCodeAt(0)&&(r[n[230][e]]=58880+e,t[58880+e]=n[230][e]);for(n[231]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������簾閻髥鹽曄獵燁葉令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳�".split(""),e=0;e!=n[231].length;++e)65533!==n[231][e].charCodeAt(0)&&(r[n[231][e]]=59136+e,t[59136+e]=n[231][e]);for(n[232]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������烏熬獒筽蜈誤鰲鼇屋沃獄玉鈺溫瑥瘟穩縕蘊兀壅擁瓮甕癰翁邕雍饔渦瓦窩窪臥蛙蝸訛婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬巍猥畏了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療�".split(""),e=0;e!=n[232].length;++e)65533!==n[232][e].charCodeAt(0)&&(r[n[232][e]]=59392+e,t[59392+e]=n[232][e]);for(n[233]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������窈窯繇繞耀腰蓼蟯要謠遙遼邀饒慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩勖彧旭昱栯煜稶郁頊云暈橒殞澐熉耘芸蕓�".split(""),e=0;e!=n[233].length;++e)65533!==n[233][e].charCodeAt(0)&&(r[n[233][e]]=59648+e,t[59648+e]=n[233][e]);for(n[234]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������運隕雲韻蔚鬱亐熊雄元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛月越鉞位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜�".split(""),e=0;e!=n[234].length;++e)65533!==n[234][e].charCodeAt(0)&&(r[n[234][e]]=59904+e,t[59904+e]=n[234][e]);for(n[235]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類六堉戮毓肉育陸倫允奫尹崙淪潤玧胤贇輪鈗閏律慄栗率聿戎瀜絨融隆垠恩慇殷誾銀隱乙吟淫蔭陰音飮揖泣邑凝應膺鷹依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼�".split(""),e=0;e!=n[235].length;++e)65533!==n[235][e].charCodeAt(0)&&(r[n[235][e]]=60160+e,t[60160+e]=n[235][e]);for(n[236]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������議醫二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟一佚佾壹日溢逸鎰馹任壬妊姙恁林淋稔臨荏賃入卄�".split(""),e=0;e!=n[236].length;++e)65533!==n[236][e].charCodeAt(0)&&(r[n[236][e]]=60416+e,t[60416+e]=n[236][e]);for(n[237]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������立笠粒仍剩孕芿仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌作勺嚼斫昨灼炸爵綽芍酌雀鵲孱棧殘潺盞岑暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長�".split(""),e=0;e!=n[237].length;++e)65533!==n[237][e].charCodeAt(0)&&(r[n[237][e]]=60672+e,t[60672+e]=n[237][e]);for(n[238]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������障再哉在宰才材栽梓渽滓災縡裁財載齋齎爭箏諍錚佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱�".split(""),e=0;e!=n[238].length;++e)65533!==n[238][e].charCodeAt(0)&&(r[n[238][e]]=60928+e,t[60928+e]=n[238][e]);for(n[239]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞切截折浙癤竊節絶占岾店漸点粘霑鮎點接摺蝶丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖�".split(""),e=0;e!=n[239].length;++e)65533!==n[239][e].charCodeAt(0)&&(r[n[239][e]]=61184+e,t[61184+e]=n[239][e]);for(n[240]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������靜頂鼎制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥族簇足鏃存尊卒拙猝倧宗從悰慫棕淙琮種終綜縱腫�".split(""),e=0;e!=n[240].length;++e)65533!==n[240][e].charCodeAt(0)&&(r[n[240][e]]=61440+e,t[61440+e]=n[240][e]);for(n[241]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������踪踵鍾鐘佐坐左座挫罪主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐竹粥俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿茁中仲衆重卽櫛楫汁葺增憎曾拯烝甑症繒蒸證贈之只�".split(""),e=0;e!=n[241].length;++e)65533!==n[241][e].charCodeAt(0)&&(r[n[241][e]]=61696+e,t[61696+e]=n[241][e]);for(n[242]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲直稙稷織職唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭斟朕什執潗緝輯�".split(""),e=0;e!=n[242].length;++e)65533!==n[242][e].charCodeAt(0)&&(r[n[242][e]]=61952+e,t[61952+e]=n[242][e]);for(n[243]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������鏶集徵懲澄且侘借叉嗟嵯差次此磋箚茶蹉車遮捉搾着窄錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌刹察擦札紮僭參塹慘慙懺斬站讒讖倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼債埰寀寨彩採砦綵菜蔡采釵冊柵策�".split(""),e=0;e!=n[243].length;++e)65533!==n[243][e].charCodeAt(0)&&(r[n[243][e]]=62208+e,t[62208+e]=n[243][e]);for(n[244]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆凸哲喆徹撤澈綴輟轍鐵僉尖沾添甛瞻簽籤詹諂堞妾帖捷牒疊睫諜貼輒廳晴淸聽菁請靑鯖切剃替涕滯締諦逮遞體初剿哨憔抄招梢�".split(""),e=0;e!=n[244].length;++e)65533!==n[244][e].charCodeAt(0)&&(r[n[244][e]]=62464+e,t[62464+e]=n[244][e]);for(n[245]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮促囑燭矗蜀觸寸忖村邨叢塚寵悤憁摠總聰蔥銃撮催崔最墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍丑畜祝竺筑築縮蓄蹙蹴軸逐春椿瑃出朮黜充忠沖蟲衝衷悴膵萃�".split(""),e=0;e!=n[245].length;++e)65533!==n[245][e].charCodeAt(0)&&(r[n[245][e]]=62720+e,t[62720+e]=n[245][e]);for(n[246]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲側仄厠惻測層侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸琛砧針鍼蟄秤稱快他咤唾墮妥惰打拖朶楕舵陀馱駝倬卓啄坼度托拓擢晫柝濁濯琢琸託�".split(""),e=0;e!=n[246].length;++e)65533!==n[246][e].charCodeAt(0)&&(r[n[246][e]]=62976+e,t[62976+e]=n[246][e]);for(n[247]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������鐸呑嘆坦彈憚歎灘炭綻誕奪脫探眈耽貪塔搭榻宕帑湯糖蕩兌台太怠態殆汰泰笞胎苔跆邰颱宅擇澤撑攄兎吐土討慟桶洞痛筒統通堆槌腿褪退頹偸套妬投透鬪慝特闖坡婆巴把播擺杷波派爬琶破罷芭跛頗判坂板版瓣販辦鈑�".split(""),e=0;e!=n[247].length;++e)65533!==n[247][e].charCodeAt(0)&&(r[n[247][e]]=63232+e,t[63232+e]=n[247][e]);for(n[248]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������阪八叭捌佩唄悖敗沛浿牌狽稗覇貝彭澎烹膨愎便偏扁片篇編翩遍鞭騙貶坪平枰萍評吠嬖幣廢弊斃肺蔽閉陛佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑幅暴曝瀑爆輻俵剽彪慓杓標漂瓢票表豹飇飄驃�".split(""),e=0;e!=n[248].length;++e)65533!==n[248][e].charCodeAt(0)&&(r[n[248][e]]=63488+e,t[63488+e]=n[248][e]);for(n[249]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������品稟楓諷豊風馮彼披疲皮被避陂匹弼必泌珌畢疋筆苾馝乏逼下何厦夏廈昰河瑕荷蝦賀遐霞鰕壑學虐謔鶴寒恨悍旱汗漢澣瀚罕翰閑閒限韓割轄函含咸啣喊檻涵緘艦銜陷鹹合哈盒蛤閤闔陜亢伉姮嫦巷恒抗杭桁沆港缸肛航�".split(""),e=0;e!=n[249].length;++e)65533!==n[249][e].charCodeAt(0)&&(r[n[249][e]]=63744+e,t[63744+e]=n[249][e]);for(n[250]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������行降項亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸杏荇行享向嚮珦鄕響餉饗香噓墟虛許憲櫶獻軒歇險驗奕爀赫革俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯孑穴血頁嫌俠協夾峽挾浹狹脅脇莢鋏頰亨兄刑型�".split(""),e=0;e!=n[250].length;++e)65533!==n[250][e].charCodeAt(0)&&(r[n[250][e]]=64e3+e,t[64e3+e]=n[250][e]);for(n[251]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨兮彗惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥惑或酷婚昏混渾琿魂忽惚笏哄弘汞泓洪烘紅虹訌鴻化和嬅樺火畵�".split(""),e=0;e!=n[251].length;++e)65533!==n[251][e].charCodeAt(0)&&(r[n[251][e]]=64256+e,t[64256+e]=n[251][e]);for(n[252]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������禍禾花華話譁貨靴廓擴攫確碻穫丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥活滑猾豁闊凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄劃獲宖橫鐄哮嚆孝效斅曉梟涍淆�".split(""),e=0;e!=n[252].length;++e)65533!==n[252][e].charCodeAt(0)&&(r[n[252][e]]=64512+e,t[64512+e]=n[252][e]);for(n[253]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������爻肴酵驍侯候厚后吼喉嗅帿後朽煦珝逅勛勳塤壎焄熏燻薰訓暈薨喧暄煊萱卉喙毁彙徽揮暉煇諱輝麾休携烋畦虧恤譎鷸兇凶匈洶胸黑昕欣炘痕吃屹紇訖欠欽歆吸恰洽翕興僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲詰�".split(""),e=0;e!=n[253].length;++e)65533!==n[253][e].charCodeAt(0)&&(r[n[253][e]]=64768+e,t[64768+e]=n[253][e]);return{enc:r,dec:t}}(),t[950]=function(){var e,t=[],r={},n=[];for(n[0]="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������".split(""),e=0;e!=n[0].length;++e)65533!==n[0][e].charCodeAt(0)&&(r[n[0][e]]=0+e,t[0+e]=n[0][e]);for(n[161]="���������������������������������������������������������������� ,、。.‧;:?!︰…‥﹐﹑﹒·﹔﹕﹖﹗|–︱—︳╴︴﹏()︵︶{}︷︸〔〕︹︺【】︻︼《》︽︾〈〉︿﹀「」﹁﹂『』﹃﹄﹙﹚����������������������������������﹛﹜﹝﹞‘’“”〝〞‵′#&*※§〃○●△▲◎☆★◇◆□■▽▼㊣℅¯ ̄_ˍ﹉﹊﹍﹎﹋﹌﹟﹠﹡+-×÷±√<>=≦≧≠∞≒≡﹢﹣﹤﹥﹦~∩∪⊥∠∟⊿㏒㏑∫∮∵∴♀♂⊕⊙↑↓←→↖↗↙↘∥∣/�".split(""),e=0;e!=n[161].length;++e)65533!==n[161][e].charCodeAt(0)&&(r[n[161][e]]=41216+e,t[41216+e]=n[161][e]);for(n[162]="����������������������������������������������������������������\∕﹨$¥〒¢£%@℃℉﹩﹪﹫㏕㎜㎝㎞㏎㎡㎎㎏㏄°兙兛兞兝兡兣嗧瓩糎▁▂▃▄▅▆▇█▏▎▍▌▋▊▉┼┴┬┤├▔─│▕┌┐└┘╭����������������������������������╮╰╯═╞╪╡◢◣◥◤╱╲╳0123456789ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ〡〢〣〤〥〦〧〨〩十卄卅ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv�".split(""),e=0;e!=n[162].length;++e)65533!==n[162][e].charCodeAt(0)&&(r[n[162][e]]=41472+e,t[41472+e]=n[162][e]);for(n[163]="����������������������������������������������������������������wxyzΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏ����������������������������������ㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ˙ˉˊˇˋ���������������������������������€������������������������������".split(""),e=0;e!=n[163].length;++e)65533!==n[163][e].charCodeAt(0)&&(r[n[163][e]]=41728+e,t[41728+e]=n[163][e]);for(n[164]="����������������������������������������������������������������一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才����������������������������������丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙�".split(""),e=0;e!=n[164].length;++e)65533!==n[164][e].charCodeAt(0)&&(r[n[164][e]]=41984+e,t[41984+e]=n[164][e]);for(n[165]="����������������������������������������������������������������世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外����������������������������������央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全�".split(""),e=0;e!=n[165].length;++e)65533!==n[165][e].charCodeAt(0)&&(r[n[165][e]]=42240+e,t[42240+e]=n[165][e]);for(n[166]="����������������������������������������������������������������共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年����������������������������������式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣�".split(""),e=0;e!=n[166].length;++e)65533!==n[166][e].charCodeAt(0)&&(r[n[166][e]]=42496+e,t[42496+e]=n[166][e]);for(n[167]="����������������������������������������������������������������作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍����������������������������������均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠�".split(""),e=0;e!=n[167].length;++e)65533!==n[167][e].charCodeAt(0)&&(r[n[167][e]]=42752+e,t[42752+e]=n[167][e]);for(n[168]="����������������������������������������������������������������杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒����������������������������������芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵�".split(""),e=0;e!=n[168].length;++e)65533!==n[168][e].charCodeAt(0)&&(r[n[168][e]]=43008+e,t[43008+e]=n[168][e]);for(n[169]="����������������������������������������������������������������咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居����������������������������������屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊�".split(""),e=0;e!=n[169].length;++e)65533!==n[169][e].charCodeAt(0)&&(r[n[169][e]]=43264+e,t[43264+e]=n[169][e]);for(n[170]="����������������������������������������������������������������昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠����������������������������������炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附�".split(""),e=0;e!=n[170].length;++e)65533!==n[170][e].charCodeAt(0)&&(r[n[170][e]]=43520+e,t[43520+e]=n[170][e]);for(n[171]="����������������������������������������������������������������陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品����������������������������������哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷�".split(""),e=0;e!=n[171].length;++e)65533!==n[171][e].charCodeAt(0)&&(r[n[171][e]]=43776+e,t[43776+e]=n[171][e]);for(n[172]="����������������������������������������������������������������拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗����������������������������������活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄�".split(""),e=0;e!=n[172].length;++e)65533!==n[172][e].charCodeAt(0)&&(r[n[172][e]]=44032+e,t[44032+e]=n[172][e]);for(n[173]="����������������������������������������������������������������耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥����������������������������������迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪�".split(""),e=0;e!=n[173].length;++e)65533!==n[173][e].charCodeAt(0)&&(r[n[173][e]]=44288+e,t[44288+e]=n[173][e]);for(n[174]="����������������������������������������������������������������哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙����������������������������������恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓�".split(""),e=0;e!=n[174].length;++e)65533!==n[174][e].charCodeAt(0)&&(r[n[174][e]]=44544+e,t[44544+e]=n[174][e]);for(n[175]="����������������������������������������������������������������浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷����������������������������������砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃�".split(""),e=0;e!=n[175].length;++e)65533!==n[175][e].charCodeAt(0)&&(r[n[175][e]]=44800+e,t[44800+e]=n[175][e]);for(n[176]="����������������������������������������������������������������虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡����������������������������������陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀�".split(""),e=0;e!=n[176].length;++e)65533!==n[176][e].charCodeAt(0)&&(r[n[176][e]]=45056+e,t[45056+e]=n[176][e]);for(n[177]="����������������������������������������������������������������娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽����������������������������������情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺�".split(""),e=0;e!=n[177].length;++e)65533!==n[177][e].charCodeAt(0)&&(r[n[177][e]]=45312+e,t[45312+e]=n[177][e]);for(n[178]="����������������������������������������������������������������毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶����������������������������������瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼�".split(""),e=0;e!=n[178].length;++e)65533!==n[178][e].charCodeAt(0)&&(r[n[178][e]]=45568+e,t[45568+e]=n[178][e]);for(n[179]="����������������������������������������������������������������莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途����������������������������������部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠�".split(""),e=0;e!=n[179].length;++e)65533!==n[179][e].charCodeAt(0)&&(r[n[179][e]]=45824+e,t[45824+e]=n[179][e]);for(n[180]="����������������������������������������������������������������婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍����������������������������������插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋�".split(""),e=0;e!=n[180].length;++e)65533!==n[180][e].charCodeAt(0)&&(r[n[180][e]]=46080+e,t[46080+e]=n[180][e]);for(n[181]="����������������������������������������������������������������溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘����������������������������������窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁�".split(""),e=0;e!=n[181].length;++e)65533!==n[181][e].charCodeAt(0)&&(r[n[181][e]]=46336+e,t[46336+e]=n[181][e]);for(n[182]="����������������������������������������������������������������詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑����������������������������������間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼�".split(""),e=0;e!=n[182].length;++e)65533!==n[182][e].charCodeAt(0)&&(r[n[182][e]]=46592+e,t[46592+e]=n[182][e]);for(n[183]="����������������������������������������������������������������媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業����������������������������������楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督�".split(""),e=0;e!=n[183].length;++e)65533!==n[183][e].charCodeAt(0)&&(r[n[183][e]]=46848+e,t[46848+e]=n[183][e]);for(n[184]="����������������������������������������������������������������睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫����������������������������������腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊�".split(""),e=0;e!=n[184].length;++e)65533!==n[184][e].charCodeAt(0)&&(r[n[184][e]]=47104+e,t[47104+e]=n[184][e]);for(n[185]="����������������������������������������������������������������辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴����������������������������������飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇�".split(""),e=0;e!=n[185].length;++e)65533!==n[185][e].charCodeAt(0)&&(r[n[185][e]]=47360+e,t[47360+e]=n[185][e]);for(n[186]="����������������������������������������������������������������愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢����������������������������������滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬�".split(""),e=0;e!=n[186].length;++e)65533!==n[186][e].charCodeAt(0)&&(r[n[186][e]]=47616+e,t[47616+e]=n[186][e]);for(n[187]="����������������������������������������������������������������罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤����������������������������������說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜�".split(""),e=0;e!=n[187].length;++e)65533!==n[187][e].charCodeAt(0)&&(r[n[187][e]]=47872+e,t[47872+e]=n[187][e]);for(n[188]="����������������������������������������������������������������劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂����������������������������������慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃�".split(""),e=0;e!=n[188].length;++e)65533!==n[188][e].charCodeAt(0)&&(r[n[188][e]]=48128+e,t[48128+e]=n[188][e]);for(n[189]="����������������������������������������������������������������瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯����������������������������������翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞�".split(""),e=0;e!=n[189].length;++e)65533!==n[189][e].charCodeAt(0)&&(r[n[189][e]]=48384+e,t[48384+e]=n[189][e]);for(n[190]="����������������������������������������������������������������輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉����������������������������������鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡�".split(""),e=0;e!=n[190].length;++e)65533!==n[190][e].charCodeAt(0)&&(r[n[190][e]]=48640+e,t[48640+e]=n[190][e]);for(n[191]="����������������������������������������������������������������濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊����������������������������������縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚�".split(""),e=0;e!=n[191].length;++e)65533!==n[191][e].charCodeAt(0)&&(r[n[191][e]]=48896+e,t[48896+e]=n[191][e]);for(n[192]="����������������������������������������������������������������錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇����������������������������������嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬�".split(""),e=0;e!=n[192].length;++e)65533!==n[192][e].charCodeAt(0)&&(r[n[192][e]]=49152+e,t[49152+e]=n[192][e]);for(n[193]="����������������������������������������������������������������瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪����������������������������������薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁�".split(""),e=0;e!=n[193].length;++e)65533!==n[193][e].charCodeAt(0)&&(r[n[193][e]]=49408+e,t[49408+e]=n[193][e]);for(n[194]="����������������������������������������������������������������駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘����������������������������������癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦�".split(""),e=0;e!=n[194].length;++e)65533!==n[194][e].charCodeAt(0)&&(r[n[194][e]]=49664+e,t[49664+e]=n[194][e]);for(n[195]="����������������������������������������������������������������鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸����������������������������������獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類�".split(""),e=0;e!=n[195].length;++e)65533!==n[195][e].charCodeAt(0)&&(r[n[195][e]]=49920+e,t[49920+e]=n[195][e]);for(n[196]="����������������������������������������������������������������願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼����������������������������������纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴�".split(""),e=0;e!=n[196].length;++e)65533!==n[196][e].charCodeAt(0)&&(r[n[196][e]]=50176+e,t[50176+e]=n[196][e]);for(n[197]="����������������������������������������������������������������護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬����������������������������������禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒�".split(""),e=0;e!=n[197].length;++e)65533!==n[197][e].charCodeAt(0)&&(r[n[197][e]]=50432+e,t[50432+e]=n[197][e]);for(n[198]="����������������������������������������������������������������讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲���������������������������������������������������������������������������������������������������������������������������������".split(""),e=0;e!=n[198].length;++e)65533!==n[198][e].charCodeAt(0)&&(r[n[198][e]]=50688+e,t[50688+e]=n[198][e]);for(n[201]="����������������������������������������������������������������乂乜凵匚厂万丌乇亍囗兀屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕����������������������������������氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋�".split(""),e=0;e!=n[201].length;++e)65533!==n[201][e].charCodeAt(0)&&(r[n[201][e]]=51456+e,t[51456+e]=n[201][e]);for(n[202]="����������������������������������������������������������������汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘����������������������������������吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇�".split(""),e=0;e!=n[202].length;++e)65533!==n[202][e].charCodeAt(0)&&(r[n[202][e]]=51712+e,t[51712+e]=n[202][e]);for(n[203]="����������������������������������������������������������������杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓����������������������������������芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢�".split(""),e=0;e!=n[203].length;++e)65533!==n[203][e].charCodeAt(0)&&(r[n[203][e]]=51968+e,t[51968+e]=n[203][e]);for(n[204]="����������������������������������������������������������������坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋����������������������������������怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲�".split(""),e=0;e!=n[204].length;++e)65533!==n[204][e].charCodeAt(0)&&(r[n[204][e]]=52224+e,t[52224+e]=n[204][e]);for(n[205]="����������������������������������������������������������������泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺����������������������������������矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏�".split(""),e=0;e!=n[205].length;++e)65533!==n[205][e].charCodeAt(0)&&(r[n[205][e]]=52480+e,t[52480+e]=n[205][e]);for(n[206]="����������������������������������������������������������������哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛����������������������������������峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺�".split(""),e=0;e!=n[206].length;++e)65533!==n[206][e].charCodeAt(0)&&(r[n[206][e]]=52736+e,t[52736+e]=n[206][e]);for(n[207]="����������������������������������������������������������������柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂����������������������������������洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀�".split(""),e=0;e!=n[207].length;++e)65533!==n[207][e].charCodeAt(0)&&(r[n[207][e]]=52992+e,t[52992+e]=n[207][e]);for(n[208]="����������������������������������������������������������������穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪����������������������������������苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱�".split(""),e=0;e!=n[208].length;++e)65533!==n[208][e].charCodeAt(0)&&(r[n[208][e]]=53248+e,t[53248+e]=n[208][e]);for(n[209]="����������������������������������������������������������������唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧����������������������������������恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤�".split(""),e=0;e!=n[209].length;++e)65533!==n[209][e].charCodeAt(0)&&(r[n[209][e]]=53504+e,t[53504+e]=n[209][e]);for(n[210]="����������������������������������������������������������������毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸����������������������������������牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐�".split(""),e=0;e!=n[210].length;++e)65533!==n[210][e].charCodeAt(0)&&(r[n[210][e]]=53760+e,t[53760+e]=n[210][e]);for(n[211]="����������������������������������������������������������������笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢����������������������������������荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐�".split(""),e=0;e!=n[211].length;++e)65533!==n[211][e].charCodeAt(0)&&(r[n[211][e]]=54016+e,t[54016+e]=n[211][e]);for(n[212]="����������������������������������������������������������������酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅����������������������������������唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏�".split(""),e=0;e!=n[212].length;++e)65533!==n[212][e].charCodeAt(0)&&(r[n[212][e]]=54272+e,t[54272+e]=n[212][e]);for(n[213]="����������������������������������������������������������������崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟����������������������������������捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉�".split(""),e=0;e!=n[213].length;++e)65533!==n[213][e].charCodeAt(0)&&(r[n[213][e]]=54528+e,t[54528+e]=n[213][e]);for(n[214]="����������������������������������������������������������������淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏����������������������������������痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟�".split(""),e=0;e!=n[214].length;++e)65533!==n[214][e].charCodeAt(0)&&(r[n[214][e]]=54784+e,t[54784+e]=n[214][e]);for(n[215]="����������������������������������������������������������������耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷����������������������������������蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪�".split(""),e=0;e!=n[215].length;++e)65533!==n[215][e].charCodeAt(0)&&(r[n[215][e]]=55040+e,t[55040+e]=n[215][e]);for(n[216]="����������������������������������������������������������������釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷����������������������������������堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔�".split(""),e=0;e!=n[216].length;++e)65533!==n[216][e].charCodeAt(0)&&(r[n[216][e]]=55296+e,t[55296+e]=n[216][e]);for(n[217]="����������������������������������������������������������������惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒����������������������������������晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞�".split(""),e=0;e!=n[217].length;++e)65533!==n[217][e].charCodeAt(0)&&(r[n[217][e]]=55552+e,t[55552+e]=n[217][e]);for(n[218]="����������������������������������������������������������������湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖����������������������������������琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥�".split(""),e=0;e!=n[218].length;++e)65533!==n[218][e].charCodeAt(0)&&(r[n[218][e]]=55808+e,t[55808+e]=n[218][e]);for(n[219]="����������������������������������������������������������������罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳����������������������������������菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺�".split(""),e=0;e!=n[219].length;++e)65533!==n[219][e].charCodeAt(0)&&(r[n[219][e]]=56064+e,t[56064+e]=n[219][e]);for(n[220]="����������������������������������������������������������������軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈����������������������������������隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆�".split(""),e=0;e!=n[220].length;++e)65533!==n[220][e].charCodeAt(0)&&(r[n[220][e]]=56320+e,t[56320+e]=n[220][e]);for(n[221]="����������������������������������������������������������������媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤����������������������������������搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛嗀毻毼�".split(""),e=0;e!=n[221].length;++e)65533!==n[221][e].charCodeAt(0)&&(r[n[221][e]]=56576+e,t[56576+e]=n[221][e]);for(n[222]="����������������������������������������������������������������毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓����������������������������������煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓�".split(""),e=0;e!=n[222].length;++e)65533!==n[222][e].charCodeAt(0)&&(r[n[222][e]]=56832+e,t[56832+e]=n[222][e]);for(n[223]="����������������������������������������������������������������稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯����������������������������������腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤�".split(""),e=0;e!=n[223].length;++e)65533!==n[223][e].charCodeAt(0)&&(r[n[223][e]]=57088+e,t[57088+e]=n[223][e]);for(n[224]="����������������������������������������������������������������觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿����������������������������������遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠�".split(""),e=0;e!=n[224].length;++e)65533!==n[224][e].charCodeAt(0)&&(r[n[224][e]]=57344+e,t[57344+e]=n[224][e]);for(n[225]="����������������������������������������������������������������凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠����������������������������������寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉�".split(""),e=0;e!=n[225].length;++e)65533!==n[225][e].charCodeAt(0)&&(r[n[225][e]]=57600+e,t[57600+e]=n[225][e]);for(n[226]="����������������������������������������������������������������榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊����������������������������������漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓�".split(""),e=0;e!=n[226].length;++e)65533!==n[226][e].charCodeAt(0)&&(r[n[226][e]]=57856+e,t[57856+e]=n[226][e]);for(n[227]="����������������������������������������������������������������禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞����������������������������������耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻�".split(""),e=0;e!=n[227].length;++e)65533!==n[227][e].charCodeAt(0)&&(r[n[227][e]]=58112+e,t[58112+e]=n[227][e]);for(n[228]="����������������������������������������������������������������裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍����������������������������������銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘�".split(""),e=0;e!=n[228].length;++e)65533!==n[228][e].charCodeAt(0)&&(r[n[228][e]]=58368+e,t[58368+e]=n[228][e]);for(n[229]="����������������������������������������������������������������噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉����������������������������������憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒�".split(""),e=0;e!=n[229].length;++e)65533!==n[229][e].charCodeAt(0)&&(r[n[229][e]]=58624+e,t[58624+e]=n[229][e]);for(n[230]="����������������������������������������������������������������澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙����������������������������������獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟�".split(""),e=0;e!=n[230].length;++e)65533!==n[230][e].charCodeAt(0)&&(r[n[230][e]]=58880+e,t[58880+e]=n[230][e]);for(n[231]="����������������������������������������������������������������膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢����������������������������������蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧�".split(""),e=0;e!=n[231].length;++e)65533!==n[231][e].charCodeAt(0)&&(r[n[231][e]]=59136+e,t[59136+e]=n[231][e]);for(n[232]="����������������������������������������������������������������踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓����������������������������������銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮�".split(""),e=0;e!=n[232].length;++e)65533!==n[232][e].charCodeAt(0)&&(r[n[232][e]]=59392+e,t[59392+e]=n[232][e]);for(n[233]="����������������������������������������������������������������噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺����������������������������������憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸�".split(""),e=0;e!=n[233].length;++e)65533!==n[233][e].charCodeAt(0)&&(r[n[233][e]]=59648+e,t[59648+e]=n[233][e]);for(n[234]="����������������������������������������������������������������澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙����������������������������������瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘�".split(""),e=0;e!=n[234].length;++e)65533!==n[234][e].charCodeAt(0)&&(r[n[234][e]]=59904+e,t[59904+e]=n[234][e]);for(n[235]="����������������������������������������������������������������蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠����������������������������������諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌�".split(""),e=0;e!=n[235].length;++e)65533!==n[235][e].charCodeAt(0)&&(r[n[235][e]]=60160+e,t[60160+e]=n[235][e]);for(n[236]="����������������������������������������������������������������錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕����������������������������������魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎�".split(""),e=0;e!=n[236].length;++e)65533!==n[236][e].charCodeAt(0)&&(r[n[236][e]]=60416+e,t[60416+e]=n[236][e]);for(n[237]="����������������������������������������������������������������檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶����������������������������������瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞�".split(""),e=0;e!=n[237].length;++e)65533!==n[237][e].charCodeAt(0)&&(r[n[237][e]]=60672+e,t[60672+e]=n[237][e]);for(n[238]="����������������������������������������������������������������蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞����������������������������������謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜�".split(""),e=0;e!=n[238].length;++e)65533!==n[238][e].charCodeAt(0)&&(r[n[238][e]]=60928+e,t[60928+e]=n[238][e]);for(n[239]="����������������������������������������������������������������鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰����������������������������������鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶�".split(""),e=0;e!=n[239].length;++e)65533!==n[239][e].charCodeAt(0)&&(r[n[239][e]]=61184+e,t[61184+e]=n[239][e]);for(n[240]="����������������������������������������������������������������璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒����������������������������������臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧�".split(""),e=0;e!=n[240].length;++e)65533!==n[240][e].charCodeAt(0)&&(r[n[240][e]]=61440+e,t[61440+e]=n[240][e]);for(n[241]="����������������������������������������������������������������蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪����������������������������������鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰�".split(""),e=0;e!=n[241].length;++e)65533!==n[241][e].charCodeAt(0)&&(r[n[241][e]]=61696+e,t[61696+e]=n[241][e]);for(n[242]="����������������������������������������������������������������徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛����������������������������������礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕�".split(""),e=0;e!=n[242].length;++e)65533!==n[242][e].charCodeAt(0)&&(r[n[242][e]]=61952+e,t[61952+e]=n[242][e]);for(n[243]="����������������������������������������������������������������譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦����������������������������������鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲�".split(""),e=0;e!=n[243].length;++e)65533!==n[243][e].charCodeAt(0)&&(r[n[243][e]]=62208+e,t[62208+e]=n[243][e]);for(n[244]="����������������������������������������������������������������嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩����������������������������������禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿�".split(""),e=0;e!=n[244].length;++e)65533!==n[244][e].charCodeAt(0)&&(r[n[244][e]]=62464+e,t[62464+e]=n[244][e]);for(n[245]="����������������������������������������������������������������鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛����������������������������������鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥�".split(""),e=0;e!=n[245].length;++e)65533!==n[245][e].charCodeAt(0)&&(r[n[245][e]]=62720+e,t[62720+e]=n[245][e]);for(n[246]="����������������������������������������������������������������蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺����������������������������������騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚�".split(""),e=0;e!=n[246].length;++e)65533!==n[246][e].charCodeAt(0)&&(r[n[246][e]]=62976+e,t[62976+e]=n[246][e]);for(n[247]="����������������������������������������������������������������糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊����������������������������������驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾�".split(""),e=0;e!=n[247].length;++e)65533!==n[247][e].charCodeAt(0)&&(r[n[247][e]]=63232+e,t[63232+e]=n[247][e]);for(n[248]="����������������������������������������������������������������讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏����������������������������������齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚�".split(""),e=0;e!=n[248].length;++e)65533!==n[248][e].charCodeAt(0)&&(r[n[248][e]]=63488+e,t[63488+e]=n[248][e]);for(n[249]="����������������������������������������������������������������纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊����������������������������������龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯▓�".split(""),e=0;e!=n[249].length;++e)65533!==n[249][e].charCodeAt(0)&&(r[n[249][e]]=63744+e,t[63744+e]=n[249][e]);return{enc:r,dec:t}}(),t[1250]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“”•–—�™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[1251]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[1252]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[1253]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[1254]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“”•–—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[1255]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰�‹�����‘’“”•–—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹ�ֻּֽ־ֿ׀ׁׂ׃װױײ׳״�������אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[1256]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[1257]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[1258]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“”•–—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖרÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[1e4]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[10006]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦­ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ�",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[10007]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[10008]=function(){var e,t=[],r={},n=[];for(n[0]="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€���������������������������������������������������������������������������������������".split(""),e=0;e!=n[0].length;++e)65533!==n[0][e].charCodeAt(0)&&(r[n[0][e]]=0+e,t[0+e]=n[0][e]);for(n[161]="����������������������������������������������������������������������������������������������������������������������������������������������������������������� 、。・ˉˇ¨〃々―~�…‘’“”〔〕〈〉《》「」『』〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓�".split(""),e=0;e!=n[161].length;++e)65533!==n[161][e].charCodeAt(0)&&(r[n[161][e]]=41216+e,t[41216+e]=n[161][e]);for(n[162]="���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩��㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩��ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ���".split(""),e=0;e!=n[162].length;++e)65533!==n[162][e].charCodeAt(0)&&(r[n[162][e]]=41472+e,t[41472+e]=n[162][e]);for(n[163]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������!"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�".split(""),e=0;e!=n[163].length;++e)65533!==n[163][e].charCodeAt(0)&&(r[n[163][e]]=41728+e,t[41728+e]=n[163][e]);for(n[164]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������".split(""),e=0;e!=n[164].length;++e)65533!==n[164][e].charCodeAt(0)&&(r[n[164][e]]=41984+e,t[41984+e]=n[164][e]);for(n[165]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������".split(""),e=0;e!=n[165].length;++e)65533!==n[165][e].charCodeAt(0)&&(r[n[165][e]]=42240+e,t[42240+e]=n[165][e]);for(n[166]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω���������������������������������������".split(""),e=0;e!=n[166].length;++e)65533!==n[166][e].charCodeAt(0)&&(r[n[166][e]]=42496+e,t[42496+e]=n[166][e]);for(n[167]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������".split(""),e=0;e!=n[167].length;++e)65533!==n[167][e].charCodeAt(0)&&(r[n[167][e]]=42752+e,t[42752+e]=n[167][e]);for(n[168]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüê����������ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ����������������������".split(""),e=0;e!=n[168].length;++e)65533!==n[168][e].charCodeAt(0)&&(r[n[168][e]]=43008+e,t[43008+e]=n[168][e]);for(n[169]="��������������������������������������������������������������������������������������������������������������������������������������������������������������������─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋����������������".split(""),e=0;e!=n[169].length;++e)65533!==n[169][e].charCodeAt(0)&&(r[n[169][e]]=43264+e,t[43264+e]=n[169][e]);for(n[176]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥�".split(""),e=0;e!=n[176].length;++e)65533!==n[176][e].charCodeAt(0)&&(r[n[176][e]]=45056+e,t[45056+e]=n[176][e]);for(n[177]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳�".split(""),e=0;e!=n[177].length;++e)65533!==n[177][e].charCodeAt(0)&&(r[n[177][e]]=45312+e,t[45312+e]=n[177][e]);for(n[178]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖�".split(""),e=0;e!=n[178].length;++e)65533!==n[178][e].charCodeAt(0)&&(r[n[178][e]]=45568+e,t[45568+e]=n[178][e]);for(n[179]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚�".split(""),e=0;e!=n[179].length;++e)65533!==n[179][e].charCodeAt(0)&&(r[n[179][e]]=45824+e,t[45824+e]=n[179][e]);for(n[180]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮�".split(""),e=0;e!=n[180].length;++e)65533!==n[180][e].charCodeAt(0)&&(r[n[180][e]]=46080+e,t[46080+e]=n[180][e]);for(n[181]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠�".split(""),e=0;e!=n[181].length;++e)65533!==n[181][e].charCodeAt(0)&&(r[n[181][e]]=46336+e,t[46336+e]=n[181][e]);for(n[182]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二�".split(""),e=0;e!=n[182].length;++e)65533!==n[182][e].charCodeAt(0)&&(r[n[182][e]]=46592+e,t[46592+e]=n[182][e]);for(n[183]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服�".split(""),e=0;e!=n[183].length;++e)65533!==n[183][e].charCodeAt(0)&&(r[n[183][e]]=46848+e,t[46848+e]=n[183][e]);for(n[184]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹�".split(""),e=0;e!=n[184].length;++e)65533!==n[184][e].charCodeAt(0)&&(r[n[184][e]]=47104+e,t[47104+e]=n[184][e]);for(n[185]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈�".split(""),e=0;e!=n[185].length;++e)65533!==n[185][e].charCodeAt(0)&&(r[n[185][e]]=47360+e,t[47360+e]=n[185][e]);for(n[186]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖�".split(""),e=0;e!=n[186].length;++e)65533!==n[186][e].charCodeAt(0)&&(r[n[186][e]]=47616+e,t[47616+e]=n[186][e]);for(n[187]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕�".split(""),e=0;e!=n[187].length;++e)65533!==n[187][e].charCodeAt(0)&&(r[n[187][e]]=47872+e,t[47872+e]=n[187][e]);for(n[188]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件�".split(""),e=0;e!=n[188].length;++e)65533!==n[188][e].charCodeAt(0)&&(r[n[188][e]]=48128+e,t[48128+e]=n[188][e]);for(n[189]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸�".split(""),e=0;e!=n[189].length;++e)65533!==n[189][e].charCodeAt(0)&&(r[n[189][e]]=48384+e,t[48384+e]=n[189][e]);for(n[190]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻�".split(""),e=0;e!=n[190].length;++e)65533!==n[190][e].charCodeAt(0)&&(r[n[190][e]]=48640+e,t[48640+e]=n[190][e]);for(n[191]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀�".split(""),e=0;e!=n[191].length;++e)65533!==n[191][e].charCodeAt(0)&&(r[n[191][e]]=48896+e,t[48896+e]=n[191][e]);for(n[192]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐�".split(""),e=0;e!=n[192].length;++e)65533!==n[192][e].charCodeAt(0)&&(r[n[192][e]]=49152+e,t[49152+e]=n[192][e]);for(n[193]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿�".split(""),e=0;e!=n[193].length;++e)65533!==n[193][e].charCodeAt(0)&&(r[n[193][e]]=49408+e,t[49408+e]=n[193][e]);for(n[194]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫�".split(""),e=0;e!=n[194].length;++e)65533!==n[194][e].charCodeAt(0)&&(r[n[194][e]]=49664+e,t[49664+e]=n[194][e]);for(n[195]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸�".split(""),e=0;e!=n[195].length;++e)65533!==n[195][e].charCodeAt(0)&&(r[n[195][e]]=49920+e,t[49920+e]=n[195][e]);for(n[196]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁�".split(""),e=0;e!=n[196].length;++e)65533!==n[196][e].charCodeAt(0)&&(r[n[196][e]]=50176+e,t[50176+e]=n[196][e]);for(n[197]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗�".split(""),e=0;e!=n[197].length;++e)65533!==n[197][e].charCodeAt(0)&&(r[n[197][e]]=50432+e,t[50432+e]=n[197][e]);for(n[198]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐�".split(""),e=0;e!=n[198].length;++e)65533!==n[198][e].charCodeAt(0)&&(r[n[198][e]]=50688+e,t[50688+e]=n[198][e]);for(n[199]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠�".split(""),e=0;e!=n[199].length;++e)65533!==n[199][e].charCodeAt(0)&&(r[n[199][e]]=50944+e,t[50944+e]=n[199][e]);for(n[200]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁�".split(""),e=0;e!=n[200].length;++e)65533!==n[200][e].charCodeAt(0)&&(r[n[200][e]]=51200+e,t[51200+e]=n[200][e]);for(n[201]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳�".split(""),e=0;e!=n[201].length;++e)65533!==n[201][e].charCodeAt(0)&&(r[n[201][e]]=51456+e,t[51456+e]=n[201][e]);for(n[202]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱�".split(""),e=0;e!=n[202].length;++e)65533!==n[202][e].charCodeAt(0)&&(r[n[202][e]]=51712+e,t[51712+e]=n[202][e]);for(n[203]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔�".split(""),e=0;e!=n[203].length;++e)65533!==n[203][e].charCodeAt(0)&&(r[n[203][e]]=51968+e,t[51968+e]=n[203][e]);for(n[204]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃�".split(""),e=0;e!=n[204].length;++e)65533!==n[204][e].charCodeAt(0)&&(r[n[204][e]]=52224+e,t[52224+e]=n[204][e]);for(n[205]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威�".split(""),e=0;e!=n[205].length;++e)65533!==n[205][e].charCodeAt(0)&&(r[n[205][e]]=52480+e,t[52480+e]=n[205][e]);for(n[206]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺�".split(""),e=0;e!=n[206].length;++e)65533!==n[206][e].charCodeAt(0)&&(r[n[206][e]]=52736+e,t[52736+e]=n[206][e]);for(n[207]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓�".split(""),e=0;e!=n[207].length;++e)65533!==n[207][e].charCodeAt(0)&&(r[n[207][e]]=52992+e,t[52992+e]=n[207][e]);for(n[208]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄�".split(""),e=0;e!=n[208].length;++e)65533!==n[208][e].charCodeAt(0)&&(r[n[208][e]]=53248+e,t[53248+e]=n[208][e]);for(n[209]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶�".split(""),e=0;e!=n[209].length;++e)65533!==n[209][e].charCodeAt(0)&&(r[n[209][e]]=53504+e,t[53504+e]=n[209][e]);for(n[210]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐�".split(""),e=0;e!=n[210].length;++e)65533!==n[210][e].charCodeAt(0)&&(r[n[210][e]]=53760+e,t[53760+e]=n[210][e]);for(n[211]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉�".split(""),e=0;e!=n[211].length;++e)65533!==n[211][e].charCodeAt(0)&&(r[n[211][e]]=54016+e,t[54016+e]=n[211][e]);for(n[212]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧�".split(""),e=0;e!=n[212].length;++e)65533!==n[212][e].charCodeAt(0)&&(r[n[212][e]]=54272+e,t[54272+e]=n[212][e]);for(n[213]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政�".split(""),e=0;e!=n[213].length;++e)65533!==n[213][e].charCodeAt(0)&&(r[n[213][e]]=54528+e,t[54528+e]=n[213][e]);for(n[214]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑�".split(""),e=0;e!=n[214].length;++e)65533!==n[214][e].charCodeAt(0)&&(r[n[214][e]]=54784+e,t[54784+e]=n[214][e]);for(n[215]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座������".split(""),e=0;e!=n[215].length;++e)65533!==n[215][e].charCodeAt(0)&&(r[n[215][e]]=55040+e,t[55040+e]=n[215][e]);for(n[216]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝�".split(""),e=0;e!=n[216].length;++e)65533!==n[216][e].charCodeAt(0)&&(r[n[216][e]]=55296+e,t[55296+e]=n[216][e]);for(n[217]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼�".split(""),e=0;e!=n[217].length;++e)65533!==n[217][e].charCodeAt(0)&&(r[n[217][e]]=55552+e,t[55552+e]=n[217][e]);for(n[218]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺�".split(""),e=0;e!=n[218].length;++e)65533!==n[218][e].charCodeAt(0)&&(r[n[218][e]]=55808+e,t[55808+e]=n[218][e]);for(n[219]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝�".split(""),e=0;e!=n[219].length;++e)65533!==n[219][e].charCodeAt(0)&&(r[n[219][e]]=56064+e,t[56064+e]=n[219][e]);for(n[220]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥�".split(""),e=0;e!=n[220].length;++e)65533!==n[220][e].charCodeAt(0)&&(r[n[220][e]]=56320+e,t[56320+e]=n[220][e]);for(n[221]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺�".split(""),e=0;e!=n[221].length;++e)65533!==n[221][e].charCodeAt(0)&&(r[n[221][e]]=56576+e,t[56576+e]=n[221][e]);for(n[222]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖�".split(""),e=0;e!=n[222].length;++e)65533!==n[222][e].charCodeAt(0)&&(r[n[222][e]]=56832+e,t[56832+e]=n[222][e]);for(n[223]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼�".split(""),e=0;e!=n[223].length;++e)65533!==n[223][e].charCodeAt(0)&&(r[n[223][e]]=57088+e,t[57088+e]=n[223][e]);for(n[224]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼�".split(""),e=0;e!=n[224].length;++e)65533!==n[224][e].charCodeAt(0)&&(r[n[224][e]]=57344+e,t[57344+e]=n[224][e]);for(n[225]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺�".split(""),e=0;e!=n[225].length;++e)65533!==n[225][e].charCodeAt(0)&&(r[n[225][e]]=57600+e,t[57600+e]=n[225][e]);for(n[226]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂�".split(""),e=0;e!=n[226].length;++e)65533!==n[226][e].charCodeAt(0)&&(r[n[226][e]]=57856+e,t[57856+e]=n[226][e]);for(n[227]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾�".split(""),e=0;e!=n[227].length;++e)65533!==n[227][e].charCodeAt(0)&&(r[n[227][e]]=58112+e,t[58112+e]=n[227][e]);for(n[228]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑�".split(""),e=0;e!=n[228].length;++e)65533!==n[228][e].charCodeAt(0)&&(r[n[228][e]]=58368+e,t[58368+e]=n[228][e]);for(n[229]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣�".split(""),e=0;e!=n[229].length;++e)65533!==n[229][e].charCodeAt(0)&&(r[n[229][e]]=58624+e,t[58624+e]=n[229][e]);for(n[230]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩�".split(""),e=0;e!=n[230].length;++e)65533!==n[230][e].charCodeAt(0)&&(r[n[230][e]]=58880+e,t[58880+e]=n[230][e]);for(n[231]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬�".split(""),e=0;e!=n[231].length;++e)65533!==n[231][e].charCodeAt(0)&&(r[n[231][e]]=59136+e,t[59136+e]=n[231][e]);for(n[232]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹�".split(""),e=0;e!=n[232].length;++e)65533!==n[232][e].charCodeAt(0)&&(r[n[232][e]]=59392+e,t[59392+e]=n[232][e]);for(n[233]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋�".split(""),e=0;e!=n[233].length;++e)65533!==n[233][e].charCodeAt(0)&&(r[n[233][e]]=59648+e,t[59648+e]=n[233][e]);for(n[234]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰�".split(""),e=0;e!=n[234].length;++e)65533!==n[234][e].charCodeAt(0)&&(r[n[234][e]]=59904+e,t[59904+e]=n[234][e]);for(n[235]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻�".split(""),e=0;e!=n[235].length;++e)65533!==n[235][e].charCodeAt(0)&&(r[n[235][e]]=60160+e,t[60160+e]=n[235][e]);for(n[236]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐�".split(""),e=0;e!=n[236].length;++e)65533!==n[236][e].charCodeAt(0)&&(r[n[236][e]]=60416+e,t[60416+e]=n[236][e]);for(n[237]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨�".split(""),e=0;e!=n[237].length;++e)65533!==n[237][e].charCodeAt(0)&&(r[n[237][e]]=60672+e,t[60672+e]=n[237][e]);for(n[238]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪�".split(""),e=0;e!=n[238].length;++e)65533!==n[238][e].charCodeAt(0)&&(r[n[238][e]]=60928+e,t[60928+e]=n[238][e]);for(n[239]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔�".split(""),e=0;e!=n[239].length;++e)65533!==n[239][e].charCodeAt(0)&&(r[n[239][e]]=61184+e,t[61184+e]=n[239][e]);for(n[240]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙�".split(""),e=0;e!=n[240].length;++e)65533!==n[240][e].charCodeAt(0)&&(r[n[240][e]]=61440+e,t[61440+e]=n[240][e]);for(n[241]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃�".split(""),e=0;e!=n[241].length;++e)65533!==n[241][e].charCodeAt(0)&&(r[n[241][e]]=61696+e,t[61696+e]=n[241][e]);for(n[242]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒�".split(""),e=0;e!=n[242].length;++e)65533!==n[242][e].charCodeAt(0)&&(r[n[242][e]]=61952+e,t[61952+e]=n[242][e]);for(n[243]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋�".split(""),e=0;e!=n[243].length;++e)65533!==n[243][e].charCodeAt(0)&&(r[n[243][e]]=62208+e,t[62208+e]=n[243][e]);for(n[244]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤�".split(""),e=0;e!=n[244].length;++e)65533!==n[244][e].charCodeAt(0)&&(r[n[244][e]]=62464+e,t[62464+e]=n[244][e]);for(n[245]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜�".split(""),e=0;e!=n[245].length;++e)65533!==n[245][e].charCodeAt(0)&&(r[n[245][e]]=62720+e,t[62720+e]=n[245][e]);for(n[246]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋�".split(""),e=0;e!=n[246].length;++e)65533!==n[246][e].charCodeAt(0)&&(r[n[246][e]]=62976+e,t[62976+e]=n[246][e]);for(n[247]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄�".split(""),e=0;e!=n[247].length;++e)65533!==n[247][e].charCodeAt(0)&&(r[n[247][e]]=63232+e,t[63232+e]=n[247][e]);return{enc:r,dec:t}}(),t[10029]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[10079]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüݰ¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[10081]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸˝˛ˇ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[28591]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),e.exports&&"undefined"==typeof DO_NOT_EXPORT_CODEPAGE&&(e.exports=t),function(r,n){"use strict";if(void 0===t){var a=t;e.exports&&"undefined"==typeof DO_NOT_EXPORT_CODEPAGE?e.exports=n(a):r.cptable=n(a)}else t=n(t)}(this,function(e){"use strict";var t={1200:"utf16le",1201:"utf16be",12e3:"utf32le",12001:"utf32be",16969:"utf64le",20127:"ascii",65e3:"utf7",65001:"utf8"},r=[874,1250,1251,1252,1253,1254,1255,1256,1e4],n=[932,936,949,950],a=[65001],s={},i={},o={},l={},c=function(e){return String.fromCharCode(e)},f=function(e){return e.charCodeAt(0)},h="undefined"!=typeof Buffer,u=function(){};if(h){var d=!Buffer.from;if(!d)try{Buffer.from("foo","utf8")}catch(e){d=!0}u=d?function(e,t){return t?new Buffer(e,t):new Buffer(e)}:Buffer.from.bind(Buffer),Buffer.allocUnsafe||(Buffer.allocUnsafe=function(e){return new Buffer(e)});var p=1024,g=Buffer.allocUnsafe(p),m=function(t){var r=function(e){for(var t=Buffer.allocUnsafe(65536),r=0;r<65536;++r)t[r]=0;for(var n=Object.keys(e),a=n.length,s=0,i=n[s];s>10&1023)],n[i++]=r[56320+(1023&l)]));n=n.slice(0,i)}else for(n=Buffer.allocUnsafe(a),s=0;s>8}return function(e){var t=e.length,r=0,a=0;if(2*t>p&&(p=2*t,g=Buffer.allocUnsafe(p)),Buffer.isBuffer(e))for(r=0;r>8}return function(e,t){var r=e.length,a=Buffer.allocUnsafe(2*r),s=0,i=0,o=0,l=0,c=0;if("string"==typeof e){for(s=l=0;s0&&(a[l++]=n[i]);a=a.slice(0,l)}else if(Buffer.isBuffer(e)){for(s=l=0;s0&&(a[l++]=n[i])):(i=2*(55296+((o=i-65536)>>10&1023)),a[l++]=n[i+1]||n[i],n[i+1]>0&&(a[l++]=n[i]),i=2*(56320+(1023&o)),a[l++]=n[i+1]||n[i],n[i+1]>0&&(a[l++]=n[i]));a=a.slice(0,l)}else for(s=l=0;s0&&(a[l++]=n[i]);return t&&"buf"!==t?"arr"!==t?a.toString("binary"):[].slice.call(a):a}},w=function(t){var r,n=e[t].dec,a=Buffer.allocUnsafe(131072),s=0,i=0,o=0,l=0;for(l=0;l<65536;++l)a[2*l]=255,a[2*l+1]=253;for(s=0;s>8);return function(e){var t=e.length,r=Buffer.allocUnsafe(2*t),n=0,s=0,i=0;if(Buffer.isBuffer(e))for(n=0;np&&(p=4*r,g=Buffer.allocUnsafe(p));var s=0;r>=3&&239==t[0]&&187==t[1]&&191==t[2]&&(s=3);for(var i=1,o=0,l=0;s>8):(a=55296+((n-=65536)>>10&1023),n=56320+(1023&n),g[o++]=255&a,g[o++]=a>>>8,g[o++]=255&n,g[o++]=n>>>8&255);return g.slice(0,o).toString("ucs2")},i[65001]=function(e,t){if(h&&Buffer.isBuffer(e))return t&&"buf"!==t?"arr"!==t?e.toString("binary"):[].slice.call(e):e;var r=e.length,n=0,a=0,s=0,i="string"==typeof e;4*r>p&&(p=4*r,g=Buffer.allocUnsafe(p));for(var o=0;o>6),g[s++]=128+(63&n)):n>=55296&&n<=57343?(n-=55296,++o,a=(i?e.charCodeAt(o):e[o].charCodeAt(0))-56320+(n<<10),g[s++]=240+(a>>>18&7),g[s++]=144+(a>>>12&63),g[s++]=128+(a>>>6&63),g[s++]=128+(63&a)):(g[s++]=224+(n>>12),g[s++]=128+(n>>6&63),g[s++]=128+(63&n));return t&&"buf"!==t?"arr"!==t?g.slice(0,s).toString("binary"):[].slice.call(g,0,s):g.slice(0,s)}}var C=function(){if(h){if(o[r[0]])return;var t=0,c=0;for(t=0;t=3&&239==a[0]&&187==a[1]&&191==a[2]&&(p=3);p>10&1023),d=56320+(1023&d),c[m++]=String.fromCharCode(v)),c[m++]=String.fromCharCode(d);break;case"ascii":if(h&&Buffer.isBuffer(a))return a.toString(w);for(p=0;p=2&&255==a[0]&&254==a[1]&&(p=2),h&&Buffer.isBuffer(a))return a.toString(w);for(g=2;p+1=2&&254==a[0]&&255==a[1]&&(p=2),g=2;p+1=4&&255==a[0]&&254==a[1]&&0===a[2]&&0===a[3]&&(p=4),g=4;p65535?(d-=65536,c[m++]=String.fromCharCode(55296+(d>>10&1023)),c[m++]=String.fromCharCode(56320+(1023&d))):c[m++]=String.fromCharCode(d);break;case"utf32be":for(l>=4&&255==a[3]&&254==a[2]&&0===a[1]&&0===a[0]&&(p=4),g=4;p65535?(d-=65536,c[m++]=String.fromCharCode(55296+(d>>10&1023)),c[m++]=String.fromCharCode(56320+(1023&d))):c[m++]=String.fromCharCode(d);break;case"utf7":for(l>=4&&43==a[0]&&47==a[1]&&118==a[2]&&(l>=5&&56==a[3]&&45==a[4]?p=5:56!=a[3]&&57!=a[3]&&43!=a[3]&&47!=a[3]||(p=4));p>4,E.push(_),-1!==(y=A.indexOf(String.fromCharCode(a[p+I++]))))&&(B=(15&k)<<4|y>>2,E.push(B),-1!==(x=A.indexOf(String.fromCharCode(a[p+I++]))));)T=(3&y)<<6|x,x<64&&E.push(T);for(S=r(1201,E),I=0;I255?(f[g]=d>>8,f[++g]=255&d):f[g]=255&d;else{if(!(b=t[n]))throw new Error("Unrecognized CP: "+n);switch(b){case"utf8":if(h&&w){g=(f=u(a,b)).length;break}for(p=0;p>6),f[++g]=128+(63&d)):d>=55296&&d<=57343?(d-=55296,m=(w?a.charCodeAt(++p):a[++p].charCodeAt(0))-56320+(d<<10),f[g]=240+(m>>>18&7),f[++g]=144+(m>>>12&63),f[++g]=128+(m>>>6&63),f[++g]=128+(63&m)):(f[g]=224+(d>>12),f[++g]=128+(d>>6&63),f[++g]=128+(63&d));break;case"ascii":if(h&&"string"==typeof a){g=(f=u(a,b)).length;break}for(p=0;p>8;break;case"utf16be":for(p=0;p>8,f[g++]=255&d;break;case"utf32le":for(p=0;p=55296&&d<=57343&&(d=65536+(d-55296<<10)+(a[++p].charCodeAt(0)-56320)),f[g++]=255&d,d>>=8,f[g++]=255&d,d>>=8,f[g++]=255&d,d>>=8,f[g++]=255&d;break;case"utf32be":for(p=0;p=55296&&d<=57343&&(d=65536+(d-55296<<10)+(a[++p].charCodeAt(0)-56320)),f[g+3]=255&d,d>>=8,f[g+2]=255&d,d>>=8,f[g+1]=255&d,d>>=8,f[g]=255&d,g+=4;break;case"utf7":for(p=0;p-1)f[g++]=C.charCodeAt(0);else{var E=r(1201,C);f[g++]=43,f[g++]=A.charCodeAt(E[0]>>2),f[g++]=A.charCodeAt(((3&E[0])<<4)+((E[1]||0)>>4)),f[g++]=A.charCodeAt(((15&E[1])<<2)+((E[2]||0)>>6)),f[g++]=45}else f[g++]=43,f[g++]=45}break;default:throw new Error("Unsupported magic: "+n+" "+t[n])}}return f=f.slice(0,g),h?s&&"buf"!==s?"arr"!==s?f.toString("binary"):[].slice.call(f):f:"str"==s?f.map(c).join(""):f},hascp:function(r){return!(!e[r]&&!t[r])},magic:t,cache:_},e})},9400(e,t,r){var n,a,s;!function(i){if("undefined"==typeof DO_NOT_EXPORT_JSZIP)e.exports=i();else if("undefined"==typeof DO_NOT_EXPORT_JSZIP)JSZipSync=i(),a=[],void 0===(s="function"==typeof(n=i)?n.apply(t,a):n)||(e.exports=s);else{var o;"undefined"!=typeof globalThis?o=globalThis:"undefined"!=typeof window?o=window:void 0!==r.g?o=r.g:"undefined"!=typeof $&&$.global?o=$.global:"undefined"!=typeof self&&(o=self),o.JSZipSync=i()}}(function(){return function e(t,r,n){function a(i,o){if(!r[i]){if(!t[i]){if(s)return s(i,!0);throw new Error("Cannot find module '"+i+"'")}var l=r[i]={exports:{}};t[i][0].call(l.exports,function(e){return a(t[i][1][e]||e)},l,l.exports,e,t,r,n)}return r[i].exports}for(var s=void 0,i=0;i>2,o=(3&r)<<4|(a=e.charCodeAt(h++))>>4,l=(15&a)<<2|(s=e.charCodeAt(h++))>>6,c=63&s,isNaN(a)?l=c=64:isNaN(s)&&(c=64),f=f+n.charAt(i)+n.charAt(o)+n.charAt(l)+n.charAt(c);return f},r.decode=function(e,t){var r,a,s,i,o,l,c="",f=0;for(e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");f>4,a=(15&i)<<4|(o=n.indexOf(e.charAt(f++)))>>2,s=(3&o)<<6|(l=n.indexOf(e.charAt(f++))),c+=String.fromCharCode(r),64!=o&&(c+=String.fromCharCode(a)),64!=l&&(c+=String.fromCharCode(s));return c}},{}],2:[function(e,t,r){"use strict";function n(){this.compressedSize=0,this.uncompressedSize=0,this.crc32=0,this.compressionMethod=null,this.compressedContent=null}n.prototype={getContent:function(){return null},getCompressedContent:function(){return null}},t.exports=n},{}],3:[function(e,t,r){"use strict";r.STORE={magic:"\0\0",compress:function(e){return e},uncompress:function(e){return e},compressInputType:null,uncompressInputType:null},r.DEFLATE=e("./flate")},{"./flate":8}],4:[function(e,t,r){"use strict";var n=e("./utils"),a=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];t.exports=function(e,t){if(void 0===e||!e.length)return 0;var r="string"!==n.getTypeOf(e);void 0===t&&(t=0);var s=0;t^=-1;for(var i=0,o=e.length;i>>8^a[255&(t^s)];return-1^t}},{"./utils":21}],5:[function(e,t,r){"use strict";var n=e("./utils");function a(e){this.data=null,this.length=0,this.index=0}a.prototype={checkOffset:function(e){this.checkIndex(this.index+e)},checkIndex:function(e){if(this.length=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo("string",this.readData(e))},readData:function(e){},lastIndexOfSignature:function(e){},readDate:function(){var e=this.readInt(4);return new Date(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1)}},t.exports=a},{"./utils":21}],6:[function(e,t,r){"use strict";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!1,r.date=null,r.compression=null,r.comment=null},{}],7:[function(e,t,r){"use strict";var n=e("./utils");r.string2binary=function(e){return n.string2binary(e)},r.string2Uint8Array=function(e){return n.transformTo("uint8array",e)},r.uint8Array2String=function(e){return n.transformTo("string",e)},r.string2Blob=function(e){var t=n.transformTo("arraybuffer",e);return n.arrayBuffer2Blob(t)},r.arrayBuffer2Blob=function(e){return n.arrayBuffer2Blob(e)},r.transformTo=function(e,t){return n.transformTo(e,t)},r.getTypeOf=function(e){return n.getTypeOf(e)},r.checkSupport=function(e){return n.checkSupport(e)},r.MAX_VALUE_16BITS=n.MAX_VALUE_16BITS,r.MAX_VALUE_32BITS=n.MAX_VALUE_32BITS,r.pretty=function(e){return n.pretty(e)},r.findCompression=function(e){return n.findCompression(e)},r.isRegExp=function(e){return n.isRegExp(e)}},{"./utils":21}],8:[function(e,t,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,a=e("pako");r.uncompressInputType=n?"uint8array":"array",r.compressInputType=n?"uint8array":"array",r.magic="\b\0",r.compress=function(e){return a.deflateRaw(e)},r.uncompress=function(e){return a.inflateRaw(e)}},{pako:24}],9:[function(e,t,r){"use strict";var n=e("./base64");function a(e,t){if(!(this instanceof a))return new a(e,t);this.files={},this.comment=null,this.root="",e&&this.load(e,t),this.clone=function(){var e=new a;for(var t in this)"function"!=typeof this[t]&&(e[t]=this[t]);return e}}a.prototype=e("./object"),a.prototype.load=e("./load"),a.support=e("./support"),a.defaults=e("./defaults"),a.utils=e("./deprecatedPublicUtils"),a.base64={encode:function(e){return n.encode(e)},decode:function(e){return n.decode(e)}},a.compressions=e("./compressions"),t.exports=a},{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(e,t,r){"use strict";var n=e("./base64"),a=e("./zipEntries");t.exports=function(e,t){var r,s,i,o;for((t=t||{}).base64&&(e=n.decode(e)),r=(s=new a(e,t)).files,i=0;i>>=8;return n},C=function(){var e,t,r={};for(e=0;e0?e.substring(0,t):""},_=function(e,t){return"/"!=e.slice(-1)&&(e+="/"),t=void 0!==t&&t,this.files[e]||E.call(this,e,null,{dir:!0,createFolders:t}),this.files[e]},A=function(e,t){var r,n=new f;return e._data instanceof f?(n.uncompressedSize=e._data.uncompressedSize,n.crc32=e._data.crc32,0===n.uncompressedSize||e.dir?(t=c.STORE,n.compressedContent="",n.crc32=0):e._data.compressionMethod===t.magic?n.compressedContent=e._data.getCompressedContent():(r=e._data.getContent(),n.compressedContent=t.compress(a.transformTo(t.compressInputType,r)))):((r=m(e))&&0!==r.length&&!e.dir||(t=c.STORE,r=""),n.uncompressedSize=r.length,n.crc32=s(r),n.compressedContent=t.compress(a.transformTo(t.compressInputType,r))),n.compressedSize=n.compressedContent.length,n.compressionMethod=t.magic,n},B=function(e,t,r,n){r.compressedContent;var o,l,c,f,h=a.transformTo("string",u.utf8encode(t.name)),d=t.comment||"",p=a.transformTo("string",u.utf8encode(d)),g=h.length!==t.name.length,m=p.length!==d.length,v=t.options,b="",C="",E="";c=t._initialMetadata.dir!==t.dir?t.dir:v.dir,o=(f=t._initialMetadata.date!==t.date?t.date:v.date).getHours(),o<<=6,o|=f.getMinutes(),o<<=5,o|=f.getSeconds()/2,l=f.getFullYear()-1980,l<<=4,l|=f.getMonth()+1,l<<=5,l|=f.getDate(),g&&(C=w(1,1)+w(s(h),4)+h,b+="up"+w(C.length,2)+C),m&&(E=w(1,1)+w(this.crc32(p),4)+p,b+="uc"+w(E.length,2)+E);var S="";return S+="\n\0",S+=g||m?"\0\b":"\0\0",S+=r.compressionMethod,S+=w(o,2),S+=w(l,2),S+=w(r.crc32,4),S+=w(r.compressedSize,4),S+=w(r.uncompressedSize,4),S+=w(h.length,2),S+=w(b.length,2),{fileRecord:i.LOCAL_FILE_HEADER+S+h+b,dirRecord:i.CENTRAL_FILE_HEADER+"\0"+S+w(p.length,2)+"\0\0\0\0"+(!0===c?"\0\0\0":"\0\0\0\0")+w(n,4)+h+b+p,compressedObject:r}},T={load:function(e,t){throw new Error("Load method is not defined. Is the file jszip-load.js included ?")},filter:function(e){var t,r,n,a,s=[];for(t in this.files)this.files.hasOwnProperty(t)&&(n=this.files[t],a=new b(n.name,n._data,C(n.options)),r=t.slice(this.root.length,t.length),t.slice(0,this.root.length)===this.root&&e(r,a)&&s.push(a));return s},file:function(e,t,r){if(1===arguments.length){if(a.isRegExp(e)){var n=e;return this.filter(function(e,t){return!t.dir&&n.test(e)})}return this.filter(function(t,r){return!r.dir&&t===e})[0]||null}return e=this.root+e,E.call(this,e,t,r),this},folder:function(e){if(!e)return this;if(a.isRegExp(e))return this.filter(function(t,r){return r.dir&&e.test(t)});var t=this.root+e,r=_.call(this,t),n=this.clone();return n.root=r.name,n},remove:function(e){e=this.root+e;var t=this.files[e];if(t||("/"!=e.slice(-1)&&(e+="/"),t=this.files[e]),t&&!t.dir)delete this.files[e];else for(var r=this.filter(function(t,r){return r.name.slice(0,e.length)===e}),n=0;n=0;--s)if(this.data[s]===t&&this.data[s+1]===r&&this.data[s+2]===n&&this.data[s+3]===a)return s;return-1},a.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.index,this.index+e);return this.index+=e,t},t.exports=a},{"./dataReader":5}],19:[function(e,t,r){"use strict";var n=e("./utils"),a=function(e){this.data=new Uint8Array(e),this.index=0};a.prototype={append:function(e){0!==e.length&&(e=n.transformTo("uint8array",e),this.data.set(e,this.index),this.index+=e.length)},finalize:function(){return this.data}},t.exports=a},{"./utils":21}],20:[function(e,t,r){"use strict";for(var n=e("./utils"),a=e("./support"),s=e("./nodeBuffer"),i=new Array(256),o=0;o<256;o++)i[o]=o>=252?6:o>=248?5:o>=240?4:o>=224?3:o>=192?2:1;i[254]=i[254]=1;var l=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;r>=0&&128==(192&e[r]);)r--;return r<0||0===r?t:r+i[e[r]]>t?r:t},c=function(e){var t,r,a,s,o=e.length,l=new Array(2*o);for(r=0,t=0;t4)l[r++]=65533,t+=s-1;else{for(a&=2===s?31:3===s?15:7;s>1&&t1?l[r++]=65533:a<65536?l[r++]=a:(a-=65536,l[r++]=55296|a>>10&1023,l[r++]=56320|1023&a)}return l.length!==r&&(l.subarray?l=l.subarray(0,r):l.length=r),n.applyFromCharCode(l)};r.utf8encode=function(e){return a.nodebuffer?s(e,"utf-8"):function(e){var t,r,n,s,i,o=e.length,l=0;for(s=0;s>>6,t[i++]=128|63&r):r<65536?(t[i++]=224|r>>>12,t[i++]=128|r>>>6&63,t[i++]=128|63&r):(t[i++]=240|r>>>18,t[i++]=128|r>>>12&63,t[i++]=128|r>>>6&63,t[i++]=128|63&r);return t}(e)},r.utf8decode=function(e){if(a.nodebuffer)return n.transformTo("nodebuffer",e).toString("utf-8");for(var t=[],r=0,s=(e=n.transformTo(a.uint8array?"uint8array":"array",e)).length;r1;)try{"array"===i||"nodebuffer"===i?n.push(String.fromCharCode.apply(null,e.slice(o,Math.min(o+t,a)))):n.push(String.fromCharCode.apply(null,e.subarray(o,Math.min(o+t,a)))),o+=t}catch(e){t=Math.floor(t/2)}return n.join("")}function c(e,t){for(var r=0;r1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var e,t;for(e=0;e0?t.windowBits=-t.windowBits:t.gzip&&t.windowBits>0&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new o,this.strm.avail_out=0;var r=n.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(0!==r)throw new Error(i[r]);t.header&&n.deflateSetHeader(this.strm,t.header)};function c(e,t){var r=new l(t);if(r.push(e,!0),r.err)throw r.msg;return r.result}l.prototype.push=function(e,t){var r,i,o=this.strm,l=this.options.chunkSize;if(this.ended)return!1;i=t===~~t?t:!0===t?4:0,o.input="string"==typeof e?s.string2buf(e):e,o.next_in=0,o.avail_in=o.input.length;do{if(0===o.avail_out&&(o.output=new a.Buf8(l),o.next_out=0,o.avail_out=l),1!==(r=n.deflate(o,i))&&0!==r)return this.onEnd(r),this.ended=!0,!1;(0===o.avail_out||0===o.avail_in&&4===i)&&("string"===this.options.to?this.onData(s.buf2binstring(a.shrinkBuf(o.output,o.next_out))):this.onData(a.shrinkBuf(o.output,o.next_out)))}while((o.avail_in>0||0===o.avail_out)&&1!==r);return 4!==i||(r=n.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,0===r)},l.prototype.onData=function(e){this.chunks.push(e)},l.prototype.onEnd=function(e){0===e&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=a.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Deflate=l,r.deflate=c,r.deflateRaw=function(e,t){return(t=t||{}).raw=!0,c(e,t)},r.gzip=function(e,t){return(t=t||{}).gzip=!0,c(e,t)}},{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(e,t,r){"use strict";var n=e("./zlib/inflate.js"),a=e("./utils/common"),s=e("./utils/strings"),i=e("./zlib/constants"),o=e("./zlib/messages"),l=e("./zlib/zstream"),c=e("./zlib/gzheader"),f=function(e){this.options=a.assign({chunkSize:16384,windowBits:0,to:""},e||{});var t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&(15&t.windowBits||(t.windowBits|=15)),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new l,this.strm.avail_out=0;var r=n.inflateInit2(this.strm,t.windowBits);if(r!==i.Z_OK)throw new Error(o[r]);this.header=new c,n.inflateGetHeader(this.strm,this.header)};function h(e,t){var r=new f(t);if(r.push(e,!0),r.err)throw r.msg;return r.result}f.prototype.push=function(e,t){var r,o,l,c,f,h=this.strm,u=this.options.chunkSize;if(this.ended)return!1;o=t===~~t?t:!0===t?i.Z_FINISH:i.Z_NO_FLUSH,h.input="string"==typeof e?s.binstring2buf(e):e,h.next_in=0,h.avail_in=h.input.length;do{if(0===h.avail_out&&(h.output=new a.Buf8(u),h.next_out=0,h.avail_out=u),(r=n.inflate(h,i.Z_NO_FLUSH))!==i.Z_STREAM_END&&r!==i.Z_OK)return this.onEnd(r),this.ended=!0,!1;h.next_out&&(0===h.avail_out||r===i.Z_STREAM_END||0===h.avail_in&&o===i.Z_FINISH)&&("string"===this.options.to?(l=s.utf8border(h.output,h.next_out),c=h.next_out-l,f=s.buf2string(h.output,l),h.next_out=c,h.avail_out=u-c,c&&a.arraySet(h.output,h.output,l,c,0),this.onData(f)):this.onData(a.shrinkBuf(h.output,h.next_out)))}while(h.avail_in>0&&r!==i.Z_STREAM_END);return r===i.Z_STREAM_END&&(o=i.Z_FINISH),o!==i.Z_FINISH||(r=n.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===i.Z_OK)},f.prototype.onData=function(e){this.chunks.push(e)},f.prototype.onEnd=function(e){e===i.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=a.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Inflate=f,r.inflate=h,r.inflateRaw=function(e,t){return(t=t||{}).raw=!0,h(e,t)},r.ungzip=h},{"./utils/common":27,"./utils/strings":28,"./zlib/constants":30,"./zlib/gzheader":33,"./zlib/inflate.js":35,"./zlib/messages":37,"./zlib/zstream":39}],27:[function(e,t,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;r.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var r=t.shift();if(r){if("object"!=typeof r)throw new TypeError(r+"must be non-object");for(var n in r)r.hasOwnProperty(n)&&(e[n]=r[n])}}return e},r.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var a={arraySet:function(e,t,r,n,a){if(t.subarray&&e.subarray)e.set(t.subarray(r,r+n),a);else for(var s=0;s=252?6:o>=248?5:o>=240?4:o>=224?3:o>=192?2:1;function l(e,t){if(t<65537&&(e.subarray&&s||!e.subarray&&a))return String.fromCharCode.apply(null,n.shrinkBuf(e,t));for(var r="",i=0;i>>6,t[i++]=128|63&r):r<65536?(t[i++]=224|r>>>12,t[i++]=128|r>>>6&63,t[i++]=128|63&r):(t[i++]=240|r>>>18,t[i++]=128|r>>>12&63,t[i++]=128|r>>>6&63,t[i++]=128|63&r);return t},r.buf2binstring=function(e){return l(e,e.length)},r.binstring2buf=function(e){for(var t=new n.Buf8(e.length),r=0,a=t.length;r4)c[n++]=65533,r+=s-1;else{for(a&=2===s?31:3===s?15:7;s>1&&r1?c[n++]=65533:a<65536?c[n++]=a:(a-=65536,c[n++]=55296|a>>10&1023,c[n++]=56320|1023&a)}return l(c,n)},r.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;r>=0&&128==(192&e[r]);)r--;return r<0||0===r?t:r+i[e[r]]>t?r:t}},{"./common":27}],29:[function(e,t,r){"use strict";t.exports=function(e,t,r,n){for(var a=65535&e,s=e>>>16&65535,i=0;0!==r;){r-=i=r>2e3?2e3:r;do{s=s+(a=a+t[n++]|0)|0}while(--i);a%=65521,s%=65521}return a|s<<16}},{}],30:[function(e,t,r){t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],31:[function(e,t,r){"use strict";var n=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t,r,a){var s=n,i=a+r;e^=-1;for(var o=a;o>>8^s[255&(e^t[o])];return-1^e}},{}],32:[function(e,t,r){"use strict";var n=e("../utils/common"),a=e("./trees"),s=e("./adler32"),i=e("./crc32"),o=e("./messages"),l=-2,c=258,f=262,h=103,u=113,d=666;function p(e,t){return e.msg=o[t],t}function g(e){return(e<<1)-(e>4?9:0)}function m(e){for(var t=e.length;--t>=0;)e[t]=0}function v(e){var t=e.state,r=t.pending;r>e.avail_out&&(r=e.avail_out),0!==r&&(n.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function b(e,t){a._tr_flush_block(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,v(e.strm)}function w(e,t){e.pending_buf[e.pending++]=t}function C(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function E(e,t,r,a){var o=e.avail_in;return o>a&&(o=a),0===o?0:(e.avail_in-=o,n.arraySet(t,e.input,e.next_in,o,r),1===e.state.wrap?e.adler=s(e.adler,t,o,r):2===e.state.wrap&&(e.adler=i(e.adler,t,o,r)),e.next_in+=o,e.total_in+=o,o)}function S(e,t){var r,n,a=e.max_chain_length,s=e.strstart,i=e.prev_length,o=e.nice_match,l=e.strstart>e.w_size-f?e.strstart-(e.w_size-f):0,h=e.window,u=e.w_mask,d=e.prev,p=e.strstart+c,g=h[s+i-1],m=h[s+i];e.prev_length>=e.good_match&&(a>>=2),o>e.lookahead&&(o=e.lookahead);do{if(h[(r=t)+i]===m&&h[r+i-1]===g&&h[r]===h[s]&&h[++r]===h[s+1]){s+=2,r++;do{}while(h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&si){if(e.match_start=t,i=n,n>=o)break;g=h[s+i-1],m=h[s+i]}}}while((t=d[t&u])>l&&0!==--a);return i<=e.lookahead?i:e.lookahead}function _(e){var t,r,a,s,i,o=e.w_size;do{if(s=e.window_size-e.lookahead-e.strstart,e.strstart>=o+(o-f)){n.arraySet(e.window,e.window,o,o,0),e.match_start-=o,e.strstart-=o,e.block_start-=o,t=r=e.hash_size;do{a=e.head[--t],e.head[t]=a>=o?a-o:0}while(--r);t=r=o;do{a=e.prev[--t],e.prev[t]=a>=o?a-o:0}while(--r);s+=o}if(0===e.strm.avail_in)break;if(r=E(e.strm,e.window,e.strstart+e.lookahead,s),e.lookahead+=r,e.lookahead+e.insert>=3)for(i=e.strstart-e.insert,e.ins_h=e.window[i],e.ins_h=(e.ins_h<=3&&(e.ins_h=(e.ins_h<=3)if(n=a._tr_tally(e,e.strstart-e.match_start,e.match_length-3),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=3){e.match_length--;do{e.strstart++,e.ins_h=(e.ins_h<=3&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=2)),e.prev_length>=3&&e.match_length<=e.prev_length){s=e.strstart+e.lookahead-3,n=a._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-3),e.lookahead-=e.prev_length-1,e.prev_length-=2;do{++e.strstart<=s&&(e.ins_h=(e.ins_h<15&&(o=2,a-=16),s<1||s>9||8!==r||a<8||a>15||t<0||t>9||i<0||i>4)return p(e,l);8===a&&(a=9);var c=new y;return e.state=c,c.strm=e,c.wrap=o,c.gzhead=null,c.w_bits=a,c.w_size=1<>1,c.l_buf=3*c.lit_bufsize,c.level=t,c.strategy=i,c.method=r,I(e)}T=[new k(0,0,0,0,function(e,t){var r=65535;for(r>e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(_(e),0===e.lookahead&&0===t)return 1;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,b(e,!1),0===e.strm.avail_out))return 1;if(e.strstart-e.block_start>=e.w_size-f&&(b(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(b(e,!0),0===e.strm.avail_out?3:4):(e.strstart>e.block_start&&(b(e,!1),e.strm.avail_out),1)}),new k(4,4,8,4,A),new k(4,5,16,8,A),new k(4,6,32,32,A),new k(4,4,16,16,B),new k(8,16,32,32,B),new k(8,16,128,128,B),new k(8,32,128,256,B),new k(32,128,258,1024,B),new k(32,258,258,4096,B)],r.deflateInit=function(e,t){return R(e,t,8,15,8,0)},r.deflateInit2=R,r.deflateReset=I,r.deflateResetKeep=x,r.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?l:(e.state.gzhead=t,0):l},r.deflate=function(e,t){var r,n,s,o;if(!e||!e.state||t>5||t<0)return e?p(e,l):l;if(n=e.state,!e.output||!e.input&&0!==e.avail_in||n.status===d&&4!==t)return p(e,0===e.avail_out?-5:l);if(n.strm=e,r=n.last_flush,n.last_flush=t,42===n.status)if(2===n.wrap)e.adler=0,w(n,31),w(n,139),w(n,8),n.gzhead?(w(n,(n.gzhead.text?1:0)+(n.gzhead.hcrc?2:0)+(n.gzhead.extra?4:0)+(n.gzhead.name?8:0)+(n.gzhead.comment?16:0)),w(n,255&n.gzhead.time),w(n,n.gzhead.time>>8&255),w(n,n.gzhead.time>>16&255),w(n,n.gzhead.time>>24&255),w(n,9===n.level?2:n.strategy>=2||n.level<2?4:0),w(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(w(n,255&n.gzhead.extra.length),w(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=i(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(w(n,0),w(n,0),w(n,0),w(n,0),w(n,0),w(n,9===n.level?2:n.strategy>=2||n.level<2?4:0),w(n,3),n.status=u);else{var f=8+(n.w_bits-8<<4)<<8;f|=(n.strategy>=2||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(f|=32),f+=31-f%31,n.status=u,C(n,f),0!==n.strstart&&(C(n,e.adler>>>16),C(n,65535&e.adler)),e.adler=1}if(69===n.status)if(n.gzhead.extra){for(s=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>s&&(e.adler=i(e.adler,n.pending_buf,n.pending-s,s)),v(e),s=n.pending,n.pending!==n.pending_buf_size));)w(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>s&&(e.adler=i(e.adler,n.pending_buf,n.pending-s,s)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){s=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>s&&(e.adler=i(e.adler,n.pending_buf,n.pending-s,s)),v(e),s=n.pending,n.pending===n.pending_buf_size)){o=1;break}o=n.gzindexs&&(e.adler=i(e.adler,n.pending_buf,n.pending-s,s)),0===o&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){s=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>s&&(e.adler=i(e.adler,n.pending_buf,n.pending-s,s)),v(e),s=n.pending,n.pending===n.pending_buf_size)){o=1;break}o=n.gzindexs&&(e.adler=i(e.adler,n.pending_buf,n.pending-s,s)),0===o&&(n.status=h)}else n.status=h;if(n.status===h&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&v(e),n.pending+2<=n.pending_buf_size&&(w(n,255&e.adler),w(n,e.adler>>8&255),e.adler=0,n.status=u)):n.status=u),0!==n.pending){if(v(e),0===e.avail_out)return n.last_flush=-1,0}else if(0===e.avail_in&&g(t)<=g(r)&&4!==t)return p(e,-5);if(n.status===d&&0!==e.avail_in)return p(e,-5);if(0!==e.avail_in||0!==n.lookahead||0!==t&&n.status!==d){var E=2===n.strategy?function(e,t){for(var r;;){if(0===e.lookahead&&(_(e),0===e.lookahead)){if(0===t)return 1;break}if(e.match_length=0,r=a._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(b(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(b(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(b(e,!1),0===e.strm.avail_out)?1:2}(n,t):3===n.strategy?function(e,t){for(var r,n,s,i,o=e.window;;){if(e.lookahead<=c){if(_(e),e.lookahead<=c&&0===t)return 1;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=3&&e.strstart>0&&(n=o[s=e.strstart-1])===o[++s]&&n===o[++s]&&n===o[++s]){i=e.strstart+c;do{}while(n===o[++s]&&n===o[++s]&&n===o[++s]&&n===o[++s]&&n===o[++s]&&n===o[++s]&&n===o[++s]&&n===o[++s]&&se.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=3?(r=a._tr_tally(e,1,e.match_length-3),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=a._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(b(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(b(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(b(e,!1),0===e.strm.avail_out)?1:2}(n,t):T[n.level].func(n,t);if(3!==E&&4!==E||(n.status=d),1===E||3===E)return 0===e.avail_out&&(n.last_flush=-1),0;if(2===E&&(1===t?a._tr_align(n):5!==t&&(a._tr_stored_block(n,0,0,!1),3===t&&(m(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),v(e),0===e.avail_out))return n.last_flush=-1,0}return 4!==t?0:n.wrap<=0?1:(2===n.wrap?(w(n,255&e.adler),w(n,e.adler>>8&255),w(n,e.adler>>16&255),w(n,e.adler>>24&255),w(n,255&e.total_in),w(n,e.total_in>>8&255),w(n,e.total_in>>16&255),w(n,e.total_in>>24&255)):(C(n,e.adler>>>16),C(n,65535&e.adler)),v(e),n.wrap>0&&(n.wrap=-n.wrap),0!==n.pending?0:1)},r.deflateEnd=function(e){var t;return e&&e.state?42!==(t=e.state.status)&&69!==t&&73!==t&&91!==t&&t!==h&&t!==u&&t!==d?p(e,l):(e.state=null,t===u?p(e,-3):0):l},r.deflateInfo="pako deflate (from Nodeca project)"},{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(e,t,r){"use strict";t.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}},{}],34:[function(e,t,r){"use strict";t.exports=function(e,t){var r,n,a,s,i,o,l,c,f,h,u,d,p,g,m,v,b,w,C,E,S,_,A,B,T;r=e.state,n=e.next_in,B=e.input,a=n+(e.avail_in-5),s=e.next_out,T=e.output,i=s-(t-e.avail_out),o=s+(e.avail_out-257),l=r.dmax,c=r.wsize,f=r.whave,h=r.wnext,u=r.window,d=r.hold,p=r.bits,g=r.lencode,m=r.distcode,v=(1<>>=C=w>>>24,p-=C,0==(C=w>>>16&255))T[s++]=65535&w;else{if(!(16&C)){if(64&C){if(32&C){r.mode=12;break e}e.msg="invalid literal/length code",r.mode=30;break e}w=g[(65535&w)+(d&(1<>>=C,p-=C),p<15&&(d+=B[n++]<>>=C=w>>>24,p-=C,16&(C=w>>>16&255)){if(S=65535&w,p<(C&=15)&&(d+=B[n++]<l){e.msg="invalid distance too far back",r.mode=30;break e}if(d>>>=C,p-=C,S>(C=s-i)){if((C=S-C)>f&&r.sane){e.msg="invalid distance too far back",r.mode=30;break e}if(_=0,A=u,0===h){if(_+=c-C,C2;)T[s++]=A[_++],T[s++]=A[_++],T[s++]=A[_++],E-=3;E&&(T[s++]=A[_++],E>1&&(T[s++]=A[_++]))}else{_=s-S;do{T[s++]=T[_++],T[s++]=T[_++],T[s++]=T[_++],E-=3}while(E>2);E&&(T[s++]=T[_++],E>1&&(T[s++]=T[_++]))}break}if(64&C){e.msg="invalid distance code",r.mode=30;break e}w=m[(65535&w)+(d&(1<>3,d&=(1<<(p-=E<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function u(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new n.Buf16(320),this.work=new n.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function d(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new n.Buf32(852),t.distcode=t.distdyn=new n.Buf32(592),t.sane=1,t.back=-1,0):l}function p(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,d(e)):l}function g(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?l:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=r,n.wbits=t,p(e))):l}function m(e,t){var r,n;return e?(n=new u,e.state=n,n.window=null,0!==(r=g(e,t))&&(e.state=null),r):l}var v,b,w=!0;function C(e){if(w){var t;for(v=new n.Buf32(512),b=new n.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(o(1,e.lens,0,288,v,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;o(2,e.lens,0,32,b,0,e.work,{bits:5}),w=!1}e.lencode=v,e.lenbits=9,e.distcode=b,e.distbits=5}r.inflateReset=p,r.inflateReset2=g,r.inflateResetKeep=d,r.inflateInit=function(e){return m(e,15)},r.inflateInit2=m,r.inflate=function(e,t){var r,u,d,p,g,m,v,b,w,E,S,_,A,B,T,k,y,x,I,R,O,F,D,N,P=0,L=new n.Buf8(4),M=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return l;(r=e.state).mode===c&&(r.mode=13),g=e.next_out,d=e.output,v=e.avail_out,p=e.next_in,u=e.input,m=e.avail_in,b=r.hold,w=r.bits,E=m,S=v,F=0;e:for(;;)switch(r.mode){case 1:if(0===r.wrap){r.mode=13;break}for(;w<16;){if(0===m)break e;m--,b+=u[p++]<>>8&255,r.check=s(r.check,L,2,0),b=0,w=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&b)<<8)+(b>>8))%31){e.msg="incorrect header check",r.mode=f;break}if(8!=(15&b)){e.msg="unknown compression method",r.mode=f;break}if(w-=4,O=8+(15&(b>>>=4)),0===r.wbits)r.wbits=O;else if(O>r.wbits){e.msg="invalid window size",r.mode=f;break}r.dmax=1<>8&1),512&r.flags&&(L[0]=255&b,L[1]=b>>>8&255,r.check=s(r.check,L,2,0)),b=0,w=0,r.mode=3;case 3:for(;w<32;){if(0===m)break e;m--,b+=u[p++]<>>8&255,L[2]=b>>>16&255,L[3]=b>>>24&255,r.check=s(r.check,L,4,0)),b=0,w=0,r.mode=4;case 4:for(;w<16;){if(0===m)break e;m--,b+=u[p++]<>8),512&r.flags&&(L[0]=255&b,L[1]=b>>>8&255,r.check=s(r.check,L,2,0)),b=0,w=0,r.mode=5;case 5:if(1024&r.flags){for(;w<16;){if(0===m)break e;m--,b+=u[p++]<>>8&255,r.check=s(r.check,L,2,0)),b=0,w=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&((_=r.length)>m&&(_=m),_&&(r.head&&(O=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),n.arraySet(r.head.extra,u,p,_,O)),512&r.flags&&(r.check=s(r.check,u,_,p)),m-=_,p+=_,r.length-=_),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===m)break e;_=0;do{O=u[p+_++],r.head&&O&&r.length<65536&&(r.head.name+=String.fromCharCode(O))}while(O&&_>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=c;break;case 10:for(;w<32;){if(0===m)break e;m--,b+=u[p++]<>>=7&w,w-=7&w,r.mode=27;break}for(;w<3;){if(0===m)break e;m--,b+=u[p++]<>>=1)){case 0:r.mode=14;break;case 1:if(C(r),r.mode=20,6===t){b>>>=2,w-=2;break e}break;case 2:r.mode=17;break;case 3:e.msg="invalid block type",r.mode=f}b>>>=2,w-=2;break;case 14:for(b>>>=7&w,w-=7&w;w<32;){if(0===m)break e;m--,b+=u[p++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=f;break}if(r.length=65535&b,b=0,w=0,r.mode=15,6===t)break e;case 15:r.mode=16;case 16:if(_=r.length){if(_>m&&(_=m),_>v&&(_=v),0===_)break e;n.arraySet(d,u,p,_,g),m-=_,p+=_,v-=_,g+=_,r.length-=_;break}r.mode=c;break;case 17:for(;w<14;){if(0===m)break e;m--,b+=u[p++]<>>=5,w-=5,r.ndist=1+(31&b),b>>>=5,w-=5,r.ncode=4+(15&b),b>>>=4,w-=4,r.nlen>286||r.ndist>30){e.msg="too many length or distance symbols",r.mode=f;break}r.have=0,r.mode=18;case 18:for(;r.have>>=3,w-=3}for(;r.have<19;)r.lens[M[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,D={bits:r.lenbits},F=o(0,r.lens,0,19,r.lencode,0,r.work,D),r.lenbits=D.bits,F){e.msg="invalid code lengths set",r.mode=f;break}r.have=0,r.mode=19;case 19:for(;r.have>>16&255,y=65535&P,!((T=P>>>24)<=w);){if(0===m)break e;m--,b+=u[p++]<>>=T,w-=T,r.lens[r.have++]=y;else{if(16===y){for(N=T+2;w>>=T,w-=T,0===r.have){e.msg="invalid bit length repeat",r.mode=f;break}O=r.lens[r.have-1],_=3+(3&b),b>>>=2,w-=2}else if(17===y){for(N=T+3;w>>=T)),b>>>=3,w-=3}else{for(N=T+7;w>>=T)),b>>>=7,w-=7}if(r.have+_>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=f;break}for(;_--;)r.lens[r.have++]=O}}if(r.mode===f)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=f;break}if(r.lenbits=9,D={bits:r.lenbits},F=o(1,r.lens,0,r.nlen,r.lencode,0,r.work,D),r.lenbits=D.bits,F){e.msg="invalid literal/lengths set",r.mode=f;break}if(r.distbits=6,r.distcode=r.distdyn,D={bits:r.distbits},F=o(2,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,D),r.distbits=D.bits,F){e.msg="invalid distances set",r.mode=f;break}if(r.mode=20,6===t)break e;case 20:r.mode=21;case 21:if(m>=6&&v>=258){e.next_out=g,e.avail_out=v,e.next_in=p,e.avail_in=m,r.hold=b,r.bits=w,i(e,S),g=e.next_out,d=e.output,v=e.avail_out,p=e.next_in,u=e.input,m=e.avail_in,b=r.hold,w=r.bits,r.mode===c&&(r.back=-1);break}for(r.back=0;k=(P=r.lencode[b&(1<>>16&255,y=65535&P,!((T=P>>>24)<=w);){if(0===m)break e;m--,b+=u[p++]<>x)])>>>16&255,y=65535&P,!(x+(T=P>>>24)<=w);){if(0===m)break e;m--,b+=u[p++]<>>=x,w-=x,r.back+=x}if(b>>>=T,w-=T,r.back+=T,r.length=y,0===k){r.mode=26;break}if(32&k){r.back=-1,r.mode=c;break}if(64&k){e.msg="invalid literal/length code",r.mode=f;break}r.extra=15&k,r.mode=22;case 22:if(r.extra){for(N=r.extra;w>>=r.extra,w-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;k=(P=r.distcode[b&(1<>>16&255,y=65535&P,!((T=P>>>24)<=w);){if(0===m)break e;m--,b+=u[p++]<>x)])>>>16&255,y=65535&P,!(x+(T=P>>>24)<=w);){if(0===m)break e;m--,b+=u[p++]<>>=x,w-=x,r.back+=x}if(b>>>=T,w-=T,r.back+=T,64&k){e.msg="invalid distance code",r.mode=f;break}r.offset=y,r.extra=15&k,r.mode=24;case 24:if(r.extra){for(N=r.extra;w>>=r.extra,w-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=f;break}r.mode=25;case 25:if(0===v)break e;if(_=S-v,r.offset>_){if((_=r.offset-_)>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=f;break}_>r.wnext?(_-=r.wnext,A=r.wsize-_):A=r.wnext-_,_>r.length&&(_=r.length),B=r.window}else B=d,A=g-r.offset,_=r.length;_>v&&(_=v),v-=_,r.length-=_;do{d[g++]=B[A++]}while(--_);0===r.length&&(r.mode=21);break;case 26:if(0===v)break e;d[g++]=r.length,v--,r.mode=21;break;case 27:if(r.wrap){for(;w<32;){if(0===m)break e;m--,b|=u[p++]<=i.wsize?(n.arraySet(i.window,t,r-i.wsize,i.wsize,0),i.wnext=0,i.whave=i.wsize):((s=i.wsize-i.wnext)>a&&(s=a),n.arraySet(i.window,t,r-a,s,i.wnext),(a-=s)?(n.arraySet(i.window,t,r-a,a,0),i.wnext=a,i.whave=i.wsize):(i.wnext+=s,i.wnext===i.wsize&&(i.wnext=0),i.whave=1&&0===N[T];T--);if(k>T&&(k=T),0===T)return c[f++]=20971520,c[f++]=20971520,u.bits=1,0;for(B=1;B0&&(0===e||1!==T))return-1;for(P[1]=0,_=1;_<15;_++)P[_+1]=P[_]+N[_];for(A=0;A852||2===e&&R>592)return 1;for(;;){w=_-x,h[A]b?(C=L[M+h[A]],E=F[D+h[A]]):(C=96,E=0),d=1<<_-x,B=p=1<>x)+(p-=d)]=w<<24|C<<16|E}while(0!==p);for(d=1<<_-1;O&d;)d>>=1;if(0!==d?(O&=d-1,O+=d):O=0,A++,0===--N[_]){if(_===T)break;_=t[r+h[A]]}if(_>k&&(O&m)!==g){for(0===x&&(x=k),v+=B,I=1<<(y=_-x);y+x852||2===e&&R>592)return 1;c[g=O&m]=k<<24|y<<16|v-f}}return 0!==O&&(c[v+O]=_-x<<24|64<<16),u.bits=k,0}},{"../utils/common":27}],37:[function(e,t,r){"use strict";t.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],38:[function(e,t,r){"use strict";var n=e("../utils/common");function a(e){for(var t=e.length;--t>=0;)e[t]=0}var s=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],i=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],o=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],l=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],c=new Array(576);a(c);var f=new Array(60);a(f);var h=new Array(512);a(h);var u=new Array(256);a(u);var d=new Array(29);a(d);var p=new Array(30);a(p);var g,m,v,b=function(e,t,r,n,a){this.static_tree=e,this.extra_bits=t,this.extra_base=r,this.elems=n,this.max_length=a,this.has_stree=e&&e.length},w=function(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t};function C(e){return e<256?h[e]:h[256+(e>>>7)]}function E(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function S(e,t,r){e.bi_valid>16-r?(e.bi_buf|=t<>16-e.bi_valid,e.bi_valid+=r-16):(e.bi_buf|=t<>>=1,r<<=1}while(--t>0);return r>>>1}function B(e,t,r){var n,a,s=new Array(16),i=0;for(n=1;n<=15;n++)s[n]=i=i+r[n-1]<<1;for(a=0;a<=t;a++){var o=e[2*a+1];0!==o&&(e[2*a]=A(s[o]++,o))}}function T(e){var t;for(t=0;t<286;t++)e.dyn_ltree[2*t]=0;for(t=0;t<30;t++)e.dyn_dtree[2*t]=0;for(t=0;t<19;t++)e.bl_tree[2*t]=0;e.dyn_ltree[512]=1,e.opt_len=e.static_len=0,e.last_lit=e.matches=0}function k(e){e.bi_valid>8?E(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function y(e,t,r,n){var a=2*t,s=2*r;return e[a]>1;r>=1;r--)x(e,s,r);a=l;do{r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],x(e,s,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,s[2*a]=s[2*r]+s[2*n],e.depth[a]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,s[2*r+1]=s[2*n+1]=a,e.heap[1]=a++,x(e,s,1)}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,a,s,i,o,l=t.dyn_tree,c=t.max_code,f=t.stat_desc.static_tree,h=t.stat_desc.has_stree,u=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,g=0;for(s=0;s<=15;s++)e.bl_count[s]=0;for(l[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;r<573;r++)(s=l[2*l[2*(n=e.heap[r])+1]+1]+1)>p&&(s=p,g++),l[2*n+1]=s,n>c||(e.bl_count[s]++,i=0,n>=d&&(i=u[n-d]),o=l[2*n],e.opt_len+=o*(s+i),h&&(e.static_len+=o*(f[2*n+1]+i)));if(0!==g){do{for(s=p-1;0===e.bl_count[s];)s--;e.bl_count[s]--,e.bl_count[s+1]+=2,e.bl_count[p]--,g-=2}while(g>0);for(s=p;0!==s;s--)for(n=e.bl_count[s];0!==n;)(a=e.heap[--r])>c||(l[2*a+1]!==s&&(e.opt_len+=(s-l[2*a+1])*l[2*a],l[2*a+1]=s),n--)}}(e,t),B(s,c,e.bl_count)}function O(e,t,r){var n,a,s=-1,i=t[1],o=0,l=7,c=4;for(0===i&&(l=138,c=3),t[2*(r+1)+1]=65535,n=0;n<=r;n++)a=i,i=t[2*(n+1)+1],++o>=7;n<30;n++)for(p[n]=a<<7,e=0;e<1<0?(2===e.strm.data_type&&(e.strm.data_type=function(e){var t,r=4093624447;for(t=0;t<=31;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return 0;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return 1;for(t=32;t<256;t++)if(0!==e.dyn_ltree[2*t])return 1;return 0}(e)),R(e,e.l_desc),R(e,e.d_desc),i=function(e){var t;for(O(e,e.dyn_ltree,e.l_desc.max_code),O(e,e.dyn_dtree,e.d_desc.max_code),R(e,e.bl_desc),t=18;t>=3&&0===e.bl_tree[2*l[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),a=e.opt_len+3+7>>>3,(s=e.static_len+3+7>>>3)<=a&&(a=s)):a=s=r+5,r+4<=a&&-1!==t?N(e,t,r,n):4===e.strategy||s===a?(S(e,2+(n?1:0),3),I(e,c,f)):(S(e,4+(n?1:0),3),function(e,t,r,n){var a;for(S(e,t-257,5),S(e,r-1,5),S(e,n-4,4),a=0;a>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(u[r]+256+1)]++,e.dyn_dtree[2*C(t)]++),e.last_lit===e.lit_bufsize-1},r._tr_align=function(e){S(e,2,3),_(e,256,c),function(e){16===e.bi_valid?(E(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},{"../utils/common":27}],39:[function(e,t,r){"use strict";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}]},{},[9])(9)})},7063(e,t,r){if(function(t){t.version="0.17.5";var n=1200,a=1252;"undefined"==typeof cptable&&(void 0!==r.g?r.g.cptable=r(1454):"undefined"!=typeof window&&(window.cptable=r(1454)));for(var s=[874,932,936,949,950],i=0;i<=8;++i)s.push(1250+i);var o={0:1252,1:65001,2:65001,77:1e4,128:932,129:949,130:1361,134:936,136:950,161:1253,162:1254,163:1258,177:1255,178:1256,186:1257,204:1251,222:874,238:1250,255:1252,69:6969},l=function(e){-1!=s.indexOf(e)&&(a=o[0]=e)},c=function(e){n=e,l(e)};function f(){c(1200),l(1252)}function h(e){for(var t=[],r=0,n=e.length;r>1;++r)t[r]=String.fromCharCode(e.charCodeAt(2*r)+(e.charCodeAt(2*r+1)<<8));return t.join("")}(e.slice(2)):254==t&&255==r?function(e){for(var t=[],r=0;r>1;++r)t[r]=String.fromCharCode(e.charCodeAt(2*r+1)+(e.charCodeAt(2*r)<<8));return t.join("")}(e.slice(2)):65279==t?e.slice(1):e},d=function(e){return String.fromCharCode(e)},p=function(e){return String.fromCharCode(e)};"undefined"!=typeof cptable&&(c=function(e){n=e,l(e)},u=function(e){return 255===e.charCodeAt(0)&&254===e.charCodeAt(1)?cptable.utils.decode(1200,h(e.slice(2))):e},d=function(e){return 1200===n?String.fromCharCode(e):cptable.utils.decode(n,[255&e,e>>8])[0]},p=function(e){return cptable.utils.decode(a,[e])[0]});var g,m=(g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",{encode:function(e){for(var t="",r=0,n=0,a=0,s=0,i=0,o=0,l=0,c=0;c>2,i=(3&r)<<4|(n=e.charCodeAt(c++))>>4,o=(15&n)<<2|(a=e.charCodeAt(c++))>>6,l=63&a,isNaN(n)?o=l=64:isNaN(a)&&(l=64),t+=g.charAt(s)+g.charAt(i)+g.charAt(o)+g.charAt(l);return t},decode:function(e){var t="",r=0,n=0,a=0,s=0,i=0,o=0;e=e.replace(/[^\w\+\/\=]/g,"");for(var l=0;l>4,t+=String.fromCharCode(r),n=(15&s)<<4|(i=g.indexOf(e.charAt(l++)))>>2,64!==i&&(t+=String.fromCharCode(n)),a=(3&i)<<6|(o=g.indexOf(e.charAt(l++))),64!==o&&(t+=String.fromCharCode(a));return t}}),v="undefined"!=typeof Buffer&&"undefined"!=typeof process&&void 0!==process.versions&&!!process.versions.node,b=function(){};if("undefined"!=typeof Buffer){var w=!Buffer.from;if(!w)try{Buffer.from("foo","utf8")}catch(e){w=!0}b=w?function(e,t){return t?new Buffer(e,t):new Buffer(e)}:Buffer.from.bind(Buffer),Buffer.alloc||(Buffer.alloc=function(e){return new Buffer(e)}),Buffer.allocUnsafe||(Buffer.allocUnsafe=function(e){return new Buffer(e)})}function C(e){return v?Buffer.alloc(e):new Array(e)}function E(e){return v?Buffer.allocUnsafe(e):new Array(e)}var S=function(e){return v?b(e,"binary"):e.split("").map(function(e){return 255&e.charCodeAt(0)})};function _(e){if("undefined"==typeof ArrayBuffer)return S(e);for(var t=new ArrayBuffer(e.length),r=new Uint8Array(t),n=0;n!=e.length;++n)r[n]=255&e.charCodeAt(n);return t}function A(e){if(Array.isArray(e))return e.map(function(e){return String.fromCharCode(e)}).join("");for(var t=[],r=0;r=0;)t+=e.charAt(r--);return t}function r(e,t){for(var r="";r.length=t?n:r("0",t-n.length)+n}function a(e,t){var n=""+e;return n.length>=t?n:r(" ",t-n.length)+n}function s(e,t){var n=""+e;return n.length>=t?n:n+r(" ",t-n.length)}e.version="0.11.2";var i=Math.pow(2,32);function o(e,t){return e>i||e<-i?function(e,t){var n=""+Math.round(e);return n.length>=t?n:r("0",t-n.length)+n}(e,t):function(e,t){var n=""+e;return n.length>=t?n:r("0",t-n.length)+n}(Math.round(e),t)}function l(e,t){return t=t||0,e.length>=7+t&&103==(32|e.charCodeAt(t))&&101==(32|e.charCodeAt(t+1))&&110==(32|e.charCodeAt(t+2))&&101==(32|e.charCodeAt(t+3))&&114==(32|e.charCodeAt(t+4))&&97==(32|e.charCodeAt(t+5))&&108==(32|e.charCodeAt(t+6))}var c=[["Sun","Sunday"],["Mon","Monday"],["Tue","Tuesday"],["Wed","Wednesday"],["Thu","Thursday"],["Fri","Friday"],["Sat","Saturday"]],f=[["J","Jan","January"],["F","Feb","February"],["M","Mar","March"],["A","Apr","April"],["M","May","May"],["J","Jun","June"],["J","Jul","July"],["A","Aug","August"],["S","Sep","September"],["O","Oct","October"],["N","Nov","November"],["D","Dec","December"]];function h(e){e[0]="General",e[1]="0",e[2]="0.00",e[3]="#,##0",e[4]="#,##0.00",e[9]="0%",e[10]="0.00%",e[11]="0.00E+00",e[12]="# ?/?",e[13]="# ??/??",e[14]="m/d/yy",e[15]="d-mmm-yy",e[16]="d-mmm",e[17]="mmm-yy",e[18]="h:mm AM/PM",e[19]="h:mm:ss AM/PM",e[20]="h:mm",e[21]="h:mm:ss",e[22]="m/d/yy h:mm",e[37]="#,##0 ;(#,##0)",e[38]="#,##0 ;[Red](#,##0)",e[39]="#,##0.00;(#,##0.00)",e[40]="#,##0.00;[Red](#,##0.00)",e[45]="mm:ss",e[46]="[h]:mm:ss",e[47]="mmss.0",e[48]="##0.0E+0",e[49]="@",e[56]='"上午/下午 "hh"時"mm"分"ss"秒 "'}var u={};h(u);var d=[],p=0;for(p=5;p<=8;++p)d[p]=32+p;for(p=23;p<=26;++p)d[p]=0;for(p=27;p<=31;++p)d[p]=14;for(p=50;p<=58;++p)d[p]=14;for(p=59;p<=62;++p)d[p]=p-58;for(p=67;p<=68;++p)d[p]=p-58;for(p=72;p<=75;++p)d[p]=p-58;for(p=67;p<=68;++p)d[p]=p-57;for(p=76;p<=78;++p)d[p]=p-56;for(p=79;p<=81;++p)d[p]=p-34;var g=[];function m(e,t,r){for(var n=e<0?-1:1,a=e*n,s=0,i=1,o=0,l=1,c=0,f=0,h=Math.floor(a);ct&&(c>t?(f=l,o=s):(f=c,o=i)),!r)return[0,n*o,f];var u=Math.floor(n*o/f);return[u,n*o-u*f,f]}function v(e,t,r){if(e>2958465||e<0)return null;var n=0|e,a=Math.floor(86400*(e-n)),s=0,i=[],o={D:n,T:a,u:86400*(e-n)-a,y:0,m:0,d:0,H:0,M:0,S:0,q:0};if(Math.abs(o.u)<1e-6&&(o.u=0),t&&t.date1904&&(n+=1462),o.u>.9999&&(o.u=0,86400==++a&&(o.T=a=0,++n,++o.D)),60===n)i=r?[1317,10,29]:[1900,2,29],s=3;else if(0===n)i=r?[1317,8,29]:[1900,1,0],s=6;else{n>60&&--n;var l=new Date(1900,0,1);l.setDate(l.getDate()+n-1),i=[l.getFullYear(),l.getMonth()+1,l.getDate()],s=l.getDay(),n<60&&(s=(s+6)%7),r&&(s=function(e,t){t[0]-=581;var r=e.getDay();return e<60&&(r=(r+6)%7),r}(l,i))}return o.y=i[0],o.m=i[1],o.d=i[2],o.S=a%60,a=Math.floor(a/60),o.M=a%60,a=Math.floor(a/60),o.H=a,o.q=s,o}g[5]=g[63]='"$"#,##0_);\\("$"#,##0\\)',g[6]=g[64]='"$"#,##0_);[Red]\\("$"#,##0\\)',g[7]=g[65]='"$"#,##0.00_);\\("$"#,##0.00\\)',g[8]=g[66]='"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',g[41]='_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)',g[42]='_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)',g[43]='_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)',g[44]='_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)',e.parse_date_code=v;var b=new Date(1899,11,31,0,0,0),w=b.getTime(),C=new Date(1900,2,1,0,0,0);function E(e,t){var r=e.getTime();return t?r-=1262304e5:e>=C&&(r+=864e5),(r-(w+6e4*(e.getTimezoneOffset()-b.getTimezoneOffset())))/864e5}e._general_int=function(e){return e.toString(10)};var S=function(){var e=/(?:\.0*|(\.\d*[1-9])0+)$/;function t(t){return-1==t.indexOf(".")?t:t.replace(e,"$1")}var r=/(?:\.0*|(\.\d*[1-9])0+)[Ee]/,n=/(E[+-])(\d)$/;return function(e){var a,s=Math.floor(Math.log(Math.abs(e))*Math.LOG10E);return a=s>=-4&&s<=-1?e.toPrecision(10+s):Math.abs(s)<=9?function(e){var r=e<0?12:11,n=t(e.toFixed(12));return n.length<=r||(n=e.toPrecision(10)).length<=r?n:e.toExponential(5)}(e):10===s?e.toFixed(10).substr(0,12):function(e){var r=t(e.toFixed(11));return r.length>(e<0?12:11)||"0"===r||"-0"===r?e.toPrecision(6):r}(e),t(function(e){return-1==e.indexOf("E")?e:e.replace(r,"$1E").replace(n,"$10$2")}(a.toUpperCase()))}}();function _(e,t){switch(typeof e){case"string":return e;case"boolean":return e?"TRUE":"FALSE";case"number":return(0|e)===e?e.toString(10):S(e);case"undefined":return"";case"object":if(null==e)return"";if(e instanceof Date)return D(14,E(e,t&&t.date1904),t)}throw new Error("unsupported value in General format: "+e)}function A(e,t,r,a){var s,i="",o=0,l=0,h=r.y,u=0;switch(e){case 98:h=r.y+543;case 121:switch(t.length){case 1:case 2:s=h%100,u=2;break;default:s=h%1e4,u=4}break;case 109:switch(t.length){case 1:case 2:s=r.m,u=t.length;break;case 3:return f[r.m-1][1];case 5:return f[r.m-1][0];default:return f[r.m-1][2]}break;case 100:switch(t.length){case 1:case 2:s=r.d,u=t.length;break;case 3:return c[r.q][0];default:return c[r.q][1]}break;case 104:switch(t.length){case 1:case 2:s=1+(r.H+11)%12,u=t.length;break;default:throw"bad hour format: "+t}break;case 72:switch(t.length){case 1:case 2:s=r.H,u=t.length;break;default:throw"bad hour format: "+t}break;case 77:switch(t.length){case 1:case 2:s=r.M,u=t.length;break;default:throw"bad minute format: "+t}break;case 115:if("s"!=t&&"ss"!=t&&".0"!=t&&".00"!=t&&".000"!=t)throw"bad second format: "+t;return 0!==r.u||"s"!=t&&"ss"!=t?(l=a>=2?3===a?1e3:100:1===a?10:1,(o=Math.round(l*(r.S+r.u)))>=60*l&&(o=0),"s"===t?0===o?"0":""+o/l:(i=n(o,2+a),"ss"===t?i.substr(0,2):"."+i.substr(2,t.length-1))):n(r.S,t.length);case 90:switch(t){case"[h]":case"[hh]":s=24*r.D+r.H;break;case"[m]":case"[mm]":s=60*(24*r.D+r.H)+r.M;break;case"[s]":case"[ss]":s=60*(60*(24*r.D+r.H)+r.M)+Math.round(r.S+r.u);break;default:throw"bad abstime format: "+t}u=3===t.length?1:2;break;case 101:s=h,u=1}return u>0?n(s,u):""}function B(e){if(e.length<=3)return e;for(var t=e.length%3,r=e.substr(0,t);t!=e.length;t+=3)r+=(r.length>0?",":"")+e.substr(t,3);return r}e._general_num=S,e._general=_;var T=function(){var e=/%/g;function i(e,t){var r,n=e.indexOf("E")-e.indexOf(".")-1;if(e.match(/^#+0.0E\+0$/)){if(0==t)return"0.0E+0";if(t<0)return"-"+i(e,-t);var a=e.indexOf(".");-1===a&&(a=e.indexOf("E"));var s=Math.floor(Math.log(t)*Math.LOG10E)%a;if(s<0&&(s+=a),-1===(r=(t/Math.pow(10,s)).toPrecision(n+1+(a+s)%a)).indexOf("e")){var o=Math.floor(Math.log(t)*Math.LOG10E);for(-1===r.indexOf(".")?r=r.charAt(0)+"."+r.substr(1)+"E+"+(o-r.length+s):r+="E+"+(o-s);"0."===r.substr(0,2);)r=(r=r.charAt(0)+r.substr(2,a)+"."+r.substr(2+a)).replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0.");r=r.replace(/\+-/,"-")}r=r.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function(e,t,r,n){return t+r+n.substr(0,(a+s)%a)+"."+n.substr(s)+"E"})}else r=t.toExponential(n);return e.match(/E\+00$/)&&r.match(/e[+-]\d$/)&&(r=r.substr(0,r.length-1)+"0"+r.charAt(r.length-1)),e.match(/E\-/)&&r.match(/e\+/)&&(r=r.replace(/e\+/,"e")),r.replace("e","E")}var l=/# (\?+)( ?)\/( ?)(\d+)/,c=/^#*0*\.([0#]+)/,f=/\).*[0#]/,h=/\(###\) ###\\?-####/;function u(e){for(var t,r="",n=0;n!=e.length;++n)switch(t=e.charCodeAt(n)){case 35:break;case 63:r+=" ";break;case 48:r+="0";break;default:r+=String.fromCharCode(t)}return r}function d(e,t){var r=Math.pow(10,t);return""+Math.round(e*r)/r}function p(e,t){var r=e-Math.floor(e),n=Math.pow(10,t);return t<(""+Math.round(r*n)).length?0:Math.round(r*n)}function g(v,b,w){if(40===v.charCodeAt(0)&&!b.match(f)){var C=b.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");return w>=0?g("n",C,w):"("+g("n",C,-w)+")"}if(44===b.charCodeAt(b.length-1))return function(e,t,r){for(var n=t.length-1;44===t.charCodeAt(n-1);)--n;return T(e,t.substr(0,n),r/Math.pow(10,3*(t.length-n)))}(v,b,w);if(-1!==b.indexOf("%"))return function(t,n,a){var s=n.replace(e,""),i=n.length-s.length;return T(t,s,a*Math.pow(10,2*i))+r("%",i)}(v,b,w);if(-1!==b.indexOf("E"))return i(b,w);if(36===b.charCodeAt(0))return"$"+g(v,b.substr(" "==b.charAt(1)?2:1),w);var E,S,_,A,k=Math.abs(w),y=w<0?"-":"";if(b.match(/^00+$/))return y+o(k,b.length);if(b.match(/^[#?]+$/))return"0"===(E=o(w,0))&&(E=""),E.length>b.length?E:u(b.substr(0,b.length-E.length))+E;if(S=b.match(l))return function(e,t,s){var i=parseInt(e[4],10),o=Math.round(t*i),l=Math.floor(o/i),c=o-l*i,f=i;return s+(0===l?"":""+l)+" "+(0===c?r(" ",e[1].length+1+e[4].length):a(c,e[1].length)+e[2]+"/"+e[3]+n(f,e[4].length))}(S,k,y);if(b.match(/^#+0+$/))return y+o(k,b.length-b.indexOf("0"));if(S=b.match(c))return E=d(w,S[1].length).replace(/^([^\.]+)$/,"$1."+u(S[1])).replace(/\.$/,"."+u(S[1])).replace(/\.(\d*)$/,function(e,t){return"."+t+r("0",u(S[1]).length-t.length)}),-1!==b.indexOf("0.")?E:E.replace(/^0\./,".");if(b=b.replace(/^#+([0.])/,"$1"),S=b.match(/^(0*)\.(#*)$/))return y+d(k,S[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,S[1].length?"0.":".");if(S=b.match(/^#{1,3},##0(\.?)$/))return y+B(o(k,0));if(S=b.match(/^#,##0\.([#0]*0)$/))return w<0?"-"+g(v,b,-w):B(""+(Math.floor(w)+function(e,t){return t<(""+Math.round((e-Math.floor(e))*Math.pow(10,t))).length?1:0}(w,S[1].length)))+"."+n(p(w,S[1].length),S[1].length);if(S=b.match(/^#,#*,#0/))return g(v,b.replace(/^#,#*,/,""),w);if(S=b.match(/^([0#]+)(\\?-([0#]+))+$/))return E=t(g(v,b.replace(/[\\-]/g,""),w)),_=0,t(t(b.replace(/\\/g,"")).replace(/[0#]/g,function(e){return _-2147483648?""+(e>=0?0|e:e-1|0):""+Math.floor(e)}(w)).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function(e){return"00,"+(e.length<3?n(0,3-e.length):"")+e})+"."+n(_,S[1].length);switch(b){case"###,##0.00":return g(v,"#,##0.00",w);case"###,###":case"##,###":case"#,###":var O=B(o(k,0));return"0"!==O?y+O:"";case"###,###.00":return g(v,"###,##0.00",w).replace(/^0\./,".");case"#,###.00":return g(v,"#,##0.00",w).replace(/^0\./,".")}throw new Error("unsupported format |"+b+"|")}function v(e,t){var r,n=e.indexOf("E")-e.indexOf(".")-1;if(e.match(/^#+0.0E\+0$/)){if(0==t)return"0.0E+0";if(t<0)return"-"+v(e,-t);var a=e.indexOf(".");-1===a&&(a=e.indexOf("E"));var s=Math.floor(Math.log(t)*Math.LOG10E)%a;if(s<0&&(s+=a),!(r=(t/Math.pow(10,s)).toPrecision(n+1+(a+s)%a)).match(/[Ee]/)){var i=Math.floor(Math.log(t)*Math.LOG10E);-1===r.indexOf(".")?r=r.charAt(0)+"."+r.substr(1)+"E+"+(i-r.length+s):r+="E+"+(i-s),r=r.replace(/\+-/,"-")}r=r.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function(e,t,r,n){return t+r+n.substr(0,(a+s)%a)+"."+n.substr(s)+"E"})}else r=t.toExponential(n);return e.match(/E\+00$/)&&r.match(/e[+-]\d$/)&&(r=r.substr(0,r.length-1)+"0"+r.charAt(r.length-1)),e.match(/E\-/)&&r.match(/e\+/)&&(r=r.replace(/e\+/,"e")),r.replace("e","E")}function b(i,o,d){if(40===i.charCodeAt(0)&&!o.match(f)){var p=o.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");return d>=0?b("n",p,d):"("+b("n",p,-d)+")"}if(44===o.charCodeAt(o.length-1))return function(e,t,r){for(var n=t.length-1;44===t.charCodeAt(n-1);)--n;return T(e,t.substr(0,n),r/Math.pow(10,3*(t.length-n)))}(i,o,d);if(-1!==o.indexOf("%"))return function(t,n,a){var s=n.replace(e,""),i=n.length-s.length;return T(t,s,a*Math.pow(10,2*i))+r("%",i)}(i,o,d);if(-1!==o.indexOf("E"))return v(o,d);if(36===o.charCodeAt(0))return"$"+b(i,o.substr(" "==o.charAt(1)?2:1),d);var g,w,C,E,S=Math.abs(d),_=d<0?"-":"";if(o.match(/^00+$/))return _+n(S,o.length);if(o.match(/^[#?]+$/))return g=""+d,0===d&&(g=""),g.length>o.length?g:u(o.substr(0,o.length-g.length))+g;if(w=o.match(l))return function(e,t,n){return n+(0===t?"":""+t)+r(" ",e[1].length+2+e[4].length)}(w,S,_);if(o.match(/^#+0+$/))return _+n(S,o.length-o.indexOf("0"));if(w=o.match(c))return g=(g=(""+d).replace(/^([^\.]+)$/,"$1."+u(w[1])).replace(/\.$/,"."+u(w[1]))).replace(/\.(\d*)$/,function(e,t){return"."+t+r("0",u(w[1]).length-t.length)}),-1!==o.indexOf("0.")?g:g.replace(/^0\./,".");if(o=o.replace(/^#+([0.])/,"$1"),w=o.match(/^(0*)\.(#*)$/))return _+(""+S).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,w[1].length?"0.":".");if(w=o.match(/^#{1,3},##0(\.?)$/))return _+B(""+S);if(w=o.match(/^#,##0\.([#0]*0)$/))return d<0?"-"+b(i,o,-d):B(""+d)+"."+r("0",w[1].length);if(w=o.match(/^#,#*,#0/))return b(i,o.replace(/^#,#*,/,""),d);if(w=o.match(/^([0#]+)(\\?-([0#]+))+$/))return g=t(b(i,o.replace(/[\\-]/g,""),d)),C=0,t(t(o.replace(/\\/g,"")).replace(/[0#]/g,function(e){return C-1||"\\"==r&&"-"==e.charAt(t+1)&&"0#".indexOf(e.charAt(t+2))>-1););break;case"?":for(;e.charAt(++t)===r;);break;case"*":++t," "!=e.charAt(t)&&"*"!=e.charAt(t)||++t;break;case"(":case")":++t;break;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":for(;t-1;);break;default:++t}return!1}function I(e,t,r,n){for(var a,s,i,o=[],c="",f=0,h="",u="t",d="H";f=12?"P":"A"),m.t="T",d="h",f+=3):"AM/PM"===e.substr(f,5).toUpperCase()?(null!=a&&(m.v=a.H>=12?"PM":"AM"),m.t="T",f+=5,d="h"):"上午/下午"===e.substr(f,5).toUpperCase()?(null!=a&&(m.v=a.H>=12?"下午":"上午"),m.t="T",f+=5,d="h"):(m.t="t",++f),null==a&&"T"===m.t)return"";o[o.length]=m,u=h;break;case"[":for(c=h;"]"!==e.charAt(f++)&&f-1&&(c=(c.match(/\$([^-\[\]]*)/)||[])[1]||"$",x(e)||(o[o.length]={t:"t",v:c}));break;case".":if(null!=a){for(c=h;++f-1;)c+=h;o[o.length]={t:"n",v:c};break;case"?":for(c=h;e.charAt(++f)===h;)c+=h;o[o.length]={t:h,v:c},u=h;break;case"*":++f," "!=e.charAt(f)&&"*"!=e.charAt(f)||++f;break;case"(":case")":o[o.length]={t:1===n?"t":h,v:h},++f;break;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":for(c=h;f-1;)c+=e.charAt(f);o[o.length]={t:"D",v:c};break;case" ":o[o.length]={t:h,v:h},++f;break;case"$":o[o.length]={t:"t",v:"$"},++f;break;default:if(-1===",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP".indexOf(h))throw new Error("unrecognized character "+h+" in "+e);o[o.length]={t:"t",v:h},++f}var b,w=0,C=0;for(f=o.length-1,u="t";f>=0;--f)switch(o[f].t){case"h":case"H":o[f].t=d,u="h",w<1&&(w=1);break;case"s":(b=o[f].v.match(/\.0+$/))&&(C=Math.max(C,b[0].length-1)),w<3&&(w=3);case"d":case"y":case"M":case"e":u=o[f].t;break;case"m":"s"===u&&(o[f].t="M",w<2&&(w=2));break;case"X":break;case"Z":w<1&&o[f].v.match(/[Hh]/)&&(w=1),w<2&&o[f].v.match(/[Mm]/)&&(w=2),w<3&&o[f].v.match(/[Ss]/)&&(w=3)}switch(w){case 0:break;case 1:a.u>=.5&&(a.u=0,++a.S),a.S>=60&&(a.S=0,++a.M),a.M>=60&&(a.M=0,++a.H);break;case 2:a.u>=.5&&(a.u=0,++a.S),a.S>=60&&(a.S=0,++a.M)}var E,S="";for(f=0;f0){40==S.charCodeAt(0)?(B=t<0&&45===S.charCodeAt(0)?-t:t,k=T("n",S,B)):(k=T("n",S,B=t<0&&n>1?-t:t),B<0&&o[0]&&"t"==o[0].t&&(k=k.substr(1),o[0].v="-"+o[0].v)),E=k.length-1;var R=o.length;for(f=0;f-1){R=f;break}var O=o.length;if(R===o.length&&-1===k.indexOf("E")){for(f=o.length-1;f>=0;--f)null!=o[f]&&-1!=="n?".indexOf(o[f].t)&&(E>=o[f].v.length-1?(E-=o[f].v.length,o[f].v=k.substr(E+1,o[f].v.length)):E<0?o[f].v="":(o[f].v=k.substr(0,E+1),E=-1),o[f].t="t",O=f);E>=0&&O=0;--f)if(null!=o[f]&&-1!=="n?".indexOf(o[f].t)){for(s=o[f].v.indexOf(".")>-1&&f===R?o[f].v.indexOf(".")-1:o[f].v.length-1,I=o[f].v.substr(s+1);s>=0;--s)E>=0&&("0"===o[f].v.charAt(s)||"#"===o[f].v.charAt(s))&&(I=k.charAt(E--)+I);o[f].v=I,o[f].t="t",O=f}for(E>=0&&O-1&&f===R?o[f].v.indexOf(".")+1:0,I=o[f].v.substr(0,s);s-1&&(B=n>1&&t<0&&f>0&&"-"===o[f-1].v?-t:t,o[f].v=T(o[f].t,o[f].v,B),o[f].t="t");var F="";for(f=0;f!==o.length;++f)null!=o[f]&&(F+=o[f].v);return F}e.is_date=x,e._eval=I;var R=/\[[=<>]/,O=/\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/;function F(e,t){if(null==t)return!1;var r=parseFloat(t[2]);switch(t[1]){case"=":if(e==r)return!0;break;case">":if(e>r)return!0;break;case"<":if(e":if(e!=r)return!0;break;case">=":if(e>=r)return!0;break;case"<=":if(e<=r)return!0}return!1}function D(e,t,r){null==r&&(r={});var n="";switch(typeof e){case"string":n="m/d/yy"==e&&r.dateNF?r.dateNF:e;break;case"number":null==(n=14==e&&r.dateNF?r.dateNF:(null!=r.table?r.table:u)[e])&&(n=r.table&&r.table[d[e]]||u[d[e]]),null==n&&(n=g[e]||"General")}if(l(n,0))return _(t,r);t instanceof Date&&(t=E(t,r.date1904));var a=function(e,t){var r=k(e),n=r.length,a=r[n-1].indexOf("@");if(n<4&&a>-1&&--n,r.length>4)throw new Error("cannot find right format for |"+r.join("|")+"|");if("number"!=typeof t)return[4,4===r.length||a>-1?r[r.length-1]:"@"];switch(r.length){case 1:r=a>-1?["General","General","General",r[0]]:[r[0],r[0],r[0],"@"];break;case 2:r=a>-1?[r[0],r[0],r[0],r[1]]:[r[0],r[1],r[0],"@"];break;case 3:r=a>-1?[r[0],r[1],r[0],r[2]]:[r[0],r[1],r[2],"@"]}var s=t>0?r[0]:t<0?r[1]:r[2];if(-1===r[0].indexOf("[")&&-1===r[1].indexOf("["))return[n,s];if(null!=r[0].match(R)||null!=r[1].match(R)){var i=r[0].match(O),o=r[1].match(O);return F(t,i)?[n,r[0]]:F(t,o)?[n,r[1]]:[n,r[null!=i&&null!=o?2:1]]}return[n,s]}(n,t);if(l(a[1]))return _(t,r);if(!0===t)t="TRUE";else if(!1===t)t="FALSE";else if(""===t||null==t)return"";return I(a[1],t,r,a[0])}function N(e,t){if("number"!=typeof t){t=+t||-1;for(var r=0;r<392;++r)if(null!=u[r]){if(u[r]==e){t=r;break}}else t<0&&(t=r);t<0&&(t=391)}return u[t]=e,t}e.load=N,e._table=u,e.get_table=function(){return u},e.load_table=function(e){for(var t=0;392!=t;++t)void 0!==e[t]&&N(e[t],t)},e.init_table=h,e.format=D};I(x);var R,O={"General Number":"General","General Date":x._table[22],"Long Date":"dddd, mmmm dd, yyyy","Medium Date":x._table[15],"Short Date":x._table[14],"Long Time":x._table[19],"Medium Time":x._table[18],"Short Time":x._table[20],Currency:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',Fixed:x._table[2],Standard:x._table[4],Percent:x._table[10],Scientific:x._table[11],"Yes/No":'"Yes";"Yes";"No";@',"True/False":'"True";"True";"False";@',"On/Off":'"Yes";"Yes";"No";@'},F={5:'"$"#,##0_);\\("$"#,##0\\)',6:'"$"#,##0_);[Red]\\("$"#,##0\\)',7:'"$"#,##0.00_);\\("$"#,##0.00\\)',8:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',23:"General",24:"General",25:"General",26:"General",27:"m/d/yy",28:"m/d/yy",29:"m/d/yy",30:"m/d/yy",31:"m/d/yy",32:"h:mm:ss",33:"h:mm:ss",34:"h:mm:ss",35:"h:mm:ss",36:"m/d/yy",41:'_(* #,##0_);_(* (#,##0);_(* "-"_);_(@_)',42:'_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)',43:'_(* #,##0.00_);_(* (#,##0.00);_(* "-"??_);_(@_)',44:'_("$"* #,##0.00_);_("$"* (#,##0.00);_("$"* "-"??_);_(@_)',50:"m/d/yy",51:"m/d/yy",52:"m/d/yy",53:"m/d/yy",54:"m/d/yy",55:"m/d/yy",56:"m/d/yy",57:"m/d/yy",58:"m/d/yy",59:"0",60:"0.00",61:"#,##0",62:"#,##0.00",63:'"$"#,##0_);\\("$"#,##0\\)',64:'"$"#,##0_);[Red]\\("$"#,##0\\)',65:'"$"#,##0.00_);\\("$"#,##0.00\\)',66:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',67:"0%",68:"0.00%",69:"# ?/?",70:"# ??/??",71:"m/d/yy",72:"m/d/yy",73:"d-mmm-yy",74:"d-mmm",75:"mmm-yy",76:"h:mm",77:"h:mm:ss",78:"m/d/yy h:mm",79:"mm:ss",80:"[h]:mm:ss",81:"mmss.0"},D=/[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g;!function(e){e.version="1.2.0";var t=function(){for(var e=0,t=new Array(256),r=0;256!=r;++r)e=1&(e=1&(e=1&(e=1&(e=1&(e=1&(e=1&(e=1&(e=r)?-306674912^e>>>1:e>>>1)?-306674912^e>>>1:e>>>1)?-306674912^e>>>1:e>>>1)?-306674912^e>>>1:e>>>1)?-306674912^e>>>1:e>>>1)?-306674912^e>>>1:e>>>1)?-306674912^e>>>1:e>>>1)?-306674912^e>>>1:e>>>1,t[r]=e;return"undefined"!=typeof Int32Array?new Int32Array(t):t}();e.table=t,e.bstr=function(e,r){for(var n=-1^r,a=e.length-1,s=0;s>>8^t[255&(n^e.charCodeAt(s++))])>>>8^t[255&(n^e.charCodeAt(s++))];return s===a&&(n=n>>>8^t[255&(n^e.charCodeAt(s))]),-1^n},e.buf=function(e,r){if(e.length>1e4)return function(e,r){for(var n=-1^r,a=e.length-7,s=0;s>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])];for(;s>>8^t[255&(n^e[s++])];return-1^n}(e,r);for(var n=-1^r,a=e.length-3,s=0;s>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])];for(;s>>8^t[255&(n^e[s++])];return-1^n},e.str=function(e,r){for(var n,a,s=-1^r,i=0,o=e.length;i>>8^t[255&(s^n)]:n<2048?s=(s=s>>>8^t[255&(s^(192|n>>6&31))])>>>8^t[255&(s^(128|63&n))]:n>=55296&&n<57344?(n=64+(1023&n),a=1023&e.charCodeAt(i++),s=(s=(s=(s=s>>>8^t[255&(s^(240|n>>8&7))])>>>8^t[255&(s^(128|n>>2&63))])>>>8^t[255&(s^(128|a>>6&15|(3&n)<<4))])>>>8^t[255&(s^(128|63&a))]):s=(s=(s=s>>>8^t[255&(s^(224|n>>12&15))])>>>8^t[255&(s^(128|n>>6&63))])>>>8^t[255&(s^(128|63&n))];return-1^s}}(R={});var N,P=function(){var e,t={};function n(e){if("/"==e.charAt(e.length-1))return-1===e.slice(0,-1).indexOf("/")?e:n(e.slice(0,-1));var t=e.lastIndexOf("/");return-1===t?e:e.slice(0,t+1)}function a(e){if("/"==e.charAt(e.length-1))return a(e.slice(0,-1));var t=e.lastIndexOf("/");return-1===t?e:e.slice(t+1)}function s(e,t){"string"==typeof t&&(t=new Date(t));var r=t.getHours();r=(r=r<<6|t.getMinutes())<<5|t.getSeconds()>>>1,e.write_shift(2,r);var n=t.getFullYear()-1980;n=(n=n<<4|t.getMonth()+1)<<5|t.getDate(),e.write_shift(2,n)}function i(e){Mt(e,0);for(var t={},r=0;e.l<=e.length-4;){var n=e.read_shift(2),a=e.read_shift(2),s=e.l+a,i={};21589===n&&(1&(r=e.read_shift(1))&&(i.mtime=e.read_shift(4)),a>5&&(2&r&&(i.atime=e.read_shift(4)),4&r&&(i.ctime=e.read_shift(4))),i.mtime&&(i.mt=new Date(1e3*i.mtime))),e.l=s,t[n]=i}return t}function o(){return e||(e=r(7233))}function l(e,t){if(80==e[0]&&75==e[1])return fe(e,t);if(e.length<512)throw new Error("CFB file size "+e.length+" < 512");var r,n,a,s,i,o,l=512,d=[],p=e.slice(0,512);Mt(p,0);var g=function(e){if(80==e[e.l]&&75==e[e.l+1])return[0,0];e.chk(A,"Header Signature: "),e.l+=16;var t=e.read_shift(2,"u");return[e.read_shift(2,"u"),t]}(p);switch(r=g[0]){case 3:l=512;break;case 4:l=4096;break;case 0:if(0==g[1])return fe(e,t);default:throw new Error("Major Version: Expected 3 or 4 saw "+r)}512!==l&&Mt(p=e.slice(0,l),28);var m=e.slice(0,l);!function(e,t){var r;switch(e.l+=2,r=e.read_shift(2)){case 9:if(3!=t)throw new Error("Sector Shift: Expected 9 saw "+r);break;case 12:if(4!=t)throw new Error("Sector Shift: Expected 12 saw "+r);break;default:throw new Error("Sector Shift: Expected 9 or 12 saw "+r)}e.chk("0600","Mini Sector Shift: "),e.chk("000000000000","Reserved: ")}(p,r);var v=p.read_shift(4,"i");if(3===r&&0!==v)throw new Error("# Directory Sectors: Expected 0 saw "+v);p.l+=4,s=p.read_shift(4,"i"),p.l+=4,p.chk("00100000","Mini Stream Cutoff Size: "),i=p.read_shift(4,"i"),n=p.read_shift(4,"i"),o=p.read_shift(4,"i"),a=p.read_shift(4,"i");for(var b=-1,w=0;w<109&&!((b=p.read_shift(4,"i"))<0);++w)d[w]=b;var C=function(e,t){for(var r=Math.ceil(e.length/t)-1,n=[],a=1;a=a&&(u-=a),!i[u]){l=[];var p=[];for(h=u;h>=0;){p[h]=!0,i[h]=!0,o[o.length]=h,l.push(e[h]);var g=r[Math.floor(4*h/n)];if(n<4+(d=4*h&c))throw new Error("FAT boundary crossed: "+h+" 4 "+n);if(!e[g])break;if(p[h=It(e[g],d)])break}s[u]={nodes:o,data:ot([l])}}return s}(C,s,d,l);E[s].name="!Directory",n>0&&i!==_&&(E[i].name="!MiniFAT"),E[d[0]].name="!FAT",E.fat_addrs=d,E.ssz=l;var S=[],B=[],T=[];!function(e,t,r,n,a,s,i,o){for(var l,f=0,d=n.length?2:0,p=t[e].data,g=0,m=0;g0&&f!==_&&(t[f].name="!StreamData")):b.size>=4096?(b.storage="fat",void 0===t[b.start]&&(t[b.start]=h(r,b.start,t.fat_addrs,t.ssz)),t[b.start].name=b.name,b.content=t[b.start].data.slice(0,b.size)):(b.storage="minifat",b.size<0?b.size=0:f!==_&&b.start!==_&&t[f]&&(b.content=c(b,t[f].data,(t[o]||{}).data))),b.content&&Mt(b.content,0),s[l]=b,i.push(b)}}(s,E,C,S,n,{},B,i),function(e,t,r){for(var n=0,a=0,s=0,i=0,o=0,l=r.length,c=[],f=[];n0&&i>=0;)s.push(t.slice(i*w,i*w+w)),a-=w,i=It(r,4*i);return 0===s.length?zt(0):T(s).slice(0,e.size)}function f(e,t,r,n,a){var s=_;if(e===_){if(0!==t)throw new Error("DIFAT chain shorter than expected")}else if(-1!==e){var i=r[e],o=(n>>>2)-1;if(!i)return;for(var l=0;l=1&&f(It(i,n-4),t-1,r,n,a)}}function h(e,t,r,n,a){var s=[],i=[];a||(a=[]);var o=n-1,l=0,c=0;for(l=t;l>=0;){a[l]=!0,s[s.length]=l,i.push(e[l]);var f=r[Math.floor(4*l/n)];if(n<4+(c=4*l&o))throw new Error("FAT boundary crossed: "+l+" 4 "+n);if(!e[f])break;l=It(e[f],c)}return{nodes:s,data:ot([i])}}function u(e,t){return new Date(1e3*(xt(e,t+4)/1e7*Math.pow(2,32)+xt(e,t)/1e7-11644473600))}function d(e,t){var r=t||{},n=r.root||"Root Entry";if(e.FullPaths||(e.FullPaths=[]),e.FileIndex||(e.FileIndex=[]),e.FullPaths.length!==e.FileIndex.length)throw new Error("inconsistent CFB structure");0===e.FullPaths.length&&(e.FullPaths[0]=n+"/",e.FileIndex[0]={name:n,type:5}),r.CLSID&&(e.FileIndex[0].clsid=r.CLSID),function(e){var t="Sh33tJ5";if(!P.find(e,"/"+t)){var r=zt(4);r[0]=55,r[1]=r[3]=50,r[2]=54,e.FileIndex.push({name:t,type:2,content:r,size:4,L:69,R:69,C:69}),e.FullPaths.push(e.FullPaths[0]+t),p(e)}}(e)}function p(e,t){d(e);for(var r=!1,s=!1,i=e.FullPaths.length-1;i>=0;--i){var o=e.FileIndex[i];switch(o.type){case 0:s?r=!0:(e.FileIndex.pop(),e.FullPaths.pop());break;case 1:case 2:case 5:s=!0,isNaN(o.R*o.L*o.C)&&(r=!0),o.R>-1&&o.L>-1&&o.R==o.L&&(r=!0);break;default:r=!0}}if(r||t){var l=new Date(1987,1,19),c=0,f=[];for(i=0;i1?1:-1,u.size=0,u.type=5;else if("/"==p.slice(-1)){for(c=i+1;c=f.length?-1:c,c=i+1;c=f.length?-1:c,u.type=1}else n(e.FullPaths[i+1]||"")==n(p)&&(u.R=i+1),u.type=2}}}function g(e,t){var r=t||{};if(p(e),"zip"==r.fileType)return function(e,t){var r=t||{},n=[],a=[],i=zt(1),o=r.compression?8:0,l=0,c=0,f=0,h=0,u=e.FullPaths[0],d=u,p=e.FileIndex[0],g=[],m=0;for(l=1;l0&&(s<4096?t+=s+63>>6:r+=s+511>>9)}}for(var i=e.FullPaths.length+3>>2,o=t+127>>7,l=(t+7>>3)+r+i+o,c=l+127>>7,f=c<=109?0:Math.ceil((c-109)/127);l+c+f+127>>7>c;)f=++c<=109?0:Math.ceil((c-109)/127);var h=[1,f,c,o,i,r,t,0];return e.FileIndex[0].size=t<<6,h[7]=(e.FileIndex[0].start=h[0]+h[1]+h[2]+h[3]+h[4]+h[5])+(h[6]+7>>3),h}(e),a=zt(n[7]<<9),i=0,o=0;for(i=0;i<8;++i)a.write_shift(1,B[i]);for(i=0;i<8;++i)a.write_shift(2,0);for(a.write_shift(2,62),a.write_shift(2,3),a.write_shift(2,65534),a.write_shift(2,9),a.write_shift(2,6),i=0;i<3;++i)a.write_shift(2,0);for(a.write_shift(4,0),a.write_shift(4,n[2]),a.write_shift(4,n[0]+n[1]+n[2]+n[3]-1),a.write_shift(4,0),a.write_shift(4,4096),a.write_shift(4,n[3]?n[0]+n[1]+n[2]-1:_),a.write_shift(4,n[3]),a.write_shift(-4,n[1]?n[0]-1:_),a.write_shift(4,n[1]),i=0;i<109;++i)a.write_shift(-4,i>9)));for(l(n[6]+7>>3);511&a.l;)a.write_shift(-4,I.ENDOFCHAIN);for(o=i=0,c=0;c=4096||(h.start=o,l(f+63>>6)));for(;511&a.l;)a.write_shift(-4,I.ENDOFCHAIN);for(i=0;i=4096){for(a.l=h.start+1<<9,c=0;c0&&h.size<4096){for(c=0;c>16|t>>8|t)}for(var U="undefined"!=typeof Uint8Array,z=U?new Uint8Array(256):[],H=0;H<256;++H)z[H]=M(H);function W(e,t){var r=z[255&e];return t<=8?r>>>8-t:(r=r<<8|z[e>>8&255],t<=16?r>>>16-t:(r=r<<8|z[e>>16&255])>>>24-t)}function V(e,t){var r=7&t,n=t>>>3;return(e[n]|(r<=6?0:e[n+1]<<8))>>>r&3}function X(e,t){var r=7&t,n=t>>>3;return(e[n]|(r<=5?0:e[n+1]<<8))>>>r&7}function G(e,t){var r=7&t,n=t>>>3;return(e[n]|(r<=3?0:e[n+1]<<8))>>>r&31}function j(e,t){var r=7&t,n=t>>>3;return(e[n]|(r<=1?0:e[n+1]<<8))>>>r&127}function K(e,t,r){var n=7&t,a=t>>>3,s=(1<>>n;return r<8-n?i&s:(i|=e[a+1]<<8-n,r<16-n?i&s:(i|=e[a+2]<<16-n,r<24-n?i&s:(i|=e[a+3]<<24-n)&s))}function $(e,t){var r=e.length,n=2*r>t?2*r:t+5,a=0;if(r>=t)return e;if(v){var s=E(n);if(e.copy)e.copy(s);else for(;a0;)t[t.l++]=e[r++]}return t.l},function(e){var t=zt(50+Math.floor(1.1*e.length)),r=Z(e,t);return t.slice(0,r)});function J(e,t,r){var n=1,a=0,s=0,i=0,o=0,l=e.length,c=U?new Uint16Array(32):Y(32);for(s=0;s<32;++s)c[s]=0;for(s=l;s>n-h,i=(1<=0;--i)t[o|i<>>3;return(e[n]|(r<=4?0:e[n+1]<<8))>>>r&15}(e,t+=5)+4;t+=4;for(var s=0,i=U?new Uint8Array(19):Y(19),o=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],l=1,c=U?new Uint8Array(8):Y(8),f=U?new Uint8Array(8):Y(8),h=i.length,u=0;u>8-p;for(var g=(1<<7-p)-1;g>=0;--g)ae[d|g<>>=3){case 16:for(s=3+V(e,t),t+=2,d=m[m.length-1];s-- >0;)m.push(d);break;case 17:for(s=3+X(e,t),t+=3;s-- >0;)m.push(0);break;case 18:for(s=11+j(e,t),t+=7;s-- >0;)m.push(0);break;default:m.push(d),l>>0,o=0,l=0;!(1&n);)if(n=X(e,r),r+=3,n>>>1!=0)for(n>>>1==1?(o=9,l=5):(r=oe(e,r),o=se,l=ie),!t&&i>>1==1?q[c]:re[c];if(r+=15&f,(f>>>=4)>>>8&255){if(256==f)break;var h=(f-=257)<8?0:f-4>>2;h>5&&(h=0);var u=s+N[f];h>0&&(u+=K(e,r,h),r+=h),c=K(e,r,l),r+=15&(f=n>>>1==1?ee[c]:ne[c]);var d=(f>>>=4)<4?0:f-2>>1,p=L[f];for(d>0&&(p+=K(e,r,d),r+=d),!t&&i>>3]|e[(r>>>3)+1]<<8;if(r+=32,!t&&i>>3,(r>>>3)+g),s+=g,r+=8*g;else for(;g-- >0;)a[s++]=e[r>>>3],r+=8}return[t?a:a.slice(0,s),r+7>>>3]}(e.slice(e.l||0),t);return e.l+=r[1],r[0]}function ce(e,t){if(!e)throw new Error(t);"undefined"!=typeof console&&console.error(t)}function fe(e,t){var r=e;Mt(r,0);var n={FileIndex:[],FullPaths:[]};d(n,{root:t.root});for(var a=r.length-4;(80!=r[a]||75!=r[a+1]||5!=r[a+2]||6!=r[a+3])&&a>=0;)--a;r.l=a+4,r.l+=4;var s=r.read_shift(2);r.l+=6;var o=r.read_shift(4);for(r.l=o,a=0;a>>=5);r>>>=4,n.setMilliseconds(0),n.setFullYear(r+1980),n.setMonth(s-1),n.setDate(a);var i=31&t,o=63&(t>>>=5);return t>>>=6,n.setHours(t),n.setMinutes(o),n.setSeconds(i<<1),n}(e);if(8257&s)throw new Error("Unsupported ZIP encryption");for(var c=e.read_shift(4),f=e.read_shift(4),h=e.read_shift(4),u=e.read_shift(2),d=e.read_shift(2),p="",g=0;g3&&(n=!0),a[s].slice(a[s].length-1)){case"Y":throw new Error("Unsupported ISO Duration Field: "+a[s].slice(a[s].length-1));case"D":r*=24;case"H":r*=60;case"M":if(!n)throw new Error("Unsupported ISO Duration Field: M");r*=60}t+=r*parseInt(a[s],10)}return t}var Q=new Date("2017-02-19T19:06:09.000Z");isNaN(Q.getFullYear())&&(Q=new Date("2/19/17"));var J=2017==Q.getFullYear();function q(e,t){var r=new Date(e);if(J)return t>0?r.setTime(r.getTime()+60*r.getTimezoneOffset()*1e3):t<0&&r.setTime(r.getTime()-60*r.getTimezoneOffset()*1e3),r;if(e instanceof Date)return e;if(1917==Q.getFullYear()&&!isNaN(r.getFullYear())){var n=r.getFullYear();return e.indexOf(""+n)>-1||r.setFullYear(r.getFullYear()+100),r}var a=e.match(/\d+/g)||["2017","2","19","0","0","0"],s=new Date(+a[0],+a[1]-1,+a[2],+a[3]||0,+a[4]||0,+a[5]||0);return e.indexOf("Z")>-1&&(s=new Date(s.getTime()-60*s.getTimezoneOffset()*1e3)),s}function ee(e){for(var t="",r=0;r!=e.length;++r)t+=String.fromCharCode(e[r]);return t}function te(e){if("undefined"!=typeof JSON&&!Array.isArray(e))return JSON.parse(JSON.stringify(e));if("object"!=typeof e||null==e)return e;if(e instanceof Date)return new Date(e.getTime());var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=te(e[r]));return t}function re(e,t){for(var r="";r.length8099?r:(a>0||s>1)&&101!=n||e.toLowerCase().match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)?t:e.match(/[^-0-9:,\/\\]/)?r:t}var se,ie=5=="abacaba".split(/(:?b)/i).length;function oe(e){return e?e.data?u(e.data):e.asNodeBuffer&&v?u(e.asNodeBuffer().toString("binary")):e.asBinary?u(e.asBinary()):e._data&&e._data.getContent?u(ee(Array.prototype.slice.call(e._data.getContent(),0))):e.content&&e.type?u(ee(e.content)):null:null}function le(e,t){for(var r=e.FullPaths||U(e.files),n=t.toLowerCase().replace(/[\/]/g,"\\"),a=n.replace(/\\/g,"/"),s=0;s\/]+)\s*=\s*((?:")([^"]*)(?:")|(?:')([^']*)(?:')|([^'">\s]+))/g,be=/<[\/\?]?[a-zA-Z0-9:_-]+(?:\s+[^"\s?>\/]+\s*=\s*(?:"[^"]*"|'[^']*'|[^'">\s=]+))*\s*[\/\?]?>/gm;me.match(be)||(be=/<[^>]*>/g);var we=/<\w*:/,Ce=/<(\/?)\w+:/;function Ee(e,t,r){for(var n={},a=0,s=0;a!==e.length&&32!==(s=e.charCodeAt(a))&&10!==s&&13!==s;++a);if(t||(n[0]=e.slice(0,a)),a===e.length)return n;var i=e.match(ve),o=0,l="",c=0,f="",h="",u=1;if(i)for(c=0;c!=i.length;++c){for(h=i[c],s=0;s!=h.length&&61!==h.charCodeAt(s);++s);for(f=h.slice(0,s).trim();32==h.charCodeAt(s+1);)++s;for(u=34==(a=h.charCodeAt(s+1))||39==a?1:0,l=h.slice(s+1+u,h.length-u),o=0;o!=f.length&&58!==f.charCodeAt(o);++o);if(o===f.length)f.indexOf("_")>0&&(f=f.slice(0,f.indexOf("_"))),n[f]=l,r||(n[f.toLowerCase()]=l);else{var d=(5===o&&"xmlns"===f.slice(0,5)?"xmlns":"")+f.slice(o+1);if(n[d]&&"ext"==f.slice(o-3,o))continue;n[d]=l,r||(n[d.toLowerCase()]=l)}}return n}function Se(e){return e.replace(Ce,"<$1")}var _e,Ae,Be={""":'"',"'":"'",">":">","<":"<","&":"&"},Te=H(Be),ke=(_e=/&(?:quot|apos|gt|lt|amp|#x?([\da-fA-F]+));/gi,Ae=/_x([\da-fA-F]{4})_/gi,function e(t){var r=t+"",n=r.indexOf("-1?16:10))||e}).replace(Ae,function(e,t){return String.fromCharCode(parseInt(t,16))});var a=r.indexOf("]]>");return e(r.slice(0,n))+r.slice(n+9,a)+e(r.slice(a+3))}),ye=/[&<>'"]/g,xe=/[\u0000-\u0008\u000b-\u001f]/g;function Ie(e){return(e+"").replace(ye,function(e){return Te[e]}).replace(xe,function(e){return"_x"+("000"+e.charCodeAt(0).toString(16)).slice(-4)+"_"})}function Re(e){return Ie(e).replace(/ /g,"_x0020_")}var Oe=/[\u0000-\u001f]/g;function Fe(e){return(e+"").replace(ye,function(e){return Te[e]}).replace(/\n/g,"
").replace(Oe,function(e){return"&#x"+("000"+e.charCodeAt(0).toString(16)).slice(-4)+";"})}var De=function(){var e=/&#(\d+);/g;function t(e,t){return String.fromCharCode(parseInt(t,10))}return function(r){return r.replace(e,t)}}();function Ne(e){switch(e){case 1:case!0:case"1":case"true":case"TRUE":return!0;default:return!1}}var Pe=function(e){for(var t="",r=0,n=0,a=0,s=0,i=0,o=0;r191&&n<224?(i=(31&n)<<6,i|=63&a,t+=String.fromCharCode(i)):(s=e.charCodeAt(r++),n<240?t+=String.fromCharCode((15&n)<<12|(63&a)<<6|63&s):(o=((7&n)<<18|(63&a)<<12|(63&s)<<6|63&(i=e.charCodeAt(r++)))-65536,t+=String.fromCharCode(55296+(o>>>10&1023)),t+=String.fromCharCode(56320+(1023&o)))));return t},Le=function(e){for(var t=[],r=0,n=0,a=0;r>6))),t.push(String.fromCharCode(128+(63&n)));break;case n>=55296&&n<57344:n-=55296,a=e.charCodeAt(r++)-56320+(n<<10),t.push(String.fromCharCode(240+(a>>18&7))),t.push(String.fromCharCode(144+(a>>12&63))),t.push(String.fromCharCode(128+(a>>6&63))),t.push(String.fromCharCode(128+(63&a)));break;default:t.push(String.fromCharCode(224+(n>>12))),t.push(String.fromCharCode(128+(n>>6&63))),t.push(String.fromCharCode(128+(63&n)))}return t.join("")};if(v){var Me=function(e){var t,r,n,a=Buffer.alloc(2*e.length),s=1,i=0,o=0;for(r=0;r>>10&1023),t=56320+(1023&t)),0!==o&&(a[i++]=255&o,a[i++]=o>>>8,o=0),a[i++]=t%256,a[i++]=t>>>8;return a.slice(0,i).toString("ucs2")},Ue="foo bar baz☃🍣";Pe(Ue)==Me(Ue)&&(Pe=Me);var ze=function(e){return b(e,"binary").toString("utf8")};Pe(Ue)==ze(Ue)&&(Pe=ze),Le=function(e){return b(e,"utf8").toString("binary")}}var He,We,Ve,Xe=(He={},function(e,t){var r=e+"|"+(t||"");return He[r]?He[r]:He[r]=new RegExp("<(?:\\w+:)?"+e+'(?: xml:space="preserve")?(?:[^>]*)>([\\s\\S]*?)",t||"")}),Ge=(We=[["nbsp"," "],["middot","·"],["quot",'"'],["apos","'"],["gt",">"],["lt","<"],["amp","&"]].map(function(e){return[new RegExp("&"+e[0]+";","ig"),e[1]]}),function(e){for(var t=e.replace(/^[\t\n\r ]+/,"").replace(/[\t\n\r ]+$/,"").replace(/>\s+/g,">").replace(/\s+/g,"\n").replace(/<[^>]*>/g,""),r=0;r([\\s\\S]*?)","g")}),Ke=/<\/?(?:vt:)?variant>/g,$e=/<(?:vt:)([^>]*)>([\s\S]*)"+t+""}function Je(e){return U(e).map(function(t){return" "+t+'="'+e[t]+'"'}).join("")}function qe(e,t,r){return"<"+e+(null!=r?Je(r):"")+(null!=t?(t.match(Ze)?' xml:space="preserve"':"")+">"+t+""}function et(e,t){try{return e.toISOString().replace(/\.\d*/,"")}catch(e){if(t)throw e}return""}var tt,rt,nt={dc:"http://purl.org/dc/elements/1.1/",dcterms:"http://purl.org/dc/terms/",dcmitype:"http://purl.org/dc/dcmitype/",mx:"http://schemas.microsoft.com/office/mac/excel/2008/main",r:"http://schemas.openxmlformats.org/officeDocument/2006/relationships",sjs:"http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties",vt:"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes",xsi:"http://www.w3.org/2001/XMLSchema-instance",xsd:"http://www.w3.org/2001/XMLSchema",main:["http://schemas.openxmlformats.org/spreadsheetml/2006/main","http://purl.oclc.org/ooxml/spreadsheetml/main","http://schemas.microsoft.com/office/excel/2006/main","http://schemas.microsoft.com/office/excel/2006/2"]},at="urn:schemas-microsoft-com:office:office",st="urn:schemas-microsoft-com:office:excel",it="urn:schemas-microsoft-com:office:spreadsheet",ot=function(e){for(var t=[],r=0;r0?dt(e,t+4,t+4+r-1):""},mt=gt,vt=function(e,t){var r=xt(e,t);return r>0?dt(e,t+4,t+4+r-1):""},bt=vt,wt=function(e,t){var r=2*xt(e,t);return r>0?dt(e,t+4,t+4+r-1):""},Ct=wt;tt=rt=function(e,t){var r=xt(e,t);return r>0?ct(e,t+4,t+4+r):""};var Et,St,_t=function(e,t){var r=xt(e,t);return r>0?dt(e,t+4,t+4+r):""},At=_t;Et=St=function(e,t){return function(e,t){for(var r=1-2*(e[t+7]>>>7),n=((127&e[t+7])<<4)+(e[t+6]>>>4&15),a=15&e[t+6],s=5;s>=0;--s)a=256*a+e[t+s];return 2047==n?0==a?r*(1/0):NaN:(0==n?n=-1022:(n-=1023,a+=Math.pow(2,52)),r*Math.pow(2,n-52)*a)}(e,t)};var Bt=function(e){return Array.isArray(e)};v&&(ct=function(e,t,r){return Buffer.isBuffer(e)?e.toString("utf16le",t,r).replace(k,""):ft(e,t,r)},ht=function(e,t,r){return Buffer.isBuffer(e)?e.toString("hex",t,t+r):ut(e,t,r)},gt=function(e,t){if(!Buffer.isBuffer(e))return mt(e,t);var r=e.readUInt32LE(t);return r>0?e.toString("utf8",t+4,t+4+r-1):""},vt=function(e,t){if(!Buffer.isBuffer(e))return bt(e,t);var r=e.readUInt32LE(t);return r>0?e.toString("utf8",t+4,t+4+r-1):""},wt=function(e,t){if(!Buffer.isBuffer(e))return Ct(e,t);var r=2*e.readUInt32LE(t);return e.toString("utf16le",t+4,t+4+r-1)},tt=function(e,t){if(!Buffer.isBuffer(e))return rt(e,t);var r=e.readUInt32LE(t);return e.toString("utf16le",t+4,t+4+r)},_t=function(e,t){if(!Buffer.isBuffer(e))return At(e,t);var r=e.readUInt32LE(t);return e.toString("utf8",t+4,t+4+r)},dt=function(e,t,r){return Buffer.isBuffer(e)?e.toString("utf8",t,r):pt(e,t,r)},ot=function(e){return e[0].length>0&&Buffer.isBuffer(e[0][0])?Buffer.concat(e[0]):lt(e)},T=function(e){return Buffer.isBuffer(e[0])?Buffer.concat(e):[].concat.apply([],e)},Et=function(e,t){return Buffer.isBuffer(e)?e.readDoubleLE(t):St(e,t)},Bt=function(e){return Buffer.isBuffer(e)||Array.isArray(e)}),"undefined"!=typeof cptable&&(ct=function(e,t,r){return cptable.utils.decode(1200,e.slice(t,r)).replace(k,"")},dt=function(e,t,r){return cptable.utils.decode(65001,e.slice(t,r))},gt=function(e,t){var r=xt(e,t);return r>0?cptable.utils.decode(a,e.slice(t+4,t+4+r-1)):""},vt=function(e,t){var r=xt(e,t);return r>0?cptable.utils.decode(n,e.slice(t+4,t+4+r-1)):""},wt=function(e,t){var r=2*xt(e,t);return r>0?cptable.utils.decode(1200,e.slice(t+4,t+4+r-1)):""},tt=function(e,t){var r=xt(e,t);return r>0?cptable.utils.decode(1200,e.slice(t+4,t+4+r)):""},_t=function(e,t){var r=xt(e,t);return r>0?cptable.utils.decode(65001,e.slice(t+4,t+4+r)):""});var Tt=function(e,t){return e[t]},kt=function(e,t){return 256*e[t+1]+e[t]},yt=function(e,t){var r=256*e[t+1]+e[t];return r<32768?r:-1*(65535-r+1)},xt=function(e,t){return e[t+3]*(1<<24)+(e[t+2]<<16)+(e[t+1]<<8)+e[t]},It=function(e,t){return e[t+3]<<24|e[t+2]<<16|e[t+1]<<8|e[t]},Rt=function(e,t){return e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3]};function Ot(e,t){var r,a,s,i,o,l,c="",f=[];switch(t){case"dbcs":if(l=this.l,v&&Buffer.isBuffer(this))c=this.slice(this.l,this.l+2*e).toString("utf16le");else for(o=0;o0?It:Rt)(this,this.l),this.l+=4,r);case 8:case-8:if("f"===t)return a=8==e?Et(this,this.l):Et([this[this.l+7],this[this.l+6],this[this.l+5],this[this.l+4],this[this.l+3],this[this.l+2],this[this.l+1],this[this.l+0]],0),this.l+=8,a;e=8;case 16:c=ht(this,this.l,e)}}return this.l+=e,c}var Ft=function(e,t,r){e[r]=255&t,e[r+1]=t>>>8&255,e[r+2]=t>>>16&255,e[r+3]=t>>>24&255},Dt=function(e,t,r){e[r]=255&t,e[r+1]=t>>8&255,e[r+2]=t>>16&255,e[r+3]=t>>24&255},Nt=function(e,t,r){e[r]=255&t,e[r+1]=t>>>8&255};function Pt(e,t,r){var n=0,s=0;if("dbcs"===r){for(s=0;s!=t.length;++s)Nt(this,t.charCodeAt(s),this.l+2*s);n=2*t.length}else if("sbcs"===r){if("undefined"!=typeof cptable&&874==a)for(s=0;s!=t.length;++s){var i=cptable.utils.encode(a,t.charAt(s));this[this.l+s]=i[0]}else for(t=t.replace(/[^\x00-\x7F]/g,"_"),s=0;s!=t.length;++s)this[this.l+s]=255&t.charCodeAt(s);n=t.length}else{if("hex"===r){for(;s>8}for(;this.l>>=8,this[this.l+1]=255&t;break;case 3:n=3,this[this.l]=255&t,t>>>=8,this[this.l+1]=255&t,t>>>=8,this[this.l+2]=255&t;break;case 4:n=4,Ft(this,t,this.l);break;case 8:if(n=8,"f"===r){!function(e,t,r){var n=(t<0||1/t==-1/0?1:0)<<7,a=0,s=0,i=n?-t:t;isFinite(i)?0==i?a=s=0:(a=Math.floor(Math.log(i)/Math.LN2),s=i*Math.pow(2,52-a),a<=-1023&&(!isFinite(s)||s>4|n}(this,t,this.l);break}case 16:break;case-4:n=4,Dt(this,t,this.l)}}return this.l+=n,this}function Lt(e,t){var r=ht(this,this.l,e.length>>1);if(r!==e)throw new Error(t+"Expected "+e+" saw "+r);this.l+=e.length>>1}function Mt(e,t){e.l=t,e.read_shift=Ot,e.chk=Lt,e.write_shift=Pt}function Ut(e,t){e.l+=t}function zt(e){var t=C(e);return Mt(t,0),t}function Ht(e,t,r){if(e){var n,a,s;Mt(e,e.l||0);for(var i=e.length,o=0,l=0;e.ln.l&&((n=n.slice(0,n.l)).l=n.length),n.length>0&&e.push(n),n=null)},s=function(e){return n&&e=128?1:0)+1,n>=128&&++a,n>=16384&&++a,n>=2097152&&++a;var i=e.next(a);s<=127?i.write_shift(1,s):(i.write_shift(1,128+(127&s)),i.write_shift(1,s>>7));for(var o=0;4!=o;++o){if(!(n>=128)){i.write_shift(1,n);break}i.write_shift(1,128+(127&n)),n>>=7}n>0&&Bt(r)&&e.push(r)}}function Xt(e,t,r){var n=te(e);if(t.s?(n.cRel&&(n.c+=t.s.c),n.rRel&&(n.r+=t.s.r)):(n.cRel&&(n.c+=t.c),n.rRel&&(n.r+=t.r)),!r||r.biff<12){for(;n.c>=256;)n.c-=256;for(;n.r>=65536;)n.r-=65536}return n}function Gt(e,t,r){var n=te(e);return n.s=Xt(n.s,t.s,r),n.e=Xt(n.e,t.s,r),n}function jt(e,t){if(e.cRel&&e.c<0)for(e=te(e);e.c<0;)e.c+=t>8?16384:256;if(e.rRel&&e.r<0)for(e=te(e);e.r<0;)e.r+=t>8?1048576:t>5?65536:16384;var r=qt(e);return e.cRel||null==e.cRel||(r=r.replace(/^([A-Z])/,"$$$1")),e.rRel||null==e.rRel||(r=r.replace(/([A-Z]|^)(\d+)$/,"$1$$$2")),r}function Kt(e,t){return 0!=e.s.r||e.s.rRel||e.e.r!=(t.biff>=12?1048575:t.biff>=8?65536:16384)||e.e.rRel?0!=e.s.c||e.s.cRel||e.e.c!=(t.biff>=12?16383:255)||e.e.cRel?jt(e.s,t.biff)+":"+jt(e.e,t.biff):(e.s.rRel?"":"$")+Yt(e.s.r)+":"+(e.e.rRel?"":"$")+Yt(e.e.r):(e.s.cRel?"":"$")+Qt(e.s.c)+":"+(e.e.cRel?"":"$")+Qt(e.e.c)}function $t(e){return parseInt(e.replace(/\$(\d+)$/,"$1"),10)-1}function Yt(e){return""+(e+1)}function Zt(e){for(var t=e.replace(/^\$([A-Z])/,"$1"),r=0,n=0;n!==t.length;++n)r=26*r+t.charCodeAt(n)-64;return r-1}function Qt(e){if(e<0)throw new Error("invalid column "+e);var t="";for(++e;e;e=Math.floor((e-1)/26))t=String.fromCharCode((e-1)%26+65)+t;return t}function Jt(e){for(var t=0,r=0,n=0;n=48&&a<=57?t=10*t+(a-48):a>=65&&a<=90&&(r=26*r+(a-64))}return{c:r-1,r:t-1}}function qt(e){for(var t=e.c+1,r="";t;t=(t-1)/26|0)r=String.fromCharCode((t-1)%26+65)+r;return r+(e.r+1)}function er(e){var t=e.indexOf(":");return-1==t?{s:Jt(e),e:Jt(e)}:{s:Jt(e.slice(0,t)),e:Jt(e.slice(t+1))}}function tr(e,t){return void 0===t||"number"==typeof t?tr(e.s,e.e):("string"!=typeof e&&(e=qt(e)),"string"!=typeof t&&(t=qt(t)),e==t?e:e+":"+t)}function rr(e){var t={s:{c:0,r:0},e:{c:0,r:0}},r=0,n=0,a=0,s=e.length;for(r=0;n26);++n)r=26*r+a;for(t.s.c=--r,r=0;n9);++n)r=10*r+a;if(t.s.r=--r,n===s||10!=a)return t.e.c=t.s.c,t.e.r=t.s.r,t;for(++n,r=0;n!=s&&!((a=e.charCodeAt(n)-64)<1||a>26);++n)r=26*r+a;for(t.e.c=--r,r=0;n!=s&&!((a=e.charCodeAt(n)-48)<0||a>9);++n)r=10*r+a;return t.e.r=--r,t}function nr(e,t,r){return null==e||null==e.t||"z"==e.t?"":void 0!==e.w?e.w:("d"==e.t&&!e.z&&r&&r.dateNF&&(e.z=r.dateNF),"e"==e.t?Vr[e.v]||e.v:function(e,t){var r="d"==e.t&&t instanceof Date;if(null!=e.z)try{return e.w=x.format(e.z,r?X(t):t)}catch(e){}try{return e.w=x.format((e.XF||{}).numFmtId||(r?14:0),r?X(t):t)}catch(e){return""+t}}(e,null==t?e.v:t))}function ar(e,t){var r=t&&t.sheet?t.sheet:"Sheet1",n={};return n[r]=e,{SheetNames:[r],Sheets:n}}function sr(e,t,r){var n=r||{},a=e?Array.isArray(e):n.dense,s=e||(a?[]:{}),i=0,o=0;if(s&&null!=n.origin){if("number"==typeof n.origin)i=n.origin;else{var l="string"==typeof n.origin?Jt(n.origin):n.origin;i=l.r,o=l.c}s["!ref"]||(s["!ref"]="A1:A1")}var c={s:{c:1e7,r:1e7},e:{c:0,r:0}};if(s["!ref"]){var f=rr(s["!ref"]);c.s.c=f.s.c,c.s.r=f.s.r,c.e.c=Math.max(c.e.c,f.e.c),c.e.r=Math.max(c.e.r,f.e.r),-1==i&&(c.e.r=i=f.e.r+1)}for(var h=0;h!=t.length;++h)if(t[h]){if(!Array.isArray(t[h]))throw new Error("aoa_to_sheet expects an array of arrays");for(var u=0;u!=t[h].length;++u)if(void 0!==t[h][u]){var d={v:t[h][u]},p=i+h,g=o+u;if(c.s.r>p&&(c.s.r=p),c.s.c>g&&(c.s.c=g),c.e.r0&&t.write_shift(0,e,"dbcs"),r?t.slice(0,t.l):t}function fr(e){return{ich:e.read_shift(2),ifnt:e.read_shift(2)}}function hr(e,t){var r=e.l,n=e.read_shift(1),a=lr(e),s=[],i={t:a,h:a};if(1&n){for(var o=e.read_shift(4),l=0;l!=o;++l)s.push(fr(e));i.r=s}else i.r=[{ich:0,ifnt:0}];return e.l=r+t,i}!function(e,t){var n;if(void 0!==t)n=t;else try{n=r(6251)}catch(e){n=null}e.rc4=function(e,t){var r=new Array(256),n=0,a=0,s=0,i=0;for(a=0;256!=a;++a)r[a]=a;for(a=0;256!=a;++a)s=s+r[a]+e[a%e.length].charCodeAt(0)&255,i=r[a],r[a]=r[s],r[s]=i;a=s=0;var o=C(t.length);for(n=0;n!=t.length;++n)s=(s+r[a=a+1&255])%256,i=r[a],r[a]=r[s],r[s]=i,o[n]=t[n]^r[r[a]+r[s]&255];return o},e.md5=function(e){if(!n)throw new Error("Unsupported crypto");return n.createHash("md5").update(e).digest("hex")}}({},"undefined"!=typeof crypto?crypto:void 0);var ur=hr;function dr(e){var t=e.read_shift(4),r=e.read_shift(2);return r+=e.read_shift(1)<<16,e.l++,{c:t,iStyleRef:r}}function pr(e,t){return null==t&&(t=zt(8)),t.write_shift(-4,e.c),t.write_shift(3,e.iStyleRef||e.s),t.write_shift(1,0),t}function gr(e){var t=e.read_shift(2);return t+=e.read_shift(1)<<16,e.l++,{c:-1,iStyleRef:t}}function mr(e,t){return null==t&&(t=zt(4)),t.write_shift(3,e.iStyleRef||e.s),t.write_shift(1,0),t}var vr=lr,br=cr;function wr(e){var t=e.read_shift(4);return 0===t||4294967295===t?"":e.read_shift(t,"dbcs")}function Cr(e,t){var r=!1;return null==t&&(r=!0,t=zt(127)),t.write_shift(4,e.length>0?e.length:4294967295),e.length>0&&t.write_shift(0,e,"dbcs"),r?t.slice(0,t.l):t}var Er=lr,Sr=wr,_r=Cr;function Ar(e){var t=e.slice(e.l,e.l+4),r=1&t[0],n=2&t[0];e.l+=4,t[0]&=252;var a=0===n?Et([0,0,0,0,t[0],t[1],t[2],t[3]],0):It(t,0)>>2;return r?a/100:a}function Br(e,t){null==t&&(t=zt(4));var r=0,n=0,a=100*e;if(e==(0|e)&&e>=-(1<<29)&&e<1<<29?n=1:a==(0|a)&&a>=-(1<<29)&&a<1<<29&&(n=1,r=1),!n)throw new Error("unsupported RkNumber "+e);t.write_shift(-4,((r?a:e)<<2)+(r+2))}function Tr(e){var t={s:{},e:{}};return t.s.r=e.read_shift(4),t.e.r=e.read_shift(4),t.s.c=e.read_shift(4),t.e.c=e.read_shift(4),t}var kr=Tr,yr=function(e,t){return t||(t=zt(16)),t.write_shift(4,e.s.r),t.write_shift(4,e.e.r),t.write_shift(4,e.s.c),t.write_shift(4,e.e.c),t};function xr(e){if(e.length-e.l<8)throw"XLS Xnum Buffer underflow";return e.read_shift(8,"f")}function Ir(e,t){return(t||zt(8)).write_shift(8,e,"f")}function Rr(e,t){if(t||(t=zt(8)),!e||e.auto)return t.write_shift(4,0),t.write_shift(4,0),t;null!=e.index?(t.write_shift(1,2),t.write_shift(1,e.index)):null!=e.theme?(t.write_shift(1,6),t.write_shift(1,e.theme)):(t.write_shift(1,5),t.write_shift(1,0));var r=e.tint||0;if(r>0?r*=32767:r<0&&(r*=32768),t.write_shift(2,r),e.rgb&&null==e.theme){var n=e.rgb||"FFFFFF";"number"==typeof n&&(n=("000000"+n.toString(16)).slice(-6)),t.write_shift(1,parseInt(n.slice(0,2),16)),t.write_shift(1,parseInt(n.slice(2,4),16)),t.write_shift(1,parseInt(n.slice(4,6),16)),t.write_shift(1,255)}else t.write_shift(2,0),t.write_shift(1,0),t.write_shift(1,0);return t}function Or(e,t){var r=e.read_shift(4);switch(r){case 0:return"";case 4294967295:case 4294967294:return{2:"BITMAP",3:"METAFILEPICT",8:"DIB",14:"ENHMETAFILE"}[e.read_shift(4)]||""}if(r>400)throw new Error("Unsupported Clipboard: "+r.toString(16));return e.l-=4,e.read_shift(0,1==t?"lpstr":"lpwstr")}var Fr,Dr=80,Nr=[Dr,81],Pr={1:{n:"CodePage",t:2},2:{n:"Category",t:Dr},3:{n:"PresentationFormat",t:Dr},4:{n:"ByteCount",t:3},5:{n:"LineCount",t:3},6:{n:"ParagraphCount",t:3},7:{n:"SlideCount",t:3},8:{n:"NoteCount",t:3},9:{n:"HiddenCount",t:3},10:{n:"MultimediaClipCount",t:3},11:{n:"ScaleCrop",t:11},12:{n:"HeadingPairs",t:4108},13:{n:"TitlesOfParts",t:4126},14:{n:"Manager",t:Dr},15:{n:"Company",t:Dr},16:{n:"LinksUpToDate",t:11},17:{n:"CharacterCount",t:3},19:{n:"SharedDoc",t:11},22:{n:"HyperlinksChanged",t:11},23:{n:"AppVersion",t:3,p:"version"},24:{n:"DigSig",t:65},26:{n:"ContentType",t:Dr},27:{n:"ContentStatus",t:Dr},28:{n:"Language",t:Dr},29:{n:"Version",t:Dr},255:{},2147483648:{n:"Locale",t:19},2147483651:{n:"Behavior",t:19},1919054434:{}},Lr={1:{n:"CodePage",t:2},2:{n:"Title",t:Dr},3:{n:"Subject",t:Dr},4:{n:"Author",t:Dr},5:{n:"Keywords",t:Dr},6:{n:"Comments",t:Dr},7:{n:"Template",t:Dr},8:{n:"LastAuthor",t:Dr},9:{n:"RevNumber",t:Dr},10:{n:"EditTime",t:64},11:{n:"LastPrinted",t:64},12:{n:"CreatedDate",t:64},13:{n:"ModifiedDate",t:64},14:{n:"PageCount",t:3},15:{n:"WordCount",t:3},16:{n:"CharCount",t:3},17:{n:"Thumbnail",t:71},18:{n:"Application",t:Dr},19:{n:"DocSecurity",t:3},255:{},2147483648:{n:"Locale",t:19},2147483651:{n:"Behavior",t:19},1919054434:{}},Mr=z(Pr,"n"),Ur=z(Lr,"n"),zr={1:"US",2:"CA",3:"",7:"RU",20:"EG",30:"GR",31:"NL",32:"BE",33:"FR",34:"ES",36:"HU",39:"IT",41:"CH",43:"AT",44:"GB",45:"DK",46:"SE",47:"NO",48:"PL",49:"DE",52:"MX",55:"BR",61:"AU",64:"NZ",66:"TH",81:"JP",82:"KR",84:"VN",86:"CN",90:"TR",105:"JS",213:"DZ",216:"MA",218:"LY",351:"PT",354:"IS",358:"FI",420:"CZ",886:"TW",961:"LB",962:"JO",963:"SY",964:"IQ",965:"KW",966:"SA",971:"AE",972:"IL",974:"QA",981:"IR",65535:"US"},Hr=[null,"solid","mediumGray","darkGray","lightGray","darkHorizontal","darkVertical","darkDown","darkUp","darkGrid","darkTrellis","lightHorizontal","lightVertical","lightDown","lightUp","lightGrid","lightTrellis","gray125","gray0625"],Wr=te([0,16777215,16711680,65280,255,16776960,16711935,65535,0,16777215,16711680,65280,255,16776960,16711935,65535,8388608,32768,128,8421376,8388736,32896,12632256,8421504,10066431,10040166,16777164,13434879,6684774,16744576,26316,13421823,128,16711935,16776960,65535,8388736,8388608,32896,255,52479,13434879,13434828,16777113,10079487,16751052,13408767,16764057,3368703,3394764,10079232,16763904,16750848,16737792,6710937,9868950,13158,3381606,13056,3355392,10040064,10040166,3355545,3355443,16777215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].map(function(e){return[e>>16&255,e>>8&255,255&e]})),Vr={0:"#NULL!",7:"#DIV/0!",15:"#VALUE!",23:"#REF!",29:"#NAME?",36:"#NUM!",42:"#N/A",43:"#GETTING_DATA",255:"#WTF?"},Xr=W(Vr),Gr={"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml":"workbooks","application/vnd.ms-excel.binIndexWs":"TODO","application/vnd.ms-excel.intlmacrosheet":"TODO","application/vnd.ms-excel.binIndexMs":"TODO","application/vnd.openxmlformats-package.core-properties+xml":"coreprops","application/vnd.openxmlformats-officedocument.custom-properties+xml":"custprops","application/vnd.openxmlformats-officedocument.extended-properties+xml":"extprops","application/vnd.openxmlformats-officedocument.customXmlProperties+xml":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.customProperty":"TODO","application/vnd.ms-excel.pivotTable":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml":"TODO","application/vnd.openxmlformats-officedocument.drawingml.chart+xml":"TODO","application/vnd.ms-office.chartcolorstyle+xml":"TODO","application/vnd.ms-office.chartstyle+xml":"TODO","application/vnd.ms-office.chartex+xml":"TODO","application/vnd.ms-excel.calcChain":"calcchains","application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml":"calcchains","application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings":"TODO","application/vnd.ms-office.activeX":"TODO","application/vnd.ms-office.activeX+xml":"TODO","application/vnd.ms-excel.attachedToolbars":"TODO","application/vnd.ms-excel.connections":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml":"TODO","application/vnd.ms-excel.externalLink":"links","application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml":"links","application/vnd.ms-excel.sheetMetadata":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml":"TODO","application/vnd.ms-excel.pivotCacheDefinition":"TODO","application/vnd.ms-excel.pivotCacheRecords":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml":"TODO","application/vnd.ms-excel.queryTable":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml":"TODO","application/vnd.ms-excel.userNames":"TODO","application/vnd.ms-excel.revisionHeaders":"TODO","application/vnd.ms-excel.revisionLog":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml":"TODO","application/vnd.ms-excel.tableSingleCells":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml":"TODO","application/vnd.ms-excel.slicer":"TODO","application/vnd.ms-excel.slicerCache":"TODO","application/vnd.ms-excel.slicer+xml":"TODO","application/vnd.ms-excel.slicerCache+xml":"TODO","application/vnd.ms-excel.wsSortMap":"TODO","application/vnd.ms-excel.table":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml":"TODO","application/vnd.openxmlformats-officedocument.theme+xml":"themes","application/vnd.openxmlformats-officedocument.themeOverride+xml":"TODO","application/vnd.ms-excel.Timeline+xml":"TODO","application/vnd.ms-excel.TimelineCache+xml":"TODO","application/vnd.ms-office.vbaProject":"vba","application/vnd.ms-office.vbaProjectSignature":"vba","application/vnd.ms-office.volatileDependencies":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml":"TODO","application/vnd.ms-excel.controlproperties+xml":"TODO","application/vnd.openxmlformats-officedocument.model+data":"TODO","application/vnd.ms-excel.Survey+xml":"TODO","application/vnd.openxmlformats-officedocument.drawing+xml":"drawings","application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml":"TODO","application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml":"TODO","application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml":"TODO","application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml":"TODO","application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml":"TODO","application/vnd.openxmlformats-officedocument.vmlDrawing":"TODO","application/vnd.openxmlformats-package.relationships+xml":"rels","application/vnd.openxmlformats-officedocument.oleObject":"TODO","image/png":"TODO",sheet:"js"},jr=(U(Fr={workbooks:{xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",xlsm:"application/vnd.ms-excel.sheet.macroEnabled.main+xml",xlsb:"application/vnd.ms-excel.sheet.binary.macroEnabled.main",xlam:"application/vnd.ms-excel.addin.macroEnabled.main+xml",xltx:"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"},strs:{xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",xlsb:"application/vnd.ms-excel.sharedStrings"},comments:{xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml",xlsb:"application/vnd.ms-excel.comments"},sheets:{xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",xlsb:"application/vnd.ms-excel.worksheet"},charts:{xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml",xlsb:"application/vnd.ms-excel.chartsheet"},dialogs:{xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml",xlsb:"application/vnd.ms-excel.dialogsheet"},macros:{xlsx:"application/vnd.ms-excel.macrosheet+xml",xlsb:"application/vnd.ms-excel.macrosheet"},styles:{xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml",xlsb:"application/vnd.ms-excel.styles"}}).forEach(function(e){["xlsm","xlam"].forEach(function(t){Fr[e][t]||(Fr[e][t]=Fr[e].xlsx)})}),U(Fr).forEach(function(e){U(Fr[e]).forEach(function(t){Gr[Fr[e][t]]=e})}),Fr),Kr=function(e){for(var t=[],r=U(e),n=0;n!==r.length;++n)null==t[e[r[n]]]&&(t[e[r[n]]]=[]),t[e[r[n]]].push(r[n]);return t}(Gr);nt.CT="http://schemas.openxmlformats.org/package/2006/content-types";var $r=qe("Types",null,{xmlns:nt.CT,"xmlns:xsd":nt.xsd,"xmlns:xsi":nt.xsi}),Yr=[["xml","application/xml"],["bin","application/vnd.ms-excel.sheet.binary.macroEnabled.main"],["vml","application/vnd.openxmlformats-officedocument.vmlDrawing"],["data","application/vnd.openxmlformats-officedocument.model+data"],["bmp","image/bmp"],["png","image/png"],["gif","image/gif"],["emf","image/x-emf"],["wmf","image/x-wmf"],["jpg","image/jpeg"],["jpeg","image/jpeg"],["tif","image/tiff"],["tiff","image/tiff"],["pdf","application/pdf"],["rels",Kr.rels[0]]].map(function(e){return qe("Default",null,{Extension:e[0],ContentType:e[1]})}),Zr={WB:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",SHEET:"http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument",HLINK:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink",VML:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing",XPATH:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath",XMISS:"http://schemas.microsoft.com/office/2006/relationships/xlExternalLinkPath/xlPathMissing",XLINK:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink",CXML:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml",CXMLP:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps",VBA:"http://schemas.microsoft.com/office/2006/relationships/vbaProject"};function Qr(e){var t=e.lastIndexOf("/");return e.slice(0,t+1)+"_rels/"+e.slice(t+1)+".rels"}function Jr(e,t){var r={"!id":{}};if(!e)return r;"/"!==t.charAt(0)&&(t="/"+t);var n={};return(e.match(be)||[]).forEach(function(e){var a=Ee(e);if("2&&(t[t.length]="",t[1]=t[1].replace("/>",">")),t.join("")}var tn=[Zr.HLINK,Zr.XPATH,Zr.XMISS];function rn(e,t,r,n,a,s){if(a||(a={}),e["!id"]||(e["!id"]={}),t<0)for(t=1;e["!id"]["rId"+t];++t);if(a.Id="rId"+t,a.Type=n,a.Target=r,s?a.TargetMode=s:tn.indexOf(a.Type)>-1&&(a.TargetMode="External"),e["!id"][a.Id])throw new Error("Cannot rewrite rId "+t);return e["!id"][a.Id]=a,e[("/"+a.Target).replace("//","/")]=a,t}function nn(e,t,r){return[' \n',' \n'," \n"].join("")}function an(e,t){return[' \n',' \n'," \n"].join("")}var sn,on=(sn='SheetJS '+t.version+"",function(){return sn}),ln=[["cp:category","Category"],["cp:contentStatus","ContentStatus"],["cp:keywords","Keywords"],["cp:lastModifiedBy","LastAuthor"],["cp:lastPrinted","LastPrinted"],["cp:revision","RevNumber"],["cp:version","Version"],["dc:creator","Author"],["dc:description","Comments"],["dc:identifier","Identifier"],["dc:language","Language"],["dc:subject","Subject"],["dc:title","Title"],["dcterms:created","CreatedDate","date"],["dcterms:modified","ModifiedDate","date"]];nt.CORE_PROPS="http://schemas.openxmlformats.org/package/2006/metadata/core-properties",Zr.CORE_PROPS="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties";var cn=function(){for(var e=new Array(ln.length),t=0;t]*>([\\s\\S]*?)")}return e}();function fn(e){var t={};e=Pe(e);for(var r=0;r0&&(t[n[1]]=ke(a[1])),"date"===n[2]&&t[n[1]]&&(t[n[1]]=q(t[n[1]]))}return t}var hn=qe("cp:coreProperties",null,{"xmlns:cp":nt.CORE_PROPS,"xmlns:dc":nt.dc,"xmlns:dcterms":nt.dcterms,"xmlns:dcmitype":nt.dcmitype,"xmlns:xsi":nt.xsi});function un(e,t,r,n,a){null==a[e]&&null!=t&&""!==t&&(a[e]=t,t=Ie(t),n[n.length]=r?qe(e,t,r):Qe(e,t))}var dn=[["Application","Application","string"],["AppVersion","AppVersion","string"],["Company","Company","string"],["DocSecurity","DocSecurity","string"],["Manager","Manager","string"],["HyperlinksChanged","HyperlinksChanged","bool"],["SharedDoc","SharedDoc","bool"],["LinksUpToDate","LinksUpToDate","bool"],["ScaleCrop","ScaleCrop","bool"],["HeadingPairs","HeadingPairs","raw"],["TitlesOfParts","TitlesOfParts","raw"]];function pn(e,t,r,n){var a=[];if("string"==typeof e)a=Ye(e,n);else for(var s=0;s0)for(var c=0;c!==a.length;c+=2){switch(l=+a[c+1].v,a[c].v){case"Worksheets":case"工作表":case"Листы":case"أوراق العمل":case"ワークシート":case"גליונות עבודה":case"Arbeitsblätter":case"Çalışma Sayfaları":case"Feuilles de calcul":case"Fogli di lavoro":case"Folhas de cálculo":case"Planilhas":case"Regneark":case"Hojas de cálculo":case"Werkbladen":r.Worksheets=l,r.SheetNames=i.slice(o,o+l);break;case"Named Ranges":case"Rangos con nombre":case"名前付き一覧":case"Benannte Bereiche":case"Navngivne områder":r.NamedRanges=l,r.DefinedNames=i.slice(o,o+l);break;case"Charts":case"Diagramme":r.Chartsheets=l,r.ChartNames=i.slice(o,o+l)}o+=l}}nt.EXT_PROPS="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties",Zr.EXT_PROPS="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties";var gn=qe("Properties",null,{xmlns:nt.EXT_PROPS,"xmlns:vt":nt.vt});nt.CUST_PROPS="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties",Zr.CUST_PROPS="http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties";var mn=/<[^>]+>[^<]*/g,vn=qe("Properties",null,{xmlns:nt.CUST_PROPS,"xmlns:vt":nt.vt});var bn={Title:"Title",Subject:"Subject",Author:"Author",Keywords:"Keywords",Comments:"Description",LastAuthor:"LastAuthor",RevNumber:"Revision",Application:"AppName",LastPrinted:"LastPrinted",CreatedDate:"Created",ModifiedDate:"LastSaved",Category:"Category",Manager:"Manager",Company:"Company",AppVersion:"Version",ContentStatus:"ContentStatus",Identifier:"Identifier",Language:"Language"},wn=H(bn);function Cn(e,t,r){e[t=wn[t]||t]=r}function En(e){var t=e.read_shift(4),r=e.read_shift(4);return new Date(1e3*(r/1e7*Math.pow(2,32)+t/1e7-11644473600)).toISOString().replace(/\.000/,"")}function Sn(e,t,r){var n=e.l,a=e.read_shift(0,"lpstr-cp");if(r)for(;e.l-n&3;)++e.l;return a}function _n(e,t,r){var n=e.read_shift(0,"lpwstr");return r&&(e.l+=4-(n.length+1&3)&3),n}function An(e,t,r){return 31===t?_n(e):Sn(e,0,r)}function Bn(e,t,r){return An(e,t,!1===r?0:4)}function Tn(e){var t=e.l,r=xn(e,81);return 0==e[e.l]&&0==e[e.l+1]&&e.l-t&2&&(e.l+=2),[r,xn(e,3)]}function kn(e,t){for(var r=e.read_shift(4),n={},a=0;a!=r;++a){var s=e.read_shift(4),i=e.read_shift(4);n[s]=e.read_shift(i,1200===t?"utf16le":"utf8").replace(k,"").replace(y,"!"),1200===t&&i%2&&(e.l+=2)}return 3&e.l&&(e.l=e.l>>3<<2),n}function yn(e){var t=e.read_shift(4),r=e.slice(e.l,e.l+t);return e.l+=t,(3&t)>0&&(e.l+=4-(3&t)&3),r}function xn(e,t,r){var n,a=e.read_shift(2),s=r||{};if(e.l+=2,12!==t&&a!==t&&-1===Nr.indexOf(t)&&(4126!=(65534&t)||4126!=(65534&a)))throw new Error("Expected type "+t+" saw "+a);switch(12===t?a:t){case 2:return n=e.read_shift(2,"i"),s.raw||(e.l+=2),n;case 3:return e.read_shift(4,"i");case 11:return 0!==e.read_shift(4);case 19:return e.read_shift(4);case 30:return Sn(e,0,4).replace(k,"");case 31:return _n(e);case 64:return En(e);case 65:return yn(e);case 71:return function(e){var t={};return t.Size=e.read_shift(4),e.l+=t.Size+3-(t.Size-1)%4,t}(e);case 80:return Bn(e,a,!s.raw).replace(k,"");case 81:return function(e,t){if(!t)throw new Error("VtUnalignedString must have positive length");return An(e,t,0)}(e,a).replace(k,"");case 4108:return function(e){for(var t=e.read_shift(4),r=[],n=0;n0&&(r%=Math.pow(2,32),n+=a);var s=zt(8);return s.write_shift(4,r),s.write_shift(4,n),s}(t);break;case 31:case 80:for((n=zt(4+2*(t.length+1)+(t.length%2?0:2))).write_shift(4,t.length+1),n.write_shift(0,t,"dbcs");n.l!=n.length;)n.write_shift(1,0);break;default:throw new Error("TypedPropertyValue unrecognized type "+e+" "+t)}return T([r,n])}function Rn(e,t){var r=e.l,n=e.read_shift(4),a=e.read_shift(4),s=[],i=0,o=0,l=-1,f={};for(i=0;i!=a;++i){var h=e.read_shift(4),u=e.read_shift(4);s[i]=[h,u+r]}s.sort(function(e,t){return e[1]-t[1]});var d={};for(i=0;i!=a;++i){if(e.l!==s[i][1]){var p=!0;if(i>0&&t)switch(t[s[i-1][0]].t){case 2:e.l+2===s[i][1]&&(e.l+=2,p=!1);break;case 80:case 4108:e.l<=s[i][1]&&(e.l=s[i][1],p=!1)}if((!t||0==i)&&e.l<=s[i][1]&&(p=!1,e.l=s[i][1]),p)throw new Error("Read Error: Expected address "+s[i][1]+" at "+e.l+" :"+i)}if(t){var g=t[s[i][0]];if(d[g.n]=xn(e,g.t,{raw:!0}),"version"===g.p&&(d[g.n]=String(d[g.n]>>16)+"."+("0000"+String(65535&d[g.n])).slice(-4)),"CodePage"==g.n)switch(d[g.n]){case 0:d[g.n]=1252;case 874:case 932:case 936:case 949:case 950:case 1250:case 1251:case 1253:case 1254:case 1255:case 1256:case 1257:case 1258:case 1e4:case 1200:case 1201:case 1252:case 65e3:case-536:case 65001:case-535:c(o=d[g.n]>>>0&65535);break;default:throw new Error("Unsupported CodePage: "+d[g.n])}}else if(1===s[i][0]){if(o=d.CodePage=xn(e,2),c(o),-1!==l){var m=e.l;e.l=s[l][1],f=kn(e,o),e.l=m}}else if(0===s[i][0]){if(0===o){l=i,e.l=s[i+1][1];continue}f=kn(e,o)}else{var v,b=f[s[i][0]];switch(e[e.l]){case 65:e.l+=4,v=yn(e);break;case 30:case 31:e.l+=4,v=Bn(e,e[e.l-4]).replace(/\u0000+$/,"");break;case 3:e.l+=4,v=e.read_shift(4,"i");break;case 19:e.l+=4,v=e.read_shift(4);break;case 5:e.l+=4,v=e.read_shift(8,"f");break;case 11:e.l+=4,v=Mn(e,4);break;case 64:e.l+=4,v=q(En(e));break;default:throw new Error("unparsed value: "+e[e.l])}d[b]=v}}return e.l=r+n,d}var On=["CodePage","Thumbnail","_PID_LINKBASE","_PID_HLINKS","SystemIdentifier","FMTID"].concat(["Worksheets","SheetNames","NamedRanges","DefinedNames","Chartsheets","ChartNames"]);function Fn(e){switch(typeof e){case"boolean":return 11;case"number":return(0|e)==e?3:5;case"string":return 31;case"object":if(e instanceof Date)return 64}return-1}function Dn(e,t,r){var n=zt(8),a=[],s=[],i=8,o=0,l=zt(8),c=zt(8);if(l.write_shift(4,2),l.write_shift(4,1200),c.write_shift(4,1),s.push(l),a.push(c),i+=8+l.length,!t){(c=zt(8)).write_shift(4,0),a.unshift(c);var f=[zt(4)];for(f[0].write_shift(4,e.length),o=0;o-1)&&null!=e[o][1]){var u=e[o][1],d=0;if(t){var p=r[d=+t[e[o][0]]];if("version"==p.p&&"string"==typeof u){var g=u.split(".");u=(+g[0]<<16)+(+g[1]||0)}l=In(p.t,u)}else{var m=Fn(u);-1==m&&(m=31,u=String(u)),l=In(m,u)}s.push(l),(c=zt(8)).write_shift(4,t?d:2+o),a.push(c),i+=8+l.length}var v=8*(s.length+1);for(o=0;o=12?2:1),s="sbcs-cont",i=n;r&&r.biff>=8&&(n=1200),r&&8!=r.biff?12==r.biff&&(s="wstr"):e.read_shift(1)&&(s="dbcs-cont"),r.biff>=2&&r.biff<=5&&(s="cpstr");var o=a?e.read_shift(a,s):"";return n=i,o}function Gn(e){var t=n;n=1200;var r,a=e.read_shift(2),s=e.read_shift(1),i=4&s,o=8&s,l=1+(1&s),c=0,f={};o&&(c=e.read_shift(2)),i&&(r=e.read_shift(4));var h=2==l?"dbcs-cont":"sbcs-cont",u=0===a?"":e.read_shift(a,h);return o&&(e.l+=4*c),i&&(e.l+=r),f.t=u,o||(f.raw=""+f.t+"",f.r=f.t),n=t,f}function jn(e){var t=e.t||"",r=zt(3);r.write_shift(2,t.length),r.write_shift(1,1);var n=zt(2*t.length);return n.write_shift(2*t.length,t,"utf16le"),T([r,n])}function Kn(e,t,r){if(r){if(r.biff>=2&&r.biff<=5)return e.read_shift(t,"cpstr");if(r.biff>=12)return e.read_shift(t,"dbcs-cont")}return 0===e.read_shift(1)?e.read_shift(t,"sbcs-cont"):e.read_shift(t,"dbcs-cont")}function $n(e,t,r){var n=e.read_shift(r&&2==r.biff?1:2);return 0===n?(e.l++,""):Kn(e,n,r)}function Yn(e,t,r){if(r.biff>5)return $n(e,0,r);var n=e.read_shift(1);return 0===n?(e.l++,""):e.read_shift(n,r.biff<=4||!e.lens?"cpstr":"sbcs-cont")}function Zn(e,t,r){return r||(r=zt(3+2*e.length)),r.write_shift(2,e.length),r.write_shift(1,1),r.write_shift(31,e,"utf16le"),r}function Qn(e){var t=e.read_shift(4);return t>0?e.read_shift(t,"utf16le").replace(k,""):""}function Jn(e,t){t||(t=zt(6+2*e.length)),t.write_shift(4,1+e.length);for(var r=0;r-1?31:23;switch(n.charAt(0)){case"#":s=28;break;case".":s&=-3}t.write_shift(4,2),t.write_shift(4,s);var i=[8,6815827,6619237,4849780,83];for(r=0;r-1?n.slice(0,a):n;for(t.write_shift(4,2*(o.length+1)),r=0;r-1?n.slice(a+1):"",t)}else{for(i="03 03 00 00 00 00 00 00 c0 00 00 00 00 00 00 46".split(" "),r=0;r8?4:2;return[e.read_shift(n),e.read_shift(n,"i"),e.read_shift(n,"i")]}function sa(e){return[e.read_shift(2),Ar(e)]}function ia(e){var t=e.read_shift(2),r=e.read_shift(2);return{s:{c:e.read_shift(2),r:t},e:{c:e.read_shift(2),r}}}function oa(e,t){return t||(t=zt(8)),t.write_shift(2,e.s.r),t.write_shift(2,e.e.r),t.write_shift(2,e.s.c),t.write_shift(2,e.e.c),t}function la(e){var t=e.read_shift(2),r=e.read_shift(2);return{s:{c:e.read_shift(1),r:t},e:{c:e.read_shift(1),r}}}var ca=la;function fa(e){e.l+=4;var t=e.read_shift(2),r=e.read_shift(2),n=e.read_shift(2);return e.l+=12,[r,t,n]}function ha(e){e.l+=2,e.l+=e.read_shift(2)}var ua={0:ha,4:ha,5:ha,6:ha,7:function(e){return e.l+=4,e.cf=e.read_shift(2),{}},8:ha,9:ha,10:ha,11:ha,12:ha,13:function(e){var t={};return e.l+=4,e.l+=16,t.fSharedNote=e.read_shift(2),e.l+=4,t},14:ha,15:ha,16:ha,17:ha,18:ha,19:ha,20:ha,21:fa};function da(e,t){var r={BIFFVer:0,dt:0};switch(r.BIFFVer=e.read_shift(2),(t-=2)>=2&&(r.dt=e.read_shift(2),e.l-=2),r.BIFFVer){case 1536:case 1280:case 1024:case 768:case 512:case 2:case 7:break;default:if(t>6)throw new Error("Unexpected BIFF Ver "+r.BIFFVer)}return e.read_shift(t),r}function pa(e,t,r){var n=1536,a=16;switch(r.bookType){case"biff8":case"xla":break;case"biff5":n=1280,a=8;break;case"biff4":n=4,a=6;break;case"biff3":n=3,a=6;break;case"biff2":n=2,a=4;break;default:throw new Error("unsupported BIFF version")}var s=zt(a);return s.write_shift(2,n),s.write_shift(2,t),a>4&&s.write_shift(2,29282),a>6&&s.write_shift(2,1997),a>8&&(s.write_shift(2,49161),s.write_shift(2,1),s.write_shift(2,1798),s.write_shift(2,0)),s}function ga(e,t){var r=!t||t.biff>=8?2:1,n=zt(8+r*e.name.length);n.write_shift(4,e.pos),n.write_shift(1,e.hs||0),n.write_shift(1,e.dt),n.write_shift(1,e.name.length),t.biff>=8&&n.write_shift(1,1),n.write_shift(r*e.name.length,e.name,t.biff<8?"sbcs":"utf16le");var a=n.slice(0,n.l);return a.l=n.l,a}function ma(e,t,r){var n=0;r&&2==r.biff||(n=e.read_shift(2));var a=e.read_shift(2);return r&&2==r.biff&&(n=1-(a>>15),a&=32767),[{Unsynced:1&n,DyZero:(2&n)>>1,ExAsc:(4&n)>>2,ExDsc:(8&n)>>3},a]}function va(e,t,r,n){var a=r&&5==r.biff;n||(n=zt(a?3+t.length:5+2*t.length)),n.write_shift(2,e),n.write_shift(a?1:2,t.length),a||n.write_shift(1,1),n.write_shift((a?1:2)*t.length,t,a?"sbcs":"utf16le");var s=n.length>n.l?n.slice(0,n.l):n;return null==s.l&&(s.l=s.length),s}var ba=Yn;function wa(e,t,r){var n=e.l+t,a=8!=r.biff&&r.biff?2:4,s=e.read_shift(a),i=e.read_shift(a),o=e.read_shift(2),l=e.read_shift(2);return e.l=n,{s:{r:s,c:o},e:{r:i,c:l}}}function Ca(e,t,r,n){var a=r&&5==r.biff;n||(n=zt(a?16:20)),n.write_shift(2,0),e.style?(n.write_shift(2,e.numFmtId||0),n.write_shift(2,65524)):(n.write_shift(2,e.numFmtId||0),n.write_shift(2,t<<4));var s=0;return e.numFmtId>0&&a&&(s|=1024),n.write_shift(4,s),n.write_shift(4,0),a||n.write_shift(4,0),n.write_shift(2,0),n}function Ea(e,t,r){var n=ra(e);2!=r.biff&&9!=t||++e.l;var a=function(e){var t=e.read_shift(1);return 1===e.read_shift(1)?t:1===t}(e);return n.val=a,n.t=!0===a||!1===a?"b":"e",n}var Sa=function(e,t,r){return 0===t?"":Yn(e,0,r)};function _a(e,t,r){var n,a=e.read_shift(2),s={fBuiltIn:1&a,fWantAdvise:a>>>1&1,fWantPict:a>>>2&1,fOle:a>>>3&1,fOleLink:a>>>4&1,cf:a>>>5&1023,fIcon:a>>>15&1};return 14849===r.sbcch&&(n=function(e,t,r){e.l+=4,t-=4;var n=e.l+t,a=Xn(e,0,r),s=e.read_shift(2);if(s!==(n-=e.l))throw new Error("Malformed AddinUdf: padding = "+n+" != "+s);return e.l+=s,a}(e,t-2,r)),s.body=n||e.read_shift(t-2),"string"==typeof n&&(s.Name=n),s}var Aa=["_xlnm.Consolidate_Area","_xlnm.Auto_Open","_xlnm.Auto_Close","_xlnm.Extract","_xlnm.Database","_xlnm.Criteria","_xlnm.Print_Area","_xlnm.Print_Titles","_xlnm.Recorder","_xlnm.Data_Form","_xlnm.Auto_Activate","_xlnm.Auto_Deactivate","_xlnm.Sheet_Title","_xlnm._FilterDatabase"];function Ba(e,t,r){var n=e.l+t,a=e.read_shift(2),s=e.read_shift(1),i=e.read_shift(1),o=e.read_shift(r&&2==r.biff?1:2),l=0;(!r||r.biff>=5)&&(5!=r.biff&&(e.l+=2),l=e.read_shift(2),5==r.biff&&(e.l+=2),e.l+=4);var c=Kn(e,i,r);32&a&&(c=Aa[c.charCodeAt(0)]);var f=n-e.l;r&&2==r.biff&&--f;var h=n!=e.l&&0!==o&&f>0?function(e,t,r,n){var a,s=e.l+t,i=Gi(e,n,r);return s!==e.l&&(a=Xi(e,s-e.l,i,r)),[i,a]}(e,f,r,o):[];return{chKey:s,Name:c,itab:l,rgce:h}}function Ta(e,t,r){if(r.biff<8)return function(e,t,r){3==e[e.l+1]&&e[e.l]++;var n=Xn(e,0,r);return 3==n.charCodeAt(0)?n.slice(1):n}(e,0,r);for(var n=[],a=e.l+t,s=e.read_shift(r.biff>8?4:2);0!==s--;)n.push(aa(e,r.biff,r));if(e.l!=a)throw new Error("Bad ExternSheet: "+e.l+" != "+a);return n}function ka(e,t,r){var n=ca(e,6);switch(r.biff){case 2:e.l++,t-=7;break;case 3:case 4:e.l+=2,t-=8;break;default:e.l+=6,t-=12}return[n,Ji(e,t,r)]}var ya=[];function xa(e){var t=zt(24),r=Jt(e[0]);t.write_shift(2,r.r),t.write_shift(2,r.r),t.write_shift(2,r.c),t.write_shift(2,r.c);for(var n="d0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b".split(" "),a=0;a<16;++a)t.write_shift(1,parseInt(n[a],16));return T([t,qn(e[1])])}function Ia(e){var t=e[1].Tooltip,r=zt(10+2*(t.length+1));r.write_shift(2,2048);var n=Jt(e[0]);r.write_shift(2,n.r),r.write_shift(2,n.r),r.write_shift(2,n.c),r.write_shift(2,n.c);for(var a=0;a=12?4:2,a=e.read_shift(n),s=e.read_shift(n),i=e.read_shift(n),o=e.read_shift(n),l=e.read_shift(2);2==n&&(e.l+=2);var c={s:a,e:s,w:i,ixfe:o,flags:l};return(r.biff>=5||!r.biff)&&(c.level=l>>8&7),c}ya[8]=function(e,t){var r=e.l+t;e.l+=10;var n=e.read_shift(2);e.l+=4,e.l+=2,e.l+=2,e.l+=2,e.l+=4;var a=e.read_shift(1);return e.l+=a,e.l=r,{fmt:n}};var Oa=ra,Fa=Wn,Da=$n,Na=function(){var e={1:437,2:850,3:1252,4:1e4,100:852,101:866,102:865,103:861,104:895,105:620,106:737,107:857,120:950,121:949,122:936,123:932,124:874,125:1255,126:1256,150:10007,151:10029,152:10006,200:1250,201:1251,202:1254,203:1253,0:20127,8:865,9:437,10:850,11:437,13:437,14:850,15:437,16:850,17:437,18:850,19:932,20:850,21:437,22:850,23:865,24:437,25:437,26:850,27:437,28:863,29:850,31:852,34:852,35:852,36:860,37:850,38:866,55:850,64:852,77:936,78:949,79:950,80:874,87:1252,88:1252,89:1252,108:863,134:737,135:852,136:857,204:1257,255:16969},t=H({1:437,2:850,3:1252,4:1e4,100:852,101:866,102:865,103:861,104:895,105:620,106:737,107:857,120:950,121:949,122:936,123:932,124:874,125:1255,126:1256,150:10007,151:10029,152:10006,200:1250,201:1251,202:1254,203:1253,0:20127});function r(t,r){var n=r||{};return n.dateNF||(n.dateNF="yyyymmdd"),ir(function(t,r){var n=[],a=C(1);switch(r.type){case"base64":a=S(m.decode(t));break;case"binary":a=S(t);break;case"buffer":case"array":a=t}Mt(a,0);var s=a.read_shift(1),i=!!(136&s),o=!1,l=!1;switch(s){case 2:case 3:case 131:case 139:case 245:break;case 48:case 49:o=!0,i=!0;break;case 140:l=!0;break;default:throw new Error("DBF Unsupported Version: "+s.toString(16))}var c=0,f=521;2==s&&(c=a.read_shift(2)),a.l+=3,2!=s&&(c=a.read_shift(4)),c>1048576&&(c=1e6),2!=s&&(f=a.read_shift(2));var h=a.read_shift(2),u=r.codepage||1252;2!=s&&(a.l+=16,a.read_shift(1),0!==a[a.l]&&(u=e[a[a.l]]),a.l+=1,a.l+=2),l&&(a.l+=36);for(var d=[],p={},g=Math.min(a.length,2==s?521:f-10-(o?264:0)),v=l?32:11;a.l0;)if(42!==a[a.l])for(++a.l,n[++b]=[],w=0,w=0;w!=d.length;++w){var E=a.slice(a.l,a.l+d[w].len);a.l+=d[w].len,Mt(E,0);var _=cptable.utils.decode(u,E);switch(d[w].type){case"C":_.trim().length&&(n[b][w]=_.replace(/\s+$/,""));break;case"D":8===_.length?n[b][w]=new Date(+_.slice(0,4),+_.slice(4,6)-1,+_.slice(6,8)):n[b][w]=_;break;case"F":n[b][w]=parseFloat(_.trim());break;case"+":case"I":n[b][w]=l?2147483648^E.read_shift(-4,"i"):E.read_shift(4,"i");break;case"L":switch(_.trim().toUpperCase()){case"Y":case"T":n[b][w]=!0;break;case"N":case"F":n[b][w]=!1;break;case"":case"?":break;default:throw new Error("DBF Unrecognized L:|"+_+"|")}break;case"M":if(!i)throw new Error("DBF Unexpected MEMO for type "+s.toString(16));n[b][w]="##MEMO##"+(l?parseInt(_.trim(),10):E.read_shift(4));break;case"N":(_=_.replace(/\u0000/g,"").trim())&&"."!=_&&(n[b][w]=+_||0);break;case"@":n[b][w]=new Date(E.read_shift(-8,"f")-621356832e5);break;case"T":n[b][w]=new Date(864e5*(E.read_shift(4)-2440588)+E.read_shift(4));break;case"Y":n[b][w]=E.read_shift(4,"i")/1e4;break;case"O":n[b][w]=-E.read_shift(-8,"f");break;case"B":if(o&&8==d[w].len){n[b][w]=E.read_shift(8,"f");break}case"G":case"P":E.l+=d[w].len;break;case"0":if("_NullFlags"===d[w].name)break;default:throw new Error("DBF Unsupported data type "+d[w].type)}}else a.l+=h;if(2!=s&&a.l=0&&c(+s.codepage),"string"==s.type)throw new Error("Cannot write DBF to JS string");var i=Wt(),o=Kc(e,{header:1,raw:!0,cellDates:!0}),l=o[0],f=o.slice(1),h=0,u=0,d=0,p=1;for(h=0;h":190,"?":191,"{":223},t=new RegExp("N("+U(e).join("|").replace(/\|\|\|/,"|\\||").replace(/([?()+])/g,"\\$1")+"|\\|)","gm"),r=function(t,r){var n=e[r];return"number"==typeof n?p(n):n},n=function(e,t,r){var n=t.charCodeAt(0)-32<<4|r.charCodeAt(0)-48;return 59==n?e:p(n)};function a(e,a){var s,i=e.split(/[\n\r]+/),o=-1,l=-1,f=0,h=0,u=[],d=[],p=null,g={},m=[],v=[],b=[],w=0;for(+a.codepage>=0&&c(+a.codepage);f!==i.length;++f){w=0;var C,E=i[f].trim().replace(/\x1B([\x20-\x2F])([\x30-\x3F])/g,n).replace(t,r),S=E.replace(/;;/g,"\0").split(";").map(function(e){return e.replace(/\u0000/g,";")}),_=S[0];if(E.length>0)switch(_){case"ID":case"E":case"B":case"O":case"W":break;case"P":"P"==S[1].charAt(0)&&d.push(E.slice(3).replace(/;;/g,";"));break;case"C":var A=!1,B=!1,T=!1,k=!1,y=-1,I=-1;for(h=1;h-1&&u[y][I];if(!O||!O[1])throw new Error("SYLK shared formula cannot find base");u[o][l][1]=pi(O[1],{r:o-y,c:l-I})}break;case"F":var F=0;for(h=1;h0?(m[o].hpt=w,m[o].hpx=Ts(w)):0===w&&(m[o].hidden=!0);break;default:if(a&&a.WTF)throw new Error("SYLK bad record "+E)}F<1&&(p=null);break;default:if(a&&a.WTF)throw new Error("SYLK bad record "+E)}}return m.length>0&&(g["!rows"]=m),v.length>0&&(g["!cols"]=v),a&&a.sheetRows&&(u=u.slice(0,a.sheetRows)),[u,g]}function s(e,t){var r=function(e,t){switch(t.type){case"base64":return a(m.decode(e),t);case"binary":return a(e,t);case"buffer":return a(v&&Buffer.isBuffer(e)?e.toString("binary"):A(e),t);case"array":return a(ee(e),t)}throw new Error("Unrecognized type "+t.type)}(e,t),n=r[0],s=r[1],i=ir(n,t);return U(s).forEach(function(e){i[e]=s[e]}),i}function i(e,t,r,n){var a="C;Y"+(r+1)+";X"+(n+1)+";K";switch(e.t){case"n":a+=e.v||0,e.f&&!e.F&&(a+=";E"+di(e.f,{r,c:n}));break;case"b":a+=e.v?"TRUE":"FALSE";break;case"e":a+=e.w||e.v;break;case"d":a+='"'+(e.w||e.v)+'"';break;case"s":a+='"'+e.v.replace(/"/g,"")+'"'}return a}return e["|"]=254,{to_workbook:function(e,t){return ar(s(e,t),t)},to_sheet:s,from_sheet:function(e,t){var r,n,a=["ID;PWXL;N;E"],s=[],o=rr(e["!ref"]),l=Array.isArray(e),c="\r\n";a.push("P;PGeneral"),a.push("F;P0;DG0G8;M255"),e["!cols"]&&(n=a,e["!cols"].forEach(function(e,t){var r="F;W"+(t+1)+" "+(t+1)+" ";e.hidden?r+="0":("number"!=typeof e.width||e.wpx||(e.wpx=bs(e.width)),"number"!=typeof e.wpx||e.wch||(e.wch=ws(e.wpx)),"number"==typeof e.wch&&(r+=Math.round(e.wch)))," "!=r.charAt(r.length-1)&&n.push(r)})),e["!rows"]&&function(e,t){t.forEach(function(t,r){var n="F;";t.hidden?n+="M0;":t.hpt?n+="M"+20*t.hpt+";":t.hpx&&(n+="M"+20*Bs(t.hpx)+";"),n.length>2&&e.push(n+"R"+(r+1))})}(a,e["!rows"]),a.push("B;Y"+(o.e.r-o.s.r+1)+";X"+(o.e.c-o.s.c+1)+";D"+[o.s.c,o.s.r,o.e.c,o.e.r].join(" "));for(var f=o.s.r;f<=o.e.r;++f)for(var h=o.s.c;h<=o.e.c;++h){var u=qt({r:f,c:h});(r=l?(e[f]||[])[h]:e[u])&&(null!=r.v||r.f&&!r.F)&&s.push(i(r,0,f,h))}return a.join(c)+c+s.join(c)+c+"E"+c}}}(),La=function(){function e(e,t){for(var r=e.split("\n"),n=-1,a=-1,s=0,i=[];s!==r.length;++s)if("BOT"!==r[s].trim()){if(!(n<0)){for(var o=r[s].trim().split(","),l=o[0],c=o[1],f=r[++s]||"";1&(f.match(/["]/g)||[]).length&&s=0?o=c:a=c}}),l>=0&&-1==o&&a>=0&&(o=a,a=-1);var c=(""+(n>=0?n:(new Date).getFullYear())).slice(-4)+"-"+("00"+(a>=1?a:1)).slice(-2)+"-"+("00"+(s>=1?s:1)).slice(-2);7==c.length&&(c="0"+c),8==c.length&&(c="20"+c);var f=("00"+(i>=0?i:0)).slice(-2)+":"+("00"+(o>=0?o:0)).slice(-2)+":"+("00"+(l>=0?l:0)).slice(-2);return-1==i&&-1==o&&-1==l?c:-1==n&&-1==a&&-1==s?f:c+"T"+f}(0,r.dateNF,t.match(b)||[]),a=1),r.cellDates?(n.t="d",n.v=q(t,a)):(n.t="n",n.v=X(q(t,a))),!1!==r.cellText&&(n.w=x.format(n.z,n.v instanceof Date?X(n.v):n.v)),r.cellNF||delete n.z}else n.t="s",n.v=t;else n.t="n",!1!==r.cellText&&(n.w=t),n.v=c;if("z"==n.t||(r.dense?(s[o]||(s[o]=[]),s[o][l]=n):s[qt({c:l,r:o})]=n),f=h+1,g=e.charCodeAt(f),i.e.c0&&w(),s["!ref"]=tr(i),s}function s(t,r){var n="",s="string"==r.type?[0,0,0,0]:Nc(t,r);switch(r.type){case"base64":n=m.decode(t);break;case"binary":case"string":n=t;break;case"buffer":n=65001==r.codepage?t.toString("utf8"):r.codepage&&"undefined"!=typeof cptable?cptable.utils.decode(r.codepage,t):v&&Buffer.isBuffer(t)?t.toString("binary"):A(t);break;case"array":n=ee(t);break;default:throw new Error("Unrecognized type "+r.type)}return 239==s[0]&&187==s[1]&&191==s[2]?n=Pe(n.slice(3)):"string"!=r.type&&65001==r.codepage?n=Pe(n):"binary"==r.type&&"undefined"!=typeof cptable&&r.codepage&&(n=cptable.utils.decode(r.codepage,cptable.utils.encode(28591,n))),"socialcalc:version:"==n.slice(0,19)?Ma.to_sheet("string"==r.type?n:Pe(n),r):function(t,r){return r&&r.PRN?r.FS||"sep="==t.slice(0,4)||t.indexOf("\t")>=0||t.indexOf(",")>=0||t.indexOf(";")>=0?a(t,r):ir(function(t,r){var n=r||{},a=[];if(!t||0===t.length)return a;for(var s=t.split(/[\r\n]/),i=s.length-1;i>=0&&0===s[i].length;)--i;for(var o=10,l=0,c=0;c<=i;++c)-1==(l=s[c].indexOf(" "))?l=s[c].length:l++,o=Math.max(o,l);for(c=0;c<=i;++c){a[c]=[];var f=0;for(e(s[c].slice(0,o).trim(),a,c,f,n),f=1;f<=(s[c].length-o)/10+1;++f)e(s[c].slice(o+10*(f-1),o+10*f).trim(),a,c,f,n)}return n.sheetRows&&(a=a.slice(0,n.sheetRows)),a}(t,r),r):a(t,r)}(n,r)}return{to_workbook:function(e,t){return ar(s(e,t),t)},to_sheet:s,from_sheet:function(e){for(var t,r=[],n=rr(e["!ref"]),a=Array.isArray(e),s=n.s.r;s<=n.e.r;++s){for(var i=[],o=n.s.c;o<=n.e.c;++o){var l=qt({r:s,c:o});if((t=a?(e[s]||[])[o]:e[l])&&null!=t.v){for(var c=(t.w||(nr(t),t.w)||"").slice(0,10);c.length<10;)c+=" ";i.push(c+(0===o?" ":""))}else i.push(" ")}r.push(i.join(""))}return r.join("\n")}}}(),za=function(){function e(e,t,r){if(e){Mt(e,e.l||0);for(var n=r.Enum||w;e.l=16&&5==t[14]&&108===t[15])throw new Error("Unsupported Works 3 for Mac file");if(2==t[2])n.Enum=w,e(t,function(e,t,r){switch(r){case 0:n.vers=e,e>=4096&&(n.qpro=!0);break;case 6:h=e;break;case 204:e&&(i=e);break;case 222:i=e;break;case 15:case 51:n.qpro||(e[1].v=e[1].v.slice(1));case 13:case 14:case 16:14==r&&!(112&~e[2])&&(15&e[2])>1&&(15&e[2])<15&&(e[1].z=n.dateNF||x._table[14],n.cellDates&&(e[1].t="d",e[1].v=Y(e[1].v))),n.qpro&&e[3]>o&&(a["!ref"]=tr(h),l[s]=a,c.push(s),a=n.dense?[]:{},h={s:{r:0,c:0},e:{r:0,c:0}},o=e[3],s=i||"Sheet"+(o+1),i="");var f=n.dense?(a[e[0].r]||[])[e[0].c]:a[qt(e[0])];if(f){f.t=e[1].t,f.v=e[1].v,null!=e[1].z&&(f.z=e[1].z),null!=e[1].f&&(f.f=e[1].f);break}n.dense?(a[e[0].r]||(a[e[0].r]=[]),a[e[0].r][e[0].c]=e[1]):a[qt(e[0])]=e[1]}},n);else{if(26!=t[2]&&14!=t[2])throw new Error("Unrecognized LOTUS BOF "+t[2]);n.Enum=C,14==t[2]&&(n.qpro=!0,t.l=0),e(t,function(e,t,r){switch(r){case 204:s=e;break;case 22:e[1].v=e[1].v.slice(1);case 23:case 24:case 25:case 37:case 39:case 40:if(e[3]>o&&(a["!ref"]=tr(h),l[s]=a,c.push(s),a=n.dense?[]:{},h={s:{r:0,c:0},e:{r:0,c:0}},o=e[3],s="Sheet"+(o+1)),u>0&&e[0].r>=u)break;n.dense?(a[e[0].r]||(a[e[0].r]=[]),a[e[0].r][e[0].c]=e[1]):a[qt(e[0])]=e[1],h.e.c=128?95:s)}return n.write_shift(1,0),n}function s(e,t,r){var n=zt(7);return n.write_shift(1,255),n.write_shift(2,t),n.write_shift(2,e),n.write_shift(2,r,"i"),n}function i(e,t,r){var n=zt(13);return n.write_shift(1,255),n.write_shift(2,t),n.write_shift(2,e),n.write_shift(8,r,"f"),n}function o(e,t,r){var n=32768&t;return t=(n?e:0)+((t&=-32769)>=8192?t-16384:t),(n?"":"$")+(r?Qt(t):Yt(t))}var l={51:["FALSE",0],52:["TRUE",0],70:["LEN",1],80:["SUM",69],81:["AVERAGEA",69],82:["COUNTA",69],83:["MINA",69],84:["MAXA",69],111:["T",1]},f=["","","","","","","","","","+","-","*","/","^","=","<>","<=",">=","<",">","","","","","&","","","","","","",""];function h(e){var t=[{c:0,r:0},{t:"n",v:0},0];return t[0].r=e.read_shift(2),t[3]=e[e.l++],t[0].c=e[e.l++],t}function u(e,t,r,n){var a=zt(6+n.length);a.write_shift(2,e),a.write_shift(1,r),a.write_shift(1,t),a.write_shift(1,39);for(var s=0;s=128?95:i)}return a.write_shift(1,0),a}function d(e,t){var r=h(e),n=e.read_shift(4),a=e.read_shift(4),s=e.read_shift(2);if(65535==s)return 0===n&&3221225472===a?(r[1].t="e",r[1].v=15):0===n&&3489660928===a?(r[1].t="e",r[1].v=42):r[1].v=0,r;var i=32768&s;return s=(32767&s)-16446,r[1].v=(1-2*i)*(a*Math.pow(2,s+32)+n*Math.pow(2,s)),r}function p(e,t,r,n){var a=zt(14);if(a.write_shift(2,e),a.write_shift(1,r),a.write_shift(1,t),0==n)return a.write_shift(4,0),a.write_shift(4,0),a.write_shift(2,65535),a;var s,i=0,o=0,l=0;return n<0&&(i=1,n=-n),o=0|Math.log2(n),2147483648&(l=(n/=Math.pow(2,o-31))>>>0)||(++o,l=(n/=2)>>>0),n-=l,l|=2147483648,l>>>=0,s=(n*=Math.pow(2,32))>>>0,a.write_shift(4,s),a.write_shift(4,l),o+=16383+(i?32768:0),a.write_shift(2,o),a}function g(e,t){var r=h(e),n=e.read_shift(8,"f");return r[1].v=n,r}function v(e,t){return 0==e[e.l+t-1]?e.read_shift(t,"cstr"):""}function b(e,t){var r=zt(5+e.length);r.write_shift(2,14e3),r.write_shift(2,t);for(var n=0;n127?95:a}return r[r.l++]=0,r}var w={0:{n:"BOF",f:zn},1:{n:"EOF"},2:{n:"CALCMODE"},3:{n:"CALCORDER"},4:{n:"SPLIT"},5:{n:"SYNC"},6:{n:"RANGE",f:function(e,t,r){var n={s:{c:0,r:0},e:{c:0,r:0}};return 8==t&&r.qpro?(n.s.c=e.read_shift(1),e.l++,n.s.r=e.read_shift(2),n.e.c=e.read_shift(1),e.l++,n.e.r=e.read_shift(2),n):(n.s.c=e.read_shift(2),n.s.r=e.read_shift(2),12==t&&r.qpro&&(e.l+=2),n.e.c=e.read_shift(2),n.e.r=e.read_shift(2),12==t&&r.qpro&&(e.l+=2),65535==n.s.c&&(n.s.c=n.e.c=n.s.r=n.e.r=0),n)}},7:{n:"WINDOW1"},8:{n:"COLW1"},9:{n:"WINTWO"},10:{n:"COLW2"},11:{n:"NAME"},12:{n:"BLANK"},13:{n:"INTEGER",f:function(e,t,n){var a=r(e,0,n);return a[1].v=e.read_shift(2,"i"),a}},14:{n:"NUMBER",f:function(e,t,n){var a=r(e,0,n);return a[1].v=e.read_shift(8,"f"),a}},15:{n:"LABEL",f:n},16:{n:"FORMULA",f:function(e,t,n){var a=e.l+t,s=r(e,0,n);if(s[1].v=e.read_shift(8,"f"),n.qpro)e.l=a;else{var i=e.read_shift(2);!function(e,t){Mt(e,0);for(var r=[],n=0,a="",s="",i="",c="";e.lr.length)return void console.error("WK1 bad formula parse 0x"+h.toString(16)+":|"+r.join("|")+"|");var g=r.slice(-n);r.length-=n,r.push(l[h][0]+"("+g.join(",")+")")}}}1==r.length?t[1].f=""+r[0]:console.error("WK1 bad formula parse |"+r.join("|")+"|")}(e.slice(e.l,e.l+i),s),e.l+=i}return s}},24:{n:"TABLE"},25:{n:"ORANGE"},26:{n:"PRANGE"},27:{n:"SRANGE"},28:{n:"FRANGE"},29:{n:"KRANGE1"},32:{n:"HRANGE"},35:{n:"KRANGE2"},36:{n:"PROTEC"},37:{n:"FOOTER"},38:{n:"HEADER"},39:{n:"SETUP"},40:{n:"MARGINS"},41:{n:"LABELFMT"},42:{n:"TITLES"},43:{n:"SHEETJS"},45:{n:"GRAPH"},46:{n:"NGRAPH"},47:{n:"CALCCOUNT"},48:{n:"UNFORMATTED"},49:{n:"CURSORW12"},50:{n:"WINDOW"},51:{n:"STRING",f:n},55:{n:"PASSWORD"},56:{n:"LOCKED"},60:{n:"QUERY"},61:{n:"QUERYNAME"},62:{n:"PRINT"},63:{n:"PRINTNAME"},64:{n:"GRAPH2"},65:{n:"GRAPHNAME"},66:{n:"ZOOM"},67:{n:"SYMSPLIT"},68:{n:"NSROWS"},69:{n:"NSCOLS"},70:{n:"RULER"},71:{n:"NNAME"},72:{n:"ACOMM"},73:{n:"AMACRO"},74:{n:"PARSE"},102:{n:"PRANGES??"},103:{n:"RRANGES??"},104:{n:"FNAME??"},105:{n:"MRANGES??"},204:{n:"SHEETNAMECS",f:v},222:{n:"SHEETNAMELP",f:function(e,t){var r=e[e.l++];r>t-1&&(r=t-1);for(var n="";n.length>1;if(1&r[1].v)switch(7&n){case 0:n=5e3*(n>>3);break;case 1:n=500*(n>>3);break;case 2:n=(n>>3)/20;break;case 3:n=(n>>3)/200;break;case 4:n=(n>>3)/2e3;break;case 5:n=(n>>3)/2e4;break;case 6:n=(n>>3)/16;break;case 7:n=(n>>3)/64}return r[1].v=n,r}},25:{n:"FORMULA19",f:function(e,t){var r=d(e);return e.l+=t-14,r}},26:{n:"FORMULA1A"},27:{n:"XFORMAT",f:function(e,t){for(var r={},n=e.l+t;e.l>6,r}},38:{n:"??"},39:{n:"NUMBER27",f:g},40:{n:"FORMULA28",f:function(e,t){var r=g(e);return e.l+=t-10,r}},142:{n:"??"},147:{n:"??"},150:{n:"??"},151:{n:"??"},152:{n:"??"},153:{n:"??"},154:{n:"??"},155:{n:"??"},156:{n:"??"},163:{n:"??"},174:{n:"??"},175:{n:"??"},176:{n:"??"},177:{n:"??"},184:{n:"??"},185:{n:"??"},186:{n:"??"},187:{n:"??"},188:{n:"??"},195:{n:"??"},201:{n:"??"},204:{n:"SHEETNAMECS",f:v},205:{n:"??"},206:{n:"??"},207:{n:"??"},208:{n:"??"},256:{n:"??"},259:{n:"??"},260:{n:"??"},261:{n:"??"},262:{n:"??"},263:{n:"??"},265:{n:"??"},266:{n:"??"},267:{n:"??"},268:{n:"??"},270:{n:"??"},271:{n:"??"},384:{n:"??"},389:{n:"??"},390:{n:"??"},393:{n:"??"},396:{n:"??"},512:{n:"??"},514:{n:"??"},513:{n:"??"},516:{n:"??"},517:{n:"??"},640:{n:"??"},641:{n:"??"},642:{n:"??"},643:{n:"??"},644:{n:"??"},645:{n:"??"},646:{n:"??"},647:{n:"??"},648:{n:"??"},658:{n:"??"},659:{n:"??"},660:{n:"??"},661:{n:"??"},662:{n:"??"},665:{n:"??"},666:{n:"??"},768:{n:"??"},772:{n:"??"},1537:{n:"SHEETINFOQP",f:function(e,t,r){if(r.qpro&&!(t<21)){var n=e.read_shift(1);return e.l+=17,e.read_shift(1),e.l+=2,[n,e.read_shift(t-21,"cstr")]}}},1600:{n:"??"},1602:{n:"??"},1793:{n:"??"},1794:{n:"??"},1795:{n:"??"},1796:{n:"??"},1920:{n:"??"},2048:{n:"??"},2049:{n:"??"},2052:{n:"??"},2688:{n:"??"},10998:{n:"??"},12849:{n:"??"},28233:{n:"??"},28484:{n:"??"},65535:{n:""}};return{sheet_to_wk1:function(e,t){var r=t||{};if(+r.codepage>=0&&c(+r.codepage),"string"==r.type)throw new Error("Cannot write WK1 to JS string");var n,o=Wt(),l=rr(e["!ref"]),f=Array.isArray(e),h=[];Ql(o,0,((n=zt(2)).write_shift(2,1030),n)),Ql(o,6,function(e){var t=zt(8);return t.write_shift(2,e.s.c),t.write_shift(2,e.s.r),t.write_shift(2,e.e.c),t.write_shift(2,e.e.r),t}(l));for(var u=Math.min(l.e.r,8191),d=l.s.r;d<=u;++d)for(var p=Yt(d),g=l.s.c;g<=l.e.c;++g){d===l.s.r&&(h[g]=Qt(g));var m=h[g]+p,v=f?(e[d]||[])[g]:e[m];v&&"z"!=v.t&&("n"==v.t?(0|v.v)==v.v&&v.v>=-32768&&v.v<=32767?Ql(o,13,s(d,g,v.v)):Ql(o,14,i(d,g,v.v)):Ql(o,15,a(d,g,nr(v).slice(0,239))))}return Ql(o,1),o.end()},book_to_wk3:function(e,t){var r=t||{};if(+r.codepage>=0&&c(+r.codepage),"string"==r.type)throw new Error("Cannot write WK3 to JS string");var n=Wt();Ql(n,0,function(e){var t=zt(26);t.write_shift(2,4096),t.write_shift(2,4),t.write_shift(4,0);for(var r=0,n=0,a=0,s=0;s8191&&(r=8191),t.write_shift(2,r),t.write_shift(1,a),t.write_shift(1,n),t.write_shift(2,0),t.write_shift(2,0),t.write_shift(1,1),t.write_shift(1,2),t.write_shift(4,0),t.write_shift(4,0),t}(e));for(var a=0,s=0;a":case"":t.shadow=1;break;case"":break;case"":case"":t.outline=1;break;case"":break;case"":case"":t.strike=1;break;case"":break;case"":case"":t.u=1;break;case"":break;case"":case"":t.b=1;break;case"":break;case"":case"":t.i=1;break;case"":break;case"":case"":break;case"":a=!1;break;default:if(47!==s[0].charCodeAt(1)&&!a)throw new Error("Unrecognized rich format "+s[0])}}return t}(s[1])),a}var n=/<(?:\w+:)?r>/g,a=/<\/(?:\w+:)?r>/;return function(e){return e.replace(n,"").split(a).map(r).filter(function(e){return e.v})}}(),Wa=function(){var e=/(\r\n|\n)/g;function t(t){var r=[[],t.v,[]];return t.v?(t.s&&function(e,t,r){var n=[];e.u&&n.push("text-decoration: underline;"),e.uval&&n.push("text-underline-style:"+e.uval+";"),e.sz&&n.push("font-size:"+e.sz+"pt;"),e.outline&&n.push("text-effect: outline;"),e.shadow&&n.push("text-shadow: auto;"),t.push(''),e.b&&(t.push(""),r.push("")),e.i&&(t.push(""),r.push("")),e.strike&&(t.push(""),r.push(""));var a=e.valign||"";"superscript"==a||"super"==a?a="sup":"subscript"==a&&(a="sub"),""!=a&&(t.push("<"+a+">"),r.push("")),r.push("")}(t.s,r[0],r[2]),r[0].join("")+r[1].replace(e,"
")+r[2].join("")):""}return function(e){return e.map(t).join("")}}(),Va=/<(?:\w+:)?t[^>]*>([^<]*)<\/(?:\w+:)?t>/g,Xa=/<(?:\w+:)?r>/,Ga=/<(?:\w+:)?rPh.*?>([\s\S]*?)<\/(?:\w+:)?rPh>/g;function ja(e,t){var r=!t||t.cellHTML,n={};return e?(e.match(/^\s*<(?:\w+:)?t[^>]*>/)?(n.t=ke(Pe(e.slice(e.indexOf(">")+1).split(/<\/(?:\w+:)?t>/)[0]||"")),n.r=Pe(e),r&&(n.h=Fe(n.t))):e.match(Xa)&&(n.r=Pe(e),n.t=ke(Pe((e.replace(Ga,"").match(Va)||[]).join("").replace(be,""))),r&&(n.h=Wa(Ha(n.r)))),n):{t:""}}var Ka=/<(?:\w+:)?sst([^>]*)>([\s\S]*)<\/(?:\w+:)?sst>/,$a=/<(?:\w+:)?(?:si|sstItem)>/g,Ya=/<\/(?:\w+:)?(?:si|sstItem)>/;Zr.SST="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings";var Za=/^\s|\s$|[\t\n\r]/;function Qa(e,t){if(!t.bookSST)return"";var r=[me];r[r.length]=qe("sst",null,{xmlns:nt.main[0],count:e.Count,uniqueCount:e.Unique});for(var n=0;n!=e.length;++n)if(null!=e[n]){var a=e[n],s="";a.r?s+=a.r:(s+=""),s+="",r[r.length]=s}return r.length>2&&(r[r.length]="",r[1]=r[1].replace("/>",">")),r.join("")}var Ja=function(e,t){var r=!1;return null==t&&(r=!0,t=zt(15+4*e.t.length)),t.write_shift(1,0),cr(e.t,t),r?t.slice(0,t.l):t};function qa(e){var t=Wt();Vt(t,"BrtBeginSst",function(e,t){return t||(t=zt(8)),t.write_shift(4,e.Count),t.write_shift(4,e.Unique),t}(e));for(var r=0;r=4&&(e.l+=t-4),r}function rs(e){for(var t=e.read_shift(4),r=e.l+t-4,n={},a=e.read_shift(4),s=[];a-- >0;)s.push({t:e.read_shift(4),v:e.read_shift(0,"lpp4")});if(n.name=e.read_shift(0,"lpp4"),n.comps=s,e.l!=r)throw new Error("Bad DataSpaceMapEntry: "+e.l+" != "+r);return n}function ns(e,t){var r=e.l+t,n={};n.Flags=63&e.read_shift(4),e.l+=4,n.AlgID=e.read_shift(4);var a=!1;switch(n.AlgID){case 26126:case 26127:case 26128:a=36==n.Flags;break;case 26625:a=4==n.Flags;break;case 0:a=16==n.Flags||4==n.Flags||36==n.Flags;break;default:throw"Unrecognized encryption algorithm: "+n.AlgID}if(!a)throw new Error("Encryption Flags/AlgID mismatch");return n.AlgIDHash=e.read_shift(4),n.KeySize=e.read_shift(4),n.ProviderType=e.read_shift(4),e.l+=8,n.CSPName=e.read_shift(r-e.l>>1,"utf16le"),e.l=r,n}function as(e,t){var r={},n=e.l+t;return e.l+=4,r.Salt=e.slice(e.l,e.l+16),e.l+=16,r.Verifier=e.slice(e.l,e.l+16),e.l+=16,e.read_shift(4),r.VerifierHash=e.slice(e.l,n),e.l=n,r}function ss(e){if(36!=(63&e.read_shift(4)))throw new Error("EncryptionInfo mismatch");var t=e.read_shift(4);return{t:"Std",h:ns(e,t),v:as(e,e.length-e.l)}}function is(){throw new Error("File is password-protected: ECMA-376 Extensible")}function os(e){var t=["saltSize","blockSize","keyBits","hashSize","cipherAlgorithm","cipherChaining","hashAlgorithm","saltValue"];e.l+=4;var r=e.read_shift(e.length-e.l,"utf8"),n={};return r.replace(be,function(e){var r=Ee(e);switch(Se(r[0])){case"":case"":case"":break;case"":case"=0;--r)n=((16384&n?1:0)|n<<1&32767)^t[r];return 52811^n}var cs,fs,hs,us,ds=(cs=[187,255,255,186,255,255,185,128,0,190,15,0,191,15,0],fs=[57840,7439,52380,33984,4364,3600,61902,12606,6258,57657,54287,34041,10252,43370,20163],hs=[44796,19929,39858,10053,20106,40212,10761,31585,63170,64933,60267,50935,40399,11199,17763,35526,1453,2906,5812,11624,23248,885,1770,3540,7080,14160,28320,56640,55369,41139,20807,41614,21821,43642,17621,28485,56970,44341,19019,38038,14605,29210,60195,50791,40175,10751,21502,43004,24537,18387,36774,3949,7898,15796,31592,63184,47201,24803,49606,37805,14203,28406,56812,17824,35648,1697,3394,6788,13576,27152,43601,17539,35078,557,1114,2228,4456,30388,60776,51953,34243,7079,14158,28316,14128,28256,56512,43425,17251,34502,7597,13105,26210,52420,35241,883,1766,3532,4129,8258,16516,33032,4657,9314,18628],us=function(e,t){return 255&((r=e^t)/2|128*r);var r},function(e){for(var t,r,n,a=es(e),s=function(e){for(var t=fs[e.length-1],r=104,n=e.length-1;n>=0;--n)for(var a=e[n],s=0;7!=s;++s)64&a&&(t^=hs[r]),a*=2,--r;return t}(a),i=a.length,o=C(16),l=0;16!=l;++l)o[l]=0;for(1&~i||(t=s>>8,o[i]=us(cs[0],t),--i,t=255&s,r=a[a.length-1],o[i]=us(r,t));i>0;)t=s>>8,o[--i]=us(a[i],t),t=255&s,o[--i]=us(a[i],t);for(i=15,n=15-a.length;n>0;)t=s>>8,o[i]=us(cs[n],t),--n,t=255&s,o[--i]=us(a[i],t),--i,--n;return o});var ps=function(){function e(e,r){switch(r.type){case"base64":return t(m.decode(e),r);case"binary":return t(e,r);case"buffer":return t(v&&Buffer.isBuffer(e)?e.toString("binary"):A(e),r);case"array":return t(ee(e),r)}throw new Error("Unrecognized type "+r.type)}function t(e,t){var r=(t||{}).dense?[]:{},n=e.match(/\\trowd.*?\\row\b/g);if(!n.length)throw new Error("RTF missing table");var a={s:{c:0,r:0},e:{c:0,r:n.length-1}};return n.forEach(function(e,t){Array.isArray(r)&&(r[t]=[]);for(var n,s=/\\\w+\b/g,i=0,o=-1;n=s.exec(e);){if("\\cell"===n[0]){var l=e.slice(i,s.lastIndex-n[0].length);if(" "==l[0]&&(l=l.slice(1)),++o,l.length){var c={v:l,t:"s"};Array.isArray(r)?r[t][o]=c:r[qt({r:t,c:o})]=c}}i=s.lastIndex}o>a.e.c&&(a.e.c=o)}),r["!ref"]=tr(a),r}return{to_workbook:function(t,r){return ar(e(t,r),r)},to_sheet:e,from_sheet:function(e){for(var t,r=["{\\rtf1\\ansi"],n=rr(e["!ref"]),a=Array.isArray(e),s=n.s.r;s<=n.e.r;++s){r.push("\\trowd\\trautofit1");for(var i=n.s.c;i<=n.e.c;++i)r.push("\\cellx"+(i+1));for(r.push("\\pard\\intbl"),i=n.s.c;i<=n.e.c;++i){var o=qt({r:s,c:i});(t=a?(e[s]||[])[i]:e[o])&&(null!=t.v||t.f&&!t.F)&&(r.push(" "+(t.w||(nr(t),t.w))),r.push("\\cell"))}r.push("\\pard\\intbl\\row")}return r.join("")+"}"}}}();function gs(e){for(var t=0,r=1;3!=t;++t)r=256*r+(e[t]>255?255:e[t]<0?0:e[t]);return r.toString(16).toUpperCase().slice(1)}function ms(e,t){if(0===t)return e;var r=function(e){var t=e[0]/255,r=e[1]/255,n=e[2]/255,a=Math.max(t,r,n),s=Math.min(t,r,n),i=a-s;if(0===i)return[0,0,t];var o,l=0,c=a+s;switch(o=i/(c>1?2-c:c),a){case t:l=((r-n)/i+6)%6;break;case r:l=(n-t)/i+2;break;case n:l=(t-r)/i+4}return[l/6,o,c/2]}(function(e){var t=e.slice("#"===e[0]?1:0).slice(0,6);return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]}(e));return r[2]=t<0?r[2]*(1+t):1-(1-r[2])*(1-t),gs(function(e){var t,r=e[0],n=e[1],a=e[2],s=2*n*(a<.5?a:1-a),i=a-s/2,o=[i,i,i],l=6*r;if(0!==n)switch(0|l){case 0:case 6:t=s*l,o[0]+=s,o[1]+=t;break;case 1:t=s*(2-l),o[0]+=t,o[1]+=s;break;case 2:t=s*(l-2),o[1]+=s,o[2]+=t;break;case 3:t=s*(4-l),o[1]+=t,o[2]+=s;break;case 4:t=s*(l-4),o[2]+=s,o[0]+=t;break;case 5:t=s*(6-l),o[2]+=t,o[0]+=s}for(var c=0;3!=c;++c)o[c]=Math.round(255*o[c]);return o}(r))}var vs=6;function bs(e){return Math.floor((e+Math.round(128/vs)/256)*vs)}function ws(e){return Math.floor((e-5)/vs*100+.5)/100}function Cs(e){return Math.round((e*vs+5)/vs*256)/256}function Es(e){return Cs(ws(bs(e)))}function Ss(e){var t=Math.abs(e-Es(e)),r=vs;if(t>.005)for(vs=1;vs<15;++vs)Math.abs(e-Es(e))<=t&&(t=Math.abs(e-Es(e)),r=vs);vs=r}function _s(e){e.width?(e.wpx=bs(e.width),e.wch=ws(e.wpx),e.MDW=vs):e.wpx?(e.wch=ws(e.wpx),e.width=Cs(e.wch),e.MDW=vs):"number"==typeof e.wch&&(e.width=Cs(e.wch),e.wpx=bs(e.width),e.MDW=vs),e.customWidth&&delete e.customWidth}var As=96;function Bs(e){return 96*e/As}function Ts(e){return e*As/96}var ks,ys,xs,Is,Rs,Os={None:"none",Solid:"solid",Gray50:"mediumGray",Gray75:"darkGray",Gray25:"lightGray",HorzStripe:"darkHorizontal",VertStripe:"darkVertical",ReverseDiagStripe:"darkDown",DiagStripe:"darkUp",DiagCross:"darkGrid",ThickDiagCross:"darkTrellis",ThinHorzStripe:"lightHorizontal",ThinVertStripe:"lightVertical",ThinReverseDiagStripe:"lightDown",ThinHorzCross:"lightGrid"},Fs=["numFmtId","fillId","fontId","borderId","xfId"],Ds=["applyAlignment","applyBorder","applyFill","applyFont","applyNumberFormat","applyProtection","pivotButton","quotePrefix"],Ns=(ks=/<(?:\w+:)?numFmts([^>]*)>[\S\s]*?<\/(?:\w+:)?numFmts>/,ys=/<(?:\w+:)?cellXfs([^>]*)>[\S\s]*?<\/(?:\w+:)?cellXfs>/,xs=/<(?:\w+:)?fills([^>]*)>[\S\s]*?<\/(?:\w+:)?fills>/,Is=/<(?:\w+:)?fonts([^>]*)>[\S\s]*?<\/(?:\w+:)?fonts>/,Rs=/<(?:\w+:)?borders([^>]*)>[\S\s]*?<\/(?:\w+:)?borders>/,function(e,t,r){var n,a={};return e?((n=(e=e.replace(//gm,"").replace(//gm,"")).match(ks))&&function(e,t,r){t.NumberFmt=[];for(var n=U(x._table),a=0;a":case"":case"":case"":break;case"0){if(l>392){for(l=392;l>60&&null!=t.NumberFmt[l];--l);t.NumberFmt[l]=o}x.load(o,l)}break;default:if(r.WTF)throw new Error("unrecognized "+i[0]+" in numFmts")}}}(n,a,r),(n=e.match(Is))&&function(e,t,r,n){t.Fonts=[];var a={},s=!1;(e[0].match(be)||[]).forEach(function(e){var i=Ee(e);switch(Se(i[0])){case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":break;case"":case"":t.Fonts.push(a),a={};break;case"":a.bold=1;break;case"":a.italic=1;break;case"":a.underline=1;break;case"":a.strike=1;break;case"":a.outline=1;break;case"":a.shadow=1;break;case"":a.condense=1;break;case"":a.extend=1;break;case"":case"":s=!1;break;default:if(n&&n.WTF&&!s)throw new Error("unrecognized "+i[0]+" in fonts")}})}(n,a,t,r),(n=e.match(xs))&&function(e,t,r,n){t.Fills=[];var a={},s=!1;(e[0].match(be)||[]).forEach(function(e){var r=Ee(e);switch(Se(r[0])){case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":break;case"":case"":a={},t.Fills.push(a);break;case"":t.Fills.push(a),a={};break;case"":r.patternType&&(a.patternType=r.patternType);break;case"":s=!1;break;default:if(n&&n.WTF&&!s)throw new Error("unrecognized "+r[0]+" in fills")}})}(n,a,0,r),(n=e.match(Rs))&&function(e,t,r,n){t.Borders=[];var a={},s=!1;(e[0].match(be)||[]).forEach(function(e){var r=Ee(e);switch(Se(r[0])){case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":break;case"":case"":a={},r.diagonalUp&&(a.diagonalUp=Ne(r.diagonalUp)),r.diagonalDown&&(a.diagonalDown=Ne(r.diagonalDown)),t.Borders.push(a);break;case"":s=!1;break;default:if(n&&n.WTF&&!s)throw new Error("unrecognized "+r[0]+" in borders")}})}(n,a,0,r),(n=e.match(ys))&&function(e,t,r){var n;t.CellXf=[];var a=!1;(e[0].match(be)||[]).forEach(function(e){var s=Ee(e),i=0;switch(Se(s[0])){case"":case"":case"":case"":case"":case"":case"":case"":case"":break;case"":for(delete(n=s)[0],i=0;i392)for(i=392;i>60;--i)if(t.NumberFmt[n.numFmtId]==t.NumberFmt[i]){n.numFmtId=i;break}t.CellXf.push(n);break;case"":var o={};s.vertical&&(o.vertical=s.vertical),s.horizontal&&(o.horizontal=s.horizontal),null!=s.textRotation&&(o.textRotation=s.textRotation),s.indent&&(o.indent=s.indent),s.wrapText&&(o.wrapText=Ne(s.wrapText)),n.alignment=o;break;case"":case"":a=!1;break;default:if(r&&r.WTF&&!a)throw new Error("unrecognized "+s[0]+" in cellXfs")}})}(n,a,r),a):a}),Ps=qe("styleSheet",null,{xmlns:nt.main[0],"xmlns:vt":nt.vt});function Ls(e,t){var r,n=[me,Ps];return e.SSF&&null!=(r=function(e){var t=[""];return[[5,8],[23,26],[41,44],[50,392]].forEach(function(r){for(var n=r[0];n<=r[1];++n)null!=e[n]&&(t[t.length]=qe("numFmt",null,{numFmtId:n,formatCode:Ie(e[n])}))}),1===t.length?"":(t[t.length]="",t[0]=qe("numFmts",null,{count:t.length-2}).replace("/>",">"),t.join(""))}(e.SSF))&&(n[n.length]=r),n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',(r=function(e){var t=[];return t[t.length]=qe("cellXfs",null),e.forEach(function(e){t[t.length]=qe("xf",null,e)}),t[t.length]="",2===t.length?"":(t[0]=qe("cellXfs",null,{count:t.length-2}).replace("/>",">"),t.join(""))}(t.cellXfs))&&(n[n.length]=r),n[n.length]='',n[n.length]='',n[n.length]='',n.length>2&&(n[n.length]="",n[1]=n[1].replace("/>",">")),n.join("")}function Ms(e,t,r){r||(r=zt(6+4*t.length)),r.write_shift(2,e),cr(t,r);var n=r.length>r.l?r.slice(0,r.l):r;return null==r.l&&(r.l=r.length),n}Zr.STY="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles";var Us=H(["none","solid","mediumGray","darkGray","lightGray","darkHorizontal","darkVertical","darkDown","darkUp","darkGrid","darkTrellis","lightHorizontal","lightVertical","lightDown","lightUp","lightGrid","lightTrellis","gray125","gray0625"]),zs=Ut;function Hs(e,t){t||(t=zt(84));var r=Us[e.patternType];null==r&&(r=40),t.write_shift(4,r);var n=0;if(40!=r)for(Rr({auto:1},t),Rr({auto:1},t);n<12;++n)t.write_shift(4,0);else{for(;n<4;++n)t.write_shift(4,0);for(;n<12;++n)t.write_shift(4,0)}return t.length>t.l?t.slice(0,t.l):t}function Ws(e,t,r){return r||(r=zt(16)),r.write_shift(2,t||0),r.write_shift(2,e.numFmtId||0),r.write_shift(2,0),r.write_shift(2,0),r.write_shift(2,0),r.write_shift(1,0),r.write_shift(1,0),r.write_shift(1,0),r.write_shift(1,0),r.write_shift(1,0),r.write_shift(1,0),r}function Vs(e,t){return t||(t=zt(10)),t.write_shift(1,0),t.write_shift(1,0),t.write_shift(4,0),t.write_shift(4,0),t}var Xs=Ut;function Gs(e,t){var r=Wt();return Vt(r,"BrtBeginStyleSheet"),function(e,t){if(t){var r=0;[[5,8],[23,26],[41,44],[50,392]].forEach(function(e){for(var n=e[0];n<=e[1];++n)null!=t[n]&&++r}),0!=r&&(Vt(e,"BrtBeginFmts",or(r)),[[5,8],[23,26],[41,44],[50,392]].forEach(function(r){for(var n=r[0];n<=r[1];++n)null!=t[n]&&Vt(e,"BrtFmt",Ms(n,t[n]))}),Vt(e,"BrtEndFmts"))}}(r,e.SSF),function(e){Vt(e,"BrtBeginFonts",or(1)),Vt(e,"BrtFont",function(e,t){t||(t=zt(153)),t.write_shift(2,20*e.sz),function(e,t){t||(t=zt(2));var r=(e.italic?2:0)|(e.strike?8:0)|(e.outline?16:0)|(e.shadow?32:0)|(e.condense?64:0)|(e.extend?128:0);t.write_shift(1,r),t.write_shift(1,0)}(e,t),t.write_shift(2,e.bold?700:400);var r=0;"superscript"==e.vertAlign?r=1:"subscript"==e.vertAlign&&(r=2),t.write_shift(2,r),t.write_shift(1,e.underline||0),t.write_shift(1,e.family||0),t.write_shift(1,e.charset||0),t.write_shift(1,0),Rr(e.color,t);var n=0;return"major"==e.scheme&&(n=1),"minor"==e.scheme&&(n=2),t.write_shift(1,n),cr(e.name,t),t.length>t.l?t.slice(0,t.l):t}({sz:12,color:{theme:1},name:"Calibri",family:2,scheme:"minor"})),Vt(e,"BrtEndFonts")}(r),function(e){Vt(e,"BrtBeginFills",or(2)),Vt(e,"BrtFill",Hs({patternType:"none"})),Vt(e,"BrtFill",Hs({patternType:"gray125"})),Vt(e,"BrtEndFills")}(r),function(e){Vt(e,"BrtBeginBorders",or(1)),Vt(e,"BrtBorder",function(e,t){return t||(t=zt(51)),t.write_shift(1,0),Vs(0,t),Vs(0,t),Vs(0,t),Vs(0,t),Vs(0,t),t.length>t.l?t.slice(0,t.l):t}()),Vt(e,"BrtEndBorders")}(r),function(e){Vt(e,"BrtBeginCellStyleXFs",or(1)),Vt(e,"BrtXF",Ws({numFmtId:0,fontId:0,fillId:0,borderId:0},65535)),Vt(e,"BrtEndCellStyleXFs")}(r),function(e,t){Vt(e,"BrtBeginCellXFs",or(t.length)),t.forEach(function(t){Vt(e,"BrtXF",Ws(t,0))}),Vt(e,"BrtEndCellXFs")}(r,t.cellXfs),function(e){Vt(e,"BrtBeginStyles",or(1)),Vt(e,"BrtStyle",function(e,t){return t||(t=zt(52)),t.write_shift(4,e.xfId),t.write_shift(2,1),t.write_shift(1,+e.builtinId),t.write_shift(1,0),Cr(e.name||"",t),t.length>t.l?t.slice(0,t.l):t}({xfId:0,builtinId:0,name:"Normal"})),Vt(e,"BrtEndStyles")}(r),function(e){Vt(e,"BrtBeginDXFs",or(0)),Vt(e,"BrtEndDXFs")}(r),function(e){Vt(e,"BrtBeginTableStyles",function(){var e=zt(2052);return e.write_shift(4,0),Cr("TableStyleMedium9",e),Cr("PivotStyleMedium4",e),e.length>e.l?e.slice(0,e.l):e}()),Vt(e,"BrtEndTableStyles")}(r),Vt(r,"BrtEndStyleSheet"),r.end()}Zr.THEME="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme";var js=["","","","","","","","","","","",""];function Ks(e,t,r){t.themeElements.clrScheme=[];var n={};(e[0].match(be)||[]).forEach(function(e){var a=Ee(e);switch(a[0]){case"":break;case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":"/"===a[0].charAt(1)?(t.themeElements.clrScheme[js.indexOf(a[0])]=n,n={}):n.name=a[0].slice(3,a[0].length-1);break;default:if(r&&r.WTF)throw new Error("Unrecognized "+a[0]+" in clrScheme")}})}function $s(){}function Ys(){}var Zs=/]*)>[\s\S]*<\/a:clrScheme>/,Qs=/]*)>[\s\S]*<\/a:fontScheme>/,Js=/]*)>[\s\S]*<\/a:fmtScheme>/,qs=/]*)>[\s\S]*<\/a:themeElements>/;function ei(e,t){if(!e||0===e.length)return ei(ti());var r,n={};if(!(r=e.match(qs)))throw new Error("themeElements not found in theme");return function(e,t,r){var n;t.themeElements={},[["clrScheme",Zs,Ks],["fontScheme",Qs,$s],["fmtScheme",Js,Ys]].forEach(function(a){if(!(n=e.match(a[1])))throw new Error(a[0]+" not found in themeElements");a[2](n,t,r)})}(r[0],n,t),n.raw=e,n}function ti(e,t){if(t&&t.themeXLSX)return t.themeXLSX;if(e&&"string"==typeof e.raw)return e.raw;var r=[me];return r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]="",r.join("")}function ri(e){var t=e.read_shift(2),r=e.read_shift(2)-4,n=[t];switch(t){case 4:case 5:case 7:case 8:case 9:case 10:case 11:case 13:n[1]=function(e){var t={};switch(t.xclrType=e.read_shift(2),t.nTintShade=e.read_shift(2),t.xclrType){case 0:case 4:e.l+=4;break;case 1:t.xclrValue=function(e){return Ut(e,4)}(e);break;case 2:t.xclrValue=ea(e);break;case 3:t.xclrValue=function(e){return e.read_shift(4)}(e)}return e.l+=8,t}(e);break;case 6:n[1]=function(e,t){return Ut(e,t)}(e,r);break;case 14:case 15:n[1]=e.read_shift(1===r?1:2);break;default:throw new Error("Unrecognized ExtProp type: "+t+" "+r)}return n}function ni(e,t){t.forEach(function(e){e[0]})}Zr.IMG="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",Zr.DRAW="http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing";var ai=1024;function si(e,t){for(var r=[21600,21600],n=["m0,0l0",r[1],r[0],r[1],r[0],"0xe"].join(","),a=[qe("xml",null,{"xmlns:v":"urn:schemas-microsoft-com:vml","xmlns:o":at,"xmlns:x":st,"xmlns:mv":"http://macVmlSchemaUri"}).replace(/\/>/,">"),qe("o:shapelayout",qe("o:idmap",null,{"v:ext":"edit",data:e}),{"v:ext":"edit"}),qe("v:shapetype",[qe("v:stroke",null,{joinstyle:"miter"}),qe("v:path",null,{gradientshapeok:"t","o:connecttype":"rect"})].join(""),{id:"_x0000_t202","o:spt":202,coordsize:r.join(","),path:n})];ai<1e3*e;)ai+=1e3;return t.forEach(function(e){var t=Jt(e[0]),r={color2:"#BEFF82",type:"gradient"};"gradient"==r.type&&(r.angle="-180");var n="gradient"==r.type?qe("o:fill",null,{type:"gradientUnscaled","v:ext":"view"}):null,s=qe("v:fill",n,r);++ai,a=a.concat(["",s,qe("v:shadow",null,{on:"t",obscured:"t"}),qe("v:path",null,{"o:connecttype":"none"}),'
','',"","",Qe("x:Anchor",[t.c+1,0,t.r+1,0,t.c+3,20,t.r+5,20].join(",")),Qe("x:AutoFill","False"),Qe("x:Row",String(t.r)),Qe("x:Column",String(t.c)),e[1].hidden?"":"","",""])}),a.push(""),a.join("")}Zr.CMNT="http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments";var ii=qe("comments",null,{xmlns:nt.main[0]});function oi(e){var t=[me,ii],r=[];return t.push(""),e.forEach(function(e){e[1].forEach(function(e){var n=Ie(e.a);r.indexOf(n)>-1||(r.push(n),t.push(""+n+""))})}),t.push(""),t.push(""),e.forEach(function(e){e[1].forEach(function(n){t.push(''),t.push(Qe("t",null==n.t?"":Ie(n.t))),t.push("")})}),t.push(""),t.length>2&&(t[t.length]="",t[1]=t[1].replace("/>",">")),t.join("")}var li=lr;function ci(e){var t=Wt(),r=[];return Vt(t,"BrtBeginComments"),Vt(t,"BrtBeginCommentAuthors"),e.forEach(function(e){e[1].forEach(function(e){r.indexOf(e.a)>-1||(r.push(e.a.slice(0,54)),Vt(t,"BrtCommentAuthor",function(e){return cr(e.slice(0,54))}(e.a)))})}),Vt(t,"BrtEndCommentAuthors"),Vt(t,"BrtBeginCommentList"),e.forEach(function(e){e[1].forEach(function(n){n.iauthor=r.indexOf(n.a);var a={s:Jt(e[0]),e:Jt(e[0])};Vt(t,"BrtBeginComment",function(e,t){return null==t&&(t=zt(36)),t.write_shift(4,e[1].iauthor),yr(e[0],t),t.write_shift(4,0),t.write_shift(4,0),t.write_shift(4,0),t.write_shift(4,0),t}([a,n])),n.t&&n.t.length>0&&Vt(t,"BrtCommentText",function(e,t){var r=!1;return null==t&&(r=!0,t=zt(23+4*e.t.length)),t.write_shift(1,1),cr(e.t,t),t.write_shift(4,1),function(e,t){t||(t=zt(4)),t.write_shift(2,e.ich||0),t.write_shift(2,e.ifnt||0)}({ich:0,ifnt:0},t),r?t.slice(0,t.l):t}(n)),Vt(t,"BrtEndComment"),delete n.iauthor})}),Vt(t,"BrtEndCommentList"),Vt(t,"BrtEndComments"),t.end()}var fi=["xlsb","xlsm","xlam","biff8","xla"];Zr.DS="http://schemas.openxmlformats.org/officeDocument/2006/relationships/dialogsheet",Zr.MS="http://schemas.microsoft.com/office/2006/relationships/xlMacrosheet";var hi=function(){var e=/(^|[^A-Za-z_])R(\[?-?\d+\]|[1-9]\d*|)C(\[?-?\d+\]|[1-9]\d*|)(?![A-Za-z0-9_])/g,t={r:0,c:0};function r(e,r,n,a){var s=!1,i=!1;0==n.length?i=!0:"["==n.charAt(0)&&(i=!0,n=n.slice(1,-1)),0==a.length?s=!0:"["==a.charAt(0)&&(s=!0,a=a.slice(1,-1));var o=n.length>0?0|parseInt(n,10):0,l=a.length>0?0|parseInt(a,10):0;return s?l+=t.c:--l,i?o+=t.r:--o,r+(s?"":"$")+Qt(l)+(i?"":"$")+Yt(o)}return function(n,a){return t=a,n.replace(e,r)}}(),ui=/(^|[^._A-Z0-9])([$]?)([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])([$]?)(10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5})(?![_.\(A-Za-z0-9])/g,di=function(e,t){return e.replace(ui,function(e,r,n,a,s,i){var o=Zt(a)-(n?0:t.c),l=$t(i)-(s?0:t.r);return r+"R"+(0==l?"":s?l+1:"["+l+"]")+"C"+(0==o?"":n?o+1:"["+o+"]")})};function pi(e,t){return e.replace(ui,function(e,r,n,a,s,i){return r+("$"==n?n+a:Qt(Zt(a)+t.c))+("$"==s?s+i:Yt($t(i)+t.r))})}function gi(e,t,r){var n=er(t).s,a=Jt(r);return pi(e,{r:a.r-n.r,c:a.c-n.c})}function mi(e){return e.replace(/_xlfn\./g,"")}function vi(e){e.l+=1}function bi(e,t){var r=e.read_shift(1==t?1:2);return[16383&r,r>>14&1,r>>15&1]}function wi(e,t,r){var n=2;if(r){if(r.biff>=2&&r.biff<=5)return Ci(e);12==r.biff&&(n=4)}var a=e.read_shift(n),s=e.read_shift(n),i=bi(e,2),o=bi(e,2);return{s:{r:a,c:i[0],cRel:i[1],rRel:i[2]},e:{r:s,c:o[0],cRel:o[1],rRel:o[2]}}}function Ci(e){var t=bi(e,2),r=bi(e,2),n=e.read_shift(1),a=e.read_shift(1);return{s:{r:t[0],c:n,cRel:t[1],rRel:t[2]},e:{r:r[0],c:a,cRel:r[1],rRel:r[2]}}}function Ei(e,t,r){if(r&&r.biff>=2&&r.biff<=5)return function(e){var t=bi(e,2),r=e.read_shift(1);return{r:t[0],c:r,cRel:t[1],rRel:t[2]}}(e);var n=e.read_shift(r&&12==r.biff?4:2),a=bi(e,2);return{r:n,c:a[0],cRel:a[1],rRel:a[2]}}function Si(e){var t=e.read_shift(2),r=e.read_shift(2);return{r:t,c:255&r,fQuoted:!!(16384&r),cRel:r>>15,rRel:r>>15}}function _i(e){return[e.read_shift(1),e.read_shift(1)]}function Ai(e,t){var r=[e.read_shift(1)];if(12==t)switch(r[0]){case 2:r[0]=4;break;case 4:r[0]=16;break;case 0:r[0]=1;break;case 1:r[0]=2}switch(r[0]){case 4:r[1]=Mn(e,1)?"TRUE":"FALSE",12!=t&&(e.l+=7);break;case 37:case 16:r[1]=Vr[e[e.l]],e.l+=12==t?4:8;break;case 0:e.l+=8;break;case 1:r[1]=xr(e);break;case 2:r[1]=Yn(e,0,{biff:t>0&&t<8?2:t});break;default:throw new Error("Bad SerAr: "+r[0])}return r}function Bi(e,t,r){for(var n=e.read_shift(12==r.biff?4:2),a=[],s=0;s!=n;++s)a.push((12==r.biff?kr:ia)(e,8));return a}function Ti(e,t,r){var n=0,a=0;12==r.biff?(n=e.read_shift(4),a=e.read_shift(4)):(a=1+e.read_shift(1),n=1+e.read_shift(2)),r.biff>=2&&r.biff<8&&(--n,0==--a&&(a=256));for(var s=0,i=[];s!=n&&(i[s]=[]);++s)for(var o=0;o!=a;++o)i[s][o]=Ai(e,r.biff);return i}function ki(e,t,r){return e.l+=2,[Si(e)]}function yi(e){return e.l+=6,[]}var xi=ki,Ii=yi,Ri=yi,Oi=ki;function Fi(e){return e.l+=2,[zn(e),1&e.read_shift(2)]}var Di=ki,Ni=Fi,Pi=yi,Li=ki,Mi=ki,Ui=["Data","All","Headers","??","?Data2","??","?DataHeaders","??","Totals","??","??","??","?DataTotals","??","??","??","?Current"],zi={1:{n:"PtgExp",f:function(e,t,r){return e.l++,r&&12==r.biff?[e.read_shift(4,"i"),0]:[e.read_shift(2),e.read_shift(r&&2==r.biff?1:2)]}},2:{n:"PtgTbl",f:Ut},3:{n:"PtgAdd",f:vi},4:{n:"PtgSub",f:vi},5:{n:"PtgMul",f:vi},6:{n:"PtgDiv",f:vi},7:{n:"PtgPower",f:vi},8:{n:"PtgConcat",f:vi},9:{n:"PtgLt",f:vi},10:{n:"PtgLe",f:vi},11:{n:"PtgEq",f:vi},12:{n:"PtgGe",f:vi},13:{n:"PtgGt",f:vi},14:{n:"PtgNe",f:vi},15:{n:"PtgIsect",f:vi},16:{n:"PtgUnion",f:vi},17:{n:"PtgRange",f:vi},18:{n:"PtgUplus",f:vi},19:{n:"PtgUminus",f:vi},20:{n:"PtgPercent",f:vi},21:{n:"PtgParen",f:vi},22:{n:"PtgMissArg",f:vi},23:{n:"PtgStr",f:function(e,t,r){return e.l++,Xn(e,0,r)}},26:{n:"PtgSheet",f:function(e,t,r){return e.l+=5,e.l+=2,e.l+=2==r.biff?1:4,["PTGSHEET"]}},27:{n:"PtgEndSheet",f:function(e,t,r){return e.l+=2==r.biff?4:5,["PTGENDSHEET"]}},28:{n:"PtgErr",f:function(e){return e.l++,Vr[e.read_shift(1)]}},29:{n:"PtgBool",f:function(e){return e.l++,0!==e.read_shift(1)}},30:{n:"PtgInt",f:function(e){return e.l++,e.read_shift(2)}},31:{n:"PtgNum",f:function(e){return e.l++,xr(e)}},32:{n:"PtgArray",f:function(e,t,r){var n=(96&e[e.l++])>>5;return e.l+=2==r.biff?6:12==r.biff?14:7,[n]}},33:{n:"PtgFunc",f:function(e,t,r){var n=(96&e[e.l])>>5;e.l+=1;var a=e.read_shift(r&&r.biff<=3?1:2);return[lo[a],oo[a],n]}},34:{n:"PtgFuncVar",f:function(e,t,r){var n=e[e.l++],a=e.read_shift(1),s=r&&r.biff<=3?[88==n?-1:0,e.read_shift(1)]:function(e){return[e[e.l+1]>>7,32767&e.read_shift(2)]}(e);return[a,(0===s[0]?oo:io)[s[1]]]}},35:{n:"PtgName",f:function(e,t,r){var n=e.read_shift(1)>>>5&3,a=!r||r.biff>=8?4:2,s=e.read_shift(a);switch(r.biff){case 2:e.l+=5;break;case 3:case 4:e.l+=8;break;case 5:e.l+=12}return[n,0,s]}},36:{n:"PtgRef",f:function(e,t,r){var n=(96&e[e.l])>>5;return e.l+=1,[n,Ei(e,0,r)]}},37:{n:"PtgArea",f:function(e,t,r){return[(96&e[e.l++])>>5,wi(e,r.biff>=2&&r.biff,r)]}},38:{n:"PtgMemArea",f:function(e,t,r){var n=e.read_shift(1)>>>5&3;return e.l+=r&&2==r.biff?3:4,[n,e.read_shift(r&&2==r.biff?1:2)]}},39:{n:"PtgMemErr",f:Ut},40:{n:"PtgMemNoMem",f:Ut},41:{n:"PtgMemFunc",f:function(e,t,r){return[e.read_shift(1)>>>5&3,e.read_shift(r&&2==r.biff?1:2)]}},42:{n:"PtgRefErr",f:function(e,t,r){var n=e.read_shift(1)>>>5&3;return e.l+=4,r.biff<8&&e.l--,12==r.biff&&(e.l+=2),[n]}},43:{n:"PtgAreaErr",f:function(e,t,r){var n=(96&e[e.l++])>>5;return e.l+=r&&r.biff>8?12:r.biff<8?6:8,[n]}},44:{n:"PtgRefN",f:function(e,t,r){var n=(96&e[e.l])>>5;e.l+=1;var a=function(e,t,r){var n=r&&r.biff?r.biff:8;if(n>=2&&n<=5)return function(e){var t=e.read_shift(2),r=e.read_shift(1),n=(32768&t)>>15,a=(16384&t)>>14;return t&=16383,1==n&&t>=8192&&(t-=16384),1==a&&r>=128&&(r-=256),{r:t,c:r,cRel:a,rRel:n}}(e);var a=e.read_shift(n>=12?4:2),s=e.read_shift(2),i=(16384&s)>>14,o=(32768&s)>>15;if(s&=16383,1==o)for(;a>524287;)a-=1048576;if(1==i)for(;s>8191;)s-=16384;return{r:a,c:s,cRel:i,rRel:o}}(e,0,r);return[n,a]}},45:{n:"PtgAreaN",f:function(e,t,r){var n=(96&e[e.l++])>>5,a=function(e,t,r){if(r.biff<8)return Ci(e);var n=e.read_shift(12==r.biff?4:2),a=e.read_shift(12==r.biff?4:2),s=bi(e,2),i=bi(e,2);return{s:{r:n,c:s[0],cRel:s[1],rRel:s[2]},e:{r:a,c:i[0],cRel:i[1],rRel:i[2]}}}(e,0,r);return[n,a]}},46:{n:"PtgMemAreaN",f:function(e){return[e.read_shift(1)>>>5&3,e.read_shift(2)]}},47:{n:"PtgMemNoMemN",f:function(e){return[e.read_shift(1)>>>5&3,e.read_shift(2)]}},57:{n:"PtgNameX",f:function(e,t,r){return 5==r.biff?function(e){var t=e.read_shift(1)>>>5&3,r=e.read_shift(2,"i");e.l+=8;var n=e.read_shift(2);return e.l+=12,[t,r,n]}(e):[e.read_shift(1)>>>5&3,e.read_shift(2),e.read_shift(4)]}},58:{n:"PtgRef3d",f:function(e,t,r){var n=(96&e[e.l])>>5;e.l+=1;var a=e.read_shift(2);return r&&5==r.biff&&(e.l+=12),[n,a,Ei(e,0,r)]}},59:{n:"PtgArea3d",f:function(e,t,r){var n=(96&e[e.l++])>>5,a=e.read_shift(2,"i");if(r&&5===r.biff)e.l+=12;return[n,a,wi(e,0,r)]}},60:{n:"PtgRefErr3d",f:function(e,t,r){var n=(96&e[e.l++])>>5,a=e.read_shift(2),s=4;if(r)switch(r.biff){case 5:s=15;break;case 12:s=6}return e.l+=s,[n,a]}},61:{n:"PtgAreaErr3d",f:function(e,t,r){var n=(96&e[e.l++])>>5,a=e.read_shift(2),s=8;if(r)switch(r.biff){case 5:e.l+=12,s=6;break;case 12:s=12}return e.l+=s,[n,a]}},255:{}},Hi={64:32,96:32,65:33,97:33,66:34,98:34,67:35,99:35,68:36,100:36,69:37,101:37,70:38,102:38,71:39,103:39,72:40,104:40,73:41,105:41,74:42,106:42,75:43,107:43,76:44,108:44,77:45,109:45,78:46,110:46,79:47,111:47,88:34,120:34,89:57,121:57,90:58,122:58,91:59,123:59,92:60,124:60,93:61,125:61};!function(){for(var e in Hi)zi[e]=zi[Hi[e]]}();var Wi={1:{n:"PtgElfLel",f:Fi},2:{n:"PtgElfRw",f:Li},3:{n:"PtgElfCol",f:xi},6:{n:"PtgElfRwV",f:Mi},7:{n:"PtgElfColV",f:Oi},10:{n:"PtgElfRadical",f:Di},11:{n:"PtgElfRadicalS",f:Pi},13:{n:"PtgElfColS",f:Ii},15:{n:"PtgElfColSV",f:Ri},16:{n:"PtgElfRadicalLel",f:Ni},25:{n:"PtgList",f:function(e){e.l+=2;var t=e.read_shift(2),r=e.read_shift(2),n=e.read_shift(4),a=e.read_shift(2),s=e.read_shift(2);return{ixti:t,coltype:3&r,rt:Ui[r>>2&31],idx:n,c:a,C:s}}},29:{n:"PtgSxName",f:function(e){return e.l+=2,[e.read_shift(4)]}},255:{}},Vi={0:{n:"PtgAttrNoop",f:function(e){return e.l+=4,[0,0]}},1:{n:"PtgAttrSemi",f:function(e,t,r){var n=255&e[e.l+1]?1:0;return e.l+=r&&2==r.biff?3:4,[n]}},2:{n:"PtgAttrIf",f:function(e,t,r){var n=255&e[e.l+1]?1:0;return e.l+=2,[n,e.read_shift(r&&2==r.biff?1:2)]}},4:{n:"PtgAttrChoose",f:function(e,t,r){e.l+=2;for(var n=e.read_shift(r&&2==r.biff?1:2),a=[],s=0;s<=n;++s)a.push(e.read_shift(r&&2==r.biff?1:2));return a}},8:{n:"PtgAttrGoto",f:function(e,t,r){var n=255&e[e.l+1]?1:0;return e.l+=2,[n,e.read_shift(r&&2==r.biff?1:2)]}},16:{n:"PtgAttrSum",f:function(e,t,r){e.l+=r&&2==r.biff?3:4}},32:{n:"PtgAttrBaxcel",f:function(e){var t=1&e[e.l+1];return e.l+=4,[t,1]}},64:{n:"PtgAttrSpace",f:function(e){return e.read_shift(2),_i(e)}},65:{n:"PtgAttrSpaceSemi",f:function(e){return e.read_shift(2),_i(e)}},128:{n:"PtgAttrIfError",f:function(e){var t=255&e[e.l+1]?1:0;return e.l+=2,[t,e.read_shift(2)]}},255:{}};function Xi(e,t,r,n){if(n.biff<8)return Ut(e,t);for(var a=e.l+t,s=[],i=0;i!==r.length;++i)switch(r[i][0]){case"PtgArray":r[i][1]=Ti(e,0,n),s.push(r[i][1]);break;case"PtgMemArea":r[i][2]=Bi(e,r[i][1],n),s.push(r[i][2]);break;case"PtgExp":n&&12==n.biff&&(r[i][1][1]=e.read_shift(4),s.push(r[i][1]));break;case"PtgList":case"PtgElfRadicalS":case"PtgElfColS":case"PtgElfColSV":throw"Unsupported "+r[i][0]}return 0!==(t=a-e.l)&&s.push(Ut(e,t)),s}function Gi(e,t,r){for(var n,a,s=e.l+t,i=[];s!=e.l;)t=s-e.l,a=e[e.l],n=zi[a],24!==a&&25!==a||(n=(24===a?Wi:Vi)[e[e.l+1]]),n&&n.f?i.push([n.n,n.f(e,t,r)]):Ut(e,t);return i}function ji(e){for(var t=[],r=0;r=",PtgGt:">",PtgLe:"<=",PtgLt:"<",PtgMul:"*",PtgNe:"<>",PtgPower:"^",PtgSub:"-"},$i=new RegExp(/[^\w\u4E00-\u9FFF\u3040-\u30FF]/);function Yi(e,t,r){if(!e)return"SH33TJSERR0";if(r.biff>8&&(!e.XTI||!e.XTI[t]))return e.SheetNames[t];if(!e.XTI)return"SH33TJSERR6";var n=e.XTI[t];if(r.biff<8)return t>1e4&&(t-=65536),t<0&&(t=-t),0==t?"":e.XTI[t-1];if(!n)return"SH33TJSERR1";var a="";if(r.biff>8)switch(e[n[0]][0]){case 357:return a=-1==n[1]?"#REF":e.SheetNames[n[1]],n[1]==n[2]?a:a+":"+e.SheetNames[n[2]];case 358:return null!=r.SID?e.SheetNames[r.SID]:"SH33TJSSAME"+e[n[0]][0];default:return"SH33TJSSRC"+e[n[0]][0]}switch(e[n[0]][0][0]){case 1025:return a=-1==n[1]?"#REF":e.SheetNames[n[1]]||"SH33TJSERR3",n[1]==n[2]?a:a+":"+e.SheetNames[n[2]];case 14849:return e[n[0]].slice(1).map(function(e){return e.Name}).join(";;");default:return e[n[0]][0][3]?(a=-1==n[1]?"#REF":e[n[0]][0][3][n[1]]||"SH33TJSERR4",n[1]==n[2]?a:a+":"+e[n[0]][0][3][n[2]]):"SH33TJSERR2"}}function Zi(e,t,r){var n=Yi(e,t,r);return"#REF"==n?n:function(e,t){if(!(e||t&&t.biff<=5&&t.biff>=2))throw new Error("empty sheet name");return $i.test(e)?"'"+e+"'":e}(n,r)}function Qi(e,t,r,n,a){var s,i,o,l,c=a&&a.biff||8,f={s:{c:0,r:0},e:{c:0,r:0}},h=[],u=0,d=0,p="";if(!e[0]||!e[0][0])return"";for(var g=-1,m="",v=0,b=e[0].length;v=0){switch(e[0][g][1][0]){case 0:m=re(" ",e[0][g][1][1]);break;case 1:m=re("\r",e[0][g][1][1]);break;default:if(m="",a.WTF)throw new Error("Unexpected PtgAttrSpaceType "+e[0][g][1][0])}i+=m,g=-1}h.push(i+Ki[w[0]]+s);break;case"PtgIsect":s=h.pop(),i=h.pop(),h.push(i+" "+s);break;case"PtgUnion":s=h.pop(),i=h.pop(),h.push(i+","+s);break;case"PtgRange":s=h.pop(),i=h.pop(),h.push(i+":"+s);break;case"PtgAttrChoose":case"PtgAttrGoto":case"PtgAttrIf":case"PtgAttrIfError":case"PtgAttrBaxcel":case"PtgAttrSemi":case"PtgMemArea":case"PtgTbl":case"PtgMemErr":case"PtgMemAreaN":case"PtgMemNoMemN":case"PtgAttrNoop":case"PtgSheet":case"PtgEndSheet":case"PtgMemFunc":case"PtgMemNoMem":break;case"PtgRef":o=Xt(w[1][1],f,a),h.push(jt(o,c));break;case"PtgRefN":o=r?Xt(w[1][1],r,a):w[1][1],h.push(jt(o,c));break;case"PtgRef3d":u=w[1][1],o=Xt(w[1][2],f,a),p=Zi(n,u,a),h.push(p+"!"+jt(o,c));break;case"PtgFunc":case"PtgFuncVar":var C=w[1][0],E=w[1][1];C||(C=0);var S=0==(C&=127)?[]:h.slice(-C);h.length-=C,"User"===E&&(E=S.shift()),h.push(E+"("+S.join(",")+")");break;case"PtgBool":h.push(w[1]?"TRUE":"FALSE");break;case"PtgInt":case"PtgErr":h.push(w[1]);break;case"PtgNum":h.push(String(w[1]));break;case"PtgStr":h.push('"'+w[1].replace(/"/g,'""')+'"');break;case"PtgAreaN":l=Gt(w[1][1],r?{s:r}:f,a),h.push(Kt(l,a));break;case"PtgArea":l=Gt(w[1][1],f,a),h.push(Kt(l,a));break;case"PtgArea3d":u=w[1][1],l=w[1][2],p=Zi(n,u,a),h.push(p+"!"+Kt(l,a));break;case"PtgAttrSum":h.push("SUM("+h.pop()+")");break;case"PtgName":d=w[1][2];var _=(n.names||[])[d-1]||(n[0]||[])[d],A=_?_.Name:"SH33TJSNAME"+String(d);A in co&&(A=co[A]),h.push(A);break;case"PtgNameX":var B,T=w[1][1];if(d=w[1][2],!(a.biff<=5)){var k="";if(14849==((n[T]||[])[0]||[])[0]||(1025==((n[T]||[])[0]||[])[0]?n[T][d]&&n[T][d].itab>0&&(k=n.SheetNames[n[T][d].itab-1]+"!"):k=n.SheetNames[d-1]+"!"),n[T]&&n[T][d])k+=n[T][d].Name;else if(n[0]&&n[0][d])k+=n[0][d].Name;else{var y=(Yi(n,T,a)||"").split(";;");y[d-1]?k=y[d-1]:k+="SH33TJSERRX"}h.push(k);break}T<0&&(T=-T),n[T]&&(B=n[T][d]),B||(B={Name:"SH33TJSERRY"}),h.push(B.Name);break;case"PtgParen":var x="(",I=")";if(g>=0){switch(m="",e[0][g][1][0]){case 2:x=re(" ",e[0][g][1][1])+x;break;case 3:x=re("\r",e[0][g][1][1])+x;break;case 4:I=re(" ",e[0][g][1][1])+I;break;case 5:I=re("\r",e[0][g][1][1])+I;break;default:if(a.WTF)throw new Error("Unexpected PtgAttrSpaceType "+e[0][g][1][0])}g=-1}h.push(x+h.pop()+I);break;case"PtgRefErr":case"PtgRefErr3d":case"PtgAreaErr":case"PtgAreaErr3d":h.push("#REF!");break;case"PtgExp":o={c:w[1][1],r:w[1][0]};var R={c:r.c,r:r.r};if(n.sharedf[qt(o)]){var O=n.sharedf[qt(o)];h.push(Qi(O,0,R,n,a))}else{var F=!1;for(s=0;s!=n.arrayf.length;++s)if(i=n.arrayf[s],!(o.ci[0].e.c||o.ri[0].e.r)){h.push(Qi(i[1],0,R,n,a)),F=!0;break}F||h.push(w[1])}break;case"PtgArray":h.push("{"+ji(w[1])+"}");break;case"PtgAttrSpace":case"PtgAttrSpaceSemi":g=v;break;case"PtgMissArg":h.push("");break;case"PtgList":h.push("Table"+w[1].idx+"[#"+w[1].rt+"]");break;case"PtgElfCol":case"PtgElfColS":case"PtgElfColSV":case"PtgElfColV":case"PtgElfLel":case"PtgElfRadical":case"PtgElfRadicalLel":case"PtgElfRadicalS":case"PtgElfRw":case"PtgElfRwV":throw new Error("Unsupported ELFs");default:throw new Error("Unrecognized Formula Token: "+String(w))}if(3!=a.biff&&g>=0&&-1==["PtgAttrSpace","PtgAttrSpaceSemi","PtgAttrGoto"].indexOf(e[0][v][0])){var D=!0;switch((w=e[0][g])[1][0]){case 4:D=!1;case 0:m=re(" ",w[1][1]);break;case 5:D=!1;case 1:m=re("\r",w[1][1]);break;default:if(m="",a.WTF)throw new Error("Unexpected PtgAttrSpaceType "+w[1][0])}h.push((D?m:"")+h.pop()+(D?"":m)),g=-1}}if(h.length>1&&a.WTF)throw new Error("bad formula stack");return h[0]}function Ji(e,t,r){var n,a=e.l+t,s=2==r.biff?1:2,i=e.read_shift(s);if(65535==i)return[[],Ut(e,t-2)];var o=Gi(e,i,r);return t!==i+s&&(n=Xi(e,t-i-s,o,r)),e.l=a,[o,n]}function qi(e,t,r){var n,a=e.l+t,s=e.read_shift(2),i=Gi(e,s,r);return 65535==s?[[],Ut(e,t-2)]:(t!==s+2&&(n=Xi(e,a-s-2,i,r)),[i,n])}function eo(e,t,r){var n=e.l+t,a=ra(e);2==r.biff&&++e.l;var s=function(e){var t;if(65535!==kt(e,e.l+6))return[xr(e),"n"];switch(e[e.l]){case 0:return e.l+=8,["String","s"];case 1:return t=1===e[e.l+2],e.l+=8,[t,"b"];case 2:return t=e[e.l+2],e.l+=8,[t,"e"];case 3:return e.l+=8,["","s"]}return[]}(e),i=e.read_shift(1);2!=r.biff&&(e.read_shift(1),r.biff>=5&&e.read_shift(4));var o=function(e,t,r){var n,a=e.l+t,s=2==r.biff?1:2,i=e.read_shift(s);if(65535==i)return[[],Ut(e,t-2)];var o=Gi(e,i,r);return t!==i+s&&(n=Xi(e,t-i-s,o,r)),e.l=a,[o,n]}(e,n-e.l,r);return{cell:a,val:s[0],formula:o,shared:i>>3&1,tt:s[1]}}function to(e,t,r){var n=e.read_shift(4),a=Gi(e,n,r),s=e.read_shift(4);return[a,s>0?Xi(e,s,a,r):null]}var ro=to,no=to,ao=to,so=to,io={0:"BEEP",1:"OPEN",2:"OPEN.LINKS",3:"CLOSE.ALL",4:"SAVE",5:"SAVE.AS",6:"FILE.DELETE",7:"PAGE.SETUP",8:"PRINT",9:"PRINTER.SETUP",10:"QUIT",11:"NEW.WINDOW",12:"ARRANGE.ALL",13:"WINDOW.SIZE",14:"WINDOW.MOVE",15:"FULL",16:"CLOSE",17:"RUN",22:"SET.PRINT.AREA",23:"SET.PRINT.TITLES",24:"SET.PAGE.BREAK",25:"REMOVE.PAGE.BREAK",26:"FONT",27:"DISPLAY",28:"PROTECT.DOCUMENT",29:"PRECISION",30:"A1.R1C1",31:"CALCULATE.NOW",32:"CALCULATION",34:"DATA.FIND",35:"EXTRACT",36:"DATA.DELETE",37:"SET.DATABASE",38:"SET.CRITERIA",39:"SORT",40:"DATA.SERIES",41:"TABLE",42:"FORMAT.NUMBER",43:"ALIGNMENT",44:"STYLE",45:"BORDER",46:"CELL.PROTECTION",47:"COLUMN.WIDTH",48:"UNDO",49:"CUT",50:"COPY",51:"PASTE",52:"CLEAR",53:"PASTE.SPECIAL",54:"EDIT.DELETE",55:"INSERT",56:"FILL.RIGHT",57:"FILL.DOWN",61:"DEFINE.NAME",62:"CREATE.NAMES",63:"FORMULA.GOTO",64:"FORMULA.FIND",65:"SELECT.LAST.CELL",66:"SHOW.ACTIVE.CELL",67:"GALLERY.AREA",68:"GALLERY.BAR",69:"GALLERY.COLUMN",70:"GALLERY.LINE",71:"GALLERY.PIE",72:"GALLERY.SCATTER",73:"COMBINATION",74:"PREFERRED",75:"ADD.OVERLAY",76:"GRIDLINES",77:"SET.PREFERRED",78:"AXES",79:"LEGEND",80:"ATTACH.TEXT",81:"ADD.ARROW",82:"SELECT.CHART",83:"SELECT.PLOT.AREA",84:"PATTERNS",85:"MAIN.CHART",86:"OVERLAY",87:"SCALE",88:"FORMAT.LEGEND",89:"FORMAT.TEXT",90:"EDIT.REPEAT",91:"PARSE",92:"JUSTIFY",93:"HIDE",94:"UNHIDE",95:"WORKSPACE",96:"FORMULA",97:"FORMULA.FILL",98:"FORMULA.ARRAY",99:"DATA.FIND.NEXT",100:"DATA.FIND.PREV",101:"FORMULA.FIND.NEXT",102:"FORMULA.FIND.PREV",103:"ACTIVATE",104:"ACTIVATE.NEXT",105:"ACTIVATE.PREV",106:"UNLOCKED.NEXT",107:"UNLOCKED.PREV",108:"COPY.PICTURE",109:"SELECT",110:"DELETE.NAME",111:"DELETE.FORMAT",112:"VLINE",113:"HLINE",114:"VPAGE",115:"HPAGE",116:"VSCROLL",117:"HSCROLL",118:"ALERT",119:"NEW",120:"CANCEL.COPY",121:"SHOW.CLIPBOARD",122:"MESSAGE",124:"PASTE.LINK",125:"APP.ACTIVATE",126:"DELETE.ARROW",127:"ROW.HEIGHT",128:"FORMAT.MOVE",129:"FORMAT.SIZE",130:"FORMULA.REPLACE",131:"SEND.KEYS",132:"SELECT.SPECIAL",133:"APPLY.NAMES",134:"REPLACE.FONT",135:"FREEZE.PANES",136:"SHOW.INFO",137:"SPLIT",138:"ON.WINDOW",139:"ON.DATA",140:"DISABLE.INPUT",142:"OUTLINE",143:"LIST.NAMES",144:"FILE.CLOSE",145:"SAVE.WORKBOOK",146:"DATA.FORM",147:"COPY.CHART",148:"ON.TIME",149:"WAIT",150:"FORMAT.FONT",151:"FILL.UP",152:"FILL.LEFT",153:"DELETE.OVERLAY",155:"SHORT.MENUS",159:"SET.UPDATE.STATUS",161:"COLOR.PALETTE",162:"DELETE.STYLE",163:"WINDOW.RESTORE",164:"WINDOW.MAXIMIZE",166:"CHANGE.LINK",167:"CALCULATE.DOCUMENT",168:"ON.KEY",169:"APP.RESTORE",170:"APP.MOVE",171:"APP.SIZE",172:"APP.MINIMIZE",173:"APP.MAXIMIZE",174:"BRING.TO.FRONT",175:"SEND.TO.BACK",185:"MAIN.CHART.TYPE",186:"OVERLAY.CHART.TYPE",187:"SELECT.END",188:"OPEN.MAIL",189:"SEND.MAIL",190:"STANDARD.FONT",191:"CONSOLIDATE",192:"SORT.SPECIAL",193:"GALLERY.3D.AREA",194:"GALLERY.3D.COLUMN",195:"GALLERY.3D.LINE",196:"GALLERY.3D.PIE",197:"VIEW.3D",198:"GOAL.SEEK",199:"WORKGROUP",200:"FILL.GROUP",201:"UPDATE.LINK",202:"PROMOTE",203:"DEMOTE",204:"SHOW.DETAIL",206:"UNGROUP",207:"OBJECT.PROPERTIES",208:"SAVE.NEW.OBJECT",209:"SHARE",210:"SHARE.NAME",211:"DUPLICATE",212:"APPLY.STYLE",213:"ASSIGN.TO.OBJECT",214:"OBJECT.PROTECTION",215:"HIDE.OBJECT",216:"SET.EXTRACT",217:"CREATE.PUBLISHER",218:"SUBSCRIBE.TO",219:"ATTRIBUTES",220:"SHOW.TOOLBAR",222:"PRINT.PREVIEW",223:"EDIT.COLOR",224:"SHOW.LEVELS",225:"FORMAT.MAIN",226:"FORMAT.OVERLAY",227:"ON.RECALC",228:"EDIT.SERIES",229:"DEFINE.STYLE",240:"LINE.PRINT",243:"ENTER.DATA",249:"GALLERY.RADAR",250:"MERGE.STYLES",251:"EDITION.OPTIONS",252:"PASTE.PICTURE",253:"PASTE.PICTURE.LINK",254:"SPELLING",256:"ZOOM",259:"INSERT.OBJECT",260:"WINDOW.MINIMIZE",265:"SOUND.NOTE",266:"SOUND.PLAY",267:"FORMAT.SHAPE",268:"EXTEND.POLYGON",269:"FORMAT.AUTO",272:"GALLERY.3D.BAR",273:"GALLERY.3D.SURFACE",274:"FILL.AUTO",276:"CUSTOMIZE.TOOLBAR",277:"ADD.TOOL",278:"EDIT.OBJECT",279:"ON.DOUBLECLICK",280:"ON.ENTRY",281:"WORKBOOK.ADD",282:"WORKBOOK.MOVE",283:"WORKBOOK.COPY",284:"WORKBOOK.OPTIONS",285:"SAVE.WORKSPACE",288:"CHART.WIZARD",289:"DELETE.TOOL",290:"MOVE.TOOL",291:"WORKBOOK.SELECT",292:"WORKBOOK.ACTIVATE",293:"ASSIGN.TO.TOOL",295:"COPY.TOOL",296:"RESET.TOOL",297:"CONSTRAIN.NUMERIC",298:"PASTE.TOOL",302:"WORKBOOK.NEW",305:"SCENARIO.CELLS",306:"SCENARIO.DELETE",307:"SCENARIO.ADD",308:"SCENARIO.EDIT",309:"SCENARIO.SHOW",310:"SCENARIO.SHOW.NEXT",311:"SCENARIO.SUMMARY",312:"PIVOT.TABLE.WIZARD",313:"PIVOT.FIELD.PROPERTIES",314:"PIVOT.FIELD",315:"PIVOT.ITEM",316:"PIVOT.ADD.FIELDS",318:"OPTIONS.CALCULATION",319:"OPTIONS.EDIT",320:"OPTIONS.VIEW",321:"ADDIN.MANAGER",322:"MENU.EDITOR",323:"ATTACH.TOOLBARS",324:"VBAActivate",325:"OPTIONS.CHART",328:"VBA.INSERT.FILE",330:"VBA.PROCEDURE.DEFINITION",336:"ROUTING.SLIP",338:"ROUTE.DOCUMENT",339:"MAIL.LOGON",342:"INSERT.PICTURE",343:"EDIT.TOOL",344:"GALLERY.DOUGHNUT",350:"CHART.TREND",352:"PIVOT.ITEM.PROPERTIES",354:"WORKBOOK.INSERT",355:"OPTIONS.TRANSITION",356:"OPTIONS.GENERAL",370:"FILTER.ADVANCED",373:"MAIL.ADD.MAILER",374:"MAIL.DELETE.MAILER",375:"MAIL.REPLY",376:"MAIL.REPLY.ALL",377:"MAIL.FORWARD",378:"MAIL.NEXT.LETTER",379:"DATA.LABEL",380:"INSERT.TITLE",381:"FONT.PROPERTIES",382:"MACRO.OPTIONS",383:"WORKBOOK.HIDE",384:"WORKBOOK.UNHIDE",385:"WORKBOOK.DELETE",386:"WORKBOOK.NAME",388:"GALLERY.CUSTOM",390:"ADD.CHART.AUTOFORMAT",391:"DELETE.CHART.AUTOFORMAT",392:"CHART.ADD.DATA",393:"AUTO.OUTLINE",394:"TAB.ORDER",395:"SHOW.DIALOG",396:"SELECT.ALL",397:"UNGROUP.SHEETS",398:"SUBTOTAL.CREATE",399:"SUBTOTAL.REMOVE",400:"RENAME.OBJECT",412:"WORKBOOK.SCROLL",413:"WORKBOOK.NEXT",414:"WORKBOOK.PREV",415:"WORKBOOK.TAB.SPLIT",416:"FULL.SCREEN",417:"WORKBOOK.PROTECT",420:"SCROLLBAR.PROPERTIES",421:"PIVOT.SHOW.PAGES",422:"TEXT.TO.COLUMNS",423:"FORMAT.CHARTTYPE",424:"LINK.FORMAT",425:"TRACER.DISPLAY",430:"TRACER.NAVIGATE",431:"TRACER.CLEAR",432:"TRACER.ERROR",433:"PIVOT.FIELD.GROUP",434:"PIVOT.FIELD.UNGROUP",435:"CHECKBOX.PROPERTIES",436:"LABEL.PROPERTIES",437:"LISTBOX.PROPERTIES",438:"EDITBOX.PROPERTIES",439:"PIVOT.REFRESH",440:"LINK.COMBO",441:"OPEN.TEXT",442:"HIDE.DIALOG",443:"SET.DIALOG.FOCUS",444:"ENABLE.OBJECT",445:"PUSHBUTTON.PROPERTIES",446:"SET.DIALOG.DEFAULT",447:"FILTER",448:"FILTER.SHOW.ALL",449:"CLEAR.OUTLINE",450:"FUNCTION.WIZARD",451:"ADD.LIST.ITEM",452:"SET.LIST.ITEM",453:"REMOVE.LIST.ITEM",454:"SELECT.LIST.ITEM",455:"SET.CONTROL.VALUE",456:"SAVE.COPY.AS",458:"OPTIONS.LISTS.ADD",459:"OPTIONS.LISTS.DELETE",460:"SERIES.AXES",461:"SERIES.X",462:"SERIES.Y",463:"ERRORBAR.X",464:"ERRORBAR.Y",465:"FORMAT.CHART",466:"SERIES.ORDER",467:"MAIL.LOGOFF",468:"CLEAR.ROUTING.SLIP",469:"APP.ACTIVATE.MICROSOFT",470:"MAIL.EDIT.MAILER",471:"ON.SHEET",472:"STANDARD.WIDTH",473:"SCENARIO.MERGE",474:"SUMMARY.INFO",475:"FIND.FILE",476:"ACTIVE.CELL.FONT",477:"ENABLE.TIPWIZARD",478:"VBA.MAKE.ADDIN",480:"INSERTDATATABLE",481:"WORKGROUP.OPTIONS",482:"MAIL.SEND.MAILER",485:"AUTOCORRECT",489:"POST.DOCUMENT",491:"PICKLIST",493:"VIEW.SHOW",494:"VIEW.DEFINE",495:"VIEW.DELETE",509:"SHEET.BACKGROUND",510:"INSERT.MAP.OBJECT",511:"OPTIONS.MENONO",517:"MSOCHECKS",518:"NORMAL",519:"LAYOUT",520:"RM.PRINT.AREA",521:"CLEAR.PRINT.AREA",522:"ADD.PRINT.AREA",523:"MOVE.BRK",545:"HIDECURR.NOTE",546:"HIDEALL.NOTES",547:"DELETE.NOTE",548:"TRAVERSE.NOTES",549:"ACTIVATE.NOTES",620:"PROTECT.REVISIONS",621:"UNPROTECT.REVISIONS",647:"OPTIONS.ME",653:"WEB.PUBLISH",667:"NEWWEBQUERY",673:"PIVOT.TABLE.CHART",753:"OPTIONS.SAVE",755:"OPTIONS.SPELL",808:"HIDEALL.INKANNOTS"},oo={0:"COUNT",1:"IF",2:"ISNA",3:"ISERROR",4:"SUM",5:"AVERAGE",6:"MIN",7:"MAX",8:"ROW",9:"COLUMN",10:"NA",11:"NPV",12:"STDEV",13:"DOLLAR",14:"FIXED",15:"SIN",16:"COS",17:"TAN",18:"ATAN",19:"PI",20:"SQRT",21:"EXP",22:"LN",23:"LOG10",24:"ABS",25:"INT",26:"SIGN",27:"ROUND",28:"LOOKUP",29:"INDEX",30:"REPT",31:"MID",32:"LEN",33:"VALUE",34:"TRUE",35:"FALSE",36:"AND",37:"OR",38:"NOT",39:"MOD",40:"DCOUNT",41:"DSUM",42:"DAVERAGE",43:"DMIN",44:"DMAX",45:"DSTDEV",46:"VAR",47:"DVAR",48:"TEXT",49:"LINEST",50:"TREND",51:"LOGEST",52:"GROWTH",53:"GOTO",54:"HALT",55:"RETURN",56:"PV",57:"FV",58:"NPER",59:"PMT",60:"RATE",61:"MIRR",62:"IRR",63:"RAND",64:"MATCH",65:"DATE",66:"TIME",67:"DAY",68:"MONTH",69:"YEAR",70:"WEEKDAY",71:"HOUR",72:"MINUTE",73:"SECOND",74:"NOW",75:"AREAS",76:"ROWS",77:"COLUMNS",78:"OFFSET",79:"ABSREF",80:"RELREF",81:"ARGUMENT",82:"SEARCH",83:"TRANSPOSE",84:"ERROR",85:"STEP",86:"TYPE",87:"ECHO",88:"SET.NAME",89:"CALLER",90:"DEREF",91:"WINDOWS",92:"SERIES",93:"DOCUMENTS",94:"ACTIVE.CELL",95:"SELECTION",96:"RESULT",97:"ATAN2",98:"ASIN",99:"ACOS",100:"CHOOSE",101:"HLOOKUP",102:"VLOOKUP",103:"LINKS",104:"INPUT",105:"ISREF",106:"GET.FORMULA",107:"GET.NAME",108:"SET.VALUE",109:"LOG",110:"EXEC",111:"CHAR",112:"LOWER",113:"UPPER",114:"PROPER",115:"LEFT",116:"RIGHT",117:"EXACT",118:"TRIM",119:"REPLACE",120:"SUBSTITUTE",121:"CODE",122:"NAMES",123:"DIRECTORY",124:"FIND",125:"CELL",126:"ISERR",127:"ISTEXT",128:"ISNUMBER",129:"ISBLANK",130:"T",131:"N",132:"FOPEN",133:"FCLOSE",134:"FSIZE",135:"FREADLN",136:"FREAD",137:"FWRITELN",138:"FWRITE",139:"FPOS",140:"DATEVALUE",141:"TIMEVALUE",142:"SLN",143:"SYD",144:"DDB",145:"GET.DEF",146:"REFTEXT",147:"TEXTREF",148:"INDIRECT",149:"REGISTER",150:"CALL",151:"ADD.BAR",152:"ADD.MENU",153:"ADD.COMMAND",154:"ENABLE.COMMAND",155:"CHECK.COMMAND",156:"RENAME.COMMAND",157:"SHOW.BAR",158:"DELETE.MENU",159:"DELETE.COMMAND",160:"GET.CHART.ITEM",161:"DIALOG.BOX",162:"CLEAN",163:"MDETERM",164:"MINVERSE",165:"MMULT",166:"FILES",167:"IPMT",168:"PPMT",169:"COUNTA",170:"CANCEL.KEY",171:"FOR",172:"WHILE",173:"BREAK",174:"NEXT",175:"INITIATE",176:"REQUEST",177:"POKE",178:"EXECUTE",179:"TERMINATE",180:"RESTART",181:"HELP",182:"GET.BAR",183:"PRODUCT",184:"FACT",185:"GET.CELL",186:"GET.WORKSPACE",187:"GET.WINDOW",188:"GET.DOCUMENT",189:"DPRODUCT",190:"ISNONTEXT",191:"GET.NOTE",192:"NOTE",193:"STDEVP",194:"VARP",195:"DSTDEVP",196:"DVARP",197:"TRUNC",198:"ISLOGICAL",199:"DCOUNTA",200:"DELETE.BAR",201:"UNREGISTER",204:"USDOLLAR",205:"FINDB",206:"SEARCHB",207:"REPLACEB",208:"LEFTB",209:"RIGHTB",210:"MIDB",211:"LENB",212:"ROUNDUP",213:"ROUNDDOWN",214:"ASC",215:"DBCS",216:"RANK",219:"ADDRESS",220:"DAYS360",221:"TODAY",222:"VDB",223:"ELSE",224:"ELSE.IF",225:"END.IF",226:"FOR.CELL",227:"MEDIAN",228:"SUMPRODUCT",229:"SINH",230:"COSH",231:"TANH",232:"ASINH",233:"ACOSH",234:"ATANH",235:"DGET",236:"CREATE.OBJECT",237:"VOLATILE",238:"LAST.ERROR",239:"CUSTOM.UNDO",240:"CUSTOM.REPEAT",241:"FORMULA.CONVERT",242:"GET.LINK.INFO",243:"TEXT.BOX",244:"INFO",245:"GROUP",246:"GET.OBJECT",247:"DB",248:"PAUSE",251:"RESUME",252:"FREQUENCY",253:"ADD.TOOLBAR",254:"DELETE.TOOLBAR",255:"User",256:"RESET.TOOLBAR",257:"EVALUATE",258:"GET.TOOLBAR",259:"GET.TOOL",260:"SPELLING.CHECK",261:"ERROR.TYPE",262:"APP.TITLE",263:"WINDOW.TITLE",264:"SAVE.TOOLBAR",265:"ENABLE.TOOL",266:"PRESS.TOOL",267:"REGISTER.ID",268:"GET.WORKBOOK",269:"AVEDEV",270:"BETADIST",271:"GAMMALN",272:"BETAINV",273:"BINOMDIST",274:"CHIDIST",275:"CHIINV",276:"COMBIN",277:"CONFIDENCE",278:"CRITBINOM",279:"EVEN",280:"EXPONDIST",281:"FDIST",282:"FINV",283:"FISHER",284:"FISHERINV",285:"FLOOR",286:"GAMMADIST",287:"GAMMAINV",288:"CEILING",289:"HYPGEOMDIST",290:"LOGNORMDIST",291:"LOGINV",292:"NEGBINOMDIST",293:"NORMDIST",294:"NORMSDIST",295:"NORMINV",296:"NORMSINV",297:"STANDARDIZE",298:"ODD",299:"PERMUT",300:"POISSON",301:"TDIST",302:"WEIBULL",303:"SUMXMY2",304:"SUMX2MY2",305:"SUMX2PY2",306:"CHITEST",307:"CORREL",308:"COVAR",309:"FORECAST",310:"FTEST",311:"INTERCEPT",312:"PEARSON",313:"RSQ",314:"STEYX",315:"SLOPE",316:"TTEST",317:"PROB",318:"DEVSQ",319:"GEOMEAN",320:"HARMEAN",321:"SUMSQ",322:"KURT",323:"SKEW",324:"ZTEST",325:"LARGE",326:"SMALL",327:"QUARTILE",328:"PERCENTILE",329:"PERCENTRANK",330:"MODE",331:"TRIMMEAN",332:"TINV",334:"MOVIE.COMMAND",335:"GET.MOVIE",336:"CONCATENATE",337:"POWER",338:"PIVOT.ADD.DATA",339:"GET.PIVOT.TABLE",340:"GET.PIVOT.FIELD",341:"GET.PIVOT.ITEM",342:"RADIANS",343:"DEGREES",344:"SUBTOTAL",345:"SUMIF",346:"COUNTIF",347:"COUNTBLANK",348:"SCENARIO.GET",349:"OPTIONS.LISTS.GET",350:"ISPMT",351:"DATEDIF",352:"DATESTRING",353:"NUMBERSTRING",354:"ROMAN",355:"OPEN.DIALOG",356:"SAVE.DIALOG",357:"VIEW.GET",358:"GETPIVOTDATA",359:"HYPERLINK",360:"PHONETIC",361:"AVERAGEA",362:"MAXA",363:"MINA",364:"STDEVPA",365:"VARPA",366:"STDEVA",367:"VARA",368:"BAHTTEXT",369:"THAIDAYOFWEEK",370:"THAIDIGIT",371:"THAIMONTHOFYEAR",372:"THAINUMSOUND",373:"THAINUMSTRING",374:"THAISTRINGLENGTH",375:"ISTHAIDIGIT",376:"ROUNDBAHTDOWN",377:"ROUNDBAHTUP",378:"THAIYEAR",379:"RTD",380:"CUBEVALUE",381:"CUBEMEMBER",382:"CUBEMEMBERPROPERTY",383:"CUBERANKEDMEMBER",384:"HEX2BIN",385:"HEX2DEC",386:"HEX2OCT",387:"DEC2BIN",388:"DEC2HEX",389:"DEC2OCT",390:"OCT2BIN",391:"OCT2HEX",392:"OCT2DEC",393:"BIN2DEC",394:"BIN2OCT",395:"BIN2HEX",396:"IMSUB",397:"IMDIV",398:"IMPOWER",399:"IMABS",400:"IMSQRT",401:"IMLN",402:"IMLOG2",403:"IMLOG10",404:"IMSIN",405:"IMCOS",406:"IMEXP",407:"IMARGUMENT",408:"IMCONJUGATE",409:"IMAGINARY",410:"IMREAL",411:"COMPLEX",412:"IMSUM",413:"IMPRODUCT",414:"SERIESSUM",415:"FACTDOUBLE",416:"SQRTPI",417:"QUOTIENT",418:"DELTA",419:"GESTEP",420:"ISEVEN",421:"ISODD",422:"MROUND",423:"ERF",424:"ERFC",425:"BESSELJ",426:"BESSELK",427:"BESSELY",428:"BESSELI",429:"XIRR",430:"XNPV",431:"PRICEMAT",432:"YIELDMAT",433:"INTRATE",434:"RECEIVED",435:"DISC",436:"PRICEDISC",437:"YIELDDISC",438:"TBILLEQ",439:"TBILLPRICE",440:"TBILLYIELD",441:"PRICE",442:"YIELD",443:"DOLLARDE",444:"DOLLARFR",445:"NOMINAL",446:"EFFECT",447:"CUMPRINC",448:"CUMIPMT",449:"EDATE",450:"EOMONTH",451:"YEARFRAC",452:"COUPDAYBS",453:"COUPDAYS",454:"COUPDAYSNC",455:"COUPNCD",456:"COUPNUM",457:"COUPPCD",458:"DURATION",459:"MDURATION",460:"ODDLPRICE",461:"ODDLYIELD",462:"ODDFPRICE",463:"ODDFYIELD",464:"RANDBETWEEN",465:"WEEKNUM",466:"AMORDEGRC",467:"AMORLINC",468:"CONVERT",724:"SHEETJS",469:"ACCRINT",470:"ACCRINTM",471:"WORKDAY",472:"NETWORKDAYS",473:"GCD",474:"MULTINOMIAL",475:"LCM",476:"FVSCHEDULE",477:"CUBEKPIMEMBER",478:"CUBESET",479:"CUBESETCOUNT",480:"IFERROR",481:"COUNTIFS",482:"SUMIFS",483:"AVERAGEIF",484:"AVERAGEIFS"},lo={2:1,3:1,10:0,15:1,16:1,17:1,18:1,19:0,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:2,30:2,31:3,32:1,33:1,34:0,35:0,38:1,39:2,40:3,41:3,42:3,43:3,44:3,45:3,47:3,48:2,53:1,61:3,63:0,65:3,66:3,67:1,68:1,69:1,70:1,71:1,72:1,73:1,74:0,75:1,76:1,77:1,79:2,80:2,83:1,85:0,86:1,89:0,90:1,94:0,95:0,97:2,98:1,99:1,101:3,102:3,105:1,106:1,108:2,111:1,112:1,113:1,114:1,117:2,118:1,119:4,121:1,126:1,127:1,128:1,129:1,130:1,131:1,133:1,134:1,135:1,136:2,137:2,138:2,140:1,141:1,142:3,143:4,144:4,161:1,162:1,163:1,164:1,165:2,172:1,175:2,176:2,177:3,178:2,179:1,184:1,186:1,189:3,190:1,195:3,196:3,197:1,198:1,199:3,201:1,207:4,210:3,211:1,212:2,213:2,214:1,215:1,225:0,229:1,230:1,231:1,232:1,233:1,234:1,235:3,244:1,247:4,252:2,257:1,261:1,271:1,273:4,274:2,275:2,276:2,277:3,278:3,279:1,280:3,281:3,282:3,283:1,284:1,285:2,286:4,287:3,288:2,289:4,290:3,291:3,292:3,293:4,294:1,295:3,296:1,297:3,298:1,299:2,300:3,301:3,302:4,303:2,304:2,305:2,306:2,307:2,308:2,309:3,310:2,311:2,312:2,313:2,314:2,315:2,316:4,325:2,326:2,327:2,328:2,331:2,332:2,337:2,342:1,343:1,346:2,347:1,350:4,351:3,352:1,353:2,360:1,368:1,369:1,370:1,371:1,372:1,373:1,374:1,375:1,376:1,377:1,378:1,382:3,385:1,392:1,393:1,396:2,397:2,398:2,399:1,400:1,401:1,402:1,403:1,404:1,405:1,406:1,407:1,408:1,409:1,410:1,414:4,415:1,416:1,417:2,420:1,421:1,422:2,424:1,425:2,426:2,427:2,428:2,430:3,438:3,439:3,440:3,443:2,444:2,445:2,446:2,447:6,448:6,449:2,450:2,464:2,468:3,476:2,479:1,480:2,65535:0},co={"_xlfn.ACOT":"ACOT","_xlfn.ACOTH":"ACOTH","_xlfn.AGGREGATE":"AGGREGATE","_xlfn.ARABIC":"ARABIC","_xlfn.AVERAGEIF":"AVERAGEIF","_xlfn.AVERAGEIFS":"AVERAGEIFS","_xlfn.BASE":"BASE","_xlfn.BETA.DIST":"BETA.DIST","_xlfn.BETA.INV":"BETA.INV","_xlfn.BINOM.DIST":"BINOM.DIST","_xlfn.BINOM.DIST.RANGE":"BINOM.DIST.RANGE","_xlfn.BINOM.INV":"BINOM.INV","_xlfn.BITAND":"BITAND","_xlfn.BITLSHIFT":"BITLSHIFT","_xlfn.BITOR":"BITOR","_xlfn.BITRSHIFT":"BITRSHIFT","_xlfn.BITXOR":"BITXOR","_xlfn.CEILING.MATH":"CEILING.MATH","_xlfn.CEILING.PRECISE":"CEILING.PRECISE","_xlfn.CHISQ.DIST":"CHISQ.DIST","_xlfn.CHISQ.DIST.RT":"CHISQ.DIST.RT","_xlfn.CHISQ.INV":"CHISQ.INV","_xlfn.CHISQ.INV.RT":"CHISQ.INV.RT","_xlfn.CHISQ.TEST":"CHISQ.TEST","_xlfn.COMBINA":"COMBINA","_xlfn.CONCAT":"CONCAT","_xlfn.CONFIDENCE.NORM":"CONFIDENCE.NORM","_xlfn.CONFIDENCE.T":"CONFIDENCE.T","_xlfn.COT":"COT","_xlfn.COTH":"COTH","_xlfn.COUNTIFS":"COUNTIFS","_xlfn.COVARIANCE.P":"COVARIANCE.P","_xlfn.COVARIANCE.S":"COVARIANCE.S","_xlfn.CSC":"CSC","_xlfn.CSCH":"CSCH","_xlfn.DAYS":"DAYS","_xlfn.DECIMAL":"DECIMAL","_xlfn.ECMA.CEILING":"ECMA.CEILING","_xlfn.ERF.PRECISE":"ERF.PRECISE","_xlfn.ERFC.PRECISE":"ERFC.PRECISE","_xlfn.EXPON.DIST":"EXPON.DIST","_xlfn.F.DIST":"F.DIST","_xlfn.F.DIST.RT":"F.DIST.RT","_xlfn.F.INV":"F.INV","_xlfn.F.INV.RT":"F.INV.RT","_xlfn.F.TEST":"F.TEST","_xlfn.FILTERXML":"FILTERXML","_xlfn.FLOOR.MATH":"FLOOR.MATH","_xlfn.FLOOR.PRECISE":"FLOOR.PRECISE","_xlfn.FORECAST.ETS":"FORECAST.ETS","_xlfn.FORECAST.ETS.CONFINT":"FORECAST.ETS.CONFINT","_xlfn.FORECAST.ETS.SEASONALITY":"FORECAST.ETS.SEASONALITY","_xlfn.FORECAST.ETS.STAT":"FORECAST.ETS.STAT","_xlfn.FORECAST.LINEAR":"FORECAST.LINEAR","_xlfn.FORMULATEXT":"FORMULATEXT","_xlfn.GAMMA":"GAMMA","_xlfn.GAMMA.DIST":"GAMMA.DIST","_xlfn.GAMMA.INV":"GAMMA.INV","_xlfn.GAMMALN.PRECISE":"GAMMALN.PRECISE","_xlfn.GAUSS":"GAUSS","_xlfn.HYPGEOM.DIST":"HYPGEOM.DIST","_xlfn.IFERROR":"IFERROR","_xlfn.IFNA":"IFNA","_xlfn.IFS":"IFS","_xlfn.IMCOSH":"IMCOSH","_xlfn.IMCOT":"IMCOT","_xlfn.IMCSC":"IMCSC","_xlfn.IMCSCH":"IMCSCH","_xlfn.IMSEC":"IMSEC","_xlfn.IMSECH":"IMSECH","_xlfn.IMSINH":"IMSINH","_xlfn.IMTAN":"IMTAN","_xlfn.ISFORMULA":"ISFORMULA","_xlfn.ISO.CEILING":"ISO.CEILING","_xlfn.ISOWEEKNUM":"ISOWEEKNUM","_xlfn.LOGNORM.DIST":"LOGNORM.DIST","_xlfn.LOGNORM.INV":"LOGNORM.INV","_xlfn.MAXIFS":"MAXIFS","_xlfn.MINIFS":"MINIFS","_xlfn.MODE.MULT":"MODE.MULT","_xlfn.MODE.SNGL":"MODE.SNGL","_xlfn.MUNIT":"MUNIT","_xlfn.NEGBINOM.DIST":"NEGBINOM.DIST","_xlfn.NETWORKDAYS.INTL":"NETWORKDAYS.INTL","_xlfn.NIGBINOM":"NIGBINOM","_xlfn.NORM.DIST":"NORM.DIST","_xlfn.NORM.INV":"NORM.INV","_xlfn.NORM.S.DIST":"NORM.S.DIST","_xlfn.NORM.S.INV":"NORM.S.INV","_xlfn.NUMBERVALUE":"NUMBERVALUE","_xlfn.PDURATION":"PDURATION","_xlfn.PERCENTILE.EXC":"PERCENTILE.EXC","_xlfn.PERCENTILE.INC":"PERCENTILE.INC","_xlfn.PERCENTRANK.EXC":"PERCENTRANK.EXC","_xlfn.PERCENTRANK.INC":"PERCENTRANK.INC","_xlfn.PERMUTATIONA":"PERMUTATIONA","_xlfn.PHI":"PHI","_xlfn.POISSON.DIST":"POISSON.DIST","_xlfn.QUARTILE.EXC":"QUARTILE.EXC","_xlfn.QUARTILE.INC":"QUARTILE.INC","_xlfn.QUERYSTRING":"QUERYSTRING","_xlfn.RANK.AVG":"RANK.AVG","_xlfn.RANK.EQ":"RANK.EQ","_xlfn.RRI":"RRI","_xlfn.SEC":"SEC","_xlfn.SECH":"SECH","_xlfn.SHEET":"SHEET","_xlfn.SHEETS":"SHEETS","_xlfn.SKEW.P":"SKEW.P","_xlfn.STDEV.P":"STDEV.P","_xlfn.STDEV.S":"STDEV.S","_xlfn.SUMIFS":"SUMIFS","_xlfn.SWITCH":"SWITCH","_xlfn.T.DIST":"T.DIST","_xlfn.T.DIST.2T":"T.DIST.2T","_xlfn.T.DIST.RT":"T.DIST.RT","_xlfn.T.INV":"T.INV","_xlfn.T.INV.2T":"T.INV.2T","_xlfn.T.TEST":"T.TEST","_xlfn.TEXTJOIN":"TEXTJOIN","_xlfn.UNICHAR":"UNICHAR","_xlfn.UNICODE":"UNICODE","_xlfn.VAR.P":"VAR.P","_xlfn.VAR.S":"VAR.S","_xlfn.WEBSERVICE":"WEBSERVICE","_xlfn.WEIBULL.DIST":"WEIBULL.DIST","_xlfn.WORKDAY.INTL":"WORKDAY.INTL","_xlfn.XOR":"XOR","_xlfn.Z.TEST":"Z.TEST"};function fo(e){return"of:"==e.slice(0,3)&&(e=e.slice(3)),61==e.charCodeAt(0)&&61==(e=e.slice(1)).charCodeAt(0)&&(e=e.slice(1)),(e=(e=(e=e.replace(/COM\.MICROSOFT\./g,"")).replace(/\[((?:\.[A-Z]+[0-9]+)(?::\.[A-Z]+[0-9]+)?)\]/g,function(e,t){return t.replace(/\./g,"")})).replace(/\[.(#[A-Z]*[?!])\]/g,"$1")).replace(/[;~]/g,",").replace(/\|/g,";")}function ho(e){return("of:="+e.replace(ui,"$1[.$2$3$4$5]").replace(/\]:\[/g,":")).replace(/;/g,"|").replace(/,/g,";")}function uo(e){var t=e.split(":");return[t[0].split(".")[0],t[0].split(".")[1]+(t.length>1?":"+(t[1].split(".")[1]||t[1].split(".")[0]):"")]}function po(e){return e.replace(/\./,"!")}var go={},mo={};Zr.WS=["http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet","http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet"];var vo="undefined"!=typeof Map;function bo(e,t,r){var n=0,a=e.length;if(r){if(vo?r.has(t):Object.prototype.hasOwnProperty.call(r,t))for(var s=vo?r.get(t):r[t];n-1?(r.width=Cs(n),r.customWidth=1):null!=t.width&&(r.width=t.width),t.hidden&&(r.hidden=!0),null!=t.level&&(r.outlineLevel=r.level=t.level),r}function Co(e,t){if(e){var r=[.7,.7,.75,.75,.3,.3];"xlml"==t&&(r=[1,1,1,1,.5,.5]),null==e.left&&(e.left=r[0]),null==e.right&&(e.right=r[1]),null==e.top&&(e.top=r[2]),null==e.bottom&&(e.bottom=r[3]),null==e.header&&(e.header=r[4]),null==e.footer&&(e.footer=r[5])}}function Eo(e,t,r){var n=r.revssf[null!=t.z?t.z:"General"],a=60,s=e.length;if(null==n&&r.ssf)for(;a<392;++a)if(null==r.ssf[a]){x.load(t.z,a),r.ssf[a]=t.z,r.revssf[t.z]=n=a;break}for(a=0;a!=s;++a)if(e[a].numFmtId===n)return a;return e[s]={numFmtId:n,fontId:0,fillId:0,borderId:0,xfId:0,applyNumberFormat:1},s}function So(e,t,r,n,a,s){try{n.cellNF&&(e.z=x._table[t])}catch(e){if(n.WTF)throw e}if("z"!==e.t||n.cellStyles){if("d"===e.t&&"string"==typeof e.v&&(e.v=q(e.v)),(!n||!1!==n.cellText)&&"z"!==e.t)try{if(null==x._table[t]&&x.load(F[t]||"General",t),"e"===e.t)e.w=e.w||Vr[e.v];else if(0===t)if("n"===e.t)(0|e.v)===e.v?e.w=x._general_int(e.v):e.w=x._general_num(e.v);else if("d"===e.t){var i=X(e.v);e.w=(0|i)===i?x._general_int(i):x._general_num(i)}else{if(void 0===e.v)return"";e.w=x._general(e.v,mo)}else"d"===e.t?e.w=x.format(t,X(e.v),mo):e.w=x.format(t,e.v,mo)}catch(e){if(n.WTF)throw e}if(n.cellStyles&&null!=r)try{e.s=s.Fills[r],e.s.fgColor&&e.s.fgColor.theme&&!e.s.fgColor.rgb&&(e.s.fgColor.rgb=ms(a.themeElements.clrScheme[e.s.fgColor.theme].rgb,e.s.fgColor.tint||0),n.WTF&&(e.s.fgColor.raw_rgb=a.themeElements.clrScheme[e.s.fgColor.theme].rgb)),e.s.bgColor&&e.s.bgColor.theme&&(e.s.bgColor.rgb=ms(a.themeElements.clrScheme[e.s.bgColor.theme].rgb,e.s.bgColor.tint||0),n.WTF&&(e.s.bgColor.raw_rgb=a.themeElements.clrScheme[e.s.bgColor.theme].rgb))}catch(e){if(n.WTF&&s.Fills)throw e}}}function _o(e,t,r){if(e&&e["!ref"]){var n=rr(e["!ref"]);if(n.e.c/g,Bo=/<(?:\w+:)?sheetData[^>]*>([\s\S]*)<\/(?:\w+:)?sheetData>/,To=/<(?:\w:)?hyperlink [^>]*>/gm,ko=/"(\w*:\w*)"/,yo=/<(?:\w:)?col\b[^>]*[\/]?>/g,xo=/<(?:\w:)?autoFilter[^>]*([\/]|>([\s\S]*)<\/(?:\w:)?autoFilter)>/g,Io=/<(?:\w:)?pageMargins[^>]*\/>/g,Ro=/<(?:\w:)?sheetPr\b(?:[^>a-z][^>]*)?\/>/,Oo=/<(?:\w:)?sheetPr[^>]*(?:[\/]|>([\s\S]*)<\/(?:\w:)?sheetPr)>/,Fo=/<(?:\w:)?sheetViews[^>]*(?:[\/]|>([\s\S]*)<\/(?:\w:)?sheetViews)>/;function Do(e,t,r,n){var a=Ee(e);r.Sheets[n]||(r.Sheets[n]={}),a.codeName&&(r.Sheets[n].CodeName=ke(Pe(a.codeName)))}var No=["objects","scenarios","selectLockedCells","selectUnlockedCells"],Po=["formatColumns","formatRows","formatCells","insertColumns","insertRows","insertHyperlinks","deleteColumns","deleteRows","sort","autoFilter","pivotTables"],Lo=/<(?:\w:)?sheetView(?:[^>a-z][^>]*)?\/?>/;function Mo(e,t,r,n){if(void 0===e.v&&"string"!=typeof e.f||"z"===e.t)return"";var a="",s=e.t,i=e.v;if("z"!==e.t)switch(e.t){case"b":a=e.v?"1":"0";break;case"n":a=""+e.v;break;case"e":a=Vr[e.v];break;case"d":n&&n.cellDates?a=q(e.v,-1).toISOString():((e=te(e)).t="n",a=""+(e.v=X(q(e.v)))),void 0===e.z&&(e.z=x._table[14]);break;default:a=e.v}var o=Qe("v",Ie(a)),l={r:t},c=Eo(n.cellXfs,e,n);switch(0!==c&&(l.s=c),e.t){case"n":case"z":break;case"d":l.t="d";break;case"b":l.t="b";break;case"e":l.t="e";break;default:if(null==e.v){delete e.t;break}if(e.v.length>32767)throw new Error("Text length must not exceed 32767 characters");if(n&&n.bookSST){o=Qe("v",""+bo(n.Strings,e.v,n.revStrings)),l.t="s";break}l.t="str"}if(e.t!=s&&(e.t=s,e.v=i),"string"==typeof e.f&&e.f){var f=e.F&&e.F.slice(0,t.length)==t?{t:"array",ref:e.F}:null;o=qe("f",Ie(e.f),f)+(null!=e.v?o:"")}return e.l&&r["!links"].push([t,e.l]),e.c&&r["!comments"].push([t,e.c]),qe("c",o,l)}var Uo,zo,Ho,Wo,Vo,Xo,Go,jo=(Uo=/<(?:\w+:)?c[ \/>]/,zo=/<\/(?:\w+:)?row>/,Ho=/r=["']([^"']*)["']/,Wo=/<(?:\w+:)?is>([\S\s]*?)<\/(?:\w+:)?is>/,Vo=/ref=["']([^"']*)["']/,Xo=Xe("v"),Go=Xe("f"),function(e,t,r,n,a,s){for(var i,o,l,c,f,h=0,u="",d=[],p=[],g=0,m=0,v=0,b="",w=0,C=0,E=0,S=0,_=Array.isArray(s.CellXf),A=[],B=[],T=Array.isArray(t),k=[],y={},I=!1,R=!!r.sheetStubs,O=e.split(zo),F=0,D=O.length;F!=D;++F){var N=(u=O[F].trim()).length;if(0!==N){var P=0;e:for(h=0;h":if("/"!=u[h-1]){++h;break e}if(r&&r.cellStyles){if(w=null!=(o=Ee(u.slice(P,h),!0)).r?parseInt(o.r,10):w+1,C=-1,r.sheetRows&&r.sheetRows=h)break;if(w=null!=(o=Ee(u.slice(P,h),!0)).r?parseInt(o.r,10):w+1,C=-1,!(r.sheetRows&&r.sheetRowsw-1&&(n.s.r=w-1),n.e.r":"")+u,null!=p&&2===p.length){for(g=0,b=p[1],m=0;m!=b.length&&!((v=b.charCodeAt(m)-64)<1||v>26);++m)g=26*g+v;C=--g}else++C;for(m=0;m!=u.length&&62!==u.charCodeAt(m);++m);if(++m,(o=Ee(u.slice(0,m),!0)).r||(o.r=qt({r:w-1,c:C})),i={t:""},null!=(p=(b=u.slice(m)).match(Xo))&&""!==p[1]&&(i.v=ke(p[1])),r.cellFormula){if(null!=(p=b.match(Go))&&""!==p[1]){if(i.f=ke(Pe(p[1])).replace(/\r\n/g,"\n"),r.xlfn||(i.f=mi(i.f)),p[0].indexOf('t="array"')>-1)i.F=(b.match(Vo)||[])[1],i.F.indexOf(":")>-1&&A.push([rr(i.F),i.F]);else if(p[0].indexOf('t="shared"')>-1){c=Ee(p[0]);var M=ke(Pe(p[1]));r.xlfn||(M=mi(M)),B[parseInt(c.si,10)]=[c,M,o.r]}}else(p=b.match(/]*\/>/))&&B[(c=Ee(p[0])).si]&&(i.f=gi(B[c.si][1],B[c.si][2],o.r));var U=Jt(o.r);for(m=0;m=A[m][0].s.r&&U.r<=A[m][0].e.r&&U.c>=A[m][0].s.c&&U.c<=A[m][0].e.c&&(i.F=A[m][1])}if(null==o.t&&void 0===i.v)if(i.f||i.F)i.v=0,i.t="n";else{if(!R)continue;i.t="z"}else i.t=o.t||"n";switch(n.s.c>C&&(n.s.c=C),n.e.c0&&(t["!rows"]=k)}),Ko=qe("worksheet",null,{xmlns:nt.main[0],"xmlns:r":nt.r});function $o(e,t,r,n){var a,s=[me,Ko],i=r.SheetNames[e],o="",l=r.Sheets[i];null==l&&(l={});var c=l["!ref"]||"A1",f=rr(c);if(f.e.c>16383||f.e.r>1048575){if(t.WTF)throw new Error("Range "+c+" exceeds format limit A1:XFD1048576");f.e.c=Math.min(f.e.c,16383),f.e.r=Math.min(f.e.c,1048575),c=tr(f)}n||(n={}),l["!comments"]=[];var h=[];!function(e,t,r,n,a){var s=!1,i={},o=null;if("xlsx"!==n.bookType&&t.vbaraw){var l=t.SheetNames[r];try{t.Workbook&&(l=t.Workbook.Sheets[r].CodeName||l)}catch(e){}s=!0,i.codeName=Le(Ie(l))}if(e&&e["!outline"]){var c={summaryBelow:1,summaryRight:1};e["!outline"].above&&(c.summaryBelow=0),e["!outline"].left&&(c.summaryRight=0),o=(o||"")+qe("outlinePr",null,c)}(s||o)&&(a[a.length]=qe("sheetPr",o,i))}(l,r,e,t,s),s[s.length]=qe("dimension",null,{ref:c}),s[s.length]=function(e,t,r,n){var a={workbookViewId:"0"};return(((n||{}).Workbook||{}).Views||[])[0]&&(a.rightToLeft=n.Workbook.Views[0].RTL?"1":"0"),qe("sheetViews",qe("sheetView",null,a),{})}(0,0,0,r),t.sheetFormat&&(s[s.length]=qe("sheetFormatPr",null,{defaultRowHeight:t.sheetFormat.defaultRowHeight||"16",baseColWidth:t.sheetFormat.baseColWidth||"10",outlineLevelRow:t.sheetFormat.outlineLevelRow||"7"})),null!=l["!cols"]&&l["!cols"].length>0&&(s[s.length]=function(e,t){for(var r,n=[""],a=0;a!=t.length;++a)(r=t[a])&&(n[n.length]=qe("col",null,wo(a,r)));return n[n.length]="",n.join("")}(0,l["!cols"])),s[a=s.length]="",l["!links"]=[],null!=l["!ref"]&&(o=function(e,t){var r,n,a=[],s=[],i=rr(e["!ref"]),o="",l="",c=[],f=0,h=0,u=e["!rows"],d=Array.isArray(e),p={r:l},g=-1;for(h=i.s.c;h<=i.e.c;++h)c[h]=Qt(h);for(f=i.s.r;f<=i.e.r;++f){for(s=[],l=Yt(f),h=i.s.c;h<=i.e.c;++h){r=c[h]+l;var m=d?(e[f]||[])[h]:e[r];void 0!==m&&null!=(o=Mo(m,r,e,t))&&s.push(o)}(s.length>0||u&&u[f])&&(p={r:l},u&&u[f]&&((n=u[f]).hidden&&(p.hidden=1),g=-1,n.hpx?g=Bs(n.hpx):n.hpt&&(g=n.hpt),g>-1&&(p.ht=g,p.customHeight=1),n.level&&(p.outlineLevel=n.level)),a[a.length]=qe("row",s.join(""),p))}if(u)for(;f-1&&(p.ht=g,p.customHeight=1),n.level&&(p.outlineLevel=n.level),a[a.length]=qe("row","",p));return a.join("")}(l,t),o.length>0&&(s[s.length]=o)),s.length>a+1&&(s[s.length]="",s[a]=s[a].replace("/>",">")),l["!protect"]&&(s[s.length]=function(e){var t={sheet:1};return No.forEach(function(r){null!=e[r]&&e[r]&&(t[r]="1")}),Po.forEach(function(r){null==e[r]||e[r]||(t[r]="0")}),e.password&&(t.password=ls(e.password).toString(16).toUpperCase()),qe("sheetProtection",null,t)}(l["!protect"])),null!=l["!autofilter"]&&(s[s.length]=function(e,t,r,n){var a="string"==typeof e.ref?e.ref:tr(e.ref);r.Workbook||(r.Workbook={Sheets:[]}),r.Workbook.Names||(r.Workbook.Names=[]);var s=r.Workbook.Names,i=er(a);i.s.r==i.e.r&&(i.e.r=er(t["!ref"]).e.r,a=tr(i));for(var o=0;o0&&(s[s.length]=function(e){if(0===e.length)return"";for(var t='',r=0;r!=e.length;++r)t+='';return t+""}(l["!merges"]));var u,d,p=-1,g=-1;return l["!links"].length>0&&(s[s.length]="",l["!links"].forEach(function(e){e[1].Target&&(u={ref:e[0]},"#"!=e[1].Target.charAt(0)&&(g=rn(n,-1,Ie(e[1].Target).replace(/#.*$/,""),Zr.HLINK),u["r:id"]="rId"+g),(p=e[1].Target.indexOf("#"))>-1&&(u.location=Ie(e[1].Target.slice(p+1))),e[1].Tooltip&&(u.tooltip=Ie(e[1].Tooltip)),s[s.length]=qe("hyperlink",null,u))}),s[s.length]=""),delete l["!links"],null!=l["!margins"]&&(s[s.length]=(Co(d=l["!margins"]),qe("pageMargins",null,d))),t&&!t.ignoreEC&&null!=t.ignoreEC||(s[s.length]=Qe("ignoredErrors",qe("ignoredError",null,{numberStoredAsText:1,sqref:c}))),h.length>0&&(g=rn(n,-1,"../drawings/drawing"+(e+1)+".xml",Zr.DRAW),s[s.length]=qe("drawing",null,{"r:id":"rId"+g}),l["!drawing"]=h),l["!comments"].length>0&&(g=rn(n,-1,"../drawings/vmlDrawing"+(e+1)+".vml",Zr.VML),s[s.length]=qe("legacyDrawing",null,{"r:id":"rId"+g}),l["!legacy"]=g),s.length>1&&(s[s.length]="",s[1]=s[1].replace("/>",">")),s.join("")}function Yo(e,t,r,n){var a=function(e,t,r){var n=zt(145),a=(r["!rows"]||[])[e]||{};n.write_shift(4,e),n.write_shift(4,0);var s=320;a.hpx?s=20*Bs(a.hpx):a.hpt&&(s=20*a.hpt),n.write_shift(2,s),n.write_shift(1,0);var i=0;a.level&&(i|=a.level),a.hidden&&(i|=16),(a.hpx||a.hpt)&&(i|=32),n.write_shift(1,i),n.write_shift(1,0);var o=0,l=n.l;n.l+=4;for(var c={r:e,c:0},f=0;f<16;++f)if(!(t.s.c>f+1<<10||t.e.cn.l?n.slice(0,n.l):n}(n,r,t);(a.length>17||(t["!rows"]||[])[n])&&Vt(e,"BrtRowHdr",a)}var Zo=kr,Qo=yr;function Jo(e){return[gr(e),xr(e),"n"]}var qo=kr,el=yr,tl=["left","right","top","bottom","header","footer"];function rl(e,t,r,n,a,s,i){if(void 0===t.v)return!1;var o="";switch(t.t){case"b":o=t.v?"1":"0";break;case"d":(t=te(t)).z=t.z||x._table[14],t.v=X(q(t.v)),t.t="n";break;case"n":case"e":o=""+t.v;break;default:o=t.v}var l={r,c:n};switch(l.s=Eo(a.cellXfs,t,a),t.l&&s["!links"].push([qt(l),t.l]),t.c&&s["!comments"].push([qt(l),t.c]),t.t){case"s":case"str":return a.bookSST?(o=bo(a.Strings,t.v,a.revStrings),l.t="s",l.v=o,i?Vt(e,"BrtShortIsst",function(e,t,r){return null==r&&(r=zt(8)),mr(t,r),r.write_shift(4,t.v),r}(0,l)):Vt(e,"BrtCellIsst",function(e,t,r){return null==r&&(r=zt(12)),pr(t,r),r.write_shift(4,t.v),r}(0,l))):(l.t="str",i?Vt(e,"BrtShortSt",function(e,t,r){return null==r&&(r=zt(8+4*e.v.length)),mr(t,r),cr(e.v,r),r.length>r.l?r.slice(0,r.l):r}(t,l)):Vt(e,"BrtCellSt",function(e,t,r){return null==r&&(r=zt(12+4*e.v.length)),pr(t,r),cr(e.v,r),r.length>r.l?r.slice(0,r.l):r}(t,l))),!0;case"n":return t.v==(0|t.v)&&t.v>-1e3&&t.v<1e3?i?Vt(e,"BrtShortRk",function(e,t,r){return null==r&&(r=zt(8)),mr(t,r),Br(e.v,r),r}(t,l)):Vt(e,"BrtCellRk",function(e,t,r){return null==r&&(r=zt(12)),pr(t,r),Br(e.v,r),r}(t,l)):i?Vt(e,"BrtShortReal",function(e,t,r){return null==r&&(r=zt(12)),mr(t,r),Ir(e.v,r),r}(t,l)):Vt(e,"BrtCellReal",function(e,t,r){return null==r&&(r=zt(16)),pr(t,r),Ir(e.v,r),r}(t,l)),!0;case"b":return l.t="b",i?Vt(e,"BrtShortBool",function(e,t,r){return null==r&&(r=zt(5)),mr(t,r),r.write_shift(1,e.v?1:0),r}(t,l)):Vt(e,"BrtCellBool",function(e,t,r){return null==r&&(r=zt(9)),pr(t,r),r.write_shift(1,e.v?1:0),r}(t,l)),!0;case"e":return l.t="e",i?Vt(e,"BrtShortError",function(e,t,r){return null==r&&(r=zt(8)),mr(t,r),r.write_shift(1,e.v),r.write_shift(2,0),r.write_shift(1,0),r}(t,l)):Vt(e,"BrtCellError",function(e,t,r){return null==r&&(r=zt(9)),pr(t,r),r.write_shift(1,e.v),r}(t,l)),!0}return i?Vt(e,"BrtShortBlank",function(e,t,r){return null==r&&(r=zt(4)),mr(t,r)}(0,l)):Vt(e,"BrtCellBlank",function(e,t,r){return null==r&&(r=zt(8)),pr(t,r)}(0,l)),!0}function nl(e,t,r,n){var a=Wt(),s=r.SheetNames[e],i=r.Sheets[s]||{},o=s;try{r&&r.Workbook&&(o=r.Workbook.Sheets[e].CodeName||o)}catch(e){}var l=rr(i["!ref"]||"A1");if(l.e.c>16383||l.e.r>1048575){if(t.WTF)throw new Error("Range "+(i["!ref"]||"A1")+" exceeds format limit A1:XFD1048576");l.e.c=Math.min(l.e.c,16383),l.e.r=Math.min(l.e.c,1048575)}return i["!links"]=[],i["!comments"]=[],Vt(a,"BrtBeginSheet"),(r.vbaraw||i["!outline"])&&Vt(a,"BrtWsProp",function(e,t,r){null==r&&(r=zt(84+4*e.length));var n=192;t&&(t.above&&(n&=-65),t.left&&(n&=-129)),r.write_shift(1,n);for(var a=1;a<3;++a)r.write_shift(1,0);return Rr({auto:1},r),r.write_shift(-4,-1),r.write_shift(-4,-1),br(e,r),r.slice(0,r.l)}(o,i["!outline"])),Vt(a,"BrtWsDim",Qo(l)),function(e,t,r){Vt(e,"BrtBeginWsViews"),Vt(e,"BrtBeginWsView",function(e,t,r){null==r&&(r=zt(30));var n=924;return(((t||{}).Views||[])[0]||{}).RTL&&(n|=32),r.write_shift(2,n),r.write_shift(4,0),r.write_shift(4,0),r.write_shift(4,0),r.write_shift(1,0),r.write_shift(1,0),r.write_shift(2,0),r.write_shift(2,100),r.write_shift(2,0),r.write_shift(2,0),r.write_shift(2,0),r.write_shift(4,0),r}(0,r)),Vt(e,"BrtEndWsView"),Vt(e,"BrtEndWsViews")}(a,0,r.Workbook),function(e,t){t&&t["!cols"]&&(Vt(e,"BrtBeginColInfos"),t["!cols"].forEach(function(t,r){t&&Vt(e,"BrtColInfo",function(e,t,r){null==r&&(r=zt(18));var n=wo(e,t);r.write_shift(-4,e),r.write_shift(-4,e),r.write_shift(4,256*(n.width||10)),r.write_shift(4,0);var a=0;return t.hidden&&(a|=1),"number"==typeof n.width&&(a|=2),t.level&&(a|=t.level<<8),r.write_shift(2,a),r}(r,t))}),Vt(e,"BrtEndColInfos"))}(a,i),function(e,t,r,n){var a,s=rr(t["!ref"]||"A1"),i="",o=[];Vt(e,"BrtBeginSheetData");var l=Array.isArray(t),c=s.e.r;t["!rows"]&&(c=Math.max(s.e.r,t["!rows"].length-1));for(var f=s.s.r;f<=c;++f){i=Yt(f),Yo(e,t,s,f);var h=!1;if(f<=s.e.r)for(var u=s.s.c;u<=s.e.c;++u){f===s.s.r&&(o[u]=Qt(u)),a=o[u]+i;var d=l?(t[f]||[])[u]:t[a];h=!!d&&rl(e,d,f,u,n,t,h)}}Vt(e,"BrtEndSheetData")}(a,i,0,t),function(e,t){t["!protect"]&&Vt(e,"BrtSheetProtection",function(e,t){return null==t&&(t=zt(66)),t.write_shift(2,e.password?ls(e.password):0),t.write_shift(4,1),[["objects",!1],["scenarios",!1],["formatCells",!0],["formatColumns",!0],["formatRows",!0],["insertColumns",!0],["insertRows",!0],["insertHyperlinks",!0],["deleteColumns",!0],["deleteRows",!0],["selectLockedCells",!1],["sort",!0],["autoFilter",!0],["pivotTables",!0],["selectUnlockedCells",!1]].forEach(function(r){r[1]?t.write_shift(4,null==e[r[0]]||e[r[0]]?0:1):t.write_shift(4,null!=e[r[0]]&&e[r[0]]?0:1)}),t}(t["!protect"]))}(a,i),function(e,t,r,n){if(t["!autofilter"]){var a=t["!autofilter"],s="string"==typeof a.ref?a.ref:tr(a.ref);r.Workbook||(r.Workbook={Sheets:[]}),r.Workbook.Names||(r.Workbook.Names=[]);var i=r.Workbook.Names,o=er(s);o.s.r==o.e.r&&(o.e.r=er(t["!ref"]).e.r,s=tr(o));for(var l=0;l0){var a=rn(n,-1,"../drawings/vmlDrawing"+(r+1)+".vml",Zr.VML);Vt(e,"BrtLegacyDrawing",_r("rId"+a)),t["!legacy"]=a}}(a,i,e,n),Vt(a,"BrtEndSheet"),a.end()}Zr.CHART="http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart",Zr.CHARTEX="http://schemas.microsoft.com/office/2014/relationships/chartEx",Zr.CS="http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet",qe("chartsheet",null,{xmlns:nt.main[0],"xmlns:r":nt.r});var al=[["allowRefreshQuery",!1,"bool"],["autoCompressPictures",!0,"bool"],["backupFile",!1,"bool"],["checkCompatibility",!1,"bool"],["CodeName",""],["date1904",!1,"bool"],["defaultThemeVersion",0,"int"],["filterPrivacy",!1,"bool"],["hidePivotFieldList",!1,"bool"],["promptedSolutions",!1,"bool"],["publishItems",!1,"bool"],["refreshAllConnections",!1,"bool"],["saveExternalLinkValues",!0,"bool"],["showBorderUnselectedTables",!0,"bool"],["showInkAnnotation",!0,"bool"],["showObjects","all"],["showPivotChartFilter",!1,"bool"],["updateLinks","userSet"]],sl=[["activeTab",0,"int"],["autoFilterDateGrouping",!0,"bool"],["firstSheet",0,"int"],["minimized",!1,"bool"],["showHorizontalScroll",!0,"bool"],["showSheetTabs",!0,"bool"],["showVerticalScroll",!0,"bool"],["tabRatio",600,"int"],["visibility","visible"]],il=[],ol=[["calcCompleted","true"],["calcMode","auto"],["calcOnSave","true"],["concurrentCalc","true"],["fullCalcOnLoad","false"],["fullPrecision","true"],["iterate","false"],["iterateCount","100"],["iterateDelta","0.001"],["refMode","A1"]];function ll(e,t){for(var r=0;r!=e.length;++r)for(var n=e[r],a=0;a!=t.length;++a){var s=t[a];if(null==n[s[0]])n[s[0]]=s[1];else switch(s[2]){case"bool":"string"==typeof n[s[0]]&&(n[s[0]]=Ne(n[s[0]]));break;case"int":"string"==typeof n[s[0]]&&(n[s[0]]=parseInt(n[s[0]],10))}}}function cl(e,t){for(var r=0;r!=t.length;++r){var n=t[r];if(null==e[n[0]])e[n[0]]=n[1];else switch(n[2]){case"bool":"string"==typeof e[n[0]]&&(e[n[0]]=Ne(e[n[0]]));break;case"int":"string"==typeof e[n[0]]&&(e[n[0]]=parseInt(e[n[0]],10))}}}function fl(e){cl(e.WBProps,al),cl(e.CalcPr,ol),ll(e.WBView,sl),ll(e.Sheets,il),mo.date1904=Ne(e.WBProps.date1904)}var hl="][*?/\\".split("");function ul(e,t){if(e.length>31){if(t)return!1;throw new Error("Sheet names cannot exceed 31 chars")}var r=!0;return hl.forEach(function(n){if(-1!=e.indexOf(n)){if(!t)throw new Error("Sheet name cannot contain : \\ / ? * [ ]");r=!1}}),r}var dl=/<\w+:workbook/,pl=qe("workbook",null,{xmlns:nt.main[0],"xmlns:r":nt.r});function gl(e){var t=[me];t[t.length]=pl;var r=e.Workbook&&(e.Workbook.Names||[]).length>0,n={codeName:"ThisWorkbook"};e.Workbook&&e.Workbook.WBProps&&(al.forEach(function(t){null!=e.Workbook.WBProps[t[0]]&&e.Workbook.WBProps[t[0]]!=t[1]&&(n[t[0]]=e.Workbook.WBProps[t[0]])}),e.Workbook.WBProps.CodeName&&(n.codeName=e.Workbook.WBProps.CodeName,delete n.CodeName)),t[t.length]=qe("workbookPr",null,n);var a=e.Workbook&&e.Workbook.Sheets||[],s=0;if(a&&a[0]&&a[0].Hidden){for(t[t.length]="",s=0;s!=e.SheetNames.length&&a[s]&&a[s].Hidden;++s);s==e.SheetNames.length&&(s=0),t[t.length]='',t[t.length]=""}for(t[t.length]="",s=0;s!=e.SheetNames.length;++s){var i={name:Ie(e.SheetNames[s].slice(0,31))};if(i.sheetId=""+(s+1),i["r:id"]="rId"+(s+1),a[s])switch(a[s].Hidden){case 1:i.state="hidden";break;case 2:i.state="veryHidden"}t[t.length]=qe("sheet",null,i)}return t[t.length]="",r&&(t[t.length]="",e.Workbook&&e.Workbook.Names&&e.Workbook.Names.forEach(function(e){var r={name:e.Name};e.Comment&&(r.comment=e.Comment),null!=e.Sheet&&(r.localSheetId=""+e.Sheet),e.Hidden&&(r.hidden="1"),e.Ref&&(t[t.length]=qe("definedName",Ie(e.Ref),r))}),t[t.length]=""),t.length>2&&(t[t.length]="",t[1]=t[1].replace("/>",">")),t.join("")}function ml(e,t){return t||(t=zt(127)),t.write_shift(4,e.Hidden),t.write_shift(4,e.iTabID),_r(e.strRelID,t),cr(e.name.slice(0,31),t),t.length>t.l?t.slice(0,t.l):t}function vl(e,t){var r={};return e.read_shift(4),r.ArchID=e.read_shift(4),e.l+=t-8,r}function bl(e,r){var n=Wt();return Vt(n,"BrtBeginBook"),Vt(n,"BrtFileVersion",function(e,r){r||(r=zt(127));for(var n=0;4!=n;++n)r.write_shift(4,0);return cr("SheetJS",r),cr(t.version,r),cr(t.version,r),cr("7262",r),r.length>r.l?r.slice(0,r.l):r}()),Vt(n,"BrtWbProp",function(e,t){t||(t=zt(72));var r=0;return e&&e.filterPrivacy&&(r|=8),t.write_shift(4,r),t.write_shift(4,0),br(e&&e.CodeName||"ThisWorkbook",t),t.slice(0,t.l)}(e.Workbook&&e.Workbook.WBProps||null)),function(e,t){if(t.Workbook&&t.Workbook.Sheets){for(var r=t.Workbook.Sheets,n=0,a=-1,s=-1;na||(Vt(e,"BrtBeginBookViews"),Vt(e,"BrtBookView",function(e,t){return t||(t=zt(29)),t.write_shift(-4,0),t.write_shift(-4,460),t.write_shift(4,28800),t.write_shift(4,17600),t.write_shift(4,500),t.write_shift(4,e),t.write_shift(4,e),t.write_shift(1,120),t.length>t.l?t.slice(0,t.l):t}(a)),Vt(e,"BrtEndBookViews"))}}(n,e),function(e,t){Vt(e,"BrtBeginBundleShs");for(var r=0;r!=t.SheetNames.length;++r)Vt(e,"BrtBundleSh",ml({Hidden:t.Workbook&&t.Workbook.Sheets&&t.Workbook.Sheets[r]&&t.Workbook.Sheets[r].Hidden||0,iTabID:r+1,strRelID:"rId"+(r+1),name:t.SheetNames[r]}));Vt(e,"BrtEndBundleShs")}(n,e),Vt(n,"BrtEndBook"),n.end()}function wl(e,t,r,n,a,s,i,o){return".bin"===t.slice(-4)?function(e,t,r,n,a,s,i){if(!e)return e;var o=t||{};n||(n={"!id":{}});var l,c,f,h,u,d,p,g,m,v,b=o.dense?[]:{},w={s:{r:2e6,c:2e6},e:{r:0,c:0}},C=[],E=!1,S=!1,_=[];o.biff=12,o["!row"]=0;var A=0,B=!1,T=[],k={},y=o.supbooks||a.supbooks||[[]];if(y.sharedf=k,y.arrayf=T,y.SheetNames=a.SheetNames||a.Sheets.map(function(e){return e.name}),!o.supbooks&&(o.supbooks=y,a.Names))for(var I=0;I=D[0].s.r&&c.r<=D[0].e.r&&d>=D[0].s.c&&d<=D[0].e.c&&(f.F=tr(D[0]),B=!0)}!B&&e.length>3&&(f.f=e[3])}if(w.s.r>c.r&&(w.s.r=c.r),w.s.c>d&&(w.s.c=d),w.e.rc.r&&(w.s.r=c.r),w.s.c>d&&(w.s.c=d),w.e.r=e.s;)R[e.e--]={width:e.w/256,hidden:!!(1&e.flags),level:e.level},F||(F=!0,Ss(e.w/256)),_s(R[e.e+1]);break;case 161:b["!autofilter"]={ref:tr(e)};break;case 476:b["!margins"]=e;break;case 147:a.Sheets[r]||(a.Sheets[r]={}),e.name&&(a.Sheets[r].CodeName=e.name),(e.above||e.left)&&(b["!outline"]={above:e.above,left:e.left});break;case 137:a.Views||(a.Views=[{}]),a.Views[0]||(a.Views[0]={}),e.RTL&&(a.Views[0].RTL=!0);break;case 485:case 64:case 1053:case 151:case 152:case 175:case 644:case 625:case 562:case 396:case 1112:case 1146:case 471:case 1050:case 649:case 1105:case 49:case 589:case 607:case 564:case 1055:case 168:case 174:case 1180:case 499:case 507:case 550:case 171:case 167:case 1177:case 169:case 1181:case 551:case 552:case 661:case 639:case 478:case 537:case 477:case 536:case 1103:case 680:case 1104:case 1024:case 663:case 535:case 678:case 504:case 1043:case 428:case 170:case 3072:case 50:case 2070:case 1045:break;case 35:E=!0;break;case 36:E=!1;break;case 37:C.push(t),E=!0;break;case 38:C.pop(),E=!1;break;default:if((t||"").indexOf("Begin")>0);else if((t||"").indexOf("End")>0);else if(!E||o.WTF)throw new Error("Unexpected record "+I+" "+t)}},o),delete o.supbooks,delete o["!row"],!b["!ref"]&&(w.s.r<2e6||l&&(l.e.r>0||l.e.c>0||l.s.r>0||l.s.c>0))&&(b["!ref"]=tr(l||w)),o.sheetRows&&b["!ref"]){var D=rr(b["!ref"]);o.sheetRows<=+D.e.r&&(D.e.r=o.sheetRows-1,D.e.r>w.e.r&&(D.e.r=w.e.r),D.e.rw.e.c&&(D.e.c=w.e.c),D.e.c0&&(b["!merges"]=_),R.length>0&&(b["!cols"]=R),O.length>0&&(b["!rows"]=O),b}(e,n,r,a,s,i,o):function(e,t,r,n,a,s,i){if(!e)return e;n||(n={"!id":{}});var o=t.dense?[]:{},l={s:{r:2e6,c:2e6},e:{r:0,c:0}},c="",f="",h=e.match(Bo);h?(c=e.slice(0,h.index),f=e.slice(h.index+h[0].length)):c=f=e;var u=c.match(Ro);u?Do(u[0],0,a,r):(u=c.match(Oo))&&function(e,t,r,n,a){Do(e.slice(0,e.indexOf(">")),0,n,a)}(u[0],u[1],0,a,r);var d=(c.match(/<(?:\w*:)?dimension/)||{index:-1}).index;if(d>0){var p=c.slice(d,d+50).match(ko);p&&function(e,t){var r=rr(t);r.s.r<=r.e.r&&r.s.c<=r.e.c&&r.s.r>=0&&r.s.c>=0&&(e["!ref"]=tr(r))}(o,p[1])}var g=c.match(Fo);g&&g[1]&&function(e,t){t.Views||(t.Views=[{}]),(e.match(Lo)||[]).forEach(function(e,r){var n=Ee(e);t.Views[r]||(t.Views[r]={}),+n.zoomScale&&(t.Views[r].zoom=+n.zoomScale),Ne(n.rightToLeft)&&(t.Views[r].RTL=!0)})}(g[1],a);var m=[];if(t.cellStyles){var v=c.match(yo);v&&function(e,t){for(var r=!1,n=0;n!=t.length;++n){var a=Ee(t[n],!0);a.hidden&&(a.hidden=Ne(a.hidden));var s=parseInt(a.min,10)-1,i=parseInt(a.max,10)-1;for(a.outlineLevel&&(a.level=+a.outlineLevel||0),delete a.min,delete a.max,a.width=+a.width,!r&&a.width&&(r=!0,Ss(a.width)),_s(a);s<=i;)e[s++]=te(a)}}(m,v)}h&&jo(h[1],o,t,l,s,i);var b=f.match(xo);b&&(o["!autofilter"]=function(e){return{ref:(e.match(/ref="([^"]*)"/)||[])[1]}}(b[0]));var w=[],C=f.match(Ao);if(C)for(d=0;d!=C.length;++d)w[d]=rr(C[d].slice(C[d].indexOf('"')+1));var E=f.match(To);E&&function(e,t,r){for(var n=Array.isArray(e),a=0;a!=t.length;++a){var s=Ee(Pe(t[a]),!0);if(!s.ref)return;var i=((r||{})["!id"]||[])[s.id];i?(s.Target=i.Target,s.location&&(s.Target+="#"+ke(s.location))):(s.Target="#"+ke(s.location),i={Target:s.Target,TargetMode:"Internal"}),s.Rel=i,s.tooltip&&(s.Tooltip=s.tooltip,delete s.tooltip);for(var o=rr(s.ref),l=o.s.r;l<=o.e.r;++l)for(var c=o.s.c;c<=o.e.c;++c){var f=qt({c,r:l});n?(e[l]||(e[l]=[]),e[l][c]||(e[l][c]={t:"z",v:void 0}),e[l][c].l=s):(e[f]||(e[f]={t:"z",v:void 0}),e[f].l=s)}}}(o,E,n);var S=f.match(Io);if(S&&(o["!margins"]=function(e){var t={};return["left","right","top","bottom","header","footer"].forEach(function(r){e[r]&&(t[r]=parseFloat(e[r]))}),t}(Ee(S[0]))),!o["!ref"]&&l.e.c>=l.s.c&&l.e.r>=l.s.r&&(o["!ref"]=tr(l)),t.sheetRows>0&&o["!ref"]){var _=rr(o["!ref"]);t.sheetRows<=+_.e.r&&(_.e.r=t.sheetRows-1,_.e.r>l.e.r&&(_.e.r=l.e.r),_.e.r<_.s.r&&(_.s.r=_.e.r),_.e.c>l.e.c&&(_.e.c=l.e.c),_.e.c<_.s.c&&(_.s.c=_.e.c),o["!fullref"]=o["!ref"],o["!ref"]=tr(_))}return m.length>0&&(o["!cols"]=m),w.length>0&&(o["!merges"]=w),o}(e,n,r,a,s,i,o)}function Cl(e,t,r){return(".bin"===t.slice(-4)?bl:gl)(e,r)}function El(e,t,r,n,a){return(".bin"===t.slice(-4)?nl:$o)(e,r,n,a)}function Sl(e,t,r){return(".bin"===t.slice(-4)?qa:Qa)(e,r)}function _l(e,t,r){return(".bin"===t.slice(-4)?ci:oi)(e,r)}var Al=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g,Bl=/([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/;function Tl(e,t){var r=e.split(/\s+/),n=[];if(t||(n[0]=r[0]),1===r.length)return n;var a,s,i,o=e.match(Al);if(o)for(i=0;i!=o.length;++i)-1===(s=(a=o[i].match(Bl))[1].indexOf(":"))?n[a[1]]=a[2].slice(1,a[2].length-1):n["xmlns:"===a[1].slice(0,6)?"xmlns"+a[1].slice(6):a[1].slice(s+1)]=a[2].slice(1,a[2].length-1);return n}function kl(e){var t={};if(1===e.split(/\s+/).length)return t;var r,n,a,s=e.match(Al);if(s)for(a=0;a!=s.length;++a)-1===(n=(r=s[a].match(Bl))[1].indexOf(":"))?t[r[1]]=r[2].slice(1,r[2].length-1):t["xmlns:"===r[1].slice(0,6)?"xmlns"+r[1].slice(6):r[1].slice(n+1)]=r[2].slice(1,r[2].length-1);return t}function yl(e,t,r,n){var a=n;switch((r[0].match(/dt:dt="([\w.]+)"/)||["",""])[1]){case"boolean":a=Ne(n);break;case"i2":case"int":a=parseInt(n,10);break;case"r4":case"float":a=parseFloat(n);break;case"date":case"dateTime.tz":a=q(n);break;case"i8":case"string":case"fixed":case"uuid":case"bin.base64":break;default:throw new Error("bad custprop:"+r[0])}e[ke(t)]=a}function xl(e,t,r){if(r.cellStyles&&t.Interior){var n=t.Interior;n.Pattern&&(n.patternType=Os[n.Pattern]||n.Pattern)}e[t.ID]=t}function Il(e,t,r,n,a,s,i,o,l,c){var f="General",h=n.StyleID,u={};c=c||{};var d=[],p=0;for(void 0===h&&o&&(h=o.StyleID),void 0===h&&i&&(h=i.StyleID);void 0!==s[h]&&(s[h].nf&&(f=s[h].nf),s[h].Interior&&d.push(s[h].Interior),s[h].Parent);)h=s[h].Parent;switch(r.Type){case"Boolean":n.t="b",n.v=Ne(e);break;case"String":n.t="s",n.r=De(ke(e)),n.v=e.indexOf("<")>-1?ke(t||e).replace(/<.*?>/g,""):n.r;break;case"DateTime":"Z"!=e.slice(-1)&&(e+="Z"),n.v=(q(e)-new Date(Date.UTC(1899,11,30)))/864e5,n.v!=n.v?n.v=ke(e):n.v<60&&(n.v=n.v-1),f&&"General"!=f||(f="yyyy-mm-dd");case"Number":void 0===n.v&&(n.v=+e),n.t||(n.t="n");break;case"Error":n.t="e",n.v=Xr[e],!1!==c.cellText&&(n.w=e);break;default:""==e&&""==t?n.t="z":(n.t="s",n.v=De(t||e))}if(function(e,t,r){if("z"!==e.t){if(!r||!1!==r.cellText)try{"e"===e.t?e.w=e.w||Vr[e.v]:"General"===t?"n"===e.t?(0|e.v)===e.v?e.w=x._general_int(e.v):e.w=x._general_num(e.v):e.w=x._general(e.v):e.w=(n=t||"General",a=e.v,"General"===(s=O[n]||ke(n))?x._general(a):x.format(s,a))}catch(e){if(r.WTF)throw e}var n,a,s;try{var i=O[t]||t||"General";if(r.cellNF&&(e.z=i),r.cellDates&&"n"==e.t&&x.is_date(i)){var o=x.parse_date_code(e.v);o&&(e.t="d",e.v=new Date(o.y,o.m-1,o.d,o.H,o.M,o.S,o.u))}}catch(e){if(r.WTF)throw e}}}(n,f,c),!1!==c.cellFormula)if(n.Formula){var g=ke(n.Formula);61==g.charCodeAt(0)&&(g=g.slice(1)),n.f=hi(g,a),delete n.Formula,"RC"==n.ArrayRange?n.F=hi("RC:RC",a):n.ArrayRange&&(n.F=hi(n.ArrayRange,a),l.push([rr(n.F),n.F]))}else for(p=0;p=l[p][0].s.r&&a.r<=l[p][0].e.r&&a.c>=l[p][0].s.c&&a.c<=l[p][0].e.c&&(n.F=l[p][1]);c.cellStyles&&(d.forEach(function(e){!u.patternType&&e.patternType&&(u.patternType=e.patternType)}),n.s=u),void 0!==n.StyleID&&(n.ixfe=n.StyleID)}function Rl(e){e.t=e.v||"",e.t=e.t.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),e.v=e.w=e.ixfe=void 0}function Ol(e){if(v&&Buffer.isBuffer(e))return e.toString("utf8");if("string"==typeof e)return e;if("undefined"!=typeof Uint8Array&&e instanceof Uint8Array)return Pe(A(B(e)));throw new Error("Bad input format: expected Buffer or string")}var Fl=/<(\/?)([^\s?>:\/]+)(?:[\s?:\/][^>]*)?>/gm;function Dl(e,t){var r=t||{};I(x);var n=u(Ol(e));"binary"!=r.type&&"array"!=r.type&&"base64"!=r.type||(n="undefined"!=typeof cptable?cptable.utils.decode(65001,h(n)):Pe(n));var a,s=n.slice(0,1024).toLowerCase(),i=!1;if((1023&(s=s.replace(/".*?"/g,"")).indexOf(">"))>Math.min(1023&s.indexOf(","),1023&s.indexOf(";"))){var o=te(r);return o.type="string",Ua.to_workbook(n,o)}if(-1==s.indexOf("=0&&(i=!0)}),i)return ac.to_workbook(n,r);var l,c,f=[],d={},p=[],g=r.dense?[]:{},m="",v={},b={},w=Tl(''),C=0,E=0,S=0,_={s:{r:2e6,c:2e6},e:{r:0,c:0}},A={},B={},T="",k=0,y=[],R={},F={},D=0,N=[],P=[],L={},M=[],U=!1,z=[],H=[],W={},V=0,X=0,G={Sheets:[],WBProps:{date1904:!1}},j={};Fl.lastIndex=0,n=n.replace(//gm,"");for(var K="";a=Fl.exec(n);)switch(a[3]=(K=a[3]).toLowerCase()){case"data":if("data"==K){if("/"===a[1]){if((l=f.pop())[0]!==a[3])throw new Error("Bad state: "+l.join("|"))}else"/"!==a[0].charAt(a[0].length-2)&&f.push([a[3],!0]);break}if(f[f.length-1][1])break;"/"===a[1]?Il(n.slice(C,a.index),T,w,"comment"==f[f.length-1][0]?L:v,{c:E,r:S},A,M[E],b,z,r):(T="",w=Tl(a[0]),C=a.index+a[0].length);break;case"cell":if("/"===a[1])if(P.length>0&&(v.c=P),(!r.sheetRows||r.sheetRows>S)&&void 0!==v.v&&(r.dense?(g[S]||(g[S]=[]),g[S][E]=v):g[Qt(E)+Yt(S)]=v),v.HRef&&(v.l={Target:ke(v.HRef)},v.HRefScreenTip&&(v.l.Tooltip=v.HRefScreenTip),delete v.HRef,delete v.HRefScreenTip),(v.MergeAcross||v.MergeDown)&&(V=E+(0|parseInt(v.MergeAcross,10)),X=S+(0|parseInt(v.MergeDown,10)),y.push({s:{c:E,r:S},e:{c:V,r:X}})),r.sheetStubs)if(v.MergeAcross||v.MergeDown){for(var $=E;$<=V;++$)for(var Y=S;Y<=X;++Y)($>E||Y>S)&&(r.dense?(g[Y]||(g[Y]=[]),g[Y][$]={t:"z"}):g[Qt($)+Yt(Y)]={t:"z"});E=V+1}else++E;else v.MergeAcross?E=V+1:++E;else(v=kl(a[0])).Index&&(E=+v.Index-1),E<_.s.c&&(_.s.c=E),E>_.e.c&&(_.e.c=E),"/>"===a[0].slice(-2)&&++E,P=[];break;case"row":"/"===a[1]||"/>"===a[0].slice(-2)?(S<_.s.r&&(_.s.r=S),S>_.e.r&&(_.e.r=S),"/>"===a[0].slice(-2)&&(b=Tl(a[0])).Index&&(S=+b.Index-1),E=0,++S):((b=Tl(a[0])).Index&&(S=+b.Index-1),W={},("0"==b.AutoFitHeight||b.Height)&&(W.hpx=parseInt(b.Height,10),W.hpt=Bs(W.hpx),H[S]=W),"1"==b.Hidden&&(W.hidden=!0,H[S]=W));break;case"worksheet":if("/"===a[1]){if((l=f.pop())[0]!==a[3])throw new Error("Bad state: "+l.join("|"));p.push(m),_.s.r<=_.e.r&&_.s.c<=_.e.c&&(g["!ref"]=tr(_),r.sheetRows&&r.sheetRows<=_.e.r&&(g["!fullref"]=g["!ref"],_.e.r=r.sheetRows-1,g["!ref"]=tr(_))),y.length&&(g["!merges"]=y),M.length>0&&(g["!cols"]=M),H.length>0&&(g["!rows"]=H),d[m]=g}else _={s:{r:2e6,c:2e6},e:{r:0,c:0}},S=E=0,f.push([a[3],!1]),l=Tl(a[0]),m=ke(l.Name),g=r.dense?[]:{},y=[],z=[],H=[],j={name:m,Hidden:0},G.Sheets.push(j);break;case"table":if("/"===a[1]){if((l=f.pop())[0]!==a[3])throw new Error("Bad state: "+l.join("|"))}else{if("/>"==a[0].slice(-2))break;Tl(a[0]),f.push([a[3],!1]),M=[],U=!1}break;case"style":"/"===a[1]?xl(A,B,r):B=Tl(a[0]);break;case"numberformat":B.nf=ke(Tl(a[0]).Format||"General"),O[B.nf]&&(B.nf=O[B.nf]);for(var Z=0;392!=Z&&x._table[Z]!=B.nf;++Z);if(392==Z)for(Z=57;392!=Z;++Z)if(null==x._table[Z]){x.load(B.nf,Z);break}break;case"column":if("table"!==f[f.length-1][0])break;if((c=Tl(a[0])).Hidden&&(c.hidden=!0,delete c.Hidden),c.Width&&(c.wpx=parseInt(c.Width,10)),!U&&c.wpx>10){U=!0,vs=6;for(var Q=0;Q0&&(ee.Sheet=G.Sheets.length-1),G.Names.push(ee);break;case"namedcell":case"b":case"i":case"u":case"s":case"em":case"h2":case"h3":case"sub":case"sup":case"span":case"alignment":case"borders":case"border":case"protection":case"paragraphs":case"name":case"pixelsperinch":case"null":break;case"font":if("/>"===a[0].slice(-2))break;"/"===a[1]?T+=n.slice(k,a.index):k=a.index+a[0].length;break;case"interior":if(!r.cellStyles)break;B.Interior=Tl(a[0]);break;case"author":case"title":case"description":case"created":case"keywords":case"subject":case"category":case"company":case"lastauthor":case"lastsaved":case"lastprinted":case"version":case"revision":case"totaltime":case"hyperlinkbase":case"manager":case"contentstatus":case"identifier":case"language":case"appname":if("/>"===a[0].slice(-2))break;"/"===a[1]?Cn(R,K,n.slice(D,a.index)):D=a.index+a[0].length;break;case"styles":case"workbook":if("/"===a[1]){if((l=f.pop())[0]!==a[3])throw new Error("Bad state: "+l.join("|"))}else f.push([a[3],!1]);break;case"comment":if("/"===a[1]){if((l=f.pop())[0]!==a[3])throw new Error("Bad state: "+l.join("|"));Rl(L),P.push(L)}else f.push([a[3],!1]),L={a:(l=Tl(a[0])).Author};break;case"autofilter":if("/"===a[1]){if((l=f.pop())[0]!==a[3])throw new Error("Bad state: "+l.join("|"))}else if("/"!==a[0].charAt(a[0].length-2)){var re=Tl(a[0]);g["!autofilter"]={ref:hi(re.Range).replace(/\$/g,"")},f.push([a[3],!0])}break;case"datavalidation":if("/"===a[1]){if((l=f.pop())[0]!==a[3])throw new Error("Bad state: "+l.join("|"))}else"/"!==a[0].charAt(a[0].length-2)&&f.push([a[3],!0]);break;case"componentoptions":case"documentproperties":case"customdocumentproperties":case"officedocumentsettings":case"pivottable":case"pivotcache":case"names":case"mapinfo":case"pagebreaks":case"querytable":case"sorting":case"schema":case"conditionalformatting":case"smarttagtype":case"smarttags":case"excelworkbook":case"workbookoptions":case"worksheetoptions":if("/"===a[1]){if((l=f.pop())[0]!==a[3])throw new Error("Bad state: "+l.join("|"))}else"/"!==a[0].charAt(a[0].length-2)&&f.push([a[3],!0]);break;default:if(0==f.length&&"document"==a[3])return uc(n,r);if(0==f.length&&"uof"==a[3])return uc(n,r);var ne=!0;switch(f[f.length-1][0]){case"officedocumentsettings":switch(a[3]){case"allowpng":case"removepersonalinformation":case"downloadcomponents":case"locationofcomponents":case"colors":case"color":case"index":case"rgb":case"targetscreensize":case"readonlyrecommended":break;default:ne=!1}break;case"componentoptions":switch(a[3]){case"toolbar":case"hideofficelogo":case"spreadsheetautofit":case"label":case"caption":case"maxheight":case"maxwidth":case"nextsheetnumber":break;default:ne=!1}break;case"excelworkbook":switch(a[3]){case"date1904":G.WBProps.date1904=!0;break;case"windowheight":case"windowwidth":case"windowtopx":case"windowtopy":case"tabratio":case"protectstructure":case"protectwindow":case"protectwindows":case"activesheet":case"displayinknotes":case"firstvisiblesheet":case"supbook":case"sheetname":case"sheetindex":case"sheetindexfirst":case"sheetindexlast":case"dll":case"acceptlabelsinformulas":case"donotsavelinkvalues":case"iteration":case"maxiterations":case"maxchange":case"path":case"xct":case"count":case"selectedsheets":case"calculation":case"uncalced":case"startupprompt":case"crn":case"externname":case"formula":case"colfirst":case"collast":case"wantadvise":case"boolean":case"error":case"text":case"ole":case"noautorecover":case"publishobjects":case"donotcalculatebeforesave":case"number":case"refmoder1c1":case"embedsavesmarttags":break;default:ne=!1}break;case"workbookoptions":switch(a[3]){case"owcversion":case"height":case"width":break;default:ne=!1}break;case"worksheetoptions":switch(a[3]){case"visible":if("/>"===a[0].slice(-2));else if("/"===a[1])switch(n.slice(D,a.index)){case"SheetHidden":j.Hidden=1;break;case"SheetVeryHidden":j.Hidden=2}else D=a.index+a[0].length;break;case"header":g["!margins"]||Co(g["!margins"]={},"xlml"),g["!margins"].header=Ee(a[0]).Margin;break;case"footer":g["!margins"]||Co(g["!margins"]={},"xlml"),g["!margins"].footer=Ee(a[0]).Margin;break;case"pagemargins":var ae=Ee(a[0]);g["!margins"]||Co(g["!margins"]={},"xlml"),ae.Top&&(g["!margins"].top=ae.Top),ae.Left&&(g["!margins"].left=ae.Left),ae.Right&&(g["!margins"].right=ae.Right),ae.Bottom&&(g["!margins"].bottom=ae.Bottom);break;case"displayrighttoleft":G.Views||(G.Views=[]),G.Views[0]||(G.Views[0]={}),G.Views[0].RTL=!0;break;case"freezepanes":case"frozennosplit":case"splithorizontal":case"splitvertical":case"donotdisplaygridlines":case"activerow":case"activecol":case"toprowbottompane":case"leftcolumnrightpane":case"unsynced":case"print":case"printerrors":case"panes":case"scale":case"pane":case"number":case"layout":case"pagesetup":case"selected":case"protectobjects":case"enableselection":case"protectscenarios":case"validprinterinfo":case"horizontalresolution":case"verticalresolution":case"numberofcopies":case"activepane":case"toprowvisible":case"leftcolumnvisible":case"fittopage":case"rangeselection":case"papersizeindex":case"pagelayoutzoom":case"pagebreakzoom":case"filteron":case"fitwidth":case"fitheight":case"commentslayout":case"zoom":case"lefttoright":case"gridlines":case"allowsort":case"allowfilter":case"allowinsertrows":case"allowdeleterows":case"allowinsertcols":case"allowdeletecols":case"allowinserthyperlinks":case"allowformatcells":case"allowsizecols":case"allowsizerows":case"tabcolorindex":case"donotdisplayheadings":case"showpagelayoutzoom":case"blackandwhite":case"donotdisplayzeros":case"displaypagebreak":case"rowcolheadings":case"donotdisplayoutline":case"noorientation":case"allowusepivottables":case"zeroheight":case"viewablerange":case"selection":case"protectcontents":break;case"nosummaryrowsbelowdetail":g["!outline"]||(g["!outline"]={}),g["!outline"].above=!0;break;case"nosummarycolumnsrightdetail":g["!outline"]||(g["!outline"]={}),g["!outline"].left=!0;break;default:ne=!1}break;case"pivottable":case"pivotcache":switch(a[3]){case"immediateitemsondrop":case"showpagemultipleitemlabel":case"compactrowindent":case"location":case"pivotfield":case"orientation":case"layoutform":case"layoutsubtotallocation":case"layoutcompactrow":case"position":case"pivotitem":case"datatype":case"datafield":case"sourcename":case"parentfield":case"ptlineitems":case"ptlineitem":case"countofsameitems":case"item":case"itemtype":case"ptsource":case"cacheindex":case"consolidationreference":case"filename":case"reference":case"nocolumngrand":case"norowgrand":case"blanklineafteritems":case"hidden":case"subtotal":case"basefield":case"mapchilditems":case"function":case"refreshonfileopen":case"printsettitles":case"mergelabels":case"defaultversion":case"refreshname":case"refreshdate":case"refreshdatecopy":case"versionlastrefresh":case"versionlastupdate":case"versionupdateablemin":case"versionrefreshablemin":case"calculation":break;default:ne=!1}break;case"pagebreaks":switch(a[3]){case"colbreaks":case"colbreak":case"rowbreaks":case"rowbreak":case"colstart":case"colend":case"rowend":break;default:ne=!1}break;case"autofilter":switch(a[3]){case"autofiltercolumn":case"autofiltercondition":case"autofilterand":case"autofilteror":break;default:ne=!1}break;case"querytable":switch(a[3]){case"id":case"autoformatfont":case"autoformatpattern":case"querysource":case"querytype":case"enableredirections":case"refreshedinxl9":case"urlstring":case"htmltables":case"connection":case"commandtext":case"refreshinfo":case"notitles":case"nextid":case"columninfo":case"overwritecells":case"donotpromptforfile":case"textwizardsettings":case"source":case"number":case"decimal":case"thousandseparator":case"trailingminusnumbers":case"formatsettings":case"fieldtype":case"delimiters":case"tab":case"comma":case"autoformatname":case"versionlastedit":case"versionlastrefresh":break;default:ne=!1}break;case"datavalidation":switch(a[3]){case"range":case"type":case"min":case"max":case"sort":case"descending":case"order":case"casesensitive":case"value":case"errorstyle":case"errormessage":case"errortitle":case"inputmessage":case"inputtitle":case"combohide":case"inputhide":case"condition":case"qualifier":case"useblank":case"value1":case"value2":case"format":case"cellrangelist":break;default:ne=!1}break;case"sorting":case"conditionalformatting":switch(a[3]){case"range":case"type":case"min":case"max":case"sort":case"descending":case"order":case"casesensitive":case"value":case"errorstyle":case"errormessage":case"errortitle":case"cellrangelist":case"inputmessage":case"inputtitle":case"combohide":case"inputhide":case"condition":case"qualifier":case"useblank":case"value1":case"value2":case"format":break;default:ne=!1}break;case"mapinfo":case"schema":case"data":switch(a[3]){case"map":case"entry":case"range":case"xpath":case"field":case"xsdtype":case"filteron":case"aggregate":case"elementtype":case"attributetype":case"schema":case"element":case"complextype":case"datatype":case"all":case"attribute":case"extends":case"row":break;default:ne=!1}break;case"smarttags":break;default:ne=!1}if(ne)break;if(a[3].match(/!\[CDATA/))break;if(!f[f.length-1][1])throw"Unrecognized tag: "+a[3]+"|"+f.join("|");if("customdocumentproperties"===f[f.length-1][0]){if("/>"===a[0].slice(-2))break;"/"===a[1]?yl(F,K,N,n.slice(D,a.index)):(N=a,D=a.index+a[0].length);break}if(r.WTF)throw"Unrecognized tag: "+a[3]+"|"+f.join("|")}var se={};return r.bookSheets||r.bookProps||(se.Sheets=d),se.SheetNames=p,se.Workbook=G,se.SSF=x.get_table(),se.Props=R,se.Custprops=F,se}function Nl(e,t){switch(yc(t=t||{}),t.type||"base64"){case"base64":return Dl(m.decode(e),t);case"binary":case"buffer":case"file":return Dl(e,t);case"array":return Dl(A(e),t)}}function Pl(e){return qe("NamedRange",null,{"ss:Name":e.Name,"ss:RefersTo":"="+di(e.Ref,{r:0,c:0})})}function Ll(e,t,r,n,a,s,i){if(!e||null==e.v&&null==e.f)return"";var o={};if(e.f&&(o["ss:Formula"]="="+Ie(di(e.f,i))),e.F&&e.F.slice(0,t.length)==t){var l=Jt(e.F.slice(t.length+1));o["ss:ArrayRange"]="RC:R"+(l.r==i.r?"":"["+(l.r-i.r)+"]")+"C"+(l.c==i.c?"":"["+(l.c-i.c)+"]")}if(e.l&&e.l.Target&&(o["ss:HRef"]=Ie(e.l.Target),e.l.Tooltip&&(o["x:HRefScreenTip"]=Ie(e.l.Tooltip))),r["!merges"])for(var c=r["!merges"],f=0;f!=c.length;++f)c[f].s.c==i.c&&c[f].s.r==i.r&&(c[f].e.c>c[f].s.c&&(o["ss:MergeAcross"]=c[f].e.c-c[f].s.c),c[f].e.r>c[f].s.r&&(o["ss:MergeDown"]=c[f].e.r-c[f].s.r));var h="",u="";switch(e.t){case"z":if(!n.sheetStubs)return"";break;case"n":h="Number",u=String(e.v);break;case"b":h="Boolean",u=e.v?"1":"0";break;case"e":h="Error",u=Vr[e.v];break;case"d":h="DateTime",u=new Date(e.v).toISOString(),null==e.z&&(e.z=e.z||x._table[14]);break;case"s":h="String",u=((e.v||"")+"").replace(ye,function(e){return Te[e]}).replace(Oe,function(e){return"&#x"+e.charCodeAt(0).toString(16).toUpperCase()+";"})}var d=Eo(n.cellXfs,e,n);o["ss:StyleID"]="s"+(21+d),o["ss:Index"]=i.c+1;var p=null!=e.v?u:"",g="z"==e.t?"":''+p+"";return(e.c||[]).length>0&&(g+=e.c.map(function(e){var t=qe("ss:Data",(e.t||"").replace(/(\r\n|[\r\n])/g," "),{xmlns:"http://www.w3.org/TR/REC-html40"});return qe("Comment",t,{"ss:Author":e.a})}).join("")),qe("Cell",g,o)}function Ml(e,t){var r='"}function Ul(e,t,r){var n=[],a=r.SheetNames[e],s=r.Sheets[a],i=s?function(e,t,r,n){if(!e)return"";if(!((n||{}).Workbook||{}).Names)return"";for(var a=n.Workbook.Names,s=[],i=0;i0&&n.push(""+i+""),i=s?function(e,t){if(!e["!ref"])return"";var r=rr(e["!ref"]),n=e["!merges"]||[],a=0,s=[];e["!cols"]&&e["!cols"].forEach(function(e,t){_s(e);var r=!!e.width,n=wo(t,e),a={"ss:Index":t+1};r&&(a["ss:Width"]=bs(n.width)),e.hidden&&(a["ss:Hidden"]="1"),s.push(qe("Column",null,a))});for(var i=Array.isArray(e),o=r.s.r;o<=r.e.r;++o){for(var l=[Ml(o,(e["!rows"]||[])[o])],c=r.s.c;c<=r.e.c;++c){var f=!1;for(a=0;a!=n.length;++a)if(!(n[a].s.c>c||n[a].s.r>o||n[a].e.c"),l.length>2&&s.push(l.join(""))}return s.join("")}(s,t):"",i.length>0&&n.push(""+i+"
"),n.push(function(e,t,r,n){if(!e)return"";var a=[];if(e["!margins"]&&(a.push(""),e["!margins"].header&&a.push(qe("Header",null,{"x:Margin":e["!margins"].header})),e["!margins"].footer&&a.push(qe("Footer",null,{"x:Margin":e["!margins"].footer})),a.push(qe("PageMargins",null,{"x:Bottom":e["!margins"].bottom||"0.75","x:Left":e["!margins"].left||"0.7","x:Right":e["!margins"].right||"0.7","x:Top":e["!margins"].top||"0.75"})),a.push("")),n&&n.Workbook&&n.Workbook.Sheets&&n.Workbook.Sheets[r])if(n.Workbook.Sheets[r].Hidden)a.push(qe("Visible",1==n.Workbook.Sheets[r].Hidden?"SheetHidden":"SheetVeryHidden",{}));else{for(var s=0;s")}return((((n||{}).Workbook||{}).Views||[])[0]||{}).RTL&&a.push(""),e["!protect"]&&(a.push(Qe("ProtectContents","True")),e["!protect"].objects&&a.push(Qe("ProtectObjects","True")),e["!protect"].scenarios&&a.push(Qe("ProtectScenarios","True")),null==e["!protect"].selectLockedCells||e["!protect"].selectLockedCells?null==e["!protect"].selectUnlockedCells||e["!protect"].selectUnlockedCells||a.push(Qe("EnableSelection","UnlockedCells")):a.push(Qe("EnableSelection","NoSelection")),[["formatCells","AllowFormatCells"],["formatColumns","AllowSizeCols"],["formatRows","AllowSizeRows"],["insertColumns","AllowInsertCols"],["insertRows","AllowInsertRows"],["insertHyperlinks","AllowInsertHyperlinks"],["deleteColumns","AllowDeleteCols"],["deleteRows","AllowDeleteRows"],["sort","AllowSort"],["autoFilter","AllowFilter"],["pivotTables","AllowUsePivotTables"]].forEach(function(t){e["!protect"][t[0]]&&a.push("<"+t[1]+"/>")})),0==a.length?"":qe("WorksheetOptions",a.join(""),{xmlns:st})}(s,0,e,r)),n.join("")}function zl(e,t){t||(t={}),e.SSF||(e.SSF=x.get_table()),e.SSF&&(I(x),x.load_table(e.SSF),t.revssf=W(e.SSF),t.revssf[e.SSF[65535]]=0,t.ssf=e.SSF,t.cellXfs=[],Eo(t.cellXfs,{},{revssf:{General:0}}));var r=[];r.push(function(e,t){var r=[];return e.Props&&r.push(function(e,t){var r=[];return U(bn).map(function(e){for(var t=0;t'+a.join("")+""}(e.Props,e.Custprops)),r.join("")}(e,t)),r.push(""),r.push(""),r.push("");for(var n=0;n'];return t.cellXfs.forEach(function(e,t){var n=[];n.push(qe("NumberFormat",null,{"ss:Format":Ie(x._table[e.numFmtId])}));var a={"ss:ID":"s"+(21+t)};r.push(qe("Style",n.join(""),a))}),qe("Styles",r.join(""))}(0,t),r[3]=function(e){if(!((e||{}).Workbook||{}).Names)return"";for(var t=e.Workbook.Names,r=[],n=0;n0)switch(e.n){case"BOF":case"FilePass":case"FileLock":case"InterfaceHdr":case"RRDInfo":case"RRDHead":case"UsrExcl":case"EOF":case"BoundSheet8":break;default:n.enc.insitu(i)}s.push(i),t.l+=a;for(var o=Yl[kt(t,t.l)],l=0;null!=o&&"Continue"===o.n.slice(0,8);)a=kt(t,t.l+2),l=t.l+4,"ContinueFrt"==o.n?l+=4:"ContinueFrt"==o.n.slice(0,11)&&(l+=12),i=t.slice(l,t.l+4+a),s.push(i),t.l+=4+a,o=Yl[kt(t,t.l)];var c=T(s);Mt(c,0);var f=0;c.lens=[];for(var h=0;h40||(r.l-=4,t.Reserved1=r.read_shift(0,"lpstr-ansi"),r.length-r.l<=4||1907505652!==(n=r.read_shift(4))||(t.UnicodeClipboardFormat=function(e){return Or(e,2)}(r),0==(n=r.read_shift(4))||n>40||(r.l-=4,t.Reserved2=r.read_shift(0,"lpwstr"))))}(r),t.bookProps&&!t.bookSheets)a={};else{var i=v?"buffer":"array";if(n&&n.content)a=function(e,t){var r,n,a,s,i,o,l,f,h={opts:{}},u={},d=t.dense?[]:{},p={},g={},m=null,v=[],b="",w={},C="",E={},S=[],_=[],A=[],B={Sheets:[],WBProps:{date1904:!1},Views:[{}]},T={},k=function(e){return e<8?Wr[e]:e<64&&A[e-8]||Wr[e]},y=function(e,t,n){if(!(z>1||n.sheetRows&&e.r>=n.sheetRows)){if(n.cellStyles&&t.XF&&t.XF.data&&function(e,t,r){var n,a=t.XF.data;a&&a.patternType&&r&&r.cellStyles&&(t.s={},t.s.patternType=a.patternType,(n=gs(k(a.icvFore)))&&(t.s.fgColor={rgb:n}),(n=gs(k(a.icvBack)))&&(t.s.bgColor={rgb:n}))}(0,t,n),delete t.ixfe,delete t.XF,r=e,C=qt(e),g&&g.s&&g.e||(g={s:{r:0,c:0},e:{r:0,c:0}}),e.rg.e.r&&(g.e.r=e.r+1),e.c+1>g.e.c&&(g.e.c=e.c+1),n.cellFormula&&t.f)for(var a=0;ae.c||S[a][0].s.r>e.r||S[a][0].e.c>8)!==j)throw new Error("rt mismatch: "+Y+"!="+j);12==$.r&&(e.l+=10,K-=10)}var Z={};Z="EOF"===$.n?$.f(e,K,I):Hl($,e,K,I);var Q=$.n;if(0==z&&"BOF"!=Q)continue;switch(Q){case"Date1904":h.opts.Date1904=B.WBProps.date1904=Z;break;case"WriteProtect":h.opts.WriteProtect=!0;break;case"FilePass":if(I.enc||(e.l=0),I.enc=Z,!t.password)throw new Error("File is password-protected");if(null==Z.valid)throw new Error("Encryption scheme unsupported");if(!Z.valid)throw new Error("Password is incorrect");break;case"WriteAccess":I.lastuser=Z;break;case"FileSharing":case"Template":case"BookBool":case"UsesELFs":case"MTRSettings":case"Uncalced":case"ExtSST":case"BookExt":case"RichTextStream":case"BkHim":case"Index":case"Prot4Rev":case"Prot4RevPass":break;case"CodePage":var J=Number(Z);switch(J){case 21010:J=1200;break;case 32768:J=1e4;break;case 32769:J=1252}c(I.codepage=J),X=!0;break;case"RRTabId":I.rrtabid=Z;break;case"WinProtect":I.winlocked=Z;break;case"RefreshAll":case"CalcCount":case"CalcDelta":case"CalcIter":case"CalcMode":case"CalcPrecision":case"CalcSaveRecalc":h.opts[Q]=Z;break;case"CalcRefMode":I.CalcRefMode=Z;break;case"ForceFullCalculation":h.opts.FullCalc=Z;break;case"WsBool":Z.fDialog&&(d["!type"]="dialog"),Z.fBelow||((d["!outline"]||(d["!outline"]={})).above=!0),Z.fRight||((d["!outline"]||(d["!outline"]={})).left=!0);break;case"XF":_.push(Z);break;case"SupBook":P.push([Z]),P[P.length-1].XTI=[];break;case"ExternName":P[P.length-1].push(Z);break;case"Lbl":L={Name:Z.Name,Ref:Qi(Z.rgce,0,null,P,I)},Z.itab>0&&(L.Sheet=Z.itab-1),P.names.push(L),P[0]||(P[0]=[],P[0].XTI=[]),P[P.length-1].push(Z),"_xlnm._FilterDatabase"==Z.Name&&Z.itab>0&&Z.rgce&&Z.rgce[0]&&Z.rgce[0][0]&&"PtgArea3d"==Z.rgce[0][0][0]&&(V[Z.itab-1]={ref:tr(Z.rgce[0][0][1][2])});break;case"ExternCount":I.ExternCount=Z;break;case"ExternSheet":0==P.length&&(P[0]=[],P[0].XTI=[]),P[P.length-1].XTI=P[P.length-1].XTI.concat(Z),P.XTI=P.XTI.concat(Z);break;case"NameCmt":if(I.biff<8)break;null!=L&&(L.Comment=Z[1]);break;case"Protect":d["!protect"]=Z;break;case"Password":0!==Z&&I.WTF&&console.error("Password verifier: "+Z);break;case"BoundSheet8":p[Z.pos]=Z,I.snames.push(Z.name);break;case"EOF":if(--z)break;if(g.e){if(g.e.r>0&&g.e.c>0){if(g.e.r--,g.e.c--,d["!ref"]=tr(g),t.sheetRows&&t.sheetRows<=g.e.r){var q=g.e.r;g.e.r=t.sheetRows-1,d["!fullref"]=d["!ref"],d["!ref"]=tr(g),g.e.r=q}g.e.r++,g.e.c++}R.length>0&&(d["!merges"]=R),O.length>0&&(d["!objects"]=O),F.length>0&&(d["!cols"]=F),D.length>0&&(d["!rows"]=D),B.Sheets.push(T)}""===b?w=d:u[b]=d,d=t.dense?[]:{};break;case"BOF":if(8===I.biff&&(I.biff={9:2,521:3,1033:4}[j]||{512:2,768:3,1024:4,1280:5,1536:8,2:2,7:2}[Z.BIFFVer]||8),I.biffguess=0==Z.BIFFVer,0==Z.BIFFVer&&4096==Z.dt&&(I.biff=5,X=!0,c(I.codepage=28591)),8==I.biff&&0==Z.BIFFVer&&16==Z.dt&&(I.biff=2),z++)break;if(d=t.dense?[]:{},I.biff<8&&!X&&(X=!0,c(I.codepage=t.codepage||1252)),I.biff<5||0==Z.BIFFVer&&4096==Z.dt){""===b&&(b="Sheet1"),g={s:{r:0,c:0},e:{r:0,c:0}};var ee={pos:e.l-K,name:b};p[ee.pos]=ee,I.snames.push(b)}else b=(p[G]||{name:""}).name;32==Z.dt&&(d["!type"]="chart"),64==Z.dt&&(d["!type"]="macro"),R=[],O=[],I.arrayf=S=[],F=[],D=[],N=!1,T={Hidden:(p[G]||{hs:0}).hs,name:b};break;case"Number":case"BIFF2NUM":case"BIFF2INT":"chart"==d["!type"]&&(t.dense?(d[Z.r]||[])[Z.c]:d[qt({c:Z.c,r:Z.r})])&&++Z.c,o={ixfe:Z.ixfe,XF:_[Z.ixfe]||{},v:Z.val,t:"n"},H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y({c:Z.c,r:Z.r},o,t);break;case"BoolErr":o={ixfe:Z.ixfe,XF:_[Z.ixfe],v:Z.val,t:Z.t},H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y({c:Z.c,r:Z.r},o,t);break;case"RK":o={ixfe:Z.ixfe,XF:_[Z.ixfe],v:Z.rknum,t:"n"},H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y({c:Z.c,r:Z.r},o,t);break;case"MulRk":for(var te=Z.c;te<=Z.C;++te){var re=Z.rkrec[te-Z.c][0];o={ixfe:re,XF:_[re],v:Z.rkrec[te-Z.c][1],t:"n"},H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y({c:te,r:Z.r},o,t)}break;case"Formula":if("String"==Z.val){m=Z;break}if((o=Vl(Z.val,Z.cell.ixfe,Z.tt)).XF=_[o.ixfe],t.cellFormula){var ne=Z.formula;if(ne&&ne[0]&&ne[0][0]&&"PtgExp"==ne[0][0][0]){var ae=ne[0][0][1][0],se=ne[0][0][1][1],ie=qt({r:ae,c:se});E[ie]?o.f=""+Qi(Z.formula,0,Z.cell,P,I):o.F=((t.dense?(d[ae]||[])[se]:d[ie])||{}).F}else o.f=""+Qi(Z.formula,0,Z.cell,P,I)}H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y(Z.cell,o,t),m=Z;break;case"String":if(!m)throw new Error("String record expects Formula");m.val=Z,(o=Vl(Z,m.cell.ixfe,"s")).XF=_[o.ixfe],t.cellFormula&&(o.f=""+Qi(m.formula,0,m.cell,P,I)),H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y(m.cell,o,t),m=null;break;case"Array":S.push(Z);var oe=qt(Z[0].s);if(n=t.dense?(d[Z[0].s.r]||[])[Z[0].s.c]:d[oe],t.cellFormula&&n){if(!m)break;if(!oe||!n)break;n.f=""+Qi(Z[1],0,Z[0],P,I),n.F=tr(Z[0])}break;case"ShrFmla":if(!t.cellFormula)break;if(C){if(!m)break;E[qt(m.cell)]=Z[0],((n=t.dense?(d[m.cell.r]||[])[m.cell.c]:d[qt(m.cell)])||{}).f=""+Qi(Z[0],0,r,P,I)}break;case"LabelSst":o=Vl(v[Z.isst].t,Z.ixfe,"s"),v[Z.isst].h&&(o.h=v[Z.isst].h),o.XF=_[o.ixfe],H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y({c:Z.c,r:Z.r},o,t);break;case"Blank":t.sheetStubs&&(o={ixfe:Z.ixfe,XF:_[Z.ixfe],t:"z"},H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y({c:Z.c,r:Z.r},o,t));break;case"MulBlank":if(t.sheetStubs)for(var le=Z.c;le<=Z.C;++le){var ce=Z.ixfe[le-Z.c];o={ixfe:ce,XF:_[ce],t:"z"},H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y({c:le,r:Z.r},o,t)}break;case"RString":case"Label":case"BIFF2STR":(o=Vl(Z.val,Z.ixfe,"s")).XF=_[o.ixfe],H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y({c:Z.c,r:Z.r},o,t);break;case"Dimensions":1===z&&(g=Z);break;case"SST":v=Z;break;case"Format":if(4==I.biff){W[H++]=Z[1];for(var fe=0;fe=163&&x.load(Z[1],H+163)}else x.load(Z[1],Z[0]);break;case"BIFF2FORMAT":W[H++]=Z;for(var he=0;he=163&&x.load(Z,H+163);break;case"MergeCells":R=R.concat(Z);break;case"Obj":O[Z.cmo[0]]=I.lastobj=Z;break;case"TxO":I.lastobj.TxO=Z;break;case"ImData":I.lastobj.ImData=Z;break;case"HLink":for(i=Z[0].s.r;i<=Z[0].e.r;++i)for(s=Z[0].s.c;s<=Z[0].e.c;++s)(n=t.dense?(d[i]||[])[s]:d[qt({c:s,r:i})])&&(n.l=Z[1]);break;case"HLinkTooltip":for(i=Z[0].s.r;i<=Z[0].e.r;++i)for(s=Z[0].s.c;s<=Z[0].e.c;++s)(n=t.dense?(d[i]||[])[s]:d[qt({c:s,r:i})])&&n.l&&(n.l.Tooltip=Z[1]);break;case"Note":if(I.biff<=5&&I.biff>=2)break;n=t.dense?(d[Z[0].r]||[])[Z[0].c]:d[qt(Z[0])];var ue=O[Z[2]];n||(t.dense?(d[Z[0].r]||(d[Z[0].r]=[]),n=d[Z[0].r][Z[0].c]={t:"z"}):n=d[qt(Z[0])]={t:"z"},g.e.r=Math.max(g.e.r,Z[0].r),g.s.r=Math.min(g.s.r,Z[0].r),g.e.c=Math.max(g.e.c,Z[0].c),g.s.c=Math.min(g.s.c,Z[0].c)),n.c||(n.c=[]),a={a:Z[1],t:ue.TxO.t},n.c.push(a);break;default:switch($.n){case"ClrtClient":case"Selection":case"Header":case"Footer":case"HCenter":case"VCenter":case"Pls":case"GCW":case"LHRecord":case"DBCell":case"EntExU2":case"SxView":case"Sxvd":case"SXVI":case"SXVDEx":case"SxIvd":case"SXString":case"Sync":case"Addin":case"SXDI":case"SXLI":case"SXEx":case"QsiSXTag":case"Feat":case"FeatHdr":case"FeatHdr11":case"Feature11":case"Feature12":case"List12":case"RecalcId":case"DxGCol":case"Fbi":case"Fbi2":case"GelFrame":case"Font":case"XFCRC":case"Style":case"StyleExt":case"ScenarioProtect":case"ObjProtect":case"CondFmt12":case"Table":case"TableStyles":case"TableStyle":case"TableStyleElement":case"SXStreamID":case"SXVS":case"DConRef":case"SXAddl":case"DConBin":case"DConName":case"SXPI":case"SxFormat":case"SxSelect":case"SxRule":case"SxFilt":case"SxItm":case"SxDXF":case"ScenMan":case"DCon":case"CellWatch":case"PrintRowCol":case"PrintGrid":case"PrintSize":case"XCT":case"CRN":case"Scl":case"SheetExt":case"SheetExtOptional":case"ObNoMacros":case"ObProj":case"GUIDTypeLib":case"WOpt":case"PhoneticInfo":case"OleObjectSize":case"DXF":case"DXFN":case"DXFN12":case"DXFN12List":case"DXFN12NoCB":case"Dv":case"DVal":case"BRAI":case"Series":case"SeriesText":case"DConn":case"DbOrParamQry":case"DBQueryExt":case"OleDbConn":case"ExtString":case"IFmtRecord":case"CondFmt":case"CF":case"CF12":case"CFEx":case"Excel9File":case"Units":case"InterfaceHdr":case"Mms":case"InterfaceEnd":case"DSF":case"BuiltInFnGroupCount":case"Window1":case"HideObj":case"GridSet":case"Guts":case"UserBView":case"UserSViewBegin":case"UserSViewEnd":case"Pane":case"DefColWidth":break;case"XFExt":ni(_[Z.ixfe],Z.ext);break;case"DefaultRowHeight":Z[1];break;case"ColInfo":if(!I.cellStyles)break;for(;Z.e>=Z.s;)F[Z.e--]={width:Z.w/256,level:Z.level||0,hidden:!!(1&Z.flags)},N||(N=!0,Ss(Z.w/256)),_s(F[Z.e+1]);break;case"Row":var de={};null!=Z.level&&(D[Z.r]=de,de.level=Z.level),Z.hidden&&(D[Z.r]=de,de.hidden=!0),Z.hpt&&(D[Z.r]=de,de.hpt=Z.hpt,de.hpx=Ts(Z.hpt));break;case"LeftMargin":case"RightMargin":case"TopMargin":case"BottomMargin":d["!margins"]||Co(d["!margins"]={}),d["!margins"][Q.slice(0,-6).toLowerCase()]=Z;break;case"Setup":d["!margins"]||Co(d["!margins"]={}),d["!margins"].header=Z.header,d["!margins"].footer=Z.footer;break;case"Window2":Z.RTL&&(B.Views[0].RTL=!0);break;case"Country":l=Z;break;case"Palette":A=Z;break;case"Theme":f=Z;break;case"CodeName":b?T.CodeName=Z||T.name:B.WBProps.CodeName=Z||"ThisWorkbook";break;default:switch($.n){case"Dat":case"Begin":case"End":case"StartBlock":case"EndBlock":case"Frame":case"Area":case"Axis":case"AxisLine":case"Tick":case"AxesUsed":case"CrtLayout12":case"CrtLayout12A":case"CrtLink":case"CrtLine":case"CrtMlFrt":case"CrtMlFrtContinue":case"LineFormat":case"AreaFormat":case"Chart":case"Chart3d":case"Chart3DBarShape":case"ChartFormat":case"ChartFrtInfo":case"PlotArea":case"PlotGrowth":case"SeriesList":case"SerParent":case"SerAuxTrend":case"DataFormat":case"SerToCrt":case"FontX":case"CatSerRange":case"AxcExt":case"SerFmt":case"ShtProps":case"DefaultText":case"Text":case"CatLab":case"DataLabExtContents":case"Legend":case"LegendException":case"Pie":case"Scatter":case"PieFormat":case"MarkerFormat":case"StartObject":case"EndObject":case"AlRuns":case"ObjectLink":case"SIIndex":case"AttachedLabel":case"YMult":case"Line":case"Bar":case"Surf":case"AxisParent":case"Pos":case"ValueRange":case"SXViewEx9":case"SXViewLink":case"PivotChartBits":case"SBaseRef":case"TextPropsStream":case"LnExt":case"MkrExt":case"CrtCoopt":case"Qsi":case"Qsif":case"Qsir":case"QsiSXTag":case"TxtQry":case"FilterMode":case"AutoFilter":case"AutoFilterInfo":case"AutoFilter12":case"DropDownObjIds":case"Sort":case"SortData":case"ShapePropsStream":case"MsoDrawing":case"MsoDrawingGroup":case"MsoDrawingSelection":case"WebPub":case"AutoWebPub":case"HeaderFooter":case"HFPicture":case"PLV":case"HorizontalPageBreaks":case"VerticalPageBreaks":case"Backup":case"CompressPictures":case"Compat12":case"Continue":case"ContinueFrt12":case"FrtFontList":case"FrtWrapper":break;default:switch($.n){case"TabIdConf":case"Radar":case"RadarArea":case"DropBar":case"Intl":case"CoordList":case"SerAuxErrBar":case"BIFF2FONTCLR":case"BIFF2FMTCNT":case"BIFF2FONTXTRA":case"BIFF2XF":case"BIFF3XF":case"BIFF4XF":case"BIFF2XFINDEX":case"BIFF4FMTCNT":case"BIFF2ROW":case"BIFF2WINDOW2":case"SCENARIO":case"DConBin":case"PicF":case"DataLabExt":case"Lel":case"BopPop":case"BopPopCustom":case"RealTimeData":case"Name":case"LHNGraph":case"FnGroupName":case"AddMenu":case"LPr":case"ListObj":case"ListField":case"RRSort":case"BigName":case"ToolbarHdr":case"ToolbarEnd":case"DDEObjName":case"FRTArchId$":break;default:if(t.WTF)throw"Unrecognized Record "+$.n}}}}}else e.l+=K}return h.SheetNames=U(p).sort(function(e,t){return Number(e)-Number(t)}).map(function(e){return p[e].name}),t.bookSheets||(h.Sheets=u),!h.SheetNames.length&&w["!ref"]?(h.SheetNames.push("Sheet1"),h.Sheets&&(h.Sheets.Sheet1=w)):h.Preamble=w,h.Sheets&&V.forEach(function(e,t){h.Sheets[h.SheetNames[t]]["!autofilter"]=e}),h.Strings=v,h.SSF=x.get_table(),I.enc&&(h.Encryption=I.enc),f&&(h.Themes=f),h.Metadata={},void 0!==l&&(h.Metadata.Country=l),P.names.length>0&&(B.Names=P.names),h.Workbook=B,h}(n.content,t);else if((s=P.find(e,"PerfectOffice_MAIN"))&&s.content)a=za.to_workbook(s.content,(t.type=i,t));else{if(!(s=P.find(e,"NativeContent_MAIN"))||!s.content)throw(s=P.find(e,"MN0"))&&s.content?new Error("Unsupported Works 4 for Mac file"):new Error("Cannot find Workbook stream");a=za.to_workbook(s.content,(t.type=i,t))}t.bookVBA&&e.FullPaths&&P.find(e,"/_VBA_PROJECT_CUR/VBA/dir")&&(a.vbaraw=function(e){var t=P.utils.cfb_new({root:"R"});return e.FullPaths.forEach(function(r,n){if("/"!==r.slice(-1)&&r.match(/_VBA_PROJECT_CUR/)){var a=r.replace(/^[^\/]*/,"R").replace(/\/_VBA_PROJECT_CUR\u0000*/,"");P.utils.cfb_add(t,a,e.FileIndex[n].content)}}),P.write(t)}(e))}var o={};return e.FullPaths&&function(e,t,r){var n=P.find(e,"!DocumentSummaryInformation");if(n&&n.size>0)try{var a=Nn(n,Pr,Gl);for(var s in a)t[s]=a[s]}catch(e){if(r.WTF)throw e}var i=P.find(e,"!SummaryInformation");if(i&&i.size>0)try{var o=Nn(i,Lr,Xl);for(var l in o)null==t[l]&&(t[l]=o[l])}catch(e){if(r.WTF)throw e}t.HeadingPairs&&t.TitlesOfParts&&(pn(t.HeadingPairs,t.TitlesOfParts,t,r),delete t.HeadingPairs,delete t.TitlesOfParts)}(e,o,t),a.Props=a.Custprops=o,t.bookFiles&&(a.cfb=e),a}var Kl={0:{n:"BrtRowHdr",f:function(e,t){var r={},n=e.l+t;r.r=e.read_shift(4),e.l+=4;var a=e.read_shift(2);e.l+=1;var s=e.read_shift(1);return e.l=n,7&s&&(r.level=7&s),16&s&&(r.hidden=!0),32&s&&(r.hpt=a/20),r}},1:{n:"BrtCellBlank",f:function(e){return[dr(e)]}},2:{n:"BrtCellRk",f:function(e){return[dr(e),Ar(e),"n"]}},3:{n:"BrtCellError",f:function(e){return[dr(e),e.read_shift(1),"e"]}},4:{n:"BrtCellBool",f:function(e){return[dr(e),e.read_shift(1),"b"]}},5:{n:"BrtCellReal",f:function(e){return[dr(e),xr(e),"n"]}},6:{n:"BrtCellSt",f:function(e){return[dr(e),lr(e),"str"]}},7:{n:"BrtCellIsst",f:function(e){return[dr(e),e.read_shift(4),"s"]}},8:{n:"BrtFmlaString",f:function(e,t,r){var n=e.l+t,a=dr(e);a.r=r["!row"];var s=[a,lr(e),"str"];if(r.cellFormula){e.l+=2;var i=no(e,n-e.l,r);s[3]=Qi(i,0,a,r.supbooks,r)}else e.l=n;return s}},9:{n:"BrtFmlaNum",f:function(e,t,r){var n=e.l+t,a=dr(e);a.r=r["!row"];var s=[a,xr(e),"n"];if(r.cellFormula){e.l+=2;var i=no(e,n-e.l,r);s[3]=Qi(i,0,a,r.supbooks,r)}else e.l=n;return s}},10:{n:"BrtFmlaBool",f:function(e,t,r){var n=e.l+t,a=dr(e);a.r=r["!row"];var s=[a,e.read_shift(1),"b"];if(r.cellFormula){e.l+=2;var i=no(e,n-e.l,r);s[3]=Qi(i,0,a,r.supbooks,r)}else e.l=n;return s}},11:{n:"BrtFmlaError",f:function(e,t,r){var n=e.l+t,a=dr(e);a.r=r["!row"];var s=[a,e.read_shift(1),"e"];if(r.cellFormula){e.l+=2;var i=no(e,n-e.l,r);s[3]=Qi(i,0,a,r.supbooks,r)}else e.l=n;return s}},12:{n:"BrtShortBlank",f:function(e){return[gr(e)]}},13:{n:"BrtShortRk",f:function(e){return[gr(e),Ar(e),"n"]}},14:{n:"BrtShortError",f:function(e){return[gr(e),e.read_shift(1),"e"]}},15:{n:"BrtShortBool",f:function(e){return[gr(e),e.read_shift(1),"b"]}},16:{n:"BrtShortReal",f:Jo},17:{n:"BrtShortSt",f:function(e){return[gr(e),lr(e),"str"]}},18:{n:"BrtShortIsst",f:function(e){return[gr(e),e.read_shift(4),"s"]}},19:{n:"BrtSSTItem",f:hr},20:{n:"BrtPCDIMissing"},21:{n:"BrtPCDINumber"},22:{n:"BrtPCDIBoolean"},23:{n:"BrtPCDIError"},24:{n:"BrtPCDIString"},25:{n:"BrtPCDIDatetime"},26:{n:"BrtPCDIIndex"},27:{n:"BrtPCDIAMissing"},28:{n:"BrtPCDIANumber"},29:{n:"BrtPCDIABoolean"},30:{n:"BrtPCDIAError"},31:{n:"BrtPCDIAString"},32:{n:"BrtPCDIADatetime"},33:{n:"BrtPCRRecord"},34:{n:"BrtPCRRecordDt"},35:{n:"BrtFRTBegin"},36:{n:"BrtFRTEnd"},37:{n:"BrtACBegin"},38:{n:"BrtACEnd"},39:{n:"BrtName",f:function(e,t,r){var n=e.l+t;e.l+=4,e.l+=1;var a=e.read_shift(4),s=Er(e),i=ao(e,0,r),o=wr(e);e.l=n;var l={Name:s,Ptg:i};return a<268435455&&(l.Sheet=a),o&&(l.Comment=o),l}},40:{n:"BrtIndexRowBlock"},42:{n:"BrtIndexBlock"},43:{n:"BrtFont",f:function(e,t,r){var n={};n.sz=e.read_shift(2)/20;var a=function(e){var t=e.read_shift(1);return e.l++,{fBold:1&t,fItalic:2&t,fUnderline:4&t,fStrikeout:8&t,fOutline:16&t,fShadow:32&t,fCondense:64&t,fExtend:128&t}}(e);switch(a.fItalic&&(n.italic=1),a.fCondense&&(n.condense=1),a.fExtend&&(n.extend=1),a.fShadow&&(n.shadow=1),a.fOutline&&(n.outline=1),a.fStrikeout&&(n.strike=1),700===e.read_shift(2)&&(n.bold=1),e.read_shift(2)){case 1:n.vertAlign="superscript";break;case 2:n.vertAlign="subscript"}var s=e.read_shift(1);0!=s&&(n.underline=s);var i=e.read_shift(1);i>0&&(n.family=i);var o=e.read_shift(1);switch(o>0&&(n.charset=o),e.l++,n.color=function(e){var t={},r=e.read_shift(1)>>>1,n=e.read_shift(1),a=e.read_shift(2,"i"),s=e.read_shift(1),i=e.read_shift(1),o=e.read_shift(1);switch(e.l++,r){case 0:t.auto=1;break;case 1:t.index=n;var l=Wr[n];l&&(t.rgb=gs(l));break;case 2:t.rgb=gs([s,i,o]);break;case 3:t.theme=n}return 0!=a&&(t.tint=a>0?a/32767:a/32768),t}(e),e.read_shift(1)){case 1:n.scheme="major";break;case 2:n.scheme="minor"}return n.name=lr(e),n}},44:{n:"BrtFmt",f:function(e,t){return[e.read_shift(2),lr(e)]}},45:{n:"BrtFill",f:zs},46:{n:"BrtBorder",f:Xs},47:{n:"BrtXF",f:function(e,t){var r=e.l+t,n=e.read_shift(2),a=e.read_shift(2);return e.l=r,{ixfe:n,numFmtId:a}}},48:{n:"BrtStyle"},49:{n:"BrtCellMeta"},50:{n:"BrtValueMeta"},51:{n:"BrtMdb"},52:{n:"BrtBeginFmd"},53:{n:"BrtEndFmd"},54:{n:"BrtBeginMdx"},55:{n:"BrtEndMdx"},56:{n:"BrtBeginMdxTuple"},57:{n:"BrtEndMdxTuple"},58:{n:"BrtMdxMbrIstr"},59:{n:"BrtStr"},60:{n:"BrtColInfo",f:Ra},62:{n:"BrtCellRString"},63:{n:"BrtCalcChainItem$",f:function(e){var t={};t.i=e.read_shift(4);var r={};r.r=e.read_shift(4),r.c=e.read_shift(4),t.r=qt(r);var n=e.read_shift(1);return 2&n&&(t.l="1"),8&n&&(t.a="1"),t}},64:{n:"BrtDVal",f:function(){}},65:{n:"BrtSxvcellNum"},66:{n:"BrtSxvcellStr"},67:{n:"BrtSxvcellBool"},68:{n:"BrtSxvcellErr"},69:{n:"BrtSxvcellDate"},70:{n:"BrtSxvcellNil"},128:{n:"BrtFileVersion"},129:{n:"BrtBeginSheet"},130:{n:"BrtEndSheet"},131:{n:"BrtBeginBook",f:Ut,p:0},132:{n:"BrtEndBook"},133:{n:"BrtBeginWsViews"},134:{n:"BrtEndWsViews"},135:{n:"BrtBeginBookViews"},136:{n:"BrtEndBookViews"},137:{n:"BrtBeginWsView",f:function(e){var t=e.read_shift(2);return e.l+=28,{RTL:32&t}}},138:{n:"BrtEndWsView"},139:{n:"BrtBeginCsViews"},140:{n:"BrtEndCsViews"},141:{n:"BrtBeginCsView"},142:{n:"BrtEndCsView"},143:{n:"BrtBeginBundleShs"},144:{n:"BrtEndBundleShs"},145:{n:"BrtBeginSheetData"},146:{n:"BrtEndSheetData"},147:{n:"BrtWsProp",f:function(e,t){var r={},n=e[e.l];return++e.l,r.above=!(64&n),r.left=!(128&n),e.l+=18,r.name=vr(e,t-19),r}},148:{n:"BrtWsDim",f:Zo,p:16},151:{n:"BrtPane",f:function(){}},152:{n:"BrtSel"},153:{n:"BrtWbProp",f:function(e,t){var r={},n=e.read_shift(4);r.defaultThemeVersion=e.read_shift(4);var a=t>8?lr(e):"";return a.length>0&&(r.CodeName=a),r.autoCompressPictures=!!(65536&n),r.backupFile=!!(64&n),r.checkCompatibility=!!(4096&n),r.date1904=!!(1&n),r.filterPrivacy=!!(8&n),r.hidePivotFieldList=!!(1024&n),r.promptedSolutions=!!(16&n),r.publishItems=!!(2048&n),r.refreshAllConnections=!!(262144&n),r.saveExternalLinkValues=!!(128&n),r.showBorderUnselectedTables=!!(4&n),r.showInkAnnotation=!!(32&n),r.showObjects=["all","placeholders","none"][n>>13&3],r.showPivotChartFilter=!!(32768&n),r.updateLinks=["userSet","never","always"][n>>8&3],r}},154:{n:"BrtWbFactoid"},155:{n:"BrtFileRecover"},156:{n:"BrtBundleSh",f:function(e,t){var r={};return r.Hidden=e.read_shift(4),r.iTabID=e.read_shift(4),r.strRelID=Sr(e,t-8),r.name=lr(e),r}},157:{n:"BrtCalcProp"},158:{n:"BrtBookView"},159:{n:"BrtBeginSst",f:function(e){return[e.read_shift(4),e.read_shift(4)]}},160:{n:"BrtEndSst"},161:{n:"BrtBeginAFilter",f:kr},162:{n:"BrtEndAFilter"},163:{n:"BrtBeginFilterColumn"},164:{n:"BrtEndFilterColumn"},165:{n:"BrtBeginFilters"},166:{n:"BrtEndFilters"},167:{n:"BrtFilter"},168:{n:"BrtColorFilter"},169:{n:"BrtIconFilter"},170:{n:"BrtTop10Filter"},171:{n:"BrtDynamicFilter"},172:{n:"BrtBeginCustomFilters"},173:{n:"BrtEndCustomFilters"},174:{n:"BrtCustomFilter"},175:{n:"BrtAFilterDateGroupItem"},176:{n:"BrtMergeCell",f:qo},177:{n:"BrtBeginMergeCells"},178:{n:"BrtEndMergeCells"},179:{n:"BrtBeginPivotCacheDef"},180:{n:"BrtEndPivotCacheDef"},181:{n:"BrtBeginPCDFields"},182:{n:"BrtEndPCDFields"},183:{n:"BrtBeginPCDField"},184:{n:"BrtEndPCDField"},185:{n:"BrtBeginPCDSource"},186:{n:"BrtEndPCDSource"},187:{n:"BrtBeginPCDSRange"},188:{n:"BrtEndPCDSRange"},189:{n:"BrtBeginPCDFAtbl"},190:{n:"BrtEndPCDFAtbl"},191:{n:"BrtBeginPCDIRun"},192:{n:"BrtEndPCDIRun"},193:{n:"BrtBeginPivotCacheRecords"},194:{n:"BrtEndPivotCacheRecords"},195:{n:"BrtBeginPCDHierarchies"},196:{n:"BrtEndPCDHierarchies"},197:{n:"BrtBeginPCDHierarchy"},198:{n:"BrtEndPCDHierarchy"},199:{n:"BrtBeginPCDHFieldsUsage"},200:{n:"BrtEndPCDHFieldsUsage"},201:{n:"BrtBeginExtConnection"},202:{n:"BrtEndExtConnection"},203:{n:"BrtBeginECDbProps"},204:{n:"BrtEndECDbProps"},205:{n:"BrtBeginECOlapProps"},206:{n:"BrtEndECOlapProps"},207:{n:"BrtBeginPCDSConsol"},208:{n:"BrtEndPCDSConsol"},209:{n:"BrtBeginPCDSCPages"},210:{n:"BrtEndPCDSCPages"},211:{n:"BrtBeginPCDSCPage"},212:{n:"BrtEndPCDSCPage"},213:{n:"BrtBeginPCDSCPItem"},214:{n:"BrtEndPCDSCPItem"},215:{n:"BrtBeginPCDSCSets"},216:{n:"BrtEndPCDSCSets"},217:{n:"BrtBeginPCDSCSet"},218:{n:"BrtEndPCDSCSet"},219:{n:"BrtBeginPCDFGroup"},220:{n:"BrtEndPCDFGroup"},221:{n:"BrtBeginPCDFGItems"},222:{n:"BrtEndPCDFGItems"},223:{n:"BrtBeginPCDFGRange"},224:{n:"BrtEndPCDFGRange"},225:{n:"BrtBeginPCDFGDiscrete"},226:{n:"BrtEndPCDFGDiscrete"},227:{n:"BrtBeginPCDSDTupleCache"},228:{n:"BrtEndPCDSDTupleCache"},229:{n:"BrtBeginPCDSDTCEntries"},230:{n:"BrtEndPCDSDTCEntries"},231:{n:"BrtBeginPCDSDTCEMembers"},232:{n:"BrtEndPCDSDTCEMembers"},233:{n:"BrtBeginPCDSDTCEMember"},234:{n:"BrtEndPCDSDTCEMember"},235:{n:"BrtBeginPCDSDTCQueries"},236:{n:"BrtEndPCDSDTCQueries"},237:{n:"BrtBeginPCDSDTCQuery"},238:{n:"BrtEndPCDSDTCQuery"},239:{n:"BrtBeginPCDSDTCSets"},240:{n:"BrtEndPCDSDTCSets"},241:{n:"BrtBeginPCDSDTCSet"},242:{n:"BrtEndPCDSDTCSet"},243:{n:"BrtBeginPCDCalcItems"},244:{n:"BrtEndPCDCalcItems"},245:{n:"BrtBeginPCDCalcItem"},246:{n:"BrtEndPCDCalcItem"},247:{n:"BrtBeginPRule"},248:{n:"BrtEndPRule"},249:{n:"BrtBeginPRFilters"},250:{n:"BrtEndPRFilters"},251:{n:"BrtBeginPRFilter"},252:{n:"BrtEndPRFilter"},253:{n:"BrtBeginPNames"},254:{n:"BrtEndPNames"},255:{n:"BrtBeginPName"},256:{n:"BrtEndPName"},257:{n:"BrtBeginPNPairs"},258:{n:"BrtEndPNPairs"},259:{n:"BrtBeginPNPair"},260:{n:"BrtEndPNPair"},261:{n:"BrtBeginECWebProps"},262:{n:"BrtEndECWebProps"},263:{n:"BrtBeginEcWpTables"},264:{n:"BrtEndECWPTables"},265:{n:"BrtBeginECParams"},266:{n:"BrtEndECParams"},267:{n:"BrtBeginECParam"},268:{n:"BrtEndECParam"},269:{n:"BrtBeginPCDKPIs"},270:{n:"BrtEndPCDKPIs"},271:{n:"BrtBeginPCDKPI"},272:{n:"BrtEndPCDKPI"},273:{n:"BrtBeginDims"},274:{n:"BrtEndDims"},275:{n:"BrtBeginDim"},276:{n:"BrtEndDim"},277:{n:"BrtIndexPartEnd"},278:{n:"BrtBeginStyleSheet"},279:{n:"BrtEndStyleSheet"},280:{n:"BrtBeginSXView"},281:{n:"BrtEndSXVI"},282:{n:"BrtBeginSXVI"},283:{n:"BrtBeginSXVIs"},284:{n:"BrtEndSXVIs"},285:{n:"BrtBeginSXVD"},286:{n:"BrtEndSXVD"},287:{n:"BrtBeginSXVDs"},288:{n:"BrtEndSXVDs"},289:{n:"BrtBeginSXPI"},290:{n:"BrtEndSXPI"},291:{n:"BrtBeginSXPIs"},292:{n:"BrtEndSXPIs"},293:{n:"BrtBeginSXDI"},294:{n:"BrtEndSXDI"},295:{n:"BrtBeginSXDIs"},296:{n:"BrtEndSXDIs"},297:{n:"BrtBeginSXLI"},298:{n:"BrtEndSXLI"},299:{n:"BrtBeginSXLIRws"},300:{n:"BrtEndSXLIRws"},301:{n:"BrtBeginSXLICols"},302:{n:"BrtEndSXLICols"},303:{n:"BrtBeginSXFormat"},304:{n:"BrtEndSXFormat"},305:{n:"BrtBeginSXFormats"},306:{n:"BrtEndSxFormats"},307:{n:"BrtBeginSxSelect"},308:{n:"BrtEndSxSelect"},309:{n:"BrtBeginISXVDRws"},310:{n:"BrtEndISXVDRws"},311:{n:"BrtBeginISXVDCols"},312:{n:"BrtEndISXVDCols"},313:{n:"BrtEndSXLocation"},314:{n:"BrtBeginSXLocation"},315:{n:"BrtEndSXView"},316:{n:"BrtBeginSXTHs"},317:{n:"BrtEndSXTHs"},318:{n:"BrtBeginSXTH"},319:{n:"BrtEndSXTH"},320:{n:"BrtBeginISXTHRws"},321:{n:"BrtEndISXTHRws"},322:{n:"BrtBeginISXTHCols"},323:{n:"BrtEndISXTHCols"},324:{n:"BrtBeginSXTDMPS"},325:{n:"BrtEndSXTDMPs"},326:{n:"BrtBeginSXTDMP"},327:{n:"BrtEndSXTDMP"},328:{n:"BrtBeginSXTHItems"},329:{n:"BrtEndSXTHItems"},330:{n:"BrtBeginSXTHItem"},331:{n:"BrtEndSXTHItem"},332:{n:"BrtBeginMetadata"},333:{n:"BrtEndMetadata"},334:{n:"BrtBeginEsmdtinfo"},335:{n:"BrtMdtinfo"},336:{n:"BrtEndEsmdtinfo"},337:{n:"BrtBeginEsmdb"},338:{n:"BrtEndEsmdb"},339:{n:"BrtBeginEsfmd"},340:{n:"BrtEndEsfmd"},341:{n:"BrtBeginSingleCells"},342:{n:"BrtEndSingleCells"},343:{n:"BrtBeginList"},344:{n:"BrtEndList"},345:{n:"BrtBeginListCols"},346:{n:"BrtEndListCols"},347:{n:"BrtBeginListCol"},348:{n:"BrtEndListCol"},349:{n:"BrtBeginListXmlCPr"},350:{n:"BrtEndListXmlCPr"},351:{n:"BrtListCCFmla"},352:{n:"BrtListTrFmla"},353:{n:"BrtBeginExternals"},354:{n:"BrtEndExternals"},355:{n:"BrtSupBookSrc",f:Sr},357:{n:"BrtSupSelf"},358:{n:"BrtSupSame"},359:{n:"BrtSupTabs"},360:{n:"BrtBeginSupBook"},361:{n:"BrtPlaceholderName"},362:{n:"BrtExternSheet",f:Ta},363:{n:"BrtExternTableStart"},364:{n:"BrtExternTableEnd"},366:{n:"BrtExternRowHdr"},367:{n:"BrtExternCellBlank"},368:{n:"BrtExternCellReal"},369:{n:"BrtExternCellBool"},370:{n:"BrtExternCellError"},371:{n:"BrtExternCellString"},372:{n:"BrtBeginEsmdx"},373:{n:"BrtEndEsmdx"},374:{n:"BrtBeginMdxSet"},375:{n:"BrtEndMdxSet"},376:{n:"BrtBeginMdxMbrProp"},377:{n:"BrtEndMdxMbrProp"},378:{n:"BrtBeginMdxKPI"},379:{n:"BrtEndMdxKPI"},380:{n:"BrtBeginEsstr"},381:{n:"BrtEndEsstr"},382:{n:"BrtBeginPRFItem"},383:{n:"BrtEndPRFItem"},384:{n:"BrtBeginPivotCacheIDs"},385:{n:"BrtEndPivotCacheIDs"},386:{n:"BrtBeginPivotCacheID"},387:{n:"BrtEndPivotCacheID"},388:{n:"BrtBeginISXVIs"},389:{n:"BrtEndISXVIs"},390:{n:"BrtBeginColInfos"},391:{n:"BrtEndColInfos"},392:{n:"BrtBeginRwBrk"},393:{n:"BrtEndRwBrk"},394:{n:"BrtBeginColBrk"},395:{n:"BrtEndColBrk"},396:{n:"BrtBrk"},397:{n:"BrtUserBookView"},398:{n:"BrtInfo"},399:{n:"BrtCUsr"},400:{n:"BrtUsr"},401:{n:"BrtBeginUsers"},403:{n:"BrtEOF"},404:{n:"BrtUCR"},405:{n:"BrtRRInsDel"},406:{n:"BrtRREndInsDel"},407:{n:"BrtRRMove"},408:{n:"BrtRREndMove"},409:{n:"BrtRRChgCell"},410:{n:"BrtRREndChgCell"},411:{n:"BrtRRHeader"},412:{n:"BrtRRUserView"},413:{n:"BrtRRRenSheet"},414:{n:"BrtRRInsertSh"},415:{n:"BrtRRDefName"},416:{n:"BrtRRNote"},417:{n:"BrtRRConflict"},418:{n:"BrtRRTQSIF"},419:{n:"BrtRRFormat"},420:{n:"BrtRREndFormat"},421:{n:"BrtRRAutoFmt"},422:{n:"BrtBeginUserShViews"},423:{n:"BrtBeginUserShView"},424:{n:"BrtEndUserShView"},425:{n:"BrtEndUserShViews"},426:{n:"BrtArrFmla",f:function(e,t,r){var n=e.l+t,a=Tr(e),s=e.read_shift(1),i=[a];if(i[2]=s,r.cellFormula){var o=ro(e,n-e.l,r);i[1]=o}else e.l=n;return i}},427:{n:"BrtShrFmla",f:function(e,t,r){var n=e.l+t,a=[kr(e,16)];if(r.cellFormula){var s=so(e,n-e.l,r);a[1]=s,e.l=n}else e.l=n;return a}},428:{n:"BrtTable"},429:{n:"BrtBeginExtConnections"},430:{n:"BrtEndExtConnections"},431:{n:"BrtBeginPCDCalcMems"},432:{n:"BrtEndPCDCalcMems"},433:{n:"BrtBeginPCDCalcMem"},434:{n:"BrtEndPCDCalcMem"},435:{n:"BrtBeginPCDHGLevels"},436:{n:"BrtEndPCDHGLevels"},437:{n:"BrtBeginPCDHGLevel"},438:{n:"BrtEndPCDHGLevel"},439:{n:"BrtBeginPCDHGLGroups"},440:{n:"BrtEndPCDHGLGroups"},441:{n:"BrtBeginPCDHGLGroup"},442:{n:"BrtEndPCDHGLGroup"},443:{n:"BrtBeginPCDHGLGMembers"},444:{n:"BrtEndPCDHGLGMembers"},445:{n:"BrtBeginPCDHGLGMember"},446:{n:"BrtEndPCDHGLGMember"},447:{n:"BrtBeginQSI"},448:{n:"BrtEndQSI"},449:{n:"BrtBeginQSIR"},450:{n:"BrtEndQSIR"},451:{n:"BrtBeginDeletedNames"},452:{n:"BrtEndDeletedNames"},453:{n:"BrtBeginDeletedName"},454:{n:"BrtEndDeletedName"},455:{n:"BrtBeginQSIFs"},456:{n:"BrtEndQSIFs"},457:{n:"BrtBeginQSIF"},458:{n:"BrtEndQSIF"},459:{n:"BrtBeginAutoSortScope"},460:{n:"BrtEndAutoSortScope"},461:{n:"BrtBeginConditionalFormatting"},462:{n:"BrtEndConditionalFormatting"},463:{n:"BrtBeginCFRule"},464:{n:"BrtEndCFRule"},465:{n:"BrtBeginIconSet"},466:{n:"BrtEndIconSet"},467:{n:"BrtBeginDatabar"},468:{n:"BrtEndDatabar"},469:{n:"BrtBeginColorScale"},470:{n:"BrtEndColorScale"},471:{n:"BrtCFVO"},472:{n:"BrtExternValueMeta"},473:{n:"BrtBeginColorPalette"},474:{n:"BrtEndColorPalette"},475:{n:"BrtIndexedColor"},476:{n:"BrtMargins",f:function(e){var t={};return tl.forEach(function(r){t[r]=xr(e)}),t}},477:{n:"BrtPrintOptions"},478:{n:"BrtPageSetup"},479:{n:"BrtBeginHeaderFooter"},480:{n:"BrtEndHeaderFooter"},481:{n:"BrtBeginSXCrtFormat"},482:{n:"BrtEndSXCrtFormat"},483:{n:"BrtBeginSXCrtFormats"},484:{n:"BrtEndSXCrtFormats"},485:{n:"BrtWsFmtInfo",f:function(){}},486:{n:"BrtBeginMgs"},487:{n:"BrtEndMGs"},488:{n:"BrtBeginMGMaps"},489:{n:"BrtEndMGMaps"},490:{n:"BrtBeginMG"},491:{n:"BrtEndMG"},492:{n:"BrtBeginMap"},493:{n:"BrtEndMap"},494:{n:"BrtHLink",f:function(e,t){var r=e.l+t,n=kr(e,16),a=wr(e),s=lr(e),i=lr(e),o=lr(e);e.l=r;var l={rfx:n,relId:a,loc:s,display:o};return i&&(l.Tooltip=i),l}},495:{n:"BrtBeginDCon"},496:{n:"BrtEndDCon"},497:{n:"BrtBeginDRefs"},498:{n:"BrtEndDRefs"},499:{n:"BrtDRef"},500:{n:"BrtBeginScenMan"},501:{n:"BrtEndScenMan"},502:{n:"BrtBeginSct"},503:{n:"BrtEndSct"},504:{n:"BrtSlc"},505:{n:"BrtBeginDXFs"},506:{n:"BrtEndDXFs"},507:{n:"BrtDXF"},508:{n:"BrtBeginTableStyles"},509:{n:"BrtEndTableStyles"},510:{n:"BrtBeginTableStyle"},511:{n:"BrtEndTableStyle"},512:{n:"BrtTableStyleElement"},513:{n:"BrtTableStyleClient"},514:{n:"BrtBeginVolDeps"},515:{n:"BrtEndVolDeps"},516:{n:"BrtBeginVolType"},517:{n:"BrtEndVolType"},518:{n:"BrtBeginVolMain"},519:{n:"BrtEndVolMain"},520:{n:"BrtBeginVolTopic"},521:{n:"BrtEndVolTopic"},522:{n:"BrtVolSubtopic"},523:{n:"BrtVolRef"},524:{n:"BrtVolNum"},525:{n:"BrtVolErr"},526:{n:"BrtVolStr"},527:{n:"BrtVolBool"},528:{n:"BrtBeginCalcChain$"},529:{n:"BrtEndCalcChain$"},530:{n:"BrtBeginSortState"},531:{n:"BrtEndSortState"},532:{n:"BrtBeginSortCond"},533:{n:"BrtEndSortCond"},534:{n:"BrtBookProtection"},535:{n:"BrtSheetProtection"},536:{n:"BrtRangeProtection"},537:{n:"BrtPhoneticInfo"},538:{n:"BrtBeginECTxtWiz"},539:{n:"BrtEndECTxtWiz"},540:{n:"BrtBeginECTWFldInfoLst"},541:{n:"BrtEndECTWFldInfoLst"},542:{n:"BrtBeginECTwFldInfo"},548:{n:"BrtFileSharing"},549:{n:"BrtOleSize"},550:{n:"BrtDrawing",f:Sr},551:{n:"BrtLegacyDrawing"},552:{n:"BrtLegacyDrawingHF"},553:{n:"BrtWebOpt"},554:{n:"BrtBeginWebPubItems"},555:{n:"BrtEndWebPubItems"},556:{n:"BrtBeginWebPubItem"},557:{n:"BrtEndWebPubItem"},558:{n:"BrtBeginSXCondFmt"},559:{n:"BrtEndSXCondFmt"},560:{n:"BrtBeginSXCondFmts"},561:{n:"BrtEndSXCondFmts"},562:{n:"BrtBkHim"},564:{n:"BrtColor"},565:{n:"BrtBeginIndexedColors"},566:{n:"BrtEndIndexedColors"},569:{n:"BrtBeginMRUColors"},570:{n:"BrtEndMRUColors"},572:{n:"BrtMRUColor"},573:{n:"BrtBeginDVals"},574:{n:"BrtEndDVals"},577:{n:"BrtSupNameStart"},578:{n:"BrtSupNameValueStart"},579:{n:"BrtSupNameValueEnd"},580:{n:"BrtSupNameNum"},581:{n:"BrtSupNameErr"},582:{n:"BrtSupNameSt"},583:{n:"BrtSupNameNil"},584:{n:"BrtSupNameBool"},585:{n:"BrtSupNameFmla"},586:{n:"BrtSupNameBits"},587:{n:"BrtSupNameEnd"},588:{n:"BrtEndSupBook"},589:{n:"BrtCellSmartTagProperty"},590:{n:"BrtBeginCellSmartTag"},591:{n:"BrtEndCellSmartTag"},592:{n:"BrtBeginCellSmartTags"},593:{n:"BrtEndCellSmartTags"},594:{n:"BrtBeginSmartTags"},595:{n:"BrtEndSmartTags"},596:{n:"BrtSmartTagType"},597:{n:"BrtBeginSmartTagTypes"},598:{n:"BrtEndSmartTagTypes"},599:{n:"BrtBeginSXFilters"},600:{n:"BrtEndSXFilters"},601:{n:"BrtBeginSXFILTER"},602:{n:"BrtEndSXFilter"},603:{n:"BrtBeginFills"},604:{n:"BrtEndFills"},605:{n:"BrtBeginCellWatches"},606:{n:"BrtEndCellWatches"},607:{n:"BrtCellWatch"},608:{n:"BrtBeginCRErrs"},609:{n:"BrtEndCRErrs"},610:{n:"BrtCrashRecErr"},611:{n:"BrtBeginFonts"},612:{n:"BrtEndFonts"},613:{n:"BrtBeginBorders"},614:{n:"BrtEndBorders"},615:{n:"BrtBeginFmts"},616:{n:"BrtEndFmts"},617:{n:"BrtBeginCellXFs"},618:{n:"BrtEndCellXFs"},619:{n:"BrtBeginStyles"},620:{n:"BrtEndStyles"},625:{n:"BrtBigName"},626:{n:"BrtBeginCellStyleXFs"},627:{n:"BrtEndCellStyleXFs"},628:{n:"BrtBeginComments"},629:{n:"BrtEndComments"},630:{n:"BrtBeginCommentAuthors"},631:{n:"BrtEndCommentAuthors"},632:{n:"BrtCommentAuthor",f:li},633:{n:"BrtBeginCommentList"},634:{n:"BrtEndCommentList"},635:{n:"BrtBeginComment",f:function(e){var t={};t.iauthor=e.read_shift(4);var r=kr(e,16);return t.rfx=r.s,t.ref=qt(r.s),e.l+=16,t}},636:{n:"BrtEndComment"},637:{n:"BrtCommentText",f:ur},638:{n:"BrtBeginOleObjects"},639:{n:"BrtOleObject"},640:{n:"BrtEndOleObjects"},641:{n:"BrtBeginSxrules"},642:{n:"BrtEndSxRules"},643:{n:"BrtBeginActiveXControls"},644:{n:"BrtActiveX"},645:{n:"BrtEndActiveXControls"},646:{n:"BrtBeginPCDSDTCEMembersSortBy"},648:{n:"BrtBeginCellIgnoreECs"},649:{n:"BrtCellIgnoreEC"},650:{n:"BrtEndCellIgnoreECs"},651:{n:"BrtCsProp",f:function(e,t){return e.l+=10,{name:lr(e)}}},652:{n:"BrtCsPageSetup"},653:{n:"BrtBeginUserCsViews"},654:{n:"BrtEndUserCsViews"},655:{n:"BrtBeginUserCsView"},656:{n:"BrtEndUserCsView"},657:{n:"BrtBeginPcdSFCIEntries"},658:{n:"BrtEndPCDSFCIEntries"},659:{n:"BrtPCDSFCIEntry"},660:{n:"BrtBeginListParts"},661:{n:"BrtListPart"},662:{n:"BrtEndListParts"},663:{n:"BrtSheetCalcProp"},664:{n:"BrtBeginFnGroup"},665:{n:"BrtFnGroup"},666:{n:"BrtEndFnGroup"},667:{n:"BrtSupAddin"},668:{n:"BrtSXTDMPOrder"},669:{n:"BrtCsProtection"},671:{n:"BrtBeginWsSortMap"},672:{n:"BrtEndWsSortMap"},673:{n:"BrtBeginRRSort"},674:{n:"BrtEndRRSort"},675:{n:"BrtRRSortItem"},676:{n:"BrtFileSharingIso"},677:{n:"BrtBookProtectionIso"},678:{n:"BrtSheetProtectionIso"},679:{n:"BrtCsProtectionIso"},680:{n:"BrtRangeProtectionIso"},681:{n:"BrtDValList"},1024:{n:"BrtRwDescent"},1025:{n:"BrtKnownFonts"},1026:{n:"BrtBeginSXTupleSet"},1027:{n:"BrtEndSXTupleSet"},1028:{n:"BrtBeginSXTupleSetHeader"},1029:{n:"BrtEndSXTupleSetHeader"},1030:{n:"BrtSXTupleSetHeaderItem"},1031:{n:"BrtBeginSXTupleSetData"},1032:{n:"BrtEndSXTupleSetData"},1033:{n:"BrtBeginSXTupleSetRow"},1034:{n:"BrtEndSXTupleSetRow"},1035:{n:"BrtSXTupleSetRowItem"},1036:{n:"BrtNameExt"},1037:{n:"BrtPCDH14"},1038:{n:"BrtBeginPCDCalcMem14"},1039:{n:"BrtEndPCDCalcMem14"},1040:{n:"BrtSXTH14"},1041:{n:"BrtBeginSparklineGroup"},1042:{n:"BrtEndSparklineGroup"},1043:{n:"BrtSparkline"},1044:{n:"BrtSXDI14"},1045:{n:"BrtWsFmtInfoEx14"},1046:{n:"BrtBeginConditionalFormatting14"},1047:{n:"BrtEndConditionalFormatting14"},1048:{n:"BrtBeginCFRule14"},1049:{n:"BrtEndCFRule14"},1050:{n:"BrtCFVO14"},1051:{n:"BrtBeginDatabar14"},1052:{n:"BrtBeginIconSet14"},1053:{n:"BrtDVal14",f:function(){}},1054:{n:"BrtBeginDVals14"},1055:{n:"BrtColor14"},1056:{n:"BrtBeginSparklines"},1057:{n:"BrtEndSparklines"},1058:{n:"BrtBeginSparklineGroups"},1059:{n:"BrtEndSparklineGroups"},1061:{n:"BrtSXVD14"},1062:{n:"BrtBeginSXView14"},1063:{n:"BrtEndSXView14"},1064:{n:"BrtBeginSXView16"},1065:{n:"BrtEndSXView16"},1066:{n:"BrtBeginPCD14"},1067:{n:"BrtEndPCD14"},1068:{n:"BrtBeginExtConn14"},1069:{n:"BrtEndExtConn14"},1070:{n:"BrtBeginSlicerCacheIDs"},1071:{n:"BrtEndSlicerCacheIDs"},1072:{n:"BrtBeginSlicerCacheID"},1073:{n:"BrtEndSlicerCacheID"},1075:{n:"BrtBeginSlicerCache"},1076:{n:"BrtEndSlicerCache"},1077:{n:"BrtBeginSlicerCacheDef"},1078:{n:"BrtEndSlicerCacheDef"},1079:{n:"BrtBeginSlicersEx"},1080:{n:"BrtEndSlicersEx"},1081:{n:"BrtBeginSlicerEx"},1082:{n:"BrtEndSlicerEx"},1083:{n:"BrtBeginSlicer"},1084:{n:"BrtEndSlicer"},1085:{n:"BrtSlicerCachePivotTables"},1086:{n:"BrtBeginSlicerCacheOlapImpl"},1087:{n:"BrtEndSlicerCacheOlapImpl"},1088:{n:"BrtBeginSlicerCacheLevelsData"},1089:{n:"BrtEndSlicerCacheLevelsData"},1090:{n:"BrtBeginSlicerCacheLevelData"},1091:{n:"BrtEndSlicerCacheLevelData"},1092:{n:"BrtBeginSlicerCacheSiRanges"},1093:{n:"BrtEndSlicerCacheSiRanges"},1094:{n:"BrtBeginSlicerCacheSiRange"},1095:{n:"BrtEndSlicerCacheSiRange"},1096:{n:"BrtSlicerCacheOlapItem"},1097:{n:"BrtBeginSlicerCacheSelections"},1098:{n:"BrtSlicerCacheSelection"},1099:{n:"BrtEndSlicerCacheSelections"},1100:{n:"BrtBeginSlicerCacheNative"},1101:{n:"BrtEndSlicerCacheNative"},1102:{n:"BrtSlicerCacheNativeItem"},1103:{n:"BrtRangeProtection14"},1104:{n:"BrtRangeProtectionIso14"},1105:{n:"BrtCellIgnoreEC14"},1111:{n:"BrtList14"},1112:{n:"BrtCFIcon"},1113:{n:"BrtBeginSlicerCachesPivotCacheIDs"},1114:{n:"BrtEndSlicerCachesPivotCacheIDs"},1115:{n:"BrtBeginSlicers"},1116:{n:"BrtEndSlicers"},1117:{n:"BrtWbProp14"},1118:{n:"BrtBeginSXEdit"},1119:{n:"BrtEndSXEdit"},1120:{n:"BrtBeginSXEdits"},1121:{n:"BrtEndSXEdits"},1122:{n:"BrtBeginSXChange"},1123:{n:"BrtEndSXChange"},1124:{n:"BrtBeginSXChanges"},1125:{n:"BrtEndSXChanges"},1126:{n:"BrtSXTupleItems"},1128:{n:"BrtBeginSlicerStyle"},1129:{n:"BrtEndSlicerStyle"},1130:{n:"BrtSlicerStyleElement"},1131:{n:"BrtBeginStyleSheetExt14"},1132:{n:"BrtEndStyleSheetExt14"},1133:{n:"BrtBeginSlicerCachesPivotCacheID"},1134:{n:"BrtEndSlicerCachesPivotCacheID"},1135:{n:"BrtBeginConditionalFormattings"},1136:{n:"BrtEndConditionalFormattings"},1137:{n:"BrtBeginPCDCalcMemExt"},1138:{n:"BrtEndPCDCalcMemExt"},1139:{n:"BrtBeginPCDCalcMemsExt"},1140:{n:"BrtEndPCDCalcMemsExt"},1141:{n:"BrtPCDField14"},1142:{n:"BrtBeginSlicerStyles"},1143:{n:"BrtEndSlicerStyles"},1144:{n:"BrtBeginSlicerStyleElements"},1145:{n:"BrtEndSlicerStyleElements"},1146:{n:"BrtCFRuleExt"},1147:{n:"BrtBeginSXCondFmt14"},1148:{n:"BrtEndSXCondFmt14"},1149:{n:"BrtBeginSXCondFmts14"},1150:{n:"BrtEndSXCondFmts14"},1152:{n:"BrtBeginSortCond14"},1153:{n:"BrtEndSortCond14"},1154:{n:"BrtEndDVals14"},1155:{n:"BrtEndIconSet14"},1156:{n:"BrtEndDatabar14"},1157:{n:"BrtBeginColorScale14"},1158:{n:"BrtEndColorScale14"},1159:{n:"BrtBeginSxrules14"},1160:{n:"BrtEndSxrules14"},1161:{n:"BrtBeginPRule14"},1162:{n:"BrtEndPRule14"},1163:{n:"BrtBeginPRFilters14"},1164:{n:"BrtEndPRFilters14"},1165:{n:"BrtBeginPRFilter14"},1166:{n:"BrtEndPRFilter14"},1167:{n:"BrtBeginPRFItem14"},1168:{n:"BrtEndPRFItem14"},1169:{n:"BrtBeginCellIgnoreECs14"},1170:{n:"BrtEndCellIgnoreECs14"},1171:{n:"BrtDxf14"},1172:{n:"BrtBeginDxF14s"},1173:{n:"BrtEndDxf14s"},1177:{n:"BrtFilter14"},1178:{n:"BrtBeginCustomFilters14"},1180:{n:"BrtCustomFilter14"},1181:{n:"BrtIconFilter14"},1182:{n:"BrtPivotCacheConnectionName"},2048:{n:"BrtBeginDecoupledPivotCacheIDs"},2049:{n:"BrtEndDecoupledPivotCacheIDs"},2050:{n:"BrtDecoupledPivotCacheID"},2051:{n:"BrtBeginPivotTableRefs"},2052:{n:"BrtEndPivotTableRefs"},2053:{n:"BrtPivotTableRef"},2054:{n:"BrtSlicerCacheBookPivotTables"},2055:{n:"BrtBeginSxvcells"},2056:{n:"BrtEndSxvcells"},2057:{n:"BrtBeginSxRow"},2058:{n:"BrtEndSxRow"},2060:{n:"BrtPcdCalcMem15"},2067:{n:"BrtQsi15"},2068:{n:"BrtBeginWebExtensions"},2069:{n:"BrtEndWebExtensions"},2070:{n:"BrtWebExtension"},2071:{n:"BrtAbsPath15"},2072:{n:"BrtBeginPivotTableUISettings"},2073:{n:"BrtEndPivotTableUISettings"},2075:{n:"BrtTableSlicerCacheIDs"},2076:{n:"BrtTableSlicerCacheID"},2077:{n:"BrtBeginTableSlicerCache"},2078:{n:"BrtEndTableSlicerCache"},2079:{n:"BrtSxFilter15"},2080:{n:"BrtBeginTimelineCachePivotCacheIDs"},2081:{n:"BrtEndTimelineCachePivotCacheIDs"},2082:{n:"BrtTimelineCachePivotCacheID"},2083:{n:"BrtBeginTimelineCacheIDs"},2084:{n:"BrtEndTimelineCacheIDs"},2085:{n:"BrtBeginTimelineCacheID"},2086:{n:"BrtEndTimelineCacheID"},2087:{n:"BrtBeginTimelinesEx"},2088:{n:"BrtEndTimelinesEx"},2089:{n:"BrtBeginTimelineEx"},2090:{n:"BrtEndTimelineEx"},2091:{n:"BrtWorkBookPr15"},2092:{n:"BrtPCDH15"},2093:{n:"BrtBeginTimelineStyle"},2094:{n:"BrtEndTimelineStyle"},2095:{n:"BrtTimelineStyleElement"},2096:{n:"BrtBeginTimelineStylesheetExt15"},2097:{n:"BrtEndTimelineStylesheetExt15"},2098:{n:"BrtBeginTimelineStyles"},2099:{n:"BrtEndTimelineStyles"},2100:{n:"BrtBeginTimelineStyleElements"},2101:{n:"BrtEndTimelineStyleElements"},2102:{n:"BrtDxf15"},2103:{n:"BrtBeginDxfs15"},2104:{n:"brtEndDxfs15"},2105:{n:"BrtSlicerCacheHideItemsWithNoData"},2106:{n:"BrtBeginItemUniqueNames"},2107:{n:"BrtEndItemUniqueNames"},2108:{n:"BrtItemUniqueName"},2109:{n:"BrtBeginExtConn15"},2110:{n:"BrtEndExtConn15"},2111:{n:"BrtBeginOledbPr15"},2112:{n:"BrtEndOledbPr15"},2113:{n:"BrtBeginDataFeedPr15"},2114:{n:"BrtEndDataFeedPr15"},2115:{n:"BrtTextPr15"},2116:{n:"BrtRangePr15"},2117:{n:"BrtDbCommand15"},2118:{n:"BrtBeginDbTables15"},2119:{n:"BrtEndDbTables15"},2120:{n:"BrtDbTable15"},2121:{n:"BrtBeginDataModel"},2122:{n:"BrtEndDataModel"},2123:{n:"BrtBeginModelTables"},2124:{n:"BrtEndModelTables"},2125:{n:"BrtModelTable"},2126:{n:"BrtBeginModelRelationships"},2127:{n:"BrtEndModelRelationships"},2128:{n:"BrtModelRelationship"},2129:{n:"BrtBeginECTxtWiz15"},2130:{n:"BrtEndECTxtWiz15"},2131:{n:"BrtBeginECTWFldInfoLst15"},2132:{n:"BrtEndECTWFldInfoLst15"},2133:{n:"BrtBeginECTWFldInfo15"},2134:{n:"BrtFieldListActiveItem"},2135:{n:"BrtPivotCacheIdVersion"},2136:{n:"BrtSXDI15"},2137:{n:"BrtBeginModelTimeGroupings"},2138:{n:"BrtEndModelTimeGroupings"},2139:{n:"BrtBeginModelTimeGrouping"},2140:{n:"BrtEndModelTimeGrouping"},2141:{n:"BrtModelTimeGroupingCalcCol"},3072:{n:"BrtUid"},3073:{n:"BrtRevisionPtr"},5095:{n:"BrtBeginCalcFeatures"},5096:{n:"BrtEndCalcFeatures"},5097:{n:"BrtCalcFeature"},65535:{n:""}},$l=z(Kl,"n");$l.BrtFRTArchID$=16;var Yl={6:{n:"Formula",f:eo},10:{n:"EOF",f:Ln},12:{n:"CalcCount",f:zn},13:{n:"CalcMode",f:zn},14:{n:"CalcPrecision",f:Mn},15:{n:"CalcRefMode",f:Mn},16:{n:"CalcDelta",f:xr},17:{n:"CalcIter",f:Mn},18:{n:"Protect",f:Mn},19:{n:"Password",f:zn},20:{n:"Header",f:Sa},21:{n:"Footer",f:Sa},23:{n:"ExternSheet",f:Ta},24:{n:"Lbl",f:Ba},25:{n:"WinProtect",f:Mn},26:{n:"VerticalPageBreaks"},27:{n:"HorizontalPageBreaks"},28:{n:"Note",f:function(e,t,r){return function(e,t,r){if(!(r.biff<8)){var n=e.read_shift(2),a=e.read_shift(2),s=e.read_shift(2),i=e.read_shift(2),o=Yn(e,0,r);return r.biff<8&&e.read_shift(1),[{r:n,c:a},o,i,s]}}(e,0,r)}},29:{n:"Selection"},34:{n:"Date1904",f:Mn},35:{n:"ExternName",f:_a},38:{n:"LeftMargin",f:xr},39:{n:"RightMargin",f:xr},40:{n:"TopMargin",f:xr},41:{n:"BottomMargin",f:xr},42:{n:"PrintRowCol",f:Mn},43:{n:"PrintGrid",f:Mn},47:{n:"FilePass",f:function(e,t,r){var n={Type:r.biff>=8?e.read_shift(2):0};return n.Type?function(e,t,r){var n=r||{};n.Info=e.read_shift(2),e.l-=2,1===n.Info?n.Data=function(e){var t={},r=t.EncryptionVersionInfo=ts(e,4);if(1!=r.Major||1!=r.Minor)throw"unrecognized version code "+r.Major+" : "+r.Minor;return t.Salt=e.read_shift(16),t.EncryptedVerifier=e.read_shift(16),t.EncryptedVerifierHash=e.read_shift(16),t}(e):n.Data=function(e,t){var r={},n=r.EncryptionVersionInfo=ts(e,4);if(t-=4,2!=n.Minor)throw new Error("unrecognized minor version code: "+n.Minor);if(n.Major>4||n.Major<2)throw new Error("unrecognized major version code: "+n.Major);r.Flags=e.read_shift(4),t-=4;var a=e.read_shift(4);return t-=4,r.EncryptionHeader=ns(e,a),t-=a,r.EncryptionVerifier=as(e,t),r}(e,t)}(e,t-2,n):function(e,t,r,n){var a,s,i,o={key:zn(e),verificationBytes:zn(e)};r.password&&(o.verifier=ls(r.password)),n.valid=o.verificationBytes===o.verifier,n.valid&&(n.insitu=(a=r.password,s=0,i=ds(a),function(e){var t=function(e,t,r,n,a){var s,i;for(a||(a=t),n||(n=ds("")),s=0;s!=t.length;++s)i=t[s],i=255&((i^=n[r])>>5|i<<3),a[s]=i,++r;return[a,r,n]}(0,e,s,i);return s=t[1],t[0]}))}(e,r.biff,r,n),n}},49:{n:"Font",f:function(e,t,r){var n={dyHeight:e.read_shift(2),fl:e.read_shift(2)};switch(r&&r.biff||8){case 2:break;case 3:case 4:e.l+=2;break;default:e.l+=10}return n.name=Xn(e,0,r),n}},51:{n:"PrintSize",f:zn},60:{n:"Continue"},61:{n:"Window1",f:function(e){return{Pos:[e.read_shift(2),e.read_shift(2)],Dim:[e.read_shift(2),e.read_shift(2)],Flags:e.read_shift(2),CurTab:e.read_shift(2),FirstTab:e.read_shift(2),Selected:e.read_shift(2),TabRatio:e.read_shift(2)}}},64:{n:"Backup",f:Mn},65:{n:"Pane",f:function(){}},66:{n:"CodePage",f:zn},77:{n:"Pls"},80:{n:"DCon"},81:{n:"DConRef"},82:{n:"DConName"},85:{n:"DefColWidth",f:zn},89:{n:"XCT"},90:{n:"CRN"},91:{n:"FileSharing"},92:{n:"WriteAccess",f:function(e,t,r){if(r.enc)return e.l+=t,"";var n=e.l,a=Yn(e,0,r);return e.read_shift(t+n-e.l),a}},93:{n:"Obj",f:function(e,t,r){if(r&&r.biff<8)return function(e,t,r){e.l+=4;var n=e.read_shift(2),a=e.read_shift(2),s=e.read_shift(2);e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=6,t-=36;var i=[];return i.push((ya[n]||Ut)(e,t,r)),{cmo:[a,n,s],ft:i}}(e,t,r);var n=fa(e),a=function(e,t){for(var r=e.l+t,n=[];e.l7||t[1]>7)throw new Error("Bad Gutters: "+t.join("|"));return t}},129:{n:"WsBool",f:function(e,t,r){var n=r&&8==r.biff||2==t?e.read_shift(2):(e.l+=t,0);return{fDialog:16&n,fBelow:64&n,fRight:128&n}}},130:{n:"GridSet",f:zn},131:{n:"HCenter",f:Mn},132:{n:"VCenter",f:Mn},133:{n:"BoundSheet8",f:function(e,t,r){var n=e.read_shift(4),a=3&e.read_shift(1),s=e.read_shift(1);switch(s){case 0:s="Worksheet";break;case 1:s="Macrosheet";break;case 2:s="Chartsheet";break;case 6:s="VBAModule"}var i=Xn(e,0,r);return 0===i.length&&(i="Sheet1"),{pos:n,hs:a,dt:s,name:i}}},134:{n:"WriteProtect"},140:{n:"Country",f:function(e){var t,r=[0,0];return t=e.read_shift(2),r[0]=zr[t]||t,t=e.read_shift(2),r[1]=zr[t]||t,r}},141:{n:"HideObj",f:zn},144:{n:"Sort"},146:{n:"Palette",f:function(e){for(var t=e.read_shift(2),r=[];t-- >0;)r.push(ta(e));return r}},151:{n:"Sync"},152:{n:"LPr"},153:{n:"DxGCol"},154:{n:"FnGroupName"},155:{n:"FilterMode"},156:{n:"BuiltInFnGroupCount",f:zn},157:{n:"AutoFilterInfo"},158:{n:"AutoFilter"},160:{n:"Scl",f:Fa},161:{n:"Setup",f:function(e,t){var r={};return t<32||(e.l+=16,r.header=xr(e),r.footer=xr(e),e.l+=2),r}},174:{n:"ScenMan"},175:{n:"SCENARIO"},176:{n:"SxView"},177:{n:"Sxvd"},178:{n:"SXVI"},180:{n:"SxIvd"},181:{n:"SXLI"},182:{n:"SXPI"},184:{n:"DocRoute"},185:{n:"RecipName"},189:{n:"MulRk",f:function(e,t){for(var r=e.l+t-2,n=e.read_shift(2),a=e.read_shift(2),s=[];e.l>2&1,n.data=function(e,t,r,n){var a={},s=e.read_shift(4),i=e.read_shift(4),o=e.read_shift(4),l=e.read_shift(2);return a.patternType=Hr[o>>26],n.cellStyles?(a.alc=7&s,a.fWrap=s>>3&1,a.alcV=s>>4&7,a.fJustLast=s>>7&1,a.trot=s>>8&255,a.cIndent=s>>16&15,a.fShrinkToFit=s>>20&1,a.iReadOrder=s>>22&2,a.fAtrNum=s>>26&1,a.fAtrFnt=s>>27&1,a.fAtrAlc=s>>28&1,a.fAtrBdr=s>>29&1,a.fAtrPat=s>>30&1,a.fAtrProt=s>>31&1,a.dgLeft=15&i,a.dgRight=i>>4&15,a.dgTop=i>>8&15,a.dgBottom=i>>12&15,a.icvLeft=i>>16&127,a.icvRight=i>>23&127,a.grbitDiag=i>>30&3,a.icvTop=127&o,a.icvBottom=o>>7&127,a.icvDiag=o>>14&127,a.dgDiag=o>>21&15,a.icvFore=127&l,a.icvBack=l>>7&127,a.fsxButton=l>>14&1,a):a}(e,0,n.fStyle,r),n}},225:{n:"InterfaceHdr",f:function(e,t){return 0===t||e.read_shift(2),1200}},226:{n:"InterfaceEnd",f:Ln},227:{n:"SXVS"},229:{n:"MergeCells",f:function(e,t){for(var r=[],n=e.read_shift(2);n--;)r.push(ia(e));return r}},233:{n:"BkHim"},235:{n:"MsoDrawingGroup"},236:{n:"MsoDrawing"},237:{n:"MsoDrawingSelection"},239:{n:"PhoneticInfo"},240:{n:"SxRule"},241:{n:"SXEx"},242:{n:"SxFilt"},244:{n:"SxDXF"},245:{n:"SxItm"},246:{n:"SxName"},247:{n:"SxSelect"},248:{n:"SXPair"},249:{n:"SxFmla"},251:{n:"SxFormat"},252:{n:"SST",f:function(e,t){for(var r=e.l+t,n=e.read_shift(4),a=e.read_shift(4),s=[],i=0;i!=a&&e.l255)throw new Error("Unexpected SupBook type: "+s);for(var i=Kn(e,s),o=[];n>e.l;)o.push($n(e));return[s,a,i,o]}},431:{n:"Prot4Rev",f:Mn},432:{n:"CondFmt"},433:{n:"CF"},434:{n:"DVal"},437:{n:"DConBin"},438:{n:"TxO",f:function(e,t,r){var n=e.l,a="";try{e.l+=4;var s=(r.lastobj||{cmo:[0,0]}).cmo[1];-1==[0,5,7,11,12,14].indexOf(s)?e.l+=6:function(e){var t=e.read_shift(1);e.l++;var r=e.read_shift(2);e.l+=2}(e);var i=e.read_shift(2);e.read_shift(2),zn(e);var o=e.read_shift(2);e.l+=o;for(var l=1;l=(c?i:2*i))break}if(a.length!==i&&a.length!==2*i)throw new Error("cchText: "+i+" != "+a.length);return e.l=n+t,{t:a}}catch(r){return e.l=n+t,{t:a}}}},439:{n:"RefreshAll",f:Mn},440:{n:"HLink",f:function(e,t){var r=ia(e);e.l+=16;var n=function(e,t){var r=e.l+t,n=e.read_shift(4);if(2!==n)throw new Error("Unrecognized streamVersion: "+n);var a=e.read_shift(2);e.l+=2;var s,i,o,l,c,f,h="";16&a&&(s=Qn(e,e.l)),128&a&&(i=Qn(e,e.l)),257&~a||(o=Qn(e,e.l)),1==(257&a)&&(l=function(e){var t=e.read_shift(16);switch(t){case"e0c9ea79f9bace118c8200aa004ba90b":return function(e){var t=e.read_shift(4),r=e.l,n=!1;t>24&&(e.l+=t-24,"795881f43b1d7f48af2c825dc4852763"===e.read_shift(16)&&(n=!0),e.l=r);var a=e.read_shift((n?t-24:t)>>1,"utf16le").replace(k,"");return n&&(e.l+=24),a}(e);case"0303000000000000c000000000000046":return function(e){for(var t=e.read_shift(2),r="";t-- >0;)r+="../";var n=e.read_shift(0,"lpstr-ansi");if(e.l+=2,57005!=e.read_shift(2))throw new Error("Bad FileMoniker");if(0===e.read_shift(4))return r+n.replace(/\\/g,"/");var a=e.read_shift(4);if(3!=e.read_shift(2))throw new Error("Bad FileMoniker");return r+e.read_shift(a>>1,"utf16le").replace(k,"")}(e);default:throw new Error("Unsupported Moniker "+t)}}(e,e.l)),8&a&&(h=Qn(e,e.l)),32&a&&(c=e.read_shift(16)),64&a&&(f=En(e)),e.l=r;var u=i||o||l||"";u&&h&&(u+="#"+h),u||(u="#"+h),2&a&&"/"==u.charAt(0)&&"/"!=u.charAt(1)&&(u="file://"+u);var d={Target:u};return c&&(d.guid=c),f&&(d.time=f),s&&(d.Tooltip=s),d}(e,t-24);return[r,n]}},441:{n:"Lel"},442:{n:"CodeName",f:$n},443:{n:"SXFDBType"},444:{n:"Prot4RevPass",f:zn},445:{n:"ObNoMacros"},446:{n:"Dv"},448:{n:"Excel9File",f:Ln},449:{n:"RecalcId",f:function(e){return e.read_shift(2),e.read_shift(4)},r:2},450:{n:"EntExU2",f:Ln},512:{n:"Dimensions",f:wa},513:{n:"Blank",f:Oa},515:{n:"Number",f:function(e,t,r){r.biffguess&&2==r.biff&&(r.biff=5);var n=ra(e),a=xr(e);return n.val=a,n}},516:{n:"Label",f:function(e,t,r){r.biffguess&&2==r.biff&&(r.biff=5),e.l;var n=ra(e);2==r.biff&&e.l++;var a=$n(e,e.l,r);return n.val=a,n}},517:{n:"BoolErr",f:Ea},519:{n:"String",f:Da},520:{n:"Row",f:function(e){var t={};t.r=e.read_shift(2),t.c=e.read_shift(2),t.cnt=e.read_shift(2)-t.c;var r=e.read_shift(2);e.l+=4;var n=e.read_shift(1);return e.l+=3,7&n&&(t.level=7&n),32&n&&(t.hidden=!0),64&n&&(t.hpt=r/20),t}},523:{n:"Index"},545:{n:"Array",f:ka},549:{n:"DefaultRowHeight",f:ma},566:{n:"Table"},574:{n:"Window2",f:function(e,t,r){return r&&r.biff>=2&&r.biff<5?{}:{RTL:64&e.read_shift(2)}}},638:{n:"RK",f:function(e){var t=e.read_shift(2),r=e.read_shift(2),n=sa(e);return{r:t,c:r,ixfe:n[0],rknum:n[1]}}},659:{n:"Style"},1048:{n:"BigName"},1054:{n:"Format",f:function(e,t,r){return[e.read_shift(2),Yn(e,0,r)]}},1084:{n:"ContinueBigName"},1212:{n:"ShrFmla",f:function(e,t,r){var n=la(e);e.l++;var a=e.read_shift(1);return[qi(e,t-=8,r),a,n]}},2048:{n:"HLinkTooltip",f:function(e,t){e.read_shift(2);var r=ia(e),n=e.read_shift((t-10)/2,"dbcs-cont");return[r,n=n.replace(k,"")]}},2049:{n:"WebPub"},2050:{n:"QsiSXTag"},2051:{n:"DBQueryExt"},2052:{n:"ExtString"},2053:{n:"TxtQry"},2054:{n:"Qsir"},2055:{n:"Qsif"},2056:{n:"RRDTQSIF"},2057:{n:"BOF",f:da},2058:{n:"OleDbConn"},2059:{n:"WOpt"},2060:{n:"SXViewEx"},2061:{n:"SXTH"},2062:{n:"SXPIEx"},2063:{n:"SXVDTEx"},2064:{n:"SXViewEx9"},2066:{n:"ContinueFrt"},2067:{n:"RealTimeData"},2128:{n:"ChartFrtInfo"},2129:{n:"FrtWrapper"},2130:{n:"StartBlock"},2131:{n:"EndBlock"},2132:{n:"StartObject"},2133:{n:"EndObject"},2134:{n:"CatLab"},2135:{n:"YMult"},2136:{n:"SXViewLink"},2137:{n:"PivotChartBits"},2138:{n:"FrtFontList"},2146:{n:"SheetExt"},2147:{n:"BookExt",r:12},2148:{n:"SXAddl"},2149:{n:"CrErr"},2150:{n:"HFPicture"},2151:{n:"FeatHdr",f:Ln},2152:{n:"Feat"},2154:{n:"DataLabExt"},2155:{n:"DataLabExtContents"},2156:{n:"CellWatch"},2161:{n:"FeatHdr11"},2162:{n:"Feature11"},2164:{n:"DropDownObjIds"},2165:{n:"ContinueFrt11"},2166:{n:"DConn"},2167:{n:"List12"},2168:{n:"Feature12"},2169:{n:"CondFmt12"},2170:{n:"CF12"},2171:{n:"CFEx"},2172:{n:"XFCRC",f:function(e){e.l+=2;var t={cxfs:0,crc:0};return t.cxfs=e.read_shift(2),t.crc=e.read_shift(4),t},r:12},2173:{n:"XFExt",f:function(e,t){e.l,e.l+=2;var r=e.read_shift(2);e.l+=2;for(var n=e.read_shift(2),a=[];n-- >0;)a.push(ri(e,e.l));return{ixfe:r,ext:a}},r:12},2174:{n:"AutoFilter12"},2175:{n:"ContinueFrt12"},2180:{n:"MDTInfo"},2181:{n:"MDXStr"},2182:{n:"MDXTuple"},2183:{n:"MDXSet"},2184:{n:"MDXProp"},2185:{n:"MDXKPI"},2186:{n:"MDB"},2187:{n:"PLV"},2188:{n:"Compat12",f:Mn,r:12},2189:{n:"DXF"},2190:{n:"TableStyles",r:12},2191:{n:"TableStyle"},2192:{n:"TableStyleElement"},2194:{n:"StyleExt"},2195:{n:"NamePublish"},2196:{n:"NameCmt",f:function(e,t,r){if(!(r.biff<8)){var n=e.read_shift(2),a=e.read_shift(2);return[Kn(e,n,r),Kn(e,a,r)]}e.l+=t},r:12},2197:{n:"SortData"},2198:{n:"Theme",f:function(e,t,r){var n=e.l+t;if(124226!==e.read_shift(4))if(r.cellStyles){var a,s=e.slice(e.l);e.l=n;try{a=pe(s,{type:"array"})}catch(e){return}var i=he(a,"theme/theme/theme1.xml",!0);if(i)return ei(i,r)}else e.l=n},r:12},2199:{n:"GUIDTypeLib"},2200:{n:"FnGrp12"},2201:{n:"NameFnGrp12"},2202:{n:"MTRSettings",f:function(e){return[0!==e.read_shift(4),0!==e.read_shift(4),e.read_shift(4)]},r:12},2203:{n:"CompressPictures",f:Ln},2204:{n:"HeaderFooter"},2205:{n:"CrtLayout12"},2206:{n:"CrtMlFrt"},2207:{n:"CrtMlFrtContinue"},2211:{n:"ForceFullCalculation",f:function(e){var t=function(e){var t=e.read_shift(2),r=e.read_shift(2);return e.l+=8,{type:t,flags:r}}(e);if(2211!=t.type)throw new Error("Invalid Future Record "+t.type);return 0!==e.read_shift(4)}},2212:{n:"ShapePropsStream"},2213:{n:"TextPropsStream"},2214:{n:"RichTextStream"},2215:{n:"CrtLayout12A"},4097:{n:"Units"},4098:{n:"Chart"},4099:{n:"Series"},4102:{n:"DataFormat"},4103:{n:"LineFormat"},4105:{n:"MarkerFormat"},4106:{n:"AreaFormat"},4107:{n:"PieFormat"},4108:{n:"AttachedLabel"},4109:{n:"SeriesText"},4116:{n:"ChartFormat"},4117:{n:"Legend"},4118:{n:"SeriesList"},4119:{n:"Bar"},4120:{n:"Line"},4121:{n:"Pie"},4122:{n:"Area"},4123:{n:"Scatter"},4124:{n:"CrtLine"},4125:{n:"Axis"},4126:{n:"Tick"},4127:{n:"ValueRange"},4128:{n:"CatSerRange"},4129:{n:"AxisLine"},4130:{n:"CrtLink"},4132:{n:"DefaultText"},4133:{n:"Text"},4134:{n:"FontX",f:zn},4135:{n:"ObjectLink"},4146:{n:"Frame"},4147:{n:"Begin"},4148:{n:"End"},4149:{n:"PlotArea"},4154:{n:"Chart3d"},4156:{n:"PicF"},4157:{n:"DropBar"},4158:{n:"Radar"},4159:{n:"Surf"},4160:{n:"RadarArea"},4161:{n:"AxisParent"},4163:{n:"LegendException"},4164:{n:"ShtProps",f:function(e,t,r){var n={area:!1};if(5!=r.biff)return e.l+=t,n;var a=e.read_shift(1);return e.l+=3,16&a&&(n.area=!0),n}},4165:{n:"SerToCrt"},4166:{n:"AxesUsed"},4168:{n:"SBaseRef"},4170:{n:"SerParent"},4171:{n:"SerAuxTrend"},4174:{n:"IFmtRecord"},4175:{n:"Pos"},4176:{n:"AlRuns"},4177:{n:"BRAI"},4187:{n:"SerAuxErrBar"},4188:{n:"ClrtClient",f:function(e){for(var t=e.read_shift(2),r=[];t-- >0;)r.push(ta(e));return r}},4189:{n:"SerFmt"},4191:{n:"Chart3DBarShape"},4192:{n:"Fbi"},4193:{n:"BopPop"},4194:{n:"AxcExt"},4195:{n:"Dat"},4196:{n:"PlotGrowth"},4197:{n:"SIIndex"},4198:{n:"GelFrame"},4199:{n:"BopPopCustom"},4200:{n:"Fbi2"},0:{n:"Dimensions",f:wa},1:{n:"BIFF2BLANK"},2:{n:"BIFF2INT",f:function(e){var t=ra(e);++e.l;var r=e.read_shift(2);return t.t="n",t.val=r,t}},3:{n:"BIFF2NUM",f:function(e){var t=ra(e);++e.l;var r=xr(e);return t.t="n",t.val=r,t}},4:{n:"BIFF2STR",f:function(e,t,r){r.biffguess&&5==r.biff&&(r.biff=2);var n=ra(e);++e.l;var a=Yn(e,0,r);return n.t="str",n.val=a,n}},5:{n:"BoolErr",f:Ea},7:{n:"String",f:function(e){var t=e.read_shift(1);return 0===t?(e.l++,""):e.read_shift(t,"sbcs-cont")}},8:{n:"BIFF2ROW"},9:{n:"BOF",f:da},11:{n:"Index"},22:{n:"ExternCount",f:zn},30:{n:"BIFF2FORMAT",f:ba},31:{n:"BIFF2FMTCNT"},32:{n:"BIFF2COLINFO"},33:{n:"Array",f:ka},36:{n:"COLWIDTH"},37:{n:"DefaultRowHeight",f:ma},50:{n:"BIFF2FONTXTRA",f:function(e,t){e.l+=6,e.l+=2,e.l+=1,e.l+=3,e.l+=1,e.l+=t-13}},62:{n:"BIFF2WINDOW2"},52:{n:"DDEObjName"},67:{n:"BIFF2XF"},68:{n:"BIFF2XFINDEX",f:zn},69:{n:"BIFF2FONTCLR"},86:{n:"BIFF4FMTCNT"},126:{n:"RK"},127:{n:"ImData",f:function(e){var t=e.read_shift(2),r=e.read_shift(2),n=e.read_shift(4),a={fmt:t,env:r,len:n,data:e.slice(e.l,e.l+n)};return e.l+=n,a}},135:{n:"Addin"},136:{n:"Edg"},137:{n:"Pub"},145:{n:"Sub"},148:{n:"LHRecord"},149:{n:"LHNGraph"},150:{n:"Sound"},169:{n:"CoordList"},171:{n:"GCW"},188:{n:"ShrFmla"},191:{n:"ToolbarHdr"},192:{n:"ToolbarEnd"},194:{n:"AddMenu"},195:{n:"DelMenu"},214:{n:"RString",f:function(e,t,r){var n=e.l+t,a=ra(e),s=e.read_shift(2),i=Kn(e,s,r);return e.l=n,a.t="str",a.val=i,a}},223:{n:"UDDesc"},234:{n:"TabIdConf"},354:{n:"XL5Modify"},421:{n:"FileSharing2"},518:{n:"Formula",f:eo},521:{n:"BOF",f:da},536:{n:"Lbl",f:Ba},547:{n:"ExternName",f:_a},561:{n:"Font"},579:{n:"BIFF3XF"},1030:{n:"Formula",f:eo},1033:{n:"BOF",f:da},1091:{n:"BIFF4XF"},2157:{n:"FeatInfo"},2163:{n:"FeatInfo11"},2177:{n:"SXAddl12"},2240:{n:"AutoWebPub"},2241:{n:"ListObj"},2242:{n:"ListField"},2243:{n:"ListDV"},2244:{n:"ListCondFmt"},2245:{n:"ListCF"},2246:{n:"FMQry"},2247:{n:"FMSQry"},2248:{n:"PLV"},2249:{n:"LnExt"},2250:{n:"MkrExt"},2251:{n:"CrtCoopt"},2262:{n:"FRTArchId$",r:12},29282:{}},Zl=z(Yl,"n");function Ql(e,t,r,n){var a="number"==typeof t?t:+t||+Zl[t];if(!isNaN(a)){var s=n||(r||[]).length||0,i=e.next(4);i.write_shift(2,a),i.write_shift(2,s),s>0&&Bt(r)&&e.push(r)}}function Jl(e,t,r){return e||(e=zt(7)),e.write_shift(2,t),e.write_shift(2,r),e.write_shift(2,0),e.write_shift(1,0),e}function ql(e,t,r,n){if(null!=t.v)switch(t.t){case"d":case"n":var a="d"==t.t?X(q(t.v)):t.v;return void(a==(0|a)&&a>=0&&a<65536?Ql(e,2,(s=r,i=n,o=a,l=zt(9),Jl(l,s,i),l.write_shift(2,o),l)):Ql(e,3,function(e,t,r){var n=zt(15);return Jl(n,e,t),n.write_shift(8,r,"f"),n}(r,n,a)));case"b":case"e":return void Ql(e,5,function(e,t,r,n){var a=zt(9);return Jl(a,e,t),Vn(r,n||"b",a),a}(r,n,t.v,t.t));case"s":case"str":return void Ql(e,4,function(e,t,r){var n=zt(8+2*r.length);return Jl(n,e,t),n.write_shift(1,r.length),n.write_shift(r.length,r,"sbcs"),n.l255||d.e.r>=p){if(t.WTF)throw new Error("Range "+(i["!ref"]||"A1")+" exceeds format limit A1:IV16384");d.e.c=Math.min(d.e.c,255),d.e.r=Math.min(d.e.c,p-1)}Ql(a,2057,pa(0,16,t)),Ql(a,"CalcMode",Hn(1)),Ql(a,"CalcCount",Hn(100)),Ql(a,"CalcRefMode",Un(!0)),Ql(a,"CalcIter",Un(!1)),Ql(a,"CalcDelta",Ir(.001)),Ql(a,"CalcSaveRecalc",Un(!0)),Ql(a,"PrintRowCol",Un(!1)),Ql(a,"PrintGrid",Un(!1)),Ql(a,"GridSet",Hn(1)),Ql(a,"Guts",function(e){var t=zt(8);return t.write_shift(4,0),t.write_shift(2,e[0]?e[0]+1:0),t.write_shift(2,e[1]?e[1]+1:0),t}([0,0])),Ql(a,"HCenter",Un(!1)),Ql(a,"VCenter",Un(!1)),f&&function(e,t){if(t){var r=0;t.forEach(function(t,n){++r<=256&&t&&Ql(e,"ColInfo",function(e,t){var r=zt(12);r.write_shift(2,t),r.write_shift(2,t),r.write_shift(2,256*e.width),r.write_shift(2,0);var n=0;return e.hidden&&(n|=1),r.write_shift(1,n),n=e.level||0,r.write_shift(1,n),r.write_shift(2,0),r}(wo(n,t),n))})}}(a,i["!cols"]),Ql(a,512,function(e,t){var r=8!=t.biff&&t.biff?2:4,n=zt(2*r+6);return n.write_shift(r,e.s.r),n.write_shift(r,e.e.r+1),n.write_shift(2,e.s.c),n.write_shift(2,e.e.c+1),n.write_shift(2,0),n}(d,t)),f&&(i["!links"]=[]);for(var g=d.s.r;g<=d.e.r;++g){h=Yt(g);for(var m=d.s.c;m<=d.e.c;++m){g===d.s.r&&(u[m]=Qt(m)),n=u[m]+h;var v=c?(i[g]||[])[m]:i[n];v&&(ec(a,v,g,m,t),f&&v.l&&i["!links"].push([n,v.l]))}}var b=l.CodeName||l.name||s;return f&&Ql(a,"Window2",function(e){var t=zt(18),r=1718;return e&&e.RTL&&(r|=64),t.write_shift(2,r),t.write_shift(4,0),t.write_shift(4,64),t.write_shift(4,0),t.write_shift(4,0),t}((o.Views||[])[0])),f&&(i["!merges"]||[]).length&&Ql(a,"MergeCells",function(e){var t=zt(2+8*e.length);t.write_shift(2,e.length);for(var r=0;r255&&console.error("Worksheet '"+e.SheetNames[r]+"' extends beyond column IV (255). Data may be lost.")}var a=t||{};switch(a.biff||2){case 8:case 5:return function(e,t){var r=t||{},n=[];e&&!e.SSF&&(e.SSF=x.get_table()),e&&e.SSF&&(I(x),x.load_table(e.SSF),r.revssf=W(e.SSF),r.revssf[e.SSF[65535]]=0,r.ssf=e.SSF),r.Strings=[],r.Strings.Count=0,r.Strings.Unique=0,xc(r),r.cellXfs=[],Eo(r.cellXfs,{},{revssf:{General:0}}),e.Props||(e.Props={});for(var a=0;a255||i.e.r>16383){if(n.WTF)throw new Error("Range "+(t["!ref"]||"A1")+" exceeds format limit A1:IV16384");i.e.c=Math.min(i.e.c,255),i.e.r=Math.min(i.e.c,16383),a=tr(i)}for(var c=i.s.r;c<=i.e.r;++c){o=Yt(c);for(var f=i.s.c;f<=i.e.c;++f){c===i.s.r&&(l[f]=Qt(f)),a=l[f]+o;var h=s?(t[c]||[])[f]:t[a];h&&ql(e,h,c,f)}}}(n,e.Sheets[e.SheetNames[a]],0,r),Ql(n,10),n.end()}(e,t)}throw new Error("invalid type "+a.bookType+" for BIFF")}var ac=function(){function e(e,t){var r=t||{},n=r.dense?[]:{},a=(e=e.replace(//g,"")).match(/");var s=e.match(/<\/table/i),i=a.index,o=s&&s.index||e.length,l=function(e,t){if(ie||"string"==typeof t)return e.split(t);for(var r=e.split(t),n=[r[0]],a=1;a"),n.push(r[a]);return n}(e.slice(i,o),/(:?]*>)/i),c=-1,f=0,h=0,u=0,d={s:{r:1e7,c:1e7},e:{r:0,c:0}},p=[];for(i=0;i/i);for(o=0;o"))>-1;)w=w.slice(C+1);for(var E=0;E")));u=_.colspan?+_.colspan:1,((h=+_.rowspan)>1||u>1)&&p.push({s:{r:c,c:f},e:{r:c+(h||1)-1,c:f+u-1}});var A=_.t||_["data-t"]||"";if(w.length){if(w=Ge(w),d.s.r>c&&(d.s.r=c),d.e.rf&&(d.s.c=f),d.e.cr||a[c].s.c>i||a[c].e.r1&&(d.rowspan=o),l>1&&(d.colspan=l),n.editable?u=''+u+"":h&&(d["data-t"]=h&&h.t||"z",null!=h.v&&(d["data-v"]=h.v),null!=h.z&&(d["data-z"]=h.z),h.l&&"#"!=(h.l.Target||"#").charAt(0)&&(u=''+u+"")),d.id=(n.id||"sjs")+"-"+f,s.push(qe("td",u,d))}}return""+s.join("")+""}function r(e,t,r){return[].join("")+""}var n='SheetJS Table Export',a="";return{to_workbook:function(t,r){var n=t.match(/[\s\S]*?<\/table>/gi);if(!n||0==n.length)throw new Error("Invalid HTML: could not find
");if(1==n.length)return ar(e(n[0],r),r);var a=ef.book_new();return n.forEach(function(t,n){ef.book_append_sheet(a,e(t,r),"Sheet"+(n+1))}),a},to_sheet:e,_row:t,BEGIN:n,END:a,_preamble:r,from_sheet:function(e,s){var i=s||{},o=null!=i.header?i.header:n,l=null!=i.footer?i.footer:a,c=[o],f=er(e["!ref"]);i.dense=Array.isArray(e),c.push(r(0,0,i));for(var h=f.s.r;h<=f.e.r;++h)c.push(t(e,f,h,i));return c.push("
"+l),c.join("")}}}();function sc(e,t,r){var n=r||{},a=0,s=0;if(null!=n.origin)if("number"==typeof n.origin)a=n.origin;else{var i="string"==typeof n.origin?Jt(n.origin):n.origin;a=i.r,s=i.c}var o=t.getElementsByTagName("tr"),l=Math.min(n.sheetRows||1e7,o.length),c={s:{r:0,c:0},e:{r:a,c:s}};if(e["!ref"]){var f=er(e["!ref"]);c.s.r=Math.min(c.s.r,f.s.r),c.s.c=Math.min(c.s.c,f.s.c),c.e.r=Math.max(c.e.r,f.e.r),c.e.c=Math.max(c.e.c,f.e.c),-1==a&&(c.e.r=a=f.e.r+1)}var h=[],u=0,d=e["!rows"]||(e["!rows"]=[]),p=0,g=0,m=0,v=0,b=0,w=0;for(e["!cols"]||(e["!cols"]=[]);p1||w>1)&&h.push({s:{r:g+a,c:v+s},e:{r:g+a+(b||1)-1,c:v+s+(w||1)-1}});var T={t:"s",v:_},k=S.getAttribute("data-t")||S.getAttribute("t")||"";null!=_&&(0==_.length?T.t=k||"z":n.raw||0==_.trim().length||"s"==k||("TRUE"===_?T={t:"b",v:!0}:"FALSE"===_?T={t:"b",v:!1}:isNaN(ne(_))?isNaN(ae(_).getDate())||(T={t:"d",v:q(_)},n.cellDates||(T={t:"n",v:X(T.v)}),T.z=n.dateNF||x._table[14]):T={t:"n",v:ne(_)})),void 0===T.z&&null!=A&&(T.z=A);var y="",I=S.getElementsByTagName("A");if(I&&I.length)for(var R=0;R=l&&(e["!fullref"]=tr((c.e.r=o.length-p+g-1+a,c))),e}function ic(e,t){return sc((t||{}).dense?[]:{},e,t)}function oc(e){var t="",r=function(e){return e.ownerDocument.defaultView&&"function"==typeof e.ownerDocument.defaultView.getComputedStyle?e.ownerDocument.defaultView.getComputedStyle:"function"==typeof getComputedStyle?getComputedStyle:null}(e);return r&&(t=r(e).getPropertyValue("display")),t||(t=e.style.display),"none"===t}var lc,cc,fc=(lc=function(e){var t=e.replace(/[\t\r\n]/g," ").trim().replace(/ +/g," ").replace(//g," ").replace(//g,function(e,t){return Array(parseInt(t,10)+1).join(" ")}).replace(/]*\/>/g,"\t").replace(//g,"\n");return[ke(t.replace(/<[^>]*>/g,""))]},cc={day:["d","dd"],month:["m","mm"],year:["y","yy"],hours:["h","hh"],minutes:["m","mm"],seconds:["s","ss"],"am-pm":["A/P","AM/PM"],"day-of-week":["ddd","dddd"],era:["e","ee"],quarter:["\\Qm",'m\\"th quarter"']},function(e,t){var r,n,a,s,i,o,l=t||{},c=Ol(e),f=[],h={name:""},u="",d=0,p={},g=[],m=l.dense?[]:{},v={value:""},b="",w=0,C=[],E=-1,S=-1,_={s:{r:1e6,c:1e7},e:{r:0,c:0}},A=0,B={},T=[],k={},y=[],x=1,I=1,R=[],O={Names:[]},F={},D=["",""],N=[],P={},L="",M=0,U=!1,z=!1,H=0;for(Fl.lastIndex=0,c=c.replace(//gm,"").replace(//gm,"");i=Fl.exec(c);)switch(i[3]=i[3].replace(/_.*$/,"")){case"table":case"工作表":"/"===i[1]?(_.e.c>=_.s.c&&_.e.r>=_.s.r?m["!ref"]=tr(_):m["!ref"]="A1:A1",l.sheetRows>0&&l.sheetRows<=_.e.r&&(m["!fullref"]=m["!ref"],_.e.r=l.sheetRows-1,m["!ref"]=tr(_)),T.length&&(m["!merges"]=T),y.length&&(m["!rows"]=y),a.name=a["名称"]||a.name,"undefined"!=typeof JSON&&JSON.stringify(a),g.push(a.name),p[a.name]=m,z=!1):"/"!==i[0].charAt(i[0].length-2)&&(a=Ee(i[0],!1),E=S=-1,_.s.r=_.s.c=1e7,_.e.r=_.e.c=0,m=l.dense?[]:{},T=[],y=[],z=!0);break;case"table-row-group":"/"===i[1]?--A:++A;break;case"table-row":case"行":if("/"===i[1]){E+=x,x=1;break}if((s=Ee(i[0],!1))["行号"]?E=s["行号"]-1:-1==E&&(E=0),(x=+s["number-rows-repeated"]||1)<10)for(H=0;H0&&(y[E+H]={level:A});S=-1;break;case"covered-table-cell":"/"!==i[1]&&++S,l.sheetStubs&&(l.dense?(m[E]||(m[E]=[]),m[E][S]={t:"z"}):m[qt({r:E,c:S})]={t:"z"}),b="",C=[];break;case"table-cell":case"数据":if("/"===i[0].charAt(i[0].length-2))++S,v=Ee(i[0],!1),I=parseInt(v["number-columns-repeated"]||"1",10),o={t:"z",v:null},v.formula&&0!=l.cellFormula&&(o.f=fo(ke(v.formula))),"string"==(v["数据类型"]||v["value-type"])&&(o.t="s",o.v=ke(v["string-value"]||""),l.dense?(m[E]||(m[E]=[]),m[E][S]=o):m[qt({r:E,c:S})]=o),S+=I-1;else if("/"!==i[1]){b="",w=0,C=[],I=1;var W=x?E+x-1:E;if(++S>_.e.c&&(_.e.c=S),S<_.s.c&&(_.s.c=S),E<_.s.r&&(_.s.r=E),W>_.e.r&&(_.e.r=W),N=[],P={},o={t:(v=Ee(i[0],!1))["数据类型"]||v["value-type"],v:null},l.cellFormula)if(v.formula&&(v.formula=ke(v.formula)),v["number-matrix-columns-spanned"]&&v["number-matrix-rows-spanned"]&&(k={s:{r:E,c:S},e:{r:E+(parseInt(v["number-matrix-rows-spanned"],10)||0)-1,c:S+(parseInt(v["number-matrix-columns-spanned"],10)||0)-1}},o.F=tr(k),R.push([k,o.F])),v.formula)o.f=fo(v.formula);else for(H=0;H=R[H][0].s.r&&E<=R[H][0].e.r&&S>=R[H][0].s.c&&S<=R[H][0].e.c&&(o.F=R[H][1]);switch((v["number-columns-spanned"]||v["number-rows-spanned"])&&(k={s:{r:E,c:S},e:{r:E+(parseInt(v["number-rows-spanned"],10)||0)-1,c:S+(parseInt(v["number-columns-spanned"],10)||0)-1}},T.push(k)),v["number-columns-repeated"]&&(I=parseInt(v["number-columns-repeated"],10)),o.t){case"boolean":o.t="b",o.v=Ne(v["boolean-value"]);break;case"float":case"percentage":case"currency":o.t="n",o.v=parseFloat(v.value);break;case"date":o.t="d",o.v=q(v["date-value"]),l.cellDates||(o.t="n",o.v=X(o.v)),o.z="m/d/yy";break;case"time":o.t="n",o.v=Z(v["time-value"])/86400,l.cellDates&&(o.t="d",o.v=Y(o.v)),o.z="HH:MM:SS";break;case"number":o.t="n",o.v=parseFloat(v["数据数值"]);break;default:if("string"!==o.t&&"text"!==o.t&&o.t)throw new Error("Unsupported value type "+o.t);o.t="s",null!=v["string-value"]&&(b=ke(v["string-value"]),C=[])}}else{if(U=!1,"s"===o.t&&(o.v=b||"",C.length&&(o.R=C),U=0==w),F.Target&&(o.l=F),N.length>0&&(o.c=N,N=[]),b&&!1!==l.cellText&&(o.w=b),U&&(o.t="z",delete o.v),(!U||l.sheetStubs)&&!(l.sheetRows&&l.sheetRows<=E))for(var V=0;V0;)m[E+V][S+I]=te(o);else for(m[qt({r:E+V,c:S})]=o;--I>0;)m[qt({r:E+V,c:S+I})]=te(o);_.e.c<=S&&(_.e.c=S)}S+=(I=parseInt(v["number-columns-repeated"]||"1",10))-1,I=0,o={},b="",C=[]}F={};break;case"document":case"document-content":case"电子表格文档":case"spreadsheet":case"主体":case"scripts":case"styles":case"font-face-decls":case"master-styles":if("/"===i[1]){if((r=f.pop())[0]!==i[3])throw"Bad state: "+r}else"/"!==i[0].charAt(i[0].length-2)&&f.push([i[3],!0]);break;case"annotation":if("/"===i[1]){if((r=f.pop())[0]!==i[3])throw"Bad state: "+r;P.t=b,C.length&&(P.R=C),P.a=L,N.push(P)}else"/"!==i[0].charAt(i[0].length-2)&&f.push([i[3],!1]);L="",M=0,b="",w=0,C=[];break;case"creator":"/"===i[1]?L=c.slice(M,i.index):M=i.index+i[0].length;break;case"meta":case"元数据":case"settings":case"config-item-set":case"config-item-map-indexed":case"config-item-map-entry":case"config-item-map-named":case"shapes":case"frame":case"text-box":case"image":case"data-pilot-tables":case"list-style":case"form":case"dde-links":case"event-listeners":case"chart":if("/"===i[1]){if((r=f.pop())[0]!==i[3])throw"Bad state: "+r}else"/"!==i[0].charAt(i[0].length-2)&&f.push([i[3],!1]);b="",w=0,C=[];break;case"scientific-number":case"currency-symbol":case"currency-style":case"script":case"libraries":case"automatic-styles":case"default-style":case"page-layout":case"style":case"map":case"font-face":case"paragraph-properties":case"table-properties":case"table-column-properties":case"table-row-properties":case"table-cell-properties":case"fraction":case"boolean-style":case"boolean":case"text-style":case"text-content":case"text-properties":case"embedded-text":case"body":case"电子表格":case"forms":case"table-column":case"table-header-rows":case"table-rows":case"table-column-group":case"table-header-columns":case"table-columns":case"null-date":case"graphic-properties":case"calculation-settings":case"named-expressions":case"label-range":case"label-ranges":case"named-expression":case"sort":case"sort-by":case"sort-groups":case"tab":case"line-break":case"span":case"s":case"date":case"object":case"title":case"标题":case"desc":case"binary-data":case"table-source":case"scenario":case"iteration":case"content-validations":case"content-validation":case"help-message":case"error-message":case"database-ranges":case"filter":case"filter-and":case"filter-or":case"filter-condition":case"list-level-style-bullet":case"list-level-style-number":case"list-level-properties":case"sender-firstname":case"sender-lastname":case"sender-initials":case"sender-title":case"sender-position":case"sender-email":case"sender-phone-private":case"sender-fax":case"sender-company":case"sender-phone-work":case"sender-street":case"sender-city":case"sender-postal-code":case"sender-country":case"sender-state-or-province":case"author-name":case"author-initials":case"chapter":case"file-name":case"template-name":case"sheet-name":case"event-listener":case"initial-creator":case"creation-date":case"print-date":case"generator":case"document-statistic":case"user-defined":case"editing-duration":case"editing-cycles":case"config-item":case"page-number":case"page-count":case"time":case"cell-range-source":case"detective":case"operation":case"highlighted-range":case"data-pilot-table":case"source-cell-range":case"source-service":case"data-pilot-field":case"data-pilot-level":case"data-pilot-subtotals":case"data-pilot-subtotal":case"data-pilot-members":case"data-pilot-member":case"data-pilot-display-info":case"data-pilot-sort-info":case"data-pilot-layout-info":case"data-pilot-field-reference":case"data-pilot-groups":case"data-pilot-group":case"data-pilot-group-member":case"rect":case"dde-connection-decls":case"dde-connection-decl":case"dde-link":case"dde-source":case"properties":case"property":case"table-protection":case"data-pilot-grand-total":case"office-document-common-attrs":break;case"number-style":case"percentage-style":case"date-style":case"time-style":if("/"===i[1]){if(B[h.name]=u,(r=f.pop())[0]!==i[3])throw"Bad state: "+r}else"/"!==i[0].charAt(i[0].length-2)&&(u="",h=Ee(i[0],!1),f.push([i[3],!0]));break;case"number":case"day":case"month":case"year":case"era":case"day-of-week":case"week-of-year":case"quarter":case"hours":case"minutes":case"seconds":case"am-pm":switch(f[f.length-1][0]){case"time-style":case"date-style":n=Ee(i[0],!1),u+=cc[i[3]]["long"===n.style?1:0]}break;case"text":if("/>"===i[0].slice(-2))break;if("/"===i[1])switch(f[f.length-1][0]){case"number-style":case"date-style":case"time-style":u+=c.slice(d,i.index)}else d=i.index+i[0].length;break;case"named-range":D=uo((n=Ee(i[0],!1))["cell-range-address"]);var G={Name:n.name,Ref:D[0]+"!"+D[1]};z&&(G.Sheet=g.length),O.Names.push(G);break;case"p":case"文本串":if(["master-styles"].indexOf(f[f.length-1][0])>-1)break;if("/"!==i[1]||v&&v["string-value"])Ee(i[0],!1),w=i.index+i[0].length;else{var j=lc(c.slice(w,i.index));b=(b.length>0?b+"\n":"")+j[0]}break;case"database-range":if("/"===i[1])break;try{p[(D=uo(Ee(i[0])["target-range-address"]))[0]]["!autofilter"]={ref:D[1]}}catch(e){}break;case"a":if("/"!==i[1]){if(!(F=Ee(i[0],!1)).href)break;F.Target=ke(F.href),delete F.href,"#"==F.Target.charAt(0)&&F.Target.indexOf(".")>-1?(D=uo(F.Target.slice(1)),F.Target="#"+D[0]+"!"+D[1]):F.Target.match(/^\.\.[\\\/]/)&&(F.Target=F.Target.slice(3))}break;default:switch(i[2]){case"dc:":case"calcext:":case"loext:":case"ooo:":case"chartooo:":case"draw:":case"style:":case"chart:":case"form:":case"uof:":case"表:":case"字:":break;default:if(l.WTF)throw new Error(i)}}var K={Sheets:p,SheetNames:g,Workbook:O};return l.bookSheets&&delete K.Sheets,K});function hc(e,t){t=t||{},le(e,"META-INF/manifest.xml")&&function(e,t){for(var r,n,a=Ol(e);r=Fl.exec(a);)switch(r[3]){case"manifest":break;case"file-entry":if("/"==(n=Ee(r[0],!1)).path&&"application/vnd.oasis.opendocument.spreadsheet"!==n.type)throw new Error("This OpenDocument is not a spreadsheet");break;case"encryption-data":case"algorithm":case"start-key-generation":case"key-derivation":throw new Error("Unsupported ODS Encryption");default:if(t&&t.WTF)throw r}}(fe(e,"META-INF/manifest.xml"),t);var r=he(e,"content.xml");if(!r)throw new Error("Missing content.xml in ODS / UOF file");var n=fc(Pe(r),t);return le(e,"meta.xml")&&(n.Props=fn(fe(e,"meta.xml"))),n}function uc(e,t){return fc(e,t)}var dc=function(){var e=["",'',"",'',"",'',"",""].join(""),t=""+e+"";return function(){return me+t}}(),pc=function(){var e=function(e){return Ie(e).replace(/ +/g,function(e){return''}).replace(/\t/g,"").replace(/\n/g,"").replace(/^ /,"").replace(/ $/,"")},t=" \n",r=function(r,n,a){var s=[];s.push(' \n');var i=0,o=0,l=er(r["!ref"]||"A1"),c=r["!merges"]||[],f=0,h=Array.isArray(r);if(r["!cols"])for(o=0;o<=l.e.c;++o)s.push(" \n");var u="",d=r["!rows"]||[];for(i=0;i\n");for(;i<=l.e.r;++i){for(u=d[i]?' table:style-name="ro'+d[i].ods+'"':"",s.push(" \n"),o=0;oo||c[f].s.r>i||c[f].e.c\n");else{var v=qt({r:i,c:o}),b=h?(r[i]||[])[o]:r[v];if(b&&b.f&&(g["table:formula"]=Ie(ho(b.f)),b.F&&b.F.slice(0,v.length)==v)){var w=er(b.F);g["table:number-matrix-columns-spanned"]=w.e.c-w.s.c+1,g["table:number-matrix-rows-spanned"]=w.e.r-w.s.r+1}if(b){switch(b.t){case"b":m=b.v?"TRUE":"FALSE",g["office:value-type"]="boolean",g["office:boolean-value"]=b.v?"true":"false";break;case"n":m=b.w||String(b.v||0),g["office:value-type"]="float",g["office:value"]=b.v||0;break;case"s":case"str":m=null==b.v?"":b.v,g["office:value-type"]="string";break;case"d":m=b.w||q(b.v).toISOString(),g["office:value-type"]="date",g["office:date-value"]=q(b.v).toISOString(),g["table:style-name"]="ce1";break;default:s.push(t);continue}var C=e(m);if(b.l&&b.l.Target){var E=b.l.Target;"#"==(E="#"==E.charAt(0)?"#"+po(E.slice(1)):E).charAt(0)||E.match(/^\w+:/)||(E="../"+E),C=qe("text:a",C,{"xlink:href":E.replace(/&/g,"&")})}s.push(" "+qe("table:table-cell",qe("text:p",C,{}),g)+"\n")}else s.push(t)}}s.push(" \n")}return s.push(" \n"),s.join("")};return function(e,t){var n=[me],a=Je({"xmlns:office":"urn:oasis:names:tc:opendocument:xmlns:office:1.0","xmlns:table":"urn:oasis:names:tc:opendocument:xmlns:table:1.0","xmlns:style":"urn:oasis:names:tc:opendocument:xmlns:style:1.0","xmlns:text":"urn:oasis:names:tc:opendocument:xmlns:text:1.0","xmlns:draw":"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0","xmlns:fo":"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","xmlns:xlink":"http://www.w3.org/1999/xlink","xmlns:dc":"http://purl.org/dc/elements/1.1/","xmlns:meta":"urn:oasis:names:tc:opendocument:xmlns:meta:1.0","xmlns:number":"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0","xmlns:presentation":"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0","xmlns:svg":"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0","xmlns:chart":"urn:oasis:names:tc:opendocument:xmlns:chart:1.0","xmlns:dr3d":"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0","xmlns:math":"http://www.w3.org/1998/Math/MathML","xmlns:form":"urn:oasis:names:tc:opendocument:xmlns:form:1.0","xmlns:script":"urn:oasis:names:tc:opendocument:xmlns:script:1.0","xmlns:ooo":"http://openoffice.org/2004/office","xmlns:ooow":"http://openoffice.org/2004/writer","xmlns:oooc":"http://openoffice.org/2004/calc","xmlns:dom":"http://www.w3.org/2001/xml-events","xmlns:xforms":"http://www.w3.org/2002/xforms","xmlns:xsd":"http://www.w3.org/2001/XMLSchema","xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance","xmlns:sheet":"urn:oasis:names:tc:opendocument:sh33tjs:1.0","xmlns:rpt":"http://openoffice.org/2005/report","xmlns:of":"urn:oasis:names:tc:opendocument:xmlns:of:1.2","xmlns:xhtml":"http://www.w3.org/1999/xhtml","xmlns:grddl":"http://www.w3.org/2003/g/data-view#","xmlns:tableooo":"http://openoffice.org/2009/table","xmlns:drawooo":"http://openoffice.org/2010/draw","xmlns:calcext":"urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0","xmlns:loext":"urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0","xmlns:field":"urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0","xmlns:formx":"urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0","xmlns:css3t":"http://www.w3.org/TR/css3-text/","office:version":"1.2"}),s=Je({"xmlns:config":"urn:oasis:names:tc:opendocument:xmlns:config:1.0","office:mimetype":"application/vnd.oasis.opendocument.spreadsheet"});"fods"==t.bookType?(n.push("\n"),n.push(on().replace(/office:document-meta/g,"office:meta"))):n.push("\n"),function(e,t){e.push(" \n"),e.push(' \n'),e.push(' \n'),e.push(" /\n"),e.push(' \n'),e.push(" /\n"),e.push(" \n"),e.push(" \n");var r=0;t.SheetNames.map(function(e){return t.Sheets[e]}).forEach(function(t){if(t&&t["!cols"])for(var n=0;n\n'),e.push(' \n'),e.push(" \n"),++r}});var n=0;t.SheetNames.map(function(e){return t.Sheets[e]}).forEach(function(t){if(t&&t["!rows"])for(var r=0;r\n'),e.push(' \n'),e.push(" \n"),++n}}),e.push(' \n'),e.push(' \n'),e.push(" \n"),e.push(' \n'),e.push(" \n")}(n,e),n.push(" \n"),n.push(" \n");for(var i=0;i!=e.SheetNames.length;++i)n.push(r(e.Sheets[e.SheetNames[i]],e,i));return n.push(" \n"),n.push(" \n"),"fods"==t.bookType?n.push(""):n.push(""),n.join("")}}();function gc(e,t){if("fods"==t.bookType)return pc(e,t);var r=de(),n="",a=[],s=[];return ue(r,n="mimetype","application/vnd.oasis.opendocument.spreadsheet"),ue(r,n="content.xml",pc(e,t)),a.push([n,"text/xml"]),s.push([n,"ContentFile"]),ue(r,n="styles.xml",dc(e,t)),a.push([n,"text/xml"]),s.push([n,"StylesFile"]),ue(r,n="meta.xml",me+on()),a.push([n,"text/xml"]),s.push([n,"MetadataFile"]),ue(r,n="manifest.rdf",function(e){var t=[me];t.push('\n');for(var r=0;r!=e.length;++r)t.push(nn(e[r][0],e[r][1])),t.push(an("",e[r][0]));return t.push(nn("","Document","pkg")),t.push(""),t.join("")}(s)),a.push([n,"application/rdf+xml"]),ue(r,n="META-INF/manifest.xml",function(e){var t=[me];t.push('\n'),t.push(' \n');for(var r=0;r\n');return t.push(""),t.join("")}(a)),r}function mc(e){return function(t,r){var n=function(e,t){if(!t)return 0;var r=e.SheetNames.indexOf(t);if(-1==r)throw new Error("Sheet not found: "+t);return r}(t,r.sheet);return e.from_sheet(t.Sheets[t.SheetNames[n]],r,t)}}var vc=mc(ac),bc=mc({from_sheet:Zc}),wc=mc(void 0!==Pa?Pa:{}),Cc=mc(void 0!==La?La:{}),Ec=mc(void 0!==Ua?Ua:{}),Sc=mc(void 0!==ps?ps:{}),_c=mc({from_sheet:Qc}),Ac=mc(void 0!==Na?Na:{}),Bc=mc(void 0!==Ma?Ma:{}),Tc=mc(void 0!==za?{from_sheet:za.sheet_to_wk1}:{});function kc(e){return function(t){for(var r=0;r!=e.length;++r){var n=e[r];void 0===t[n[0]]&&(t[n[0]]=n[1]),"n"===n[2]&&(t[n[0]]=Number(t[n[0]]))}}}var yc=function(e){kc([["cellNF",!1],["cellHTML",!0],["cellFormula",!0],["cellStyles",!1],["cellText",!0],["cellDates",!1],["sheetStubs",!1],["sheetRows",0,"n"],["bookDeps",!1],["bookSheets",!1],["bookProps",!1],["bookFiles",!1],["bookVBA",!1],["password",""],["WTF",!1]])(e)},xc=kc([["cellDates",!1],["bookSST",!1],["bookType","xlsx"],["compression",!1],["WTF",!1]]);function Ic(e,t,r,n,a,s,i,o,l,c,f,h){try{s[n]=Jr(he(e,r,!0),t);var u,d=fe(e,t);switch(o){case"sheet":u=wl(d,t,a,l,s[n],c,f,h);break;case"chart":if(!(u=function(e,t,r,n,a,s){return".bin"===t.slice(-4)?function(e,t,r,n,a){if(!e)return e;n||(n={"!id":{}});var s={"!type":"chart","!drawel":null,"!rel":""},i=[],o=!1;return Ht(e,function(e,n,l){switch(l){case 550:s["!rel"]=e;break;case 651:a.Sheets[r]||(a.Sheets[r]={}),e.name&&(a.Sheets[r].CodeName=e.name);break;case 562:case 652:case 669:case 679:case 551:case 552:case 476:case 3072:break;case 35:o=!0;break;case 36:o=!1;break;case 37:i.push(n);break;case 38:i.pop();break;default:if((n||"").indexOf("Begin")>0)i.push(n);else if((n||"").indexOf("End")>0)i.pop();else if(!o||t.WTF)throw new Error("Unexpected record "+l+" "+n)}},t),n["!id"][s["!rel"]]&&(s["!drawel"]=n["!id"][s["!rel"]]),s}(e,n,r,a,s):function(e,t,r,n,a){if(!e)return e;n||(n={"!id":{}});var s,i={"!type":"chart","!drawel":null,"!rel":""},o=e.match(Ro);return o&&Do(o[0],0,a,r),(s=e.match(/drawing r:id="(.*?)"/))&&(i["!rel"]=s[1]),n["!id"][i["!rel"]]&&(i["!drawel"]=n["!id"][i["!rel"]]),i}(e,0,r,a,s)}(d,t,a,l,s[n],c))||!u["!drawel"])break;var p=ge(u["!drawel"].Target,t),g=Qr(p),m=function(e,t){if(!e)return"??";var r=(e.match(/]*r:id="([^"]*)"/)||["",""])[1];return t["!id"][r].Target}(he(e,p,!0),Jr(he(e,g,!0),p)),v=ge(m,p),b=Qr(v);u=function(e,t,r,n,a,s){var i=s||{"!type":"chart"};if(!e)return s;var o=0,l=0,c="A",f={s:{r:2e6,c:2e6},e:{r:0,c:0}};return(e.match(/[\s\S]*?<\/c:numCache>/gm)||[]).forEach(function(e){var t=function(e){var t,r=[],n=e.match(/^/);(e.match(/(.*?)<\/c:pt>/gm)||[]).forEach(function(e){var t=e.match(/(.*)<\/c:v><\/c:pt>/);t&&(r[+t[1]]=n?+t[2]:t[2])});var a=ke((e.match(/([\s\S]*?)<\/c:formatCode>/)||["","General"])[1]);return(e.match(/(.*?)<\/c:f>/gm)||[]).forEach(function(e){t=e.replace(/<.*?>/g,"")}),[r,a,t]}(e);f.s.r=f.s.c=0,f.e.c=o,c=Qt(o),t[0].forEach(function(e,r){i[c+Yt(r)]={t:"n",v:e,z:t[1]},l=r}),f.e.r0&&(i["!ref"]=tr(f)),i}(he(e,v,!0),0,0,Jr(he(e,b,!0),v),0,u);break;case"macro":C=t,s[n],C.slice(-4),u={"!type":"macro"};break;case"dialog":u=function(e,t){return t.slice(-4),{"!type":"dialog"}}(0,t,s[n]);break;default:throw new Error("Unrecognized sheet type "+o)}i[n]=u;var w=[];s&&s[n]&&U(s[n]).forEach(function(r){if(s[n][r].Type==Zr.CMNT){var a=ge(s[n][r].Target,t);if(!(w=function(e,t,r){return".bin"===t.slice(-4)?function(e,t){var r=[],n=[],a={},s=!1;return Ht(e,function(e,i,o){switch(o){case 632:n.push(e);break;case 635:a=e;break;case 637:a.t=e.t,a.h=e.h,a.r=e.r;break;case 636:if(a.author=n[a.iauthor],delete a.iauthor,t.sheetRows&&a.rfx&&t.sheetRows<=a.rfx.r)break;a.t||(a.t=""),delete a.rfx,r.push(a);break;case 3072:case 37:case 38:break;case 35:s=!0;break;case 36:s=!1;break;default:if((i||"").indexOf("Begin")>0);else if((i||"").indexOf("End")>0);else if(!s||t.WTF)throw new Error("Unexpected record "+o+" "+i)}}),r}(e,r):function(e,t){if(e.match(/<(?:\w+:)?comments *\/>/))return[];var r=[],n=[],a=e.match(/<(?:\w+:)?authors>([\s\S]*)<\/(?:\w+:)?authors>/);a&&a[1]&&a[1].split(/<\/\w*:?author>/).forEach(function(e){if(""!==e&&""!==e.trim()){var t=e.match(/<(?:\w+:)?author[^>]*>(.*)/);t&&r.push(t[1])}});var s=e.match(/<(?:\w+:)?commentList>([\s\S]*)<\/(?:\w+:)?commentList>/);return s&&s[1]&&s[1].split(/<\/\w*:?comment>/).forEach(function(e){if(""!==e&&""!==e.trim()){var a=e.match(/<(?:\w+:)?comment[^>]*>/);if(a){var s=Ee(a[0]),i={author:s.authorId&&r[s.authorId]||"sheetjsghost",ref:s.ref,guid:s.guid},o=Jt(s.ref);if(!(t.sheetRows&&t.sheetRows<=o.r)){var l=e.match(/<(?:\w+:)?text>([\s\S]*)<\/(?:\w+:)?text>/),c=!!l&&!!l[1]&&ja(l[1])||{r:"",t:"",h:""};i.r=c.r,""==c.r&&(c.t=c.h=""),i.t=(c.t||"").replace(/\r\n/g,"\n").replace(/\r/g,"\n"),t.cellHTML&&(i.h=c.h),n.push(i)}}}}),n}(e,r)}(fe(e,a,!0),a,l))||!w.length)return;!function(e,t){var r,n=Array.isArray(e);t.forEach(function(t){var a=Jt(t.ref);if(n?(e[a.r]||(e[a.r]=[]),r=e[a.r][a.c]):r=e[t.ref],!r){r={t:"z"},n?e[a.r][a.c]=r:e[t.ref]=r;var s=rr(e["!ref"]||"BDWGO1000001:A1");s.s.r>a.r&&(s.s.r=a.r),s.e.ra.c&&(s.s.c=a.c),s.e.c0?t.calcchains[0]:"",t.sst=t.strs.length>0?t.strs[0]:"",t.style=t.styles.length>0?t.styles[0]:"",t.defaults=r,delete t.calcchains,t}(he(e,"[Content_Types].xml")),i=!1;if(0===s.workbooks.length&&fe(e,n="xl/workbook.xml",!0)&&s.workbooks.push(n),0===s.workbooks.length){if(!fe(e,n="xl/workbook.bin",!0))throw new Error("Could not find workbook");s.workbooks.push(n),i=!0}"bin"==s.workbooks[0].slice(-3)&&(i=!0);var o={},l={};if(!t.bookSheets&&!t.bookProps){if(go=[],s.sst)try{go=function(e,t,r){return".bin"===t.slice(-4)?function(e,t){var r=[],n=!1;return Ht(e,function(e,a,s){switch(s){case 159:r.Count=e[0],r.Unique=e[1];break;case 19:r.push(e);break;case 160:return!0;case 35:n=!0;break;case 36:n=!1;break;default:if(a.indexOf("Begin")>0||a.indexOf("End"),!n||t.WTF)throw new Error("Unexpected record "+s+" "+a)}}),r}(e,r):function(e,t){var r=[],n="";if(!e)return r;var a=e.match(Ka);if(a){n=a[2].replace($a,"").split(Ya);for(var s=0;s!=n.length;++s){var i=ja(n[s].trim(),t);null!=i&&(r[r.length]=i)}a=Ee(a[1]),r.Count=a.count,r.Unique=a.uniqueCount}return r}(e,r)}(fe(e,Rc(s.sst)),s.sst,t)}catch(e){if(t.WTF)throw e}t.cellStyles&&s.themes.length&&(o=function(e,t,r){return ei(e,r)}(he(e,s.themes[0].replace(/^\//,""),!0)||"",s.themes[0],t)),s.style&&(l=function(e,t,r,n){return".bin"===t.slice(-4)?function(e,t,r){var n={NumberFmt:[]};for(var a in x._table)n.NumberFmt[a]=x._table[a];n.CellXf=[],n.Fonts=[];var s=[],i=!1;return Ht(e,function(e,a,o){switch(o){case 44:n.NumberFmt[e[0]]=e[1],x.load(e[1],e[0]);break;case 43:n.Fonts.push(e),null!=e.color.theme&&t&&t.themeElements&&t.themeElements.clrScheme&&(e.color.rgb=ms(t.themeElements.clrScheme[e.color.theme].rgb,e.color.tint||0));break;case 1025:case 45:case 46:case 48:case 507:case 572:case 475:case 1171:case 2102:case 1130:case 512:case 2095:case 3072:break;case 47:"BrtBeginCellXFs"==s[s.length-1]&&n.CellXf.push(e);break;case 35:i=!0;break;case 36:i=!1;break;case 37:s.push(a),i=!0;break;case 38:s.pop(),i=!1;break;default:if((a||"").indexOf("Begin")>0)s.push(a);else if((a||"").indexOf("End")>0)s.pop();else if(!i||r.WTF&&"BrtACBegin"!=s[s.length-1])throw new Error("Unexpected record "+o+" "+a)}}),n}(e,r,n):Ns(e,r,n)}(fe(e,Rc(s.style)),s.style,o,t))}s.links.map(function(r){try{return Jr(he(e,Qr(Rc(r))),r),function(e,t,r,n){if(".bin"===r.slice(-4))return function(e,t,r,n){if(!e)return e;var a=n||{},s=!1;Ht(e,function(e,t,r){switch(r){case 359:case 363:case 364:case 366:case 367:case 368:case 369:case 370:case 371:case 472:case 577:case 578:case 579:case 580:case 581:case 582:case 583:case 584:case 585:case 586:case 587:break;case 35:s=!0;break;case 36:s=!1;break;default:if((t||"").indexOf("Begin")>0);else if((t||"").indexOf("End")>0);else if(!s||a.WTF)throw new Error("Unexpected record "+r.toString(16)+" "+t)}},a)}(e,0,0,n)}(fe(e,Rc(r)),0,r,t)}catch(e){}});var c=function(e,t,r){return".bin"===t.slice(-4)?function(e,t){var r={AppVersion:{},WBProps:{},WBView:[],Sheets:[],CalcPr:{},xmlns:""},n=[],a=!1;t||(t={}),t.biff=12;var s=[],i=[[]];return i.SheetNames=[],i.XTI=[],Kl[16]={n:"BrtFRTArchID$",f:vl},Ht(e,function(e,o,l){switch(l){case 156:i.SheetNames.push(e.name),r.Sheets.push(e);break;case 153:r.WBProps=e;break;case 39:null!=e.Sheet&&(t.SID=e.Sheet),e.Ref=Qi(e.Ptg,0,null,i,t),delete t.SID,delete e.Ptg,s.push(e);break;case 1036:case 361:case 2071:case 158:case 143:case 664:case 353:case 3072:case 3073:case 534:case 677:case 157:case 610:case 2050:case 155:case 548:case 676:case 128:case 665:case 2128:case 2125:case 549:case 2053:case 596:case 2076:case 2075:case 2082:case 397:case 154:case 1117:case 553:case 2091:case 16:break;case 357:case 358:case 355:case 667:i[0].length?i.push([l,e]):i[0]=[l,e],i[i.length-1].XTI=[];break;case 362:0===i.length&&(i[0]=[],i[0].XTI=[]),i[i.length-1].XTI=i[i.length-1].XTI.concat(e),i.XTI=i.XTI.concat(e);break;case 35:case 37:n.push(o),a=!0;break;case 36:case 38:n.pop(),a=!1;break;default:if((o||"").indexOf("Begin")>0);else if((o||"").indexOf("End")>0);else if(!a||t.WTF&&"BrtACBegin"!=n[n.length-1]&&"BrtFRTBegin"!=n[n.length-1])throw new Error("Unexpected record "+l+" "+o)}},t),fl(r),r.Names=s,r.supbooks=i,r}(e,r):function(e,t){if(!e)throw new Error("Could not find file");var r={AppVersion:{},WBProps:{},WBView:[],Sheets:[],CalcPr:{},Names:[],xmlns:""},n=!1,a="xmlns",s={},i=0;if(e.replace(be,function(o,l){var c=Ee(o);switch(Se(c[0])){case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":al.forEach(function(e){if(null!=c[e[0]])switch(e[2]){case"bool":r.WBProps[e[0]]=Ne(c[e[0]]);break;case"int":r.WBProps[e[0]]=parseInt(c[e[0]],10);break;default:r.WBProps[e[0]]=c[e[0]]}}),c.codeName&&(r.WBProps.CodeName=Pe(c.codeName));break;case"":delete c[0],r.WBView.push(c);break;case"":case"":n=!0;break;case"":case"":case"":n=!1;break;case"":s.Ref=ke(Pe(e.slice(i,l))),r.Names.push(s);break;case"":delete c[0],r.CalcPr=c;break;default:if(!n&&t.WTF)throw new Error("unrecognized "+c[0]+" in workbook")}return o}),-1===nt.main.indexOf(r.xmlns))throw new Error("Unknown Namespace: "+r.xmlns);return fl(r),r}(e,r)}(fe(e,Rc(s.workbooks[0])),s.workbooks[0],t),f={},h="";s.coreprops.length&&((h=fe(e,Rc(s.coreprops[0]),!0))&&(f=fn(h)),0!==s.extprops.length&&(h=fe(e,Rc(s.extprops[0]),!0))&&function(e,t,r){var n={};t||(t={}),e=Pe(e),dn.forEach(function(r){var a=(e.match(Xe(r[0]))||[])[1];switch(r[2]){case"string":a&&(t[r[1]]=ke(a));break;case"bool":t[r[1]]="true"===a;break;case"raw":var s=e.match(new RegExp("<"+r[0]+"[^>]*>([\\s\\S]*?)"));s&&s.length>0&&(n[r[1]]=s[1])}}),n.HeadingPairs&&n.TitlesOfParts&&pn(n.HeadingPairs,n.TitlesOfParts,t,r)}(h,f,t));var u={};t.bookSheets&&!t.bookProps||0!==s.custprops.length&&(h=he(e,Rc(s.custprops[0]),!0))&&(u=function(e,t){var r={},n="",a=e.match(mn);if(a)for(var s=0;s!=a.length;++s){var i=a[s],o=Ee(i);switch(o[0]){case"":n=null;break;default:if(0===i.indexOf(""),c=l[0].slice(4),f=l[1];switch(c){case"lpstr":case"bstr":case"lpwstr":case"cy":case"error":r[n]=ke(f);break;case"bool":r[n]=Ne(f);break;case"i1":case"i2":case"i4":case"i8":case"int":case"uint":r[n]=parseInt(f,10);break;case"r4":case"r8":case"decimal":r[n]=parseFloat(f);break;case"filetime":case"date":r[n]=q(f);break;default:if("/"==c.slice(-1))break;t.WTF&&"undefined"!=typeof console&&console.warn("Unexpected",i,c,l)}}else if("0&&(r=f.SheetNames),t.bookProps&&(d.Props=f,d.Custprops=u),t.bookSheets&&void 0!==r&&(d.SheetNames=r),t.bookSheets?d.SheetNames:t.bookProps))return d;r={};var p,g={};t.bookDeps&&s.calcchain&&(p=fe(e,Rc(s.calcchain)),g=".bin"===s.calcchain.slice(-4)?function(e){var t=[];return Ht(e,function(e,r,n){if(63===n)t.push(e);else if((r||"").indexOf("Begin")>0);else if(!((r||"").indexOf("End")>0))throw new Error("Unexpected record "+n+" "+r)}),t}(p):function(e){var t=[];if(!e)return t;var r=1;return(e.match(be)||[]).forEach(function(e){var n=Ee(e);switch(n[0]){case"":case"":break;case"-1?"sheet":Zr.CS&&r==Zr.CS?"chart":Zr.DS&&r==Zr.DS?"dialog":Zr.MS&&r==Zr.MS?"macro":r&&r.length?r:"sheet")];var r})}catch(e){return null}return e&&0!==e.length?e:null}(B,c.Sheets));var T=fe(e,"xl/worksheets/sheet.xml",!0)?1:0;e:for(b=0;b!=f.Worksheets;++b){var k="sheet";if(B&&B[b]?(m="xl/"+B[b][1].replace(/[\/]?xl\//,""),le(e,m)||(m=B[b][1]),le(e,m)||(m=A.replace(/_rels\/.*$/,"")+B[b][1]),k=B[b][2]):m=(m="xl/worksheets/sheet"+(b+1-T)+"."+S).replace(/sheet0\./,"sheet."),v=m.replace(/^(.*)(\/)([^\/]*)$/,"$1/_rels/$3.rels"),t&&null!=t.sheets)switch(typeof t.sheets){case"number":if(b!=t.sheets)continue e;break;case"string":if(f.SheetNames[b].toLowerCase()!=t.sheets.toLowerCase())continue e;break;default:if(Array.isArray&&Array.isArray(t.sheets)){for(var y=!1,R=0;R!=t.sheets.length;++R)"number"==typeof t.sheets[R]&&t.sheets[R]==b&&(y=1),"string"==typeof t.sheets[R]&&t.sheets[R].toLowerCase()==f.SheetNames[b].toLowerCase()&&(y=1);if(!y)continue e}}Ic(e,m,v,f.SheetNames[b],b,w,r,k,t,c,o,l)}return d={Directory:s,Workbook:c,Props:f,Custprops:u,Deps:g,Sheets:r,SheetNames:f.SheetNames,Strings:go,Styles:l,Themes:o,SSF:x.get_table()},t&&t.bookFiles&&(e.files?(d.keys=a,d.files=e.files):(d.keys=[],d.files={},e.FullPaths.forEach(function(t,r){t=t.replace(/^Root Entry[\/]/,""),d.keys.push(t),d.files[t]=e.FileIndex[r]}))),t&&t.bookVBA&&(s.vba.length>0?d.vbaraw=fe(e,Rc(s.vba[0]),!0):s.defaults&&"application/vnd.ms-office.vbaProject"===s.defaults.bin&&(d.vbaraw=fe(e,"xl/vbaProject.bin",!0))),d}function Fc(e,t){var r=t||{},n="Workbook",a=P.find(e,n);try{if(n="/!DataSpaces/Version",!(a=P.find(e,n))||!a.content)throw new Error("ECMA-376 Encrypted file missing "+n);if(function(e){var t={};t.id=e.read_shift(0,"lpp4"),t.R=ts(e,4),t.U=ts(e,4),t.W=ts(e,4)}(a.content),n="/!DataSpaces/DataSpaceMap",!(a=P.find(e,n))||!a.content)throw new Error("ECMA-376 Encrypted file missing "+n);var s=function(e){var t=[];e.l+=4;for(var r=e.read_shift(4);r-- >0;)t.push(rs(e));return t}(a.content);if(1!==s.length||1!==s[0].comps.length||0!==s[0].comps[0].t||"StrongEncryptionDataSpace"!==s[0].name||"EncryptedPackage"!==s[0].comps[0].v)throw new Error("ECMA-376 Encrypted file bad "+n);if(n="/!DataSpaces/DataSpaceInfo/StrongEncryptionDataSpace",!(a=P.find(e,n))||!a.content)throw new Error("ECMA-376 Encrypted file missing "+n);var i=function(e){var t=[];e.l+=4;for(var r=e.read_shift(4);r-- >0;)t.push(e.read_shift(0,"lpp4"));return t}(a.content);if(1!=i.length||"StrongEncryptionTransform"!=i[0])throw new Error("ECMA-376 Encrypted file bad "+n);if(n="/!DataSpaces/TransformInfo/StrongEncryptionTransform/!Primary",!(a=P.find(e,n))||!a.content)throw new Error("ECMA-376 Encrypted file missing "+n);!function(e){var t=function(e){var t={};return e.read_shift(4),e.l+=4,t.id=e.read_shift(0,"lpp4"),t.name=e.read_shift(0,"lpp4"),t.R=ts(e,4),t.U=ts(e,4),t.W=ts(e,4),t}(e);if(t.ename=e.read_shift(0,"8lpp4"),t.blksz=e.read_shift(4),t.cmode=e.read_shift(4),4!=e.read_shift(4))throw new Error("Bad !Primary record")}(a.content)}catch(e){}if(n="/EncryptionInfo",!(a=P.find(e,n))||!a.content)throw new Error("ECMA-376 Encrypted file missing "+n);var o=function(e){var t=ts(e);switch(t.Minor){case 2:return[t.Minor,ss(e)];case 3:return[t.Minor,is()];case 4:return[t.Minor,os(e)]}throw new Error("ECMA-376 Encrypted file unrecognized Version: "+t.Minor)}(a.content);if(n="/EncryptedPackage",!(a=P.find(e,n))||!a.content)throw new Error("ECMA-376 Encrypted file missing "+n);if(4==o[0]&&"undefined"!=typeof decrypt_agile)return decrypt_agile(o[1],a.content,r.password||"",r);if(2==o[0]&&"undefined"!=typeof decrypt_std76)return decrypt_std76(o[1],a.content,r.password||"",r);throw new Error("File is password-protected")}function Dc(e,t){if(ai=1024,"ods"==t.bookType)return gc(e,t);e&&!e.SSF&&(e.SSF=x.get_table()),e&&e.SSF&&(I(x),x.load_table(e.SSF),t.revssf=W(e.SSF),t.revssf[e.SSF[65535]]=0,t.ssf=e.SSF),t.rels={},t.wbrels={},t.Strings=[],t.Strings.Count=0,t.Strings.Unique=0,vo?t.revStrings=new Map:(t.revStrings={},t.revStrings.foo=[],delete t.revStrings.foo);var r="xlsb"==t.bookType?"bin":"xml",n=fi.indexOf(t.bookType)>-1,a={workbooks:[],sheets:[],charts:[],dialogs:[],macros:[],rels:[],strs:[],comments:[],links:[],coreprops:[],extprops:[],custprops:[],themes:[],styles:[],calcchains:[],vba:[],drawings:[],TODO:[],xmlns:""};xc(t=t||{});var s=de(),i="",o=0;if(t.cellXfs=[],Eo(t.cellXfs,{},{revssf:{General:0}}),e.Props||(e.Props={}),ue(s,i="docProps/core.xml",function(e,t){var r=t||{},n=[me,hn],a={};if(!e&&!r.Props)return n.join("");e&&(null!=e.CreatedDate&&un("dcterms:created","string"==typeof e.CreatedDate?e.CreatedDate:et(e.CreatedDate,r.WTF),{"xsi:type":"dcterms:W3CDTF"},n,a),null!=e.ModifiedDate&&un("dcterms:modified","string"==typeof e.ModifiedDate?e.ModifiedDate:et(e.ModifiedDate,r.WTF),{"xsi:type":"dcterms:W3CDTF"},n,a));for(var s=0;s!=ln.length;++s){var i=ln[s],o=r.Props&&null!=r.Props[i[1]]?r.Props[i[1]]:e?e[i[1]]:null;!0===o?o="1":!1===o?o="0":"number"==typeof o&&(o=String(o)),null!=o&&un(i[0],o,null,n,a)}return n.length>2&&(n[n.length]="",n[1]=n[1].replace("/>",">")),n.join("")}(e.Props,t)),a.coreprops.push(i),rn(t.rels,2,i,Zr.CORE_PROPS),i="docProps/app.xml",e.Props&&e.Props.SheetNames);else if(e.Workbook&&e.Workbook.Sheets){for(var l=[],c=0;cWorksheets")+r("vt:variant",r("vt:i4",String(e.Worksheets))),{size:2,baseType:"variant"})),t[t.length]=r("TitlesOfParts",r("vt:vector",e.SheetNames.map(function(e){return""+Ie(e)+""}).join(""),{size:e.Worksheets,baseType:"lpstr"})),t.length>2&&(t[t.length]="",t[1]=t[1].replace("/>",">")),t.join("")}(e.Props)),a.extprops.push(i),rn(t.rels,3,i,Zr.EXT_PROPS),e.Custprops!==e.Props&&U(e.Custprops||{}).length>0&&(ue(s,i="docProps/custom.xml",function(e){var t=[me,vn];if(!e)return t.join("");var r=1;return U(e).forEach(function(n){++r,t[t.length]=qe("property",function(e){switch(typeof e){case"string":var t=qe("vt:lpwstr",Ie(e));return t.replace(/"/g,"_x0022_");case"number":return qe((0|e)==e?"vt:i4":"vt:r8",Ie(String(e)));case"boolean":return qe("vt:bool",e?"true":"false")}if(e instanceof Date)return qe("vt:filetime",et(e));throw new Error("Unable to serialize "+e)}(e[n]),{fmtid:"{D5CDD505-2E9C-101B-9397-08002B2CF9AE}",pid:r,name:Ie(n)})}),t.length>2&&(t[t.length]="",t[1]=t[1].replace("/>",">")),t.join("")}(e.Custprops)),a.custprops.push(i),rn(t.rels,4,i,Zr.CUST_PROPS)),o=1;o<=e.SheetNames.length;++o){var f={"!id":{}},h=e.Sheets[e.SheetNames[o-1]];if((h||{})["!type"],ue(s,i="xl/worksheets/sheet"+o+"."+r,El(o-1,i,t,e,f)),a.sheets.push(i),rn(t.wbrels,-1,"worksheets/sheet"+o+"."+r,Zr.WS[0]),h){var u=h["!comments"],d=!1;if(u&&u.length>0){var p="xl/comments"+o+"."+r;ue(s,p,_l(u,p,t)),a.comments.push(p),rn(f,-1,"../comments"+o+"."+r,Zr.CMNT),d=!0}h["!legacy"]&&d&&ue(s,"xl/drawings/vmlDrawing"+o+".vml",si(o,h["!comments"])),delete h["!comments"],delete h["!legacy"]}f["!id"].rId1&&ue(s,Qr(i),en(f))}return null!=t.Strings&&t.Strings.length>0&&(ue(s,i="xl/sharedStrings."+r,Sl(t.Strings,i,t)),a.strs.push(i),rn(t.wbrels,-1,"sharedStrings."+r,Zr.SST)),ue(s,i="xl/workbook."+r,Cl(e,i,t)),a.workbooks.push(i),rn(t.rels,1,i,Zr.WB),ue(s,i="xl/theme/theme1.xml",ti(e.Themes,t)),a.themes.push(i),rn(t.wbrels,-1,"theme/theme1.xml",Zr.THEME),ue(s,i="xl/styles."+r,function(e,t,r){return(".bin"===t.slice(-4)?Gs:Ls)(e,r)}(e,i,t)),a.styles.push(i),rn(t.wbrels,-1,"styles."+r,Zr.STY),e.vbaraw&&n&&(ue(s,i="xl/vbaProject.bin",e.vbaraw),a.vba.push(i),rn(t.wbrels,-1,"vbaProject.bin",Zr.VBA)),ue(s,"[Content_Types].xml",function(e,t){var r,n=[];n[n.length]=me,n[n.length]=$r,n=n.concat(Yr);var a=function(a){e[a]&&e[a].length>0&&(r=e[a][0],n[n.length]=qe("Override",null,{PartName:("/"==r[0]?"":"/")+r,ContentType:jr[a][t.bookType||"xlsx"]}))},s=function(r){(e[r]||[]).forEach(function(e){n[n.length]=qe("Override",null,{PartName:("/"==e[0]?"":"/")+e,ContentType:jr[r][t.bookType||"xlsx"]})})},i=function(t){(e[t]||[]).forEach(function(e){n[n.length]=qe("Override",null,{PartName:("/"==e[0]?"":"/")+e,ContentType:Kr[t][0]})})};return a("workbooks"),s("sheets"),s("charts"),i("themes"),["strs","styles"].forEach(a),["coreprops","extprops","custprops"].forEach(i),i("vba"),i("comments"),i("drawings"),n.length>2&&(n[n.length]="",n[1]=n[1].replace("/>",">")),n.join("")}(a,t)),ue(s,"_rels/.rels",en(t.rels)),ue(s,"xl/_rels/workbook."+r+".rels",en(t.wbrels)),delete t.revssf,delete t.ssf,s}function Nc(e,t){var r="";switch((t||{}).type||"base64"){case"buffer":case"array":return[e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7]];case"base64":r=m.decode(e.slice(0,12));break;case"binary":r=e;break;default:throw new Error("Unrecognized type "+(t&&t.type||"undefined"))}return[r.charCodeAt(0),r.charCodeAt(1),r.charCodeAt(2),r.charCodeAt(3),r.charCodeAt(4),r.charCodeAt(5),r.charCodeAt(6),r.charCodeAt(7)]}function Pc(e,t){var r=0;e:for(;r=2&&0===n[3])return za.to_workbook(a,r);if(0===n[2]&&(8===n[3]||9===n[3]))return za.to_workbook(a,r)}break;case 3:case 131:case 139:case 140:return Na.to_workbook(a,r);case 123:if(92===n[1]&&114===n[2]&&116===n[3])return ps.to_workbook(a,r);break;case 10:case 13:case 32:return function(e,t){var r="",n=Nc(e,t);switch(t.type){case"base64":r=m.decode(e);break;case"binary":r=e;break;case"buffer":r=e.toString("binary");break;case"array":r=ee(e);break;default:throw new Error("Unrecognized type "+t.type)}return 239==n[0]&&187==n[1]&&191==n[2]&&(r=Pe(r)),Pc(r,t)}(a,r);case 137:if(80===n[1]&&78===n[2]&&71===n[3])throw new Error("PNG Image File is not a spreadsheet")}return Na.versions.indexOf(n[0])>-1&&n[2]<=12&&n[3]<=31?Na.to_workbook(a,r):Lc(e,a,r,s)}function Uc(e,t){var r=t||{};return r.type="file",Mc(e,r)}function zc(e,t){switch(t.type){case"base64":case"binary":break;case"buffer":case"array":t.type="";break;case"file":return M(t.file,P.write(e,{type:v?"buffer":""}));case"string":throw new Error("'string' output type invalid for '"+t.bookType+"' files");default:throw new Error("Unrecognized type "+t.type)}return P.write(e,t)}function Hc(e,t,r){r||(r="");var n=r+e;switch(t.type){case"base64":return m.encode(Le(n));case"binary":return Le(n);case"string":return e;case"file":return M(t.file,n,"utf8");case"buffer":return v?b(n,"utf8"):Hc(n,{type:"binary"}).split("").map(function(e){return e.charCodeAt(0)})}throw new Error("Unrecognized type "+t.type)}function Wc(e,t){switch(t.type){case"string":case"base64":case"binary":for(var r="",n=0;n22)throw new Error("Bad Code Name: Worksheet"+i)}});for(var s=0;s-1||null!=s[i][1]&&o.push(s[i]);a.length&&P.utils.cfb_add(t,"/SummaryInformation",Pn(a,Xl,Ur,Lr)),(n.length||o.length)&&P.utils.cfb_add(t,"/DocumentSummaryInformation",Pn(n,Gl,Mr,Pr,o.length?o:null,"05d5cdd59c2e1b10939708002b2cf9ae"))}(e,n),8==r.biff&&e.vbaraw&&function(e,t){t.FullPaths.forEach(function(r,n){if(0!=n){var a=r.replace(/[^\/]*[\/]/,"/_VBA_PROJECT_CUR/");"/"!==a.slice(-1)&&P.utils.cfb_add(e,a,t.FileIndex[n].content)}})}(n,P.read(e.vbaraw,{type:"string"==typeof e.vbaraw?"binary":"buffer"})),n}(e,r),r)}(e,r);case"xlsx":case"xlsm":case"xlam":case"xlsb":case"ods":return function(e,t){var r=te(t||{}),n=Dc(e,r),a={};if(r.compression&&(a.compression="DEFLATE"),r.password)a.type=v?"nodebuffer":"string";else switch(r.type){case"base64":a.type="base64";break;case"binary":a.type="string";break;case"string":throw new Error("'string' output type invalid for '"+r.bookType+"' files");case"buffer":case"file":a.type=v?"nodebuffer":"string";break;default:throw new Error("Unrecognized type "+r.type)}var s=n.FullPaths?P.write(n,{fileType:"zip",type:{nodebuffer:"buffer",string:"binary"}[a.type]||a.type}):n.generate(a);return r.password&&"undefined"!=typeof encrypt_agile?zc(encrypt_agile(s,r.password),r):"file"===r.type?M(r.file,s):"string"==r.type?Pe(s):s}(e,r);default:throw new Error("Unrecognized bookType |"+r.bookType+"|")}}function Xc(e){if(!e.bookType){var t=e.file.slice(e.file.lastIndexOf(".")).toLowerCase();t.match(/^\.[a-z]+$/)&&(e.bookType=t.slice(1)),e.bookType={xls:"biff8",htm:"html",slk:"sylk",socialcalc:"eth",Sh33tJS:"WTF"}[e.bookType]||e.bookType}}function Gc(e,t,r){var n=r||{};return n.type="file",n.file=t,Xc(n),Vc(e,n)}function jc(e,t,r,n,a,s,i,o){var l=Yt(r),c=o.defval,f=o.raw||!Object.prototype.hasOwnProperty.call(o,"raw"),h=!0,u=1===a?[]:{};if(1!==a)if(Object.defineProperty)try{Object.defineProperty(u,"__rowNum__",{value:r,enumerable:!1})}catch(e){u.__rowNum__=r}else u.__rowNum__=r;if(!i||e[r])for(var d=t.s.c;d<=t.e.c;++d){var p=i?e[r][d]:e[n[d]+l];if(void 0!==p&&void 0!==p.t){var g=p.v;switch(p.t){case"z":if(null==g)break;continue;case"e":g=0==g?null:void 0;break;case"s":case"d":case"b":case"n":break;default:throw new Error("unrecognized type "+p.t)}if(null!=s[d]){if(null==g)if("e"==p.t&&null===g)u[s[d]]=null;else if(void 0!==c)u[s[d]]=c;else{if(!f||null!==g)continue;u[s[d]]=null}else u[s[d]]=f||o.rawNumbers&&"n"==p.t?g:nr(p,g,o);null!=g&&(h=!1)}}else{if(void 0===c)continue;null!=s[d]&&(u[s[d]]=c)}}return{row:u,isempty:h}}function Kc(e,t){if(null==e||null==e["!ref"])return[];var r={t:"n",v:0},n=0,a=1,s=[],i=0,o="",l={s:{r:0,c:0},e:{r:0,c:0}},c=t||{},f=null!=c.range?c.range:e["!ref"];switch(1===c.header?n=1:"A"===c.header?n=2:Array.isArray(c.header)?n=3:null==c.header&&(n=0),typeof f){case"string":l=rr(f);break;case"number":(l=rr(e["!ref"])).s.r=f;break;default:l=f}n>0&&(a=0);var h=Yt(l.s.r),u=[],d=[],p=0,g=0,m=Array.isArray(e),v=l.s.r,b=0,w=0;for(m&&!e[v]&&(e[v]=[]),b=l.s.c;b<=l.e.c;++b)switch(u[b]=Qt(b),r=m?e[v][b]:e[u[b]+h],n){case 1:s[b]=b-l.s.c;break;case 2:s[b]=u[b];break;case 3:s[b]=c.header[b-l.s.c];break;default:for(null==r&&(r={w:"__EMPTY",t:"s"}),o=i=nr(r,null,c),g=0,w=0;w=0&&(f='"'+f.replace($c,'""')+'"'));c.push(f)}return!1===o.blankrows&&l?null:c.join(i)}function Zc(e,t){var r=[],n=null==t?{}:t;if(null==e||null==e["!ref"])return"";var a=rr(e["!ref"]),s=void 0!==n.FS?n.FS:",",i=s.charCodeAt(0),o=void 0!==n.RS?n.RS:"\n",l=o.charCodeAt(0),c=new RegExp(("|"==s?"\\|":s)+"+$"),f="",h=[];n.dense=Array.isArray(e);for(var u=n.skipHidden&&e["!cols"]||[],d=n.skipHidden&&e["!rows"]||[],p=a.s.c;p<=a.e.c;++p)(u[p]||{}).hidden||(h[p]=Qt(p));for(var g=a.s.r;g<=a.e.r;++g)(d[g]||{}).hidden||null!=(f=Yc(e,a,g,h,i,l,s,n))&&(n.strip&&(f=f.replace(c,"")),r.push(f+o));return delete n.dense,r.join("")}function Qc(e,t){t||(t={}),t.FS="\t",t.RS="\n";var r=Zc(e,t);if("undefined"==typeof cptable||"string"==t.type)return r;var n=cptable.utils.encode(1200,r,"str");return String.fromCharCode(255)+String.fromCharCode(254)+n}function Jc(e){var t,r="",n="";if(null==e||null==e["!ref"])return[];var a,s=rr(e["!ref"]),i="",o=[],l=[],c=Array.isArray(e);for(a=s.s.c;a<=s.e.c;++a)o[a]=Qt(a);for(var f=s.s.r;f<=s.e.r;++f)for(i=Yt(f),a=s.s.c;a<=s.e.c;++a)if(r=o[a]+i,n="",void 0!==(t=c?(e[f]||[])[a]:e[r])){if(null!=t.F){if(r=t.F,!t.f)continue;n=t.f,-1==r.indexOf(":")&&(r=r+":"+r)}if(null!=t.f)n=t.f;else{if("z"==t.t)continue;if("n"==t.t&&null!=t.v)n=""+t.v;else if("b"==t.t)n=t.v?"TRUE":"FALSE";else if(void 0!==t.w)n="'"+t.w;else{if(void 0===t.v)continue;n="s"==t.t?"'"+t.v:""+t.v}}l[l.length]=r+"="+n}return l}function qc(e,t,r){var n,a=r||{},s=+!a.skipHeader,i=e||{},o=0,l=0;if(i&&null!=a.origin)if("number"==typeof a.origin)o=a.origin;else{var c="string"==typeof a.origin?Jt(a.origin):a.origin;o=c.r,l=c.c}var f={s:{c:0,r:0},e:{c:l,r:o+t.length-1+s}};if(i["!ref"]){var h=rr(i["!ref"]);f.e.c=Math.max(f.e.c,h.e.c),f.e.r=Math.max(f.e.r,h.e.r),-1==o&&(o=h.e.r+1,f.e.r=o+t.length-1+s)}else-1==o&&(o=0,f.e.r=t.length-1+s);var u=a.header||[],d=0;t.forEach(function(e,t){U(e).forEach(function(r){-1==(d=u.indexOf(r))&&(u[d=u.length]=r);var c=e[r],f="z",h="",p=qt({c:l+d,r:o+t+s});n=ef.sheet_get_cell(i,p),!c||"object"!=typeof c||c instanceof Date?("number"==typeof c?f="n":"boolean"==typeof c?f="b":"string"==typeof c?f="s":c instanceof Date?(f="d",a.cellDates||(f="n",c=X(c)),h=a.dateNF||x._table[14]):null===c&&a.nullError&&(f="e",c=0),n?(n.t=f,n.v=c,delete n.w,delete n.R,h&&(n.z=h)):i[p]=n={t:f,v:c},h&&(n.z=h)):i[p]=c})}),f.e.c=Math.max(f.e.c,l+u.length-1);var p=Yt(o);if(s)for(d=0;d=65535)throw new Error("Too many worksheets");if(ul(r),e.SheetNames.indexOf(r)>=0)throw new Error("Worksheet with name |"+r+"| already exists!");e.SheetNames.push(r),e.Sheets[r]=t},e.book_set_sheet_visibility=function(e,r,n){t(e,"Workbook",{}),t(e.Workbook,"Sheets",[]);var a=function(e,t){if("number"==typeof t){if(t>=0&&e.SheetNames.length>t)return t;throw new Error("Cannot find sheet # "+t)}if("string"==typeof t){var r=e.SheetNames.indexOf(t);if(r>-1)return r;throw new Error("Cannot find sheet name |"+t+"|")}throw new Error("Cannot find sheet |"+t+"|")}(e,r);switch(t(e.Workbook.Sheets,a,{}),n){case 0:case 1:case 2:break;default:throw new Error("Bad sheet visibility setting "+n)}e.Workbook.Sheets[a].Hidden=n},[["SHEET_VISIBLE",0],["SHEET_HIDDEN",1],["SHEET_VERY_HIDDEN",2]].forEach(function(t){e.consts[t[0]]=t[1]}),e.cell_set_number_format=function(e,t){return e.z=t,e},e.cell_set_hyperlink=function(e,t,r){return t?(e.l={Target:t},r&&(e.l.Tooltip=r)):delete e.l,e},e.cell_set_internal_link=function(t,r,n){return e.cell_set_hyperlink(t,"#"+r,n)},e.cell_add_comment=function(e,t,r){e.c||(e.c=[]),e.c.push({t,a:r||"SheetJS"})},e.sheet_set_array_formula=function(e,t,n){for(var a="string"!=typeof t?t:rr(t),s="string"==typeof t?t:tr(t),i=a.s.r;i<=a.e.r;++i)for(var o=a.s.c;o<=a.e.c;++o){var l=r(e,i,o);l.t="n",l.F=s,delete l.v,i==a.s.r&&o==a.s.c&&(l.f=n)}return e}}(ef),v&&function(){var e=r(9800);if(e){var n=e.Readable;n&&(t.stream={to_json:function(e,t){var r=n({objectMode:!0});if(null==e||null==e["!ref"])return r.push(null),r;var a={t:"n",v:0},s=0,i=1,o=[],l=0,c="",f={s:{r:0,c:0},e:{r:0,c:0}},h=t||{},u=null!=h.range?h.range:e["!ref"];switch(1===h.header?s=1:"A"===h.header?s=2:Array.isArray(h.header)&&(s=3),typeof u){case"string":f=rr(u);break;case"number":(f=rr(e["!ref"])).s.r=u;break;default:f=u}s>0&&(i=0);var d=Yt(f.s.r),p=[],g=0,m=Array.isArray(e),v=f.s.r,b=0,w=0;for(m&&!e[v]&&(e[v]=[]),b=f.s.c;b<=f.e.c;++b)switch(p[b]=Qt(b),a=m?e[v][b]:e[p[b]+d],s){case 1:o[b]=b-f.s.c;break;case 2:o[b]=p[b];break;case 3:o[b]=h.header[b-f.s.c];break;default:for(null==a&&(a={w:"__EMPTY",t:"s"}),c=l=nr(a,null,h),g=0,w=0;wf.e.r)return r.push(null);for(;v<=f.e.r;){var t=jc(e,f,v,p,s,o,m,h);if(++v,!1===t.isempty||(1===s?!1!==h.blankrows:h.blankrows)){r.push(t.row);break}}},r},to_html:function(e,t){var r=n(),a=t||{},s=null!=a.header?a.header:ac.BEGIN,i=null!=a.footer?a.footer:ac.END;r.push(s);var o=er(e["!ref"]);a.dense=Array.isArray(e),r.push(ac._preamble(e,o,a));var l=o.s.r,c=!1;return r._read=function(){if(l>o.e.r)return c||(c=!0,r.push(""+i)),r.push(null);for(;l<=o.e.r;){r.push(ac._row(e,o,l,a)),++l;break}},r},to_csv:function(e,t){var r=n(),a=null==t?{}:t;if(null==e||null==e["!ref"])return r.push(null),r;var s=rr(e["!ref"]),i=void 0!==a.FS?a.FS:",",o=i.charCodeAt(0),l=void 0!==a.RS?a.RS:"\n",c=l.charCodeAt(0),f=new RegExp(("|"==i?"\\|":i)+"+$"),h="",u=[];a.dense=Array.isArray(e);for(var d=a.skipHidden&&e["!cols"]||[],p=a.skipHidden&&e["!rows"]||[],g=s.s.c;g<=s.e.c;++g)(d[g]||{}).hidden||(u[g]=Qt(g));var m=s.s.r,v=!1;return r._read=function(){if(!v)return v=!0,r.push("\ufeff");for(;m<=s.e.r;)if(++m,!(p[m-1]||{}).hidden&&null!=(h=Yc(e,s,m-1,u,o,c,i,a))){a.strip&&(h=h.replace(f,"")),r.push(h+l);break}return m>s.e.r?r.push(null):void 0},r}})}}(),void 0!==jl&&(t.parse_xlscfb=jl),t.parse_zip=Oc,t.read=Mc,t.readFile=Uc,t.readFileSync=Uc,t.write=Vc,t.writeFile=Gc,t.writeFileSync=Gc,t.writeFileAsync=function(e,t,r,n){var a=r||{};a.type="file",a.file=e,Xc(a),a.type="buffer";var s=n;return s instanceof Function||(s=r),N.writeFile(e,Vc(t,a),s)},t.utils=ef,t.SSF=x,void 0!==P&&(t.CFB=P)}(t),"undefined"!=typeof window&&!window.XLSX)try{window.XLSX={}}catch(e){}},6251(){},7233(){},9800(){}}]); +(self.webpackChunkdash_table=self.webpackChunkdash_table||[]).push([[404],{1454:function(e){var t={version:"1.15.0"};t[437]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[620]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàąçêëèïîćÄĄĘęłôöĆûùŚÖܢ٥śƒŹŻóÓńŃźż¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[737]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[850]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[852]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘ꬟Ⱥ«»░▒▓│┤ÁÂĚŞ╣║╗╝Żż┐└┴┬├─┼Ăă╚╔╩╦╠═╬¤đĐĎËďŇÍÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÝţ´­˝˛ˇ˘§÷¸°¨˙űŘř■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[857]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞ𿮬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ºªÊËÈ�ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµ�×ÚÛÙìÿ¯´­±�¾¶§÷¸°¨·¹³²■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[861]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèÐðÞÄÅÉæÆôöþûÝýÖÜø£Ø₧ƒáíóúÁÍÓÚ¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[865]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñѪº¿⌐¬½¼¡«¤░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[866]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[874]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€����…�����������‘’“”•–—�������� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[895]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ČüéďäĎŤčěĚĹÍľǪÄÁÉžŽôöÓůÚýÖÜŠĽÝŘťáíóúňŇŮÔšřŕŔ¼§«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[932]=function(){var e,t=[],r={},n=[];for(n[0]="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~���������������������������������。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚��������������������������������".split(""),e=0;e!=n[0].length;++e)65533!==n[0][e].charCodeAt(0)&&(r[n[0][e]]=0+e,t[0+e]=n[0][e]);for(n[129]="���������������������������������������������������������������� 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈〉《》「」『』【】+-±×�÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓�����������∈∋⊆⊇⊂⊃∪∩��������∧∨¬⇒⇔∀∃�����������∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬�������ʼn♯♭♪†‡¶����◯���".split(""),e=0;e!=n[129].length;++e)65533!==n[129][e].charCodeAt(0)&&(r[n[129][e]]=33024+e,t[33024+e]=n[129][e]);for(n[130]="�������������������������������������������������������������������������������0123456789�������ABCDEFGHIJKLMNOPQRSTUVWXYZ�������abcdefghijklmnopqrstuvwxyz����ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん��������������".split(""),e=0;e!=n[130].length;++e)65533!==n[130][e].charCodeAt(0)&&(r[n[130][e]]=33280+e,t[33280+e]=n[130][e]);for(n[131]="����������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミ�ムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ��������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�����������������������������������������".split(""),e=0;e!=n[131].length;++e)65533!==n[131][e].charCodeAt(0)&&(r[n[131][e]]=33536+e,t[33536+e]=n[131][e]);for(n[132]="����������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмн�опрстуфхцчшщъыьэюя�������������─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂�����������������������������������������������������������������".split(""),e=0;e!=n[132].length;++e)65533!==n[132][e].charCodeAt(0)&&(r[n[132][e]]=33792+e,t[33792+e]=n[132][e]);for(n[135]="����������������������������������������������������������������①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ�㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡��������㍻�〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪���������������������������������������������������������������������������������������������������".split(""),e=0;e!=n[135].length;++e)65533!==n[135][e].charCodeAt(0)&&(r[n[135][e]]=34560+e,t[34560+e]=n[135][e]);for(n[136]="���������������������������������������������������������������������������������������������������������������������������������������������������������������亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭���".split(""),e=0;e!=n[136].length;++e)65533!==n[136][e].charCodeAt(0)&&(r[n[136][e]]=34816+e,t[34816+e]=n[136][e]);for(n[137]="����������������������������������������������������������������院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円�園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改���".split(""),e=0;e!=n[137].length;++e)65533!==n[137][e].charCodeAt(0)&&(r[n[137][e]]=35072+e,t[35072+e]=n[137][e]);for(n[138]="����������������������������������������������������������������魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫�橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄���".split(""),e=0;e!=n[138].length;++e)65533!==n[138][e].charCodeAt(0)&&(r[n[138][e]]=35328+e,t[35328+e]=n[138][e]);for(n[139]="����������������������������������������������������������������機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救�朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈���".split(""),e=0;e!=n[139].length;++e)65533!==n[139][e].charCodeAt(0)&&(r[n[139][e]]=35584+e,t[35584+e]=n[139][e]);for(n[140]="����������������������������������������������������������������掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨�劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向���".split(""),e=0;e!=n[140].length;++e)65533!==n[140][e].charCodeAt(0)&&(r[n[140][e]]=35840+e,t[35840+e]=n[140][e]);for(n[141]="����������������������������������������������������������������后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降�項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷���".split(""),e=0;e!=n[141].length;++e)65533!==n[141][e].charCodeAt(0)&&(r[n[141][e]]=36096+e,t[36096+e]=n[141][e]);for(n[142]="����������������������������������������������������������������察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止�死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周���".split(""),e=0;e!=n[142].length;++e)65533!==n[142][e].charCodeAt(0)&&(r[n[142][e]]=36352+e,t[36352+e]=n[142][e]);for(n[143]="����������������������������������������������������������������宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳�準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾���".split(""),e=0;e!=n[143].length;++e)65533!==n[143][e].charCodeAt(0)&&(r[n[143][e]]=36608+e,t[36608+e]=n[143][e]);for(n[144]="����������������������������������������������������������������拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨�逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線���".split(""),e=0;e!=n[144].length;++e)65533!==n[144][e].charCodeAt(0)&&(r[n[144][e]]=36864+e,t[36864+e]=n[144][e]);for(n[145]="����������������������������������������������������������������繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻�操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只���".split(""),e=0;e!=n[145].length;++e)65533!==n[145][e].charCodeAt(0)&&(r[n[145][e]]=37120+e,t[37120+e]=n[145][e]);for(n[146]="����������������������������������������������������������������叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄�逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓���".split(""),e=0;e!=n[146].length;++e)65533!==n[146][e].charCodeAt(0)&&(r[n[146][e]]=37376+e,t[37376+e]=n[146][e]);for(n[147]="����������������������������������������������������������������邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬�凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入���".split(""),e=0;e!=n[147].length;++e)65533!==n[147][e].charCodeAt(0)&&(r[n[147][e]]=37632+e,t[37632+e]=n[147][e]);for(n[148]="����������������������������������������������������������������如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅�楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美���".split(""),e=0;e!=n[148].length;++e)65533!==n[148][e].charCodeAt(0)&&(r[n[148][e]]=37888+e,t[37888+e]=n[148][e]);for(n[149]="����������������������������������������������������������������鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷�斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋���".split(""),e=0;e!=n[149].length;++e)65533!==n[149][e].charCodeAt(0)&&(r[n[149][e]]=38144+e,t[38144+e]=n[149][e]);for(n[150]="����������������������������������������������������������������法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆�摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒���".split(""),e=0;e!=n[150].length;++e)65533!==n[150][e].charCodeAt(0)&&(r[n[150][e]]=38400+e,t[38400+e]=n[150][e]);for(n[151]="����������������������������������������������������������������諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲�沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯���".split(""),e=0;e!=n[151].length;++e)65533!==n[151][e].charCodeAt(0)&&(r[n[151][e]]=38656+e,t[38656+e]=n[151][e]);for(n[152]="����������������������������������������������������������������蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕��������������������������������������������弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲���".split(""),e=0;e!=n[152].length;++e)65533!==n[152][e].charCodeAt(0)&&(r[n[152][e]]=38912+e,t[38912+e]=n[152][e]);for(n[153]="����������������������������������������������������������������僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭�凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨���".split(""),e=0;e!=n[153].length;++e)65533!==n[153][e].charCodeAt(0)&&(r[n[153][e]]=39168+e,t[39168+e]=n[153][e]);for(n[154]="����������������������������������������������������������������咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸�噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩���".split(""),e=0;e!=n[154].length;++e)65533!==n[154][e].charCodeAt(0)&&(r[n[154][e]]=39424+e,t[39424+e]=n[154][e]);for(n[155]="����������������������������������������������������������������奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀�它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏���".split(""),e=0;e!=n[155].length;++e)65533!==n[155][e].charCodeAt(0)&&(r[n[155][e]]=39680+e,t[39680+e]=n[155][e]);for(n[156]="����������������������������������������������������������������廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠�怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛���".split(""),e=0;e!=n[156].length;++e)65533!==n[156][e].charCodeAt(0)&&(r[n[156][e]]=39936+e,t[39936+e]=n[156][e]);for(n[157]="����������������������������������������������������������������戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫�捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼���".split(""),e=0;e!=n[157].length;++e)65533!==n[157][e].charCodeAt(0)&&(r[n[157][e]]=40192+e,t[40192+e]=n[157][e]);for(n[158]="����������������������������������������������������������������曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎�梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣���".split(""),e=0;e!=n[158].length;++e)65533!==n[158][e].charCodeAt(0)&&(r[n[158][e]]=40448+e,t[40448+e]=n[158][e]);for(n[159]="����������������������������������������������������������������檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯�麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌���".split(""),e=0;e!=n[159].length;++e)65533!==n[159][e].charCodeAt(0)&&(r[n[159][e]]=40704+e,t[40704+e]=n[159][e]);for(n[224]="����������������������������������������������������������������漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝�烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱���".split(""),e=0;e!=n[224].length;++e)65533!==n[224][e].charCodeAt(0)&&(r[n[224][e]]=57344+e,t[57344+e]=n[224][e]);for(n[225]="����������������������������������������������������������������瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿�痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬���".split(""),e=0;e!=n[225].length;++e)65533!==n[225][e].charCodeAt(0)&&(r[n[225][e]]=57600+e,t[57600+e]=n[225][e]);for(n[226]="����������������������������������������������������������������磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰�窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆���".split(""),e=0;e!=n[226].length;++e)65533!==n[226][e].charCodeAt(0)&&(r[n[226][e]]=57856+e,t[57856+e]=n[226][e]);for(n[227]="����������������������������������������������������������������紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷�縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋���".split(""),e=0;e!=n[227].length;++e)65533!==n[227][e].charCodeAt(0)&&(r[n[227][e]]=58112+e,t[58112+e]=n[227][e]);for(n[228]="����������������������������������������������������������������隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤�艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈���".split(""),e=0;e!=n[228].length;++e)65533!==n[228][e].charCodeAt(0)&&(r[n[228][e]]=58368+e,t[58368+e]=n[228][e]);for(n[229]="����������������������������������������������������������������蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬�蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞���".split(""),e=0;e!=n[229].length;++e)65533!==n[229][e].charCodeAt(0)&&(r[n[229][e]]=58624+e,t[58624+e]=n[229][e]);for(n[230]="����������������������������������������������������������������襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧�諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊���".split(""),e=0;e!=n[230].length;++e)65533!==n[230][e].charCodeAt(0)&&(r[n[230][e]]=58880+e,t[58880+e]=n[230][e]);for(n[231]="����������������������������������������������������������������蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜�轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮���".split(""),e=0;e!=n[231].length;++e)65533!==n[231][e].charCodeAt(0)&&(r[n[231][e]]=59136+e,t[59136+e]=n[231][e]);for(n[232]="����������������������������������������������������������������錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙�閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰���".split(""),e=0;e!=n[232].length;++e)65533!==n[232][e].charCodeAt(0)&&(r[n[232][e]]=59392+e,t[59392+e]=n[232][e]);for(n[233]="����������������������������������������������������������������顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃�騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈���".split(""),e=0;e!=n[233].length;++e)65533!==n[233][e].charCodeAt(0)&&(r[n[233][e]]=59648+e,t[59648+e]=n[233][e]);for(n[234]="����������������������������������������������������������������鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯�黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙�������������������������������������������������������������������������������������������".split(""),e=0;e!=n[234].length;++e)65533!==n[234][e].charCodeAt(0)&&(r[n[234][e]]=59904+e,t[59904+e]=n[234][e]);for(n[237]="����������������������������������������������������������������纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏�塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱���".split(""),e=0;e!=n[237].length;++e)65533!==n[237][e].charCodeAt(0)&&(r[n[237][e]]=60672+e,t[60672+e]=n[237][e]);for(n[238]="����������������������������������������������������������������犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙�蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑��ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ¬¦'"���".split(""),e=0;e!=n[238].length;++e)65533!==n[238][e].charCodeAt(0)&&(r[n[238][e]]=60928+e,t[60928+e]=n[238][e]);for(n[250]="����������������������������������������������������������������ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ¬¦'"㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊�兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯���".split(""),e=0;e!=n[250].length;++e)65533!==n[250][e].charCodeAt(0)&&(r[n[250][e]]=64e3+e,t[64e3+e]=n[250][e]);for(n[251]="����������������������������������������������������������������涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神�祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙���".split(""),e=0;e!=n[251].length;++e)65533!==n[251][e].charCodeAt(0)&&(r[n[251][e]]=64256+e,t[64256+e]=n[251][e]);for(n[252]="����������������������������������������������������������������髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������".split(""),e=0;e!=n[252].length;++e)65533!==n[252][e].charCodeAt(0)&&(r[n[252][e]]=64512+e,t[64512+e]=n[252][e]);return{enc:r,dec:t}}(),t[936]=function(){var e,t=[],r={},n=[];for(n[0]="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�������������������������������������������������������������������������������������������������������������������������������".split(""),e=0;e!=n[0].length;++e)65533!==n[0][e].charCodeAt(0)&&(r[n[0][e]]=0+e,t[0+e]=n[0][e]);for(n[129]="����������������������������������������������������������������丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪乫乬乭乮乯乲乴乵乶乷乸乹乺乻乼乽乿亀亁亂亃亄亅亇亊�亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂伃伄伅伆伇伈伋伌伒伓伔伕伖伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾伿佀佁佂佄佅佇佈佉佊佋佌佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢�".split(""),e=0;e!=n[129].length;++e)65533!==n[129][e].charCodeAt(0)&&(r[n[129][e]]=33024+e,t[33024+e]=n[129][e]);for(n[130]="����������������������������������������������������������������侤侫侭侰侱侲侳侴侶侷侸侹侺侻侼侽侾俀俁係俆俇俈俉俋俌俍俒俓俔俕俖俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿倀倁倂倃倄倅倆倇倈倉倊�個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯倰倱倲倳倴倵倶倷倸倹倻倽倿偀偁偂偄偅偆偉偊偋偍偐偑偒偓偔偖偗偘偙偛偝偞偟偠偡偢偣偤偦偧偨偩偪偫偭偮偯偰偱偲偳側偵偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎傏傐傑傒傓傔傕傖傗傘備傚傛傜傝傞傟傠傡傢傤傦傪傫傭傮傯傰傱傳傴債傶傷傸傹傼�".split(""),e=0;e!=n[130].length;++e)65533!==n[130][e].charCodeAt(0)&&(r[n[130][e]]=33280+e,t[33280+e]=n[130][e]);for(n[131]="����������������������������������������������������������������傽傾傿僀僁僂僃僄僅僆僇僈僉僊僋僌働僎僐僑僒僓僔僕僗僘僙僛僜僝僞僟僠僡僢僣僤僥僨僩僪僫僯僰僱僲僴僶僷僸價僺僼僽僾僿儀儁儂儃億儅儈�儉儊儌儍儎儏儐儑儓儔儕儖儗儘儙儚儛儜儝儞償儠儢儣儤儥儦儧儨儩優儫儬儭儮儯儰儱儲儳儴儵儶儷儸儹儺儻儼儽儾兂兇兊兌兎兏児兒兓兗兘兙兛兝兞兟兠兡兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦冧冨冩冪冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒凓凔凕凖凗�".split(""),e=0;e!=n[131].length;++e)65533!==n[131][e].charCodeAt(0)&&(r[n[131][e]]=33536+e,t[33536+e]=n[131][e]);for(n[132]="����������������������������������������������������������������凘凙凚凜凞凟凢凣凥処凧凨凩凪凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄剅剆則剈剉剋剎剏剒剓剕剗剘�剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳剴創剶剷剸剹剺剻剼剾劀劃劄劅劆劇劉劊劋劌劍劎劏劑劒劔劕劖劗劘劙劚劜劤劥劦劧劮劯劰労劵劶劷劸効劺劻劼劽勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務勚勛勜勝勞勠勡勢勣勥勦勧勨勩勪勫勬勭勮勯勱勲勳勴勵勶勷勸勻勼勽匁匂匃匄匇匉匊匋匌匎�".split(""),e=0;e!=n[132].length;++e)65533!==n[132][e].charCodeAt(0)&&(r[n[132][e]]=33792+e,t[33792+e]=n[132][e]);for(n[133]="����������������������������������������������������������������匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯匰匱匲匳匴匵匶匷匸匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏�厐厑厒厓厔厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯厰厱厲厳厴厵厷厸厹厺厼厽厾叀參叄叅叆叇収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝呞呟呠呡呣呥呧呩呪呫呬呭呮呯呰呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡�".split(""),e=0;e!=n[133].length;++e)65533!==n[133][e].charCodeAt(0)&&(r[n[133][e]]=34048+e,t[34048+e]=n[133][e]);for(n[134]="����������������������������������������������������������������咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠員哢哣哤哫哬哯哰哱哴哵哶哷哸哹哻哾唀唂唃唄唅唈唊唋唌唍唎唒唓唕唖唗唘唙唚唜唝唞唟唡唥唦�唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋啌啍啎問啑啒啓啔啗啘啙啚啛啝啞啟啠啢啣啨啩啫啯啰啱啲啳啴啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠喡喢喣喤喥喦喨喩喪喫喬喭單喯喰喲喴営喸喺喼喿嗀嗁嗂嗃嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗嗘嗙嗚嗛嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸嗹嗺嗻嗼嗿嘂嘃嘄嘅�".split(""),e=0;e!=n[134].length;++e)65533!==n[134][e].charCodeAt(0)&&(r[n[134][e]]=34304+e,t[34304+e]=n[134][e]);for(n[135]="����������������������������������������������������������������嘆嘇嘊嘋嘍嘐嘑嘒嘓嘔嘕嘖嘗嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀噁噂噃噄噅噆噇噈噉噊噋噏噐噑噒噓噕噖噚噛噝噞噟噠噡�噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽噾噿嚀嚁嚂嚃嚄嚇嚈嚉嚊嚋嚌嚍嚐嚑嚒嚔嚕嚖嚗嚘嚙嚚嚛嚜嚝嚞嚟嚠嚡嚢嚤嚥嚦嚧嚨嚩嚪嚫嚬嚭嚮嚰嚱嚲嚳嚴嚵嚶嚸嚹嚺嚻嚽嚾嚿囀囁囂囃囄囅囆囇囈囉囋囌囍囎囏囐囑囒囓囕囖囘囙囜団囥囦囧囨囩囪囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國圌圍圎圏圐圑�".split(""),e=0;e!=n[135].length;++e)65533!==n[135][e].charCodeAt(0)&&(r[n[135][e]]=34560+e,t[34560+e]=n[135][e]);for(n[136]="����������������������������������������������������������������園圓圔圕圖圗團圙圚圛圝圞圠圡圢圤圥圦圧圫圱圲圴圵圶圷圸圼圽圿坁坃坄坅坆坈坉坋坒坓坔坕坖坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀�垁垇垈垉垊垍垎垏垐垑垔垕垖垗垘垙垚垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹垺垻垼垽垾垿埀埁埄埅埆埇埈埉埊埌埍埐埑埓埖埗埛埜埞埡埢埣埥埦埧埨埩埪埫埬埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥堦堧堨堩堫堬堭堮堯報堲堳場堶堷堸堹堺堻堼堽�".split(""),e=0;e!=n[136].length;++e)65533!==n[136][e].charCodeAt(0)&&(r[n[136][e]]=34816+e,t[34816+e]=n[136][e]);for(n[137]="����������������������������������������������������������������堾堿塀塁塂塃塅塆塇塈塉塊塋塎塏塐塒塓塕塖塗塙塚塛塜塝塟塠塡塢塣塤塦塧塨塩塪塭塮塯塰塱塲塳塴塵塶塷塸塹塺塻塼塽塿墂墄墆墇墈墊墋墌�墍墎墏墐墑墔墕墖増墘墛墜墝墠墡墢墣墤墥墦墧墪墫墬墭墮墯墰墱墲墳墴墵墶墷墸墹墺墻墽墾墿壀壂壃壄壆壇壈壉壊壋壌壍壎壏壐壒壓壔壖壗壘壙壚壛壜壝壞壟壠壡壢壣壥壦壧壨壩壪壭壯壱売壴壵壷壸壺壻壼壽壾壿夀夁夃夅夆夈変夊夋夌夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻�".split(""),e=0;e!=n[137].length;++e)65533!==n[137][e].charCodeAt(0)&&(r[n[137][e]]=35072+e,t[35072+e]=n[137][e]);for(n[138]="����������������������������������������������������������������夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛奜奝奞奟奡奣奤奦奧奨奩奪奫奬奭奮奯奰奱奲奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦�妧妬妭妰妱妳妴妵妶妷妸妺妼妽妿姀姁姂姃姄姅姇姈姉姌姍姎姏姕姖姙姛姞姟姠姡姢姤姦姧姩姪姫姭姮姯姰姱姲姳姴姵姶姷姸姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪娫娬娭娮娯娰娳娵娷娸娹娺娻娽娾娿婁婂婃婄婅婇婈婋婌婍婎婏婐婑婒婓婔婖婗婘婙婛婜婝婞婟婠�".split(""),e=0;e!=n[138].length;++e)65533!==n[138][e].charCodeAt(0)&&(r[n[138][e]]=35328+e,t[35328+e]=n[138][e]);for(n[139]="����������������������������������������������������������������婡婣婤婥婦婨婩婫婬婭婮婯婰婱婲婳婸婹婻婼婽婾媀媁媂媃媄媅媆媇媈媉媊媋媌媍媎媏媐媑媓媔媕媖媗媘媙媜媝媞媟媠媡媢媣媤媥媦媧媨媩媫媬�媭媮媯媰媱媴媶媷媹媺媻媼媽媿嫀嫃嫄嫅嫆嫇嫈嫊嫋嫍嫎嫏嫐嫑嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬嫭嫮嫯嫰嫲嫳嫴嫵嫶嫷嫸嫹嫺嫻嫼嫽嫾嫿嬀嬁嬂嬃嬄嬅嬆嬇嬈嬊嬋嬌嬍嬎嬏嬐嬑嬒嬓嬔嬕嬘嬙嬚嬛嬜嬝嬞嬟嬠嬡嬢嬣嬤嬥嬦嬧嬨嬩嬪嬫嬬嬭嬮嬯嬰嬱嬳嬵嬶嬸嬹嬺嬻嬼嬽嬾嬿孁孂孃孄孅孆孇�".split(""),e=0;e!=n[139].length;++e)65533!==n[139][e].charCodeAt(0)&&(r[n[139][e]]=35584+e,t[35584+e]=n[139][e]);for(n[140]="����������������������������������������������������������������孈孉孊孋孌孍孎孏孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏�寑寔寕寖寗寘寙寚寛寜寠寢寣實寧審寪寫寬寭寯寱寲寳寴寵寶寷寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧屨屩屪屫屬屭屰屲屳屴屵屶屷屸屻屼屽屾岀岃岄岅岆岇岉岊岋岎岏岒岓岕岝岞岟岠岡岤岥岦岧岨�".split(""),e=0;e!=n[140].length;++e)65533!==n[140][e].charCodeAt(0)&&(r[n[140][e]]=35840+e,t[35840+e]=n[140][e]);for(n[141]="����������������������������������������������������������������岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅峆峇峈峉峊峌峍峎峏峐峑峓峔峕峖峗峘峚峛峜峝峞峟峠峢峣峧峩峫峬峮峯峱峲峳峴峵島峷峸峹峺峼峽峾峿崀�崁崄崅崈崉崊崋崌崍崏崐崑崒崓崕崗崘崙崚崜崝崟崠崡崢崣崥崨崪崫崬崯崰崱崲崳崵崶崷崸崹崺崻崼崿嵀嵁嵂嵃嵄嵅嵆嵈嵉嵍嵎嵏嵐嵑嵒嵓嵔嵕嵖嵗嵙嵚嵜嵞嵟嵠嵡嵢嵣嵤嵥嵦嵧嵨嵪嵭嵮嵰嵱嵲嵳嵵嵶嵷嵸嵹嵺嵻嵼嵽嵾嵿嶀嶁嶃嶄嶅嶆嶇嶈嶉嶊嶋嶌嶍嶎嶏嶐嶑嶒嶓嶔嶕嶖嶗嶘嶚嶛嶜嶞嶟嶠�".split(""),e=0;e!=n[141].length;++e)65533!==n[141][e].charCodeAt(0)&&(r[n[141][e]]=36096+e,t[36096+e]=n[141][e]);for(n[142]="����������������������������������������������������������������嶡嶢嶣嶤嶥嶦嶧嶨嶩嶪嶫嶬嶭嶮嶯嶰嶱嶲嶳嶴嶵嶶嶸嶹嶺嶻嶼嶽嶾嶿巀巁巂巃巄巆巇巈巉巊巋巌巎巏巐巑巒巓巔巕巖巗巘巙巚巜巟巠巣巤巪巬巭�巰巵巶巸巹巺巻巼巿帀帄帇帉帊帋帍帎帒帓帗帞帟帠帡帢帣帤帥帨帩帪師帬帯帰帲帳帴帵帶帹帺帾帿幀幁幃幆幇幈幉幊幋幍幎幏幐幑幒幓幖幗幘幙幚幜幝幟幠幣幤幥幦幧幨幩幪幫幬幭幮幯幰幱幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨庩庪庫庬庮庯庰庱庲庴庺庻庼庽庿廀廁廂廃廄廅�".split(""),e=0;e!=n[142].length;++e)65533!==n[142][e].charCodeAt(0)&&(r[n[142][e]]=36352+e,t[36352+e]=n[142][e]);for(n[143]="����������������������������������������������������������������廆廇廈廋廌廍廎廏廐廔廕廗廘廙廚廜廝廞廟廠廡廢廣廤廥廦廧廩廫廬廭廮廯廰廱廲廳廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤�弨弫弬弮弰弲弳弴張弶強弸弻弽弾弿彁彂彃彄彅彆彇彈彉彊彋彌彍彎彏彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢徣徤徥徦徧復徫徬徯徰徱徲徳徴徶徸徹徺徻徾徿忀忁忂忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇�".split(""),e=0;e!=n[143].length;++e)65533!==n[143][e].charCodeAt(0)&&(r[n[143][e]]=36608+e,t[36608+e]=n[143][e]);for(n[144]="����������������������������������������������������������������怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰怱怲怳怴怶怷怸怹怺怽怾恀恄恅恆恇恈恉恊恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀�悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽悾悿惀惁惂惃惄惇惈惉惌惍惎惏惐惒惓惔惖惗惙惛惞惡惢惣惤惥惪惱惲惵惷惸惻惼惽惾惿愂愃愄愅愇愊愋愌愐愑愒愓愔愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬愭愮愯愰愱愲愳愴愵愶愷愸愹愺愻愼愽愾慀慁慂慃慄慅慆�".split(""),e=0;e!=n[144].length;++e)65533!==n[144][e].charCodeAt(0)&&(r[n[144][e]]=36864+e,t[36864+e]=n[144][e]);for(n[145]="����������������������������������������������������������������慇慉態慍慏慐慒慓慔慖慗慘慙慚慛慜慞慟慠慡慣慤慥慦慩慪慫慬慭慮慯慱慲慳慴慶慸慹慺慻慼慽慾慿憀憁憂憃憄憅憆憇憈憉憊憌憍憏憐憑憒憓憕�憖憗憘憙憚憛憜憞憟憠憡憢憣憤憥憦憪憫憭憮憯憰憱憲憳憴憵憶憸憹憺憻憼憽憿懀懁懃懄懅懆懇應懌懍懎懏懐懓懕懖懗懘懙懚懛懜懝懞懟懠懡懢懣懤懥懧懨懩懪懫懬懭懮懯懰懱懲懳懴懶懷懸懹懺懻懼懽懾戀戁戂戃戄戅戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸戹戺戻戼扂扄扅扆扊�".split(""),e=0;e!=n[145].length;++e)65533!==n[145][e].charCodeAt(0)&&(r[n[145][e]]=37120+e,t[37120+e]=n[145][e]);for(n[146]="����������������������������������������������������������������扏扐払扖扗扙扚扜扝扞扟扠扡扢扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋抌抍抎抏抐抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁�拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳挴挵挶挷挸挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖捗捘捙捚捛捜捝捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙掚掛掜掝掞掟採掤掦掫掯掱掲掵掶掹掻掽掿揀�".split(""),e=0;e!=n[146].length;++e)65533!==n[146][e].charCodeAt(0)&&(r[n[146][e]]=37376+e,t[37376+e]=n[146][e]);for(n[147]="����������������������������������������������������������������揁揂揃揅揇揈揊揋揌揑揓揔揕揗揘揙揚換揜揝揟揢揤揥揦揧揨揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆搇搈搉搊損搎搑搒搕搖搗搘搙搚搝搟搢搣搤�搥搧搨搩搫搮搯搰搱搲搳搵搶搷搸搹搻搼搾摀摂摃摉摋摌摍摎摏摐摑摓摕摖摗摙摚摛摜摝摟摠摡摢摣摤摥摦摨摪摫摬摮摯摰摱摲摳摴摵摶摷摻摼摽摾摿撀撁撃撆撈撉撊撋撌撍撎撏撐撓撔撗撘撚撛撜撝撟撠撡撢撣撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆擇擈擉擊擋擌擏擑擓擔擕擖擙據�".split(""),e=0;e!=n[147].length;++e)65533!==n[147][e].charCodeAt(0)&&(r[n[147][e]]=37632+e,t[37632+e]=n[147][e]);for(n[148]="����������������������������������������������������������������擛擜擝擟擠擡擣擥擧擨擩擪擫擬擭擮擯擰擱擲擳擴擵擶擷擸擹擺擻擼擽擾擿攁攂攃攄攅攆攇攈攊攋攌攍攎攏攐攑攓攔攕攖攗攙攚攛攜攝攞攟攠攡�攢攣攤攦攧攨攩攪攬攭攰攱攲攳攷攺攼攽敀敁敂敃敄敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數敹敺敻敼敽敾敿斀斁斂斃斄斅斆斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱斲斳斴斵斶斷斸斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘旙旚旛旜旝旞旟旡旣旤旪旫�".split(""),e=0;e!=n[148].length;++e)65533!==n[148][e].charCodeAt(0)&&(r[n[148][e]]=37888+e,t[37888+e]=n[148][e]);for(n[149]="����������������������������������������������������������������旲旳旴旵旸旹旻旼旽旾旿昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷昸昹昺昻昽昿晀時晄晅晆晇晈晉晊晍晎晐晑晘�晙晛晜晝晞晠晢晣晥晧晩晪晫晬晭晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘暙暚暛暜暞暟暠暡暢暣暤暥暦暩暪暫暬暭暯暰暱暲暳暵暶暷暸暺暻暼暽暿曀曁曂曃曄曅曆曇曈曉曊曋曌曍曎曏曐曑曒曓曔曕曖曗曘曚曞曟曠曡曢曣曤曥曧曨曪曫曬曭曮曯曱曵曶書曺曻曽朁朂會�".split(""),e=0;e!=n[149].length;++e)65533!==n[149][e].charCodeAt(0)&&(r[n[149][e]]=38144+e,t[38144+e]=n[149][e]);for(n[150]="����������������������������������������������������������������朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠朡朢朣朤朥朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗杘杙杚杛杝杢杣杤杦杧杫杬杮東杴杶�杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹枺枻枼枽枾枿柀柂柅柆柇柈柉柊柋柌柍柎柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵柶柷柸柹柺査柼柾栁栂栃栄栆栍栐栒栔栕栘栙栚栛栜栞栟栠栢栣栤栥栦栧栨栫栬栭栮栯栰栱栴栵栶栺栻栿桇桋桍桏桒桖桗桘桙桚桛�".split(""),e=0;e!=n[150].length;++e)65533!==n[150][e].charCodeAt(0)&&(r[n[150][e]]=38400+e,t[38400+e]=n[150][e]);for(n[151]="����������������������������������������������������������������桜桝桞桟桪桬桭桮桯桰桱桲桳桵桸桹桺桻桼桽桾桿梀梂梄梇梈梉梊梋梌梍梎梐梑梒梔梕梖梘梙梚梛梜條梞梟梠梡梣梤梥梩梪梫梬梮梱梲梴梶梷梸�梹梺梻梼梽梾梿棁棃棄棅棆棇棈棊棌棎棏棐棑棓棔棖棗棙棛棜棝棞棟棡棢棤棥棦棧棨棩棪棫棬棭棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆椇椈椉椊椌椏椑椓椔椕椖椗椘椙椚椛検椝椞椡椢椣椥椦椧椨椩椪椫椬椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃楄楅楆楇楈楉楊楋楌楍楎楏楐楑楒楓楕楖楘楙楛楜楟�".split(""),e=0;e!=n[151].length;++e)65533!==n[151][e].charCodeAt(0)&&(r[n[151][e]]=38656+e,t[38656+e]=n[151][e]);for(n[152]="����������������������������������������������������������������楡楢楤楥楧楨楩楪楬業楯楰楲楳楴極楶楺楻楽楾楿榁榃榅榊榋榌榎榏榐榑榒榓榖榗榙榚榝榞榟榠榡榢榣榤榥榦榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽�榾榿槀槂槃槄槅槆槇槈槉構槍槏槑槒槓槕槖槗様槙槚槜槝槞槡槢槣槤槥槦槧槨槩槪槫槬槮槯槰槱槳槴槵槶槷槸槹槺槻槼槾樀樁樂樃樄樅樆樇樈樉樋樌樍樎樏樐樑樒樓樔樕樖標樚樛樜樝樞樠樢樣樤樥樦樧権樫樬樭樮樰樲樳樴樶樷樸樹樺樻樼樿橀橁橂橃橅橆橈橉橊橋橌橍橎橏橑橒橓橔橕橖橗橚�".split(""),e=0;e!=n[152].length;++e)65533!==n[152][e].charCodeAt(0)&&(r[n[152][e]]=38912+e,t[38912+e]=n[152][e]);for(n[153]="����������������������������������������������������������������橜橝橞機橠橢橣橤橦橧橨橩橪橫橬橭橮橯橰橲橳橴橵橶橷橸橺橻橽橾橿檁檂檃檅檆檇檈檉檊檋檌檍檏檒檓檔檕檖檘檙檚檛檜檝檞檟檡檢檣檤檥檦�檧檨檪檭檮檯檰檱檲檳檴檵檶檷檸檹檺檻檼檽檾檿櫀櫁櫂櫃櫄櫅櫆櫇櫈櫉櫊櫋櫌櫍櫎櫏櫐櫑櫒櫓櫔櫕櫖櫗櫘櫙櫚櫛櫜櫝櫞櫟櫠櫡櫢櫣櫤櫥櫦櫧櫨櫩櫪櫫櫬櫭櫮櫯櫰櫱櫲櫳櫴櫵櫶櫷櫸櫹櫺櫻櫼櫽櫾櫿欀欁欂欃欄欅欆欇欈欉權欋欌欍欎欏欐欑欒欓欔欕欖欗欘欙欚欛欜欝欞欟欥欦欨欩欪欫欬欭欮�".split(""),e=0;e!=n[153].length;++e)65533!==n[153][e].charCodeAt(0)&&(r[n[153][e]]=39168+e,t[39168+e]=n[153][e]);for(n[154]="����������������������������������������������������������������欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍歎歏歐歑歒歓歔歕歖歗歘歚歛歜歝歞歟歠歡歨歩歫歬歭歮歯歰歱歲歳歴歵歶歷歸歺歽歾歿殀殅殈�殌殎殏殐殑殔殕殗殘殙殜殝殞殟殠殢殣殤殥殦殧殨殩殫殬殭殮殯殰殱殲殶殸殹殺殻殼殽殾毀毃毄毆毇毈毉毊毌毎毐毑毘毚毜毝毞毟毠毢毣毤毥毦毧毨毩毬毭毮毰毱毲毴毶毷毸毺毻毼毾毿氀氁氂氃氄氈氉氊氋氌氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋汌汍汎汏汑汒汓汖汘�".split(""),e=0;e!=n[154].length;++e)65533!==n[154][e].charCodeAt(0)&&(r[n[154][e]]=39424+e,t[39424+e]=n[154][e]);for(n[155]="����������������������������������������������������������������汙汚汢汣汥汦汧汫汬汭汮汯汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘�泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟洠洡洢洣洤洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽浾浿涀涁涃涄涆涇涊涋涍涏涐涒涖涗涘涙涚涜涢涥涬涭涰涱涳涴涶涷涹涺涻涼涽涾淁淂淃淈淉淊�".split(""),e=0;e!=n[155].length;++e)65533!==n[155][e].charCodeAt(0)&&(r[n[155][e]]=39680+e,t[39680+e]=n[155][e]);for(n[156]="����������������������������������������������������������������淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽淾淿渀渁渂渃渄渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵�渶渷渹渻渼渽渾渿湀湁湂湅湆湇湈湉湊湋湌湏湐湑湒湕湗湙湚湜湝湞湠湡湢湣湤湥湦湧湨湩湪湬湭湯湰湱湲湳湴湵湶湷湸湹湺湻湼湽満溁溂溄溇溈溊溋溌溍溎溑溒溓溔溕準溗溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪滫滬滭滮滯�".split(""),e=0;e!=n[156].length;++e)65533!==n[156][e].charCodeAt(0)&&(r[n[156][e]]=39936+e,t[39936+e]=n[156][e]);for(n[157]="����������������������������������������������������������������滰滱滲滳滵滶滷滸滺滻滼滽滾滿漀漁漃漄漅漇漈漊漋漌漍漎漐漑漒漖漗漘漙漚漛漜漝漞漟漡漢漣漥漦漧漨漬漮漰漲漴漵漷漸漹漺漻漼漽漿潀潁潂�潃潄潅潈潉潊潌潎潏潐潑潒潓潔潕潖潗潙潚潛潝潟潠潡潣潤潥潧潨潩潪潫潬潯潰潱潳潵潶潷潹潻潽潾潿澀澁澂澃澅澆澇澊澋澏澐澑澒澓澔澕澖澗澘澙澚澛澝澞澟澠澢澣澤澥澦澨澩澪澫澬澭澮澯澰澱澲澴澵澷澸澺澻澼澽澾澿濁濃濄濅濆濇濈濊濋濌濍濎濏濐濓濔濕濖濗濘濙濚濛濜濝濟濢濣濤濥�".split(""),e=0;e!=n[157].length;++e)65533!==n[157][e].charCodeAt(0)&&(r[n[157][e]]=40192+e,t[40192+e]=n[157][e]);for(n[158]="����������������������������������������������������������������濦濧濨濩濪濫濬濭濰濱濲濳濴濵濶濷濸濹濺濻濼濽濾濿瀀瀁瀂瀃瀄瀅瀆瀇瀈瀉瀊瀋瀌瀍瀎瀏瀐瀒瀓瀔瀕瀖瀗瀘瀙瀜瀝瀞瀟瀠瀡瀢瀤瀥瀦瀧瀨瀩瀪�瀫瀬瀭瀮瀯瀰瀱瀲瀳瀴瀶瀷瀸瀺瀻瀼瀽瀾瀿灀灁灂灃灄灅灆灇灈灉灊灋灍灎灐灑灒灓灔灕灖灗灘灙灚灛灜灝灟灠灡灢灣灤灥灦灧灨灩灪灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞炟炠炡炢炣炤炥炦炧炨炩炪炰炲炴炵炶為炾炿烄烅烆烇烉烋烌烍烎烏烐烑烒烓烔烕烖烗烚�".split(""),e=0;e!=n[158].length;++e)65533!==n[158][e].charCodeAt(0)&&(r[n[158][e]]=40448+e,t[40448+e]=n[158][e]);for(n[159]="����������������������������������������������������������������烜烝烞烠烡烢烣烥烪烮烰烱烲烳烴烵烶烸烺烻烼烾烿焀焁焂焃焄焅焆焇焈焋焌焍焎焏焑焒焔焗焛焜焝焞焟焠無焢焣焤焥焧焨焩焪焫焬焭焮焲焳焴�焵焷焸焹焺焻焼焽焾焿煀煁煂煃煄煆煇煈煉煋煍煏煐煑煒煓煔煕煖煗煘煙煚煛煝煟煠煡煢煣煥煩煪煫煬煭煯煰煱煴煵煶煷煹煻煼煾煿熀熁熂熃熅熆熇熈熉熋熌熍熎熐熑熒熓熕熖熗熚熛熜熝熞熡熢熣熤熥熦熧熩熪熫熭熮熯熰熱熲熴熶熷熸熺熻熼熽熾熿燀燁燂燄燅燆燇燈燉燊燋燌燍燏燐燑燒燓�".split(""),e=0;e!=n[159].length;++e)65533!==n[159][e].charCodeAt(0)&&(r[n[159][e]]=40704+e,t[40704+e]=n[159][e]);for(n[160]="����������������������������������������������������������������燖燗燘燙燚燛燜燝燞營燡燢燣燤燦燨燩燪燫燬燭燯燰燱燲燳燴燵燶燷燸燺燻燼燽燾燿爀爁爂爃爄爅爇爈爉爊爋爌爍爎爏爐爑爒爓爔爕爖爗爘爙爚�爛爜爞爟爠爡爢爣爤爥爦爧爩爫爭爮爯爲爳爴爺爼爾牀牁牂牃牄牅牆牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅犆犇犈犉犌犎犐犑犓犔犕犖犗犘犙犚犛犜犝犞犠犡犢犣犤犥犦犧犨犩犪犫犮犱犲犳犵犺犻犼犽犾犿狀狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛�".split(""),e=0;e!=n[160].length;++e)65533!==n[160][e].charCodeAt(0)&&(r[n[160][e]]=40960+e,t[40960+e]=n[160][e]);for(n[161]="����������������������������������������������������������������������������������������������������������������������������������������������������������������� 、。·ˉˇ¨〃々—~‖…‘’“”〔〕〈〉《》「」『』〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓�".split(""),e=0;e!=n[161].length;++e)65533!==n[161][e].charCodeAt(0)&&(r[n[161][e]]=41216+e,t[41216+e]=n[161][e]);for(n[162]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ������⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩��㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩��ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ���".split(""),e=0;e!=n[162].length;++e)65533!==n[162][e].charCodeAt(0)&&(r[n[162][e]]=41472+e,t[41472+e]=n[162][e]);for(n[163]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������!"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�".split(""),e=0;e!=n[163].length;++e)65533!==n[163][e].charCodeAt(0)&&(r[n[163][e]]=41728+e,t[41728+e]=n[163][e]);for(n[164]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������".split(""),e=0;e!=n[164].length;++e)65533!==n[164][e].charCodeAt(0)&&(r[n[164][e]]=41984+e,t[41984+e]=n[164][e]);for(n[165]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������".split(""),e=0;e!=n[165].length;++e)65533!==n[165][e].charCodeAt(0)&&(r[n[165][e]]=42240+e,t[42240+e]=n[165][e]);for(n[166]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�������︵︶︹︺︿﹀︽︾﹁﹂﹃﹄��︻︼︷︸︱�︳︴����������".split(""),e=0;e!=n[166].length;++e)65533!==n[166][e].charCodeAt(0)&&(r[n[166][e]]=42496+e,t[42496+e]=n[166][e]);for(n[167]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������".split(""),e=0;e!=n[167].length;++e)65533!==n[167][e].charCodeAt(0)&&(r[n[167][e]]=42752+e,t[42752+e]=n[167][e]);for(n[168]="����������������������������������������������������������������ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳▁▂▃▄▅▆▇�█▉▊▋▌▍▎▏▓▔▕▼▽◢◣◤◥☉⊕〒〝〞�����������āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑ�ńň�ɡ����ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ����������������������".split(""),e=0;e!=n[168].length;++e)65533!==n[168][e].charCodeAt(0)&&(r[n[168][e]]=43008+e,t[43008+e]=n[168][e]);for(n[169]="����������������������������������������������������������������〡〢〣〤〥〦〧〨〩㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰¬¦�℡㈱�‐���ー゛゜ヽヾ〆ゝゞ﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹔﹕﹖﹗﹙﹚﹛﹜﹝﹞﹟﹠﹡�﹢﹣﹤﹥﹦﹨﹩﹪﹫�������������〇�������������─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋����������������".split(""),e=0;e!=n[169].length;++e)65533!==n[169][e].charCodeAt(0)&&(r[n[169][e]]=43264+e,t[43264+e]=n[169][e]);for(n[170]="����������������������������������������������������������������狜狝狟狢狣狤狥狦狧狪狫狵狶狹狽狾狿猀猂猄猅猆猇猈猉猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀獁獂獃獄獅獆獇獈�獉獊獋獌獎獏獑獓獔獕獖獘獙獚獛獜獝獞獟獡獢獣獤獥獦獧獨獩獪獫獮獰獱�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[170].length;++e)65533!==n[170][e].charCodeAt(0)&&(r[n[170][e]]=43520+e,t[43520+e]=n[170][e]);for(n[171]="����������������������������������������������������������������獲獳獴獵獶獷獸獹獺獻獼獽獿玀玁玂玃玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣玤玥玦玧玨玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃珄珅珆珇�珋珌珎珒珓珔珕珖珗珘珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳珴珵珶珷�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[171].length;++e)65533!==n[171][e].charCodeAt(0)&&(r[n[171][e]]=43776+e,t[43776+e]=n[171][e]);for(n[172]="����������������������������������������������������������������珸珹珺珻珼珽現珿琀琁琂琄琇琈琋琌琍琎琑琒琓琔琕琖琗琘琙琜琝琞琟琠琡琣琤琧琩琫琭琯琱琲琷琸琹琺琻琽琾琿瑀瑂瑃瑄瑅瑆瑇瑈瑉瑊瑋瑌瑍�瑎瑏瑐瑑瑒瑓瑔瑖瑘瑝瑠瑡瑢瑣瑤瑥瑦瑧瑨瑩瑪瑫瑬瑮瑯瑱瑲瑳瑴瑵瑸瑹瑺�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[172].length;++e)65533!==n[172][e].charCodeAt(0)&&(r[n[172][e]]=44032+e,t[44032+e]=n[172][e]);for(n[173]="����������������������������������������������������������������瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑璒璓璔璕璖璗璘璙璚璛璝璟璠璡璢璣璤璥璦璪璫璬璭璮璯環璱璲璳璴璵璶璷璸璹璻璼璽璾璿瓀瓁瓂瓃瓄瓅瓆瓇�瓈瓉瓊瓋瓌瓍瓎瓏瓐瓑瓓瓔瓕瓖瓗瓘瓙瓚瓛瓝瓟瓡瓥瓧瓨瓩瓪瓫瓬瓭瓰瓱瓲�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[173].length;++e)65533!==n[173][e].charCodeAt(0)&&(r[n[173][e]]=44288+e,t[44288+e]=n[173][e]);for(n[174]="����������������������������������������������������������������瓳瓵瓸瓹瓺瓻瓼瓽瓾甀甁甂甃甅甆甇甈甉甊甋甌甎甐甒甔甕甖甗甛甝甞甠甡產産甤甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘�畝畞畟畠畡畢畣畤畧畨畩畫畬畭畮畯異畱畳畵當畷畺畻畼畽畾疀疁疂疄疅疇�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[174].length;++e)65533!==n[174][e].charCodeAt(0)&&(r[n[174][e]]=44544+e,t[44544+e]=n[174][e]);for(n[175]="����������������������������������������������������������������疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦疧疨疩疪疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇�瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[175].length;++e)65533!==n[175][e].charCodeAt(0)&&(r[n[175][e]]=44800+e,t[44800+e]=n[175][e]);for(n[176]="����������������������������������������������������������������癅癆癇癈癉癊癋癎癏癐癑癒癓癕癗癘癙癚癛癝癟癠癡癢癤癥癦癧癨癩癪癬癭癮癰癱癲癳癴癵癶癷癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛�皜皝皞皟皠皡皢皣皥皦皧皨皩皪皫皬皭皯皰皳皵皶皷皸皹皺皻皼皽皾盀盁盃啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥�".split(""),e=0;e!=n[176].length;++e)65533!==n[176][e].charCodeAt(0)&&(r[n[176][e]]=45056+e,t[45056+e]=n[176][e]);for(n[177]="����������������������������������������������������������������盄盇盉盋盌盓盕盙盚盜盝盞盠盡盢監盤盦盧盨盩盪盫盬盭盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎眏眐眑眒眓眔眕眖眗眘眛眜眝眞眡眣眤眥眧眪眫�眬眮眰眱眲眳眴眹眻眽眾眿睂睄睅睆睈睉睊睋睌睍睎睏睒睓睔睕睖睗睘睙睜薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳�".split(""),e=0;e!=n[177].length;++e)65533!==n[177][e].charCodeAt(0)&&(r[n[177][e]]=45312+e,t[45312+e]=n[177][e]);for(n[178]="����������������������������������������������������������������睝睞睟睠睤睧睩睪睭睮睯睰睱睲睳睴睵睶睷睸睺睻睼瞁瞂瞃瞆瞇瞈瞉瞊瞋瞏瞐瞓瞔瞕瞖瞗瞘瞙瞚瞛瞜瞝瞞瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶瞷瞸瞹瞺�瞼瞾矀矁矂矃矄矅矆矇矈矉矊矋矌矎矏矐矑矒矓矔矕矖矘矙矚矝矞矟矠矡矤病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖�".split(""),e=0;e!=n[178].length;++e)65533!==n[178][e].charCodeAt(0)&&(r[n[178][e]]=45568+e,t[45568+e]=n[178][e]);for(n[179]="����������������������������������������������������������������矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃砄砅砆砇砈砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚�硛硜硞硟硠硡硢硣硤硥硦硧硨硩硯硰硱硲硳硴硵硶硸硹硺硻硽硾硿碀碁碂碃场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚�".split(""),e=0;e!=n[179].length;++e)65533!==n[179][e].charCodeAt(0)&&(r[n[179][e]]=45824+e,t[45824+e]=n[179][e]);for(n[180]="����������������������������������������������������������������碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨碩碪碫碬碭碮碯碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚磛磜磝磞磟磠磡磢磣�磤磥磦磧磩磪磫磭磮磯磰磱磳磵磶磸磹磻磼磽磾磿礀礂礃礄礆礇礈礉礊礋礌础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮�".split(""),e=0;e!=n[180].length;++e)65533!==n[180][e].charCodeAt(0)&&(r[n[180][e]]=46080+e,t[46080+e]=n[180][e]);for(n[181]="����������������������������������������������������������������礍礎礏礐礑礒礔礕礖礗礘礙礚礛礜礝礟礠礡礢礣礥礦礧礨礩礪礫礬礭礮礯礰礱礲礳礵礶礷礸礹礽礿祂祃祄祅祇祊祋祌祍祎祏祐祑祒祔祕祘祙祡祣�祤祦祩祪祫祬祮祰祱祲祳祴祵祶祹祻祼祽祾祿禂禃禆禇禈禉禋禌禍禎禐禑禒怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠�".split(""),e=0;e!=n[181].length;++e)65533!==n[181][e].charCodeAt(0)&&(r[n[181][e]]=46336+e,t[46336+e]=n[181][e]);for(n[182]="����������������������������������������������������������������禓禔禕禖禗禘禙禛禜禝禞禟禠禡禢禣禤禥禦禨禩禪禫禬禭禮禯禰禱禲禴禵禶禷禸禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙秚秛秜秝秞秠秡秢秥秨秪�秬秮秱秲秳秴秵秶秷秹秺秼秾秿稁稄稅稇稈稉稊稌稏稐稑稒稓稕稖稘稙稛稜丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二�".split(""),e=0;e!=n[182].length;++e)65533!==n[182][e].charCodeAt(0)&&(r[n[182][e]]=46592+e,t[46592+e]=n[182][e]);for(n[183]="����������������������������������������������������������������稝稟稡稢稤稥稦稧稨稩稪稫稬稭種稯稰稱稲稴稵稶稸稺稾穀穁穂穃穄穅穇穈穉穊穋穌積穎穏穐穒穓穔穕穖穘穙穚穛穜穝穞穟穠穡穢穣穤穥穦穧穨�穩穪穫穬穭穮穯穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服�".split(""),e=0;e!=n[183].length;++e)65533!==n[183][e].charCodeAt(0)&&(r[n[183][e]]=46848+e,t[46848+e]=n[183][e]);for(n[184]="����������������������������������������������������������������窣窤窧窩窪窫窮窯窰窱窲窴窵窶窷窸窹窺窻窼窽窾竀竁竂竃竄竅竆竇竈竉竊竌竍竎竏竐竑竒竓竔竕竗竘竚竛竜竝竡竢竤竧竨竩竪竫竬竮竰竱竲竳�竴竵競竷竸竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹�".split(""),e=0;e!=n[184].length;++e)65533!==n[184][e].charCodeAt(0)&&(r[n[184][e]]=47104+e,t[47104+e]=n[184][e]);for(n[185]="����������������������������������������������������������������笯笰笲笴笵笶笷笹笻笽笿筀筁筂筃筄筆筈筊筍筎筓筕筗筙筜筞筟筡筣筤筥筦筧筨筩筪筫筬筭筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆箇箈箉箊箋箌箎箏�箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹箺箻箼箽箾箿節篂篃範埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈�".split(""),e=0;e!=n[185].length;++e)65533!==n[185][e].charCodeAt(0)&&(r[n[185][e]]=47360+e,t[47360+e]=n[185][e]);for(n[186]="����������������������������������������������������������������篅篈築篊篋篍篎篏篐篒篔篕篖篗篘篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲篳篴篵篶篸篹篺篻篽篿簀簁簂簃簄簅簆簈簉簊簍簎簐簑簒簓簔簕簗簘簙�簚簛簜簝簞簠簡簢簣簤簥簨簩簫簬簭簮簯簰簱簲簳簴簵簶簷簹簺簻簼簽簾籂骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖�".split(""),e=0;e!=n[186].length;++e)65533!==n[186][e].charCodeAt(0)&&(r[n[186][e]]=47616+e,t[47616+e]=n[186][e]);for(n[187]="����������������������������������������������������������������籃籄籅籆籇籈籉籊籋籌籎籏籐籑籒籓籔籕籖籗籘籙籚籛籜籝籞籟籠籡籢籣籤籥籦籧籨籩籪籫籬籭籮籯籰籱籲籵籶籷籸籹籺籾籿粀粁粂粃粄粅粆粇�粈粊粋粌粍粎粏粐粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴粵粶粷粸粺粻弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕�".split(""),e=0;e!=n[187].length;++e)65533!==n[187][e].charCodeAt(0)&&(r[n[187][e]]=47872+e,t[47872+e]=n[187][e]);for(n[188]="����������������������������������������������������������������粿糀糂糃糄糆糉糋糎糏糐糑糒糓糔糘糚糛糝糞糡糢糣糤糥糦糧糩糪糫糬糭糮糰糱糲糳糴糵糶糷糹糺糼糽糾糿紀紁紂紃約紅紆紇紈紉紋紌納紎紏紐�紑紒紓純紕紖紗紘紙級紛紜紝紞紟紡紣紤紥紦紨紩紪紬紭紮細紱紲紳紴紵紶肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件�".split(""),e=0;e!=n[188].length;++e)65533!==n[188][e].charCodeAt(0)&&(r[n[188][e]]=48128+e,t[48128+e]=n[188][e]);for(n[189]="����������������������������������������������������������������紷紸紹紺紻紼紽紾紿絀絁終絃組絅絆絇絈絉絊絋経絍絎絏結絑絒絓絔絕絖絗絘絙絚絛絜絝絞絟絠絡絢絣絤絥給絧絨絩絪絫絬絭絯絰統絲絳絴絵絶�絸絹絺絻絼絽絾絿綀綁綂綃綄綅綆綇綈綉綊綋綌綍綎綏綐綑綒經綔綕綖綗綘健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸�".split(""),e=0;e!=n[189].length;++e)65533!==n[189][e].charCodeAt(0)&&(r[n[189][e]]=48384+e,t[48384+e]=n[189][e]);for(n[190]="����������������������������������������������������������������継続綛綜綝綞綟綠綡綢綣綤綥綧綨綩綪綫綬維綯綰綱網綳綴綵綶綷綸綹綺綻綼綽綾綿緀緁緂緃緄緅緆緇緈緉緊緋緌緍緎総緐緑緒緓緔緕緖緗緘緙�線緛緜緝緞緟締緡緢緣緤緥緦緧編緩緪緫緬緭緮緯緰緱緲緳練緵緶緷緸緹緺尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻�".split(""),e=0;e!=n[190].length;++e)65533!==n[190][e].charCodeAt(0)&&(r[n[190][e]]=48640+e,t[48640+e]=n[190][e]);for(n[191]="����������������������������������������������������������������緻緼緽緾緿縀縁縂縃縄縅縆縇縈縉縊縋縌縍縎縏縐縑縒縓縔縕縖縗縘縙縚縛縜縝縞縟縠縡縢縣縤縥縦縧縨縩縪縫縬縭縮縯縰縱縲縳縴縵縶縷縸縹�縺縼總績縿繀繂繃繄繅繆繈繉繊繋繌繍繎繏繐繑繒繓織繕繖繗繘繙繚繛繜繝俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀�".split(""),e=0;e!=n[191].length;++e)65533!==n[191][e].charCodeAt(0)&&(r[n[191][e]]=48896+e,t[48896+e]=n[191][e]);for(n[192]="����������������������������������������������������������������繞繟繠繡繢繣繤繥繦繧繨繩繪繫繬繭繮繯繰繱繲繳繴繵繶繷繸繹繺繻繼繽繾繿纀纁纃纄纅纆纇纈纉纊纋續纍纎纏纐纑纒纓纔纕纖纗纘纙纚纜纝纞�纮纴纻纼绖绤绬绹缊缐缞缷缹缻缼缽缾缿罀罁罃罆罇罈罉罊罋罌罍罎罏罒罓馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐�".split(""),e=0;e!=n[192].length;++e)65533!==n[192][e].charCodeAt(0)&&(r[n[192][e]]=49152+e,t[49152+e]=n[192][e]);for(n[193]="����������������������������������������������������������������罖罙罛罜罝罞罠罣罤罥罦罧罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂羃羄羅羆羇羈羉羋羍羏羐羑羒羓羕羖羗羘羙羛羜羠羢羣羥羦羨義羪羫羬羭羮羱�羳羴羵羶羷羺羻羾翀翂翃翄翆翇翈翉翋翍翏翐翑習翓翖翗翙翚翛翜翝翞翢翣痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿�".split(""),e=0;e!=n[193].length;++e)65533!==n[193][e].charCodeAt(0)&&(r[n[193][e]]=49408+e,t[49408+e]=n[193][e]);for(n[194]="����������������������������������������������������������������翤翧翨翪翫翬翭翯翲翴翵翶翷翸翹翺翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫耬耭耮耯耰耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗�聙聛聜聝聞聟聠聡聢聣聤聥聦聧聨聫聬聭聮聯聰聲聳聴聵聶職聸聹聺聻聼聽隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫�".split(""),e=0;e!=n[194].length;++e)65533!==n[194][e].charCodeAt(0)&&(r[n[194][e]]=49664+e,t[49664+e]=n[194][e]);for(n[195]="����������������������������������������������������������������聾肁肂肅肈肊肍肎肏肐肑肒肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇胈胉胊胋胏胐胑胒胓胔胕胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋�脌脕脗脙脛脜脝脟脠脡脢脣脤脥脦脧脨脩脪脫脭脮脰脳脴脵脷脹脺脻脼脽脿谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸�".split(""),e=0;e!=n[195].length;++e)65533!==n[195][e].charCodeAt(0)&&(r[n[195][e]]=49920+e,t[49920+e]=n[195][e]);for(n[196]="����������������������������������������������������������������腀腁腂腃腄腅腇腉腍腎腏腒腖腗腘腛腜腝腞腟腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃膄膅膆膇膉膋膌膍膎膐膒膓膔膕膖膗膙膚膞膟膠膡膢膤膥�膧膩膫膬膭膮膯膰膱膲膴膵膶膷膸膹膼膽膾膿臄臅臇臈臉臋臍臎臏臐臑臒臓摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁�".split(""),e=0;e!=n[196].length;++e)65533!==n[196][e].charCodeAt(0)&&(r[n[196][e]]=50176+e,t[50176+e]=n[196][e]);for(n[197]="����������������������������������������������������������������臔臕臖臗臘臙臚臛臜臝臞臟臠臡臢臤臥臦臨臩臫臮臯臰臱臲臵臶臷臸臹臺臽臿舃與興舉舊舋舎舏舑舓舕舖舗舘舙舚舝舠舤舥舦舧舩舮舲舺舼舽舿�艀艁艂艃艅艆艈艊艌艍艎艐艑艒艓艔艕艖艗艙艛艜艝艞艠艡艢艣艤艥艦艧艩拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗�".split(""),e=0;e!=n[197].length;++e)65533!==n[197][e].charCodeAt(0)&&(r[n[197][e]]=50432+e,t[50432+e]=n[197][e]);for(n[198]="����������������������������������������������������������������艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸�苺苼苽苾苿茀茊茋茍茐茒茓茖茘茙茝茞茟茠茡茢茣茤茥茦茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐�".split(""),e=0;e!=n[198].length;++e)65533!==n[198][e].charCodeAt(0)&&(r[n[198][e]]=50688+e,t[50688+e]=n[198][e]);for(n[199]="����������������������������������������������������������������茾茿荁荂荄荅荈荊荋荌荍荎荓荕荖荗荘荙荝荢荰荱荲荳荴荵荶荹荺荾荿莀莁莂莃莄莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡莢莣莤莥莦莧莬莭莮�莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠�".split(""),e=0;e!=n[199].length;++e)65533!==n[199][e].charCodeAt(0)&&(r[n[199][e]]=50944+e,t[50944+e]=n[199][e]);for(n[200]="����������������������������������������������������������������菮華菳菴菵菶菷菺菻菼菾菿萀萂萅萇萈萉萊萐萒萓萔萕萖萗萙萚萛萞萟萠萡萢萣萩萪萫萬萭萮萯萰萲萳萴萵萶萷萹萺萻萾萿葀葁葂葃葄葅葇葈葉�葊葋葌葍葎葏葐葒葓葔葕葖葘葝葞葟葠葢葤葥葦葧葨葪葮葯葰葲葴葷葹葻葼取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁�".split(""),e=0;e!=n[200].length;++e)65533!==n[200][e].charCodeAt(0)&&(r[n[200][e]]=51200+e,t[51200+e]=n[200][e]);for(n[201]="����������������������������������������������������������������葽葾葿蒀蒁蒃蒄蒅蒆蒊蒍蒏蒐蒑蒒蒓蒔蒕蒖蒘蒚蒛蒝蒞蒟蒠蒢蒣蒤蒥蒦蒧蒨蒩蒪蒫蒬蒭蒮蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗�蓘蓙蓚蓛蓜蓞蓡蓢蓤蓧蓨蓩蓪蓫蓭蓮蓯蓱蓲蓳蓴蓵蓶蓷蓸蓹蓺蓻蓽蓾蔀蔁蔂伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳�".split(""),e=0;e!=n[201].length;++e)65533!==n[201][e].charCodeAt(0)&&(r[n[201][e]]=51456+e,t[51456+e]=n[201][e]);for(n[202]="����������������������������������������������������������������蔃蔄蔅蔆蔇蔈蔉蔊蔋蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢蔣蔤蔥蔦蔧蔨蔩蔪蔭蔮蔯蔰蔱蔲蔳蔴蔵蔶蔾蔿蕀蕁蕂蕄蕅蕆蕇蕋蕌蕍蕎蕏蕐蕑蕒蕓蕔蕕�蕗蕘蕚蕛蕜蕝蕟蕠蕡蕢蕣蕥蕦蕧蕩蕪蕫蕬蕭蕮蕯蕰蕱蕳蕵蕶蕷蕸蕼蕽蕿薀薁省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱�".split(""),e=0;e!=n[202].length;++e)65533!==n[202][e].charCodeAt(0)&&(r[n[202][e]]=51712+e,t[51712+e]=n[202][e]);for(n[203]="����������������������������������������������������������������薂薃薆薈薉薊薋薌薍薎薐薑薒薓薔薕薖薗薘薙薚薝薞薟薠薡薢薣薥薦薧薩薫薬薭薱薲薳薴薵薶薸薺薻薼薽薾薿藀藂藃藄藅藆藇藈藊藋藌藍藎藑藒�藔藖藗藘藙藚藛藝藞藟藠藡藢藣藥藦藧藨藪藫藬藭藮藯藰藱藲藳藴藵藶藷藸恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔�".split(""),e=0;e!=n[203].length;++e)65533!==n[203][e].charCodeAt(0)&&(r[n[203][e]]=51968+e,t[51968+e]=n[203][e]);for(n[204]="����������������������������������������������������������������藹藺藼藽藾蘀蘁蘂蘃蘄蘆蘇蘈蘉蘊蘋蘌蘍蘎蘏蘐蘒蘓蘔蘕蘗蘘蘙蘚蘛蘜蘝蘞蘟蘠蘡蘢蘣蘤蘥蘦蘨蘪蘫蘬蘭蘮蘯蘰蘱蘲蘳蘴蘵蘶蘷蘹蘺蘻蘽蘾蘿虀�虁虂虃虄虅虆虇虈虉虊虋虌虒虓處虖虗虘虙虛虜虝號虠虡虣虤虥虦虧虨虩虪獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃�".split(""),e=0;e!=n[204].length;++e)65533!==n[204][e].charCodeAt(0)&&(r[n[204][e]]=52224+e,t[52224+e]=n[204][e]);for(n[205]="����������������������������������������������������������������虭虯虰虲虳虴虵虶虷虸蚃蚄蚅蚆蚇蚈蚉蚎蚏蚐蚑蚒蚔蚖蚗蚘蚙蚚蚛蚞蚟蚠蚡蚢蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻蚼蚽蚾蚿蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜�蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威�".split(""),e=0;e!=n[205].length;++e)65533!==n[205][e].charCodeAt(0)&&(r[n[205][e]]=52480+e,t[52480+e]=n[205][e]);for(n[206]="����������������������������������������������������������������蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀蝁蝂蝃蝄蝅蝆蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚蝛蝜蝝蝞蝟蝡蝢蝦蝧蝨蝩蝪蝫蝬蝭蝯蝱蝲蝳蝵�蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎螏螐螑螒螔螕螖螘螙螚螛螜螝螞螠螡螢螣螤巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺�".split(""),e=0;e!=n[206].length;++e)65533!==n[206][e].charCodeAt(0)&&(r[n[206][e]]=52736+e,t[52736+e]=n[206][e]);for(n[207]="����������������������������������������������������������������螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁蟂蟃蟄蟅蟇蟈蟉蟌蟍蟎蟏蟐蟔蟕蟖蟗蟘蟙蟚蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯蟰蟱蟲蟳蟴蟵蟶蟷蟸�蟺蟻蟼蟽蟿蠀蠁蠂蠄蠅蠆蠇蠈蠉蠋蠌蠍蠎蠏蠐蠑蠒蠔蠗蠘蠙蠚蠜蠝蠞蠟蠠蠣稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓�".split(""),e=0;e!=n[207].length;++e)65533!==n[207][e].charCodeAt(0)&&(r[n[207][e]]=52992+e,t[52992+e]=n[207][e]);for(n[208]="����������������������������������������������������������������蠤蠥蠦蠧蠨蠩蠪蠫蠬蠭蠮蠯蠰蠱蠳蠴蠵蠶蠷蠸蠺蠻蠽蠾蠿衁衂衃衆衇衈衉衊衋衎衏衐衑衒術衕衖衘衚衛衜衝衞衟衠衦衧衪衭衯衱衳衴衵衶衸衹衺�衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗袘袙袚袛袝袞袟袠袡袣袥袦袧袨袩袪小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄�".split(""),e=0;e!=n[208].length;++e)65533!==n[208][e].charCodeAt(0)&&(r[n[208][e]]=53248+e,t[53248+e]=n[208][e]);for(n[209]="����������������������������������������������������������������袬袮袯袰袲袳袴袵袶袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚裛補裝裞裠裡裦裧裩裪裫裬裭裮裯裲裵裶裷裺裻製裿褀褁褃褄褅褆複褈�褉褋褌褍褎褏褑褔褕褖褗褘褜褝褞褟褠褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶�".split(""),e=0;e!=n[209].length;++e)65533!==n[209][e].charCodeAt(0)&&(r[n[209][e]]=53504+e,t[53504+e]=n[209][e]);for(n[210]="����������������������������������������������������������������褸褹褺褻褼褽褾褿襀襂襃襅襆襇襈襉襊襋襌襍襎襏襐襑襒襓襔襕襖襗襘襙襚襛襜襝襠襡襢襣襤襥襧襨襩襪襫襬襭襮襯襰襱襲襳襴襵襶襷襸襹襺襼�襽襾覀覂覄覅覇覈覉覊見覌覍覎規覐覑覒覓覔覕視覗覘覙覚覛覜覝覞覟覠覡摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐�".split(""),e=0;e!=n[210].length;++e)65533!==n[210][e].charCodeAt(0)&&(r[n[210][e]]=53760+e,t[53760+e]=n[210][e]);for(n[211]="����������������������������������������������������������������覢覣覤覥覦覧覨覩親覫覬覭覮覯覰覱覲観覴覵覶覷覸覹覺覻覼覽覾覿觀觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴觵觶觷觸觹觺�觻觼觽觾觿訁訂訃訄訅訆計訉訊訋訌訍討訏訐訑訒訓訔訕訖託記訙訚訛訜訝印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉�".split(""),e=0;e!=n[211].length;++e)65533!==n[211][e].charCodeAt(0)&&(r[n[211][e]]=54016+e,t[54016+e]=n[211][e]);for(n[212]="����������������������������������������������������������������訞訟訠訡訢訣訤訥訦訧訨訩訪訫訬設訮訯訰許訲訳訴訵訶訷訸訹診註証訽訿詀詁詂詃詄詅詆詇詉詊詋詌詍詎詏詐詑詒詓詔評詖詗詘詙詚詛詜詝詞�詟詠詡詢詣詤詥試詧詨詩詪詫詬詭詮詯詰話該詳詴詵詶詷詸詺詻詼詽詾詿誀浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧�".split(""),e=0;e!=n[212].length;++e)65533!==n[212][e].charCodeAt(0)&&(r[n[212][e]]=54272+e,t[54272+e]=n[212][e]);for(n[213]="����������������������������������������������������������������誁誂誃誄誅誆誇誈誋誌認誎誏誐誑誒誔誕誖誗誘誙誚誛誜誝語誟誠誡誢誣誤誥誦誧誨誩說誫説読誮誯誰誱課誳誴誵誶誷誸誹誺誻誼誽誾調諀諁諂�諃諄諅諆談諈諉諊請諌諍諎諏諐諑諒諓諔諕論諗諘諙諚諛諜諝諞諟諠諡諢諣铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政�".split(""),e=0;e!=n[213].length;++e)65533!==n[213][e].charCodeAt(0)&&(r[n[213][e]]=54528+e,t[54528+e]=n[213][e]);for(n[214]="����������������������������������������������������������������諤諥諦諧諨諩諪諫諬諭諮諯諰諱諲諳諴諵諶諷諸諹諺諻諼諽諾諿謀謁謂謃謄謅謆謈謉謊謋謌謍謎謏謐謑謒謓謔謕謖謗謘謙謚講謜謝謞謟謠謡謢謣�謤謥謧謨謩謪謫謬謭謮謯謰謱謲謳謴謵謶謷謸謹謺謻謼謽謾謿譀譁譂譃譄譅帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑�".split(""),e=0;e!=n[214].length;++e)65533!==n[214][e].charCodeAt(0)&&(r[n[214][e]]=54784+e,t[54784+e]=n[214][e]);for(n[215]="����������������������������������������������������������������譆譇譈證譊譋譌譍譎譏譐譑譒譓譔譕譖譗識譙譚譛譜譝譞譟譠譡譢譣譤譥譧譨譩譪譫譭譮譯議譱譲譳譴譵譶護譸譹譺譻譼譽譾譿讀讁讂讃讄讅讆�讇讈讉變讋讌讍讎讏讐讑讒讓讔讕讖讗讘讙讚讛讜讝讞讟讬讱讻诇诐诪谉谞住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座������".split(""),e=0;e!=n[215].length;++e)65533!==n[215][e].charCodeAt(0)&&(r[n[215][e]]=55040+e,t[55040+e]=n[215][e]);for(n[216]="����������������������������������������������������������������谸谹谺谻谼谽谾谿豀豂豃豄豅豈豊豋豍豎豏豐豑豒豓豔豖豗豘豙豛豜豝豞豟豠豣豤豥豦豧豨豩豬豭豮豯豰豱豲豴豵豶豷豻豼豽豾豿貀貁貃貄貆貇�貈貋貍貎貏貐貑貒貓貕貖貗貙貚貛貜貝貞貟負財貢貣貤貥貦貧貨販貪貫責貭亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝�".split(""),e=0;e!=n[216].length;++e)65533!==n[216][e].charCodeAt(0)&&(r[n[216][e]]=55296+e,t[55296+e]=n[216][e]);for(n[217]="����������������������������������������������������������������貮貯貰貱貲貳貴貵貶買貸貹貺費貼貽貾貿賀賁賂賃賄賅賆資賈賉賊賋賌賍賎賏賐賑賒賓賔賕賖賗賘賙賚賛賜賝賞賟賠賡賢賣賤賥賦賧賨賩質賫賬�賭賮賯賰賱賲賳賴賵賶賷賸賹賺賻購賽賾賿贀贁贂贃贄贅贆贇贈贉贊贋贌贍佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼�".split(""),e=0;e!=n[217].length;++e)65533!==n[217][e].charCodeAt(0)&&(r[n[217][e]]=55552+e,t[55552+e]=n[217][e]);for(n[218]="����������������������������������������������������������������贎贏贐贑贒贓贔贕贖贗贘贙贚贛贜贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸赹赺赻赼赽赾赿趀趂趃趆趇趈趉趌趍趎趏趐趒趓趕趖趗趘趙趚趛趜趝趞趠趡�趢趤趥趦趧趨趩趪趫趬趭趮趯趰趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺�".split(""),e=0;e!=n[218].length;++e)65533!==n[218][e].charCodeAt(0)&&(r[n[218][e]]=55808+e,t[55808+e]=n[218][e]);for(n[219]="����������������������������������������������������������������跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾跿踀踁踂踃踄踆踇踈踋踍踎踐踑踒踓踕踖踗踘踙踚踛踜踠踡踤踥踦踧踨踫踭踰踲踳踴踶踷踸踻踼踾�踿蹃蹅蹆蹌蹍蹎蹏蹐蹓蹔蹕蹖蹗蹘蹚蹛蹜蹝蹞蹟蹠蹡蹢蹣蹤蹥蹧蹨蹪蹫蹮蹱邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝�".split(""),e=0;e!=n[219].length;++e)65533!==n[219][e].charCodeAt(0)&&(r[n[219][e]]=56064+e,t[56064+e]=n[219][e]);for(n[220]="����������������������������������������������������������������蹳蹵蹷蹸蹹蹺蹻蹽蹾躀躂躃躄躆躈躉躊躋躌躍躎躑躒躓躕躖躗躘躙躚躛躝躟躠躡躢躣躤躥躦躧躨躩躪躭躮躰躱躳躴躵躶躷躸躹躻躼躽躾躿軀軁軂�軃軄軅軆軇軈軉車軋軌軍軏軐軑軒軓軔軕軖軗軘軙軚軛軜軝軞軟軠軡転軣軤堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥�".split(""),e=0;e!=n[220].length;++e)65533!==n[220][e].charCodeAt(0)&&(r[n[220][e]]=56320+e,t[56320+e]=n[220][e]);for(n[221]="����������������������������������������������������������������軥軦軧軨軩軪軫軬軭軮軯軰軱軲軳軴軵軶軷軸軹軺軻軼軽軾軿輀輁輂較輄輅輆輇輈載輊輋輌輍輎輏輐輑輒輓輔輕輖輗輘輙輚輛輜輝輞輟輠輡輢輣�輤輥輦輧輨輩輪輫輬輭輮輯輰輱輲輳輴輵輶輷輸輹輺輻輼輽輾輿轀轁轂轃轄荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺�".split(""),e=0;e!=n[221].length;++e)65533!==n[221][e].charCodeAt(0)&&(r[n[221][e]]=56576+e,t[56576+e]=n[221][e]);for(n[222]="����������������������������������������������������������������轅轆轇轈轉轊轋轌轍轎轏轐轑轒轓轔轕轖轗轘轙轚轛轜轝轞轟轠轡轢轣轤轥轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆�迉迊迋迌迍迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖�".split(""),e=0;e!=n[222].length;++e)65533!==n[222][e].charCodeAt(0)&&(r[n[222][e]]=56832+e,t[56832+e]=n[222][e]);for(n[223]="����������������������������������������������������������������這逜連逤逥逧逨逩逪逫逬逰週進逳逴逷逹逺逽逿遀遃遅遆遈遉遊運遌過達違遖遙遚遜遝遞遟遠遡遤遦遧適遪遫遬遯遰遱遲遳遶遷選遹遺遻遼遾邁�還邅邆邇邉邊邌邍邎邏邐邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼�".split(""),e=0;e!=n[223].length;++e)65533!==n[223][e].charCodeAt(0)&&(r[n[223][e]]=57088+e,t[57088+e]=n[223][e]);for(n[224]="����������������������������������������������������������������郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅鄆鄇鄈鄉鄊鄋鄌鄍鄎鄏鄐鄑鄒鄓鄔鄕鄖鄗鄘鄚鄛鄜�鄝鄟鄠鄡鄤鄥鄦鄧鄨鄩鄪鄫鄬鄭鄮鄰鄲鄳鄴鄵鄶鄷鄸鄺鄻鄼鄽鄾鄿酀酁酂酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼�".split(""),e=0;e!=n[224].length;++e)65533!==n[224][e].charCodeAt(0)&&(r[n[224][e]]=57344+e,t[57344+e]=n[224][e]);for(n[225]="����������������������������������������������������������������酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀醁醂醃醄醆醈醊醎醏醓醔醕醖醗醘醙醜醝醞醟醠醡醤醥醦醧醨醩醫醬醰醱醲醳醶醷醸醹醻�醼醽醾醿釀釁釂釃釄釅釆釈釋釐釒釓釔釕釖釗釘釙釚釛針釞釟釠釡釢釣釤釥帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺�".split(""),e=0;e!=n[225].length;++e)65533!==n[225][e].charCodeAt(0)&&(r[n[225][e]]=57600+e,t[57600+e]=n[225][e]);for(n[226]="����������������������������������������������������������������釦釧釨釩釪釫釬釭釮釯釰釱釲釳釴釵釶釷釸釹釺釻釼釽釾釿鈀鈁鈂鈃鈄鈅鈆鈇鈈鈉鈊鈋鈌鈍鈎鈏鈐鈑鈒鈓鈔鈕鈖鈗鈘鈙鈚鈛鈜鈝鈞鈟鈠鈡鈢鈣鈤�鈥鈦鈧鈨鈩鈪鈫鈬鈭鈮鈯鈰鈱鈲鈳鈴鈵鈶鈷鈸鈹鈺鈻鈼鈽鈾鈿鉀鉁鉂鉃鉄鉅狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂�".split(""),e=0;e!=n[226].length;++e)65533!==n[226][e].charCodeAt(0)&&(r[n[226][e]]=57856+e,t[57856+e]=n[226][e]);for(n[227]="����������������������������������������������������������������鉆鉇鉈鉉鉊鉋鉌鉍鉎鉏鉐鉑鉒鉓鉔鉕鉖鉗鉘鉙鉚鉛鉜鉝鉞鉟鉠鉡鉢鉣鉤鉥鉦鉧鉨鉩鉪鉫鉬鉭鉮鉯鉰鉱鉲鉳鉵鉶鉷鉸鉹鉺鉻鉼鉽鉾鉿銀銁銂銃銄銅�銆銇銈銉銊銋銌銍銏銐銑銒銓銔銕銖銗銘銙銚銛銜銝銞銟銠銡銢銣銤銥銦銧恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾�".split(""),e=0;e!=n[227].length;++e)65533!==n[227][e].charCodeAt(0)&&(r[n[227][e]]=58112+e,t[58112+e]=n[227][e]);for(n[228]="����������������������������������������������������������������銨銩銪銫銬銭銯銰銱銲銳銴銵銶銷銸銹銺銻銼銽銾銿鋀鋁鋂鋃鋄鋅鋆鋇鋉鋊鋋鋌鋍鋎鋏鋐鋑鋒鋓鋔鋕鋖鋗鋘鋙鋚鋛鋜鋝鋞鋟鋠鋡鋢鋣鋤鋥鋦鋧鋨�鋩鋪鋫鋬鋭鋮鋯鋰鋱鋲鋳鋴鋵鋶鋷鋸鋹鋺鋻鋼鋽鋾鋿錀錁錂錃錄錅錆錇錈錉洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑�".split(""),e=0;e!=n[228].length;++e)65533!==n[228][e].charCodeAt(0)&&(r[n[228][e]]=58368+e,t[58368+e]=n[228][e]);for(n[229]="����������������������������������������������������������������錊錋錌錍錎錏錐錑錒錓錔錕錖錗錘錙錚錛錜錝錞錟錠錡錢錣錤錥錦錧錨錩錪錫錬錭錮錯錰錱録錳錴錵錶錷錸錹錺錻錼錽錿鍀鍁鍂鍃鍄鍅鍆鍇鍈鍉�鍊鍋鍌鍍鍎鍏鍐鍑鍒鍓鍔鍕鍖鍗鍘鍙鍚鍛鍜鍝鍞鍟鍠鍡鍢鍣鍤鍥鍦鍧鍨鍩鍫濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣�".split(""),e=0;e!=n[229].length;++e)65533!==n[229][e].charCodeAt(0)&&(r[n[229][e]]=58624+e,t[58624+e]=n[229][e]);for(n[230]="����������������������������������������������������������������鍬鍭鍮鍯鍰鍱鍲鍳鍴鍵鍶鍷鍸鍹鍺鍻鍼鍽鍾鍿鎀鎁鎂鎃鎄鎅鎆鎇鎈鎉鎊鎋鎌鎍鎎鎐鎑鎒鎓鎔鎕鎖鎗鎘鎙鎚鎛鎜鎝鎞鎟鎠鎡鎢鎣鎤鎥鎦鎧鎨鎩鎪鎫�鎬鎭鎮鎯鎰鎱鎲鎳鎴鎵鎶鎷鎸鎹鎺鎻鎼鎽鎾鎿鏀鏁鏂鏃鏄鏅鏆鏇鏈鏉鏋鏌鏍妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩�".split(""),e=0;e!=n[230].length;++e)65533!==n[230][e].charCodeAt(0)&&(r[n[230][e]]=58880+e,t[58880+e]=n[230][e]);for(n[231]="����������������������������������������������������������������鏎鏏鏐鏑鏒鏓鏔鏕鏗鏘鏙鏚鏛鏜鏝鏞鏟鏠鏡鏢鏣鏤鏥鏦鏧鏨鏩鏪鏫鏬鏭鏮鏯鏰鏱鏲鏳鏴鏵鏶鏷鏸鏹鏺鏻鏼鏽鏾鏿鐀鐁鐂鐃鐄鐅鐆鐇鐈鐉鐊鐋鐌鐍�鐎鐏鐐鐑鐒鐓鐔鐕鐖鐗鐘鐙鐚鐛鐜鐝鐞鐟鐠鐡鐢鐣鐤鐥鐦鐧鐨鐩鐪鐫鐬鐭鐮纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬�".split(""),e=0;e!=n[231].length;++e)65533!==n[231][e].charCodeAt(0)&&(r[n[231][e]]=59136+e,t[59136+e]=n[231][e]);for(n[232]="����������������������������������������������������������������鐯鐰鐱鐲鐳鐴鐵鐶鐷鐸鐹鐺鐻鐼鐽鐿鑀鑁鑂鑃鑄鑅鑆鑇鑈鑉鑊鑋鑌鑍鑎鑏鑐鑑鑒鑓鑔鑕鑖鑗鑘鑙鑚鑛鑜鑝鑞鑟鑠鑡鑢鑣鑤鑥鑦鑧鑨鑩鑪鑬鑭鑮鑯�鑰鑱鑲鑳鑴鑵鑶鑷鑸鑹鑺鑻鑼鑽鑾鑿钀钁钂钃钄钑钖钘铇铏铓铔铚铦铻锜锠琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹�".split(""),e=0;e!=n[232].length;++e)65533!==n[232][e].charCodeAt(0)&&(r[n[232][e]]=59392+e,t[59392+e]=n[232][e]);for(n[233]="����������������������������������������������������������������锧锳锽镃镈镋镕镚镠镮镴镵長镸镹镺镻镼镽镾門閁閂閃閄閅閆閇閈閉閊開閌閍閎閏閐閑閒間閔閕閖閗閘閙閚閛閜閝閞閟閠閡関閣閤閥閦閧閨閩閪�閫閬閭閮閯閰閱閲閳閴閵閶閷閸閹閺閻閼閽閾閿闀闁闂闃闄闅闆闇闈闉闊闋椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋�".split(""),e=0;e!=n[233].length;++e)65533!==n[233][e].charCodeAt(0)&&(r[n[233][e]]=59648+e,t[59648+e]=n[233][e]);for(n[234]="����������������������������������������������������������������闌闍闎闏闐闑闒闓闔闕闖闗闘闙闚闛關闝闞闟闠闡闢闣闤闥闦闧闬闿阇阓阘阛阞阠阣阤阥阦阧阨阩阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗�陘陙陚陜陝陞陠陣陥陦陫陭陮陯陰陱陳陸陹険陻陼陽陾陿隀隁隂隃隄隇隉隊辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰�".split(""),e=0;e!=n[234].length;++e)65533!==n[234][e].charCodeAt(0)&&(r[n[234][e]]=59904+e,t[59904+e]=n[234][e]);for(n[235]="����������������������������������������������������������������隌階隑隒隓隕隖隚際隝隞隟隠隡隢隣隤隥隦隨隩險隫隬隭隮隯隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖雗雘雙雚雛雜雝雞雟雡離難雤雥雦雧雫�雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗霘霙霚霛霝霟霠搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻�".split(""),e=0;e!=n[235].length;++e)65533!==n[235][e].charCodeAt(0)&&(r[n[235][e]]=60160+e,t[60160+e]=n[235][e]);for(n[236]="����������������������������������������������������������������霡霢霣霤霥霦霧霨霩霫霬霮霯霱霳霴霵霶霷霺霻霼霽霿靀靁靂靃靄靅靆靇靈靉靊靋靌靍靎靏靐靑靔靕靗靘靚靜靝靟靣靤靦靧靨靪靫靬靭靮靯靰靱�靲靵靷靸靹靺靻靽靾靿鞀鞁鞂鞃鞄鞆鞇鞈鞉鞊鞌鞎鞏鞐鞓鞕鞖鞗鞙鞚鞛鞜鞝臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐�".split(""),e=0;e!=n[236].length;++e)65533!==n[236][e].charCodeAt(0)&&(r[n[236][e]]=60416+e,t[60416+e]=n[236][e]);for(n[237]="����������������������������������������������������������������鞞鞟鞡鞢鞤鞥鞦鞧鞨鞩鞪鞬鞮鞰鞱鞳鞵鞶鞷鞸鞹鞺鞻鞼鞽鞾鞿韀韁韂韃韄韅韆韇韈韉韊韋韌韍韎韏韐韑韒韓韔韕韖韗韘韙韚韛韜韝韞韟韠韡韢韣�韤韥韨韮韯韰韱韲韴韷韸韹韺韻韼韽韾響頀頁頂頃頄項順頇須頉頊頋頌頍頎怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨�".split(""),e=0;e!=n[237].length;++e)65533!==n[237][e].charCodeAt(0)&&(r[n[237][e]]=60672+e,t[60672+e]=n[237][e]);for(n[238]="����������������������������������������������������������������頏預頑頒頓頔頕頖頗領頙頚頛頜頝頞頟頠頡頢頣頤頥頦頧頨頩頪頫頬頭頮頯頰頱頲頳頴頵頶頷頸頹頺頻頼頽頾頿顀顁顂顃顄顅顆顇顈顉顊顋題額�顎顏顐顑顒顓顔顕顖顗願顙顚顛顜顝類顟顠顡顢顣顤顥顦顧顨顩顪顫顬顭顮睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪�".split(""),e=0;e!=n[238].length;++e)65533!==n[238][e].charCodeAt(0)&&(r[n[238][e]]=60928+e,t[60928+e]=n[238][e]);for(n[239]="����������������������������������������������������������������顯顰顱顲顳顴颋颎颒颕颙颣風颩颪颫颬颭颮颯颰颱颲颳颴颵颶颷颸颹颺颻颼颽颾颿飀飁飂飃飄飅飆飇飈飉飊飋飌飍飏飐飔飖飗飛飜飝飠飡飢飣飤�飥飦飩飪飫飬飭飮飯飰飱飲飳飴飵飶飷飸飹飺飻飼飽飾飿餀餁餂餃餄餅餆餇铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔�".split(""),e=0;e!=n[239].length;++e)65533!==n[239][e].charCodeAt(0)&&(r[n[239][e]]=61184+e,t[61184+e]=n[239][e]);for(n[240]="����������������������������������������������������������������餈餉養餋餌餎餏餑餒餓餔餕餖餗餘餙餚餛餜餝餞餟餠餡餢餣餤餥餦餧館餩餪餫餬餭餯餰餱餲餳餴餵餶餷餸餹餺餻餼餽餾餿饀饁饂饃饄饅饆饇饈饉�饊饋饌饍饎饏饐饑饒饓饖饗饘饙饚饛饜饝饞饟饠饡饢饤饦饳饸饹饻饾馂馃馉稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙�".split(""),e=0;e!=n[240].length;++e)65533!==n[240][e].charCodeAt(0)&&(r[n[240][e]]=61440+e,t[61440+e]=n[240][e]);for(n[241]="����������������������������������������������������������������馌馎馚馛馜馝馞馟馠馡馢馣馤馦馧馩馪馫馬馭馮馯馰馱馲馳馴馵馶馷馸馹馺馻馼馽馾馿駀駁駂駃駄駅駆駇駈駉駊駋駌駍駎駏駐駑駒駓駔駕駖駗駘�駙駚駛駜駝駞駟駠駡駢駣駤駥駦駧駨駩駪駫駬駭駮駯駰駱駲駳駴駵駶駷駸駹瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃�".split(""),e=0;e!=n[241].length;++e)65533!==n[241][e].charCodeAt(0)&&(r[n[241][e]]=61696+e,t[61696+e]=n[241][e]);for(n[242]="����������������������������������������������������������������駺駻駼駽駾駿騀騁騂騃騄騅騆騇騈騉騊騋騌騍騎騏騐騑騒験騔騕騖騗騘騙騚騛騜騝騞騟騠騡騢騣騤騥騦騧騨騩騪騫騬騭騮騯騰騱騲騳騴騵騶騷騸�騹騺騻騼騽騾騿驀驁驂驃驄驅驆驇驈驉驊驋驌驍驎驏驐驑驒驓驔驕驖驗驘驙颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒�".split(""),e=0;e!=n[242].length;++e)65533!==n[242][e].charCodeAt(0)&&(r[n[242][e]]=61952+e,t[61952+e]=n[242][e]);for(n[243]="����������������������������������������������������������������驚驛驜驝驞驟驠驡驢驣驤驥驦驧驨驩驪驫驲骃骉骍骎骔骕骙骦骩骪骫骬骭骮骯骲骳骴骵骹骻骽骾骿髃髄髆髇髈髉髊髍髎髏髐髒體髕髖髗髙髚髛髜�髝髞髠髢髣髤髥髧髨髩髪髬髮髰髱髲髳髴髵髶髷髸髺髼髽髾髿鬀鬁鬂鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋�".split(""),e=0;e!=n[243].length;++e)65533!==n[243][e].charCodeAt(0)&&(r[n[243][e]]=62208+e,t[62208+e]=n[243][e]);for(n[244]="����������������������������������������������������������������鬇鬉鬊鬋鬌鬍鬎鬐鬑鬒鬔鬕鬖鬗鬘鬙鬚鬛鬜鬝鬞鬠鬡鬢鬤鬥鬦鬧鬨鬩鬪鬫鬬鬭鬮鬰鬱鬳鬴鬵鬶鬷鬸鬹鬺鬽鬾鬿魀魆魊魋魌魎魐魒魓魕魖魗魘魙魚�魛魜魝魞魟魠魡魢魣魤魥魦魧魨魩魪魫魬魭魮魯魰魱魲魳魴魵魶魷魸魹魺魻簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤�".split(""),e=0;e!=n[244].length;++e)65533!==n[244][e].charCodeAt(0)&&(r[n[244][e]]=62464+e,t[62464+e]=n[244][e]);for(n[245]="����������������������������������������������������������������魼魽魾魿鮀鮁鮂鮃鮄鮅鮆鮇鮈鮉鮊鮋鮌鮍鮎鮏鮐鮑鮒鮓鮔鮕鮖鮗鮘鮙鮚鮛鮜鮝鮞鮟鮠鮡鮢鮣鮤鮥鮦鮧鮨鮩鮪鮫鮬鮭鮮鮯鮰鮱鮲鮳鮴鮵鮶鮷鮸鮹鮺�鮻鮼鮽鮾鮿鯀鯁鯂鯃鯄鯅鯆鯇鯈鯉鯊鯋鯌鯍鯎鯏鯐鯑鯒鯓鯔鯕鯖鯗鯘鯙鯚鯛酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜�".split(""),e=0;e!=n[245].length;++e)65533!==n[245][e].charCodeAt(0)&&(r[n[245][e]]=62720+e,t[62720+e]=n[245][e]);for(n[246]="����������������������������������������������������������������鯜鯝鯞鯟鯠鯡鯢鯣鯤鯥鯦鯧鯨鯩鯪鯫鯬鯭鯮鯯鯰鯱鯲鯳鯴鯵鯶鯷鯸鯹鯺鯻鯼鯽鯾鯿鰀鰁鰂鰃鰄鰅鰆鰇鰈鰉鰊鰋鰌鰍鰎鰏鰐鰑鰒鰓鰔鰕鰖鰗鰘鰙鰚�鰛鰜鰝鰞鰟鰠鰡鰢鰣鰤鰥鰦鰧鰨鰩鰪鰫鰬鰭鰮鰯鰰鰱鰲鰳鰴鰵鰶鰷鰸鰹鰺鰻觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋�".split(""),e=0;e!=n[246].length;++e)65533!==n[246][e].charCodeAt(0)&&(r[n[246][e]]=62976+e,t[62976+e]=n[246][e]);for(n[247]="����������������������������������������������������������������鰼鰽鰾鰿鱀鱁鱂鱃鱄鱅鱆鱇鱈鱉鱊鱋鱌鱍鱎鱏鱐鱑鱒鱓鱔鱕鱖鱗鱘鱙鱚鱛鱜鱝鱞鱟鱠鱡鱢鱣鱤鱥鱦鱧鱨鱩鱪鱫鱬鱭鱮鱯鱰鱱鱲鱳鱴鱵鱶鱷鱸鱹鱺�鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾鲿鳀鳁鳂鳈鳉鳑鳒鳚鳛鳠鳡鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄�".split(""),e=0;e!=n[247].length;++e)65533!==n[247][e].charCodeAt(0)&&(r[n[247][e]]=63232+e,t[63232+e]=n[247][e]);for(n[248]="����������������������������������������������������������������鳣鳤鳥鳦鳧鳨鳩鳪鳫鳬鳭鳮鳯鳰鳱鳲鳳鳴鳵鳶鳷鳸鳹鳺鳻鳼鳽鳾鳿鴀鴁鴂鴃鴄鴅鴆鴇鴈鴉鴊鴋鴌鴍鴎鴏鴐鴑鴒鴓鴔鴕鴖鴗鴘鴙鴚鴛鴜鴝鴞鴟鴠鴡�鴢鴣鴤鴥鴦鴧鴨鴩鴪鴫鴬鴭鴮鴯鴰鴱鴲鴳鴴鴵鴶鴷鴸鴹鴺鴻鴼鴽鴾鴿鵀鵁鵂�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[248].length;++e)65533!==n[248][e].charCodeAt(0)&&(r[n[248][e]]=63488+e,t[63488+e]=n[248][e]);for(n[249]="����������������������������������������������������������������鵃鵄鵅鵆鵇鵈鵉鵊鵋鵌鵍鵎鵏鵐鵑鵒鵓鵔鵕鵖鵗鵘鵙鵚鵛鵜鵝鵞鵟鵠鵡鵢鵣鵤鵥鵦鵧鵨鵩鵪鵫鵬鵭鵮鵯鵰鵱鵲鵳鵴鵵鵶鵷鵸鵹鵺鵻鵼鵽鵾鵿鶀鶁�鶂鶃鶄鶅鶆鶇鶈鶉鶊鶋鶌鶍鶎鶏鶐鶑鶒鶓鶔鶕鶖鶗鶘鶙鶚鶛鶜鶝鶞鶟鶠鶡鶢�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[249].length;++e)65533!==n[249][e].charCodeAt(0)&&(r[n[249][e]]=63744+e,t[63744+e]=n[249][e]);for(n[250]="����������������������������������������������������������������鶣鶤鶥鶦鶧鶨鶩鶪鶫鶬鶭鶮鶯鶰鶱鶲鶳鶴鶵鶶鶷鶸鶹鶺鶻鶼鶽鶾鶿鷀鷁鷂鷃鷄鷅鷆鷇鷈鷉鷊鷋鷌鷍鷎鷏鷐鷑鷒鷓鷔鷕鷖鷗鷘鷙鷚鷛鷜鷝鷞鷟鷠鷡�鷢鷣鷤鷥鷦鷧鷨鷩鷪鷫鷬鷭鷮鷯鷰鷱鷲鷳鷴鷵鷶鷷鷸鷹鷺鷻鷼鷽鷾鷿鸀鸁鸂�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[250].length;++e)65533!==n[250][e].charCodeAt(0)&&(r[n[250][e]]=64e3+e,t[64e3+e]=n[250][e]);for(n[251]="����������������������������������������������������������������鸃鸄鸅鸆鸇鸈鸉鸊鸋鸌鸍鸎鸏鸐鸑鸒鸓鸔鸕鸖鸗鸘鸙鸚鸛鸜鸝鸞鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴鹵鹶鹷鹸鹹鹺鹻鹼鹽麀�麁麃麄麅麆麉麊麌麍麎麏麐麑麔麕麖麗麘麙麚麛麜麞麠麡麢麣麤麥麧麨麩麪�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[251].length;++e)65533!==n[251][e].charCodeAt(0)&&(r[n[251][e]]=64256+e,t[64256+e]=n[251][e]);for(n[252]="����������������������������������������������������������������麫麬麭麮麯麰麱麲麳麵麶麷麹麺麼麿黀黁黂黃黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰黱黲黳黴黵黶黷黸黺黽黿鼀鼁鼂鼃鼄鼅�鼆鼇鼈鼉鼊鼌鼏鼑鼒鼔鼕鼖鼘鼚鼛鼜鼝鼞鼟鼡鼣鼤鼥鼦鼧鼨鼩鼪鼫鼭鼮鼰鼱�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[252].length;++e)65533!==n[252][e].charCodeAt(0)&&(r[n[252][e]]=64512+e,t[64512+e]=n[252][e]);for(n[253]="����������������������������������������������������������������鼲鼳鼴鼵鼶鼸鼺鼼鼿齀齁齂齃齅齆齇齈齉齊齋齌齍齎齏齒齓齔齕齖齗齘齙齚齛齜齝齞齟齠齡齢齣齤齥齦齧齨齩齪齫齬齭齮齯齰齱齲齳齴齵齶齷齸�齹齺齻齼齽齾龁龂龍龎龏龐龑龒龓龔龕龖龗龘龜龝龞龡龢龣龤龥郎凉秊裏隣�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[253].length;++e)65533!==n[253][e].charCodeAt(0)&&(r[n[253][e]]=64768+e,t[64768+e]=n[253][e]);for(n[254]="����������������������������������������������������������������兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������".split(""),e=0;e!=n[254].length;++e)65533!==n[254][e].charCodeAt(0)&&(r[n[254][e]]=65024+e,t[65024+e]=n[254][e]);return{enc:r,dec:t}}(),t[949]=function(){var e,t=[],r={},n=[];for(n[0]="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������".split(""),e=0;e!=n[0].length;++e)65533!==n[0][e].charCodeAt(0)&&(r[n[0][e]]=0+e,t[0+e]=n[0][e]);for(n[129]="�����������������������������������������������������������������갂갃갅갆갋갌갍갎갏갘갞갟갡갢갣갥갦갧갨갩갪갫갮갲갳갴������갵갶갷갺갻갽갾갿걁걂걃걄걅걆걇걈걉걊걌걎걏걐걑걒걓걕������걖걗걙걚걛걝걞걟걠걡걢걣걤걥걦걧걨걩걪걫걬걭걮걯걲걳걵걶걹걻걼걽걾걿겂겇겈겍겎겏겑겒겓겕겖겗겘겙겚겛겞겢겣겤겥겦겧겫겭겮겱겲겳겴겵겶겷겺겾겿곀곂곃곅곆곇곉곊곋곍곎곏곐곑곒곓곔곖곘곙곚곛곜곝곞곟곢곣곥곦곩곫곭곮곲곴곷곸곹곺곻곾곿괁괂괃괅괇괈괉괊괋괎괐괒괓�".split(""),e=0;e!=n[129].length;++e)65533!==n[129][e].charCodeAt(0)&&(r[n[129][e]]=33024+e,t[33024+e]=n[129][e]);for(n[130]="�����������������������������������������������������������������괔괕괖괗괙괚괛괝괞괟괡괢괣괤괥괦괧괨괪괫괮괯괰괱괲괳������괶괷괹괺괻괽괾괿굀굁굂굃굆굈굊굋굌굍굎굏굑굒굓굕굖굗������굙굚굛굜굝굞굟굠굢굤굥굦굧굨굩굪굫굮굯굱굲굷굸굹굺굾궀궃궄궅궆궇궊궋궍궎궏궑궒궓궔궕궖궗궘궙궚궛궞궟궠궡궢궣궥궦궧궨궩궪궫궬궭궮궯궰궱궲궳궴궵궶궸궹궺궻궼궽궾궿귂귃귅귆귇귉귊귋귌귍귎귏귒귔귕귖귗귘귙귚귛귝귞귟귡귢귣귥귦귧귨귩귪귫귬귭귮귯귰귱귲귳귴귵귶귷�".split(""),e=0;e!=n[130].length;++e)65533!==n[130][e].charCodeAt(0)&&(r[n[130][e]]=33280+e,t[33280+e]=n[130][e]);for(n[131]="�����������������������������������������������������������������귺귻귽귾긂긃긄긅긆긇긊긌긎긏긐긑긒긓긕긖긗긘긙긚긛긜������긝긞긟긠긡긢긣긤긥긦긧긨긩긪긫긬긭긮긯긲긳긵긶긹긻긼������긽긾긿깂깄깇깈깉깋깏깑깒깓깕깗깘깙깚깛깞깢깣깤깦깧깪깫깭깮깯깱깲깳깴깵깶깷깺깾깿꺀꺁꺂꺃꺆꺇꺈꺉꺊꺋꺍꺎꺏꺐꺑꺒꺓꺔꺕꺖꺗꺘꺙꺚꺛꺜꺝꺞꺟꺠꺡꺢꺣꺤꺥꺦꺧꺨꺩꺪꺫꺬꺭꺮꺯꺰꺱꺲꺳꺴꺵꺶꺷꺸꺹꺺꺻꺿껁껂껃껅껆껇껈껉껊껋껎껒껓껔껕껖껗껚껛껝껞껟껠껡껢껣껤껥�".split(""),e=0;e!=n[131].length;++e)65533!==n[131][e].charCodeAt(0)&&(r[n[131][e]]=33536+e,t[33536+e]=n[131][e]);for(n[132]="�����������������������������������������������������������������껦껧껩껪껬껮껯껰껱껲껳껵껶껷껹껺껻껽껾껿꼀꼁꼂꼃꼄꼅������꼆꼉꼊꼋꼌꼎꼏꼑꼒꼓꼔꼕꼖꼗꼘꼙꼚꼛꼜꼝꼞꼟꼠꼡꼢꼣������꼤꼥꼦꼧꼨꼩꼪꼫꼮꼯꼱꼳꼵꼶꼷꼸꼹꼺꼻꼾꽀꽄꽅꽆꽇꽊꽋꽌꽍꽎꽏꽑꽒꽓꽔꽕꽖꽗꽘꽙꽚꽛꽞꽟꽠꽡꽢꽣꽦꽧꽨꽩꽪꽫꽬꽭꽮꽯꽰꽱꽲꽳꽴꽵꽶꽷꽸꽺꽻꽼꽽꽾꽿꾁꾂꾃꾅꾆꾇꾉꾊꾋꾌꾍꾎꾏꾒꾓꾔꾖꾗꾘꾙꾚꾛꾝꾞꾟꾠꾡꾢꾣꾤꾥꾦꾧꾨꾩꾪꾫꾬꾭꾮꾯꾰꾱꾲꾳꾴꾵꾶꾷꾺꾻꾽꾾�".split(""),e=0;e!=n[132].length;++e)65533!==n[132][e].charCodeAt(0)&&(r[n[132][e]]=33792+e,t[33792+e]=n[132][e]);for(n[133]="�����������������������������������������������������������������꾿꿁꿂꿃꿄꿅꿆꿊꿌꿏꿐꿑꿒꿓꿕꿖꿗꿘꿙꿚꿛꿝꿞꿟꿠꿡������꿢꿣꿤꿥꿦꿧꿪꿫꿬꿭꿮꿯꿲꿳꿵꿶꿷꿹꿺꿻꿼꿽꿾꿿뀂뀃������뀅뀆뀇뀈뀉뀊뀋뀍뀎뀏뀑뀒뀓뀕뀖뀗뀘뀙뀚뀛뀞뀟뀠뀡뀢뀣뀤뀥뀦뀧뀩뀪뀫뀬뀭뀮뀯뀰뀱뀲뀳뀴뀵뀶뀷뀸뀹뀺뀻뀼뀽뀾뀿끀끁끂끃끆끇끉끋끍끏끐끑끒끖끘끚끛끜끞끟끠끡끢끣끤끥끦끧끨끩끪끫끬끭끮끯끰끱끲끳끴끵끶끷끸끹끺끻끾끿낁낂낃낅낆낇낈낉낊낋낎낐낒낓낔낕낖낗낛낝낞낣낤�".split(""),e=0;e!=n[133].length;++e)65533!==n[133][e].charCodeAt(0)&&(r[n[133][e]]=34048+e,t[34048+e]=n[133][e]);for(n[134]="�����������������������������������������������������������������낥낦낧낪낰낲낶낷낹낺낻낽낾낿냀냁냂냃냆냊냋냌냍냎냏냒������냓냕냖냗냙냚냛냜냝냞냟냡냢냣냤냦냧냨냩냪냫냬냭냮냯냰������냱냲냳냴냵냶냷냸냹냺냻냼냽냾냿넀넁넂넃넄넅넆넇넊넍넎넏넑넔넕넖넗넚넞넟넠넡넢넦넧넩넪넫넭넮넯넰넱넲넳넶넺넻넼넽넾넿녂녃녅녆녇녉녊녋녌녍녎녏녒녓녖녗녙녚녛녝녞녟녡녢녣녤녥녦녧녨녩녪녫녬녭녮녯녰녱녲녳녴녵녶녷녺녻녽녾녿놁놃놄놅놆놇놊놌놎놏놐놑놕놖놗놙놚놛놝�".split(""),e=0;e!=n[134].length;++e)65533!==n[134][e].charCodeAt(0)&&(r[n[134][e]]=34304+e,t[34304+e]=n[134][e]);for(n[135]="�����������������������������������������������������������������놞놟놠놡놢놣놤놥놦놧놩놪놫놬놭놮놯놰놱놲놳놴놵놶놷놸������놹놺놻놼놽놾놿뇀뇁뇂뇃뇄뇅뇆뇇뇈뇉뇊뇋뇍뇎뇏뇑뇒뇓뇕������뇖뇗뇘뇙뇚뇛뇞뇠뇡뇢뇣뇤뇥뇦뇧뇪뇫뇭뇮뇯뇱뇲뇳뇴뇵뇶뇷뇸뇺뇼뇾뇿눀눁눂눃눆눇눉눊눍눎눏눐눑눒눓눖눘눚눛눜눝눞눟눡눢눣눤눥눦눧눨눩눪눫눬눭눮눯눰눱눲눳눵눶눷눸눹눺눻눽눾눿뉀뉁뉂뉃뉄뉅뉆뉇뉈뉉뉊뉋뉌뉍뉎뉏뉐뉑뉒뉓뉔뉕뉖뉗뉙뉚뉛뉝뉞뉟뉡뉢뉣뉤뉥뉦뉧뉪뉫뉬뉭뉮�".split(""),e=0;e!=n[135].length;++e)65533!==n[135][e].charCodeAt(0)&&(r[n[135][e]]=34560+e,t[34560+e]=n[135][e]);for(n[136]="�����������������������������������������������������������������뉯뉰뉱뉲뉳뉶뉷뉸뉹뉺뉻뉽뉾뉿늀늁늂늃늆늇늈늊늋늌늍늎������늏늒늓늕늖늗늛늜늝늞늟늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷������늸늹늺늻늼늽늾늿닀닁닂닃닄닅닆닇닊닋닍닎닏닑닓닔닕닖닗닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉댊댋댌댍댎댏댒댖댗댘댙댚댛댝댞댟댠댡댢댣댤댥댦댧댨댩댪댫댬댭댮댯댰댱댲댳댴댵댶댷댸댹댺댻댼댽댾댿덀덁덂덃덄덅덆덇덈덉덊덋덌덍덎덏덐덑덒덓덗덙덚덝덠덡덢덣�".split(""),e=0;e!=n[136].length;++e)65533!==n[136][e].charCodeAt(0)&&(r[n[136][e]]=34816+e,t[34816+e]=n[136][e]);for(n[137]="�����������������������������������������������������������������덦덨덪덬덭덯덲덳덵덶덷덹덺덻덼덽덾덿뎂뎆뎇뎈뎉뎊뎋뎍������뎎뎏뎑뎒뎓뎕뎖뎗뎘뎙뎚뎛뎜뎝뎞뎟뎢뎣뎤뎥뎦뎧뎩뎪뎫뎭������뎮뎯뎰뎱뎲뎳뎴뎵뎶뎷뎸뎹뎺뎻뎼뎽뎾뎿돀돁돂돃돆돇돉돊돍돏돑돒돓돖돘돚돜돞돟돡돢돣돥돦돧돩돪돫돬돭돮돯돰돱돲돳돴돵돶돷돸돹돺돻돽돾돿됀됁됂됃됄됅됆됇됈됉됊됋됌됍됎됏됑됒됓됔됕됖됗됙됚됛됝됞됟됡됢됣됤됥됦됧됪됬됭됮됯됰됱됲됳됵됶됷됸됹됺됻됼됽됾됿둀둁둂둃둄�".split(""),e=0;e!=n[137].length;++e)65533!==n[137][e].charCodeAt(0)&&(r[n[137][e]]=35072+e,t[35072+e]=n[137][e]);for(n[138]="�����������������������������������������������������������������둅둆둇둈둉둊둋둌둍둎둏둒둓둕둖둗둙둚둛둜둝둞둟둢둤둦������둧둨둩둪둫둭둮둯둰둱둲둳둴둵둶둷둸둹둺둻둼둽둾둿뒁뒂������뒃뒄뒅뒆뒇뒉뒊뒋뒌뒍뒎뒏뒐뒑뒒뒓뒔뒕뒖뒗뒘뒙뒚뒛뒜뒞뒟뒠뒡뒢뒣뒥뒦뒧뒩뒪뒫뒭뒮뒯뒰뒱뒲뒳뒴뒶뒸뒺뒻뒼뒽뒾뒿듁듂듃듅듆듇듉듊듋듌듍듎듏듑듒듓듔듖듗듘듙듚듛듞듟듡듢듥듧듨듩듪듫듮듰듲듳듴듵듶듷듹듺듻듼듽듾듿딀딁딂딃딄딅딆딇딈딉딊딋딌딍딎딏딐딑딒딓딖딗딙딚딝�".split(""),e=0;e!=n[138].length;++e)65533!==n[138][e].charCodeAt(0)&&(r[n[138][e]]=35328+e,t[35328+e]=n[138][e]);for(n[139]="�����������������������������������������������������������������딞딟딠딡딢딣딦딫딬딭딮딯딲딳딵딶딷딹딺딻딼딽딾딿땂땆������땇땈땉땊땎땏땑땒땓땕땖땗땘땙땚땛땞땢땣땤땥땦땧땨땩땪������땫땬땭땮땯땰땱땲땳땴땵땶땷땸땹땺땻땼땽땾땿떀떁떂떃떄떅떆떇떈떉떊떋떌떍떎떏떐떑떒떓떔떕떖떗떘떙떚떛떜떝떞떟떢떣떥떦떧떩떬떭떮떯떲떶떷떸떹떺떾떿뗁뗂뗃뗅뗆뗇뗈뗉뗊뗋뗎뗒뗓뗔뗕뗖뗗뗙뗚뗛뗜뗝뗞뗟뗠뗡뗢뗣뗤뗥뗦뗧뗨뗩뗪뗫뗭뗮뗯뗰뗱뗲뗳뗴뗵뗶뗷뗸뗹뗺뗻뗼뗽뗾뗿�".split(""),e=0;e!=n[139].length;++e)65533!==n[139][e].charCodeAt(0)&&(r[n[139][e]]=35584+e,t[35584+e]=n[139][e]);for(n[140]="�����������������������������������������������������������������똀똁똂똃똄똅똆똇똈똉똊똋똌똍똎똏똒똓똕똖똗똙똚똛똜똝������똞똟똠똡똢똣똤똦똧똨똩똪똫똭똮똯똰똱똲똳똵똶똷똸똹똺������똻똼똽똾똿뙀뙁뙂뙃뙄뙅뙆뙇뙉뙊뙋뙌뙍뙎뙏뙐뙑뙒뙓뙔뙕뙖뙗뙘뙙뙚뙛뙜뙝뙞뙟뙠뙡뙢뙣뙥뙦뙧뙩뙪뙫뙬뙭뙮뙯뙰뙱뙲뙳뙴뙵뙶뙷뙸뙹뙺뙻뙼뙽뙾뙿뚀뚁뚂뚃뚄뚅뚆뚇뚈뚉뚊뚋뚌뚍뚎뚏뚐뚑뚒뚓뚔뚕뚖뚗뚘뚙뚚뚛뚞뚟뚡뚢뚣뚥뚦뚧뚨뚩뚪뚭뚮뚯뚰뚲뚳뚴뚵뚶뚷뚸뚹뚺뚻뚼뚽뚾뚿뛀뛁뛂�".split(""),e=0;e!=n[140].length;++e)65533!==n[140][e].charCodeAt(0)&&(r[n[140][e]]=35840+e,t[35840+e]=n[140][e]);for(n[141]="�����������������������������������������������������������������뛃뛄뛅뛆뛇뛈뛉뛊뛋뛌뛍뛎뛏뛐뛑뛒뛓뛕뛖뛗뛘뛙뛚뛛뛜뛝������뛞뛟뛠뛡뛢뛣뛤뛥뛦뛧뛨뛩뛪뛫뛬뛭뛮뛯뛱뛲뛳뛵뛶뛷뛹뛺������뛻뛼뛽뛾뛿뜂뜃뜄뜆뜇뜈뜉뜊뜋뜌뜍뜎뜏뜐뜑뜒뜓뜔뜕뜖뜗뜘뜙뜚뜛뜜뜝뜞뜟뜠뜡뜢뜣뜤뜥뜦뜧뜪뜫뜭뜮뜱뜲뜳뜴뜵뜶뜷뜺뜼뜽뜾뜿띀띁띂띃띅띆띇띉띊띋띍띎띏띐띑띒띓띖띗띘띙띚띛띜띝띞띟띡띢띣띥띦띧띩띪띫띬띭띮띯띲띴띶띷띸띹띺띻띾띿랁랂랃랅랆랇랈랉랊랋랎랓랔랕랚랛랝랞�".split(""),e=0;e!=n[141].length;++e)65533!==n[141][e].charCodeAt(0)&&(r[n[141][e]]=36096+e,t[36096+e]=n[141][e]);for(n[142]="�����������������������������������������������������������������랟랡랢랣랤랥랦랧랪랮랯랰랱랲랳랶랷랹랺랻랼랽랾랿럀럁������럂럃럄럅럆럈럊럋럌럍럎럏럐럑럒럓럔럕럖럗럘럙럚럛럜럝������럞럟럠럡럢럣럤럥럦럧럨럩럪럫럮럯럱럲럳럵럶럷럸럹럺럻럾렂렃렄렅렆렊렋렍렎렏렑렒렓렔렕렖렗렚렜렞렟렠렡렢렣렦렧렩렪렫렭렮렯렰렱렲렳렶렺렻렼렽렾렿롁롂롃롅롆롇롈롉롊롋롌롍롎롏롐롒롔롕롖롗롘롙롚롛롞롟롡롢롣롥롦롧롨롩롪롫롮롰롲롳롴롵롶롷롹롺롻롽롾롿뢀뢁뢂뢃뢄�".split(""),e=0;e!=n[142].length;++e)65533!==n[142][e].charCodeAt(0)&&(r[n[142][e]]=36352+e,t[36352+e]=n[142][e]);for(n[143]="�����������������������������������������������������������������뢅뢆뢇뢈뢉뢊뢋뢌뢎뢏뢐뢑뢒뢓뢔뢕뢖뢗뢘뢙뢚뢛뢜뢝뢞뢟������뢠뢡뢢뢣뢤뢥뢦뢧뢩뢪뢫뢬뢭뢮뢯뢱뢲뢳뢵뢶뢷뢹뢺뢻뢼뢽������뢾뢿룂룄룆룇룈룉룊룋룍룎룏룑룒룓룕룖룗룘룙룚룛룜룞룠룢룣룤룥룦룧룪룫룭룮룯룱룲룳룴룵룶룷룺룼룾룿뤀뤁뤂뤃뤅뤆뤇뤈뤉뤊뤋뤌뤍뤎뤏뤐뤑뤒뤓뤔뤕뤖뤗뤙뤚뤛뤜뤝뤞뤟뤡뤢뤣뤤뤥뤦뤧뤨뤩뤪뤫뤬뤭뤮뤯뤰뤱뤲뤳뤴뤵뤶뤷뤸뤹뤺뤻뤾뤿륁륂륃륅륆륇륈륉륊륋륍륎륐륒륓륔륕륖륗�".split(""),e=0;e!=n[143].length;++e)65533!==n[143][e].charCodeAt(0)&&(r[n[143][e]]=36608+e,t[36608+e]=n[143][e]);for(n[144]="�����������������������������������������������������������������륚륛륝륞륟륡륢륣륤륥륦륧륪륬륮륯륰륱륲륳륶륷륹륺륻륽������륾륿릀릁릂릃릆릈릋릌릏릐릑릒릓릔릕릖릗릘릙릚릛릜릝릞������릟릠릡릢릣릤릥릦릧릨릩릪릫릮릯릱릲릳릵릶릷릸릹릺릻릾맀맂맃맄맅맆맇맊맋맍맓맔맕맖맗맚맜맟맠맢맦맧맩맪맫맭맮맯맰맱맲맳맶맻맼맽맾맿먂먃먄먅먆먇먉먊먋먌먍먎먏먐먑먒먓먔먖먗먘먙먚먛먜먝먞먟먠먡먢먣먤먥먦먧먨먩먪먫먬먭먮먯먰먱먲먳먴먵먶먷먺먻먽먾먿멁멃멄멅멆�".split(""),e=0;e!=n[144].length;++e)65533!==n[144][e].charCodeAt(0)&&(r[n[144][e]]=36864+e,t[36864+e]=n[144][e]);for(n[145]="�����������������������������������������������������������������멇멊멌멏멐멑멒멖멗멙멚멛멝멞멟멠멡멢멣멦멪멫멬멭멮멯������멲멳멵멶멷멹멺멻멼멽멾멿몀몁몂몆몈몉몊몋몍몎몏몐몑몒������몓몔몕몖몗몘몙몚몛몜몝몞몟몠몡몢몣몤몥몦몧몪몭몮몯몱몳몴몵몶몷몺몼몾몿뫀뫁뫂뫃뫅뫆뫇뫉뫊뫋뫌뫍뫎뫏뫐뫑뫒뫓뫔뫕뫖뫗뫚뫛뫜뫝뫞뫟뫠뫡뫢뫣뫤뫥뫦뫧뫨뫩뫪뫫뫬뫭뫮뫯뫰뫱뫲뫳뫴뫵뫶뫷뫸뫹뫺뫻뫽뫾뫿묁묂묃묅묆묇묈묉묊묋묌묎묐묒묓묔묕묖묗묙묚묛묝묞묟묡묢묣묤묥묦묧�".split(""),e=0;e!=n[145].length;++e)65533!==n[145][e].charCodeAt(0)&&(r[n[145][e]]=37120+e,t[37120+e]=n[145][e]);for(n[146]="�����������������������������������������������������������������묨묪묬묭묮묯묰묱묲묳묷묹묺묿뭀뭁뭂뭃뭆뭈뭊뭋뭌뭎뭑뭒������뭓뭕뭖뭗뭙뭚뭛뭜뭝뭞뭟뭠뭢뭤뭥뭦뭧뭨뭩뭪뭫뭭뭮뭯뭰뭱������뭲뭳뭴뭵뭶뭷뭸뭹뭺뭻뭼뭽뭾뭿뮀뮁뮂뮃뮄뮅뮆뮇뮉뮊뮋뮍뮎뮏뮑뮒뮓뮔뮕뮖뮗뮘뮙뮚뮛뮜뮝뮞뮟뮠뮡뮢뮣뮥뮦뮧뮩뮪뮫뮭뮮뮯뮰뮱뮲뮳뮵뮶뮸뮹뮺뮻뮼뮽뮾뮿믁믂믃믅믆믇믉믊믋믌믍믎믏믑믒믔믕믖믗믘믙믚믛믜믝믞믟믠믡믢믣믤믥믦믧믨믩믪믫믬믭믮믯믰믱믲믳믴믵믶믷믺믻믽믾밁�".split(""),e=0;e!=n[146].length;++e)65533!==n[146][e].charCodeAt(0)&&(r[n[146][e]]=37376+e,t[37376+e]=n[146][e]);for(n[147]="�����������������������������������������������������������������밃밄밅밆밇밊밎밐밒밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵������밶밷밹밺밻밼밽밾밿뱂뱆뱇뱈뱊뱋뱎뱏뱑뱒뱓뱔뱕뱖뱗뱘뱙������뱚뱛뱜뱞뱟뱠뱡뱢뱣뱤뱥뱦뱧뱨뱩뱪뱫뱬뱭뱮뱯뱰뱱뱲뱳뱴뱵뱶뱷뱸뱹뱺뱻뱼뱽뱾뱿벀벁벂벃벆벇벉벊벍벏벐벑벒벓벖벘벛벜벝벞벟벢벣벥벦벩벪벫벬벭벮벯벲벶벷벸벹벺벻벾벿볁볂볃볅볆볇볈볉볊볋볌볎볒볓볔볖볗볙볚볛볝볞볟볠볡볢볣볤볥볦볧볨볩볪볫볬볭볮볯볰볱볲볳볷볹볺볻볽�".split(""),e=0;e!=n[147].length;++e)65533!==n[147][e].charCodeAt(0)&&(r[n[147][e]]=37632+e,t[37632+e]=n[147][e]);for(n[148]="�����������������������������������������������������������������볾볿봀봁봂봃봆봈봊봋봌봍봎봏봑봒봓봕봖봗봘봙봚봛봜봝������봞봟봠봡봢봣봥봦봧봨봩봪봫봭봮봯봰봱봲봳봴봵봶봷봸봹������봺봻봼봽봾봿뵁뵂뵃뵄뵅뵆뵇뵊뵋뵍뵎뵏뵑뵒뵓뵔뵕뵖뵗뵚뵛뵜뵝뵞뵟뵠뵡뵢뵣뵥뵦뵧뵩뵪뵫뵬뵭뵮뵯뵰뵱뵲뵳뵴뵵뵶뵷뵸뵹뵺뵻뵼뵽뵾뵿붂붃붅붆붋붌붍붎붏붒붔붖붗붘붛붝붞붟붠붡붢붣붥붦붧붨붩붪붫붬붭붮붯붱붲붳붴붵붶붷붹붺붻붼붽붾붿뷀뷁뷂뷃뷄뷅뷆뷇뷈뷉뷊뷋뷌뷍뷎뷏뷐뷑�".split(""),e=0;e!=n[148].length;++e)65533!==n[148][e].charCodeAt(0)&&(r[n[148][e]]=37888+e,t[37888+e]=n[148][e]);for(n[149]="�����������������������������������������������������������������뷒뷓뷖뷗뷙뷚뷛뷝뷞뷟뷠뷡뷢뷣뷤뷥뷦뷧뷨뷪뷫뷬뷭뷮뷯뷱������뷲뷳뷵뷶뷷뷹뷺뷻뷼뷽뷾뷿븁븂븄븆븇븈븉븊븋븎븏븑븒븓������븕븖븗븘븙븚븛븞븠븡븢븣븤븥븦븧븨븩븪븫븬븭븮븯븰븱븲븳븴븵븶븷븸븹븺븻븼븽븾븿빀빁빂빃빆빇빉빊빋빍빏빐빑빒빓빖빘빜빝빞빟빢빣빥빦빧빩빫빬빭빮빯빲빶빷빸빹빺빾빿뺁뺂뺃뺅뺆뺇뺈뺉뺊뺋뺎뺒뺓뺔뺕뺖뺗뺚뺛뺜뺝뺞뺟뺠뺡뺢뺣뺤뺥뺦뺧뺩뺪뺫뺬뺭뺮뺯뺰뺱뺲뺳뺴뺵뺶뺷�".split(""),e=0;e!=n[149].length;++e)65533!==n[149][e].charCodeAt(0)&&(r[n[149][e]]=38144+e,t[38144+e]=n[149][e]);for(n[150]="�����������������������������������������������������������������뺸뺹뺺뺻뺼뺽뺾뺿뻀뻁뻂뻃뻄뻅뻆뻇뻈뻉뻊뻋뻌뻍뻎뻏뻒뻓������뻕뻖뻙뻚뻛뻜뻝뻞뻟뻡뻢뻦뻧뻨뻩뻪뻫뻭뻮뻯뻰뻱뻲뻳뻴뻵������뻶뻷뻸뻹뻺뻻뻼뻽뻾뻿뼀뼂뼃뼄뼅뼆뼇뼊뼋뼌뼍뼎뼏뼐뼑뼒뼓뼔뼕뼖뼗뼚뼞뼟뼠뼡뼢뼣뼤뼥뼦뼧뼨뼩뼪뼫뼬뼭뼮뼯뼰뼱뼲뼳뼴뼵뼶뼷뼸뼹뼺뼻뼼뼽뼾뼿뽂뽃뽅뽆뽇뽉뽊뽋뽌뽍뽎뽏뽒뽓뽔뽖뽗뽘뽙뽚뽛뽜뽝뽞뽟뽠뽡뽢뽣뽤뽥뽦뽧뽨뽩뽪뽫뽬뽭뽮뽯뽰뽱뽲뽳뽴뽵뽶뽷뽸뽹뽺뽻뽼뽽뽾뽿뾀뾁뾂�".split(""),e=0;e!=n[150].length;++e)65533!==n[150][e].charCodeAt(0)&&(r[n[150][e]]=38400+e,t[38400+e]=n[150][e]);for(n[151]="�����������������������������������������������������������������뾃뾄뾅뾆뾇뾈뾉뾊뾋뾌뾍뾎뾏뾐뾑뾒뾓뾕뾖뾗뾘뾙뾚뾛뾜뾝������뾞뾟뾠뾡뾢뾣뾤뾥뾦뾧뾨뾩뾪뾫뾬뾭뾮뾯뾱뾲뾳뾴뾵뾶뾷뾸������뾹뾺뾻뾼뾽뾾뾿뿀뿁뿂뿃뿄뿆뿇뿈뿉뿊뿋뿎뿏뿑뿒뿓뿕뿖뿗뿘뿙뿚뿛뿝뿞뿠뿢뿣뿤뿥뿦뿧뿨뿩뿪뿫뿬뿭뿮뿯뿰뿱뿲뿳뿴뿵뿶뿷뿸뿹뿺뿻뿼뿽뿾뿿쀀쀁쀂쀃쀄쀅쀆쀇쀈쀉쀊쀋쀌쀍쀎쀏쀐쀑쀒쀓쀔쀕쀖쀗쀘쀙쀚쀛쀜쀝쀞쀟쀠쀡쀢쀣쀤쀥쀦쀧쀨쀩쀪쀫쀬쀭쀮쀯쀰쀱쀲쀳쀴쀵쀶쀷쀸쀹쀺쀻쀽쀾쀿�".split(""),e=0;e!=n[151].length;++e)65533!==n[151][e].charCodeAt(0)&&(r[n[151][e]]=38656+e,t[38656+e]=n[151][e]);for(n[152]="�����������������������������������������������������������������쁀쁁쁂쁃쁄쁅쁆쁇쁈쁉쁊쁋쁌쁍쁎쁏쁐쁒쁓쁔쁕쁖쁗쁙쁚쁛������쁝쁞쁟쁡쁢쁣쁤쁥쁦쁧쁪쁫쁬쁭쁮쁯쁰쁱쁲쁳쁴쁵쁶쁷쁸쁹������쁺쁻쁼쁽쁾쁿삀삁삂삃삄삅삆삇삈삉삊삋삌삍삎삏삒삓삕삖삗삙삚삛삜삝삞삟삢삤삦삧삨삩삪삫삮삱삲삷삸삹삺삻삾샂샃샄샆샇샊샋샍샎샏샑샒샓샔샕샖샗샚샞샟샠샡샢샣샦샧샩샪샫샭샮샯샰샱샲샳샶샸샺샻샼샽샾샿섁섂섃섅섆섇섉섊섋섌섍섎섏섑섒섓섔섖섗섘섙섚섛섡섢섥섨섩섪섫섮�".split(""),e=0;e!=n[152].length;++e)65533!==n[152][e].charCodeAt(0)&&(r[n[152][e]]=38912+e,t[38912+e]=n[152][e]);for(n[153]="�����������������������������������������������������������������섲섳섴섵섷섺섻섽섾섿셁셂셃셄셅셆셇셊셎셏셐셑셒셓셖셗������셙셚셛셝셞셟셠셡셢셣셦셪셫셬셭셮셯셱셲셳셵셶셷셹셺셻������셼셽셾셿솀솁솂솃솄솆솇솈솉솊솋솏솑솒솓솕솗솘솙솚솛솞솠솢솣솤솦솧솪솫솭솮솯솱솲솳솴솵솶솷솸솹솺솻솼솾솿쇀쇁쇂쇃쇅쇆쇇쇉쇊쇋쇍쇎쇏쇐쇑쇒쇓쇕쇖쇙쇚쇛쇜쇝쇞쇟쇡쇢쇣쇥쇦쇧쇩쇪쇫쇬쇭쇮쇯쇲쇴쇵쇶쇷쇸쇹쇺쇻쇾쇿숁숂숃숅숆숇숈숉숊숋숎숐숒숓숔숕숖숗숚숛숝숞숡숢숣�".split(""),e=0;e!=n[153].length;++e)65533!==n[153][e].charCodeAt(0)&&(r[n[153][e]]=39168+e,t[39168+e]=n[153][e]);for(n[154]="�����������������������������������������������������������������숤숥숦숧숪숬숮숰숳숵숶숷숸숹숺숻숼숽숾숿쉀쉁쉂쉃쉄쉅������쉆쉇쉉쉊쉋쉌쉍쉎쉏쉒쉓쉕쉖쉗쉙쉚쉛쉜쉝쉞쉟쉡쉢쉣쉤쉦������쉧쉨쉩쉪쉫쉮쉯쉱쉲쉳쉵쉶쉷쉸쉹쉺쉻쉾슀슂슃슄슅슆슇슊슋슌슍슎슏슑슒슓슔슕슖슗슙슚슜슞슟슠슡슢슣슦슧슩슪슫슮슯슰슱슲슳슶슸슺슻슼슽슾슿싀싁싂싃싄싅싆싇싈싉싊싋싌싍싎싏싐싑싒싓싔싕싖싗싘싙싚싛싞싟싡싢싥싦싧싨싩싪싮싰싲싳싴싵싷싺싽싾싿쌁쌂쌃쌄쌅쌆쌇쌊쌋쌎쌏�".split(""),e=0;e!=n[154].length;++e)65533!==n[154][e].charCodeAt(0)&&(r[n[154][e]]=39424+e,t[39424+e]=n[154][e]);for(n[155]="�����������������������������������������������������������������쌐쌑쌒쌖쌗쌙쌚쌛쌝쌞쌟쌠쌡쌢쌣쌦쌧쌪쌫쌬쌭쌮쌯쌰쌱쌲������쌳쌴쌵쌶쌷쌸쌹쌺쌻쌼쌽쌾쌿썀썁썂썃썄썆썇썈썉썊썋썌썍������썎썏썐썑썒썓썔썕썖썗썘썙썚썛썜썝썞썟썠썡썢썣썤썥썦썧썪썫썭썮썯썱썳썴썵썶썷썺썻썾썿쎀쎁쎂쎃쎅쎆쎇쎉쎊쎋쎍쎎쎏쎐쎑쎒쎓쎔쎕쎖쎗쎘쎙쎚쎛쎜쎝쎞쎟쎠쎡쎢쎣쎤쎥쎦쎧쎨쎩쎪쎫쎬쎭쎮쎯쎰쎱쎲쎳쎴쎵쎶쎷쎸쎹쎺쎻쎼쎽쎾쎿쏁쏂쏃쏄쏅쏆쏇쏈쏉쏊쏋쏌쏍쏎쏏쏐쏑쏒쏓쏔쏕쏖쏗쏚�".split(""),e=0;e!=n[155].length;++e)65533!==n[155][e].charCodeAt(0)&&(r[n[155][e]]=39680+e,t[39680+e]=n[155][e]);for(n[156]="�����������������������������������������������������������������쏛쏝쏞쏡쏣쏤쏥쏦쏧쏪쏫쏬쏮쏯쏰쏱쏲쏳쏶쏷쏹쏺쏻쏼쏽쏾������쏿쐀쐁쐂쐃쐄쐅쐆쐇쐉쐊쐋쐌쐍쐎쐏쐑쐒쐓쐔쐕쐖쐗쐘쐙쐚������쐛쐜쐝쐞쐟쐠쐡쐢쐣쐥쐦쐧쐨쐩쐪쐫쐭쐮쐯쐱쐲쐳쐵쐶쐷쐸쐹쐺쐻쐾쐿쑀쑁쑂쑃쑄쑅쑆쑇쑉쑊쑋쑌쑍쑎쑏쑐쑑쑒쑓쑔쑕쑖쑗쑘쑙쑚쑛쑜쑝쑞쑟쑠쑡쑢쑣쑦쑧쑩쑪쑫쑭쑮쑯쑰쑱쑲쑳쑶쑷쑸쑺쑻쑼쑽쑾쑿쒁쒂쒃쒄쒅쒆쒇쒈쒉쒊쒋쒌쒍쒎쒏쒐쒑쒒쒓쒕쒖쒗쒘쒙쒚쒛쒝쒞쒟쒠쒡쒢쒣쒤쒥쒦쒧쒨쒩�".split(""),e=0;e!=n[156].length;++e)65533!==n[156][e].charCodeAt(0)&&(r[n[156][e]]=39936+e,t[39936+e]=n[156][e]);for(n[157]="�����������������������������������������������������������������쒪쒫쒬쒭쒮쒯쒰쒱쒲쒳쒴쒵쒶쒷쒹쒺쒻쒽쒾쒿쓀쓁쓂쓃쓄쓅������쓆쓇쓈쓉쓊쓋쓌쓍쓎쓏쓐쓑쓒쓓쓔쓕쓖쓗쓘쓙쓚쓛쓜쓝쓞쓟������쓠쓡쓢쓣쓤쓥쓦쓧쓨쓪쓫쓬쓭쓮쓯쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂씃씄씅씆씇씈씉씊씋씍씎씏씑씒씓씕씖씗씘씙씚씛씝씞씟씠씡씢씣씤씥씦씧씪씫씭씮씯씱씲씳씴씵씶씷씺씼씾씿앀앁앂앃앆앇앋앏앐앑앒앖앚앛앜앟앢앣앥앦앧앩앪앫앬앭앮앯앲앶앷앸앹앺앻앾앿얁얂얃얅얆얈얉얊얋얎얐얒얓얔�".split(""),e=0;e!=n[157].length;++e)65533!==n[157][e].charCodeAt(0)&&(r[n[157][e]]=40192+e,t[40192+e]=n[157][e]);for(n[158]="�����������������������������������������������������������������얖얙얚얛얝얞얟얡얢얣얤얥얦얧얨얪얫얬얭얮얯얰얱얲얳얶������얷얺얿엀엁엂엃엋엍엏엒엓엕엖엗엙엚엛엜엝엞엟엢엤엦엧������엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋옍옎옏옑옒옓옔옕옖옗옚옝옞옟옠옡옢옣옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉왊왋왌왍왎왏왒왖왗왘왙왚왛왞왟왡왢왣왤왥왦왧왨왩왪왫왭왮왰왲왳왴왵왶왷왺왻왽왾왿욁욂욃욄욅욆욇욊욌욎욏욐욑욒욓욖욗욙욚욛욝욞욟욠욡욢욣욦�".split(""),e=0;e!=n[158].length;++e)65533!==n[158][e].charCodeAt(0)&&(r[n[158][e]]=40448+e,t[40448+e]=n[158][e]);for(n[159]="�����������������������������������������������������������������욨욪욫욬욭욮욯욲욳욵욶욷욻욼욽욾욿웂웄웆웇웈웉웊웋웎������웏웑웒웓웕웖웗웘웙웚웛웞웟웢웣웤웥웦웧웪웫웭웮웯웱웲������웳웴웵웶웷웺웻웼웾웿윀윁윂윃윆윇윉윊윋윍윎윏윐윑윒윓윖윘윚윛윜윝윞윟윢윣윥윦윧윩윪윫윬윭윮윯윲윴윶윸윹윺윻윾윿읁읂읃읅읆읇읈읉읋읎읐읙읚읛읝읞읟읡읢읣읤읥읦읧읩읪읬읭읮읯읰읱읲읳읶읷읹읺읻읿잀잁잂잆잋잌잍잏잒잓잕잙잛잜잝잞잟잢잧잨잩잪잫잮잯잱잲잳잵잶잷�".split(""),e=0;e!=n[159].length;++e)65533!==n[159][e].charCodeAt(0)&&(r[n[159][e]]=40704+e,t[40704+e]=n[159][e]);for(n[160]="�����������������������������������������������������������������잸잹잺잻잾쟂쟃쟄쟅쟆쟇쟊쟋쟍쟏쟑쟒쟓쟔쟕쟖쟗쟙쟚쟛쟜������쟞쟟쟠쟡쟢쟣쟥쟦쟧쟩쟪쟫쟭쟮쟯쟰쟱쟲쟳쟴쟵쟶쟷쟸쟹쟺������쟻쟼쟽쟾쟿젂젃젅젆젇젉젋젌젍젎젏젒젔젗젘젙젚젛젞젟젡젢젣젥젦젧젨젩젪젫젮젰젲젳젴젵젶젷젹젺젻젽젾젿졁졂졃졄졅졆졇졊졋졎졏졐졑졒졓졕졖졗졘졙졚졛졜졝졞졟졠졡졢졣졤졥졦졧졨졩졪졫졬졭졮졯졲졳졵졶졷졹졻졼졽졾졿좂좄좈좉좊좎좏좐좑좒좓좕좖좗좘좙좚좛좜좞좠좢좣좤�".split(""),e=0;e!=n[160].length;++e)65533!==n[160][e].charCodeAt(0)&&(r[n[160][e]]=40960+e,t[40960+e]=n[160][e]);for(n[161]="�����������������������������������������������������������������좥좦좧좩좪좫좬좭좮좯좰좱좲좳좴좵좶좷좸좹좺좻좾좿죀죁������죂죃죅죆죇죉죊죋죍죎죏죐죑죒죓죖죘죚죛죜죝죞죟죢죣죥������죦죧죨죩죪죫죬죭죮죯죰죱죲죳죴죶죷죸죹죺죻죾죿줁줂줃줇줈줉줊줋줎 、。·‥…¨〃­―∥\∼‘’“”〔〕〈〉《》「」『』【】±×÷≠≤≥∞∴°′″℃Å¢£¥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨¬�".split(""),e=0;e!=n[161].length;++e)65533!==n[161][e].charCodeAt(0)&&(r[n[161][e]]=41216+e,t[41216+e]=n[161][e]);for(n[162]="�����������������������������������������������������������������줐줒줓줔줕줖줗줙줚줛줜줝줞줟줠줡줢줣줤줥줦줧줨줩줪줫������줭줮줯줰줱줲줳줵줶줷줸줹줺줻줼줽줾줿쥀쥁쥂쥃쥄쥅쥆쥇������쥈쥉쥊쥋쥌쥍쥎쥏쥒쥓쥕쥖쥗쥙쥚쥛쥜쥝쥞쥟쥢쥤쥥쥦쥧쥨쥩쥪쥫쥭쥮쥯⇒⇔∀∃´~ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®������������������������".split(""),e=0;e!=n[162].length;++e)65533!==n[162][e].charCodeAt(0)&&(r[n[162][e]]=41472+e,t[41472+e]=n[162][e]);for(n[163]="�����������������������������������������������������������������쥱쥲쥳쥵쥶쥷쥸쥹쥺쥻쥽쥾쥿즀즁즂즃즄즅즆즇즊즋즍즎즏������즑즒즓즔즕즖즗즚즜즞즟즠즡즢즣즤즥즦즧즨즩즪즫즬즭즮������즯즰즱즲즳즴즵즶즷즸즹즺즻즼즽즾즿짂짃짅짆짉짋짌짍짎짏짒짔짗짘짛!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[₩]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�".split(""),e=0;e!=n[163].length;++e)65533!==n[163][e].charCodeAt(0)&&(r[n[163][e]]=41728+e,t[41728+e]=n[163][e]);for(n[164]="�����������������������������������������������������������������짞짟짡짣짥짦짨짩짪짫짮짲짳짴짵짶짷짺짻짽짾짿쨁쨂쨃쨄������쨅쨆쨇쨊쨎쨏쨐쨑쨒쨓쨕쨖쨗쨙쨚쨛쨜쨝쨞쨟쨠쨡쨢쨣쨤쨥������쨦쨧쨨쨪쨫쨬쨭쨮쨯쨰쨱쨲쨳쨴쨵쨶쨷쨸쨹쨺쨻쨼쨽쨾쨿쩀쩁쩂쩃쩄쩅쩆ㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅃㅄㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣㅤㅥㅦㅧㅨㅩㅪㅫㅬㅭㅮㅯㅰㅱㅲㅳㅴㅵㅶㅷㅸㅹㅺㅻㅼㅽㅾㅿㆀㆁㆂㆃㆄㆅㆆㆇㆈㆉㆊㆋㆌㆍㆎ�".split(""),e=0;e!=n[164].length;++e)65533!==n[164][e].charCodeAt(0)&&(r[n[164][e]]=41984+e,t[41984+e]=n[164][e]);for(n[165]="�����������������������������������������������������������������쩇쩈쩉쩊쩋쩎쩏쩑쩒쩓쩕쩖쩗쩘쩙쩚쩛쩞쩢쩣쩤쩥쩦쩧쩩쩪������쩫쩬쩭쩮쩯쩰쩱쩲쩳쩴쩵쩶쩷쩸쩹쩺쩻쩼쩾쩿쪀쪁쪂쪃쪅쪆������쪇쪈쪉쪊쪋쪌쪍쪎쪏쪐쪑쪒쪓쪔쪕쪖쪗쪙쪚쪛쪜쪝쪞쪟쪠쪡쪢쪣쪤쪥쪦쪧ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ�����ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ�������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�������".split(""),e=0;e!=n[165].length;++e)65533!==n[165][e].charCodeAt(0)&&(r[n[165][e]]=42240+e,t[42240+e]=n[165][e]);for(n[166]="�����������������������������������������������������������������쪨쪩쪪쪫쪬쪭쪮쪯쪰쪱쪲쪳쪴쪵쪶쪷쪸쪹쪺쪻쪾쪿쫁쫂쫃쫅������쫆쫇쫈쫉쫊쫋쫎쫐쫒쫔쫕쫖쫗쫚쫛쫜쫝쫞쫟쫡쫢쫣쫤쫥쫦쫧������쫨쫩쫪쫫쫭쫮쫯쫰쫱쫲쫳쫵쫶쫷쫸쫹쫺쫻쫼쫽쫾쫿쬀쬁쬂쬃쬄쬅쬆쬇쬉쬊─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂┒┑┚┙┖┕┎┍┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀╁╃╄╅╆╇╈╉╊���������������������������".split(""),e=0;e!=n[166].length;++e)65533!==n[166][e].charCodeAt(0)&&(r[n[166][e]]=42496+e,t[42496+e]=n[166][e]);for(n[167]="�����������������������������������������������������������������쬋쬌쬍쬎쬏쬑쬒쬓쬕쬖쬗쬙쬚쬛쬜쬝쬞쬟쬢쬣쬤쬥쬦쬧쬨쬩������쬪쬫쬬쬭쬮쬯쬰쬱쬲쬳쬴쬵쬶쬷쬸쬹쬺쬻쬼쬽쬾쬿쭀쭂쭃쭄������쭅쭆쭇쭊쭋쭍쭎쭏쭑쭒쭓쭔쭕쭖쭗쭚쭛쭜쭞쭟쭠쭡쭢쭣쭥쭦쭧쭨쭩쭪쭫쭬㎕㎖㎗ℓ㎘㏄㎣㎤㎥㎦㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㏊㎍㎎㎏㏏㎈㎉㏈㎧㎨㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎀㎁㎂㎃㎄㎺㎻㎼㎽㎾㎿㎐㎑㎒㎓㎔Ω㏀㏁㎊㎋㎌㏖㏅㎭㎮㎯㏛㎩㎪㎫㎬㏝㏐㏓㏃㏉㏜㏆����������������".split(""),e=0;e!=n[167].length;++e)65533!==n[167][e].charCodeAt(0)&&(r[n[167][e]]=42752+e,t[42752+e]=n[167][e]);for(n[168]="�����������������������������������������������������������������쭭쭮쭯쭰쭱쭲쭳쭴쭵쭶쭷쭺쭻쭼쭽쭾쭿쮀쮁쮂쮃쮄쮅쮆쮇쮈������쮉쮊쮋쮌쮍쮎쮏쮐쮑쮒쮓쮔쮕쮖쮗쮘쮙쮚쮛쮝쮞쮟쮠쮡쮢쮣������쮤쮥쮦쮧쮨쮩쮪쮫쮬쮭쮮쮯쮰쮱쮲쮳쮴쮵쮶쮷쮹쮺쮻쮼쮽쮾쮿쯀쯁쯂쯃쯄ÆÐªĦ�IJ�ĿŁØŒºÞŦŊ�㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮½⅓⅔¼¾⅛⅜⅝⅞�".split(""),e=0;e!=n[168].length;++e)65533!==n[168][e].charCodeAt(0)&&(r[n[168][e]]=43008+e,t[43008+e]=n[168][e]);for(n[169]="�����������������������������������������������������������������쯅쯆쯇쯈쯉쯊쯋쯌쯍쯎쯏쯐쯑쯒쯓쯕쯖쯗쯘쯙쯚쯛쯜쯝쯞쯟������쯠쯡쯢쯣쯥쯦쯨쯪쯫쯬쯭쯮쯯쯰쯱쯲쯳쯴쯵쯶쯷쯸쯹쯺쯻쯼������쯽쯾쯿찀찁찂찃찄찅찆찇찈찉찊찋찎찏찑찒찓찕찖찗찘찙찚찛찞찟찠찣찤æđðħıijĸŀłøœßþŧŋʼn㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗㈘㈙㈚㈛⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂¹²³⁴ⁿ₁₂₃₄�".split(""),e=0;e!=n[169].length;++e)65533!==n[169][e].charCodeAt(0)&&(r[n[169][e]]=43264+e,t[43264+e]=n[169][e]);for(n[170]="�����������������������������������������������������������������찥찦찪찫찭찯찱찲찳찴찵찶찷찺찿챀챁챂챃챆챇챉챊챋챍챎������챏챐챑챒챓챖챚챛챜챝챞챟챡챢챣챥챧챩챪챫챬챭챮챯챱챲������챳챴챶챷챸챹챺챻챼챽챾챿첀첁첂첃첄첅첆첇첈첉첊첋첌첍첎첏첐첑첒첓ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������".split(""),e=0;e!=n[170].length;++e)65533!==n[170][e].charCodeAt(0)&&(r[n[170][e]]=43520+e,t[43520+e]=n[170][e]);for(n[171]="�����������������������������������������������������������������첔첕첖첗첚첛첝첞첟첡첢첣첤첥첦첧첪첮첯첰첱첲첳첶첷첹������첺첻첽첾첿쳀쳁쳂쳃쳆쳈쳊쳋쳌쳍쳎쳏쳑쳒쳓쳕쳖쳗쳘쳙쳚������쳛쳜쳝쳞쳟쳠쳡쳢쳣쳥쳦쳧쳨쳩쳪쳫쳭쳮쳯쳱쳲쳳쳴쳵쳶쳷쳸쳹쳺쳻쳼쳽ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������".split(""),e=0;e!=n[171].length;++e)65533!==n[171][e].charCodeAt(0)&&(r[n[171][e]]=43776+e,t[43776+e]=n[171][e]);for(n[172]="�����������������������������������������������������������������쳾쳿촀촂촃촄촅촆촇촊촋촍촎촏촑촒촓촔촕촖촗촚촜촞촟촠������촡촢촣촥촦촧촩촪촫촭촮촯촰촱촲촳촴촵촶촷촸촺촻촼촽촾������촿쵀쵁쵂쵃쵄쵅쵆쵇쵈쵉쵊쵋쵌쵍쵎쵏쵐쵑쵒쵓쵔쵕쵖쵗쵘쵙쵚쵛쵝쵞쵟АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������".split(""),e=0;e!=n[172].length;++e)65533!==n[172][e].charCodeAt(0)&&(r[n[172][e]]=44032+e,t[44032+e]=n[172][e]);for(n[173]="�����������������������������������������������������������������쵡쵢쵣쵥쵦쵧쵨쵩쵪쵫쵮쵰쵲쵳쵴쵵쵶쵷쵹쵺쵻쵼쵽쵾쵿춀������춁춂춃춄춅춆춇춉춊춋춌춍춎춏춐춑춒춓춖춗춙춚춛춝춞춟������춠춡춢춣춦춨춪춫춬춭춮춯춱춲춳춴춵춶춷춸춹춺춻춼춽춾춿췀췁췂췃췅�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[173].length;++e)65533!==n[173][e].charCodeAt(0)&&(r[n[173][e]]=44288+e,t[44288+e]=n[173][e]);for(n[174]="�����������������������������������������������������������������췆췇췈췉췊췋췍췎췏췑췒췓췔췕췖췗췘췙췚췛췜췝췞췟췠췡������췢췣췤췥췦췧췩췪췫췭췮췯췱췲췳췴췵췶췷췺췼췾췿츀츁츂������츃츅츆츇츉츊츋츍츎츏츐츑츒츓츕츖츗츘츚츛츜츝츞츟츢츣츥츦츧츩츪츫�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[174].length;++e)65533!==n[174][e].charCodeAt(0)&&(r[n[174][e]]=44544+e,t[44544+e]=n[174][e]);for(n[175]="�����������������������������������������������������������������츬츭츮츯츲츴츶츷츸츹츺츻츼츽츾츿칀칁칂칃칄칅칆칇칈칉������칊칋칌칍칎칏칐칑칒칓칔칕칖칗칚칛칝칞칢칣칤칥칦칧칪칬������칮칯칰칱칲칳칶칷칹칺칻칽칾칿캀캁캂캃캆캈캊캋캌캍캎캏캒캓캕캖캗캙�����������������������������������������������������������������������������������������������".split(""),e=0;e!=n[175].length;++e)65533!==n[175][e].charCodeAt(0)&&(r[n[175][e]]=44800+e,t[44800+e]=n[175][e]);for(n[176]="�����������������������������������������������������������������캚캛캜캝캞캟캢캦캧캨캩캪캫캮캯캰캱캲캳캴캵캶캷캸캹캺������캻캼캽캾캿컀컂컃컄컅컆컇컈컉컊컋컌컍컎컏컐컑컒컓컔컕������컖컗컘컙컚컛컜컝컞컟컠컡컢컣컦컧컩컪컭컮컯컰컱컲컳컶컺컻컼컽컾컿가각간갇갈갉갊감갑값갓갔강갖갗같갚갛개객갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆�".split(""),e=0;e!=n[176].length;++e)65533!==n[176][e].charCodeAt(0)&&(r[n[176][e]]=45056+e,t[45056+e]=n[176][e]);for(n[177]="�����������������������������������������������������������������켂켃켅켆켇켉켊켋켌켍켎켏켒켔켖켗켘켙켚켛켝켞켟켡켢켣������켥켦켧켨켩켪켫켮켲켳켴켵켶켷켹켺켻켼켽켾켿콀콁콂콃콄������콅콆콇콈콉콊콋콌콍콎콏콐콑콒콓콖콗콙콚콛콝콞콟콠콡콢콣콦콨콪콫콬괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸�".split(""),e=0;e!=n[177].length;++e)65533!==n[177][e].charCodeAt(0)&&(r[n[177][e]]=45312+e,t[45312+e]=n[177][e]);for(n[178]="�����������������������������������������������������������������콭콮콯콲콳콵콶콷콹콺콻콼콽콾콿쾁쾂쾃쾄쾆쾇쾈쾉쾊쾋쾍������쾎쾏쾐쾑쾒쾓쾔쾕쾖쾗쾘쾙쾚쾛쾜쾝쾞쾟쾠쾢쾣쾤쾥쾦쾧쾩������쾪쾫쾬쾭쾮쾯쾱쾲쾳쾴쾵쾶쾷쾸쾹쾺쾻쾼쾽쾾쾿쿀쿁쿂쿃쿅쿆쿇쿈쿉쿊쿋깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙�".split(""),e=0;e!=n[178].length;++e)65533!==n[178][e].charCodeAt(0)&&(r[n[178][e]]=45568+e,t[45568+e]=n[178][e]);for(n[179]="�����������������������������������������������������������������쿌쿍쿎쿏쿐쿑쿒쿓쿔쿕쿖쿗쿘쿙쿚쿛쿜쿝쿞쿟쿢쿣쿥쿦쿧쿩������쿪쿫쿬쿭쿮쿯쿲쿴쿶쿷쿸쿹쿺쿻쿽쿾쿿퀁퀂퀃퀅퀆퀇퀈퀉퀊������퀋퀌퀍퀎퀏퀐퀒퀓퀔퀕퀖퀗퀙퀚퀛퀜퀝퀞퀟퀠퀡퀢퀣퀤퀥퀦퀧퀨퀩퀪퀫퀬끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫났낭낮낯낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝�".split(""),e=0;e!=n[179].length;++e)65533!==n[179][e].charCodeAt(0)&&(r[n[179][e]]=45824+e,t[45824+e]=n[179][e]);for(n[180]="�����������������������������������������������������������������퀮퀯퀰퀱퀲퀳퀶퀷퀹퀺퀻퀽퀾퀿큀큁큂큃큆큈큊큋큌큍큎큏������큑큒큓큕큖큗큙큚큛큜큝큞큟큡큢큣큤큥큦큧큨큩큪큫큮큯������큱큲큳큵큶큷큸큹큺큻큾큿킀킂킃킄킅킆킇킈킉킊킋킌킍킎킏킐킑킒킓킔뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫달닭닮닯닳담답닷닸당닺닻닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥�".split(""),e=0;e!=n[180].length;++e)65533!==n[180][e].charCodeAt(0)&&(r[n[180][e]]=46080+e,t[46080+e]=n[180][e]);for(n[181]="�����������������������������������������������������������������킕킖킗킘킙킚킛킜킝킞킟킠킡킢킣킦킧킩킪킫킭킮킯킰킱킲������킳킶킸킺킻킼킽킾킿탂탃탅탆탇탊탋탌탍탎탏탒탖탗탘탙탚������탛탞탟탡탢탣탥탦탧탨탩탪탫탮탲탳탴탵탶탷탹탺탻탼탽탾탿턀턁턂턃턄덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸�".split(""),e=0;e!=n[181].length;++e)65533!==n[181][e].charCodeAt(0)&&(r[n[181][e]]=46336+e,t[46336+e]=n[181][e]);for(n[182]="�����������������������������������������������������������������턅턆턇턈턉턊턋턌턎턏턐턑턒턓턔턕턖턗턘턙턚턛턜턝턞턟������턠턡턢턣턤턥턦턧턨턩턪턫턬턭턮턯턲턳턵턶턷턹턻턼턽턾������턿텂텆텇텈텉텊텋텎텏텑텒텓텕텖텗텘텙텚텛텞텠텢텣텤텥텦텧텩텪텫텭땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗�".split(""),e=0;e!=n[182].length;++e)65533!==n[182][e].charCodeAt(0)&&(r[n[182][e]]=46592+e,t[46592+e]=n[182][e]);for(n[183]="�����������������������������������������������������������������텮텯텰텱텲텳텴텵텶텷텸텹텺텻텽텾텿톀톁톂톃톅톆톇톉톊������톋톌톍톎톏톐톑톒톓톔톕톖톗톘톙톚톛톜톝톞톟톢톣톥톦톧������톩톪톫톬톭톮톯톲톴톶톷톸톹톻톽톾톿퇁퇂퇃퇄퇅퇆퇇퇈퇉퇊퇋퇌퇍퇎퇏래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩�".split(""),e=0;e!=n[183].length;++e)65533!==n[183][e].charCodeAt(0)&&(r[n[183][e]]=46848+e,t[46848+e]=n[183][e]);for(n[184]="�����������������������������������������������������������������퇐퇑퇒퇓퇔퇕퇖퇗퇙퇚퇛퇜퇝퇞퇟퇠퇡퇢퇣퇤퇥퇦퇧퇨퇩퇪������퇫퇬퇭퇮퇯퇰퇱퇲퇳퇵퇶퇷퇹퇺퇻퇼퇽퇾퇿툀툁툂툃툄툅툆������툈툊툋툌툍툎툏툑툒툓툔툕툖툗툘툙툚툛툜툝툞툟툠툡툢툣툤툥툦툧툨툩륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많맏말맑맒맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼�".split(""),e=0;e!=n[184].length;++e)65533!==n[184][e].charCodeAt(0)&&(r[n[184][e]]=47104+e,t[47104+e]=n[184][e]);for(n[185]="�����������������������������������������������������������������툪툫툮툯툱툲툳툵툶툷툸툹툺툻툾퉀퉂퉃퉄퉅퉆퉇퉉퉊퉋퉌������퉍퉎퉏퉐퉑퉒퉓퉔퉕퉖퉗퉘퉙퉚퉛퉝퉞퉟퉠퉡퉢퉣퉥퉦퉧퉨������퉩퉪퉫퉬퉭퉮퉯퉰퉱퉲퉳퉴퉵퉶퉷퉸퉹퉺퉻퉼퉽퉾퉿튂튃튅튆튇튉튊튋튌묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바박밖밗반받발밝밞밟밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗�".split(""),e=0;e!=n[185].length;++e)65533!==n[185][e].charCodeAt(0)&&(r[n[185][e]]=47360+e,t[47360+e]=n[185][e]);for(n[186]="�����������������������������������������������������������������튍튎튏튒튓튔튖튗튘튙튚튛튝튞튟튡튢튣튥튦튧튨튩튪튫튭������튮튯튰튲튳튴튵튶튷튺튻튽튾틁틃틄틅틆틇틊틌틍틎틏틐틑������틒틓틕틖틗틙틚틛틝틞틟틠틡틢틣틦틧틨틩틪틫틬틭틮틯틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤�".split(""),e=0;e!=n[186].length;++e)65533!==n[186][e].charCodeAt(0)&&(r[n[186][e]]=47616+e,t[47616+e]=n[186][e]);for(n[187]="�����������������������������������������������������������������틻틼틽틾틿팂팄팆팇팈팉팊팋팏팑팒팓팕팗팘팙팚팛팞팢팣������팤팦팧팪팫팭팮팯팱팲팳팴팵팶팷팺팾팿퍀퍁퍂퍃퍆퍇퍈퍉������퍊퍋퍌퍍퍎퍏퍐퍑퍒퍓퍔퍕퍖퍗퍘퍙퍚퍛퍜퍝퍞퍟퍠퍡퍢퍣퍤퍥퍦퍧퍨퍩빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤�".split(""),e=0;e!=n[187].length;++e)65533!==n[187][e].charCodeAt(0)&&(r[n[187][e]]=47872+e,t[47872+e]=n[187][e]);for(n[188]="�����������������������������������������������������������������퍪퍫퍬퍭퍮퍯퍰퍱퍲퍳퍴퍵퍶퍷퍸퍹퍺퍻퍾퍿펁펂펃펅펆펇������펈펉펊펋펎펒펓펔펕펖펗펚펛펝펞펟펡펢펣펤펥펦펧펪펬펮������펯펰펱펲펳펵펶펷펹펺펻펽펾펿폀폁폂폃폆폇폊폋폌폍폎폏폑폒폓폔폕폖샥샨샬샴샵샷샹섀섄섈섐섕서석섞섟선섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭�".split(""),e=0;e!=n[188].length;++e)65533!==n[188][e].charCodeAt(0)&&(r[n[188][e]]=48128+e,t[48128+e]=n[188][e]);for(n[189]="�����������������������������������������������������������������폗폙폚폛폜폝폞폟폠폢폤폥폦폧폨폩폪폫폮폯폱폲폳폵폶폷������폸폹폺폻폾퐀퐂퐃퐄퐅퐆퐇퐉퐊퐋퐌퐍퐎퐏퐐퐑퐒퐓퐔퐕퐖������퐗퐘퐙퐚퐛퐜퐞퐟퐠퐡퐢퐣퐤퐥퐦퐧퐨퐩퐪퐫퐬퐭퐮퐯퐰퐱퐲퐳퐴퐵퐶퐷숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰�".split(""),e=0;e!=n[189].length;++e)65533!==n[189][e].charCodeAt(0)&&(r[n[189][e]]=48384+e,t[48384+e]=n[189][e]);for(n[190]="�����������������������������������������������������������������퐸퐹퐺퐻퐼퐽퐾퐿푁푂푃푅푆푇푈푉푊푋푌푍푎푏푐푑푒푓������푔푕푖푗푘푙푚푛푝푞푟푡푢푣푥푦푧푨푩푪푫푬푮푰푱푲������푳푴푵푶푷푺푻푽푾풁풃풄풅풆풇풊풌풎풏풐풑풒풓풕풖풗풘풙풚풛풜풝쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄업없엇었엉엊엌엎�".split(""),e=0;e!=n[190].length;++e)65533!==n[190][e].charCodeAt(0)&&(r[n[190][e]]=48640+e,t[48640+e]=n[190][e]);for(n[191]="�����������������������������������������������������������������풞풟풠풡풢풣풤풥풦풧풨풪풫풬풭풮풯풰풱풲풳풴풵풶풷풸������풹풺풻풼풽풾풿퓀퓁퓂퓃퓄퓅퓆퓇퓈퓉퓊퓋퓍퓎퓏퓑퓒퓓퓕������퓖퓗퓘퓙퓚퓛퓝퓞퓠퓡퓢퓣퓤퓥퓦퓧퓩퓪퓫퓭퓮퓯퓱퓲퓳퓴퓵퓶퓷퓹퓺퓼에엑엔엘엠엡엣엥여역엮연열엶엷염엽엾엿였영옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨�".split(""),e=0;e!=n[191].length;++e)65533!==n[191][e].charCodeAt(0)&&(r[n[191][e]]=48896+e,t[48896+e]=n[191][e]);for(n[192]="�����������������������������������������������������������������퓾퓿픀픁픂픃픅픆픇픉픊픋픍픎픏픐픑픒픓픖픘픙픚픛픜픝������픞픟픠픡픢픣픤픥픦픧픨픩픪픫픬픭픮픯픰픱픲픳픴픵픶픷������픸픹픺픻픾픿핁핂핃핅핆핇핈핉핊핋핎핐핒핓핔핕핖핗핚핛핝핞핟핡핢핣웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응읒읓읔읕읖읗의읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊�".split(""),e=0;e!=n[192].length;++e)65533!==n[192][e].charCodeAt(0)&&(r[n[192][e]]=49152+e,t[49152+e]=n[192][e]);for(n[193]="�����������������������������������������������������������������핤핦핧핪핬핮핯핰핱핲핳핶핷핹핺핻핽핾핿햀햁햂햃햆햊햋������햌햍햎햏햑햒햓햔햕햖햗햘햙햚햛햜햝햞햟햠햡햢햣햤햦햧������햨햩햪햫햬햭햮햯햰햱햲햳햴햵햶햷햸햹햺햻햼햽햾햿헀헁헂헃헄헅헆헇점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓�".split(""),e=0;e!=n[193].length;++e)65533!==n[193][e].charCodeAt(0)&&(r[n[193][e]]=49408+e,t[49408+e]=n[193][e]);for(n[194]="�����������������������������������������������������������������헊헋헍헎헏헑헓헔헕헖헗헚헜헞헟헠헡헢헣헦헧헩헪헫헭헮������헯헰헱헲헳헶헸헺헻헼헽헾헿혂혃혅혆혇혉혊혋혌혍혎혏혒������혖혗혘혙혚혛혝혞혟혡혢혣혥혦혧혨혩혪혫혬혮혯혰혱혲혳혴혵혶혷혺혻징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻�".split(""),e=0;e!=n[194].length;++e)65533!==n[194][e].charCodeAt(0)&&(r[n[194][e]]=49664+e,t[49664+e]=n[194][e]);for(n[195]="�����������������������������������������������������������������혽혾혿홁홂홃홄홆홇홊홌홎홏홐홒홓홖홗홙홚홛홝홞홟홠홡������홢홣홤홥홦홨홪홫홬홭홮홯홲홳홵홶홷홸홹홺홻홼홽홾홿횀������횁횂횄횆횇횈횉횊횋횎횏횑횒횓횕횖횗횘횙횚횛횜횞횠횢횣횤횥횦횧횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층�".split(""),e=0;e!=n[195].length;++e)65533!==n[195][e].charCodeAt(0)&&(r[n[195][e]]=49920+e,t[49920+e]=n[195][e]);for(n[196]="�����������������������������������������������������������������횫횭횮횯횱횲횳횴횵횶횷횸횺횼횽횾횿훀훁훂훃훆훇훉훊훋������훍훎훏훐훒훓훕훖훘훚훛훜훝훞훟훡훢훣훥훦훧훩훪훫훬훭������훮훯훱훲훳훴훶훷훸훹훺훻훾훿휁휂휃휅휆휇휈휉휊휋휌휍휎휏휐휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼�".split(""),e=0;e!=n[196].length;++e)65533!==n[196][e].charCodeAt(0)&&(r[n[196][e]]=50176+e,t[50176+e]=n[196][e]);for(n[197]="�����������������������������������������������������������������휕휖휗휚휛휝휞휟휡휢휣휤휥휦휧휪휬휮휯휰휱휲휳휶휷휹������휺휻휽휾휿흀흁흂흃흅흆흈흊흋흌흍흎흏흒흓흕흚흛흜흝흞������흟흢흤흦흧흨흪흫흭흮흯흱흲흳흵흶흷흸흹흺흻흾흿힀힂힃힄힅힆힇힊힋큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜�".split(""),e=0;e!=n[197].length;++e)65533!==n[197][e].charCodeAt(0)&&(r[n[197][e]]=50432+e,t[50432+e]=n[197][e]);for(n[198]="�����������������������������������������������������������������힍힎힏힑힒힓힔힕힖힗힚힜힞힟힠힡힢힣������������������������������������������������������������������������������퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁�".split(""),e=0;e!=n[198].length;++e)65533!==n[198][e].charCodeAt(0)&&(r[n[198][e]]=50688+e,t[50688+e]=n[198][e]);for(n[199]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠�".split(""),e=0;e!=n[199].length;++e)65533!==n[199][e].charCodeAt(0)&&(r[n[199][e]]=50944+e,t[50944+e]=n[199][e]);for(n[200]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝�".split(""),e=0;e!=n[200].length;++e)65533!==n[200][e].charCodeAt(0)&&(r[n[200][e]]=51200+e,t[51200+e]=n[200][e]);for(n[202]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕刻却各恪慤殼珏脚覺角閣侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間乫喝曷渴碣竭葛褐蝎鞨勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕�".split(""),e=0;e!=n[202].length;++e)65533!==n[202][e].charCodeAt(0)&&(r[n[202][e]]=51712+e,t[51712+e]=n[202][e]);for(n[203]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開喀客坑更粳羹醵倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸乾件健巾建愆楗腱虔蹇鍵騫乞傑杰桀儉劍劒檢�".split(""),e=0;e!=n[203].length;++e)65533!==n[203][e].charCodeAt(0)&&(r[n[203][e]]=51968+e,t[51968+e]=n[203][e]);for(n[204]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������瞼鈐黔劫怯迲偈憩揭擊格檄激膈覡隔堅牽犬甄絹繭肩見譴遣鵑抉決潔結缺訣兼慊箝謙鉗鎌京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨係啓堺契季屆悸戒桂械�".split(""),e=0;e!=n[204].length;++e)65533!==n[204][e].charCodeAt(0)&&(r[n[204][e]]=52224+e,t[52224+e]=n[204][e]);for(n[205]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������棨溪界癸磎稽系繫繼計誡谿階鷄古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓哭斛曲梏穀谷鵠困坤崑昆梱棍滾琨袞鯤汨滑骨供公共功孔工恐恭拱控攻珙空蚣貢鞏串寡戈果瓜�".split(""),e=0;e!=n[205].length;++e)65533!==n[205][e].charCodeAt(0)&&(r[n[205][e]]=52480+e,t[52480+e]=n[205][e]);for(n[206]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������科菓誇課跨過鍋顆廓槨藿郭串冠官寬慣棺款灌琯瓘管罐菅觀貫關館刮恝括适侊光匡壙廣曠洸炚狂珖筐胱鑛卦掛罫乖傀塊壞怪愧拐槐魁宏紘肱轟交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久九仇俱具勾�".split(""),e=0;e!=n[206].length;++e)65533!==n[206][e].charCodeAt(0)&&(r[n[206][e]]=52736+e,t[52736+e]=n[206][e]);for(n[207]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局菊鞠鞫麴君窘群裙軍郡堀屈掘窟宮弓穹窮芎躬倦券勸卷圈拳捲權淃眷厥獗蕨蹶闕机櫃潰詭軌饋句晷歸貴�".split(""),e=0;e!=n[207].length;++e)65533!==n[207][e].charCodeAt(0)&&(r[n[207][e]]=52992+e,t[52992+e]=n[207][e]);for(n[208]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������鬼龜叫圭奎揆槻珪硅窺竅糾葵規赳逵閨勻均畇筠菌鈞龜橘克剋劇戟棘極隙僅劤勤懃斤根槿瑾筋芹菫覲謹近饉契今妗擒昑檎琴禁禽芩衾衿襟金錦伋及急扱汲級給亘兢矜肯企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣�".split(""),e=0;e!=n[208].length;++e)65533!==n[208][e].charCodeAt(0)&&(r[n[208][e]]=53248+e,t[53248+e]=n[208][e]);for(n[209]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒緊佶吉拮桔金喫儺喇奈娜懦懶拏拿癩羅蘿螺裸邏那樂洛烙珞落諾酪駱亂卵暖欄煖爛蘭難鸞捏捺南嵐枏楠湳濫男藍襤拉�".split(""),e=0;e!=n[209].length;++e)65533!==n[209][e].charCodeAt(0)&&(r[n[209][e]]=53504+e,t[53504+e]=n[209][e]);for(n[210]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������納臘蠟衲囊娘廊朗浪狼郎乃來內奈柰耐冷女年撚秊念恬拈捻寧寗努勞奴弩怒擄櫓爐瑙盧老蘆虜路露駑魯鷺碌祿綠菉錄鹿論壟弄濃籠聾膿農惱牢磊腦賂雷尿壘屢樓淚漏累縷陋嫩訥杻紐勒肋凜凌稜綾能菱陵尼泥匿溺多茶�".split(""),e=0;e!=n[210].length;++e)65533!==n[210][e].charCodeAt(0)&&(r[n[210][e]]=53760+e,t[53760+e]=n[210][e]);for(n[211]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛撻澾獺疸達啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟沓畓答踏遝唐堂塘幢戇撞棠當糖螳黨代垈坮大對岱帶待戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃�".split(""),e=0;e!=n[211].length;++e)65533!==n[211][e].charCodeAt(0)&&(r[n[211][e]]=54016+e,t[54016+e]=n[211][e]);for(n[212]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������棹櫂淘渡滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜毒瀆牘犢獨督禿篤纛讀墩惇敦旽暾沌焞燉豚頓乭突仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅兜斗杜枓痘竇荳讀豆逗頭屯臀芚遁遯鈍得嶝橙燈登等藤謄鄧騰喇懶拏癩羅�".split(""),e=0;e!=n[212].length;++e)65533!==n[212][e].charCodeAt(0)&&(r[n[212][e]]=54272+e,t[54272+e]=n[212][e]);for(n[213]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������蘿螺裸邏樂洛烙珞絡落諾酪駱丹亂卵欄欒瀾爛蘭鸞剌辣嵐擥攬欖濫籃纜藍襤覽拉臘蠟廊朗浪狼琅瑯螂郞來崍徠萊冷掠略亮倆兩凉梁樑粮粱糧良諒輛量侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷瀝礫轢靂憐戀攣漣�".split(""),e=0;e!=n[213].length;++e)65533!==n[213][e].charCodeAt(0)&&(r[n[213][e]]=54528+e,t[54528+e]=n[213][e]);for(n[214]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������煉璉練聯蓮輦連鍊冽列劣洌烈裂廉斂殮濂簾獵令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡例澧禮醴隷勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵碌祿綠菉錄鹿麓論壟弄朧瀧瓏籠聾儡瀨牢磊賂賚賴雷了僚寮廖料燎療瞭聊蓼�".split(""),e=0;e!=n[214].length;++e)65533!==n[214][e].charCodeAt(0)&&(r[n[214][e]]=54784+e,t[54784+e]=n[214][e]);for(n[215]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������遼鬧龍壘婁屢樓淚漏瘻累縷蔞褸鏤陋劉旒柳榴流溜瀏琉瑠留瘤硫謬類六戮陸侖倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾菱陵俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉吝潾燐璘藺躪隣鱗麟林淋琳臨霖砬�".split(""),e=0;e!=n[215].length;++e)65533!==n[215][e].charCodeAt(0)&&(r[n[215][e]]=55040+e,t[55040+e]=n[215][e]);for(n[216]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻唜抹末沫茉襪靺亡妄忘忙望網罔芒茫莽輞邙埋妹媒寐昧枚梅每煤罵買賣邁魅脈貊陌驀麥孟氓猛盲盟萌冪覓免冕勉棉沔眄眠綿緬面麵滅�".split(""),e=0;e!=n[216].length;++e)65533!==n[216][e].charCodeAt(0)&&(r[n[216][e]]=55296+e,t[55296+e]=n[216][e]);for(n[217]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������蔑冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌木沐牧目睦穆鶩歿沒夢朦蒙卯墓妙廟描昴杳渺猫竗苗錨務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡墨默們刎吻問文�".split(""),e=0;e!=n[217].length;++e)65533!==n[217][e].charCodeAt(0)&&(r[n[217][e]]=55552+e,t[55552+e]=n[217][e]);for(n[218]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������汶紊紋聞蚊門雯勿沕物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴岷悶愍憫敏旻旼民泯玟珉緡閔密蜜謐剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯勃拔撥渤潑�".split(""),e=0;e!=n[218].length;++e)65533!==n[218][e].charCodeAt(0)&&(r[n[218][e]]=55808+e,t[55808+e]=n[218][e]);for(n[219]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������發跋醱鉢髮魃倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪伯佰帛柏栢白百魄幡樊煩燔番磻繁蕃藩飜伐筏罰閥凡帆梵氾汎泛犯範范法琺僻劈壁擘檗璧癖�".split(""),e=0;e!=n[219].length;++e)65533!==n[219][e].charCodeAt(0)&&(r[n[219][e]]=56064+e,t[56064+e]=n[219][e]);for(n[220]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������碧蘗闢霹便卞弁變辨辯邊別瞥鱉鼈丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈保堡報寶普步洑湺潽珤甫菩補褓譜輔伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒本乶俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳不付俯傅剖副否咐埠夫婦�".split(""),e=0;e!=n[220].length;++e)65533!==n[220][e].charCodeAt(0)&&(r[n[220][e]]=56320+e,t[56320+e]=n[220][e]);for(n[221]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰不佛弗彿拂崩朋棚硼繃鵬丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥�".split(""),e=0;e!=n[221].length;++e)65533!==n[221][e].charCodeAt(0)&&(r[n[221][e]]=56576+e,t[56576+e]=n[221][e]);for(n[222]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������脾臂菲蜚裨誹譬費鄙非飛鼻嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻憑氷聘騁乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝削數朔索�".split(""),e=0;e!=n[222].length;++e)65533!==n[222][e].charCodeAt(0)&&(r[n[222][e]]=56832+e,t[56832+e]=n[222][e]);for(n[223]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������傘刪山散汕珊産疝算蒜酸霰乷撒殺煞薩三參杉森渗芟蔘衫揷澁鈒颯上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署�".split(""),e=0;e!=n[223].length;++e)65533!==n[223][e].charCodeAt(0)&&(r[n[223][e]]=57088+e,t[57088+e]=n[223][e]);for(n[224]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������胥舒薯西誓逝鋤黍鼠夕奭席惜昔晳析汐淅潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮卨屑楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾贍閃陝攝涉燮葉城姓宬性惺成星晟猩珹盛省筬�".split(""),e=0;e!=n[224].length;++e)65533!==n[224][e].charCodeAt(0)&&(r[n[224][e]]=57344+e,t[57344+e]=n[224][e]);for(n[225]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������聖聲腥誠醒世勢歲洗稅笹細說貰召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷俗屬束涑粟續謖贖速孫巽損蓀遜飡率宋悚松淞訟誦送頌刷殺灑碎鎖衰釗修受嗽囚垂壽嫂守岫峀帥愁�".split(""),e=0;e!=n[225].length;++e)65533!==n[225][e].charCodeAt(0)&&(r[n[225][e]]=57600+e,t[57600+e]=n[225][e]);for(n[226]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚叔塾夙孰宿淑潚熟琡璹肅菽巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴戌術述鉥崇崧�".split(""),e=0;e!=n[226].length;++e)65533!==n[226][e].charCodeAt(0)&&(r[n[226][e]]=57856+e,t[57856+e]=n[226][e]);for(n[227]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������嵩瑟膝蝨濕拾習褶襲丞乘僧勝升承昇繩蠅陞侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺埴寔式息拭植殖湜熄篒蝕識軾食飾伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅失室實悉審尋心沁�".split(""),e=0;e!=n[227].length;++e)65533!==n[227][e].charCodeAt(0)&&(r[n[227][e]]=58112+e,t[58112+e]=n[227][e]);for(n[228]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������沈深瀋甚芯諶什十拾雙氏亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷安岸按晏案眼雁鞍顔鮟斡謁軋閼唵岩巖庵暗癌菴闇壓押狎鴨仰央怏昻殃秧鴦厓哀埃崖愛曖涯碍艾隘靄厄扼掖液縊腋額�".split(""),e=0;e!=n[228].length;++e)65533!==n[228][e].charCodeAt(0)&&(r[n[228][e]]=58368+e,t[58368+e]=n[228][e]);for(n[229]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������櫻罌鶯鸚也倻冶夜惹揶椰爺耶若野弱掠略約若葯蒻藥躍亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養圄御於漁瘀禦語馭魚齬億憶抑檍臆偃堰彦焉言諺孼蘖俺儼嚴奄掩淹嶪業円予余勵呂女如廬�".split(""),e=0;e!=n[229].length;++e)65533!==n[229][e].charCodeAt(0)&&(r[n[229][e]]=58624+e,t[58624+e]=n[229][e]);for(n[230]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎亦力域役易曆歷疫繹譯轢逆驛嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶列劣咽悅涅烈熱裂說閱厭廉念捻染殮炎焰琰艶苒�".split(""),e=0;e!=n[230].length;++e)65533!==n[230][e].charCodeAt(0)&&(r[n[230][e]]=58880+e,t[58880+e]=n[230][e]);for(n[231]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������簾閻髥鹽曄獵燁葉令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳�".split(""),e=0;e!=n[231].length;++e)65533!==n[231][e].charCodeAt(0)&&(r[n[231][e]]=59136+e,t[59136+e]=n[231][e]);for(n[232]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������烏熬獒筽蜈誤鰲鼇屋沃獄玉鈺溫瑥瘟穩縕蘊兀壅擁瓮甕癰翁邕雍饔渦瓦窩窪臥蛙蝸訛婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬巍猥畏了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療�".split(""),e=0;e!=n[232].length;++e)65533!==n[232][e].charCodeAt(0)&&(r[n[232][e]]=59392+e,t[59392+e]=n[232][e]);for(n[233]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������窈窯繇繞耀腰蓼蟯要謠遙遼邀饒慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩勖彧旭昱栯煜稶郁頊云暈橒殞澐熉耘芸蕓�".split(""),e=0;e!=n[233].length;++e)65533!==n[233][e].charCodeAt(0)&&(r[n[233][e]]=59648+e,t[59648+e]=n[233][e]);for(n[234]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������運隕雲韻蔚鬱亐熊雄元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛月越鉞位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜�".split(""),e=0;e!=n[234].length;++e)65533!==n[234][e].charCodeAt(0)&&(r[n[234][e]]=59904+e,t[59904+e]=n[234][e]);for(n[235]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類六堉戮毓肉育陸倫允奫尹崙淪潤玧胤贇輪鈗閏律慄栗率聿戎瀜絨融隆垠恩慇殷誾銀隱乙吟淫蔭陰音飮揖泣邑凝應膺鷹依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼�".split(""),e=0;e!=n[235].length;++e)65533!==n[235][e].charCodeAt(0)&&(r[n[235][e]]=60160+e,t[60160+e]=n[235][e]);for(n[236]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������議醫二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟一佚佾壹日溢逸鎰馹任壬妊姙恁林淋稔臨荏賃入卄�".split(""),e=0;e!=n[236].length;++e)65533!==n[236][e].charCodeAt(0)&&(r[n[236][e]]=60416+e,t[60416+e]=n[236][e]);for(n[237]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������立笠粒仍剩孕芿仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌作勺嚼斫昨灼炸爵綽芍酌雀鵲孱棧殘潺盞岑暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長�".split(""),e=0;e!=n[237].length;++e)65533!==n[237][e].charCodeAt(0)&&(r[n[237][e]]=60672+e,t[60672+e]=n[237][e]);for(n[238]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������障再哉在宰才材栽梓渽滓災縡裁財載齋齎爭箏諍錚佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱�".split(""),e=0;e!=n[238].length;++e)65533!==n[238][e].charCodeAt(0)&&(r[n[238][e]]=60928+e,t[60928+e]=n[238][e]);for(n[239]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞切截折浙癤竊節絶占岾店漸点粘霑鮎點接摺蝶丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖�".split(""),e=0;e!=n[239].length;++e)65533!==n[239][e].charCodeAt(0)&&(r[n[239][e]]=61184+e,t[61184+e]=n[239][e]);for(n[240]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������靜頂鼎制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥族簇足鏃存尊卒拙猝倧宗從悰慫棕淙琮種終綜縱腫�".split(""),e=0;e!=n[240].length;++e)65533!==n[240][e].charCodeAt(0)&&(r[n[240][e]]=61440+e,t[61440+e]=n[240][e]);for(n[241]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������踪踵鍾鐘佐坐左座挫罪主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐竹粥俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿茁中仲衆重卽櫛楫汁葺增憎曾拯烝甑症繒蒸證贈之只�".split(""),e=0;e!=n[241].length;++e)65533!==n[241][e].charCodeAt(0)&&(r[n[241][e]]=61696+e,t[61696+e]=n[241][e]);for(n[242]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲直稙稷織職唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭斟朕什執潗緝輯�".split(""),e=0;e!=n[242].length;++e)65533!==n[242][e].charCodeAt(0)&&(r[n[242][e]]=61952+e,t[61952+e]=n[242][e]);for(n[243]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������鏶集徵懲澄且侘借叉嗟嵯差次此磋箚茶蹉車遮捉搾着窄錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌刹察擦札紮僭參塹慘慙懺斬站讒讖倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼債埰寀寨彩採砦綵菜蔡采釵冊柵策�".split(""),e=0;e!=n[243].length;++e)65533!==n[243][e].charCodeAt(0)&&(r[n[243][e]]=62208+e,t[62208+e]=n[243][e]);for(n[244]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆凸哲喆徹撤澈綴輟轍鐵僉尖沾添甛瞻簽籤詹諂堞妾帖捷牒疊睫諜貼輒廳晴淸聽菁請靑鯖切剃替涕滯締諦逮遞體初剿哨憔抄招梢�".split(""),e=0;e!=n[244].length;++e)65533!==n[244][e].charCodeAt(0)&&(r[n[244][e]]=62464+e,t[62464+e]=n[244][e]);for(n[245]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮促囑燭矗蜀觸寸忖村邨叢塚寵悤憁摠總聰蔥銃撮催崔最墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍丑畜祝竺筑築縮蓄蹙蹴軸逐春椿瑃出朮黜充忠沖蟲衝衷悴膵萃�".split(""),e=0;e!=n[245].length;++e)65533!==n[245][e].charCodeAt(0)&&(r[n[245][e]]=62720+e,t[62720+e]=n[245][e]);for(n[246]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲側仄厠惻測層侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸琛砧針鍼蟄秤稱快他咤唾墮妥惰打拖朶楕舵陀馱駝倬卓啄坼度托拓擢晫柝濁濯琢琸託�".split(""),e=0;e!=n[246].length;++e)65533!==n[246][e].charCodeAt(0)&&(r[n[246][e]]=62976+e,t[62976+e]=n[246][e]);for(n[247]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������鐸呑嘆坦彈憚歎灘炭綻誕奪脫探眈耽貪塔搭榻宕帑湯糖蕩兌台太怠態殆汰泰笞胎苔跆邰颱宅擇澤撑攄兎吐土討慟桶洞痛筒統通堆槌腿褪退頹偸套妬投透鬪慝特闖坡婆巴把播擺杷波派爬琶破罷芭跛頗判坂板版瓣販辦鈑�".split(""),e=0;e!=n[247].length;++e)65533!==n[247][e].charCodeAt(0)&&(r[n[247][e]]=63232+e,t[63232+e]=n[247][e]);for(n[248]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������阪八叭捌佩唄悖敗沛浿牌狽稗覇貝彭澎烹膨愎便偏扁片篇編翩遍鞭騙貶坪平枰萍評吠嬖幣廢弊斃肺蔽閉陛佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑幅暴曝瀑爆輻俵剽彪慓杓標漂瓢票表豹飇飄驃�".split(""),e=0;e!=n[248].length;++e)65533!==n[248][e].charCodeAt(0)&&(r[n[248][e]]=63488+e,t[63488+e]=n[248][e]);for(n[249]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������品稟楓諷豊風馮彼披疲皮被避陂匹弼必泌珌畢疋筆苾馝乏逼下何厦夏廈昰河瑕荷蝦賀遐霞鰕壑學虐謔鶴寒恨悍旱汗漢澣瀚罕翰閑閒限韓割轄函含咸啣喊檻涵緘艦銜陷鹹合哈盒蛤閤闔陜亢伉姮嫦巷恒抗杭桁沆港缸肛航�".split(""),e=0;e!=n[249].length;++e)65533!==n[249][e].charCodeAt(0)&&(r[n[249][e]]=63744+e,t[63744+e]=n[249][e]);for(n[250]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������行降項亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸杏荇行享向嚮珦鄕響餉饗香噓墟虛許憲櫶獻軒歇險驗奕爀赫革俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯孑穴血頁嫌俠協夾峽挾浹狹脅脇莢鋏頰亨兄刑型�".split(""),e=0;e!=n[250].length;++e)65533!==n[250][e].charCodeAt(0)&&(r[n[250][e]]=64e3+e,t[64e3+e]=n[250][e]);for(n[251]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨兮彗惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥惑或酷婚昏混渾琿魂忽惚笏哄弘汞泓洪烘紅虹訌鴻化和嬅樺火畵�".split(""),e=0;e!=n[251].length;++e)65533!==n[251][e].charCodeAt(0)&&(r[n[251][e]]=64256+e,t[64256+e]=n[251][e]);for(n[252]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������禍禾花華話譁貨靴廓擴攫確碻穫丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥活滑猾豁闊凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄劃獲宖橫鐄哮嚆孝效斅曉梟涍淆�".split(""),e=0;e!=n[252].length;++e)65533!==n[252][e].charCodeAt(0)&&(r[n[252][e]]=64512+e,t[64512+e]=n[252][e]);for(n[253]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������爻肴酵驍侯候厚后吼喉嗅帿後朽煦珝逅勛勳塤壎焄熏燻薰訓暈薨喧暄煊萱卉喙毁彙徽揮暉煇諱輝麾休携烋畦虧恤譎鷸兇凶匈洶胸黑昕欣炘痕吃屹紇訖欠欽歆吸恰洽翕興僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲詰�".split(""),e=0;e!=n[253].length;++e)65533!==n[253][e].charCodeAt(0)&&(r[n[253][e]]=64768+e,t[64768+e]=n[253][e]);return{enc:r,dec:t}}(),t[950]=function(){var e,t=[],r={},n=[];for(n[0]="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������".split(""),e=0;e!=n[0].length;++e)65533!==n[0][e].charCodeAt(0)&&(r[n[0][e]]=0+e,t[0+e]=n[0][e]);for(n[161]="���������������������������������������������������������������� ,、。.‧;:?!︰…‥﹐﹑﹒·﹔﹕﹖﹗|–︱—︳╴︴﹏()︵︶{}︷︸〔〕︹︺【】︻︼《》︽︾〈〉︿﹀「」﹁﹂『』﹃﹄﹙﹚����������������������������������﹛﹜﹝﹞‘’“”〝〞‵′#&*※§〃○●△▲◎☆★◇◆□■▽▼㊣℅¯ ̄_ˍ﹉﹊﹍﹎﹋﹌﹟﹠﹡+-×÷±√<>=≦≧≠∞≒≡﹢﹣﹤﹥﹦~∩∪⊥∠∟⊿㏒㏑∫∮∵∴♀♂⊕⊙↑↓←→↖↗↙↘∥∣/�".split(""),e=0;e!=n[161].length;++e)65533!==n[161][e].charCodeAt(0)&&(r[n[161][e]]=41216+e,t[41216+e]=n[161][e]);for(n[162]="����������������������������������������������������������������\∕﹨$¥〒¢£%@℃℉﹩﹪﹫㏕㎜㎝㎞㏎㎡㎎㎏㏄°兙兛兞兝兡兣嗧瓩糎▁▂▃▄▅▆▇█▏▎▍▌▋▊▉┼┴┬┤├▔─│▕┌┐└┘╭����������������������������������╮╰╯═╞╪╡◢◣◥◤╱╲╳0123456789ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ〡〢〣〤〥〦〧〨〩十卄卅ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv�".split(""),e=0;e!=n[162].length;++e)65533!==n[162][e].charCodeAt(0)&&(r[n[162][e]]=41472+e,t[41472+e]=n[162][e]);for(n[163]="����������������������������������������������������������������wxyzΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏ����������������������������������ㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ˙ˉˊˇˋ���������������������������������€������������������������������".split(""),e=0;e!=n[163].length;++e)65533!==n[163][e].charCodeAt(0)&&(r[n[163][e]]=41728+e,t[41728+e]=n[163][e]);for(n[164]="����������������������������������������������������������������一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才����������������������������������丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙�".split(""),e=0;e!=n[164].length;++e)65533!==n[164][e].charCodeAt(0)&&(r[n[164][e]]=41984+e,t[41984+e]=n[164][e]);for(n[165]="����������������������������������������������������������������世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外����������������������������������央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全�".split(""),e=0;e!=n[165].length;++e)65533!==n[165][e].charCodeAt(0)&&(r[n[165][e]]=42240+e,t[42240+e]=n[165][e]);for(n[166]="����������������������������������������������������������������共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年����������������������������������式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣�".split(""),e=0;e!=n[166].length;++e)65533!==n[166][e].charCodeAt(0)&&(r[n[166][e]]=42496+e,t[42496+e]=n[166][e]);for(n[167]="����������������������������������������������������������������作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍����������������������������������均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠�".split(""),e=0;e!=n[167].length;++e)65533!==n[167][e].charCodeAt(0)&&(r[n[167][e]]=42752+e,t[42752+e]=n[167][e]);for(n[168]="����������������������������������������������������������������杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒����������������������������������芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵�".split(""),e=0;e!=n[168].length;++e)65533!==n[168][e].charCodeAt(0)&&(r[n[168][e]]=43008+e,t[43008+e]=n[168][e]);for(n[169]="����������������������������������������������������������������咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居����������������������������������屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊�".split(""),e=0;e!=n[169].length;++e)65533!==n[169][e].charCodeAt(0)&&(r[n[169][e]]=43264+e,t[43264+e]=n[169][e]);for(n[170]="����������������������������������������������������������������昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠����������������������������������炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附�".split(""),e=0;e!=n[170].length;++e)65533!==n[170][e].charCodeAt(0)&&(r[n[170][e]]=43520+e,t[43520+e]=n[170][e]);for(n[171]="����������������������������������������������������������������陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品����������������������������������哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷�".split(""),e=0;e!=n[171].length;++e)65533!==n[171][e].charCodeAt(0)&&(r[n[171][e]]=43776+e,t[43776+e]=n[171][e]);for(n[172]="����������������������������������������������������������������拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗����������������������������������活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄�".split(""),e=0;e!=n[172].length;++e)65533!==n[172][e].charCodeAt(0)&&(r[n[172][e]]=44032+e,t[44032+e]=n[172][e]);for(n[173]="����������������������������������������������������������������耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥����������������������������������迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪�".split(""),e=0;e!=n[173].length;++e)65533!==n[173][e].charCodeAt(0)&&(r[n[173][e]]=44288+e,t[44288+e]=n[173][e]);for(n[174]="����������������������������������������������������������������哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙����������������������������������恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓�".split(""),e=0;e!=n[174].length;++e)65533!==n[174][e].charCodeAt(0)&&(r[n[174][e]]=44544+e,t[44544+e]=n[174][e]);for(n[175]="����������������������������������������������������������������浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷����������������������������������砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃�".split(""),e=0;e!=n[175].length;++e)65533!==n[175][e].charCodeAt(0)&&(r[n[175][e]]=44800+e,t[44800+e]=n[175][e]);for(n[176]="����������������������������������������������������������������虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡����������������������������������陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀�".split(""),e=0;e!=n[176].length;++e)65533!==n[176][e].charCodeAt(0)&&(r[n[176][e]]=45056+e,t[45056+e]=n[176][e]);for(n[177]="����������������������������������������������������������������娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽����������������������������������情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺�".split(""),e=0;e!=n[177].length;++e)65533!==n[177][e].charCodeAt(0)&&(r[n[177][e]]=45312+e,t[45312+e]=n[177][e]);for(n[178]="����������������������������������������������������������������毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶����������������������������������瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼�".split(""),e=0;e!=n[178].length;++e)65533!==n[178][e].charCodeAt(0)&&(r[n[178][e]]=45568+e,t[45568+e]=n[178][e]);for(n[179]="����������������������������������������������������������������莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途����������������������������������部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠�".split(""),e=0;e!=n[179].length;++e)65533!==n[179][e].charCodeAt(0)&&(r[n[179][e]]=45824+e,t[45824+e]=n[179][e]);for(n[180]="����������������������������������������������������������������婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍����������������������������������插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋�".split(""),e=0;e!=n[180].length;++e)65533!==n[180][e].charCodeAt(0)&&(r[n[180][e]]=46080+e,t[46080+e]=n[180][e]);for(n[181]="����������������������������������������������������������������溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘����������������������������������窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁�".split(""),e=0;e!=n[181].length;++e)65533!==n[181][e].charCodeAt(0)&&(r[n[181][e]]=46336+e,t[46336+e]=n[181][e]);for(n[182]="����������������������������������������������������������������詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑����������������������������������間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼�".split(""),e=0;e!=n[182].length;++e)65533!==n[182][e].charCodeAt(0)&&(r[n[182][e]]=46592+e,t[46592+e]=n[182][e]);for(n[183]="����������������������������������������������������������������媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業����������������������������������楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督�".split(""),e=0;e!=n[183].length;++e)65533!==n[183][e].charCodeAt(0)&&(r[n[183][e]]=46848+e,t[46848+e]=n[183][e]);for(n[184]="����������������������������������������������������������������睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫����������������������������������腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊�".split(""),e=0;e!=n[184].length;++e)65533!==n[184][e].charCodeAt(0)&&(r[n[184][e]]=47104+e,t[47104+e]=n[184][e]);for(n[185]="����������������������������������������������������������������辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴����������������������������������飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇�".split(""),e=0;e!=n[185].length;++e)65533!==n[185][e].charCodeAt(0)&&(r[n[185][e]]=47360+e,t[47360+e]=n[185][e]);for(n[186]="����������������������������������������������������������������愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢����������������������������������滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬�".split(""),e=0;e!=n[186].length;++e)65533!==n[186][e].charCodeAt(0)&&(r[n[186][e]]=47616+e,t[47616+e]=n[186][e]);for(n[187]="����������������������������������������������������������������罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤����������������������������������說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜�".split(""),e=0;e!=n[187].length;++e)65533!==n[187][e].charCodeAt(0)&&(r[n[187][e]]=47872+e,t[47872+e]=n[187][e]);for(n[188]="����������������������������������������������������������������劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂����������������������������������慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃�".split(""),e=0;e!=n[188].length;++e)65533!==n[188][e].charCodeAt(0)&&(r[n[188][e]]=48128+e,t[48128+e]=n[188][e]);for(n[189]="����������������������������������������������������������������瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯����������������������������������翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞�".split(""),e=0;e!=n[189].length;++e)65533!==n[189][e].charCodeAt(0)&&(r[n[189][e]]=48384+e,t[48384+e]=n[189][e]);for(n[190]="����������������������������������������������������������������輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉����������������������������������鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡�".split(""),e=0;e!=n[190].length;++e)65533!==n[190][e].charCodeAt(0)&&(r[n[190][e]]=48640+e,t[48640+e]=n[190][e]);for(n[191]="����������������������������������������������������������������濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊����������������������������������縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚�".split(""),e=0;e!=n[191].length;++e)65533!==n[191][e].charCodeAt(0)&&(r[n[191][e]]=48896+e,t[48896+e]=n[191][e]);for(n[192]="����������������������������������������������������������������錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇����������������������������������嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬�".split(""),e=0;e!=n[192].length;++e)65533!==n[192][e].charCodeAt(0)&&(r[n[192][e]]=49152+e,t[49152+e]=n[192][e]);for(n[193]="����������������������������������������������������������������瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪����������������������������������薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁�".split(""),e=0;e!=n[193].length;++e)65533!==n[193][e].charCodeAt(0)&&(r[n[193][e]]=49408+e,t[49408+e]=n[193][e]);for(n[194]="����������������������������������������������������������������駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘����������������������������������癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦�".split(""),e=0;e!=n[194].length;++e)65533!==n[194][e].charCodeAt(0)&&(r[n[194][e]]=49664+e,t[49664+e]=n[194][e]);for(n[195]="����������������������������������������������������������������鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸����������������������������������獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類�".split(""),e=0;e!=n[195].length;++e)65533!==n[195][e].charCodeAt(0)&&(r[n[195][e]]=49920+e,t[49920+e]=n[195][e]);for(n[196]="����������������������������������������������������������������願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼����������������������������������纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴�".split(""),e=0;e!=n[196].length;++e)65533!==n[196][e].charCodeAt(0)&&(r[n[196][e]]=50176+e,t[50176+e]=n[196][e]);for(n[197]="����������������������������������������������������������������護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬����������������������������������禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒�".split(""),e=0;e!=n[197].length;++e)65533!==n[197][e].charCodeAt(0)&&(r[n[197][e]]=50432+e,t[50432+e]=n[197][e]);for(n[198]="����������������������������������������������������������������讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲���������������������������������������������������������������������������������������������������������������������������������".split(""),e=0;e!=n[198].length;++e)65533!==n[198][e].charCodeAt(0)&&(r[n[198][e]]=50688+e,t[50688+e]=n[198][e]);for(n[201]="����������������������������������������������������������������乂乜凵匚厂万丌乇亍囗兀屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕����������������������������������氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋�".split(""),e=0;e!=n[201].length;++e)65533!==n[201][e].charCodeAt(0)&&(r[n[201][e]]=51456+e,t[51456+e]=n[201][e]);for(n[202]="����������������������������������������������������������������汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘����������������������������������吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇�".split(""),e=0;e!=n[202].length;++e)65533!==n[202][e].charCodeAt(0)&&(r[n[202][e]]=51712+e,t[51712+e]=n[202][e]);for(n[203]="����������������������������������������������������������������杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓����������������������������������芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢�".split(""),e=0;e!=n[203].length;++e)65533!==n[203][e].charCodeAt(0)&&(r[n[203][e]]=51968+e,t[51968+e]=n[203][e]);for(n[204]="����������������������������������������������������������������坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋����������������������������������怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲�".split(""),e=0;e!=n[204].length;++e)65533!==n[204][e].charCodeAt(0)&&(r[n[204][e]]=52224+e,t[52224+e]=n[204][e]);for(n[205]="����������������������������������������������������������������泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺����������������������������������矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏�".split(""),e=0;e!=n[205].length;++e)65533!==n[205][e].charCodeAt(0)&&(r[n[205][e]]=52480+e,t[52480+e]=n[205][e]);for(n[206]="����������������������������������������������������������������哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛����������������������������������峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺�".split(""),e=0;e!=n[206].length;++e)65533!==n[206][e].charCodeAt(0)&&(r[n[206][e]]=52736+e,t[52736+e]=n[206][e]);for(n[207]="����������������������������������������������������������������柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂����������������������������������洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀�".split(""),e=0;e!=n[207].length;++e)65533!==n[207][e].charCodeAt(0)&&(r[n[207][e]]=52992+e,t[52992+e]=n[207][e]);for(n[208]="����������������������������������������������������������������穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪����������������������������������苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱�".split(""),e=0;e!=n[208].length;++e)65533!==n[208][e].charCodeAt(0)&&(r[n[208][e]]=53248+e,t[53248+e]=n[208][e]);for(n[209]="����������������������������������������������������������������唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧����������������������������������恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤�".split(""),e=0;e!=n[209].length;++e)65533!==n[209][e].charCodeAt(0)&&(r[n[209][e]]=53504+e,t[53504+e]=n[209][e]);for(n[210]="����������������������������������������������������������������毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸����������������������������������牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐�".split(""),e=0;e!=n[210].length;++e)65533!==n[210][e].charCodeAt(0)&&(r[n[210][e]]=53760+e,t[53760+e]=n[210][e]);for(n[211]="����������������������������������������������������������������笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢����������������������������������荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐�".split(""),e=0;e!=n[211].length;++e)65533!==n[211][e].charCodeAt(0)&&(r[n[211][e]]=54016+e,t[54016+e]=n[211][e]);for(n[212]="����������������������������������������������������������������酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅����������������������������������唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏�".split(""),e=0;e!=n[212].length;++e)65533!==n[212][e].charCodeAt(0)&&(r[n[212][e]]=54272+e,t[54272+e]=n[212][e]);for(n[213]="����������������������������������������������������������������崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟����������������������������������捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉�".split(""),e=0;e!=n[213].length;++e)65533!==n[213][e].charCodeAt(0)&&(r[n[213][e]]=54528+e,t[54528+e]=n[213][e]);for(n[214]="����������������������������������������������������������������淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏����������������������������������痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟�".split(""),e=0;e!=n[214].length;++e)65533!==n[214][e].charCodeAt(0)&&(r[n[214][e]]=54784+e,t[54784+e]=n[214][e]);for(n[215]="����������������������������������������������������������������耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷����������������������������������蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪�".split(""),e=0;e!=n[215].length;++e)65533!==n[215][e].charCodeAt(0)&&(r[n[215][e]]=55040+e,t[55040+e]=n[215][e]);for(n[216]="����������������������������������������������������������������釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷����������������������������������堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔�".split(""),e=0;e!=n[216].length;++e)65533!==n[216][e].charCodeAt(0)&&(r[n[216][e]]=55296+e,t[55296+e]=n[216][e]);for(n[217]="����������������������������������������������������������������惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒����������������������������������晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞�".split(""),e=0;e!=n[217].length;++e)65533!==n[217][e].charCodeAt(0)&&(r[n[217][e]]=55552+e,t[55552+e]=n[217][e]);for(n[218]="����������������������������������������������������������������湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖����������������������������������琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥�".split(""),e=0;e!=n[218].length;++e)65533!==n[218][e].charCodeAt(0)&&(r[n[218][e]]=55808+e,t[55808+e]=n[218][e]);for(n[219]="����������������������������������������������������������������罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳����������������������������������菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺�".split(""),e=0;e!=n[219].length;++e)65533!==n[219][e].charCodeAt(0)&&(r[n[219][e]]=56064+e,t[56064+e]=n[219][e]);for(n[220]="����������������������������������������������������������������軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈����������������������������������隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆�".split(""),e=0;e!=n[220].length;++e)65533!==n[220][e].charCodeAt(0)&&(r[n[220][e]]=56320+e,t[56320+e]=n[220][e]);for(n[221]="����������������������������������������������������������������媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤����������������������������������搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛嗀毻毼�".split(""),e=0;e!=n[221].length;++e)65533!==n[221][e].charCodeAt(0)&&(r[n[221][e]]=56576+e,t[56576+e]=n[221][e]);for(n[222]="����������������������������������������������������������������毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓����������������������������������煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓�".split(""),e=0;e!=n[222].length;++e)65533!==n[222][e].charCodeAt(0)&&(r[n[222][e]]=56832+e,t[56832+e]=n[222][e]);for(n[223]="����������������������������������������������������������������稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯����������������������������������腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤�".split(""),e=0;e!=n[223].length;++e)65533!==n[223][e].charCodeAt(0)&&(r[n[223][e]]=57088+e,t[57088+e]=n[223][e]);for(n[224]="����������������������������������������������������������������觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿����������������������������������遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠�".split(""),e=0;e!=n[224].length;++e)65533!==n[224][e].charCodeAt(0)&&(r[n[224][e]]=57344+e,t[57344+e]=n[224][e]);for(n[225]="����������������������������������������������������������������凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠����������������������������������寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉�".split(""),e=0;e!=n[225].length;++e)65533!==n[225][e].charCodeAt(0)&&(r[n[225][e]]=57600+e,t[57600+e]=n[225][e]);for(n[226]="����������������������������������������������������������������榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊����������������������������������漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓�".split(""),e=0;e!=n[226].length;++e)65533!==n[226][e].charCodeAt(0)&&(r[n[226][e]]=57856+e,t[57856+e]=n[226][e]);for(n[227]="����������������������������������������������������������������禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞����������������������������������耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻�".split(""),e=0;e!=n[227].length;++e)65533!==n[227][e].charCodeAt(0)&&(r[n[227][e]]=58112+e,t[58112+e]=n[227][e]);for(n[228]="����������������������������������������������������������������裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍����������������������������������銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘�".split(""),e=0;e!=n[228].length;++e)65533!==n[228][e].charCodeAt(0)&&(r[n[228][e]]=58368+e,t[58368+e]=n[228][e]);for(n[229]="����������������������������������������������������������������噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉����������������������������������憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒�".split(""),e=0;e!=n[229].length;++e)65533!==n[229][e].charCodeAt(0)&&(r[n[229][e]]=58624+e,t[58624+e]=n[229][e]);for(n[230]="����������������������������������������������������������������澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙����������������������������������獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟�".split(""),e=0;e!=n[230].length;++e)65533!==n[230][e].charCodeAt(0)&&(r[n[230][e]]=58880+e,t[58880+e]=n[230][e]);for(n[231]="����������������������������������������������������������������膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢����������������������������������蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧�".split(""),e=0;e!=n[231].length;++e)65533!==n[231][e].charCodeAt(0)&&(r[n[231][e]]=59136+e,t[59136+e]=n[231][e]);for(n[232]="����������������������������������������������������������������踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓����������������������������������銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮�".split(""),e=0;e!=n[232].length;++e)65533!==n[232][e].charCodeAt(0)&&(r[n[232][e]]=59392+e,t[59392+e]=n[232][e]);for(n[233]="����������������������������������������������������������������噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺����������������������������������憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸�".split(""),e=0;e!=n[233].length;++e)65533!==n[233][e].charCodeAt(0)&&(r[n[233][e]]=59648+e,t[59648+e]=n[233][e]);for(n[234]="����������������������������������������������������������������澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙����������������������������������瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘�".split(""),e=0;e!=n[234].length;++e)65533!==n[234][e].charCodeAt(0)&&(r[n[234][e]]=59904+e,t[59904+e]=n[234][e]);for(n[235]="����������������������������������������������������������������蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠����������������������������������諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌�".split(""),e=0;e!=n[235].length;++e)65533!==n[235][e].charCodeAt(0)&&(r[n[235][e]]=60160+e,t[60160+e]=n[235][e]);for(n[236]="����������������������������������������������������������������錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕����������������������������������魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎�".split(""),e=0;e!=n[236].length;++e)65533!==n[236][e].charCodeAt(0)&&(r[n[236][e]]=60416+e,t[60416+e]=n[236][e]);for(n[237]="����������������������������������������������������������������檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶����������������������������������瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞�".split(""),e=0;e!=n[237].length;++e)65533!==n[237][e].charCodeAt(0)&&(r[n[237][e]]=60672+e,t[60672+e]=n[237][e]);for(n[238]="����������������������������������������������������������������蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞����������������������������������謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜�".split(""),e=0;e!=n[238].length;++e)65533!==n[238][e].charCodeAt(0)&&(r[n[238][e]]=60928+e,t[60928+e]=n[238][e]);for(n[239]="����������������������������������������������������������������鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰����������������������������������鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶�".split(""),e=0;e!=n[239].length;++e)65533!==n[239][e].charCodeAt(0)&&(r[n[239][e]]=61184+e,t[61184+e]=n[239][e]);for(n[240]="����������������������������������������������������������������璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒����������������������������������臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧�".split(""),e=0;e!=n[240].length;++e)65533!==n[240][e].charCodeAt(0)&&(r[n[240][e]]=61440+e,t[61440+e]=n[240][e]);for(n[241]="����������������������������������������������������������������蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪����������������������������������鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰�".split(""),e=0;e!=n[241].length;++e)65533!==n[241][e].charCodeAt(0)&&(r[n[241][e]]=61696+e,t[61696+e]=n[241][e]);for(n[242]="����������������������������������������������������������������徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛����������������������������������礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕�".split(""),e=0;e!=n[242].length;++e)65533!==n[242][e].charCodeAt(0)&&(r[n[242][e]]=61952+e,t[61952+e]=n[242][e]);for(n[243]="����������������������������������������������������������������譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦����������������������������������鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲�".split(""),e=0;e!=n[243].length;++e)65533!==n[243][e].charCodeAt(0)&&(r[n[243][e]]=62208+e,t[62208+e]=n[243][e]);for(n[244]="����������������������������������������������������������������嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩����������������������������������禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿�".split(""),e=0;e!=n[244].length;++e)65533!==n[244][e].charCodeAt(0)&&(r[n[244][e]]=62464+e,t[62464+e]=n[244][e]);for(n[245]="����������������������������������������������������������������鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛����������������������������������鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥�".split(""),e=0;e!=n[245].length;++e)65533!==n[245][e].charCodeAt(0)&&(r[n[245][e]]=62720+e,t[62720+e]=n[245][e]);for(n[246]="����������������������������������������������������������������蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺����������������������������������騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚�".split(""),e=0;e!=n[246].length;++e)65533!==n[246][e].charCodeAt(0)&&(r[n[246][e]]=62976+e,t[62976+e]=n[246][e]);for(n[247]="����������������������������������������������������������������糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊����������������������������������驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾�".split(""),e=0;e!=n[247].length;++e)65533!==n[247][e].charCodeAt(0)&&(r[n[247][e]]=63232+e,t[63232+e]=n[247][e]);for(n[248]="����������������������������������������������������������������讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏����������������������������������齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚�".split(""),e=0;e!=n[248].length;++e)65533!==n[248][e].charCodeAt(0)&&(r[n[248][e]]=63488+e,t[63488+e]=n[248][e]);for(n[249]="����������������������������������������������������������������纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊����������������������������������龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯▓�".split(""),e=0;e!=n[249].length;++e)65533!==n[249][e].charCodeAt(0)&&(r[n[249][e]]=63744+e,t[63744+e]=n[249][e]);return{enc:r,dec:t}}(),t[1250]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“”•–—�™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[1251]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[1252]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[1253]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[1254]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“”•–—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[1255]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰�‹�����‘’“”•–—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹ�ֻּֽ־ֿ׀ׁׂ׃װױײ׳״�������אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[1256]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[1257]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[1258]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“”•–—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖרÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[1e4]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[10006]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦­ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ�",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[10007]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[10008]=function(){var e,t=[],r={},n=[];for(n[0]="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€���������������������������������������������������������������������������������������".split(""),e=0;e!=n[0].length;++e)65533!==n[0][e].charCodeAt(0)&&(r[n[0][e]]=0+e,t[0+e]=n[0][e]);for(n[161]="����������������������������������������������������������������������������������������������������������������������������������������������������������������� 、。・ˉˇ¨〃々―~�…‘’“”〔〕〈〉《》「」『』〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓�".split(""),e=0;e!=n[161].length;++e)65533!==n[161][e].charCodeAt(0)&&(r[n[161][e]]=41216+e,t[41216+e]=n[161][e]);for(n[162]="���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩��㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩��ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ���".split(""),e=0;e!=n[162].length;++e)65533!==n[162][e].charCodeAt(0)&&(r[n[162][e]]=41472+e,t[41472+e]=n[162][e]);for(n[163]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������!"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�".split(""),e=0;e!=n[163].length;++e)65533!==n[163][e].charCodeAt(0)&&(r[n[163][e]]=41728+e,t[41728+e]=n[163][e]);for(n[164]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������".split(""),e=0;e!=n[164].length;++e)65533!==n[164][e].charCodeAt(0)&&(r[n[164][e]]=41984+e,t[41984+e]=n[164][e]);for(n[165]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������".split(""),e=0;e!=n[165].length;++e)65533!==n[165][e].charCodeAt(0)&&(r[n[165][e]]=42240+e,t[42240+e]=n[165][e]);for(n[166]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω���������������������������������������".split(""),e=0;e!=n[166].length;++e)65533!==n[166][e].charCodeAt(0)&&(r[n[166][e]]=42496+e,t[42496+e]=n[166][e]);for(n[167]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������".split(""),e=0;e!=n[167].length;++e)65533!==n[167][e].charCodeAt(0)&&(r[n[167][e]]=42752+e,t[42752+e]=n[167][e]);for(n[168]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüê����������ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ����������������������".split(""),e=0;e!=n[168].length;++e)65533!==n[168][e].charCodeAt(0)&&(r[n[168][e]]=43008+e,t[43008+e]=n[168][e]);for(n[169]="��������������������������������������������������������������������������������������������������������������������������������������������������������������������─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋����������������".split(""),e=0;e!=n[169].length;++e)65533!==n[169][e].charCodeAt(0)&&(r[n[169][e]]=43264+e,t[43264+e]=n[169][e]);for(n[176]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥�".split(""),e=0;e!=n[176].length;++e)65533!==n[176][e].charCodeAt(0)&&(r[n[176][e]]=45056+e,t[45056+e]=n[176][e]);for(n[177]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳�".split(""),e=0;e!=n[177].length;++e)65533!==n[177][e].charCodeAt(0)&&(r[n[177][e]]=45312+e,t[45312+e]=n[177][e]);for(n[178]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖�".split(""),e=0;e!=n[178].length;++e)65533!==n[178][e].charCodeAt(0)&&(r[n[178][e]]=45568+e,t[45568+e]=n[178][e]);for(n[179]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚�".split(""),e=0;e!=n[179].length;++e)65533!==n[179][e].charCodeAt(0)&&(r[n[179][e]]=45824+e,t[45824+e]=n[179][e]);for(n[180]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮�".split(""),e=0;e!=n[180].length;++e)65533!==n[180][e].charCodeAt(0)&&(r[n[180][e]]=46080+e,t[46080+e]=n[180][e]);for(n[181]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠�".split(""),e=0;e!=n[181].length;++e)65533!==n[181][e].charCodeAt(0)&&(r[n[181][e]]=46336+e,t[46336+e]=n[181][e]);for(n[182]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二�".split(""),e=0;e!=n[182].length;++e)65533!==n[182][e].charCodeAt(0)&&(r[n[182][e]]=46592+e,t[46592+e]=n[182][e]);for(n[183]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服�".split(""),e=0;e!=n[183].length;++e)65533!==n[183][e].charCodeAt(0)&&(r[n[183][e]]=46848+e,t[46848+e]=n[183][e]);for(n[184]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹�".split(""),e=0;e!=n[184].length;++e)65533!==n[184][e].charCodeAt(0)&&(r[n[184][e]]=47104+e,t[47104+e]=n[184][e]);for(n[185]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈�".split(""),e=0;e!=n[185].length;++e)65533!==n[185][e].charCodeAt(0)&&(r[n[185][e]]=47360+e,t[47360+e]=n[185][e]);for(n[186]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖�".split(""),e=0;e!=n[186].length;++e)65533!==n[186][e].charCodeAt(0)&&(r[n[186][e]]=47616+e,t[47616+e]=n[186][e]);for(n[187]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕�".split(""),e=0;e!=n[187].length;++e)65533!==n[187][e].charCodeAt(0)&&(r[n[187][e]]=47872+e,t[47872+e]=n[187][e]);for(n[188]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件�".split(""),e=0;e!=n[188].length;++e)65533!==n[188][e].charCodeAt(0)&&(r[n[188][e]]=48128+e,t[48128+e]=n[188][e]);for(n[189]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸�".split(""),e=0;e!=n[189].length;++e)65533!==n[189][e].charCodeAt(0)&&(r[n[189][e]]=48384+e,t[48384+e]=n[189][e]);for(n[190]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻�".split(""),e=0;e!=n[190].length;++e)65533!==n[190][e].charCodeAt(0)&&(r[n[190][e]]=48640+e,t[48640+e]=n[190][e]);for(n[191]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀�".split(""),e=0;e!=n[191].length;++e)65533!==n[191][e].charCodeAt(0)&&(r[n[191][e]]=48896+e,t[48896+e]=n[191][e]);for(n[192]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐�".split(""),e=0;e!=n[192].length;++e)65533!==n[192][e].charCodeAt(0)&&(r[n[192][e]]=49152+e,t[49152+e]=n[192][e]);for(n[193]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿�".split(""),e=0;e!=n[193].length;++e)65533!==n[193][e].charCodeAt(0)&&(r[n[193][e]]=49408+e,t[49408+e]=n[193][e]);for(n[194]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫�".split(""),e=0;e!=n[194].length;++e)65533!==n[194][e].charCodeAt(0)&&(r[n[194][e]]=49664+e,t[49664+e]=n[194][e]);for(n[195]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸�".split(""),e=0;e!=n[195].length;++e)65533!==n[195][e].charCodeAt(0)&&(r[n[195][e]]=49920+e,t[49920+e]=n[195][e]);for(n[196]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁�".split(""),e=0;e!=n[196].length;++e)65533!==n[196][e].charCodeAt(0)&&(r[n[196][e]]=50176+e,t[50176+e]=n[196][e]);for(n[197]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗�".split(""),e=0;e!=n[197].length;++e)65533!==n[197][e].charCodeAt(0)&&(r[n[197][e]]=50432+e,t[50432+e]=n[197][e]);for(n[198]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐�".split(""),e=0;e!=n[198].length;++e)65533!==n[198][e].charCodeAt(0)&&(r[n[198][e]]=50688+e,t[50688+e]=n[198][e]);for(n[199]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠�".split(""),e=0;e!=n[199].length;++e)65533!==n[199][e].charCodeAt(0)&&(r[n[199][e]]=50944+e,t[50944+e]=n[199][e]);for(n[200]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁�".split(""),e=0;e!=n[200].length;++e)65533!==n[200][e].charCodeAt(0)&&(r[n[200][e]]=51200+e,t[51200+e]=n[200][e]);for(n[201]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳�".split(""),e=0;e!=n[201].length;++e)65533!==n[201][e].charCodeAt(0)&&(r[n[201][e]]=51456+e,t[51456+e]=n[201][e]);for(n[202]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱�".split(""),e=0;e!=n[202].length;++e)65533!==n[202][e].charCodeAt(0)&&(r[n[202][e]]=51712+e,t[51712+e]=n[202][e]);for(n[203]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔�".split(""),e=0;e!=n[203].length;++e)65533!==n[203][e].charCodeAt(0)&&(r[n[203][e]]=51968+e,t[51968+e]=n[203][e]);for(n[204]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃�".split(""),e=0;e!=n[204].length;++e)65533!==n[204][e].charCodeAt(0)&&(r[n[204][e]]=52224+e,t[52224+e]=n[204][e]);for(n[205]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威�".split(""),e=0;e!=n[205].length;++e)65533!==n[205][e].charCodeAt(0)&&(r[n[205][e]]=52480+e,t[52480+e]=n[205][e]);for(n[206]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺�".split(""),e=0;e!=n[206].length;++e)65533!==n[206][e].charCodeAt(0)&&(r[n[206][e]]=52736+e,t[52736+e]=n[206][e]);for(n[207]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓�".split(""),e=0;e!=n[207].length;++e)65533!==n[207][e].charCodeAt(0)&&(r[n[207][e]]=52992+e,t[52992+e]=n[207][e]);for(n[208]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄�".split(""),e=0;e!=n[208].length;++e)65533!==n[208][e].charCodeAt(0)&&(r[n[208][e]]=53248+e,t[53248+e]=n[208][e]);for(n[209]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶�".split(""),e=0;e!=n[209].length;++e)65533!==n[209][e].charCodeAt(0)&&(r[n[209][e]]=53504+e,t[53504+e]=n[209][e]);for(n[210]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐�".split(""),e=0;e!=n[210].length;++e)65533!==n[210][e].charCodeAt(0)&&(r[n[210][e]]=53760+e,t[53760+e]=n[210][e]);for(n[211]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉�".split(""),e=0;e!=n[211].length;++e)65533!==n[211][e].charCodeAt(0)&&(r[n[211][e]]=54016+e,t[54016+e]=n[211][e]);for(n[212]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧�".split(""),e=0;e!=n[212].length;++e)65533!==n[212][e].charCodeAt(0)&&(r[n[212][e]]=54272+e,t[54272+e]=n[212][e]);for(n[213]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政�".split(""),e=0;e!=n[213].length;++e)65533!==n[213][e].charCodeAt(0)&&(r[n[213][e]]=54528+e,t[54528+e]=n[213][e]);for(n[214]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑�".split(""),e=0;e!=n[214].length;++e)65533!==n[214][e].charCodeAt(0)&&(r[n[214][e]]=54784+e,t[54784+e]=n[214][e]);for(n[215]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座������".split(""),e=0;e!=n[215].length;++e)65533!==n[215][e].charCodeAt(0)&&(r[n[215][e]]=55040+e,t[55040+e]=n[215][e]);for(n[216]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝�".split(""),e=0;e!=n[216].length;++e)65533!==n[216][e].charCodeAt(0)&&(r[n[216][e]]=55296+e,t[55296+e]=n[216][e]);for(n[217]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼�".split(""),e=0;e!=n[217].length;++e)65533!==n[217][e].charCodeAt(0)&&(r[n[217][e]]=55552+e,t[55552+e]=n[217][e]);for(n[218]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺�".split(""),e=0;e!=n[218].length;++e)65533!==n[218][e].charCodeAt(0)&&(r[n[218][e]]=55808+e,t[55808+e]=n[218][e]);for(n[219]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝�".split(""),e=0;e!=n[219].length;++e)65533!==n[219][e].charCodeAt(0)&&(r[n[219][e]]=56064+e,t[56064+e]=n[219][e]);for(n[220]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥�".split(""),e=0;e!=n[220].length;++e)65533!==n[220][e].charCodeAt(0)&&(r[n[220][e]]=56320+e,t[56320+e]=n[220][e]);for(n[221]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺�".split(""),e=0;e!=n[221].length;++e)65533!==n[221][e].charCodeAt(0)&&(r[n[221][e]]=56576+e,t[56576+e]=n[221][e]);for(n[222]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖�".split(""),e=0;e!=n[222].length;++e)65533!==n[222][e].charCodeAt(0)&&(r[n[222][e]]=56832+e,t[56832+e]=n[222][e]);for(n[223]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼�".split(""),e=0;e!=n[223].length;++e)65533!==n[223][e].charCodeAt(0)&&(r[n[223][e]]=57088+e,t[57088+e]=n[223][e]);for(n[224]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼�".split(""),e=0;e!=n[224].length;++e)65533!==n[224][e].charCodeAt(0)&&(r[n[224][e]]=57344+e,t[57344+e]=n[224][e]);for(n[225]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺�".split(""),e=0;e!=n[225].length;++e)65533!==n[225][e].charCodeAt(0)&&(r[n[225][e]]=57600+e,t[57600+e]=n[225][e]);for(n[226]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂�".split(""),e=0;e!=n[226].length;++e)65533!==n[226][e].charCodeAt(0)&&(r[n[226][e]]=57856+e,t[57856+e]=n[226][e]);for(n[227]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾�".split(""),e=0;e!=n[227].length;++e)65533!==n[227][e].charCodeAt(0)&&(r[n[227][e]]=58112+e,t[58112+e]=n[227][e]);for(n[228]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑�".split(""),e=0;e!=n[228].length;++e)65533!==n[228][e].charCodeAt(0)&&(r[n[228][e]]=58368+e,t[58368+e]=n[228][e]);for(n[229]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣�".split(""),e=0;e!=n[229].length;++e)65533!==n[229][e].charCodeAt(0)&&(r[n[229][e]]=58624+e,t[58624+e]=n[229][e]);for(n[230]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩�".split(""),e=0;e!=n[230].length;++e)65533!==n[230][e].charCodeAt(0)&&(r[n[230][e]]=58880+e,t[58880+e]=n[230][e]);for(n[231]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬�".split(""),e=0;e!=n[231].length;++e)65533!==n[231][e].charCodeAt(0)&&(r[n[231][e]]=59136+e,t[59136+e]=n[231][e]);for(n[232]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹�".split(""),e=0;e!=n[232].length;++e)65533!==n[232][e].charCodeAt(0)&&(r[n[232][e]]=59392+e,t[59392+e]=n[232][e]);for(n[233]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋�".split(""),e=0;e!=n[233].length;++e)65533!==n[233][e].charCodeAt(0)&&(r[n[233][e]]=59648+e,t[59648+e]=n[233][e]);for(n[234]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰�".split(""),e=0;e!=n[234].length;++e)65533!==n[234][e].charCodeAt(0)&&(r[n[234][e]]=59904+e,t[59904+e]=n[234][e]);for(n[235]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻�".split(""),e=0;e!=n[235].length;++e)65533!==n[235][e].charCodeAt(0)&&(r[n[235][e]]=60160+e,t[60160+e]=n[235][e]);for(n[236]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐�".split(""),e=0;e!=n[236].length;++e)65533!==n[236][e].charCodeAt(0)&&(r[n[236][e]]=60416+e,t[60416+e]=n[236][e]);for(n[237]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨�".split(""),e=0;e!=n[237].length;++e)65533!==n[237][e].charCodeAt(0)&&(r[n[237][e]]=60672+e,t[60672+e]=n[237][e]);for(n[238]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪�".split(""),e=0;e!=n[238].length;++e)65533!==n[238][e].charCodeAt(0)&&(r[n[238][e]]=60928+e,t[60928+e]=n[238][e]);for(n[239]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔�".split(""),e=0;e!=n[239].length;++e)65533!==n[239][e].charCodeAt(0)&&(r[n[239][e]]=61184+e,t[61184+e]=n[239][e]);for(n[240]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙�".split(""),e=0;e!=n[240].length;++e)65533!==n[240][e].charCodeAt(0)&&(r[n[240][e]]=61440+e,t[61440+e]=n[240][e]);for(n[241]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃�".split(""),e=0;e!=n[241].length;++e)65533!==n[241][e].charCodeAt(0)&&(r[n[241][e]]=61696+e,t[61696+e]=n[241][e]);for(n[242]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒�".split(""),e=0;e!=n[242].length;++e)65533!==n[242][e].charCodeAt(0)&&(r[n[242][e]]=61952+e,t[61952+e]=n[242][e]);for(n[243]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋�".split(""),e=0;e!=n[243].length;++e)65533!==n[243][e].charCodeAt(0)&&(r[n[243][e]]=62208+e,t[62208+e]=n[243][e]);for(n[244]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤�".split(""),e=0;e!=n[244].length;++e)65533!==n[244][e].charCodeAt(0)&&(r[n[244][e]]=62464+e,t[62464+e]=n[244][e]);for(n[245]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜�".split(""),e=0;e!=n[245].length;++e)65533!==n[245][e].charCodeAt(0)&&(r[n[245][e]]=62720+e,t[62720+e]=n[245][e]);for(n[246]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋�".split(""),e=0;e!=n[246].length;++e)65533!==n[246][e].charCodeAt(0)&&(r[n[246][e]]=62976+e,t[62976+e]=n[246][e]);for(n[247]="�����������������������������������������������������������������������������������������������������������������������������������������������������������������鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄�".split(""),e=0;e!=n[247].length;++e)65533!==n[247][e].charCodeAt(0)&&(r[n[247][e]]=63232+e,t[63232+e]=n[247][e]);return{enc:r,dec:t}}(),t[10029]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[10079]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüݰ¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[10081]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸˝˛ˇ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),t[28591]=function(){for(var e="\0\b\t\n\v\f\r !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ",t=[],r={},n=0;256!=n;++n)65533!==e.charCodeAt(n)&&(r[e.charAt(n)]=n),t[n]=e.charAt(n);return{enc:r,dec:t}}(),e.exports&&"undefined"==typeof DO_NOT_EXPORT_CODEPAGE&&(e.exports=t),function(r,n){"use strict";if(void 0===t){var a=t;e.exports&&"undefined"==typeof DO_NOT_EXPORT_CODEPAGE?e.exports=n(a):r.cptable=n(a)}else t=n(t)}(this,function(e){"use strict";var t={1200:"utf16le",1201:"utf16be",12e3:"utf32le",12001:"utf32be",16969:"utf64le",20127:"ascii",65e3:"utf7",65001:"utf8"},r=[874,1250,1251,1252,1253,1254,1255,1256,1e4],n=[932,936,949,950],a=[65001],s={},i={},o={},l={},c=function(e){return String.fromCharCode(e)},f=function(e){return e.charCodeAt(0)},h="undefined"!=typeof Buffer,u=function(){};if(h){var d=!Buffer.from;if(!d)try{Buffer.from("foo","utf8")}catch(e){d=!0}u=d?function(e,t){return t?new Buffer(e,t):new Buffer(e)}:Buffer.from.bind(Buffer),Buffer.allocUnsafe||(Buffer.allocUnsafe=function(e){return new Buffer(e)});var p=1024,g=Buffer.allocUnsafe(p),m=function(t){var r=function(e){for(var t=Buffer.allocUnsafe(65536),r=0;r<65536;++r)t[r]=0;for(var n=Object.keys(e),a=n.length,s=0,i=n[s];s>10&1023)],n[i++]=r[56320+(1023&l)]));n=n.slice(0,i)}else for(n=Buffer.allocUnsafe(a),s=0;s>8}return function(e){var t=e.length,r=0,a=0;if(2*t>p&&(p=2*t,g=Buffer.allocUnsafe(p)),Buffer.isBuffer(e))for(r=0;r>8}return function(e,t){var r=e.length,a=Buffer.allocUnsafe(2*r),s=0,i=0,o=0,l=0,c=0;if("string"==typeof e){for(s=l=0;s0&&(a[l++]=n[i]);a=a.slice(0,l)}else if(Buffer.isBuffer(e)){for(s=l=0;s0&&(a[l++]=n[i])):(i=2*(55296+((o=i-65536)>>10&1023)),a[l++]=n[i+1]||n[i],n[i+1]>0&&(a[l++]=n[i]),i=2*(56320+(1023&o)),a[l++]=n[i+1]||n[i],n[i+1]>0&&(a[l++]=n[i]));a=a.slice(0,l)}else for(s=l=0;s0&&(a[l++]=n[i]);return t&&"buf"!==t?"arr"!==t?a.toString("binary"):[].slice.call(a):a}},w=function(t){var r,n=e[t].dec,a=Buffer.allocUnsafe(131072),s=0,i=0,o=0,l=0;for(l=0;l<65536;++l)a[2*l]=255,a[2*l+1]=253;for(s=0;s>8);return function(e){var t=e.length,r=Buffer.allocUnsafe(2*t),n=0,s=0,i=0;if(Buffer.isBuffer(e))for(n=0;np&&(p=4*r,g=Buffer.allocUnsafe(p));var s=0;r>=3&&239==t[0]&&187==t[1]&&191==t[2]&&(s=3);for(var i=1,o=0,l=0;s>8):(a=55296+((n-=65536)>>10&1023),n=56320+(1023&n),g[o++]=255&a,g[o++]=a>>>8,g[o++]=255&n,g[o++]=n>>>8&255);return g.slice(0,o).toString("ucs2")},i[65001]=function(e,t){if(h&&Buffer.isBuffer(e))return t&&"buf"!==t?"arr"!==t?e.toString("binary"):[].slice.call(e):e;var r=e.length,n=0,a=0,s=0,i="string"==typeof e;4*r>p&&(p=4*r,g=Buffer.allocUnsafe(p));for(var o=0;o>6),g[s++]=128+(63&n)):n>=55296&&n<=57343?(n-=55296,++o,a=(i?e.charCodeAt(o):e[o].charCodeAt(0))-56320+(n<<10),g[s++]=240+(a>>>18&7),g[s++]=144+(a>>>12&63),g[s++]=128+(a>>>6&63),g[s++]=128+(63&a)):(g[s++]=224+(n>>12),g[s++]=128+(n>>6&63),g[s++]=128+(63&n));return t&&"buf"!==t?"arr"!==t?g.slice(0,s).toString("binary"):[].slice.call(g,0,s):g.slice(0,s)}}var C=function(){if(h){if(o[r[0]])return;var t=0,c=0;for(t=0;t=3&&239==a[0]&&187==a[1]&&191==a[2]&&(p=3);p>10&1023),d=56320+(1023&d),c[m++]=String.fromCharCode(v)),c[m++]=String.fromCharCode(d);break;case"ascii":if(h&&Buffer.isBuffer(a))return a.toString(w);for(p=0;p=2&&255==a[0]&&254==a[1]&&(p=2),h&&Buffer.isBuffer(a))return a.toString(w);for(g=2;p+1=2&&254==a[0]&&255==a[1]&&(p=2),g=2;p+1=4&&255==a[0]&&254==a[1]&&0===a[2]&&0===a[3]&&(p=4),g=4;p65535?(d-=65536,c[m++]=String.fromCharCode(55296+(d>>10&1023)),c[m++]=String.fromCharCode(56320+(1023&d))):c[m++]=String.fromCharCode(d);break;case"utf32be":for(l>=4&&255==a[3]&&254==a[2]&&0===a[1]&&0===a[0]&&(p=4),g=4;p65535?(d-=65536,c[m++]=String.fromCharCode(55296+(d>>10&1023)),c[m++]=String.fromCharCode(56320+(1023&d))):c[m++]=String.fromCharCode(d);break;case"utf7":for(l>=4&&43==a[0]&&47==a[1]&&118==a[2]&&(l>=5&&56==a[3]&&45==a[4]?p=5:56!=a[3]&&57!=a[3]&&43!=a[3]&&47!=a[3]||(p=4));p>4,E.push(_),-1!==(y=A.indexOf(String.fromCharCode(a[p+I++]))))&&(B=(15&k)<<4|y>>2,E.push(B),-1!==(x=A.indexOf(String.fromCharCode(a[p+I++]))));)T=(3&y)<<6|x,x<64&&E.push(T);for(S=r(1201,E),I=0;I255?(f[g]=d>>8,f[++g]=255&d):f[g]=255&d;else{if(!(b=t[n]))throw new Error("Unrecognized CP: "+n);switch(b){case"utf8":if(h&&w){g=(f=u(a,b)).length;break}for(p=0;p>6),f[++g]=128+(63&d)):d>=55296&&d<=57343?(d-=55296,m=(w?a.charCodeAt(++p):a[++p].charCodeAt(0))-56320+(d<<10),f[g]=240+(m>>>18&7),f[++g]=144+(m>>>12&63),f[++g]=128+(m>>>6&63),f[++g]=128+(63&m)):(f[g]=224+(d>>12),f[++g]=128+(d>>6&63),f[++g]=128+(63&d));break;case"ascii":if(h&&"string"==typeof a){g=(f=u(a,b)).length;break}for(p=0;p>8;break;case"utf16be":for(p=0;p>8,f[g++]=255&d;break;case"utf32le":for(p=0;p=55296&&d<=57343&&(d=65536+(d-55296<<10)+(a[++p].charCodeAt(0)-56320)),f[g++]=255&d,d>>=8,f[g++]=255&d,d>>=8,f[g++]=255&d,d>>=8,f[g++]=255&d;break;case"utf32be":for(p=0;p=55296&&d<=57343&&(d=65536+(d-55296<<10)+(a[++p].charCodeAt(0)-56320)),f[g+3]=255&d,d>>=8,f[g+2]=255&d,d>>=8,f[g+1]=255&d,d>>=8,f[g]=255&d,g+=4;break;case"utf7":for(p=0;p-1)f[g++]=C.charCodeAt(0);else{var E=r(1201,C);f[g++]=43,f[g++]=A.charCodeAt(E[0]>>2),f[g++]=A.charCodeAt(((3&E[0])<<4)+((E[1]||0)>>4)),f[g++]=A.charCodeAt(((15&E[1])<<2)+((E[2]||0)>>6)),f[g++]=45}else f[g++]=43,f[g++]=45}break;default:throw new Error("Unsupported magic: "+n+" "+t[n])}}return f=f.slice(0,g),h?s&&"buf"!==s?"arr"!==s?f.toString("binary"):[].slice.call(f):f:"str"==s?f.map(c).join(""):f},hascp:function(r){return!(!e[r]&&!t[r])},magic:t,cache:_},e})},9400:function(e,t,r){var n,a,s;!function(i){if("undefined"==typeof DO_NOT_EXPORT_JSZIP)e.exports=i();else if("undefined"==typeof DO_NOT_EXPORT_JSZIP)JSZipSync=i(),a=[],void 0===(s="function"==typeof(n=i)?n.apply(t,a):n)||(e.exports=s);else{var o;"undefined"!=typeof globalThis?o=globalThis:"undefined"!=typeof window?o=window:void 0!==r.g?o=r.g:"undefined"!=typeof $&&$.global?o=$.global:"undefined"!=typeof self&&(o=self),o.JSZipSync=i()}}(function(){return function e(t,r,n){function a(i,o){if(!r[i]){if(!t[i]){if(s)return s(i,!0);throw new Error("Cannot find module '"+i+"'")}var l=r[i]={exports:{}};t[i][0].call(l.exports,function(e){return a(t[i][1][e]||e)},l,l.exports,e,t,r,n)}return r[i].exports}for(var s=void 0,i=0;i>2,o=(3&r)<<4|(a=e.charCodeAt(h++))>>4,l=(15&a)<<2|(s=e.charCodeAt(h++))>>6,c=63&s,isNaN(a)?l=c=64:isNaN(s)&&(c=64),f=f+n.charAt(i)+n.charAt(o)+n.charAt(l)+n.charAt(c);return f},r.decode=function(e,t){var r,a,s,i,o,l,c="",f=0;for(e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");f>4,a=(15&i)<<4|(o=n.indexOf(e.charAt(f++)))>>2,s=(3&o)<<6|(l=n.indexOf(e.charAt(f++))),c+=String.fromCharCode(r),64!=o&&(c+=String.fromCharCode(a)),64!=l&&(c+=String.fromCharCode(s));return c}},{}],2:[function(e,t,r){"use strict";function n(){this.compressedSize=0,this.uncompressedSize=0,this.crc32=0,this.compressionMethod=null,this.compressedContent=null}n.prototype={getContent:function(){return null},getCompressedContent:function(){return null}},t.exports=n},{}],3:[function(e,t,r){"use strict";r.STORE={magic:"\0\0",compress:function(e){return e},uncompress:function(e){return e},compressInputType:null,uncompressInputType:null},r.DEFLATE=e("./flate")},{"./flate":8}],4:[function(e,t,r){"use strict";var n=e("./utils"),a=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];t.exports=function(e,t){if(void 0===e||!e.length)return 0;var r="string"!==n.getTypeOf(e);void 0===t&&(t=0);var s=0;t^=-1;for(var i=0,o=e.length;i>>8^a[255&(t^s)];return-1^t}},{"./utils":21}],5:[function(e,t,r){"use strict";var n=e("./utils");function a(e){this.data=null,this.length=0,this.index=0}a.prototype={checkOffset:function(e){this.checkIndex(this.index+e)},checkIndex:function(e){if(this.length=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo("string",this.readData(e))},readData:function(e){},lastIndexOfSignature:function(e){},readDate:function(){var e=this.readInt(4);return new Date(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1)}},t.exports=a},{"./utils":21}],6:[function(e,t,r){"use strict";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!1,r.date=null,r.compression=null,r.comment=null},{}],7:[function(e,t,r){"use strict";var n=e("./utils");r.string2binary=function(e){return n.string2binary(e)},r.string2Uint8Array=function(e){return n.transformTo("uint8array",e)},r.uint8Array2String=function(e){return n.transformTo("string",e)},r.string2Blob=function(e){var t=n.transformTo("arraybuffer",e);return n.arrayBuffer2Blob(t)},r.arrayBuffer2Blob=function(e){return n.arrayBuffer2Blob(e)},r.transformTo=function(e,t){return n.transformTo(e,t)},r.getTypeOf=function(e){return n.getTypeOf(e)},r.checkSupport=function(e){return n.checkSupport(e)},r.MAX_VALUE_16BITS=n.MAX_VALUE_16BITS,r.MAX_VALUE_32BITS=n.MAX_VALUE_32BITS,r.pretty=function(e){return n.pretty(e)},r.findCompression=function(e){return n.findCompression(e)},r.isRegExp=function(e){return n.isRegExp(e)}},{"./utils":21}],8:[function(e,t,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,a=e("pako");r.uncompressInputType=n?"uint8array":"array",r.compressInputType=n?"uint8array":"array",r.magic="\b\0",r.compress=function(e){return a.deflateRaw(e)},r.uncompress=function(e){return a.inflateRaw(e)}},{pako:24}],9:[function(e,t,r){"use strict";var n=e("./base64");function a(e,t){if(!(this instanceof a))return new a(e,t);this.files={},this.comment=null,this.root="",e&&this.load(e,t),this.clone=function(){var e=new a;for(var t in this)"function"!=typeof this[t]&&(e[t]=this[t]);return e}}a.prototype=e("./object"),a.prototype.load=e("./load"),a.support=e("./support"),a.defaults=e("./defaults"),a.utils=e("./deprecatedPublicUtils"),a.base64={encode:function(e){return n.encode(e)},decode:function(e){return n.decode(e)}},a.compressions=e("./compressions"),t.exports=a},{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(e,t,r){"use strict";var n=e("./base64"),a=e("./zipEntries");t.exports=function(e,t){var r,s,i,o;for((t=t||{}).base64&&(e=n.decode(e)),r=(s=new a(e,t)).files,i=0;i>>=8;return n},C=function(){var e,t,r={};for(e=0;e0?e.substring(0,t):""},_=function(e,t){return"/"!=e.slice(-1)&&(e+="/"),t=void 0!==t&&t,this.files[e]||E.call(this,e,null,{dir:!0,createFolders:t}),this.files[e]},A=function(e,t){var r,n=new f;return e._data instanceof f?(n.uncompressedSize=e._data.uncompressedSize,n.crc32=e._data.crc32,0===n.uncompressedSize||e.dir?(t=c.STORE,n.compressedContent="",n.crc32=0):e._data.compressionMethod===t.magic?n.compressedContent=e._data.getCompressedContent():(r=e._data.getContent(),n.compressedContent=t.compress(a.transformTo(t.compressInputType,r)))):((r=m(e))&&0!==r.length&&!e.dir||(t=c.STORE,r=""),n.uncompressedSize=r.length,n.crc32=s(r),n.compressedContent=t.compress(a.transformTo(t.compressInputType,r))),n.compressedSize=n.compressedContent.length,n.compressionMethod=t.magic,n},B=function(e,t,r,n){r.compressedContent;var o,l,c,f,h=a.transformTo("string",u.utf8encode(t.name)),d=t.comment||"",p=a.transformTo("string",u.utf8encode(d)),g=h.length!==t.name.length,m=p.length!==d.length,v=t.options,b="",C="",E="";c=t._initialMetadata.dir!==t.dir?t.dir:v.dir,o=(f=t._initialMetadata.date!==t.date?t.date:v.date).getHours(),o<<=6,o|=f.getMinutes(),o<<=5,o|=f.getSeconds()/2,l=f.getFullYear()-1980,l<<=4,l|=f.getMonth()+1,l<<=5,l|=f.getDate(),g&&(C=w(1,1)+w(s(h),4)+h,b+="up"+w(C.length,2)+C),m&&(E=w(1,1)+w(this.crc32(p),4)+p,b+="uc"+w(E.length,2)+E);var S="";return S+="\n\0",S+=g||m?"\0\b":"\0\0",S+=r.compressionMethod,S+=w(o,2),S+=w(l,2),S+=w(r.crc32,4),S+=w(r.compressedSize,4),S+=w(r.uncompressedSize,4),S+=w(h.length,2),S+=w(b.length,2),{fileRecord:i.LOCAL_FILE_HEADER+S+h+b,dirRecord:i.CENTRAL_FILE_HEADER+"\0"+S+w(p.length,2)+"\0\0\0\0"+(!0===c?"\0\0\0":"\0\0\0\0")+w(n,4)+h+b+p,compressedObject:r}},T={load:function(e,t){throw new Error("Load method is not defined. Is the file jszip-load.js included ?")},filter:function(e){var t,r,n,a,s=[];for(t in this.files)this.files.hasOwnProperty(t)&&(n=this.files[t],a=new b(n.name,n._data,C(n.options)),r=t.slice(this.root.length,t.length),t.slice(0,this.root.length)===this.root&&e(r,a)&&s.push(a));return s},file:function(e,t,r){if(1===arguments.length){if(a.isRegExp(e)){var n=e;return this.filter(function(e,t){return!t.dir&&n.test(e)})}return this.filter(function(t,r){return!r.dir&&t===e})[0]||null}return e=this.root+e,E.call(this,e,t,r),this},folder:function(e){if(!e)return this;if(a.isRegExp(e))return this.filter(function(t,r){return r.dir&&e.test(t)});var t=this.root+e,r=_.call(this,t),n=this.clone();return n.root=r.name,n},remove:function(e){e=this.root+e;var t=this.files[e];if(t||("/"!=e.slice(-1)&&(e+="/"),t=this.files[e]),t&&!t.dir)delete this.files[e];else for(var r=this.filter(function(t,r){return r.name.slice(0,e.length)===e}),n=0;n=0;--s)if(this.data[s]===t&&this.data[s+1]===r&&this.data[s+2]===n&&this.data[s+3]===a)return s;return-1},a.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.index,this.index+e);return this.index+=e,t},t.exports=a},{"./dataReader":5}],19:[function(e,t,r){"use strict";var n=e("./utils"),a=function(e){this.data=new Uint8Array(e),this.index=0};a.prototype={append:function(e){0!==e.length&&(e=n.transformTo("uint8array",e),this.data.set(e,this.index),this.index+=e.length)},finalize:function(){return this.data}},t.exports=a},{"./utils":21}],20:[function(e,t,r){"use strict";for(var n=e("./utils"),a=e("./support"),s=e("./nodeBuffer"),i=new Array(256),o=0;o<256;o++)i[o]=o>=252?6:o>=248?5:o>=240?4:o>=224?3:o>=192?2:1;i[254]=i[254]=1;var l=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;r>=0&&128==(192&e[r]);)r--;return r<0||0===r?t:r+i[e[r]]>t?r:t},c=function(e){var t,r,a,s,o=e.length,l=new Array(2*o);for(r=0,t=0;t4)l[r++]=65533,t+=s-1;else{for(a&=2===s?31:3===s?15:7;s>1&&t1?l[r++]=65533:a<65536?l[r++]=a:(a-=65536,l[r++]=55296|a>>10&1023,l[r++]=56320|1023&a)}return l.length!==r&&(l.subarray?l=l.subarray(0,r):l.length=r),n.applyFromCharCode(l)};r.utf8encode=function(e){return a.nodebuffer?s(e,"utf-8"):function(e){var t,r,n,s,i,o=e.length,l=0;for(s=0;s>>6,t[i++]=128|63&r):r<65536?(t[i++]=224|r>>>12,t[i++]=128|r>>>6&63,t[i++]=128|63&r):(t[i++]=240|r>>>18,t[i++]=128|r>>>12&63,t[i++]=128|r>>>6&63,t[i++]=128|63&r);return t}(e)},r.utf8decode=function(e){if(a.nodebuffer)return n.transformTo("nodebuffer",e).toString("utf-8");for(var t=[],r=0,s=(e=n.transformTo(a.uint8array?"uint8array":"array",e)).length;r1;)try{"array"===i||"nodebuffer"===i?n.push(String.fromCharCode.apply(null,e.slice(o,Math.min(o+t,a)))):n.push(String.fromCharCode.apply(null,e.subarray(o,Math.min(o+t,a)))),o+=t}catch(e){t=Math.floor(t/2)}return n.join("")}function c(e,t){for(var r=0;r1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var e,t;for(e=0;e0?t.windowBits=-t.windowBits:t.gzip&&t.windowBits>0&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new o,this.strm.avail_out=0;var r=n.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(0!==r)throw new Error(i[r]);t.header&&n.deflateSetHeader(this.strm,t.header)};function c(e,t){var r=new l(t);if(r.push(e,!0),r.err)throw r.msg;return r.result}l.prototype.push=function(e,t){var r,i,o=this.strm,l=this.options.chunkSize;if(this.ended)return!1;i=t===~~t?t:!0===t?4:0,o.input="string"==typeof e?s.string2buf(e):e,o.next_in=0,o.avail_in=o.input.length;do{if(0===o.avail_out&&(o.output=new a.Buf8(l),o.next_out=0,o.avail_out=l),1!==(r=n.deflate(o,i))&&0!==r)return this.onEnd(r),this.ended=!0,!1;(0===o.avail_out||0===o.avail_in&&4===i)&&("string"===this.options.to?this.onData(s.buf2binstring(a.shrinkBuf(o.output,o.next_out))):this.onData(a.shrinkBuf(o.output,o.next_out)))}while((o.avail_in>0||0===o.avail_out)&&1!==r);return 4!==i||(r=n.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,0===r)},l.prototype.onData=function(e){this.chunks.push(e)},l.prototype.onEnd=function(e){0===e&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=a.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Deflate=l,r.deflate=c,r.deflateRaw=function(e,t){return(t=t||{}).raw=!0,c(e,t)},r.gzip=function(e,t){return(t=t||{}).gzip=!0,c(e,t)}},{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(e,t,r){"use strict";var n=e("./zlib/inflate.js"),a=e("./utils/common"),s=e("./utils/strings"),i=e("./zlib/constants"),o=e("./zlib/messages"),l=e("./zlib/zstream"),c=e("./zlib/gzheader"),f=function(e){this.options=a.assign({chunkSize:16384,windowBits:0,to:""},e||{});var t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&(15&t.windowBits||(t.windowBits|=15)),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new l,this.strm.avail_out=0;var r=n.inflateInit2(this.strm,t.windowBits);if(r!==i.Z_OK)throw new Error(o[r]);this.header=new c,n.inflateGetHeader(this.strm,this.header)};function h(e,t){var r=new f(t);if(r.push(e,!0),r.err)throw r.msg;return r.result}f.prototype.push=function(e,t){var r,o,l,c,f,h=this.strm,u=this.options.chunkSize;if(this.ended)return!1;o=t===~~t?t:!0===t?i.Z_FINISH:i.Z_NO_FLUSH,h.input="string"==typeof e?s.binstring2buf(e):e,h.next_in=0,h.avail_in=h.input.length;do{if(0===h.avail_out&&(h.output=new a.Buf8(u),h.next_out=0,h.avail_out=u),(r=n.inflate(h,i.Z_NO_FLUSH))!==i.Z_STREAM_END&&r!==i.Z_OK)return this.onEnd(r),this.ended=!0,!1;h.next_out&&(0===h.avail_out||r===i.Z_STREAM_END||0===h.avail_in&&o===i.Z_FINISH)&&("string"===this.options.to?(l=s.utf8border(h.output,h.next_out),c=h.next_out-l,f=s.buf2string(h.output,l),h.next_out=c,h.avail_out=u-c,c&&a.arraySet(h.output,h.output,l,c,0),this.onData(f)):this.onData(a.shrinkBuf(h.output,h.next_out)))}while(h.avail_in>0&&r!==i.Z_STREAM_END);return r===i.Z_STREAM_END&&(o=i.Z_FINISH),o!==i.Z_FINISH||(r=n.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===i.Z_OK)},f.prototype.onData=function(e){this.chunks.push(e)},f.prototype.onEnd=function(e){e===i.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=a.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Inflate=f,r.inflate=h,r.inflateRaw=function(e,t){return(t=t||{}).raw=!0,h(e,t)},r.ungzip=h},{"./utils/common":27,"./utils/strings":28,"./zlib/constants":30,"./zlib/gzheader":33,"./zlib/inflate.js":35,"./zlib/messages":37,"./zlib/zstream":39}],27:[function(e,t,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;r.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var r=t.shift();if(r){if("object"!=typeof r)throw new TypeError(r+"must be non-object");for(var n in r)r.hasOwnProperty(n)&&(e[n]=r[n])}}return e},r.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var a={arraySet:function(e,t,r,n,a){if(t.subarray&&e.subarray)e.set(t.subarray(r,r+n),a);else for(var s=0;s=252?6:o>=248?5:o>=240?4:o>=224?3:o>=192?2:1;function l(e,t){if(t<65537&&(e.subarray&&s||!e.subarray&&a))return String.fromCharCode.apply(null,n.shrinkBuf(e,t));for(var r="",i=0;i>>6,t[i++]=128|63&r):r<65536?(t[i++]=224|r>>>12,t[i++]=128|r>>>6&63,t[i++]=128|63&r):(t[i++]=240|r>>>18,t[i++]=128|r>>>12&63,t[i++]=128|r>>>6&63,t[i++]=128|63&r);return t},r.buf2binstring=function(e){return l(e,e.length)},r.binstring2buf=function(e){for(var t=new n.Buf8(e.length),r=0,a=t.length;r4)c[n++]=65533,r+=s-1;else{for(a&=2===s?31:3===s?15:7;s>1&&r1?c[n++]=65533:a<65536?c[n++]=a:(a-=65536,c[n++]=55296|a>>10&1023,c[n++]=56320|1023&a)}return l(c,n)},r.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;r>=0&&128==(192&e[r]);)r--;return r<0||0===r?t:r+i[e[r]]>t?r:t}},{"./common":27}],29:[function(e,t,r){"use strict";t.exports=function(e,t,r,n){for(var a=65535&e,s=e>>>16&65535,i=0;0!==r;){r-=i=r>2e3?2e3:r;do{s=s+(a=a+t[n++]|0)|0}while(--i);a%=65521,s%=65521}return a|s<<16}},{}],30:[function(e,t,r){t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],31:[function(e,t,r){"use strict";var n=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t,r,a){var s=n,i=a+r;e^=-1;for(var o=a;o>>8^s[255&(e^t[o])];return-1^e}},{}],32:[function(e,t,r){"use strict";var n=e("../utils/common"),a=e("./trees"),s=e("./adler32"),i=e("./crc32"),o=e("./messages"),l=-2,c=258,f=262,h=103,u=113,d=666;function p(e,t){return e.msg=o[t],t}function g(e){return(e<<1)-(e>4?9:0)}function m(e){for(var t=e.length;--t>=0;)e[t]=0}function v(e){var t=e.state,r=t.pending;r>e.avail_out&&(r=e.avail_out),0!==r&&(n.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function b(e,t){a._tr_flush_block(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,v(e.strm)}function w(e,t){e.pending_buf[e.pending++]=t}function C(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function E(e,t,r,a){var o=e.avail_in;return o>a&&(o=a),0===o?0:(e.avail_in-=o,n.arraySet(t,e.input,e.next_in,o,r),1===e.state.wrap?e.adler=s(e.adler,t,o,r):2===e.state.wrap&&(e.adler=i(e.adler,t,o,r)),e.next_in+=o,e.total_in+=o,o)}function S(e,t){var r,n,a=e.max_chain_length,s=e.strstart,i=e.prev_length,o=e.nice_match,l=e.strstart>e.w_size-f?e.strstart-(e.w_size-f):0,h=e.window,u=e.w_mask,d=e.prev,p=e.strstart+c,g=h[s+i-1],m=h[s+i];e.prev_length>=e.good_match&&(a>>=2),o>e.lookahead&&(o=e.lookahead);do{if(h[(r=t)+i]===m&&h[r+i-1]===g&&h[r]===h[s]&&h[++r]===h[s+1]){s+=2,r++;do{}while(h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&h[++s]===h[++r]&&si){if(e.match_start=t,i=n,n>=o)break;g=h[s+i-1],m=h[s+i]}}}while((t=d[t&u])>l&&0!==--a);return i<=e.lookahead?i:e.lookahead}function _(e){var t,r,a,s,i,o=e.w_size;do{if(s=e.window_size-e.lookahead-e.strstart,e.strstart>=o+(o-f)){n.arraySet(e.window,e.window,o,o,0),e.match_start-=o,e.strstart-=o,e.block_start-=o,t=r=e.hash_size;do{a=e.head[--t],e.head[t]=a>=o?a-o:0}while(--r);t=r=o;do{a=e.prev[--t],e.prev[t]=a>=o?a-o:0}while(--r);s+=o}if(0===e.strm.avail_in)break;if(r=E(e.strm,e.window,e.strstart+e.lookahead,s),e.lookahead+=r,e.lookahead+e.insert>=3)for(i=e.strstart-e.insert,e.ins_h=e.window[i],e.ins_h=(e.ins_h<=3&&(e.ins_h=(e.ins_h<=3)if(n=a._tr_tally(e,e.strstart-e.match_start,e.match_length-3),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=3){e.match_length--;do{e.strstart++,e.ins_h=(e.ins_h<=3&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=2)),e.prev_length>=3&&e.match_length<=e.prev_length){s=e.strstart+e.lookahead-3,n=a._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-3),e.lookahead-=e.prev_length-1,e.prev_length-=2;do{++e.strstart<=s&&(e.ins_h=(e.ins_h<15&&(o=2,a-=16),s<1||s>9||8!==r||a<8||a>15||t<0||t>9||i<0||i>4)return p(e,l);8===a&&(a=9);var c=new y;return e.state=c,c.strm=e,c.wrap=o,c.gzhead=null,c.w_bits=a,c.w_size=1<>1,c.l_buf=3*c.lit_bufsize,c.level=t,c.strategy=i,c.method=r,I(e)}T=[new k(0,0,0,0,function(e,t){var r=65535;for(r>e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(_(e),0===e.lookahead&&0===t)return 1;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,b(e,!1),0===e.strm.avail_out))return 1;if(e.strstart-e.block_start>=e.w_size-f&&(b(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(b(e,!0),0===e.strm.avail_out?3:4):(e.strstart>e.block_start&&(b(e,!1),e.strm.avail_out),1)}),new k(4,4,8,4,A),new k(4,5,16,8,A),new k(4,6,32,32,A),new k(4,4,16,16,B),new k(8,16,32,32,B),new k(8,16,128,128,B),new k(8,32,128,256,B),new k(32,128,258,1024,B),new k(32,258,258,4096,B)],r.deflateInit=function(e,t){return R(e,t,8,15,8,0)},r.deflateInit2=R,r.deflateReset=I,r.deflateResetKeep=x,r.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?l:(e.state.gzhead=t,0):l},r.deflate=function(e,t){var r,n,s,o;if(!e||!e.state||t>5||t<0)return e?p(e,l):l;if(n=e.state,!e.output||!e.input&&0!==e.avail_in||n.status===d&&4!==t)return p(e,0===e.avail_out?-5:l);if(n.strm=e,r=n.last_flush,n.last_flush=t,42===n.status)if(2===n.wrap)e.adler=0,w(n,31),w(n,139),w(n,8),n.gzhead?(w(n,(n.gzhead.text?1:0)+(n.gzhead.hcrc?2:0)+(n.gzhead.extra?4:0)+(n.gzhead.name?8:0)+(n.gzhead.comment?16:0)),w(n,255&n.gzhead.time),w(n,n.gzhead.time>>8&255),w(n,n.gzhead.time>>16&255),w(n,n.gzhead.time>>24&255),w(n,9===n.level?2:n.strategy>=2||n.level<2?4:0),w(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(w(n,255&n.gzhead.extra.length),w(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=i(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(w(n,0),w(n,0),w(n,0),w(n,0),w(n,0),w(n,9===n.level?2:n.strategy>=2||n.level<2?4:0),w(n,3),n.status=u);else{var f=8+(n.w_bits-8<<4)<<8;f|=(n.strategy>=2||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(f|=32),f+=31-f%31,n.status=u,C(n,f),0!==n.strstart&&(C(n,e.adler>>>16),C(n,65535&e.adler)),e.adler=1}if(69===n.status)if(n.gzhead.extra){for(s=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>s&&(e.adler=i(e.adler,n.pending_buf,n.pending-s,s)),v(e),s=n.pending,n.pending!==n.pending_buf_size));)w(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>s&&(e.adler=i(e.adler,n.pending_buf,n.pending-s,s)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){s=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>s&&(e.adler=i(e.adler,n.pending_buf,n.pending-s,s)),v(e),s=n.pending,n.pending===n.pending_buf_size)){o=1;break}o=n.gzindexs&&(e.adler=i(e.adler,n.pending_buf,n.pending-s,s)),0===o&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){s=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>s&&(e.adler=i(e.adler,n.pending_buf,n.pending-s,s)),v(e),s=n.pending,n.pending===n.pending_buf_size)){o=1;break}o=n.gzindexs&&(e.adler=i(e.adler,n.pending_buf,n.pending-s,s)),0===o&&(n.status=h)}else n.status=h;if(n.status===h&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&v(e),n.pending+2<=n.pending_buf_size&&(w(n,255&e.adler),w(n,e.adler>>8&255),e.adler=0,n.status=u)):n.status=u),0!==n.pending){if(v(e),0===e.avail_out)return n.last_flush=-1,0}else if(0===e.avail_in&&g(t)<=g(r)&&4!==t)return p(e,-5);if(n.status===d&&0!==e.avail_in)return p(e,-5);if(0!==e.avail_in||0!==n.lookahead||0!==t&&n.status!==d){var E=2===n.strategy?function(e,t){for(var r;;){if(0===e.lookahead&&(_(e),0===e.lookahead)){if(0===t)return 1;break}if(e.match_length=0,r=a._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(b(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(b(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(b(e,!1),0===e.strm.avail_out)?1:2}(n,t):3===n.strategy?function(e,t){for(var r,n,s,i,o=e.window;;){if(e.lookahead<=c){if(_(e),e.lookahead<=c&&0===t)return 1;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=3&&e.strstart>0&&(n=o[s=e.strstart-1])===o[++s]&&n===o[++s]&&n===o[++s]){i=e.strstart+c;do{}while(n===o[++s]&&n===o[++s]&&n===o[++s]&&n===o[++s]&&n===o[++s]&&n===o[++s]&&n===o[++s]&&n===o[++s]&&se.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=3?(r=a._tr_tally(e,1,e.match_length-3),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=a._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(b(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,4===t?(b(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(b(e,!1),0===e.strm.avail_out)?1:2}(n,t):T[n.level].func(n,t);if(3!==E&&4!==E||(n.status=d),1===E||3===E)return 0===e.avail_out&&(n.last_flush=-1),0;if(2===E&&(1===t?a._tr_align(n):5!==t&&(a._tr_stored_block(n,0,0,!1),3===t&&(m(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),v(e),0===e.avail_out))return n.last_flush=-1,0}return 4!==t?0:n.wrap<=0?1:(2===n.wrap?(w(n,255&e.adler),w(n,e.adler>>8&255),w(n,e.adler>>16&255),w(n,e.adler>>24&255),w(n,255&e.total_in),w(n,e.total_in>>8&255),w(n,e.total_in>>16&255),w(n,e.total_in>>24&255)):(C(n,e.adler>>>16),C(n,65535&e.adler)),v(e),n.wrap>0&&(n.wrap=-n.wrap),0!==n.pending?0:1)},r.deflateEnd=function(e){var t;return e&&e.state?42!==(t=e.state.status)&&69!==t&&73!==t&&91!==t&&t!==h&&t!==u&&t!==d?p(e,l):(e.state=null,t===u?p(e,-3):0):l},r.deflateInfo="pako deflate (from Nodeca project)"},{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(e,t,r){"use strict";t.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}},{}],34:[function(e,t,r){"use strict";t.exports=function(e,t){var r,n,a,s,i,o,l,c,f,h,u,d,p,g,m,v,b,w,C,E,S,_,A,B,T;r=e.state,n=e.next_in,B=e.input,a=n+(e.avail_in-5),s=e.next_out,T=e.output,i=s-(t-e.avail_out),o=s+(e.avail_out-257),l=r.dmax,c=r.wsize,f=r.whave,h=r.wnext,u=r.window,d=r.hold,p=r.bits,g=r.lencode,m=r.distcode,v=(1<>>=C=w>>>24,p-=C,0==(C=w>>>16&255))T[s++]=65535&w;else{if(!(16&C)){if(64&C){if(32&C){r.mode=12;break e}e.msg="invalid literal/length code",r.mode=30;break e}w=g[(65535&w)+(d&(1<>>=C,p-=C),p<15&&(d+=B[n++]<>>=C=w>>>24,p-=C,16&(C=w>>>16&255)){if(S=65535&w,p<(C&=15)&&(d+=B[n++]<l){e.msg="invalid distance too far back",r.mode=30;break e}if(d>>>=C,p-=C,S>(C=s-i)){if((C=S-C)>f&&r.sane){e.msg="invalid distance too far back",r.mode=30;break e}if(_=0,A=u,0===h){if(_+=c-C,C2;)T[s++]=A[_++],T[s++]=A[_++],T[s++]=A[_++],E-=3;E&&(T[s++]=A[_++],E>1&&(T[s++]=A[_++]))}else{_=s-S;do{T[s++]=T[_++],T[s++]=T[_++],T[s++]=T[_++],E-=3}while(E>2);E&&(T[s++]=T[_++],E>1&&(T[s++]=T[_++]))}break}if(64&C){e.msg="invalid distance code",r.mode=30;break e}w=m[(65535&w)+(d&(1<>3,d&=(1<<(p-=E<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function u(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new n.Buf16(320),this.work=new n.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function d(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new n.Buf32(852),t.distcode=t.distdyn=new n.Buf32(592),t.sane=1,t.back=-1,0):l}function p(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,d(e)):l}function g(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?l:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=r,n.wbits=t,p(e))):l}function m(e,t){var r,n;return e?(n=new u,e.state=n,n.window=null,0!==(r=g(e,t))&&(e.state=null),r):l}var v,b,w=!0;function C(e){if(w){var t;for(v=new n.Buf32(512),b=new n.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(o(1,e.lens,0,288,v,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;o(2,e.lens,0,32,b,0,e.work,{bits:5}),w=!1}e.lencode=v,e.lenbits=9,e.distcode=b,e.distbits=5}r.inflateReset=p,r.inflateReset2=g,r.inflateResetKeep=d,r.inflateInit=function(e){return m(e,15)},r.inflateInit2=m,r.inflate=function(e,t){var r,u,d,p,g,m,v,b,w,E,S,_,A,B,T,k,y,x,I,R,O,F,D,N,P=0,L=new n.Buf8(4),M=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return l;(r=e.state).mode===c&&(r.mode=13),g=e.next_out,d=e.output,v=e.avail_out,p=e.next_in,u=e.input,m=e.avail_in,b=r.hold,w=r.bits,E=m,S=v,F=0;e:for(;;)switch(r.mode){case 1:if(0===r.wrap){r.mode=13;break}for(;w<16;){if(0===m)break e;m--,b+=u[p++]<>>8&255,r.check=s(r.check,L,2,0),b=0,w=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&b)<<8)+(b>>8))%31){e.msg="incorrect header check",r.mode=f;break}if(8!=(15&b)){e.msg="unknown compression method",r.mode=f;break}if(w-=4,O=8+(15&(b>>>=4)),0===r.wbits)r.wbits=O;else if(O>r.wbits){e.msg="invalid window size",r.mode=f;break}r.dmax=1<>8&1),512&r.flags&&(L[0]=255&b,L[1]=b>>>8&255,r.check=s(r.check,L,2,0)),b=0,w=0,r.mode=3;case 3:for(;w<32;){if(0===m)break e;m--,b+=u[p++]<>>8&255,L[2]=b>>>16&255,L[3]=b>>>24&255,r.check=s(r.check,L,4,0)),b=0,w=0,r.mode=4;case 4:for(;w<16;){if(0===m)break e;m--,b+=u[p++]<>8),512&r.flags&&(L[0]=255&b,L[1]=b>>>8&255,r.check=s(r.check,L,2,0)),b=0,w=0,r.mode=5;case 5:if(1024&r.flags){for(;w<16;){if(0===m)break e;m--,b+=u[p++]<>>8&255,r.check=s(r.check,L,2,0)),b=0,w=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&((_=r.length)>m&&(_=m),_&&(r.head&&(O=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),n.arraySet(r.head.extra,u,p,_,O)),512&r.flags&&(r.check=s(r.check,u,_,p)),m-=_,p+=_,r.length-=_),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===m)break e;_=0;do{O=u[p+_++],r.head&&O&&r.length<65536&&(r.head.name+=String.fromCharCode(O))}while(O&&_>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=c;break;case 10:for(;w<32;){if(0===m)break e;m--,b+=u[p++]<>>=7&w,w-=7&w,r.mode=27;break}for(;w<3;){if(0===m)break e;m--,b+=u[p++]<>>=1)){case 0:r.mode=14;break;case 1:if(C(r),r.mode=20,6===t){b>>>=2,w-=2;break e}break;case 2:r.mode=17;break;case 3:e.msg="invalid block type",r.mode=f}b>>>=2,w-=2;break;case 14:for(b>>>=7&w,w-=7&w;w<32;){if(0===m)break e;m--,b+=u[p++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=f;break}if(r.length=65535&b,b=0,w=0,r.mode=15,6===t)break e;case 15:r.mode=16;case 16:if(_=r.length){if(_>m&&(_=m),_>v&&(_=v),0===_)break e;n.arraySet(d,u,p,_,g),m-=_,p+=_,v-=_,g+=_,r.length-=_;break}r.mode=c;break;case 17:for(;w<14;){if(0===m)break e;m--,b+=u[p++]<>>=5,w-=5,r.ndist=1+(31&b),b>>>=5,w-=5,r.ncode=4+(15&b),b>>>=4,w-=4,r.nlen>286||r.ndist>30){e.msg="too many length or distance symbols",r.mode=f;break}r.have=0,r.mode=18;case 18:for(;r.have>>=3,w-=3}for(;r.have<19;)r.lens[M[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,D={bits:r.lenbits},F=o(0,r.lens,0,19,r.lencode,0,r.work,D),r.lenbits=D.bits,F){e.msg="invalid code lengths set",r.mode=f;break}r.have=0,r.mode=19;case 19:for(;r.have>>16&255,y=65535&P,!((T=P>>>24)<=w);){if(0===m)break e;m--,b+=u[p++]<>>=T,w-=T,r.lens[r.have++]=y;else{if(16===y){for(N=T+2;w>>=T,w-=T,0===r.have){e.msg="invalid bit length repeat",r.mode=f;break}O=r.lens[r.have-1],_=3+(3&b),b>>>=2,w-=2}else if(17===y){for(N=T+3;w>>=T)),b>>>=3,w-=3}else{for(N=T+7;w>>=T)),b>>>=7,w-=7}if(r.have+_>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=f;break}for(;_--;)r.lens[r.have++]=O}}if(r.mode===f)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=f;break}if(r.lenbits=9,D={bits:r.lenbits},F=o(1,r.lens,0,r.nlen,r.lencode,0,r.work,D),r.lenbits=D.bits,F){e.msg="invalid literal/lengths set",r.mode=f;break}if(r.distbits=6,r.distcode=r.distdyn,D={bits:r.distbits},F=o(2,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,D),r.distbits=D.bits,F){e.msg="invalid distances set",r.mode=f;break}if(r.mode=20,6===t)break e;case 20:r.mode=21;case 21:if(m>=6&&v>=258){e.next_out=g,e.avail_out=v,e.next_in=p,e.avail_in=m,r.hold=b,r.bits=w,i(e,S),g=e.next_out,d=e.output,v=e.avail_out,p=e.next_in,u=e.input,m=e.avail_in,b=r.hold,w=r.bits,r.mode===c&&(r.back=-1);break}for(r.back=0;k=(P=r.lencode[b&(1<>>16&255,y=65535&P,!((T=P>>>24)<=w);){if(0===m)break e;m--,b+=u[p++]<>x)])>>>16&255,y=65535&P,!(x+(T=P>>>24)<=w);){if(0===m)break e;m--,b+=u[p++]<>>=x,w-=x,r.back+=x}if(b>>>=T,w-=T,r.back+=T,r.length=y,0===k){r.mode=26;break}if(32&k){r.back=-1,r.mode=c;break}if(64&k){e.msg="invalid literal/length code",r.mode=f;break}r.extra=15&k,r.mode=22;case 22:if(r.extra){for(N=r.extra;w>>=r.extra,w-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;k=(P=r.distcode[b&(1<>>16&255,y=65535&P,!((T=P>>>24)<=w);){if(0===m)break e;m--,b+=u[p++]<>x)])>>>16&255,y=65535&P,!(x+(T=P>>>24)<=w);){if(0===m)break e;m--,b+=u[p++]<>>=x,w-=x,r.back+=x}if(b>>>=T,w-=T,r.back+=T,64&k){e.msg="invalid distance code",r.mode=f;break}r.offset=y,r.extra=15&k,r.mode=24;case 24:if(r.extra){for(N=r.extra;w>>=r.extra,w-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=f;break}r.mode=25;case 25:if(0===v)break e;if(_=S-v,r.offset>_){if((_=r.offset-_)>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=f;break}_>r.wnext?(_-=r.wnext,A=r.wsize-_):A=r.wnext-_,_>r.length&&(_=r.length),B=r.window}else B=d,A=g-r.offset,_=r.length;_>v&&(_=v),v-=_,r.length-=_;do{d[g++]=B[A++]}while(--_);0===r.length&&(r.mode=21);break;case 26:if(0===v)break e;d[g++]=r.length,v--,r.mode=21;break;case 27:if(r.wrap){for(;w<32;){if(0===m)break e;m--,b|=u[p++]<=i.wsize?(n.arraySet(i.window,t,r-i.wsize,i.wsize,0),i.wnext=0,i.whave=i.wsize):((s=i.wsize-i.wnext)>a&&(s=a),n.arraySet(i.window,t,r-a,s,i.wnext),(a-=s)?(n.arraySet(i.window,t,r-a,a,0),i.wnext=a,i.whave=i.wsize):(i.wnext+=s,i.wnext===i.wsize&&(i.wnext=0),i.whave=1&&0===N[T];T--);if(k>T&&(k=T),0===T)return c[f++]=20971520,c[f++]=20971520,u.bits=1,0;for(B=1;B0&&(0===e||1!==T))return-1;for(P[1]=0,_=1;_<15;_++)P[_+1]=P[_]+N[_];for(A=0;A852||2===e&&R>592)return 1;for(;;){w=_-x,h[A]b?(C=L[M+h[A]],E=F[D+h[A]]):(C=96,E=0),d=1<<_-x,B=p=1<>x)+(p-=d)]=w<<24|C<<16|E}while(0!==p);for(d=1<<_-1;O&d;)d>>=1;if(0!==d?(O&=d-1,O+=d):O=0,A++,0===--N[_]){if(_===T)break;_=t[r+h[A]]}if(_>k&&(O&m)!==g){for(0===x&&(x=k),v+=B,I=1<<(y=_-x);y+x852||2===e&&R>592)return 1;c[g=O&m]=k<<24|y<<16|v-f}}return 0!==O&&(c[v+O]=_-x<<24|64<<16),u.bits=k,0}},{"../utils/common":27}],37:[function(e,t,r){"use strict";t.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],38:[function(e,t,r){"use strict";var n=e("../utils/common");function a(e){for(var t=e.length;--t>=0;)e[t]=0}var s=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],i=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],o=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],l=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],c=new Array(576);a(c);var f=new Array(60);a(f);var h=new Array(512);a(h);var u=new Array(256);a(u);var d=new Array(29);a(d);var p=new Array(30);a(p);var g,m,v,b=function(e,t,r,n,a){this.static_tree=e,this.extra_bits=t,this.extra_base=r,this.elems=n,this.max_length=a,this.has_stree=e&&e.length},w=function(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t};function C(e){return e<256?h[e]:h[256+(e>>>7)]}function E(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function S(e,t,r){e.bi_valid>16-r?(e.bi_buf|=t<>16-e.bi_valid,e.bi_valid+=r-16):(e.bi_buf|=t<>>=1,r<<=1}while(--t>0);return r>>>1}function B(e,t,r){var n,a,s=new Array(16),i=0;for(n=1;n<=15;n++)s[n]=i=i+r[n-1]<<1;for(a=0;a<=t;a++){var o=e[2*a+1];0!==o&&(e[2*a]=A(s[o]++,o))}}function T(e){var t;for(t=0;t<286;t++)e.dyn_ltree[2*t]=0;for(t=0;t<30;t++)e.dyn_dtree[2*t]=0;for(t=0;t<19;t++)e.bl_tree[2*t]=0;e.dyn_ltree[512]=1,e.opt_len=e.static_len=0,e.last_lit=e.matches=0}function k(e){e.bi_valid>8?E(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function y(e,t,r,n){var a=2*t,s=2*r;return e[a]>1;r>=1;r--)x(e,s,r);a=l;do{r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],x(e,s,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,s[2*a]=s[2*r]+s[2*n],e.depth[a]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,s[2*r+1]=s[2*n+1]=a,e.heap[1]=a++,x(e,s,1)}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,a,s,i,o,l=t.dyn_tree,c=t.max_code,f=t.stat_desc.static_tree,h=t.stat_desc.has_stree,u=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,g=0;for(s=0;s<=15;s++)e.bl_count[s]=0;for(l[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;r<573;r++)(s=l[2*l[2*(n=e.heap[r])+1]+1]+1)>p&&(s=p,g++),l[2*n+1]=s,n>c||(e.bl_count[s]++,i=0,n>=d&&(i=u[n-d]),o=l[2*n],e.opt_len+=o*(s+i),h&&(e.static_len+=o*(f[2*n+1]+i)));if(0!==g){do{for(s=p-1;0===e.bl_count[s];)s--;e.bl_count[s]--,e.bl_count[s+1]+=2,e.bl_count[p]--,g-=2}while(g>0);for(s=p;0!==s;s--)for(n=e.bl_count[s];0!==n;)(a=e.heap[--r])>c||(l[2*a+1]!==s&&(e.opt_len+=(s-l[2*a+1])*l[2*a],l[2*a+1]=s),n--)}}(e,t),B(s,c,e.bl_count)}function O(e,t,r){var n,a,s=-1,i=t[1],o=0,l=7,c=4;for(0===i&&(l=138,c=3),t[2*(r+1)+1]=65535,n=0;n<=r;n++)a=i,i=t[2*(n+1)+1],++o>=7;n<30;n++)for(p[n]=a<<7,e=0;e<1<0?(2===e.strm.data_type&&(e.strm.data_type=function(e){var t,r=4093624447;for(t=0;t<=31;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return 0;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return 1;for(t=32;t<256;t++)if(0!==e.dyn_ltree[2*t])return 1;return 0}(e)),R(e,e.l_desc),R(e,e.d_desc),i=function(e){var t;for(O(e,e.dyn_ltree,e.l_desc.max_code),O(e,e.dyn_dtree,e.d_desc.max_code),R(e,e.bl_desc),t=18;t>=3&&0===e.bl_tree[2*l[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),a=e.opt_len+3+7>>>3,(s=e.static_len+3+7>>>3)<=a&&(a=s)):a=s=r+5,r+4<=a&&-1!==t?N(e,t,r,n):4===e.strategy||s===a?(S(e,2+(n?1:0),3),I(e,c,f)):(S(e,4+(n?1:0),3),function(e,t,r,n){var a;for(S(e,t-257,5),S(e,r-1,5),S(e,n-4,4),a=0;a>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(u[r]+256+1)]++,e.dyn_dtree[2*C(t)]++),e.last_lit===e.lit_bufsize-1},r._tr_align=function(e){S(e,2,3),_(e,256,c),function(e){16===e.bi_valid?(E(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},{"../utils/common":27}],39:[function(e,t,r){"use strict";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}]},{},[9])(9)})},7063:function(e,t,r){if(function(t){t.version="0.17.5";var n=1200,a=1252;"undefined"==typeof cptable&&(void 0!==r.g?r.g.cptable=r(1454):"undefined"!=typeof window&&(window.cptable=r(1454)));for(var s=[874,932,936,949,950],i=0;i<=8;++i)s.push(1250+i);var o={0:1252,1:65001,2:65001,77:1e4,128:932,129:949,130:1361,134:936,136:950,161:1253,162:1254,163:1258,177:1255,178:1256,186:1257,204:1251,222:874,238:1250,255:1252,69:6969},l=function(e){-1!=s.indexOf(e)&&(a=o[0]=e)},c=function(e){n=e,l(e)};function f(){c(1200),l(1252)}function h(e){for(var t=[],r=0,n=e.length;r>1;++r)t[r]=String.fromCharCode(e.charCodeAt(2*r)+(e.charCodeAt(2*r+1)<<8));return t.join("")}(e.slice(2)):254==t&&255==r?function(e){for(var t=[],r=0;r>1;++r)t[r]=String.fromCharCode(e.charCodeAt(2*r+1)+(e.charCodeAt(2*r)<<8));return t.join("")}(e.slice(2)):65279==t?e.slice(1):e},d=function(e){return String.fromCharCode(e)},p=function(e){return String.fromCharCode(e)};"undefined"!=typeof cptable&&(c=function(e){n=e,l(e)},u=function(e){return 255===e.charCodeAt(0)&&254===e.charCodeAt(1)?cptable.utils.decode(1200,h(e.slice(2))):e},d=function(e){return 1200===n?String.fromCharCode(e):cptable.utils.decode(n,[255&e,e>>8])[0]},p=function(e){return cptable.utils.decode(a,[e])[0]});var g,m=(g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",{encode:function(e){for(var t="",r=0,n=0,a=0,s=0,i=0,o=0,l=0,c=0;c>2,i=(3&r)<<4|(n=e.charCodeAt(c++))>>4,o=(15&n)<<2|(a=e.charCodeAt(c++))>>6,l=63&a,isNaN(n)?o=l=64:isNaN(a)&&(l=64),t+=g.charAt(s)+g.charAt(i)+g.charAt(o)+g.charAt(l);return t},decode:function(e){var t="",r=0,n=0,a=0,s=0,i=0,o=0;e=e.replace(/[^\w\+\/\=]/g,"");for(var l=0;l>4,t+=String.fromCharCode(r),n=(15&s)<<4|(i=g.indexOf(e.charAt(l++)))>>2,64!==i&&(t+=String.fromCharCode(n)),a=(3&i)<<6|(o=g.indexOf(e.charAt(l++))),64!==o&&(t+=String.fromCharCode(a));return t}}),v="undefined"!=typeof Buffer&&"undefined"!=typeof process&&void 0!==process.versions&&!!process.versions.node,b=function(){};if("undefined"!=typeof Buffer){var w=!Buffer.from;if(!w)try{Buffer.from("foo","utf8")}catch(e){w=!0}b=w?function(e,t){return t?new Buffer(e,t):new Buffer(e)}:Buffer.from.bind(Buffer),Buffer.alloc||(Buffer.alloc=function(e){return new Buffer(e)}),Buffer.allocUnsafe||(Buffer.allocUnsafe=function(e){return new Buffer(e)})}function C(e){return v?Buffer.alloc(e):new Array(e)}function E(e){return v?Buffer.allocUnsafe(e):new Array(e)}var S=function(e){return v?b(e,"binary"):e.split("").map(function(e){return 255&e.charCodeAt(0)})};function _(e){if("undefined"==typeof ArrayBuffer)return S(e);for(var t=new ArrayBuffer(e.length),r=new Uint8Array(t),n=0;n!=e.length;++n)r[n]=255&e.charCodeAt(n);return t}function A(e){if(Array.isArray(e))return e.map(function(e){return String.fromCharCode(e)}).join("");for(var t=[],r=0;r=0;)t+=e.charAt(r--);return t}function r(e,t){for(var r="";r.length=t?n:r("0",t-n.length)+n}function a(e,t){var n=""+e;return n.length>=t?n:r(" ",t-n.length)+n}function s(e,t){var n=""+e;return n.length>=t?n:n+r(" ",t-n.length)}e.version="0.11.2";var i=Math.pow(2,32);function o(e,t){return e>i||e<-i?function(e,t){var n=""+Math.round(e);return n.length>=t?n:r("0",t-n.length)+n}(e,t):function(e,t){var n=""+e;return n.length>=t?n:r("0",t-n.length)+n}(Math.round(e),t)}function l(e,t){return t=t||0,e.length>=7+t&&103==(32|e.charCodeAt(t))&&101==(32|e.charCodeAt(t+1))&&110==(32|e.charCodeAt(t+2))&&101==(32|e.charCodeAt(t+3))&&114==(32|e.charCodeAt(t+4))&&97==(32|e.charCodeAt(t+5))&&108==(32|e.charCodeAt(t+6))}var c=[["Sun","Sunday"],["Mon","Monday"],["Tue","Tuesday"],["Wed","Wednesday"],["Thu","Thursday"],["Fri","Friday"],["Sat","Saturday"]],f=[["J","Jan","January"],["F","Feb","February"],["M","Mar","March"],["A","Apr","April"],["M","May","May"],["J","Jun","June"],["J","Jul","July"],["A","Aug","August"],["S","Sep","September"],["O","Oct","October"],["N","Nov","November"],["D","Dec","December"]];function h(e){e[0]="General",e[1]="0",e[2]="0.00",e[3]="#,##0",e[4]="#,##0.00",e[9]="0%",e[10]="0.00%",e[11]="0.00E+00",e[12]="# ?/?",e[13]="# ??/??",e[14]="m/d/yy",e[15]="d-mmm-yy",e[16]="d-mmm",e[17]="mmm-yy",e[18]="h:mm AM/PM",e[19]="h:mm:ss AM/PM",e[20]="h:mm",e[21]="h:mm:ss",e[22]="m/d/yy h:mm",e[37]="#,##0 ;(#,##0)",e[38]="#,##0 ;[Red](#,##0)",e[39]="#,##0.00;(#,##0.00)",e[40]="#,##0.00;[Red](#,##0.00)",e[45]="mm:ss",e[46]="[h]:mm:ss",e[47]="mmss.0",e[48]="##0.0E+0",e[49]="@",e[56]='"上午/下午 "hh"時"mm"分"ss"秒 "'}var u={};h(u);var d=[],p=0;for(p=5;p<=8;++p)d[p]=32+p;for(p=23;p<=26;++p)d[p]=0;for(p=27;p<=31;++p)d[p]=14;for(p=50;p<=58;++p)d[p]=14;for(p=59;p<=62;++p)d[p]=p-58;for(p=67;p<=68;++p)d[p]=p-58;for(p=72;p<=75;++p)d[p]=p-58;for(p=67;p<=68;++p)d[p]=p-57;for(p=76;p<=78;++p)d[p]=p-56;for(p=79;p<=81;++p)d[p]=p-34;var g=[];function m(e,t,r){for(var n=e<0?-1:1,a=e*n,s=0,i=1,o=0,l=1,c=0,f=0,h=Math.floor(a);ct&&(c>t?(f=l,o=s):(f=c,o=i)),!r)return[0,n*o,f];var u=Math.floor(n*o/f);return[u,n*o-u*f,f]}function v(e,t,r){if(e>2958465||e<0)return null;var n=0|e,a=Math.floor(86400*(e-n)),s=0,i=[],o={D:n,T:a,u:86400*(e-n)-a,y:0,m:0,d:0,H:0,M:0,S:0,q:0};if(Math.abs(o.u)<1e-6&&(o.u=0),t&&t.date1904&&(n+=1462),o.u>.9999&&(o.u=0,86400==++a&&(o.T=a=0,++n,++o.D)),60===n)i=r?[1317,10,29]:[1900,2,29],s=3;else if(0===n)i=r?[1317,8,29]:[1900,1,0],s=6;else{n>60&&--n;var l=new Date(1900,0,1);l.setDate(l.getDate()+n-1),i=[l.getFullYear(),l.getMonth()+1,l.getDate()],s=l.getDay(),n<60&&(s=(s+6)%7),r&&(s=function(e,t){t[0]-=581;var r=e.getDay();return e<60&&(r=(r+6)%7),r}(l,i))}return o.y=i[0],o.m=i[1],o.d=i[2],o.S=a%60,a=Math.floor(a/60),o.M=a%60,a=Math.floor(a/60),o.H=a,o.q=s,o}g[5]=g[63]='"$"#,##0_);\\("$"#,##0\\)',g[6]=g[64]='"$"#,##0_);[Red]\\("$"#,##0\\)',g[7]=g[65]='"$"#,##0.00_);\\("$"#,##0.00\\)',g[8]=g[66]='"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',g[41]='_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)',g[42]='_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)',g[43]='_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)',g[44]='_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)',e.parse_date_code=v;var b=new Date(1899,11,31,0,0,0),w=b.getTime(),C=new Date(1900,2,1,0,0,0);function E(e,t){var r=e.getTime();return t?r-=1262304e5:e>=C&&(r+=864e5),(r-(w+6e4*(e.getTimezoneOffset()-b.getTimezoneOffset())))/864e5}e._general_int=function(e){return e.toString(10)};var S=function(){var e=/(?:\.0*|(\.\d*[1-9])0+)$/;function t(t){return-1==t.indexOf(".")?t:t.replace(e,"$1")}var r=/(?:\.0*|(\.\d*[1-9])0+)[Ee]/,n=/(E[+-])(\d)$/;return function(e){var a,s=Math.floor(Math.log(Math.abs(e))*Math.LOG10E);return a=s>=-4&&s<=-1?e.toPrecision(10+s):Math.abs(s)<=9?function(e){var r=e<0?12:11,n=t(e.toFixed(12));return n.length<=r||(n=e.toPrecision(10)).length<=r?n:e.toExponential(5)}(e):10===s?e.toFixed(10).substr(0,12):function(e){var r=t(e.toFixed(11));return r.length>(e<0?12:11)||"0"===r||"-0"===r?e.toPrecision(6):r}(e),t(function(e){return-1==e.indexOf("E")?e:e.replace(r,"$1E").replace(n,"$10$2")}(a.toUpperCase()))}}();function _(e,t){switch(typeof e){case"string":return e;case"boolean":return e?"TRUE":"FALSE";case"number":return(0|e)===e?e.toString(10):S(e);case"undefined":return"";case"object":if(null==e)return"";if(e instanceof Date)return D(14,E(e,t&&t.date1904),t)}throw new Error("unsupported value in General format: "+e)}function A(e,t,r,a){var s,i="",o=0,l=0,h=r.y,u=0;switch(e){case 98:h=r.y+543;case 121:switch(t.length){case 1:case 2:s=h%100,u=2;break;default:s=h%1e4,u=4}break;case 109:switch(t.length){case 1:case 2:s=r.m,u=t.length;break;case 3:return f[r.m-1][1];case 5:return f[r.m-1][0];default:return f[r.m-1][2]}break;case 100:switch(t.length){case 1:case 2:s=r.d,u=t.length;break;case 3:return c[r.q][0];default:return c[r.q][1]}break;case 104:switch(t.length){case 1:case 2:s=1+(r.H+11)%12,u=t.length;break;default:throw"bad hour format: "+t}break;case 72:switch(t.length){case 1:case 2:s=r.H,u=t.length;break;default:throw"bad hour format: "+t}break;case 77:switch(t.length){case 1:case 2:s=r.M,u=t.length;break;default:throw"bad minute format: "+t}break;case 115:if("s"!=t&&"ss"!=t&&".0"!=t&&".00"!=t&&".000"!=t)throw"bad second format: "+t;return 0!==r.u||"s"!=t&&"ss"!=t?(l=a>=2?3===a?1e3:100:1===a?10:1,(o=Math.round(l*(r.S+r.u)))>=60*l&&(o=0),"s"===t?0===o?"0":""+o/l:(i=n(o,2+a),"ss"===t?i.substr(0,2):"."+i.substr(2,t.length-1))):n(r.S,t.length);case 90:switch(t){case"[h]":case"[hh]":s=24*r.D+r.H;break;case"[m]":case"[mm]":s=60*(24*r.D+r.H)+r.M;break;case"[s]":case"[ss]":s=60*(60*(24*r.D+r.H)+r.M)+Math.round(r.S+r.u);break;default:throw"bad abstime format: "+t}u=3===t.length?1:2;break;case 101:s=h,u=1}return u>0?n(s,u):""}function B(e){if(e.length<=3)return e;for(var t=e.length%3,r=e.substr(0,t);t!=e.length;t+=3)r+=(r.length>0?",":"")+e.substr(t,3);return r}e._general_num=S,e._general=_;var T=function(){var e=/%/g;function i(e,t){var r,n=e.indexOf("E")-e.indexOf(".")-1;if(e.match(/^#+0.0E\+0$/)){if(0==t)return"0.0E+0";if(t<0)return"-"+i(e,-t);var a=e.indexOf(".");-1===a&&(a=e.indexOf("E"));var s=Math.floor(Math.log(t)*Math.LOG10E)%a;if(s<0&&(s+=a),-1===(r=(t/Math.pow(10,s)).toPrecision(n+1+(a+s)%a)).indexOf("e")){var o=Math.floor(Math.log(t)*Math.LOG10E);for(-1===r.indexOf(".")?r=r.charAt(0)+"."+r.substr(1)+"E+"+(o-r.length+s):r+="E+"+(o-s);"0."===r.substr(0,2);)r=(r=r.charAt(0)+r.substr(2,a)+"."+r.substr(2+a)).replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0.");r=r.replace(/\+-/,"-")}r=r.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function(e,t,r,n){return t+r+n.substr(0,(a+s)%a)+"."+n.substr(s)+"E"})}else r=t.toExponential(n);return e.match(/E\+00$/)&&r.match(/e[+-]\d$/)&&(r=r.substr(0,r.length-1)+"0"+r.charAt(r.length-1)),e.match(/E\-/)&&r.match(/e\+/)&&(r=r.replace(/e\+/,"e")),r.replace("e","E")}var l=/# (\?+)( ?)\/( ?)(\d+)/,c=/^#*0*\.([0#]+)/,f=/\).*[0#]/,h=/\(###\) ###\\?-####/;function u(e){for(var t,r="",n=0;n!=e.length;++n)switch(t=e.charCodeAt(n)){case 35:break;case 63:r+=" ";break;case 48:r+="0";break;default:r+=String.fromCharCode(t)}return r}function d(e,t){var r=Math.pow(10,t);return""+Math.round(e*r)/r}function p(e,t){var r=e-Math.floor(e),n=Math.pow(10,t);return t<(""+Math.round(r*n)).length?0:Math.round(r*n)}function g(v,b,w){if(40===v.charCodeAt(0)&&!b.match(f)){var C=b.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");return w>=0?g("n",C,w):"("+g("n",C,-w)+")"}if(44===b.charCodeAt(b.length-1))return function(e,t,r){for(var n=t.length-1;44===t.charCodeAt(n-1);)--n;return T(e,t.substr(0,n),r/Math.pow(10,3*(t.length-n)))}(v,b,w);if(-1!==b.indexOf("%"))return function(t,n,a){var s=n.replace(e,""),i=n.length-s.length;return T(t,s,a*Math.pow(10,2*i))+r("%",i)}(v,b,w);if(-1!==b.indexOf("E"))return i(b,w);if(36===b.charCodeAt(0))return"$"+g(v,b.substr(" "==b.charAt(1)?2:1),w);var E,S,_,A,k=Math.abs(w),y=w<0?"-":"";if(b.match(/^00+$/))return y+o(k,b.length);if(b.match(/^[#?]+$/))return"0"===(E=o(w,0))&&(E=""),E.length>b.length?E:u(b.substr(0,b.length-E.length))+E;if(S=b.match(l))return function(e,t,s){var i=parseInt(e[4],10),o=Math.round(t*i),l=Math.floor(o/i),c=o-l*i,f=i;return s+(0===l?"":""+l)+" "+(0===c?r(" ",e[1].length+1+e[4].length):a(c,e[1].length)+e[2]+"/"+e[3]+n(f,e[4].length))}(S,k,y);if(b.match(/^#+0+$/))return y+o(k,b.length-b.indexOf("0"));if(S=b.match(c))return E=d(w,S[1].length).replace(/^([^\.]+)$/,"$1."+u(S[1])).replace(/\.$/,"."+u(S[1])).replace(/\.(\d*)$/,function(e,t){return"."+t+r("0",u(S[1]).length-t.length)}),-1!==b.indexOf("0.")?E:E.replace(/^0\./,".");if(b=b.replace(/^#+([0.])/,"$1"),S=b.match(/^(0*)\.(#*)$/))return y+d(k,S[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,S[1].length?"0.":".");if(S=b.match(/^#{1,3},##0(\.?)$/))return y+B(o(k,0));if(S=b.match(/^#,##0\.([#0]*0)$/))return w<0?"-"+g(v,b,-w):B(""+(Math.floor(w)+function(e,t){return t<(""+Math.round((e-Math.floor(e))*Math.pow(10,t))).length?1:0}(w,S[1].length)))+"."+n(p(w,S[1].length),S[1].length);if(S=b.match(/^#,#*,#0/))return g(v,b.replace(/^#,#*,/,""),w);if(S=b.match(/^([0#]+)(\\?-([0#]+))+$/))return E=t(g(v,b.replace(/[\\-]/g,""),w)),_=0,t(t(b.replace(/\\/g,"")).replace(/[0#]/g,function(e){return _-2147483648?""+(e>=0?0|e:e-1|0):""+Math.floor(e)}(w)).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function(e){return"00,"+(e.length<3?n(0,3-e.length):"")+e})+"."+n(_,S[1].length);switch(b){case"###,##0.00":return g(v,"#,##0.00",w);case"###,###":case"##,###":case"#,###":var O=B(o(k,0));return"0"!==O?y+O:"";case"###,###.00":return g(v,"###,##0.00",w).replace(/^0\./,".");case"#,###.00":return g(v,"#,##0.00",w).replace(/^0\./,".")}throw new Error("unsupported format |"+b+"|")}function v(e,t){var r,n=e.indexOf("E")-e.indexOf(".")-1;if(e.match(/^#+0.0E\+0$/)){if(0==t)return"0.0E+0";if(t<0)return"-"+v(e,-t);var a=e.indexOf(".");-1===a&&(a=e.indexOf("E"));var s=Math.floor(Math.log(t)*Math.LOG10E)%a;if(s<0&&(s+=a),!(r=(t/Math.pow(10,s)).toPrecision(n+1+(a+s)%a)).match(/[Ee]/)){var i=Math.floor(Math.log(t)*Math.LOG10E);-1===r.indexOf(".")?r=r.charAt(0)+"."+r.substr(1)+"E+"+(i-r.length+s):r+="E+"+(i-s),r=r.replace(/\+-/,"-")}r=r.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function(e,t,r,n){return t+r+n.substr(0,(a+s)%a)+"."+n.substr(s)+"E"})}else r=t.toExponential(n);return e.match(/E\+00$/)&&r.match(/e[+-]\d$/)&&(r=r.substr(0,r.length-1)+"0"+r.charAt(r.length-1)),e.match(/E\-/)&&r.match(/e\+/)&&(r=r.replace(/e\+/,"e")),r.replace("e","E")}function b(i,o,d){if(40===i.charCodeAt(0)&&!o.match(f)){var p=o.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");return d>=0?b("n",p,d):"("+b("n",p,-d)+")"}if(44===o.charCodeAt(o.length-1))return function(e,t,r){for(var n=t.length-1;44===t.charCodeAt(n-1);)--n;return T(e,t.substr(0,n),r/Math.pow(10,3*(t.length-n)))}(i,o,d);if(-1!==o.indexOf("%"))return function(t,n,a){var s=n.replace(e,""),i=n.length-s.length;return T(t,s,a*Math.pow(10,2*i))+r("%",i)}(i,o,d);if(-1!==o.indexOf("E"))return v(o,d);if(36===o.charCodeAt(0))return"$"+b(i,o.substr(" "==o.charAt(1)?2:1),d);var g,w,C,E,S=Math.abs(d),_=d<0?"-":"";if(o.match(/^00+$/))return _+n(S,o.length);if(o.match(/^[#?]+$/))return g=""+d,0===d&&(g=""),g.length>o.length?g:u(o.substr(0,o.length-g.length))+g;if(w=o.match(l))return function(e,t,n){return n+(0===t?"":""+t)+r(" ",e[1].length+2+e[4].length)}(w,S,_);if(o.match(/^#+0+$/))return _+n(S,o.length-o.indexOf("0"));if(w=o.match(c))return g=(g=(""+d).replace(/^([^\.]+)$/,"$1."+u(w[1])).replace(/\.$/,"."+u(w[1]))).replace(/\.(\d*)$/,function(e,t){return"."+t+r("0",u(w[1]).length-t.length)}),-1!==o.indexOf("0.")?g:g.replace(/^0\./,".");if(o=o.replace(/^#+([0.])/,"$1"),w=o.match(/^(0*)\.(#*)$/))return _+(""+S).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,w[1].length?"0.":".");if(w=o.match(/^#{1,3},##0(\.?)$/))return _+B(""+S);if(w=o.match(/^#,##0\.([#0]*0)$/))return d<0?"-"+b(i,o,-d):B(""+d)+"."+r("0",w[1].length);if(w=o.match(/^#,#*,#0/))return b(i,o.replace(/^#,#*,/,""),d);if(w=o.match(/^([0#]+)(\\?-([0#]+))+$/))return g=t(b(i,o.replace(/[\\-]/g,""),d)),C=0,t(t(o.replace(/\\/g,"")).replace(/[0#]/g,function(e){return C-1||"\\"==r&&"-"==e.charAt(t+1)&&"0#".indexOf(e.charAt(t+2))>-1););break;case"?":for(;e.charAt(++t)===r;);break;case"*":++t," "!=e.charAt(t)&&"*"!=e.charAt(t)||++t;break;case"(":case")":++t;break;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":for(;t-1;);break;default:++t}return!1}function I(e,t,r,n){for(var a,s,i,o=[],c="",f=0,h="",u="t",d="H";f=12?"P":"A"),m.t="T",d="h",f+=3):"AM/PM"===e.substr(f,5).toUpperCase()?(null!=a&&(m.v=a.H>=12?"PM":"AM"),m.t="T",f+=5,d="h"):"上午/下午"===e.substr(f,5).toUpperCase()?(null!=a&&(m.v=a.H>=12?"下午":"上午"),m.t="T",f+=5,d="h"):(m.t="t",++f),null==a&&"T"===m.t)return"";o[o.length]=m,u=h;break;case"[":for(c=h;"]"!==e.charAt(f++)&&f-1&&(c=(c.match(/\$([^-\[\]]*)/)||[])[1]||"$",x(e)||(o[o.length]={t:"t",v:c}));break;case".":if(null!=a){for(c=h;++f-1;)c+=h;o[o.length]={t:"n",v:c};break;case"?":for(c=h;e.charAt(++f)===h;)c+=h;o[o.length]={t:h,v:c},u=h;break;case"*":++f," "!=e.charAt(f)&&"*"!=e.charAt(f)||++f;break;case"(":case")":o[o.length]={t:1===n?"t":h,v:h},++f;break;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":for(c=h;f-1;)c+=e.charAt(f);o[o.length]={t:"D",v:c};break;case" ":o[o.length]={t:h,v:h},++f;break;case"$":o[o.length]={t:"t",v:"$"},++f;break;default:if(-1===",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP".indexOf(h))throw new Error("unrecognized character "+h+" in "+e);o[o.length]={t:"t",v:h},++f}var b,w=0,C=0;for(f=o.length-1,u="t";f>=0;--f)switch(o[f].t){case"h":case"H":o[f].t=d,u="h",w<1&&(w=1);break;case"s":(b=o[f].v.match(/\.0+$/))&&(C=Math.max(C,b[0].length-1)),w<3&&(w=3);case"d":case"y":case"M":case"e":u=o[f].t;break;case"m":"s"===u&&(o[f].t="M",w<2&&(w=2));break;case"X":break;case"Z":w<1&&o[f].v.match(/[Hh]/)&&(w=1),w<2&&o[f].v.match(/[Mm]/)&&(w=2),w<3&&o[f].v.match(/[Ss]/)&&(w=3)}switch(w){case 0:break;case 1:a.u>=.5&&(a.u=0,++a.S),a.S>=60&&(a.S=0,++a.M),a.M>=60&&(a.M=0,++a.H);break;case 2:a.u>=.5&&(a.u=0,++a.S),a.S>=60&&(a.S=0,++a.M)}var E,S="";for(f=0;f0){40==S.charCodeAt(0)?(B=t<0&&45===S.charCodeAt(0)?-t:t,k=T("n",S,B)):(k=T("n",S,B=t<0&&n>1?-t:t),B<0&&o[0]&&"t"==o[0].t&&(k=k.substr(1),o[0].v="-"+o[0].v)),E=k.length-1;var R=o.length;for(f=0;f-1){R=f;break}var O=o.length;if(R===o.length&&-1===k.indexOf("E")){for(f=o.length-1;f>=0;--f)null!=o[f]&&-1!=="n?".indexOf(o[f].t)&&(E>=o[f].v.length-1?(E-=o[f].v.length,o[f].v=k.substr(E+1,o[f].v.length)):E<0?o[f].v="":(o[f].v=k.substr(0,E+1),E=-1),o[f].t="t",O=f);E>=0&&O=0;--f)if(null!=o[f]&&-1!=="n?".indexOf(o[f].t)){for(s=o[f].v.indexOf(".")>-1&&f===R?o[f].v.indexOf(".")-1:o[f].v.length-1,I=o[f].v.substr(s+1);s>=0;--s)E>=0&&("0"===o[f].v.charAt(s)||"#"===o[f].v.charAt(s))&&(I=k.charAt(E--)+I);o[f].v=I,o[f].t="t",O=f}for(E>=0&&O-1&&f===R?o[f].v.indexOf(".")+1:0,I=o[f].v.substr(0,s);s-1&&(B=n>1&&t<0&&f>0&&"-"===o[f-1].v?-t:t,o[f].v=T(o[f].t,o[f].v,B),o[f].t="t");var F="";for(f=0;f!==o.length;++f)null!=o[f]&&(F+=o[f].v);return F}e.is_date=x,e._eval=I;var R=/\[[=<>]/,O=/\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/;function F(e,t){if(null==t)return!1;var r=parseFloat(t[2]);switch(t[1]){case"=":if(e==r)return!0;break;case">":if(e>r)return!0;break;case"<":if(e":if(e!=r)return!0;break;case">=":if(e>=r)return!0;break;case"<=":if(e<=r)return!0}return!1}function D(e,t,r){null==r&&(r={});var n="";switch(typeof e){case"string":n="m/d/yy"==e&&r.dateNF?r.dateNF:e;break;case"number":null==(n=14==e&&r.dateNF?r.dateNF:(null!=r.table?r.table:u)[e])&&(n=r.table&&r.table[d[e]]||u[d[e]]),null==n&&(n=g[e]||"General")}if(l(n,0))return _(t,r);t instanceof Date&&(t=E(t,r.date1904));var a=function(e,t){var r=k(e),n=r.length,a=r[n-1].indexOf("@");if(n<4&&a>-1&&--n,r.length>4)throw new Error("cannot find right format for |"+r.join("|")+"|");if("number"!=typeof t)return[4,4===r.length||a>-1?r[r.length-1]:"@"];switch(r.length){case 1:r=a>-1?["General","General","General",r[0]]:[r[0],r[0],r[0],"@"];break;case 2:r=a>-1?[r[0],r[0],r[0],r[1]]:[r[0],r[1],r[0],"@"];break;case 3:r=a>-1?[r[0],r[1],r[0],r[2]]:[r[0],r[1],r[2],"@"]}var s=t>0?r[0]:t<0?r[1]:r[2];if(-1===r[0].indexOf("[")&&-1===r[1].indexOf("["))return[n,s];if(null!=r[0].match(R)||null!=r[1].match(R)){var i=r[0].match(O),o=r[1].match(O);return F(t,i)?[n,r[0]]:F(t,o)?[n,r[1]]:[n,r[null!=i&&null!=o?2:1]]}return[n,s]}(n,t);if(l(a[1]))return _(t,r);if(!0===t)t="TRUE";else if(!1===t)t="FALSE";else if(""===t||null==t)return"";return I(a[1],t,r,a[0])}function N(e,t){if("number"!=typeof t){t=+t||-1;for(var r=0;r<392;++r)if(null!=u[r]){if(u[r]==e){t=r;break}}else t<0&&(t=r);t<0&&(t=391)}return u[t]=e,t}e.load=N,e._table=u,e.get_table=function(){return u},e.load_table=function(e){for(var t=0;392!=t;++t)void 0!==e[t]&&N(e[t],t)},e.init_table=h,e.format=D};I(x);var R,O={"General Number":"General","General Date":x._table[22],"Long Date":"dddd, mmmm dd, yyyy","Medium Date":x._table[15],"Short Date":x._table[14],"Long Time":x._table[19],"Medium Time":x._table[18],"Short Time":x._table[20],Currency:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',Fixed:x._table[2],Standard:x._table[4],Percent:x._table[10],Scientific:x._table[11],"Yes/No":'"Yes";"Yes";"No";@',"True/False":'"True";"True";"False";@',"On/Off":'"Yes";"Yes";"No";@'},F={5:'"$"#,##0_);\\("$"#,##0\\)',6:'"$"#,##0_);[Red]\\("$"#,##0\\)',7:'"$"#,##0.00_);\\("$"#,##0.00\\)',8:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',23:"General",24:"General",25:"General",26:"General",27:"m/d/yy",28:"m/d/yy",29:"m/d/yy",30:"m/d/yy",31:"m/d/yy",32:"h:mm:ss",33:"h:mm:ss",34:"h:mm:ss",35:"h:mm:ss",36:"m/d/yy",41:'_(* #,##0_);_(* (#,##0);_(* "-"_);_(@_)',42:'_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)',43:'_(* #,##0.00_);_(* (#,##0.00);_(* "-"??_);_(@_)',44:'_("$"* #,##0.00_);_("$"* (#,##0.00);_("$"* "-"??_);_(@_)',50:"m/d/yy",51:"m/d/yy",52:"m/d/yy",53:"m/d/yy",54:"m/d/yy",55:"m/d/yy",56:"m/d/yy",57:"m/d/yy",58:"m/d/yy",59:"0",60:"0.00",61:"#,##0",62:"#,##0.00",63:'"$"#,##0_);\\("$"#,##0\\)',64:'"$"#,##0_);[Red]\\("$"#,##0\\)',65:'"$"#,##0.00_);\\("$"#,##0.00\\)',66:'"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',67:"0%",68:"0.00%",69:"# ?/?",70:"# ??/??",71:"m/d/yy",72:"m/d/yy",73:"d-mmm-yy",74:"d-mmm",75:"mmm-yy",76:"h:mm",77:"h:mm:ss",78:"m/d/yy h:mm",79:"mm:ss",80:"[h]:mm:ss",81:"mmss.0"},D=/[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g;!function(e){e.version="1.2.0";var t=function(){for(var e=0,t=new Array(256),r=0;256!=r;++r)e=1&(e=1&(e=1&(e=1&(e=1&(e=1&(e=1&(e=1&(e=r)?-306674912^e>>>1:e>>>1)?-306674912^e>>>1:e>>>1)?-306674912^e>>>1:e>>>1)?-306674912^e>>>1:e>>>1)?-306674912^e>>>1:e>>>1)?-306674912^e>>>1:e>>>1)?-306674912^e>>>1:e>>>1)?-306674912^e>>>1:e>>>1,t[r]=e;return"undefined"!=typeof Int32Array?new Int32Array(t):t}();e.table=t,e.bstr=function(e,r){for(var n=-1^r,a=e.length-1,s=0;s>>8^t[255&(n^e.charCodeAt(s++))])>>>8^t[255&(n^e.charCodeAt(s++))];return s===a&&(n=n>>>8^t[255&(n^e.charCodeAt(s))]),-1^n},e.buf=function(e,r){if(e.length>1e4)return function(e,r){for(var n=-1^r,a=e.length-7,s=0;s>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])];for(;s>>8^t[255&(n^e[s++])];return-1^n}(e,r);for(var n=-1^r,a=e.length-3,s=0;s>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])])>>>8^t[255&(n^e[s++])];for(;s>>8^t[255&(n^e[s++])];return-1^n},e.str=function(e,r){for(var n,a,s=-1^r,i=0,o=e.length;i>>8^t[255&(s^n)]:n<2048?s=(s=s>>>8^t[255&(s^(192|n>>6&31))])>>>8^t[255&(s^(128|63&n))]:n>=55296&&n<57344?(n=64+(1023&n),a=1023&e.charCodeAt(i++),s=(s=(s=(s=s>>>8^t[255&(s^(240|n>>8&7))])>>>8^t[255&(s^(128|n>>2&63))])>>>8^t[255&(s^(128|a>>6&15|(3&n)<<4))])>>>8^t[255&(s^(128|63&a))]):s=(s=(s=s>>>8^t[255&(s^(224|n>>12&15))])>>>8^t[255&(s^(128|n>>6&63))])>>>8^t[255&(s^(128|63&n))];return-1^s}}(R={});var N,P=function(){var e,t={};function n(e){if("/"==e.charAt(e.length-1))return-1===e.slice(0,-1).indexOf("/")?e:n(e.slice(0,-1));var t=e.lastIndexOf("/");return-1===t?e:e.slice(0,t+1)}function a(e){if("/"==e.charAt(e.length-1))return a(e.slice(0,-1));var t=e.lastIndexOf("/");return-1===t?e:e.slice(t+1)}function s(e,t){"string"==typeof t&&(t=new Date(t));var r=t.getHours();r=(r=r<<6|t.getMinutes())<<5|t.getSeconds()>>>1,e.write_shift(2,r);var n=t.getFullYear()-1980;n=(n=n<<4|t.getMonth()+1)<<5|t.getDate(),e.write_shift(2,n)}function i(e){Mt(e,0);for(var t={},r=0;e.l<=e.length-4;){var n=e.read_shift(2),a=e.read_shift(2),s=e.l+a,i={};21589===n&&(1&(r=e.read_shift(1))&&(i.mtime=e.read_shift(4)),a>5&&(2&r&&(i.atime=e.read_shift(4)),4&r&&(i.ctime=e.read_shift(4))),i.mtime&&(i.mt=new Date(1e3*i.mtime))),e.l=s,t[n]=i}return t}function o(){return e||(e=r(7233))}function l(e,t){if(80==e[0]&&75==e[1])return fe(e,t);if(e.length<512)throw new Error("CFB file size "+e.length+" < 512");var r,n,a,s,i,o,l=512,d=[],p=e.slice(0,512);Mt(p,0);var g=function(e){if(80==e[e.l]&&75==e[e.l+1])return[0,0];e.chk(A,"Header Signature: "),e.l+=16;var t=e.read_shift(2,"u");return[e.read_shift(2,"u"),t]}(p);switch(r=g[0]){case 3:l=512;break;case 4:l=4096;break;case 0:if(0==g[1])return fe(e,t);default:throw new Error("Major Version: Expected 3 or 4 saw "+r)}512!==l&&Mt(p=e.slice(0,l),28);var m=e.slice(0,l);!function(e,t){var r;switch(e.l+=2,r=e.read_shift(2)){case 9:if(3!=t)throw new Error("Sector Shift: Expected 9 saw "+r);break;case 12:if(4!=t)throw new Error("Sector Shift: Expected 12 saw "+r);break;default:throw new Error("Sector Shift: Expected 9 or 12 saw "+r)}e.chk("0600","Mini Sector Shift: "),e.chk("000000000000","Reserved: ")}(p,r);var v=p.read_shift(4,"i");if(3===r&&0!==v)throw new Error("# Directory Sectors: Expected 0 saw "+v);p.l+=4,s=p.read_shift(4,"i"),p.l+=4,p.chk("00100000","Mini Stream Cutoff Size: "),i=p.read_shift(4,"i"),n=p.read_shift(4,"i"),o=p.read_shift(4,"i"),a=p.read_shift(4,"i");for(var b=-1,w=0;w<109&&!((b=p.read_shift(4,"i"))<0);++w)d[w]=b;var C=function(e,t){for(var r=Math.ceil(e.length/t)-1,n=[],a=1;a=a&&(u-=a),!i[u]){l=[];var p=[];for(h=u;h>=0;){p[h]=!0,i[h]=!0,o[o.length]=h,l.push(e[h]);var g=r[Math.floor(4*h/n)];if(n<4+(d=4*h&c))throw new Error("FAT boundary crossed: "+h+" 4 "+n);if(!e[g])break;if(p[h=It(e[g],d)])break}s[u]={nodes:o,data:ot([l])}}return s}(C,s,d,l);E[s].name="!Directory",n>0&&i!==_&&(E[i].name="!MiniFAT"),E[d[0]].name="!FAT",E.fat_addrs=d,E.ssz=l;var S=[],B=[],T=[];!function(e,t,r,n,a,s,i,o){for(var l,f=0,d=n.length?2:0,p=t[e].data,g=0,m=0;g0&&f!==_&&(t[f].name="!StreamData")):b.size>=4096?(b.storage="fat",void 0===t[b.start]&&(t[b.start]=h(r,b.start,t.fat_addrs,t.ssz)),t[b.start].name=b.name,b.content=t[b.start].data.slice(0,b.size)):(b.storage="minifat",b.size<0?b.size=0:f!==_&&b.start!==_&&t[f]&&(b.content=c(b,t[f].data,(t[o]||{}).data))),b.content&&Mt(b.content,0),s[l]=b,i.push(b)}}(s,E,C,S,n,{},B,i),function(e,t,r){for(var n=0,a=0,s=0,i=0,o=0,l=r.length,c=[],f=[];n0&&i>=0;)s.push(t.slice(i*w,i*w+w)),a-=w,i=It(r,4*i);return 0===s.length?zt(0):T(s).slice(0,e.size)}function f(e,t,r,n,a){var s=_;if(e===_){if(0!==t)throw new Error("DIFAT chain shorter than expected")}else if(-1!==e){var i=r[e],o=(n>>>2)-1;if(!i)return;for(var l=0;l=1&&f(It(i,n-4),t-1,r,n,a)}}function h(e,t,r,n,a){var s=[],i=[];a||(a=[]);var o=n-1,l=0,c=0;for(l=t;l>=0;){a[l]=!0,s[s.length]=l,i.push(e[l]);var f=r[Math.floor(4*l/n)];if(n<4+(c=4*l&o))throw new Error("FAT boundary crossed: "+l+" 4 "+n);if(!e[f])break;l=It(e[f],c)}return{nodes:s,data:ot([i])}}function u(e,t){return new Date(1e3*(xt(e,t+4)/1e7*Math.pow(2,32)+xt(e,t)/1e7-11644473600))}function d(e,t){var r=t||{},n=r.root||"Root Entry";if(e.FullPaths||(e.FullPaths=[]),e.FileIndex||(e.FileIndex=[]),e.FullPaths.length!==e.FileIndex.length)throw new Error("inconsistent CFB structure");0===e.FullPaths.length&&(e.FullPaths[0]=n+"/",e.FileIndex[0]={name:n,type:5}),r.CLSID&&(e.FileIndex[0].clsid=r.CLSID),function(e){var t="Sh33tJ5";if(!P.find(e,"/"+t)){var r=zt(4);r[0]=55,r[1]=r[3]=50,r[2]=54,e.FileIndex.push({name:t,type:2,content:r,size:4,L:69,R:69,C:69}),e.FullPaths.push(e.FullPaths[0]+t),p(e)}}(e)}function p(e,t){d(e);for(var r=!1,s=!1,i=e.FullPaths.length-1;i>=0;--i){var o=e.FileIndex[i];switch(o.type){case 0:s?r=!0:(e.FileIndex.pop(),e.FullPaths.pop());break;case 1:case 2:case 5:s=!0,isNaN(o.R*o.L*o.C)&&(r=!0),o.R>-1&&o.L>-1&&o.R==o.L&&(r=!0);break;default:r=!0}}if(r||t){var l=new Date(1987,1,19),c=0,f=[];for(i=0;i1?1:-1,u.size=0,u.type=5;else if("/"==p.slice(-1)){for(c=i+1;c=f.length?-1:c,c=i+1;c=f.length?-1:c,u.type=1}else n(e.FullPaths[i+1]||"")==n(p)&&(u.R=i+1),u.type=2}}}function g(e,t){var r=t||{};if(p(e),"zip"==r.fileType)return function(e,t){var r=t||{},n=[],a=[],i=zt(1),o=r.compression?8:0,l=0,c=0,f=0,h=0,u=e.FullPaths[0],d=u,p=e.FileIndex[0],g=[],m=0;for(l=1;l0&&(s<4096?t+=s+63>>6:r+=s+511>>9)}}for(var i=e.FullPaths.length+3>>2,o=t+127>>7,l=(t+7>>3)+r+i+o,c=l+127>>7,f=c<=109?0:Math.ceil((c-109)/127);l+c+f+127>>7>c;)f=++c<=109?0:Math.ceil((c-109)/127);var h=[1,f,c,o,i,r,t,0];return e.FileIndex[0].size=t<<6,h[7]=(e.FileIndex[0].start=h[0]+h[1]+h[2]+h[3]+h[4]+h[5])+(h[6]+7>>3),h}(e),a=zt(n[7]<<9),i=0,o=0;for(i=0;i<8;++i)a.write_shift(1,B[i]);for(i=0;i<8;++i)a.write_shift(2,0);for(a.write_shift(2,62),a.write_shift(2,3),a.write_shift(2,65534),a.write_shift(2,9),a.write_shift(2,6),i=0;i<3;++i)a.write_shift(2,0);for(a.write_shift(4,0),a.write_shift(4,n[2]),a.write_shift(4,n[0]+n[1]+n[2]+n[3]-1),a.write_shift(4,0),a.write_shift(4,4096),a.write_shift(4,n[3]?n[0]+n[1]+n[2]-1:_),a.write_shift(4,n[3]),a.write_shift(-4,n[1]?n[0]-1:_),a.write_shift(4,n[1]),i=0;i<109;++i)a.write_shift(-4,i>9)));for(l(n[6]+7>>3);511&a.l;)a.write_shift(-4,I.ENDOFCHAIN);for(o=i=0,c=0;c=4096||(h.start=o,l(f+63>>6)));for(;511&a.l;)a.write_shift(-4,I.ENDOFCHAIN);for(i=0;i=4096){for(a.l=h.start+1<<9,c=0;c0&&h.size<4096){for(c=0;c>16|t>>8|t)}for(var U="undefined"!=typeof Uint8Array,z=U?new Uint8Array(256):[],H=0;H<256;++H)z[H]=M(H);function W(e,t){var r=z[255&e];return t<=8?r>>>8-t:(r=r<<8|z[e>>8&255],t<=16?r>>>16-t:(r=r<<8|z[e>>16&255])>>>24-t)}function V(e,t){var r=7&t,n=t>>>3;return(e[n]|(r<=6?0:e[n+1]<<8))>>>r&3}function X(e,t){var r=7&t,n=t>>>3;return(e[n]|(r<=5?0:e[n+1]<<8))>>>r&7}function G(e,t){var r=7&t,n=t>>>3;return(e[n]|(r<=3?0:e[n+1]<<8))>>>r&31}function j(e,t){var r=7&t,n=t>>>3;return(e[n]|(r<=1?0:e[n+1]<<8))>>>r&127}function K(e,t,r){var n=7&t,a=t>>>3,s=(1<>>n;return r<8-n?i&s:(i|=e[a+1]<<8-n,r<16-n?i&s:(i|=e[a+2]<<16-n,r<24-n?i&s:(i|=e[a+3]<<24-n)&s))}function $(e,t){var r=e.length,n=2*r>t?2*r:t+5,a=0;if(r>=t)return e;if(v){var s=E(n);if(e.copy)e.copy(s);else for(;a0;)t[t.l++]=e[r++]}return t.l},function(e){var t=zt(50+Math.floor(1.1*e.length)),r=Z(e,t);return t.slice(0,r)});function J(e,t,r){var n=1,a=0,s=0,i=0,o=0,l=e.length,c=U?new Uint16Array(32):Y(32);for(s=0;s<32;++s)c[s]=0;for(s=l;s>n-h,i=(1<=0;--i)t[o|i<>>3;return(e[n]|(r<=4?0:e[n+1]<<8))>>>r&15}(e,t+=5)+4;t+=4;for(var s=0,i=U?new Uint8Array(19):Y(19),o=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],l=1,c=U?new Uint8Array(8):Y(8),f=U?new Uint8Array(8):Y(8),h=i.length,u=0;u>8-p;for(var g=(1<<7-p)-1;g>=0;--g)ae[d|g<>>=3){case 16:for(s=3+V(e,t),t+=2,d=m[m.length-1];s-- >0;)m.push(d);break;case 17:for(s=3+X(e,t),t+=3;s-- >0;)m.push(0);break;case 18:for(s=11+j(e,t),t+=7;s-- >0;)m.push(0);break;default:m.push(d),l>>0,o=0,l=0;!(1&n);)if(n=X(e,r),r+=3,n>>>1!=0)for(n>>>1==1?(o=9,l=5):(r=oe(e,r),o=se,l=ie),!t&&i>>1==1?q[c]:re[c];if(r+=15&f,(f>>>=4)>>>8&255){if(256==f)break;var h=(f-=257)<8?0:f-4>>2;h>5&&(h=0);var u=s+N[f];h>0&&(u+=K(e,r,h),r+=h),c=K(e,r,l),r+=15&(f=n>>>1==1?ee[c]:ne[c]);var d=(f>>>=4)<4?0:f-2>>1,p=L[f];for(d>0&&(p+=K(e,r,d),r+=d),!t&&i>>3]|e[(r>>>3)+1]<<8;if(r+=32,!t&&i>>3,(r>>>3)+g),s+=g,r+=8*g;else for(;g-- >0;)a[s++]=e[r>>>3],r+=8}return[t?a:a.slice(0,s),r+7>>>3]}(e.slice(e.l||0),t);return e.l+=r[1],r[0]}function ce(e,t){if(!e)throw new Error(t);"undefined"!=typeof console&&console.error(t)}function fe(e,t){var r=e;Mt(r,0);var n={FileIndex:[],FullPaths:[]};d(n,{root:t.root});for(var a=r.length-4;(80!=r[a]||75!=r[a+1]||5!=r[a+2]||6!=r[a+3])&&a>=0;)--a;r.l=a+4,r.l+=4;var s=r.read_shift(2);r.l+=6;var o=r.read_shift(4);for(r.l=o,a=0;a>>=5);r>>>=4,n.setMilliseconds(0),n.setFullYear(r+1980),n.setMonth(s-1),n.setDate(a);var i=31&t,o=63&(t>>>=5);return t>>>=6,n.setHours(t),n.setMinutes(o),n.setSeconds(i<<1),n}(e);if(8257&s)throw new Error("Unsupported ZIP encryption");for(var c=e.read_shift(4),f=e.read_shift(4),h=e.read_shift(4),u=e.read_shift(2),d=e.read_shift(2),p="",g=0;g3&&(n=!0),a[s].slice(a[s].length-1)){case"Y":throw new Error("Unsupported ISO Duration Field: "+a[s].slice(a[s].length-1));case"D":r*=24;case"H":r*=60;case"M":if(!n)throw new Error("Unsupported ISO Duration Field: M");r*=60}t+=r*parseInt(a[s],10)}return t}var Q=new Date("2017-02-19T19:06:09.000Z");isNaN(Q.getFullYear())&&(Q=new Date("2/19/17"));var J=2017==Q.getFullYear();function q(e,t){var r=new Date(e);if(J)return t>0?r.setTime(r.getTime()+60*r.getTimezoneOffset()*1e3):t<0&&r.setTime(r.getTime()-60*r.getTimezoneOffset()*1e3),r;if(e instanceof Date)return e;if(1917==Q.getFullYear()&&!isNaN(r.getFullYear())){var n=r.getFullYear();return e.indexOf(""+n)>-1||r.setFullYear(r.getFullYear()+100),r}var a=e.match(/\d+/g)||["2017","2","19","0","0","0"],s=new Date(+a[0],+a[1]-1,+a[2],+a[3]||0,+a[4]||0,+a[5]||0);return e.indexOf("Z")>-1&&(s=new Date(s.getTime()-60*s.getTimezoneOffset()*1e3)),s}function ee(e){for(var t="",r=0;r!=e.length;++r)t+=String.fromCharCode(e[r]);return t}function te(e){if("undefined"!=typeof JSON&&!Array.isArray(e))return JSON.parse(JSON.stringify(e));if("object"!=typeof e||null==e)return e;if(e instanceof Date)return new Date(e.getTime());var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=te(e[r]));return t}function re(e,t){for(var r="";r.length8099?r:(a>0||s>1)&&101!=n||e.toLowerCase().match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)?t:e.match(/[^-0-9:,\/\\]/)?r:t}var se,ie=5=="abacaba".split(/(:?b)/i).length;function oe(e){return e?e.data?u(e.data):e.asNodeBuffer&&v?u(e.asNodeBuffer().toString("binary")):e.asBinary?u(e.asBinary()):e._data&&e._data.getContent?u(ee(Array.prototype.slice.call(e._data.getContent(),0))):e.content&&e.type?u(ee(e.content)):null:null}function le(e,t){for(var r=e.FullPaths||U(e.files),n=t.toLowerCase().replace(/[\/]/g,"\\"),a=n.replace(/\\/g,"/"),s=0;s\/]+)\s*=\s*((?:")([^"]*)(?:")|(?:')([^']*)(?:')|([^'">\s]+))/g,be=/<[\/\?]?[a-zA-Z0-9:_-]+(?:\s+[^"\s?>\/]+\s*=\s*(?:"[^"]*"|'[^']*'|[^'">\s=]+))*\s*[\/\?]?>/gm;me.match(be)||(be=/<[^>]*>/g);var we=/<\w*:/,Ce=/<(\/?)\w+:/;function Ee(e,t,r){for(var n={},a=0,s=0;a!==e.length&&32!==(s=e.charCodeAt(a))&&10!==s&&13!==s;++a);if(t||(n[0]=e.slice(0,a)),a===e.length)return n;var i=e.match(ve),o=0,l="",c=0,f="",h="",u=1;if(i)for(c=0;c!=i.length;++c){for(h=i[c],s=0;s!=h.length&&61!==h.charCodeAt(s);++s);for(f=h.slice(0,s).trim();32==h.charCodeAt(s+1);)++s;for(u=34==(a=h.charCodeAt(s+1))||39==a?1:0,l=h.slice(s+1+u,h.length-u),o=0;o!=f.length&&58!==f.charCodeAt(o);++o);if(o===f.length)f.indexOf("_")>0&&(f=f.slice(0,f.indexOf("_"))),n[f]=l,r||(n[f.toLowerCase()]=l);else{var d=(5===o&&"xmlns"===f.slice(0,5)?"xmlns":"")+f.slice(o+1);if(n[d]&&"ext"==f.slice(o-3,o))continue;n[d]=l,r||(n[d.toLowerCase()]=l)}}return n}function Se(e){return e.replace(Ce,"<$1")}var _e,Ae,Be={""":'"',"'":"'",">":">","<":"<","&":"&"},Te=H(Be),ke=(_e=/&(?:quot|apos|gt|lt|amp|#x?([\da-fA-F]+));/gi,Ae=/_x([\da-fA-F]{4})_/gi,function e(t){var r=t+"",n=r.indexOf("-1?16:10))||e}).replace(Ae,function(e,t){return String.fromCharCode(parseInt(t,16))});var a=r.indexOf("]]>");return e(r.slice(0,n))+r.slice(n+9,a)+e(r.slice(a+3))}),ye=/[&<>'"]/g,xe=/[\u0000-\u0008\u000b-\u001f]/g;function Ie(e){return(e+"").replace(ye,function(e){return Te[e]}).replace(xe,function(e){return"_x"+("000"+e.charCodeAt(0).toString(16)).slice(-4)+"_"})}function Re(e){return Ie(e).replace(/ /g,"_x0020_")}var Oe=/[\u0000-\u001f]/g;function Fe(e){return(e+"").replace(ye,function(e){return Te[e]}).replace(/\n/g,"
").replace(Oe,function(e){return"&#x"+("000"+e.charCodeAt(0).toString(16)).slice(-4)+";"})}var De=function(){var e=/&#(\d+);/g;function t(e,t){return String.fromCharCode(parseInt(t,10))}return function(r){return r.replace(e,t)}}();function Ne(e){switch(e){case 1:case!0:case"1":case"true":case"TRUE":return!0;default:return!1}}var Pe=function(e){for(var t="",r=0,n=0,a=0,s=0,i=0,o=0;r191&&n<224?(i=(31&n)<<6,i|=63&a,t+=String.fromCharCode(i)):(s=e.charCodeAt(r++),n<240?t+=String.fromCharCode((15&n)<<12|(63&a)<<6|63&s):(o=((7&n)<<18|(63&a)<<12|(63&s)<<6|63&(i=e.charCodeAt(r++)))-65536,t+=String.fromCharCode(55296+(o>>>10&1023)),t+=String.fromCharCode(56320+(1023&o)))));return t},Le=function(e){for(var t=[],r=0,n=0,a=0;r>6))),t.push(String.fromCharCode(128+(63&n)));break;case n>=55296&&n<57344:n-=55296,a=e.charCodeAt(r++)-56320+(n<<10),t.push(String.fromCharCode(240+(a>>18&7))),t.push(String.fromCharCode(144+(a>>12&63))),t.push(String.fromCharCode(128+(a>>6&63))),t.push(String.fromCharCode(128+(63&a)));break;default:t.push(String.fromCharCode(224+(n>>12))),t.push(String.fromCharCode(128+(n>>6&63))),t.push(String.fromCharCode(128+(63&n)))}return t.join("")};if(v){var Me=function(e){var t,r,n,a=Buffer.alloc(2*e.length),s=1,i=0,o=0;for(r=0;r>>10&1023),t=56320+(1023&t)),0!==o&&(a[i++]=255&o,a[i++]=o>>>8,o=0),a[i++]=t%256,a[i++]=t>>>8;return a.slice(0,i).toString("ucs2")},Ue="foo bar baz☃🍣";Pe(Ue)==Me(Ue)&&(Pe=Me);var ze=function(e){return b(e,"binary").toString("utf8")};Pe(Ue)==ze(Ue)&&(Pe=ze),Le=function(e){return b(e,"utf8").toString("binary")}}var He,We,Ve,Xe=(He={},function(e,t){var r=e+"|"+(t||"");return He[r]?He[r]:He[r]=new RegExp("<(?:\\w+:)?"+e+'(?: xml:space="preserve")?(?:[^>]*)>([\\s\\S]*?)",t||"")}),Ge=(We=[["nbsp"," "],["middot","·"],["quot",'"'],["apos","'"],["gt",">"],["lt","<"],["amp","&"]].map(function(e){return[new RegExp("&"+e[0]+";","ig"),e[1]]}),function(e){for(var t=e.replace(/^[\t\n\r ]+/,"").replace(/[\t\n\r ]+$/,"").replace(/>\s+/g,">").replace(/\s+/g,"\n").replace(/<[^>]*>/g,""),r=0;r([\\s\\S]*?)","g")}),Ke=/<\/?(?:vt:)?variant>/g,$e=/<(?:vt:)([^>]*)>([\s\S]*)"+t+""}function Je(e){return U(e).map(function(t){return" "+t+'="'+e[t]+'"'}).join("")}function qe(e,t,r){return"<"+e+(null!=r?Je(r):"")+(null!=t?(t.match(Ze)?' xml:space="preserve"':"")+">"+t+""}function et(e,t){try{return e.toISOString().replace(/\.\d*/,"")}catch(e){if(t)throw e}return""}var tt,rt,nt={dc:"http://purl.org/dc/elements/1.1/",dcterms:"http://purl.org/dc/terms/",dcmitype:"http://purl.org/dc/dcmitype/",mx:"http://schemas.microsoft.com/office/mac/excel/2008/main",r:"http://schemas.openxmlformats.org/officeDocument/2006/relationships",sjs:"http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties",vt:"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes",xsi:"http://www.w3.org/2001/XMLSchema-instance",xsd:"http://www.w3.org/2001/XMLSchema",main:["http://schemas.openxmlformats.org/spreadsheetml/2006/main","http://purl.oclc.org/ooxml/spreadsheetml/main","http://schemas.microsoft.com/office/excel/2006/main","http://schemas.microsoft.com/office/excel/2006/2"]},at="urn:schemas-microsoft-com:office:office",st="urn:schemas-microsoft-com:office:excel",it="urn:schemas-microsoft-com:office:spreadsheet",ot=function(e){for(var t=[],r=0;r0?dt(e,t+4,t+4+r-1):""},mt=gt,vt=function(e,t){var r=xt(e,t);return r>0?dt(e,t+4,t+4+r-1):""},bt=vt,wt=function(e,t){var r=2*xt(e,t);return r>0?dt(e,t+4,t+4+r-1):""},Ct=wt;tt=rt=function(e,t){var r=xt(e,t);return r>0?ct(e,t+4,t+4+r):""};var Et,St,_t=function(e,t){var r=xt(e,t);return r>0?dt(e,t+4,t+4+r):""},At=_t;Et=St=function(e,t){return function(e,t){for(var r=1-2*(e[t+7]>>>7),n=((127&e[t+7])<<4)+(e[t+6]>>>4&15),a=15&e[t+6],s=5;s>=0;--s)a=256*a+e[t+s];return 2047==n?0==a?r*(1/0):NaN:(0==n?n=-1022:(n-=1023,a+=Math.pow(2,52)),r*Math.pow(2,n-52)*a)}(e,t)};var Bt=function(e){return Array.isArray(e)};v&&(ct=function(e,t,r){return Buffer.isBuffer(e)?e.toString("utf16le",t,r).replace(k,""):ft(e,t,r)},ht=function(e,t,r){return Buffer.isBuffer(e)?e.toString("hex",t,t+r):ut(e,t,r)},gt=function(e,t){if(!Buffer.isBuffer(e))return mt(e,t);var r=e.readUInt32LE(t);return r>0?e.toString("utf8",t+4,t+4+r-1):""},vt=function(e,t){if(!Buffer.isBuffer(e))return bt(e,t);var r=e.readUInt32LE(t);return r>0?e.toString("utf8",t+4,t+4+r-1):""},wt=function(e,t){if(!Buffer.isBuffer(e))return Ct(e,t);var r=2*e.readUInt32LE(t);return e.toString("utf16le",t+4,t+4+r-1)},tt=function(e,t){if(!Buffer.isBuffer(e))return rt(e,t);var r=e.readUInt32LE(t);return e.toString("utf16le",t+4,t+4+r)},_t=function(e,t){if(!Buffer.isBuffer(e))return At(e,t);var r=e.readUInt32LE(t);return e.toString("utf8",t+4,t+4+r)},dt=function(e,t,r){return Buffer.isBuffer(e)?e.toString("utf8",t,r):pt(e,t,r)},ot=function(e){return e[0].length>0&&Buffer.isBuffer(e[0][0])?Buffer.concat(e[0]):lt(e)},T=function(e){return Buffer.isBuffer(e[0])?Buffer.concat(e):[].concat.apply([],e)},Et=function(e,t){return Buffer.isBuffer(e)?e.readDoubleLE(t):St(e,t)},Bt=function(e){return Buffer.isBuffer(e)||Array.isArray(e)}),"undefined"!=typeof cptable&&(ct=function(e,t,r){return cptable.utils.decode(1200,e.slice(t,r)).replace(k,"")},dt=function(e,t,r){return cptable.utils.decode(65001,e.slice(t,r))},gt=function(e,t){var r=xt(e,t);return r>0?cptable.utils.decode(a,e.slice(t+4,t+4+r-1)):""},vt=function(e,t){var r=xt(e,t);return r>0?cptable.utils.decode(n,e.slice(t+4,t+4+r-1)):""},wt=function(e,t){var r=2*xt(e,t);return r>0?cptable.utils.decode(1200,e.slice(t+4,t+4+r-1)):""},tt=function(e,t){var r=xt(e,t);return r>0?cptable.utils.decode(1200,e.slice(t+4,t+4+r)):""},_t=function(e,t){var r=xt(e,t);return r>0?cptable.utils.decode(65001,e.slice(t+4,t+4+r)):""});var Tt=function(e,t){return e[t]},kt=function(e,t){return 256*e[t+1]+e[t]},yt=function(e,t){var r=256*e[t+1]+e[t];return r<32768?r:-1*(65535-r+1)},xt=function(e,t){return e[t+3]*(1<<24)+(e[t+2]<<16)+(e[t+1]<<8)+e[t]},It=function(e,t){return e[t+3]<<24|e[t+2]<<16|e[t+1]<<8|e[t]},Rt=function(e,t){return e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3]};function Ot(e,t){var r,a,s,i,o,l,c="",f=[];switch(t){case"dbcs":if(l=this.l,v&&Buffer.isBuffer(this))c=this.slice(this.l,this.l+2*e).toString("utf16le");else for(o=0;o0?It:Rt)(this,this.l),this.l+=4,r);case 8:case-8:if("f"===t)return a=8==e?Et(this,this.l):Et([this[this.l+7],this[this.l+6],this[this.l+5],this[this.l+4],this[this.l+3],this[this.l+2],this[this.l+1],this[this.l+0]],0),this.l+=8,a;e=8;case 16:c=ht(this,this.l,e)}}return this.l+=e,c}var Ft=function(e,t,r){e[r]=255&t,e[r+1]=t>>>8&255,e[r+2]=t>>>16&255,e[r+3]=t>>>24&255},Dt=function(e,t,r){e[r]=255&t,e[r+1]=t>>8&255,e[r+2]=t>>16&255,e[r+3]=t>>24&255},Nt=function(e,t,r){e[r]=255&t,e[r+1]=t>>>8&255};function Pt(e,t,r){var n=0,s=0;if("dbcs"===r){for(s=0;s!=t.length;++s)Nt(this,t.charCodeAt(s),this.l+2*s);n=2*t.length}else if("sbcs"===r){if("undefined"!=typeof cptable&&874==a)for(s=0;s!=t.length;++s){var i=cptable.utils.encode(a,t.charAt(s));this[this.l+s]=i[0]}else for(t=t.replace(/[^\x00-\x7F]/g,"_"),s=0;s!=t.length;++s)this[this.l+s]=255&t.charCodeAt(s);n=t.length}else{if("hex"===r){for(;s>8}for(;this.l>>=8,this[this.l+1]=255&t;break;case 3:n=3,this[this.l]=255&t,t>>>=8,this[this.l+1]=255&t,t>>>=8,this[this.l+2]=255&t;break;case 4:n=4,Ft(this,t,this.l);break;case 8:if(n=8,"f"===r){!function(e,t,r){var n=(t<0||1/t==-1/0?1:0)<<7,a=0,s=0,i=n?-t:t;isFinite(i)?0==i?a=s=0:(a=Math.floor(Math.log(i)/Math.LN2),s=i*Math.pow(2,52-a),a<=-1023&&(!isFinite(s)||s>4|n}(this,t,this.l);break}case 16:break;case-4:n=4,Dt(this,t,this.l)}}return this.l+=n,this}function Lt(e,t){var r=ht(this,this.l,e.length>>1);if(r!==e)throw new Error(t+"Expected "+e+" saw "+r);this.l+=e.length>>1}function Mt(e,t){e.l=t,e.read_shift=Ot,e.chk=Lt,e.write_shift=Pt}function Ut(e,t){e.l+=t}function zt(e){var t=C(e);return Mt(t,0),t}function Ht(e,t,r){if(e){var n,a,s;Mt(e,e.l||0);for(var i=e.length,o=0,l=0;e.ln.l&&((n=n.slice(0,n.l)).l=n.length),n.length>0&&e.push(n),n=null)},s=function(e){return n&&e=128?1:0)+1,n>=128&&++a,n>=16384&&++a,n>=2097152&&++a;var i=e.next(a);s<=127?i.write_shift(1,s):(i.write_shift(1,128+(127&s)),i.write_shift(1,s>>7));for(var o=0;4!=o;++o){if(!(n>=128)){i.write_shift(1,n);break}i.write_shift(1,128+(127&n)),n>>=7}n>0&&Bt(r)&&e.push(r)}}function Xt(e,t,r){var n=te(e);if(t.s?(n.cRel&&(n.c+=t.s.c),n.rRel&&(n.r+=t.s.r)):(n.cRel&&(n.c+=t.c),n.rRel&&(n.r+=t.r)),!r||r.biff<12){for(;n.c>=256;)n.c-=256;for(;n.r>=65536;)n.r-=65536}return n}function Gt(e,t,r){var n=te(e);return n.s=Xt(n.s,t.s,r),n.e=Xt(n.e,t.s,r),n}function jt(e,t){if(e.cRel&&e.c<0)for(e=te(e);e.c<0;)e.c+=t>8?16384:256;if(e.rRel&&e.r<0)for(e=te(e);e.r<0;)e.r+=t>8?1048576:t>5?65536:16384;var r=qt(e);return e.cRel||null==e.cRel||(r=r.replace(/^([A-Z])/,"$$$1")),e.rRel||null==e.rRel||(r=r.replace(/([A-Z]|^)(\d+)$/,"$1$$$2")),r}function Kt(e,t){return 0!=e.s.r||e.s.rRel||e.e.r!=(t.biff>=12?1048575:t.biff>=8?65536:16384)||e.e.rRel?0!=e.s.c||e.s.cRel||e.e.c!=(t.biff>=12?16383:255)||e.e.cRel?jt(e.s,t.biff)+":"+jt(e.e,t.biff):(e.s.rRel?"":"$")+Yt(e.s.r)+":"+(e.e.rRel?"":"$")+Yt(e.e.r):(e.s.cRel?"":"$")+Qt(e.s.c)+":"+(e.e.cRel?"":"$")+Qt(e.e.c)}function $t(e){return parseInt(e.replace(/\$(\d+)$/,"$1"),10)-1}function Yt(e){return""+(e+1)}function Zt(e){for(var t=e.replace(/^\$([A-Z])/,"$1"),r=0,n=0;n!==t.length;++n)r=26*r+t.charCodeAt(n)-64;return r-1}function Qt(e){if(e<0)throw new Error("invalid column "+e);var t="";for(++e;e;e=Math.floor((e-1)/26))t=String.fromCharCode((e-1)%26+65)+t;return t}function Jt(e){for(var t=0,r=0,n=0;n=48&&a<=57?t=10*t+(a-48):a>=65&&a<=90&&(r=26*r+(a-64))}return{c:r-1,r:t-1}}function qt(e){for(var t=e.c+1,r="";t;t=(t-1)/26|0)r=String.fromCharCode((t-1)%26+65)+r;return r+(e.r+1)}function er(e){var t=e.indexOf(":");return-1==t?{s:Jt(e),e:Jt(e)}:{s:Jt(e.slice(0,t)),e:Jt(e.slice(t+1))}}function tr(e,t){return void 0===t||"number"==typeof t?tr(e.s,e.e):("string"!=typeof e&&(e=qt(e)),"string"!=typeof t&&(t=qt(t)),e==t?e:e+":"+t)}function rr(e){var t={s:{c:0,r:0},e:{c:0,r:0}},r=0,n=0,a=0,s=e.length;for(r=0;n26);++n)r=26*r+a;for(t.s.c=--r,r=0;n9);++n)r=10*r+a;if(t.s.r=--r,n===s||10!=a)return t.e.c=t.s.c,t.e.r=t.s.r,t;for(++n,r=0;n!=s&&!((a=e.charCodeAt(n)-64)<1||a>26);++n)r=26*r+a;for(t.e.c=--r,r=0;n!=s&&!((a=e.charCodeAt(n)-48)<0||a>9);++n)r=10*r+a;return t.e.r=--r,t}function nr(e,t,r){return null==e||null==e.t||"z"==e.t?"":void 0!==e.w?e.w:("d"==e.t&&!e.z&&r&&r.dateNF&&(e.z=r.dateNF),"e"==e.t?Vr[e.v]||e.v:function(e,t){var r="d"==e.t&&t instanceof Date;if(null!=e.z)try{return e.w=x.format(e.z,r?X(t):t)}catch(e){}try{return e.w=x.format((e.XF||{}).numFmtId||(r?14:0),r?X(t):t)}catch(e){return""+t}}(e,null==t?e.v:t))}function ar(e,t){var r=t&&t.sheet?t.sheet:"Sheet1",n={};return n[r]=e,{SheetNames:[r],Sheets:n}}function sr(e,t,r){var n=r||{},a=e?Array.isArray(e):n.dense,s=e||(a?[]:{}),i=0,o=0;if(s&&null!=n.origin){if("number"==typeof n.origin)i=n.origin;else{var l="string"==typeof n.origin?Jt(n.origin):n.origin;i=l.r,o=l.c}s["!ref"]||(s["!ref"]="A1:A1")}var c={s:{c:1e7,r:1e7},e:{c:0,r:0}};if(s["!ref"]){var f=rr(s["!ref"]);c.s.c=f.s.c,c.s.r=f.s.r,c.e.c=Math.max(c.e.c,f.e.c),c.e.r=Math.max(c.e.r,f.e.r),-1==i&&(c.e.r=i=f.e.r+1)}for(var h=0;h!=t.length;++h)if(t[h]){if(!Array.isArray(t[h]))throw new Error("aoa_to_sheet expects an array of arrays");for(var u=0;u!=t[h].length;++u)if(void 0!==t[h][u]){var d={v:t[h][u]},p=i+h,g=o+u;if(c.s.r>p&&(c.s.r=p),c.s.c>g&&(c.s.c=g),c.e.r0&&t.write_shift(0,e,"dbcs"),r?t.slice(0,t.l):t}function fr(e){return{ich:e.read_shift(2),ifnt:e.read_shift(2)}}function hr(e,t){var r=e.l,n=e.read_shift(1),a=lr(e),s=[],i={t:a,h:a};if(1&n){for(var o=e.read_shift(4),l=0;l!=o;++l)s.push(fr(e));i.r=s}else i.r=[{ich:0,ifnt:0}];return e.l=r+t,i}!function(e,t){var n;if(void 0!==t)n=t;else try{n=r(6251)}catch(e){n=null}e.rc4=function(e,t){var r=new Array(256),n=0,a=0,s=0,i=0;for(a=0;256!=a;++a)r[a]=a;for(a=0;256!=a;++a)s=s+r[a]+e[a%e.length].charCodeAt(0)&255,i=r[a],r[a]=r[s],r[s]=i;a=s=0;var o=C(t.length);for(n=0;n!=t.length;++n)s=(s+r[a=a+1&255])%256,i=r[a],r[a]=r[s],r[s]=i,o[n]=t[n]^r[r[a]+r[s]&255];return o},e.md5=function(e){if(!n)throw new Error("Unsupported crypto");return n.createHash("md5").update(e).digest("hex")}}({},"undefined"!=typeof crypto?crypto:void 0);var ur=hr;function dr(e){var t=e.read_shift(4),r=e.read_shift(2);return r+=e.read_shift(1)<<16,e.l++,{c:t,iStyleRef:r}}function pr(e,t){return null==t&&(t=zt(8)),t.write_shift(-4,e.c),t.write_shift(3,e.iStyleRef||e.s),t.write_shift(1,0),t}function gr(e){var t=e.read_shift(2);return t+=e.read_shift(1)<<16,e.l++,{c:-1,iStyleRef:t}}function mr(e,t){return null==t&&(t=zt(4)),t.write_shift(3,e.iStyleRef||e.s),t.write_shift(1,0),t}var vr=lr,br=cr;function wr(e){var t=e.read_shift(4);return 0===t||4294967295===t?"":e.read_shift(t,"dbcs")}function Cr(e,t){var r=!1;return null==t&&(r=!0,t=zt(127)),t.write_shift(4,e.length>0?e.length:4294967295),e.length>0&&t.write_shift(0,e,"dbcs"),r?t.slice(0,t.l):t}var Er=lr,Sr=wr,_r=Cr;function Ar(e){var t=e.slice(e.l,e.l+4),r=1&t[0],n=2&t[0];e.l+=4,t[0]&=252;var a=0===n?Et([0,0,0,0,t[0],t[1],t[2],t[3]],0):It(t,0)>>2;return r?a/100:a}function Br(e,t){null==t&&(t=zt(4));var r=0,n=0,a=100*e;if(e==(0|e)&&e>=-(1<<29)&&e<1<<29?n=1:a==(0|a)&&a>=-(1<<29)&&a<1<<29&&(n=1,r=1),!n)throw new Error("unsupported RkNumber "+e);t.write_shift(-4,((r?a:e)<<2)+(r+2))}function Tr(e){var t={s:{},e:{}};return t.s.r=e.read_shift(4),t.e.r=e.read_shift(4),t.s.c=e.read_shift(4),t.e.c=e.read_shift(4),t}var kr=Tr,yr=function(e,t){return t||(t=zt(16)),t.write_shift(4,e.s.r),t.write_shift(4,e.e.r),t.write_shift(4,e.s.c),t.write_shift(4,e.e.c),t};function xr(e){if(e.length-e.l<8)throw"XLS Xnum Buffer underflow";return e.read_shift(8,"f")}function Ir(e,t){return(t||zt(8)).write_shift(8,e,"f")}function Rr(e,t){if(t||(t=zt(8)),!e||e.auto)return t.write_shift(4,0),t.write_shift(4,0),t;null!=e.index?(t.write_shift(1,2),t.write_shift(1,e.index)):null!=e.theme?(t.write_shift(1,6),t.write_shift(1,e.theme)):(t.write_shift(1,5),t.write_shift(1,0));var r=e.tint||0;if(r>0?r*=32767:r<0&&(r*=32768),t.write_shift(2,r),e.rgb&&null==e.theme){var n=e.rgb||"FFFFFF";"number"==typeof n&&(n=("000000"+n.toString(16)).slice(-6)),t.write_shift(1,parseInt(n.slice(0,2),16)),t.write_shift(1,parseInt(n.slice(2,4),16)),t.write_shift(1,parseInt(n.slice(4,6),16)),t.write_shift(1,255)}else t.write_shift(2,0),t.write_shift(1,0),t.write_shift(1,0);return t}function Or(e,t){var r=e.read_shift(4);switch(r){case 0:return"";case 4294967295:case 4294967294:return{2:"BITMAP",3:"METAFILEPICT",8:"DIB",14:"ENHMETAFILE"}[e.read_shift(4)]||""}if(r>400)throw new Error("Unsupported Clipboard: "+r.toString(16));return e.l-=4,e.read_shift(0,1==t?"lpstr":"lpwstr")}var Fr,Dr=80,Nr=[Dr,81],Pr={1:{n:"CodePage",t:2},2:{n:"Category",t:Dr},3:{n:"PresentationFormat",t:Dr},4:{n:"ByteCount",t:3},5:{n:"LineCount",t:3},6:{n:"ParagraphCount",t:3},7:{n:"SlideCount",t:3},8:{n:"NoteCount",t:3},9:{n:"HiddenCount",t:3},10:{n:"MultimediaClipCount",t:3},11:{n:"ScaleCrop",t:11},12:{n:"HeadingPairs",t:4108},13:{n:"TitlesOfParts",t:4126},14:{n:"Manager",t:Dr},15:{n:"Company",t:Dr},16:{n:"LinksUpToDate",t:11},17:{n:"CharacterCount",t:3},19:{n:"SharedDoc",t:11},22:{n:"HyperlinksChanged",t:11},23:{n:"AppVersion",t:3,p:"version"},24:{n:"DigSig",t:65},26:{n:"ContentType",t:Dr},27:{n:"ContentStatus",t:Dr},28:{n:"Language",t:Dr},29:{n:"Version",t:Dr},255:{},2147483648:{n:"Locale",t:19},2147483651:{n:"Behavior",t:19},1919054434:{}},Lr={1:{n:"CodePage",t:2},2:{n:"Title",t:Dr},3:{n:"Subject",t:Dr},4:{n:"Author",t:Dr},5:{n:"Keywords",t:Dr},6:{n:"Comments",t:Dr},7:{n:"Template",t:Dr},8:{n:"LastAuthor",t:Dr},9:{n:"RevNumber",t:Dr},10:{n:"EditTime",t:64},11:{n:"LastPrinted",t:64},12:{n:"CreatedDate",t:64},13:{n:"ModifiedDate",t:64},14:{n:"PageCount",t:3},15:{n:"WordCount",t:3},16:{n:"CharCount",t:3},17:{n:"Thumbnail",t:71},18:{n:"Application",t:Dr},19:{n:"DocSecurity",t:3},255:{},2147483648:{n:"Locale",t:19},2147483651:{n:"Behavior",t:19},1919054434:{}},Mr=z(Pr,"n"),Ur=z(Lr,"n"),zr={1:"US",2:"CA",3:"",7:"RU",20:"EG",30:"GR",31:"NL",32:"BE",33:"FR",34:"ES",36:"HU",39:"IT",41:"CH",43:"AT",44:"GB",45:"DK",46:"SE",47:"NO",48:"PL",49:"DE",52:"MX",55:"BR",61:"AU",64:"NZ",66:"TH",81:"JP",82:"KR",84:"VN",86:"CN",90:"TR",105:"JS",213:"DZ",216:"MA",218:"LY",351:"PT",354:"IS",358:"FI",420:"CZ",886:"TW",961:"LB",962:"JO",963:"SY",964:"IQ",965:"KW",966:"SA",971:"AE",972:"IL",974:"QA",981:"IR",65535:"US"},Hr=[null,"solid","mediumGray","darkGray","lightGray","darkHorizontal","darkVertical","darkDown","darkUp","darkGrid","darkTrellis","lightHorizontal","lightVertical","lightDown","lightUp","lightGrid","lightTrellis","gray125","gray0625"],Wr=te([0,16777215,16711680,65280,255,16776960,16711935,65535,0,16777215,16711680,65280,255,16776960,16711935,65535,8388608,32768,128,8421376,8388736,32896,12632256,8421504,10066431,10040166,16777164,13434879,6684774,16744576,26316,13421823,128,16711935,16776960,65535,8388736,8388608,32896,255,52479,13434879,13434828,16777113,10079487,16751052,13408767,16764057,3368703,3394764,10079232,16763904,16750848,16737792,6710937,9868950,13158,3381606,13056,3355392,10040064,10040166,3355545,3355443,16777215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].map(function(e){return[e>>16&255,e>>8&255,255&e]})),Vr={0:"#NULL!",7:"#DIV/0!",15:"#VALUE!",23:"#REF!",29:"#NAME?",36:"#NUM!",42:"#N/A",43:"#GETTING_DATA",255:"#WTF?"},Xr=W(Vr),Gr={"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml":"workbooks","application/vnd.ms-excel.binIndexWs":"TODO","application/vnd.ms-excel.intlmacrosheet":"TODO","application/vnd.ms-excel.binIndexMs":"TODO","application/vnd.openxmlformats-package.core-properties+xml":"coreprops","application/vnd.openxmlformats-officedocument.custom-properties+xml":"custprops","application/vnd.openxmlformats-officedocument.extended-properties+xml":"extprops","application/vnd.openxmlformats-officedocument.customXmlProperties+xml":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.customProperty":"TODO","application/vnd.ms-excel.pivotTable":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml":"TODO","application/vnd.openxmlformats-officedocument.drawingml.chart+xml":"TODO","application/vnd.ms-office.chartcolorstyle+xml":"TODO","application/vnd.ms-office.chartstyle+xml":"TODO","application/vnd.ms-office.chartex+xml":"TODO","application/vnd.ms-excel.calcChain":"calcchains","application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml":"calcchains","application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings":"TODO","application/vnd.ms-office.activeX":"TODO","application/vnd.ms-office.activeX+xml":"TODO","application/vnd.ms-excel.attachedToolbars":"TODO","application/vnd.ms-excel.connections":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml":"TODO","application/vnd.ms-excel.externalLink":"links","application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml":"links","application/vnd.ms-excel.sheetMetadata":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml":"TODO","application/vnd.ms-excel.pivotCacheDefinition":"TODO","application/vnd.ms-excel.pivotCacheRecords":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml":"TODO","application/vnd.ms-excel.queryTable":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml":"TODO","application/vnd.ms-excel.userNames":"TODO","application/vnd.ms-excel.revisionHeaders":"TODO","application/vnd.ms-excel.revisionLog":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml":"TODO","application/vnd.ms-excel.tableSingleCells":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml":"TODO","application/vnd.ms-excel.slicer":"TODO","application/vnd.ms-excel.slicerCache":"TODO","application/vnd.ms-excel.slicer+xml":"TODO","application/vnd.ms-excel.slicerCache+xml":"TODO","application/vnd.ms-excel.wsSortMap":"TODO","application/vnd.ms-excel.table":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml":"TODO","application/vnd.openxmlformats-officedocument.theme+xml":"themes","application/vnd.openxmlformats-officedocument.themeOverride+xml":"TODO","application/vnd.ms-excel.Timeline+xml":"TODO","application/vnd.ms-excel.TimelineCache+xml":"TODO","application/vnd.ms-office.vbaProject":"vba","application/vnd.ms-office.vbaProjectSignature":"vba","application/vnd.ms-office.volatileDependencies":"TODO","application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml":"TODO","application/vnd.ms-excel.controlproperties+xml":"TODO","application/vnd.openxmlformats-officedocument.model+data":"TODO","application/vnd.ms-excel.Survey+xml":"TODO","application/vnd.openxmlformats-officedocument.drawing+xml":"drawings","application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml":"TODO","application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml":"TODO","application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml":"TODO","application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml":"TODO","application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml":"TODO","application/vnd.openxmlformats-officedocument.vmlDrawing":"TODO","application/vnd.openxmlformats-package.relationships+xml":"rels","application/vnd.openxmlformats-officedocument.oleObject":"TODO","image/png":"TODO",sheet:"js"},jr=(U(Fr={workbooks:{xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",xlsm:"application/vnd.ms-excel.sheet.macroEnabled.main+xml",xlsb:"application/vnd.ms-excel.sheet.binary.macroEnabled.main",xlam:"application/vnd.ms-excel.addin.macroEnabled.main+xml",xltx:"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"},strs:{xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",xlsb:"application/vnd.ms-excel.sharedStrings"},comments:{xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml",xlsb:"application/vnd.ms-excel.comments"},sheets:{xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",xlsb:"application/vnd.ms-excel.worksheet"},charts:{xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml",xlsb:"application/vnd.ms-excel.chartsheet"},dialogs:{xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml",xlsb:"application/vnd.ms-excel.dialogsheet"},macros:{xlsx:"application/vnd.ms-excel.macrosheet+xml",xlsb:"application/vnd.ms-excel.macrosheet"},styles:{xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml",xlsb:"application/vnd.ms-excel.styles"}}).forEach(function(e){["xlsm","xlam"].forEach(function(t){Fr[e][t]||(Fr[e][t]=Fr[e].xlsx)})}),U(Fr).forEach(function(e){U(Fr[e]).forEach(function(t){Gr[Fr[e][t]]=e})}),Fr),Kr=function(e){for(var t=[],r=U(e),n=0;n!==r.length;++n)null==t[e[r[n]]]&&(t[e[r[n]]]=[]),t[e[r[n]]].push(r[n]);return t}(Gr);nt.CT="http://schemas.openxmlformats.org/package/2006/content-types";var $r=qe("Types",null,{xmlns:nt.CT,"xmlns:xsd":nt.xsd,"xmlns:xsi":nt.xsi}),Yr=[["xml","application/xml"],["bin","application/vnd.ms-excel.sheet.binary.macroEnabled.main"],["vml","application/vnd.openxmlformats-officedocument.vmlDrawing"],["data","application/vnd.openxmlformats-officedocument.model+data"],["bmp","image/bmp"],["png","image/png"],["gif","image/gif"],["emf","image/x-emf"],["wmf","image/x-wmf"],["jpg","image/jpeg"],["jpeg","image/jpeg"],["tif","image/tiff"],["tiff","image/tiff"],["pdf","application/pdf"],["rels",Kr.rels[0]]].map(function(e){return qe("Default",null,{Extension:e[0],ContentType:e[1]})}),Zr={WB:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",SHEET:"http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument",HLINK:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink",VML:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing",XPATH:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath",XMISS:"http://schemas.microsoft.com/office/2006/relationships/xlExternalLinkPath/xlPathMissing",XLINK:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink",CXML:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml",CXMLP:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps",VBA:"http://schemas.microsoft.com/office/2006/relationships/vbaProject"};function Qr(e){var t=e.lastIndexOf("/");return e.slice(0,t+1)+"_rels/"+e.slice(t+1)+".rels"}function Jr(e,t){var r={"!id":{}};if(!e)return r;"/"!==t.charAt(0)&&(t="/"+t);var n={};return(e.match(be)||[]).forEach(function(e){var a=Ee(e);if("2&&(t[t.length]="",t[1]=t[1].replace("/>",">")),t.join("")}var tn=[Zr.HLINK,Zr.XPATH,Zr.XMISS];function rn(e,t,r,n,a,s){if(a||(a={}),e["!id"]||(e["!id"]={}),t<0)for(t=1;e["!id"]["rId"+t];++t);if(a.Id="rId"+t,a.Type=n,a.Target=r,s?a.TargetMode=s:tn.indexOf(a.Type)>-1&&(a.TargetMode="External"),e["!id"][a.Id])throw new Error("Cannot rewrite rId "+t);return e["!id"][a.Id]=a,e[("/"+a.Target).replace("//","/")]=a,t}function nn(e,t,r){return[' \n',' \n'," \n"].join("")}function an(e,t){return[' \n',' \n'," \n"].join("")}var sn,on=(sn='SheetJS '+t.version+"",function(){return sn}),ln=[["cp:category","Category"],["cp:contentStatus","ContentStatus"],["cp:keywords","Keywords"],["cp:lastModifiedBy","LastAuthor"],["cp:lastPrinted","LastPrinted"],["cp:revision","RevNumber"],["cp:version","Version"],["dc:creator","Author"],["dc:description","Comments"],["dc:identifier","Identifier"],["dc:language","Language"],["dc:subject","Subject"],["dc:title","Title"],["dcterms:created","CreatedDate","date"],["dcterms:modified","ModifiedDate","date"]];nt.CORE_PROPS="http://schemas.openxmlformats.org/package/2006/metadata/core-properties",Zr.CORE_PROPS="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties";var cn=function(){for(var e=new Array(ln.length),t=0;t]*>([\\s\\S]*?)")}return e}();function fn(e){var t={};e=Pe(e);for(var r=0;r0&&(t[n[1]]=ke(a[1])),"date"===n[2]&&t[n[1]]&&(t[n[1]]=q(t[n[1]]))}return t}var hn=qe("cp:coreProperties",null,{"xmlns:cp":nt.CORE_PROPS,"xmlns:dc":nt.dc,"xmlns:dcterms":nt.dcterms,"xmlns:dcmitype":nt.dcmitype,"xmlns:xsi":nt.xsi});function un(e,t,r,n,a){null==a[e]&&null!=t&&""!==t&&(a[e]=t,t=Ie(t),n[n.length]=r?qe(e,t,r):Qe(e,t))}var dn=[["Application","Application","string"],["AppVersion","AppVersion","string"],["Company","Company","string"],["DocSecurity","DocSecurity","string"],["Manager","Manager","string"],["HyperlinksChanged","HyperlinksChanged","bool"],["SharedDoc","SharedDoc","bool"],["LinksUpToDate","LinksUpToDate","bool"],["ScaleCrop","ScaleCrop","bool"],["HeadingPairs","HeadingPairs","raw"],["TitlesOfParts","TitlesOfParts","raw"]];function pn(e,t,r,n){var a=[];if("string"==typeof e)a=Ye(e,n);else for(var s=0;s0)for(var c=0;c!==a.length;c+=2){switch(l=+a[c+1].v,a[c].v){case"Worksheets":case"工作表":case"Листы":case"أوراق العمل":case"ワークシート":case"גליונות עבודה":case"Arbeitsblätter":case"Çalışma Sayfaları":case"Feuilles de calcul":case"Fogli di lavoro":case"Folhas de cálculo":case"Planilhas":case"Regneark":case"Hojas de cálculo":case"Werkbladen":r.Worksheets=l,r.SheetNames=i.slice(o,o+l);break;case"Named Ranges":case"Rangos con nombre":case"名前付き一覧":case"Benannte Bereiche":case"Navngivne områder":r.NamedRanges=l,r.DefinedNames=i.slice(o,o+l);break;case"Charts":case"Diagramme":r.Chartsheets=l,r.ChartNames=i.slice(o,o+l)}o+=l}}nt.EXT_PROPS="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties",Zr.EXT_PROPS="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties";var gn=qe("Properties",null,{xmlns:nt.EXT_PROPS,"xmlns:vt":nt.vt});nt.CUST_PROPS="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties",Zr.CUST_PROPS="http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties";var mn=/<[^>]+>[^<]*/g,vn=qe("Properties",null,{xmlns:nt.CUST_PROPS,"xmlns:vt":nt.vt});var bn={Title:"Title",Subject:"Subject",Author:"Author",Keywords:"Keywords",Comments:"Description",LastAuthor:"LastAuthor",RevNumber:"Revision",Application:"AppName",LastPrinted:"LastPrinted",CreatedDate:"Created",ModifiedDate:"LastSaved",Category:"Category",Manager:"Manager",Company:"Company",AppVersion:"Version",ContentStatus:"ContentStatus",Identifier:"Identifier",Language:"Language"},wn=H(bn);function Cn(e,t,r){e[t=wn[t]||t]=r}function En(e){var t=e.read_shift(4),r=e.read_shift(4);return new Date(1e3*(r/1e7*Math.pow(2,32)+t/1e7-11644473600)).toISOString().replace(/\.000/,"")}function Sn(e,t,r){var n=e.l,a=e.read_shift(0,"lpstr-cp");if(r)for(;e.l-n&3;)++e.l;return a}function _n(e,t,r){var n=e.read_shift(0,"lpwstr");return r&&(e.l+=4-(n.length+1&3)&3),n}function An(e,t,r){return 31===t?_n(e):Sn(e,0,r)}function Bn(e,t,r){return An(e,t,!1===r?0:4)}function Tn(e){var t=e.l,r=xn(e,81);return 0==e[e.l]&&0==e[e.l+1]&&e.l-t&2&&(e.l+=2),[r,xn(e,3)]}function kn(e,t){for(var r=e.read_shift(4),n={},a=0;a!=r;++a){var s=e.read_shift(4),i=e.read_shift(4);n[s]=e.read_shift(i,1200===t?"utf16le":"utf8").replace(k,"").replace(y,"!"),1200===t&&i%2&&(e.l+=2)}return 3&e.l&&(e.l=e.l>>3<<2),n}function yn(e){var t=e.read_shift(4),r=e.slice(e.l,e.l+t);return e.l+=t,(3&t)>0&&(e.l+=4-(3&t)&3),r}function xn(e,t,r){var n,a=e.read_shift(2),s=r||{};if(e.l+=2,12!==t&&a!==t&&-1===Nr.indexOf(t)&&(4126!=(65534&t)||4126!=(65534&a)))throw new Error("Expected type "+t+" saw "+a);switch(12===t?a:t){case 2:return n=e.read_shift(2,"i"),s.raw||(e.l+=2),n;case 3:return e.read_shift(4,"i");case 11:return 0!==e.read_shift(4);case 19:return e.read_shift(4);case 30:return Sn(e,0,4).replace(k,"");case 31:return _n(e);case 64:return En(e);case 65:return yn(e);case 71:return function(e){var t={};return t.Size=e.read_shift(4),e.l+=t.Size+3-(t.Size-1)%4,t}(e);case 80:return Bn(e,a,!s.raw).replace(k,"");case 81:return function(e,t){if(!t)throw new Error("VtUnalignedString must have positive length");return An(e,t,0)}(e,a).replace(k,"");case 4108:return function(e){for(var t=e.read_shift(4),r=[],n=0;n0&&(r%=Math.pow(2,32),n+=a);var s=zt(8);return s.write_shift(4,r),s.write_shift(4,n),s}(t);break;case 31:case 80:for((n=zt(4+2*(t.length+1)+(t.length%2?0:2))).write_shift(4,t.length+1),n.write_shift(0,t,"dbcs");n.l!=n.length;)n.write_shift(1,0);break;default:throw new Error("TypedPropertyValue unrecognized type "+e+" "+t)}return T([r,n])}function Rn(e,t){var r=e.l,n=e.read_shift(4),a=e.read_shift(4),s=[],i=0,o=0,l=-1,f={};for(i=0;i!=a;++i){var h=e.read_shift(4),u=e.read_shift(4);s[i]=[h,u+r]}s.sort(function(e,t){return e[1]-t[1]});var d={};for(i=0;i!=a;++i){if(e.l!==s[i][1]){var p=!0;if(i>0&&t)switch(t[s[i-1][0]].t){case 2:e.l+2===s[i][1]&&(e.l+=2,p=!1);break;case 80:case 4108:e.l<=s[i][1]&&(e.l=s[i][1],p=!1)}if((!t||0==i)&&e.l<=s[i][1]&&(p=!1,e.l=s[i][1]),p)throw new Error("Read Error: Expected address "+s[i][1]+" at "+e.l+" :"+i)}if(t){var g=t[s[i][0]];if(d[g.n]=xn(e,g.t,{raw:!0}),"version"===g.p&&(d[g.n]=String(d[g.n]>>16)+"."+("0000"+String(65535&d[g.n])).slice(-4)),"CodePage"==g.n)switch(d[g.n]){case 0:d[g.n]=1252;case 874:case 932:case 936:case 949:case 950:case 1250:case 1251:case 1253:case 1254:case 1255:case 1256:case 1257:case 1258:case 1e4:case 1200:case 1201:case 1252:case 65e3:case-536:case 65001:case-535:c(o=d[g.n]>>>0&65535);break;default:throw new Error("Unsupported CodePage: "+d[g.n])}}else if(1===s[i][0]){if(o=d.CodePage=xn(e,2),c(o),-1!==l){var m=e.l;e.l=s[l][1],f=kn(e,o),e.l=m}}else if(0===s[i][0]){if(0===o){l=i,e.l=s[i+1][1];continue}f=kn(e,o)}else{var v,b=f[s[i][0]];switch(e[e.l]){case 65:e.l+=4,v=yn(e);break;case 30:case 31:e.l+=4,v=Bn(e,e[e.l-4]).replace(/\u0000+$/,"");break;case 3:e.l+=4,v=e.read_shift(4,"i");break;case 19:e.l+=4,v=e.read_shift(4);break;case 5:e.l+=4,v=e.read_shift(8,"f");break;case 11:e.l+=4,v=Mn(e,4);break;case 64:e.l+=4,v=q(En(e));break;default:throw new Error("unparsed value: "+e[e.l])}d[b]=v}}return e.l=r+n,d}var On=["CodePage","Thumbnail","_PID_LINKBASE","_PID_HLINKS","SystemIdentifier","FMTID"].concat(["Worksheets","SheetNames","NamedRanges","DefinedNames","Chartsheets","ChartNames"]);function Fn(e){switch(typeof e){case"boolean":return 11;case"number":return(0|e)==e?3:5;case"string":return 31;case"object":if(e instanceof Date)return 64}return-1}function Dn(e,t,r){var n=zt(8),a=[],s=[],i=8,o=0,l=zt(8),c=zt(8);if(l.write_shift(4,2),l.write_shift(4,1200),c.write_shift(4,1),s.push(l),a.push(c),i+=8+l.length,!t){(c=zt(8)).write_shift(4,0),a.unshift(c);var f=[zt(4)];for(f[0].write_shift(4,e.length),o=0;o-1)&&null!=e[o][1]){var u=e[o][1],d=0;if(t){var p=r[d=+t[e[o][0]]];if("version"==p.p&&"string"==typeof u){var g=u.split(".");u=(+g[0]<<16)+(+g[1]||0)}l=In(p.t,u)}else{var m=Fn(u);-1==m&&(m=31,u=String(u)),l=In(m,u)}s.push(l),(c=zt(8)).write_shift(4,t?d:2+o),a.push(c),i+=8+l.length}var v=8*(s.length+1);for(o=0;o=12?2:1),s="sbcs-cont",i=n;r&&r.biff>=8&&(n=1200),r&&8!=r.biff?12==r.biff&&(s="wstr"):e.read_shift(1)&&(s="dbcs-cont"),r.biff>=2&&r.biff<=5&&(s="cpstr");var o=a?e.read_shift(a,s):"";return n=i,o}function Gn(e){var t=n;n=1200;var r,a=e.read_shift(2),s=e.read_shift(1),i=4&s,o=8&s,l=1+(1&s),c=0,f={};o&&(c=e.read_shift(2)),i&&(r=e.read_shift(4));var h=2==l?"dbcs-cont":"sbcs-cont",u=0===a?"":e.read_shift(a,h);return o&&(e.l+=4*c),i&&(e.l+=r),f.t=u,o||(f.raw=""+f.t+"",f.r=f.t),n=t,f}function jn(e){var t=e.t||"",r=zt(3);r.write_shift(2,t.length),r.write_shift(1,1);var n=zt(2*t.length);return n.write_shift(2*t.length,t,"utf16le"),T([r,n])}function Kn(e,t,r){if(r){if(r.biff>=2&&r.biff<=5)return e.read_shift(t,"cpstr");if(r.biff>=12)return e.read_shift(t,"dbcs-cont")}return 0===e.read_shift(1)?e.read_shift(t,"sbcs-cont"):e.read_shift(t,"dbcs-cont")}function $n(e,t,r){var n=e.read_shift(r&&2==r.biff?1:2);return 0===n?(e.l++,""):Kn(e,n,r)}function Yn(e,t,r){if(r.biff>5)return $n(e,0,r);var n=e.read_shift(1);return 0===n?(e.l++,""):e.read_shift(n,r.biff<=4||!e.lens?"cpstr":"sbcs-cont")}function Zn(e,t,r){return r||(r=zt(3+2*e.length)),r.write_shift(2,e.length),r.write_shift(1,1),r.write_shift(31,e,"utf16le"),r}function Qn(e){var t=e.read_shift(4);return t>0?e.read_shift(t,"utf16le").replace(k,""):""}function Jn(e,t){t||(t=zt(6+2*e.length)),t.write_shift(4,1+e.length);for(var r=0;r-1?31:23;switch(n.charAt(0)){case"#":s=28;break;case".":s&=-3}t.write_shift(4,2),t.write_shift(4,s);var i=[8,6815827,6619237,4849780,83];for(r=0;r-1?n.slice(0,a):n;for(t.write_shift(4,2*(o.length+1)),r=0;r-1?n.slice(a+1):"",t)}else{for(i="03 03 00 00 00 00 00 00 c0 00 00 00 00 00 00 46".split(" "),r=0;r8?4:2;return[e.read_shift(n),e.read_shift(n,"i"),e.read_shift(n,"i")]}function sa(e){return[e.read_shift(2),Ar(e)]}function ia(e){var t=e.read_shift(2),r=e.read_shift(2);return{s:{c:e.read_shift(2),r:t},e:{c:e.read_shift(2),r:r}}}function oa(e,t){return t||(t=zt(8)),t.write_shift(2,e.s.r),t.write_shift(2,e.e.r),t.write_shift(2,e.s.c),t.write_shift(2,e.e.c),t}function la(e){var t=e.read_shift(2),r=e.read_shift(2);return{s:{c:e.read_shift(1),r:t},e:{c:e.read_shift(1),r:r}}}var ca=la;function fa(e){e.l+=4;var t=e.read_shift(2),r=e.read_shift(2),n=e.read_shift(2);return e.l+=12,[r,t,n]}function ha(e){e.l+=2,e.l+=e.read_shift(2)}var ua={0:ha,4:ha,5:ha,6:ha,7:function(e){return e.l+=4,e.cf=e.read_shift(2),{}},8:ha,9:ha,10:ha,11:ha,12:ha,13:function(e){var t={};return e.l+=4,e.l+=16,t.fSharedNote=e.read_shift(2),e.l+=4,t},14:ha,15:ha,16:ha,17:ha,18:ha,19:ha,20:ha,21:fa};function da(e,t){var r={BIFFVer:0,dt:0};switch(r.BIFFVer=e.read_shift(2),(t-=2)>=2&&(r.dt=e.read_shift(2),e.l-=2),r.BIFFVer){case 1536:case 1280:case 1024:case 768:case 512:case 2:case 7:break;default:if(t>6)throw new Error("Unexpected BIFF Ver "+r.BIFFVer)}return e.read_shift(t),r}function pa(e,t,r){var n=1536,a=16;switch(r.bookType){case"biff8":case"xla":break;case"biff5":n=1280,a=8;break;case"biff4":n=4,a=6;break;case"biff3":n=3,a=6;break;case"biff2":n=2,a=4;break;default:throw new Error("unsupported BIFF version")}var s=zt(a);return s.write_shift(2,n),s.write_shift(2,t),a>4&&s.write_shift(2,29282),a>6&&s.write_shift(2,1997),a>8&&(s.write_shift(2,49161),s.write_shift(2,1),s.write_shift(2,1798),s.write_shift(2,0)),s}function ga(e,t){var r=!t||t.biff>=8?2:1,n=zt(8+r*e.name.length);n.write_shift(4,e.pos),n.write_shift(1,e.hs||0),n.write_shift(1,e.dt),n.write_shift(1,e.name.length),t.biff>=8&&n.write_shift(1,1),n.write_shift(r*e.name.length,e.name,t.biff<8?"sbcs":"utf16le");var a=n.slice(0,n.l);return a.l=n.l,a}function ma(e,t,r){var n=0;r&&2==r.biff||(n=e.read_shift(2));var a=e.read_shift(2);return r&&2==r.biff&&(n=1-(a>>15),a&=32767),[{Unsynced:1&n,DyZero:(2&n)>>1,ExAsc:(4&n)>>2,ExDsc:(8&n)>>3},a]}function va(e,t,r,n){var a=r&&5==r.biff;n||(n=zt(a?3+t.length:5+2*t.length)),n.write_shift(2,e),n.write_shift(a?1:2,t.length),a||n.write_shift(1,1),n.write_shift((a?1:2)*t.length,t,a?"sbcs":"utf16le");var s=n.length>n.l?n.slice(0,n.l):n;return null==s.l&&(s.l=s.length),s}var ba=Yn;function wa(e,t,r){var n=e.l+t,a=8!=r.biff&&r.biff?2:4,s=e.read_shift(a),i=e.read_shift(a),o=e.read_shift(2),l=e.read_shift(2);return e.l=n,{s:{r:s,c:o},e:{r:i,c:l}}}function Ca(e,t,r,n){var a=r&&5==r.biff;n||(n=zt(a?16:20)),n.write_shift(2,0),e.style?(n.write_shift(2,e.numFmtId||0),n.write_shift(2,65524)):(n.write_shift(2,e.numFmtId||0),n.write_shift(2,t<<4));var s=0;return e.numFmtId>0&&a&&(s|=1024),n.write_shift(4,s),n.write_shift(4,0),a||n.write_shift(4,0),n.write_shift(2,0),n}function Ea(e,t,r){var n=ra(e);2!=r.biff&&9!=t||++e.l;var a=function(e){var t=e.read_shift(1);return 1===e.read_shift(1)?t:1===t}(e);return n.val=a,n.t=!0===a||!1===a?"b":"e",n}var Sa=function(e,t,r){return 0===t?"":Yn(e,0,r)};function _a(e,t,r){var n,a=e.read_shift(2),s={fBuiltIn:1&a,fWantAdvise:a>>>1&1,fWantPict:a>>>2&1,fOle:a>>>3&1,fOleLink:a>>>4&1,cf:a>>>5&1023,fIcon:a>>>15&1};return 14849===r.sbcch&&(n=function(e,t,r){e.l+=4,t-=4;var n=e.l+t,a=Xn(e,0,r),s=e.read_shift(2);if(s!==(n-=e.l))throw new Error("Malformed AddinUdf: padding = "+n+" != "+s);return e.l+=s,a}(e,t-2,r)),s.body=n||e.read_shift(t-2),"string"==typeof n&&(s.Name=n),s}var Aa=["_xlnm.Consolidate_Area","_xlnm.Auto_Open","_xlnm.Auto_Close","_xlnm.Extract","_xlnm.Database","_xlnm.Criteria","_xlnm.Print_Area","_xlnm.Print_Titles","_xlnm.Recorder","_xlnm.Data_Form","_xlnm.Auto_Activate","_xlnm.Auto_Deactivate","_xlnm.Sheet_Title","_xlnm._FilterDatabase"];function Ba(e,t,r){var n=e.l+t,a=e.read_shift(2),s=e.read_shift(1),i=e.read_shift(1),o=e.read_shift(r&&2==r.biff?1:2),l=0;(!r||r.biff>=5)&&(5!=r.biff&&(e.l+=2),l=e.read_shift(2),5==r.biff&&(e.l+=2),e.l+=4);var c=Kn(e,i,r);32&a&&(c=Aa[c.charCodeAt(0)]);var f=n-e.l;r&&2==r.biff&&--f;var h=n!=e.l&&0!==o&&f>0?function(e,t,r,n){var a,s=e.l+t,i=Gi(e,n,r);return s!==e.l&&(a=Xi(e,s-e.l,i,r)),[i,a]}(e,f,r,o):[];return{chKey:s,Name:c,itab:l,rgce:h}}function Ta(e,t,r){if(r.biff<8)return function(e,t,r){3==e[e.l+1]&&e[e.l]++;var n=Xn(e,0,r);return 3==n.charCodeAt(0)?n.slice(1):n}(e,0,r);for(var n=[],a=e.l+t,s=e.read_shift(r.biff>8?4:2);0!==s--;)n.push(aa(e,r.biff,r));if(e.l!=a)throw new Error("Bad ExternSheet: "+e.l+" != "+a);return n}function ka(e,t,r){var n=ca(e,6);switch(r.biff){case 2:e.l++,t-=7;break;case 3:case 4:e.l+=2,t-=8;break;default:e.l+=6,t-=12}return[n,Ji(e,t,r)]}var ya=[];function xa(e){var t=zt(24),r=Jt(e[0]);t.write_shift(2,r.r),t.write_shift(2,r.r),t.write_shift(2,r.c),t.write_shift(2,r.c);for(var n="d0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b".split(" "),a=0;a<16;++a)t.write_shift(1,parseInt(n[a],16));return T([t,qn(e[1])])}function Ia(e){var t=e[1].Tooltip,r=zt(10+2*(t.length+1));r.write_shift(2,2048);var n=Jt(e[0]);r.write_shift(2,n.r),r.write_shift(2,n.r),r.write_shift(2,n.c),r.write_shift(2,n.c);for(var a=0;a=12?4:2,a=e.read_shift(n),s=e.read_shift(n),i=e.read_shift(n),o=e.read_shift(n),l=e.read_shift(2);2==n&&(e.l+=2);var c={s:a,e:s,w:i,ixfe:o,flags:l};return(r.biff>=5||!r.biff)&&(c.level=l>>8&7),c}ya[8]=function(e,t){var r=e.l+t;e.l+=10;var n=e.read_shift(2);e.l+=4,e.l+=2,e.l+=2,e.l+=2,e.l+=4;var a=e.read_shift(1);return e.l+=a,e.l=r,{fmt:n}};var Oa=ra,Fa=Wn,Da=$n,Na=function(){var e={1:437,2:850,3:1252,4:1e4,100:852,101:866,102:865,103:861,104:895,105:620,106:737,107:857,120:950,121:949,122:936,123:932,124:874,125:1255,126:1256,150:10007,151:10029,152:10006,200:1250,201:1251,202:1254,203:1253,0:20127,8:865,9:437,10:850,11:437,13:437,14:850,15:437,16:850,17:437,18:850,19:932,20:850,21:437,22:850,23:865,24:437,25:437,26:850,27:437,28:863,29:850,31:852,34:852,35:852,36:860,37:850,38:866,55:850,64:852,77:936,78:949,79:950,80:874,87:1252,88:1252,89:1252,108:863,134:737,135:852,136:857,204:1257,255:16969},t=H({1:437,2:850,3:1252,4:1e4,100:852,101:866,102:865,103:861,104:895,105:620,106:737,107:857,120:950,121:949,122:936,123:932,124:874,125:1255,126:1256,150:10007,151:10029,152:10006,200:1250,201:1251,202:1254,203:1253,0:20127});function r(t,r){var n=r||{};return n.dateNF||(n.dateNF="yyyymmdd"),ir(function(t,r){var n=[],a=C(1);switch(r.type){case"base64":a=S(m.decode(t));break;case"binary":a=S(t);break;case"buffer":case"array":a=t}Mt(a,0);var s=a.read_shift(1),i=!!(136&s),o=!1,l=!1;switch(s){case 2:case 3:case 131:case 139:case 245:break;case 48:case 49:o=!0,i=!0;break;case 140:l=!0;break;default:throw new Error("DBF Unsupported Version: "+s.toString(16))}var c=0,f=521;2==s&&(c=a.read_shift(2)),a.l+=3,2!=s&&(c=a.read_shift(4)),c>1048576&&(c=1e6),2!=s&&(f=a.read_shift(2));var h=a.read_shift(2),u=r.codepage||1252;2!=s&&(a.l+=16,a.read_shift(1),0!==a[a.l]&&(u=e[a[a.l]]),a.l+=1,a.l+=2),l&&(a.l+=36);for(var d=[],p={},g=Math.min(a.length,2==s?521:f-10-(o?264:0)),v=l?32:11;a.l0;)if(42!==a[a.l])for(++a.l,n[++b]=[],w=0,w=0;w!=d.length;++w){var E=a.slice(a.l,a.l+d[w].len);a.l+=d[w].len,Mt(E,0);var _=cptable.utils.decode(u,E);switch(d[w].type){case"C":_.trim().length&&(n[b][w]=_.replace(/\s+$/,""));break;case"D":8===_.length?n[b][w]=new Date(+_.slice(0,4),+_.slice(4,6)-1,+_.slice(6,8)):n[b][w]=_;break;case"F":n[b][w]=parseFloat(_.trim());break;case"+":case"I":n[b][w]=l?2147483648^E.read_shift(-4,"i"):E.read_shift(4,"i");break;case"L":switch(_.trim().toUpperCase()){case"Y":case"T":n[b][w]=!0;break;case"N":case"F":n[b][w]=!1;break;case"":case"?":break;default:throw new Error("DBF Unrecognized L:|"+_+"|")}break;case"M":if(!i)throw new Error("DBF Unexpected MEMO for type "+s.toString(16));n[b][w]="##MEMO##"+(l?parseInt(_.trim(),10):E.read_shift(4));break;case"N":(_=_.replace(/\u0000/g,"").trim())&&"."!=_&&(n[b][w]=+_||0);break;case"@":n[b][w]=new Date(E.read_shift(-8,"f")-621356832e5);break;case"T":n[b][w]=new Date(864e5*(E.read_shift(4)-2440588)+E.read_shift(4));break;case"Y":n[b][w]=E.read_shift(4,"i")/1e4;break;case"O":n[b][w]=-E.read_shift(-8,"f");break;case"B":if(o&&8==d[w].len){n[b][w]=E.read_shift(8,"f");break}case"G":case"P":E.l+=d[w].len;break;case"0":if("_NullFlags"===d[w].name)break;default:throw new Error("DBF Unsupported data type "+d[w].type)}}else a.l+=h;if(2!=s&&a.l=0&&c(+s.codepage),"string"==s.type)throw new Error("Cannot write DBF to JS string");var i=Wt(),o=Kc(e,{header:1,raw:!0,cellDates:!0}),l=o[0],f=o.slice(1),h=0,u=0,d=0,p=1;for(h=0;h":190,"?":191,"{":223},t=new RegExp("N("+U(e).join("|").replace(/\|\|\|/,"|\\||").replace(/([?()+])/g,"\\$1")+"|\\|)","gm"),r=function(t,r){var n=e[r];return"number"==typeof n?p(n):n},n=function(e,t,r){var n=t.charCodeAt(0)-32<<4|r.charCodeAt(0)-48;return 59==n?e:p(n)};function a(e,a){var s,i=e.split(/[\n\r]+/),o=-1,l=-1,f=0,h=0,u=[],d=[],p=null,g={},m=[],v=[],b=[],w=0;for(+a.codepage>=0&&c(+a.codepage);f!==i.length;++f){w=0;var C,E=i[f].trim().replace(/\x1B([\x20-\x2F])([\x30-\x3F])/g,n).replace(t,r),S=E.replace(/;;/g,"\0").split(";").map(function(e){return e.replace(/\u0000/g,";")}),_=S[0];if(E.length>0)switch(_){case"ID":case"E":case"B":case"O":case"W":break;case"P":"P"==S[1].charAt(0)&&d.push(E.slice(3).replace(/;;/g,";"));break;case"C":var A=!1,B=!1,T=!1,k=!1,y=-1,I=-1;for(h=1;h-1&&u[y][I];if(!O||!O[1])throw new Error("SYLK shared formula cannot find base");u[o][l][1]=pi(O[1],{r:o-y,c:l-I})}break;case"F":var F=0;for(h=1;h0?(m[o].hpt=w,m[o].hpx=Ts(w)):0===w&&(m[o].hidden=!0);break;default:if(a&&a.WTF)throw new Error("SYLK bad record "+E)}F<1&&(p=null);break;default:if(a&&a.WTF)throw new Error("SYLK bad record "+E)}}return m.length>0&&(g["!rows"]=m),v.length>0&&(g["!cols"]=v),a&&a.sheetRows&&(u=u.slice(0,a.sheetRows)),[u,g]}function s(e,t){var r=function(e,t){switch(t.type){case"base64":return a(m.decode(e),t);case"binary":return a(e,t);case"buffer":return a(v&&Buffer.isBuffer(e)?e.toString("binary"):A(e),t);case"array":return a(ee(e),t)}throw new Error("Unrecognized type "+t.type)}(e,t),n=r[0],s=r[1],i=ir(n,t);return U(s).forEach(function(e){i[e]=s[e]}),i}function i(e,t,r,n){var a="C;Y"+(r+1)+";X"+(n+1)+";K";switch(e.t){case"n":a+=e.v||0,e.f&&!e.F&&(a+=";E"+di(e.f,{r:r,c:n}));break;case"b":a+=e.v?"TRUE":"FALSE";break;case"e":a+=e.w||e.v;break;case"d":a+='"'+(e.w||e.v)+'"';break;case"s":a+='"'+e.v.replace(/"/g,"")+'"'}return a}return e["|"]=254,{to_workbook:function(e,t){return ar(s(e,t),t)},to_sheet:s,from_sheet:function(e,t){var r,n,a=["ID;PWXL;N;E"],s=[],o=rr(e["!ref"]),l=Array.isArray(e),c="\r\n";a.push("P;PGeneral"),a.push("F;P0;DG0G8;M255"),e["!cols"]&&(n=a,e["!cols"].forEach(function(e,t){var r="F;W"+(t+1)+" "+(t+1)+" ";e.hidden?r+="0":("number"!=typeof e.width||e.wpx||(e.wpx=bs(e.width)),"number"!=typeof e.wpx||e.wch||(e.wch=ws(e.wpx)),"number"==typeof e.wch&&(r+=Math.round(e.wch)))," "!=r.charAt(r.length-1)&&n.push(r)})),e["!rows"]&&function(e,t){t.forEach(function(t,r){var n="F;";t.hidden?n+="M0;":t.hpt?n+="M"+20*t.hpt+";":t.hpx&&(n+="M"+20*Bs(t.hpx)+";"),n.length>2&&e.push(n+"R"+(r+1))})}(a,e["!rows"]),a.push("B;Y"+(o.e.r-o.s.r+1)+";X"+(o.e.c-o.s.c+1)+";D"+[o.s.c,o.s.r,o.e.c,o.e.r].join(" "));for(var f=o.s.r;f<=o.e.r;++f)for(var h=o.s.c;h<=o.e.c;++h){var u=qt({r:f,c:h});(r=l?(e[f]||[])[h]:e[u])&&(null!=r.v||r.f&&!r.F)&&s.push(i(r,0,f,h))}return a.join(c)+c+s.join(c)+c+"E"+c}}}(),La=function(){function e(e,t){for(var r=e.split("\n"),n=-1,a=-1,s=0,i=[];s!==r.length;++s)if("BOT"!==r[s].trim()){if(!(n<0)){for(var o=r[s].trim().split(","),l=o[0],c=o[1],f=r[++s]||"";1&(f.match(/["]/g)||[]).length&&s=0?o=c:a=c}}),l>=0&&-1==o&&a>=0&&(o=a,a=-1);var c=(""+(n>=0?n:(new Date).getFullYear())).slice(-4)+"-"+("00"+(a>=1?a:1)).slice(-2)+"-"+("00"+(s>=1?s:1)).slice(-2);7==c.length&&(c="0"+c),8==c.length&&(c="20"+c);var f=("00"+(i>=0?i:0)).slice(-2)+":"+("00"+(o>=0?o:0)).slice(-2)+":"+("00"+(l>=0?l:0)).slice(-2);return-1==i&&-1==o&&-1==l?c:-1==n&&-1==a&&-1==s?f:c+"T"+f}(0,r.dateNF,t.match(b)||[]),a=1),r.cellDates?(n.t="d",n.v=q(t,a)):(n.t="n",n.v=X(q(t,a))),!1!==r.cellText&&(n.w=x.format(n.z,n.v instanceof Date?X(n.v):n.v)),r.cellNF||delete n.z}else n.t="s",n.v=t;else n.t="n",!1!==r.cellText&&(n.w=t),n.v=c;if("z"==n.t||(r.dense?(s[o]||(s[o]=[]),s[o][l]=n):s[qt({c:l,r:o})]=n),f=h+1,g=e.charCodeAt(f),i.e.c0&&w(),s["!ref"]=tr(i),s}function s(t,r){var n="",s="string"==r.type?[0,0,0,0]:Nc(t,r);switch(r.type){case"base64":n=m.decode(t);break;case"binary":case"string":n=t;break;case"buffer":n=65001==r.codepage?t.toString("utf8"):r.codepage&&"undefined"!=typeof cptable?cptable.utils.decode(r.codepage,t):v&&Buffer.isBuffer(t)?t.toString("binary"):A(t);break;case"array":n=ee(t);break;default:throw new Error("Unrecognized type "+r.type)}return 239==s[0]&&187==s[1]&&191==s[2]?n=Pe(n.slice(3)):"string"!=r.type&&65001==r.codepage?n=Pe(n):"binary"==r.type&&"undefined"!=typeof cptable&&r.codepage&&(n=cptable.utils.decode(r.codepage,cptable.utils.encode(28591,n))),"socialcalc:version:"==n.slice(0,19)?Ma.to_sheet("string"==r.type?n:Pe(n),r):function(t,r){return r&&r.PRN?r.FS||"sep="==t.slice(0,4)||t.indexOf("\t")>=0||t.indexOf(",")>=0||t.indexOf(";")>=0?a(t,r):ir(function(t,r){var n=r||{},a=[];if(!t||0===t.length)return a;for(var s=t.split(/[\r\n]/),i=s.length-1;i>=0&&0===s[i].length;)--i;for(var o=10,l=0,c=0;c<=i;++c)-1==(l=s[c].indexOf(" "))?l=s[c].length:l++,o=Math.max(o,l);for(c=0;c<=i;++c){a[c]=[];var f=0;for(e(s[c].slice(0,o).trim(),a,c,f,n),f=1;f<=(s[c].length-o)/10+1;++f)e(s[c].slice(o+10*(f-1),o+10*f).trim(),a,c,f,n)}return n.sheetRows&&(a=a.slice(0,n.sheetRows)),a}(t,r),r):a(t,r)}(n,r)}return{to_workbook:function(e,t){return ar(s(e,t),t)},to_sheet:s,from_sheet:function(e){for(var t,r=[],n=rr(e["!ref"]),a=Array.isArray(e),s=n.s.r;s<=n.e.r;++s){for(var i=[],o=n.s.c;o<=n.e.c;++o){var l=qt({r:s,c:o});if((t=a?(e[s]||[])[o]:e[l])&&null!=t.v){for(var c=(t.w||(nr(t),t.w)||"").slice(0,10);c.length<10;)c+=" ";i.push(c+(0===o?" ":""))}else i.push(" ")}r.push(i.join(""))}return r.join("\n")}}}(),za=function(){function e(e,t,r){if(e){Mt(e,e.l||0);for(var n=r.Enum||w;e.l=16&&5==t[14]&&108===t[15])throw new Error("Unsupported Works 3 for Mac file");if(2==t[2])n.Enum=w,e(t,function(e,t,r){switch(r){case 0:n.vers=e,e>=4096&&(n.qpro=!0);break;case 6:h=e;break;case 204:e&&(i=e);break;case 222:i=e;break;case 15:case 51:n.qpro||(e[1].v=e[1].v.slice(1));case 13:case 14:case 16:14==r&&!(112&~e[2])&&(15&e[2])>1&&(15&e[2])<15&&(e[1].z=n.dateNF||x._table[14],n.cellDates&&(e[1].t="d",e[1].v=Y(e[1].v))),n.qpro&&e[3]>o&&(a["!ref"]=tr(h),l[s]=a,c.push(s),a=n.dense?[]:{},h={s:{r:0,c:0},e:{r:0,c:0}},o=e[3],s=i||"Sheet"+(o+1),i="");var f=n.dense?(a[e[0].r]||[])[e[0].c]:a[qt(e[0])];if(f){f.t=e[1].t,f.v=e[1].v,null!=e[1].z&&(f.z=e[1].z),null!=e[1].f&&(f.f=e[1].f);break}n.dense?(a[e[0].r]||(a[e[0].r]=[]),a[e[0].r][e[0].c]=e[1]):a[qt(e[0])]=e[1]}},n);else{if(26!=t[2]&&14!=t[2])throw new Error("Unrecognized LOTUS BOF "+t[2]);n.Enum=C,14==t[2]&&(n.qpro=!0,t.l=0),e(t,function(e,t,r){switch(r){case 204:s=e;break;case 22:e[1].v=e[1].v.slice(1);case 23:case 24:case 25:case 37:case 39:case 40:if(e[3]>o&&(a["!ref"]=tr(h),l[s]=a,c.push(s),a=n.dense?[]:{},h={s:{r:0,c:0},e:{r:0,c:0}},o=e[3],s="Sheet"+(o+1)),u>0&&e[0].r>=u)break;n.dense?(a[e[0].r]||(a[e[0].r]=[]),a[e[0].r][e[0].c]=e[1]):a[qt(e[0])]=e[1],h.e.c=128?95:s)}return n.write_shift(1,0),n}function s(e,t,r){var n=zt(7);return n.write_shift(1,255),n.write_shift(2,t),n.write_shift(2,e),n.write_shift(2,r,"i"),n}function i(e,t,r){var n=zt(13);return n.write_shift(1,255),n.write_shift(2,t),n.write_shift(2,e),n.write_shift(8,r,"f"),n}function o(e,t,r){var n=32768&t;return t=(n?e:0)+((t&=-32769)>=8192?t-16384:t),(n?"":"$")+(r?Qt(t):Yt(t))}var l={51:["FALSE",0],52:["TRUE",0],70:["LEN",1],80:["SUM",69],81:["AVERAGEA",69],82:["COUNTA",69],83:["MINA",69],84:["MAXA",69],111:["T",1]},f=["","","","","","","","","","+","-","*","/","^","=","<>","<=",">=","<",">","","","","","&","","","","","","",""];function h(e){var t=[{c:0,r:0},{t:"n",v:0},0];return t[0].r=e.read_shift(2),t[3]=e[e.l++],t[0].c=e[e.l++],t}function u(e,t,r,n){var a=zt(6+n.length);a.write_shift(2,e),a.write_shift(1,r),a.write_shift(1,t),a.write_shift(1,39);for(var s=0;s=128?95:i)}return a.write_shift(1,0),a}function d(e,t){var r=h(e),n=e.read_shift(4),a=e.read_shift(4),s=e.read_shift(2);if(65535==s)return 0===n&&3221225472===a?(r[1].t="e",r[1].v=15):0===n&&3489660928===a?(r[1].t="e",r[1].v=42):r[1].v=0,r;var i=32768&s;return s=(32767&s)-16446,r[1].v=(1-2*i)*(a*Math.pow(2,s+32)+n*Math.pow(2,s)),r}function p(e,t,r,n){var a=zt(14);if(a.write_shift(2,e),a.write_shift(1,r),a.write_shift(1,t),0==n)return a.write_shift(4,0),a.write_shift(4,0),a.write_shift(2,65535),a;var s,i=0,o=0,l=0;return n<0&&(i=1,n=-n),o=0|Math.log2(n),2147483648&(l=(n/=Math.pow(2,o-31))>>>0)||(++o,l=(n/=2)>>>0),n-=l,l|=2147483648,l>>>=0,s=(n*=Math.pow(2,32))>>>0,a.write_shift(4,s),a.write_shift(4,l),o+=16383+(i?32768:0),a.write_shift(2,o),a}function g(e,t){var r=h(e),n=e.read_shift(8,"f");return r[1].v=n,r}function v(e,t){return 0==e[e.l+t-1]?e.read_shift(t,"cstr"):""}function b(e,t){var r=zt(5+e.length);r.write_shift(2,14e3),r.write_shift(2,t);for(var n=0;n127?95:a}return r[r.l++]=0,r}var w={0:{n:"BOF",f:zn},1:{n:"EOF"},2:{n:"CALCMODE"},3:{n:"CALCORDER"},4:{n:"SPLIT"},5:{n:"SYNC"},6:{n:"RANGE",f:function(e,t,r){var n={s:{c:0,r:0},e:{c:0,r:0}};return 8==t&&r.qpro?(n.s.c=e.read_shift(1),e.l++,n.s.r=e.read_shift(2),n.e.c=e.read_shift(1),e.l++,n.e.r=e.read_shift(2),n):(n.s.c=e.read_shift(2),n.s.r=e.read_shift(2),12==t&&r.qpro&&(e.l+=2),n.e.c=e.read_shift(2),n.e.r=e.read_shift(2),12==t&&r.qpro&&(e.l+=2),65535==n.s.c&&(n.s.c=n.e.c=n.s.r=n.e.r=0),n)}},7:{n:"WINDOW1"},8:{n:"COLW1"},9:{n:"WINTWO"},10:{n:"COLW2"},11:{n:"NAME"},12:{n:"BLANK"},13:{n:"INTEGER",f:function(e,t,n){var a=r(e,0,n);return a[1].v=e.read_shift(2,"i"),a}},14:{n:"NUMBER",f:function(e,t,n){var a=r(e,0,n);return a[1].v=e.read_shift(8,"f"),a}},15:{n:"LABEL",f:n},16:{n:"FORMULA",f:function(e,t,n){var a=e.l+t,s=r(e,0,n);if(s[1].v=e.read_shift(8,"f"),n.qpro)e.l=a;else{var i=e.read_shift(2);!function(e,t){Mt(e,0);for(var r=[],n=0,a="",s="",i="",c="";e.lr.length)return void console.error("WK1 bad formula parse 0x"+h.toString(16)+":|"+r.join("|")+"|");var g=r.slice(-n);r.length-=n,r.push(l[h][0]+"("+g.join(",")+")")}}}1==r.length?t[1].f=""+r[0]:console.error("WK1 bad formula parse |"+r.join("|")+"|")}(e.slice(e.l,e.l+i),s),e.l+=i}return s}},24:{n:"TABLE"},25:{n:"ORANGE"},26:{n:"PRANGE"},27:{n:"SRANGE"},28:{n:"FRANGE"},29:{n:"KRANGE1"},32:{n:"HRANGE"},35:{n:"KRANGE2"},36:{n:"PROTEC"},37:{n:"FOOTER"},38:{n:"HEADER"},39:{n:"SETUP"},40:{n:"MARGINS"},41:{n:"LABELFMT"},42:{n:"TITLES"},43:{n:"SHEETJS"},45:{n:"GRAPH"},46:{n:"NGRAPH"},47:{n:"CALCCOUNT"},48:{n:"UNFORMATTED"},49:{n:"CURSORW12"},50:{n:"WINDOW"},51:{n:"STRING",f:n},55:{n:"PASSWORD"},56:{n:"LOCKED"},60:{n:"QUERY"},61:{n:"QUERYNAME"},62:{n:"PRINT"},63:{n:"PRINTNAME"},64:{n:"GRAPH2"},65:{n:"GRAPHNAME"},66:{n:"ZOOM"},67:{n:"SYMSPLIT"},68:{n:"NSROWS"},69:{n:"NSCOLS"},70:{n:"RULER"},71:{n:"NNAME"},72:{n:"ACOMM"},73:{n:"AMACRO"},74:{n:"PARSE"},102:{n:"PRANGES??"},103:{n:"RRANGES??"},104:{n:"FNAME??"},105:{n:"MRANGES??"},204:{n:"SHEETNAMECS",f:v},222:{n:"SHEETNAMELP",f:function(e,t){var r=e[e.l++];r>t-1&&(r=t-1);for(var n="";n.length>1;if(1&r[1].v)switch(7&n){case 0:n=5e3*(n>>3);break;case 1:n=500*(n>>3);break;case 2:n=(n>>3)/20;break;case 3:n=(n>>3)/200;break;case 4:n=(n>>3)/2e3;break;case 5:n=(n>>3)/2e4;break;case 6:n=(n>>3)/16;break;case 7:n=(n>>3)/64}return r[1].v=n,r}},25:{n:"FORMULA19",f:function(e,t){var r=d(e);return e.l+=t-14,r}},26:{n:"FORMULA1A"},27:{n:"XFORMAT",f:function(e,t){for(var r={},n=e.l+t;e.l>6,r}},38:{n:"??"},39:{n:"NUMBER27",f:g},40:{n:"FORMULA28",f:function(e,t){var r=g(e);return e.l+=t-10,r}},142:{n:"??"},147:{n:"??"},150:{n:"??"},151:{n:"??"},152:{n:"??"},153:{n:"??"},154:{n:"??"},155:{n:"??"},156:{n:"??"},163:{n:"??"},174:{n:"??"},175:{n:"??"},176:{n:"??"},177:{n:"??"},184:{n:"??"},185:{n:"??"},186:{n:"??"},187:{n:"??"},188:{n:"??"},195:{n:"??"},201:{n:"??"},204:{n:"SHEETNAMECS",f:v},205:{n:"??"},206:{n:"??"},207:{n:"??"},208:{n:"??"},256:{n:"??"},259:{n:"??"},260:{n:"??"},261:{n:"??"},262:{n:"??"},263:{n:"??"},265:{n:"??"},266:{n:"??"},267:{n:"??"},268:{n:"??"},270:{n:"??"},271:{n:"??"},384:{n:"??"},389:{n:"??"},390:{n:"??"},393:{n:"??"},396:{n:"??"},512:{n:"??"},514:{n:"??"},513:{n:"??"},516:{n:"??"},517:{n:"??"},640:{n:"??"},641:{n:"??"},642:{n:"??"},643:{n:"??"},644:{n:"??"},645:{n:"??"},646:{n:"??"},647:{n:"??"},648:{n:"??"},658:{n:"??"},659:{n:"??"},660:{n:"??"},661:{n:"??"},662:{n:"??"},665:{n:"??"},666:{n:"??"},768:{n:"??"},772:{n:"??"},1537:{n:"SHEETINFOQP",f:function(e,t,r){if(r.qpro&&!(t<21)){var n=e.read_shift(1);return e.l+=17,e.read_shift(1),e.l+=2,[n,e.read_shift(t-21,"cstr")]}}},1600:{n:"??"},1602:{n:"??"},1793:{n:"??"},1794:{n:"??"},1795:{n:"??"},1796:{n:"??"},1920:{n:"??"},2048:{n:"??"},2049:{n:"??"},2052:{n:"??"},2688:{n:"??"},10998:{n:"??"},12849:{n:"??"},28233:{n:"??"},28484:{n:"??"},65535:{n:""}};return{sheet_to_wk1:function(e,t){var r=t||{};if(+r.codepage>=0&&c(+r.codepage),"string"==r.type)throw new Error("Cannot write WK1 to JS string");var n,o=Wt(),l=rr(e["!ref"]),f=Array.isArray(e),h=[];Ql(o,0,((n=zt(2)).write_shift(2,1030),n)),Ql(o,6,function(e){var t=zt(8);return t.write_shift(2,e.s.c),t.write_shift(2,e.s.r),t.write_shift(2,e.e.c),t.write_shift(2,e.e.r),t}(l));for(var u=Math.min(l.e.r,8191),d=l.s.r;d<=u;++d)for(var p=Yt(d),g=l.s.c;g<=l.e.c;++g){d===l.s.r&&(h[g]=Qt(g));var m=h[g]+p,v=f?(e[d]||[])[g]:e[m];v&&"z"!=v.t&&("n"==v.t?(0|v.v)==v.v&&v.v>=-32768&&v.v<=32767?Ql(o,13,s(d,g,v.v)):Ql(o,14,i(d,g,v.v)):Ql(o,15,a(d,g,nr(v).slice(0,239))))}return Ql(o,1),o.end()},book_to_wk3:function(e,t){var r=t||{};if(+r.codepage>=0&&c(+r.codepage),"string"==r.type)throw new Error("Cannot write WK3 to JS string");var n=Wt();Ql(n,0,function(e){var t=zt(26);t.write_shift(2,4096),t.write_shift(2,4),t.write_shift(4,0);for(var r=0,n=0,a=0,s=0;s8191&&(r=8191),t.write_shift(2,r),t.write_shift(1,a),t.write_shift(1,n),t.write_shift(2,0),t.write_shift(2,0),t.write_shift(1,1),t.write_shift(1,2),t.write_shift(4,0),t.write_shift(4,0),t}(e));for(var a=0,s=0;a":case"":t.shadow=1;break;case"":break;case"":case"":t.outline=1;break;case"":break;case"":case"":t.strike=1;break;case"":break;case"":case"":t.u=1;break;case"":break;case"":case"":t.b=1;break;case"":break;case"":case"":t.i=1;break;case"":break;case"":case"
":break;case"":a=!1;break;default:if(47!==s[0].charCodeAt(1)&&!a)throw new Error("Unrecognized rich format "+s[0])}}return t}(s[1])),a}var n=/<(?:\w+:)?r>/g,a=/<\/(?:\w+:)?r>/;return function(e){return e.replace(n,"").split(a).map(r).filter(function(e){return e.v})}}(),Wa=function(){var e=/(\r\n|\n)/g;function t(t){var r=[[],t.v,[]];return t.v?(t.s&&function(e,t,r){var n=[];e.u&&n.push("text-decoration: underline;"),e.uval&&n.push("text-underline-style:"+e.uval+";"),e.sz&&n.push("font-size:"+e.sz+"pt;"),e.outline&&n.push("text-effect: outline;"),e.shadow&&n.push("text-shadow: auto;"),t.push(''),e.b&&(t.push(""),r.push("")),e.i&&(t.push(""),r.push("")),e.strike&&(t.push(""),r.push(""));var a=e.valign||"";"superscript"==a||"super"==a?a="sup":"subscript"==a&&(a="sub"),""!=a&&(t.push("<"+a+">"),r.push("")),r.push("")}(t.s,r[0],r[2]),r[0].join("")+r[1].replace(e,"
")+r[2].join("")):""}return function(e){return e.map(t).join("")}}(),Va=/<(?:\w+:)?t[^>]*>([^<]*)<\/(?:\w+:)?t>/g,Xa=/<(?:\w+:)?r>/,Ga=/<(?:\w+:)?rPh.*?>([\s\S]*?)<\/(?:\w+:)?rPh>/g;function ja(e,t){var r=!t||t.cellHTML,n={};return e?(e.match(/^\s*<(?:\w+:)?t[^>]*>/)?(n.t=ke(Pe(e.slice(e.indexOf(">")+1).split(/<\/(?:\w+:)?t>/)[0]||"")),n.r=Pe(e),r&&(n.h=Fe(n.t))):e.match(Xa)&&(n.r=Pe(e),n.t=ke(Pe((e.replace(Ga,"").match(Va)||[]).join("").replace(be,""))),r&&(n.h=Wa(Ha(n.r)))),n):{t:""}}var Ka=/<(?:\w+:)?sst([^>]*)>([\s\S]*)<\/(?:\w+:)?sst>/,$a=/<(?:\w+:)?(?:si|sstItem)>/g,Ya=/<\/(?:\w+:)?(?:si|sstItem)>/;Zr.SST="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings";var Za=/^\s|\s$|[\t\n\r]/;function Qa(e,t){if(!t.bookSST)return"";var r=[me];r[r.length]=qe("sst",null,{xmlns:nt.main[0],count:e.Count,uniqueCount:e.Unique});for(var n=0;n!=e.length;++n)if(null!=e[n]){var a=e[n],s="";a.r?s+=a.r:(s+=""),s+="",r[r.length]=s}return r.length>2&&(r[r.length]="",r[1]=r[1].replace("/>",">")),r.join("")}var Ja=function(e,t){var r=!1;return null==t&&(r=!0,t=zt(15+4*e.t.length)),t.write_shift(1,0),cr(e.t,t),r?t.slice(0,t.l):t};function qa(e){var t=Wt();Vt(t,"BrtBeginSst",function(e,t){return t||(t=zt(8)),t.write_shift(4,e.Count),t.write_shift(4,e.Unique),t}(e));for(var r=0;r=4&&(e.l+=t-4),r}function rs(e){for(var t=e.read_shift(4),r=e.l+t-4,n={},a=e.read_shift(4),s=[];a-- >0;)s.push({t:e.read_shift(4),v:e.read_shift(0,"lpp4")});if(n.name=e.read_shift(0,"lpp4"),n.comps=s,e.l!=r)throw new Error("Bad DataSpaceMapEntry: "+e.l+" != "+r);return n}function ns(e,t){var r=e.l+t,n={};n.Flags=63&e.read_shift(4),e.l+=4,n.AlgID=e.read_shift(4);var a=!1;switch(n.AlgID){case 26126:case 26127:case 26128:a=36==n.Flags;break;case 26625:a=4==n.Flags;break;case 0:a=16==n.Flags||4==n.Flags||36==n.Flags;break;default:throw"Unrecognized encryption algorithm: "+n.AlgID}if(!a)throw new Error("Encryption Flags/AlgID mismatch");return n.AlgIDHash=e.read_shift(4),n.KeySize=e.read_shift(4),n.ProviderType=e.read_shift(4),e.l+=8,n.CSPName=e.read_shift(r-e.l>>1,"utf16le"),e.l=r,n}function as(e,t){var r={},n=e.l+t;return e.l+=4,r.Salt=e.slice(e.l,e.l+16),e.l+=16,r.Verifier=e.slice(e.l,e.l+16),e.l+=16,e.read_shift(4),r.VerifierHash=e.slice(e.l,n),e.l=n,r}function ss(e){if(36!=(63&e.read_shift(4)))throw new Error("EncryptionInfo mismatch");var t=e.read_shift(4);return{t:"Std",h:ns(e,t),v:as(e,e.length-e.l)}}function is(){throw new Error("File is password-protected: ECMA-376 Extensible")}function os(e){var t=["saltSize","blockSize","keyBits","hashSize","cipherAlgorithm","cipherChaining","hashAlgorithm","saltValue"];e.l+=4;var r=e.read_shift(e.length-e.l,"utf8"),n={};return r.replace(be,function(e){var r=Ee(e);switch(Se(r[0])){case"":case"":case"":break;case"":case"=0;--r)n=((16384&n?1:0)|n<<1&32767)^t[r];return 52811^n}var cs,fs,hs,us,ds=(cs=[187,255,255,186,255,255,185,128,0,190,15,0,191,15,0],fs=[57840,7439,52380,33984,4364,3600,61902,12606,6258,57657,54287,34041,10252,43370,20163],hs=[44796,19929,39858,10053,20106,40212,10761,31585,63170,64933,60267,50935,40399,11199,17763,35526,1453,2906,5812,11624,23248,885,1770,3540,7080,14160,28320,56640,55369,41139,20807,41614,21821,43642,17621,28485,56970,44341,19019,38038,14605,29210,60195,50791,40175,10751,21502,43004,24537,18387,36774,3949,7898,15796,31592,63184,47201,24803,49606,37805,14203,28406,56812,17824,35648,1697,3394,6788,13576,27152,43601,17539,35078,557,1114,2228,4456,30388,60776,51953,34243,7079,14158,28316,14128,28256,56512,43425,17251,34502,7597,13105,26210,52420,35241,883,1766,3532,4129,8258,16516,33032,4657,9314,18628],us=function(e,t){return 255&((r=e^t)/2|128*r);var r},function(e){for(var t,r,n,a=es(e),s=function(e){for(var t=fs[e.length-1],r=104,n=e.length-1;n>=0;--n)for(var a=e[n],s=0;7!=s;++s)64&a&&(t^=hs[r]),a*=2,--r;return t}(a),i=a.length,o=C(16),l=0;16!=l;++l)o[l]=0;for(1&~i||(t=s>>8,o[i]=us(cs[0],t),--i,t=255&s,r=a[a.length-1],o[i]=us(r,t));i>0;)t=s>>8,o[--i]=us(a[i],t),t=255&s,o[--i]=us(a[i],t);for(i=15,n=15-a.length;n>0;)t=s>>8,o[i]=us(cs[n],t),--n,t=255&s,o[--i]=us(a[i],t),--i,--n;return o});var ps=function(){function e(e,r){switch(r.type){case"base64":return t(m.decode(e),r);case"binary":return t(e,r);case"buffer":return t(v&&Buffer.isBuffer(e)?e.toString("binary"):A(e),r);case"array":return t(ee(e),r)}throw new Error("Unrecognized type "+r.type)}function t(e,t){var r=(t||{}).dense?[]:{},n=e.match(/\\trowd.*?\\row\b/g);if(!n.length)throw new Error("RTF missing table");var a={s:{c:0,r:0},e:{c:0,r:n.length-1}};return n.forEach(function(e,t){Array.isArray(r)&&(r[t]=[]);for(var n,s=/\\\w+\b/g,i=0,o=-1;n=s.exec(e);){if("\\cell"===n[0]){var l=e.slice(i,s.lastIndex-n[0].length);if(" "==l[0]&&(l=l.slice(1)),++o,l.length){var c={v:l,t:"s"};Array.isArray(r)?r[t][o]=c:r[qt({r:t,c:o})]=c}}i=s.lastIndex}o>a.e.c&&(a.e.c=o)}),r["!ref"]=tr(a),r}return{to_workbook:function(t,r){return ar(e(t,r),r)},to_sheet:e,from_sheet:function(e){for(var t,r=["{\\rtf1\\ansi"],n=rr(e["!ref"]),a=Array.isArray(e),s=n.s.r;s<=n.e.r;++s){r.push("\\trowd\\trautofit1");for(var i=n.s.c;i<=n.e.c;++i)r.push("\\cellx"+(i+1));for(r.push("\\pard\\intbl"),i=n.s.c;i<=n.e.c;++i){var o=qt({r:s,c:i});(t=a?(e[s]||[])[i]:e[o])&&(null!=t.v||t.f&&!t.F)&&(r.push(" "+(t.w||(nr(t),t.w))),r.push("\\cell"))}r.push("\\pard\\intbl\\row")}return r.join("")+"}"}}}();function gs(e){for(var t=0,r=1;3!=t;++t)r=256*r+(e[t]>255?255:e[t]<0?0:e[t]);return r.toString(16).toUpperCase().slice(1)}function ms(e,t){if(0===t)return e;var r=function(e){var t=e[0]/255,r=e[1]/255,n=e[2]/255,a=Math.max(t,r,n),s=Math.min(t,r,n),i=a-s;if(0===i)return[0,0,t];var o,l=0,c=a+s;switch(o=i/(c>1?2-c:c),a){case t:l=((r-n)/i+6)%6;break;case r:l=(n-t)/i+2;break;case n:l=(t-r)/i+4}return[l/6,o,c/2]}(function(e){var t=e.slice("#"===e[0]?1:0).slice(0,6);return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]}(e));return r[2]=t<0?r[2]*(1+t):1-(1-r[2])*(1-t),gs(function(e){var t,r=e[0],n=e[1],a=e[2],s=2*n*(a<.5?a:1-a),i=a-s/2,o=[i,i,i],l=6*r;if(0!==n)switch(0|l){case 0:case 6:t=s*l,o[0]+=s,o[1]+=t;break;case 1:t=s*(2-l),o[0]+=t,o[1]+=s;break;case 2:t=s*(l-2),o[1]+=s,o[2]+=t;break;case 3:t=s*(4-l),o[1]+=t,o[2]+=s;break;case 4:t=s*(l-4),o[2]+=s,o[0]+=t;break;case 5:t=s*(6-l),o[2]+=t,o[0]+=s}for(var c=0;3!=c;++c)o[c]=Math.round(255*o[c]);return o}(r))}var vs=6;function bs(e){return Math.floor((e+Math.round(128/vs)/256)*vs)}function ws(e){return Math.floor((e-5)/vs*100+.5)/100}function Cs(e){return Math.round((e*vs+5)/vs*256)/256}function Es(e){return Cs(ws(bs(e)))}function Ss(e){var t=Math.abs(e-Es(e)),r=vs;if(t>.005)for(vs=1;vs<15;++vs)Math.abs(e-Es(e))<=t&&(t=Math.abs(e-Es(e)),r=vs);vs=r}function _s(e){e.width?(e.wpx=bs(e.width),e.wch=ws(e.wpx),e.MDW=vs):e.wpx?(e.wch=ws(e.wpx),e.width=Cs(e.wch),e.MDW=vs):"number"==typeof e.wch&&(e.width=Cs(e.wch),e.wpx=bs(e.width),e.MDW=vs),e.customWidth&&delete e.customWidth}var As=96;function Bs(e){return 96*e/As}function Ts(e){return e*As/96}var ks,ys,xs,Is,Rs,Os={None:"none",Solid:"solid",Gray50:"mediumGray",Gray75:"darkGray",Gray25:"lightGray",HorzStripe:"darkHorizontal",VertStripe:"darkVertical",ReverseDiagStripe:"darkDown",DiagStripe:"darkUp",DiagCross:"darkGrid",ThickDiagCross:"darkTrellis",ThinHorzStripe:"lightHorizontal",ThinVertStripe:"lightVertical",ThinReverseDiagStripe:"lightDown",ThinHorzCross:"lightGrid"},Fs=["numFmtId","fillId","fontId","borderId","xfId"],Ds=["applyAlignment","applyBorder","applyFill","applyFont","applyNumberFormat","applyProtection","pivotButton","quotePrefix"],Ns=(ks=/<(?:\w+:)?numFmts([^>]*)>[\S\s]*?<\/(?:\w+:)?numFmts>/,ys=/<(?:\w+:)?cellXfs([^>]*)>[\S\s]*?<\/(?:\w+:)?cellXfs>/,xs=/<(?:\w+:)?fills([^>]*)>[\S\s]*?<\/(?:\w+:)?fills>/,Is=/<(?:\w+:)?fonts([^>]*)>[\S\s]*?<\/(?:\w+:)?fonts>/,Rs=/<(?:\w+:)?borders([^>]*)>[\S\s]*?<\/(?:\w+:)?borders>/,function(e,t,r){var n,a={};return e?((n=(e=e.replace(//gm,"").replace(//gm,"")).match(ks))&&function(e,t,r){t.NumberFmt=[];for(var n=U(x._table),a=0;a":case"":case"":case"":break;case"0){if(l>392){for(l=392;l>60&&null!=t.NumberFmt[l];--l);t.NumberFmt[l]=o}x.load(o,l)}break;default:if(r.WTF)throw new Error("unrecognized "+i[0]+" in numFmts")}}}(n,a,r),(n=e.match(Is))&&function(e,t,r,n){t.Fonts=[];var a={},s=!1;(e[0].match(be)||[]).forEach(function(e){var i=Ee(e);switch(Se(i[0])){case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":break;case"
":case"":t.Fonts.push(a),a={};break;case"":a.bold=1;break;case"":a.italic=1;break;case"":a.underline=1;break;case"":a.strike=1;break;case"":a.outline=1;break;case"":a.shadow=1;break;case"":a.condense=1;break;case"":a.extend=1;break;case"":case"":s=!1;break;default:if(n&&n.WTF&&!s)throw new Error("unrecognized "+i[0]+" in fonts")}})}(n,a,t,r),(n=e.match(xs))&&function(e,t,r,n){t.Fills=[];var a={},s=!1;(e[0].match(be)||[]).forEach(function(e){var r=Ee(e);switch(Se(r[0])){case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":break;case"":case"":a={},t.Fills.push(a);break;case"":t.Fills.push(a),a={};break;case"":r.patternType&&(a.patternType=r.patternType);break;case"":s=!1;break;default:if(n&&n.WTF&&!s)throw new Error("unrecognized "+r[0]+" in fills")}})}(n,a,0,r),(n=e.match(Rs))&&function(e,t,r,n){t.Borders=[];var a={},s=!1;(e[0].match(be)||[]).forEach(function(e){var r=Ee(e);switch(Se(r[0])){case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":break;case"":case"":a={},r.diagonalUp&&(a.diagonalUp=Ne(r.diagonalUp)),r.diagonalDown&&(a.diagonalDown=Ne(r.diagonalDown)),t.Borders.push(a);break;case"":s=!1;break;default:if(n&&n.WTF&&!s)throw new Error("unrecognized "+r[0]+" in borders")}})}(n,a,0,r),(n=e.match(ys))&&function(e,t,r){var n;t.CellXf=[];var a=!1;(e[0].match(be)||[]).forEach(function(e){var s=Ee(e),i=0;switch(Se(s[0])){case"":case"":case"":case"":case"":case"":case"":case"":case"":break;case"":for(delete(n=s)[0],i=0;i392)for(i=392;i>60;--i)if(t.NumberFmt[n.numFmtId]==t.NumberFmt[i]){n.numFmtId=i;break}t.CellXf.push(n);break;case"":var o={};s.vertical&&(o.vertical=s.vertical),s.horizontal&&(o.horizontal=s.horizontal),null!=s.textRotation&&(o.textRotation=s.textRotation),s.indent&&(o.indent=s.indent),s.wrapText&&(o.wrapText=Ne(s.wrapText)),n.alignment=o;break;case"":case"":a=!1;break;default:if(r&&r.WTF&&!a)throw new Error("unrecognized "+s[0]+" in cellXfs")}})}(n,a,r),a):a}),Ps=qe("styleSheet",null,{xmlns:nt.main[0],"xmlns:vt":nt.vt});function Ls(e,t){var r,n=[me,Ps];return e.SSF&&null!=(r=function(e){var t=[""];return[[5,8],[23,26],[41,44],[50,392]].forEach(function(r){for(var n=r[0];n<=r[1];++n)null!=e[n]&&(t[t.length]=qe("numFmt",null,{numFmtId:n,formatCode:Ie(e[n])}))}),1===t.length?"":(t[t.length]="",t[0]=qe("numFmts",null,{count:t.length-2}).replace("/>",">"),t.join(""))}(e.SSF))&&(n[n.length]=r),n[n.length]='',n[n.length]='',n[n.length]='',n[n.length]='',(r=function(e){var t=[];return t[t.length]=qe("cellXfs",null),e.forEach(function(e){t[t.length]=qe("xf",null,e)}),t[t.length]="",2===t.length?"":(t[0]=qe("cellXfs",null,{count:t.length-2}).replace("/>",">"),t.join(""))}(t.cellXfs))&&(n[n.length]=r),n[n.length]='',n[n.length]='',n[n.length]='',n.length>2&&(n[n.length]="",n[1]=n[1].replace("/>",">")),n.join("")}function Ms(e,t,r){r||(r=zt(6+4*t.length)),r.write_shift(2,e),cr(t,r);var n=r.length>r.l?r.slice(0,r.l):r;return null==r.l&&(r.l=r.length),n}Zr.STY="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles";var Us=H(["none","solid","mediumGray","darkGray","lightGray","darkHorizontal","darkVertical","darkDown","darkUp","darkGrid","darkTrellis","lightHorizontal","lightVertical","lightDown","lightUp","lightGrid","lightTrellis","gray125","gray0625"]),zs=Ut;function Hs(e,t){t||(t=zt(84));var r=Us[e.patternType];null==r&&(r=40),t.write_shift(4,r);var n=0;if(40!=r)for(Rr({auto:1},t),Rr({auto:1},t);n<12;++n)t.write_shift(4,0);else{for(;n<4;++n)t.write_shift(4,0);for(;n<12;++n)t.write_shift(4,0)}return t.length>t.l?t.slice(0,t.l):t}function Ws(e,t,r){return r||(r=zt(16)),r.write_shift(2,t||0),r.write_shift(2,e.numFmtId||0),r.write_shift(2,0),r.write_shift(2,0),r.write_shift(2,0),r.write_shift(1,0),r.write_shift(1,0),r.write_shift(1,0),r.write_shift(1,0),r.write_shift(1,0),r.write_shift(1,0),r}function Vs(e,t){return t||(t=zt(10)),t.write_shift(1,0),t.write_shift(1,0),t.write_shift(4,0),t.write_shift(4,0),t}var Xs=Ut;function Gs(e,t){var r=Wt();return Vt(r,"BrtBeginStyleSheet"),function(e,t){if(t){var r=0;[[5,8],[23,26],[41,44],[50,392]].forEach(function(e){for(var n=e[0];n<=e[1];++n)null!=t[n]&&++r}),0!=r&&(Vt(e,"BrtBeginFmts",or(r)),[[5,8],[23,26],[41,44],[50,392]].forEach(function(r){for(var n=r[0];n<=r[1];++n)null!=t[n]&&Vt(e,"BrtFmt",Ms(n,t[n]))}),Vt(e,"BrtEndFmts"))}}(r,e.SSF),function(e){Vt(e,"BrtBeginFonts",or(1)),Vt(e,"BrtFont",function(e,t){t||(t=zt(153)),t.write_shift(2,20*e.sz),function(e,t){t||(t=zt(2));var r=(e.italic?2:0)|(e.strike?8:0)|(e.outline?16:0)|(e.shadow?32:0)|(e.condense?64:0)|(e.extend?128:0);t.write_shift(1,r),t.write_shift(1,0)}(e,t),t.write_shift(2,e.bold?700:400);var r=0;"superscript"==e.vertAlign?r=1:"subscript"==e.vertAlign&&(r=2),t.write_shift(2,r),t.write_shift(1,e.underline||0),t.write_shift(1,e.family||0),t.write_shift(1,e.charset||0),t.write_shift(1,0),Rr(e.color,t);var n=0;return"major"==e.scheme&&(n=1),"minor"==e.scheme&&(n=2),t.write_shift(1,n),cr(e.name,t),t.length>t.l?t.slice(0,t.l):t}({sz:12,color:{theme:1},name:"Calibri",family:2,scheme:"minor"})),Vt(e,"BrtEndFonts")}(r),function(e){Vt(e,"BrtBeginFills",or(2)),Vt(e,"BrtFill",Hs({patternType:"none"})),Vt(e,"BrtFill",Hs({patternType:"gray125"})),Vt(e,"BrtEndFills")}(r),function(e){Vt(e,"BrtBeginBorders",or(1)),Vt(e,"BrtBorder",function(e,t){return t||(t=zt(51)),t.write_shift(1,0),Vs(0,t),Vs(0,t),Vs(0,t),Vs(0,t),Vs(0,t),t.length>t.l?t.slice(0,t.l):t}()),Vt(e,"BrtEndBorders")}(r),function(e){Vt(e,"BrtBeginCellStyleXFs",or(1)),Vt(e,"BrtXF",Ws({numFmtId:0,fontId:0,fillId:0,borderId:0},65535)),Vt(e,"BrtEndCellStyleXFs")}(r),function(e,t){Vt(e,"BrtBeginCellXFs",or(t.length)),t.forEach(function(t){Vt(e,"BrtXF",Ws(t,0))}),Vt(e,"BrtEndCellXFs")}(r,t.cellXfs),function(e){Vt(e,"BrtBeginStyles",or(1)),Vt(e,"BrtStyle",function(e,t){return t||(t=zt(52)),t.write_shift(4,e.xfId),t.write_shift(2,1),t.write_shift(1,+e.builtinId),t.write_shift(1,0),Cr(e.name||"",t),t.length>t.l?t.slice(0,t.l):t}({xfId:0,builtinId:0,name:"Normal"})),Vt(e,"BrtEndStyles")}(r),function(e){Vt(e,"BrtBeginDXFs",or(0)),Vt(e,"BrtEndDXFs")}(r),function(e){Vt(e,"BrtBeginTableStyles",function(){var e=zt(2052);return e.write_shift(4,0),Cr("TableStyleMedium9",e),Cr("PivotStyleMedium4",e),e.length>e.l?e.slice(0,e.l):e}()),Vt(e,"BrtEndTableStyles")}(r),Vt(r,"BrtEndStyleSheet"),r.end()}Zr.THEME="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme";var js=["","","","","","","","","","","",""];function Ks(e,t,r){t.themeElements.clrScheme=[];var n={};(e[0].match(be)||[]).forEach(function(e){var a=Ee(e);switch(a[0]){case"":break;case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":"/"===a[0].charAt(1)?(t.themeElements.clrScheme[js.indexOf(a[0])]=n,n={}):n.name=a[0].slice(3,a[0].length-1);break;default:if(r&&r.WTF)throw new Error("Unrecognized "+a[0]+" in clrScheme")}})}function $s(){}function Ys(){}var Zs=/]*)>[\s\S]*<\/a:clrScheme>/,Qs=/]*)>[\s\S]*<\/a:fontScheme>/,Js=/]*)>[\s\S]*<\/a:fmtScheme>/,qs=/]*)>[\s\S]*<\/a:themeElements>/;function ei(e,t){if(!e||0===e.length)return ei(ti());var r,n={};if(!(r=e.match(qs)))throw new Error("themeElements not found in theme");return function(e,t,r){var n;t.themeElements={},[["clrScheme",Zs,Ks],["fontScheme",Qs,$s],["fmtScheme",Js,Ys]].forEach(function(a){if(!(n=e.match(a[1])))throw new Error(a[0]+" not found in themeElements");a[2](n,t,r)})}(r[0],n,t),n.raw=e,n}function ti(e,t){if(t&&t.themeXLSX)return t.themeXLSX;if(e&&"string"==typeof e.raw)return e.raw;var r=[me];return r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]='',r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]='',r[r.length]="",r[r.length]="",r[r.length]="",r[r.length]="",r.join("")}function ri(e){var t=e.read_shift(2),r=e.read_shift(2)-4,n=[t];switch(t){case 4:case 5:case 7:case 8:case 9:case 10:case 11:case 13:n[1]=function(e){var t={};switch(t.xclrType=e.read_shift(2),t.nTintShade=e.read_shift(2),t.xclrType){case 0:case 4:e.l+=4;break;case 1:t.xclrValue=function(e){return Ut(e,4)}(e);break;case 2:t.xclrValue=ea(e);break;case 3:t.xclrValue=function(e){return e.read_shift(4)}(e)}return e.l+=8,t}(e);break;case 6:n[1]=function(e,t){return Ut(e,t)}(e,r);break;case 14:case 15:n[1]=e.read_shift(1===r?1:2);break;default:throw new Error("Unrecognized ExtProp type: "+t+" "+r)}return n}function ni(e,t){t.forEach(function(e){e[0]})}Zr.IMG="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",Zr.DRAW="http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing";var ai=1024;function si(e,t){for(var r=[21600,21600],n=["m0,0l0",r[1],r[0],r[1],r[0],"0xe"].join(","),a=[qe("xml",null,{"xmlns:v":"urn:schemas-microsoft-com:vml","xmlns:o":at,"xmlns:x":st,"xmlns:mv":"http://macVmlSchemaUri"}).replace(/\/>/,">"),qe("o:shapelayout",qe("o:idmap",null,{"v:ext":"edit",data:e}),{"v:ext":"edit"}),qe("v:shapetype",[qe("v:stroke",null,{joinstyle:"miter"}),qe("v:path",null,{gradientshapeok:"t","o:connecttype":"rect"})].join(""),{id:"_x0000_t202","o:spt":202,coordsize:r.join(","),path:n})];ai<1e3*e;)ai+=1e3;return t.forEach(function(e){var t=Jt(e[0]),r={color2:"#BEFF82",type:"gradient"};"gradient"==r.type&&(r.angle="-180");var n="gradient"==r.type?qe("o:fill",null,{type:"gradientUnscaled","v:ext":"view"}):null,s=qe("v:fill",n,r);++ai,a=a.concat(["",s,qe("v:shadow",null,{on:"t",obscured:"t"}),qe("v:path",null,{"o:connecttype":"none"}),'
','',"","",Qe("x:Anchor",[t.c+1,0,t.r+1,0,t.c+3,20,t.r+5,20].join(",")),Qe("x:AutoFill","False"),Qe("x:Row",String(t.r)),Qe("x:Column",String(t.c)),e[1].hidden?"":"","",""])}),a.push(""),a.join("")}Zr.CMNT="http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments";var ii=qe("comments",null,{xmlns:nt.main[0]});function oi(e){var t=[me,ii],r=[];return t.push(""),e.forEach(function(e){e[1].forEach(function(e){var n=Ie(e.a);r.indexOf(n)>-1||(r.push(n),t.push(""+n+""))})}),t.push(""),t.push(""),e.forEach(function(e){e[1].forEach(function(n){t.push(''),t.push(Qe("t",null==n.t?"":Ie(n.t))),t.push("")})}),t.push(""),t.length>2&&(t[t.length]="",t[1]=t[1].replace("/>",">")),t.join("")}var li=lr;function ci(e){var t=Wt(),r=[];return Vt(t,"BrtBeginComments"),Vt(t,"BrtBeginCommentAuthors"),e.forEach(function(e){e[1].forEach(function(e){r.indexOf(e.a)>-1||(r.push(e.a.slice(0,54)),Vt(t,"BrtCommentAuthor",function(e){return cr(e.slice(0,54))}(e.a)))})}),Vt(t,"BrtEndCommentAuthors"),Vt(t,"BrtBeginCommentList"),e.forEach(function(e){e[1].forEach(function(n){n.iauthor=r.indexOf(n.a);var a={s:Jt(e[0]),e:Jt(e[0])};Vt(t,"BrtBeginComment",function(e,t){return null==t&&(t=zt(36)),t.write_shift(4,e[1].iauthor),yr(e[0],t),t.write_shift(4,0),t.write_shift(4,0),t.write_shift(4,0),t.write_shift(4,0),t}([a,n])),n.t&&n.t.length>0&&Vt(t,"BrtCommentText",function(e,t){var r=!1;return null==t&&(r=!0,t=zt(23+4*e.t.length)),t.write_shift(1,1),cr(e.t,t),t.write_shift(4,1),function(e,t){t||(t=zt(4)),t.write_shift(2,e.ich||0),t.write_shift(2,e.ifnt||0)}({ich:0,ifnt:0},t),r?t.slice(0,t.l):t}(n)),Vt(t,"BrtEndComment"),delete n.iauthor})}),Vt(t,"BrtEndCommentList"),Vt(t,"BrtEndComments"),t.end()}var fi=["xlsb","xlsm","xlam","biff8","xla"];Zr.DS="http://schemas.openxmlformats.org/officeDocument/2006/relationships/dialogsheet",Zr.MS="http://schemas.microsoft.com/office/2006/relationships/xlMacrosheet";var hi=function(){var e=/(^|[^A-Za-z_])R(\[?-?\d+\]|[1-9]\d*|)C(\[?-?\d+\]|[1-9]\d*|)(?![A-Za-z0-9_])/g,t={r:0,c:0};function r(e,r,n,a){var s=!1,i=!1;0==n.length?i=!0:"["==n.charAt(0)&&(i=!0,n=n.slice(1,-1)),0==a.length?s=!0:"["==a.charAt(0)&&(s=!0,a=a.slice(1,-1));var o=n.length>0?0|parseInt(n,10):0,l=a.length>0?0|parseInt(a,10):0;return s?l+=t.c:--l,i?o+=t.r:--o,r+(s?"":"$")+Qt(l)+(i?"":"$")+Yt(o)}return function(n,a){return t=a,n.replace(e,r)}}(),ui=/(^|[^._A-Z0-9])([$]?)([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])([$]?)(10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5})(?![_.\(A-Za-z0-9])/g,di=function(e,t){return e.replace(ui,function(e,r,n,a,s,i){var o=Zt(a)-(n?0:t.c),l=$t(i)-(s?0:t.r);return r+"R"+(0==l?"":s?l+1:"["+l+"]")+"C"+(0==o?"":n?o+1:"["+o+"]")})};function pi(e,t){return e.replace(ui,function(e,r,n,a,s,i){return r+("$"==n?n+a:Qt(Zt(a)+t.c))+("$"==s?s+i:Yt($t(i)+t.r))})}function gi(e,t,r){var n=er(t).s,a=Jt(r);return pi(e,{r:a.r-n.r,c:a.c-n.c})}function mi(e){return e.replace(/_xlfn\./g,"")}function vi(e){e.l+=1}function bi(e,t){var r=e.read_shift(1==t?1:2);return[16383&r,r>>14&1,r>>15&1]}function wi(e,t,r){var n=2;if(r){if(r.biff>=2&&r.biff<=5)return Ci(e);12==r.biff&&(n=4)}var a=e.read_shift(n),s=e.read_shift(n),i=bi(e,2),o=bi(e,2);return{s:{r:a,c:i[0],cRel:i[1],rRel:i[2]},e:{r:s,c:o[0],cRel:o[1],rRel:o[2]}}}function Ci(e){var t=bi(e,2),r=bi(e,2),n=e.read_shift(1),a=e.read_shift(1);return{s:{r:t[0],c:n,cRel:t[1],rRel:t[2]},e:{r:r[0],c:a,cRel:r[1],rRel:r[2]}}}function Ei(e,t,r){if(r&&r.biff>=2&&r.biff<=5)return function(e){var t=bi(e,2),r=e.read_shift(1);return{r:t[0],c:r,cRel:t[1],rRel:t[2]}}(e);var n=e.read_shift(r&&12==r.biff?4:2),a=bi(e,2);return{r:n,c:a[0],cRel:a[1],rRel:a[2]}}function Si(e){var t=e.read_shift(2),r=e.read_shift(2);return{r:t,c:255&r,fQuoted:!!(16384&r),cRel:r>>15,rRel:r>>15}}function _i(e){return[e.read_shift(1),e.read_shift(1)]}function Ai(e,t){var r=[e.read_shift(1)];if(12==t)switch(r[0]){case 2:r[0]=4;break;case 4:r[0]=16;break;case 0:r[0]=1;break;case 1:r[0]=2}switch(r[0]){case 4:r[1]=Mn(e,1)?"TRUE":"FALSE",12!=t&&(e.l+=7);break;case 37:case 16:r[1]=Vr[e[e.l]],e.l+=12==t?4:8;break;case 0:e.l+=8;break;case 1:r[1]=xr(e);break;case 2:r[1]=Yn(e,0,{biff:t>0&&t<8?2:t});break;default:throw new Error("Bad SerAr: "+r[0])}return r}function Bi(e,t,r){for(var n=e.read_shift(12==r.biff?4:2),a=[],s=0;s!=n;++s)a.push((12==r.biff?kr:ia)(e,8));return a}function Ti(e,t,r){var n=0,a=0;12==r.biff?(n=e.read_shift(4),a=e.read_shift(4)):(a=1+e.read_shift(1),n=1+e.read_shift(2)),r.biff>=2&&r.biff<8&&(--n,0==--a&&(a=256));for(var s=0,i=[];s!=n&&(i[s]=[]);++s)for(var o=0;o!=a;++o)i[s][o]=Ai(e,r.biff);return i}function ki(e,t,r){return e.l+=2,[Si(e)]}function yi(e){return e.l+=6,[]}var xi=ki,Ii=yi,Ri=yi,Oi=ki;function Fi(e){return e.l+=2,[zn(e),1&e.read_shift(2)]}var Di=ki,Ni=Fi,Pi=yi,Li=ki,Mi=ki,Ui=["Data","All","Headers","??","?Data2","??","?DataHeaders","??","Totals","??","??","??","?DataTotals","??","??","??","?Current"],zi={1:{n:"PtgExp",f:function(e,t,r){return e.l++,r&&12==r.biff?[e.read_shift(4,"i"),0]:[e.read_shift(2),e.read_shift(r&&2==r.biff?1:2)]}},2:{n:"PtgTbl",f:Ut},3:{n:"PtgAdd",f:vi},4:{n:"PtgSub",f:vi},5:{n:"PtgMul",f:vi},6:{n:"PtgDiv",f:vi},7:{n:"PtgPower",f:vi},8:{n:"PtgConcat",f:vi},9:{n:"PtgLt",f:vi},10:{n:"PtgLe",f:vi},11:{n:"PtgEq",f:vi},12:{n:"PtgGe",f:vi},13:{n:"PtgGt",f:vi},14:{n:"PtgNe",f:vi},15:{n:"PtgIsect",f:vi},16:{n:"PtgUnion",f:vi},17:{n:"PtgRange",f:vi},18:{n:"PtgUplus",f:vi},19:{n:"PtgUminus",f:vi},20:{n:"PtgPercent",f:vi},21:{n:"PtgParen",f:vi},22:{n:"PtgMissArg",f:vi},23:{n:"PtgStr",f:function(e,t,r){return e.l++,Xn(e,0,r)}},26:{n:"PtgSheet",f:function(e,t,r){return e.l+=5,e.l+=2,e.l+=2==r.biff?1:4,["PTGSHEET"]}},27:{n:"PtgEndSheet",f:function(e,t,r){return e.l+=2==r.biff?4:5,["PTGENDSHEET"]}},28:{n:"PtgErr",f:function(e){return e.l++,Vr[e.read_shift(1)]}},29:{n:"PtgBool",f:function(e){return e.l++,0!==e.read_shift(1)}},30:{n:"PtgInt",f:function(e){return e.l++,e.read_shift(2)}},31:{n:"PtgNum",f:function(e){return e.l++,xr(e)}},32:{n:"PtgArray",f:function(e,t,r){var n=(96&e[e.l++])>>5;return e.l+=2==r.biff?6:12==r.biff?14:7,[n]}},33:{n:"PtgFunc",f:function(e,t,r){var n=(96&e[e.l])>>5;e.l+=1;var a=e.read_shift(r&&r.biff<=3?1:2);return[lo[a],oo[a],n]}},34:{n:"PtgFuncVar",f:function(e,t,r){var n=e[e.l++],a=e.read_shift(1),s=r&&r.biff<=3?[88==n?-1:0,e.read_shift(1)]:function(e){return[e[e.l+1]>>7,32767&e.read_shift(2)]}(e);return[a,(0===s[0]?oo:io)[s[1]]]}},35:{n:"PtgName",f:function(e,t,r){var n=e.read_shift(1)>>>5&3,a=!r||r.biff>=8?4:2,s=e.read_shift(a);switch(r.biff){case 2:e.l+=5;break;case 3:case 4:e.l+=8;break;case 5:e.l+=12}return[n,0,s]}},36:{n:"PtgRef",f:function(e,t,r){var n=(96&e[e.l])>>5;return e.l+=1,[n,Ei(e,0,r)]}},37:{n:"PtgArea",f:function(e,t,r){return[(96&e[e.l++])>>5,wi(e,r.biff>=2&&r.biff,r)]}},38:{n:"PtgMemArea",f:function(e,t,r){var n=e.read_shift(1)>>>5&3;return e.l+=r&&2==r.biff?3:4,[n,e.read_shift(r&&2==r.biff?1:2)]}},39:{n:"PtgMemErr",f:Ut},40:{n:"PtgMemNoMem",f:Ut},41:{n:"PtgMemFunc",f:function(e,t,r){return[e.read_shift(1)>>>5&3,e.read_shift(r&&2==r.biff?1:2)]}},42:{n:"PtgRefErr",f:function(e,t,r){var n=e.read_shift(1)>>>5&3;return e.l+=4,r.biff<8&&e.l--,12==r.biff&&(e.l+=2),[n]}},43:{n:"PtgAreaErr",f:function(e,t,r){var n=(96&e[e.l++])>>5;return e.l+=r&&r.biff>8?12:r.biff<8?6:8,[n]}},44:{n:"PtgRefN",f:function(e,t,r){var n=(96&e[e.l])>>5;e.l+=1;var a=function(e,t,r){var n=r&&r.biff?r.biff:8;if(n>=2&&n<=5)return function(e){var t=e.read_shift(2),r=e.read_shift(1),n=(32768&t)>>15,a=(16384&t)>>14;return t&=16383,1==n&&t>=8192&&(t-=16384),1==a&&r>=128&&(r-=256),{r:t,c:r,cRel:a,rRel:n}}(e);var a=e.read_shift(n>=12?4:2),s=e.read_shift(2),i=(16384&s)>>14,o=(32768&s)>>15;if(s&=16383,1==o)for(;a>524287;)a-=1048576;if(1==i)for(;s>8191;)s-=16384;return{r:a,c:s,cRel:i,rRel:o}}(e,0,r);return[n,a]}},45:{n:"PtgAreaN",f:function(e,t,r){var n=(96&e[e.l++])>>5,a=function(e,t,r){if(r.biff<8)return Ci(e);var n=e.read_shift(12==r.biff?4:2),a=e.read_shift(12==r.biff?4:2),s=bi(e,2),i=bi(e,2);return{s:{r:n,c:s[0],cRel:s[1],rRel:s[2]},e:{r:a,c:i[0],cRel:i[1],rRel:i[2]}}}(e,0,r);return[n,a]}},46:{n:"PtgMemAreaN",f:function(e){return[e.read_shift(1)>>>5&3,e.read_shift(2)]}},47:{n:"PtgMemNoMemN",f:function(e){return[e.read_shift(1)>>>5&3,e.read_shift(2)]}},57:{n:"PtgNameX",f:function(e,t,r){return 5==r.biff?function(e){var t=e.read_shift(1)>>>5&3,r=e.read_shift(2,"i");e.l+=8;var n=e.read_shift(2);return e.l+=12,[t,r,n]}(e):[e.read_shift(1)>>>5&3,e.read_shift(2),e.read_shift(4)]}},58:{n:"PtgRef3d",f:function(e,t,r){var n=(96&e[e.l])>>5;e.l+=1;var a=e.read_shift(2);return r&&5==r.biff&&(e.l+=12),[n,a,Ei(e,0,r)]}},59:{n:"PtgArea3d",f:function(e,t,r){var n=(96&e[e.l++])>>5,a=e.read_shift(2,"i");if(r&&5===r.biff)e.l+=12;return[n,a,wi(e,0,r)]}},60:{n:"PtgRefErr3d",f:function(e,t,r){var n=(96&e[e.l++])>>5,a=e.read_shift(2),s=4;if(r)switch(r.biff){case 5:s=15;break;case 12:s=6}return e.l+=s,[n,a]}},61:{n:"PtgAreaErr3d",f:function(e,t,r){var n=(96&e[e.l++])>>5,a=e.read_shift(2),s=8;if(r)switch(r.biff){case 5:e.l+=12,s=6;break;case 12:s=12}return e.l+=s,[n,a]}},255:{}},Hi={64:32,96:32,65:33,97:33,66:34,98:34,67:35,99:35,68:36,100:36,69:37,101:37,70:38,102:38,71:39,103:39,72:40,104:40,73:41,105:41,74:42,106:42,75:43,107:43,76:44,108:44,77:45,109:45,78:46,110:46,79:47,111:47,88:34,120:34,89:57,121:57,90:58,122:58,91:59,123:59,92:60,124:60,93:61,125:61};!function(){for(var e in Hi)zi[e]=zi[Hi[e]]}();var Wi={1:{n:"PtgElfLel",f:Fi},2:{n:"PtgElfRw",f:Li},3:{n:"PtgElfCol",f:xi},6:{n:"PtgElfRwV",f:Mi},7:{n:"PtgElfColV",f:Oi},10:{n:"PtgElfRadical",f:Di},11:{n:"PtgElfRadicalS",f:Pi},13:{n:"PtgElfColS",f:Ii},15:{n:"PtgElfColSV",f:Ri},16:{n:"PtgElfRadicalLel",f:Ni},25:{n:"PtgList",f:function(e){e.l+=2;var t=e.read_shift(2),r=e.read_shift(2),n=e.read_shift(4),a=e.read_shift(2),s=e.read_shift(2);return{ixti:t,coltype:3&r,rt:Ui[r>>2&31],idx:n,c:a,C:s}}},29:{n:"PtgSxName",f:function(e){return e.l+=2,[e.read_shift(4)]}},255:{}},Vi={0:{n:"PtgAttrNoop",f:function(e){return e.l+=4,[0,0]}},1:{n:"PtgAttrSemi",f:function(e,t,r){var n=255&e[e.l+1]?1:0;return e.l+=r&&2==r.biff?3:4,[n]}},2:{n:"PtgAttrIf",f:function(e,t,r){var n=255&e[e.l+1]?1:0;return e.l+=2,[n,e.read_shift(r&&2==r.biff?1:2)]}},4:{n:"PtgAttrChoose",f:function(e,t,r){e.l+=2;for(var n=e.read_shift(r&&2==r.biff?1:2),a=[],s=0;s<=n;++s)a.push(e.read_shift(r&&2==r.biff?1:2));return a}},8:{n:"PtgAttrGoto",f:function(e,t,r){var n=255&e[e.l+1]?1:0;return e.l+=2,[n,e.read_shift(r&&2==r.biff?1:2)]}},16:{n:"PtgAttrSum",f:function(e,t,r){e.l+=r&&2==r.biff?3:4}},32:{n:"PtgAttrBaxcel",f:function(e){var t=1&e[e.l+1];return e.l+=4,[t,1]}},64:{n:"PtgAttrSpace",f:function(e){return e.read_shift(2),_i(e)}},65:{n:"PtgAttrSpaceSemi",f:function(e){return e.read_shift(2),_i(e)}},128:{n:"PtgAttrIfError",f:function(e){var t=255&e[e.l+1]?1:0;return e.l+=2,[t,e.read_shift(2)]}},255:{}};function Xi(e,t,r,n){if(n.biff<8)return Ut(e,t);for(var a=e.l+t,s=[],i=0;i!==r.length;++i)switch(r[i][0]){case"PtgArray":r[i][1]=Ti(e,0,n),s.push(r[i][1]);break;case"PtgMemArea":r[i][2]=Bi(e,r[i][1],n),s.push(r[i][2]);break;case"PtgExp":n&&12==n.biff&&(r[i][1][1]=e.read_shift(4),s.push(r[i][1]));break;case"PtgList":case"PtgElfRadicalS":case"PtgElfColS":case"PtgElfColSV":throw"Unsupported "+r[i][0]}return 0!==(t=a-e.l)&&s.push(Ut(e,t)),s}function Gi(e,t,r){for(var n,a,s=e.l+t,i=[];s!=e.l;)t=s-e.l,a=e[e.l],n=zi[a],24!==a&&25!==a||(n=(24===a?Wi:Vi)[e[e.l+1]]),n&&n.f?i.push([n.n,n.f(e,t,r)]):Ut(e,t);return i}function ji(e){for(var t=[],r=0;r=",PtgGt:">",PtgLe:"<=",PtgLt:"<",PtgMul:"*",PtgNe:"<>",PtgPower:"^",PtgSub:"-"},$i=new RegExp(/[^\w\u4E00-\u9FFF\u3040-\u30FF]/);function Yi(e,t,r){if(!e)return"SH33TJSERR0";if(r.biff>8&&(!e.XTI||!e.XTI[t]))return e.SheetNames[t];if(!e.XTI)return"SH33TJSERR6";var n=e.XTI[t];if(r.biff<8)return t>1e4&&(t-=65536),t<0&&(t=-t),0==t?"":e.XTI[t-1];if(!n)return"SH33TJSERR1";var a="";if(r.biff>8)switch(e[n[0]][0]){case 357:return a=-1==n[1]?"#REF":e.SheetNames[n[1]],n[1]==n[2]?a:a+":"+e.SheetNames[n[2]];case 358:return null!=r.SID?e.SheetNames[r.SID]:"SH33TJSSAME"+e[n[0]][0];default:return"SH33TJSSRC"+e[n[0]][0]}switch(e[n[0]][0][0]){case 1025:return a=-1==n[1]?"#REF":e.SheetNames[n[1]]||"SH33TJSERR3",n[1]==n[2]?a:a+":"+e.SheetNames[n[2]];case 14849:return e[n[0]].slice(1).map(function(e){return e.Name}).join(";;");default:return e[n[0]][0][3]?(a=-1==n[1]?"#REF":e[n[0]][0][3][n[1]]||"SH33TJSERR4",n[1]==n[2]?a:a+":"+e[n[0]][0][3][n[2]]):"SH33TJSERR2"}}function Zi(e,t,r){var n=Yi(e,t,r);return"#REF"==n?n:function(e,t){if(!(e||t&&t.biff<=5&&t.biff>=2))throw new Error("empty sheet name");return $i.test(e)?"'"+e+"'":e}(n,r)}function Qi(e,t,r,n,a){var s,i,o,l,c=a&&a.biff||8,f={s:{c:0,r:0},e:{c:0,r:0}},h=[],u=0,d=0,p="";if(!e[0]||!e[0][0])return"";for(var g=-1,m="",v=0,b=e[0].length;v=0){switch(e[0][g][1][0]){case 0:m=re(" ",e[0][g][1][1]);break;case 1:m=re("\r",e[0][g][1][1]);break;default:if(m="",a.WTF)throw new Error("Unexpected PtgAttrSpaceType "+e[0][g][1][0])}i+=m,g=-1}h.push(i+Ki[w[0]]+s);break;case"PtgIsect":s=h.pop(),i=h.pop(),h.push(i+" "+s);break;case"PtgUnion":s=h.pop(),i=h.pop(),h.push(i+","+s);break;case"PtgRange":s=h.pop(),i=h.pop(),h.push(i+":"+s);break;case"PtgAttrChoose":case"PtgAttrGoto":case"PtgAttrIf":case"PtgAttrIfError":case"PtgAttrBaxcel":case"PtgAttrSemi":case"PtgMemArea":case"PtgTbl":case"PtgMemErr":case"PtgMemAreaN":case"PtgMemNoMemN":case"PtgAttrNoop":case"PtgSheet":case"PtgEndSheet":case"PtgMemFunc":case"PtgMemNoMem":break;case"PtgRef":o=Xt(w[1][1],f,a),h.push(jt(o,c));break;case"PtgRefN":o=r?Xt(w[1][1],r,a):w[1][1],h.push(jt(o,c));break;case"PtgRef3d":u=w[1][1],o=Xt(w[1][2],f,a),p=Zi(n,u,a),h.push(p+"!"+jt(o,c));break;case"PtgFunc":case"PtgFuncVar":var C=w[1][0],E=w[1][1];C||(C=0);var S=0==(C&=127)?[]:h.slice(-C);h.length-=C,"User"===E&&(E=S.shift()),h.push(E+"("+S.join(",")+")");break;case"PtgBool":h.push(w[1]?"TRUE":"FALSE");break;case"PtgInt":case"PtgErr":h.push(w[1]);break;case"PtgNum":h.push(String(w[1]));break;case"PtgStr":h.push('"'+w[1].replace(/"/g,'""')+'"');break;case"PtgAreaN":l=Gt(w[1][1],r?{s:r}:f,a),h.push(Kt(l,a));break;case"PtgArea":l=Gt(w[1][1],f,a),h.push(Kt(l,a));break;case"PtgArea3d":u=w[1][1],l=w[1][2],p=Zi(n,u,a),h.push(p+"!"+Kt(l,a));break;case"PtgAttrSum":h.push("SUM("+h.pop()+")");break;case"PtgName":d=w[1][2];var _=(n.names||[])[d-1]||(n[0]||[])[d],A=_?_.Name:"SH33TJSNAME"+String(d);A in co&&(A=co[A]),h.push(A);break;case"PtgNameX":var B,T=w[1][1];if(d=w[1][2],!(a.biff<=5)){var k="";if(14849==((n[T]||[])[0]||[])[0]||(1025==((n[T]||[])[0]||[])[0]?n[T][d]&&n[T][d].itab>0&&(k=n.SheetNames[n[T][d].itab-1]+"!"):k=n.SheetNames[d-1]+"!"),n[T]&&n[T][d])k+=n[T][d].Name;else if(n[0]&&n[0][d])k+=n[0][d].Name;else{var y=(Yi(n,T,a)||"").split(";;");y[d-1]?k=y[d-1]:k+="SH33TJSERRX"}h.push(k);break}T<0&&(T=-T),n[T]&&(B=n[T][d]),B||(B={Name:"SH33TJSERRY"}),h.push(B.Name);break;case"PtgParen":var x="(",I=")";if(g>=0){switch(m="",e[0][g][1][0]){case 2:x=re(" ",e[0][g][1][1])+x;break;case 3:x=re("\r",e[0][g][1][1])+x;break;case 4:I=re(" ",e[0][g][1][1])+I;break;case 5:I=re("\r",e[0][g][1][1])+I;break;default:if(a.WTF)throw new Error("Unexpected PtgAttrSpaceType "+e[0][g][1][0])}g=-1}h.push(x+h.pop()+I);break;case"PtgRefErr":case"PtgRefErr3d":case"PtgAreaErr":case"PtgAreaErr3d":h.push("#REF!");break;case"PtgExp":o={c:w[1][1],r:w[1][0]};var R={c:r.c,r:r.r};if(n.sharedf[qt(o)]){var O=n.sharedf[qt(o)];h.push(Qi(O,0,R,n,a))}else{var F=!1;for(s=0;s!=n.arrayf.length;++s)if(i=n.arrayf[s],!(o.ci[0].e.c||o.ri[0].e.r)){h.push(Qi(i[1],0,R,n,a)),F=!0;break}F||h.push(w[1])}break;case"PtgArray":h.push("{"+ji(w[1])+"}");break;case"PtgAttrSpace":case"PtgAttrSpaceSemi":g=v;break;case"PtgMissArg":h.push("");break;case"PtgList":h.push("Table"+w[1].idx+"[#"+w[1].rt+"]");break;case"PtgElfCol":case"PtgElfColS":case"PtgElfColSV":case"PtgElfColV":case"PtgElfLel":case"PtgElfRadical":case"PtgElfRadicalLel":case"PtgElfRadicalS":case"PtgElfRw":case"PtgElfRwV":throw new Error("Unsupported ELFs");default:throw new Error("Unrecognized Formula Token: "+String(w))}if(3!=a.biff&&g>=0&&-1==["PtgAttrSpace","PtgAttrSpaceSemi","PtgAttrGoto"].indexOf(e[0][v][0])){var D=!0;switch((w=e[0][g])[1][0]){case 4:D=!1;case 0:m=re(" ",w[1][1]);break;case 5:D=!1;case 1:m=re("\r",w[1][1]);break;default:if(m="",a.WTF)throw new Error("Unexpected PtgAttrSpaceType "+w[1][0])}h.push((D?m:"")+h.pop()+(D?"":m)),g=-1}}if(h.length>1&&a.WTF)throw new Error("bad formula stack");return h[0]}function Ji(e,t,r){var n,a=e.l+t,s=2==r.biff?1:2,i=e.read_shift(s);if(65535==i)return[[],Ut(e,t-2)];var o=Gi(e,i,r);return t!==i+s&&(n=Xi(e,t-i-s,o,r)),e.l=a,[o,n]}function qi(e,t,r){var n,a=e.l+t,s=e.read_shift(2),i=Gi(e,s,r);return 65535==s?[[],Ut(e,t-2)]:(t!==s+2&&(n=Xi(e,a-s-2,i,r)),[i,n])}function eo(e,t,r){var n=e.l+t,a=ra(e);2==r.biff&&++e.l;var s=function(e){var t;if(65535!==kt(e,e.l+6))return[xr(e),"n"];switch(e[e.l]){case 0:return e.l+=8,["String","s"];case 1:return t=1===e[e.l+2],e.l+=8,[t,"b"];case 2:return t=e[e.l+2],e.l+=8,[t,"e"];case 3:return e.l+=8,["","s"]}return[]}(e),i=e.read_shift(1);2!=r.biff&&(e.read_shift(1),r.biff>=5&&e.read_shift(4));var o=function(e,t,r){var n,a=e.l+t,s=2==r.biff?1:2,i=e.read_shift(s);if(65535==i)return[[],Ut(e,t-2)];var o=Gi(e,i,r);return t!==i+s&&(n=Xi(e,t-i-s,o,r)),e.l=a,[o,n]}(e,n-e.l,r);return{cell:a,val:s[0],formula:o,shared:i>>3&1,tt:s[1]}}function to(e,t,r){var n=e.read_shift(4),a=Gi(e,n,r),s=e.read_shift(4);return[a,s>0?Xi(e,s,a,r):null]}var ro=to,no=to,ao=to,so=to,io={0:"BEEP",1:"OPEN",2:"OPEN.LINKS",3:"CLOSE.ALL",4:"SAVE",5:"SAVE.AS",6:"FILE.DELETE",7:"PAGE.SETUP",8:"PRINT",9:"PRINTER.SETUP",10:"QUIT",11:"NEW.WINDOW",12:"ARRANGE.ALL",13:"WINDOW.SIZE",14:"WINDOW.MOVE",15:"FULL",16:"CLOSE",17:"RUN",22:"SET.PRINT.AREA",23:"SET.PRINT.TITLES",24:"SET.PAGE.BREAK",25:"REMOVE.PAGE.BREAK",26:"FONT",27:"DISPLAY",28:"PROTECT.DOCUMENT",29:"PRECISION",30:"A1.R1C1",31:"CALCULATE.NOW",32:"CALCULATION",34:"DATA.FIND",35:"EXTRACT",36:"DATA.DELETE",37:"SET.DATABASE",38:"SET.CRITERIA",39:"SORT",40:"DATA.SERIES",41:"TABLE",42:"FORMAT.NUMBER",43:"ALIGNMENT",44:"STYLE",45:"BORDER",46:"CELL.PROTECTION",47:"COLUMN.WIDTH",48:"UNDO",49:"CUT",50:"COPY",51:"PASTE",52:"CLEAR",53:"PASTE.SPECIAL",54:"EDIT.DELETE",55:"INSERT",56:"FILL.RIGHT",57:"FILL.DOWN",61:"DEFINE.NAME",62:"CREATE.NAMES",63:"FORMULA.GOTO",64:"FORMULA.FIND",65:"SELECT.LAST.CELL",66:"SHOW.ACTIVE.CELL",67:"GALLERY.AREA",68:"GALLERY.BAR",69:"GALLERY.COLUMN",70:"GALLERY.LINE",71:"GALLERY.PIE",72:"GALLERY.SCATTER",73:"COMBINATION",74:"PREFERRED",75:"ADD.OVERLAY",76:"GRIDLINES",77:"SET.PREFERRED",78:"AXES",79:"LEGEND",80:"ATTACH.TEXT",81:"ADD.ARROW",82:"SELECT.CHART",83:"SELECT.PLOT.AREA",84:"PATTERNS",85:"MAIN.CHART",86:"OVERLAY",87:"SCALE",88:"FORMAT.LEGEND",89:"FORMAT.TEXT",90:"EDIT.REPEAT",91:"PARSE",92:"JUSTIFY",93:"HIDE",94:"UNHIDE",95:"WORKSPACE",96:"FORMULA",97:"FORMULA.FILL",98:"FORMULA.ARRAY",99:"DATA.FIND.NEXT",100:"DATA.FIND.PREV",101:"FORMULA.FIND.NEXT",102:"FORMULA.FIND.PREV",103:"ACTIVATE",104:"ACTIVATE.NEXT",105:"ACTIVATE.PREV",106:"UNLOCKED.NEXT",107:"UNLOCKED.PREV",108:"COPY.PICTURE",109:"SELECT",110:"DELETE.NAME",111:"DELETE.FORMAT",112:"VLINE",113:"HLINE",114:"VPAGE",115:"HPAGE",116:"VSCROLL",117:"HSCROLL",118:"ALERT",119:"NEW",120:"CANCEL.COPY",121:"SHOW.CLIPBOARD",122:"MESSAGE",124:"PASTE.LINK",125:"APP.ACTIVATE",126:"DELETE.ARROW",127:"ROW.HEIGHT",128:"FORMAT.MOVE",129:"FORMAT.SIZE",130:"FORMULA.REPLACE",131:"SEND.KEYS",132:"SELECT.SPECIAL",133:"APPLY.NAMES",134:"REPLACE.FONT",135:"FREEZE.PANES",136:"SHOW.INFO",137:"SPLIT",138:"ON.WINDOW",139:"ON.DATA",140:"DISABLE.INPUT",142:"OUTLINE",143:"LIST.NAMES",144:"FILE.CLOSE",145:"SAVE.WORKBOOK",146:"DATA.FORM",147:"COPY.CHART",148:"ON.TIME",149:"WAIT",150:"FORMAT.FONT",151:"FILL.UP",152:"FILL.LEFT",153:"DELETE.OVERLAY",155:"SHORT.MENUS",159:"SET.UPDATE.STATUS",161:"COLOR.PALETTE",162:"DELETE.STYLE",163:"WINDOW.RESTORE",164:"WINDOW.MAXIMIZE",166:"CHANGE.LINK",167:"CALCULATE.DOCUMENT",168:"ON.KEY",169:"APP.RESTORE",170:"APP.MOVE",171:"APP.SIZE",172:"APP.MINIMIZE",173:"APP.MAXIMIZE",174:"BRING.TO.FRONT",175:"SEND.TO.BACK",185:"MAIN.CHART.TYPE",186:"OVERLAY.CHART.TYPE",187:"SELECT.END",188:"OPEN.MAIL",189:"SEND.MAIL",190:"STANDARD.FONT",191:"CONSOLIDATE",192:"SORT.SPECIAL",193:"GALLERY.3D.AREA",194:"GALLERY.3D.COLUMN",195:"GALLERY.3D.LINE",196:"GALLERY.3D.PIE",197:"VIEW.3D",198:"GOAL.SEEK",199:"WORKGROUP",200:"FILL.GROUP",201:"UPDATE.LINK",202:"PROMOTE",203:"DEMOTE",204:"SHOW.DETAIL",206:"UNGROUP",207:"OBJECT.PROPERTIES",208:"SAVE.NEW.OBJECT",209:"SHARE",210:"SHARE.NAME",211:"DUPLICATE",212:"APPLY.STYLE",213:"ASSIGN.TO.OBJECT",214:"OBJECT.PROTECTION",215:"HIDE.OBJECT",216:"SET.EXTRACT",217:"CREATE.PUBLISHER",218:"SUBSCRIBE.TO",219:"ATTRIBUTES",220:"SHOW.TOOLBAR",222:"PRINT.PREVIEW",223:"EDIT.COLOR",224:"SHOW.LEVELS",225:"FORMAT.MAIN",226:"FORMAT.OVERLAY",227:"ON.RECALC",228:"EDIT.SERIES",229:"DEFINE.STYLE",240:"LINE.PRINT",243:"ENTER.DATA",249:"GALLERY.RADAR",250:"MERGE.STYLES",251:"EDITION.OPTIONS",252:"PASTE.PICTURE",253:"PASTE.PICTURE.LINK",254:"SPELLING",256:"ZOOM",259:"INSERT.OBJECT",260:"WINDOW.MINIMIZE",265:"SOUND.NOTE",266:"SOUND.PLAY",267:"FORMAT.SHAPE",268:"EXTEND.POLYGON",269:"FORMAT.AUTO",272:"GALLERY.3D.BAR",273:"GALLERY.3D.SURFACE",274:"FILL.AUTO",276:"CUSTOMIZE.TOOLBAR",277:"ADD.TOOL",278:"EDIT.OBJECT",279:"ON.DOUBLECLICK",280:"ON.ENTRY",281:"WORKBOOK.ADD",282:"WORKBOOK.MOVE",283:"WORKBOOK.COPY",284:"WORKBOOK.OPTIONS",285:"SAVE.WORKSPACE",288:"CHART.WIZARD",289:"DELETE.TOOL",290:"MOVE.TOOL",291:"WORKBOOK.SELECT",292:"WORKBOOK.ACTIVATE",293:"ASSIGN.TO.TOOL",295:"COPY.TOOL",296:"RESET.TOOL",297:"CONSTRAIN.NUMERIC",298:"PASTE.TOOL",302:"WORKBOOK.NEW",305:"SCENARIO.CELLS",306:"SCENARIO.DELETE",307:"SCENARIO.ADD",308:"SCENARIO.EDIT",309:"SCENARIO.SHOW",310:"SCENARIO.SHOW.NEXT",311:"SCENARIO.SUMMARY",312:"PIVOT.TABLE.WIZARD",313:"PIVOT.FIELD.PROPERTIES",314:"PIVOT.FIELD",315:"PIVOT.ITEM",316:"PIVOT.ADD.FIELDS",318:"OPTIONS.CALCULATION",319:"OPTIONS.EDIT",320:"OPTIONS.VIEW",321:"ADDIN.MANAGER",322:"MENU.EDITOR",323:"ATTACH.TOOLBARS",324:"VBAActivate",325:"OPTIONS.CHART",328:"VBA.INSERT.FILE",330:"VBA.PROCEDURE.DEFINITION",336:"ROUTING.SLIP",338:"ROUTE.DOCUMENT",339:"MAIL.LOGON",342:"INSERT.PICTURE",343:"EDIT.TOOL",344:"GALLERY.DOUGHNUT",350:"CHART.TREND",352:"PIVOT.ITEM.PROPERTIES",354:"WORKBOOK.INSERT",355:"OPTIONS.TRANSITION",356:"OPTIONS.GENERAL",370:"FILTER.ADVANCED",373:"MAIL.ADD.MAILER",374:"MAIL.DELETE.MAILER",375:"MAIL.REPLY",376:"MAIL.REPLY.ALL",377:"MAIL.FORWARD",378:"MAIL.NEXT.LETTER",379:"DATA.LABEL",380:"INSERT.TITLE",381:"FONT.PROPERTIES",382:"MACRO.OPTIONS",383:"WORKBOOK.HIDE",384:"WORKBOOK.UNHIDE",385:"WORKBOOK.DELETE",386:"WORKBOOK.NAME",388:"GALLERY.CUSTOM",390:"ADD.CHART.AUTOFORMAT",391:"DELETE.CHART.AUTOFORMAT",392:"CHART.ADD.DATA",393:"AUTO.OUTLINE",394:"TAB.ORDER",395:"SHOW.DIALOG",396:"SELECT.ALL",397:"UNGROUP.SHEETS",398:"SUBTOTAL.CREATE",399:"SUBTOTAL.REMOVE",400:"RENAME.OBJECT",412:"WORKBOOK.SCROLL",413:"WORKBOOK.NEXT",414:"WORKBOOK.PREV",415:"WORKBOOK.TAB.SPLIT",416:"FULL.SCREEN",417:"WORKBOOK.PROTECT",420:"SCROLLBAR.PROPERTIES",421:"PIVOT.SHOW.PAGES",422:"TEXT.TO.COLUMNS",423:"FORMAT.CHARTTYPE",424:"LINK.FORMAT",425:"TRACER.DISPLAY",430:"TRACER.NAVIGATE",431:"TRACER.CLEAR",432:"TRACER.ERROR",433:"PIVOT.FIELD.GROUP",434:"PIVOT.FIELD.UNGROUP",435:"CHECKBOX.PROPERTIES",436:"LABEL.PROPERTIES",437:"LISTBOX.PROPERTIES",438:"EDITBOX.PROPERTIES",439:"PIVOT.REFRESH",440:"LINK.COMBO",441:"OPEN.TEXT",442:"HIDE.DIALOG",443:"SET.DIALOG.FOCUS",444:"ENABLE.OBJECT",445:"PUSHBUTTON.PROPERTIES",446:"SET.DIALOG.DEFAULT",447:"FILTER",448:"FILTER.SHOW.ALL",449:"CLEAR.OUTLINE",450:"FUNCTION.WIZARD",451:"ADD.LIST.ITEM",452:"SET.LIST.ITEM",453:"REMOVE.LIST.ITEM",454:"SELECT.LIST.ITEM",455:"SET.CONTROL.VALUE",456:"SAVE.COPY.AS",458:"OPTIONS.LISTS.ADD",459:"OPTIONS.LISTS.DELETE",460:"SERIES.AXES",461:"SERIES.X",462:"SERIES.Y",463:"ERRORBAR.X",464:"ERRORBAR.Y",465:"FORMAT.CHART",466:"SERIES.ORDER",467:"MAIL.LOGOFF",468:"CLEAR.ROUTING.SLIP",469:"APP.ACTIVATE.MICROSOFT",470:"MAIL.EDIT.MAILER",471:"ON.SHEET",472:"STANDARD.WIDTH",473:"SCENARIO.MERGE",474:"SUMMARY.INFO",475:"FIND.FILE",476:"ACTIVE.CELL.FONT",477:"ENABLE.TIPWIZARD",478:"VBA.MAKE.ADDIN",480:"INSERTDATATABLE",481:"WORKGROUP.OPTIONS",482:"MAIL.SEND.MAILER",485:"AUTOCORRECT",489:"POST.DOCUMENT",491:"PICKLIST",493:"VIEW.SHOW",494:"VIEW.DEFINE",495:"VIEW.DELETE",509:"SHEET.BACKGROUND",510:"INSERT.MAP.OBJECT",511:"OPTIONS.MENONO",517:"MSOCHECKS",518:"NORMAL",519:"LAYOUT",520:"RM.PRINT.AREA",521:"CLEAR.PRINT.AREA",522:"ADD.PRINT.AREA",523:"MOVE.BRK",545:"HIDECURR.NOTE",546:"HIDEALL.NOTES",547:"DELETE.NOTE",548:"TRAVERSE.NOTES",549:"ACTIVATE.NOTES",620:"PROTECT.REVISIONS",621:"UNPROTECT.REVISIONS",647:"OPTIONS.ME",653:"WEB.PUBLISH",667:"NEWWEBQUERY",673:"PIVOT.TABLE.CHART",753:"OPTIONS.SAVE",755:"OPTIONS.SPELL",808:"HIDEALL.INKANNOTS"},oo={0:"COUNT",1:"IF",2:"ISNA",3:"ISERROR",4:"SUM",5:"AVERAGE",6:"MIN",7:"MAX",8:"ROW",9:"COLUMN",10:"NA",11:"NPV",12:"STDEV",13:"DOLLAR",14:"FIXED",15:"SIN",16:"COS",17:"TAN",18:"ATAN",19:"PI",20:"SQRT",21:"EXP",22:"LN",23:"LOG10",24:"ABS",25:"INT",26:"SIGN",27:"ROUND",28:"LOOKUP",29:"INDEX",30:"REPT",31:"MID",32:"LEN",33:"VALUE",34:"TRUE",35:"FALSE",36:"AND",37:"OR",38:"NOT",39:"MOD",40:"DCOUNT",41:"DSUM",42:"DAVERAGE",43:"DMIN",44:"DMAX",45:"DSTDEV",46:"VAR",47:"DVAR",48:"TEXT",49:"LINEST",50:"TREND",51:"LOGEST",52:"GROWTH",53:"GOTO",54:"HALT",55:"RETURN",56:"PV",57:"FV",58:"NPER",59:"PMT",60:"RATE",61:"MIRR",62:"IRR",63:"RAND",64:"MATCH",65:"DATE",66:"TIME",67:"DAY",68:"MONTH",69:"YEAR",70:"WEEKDAY",71:"HOUR",72:"MINUTE",73:"SECOND",74:"NOW",75:"AREAS",76:"ROWS",77:"COLUMNS",78:"OFFSET",79:"ABSREF",80:"RELREF",81:"ARGUMENT",82:"SEARCH",83:"TRANSPOSE",84:"ERROR",85:"STEP",86:"TYPE",87:"ECHO",88:"SET.NAME",89:"CALLER",90:"DEREF",91:"WINDOWS",92:"SERIES",93:"DOCUMENTS",94:"ACTIVE.CELL",95:"SELECTION",96:"RESULT",97:"ATAN2",98:"ASIN",99:"ACOS",100:"CHOOSE",101:"HLOOKUP",102:"VLOOKUP",103:"LINKS",104:"INPUT",105:"ISREF",106:"GET.FORMULA",107:"GET.NAME",108:"SET.VALUE",109:"LOG",110:"EXEC",111:"CHAR",112:"LOWER",113:"UPPER",114:"PROPER",115:"LEFT",116:"RIGHT",117:"EXACT",118:"TRIM",119:"REPLACE",120:"SUBSTITUTE",121:"CODE",122:"NAMES",123:"DIRECTORY",124:"FIND",125:"CELL",126:"ISERR",127:"ISTEXT",128:"ISNUMBER",129:"ISBLANK",130:"T",131:"N",132:"FOPEN",133:"FCLOSE",134:"FSIZE",135:"FREADLN",136:"FREAD",137:"FWRITELN",138:"FWRITE",139:"FPOS",140:"DATEVALUE",141:"TIMEVALUE",142:"SLN",143:"SYD",144:"DDB",145:"GET.DEF",146:"REFTEXT",147:"TEXTREF",148:"INDIRECT",149:"REGISTER",150:"CALL",151:"ADD.BAR",152:"ADD.MENU",153:"ADD.COMMAND",154:"ENABLE.COMMAND",155:"CHECK.COMMAND",156:"RENAME.COMMAND",157:"SHOW.BAR",158:"DELETE.MENU",159:"DELETE.COMMAND",160:"GET.CHART.ITEM",161:"DIALOG.BOX",162:"CLEAN",163:"MDETERM",164:"MINVERSE",165:"MMULT",166:"FILES",167:"IPMT",168:"PPMT",169:"COUNTA",170:"CANCEL.KEY",171:"FOR",172:"WHILE",173:"BREAK",174:"NEXT",175:"INITIATE",176:"REQUEST",177:"POKE",178:"EXECUTE",179:"TERMINATE",180:"RESTART",181:"HELP",182:"GET.BAR",183:"PRODUCT",184:"FACT",185:"GET.CELL",186:"GET.WORKSPACE",187:"GET.WINDOW",188:"GET.DOCUMENT",189:"DPRODUCT",190:"ISNONTEXT",191:"GET.NOTE",192:"NOTE",193:"STDEVP",194:"VARP",195:"DSTDEVP",196:"DVARP",197:"TRUNC",198:"ISLOGICAL",199:"DCOUNTA",200:"DELETE.BAR",201:"UNREGISTER",204:"USDOLLAR",205:"FINDB",206:"SEARCHB",207:"REPLACEB",208:"LEFTB",209:"RIGHTB",210:"MIDB",211:"LENB",212:"ROUNDUP",213:"ROUNDDOWN",214:"ASC",215:"DBCS",216:"RANK",219:"ADDRESS",220:"DAYS360",221:"TODAY",222:"VDB",223:"ELSE",224:"ELSE.IF",225:"END.IF",226:"FOR.CELL",227:"MEDIAN",228:"SUMPRODUCT",229:"SINH",230:"COSH",231:"TANH",232:"ASINH",233:"ACOSH",234:"ATANH",235:"DGET",236:"CREATE.OBJECT",237:"VOLATILE",238:"LAST.ERROR",239:"CUSTOM.UNDO",240:"CUSTOM.REPEAT",241:"FORMULA.CONVERT",242:"GET.LINK.INFO",243:"TEXT.BOX",244:"INFO",245:"GROUP",246:"GET.OBJECT",247:"DB",248:"PAUSE",251:"RESUME",252:"FREQUENCY",253:"ADD.TOOLBAR",254:"DELETE.TOOLBAR",255:"User",256:"RESET.TOOLBAR",257:"EVALUATE",258:"GET.TOOLBAR",259:"GET.TOOL",260:"SPELLING.CHECK",261:"ERROR.TYPE",262:"APP.TITLE",263:"WINDOW.TITLE",264:"SAVE.TOOLBAR",265:"ENABLE.TOOL",266:"PRESS.TOOL",267:"REGISTER.ID",268:"GET.WORKBOOK",269:"AVEDEV",270:"BETADIST",271:"GAMMALN",272:"BETAINV",273:"BINOMDIST",274:"CHIDIST",275:"CHIINV",276:"COMBIN",277:"CONFIDENCE",278:"CRITBINOM",279:"EVEN",280:"EXPONDIST",281:"FDIST",282:"FINV",283:"FISHER",284:"FISHERINV",285:"FLOOR",286:"GAMMADIST",287:"GAMMAINV",288:"CEILING",289:"HYPGEOMDIST",290:"LOGNORMDIST",291:"LOGINV",292:"NEGBINOMDIST",293:"NORMDIST",294:"NORMSDIST",295:"NORMINV",296:"NORMSINV",297:"STANDARDIZE",298:"ODD",299:"PERMUT",300:"POISSON",301:"TDIST",302:"WEIBULL",303:"SUMXMY2",304:"SUMX2MY2",305:"SUMX2PY2",306:"CHITEST",307:"CORREL",308:"COVAR",309:"FORECAST",310:"FTEST",311:"INTERCEPT",312:"PEARSON",313:"RSQ",314:"STEYX",315:"SLOPE",316:"TTEST",317:"PROB",318:"DEVSQ",319:"GEOMEAN",320:"HARMEAN",321:"SUMSQ",322:"KURT",323:"SKEW",324:"ZTEST",325:"LARGE",326:"SMALL",327:"QUARTILE",328:"PERCENTILE",329:"PERCENTRANK",330:"MODE",331:"TRIMMEAN",332:"TINV",334:"MOVIE.COMMAND",335:"GET.MOVIE",336:"CONCATENATE",337:"POWER",338:"PIVOT.ADD.DATA",339:"GET.PIVOT.TABLE",340:"GET.PIVOT.FIELD",341:"GET.PIVOT.ITEM",342:"RADIANS",343:"DEGREES",344:"SUBTOTAL",345:"SUMIF",346:"COUNTIF",347:"COUNTBLANK",348:"SCENARIO.GET",349:"OPTIONS.LISTS.GET",350:"ISPMT",351:"DATEDIF",352:"DATESTRING",353:"NUMBERSTRING",354:"ROMAN",355:"OPEN.DIALOG",356:"SAVE.DIALOG",357:"VIEW.GET",358:"GETPIVOTDATA",359:"HYPERLINK",360:"PHONETIC",361:"AVERAGEA",362:"MAXA",363:"MINA",364:"STDEVPA",365:"VARPA",366:"STDEVA",367:"VARA",368:"BAHTTEXT",369:"THAIDAYOFWEEK",370:"THAIDIGIT",371:"THAIMONTHOFYEAR",372:"THAINUMSOUND",373:"THAINUMSTRING",374:"THAISTRINGLENGTH",375:"ISTHAIDIGIT",376:"ROUNDBAHTDOWN",377:"ROUNDBAHTUP",378:"THAIYEAR",379:"RTD",380:"CUBEVALUE",381:"CUBEMEMBER",382:"CUBEMEMBERPROPERTY",383:"CUBERANKEDMEMBER",384:"HEX2BIN",385:"HEX2DEC",386:"HEX2OCT",387:"DEC2BIN",388:"DEC2HEX",389:"DEC2OCT",390:"OCT2BIN",391:"OCT2HEX",392:"OCT2DEC",393:"BIN2DEC",394:"BIN2OCT",395:"BIN2HEX",396:"IMSUB",397:"IMDIV",398:"IMPOWER",399:"IMABS",400:"IMSQRT",401:"IMLN",402:"IMLOG2",403:"IMLOG10",404:"IMSIN",405:"IMCOS",406:"IMEXP",407:"IMARGUMENT",408:"IMCONJUGATE",409:"IMAGINARY",410:"IMREAL",411:"COMPLEX",412:"IMSUM",413:"IMPRODUCT",414:"SERIESSUM",415:"FACTDOUBLE",416:"SQRTPI",417:"QUOTIENT",418:"DELTA",419:"GESTEP",420:"ISEVEN",421:"ISODD",422:"MROUND",423:"ERF",424:"ERFC",425:"BESSELJ",426:"BESSELK",427:"BESSELY",428:"BESSELI",429:"XIRR",430:"XNPV",431:"PRICEMAT",432:"YIELDMAT",433:"INTRATE",434:"RECEIVED",435:"DISC",436:"PRICEDISC",437:"YIELDDISC",438:"TBILLEQ",439:"TBILLPRICE",440:"TBILLYIELD",441:"PRICE",442:"YIELD",443:"DOLLARDE",444:"DOLLARFR",445:"NOMINAL",446:"EFFECT",447:"CUMPRINC",448:"CUMIPMT",449:"EDATE",450:"EOMONTH",451:"YEARFRAC",452:"COUPDAYBS",453:"COUPDAYS",454:"COUPDAYSNC",455:"COUPNCD",456:"COUPNUM",457:"COUPPCD",458:"DURATION",459:"MDURATION",460:"ODDLPRICE",461:"ODDLYIELD",462:"ODDFPRICE",463:"ODDFYIELD",464:"RANDBETWEEN",465:"WEEKNUM",466:"AMORDEGRC",467:"AMORLINC",468:"CONVERT",724:"SHEETJS",469:"ACCRINT",470:"ACCRINTM",471:"WORKDAY",472:"NETWORKDAYS",473:"GCD",474:"MULTINOMIAL",475:"LCM",476:"FVSCHEDULE",477:"CUBEKPIMEMBER",478:"CUBESET",479:"CUBESETCOUNT",480:"IFERROR",481:"COUNTIFS",482:"SUMIFS",483:"AVERAGEIF",484:"AVERAGEIFS"},lo={2:1,3:1,10:0,15:1,16:1,17:1,18:1,19:0,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:2,30:2,31:3,32:1,33:1,34:0,35:0,38:1,39:2,40:3,41:3,42:3,43:3,44:3,45:3,47:3,48:2,53:1,61:3,63:0,65:3,66:3,67:1,68:1,69:1,70:1,71:1,72:1,73:1,74:0,75:1,76:1,77:1,79:2,80:2,83:1,85:0,86:1,89:0,90:1,94:0,95:0,97:2,98:1,99:1,101:3,102:3,105:1,106:1,108:2,111:1,112:1,113:1,114:1,117:2,118:1,119:4,121:1,126:1,127:1,128:1,129:1,130:1,131:1,133:1,134:1,135:1,136:2,137:2,138:2,140:1,141:1,142:3,143:4,144:4,161:1,162:1,163:1,164:1,165:2,172:1,175:2,176:2,177:3,178:2,179:1,184:1,186:1,189:3,190:1,195:3,196:3,197:1,198:1,199:3,201:1,207:4,210:3,211:1,212:2,213:2,214:1,215:1,225:0,229:1,230:1,231:1,232:1,233:1,234:1,235:3,244:1,247:4,252:2,257:1,261:1,271:1,273:4,274:2,275:2,276:2,277:3,278:3,279:1,280:3,281:3,282:3,283:1,284:1,285:2,286:4,287:3,288:2,289:4,290:3,291:3,292:3,293:4,294:1,295:3,296:1,297:3,298:1,299:2,300:3,301:3,302:4,303:2,304:2,305:2,306:2,307:2,308:2,309:3,310:2,311:2,312:2,313:2,314:2,315:2,316:4,325:2,326:2,327:2,328:2,331:2,332:2,337:2,342:1,343:1,346:2,347:1,350:4,351:3,352:1,353:2,360:1,368:1,369:1,370:1,371:1,372:1,373:1,374:1,375:1,376:1,377:1,378:1,382:3,385:1,392:1,393:1,396:2,397:2,398:2,399:1,400:1,401:1,402:1,403:1,404:1,405:1,406:1,407:1,408:1,409:1,410:1,414:4,415:1,416:1,417:2,420:1,421:1,422:2,424:1,425:2,426:2,427:2,428:2,430:3,438:3,439:3,440:3,443:2,444:2,445:2,446:2,447:6,448:6,449:2,450:2,464:2,468:3,476:2,479:1,480:2,65535:0},co={"_xlfn.ACOT":"ACOT","_xlfn.ACOTH":"ACOTH","_xlfn.AGGREGATE":"AGGREGATE","_xlfn.ARABIC":"ARABIC","_xlfn.AVERAGEIF":"AVERAGEIF","_xlfn.AVERAGEIFS":"AVERAGEIFS","_xlfn.BASE":"BASE","_xlfn.BETA.DIST":"BETA.DIST","_xlfn.BETA.INV":"BETA.INV","_xlfn.BINOM.DIST":"BINOM.DIST","_xlfn.BINOM.DIST.RANGE":"BINOM.DIST.RANGE","_xlfn.BINOM.INV":"BINOM.INV","_xlfn.BITAND":"BITAND","_xlfn.BITLSHIFT":"BITLSHIFT","_xlfn.BITOR":"BITOR","_xlfn.BITRSHIFT":"BITRSHIFT","_xlfn.BITXOR":"BITXOR","_xlfn.CEILING.MATH":"CEILING.MATH","_xlfn.CEILING.PRECISE":"CEILING.PRECISE","_xlfn.CHISQ.DIST":"CHISQ.DIST","_xlfn.CHISQ.DIST.RT":"CHISQ.DIST.RT","_xlfn.CHISQ.INV":"CHISQ.INV","_xlfn.CHISQ.INV.RT":"CHISQ.INV.RT","_xlfn.CHISQ.TEST":"CHISQ.TEST","_xlfn.COMBINA":"COMBINA","_xlfn.CONCAT":"CONCAT","_xlfn.CONFIDENCE.NORM":"CONFIDENCE.NORM","_xlfn.CONFIDENCE.T":"CONFIDENCE.T","_xlfn.COT":"COT","_xlfn.COTH":"COTH","_xlfn.COUNTIFS":"COUNTIFS","_xlfn.COVARIANCE.P":"COVARIANCE.P","_xlfn.COVARIANCE.S":"COVARIANCE.S","_xlfn.CSC":"CSC","_xlfn.CSCH":"CSCH","_xlfn.DAYS":"DAYS","_xlfn.DECIMAL":"DECIMAL","_xlfn.ECMA.CEILING":"ECMA.CEILING","_xlfn.ERF.PRECISE":"ERF.PRECISE","_xlfn.ERFC.PRECISE":"ERFC.PRECISE","_xlfn.EXPON.DIST":"EXPON.DIST","_xlfn.F.DIST":"F.DIST","_xlfn.F.DIST.RT":"F.DIST.RT","_xlfn.F.INV":"F.INV","_xlfn.F.INV.RT":"F.INV.RT","_xlfn.F.TEST":"F.TEST","_xlfn.FILTERXML":"FILTERXML","_xlfn.FLOOR.MATH":"FLOOR.MATH","_xlfn.FLOOR.PRECISE":"FLOOR.PRECISE","_xlfn.FORECAST.ETS":"FORECAST.ETS","_xlfn.FORECAST.ETS.CONFINT":"FORECAST.ETS.CONFINT","_xlfn.FORECAST.ETS.SEASONALITY":"FORECAST.ETS.SEASONALITY","_xlfn.FORECAST.ETS.STAT":"FORECAST.ETS.STAT","_xlfn.FORECAST.LINEAR":"FORECAST.LINEAR","_xlfn.FORMULATEXT":"FORMULATEXT","_xlfn.GAMMA":"GAMMA","_xlfn.GAMMA.DIST":"GAMMA.DIST","_xlfn.GAMMA.INV":"GAMMA.INV","_xlfn.GAMMALN.PRECISE":"GAMMALN.PRECISE","_xlfn.GAUSS":"GAUSS","_xlfn.HYPGEOM.DIST":"HYPGEOM.DIST","_xlfn.IFERROR":"IFERROR","_xlfn.IFNA":"IFNA","_xlfn.IFS":"IFS","_xlfn.IMCOSH":"IMCOSH","_xlfn.IMCOT":"IMCOT","_xlfn.IMCSC":"IMCSC","_xlfn.IMCSCH":"IMCSCH","_xlfn.IMSEC":"IMSEC","_xlfn.IMSECH":"IMSECH","_xlfn.IMSINH":"IMSINH","_xlfn.IMTAN":"IMTAN","_xlfn.ISFORMULA":"ISFORMULA","_xlfn.ISO.CEILING":"ISO.CEILING","_xlfn.ISOWEEKNUM":"ISOWEEKNUM","_xlfn.LOGNORM.DIST":"LOGNORM.DIST","_xlfn.LOGNORM.INV":"LOGNORM.INV","_xlfn.MAXIFS":"MAXIFS","_xlfn.MINIFS":"MINIFS","_xlfn.MODE.MULT":"MODE.MULT","_xlfn.MODE.SNGL":"MODE.SNGL","_xlfn.MUNIT":"MUNIT","_xlfn.NEGBINOM.DIST":"NEGBINOM.DIST","_xlfn.NETWORKDAYS.INTL":"NETWORKDAYS.INTL","_xlfn.NIGBINOM":"NIGBINOM","_xlfn.NORM.DIST":"NORM.DIST","_xlfn.NORM.INV":"NORM.INV","_xlfn.NORM.S.DIST":"NORM.S.DIST","_xlfn.NORM.S.INV":"NORM.S.INV","_xlfn.NUMBERVALUE":"NUMBERVALUE","_xlfn.PDURATION":"PDURATION","_xlfn.PERCENTILE.EXC":"PERCENTILE.EXC","_xlfn.PERCENTILE.INC":"PERCENTILE.INC","_xlfn.PERCENTRANK.EXC":"PERCENTRANK.EXC","_xlfn.PERCENTRANK.INC":"PERCENTRANK.INC","_xlfn.PERMUTATIONA":"PERMUTATIONA","_xlfn.PHI":"PHI","_xlfn.POISSON.DIST":"POISSON.DIST","_xlfn.QUARTILE.EXC":"QUARTILE.EXC","_xlfn.QUARTILE.INC":"QUARTILE.INC","_xlfn.QUERYSTRING":"QUERYSTRING","_xlfn.RANK.AVG":"RANK.AVG","_xlfn.RANK.EQ":"RANK.EQ","_xlfn.RRI":"RRI","_xlfn.SEC":"SEC","_xlfn.SECH":"SECH","_xlfn.SHEET":"SHEET","_xlfn.SHEETS":"SHEETS","_xlfn.SKEW.P":"SKEW.P","_xlfn.STDEV.P":"STDEV.P","_xlfn.STDEV.S":"STDEV.S","_xlfn.SUMIFS":"SUMIFS","_xlfn.SWITCH":"SWITCH","_xlfn.T.DIST":"T.DIST","_xlfn.T.DIST.2T":"T.DIST.2T","_xlfn.T.DIST.RT":"T.DIST.RT","_xlfn.T.INV":"T.INV","_xlfn.T.INV.2T":"T.INV.2T","_xlfn.T.TEST":"T.TEST","_xlfn.TEXTJOIN":"TEXTJOIN","_xlfn.UNICHAR":"UNICHAR","_xlfn.UNICODE":"UNICODE","_xlfn.VAR.P":"VAR.P","_xlfn.VAR.S":"VAR.S","_xlfn.WEBSERVICE":"WEBSERVICE","_xlfn.WEIBULL.DIST":"WEIBULL.DIST","_xlfn.WORKDAY.INTL":"WORKDAY.INTL","_xlfn.XOR":"XOR","_xlfn.Z.TEST":"Z.TEST"};function fo(e){return"of:"==e.slice(0,3)&&(e=e.slice(3)),61==e.charCodeAt(0)&&61==(e=e.slice(1)).charCodeAt(0)&&(e=e.slice(1)),(e=(e=(e=e.replace(/COM\.MICROSOFT\./g,"")).replace(/\[((?:\.[A-Z]+[0-9]+)(?::\.[A-Z]+[0-9]+)?)\]/g,function(e,t){return t.replace(/\./g,"")})).replace(/\[.(#[A-Z]*[?!])\]/g,"$1")).replace(/[;~]/g,",").replace(/\|/g,";")}function ho(e){return("of:="+e.replace(ui,"$1[.$2$3$4$5]").replace(/\]:\[/g,":")).replace(/;/g,"|").replace(/,/g,";")}function uo(e){var t=e.split(":");return[t[0].split(".")[0],t[0].split(".")[1]+(t.length>1?":"+(t[1].split(".")[1]||t[1].split(".")[0]):"")]}function po(e){return e.replace(/\./,"!")}var go={},mo={};Zr.WS=["http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet","http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet"];var vo="undefined"!=typeof Map;function bo(e,t,r){var n=0,a=e.length;if(r){if(vo?r.has(t):Object.prototype.hasOwnProperty.call(r,t))for(var s=vo?r.get(t):r[t];n-1?(r.width=Cs(n),r.customWidth=1):null!=t.width&&(r.width=t.width),t.hidden&&(r.hidden=!0),null!=t.level&&(r.outlineLevel=r.level=t.level),r}function Co(e,t){if(e){var r=[.7,.7,.75,.75,.3,.3];"xlml"==t&&(r=[1,1,1,1,.5,.5]),null==e.left&&(e.left=r[0]),null==e.right&&(e.right=r[1]),null==e.top&&(e.top=r[2]),null==e.bottom&&(e.bottom=r[3]),null==e.header&&(e.header=r[4]),null==e.footer&&(e.footer=r[5])}}function Eo(e,t,r){var n=r.revssf[null!=t.z?t.z:"General"],a=60,s=e.length;if(null==n&&r.ssf)for(;a<392;++a)if(null==r.ssf[a]){x.load(t.z,a),r.ssf[a]=t.z,r.revssf[t.z]=n=a;break}for(a=0;a!=s;++a)if(e[a].numFmtId===n)return a;return e[s]={numFmtId:n,fontId:0,fillId:0,borderId:0,xfId:0,applyNumberFormat:1},s}function So(e,t,r,n,a,s){try{n.cellNF&&(e.z=x._table[t])}catch(e){if(n.WTF)throw e}if("z"!==e.t||n.cellStyles){if("d"===e.t&&"string"==typeof e.v&&(e.v=q(e.v)),(!n||!1!==n.cellText)&&"z"!==e.t)try{if(null==x._table[t]&&x.load(F[t]||"General",t),"e"===e.t)e.w=e.w||Vr[e.v];else if(0===t)if("n"===e.t)(0|e.v)===e.v?e.w=x._general_int(e.v):e.w=x._general_num(e.v);else if("d"===e.t){var i=X(e.v);e.w=(0|i)===i?x._general_int(i):x._general_num(i)}else{if(void 0===e.v)return"";e.w=x._general(e.v,mo)}else"d"===e.t?e.w=x.format(t,X(e.v),mo):e.w=x.format(t,e.v,mo)}catch(e){if(n.WTF)throw e}if(n.cellStyles&&null!=r)try{e.s=s.Fills[r],e.s.fgColor&&e.s.fgColor.theme&&!e.s.fgColor.rgb&&(e.s.fgColor.rgb=ms(a.themeElements.clrScheme[e.s.fgColor.theme].rgb,e.s.fgColor.tint||0),n.WTF&&(e.s.fgColor.raw_rgb=a.themeElements.clrScheme[e.s.fgColor.theme].rgb)),e.s.bgColor&&e.s.bgColor.theme&&(e.s.bgColor.rgb=ms(a.themeElements.clrScheme[e.s.bgColor.theme].rgb,e.s.bgColor.tint||0),n.WTF&&(e.s.bgColor.raw_rgb=a.themeElements.clrScheme[e.s.bgColor.theme].rgb))}catch(e){if(n.WTF&&s.Fills)throw e}}}function _o(e,t,r){if(e&&e["!ref"]){var n=rr(e["!ref"]);if(n.e.c/g,Bo=/<(?:\w+:)?sheetData[^>]*>([\s\S]*)<\/(?:\w+:)?sheetData>/,To=/<(?:\w:)?hyperlink [^>]*>/gm,ko=/"(\w*:\w*)"/,yo=/<(?:\w:)?col\b[^>]*[\/]?>/g,xo=/<(?:\w:)?autoFilter[^>]*([\/]|>([\s\S]*)<\/(?:\w:)?autoFilter)>/g,Io=/<(?:\w:)?pageMargins[^>]*\/>/g,Ro=/<(?:\w:)?sheetPr\b(?:[^>a-z][^>]*)?\/>/,Oo=/<(?:\w:)?sheetPr[^>]*(?:[\/]|>([\s\S]*)<\/(?:\w:)?sheetPr)>/,Fo=/<(?:\w:)?sheetViews[^>]*(?:[\/]|>([\s\S]*)<\/(?:\w:)?sheetViews)>/;function Do(e,t,r,n){var a=Ee(e);r.Sheets[n]||(r.Sheets[n]={}),a.codeName&&(r.Sheets[n].CodeName=ke(Pe(a.codeName)))}var No=["objects","scenarios","selectLockedCells","selectUnlockedCells"],Po=["formatColumns","formatRows","formatCells","insertColumns","insertRows","insertHyperlinks","deleteColumns","deleteRows","sort","autoFilter","pivotTables"],Lo=/<(?:\w:)?sheetView(?:[^>a-z][^>]*)?\/?>/;function Mo(e,t,r,n){if(void 0===e.v&&"string"!=typeof e.f||"z"===e.t)return"";var a="",s=e.t,i=e.v;if("z"!==e.t)switch(e.t){case"b":a=e.v?"1":"0";break;case"n":a=""+e.v;break;case"e":a=Vr[e.v];break;case"d":n&&n.cellDates?a=q(e.v,-1).toISOString():((e=te(e)).t="n",a=""+(e.v=X(q(e.v)))),void 0===e.z&&(e.z=x._table[14]);break;default:a=e.v}var o=Qe("v",Ie(a)),l={r:t},c=Eo(n.cellXfs,e,n);switch(0!==c&&(l.s=c),e.t){case"n":case"z":break;case"d":l.t="d";break;case"b":l.t="b";break;case"e":l.t="e";break;default:if(null==e.v){delete e.t;break}if(e.v.length>32767)throw new Error("Text length must not exceed 32767 characters");if(n&&n.bookSST){o=Qe("v",""+bo(n.Strings,e.v,n.revStrings)),l.t="s";break}l.t="str"}if(e.t!=s&&(e.t=s,e.v=i),"string"==typeof e.f&&e.f){var f=e.F&&e.F.slice(0,t.length)==t?{t:"array",ref:e.F}:null;o=qe("f",Ie(e.f),f)+(null!=e.v?o:"")}return e.l&&r["!links"].push([t,e.l]),e.c&&r["!comments"].push([t,e.c]),qe("c",o,l)}var Uo,zo,Ho,Wo,Vo,Xo,Go,jo=(Uo=/<(?:\w+:)?c[ \/>]/,zo=/<\/(?:\w+:)?row>/,Ho=/r=["']([^"']*)["']/,Wo=/<(?:\w+:)?is>([\S\s]*?)<\/(?:\w+:)?is>/,Vo=/ref=["']([^"']*)["']/,Xo=Xe("v"),Go=Xe("f"),function(e,t,r,n,a,s){for(var i,o,l,c,f,h=0,u="",d=[],p=[],g=0,m=0,v=0,b="",w=0,C=0,E=0,S=0,_=Array.isArray(s.CellXf),A=[],B=[],T=Array.isArray(t),k=[],y={},I=!1,R=!!r.sheetStubs,O=e.split(zo),F=0,D=O.length;F!=D;++F){var N=(u=O[F].trim()).length;if(0!==N){var P=0;e:for(h=0;h":if("/"!=u[h-1]){++h;break e}if(r&&r.cellStyles){if(w=null!=(o=Ee(u.slice(P,h),!0)).r?parseInt(o.r,10):w+1,C=-1,r.sheetRows&&r.sheetRows=h)break;if(w=null!=(o=Ee(u.slice(P,h),!0)).r?parseInt(o.r,10):w+1,C=-1,!(r.sheetRows&&r.sheetRowsw-1&&(n.s.r=w-1),n.e.r":"")+u,null!=p&&2===p.length){for(g=0,b=p[1],m=0;m!=b.length&&!((v=b.charCodeAt(m)-64)<1||v>26);++m)g=26*g+v;C=--g}else++C;for(m=0;m!=u.length&&62!==u.charCodeAt(m);++m);if(++m,(o=Ee(u.slice(0,m),!0)).r||(o.r=qt({r:w-1,c:C})),i={t:""},null!=(p=(b=u.slice(m)).match(Xo))&&""!==p[1]&&(i.v=ke(p[1])),r.cellFormula){if(null!=(p=b.match(Go))&&""!==p[1]){if(i.f=ke(Pe(p[1])).replace(/\r\n/g,"\n"),r.xlfn||(i.f=mi(i.f)),p[0].indexOf('t="array"')>-1)i.F=(b.match(Vo)||[])[1],i.F.indexOf(":")>-1&&A.push([rr(i.F),i.F]);else if(p[0].indexOf('t="shared"')>-1){c=Ee(p[0]);var M=ke(Pe(p[1]));r.xlfn||(M=mi(M)),B[parseInt(c.si,10)]=[c,M,o.r]}}else(p=b.match(/]*\/>/))&&B[(c=Ee(p[0])).si]&&(i.f=gi(B[c.si][1],B[c.si][2],o.r));var U=Jt(o.r);for(m=0;m=A[m][0].s.r&&U.r<=A[m][0].e.r&&U.c>=A[m][0].s.c&&U.c<=A[m][0].e.c&&(i.F=A[m][1])}if(null==o.t&&void 0===i.v)if(i.f||i.F)i.v=0,i.t="n";else{if(!R)continue;i.t="z"}else i.t=o.t||"n";switch(n.s.c>C&&(n.s.c=C),n.e.c0&&(t["!rows"]=k)}),Ko=qe("worksheet",null,{xmlns:nt.main[0],"xmlns:r":nt.r});function $o(e,t,r,n){var a,s=[me,Ko],i=r.SheetNames[e],o="",l=r.Sheets[i];null==l&&(l={});var c=l["!ref"]||"A1",f=rr(c);if(f.e.c>16383||f.e.r>1048575){if(t.WTF)throw new Error("Range "+c+" exceeds format limit A1:XFD1048576");f.e.c=Math.min(f.e.c,16383),f.e.r=Math.min(f.e.c,1048575),c=tr(f)}n||(n={}),l["!comments"]=[];var h=[];!function(e,t,r,n,a){var s=!1,i={},o=null;if("xlsx"!==n.bookType&&t.vbaraw){var l=t.SheetNames[r];try{t.Workbook&&(l=t.Workbook.Sheets[r].CodeName||l)}catch(e){}s=!0,i.codeName=Le(Ie(l))}if(e&&e["!outline"]){var c={summaryBelow:1,summaryRight:1};e["!outline"].above&&(c.summaryBelow=0),e["!outline"].left&&(c.summaryRight=0),o=(o||"")+qe("outlinePr",null,c)}(s||o)&&(a[a.length]=qe("sheetPr",o,i))}(l,r,e,t,s),s[s.length]=qe("dimension",null,{ref:c}),s[s.length]=function(e,t,r,n){var a={workbookViewId:"0"};return(((n||{}).Workbook||{}).Views||[])[0]&&(a.rightToLeft=n.Workbook.Views[0].RTL?"1":"0"),qe("sheetViews",qe("sheetView",null,a),{})}(0,0,0,r),t.sheetFormat&&(s[s.length]=qe("sheetFormatPr",null,{defaultRowHeight:t.sheetFormat.defaultRowHeight||"16",baseColWidth:t.sheetFormat.baseColWidth||"10",outlineLevelRow:t.sheetFormat.outlineLevelRow||"7"})),null!=l["!cols"]&&l["!cols"].length>0&&(s[s.length]=function(e,t){for(var r,n=[""],a=0;a!=t.length;++a)(r=t[a])&&(n[n.length]=qe("col",null,wo(a,r)));return n[n.length]="",n.join("")}(0,l["!cols"])),s[a=s.length]="",l["!links"]=[],null!=l["!ref"]&&(o=function(e,t){var r,n,a=[],s=[],i=rr(e["!ref"]),o="",l="",c=[],f=0,h=0,u=e["!rows"],d=Array.isArray(e),p={r:l},g=-1;for(h=i.s.c;h<=i.e.c;++h)c[h]=Qt(h);for(f=i.s.r;f<=i.e.r;++f){for(s=[],l=Yt(f),h=i.s.c;h<=i.e.c;++h){r=c[h]+l;var m=d?(e[f]||[])[h]:e[r];void 0!==m&&null!=(o=Mo(m,r,e,t))&&s.push(o)}(s.length>0||u&&u[f])&&(p={r:l},u&&u[f]&&((n=u[f]).hidden&&(p.hidden=1),g=-1,n.hpx?g=Bs(n.hpx):n.hpt&&(g=n.hpt),g>-1&&(p.ht=g,p.customHeight=1),n.level&&(p.outlineLevel=n.level)),a[a.length]=qe("row",s.join(""),p))}if(u)for(;f-1&&(p.ht=g,p.customHeight=1),n.level&&(p.outlineLevel=n.level),a[a.length]=qe("row","",p));return a.join("")}(l,t),o.length>0&&(s[s.length]=o)),s.length>a+1&&(s[s.length]="",s[a]=s[a].replace("/>",">")),l["!protect"]&&(s[s.length]=function(e){var t={sheet:1};return No.forEach(function(r){null!=e[r]&&e[r]&&(t[r]="1")}),Po.forEach(function(r){null==e[r]||e[r]||(t[r]="0")}),e.password&&(t.password=ls(e.password).toString(16).toUpperCase()),qe("sheetProtection",null,t)}(l["!protect"])),null!=l["!autofilter"]&&(s[s.length]=function(e,t,r,n){var a="string"==typeof e.ref?e.ref:tr(e.ref);r.Workbook||(r.Workbook={Sheets:[]}),r.Workbook.Names||(r.Workbook.Names=[]);var s=r.Workbook.Names,i=er(a);i.s.r==i.e.r&&(i.e.r=er(t["!ref"]).e.r,a=tr(i));for(var o=0;o0&&(s[s.length]=function(e){if(0===e.length)return"";for(var t='',r=0;r!=e.length;++r)t+='';return t+""}(l["!merges"]));var u,d,p=-1,g=-1;return l["!links"].length>0&&(s[s.length]="",l["!links"].forEach(function(e){e[1].Target&&(u={ref:e[0]},"#"!=e[1].Target.charAt(0)&&(g=rn(n,-1,Ie(e[1].Target).replace(/#.*$/,""),Zr.HLINK),u["r:id"]="rId"+g),(p=e[1].Target.indexOf("#"))>-1&&(u.location=Ie(e[1].Target.slice(p+1))),e[1].Tooltip&&(u.tooltip=Ie(e[1].Tooltip)),s[s.length]=qe("hyperlink",null,u))}),s[s.length]=""),delete l["!links"],null!=l["!margins"]&&(s[s.length]=(Co(d=l["!margins"]),qe("pageMargins",null,d))),t&&!t.ignoreEC&&null!=t.ignoreEC||(s[s.length]=Qe("ignoredErrors",qe("ignoredError",null,{numberStoredAsText:1,sqref:c}))),h.length>0&&(g=rn(n,-1,"../drawings/drawing"+(e+1)+".xml",Zr.DRAW),s[s.length]=qe("drawing",null,{"r:id":"rId"+g}),l["!drawing"]=h),l["!comments"].length>0&&(g=rn(n,-1,"../drawings/vmlDrawing"+(e+1)+".vml",Zr.VML),s[s.length]=qe("legacyDrawing",null,{"r:id":"rId"+g}),l["!legacy"]=g),s.length>1&&(s[s.length]="",s[1]=s[1].replace("/>",">")),s.join("")}function Yo(e,t,r,n){var a=function(e,t,r){var n=zt(145),a=(r["!rows"]||[])[e]||{};n.write_shift(4,e),n.write_shift(4,0);var s=320;a.hpx?s=20*Bs(a.hpx):a.hpt&&(s=20*a.hpt),n.write_shift(2,s),n.write_shift(1,0);var i=0;a.level&&(i|=a.level),a.hidden&&(i|=16),(a.hpx||a.hpt)&&(i|=32),n.write_shift(1,i),n.write_shift(1,0);var o=0,l=n.l;n.l+=4;for(var c={r:e,c:0},f=0;f<16;++f)if(!(t.s.c>f+1<<10||t.e.cn.l?n.slice(0,n.l):n}(n,r,t);(a.length>17||(t["!rows"]||[])[n])&&Vt(e,"BrtRowHdr",a)}var Zo=kr,Qo=yr;function Jo(e){return[gr(e),xr(e),"n"]}var qo=kr,el=yr,tl=["left","right","top","bottom","header","footer"];function rl(e,t,r,n,a,s,i){if(void 0===t.v)return!1;var o="";switch(t.t){case"b":o=t.v?"1":"0";break;case"d":(t=te(t)).z=t.z||x._table[14],t.v=X(q(t.v)),t.t="n";break;case"n":case"e":o=""+t.v;break;default:o=t.v}var l={r:r,c:n};switch(l.s=Eo(a.cellXfs,t,a),t.l&&s["!links"].push([qt(l),t.l]),t.c&&s["!comments"].push([qt(l),t.c]),t.t){case"s":case"str":return a.bookSST?(o=bo(a.Strings,t.v,a.revStrings),l.t="s",l.v=o,i?Vt(e,"BrtShortIsst",function(e,t,r){return null==r&&(r=zt(8)),mr(t,r),r.write_shift(4,t.v),r}(0,l)):Vt(e,"BrtCellIsst",function(e,t,r){return null==r&&(r=zt(12)),pr(t,r),r.write_shift(4,t.v),r}(0,l))):(l.t="str",i?Vt(e,"BrtShortSt",function(e,t,r){return null==r&&(r=zt(8+4*e.v.length)),mr(t,r),cr(e.v,r),r.length>r.l?r.slice(0,r.l):r}(t,l)):Vt(e,"BrtCellSt",function(e,t,r){return null==r&&(r=zt(12+4*e.v.length)),pr(t,r),cr(e.v,r),r.length>r.l?r.slice(0,r.l):r}(t,l))),!0;case"n":return t.v==(0|t.v)&&t.v>-1e3&&t.v<1e3?i?Vt(e,"BrtShortRk",function(e,t,r){return null==r&&(r=zt(8)),mr(t,r),Br(e.v,r),r}(t,l)):Vt(e,"BrtCellRk",function(e,t,r){return null==r&&(r=zt(12)),pr(t,r),Br(e.v,r),r}(t,l)):i?Vt(e,"BrtShortReal",function(e,t,r){return null==r&&(r=zt(12)),mr(t,r),Ir(e.v,r),r}(t,l)):Vt(e,"BrtCellReal",function(e,t,r){return null==r&&(r=zt(16)),pr(t,r),Ir(e.v,r),r}(t,l)),!0;case"b":return l.t="b",i?Vt(e,"BrtShortBool",function(e,t,r){return null==r&&(r=zt(5)),mr(t,r),r.write_shift(1,e.v?1:0),r}(t,l)):Vt(e,"BrtCellBool",function(e,t,r){return null==r&&(r=zt(9)),pr(t,r),r.write_shift(1,e.v?1:0),r}(t,l)),!0;case"e":return l.t="e",i?Vt(e,"BrtShortError",function(e,t,r){return null==r&&(r=zt(8)),mr(t,r),r.write_shift(1,e.v),r.write_shift(2,0),r.write_shift(1,0),r}(t,l)):Vt(e,"BrtCellError",function(e,t,r){return null==r&&(r=zt(9)),pr(t,r),r.write_shift(1,e.v),r}(t,l)),!0}return i?Vt(e,"BrtShortBlank",function(e,t,r){return null==r&&(r=zt(4)),mr(t,r)}(0,l)):Vt(e,"BrtCellBlank",function(e,t,r){return null==r&&(r=zt(8)),pr(t,r)}(0,l)),!0}function nl(e,t,r,n){var a=Wt(),s=r.SheetNames[e],i=r.Sheets[s]||{},o=s;try{r&&r.Workbook&&(o=r.Workbook.Sheets[e].CodeName||o)}catch(e){}var l=rr(i["!ref"]||"A1");if(l.e.c>16383||l.e.r>1048575){if(t.WTF)throw new Error("Range "+(i["!ref"]||"A1")+" exceeds format limit A1:XFD1048576");l.e.c=Math.min(l.e.c,16383),l.e.r=Math.min(l.e.c,1048575)}return i["!links"]=[],i["!comments"]=[],Vt(a,"BrtBeginSheet"),(r.vbaraw||i["!outline"])&&Vt(a,"BrtWsProp",function(e,t,r){null==r&&(r=zt(84+4*e.length));var n=192;t&&(t.above&&(n&=-65),t.left&&(n&=-129)),r.write_shift(1,n);for(var a=1;a<3;++a)r.write_shift(1,0);return Rr({auto:1},r),r.write_shift(-4,-1),r.write_shift(-4,-1),br(e,r),r.slice(0,r.l)}(o,i["!outline"])),Vt(a,"BrtWsDim",Qo(l)),function(e,t,r){Vt(e,"BrtBeginWsViews"),Vt(e,"BrtBeginWsView",function(e,t,r){null==r&&(r=zt(30));var n=924;return(((t||{}).Views||[])[0]||{}).RTL&&(n|=32),r.write_shift(2,n),r.write_shift(4,0),r.write_shift(4,0),r.write_shift(4,0),r.write_shift(1,0),r.write_shift(1,0),r.write_shift(2,0),r.write_shift(2,100),r.write_shift(2,0),r.write_shift(2,0),r.write_shift(2,0),r.write_shift(4,0),r}(0,r)),Vt(e,"BrtEndWsView"),Vt(e,"BrtEndWsViews")}(a,0,r.Workbook),function(e,t){t&&t["!cols"]&&(Vt(e,"BrtBeginColInfos"),t["!cols"].forEach(function(t,r){t&&Vt(e,"BrtColInfo",function(e,t,r){null==r&&(r=zt(18));var n=wo(e,t);r.write_shift(-4,e),r.write_shift(-4,e),r.write_shift(4,256*(n.width||10)),r.write_shift(4,0);var a=0;return t.hidden&&(a|=1),"number"==typeof n.width&&(a|=2),t.level&&(a|=t.level<<8),r.write_shift(2,a),r}(r,t))}),Vt(e,"BrtEndColInfos"))}(a,i),function(e,t,r,n){var a,s=rr(t["!ref"]||"A1"),i="",o=[];Vt(e,"BrtBeginSheetData");var l=Array.isArray(t),c=s.e.r;t["!rows"]&&(c=Math.max(s.e.r,t["!rows"].length-1));for(var f=s.s.r;f<=c;++f){i=Yt(f),Yo(e,t,s,f);var h=!1;if(f<=s.e.r)for(var u=s.s.c;u<=s.e.c;++u){f===s.s.r&&(o[u]=Qt(u)),a=o[u]+i;var d=l?(t[f]||[])[u]:t[a];h=!!d&&rl(e,d,f,u,n,t,h)}}Vt(e,"BrtEndSheetData")}(a,i,0,t),function(e,t){t["!protect"]&&Vt(e,"BrtSheetProtection",function(e,t){return null==t&&(t=zt(66)),t.write_shift(2,e.password?ls(e.password):0),t.write_shift(4,1),[["objects",!1],["scenarios",!1],["formatCells",!0],["formatColumns",!0],["formatRows",!0],["insertColumns",!0],["insertRows",!0],["insertHyperlinks",!0],["deleteColumns",!0],["deleteRows",!0],["selectLockedCells",!1],["sort",!0],["autoFilter",!0],["pivotTables",!0],["selectUnlockedCells",!1]].forEach(function(r){r[1]?t.write_shift(4,null==e[r[0]]||e[r[0]]?0:1):t.write_shift(4,null!=e[r[0]]&&e[r[0]]?0:1)}),t}(t["!protect"]))}(a,i),function(e,t,r,n){if(t["!autofilter"]){var a=t["!autofilter"],s="string"==typeof a.ref?a.ref:tr(a.ref);r.Workbook||(r.Workbook={Sheets:[]}),r.Workbook.Names||(r.Workbook.Names=[]);var i=r.Workbook.Names,o=er(s);o.s.r==o.e.r&&(o.e.r=er(t["!ref"]).e.r,s=tr(o));for(var l=0;l0){var a=rn(n,-1,"../drawings/vmlDrawing"+(r+1)+".vml",Zr.VML);Vt(e,"BrtLegacyDrawing",_r("rId"+a)),t["!legacy"]=a}}(a,i,e,n),Vt(a,"BrtEndSheet"),a.end()}Zr.CHART="http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart",Zr.CHARTEX="http://schemas.microsoft.com/office/2014/relationships/chartEx",Zr.CS="http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet",qe("chartsheet",null,{xmlns:nt.main[0],"xmlns:r":nt.r});var al=[["allowRefreshQuery",!1,"bool"],["autoCompressPictures",!0,"bool"],["backupFile",!1,"bool"],["checkCompatibility",!1,"bool"],["CodeName",""],["date1904",!1,"bool"],["defaultThemeVersion",0,"int"],["filterPrivacy",!1,"bool"],["hidePivotFieldList",!1,"bool"],["promptedSolutions",!1,"bool"],["publishItems",!1,"bool"],["refreshAllConnections",!1,"bool"],["saveExternalLinkValues",!0,"bool"],["showBorderUnselectedTables",!0,"bool"],["showInkAnnotation",!0,"bool"],["showObjects","all"],["showPivotChartFilter",!1,"bool"],["updateLinks","userSet"]],sl=[["activeTab",0,"int"],["autoFilterDateGrouping",!0,"bool"],["firstSheet",0,"int"],["minimized",!1,"bool"],["showHorizontalScroll",!0,"bool"],["showSheetTabs",!0,"bool"],["showVerticalScroll",!0,"bool"],["tabRatio",600,"int"],["visibility","visible"]],il=[],ol=[["calcCompleted","true"],["calcMode","auto"],["calcOnSave","true"],["concurrentCalc","true"],["fullCalcOnLoad","false"],["fullPrecision","true"],["iterate","false"],["iterateCount","100"],["iterateDelta","0.001"],["refMode","A1"]];function ll(e,t){for(var r=0;r!=e.length;++r)for(var n=e[r],a=0;a!=t.length;++a){var s=t[a];if(null==n[s[0]])n[s[0]]=s[1];else switch(s[2]){case"bool":"string"==typeof n[s[0]]&&(n[s[0]]=Ne(n[s[0]]));break;case"int":"string"==typeof n[s[0]]&&(n[s[0]]=parseInt(n[s[0]],10))}}}function cl(e,t){for(var r=0;r!=t.length;++r){var n=t[r];if(null==e[n[0]])e[n[0]]=n[1];else switch(n[2]){case"bool":"string"==typeof e[n[0]]&&(e[n[0]]=Ne(e[n[0]]));break;case"int":"string"==typeof e[n[0]]&&(e[n[0]]=parseInt(e[n[0]],10))}}}function fl(e){cl(e.WBProps,al),cl(e.CalcPr,ol),ll(e.WBView,sl),ll(e.Sheets,il),mo.date1904=Ne(e.WBProps.date1904)}var hl="][*?/\\".split("");function ul(e,t){if(e.length>31){if(t)return!1;throw new Error("Sheet names cannot exceed 31 chars")}var r=!0;return hl.forEach(function(n){if(-1!=e.indexOf(n)){if(!t)throw new Error("Sheet name cannot contain : \\ / ? * [ ]");r=!1}}),r}var dl=/<\w+:workbook/,pl=qe("workbook",null,{xmlns:nt.main[0],"xmlns:r":nt.r});function gl(e){var t=[me];t[t.length]=pl;var r=e.Workbook&&(e.Workbook.Names||[]).length>0,n={codeName:"ThisWorkbook"};e.Workbook&&e.Workbook.WBProps&&(al.forEach(function(t){null!=e.Workbook.WBProps[t[0]]&&e.Workbook.WBProps[t[0]]!=t[1]&&(n[t[0]]=e.Workbook.WBProps[t[0]])}),e.Workbook.WBProps.CodeName&&(n.codeName=e.Workbook.WBProps.CodeName,delete n.CodeName)),t[t.length]=qe("workbookPr",null,n);var a=e.Workbook&&e.Workbook.Sheets||[],s=0;if(a&&a[0]&&a[0].Hidden){for(t[t.length]="",s=0;s!=e.SheetNames.length&&a[s]&&a[s].Hidden;++s);s==e.SheetNames.length&&(s=0),t[t.length]='',t[t.length]=""}for(t[t.length]="",s=0;s!=e.SheetNames.length;++s){var i={name:Ie(e.SheetNames[s].slice(0,31))};if(i.sheetId=""+(s+1),i["r:id"]="rId"+(s+1),a[s])switch(a[s].Hidden){case 1:i.state="hidden";break;case 2:i.state="veryHidden"}t[t.length]=qe("sheet",null,i)}return t[t.length]="",r&&(t[t.length]="",e.Workbook&&e.Workbook.Names&&e.Workbook.Names.forEach(function(e){var r={name:e.Name};e.Comment&&(r.comment=e.Comment),null!=e.Sheet&&(r.localSheetId=""+e.Sheet),e.Hidden&&(r.hidden="1"),e.Ref&&(t[t.length]=qe("definedName",Ie(e.Ref),r))}),t[t.length]=""),t.length>2&&(t[t.length]="",t[1]=t[1].replace("/>",">")),t.join("")}function ml(e,t){return t||(t=zt(127)),t.write_shift(4,e.Hidden),t.write_shift(4,e.iTabID),_r(e.strRelID,t),cr(e.name.slice(0,31),t),t.length>t.l?t.slice(0,t.l):t}function vl(e,t){var r={};return e.read_shift(4),r.ArchID=e.read_shift(4),e.l+=t-8,r}function bl(e,r){var n=Wt();return Vt(n,"BrtBeginBook"),Vt(n,"BrtFileVersion",function(e,r){r||(r=zt(127));for(var n=0;4!=n;++n)r.write_shift(4,0);return cr("SheetJS",r),cr(t.version,r),cr(t.version,r),cr("7262",r),r.length>r.l?r.slice(0,r.l):r}()),Vt(n,"BrtWbProp",function(e,t){t||(t=zt(72));var r=0;return e&&e.filterPrivacy&&(r|=8),t.write_shift(4,r),t.write_shift(4,0),br(e&&e.CodeName||"ThisWorkbook",t),t.slice(0,t.l)}(e.Workbook&&e.Workbook.WBProps||null)),function(e,t){if(t.Workbook&&t.Workbook.Sheets){for(var r=t.Workbook.Sheets,n=0,a=-1,s=-1;na||(Vt(e,"BrtBeginBookViews"),Vt(e,"BrtBookView",function(e,t){return t||(t=zt(29)),t.write_shift(-4,0),t.write_shift(-4,460),t.write_shift(4,28800),t.write_shift(4,17600),t.write_shift(4,500),t.write_shift(4,e),t.write_shift(4,e),t.write_shift(1,120),t.length>t.l?t.slice(0,t.l):t}(a)),Vt(e,"BrtEndBookViews"))}}(n,e),function(e,t){Vt(e,"BrtBeginBundleShs");for(var r=0;r!=t.SheetNames.length;++r)Vt(e,"BrtBundleSh",ml({Hidden:t.Workbook&&t.Workbook.Sheets&&t.Workbook.Sheets[r]&&t.Workbook.Sheets[r].Hidden||0,iTabID:r+1,strRelID:"rId"+(r+1),name:t.SheetNames[r]}));Vt(e,"BrtEndBundleShs")}(n,e),Vt(n,"BrtEndBook"),n.end()}function wl(e,t,r,n,a,s,i,o){return".bin"===t.slice(-4)?function(e,t,r,n,a,s,i){if(!e)return e;var o=t||{};n||(n={"!id":{}});var l,c,f,h,u,d,p,g,m,v,b=o.dense?[]:{},w={s:{r:2e6,c:2e6},e:{r:0,c:0}},C=[],E=!1,S=!1,_=[];o.biff=12,o["!row"]=0;var A=0,B=!1,T=[],k={},y=o.supbooks||a.supbooks||[[]];if(y.sharedf=k,y.arrayf=T,y.SheetNames=a.SheetNames||a.Sheets.map(function(e){return e.name}),!o.supbooks&&(o.supbooks=y,a.Names))for(var I=0;I=D[0].s.r&&c.r<=D[0].e.r&&d>=D[0].s.c&&d<=D[0].e.c&&(f.F=tr(D[0]),B=!0)}!B&&e.length>3&&(f.f=e[3])}if(w.s.r>c.r&&(w.s.r=c.r),w.s.c>d&&(w.s.c=d),w.e.rc.r&&(w.s.r=c.r),w.s.c>d&&(w.s.c=d),w.e.r=e.s;)R[e.e--]={width:e.w/256,hidden:!!(1&e.flags),level:e.level},F||(F=!0,Ss(e.w/256)),_s(R[e.e+1]);break;case 161:b["!autofilter"]={ref:tr(e)};break;case 476:b["!margins"]=e;break;case 147:a.Sheets[r]||(a.Sheets[r]={}),e.name&&(a.Sheets[r].CodeName=e.name),(e.above||e.left)&&(b["!outline"]={above:e.above,left:e.left});break;case 137:a.Views||(a.Views=[{}]),a.Views[0]||(a.Views[0]={}),e.RTL&&(a.Views[0].RTL=!0);break;case 485:case 64:case 1053:case 151:case 152:case 175:case 644:case 625:case 562:case 396:case 1112:case 1146:case 471:case 1050:case 649:case 1105:case 49:case 589:case 607:case 564:case 1055:case 168:case 174:case 1180:case 499:case 507:case 550:case 171:case 167:case 1177:case 169:case 1181:case 551:case 552:case 661:case 639:case 478:case 537:case 477:case 536:case 1103:case 680:case 1104:case 1024:case 663:case 535:case 678:case 504:case 1043:case 428:case 170:case 3072:case 50:case 2070:case 1045:break;case 35:E=!0;break;case 36:E=!1;break;case 37:C.push(t),E=!0;break;case 38:C.pop(),E=!1;break;default:if((t||"").indexOf("Begin")>0);else if((t||"").indexOf("End")>0);else if(!E||o.WTF)throw new Error("Unexpected record "+I+" "+t)}},o),delete o.supbooks,delete o["!row"],!b["!ref"]&&(w.s.r<2e6||l&&(l.e.r>0||l.e.c>0||l.s.r>0||l.s.c>0))&&(b["!ref"]=tr(l||w)),o.sheetRows&&b["!ref"]){var D=rr(b["!ref"]);o.sheetRows<=+D.e.r&&(D.e.r=o.sheetRows-1,D.e.r>w.e.r&&(D.e.r=w.e.r),D.e.rw.e.c&&(D.e.c=w.e.c),D.e.c0&&(b["!merges"]=_),R.length>0&&(b["!cols"]=R),O.length>0&&(b["!rows"]=O),b}(e,n,r,a,s,i,o):function(e,t,r,n,a,s,i){if(!e)return e;n||(n={"!id":{}});var o=t.dense?[]:{},l={s:{r:2e6,c:2e6},e:{r:0,c:0}},c="",f="",h=e.match(Bo);h?(c=e.slice(0,h.index),f=e.slice(h.index+h[0].length)):c=f=e;var u=c.match(Ro);u?Do(u[0],0,a,r):(u=c.match(Oo))&&function(e,t,r,n,a){Do(e.slice(0,e.indexOf(">")),0,n,a)}(u[0],u[1],0,a,r);var d=(c.match(/<(?:\w*:)?dimension/)||{index:-1}).index;if(d>0){var p=c.slice(d,d+50).match(ko);p&&function(e,t){var r=rr(t);r.s.r<=r.e.r&&r.s.c<=r.e.c&&r.s.r>=0&&r.s.c>=0&&(e["!ref"]=tr(r))}(o,p[1])}var g=c.match(Fo);g&&g[1]&&function(e,t){t.Views||(t.Views=[{}]),(e.match(Lo)||[]).forEach(function(e,r){var n=Ee(e);t.Views[r]||(t.Views[r]={}),+n.zoomScale&&(t.Views[r].zoom=+n.zoomScale),Ne(n.rightToLeft)&&(t.Views[r].RTL=!0)})}(g[1],a);var m=[];if(t.cellStyles){var v=c.match(yo);v&&function(e,t){for(var r=!1,n=0;n!=t.length;++n){var a=Ee(t[n],!0);a.hidden&&(a.hidden=Ne(a.hidden));var s=parseInt(a.min,10)-1,i=parseInt(a.max,10)-1;for(a.outlineLevel&&(a.level=+a.outlineLevel||0),delete a.min,delete a.max,a.width=+a.width,!r&&a.width&&(r=!0,Ss(a.width)),_s(a);s<=i;)e[s++]=te(a)}}(m,v)}h&&jo(h[1],o,t,l,s,i);var b=f.match(xo);b&&(o["!autofilter"]=function(e){return{ref:(e.match(/ref="([^"]*)"/)||[])[1]}}(b[0]));var w=[],C=f.match(Ao);if(C)for(d=0;d!=C.length;++d)w[d]=rr(C[d].slice(C[d].indexOf('"')+1));var E=f.match(To);E&&function(e,t,r){for(var n=Array.isArray(e),a=0;a!=t.length;++a){var s=Ee(Pe(t[a]),!0);if(!s.ref)return;var i=((r||{})["!id"]||[])[s.id];i?(s.Target=i.Target,s.location&&(s.Target+="#"+ke(s.location))):(s.Target="#"+ke(s.location),i={Target:s.Target,TargetMode:"Internal"}),s.Rel=i,s.tooltip&&(s.Tooltip=s.tooltip,delete s.tooltip);for(var o=rr(s.ref),l=o.s.r;l<=o.e.r;++l)for(var c=o.s.c;c<=o.e.c;++c){var f=qt({c:c,r:l});n?(e[l]||(e[l]=[]),e[l][c]||(e[l][c]={t:"z",v:void 0}),e[l][c].l=s):(e[f]||(e[f]={t:"z",v:void 0}),e[f].l=s)}}}(o,E,n);var S=f.match(Io);if(S&&(o["!margins"]=function(e){var t={};return["left","right","top","bottom","header","footer"].forEach(function(r){e[r]&&(t[r]=parseFloat(e[r]))}),t}(Ee(S[0]))),!o["!ref"]&&l.e.c>=l.s.c&&l.e.r>=l.s.r&&(o["!ref"]=tr(l)),t.sheetRows>0&&o["!ref"]){var _=rr(o["!ref"]);t.sheetRows<=+_.e.r&&(_.e.r=t.sheetRows-1,_.e.r>l.e.r&&(_.e.r=l.e.r),_.e.r<_.s.r&&(_.s.r=_.e.r),_.e.c>l.e.c&&(_.e.c=l.e.c),_.e.c<_.s.c&&(_.s.c=_.e.c),o["!fullref"]=o["!ref"],o["!ref"]=tr(_))}return m.length>0&&(o["!cols"]=m),w.length>0&&(o["!merges"]=w),o}(e,n,r,a,s,i,o)}function Cl(e,t,r){return(".bin"===t.slice(-4)?bl:gl)(e,r)}function El(e,t,r,n,a){return(".bin"===t.slice(-4)?nl:$o)(e,r,n,a)}function Sl(e,t,r){return(".bin"===t.slice(-4)?qa:Qa)(e,r)}function _l(e,t,r){return(".bin"===t.slice(-4)?ci:oi)(e,r)}var Al=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g,Bl=/([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/;function Tl(e,t){var r=e.split(/\s+/),n=[];if(t||(n[0]=r[0]),1===r.length)return n;var a,s,i,o=e.match(Al);if(o)for(i=0;i!=o.length;++i)-1===(s=(a=o[i].match(Bl))[1].indexOf(":"))?n[a[1]]=a[2].slice(1,a[2].length-1):n["xmlns:"===a[1].slice(0,6)?"xmlns"+a[1].slice(6):a[1].slice(s+1)]=a[2].slice(1,a[2].length-1);return n}function kl(e){var t={};if(1===e.split(/\s+/).length)return t;var r,n,a,s=e.match(Al);if(s)for(a=0;a!=s.length;++a)-1===(n=(r=s[a].match(Bl))[1].indexOf(":"))?t[r[1]]=r[2].slice(1,r[2].length-1):t["xmlns:"===r[1].slice(0,6)?"xmlns"+r[1].slice(6):r[1].slice(n+1)]=r[2].slice(1,r[2].length-1);return t}function yl(e,t,r,n){var a=n;switch((r[0].match(/dt:dt="([\w.]+)"/)||["",""])[1]){case"boolean":a=Ne(n);break;case"i2":case"int":a=parseInt(n,10);break;case"r4":case"float":a=parseFloat(n);break;case"date":case"dateTime.tz":a=q(n);break;case"i8":case"string":case"fixed":case"uuid":case"bin.base64":break;default:throw new Error("bad custprop:"+r[0])}e[ke(t)]=a}function xl(e,t,r){if(r.cellStyles&&t.Interior){var n=t.Interior;n.Pattern&&(n.patternType=Os[n.Pattern]||n.Pattern)}e[t.ID]=t}function Il(e,t,r,n,a,s,i,o,l,c){var f="General",h=n.StyleID,u={};c=c||{};var d=[],p=0;for(void 0===h&&o&&(h=o.StyleID),void 0===h&&i&&(h=i.StyleID);void 0!==s[h]&&(s[h].nf&&(f=s[h].nf),s[h].Interior&&d.push(s[h].Interior),s[h].Parent);)h=s[h].Parent;switch(r.Type){case"Boolean":n.t="b",n.v=Ne(e);break;case"String":n.t="s",n.r=De(ke(e)),n.v=e.indexOf("<")>-1?ke(t||e).replace(/<.*?>/g,""):n.r;break;case"DateTime":"Z"!=e.slice(-1)&&(e+="Z"),n.v=(q(e)-new Date(Date.UTC(1899,11,30)))/864e5,n.v!=n.v?n.v=ke(e):n.v<60&&(n.v=n.v-1),f&&"General"!=f||(f="yyyy-mm-dd");case"Number":void 0===n.v&&(n.v=+e),n.t||(n.t="n");break;case"Error":n.t="e",n.v=Xr[e],!1!==c.cellText&&(n.w=e);break;default:""==e&&""==t?n.t="z":(n.t="s",n.v=De(t||e))}if(function(e,t,r){if("z"!==e.t){if(!r||!1!==r.cellText)try{"e"===e.t?e.w=e.w||Vr[e.v]:"General"===t?"n"===e.t?(0|e.v)===e.v?e.w=x._general_int(e.v):e.w=x._general_num(e.v):e.w=x._general(e.v):e.w=(n=t||"General",a=e.v,"General"===(s=O[n]||ke(n))?x._general(a):x.format(s,a))}catch(e){if(r.WTF)throw e}var n,a,s;try{var i=O[t]||t||"General";if(r.cellNF&&(e.z=i),r.cellDates&&"n"==e.t&&x.is_date(i)){var o=x.parse_date_code(e.v);o&&(e.t="d",e.v=new Date(o.y,o.m-1,o.d,o.H,o.M,o.S,o.u))}}catch(e){if(r.WTF)throw e}}}(n,f,c),!1!==c.cellFormula)if(n.Formula){var g=ke(n.Formula);61==g.charCodeAt(0)&&(g=g.slice(1)),n.f=hi(g,a),delete n.Formula,"RC"==n.ArrayRange?n.F=hi("RC:RC",a):n.ArrayRange&&(n.F=hi(n.ArrayRange,a),l.push([rr(n.F),n.F]))}else for(p=0;p=l[p][0].s.r&&a.r<=l[p][0].e.r&&a.c>=l[p][0].s.c&&a.c<=l[p][0].e.c&&(n.F=l[p][1]);c.cellStyles&&(d.forEach(function(e){!u.patternType&&e.patternType&&(u.patternType=e.patternType)}),n.s=u),void 0!==n.StyleID&&(n.ixfe=n.StyleID)}function Rl(e){e.t=e.v||"",e.t=e.t.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),e.v=e.w=e.ixfe=void 0}function Ol(e){if(v&&Buffer.isBuffer(e))return e.toString("utf8");if("string"==typeof e)return e;if("undefined"!=typeof Uint8Array&&e instanceof Uint8Array)return Pe(A(B(e)));throw new Error("Bad input format: expected Buffer or string")}var Fl=/<(\/?)([^\s?>:\/]+)(?:[\s?:\/][^>]*)?>/gm;function Dl(e,t){var r=t||{};I(x);var n=u(Ol(e));"binary"!=r.type&&"array"!=r.type&&"base64"!=r.type||(n="undefined"!=typeof cptable?cptable.utils.decode(65001,h(n)):Pe(n));var a,s=n.slice(0,1024).toLowerCase(),i=!1;if((1023&(s=s.replace(/".*?"/g,"")).indexOf(">"))>Math.min(1023&s.indexOf(","),1023&s.indexOf(";"))){var o=te(r);return o.type="string",Ua.to_workbook(n,o)}if(-1==s.indexOf("=0&&(i=!0)}),i)return ac.to_workbook(n,r);var l,c,f=[],d={},p=[],g=r.dense?[]:{},m="",v={},b={},w=Tl(''),C=0,E=0,S=0,_={s:{r:2e6,c:2e6},e:{r:0,c:0}},A={},B={},T="",k=0,y=[],R={},F={},D=0,N=[],P=[],L={},M=[],U=!1,z=[],H=[],W={},V=0,X=0,G={Sheets:[],WBProps:{date1904:!1}},j={};Fl.lastIndex=0,n=n.replace(//gm,"");for(var K="";a=Fl.exec(n);)switch(a[3]=(K=a[3]).toLowerCase()){case"data":if("data"==K){if("/"===a[1]){if((l=f.pop())[0]!==a[3])throw new Error("Bad state: "+l.join("|"))}else"/"!==a[0].charAt(a[0].length-2)&&f.push([a[3],!0]);break}if(f[f.length-1][1])break;"/"===a[1]?Il(n.slice(C,a.index),T,w,"comment"==f[f.length-1][0]?L:v,{c:E,r:S},A,M[E],b,z,r):(T="",w=Tl(a[0]),C=a.index+a[0].length);break;case"cell":if("/"===a[1])if(P.length>0&&(v.c=P),(!r.sheetRows||r.sheetRows>S)&&void 0!==v.v&&(r.dense?(g[S]||(g[S]=[]),g[S][E]=v):g[Qt(E)+Yt(S)]=v),v.HRef&&(v.l={Target:ke(v.HRef)},v.HRefScreenTip&&(v.l.Tooltip=v.HRefScreenTip),delete v.HRef,delete v.HRefScreenTip),(v.MergeAcross||v.MergeDown)&&(V=E+(0|parseInt(v.MergeAcross,10)),X=S+(0|parseInt(v.MergeDown,10)),y.push({s:{c:E,r:S},e:{c:V,r:X}})),r.sheetStubs)if(v.MergeAcross||v.MergeDown){for(var $=E;$<=V;++$)for(var Y=S;Y<=X;++Y)($>E||Y>S)&&(r.dense?(g[Y]||(g[Y]=[]),g[Y][$]={t:"z"}):g[Qt($)+Yt(Y)]={t:"z"});E=V+1}else++E;else v.MergeAcross?E=V+1:++E;else(v=kl(a[0])).Index&&(E=+v.Index-1),E<_.s.c&&(_.s.c=E),E>_.e.c&&(_.e.c=E),"/>"===a[0].slice(-2)&&++E,P=[];break;case"row":"/"===a[1]||"/>"===a[0].slice(-2)?(S<_.s.r&&(_.s.r=S),S>_.e.r&&(_.e.r=S),"/>"===a[0].slice(-2)&&(b=Tl(a[0])).Index&&(S=+b.Index-1),E=0,++S):((b=Tl(a[0])).Index&&(S=+b.Index-1),W={},("0"==b.AutoFitHeight||b.Height)&&(W.hpx=parseInt(b.Height,10),W.hpt=Bs(W.hpx),H[S]=W),"1"==b.Hidden&&(W.hidden=!0,H[S]=W));break;case"worksheet":if("/"===a[1]){if((l=f.pop())[0]!==a[3])throw new Error("Bad state: "+l.join("|"));p.push(m),_.s.r<=_.e.r&&_.s.c<=_.e.c&&(g["!ref"]=tr(_),r.sheetRows&&r.sheetRows<=_.e.r&&(g["!fullref"]=g["!ref"],_.e.r=r.sheetRows-1,g["!ref"]=tr(_))),y.length&&(g["!merges"]=y),M.length>0&&(g["!cols"]=M),H.length>0&&(g["!rows"]=H),d[m]=g}else _={s:{r:2e6,c:2e6},e:{r:0,c:0}},S=E=0,f.push([a[3],!1]),l=Tl(a[0]),m=ke(l.Name),g=r.dense?[]:{},y=[],z=[],H=[],j={name:m,Hidden:0},G.Sheets.push(j);break;case"table":if("/"===a[1]){if((l=f.pop())[0]!==a[3])throw new Error("Bad state: "+l.join("|"))}else{if("/>"==a[0].slice(-2))break;Tl(a[0]),f.push([a[3],!1]),M=[],U=!1}break;case"style":"/"===a[1]?xl(A,B,r):B=Tl(a[0]);break;case"numberformat":B.nf=ke(Tl(a[0]).Format||"General"),O[B.nf]&&(B.nf=O[B.nf]);for(var Z=0;392!=Z&&x._table[Z]!=B.nf;++Z);if(392==Z)for(Z=57;392!=Z;++Z)if(null==x._table[Z]){x.load(B.nf,Z);break}break;case"column":if("table"!==f[f.length-1][0])break;if((c=Tl(a[0])).Hidden&&(c.hidden=!0,delete c.Hidden),c.Width&&(c.wpx=parseInt(c.Width,10)),!U&&c.wpx>10){U=!0,vs=6;for(var Q=0;Q0&&(ee.Sheet=G.Sheets.length-1),G.Names.push(ee);break;case"namedcell":case"b":case"i":case"u":case"s":case"em":case"h2":case"h3":case"sub":case"sup":case"span":case"alignment":case"borders":case"border":case"protection":case"paragraphs":case"name":case"pixelsperinch":case"null":break;case"font":if("/>"===a[0].slice(-2))break;"/"===a[1]?T+=n.slice(k,a.index):k=a.index+a[0].length;break;case"interior":if(!r.cellStyles)break;B.Interior=Tl(a[0]);break;case"author":case"title":case"description":case"created":case"keywords":case"subject":case"category":case"company":case"lastauthor":case"lastsaved":case"lastprinted":case"version":case"revision":case"totaltime":case"hyperlinkbase":case"manager":case"contentstatus":case"identifier":case"language":case"appname":if("/>"===a[0].slice(-2))break;"/"===a[1]?Cn(R,K,n.slice(D,a.index)):D=a.index+a[0].length;break;case"styles":case"workbook":if("/"===a[1]){if((l=f.pop())[0]!==a[3])throw new Error("Bad state: "+l.join("|"))}else f.push([a[3],!1]);break;case"comment":if("/"===a[1]){if((l=f.pop())[0]!==a[3])throw new Error("Bad state: "+l.join("|"));Rl(L),P.push(L)}else f.push([a[3],!1]),L={a:(l=Tl(a[0])).Author};break;case"autofilter":if("/"===a[1]){if((l=f.pop())[0]!==a[3])throw new Error("Bad state: "+l.join("|"))}else if("/"!==a[0].charAt(a[0].length-2)){var re=Tl(a[0]);g["!autofilter"]={ref:hi(re.Range).replace(/\$/g,"")},f.push([a[3],!0])}break;case"datavalidation":if("/"===a[1]){if((l=f.pop())[0]!==a[3])throw new Error("Bad state: "+l.join("|"))}else"/"!==a[0].charAt(a[0].length-2)&&f.push([a[3],!0]);break;case"componentoptions":case"documentproperties":case"customdocumentproperties":case"officedocumentsettings":case"pivottable":case"pivotcache":case"names":case"mapinfo":case"pagebreaks":case"querytable":case"sorting":case"schema":case"conditionalformatting":case"smarttagtype":case"smarttags":case"excelworkbook":case"workbookoptions":case"worksheetoptions":if("/"===a[1]){if((l=f.pop())[0]!==a[3])throw new Error("Bad state: "+l.join("|"))}else"/"!==a[0].charAt(a[0].length-2)&&f.push([a[3],!0]);break;default:if(0==f.length&&"document"==a[3])return uc(n,r);if(0==f.length&&"uof"==a[3])return uc(n,r);var ne=!0;switch(f[f.length-1][0]){case"officedocumentsettings":switch(a[3]){case"allowpng":case"removepersonalinformation":case"downloadcomponents":case"locationofcomponents":case"colors":case"color":case"index":case"rgb":case"targetscreensize":case"readonlyrecommended":break;default:ne=!1}break;case"componentoptions":switch(a[3]){case"toolbar":case"hideofficelogo":case"spreadsheetautofit":case"label":case"caption":case"maxheight":case"maxwidth":case"nextsheetnumber":break;default:ne=!1}break;case"excelworkbook":switch(a[3]){case"date1904":G.WBProps.date1904=!0;break;case"windowheight":case"windowwidth":case"windowtopx":case"windowtopy":case"tabratio":case"protectstructure":case"protectwindow":case"protectwindows":case"activesheet":case"displayinknotes":case"firstvisiblesheet":case"supbook":case"sheetname":case"sheetindex":case"sheetindexfirst":case"sheetindexlast":case"dll":case"acceptlabelsinformulas":case"donotsavelinkvalues":case"iteration":case"maxiterations":case"maxchange":case"path":case"xct":case"count":case"selectedsheets":case"calculation":case"uncalced":case"startupprompt":case"crn":case"externname":case"formula":case"colfirst":case"collast":case"wantadvise":case"boolean":case"error":case"text":case"ole":case"noautorecover":case"publishobjects":case"donotcalculatebeforesave":case"number":case"refmoder1c1":case"embedsavesmarttags":break;default:ne=!1}break;case"workbookoptions":switch(a[3]){case"owcversion":case"height":case"width":break;default:ne=!1}break;case"worksheetoptions":switch(a[3]){case"visible":if("/>"===a[0].slice(-2));else if("/"===a[1])switch(n.slice(D,a.index)){case"SheetHidden":j.Hidden=1;break;case"SheetVeryHidden":j.Hidden=2}else D=a.index+a[0].length;break;case"header":g["!margins"]||Co(g["!margins"]={},"xlml"),g["!margins"].header=Ee(a[0]).Margin;break;case"footer":g["!margins"]||Co(g["!margins"]={},"xlml"),g["!margins"].footer=Ee(a[0]).Margin;break;case"pagemargins":var ae=Ee(a[0]);g["!margins"]||Co(g["!margins"]={},"xlml"),ae.Top&&(g["!margins"].top=ae.Top),ae.Left&&(g["!margins"].left=ae.Left),ae.Right&&(g["!margins"].right=ae.Right),ae.Bottom&&(g["!margins"].bottom=ae.Bottom);break;case"displayrighttoleft":G.Views||(G.Views=[]),G.Views[0]||(G.Views[0]={}),G.Views[0].RTL=!0;break;case"freezepanes":case"frozennosplit":case"splithorizontal":case"splitvertical":case"donotdisplaygridlines":case"activerow":case"activecol":case"toprowbottompane":case"leftcolumnrightpane":case"unsynced":case"print":case"printerrors":case"panes":case"scale":case"pane":case"number":case"layout":case"pagesetup":case"selected":case"protectobjects":case"enableselection":case"protectscenarios":case"validprinterinfo":case"horizontalresolution":case"verticalresolution":case"numberofcopies":case"activepane":case"toprowvisible":case"leftcolumnvisible":case"fittopage":case"rangeselection":case"papersizeindex":case"pagelayoutzoom":case"pagebreakzoom":case"filteron":case"fitwidth":case"fitheight":case"commentslayout":case"zoom":case"lefttoright":case"gridlines":case"allowsort":case"allowfilter":case"allowinsertrows":case"allowdeleterows":case"allowinsertcols":case"allowdeletecols":case"allowinserthyperlinks":case"allowformatcells":case"allowsizecols":case"allowsizerows":case"tabcolorindex":case"donotdisplayheadings":case"showpagelayoutzoom":case"blackandwhite":case"donotdisplayzeros":case"displaypagebreak":case"rowcolheadings":case"donotdisplayoutline":case"noorientation":case"allowusepivottables":case"zeroheight":case"viewablerange":case"selection":case"protectcontents":break;case"nosummaryrowsbelowdetail":g["!outline"]||(g["!outline"]={}),g["!outline"].above=!0;break;case"nosummarycolumnsrightdetail":g["!outline"]||(g["!outline"]={}),g["!outline"].left=!0;break;default:ne=!1}break;case"pivottable":case"pivotcache":switch(a[3]){case"immediateitemsondrop":case"showpagemultipleitemlabel":case"compactrowindent":case"location":case"pivotfield":case"orientation":case"layoutform":case"layoutsubtotallocation":case"layoutcompactrow":case"position":case"pivotitem":case"datatype":case"datafield":case"sourcename":case"parentfield":case"ptlineitems":case"ptlineitem":case"countofsameitems":case"item":case"itemtype":case"ptsource":case"cacheindex":case"consolidationreference":case"filename":case"reference":case"nocolumngrand":case"norowgrand":case"blanklineafteritems":case"hidden":case"subtotal":case"basefield":case"mapchilditems":case"function":case"refreshonfileopen":case"printsettitles":case"mergelabels":case"defaultversion":case"refreshname":case"refreshdate":case"refreshdatecopy":case"versionlastrefresh":case"versionlastupdate":case"versionupdateablemin":case"versionrefreshablemin":case"calculation":break;default:ne=!1}break;case"pagebreaks":switch(a[3]){case"colbreaks":case"colbreak":case"rowbreaks":case"rowbreak":case"colstart":case"colend":case"rowend":break;default:ne=!1}break;case"autofilter":switch(a[3]){case"autofiltercolumn":case"autofiltercondition":case"autofilterand":case"autofilteror":break;default:ne=!1}break;case"querytable":switch(a[3]){case"id":case"autoformatfont":case"autoformatpattern":case"querysource":case"querytype":case"enableredirections":case"refreshedinxl9":case"urlstring":case"htmltables":case"connection":case"commandtext":case"refreshinfo":case"notitles":case"nextid":case"columninfo":case"overwritecells":case"donotpromptforfile":case"textwizardsettings":case"source":case"number":case"decimal":case"thousandseparator":case"trailingminusnumbers":case"formatsettings":case"fieldtype":case"delimiters":case"tab":case"comma":case"autoformatname":case"versionlastedit":case"versionlastrefresh":break;default:ne=!1}break;case"datavalidation":switch(a[3]){case"range":case"type":case"min":case"max":case"sort":case"descending":case"order":case"casesensitive":case"value":case"errorstyle":case"errormessage":case"errortitle":case"inputmessage":case"inputtitle":case"combohide":case"inputhide":case"condition":case"qualifier":case"useblank":case"value1":case"value2":case"format":case"cellrangelist":break;default:ne=!1}break;case"sorting":case"conditionalformatting":switch(a[3]){case"range":case"type":case"min":case"max":case"sort":case"descending":case"order":case"casesensitive":case"value":case"errorstyle":case"errormessage":case"errortitle":case"cellrangelist":case"inputmessage":case"inputtitle":case"combohide":case"inputhide":case"condition":case"qualifier":case"useblank":case"value1":case"value2":case"format":break;default:ne=!1}break;case"mapinfo":case"schema":case"data":switch(a[3]){case"map":case"entry":case"range":case"xpath":case"field":case"xsdtype":case"filteron":case"aggregate":case"elementtype":case"attributetype":case"schema":case"element":case"complextype":case"datatype":case"all":case"attribute":case"extends":case"row":break;default:ne=!1}break;case"smarttags":break;default:ne=!1}if(ne)break;if(a[3].match(/!\[CDATA/))break;if(!f[f.length-1][1])throw"Unrecognized tag: "+a[3]+"|"+f.join("|");if("customdocumentproperties"===f[f.length-1][0]){if("/>"===a[0].slice(-2))break;"/"===a[1]?yl(F,K,N,n.slice(D,a.index)):(N=a,D=a.index+a[0].length);break}if(r.WTF)throw"Unrecognized tag: "+a[3]+"|"+f.join("|")}var se={};return r.bookSheets||r.bookProps||(se.Sheets=d),se.SheetNames=p,se.Workbook=G,se.SSF=x.get_table(),se.Props=R,se.Custprops=F,se}function Nl(e,t){switch(yc(t=t||{}),t.type||"base64"){case"base64":return Dl(m.decode(e),t);case"binary":case"buffer":case"file":return Dl(e,t);case"array":return Dl(A(e),t)}}function Pl(e){return qe("NamedRange",null,{"ss:Name":e.Name,"ss:RefersTo":"="+di(e.Ref,{r:0,c:0})})}function Ll(e,t,r,n,a,s,i){if(!e||null==e.v&&null==e.f)return"";var o={};if(e.f&&(o["ss:Formula"]="="+Ie(di(e.f,i))),e.F&&e.F.slice(0,t.length)==t){var l=Jt(e.F.slice(t.length+1));o["ss:ArrayRange"]="RC:R"+(l.r==i.r?"":"["+(l.r-i.r)+"]")+"C"+(l.c==i.c?"":"["+(l.c-i.c)+"]")}if(e.l&&e.l.Target&&(o["ss:HRef"]=Ie(e.l.Target),e.l.Tooltip&&(o["x:HRefScreenTip"]=Ie(e.l.Tooltip))),r["!merges"])for(var c=r["!merges"],f=0;f!=c.length;++f)c[f].s.c==i.c&&c[f].s.r==i.r&&(c[f].e.c>c[f].s.c&&(o["ss:MergeAcross"]=c[f].e.c-c[f].s.c),c[f].e.r>c[f].s.r&&(o["ss:MergeDown"]=c[f].e.r-c[f].s.r));var h="",u="";switch(e.t){case"z":if(!n.sheetStubs)return"";break;case"n":h="Number",u=String(e.v);break;case"b":h="Boolean",u=e.v?"1":"0";break;case"e":h="Error",u=Vr[e.v];break;case"d":h="DateTime",u=new Date(e.v).toISOString(),null==e.z&&(e.z=e.z||x._table[14]);break;case"s":h="String",u=((e.v||"")+"").replace(ye,function(e){return Te[e]}).replace(Oe,function(e){return"&#x"+e.charCodeAt(0).toString(16).toUpperCase()+";"})}var d=Eo(n.cellXfs,e,n);o["ss:StyleID"]="s"+(21+d),o["ss:Index"]=i.c+1;var p=null!=e.v?u:"",g="z"==e.t?"":''+p+"";return(e.c||[]).length>0&&(g+=e.c.map(function(e){var t=qe("ss:Data",(e.t||"").replace(/(\r\n|[\r\n])/g," "),{xmlns:"http://www.w3.org/TR/REC-html40"});return qe("Comment",t,{"ss:Author":e.a})}).join("")),qe("Cell",g,o)}function Ml(e,t){var r='"}function Ul(e,t,r){var n=[],a=r.SheetNames[e],s=r.Sheets[a],i=s?function(e,t,r,n){if(!e)return"";if(!((n||{}).Workbook||{}).Names)return"";for(var a=n.Workbook.Names,s=[],i=0;i0&&n.push(""+i+""),i=s?function(e,t){if(!e["!ref"])return"";var r=rr(e["!ref"]),n=e["!merges"]||[],a=0,s=[];e["!cols"]&&e["!cols"].forEach(function(e,t){_s(e);var r=!!e.width,n=wo(t,e),a={"ss:Index":t+1};r&&(a["ss:Width"]=bs(n.width)),e.hidden&&(a["ss:Hidden"]="1"),s.push(qe("Column",null,a))});for(var i=Array.isArray(e),o=r.s.r;o<=r.e.r;++o){for(var l=[Ml(o,(e["!rows"]||[])[o])],c=r.s.c;c<=r.e.c;++c){var f=!1;for(a=0;a!=n.length;++a)if(!(n[a].s.c>c||n[a].s.r>o||n[a].e.c"),l.length>2&&s.push(l.join(""))}return s.join("")}(s,t):"",i.length>0&&n.push(""+i+"
"),n.push(function(e,t,r,n){if(!e)return"";var a=[];if(e["!margins"]&&(a.push(""),e["!margins"].header&&a.push(qe("Header",null,{"x:Margin":e["!margins"].header})),e["!margins"].footer&&a.push(qe("Footer",null,{"x:Margin":e["!margins"].footer})),a.push(qe("PageMargins",null,{"x:Bottom":e["!margins"].bottom||"0.75","x:Left":e["!margins"].left||"0.7","x:Right":e["!margins"].right||"0.7","x:Top":e["!margins"].top||"0.75"})),a.push("")),n&&n.Workbook&&n.Workbook.Sheets&&n.Workbook.Sheets[r])if(n.Workbook.Sheets[r].Hidden)a.push(qe("Visible",1==n.Workbook.Sheets[r].Hidden?"SheetHidden":"SheetVeryHidden",{}));else{for(var s=0;s")}return((((n||{}).Workbook||{}).Views||[])[0]||{}).RTL&&a.push(""),e["!protect"]&&(a.push(Qe("ProtectContents","True")),e["!protect"].objects&&a.push(Qe("ProtectObjects","True")),e["!protect"].scenarios&&a.push(Qe("ProtectScenarios","True")),null==e["!protect"].selectLockedCells||e["!protect"].selectLockedCells?null==e["!protect"].selectUnlockedCells||e["!protect"].selectUnlockedCells||a.push(Qe("EnableSelection","UnlockedCells")):a.push(Qe("EnableSelection","NoSelection")),[["formatCells","AllowFormatCells"],["formatColumns","AllowSizeCols"],["formatRows","AllowSizeRows"],["insertColumns","AllowInsertCols"],["insertRows","AllowInsertRows"],["insertHyperlinks","AllowInsertHyperlinks"],["deleteColumns","AllowDeleteCols"],["deleteRows","AllowDeleteRows"],["sort","AllowSort"],["autoFilter","AllowFilter"],["pivotTables","AllowUsePivotTables"]].forEach(function(t){e["!protect"][t[0]]&&a.push("<"+t[1]+"/>")})),0==a.length?"":qe("WorksheetOptions",a.join(""),{xmlns:st})}(s,0,e,r)),n.join("")}function zl(e,t){t||(t={}),e.SSF||(e.SSF=x.get_table()),e.SSF&&(I(x),x.load_table(e.SSF),t.revssf=W(e.SSF),t.revssf[e.SSF[65535]]=0,t.ssf=e.SSF,t.cellXfs=[],Eo(t.cellXfs,{},{revssf:{General:0}}));var r=[];r.push(function(e,t){var r=[];return e.Props&&r.push(function(e,t){var r=[];return U(bn).map(function(e){for(var t=0;t'+a.join("")+""}(e.Props,e.Custprops)),r.join("")}(e,t)),r.push(""),r.push(""),r.push("");for(var n=0;n'];return t.cellXfs.forEach(function(e,t){var n=[];n.push(qe("NumberFormat",null,{"ss:Format":Ie(x._table[e.numFmtId])}));var a={"ss:ID":"s"+(21+t)};r.push(qe("Style",n.join(""),a))}),qe("Styles",r.join(""))}(0,t),r[3]=function(e){if(!((e||{}).Workbook||{}).Names)return"";for(var t=e.Workbook.Names,r=[],n=0;n0)switch(e.n){case"BOF":case"FilePass":case"FileLock":case"InterfaceHdr":case"RRDInfo":case"RRDHead":case"UsrExcl":case"EOF":case"BoundSheet8":break;default:n.enc.insitu(i)}s.push(i),t.l+=a;for(var o=Yl[kt(t,t.l)],l=0;null!=o&&"Continue"===o.n.slice(0,8);)a=kt(t,t.l+2),l=t.l+4,"ContinueFrt"==o.n?l+=4:"ContinueFrt"==o.n.slice(0,11)&&(l+=12),i=t.slice(l,t.l+4+a),s.push(i),t.l+=4+a,o=Yl[kt(t,t.l)];var c=T(s);Mt(c,0);var f=0;c.lens=[];for(var h=0;h40||(r.l-=4,t.Reserved1=r.read_shift(0,"lpstr-ansi"),r.length-r.l<=4||1907505652!==(n=r.read_shift(4))||(t.UnicodeClipboardFormat=function(e){return Or(e,2)}(r),0==(n=r.read_shift(4))||n>40||(r.l-=4,t.Reserved2=r.read_shift(0,"lpwstr"))))}(r),t.bookProps&&!t.bookSheets)a={};else{var i=v?"buffer":"array";if(n&&n.content)a=function(e,t){var r,n,a,s,i,o,l,f,h={opts:{}},u={},d=t.dense?[]:{},p={},g={},m=null,v=[],b="",w={},C="",E={},S=[],_=[],A=[],B={Sheets:[],WBProps:{date1904:!1},Views:[{}]},T={},k=function(e){return e<8?Wr[e]:e<64&&A[e-8]||Wr[e]},y=function(e,t,n){if(!(z>1||n.sheetRows&&e.r>=n.sheetRows)){if(n.cellStyles&&t.XF&&t.XF.data&&function(e,t,r){var n,a=t.XF.data;a&&a.patternType&&r&&r.cellStyles&&(t.s={},t.s.patternType=a.patternType,(n=gs(k(a.icvFore)))&&(t.s.fgColor={rgb:n}),(n=gs(k(a.icvBack)))&&(t.s.bgColor={rgb:n}))}(0,t,n),delete t.ixfe,delete t.XF,r=e,C=qt(e),g&&g.s&&g.e||(g={s:{r:0,c:0},e:{r:0,c:0}}),e.rg.e.r&&(g.e.r=e.r+1),e.c+1>g.e.c&&(g.e.c=e.c+1),n.cellFormula&&t.f)for(var a=0;ae.c||S[a][0].s.r>e.r||S[a][0].e.c>8)!==j)throw new Error("rt mismatch: "+Y+"!="+j);12==$.r&&(e.l+=10,K-=10)}var Z={};Z="EOF"===$.n?$.f(e,K,I):Hl($,e,K,I);var Q=$.n;if(0==z&&"BOF"!=Q)continue;switch(Q){case"Date1904":h.opts.Date1904=B.WBProps.date1904=Z;break;case"WriteProtect":h.opts.WriteProtect=!0;break;case"FilePass":if(I.enc||(e.l=0),I.enc=Z,!t.password)throw new Error("File is password-protected");if(null==Z.valid)throw new Error("Encryption scheme unsupported");if(!Z.valid)throw new Error("Password is incorrect");break;case"WriteAccess":I.lastuser=Z;break;case"FileSharing":case"Template":case"BookBool":case"UsesELFs":case"MTRSettings":case"Uncalced":case"ExtSST":case"BookExt":case"RichTextStream":case"BkHim":case"Index":case"Prot4Rev":case"Prot4RevPass":break;case"CodePage":var J=Number(Z);switch(J){case 21010:J=1200;break;case 32768:J=1e4;break;case 32769:J=1252}c(I.codepage=J),X=!0;break;case"RRTabId":I.rrtabid=Z;break;case"WinProtect":I.winlocked=Z;break;case"RefreshAll":case"CalcCount":case"CalcDelta":case"CalcIter":case"CalcMode":case"CalcPrecision":case"CalcSaveRecalc":h.opts[Q]=Z;break;case"CalcRefMode":I.CalcRefMode=Z;break;case"ForceFullCalculation":h.opts.FullCalc=Z;break;case"WsBool":Z.fDialog&&(d["!type"]="dialog"),Z.fBelow||((d["!outline"]||(d["!outline"]={})).above=!0),Z.fRight||((d["!outline"]||(d["!outline"]={})).left=!0);break;case"XF":_.push(Z);break;case"SupBook":P.push([Z]),P[P.length-1].XTI=[];break;case"ExternName":P[P.length-1].push(Z);break;case"Lbl":L={Name:Z.Name,Ref:Qi(Z.rgce,0,null,P,I)},Z.itab>0&&(L.Sheet=Z.itab-1),P.names.push(L),P[0]||(P[0]=[],P[0].XTI=[]),P[P.length-1].push(Z),"_xlnm._FilterDatabase"==Z.Name&&Z.itab>0&&Z.rgce&&Z.rgce[0]&&Z.rgce[0][0]&&"PtgArea3d"==Z.rgce[0][0][0]&&(V[Z.itab-1]={ref:tr(Z.rgce[0][0][1][2])});break;case"ExternCount":I.ExternCount=Z;break;case"ExternSheet":0==P.length&&(P[0]=[],P[0].XTI=[]),P[P.length-1].XTI=P[P.length-1].XTI.concat(Z),P.XTI=P.XTI.concat(Z);break;case"NameCmt":if(I.biff<8)break;null!=L&&(L.Comment=Z[1]);break;case"Protect":d["!protect"]=Z;break;case"Password":0!==Z&&I.WTF&&console.error("Password verifier: "+Z);break;case"BoundSheet8":p[Z.pos]=Z,I.snames.push(Z.name);break;case"EOF":if(--z)break;if(g.e){if(g.e.r>0&&g.e.c>0){if(g.e.r--,g.e.c--,d["!ref"]=tr(g),t.sheetRows&&t.sheetRows<=g.e.r){var q=g.e.r;g.e.r=t.sheetRows-1,d["!fullref"]=d["!ref"],d["!ref"]=tr(g),g.e.r=q}g.e.r++,g.e.c++}R.length>0&&(d["!merges"]=R),O.length>0&&(d["!objects"]=O),F.length>0&&(d["!cols"]=F),D.length>0&&(d["!rows"]=D),B.Sheets.push(T)}""===b?w=d:u[b]=d,d=t.dense?[]:{};break;case"BOF":if(8===I.biff&&(I.biff={9:2,521:3,1033:4}[j]||{512:2,768:3,1024:4,1280:5,1536:8,2:2,7:2}[Z.BIFFVer]||8),I.biffguess=0==Z.BIFFVer,0==Z.BIFFVer&&4096==Z.dt&&(I.biff=5,X=!0,c(I.codepage=28591)),8==I.biff&&0==Z.BIFFVer&&16==Z.dt&&(I.biff=2),z++)break;if(d=t.dense?[]:{},I.biff<8&&!X&&(X=!0,c(I.codepage=t.codepage||1252)),I.biff<5||0==Z.BIFFVer&&4096==Z.dt){""===b&&(b="Sheet1"),g={s:{r:0,c:0},e:{r:0,c:0}};var ee={pos:e.l-K,name:b};p[ee.pos]=ee,I.snames.push(b)}else b=(p[G]||{name:""}).name;32==Z.dt&&(d["!type"]="chart"),64==Z.dt&&(d["!type"]="macro"),R=[],O=[],I.arrayf=S=[],F=[],D=[],N=!1,T={Hidden:(p[G]||{hs:0}).hs,name:b};break;case"Number":case"BIFF2NUM":case"BIFF2INT":"chart"==d["!type"]&&(t.dense?(d[Z.r]||[])[Z.c]:d[qt({c:Z.c,r:Z.r})])&&++Z.c,o={ixfe:Z.ixfe,XF:_[Z.ixfe]||{},v:Z.val,t:"n"},H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y({c:Z.c,r:Z.r},o,t);break;case"BoolErr":o={ixfe:Z.ixfe,XF:_[Z.ixfe],v:Z.val,t:Z.t},H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y({c:Z.c,r:Z.r},o,t);break;case"RK":o={ixfe:Z.ixfe,XF:_[Z.ixfe],v:Z.rknum,t:"n"},H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y({c:Z.c,r:Z.r},o,t);break;case"MulRk":for(var te=Z.c;te<=Z.C;++te){var re=Z.rkrec[te-Z.c][0];o={ixfe:re,XF:_[re],v:Z.rkrec[te-Z.c][1],t:"n"},H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y({c:te,r:Z.r},o,t)}break;case"Formula":if("String"==Z.val){m=Z;break}if((o=Vl(Z.val,Z.cell.ixfe,Z.tt)).XF=_[o.ixfe],t.cellFormula){var ne=Z.formula;if(ne&&ne[0]&&ne[0][0]&&"PtgExp"==ne[0][0][0]){var ae=ne[0][0][1][0],se=ne[0][0][1][1],ie=qt({r:ae,c:se});E[ie]?o.f=""+Qi(Z.formula,0,Z.cell,P,I):o.F=((t.dense?(d[ae]||[])[se]:d[ie])||{}).F}else o.f=""+Qi(Z.formula,0,Z.cell,P,I)}H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y(Z.cell,o,t),m=Z;break;case"String":if(!m)throw new Error("String record expects Formula");m.val=Z,(o=Vl(Z,m.cell.ixfe,"s")).XF=_[o.ixfe],t.cellFormula&&(o.f=""+Qi(m.formula,0,m.cell,P,I)),H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y(m.cell,o,t),m=null;break;case"Array":S.push(Z);var oe=qt(Z[0].s);if(n=t.dense?(d[Z[0].s.r]||[])[Z[0].s.c]:d[oe],t.cellFormula&&n){if(!m)break;if(!oe||!n)break;n.f=""+Qi(Z[1],0,Z[0],P,I),n.F=tr(Z[0])}break;case"ShrFmla":if(!t.cellFormula)break;if(C){if(!m)break;E[qt(m.cell)]=Z[0],((n=t.dense?(d[m.cell.r]||[])[m.cell.c]:d[qt(m.cell)])||{}).f=""+Qi(Z[0],0,r,P,I)}break;case"LabelSst":o=Vl(v[Z.isst].t,Z.ixfe,"s"),v[Z.isst].h&&(o.h=v[Z.isst].h),o.XF=_[o.ixfe],H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y({c:Z.c,r:Z.r},o,t);break;case"Blank":t.sheetStubs&&(o={ixfe:Z.ixfe,XF:_[Z.ixfe],t:"z"},H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y({c:Z.c,r:Z.r},o,t));break;case"MulBlank":if(t.sheetStubs)for(var le=Z.c;le<=Z.C;++le){var ce=Z.ixfe[le-Z.c];o={ixfe:ce,XF:_[ce],t:"z"},H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y({c:le,r:Z.r},o,t)}break;case"RString":case"Label":case"BIFF2STR":(o=Vl(Z.val,Z.ixfe,"s")).XF=_[o.ixfe],H>0&&(o.z=W[o.ixfe>>8&63]),Wl(o,t,h.opts.Date1904),y({c:Z.c,r:Z.r},o,t);break;case"Dimensions":1===z&&(g=Z);break;case"SST":v=Z;break;case"Format":if(4==I.biff){W[H++]=Z[1];for(var fe=0;fe=163&&x.load(Z[1],H+163)}else x.load(Z[1],Z[0]);break;case"BIFF2FORMAT":W[H++]=Z;for(var he=0;he=163&&x.load(Z,H+163);break;case"MergeCells":R=R.concat(Z);break;case"Obj":O[Z.cmo[0]]=I.lastobj=Z;break;case"TxO":I.lastobj.TxO=Z;break;case"ImData":I.lastobj.ImData=Z;break;case"HLink":for(i=Z[0].s.r;i<=Z[0].e.r;++i)for(s=Z[0].s.c;s<=Z[0].e.c;++s)(n=t.dense?(d[i]||[])[s]:d[qt({c:s,r:i})])&&(n.l=Z[1]);break;case"HLinkTooltip":for(i=Z[0].s.r;i<=Z[0].e.r;++i)for(s=Z[0].s.c;s<=Z[0].e.c;++s)(n=t.dense?(d[i]||[])[s]:d[qt({c:s,r:i})])&&n.l&&(n.l.Tooltip=Z[1]);break;case"Note":if(I.biff<=5&&I.biff>=2)break;n=t.dense?(d[Z[0].r]||[])[Z[0].c]:d[qt(Z[0])];var ue=O[Z[2]];n||(t.dense?(d[Z[0].r]||(d[Z[0].r]=[]),n=d[Z[0].r][Z[0].c]={t:"z"}):n=d[qt(Z[0])]={t:"z"},g.e.r=Math.max(g.e.r,Z[0].r),g.s.r=Math.min(g.s.r,Z[0].r),g.e.c=Math.max(g.e.c,Z[0].c),g.s.c=Math.min(g.s.c,Z[0].c)),n.c||(n.c=[]),a={a:Z[1],t:ue.TxO.t},n.c.push(a);break;default:switch($.n){case"ClrtClient":case"Selection":case"Header":case"Footer":case"HCenter":case"VCenter":case"Pls":case"GCW":case"LHRecord":case"DBCell":case"EntExU2":case"SxView":case"Sxvd":case"SXVI":case"SXVDEx":case"SxIvd":case"SXString":case"Sync":case"Addin":case"SXDI":case"SXLI":case"SXEx":case"QsiSXTag":case"Feat":case"FeatHdr":case"FeatHdr11":case"Feature11":case"Feature12":case"List12":case"RecalcId":case"DxGCol":case"Fbi":case"Fbi2":case"GelFrame":case"Font":case"XFCRC":case"Style":case"StyleExt":case"ScenarioProtect":case"ObjProtect":case"CondFmt12":case"Table":case"TableStyles":case"TableStyle":case"TableStyleElement":case"SXStreamID":case"SXVS":case"DConRef":case"SXAddl":case"DConBin":case"DConName":case"SXPI":case"SxFormat":case"SxSelect":case"SxRule":case"SxFilt":case"SxItm":case"SxDXF":case"ScenMan":case"DCon":case"CellWatch":case"PrintRowCol":case"PrintGrid":case"PrintSize":case"XCT":case"CRN":case"Scl":case"SheetExt":case"SheetExtOptional":case"ObNoMacros":case"ObProj":case"GUIDTypeLib":case"WOpt":case"PhoneticInfo":case"OleObjectSize":case"DXF":case"DXFN":case"DXFN12":case"DXFN12List":case"DXFN12NoCB":case"Dv":case"DVal":case"BRAI":case"Series":case"SeriesText":case"DConn":case"DbOrParamQry":case"DBQueryExt":case"OleDbConn":case"ExtString":case"IFmtRecord":case"CondFmt":case"CF":case"CF12":case"CFEx":case"Excel9File":case"Units":case"InterfaceHdr":case"Mms":case"InterfaceEnd":case"DSF":case"BuiltInFnGroupCount":case"Window1":case"HideObj":case"GridSet":case"Guts":case"UserBView":case"UserSViewBegin":case"UserSViewEnd":case"Pane":case"DefColWidth":break;case"XFExt":ni(_[Z.ixfe],Z.ext);break;case"DefaultRowHeight":Z[1];break;case"ColInfo":if(!I.cellStyles)break;for(;Z.e>=Z.s;)F[Z.e--]={width:Z.w/256,level:Z.level||0,hidden:!!(1&Z.flags)},N||(N=!0,Ss(Z.w/256)),_s(F[Z.e+1]);break;case"Row":var de={};null!=Z.level&&(D[Z.r]=de,de.level=Z.level),Z.hidden&&(D[Z.r]=de,de.hidden=!0),Z.hpt&&(D[Z.r]=de,de.hpt=Z.hpt,de.hpx=Ts(Z.hpt));break;case"LeftMargin":case"RightMargin":case"TopMargin":case"BottomMargin":d["!margins"]||Co(d["!margins"]={}),d["!margins"][Q.slice(0,-6).toLowerCase()]=Z;break;case"Setup":d["!margins"]||Co(d["!margins"]={}),d["!margins"].header=Z.header,d["!margins"].footer=Z.footer;break;case"Window2":Z.RTL&&(B.Views[0].RTL=!0);break;case"Country":l=Z;break;case"Palette":A=Z;break;case"Theme":f=Z;break;case"CodeName":b?T.CodeName=Z||T.name:B.WBProps.CodeName=Z||"ThisWorkbook";break;default:switch($.n){case"Dat":case"Begin":case"End":case"StartBlock":case"EndBlock":case"Frame":case"Area":case"Axis":case"AxisLine":case"Tick":case"AxesUsed":case"CrtLayout12":case"CrtLayout12A":case"CrtLink":case"CrtLine":case"CrtMlFrt":case"CrtMlFrtContinue":case"LineFormat":case"AreaFormat":case"Chart":case"Chart3d":case"Chart3DBarShape":case"ChartFormat":case"ChartFrtInfo":case"PlotArea":case"PlotGrowth":case"SeriesList":case"SerParent":case"SerAuxTrend":case"DataFormat":case"SerToCrt":case"FontX":case"CatSerRange":case"AxcExt":case"SerFmt":case"ShtProps":case"DefaultText":case"Text":case"CatLab":case"DataLabExtContents":case"Legend":case"LegendException":case"Pie":case"Scatter":case"PieFormat":case"MarkerFormat":case"StartObject":case"EndObject":case"AlRuns":case"ObjectLink":case"SIIndex":case"AttachedLabel":case"YMult":case"Line":case"Bar":case"Surf":case"AxisParent":case"Pos":case"ValueRange":case"SXViewEx9":case"SXViewLink":case"PivotChartBits":case"SBaseRef":case"TextPropsStream":case"LnExt":case"MkrExt":case"CrtCoopt":case"Qsi":case"Qsif":case"Qsir":case"QsiSXTag":case"TxtQry":case"FilterMode":case"AutoFilter":case"AutoFilterInfo":case"AutoFilter12":case"DropDownObjIds":case"Sort":case"SortData":case"ShapePropsStream":case"MsoDrawing":case"MsoDrawingGroup":case"MsoDrawingSelection":case"WebPub":case"AutoWebPub":case"HeaderFooter":case"HFPicture":case"PLV":case"HorizontalPageBreaks":case"VerticalPageBreaks":case"Backup":case"CompressPictures":case"Compat12":case"Continue":case"ContinueFrt12":case"FrtFontList":case"FrtWrapper":break;default:switch($.n){case"TabIdConf":case"Radar":case"RadarArea":case"DropBar":case"Intl":case"CoordList":case"SerAuxErrBar":case"BIFF2FONTCLR":case"BIFF2FMTCNT":case"BIFF2FONTXTRA":case"BIFF2XF":case"BIFF3XF":case"BIFF4XF":case"BIFF2XFINDEX":case"BIFF4FMTCNT":case"BIFF2ROW":case"BIFF2WINDOW2":case"SCENARIO":case"DConBin":case"PicF":case"DataLabExt":case"Lel":case"BopPop":case"BopPopCustom":case"RealTimeData":case"Name":case"LHNGraph":case"FnGroupName":case"AddMenu":case"LPr":case"ListObj":case"ListField":case"RRSort":case"BigName":case"ToolbarHdr":case"ToolbarEnd":case"DDEObjName":case"FRTArchId$":break;default:if(t.WTF)throw"Unrecognized Record "+$.n}}}}}else e.l+=K}return h.SheetNames=U(p).sort(function(e,t){return Number(e)-Number(t)}).map(function(e){return p[e].name}),t.bookSheets||(h.Sheets=u),!h.SheetNames.length&&w["!ref"]?(h.SheetNames.push("Sheet1"),h.Sheets&&(h.Sheets.Sheet1=w)):h.Preamble=w,h.Sheets&&V.forEach(function(e,t){h.Sheets[h.SheetNames[t]]["!autofilter"]=e}),h.Strings=v,h.SSF=x.get_table(),I.enc&&(h.Encryption=I.enc),f&&(h.Themes=f),h.Metadata={},void 0!==l&&(h.Metadata.Country=l),P.names.length>0&&(B.Names=P.names),h.Workbook=B,h}(n.content,t);else if((s=P.find(e,"PerfectOffice_MAIN"))&&s.content)a=za.to_workbook(s.content,(t.type=i,t));else{if(!(s=P.find(e,"NativeContent_MAIN"))||!s.content)throw(s=P.find(e,"MN0"))&&s.content?new Error("Unsupported Works 4 for Mac file"):new Error("Cannot find Workbook stream");a=za.to_workbook(s.content,(t.type=i,t))}t.bookVBA&&e.FullPaths&&P.find(e,"/_VBA_PROJECT_CUR/VBA/dir")&&(a.vbaraw=function(e){var t=P.utils.cfb_new({root:"R"});return e.FullPaths.forEach(function(r,n){if("/"!==r.slice(-1)&&r.match(/_VBA_PROJECT_CUR/)){var a=r.replace(/^[^\/]*/,"R").replace(/\/_VBA_PROJECT_CUR\u0000*/,"");P.utils.cfb_add(t,a,e.FileIndex[n].content)}}),P.write(t)}(e))}var o={};return e.FullPaths&&function(e,t,r){var n=P.find(e,"!DocumentSummaryInformation");if(n&&n.size>0)try{var a=Nn(n,Pr,Gl);for(var s in a)t[s]=a[s]}catch(e){if(r.WTF)throw e}var i=P.find(e,"!SummaryInformation");if(i&&i.size>0)try{var o=Nn(i,Lr,Xl);for(var l in o)null==t[l]&&(t[l]=o[l])}catch(e){if(r.WTF)throw e}t.HeadingPairs&&t.TitlesOfParts&&(pn(t.HeadingPairs,t.TitlesOfParts,t,r),delete t.HeadingPairs,delete t.TitlesOfParts)}(e,o,t),a.Props=a.Custprops=o,t.bookFiles&&(a.cfb=e),a}var Kl={0:{n:"BrtRowHdr",f:function(e,t){var r={},n=e.l+t;r.r=e.read_shift(4),e.l+=4;var a=e.read_shift(2);e.l+=1;var s=e.read_shift(1);return e.l=n,7&s&&(r.level=7&s),16&s&&(r.hidden=!0),32&s&&(r.hpt=a/20),r}},1:{n:"BrtCellBlank",f:function(e){return[dr(e)]}},2:{n:"BrtCellRk",f:function(e){return[dr(e),Ar(e),"n"]}},3:{n:"BrtCellError",f:function(e){return[dr(e),e.read_shift(1),"e"]}},4:{n:"BrtCellBool",f:function(e){return[dr(e),e.read_shift(1),"b"]}},5:{n:"BrtCellReal",f:function(e){return[dr(e),xr(e),"n"]}},6:{n:"BrtCellSt",f:function(e){return[dr(e),lr(e),"str"]}},7:{n:"BrtCellIsst",f:function(e){return[dr(e),e.read_shift(4),"s"]}},8:{n:"BrtFmlaString",f:function(e,t,r){var n=e.l+t,a=dr(e);a.r=r["!row"];var s=[a,lr(e),"str"];if(r.cellFormula){e.l+=2;var i=no(e,n-e.l,r);s[3]=Qi(i,0,a,r.supbooks,r)}else e.l=n;return s}},9:{n:"BrtFmlaNum",f:function(e,t,r){var n=e.l+t,a=dr(e);a.r=r["!row"];var s=[a,xr(e),"n"];if(r.cellFormula){e.l+=2;var i=no(e,n-e.l,r);s[3]=Qi(i,0,a,r.supbooks,r)}else e.l=n;return s}},10:{n:"BrtFmlaBool",f:function(e,t,r){var n=e.l+t,a=dr(e);a.r=r["!row"];var s=[a,e.read_shift(1),"b"];if(r.cellFormula){e.l+=2;var i=no(e,n-e.l,r);s[3]=Qi(i,0,a,r.supbooks,r)}else e.l=n;return s}},11:{n:"BrtFmlaError",f:function(e,t,r){var n=e.l+t,a=dr(e);a.r=r["!row"];var s=[a,e.read_shift(1),"e"];if(r.cellFormula){e.l+=2;var i=no(e,n-e.l,r);s[3]=Qi(i,0,a,r.supbooks,r)}else e.l=n;return s}},12:{n:"BrtShortBlank",f:function(e){return[gr(e)]}},13:{n:"BrtShortRk",f:function(e){return[gr(e),Ar(e),"n"]}},14:{n:"BrtShortError",f:function(e){return[gr(e),e.read_shift(1),"e"]}},15:{n:"BrtShortBool",f:function(e){return[gr(e),e.read_shift(1),"b"]}},16:{n:"BrtShortReal",f:Jo},17:{n:"BrtShortSt",f:function(e){return[gr(e),lr(e),"str"]}},18:{n:"BrtShortIsst",f:function(e){return[gr(e),e.read_shift(4),"s"]}},19:{n:"BrtSSTItem",f:hr},20:{n:"BrtPCDIMissing"},21:{n:"BrtPCDINumber"},22:{n:"BrtPCDIBoolean"},23:{n:"BrtPCDIError"},24:{n:"BrtPCDIString"},25:{n:"BrtPCDIDatetime"},26:{n:"BrtPCDIIndex"},27:{n:"BrtPCDIAMissing"},28:{n:"BrtPCDIANumber"},29:{n:"BrtPCDIABoolean"},30:{n:"BrtPCDIAError"},31:{n:"BrtPCDIAString"},32:{n:"BrtPCDIADatetime"},33:{n:"BrtPCRRecord"},34:{n:"BrtPCRRecordDt"},35:{n:"BrtFRTBegin"},36:{n:"BrtFRTEnd"},37:{n:"BrtACBegin"},38:{n:"BrtACEnd"},39:{n:"BrtName",f:function(e,t,r){var n=e.l+t;e.l+=4,e.l+=1;var a=e.read_shift(4),s=Er(e),i=ao(e,0,r),o=wr(e);e.l=n;var l={Name:s,Ptg:i};return a<268435455&&(l.Sheet=a),o&&(l.Comment=o),l}},40:{n:"BrtIndexRowBlock"},42:{n:"BrtIndexBlock"},43:{n:"BrtFont",f:function(e,t,r){var n={};n.sz=e.read_shift(2)/20;var a=function(e){var t=e.read_shift(1);return e.l++,{fBold:1&t,fItalic:2&t,fUnderline:4&t,fStrikeout:8&t,fOutline:16&t,fShadow:32&t,fCondense:64&t,fExtend:128&t}}(e);switch(a.fItalic&&(n.italic=1),a.fCondense&&(n.condense=1),a.fExtend&&(n.extend=1),a.fShadow&&(n.shadow=1),a.fOutline&&(n.outline=1),a.fStrikeout&&(n.strike=1),700===e.read_shift(2)&&(n.bold=1),e.read_shift(2)){case 1:n.vertAlign="superscript";break;case 2:n.vertAlign="subscript"}var s=e.read_shift(1);0!=s&&(n.underline=s);var i=e.read_shift(1);i>0&&(n.family=i);var o=e.read_shift(1);switch(o>0&&(n.charset=o),e.l++,n.color=function(e){var t={},r=e.read_shift(1)>>>1,n=e.read_shift(1),a=e.read_shift(2,"i"),s=e.read_shift(1),i=e.read_shift(1),o=e.read_shift(1);switch(e.l++,r){case 0:t.auto=1;break;case 1:t.index=n;var l=Wr[n];l&&(t.rgb=gs(l));break;case 2:t.rgb=gs([s,i,o]);break;case 3:t.theme=n}return 0!=a&&(t.tint=a>0?a/32767:a/32768),t}(e),e.read_shift(1)){case 1:n.scheme="major";break;case 2:n.scheme="minor"}return n.name=lr(e),n}},44:{n:"BrtFmt",f:function(e,t){return[e.read_shift(2),lr(e)]}},45:{n:"BrtFill",f:zs},46:{n:"BrtBorder",f:Xs},47:{n:"BrtXF",f:function(e,t){var r=e.l+t,n=e.read_shift(2),a=e.read_shift(2);return e.l=r,{ixfe:n,numFmtId:a}}},48:{n:"BrtStyle"},49:{n:"BrtCellMeta"},50:{n:"BrtValueMeta"},51:{n:"BrtMdb"},52:{n:"BrtBeginFmd"},53:{n:"BrtEndFmd"},54:{n:"BrtBeginMdx"},55:{n:"BrtEndMdx"},56:{n:"BrtBeginMdxTuple"},57:{n:"BrtEndMdxTuple"},58:{n:"BrtMdxMbrIstr"},59:{n:"BrtStr"},60:{n:"BrtColInfo",f:Ra},62:{n:"BrtCellRString"},63:{n:"BrtCalcChainItem$",f:function(e){var t={};t.i=e.read_shift(4);var r={};r.r=e.read_shift(4),r.c=e.read_shift(4),t.r=qt(r);var n=e.read_shift(1);return 2&n&&(t.l="1"),8&n&&(t.a="1"),t}},64:{n:"BrtDVal",f:function(){}},65:{n:"BrtSxvcellNum"},66:{n:"BrtSxvcellStr"},67:{n:"BrtSxvcellBool"},68:{n:"BrtSxvcellErr"},69:{n:"BrtSxvcellDate"},70:{n:"BrtSxvcellNil"},128:{n:"BrtFileVersion"},129:{n:"BrtBeginSheet"},130:{n:"BrtEndSheet"},131:{n:"BrtBeginBook",f:Ut,p:0},132:{n:"BrtEndBook"},133:{n:"BrtBeginWsViews"},134:{n:"BrtEndWsViews"},135:{n:"BrtBeginBookViews"},136:{n:"BrtEndBookViews"},137:{n:"BrtBeginWsView",f:function(e){var t=e.read_shift(2);return e.l+=28,{RTL:32&t}}},138:{n:"BrtEndWsView"},139:{n:"BrtBeginCsViews"},140:{n:"BrtEndCsViews"},141:{n:"BrtBeginCsView"},142:{n:"BrtEndCsView"},143:{n:"BrtBeginBundleShs"},144:{n:"BrtEndBundleShs"},145:{n:"BrtBeginSheetData"},146:{n:"BrtEndSheetData"},147:{n:"BrtWsProp",f:function(e,t){var r={},n=e[e.l];return++e.l,r.above=!(64&n),r.left=!(128&n),e.l+=18,r.name=vr(e,t-19),r}},148:{n:"BrtWsDim",f:Zo,p:16},151:{n:"BrtPane",f:function(){}},152:{n:"BrtSel"},153:{n:"BrtWbProp",f:function(e,t){var r={},n=e.read_shift(4);r.defaultThemeVersion=e.read_shift(4);var a=t>8?lr(e):"";return a.length>0&&(r.CodeName=a),r.autoCompressPictures=!!(65536&n),r.backupFile=!!(64&n),r.checkCompatibility=!!(4096&n),r.date1904=!!(1&n),r.filterPrivacy=!!(8&n),r.hidePivotFieldList=!!(1024&n),r.promptedSolutions=!!(16&n),r.publishItems=!!(2048&n),r.refreshAllConnections=!!(262144&n),r.saveExternalLinkValues=!!(128&n),r.showBorderUnselectedTables=!!(4&n),r.showInkAnnotation=!!(32&n),r.showObjects=["all","placeholders","none"][n>>13&3],r.showPivotChartFilter=!!(32768&n),r.updateLinks=["userSet","never","always"][n>>8&3],r}},154:{n:"BrtWbFactoid"},155:{n:"BrtFileRecover"},156:{n:"BrtBundleSh",f:function(e,t){var r={};return r.Hidden=e.read_shift(4),r.iTabID=e.read_shift(4),r.strRelID=Sr(e,t-8),r.name=lr(e),r}},157:{n:"BrtCalcProp"},158:{n:"BrtBookView"},159:{n:"BrtBeginSst",f:function(e){return[e.read_shift(4),e.read_shift(4)]}},160:{n:"BrtEndSst"},161:{n:"BrtBeginAFilter",f:kr},162:{n:"BrtEndAFilter"},163:{n:"BrtBeginFilterColumn"},164:{n:"BrtEndFilterColumn"},165:{n:"BrtBeginFilters"},166:{n:"BrtEndFilters"},167:{n:"BrtFilter"},168:{n:"BrtColorFilter"},169:{n:"BrtIconFilter"},170:{n:"BrtTop10Filter"},171:{n:"BrtDynamicFilter"},172:{n:"BrtBeginCustomFilters"},173:{n:"BrtEndCustomFilters"},174:{n:"BrtCustomFilter"},175:{n:"BrtAFilterDateGroupItem"},176:{n:"BrtMergeCell",f:qo},177:{n:"BrtBeginMergeCells"},178:{n:"BrtEndMergeCells"},179:{n:"BrtBeginPivotCacheDef"},180:{n:"BrtEndPivotCacheDef"},181:{n:"BrtBeginPCDFields"},182:{n:"BrtEndPCDFields"},183:{n:"BrtBeginPCDField"},184:{n:"BrtEndPCDField"},185:{n:"BrtBeginPCDSource"},186:{n:"BrtEndPCDSource"},187:{n:"BrtBeginPCDSRange"},188:{n:"BrtEndPCDSRange"},189:{n:"BrtBeginPCDFAtbl"},190:{n:"BrtEndPCDFAtbl"},191:{n:"BrtBeginPCDIRun"},192:{n:"BrtEndPCDIRun"},193:{n:"BrtBeginPivotCacheRecords"},194:{n:"BrtEndPivotCacheRecords"},195:{n:"BrtBeginPCDHierarchies"},196:{n:"BrtEndPCDHierarchies"},197:{n:"BrtBeginPCDHierarchy"},198:{n:"BrtEndPCDHierarchy"},199:{n:"BrtBeginPCDHFieldsUsage"},200:{n:"BrtEndPCDHFieldsUsage"},201:{n:"BrtBeginExtConnection"},202:{n:"BrtEndExtConnection"},203:{n:"BrtBeginECDbProps"},204:{n:"BrtEndECDbProps"},205:{n:"BrtBeginECOlapProps"},206:{n:"BrtEndECOlapProps"},207:{n:"BrtBeginPCDSConsol"},208:{n:"BrtEndPCDSConsol"},209:{n:"BrtBeginPCDSCPages"},210:{n:"BrtEndPCDSCPages"},211:{n:"BrtBeginPCDSCPage"},212:{n:"BrtEndPCDSCPage"},213:{n:"BrtBeginPCDSCPItem"},214:{n:"BrtEndPCDSCPItem"},215:{n:"BrtBeginPCDSCSets"},216:{n:"BrtEndPCDSCSets"},217:{n:"BrtBeginPCDSCSet"},218:{n:"BrtEndPCDSCSet"},219:{n:"BrtBeginPCDFGroup"},220:{n:"BrtEndPCDFGroup"},221:{n:"BrtBeginPCDFGItems"},222:{n:"BrtEndPCDFGItems"},223:{n:"BrtBeginPCDFGRange"},224:{n:"BrtEndPCDFGRange"},225:{n:"BrtBeginPCDFGDiscrete"},226:{n:"BrtEndPCDFGDiscrete"},227:{n:"BrtBeginPCDSDTupleCache"},228:{n:"BrtEndPCDSDTupleCache"},229:{n:"BrtBeginPCDSDTCEntries"},230:{n:"BrtEndPCDSDTCEntries"},231:{n:"BrtBeginPCDSDTCEMembers"},232:{n:"BrtEndPCDSDTCEMembers"},233:{n:"BrtBeginPCDSDTCEMember"},234:{n:"BrtEndPCDSDTCEMember"},235:{n:"BrtBeginPCDSDTCQueries"},236:{n:"BrtEndPCDSDTCQueries"},237:{n:"BrtBeginPCDSDTCQuery"},238:{n:"BrtEndPCDSDTCQuery"},239:{n:"BrtBeginPCDSDTCSets"},240:{n:"BrtEndPCDSDTCSets"},241:{n:"BrtBeginPCDSDTCSet"},242:{n:"BrtEndPCDSDTCSet"},243:{n:"BrtBeginPCDCalcItems"},244:{n:"BrtEndPCDCalcItems"},245:{n:"BrtBeginPCDCalcItem"},246:{n:"BrtEndPCDCalcItem"},247:{n:"BrtBeginPRule"},248:{n:"BrtEndPRule"},249:{n:"BrtBeginPRFilters"},250:{n:"BrtEndPRFilters"},251:{n:"BrtBeginPRFilter"},252:{n:"BrtEndPRFilter"},253:{n:"BrtBeginPNames"},254:{n:"BrtEndPNames"},255:{n:"BrtBeginPName"},256:{n:"BrtEndPName"},257:{n:"BrtBeginPNPairs"},258:{n:"BrtEndPNPairs"},259:{n:"BrtBeginPNPair"},260:{n:"BrtEndPNPair"},261:{n:"BrtBeginECWebProps"},262:{n:"BrtEndECWebProps"},263:{n:"BrtBeginEcWpTables"},264:{n:"BrtEndECWPTables"},265:{n:"BrtBeginECParams"},266:{n:"BrtEndECParams"},267:{n:"BrtBeginECParam"},268:{n:"BrtEndECParam"},269:{n:"BrtBeginPCDKPIs"},270:{n:"BrtEndPCDKPIs"},271:{n:"BrtBeginPCDKPI"},272:{n:"BrtEndPCDKPI"},273:{n:"BrtBeginDims"},274:{n:"BrtEndDims"},275:{n:"BrtBeginDim"},276:{n:"BrtEndDim"},277:{n:"BrtIndexPartEnd"},278:{n:"BrtBeginStyleSheet"},279:{n:"BrtEndStyleSheet"},280:{n:"BrtBeginSXView"},281:{n:"BrtEndSXVI"},282:{n:"BrtBeginSXVI"},283:{n:"BrtBeginSXVIs"},284:{n:"BrtEndSXVIs"},285:{n:"BrtBeginSXVD"},286:{n:"BrtEndSXVD"},287:{n:"BrtBeginSXVDs"},288:{n:"BrtEndSXVDs"},289:{n:"BrtBeginSXPI"},290:{n:"BrtEndSXPI"},291:{n:"BrtBeginSXPIs"},292:{n:"BrtEndSXPIs"},293:{n:"BrtBeginSXDI"},294:{n:"BrtEndSXDI"},295:{n:"BrtBeginSXDIs"},296:{n:"BrtEndSXDIs"},297:{n:"BrtBeginSXLI"},298:{n:"BrtEndSXLI"},299:{n:"BrtBeginSXLIRws"},300:{n:"BrtEndSXLIRws"},301:{n:"BrtBeginSXLICols"},302:{n:"BrtEndSXLICols"},303:{n:"BrtBeginSXFormat"},304:{n:"BrtEndSXFormat"},305:{n:"BrtBeginSXFormats"},306:{n:"BrtEndSxFormats"},307:{n:"BrtBeginSxSelect"},308:{n:"BrtEndSxSelect"},309:{n:"BrtBeginISXVDRws"},310:{n:"BrtEndISXVDRws"},311:{n:"BrtBeginISXVDCols"},312:{n:"BrtEndISXVDCols"},313:{n:"BrtEndSXLocation"},314:{n:"BrtBeginSXLocation"},315:{n:"BrtEndSXView"},316:{n:"BrtBeginSXTHs"},317:{n:"BrtEndSXTHs"},318:{n:"BrtBeginSXTH"},319:{n:"BrtEndSXTH"},320:{n:"BrtBeginISXTHRws"},321:{n:"BrtEndISXTHRws"},322:{n:"BrtBeginISXTHCols"},323:{n:"BrtEndISXTHCols"},324:{n:"BrtBeginSXTDMPS"},325:{n:"BrtEndSXTDMPs"},326:{n:"BrtBeginSXTDMP"},327:{n:"BrtEndSXTDMP"},328:{n:"BrtBeginSXTHItems"},329:{n:"BrtEndSXTHItems"},330:{n:"BrtBeginSXTHItem"},331:{n:"BrtEndSXTHItem"},332:{n:"BrtBeginMetadata"},333:{n:"BrtEndMetadata"},334:{n:"BrtBeginEsmdtinfo"},335:{n:"BrtMdtinfo"},336:{n:"BrtEndEsmdtinfo"},337:{n:"BrtBeginEsmdb"},338:{n:"BrtEndEsmdb"},339:{n:"BrtBeginEsfmd"},340:{n:"BrtEndEsfmd"},341:{n:"BrtBeginSingleCells"},342:{n:"BrtEndSingleCells"},343:{n:"BrtBeginList"},344:{n:"BrtEndList"},345:{n:"BrtBeginListCols"},346:{n:"BrtEndListCols"},347:{n:"BrtBeginListCol"},348:{n:"BrtEndListCol"},349:{n:"BrtBeginListXmlCPr"},350:{n:"BrtEndListXmlCPr"},351:{n:"BrtListCCFmla"},352:{n:"BrtListTrFmla"},353:{n:"BrtBeginExternals"},354:{n:"BrtEndExternals"},355:{n:"BrtSupBookSrc",f:Sr},357:{n:"BrtSupSelf"},358:{n:"BrtSupSame"},359:{n:"BrtSupTabs"},360:{n:"BrtBeginSupBook"},361:{n:"BrtPlaceholderName"},362:{n:"BrtExternSheet",f:Ta},363:{n:"BrtExternTableStart"},364:{n:"BrtExternTableEnd"},366:{n:"BrtExternRowHdr"},367:{n:"BrtExternCellBlank"},368:{n:"BrtExternCellReal"},369:{n:"BrtExternCellBool"},370:{n:"BrtExternCellError"},371:{n:"BrtExternCellString"},372:{n:"BrtBeginEsmdx"},373:{n:"BrtEndEsmdx"},374:{n:"BrtBeginMdxSet"},375:{n:"BrtEndMdxSet"},376:{n:"BrtBeginMdxMbrProp"},377:{n:"BrtEndMdxMbrProp"},378:{n:"BrtBeginMdxKPI"},379:{n:"BrtEndMdxKPI"},380:{n:"BrtBeginEsstr"},381:{n:"BrtEndEsstr"},382:{n:"BrtBeginPRFItem"},383:{n:"BrtEndPRFItem"},384:{n:"BrtBeginPivotCacheIDs"},385:{n:"BrtEndPivotCacheIDs"},386:{n:"BrtBeginPivotCacheID"},387:{n:"BrtEndPivotCacheID"},388:{n:"BrtBeginISXVIs"},389:{n:"BrtEndISXVIs"},390:{n:"BrtBeginColInfos"},391:{n:"BrtEndColInfos"},392:{n:"BrtBeginRwBrk"},393:{n:"BrtEndRwBrk"},394:{n:"BrtBeginColBrk"},395:{n:"BrtEndColBrk"},396:{n:"BrtBrk"},397:{n:"BrtUserBookView"},398:{n:"BrtInfo"},399:{n:"BrtCUsr"},400:{n:"BrtUsr"},401:{n:"BrtBeginUsers"},403:{n:"BrtEOF"},404:{n:"BrtUCR"},405:{n:"BrtRRInsDel"},406:{n:"BrtRREndInsDel"},407:{n:"BrtRRMove"},408:{n:"BrtRREndMove"},409:{n:"BrtRRChgCell"},410:{n:"BrtRREndChgCell"},411:{n:"BrtRRHeader"},412:{n:"BrtRRUserView"},413:{n:"BrtRRRenSheet"},414:{n:"BrtRRInsertSh"},415:{n:"BrtRRDefName"},416:{n:"BrtRRNote"},417:{n:"BrtRRConflict"},418:{n:"BrtRRTQSIF"},419:{n:"BrtRRFormat"},420:{n:"BrtRREndFormat"},421:{n:"BrtRRAutoFmt"},422:{n:"BrtBeginUserShViews"},423:{n:"BrtBeginUserShView"},424:{n:"BrtEndUserShView"},425:{n:"BrtEndUserShViews"},426:{n:"BrtArrFmla",f:function(e,t,r){var n=e.l+t,a=Tr(e),s=e.read_shift(1),i=[a];if(i[2]=s,r.cellFormula){var o=ro(e,n-e.l,r);i[1]=o}else e.l=n;return i}},427:{n:"BrtShrFmla",f:function(e,t,r){var n=e.l+t,a=[kr(e,16)];if(r.cellFormula){var s=so(e,n-e.l,r);a[1]=s,e.l=n}else e.l=n;return a}},428:{n:"BrtTable"},429:{n:"BrtBeginExtConnections"},430:{n:"BrtEndExtConnections"},431:{n:"BrtBeginPCDCalcMems"},432:{n:"BrtEndPCDCalcMems"},433:{n:"BrtBeginPCDCalcMem"},434:{n:"BrtEndPCDCalcMem"},435:{n:"BrtBeginPCDHGLevels"},436:{n:"BrtEndPCDHGLevels"},437:{n:"BrtBeginPCDHGLevel"},438:{n:"BrtEndPCDHGLevel"},439:{n:"BrtBeginPCDHGLGroups"},440:{n:"BrtEndPCDHGLGroups"},441:{n:"BrtBeginPCDHGLGroup"},442:{n:"BrtEndPCDHGLGroup"},443:{n:"BrtBeginPCDHGLGMembers"},444:{n:"BrtEndPCDHGLGMembers"},445:{n:"BrtBeginPCDHGLGMember"},446:{n:"BrtEndPCDHGLGMember"},447:{n:"BrtBeginQSI"},448:{n:"BrtEndQSI"},449:{n:"BrtBeginQSIR"},450:{n:"BrtEndQSIR"},451:{n:"BrtBeginDeletedNames"},452:{n:"BrtEndDeletedNames"},453:{n:"BrtBeginDeletedName"},454:{n:"BrtEndDeletedName"},455:{n:"BrtBeginQSIFs"},456:{n:"BrtEndQSIFs"},457:{n:"BrtBeginQSIF"},458:{n:"BrtEndQSIF"},459:{n:"BrtBeginAutoSortScope"},460:{n:"BrtEndAutoSortScope"},461:{n:"BrtBeginConditionalFormatting"},462:{n:"BrtEndConditionalFormatting"},463:{n:"BrtBeginCFRule"},464:{n:"BrtEndCFRule"},465:{n:"BrtBeginIconSet"},466:{n:"BrtEndIconSet"},467:{n:"BrtBeginDatabar"},468:{n:"BrtEndDatabar"},469:{n:"BrtBeginColorScale"},470:{n:"BrtEndColorScale"},471:{n:"BrtCFVO"},472:{n:"BrtExternValueMeta"},473:{n:"BrtBeginColorPalette"},474:{n:"BrtEndColorPalette"},475:{n:"BrtIndexedColor"},476:{n:"BrtMargins",f:function(e){var t={};return tl.forEach(function(r){t[r]=xr(e)}),t}},477:{n:"BrtPrintOptions"},478:{n:"BrtPageSetup"},479:{n:"BrtBeginHeaderFooter"},480:{n:"BrtEndHeaderFooter"},481:{n:"BrtBeginSXCrtFormat"},482:{n:"BrtEndSXCrtFormat"},483:{n:"BrtBeginSXCrtFormats"},484:{n:"BrtEndSXCrtFormats"},485:{n:"BrtWsFmtInfo",f:function(){}},486:{n:"BrtBeginMgs"},487:{n:"BrtEndMGs"},488:{n:"BrtBeginMGMaps"},489:{n:"BrtEndMGMaps"},490:{n:"BrtBeginMG"},491:{n:"BrtEndMG"},492:{n:"BrtBeginMap"},493:{n:"BrtEndMap"},494:{n:"BrtHLink",f:function(e,t){var r=e.l+t,n=kr(e,16),a=wr(e),s=lr(e),i=lr(e),o=lr(e);e.l=r;var l={rfx:n,relId:a,loc:s,display:o};return i&&(l.Tooltip=i),l}},495:{n:"BrtBeginDCon"},496:{n:"BrtEndDCon"},497:{n:"BrtBeginDRefs"},498:{n:"BrtEndDRefs"},499:{n:"BrtDRef"},500:{n:"BrtBeginScenMan"},501:{n:"BrtEndScenMan"},502:{n:"BrtBeginSct"},503:{n:"BrtEndSct"},504:{n:"BrtSlc"},505:{n:"BrtBeginDXFs"},506:{n:"BrtEndDXFs"},507:{n:"BrtDXF"},508:{n:"BrtBeginTableStyles"},509:{n:"BrtEndTableStyles"},510:{n:"BrtBeginTableStyle"},511:{n:"BrtEndTableStyle"},512:{n:"BrtTableStyleElement"},513:{n:"BrtTableStyleClient"},514:{n:"BrtBeginVolDeps"},515:{n:"BrtEndVolDeps"},516:{n:"BrtBeginVolType"},517:{n:"BrtEndVolType"},518:{n:"BrtBeginVolMain"},519:{n:"BrtEndVolMain"},520:{n:"BrtBeginVolTopic"},521:{n:"BrtEndVolTopic"},522:{n:"BrtVolSubtopic"},523:{n:"BrtVolRef"},524:{n:"BrtVolNum"},525:{n:"BrtVolErr"},526:{n:"BrtVolStr"},527:{n:"BrtVolBool"},528:{n:"BrtBeginCalcChain$"},529:{n:"BrtEndCalcChain$"},530:{n:"BrtBeginSortState"},531:{n:"BrtEndSortState"},532:{n:"BrtBeginSortCond"},533:{n:"BrtEndSortCond"},534:{n:"BrtBookProtection"},535:{n:"BrtSheetProtection"},536:{n:"BrtRangeProtection"},537:{n:"BrtPhoneticInfo"},538:{n:"BrtBeginECTxtWiz"},539:{n:"BrtEndECTxtWiz"},540:{n:"BrtBeginECTWFldInfoLst"},541:{n:"BrtEndECTWFldInfoLst"},542:{n:"BrtBeginECTwFldInfo"},548:{n:"BrtFileSharing"},549:{n:"BrtOleSize"},550:{n:"BrtDrawing",f:Sr},551:{n:"BrtLegacyDrawing"},552:{n:"BrtLegacyDrawingHF"},553:{n:"BrtWebOpt"},554:{n:"BrtBeginWebPubItems"},555:{n:"BrtEndWebPubItems"},556:{n:"BrtBeginWebPubItem"},557:{n:"BrtEndWebPubItem"},558:{n:"BrtBeginSXCondFmt"},559:{n:"BrtEndSXCondFmt"},560:{n:"BrtBeginSXCondFmts"},561:{n:"BrtEndSXCondFmts"},562:{n:"BrtBkHim"},564:{n:"BrtColor"},565:{n:"BrtBeginIndexedColors"},566:{n:"BrtEndIndexedColors"},569:{n:"BrtBeginMRUColors"},570:{n:"BrtEndMRUColors"},572:{n:"BrtMRUColor"},573:{n:"BrtBeginDVals"},574:{n:"BrtEndDVals"},577:{n:"BrtSupNameStart"},578:{n:"BrtSupNameValueStart"},579:{n:"BrtSupNameValueEnd"},580:{n:"BrtSupNameNum"},581:{n:"BrtSupNameErr"},582:{n:"BrtSupNameSt"},583:{n:"BrtSupNameNil"},584:{n:"BrtSupNameBool"},585:{n:"BrtSupNameFmla"},586:{n:"BrtSupNameBits"},587:{n:"BrtSupNameEnd"},588:{n:"BrtEndSupBook"},589:{n:"BrtCellSmartTagProperty"},590:{n:"BrtBeginCellSmartTag"},591:{n:"BrtEndCellSmartTag"},592:{n:"BrtBeginCellSmartTags"},593:{n:"BrtEndCellSmartTags"},594:{n:"BrtBeginSmartTags"},595:{n:"BrtEndSmartTags"},596:{n:"BrtSmartTagType"},597:{n:"BrtBeginSmartTagTypes"},598:{n:"BrtEndSmartTagTypes"},599:{n:"BrtBeginSXFilters"},600:{n:"BrtEndSXFilters"},601:{n:"BrtBeginSXFILTER"},602:{n:"BrtEndSXFilter"},603:{n:"BrtBeginFills"},604:{n:"BrtEndFills"},605:{n:"BrtBeginCellWatches"},606:{n:"BrtEndCellWatches"},607:{n:"BrtCellWatch"},608:{n:"BrtBeginCRErrs"},609:{n:"BrtEndCRErrs"},610:{n:"BrtCrashRecErr"},611:{n:"BrtBeginFonts"},612:{n:"BrtEndFonts"},613:{n:"BrtBeginBorders"},614:{n:"BrtEndBorders"},615:{n:"BrtBeginFmts"},616:{n:"BrtEndFmts"},617:{n:"BrtBeginCellXFs"},618:{n:"BrtEndCellXFs"},619:{n:"BrtBeginStyles"},620:{n:"BrtEndStyles"},625:{n:"BrtBigName"},626:{n:"BrtBeginCellStyleXFs"},627:{n:"BrtEndCellStyleXFs"},628:{n:"BrtBeginComments"},629:{n:"BrtEndComments"},630:{n:"BrtBeginCommentAuthors"},631:{n:"BrtEndCommentAuthors"},632:{n:"BrtCommentAuthor",f:li},633:{n:"BrtBeginCommentList"},634:{n:"BrtEndCommentList"},635:{n:"BrtBeginComment",f:function(e){var t={};t.iauthor=e.read_shift(4);var r=kr(e,16);return t.rfx=r.s,t.ref=qt(r.s),e.l+=16,t}},636:{n:"BrtEndComment"},637:{n:"BrtCommentText",f:ur},638:{n:"BrtBeginOleObjects"},639:{n:"BrtOleObject"},640:{n:"BrtEndOleObjects"},641:{n:"BrtBeginSxrules"},642:{n:"BrtEndSxRules"},643:{n:"BrtBeginActiveXControls"},644:{n:"BrtActiveX"},645:{n:"BrtEndActiveXControls"},646:{n:"BrtBeginPCDSDTCEMembersSortBy"},648:{n:"BrtBeginCellIgnoreECs"},649:{n:"BrtCellIgnoreEC"},650:{n:"BrtEndCellIgnoreECs"},651:{n:"BrtCsProp",f:function(e,t){return e.l+=10,{name:lr(e)}}},652:{n:"BrtCsPageSetup"},653:{n:"BrtBeginUserCsViews"},654:{n:"BrtEndUserCsViews"},655:{n:"BrtBeginUserCsView"},656:{n:"BrtEndUserCsView"},657:{n:"BrtBeginPcdSFCIEntries"},658:{n:"BrtEndPCDSFCIEntries"},659:{n:"BrtPCDSFCIEntry"},660:{n:"BrtBeginListParts"},661:{n:"BrtListPart"},662:{n:"BrtEndListParts"},663:{n:"BrtSheetCalcProp"},664:{n:"BrtBeginFnGroup"},665:{n:"BrtFnGroup"},666:{n:"BrtEndFnGroup"},667:{n:"BrtSupAddin"},668:{n:"BrtSXTDMPOrder"},669:{n:"BrtCsProtection"},671:{n:"BrtBeginWsSortMap"},672:{n:"BrtEndWsSortMap"},673:{n:"BrtBeginRRSort"},674:{n:"BrtEndRRSort"},675:{n:"BrtRRSortItem"},676:{n:"BrtFileSharingIso"},677:{n:"BrtBookProtectionIso"},678:{n:"BrtSheetProtectionIso"},679:{n:"BrtCsProtectionIso"},680:{n:"BrtRangeProtectionIso"},681:{n:"BrtDValList"},1024:{n:"BrtRwDescent"},1025:{n:"BrtKnownFonts"},1026:{n:"BrtBeginSXTupleSet"},1027:{n:"BrtEndSXTupleSet"},1028:{n:"BrtBeginSXTupleSetHeader"},1029:{n:"BrtEndSXTupleSetHeader"},1030:{n:"BrtSXTupleSetHeaderItem"},1031:{n:"BrtBeginSXTupleSetData"},1032:{n:"BrtEndSXTupleSetData"},1033:{n:"BrtBeginSXTupleSetRow"},1034:{n:"BrtEndSXTupleSetRow"},1035:{n:"BrtSXTupleSetRowItem"},1036:{n:"BrtNameExt"},1037:{n:"BrtPCDH14"},1038:{n:"BrtBeginPCDCalcMem14"},1039:{n:"BrtEndPCDCalcMem14"},1040:{n:"BrtSXTH14"},1041:{n:"BrtBeginSparklineGroup"},1042:{n:"BrtEndSparklineGroup"},1043:{n:"BrtSparkline"},1044:{n:"BrtSXDI14"},1045:{n:"BrtWsFmtInfoEx14"},1046:{n:"BrtBeginConditionalFormatting14"},1047:{n:"BrtEndConditionalFormatting14"},1048:{n:"BrtBeginCFRule14"},1049:{n:"BrtEndCFRule14"},1050:{n:"BrtCFVO14"},1051:{n:"BrtBeginDatabar14"},1052:{n:"BrtBeginIconSet14"},1053:{n:"BrtDVal14",f:function(){}},1054:{n:"BrtBeginDVals14"},1055:{n:"BrtColor14"},1056:{n:"BrtBeginSparklines"},1057:{n:"BrtEndSparklines"},1058:{n:"BrtBeginSparklineGroups"},1059:{n:"BrtEndSparklineGroups"},1061:{n:"BrtSXVD14"},1062:{n:"BrtBeginSXView14"},1063:{n:"BrtEndSXView14"},1064:{n:"BrtBeginSXView16"},1065:{n:"BrtEndSXView16"},1066:{n:"BrtBeginPCD14"},1067:{n:"BrtEndPCD14"},1068:{n:"BrtBeginExtConn14"},1069:{n:"BrtEndExtConn14"},1070:{n:"BrtBeginSlicerCacheIDs"},1071:{n:"BrtEndSlicerCacheIDs"},1072:{n:"BrtBeginSlicerCacheID"},1073:{n:"BrtEndSlicerCacheID"},1075:{n:"BrtBeginSlicerCache"},1076:{n:"BrtEndSlicerCache"},1077:{n:"BrtBeginSlicerCacheDef"},1078:{n:"BrtEndSlicerCacheDef"},1079:{n:"BrtBeginSlicersEx"},1080:{n:"BrtEndSlicersEx"},1081:{n:"BrtBeginSlicerEx"},1082:{n:"BrtEndSlicerEx"},1083:{n:"BrtBeginSlicer"},1084:{n:"BrtEndSlicer"},1085:{n:"BrtSlicerCachePivotTables"},1086:{n:"BrtBeginSlicerCacheOlapImpl"},1087:{n:"BrtEndSlicerCacheOlapImpl"},1088:{n:"BrtBeginSlicerCacheLevelsData"},1089:{n:"BrtEndSlicerCacheLevelsData"},1090:{n:"BrtBeginSlicerCacheLevelData"},1091:{n:"BrtEndSlicerCacheLevelData"},1092:{n:"BrtBeginSlicerCacheSiRanges"},1093:{n:"BrtEndSlicerCacheSiRanges"},1094:{n:"BrtBeginSlicerCacheSiRange"},1095:{n:"BrtEndSlicerCacheSiRange"},1096:{n:"BrtSlicerCacheOlapItem"},1097:{n:"BrtBeginSlicerCacheSelections"},1098:{n:"BrtSlicerCacheSelection"},1099:{n:"BrtEndSlicerCacheSelections"},1100:{n:"BrtBeginSlicerCacheNative"},1101:{n:"BrtEndSlicerCacheNative"},1102:{n:"BrtSlicerCacheNativeItem"},1103:{n:"BrtRangeProtection14"},1104:{n:"BrtRangeProtectionIso14"},1105:{n:"BrtCellIgnoreEC14"},1111:{n:"BrtList14"},1112:{n:"BrtCFIcon"},1113:{n:"BrtBeginSlicerCachesPivotCacheIDs"},1114:{n:"BrtEndSlicerCachesPivotCacheIDs"},1115:{n:"BrtBeginSlicers"},1116:{n:"BrtEndSlicers"},1117:{n:"BrtWbProp14"},1118:{n:"BrtBeginSXEdit"},1119:{n:"BrtEndSXEdit"},1120:{n:"BrtBeginSXEdits"},1121:{n:"BrtEndSXEdits"},1122:{n:"BrtBeginSXChange"},1123:{n:"BrtEndSXChange"},1124:{n:"BrtBeginSXChanges"},1125:{n:"BrtEndSXChanges"},1126:{n:"BrtSXTupleItems"},1128:{n:"BrtBeginSlicerStyle"},1129:{n:"BrtEndSlicerStyle"},1130:{n:"BrtSlicerStyleElement"},1131:{n:"BrtBeginStyleSheetExt14"},1132:{n:"BrtEndStyleSheetExt14"},1133:{n:"BrtBeginSlicerCachesPivotCacheID"},1134:{n:"BrtEndSlicerCachesPivotCacheID"},1135:{n:"BrtBeginConditionalFormattings"},1136:{n:"BrtEndConditionalFormattings"},1137:{n:"BrtBeginPCDCalcMemExt"},1138:{n:"BrtEndPCDCalcMemExt"},1139:{n:"BrtBeginPCDCalcMemsExt"},1140:{n:"BrtEndPCDCalcMemsExt"},1141:{n:"BrtPCDField14"},1142:{n:"BrtBeginSlicerStyles"},1143:{n:"BrtEndSlicerStyles"},1144:{n:"BrtBeginSlicerStyleElements"},1145:{n:"BrtEndSlicerStyleElements"},1146:{n:"BrtCFRuleExt"},1147:{n:"BrtBeginSXCondFmt14"},1148:{n:"BrtEndSXCondFmt14"},1149:{n:"BrtBeginSXCondFmts14"},1150:{n:"BrtEndSXCondFmts14"},1152:{n:"BrtBeginSortCond14"},1153:{n:"BrtEndSortCond14"},1154:{n:"BrtEndDVals14"},1155:{n:"BrtEndIconSet14"},1156:{n:"BrtEndDatabar14"},1157:{n:"BrtBeginColorScale14"},1158:{n:"BrtEndColorScale14"},1159:{n:"BrtBeginSxrules14"},1160:{n:"BrtEndSxrules14"},1161:{n:"BrtBeginPRule14"},1162:{n:"BrtEndPRule14"},1163:{n:"BrtBeginPRFilters14"},1164:{n:"BrtEndPRFilters14"},1165:{n:"BrtBeginPRFilter14"},1166:{n:"BrtEndPRFilter14"},1167:{n:"BrtBeginPRFItem14"},1168:{n:"BrtEndPRFItem14"},1169:{n:"BrtBeginCellIgnoreECs14"},1170:{n:"BrtEndCellIgnoreECs14"},1171:{n:"BrtDxf14"},1172:{n:"BrtBeginDxF14s"},1173:{n:"BrtEndDxf14s"},1177:{n:"BrtFilter14"},1178:{n:"BrtBeginCustomFilters14"},1180:{n:"BrtCustomFilter14"},1181:{n:"BrtIconFilter14"},1182:{n:"BrtPivotCacheConnectionName"},2048:{n:"BrtBeginDecoupledPivotCacheIDs"},2049:{n:"BrtEndDecoupledPivotCacheIDs"},2050:{n:"BrtDecoupledPivotCacheID"},2051:{n:"BrtBeginPivotTableRefs"},2052:{n:"BrtEndPivotTableRefs"},2053:{n:"BrtPivotTableRef"},2054:{n:"BrtSlicerCacheBookPivotTables"},2055:{n:"BrtBeginSxvcells"},2056:{n:"BrtEndSxvcells"},2057:{n:"BrtBeginSxRow"},2058:{n:"BrtEndSxRow"},2060:{n:"BrtPcdCalcMem15"},2067:{n:"BrtQsi15"},2068:{n:"BrtBeginWebExtensions"},2069:{n:"BrtEndWebExtensions"},2070:{n:"BrtWebExtension"},2071:{n:"BrtAbsPath15"},2072:{n:"BrtBeginPivotTableUISettings"},2073:{n:"BrtEndPivotTableUISettings"},2075:{n:"BrtTableSlicerCacheIDs"},2076:{n:"BrtTableSlicerCacheID"},2077:{n:"BrtBeginTableSlicerCache"},2078:{n:"BrtEndTableSlicerCache"},2079:{n:"BrtSxFilter15"},2080:{n:"BrtBeginTimelineCachePivotCacheIDs"},2081:{n:"BrtEndTimelineCachePivotCacheIDs"},2082:{n:"BrtTimelineCachePivotCacheID"},2083:{n:"BrtBeginTimelineCacheIDs"},2084:{n:"BrtEndTimelineCacheIDs"},2085:{n:"BrtBeginTimelineCacheID"},2086:{n:"BrtEndTimelineCacheID"},2087:{n:"BrtBeginTimelinesEx"},2088:{n:"BrtEndTimelinesEx"},2089:{n:"BrtBeginTimelineEx"},2090:{n:"BrtEndTimelineEx"},2091:{n:"BrtWorkBookPr15"},2092:{n:"BrtPCDH15"},2093:{n:"BrtBeginTimelineStyle"},2094:{n:"BrtEndTimelineStyle"},2095:{n:"BrtTimelineStyleElement"},2096:{n:"BrtBeginTimelineStylesheetExt15"},2097:{n:"BrtEndTimelineStylesheetExt15"},2098:{n:"BrtBeginTimelineStyles"},2099:{n:"BrtEndTimelineStyles"},2100:{n:"BrtBeginTimelineStyleElements"},2101:{n:"BrtEndTimelineStyleElements"},2102:{n:"BrtDxf15"},2103:{n:"BrtBeginDxfs15"},2104:{n:"brtEndDxfs15"},2105:{n:"BrtSlicerCacheHideItemsWithNoData"},2106:{n:"BrtBeginItemUniqueNames"},2107:{n:"BrtEndItemUniqueNames"},2108:{n:"BrtItemUniqueName"},2109:{n:"BrtBeginExtConn15"},2110:{n:"BrtEndExtConn15"},2111:{n:"BrtBeginOledbPr15"},2112:{n:"BrtEndOledbPr15"},2113:{n:"BrtBeginDataFeedPr15"},2114:{n:"BrtEndDataFeedPr15"},2115:{n:"BrtTextPr15"},2116:{n:"BrtRangePr15"},2117:{n:"BrtDbCommand15"},2118:{n:"BrtBeginDbTables15"},2119:{n:"BrtEndDbTables15"},2120:{n:"BrtDbTable15"},2121:{n:"BrtBeginDataModel"},2122:{n:"BrtEndDataModel"},2123:{n:"BrtBeginModelTables"},2124:{n:"BrtEndModelTables"},2125:{n:"BrtModelTable"},2126:{n:"BrtBeginModelRelationships"},2127:{n:"BrtEndModelRelationships"},2128:{n:"BrtModelRelationship"},2129:{n:"BrtBeginECTxtWiz15"},2130:{n:"BrtEndECTxtWiz15"},2131:{n:"BrtBeginECTWFldInfoLst15"},2132:{n:"BrtEndECTWFldInfoLst15"},2133:{n:"BrtBeginECTWFldInfo15"},2134:{n:"BrtFieldListActiveItem"},2135:{n:"BrtPivotCacheIdVersion"},2136:{n:"BrtSXDI15"},2137:{n:"BrtBeginModelTimeGroupings"},2138:{n:"BrtEndModelTimeGroupings"},2139:{n:"BrtBeginModelTimeGrouping"},2140:{n:"BrtEndModelTimeGrouping"},2141:{n:"BrtModelTimeGroupingCalcCol"},3072:{n:"BrtUid"},3073:{n:"BrtRevisionPtr"},5095:{n:"BrtBeginCalcFeatures"},5096:{n:"BrtEndCalcFeatures"},5097:{n:"BrtCalcFeature"},65535:{n:""}},$l=z(Kl,"n");$l.BrtFRTArchID$=16;var Yl={6:{n:"Formula",f:eo},10:{n:"EOF",f:Ln},12:{n:"CalcCount",f:zn},13:{n:"CalcMode",f:zn},14:{n:"CalcPrecision",f:Mn},15:{n:"CalcRefMode",f:Mn},16:{n:"CalcDelta",f:xr},17:{n:"CalcIter",f:Mn},18:{n:"Protect",f:Mn},19:{n:"Password",f:zn},20:{n:"Header",f:Sa},21:{n:"Footer",f:Sa},23:{n:"ExternSheet",f:Ta},24:{n:"Lbl",f:Ba},25:{n:"WinProtect",f:Mn},26:{n:"VerticalPageBreaks"},27:{n:"HorizontalPageBreaks"},28:{n:"Note",f:function(e,t,r){return function(e,t,r){if(!(r.biff<8)){var n=e.read_shift(2),a=e.read_shift(2),s=e.read_shift(2),i=e.read_shift(2),o=Yn(e,0,r);return r.biff<8&&e.read_shift(1),[{r:n,c:a},o,i,s]}}(e,0,r)}},29:{n:"Selection"},34:{n:"Date1904",f:Mn},35:{n:"ExternName",f:_a},38:{n:"LeftMargin",f:xr},39:{n:"RightMargin",f:xr},40:{n:"TopMargin",f:xr},41:{n:"BottomMargin",f:xr},42:{n:"PrintRowCol",f:Mn},43:{n:"PrintGrid",f:Mn},47:{n:"FilePass",f:function(e,t,r){var n={Type:r.biff>=8?e.read_shift(2):0};return n.Type?function(e,t,r){var n=r||{};n.Info=e.read_shift(2),e.l-=2,1===n.Info?n.Data=function(e){var t={},r=t.EncryptionVersionInfo=ts(e,4);if(1!=r.Major||1!=r.Minor)throw"unrecognized version code "+r.Major+" : "+r.Minor;return t.Salt=e.read_shift(16),t.EncryptedVerifier=e.read_shift(16),t.EncryptedVerifierHash=e.read_shift(16),t}(e):n.Data=function(e,t){var r={},n=r.EncryptionVersionInfo=ts(e,4);if(t-=4,2!=n.Minor)throw new Error("unrecognized minor version code: "+n.Minor);if(n.Major>4||n.Major<2)throw new Error("unrecognized major version code: "+n.Major);r.Flags=e.read_shift(4),t-=4;var a=e.read_shift(4);return t-=4,r.EncryptionHeader=ns(e,a),t-=a,r.EncryptionVerifier=as(e,t),r}(e,t)}(e,t-2,n):function(e,t,r,n){var a,s,i,o={key:zn(e),verificationBytes:zn(e)};r.password&&(o.verifier=ls(r.password)),n.valid=o.verificationBytes===o.verifier,n.valid&&(n.insitu=(a=r.password,s=0,i=ds(a),function(e){var t=function(e,t,r,n,a){var s,i;for(a||(a=t),n||(n=ds("")),s=0;s!=t.length;++s)i=t[s],i=255&((i^=n[r])>>5|i<<3),a[s]=i,++r;return[a,r,n]}(0,e,s,i);return s=t[1],t[0]}))}(e,r.biff,r,n),n}},49:{n:"Font",f:function(e,t,r){var n={dyHeight:e.read_shift(2),fl:e.read_shift(2)};switch(r&&r.biff||8){case 2:break;case 3:case 4:e.l+=2;break;default:e.l+=10}return n.name=Xn(e,0,r),n}},51:{n:"PrintSize",f:zn},60:{n:"Continue"},61:{n:"Window1",f:function(e){return{Pos:[e.read_shift(2),e.read_shift(2)],Dim:[e.read_shift(2),e.read_shift(2)],Flags:e.read_shift(2),CurTab:e.read_shift(2),FirstTab:e.read_shift(2),Selected:e.read_shift(2),TabRatio:e.read_shift(2)}}},64:{n:"Backup",f:Mn},65:{n:"Pane",f:function(){}},66:{n:"CodePage",f:zn},77:{n:"Pls"},80:{n:"DCon"},81:{n:"DConRef"},82:{n:"DConName"},85:{n:"DefColWidth",f:zn},89:{n:"XCT"},90:{n:"CRN"},91:{n:"FileSharing"},92:{n:"WriteAccess",f:function(e,t,r){if(r.enc)return e.l+=t,"";var n=e.l,a=Yn(e,0,r);return e.read_shift(t+n-e.l),a}},93:{n:"Obj",f:function(e,t,r){if(r&&r.biff<8)return function(e,t,r){e.l+=4;var n=e.read_shift(2),a=e.read_shift(2),s=e.read_shift(2);e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=2,e.l+=6,t-=36;var i=[];return i.push((ya[n]||Ut)(e,t,r)),{cmo:[a,n,s],ft:i}}(e,t,r);var n=fa(e),a=function(e,t){for(var r=e.l+t,n=[];e.l7||t[1]>7)throw new Error("Bad Gutters: "+t.join("|"));return t}},129:{n:"WsBool",f:function(e,t,r){var n=r&&8==r.biff||2==t?e.read_shift(2):(e.l+=t,0);return{fDialog:16&n,fBelow:64&n,fRight:128&n}}},130:{n:"GridSet",f:zn},131:{n:"HCenter",f:Mn},132:{n:"VCenter",f:Mn},133:{n:"BoundSheet8",f:function(e,t,r){var n=e.read_shift(4),a=3&e.read_shift(1),s=e.read_shift(1);switch(s){case 0:s="Worksheet";break;case 1:s="Macrosheet";break;case 2:s="Chartsheet";break;case 6:s="VBAModule"}var i=Xn(e,0,r);return 0===i.length&&(i="Sheet1"),{pos:n,hs:a,dt:s,name:i}}},134:{n:"WriteProtect"},140:{n:"Country",f:function(e){var t,r=[0,0];return t=e.read_shift(2),r[0]=zr[t]||t,t=e.read_shift(2),r[1]=zr[t]||t,r}},141:{n:"HideObj",f:zn},144:{n:"Sort"},146:{n:"Palette",f:function(e){for(var t=e.read_shift(2),r=[];t-- >0;)r.push(ta(e));return r}},151:{n:"Sync"},152:{n:"LPr"},153:{n:"DxGCol"},154:{n:"FnGroupName"},155:{n:"FilterMode"},156:{n:"BuiltInFnGroupCount",f:zn},157:{n:"AutoFilterInfo"},158:{n:"AutoFilter"},160:{n:"Scl",f:Fa},161:{n:"Setup",f:function(e,t){var r={};return t<32||(e.l+=16,r.header=xr(e),r.footer=xr(e),e.l+=2),r}},174:{n:"ScenMan"},175:{n:"SCENARIO"},176:{n:"SxView"},177:{n:"Sxvd"},178:{n:"SXVI"},180:{n:"SxIvd"},181:{n:"SXLI"},182:{n:"SXPI"},184:{n:"DocRoute"},185:{n:"RecipName"},189:{n:"MulRk",f:function(e,t){for(var r=e.l+t-2,n=e.read_shift(2),a=e.read_shift(2),s=[];e.l>2&1,n.data=function(e,t,r,n){var a={},s=e.read_shift(4),i=e.read_shift(4),o=e.read_shift(4),l=e.read_shift(2);return a.patternType=Hr[o>>26],n.cellStyles?(a.alc=7&s,a.fWrap=s>>3&1,a.alcV=s>>4&7,a.fJustLast=s>>7&1,a.trot=s>>8&255,a.cIndent=s>>16&15,a.fShrinkToFit=s>>20&1,a.iReadOrder=s>>22&2,a.fAtrNum=s>>26&1,a.fAtrFnt=s>>27&1,a.fAtrAlc=s>>28&1,a.fAtrBdr=s>>29&1,a.fAtrPat=s>>30&1,a.fAtrProt=s>>31&1,a.dgLeft=15&i,a.dgRight=i>>4&15,a.dgTop=i>>8&15,a.dgBottom=i>>12&15,a.icvLeft=i>>16&127,a.icvRight=i>>23&127,a.grbitDiag=i>>30&3,a.icvTop=127&o,a.icvBottom=o>>7&127,a.icvDiag=o>>14&127,a.dgDiag=o>>21&15,a.icvFore=127&l,a.icvBack=l>>7&127,a.fsxButton=l>>14&1,a):a}(e,0,n.fStyle,r),n}},225:{n:"InterfaceHdr",f:function(e,t){return 0===t||e.read_shift(2),1200}},226:{n:"InterfaceEnd",f:Ln},227:{n:"SXVS"},229:{n:"MergeCells",f:function(e,t){for(var r=[],n=e.read_shift(2);n--;)r.push(ia(e));return r}},233:{n:"BkHim"},235:{n:"MsoDrawingGroup"},236:{n:"MsoDrawing"},237:{n:"MsoDrawingSelection"},239:{n:"PhoneticInfo"},240:{n:"SxRule"},241:{n:"SXEx"},242:{n:"SxFilt"},244:{n:"SxDXF"},245:{n:"SxItm"},246:{n:"SxName"},247:{n:"SxSelect"},248:{n:"SXPair"},249:{n:"SxFmla"},251:{n:"SxFormat"},252:{n:"SST",f:function(e,t){for(var r=e.l+t,n=e.read_shift(4),a=e.read_shift(4),s=[],i=0;i!=a&&e.l255)throw new Error("Unexpected SupBook type: "+s);for(var i=Kn(e,s),o=[];n>e.l;)o.push($n(e));return[s,a,i,o]}},431:{n:"Prot4Rev",f:Mn},432:{n:"CondFmt"},433:{n:"CF"},434:{n:"DVal"},437:{n:"DConBin"},438:{n:"TxO",f:function(e,t,r){var n=e.l,a="";try{e.l+=4;var s=(r.lastobj||{cmo:[0,0]}).cmo[1];-1==[0,5,7,11,12,14].indexOf(s)?e.l+=6:function(e){var t=e.read_shift(1);e.l++;var r=e.read_shift(2);e.l+=2}(e);var i=e.read_shift(2);e.read_shift(2),zn(e);var o=e.read_shift(2);e.l+=o;for(var l=1;l=(c?i:2*i))break}if(a.length!==i&&a.length!==2*i)throw new Error("cchText: "+i+" != "+a.length);return e.l=n+t,{t:a}}catch(r){return e.l=n+t,{t:a}}}},439:{n:"RefreshAll",f:Mn},440:{n:"HLink",f:function(e,t){var r=ia(e);e.l+=16;var n=function(e,t){var r=e.l+t,n=e.read_shift(4);if(2!==n)throw new Error("Unrecognized streamVersion: "+n);var a=e.read_shift(2);e.l+=2;var s,i,o,l,c,f,h="";16&a&&(s=Qn(e,e.l)),128&a&&(i=Qn(e,e.l)),257&~a||(o=Qn(e,e.l)),1==(257&a)&&(l=function(e){var t=e.read_shift(16);switch(t){case"e0c9ea79f9bace118c8200aa004ba90b":return function(e){var t=e.read_shift(4),r=e.l,n=!1;t>24&&(e.l+=t-24,"795881f43b1d7f48af2c825dc4852763"===e.read_shift(16)&&(n=!0),e.l=r);var a=e.read_shift((n?t-24:t)>>1,"utf16le").replace(k,"");return n&&(e.l+=24),a}(e);case"0303000000000000c000000000000046":return function(e){for(var t=e.read_shift(2),r="";t-- >0;)r+="../";var n=e.read_shift(0,"lpstr-ansi");if(e.l+=2,57005!=e.read_shift(2))throw new Error("Bad FileMoniker");if(0===e.read_shift(4))return r+n.replace(/\\/g,"/");var a=e.read_shift(4);if(3!=e.read_shift(2))throw new Error("Bad FileMoniker");return r+e.read_shift(a>>1,"utf16le").replace(k,"")}(e);default:throw new Error("Unsupported Moniker "+t)}}(e,e.l)),8&a&&(h=Qn(e,e.l)),32&a&&(c=e.read_shift(16)),64&a&&(f=En(e)),e.l=r;var u=i||o||l||"";u&&h&&(u+="#"+h),u||(u="#"+h),2&a&&"/"==u.charAt(0)&&"/"!=u.charAt(1)&&(u="file://"+u);var d={Target:u};return c&&(d.guid=c),f&&(d.time=f),s&&(d.Tooltip=s),d}(e,t-24);return[r,n]}},441:{n:"Lel"},442:{n:"CodeName",f:$n},443:{n:"SXFDBType"},444:{n:"Prot4RevPass",f:zn},445:{n:"ObNoMacros"},446:{n:"Dv"},448:{n:"Excel9File",f:Ln},449:{n:"RecalcId",f:function(e){return e.read_shift(2),e.read_shift(4)},r:2},450:{n:"EntExU2",f:Ln},512:{n:"Dimensions",f:wa},513:{n:"Blank",f:Oa},515:{n:"Number",f:function(e,t,r){r.biffguess&&2==r.biff&&(r.biff=5);var n=ra(e),a=xr(e);return n.val=a,n}},516:{n:"Label",f:function(e,t,r){r.biffguess&&2==r.biff&&(r.biff=5),e.l;var n=ra(e);2==r.biff&&e.l++;var a=$n(e,e.l,r);return n.val=a,n}},517:{n:"BoolErr",f:Ea},519:{n:"String",f:Da},520:{n:"Row",f:function(e){var t={};t.r=e.read_shift(2),t.c=e.read_shift(2),t.cnt=e.read_shift(2)-t.c;var r=e.read_shift(2);e.l+=4;var n=e.read_shift(1);return e.l+=3,7&n&&(t.level=7&n),32&n&&(t.hidden=!0),64&n&&(t.hpt=r/20),t}},523:{n:"Index"},545:{n:"Array",f:ka},549:{n:"DefaultRowHeight",f:ma},566:{n:"Table"},574:{n:"Window2",f:function(e,t,r){return r&&r.biff>=2&&r.biff<5?{}:{RTL:64&e.read_shift(2)}}},638:{n:"RK",f:function(e){var t=e.read_shift(2),r=e.read_shift(2),n=sa(e);return{r:t,c:r,ixfe:n[0],rknum:n[1]}}},659:{n:"Style"},1048:{n:"BigName"},1054:{n:"Format",f:function(e,t,r){return[e.read_shift(2),Yn(e,0,r)]}},1084:{n:"ContinueBigName"},1212:{n:"ShrFmla",f:function(e,t,r){var n=la(e);e.l++;var a=e.read_shift(1);return[qi(e,t-=8,r),a,n]}},2048:{n:"HLinkTooltip",f:function(e,t){e.read_shift(2);var r=ia(e),n=e.read_shift((t-10)/2,"dbcs-cont");return[r,n=n.replace(k,"")]}},2049:{n:"WebPub"},2050:{n:"QsiSXTag"},2051:{n:"DBQueryExt"},2052:{n:"ExtString"},2053:{n:"TxtQry"},2054:{n:"Qsir"},2055:{n:"Qsif"},2056:{n:"RRDTQSIF"},2057:{n:"BOF",f:da},2058:{n:"OleDbConn"},2059:{n:"WOpt"},2060:{n:"SXViewEx"},2061:{n:"SXTH"},2062:{n:"SXPIEx"},2063:{n:"SXVDTEx"},2064:{n:"SXViewEx9"},2066:{n:"ContinueFrt"},2067:{n:"RealTimeData"},2128:{n:"ChartFrtInfo"},2129:{n:"FrtWrapper"},2130:{n:"StartBlock"},2131:{n:"EndBlock"},2132:{n:"StartObject"},2133:{n:"EndObject"},2134:{n:"CatLab"},2135:{n:"YMult"},2136:{n:"SXViewLink"},2137:{n:"PivotChartBits"},2138:{n:"FrtFontList"},2146:{n:"SheetExt"},2147:{n:"BookExt",r:12},2148:{n:"SXAddl"},2149:{n:"CrErr"},2150:{n:"HFPicture"},2151:{n:"FeatHdr",f:Ln},2152:{n:"Feat"},2154:{n:"DataLabExt"},2155:{n:"DataLabExtContents"},2156:{n:"CellWatch"},2161:{n:"FeatHdr11"},2162:{n:"Feature11"},2164:{n:"DropDownObjIds"},2165:{n:"ContinueFrt11"},2166:{n:"DConn"},2167:{n:"List12"},2168:{n:"Feature12"},2169:{n:"CondFmt12"},2170:{n:"CF12"},2171:{n:"CFEx"},2172:{n:"XFCRC",f:function(e){e.l+=2;var t={cxfs:0,crc:0};return t.cxfs=e.read_shift(2),t.crc=e.read_shift(4),t},r:12},2173:{n:"XFExt",f:function(e,t){e.l,e.l+=2;var r=e.read_shift(2);e.l+=2;for(var n=e.read_shift(2),a=[];n-- >0;)a.push(ri(e,e.l));return{ixfe:r,ext:a}},r:12},2174:{n:"AutoFilter12"},2175:{n:"ContinueFrt12"},2180:{n:"MDTInfo"},2181:{n:"MDXStr"},2182:{n:"MDXTuple"},2183:{n:"MDXSet"},2184:{n:"MDXProp"},2185:{n:"MDXKPI"},2186:{n:"MDB"},2187:{n:"PLV"},2188:{n:"Compat12",f:Mn,r:12},2189:{n:"DXF"},2190:{n:"TableStyles",r:12},2191:{n:"TableStyle"},2192:{n:"TableStyleElement"},2194:{n:"StyleExt"},2195:{n:"NamePublish"},2196:{n:"NameCmt",f:function(e,t,r){if(!(r.biff<8)){var n=e.read_shift(2),a=e.read_shift(2);return[Kn(e,n,r),Kn(e,a,r)]}e.l+=t},r:12},2197:{n:"SortData"},2198:{n:"Theme",f:function(e,t,r){var n=e.l+t;if(124226!==e.read_shift(4))if(r.cellStyles){var a,s=e.slice(e.l);e.l=n;try{a=pe(s,{type:"array"})}catch(e){return}var i=he(a,"theme/theme/theme1.xml",!0);if(i)return ei(i,r)}else e.l=n},r:12},2199:{n:"GUIDTypeLib"},2200:{n:"FnGrp12"},2201:{n:"NameFnGrp12"},2202:{n:"MTRSettings",f:function(e){return[0!==e.read_shift(4),0!==e.read_shift(4),e.read_shift(4)]},r:12},2203:{n:"CompressPictures",f:Ln},2204:{n:"HeaderFooter"},2205:{n:"CrtLayout12"},2206:{n:"CrtMlFrt"},2207:{n:"CrtMlFrtContinue"},2211:{n:"ForceFullCalculation",f:function(e){var t=function(e){var t=e.read_shift(2),r=e.read_shift(2);return e.l+=8,{type:t,flags:r}}(e);if(2211!=t.type)throw new Error("Invalid Future Record "+t.type);return 0!==e.read_shift(4)}},2212:{n:"ShapePropsStream"},2213:{n:"TextPropsStream"},2214:{n:"RichTextStream"},2215:{n:"CrtLayout12A"},4097:{n:"Units"},4098:{n:"Chart"},4099:{n:"Series"},4102:{n:"DataFormat"},4103:{n:"LineFormat"},4105:{n:"MarkerFormat"},4106:{n:"AreaFormat"},4107:{n:"PieFormat"},4108:{n:"AttachedLabel"},4109:{n:"SeriesText"},4116:{n:"ChartFormat"},4117:{n:"Legend"},4118:{n:"SeriesList"},4119:{n:"Bar"},4120:{n:"Line"},4121:{n:"Pie"},4122:{n:"Area"},4123:{n:"Scatter"},4124:{n:"CrtLine"},4125:{n:"Axis"},4126:{n:"Tick"},4127:{n:"ValueRange"},4128:{n:"CatSerRange"},4129:{n:"AxisLine"},4130:{n:"CrtLink"},4132:{n:"DefaultText"},4133:{n:"Text"},4134:{n:"FontX",f:zn},4135:{n:"ObjectLink"},4146:{n:"Frame"},4147:{n:"Begin"},4148:{n:"End"},4149:{n:"PlotArea"},4154:{n:"Chart3d"},4156:{n:"PicF"},4157:{n:"DropBar"},4158:{n:"Radar"},4159:{n:"Surf"},4160:{n:"RadarArea"},4161:{n:"AxisParent"},4163:{n:"LegendException"},4164:{n:"ShtProps",f:function(e,t,r){var n={area:!1};if(5!=r.biff)return e.l+=t,n;var a=e.read_shift(1);return e.l+=3,16&a&&(n.area=!0),n}},4165:{n:"SerToCrt"},4166:{n:"AxesUsed"},4168:{n:"SBaseRef"},4170:{n:"SerParent"},4171:{n:"SerAuxTrend"},4174:{n:"IFmtRecord"},4175:{n:"Pos"},4176:{n:"AlRuns"},4177:{n:"BRAI"},4187:{n:"SerAuxErrBar"},4188:{n:"ClrtClient",f:function(e){for(var t=e.read_shift(2),r=[];t-- >0;)r.push(ta(e));return r}},4189:{n:"SerFmt"},4191:{n:"Chart3DBarShape"},4192:{n:"Fbi"},4193:{n:"BopPop"},4194:{n:"AxcExt"},4195:{n:"Dat"},4196:{n:"PlotGrowth"},4197:{n:"SIIndex"},4198:{n:"GelFrame"},4199:{n:"BopPopCustom"},4200:{n:"Fbi2"},0:{n:"Dimensions",f:wa},1:{n:"BIFF2BLANK"},2:{n:"BIFF2INT",f:function(e){var t=ra(e);++e.l;var r=e.read_shift(2);return t.t="n",t.val=r,t}},3:{n:"BIFF2NUM",f:function(e){var t=ra(e);++e.l;var r=xr(e);return t.t="n",t.val=r,t}},4:{n:"BIFF2STR",f:function(e,t,r){r.biffguess&&5==r.biff&&(r.biff=2);var n=ra(e);++e.l;var a=Yn(e,0,r);return n.t="str",n.val=a,n}},5:{n:"BoolErr",f:Ea},7:{n:"String",f:function(e){var t=e.read_shift(1);return 0===t?(e.l++,""):e.read_shift(t,"sbcs-cont")}},8:{n:"BIFF2ROW"},9:{n:"BOF",f:da},11:{n:"Index"},22:{n:"ExternCount",f:zn},30:{n:"BIFF2FORMAT",f:ba},31:{n:"BIFF2FMTCNT"},32:{n:"BIFF2COLINFO"},33:{n:"Array",f:ka},36:{n:"COLWIDTH"},37:{n:"DefaultRowHeight",f:ma},50:{n:"BIFF2FONTXTRA",f:function(e,t){e.l+=6,e.l+=2,e.l+=1,e.l+=3,e.l+=1,e.l+=t-13}},62:{n:"BIFF2WINDOW2"},52:{n:"DDEObjName"},67:{n:"BIFF2XF"},68:{n:"BIFF2XFINDEX",f:zn},69:{n:"BIFF2FONTCLR"},86:{n:"BIFF4FMTCNT"},126:{n:"RK"},127:{n:"ImData",f:function(e){var t=e.read_shift(2),r=e.read_shift(2),n=e.read_shift(4),a={fmt:t,env:r,len:n,data:e.slice(e.l,e.l+n)};return e.l+=n,a}},135:{n:"Addin"},136:{n:"Edg"},137:{n:"Pub"},145:{n:"Sub"},148:{n:"LHRecord"},149:{n:"LHNGraph"},150:{n:"Sound"},169:{n:"CoordList"},171:{n:"GCW"},188:{n:"ShrFmla"},191:{n:"ToolbarHdr"},192:{n:"ToolbarEnd"},194:{n:"AddMenu"},195:{n:"DelMenu"},214:{n:"RString",f:function(e,t,r){var n=e.l+t,a=ra(e),s=e.read_shift(2),i=Kn(e,s,r);return e.l=n,a.t="str",a.val=i,a}},223:{n:"UDDesc"},234:{n:"TabIdConf"},354:{n:"XL5Modify"},421:{n:"FileSharing2"},518:{n:"Formula",f:eo},521:{n:"BOF",f:da},536:{n:"Lbl",f:Ba},547:{n:"ExternName",f:_a},561:{n:"Font"},579:{n:"BIFF3XF"},1030:{n:"Formula",f:eo},1033:{n:"BOF",f:da},1091:{n:"BIFF4XF"},2157:{n:"FeatInfo"},2163:{n:"FeatInfo11"},2177:{n:"SXAddl12"},2240:{n:"AutoWebPub"},2241:{n:"ListObj"},2242:{n:"ListField"},2243:{n:"ListDV"},2244:{n:"ListCondFmt"},2245:{n:"ListCF"},2246:{n:"FMQry"},2247:{n:"FMSQry"},2248:{n:"PLV"},2249:{n:"LnExt"},2250:{n:"MkrExt"},2251:{n:"CrtCoopt"},2262:{n:"FRTArchId$",r:12},29282:{}},Zl=z(Yl,"n");function Ql(e,t,r,n){var a="number"==typeof t?t:+t||+Zl[t];if(!isNaN(a)){var s=n||(r||[]).length||0,i=e.next(4);i.write_shift(2,a),i.write_shift(2,s),s>0&&Bt(r)&&e.push(r)}}function Jl(e,t,r){return e||(e=zt(7)),e.write_shift(2,t),e.write_shift(2,r),e.write_shift(2,0),e.write_shift(1,0),e}function ql(e,t,r,n){if(null!=t.v)switch(t.t){case"d":case"n":var a="d"==t.t?X(q(t.v)):t.v;return void(a==(0|a)&&a>=0&&a<65536?Ql(e,2,(s=r,i=n,o=a,l=zt(9),Jl(l,s,i),l.write_shift(2,o),l)):Ql(e,3,function(e,t,r){var n=zt(15);return Jl(n,e,t),n.write_shift(8,r,"f"),n}(r,n,a)));case"b":case"e":return void Ql(e,5,function(e,t,r,n){var a=zt(9);return Jl(a,e,t),Vn(r,n||"b",a),a}(r,n,t.v,t.t));case"s":case"str":return void Ql(e,4,function(e,t,r){var n=zt(8+2*r.length);return Jl(n,e,t),n.write_shift(1,r.length),n.write_shift(r.length,r,"sbcs"),n.l255||d.e.r>=p){if(t.WTF)throw new Error("Range "+(i["!ref"]||"A1")+" exceeds format limit A1:IV16384");d.e.c=Math.min(d.e.c,255),d.e.r=Math.min(d.e.c,p-1)}Ql(a,2057,pa(0,16,t)),Ql(a,"CalcMode",Hn(1)),Ql(a,"CalcCount",Hn(100)),Ql(a,"CalcRefMode",Un(!0)),Ql(a,"CalcIter",Un(!1)),Ql(a,"CalcDelta",Ir(.001)),Ql(a,"CalcSaveRecalc",Un(!0)),Ql(a,"PrintRowCol",Un(!1)),Ql(a,"PrintGrid",Un(!1)),Ql(a,"GridSet",Hn(1)),Ql(a,"Guts",function(e){var t=zt(8);return t.write_shift(4,0),t.write_shift(2,e[0]?e[0]+1:0),t.write_shift(2,e[1]?e[1]+1:0),t}([0,0])),Ql(a,"HCenter",Un(!1)),Ql(a,"VCenter",Un(!1)),f&&function(e,t){if(t){var r=0;t.forEach(function(t,n){++r<=256&&t&&Ql(e,"ColInfo",function(e,t){var r=zt(12);r.write_shift(2,t),r.write_shift(2,t),r.write_shift(2,256*e.width),r.write_shift(2,0);var n=0;return e.hidden&&(n|=1),r.write_shift(1,n),n=e.level||0,r.write_shift(1,n),r.write_shift(2,0),r}(wo(n,t),n))})}}(a,i["!cols"]),Ql(a,512,function(e,t){var r=8!=t.biff&&t.biff?2:4,n=zt(2*r+6);return n.write_shift(r,e.s.r),n.write_shift(r,e.e.r+1),n.write_shift(2,e.s.c),n.write_shift(2,e.e.c+1),n.write_shift(2,0),n}(d,t)),f&&(i["!links"]=[]);for(var g=d.s.r;g<=d.e.r;++g){h=Yt(g);for(var m=d.s.c;m<=d.e.c;++m){g===d.s.r&&(u[m]=Qt(m)),n=u[m]+h;var v=c?(i[g]||[])[m]:i[n];v&&(ec(a,v,g,m,t),f&&v.l&&i["!links"].push([n,v.l]))}}var b=l.CodeName||l.name||s;return f&&Ql(a,"Window2",function(e){var t=zt(18),r=1718;return e&&e.RTL&&(r|=64),t.write_shift(2,r),t.write_shift(4,0),t.write_shift(4,64),t.write_shift(4,0),t.write_shift(4,0),t}((o.Views||[])[0])),f&&(i["!merges"]||[]).length&&Ql(a,"MergeCells",function(e){var t=zt(2+8*e.length);t.write_shift(2,e.length);for(var r=0;r255&&console.error("Worksheet '"+e.SheetNames[r]+"' extends beyond column IV (255). Data may be lost.")}var a=t||{};switch(a.biff||2){case 8:case 5:return function(e,t){var r=t||{},n=[];e&&!e.SSF&&(e.SSF=x.get_table()),e&&e.SSF&&(I(x),x.load_table(e.SSF),r.revssf=W(e.SSF),r.revssf[e.SSF[65535]]=0,r.ssf=e.SSF),r.Strings=[],r.Strings.Count=0,r.Strings.Unique=0,xc(r),r.cellXfs=[],Eo(r.cellXfs,{},{revssf:{General:0}}),e.Props||(e.Props={});for(var a=0;a255||i.e.r>16383){if(n.WTF)throw new Error("Range "+(t["!ref"]||"A1")+" exceeds format limit A1:IV16384");i.e.c=Math.min(i.e.c,255),i.e.r=Math.min(i.e.c,16383),a=tr(i)}for(var c=i.s.r;c<=i.e.r;++c){o=Yt(c);for(var f=i.s.c;f<=i.e.c;++f){c===i.s.r&&(l[f]=Qt(f)),a=l[f]+o;var h=s?(t[c]||[])[f]:t[a];h&&ql(e,h,c,f)}}}(n,e.Sheets[e.SheetNames[a]],0,r),Ql(n,10),n.end()}(e,t)}throw new Error("invalid type "+a.bookType+" for BIFF")}var ac=function(){function e(e,t){var r=t||{},n=r.dense?[]:{},a=(e=e.replace(//g,"")).match(/");var s=e.match(/<\/table/i),i=a.index,o=s&&s.index||e.length,l=function(e,t){if(ie||"string"==typeof t)return e.split(t);for(var r=e.split(t),n=[r[0]],a=1;a"),n.push(r[a]);return n}(e.slice(i,o),/(:?]*>)/i),c=-1,f=0,h=0,u=0,d={s:{r:1e7,c:1e7},e:{r:0,c:0}},p=[];for(i=0;i/i);for(o=0;o"))>-1;)w=w.slice(C+1);for(var E=0;E")));u=_.colspan?+_.colspan:1,((h=+_.rowspan)>1||u>1)&&p.push({s:{r:c,c:f},e:{r:c+(h||1)-1,c:f+u-1}});var A=_.t||_["data-t"]||"";if(w.length){if(w=Ge(w),d.s.r>c&&(d.s.r=c),d.e.rf&&(d.s.c=f),d.e.cr||a[c].s.c>i||a[c].e.r1&&(d.rowspan=o),l>1&&(d.colspan=l),n.editable?u=''+u+"":h&&(d["data-t"]=h&&h.t||"z",null!=h.v&&(d["data-v"]=h.v),null!=h.z&&(d["data-z"]=h.z),h.l&&"#"!=(h.l.Target||"#").charAt(0)&&(u=''+u+"")),d.id=(n.id||"sjs")+"-"+f,s.push(qe("td",u,d))}}return""+s.join("")+""}function r(e,t,r){return[].join("")+""}var n='SheetJS Table Export',a="";return{to_workbook:function(t,r){var n=t.match(/[\s\S]*?<\/table>/gi);if(!n||0==n.length)throw new Error("Invalid HTML: could not find
");if(1==n.length)return ar(e(n[0],r),r);var a=ef.book_new();return n.forEach(function(t,n){ef.book_append_sheet(a,e(t,r),"Sheet"+(n+1))}),a},to_sheet:e,_row:t,BEGIN:n,END:a,_preamble:r,from_sheet:function(e,s){var i=s||{},o=null!=i.header?i.header:n,l=null!=i.footer?i.footer:a,c=[o],f=er(e["!ref"]);i.dense=Array.isArray(e),c.push(r(0,0,i));for(var h=f.s.r;h<=f.e.r;++h)c.push(t(e,f,h,i));return c.push("
"+l),c.join("")}}}();function sc(e,t,r){var n=r||{},a=0,s=0;if(null!=n.origin)if("number"==typeof n.origin)a=n.origin;else{var i="string"==typeof n.origin?Jt(n.origin):n.origin;a=i.r,s=i.c}var o=t.getElementsByTagName("tr"),l=Math.min(n.sheetRows||1e7,o.length),c={s:{r:0,c:0},e:{r:a,c:s}};if(e["!ref"]){var f=er(e["!ref"]);c.s.r=Math.min(c.s.r,f.s.r),c.s.c=Math.min(c.s.c,f.s.c),c.e.r=Math.max(c.e.r,f.e.r),c.e.c=Math.max(c.e.c,f.e.c),-1==a&&(c.e.r=a=f.e.r+1)}var h=[],u=0,d=e["!rows"]||(e["!rows"]=[]),p=0,g=0,m=0,v=0,b=0,w=0;for(e["!cols"]||(e["!cols"]=[]);p1||w>1)&&h.push({s:{r:g+a,c:v+s},e:{r:g+a+(b||1)-1,c:v+s+(w||1)-1}});var T={t:"s",v:_},k=S.getAttribute("data-t")||S.getAttribute("t")||"";null!=_&&(0==_.length?T.t=k||"z":n.raw||0==_.trim().length||"s"==k||("TRUE"===_?T={t:"b",v:!0}:"FALSE"===_?T={t:"b",v:!1}:isNaN(ne(_))?isNaN(ae(_).getDate())||(T={t:"d",v:q(_)},n.cellDates||(T={t:"n",v:X(T.v)}),T.z=n.dateNF||x._table[14]):T={t:"n",v:ne(_)})),void 0===T.z&&null!=A&&(T.z=A);var y="",I=S.getElementsByTagName("A");if(I&&I.length)for(var R=0;R=l&&(e["!fullref"]=tr((c.e.r=o.length-p+g-1+a,c))),e}function ic(e,t){return sc((t||{}).dense?[]:{},e,t)}function oc(e){var t="",r=function(e){return e.ownerDocument.defaultView&&"function"==typeof e.ownerDocument.defaultView.getComputedStyle?e.ownerDocument.defaultView.getComputedStyle:"function"==typeof getComputedStyle?getComputedStyle:null}(e);return r&&(t=r(e).getPropertyValue("display")),t||(t=e.style.display),"none"===t}var lc,cc,fc=(lc=function(e){var t=e.replace(/[\t\r\n]/g," ").trim().replace(/ +/g," ").replace(//g," ").replace(//g,function(e,t){return Array(parseInt(t,10)+1).join(" ")}).replace(/]*\/>/g,"\t").replace(//g,"\n");return[ke(t.replace(/<[^>]*>/g,""))]},cc={day:["d","dd"],month:["m","mm"],year:["y","yy"],hours:["h","hh"],minutes:["m","mm"],seconds:["s","ss"],"am-pm":["A/P","AM/PM"],"day-of-week":["ddd","dddd"],era:["e","ee"],quarter:["\\Qm",'m\\"th quarter"']},function(e,t){var r,n,a,s,i,o,l=t||{},c=Ol(e),f=[],h={name:""},u="",d=0,p={},g=[],m=l.dense?[]:{},v={value:""},b="",w=0,C=[],E=-1,S=-1,_={s:{r:1e6,c:1e7},e:{r:0,c:0}},A=0,B={},T=[],k={},y=[],x=1,I=1,R=[],O={Names:[]},F={},D=["",""],N=[],P={},L="",M=0,U=!1,z=!1,H=0;for(Fl.lastIndex=0,c=c.replace(//gm,"").replace(//gm,"");i=Fl.exec(c);)switch(i[3]=i[3].replace(/_.*$/,"")){case"table":case"工作表":"/"===i[1]?(_.e.c>=_.s.c&&_.e.r>=_.s.r?m["!ref"]=tr(_):m["!ref"]="A1:A1",l.sheetRows>0&&l.sheetRows<=_.e.r&&(m["!fullref"]=m["!ref"],_.e.r=l.sheetRows-1,m["!ref"]=tr(_)),T.length&&(m["!merges"]=T),y.length&&(m["!rows"]=y),a.name=a["名称"]||a.name,"undefined"!=typeof JSON&&JSON.stringify(a),g.push(a.name),p[a.name]=m,z=!1):"/"!==i[0].charAt(i[0].length-2)&&(a=Ee(i[0],!1),E=S=-1,_.s.r=_.s.c=1e7,_.e.r=_.e.c=0,m=l.dense?[]:{},T=[],y=[],z=!0);break;case"table-row-group":"/"===i[1]?--A:++A;break;case"table-row":case"行":if("/"===i[1]){E+=x,x=1;break}if((s=Ee(i[0],!1))["行号"]?E=s["行号"]-1:-1==E&&(E=0),(x=+s["number-rows-repeated"]||1)<10)for(H=0;H0&&(y[E+H]={level:A});S=-1;break;case"covered-table-cell":"/"!==i[1]&&++S,l.sheetStubs&&(l.dense?(m[E]||(m[E]=[]),m[E][S]={t:"z"}):m[qt({r:E,c:S})]={t:"z"}),b="",C=[];break;case"table-cell":case"数据":if("/"===i[0].charAt(i[0].length-2))++S,v=Ee(i[0],!1),I=parseInt(v["number-columns-repeated"]||"1",10),o={t:"z",v:null},v.formula&&0!=l.cellFormula&&(o.f=fo(ke(v.formula))),"string"==(v["数据类型"]||v["value-type"])&&(o.t="s",o.v=ke(v["string-value"]||""),l.dense?(m[E]||(m[E]=[]),m[E][S]=o):m[qt({r:E,c:S})]=o),S+=I-1;else if("/"!==i[1]){b="",w=0,C=[],I=1;var W=x?E+x-1:E;if(++S>_.e.c&&(_.e.c=S),S<_.s.c&&(_.s.c=S),E<_.s.r&&(_.s.r=E),W>_.e.r&&(_.e.r=W),N=[],P={},o={t:(v=Ee(i[0],!1))["数据类型"]||v["value-type"],v:null},l.cellFormula)if(v.formula&&(v.formula=ke(v.formula)),v["number-matrix-columns-spanned"]&&v["number-matrix-rows-spanned"]&&(k={s:{r:E,c:S},e:{r:E+(parseInt(v["number-matrix-rows-spanned"],10)||0)-1,c:S+(parseInt(v["number-matrix-columns-spanned"],10)||0)-1}},o.F=tr(k),R.push([k,o.F])),v.formula)o.f=fo(v.formula);else for(H=0;H=R[H][0].s.r&&E<=R[H][0].e.r&&S>=R[H][0].s.c&&S<=R[H][0].e.c&&(o.F=R[H][1]);switch((v["number-columns-spanned"]||v["number-rows-spanned"])&&(k={s:{r:E,c:S},e:{r:E+(parseInt(v["number-rows-spanned"],10)||0)-1,c:S+(parseInt(v["number-columns-spanned"],10)||0)-1}},T.push(k)),v["number-columns-repeated"]&&(I=parseInt(v["number-columns-repeated"],10)),o.t){case"boolean":o.t="b",o.v=Ne(v["boolean-value"]);break;case"float":case"percentage":case"currency":o.t="n",o.v=parseFloat(v.value);break;case"date":o.t="d",o.v=q(v["date-value"]),l.cellDates||(o.t="n",o.v=X(o.v)),o.z="m/d/yy";break;case"time":o.t="n",o.v=Z(v["time-value"])/86400,l.cellDates&&(o.t="d",o.v=Y(o.v)),o.z="HH:MM:SS";break;case"number":o.t="n",o.v=parseFloat(v["数据数值"]);break;default:if("string"!==o.t&&"text"!==o.t&&o.t)throw new Error("Unsupported value type "+o.t);o.t="s",null!=v["string-value"]&&(b=ke(v["string-value"]),C=[])}}else{if(U=!1,"s"===o.t&&(o.v=b||"",C.length&&(o.R=C),U=0==w),F.Target&&(o.l=F),N.length>0&&(o.c=N,N=[]),b&&!1!==l.cellText&&(o.w=b),U&&(o.t="z",delete o.v),(!U||l.sheetStubs)&&!(l.sheetRows&&l.sheetRows<=E))for(var V=0;V0;)m[E+V][S+I]=te(o);else for(m[qt({r:E+V,c:S})]=o;--I>0;)m[qt({r:E+V,c:S+I})]=te(o);_.e.c<=S&&(_.e.c=S)}S+=(I=parseInt(v["number-columns-repeated"]||"1",10))-1,I=0,o={},b="",C=[]}F={};break;case"document":case"document-content":case"电子表格文档":case"spreadsheet":case"主体":case"scripts":case"styles":case"font-face-decls":case"master-styles":if("/"===i[1]){if((r=f.pop())[0]!==i[3])throw"Bad state: "+r}else"/"!==i[0].charAt(i[0].length-2)&&f.push([i[3],!0]);break;case"annotation":if("/"===i[1]){if((r=f.pop())[0]!==i[3])throw"Bad state: "+r;P.t=b,C.length&&(P.R=C),P.a=L,N.push(P)}else"/"!==i[0].charAt(i[0].length-2)&&f.push([i[3],!1]);L="",M=0,b="",w=0,C=[];break;case"creator":"/"===i[1]?L=c.slice(M,i.index):M=i.index+i[0].length;break;case"meta":case"元数据":case"settings":case"config-item-set":case"config-item-map-indexed":case"config-item-map-entry":case"config-item-map-named":case"shapes":case"frame":case"text-box":case"image":case"data-pilot-tables":case"list-style":case"form":case"dde-links":case"event-listeners":case"chart":if("/"===i[1]){if((r=f.pop())[0]!==i[3])throw"Bad state: "+r}else"/"!==i[0].charAt(i[0].length-2)&&f.push([i[3],!1]);b="",w=0,C=[];break;case"scientific-number":case"currency-symbol":case"currency-style":case"script":case"libraries":case"automatic-styles":case"default-style":case"page-layout":case"style":case"map":case"font-face":case"paragraph-properties":case"table-properties":case"table-column-properties":case"table-row-properties":case"table-cell-properties":case"fraction":case"boolean-style":case"boolean":case"text-style":case"text-content":case"text-properties":case"embedded-text":case"body":case"电子表格":case"forms":case"table-column":case"table-header-rows":case"table-rows":case"table-column-group":case"table-header-columns":case"table-columns":case"null-date":case"graphic-properties":case"calculation-settings":case"named-expressions":case"label-range":case"label-ranges":case"named-expression":case"sort":case"sort-by":case"sort-groups":case"tab":case"line-break":case"span":case"s":case"date":case"object":case"title":case"标题":case"desc":case"binary-data":case"table-source":case"scenario":case"iteration":case"content-validations":case"content-validation":case"help-message":case"error-message":case"database-ranges":case"filter":case"filter-and":case"filter-or":case"filter-condition":case"list-level-style-bullet":case"list-level-style-number":case"list-level-properties":case"sender-firstname":case"sender-lastname":case"sender-initials":case"sender-title":case"sender-position":case"sender-email":case"sender-phone-private":case"sender-fax":case"sender-company":case"sender-phone-work":case"sender-street":case"sender-city":case"sender-postal-code":case"sender-country":case"sender-state-or-province":case"author-name":case"author-initials":case"chapter":case"file-name":case"template-name":case"sheet-name":case"event-listener":case"initial-creator":case"creation-date":case"print-date":case"generator":case"document-statistic":case"user-defined":case"editing-duration":case"editing-cycles":case"config-item":case"page-number":case"page-count":case"time":case"cell-range-source":case"detective":case"operation":case"highlighted-range":case"data-pilot-table":case"source-cell-range":case"source-service":case"data-pilot-field":case"data-pilot-level":case"data-pilot-subtotals":case"data-pilot-subtotal":case"data-pilot-members":case"data-pilot-member":case"data-pilot-display-info":case"data-pilot-sort-info":case"data-pilot-layout-info":case"data-pilot-field-reference":case"data-pilot-groups":case"data-pilot-group":case"data-pilot-group-member":case"rect":case"dde-connection-decls":case"dde-connection-decl":case"dde-link":case"dde-source":case"properties":case"property":case"table-protection":case"data-pilot-grand-total":case"office-document-common-attrs":break;case"number-style":case"percentage-style":case"date-style":case"time-style":if("/"===i[1]){if(B[h.name]=u,(r=f.pop())[0]!==i[3])throw"Bad state: "+r}else"/"!==i[0].charAt(i[0].length-2)&&(u="",h=Ee(i[0],!1),f.push([i[3],!0]));break;case"number":case"day":case"month":case"year":case"era":case"day-of-week":case"week-of-year":case"quarter":case"hours":case"minutes":case"seconds":case"am-pm":switch(f[f.length-1][0]){case"time-style":case"date-style":n=Ee(i[0],!1),u+=cc[i[3]]["long"===n.style?1:0]}break;case"text":if("/>"===i[0].slice(-2))break;if("/"===i[1])switch(f[f.length-1][0]){case"number-style":case"date-style":case"time-style":u+=c.slice(d,i.index)}else d=i.index+i[0].length;break;case"named-range":D=uo((n=Ee(i[0],!1))["cell-range-address"]);var G={Name:n.name,Ref:D[0]+"!"+D[1]};z&&(G.Sheet=g.length),O.Names.push(G);break;case"p":case"文本串":if(["master-styles"].indexOf(f[f.length-1][0])>-1)break;if("/"!==i[1]||v&&v["string-value"])Ee(i[0],!1),w=i.index+i[0].length;else{var j=lc(c.slice(w,i.index));b=(b.length>0?b+"\n":"")+j[0]}break;case"database-range":if("/"===i[1])break;try{p[(D=uo(Ee(i[0])["target-range-address"]))[0]]["!autofilter"]={ref:D[1]}}catch(e){}break;case"a":if("/"!==i[1]){if(!(F=Ee(i[0],!1)).href)break;F.Target=ke(F.href),delete F.href,"#"==F.Target.charAt(0)&&F.Target.indexOf(".")>-1?(D=uo(F.Target.slice(1)),F.Target="#"+D[0]+"!"+D[1]):F.Target.match(/^\.\.[\\\/]/)&&(F.Target=F.Target.slice(3))}break;default:switch(i[2]){case"dc:":case"calcext:":case"loext:":case"ooo:":case"chartooo:":case"draw:":case"style:":case"chart:":case"form:":case"uof:":case"表:":case"字:":break;default:if(l.WTF)throw new Error(i)}}var K={Sheets:p,SheetNames:g,Workbook:O};return l.bookSheets&&delete K.Sheets,K});function hc(e,t){t=t||{},le(e,"META-INF/manifest.xml")&&function(e,t){for(var r,n,a=Ol(e);r=Fl.exec(a);)switch(r[3]){case"manifest":break;case"file-entry":if("/"==(n=Ee(r[0],!1)).path&&"application/vnd.oasis.opendocument.spreadsheet"!==n.type)throw new Error("This OpenDocument is not a spreadsheet");break;case"encryption-data":case"algorithm":case"start-key-generation":case"key-derivation":throw new Error("Unsupported ODS Encryption");default:if(t&&t.WTF)throw r}}(fe(e,"META-INF/manifest.xml"),t);var r=he(e,"content.xml");if(!r)throw new Error("Missing content.xml in ODS / UOF file");var n=fc(Pe(r),t);return le(e,"meta.xml")&&(n.Props=fn(fe(e,"meta.xml"))),n}function uc(e,t){return fc(e,t)}var dc=function(){var e=["",'',"",'',"",'',"",""].join(""),t=""+e+"";return function(){return me+t}}(),pc=function(){var e=function(e){return Ie(e).replace(/ +/g,function(e){return''}).replace(/\t/g,"").replace(/\n/g,"").replace(/^ /,"").replace(/ $/,"")},t=" \n",r=function(r,n,a){var s=[];s.push(' \n');var i=0,o=0,l=er(r["!ref"]||"A1"),c=r["!merges"]||[],f=0,h=Array.isArray(r);if(r["!cols"])for(o=0;o<=l.e.c;++o)s.push(" \n");var u="",d=r["!rows"]||[];for(i=0;i\n");for(;i<=l.e.r;++i){for(u=d[i]?' table:style-name="ro'+d[i].ods+'"':"",s.push(" \n"),o=0;oo||c[f].s.r>i||c[f].e.c\n");else{var v=qt({r:i,c:o}),b=h?(r[i]||[])[o]:r[v];if(b&&b.f&&(g["table:formula"]=Ie(ho(b.f)),b.F&&b.F.slice(0,v.length)==v)){var w=er(b.F);g["table:number-matrix-columns-spanned"]=w.e.c-w.s.c+1,g["table:number-matrix-rows-spanned"]=w.e.r-w.s.r+1}if(b){switch(b.t){case"b":m=b.v?"TRUE":"FALSE",g["office:value-type"]="boolean",g["office:boolean-value"]=b.v?"true":"false";break;case"n":m=b.w||String(b.v||0),g["office:value-type"]="float",g["office:value"]=b.v||0;break;case"s":case"str":m=null==b.v?"":b.v,g["office:value-type"]="string";break;case"d":m=b.w||q(b.v).toISOString(),g["office:value-type"]="date",g["office:date-value"]=q(b.v).toISOString(),g["table:style-name"]="ce1";break;default:s.push(t);continue}var C=e(m);if(b.l&&b.l.Target){var E=b.l.Target;"#"==(E="#"==E.charAt(0)?"#"+po(E.slice(1)):E).charAt(0)||E.match(/^\w+:/)||(E="../"+E),C=qe("text:a",C,{"xlink:href":E.replace(/&/g,"&")})}s.push(" "+qe("table:table-cell",qe("text:p",C,{}),g)+"\n")}else s.push(t)}}s.push(" \n")}return s.push(" \n"),s.join("")};return function(e,t){var n=[me],a=Je({"xmlns:office":"urn:oasis:names:tc:opendocument:xmlns:office:1.0","xmlns:table":"urn:oasis:names:tc:opendocument:xmlns:table:1.0","xmlns:style":"urn:oasis:names:tc:opendocument:xmlns:style:1.0","xmlns:text":"urn:oasis:names:tc:opendocument:xmlns:text:1.0","xmlns:draw":"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0","xmlns:fo":"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","xmlns:xlink":"http://www.w3.org/1999/xlink","xmlns:dc":"http://purl.org/dc/elements/1.1/","xmlns:meta":"urn:oasis:names:tc:opendocument:xmlns:meta:1.0","xmlns:number":"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0","xmlns:presentation":"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0","xmlns:svg":"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0","xmlns:chart":"urn:oasis:names:tc:opendocument:xmlns:chart:1.0","xmlns:dr3d":"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0","xmlns:math":"http://www.w3.org/1998/Math/MathML","xmlns:form":"urn:oasis:names:tc:opendocument:xmlns:form:1.0","xmlns:script":"urn:oasis:names:tc:opendocument:xmlns:script:1.0","xmlns:ooo":"http://openoffice.org/2004/office","xmlns:ooow":"http://openoffice.org/2004/writer","xmlns:oooc":"http://openoffice.org/2004/calc","xmlns:dom":"http://www.w3.org/2001/xml-events","xmlns:xforms":"http://www.w3.org/2002/xforms","xmlns:xsd":"http://www.w3.org/2001/XMLSchema","xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance","xmlns:sheet":"urn:oasis:names:tc:opendocument:sh33tjs:1.0","xmlns:rpt":"http://openoffice.org/2005/report","xmlns:of":"urn:oasis:names:tc:opendocument:xmlns:of:1.2","xmlns:xhtml":"http://www.w3.org/1999/xhtml","xmlns:grddl":"http://www.w3.org/2003/g/data-view#","xmlns:tableooo":"http://openoffice.org/2009/table","xmlns:drawooo":"http://openoffice.org/2010/draw","xmlns:calcext":"urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0","xmlns:loext":"urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0","xmlns:field":"urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0","xmlns:formx":"urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0","xmlns:css3t":"http://www.w3.org/TR/css3-text/","office:version":"1.2"}),s=Je({"xmlns:config":"urn:oasis:names:tc:opendocument:xmlns:config:1.0","office:mimetype":"application/vnd.oasis.opendocument.spreadsheet"});"fods"==t.bookType?(n.push("\n"),n.push(on().replace(/office:document-meta/g,"office:meta"))):n.push("\n"),function(e,t){e.push(" \n"),e.push(' \n'),e.push(' \n'),e.push(" /\n"),e.push(' \n'),e.push(" /\n"),e.push(" \n"),e.push(" \n");var r=0;t.SheetNames.map(function(e){return t.Sheets[e]}).forEach(function(t){if(t&&t["!cols"])for(var n=0;n\n'),e.push(' \n'),e.push(" \n"),++r}});var n=0;t.SheetNames.map(function(e){return t.Sheets[e]}).forEach(function(t){if(t&&t["!rows"])for(var r=0;r\n'),e.push(' \n'),e.push(" \n"),++n}}),e.push(' \n'),e.push(' \n'),e.push(" \n"),e.push(' \n'),e.push(" \n")}(n,e),n.push(" \n"),n.push(" \n");for(var i=0;i!=e.SheetNames.length;++i)n.push(r(e.Sheets[e.SheetNames[i]],e,i));return n.push(" \n"),n.push(" \n"),"fods"==t.bookType?n.push(""):n.push(""),n.join("")}}();function gc(e,t){if("fods"==t.bookType)return pc(e,t);var r=de(),n="",a=[],s=[];return ue(r,n="mimetype","application/vnd.oasis.opendocument.spreadsheet"),ue(r,n="content.xml",pc(e,t)),a.push([n,"text/xml"]),s.push([n,"ContentFile"]),ue(r,n="styles.xml",dc(e,t)),a.push([n,"text/xml"]),s.push([n,"StylesFile"]),ue(r,n="meta.xml",me+on()),a.push([n,"text/xml"]),s.push([n,"MetadataFile"]),ue(r,n="manifest.rdf",function(e){var t=[me];t.push('\n');for(var r=0;r!=e.length;++r)t.push(nn(e[r][0],e[r][1])),t.push(an("",e[r][0]));return t.push(nn("","Document","pkg")),t.push(""),t.join("")}(s)),a.push([n,"application/rdf+xml"]),ue(r,n="META-INF/manifest.xml",function(e){var t=[me];t.push('\n'),t.push(' \n');for(var r=0;r\n');return t.push(""),t.join("")}(a)),r}function mc(e){return function(t,r){var n=function(e,t){if(!t)return 0;var r=e.SheetNames.indexOf(t);if(-1==r)throw new Error("Sheet not found: "+t);return r}(t,r.sheet);return e.from_sheet(t.Sheets[t.SheetNames[n]],r,t)}}var vc=mc(ac),bc=mc({from_sheet:Zc}),wc=mc(void 0!==Pa?Pa:{}),Cc=mc(void 0!==La?La:{}),Ec=mc(void 0!==Ua?Ua:{}),Sc=mc(void 0!==ps?ps:{}),_c=mc({from_sheet:Qc}),Ac=mc(void 0!==Na?Na:{}),Bc=mc(void 0!==Ma?Ma:{}),Tc=mc(void 0!==za?{from_sheet:za.sheet_to_wk1}:{});function kc(e){return function(t){for(var r=0;r!=e.length;++r){var n=e[r];void 0===t[n[0]]&&(t[n[0]]=n[1]),"n"===n[2]&&(t[n[0]]=Number(t[n[0]]))}}}var yc=function(e){kc([["cellNF",!1],["cellHTML",!0],["cellFormula",!0],["cellStyles",!1],["cellText",!0],["cellDates",!1],["sheetStubs",!1],["sheetRows",0,"n"],["bookDeps",!1],["bookSheets",!1],["bookProps",!1],["bookFiles",!1],["bookVBA",!1],["password",""],["WTF",!1]])(e)},xc=kc([["cellDates",!1],["bookSST",!1],["bookType","xlsx"],["compression",!1],["WTF",!1]]);function Ic(e,t,r,n,a,s,i,o,l,c,f,h){try{s[n]=Jr(he(e,r,!0),t);var u,d=fe(e,t);switch(o){case"sheet":u=wl(d,t,a,l,s[n],c,f,h);break;case"chart":if(!(u=function(e,t,r,n,a,s){return".bin"===t.slice(-4)?function(e,t,r,n,a){if(!e)return e;n||(n={"!id":{}});var s={"!type":"chart","!drawel":null,"!rel":""},i=[],o=!1;return Ht(e,function(e,n,l){switch(l){case 550:s["!rel"]=e;break;case 651:a.Sheets[r]||(a.Sheets[r]={}),e.name&&(a.Sheets[r].CodeName=e.name);break;case 562:case 652:case 669:case 679:case 551:case 552:case 476:case 3072:break;case 35:o=!0;break;case 36:o=!1;break;case 37:i.push(n);break;case 38:i.pop();break;default:if((n||"").indexOf("Begin")>0)i.push(n);else if((n||"").indexOf("End")>0)i.pop();else if(!o||t.WTF)throw new Error("Unexpected record "+l+" "+n)}},t),n["!id"][s["!rel"]]&&(s["!drawel"]=n["!id"][s["!rel"]]),s}(e,n,r,a,s):function(e,t,r,n,a){if(!e)return e;n||(n={"!id":{}});var s,i={"!type":"chart","!drawel":null,"!rel":""},o=e.match(Ro);return o&&Do(o[0],0,a,r),(s=e.match(/drawing r:id="(.*?)"/))&&(i["!rel"]=s[1]),n["!id"][i["!rel"]]&&(i["!drawel"]=n["!id"][i["!rel"]]),i}(e,0,r,a,s)}(d,t,a,l,s[n],c))||!u["!drawel"])break;var p=ge(u["!drawel"].Target,t),g=Qr(p),m=function(e,t){if(!e)return"??";var r=(e.match(/]*r:id="([^"]*)"/)||["",""])[1];return t["!id"][r].Target}(he(e,p,!0),Jr(he(e,g,!0),p)),v=ge(m,p),b=Qr(v);u=function(e,t,r,n,a,s){var i=s||{"!type":"chart"};if(!e)return s;var o=0,l=0,c="A",f={s:{r:2e6,c:2e6},e:{r:0,c:0}};return(e.match(/[\s\S]*?<\/c:numCache>/gm)||[]).forEach(function(e){var t=function(e){var t,r=[],n=e.match(/^/);(e.match(/(.*?)<\/c:pt>/gm)||[]).forEach(function(e){var t=e.match(/(.*)<\/c:v><\/c:pt>/);t&&(r[+t[1]]=n?+t[2]:t[2])});var a=ke((e.match(/([\s\S]*?)<\/c:formatCode>/)||["","General"])[1]);return(e.match(/(.*?)<\/c:f>/gm)||[]).forEach(function(e){t=e.replace(/<.*?>/g,"")}),[r,a,t]}(e);f.s.r=f.s.c=0,f.e.c=o,c=Qt(o),t[0].forEach(function(e,r){i[c+Yt(r)]={t:"n",v:e,z:t[1]},l=r}),f.e.r0&&(i["!ref"]=tr(f)),i}(he(e,v,!0),0,0,Jr(he(e,b,!0),v),0,u);break;case"macro":C=t,s[n],C.slice(-4),u={"!type":"macro"};break;case"dialog":u=function(e,t){return t.slice(-4),{"!type":"dialog"}}(0,t,s[n]);break;default:throw new Error("Unrecognized sheet type "+o)}i[n]=u;var w=[];s&&s[n]&&U(s[n]).forEach(function(r){if(s[n][r].Type==Zr.CMNT){var a=ge(s[n][r].Target,t);if(!(w=function(e,t,r){return".bin"===t.slice(-4)?function(e,t){var r=[],n=[],a={},s=!1;return Ht(e,function(e,i,o){switch(o){case 632:n.push(e);break;case 635:a=e;break;case 637:a.t=e.t,a.h=e.h,a.r=e.r;break;case 636:if(a.author=n[a.iauthor],delete a.iauthor,t.sheetRows&&a.rfx&&t.sheetRows<=a.rfx.r)break;a.t||(a.t=""),delete a.rfx,r.push(a);break;case 3072:case 37:case 38:break;case 35:s=!0;break;case 36:s=!1;break;default:if((i||"").indexOf("Begin")>0);else if((i||"").indexOf("End")>0);else if(!s||t.WTF)throw new Error("Unexpected record "+o+" "+i)}}),r}(e,r):function(e,t){if(e.match(/<(?:\w+:)?comments *\/>/))return[];var r=[],n=[],a=e.match(/<(?:\w+:)?authors>([\s\S]*)<\/(?:\w+:)?authors>/);a&&a[1]&&a[1].split(/<\/\w*:?author>/).forEach(function(e){if(""!==e&&""!==e.trim()){var t=e.match(/<(?:\w+:)?author[^>]*>(.*)/);t&&r.push(t[1])}});var s=e.match(/<(?:\w+:)?commentList>([\s\S]*)<\/(?:\w+:)?commentList>/);return s&&s[1]&&s[1].split(/<\/\w*:?comment>/).forEach(function(e){if(""!==e&&""!==e.trim()){var a=e.match(/<(?:\w+:)?comment[^>]*>/);if(a){var s=Ee(a[0]),i={author:s.authorId&&r[s.authorId]||"sheetjsghost",ref:s.ref,guid:s.guid},o=Jt(s.ref);if(!(t.sheetRows&&t.sheetRows<=o.r)){var l=e.match(/<(?:\w+:)?text>([\s\S]*)<\/(?:\w+:)?text>/),c=!!l&&!!l[1]&&ja(l[1])||{r:"",t:"",h:""};i.r=c.r,""==c.r&&(c.t=c.h=""),i.t=(c.t||"").replace(/\r\n/g,"\n").replace(/\r/g,"\n"),t.cellHTML&&(i.h=c.h),n.push(i)}}}}),n}(e,r)}(fe(e,a,!0),a,l))||!w.length)return;!function(e,t){var r,n=Array.isArray(e);t.forEach(function(t){var a=Jt(t.ref);if(n?(e[a.r]||(e[a.r]=[]),r=e[a.r][a.c]):r=e[t.ref],!r){r={t:"z"},n?e[a.r][a.c]=r:e[t.ref]=r;var s=rr(e["!ref"]||"BDWGO1000001:A1");s.s.r>a.r&&(s.s.r=a.r),s.e.ra.c&&(s.s.c=a.c),s.e.c0?t.calcchains[0]:"",t.sst=t.strs.length>0?t.strs[0]:"",t.style=t.styles.length>0?t.styles[0]:"",t.defaults=r,delete t.calcchains,t}(he(e,"[Content_Types].xml")),i=!1;if(0===s.workbooks.length&&fe(e,n="xl/workbook.xml",!0)&&s.workbooks.push(n),0===s.workbooks.length){if(!fe(e,n="xl/workbook.bin",!0))throw new Error("Could not find workbook");s.workbooks.push(n),i=!0}"bin"==s.workbooks[0].slice(-3)&&(i=!0);var o={},l={};if(!t.bookSheets&&!t.bookProps){if(go=[],s.sst)try{go=function(e,t,r){return".bin"===t.slice(-4)?function(e,t){var r=[],n=!1;return Ht(e,function(e,a,s){switch(s){case 159:r.Count=e[0],r.Unique=e[1];break;case 19:r.push(e);break;case 160:return!0;case 35:n=!0;break;case 36:n=!1;break;default:if(a.indexOf("Begin")>0||a.indexOf("End"),!n||t.WTF)throw new Error("Unexpected record "+s+" "+a)}}),r}(e,r):function(e,t){var r=[],n="";if(!e)return r;var a=e.match(Ka);if(a){n=a[2].replace($a,"").split(Ya);for(var s=0;s!=n.length;++s){var i=ja(n[s].trim(),t);null!=i&&(r[r.length]=i)}a=Ee(a[1]),r.Count=a.count,r.Unique=a.uniqueCount}return r}(e,r)}(fe(e,Rc(s.sst)),s.sst,t)}catch(e){if(t.WTF)throw e}t.cellStyles&&s.themes.length&&(o=function(e,t,r){return ei(e,r)}(he(e,s.themes[0].replace(/^\//,""),!0)||"",s.themes[0],t)),s.style&&(l=function(e,t,r,n){return".bin"===t.slice(-4)?function(e,t,r){var n={NumberFmt:[]};for(var a in x._table)n.NumberFmt[a]=x._table[a];n.CellXf=[],n.Fonts=[];var s=[],i=!1;return Ht(e,function(e,a,o){switch(o){case 44:n.NumberFmt[e[0]]=e[1],x.load(e[1],e[0]);break;case 43:n.Fonts.push(e),null!=e.color.theme&&t&&t.themeElements&&t.themeElements.clrScheme&&(e.color.rgb=ms(t.themeElements.clrScheme[e.color.theme].rgb,e.color.tint||0));break;case 1025:case 45:case 46:case 48:case 507:case 572:case 475:case 1171:case 2102:case 1130:case 512:case 2095:case 3072:break;case 47:"BrtBeginCellXFs"==s[s.length-1]&&n.CellXf.push(e);break;case 35:i=!0;break;case 36:i=!1;break;case 37:s.push(a),i=!0;break;case 38:s.pop(),i=!1;break;default:if((a||"").indexOf("Begin")>0)s.push(a);else if((a||"").indexOf("End")>0)s.pop();else if(!i||r.WTF&&"BrtACBegin"!=s[s.length-1])throw new Error("Unexpected record "+o+" "+a)}}),n}(e,r,n):Ns(e,r,n)}(fe(e,Rc(s.style)),s.style,o,t))}s.links.map(function(r){try{return Jr(he(e,Qr(Rc(r))),r),function(e,t,r,n){if(".bin"===r.slice(-4))return function(e,t,r,n){if(!e)return e;var a=n||{},s=!1;Ht(e,function(e,t,r){switch(r){case 359:case 363:case 364:case 366:case 367:case 368:case 369:case 370:case 371:case 472:case 577:case 578:case 579:case 580:case 581:case 582:case 583:case 584:case 585:case 586:case 587:break;case 35:s=!0;break;case 36:s=!1;break;default:if((t||"").indexOf("Begin")>0);else if((t||"").indexOf("End")>0);else if(!s||a.WTF)throw new Error("Unexpected record "+r.toString(16)+" "+t)}},a)}(e,0,0,n)}(fe(e,Rc(r)),0,r,t)}catch(e){}});var c=function(e,t,r){return".bin"===t.slice(-4)?function(e,t){var r={AppVersion:{},WBProps:{},WBView:[],Sheets:[],CalcPr:{},xmlns:""},n=[],a=!1;t||(t={}),t.biff=12;var s=[],i=[[]];return i.SheetNames=[],i.XTI=[],Kl[16]={n:"BrtFRTArchID$",f:vl},Ht(e,function(e,o,l){switch(l){case 156:i.SheetNames.push(e.name),r.Sheets.push(e);break;case 153:r.WBProps=e;break;case 39:null!=e.Sheet&&(t.SID=e.Sheet),e.Ref=Qi(e.Ptg,0,null,i,t),delete t.SID,delete e.Ptg,s.push(e);break;case 1036:case 361:case 2071:case 158:case 143:case 664:case 353:case 3072:case 3073:case 534:case 677:case 157:case 610:case 2050:case 155:case 548:case 676:case 128:case 665:case 2128:case 2125:case 549:case 2053:case 596:case 2076:case 2075:case 2082:case 397:case 154:case 1117:case 553:case 2091:case 16:break;case 357:case 358:case 355:case 667:i[0].length?i.push([l,e]):i[0]=[l,e],i[i.length-1].XTI=[];break;case 362:0===i.length&&(i[0]=[],i[0].XTI=[]),i[i.length-1].XTI=i[i.length-1].XTI.concat(e),i.XTI=i.XTI.concat(e);break;case 35:case 37:n.push(o),a=!0;break;case 36:case 38:n.pop(),a=!1;break;default:if((o||"").indexOf("Begin")>0);else if((o||"").indexOf("End")>0);else if(!a||t.WTF&&"BrtACBegin"!=n[n.length-1]&&"BrtFRTBegin"!=n[n.length-1])throw new Error("Unexpected record "+l+" "+o)}},t),fl(r),r.Names=s,r.supbooks=i,r}(e,r):function(e,t){if(!e)throw new Error("Could not find file");var r={AppVersion:{},WBProps:{},WBView:[],Sheets:[],CalcPr:{},Names:[],xmlns:""},n=!1,a="xmlns",s={},i=0;if(e.replace(be,function(o,l){var c=Ee(o);switch(Se(c[0])){case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":case"":al.forEach(function(e){if(null!=c[e[0]])switch(e[2]){case"bool":r.WBProps[e[0]]=Ne(c[e[0]]);break;case"int":r.WBProps[e[0]]=parseInt(c[e[0]],10);break;default:r.WBProps[e[0]]=c[e[0]]}}),c.codeName&&(r.WBProps.CodeName=Pe(c.codeName));break;case"":delete c[0],r.WBView.push(c);break;case"":case"":n=!0;break;case"":case"":case"":n=!1;break;case"":s.Ref=ke(Pe(e.slice(i,l))),r.Names.push(s);break;case"":delete c[0],r.CalcPr=c;break;default:if(!n&&t.WTF)throw new Error("unrecognized "+c[0]+" in workbook")}return o}),-1===nt.main.indexOf(r.xmlns))throw new Error("Unknown Namespace: "+r.xmlns);return fl(r),r}(e,r)}(fe(e,Rc(s.workbooks[0])),s.workbooks[0],t),f={},h="";s.coreprops.length&&((h=fe(e,Rc(s.coreprops[0]),!0))&&(f=fn(h)),0!==s.extprops.length&&(h=fe(e,Rc(s.extprops[0]),!0))&&function(e,t,r){var n={};t||(t={}),e=Pe(e),dn.forEach(function(r){var a=(e.match(Xe(r[0]))||[])[1];switch(r[2]){case"string":a&&(t[r[1]]=ke(a));break;case"bool":t[r[1]]="true"===a;break;case"raw":var s=e.match(new RegExp("<"+r[0]+"[^>]*>([\\s\\S]*?)"));s&&s.length>0&&(n[r[1]]=s[1])}}),n.HeadingPairs&&n.TitlesOfParts&&pn(n.HeadingPairs,n.TitlesOfParts,t,r)}(h,f,t));var u={};t.bookSheets&&!t.bookProps||0!==s.custprops.length&&(h=he(e,Rc(s.custprops[0]),!0))&&(u=function(e,t){var r={},n="",a=e.match(mn);if(a)for(var s=0;s!=a.length;++s){var i=a[s],o=Ee(i);switch(o[0]){case"":n=null;break;default:if(0===i.indexOf(""),c=l[0].slice(4),f=l[1];switch(c){case"lpstr":case"bstr":case"lpwstr":case"cy":case"error":r[n]=ke(f);break;case"bool":r[n]=Ne(f);break;case"i1":case"i2":case"i4":case"i8":case"int":case"uint":r[n]=parseInt(f,10);break;case"r4":case"r8":case"decimal":r[n]=parseFloat(f);break;case"filetime":case"date":r[n]=q(f);break;default:if("/"==c.slice(-1))break;t.WTF&&"undefined"!=typeof console&&console.warn("Unexpected",i,c,l)}}else if("0&&(r=f.SheetNames),t.bookProps&&(d.Props=f,d.Custprops=u),t.bookSheets&&void 0!==r&&(d.SheetNames=r),t.bookSheets?d.SheetNames:t.bookProps))return d;r={};var p,g={};t.bookDeps&&s.calcchain&&(p=fe(e,Rc(s.calcchain)),g=".bin"===s.calcchain.slice(-4)?function(e){var t=[];return Ht(e,function(e,r,n){if(63===n)t.push(e);else if((r||"").indexOf("Begin")>0);else if(!((r||"").indexOf("End")>0))throw new Error("Unexpected record "+n+" "+r)}),t}(p):function(e){var t=[];if(!e)return t;var r=1;return(e.match(be)||[]).forEach(function(e){var n=Ee(e);switch(n[0]){case"":case"":break;case"-1?"sheet":Zr.CS&&r==Zr.CS?"chart":Zr.DS&&r==Zr.DS?"dialog":Zr.MS&&r==Zr.MS?"macro":r&&r.length?r:"sheet")];var r})}catch(e){return null}return e&&0!==e.length?e:null}(B,c.Sheets));var T=fe(e,"xl/worksheets/sheet.xml",!0)?1:0;e:for(b=0;b!=f.Worksheets;++b){var k="sheet";if(B&&B[b]?(m="xl/"+B[b][1].replace(/[\/]?xl\//,""),le(e,m)||(m=B[b][1]),le(e,m)||(m=A.replace(/_rels\/.*$/,"")+B[b][1]),k=B[b][2]):m=(m="xl/worksheets/sheet"+(b+1-T)+"."+S).replace(/sheet0\./,"sheet."),v=m.replace(/^(.*)(\/)([^\/]*)$/,"$1/_rels/$3.rels"),t&&null!=t.sheets)switch(typeof t.sheets){case"number":if(b!=t.sheets)continue e;break;case"string":if(f.SheetNames[b].toLowerCase()!=t.sheets.toLowerCase())continue e;break;default:if(Array.isArray&&Array.isArray(t.sheets)){for(var y=!1,R=0;R!=t.sheets.length;++R)"number"==typeof t.sheets[R]&&t.sheets[R]==b&&(y=1),"string"==typeof t.sheets[R]&&t.sheets[R].toLowerCase()==f.SheetNames[b].toLowerCase()&&(y=1);if(!y)continue e}}Ic(e,m,v,f.SheetNames[b],b,w,r,k,t,c,o,l)}return d={Directory:s,Workbook:c,Props:f,Custprops:u,Deps:g,Sheets:r,SheetNames:f.SheetNames,Strings:go,Styles:l,Themes:o,SSF:x.get_table()},t&&t.bookFiles&&(e.files?(d.keys=a,d.files=e.files):(d.keys=[],d.files={},e.FullPaths.forEach(function(t,r){t=t.replace(/^Root Entry[\/]/,""),d.keys.push(t),d.files[t]=e.FileIndex[r]}))),t&&t.bookVBA&&(s.vba.length>0?d.vbaraw=fe(e,Rc(s.vba[0]),!0):s.defaults&&"application/vnd.ms-office.vbaProject"===s.defaults.bin&&(d.vbaraw=fe(e,"xl/vbaProject.bin",!0))),d}function Fc(e,t){var r=t||{},n="Workbook",a=P.find(e,n);try{if(n="/!DataSpaces/Version",!(a=P.find(e,n))||!a.content)throw new Error("ECMA-376 Encrypted file missing "+n);if(function(e){var t={};t.id=e.read_shift(0,"lpp4"),t.R=ts(e,4),t.U=ts(e,4),t.W=ts(e,4)}(a.content),n="/!DataSpaces/DataSpaceMap",!(a=P.find(e,n))||!a.content)throw new Error("ECMA-376 Encrypted file missing "+n);var s=function(e){var t=[];e.l+=4;for(var r=e.read_shift(4);r-- >0;)t.push(rs(e));return t}(a.content);if(1!==s.length||1!==s[0].comps.length||0!==s[0].comps[0].t||"StrongEncryptionDataSpace"!==s[0].name||"EncryptedPackage"!==s[0].comps[0].v)throw new Error("ECMA-376 Encrypted file bad "+n);if(n="/!DataSpaces/DataSpaceInfo/StrongEncryptionDataSpace",!(a=P.find(e,n))||!a.content)throw new Error("ECMA-376 Encrypted file missing "+n);var i=function(e){var t=[];e.l+=4;for(var r=e.read_shift(4);r-- >0;)t.push(e.read_shift(0,"lpp4"));return t}(a.content);if(1!=i.length||"StrongEncryptionTransform"!=i[0])throw new Error("ECMA-376 Encrypted file bad "+n);if(n="/!DataSpaces/TransformInfo/StrongEncryptionTransform/!Primary",!(a=P.find(e,n))||!a.content)throw new Error("ECMA-376 Encrypted file missing "+n);!function(e){var t=function(e){var t={};return e.read_shift(4),e.l+=4,t.id=e.read_shift(0,"lpp4"),t.name=e.read_shift(0,"lpp4"),t.R=ts(e,4),t.U=ts(e,4),t.W=ts(e,4),t}(e);if(t.ename=e.read_shift(0,"8lpp4"),t.blksz=e.read_shift(4),t.cmode=e.read_shift(4),4!=e.read_shift(4))throw new Error("Bad !Primary record")}(a.content)}catch(e){}if(n="/EncryptionInfo",!(a=P.find(e,n))||!a.content)throw new Error("ECMA-376 Encrypted file missing "+n);var o=function(e){var t=ts(e);switch(t.Minor){case 2:return[t.Minor,ss(e)];case 3:return[t.Minor,is()];case 4:return[t.Minor,os(e)]}throw new Error("ECMA-376 Encrypted file unrecognized Version: "+t.Minor)}(a.content);if(n="/EncryptedPackage",!(a=P.find(e,n))||!a.content)throw new Error("ECMA-376 Encrypted file missing "+n);if(4==o[0]&&"undefined"!=typeof decrypt_agile)return decrypt_agile(o[1],a.content,r.password||"",r);if(2==o[0]&&"undefined"!=typeof decrypt_std76)return decrypt_std76(o[1],a.content,r.password||"",r);throw new Error("File is password-protected")}function Dc(e,t){if(ai=1024,"ods"==t.bookType)return gc(e,t);e&&!e.SSF&&(e.SSF=x.get_table()),e&&e.SSF&&(I(x),x.load_table(e.SSF),t.revssf=W(e.SSF),t.revssf[e.SSF[65535]]=0,t.ssf=e.SSF),t.rels={},t.wbrels={},t.Strings=[],t.Strings.Count=0,t.Strings.Unique=0,vo?t.revStrings=new Map:(t.revStrings={},t.revStrings.foo=[],delete t.revStrings.foo);var r="xlsb"==t.bookType?"bin":"xml",n=fi.indexOf(t.bookType)>-1,a={workbooks:[],sheets:[],charts:[],dialogs:[],macros:[],rels:[],strs:[],comments:[],links:[],coreprops:[],extprops:[],custprops:[],themes:[],styles:[],calcchains:[],vba:[],drawings:[],TODO:[],xmlns:""};xc(t=t||{});var s=de(),i="",o=0;if(t.cellXfs=[],Eo(t.cellXfs,{},{revssf:{General:0}}),e.Props||(e.Props={}),ue(s,i="docProps/core.xml",function(e,t){var r=t||{},n=[me,hn],a={};if(!e&&!r.Props)return n.join("");e&&(null!=e.CreatedDate&&un("dcterms:created","string"==typeof e.CreatedDate?e.CreatedDate:et(e.CreatedDate,r.WTF),{"xsi:type":"dcterms:W3CDTF"},n,a),null!=e.ModifiedDate&&un("dcterms:modified","string"==typeof e.ModifiedDate?e.ModifiedDate:et(e.ModifiedDate,r.WTF),{"xsi:type":"dcterms:W3CDTF"},n,a));for(var s=0;s!=ln.length;++s){var i=ln[s],o=r.Props&&null!=r.Props[i[1]]?r.Props[i[1]]:e?e[i[1]]:null;!0===o?o="1":!1===o?o="0":"number"==typeof o&&(o=String(o)),null!=o&&un(i[0],o,null,n,a)}return n.length>2&&(n[n.length]="",n[1]=n[1].replace("/>",">")),n.join("")}(e.Props,t)),a.coreprops.push(i),rn(t.rels,2,i,Zr.CORE_PROPS),i="docProps/app.xml",e.Props&&e.Props.SheetNames);else if(e.Workbook&&e.Workbook.Sheets){for(var l=[],c=0;cWorksheets")+r("vt:variant",r("vt:i4",String(e.Worksheets))),{size:2,baseType:"variant"})),t[t.length]=r("TitlesOfParts",r("vt:vector",e.SheetNames.map(function(e){return""+Ie(e)+""}).join(""),{size:e.Worksheets,baseType:"lpstr"})),t.length>2&&(t[t.length]="",t[1]=t[1].replace("/>",">")),t.join("")}(e.Props)),a.extprops.push(i),rn(t.rels,3,i,Zr.EXT_PROPS),e.Custprops!==e.Props&&U(e.Custprops||{}).length>0&&(ue(s,i="docProps/custom.xml",function(e){var t=[me,vn];if(!e)return t.join("");var r=1;return U(e).forEach(function(n){++r,t[t.length]=qe("property",function(e){switch(typeof e){case"string":var t=qe("vt:lpwstr",Ie(e));return t.replace(/"/g,"_x0022_");case"number":return qe((0|e)==e?"vt:i4":"vt:r8",Ie(String(e)));case"boolean":return qe("vt:bool",e?"true":"false")}if(e instanceof Date)return qe("vt:filetime",et(e));throw new Error("Unable to serialize "+e)}(e[n]),{fmtid:"{D5CDD505-2E9C-101B-9397-08002B2CF9AE}",pid:r,name:Ie(n)})}),t.length>2&&(t[t.length]="",t[1]=t[1].replace("/>",">")),t.join("")}(e.Custprops)),a.custprops.push(i),rn(t.rels,4,i,Zr.CUST_PROPS)),o=1;o<=e.SheetNames.length;++o){var f={"!id":{}},h=e.Sheets[e.SheetNames[o-1]];if((h||{})["!type"],ue(s,i="xl/worksheets/sheet"+o+"."+r,El(o-1,i,t,e,f)),a.sheets.push(i),rn(t.wbrels,-1,"worksheets/sheet"+o+"."+r,Zr.WS[0]),h){var u=h["!comments"],d=!1;if(u&&u.length>0){var p="xl/comments"+o+"."+r;ue(s,p,_l(u,p,t)),a.comments.push(p),rn(f,-1,"../comments"+o+"."+r,Zr.CMNT),d=!0}h["!legacy"]&&d&&ue(s,"xl/drawings/vmlDrawing"+o+".vml",si(o,h["!comments"])),delete h["!comments"],delete h["!legacy"]}f["!id"].rId1&&ue(s,Qr(i),en(f))}return null!=t.Strings&&t.Strings.length>0&&(ue(s,i="xl/sharedStrings."+r,Sl(t.Strings,i,t)),a.strs.push(i),rn(t.wbrels,-1,"sharedStrings."+r,Zr.SST)),ue(s,i="xl/workbook."+r,Cl(e,i,t)),a.workbooks.push(i),rn(t.rels,1,i,Zr.WB),ue(s,i="xl/theme/theme1.xml",ti(e.Themes,t)),a.themes.push(i),rn(t.wbrels,-1,"theme/theme1.xml",Zr.THEME),ue(s,i="xl/styles."+r,function(e,t,r){return(".bin"===t.slice(-4)?Gs:Ls)(e,r)}(e,i,t)),a.styles.push(i),rn(t.wbrels,-1,"styles."+r,Zr.STY),e.vbaraw&&n&&(ue(s,i="xl/vbaProject.bin",e.vbaraw),a.vba.push(i),rn(t.wbrels,-1,"vbaProject.bin",Zr.VBA)),ue(s,"[Content_Types].xml",function(e,t){var r,n=[];n[n.length]=me,n[n.length]=$r,n=n.concat(Yr);var a=function(a){e[a]&&e[a].length>0&&(r=e[a][0],n[n.length]=qe("Override",null,{PartName:("/"==r[0]?"":"/")+r,ContentType:jr[a][t.bookType||"xlsx"]}))},s=function(r){(e[r]||[]).forEach(function(e){n[n.length]=qe("Override",null,{PartName:("/"==e[0]?"":"/")+e,ContentType:jr[r][t.bookType||"xlsx"]})})},i=function(t){(e[t]||[]).forEach(function(e){n[n.length]=qe("Override",null,{PartName:("/"==e[0]?"":"/")+e,ContentType:Kr[t][0]})})};return a("workbooks"),s("sheets"),s("charts"),i("themes"),["strs","styles"].forEach(a),["coreprops","extprops","custprops"].forEach(i),i("vba"),i("comments"),i("drawings"),n.length>2&&(n[n.length]="",n[1]=n[1].replace("/>",">")),n.join("")}(a,t)),ue(s,"_rels/.rels",en(t.rels)),ue(s,"xl/_rels/workbook."+r+".rels",en(t.wbrels)),delete t.revssf,delete t.ssf,s}function Nc(e,t){var r="";switch((t||{}).type||"base64"){case"buffer":case"array":return[e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7]];case"base64":r=m.decode(e.slice(0,12));break;case"binary":r=e;break;default:throw new Error("Unrecognized type "+(t&&t.type||"undefined"))}return[r.charCodeAt(0),r.charCodeAt(1),r.charCodeAt(2),r.charCodeAt(3),r.charCodeAt(4),r.charCodeAt(5),r.charCodeAt(6),r.charCodeAt(7)]}function Pc(e,t){var r=0;e:for(;r=2&&0===n[3])return za.to_workbook(a,r);if(0===n[2]&&(8===n[3]||9===n[3]))return za.to_workbook(a,r)}break;case 3:case 131:case 139:case 140:return Na.to_workbook(a,r);case 123:if(92===n[1]&&114===n[2]&&116===n[3])return ps.to_workbook(a,r);break;case 10:case 13:case 32:return function(e,t){var r="",n=Nc(e,t);switch(t.type){case"base64":r=m.decode(e);break;case"binary":r=e;break;case"buffer":r=e.toString("binary");break;case"array":r=ee(e);break;default:throw new Error("Unrecognized type "+t.type)}return 239==n[0]&&187==n[1]&&191==n[2]&&(r=Pe(r)),Pc(r,t)}(a,r);case 137:if(80===n[1]&&78===n[2]&&71===n[3])throw new Error("PNG Image File is not a spreadsheet")}return Na.versions.indexOf(n[0])>-1&&n[2]<=12&&n[3]<=31?Na.to_workbook(a,r):Lc(e,a,r,s)}function Uc(e,t){var r=t||{};return r.type="file",Mc(e,r)}function zc(e,t){switch(t.type){case"base64":case"binary":break;case"buffer":case"array":t.type="";break;case"file":return M(t.file,P.write(e,{type:v?"buffer":""}));case"string":throw new Error("'string' output type invalid for '"+t.bookType+"' files");default:throw new Error("Unrecognized type "+t.type)}return P.write(e,t)}function Hc(e,t,r){r||(r="");var n=r+e;switch(t.type){case"base64":return m.encode(Le(n));case"binary":return Le(n);case"string":return e;case"file":return M(t.file,n,"utf8");case"buffer":return v?b(n,"utf8"):Hc(n,{type:"binary"}).split("").map(function(e){return e.charCodeAt(0)})}throw new Error("Unrecognized type "+t.type)}function Wc(e,t){switch(t.type){case"string":case"base64":case"binary":for(var r="",n=0;n22)throw new Error("Bad Code Name: Worksheet"+i)}});for(var s=0;s-1||null!=s[i][1]&&o.push(s[i]);a.length&&P.utils.cfb_add(t,"/SummaryInformation",Pn(a,Xl,Ur,Lr)),(n.length||o.length)&&P.utils.cfb_add(t,"/DocumentSummaryInformation",Pn(n,Gl,Mr,Pr,o.length?o:null,"05d5cdd59c2e1b10939708002b2cf9ae"))}(e,n),8==r.biff&&e.vbaraw&&function(e,t){t.FullPaths.forEach(function(r,n){if(0!=n){var a=r.replace(/[^\/]*[\/]/,"/_VBA_PROJECT_CUR/");"/"!==a.slice(-1)&&P.utils.cfb_add(e,a,t.FileIndex[n].content)}})}(n,P.read(e.vbaraw,{type:"string"==typeof e.vbaraw?"binary":"buffer"})),n}(e,r),r)}(e,r);case"xlsx":case"xlsm":case"xlam":case"xlsb":case"ods":return function(e,t){var r=te(t||{}),n=Dc(e,r),a={};if(r.compression&&(a.compression="DEFLATE"),r.password)a.type=v?"nodebuffer":"string";else switch(r.type){case"base64":a.type="base64";break;case"binary":a.type="string";break;case"string":throw new Error("'string' output type invalid for '"+r.bookType+"' files");case"buffer":case"file":a.type=v?"nodebuffer":"string";break;default:throw new Error("Unrecognized type "+r.type)}var s=n.FullPaths?P.write(n,{fileType:"zip",type:{nodebuffer:"buffer",string:"binary"}[a.type]||a.type}):n.generate(a);return r.password&&"undefined"!=typeof encrypt_agile?zc(encrypt_agile(s,r.password),r):"file"===r.type?M(r.file,s):"string"==r.type?Pe(s):s}(e,r);default:throw new Error("Unrecognized bookType |"+r.bookType+"|")}}function Xc(e){if(!e.bookType){var t=e.file.slice(e.file.lastIndexOf(".")).toLowerCase();t.match(/^\.[a-z]+$/)&&(e.bookType=t.slice(1)),e.bookType={xls:"biff8",htm:"html",slk:"sylk",socialcalc:"eth",Sh33tJS:"WTF"}[e.bookType]||e.bookType}}function Gc(e,t,r){var n=r||{};return n.type="file",n.file=t,Xc(n),Vc(e,n)}function jc(e,t,r,n,a,s,i,o){var l=Yt(r),c=o.defval,f=o.raw||!Object.prototype.hasOwnProperty.call(o,"raw"),h=!0,u=1===a?[]:{};if(1!==a)if(Object.defineProperty)try{Object.defineProperty(u,"__rowNum__",{value:r,enumerable:!1})}catch(e){u.__rowNum__=r}else u.__rowNum__=r;if(!i||e[r])for(var d=t.s.c;d<=t.e.c;++d){var p=i?e[r][d]:e[n[d]+l];if(void 0!==p&&void 0!==p.t){var g=p.v;switch(p.t){case"z":if(null==g)break;continue;case"e":g=0==g?null:void 0;break;case"s":case"d":case"b":case"n":break;default:throw new Error("unrecognized type "+p.t)}if(null!=s[d]){if(null==g)if("e"==p.t&&null===g)u[s[d]]=null;else if(void 0!==c)u[s[d]]=c;else{if(!f||null!==g)continue;u[s[d]]=null}else u[s[d]]=f||o.rawNumbers&&"n"==p.t?g:nr(p,g,o);null!=g&&(h=!1)}}else{if(void 0===c)continue;null!=s[d]&&(u[s[d]]=c)}}return{row:u,isempty:h}}function Kc(e,t){if(null==e||null==e["!ref"])return[];var r={t:"n",v:0},n=0,a=1,s=[],i=0,o="",l={s:{r:0,c:0},e:{r:0,c:0}},c=t||{},f=null!=c.range?c.range:e["!ref"];switch(1===c.header?n=1:"A"===c.header?n=2:Array.isArray(c.header)?n=3:null==c.header&&(n=0),typeof f){case"string":l=rr(f);break;case"number":(l=rr(e["!ref"])).s.r=f;break;default:l=f}n>0&&(a=0);var h=Yt(l.s.r),u=[],d=[],p=0,g=0,m=Array.isArray(e),v=l.s.r,b=0,w=0;for(m&&!e[v]&&(e[v]=[]),b=l.s.c;b<=l.e.c;++b)switch(u[b]=Qt(b),r=m?e[v][b]:e[u[b]+h],n){case 1:s[b]=b-l.s.c;break;case 2:s[b]=u[b];break;case 3:s[b]=c.header[b-l.s.c];break;default:for(null==r&&(r={w:"__EMPTY",t:"s"}),o=i=nr(r,null,c),g=0,w=0;w=0&&(f='"'+f.replace($c,'""')+'"'));c.push(f)}return!1===o.blankrows&&l?null:c.join(i)}function Zc(e,t){var r=[],n=null==t?{}:t;if(null==e||null==e["!ref"])return"";var a=rr(e["!ref"]),s=void 0!==n.FS?n.FS:",",i=s.charCodeAt(0),o=void 0!==n.RS?n.RS:"\n",l=o.charCodeAt(0),c=new RegExp(("|"==s?"\\|":s)+"+$"),f="",h=[];n.dense=Array.isArray(e);for(var u=n.skipHidden&&e["!cols"]||[],d=n.skipHidden&&e["!rows"]||[],p=a.s.c;p<=a.e.c;++p)(u[p]||{}).hidden||(h[p]=Qt(p));for(var g=a.s.r;g<=a.e.r;++g)(d[g]||{}).hidden||null!=(f=Yc(e,a,g,h,i,l,s,n))&&(n.strip&&(f=f.replace(c,"")),r.push(f+o));return delete n.dense,r.join("")}function Qc(e,t){t||(t={}),t.FS="\t",t.RS="\n";var r=Zc(e,t);if("undefined"==typeof cptable||"string"==t.type)return r;var n=cptable.utils.encode(1200,r,"str");return String.fromCharCode(255)+String.fromCharCode(254)+n}function Jc(e){var t,r="",n="";if(null==e||null==e["!ref"])return[];var a,s=rr(e["!ref"]),i="",o=[],l=[],c=Array.isArray(e);for(a=s.s.c;a<=s.e.c;++a)o[a]=Qt(a);for(var f=s.s.r;f<=s.e.r;++f)for(i=Yt(f),a=s.s.c;a<=s.e.c;++a)if(r=o[a]+i,n="",void 0!==(t=c?(e[f]||[])[a]:e[r])){if(null!=t.F){if(r=t.F,!t.f)continue;n=t.f,-1==r.indexOf(":")&&(r=r+":"+r)}if(null!=t.f)n=t.f;else{if("z"==t.t)continue;if("n"==t.t&&null!=t.v)n=""+t.v;else if("b"==t.t)n=t.v?"TRUE":"FALSE";else if(void 0!==t.w)n="'"+t.w;else{if(void 0===t.v)continue;n="s"==t.t?"'"+t.v:""+t.v}}l[l.length]=r+"="+n}return l}function qc(e,t,r){var n,a=r||{},s=+!a.skipHeader,i=e||{},o=0,l=0;if(i&&null!=a.origin)if("number"==typeof a.origin)o=a.origin;else{var c="string"==typeof a.origin?Jt(a.origin):a.origin;o=c.r,l=c.c}var f={s:{c:0,r:0},e:{c:l,r:o+t.length-1+s}};if(i["!ref"]){var h=rr(i["!ref"]);f.e.c=Math.max(f.e.c,h.e.c),f.e.r=Math.max(f.e.r,h.e.r),-1==o&&(o=h.e.r+1,f.e.r=o+t.length-1+s)}else-1==o&&(o=0,f.e.r=t.length-1+s);var u=a.header||[],d=0;t.forEach(function(e,t){U(e).forEach(function(r){-1==(d=u.indexOf(r))&&(u[d=u.length]=r);var c=e[r],f="z",h="",p=qt({c:l+d,r:o+t+s});n=ef.sheet_get_cell(i,p),!c||"object"!=typeof c||c instanceof Date?("number"==typeof c?f="n":"boolean"==typeof c?f="b":"string"==typeof c?f="s":c instanceof Date?(f="d",a.cellDates||(f="n",c=X(c)),h=a.dateNF||x._table[14]):null===c&&a.nullError&&(f="e",c=0),n?(n.t=f,n.v=c,delete n.w,delete n.R,h&&(n.z=h)):i[p]=n={t:f,v:c},h&&(n.z=h)):i[p]=c})}),f.e.c=Math.max(f.e.c,l+u.length-1);var p=Yt(o);if(s)for(d=0;d=65535)throw new Error("Too many worksheets");if(ul(r),e.SheetNames.indexOf(r)>=0)throw new Error("Worksheet with name |"+r+"| already exists!");e.SheetNames.push(r),e.Sheets[r]=t},e.book_set_sheet_visibility=function(e,r,n){t(e,"Workbook",{}),t(e.Workbook,"Sheets",[]);var a=function(e,t){if("number"==typeof t){if(t>=0&&e.SheetNames.length>t)return t;throw new Error("Cannot find sheet # "+t)}if("string"==typeof t){var r=e.SheetNames.indexOf(t);if(r>-1)return r;throw new Error("Cannot find sheet name |"+t+"|")}throw new Error("Cannot find sheet |"+t+"|")}(e,r);switch(t(e.Workbook.Sheets,a,{}),n){case 0:case 1:case 2:break;default:throw new Error("Bad sheet visibility setting "+n)}e.Workbook.Sheets[a].Hidden=n},[["SHEET_VISIBLE",0],["SHEET_HIDDEN",1],["SHEET_VERY_HIDDEN",2]].forEach(function(t){e.consts[t[0]]=t[1]}),e.cell_set_number_format=function(e,t){return e.z=t,e},e.cell_set_hyperlink=function(e,t,r){return t?(e.l={Target:t},r&&(e.l.Tooltip=r)):delete e.l,e},e.cell_set_internal_link=function(t,r,n){return e.cell_set_hyperlink(t,"#"+r,n)},e.cell_add_comment=function(e,t,r){e.c||(e.c=[]),e.c.push({t:t,a:r||"SheetJS"})},e.sheet_set_array_formula=function(e,t,n){for(var a="string"!=typeof t?t:rr(t),s="string"==typeof t?t:tr(t),i=a.s.r;i<=a.e.r;++i)for(var o=a.s.c;o<=a.e.c;++o){var l=r(e,i,o);l.t="n",l.F=s,delete l.v,i==a.s.r&&o==a.s.c&&(l.f=n)}return e}}(ef),v&&function(){var e=r(9800);if(e){var n=e.Readable;n&&(t.stream={to_json:function(e,t){var r=n({objectMode:!0});if(null==e||null==e["!ref"])return r.push(null),r;var a={t:"n",v:0},s=0,i=1,o=[],l=0,c="",f={s:{r:0,c:0},e:{r:0,c:0}},h=t||{},u=null!=h.range?h.range:e["!ref"];switch(1===h.header?s=1:"A"===h.header?s=2:Array.isArray(h.header)&&(s=3),typeof u){case"string":f=rr(u);break;case"number":(f=rr(e["!ref"])).s.r=u;break;default:f=u}s>0&&(i=0);var d=Yt(f.s.r),p=[],g=0,m=Array.isArray(e),v=f.s.r,b=0,w=0;for(m&&!e[v]&&(e[v]=[]),b=f.s.c;b<=f.e.c;++b)switch(p[b]=Qt(b),a=m?e[v][b]:e[p[b]+d],s){case 1:o[b]=b-f.s.c;break;case 2:o[b]=p[b];break;case 3:o[b]=h.header[b-f.s.c];break;default:for(null==a&&(a={w:"__EMPTY",t:"s"}),c=l=nr(a,null,h),g=0,w=0;wf.e.r)return r.push(null);for(;v<=f.e.r;){var t=jc(e,f,v,p,s,o,m,h);if(++v,!1===t.isempty||(1===s?!1!==h.blankrows:h.blankrows)){r.push(t.row);break}}},r},to_html:function(e,t){var r=n(),a=t||{},s=null!=a.header?a.header:ac.BEGIN,i=null!=a.footer?a.footer:ac.END;r.push(s);var o=er(e["!ref"]);a.dense=Array.isArray(e),r.push(ac._preamble(e,o,a));var l=o.s.r,c=!1;return r._read=function(){if(l>o.e.r)return c||(c=!0,r.push(""+i)),r.push(null);for(;l<=o.e.r;){r.push(ac._row(e,o,l,a)),++l;break}},r},to_csv:function(e,t){var r=n(),a=null==t?{}:t;if(null==e||null==e["!ref"])return r.push(null),r;var s=rr(e["!ref"]),i=void 0!==a.FS?a.FS:",",o=i.charCodeAt(0),l=void 0!==a.RS?a.RS:"\n",c=l.charCodeAt(0),f=new RegExp(("|"==i?"\\|":i)+"+$"),h="",u=[];a.dense=Array.isArray(e);for(var d=a.skipHidden&&e["!cols"]||[],p=a.skipHidden&&e["!rows"]||[],g=s.s.c;g<=s.e.c;++g)(d[g]||{}).hidden||(u[g]=Qt(g));var m=s.s.r,v=!1;return r._read=function(){if(!v)return v=!0,r.push("\ufeff");for(;m<=s.e.r;)if(++m,!(p[m-1]||{}).hidden&&null!=(h=Yc(e,s,m-1,u,o,c,i,a))){a.strip&&(h=h.replace(f,"")),r.push(h+l);break}return m>s.e.r?r.push(null):void 0},r}})}}(),void 0!==jl&&(t.parse_xlscfb=jl),t.parse_zip=Oc,t.read=Mc,t.readFile=Uc,t.readFileSync=Uc,t.write=Vc,t.writeFile=Gc,t.writeFileSync=Gc,t.writeFileAsync=function(e,t,r,n){var a=r||{};a.type="file",a.file=e,Xc(a),a.type="buffer";var s=n;return s instanceof Function||(s=r),N.writeFile(e,Vc(t,a),s)},t.utils=ef,t.SSF=x,void 0!==P&&(t.CFB=P)}(t),"undefined"!=typeof window&&!window.XLSX)try{window.XLSX={}}catch(e){}},6251:function(){},7233:function(){},9800:function(){}}]); //# sourceMappingURL=async-export.js.map \ No newline at end of file diff --git a/dash/dash_table/async-export.js.map b/dash/dash_table/async-export.js.map index 6ce568dcca..6224fbd1eb 100644 --- a/dash/dash_table/async-export.js.map +++ b/dash/dash_table/async-export.js.map @@ -1 +1 @@ -{"version":3,"file":"async-export.js","mappings":"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C,GAAAhQ,GA5FA,CAEA,EACA,SACA,SACA,MACA,IACA,SACA,SACA,MAGA,EACA,SACA,SACA,MACA,IACA,SACA,SACA,MAEA,QACA,MACA,IACA,QACA,QACA,MACA,SACA,QACA,SACA,SACA,SACA,SACA,QACA,SACA,MACA,SAEA,IACA,SACA,SACA,MACA,QACA,QACA,MACA,IACA,MACA,SACA,SACA,SACA,SACA,SACA,SACA,SAEA,QACA,QACA,SACA,SACA,SACA,SACA,QACA,QACA,MACA,QACA,MACA,QACA,SACA,SACA,QACA,QAGA,SACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GA9FuB9uC,IAAA,SAAAzC,GAA6B,OAAAA,GAAA,OAAAA,GAAA,UAAAA,EAAA,IAmGpDk8C,GAAA,CACA,WACA,YACA,aACA,WACA,YACA,WACA,UACA,mBACA,aAEAsF,GAAA/Q,EAAAyL,IAKAuF,GAA8B,CAE9B,yFAGA,6CAGA,iDACA,6CAGA,yEACA,kFACA,mFAGA,+EACA,oFAGA,6CACA,oFAGA,2EAGA,uDAGA,kDAGA,+CAGA,kDACA,yFAGA,qFAGA,2CACA,+CAGA,mDAGA,8CACA,qFAGA,gDACA,uFAGA,gDACA,uFAGA,uDACA,oDACA,8FACA,2FAGA,6CACA,oFAGA,4CACA,kDACA,8CACA,yFACA,qFACA,mFAGA,mDACA,0FAGA,yCACA,8CACA,6CACA,kDAGA,4CAGA,wCACA,+EAGA,mEAGA,yEAGA,+CACA,oDAGA,6CACA,sDAGA,wDACA,8FAGA,wDAGA,kEAGA,6CAGA,uEACA,iFACA,mFACA,iFACA,mFACA,kFAGA,kEAEA,kEACA,iEAGA,mBAEAlF,MAAA,MAGAmF,IAsCAvgD,EArCA6E,GAAA,CACA27C,UAAA,CACAC,KAAA,6EACAC,KAAA,uDACAC,KAAA,0DACAC,KAAA,uDACAC,KAAA,iFAEAC,KAAA,CACAL,KAAA,gFACAE,KAAA,0CAEAI,SAAA,CACAN,KAAA,2EACAE,KAAA,qCAEAtF,OAAA,CACAoF,K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aACA,iBACA,kBACA,kBACA,UACA,iBACA,WACA,mBACA,eACA,WACA,YACA,qBACA,kBACA,UACA,SACA,UACA,WACA,WACA,mBACA,iBACA,YACA,gBACA,eACA,iBACA,kBACA,kBACA,kBACA,sBACA,sBACA,kBACA,iBACA,oBACA,kBACA,iBACA,qBACA,iBACA,eACA,iBACA,eACA,mBACA,UACA,YACA,iBACA,eACA,kBACA,sBACA,cACA,gBACA,aACA,WACA,mBACA,iBACA,iBACA,WACA,aACA,UACA,YACA,eACA,aACA,kBACA,mBACA,oBACA,qBACA,wBACA,wBACA,eACA,oBACA,oBACA,oBACA,oBACA,mBACA,aACA,kBACA,oBACA,YACA,YACA,YACA,YACA,cACA,cACA,YACA,UACA,kBACA,qBACA,cACA,iBACA,mBACA,mBACA,iBACA,kBACA,kBACA,sBACA,gBACA,qBACA,kBACA,mBACA,mBACA,gBACA,YACA,gBACA,cACA,oBACA,cACA,iBACA,iBACA,oBACA,gBACA,iBACA,cACA,WACA,kBACA,cACA,gBACA,qBACA,kBACA,wBACA,oBACA,mBACA,qBACA,sBACA,kBACA,yBACA,aACA,kBACA,eACA,eACA,mBACA,mBACA,qBACA,mBACA,sBACA,yBACA,iBACA,gBACA,gBACA,oBACA,kBACA,mBACA,sBACA,wBACA,sBACA,qBACA,cACA,gBACA,gBACA,iBACA,kBACA,cACA,aACA,kBACA,cACA,wBACA,sBACA,YACA,iBACA,gBACA,kBACA,uBACA,wBACA,kBACA,kBACA,uBACA,mBACA,iBACA,mBACA,oBACA,iBACA,kBACA,kBACA,qBACA,gBACA,kBACA,mBACA,iBACA,iBACA,oBACA,mBACA,sBACA,oBACA,yBACA,eACA,WACA,oBACA,sBACA,iBACA,iBACA,mBACA,qBACA,kBACA,qBACA,yBACA,gBACA,wBACA,eACA,kBACA,qBACA,eACA,mBACA,oBACA,oBACA,uBACA,qBACA,mBACA,kBACA,gBACA,sBACA,wBACA,qBACA,gBACA,iBACA,wBACA,iBACA,mBACA,qBACA,sBACA,mBACA,oBACA,oBACA,yBACA,uBACA,yBACA,6BACA,kBACA,iBACA,uBACA,0BACA,mBACA,mBACA,oBACA,kBACA,sBACA,kBACA,oBACA,sBACA,+BACA,mBACA,qBACA,iBACA,qBACA,gBACA,uBACA,kBACA,4BACA,sBACA,yBACA,sBACA,sBACA,sBACA,yBACA,iBACA,qBACA,mBACA,uBACA,iBACA,mBACA,sBACA,oBACA,oBACA,sBACA,sBACA,oBACA,qBACA,2BACA,8BACA,qBACA,mBACA,gBACA,kBACA,iBACA,qBACA,sBACA,sBACA,oBACA,sBACA,oBACA,oBACA,yBACA,kBACA,uBACA,2BACA,uBACA,sBACA,uBACA,kBACA,qBACA,sBACA,mBACA,mBACA,wBACA,0BACA,0BACA,uBACA,yBACA,yBACA,oBACA,iBACA,gBACA,kBACA,uBACA,oBACA,4BACA,yBACA,aACA,sBACA,oBACA,sBACA,oBACA,oBACA,uBACA,uBACA,wBACA,mBACA,wBACA,2BACA,kBACA,eACA,eACA,iBACA,iBACA,mBACA,mBACA,kBACA,yBACA,6BACA,uBACA,eACA,qBACA,qBACA,mBACA,gBACA,uBACA,uBACA,qBACA,sBACA,wBACA,uBACA,kBACA,oBACA,eACA,gBACA,kBACA,kBACA,uBACA,wBACA,qBACA,gBACA,aACA,aACA,oBACA,uBACA,qBACA,eACA,oBACA,oBACA,kBACA,qBACA,qBACA,wBACA,0BACA,iBACA,kBACA,kBACA,wBACA,mBACA,oBACA,yBAKAJ,GAAA,CACA,UACA,OACA,SACA,YACA,QACA,YACA,QACA,QACA,QACA,WACA,QACA,SACA,WACA,YACA,WACA,SACA,SACA,SACA,UACA,QACA,UACA,SACA,QACA,WACA,SACA,SACA,UACA,WACA,YACA,WACA,UACA,SACA,SACA,WACA,UACA,WACA,SACA,QACA,SACA,SACA,YACA,UACA,cACA,UACA,UACA,YACA,SACA,UACA,UACA,YACA,WACA,YACA,YACA,UACA,UACA,YACA,QACA,QACA,UACA,SACA,UACA,UACA,SACA,UACA,WACA,UACA,UACA,SACA,WACA,UACA,aACA,UACA,YACA,YACA,SACA,WACA,UACA,aACA,YACA,YACA,YACA,cACA,YACA,eACA,WACA,UACA,UACA,UACA,cACA,YACA,WACA,aACA,YACA,eACA,iBACA,eACA,YACA,WACA,UACA,UACA,aACA,cACA,cACA,YACA,YACA,YACA,kBACA,eACA,gBACA,UACA,WACA,WACA,YACA,YACA,aACA,WACA,YACA,YACA,WACA,cACA,iBACA,WACA,YACA,gBACA,WACA,WACA,YACA,aACA,eACA,cACA,QACA,QACA,YACA,aACA,YACA,cACA,YACA,eACA,aACA,WACA,gBACA,gBACA,UACA,UACA,UACA,cACA,cACA,cACA,eACA,eACA,WACA,cACA,eACA,kBACA,qBACA,oBACA,qBACA,eACA,kBACA,qBACA,qBACA,iBACA,YACA,cACA,eACA,YACA,YACA,WACA,WACA,aACA,iBACA,UACA,YACA,YACA,WACA,eACA,cACA,WACA,cACA,gBACA,cACA,WACA,cACA,cACA,WACA,eACA,oBACA,iBACA,mBACA,eACA,gBACA,eACA,WACA,aACA,WACA,cACA,YACA,YACA,gBACA,cACA,iBACA,iBACA,eACA,YACA,cACA,eACA,YACA,aACA,WACA,WACA,cACA,gBACA,UACA,WACA,WACA,cACA,cACA,YACA,UACA,WACA,cACA,aACA,eACA,aACA,iBACA,WACA,WACA,WACA,YACA,YACA,YACA,WACA,oBACA,eACA,iBACA,kBACA,oBACA,sBACA,oBACA,eACA,WACA,YACA,iBACA,SACA,YACA,aACA,gBACA,kBACA,qBACA,WACA,oBACA,eACA,kBACA,eACA,qBACA,iBACA,gBACA,mBACA,mBACA,kBACA,iBACA,kBACA,mBACA,aACA,eACA,cACA,cACA,gBACA,cACA,aACA,aACA,iBACA,gBACA,WACA,gBACA,YACA,WACA,aACA,gBACA,YACA,gBACA,eACA,cACA,kBACA,kBACA,aACA,mBACA,eACA,gBACA,cACA,eACA,kBACA,UACA,aACA,cACA,YACA,cACA,cACA,eACA,eACA,cACA,aACA,YACA,eACA,YACA,gBACA,cACA,UACA,YACA,YACA,YACA,WACA,YACA,cACA,cACA,YACA,WACA,WACA,YACA,YACA,YACA,eACA,iBACA,kBACA,WACA,eACA,WACA,oBACA,gBACA,kBACA,YACA,qBACA,sBACA,sBACA,qBACA,cACA,cACA,eACA,YACA,cACA,iBACA,mBACA,wBACA,YACA,cACA,iBACA,mBACA,YACA,kBACA,kBACA,eACA,mBACA,gBACA,eACA,eACA,WACA,WACA,cACA,YACA,aACA,WACA,eACA,oBACA,gBACA,sBACA,mBACA,oBACA,uBACA,kBACA,oBACA,kBACA,eACA,UAEA,gBACA,iBACA,yBACA,uBACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,YACA,YACA,cACA,YACA,aACA,WACA,aACA,cACA,YACA,YACA,YACA,iBACA,kBACA,gBACA,aACA,cACA,YACA,gBACA,gBACA,iBACA,aACA,eACA,YACA,aACA,aACA,YACA,aACA,UACA,WACA,cACA,cACA,cACA,cACA,WACA,WACA,eACA,eACA,cACA,eACA,WACA,gBACA,gBACA,cACA,iBACA,iBACA,YACA,YACA,eACA,eACA,cACA,aACA,eACA,cACA,YACA,cACA,eACA,gBACA,eACA,iBACA,cACA,cACA,cACA,eACA,gBACA,gBACA,gBACA,gBACA,gBACA,kBACA,cACA,gBACA,eACA,cACA,cACA,cACA,eACA,cACA,kBACA,UACA,kBACA,UACA,iBACA,oBACA,cACA,mBACA,cACA,eACA,aACA,gBACA,kBAEAD,GAAA,CACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,SAIAuD,GAAA,CACA,oBACA,sBACA,8BACA,wBACA,8BACA,gCACA,oBACA,8BACA,4BACA,gCACA,4CACA,8BACA,wBACA,8BACA,sBACA,8BACA,wBACA,oCACA,0CACA,gCACA,sCACA,8BACA,oCACA,gCACA,0BACA,wBACA,0CACA,oCACA,kBACA,oBACA,4BACA,oCACA,oCACA,kBACA,oBACA,oBACA,0BACA,oCACA,kCACA,oCACA,gCACA,wBACA,8BACA,sBACA,4BACA,wBACA,8BACA,gCACA,sCACA,oCACA,oDACA,4DACA,8CACA,0CACA,kCACA,sBACA,gCACA,8BACA,0CACA,sBACA,oCACA,0BACA,oBACA,kBACA,wBACA,sBACA,sBACA,wBACA,sBACA,wBACA,wBACA,sBACA,8BACA,kCACA,gCACA,oCACA,kCACA,wBACA,wBACA,8BACA,8BACA,sBACA,sCACA,4CACA,4BACA,8BACA,4BACA,kCACA,gCACA,kCACA,8BACA,wCACA,wCACA,0CACA,0CACA,oCACA,kBACA,oCACA,oCACA,oCACA,kCACA,4BACA,0BACA,kBACA,kBACA,oBACA,sBACA,wBACA,wBACA,0BACA,0BACA,wBACA,wBACA,wBACA,8BACA,8BACA,sBACA,4BACA,wBACA,4BACA,0BACA,0BACA,sBACA,sBACA,gCACA,oCACA,oCACA,kBACA,yBAIA,SAAAsB,GAAAp3E,GAYA,MAXA,OAAAA,EAAAP,MAAA,OAAAO,EAAAA,EAAAP,MAAA,IAEA,IAAAO,EAAA3D,WAAA,IAEA,KADA2D,EAAAA,EAAAP,MAAA,IACApD,WAAA,KAAA2D,EAAAA,EAAAP,MAAA,KAMAO,GAFAA,GAFAA,EAAAA,EAAA2E,QAAA,yBAEAA,QAAA,yDAAAqzB,EAAAC,GAAmF,OAAAA,EAAAtzB,QAAA,aAEnFA,QAAA,6BACAA,QAAA,QAAqB,KAAAA,QAAA,UACrB,CAEA,SAAA0yE,GAAAr3E,GAGA,OAFA,OAAAA,EAAA2E,QAAA2rE,GAAA,iBAAA3rE,QAAA,eAEAA,QAAA,KAAoB,KAAAA,QAAA,SACpB,CAEA,SAAA2yE,GAAA3zE,GACA,IAAA+iC,EAAA/iC,EAAAjH,MAAA,KAEA,OADAgqC,EAAA,GAAAhqC,MAAA,QACAgqC,EAA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,iBACA,0BACA,aACA,eACA,gBACA,oBACA,eACA,wBACA,qBACA,kBACA,qBACA,kBACA,kBACA,sBACA,yBACA,wBACA,2BACA,4BACA,wBACA,QAAApoD,IAAA,EACM,MAGN,wBAAAooD,EAAA,IACA,gBACA,eACA,gBACA,eACA,eACA,aACA,mBACA,QAAApoD,IAAA,EACM,MAGN,wBAAAooD,EAAA,IACA,uBACA,0BACA,oBACA,yBACA,QAAApoD,IAAA,EACM,MAGN,wBAAAooD,EAAA,IACA,SACA,qBACA,wBACA,kBACA,gBACA,yBACA,qBACA,gBACA,iBACA,iBACA,kBACA,kBACA,eACA,aACA,iBACA,qBACA,yBACA,yBACA,aACA,aACA,cACA,wBACA,2BACA,qBACA,gBACA,iBACA,UACA,YACA,qBACA,sBACA,+BACA,QAAApoD,IAAA,EACM,MAEN,qBACA,OAAAooD,EAAA,IACA,YAEA,WACA,UACA,UACA,WACA,iBACA,YACA,oBACA,YACA,iBACA,mBACA,iBACA,mBACA,iBACA,gBACA,gBACA,gBACA,gBACA,eACA,aACA,aACA,aAEA,0BACA,QAAApoD,IAAA,EACM,MAEN,cACA,4BACA,OAAAooD,EAAA,IACA,YACA,WACA,UACA,UACA,WACA,iBACA,YACA,oBACA,YACA,iBACA,mBACA,iBACA,oBACA,mBACA,iBACA,gBACA,gBACA,gBACA,gBACA,eACA,aACA,aACA,mBACA,QAAApoD,IAAA,EACM,MAGN,6CAAAooD,EAAA,IACA,UACA,YACA,YACA,YACA,YACA,cACA,eACA,gBACA,kBACA,oBAEA,aACA,cACA,kBACA,eACA,UACA,gBACA,cAEA,gBACA,QAAApoD,IAAA,EACM,MAGN,sBAEA,QAAAA,IAAA,EAEA,GAAAA,GAAA,MAEA,GAAAooD,EAAA,GAAA9mF,MAAA,kBACA,IAAAkd,EAAAA,EAAAliB,OAAA,gCAAA8rF,EAAA,OAAA5pE,EAAArc,KAAA,KACA,gCAAAqc,EAAAA,EAAAliB,OAAA,OACA,UAAA8rF,EAAA,GAAAhpF,OAAA,SACA,MAAAgpF,E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,YACA,wBACA,iBACA,WACA,gBACA,sBACA,YACA,SAAA8rF,EAAA,IAAoB,IAAAK,EAAAjqE,EAAAokB,OAAA,KAAAwlD,EAAA,sBAAAK,MACpB,MAAAL,EAAA,GAAAnsF,OAAAmsF,EAAA,GAAA9rF,OAAA,IAAAkiB,EAAAtc,KAAA,CAAAkmF,EAAA,QACAsZ,EAAA,GAAgBC,EAAA,EAAcC,EAAA,GAC9B,MAEA,wBAEA,sBAEA,qBAeA,aACA,gBACA,uBAEA,oBACA,kBACA,YAEA,UACA,gBAEA,2BACA,uBACA,8BACA,2BACA,4BAUA,eAoBA,oBACA,cACA,iBAqBA,mBACA,sBACA,oBAEA,sBAEA,YACA,mBACA,wBACA,iBAEA,yBACA,2BACA,oBAEA,gBAEA,yBACA,2BACA,wBACA,kBACA,mBACA,uBACA,WACA,cACA,kBAEA,UACA,iBACA,WAQA,QAUA,WAEA,aACA,qBACA,WACA,kBAGA,mBACA,eAEA,gBACA,0BACA,yBACA,mBACA,oBACA,sBACA,aACA,iBACA,gBACA,uBAEA,8BACA,8BACA,4BAGA,uBACA,sBACA,sBACA,mBACA,sBACA,mBACA,2BACA,iBACA,qBACA,wBACA,oBACA,kBACA,yBACA,qBACA,+BACA,kBACA,sBACA,cACA,gBACA,oBACA,iBAGA,qBAGA,sBACA,oBACA,iBACA,gBACA,yBACA,mBACA,uBACA,qBAIA,kBAIA,kBACA,iBACA,WAGA,wBACA,gBACA,gBACA,wBAGA,uBACA,wBACA,qBACA,uBACA,uBACA,2BACA,0BACA,yBACA,wBACA,8BACA,2BACA,6BACA,iCACA,wBACA,uBACA,8BAIA,WAIA,2BACA,0BACA,eACA,iBAGA,iBACA,eAeA,uBACA,6BACA,yCA9PA,mBACA,uBACA,iBACA,iBACA,SAAAxZ,EAAA,IAEA,GADA0Z,EAAAN,EAAAn2F,MAAA0+D,GACA0e,EAAAjqE,EAAAokB,OAAA,KAAAwlD,EAAA,sBAAAK,MACM,MAAAL,EAAA,GAAAnsF,OAAAmsF,EAAA,GAAA9rF,OAAA,KACNytE,EAAA,GACAy3B,EAAA5wD,GAAAw3C,EAA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","sources":["webpack://dash_table/./node_modules/xlsx/dist/cpexcel.js","webpack://dash_table/./node_modules/xlsx/jszip.js","webpack://dash_table/./node_modules/xlsx/xlsx.js"],"sourcesContent":["/*! cpexcel.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/*jshint -W100 */\nvar cptable = {version:\"1.15.0\"};\ncptable[437] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[620] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàąçêëèïîćÄĄĘęłôöĆûùŚÖܢ٥śƒŹŻóÓńŃźż¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[737] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[850] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[852] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘ꬟Ⱥ«»░▒▓│┤ÁÂĚŞ╣║╗╝Żż┐└┴┬├─┼Ăă╚╔╩╦╠═╬¤đĐĎËďŇÍÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÝţ´­˝˛ˇ˘§÷¸°¨˙űŘř■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[857] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞ𿮬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ºªÊËÈ�ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµ�×ÚÛÙìÿ¯´­±�¾¶§÷¸°¨·¹³²■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[861] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèÐðÞÄÅÉæÆôöþûÝýÖÜø£Ø₧ƒáíóúÁÍÓÚ¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[865] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñѪº¿⌐¬½¼¡«¤░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[866] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[874] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€����…�����������‘’“”•–—�������� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[895] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ČüéďäĎŤčěĚĹÍľǪÄÁÉžŽôöÓůÚýÖÜŠĽÝŘťáíóúňŇŮÔšřŕŔ¼§«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[932] = (function(){ var d = [], e = {}, D = [], j;\nD[0] = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~���������������������������������。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚��������������������������������\".split(\"\");\nfor(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}\nD[129] = \"���������������������������������������������������������������� 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈〉《》「」『』【】+-±×�÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓�����������∈∋⊆⊇⊂⊃∪∩��������∧∨¬⇒⇔∀∃�����������∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬�������ʼn♯♭♪†‡¶����◯���\".split(\"\");\nfor(j = 0; j != D[129].length; ++j) if(D[129][j].charCodeAt(0) !== 0xFFFD) { e[D[129][j]] = 33024 + j; d[33024 + j] = D[129][j];}\nD[130] = \"�������������������������������������������������������������������������������0123456789�������ABCDEFGHIJKLMNOPQRSTUVWXYZ�������abcdefghijklmnopqrstuvwxyz����ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん��������������\".split(\"\");\nfor(j = 0; j != D[130].length; ++j) if(D[130][j].charCodeAt(0) !== 0xFFFD) { e[D[130][j]] = 33280 + j; d[33280 + j] = D[130][j];}\nD[131] = \"����������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミ�ムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ��������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�����������������������������������������\".split(\"\");\nfor(j = 0; j != D[131].length; ++j) if(D[131][j].charCodeAt(0) !== 0xFFFD) { e[D[131][j]] = 33536 + j; d[33536 + j] = D[131][j];}\nD[132] = \"����������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмн�опрстуфхцчшщъыьэюя�������������─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂�����������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[132].length; ++j) if(D[132][j].charCodeAt(0) !== 0xFFFD) { e[D[132][j]] = 33792 + j; d[33792 + j] = D[132][j];}\nD[135] = \"����������������������������������������������������������������①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ�㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡��������㍻�〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪���������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[135].length; ++j) if(D[135][j].charCodeAt(0) !== 0xFFFD) { e[D[135][j]] = 34560 + j; d[34560 + j] = D[135][j];}\nD[136] = \"���������������������������������������������������������������������������������������������������������������������������������������������������������������亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭���\".split(\"\");\nfor(j = 0; j != D[136].length; ++j) if(D[136][j].charCodeAt(0) !== 0xFFFD) { e[D[136][j]] = 34816 + j; d[34816 + j] = D[136][j];}\nD[137] = \"����������������������������������������������������������������院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円�園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改���\".split(\"\");\nfor(j = 0; j != D[137].length; ++j) if(D[137][j].charCodeAt(0) !== 0xFFFD) { e[D[137][j]] = 35072 + j; d[35072 + j] = D[137][j];}\nD[138] = \"����������������������������������������������������������������魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫�橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄���\".split(\"\");\nfor(j = 0; j != D[138].length; ++j) if(D[138][j].charCodeAt(0) !== 0xFFFD) { e[D[138][j]] = 35328 + j; d[35328 + j] = D[138][j];}\nD[139] = \"����������������������������������������������������������������機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救�朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈���\".split(\"\");\nfor(j = 0; j != D[139].length; ++j) if(D[139][j].charCodeAt(0) !== 0xFFFD) { e[D[139][j]] = 35584 + j; d[35584 + j] = D[139][j];}\nD[140] = \"����������������������������������������������������������������掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨�劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向���\".split(\"\");\nfor(j = 0; j != D[140].length; ++j) if(D[140][j].charCodeAt(0) !== 0xFFFD) { e[D[140][j]] = 35840 + j; d[35840 + j] = D[140][j];}\nD[141] = \"����������������������������������������������������������������后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降�項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷���\".split(\"\");\nfor(j = 0; j != D[141].length; ++j) if(D[141][j].charCodeAt(0) !== 0xFFFD) { e[D[141][j]] = 36096 + j; d[36096 + j] = D[141][j];}\nD[142] = \"����������������������������������������������������������������察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止�死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周���\".split(\"\");\nfor(j = 0; j != D[142].length; ++j) if(D[142][j].charCodeAt(0) !== 0xFFFD) { e[D[142][j]] = 36352 + j; d[36352 + j] = D[142][j];}\nD[143] = \"����������������������������������������������������������������宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳�準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾���\".split(\"\");\nfor(j = 0; j != D[143].length; ++j) if(D[143][j].charCodeAt(0) !== 0xFFFD) { e[D[143][j]] = 36608 + j; d[36608 + j] = D[143][j];}\nD[144] = \"����������������������������������������������������������������拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨�逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線���\".split(\"\");\nfor(j = 0; j != D[144].length; ++j) if(D[144][j].charCodeAt(0) !== 0xFFFD) { e[D[144][j]] = 36864 + j; d[36864 + j] = D[144][j];}\nD[145] = \"����������������������������������������������������������������繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻�操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只���\".split(\"\");\nfor(j = 0; j != D[145].length; ++j) if(D[145][j].charCodeAt(0) !== 0xFFFD) { e[D[145][j]] = 37120 + j; d[37120 + j] = D[145][j];}\nD[146] = \"����������������������������������������������������������������叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄�逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓���\".split(\"\");\nfor(j = 0; j != D[146].length; ++j) if(D[146][j].charCodeAt(0) !== 0xFFFD) { e[D[146][j]] = 37376 + j; d[37376 + j] = D[146][j];}\nD[147] = \"����������������������������������������������������������������邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬�凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入���\".split(\"\");\nfor(j = 0; j != D[147].length; ++j) if(D[147][j].charCodeAt(0) !== 0xFFFD) { e[D[147][j]] = 37632 + j; d[37632 + j] = D[147][j];}\nD[148] = \"����������������������������������������������������������������如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅�楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美���\".split(\"\");\nfor(j = 0; j != D[148].length; ++j) if(D[148][j].charCodeAt(0) !== 0xFFFD) { e[D[148][j]] = 37888 + j; d[37888 + j] = D[148][j];}\nD[149] = \"����������������������������������������������������������������鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷�斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋���\".split(\"\");\nfor(j = 0; j != D[149].length; ++j) if(D[149][j].charCodeAt(0) !== 0xFFFD) { e[D[149][j]] = 38144 + j; d[38144 + j] = D[149][j];}\nD[150] = \"����������������������������������������������������������������法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆�摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒���\".split(\"\");\nfor(j = 0; j != D[150].length; ++j) if(D[150][j].charCodeAt(0) !== 0xFFFD) { e[D[150][j]] = 38400 + j; d[38400 + j] = D[150][j];}\nD[151] = \"����������������������������������������������������������������諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲�沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯���\".split(\"\");\nfor(j = 0; j != D[151].length; ++j) if(D[151][j].charCodeAt(0) !== 0xFFFD) { e[D[151][j]] = 38656 + j; d[38656 + j] = D[151][j];}\nD[152] = \"����������������������������������������������������������������蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕��������������������������������������������弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲���\".split(\"\");\nfor(j = 0; j != D[152].length; ++j) if(D[152][j].charCodeAt(0) !== 0xFFFD) { e[D[152][j]] = 38912 + j; d[38912 + j] = D[152][j];}\nD[153] = \"����������������������������������������������������������������僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭�凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨���\".split(\"\");\nfor(j = 0; j != D[153].length; ++j) if(D[153][j].charCodeAt(0) !== 0xFFFD) { e[D[153][j]] = 39168 + j; d[39168 + j] = D[153][j];}\nD[154] = \"����������������������������������������������������������������咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸�噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩���\".split(\"\");\nfor(j = 0; j != D[154].length; ++j) if(D[154][j].charCodeAt(0) !== 0xFFFD) { e[D[154][j]] = 39424 + j; d[39424 + j] = D[154][j];}\nD[155] = \"����������������������������������������������������������������奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀�它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏���\".split(\"\");\nfor(j = 0; j != D[155].length; ++j) if(D[155][j].charCodeAt(0) !== 0xFFFD) { e[D[155][j]] = 39680 + j; d[39680 + j] = D[155][j];}\nD[156] = \"����������������������������������������������������������������廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠�怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛���\".split(\"\");\nfor(j = 0; j != D[156].length; ++j) if(D[156][j].charCodeAt(0) !== 0xFFFD) { e[D[156][j]] = 39936 + j; d[39936 + j] = D[156][j];}\nD[157] = \"����������������������������������������������������������������戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫�捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼���\".split(\"\");\nfor(j = 0; j != D[157].length; ++j) if(D[157][j].charCodeAt(0) !== 0xFFFD) { e[D[157][j]] = 40192 + j; d[40192 + j] = D[157][j];}\nD[158] = \"����������������������������������������������������������������曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎�梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣���\".split(\"\");\nfor(j = 0; j != D[158].length; ++j) if(D[158][j].charCodeAt(0) !== 0xFFFD) { e[D[158][j]] = 40448 + j; d[40448 + j] = D[158][j];}\nD[159] = \"����������������������������������������������������������������檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯�麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌���\".split(\"\");\nfor(j = 0; j != D[159].length; ++j) if(D[159][j].charCodeAt(0) !== 0xFFFD) { e[D[159][j]] = 40704 + j; d[40704 + j] = D[159][j];}\nD[224] = \"����������������������������������������������������������������漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝�烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱���\".split(\"\");\nfor(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}\nD[225] = \"����������������������������������������������������������������瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿�痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬���\".split(\"\");\nfor(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}\nD[226] = \"����������������������������������������������������������������磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰�窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆���\".split(\"\");\nfor(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}\nD[227] = \"����������������������������������������������������������������紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷�縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋���\".split(\"\");\nfor(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}\nD[228] = \"����������������������������������������������������������������隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤�艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈���\".split(\"\");\nfor(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}\nD[229] = \"����������������������������������������������������������������蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬�蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞���\".split(\"\");\nfor(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}\nD[230] = \"����������������������������������������������������������������襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧�諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊���\".split(\"\");\nfor(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}\nD[231] = \"����������������������������������������������������������������蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜�轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮���\".split(\"\");\nfor(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}\nD[232] = \"����������������������������������������������������������������錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙�閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰���\".split(\"\");\nfor(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}\nD[233] = \"����������������������������������������������������������������顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃�騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈���\".split(\"\");\nfor(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}\nD[234] = \"����������������������������������������������������������������鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯�黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙�������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}\nD[237] = \"����������������������������������������������������������������纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏�塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱���\".split(\"\");\nfor(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}\nD[238] = \"����������������������������������������������������������������犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙�蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑��ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ¬¦'"���\".split(\"\");\nfor(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}\nD[250] = \"����������������������������������������������������������������ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ¬¦'"㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊�兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯���\".split(\"\");\nfor(j = 0; j != D[250].length; ++j) if(D[250][j].charCodeAt(0) !== 0xFFFD) { e[D[250][j]] = 64000 + j; d[64000 + j] = D[250][j];}\nD[251] = \"����������������������������������������������������������������涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神�祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙���\".split(\"\");\nfor(j = 0; j != D[251].length; ++j) if(D[251][j].charCodeAt(0) !== 0xFFFD) { e[D[251][j]] = 64256 + j; d[64256 + j] = D[251][j];}\nD[252] = \"����������������������������������������������������������������髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[252].length; ++j) if(D[252][j].charCodeAt(0) !== 0xFFFD) { e[D[252][j]] = 64512 + j; d[64512 + j] = D[252][j];}\nreturn {\"enc\": e, \"dec\": d }; })();\ncptable[936] = (function(){ var d = [], e = {}, D = [], j;\nD[0] = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}\nD[129] = \"����������������������������������������������������������������丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪乫乬乭乮乯乲乴乵乶乷乸乹乺乻乼乽乿亀亁亂亃亄亅亇亊�亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂伃伄伅伆伇伈伋伌伒伓伔伕伖伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾伿佀佁佂佄佅佇佈佉佊佋佌佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢�\".split(\"\");\nfor(j = 0; j != D[129].length; ++j) if(D[129][j].charCodeAt(0) !== 0xFFFD) { e[D[129][j]] = 33024 + j; d[33024 + j] = D[129][j];}\nD[130] = \"����������������������������������������������������������������侤侫侭侰侱侲侳侴侶侷侸侹侺侻侼侽侾俀俁係俆俇俈俉俋俌俍俒俓俔俕俖俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿倀倁倂倃倄倅倆倇倈倉倊�個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯倰倱倲倳倴倵倶倷倸倹倻倽倿偀偁偂偄偅偆偉偊偋偍偐偑偒偓偔偖偗偘偙偛偝偞偟偠偡偢偣偤偦偧偨偩偪偫偭偮偯偰偱偲偳側偵偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎傏傐傑傒傓傔傕傖傗傘備傚傛傜傝傞傟傠傡傢傤傦傪傫傭傮傯傰傱傳傴債傶傷傸傹傼�\".split(\"\");\nfor(j = 0; j != D[130].length; ++j) if(D[130][j].charCodeAt(0) !== 0xFFFD) { e[D[130][j]] = 33280 + j; d[33280 + j] = D[130][j];}\nD[131] = \"����������������������������������������������������������������傽傾傿僀僁僂僃僄僅僆僇僈僉僊僋僌働僎僐僑僒僓僔僕僗僘僙僛僜僝僞僟僠僡僢僣僤僥僨僩僪僫僯僰僱僲僴僶僷僸價僺僼僽僾僿儀儁儂儃億儅儈�儉儊儌儍儎儏儐儑儓儔儕儖儗儘儙儚儛儜儝儞償儠儢儣儤儥儦儧儨儩優儫儬儭儮儯儰儱儲儳儴儵儶儷儸儹儺儻儼儽儾兂兇兊兌兎兏児兒兓兗兘兙兛兝兞兟兠兡兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦冧冨冩冪冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒凓凔凕凖凗�\".split(\"\");\nfor(j = 0; j != D[131].length; ++j) if(D[131][j].charCodeAt(0) !== 0xFFFD) { e[D[131][j]] = 33536 + j; d[33536 + j] = D[131][j];}\nD[132] = \"����������������������������������������������������������������凘凙凚凜凞凟凢凣凥処凧凨凩凪凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄剅剆則剈剉剋剎剏剒剓剕剗剘�剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳剴創剶剷剸剹剺剻剼剾劀劃劄劅劆劇劉劊劋劌劍劎劏劑劒劔劕劖劗劘劙劚劜劤劥劦劧劮劯劰労劵劶劷劸効劺劻劼劽勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務勚勛勜勝勞勠勡勢勣勥勦勧勨勩勪勫勬勭勮勯勱勲勳勴勵勶勷勸勻勼勽匁匂匃匄匇匉匊匋匌匎�\".split(\"\");\nfor(j = 0; j != D[132].length; ++j) if(D[132][j].charCodeAt(0) !== 0xFFFD) { e[D[132][j]] = 33792 + j; d[33792 + j] = D[132][j];}\nD[133] = \"����������������������������������������������������������������匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯匰匱匲匳匴匵匶匷匸匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏�厐厑厒厓厔厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯厰厱厲厳厴厵厷厸厹厺厼厽厾叀參叄叅叆叇収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝呞呟呠呡呣呥呧呩呪呫呬呭呮呯呰呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡�\".split(\"\");\nfor(j = 0; j != D[133].length; ++j) if(D[133][j].charCodeAt(0) !== 0xFFFD) { e[D[133][j]] = 34048 + j; d[34048 + j] = D[133][j];}\nD[134] = \"����������������������������������������������������������������咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠員哢哣哤哫哬哯哰哱哴哵哶哷哸哹哻哾唀唂唃唄唅唈唊唋唌唍唎唒唓唕唖唗唘唙唚唜唝唞唟唡唥唦�唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋啌啍啎問啑啒啓啔啗啘啙啚啛啝啞啟啠啢啣啨啩啫啯啰啱啲啳啴啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠喡喢喣喤喥喦喨喩喪喫喬喭單喯喰喲喴営喸喺喼喿嗀嗁嗂嗃嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗嗘嗙嗚嗛嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸嗹嗺嗻嗼嗿嘂嘃嘄嘅�\".split(\"\");\nfor(j = 0; j != D[134].length; ++j) if(D[134][j].charCodeAt(0) !== 0xFFFD) { e[D[134][j]] = 34304 + j; d[34304 + j] = D[134][j];}\nD[135] = \"����������������������������������������������������������������嘆嘇嘊嘋嘍嘐嘑嘒嘓嘔嘕嘖嘗嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀噁噂噃噄噅噆噇噈噉噊噋噏噐噑噒噓噕噖噚噛噝噞噟噠噡�噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽噾噿嚀嚁嚂嚃嚄嚇嚈嚉嚊嚋嚌嚍嚐嚑嚒嚔嚕嚖嚗嚘嚙嚚嚛嚜嚝嚞嚟嚠嚡嚢嚤嚥嚦嚧嚨嚩嚪嚫嚬嚭嚮嚰嚱嚲嚳嚴嚵嚶嚸嚹嚺嚻嚽嚾嚿囀囁囂囃囄囅囆囇囈囉囋囌囍囎囏囐囑囒囓囕囖囘囙囜団囥囦囧囨囩囪囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國圌圍圎圏圐圑�\".split(\"\");\nfor(j = 0; j != D[135].length; ++j) if(D[135][j].charCodeAt(0) !== 0xFFFD) { e[D[135][j]] = 34560 + j; d[34560 + j] = D[135][j];}\nD[136] = \"����������������������������������������������������������������園圓圔圕圖圗團圙圚圛圝圞圠圡圢圤圥圦圧圫圱圲圴圵圶圷圸圼圽圿坁坃坄坅坆坈坉坋坒坓坔坕坖坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀�垁垇垈垉垊垍垎垏垐垑垔垕垖垗垘垙垚垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹垺垻垼垽垾垿埀埁埄埅埆埇埈埉埊埌埍埐埑埓埖埗埛埜埞埡埢埣埥埦埧埨埩埪埫埬埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥堦堧堨堩堫堬堭堮堯報堲堳場堶堷堸堹堺堻堼堽�\".split(\"\");\nfor(j = 0; j != D[136].length; ++j) if(D[136][j].charCodeAt(0) !== 0xFFFD) { e[D[136][j]] = 34816 + j; d[34816 + j] = D[136][j];}\nD[137] = \"����������������������������������������������������������������堾堿塀塁塂塃塅塆塇塈塉塊塋塎塏塐塒塓塕塖塗塙塚塛塜塝塟塠塡塢塣塤塦塧塨塩塪塭塮塯塰塱塲塳塴塵塶塷塸塹塺塻塼塽塿墂墄墆墇墈墊墋墌�墍墎墏墐墑墔墕墖増墘墛墜墝墠墡墢墣墤墥墦墧墪墫墬墭墮墯墰墱墲墳墴墵墶墷墸墹墺墻墽墾墿壀壂壃壄壆壇壈壉壊壋壌壍壎壏壐壒壓壔壖壗壘壙壚壛壜壝壞壟壠壡壢壣壥壦壧壨壩壪壭壯壱売壴壵壷壸壺壻壼壽壾壿夀夁夃夅夆夈変夊夋夌夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻�\".split(\"\");\nfor(j = 0; j != D[137].length; ++j) if(D[137][j].charCodeAt(0) !== 0xFFFD) { e[D[137][j]] = 35072 + j; d[35072 + j] = D[137][j];}\nD[138] = \"����������������������������������������������������������������夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛奜奝奞奟奡奣奤奦奧奨奩奪奫奬奭奮奯奰奱奲奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦�妧妬妭妰妱妳妴妵妶妷妸妺妼妽妿姀姁姂姃姄姅姇姈姉姌姍姎姏姕姖姙姛姞姟姠姡姢姤姦姧姩姪姫姭姮姯姰姱姲姳姴姵姶姷姸姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪娫娬娭娮娯娰娳娵娷娸娹娺娻娽娾娿婁婂婃婄婅婇婈婋婌婍婎婏婐婑婒婓婔婖婗婘婙婛婜婝婞婟婠�\".split(\"\");\nfor(j = 0; j != D[138].length; ++j) if(D[138][j].charCodeAt(0) !== 0xFFFD) { e[D[138][j]] = 35328 + j; d[35328 + j] = D[138][j];}\nD[139] = \"����������������������������������������������������������������婡婣婤婥婦婨婩婫婬婭婮婯婰婱婲婳婸婹婻婼婽婾媀媁媂媃媄媅媆媇媈媉媊媋媌媍媎媏媐媑媓媔媕媖媗媘媙媜媝媞媟媠媡媢媣媤媥媦媧媨媩媫媬�媭媮媯媰媱媴媶媷媹媺媻媼媽媿嫀嫃嫄嫅嫆嫇嫈嫊嫋嫍嫎嫏嫐嫑嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬嫭嫮嫯嫰嫲嫳嫴嫵嫶嫷嫸嫹嫺嫻嫼嫽嫾嫿嬀嬁嬂嬃嬄嬅嬆嬇嬈嬊嬋嬌嬍嬎嬏嬐嬑嬒嬓嬔嬕嬘嬙嬚嬛嬜嬝嬞嬟嬠嬡嬢嬣嬤嬥嬦嬧嬨嬩嬪嬫嬬嬭嬮嬯嬰嬱嬳嬵嬶嬸嬹嬺嬻嬼嬽嬾嬿孁孂孃孄孅孆孇�\".split(\"\");\nfor(j = 0; j != D[139].length; ++j) if(D[139][j].charCodeAt(0) !== 0xFFFD) { e[D[139][j]] = 35584 + j; d[35584 + j] = D[139][j];}\nD[140] = \"����������������������������������������������������������������孈孉孊孋孌孍孎孏孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏�寑寔寕寖寗寘寙寚寛寜寠寢寣實寧審寪寫寬寭寯寱寲寳寴寵寶寷寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧屨屩屪屫屬屭屰屲屳屴屵屶屷屸屻屼屽屾岀岃岄岅岆岇岉岊岋岎岏岒岓岕岝岞岟岠岡岤岥岦岧岨�\".split(\"\");\nfor(j = 0; j != D[140].length; ++j) if(D[140][j].charCodeAt(0) !== 0xFFFD) { e[D[140][j]] = 35840 + j; d[35840 + j] = D[140][j];}\nD[141] = \"����������������������������������������������������������������岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅峆峇峈峉峊峌峍峎峏峐峑峓峔峕峖峗峘峚峛峜峝峞峟峠峢峣峧峩峫峬峮峯峱峲峳峴峵島峷峸峹峺峼峽峾峿崀�崁崄崅崈崉崊崋崌崍崏崐崑崒崓崕崗崘崙崚崜崝崟崠崡崢崣崥崨崪崫崬崯崰崱崲崳崵崶崷崸崹崺崻崼崿嵀嵁嵂嵃嵄嵅嵆嵈嵉嵍嵎嵏嵐嵑嵒嵓嵔嵕嵖嵗嵙嵚嵜嵞嵟嵠嵡嵢嵣嵤嵥嵦嵧嵨嵪嵭嵮嵰嵱嵲嵳嵵嵶嵷嵸嵹嵺嵻嵼嵽嵾嵿嶀嶁嶃嶄嶅嶆嶇嶈嶉嶊嶋嶌嶍嶎嶏嶐嶑嶒嶓嶔嶕嶖嶗嶘嶚嶛嶜嶞嶟嶠�\".split(\"\");\nfor(j = 0; j != D[141].length; ++j) if(D[141][j].charCodeAt(0) !== 0xFFFD) { e[D[141][j]] = 36096 + j; d[36096 + j] = D[141][j];}\nD[142] = \"����������������������������������������������������������������嶡嶢嶣嶤嶥嶦嶧嶨嶩嶪嶫嶬嶭嶮嶯嶰嶱嶲嶳嶴嶵嶶嶸嶹嶺嶻嶼嶽嶾嶿巀巁巂巃巄巆巇巈巉巊巋巌巎巏巐巑巒巓巔巕巖巗巘巙巚巜巟巠巣巤巪巬巭�巰巵巶巸巹巺巻巼巿帀帄帇帉帊帋帍帎帒帓帗帞帟帠帡帢帣帤帥帨帩帪師帬帯帰帲帳帴帵帶帹帺帾帿幀幁幃幆幇幈幉幊幋幍幎幏幐幑幒幓幖幗幘幙幚幜幝幟幠幣幤幥幦幧幨幩幪幫幬幭幮幯幰幱幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨庩庪庫庬庮庯庰庱庲庴庺庻庼庽庿廀廁廂廃廄廅�\".split(\"\");\nfor(j = 0; j != D[142].length; ++j) if(D[142][j].charCodeAt(0) !== 0xFFFD) { e[D[142][j]] = 36352 + j; d[36352 + j] = D[142][j];}\nD[143] = \"����������������������������������������������������������������廆廇廈廋廌廍廎廏廐廔廕廗廘廙廚廜廝廞廟廠廡廢廣廤廥廦廧廩廫廬廭廮廯廰廱廲廳廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤�弨弫弬弮弰弲弳弴張弶強弸弻弽弾弿彁彂彃彄彅彆彇彈彉彊彋彌彍彎彏彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢徣徤徥徦徧復徫徬徯徰徱徲徳徴徶徸徹徺徻徾徿忀忁忂忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇�\".split(\"\");\nfor(j = 0; j != D[143].length; ++j) if(D[143][j].charCodeAt(0) !== 0xFFFD) { e[D[143][j]] = 36608 + j; d[36608 + j] = D[143][j];}\nD[144] = \"����������������������������������������������������������������怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰怱怲怳怴怶怷怸怹怺怽怾恀恄恅恆恇恈恉恊恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀�悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽悾悿惀惁惂惃惄惇惈惉惌惍惎惏惐惒惓惔惖惗惙惛惞惡惢惣惤惥惪惱惲惵惷惸惻惼惽惾惿愂愃愄愅愇愊愋愌愐愑愒愓愔愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬愭愮愯愰愱愲愳愴愵愶愷愸愹愺愻愼愽愾慀慁慂慃慄慅慆�\".split(\"\");\nfor(j = 0; j != D[144].length; ++j) if(D[144][j].charCodeAt(0) !== 0xFFFD) { e[D[144][j]] = 36864 + j; d[36864 + j] = D[144][j];}\nD[145] = \"����������������������������������������������������������������慇慉態慍慏慐慒慓慔慖慗慘慙慚慛慜慞慟慠慡慣慤慥慦慩慪慫慬慭慮慯慱慲慳慴慶慸慹慺慻慼慽慾慿憀憁憂憃憄憅憆憇憈憉憊憌憍憏憐憑憒憓憕�憖憗憘憙憚憛憜憞憟憠憡憢憣憤憥憦憪憫憭憮憯憰憱憲憳憴憵憶憸憹憺憻憼憽憿懀懁懃懄懅懆懇應懌懍懎懏懐懓懕懖懗懘懙懚懛懜懝懞懟懠懡懢懣懤懥懧懨懩懪懫懬懭懮懯懰懱懲懳懴懶懷懸懹懺懻懼懽懾戀戁戂戃戄戅戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸戹戺戻戼扂扄扅扆扊�\".split(\"\");\nfor(j = 0; j != D[145].length; ++j) if(D[145][j].charCodeAt(0) !== 0xFFFD) { e[D[145][j]] = 37120 + j; d[37120 + j] = D[145][j];}\nD[146] = \"����������������������������������������������������������������扏扐払扖扗扙扚扜扝扞扟扠扡扢扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋抌抍抎抏抐抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁�拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳挴挵挶挷挸挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖捗捘捙捚捛捜捝捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙掚掛掜掝掞掟採掤掦掫掯掱掲掵掶掹掻掽掿揀�\".split(\"\");\nfor(j = 0; j != D[146].length; ++j) if(D[146][j].charCodeAt(0) !== 0xFFFD) { e[D[146][j]] = 37376 + j; d[37376 + j] = D[146][j];}\nD[147] = \"����������������������������������������������������������������揁揂揃揅揇揈揊揋揌揑揓揔揕揗揘揙揚換揜揝揟揢揤揥揦揧揨揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆搇搈搉搊損搎搑搒搕搖搗搘搙搚搝搟搢搣搤�搥搧搨搩搫搮搯搰搱搲搳搵搶搷搸搹搻搼搾摀摂摃摉摋摌摍摎摏摐摑摓摕摖摗摙摚摛摜摝摟摠摡摢摣摤摥摦摨摪摫摬摮摯摰摱摲摳摴摵摶摷摻摼摽摾摿撀撁撃撆撈撉撊撋撌撍撎撏撐撓撔撗撘撚撛撜撝撟撠撡撢撣撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆擇擈擉擊擋擌擏擑擓擔擕擖擙據�\".split(\"\");\nfor(j = 0; j != D[147].length; ++j) if(D[147][j].charCodeAt(0) !== 0xFFFD) { e[D[147][j]] = 37632 + j; d[37632 + j] = D[147][j];}\nD[148] = \"����������������������������������������������������������������擛擜擝擟擠擡擣擥擧擨擩擪擫擬擭擮擯擰擱擲擳擴擵擶擷擸擹擺擻擼擽擾擿攁攂攃攄攅攆攇攈攊攋攌攍攎攏攐攑攓攔攕攖攗攙攚攛攜攝攞攟攠攡�攢攣攤攦攧攨攩攪攬攭攰攱攲攳攷攺攼攽敀敁敂敃敄敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數敹敺敻敼敽敾敿斀斁斂斃斄斅斆斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱斲斳斴斵斶斷斸斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘旙旚旛旜旝旞旟旡旣旤旪旫�\".split(\"\");\nfor(j = 0; j != D[148].length; ++j) if(D[148][j].charCodeAt(0) !== 0xFFFD) { e[D[148][j]] = 37888 + j; d[37888 + j] = D[148][j];}\nD[149] = \"����������������������������������������������������������������旲旳旴旵旸旹旻旼旽旾旿昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷昸昹昺昻昽昿晀時晄晅晆晇晈晉晊晍晎晐晑晘�晙晛晜晝晞晠晢晣晥晧晩晪晫晬晭晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘暙暚暛暜暞暟暠暡暢暣暤暥暦暩暪暫暬暭暯暰暱暲暳暵暶暷暸暺暻暼暽暿曀曁曂曃曄曅曆曇曈曉曊曋曌曍曎曏曐曑曒曓曔曕曖曗曘曚曞曟曠曡曢曣曤曥曧曨曪曫曬曭曮曯曱曵曶書曺曻曽朁朂會�\".split(\"\");\nfor(j = 0; j != D[149].length; ++j) if(D[149][j].charCodeAt(0) !== 0xFFFD) { e[D[149][j]] = 38144 + j; d[38144 + j] = D[149][j];}\nD[150] = \"����������������������������������������������������������������朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠朡朢朣朤朥朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗杘杙杚杛杝杢杣杤杦杧杫杬杮東杴杶�杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹枺枻枼枽枾枿柀柂柅柆柇柈柉柊柋柌柍柎柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵柶柷柸柹柺査柼柾栁栂栃栄栆栍栐栒栔栕栘栙栚栛栜栞栟栠栢栣栤栥栦栧栨栫栬栭栮栯栰栱栴栵栶栺栻栿桇桋桍桏桒桖桗桘桙桚桛�\".split(\"\");\nfor(j = 0; j != D[150].length; ++j) if(D[150][j].charCodeAt(0) !== 0xFFFD) { e[D[150][j]] = 38400 + j; d[38400 + j] = D[150][j];}\nD[151] = \"����������������������������������������������������������������桜桝桞桟桪桬桭桮桯桰桱桲桳桵桸桹桺桻桼桽桾桿梀梂梄梇梈梉梊梋梌梍梎梐梑梒梔梕梖梘梙梚梛梜條梞梟梠梡梣梤梥梩梪梫梬梮梱梲梴梶梷梸�梹梺梻梼梽梾梿棁棃棄棅棆棇棈棊棌棎棏棐棑棓棔棖棗棙棛棜棝棞棟棡棢棤棥棦棧棨棩棪棫棬棭棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆椇椈椉椊椌椏椑椓椔椕椖椗椘椙椚椛検椝椞椡椢椣椥椦椧椨椩椪椫椬椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃楄楅楆楇楈楉楊楋楌楍楎楏楐楑楒楓楕楖楘楙楛楜楟�\".split(\"\");\nfor(j = 0; j != D[151].length; ++j) if(D[151][j].charCodeAt(0) !== 0xFFFD) { e[D[151][j]] = 38656 + j; d[38656 + j] = D[151][j];}\nD[152] = \"����������������������������������������������������������������楡楢楤楥楧楨楩楪楬業楯楰楲楳楴極楶楺楻楽楾楿榁榃榅榊榋榌榎榏榐榑榒榓榖榗榙榚榝榞榟榠榡榢榣榤榥榦榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽�榾榿槀槂槃槄槅槆槇槈槉構槍槏槑槒槓槕槖槗様槙槚槜槝槞槡槢槣槤槥槦槧槨槩槪槫槬槮槯槰槱槳槴槵槶槷槸槹槺槻槼槾樀樁樂樃樄樅樆樇樈樉樋樌樍樎樏樐樑樒樓樔樕樖標樚樛樜樝樞樠樢樣樤樥樦樧権樫樬樭樮樰樲樳樴樶樷樸樹樺樻樼樿橀橁橂橃橅橆橈橉橊橋橌橍橎橏橑橒橓橔橕橖橗橚�\".split(\"\");\nfor(j = 0; j != D[152].length; ++j) if(D[152][j].charCodeAt(0) !== 0xFFFD) { e[D[152][j]] = 38912 + j; d[38912 + j] = D[152][j];}\nD[153] = \"����������������������������������������������������������������橜橝橞機橠橢橣橤橦橧橨橩橪橫橬橭橮橯橰橲橳橴橵橶橷橸橺橻橽橾橿檁檂檃檅檆檇檈檉檊檋檌檍檏檒檓檔檕檖檘檙檚檛檜檝檞檟檡檢檣檤檥檦�檧檨檪檭檮檯檰檱檲檳檴檵檶檷檸檹檺檻檼檽檾檿櫀櫁櫂櫃櫄櫅櫆櫇櫈櫉櫊櫋櫌櫍櫎櫏櫐櫑櫒櫓櫔櫕櫖櫗櫘櫙櫚櫛櫜櫝櫞櫟櫠櫡櫢櫣櫤櫥櫦櫧櫨櫩櫪櫫櫬櫭櫮櫯櫰櫱櫲櫳櫴櫵櫶櫷櫸櫹櫺櫻櫼櫽櫾櫿欀欁欂欃欄欅欆欇欈欉權欋欌欍欎欏欐欑欒欓欔欕欖欗欘欙欚欛欜欝欞欟欥欦欨欩欪欫欬欭欮�\".split(\"\");\nfor(j = 0; j != D[153].length; ++j) if(D[153][j].charCodeAt(0) !== 0xFFFD) { e[D[153][j]] = 39168 + j; d[39168 + j] = D[153][j];}\nD[154] = \"����������������������������������������������������������������欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍歎歏歐歑歒歓歔歕歖歗歘歚歛歜歝歞歟歠歡歨歩歫歬歭歮歯歰歱歲歳歴歵歶歷歸歺歽歾歿殀殅殈�殌殎殏殐殑殔殕殗殘殙殜殝殞殟殠殢殣殤殥殦殧殨殩殫殬殭殮殯殰殱殲殶殸殹殺殻殼殽殾毀毃毄毆毇毈毉毊毌毎毐毑毘毚毜毝毞毟毠毢毣毤毥毦毧毨毩毬毭毮毰毱毲毴毶毷毸毺毻毼毾毿氀氁氂氃氄氈氉氊氋氌氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋汌汍汎汏汑汒汓汖汘�\".split(\"\");\nfor(j = 0; j != D[154].length; ++j) if(D[154][j].charCodeAt(0) !== 0xFFFD) { e[D[154][j]] = 39424 + j; d[39424 + j] = D[154][j];}\nD[155] = \"����������������������������������������������������������������汙汚汢汣汥汦汧汫汬汭汮汯汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘�泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟洠洡洢洣洤洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽浾浿涀涁涃涄涆涇涊涋涍涏涐涒涖涗涘涙涚涜涢涥涬涭涰涱涳涴涶涷涹涺涻涼涽涾淁淂淃淈淉淊�\".split(\"\");\nfor(j = 0; j != D[155].length; ++j) if(D[155][j].charCodeAt(0) !== 0xFFFD) { e[D[155][j]] = 39680 + j; d[39680 + j] = D[155][j];}\nD[156] = \"����������������������������������������������������������������淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽淾淿渀渁渂渃渄渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵�渶渷渹渻渼渽渾渿湀湁湂湅湆湇湈湉湊湋湌湏湐湑湒湕湗湙湚湜湝湞湠湡湢湣湤湥湦湧湨湩湪湬湭湯湰湱湲湳湴湵湶湷湸湹湺湻湼湽満溁溂溄溇溈溊溋溌溍溎溑溒溓溔溕準溗溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪滫滬滭滮滯�\".split(\"\");\nfor(j = 0; j != D[156].length; ++j) if(D[156][j].charCodeAt(0) !== 0xFFFD) { e[D[156][j]] = 39936 + j; d[39936 + j] = D[156][j];}\nD[157] = \"����������������������������������������������������������������滰滱滲滳滵滶滷滸滺滻滼滽滾滿漀漁漃漄漅漇漈漊漋漌漍漎漐漑漒漖漗漘漙漚漛漜漝漞漟漡漢漣漥漦漧漨漬漮漰漲漴漵漷漸漹漺漻漼漽漿潀潁潂�潃潄潅潈潉潊潌潎潏潐潑潒潓潔潕潖潗潙潚潛潝潟潠潡潣潤潥潧潨潩潪潫潬潯潰潱潳潵潶潷潹潻潽潾潿澀澁澂澃澅澆澇澊澋澏澐澑澒澓澔澕澖澗澘澙澚澛澝澞澟澠澢澣澤澥澦澨澩澪澫澬澭澮澯澰澱澲澴澵澷澸澺澻澼澽澾澿濁濃濄濅濆濇濈濊濋濌濍濎濏濐濓濔濕濖濗濘濙濚濛濜濝濟濢濣濤濥�\".split(\"\");\nfor(j = 0; j != D[157].length; ++j) if(D[157][j].charCodeAt(0) !== 0xFFFD) { e[D[157][j]] = 40192 + j; d[40192 + j] = D[157][j];}\nD[158] = \"����������������������������������������������������������������濦濧濨濩濪濫濬濭濰濱濲濳濴濵濶濷濸濹濺濻濼濽濾濿瀀瀁瀂瀃瀄瀅瀆瀇瀈瀉瀊瀋瀌瀍瀎瀏瀐瀒瀓瀔瀕瀖瀗瀘瀙瀜瀝瀞瀟瀠瀡瀢瀤瀥瀦瀧瀨瀩瀪�瀫瀬瀭瀮瀯瀰瀱瀲瀳瀴瀶瀷瀸瀺瀻瀼瀽瀾瀿灀灁灂灃灄灅灆灇灈灉灊灋灍灎灐灑灒灓灔灕灖灗灘灙灚灛灜灝灟灠灡灢灣灤灥灦灧灨灩灪灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞炟炠炡炢炣炤炥炦炧炨炩炪炰炲炴炵炶為炾炿烄烅烆烇烉烋烌烍烎烏烐烑烒烓烔烕烖烗烚�\".split(\"\");\nfor(j = 0; j != D[158].length; ++j) if(D[158][j].charCodeAt(0) !== 0xFFFD) { e[D[158][j]] = 40448 + j; d[40448 + j] = D[158][j];}\nD[159] = \"����������������������������������������������������������������烜烝烞烠烡烢烣烥烪烮烰烱烲烳烴烵烶烸烺烻烼烾烿焀焁焂焃焄焅焆焇焈焋焌焍焎焏焑焒焔焗焛焜焝焞焟焠無焢焣焤焥焧焨焩焪焫焬焭焮焲焳焴�焵焷焸焹焺焻焼焽焾焿煀煁煂煃煄煆煇煈煉煋煍煏煐煑煒煓煔煕煖煗煘煙煚煛煝煟煠煡煢煣煥煩煪煫煬煭煯煰煱煴煵煶煷煹煻煼煾煿熀熁熂熃熅熆熇熈熉熋熌熍熎熐熑熒熓熕熖熗熚熛熜熝熞熡熢熣熤熥熦熧熩熪熫熭熮熯熰熱熲熴熶熷熸熺熻熼熽熾熿燀燁燂燄燅燆燇燈燉燊燋燌燍燏燐燑燒燓�\".split(\"\");\nfor(j = 0; j != D[159].length; ++j) if(D[159][j].charCodeAt(0) !== 0xFFFD) { e[D[159][j]] = 40704 + j; d[40704 + j] = D[159][j];}\nD[160] = \"����������������������������������������������������������������燖燗燘燙燚燛燜燝燞營燡燢燣燤燦燨燩燪燫燬燭燯燰燱燲燳燴燵燶燷燸燺燻燼燽燾燿爀爁爂爃爄爅爇爈爉爊爋爌爍爎爏爐爑爒爓爔爕爖爗爘爙爚�爛爜爞爟爠爡爢爣爤爥爦爧爩爫爭爮爯爲爳爴爺爼爾牀牁牂牃牄牅牆牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅犆犇犈犉犌犎犐犑犓犔犕犖犗犘犙犚犛犜犝犞犠犡犢犣犤犥犦犧犨犩犪犫犮犱犲犳犵犺犻犼犽犾犿狀狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛�\".split(\"\");\nfor(j = 0; j != D[160].length; ++j) if(D[160][j].charCodeAt(0) !== 0xFFFD) { e[D[160][j]] = 40960 + j; d[40960 + j] = D[160][j];}\nD[161] = \"����������������������������������������������������������������������������������������������������������������������������������������������������������������� 、。·ˉˇ¨〃々—~‖…‘’“”〔〕〈〉《》「」『』〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓�\".split(\"\");\nfor(j = 0; j != D[161].length; ++j) if(D[161][j].charCodeAt(0) !== 0xFFFD) { e[D[161][j]] = 41216 + j; d[41216 + j] = D[161][j];}\nD[162] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ������⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩��㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩��ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ���\".split(\"\");\nfor(j = 0; j != D[162].length; ++j) if(D[162][j].charCodeAt(0) !== 0xFFFD) { e[D[162][j]] = 41472 + j; d[41472 + j] = D[162][j];}\nD[163] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������!"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�\".split(\"\");\nfor(j = 0; j != D[163].length; ++j) if(D[163][j].charCodeAt(0) !== 0xFFFD) { e[D[163][j]] = 41728 + j; d[41728 + j] = D[163][j];}\nD[164] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������\".split(\"\");\nfor(j = 0; j != D[164].length; ++j) if(D[164][j].charCodeAt(0) !== 0xFFFD) { e[D[164][j]] = 41984 + j; d[41984 + j] = D[164][j];}\nD[165] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������\".split(\"\");\nfor(j = 0; j != D[165].length; ++j) if(D[165][j].charCodeAt(0) !== 0xFFFD) { e[D[165][j]] = 42240 + j; d[42240 + j] = D[165][j];}\nD[166] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�������︵︶︹︺︿﹀︽︾﹁﹂﹃﹄��︻︼︷︸︱�︳︴����������\".split(\"\");\nfor(j = 0; j != D[166].length; ++j) if(D[166][j].charCodeAt(0) !== 0xFFFD) { e[D[166][j]] = 42496 + j; d[42496 + j] = D[166][j];}\nD[167] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������\".split(\"\");\nfor(j = 0; j != D[167].length; ++j) if(D[167][j].charCodeAt(0) !== 0xFFFD) { e[D[167][j]] = 42752 + j; d[42752 + j] = D[167][j];}\nD[168] = \"����������������������������������������������������������������ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳▁▂▃▄▅▆▇�█▉▊▋▌▍▎▏▓▔▕▼▽◢◣◤◥☉⊕〒〝〞�����������āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑ�ńň�ɡ����ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ����������������������\".split(\"\");\nfor(j = 0; j != D[168].length; ++j) if(D[168][j].charCodeAt(0) !== 0xFFFD) { e[D[168][j]] = 43008 + j; d[43008 + j] = D[168][j];}\nD[169] = \"����������������������������������������������������������������〡〢〣〤〥〦〧〨〩㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰¬¦�℡㈱�‐���ー゛゜ヽヾ〆ゝゞ﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹔﹕﹖﹗﹙﹚﹛﹜﹝﹞﹟﹠﹡�﹢﹣﹤﹥﹦﹨﹩﹪﹫�������������〇�������������─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋����������������\".split(\"\");\nfor(j = 0; j != D[169].length; ++j) if(D[169][j].charCodeAt(0) !== 0xFFFD) { e[D[169][j]] = 43264 + j; d[43264 + j] = D[169][j];}\nD[170] = \"����������������������������������������������������������������狜狝狟狢狣狤狥狦狧狪狫狵狶狹狽狾狿猀猂猄猅猆猇猈猉猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀獁獂獃獄獅獆獇獈�獉獊獋獌獎獏獑獓獔獕獖獘獙獚獛獜獝獞獟獡獢獣獤獥獦獧獨獩獪獫獮獰獱�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[170].length; ++j) if(D[170][j].charCodeAt(0) !== 0xFFFD) { e[D[170][j]] = 43520 + j; d[43520 + j] = D[170][j];}\nD[171] = \"����������������������������������������������������������������獲獳獴獵獶獷獸獹獺獻獼獽獿玀玁玂玃玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣玤玥玦玧玨玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃珄珅珆珇�珋珌珎珒珓珔珕珖珗珘珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳珴珵珶珷�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[171].length; ++j) if(D[171][j].charCodeAt(0) !== 0xFFFD) { e[D[171][j]] = 43776 + j; d[43776 + j] = D[171][j];}\nD[172] = \"����������������������������������������������������������������珸珹珺珻珼珽現珿琀琁琂琄琇琈琋琌琍琎琑琒琓琔琕琖琗琘琙琜琝琞琟琠琡琣琤琧琩琫琭琯琱琲琷琸琹琺琻琽琾琿瑀瑂瑃瑄瑅瑆瑇瑈瑉瑊瑋瑌瑍�瑎瑏瑐瑑瑒瑓瑔瑖瑘瑝瑠瑡瑢瑣瑤瑥瑦瑧瑨瑩瑪瑫瑬瑮瑯瑱瑲瑳瑴瑵瑸瑹瑺�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[172].length; ++j) if(D[172][j].charCodeAt(0) !== 0xFFFD) { e[D[172][j]] = 44032 + j; d[44032 + j] = D[172][j];}\nD[173] = \"����������������������������������������������������������������瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑璒璓璔璕璖璗璘璙璚璛璝璟璠璡璢璣璤璥璦璪璫璬璭璮璯環璱璲璳璴璵璶璷璸璹璻璼璽璾璿瓀瓁瓂瓃瓄瓅瓆瓇�瓈瓉瓊瓋瓌瓍瓎瓏瓐瓑瓓瓔瓕瓖瓗瓘瓙瓚瓛瓝瓟瓡瓥瓧瓨瓩瓪瓫瓬瓭瓰瓱瓲�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[173].length; ++j) if(D[173][j].charCodeAt(0) !== 0xFFFD) { e[D[173][j]] = 44288 + j; d[44288 + j] = D[173][j];}\nD[174] = \"����������������������������������������������������������������瓳瓵瓸瓹瓺瓻瓼瓽瓾甀甁甂甃甅甆甇甈甉甊甋甌甎甐甒甔甕甖甗甛甝甞甠甡產産甤甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘�畝畞畟畠畡畢畣畤畧畨畩畫畬畭畮畯異畱畳畵當畷畺畻畼畽畾疀疁疂疄疅疇�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[174].length; ++j) if(D[174][j].charCodeAt(0) !== 0xFFFD) { e[D[174][j]] = 44544 + j; d[44544 + j] = D[174][j];}\nD[175] = \"����������������������������������������������������������������疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦疧疨疩疪疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇�瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[175].length; ++j) if(D[175][j].charCodeAt(0) !== 0xFFFD) { e[D[175][j]] = 44800 + j; d[44800 + j] = D[175][j];}\nD[176] = \"����������������������������������������������������������������癅癆癇癈癉癊癋癎癏癐癑癒癓癕癗癘癙癚癛癝癟癠癡癢癤癥癦癧癨癩癪癬癭癮癰癱癲癳癴癵癶癷癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛�皜皝皞皟皠皡皢皣皥皦皧皨皩皪皫皬皭皯皰皳皵皶皷皸皹皺皻皼皽皾盀盁盃啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥�\".split(\"\");\nfor(j = 0; j != D[176].length; ++j) if(D[176][j].charCodeAt(0) !== 0xFFFD) { e[D[176][j]] = 45056 + j; d[45056 + j] = D[176][j];}\nD[177] = \"����������������������������������������������������������������盄盇盉盋盌盓盕盙盚盜盝盞盠盡盢監盤盦盧盨盩盪盫盬盭盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎眏眐眑眒眓眔眕眖眗眘眛眜眝眞眡眣眤眥眧眪眫�眬眮眰眱眲眳眴眹眻眽眾眿睂睄睅睆睈睉睊睋睌睍睎睏睒睓睔睕睖睗睘睙睜薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳�\".split(\"\");\nfor(j = 0; j != D[177].length; ++j) if(D[177][j].charCodeAt(0) !== 0xFFFD) { e[D[177][j]] = 45312 + j; d[45312 + j] = D[177][j];}\nD[178] = \"����������������������������������������������������������������睝睞睟睠睤睧睩睪睭睮睯睰睱睲睳睴睵睶睷睸睺睻睼瞁瞂瞃瞆瞇瞈瞉瞊瞋瞏瞐瞓瞔瞕瞖瞗瞘瞙瞚瞛瞜瞝瞞瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶瞷瞸瞹瞺�瞼瞾矀矁矂矃矄矅矆矇矈矉矊矋矌矎矏矐矑矒矓矔矕矖矘矙矚矝矞矟矠矡矤病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖�\".split(\"\");\nfor(j = 0; j != D[178].length; ++j) if(D[178][j].charCodeAt(0) !== 0xFFFD) { e[D[178][j]] = 45568 + j; d[45568 + j] = D[178][j];}\nD[179] = \"����������������������������������������������������������������矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃砄砅砆砇砈砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚�硛硜硞硟硠硡硢硣硤硥硦硧硨硩硯硰硱硲硳硴硵硶硸硹硺硻硽硾硿碀碁碂碃场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚�\".split(\"\");\nfor(j = 0; j != D[179].length; ++j) if(D[179][j].charCodeAt(0) !== 0xFFFD) { e[D[179][j]] = 45824 + j; d[45824 + j] = D[179][j];}\nD[180] = \"����������������������������������������������������������������碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨碩碪碫碬碭碮碯碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚磛磜磝磞磟磠磡磢磣�磤磥磦磧磩磪磫磭磮磯磰磱磳磵磶磸磹磻磼磽磾磿礀礂礃礄礆礇礈礉礊礋礌础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮�\".split(\"\");\nfor(j = 0; j != D[180].length; ++j) if(D[180][j].charCodeAt(0) !== 0xFFFD) { e[D[180][j]] = 46080 + j; d[46080 + j] = D[180][j];}\nD[181] = \"����������������������������������������������������������������礍礎礏礐礑礒礔礕礖礗礘礙礚礛礜礝礟礠礡礢礣礥礦礧礨礩礪礫礬礭礮礯礰礱礲礳礵礶礷礸礹礽礿祂祃祄祅祇祊祋祌祍祎祏祐祑祒祔祕祘祙祡祣�祤祦祩祪祫祬祮祰祱祲祳祴祵祶祹祻祼祽祾祿禂禃禆禇禈禉禋禌禍禎禐禑禒怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠�\".split(\"\");\nfor(j = 0; j != D[181].length; ++j) if(D[181][j].charCodeAt(0) !== 0xFFFD) { e[D[181][j]] = 46336 + j; d[46336 + j] = D[181][j];}\nD[182] = \"����������������������������������������������������������������禓禔禕禖禗禘禙禛禜禝禞禟禠禡禢禣禤禥禦禨禩禪禫禬禭禮禯禰禱禲禴禵禶禷禸禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙秚秛秜秝秞秠秡秢秥秨秪�秬秮秱秲秳秴秵秶秷秹秺秼秾秿稁稄稅稇稈稉稊稌稏稐稑稒稓稕稖稘稙稛稜丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二�\".split(\"\");\nfor(j = 0; j != D[182].length; ++j) if(D[182][j].charCodeAt(0) !== 0xFFFD) { e[D[182][j]] = 46592 + j; d[46592 + j] = D[182][j];}\nD[183] = \"����������������������������������������������������������������稝稟稡稢稤稥稦稧稨稩稪稫稬稭種稯稰稱稲稴稵稶稸稺稾穀穁穂穃穄穅穇穈穉穊穋穌積穎穏穐穒穓穔穕穖穘穙穚穛穜穝穞穟穠穡穢穣穤穥穦穧穨�穩穪穫穬穭穮穯穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服�\".split(\"\");\nfor(j = 0; j != D[183].length; ++j) if(D[183][j].charCodeAt(0) !== 0xFFFD) { e[D[183][j]] = 46848 + j; d[46848 + j] = D[183][j];}\nD[184] = \"����������������������������������������������������������������窣窤窧窩窪窫窮窯窰窱窲窴窵窶窷窸窹窺窻窼窽窾竀竁竂竃竄竅竆竇竈竉竊竌竍竎竏竐竑竒竓竔竕竗竘竚竛竜竝竡竢竤竧竨竩竪竫竬竮竰竱竲竳�竴竵競竷竸竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹�\".split(\"\");\nfor(j = 0; j != D[184].length; ++j) if(D[184][j].charCodeAt(0) !== 0xFFFD) { e[D[184][j]] = 47104 + j; d[47104 + j] = D[184][j];}\nD[185] = \"����������������������������������������������������������������笯笰笲笴笵笶笷笹笻笽笿筀筁筂筃筄筆筈筊筍筎筓筕筗筙筜筞筟筡筣筤筥筦筧筨筩筪筫筬筭筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆箇箈箉箊箋箌箎箏�箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹箺箻箼箽箾箿節篂篃範埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈�\".split(\"\");\nfor(j = 0; j != D[185].length; ++j) if(D[185][j].charCodeAt(0) !== 0xFFFD) { e[D[185][j]] = 47360 + j; d[47360 + j] = D[185][j];}\nD[186] = \"����������������������������������������������������������������篅篈築篊篋篍篎篏篐篒篔篕篖篗篘篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲篳篴篵篶篸篹篺篻篽篿簀簁簂簃簄簅簆簈簉簊簍簎簐簑簒簓簔簕簗簘簙�簚簛簜簝簞簠簡簢簣簤簥簨簩簫簬簭簮簯簰簱簲簳簴簵簶簷簹簺簻簼簽簾籂骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖�\".split(\"\");\nfor(j = 0; j != D[186].length; ++j) if(D[186][j].charCodeAt(0) !== 0xFFFD) { e[D[186][j]] = 47616 + j; d[47616 + j] = D[186][j];}\nD[187] = \"����������������������������������������������������������������籃籄籅籆籇籈籉籊籋籌籎籏籐籑籒籓籔籕籖籗籘籙籚籛籜籝籞籟籠籡籢籣籤籥籦籧籨籩籪籫籬籭籮籯籰籱籲籵籶籷籸籹籺籾籿粀粁粂粃粄粅粆粇�粈粊粋粌粍粎粏粐粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴粵粶粷粸粺粻弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕�\".split(\"\");\nfor(j = 0; j != D[187].length; ++j) if(D[187][j].charCodeAt(0) !== 0xFFFD) { e[D[187][j]] = 47872 + j; d[47872 + j] = D[187][j];}\nD[188] = \"����������������������������������������������������������������粿糀糂糃糄糆糉糋糎糏糐糑糒糓糔糘糚糛糝糞糡糢糣糤糥糦糧糩糪糫糬糭糮糰糱糲糳糴糵糶糷糹糺糼糽糾糿紀紁紂紃約紅紆紇紈紉紋紌納紎紏紐�紑紒紓純紕紖紗紘紙級紛紜紝紞紟紡紣紤紥紦紨紩紪紬紭紮細紱紲紳紴紵紶肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件�\".split(\"\");\nfor(j = 0; j != D[188].length; ++j) if(D[188][j].charCodeAt(0) !== 0xFFFD) { e[D[188][j]] = 48128 + j; d[48128 + j] = D[188][j];}\nD[189] = \"����������������������������������������������������������������紷紸紹紺紻紼紽紾紿絀絁終絃組絅絆絇絈絉絊絋経絍絎絏結絑絒絓絔絕絖絗絘絙絚絛絜絝絞絟絠絡絢絣絤絥給絧絨絩絪絫絬絭絯絰統絲絳絴絵絶�絸絹絺絻絼絽絾絿綀綁綂綃綄綅綆綇綈綉綊綋綌綍綎綏綐綑綒經綔綕綖綗綘健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸�\".split(\"\");\nfor(j = 0; j != D[189].length; ++j) if(D[189][j].charCodeAt(0) !== 0xFFFD) { e[D[189][j]] = 48384 + j; d[48384 + j] = D[189][j];}\nD[190] = \"����������������������������������������������������������������継続綛綜綝綞綟綠綡綢綣綤綥綧綨綩綪綫綬維綯綰綱網綳綴綵綶綷綸綹綺綻綼綽綾綿緀緁緂緃緄緅緆緇緈緉緊緋緌緍緎総緐緑緒緓緔緕緖緗緘緙�線緛緜緝緞緟締緡緢緣緤緥緦緧編緩緪緫緬緭緮緯緰緱緲緳練緵緶緷緸緹緺尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻�\".split(\"\");\nfor(j = 0; j != D[190].length; ++j) if(D[190][j].charCodeAt(0) !== 0xFFFD) { e[D[190][j]] = 48640 + j; d[48640 + j] = D[190][j];}\nD[191] = \"����������������������������������������������������������������緻緼緽緾緿縀縁縂縃縄縅縆縇縈縉縊縋縌縍縎縏縐縑縒縓縔縕縖縗縘縙縚縛縜縝縞縟縠縡縢縣縤縥縦縧縨縩縪縫縬縭縮縯縰縱縲縳縴縵縶縷縸縹�縺縼總績縿繀繂繃繄繅繆繈繉繊繋繌繍繎繏繐繑繒繓織繕繖繗繘繙繚繛繜繝俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀�\".split(\"\");\nfor(j = 0; j != D[191].length; ++j) if(D[191][j].charCodeAt(0) !== 0xFFFD) { e[D[191][j]] = 48896 + j; d[48896 + j] = D[191][j];}\nD[192] = \"����������������������������������������������������������������繞繟繠繡繢繣繤繥繦繧繨繩繪繫繬繭繮繯繰繱繲繳繴繵繶繷繸繹繺繻繼繽繾繿纀纁纃纄纅纆纇纈纉纊纋續纍纎纏纐纑纒纓纔纕纖纗纘纙纚纜纝纞�纮纴纻纼绖绤绬绹缊缐缞缷缹缻缼缽缾缿罀罁罃罆罇罈罉罊罋罌罍罎罏罒罓馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐�\".split(\"\");\nfor(j = 0; j != D[192].length; ++j) if(D[192][j].charCodeAt(0) !== 0xFFFD) { e[D[192][j]] = 49152 + j; d[49152 + j] = D[192][j];}\nD[193] = \"����������������������������������������������������������������罖罙罛罜罝罞罠罣罤罥罦罧罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂羃羄羅羆羇羈羉羋羍羏羐羑羒羓羕羖羗羘羙羛羜羠羢羣羥羦羨義羪羫羬羭羮羱�羳羴羵羶羷羺羻羾翀翂翃翄翆翇翈翉翋翍翏翐翑習翓翖翗翙翚翛翜翝翞翢翣痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿�\".split(\"\");\nfor(j = 0; j != D[193].length; ++j) if(D[193][j].charCodeAt(0) !== 0xFFFD) { e[D[193][j]] = 49408 + j; d[49408 + j] = D[193][j];}\nD[194] = \"����������������������������������������������������������������翤翧翨翪翫翬翭翯翲翴翵翶翷翸翹翺翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫耬耭耮耯耰耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗�聙聛聜聝聞聟聠聡聢聣聤聥聦聧聨聫聬聭聮聯聰聲聳聴聵聶職聸聹聺聻聼聽隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫�\".split(\"\");\nfor(j = 0; j != D[194].length; ++j) if(D[194][j].charCodeAt(0) !== 0xFFFD) { e[D[194][j]] = 49664 + j; d[49664 + j] = D[194][j];}\nD[195] = \"����������������������������������������������������������������聾肁肂肅肈肊肍肎肏肐肑肒肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇胈胉胊胋胏胐胑胒胓胔胕胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋�脌脕脗脙脛脜脝脟脠脡脢脣脤脥脦脧脨脩脪脫脭脮脰脳脴脵脷脹脺脻脼脽脿谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸�\".split(\"\");\nfor(j = 0; j != D[195].length; ++j) if(D[195][j].charCodeAt(0) !== 0xFFFD) { e[D[195][j]] = 49920 + j; d[49920 + j] = D[195][j];}\nD[196] = \"����������������������������������������������������������������腀腁腂腃腄腅腇腉腍腎腏腒腖腗腘腛腜腝腞腟腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃膄膅膆膇膉膋膌膍膎膐膒膓膔膕膖膗膙膚膞膟膠膡膢膤膥�膧膩膫膬膭膮膯膰膱膲膴膵膶膷膸膹膼膽膾膿臄臅臇臈臉臋臍臎臏臐臑臒臓摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁�\".split(\"\");\nfor(j = 0; j != D[196].length; ++j) if(D[196][j].charCodeAt(0) !== 0xFFFD) { e[D[196][j]] = 50176 + j; d[50176 + j] = D[196][j];}\nD[197] = \"����������������������������������������������������������������臔臕臖臗臘臙臚臛臜臝臞臟臠臡臢臤臥臦臨臩臫臮臯臰臱臲臵臶臷臸臹臺臽臿舃與興舉舊舋舎舏舑舓舕舖舗舘舙舚舝舠舤舥舦舧舩舮舲舺舼舽舿�艀艁艂艃艅艆艈艊艌艍艎艐艑艒艓艔艕艖艗艙艛艜艝艞艠艡艢艣艤艥艦艧艩拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗�\".split(\"\");\nfor(j = 0; j != D[197].length; ++j) if(D[197][j].charCodeAt(0) !== 0xFFFD) { e[D[197][j]] = 50432 + j; d[50432 + j] = D[197][j];}\nD[198] = \"����������������������������������������������������������������艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸�苺苼苽苾苿茀茊茋茍茐茒茓茖茘茙茝茞茟茠茡茢茣茤茥茦茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐�\".split(\"\");\nfor(j = 0; j != D[198].length; ++j) if(D[198][j].charCodeAt(0) !== 0xFFFD) { e[D[198][j]] = 50688 + j; d[50688 + j] = D[198][j];}\nD[199] = \"����������������������������������������������������������������茾茿荁荂荄荅荈荊荋荌荍荎荓荕荖荗荘荙荝荢荰荱荲荳荴荵荶荹荺荾荿莀莁莂莃莄莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡莢莣莤莥莦莧莬莭莮�莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠�\".split(\"\");\nfor(j = 0; j != D[199].length; ++j) if(D[199][j].charCodeAt(0) !== 0xFFFD) { e[D[199][j]] = 50944 + j; d[50944 + j] = D[199][j];}\nD[200] = \"����������������������������������������������������������������菮華菳菴菵菶菷菺菻菼菾菿萀萂萅萇萈萉萊萐萒萓萔萕萖萗萙萚萛萞萟萠萡萢萣萩萪萫萬萭萮萯萰萲萳萴萵萶萷萹萺萻萾萿葀葁葂葃葄葅葇葈葉�葊葋葌葍葎葏葐葒葓葔葕葖葘葝葞葟葠葢葤葥葦葧葨葪葮葯葰葲葴葷葹葻葼取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁�\".split(\"\");\nfor(j = 0; j != D[200].length; ++j) if(D[200][j].charCodeAt(0) !== 0xFFFD) { e[D[200][j]] = 51200 + j; d[51200 + j] = D[200][j];}\nD[201] = \"����������������������������������������������������������������葽葾葿蒀蒁蒃蒄蒅蒆蒊蒍蒏蒐蒑蒒蒓蒔蒕蒖蒘蒚蒛蒝蒞蒟蒠蒢蒣蒤蒥蒦蒧蒨蒩蒪蒫蒬蒭蒮蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗�蓘蓙蓚蓛蓜蓞蓡蓢蓤蓧蓨蓩蓪蓫蓭蓮蓯蓱蓲蓳蓴蓵蓶蓷蓸蓹蓺蓻蓽蓾蔀蔁蔂伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳�\".split(\"\");\nfor(j = 0; j != D[201].length; ++j) if(D[201][j].charCodeAt(0) !== 0xFFFD) { e[D[201][j]] = 51456 + j; d[51456 + j] = D[201][j];}\nD[202] = \"����������������������������������������������������������������蔃蔄蔅蔆蔇蔈蔉蔊蔋蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢蔣蔤蔥蔦蔧蔨蔩蔪蔭蔮蔯蔰蔱蔲蔳蔴蔵蔶蔾蔿蕀蕁蕂蕄蕅蕆蕇蕋蕌蕍蕎蕏蕐蕑蕒蕓蕔蕕�蕗蕘蕚蕛蕜蕝蕟蕠蕡蕢蕣蕥蕦蕧蕩蕪蕫蕬蕭蕮蕯蕰蕱蕳蕵蕶蕷蕸蕼蕽蕿薀薁省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱�\".split(\"\");\nfor(j = 0; j != D[202].length; ++j) if(D[202][j].charCodeAt(0) !== 0xFFFD) { e[D[202][j]] = 51712 + j; d[51712 + j] = D[202][j];}\nD[203] = \"����������������������������������������������������������������薂薃薆薈薉薊薋薌薍薎薐薑薒薓薔薕薖薗薘薙薚薝薞薟薠薡薢薣薥薦薧薩薫薬薭薱薲薳薴薵薶薸薺薻薼薽薾薿藀藂藃藄藅藆藇藈藊藋藌藍藎藑藒�藔藖藗藘藙藚藛藝藞藟藠藡藢藣藥藦藧藨藪藫藬藭藮藯藰藱藲藳藴藵藶藷藸恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔�\".split(\"\");\nfor(j = 0; j != D[203].length; ++j) if(D[203][j].charCodeAt(0) !== 0xFFFD) { e[D[203][j]] = 51968 + j; d[51968 + j] = D[203][j];}\nD[204] = \"����������������������������������������������������������������藹藺藼藽藾蘀蘁蘂蘃蘄蘆蘇蘈蘉蘊蘋蘌蘍蘎蘏蘐蘒蘓蘔蘕蘗蘘蘙蘚蘛蘜蘝蘞蘟蘠蘡蘢蘣蘤蘥蘦蘨蘪蘫蘬蘭蘮蘯蘰蘱蘲蘳蘴蘵蘶蘷蘹蘺蘻蘽蘾蘿虀�虁虂虃虄虅虆虇虈虉虊虋虌虒虓處虖虗虘虙虛虜虝號虠虡虣虤虥虦虧虨虩虪獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃�\".split(\"\");\nfor(j = 0; j != D[204].length; ++j) if(D[204][j].charCodeAt(0) !== 0xFFFD) { e[D[204][j]] = 52224 + j; d[52224 + j] = D[204][j];}\nD[205] = \"����������������������������������������������������������������虭虯虰虲虳虴虵虶虷虸蚃蚄蚅蚆蚇蚈蚉蚎蚏蚐蚑蚒蚔蚖蚗蚘蚙蚚蚛蚞蚟蚠蚡蚢蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻蚼蚽蚾蚿蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜�蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威�\".split(\"\");\nfor(j = 0; j != D[205].length; ++j) if(D[205][j].charCodeAt(0) !== 0xFFFD) { e[D[205][j]] = 52480 + j; d[52480 + j] = D[205][j];}\nD[206] = \"����������������������������������������������������������������蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀蝁蝂蝃蝄蝅蝆蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚蝛蝜蝝蝞蝟蝡蝢蝦蝧蝨蝩蝪蝫蝬蝭蝯蝱蝲蝳蝵�蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎螏螐螑螒螔螕螖螘螙螚螛螜螝螞螠螡螢螣螤巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺�\".split(\"\");\nfor(j = 0; j != D[206].length; ++j) if(D[206][j].charCodeAt(0) !== 0xFFFD) { e[D[206][j]] = 52736 + j; d[52736 + j] = D[206][j];}\nD[207] = \"����������������������������������������������������������������螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁蟂蟃蟄蟅蟇蟈蟉蟌蟍蟎蟏蟐蟔蟕蟖蟗蟘蟙蟚蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯蟰蟱蟲蟳蟴蟵蟶蟷蟸�蟺蟻蟼蟽蟿蠀蠁蠂蠄蠅蠆蠇蠈蠉蠋蠌蠍蠎蠏蠐蠑蠒蠔蠗蠘蠙蠚蠜蠝蠞蠟蠠蠣稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓�\".split(\"\");\nfor(j = 0; j != D[207].length; ++j) if(D[207][j].charCodeAt(0) !== 0xFFFD) { e[D[207][j]] = 52992 + j; d[52992 + j] = D[207][j];}\nD[208] = \"����������������������������������������������������������������蠤蠥蠦蠧蠨蠩蠪蠫蠬蠭蠮蠯蠰蠱蠳蠴蠵蠶蠷蠸蠺蠻蠽蠾蠿衁衂衃衆衇衈衉衊衋衎衏衐衑衒術衕衖衘衚衛衜衝衞衟衠衦衧衪衭衯衱衳衴衵衶衸衹衺�衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗袘袙袚袛袝袞袟袠袡袣袥袦袧袨袩袪小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄�\".split(\"\");\nfor(j = 0; j != D[208].length; ++j) if(D[208][j].charCodeAt(0) !== 0xFFFD) { e[D[208][j]] = 53248 + j; d[53248 + j] = D[208][j];}\nD[209] = \"����������������������������������������������������������������袬袮袯袰袲袳袴袵袶袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚裛補裝裞裠裡裦裧裩裪裫裬裭裮裯裲裵裶裷裺裻製裿褀褁褃褄褅褆複褈�褉褋褌褍褎褏褑褔褕褖褗褘褜褝褞褟褠褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶�\".split(\"\");\nfor(j = 0; j != D[209].length; ++j) if(D[209][j].charCodeAt(0) !== 0xFFFD) { e[D[209][j]] = 53504 + j; d[53504 + j] = D[209][j];}\nD[210] = \"����������������������������������������������������������������褸褹褺褻褼褽褾褿襀襂襃襅襆襇襈襉襊襋襌襍襎襏襐襑襒襓襔襕襖襗襘襙襚襛襜襝襠襡襢襣襤襥襧襨襩襪襫襬襭襮襯襰襱襲襳襴襵襶襷襸襹襺襼�襽襾覀覂覄覅覇覈覉覊見覌覍覎規覐覑覒覓覔覕視覗覘覙覚覛覜覝覞覟覠覡摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐�\".split(\"\");\nfor(j = 0; j != D[210].length; ++j) if(D[210][j].charCodeAt(0) !== 0xFFFD) { e[D[210][j]] = 53760 + j; d[53760 + j] = D[210][j];}\nD[211] = \"����������������������������������������������������������������覢覣覤覥覦覧覨覩親覫覬覭覮覯覰覱覲観覴覵覶覷覸覹覺覻覼覽覾覿觀觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴觵觶觷觸觹觺�觻觼觽觾觿訁訂訃訄訅訆計訉訊訋訌訍討訏訐訑訒訓訔訕訖託記訙訚訛訜訝印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉�\".split(\"\");\nfor(j = 0; j != D[211].length; ++j) if(D[211][j].charCodeAt(0) !== 0xFFFD) { e[D[211][j]] = 54016 + j; d[54016 + j] = D[211][j];}\nD[212] = \"����������������������������������������������������������������訞訟訠訡訢訣訤訥訦訧訨訩訪訫訬設訮訯訰許訲訳訴訵訶訷訸訹診註証訽訿詀詁詂詃詄詅詆詇詉詊詋詌詍詎詏詐詑詒詓詔評詖詗詘詙詚詛詜詝詞�詟詠詡詢詣詤詥試詧詨詩詪詫詬詭詮詯詰話該詳詴詵詶詷詸詺詻詼詽詾詿誀浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧�\".split(\"\");\nfor(j = 0; j != D[212].length; ++j) if(D[212][j].charCodeAt(0) !== 0xFFFD) { e[D[212][j]] = 54272 + j; d[54272 + j] = D[212][j];}\nD[213] = \"����������������������������������������������������������������誁誂誃誄誅誆誇誈誋誌認誎誏誐誑誒誔誕誖誗誘誙誚誛誜誝語誟誠誡誢誣誤誥誦誧誨誩說誫説読誮誯誰誱課誳誴誵誶誷誸誹誺誻誼誽誾調諀諁諂�諃諄諅諆談諈諉諊請諌諍諎諏諐諑諒諓諔諕論諗諘諙諚諛諜諝諞諟諠諡諢諣铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政�\".split(\"\");\nfor(j = 0; j != D[213].length; ++j) if(D[213][j].charCodeAt(0) !== 0xFFFD) { e[D[213][j]] = 54528 + j; d[54528 + j] = D[213][j];}\nD[214] = \"����������������������������������������������������������������諤諥諦諧諨諩諪諫諬諭諮諯諰諱諲諳諴諵諶諷諸諹諺諻諼諽諾諿謀謁謂謃謄謅謆謈謉謊謋謌謍謎謏謐謑謒謓謔謕謖謗謘謙謚講謜謝謞謟謠謡謢謣�謤謥謧謨謩謪謫謬謭謮謯謰謱謲謳謴謵謶謷謸謹謺謻謼謽謾謿譀譁譂譃譄譅帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑�\".split(\"\");\nfor(j = 0; j != D[214].length; ++j) if(D[214][j].charCodeAt(0) !== 0xFFFD) { e[D[214][j]] = 54784 + j; d[54784 + j] = D[214][j];}\nD[215] = \"����������������������������������������������������������������譆譇譈證譊譋譌譍譎譏譐譑譒譓譔譕譖譗識譙譚譛譜譝譞譟譠譡譢譣譤譥譧譨譩譪譫譭譮譯議譱譲譳譴譵譶護譸譹譺譻譼譽譾譿讀讁讂讃讄讅讆�讇讈讉變讋讌讍讎讏讐讑讒讓讔讕讖讗讘讙讚讛讜讝讞讟讬讱讻诇诐诪谉谞住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座������\".split(\"\");\nfor(j = 0; j != D[215].length; ++j) if(D[215][j].charCodeAt(0) !== 0xFFFD) { e[D[215][j]] = 55040 + j; d[55040 + j] = D[215][j];}\nD[216] = \"����������������������������������������������������������������谸谹谺谻谼谽谾谿豀豂豃豄豅豈豊豋豍豎豏豐豑豒豓豔豖豗豘豙豛豜豝豞豟豠豣豤豥豦豧豨豩豬豭豮豯豰豱豲豴豵豶豷豻豼豽豾豿貀貁貃貄貆貇�貈貋貍貎貏貐貑貒貓貕貖貗貙貚貛貜貝貞貟負財貢貣貤貥貦貧貨販貪貫責貭亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝�\".split(\"\");\nfor(j = 0; j != D[216].length; ++j) if(D[216][j].charCodeAt(0) !== 0xFFFD) { e[D[216][j]] = 55296 + j; d[55296 + j] = D[216][j];}\nD[217] = \"����������������������������������������������������������������貮貯貰貱貲貳貴貵貶買貸貹貺費貼貽貾貿賀賁賂賃賄賅賆資賈賉賊賋賌賍賎賏賐賑賒賓賔賕賖賗賘賙賚賛賜賝賞賟賠賡賢賣賤賥賦賧賨賩質賫賬�賭賮賯賰賱賲賳賴賵賶賷賸賹賺賻購賽賾賿贀贁贂贃贄贅贆贇贈贉贊贋贌贍佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼�\".split(\"\");\nfor(j = 0; j != D[217].length; ++j) if(D[217][j].charCodeAt(0) !== 0xFFFD) { e[D[217][j]] = 55552 + j; d[55552 + j] = D[217][j];}\nD[218] = \"����������������������������������������������������������������贎贏贐贑贒贓贔贕贖贗贘贙贚贛贜贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸赹赺赻赼赽赾赿趀趂趃趆趇趈趉趌趍趎趏趐趒趓趕趖趗趘趙趚趛趜趝趞趠趡�趢趤趥趦趧趨趩趪趫趬趭趮趯趰趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺�\".split(\"\");\nfor(j = 0; j != D[218].length; ++j) if(D[218][j].charCodeAt(0) !== 0xFFFD) { e[D[218][j]] = 55808 + j; d[55808 + j] = D[218][j];}\nD[219] = \"����������������������������������������������������������������跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾跿踀踁踂踃踄踆踇踈踋踍踎踐踑踒踓踕踖踗踘踙踚踛踜踠踡踤踥踦踧踨踫踭踰踲踳踴踶踷踸踻踼踾�踿蹃蹅蹆蹌蹍蹎蹏蹐蹓蹔蹕蹖蹗蹘蹚蹛蹜蹝蹞蹟蹠蹡蹢蹣蹤蹥蹧蹨蹪蹫蹮蹱邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝�\".split(\"\");\nfor(j = 0; j != D[219].length; ++j) if(D[219][j].charCodeAt(0) !== 0xFFFD) { e[D[219][j]] = 56064 + j; d[56064 + j] = D[219][j];}\nD[220] = \"����������������������������������������������������������������蹳蹵蹷蹸蹹蹺蹻蹽蹾躀躂躃躄躆躈躉躊躋躌躍躎躑躒躓躕躖躗躘躙躚躛躝躟躠躡躢躣躤躥躦躧躨躩躪躭躮躰躱躳躴躵躶躷躸躹躻躼躽躾躿軀軁軂�軃軄軅軆軇軈軉車軋軌軍軏軐軑軒軓軔軕軖軗軘軙軚軛軜軝軞軟軠軡転軣軤堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥�\".split(\"\");\nfor(j = 0; j != D[220].length; ++j) if(D[220][j].charCodeAt(0) !== 0xFFFD) { e[D[220][j]] = 56320 + j; d[56320 + j] = D[220][j];}\nD[221] = \"����������������������������������������������������������������軥軦軧軨軩軪軫軬軭軮軯軰軱軲軳軴軵軶軷軸軹軺軻軼軽軾軿輀輁輂較輄輅輆輇輈載輊輋輌輍輎輏輐輑輒輓輔輕輖輗輘輙輚輛輜輝輞輟輠輡輢輣�輤輥輦輧輨輩輪輫輬輭輮輯輰輱輲輳輴輵輶輷輸輹輺輻輼輽輾輿轀轁轂轃轄荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺�\".split(\"\");\nfor(j = 0; j != D[221].length; ++j) if(D[221][j].charCodeAt(0) !== 0xFFFD) { e[D[221][j]] = 56576 + j; d[56576 + j] = D[221][j];}\nD[222] = \"����������������������������������������������������������������轅轆轇轈轉轊轋轌轍轎轏轐轑轒轓轔轕轖轗轘轙轚轛轜轝轞轟轠轡轢轣轤轥轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆�迉迊迋迌迍迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖�\".split(\"\");\nfor(j = 0; j != D[222].length; ++j) if(D[222][j].charCodeAt(0) !== 0xFFFD) { e[D[222][j]] = 56832 + j; d[56832 + j] = D[222][j];}\nD[223] = \"����������������������������������������������������������������這逜連逤逥逧逨逩逪逫逬逰週進逳逴逷逹逺逽逿遀遃遅遆遈遉遊運遌過達違遖遙遚遜遝遞遟遠遡遤遦遧適遪遫遬遯遰遱遲遳遶遷選遹遺遻遼遾邁�還邅邆邇邉邊邌邍邎邏邐邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼�\".split(\"\");\nfor(j = 0; j != D[223].length; ++j) if(D[223][j].charCodeAt(0) !== 0xFFFD) { e[D[223][j]] = 57088 + j; d[57088 + j] = D[223][j];}\nD[224] = \"����������������������������������������������������������������郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅鄆鄇鄈鄉鄊鄋鄌鄍鄎鄏鄐鄑鄒鄓鄔鄕鄖鄗鄘鄚鄛鄜�鄝鄟鄠鄡鄤鄥鄦鄧鄨鄩鄪鄫鄬鄭鄮鄰鄲鄳鄴鄵鄶鄷鄸鄺鄻鄼鄽鄾鄿酀酁酂酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼�\".split(\"\");\nfor(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}\nD[225] = \"����������������������������������������������������������������酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀醁醂醃醄醆醈醊醎醏醓醔醕醖醗醘醙醜醝醞醟醠醡醤醥醦醧醨醩醫醬醰醱醲醳醶醷醸醹醻�醼醽醾醿釀釁釂釃釄釅釆釈釋釐釒釓釔釕釖釗釘釙釚釛針釞釟釠釡釢釣釤釥帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺�\".split(\"\");\nfor(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}\nD[226] = \"����������������������������������������������������������������釦釧釨釩釪釫釬釭釮釯釰釱釲釳釴釵釶釷釸釹釺釻釼釽釾釿鈀鈁鈂鈃鈄鈅鈆鈇鈈鈉鈊鈋鈌鈍鈎鈏鈐鈑鈒鈓鈔鈕鈖鈗鈘鈙鈚鈛鈜鈝鈞鈟鈠鈡鈢鈣鈤�鈥鈦鈧鈨鈩鈪鈫鈬鈭鈮鈯鈰鈱鈲鈳鈴鈵鈶鈷鈸鈹鈺鈻鈼鈽鈾鈿鉀鉁鉂鉃鉄鉅狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂�\".split(\"\");\nfor(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}\nD[227] = \"����������������������������������������������������������������鉆鉇鉈鉉鉊鉋鉌鉍鉎鉏鉐鉑鉒鉓鉔鉕鉖鉗鉘鉙鉚鉛鉜鉝鉞鉟鉠鉡鉢鉣鉤鉥鉦鉧鉨鉩鉪鉫鉬鉭鉮鉯鉰鉱鉲鉳鉵鉶鉷鉸鉹鉺鉻鉼鉽鉾鉿銀銁銂銃銄銅�銆銇銈銉銊銋銌銍銏銐銑銒銓銔銕銖銗銘銙銚銛銜銝銞銟銠銡銢銣銤銥銦銧恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾�\".split(\"\");\nfor(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}\nD[228] = \"����������������������������������������������������������������銨銩銪銫銬銭銯銰銱銲銳銴銵銶銷銸銹銺銻銼銽銾銿鋀鋁鋂鋃鋄鋅鋆鋇鋉鋊鋋鋌鋍鋎鋏鋐鋑鋒鋓鋔鋕鋖鋗鋘鋙鋚鋛鋜鋝鋞鋟鋠鋡鋢鋣鋤鋥鋦鋧鋨�鋩鋪鋫鋬鋭鋮鋯鋰鋱鋲鋳鋴鋵鋶鋷鋸鋹鋺鋻鋼鋽鋾鋿錀錁錂錃錄錅錆錇錈錉洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑�\".split(\"\");\nfor(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}\nD[229] = \"����������������������������������������������������������������錊錋錌錍錎錏錐錑錒錓錔錕錖錗錘錙錚錛錜錝錞錟錠錡錢錣錤錥錦錧錨錩錪錫錬錭錮錯錰錱録錳錴錵錶錷錸錹錺錻錼錽錿鍀鍁鍂鍃鍄鍅鍆鍇鍈鍉�鍊鍋鍌鍍鍎鍏鍐鍑鍒鍓鍔鍕鍖鍗鍘鍙鍚鍛鍜鍝鍞鍟鍠鍡鍢鍣鍤鍥鍦鍧鍨鍩鍫濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣�\".split(\"\");\nfor(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}\nD[230] = \"����������������������������������������������������������������鍬鍭鍮鍯鍰鍱鍲鍳鍴鍵鍶鍷鍸鍹鍺鍻鍼鍽鍾鍿鎀鎁鎂鎃鎄鎅鎆鎇鎈鎉鎊鎋鎌鎍鎎鎐鎑鎒鎓鎔鎕鎖鎗鎘鎙鎚鎛鎜鎝鎞鎟鎠鎡鎢鎣鎤鎥鎦鎧鎨鎩鎪鎫�鎬鎭鎮鎯鎰鎱鎲鎳鎴鎵鎶鎷鎸鎹鎺鎻鎼鎽鎾鎿鏀鏁鏂鏃鏄鏅鏆鏇鏈鏉鏋鏌鏍妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩�\".split(\"\");\nfor(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}\nD[231] = \"����������������������������������������������������������������鏎鏏鏐鏑鏒鏓鏔鏕鏗鏘鏙鏚鏛鏜鏝鏞鏟鏠鏡鏢鏣鏤鏥鏦鏧鏨鏩鏪鏫鏬鏭鏮鏯鏰鏱鏲鏳鏴鏵鏶鏷鏸鏹鏺鏻鏼鏽鏾鏿鐀鐁鐂鐃鐄鐅鐆鐇鐈鐉鐊鐋鐌鐍�鐎鐏鐐鐑鐒鐓鐔鐕鐖鐗鐘鐙鐚鐛鐜鐝鐞鐟鐠鐡鐢鐣鐤鐥鐦鐧鐨鐩鐪鐫鐬鐭鐮纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬�\".split(\"\");\nfor(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}\nD[232] = \"����������������������������������������������������������������鐯鐰鐱鐲鐳鐴鐵鐶鐷鐸鐹鐺鐻鐼鐽鐿鑀鑁鑂鑃鑄鑅鑆鑇鑈鑉鑊鑋鑌鑍鑎鑏鑐鑑鑒鑓鑔鑕鑖鑗鑘鑙鑚鑛鑜鑝鑞鑟鑠鑡鑢鑣鑤鑥鑦鑧鑨鑩鑪鑬鑭鑮鑯�鑰鑱鑲鑳鑴鑵鑶鑷鑸鑹鑺鑻鑼鑽鑾鑿钀钁钂钃钄钑钖钘铇铏铓铔铚铦铻锜锠琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹�\".split(\"\");\nfor(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}\nD[233] = \"����������������������������������������������������������������锧锳锽镃镈镋镕镚镠镮镴镵長镸镹镺镻镼镽镾門閁閂閃閄閅閆閇閈閉閊開閌閍閎閏閐閑閒間閔閕閖閗閘閙閚閛閜閝閞閟閠閡関閣閤閥閦閧閨閩閪�閫閬閭閮閯閰閱閲閳閴閵閶閷閸閹閺閻閼閽閾閿闀闁闂闃闄闅闆闇闈闉闊闋椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋�\".split(\"\");\nfor(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}\nD[234] = \"����������������������������������������������������������������闌闍闎闏闐闑闒闓闔闕闖闗闘闙闚闛關闝闞闟闠闡闢闣闤闥闦闧闬闿阇阓阘阛阞阠阣阤阥阦阧阨阩阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗�陘陙陚陜陝陞陠陣陥陦陫陭陮陯陰陱陳陸陹険陻陼陽陾陿隀隁隂隃隄隇隉隊辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰�\".split(\"\");\nfor(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}\nD[235] = \"����������������������������������������������������������������隌階隑隒隓隕隖隚際隝隞隟隠隡隢隣隤隥隦隨隩險隫隬隭隮隯隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖雗雘雙雚雛雜雝雞雟雡離難雤雥雦雧雫�雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗霘霙霚霛霝霟霠搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻�\".split(\"\");\nfor(j = 0; j != D[235].length; ++j) if(D[235][j].charCodeAt(0) !== 0xFFFD) { e[D[235][j]] = 60160 + j; d[60160 + j] = D[235][j];}\nD[236] = \"����������������������������������������������������������������霡霢霣霤霥霦霧霨霩霫霬霮霯霱霳霴霵霶霷霺霻霼霽霿靀靁靂靃靄靅靆靇靈靉靊靋靌靍靎靏靐靑靔靕靗靘靚靜靝靟靣靤靦靧靨靪靫靬靭靮靯靰靱�靲靵靷靸靹靺靻靽靾靿鞀鞁鞂鞃鞄鞆鞇鞈鞉鞊鞌鞎鞏鞐鞓鞕鞖鞗鞙鞚鞛鞜鞝臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐�\".split(\"\");\nfor(j = 0; j != D[236].length; ++j) if(D[236][j].charCodeAt(0) !== 0xFFFD) { e[D[236][j]] = 60416 + j; d[60416 + j] = D[236][j];}\nD[237] = \"����������������������������������������������������������������鞞鞟鞡鞢鞤鞥鞦鞧鞨鞩鞪鞬鞮鞰鞱鞳鞵鞶鞷鞸鞹鞺鞻鞼鞽鞾鞿韀韁韂韃韄韅韆韇韈韉韊韋韌韍韎韏韐韑韒韓韔韕韖韗韘韙韚韛韜韝韞韟韠韡韢韣�韤韥韨韮韯韰韱韲韴韷韸韹韺韻韼韽韾響頀頁頂頃頄項順頇須頉頊頋頌頍頎怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨�\".split(\"\");\nfor(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}\nD[238] = \"����������������������������������������������������������������頏預頑頒頓頔頕頖頗領頙頚頛頜頝頞頟頠頡頢頣頤頥頦頧頨頩頪頫頬頭頮頯頰頱頲頳頴頵頶頷頸頹頺頻頼頽頾頿顀顁顂顃顄顅顆顇顈顉顊顋題額�顎顏顐顑顒顓顔顕顖顗願顙顚顛顜顝類顟顠顡顢顣顤顥顦顧顨顩顪顫顬顭顮睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪�\".split(\"\");\nfor(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}\nD[239] = \"����������������������������������������������������������������顯顰顱顲顳顴颋颎颒颕颙颣風颩颪颫颬颭颮颯颰颱颲颳颴颵颶颷颸颹颺颻颼颽颾颿飀飁飂飃飄飅飆飇飈飉飊飋飌飍飏飐飔飖飗飛飜飝飠飡飢飣飤�飥飦飩飪飫飬飭飮飯飰飱飲飳飴飵飶飷飸飹飺飻飼飽飾飿餀餁餂餃餄餅餆餇铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔�\".split(\"\");\nfor(j = 0; j != D[239].length; ++j) if(D[239][j].charCodeAt(0) !== 0xFFFD) { e[D[239][j]] = 61184 + j; d[61184 + j] = D[239][j];}\nD[240] = \"����������������������������������������������������������������餈餉養餋餌餎餏餑餒餓餔餕餖餗餘餙餚餛餜餝餞餟餠餡餢餣餤餥餦餧館餩餪餫餬餭餯餰餱餲餳餴餵餶餷餸餹餺餻餼餽餾餿饀饁饂饃饄饅饆饇饈饉�饊饋饌饍饎饏饐饑饒饓饖饗饘饙饚饛饜饝饞饟饠饡饢饤饦饳饸饹饻饾馂馃馉稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙�\".split(\"\");\nfor(j = 0; j != D[240].length; ++j) if(D[240][j].charCodeAt(0) !== 0xFFFD) { e[D[240][j]] = 61440 + j; d[61440 + j] = D[240][j];}\nD[241] = \"����������������������������������������������������������������馌馎馚馛馜馝馞馟馠馡馢馣馤馦馧馩馪馫馬馭馮馯馰馱馲馳馴馵馶馷馸馹馺馻馼馽馾馿駀駁駂駃駄駅駆駇駈駉駊駋駌駍駎駏駐駑駒駓駔駕駖駗駘�駙駚駛駜駝駞駟駠駡駢駣駤駥駦駧駨駩駪駫駬駭駮駯駰駱駲駳駴駵駶駷駸駹瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃�\".split(\"\");\nfor(j = 0; j != D[241].length; ++j) if(D[241][j].charCodeAt(0) !== 0xFFFD) { e[D[241][j]] = 61696 + j; d[61696 + j] = D[241][j];}\nD[242] = \"����������������������������������������������������������������駺駻駼駽駾駿騀騁騂騃騄騅騆騇騈騉騊騋騌騍騎騏騐騑騒験騔騕騖騗騘騙騚騛騜騝騞騟騠騡騢騣騤騥騦騧騨騩騪騫騬騭騮騯騰騱騲騳騴騵騶騷騸�騹騺騻騼騽騾騿驀驁驂驃驄驅驆驇驈驉驊驋驌驍驎驏驐驑驒驓驔驕驖驗驘驙颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒�\".split(\"\");\nfor(j = 0; j != D[242].length; ++j) if(D[242][j].charCodeAt(0) !== 0xFFFD) { e[D[242][j]] = 61952 + j; d[61952 + j] = D[242][j];}\nD[243] = \"����������������������������������������������������������������驚驛驜驝驞驟驠驡驢驣驤驥驦驧驨驩驪驫驲骃骉骍骎骔骕骙骦骩骪骫骬骭骮骯骲骳骴骵骹骻骽骾骿髃髄髆髇髈髉髊髍髎髏髐髒體髕髖髗髙髚髛髜�髝髞髠髢髣髤髥髧髨髩髪髬髮髰髱髲髳髴髵髶髷髸髺髼髽髾髿鬀鬁鬂鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋�\".split(\"\");\nfor(j = 0; j != D[243].length; ++j) if(D[243][j].charCodeAt(0) !== 0xFFFD) { e[D[243][j]] = 62208 + j; d[62208 + j] = D[243][j];}\nD[244] = \"����������������������������������������������������������������鬇鬉鬊鬋鬌鬍鬎鬐鬑鬒鬔鬕鬖鬗鬘鬙鬚鬛鬜鬝鬞鬠鬡鬢鬤鬥鬦鬧鬨鬩鬪鬫鬬鬭鬮鬰鬱鬳鬴鬵鬶鬷鬸鬹鬺鬽鬾鬿魀魆魊魋魌魎魐魒魓魕魖魗魘魙魚�魛魜魝魞魟魠魡魢魣魤魥魦魧魨魩魪魫魬魭魮魯魰魱魲魳魴魵魶魷魸魹魺魻簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤�\".split(\"\");\nfor(j = 0; j != D[244].length; ++j) if(D[244][j].charCodeAt(0) !== 0xFFFD) { e[D[244][j]] = 62464 + j; d[62464 + j] = D[244][j];}\nD[245] = \"����������������������������������������������������������������魼魽魾魿鮀鮁鮂鮃鮄鮅鮆鮇鮈鮉鮊鮋鮌鮍鮎鮏鮐鮑鮒鮓鮔鮕鮖鮗鮘鮙鮚鮛鮜鮝鮞鮟鮠鮡鮢鮣鮤鮥鮦鮧鮨鮩鮪鮫鮬鮭鮮鮯鮰鮱鮲鮳鮴鮵鮶鮷鮸鮹鮺�鮻鮼鮽鮾鮿鯀鯁鯂鯃鯄鯅鯆鯇鯈鯉鯊鯋鯌鯍鯎鯏鯐鯑鯒鯓鯔鯕鯖鯗鯘鯙鯚鯛酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜�\".split(\"\");\nfor(j = 0; j != D[245].length; ++j) if(D[245][j].charCodeAt(0) !== 0xFFFD) { e[D[245][j]] = 62720 + j; d[62720 + j] = D[245][j];}\nD[246] = \"����������������������������������������������������������������鯜鯝鯞鯟鯠鯡鯢鯣鯤鯥鯦鯧鯨鯩鯪鯫鯬鯭鯮鯯鯰鯱鯲鯳鯴鯵鯶鯷鯸鯹鯺鯻鯼鯽鯾鯿鰀鰁鰂鰃鰄鰅鰆鰇鰈鰉鰊鰋鰌鰍鰎鰏鰐鰑鰒鰓鰔鰕鰖鰗鰘鰙鰚�鰛鰜鰝鰞鰟鰠鰡鰢鰣鰤鰥鰦鰧鰨鰩鰪鰫鰬鰭鰮鰯鰰鰱鰲鰳鰴鰵鰶鰷鰸鰹鰺鰻觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋�\".split(\"\");\nfor(j = 0; j != D[246].length; ++j) if(D[246][j].charCodeAt(0) !== 0xFFFD) { e[D[246][j]] = 62976 + j; d[62976 + j] = D[246][j];}\nD[247] = \"����������������������������������������������������������������鰼鰽鰾鰿鱀鱁鱂鱃鱄鱅鱆鱇鱈鱉鱊鱋鱌鱍鱎鱏鱐鱑鱒鱓鱔鱕鱖鱗鱘鱙鱚鱛鱜鱝鱞鱟鱠鱡鱢鱣鱤鱥鱦鱧鱨鱩鱪鱫鱬鱭鱮鱯鱰鱱鱲鱳鱴鱵鱶鱷鱸鱹鱺�鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾鲿鳀鳁鳂鳈鳉鳑鳒鳚鳛鳠鳡鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄�\".split(\"\");\nfor(j = 0; j != D[247].length; ++j) if(D[247][j].charCodeAt(0) !== 0xFFFD) { e[D[247][j]] = 63232 + j; d[63232 + j] = D[247][j];}\nD[248] = \"����������������������������������������������������������������鳣鳤鳥鳦鳧鳨鳩鳪鳫鳬鳭鳮鳯鳰鳱鳲鳳鳴鳵鳶鳷鳸鳹鳺鳻鳼鳽鳾鳿鴀鴁鴂鴃鴄鴅鴆鴇鴈鴉鴊鴋鴌鴍鴎鴏鴐鴑鴒鴓鴔鴕鴖鴗鴘鴙鴚鴛鴜鴝鴞鴟鴠鴡�鴢鴣鴤鴥鴦鴧鴨鴩鴪鴫鴬鴭鴮鴯鴰鴱鴲鴳鴴鴵鴶鴷鴸鴹鴺鴻鴼鴽鴾鴿鵀鵁鵂�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[248].length; ++j) if(D[248][j].charCodeAt(0) !== 0xFFFD) { e[D[248][j]] = 63488 + j; d[63488 + j] = D[248][j];}\nD[249] = \"����������������������������������������������������������������鵃鵄鵅鵆鵇鵈鵉鵊鵋鵌鵍鵎鵏鵐鵑鵒鵓鵔鵕鵖鵗鵘鵙鵚鵛鵜鵝鵞鵟鵠鵡鵢鵣鵤鵥鵦鵧鵨鵩鵪鵫鵬鵭鵮鵯鵰鵱鵲鵳鵴鵵鵶鵷鵸鵹鵺鵻鵼鵽鵾鵿鶀鶁�鶂鶃鶄鶅鶆鶇鶈鶉鶊鶋鶌鶍鶎鶏鶐鶑鶒鶓鶔鶕鶖鶗鶘鶙鶚鶛鶜鶝鶞鶟鶠鶡鶢�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[249].length; ++j) if(D[249][j].charCodeAt(0) !== 0xFFFD) { e[D[249][j]] = 63744 + j; d[63744 + j] = D[249][j];}\nD[250] = \"����������������������������������������������������������������鶣鶤鶥鶦鶧鶨鶩鶪鶫鶬鶭鶮鶯鶰鶱鶲鶳鶴鶵鶶鶷鶸鶹鶺鶻鶼鶽鶾鶿鷀鷁鷂鷃鷄鷅鷆鷇鷈鷉鷊鷋鷌鷍鷎鷏鷐鷑鷒鷓鷔鷕鷖鷗鷘鷙鷚鷛鷜鷝鷞鷟鷠鷡�鷢鷣鷤鷥鷦鷧鷨鷩鷪鷫鷬鷭鷮鷯鷰鷱鷲鷳鷴鷵鷶鷷鷸鷹鷺鷻鷼鷽鷾鷿鸀鸁鸂�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[250].length; ++j) if(D[250][j].charCodeAt(0) !== 0xFFFD) { e[D[250][j]] = 64000 + j; d[64000 + j] = D[250][j];}\nD[251] = \"����������������������������������������������������������������鸃鸄鸅鸆鸇鸈鸉鸊鸋鸌鸍鸎鸏鸐鸑鸒鸓鸔鸕鸖鸗鸘鸙鸚鸛鸜鸝鸞鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴鹵鹶鹷鹸鹹鹺鹻鹼鹽麀�麁麃麄麅麆麉麊麌麍麎麏麐麑麔麕麖麗麘麙麚麛麜麞麠麡麢麣麤麥麧麨麩麪�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[251].length; ++j) if(D[251][j].charCodeAt(0) !== 0xFFFD) { e[D[251][j]] = 64256 + j; d[64256 + j] = D[251][j];}\nD[252] = \"����������������������������������������������������������������麫麬麭麮麯麰麱麲麳麵麶麷麹麺麼麿黀黁黂黃黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰黱黲黳黴黵黶黷黸黺黽黿鼀鼁鼂鼃鼄鼅�鼆鼇鼈鼉鼊鼌鼏鼑鼒鼔鼕鼖鼘鼚鼛鼜鼝鼞鼟鼡鼣鼤鼥鼦鼧鼨鼩鼪鼫鼭鼮鼰鼱�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[252].length; ++j) if(D[252][j].charCodeAt(0) !== 0xFFFD) { e[D[252][j]] = 64512 + j; d[64512 + j] = D[252][j];}\nD[253] = \"����������������������������������������������������������������鼲鼳鼴鼵鼶鼸鼺鼼鼿齀齁齂齃齅齆齇齈齉齊齋齌齍齎齏齒齓齔齕齖齗齘齙齚齛齜齝齞齟齠齡齢齣齤齥齦齧齨齩齪齫齬齭齮齯齰齱齲齳齴齵齶齷齸�齹齺齻齼齽齾龁龂龍龎龏龐龑龒龓龔龕龖龗龘龜龝龞龡龢龣龤龥郎凉秊裏隣�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[253].length; ++j) if(D[253][j].charCodeAt(0) !== 0xFFFD) { e[D[253][j]] = 64768 + j; d[64768 + j] = D[253][j];}\nD[254] = \"����������������������������������������������������������������兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[254].length; ++j) if(D[254][j].charCodeAt(0) !== 0xFFFD) { e[D[254][j]] = 65024 + j; d[65024 + j] = D[254][j];}\nreturn {\"enc\": e, \"dec\": d }; })();\ncptable[949] = (function(){ var d = [], e = {}, D = [], j;\nD[0] = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}\nD[129] = \"�����������������������������������������������������������������갂갃갅갆갋갌갍갎갏갘갞갟갡갢갣갥갦갧갨갩갪갫갮갲갳갴������갵갶갷갺갻갽갾갿걁걂걃걄걅걆걇걈걉걊걌걎걏걐걑걒걓걕������걖걗걙걚걛걝걞걟걠걡걢걣걤걥걦걧걨걩걪걫걬걭걮걯걲걳걵걶걹걻걼걽걾걿겂겇겈겍겎겏겑겒겓겕겖겗겘겙겚겛겞겢겣겤겥겦겧겫겭겮겱겲겳겴겵겶겷겺겾겿곀곂곃곅곆곇곉곊곋곍곎곏곐곑곒곓곔곖곘곙곚곛곜곝곞곟곢곣곥곦곩곫곭곮곲곴곷곸곹곺곻곾곿괁괂괃괅괇괈괉괊괋괎괐괒괓�\".split(\"\");\nfor(j = 0; j != D[129].length; ++j) if(D[129][j].charCodeAt(0) !== 0xFFFD) { e[D[129][j]] = 33024 + j; d[33024 + j] = D[129][j];}\nD[130] = \"�����������������������������������������������������������������괔괕괖괗괙괚괛괝괞괟괡괢괣괤괥괦괧괨괪괫괮괯괰괱괲괳������괶괷괹괺괻괽괾괿굀굁굂굃굆굈굊굋굌굍굎굏굑굒굓굕굖굗������굙굚굛굜굝굞굟굠굢굤굥굦굧굨굩굪굫굮굯굱굲굷굸굹굺굾궀궃궄궅궆궇궊궋궍궎궏궑궒궓궔궕궖궗궘궙궚궛궞궟궠궡궢궣궥궦궧궨궩궪궫궬궭궮궯궰궱궲궳궴궵궶궸궹궺궻궼궽궾궿귂귃귅귆귇귉귊귋귌귍귎귏귒귔귕귖귗귘귙귚귛귝귞귟귡귢귣귥귦귧귨귩귪귫귬귭귮귯귰귱귲귳귴귵귶귷�\".split(\"\");\nfor(j = 0; j != D[130].length; ++j) if(D[130][j].charCodeAt(0) !== 0xFFFD) { e[D[130][j]] = 33280 + j; d[33280 + j] = D[130][j];}\nD[131] = \"�����������������������������������������������������������������귺귻귽귾긂긃긄긅긆긇긊긌긎긏긐긑긒긓긕긖긗긘긙긚긛긜������긝긞긟긠긡긢긣긤긥긦긧긨긩긪긫긬긭긮긯긲긳긵긶긹긻긼������긽긾긿깂깄깇깈깉깋깏깑깒깓깕깗깘깙깚깛깞깢깣깤깦깧깪깫깭깮깯깱깲깳깴깵깶깷깺깾깿꺀꺁꺂꺃꺆꺇꺈꺉꺊꺋꺍꺎꺏꺐꺑꺒꺓꺔꺕꺖꺗꺘꺙꺚꺛꺜꺝꺞꺟꺠꺡꺢꺣꺤꺥꺦꺧꺨꺩꺪꺫꺬꺭꺮꺯꺰꺱꺲꺳꺴꺵꺶꺷꺸꺹꺺꺻꺿껁껂껃껅껆껇껈껉껊껋껎껒껓껔껕껖껗껚껛껝껞껟껠껡껢껣껤껥�\".split(\"\");\nfor(j = 0; j != D[131].length; ++j) if(D[131][j].charCodeAt(0) !== 0xFFFD) { e[D[131][j]] = 33536 + j; d[33536 + j] = D[131][j];}\nD[132] = \"�����������������������������������������������������������������껦껧껩껪껬껮껯껰껱껲껳껵껶껷껹껺껻껽껾껿꼀꼁꼂꼃꼄꼅������꼆꼉꼊꼋꼌꼎꼏꼑꼒꼓꼔꼕꼖꼗꼘꼙꼚꼛꼜꼝꼞꼟꼠꼡꼢꼣������꼤꼥꼦꼧꼨꼩꼪꼫꼮꼯꼱꼳꼵꼶꼷꼸꼹꼺꼻꼾꽀꽄꽅꽆꽇꽊꽋꽌꽍꽎꽏꽑꽒꽓꽔꽕꽖꽗꽘꽙꽚꽛꽞꽟꽠꽡꽢꽣꽦꽧꽨꽩꽪꽫꽬꽭꽮꽯꽰꽱꽲꽳꽴꽵꽶꽷꽸꽺꽻꽼꽽꽾꽿꾁꾂꾃꾅꾆꾇꾉꾊꾋꾌꾍꾎꾏꾒꾓꾔꾖꾗꾘꾙꾚꾛꾝꾞꾟꾠꾡꾢꾣꾤꾥꾦꾧꾨꾩꾪꾫꾬꾭꾮꾯꾰꾱꾲꾳꾴꾵꾶꾷꾺꾻꾽꾾�\".split(\"\");\nfor(j = 0; j != D[132].length; ++j) if(D[132][j].charCodeAt(0) !== 0xFFFD) { e[D[132][j]] = 33792 + j; d[33792 + j] = D[132][j];}\nD[133] = \"�����������������������������������������������������������������꾿꿁꿂꿃꿄꿅꿆꿊꿌꿏꿐꿑꿒꿓꿕꿖꿗꿘꿙꿚꿛꿝꿞꿟꿠꿡������꿢꿣꿤꿥꿦꿧꿪꿫꿬꿭꿮꿯꿲꿳꿵꿶꿷꿹꿺꿻꿼꿽꿾꿿뀂뀃������뀅뀆뀇뀈뀉뀊뀋뀍뀎뀏뀑뀒뀓뀕뀖뀗뀘뀙뀚뀛뀞뀟뀠뀡뀢뀣뀤뀥뀦뀧뀩뀪뀫뀬뀭뀮뀯뀰뀱뀲뀳뀴뀵뀶뀷뀸뀹뀺뀻뀼뀽뀾뀿끀끁끂끃끆끇끉끋끍끏끐끑끒끖끘끚끛끜끞끟끠끡끢끣끤끥끦끧끨끩끪끫끬끭끮끯끰끱끲끳끴끵끶끷끸끹끺끻끾끿낁낂낃낅낆낇낈낉낊낋낎낐낒낓낔낕낖낗낛낝낞낣낤�\".split(\"\");\nfor(j = 0; j != D[133].length; ++j) if(D[133][j].charCodeAt(0) !== 0xFFFD) { e[D[133][j]] = 34048 + j; d[34048 + j] = D[133][j];}\nD[134] = \"�����������������������������������������������������������������낥낦낧낪낰낲낶낷낹낺낻낽낾낿냀냁냂냃냆냊냋냌냍냎냏냒������냓냕냖냗냙냚냛냜냝냞냟냡냢냣냤냦냧냨냩냪냫냬냭냮냯냰������냱냲냳냴냵냶냷냸냹냺냻냼냽냾냿넀넁넂넃넄넅넆넇넊넍넎넏넑넔넕넖넗넚넞넟넠넡넢넦넧넩넪넫넭넮넯넰넱넲넳넶넺넻넼넽넾넿녂녃녅녆녇녉녊녋녌녍녎녏녒녓녖녗녙녚녛녝녞녟녡녢녣녤녥녦녧녨녩녪녫녬녭녮녯녰녱녲녳녴녵녶녷녺녻녽녾녿놁놃놄놅놆놇놊놌놎놏놐놑놕놖놗놙놚놛놝�\".split(\"\");\nfor(j = 0; j != D[134].length; ++j) if(D[134][j].charCodeAt(0) !== 0xFFFD) { e[D[134][j]] = 34304 + j; d[34304 + j] = D[134][j];}\nD[135] = \"�����������������������������������������������������������������놞놟놠놡놢놣놤놥놦놧놩놪놫놬놭놮놯놰놱놲놳놴놵놶놷놸������놹놺놻놼놽놾놿뇀뇁뇂뇃뇄뇅뇆뇇뇈뇉뇊뇋뇍뇎뇏뇑뇒뇓뇕������뇖뇗뇘뇙뇚뇛뇞뇠뇡뇢뇣뇤뇥뇦뇧뇪뇫뇭뇮뇯뇱뇲뇳뇴뇵뇶뇷뇸뇺뇼뇾뇿눀눁눂눃눆눇눉눊눍눎눏눐눑눒눓눖눘눚눛눜눝눞눟눡눢눣눤눥눦눧눨눩눪눫눬눭눮눯눰눱눲눳눵눶눷눸눹눺눻눽눾눿뉀뉁뉂뉃뉄뉅뉆뉇뉈뉉뉊뉋뉌뉍뉎뉏뉐뉑뉒뉓뉔뉕뉖뉗뉙뉚뉛뉝뉞뉟뉡뉢뉣뉤뉥뉦뉧뉪뉫뉬뉭뉮�\".split(\"\");\nfor(j = 0; j != D[135].length; ++j) if(D[135][j].charCodeAt(0) !== 0xFFFD) { e[D[135][j]] = 34560 + j; d[34560 + j] = D[135][j];}\nD[136] = \"�����������������������������������������������������������������뉯뉰뉱뉲뉳뉶뉷뉸뉹뉺뉻뉽뉾뉿늀늁늂늃늆늇늈늊늋늌늍늎������늏늒늓늕늖늗늛늜늝늞늟늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷������늸늹늺늻늼늽늾늿닀닁닂닃닄닅닆닇닊닋닍닎닏닑닓닔닕닖닗닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉댊댋댌댍댎댏댒댖댗댘댙댚댛댝댞댟댠댡댢댣댤댥댦댧댨댩댪댫댬댭댮댯댰댱댲댳댴댵댶댷댸댹댺댻댼댽댾댿덀덁덂덃덄덅덆덇덈덉덊덋덌덍덎덏덐덑덒덓덗덙덚덝덠덡덢덣�\".split(\"\");\nfor(j = 0; j != D[136].length; ++j) if(D[136][j].charCodeAt(0) !== 0xFFFD) { e[D[136][j]] = 34816 + j; d[34816 + j] = D[136][j];}\nD[137] = \"�����������������������������������������������������������������덦덨덪덬덭덯덲덳덵덶덷덹덺덻덼덽덾덿뎂뎆뎇뎈뎉뎊뎋뎍������뎎뎏뎑뎒뎓뎕뎖뎗뎘뎙뎚뎛뎜뎝뎞뎟뎢뎣뎤뎥뎦뎧뎩뎪뎫뎭������뎮뎯뎰뎱뎲뎳뎴뎵뎶뎷뎸뎹뎺뎻뎼뎽뎾뎿돀돁돂돃돆돇돉돊돍돏돑돒돓돖돘돚돜돞돟돡돢돣돥돦돧돩돪돫돬돭돮돯돰돱돲돳돴돵돶돷돸돹돺돻돽돾돿됀됁됂됃됄됅됆됇됈됉됊됋됌됍됎됏됑됒됓됔됕됖됗됙됚됛됝됞됟됡됢됣됤됥됦됧됪됬됭됮됯됰됱됲됳됵됶됷됸됹됺됻됼됽됾됿둀둁둂둃둄�\".split(\"\");\nfor(j = 0; j != D[137].length; ++j) if(D[137][j].charCodeAt(0) !== 0xFFFD) { e[D[137][j]] = 35072 + j; d[35072 + j] = D[137][j];}\nD[138] = \"�����������������������������������������������������������������둅둆둇둈둉둊둋둌둍둎둏둒둓둕둖둗둙둚둛둜둝둞둟둢둤둦������둧둨둩둪둫둭둮둯둰둱둲둳둴둵둶둷둸둹둺둻둼둽둾둿뒁뒂������뒃뒄뒅뒆뒇뒉뒊뒋뒌뒍뒎뒏뒐뒑뒒뒓뒔뒕뒖뒗뒘뒙뒚뒛뒜뒞뒟뒠뒡뒢뒣뒥뒦뒧뒩뒪뒫뒭뒮뒯뒰뒱뒲뒳뒴뒶뒸뒺뒻뒼뒽뒾뒿듁듂듃듅듆듇듉듊듋듌듍듎듏듑듒듓듔듖듗듘듙듚듛듞듟듡듢듥듧듨듩듪듫듮듰듲듳듴듵듶듷듹듺듻듼듽듾듿딀딁딂딃딄딅딆딇딈딉딊딋딌딍딎딏딐딑딒딓딖딗딙딚딝�\".split(\"\");\nfor(j = 0; j != D[138].length; ++j) if(D[138][j].charCodeAt(0) !== 0xFFFD) { e[D[138][j]] = 35328 + j; d[35328 + j] = D[138][j];}\nD[139] = \"�����������������������������������������������������������������딞딟딠딡딢딣딦딫딬딭딮딯딲딳딵딶딷딹딺딻딼딽딾딿땂땆������땇땈땉땊땎땏땑땒땓땕땖땗땘땙땚땛땞땢땣땤땥땦땧땨땩땪������땫땬땭땮땯땰땱땲땳땴땵땶땷땸땹땺땻땼땽땾땿떀떁떂떃떄떅떆떇떈떉떊떋떌떍떎떏떐떑떒떓떔떕떖떗떘떙떚떛떜떝떞떟떢떣떥떦떧떩떬떭떮떯떲떶떷떸떹떺떾떿뗁뗂뗃뗅뗆뗇뗈뗉뗊뗋뗎뗒뗓뗔뗕뗖뗗뗙뗚뗛뗜뗝뗞뗟뗠뗡뗢뗣뗤뗥뗦뗧뗨뗩뗪뗫뗭뗮뗯뗰뗱뗲뗳뗴뗵뗶뗷뗸뗹뗺뗻뗼뗽뗾뗿�\".split(\"\");\nfor(j = 0; j != D[139].length; ++j) if(D[139][j].charCodeAt(0) !== 0xFFFD) { e[D[139][j]] = 35584 + j; d[35584 + j] = D[139][j];}\nD[140] = \"�����������������������������������������������������������������똀똁똂똃똄똅똆똇똈똉똊똋똌똍똎똏똒똓똕똖똗똙똚똛똜똝������똞똟똠똡똢똣똤똦똧똨똩똪똫똭똮똯똰똱똲똳똵똶똷똸똹똺������똻똼똽똾똿뙀뙁뙂뙃뙄뙅뙆뙇뙉뙊뙋뙌뙍뙎뙏뙐뙑뙒뙓뙔뙕뙖뙗뙘뙙뙚뙛뙜뙝뙞뙟뙠뙡뙢뙣뙥뙦뙧뙩뙪뙫뙬뙭뙮뙯뙰뙱뙲뙳뙴뙵뙶뙷뙸뙹뙺뙻뙼뙽뙾뙿뚀뚁뚂뚃뚄뚅뚆뚇뚈뚉뚊뚋뚌뚍뚎뚏뚐뚑뚒뚓뚔뚕뚖뚗뚘뚙뚚뚛뚞뚟뚡뚢뚣뚥뚦뚧뚨뚩뚪뚭뚮뚯뚰뚲뚳뚴뚵뚶뚷뚸뚹뚺뚻뚼뚽뚾뚿뛀뛁뛂�\".split(\"\");\nfor(j = 0; j != D[140].length; ++j) if(D[140][j].charCodeAt(0) !== 0xFFFD) { e[D[140][j]] = 35840 + j; d[35840 + j] = D[140][j];}\nD[141] = \"�����������������������������������������������������������������뛃뛄뛅뛆뛇뛈뛉뛊뛋뛌뛍뛎뛏뛐뛑뛒뛓뛕뛖뛗뛘뛙뛚뛛뛜뛝������뛞뛟뛠뛡뛢뛣뛤뛥뛦뛧뛨뛩뛪뛫뛬뛭뛮뛯뛱뛲뛳뛵뛶뛷뛹뛺������뛻뛼뛽뛾뛿뜂뜃뜄뜆뜇뜈뜉뜊뜋뜌뜍뜎뜏뜐뜑뜒뜓뜔뜕뜖뜗뜘뜙뜚뜛뜜뜝뜞뜟뜠뜡뜢뜣뜤뜥뜦뜧뜪뜫뜭뜮뜱뜲뜳뜴뜵뜶뜷뜺뜼뜽뜾뜿띀띁띂띃띅띆띇띉띊띋띍띎띏띐띑띒띓띖띗띘띙띚띛띜띝띞띟띡띢띣띥띦띧띩띪띫띬띭띮띯띲띴띶띷띸띹띺띻띾띿랁랂랃랅랆랇랈랉랊랋랎랓랔랕랚랛랝랞�\".split(\"\");\nfor(j = 0; j != D[141].length; ++j) if(D[141][j].charCodeAt(0) !== 0xFFFD) { e[D[141][j]] = 36096 + j; d[36096 + j] = D[141][j];}\nD[142] = \"�����������������������������������������������������������������랟랡랢랣랤랥랦랧랪랮랯랰랱랲랳랶랷랹랺랻랼랽랾랿럀럁������럂럃럄럅럆럈럊럋럌럍럎럏럐럑럒럓럔럕럖럗럘럙럚럛럜럝������럞럟럠럡럢럣럤럥럦럧럨럩럪럫럮럯럱럲럳럵럶럷럸럹럺럻럾렂렃렄렅렆렊렋렍렎렏렑렒렓렔렕렖렗렚렜렞렟렠렡렢렣렦렧렩렪렫렭렮렯렰렱렲렳렶렺렻렼렽렾렿롁롂롃롅롆롇롈롉롊롋롌롍롎롏롐롒롔롕롖롗롘롙롚롛롞롟롡롢롣롥롦롧롨롩롪롫롮롰롲롳롴롵롶롷롹롺롻롽롾롿뢀뢁뢂뢃뢄�\".split(\"\");\nfor(j = 0; j != D[142].length; ++j) if(D[142][j].charCodeAt(0) !== 0xFFFD) { e[D[142][j]] = 36352 + j; d[36352 + j] = D[142][j];}\nD[143] = \"�����������������������������������������������������������������뢅뢆뢇뢈뢉뢊뢋뢌뢎뢏뢐뢑뢒뢓뢔뢕뢖뢗뢘뢙뢚뢛뢜뢝뢞뢟������뢠뢡뢢뢣뢤뢥뢦뢧뢩뢪뢫뢬뢭뢮뢯뢱뢲뢳뢵뢶뢷뢹뢺뢻뢼뢽������뢾뢿룂룄룆룇룈룉룊룋룍룎룏룑룒룓룕룖룗룘룙룚룛룜룞룠룢룣룤룥룦룧룪룫룭룮룯룱룲룳룴룵룶룷룺룼룾룿뤀뤁뤂뤃뤅뤆뤇뤈뤉뤊뤋뤌뤍뤎뤏뤐뤑뤒뤓뤔뤕뤖뤗뤙뤚뤛뤜뤝뤞뤟뤡뤢뤣뤤뤥뤦뤧뤨뤩뤪뤫뤬뤭뤮뤯뤰뤱뤲뤳뤴뤵뤶뤷뤸뤹뤺뤻뤾뤿륁륂륃륅륆륇륈륉륊륋륍륎륐륒륓륔륕륖륗�\".split(\"\");\nfor(j = 0; j != D[143].length; ++j) if(D[143][j].charCodeAt(0) !== 0xFFFD) { e[D[143][j]] = 36608 + j; d[36608 + j] = D[143][j];}\nD[144] = \"�����������������������������������������������������������������륚륛륝륞륟륡륢륣륤륥륦륧륪륬륮륯륰륱륲륳륶륷륹륺륻륽������륾륿릀릁릂릃릆릈릋릌릏릐릑릒릓릔릕릖릗릘릙릚릛릜릝릞������릟릠릡릢릣릤릥릦릧릨릩릪릫릮릯릱릲릳릵릶릷릸릹릺릻릾맀맂맃맄맅맆맇맊맋맍맓맔맕맖맗맚맜맟맠맢맦맧맩맪맫맭맮맯맰맱맲맳맶맻맼맽맾맿먂먃먄먅먆먇먉먊먋먌먍먎먏먐먑먒먓먔먖먗먘먙먚먛먜먝먞먟먠먡먢먣먤먥먦먧먨먩먪먫먬먭먮먯먰먱먲먳먴먵먶먷먺먻먽먾먿멁멃멄멅멆�\".split(\"\");\nfor(j = 0; j != D[144].length; ++j) if(D[144][j].charCodeAt(0) !== 0xFFFD) { e[D[144][j]] = 36864 + j; d[36864 + j] = D[144][j];}\nD[145] = \"�����������������������������������������������������������������멇멊멌멏멐멑멒멖멗멙멚멛멝멞멟멠멡멢멣멦멪멫멬멭멮멯������멲멳멵멶멷멹멺멻멼멽멾멿몀몁몂몆몈몉몊몋몍몎몏몐몑몒������몓몔몕몖몗몘몙몚몛몜몝몞몟몠몡몢몣몤몥몦몧몪몭몮몯몱몳몴몵몶몷몺몼몾몿뫀뫁뫂뫃뫅뫆뫇뫉뫊뫋뫌뫍뫎뫏뫐뫑뫒뫓뫔뫕뫖뫗뫚뫛뫜뫝뫞뫟뫠뫡뫢뫣뫤뫥뫦뫧뫨뫩뫪뫫뫬뫭뫮뫯뫰뫱뫲뫳뫴뫵뫶뫷뫸뫹뫺뫻뫽뫾뫿묁묂묃묅묆묇묈묉묊묋묌묎묐묒묓묔묕묖묗묙묚묛묝묞묟묡묢묣묤묥묦묧�\".split(\"\");\nfor(j = 0; j != D[145].length; ++j) if(D[145][j].charCodeAt(0) !== 0xFFFD) { e[D[145][j]] = 37120 + j; d[37120 + j] = D[145][j];}\nD[146] = \"�����������������������������������������������������������������묨묪묬묭묮묯묰묱묲묳묷묹묺묿뭀뭁뭂뭃뭆뭈뭊뭋뭌뭎뭑뭒������뭓뭕뭖뭗뭙뭚뭛뭜뭝뭞뭟뭠뭢뭤뭥뭦뭧뭨뭩뭪뭫뭭뭮뭯뭰뭱������뭲뭳뭴뭵뭶뭷뭸뭹뭺뭻뭼뭽뭾뭿뮀뮁뮂뮃뮄뮅뮆뮇뮉뮊뮋뮍뮎뮏뮑뮒뮓뮔뮕뮖뮗뮘뮙뮚뮛뮜뮝뮞뮟뮠뮡뮢뮣뮥뮦뮧뮩뮪뮫뮭뮮뮯뮰뮱뮲뮳뮵뮶뮸뮹뮺뮻뮼뮽뮾뮿믁믂믃믅믆믇믉믊믋믌믍믎믏믑믒믔믕믖믗믘믙믚믛믜믝믞믟믠믡믢믣믤믥믦믧믨믩믪믫믬믭믮믯믰믱믲믳믴믵믶믷믺믻믽믾밁�\".split(\"\");\nfor(j = 0; j != D[146].length; ++j) if(D[146][j].charCodeAt(0) !== 0xFFFD) { e[D[146][j]] = 37376 + j; d[37376 + j] = D[146][j];}\nD[147] = \"�����������������������������������������������������������������밃밄밅밆밇밊밎밐밒밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵������밶밷밹밺밻밼밽밾밿뱂뱆뱇뱈뱊뱋뱎뱏뱑뱒뱓뱔뱕뱖뱗뱘뱙������뱚뱛뱜뱞뱟뱠뱡뱢뱣뱤뱥뱦뱧뱨뱩뱪뱫뱬뱭뱮뱯뱰뱱뱲뱳뱴뱵뱶뱷뱸뱹뱺뱻뱼뱽뱾뱿벀벁벂벃벆벇벉벊벍벏벐벑벒벓벖벘벛벜벝벞벟벢벣벥벦벩벪벫벬벭벮벯벲벶벷벸벹벺벻벾벿볁볂볃볅볆볇볈볉볊볋볌볎볒볓볔볖볗볙볚볛볝볞볟볠볡볢볣볤볥볦볧볨볩볪볫볬볭볮볯볰볱볲볳볷볹볺볻볽�\".split(\"\");\nfor(j = 0; j != D[147].length; ++j) if(D[147][j].charCodeAt(0) !== 0xFFFD) { e[D[147][j]] = 37632 + j; d[37632 + j] = D[147][j];}\nD[148] = \"�����������������������������������������������������������������볾볿봀봁봂봃봆봈봊봋봌봍봎봏봑봒봓봕봖봗봘봙봚봛봜봝������봞봟봠봡봢봣봥봦봧봨봩봪봫봭봮봯봰봱봲봳봴봵봶봷봸봹������봺봻봼봽봾봿뵁뵂뵃뵄뵅뵆뵇뵊뵋뵍뵎뵏뵑뵒뵓뵔뵕뵖뵗뵚뵛뵜뵝뵞뵟뵠뵡뵢뵣뵥뵦뵧뵩뵪뵫뵬뵭뵮뵯뵰뵱뵲뵳뵴뵵뵶뵷뵸뵹뵺뵻뵼뵽뵾뵿붂붃붅붆붋붌붍붎붏붒붔붖붗붘붛붝붞붟붠붡붢붣붥붦붧붨붩붪붫붬붭붮붯붱붲붳붴붵붶붷붹붺붻붼붽붾붿뷀뷁뷂뷃뷄뷅뷆뷇뷈뷉뷊뷋뷌뷍뷎뷏뷐뷑�\".split(\"\");\nfor(j = 0; j != D[148].length; ++j) if(D[148][j].charCodeAt(0) !== 0xFFFD) { e[D[148][j]] = 37888 + j; d[37888 + j] = D[148][j];}\nD[149] = \"�����������������������������������������������������������������뷒뷓뷖뷗뷙뷚뷛뷝뷞뷟뷠뷡뷢뷣뷤뷥뷦뷧뷨뷪뷫뷬뷭뷮뷯뷱������뷲뷳뷵뷶뷷뷹뷺뷻뷼뷽뷾뷿븁븂븄븆븇븈븉븊븋븎븏븑븒븓������븕븖븗븘븙븚븛븞븠븡븢븣븤븥븦븧븨븩븪븫븬븭븮븯븰븱븲븳븴븵븶븷븸븹븺븻븼븽븾븿빀빁빂빃빆빇빉빊빋빍빏빐빑빒빓빖빘빜빝빞빟빢빣빥빦빧빩빫빬빭빮빯빲빶빷빸빹빺빾빿뺁뺂뺃뺅뺆뺇뺈뺉뺊뺋뺎뺒뺓뺔뺕뺖뺗뺚뺛뺜뺝뺞뺟뺠뺡뺢뺣뺤뺥뺦뺧뺩뺪뺫뺬뺭뺮뺯뺰뺱뺲뺳뺴뺵뺶뺷�\".split(\"\");\nfor(j = 0; j != D[149].length; ++j) if(D[149][j].charCodeAt(0) !== 0xFFFD) { e[D[149][j]] = 38144 + j; d[38144 + j] = D[149][j];}\nD[150] = \"�����������������������������������������������������������������뺸뺹뺺뺻뺼뺽뺾뺿뻀뻁뻂뻃뻄뻅뻆뻇뻈뻉뻊뻋뻌뻍뻎뻏뻒뻓������뻕뻖뻙뻚뻛뻜뻝뻞뻟뻡뻢뻦뻧뻨뻩뻪뻫뻭뻮뻯뻰뻱뻲뻳뻴뻵������뻶뻷뻸뻹뻺뻻뻼뻽뻾뻿뼀뼂뼃뼄뼅뼆뼇뼊뼋뼌뼍뼎뼏뼐뼑뼒뼓뼔뼕뼖뼗뼚뼞뼟뼠뼡뼢뼣뼤뼥뼦뼧뼨뼩뼪뼫뼬뼭뼮뼯뼰뼱뼲뼳뼴뼵뼶뼷뼸뼹뼺뼻뼼뼽뼾뼿뽂뽃뽅뽆뽇뽉뽊뽋뽌뽍뽎뽏뽒뽓뽔뽖뽗뽘뽙뽚뽛뽜뽝뽞뽟뽠뽡뽢뽣뽤뽥뽦뽧뽨뽩뽪뽫뽬뽭뽮뽯뽰뽱뽲뽳뽴뽵뽶뽷뽸뽹뽺뽻뽼뽽뽾뽿뾀뾁뾂�\".split(\"\");\nfor(j = 0; j != D[150].length; ++j) if(D[150][j].charCodeAt(0) !== 0xFFFD) { e[D[150][j]] = 38400 + j; d[38400 + j] = D[150][j];}\nD[151] = \"�����������������������������������������������������������������뾃뾄뾅뾆뾇뾈뾉뾊뾋뾌뾍뾎뾏뾐뾑뾒뾓뾕뾖뾗뾘뾙뾚뾛뾜뾝������뾞뾟뾠뾡뾢뾣뾤뾥뾦뾧뾨뾩뾪뾫뾬뾭뾮뾯뾱뾲뾳뾴뾵뾶뾷뾸������뾹뾺뾻뾼뾽뾾뾿뿀뿁뿂뿃뿄뿆뿇뿈뿉뿊뿋뿎뿏뿑뿒뿓뿕뿖뿗뿘뿙뿚뿛뿝뿞뿠뿢뿣뿤뿥뿦뿧뿨뿩뿪뿫뿬뿭뿮뿯뿰뿱뿲뿳뿴뿵뿶뿷뿸뿹뿺뿻뿼뿽뿾뿿쀀쀁쀂쀃쀄쀅쀆쀇쀈쀉쀊쀋쀌쀍쀎쀏쀐쀑쀒쀓쀔쀕쀖쀗쀘쀙쀚쀛쀜쀝쀞쀟쀠쀡쀢쀣쀤쀥쀦쀧쀨쀩쀪쀫쀬쀭쀮쀯쀰쀱쀲쀳쀴쀵쀶쀷쀸쀹쀺쀻쀽쀾쀿�\".split(\"\");\nfor(j = 0; j != D[151].length; ++j) if(D[151][j].charCodeAt(0) !== 0xFFFD) { e[D[151][j]] = 38656 + j; d[38656 + j] = D[151][j];}\nD[152] = \"�����������������������������������������������������������������쁀쁁쁂쁃쁄쁅쁆쁇쁈쁉쁊쁋쁌쁍쁎쁏쁐쁒쁓쁔쁕쁖쁗쁙쁚쁛������쁝쁞쁟쁡쁢쁣쁤쁥쁦쁧쁪쁫쁬쁭쁮쁯쁰쁱쁲쁳쁴쁵쁶쁷쁸쁹������쁺쁻쁼쁽쁾쁿삀삁삂삃삄삅삆삇삈삉삊삋삌삍삎삏삒삓삕삖삗삙삚삛삜삝삞삟삢삤삦삧삨삩삪삫삮삱삲삷삸삹삺삻삾샂샃샄샆샇샊샋샍샎샏샑샒샓샔샕샖샗샚샞샟샠샡샢샣샦샧샩샪샫샭샮샯샰샱샲샳샶샸샺샻샼샽샾샿섁섂섃섅섆섇섉섊섋섌섍섎섏섑섒섓섔섖섗섘섙섚섛섡섢섥섨섩섪섫섮�\".split(\"\");\nfor(j = 0; j != D[152].length; ++j) if(D[152][j].charCodeAt(0) !== 0xFFFD) { e[D[152][j]] = 38912 + j; d[38912 + j] = D[152][j];}\nD[153] = \"�����������������������������������������������������������������섲섳섴섵섷섺섻섽섾섿셁셂셃셄셅셆셇셊셎셏셐셑셒셓셖셗������셙셚셛셝셞셟셠셡셢셣셦셪셫셬셭셮셯셱셲셳셵셶셷셹셺셻������셼셽셾셿솀솁솂솃솄솆솇솈솉솊솋솏솑솒솓솕솗솘솙솚솛솞솠솢솣솤솦솧솪솫솭솮솯솱솲솳솴솵솶솷솸솹솺솻솼솾솿쇀쇁쇂쇃쇅쇆쇇쇉쇊쇋쇍쇎쇏쇐쇑쇒쇓쇕쇖쇙쇚쇛쇜쇝쇞쇟쇡쇢쇣쇥쇦쇧쇩쇪쇫쇬쇭쇮쇯쇲쇴쇵쇶쇷쇸쇹쇺쇻쇾쇿숁숂숃숅숆숇숈숉숊숋숎숐숒숓숔숕숖숗숚숛숝숞숡숢숣�\".split(\"\");\nfor(j = 0; j != D[153].length; ++j) if(D[153][j].charCodeAt(0) !== 0xFFFD) { e[D[153][j]] = 39168 + j; d[39168 + j] = D[153][j];}\nD[154] = \"�����������������������������������������������������������������숤숥숦숧숪숬숮숰숳숵숶숷숸숹숺숻숼숽숾숿쉀쉁쉂쉃쉄쉅������쉆쉇쉉쉊쉋쉌쉍쉎쉏쉒쉓쉕쉖쉗쉙쉚쉛쉜쉝쉞쉟쉡쉢쉣쉤쉦������쉧쉨쉩쉪쉫쉮쉯쉱쉲쉳쉵쉶쉷쉸쉹쉺쉻쉾슀슂슃슄슅슆슇슊슋슌슍슎슏슑슒슓슔슕슖슗슙슚슜슞슟슠슡슢슣슦슧슩슪슫슮슯슰슱슲슳슶슸슺슻슼슽슾슿싀싁싂싃싄싅싆싇싈싉싊싋싌싍싎싏싐싑싒싓싔싕싖싗싘싙싚싛싞싟싡싢싥싦싧싨싩싪싮싰싲싳싴싵싷싺싽싾싿쌁쌂쌃쌄쌅쌆쌇쌊쌋쌎쌏�\".split(\"\");\nfor(j = 0; j != D[154].length; ++j) if(D[154][j].charCodeAt(0) !== 0xFFFD) { e[D[154][j]] = 39424 + j; d[39424 + j] = D[154][j];}\nD[155] = \"�����������������������������������������������������������������쌐쌑쌒쌖쌗쌙쌚쌛쌝쌞쌟쌠쌡쌢쌣쌦쌧쌪쌫쌬쌭쌮쌯쌰쌱쌲������쌳쌴쌵쌶쌷쌸쌹쌺쌻쌼쌽쌾쌿썀썁썂썃썄썆썇썈썉썊썋썌썍������썎썏썐썑썒썓썔썕썖썗썘썙썚썛썜썝썞썟썠썡썢썣썤썥썦썧썪썫썭썮썯썱썳썴썵썶썷썺썻썾썿쎀쎁쎂쎃쎅쎆쎇쎉쎊쎋쎍쎎쎏쎐쎑쎒쎓쎔쎕쎖쎗쎘쎙쎚쎛쎜쎝쎞쎟쎠쎡쎢쎣쎤쎥쎦쎧쎨쎩쎪쎫쎬쎭쎮쎯쎰쎱쎲쎳쎴쎵쎶쎷쎸쎹쎺쎻쎼쎽쎾쎿쏁쏂쏃쏄쏅쏆쏇쏈쏉쏊쏋쏌쏍쏎쏏쏐쏑쏒쏓쏔쏕쏖쏗쏚�\".split(\"\");\nfor(j = 0; j != D[155].length; ++j) if(D[155][j].charCodeAt(0) !== 0xFFFD) { e[D[155][j]] = 39680 + j; d[39680 + j] = D[155][j];}\nD[156] = \"�����������������������������������������������������������������쏛쏝쏞쏡쏣쏤쏥쏦쏧쏪쏫쏬쏮쏯쏰쏱쏲쏳쏶쏷쏹쏺쏻쏼쏽쏾������쏿쐀쐁쐂쐃쐄쐅쐆쐇쐉쐊쐋쐌쐍쐎쐏쐑쐒쐓쐔쐕쐖쐗쐘쐙쐚������쐛쐜쐝쐞쐟쐠쐡쐢쐣쐥쐦쐧쐨쐩쐪쐫쐭쐮쐯쐱쐲쐳쐵쐶쐷쐸쐹쐺쐻쐾쐿쑀쑁쑂쑃쑄쑅쑆쑇쑉쑊쑋쑌쑍쑎쑏쑐쑑쑒쑓쑔쑕쑖쑗쑘쑙쑚쑛쑜쑝쑞쑟쑠쑡쑢쑣쑦쑧쑩쑪쑫쑭쑮쑯쑰쑱쑲쑳쑶쑷쑸쑺쑻쑼쑽쑾쑿쒁쒂쒃쒄쒅쒆쒇쒈쒉쒊쒋쒌쒍쒎쒏쒐쒑쒒쒓쒕쒖쒗쒘쒙쒚쒛쒝쒞쒟쒠쒡쒢쒣쒤쒥쒦쒧쒨쒩�\".split(\"\");\nfor(j = 0; j != D[156].length; ++j) if(D[156][j].charCodeAt(0) !== 0xFFFD) { e[D[156][j]] = 39936 + j; d[39936 + j] = D[156][j];}\nD[157] = \"�����������������������������������������������������������������쒪쒫쒬쒭쒮쒯쒰쒱쒲쒳쒴쒵쒶쒷쒹쒺쒻쒽쒾쒿쓀쓁쓂쓃쓄쓅������쓆쓇쓈쓉쓊쓋쓌쓍쓎쓏쓐쓑쓒쓓쓔쓕쓖쓗쓘쓙쓚쓛쓜쓝쓞쓟������쓠쓡쓢쓣쓤쓥쓦쓧쓨쓪쓫쓬쓭쓮쓯쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂씃씄씅씆씇씈씉씊씋씍씎씏씑씒씓씕씖씗씘씙씚씛씝씞씟씠씡씢씣씤씥씦씧씪씫씭씮씯씱씲씳씴씵씶씷씺씼씾씿앀앁앂앃앆앇앋앏앐앑앒앖앚앛앜앟앢앣앥앦앧앩앪앫앬앭앮앯앲앶앷앸앹앺앻앾앿얁얂얃얅얆얈얉얊얋얎얐얒얓얔�\".split(\"\");\nfor(j = 0; j != D[157].length; ++j) if(D[157][j].charCodeAt(0) !== 0xFFFD) { e[D[157][j]] = 40192 + j; d[40192 + j] = D[157][j];}\nD[158] = \"�����������������������������������������������������������������얖얙얚얛얝얞얟얡얢얣얤얥얦얧얨얪얫얬얭얮얯얰얱얲얳얶������얷얺얿엀엁엂엃엋엍엏엒엓엕엖엗엙엚엛엜엝엞엟엢엤엦엧������엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋옍옎옏옑옒옓옔옕옖옗옚옝옞옟옠옡옢옣옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉왊왋왌왍왎왏왒왖왗왘왙왚왛왞왟왡왢왣왤왥왦왧왨왩왪왫왭왮왰왲왳왴왵왶왷왺왻왽왾왿욁욂욃욄욅욆욇욊욌욎욏욐욑욒욓욖욗욙욚욛욝욞욟욠욡욢욣욦�\".split(\"\");\nfor(j = 0; j != D[158].length; ++j) if(D[158][j].charCodeAt(0) !== 0xFFFD) { e[D[158][j]] = 40448 + j; d[40448 + j] = D[158][j];}\nD[159] = \"�����������������������������������������������������������������욨욪욫욬욭욮욯욲욳욵욶욷욻욼욽욾욿웂웄웆웇웈웉웊웋웎������웏웑웒웓웕웖웗웘웙웚웛웞웟웢웣웤웥웦웧웪웫웭웮웯웱웲������웳웴웵웶웷웺웻웼웾웿윀윁윂윃윆윇윉윊윋윍윎윏윐윑윒윓윖윘윚윛윜윝윞윟윢윣윥윦윧윩윪윫윬윭윮윯윲윴윶윸윹윺윻윾윿읁읂읃읅읆읇읈읉읋읎읐읙읚읛읝읞읟읡읢읣읤읥읦읧읩읪읬읭읮읯읰읱읲읳읶읷읹읺읻읿잀잁잂잆잋잌잍잏잒잓잕잙잛잜잝잞잟잢잧잨잩잪잫잮잯잱잲잳잵잶잷�\".split(\"\");\nfor(j = 0; j != D[159].length; ++j) if(D[159][j].charCodeAt(0) !== 0xFFFD) { e[D[159][j]] = 40704 + j; d[40704 + j] = D[159][j];}\nD[160] = \"�����������������������������������������������������������������잸잹잺잻잾쟂쟃쟄쟅쟆쟇쟊쟋쟍쟏쟑쟒쟓쟔쟕쟖쟗쟙쟚쟛쟜������쟞쟟쟠쟡쟢쟣쟥쟦쟧쟩쟪쟫쟭쟮쟯쟰쟱쟲쟳쟴쟵쟶쟷쟸쟹쟺������쟻쟼쟽쟾쟿젂젃젅젆젇젉젋젌젍젎젏젒젔젗젘젙젚젛젞젟젡젢젣젥젦젧젨젩젪젫젮젰젲젳젴젵젶젷젹젺젻젽젾젿졁졂졃졄졅졆졇졊졋졎졏졐졑졒졓졕졖졗졘졙졚졛졜졝졞졟졠졡졢졣졤졥졦졧졨졩졪졫졬졭졮졯졲졳졵졶졷졹졻졼졽졾졿좂좄좈좉좊좎좏좐좑좒좓좕좖좗좘좙좚좛좜좞좠좢좣좤�\".split(\"\");\nfor(j = 0; j != D[160].length; ++j) if(D[160][j].charCodeAt(0) !== 0xFFFD) { e[D[160][j]] = 40960 + j; d[40960 + j] = D[160][j];}\nD[161] = \"�����������������������������������������������������������������좥좦좧좩좪좫좬좭좮좯좰좱좲좳좴좵좶좷좸좹좺좻좾좿죀죁������죂죃죅죆죇죉죊죋죍죎죏죐죑죒죓죖죘죚죛죜죝죞죟죢죣죥������죦죧죨죩죪죫죬죭죮죯죰죱죲죳죴죶죷죸죹죺죻죾죿줁줂줃줇줈줉줊줋줎 、。·‥…¨〃­―∥\∼‘’“”〔〕〈〉《》「」『』【】±×÷≠≤≥∞∴°′″℃Å¢£¥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨¬�\".split(\"\");\nfor(j = 0; j != D[161].length; ++j) if(D[161][j].charCodeAt(0) !== 0xFFFD) { e[D[161][j]] = 41216 + j; d[41216 + j] = D[161][j];}\nD[162] = \"�����������������������������������������������������������������줐줒줓줔줕줖줗줙줚줛줜줝줞줟줠줡줢줣줤줥줦줧줨줩줪줫������줭줮줯줰줱줲줳줵줶줷줸줹줺줻줼줽줾줿쥀쥁쥂쥃쥄쥅쥆쥇������쥈쥉쥊쥋쥌쥍쥎쥏쥒쥓쥕쥖쥗쥙쥚쥛쥜쥝쥞쥟쥢쥤쥥쥦쥧쥨쥩쥪쥫쥭쥮쥯⇒⇔∀∃´~ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®������������������������\".split(\"\");\nfor(j = 0; j != D[162].length; ++j) if(D[162][j].charCodeAt(0) !== 0xFFFD) { e[D[162][j]] = 41472 + j; d[41472 + j] = D[162][j];}\nD[163] = \"�����������������������������������������������������������������쥱쥲쥳쥵쥶쥷쥸쥹쥺쥻쥽쥾쥿즀즁즂즃즄즅즆즇즊즋즍즎즏������즑즒즓즔즕즖즗즚즜즞즟즠즡즢즣즤즥즦즧즨즩즪즫즬즭즮������즯즰즱즲즳즴즵즶즷즸즹즺즻즼즽즾즿짂짃짅짆짉짋짌짍짎짏짒짔짗짘짛!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[₩]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�\".split(\"\");\nfor(j = 0; j != D[163].length; ++j) if(D[163][j].charCodeAt(0) !== 0xFFFD) { e[D[163][j]] = 41728 + j; d[41728 + j] = D[163][j];}\nD[164] = \"�����������������������������������������������������������������짞짟짡짣짥짦짨짩짪짫짮짲짳짴짵짶짷짺짻짽짾짿쨁쨂쨃쨄������쨅쨆쨇쨊쨎쨏쨐쨑쨒쨓쨕쨖쨗쨙쨚쨛쨜쨝쨞쨟쨠쨡쨢쨣쨤쨥������쨦쨧쨨쨪쨫쨬쨭쨮쨯쨰쨱쨲쨳쨴쨵쨶쨷쨸쨹쨺쨻쨼쨽쨾쨿쩀쩁쩂쩃쩄쩅쩆ㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅃㅄㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣㅤㅥㅦㅧㅨㅩㅪㅫㅬㅭㅮㅯㅰㅱㅲㅳㅴㅵㅶㅷㅸㅹㅺㅻㅼㅽㅾㅿㆀㆁㆂㆃㆄㆅㆆㆇㆈㆉㆊㆋㆌㆍㆎ�\".split(\"\");\nfor(j = 0; j != D[164].length; ++j) if(D[164][j].charCodeAt(0) !== 0xFFFD) { e[D[164][j]] = 41984 + j; d[41984 + j] = D[164][j];}\nD[165] = \"�����������������������������������������������������������������쩇쩈쩉쩊쩋쩎쩏쩑쩒쩓쩕쩖쩗쩘쩙쩚쩛쩞쩢쩣쩤쩥쩦쩧쩩쩪������쩫쩬쩭쩮쩯쩰쩱쩲쩳쩴쩵쩶쩷쩸쩹쩺쩻쩼쩾쩿쪀쪁쪂쪃쪅쪆������쪇쪈쪉쪊쪋쪌쪍쪎쪏쪐쪑쪒쪓쪔쪕쪖쪗쪙쪚쪛쪜쪝쪞쪟쪠쪡쪢쪣쪤쪥쪦쪧ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ�����ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ�������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�������\".split(\"\");\nfor(j = 0; j != D[165].length; ++j) if(D[165][j].charCodeAt(0) !== 0xFFFD) { e[D[165][j]] = 42240 + j; d[42240 + j] = D[165][j];}\nD[166] = \"�����������������������������������������������������������������쪨쪩쪪쪫쪬쪭쪮쪯쪰쪱쪲쪳쪴쪵쪶쪷쪸쪹쪺쪻쪾쪿쫁쫂쫃쫅������쫆쫇쫈쫉쫊쫋쫎쫐쫒쫔쫕쫖쫗쫚쫛쫜쫝쫞쫟쫡쫢쫣쫤쫥쫦쫧������쫨쫩쫪쫫쫭쫮쫯쫰쫱쫲쫳쫵쫶쫷쫸쫹쫺쫻쫼쫽쫾쫿쬀쬁쬂쬃쬄쬅쬆쬇쬉쬊─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂┒┑┚┙┖┕┎┍┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀╁╃╄╅╆╇╈╉╊���������������������������\".split(\"\");\nfor(j = 0; j != D[166].length; ++j) if(D[166][j].charCodeAt(0) !== 0xFFFD) { e[D[166][j]] = 42496 + j; d[42496 + j] = D[166][j];}\nD[167] = \"�����������������������������������������������������������������쬋쬌쬍쬎쬏쬑쬒쬓쬕쬖쬗쬙쬚쬛쬜쬝쬞쬟쬢쬣쬤쬥쬦쬧쬨쬩������쬪쬫쬬쬭쬮쬯쬰쬱쬲쬳쬴쬵쬶쬷쬸쬹쬺쬻쬼쬽쬾쬿쭀쭂쭃쭄������쭅쭆쭇쭊쭋쭍쭎쭏쭑쭒쭓쭔쭕쭖쭗쭚쭛쭜쭞쭟쭠쭡쭢쭣쭥쭦쭧쭨쭩쭪쭫쭬㎕㎖㎗ℓ㎘㏄㎣㎤㎥㎦㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㏊㎍㎎㎏㏏㎈㎉㏈㎧㎨㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎀㎁㎂㎃㎄㎺㎻㎼㎽㎾㎿㎐㎑㎒㎓㎔Ω㏀㏁㎊㎋㎌㏖㏅㎭㎮㎯㏛㎩㎪㎫㎬㏝㏐㏓㏃㏉㏜㏆����������������\".split(\"\");\nfor(j = 0; j != D[167].length; ++j) if(D[167][j].charCodeAt(0) !== 0xFFFD) { e[D[167][j]] = 42752 + j; d[42752 + j] = D[167][j];}\nD[168] = \"�����������������������������������������������������������������쭭쭮쭯쭰쭱쭲쭳쭴쭵쭶쭷쭺쭻쭼쭽쭾쭿쮀쮁쮂쮃쮄쮅쮆쮇쮈������쮉쮊쮋쮌쮍쮎쮏쮐쮑쮒쮓쮔쮕쮖쮗쮘쮙쮚쮛쮝쮞쮟쮠쮡쮢쮣������쮤쮥쮦쮧쮨쮩쮪쮫쮬쮭쮮쮯쮰쮱쮲쮳쮴쮵쮶쮷쮹쮺쮻쮼쮽쮾쮿쯀쯁쯂쯃쯄ÆÐªĦ�IJ�ĿŁØŒºÞŦŊ�㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮½⅓⅔¼¾⅛⅜⅝⅞�\".split(\"\");\nfor(j = 0; j != D[168].length; ++j) if(D[168][j].charCodeAt(0) !== 0xFFFD) { e[D[168][j]] = 43008 + j; d[43008 + j] = D[168][j];}\nD[169] = \"�����������������������������������������������������������������쯅쯆쯇쯈쯉쯊쯋쯌쯍쯎쯏쯐쯑쯒쯓쯕쯖쯗쯘쯙쯚쯛쯜쯝쯞쯟������쯠쯡쯢쯣쯥쯦쯨쯪쯫쯬쯭쯮쯯쯰쯱쯲쯳쯴쯵쯶쯷쯸쯹쯺쯻쯼������쯽쯾쯿찀찁찂찃찄찅찆찇찈찉찊찋찎찏찑찒찓찕찖찗찘찙찚찛찞찟찠찣찤æđðħıijĸŀłøœßþŧŋʼn㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗㈘㈙㈚㈛⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂¹²³⁴ⁿ₁₂₃₄�\".split(\"\");\nfor(j = 0; j != D[169].length; ++j) if(D[169][j].charCodeAt(0) !== 0xFFFD) { e[D[169][j]] = 43264 + j; d[43264 + j] = D[169][j];}\nD[170] = \"�����������������������������������������������������������������찥찦찪찫찭찯찱찲찳찴찵찶찷찺찿챀챁챂챃챆챇챉챊챋챍챎������챏챐챑챒챓챖챚챛챜챝챞챟챡챢챣챥챧챩챪챫챬챭챮챯챱챲������챳챴챶챷챸챹챺챻챼챽챾챿첀첁첂첃첄첅첆첇첈첉첊첋첌첍첎첏첐첑첒첓ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������\".split(\"\");\nfor(j = 0; j != D[170].length; ++j) if(D[170][j].charCodeAt(0) !== 0xFFFD) { e[D[170][j]] = 43520 + j; d[43520 + j] = D[170][j];}\nD[171] = \"�����������������������������������������������������������������첔첕첖첗첚첛첝첞첟첡첢첣첤첥첦첧첪첮첯첰첱첲첳첶첷첹������첺첻첽첾첿쳀쳁쳂쳃쳆쳈쳊쳋쳌쳍쳎쳏쳑쳒쳓쳕쳖쳗쳘쳙쳚������쳛쳜쳝쳞쳟쳠쳡쳢쳣쳥쳦쳧쳨쳩쳪쳫쳭쳮쳯쳱쳲쳳쳴쳵쳶쳷쳸쳹쳺쳻쳼쳽ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������\".split(\"\");\nfor(j = 0; j != D[171].length; ++j) if(D[171][j].charCodeAt(0) !== 0xFFFD) { e[D[171][j]] = 43776 + j; d[43776 + j] = D[171][j];}\nD[172] = \"�����������������������������������������������������������������쳾쳿촀촂촃촄촅촆촇촊촋촍촎촏촑촒촓촔촕촖촗촚촜촞촟촠������촡촢촣촥촦촧촩촪촫촭촮촯촰촱촲촳촴촵촶촷촸촺촻촼촽촾������촿쵀쵁쵂쵃쵄쵅쵆쵇쵈쵉쵊쵋쵌쵍쵎쵏쵐쵑쵒쵓쵔쵕쵖쵗쵘쵙쵚쵛쵝쵞쵟АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������\".split(\"\");\nfor(j = 0; j != D[172].length; ++j) if(D[172][j].charCodeAt(0) !== 0xFFFD) { e[D[172][j]] = 44032 + j; d[44032 + j] = D[172][j];}\nD[173] = \"�����������������������������������������������������������������쵡쵢쵣쵥쵦쵧쵨쵩쵪쵫쵮쵰쵲쵳쵴쵵쵶쵷쵹쵺쵻쵼쵽쵾쵿춀������춁춂춃춄춅춆춇춉춊춋춌춍춎춏춐춑춒춓춖춗춙춚춛춝춞춟������춠춡춢춣춦춨춪춫춬춭춮춯춱춲춳춴춵춶춷춸춹춺춻춼춽춾춿췀췁췂췃췅�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[173].length; ++j) if(D[173][j].charCodeAt(0) !== 0xFFFD) { e[D[173][j]] = 44288 + j; d[44288 + j] = D[173][j];}\nD[174] = \"�����������������������������������������������������������������췆췇췈췉췊췋췍췎췏췑췒췓췔췕췖췗췘췙췚췛췜췝췞췟췠췡������췢췣췤췥췦췧췩췪췫췭췮췯췱췲췳췴췵췶췷췺췼췾췿츀츁츂������츃츅츆츇츉츊츋츍츎츏츐츑츒츓츕츖츗츘츚츛츜츝츞츟츢츣츥츦츧츩츪츫�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[174].length; ++j) if(D[174][j].charCodeAt(0) !== 0xFFFD) { e[D[174][j]] = 44544 + j; d[44544 + j] = D[174][j];}\nD[175] = \"�����������������������������������������������������������������츬츭츮츯츲츴츶츷츸츹츺츻츼츽츾츿칀칁칂칃칄칅칆칇칈칉������칊칋칌칍칎칏칐칑칒칓칔칕칖칗칚칛칝칞칢칣칤칥칦칧칪칬������칮칯칰칱칲칳칶칷칹칺칻칽칾칿캀캁캂캃캆캈캊캋캌캍캎캏캒캓캕캖캗캙�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[175].length; ++j) if(D[175][j].charCodeAt(0) !== 0xFFFD) { e[D[175][j]] = 44800 + j; d[44800 + j] = D[175][j];}\nD[176] = \"�����������������������������������������������������������������캚캛캜캝캞캟캢캦캧캨캩캪캫캮캯캰캱캲캳캴캵캶캷캸캹캺������캻캼캽캾캿컀컂컃컄컅컆컇컈컉컊컋컌컍컎컏컐컑컒컓컔컕������컖컗컘컙컚컛컜컝컞컟컠컡컢컣컦컧컩컪컭컮컯컰컱컲컳컶컺컻컼컽컾컿가각간갇갈갉갊감갑값갓갔강갖갗같갚갛개객갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆�\".split(\"\");\nfor(j = 0; j != D[176].length; ++j) if(D[176][j].charCodeAt(0) !== 0xFFFD) { e[D[176][j]] = 45056 + j; d[45056 + j] = D[176][j];}\nD[177] = \"�����������������������������������������������������������������켂켃켅켆켇켉켊켋켌켍켎켏켒켔켖켗켘켙켚켛켝켞켟켡켢켣������켥켦켧켨켩켪켫켮켲켳켴켵켶켷켹켺켻켼켽켾켿콀콁콂콃콄������콅콆콇콈콉콊콋콌콍콎콏콐콑콒콓콖콗콙콚콛콝콞콟콠콡콢콣콦콨콪콫콬괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸�\".split(\"\");\nfor(j = 0; j != D[177].length; ++j) if(D[177][j].charCodeAt(0) !== 0xFFFD) { e[D[177][j]] = 45312 + j; d[45312 + j] = D[177][j];}\nD[178] = \"�����������������������������������������������������������������콭콮콯콲콳콵콶콷콹콺콻콼콽콾콿쾁쾂쾃쾄쾆쾇쾈쾉쾊쾋쾍������쾎쾏쾐쾑쾒쾓쾔쾕쾖쾗쾘쾙쾚쾛쾜쾝쾞쾟쾠쾢쾣쾤쾥쾦쾧쾩������쾪쾫쾬쾭쾮쾯쾱쾲쾳쾴쾵쾶쾷쾸쾹쾺쾻쾼쾽쾾쾿쿀쿁쿂쿃쿅쿆쿇쿈쿉쿊쿋깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙�\".split(\"\");\nfor(j = 0; j != D[178].length; ++j) if(D[178][j].charCodeAt(0) !== 0xFFFD) { e[D[178][j]] = 45568 + j; d[45568 + j] = D[178][j];}\nD[179] = \"�����������������������������������������������������������������쿌쿍쿎쿏쿐쿑쿒쿓쿔쿕쿖쿗쿘쿙쿚쿛쿜쿝쿞쿟쿢쿣쿥쿦쿧쿩������쿪쿫쿬쿭쿮쿯쿲쿴쿶쿷쿸쿹쿺쿻쿽쿾쿿퀁퀂퀃퀅퀆퀇퀈퀉퀊������퀋퀌퀍퀎퀏퀐퀒퀓퀔퀕퀖퀗퀙퀚퀛퀜퀝퀞퀟퀠퀡퀢퀣퀤퀥퀦퀧퀨퀩퀪퀫퀬끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫났낭낮낯낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝�\".split(\"\");\nfor(j = 0; j != D[179].length; ++j) if(D[179][j].charCodeAt(0) !== 0xFFFD) { e[D[179][j]] = 45824 + j; d[45824 + j] = D[179][j];}\nD[180] = \"�����������������������������������������������������������������퀮퀯퀰퀱퀲퀳퀶퀷퀹퀺퀻퀽퀾퀿큀큁큂큃큆큈큊큋큌큍큎큏������큑큒큓큕큖큗큙큚큛큜큝큞큟큡큢큣큤큥큦큧큨큩큪큫큮큯������큱큲큳큵큶큷큸큹큺큻큾큿킀킂킃킄킅킆킇킈킉킊킋킌킍킎킏킐킑킒킓킔뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫달닭닮닯닳담답닷닸당닺닻닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥�\".split(\"\");\nfor(j = 0; j != D[180].length; ++j) if(D[180][j].charCodeAt(0) !== 0xFFFD) { e[D[180][j]] = 46080 + j; d[46080 + j] = D[180][j];}\nD[181] = \"�����������������������������������������������������������������킕킖킗킘킙킚킛킜킝킞킟킠킡킢킣킦킧킩킪킫킭킮킯킰킱킲������킳킶킸킺킻킼킽킾킿탂탃탅탆탇탊탋탌탍탎탏탒탖탗탘탙탚������탛탞탟탡탢탣탥탦탧탨탩탪탫탮탲탳탴탵탶탷탹탺탻탼탽탾탿턀턁턂턃턄덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸�\".split(\"\");\nfor(j = 0; j != D[181].length; ++j) if(D[181][j].charCodeAt(0) !== 0xFFFD) { e[D[181][j]] = 46336 + j; d[46336 + j] = D[181][j];}\nD[182] = \"�����������������������������������������������������������������턅턆턇턈턉턊턋턌턎턏턐턑턒턓턔턕턖턗턘턙턚턛턜턝턞턟������턠턡턢턣턤턥턦턧턨턩턪턫턬턭턮턯턲턳턵턶턷턹턻턼턽턾������턿텂텆텇텈텉텊텋텎텏텑텒텓텕텖텗텘텙텚텛텞텠텢텣텤텥텦텧텩텪텫텭땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗�\".split(\"\");\nfor(j = 0; j != D[182].length; ++j) if(D[182][j].charCodeAt(0) !== 0xFFFD) { e[D[182][j]] = 46592 + j; d[46592 + j] = D[182][j];}\nD[183] = \"�����������������������������������������������������������������텮텯텰텱텲텳텴텵텶텷텸텹텺텻텽텾텿톀톁톂톃톅톆톇톉톊������톋톌톍톎톏톐톑톒톓톔톕톖톗톘톙톚톛톜톝톞톟톢톣톥톦톧������톩톪톫톬톭톮톯톲톴톶톷톸톹톻톽톾톿퇁퇂퇃퇄퇅퇆퇇퇈퇉퇊퇋퇌퇍퇎퇏래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩�\".split(\"\");\nfor(j = 0; j != D[183].length; ++j) if(D[183][j].charCodeAt(0) !== 0xFFFD) { e[D[183][j]] = 46848 + j; d[46848 + j] = D[183][j];}\nD[184] = \"�����������������������������������������������������������������퇐퇑퇒퇓퇔퇕퇖퇗퇙퇚퇛퇜퇝퇞퇟퇠퇡퇢퇣퇤퇥퇦퇧퇨퇩퇪������퇫퇬퇭퇮퇯퇰퇱퇲퇳퇵퇶퇷퇹퇺퇻퇼퇽퇾퇿툀툁툂툃툄툅툆������툈툊툋툌툍툎툏툑툒툓툔툕툖툗툘툙툚툛툜툝툞툟툠툡툢툣툤툥툦툧툨툩륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많맏말맑맒맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼�\".split(\"\");\nfor(j = 0; j != D[184].length; ++j) if(D[184][j].charCodeAt(0) !== 0xFFFD) { e[D[184][j]] = 47104 + j; d[47104 + j] = D[184][j];}\nD[185] = \"�����������������������������������������������������������������툪툫툮툯툱툲툳툵툶툷툸툹툺툻툾퉀퉂퉃퉄퉅퉆퉇퉉퉊퉋퉌������퉍퉎퉏퉐퉑퉒퉓퉔퉕퉖퉗퉘퉙퉚퉛퉝퉞퉟퉠퉡퉢퉣퉥퉦퉧퉨������퉩퉪퉫퉬퉭퉮퉯퉰퉱퉲퉳퉴퉵퉶퉷퉸퉹퉺퉻퉼퉽퉾퉿튂튃튅튆튇튉튊튋튌묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바박밖밗반받발밝밞밟밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗�\".split(\"\");\nfor(j = 0; j != D[185].length; ++j) if(D[185][j].charCodeAt(0) !== 0xFFFD) { e[D[185][j]] = 47360 + j; d[47360 + j] = D[185][j];}\nD[186] = \"�����������������������������������������������������������������튍튎튏튒튓튔튖튗튘튙튚튛튝튞튟튡튢튣튥튦튧튨튩튪튫튭������튮튯튰튲튳튴튵튶튷튺튻튽튾틁틃틄틅틆틇틊틌틍틎틏틐틑������틒틓틕틖틗틙틚틛틝틞틟틠틡틢틣틦틧틨틩틪틫틬틭틮틯틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤�\".split(\"\");\nfor(j = 0; j != D[186].length; ++j) if(D[186][j].charCodeAt(0) !== 0xFFFD) { e[D[186][j]] = 47616 + j; d[47616 + j] = D[186][j];}\nD[187] = \"�����������������������������������������������������������������틻틼틽틾틿팂팄팆팇팈팉팊팋팏팑팒팓팕팗팘팙팚팛팞팢팣������팤팦팧팪팫팭팮팯팱팲팳팴팵팶팷팺팾팿퍀퍁퍂퍃퍆퍇퍈퍉������퍊퍋퍌퍍퍎퍏퍐퍑퍒퍓퍔퍕퍖퍗퍘퍙퍚퍛퍜퍝퍞퍟퍠퍡퍢퍣퍤퍥퍦퍧퍨퍩빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤�\".split(\"\");\nfor(j = 0; j != D[187].length; ++j) if(D[187][j].charCodeAt(0) !== 0xFFFD) { e[D[187][j]] = 47872 + j; d[47872 + j] = D[187][j];}\nD[188] = \"�����������������������������������������������������������������퍪퍫퍬퍭퍮퍯퍰퍱퍲퍳퍴퍵퍶퍷퍸퍹퍺퍻퍾퍿펁펂펃펅펆펇������펈펉펊펋펎펒펓펔펕펖펗펚펛펝펞펟펡펢펣펤펥펦펧펪펬펮������펯펰펱펲펳펵펶펷펹펺펻펽펾펿폀폁폂폃폆폇폊폋폌폍폎폏폑폒폓폔폕폖샥샨샬샴샵샷샹섀섄섈섐섕서석섞섟선섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭�\".split(\"\");\nfor(j = 0; j != D[188].length; ++j) if(D[188][j].charCodeAt(0) !== 0xFFFD) { e[D[188][j]] = 48128 + j; d[48128 + j] = D[188][j];}\nD[189] = \"�����������������������������������������������������������������폗폙폚폛폜폝폞폟폠폢폤폥폦폧폨폩폪폫폮폯폱폲폳폵폶폷������폸폹폺폻폾퐀퐂퐃퐄퐅퐆퐇퐉퐊퐋퐌퐍퐎퐏퐐퐑퐒퐓퐔퐕퐖������퐗퐘퐙퐚퐛퐜퐞퐟퐠퐡퐢퐣퐤퐥퐦퐧퐨퐩퐪퐫퐬퐭퐮퐯퐰퐱퐲퐳퐴퐵퐶퐷숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰�\".split(\"\");\nfor(j = 0; j != D[189].length; ++j) if(D[189][j].charCodeAt(0) !== 0xFFFD) { e[D[189][j]] = 48384 + j; d[48384 + j] = D[189][j];}\nD[190] = \"�����������������������������������������������������������������퐸퐹퐺퐻퐼퐽퐾퐿푁푂푃푅푆푇푈푉푊푋푌푍푎푏푐푑푒푓������푔푕푖푗푘푙푚푛푝푞푟푡푢푣푥푦푧푨푩푪푫푬푮푰푱푲������푳푴푵푶푷푺푻푽푾풁풃풄풅풆풇풊풌풎풏풐풑풒풓풕풖풗풘풙풚풛풜풝쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄업없엇었엉엊엌엎�\".split(\"\");\nfor(j = 0; j != D[190].length; ++j) if(D[190][j].charCodeAt(0) !== 0xFFFD) { e[D[190][j]] = 48640 + j; d[48640 + j] = D[190][j];}\nD[191] = \"�����������������������������������������������������������������풞풟풠풡풢풣풤풥풦풧풨풪풫풬풭풮풯풰풱풲풳풴풵풶풷풸������풹풺풻풼풽풾풿퓀퓁퓂퓃퓄퓅퓆퓇퓈퓉퓊퓋퓍퓎퓏퓑퓒퓓퓕������퓖퓗퓘퓙퓚퓛퓝퓞퓠퓡퓢퓣퓤퓥퓦퓧퓩퓪퓫퓭퓮퓯퓱퓲퓳퓴퓵퓶퓷퓹퓺퓼에엑엔엘엠엡엣엥여역엮연열엶엷염엽엾엿였영옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨�\".split(\"\");\nfor(j = 0; j != D[191].length; ++j) if(D[191][j].charCodeAt(0) !== 0xFFFD) { e[D[191][j]] = 48896 + j; d[48896 + j] = D[191][j];}\nD[192] = \"�����������������������������������������������������������������퓾퓿픀픁픂픃픅픆픇픉픊픋픍픎픏픐픑픒픓픖픘픙픚픛픜픝������픞픟픠픡픢픣픤픥픦픧픨픩픪픫픬픭픮픯픰픱픲픳픴픵픶픷������픸픹픺픻픾픿핁핂핃핅핆핇핈핉핊핋핎핐핒핓핔핕핖핗핚핛핝핞핟핡핢핣웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응읒읓읔읕읖읗의읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊�\".split(\"\");\nfor(j = 0; j != D[192].length; ++j) if(D[192][j].charCodeAt(0) !== 0xFFFD) { e[D[192][j]] = 49152 + j; d[49152 + j] = D[192][j];}\nD[193] = \"�����������������������������������������������������������������핤핦핧핪핬핮핯핰핱핲핳핶핷핹핺핻핽핾핿햀햁햂햃햆햊햋������햌햍햎햏햑햒햓햔햕햖햗햘햙햚햛햜햝햞햟햠햡햢햣햤햦햧������햨햩햪햫햬햭햮햯햰햱햲햳햴햵햶햷햸햹햺햻햼햽햾햿헀헁헂헃헄헅헆헇점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓�\".split(\"\");\nfor(j = 0; j != D[193].length; ++j) if(D[193][j].charCodeAt(0) !== 0xFFFD) { e[D[193][j]] = 49408 + j; d[49408 + j] = D[193][j];}\nD[194] = \"�����������������������������������������������������������������헊헋헍헎헏헑헓헔헕헖헗헚헜헞헟헠헡헢헣헦헧헩헪헫헭헮������헯헰헱헲헳헶헸헺헻헼헽헾헿혂혃혅혆혇혉혊혋혌혍혎혏혒������혖혗혘혙혚혛혝혞혟혡혢혣혥혦혧혨혩혪혫혬혮혯혰혱혲혳혴혵혶혷혺혻징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻�\".split(\"\");\nfor(j = 0; j != D[194].length; ++j) if(D[194][j].charCodeAt(0) !== 0xFFFD) { e[D[194][j]] = 49664 + j; d[49664 + j] = D[194][j];}\nD[195] = \"�����������������������������������������������������������������혽혾혿홁홂홃홄홆홇홊홌홎홏홐홒홓홖홗홙홚홛홝홞홟홠홡������홢홣홤홥홦홨홪홫홬홭홮홯홲홳홵홶홷홸홹홺홻홼홽홾홿횀������횁횂횄횆횇횈횉횊횋횎횏횑횒횓횕횖횗횘횙횚횛횜횞횠횢횣횤횥횦횧횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층�\".split(\"\");\nfor(j = 0; j != D[195].length; ++j) if(D[195][j].charCodeAt(0) !== 0xFFFD) { e[D[195][j]] = 49920 + j; d[49920 + j] = D[195][j];}\nD[196] = \"�����������������������������������������������������������������횫횭횮횯횱횲횳횴횵횶횷횸횺횼횽횾횿훀훁훂훃훆훇훉훊훋������훍훎훏훐훒훓훕훖훘훚훛훜훝훞훟훡훢훣훥훦훧훩훪훫훬훭������훮훯훱훲훳훴훶훷훸훹훺훻훾훿휁휂휃휅휆휇휈휉휊휋휌휍휎휏휐휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼�\".split(\"\");\nfor(j = 0; j != D[196].length; ++j) if(D[196][j].charCodeAt(0) !== 0xFFFD) { e[D[196][j]] = 50176 + j; d[50176 + j] = D[196][j];}\nD[197] = \"�����������������������������������������������������������������휕휖휗휚휛휝휞휟휡휢휣휤휥휦휧휪휬휮휯휰휱휲휳휶휷휹������휺휻휽휾휿흀흁흂흃흅흆흈흊흋흌흍흎흏흒흓흕흚흛흜흝흞������흟흢흤흦흧흨흪흫흭흮흯흱흲흳흵흶흷흸흹흺흻흾흿힀힂힃힄힅힆힇힊힋큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜�\".split(\"\");\nfor(j = 0; j != D[197].length; ++j) if(D[197][j].charCodeAt(0) !== 0xFFFD) { e[D[197][j]] = 50432 + j; d[50432 + j] = D[197][j];}\nD[198] = \"�����������������������������������������������������������������힍힎힏힑힒힓힔힕힖힗힚힜힞힟힠힡힢힣������������������������������������������������������������������������������퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁�\".split(\"\");\nfor(j = 0; j != D[198].length; ++j) if(D[198][j].charCodeAt(0) !== 0xFFFD) { e[D[198][j]] = 50688 + j; d[50688 + j] = D[198][j];}\nD[199] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠�\".split(\"\");\nfor(j = 0; j != D[199].length; ++j) if(D[199][j].charCodeAt(0) !== 0xFFFD) { e[D[199][j]] = 50944 + j; d[50944 + j] = D[199][j];}\nD[200] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝�\".split(\"\");\nfor(j = 0; j != D[200].length; ++j) if(D[200][j].charCodeAt(0) !== 0xFFFD) { e[D[200][j]] = 51200 + j; d[51200 + j] = D[200][j];}\nD[202] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕刻却各恪慤殼珏脚覺角閣侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間乫喝曷渴碣竭葛褐蝎鞨勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕�\".split(\"\");\nfor(j = 0; j != D[202].length; ++j) if(D[202][j].charCodeAt(0) !== 0xFFFD) { e[D[202][j]] = 51712 + j; d[51712 + j] = D[202][j];}\nD[203] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開喀客坑更粳羹醵倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸乾件健巾建愆楗腱虔蹇鍵騫乞傑杰桀儉劍劒檢�\".split(\"\");\nfor(j = 0; j != D[203].length; ++j) if(D[203][j].charCodeAt(0) !== 0xFFFD) { e[D[203][j]] = 51968 + j; d[51968 + j] = D[203][j];}\nD[204] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������瞼鈐黔劫怯迲偈憩揭擊格檄激膈覡隔堅牽犬甄絹繭肩見譴遣鵑抉決潔結缺訣兼慊箝謙鉗鎌京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨係啓堺契季屆悸戒桂械�\".split(\"\");\nfor(j = 0; j != D[204].length; ++j) if(D[204][j].charCodeAt(0) !== 0xFFFD) { e[D[204][j]] = 52224 + j; d[52224 + j] = D[204][j];}\nD[205] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������棨溪界癸磎稽系繫繼計誡谿階鷄古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓哭斛曲梏穀谷鵠困坤崑昆梱棍滾琨袞鯤汨滑骨供公共功孔工恐恭拱控攻珙空蚣貢鞏串寡戈果瓜�\".split(\"\");\nfor(j = 0; j != D[205].length; ++j) if(D[205][j].charCodeAt(0) !== 0xFFFD) { e[D[205][j]] = 52480 + j; d[52480 + j] = D[205][j];}\nD[206] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������科菓誇課跨過鍋顆廓槨藿郭串冠官寬慣棺款灌琯瓘管罐菅觀貫關館刮恝括适侊光匡壙廣曠洸炚狂珖筐胱鑛卦掛罫乖傀塊壞怪愧拐槐魁宏紘肱轟交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久九仇俱具勾�\".split(\"\");\nfor(j = 0; j != D[206].length; ++j) if(D[206][j].charCodeAt(0) !== 0xFFFD) { e[D[206][j]] = 52736 + j; d[52736 + j] = D[206][j];}\nD[207] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局菊鞠鞫麴君窘群裙軍郡堀屈掘窟宮弓穹窮芎躬倦券勸卷圈拳捲權淃眷厥獗蕨蹶闕机櫃潰詭軌饋句晷歸貴�\".split(\"\");\nfor(j = 0; j != D[207].length; ++j) if(D[207][j].charCodeAt(0) !== 0xFFFD) { e[D[207][j]] = 52992 + j; d[52992 + j] = D[207][j];}\nD[208] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������鬼龜叫圭奎揆槻珪硅窺竅糾葵規赳逵閨勻均畇筠菌鈞龜橘克剋劇戟棘極隙僅劤勤懃斤根槿瑾筋芹菫覲謹近饉契今妗擒昑檎琴禁禽芩衾衿襟金錦伋及急扱汲級給亘兢矜肯企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣�\".split(\"\");\nfor(j = 0; j != D[208].length; ++j) if(D[208][j].charCodeAt(0) !== 0xFFFD) { e[D[208][j]] = 53248 + j; d[53248 + j] = D[208][j];}\nD[209] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒緊佶吉拮桔金喫儺喇奈娜懦懶拏拿癩羅蘿螺裸邏那樂洛烙珞落諾酪駱亂卵暖欄煖爛蘭難鸞捏捺南嵐枏楠湳濫男藍襤拉�\".split(\"\");\nfor(j = 0; j != D[209].length; ++j) if(D[209][j].charCodeAt(0) !== 0xFFFD) { e[D[209][j]] = 53504 + j; d[53504 + j] = D[209][j];}\nD[210] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������納臘蠟衲囊娘廊朗浪狼郎乃來內奈柰耐冷女年撚秊念恬拈捻寧寗努勞奴弩怒擄櫓爐瑙盧老蘆虜路露駑魯鷺碌祿綠菉錄鹿論壟弄濃籠聾膿農惱牢磊腦賂雷尿壘屢樓淚漏累縷陋嫩訥杻紐勒肋凜凌稜綾能菱陵尼泥匿溺多茶�\".split(\"\");\nfor(j = 0; j != D[210].length; ++j) if(D[210][j].charCodeAt(0) !== 0xFFFD) { e[D[210][j]] = 53760 + j; d[53760 + j] = D[210][j];}\nD[211] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛撻澾獺疸達啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟沓畓答踏遝唐堂塘幢戇撞棠當糖螳黨代垈坮大對岱帶待戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃�\".split(\"\");\nfor(j = 0; j != D[211].length; ++j) if(D[211][j].charCodeAt(0) !== 0xFFFD) { e[D[211][j]] = 54016 + j; d[54016 + j] = D[211][j];}\nD[212] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������棹櫂淘渡滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜毒瀆牘犢獨督禿篤纛讀墩惇敦旽暾沌焞燉豚頓乭突仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅兜斗杜枓痘竇荳讀豆逗頭屯臀芚遁遯鈍得嶝橙燈登等藤謄鄧騰喇懶拏癩羅�\".split(\"\");\nfor(j = 0; j != D[212].length; ++j) if(D[212][j].charCodeAt(0) !== 0xFFFD) { e[D[212][j]] = 54272 + j; d[54272 + j] = D[212][j];}\nD[213] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������蘿螺裸邏樂洛烙珞絡落諾酪駱丹亂卵欄欒瀾爛蘭鸞剌辣嵐擥攬欖濫籃纜藍襤覽拉臘蠟廊朗浪狼琅瑯螂郞來崍徠萊冷掠略亮倆兩凉梁樑粮粱糧良諒輛量侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷瀝礫轢靂憐戀攣漣�\".split(\"\");\nfor(j = 0; j != D[213].length; ++j) if(D[213][j].charCodeAt(0) !== 0xFFFD) { e[D[213][j]] = 54528 + j; d[54528 + j] = D[213][j];}\nD[214] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������煉璉練聯蓮輦連鍊冽列劣洌烈裂廉斂殮濂簾獵令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡例澧禮醴隷勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵碌祿綠菉錄鹿麓論壟弄朧瀧瓏籠聾儡瀨牢磊賂賚賴雷了僚寮廖料燎療瞭聊蓼�\".split(\"\");\nfor(j = 0; j != D[214].length; ++j) if(D[214][j].charCodeAt(0) !== 0xFFFD) { e[D[214][j]] = 54784 + j; d[54784 + j] = D[214][j];}\nD[215] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������遼鬧龍壘婁屢樓淚漏瘻累縷蔞褸鏤陋劉旒柳榴流溜瀏琉瑠留瘤硫謬類六戮陸侖倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾菱陵俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉吝潾燐璘藺躪隣鱗麟林淋琳臨霖砬�\".split(\"\");\nfor(j = 0; j != D[215].length; ++j) if(D[215][j].charCodeAt(0) !== 0xFFFD) { e[D[215][j]] = 55040 + j; d[55040 + j] = D[215][j];}\nD[216] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻唜抹末沫茉襪靺亡妄忘忙望網罔芒茫莽輞邙埋妹媒寐昧枚梅每煤罵買賣邁魅脈貊陌驀麥孟氓猛盲盟萌冪覓免冕勉棉沔眄眠綿緬面麵滅�\".split(\"\");\nfor(j = 0; j != D[216].length; ++j) if(D[216][j].charCodeAt(0) !== 0xFFFD) { e[D[216][j]] = 55296 + j; d[55296 + j] = D[216][j];}\nD[217] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������蔑冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌木沐牧目睦穆鶩歿沒夢朦蒙卯墓妙廟描昴杳渺猫竗苗錨務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡墨默們刎吻問文�\".split(\"\");\nfor(j = 0; j != D[217].length; ++j) if(D[217][j].charCodeAt(0) !== 0xFFFD) { e[D[217][j]] = 55552 + j; d[55552 + j] = D[217][j];}\nD[218] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������汶紊紋聞蚊門雯勿沕物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴岷悶愍憫敏旻旼民泯玟珉緡閔密蜜謐剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯勃拔撥渤潑�\".split(\"\");\nfor(j = 0; j != D[218].length; ++j) if(D[218][j].charCodeAt(0) !== 0xFFFD) { e[D[218][j]] = 55808 + j; d[55808 + j] = D[218][j];}\nD[219] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������發跋醱鉢髮魃倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪伯佰帛柏栢白百魄幡樊煩燔番磻繁蕃藩飜伐筏罰閥凡帆梵氾汎泛犯範范法琺僻劈壁擘檗璧癖�\".split(\"\");\nfor(j = 0; j != D[219].length; ++j) if(D[219][j].charCodeAt(0) !== 0xFFFD) { e[D[219][j]] = 56064 + j; d[56064 + j] = D[219][j];}\nD[220] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������碧蘗闢霹便卞弁變辨辯邊別瞥鱉鼈丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈保堡報寶普步洑湺潽珤甫菩補褓譜輔伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒本乶俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳不付俯傅剖副否咐埠夫婦�\".split(\"\");\nfor(j = 0; j != D[220].length; ++j) if(D[220][j].charCodeAt(0) !== 0xFFFD) { e[D[220][j]] = 56320 + j; d[56320 + j] = D[220][j];}\nD[221] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰不佛弗彿拂崩朋棚硼繃鵬丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥�\".split(\"\");\nfor(j = 0; j != D[221].length; ++j) if(D[221][j].charCodeAt(0) !== 0xFFFD) { e[D[221][j]] = 56576 + j; d[56576 + j] = D[221][j];}\nD[222] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������脾臂菲蜚裨誹譬費鄙非飛鼻嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻憑氷聘騁乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝削數朔索�\".split(\"\");\nfor(j = 0; j != D[222].length; ++j) if(D[222][j].charCodeAt(0) !== 0xFFFD) { e[D[222][j]] = 56832 + j; d[56832 + j] = D[222][j];}\nD[223] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������傘刪山散汕珊産疝算蒜酸霰乷撒殺煞薩三參杉森渗芟蔘衫揷澁鈒颯上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署�\".split(\"\");\nfor(j = 0; j != D[223].length; ++j) if(D[223][j].charCodeAt(0) !== 0xFFFD) { e[D[223][j]] = 57088 + j; d[57088 + j] = D[223][j];}\nD[224] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������胥舒薯西誓逝鋤黍鼠夕奭席惜昔晳析汐淅潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮卨屑楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾贍閃陝攝涉燮葉城姓宬性惺成星晟猩珹盛省筬�\".split(\"\");\nfor(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}\nD[225] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������聖聲腥誠醒世勢歲洗稅笹細說貰召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷俗屬束涑粟續謖贖速孫巽損蓀遜飡率宋悚松淞訟誦送頌刷殺灑碎鎖衰釗修受嗽囚垂壽嫂守岫峀帥愁�\".split(\"\");\nfor(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}\nD[226] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚叔塾夙孰宿淑潚熟琡璹肅菽巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴戌術述鉥崇崧�\".split(\"\");\nfor(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}\nD[227] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������嵩瑟膝蝨濕拾習褶襲丞乘僧勝升承昇繩蠅陞侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺埴寔式息拭植殖湜熄篒蝕識軾食飾伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅失室實悉審尋心沁�\".split(\"\");\nfor(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}\nD[228] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������沈深瀋甚芯諶什十拾雙氏亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷安岸按晏案眼雁鞍顔鮟斡謁軋閼唵岩巖庵暗癌菴闇壓押狎鴨仰央怏昻殃秧鴦厓哀埃崖愛曖涯碍艾隘靄厄扼掖液縊腋額�\".split(\"\");\nfor(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}\nD[229] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������櫻罌鶯鸚也倻冶夜惹揶椰爺耶若野弱掠略約若葯蒻藥躍亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養圄御於漁瘀禦語馭魚齬億憶抑檍臆偃堰彦焉言諺孼蘖俺儼嚴奄掩淹嶪業円予余勵呂女如廬�\".split(\"\");\nfor(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}\nD[230] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎亦力域役易曆歷疫繹譯轢逆驛嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶列劣咽悅涅烈熱裂說閱厭廉念捻染殮炎焰琰艶苒�\".split(\"\");\nfor(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}\nD[231] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������簾閻髥鹽曄獵燁葉令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳�\".split(\"\");\nfor(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}\nD[232] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������烏熬獒筽蜈誤鰲鼇屋沃獄玉鈺溫瑥瘟穩縕蘊兀壅擁瓮甕癰翁邕雍饔渦瓦窩窪臥蛙蝸訛婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬巍猥畏了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療�\".split(\"\");\nfor(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}\nD[233] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������窈窯繇繞耀腰蓼蟯要謠遙遼邀饒慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩勖彧旭昱栯煜稶郁頊云暈橒殞澐熉耘芸蕓�\".split(\"\");\nfor(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}\nD[234] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������運隕雲韻蔚鬱亐熊雄元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛月越鉞位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜�\".split(\"\");\nfor(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}\nD[235] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類六堉戮毓肉育陸倫允奫尹崙淪潤玧胤贇輪鈗閏律慄栗率聿戎瀜絨融隆垠恩慇殷誾銀隱乙吟淫蔭陰音飮揖泣邑凝應膺鷹依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼�\".split(\"\");\nfor(j = 0; j != D[235].length; ++j) if(D[235][j].charCodeAt(0) !== 0xFFFD) { e[D[235][j]] = 60160 + j; d[60160 + j] = D[235][j];}\nD[236] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������議醫二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟一佚佾壹日溢逸鎰馹任壬妊姙恁林淋稔臨荏賃入卄�\".split(\"\");\nfor(j = 0; j != D[236].length; ++j) if(D[236][j].charCodeAt(0) !== 0xFFFD) { e[D[236][j]] = 60416 + j; d[60416 + j] = D[236][j];}\nD[237] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������立笠粒仍剩孕芿仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌作勺嚼斫昨灼炸爵綽芍酌雀鵲孱棧殘潺盞岑暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長�\".split(\"\");\nfor(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}\nD[238] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������障再哉在宰才材栽梓渽滓災縡裁財載齋齎爭箏諍錚佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱�\".split(\"\");\nfor(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}\nD[239] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞切截折浙癤竊節絶占岾店漸点粘霑鮎點接摺蝶丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖�\".split(\"\");\nfor(j = 0; j != D[239].length; ++j) if(D[239][j].charCodeAt(0) !== 0xFFFD) { e[D[239][j]] = 61184 + j; d[61184 + j] = D[239][j];}\nD[240] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������靜頂鼎制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥族簇足鏃存尊卒拙猝倧宗從悰慫棕淙琮種終綜縱腫�\".split(\"\");\nfor(j = 0; j != D[240].length; ++j) if(D[240][j].charCodeAt(0) !== 0xFFFD) { e[D[240][j]] = 61440 + j; d[61440 + j] = D[240][j];}\nD[241] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������踪踵鍾鐘佐坐左座挫罪主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐竹粥俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿茁中仲衆重卽櫛楫汁葺增憎曾拯烝甑症繒蒸證贈之只�\".split(\"\");\nfor(j = 0; j != D[241].length; ++j) if(D[241][j].charCodeAt(0) !== 0xFFFD) { e[D[241][j]] = 61696 + j; d[61696 + j] = D[241][j];}\nD[242] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲直稙稷織職唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭斟朕什執潗緝輯�\".split(\"\");\nfor(j = 0; j != D[242].length; ++j) if(D[242][j].charCodeAt(0) !== 0xFFFD) { e[D[242][j]] = 61952 + j; d[61952 + j] = D[242][j];}\nD[243] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������鏶集徵懲澄且侘借叉嗟嵯差次此磋箚茶蹉車遮捉搾着窄錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌刹察擦札紮僭參塹慘慙懺斬站讒讖倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼債埰寀寨彩採砦綵菜蔡采釵冊柵策�\".split(\"\");\nfor(j = 0; j != D[243].length; ++j) if(D[243][j].charCodeAt(0) !== 0xFFFD) { e[D[243][j]] = 62208 + j; d[62208 + j] = D[243][j];}\nD[244] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆凸哲喆徹撤澈綴輟轍鐵僉尖沾添甛瞻簽籤詹諂堞妾帖捷牒疊睫諜貼輒廳晴淸聽菁請靑鯖切剃替涕滯締諦逮遞體初剿哨憔抄招梢�\".split(\"\");\nfor(j = 0; j != D[244].length; ++j) if(D[244][j].charCodeAt(0) !== 0xFFFD) { e[D[244][j]] = 62464 + j; d[62464 + j] = D[244][j];}\nD[245] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮促囑燭矗蜀觸寸忖村邨叢塚寵悤憁摠總聰蔥銃撮催崔最墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍丑畜祝竺筑築縮蓄蹙蹴軸逐春椿瑃出朮黜充忠沖蟲衝衷悴膵萃�\".split(\"\");\nfor(j = 0; j != D[245].length; ++j) if(D[245][j].charCodeAt(0) !== 0xFFFD) { e[D[245][j]] = 62720 + j; d[62720 + j] = D[245][j];}\nD[246] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲側仄厠惻測層侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸琛砧針鍼蟄秤稱快他咤唾墮妥惰打拖朶楕舵陀馱駝倬卓啄坼度托拓擢晫柝濁濯琢琸託�\".split(\"\");\nfor(j = 0; j != D[246].length; ++j) if(D[246][j].charCodeAt(0) !== 0xFFFD) { e[D[246][j]] = 62976 + j; d[62976 + j] = D[246][j];}\nD[247] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������鐸呑嘆坦彈憚歎灘炭綻誕奪脫探眈耽貪塔搭榻宕帑湯糖蕩兌台太怠態殆汰泰笞胎苔跆邰颱宅擇澤撑攄兎吐土討慟桶洞痛筒統通堆槌腿褪退頹偸套妬投透鬪慝特闖坡婆巴把播擺杷波派爬琶破罷芭跛頗判坂板版瓣販辦鈑�\".split(\"\");\nfor(j = 0; j != D[247].length; ++j) if(D[247][j].charCodeAt(0) !== 0xFFFD) { e[D[247][j]] = 63232 + j; d[63232 + j] = D[247][j];}\nD[248] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������阪八叭捌佩唄悖敗沛浿牌狽稗覇貝彭澎烹膨愎便偏扁片篇編翩遍鞭騙貶坪平枰萍評吠嬖幣廢弊斃肺蔽閉陛佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑幅暴曝瀑爆輻俵剽彪慓杓標漂瓢票表豹飇飄驃�\".split(\"\");\nfor(j = 0; j != D[248].length; ++j) if(D[248][j].charCodeAt(0) !== 0xFFFD) { e[D[248][j]] = 63488 + j; d[63488 + j] = D[248][j];}\nD[249] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������品稟楓諷豊風馮彼披疲皮被避陂匹弼必泌珌畢疋筆苾馝乏逼下何厦夏廈昰河瑕荷蝦賀遐霞鰕壑學虐謔鶴寒恨悍旱汗漢澣瀚罕翰閑閒限韓割轄函含咸啣喊檻涵緘艦銜陷鹹合哈盒蛤閤闔陜亢伉姮嫦巷恒抗杭桁沆港缸肛航�\".split(\"\");\nfor(j = 0; j != D[249].length; ++j) if(D[249][j].charCodeAt(0) !== 0xFFFD) { e[D[249][j]] = 63744 + j; d[63744 + j] = D[249][j];}\nD[250] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������行降項亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸杏荇行享向嚮珦鄕響餉饗香噓墟虛許憲櫶獻軒歇險驗奕爀赫革俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯孑穴血頁嫌俠協夾峽挾浹狹脅脇莢鋏頰亨兄刑型�\".split(\"\");\nfor(j = 0; j != D[250].length; ++j) if(D[250][j].charCodeAt(0) !== 0xFFFD) { e[D[250][j]] = 64000 + j; d[64000 + j] = D[250][j];}\nD[251] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨兮彗惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥惑或酷婚昏混渾琿魂忽惚笏哄弘汞泓洪烘紅虹訌鴻化和嬅樺火畵�\".split(\"\");\nfor(j = 0; j != D[251].length; ++j) if(D[251][j].charCodeAt(0) !== 0xFFFD) { e[D[251][j]] = 64256 + j; d[64256 + j] = D[251][j];}\nD[252] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������禍禾花華話譁貨靴廓擴攫確碻穫丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥活滑猾豁闊凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄劃獲宖橫鐄哮嚆孝效斅曉梟涍淆�\".split(\"\");\nfor(j = 0; j != D[252].length; ++j) if(D[252][j].charCodeAt(0) !== 0xFFFD) { e[D[252][j]] = 64512 + j; d[64512 + j] = D[252][j];}\nD[253] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������爻肴酵驍侯候厚后吼喉嗅帿後朽煦珝逅勛勳塤壎焄熏燻薰訓暈薨喧暄煊萱卉喙毁彙徽揮暉煇諱輝麾休携烋畦虧恤譎鷸兇凶匈洶胸黑昕欣炘痕吃屹紇訖欠欽歆吸恰洽翕興僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲詰�\".split(\"\");\nfor(j = 0; j != D[253].length; ++j) if(D[253][j].charCodeAt(0) !== 0xFFFD) { e[D[253][j]] = 64768 + j; d[64768 + j] = D[253][j];}\nreturn {\"enc\": e, \"dec\": d }; })();\ncptable[950] = (function(){ var d = [], e = {}, D = [], j;\nD[0] = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}\nD[161] = \"���������������������������������������������������������������� ,、。.‧;:?!︰…‥﹐﹑﹒·﹔﹕﹖﹗|–︱—︳╴︴﹏()︵︶{}︷︸〔〕︹︺【】︻︼《》︽︾〈〉︿﹀「」﹁﹂『』﹃﹄﹙﹚����������������������������������﹛﹜﹝﹞‘’“”〝〞‵′#&*※§〃○●△▲◎☆★◇◆□■▽▼㊣℅¯ ̄_ˍ﹉﹊﹍﹎﹋﹌﹟﹠﹡+-×÷±√<>=≦≧≠∞≒≡﹢﹣﹤﹥﹦~∩∪⊥∠∟⊿㏒㏑∫∮∵∴♀♂⊕⊙↑↓←→↖↗↙↘∥∣/�\".split(\"\");\nfor(j = 0; j != D[161].length; ++j) if(D[161][j].charCodeAt(0) !== 0xFFFD) { e[D[161][j]] = 41216 + j; d[41216 + j] = D[161][j];}\nD[162] = \"����������������������������������������������������������������\∕﹨$¥〒¢£%@℃℉﹩﹪﹫㏕㎜㎝㎞㏎㎡㎎㎏㏄°兙兛兞兝兡兣嗧瓩糎▁▂▃▄▅▆▇█▏▎▍▌▋▊▉┼┴┬┤├▔─│▕┌┐└┘╭����������������������������������╮╰╯═╞╪╡◢◣◥◤╱╲╳0123456789ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ〡〢〣〤〥〦〧〨〩十卄卅ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv�\".split(\"\");\nfor(j = 0; j != D[162].length; ++j) if(D[162][j].charCodeAt(0) !== 0xFFFD) { e[D[162][j]] = 41472 + j; d[41472 + j] = D[162][j];}\nD[163] = \"����������������������������������������������������������������wxyzΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏ����������������������������������ㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ˙ˉˊˇˋ���������������������������������€������������������������������\".split(\"\");\nfor(j = 0; j != D[163].length; ++j) if(D[163][j].charCodeAt(0) !== 0xFFFD) { e[D[163][j]] = 41728 + j; d[41728 + j] = D[163][j];}\nD[164] = \"����������������������������������������������������������������一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才����������������������������������丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙�\".split(\"\");\nfor(j = 0; j != D[164].length; ++j) if(D[164][j].charCodeAt(0) !== 0xFFFD) { e[D[164][j]] = 41984 + j; d[41984 + j] = D[164][j];}\nD[165] = \"����������������������������������������������������������������世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外����������������������������������央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全�\".split(\"\");\nfor(j = 0; j != D[165].length; ++j) if(D[165][j].charCodeAt(0) !== 0xFFFD) { e[D[165][j]] = 42240 + j; d[42240 + j] = D[165][j];}\nD[166] = \"����������������������������������������������������������������共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年����������������������������������式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣�\".split(\"\");\nfor(j = 0; j != D[166].length; ++j) if(D[166][j].charCodeAt(0) !== 0xFFFD) { e[D[166][j]] = 42496 + j; d[42496 + j] = D[166][j];}\nD[167] = \"����������������������������������������������������������������作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍����������������������������������均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠�\".split(\"\");\nfor(j = 0; j != D[167].length; ++j) if(D[167][j].charCodeAt(0) !== 0xFFFD) { e[D[167][j]] = 42752 + j; d[42752 + j] = D[167][j];}\nD[168] = \"����������������������������������������������������������������杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒����������������������������������芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵�\".split(\"\");\nfor(j = 0; j != D[168].length; ++j) if(D[168][j].charCodeAt(0) !== 0xFFFD) { e[D[168][j]] = 43008 + j; d[43008 + j] = D[168][j];}\nD[169] = \"����������������������������������������������������������������咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居����������������������������������屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊�\".split(\"\");\nfor(j = 0; j != D[169].length; ++j) if(D[169][j].charCodeAt(0) !== 0xFFFD) { e[D[169][j]] = 43264 + j; d[43264 + j] = D[169][j];}\nD[170] = \"����������������������������������������������������������������昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠����������������������������������炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附�\".split(\"\");\nfor(j = 0; j != D[170].length; ++j) if(D[170][j].charCodeAt(0) !== 0xFFFD) { e[D[170][j]] = 43520 + j; d[43520 + j] = D[170][j];}\nD[171] = \"����������������������������������������������������������������陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品����������������������������������哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷�\".split(\"\");\nfor(j = 0; j != D[171].length; ++j) if(D[171][j].charCodeAt(0) !== 0xFFFD) { e[D[171][j]] = 43776 + j; d[43776 + j] = D[171][j];}\nD[172] = \"����������������������������������������������������������������拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗����������������������������������活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄�\".split(\"\");\nfor(j = 0; j != D[172].length; ++j) if(D[172][j].charCodeAt(0) !== 0xFFFD) { e[D[172][j]] = 44032 + j; d[44032 + j] = D[172][j];}\nD[173] = \"����������������������������������������������������������������耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥����������������������������������迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪�\".split(\"\");\nfor(j = 0; j != D[173].length; ++j) if(D[173][j].charCodeAt(0) !== 0xFFFD) { e[D[173][j]] = 44288 + j; d[44288 + j] = D[173][j];}\nD[174] = \"����������������������������������������������������������������哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙����������������������������������恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓�\".split(\"\");\nfor(j = 0; j != D[174].length; ++j) if(D[174][j].charCodeAt(0) !== 0xFFFD) { e[D[174][j]] = 44544 + j; d[44544 + j] = D[174][j];}\nD[175] = \"����������������������������������������������������������������浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷����������������������������������砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃�\".split(\"\");\nfor(j = 0; j != D[175].length; ++j) if(D[175][j].charCodeAt(0) !== 0xFFFD) { e[D[175][j]] = 44800 + j; d[44800 + j] = D[175][j];}\nD[176] = \"����������������������������������������������������������������虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡����������������������������������陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀�\".split(\"\");\nfor(j = 0; j != D[176].length; ++j) if(D[176][j].charCodeAt(0) !== 0xFFFD) { e[D[176][j]] = 45056 + j; d[45056 + j] = D[176][j];}\nD[177] = \"����������������������������������������������������������������娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽����������������������������������情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺�\".split(\"\");\nfor(j = 0; j != D[177].length; ++j) if(D[177][j].charCodeAt(0) !== 0xFFFD) { e[D[177][j]] = 45312 + j; d[45312 + j] = D[177][j];}\nD[178] = \"����������������������������������������������������������������毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶����������������������������������瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼�\".split(\"\");\nfor(j = 0; j != D[178].length; ++j) if(D[178][j].charCodeAt(0) !== 0xFFFD) { e[D[178][j]] = 45568 + j; d[45568 + j] = D[178][j];}\nD[179] = \"����������������������������������������������������������������莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途����������������������������������部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠�\".split(\"\");\nfor(j = 0; j != D[179].length; ++j) if(D[179][j].charCodeAt(0) !== 0xFFFD) { e[D[179][j]] = 45824 + j; d[45824 + j] = D[179][j];}\nD[180] = \"����������������������������������������������������������������婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍����������������������������������插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋�\".split(\"\");\nfor(j = 0; j != D[180].length; ++j) if(D[180][j].charCodeAt(0) !== 0xFFFD) { e[D[180][j]] = 46080 + j; d[46080 + j] = D[180][j];}\nD[181] = \"����������������������������������������������������������������溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘����������������������������������窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁�\".split(\"\");\nfor(j = 0; j != D[181].length; ++j) if(D[181][j].charCodeAt(0) !== 0xFFFD) { e[D[181][j]] = 46336 + j; d[46336 + j] = D[181][j];}\nD[182] = \"����������������������������������������������������������������詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑����������������������������������間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼�\".split(\"\");\nfor(j = 0; j != D[182].length; ++j) if(D[182][j].charCodeAt(0) !== 0xFFFD) { e[D[182][j]] = 46592 + j; d[46592 + j] = D[182][j];}\nD[183] = \"����������������������������������������������������������������媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業����������������������������������楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督�\".split(\"\");\nfor(j = 0; j != D[183].length; ++j) if(D[183][j].charCodeAt(0) !== 0xFFFD) { e[D[183][j]] = 46848 + j; d[46848 + j] = D[183][j];}\nD[184] = \"����������������������������������������������������������������睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫����������������������������������腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊�\".split(\"\");\nfor(j = 0; j != D[184].length; ++j) if(D[184][j].charCodeAt(0) !== 0xFFFD) { e[D[184][j]] = 47104 + j; d[47104 + j] = D[184][j];}\nD[185] = \"����������������������������������������������������������������辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴����������������������������������飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇�\".split(\"\");\nfor(j = 0; j != D[185].length; ++j) if(D[185][j].charCodeAt(0) !== 0xFFFD) { e[D[185][j]] = 47360 + j; d[47360 + j] = D[185][j];}\nD[186] = \"����������������������������������������������������������������愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢����������������������������������滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬�\".split(\"\");\nfor(j = 0; j != D[186].length; ++j) if(D[186][j].charCodeAt(0) !== 0xFFFD) { e[D[186][j]] = 47616 + j; d[47616 + j] = D[186][j];}\nD[187] = \"����������������������������������������������������������������罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤����������������������������������說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜�\".split(\"\");\nfor(j = 0; j != D[187].length; ++j) if(D[187][j].charCodeAt(0) !== 0xFFFD) { e[D[187][j]] = 47872 + j; d[47872 + j] = D[187][j];}\nD[188] = \"����������������������������������������������������������������劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂����������������������������������慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃�\".split(\"\");\nfor(j = 0; j != D[188].length; ++j) if(D[188][j].charCodeAt(0) !== 0xFFFD) { e[D[188][j]] = 48128 + j; d[48128 + j] = D[188][j];}\nD[189] = \"����������������������������������������������������������������瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯����������������������������������翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞�\".split(\"\");\nfor(j = 0; j != D[189].length; ++j) if(D[189][j].charCodeAt(0) !== 0xFFFD) { e[D[189][j]] = 48384 + j; d[48384 + j] = D[189][j];}\nD[190] = \"����������������������������������������������������������������輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉����������������������������������鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡�\".split(\"\");\nfor(j = 0; j != D[190].length; ++j) if(D[190][j].charCodeAt(0) !== 0xFFFD) { e[D[190][j]] = 48640 + j; d[48640 + j] = D[190][j];}\nD[191] = \"����������������������������������������������������������������濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊����������������������������������縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚�\".split(\"\");\nfor(j = 0; j != D[191].length; ++j) if(D[191][j].charCodeAt(0) !== 0xFFFD) { e[D[191][j]] = 48896 + j; d[48896 + j] = D[191][j];}\nD[192] = \"����������������������������������������������������������������錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇����������������������������������嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬�\".split(\"\");\nfor(j = 0; j != D[192].length; ++j) if(D[192][j].charCodeAt(0) !== 0xFFFD) { e[D[192][j]] = 49152 + j; d[49152 + j] = D[192][j];}\nD[193] = \"����������������������������������������������������������������瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪����������������������������������薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁�\".split(\"\");\nfor(j = 0; j != D[193].length; ++j) if(D[193][j].charCodeAt(0) !== 0xFFFD) { e[D[193][j]] = 49408 + j; d[49408 + j] = D[193][j];}\nD[194] = \"����������������������������������������������������������������駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘����������������������������������癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦�\".split(\"\");\nfor(j = 0; j != D[194].length; ++j) if(D[194][j].charCodeAt(0) !== 0xFFFD) { e[D[194][j]] = 49664 + j; d[49664 + j] = D[194][j];}\nD[195] = \"����������������������������������������������������������������鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸����������������������������������獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類�\".split(\"\");\nfor(j = 0; j != D[195].length; ++j) if(D[195][j].charCodeAt(0) !== 0xFFFD) { e[D[195][j]] = 49920 + j; d[49920 + j] = D[195][j];}\nD[196] = \"����������������������������������������������������������������願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼����������������������������������纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴�\".split(\"\");\nfor(j = 0; j != D[196].length; ++j) if(D[196][j].charCodeAt(0) !== 0xFFFD) { e[D[196][j]] = 50176 + j; d[50176 + j] = D[196][j];}\nD[197] = \"����������������������������������������������������������������護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬����������������������������������禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒�\".split(\"\");\nfor(j = 0; j != D[197].length; ++j) if(D[197][j].charCodeAt(0) !== 0xFFFD) { e[D[197][j]] = 50432 + j; d[50432 + j] = D[197][j];}\nD[198] = \"����������������������������������������������������������������讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲���������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[198].length; ++j) if(D[198][j].charCodeAt(0) !== 0xFFFD) { e[D[198][j]] = 50688 + j; d[50688 + j] = D[198][j];}\nD[201] = \"����������������������������������������������������������������乂乜凵匚厂万丌乇亍囗兀屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕����������������������������������氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋�\".split(\"\");\nfor(j = 0; j != D[201].length; ++j) if(D[201][j].charCodeAt(0) !== 0xFFFD) { e[D[201][j]] = 51456 + j; d[51456 + j] = D[201][j];}\nD[202] = \"����������������������������������������������������������������汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘����������������������������������吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇�\".split(\"\");\nfor(j = 0; j != D[202].length; ++j) if(D[202][j].charCodeAt(0) !== 0xFFFD) { e[D[202][j]] = 51712 + j; d[51712 + j] = D[202][j];}\nD[203] = \"����������������������������������������������������������������杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓����������������������������������芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢�\".split(\"\");\nfor(j = 0; j != D[203].length; ++j) if(D[203][j].charCodeAt(0) !== 0xFFFD) { e[D[203][j]] = 51968 + j; d[51968 + j] = D[203][j];}\nD[204] = \"����������������������������������������������������������������坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋����������������������������������怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲�\".split(\"\");\nfor(j = 0; j != D[204].length; ++j) if(D[204][j].charCodeAt(0) !== 0xFFFD) { e[D[204][j]] = 52224 + j; d[52224 + j] = D[204][j];}\nD[205] = \"����������������������������������������������������������������泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺����������������������������������矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏�\".split(\"\");\nfor(j = 0; j != D[205].length; ++j) if(D[205][j].charCodeAt(0) !== 0xFFFD) { e[D[205][j]] = 52480 + j; d[52480 + j] = D[205][j];}\nD[206] = \"����������������������������������������������������������������哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛����������������������������������峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺�\".split(\"\");\nfor(j = 0; j != D[206].length; ++j) if(D[206][j].charCodeAt(0) !== 0xFFFD) { e[D[206][j]] = 52736 + j; d[52736 + j] = D[206][j];}\nD[207] = \"����������������������������������������������������������������柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂����������������������������������洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀�\".split(\"\");\nfor(j = 0; j != D[207].length; ++j) if(D[207][j].charCodeAt(0) !== 0xFFFD) { e[D[207][j]] = 52992 + j; d[52992 + j] = D[207][j];}\nD[208] = \"����������������������������������������������������������������穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪����������������������������������苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱�\".split(\"\");\nfor(j = 0; j != D[208].length; ++j) if(D[208][j].charCodeAt(0) !== 0xFFFD) { e[D[208][j]] = 53248 + j; d[53248 + j] = D[208][j];}\nD[209] = \"����������������������������������������������������������������唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧����������������������������������恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤�\".split(\"\");\nfor(j = 0; j != D[209].length; ++j) if(D[209][j].charCodeAt(0) !== 0xFFFD) { e[D[209][j]] = 53504 + j; d[53504 + j] = D[209][j];}\nD[210] = \"����������������������������������������������������������������毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸����������������������������������牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐�\".split(\"\");\nfor(j = 0; j != D[210].length; ++j) if(D[210][j].charCodeAt(0) !== 0xFFFD) { e[D[210][j]] = 53760 + j; d[53760 + j] = D[210][j];}\nD[211] = \"����������������������������������������������������������������笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢����������������������������������荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐�\".split(\"\");\nfor(j = 0; j != D[211].length; ++j) if(D[211][j].charCodeAt(0) !== 0xFFFD) { e[D[211][j]] = 54016 + j; d[54016 + j] = D[211][j];}\nD[212] = \"����������������������������������������������������������������酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅����������������������������������唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏�\".split(\"\");\nfor(j = 0; j != D[212].length; ++j) if(D[212][j].charCodeAt(0) !== 0xFFFD) { e[D[212][j]] = 54272 + j; d[54272 + j] = D[212][j];}\nD[213] = \"����������������������������������������������������������������崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟����������������������������������捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉�\".split(\"\");\nfor(j = 0; j != D[213].length; ++j) if(D[213][j].charCodeAt(0) !== 0xFFFD) { e[D[213][j]] = 54528 + j; d[54528 + j] = D[213][j];}\nD[214] = \"����������������������������������������������������������������淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏����������������������������������痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟�\".split(\"\");\nfor(j = 0; j != D[214].length; ++j) if(D[214][j].charCodeAt(0) !== 0xFFFD) { e[D[214][j]] = 54784 + j; d[54784 + j] = D[214][j];}\nD[215] = \"����������������������������������������������������������������耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷����������������������������������蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪�\".split(\"\");\nfor(j = 0; j != D[215].length; ++j) if(D[215][j].charCodeAt(0) !== 0xFFFD) { e[D[215][j]] = 55040 + j; d[55040 + j] = D[215][j];}\nD[216] = \"����������������������������������������������������������������釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷����������������������������������堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔�\".split(\"\");\nfor(j = 0; j != D[216].length; ++j) if(D[216][j].charCodeAt(0) !== 0xFFFD) { e[D[216][j]] = 55296 + j; d[55296 + j] = D[216][j];}\nD[217] = \"����������������������������������������������������������������惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒����������������������������������晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞�\".split(\"\");\nfor(j = 0; j != D[217].length; ++j) if(D[217][j].charCodeAt(0) !== 0xFFFD) { e[D[217][j]] = 55552 + j; d[55552 + j] = D[217][j];}\nD[218] = \"����������������������������������������������������������������湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖����������������������������������琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥�\".split(\"\");\nfor(j = 0; j != D[218].length; ++j) if(D[218][j].charCodeAt(0) !== 0xFFFD) { e[D[218][j]] = 55808 + j; d[55808 + j] = D[218][j];}\nD[219] = \"����������������������������������������������������������������罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳����������������������������������菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺�\".split(\"\");\nfor(j = 0; j != D[219].length; ++j) if(D[219][j].charCodeAt(0) !== 0xFFFD) { e[D[219][j]] = 56064 + j; d[56064 + j] = D[219][j];}\nD[220] = \"����������������������������������������������������������������軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈����������������������������������隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆�\".split(\"\");\nfor(j = 0; j != D[220].length; ++j) if(D[220][j].charCodeAt(0) !== 0xFFFD) { e[D[220][j]] = 56320 + j; d[56320 + j] = D[220][j];}\nD[221] = \"����������������������������������������������������������������媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤����������������������������������搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛嗀毻毼�\".split(\"\");\nfor(j = 0; j != D[221].length; ++j) if(D[221][j].charCodeAt(0) !== 0xFFFD) { e[D[221][j]] = 56576 + j; d[56576 + j] = D[221][j];}\nD[222] = \"����������������������������������������������������������������毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓����������������������������������煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓�\".split(\"\");\nfor(j = 0; j != D[222].length; ++j) if(D[222][j].charCodeAt(0) !== 0xFFFD) { e[D[222][j]] = 56832 + j; d[56832 + j] = D[222][j];}\nD[223] = \"����������������������������������������������������������������稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯����������������������������������腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤�\".split(\"\");\nfor(j = 0; j != D[223].length; ++j) if(D[223][j].charCodeAt(0) !== 0xFFFD) { e[D[223][j]] = 57088 + j; d[57088 + j] = D[223][j];}\nD[224] = \"����������������������������������������������������������������觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿����������������������������������遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠�\".split(\"\");\nfor(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}\nD[225] = \"����������������������������������������������������������������凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠����������������������������������寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉�\".split(\"\");\nfor(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}\nD[226] = \"����������������������������������������������������������������榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊����������������������������������漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓�\".split(\"\");\nfor(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}\nD[227] = \"����������������������������������������������������������������禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞����������������������������������耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻�\".split(\"\");\nfor(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}\nD[228] = \"����������������������������������������������������������������裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍����������������������������������銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘�\".split(\"\");\nfor(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}\nD[229] = \"����������������������������������������������������������������噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉����������������������������������憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒�\".split(\"\");\nfor(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}\nD[230] = \"����������������������������������������������������������������澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙����������������������������������獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟�\".split(\"\");\nfor(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}\nD[231] = \"����������������������������������������������������������������膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢����������������������������������蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧�\".split(\"\");\nfor(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}\nD[232] = \"����������������������������������������������������������������踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓����������������������������������銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮�\".split(\"\");\nfor(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}\nD[233] = \"����������������������������������������������������������������噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺����������������������������������憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸�\".split(\"\");\nfor(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}\nD[234] = \"����������������������������������������������������������������澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙����������������������������������瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘�\".split(\"\");\nfor(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}\nD[235] = \"����������������������������������������������������������������蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠����������������������������������諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌�\".split(\"\");\nfor(j = 0; j != D[235].length; ++j) if(D[235][j].charCodeAt(0) !== 0xFFFD) { e[D[235][j]] = 60160 + j; d[60160 + j] = D[235][j];}\nD[236] = \"����������������������������������������������������������������錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕����������������������������������魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎�\".split(\"\");\nfor(j = 0; j != D[236].length; ++j) if(D[236][j].charCodeAt(0) !== 0xFFFD) { e[D[236][j]] = 60416 + j; d[60416 + j] = D[236][j];}\nD[237] = \"����������������������������������������������������������������檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶����������������������������������瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞�\".split(\"\");\nfor(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}\nD[238] = \"����������������������������������������������������������������蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞����������������������������������謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜�\".split(\"\");\nfor(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}\nD[239] = \"����������������������������������������������������������������鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰����������������������������������鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶�\".split(\"\");\nfor(j = 0; j != D[239].length; ++j) if(D[239][j].charCodeAt(0) !== 0xFFFD) { e[D[239][j]] = 61184 + j; d[61184 + j] = D[239][j];}\nD[240] = \"����������������������������������������������������������������璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒����������������������������������臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧�\".split(\"\");\nfor(j = 0; j != D[240].length; ++j) if(D[240][j].charCodeAt(0) !== 0xFFFD) { e[D[240][j]] = 61440 + j; d[61440 + j] = D[240][j];}\nD[241] = \"����������������������������������������������������������������蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪����������������������������������鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰�\".split(\"\");\nfor(j = 0; j != D[241].length; ++j) if(D[241][j].charCodeAt(0) !== 0xFFFD) { e[D[241][j]] = 61696 + j; d[61696 + j] = D[241][j];}\nD[242] = \"����������������������������������������������������������������徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛����������������������������������礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕�\".split(\"\");\nfor(j = 0; j != D[242].length; ++j) if(D[242][j].charCodeAt(0) !== 0xFFFD) { e[D[242][j]] = 61952 + j; d[61952 + j] = D[242][j];}\nD[243] = \"����������������������������������������������������������������譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦����������������������������������鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲�\".split(\"\");\nfor(j = 0; j != D[243].length; ++j) if(D[243][j].charCodeAt(0) !== 0xFFFD) { e[D[243][j]] = 62208 + j; d[62208 + j] = D[243][j];}\nD[244] = \"����������������������������������������������������������������嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩����������������������������������禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿�\".split(\"\");\nfor(j = 0; j != D[244].length; ++j) if(D[244][j].charCodeAt(0) !== 0xFFFD) { e[D[244][j]] = 62464 + j; d[62464 + j] = D[244][j];}\nD[245] = \"����������������������������������������������������������������鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛����������������������������������鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥�\".split(\"\");\nfor(j = 0; j != D[245].length; ++j) if(D[245][j].charCodeAt(0) !== 0xFFFD) { e[D[245][j]] = 62720 + j; d[62720 + j] = D[245][j];}\nD[246] = \"����������������������������������������������������������������蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺����������������������������������騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚�\".split(\"\");\nfor(j = 0; j != D[246].length; ++j) if(D[246][j].charCodeAt(0) !== 0xFFFD) { e[D[246][j]] = 62976 + j; d[62976 + j] = D[246][j];}\nD[247] = \"����������������������������������������������������������������糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊����������������������������������驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾�\".split(\"\");\nfor(j = 0; j != D[247].length; ++j) if(D[247][j].charCodeAt(0) !== 0xFFFD) { e[D[247][j]] = 63232 + j; d[63232 + j] = D[247][j];}\nD[248] = \"����������������������������������������������������������������讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏����������������������������������齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚�\".split(\"\");\nfor(j = 0; j != D[248].length; ++j) if(D[248][j].charCodeAt(0) !== 0xFFFD) { e[D[248][j]] = 63488 + j; d[63488 + j] = D[248][j];}\nD[249] = \"����������������������������������������������������������������纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊����������������������������������龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯▓�\".split(\"\");\nfor(j = 0; j != D[249].length; ++j) if(D[249][j].charCodeAt(0) !== 0xFFFD) { e[D[249][j]] = 63744 + j; d[63744 + j] = D[249][j];}\nreturn {\"enc\": e, \"dec\": d }; })();\ncptable[1250] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“”•–—�™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1251] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1252] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1253] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1254] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“”•–—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1255] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰�‹�����‘’“”•–—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹ�ֻּֽ־ֿ׀ׁׂ׃װױײ׳״�������אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1256] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1257] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1258] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“”•–—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖרÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[10000] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[10006] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦­ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ�\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[10007] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[10008] = (function(){ var d = [], e = {}, D = [], j;\nD[0] = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€���������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}\nD[161] = \"����������������������������������������������������������������������������������������������������������������������������������������������������������������� 、。・ˉˇ¨〃々―~�…‘’“”〔〕〈〉《》「」『』〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓�\".split(\"\");\nfor(j = 0; j != D[161].length; ++j) if(D[161][j].charCodeAt(0) !== 0xFFFD) { e[D[161][j]] = 41216 + j; d[41216 + j] = D[161][j];}\nD[162] = \"���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩��㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩��ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ���\".split(\"\");\nfor(j = 0; j != D[162].length; ++j) if(D[162][j].charCodeAt(0) !== 0xFFFD) { e[D[162][j]] = 41472 + j; d[41472 + j] = D[162][j];}\nD[163] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������!"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�\".split(\"\");\nfor(j = 0; j != D[163].length; ++j) if(D[163][j].charCodeAt(0) !== 0xFFFD) { e[D[163][j]] = 41728 + j; d[41728 + j] = D[163][j];}\nD[164] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������\".split(\"\");\nfor(j = 0; j != D[164].length; ++j) if(D[164][j].charCodeAt(0) !== 0xFFFD) { e[D[164][j]] = 41984 + j; d[41984 + j] = D[164][j];}\nD[165] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������\".split(\"\");\nfor(j = 0; j != D[165].length; ++j) if(D[165][j].charCodeAt(0) !== 0xFFFD) { e[D[165][j]] = 42240 + j; d[42240 + j] = D[165][j];}\nD[166] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω���������������������������������������\".split(\"\");\nfor(j = 0; j != D[166].length; ++j) if(D[166][j].charCodeAt(0) !== 0xFFFD) { e[D[166][j]] = 42496 + j; d[42496 + j] = D[166][j];}\nD[167] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������\".split(\"\");\nfor(j = 0; j != D[167].length; ++j) if(D[167][j].charCodeAt(0) !== 0xFFFD) { e[D[167][j]] = 42752 + j; d[42752 + j] = D[167][j];}\nD[168] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüê����������ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ����������������������\".split(\"\");\nfor(j = 0; j != D[168].length; ++j) if(D[168][j].charCodeAt(0) !== 0xFFFD) { e[D[168][j]] = 43008 + j; d[43008 + j] = D[168][j];}\nD[169] = \"��������������������������������������������������������������������������������������������������������������������������������������������������������������������─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋����������������\".split(\"\");\nfor(j = 0; j != D[169].length; ++j) if(D[169][j].charCodeAt(0) !== 0xFFFD) { e[D[169][j]] = 43264 + j; d[43264 + j] = D[169][j];}\nD[176] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥�\".split(\"\");\nfor(j = 0; j != D[176].length; ++j) if(D[176][j].charCodeAt(0) !== 0xFFFD) { e[D[176][j]] = 45056 + j; d[45056 + j] = D[176][j];}\nD[177] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳�\".split(\"\");\nfor(j = 0; j != D[177].length; ++j) if(D[177][j].charCodeAt(0) !== 0xFFFD) { e[D[177][j]] = 45312 + j; d[45312 + j] = D[177][j];}\nD[178] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖�\".split(\"\");\nfor(j = 0; j != D[178].length; ++j) if(D[178][j].charCodeAt(0) !== 0xFFFD) { e[D[178][j]] = 45568 + j; d[45568 + j] = D[178][j];}\nD[179] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚�\".split(\"\");\nfor(j = 0; j != D[179].length; ++j) if(D[179][j].charCodeAt(0) !== 0xFFFD) { e[D[179][j]] = 45824 + j; d[45824 + j] = D[179][j];}\nD[180] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮�\".split(\"\");\nfor(j = 0; j != D[180].length; ++j) if(D[180][j].charCodeAt(0) !== 0xFFFD) { e[D[180][j]] = 46080 + j; d[46080 + j] = D[180][j];}\nD[181] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠�\".split(\"\");\nfor(j = 0; j != D[181].length; ++j) if(D[181][j].charCodeAt(0) !== 0xFFFD) { e[D[181][j]] = 46336 + j; d[46336 + j] = D[181][j];}\nD[182] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二�\".split(\"\");\nfor(j = 0; j != D[182].length; ++j) if(D[182][j].charCodeAt(0) !== 0xFFFD) { e[D[182][j]] = 46592 + j; d[46592 + j] = D[182][j];}\nD[183] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服�\".split(\"\");\nfor(j = 0; j != D[183].length; ++j) if(D[183][j].charCodeAt(0) !== 0xFFFD) { e[D[183][j]] = 46848 + j; d[46848 + j] = D[183][j];}\nD[184] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹�\".split(\"\");\nfor(j = 0; j != D[184].length; ++j) if(D[184][j].charCodeAt(0) !== 0xFFFD) { e[D[184][j]] = 47104 + j; d[47104 + j] = D[184][j];}\nD[185] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈�\".split(\"\");\nfor(j = 0; j != D[185].length; ++j) if(D[185][j].charCodeAt(0) !== 0xFFFD) { e[D[185][j]] = 47360 + j; d[47360 + j] = D[185][j];}\nD[186] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖�\".split(\"\");\nfor(j = 0; j != D[186].length; ++j) if(D[186][j].charCodeAt(0) !== 0xFFFD) { e[D[186][j]] = 47616 + j; d[47616 + j] = D[186][j];}\nD[187] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕�\".split(\"\");\nfor(j = 0; j != D[187].length; ++j) if(D[187][j].charCodeAt(0) !== 0xFFFD) { e[D[187][j]] = 47872 + j; d[47872 + j] = D[187][j];}\nD[188] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件�\".split(\"\");\nfor(j = 0; j != D[188].length; ++j) if(D[188][j].charCodeAt(0) !== 0xFFFD) { e[D[188][j]] = 48128 + j; d[48128 + j] = D[188][j];}\nD[189] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸�\".split(\"\");\nfor(j = 0; j != D[189].length; ++j) if(D[189][j].charCodeAt(0) !== 0xFFFD) { e[D[189][j]] = 48384 + j; d[48384 + j] = D[189][j];}\nD[190] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻�\".split(\"\");\nfor(j = 0; j != D[190].length; ++j) if(D[190][j].charCodeAt(0) !== 0xFFFD) { e[D[190][j]] = 48640 + j; d[48640 + j] = D[190][j];}\nD[191] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀�\".split(\"\");\nfor(j = 0; j != D[191].length; ++j) if(D[191][j].charCodeAt(0) !== 0xFFFD) { e[D[191][j]] = 48896 + j; d[48896 + j] = D[191][j];}\nD[192] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐�\".split(\"\");\nfor(j = 0; j != D[192].length; ++j) if(D[192][j].charCodeAt(0) !== 0xFFFD) { e[D[192][j]] = 49152 + j; d[49152 + j] = D[192][j];}\nD[193] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿�\".split(\"\");\nfor(j = 0; j != D[193].length; ++j) if(D[193][j].charCodeAt(0) !== 0xFFFD) { e[D[193][j]] = 49408 + j; d[49408 + j] = D[193][j];}\nD[194] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫�\".split(\"\");\nfor(j = 0; j != D[194].length; ++j) if(D[194][j].charCodeAt(0) !== 0xFFFD) { e[D[194][j]] = 49664 + j; d[49664 + j] = D[194][j];}\nD[195] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸�\".split(\"\");\nfor(j = 0; j != D[195].length; ++j) if(D[195][j].charCodeAt(0) !== 0xFFFD) { e[D[195][j]] = 49920 + j; d[49920 + j] = D[195][j];}\nD[196] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁�\".split(\"\");\nfor(j = 0; j != D[196].length; ++j) if(D[196][j].charCodeAt(0) !== 0xFFFD) { e[D[196][j]] = 50176 + j; d[50176 + j] = D[196][j];}\nD[197] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗�\".split(\"\");\nfor(j = 0; j != D[197].length; ++j) if(D[197][j].charCodeAt(0) !== 0xFFFD) { e[D[197][j]] = 50432 + j; d[50432 + j] = D[197][j];}\nD[198] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐�\".split(\"\");\nfor(j = 0; j != D[198].length; ++j) if(D[198][j].charCodeAt(0) !== 0xFFFD) { e[D[198][j]] = 50688 + j; d[50688 + j] = D[198][j];}\nD[199] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠�\".split(\"\");\nfor(j = 0; j != D[199].length; ++j) if(D[199][j].charCodeAt(0) !== 0xFFFD) { e[D[199][j]] = 50944 + j; d[50944 + j] = D[199][j];}\nD[200] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁�\".split(\"\");\nfor(j = 0; j != D[200].length; ++j) if(D[200][j].charCodeAt(0) !== 0xFFFD) { e[D[200][j]] = 51200 + j; d[51200 + j] = D[200][j];}\nD[201] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳�\".split(\"\");\nfor(j = 0; j != D[201].length; ++j) if(D[201][j].charCodeAt(0) !== 0xFFFD) { e[D[201][j]] = 51456 + j; d[51456 + j] = D[201][j];}\nD[202] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱�\".split(\"\");\nfor(j = 0; j != D[202].length; ++j) if(D[202][j].charCodeAt(0) !== 0xFFFD) { e[D[202][j]] = 51712 + j; d[51712 + j] = D[202][j];}\nD[203] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔�\".split(\"\");\nfor(j = 0; j != D[203].length; ++j) if(D[203][j].charCodeAt(0) !== 0xFFFD) { e[D[203][j]] = 51968 + j; d[51968 + j] = D[203][j];}\nD[204] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃�\".split(\"\");\nfor(j = 0; j != D[204].length; ++j) if(D[204][j].charCodeAt(0) !== 0xFFFD) { e[D[204][j]] = 52224 + j; d[52224 + j] = D[204][j];}\nD[205] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威�\".split(\"\");\nfor(j = 0; j != D[205].length; ++j) if(D[205][j].charCodeAt(0) !== 0xFFFD) { e[D[205][j]] = 52480 + j; d[52480 + j] = D[205][j];}\nD[206] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺�\".split(\"\");\nfor(j = 0; j != D[206].length; ++j) if(D[206][j].charCodeAt(0) !== 0xFFFD) { e[D[206][j]] = 52736 + j; d[52736 + j] = D[206][j];}\nD[207] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓�\".split(\"\");\nfor(j = 0; j != D[207].length; ++j) if(D[207][j].charCodeAt(0) !== 0xFFFD) { e[D[207][j]] = 52992 + j; d[52992 + j] = D[207][j];}\nD[208] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄�\".split(\"\");\nfor(j = 0; j != D[208].length; ++j) if(D[208][j].charCodeAt(0) !== 0xFFFD) { e[D[208][j]] = 53248 + j; d[53248 + j] = D[208][j];}\nD[209] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶�\".split(\"\");\nfor(j = 0; j != D[209].length; ++j) if(D[209][j].charCodeAt(0) !== 0xFFFD) { e[D[209][j]] = 53504 + j; d[53504 + j] = D[209][j];}\nD[210] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐�\".split(\"\");\nfor(j = 0; j != D[210].length; ++j) if(D[210][j].charCodeAt(0) !== 0xFFFD) { e[D[210][j]] = 53760 + j; d[53760 + j] = D[210][j];}\nD[211] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉�\".split(\"\");\nfor(j = 0; j != D[211].length; ++j) if(D[211][j].charCodeAt(0) !== 0xFFFD) { e[D[211][j]] = 54016 + j; d[54016 + j] = D[211][j];}\nD[212] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧�\".split(\"\");\nfor(j = 0; j != D[212].length; ++j) if(D[212][j].charCodeAt(0) !== 0xFFFD) { e[D[212][j]] = 54272 + j; d[54272 + j] = D[212][j];}\nD[213] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政�\".split(\"\");\nfor(j = 0; j != D[213].length; ++j) if(D[213][j].charCodeAt(0) !== 0xFFFD) { e[D[213][j]] = 54528 + j; d[54528 + j] = D[213][j];}\nD[214] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑�\".split(\"\");\nfor(j = 0; j != D[214].length; ++j) if(D[214][j].charCodeAt(0) !== 0xFFFD) { e[D[214][j]] = 54784 + j; d[54784 + j] = D[214][j];}\nD[215] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座������\".split(\"\");\nfor(j = 0; j != D[215].length; ++j) if(D[215][j].charCodeAt(0) !== 0xFFFD) { e[D[215][j]] = 55040 + j; d[55040 + j] = D[215][j];}\nD[216] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝�\".split(\"\");\nfor(j = 0; j != D[216].length; ++j) if(D[216][j].charCodeAt(0) !== 0xFFFD) { e[D[216][j]] = 55296 + j; d[55296 + j] = D[216][j];}\nD[217] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼�\".split(\"\");\nfor(j = 0; j != D[217].length; ++j) if(D[217][j].charCodeAt(0) !== 0xFFFD) { e[D[217][j]] = 55552 + j; d[55552 + j] = D[217][j];}\nD[218] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺�\".split(\"\");\nfor(j = 0; j != D[218].length; ++j) if(D[218][j].charCodeAt(0) !== 0xFFFD) { e[D[218][j]] = 55808 + j; d[55808 + j] = D[218][j];}\nD[219] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝�\".split(\"\");\nfor(j = 0; j != D[219].length; ++j) if(D[219][j].charCodeAt(0) !== 0xFFFD) { e[D[219][j]] = 56064 + j; d[56064 + j] = D[219][j];}\nD[220] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥�\".split(\"\");\nfor(j = 0; j != D[220].length; ++j) if(D[220][j].charCodeAt(0) !== 0xFFFD) { e[D[220][j]] = 56320 + j; d[56320 + j] = D[220][j];}\nD[221] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺�\".split(\"\");\nfor(j = 0; j != D[221].length; ++j) if(D[221][j].charCodeAt(0) !== 0xFFFD) { e[D[221][j]] = 56576 + j; d[56576 + j] = D[221][j];}\nD[222] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖�\".split(\"\");\nfor(j = 0; j != D[222].length; ++j) if(D[222][j].charCodeAt(0) !== 0xFFFD) { e[D[222][j]] = 56832 + j; d[56832 + j] = D[222][j];}\nD[223] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼�\".split(\"\");\nfor(j = 0; j != D[223].length; ++j) if(D[223][j].charCodeAt(0) !== 0xFFFD) { e[D[223][j]] = 57088 + j; d[57088 + j] = D[223][j];}\nD[224] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼�\".split(\"\");\nfor(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}\nD[225] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺�\".split(\"\");\nfor(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}\nD[226] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂�\".split(\"\");\nfor(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}\nD[227] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾�\".split(\"\");\nfor(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}\nD[228] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑�\".split(\"\");\nfor(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}\nD[229] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣�\".split(\"\");\nfor(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}\nD[230] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩�\".split(\"\");\nfor(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}\nD[231] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬�\".split(\"\");\nfor(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}\nD[232] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹�\".split(\"\");\nfor(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}\nD[233] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋�\".split(\"\");\nfor(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}\nD[234] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰�\".split(\"\");\nfor(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}\nD[235] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻�\".split(\"\");\nfor(j = 0; j != D[235].length; ++j) if(D[235][j].charCodeAt(0) !== 0xFFFD) { e[D[235][j]] = 60160 + j; d[60160 + j] = D[235][j];}\nD[236] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐�\".split(\"\");\nfor(j = 0; j != D[236].length; ++j) if(D[236][j].charCodeAt(0) !== 0xFFFD) { e[D[236][j]] = 60416 + j; d[60416 + j] = D[236][j];}\nD[237] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨�\".split(\"\");\nfor(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}\nD[238] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪�\".split(\"\");\nfor(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}\nD[239] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔�\".split(\"\");\nfor(j = 0; j != D[239].length; ++j) if(D[239][j].charCodeAt(0) !== 0xFFFD) { e[D[239][j]] = 61184 + j; d[61184 + j] = D[239][j];}\nD[240] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙�\".split(\"\");\nfor(j = 0; j != D[240].length; ++j) if(D[240][j].charCodeAt(0) !== 0xFFFD) { e[D[240][j]] = 61440 + j; d[61440 + j] = D[240][j];}\nD[241] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃�\".split(\"\");\nfor(j = 0; j != D[241].length; ++j) if(D[241][j].charCodeAt(0) !== 0xFFFD) { e[D[241][j]] = 61696 + j; d[61696 + j] = D[241][j];}\nD[242] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒�\".split(\"\");\nfor(j = 0; j != D[242].length; ++j) if(D[242][j].charCodeAt(0) !== 0xFFFD) { e[D[242][j]] = 61952 + j; d[61952 + j] = D[242][j];}\nD[243] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋�\".split(\"\");\nfor(j = 0; j != D[243].length; ++j) if(D[243][j].charCodeAt(0) !== 0xFFFD) { e[D[243][j]] = 62208 + j; d[62208 + j] = D[243][j];}\nD[244] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤�\".split(\"\");\nfor(j = 0; j != D[244].length; ++j) if(D[244][j].charCodeAt(0) !== 0xFFFD) { e[D[244][j]] = 62464 + j; d[62464 + j] = D[244][j];}\nD[245] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜�\".split(\"\");\nfor(j = 0; j != D[245].length; ++j) if(D[245][j].charCodeAt(0) !== 0xFFFD) { e[D[245][j]] = 62720 + j; d[62720 + j] = D[245][j];}\nD[246] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋�\".split(\"\");\nfor(j = 0; j != D[246].length; ++j) if(D[246][j].charCodeAt(0) !== 0xFFFD) { e[D[246][j]] = 62976 + j; d[62976 + j] = D[246][j];}\nD[247] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄�\".split(\"\");\nfor(j = 0; j != D[247].length; ++j) if(D[247][j].charCodeAt(0) !== 0xFFFD) { e[D[247][j]] = 63232 + j; d[63232 + j] = D[247][j];}\nreturn {\"enc\": e, \"dec\": d }; })();\ncptable[10029] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[10079] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüݰ¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[10081] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸˝˛ˇ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[28591] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\n// eslint-disable-next-line no-undef\nif (typeof module !== 'undefined' && module.exports && typeof DO_NOT_EXPORT_CODEPAGE === 'undefined') module.exports = cptable;\n/*! cputils.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/* vim: set ft=javascript: */\n/*jshint newcap: false */\n(function(root, factory) {\n /*jshint ignore:start */\n /*eslint-disable */\n \"use strict\";\n if(typeof cptable === \"undefined\") {\n if(typeof require !== \"undefined\"){\n var cpt = cptable;\n if (typeof module !== 'undefined' && module.exports && typeof DO_NOT_EXPORT_CODEPAGE === 'undefined') module.exports = factory(cpt);\n else root.cptable = factory(cpt);\n } else throw new Error(\"cptable not found\");\n } else cptable = factory(cptable);\n /*eslint-enable */\n /*jshint ignore:end */\n}(this, function(cpt){\n \"use strict\";\n /*global module, Buffer */\n var magic = {\n \"1200\":\"utf16le\",\n \"1201\":\"utf16be\",\n \"12000\":\"utf32le\",\n \"12001\":\"utf32be\",\n \"16969\":\"utf64le\",\n \"20127\":\"ascii\",\n \"65000\":\"utf7\",\n \"65001\":\"utf8\"\n };\n\n var sbcs_cache = [874,1250,1251,1252,1253,1254,1255,1256,10000];\n var dbcs_cache = [932,936,949,950];\n var magic_cache = [65001];\n var magic_decode = {};\n var magic_encode = {};\n var cpdcache = {};\n var cpecache = {};\n\n var sfcc = function sfcc(x) { return String.fromCharCode(x); };\n var cca = function cca(x) { return x.charCodeAt(0); };\n\n var has_buf = (typeof Buffer !== 'undefined');\n var Buffer_from = function(){};\n if(has_buf) {\n var nbfs = !Buffer.from;\n if(!nbfs) try { Buffer.from(\"foo\", \"utf8\"); } catch(e) { nbfs = true; }\n Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);\n // $FlowIgnore\n if(!Buffer.allocUnsafe) Buffer.allocUnsafe = function(n) { return new Buffer(n); };\n\n var mdl = 1024, mdb = Buffer.allocUnsafe(mdl);\n var make_EE = function make_EE(E){\n var EE = Buffer.allocUnsafe(65536);\n for(var i = 0; i < 65536;++i) EE[i] = 0;\n var keys = Object.keys(E), len = keys.length;\n for(var ee = 0, e = keys[ee]; ee < len; ++ee) {\n if(!(e = keys[ee])) continue;\n EE[e.charCodeAt(0)] = E[e];\n }\n return EE;\n };\n var sbcs_encode = function make_sbcs_encode(cp) {\n var EE = make_EE(cpt[cp].enc);\n return function sbcs_e(data, ofmt) {\n var len = data.length;\n var out, i=0, j=0, D=0, w=0;\n if(typeof data === 'string') {\n out = Buffer.allocUnsafe(len);\n for(i = 0; i < len; ++i) out[i] = EE[data.charCodeAt(i)];\n } else if(Buffer.isBuffer(data)) {\n out = Buffer.allocUnsafe(2*len);\n j = 0;\n for(i = 0; i < len; ++i) {\n D = data[i];\n if(D < 128) out[j++] = EE[D];\n else if(D < 224) { out[j++] = EE[((D&31)<<6)+(data[i+1]&63)]; ++i; }\n else if(D < 240) { out[j++] = EE[((D&15)<<12)+((data[i+1]&63)<<6)+(data[i+2]&63)]; i+=2; }\n else {\n w = ((D&7)<<18)+((data[i+1]&63)<<12)+((data[i+2]&63)<<6)+(data[i+3]&63); i+=3;\n if(w < 65536) out[j++] = EE[w];\n else { w -= 65536; out[j++] = EE[0xD800 + ((w>>10)&1023)]; out[j++] = EE[0xDC00 + (w&1023)]; }\n }\n }\n out = out.slice(0,j);\n } else {\n out = Buffer.allocUnsafe(len);\n for(i = 0; i < len; ++i) out[i] = EE[data[i].charCodeAt(0)];\n }\n if(!ofmt || ofmt === 'buf') return out;\n if(ofmt !== 'arr') return out.toString('binary');\n return [].slice.call(out);\n };\n };\n var sbcs_decode = function make_sbcs_decode(cp) {\n var D = cpt[cp].dec;\n var DD = Buffer.allocUnsafe(131072), d=0, c=\"\";\n for(d=0;d>8;\n }\n return function sbcs_d(data) {\n var len = data.length, i=0, j=0;\n if(2 * len > mdl) { mdl = 2 * len; mdb = Buffer.allocUnsafe(mdl); }\n if(Buffer.isBuffer(data)) {\n for(i = 0; i < len; i++) {\n j = 2*data[i];\n mdb[2*i] = DD[j]; mdb[2*i+1] = DD[j+1];\n }\n } else if(typeof data === \"string\") {\n for(i = 0; i < len; i++) {\n j = 2*data.charCodeAt(i);\n mdb[2*i] = DD[j]; mdb[2*i+1] = DD[j+1];\n }\n } else {\n for(i = 0; i < len; i++) {\n j = 2*data[i];\n mdb[2*i] = DD[j]; mdb[2*i+1] = DD[j+1];\n }\n }\n return mdb.slice(0, 2 * len).toString('ucs2');\n };\n };\n var dbcs_encode = function make_dbcs_encode(cp) {\n var E = cpt[cp].enc;\n var EE = Buffer.allocUnsafe(131072);\n for(var i = 0; i < 131072; ++i) EE[i] = 0;\n var keys = Object.keys(E);\n for(var ee = 0, e = keys[ee]; ee < keys.length; ++ee) {\n if(!(e = keys[ee])) continue;\n var f = e.charCodeAt(0);\n EE[2*f] = E[e] & 255; EE[2*f+1] = E[e]>>8;\n }\n return function dbcs_e(data, ofmt) {\n var len = data.length, out = Buffer.allocUnsafe(2*len), i=0, j=0, jj=0, k=0, D=0;\n if(typeof data === 'string') {\n for(i = k = 0; i < len; ++i) {\n j = data.charCodeAt(i)*2;\n out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];\n }\n out = out.slice(0,k);\n } else if(Buffer.isBuffer(data)) {\n for(i = k = 0; i < len; ++i) {\n D = data[i];\n if(D < 128) j = D;\n else if(D < 224) { j = ((D&31)<<6)+(data[i+1]&63); ++i; }\n else if(D < 240) { j = ((D&15)<<12)+((data[i+1]&63)<<6)+(data[i+2]&63); i+=2; }\n else { j = ((D&7)<<18)+((data[i+1]&63)<<12)+((data[i+2]&63)<<6)+(data[i+3]&63); i+=3; }\n if(j<65536) { j*=2; out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j]; }\n else { jj = j-65536;\n j=2*(0xD800 + ((jj>>10)&1023)); out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];\n j=2*(0xDC00 + (jj&1023)); out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];\n }\n }\n out = out.slice(0,k);\n } else {\n for(i = k = 0; i < len; i++) {\n j = data[i].charCodeAt(0)*2;\n out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];\n }\n }\n if(!ofmt || ofmt === 'buf') return out;\n if(ofmt !== 'arr') return out.toString('binary');\n return [].slice.call(out);\n };\n };\n var dbcs_decode = function make_dbcs_decode(cp) {\n var D = cpt[cp].dec;\n var DD = Buffer.allocUnsafe(131072), d=0, c, w=0, j=0, i=0;\n for(i = 0; i < 65536; ++i) { DD[2*i] = 0xFF; DD[2*i+1] = 0xFD;}\n for(d = 0; d < D.length; ++d) {\n if(!(c=D[d])) continue;\n w = c.charCodeAt(0);\n j = 2*d;\n DD[j] = w&255; DD[j+1] = w>>8;\n }\n return function dbcs_d(data) {\n var len = data.length, out = Buffer.allocUnsafe(2*len), i=0, j=0, k=0;\n if(Buffer.isBuffer(data)) {\n for(i = 0; i < len; i++) {\n j = 2*data[i];\n if(DD[j]===0xFF && DD[j+1]===0xFD) { j=2*((data[i]<<8)+data[i+1]); ++i; }\n out[k++] = DD[j]; out[k++] = DD[j+1];\n }\n } else if(typeof data === \"string\") {\n for(i = 0; i < len; i++) {\n j = 2*data.charCodeAt(i);\n if(DD[j]===0xFF && DD[j+1]===0xFD) { j=2*((data.charCodeAt(i)<<8)+data.charCodeAt(i+1)); ++i; }\n out[k++] = DD[j]; out[k++] = DD[j+1];\n }\n } else {\n for(i = 0; i < len; i++) {\n j = 2*data[i];\n if(DD[j]===0xFF && DD[j+1]===0xFD) { j=2*((data[i]<<8)+data[i+1]); ++i; }\n out[k++] = DD[j]; out[k++] = DD[j+1];\n }\n }\n return out.slice(0,k).toString('ucs2');\n };\n };\n magic_decode[65001] = function utf8_d(data) {\n if(typeof data === \"string\") return utf8_d(data.split(\"\").map(cca));\n var len = data.length, w = 0, ww = 0;\n if(4 * len > mdl) { mdl = 4 * len; mdb = Buffer.allocUnsafe(mdl); }\n var i = 0;\n if(len >= 3 && data[0] == 0xEF) if(data[1] == 0xBB && data[2] == 0xBF) i = 3;\n for(var j = 1, k = 0, D = 0; i < len; i+=j) {\n j = 1; D = data[i];\n if(D < 128) w = D;\n else if(D < 224) { w=(D&31)*64+(data[i+1]&63); j=2; }\n else if(D < 240) { w=((D&15)<<12)+(data[i+1]&63)*64+(data[i+2]&63); j=3; }\n else { w=(D&7)*262144+((data[i+1]&63)<<12)+(data[i+2]&63)*64+(data[i+3]&63); j=4; }\n if(w < 65536) { mdb[k++] = w&255; mdb[k++] = w>>8; }\n else {\n w -= 65536; ww = 0xD800 + ((w>>10)&1023); w = 0xDC00 + (w&1023);\n mdb[k++] = ww&255; mdb[k++] = ww>>>8; mdb[k++] = w&255; mdb[k++] = (w>>>8)&255;\n }\n }\n return mdb.slice(0,k).toString('ucs2');\n };\n magic_encode[65001] = function utf8_e(data, ofmt) {\n if(has_buf && Buffer.isBuffer(data)) {\n if(!ofmt || ofmt === 'buf') return data;\n if(ofmt !== 'arr') return data.toString('binary');\n return [].slice.call(data);\n }\n var len = data.length, w = 0, ww = 0, j = 0;\n var direct = typeof data === \"string\";\n if(4 * len > mdl) { mdl = 4 * len; mdb = Buffer.allocUnsafe(mdl); }\n for(var i = 0; i < len; ++i) {\n w = direct ? data.charCodeAt(i) : data[i].charCodeAt(0);\n if(w <= 0x007F) mdb[j++] = w;\n else if(w <= 0x07FF) {\n mdb[j++] = 192 + (w >> 6);\n mdb[j++] = 128 + (w&63);\n } else if(w >= 0xD800 && w <= 0xDFFF) {\n w -= 0xD800; ++i;\n ww = (direct ? data.charCodeAt(i) : data[i].charCodeAt(0)) - 0xDC00 + (w << 10);\n mdb[j++] = 240 + ((ww>>>18) & 0x07);\n mdb[j++] = 144 + ((ww>>>12) & 0x3F);\n mdb[j++] = 128 + ((ww>>>6) & 0x3F);\n mdb[j++] = 128 + (ww & 0x3F);\n } else {\n mdb[j++] = 224 + (w >> 12);\n mdb[j++] = 128 + ((w >> 6)&63);\n mdb[j++] = 128 + (w&63);\n }\n }\n if(!ofmt || ofmt === 'buf') return mdb.slice(0,j);\n if(ofmt !== 'arr') return mdb.slice(0,j).toString('binary');\n return [].slice.call(mdb, 0, j);\n };\n }\n\n var encache = function encache() {\n if(has_buf) {\n if(cpdcache[sbcs_cache[0]]) return;\n var i=0, s=0;\n for(i = 0; i < sbcs_cache.length; ++i) {\n s = sbcs_cache[i];\n if(cpt[s]) {\n cpdcache[s] = sbcs_decode(s);\n cpecache[s] = sbcs_encode(s);\n }\n }\n for(i = 0; i < dbcs_cache.length; ++i) {\n s = dbcs_cache[i];\n if(cpt[s]) {\n cpdcache[s] = dbcs_decode(s);\n cpecache[s] = dbcs_encode(s);\n }\n }\n for(i = 0; i < magic_cache.length; ++i) {\n s = magic_cache[i];\n if(magic_decode[s]) cpdcache[s] = magic_decode[s];\n if(magic_encode[s]) cpecache[s] = magic_encode[s];\n }\n }\n };\n var null_enc = function(data, ofmt) { void ofmt; return \"\"; };\n var cp_decache = function cp_decache(cp) { delete cpdcache[cp]; delete cpecache[cp]; };\n var decache = function decache() {\n if(has_buf) {\n if(!cpdcache[sbcs_cache[0]]) return;\n sbcs_cache.forEach(cp_decache);\n dbcs_cache.forEach(cp_decache);\n magic_cache.forEach(cp_decache);\n }\n last_enc = null_enc; last_cp = 0;\n };\n var cache = {\n encache: encache,\n decache: decache,\n sbcs: sbcs_cache,\n dbcs: dbcs_cache\n };\n\n encache();\n\n var BM = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n var SetD = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'(),-./:?\";\n var last_enc = null_enc, last_cp = 0;\n var encode = function encode(cp, data, ofmt) {\n if(cp === last_cp && last_enc) { return last_enc(data, ofmt); }\n if(cpecache[cp]) { last_enc = cpecache[last_cp=cp]; return last_enc(data, ofmt); }\n if(has_buf && Buffer.isBuffer(data)) data = data.toString('utf8');\n var len = data.length;\n var out = has_buf ? Buffer.allocUnsafe(4*len) : [], w=0, i=0, j = 0, ww=0;\n var C = cpt[cp], E, M = \"\";\n var isstr = typeof data === 'string';\n if(C && (E=C.enc)) for(i = 0; i < len; ++i, ++j) {\n w = E[isstr? data.charAt(i) : data[i]];\n if(w > 255) {\n out[j] = w>>8;\n out[++j] = w&255;\n } else out[j] = w&255;\n }\n else if((M=magic[cp])) switch(M) {\n case \"utf8\":\n if(has_buf && isstr) { out = Buffer_from(data, M); j = out.length; break; }\n for(i = 0; i < len; ++i, ++j) {\n w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);\n if(w <= 0x007F) out[j] = w;\n else if(w <= 0x07FF) {\n out[j] = 192 + (w >> 6);\n out[++j] = 128 + (w&63);\n } else if(w >= 0xD800 && w <= 0xDFFF) {\n w -= 0xD800;\n ww = (isstr ? data.charCodeAt(++i) : data[++i].charCodeAt(0)) - 0xDC00 + (w << 10);\n out[j] = 240 + ((ww>>>18) & 0x07);\n out[++j] = 144 + ((ww>>>12) & 0x3F);\n out[++j] = 128 + ((ww>>>6) & 0x3F);\n out[++j] = 128 + (ww & 0x3F);\n } else {\n out[j] = 224 + (w >> 12);\n out[++j] = 128 + ((w >> 6)&63);\n out[++j] = 128 + (w&63);\n }\n }\n break;\n case \"ascii\":\n if(has_buf && typeof data === \"string\") { out = Buffer_from(data, M); j = out.length; break; }\n for(i = 0; i < len; ++i, ++j) {\n w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);\n if(w <= 0x007F) out[j] = w;\n else throw new Error(\"bad ascii \" + w);\n }\n break;\n case \"utf16le\":\n if(has_buf && typeof data === \"string\") { out = Buffer_from(data, M); j = out.length; break; }\n for(i = 0; i < len; ++i) {\n w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);\n out[j++] = w&255;\n out[j++] = w>>8;\n }\n break;\n case \"utf16be\":\n for(i = 0; i < len; ++i) {\n w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);\n out[j++] = w>>8;\n out[j++] = w&255;\n }\n break;\n case \"utf32le\":\n for(i = 0; i < len; ++i) {\n w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);\n if(w >= 0xD800 && w <= 0xDFFF) w = 0x10000 + ((w - 0xD800) << 10) + (data[++i].charCodeAt(0) - 0xDC00);\n out[j++] = w&255; w >>= 8;\n out[j++] = w&255; w >>= 8;\n out[j++] = w&255; w >>= 8;\n out[j++] = w&255;\n }\n break;\n case \"utf32be\":\n for(i = 0; i < len; ++i) {\n w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);\n if(w >= 0xD800 && w <= 0xDFFF) w = 0x10000 + ((w - 0xD800) << 10) + (data[++i].charCodeAt(0) - 0xDC00);\n out[j+3] = w&255; w >>= 8;\n out[j+2] = w&255; w >>= 8;\n out[j+1] = w&255; w >>= 8;\n out[j] = w&255;\n j+=4;\n }\n break;\n case \"utf7\":\n for(i = 0; i < len; i++) {\n var c = isstr ? data.charAt(i) : data[i].charAt(0);\n if(c === \"+\") { out[j++] = 0x2b; out[j++] = 0x2d; continue; }\n if(SetD.indexOf(c) > -1) { out[j++] = c.charCodeAt(0); continue; }\n var tt = encode(1201, c);\n out[j++] = 0x2b;\n out[j++] = BM.charCodeAt(tt[0]>>2);\n out[j++] = BM.charCodeAt(((tt[0]&0x03)<<4) + ((tt[1]||0)>>4));\n out[j++] = BM.charCodeAt(((tt[1]&0x0F)<<2) + ((tt[2]||0)>>6));\n out[j++] = 0x2d;\n }\n break;\n default: throw new Error(\"Unsupported magic: \" + cp + \" \" + magic[cp]);\n }\n else throw new Error(\"Unrecognized CP: \" + cp);\n out = out.slice(0,j);\n if(!has_buf) return (ofmt == 'str') ? (out).map(sfcc).join(\"\") : out;\n if(!ofmt || ofmt === 'buf') return out;\n if(ofmt !== 'arr') return out.toString('binary');\n return [].slice.call(out);\n };\n var decode = function decode(cp, data) {\n var F; if((F=cpdcache[cp])) return F(data);\n if(typeof data === \"string\") return decode(cp, data.split(\"\").map(cca));\n var len = data.length, out = new Array(len), s=\"\", w=0, i=0, j=1, k=0, ww=0;\n var C = cpt[cp], D, M=\"\";\n if(C && (D=C.dec)) {\n for(i = 0; i < len; i+=j) {\n j = 2;\n s = D[(data[i]<<8)+ data[i+1]];\n if(!s) {\n j = 1;\n s = D[data[i]];\n }\n if(!s) throw new Error('Unrecognized code: ' + data[i] + ' ' + data[i+j-1] + ' ' + i + ' ' + j + ' ' + D[data[i]]);\n out[k++] = s;\n }\n }\n else if((M=magic[cp])) switch(M) {\n case \"utf8\":\n if(len >= 3 && data[0] == 0xEF) if(data[1] == 0xBB && data[2] == 0xBF) i = 3;\n for(; i < len; i+=j) {\n j = 1;\n if(data[i] < 128) w = data[i];\n else if(data[i] < 224) { w=(data[i]&31)*64+(data[i+1]&63); j=2; }\n else if(data[i] < 240) { w=((data[i]&15)<<12)+(data[i+1]&63)*64+(data[i+2]&63); j=3; }\n else { w=(data[i]&7)*262144+((data[i+1]&63)<<12)+(data[i+2]&63)*64+(data[i+3]&63); j=4; }\n if(w < 65536) { out[k++] = String.fromCharCode(w); }\n else {\n w -= 65536; ww = 0xD800 + ((w>>10)&1023); w = 0xDC00 + (w&1023);\n out[k++] = String.fromCharCode(ww); out[k++] = String.fromCharCode(w);\n }\n }\n break;\n case \"ascii\":\n if(has_buf && Buffer.isBuffer(data)) return data.toString(M);\n for(i = 0; i < len; i++) out[i] = String.fromCharCode(data[i]);\n k = len; break;\n case \"utf16le\":\n if(len >= 2 && data[0] == 0xFF) if(data[1] == 0xFE) i = 2;\n if(has_buf && Buffer.isBuffer(data)) return data.toString(M);\n j = 2;\n for(; i+1 < len; i+=j) {\n out[k++] = String.fromCharCode((data[i+1]<<8) + data[i]);\n }\n break;\n case \"utf16be\":\n if(len >= 2 && data[0] == 0xFE) if(data[1] == 0xFF) i = 2;\n j = 2;\n for(; i+1 < len; i+=j) {\n out[k++] = String.fromCharCode((data[i]<<8) + data[i+1]);\n }\n break;\n case \"utf32le\":\n if(len >= 4 && data[0] == 0xFF) if(data[1] == 0xFE && data[2] === 0 && data[3] === 0) i = 4;\n j = 4;\n for(; i < len; i+=j) {\n w = (data[i+3]<<24) + (data[i+2]<<16) + (data[i+1]<<8) + (data[i]);\n if(w > 0xFFFF) {\n w -= 0x10000;\n out[k++] = String.fromCharCode(0xD800 + ((w >> 10) & 0x3FF));\n out[k++] = String.fromCharCode(0xDC00 + (w & 0x3FF));\n }\n else out[k++] = String.fromCharCode(w);\n }\n break;\n case \"utf32be\":\n if(len >= 4 && data[3] == 0xFF) if(data[2] == 0xFE && data[1] === 0 && data[0] === 0) i = 4;\n j = 4;\n for(; i < len; i+=j) {\n w = (data[i]<<24) + (data[i+1]<<16) + (data[i+2]<<8) + (data[i+3]);\n if(w > 0xFFFF) {\n w -= 0x10000;\n out[k++] = String.fromCharCode(0xD800 + ((w >> 10) & 0x3FF));\n out[k++] = String.fromCharCode(0xDC00 + (w & 0x3FF));\n }\n else out[k++] = String.fromCharCode(w);\n }\n break;\n case \"utf7\":\n if(len >= 4 && data[0] == 0x2B && data[1] == 0x2F && data[2] == 0x76) {\n if(len >= 5 && data[3] == 0x38 && data[4] == 0x2D) i = 5;\n else if(data[3] == 0x38 || data[3] == 0x39 || data[3] == 0x2B || data[3] == 0x2F) i = 4;\n }\n for(; i < len; i+=j) {\n if(data[i] !== 0x2b) { j=1; out[k++] = String.fromCharCode(data[i]); continue; }\n j=1;\n if(data[i+1] === 0x2d) { j = 2; out[k++] = \"+\"; continue; }\n // eslint-disable-next-line no-useless-escape\n while(String.fromCharCode(data[i+j]).match(/[A-Za-z0-9+\\/]/)) j++;\n var dash = 0;\n if(data[i+j] === 0x2d) { ++j; dash=1; }\n var tt = [];\n var o64 = \"\";\n var c1=0, c2=0, c3=0;\n var e1=0, e2=0, e3=0, e4=0;\n for(var l = 1; l < j - dash;) {\n e1 = BM.indexOf(String.fromCharCode(data[i+l++]));\n e2 = BM.indexOf(String.fromCharCode(data[i+l++]));\n c1 = e1 << 2 | e2 >> 4;\n tt.push(c1);\n e3 = BM.indexOf(String.fromCharCode(data[i+l++]));\n if(e3 === -1) break;\n c2 = (e2 & 15) << 4 | e3 >> 2;\n tt.push(c2);\n e4 = BM.indexOf(String.fromCharCode(data[i+l++]));\n if(e4 === -1) break;\n c3 = (e3 & 3) << 6 | e4;\n if(e4 < 64) tt.push(c3);\n }\n o64 = decode(1201, tt);\n for(l = 0; l < o64.length; ++l) out[k++] = o64.charAt(l);\n }\n break;\n default: throw new Error(\"Unsupported magic: \" + cp + \" \" + magic[cp]);\n }\n else throw new Error(\"Unrecognized CP: \" + cp);\n return out.slice(0,k).join(\"\");\n };\n var hascp = function hascp(cp) { return !!(cpt[cp] || magic[cp]); };\n cpt.utils = { decode: decode, encode: encode, hascp: hascp, magic: magic, cache:cache };\n return cpt;\n}));\n","/*\n\nJSZip - A Javascript class for generating and reading zip files\n\n\n(c) 2009-2014 Stuart Knightley \nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.\n\nJSZip uses the library pako released under the MIT license :\nhttps://github.com/nodeca/pako/blob/master/LICENSE\n\nNote: since JSZip 3 removed critical functionality, this version assigns to the\n`JSZipSync` variable. Another JSZip version can be loaded in parallel.\n*/\n(function(e){\n\tif(\"object\"==typeof exports&&\"undefined\"!=typeof module&&\"undefined\"==typeof DO_NOT_EXPORT_JSZIP)module.exports=e();\n\telse if(\"function\"==typeof define&&define.amd&&\"undefined\"==typeof DO_NOT_EXPORT_JSZIP){JSZipSync=e();define('j',[],e);}\n\telse{\n\t\tvar f;\n\t\t\"undefined\"!=typeof globalThis?f=globalThis:\n\t\t\"undefined\"!=typeof window?f=window:\n\t\t\"undefined\"!=typeof global?f=global:\n\t\t\"undefined\"!=typeof $ && $.global?f=$.global:\n\t\t\"undefined\"!=typeof self&&(f=self),f.JSZipSync=e()\n\t}\n}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error(\"Cannot find module '\"+o+\"'\")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o> 2;\n enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n enc4 = chr3 & 63;\n\n if (isNaN(chr2)) {\n enc3 = enc4 = 64;\n }\n else if (isNaN(chr3)) {\n enc4 = 64;\n }\n\n output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4);\n\n }\n\n return output;\n};\n\n// public method for decoding\nexports.decode = function(input, utf8) {\n var output = \"\";\n var chr1, chr2, chr3;\n var enc1, enc2, enc3, enc4;\n var i = 0;\n\n input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\n while (i < input.length) {\n\n enc1 = _keyStr.indexOf(input.charAt(i++));\n enc2 = _keyStr.indexOf(input.charAt(i++));\n enc3 = _keyStr.indexOf(input.charAt(i++));\n enc4 = _keyStr.indexOf(input.charAt(i++));\n\n chr1 = (enc1 << 2) | (enc2 >> 4);\n chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\n chr3 = ((enc3 & 3) << 6) | enc4;\n\n output = output + String.fromCharCode(chr1);\n\n if (enc3 != 64) {\n output = output + String.fromCharCode(chr2);\n }\n if (enc4 != 64) {\n output = output + String.fromCharCode(chr3);\n }\n\n }\n\n return output;\n\n};\n\n},{}],2:[function(_dereq_,module,exports){\n'use strict';\nfunction CompressedObject() {\n this.compressedSize = 0;\n this.uncompressedSize = 0;\n this.crc32 = 0;\n this.compressionMethod = null;\n this.compressedContent = null;\n}\n\nCompressedObject.prototype = {\n /**\n * Return the decompressed content in an unspecified format.\n * The format will depend on the decompressor.\n * @return {Object} the decompressed content.\n */\n getContent: function() {\n return null; // see implementation\n },\n /**\n * Return the compressed content in an unspecified format.\n * The format will depend on the compressed conten source.\n * @return {Object} the compressed content.\n */\n getCompressedContent: function() {\n return null; // see implementation\n }\n};\nmodule.exports = CompressedObject;\n\n},{}],3:[function(_dereq_,module,exports){\n'use strict';\nexports.STORE = {\n magic: \"\\x00\\x00\",\n compress: function(content) {\n return content; // no compression\n },\n uncompress: function(content) {\n return content; // no compression\n },\n compressInputType: null,\n uncompressInputType: null\n};\nexports.DEFLATE = _dereq_('./flate');\n\n},{\"./flate\":8}],4:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('./utils');\n\nvar table = [\n 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,\n 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,\n 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,\n 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,\n 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,\n 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,\n 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,\n 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,\n 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,\n 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,\n 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,\n 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,\n 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,\n 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,\n 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,\n 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,\n 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,\n 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,\n 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,\n 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,\n 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,\n 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,\n 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,\n 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,\n 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,\n 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,\n 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,\n 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,\n 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,\n 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,\n 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,\n 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,\n 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,\n 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,\n 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,\n 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,\n 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,\n 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,\n 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,\n 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,\n 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,\n 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,\n 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,\n 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,\n 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,\n 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,\n 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,\n 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,\n 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,\n 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,\n 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,\n 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,\n 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,\n 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,\n 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,\n 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,\n 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,\n 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,\n 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,\n 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,\n 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,\n 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,\n 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,\n 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D\n];\n\n/**\n *\n * Javascript crc32\n * http://www.webtoolkit.info/\n *\n */\nmodule.exports = function crc32(input, crc) {\n if (typeof input === \"undefined\" || !input.length) {\n return 0;\n }\n\n var isArray = utils.getTypeOf(input) !== \"string\";\n\n if (typeof(crc) == \"undefined\") {\n crc = 0;\n }\n var x = 0;\n var y = 0;\n var b = 0;\n\n crc = crc ^ (-1);\n for (var i = 0, iTop = input.length; i < iTop; i++) {\n b = isArray ? input[i] : input.charCodeAt(i);\n y = (crc ^ b) & 0xFF;\n x = table[y];\n crc = (crc >>> 8) ^ x;\n }\n\n return crc ^ (-1);\n};\n// vim: set shiftwidth=4 softtabstop=4:\n\n},{\"./utils\":21}],5:[function(_dereq_,module,exports){\n'use strict';\nvar utils = _dereq_('./utils');\n\nfunction DataReader(data) {\n this.data = null; // type : see implementation\n this.length = 0;\n this.index = 0;\n}\nDataReader.prototype = {\n /**\n * Check that the offset will not go too far.\n * @param {string} offset the additional offset to check.\n * @throws {Error} an Error if the offset is out of bounds.\n */\n checkOffset: function(offset) {\n this.checkIndex(this.index + offset);\n },\n /**\n * Check that the specifed index will not be too far.\n * @param {string} newIndex the index to check.\n * @throws {Error} an Error if the index is out of bounds.\n */\n checkIndex: function(newIndex) {\n if (this.length < newIndex || newIndex < 0) {\n throw new Error(\"End of data reached (data length = \" + this.length + \", asked index = \" + (newIndex) + \"). Corrupted zip ?\");\n }\n },\n /**\n * Change the index.\n * @param {number} newIndex The new index.\n * @throws {Error} if the new index is out of the data.\n */\n setIndex: function(newIndex) {\n this.checkIndex(newIndex);\n this.index = newIndex;\n },\n /**\n * Skip the next n bytes.\n * @param {number} n the number of bytes to skip.\n * @throws {Error} if the new index is out of the data.\n */\n skip: function(n) {\n this.setIndex(this.index + n);\n },\n /**\n * Get the byte at the specified index.\n * @param {number} i the index to use.\n * @return {number} a byte.\n */\n byteAt: function(i) {\n // see implementations\n },\n /**\n * Get the next number with a given byte size.\n * @param {number} size the number of bytes to read.\n * @return {number} the corresponding number.\n */\n readInt: function(size) {\n var result = 0,\n i;\n this.checkOffset(size);\n for (i = this.index + size - 1; i >= this.index; i--) {\n result = (result << 8) + this.byteAt(i);\n }\n this.index += size;\n return result;\n },\n /**\n * Get the next string with a given byte size.\n * @param {number} size the number of bytes to read.\n * @return {string} the corresponding string.\n */\n readString: function(size) {\n return utils.transformTo(\"string\", this.readData(size));\n },\n /**\n * Get raw data without conversion, bytes.\n * @param {number} size the number of bytes to read.\n * @return {Object} the raw data, implementation specific.\n */\n readData: function(size) {\n // see implementations\n },\n /**\n * Find the last occurrence of a zip signature (4 bytes).\n * @param {string} sig the signature to find.\n * @return {number} the index of the last occurrence, -1 if not found.\n */\n lastIndexOfSignature: function(sig) {\n // see implementations\n },\n /**\n * Get the next date.\n * @return {Date} the date.\n */\n readDate: function() {\n var dostime = this.readInt(4);\n return new Date(\n ((dostime >> 25) & 0x7f) + 1980, // year\n ((dostime >> 21) & 0x0f) - 1, // month\n (dostime >> 16) & 0x1f, // day\n (dostime >> 11) & 0x1f, // hour\n (dostime >> 5) & 0x3f, // minute\n (dostime & 0x1f) << 1); // second\n }\n};\nmodule.exports = DataReader;\n\n},{\"./utils\":21}],6:[function(_dereq_,module,exports){\n'use strict';\nexports.base64 = false;\nexports.binary = false;\nexports.dir = false;\nexports.createFolders = false;\nexports.date = null;\nexports.compression = null;\nexports.comment = null;\n\n},{}],7:[function(_dereq_,module,exports){\n'use strict';\nvar utils = _dereq_('./utils');\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.string2binary = function(str) {\n return utils.string2binary(str);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.string2Uint8Array = function(str) {\n return utils.transformTo(\"uint8array\", str);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.uint8Array2String = function(array) {\n return utils.transformTo(\"string\", array);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.string2Blob = function(str) {\n var buffer = utils.transformTo(\"arraybuffer\", str);\n return utils.arrayBuffer2Blob(buffer);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.arrayBuffer2Blob = function(buffer) {\n return utils.arrayBuffer2Blob(buffer);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.transformTo = function(outputType, input) {\n return utils.transformTo(outputType, input);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.getTypeOf = function(input) {\n return utils.getTypeOf(input);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.checkSupport = function(type) {\n return utils.checkSupport(type);\n};\n\n/**\n * @deprecated\n * This value will be removed in a future version without replacement.\n */\nexports.MAX_VALUE_16BITS = utils.MAX_VALUE_16BITS;\n\n/**\n * @deprecated\n * This value will be removed in a future version without replacement.\n */\nexports.MAX_VALUE_32BITS = utils.MAX_VALUE_32BITS;\n\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.pretty = function(str) {\n return utils.pretty(str);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.findCompression = function(compressionMethod) {\n return utils.findCompression(compressionMethod);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.isRegExp = function (object) {\n return utils.isRegExp(object);\n};\n\n\n},{\"./utils\":21}],8:[function(_dereq_,module,exports){\n'use strict';\nvar USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined');\n\nvar pako = _dereq_(\"pako\");\nexports.uncompressInputType = USE_TYPEDARRAY ? \"uint8array\" : \"array\";\nexports.compressInputType = USE_TYPEDARRAY ? \"uint8array\" : \"array\";\n\nexports.magic = \"\\x08\\x00\";\nexports.compress = function(input) {\n return pako.deflateRaw(input);\n};\nexports.uncompress = function(input) {\n return pako.inflateRaw(input);\n};\n\n},{\"pako\":24}],9:[function(_dereq_,module,exports){\n'use strict';\n\nvar base64 = _dereq_('./base64');\n\n/**\nUsage:\n zip = new JSZip();\n zip.file(\"hello.txt\", \"Hello, World!\").file(\"tempfile\", \"nothing\");\n zip.folder(\"images\").file(\"smile.gif\", base64Data, {base64: true});\n zip.file(\"Xmas.txt\", \"Ho ho ho !\", {date : new Date(\"December 25, 2007 00:00:01\")});\n zip.remove(\"tempfile\");\n\n base64zip = zip.generate();\n\n**/\n\n/**\n * Representation a of zip file in js\n * @constructor\n * @param {String=|ArrayBuffer=|Uint8Array=} data the data to load, if any (optional).\n * @param {Object=} options the options for creating this objects (optional).\n */\nfunction JSZipSync(data, options) {\n // if this constructor is used without `new`, it adds `new` before itself:\n if(!(this instanceof JSZipSync)) return new JSZipSync(data, options);\n\n // object containing the files :\n // {\n // \"folder/\" : {...},\n // \"folder/data.txt\" : {...}\n // }\n this.files = {};\n\n this.comment = null;\n\n // Where we are in the hierarchy\n this.root = \"\";\n if (data) {\n this.load(data, options);\n }\n this.clone = function() {\n var newObj = new JSZipSync();\n for (var i in this) {\n if (typeof this[i] !== \"function\") {\n newObj[i] = this[i];\n }\n }\n return newObj;\n };\n}\nJSZipSync.prototype = _dereq_('./object');\nJSZipSync.prototype.load = _dereq_('./load');\nJSZipSync.support = _dereq_('./support');\nJSZipSync.defaults = _dereq_('./defaults');\n\n/**\n * @deprecated\n * This namespace will be removed in a future version without replacement.\n */\nJSZipSync.utils = _dereq_('./deprecatedPublicUtils');\n\nJSZipSync.base64 = {\n /**\n * @deprecated\n * This method will be removed in a future version without replacement.\n */\n encode : function(input) {\n return base64.encode(input);\n },\n /**\n * @deprecated\n * This method will be removed in a future version without replacement.\n */\n decode : function(input) {\n return base64.decode(input);\n }\n};\nJSZipSync.compressions = _dereq_('./compressions');\nmodule.exports = JSZipSync;\n\n},{\"./base64\":1,\"./compressions\":3,\"./defaults\":6,\"./deprecatedPublicUtils\":7,\"./load\":10,\"./object\":13,\"./support\":17}],10:[function(_dereq_,module,exports){\n'use strict';\nvar base64 = _dereq_('./base64');\nvar ZipEntries = _dereq_('./zipEntries');\nmodule.exports = function(data, options) {\n var files, zipEntries, i, input;\n options = options || {};\n if (options.base64) {\n data = base64.decode(data);\n }\n\n zipEntries = new ZipEntries(data, options);\n files = zipEntries.files;\n for (i = 0; i < files.length; i++) {\n input = files[i];\n this.file(input.fileName, input.decompressed, {\n binary: true,\n optimizedBinaryString: true,\n date: input.date,\n dir: input.dir,\n comment : input.fileComment.length ? input.fileComment : null,\n createFolders: options.createFolders\n });\n }\n if (zipEntries.zipComment.length) {\n this.comment = zipEntries.zipComment;\n }\n\n return this;\n};\n\n},{\"./base64\":1,\"./zipEntries\":22}],11:[function(_dereq_,module,exports){\n(function (Buffer){\n'use strict';\nvar Buffer_from = /*::(*/function(){}/*:: :any)*/;\nif(typeof Buffer !== 'undefined') {\n\tvar nbfs = !Buffer.from;\n\tif(!nbfs) try { Buffer.from(\"foo\", \"utf8\"); } catch(e) { nbfs = true; }\n\tBuffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);\n\t// $FlowIgnore\n\tif(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };\n}\nmodule.exports = function(data, encoding){\n return typeof data == 'number' ? Buffer.alloc(data) : Buffer_from(data, encoding);\n};\nmodule.exports.test = function(b){\n return Buffer.isBuffer(b);\n};\n}).call(this,(typeof Buffer !== \"undefined\" ? Buffer : undefined))\n},{}],12:[function(_dereq_,module,exports){\n'use strict';\nvar Uint8ArrayReader = _dereq_('./uint8ArrayReader');\n\nfunction NodeBufferReader(data) {\n this.data = data;\n this.length = this.data.length;\n this.index = 0;\n}\nNodeBufferReader.prototype = new Uint8ArrayReader();\n\n/**\n * @see DataReader.readData\n */\nNodeBufferReader.prototype.readData = function(size) {\n this.checkOffset(size);\n var result = this.data.slice(this.index, this.index + size);\n this.index += size;\n return result;\n};\nmodule.exports = NodeBufferReader;\n\n},{\"./uint8ArrayReader\":18}],13:[function(_dereq_,module,exports){\n'use strict';\nvar support = _dereq_('./support');\nvar utils = _dereq_('./utils');\nvar crc32 = _dereq_('./crc32');\nvar signature = _dereq_('./signature');\nvar defaults = _dereq_('./defaults');\nvar base64 = _dereq_('./base64');\nvar compressions = _dereq_('./compressions');\nvar CompressedObject = _dereq_('./compressedObject');\nvar nodeBuffer = _dereq_('./nodeBuffer');\nvar utf8 = _dereq_('./utf8');\nvar StringWriter = _dereq_('./stringWriter');\nvar Uint8ArrayWriter = _dereq_('./uint8ArrayWriter');\n\n/**\n * Returns the raw data of a ZipObject, decompress the content if necessary.\n * @param {ZipObject} file the file to use.\n * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.\n */\nvar getRawData = function(file) {\n if (file._data instanceof CompressedObject) {\n file._data = file._data.getContent();\n file.options.binary = true;\n file.options.base64 = false;\n\n if (utils.getTypeOf(file._data) === \"uint8array\") {\n var copy = file._data;\n // when reading an arraybuffer, the CompressedObject mechanism will keep it and subarray() a Uint8Array.\n // if we request a file in the same format, we might get the same Uint8Array or its ArrayBuffer (the original zip file).\n file._data = new Uint8Array(copy.length);\n // with an empty Uint8Array, Opera fails with a \"Offset larger than array size\"\n if (copy.length !== 0) {\n file._data.set(copy, 0);\n }\n }\n }\n return file._data;\n};\n\n/**\n * Returns the data of a ZipObject in a binary form. If the content is an unicode string, encode it.\n * @param {ZipObject} file the file to use.\n * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.\n */\nvar getBinaryData = function(file) {\n var result = getRawData(file),\n type = utils.getTypeOf(result);\n if (type === \"string\") {\n if (!file.options.binary) {\n // unicode text !\n // unicode string => binary string is a painful process, check if we can avoid it.\n if (support.nodebuffer) {\n return nodeBuffer(result, \"utf-8\");\n }\n }\n return file.asBinary();\n }\n return result;\n};\n\n/**\n * Transform this._data into a string.\n * @param {function} filter a function String -> String, applied if not null on the result.\n * @return {String} the string representing this._data.\n */\nvar dataToString = function(asUTF8) {\n var result = getRawData(this);\n if (result === null || typeof result === \"undefined\") {\n return \"\";\n }\n // if the data is a base64 string, we decode it before checking the encoding !\n if (this.options.base64) {\n result = base64.decode(result);\n }\n if (asUTF8 && this.options.binary) {\n // JSZip.prototype.utf8decode supports arrays as input\n // skip to array => string step, utf8decode will do it.\n result = out.utf8decode(result);\n }\n else {\n // no utf8 transformation, do the array => string step.\n result = utils.transformTo(\"string\", result);\n }\n\n if (!asUTF8 && !this.options.binary) {\n result = utils.transformTo(\"string\", out.utf8encode(result));\n }\n return result;\n};\n/**\n * A simple object representing a file in the zip file.\n * @constructor\n * @param {string} name the name of the file\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data\n * @param {Object} options the options of the file\n */\nvar ZipObject = function(name, data, options) {\n this.name = name;\n this.dir = options.dir;\n this.date = options.date;\n this.comment = options.comment;\n\n this._data = data;\n this.options = options;\n\n /*\n * This object contains initial values for dir and date.\n * With them, we can check if the user changed the deprecated metadata in\n * `ZipObject#options` or not.\n */\n this._initialMetadata = {\n dir : options.dir,\n date : options.date\n };\n};\n\nZipObject.prototype = {\n /**\n * Return the content as UTF8 string.\n * @return {string} the UTF8 string.\n */\n asText: function() {\n return dataToString.call(this, true);\n },\n /**\n * Returns the binary content.\n * @return {string} the content as binary.\n */\n asBinary: function() {\n return dataToString.call(this, false);\n },\n /**\n * Returns the content as a nodejs Buffer.\n * @return {Buffer} the content as a Buffer.\n */\n asNodeBuffer: function() {\n var result = getBinaryData(this);\n return utils.transformTo(\"nodebuffer\", result);\n },\n /**\n * Returns the content as an Uint8Array.\n * @return {Uint8Array} the content as an Uint8Array.\n */\n asUint8Array: function() {\n var result = getBinaryData(this);\n return utils.transformTo(\"uint8array\", result);\n },\n /**\n * Returns the content as an ArrayBuffer.\n * @return {ArrayBuffer} the content as an ArrayBufer.\n */\n asArrayBuffer: function() {\n return this.asUint8Array().buffer;\n }\n};\n\n/**\n * Transform an integer into a string in hexadecimal.\n * @private\n * @param {number} dec the number to convert.\n * @param {number} bytes the number of bytes to generate.\n * @returns {string} the result.\n */\nvar decToHex = function(dec, bytes) {\n var hex = \"\",\n i;\n for (i = 0; i < bytes; i++) {\n hex += String.fromCharCode(dec & 0xff);\n dec = dec >>> 8;\n }\n return hex;\n};\n\n/**\n * Merge the objects passed as parameters into a new one.\n * @private\n * @param {...Object} var_args All objects to merge.\n * @return {Object} a new object with the data of the others.\n */\nvar extend = function() {\n var result = {}, i, attr;\n for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers\n for (attr in arguments[i]) {\n if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === \"undefined\") {\n result[attr] = arguments[i][attr];\n }\n }\n }\n return result;\n};\n\n/**\n * Transforms the (incomplete) options from the user into the complete\n * set of options to create a file.\n * @private\n * @param {Object} o the options from the user.\n * @return {Object} the complete set of options.\n */\nvar prepareFileAttrs = function(o) {\n o = o || {};\n if (o.base64 === true && (o.binary === null || o.binary === undefined)) {\n o.binary = true;\n }\n o = extend(o, defaults);\n o.date = o.date || new Date();\n if (o.compression !== null) o.compression = o.compression.toUpperCase();\n\n return o;\n};\n\n/**\n * Add a file in the current folder.\n * @private\n * @param {string} name the name of the file\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file\n * @param {Object} o the options of the file\n * @return {Object} the new file.\n */\nvar fileAdd = function(name, data, o) {\n // be sure sub folders exist\n var dataType = utils.getTypeOf(data),\n parent;\n\n o = prepareFileAttrs(o);\n\n if (o.createFolders && (parent = parentFolder(name))) {\n folderAdd.call(this, parent, true);\n }\n\n if (o.dir || data === null || typeof data === \"undefined\") {\n o.base64 = false;\n o.binary = false;\n data = null;\n }\n else if (dataType === \"string\") {\n if (o.binary && !o.base64) {\n // optimizedBinaryString == true means that the file has already been filtered with a 0xFF mask\n if (o.optimizedBinaryString !== true) {\n // this is a string, not in a base64 format.\n // Be sure that this is a correct \"binary string\"\n data = utils.string2binary(data);\n }\n }\n }\n else { // arraybuffer, uint8array, ...\n o.base64 = false;\n o.binary = true;\n\n if (!dataType && !(data instanceof CompressedObject)) {\n throw new Error(\"The data of '\" + name + \"' is in an unsupported format !\");\n }\n\n // special case : it's way easier to work with Uint8Array than with ArrayBuffer\n if (dataType === \"arraybuffer\") {\n data = utils.transformTo(\"uint8array\", data);\n }\n }\n\n var object = new ZipObject(name, data, o);\n this.files[name] = object;\n return object;\n};\n\n/**\n * Find the parent folder of the path.\n * @private\n * @param {string} path the path to use\n * @return {string} the parent folder, or \"\"\n */\nvar parentFolder = function (path) {\n if (path.slice(-1) == '/') {\n path = path.substring(0, path.length - 1);\n }\n var lastSlash = path.lastIndexOf('/');\n return (lastSlash > 0) ? path.substring(0, lastSlash) : \"\";\n};\n\n/**\n * Add a (sub) folder in the current folder.\n * @private\n * @param {string} name the folder's name\n * @param {boolean=} [createFolders] If true, automatically create sub\n * folders. Defaults to false.\n * @return {Object} the new folder.\n */\nvar folderAdd = function(name, createFolders) {\n // Check the name ends with a /\n if (name.slice(-1) != \"/\") {\n name += \"/\"; // IE doesn't like substr(-1)\n }\n\n createFolders = (typeof createFolders !== 'undefined') ? createFolders : false;\n\n // Does this folder already exist?\n if (!this.files[name]) {\n fileAdd.call(this, name, null, {\n dir: true,\n createFolders: createFolders\n });\n }\n return this.files[name];\n};\n\n/**\n * Generate a JSZip.CompressedObject for a given zipOject.\n * @param {ZipObject} file the object to read.\n * @param {JSZip.compression} compression the compression to use.\n * @return {JSZip.CompressedObject} the compressed result.\n */\nvar generateCompressedObjectFrom = function(file, compression) {\n var result = new CompressedObject(),\n content;\n\n // the data has not been decompressed, we might reuse things !\n if (file._data instanceof CompressedObject) {\n result.uncompressedSize = file._data.uncompressedSize;\n result.crc32 = file._data.crc32;\n\n if (result.uncompressedSize === 0 || file.dir) {\n compression = compressions['STORE'];\n result.compressedContent = \"\";\n result.crc32 = 0;\n }\n else if (file._data.compressionMethod === compression.magic) {\n result.compressedContent = file._data.getCompressedContent();\n }\n else {\n content = file._data.getContent();\n // need to decompress / recompress\n result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content));\n }\n }\n else {\n // have uncompressed data\n content = getBinaryData(file);\n if (!content || content.length === 0 || file.dir) {\n compression = compressions['STORE'];\n content = \"\";\n }\n result.uncompressedSize = content.length;\n result.crc32 = crc32(content);\n result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content));\n }\n\n result.compressedSize = result.compressedContent.length;\n result.compressionMethod = compression.magic;\n\n return result;\n};\n\n/**\n * Generate the various parts used in the construction of the final zip file.\n * @param {string} name the file name.\n * @param {ZipObject} file the file content.\n * @param {JSZip.CompressedObject} compressedObject the compressed object.\n * @param {number} offset the current offset from the start of the zip file.\n * @return {object} the zip parts.\n */\nvar generateZipParts = function(name, file, compressedObject, offset) {\n var data = compressedObject.compressedContent,\n utfEncodedFileName = utils.transformTo(\"string\", utf8.utf8encode(file.name)),\n comment = file.comment || \"\",\n utfEncodedComment = utils.transformTo(\"string\", utf8.utf8encode(comment)),\n useUTF8ForFileName = utfEncodedFileName.length !== file.name.length,\n useUTF8ForComment = utfEncodedComment.length !== comment.length,\n o = file.options,\n dosTime,\n dosDate,\n extraFields = \"\",\n unicodePathExtraField = \"\",\n unicodeCommentExtraField = \"\",\n dir, date;\n\n\n // handle the deprecated options.dir\n if (file._initialMetadata.dir !== file.dir) {\n dir = file.dir;\n } else {\n dir = o.dir;\n }\n\n // handle the deprecated options.date\n if(file._initialMetadata.date !== file.date) {\n date = file.date;\n } else {\n date = o.date;\n }\n\n\n dosTime = date.getHours();\n dosTime = dosTime << 6;\n dosTime = dosTime | date.getMinutes();\n dosTime = dosTime << 5;\n dosTime = dosTime | date.getSeconds() / 2;\n\n dosDate = date.getFullYear() - 1980;\n dosDate = dosDate << 4;\n dosDate = dosDate | (date.getMonth() + 1);\n dosDate = dosDate << 5;\n dosDate = dosDate | date.getDate();\n\n if (useUTF8ForFileName) {\n // set the unicode path extra field. unzip needs at least one extra\n // field to correctly handle unicode path, so using the path is as good\n // as any other information. This could improve the situation with\n // other archive managers too.\n // This field is usually used without the utf8 flag, with a non\n // unicode path in the header (winrar, winzip). This helps (a bit)\n // with the messy Windows' default compressed folders feature but\n // breaks on p7zip which doesn't seek the unicode path extra field.\n // So for now, UTF-8 everywhere !\n unicodePathExtraField =\n // Version\n decToHex(1, 1) +\n // NameCRC32\n decToHex(crc32(utfEncodedFileName), 4) +\n // UnicodeName\n utfEncodedFileName;\n\n extraFields +=\n // Info-ZIP Unicode Path Extra Field\n \"\\x75\\x70\" +\n // size\n decToHex(unicodePathExtraField.length, 2) +\n // content\n unicodePathExtraField;\n }\n\n if(useUTF8ForComment) {\n\n unicodeCommentExtraField =\n // Version\n decToHex(1, 1) +\n // CommentCRC32\n decToHex(this.crc32(utfEncodedComment), 4) +\n // UnicodeName\n utfEncodedComment;\n\n extraFields +=\n // Info-ZIP Unicode Path Extra Field\n \"\\x75\\x63\" +\n // size\n decToHex(unicodeCommentExtraField.length, 2) +\n // content\n unicodeCommentExtraField;\n }\n\n var header = \"\";\n\n // version needed to extract\n header += \"\\x0A\\x00\";\n // general purpose bit flag\n // set bit 11 if utf8\n header += (useUTF8ForFileName || useUTF8ForComment) ? \"\\x00\\x08\" : \"\\x00\\x00\";\n // compression method\n header += compressedObject.compressionMethod;\n // last mod file time\n header += decToHex(dosTime, 2);\n // last mod file date\n header += decToHex(dosDate, 2);\n // crc-32\n header += decToHex(compressedObject.crc32, 4);\n // compressed size\n header += decToHex(compressedObject.compressedSize, 4);\n // uncompressed size\n header += decToHex(compressedObject.uncompressedSize, 4);\n // file name length\n header += decToHex(utfEncodedFileName.length, 2);\n // extra field length\n header += decToHex(extraFields.length, 2);\n\n\n var fileRecord = signature.LOCAL_FILE_HEADER + header + utfEncodedFileName + extraFields;\n\n var dirRecord = signature.CENTRAL_FILE_HEADER +\n // version made by (00: DOS)\n \"\\x14\\x00\" +\n // file header (common to file and central directory)\n header +\n // file comment length\n decToHex(utfEncodedComment.length, 2) +\n // disk number start\n \"\\x00\\x00\" +\n // internal file attributes TODO\n \"\\x00\\x00\" +\n // external file attributes\n (dir === true ? \"\\x10\\x00\\x00\\x00\" : \"\\x00\\x00\\x00\\x00\") +\n // relative offset of local header\n decToHex(offset, 4) +\n // file name\n utfEncodedFileName +\n // extra field\n extraFields +\n // file comment\n utfEncodedComment;\n\n return {\n fileRecord: fileRecord,\n dirRecord: dirRecord,\n compressedObject: compressedObject\n };\n};\n\n\n// return the actual prototype of JSZip\nvar out = {\n /**\n * Read an existing zip and merge the data in the current JSZip object.\n * The implementation is in jszip-load.js, don't forget to include it.\n * @param {String|ArrayBuffer|Uint8Array|Buffer} stream The stream to load\n * @param {Object} options Options for loading the stream.\n * options.base64 : is the stream in base64 ? default : false\n * @return {JSZip} the current JSZip object\n */\n load: function(stream, options) {\n throw new Error(\"Load method is not defined. Is the file jszip-load.js included ?\");\n },\n\n /**\n * Filter nested files/folders with the specified function.\n * @param {Function} search the predicate to use :\n * function (relativePath, file) {...}\n * It takes 2 arguments : the relative path and the file.\n * @return {Array} An array of matching elements.\n */\n filter: function(search) {\n var result = [],\n filename, relativePath, file, fileClone;\n for (filename in this.files) {\n if (!this.files.hasOwnProperty(filename)) {\n continue;\n }\n file = this.files[filename];\n // return a new object, don't let the user mess with our internal objects :)\n fileClone = new ZipObject(file.name, file._data, extend(file.options));\n relativePath = filename.slice(this.root.length, filename.length);\n if (filename.slice(0, this.root.length) === this.root && // the file is in the current root\n search(relativePath, fileClone)) { // and the file matches the function\n result.push(fileClone);\n }\n }\n return result;\n },\n\n /**\n * Add a file to the zip file, or search a file.\n * @param {string|RegExp} name The name of the file to add (if data is defined),\n * the name of the file to find (if no data) or a regex to match files.\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data The file data, either raw or base64 encoded\n * @param {Object} o File options\n * @return {JSZip|Object|Array} this JSZip object (when adding a file),\n * a file (when searching by string) or an array of files (when searching by regex).\n */\n file: function(name, data, o) {\n if (arguments.length === 1) {\n if (utils.isRegExp(name)) {\n var regexp = name;\n return this.filter(function(relativePath, file) {\n return !file.dir && regexp.test(relativePath);\n });\n }\n else { // text\n return this.filter(function(relativePath, file) {\n return !file.dir && relativePath === name;\n })[0] || null;\n }\n }\n else { // more than one argument : we have data !\n name = this.root + name;\n fileAdd.call(this, name, data, o);\n }\n return this;\n },\n\n /**\n * Add a directory to the zip file, or search.\n * @param {String|RegExp} arg The name of the directory to add, or a regex to search folders.\n * @return {JSZip} an object with the new directory as the root, or an array containing matching folders.\n */\n folder: function(arg) {\n if (!arg) {\n return this;\n }\n\n if (utils.isRegExp(arg)) {\n return this.filter(function(relativePath, file) {\n return file.dir && arg.test(relativePath);\n });\n }\n\n // else, name is a new folder\n var name = this.root + arg;\n var newFolder = folderAdd.call(this, name);\n\n // Allow chaining by returning a new object with this folder as the root\n var ret = this.clone();\n ret.root = newFolder.name;\n return ret;\n },\n\n /**\n * Delete a file, or a directory and all sub-files, from the zip\n * @param {string} name the name of the file to delete\n * @return {JSZip} this JSZip object\n */\n remove: function(name) {\n name = this.root + name;\n var file = this.files[name];\n if (!file) {\n // Look for any folders\n if (name.slice(-1) != \"/\") {\n name += \"/\";\n }\n file = this.files[name];\n }\n\n if (file && !file.dir) {\n // file\n delete this.files[name];\n } else {\n // maybe a folder, delete recursively\n var kids = this.filter(function(relativePath, file) {\n return file.name.slice(0, name.length) === name;\n });\n for (var i = 0; i < kids.length; i++) {\n delete this.files[kids[i].name];\n }\n }\n\n return this;\n },\n\n /**\n * Generate the complete zip file\n * @param {Object} options the options to generate the zip file :\n * - base64, (deprecated, use type instead) true to generate base64.\n * - compression, \"STORE\" by default.\n * - type, \"base64\" by default. Values are : string, base64, uint8array, arraybuffer, blob.\n * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file\n */\n generate: function(options) {\n options = extend(options || {}, {\n base64: true,\n compression: \"STORE\",\n type: \"base64\",\n comment: null\n });\n\n utils.checkSupport(options.type);\n\n var zipData = [],\n localDirLength = 0,\n centralDirLength = 0,\n writer, i,\n utfEncodedComment = utils.transformTo(\"string\", this.utf8encode(options.comment || this.comment || \"\"));\n\n // first, generate all the zip parts.\n for (var name in this.files) {\n if (!this.files.hasOwnProperty(name)) {\n continue;\n }\n var file = this.files[name];\n\n var compressionName = file.options.compression || options.compression.toUpperCase();\n var compression = compressions[compressionName];\n if (!compression) {\n throw new Error(compressionName + \" is not a valid compression method !\");\n }\n\n var compressedObject = generateCompressedObjectFrom.call(this, file, compression);\n\n var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength);\n localDirLength += zipPart.fileRecord.length + compressedObject.compressedSize;\n centralDirLength += zipPart.dirRecord.length;\n zipData.push(zipPart);\n }\n\n var dirEnd = \"\";\n\n // end of central dir signature\n dirEnd = signature.CENTRAL_DIRECTORY_END +\n // number of this disk\n \"\\x00\\x00\" +\n // number of the disk with the start of the central directory\n \"\\x00\\x00\" +\n // total number of entries in the central directory on this disk\n decToHex(zipData.length, 2) +\n // total number of entries in the central directory\n decToHex(zipData.length, 2) +\n // size of the central directory 4 bytes\n decToHex(centralDirLength, 4) +\n // offset of start of central directory with respect to the starting disk number\n decToHex(localDirLength, 4) +\n // .ZIP file comment length\n decToHex(utfEncodedComment.length, 2) +\n // .ZIP file comment\n utfEncodedComment;\n\n\n // we have all the parts (and the total length)\n // time to create a writer !\n var typeName = options.type.toLowerCase();\n if(typeName===\"uint8array\"||typeName===\"arraybuffer\"||typeName===\"blob\"||typeName===\"nodebuffer\") {\n writer = new Uint8ArrayWriter(localDirLength + centralDirLength + dirEnd.length);\n }else{\n writer = new StringWriter(localDirLength + centralDirLength + dirEnd.length);\n }\n\n for (i = 0; i < zipData.length; i++) {\n writer.append(zipData[i].fileRecord);\n writer.append(zipData[i].compressedObject.compressedContent);\n }\n for (i = 0; i < zipData.length; i++) {\n writer.append(zipData[i].dirRecord);\n }\n\n writer.append(dirEnd);\n\n var zip = writer.finalize();\n\n\n\n switch(options.type.toLowerCase()) {\n // case \"zip is an Uint8Array\"\n case \"uint8array\" :\n case \"arraybuffer\" :\n case \"nodebuffer\" :\n return utils.transformTo(options.type.toLowerCase(), zip);\n case \"blob\" :\n return utils.arrayBuffer2Blob(utils.transformTo(\"arraybuffer\", zip));\n // case \"zip is a string\"\n case \"base64\" :\n return (options.base64) ? base64.encode(zip) : zip;\n default : // case \"string\" :\n return zip;\n }\n\n },\n\n /**\n * @deprecated\n * This method will be removed in a future version without replacement.\n */\n crc32: function (input, crc) {\n return crc32(input, crc);\n },\n\n /**\n * @deprecated\n * This method will be removed in a future version without replacement.\n */\n utf8encode: function (string) {\n return utils.transformTo(\"string\", utf8.utf8encode(string));\n },\n\n /**\n * @deprecated\n * This method will be removed in a future version without replacement.\n */\n utf8decode: function (input) {\n return utf8.utf8decode(input);\n }\n};\nmodule.exports = out;\n\n},{\"./base64\":1,\"./compressedObject\":2,\"./compressions\":3,\"./crc32\":4,\"./defaults\":6,\"./nodeBuffer\":11,\"./signature\":14,\"./stringWriter\":16,\"./support\":17,\"./uint8ArrayWriter\":19,\"./utf8\":20,\"./utils\":21}],14:[function(_dereq_,module,exports){\n'use strict';\nexports.LOCAL_FILE_HEADER = \"PK\\x03\\x04\";\nexports.CENTRAL_FILE_HEADER = \"PK\\x01\\x02\";\nexports.CENTRAL_DIRECTORY_END = \"PK\\x05\\x06\";\nexports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = \"PK\\x06\\x07\";\nexports.ZIP64_CENTRAL_DIRECTORY_END = \"PK\\x06\\x06\";\nexports.DATA_DESCRIPTOR = \"PK\\x07\\x08\";\n\n},{}],15:[function(_dereq_,module,exports){\n'use strict';\nvar DataReader = _dereq_('./dataReader');\nvar utils = _dereq_('./utils');\n\nfunction StringReader(data, optimizedBinaryString) {\n this.data = data;\n if (!optimizedBinaryString) {\n this.data = utils.string2binary(this.data);\n }\n this.length = this.data.length;\n this.index = 0;\n}\nStringReader.prototype = new DataReader();\n/**\n * @see DataReader.byteAt\n */\nStringReader.prototype.byteAt = function(i) {\n return this.data.charCodeAt(i);\n};\n/**\n * @see DataReader.lastIndexOfSignature\n */\nStringReader.prototype.lastIndexOfSignature = function(sig) {\n return this.data.lastIndexOf(sig);\n};\n/**\n * @see DataReader.readData\n */\nStringReader.prototype.readData = function(size) {\n this.checkOffset(size);\n // this will work because the constructor applied the \"& 0xff\" mask.\n var result = this.data.slice(this.index, this.index + size);\n this.index += size;\n return result;\n};\nmodule.exports = StringReader;\n\n},{\"./dataReader\":5,\"./utils\":21}],16:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('./utils');\n\n/**\n * An object to write any content to a string.\n * @constructor\n */\nvar StringWriter = function() {\n this.data = [];\n};\nStringWriter.prototype = {\n /**\n * Append any content to the current string.\n * @param {Object} input the content to add.\n */\n append: function(input) {\n input = utils.transformTo(\"string\", input);\n this.data.push(input);\n },\n /**\n * Finalize the construction an return the result.\n * @return {string} the generated string.\n */\n finalize: function() {\n return this.data.join(\"\");\n }\n};\n\nmodule.exports = StringWriter;\n\n},{\"./utils\":21}],17:[function(_dereq_,module,exports){\n(function (Buffer){\n'use strict';\nexports.base64 = true;\nexports.array = true;\nexports.string = true;\nexports.arraybuffer = typeof ArrayBuffer !== \"undefined\" && typeof Uint8Array !== \"undefined\";\n// contains true if JSZip can read/generate nodejs Buffer, false otherwise.\n// Browserify will provide a Buffer implementation for browsers, which is\n// an augmented Uint8Array (i.e., can be used as either Buffer or U8).\nexports.nodebuffer = typeof Buffer !== \"undefined\";\n// contains true if JSZip can read/generate Uint8Array, false otherwise.\nexports.uint8array = typeof Uint8Array !== \"undefined\";\n\nif (typeof ArrayBuffer === \"undefined\") {\n exports.blob = false;\n}\nelse {\n var buffer = new ArrayBuffer(0);\n try {\n exports.blob = new Blob([buffer], {\n type: \"application/zip\"\n }).size === 0;\n }\n catch (e) {\n try {\n var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\n var builder = new Builder();\n builder.append(buffer);\n exports.blob = builder.getBlob('application/zip').size === 0;\n }\n catch (e) {\n exports.blob = false;\n }\n }\n}\n\n}).call(this,(typeof Buffer !== \"undefined\" ? Buffer : undefined))\n},{}],18:[function(_dereq_,module,exports){\n'use strict';\nvar DataReader = _dereq_('./dataReader');\n\nfunction Uint8ArrayReader(data) {\n if (data) {\n this.data = data;\n this.length = this.data.length;\n this.index = 0;\n }\n}\nUint8ArrayReader.prototype = new DataReader();\n/**\n * @see DataReader.byteAt\n */\nUint8ArrayReader.prototype.byteAt = function(i) {\n return this.data[i];\n};\n/**\n * @see DataReader.lastIndexOfSignature\n */\nUint8ArrayReader.prototype.lastIndexOfSignature = function(sig) {\n var sig0 = sig.charCodeAt(0),\n sig1 = sig.charCodeAt(1),\n sig2 = sig.charCodeAt(2),\n sig3 = sig.charCodeAt(3);\n for (var i = this.length - 4; i >= 0; --i) {\n if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) {\n return i;\n }\n }\n\n return -1;\n};\n/**\n * @see DataReader.readData\n */\nUint8ArrayReader.prototype.readData = function(size) {\n this.checkOffset(size);\n if(size === 0) {\n // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of [].\n return new Uint8Array(0);\n }\n var result = this.data.subarray(this.index, this.index + size);\n this.index += size;\n return result;\n};\nmodule.exports = Uint8ArrayReader;\n\n},{\"./dataReader\":5}],19:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('./utils');\n\n/**\n * An object to write any content to an Uint8Array.\n * @constructor\n * @param {number} length The length of the array.\n */\nvar Uint8ArrayWriter = function(length) {\n this.data = new Uint8Array(length);\n this.index = 0;\n};\nUint8ArrayWriter.prototype = {\n /**\n * Append any content to the current array.\n * @param {Object} input the content to add.\n */\n append: function(input) {\n if (input.length !== 0) {\n // with an empty Uint8Array, Opera fails with a \"Offset larger than array size\"\n input = utils.transformTo(\"uint8array\", input);\n this.data.set(input, this.index);\n this.index += input.length;\n }\n },\n /**\n * Finalize the construction an return the result.\n * @return {Uint8Array} the generated array.\n */\n finalize: function() {\n return this.data;\n }\n};\n\nmodule.exports = Uint8ArrayWriter;\n\n},{\"./utils\":21}],20:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('./utils');\nvar support = _dereq_('./support');\nvar nodeBuffer = _dereq_('./nodeBuffer');\n\n/**\n * The following functions come from pako, from pako/lib/utils/strings\n * released under the MIT license, see pako https://github.com/nodeca/pako/\n */\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nvar _utf8len = new Array(256);\nfor (var i=0; i<256; i++) {\n _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);\n}\n_utf8len[254]=_utf8len[254]=1; // Invalid sequence start\n\n// convert string to array (typed, when possible)\nvar string2buf = function (str) {\n var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if (((c & 0xfc00) === 0xd800) && (m_pos+1 < str_len)) {\n c2 = str.charCodeAt(m_pos+1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += (c < 0x80) ? 1 : ((c < 0x800) ? 2 : ((c < 0x10000) ? 3 : 4));\n }\n\n // allocate buffer\n if (support.uint8array) {\n buf = new Uint8Array(buf_len);\n } else {\n buf = new Array(buf_len);\n }\n\n // convert\n for (i=0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {\n c2 = str.charCodeAt(m_pos+1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | ((c >>> 6) & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | ((c >>> 12) & 0x3f);\n buf[i++] = 0x80 | ((c >>> 6) & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n};\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max - length limit (mandatory);\nvar utf8border = function(buf, max) {\n var pos;\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n pos = max-1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Fuckup - very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means vuffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\n// convert array to string\nvar buf2string = function (buf) {\n var str, i, out, c, c_len;\n var len = buf.length;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n var utf16buf = new Array(len*2);\n\n for (out=0, i=0; i 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n // shrinkBuf(utf16buf, out)\n if (utf16buf.length !== out) {\n if(utf16buf.subarray) {\n utf16buf = utf16buf.subarray(0, out);\n } else {\n utf16buf.length = out;\n }\n }\n\n // return String.fromCharCode.apply(null, utf16buf);\n return utils.applyFromCharCode(utf16buf);\n};\n\n\n// That's all for the pako functions.\n\n\n/**\n * Transform a javascript string into an array (typed if possible) of bytes,\n * UTF-8 encoded.\n * @param {String} str the string to encode\n * @return {Array|Uint8Array|Buffer} the UTF-8 encoded string.\n */\nexports.utf8encode = function utf8encode(str) {\n if (support.nodebuffer) {\n return nodeBuffer(str, \"utf-8\");\n }\n\n return string2buf(str);\n};\n\n\n/**\n * Transform a bytes array (or a representation) representing an UTF-8 encoded\n * string into a javascript string.\n * @param {Array|Uint8Array|Buffer} buf the data de decode\n * @return {String} the decoded string.\n */\nexports.utf8decode = function utf8decode(buf) {\n if (support.nodebuffer) {\n return utils.transformTo(\"nodebuffer\", buf).toString(\"utf-8\");\n }\n\n buf = utils.transformTo(support.uint8array ? \"uint8array\" : \"array\", buf);\n\n // return buf2string(buf);\n // Chrome prefers to work with \"small\" chunks of data\n // for the method buf2string.\n // Firefox and Chrome has their own shortcut, IE doesn't seem to really care.\n var result = [], k = 0, len = buf.length, chunk = 65536;\n while (k < len) {\n var nextBoundary = utf8border(buf, Math.min(k + chunk, len));\n if (support.uint8array) {\n result.push(buf2string(buf.subarray(k, nextBoundary)));\n } else {\n result.push(buf2string(buf.slice(k, nextBoundary)));\n }\n k = nextBoundary;\n }\n return result.join(\"\");\n\n};\n// vim: set shiftwidth=4 softtabstop=4:\n\n},{\"./nodeBuffer\":11,\"./support\":17,\"./utils\":21}],21:[function(_dereq_,module,exports){\n'use strict';\nvar support = _dereq_('./support');\nvar compressions = _dereq_('./compressions');\nvar nodeBuffer = _dereq_('./nodeBuffer');\n/**\n * Convert a string to a \"binary string\" : a string containing only char codes between 0 and 255.\n * @param {string} str the string to transform.\n * @return {String} the binary string.\n */\nexports.string2binary = function(str) {\n var result = \"\";\n for (var i = 0; i < str.length; i++) {\n result += String.fromCharCode(str.charCodeAt(i) & 0xff);\n }\n return result;\n};\nexports.arrayBuffer2Blob = function(buffer) {\n exports.checkSupport(\"blob\");\n\n try {\n // Blob constructor\n return new Blob([buffer], {\n type: \"application/zip\"\n });\n }\n catch (e) {\n\n try {\n // deprecated, browser only, old way\n var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\n var builder = new Builder();\n builder.append(buffer);\n return builder.getBlob('application/zip');\n }\n catch (e) {\n\n // well, fuck ?!\n throw new Error(\"Bug : can't construct the Blob.\");\n }\n }\n\n\n};\n/**\n * The identity function.\n * @param {Object} input the input.\n * @return {Object} the same input.\n */\nfunction identity(input) {\n return input;\n}\n\n/**\n * Fill in an array with a string.\n * @param {String} str the string to use.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated).\n * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array.\n */\nfunction stringToArrayLike(str, array) {\n for (var i = 0; i < str.length; ++i) {\n array[i] = str.charCodeAt(i) & 0xFF;\n }\n return array;\n}\n\n/**\n * Transform an array-like object to a string.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.\n * @return {String} the result.\n */\nfunction arrayLikeToString(array) {\n // Performances notes :\n // --------------------\n // String.fromCharCode.apply(null, array) is the fastest, see\n // see http://jsperf.com/converting-a-uint8array-to-a-string/2\n // but the stack is limited (and we can get huge arrays !).\n //\n // result += String.fromCharCode(array[i]); generate too many strings !\n //\n // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2\n var chunk = 65536;\n var result = [],\n len = array.length,\n type = exports.getTypeOf(array),\n k = 0,\n canUseApply = true;\n try {\n switch(type) {\n case \"uint8array\":\n String.fromCharCode.apply(null, new Uint8Array(0));\n break;\n case \"nodebuffer\":\n String.fromCharCode.apply(null, nodeBuffer(0));\n break;\n }\n } catch(e) {\n canUseApply = false;\n }\n\n // no apply : slow and painful algorithm\n // default browser on android 4.*\n if (!canUseApply) {\n var resultStr = \"\";\n for(var i = 0; i < array.length;i++) {\n resultStr += String.fromCharCode(array[i]);\n }\n return resultStr;\n }\n while (k < len && chunk > 1) {\n try {\n if (type === \"array\" || type === \"nodebuffer\") {\n result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len))));\n }\n else {\n result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len))));\n }\n k += chunk;\n }\n catch (e) {\n chunk = Math.floor(chunk / 2);\n }\n }\n return result.join(\"\");\n}\n\nexports.applyFromCharCode = arrayLikeToString;\n\n\n/**\n * Copy the data from an array-like to an other array-like.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated.\n * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array.\n */\nfunction arrayLikeToArrayLike(arrayFrom, arrayTo) {\n for (var i = 0; i < arrayFrom.length; i++) {\n arrayTo[i] = arrayFrom[i];\n }\n return arrayTo;\n}\n\n// a matrix containing functions to transform everything into everything.\nvar transform = {};\n\n// string to ?\ntransform[\"string\"] = {\n \"string\": identity,\n \"array\": function(input) {\n return stringToArrayLike(input, new Array(input.length));\n },\n \"arraybuffer\": function(input) {\n return transform[\"string\"][\"uint8array\"](input).buffer;\n },\n \"uint8array\": function(input) {\n return stringToArrayLike(input, new Uint8Array(input.length));\n },\n \"nodebuffer\": function(input) {\n return stringToArrayLike(input, nodeBuffer(input.length));\n }\n};\n\n// array to ?\ntransform[\"array\"] = {\n \"string\": arrayLikeToString,\n \"array\": identity,\n \"arraybuffer\": function(input) {\n return (new Uint8Array(input)).buffer;\n },\n \"uint8array\": function(input) {\n return new Uint8Array(input);\n },\n \"nodebuffer\": function(input) {\n return nodeBuffer(input);\n }\n};\n\n// arraybuffer to ?\ntransform[\"arraybuffer\"] = {\n \"string\": function(input) {\n return arrayLikeToString(new Uint8Array(input));\n },\n \"array\": function(input) {\n return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength));\n },\n \"arraybuffer\": identity,\n \"uint8array\": function(input) {\n return new Uint8Array(input);\n },\n \"nodebuffer\": function(input) {\n return nodeBuffer(new Uint8Array(input));\n }\n};\n\n// uint8array to ?\ntransform[\"uint8array\"] = {\n \"string\": arrayLikeToString,\n \"array\": function(input) {\n return arrayLikeToArrayLike(input, new Array(input.length));\n },\n \"arraybuffer\": function(input) {\n return input.buffer;\n },\n \"uint8array\": identity,\n \"nodebuffer\": function(input) {\n return nodeBuffer(input);\n }\n};\n\n// nodebuffer to ?\ntransform[\"nodebuffer\"] = {\n \"string\": arrayLikeToString,\n \"array\": function(input) {\n return arrayLikeToArrayLike(input, new Array(input.length));\n },\n \"arraybuffer\": function(input) {\n return transform[\"nodebuffer\"][\"uint8array\"](input).buffer;\n },\n \"uint8array\": function(input) {\n return arrayLikeToArrayLike(input, new Uint8Array(input.length));\n },\n \"nodebuffer\": identity\n};\n\n/**\n * Transform an input into any type.\n * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer.\n * If no output type is specified, the unmodified input will be returned.\n * @param {String} outputType the output type.\n * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert.\n * @throws {Error} an Error if the browser doesn't support the requested output type.\n */\nexports.transformTo = function(outputType, input) {\n if (!input) {\n // undefined, null, etc\n // an empty string won't harm.\n input = \"\";\n }\n if (!outputType) {\n return input;\n }\n exports.checkSupport(outputType);\n var inputType = exports.getTypeOf(input);\n var result = transform[inputType][outputType](input);\n return result;\n};\n\n/**\n * Return the type of the input.\n * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer.\n * @param {Object} input the input to identify.\n * @return {String} the (lowercase) type of the input.\n */\nexports.getTypeOf = function(input) {\n if (typeof input === \"string\") {\n return \"string\";\n }\n if (Object.prototype.toString.call(input) === \"[object Array]\") {\n return \"array\";\n }\n if (support.nodebuffer && nodeBuffer.test(input)) {\n return \"nodebuffer\";\n }\n if (support.uint8array && input instanceof Uint8Array) {\n return \"uint8array\";\n }\n if (support.arraybuffer && input instanceof ArrayBuffer) {\n return \"arraybuffer\";\n }\n};\n\n/**\n * Throw an exception if the type is not supported.\n * @param {String} type the type to check.\n * @throws {Error} an Error if the browser doesn't support the requested type.\n */\nexports.checkSupport = function(type) {\n var supported = support[type.toLowerCase()];\n if (!supported) {\n throw new Error(type + \" is not supported by this browser\");\n }\n};\nexports.MAX_VALUE_16BITS = 65535;\nexports.MAX_VALUE_32BITS = -1; // well, \"\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\" is parsed as -1\n\n/**\n * Prettify a string read as binary.\n * @param {string} str the string to prettify.\n * @return {string} a pretty string.\n */\nexports.pretty = function(str) {\n var res = '',\n code, i;\n for (i = 0; i < (str || \"\").length; i++) {\n code = str.charCodeAt(i);\n res += '\\\\x' + (code < 16 ? \"0\" : \"\") + code.toString(16).toUpperCase();\n }\n return res;\n};\n\n/**\n * Find a compression registered in JSZip.\n * @param {string} compressionMethod the method magic to find.\n * @return {Object|null} the JSZip compression object, null if none found.\n */\nexports.findCompression = function(compressionMethod) {\n for (var method in compressions) {\n if (!compressions.hasOwnProperty(method)) {\n continue;\n }\n if (compressions[method].magic === compressionMethod) {\n return compressions[method];\n }\n }\n return null;\n};\n/**\n* Cross-window, cross-Node-context regular expression detection\n* @param {Object} object Anything\n* @return {Boolean} true if the object is a regular expression,\n* false otherwise\n*/\nexports.isRegExp = function (object) {\n return Object.prototype.toString.call(object) === \"[object RegExp]\";\n};\n\n\n},{\"./compressions\":3,\"./nodeBuffer\":11,\"./support\":17}],22:[function(_dereq_,module,exports){\n'use strict';\nvar StringReader = _dereq_('./stringReader');\nvar NodeBufferReader = _dereq_('./nodeBufferReader');\nvar Uint8ArrayReader = _dereq_('./uint8ArrayReader');\nvar utils = _dereq_('./utils');\nvar sig = _dereq_('./signature');\nvar ZipEntry = _dereq_('./zipEntry');\nvar support = _dereq_('./support');\nvar jszipProto = _dereq_('./object');\n// class ZipEntries {{{\n/**\n * All the entries in the zip file.\n * @constructor\n * @param {String|ArrayBuffer|Uint8Array} data the binary stream to load.\n * @param {Object} loadOptions Options for loading the stream.\n */\nfunction ZipEntries(data, loadOptions) {\n this.files = [];\n this.loadOptions = loadOptions;\n if (data) {\n this.load(data);\n }\n}\nZipEntries.prototype = {\n /**\n * Check that the reader is on the speficied signature.\n * @param {string} expectedSignature the expected signature.\n * @throws {Error} if it is an other signature.\n */\n checkSignature: function(expectedSignature) {\n var signature = this.reader.readString(4);\n if (signature !== expectedSignature) {\n throw new Error(\"Corrupted zip or bug : unexpected signature \" + \"(\" + utils.pretty(signature) + \", expected \" + utils.pretty(expectedSignature) + \")\");\n }\n },\n /**\n * Read the end of the central directory.\n */\n readBlockEndOfCentral: function() {\n this.diskNumber = this.reader.readInt(2);\n this.diskWithCentralDirStart = this.reader.readInt(2);\n this.centralDirRecordsOnThisDisk = this.reader.readInt(2);\n this.centralDirRecords = this.reader.readInt(2);\n this.centralDirSize = this.reader.readInt(4);\n this.centralDirOffset = this.reader.readInt(4);\n\n this.zipCommentLength = this.reader.readInt(2);\n // warning : the encoding depends of the system locale\n // On a linux machine with LANG=en_US.utf8, this field is utf8 encoded.\n // On a windows machine, this field is encoded with the localized windows code page.\n this.zipComment = this.reader.readString(this.zipCommentLength);\n // To get consistent behavior with the generation part, we will assume that\n // this is utf8 encoded.\n this.zipComment = jszipProto.utf8decode(this.zipComment);\n },\n /**\n * Read the end of the Zip 64 central directory.\n * Not merged with the method readEndOfCentral :\n * The end of central can coexist with its Zip64 brother,\n * I don't want to read the wrong number of bytes !\n */\n readBlockZip64EndOfCentral: function() {\n this.zip64EndOfCentralSize = this.reader.readInt(8);\n this.versionMadeBy = this.reader.readString(2);\n this.versionNeeded = this.reader.readInt(2);\n this.diskNumber = this.reader.readInt(4);\n this.diskWithCentralDirStart = this.reader.readInt(4);\n this.centralDirRecordsOnThisDisk = this.reader.readInt(8);\n this.centralDirRecords = this.reader.readInt(8);\n this.centralDirSize = this.reader.readInt(8);\n this.centralDirOffset = this.reader.readInt(8);\n\n this.zip64ExtensibleData = {};\n var extraDataSize = this.zip64EndOfCentralSize - 44,\n index = 0,\n extraFieldId,\n extraFieldLength,\n extraFieldValue;\n while (index < extraDataSize) {\n extraFieldId = this.reader.readInt(2);\n extraFieldLength = this.reader.readInt(4);\n extraFieldValue = this.reader.readString(extraFieldLength);\n this.zip64ExtensibleData[extraFieldId] = {\n id: extraFieldId,\n length: extraFieldLength,\n value: extraFieldValue\n };\n }\n },\n /**\n * Read the end of the Zip 64 central directory locator.\n */\n readBlockZip64EndOfCentralLocator: function() {\n this.diskWithZip64CentralDirStart = this.reader.readInt(4);\n this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8);\n this.disksCount = this.reader.readInt(4);\n if (this.disksCount > 1) {\n throw new Error(\"Multi-volumes zip are not supported\");\n }\n },\n /**\n * Read the local files, based on the offset read in the central part.\n */\n readLocalFiles: function() {\n var i, file;\n for (i = 0; i < this.files.length; i++) {\n file = this.files[i];\n this.reader.setIndex(file.localHeaderOffset);\n this.checkSignature(sig.LOCAL_FILE_HEADER);\n file.readLocalPart(this.reader);\n file.handleUTF8();\n }\n },\n /**\n * Read the central directory.\n */\n readCentralDir: function() {\n var file;\n\n this.reader.setIndex(this.centralDirOffset);\n while (this.reader.readString(4) === sig.CENTRAL_FILE_HEADER) {\n file = new ZipEntry({\n zip64: this.zip64\n }, this.loadOptions);\n file.readCentralPart(this.reader);\n this.files.push(file);\n }\n },\n /**\n * Read the end of central directory.\n */\n readEndOfCentral: function() {\n var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END);\n if (offset === -1) {\n throw new Error(\"Corrupted zip : can't find end of central directory\");\n }\n this.reader.setIndex(offset);\n this.checkSignature(sig.CENTRAL_DIRECTORY_END);\n this.readBlockEndOfCentral();\n\n\n /* extract from the zip spec :\n 4) If one of the fields in the end of central directory\n record is too small to hold required data, the field\n should be set to -1 (0xFFFF or 0xFFFFFFFF) and the\n ZIP64 format record should be created.\n 5) The end of central directory record and the\n Zip64 end of central directory locator record must\n reside on the same disk when splitting or spanning\n an archive.\n */\n if (this.diskNumber === utils.MAX_VALUE_16BITS || this.diskWithCentralDirStart === utils.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === utils.MAX_VALUE_16BITS || this.centralDirRecords === utils.MAX_VALUE_16BITS || this.centralDirSize === utils.MAX_VALUE_32BITS || this.centralDirOffset === utils.MAX_VALUE_32BITS) {\n this.zip64 = true;\n\n /*\n Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from\n the zip file can fit into a 32bits integer. This cannot be solved : Javascript represents\n all numbers as 64-bit double precision IEEE 754 floating point numbers.\n So, we have 53bits for integers and bitwise operations treat everything as 32bits.\n see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators\n and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5\n */\n\n // should look for a zip64 EOCD locator\n offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);\n if (offset === -1) {\n throw new Error(\"Corrupted zip : can't find the ZIP64 end of central directory locator\");\n }\n this.reader.setIndex(offset);\n this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);\n this.readBlockZip64EndOfCentralLocator();\n\n // now the zip64 EOCD record\n this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir);\n this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END);\n this.readBlockZip64EndOfCentral();\n }\n },\n prepareReader: function(data) {\n var type = utils.getTypeOf(data);\n if (type === \"string\" && !support.uint8array) {\n this.reader = new StringReader(data, this.loadOptions.optimizedBinaryString);\n }\n else if (type === \"nodebuffer\") {\n this.reader = new NodeBufferReader(data);\n }\n else {\n this.reader = new Uint8ArrayReader(utils.transformTo(\"uint8array\", data));\n }\n },\n /**\n * Read a zip file and create ZipEntries.\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file.\n */\n load: function(data) {\n this.prepareReader(data);\n this.readEndOfCentral();\n this.readCentralDir();\n this.readLocalFiles();\n }\n};\n// }}} end of ZipEntries\nmodule.exports = ZipEntries;\n\n},{\"./nodeBufferReader\":12,\"./object\":13,\"./signature\":14,\"./stringReader\":15,\"./support\":17,\"./uint8ArrayReader\":18,\"./utils\":21,\"./zipEntry\":23}],23:[function(_dereq_,module,exports){\n'use strict';\nvar StringReader = _dereq_('./stringReader');\nvar utils = _dereq_('./utils');\nvar CompressedObject = _dereq_('./compressedObject');\nvar jszipProto = _dereq_('./object');\n// class ZipEntry {{{\n/**\n * An entry in the zip file.\n * @constructor\n * @param {Object} options Options of the current file.\n * @param {Object} loadOptions Options for loading the stream.\n */\nfunction ZipEntry(options, loadOptions) {\n this.options = options;\n this.loadOptions = loadOptions;\n}\nZipEntry.prototype = {\n /**\n * say if the file is encrypted.\n * @return {boolean} true if the file is encrypted, false otherwise.\n */\n isEncrypted: function() {\n // bit 1 is set\n return (this.bitFlag & 0x0001) === 0x0001;\n },\n /**\n * say if the file has utf-8 filename/comment.\n * @return {boolean} true if the filename/comment is in utf-8, false otherwise.\n */\n useUTF8: function() {\n // bit 11 is set\n return (this.bitFlag & 0x0800) === 0x0800;\n },\n /**\n * Prepare the function used to generate the compressed content from this ZipFile.\n * @param {DataReader} reader the reader to use.\n * @param {number} from the offset from where we should read the data.\n * @param {number} length the length of the data to read.\n * @return {Function} the callback to get the compressed content (the type depends of the DataReader class).\n */\n prepareCompressedContent: function(reader, from, length) {\n return function() {\n var previousIndex = reader.index;\n reader.setIndex(from);\n var compressedFileData = reader.readData(length);\n reader.setIndex(previousIndex);\n\n return compressedFileData;\n };\n },\n /**\n * Prepare the function used to generate the uncompressed content from this ZipFile.\n * @param {DataReader} reader the reader to use.\n * @param {number} from the offset from where we should read the data.\n * @param {number} length the length of the data to read.\n * @param {JSZip.compression} compression the compression used on this file.\n * @param {number} uncompressedSize the uncompressed size to expect.\n * @return {Function} the callback to get the uncompressed content (the type depends of the DataReader class).\n */\n prepareContent: function(reader, from, length, compression, uncompressedSize) {\n return function() {\n\n var compressedFileData = utils.transformTo(compression.uncompressInputType, this.getCompressedContent());\n var uncompressedFileData = compression.uncompress(compressedFileData);\n\n if (uncompressedFileData.length !== uncompressedSize) {\n throw new Error(\"Bug : uncompressed data size mismatch\");\n }\n\n return uncompressedFileData;\n };\n },\n /**\n * Read the local part of a zip file and add the info in this object.\n * @param {DataReader} reader the reader to use.\n */\n readLocalPart: function(reader) {\n var compression, localExtraFieldsLength;\n\n // we already know everything from the central dir !\n // If the central dir data are false, we are doomed.\n // On the bright side, the local part is scary : zip64, data descriptors, both, etc.\n // The less data we get here, the more reliable this should be.\n // Let's skip the whole header and dash to the data !\n reader.skip(22);\n // in some zip created on windows, the filename stored in the central dir contains \\ instead of /.\n // Strangely, the filename here is OK.\n // I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes\n // or APPNOTE#4.4.17.1, \"All slashes MUST be forward slashes '/'\") but there are a lot of bad zip generators...\n // Search \"unzip mismatching \"local\" filename continuing with \"central\" filename version\" on\n // the internet.\n //\n // I think I see the logic here : the central directory is used to display\n // content and the local directory is used to extract the files. Mixing / and \\\n // may be used to display \\ to windows users and use / when extracting the files.\n // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394\n this.fileNameLength = reader.readInt(2);\n localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir\n this.fileName = reader.readString(this.fileNameLength);\n reader.skip(localExtraFieldsLength);\n\n if (this.compressedSize == -1 || this.uncompressedSize == -1) {\n throw new Error(\"Bug or corrupted zip : didn't get enough informations from the central directory \" + \"(compressedSize == -1 || uncompressedSize == -1)\");\n }\n\n compression = utils.findCompression(this.compressionMethod);\n if (compression === null) { // no compression found\n throw new Error(\"Corrupted zip : compression \" + utils.pretty(this.compressionMethod) + \" unknown (inner file : \" + this.fileName + \")\");\n }\n this.decompressed = new CompressedObject();\n this.decompressed.compressedSize = this.compressedSize;\n this.decompressed.uncompressedSize = this.uncompressedSize;\n this.decompressed.crc32 = this.crc32;\n this.decompressed.compressionMethod = this.compressionMethod;\n this.decompressed.getCompressedContent = this.prepareCompressedContent(reader, reader.index, this.compressedSize, compression);\n this.decompressed.getContent = this.prepareContent(reader, reader.index, this.compressedSize, compression, this.uncompressedSize);\n\n // we need to compute the crc32...\n if (this.loadOptions.checkCRC32) {\n this.decompressed = utils.transformTo(\"string\", this.decompressed.getContent());\n if (jszipProto.crc32(this.decompressed) !== this.crc32) {\n throw new Error(\"Corrupted zip : CRC32 mismatch\");\n }\n }\n },\n\n /**\n * Read the central part of a zip file and add the info in this object.\n * @param {DataReader} reader the reader to use.\n */\n readCentralPart: function(reader) {\n this.versionMadeBy = reader.readString(2);\n this.versionNeeded = reader.readInt(2);\n this.bitFlag = reader.readInt(2);\n this.compressionMethod = reader.readString(2);\n this.date = reader.readDate();\n this.crc32 = reader.readInt(4);\n this.compressedSize = reader.readInt(4);\n this.uncompressedSize = reader.readInt(4);\n this.fileNameLength = reader.readInt(2);\n this.extraFieldsLength = reader.readInt(2);\n this.fileCommentLength = reader.readInt(2);\n this.diskNumberStart = reader.readInt(2);\n this.internalFileAttributes = reader.readInt(2);\n this.externalFileAttributes = reader.readInt(4);\n this.localHeaderOffset = reader.readInt(4);\n\n if (this.isEncrypted()) {\n throw new Error(\"Encrypted zip are not supported\");\n }\n\n this.fileName = reader.readString(this.fileNameLength);\n this.readExtraFields(reader);\n this.parseZIP64ExtraField(reader);\n this.fileComment = reader.readString(this.fileCommentLength);\n\n // warning, this is true only for zip with madeBy == DOS (plateform dependent feature)\n this.dir = this.externalFileAttributes & 0x00000010 ? true : false;\n },\n /**\n * Parse the ZIP64 extra field and merge the info in the current ZipEntry.\n * @param {DataReader} reader the reader to use.\n */\n parseZIP64ExtraField: function(reader) {\n\n if (!this.extraFields[0x0001]) {\n return;\n }\n\n // should be something, preparing the extra reader\n var extraReader = new StringReader(this.extraFields[0x0001].value);\n\n // I really hope that these 64bits integer can fit in 32 bits integer, because js\n // won't let us have more.\n if (this.uncompressedSize === utils.MAX_VALUE_32BITS) {\n this.uncompressedSize = extraReader.readInt(8);\n }\n if (this.compressedSize === utils.MAX_VALUE_32BITS) {\n this.compressedSize = extraReader.readInt(8);\n }\n if (this.localHeaderOffset === utils.MAX_VALUE_32BITS) {\n this.localHeaderOffset = extraReader.readInt(8);\n }\n if (this.diskNumberStart === utils.MAX_VALUE_32BITS) {\n this.diskNumberStart = extraReader.readInt(4);\n }\n },\n /**\n * Read the central part of a zip file and add the info in this object.\n * @param {DataReader} reader the reader to use.\n */\n readExtraFields: function(reader) {\n var start = reader.index,\n extraFieldId,\n extraFieldLength,\n extraFieldValue;\n\n this.extraFields = this.extraFields || {};\n\n while (reader.index < start + this.extraFieldsLength) {\n extraFieldId = reader.readInt(2);\n extraFieldLength = reader.readInt(2);\n extraFieldValue = reader.readString(extraFieldLength);\n\n this.extraFields[extraFieldId] = {\n id: extraFieldId,\n length: extraFieldLength,\n value: extraFieldValue\n };\n }\n },\n /**\n * Apply an UTF8 transformation if needed.\n */\n handleUTF8: function() {\n if (this.useUTF8()) {\n this.fileName = jszipProto.utf8decode(this.fileName);\n this.fileComment = jszipProto.utf8decode(this.fileComment);\n } else {\n var upath = this.findExtraFieldUnicodePath();\n if (upath !== null) {\n this.fileName = upath;\n }\n var ucomment = this.findExtraFieldUnicodeComment();\n if (ucomment !== null) {\n this.fileComment = ucomment;\n }\n }\n },\n\n /**\n * Find the unicode path declared in the extra field, if any.\n * @return {String} the unicode path, null otherwise.\n */\n findExtraFieldUnicodePath: function() {\n var upathField = this.extraFields[0x7075];\n if (upathField) {\n var extraReader = new StringReader(upathField.value);\n\n // wrong version\n if (extraReader.readInt(1) !== 1) {\n return null;\n }\n\n // the crc of the filename changed, this field is out of date.\n if (jszipProto.crc32(this.fileName) !== extraReader.readInt(4)) {\n return null;\n }\n\n return jszipProto.utf8decode(extraReader.readString(upathField.length - 5));\n }\n return null;\n },\n\n /**\n * Find the unicode comment declared in the extra field, if any.\n * @return {String} the unicode comment, null otherwise.\n */\n findExtraFieldUnicodeComment: function() {\n var ucommentField = this.extraFields[0x6375];\n if (ucommentField) {\n var extraReader = new StringReader(ucommentField.value);\n\n // wrong version\n if (extraReader.readInt(1) !== 1) {\n return null;\n }\n\n // the crc of the comment changed, this field is out of date.\n if (jszipProto.crc32(this.fileComment) !== extraReader.readInt(4)) {\n return null;\n }\n\n return jszipProto.utf8decode(extraReader.readString(ucommentField.length - 5));\n }\n return null;\n }\n};\nmodule.exports = ZipEntry;\n\n},{\"./compressedObject\":2,\"./object\":13,\"./stringReader\":15,\"./utils\":21}],24:[function(_dereq_,module,exports){\n// Top level file is just a mixin of submodules & constants\n'use strict';\n\nvar assign = _dereq_('./lib/utils/common').assign;\n\nvar deflate = _dereq_('./lib/deflate');\nvar inflate = _dereq_('./lib/inflate');\nvar constants = _dereq_('./lib/zlib/constants');\n\nvar pako = {};\n\nassign(pako, deflate, inflate, constants);\n\nmodule.exports = pako;\n},{\"./lib/deflate\":25,\"./lib/inflate\":26,\"./lib/utils/common\":27,\"./lib/zlib/constants\":30}],25:[function(_dereq_,module,exports){\n'use strict';\n\n\nvar zlib_deflate = _dereq_('./zlib/deflate.js');\nvar utils = _dereq_('./utils/common');\nvar strings = _dereq_('./utils/strings');\nvar msg = _dereq_('./zlib/messages');\nvar zstream = _dereq_('./zlib/zstream');\n\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nvar Z_NO_FLUSH = 0;\nvar Z_FINISH = 4;\n\nvar Z_OK = 0;\nvar Z_STREAM_END = 1;\n\nvar Z_DEFAULT_COMPRESSION = -1;\n\nvar Z_DEFAULT_STRATEGY = 0;\n\nvar Z_DEFLATED = 8;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overriden.\n **/\n\n/**\n * Deflate.result -> Uint8Array|Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n * (each char code [0..255])\n * - `header` (Object) - custom header for gzip\n * - `text` (Boolean) - true if compressed data believed to be text\n * - `time` (Number) - modification time, unix timestamp\n * - `os` (Number) - operation system code\n * - `extra` (Array) - array of bytes with extra data (max 65536)\n * - `name` (String) - file name (binary string)\n * - `comment` (String) - comment (binary string)\n * - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true); // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nvar Deflate = function(options) {\n\n this.options = utils.assign({\n level: Z_DEFAULT_COMPRESSION,\n method: Z_DEFLATED,\n chunkSize: 16384,\n windowBits: 15,\n memLevel: 8,\n strategy: Z_DEFAULT_STRATEGY,\n to: ''\n }, options || {});\n\n var opt = this.options;\n\n if (opt.raw && (opt.windowBits > 0)) {\n opt.windowBits = -opt.windowBits;\n }\n\n else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n opt.windowBits += 16;\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n var status = zlib_deflate.deflateInit2(\n this.strm,\n opt.level,\n opt.method,\n opt.windowBits,\n opt.memLevel,\n opt.strategy\n );\n\n if (status !== Z_OK) {\n throw new Error(msg[status]);\n }\n\n if (opt.header) {\n zlib_deflate.deflateSetHeader(this.strm, opt.header);\n }\n};\n\n/**\n * Deflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|String): input data. Strings will be converted to\n * utf8 byte sequence.\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That flush internal pending buffers and call\n * [[Deflate#onEnd]].\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * array format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nDeflate.prototype.push = function(data, mode) {\n var strm = this.strm;\n var chunkSize = this.options.chunkSize;\n var status, _mode;\n\n if (this.ended) { return false; }\n\n _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);\n\n // Convert data if needed\n if (typeof data === 'string') {\n // If we need to compress text, change encoding to utf8.\n strm.input = strings.string2buf(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n do {\n if (strm.avail_out === 0) {\n strm.output = new utils.Buf8(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n status = zlib_deflate.deflate(strm, _mode); /* no bad return value */\n\n if (status !== Z_STREAM_END && status !== Z_OK) {\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n if (strm.avail_out === 0 || (strm.avail_in === 0 && _mode === Z_FINISH)) {\n if (this.options.to === 'string') {\n this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));\n } else {\n this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n }\n }\n } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);\n\n // Finalize on the last chunk.\n if (_mode === Z_FINISH) {\n status = zlib_deflate.deflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === Z_OK;\n }\n\n return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): ouput data. Type of array depends\n * on js engine support. When string output requested, each chunk\n * will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate.prototype.onData = function(chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called once after you tell deflate that input stream complete\n * or error happenned. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate.prototype.onEnd = function(status) {\n // On success - join\n if (status === Z_OK) {\n if (this.options.to === 'string') {\n this.result = this.chunks.join('');\n } else {\n this.result = utils.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate alrorythm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n * (each char code [0..255])\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , data = Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate(input, options) {\n var deflator = new Deflate(options);\n\n deflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (deflator.err) { throw deflator.msg; }\n\n return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return deflate(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip(input, options) {\n options = options || {};\n options.gzip = true;\n return deflate(input, options);\n}\n\n\nexports.Deflate = Deflate;\nexports.deflate = deflate;\nexports.deflateRaw = deflateRaw;\nexports.gzip = gzip;\n},{\"./utils/common\":27,\"./utils/strings\":28,\"./zlib/deflate.js\":32,\"./zlib/messages\":37,\"./zlib/zstream\":39}],26:[function(_dereq_,module,exports){\n'use strict';\n\n\nvar zlib_inflate = _dereq_('./zlib/inflate.js');\nvar utils = _dereq_('./utils/common');\nvar strings = _dereq_('./utils/strings');\nvar c = _dereq_('./zlib/constants');\nvar msg = _dereq_('./zlib/messages');\nvar zstream = _dereq_('./zlib/zstream');\nvar gzheader = _dereq_('./zlib/gzheader');\n\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overriden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true); // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nvar Inflate = function(options) {\n\n this.options = utils.assign({\n chunkSize: 16384,\n windowBits: 0,\n to: ''\n }, options || {});\n\n var opt = this.options;\n\n // Force window size for `raw` data, if not set directly,\n // because we have no header for autodetect.\n if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n opt.windowBits = -opt.windowBits;\n if (opt.windowBits === 0) { opt.windowBits = -15; }\n }\n\n // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n !(options && options.windowBits)) {\n opt.windowBits += 32;\n }\n\n // Gzip header has no info about windows size, we can do autodetect only\n // for deflate. So, if window size not set, force it to max when gzip possible\n if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n // bit 3 (16) -> gzipped data\n // bit 4 (32) -> autodetect gzip/deflate\n if ((opt.windowBits & 15) === 0) {\n opt.windowBits |= 15;\n }\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n var status = zlib_inflate.inflateInit2(\n this.strm,\n opt.windowBits\n );\n\n if (status !== c.Z_OK) {\n throw new Error(msg[status]);\n }\n\n this.header = new gzheader();\n\n zlib_inflate.inflateGetHeader(this.strm, this.header);\n};\n\n/**\n * Inflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|String): input data\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That flush internal pending buffers and call\n * [[Inflate#onEnd]].\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nInflate.prototype.push = function(data, mode) {\n var strm = this.strm;\n var chunkSize = this.options.chunkSize;\n var status, _mode;\n var next_out_utf8, tail, utf8str;\n\n if (this.ended) { return false; }\n _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);\n\n // Convert data if needed\n if (typeof data === 'string') {\n // Only binary strings can be decompressed on practice\n strm.input = strings.binstring2buf(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n do {\n if (strm.avail_out === 0) {\n strm.output = new utils.Buf8(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH); /* no bad return value */\n\n if (status !== c.Z_STREAM_END && status !== c.Z_OK) {\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n\n if (strm.next_out) {\n if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && _mode === c.Z_FINISH)) {\n\n if (this.options.to === 'string') {\n\n next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n tail = strm.next_out - next_out_utf8;\n utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n // move tail\n strm.next_out = tail;\n strm.avail_out = chunkSize - tail;\n if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }\n\n this.onData(utf8str);\n\n } else {\n this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n }\n }\n }\n } while ((strm.avail_in > 0) && status !== c.Z_STREAM_END);\n\n if (status === c.Z_STREAM_END) {\n _mode = c.Z_FINISH;\n }\n // Finalize on the last chunk.\n if (_mode === c.Z_FINISH) {\n status = zlib_inflate.inflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === c.Z_OK;\n }\n\n return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): ouput data. Type of array depends\n * on js engine support. When string output requested, each chunk\n * will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate.prototype.onData = function(chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called once after you tell inflate that input stream complete\n * or error happenned. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate.prototype.onEnd = function(status) {\n // On success - join\n if (status === c.Z_OK) {\n if (this.options.to === 'string') {\n // Glue & convert here, until we teach pako to send\n // utf8 alligned strings to onData\n this.result = this.chunks.join('');\n } else {\n this.result = utils.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , input = pako.deflate([1,2,3,4,5,6,7,8,9])\n * , output;\n *\n * try {\n * output = pako.inflate(input);\n * } catch (err)\n * console.log(err);\n * }\n * ```\n **/\nfunction inflate(input, options) {\n var inflator = new Inflate(options);\n\n inflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (inflator.err) { throw inflator.msg; }\n\n return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return inflate(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nexports.Inflate = Inflate;\nexports.inflate = inflate;\nexports.inflateRaw = inflateRaw;\nexports.ungzip = inflate;\n\n},{\"./utils/common\":27,\"./utils/strings\":28,\"./zlib/constants\":30,\"./zlib/gzheader\":33,\"./zlib/inflate.js\":35,\"./zlib/messages\":37,\"./zlib/zstream\":39}],27:[function(_dereq_,module,exports){\n'use strict';\n\n\nvar TYPED_OK = (typeof Uint8Array !== 'undefined') &&\n (typeof Uint16Array !== 'undefined') &&\n (typeof Int32Array !== 'undefined');\n\n\nexports.assign = function (obj /*from1, from2, from3, ...*/) {\n var sources = Array.prototype.slice.call(arguments, 1);\n while (sources.length) {\n var source = sources.shift();\n if (!source) { continue; }\n\n if (typeof(source) !== 'object') {\n throw new TypeError(source + 'must be non-object');\n }\n\n for (var p in source) {\n if (source.hasOwnProperty(p)) {\n obj[p] = source[p];\n }\n }\n }\n\n return obj;\n};\n\n\n// reduce buffer size, avoiding mem copy\nexports.shrinkBuf = function (buf, size) {\n if (buf.length === size) { return buf; }\n if (buf.subarray) { return buf.subarray(0, size); }\n buf.length = size;\n return buf;\n};\n\n\nvar fnTyped = {\n arraySet: function (dest, src, src_offs, len, dest_offs) {\n if (src.subarray && dest.subarray) {\n dest.set(src.subarray(src_offs, src_offs+len), dest_offs);\n return;\n }\n // Fallback to ordinary array\n for(var i=0; i= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);\n}\n_utf8len[254]=_utf8len[254]=1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nexports.string2buf = function (str) {\n var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {\n c2 = str.charCodeAt(m_pos+1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n buf = new utils.Buf8(buf_len);\n\n // convert\n for (i=0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {\n c2 = str.charCodeAt(m_pos+1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n};\n\n// Helper (used in 2 places)\nfunction buf2binstring(buf, len) {\n // use fallback for big arrays to avoid stack overflow\n if (len < 65537) {\n if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {\n return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));\n }\n }\n\n var result = '';\n for(var i=0; i < len; i++) {\n result += String.fromCharCode(buf[i]);\n }\n return result;\n}\n\n\n// Convert byte array to binary string\nexports.buf2binstring = function(buf) {\n return buf2binstring(buf, buf.length);\n};\n\n\n// Convert binary string (typed, when possible)\nexports.binstring2buf = function(str) {\n var buf = new utils.Buf8(str.length);\n for(var i=0, len=buf.length; i < len; i++) {\n buf[i] = str.charCodeAt(i);\n }\n return buf;\n};\n\n\n// convert array to string\nexports.buf2string = function (buf, max) {\n var i, out, c, c_len;\n var len = max || buf.length;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n var utf16buf = new Array(len*2);\n\n for (out=0, i=0; i 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max - length limit (mandatory);\nexports.utf8border = function(buf, max) {\n var pos;\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n pos = max-1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Fuckup - very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means vuffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\n},{\"./common\":27}],29:[function(_dereq_,module,exports){\n'use strict';\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It doesn't worth to make additional optimizationa as in original.\n// Small size is preferable.\n\nfunction adler32(adler, buf, len, pos) {\n var s1 = (adler & 0xffff) |0\n , s2 = ((adler >>> 16) & 0xffff) |0\n , n = 0;\n\n while (len !== 0) {\n // Set limit ~ twice less than 5552, to keep\n // s2 in 31-bits, because we force signed ints.\n // in other case %= will fail.\n n = len > 2000 ? 2000 : len;\n len -= n;\n\n do {\n s1 = (s1 + buf[pos++]) |0;\n s2 = (s2 + s1) |0;\n } while (--n);\n\n s1 %= 65521;\n s2 %= 65521;\n }\n\n return (s1 | (s2 << 16)) |0;\n}\n\n\nmodule.exports = adler32;\n},{}],30:[function(_dereq_,module,exports){\nmodule.exports = {\n\n /* Allowed flush values; see deflate() and inflate() below for details */\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_TREES: 6,\n\n /* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n //Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n //Z_VERSION_ERROR: -6,\n\n /* compression levels */\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n\n\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n\n /* Possible values of the data_type field (though see inflate()) */\n Z_BINARY: 0,\n Z_TEXT: 1,\n //Z_ASCII: 1, // = Z_TEXT (deprecated)\n Z_UNKNOWN: 2,\n\n /* The deflate compression method */\n Z_DEFLATED: 8\n //Z_NULL: null // Use -1 or null inline, depending on var type\n};\n},{}],31:[function(_dereq_,module,exports){\n'use strict';\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n\n// Use ordinary array, since untyped makes no boost here\nfunction makeTable() {\n var c, table = [];\n\n for(var n =0; n < 256; n++){\n c = n;\n for(var k =0; k < 8; k++){\n c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n table[n] = c;\n }\n\n return table;\n}\n\n// Create table on load. Just 255 signed longs. Not a problem.\nvar crcTable = makeTable();\n\n\nfunction crc32(crc, buf, len, pos) {\n var t = crcTable\n , end = pos + len;\n\n crc = crc ^ (-1);\n\n for (var i = pos; i < end; i++ ) {\n crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n}\n\n\nmodule.exports = crc32;\n},{}],32:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('../utils/common');\nvar trees = _dereq_('./trees');\nvar adler32 = _dereq_('./adler32');\nvar crc32 = _dereq_('./crc32');\nvar msg = _dereq_('./messages');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\nvar Z_NO_FLUSH = 0;\nvar Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH = 2;\nvar Z_FULL_FLUSH = 3;\nvar Z_FINISH = 4;\nvar Z_BLOCK = 5;\n//var Z_TREES = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK = 0;\nvar Z_STREAM_END = 1;\n//var Z_NEED_DICT = 2;\n//var Z_ERRNO = -1;\nvar Z_STREAM_ERROR = -2;\nvar Z_DATA_ERROR = -3;\n//var Z_MEM_ERROR = -4;\nvar Z_BUF_ERROR = -5;\n//var Z_VERSION_ERROR = -6;\n\n\n/* compression levels */\n//var Z_NO_COMPRESSION = 0;\n//var Z_BEST_SPEED = 1;\n//var Z_BEST_COMPRESSION = 9;\nvar Z_DEFAULT_COMPRESSION = -1;\n\n\nvar Z_FILTERED = 1;\nvar Z_HUFFMAN_ONLY = 2;\nvar Z_RLE = 3;\nvar Z_FIXED = 4;\nvar Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\n//var Z_BINARY = 0;\n//var Z_TEXT = 1;\n//var Z_ASCII = 1; // = Z_TEXT\nvar Z_UNKNOWN = 2;\n\n\n/* The deflate compression method */\nvar Z_DEFLATED = 8;\n\n/*============================================================================*/\n\n\nvar MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_MEM_LEVEL = 8;\n\n\nvar LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nvar LITERALS = 256;\n/* number of literal bytes 0..255 */\nvar L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nvar D_CODES = 30;\n/* number of distance codes */\nvar BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\nvar HEAP_SIZE = 2*L_CODES + 1;\n/* maximum heap size */\nvar MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar MIN_MATCH = 3;\nvar MAX_MATCH = 258;\nvar MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nvar PRESET_DICT = 0x20;\n\nvar INIT_STATE = 42;\nvar EXTRA_STATE = 69;\nvar NAME_STATE = 73;\nvar COMMENT_STATE = 91;\nvar HCRC_STATE = 103;\nvar BUSY_STATE = 113;\nvar FINISH_STATE = 666;\n\nvar BS_NEED_MORE = 1; /* block not completed, need more input or more output */\nvar BS_BLOCK_DONE = 2; /* block flush performed */\nvar BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nvar BS_FINISH_DONE = 4; /* finish done, accept no more input or output */\n\nvar OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nfunction err(strm, errorCode) {\n strm.msg = msg[errorCode];\n return errorCode;\n}\n\nfunction rank(f) {\n return ((f) << 1) - ((f) > 4 ? 9 : 0);\n}\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->output buffer and copying into it.\n * (See also read_buf()).\n */\nfunction flush_pending(strm) {\n var s = strm.state;\n\n //_tr_flush_bits(s);\n var len = s.pending;\n if (len > strm.avail_out) {\n len = strm.avail_out;\n }\n if (len === 0) { return; }\n\n utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);\n strm.next_out += len;\n s.pending_out += len;\n strm.total_out += len;\n strm.avail_out -= len;\n s.pending -= len;\n if (s.pending === 0) {\n s.pending_out = 0;\n }\n}\n\n\nfunction flush_block_only (s, last) {\n trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n s.block_start = s.strstart;\n flush_pending(s.strm);\n}\n\n\nfunction put_byte(s, b) {\n s.pending_buf[s.pending++] = b;\n}\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nfunction putShortMSB(s, b) {\n// put_byte(s, (Byte)(b >> 8));\n// put_byte(s, (Byte)(b & 0xff));\n s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n s.pending_buf[s.pending++] = b & 0xff;\n}\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read. All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nfunction read_buf(strm, buf, start, size) {\n var len = strm.avail_in;\n\n if (len > size) { len = size; }\n if (len === 0) { return 0; }\n\n strm.avail_in -= len;\n\n utils.arraySet(buf, strm.input, strm.next_in, len, start);\n if (strm.state.wrap === 1) {\n strm.adler = adler32(strm.adler, buf, len, start);\n }\n\n else if (strm.state.wrap === 2) {\n strm.adler = crc32(strm.adler, buf, len, start);\n }\n\n strm.next_in += len;\n strm.total_in += len;\n\n return len;\n}\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nfunction longest_match(s, cur_match) {\n var chain_length = s.max_chain_length; /* max hash chain length */\n var scan = s.strstart; /* current string */\n var match; /* matched string */\n var len; /* length of current match */\n var best_len = s.prev_length; /* best match length so far */\n var nice_match = s.nice_match; /* stop if match long enough */\n var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n var _win = s.window; // shortcut\n\n var wmask = s.w_mask;\n var prev = s.prev;\n\n /* Stop when cur_match becomes <= limit. To simplify the code,\n * we prevent matches with the string of window index 0.\n */\n\n var strend = s.strstart + MAX_MATCH;\n var scan_end1 = _win[scan + best_len - 1];\n var scan_end = _win[scan + best_len];\n\n /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n * It is easy to get rid of this optimization if necessary.\n */\n // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n /* Do not waste too much time if we already have a good match: */\n if (s.prev_length >= s.good_match) {\n chain_length >>= 2;\n }\n /* Do not look for matches beyond the end of the input. This is necessary\n * to make deflate deterministic.\n */\n if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n do {\n // Assert(cur_match < s->strstart, \"no future\");\n match = cur_match;\n\n /* Skip to next match if the match length cannot increase\n * or if the match length is less than 2. Note that the checks below\n * for insufficient lookahead only occur occasionally for performance\n * reasons. Therefore uninitialized memory will be accessed, and\n * conditional jumps will be made that depend on those values.\n * However the length of the match is limited to the lookahead, so\n * the output of deflate is not affected by the uninitialized values.\n */\n\n if (_win[match + best_len] !== scan_end ||\n _win[match + best_len - 1] !== scan_end1 ||\n _win[match] !== _win[scan] ||\n _win[++match] !== _win[scan + 1]) {\n continue;\n }\n\n /* The check at best_len-1 can be removed because it will be made\n * again later. (This heuristic is not always a win.)\n * It is not necessary to compare scan[2] and match[2] since they\n * are always equal when the other bytes match, given that\n * the hash keys are equal and that HASH_BITS >= 8.\n */\n scan += 2;\n match++;\n // Assert(*scan == *match, \"match[2]?\");\n\n /* We check for insufficient lookahead only every 8th comparison;\n * the 256th check will be made at strstart+258.\n */\n do {\n /*jshint noempty:false*/\n } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n scan < strend);\n\n // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n len = MAX_MATCH - (strend - scan);\n scan = strend - MAX_MATCH;\n\n if (len > best_len) {\n s.match_start = cur_match;\n best_len = len;\n if (len >= nice_match) {\n break;\n }\n scan_end1 = _win[scan + best_len - 1];\n scan_end = _win[scan + best_len];\n }\n } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n if (best_len <= s.lookahead) {\n return best_len;\n }\n return s.lookahead;\n}\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n * At least one byte has been read, or avail_in == 0; reads are\n * performed for at least two bytes (required for the zip translate_eol\n * option -- not supported here).\n */\nfunction fill_window(s) {\n var _w_size = s.w_size;\n var p, n, m, more, str;\n\n //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n do {\n more = s.window_size - s.lookahead - s.strstart;\n\n // JS ints have 32 bit, block below not needed\n /* Deal with !@#$% 64K limit: */\n //if (sizeof(int) <= 2) {\n // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n // more = wsize;\n //\n // } else if (more == (unsigned)(-1)) {\n // /* Very unlikely, but possible on 16 bit machine if\n // * strstart == 0 && lookahead == 1 (input done a byte at time)\n // */\n // more--;\n // }\n //}\n\n\n /* If the window is almost full and there is insufficient lookahead,\n * move the upper half to the lower one to make room in the upper half.\n */\n if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n utils.arraySet(s.window, s.window, _w_size, _w_size, 0);\n s.match_start -= _w_size;\n s.strstart -= _w_size;\n /* we now have strstart >= MAX_DIST */\n s.block_start -= _w_size;\n\n /* Slide the hash table (could be avoided with 32 bit values\n at the expense of memory usage). We slide even when level == 0\n to keep the hash table consistent if we switch back to level > 0\n later. (Using level 0 permanently is not an optimal usage of\n zlib, so we don't care about this pathological case.)\n */\n\n n = s.hash_size;\n p = n;\n do {\n m = s.head[--p];\n s.head[p] = (m >= _w_size ? m - _w_size : 0);\n } while (--n);\n\n n = _w_size;\n p = n;\n do {\n m = s.prev[--p];\n s.prev[p] = (m >= _w_size ? m - _w_size : 0);\n /* If n is not on any hash chain, prev[n] is garbage but\n * its value will never be used.\n */\n } while (--n);\n\n more += _w_size;\n }\n if (s.strm.avail_in === 0) {\n break;\n }\n\n /* If there was no sliding:\n * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n * more == window_size - lookahead - strstart\n * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n * => more >= window_size - 2*WSIZE + 2\n * In the BIG_MEM or MMAP case (not yet supported),\n * window_size == input_size + MIN_LOOKAHEAD &&\n * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n * Otherwise, window_size == 2*WSIZE so more >= 2.\n * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n */\n //Assert(more >= 2, \"more < 2\");\n n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n s.lookahead += n;\n\n /* Initialize the hash value now that we have some input: */\n if (s.lookahead + s.insert >= MIN_MATCH) {\n str = s.strstart - s.insert;\n s.ins_h = s.window[str];\n\n /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;\n//#if MIN_MATCH != 3\n// Call update_hash() MIN_MATCH-3 more times\n//#endif\n while (s.insert) {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH-1]) & s.hash_mask;\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = str;\n str++;\n s.insert--;\n if (s.lookahead + s.insert < MIN_MATCH) {\n break;\n }\n }\n }\n /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n * but this is not important since only literal bytes will be emitted.\n */\n\n } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n /* If the WIN_INIT bytes after the end of the current data have never been\n * written, then zero those bytes in order to avoid memory check reports of\n * the use of uninitialized (or uninitialised as Julian writes) bytes by\n * the longest match routines. Update the high water mark for the next\n * time through here. WIN_INIT is set to MAX_MATCH since the longest match\n * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n */\n// if (s.high_water < s.window_size) {\n// var curr = s.strstart + s.lookahead;\n// var init = 0;\n//\n// if (s.high_water < curr) {\n// /* Previous high water mark below current data -- zero WIN_INIT\n// * bytes or up to end of window, whichever is less.\n// */\n// init = s.window_size - curr;\n// if (init > WIN_INIT)\n// init = WIN_INIT;\n// zmemzero(s->window + curr, (unsigned)init);\n// s->high_water = curr + init;\n// }\n// else if (s->high_water < (ulg)curr + WIN_INIT) {\n// /* High water mark at or above current data, but below current data\n// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n// * to end of window, whichever is less.\n// */\n// init = (ulg)curr + WIN_INIT - s->high_water;\n// if (init > s->window_size - s->high_water)\n// init = s->window_size - s->high_water;\n// zmemzero(s->window + s->high_water, (unsigned)init);\n// s->high_water += init;\n// }\n// }\n//\n// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n// \"not enough room for search\");\n}\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nfunction deflate_stored(s, flush) {\n /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n * to pending_buf_size, and each stored block has a 5 byte header:\n */\n var max_block_size = 0xffff;\n\n if (max_block_size > s.pending_buf_size - 5) {\n max_block_size = s.pending_buf_size - 5;\n }\n\n /* Copy as much as possible from input to output: */\n for (;;) {\n /* Fill the window as much as possible: */\n if (s.lookahead <= 1) {\n\n //Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n // s->block_start >= (long)s->w_size, \"slide too late\");\n// if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||\n// s.block_start >= s.w_size)) {\n// throw new Error(\"slide too late\");\n// }\n\n fill_window(s);\n if (s.lookahead === 0 && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n\n if (s.lookahead === 0) {\n break;\n }\n /* flush the current block */\n }\n //Assert(s->block_start >= 0L, \"block gone\");\n// if (s.block_start < 0) throw new Error(\"block gone\");\n\n s.strstart += s.lookahead;\n s.lookahead = 0;\n\n /* Emit a stored block if pending_buf will be full: */\n var max_start = s.block_start + max_block_size;\n\n if (s.strstart === 0 || s.strstart >= max_start) {\n /* strstart == 0 is possible when wraparound on 16-bit machine */\n s.lookahead = s.strstart - max_start;\n s.strstart = max_start;\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n\n\n }\n /* Flush if we may have to slide, otherwise block_start may become\n * negative and the data will be gone:\n */\n if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n\n s.insert = 0;\n\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n\n if (s.strstart > s.block_start) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_NEED_MORE;\n}\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nfunction deflate_fast(s, flush) {\n var hash_head; /* head of the hash chain */\n var bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) {\n break; /* flush the current block */\n }\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n * At this point we have always match_length < MIN_MATCH\n */\n if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n }\n if (s.match_length >= MIN_MATCH) {\n // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n /*** _tr_tally_dist(s, s.strstart - s.match_start,\n s.match_length - MIN_MATCH, bflush); ***/\n bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n\n /* Insert new strings in the hash table only if the match length\n * is not too large. This saves time but degrades compression.\n */\n if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n s.match_length--; /* string at strstart already in table */\n do {\n s.strstart++;\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n * always MIN_MATCH bytes ahead.\n */\n } while (--s.match_length !== 0);\n s.strstart++;\n } else\n {\n s.strstart += s.match_length;\n s.match_length = 0;\n s.ins_h = s.window[s.strstart];\n /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;\n\n//#if MIN_MATCH != 3\n// Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n * matter since it will be recomputed at next deflate call.\n */\n }\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = ((s.strstart < (MIN_MATCH-1)) ? s.strstart : MIN_MATCH-1);\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nfunction deflate_slow(s, flush) {\n var hash_head; /* head of hash chain */\n var bflush; /* set if current block must be flushed */\n\n var max_insert;\n\n /* Process the input block. */\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n */\n s.prev_length = s.match_length;\n s.prev_match = s.match_start;\n s.match_length = MIN_MATCH-1;\n\n if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n s.strstart - hash_head <= (s.w_size-MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n\n if (s.match_length <= 5 &&\n (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n /* If prev_match is also MIN_MATCH, match_start is garbage\n * but we will ignore the current match anyway.\n */\n s.match_length = MIN_MATCH-1;\n }\n }\n /* If there was a match at the previous step and the current\n * match is not better, output the previous match:\n */\n if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n max_insert = s.strstart + s.lookahead - MIN_MATCH;\n /* Do not insert strings in hash table beyond this. */\n\n //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n s.prev_length - MIN_MATCH, bflush);***/\n bflush = trees._tr_tally(s, s.strstart - 1- s.prev_match, s.prev_length - MIN_MATCH);\n /* Insert in hash table all strings up to the end of the match.\n * strstart-1 and strstart are already inserted. If there is not\n * enough lookahead, the last two strings are not inserted in\n * the hash table.\n */\n s.lookahead -= s.prev_length-1;\n s.prev_length -= 2;\n do {\n if (++s.strstart <= max_insert) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n } while (--s.prev_length !== 0);\n s.match_available = 0;\n s.match_length = MIN_MATCH-1;\n s.strstart++;\n\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n } else if (s.match_available) {\n /* If there was no match at the previous position, output a\n * single literal. If there was a match but the current match\n * is longer, truncate the previous match to a single literal.\n */\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]);\n\n if (bflush) {\n /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n flush_block_only(s, false);\n /***/\n }\n s.strstart++;\n s.lookahead--;\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n } else {\n /* There is no previous match to compare with, wait for\n * the next step to decide.\n */\n s.match_available = 1;\n s.strstart++;\n s.lookahead--;\n }\n }\n //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n if (s.match_available) {\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]);\n\n s.match_available = 0;\n }\n s.insert = s.strstart < MIN_MATCH-1 ? s.strstart : MIN_MATCH-1;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_BLOCK_DONE;\n}\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one. Do not maintain a hash table. (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nfunction deflate_rle(s, flush) {\n var bflush; /* set if current block must be flushed */\n var prev; /* byte at distance one to match */\n var scan, strend; /* scan goes up to strend for length of run */\n\n var _win = s.window;\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the longest run, plus one for the unrolled loop.\n */\n if (s.lookahead <= MAX_MATCH) {\n fill_window(s);\n if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* See how many times the previous byte repeats */\n s.match_length = 0;\n if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n scan = s.strstart - 1;\n prev = _win[scan];\n if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n strend = s.strstart + MAX_MATCH;\n do {\n /*jshint noempty:false*/\n } while (prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n scan < strend);\n s.match_length = MAX_MATCH - (strend - scan);\n if (s.match_length > s.lookahead) {\n s.match_length = s.lookahead;\n }\n }\n //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n }\n\n /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n if (s.match_length >= MIN_MATCH) {\n //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n s.strstart += s.match_length;\n s.match_length = 0;\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nfunction deflate_huff(s, flush) {\n var bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we have a literal to write. */\n if (s.lookahead === 0) {\n fill_window(s);\n if (s.lookahead === 0) {\n if (flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n break; /* flush the current block */\n }\n }\n\n /* Output a literal byte */\n s.match_length = 0;\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n s.lookahead--;\n s.strstart++;\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n}\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nvar Config = function (good_length, max_lazy, nice_length, max_chain, func) {\n this.good_length = good_length;\n this.max_lazy = max_lazy;\n this.nice_length = nice_length;\n this.max_chain = max_chain;\n this.func = func;\n};\n\nvar configuration_table;\n\nconfiguration_table = [\n /* good lazy nice chain */\n new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */\n new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */\n new Config(4, 5, 16, 8, deflate_fast), /* 2 */\n new Config(4, 6, 32, 32, deflate_fast), /* 3 */\n\n new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */\n new Config(8, 16, 32, 32, deflate_slow), /* 5 */\n new Config(8, 16, 128, 128, deflate_slow), /* 6 */\n new Config(8, 32, 128, 256, deflate_slow), /* 7 */\n new Config(32, 128, 258, 1024, deflate_slow), /* 8 */\n new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nfunction lm_init(s) {\n s.window_size = 2 * s.w_size;\n\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n\n /* Set the default configuration parameters:\n */\n s.max_lazy_match = configuration_table[s.level].max_lazy;\n s.good_match = configuration_table[s.level].good_length;\n s.nice_match = configuration_table[s.level].nice_length;\n s.max_chain_length = configuration_table[s.level].max_chain;\n\n s.strstart = 0;\n s.block_start = 0;\n s.lookahead = 0;\n s.insert = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n s.ins_h = 0;\n}\n\n\nfunction DeflateState() {\n this.strm = null; /* pointer back to this zlib stream */\n this.status = 0; /* as the name implies */\n this.pending_buf = null; /* output still pending */\n this.pending_buf_size = 0; /* size of pending_buf */\n this.pending_out = 0; /* next pending byte to output to the stream */\n this.pending = 0; /* nb of bytes in the pending buffer */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.gzhead = null; /* gzip header information to write */\n this.gzindex = 0; /* where in extra, name, or comment */\n this.method = Z_DEFLATED; /* can only be DEFLATED */\n this.last_flush = -1; /* value of flush param for previous deflate call */\n\n this.w_size = 0; /* LZ77 window size (32K by default) */\n this.w_bits = 0; /* log2(w_size) (8..16) */\n this.w_mask = 0; /* w_size - 1 */\n\n this.window = null;\n /* Sliding window. Input bytes are read into the second half of the window,\n * and move to the first half later to keep a dictionary of at least wSize\n * bytes. With this organization, matches are limited to a distance of\n * wSize-MAX_MATCH bytes, but this ensures that IO is always\n * performed with a length multiple of the block size.\n */\n\n this.window_size = 0;\n /* Actual size of window: 2*wSize, except when the user input buffer\n * is directly used as sliding window.\n */\n\n this.prev = null;\n /* Link to older string with same hash index. To limit the size of this\n * array to 64K, this link is maintained only for the last 32K strings.\n * An index in this array is thus a window index modulo 32K.\n */\n\n this.head = null; /* Heads of the hash chains or NIL. */\n\n this.ins_h = 0; /* hash index of string to be inserted */\n this.hash_size = 0; /* number of elements in hash table */\n this.hash_bits = 0; /* log2(hash_size) */\n this.hash_mask = 0; /* hash_size-1 */\n\n this.hash_shift = 0;\n /* Number of bits by which ins_h must be shifted at each input\n * step. It must be such that after MIN_MATCH steps, the oldest\n * byte no longer takes part in the hash key, that is:\n * hash_shift * MIN_MATCH >= hash_bits\n */\n\n this.block_start = 0;\n /* Window position at the beginning of the current output block. Gets\n * negative when the window is moved backwards.\n */\n\n this.match_length = 0; /* length of best match */\n this.prev_match = 0; /* previous match */\n this.match_available = 0; /* set if previous match exists */\n this.strstart = 0; /* start of string to insert */\n this.match_start = 0; /* start of matching string */\n this.lookahead = 0; /* number of valid bytes ahead in window */\n\n this.prev_length = 0;\n /* Length of the best match at previous step. Matches not greater than this\n * are discarded. This is used in the lazy match evaluation.\n */\n\n this.max_chain_length = 0;\n /* To speed up deflation, hash chains are never searched beyond this\n * length. A higher limit improves compression ratio but degrades the\n * speed.\n */\n\n this.max_lazy_match = 0;\n /* Attempt to find a better match only when the current match is strictly\n * smaller than this value. This mechanism is used only for compression\n * levels >= 4.\n */\n // That's alias to max_lazy_match, don't use directly\n //this.max_insert_length = 0;\n /* Insert new strings in the hash table only if the match length is not\n * greater than this length. This saves time but degrades compression.\n * max_insert_length is used only for compression levels <= 3.\n */\n\n this.level = 0; /* compression level (1..9) */\n this.strategy = 0; /* favor or force Huffman coding*/\n\n this.good_match = 0;\n /* Use a faster search when the previous match is longer than this */\n\n this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n /* used by trees.c: */\n\n /* Didn't use ct_data typedef below to suppress compiler warning */\n\n // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */\n // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */\n\n // Use flat array of DOUBLE size, with interleaved fata,\n // because JS does not support effective\n this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2);\n this.dyn_dtree = new utils.Buf16((2*D_CODES+1) * 2);\n this.bl_tree = new utils.Buf16((2*BL_CODES+1) * 2);\n zero(this.dyn_ltree);\n zero(this.dyn_dtree);\n zero(this.bl_tree);\n\n this.l_desc = null; /* desc. for literal tree */\n this.d_desc = null; /* desc. for distance tree */\n this.bl_desc = null; /* desc. for bit length tree */\n\n //ush bl_count[MAX_BITS+1];\n this.bl_count = new utils.Buf16(MAX_BITS+1);\n /* number of codes at each bit length for an optimal tree */\n\n //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */\n this.heap = new utils.Buf16(2*L_CODES+1); /* heap used to build the Huffman trees */\n zero(this.heap);\n\n this.heap_len = 0; /* number of elements in the heap */\n this.heap_max = 0; /* element of largest frequency */\n /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n * The same heap array is used to build all trees.\n */\n\n this.depth = new utils.Buf16(2*L_CODES+1); //uch depth[2*L_CODES+1];\n zero(this.depth);\n /* Depth of each subtree used as tie breaker for trees of equal frequency\n */\n\n this.l_buf = 0; /* buffer index for literals or lengths */\n\n this.lit_bufsize = 0;\n /* Size of match buffer for literals/lengths. There are 4 reasons for\n * limiting lit_bufsize to 64K:\n * - frequencies can be kept in 16 bit counters\n * - if compression is not successful for the first block, all input\n * data is still in the window so we can still emit a stored block even\n * when input comes from standard input. (This can also be done for\n * all blocks if lit_bufsize is not greater than 32K.)\n * - if compression is not successful for a file smaller than 64K, we can\n * even emit a stored file instead of a stored block (saving 5 bytes).\n * This is applicable only for zip (not gzip or zlib).\n * - creating new Huffman trees less frequently may not provide fast\n * adaptation to changes in the input data statistics. (Take for\n * example a binary file with poorly compressible code followed by\n * a highly compressible string table.) Smaller buffer sizes give\n * fast adaptation but have of course the overhead of transmitting\n * trees more frequently.\n * - I can't count above 4\n */\n\n this.last_lit = 0; /* running index in l_buf */\n\n this.d_buf = 0;\n /* Buffer index for distances. To simplify the code, d_buf and l_buf have\n * the same number of elements. To use different lengths, an extra flag\n * array would be necessary.\n */\n\n this.opt_len = 0; /* bit length of current block with optimal trees */\n this.static_len = 0; /* bit length of current block with static trees */\n this.matches = 0; /* number of string matches in current block */\n this.insert = 0; /* bytes at end of window left to insert */\n\n\n this.bi_buf = 0;\n /* Output buffer. bits are inserted starting at the bottom (least\n * significant bits).\n */\n this.bi_valid = 0;\n /* Number of valid bits in bi_buf. All bits above the last valid bit\n * are always zero.\n */\n\n // Used for window memory init. We safely ignore it for JS. That makes\n // sense only for pointers and memory check tools.\n //this.high_water = 0;\n /* High water mark offset in window for initialized bytes -- bytes above\n * this are set to zero in order to avoid memory check warnings when\n * longest match routines access bytes past the input. This is then\n * updated to the new high water mark.\n */\n}\n\n\nfunction deflateResetKeep(strm) {\n var s;\n\n if (!strm || !strm.state) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n strm.total_in = strm.total_out = 0;\n strm.data_type = Z_UNKNOWN;\n\n s = strm.state;\n s.pending = 0;\n s.pending_out = 0;\n\n if (s.wrap < 0) {\n s.wrap = -s.wrap;\n /* was made negative by deflate(..., Z_FINISH); */\n }\n s.status = (s.wrap ? INIT_STATE : BUSY_STATE);\n strm.adler = (s.wrap === 2) ?\n 0 // crc32(0, Z_NULL, 0)\n :\n 1; // adler32(0, Z_NULL, 0)\n s.last_flush = Z_NO_FLUSH;\n trees._tr_init(s);\n return Z_OK;\n}\n\n\nfunction deflateReset(strm) {\n var ret = deflateResetKeep(strm);\n if (ret === Z_OK) {\n lm_init(strm.state);\n }\n return ret;\n}\n\n\nfunction deflateSetHeader(strm, head) {\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }\n strm.state.gzhead = head;\n return Z_OK;\n}\n\n\nfunction deflateInit2(strm, level, method, windowBits, memLevel, strategy) {\n if (!strm) { // === Z_NULL\n return Z_STREAM_ERROR;\n }\n var wrap = 1;\n\n if (level === Z_DEFAULT_COMPRESSION) {\n level = 6;\n }\n\n if (windowBits < 0) { /* suppress zlib wrapper */\n wrap = 0;\n windowBits = -windowBits;\n }\n\n else if (windowBits > 15) {\n wrap = 2; /* write gzip wrapper instead */\n windowBits -= 16;\n }\n\n\n if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||\n windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n strategy < 0 || strategy > Z_FIXED) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n\n if (windowBits === 8) {\n windowBits = 9;\n }\n /* until 256-byte window bug fixed */\n\n var s = new DeflateState();\n\n strm.state = s;\n s.strm = strm;\n\n s.wrap = wrap;\n s.gzhead = null;\n s.w_bits = windowBits;\n s.w_size = 1 << s.w_bits;\n s.w_mask = s.w_size - 1;\n\n s.hash_bits = memLevel + 7;\n s.hash_size = 1 << s.hash_bits;\n s.hash_mask = s.hash_size - 1;\n s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n s.window = new utils.Buf8(s.w_size * 2);\n s.head = new utils.Buf16(s.hash_size);\n s.prev = new utils.Buf16(s.w_size);\n\n // Don't need mem init magic for JS.\n //s.high_water = 0; /* nothing written to s->window yet */\n\n s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n s.pending_buf_size = s.lit_bufsize * 4;\n s.pending_buf = new utils.Buf8(s.pending_buf_size);\n\n s.d_buf = s.lit_bufsize >> 1;\n s.l_buf = (1 + 2) * s.lit_bufsize;\n\n s.level = level;\n s.strategy = strategy;\n s.method = method;\n\n return deflateReset(strm);\n}\n\nfunction deflateInit(strm, level) {\n return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);\n}\n\n\nfunction deflate(strm, flush) {\n var old_flush, s;\n var beg, val; // for gzip header write only\n\n if (!strm || !strm.state ||\n flush > Z_BLOCK || flush < 0) {\n return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;\n }\n\n s = strm.state;\n\n if (!strm.output ||\n (!strm.input && strm.avail_in !== 0) ||\n (s.status === FINISH_STATE && flush !== Z_FINISH)) {\n return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);\n }\n\n s.strm = strm; /* just in case */\n old_flush = s.last_flush;\n s.last_flush = flush;\n\n /* Write the header */\n if (s.status === INIT_STATE) {\n\n if (s.wrap === 2) { // GZIP header\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n put_byte(s, 31);\n put_byte(s, 139);\n put_byte(s, 8);\n if (!s.gzhead) { // s->gzhead == Z_NULL\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, OS_CODE);\n s.status = BUSY_STATE;\n }\n else {\n put_byte(s, (s.gzhead.text ? 1 : 0) +\n (s.gzhead.hcrc ? 2 : 0) +\n (!s.gzhead.extra ? 0 : 4) +\n (!s.gzhead.name ? 0 : 8) +\n (!s.gzhead.comment ? 0 : 16)\n );\n put_byte(s, s.gzhead.time & 0xff);\n put_byte(s, (s.gzhead.time >> 8) & 0xff);\n put_byte(s, (s.gzhead.time >> 16) & 0xff);\n put_byte(s, (s.gzhead.time >> 24) & 0xff);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, s.gzhead.os & 0xff);\n if (s.gzhead.extra && s.gzhead.extra.length) {\n put_byte(s, s.gzhead.extra.length & 0xff);\n put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n }\n if (s.gzhead.hcrc) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);\n }\n s.gzindex = 0;\n s.status = EXTRA_STATE;\n }\n }\n else // DEFLATE header\n {\n var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;\n var level_flags = -1;\n\n if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n level_flags = 0;\n } else if (s.level < 6) {\n level_flags = 1;\n } else if (s.level === 6) {\n level_flags = 2;\n } else {\n level_flags = 3;\n }\n header |= (level_flags << 6);\n if (s.strstart !== 0) { header |= PRESET_DICT; }\n header += 31 - (header % 31);\n\n s.status = BUSY_STATE;\n putShortMSB(s, header);\n\n /* Save the adler32 of the preset dictionary: */\n if (s.strstart !== 0) {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n strm.adler = 1; // adler32(0L, Z_NULL, 0);\n }\n }\n\n//#ifdef GZIP\n if (s.status === EXTRA_STATE) {\n if (s.gzhead.extra/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n\n while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n break;\n }\n }\n put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);\n s.gzindex++;\n }\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (s.gzindex === s.gzhead.extra.length) {\n s.gzindex = 0;\n s.status = NAME_STATE;\n }\n }\n else {\n s.status = NAME_STATE;\n }\n }\n if (s.status === NAME_STATE) {\n if (s.gzhead.name/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.name.length) {\n val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg){\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.gzindex = 0;\n s.status = COMMENT_STATE;\n }\n }\n else {\n s.status = COMMENT_STATE;\n }\n }\n if (s.status === COMMENT_STATE) {\n if (s.gzhead.comment/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.comment.length) {\n val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.status = HCRC_STATE;\n }\n }\n else {\n s.status = HCRC_STATE;\n }\n }\n if (s.status === HCRC_STATE) {\n if (s.gzhead.hcrc) {\n if (s.pending + 2 > s.pending_buf_size) {\n flush_pending(strm);\n }\n if (s.pending + 2 <= s.pending_buf_size) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n s.status = BUSY_STATE;\n }\n }\n else {\n s.status = BUSY_STATE;\n }\n }\n//#endif\n\n /* Flush as much pending output as possible */\n if (s.pending !== 0) {\n flush_pending(strm);\n if (strm.avail_out === 0) {\n /* Since avail_out is 0, deflate will be called again with\n * more output space, but possibly with both pending and\n * avail_in equal to zero. There won't be anything to do,\n * but this is not an error situation so make sure we\n * return OK instead of BUF_ERROR at next call of deflate:\n */\n s.last_flush = -1;\n return Z_OK;\n }\n\n /* Make sure there is something to do and avoid duplicate consecutive\n * flushes. For repeated and useless calls with Z_FINISH, we keep\n * returning Z_STREAM_END instead of Z_BUF_ERROR.\n */\n } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n flush !== Z_FINISH) {\n return err(strm, Z_BUF_ERROR);\n }\n\n /* User must not provide more input after the first FINISH: */\n if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n return err(strm, Z_BUF_ERROR);\n }\n\n /* Start a new block or continue the current one.\n */\n if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {\n var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :\n (s.strategy === Z_RLE ? deflate_rle(s, flush) :\n configuration_table[s.level].func(s, flush));\n\n if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n s.status = FINISH_STATE;\n }\n if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n if (strm.avail_out === 0) {\n s.last_flush = -1;\n /* avoid BUF_ERROR next call, see above */\n }\n return Z_OK;\n /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n * of deflate should use the same flush parameter to make sure\n * that the flush is complete. So we don't have to output an\n * empty block here, this will be done at next call. This also\n * ensures that for a very small output buffer, we emit at most\n * one empty block.\n */\n }\n if (bstate === BS_BLOCK_DONE) {\n if (flush === Z_PARTIAL_FLUSH) {\n trees._tr_align(s);\n }\n else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */\n\n trees._tr_stored_block(s, 0, 0, false);\n /* For a full flush, this empty block will be recognized\n * as a special marker by inflate_sync().\n */\n if (flush === Z_FULL_FLUSH) {\n /*** CLEAR_HASH(s); ***/ /* forget history */\n zero(s.head); // Fill with NIL (= 0);\n\n if (s.lookahead === 0) {\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n }\n }\n flush_pending(strm);\n if (strm.avail_out === 0) {\n s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n return Z_OK;\n }\n }\n }\n //Assert(strm->avail_out > 0, \"bug2\");\n //if (strm.avail_out <= 0) { throw new Error(\"bug2\");}\n\n if (flush !== Z_FINISH) { return Z_OK; }\n if (s.wrap <= 0) { return Z_STREAM_END; }\n\n /* Write the trailer */\n if (s.wrap === 2) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n put_byte(s, (strm.adler >> 16) & 0xff);\n put_byte(s, (strm.adler >> 24) & 0xff);\n put_byte(s, strm.total_in & 0xff);\n put_byte(s, (strm.total_in >> 8) & 0xff);\n put_byte(s, (strm.total_in >> 16) & 0xff);\n put_byte(s, (strm.total_in >> 24) & 0xff);\n }\n else\n {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n\n flush_pending(strm);\n /* If avail_out is zero, the application will call deflate again\n * to flush the rest.\n */\n if (s.wrap > 0) { s.wrap = -s.wrap; }\n /* write the trailer only once! */\n return s.pending !== 0 ? Z_OK : Z_STREAM_END;\n}\n\nfunction deflateEnd(strm) {\n var status;\n\n if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n return Z_STREAM_ERROR;\n }\n\n status = strm.state.status;\n if (status !== INIT_STATE &&\n status !== EXTRA_STATE &&\n status !== NAME_STATE &&\n status !== COMMENT_STATE &&\n status !== HCRC_STATE &&\n status !== BUSY_STATE &&\n status !== FINISH_STATE\n ) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n strm.state = null;\n\n return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;\n}\n\n/* =========================================================================\n * Copy the source state to the destination state\n */\n//function deflateCopy(dest, source) {\n//\n//}\n\nexports.deflateInit = deflateInit;\nexports.deflateInit2 = deflateInit2;\nexports.deflateReset = deflateReset;\nexports.deflateResetKeep = deflateResetKeep;\nexports.deflateSetHeader = deflateSetHeader;\nexports.deflate = deflate;\nexports.deflateEnd = deflateEnd;\nexports.deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nexports.deflateBound = deflateBound;\nexports.deflateCopy = deflateCopy;\nexports.deflateSetDictionary = deflateSetDictionary;\nexports.deflateParams = deflateParams;\nexports.deflatePending = deflatePending;\nexports.deflatePrime = deflatePrime;\nexports.deflateTune = deflateTune;\n*/\n},{\"../utils/common\":27,\"./adler32\":29,\"./crc32\":31,\"./messages\":37,\"./trees\":38}],33:[function(_dereq_,module,exports){\n'use strict';\n\n\nfunction GZheader() {\n /* true if compressed data believed to be text */\n this.text = 0;\n /* modification time */\n this.time = 0;\n /* extra flags (not used when writing a gzip file) */\n this.xflags = 0;\n /* operating system */\n this.os = 0;\n /* pointer to extra field or Z_NULL if none */\n this.extra = null;\n /* extra field length (valid if extra != Z_NULL) */\n this.extra_len = 0; // Actually, we don't need it in JS,\n // but leave for few code modifications\n\n //\n // Setup limits is not necessary because in js we should not preallocate memory\n // for inflate use constant limit in 65536 bytes\n //\n\n /* space at extra (only when reading header) */\n // this.extra_max = 0;\n /* pointer to zero-terminated file name or Z_NULL */\n this.name = '';\n /* space at name (only when reading header) */\n // this.name_max = 0;\n /* pointer to zero-terminated comment or Z_NULL */\n this.comment = '';\n /* space at comment (only when reading header) */\n // this.comm_max = 0;\n /* true if there was or will be a header crc */\n this.hcrc = 0;\n /* true when done reading gzip header (not used when writing a gzip file) */\n this.done = false;\n}\n\nmodule.exports = GZheader;\n},{}],34:[function(_dereq_,module,exports){\n'use strict';\n\n// See state defs from inflate.js\nvar BAD = 30; /* got a data error -- remain here until reset */\nvar TYPE = 12; /* i: waiting for type bits, including last-flag bit */\n\n/*\n Decode literal, length, and distance codes and write out the resulting\n literal and match bytes until either not enough input or output is\n available, an end-of-block is encountered, or a data error is encountered.\n When large enough input and output buffers are supplied to inflate(), for\n example, a 16K input buffer and a 64K output buffer, more than 95% of the\n inflate execution time is spent in this routine.\n\n Entry assumptions:\n\n state.mode === LEN\n strm.avail_in >= 6\n strm.avail_out >= 258\n start >= strm.avail_out\n state.bits < 8\n\n On return, state.mode is one of:\n\n LEN -- ran out of enough output space or enough available input\n TYPE -- reached end of block code, inflate() to interpret next block\n BAD -- error in block data\n\n Notes:\n\n - The maximum input bits used by a length/distance pair is 15 bits for the\n length code, 5 bits for the length extra, 15 bits for the distance code,\n and 13 bits for the distance extra. This totals 48 bits, or six bytes.\n Therefore if strm.avail_in >= 6, then there is enough input to avoid\n checking for available input while decoding.\n\n - The maximum bytes that a single length/distance pair can output is 258\n bytes, which is the maximum length that can be coded. inflate_fast()\n requires strm.avail_out >= 258 for each loop to avoid checking for\n output space.\n */\nmodule.exports = function inflate_fast(strm, start) {\n var state;\n var _in; /* local strm.input */\n var last; /* have enough input while in < last */\n var _out; /* local strm.output */\n var beg; /* inflate()'s initial strm.output */\n var end; /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n var dmax; /* maximum distance from zlib header */\n//#endif\n var wsize; /* window size or zero if not using window */\n var whave; /* valid bytes in the window */\n var wnext; /* window write index */\n var window; /* allocated sliding window, if wsize != 0 */\n var hold; /* local strm.hold */\n var bits; /* local strm.bits */\n var lcode; /* local strm.lencode */\n var dcode; /* local strm.distcode */\n var lmask; /* mask for first level of length codes */\n var dmask; /* mask for first level of distance codes */\n var here; /* retrieved table entry */\n var op; /* code bits, operation, extra bits, or */\n /* window position, window bytes to copy */\n var len; /* match length, unused bytes */\n var dist; /* match distance */\n var from; /* where to copy match from */\n var from_source;\n\n\n var input, output; // JS specific, because we have no pointers\n\n /* copy state to local variables */\n state = strm.state;\n //here = state.here;\n _in = strm.next_in;\n input = strm.input;\n last = _in + (strm.avail_in - 5);\n _out = strm.next_out;\n output = strm.output;\n beg = _out - (start - strm.avail_out);\n end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n dmax = state.dmax;\n//#endif\n wsize = state.wsize;\n whave = state.whave;\n wnext = state.wnext;\n window = state.window;\n hold = state.hold;\n bits = state.bits;\n lcode = state.lencode;\n dcode = state.distcode;\n lmask = (1 << state.lenbits) - 1;\n dmask = (1 << state.distbits) - 1;\n\n\n /* decode literals and length/distances until end-of-block or not enough\n input data or output space */\n\n top:\n do {\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n\n here = lcode[hold & lmask];\n\n dolen:\n for (;;) { // Goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n if (op === 0) { /* literal */\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n output[_out++] = here & 0xffff/*here.val*/;\n }\n else if (op & 16) { /* length base */\n len = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (op) {\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n len += hold & ((1 << op) - 1);\n hold >>>= op;\n bits -= op;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", len));\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = dcode[hold & dmask];\n\n dodist:\n for (;;) { // goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n\n if (op & 16) { /* distance base */\n dist = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n }\n dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n if (dist > dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break top;\n }\n//#endif\n hold >>>= op;\n bits -= op;\n //Tracevv((stderr, \"inflate: distance %u\\n\", dist));\n op = _out - beg; /* max distance in output */\n if (dist > op) { /* see if copy from window */\n op = dist - op; /* distance back in window */\n if (op > whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break top;\n }\n\n// (!) This block is disabled in zlib defailts,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// if (len <= op - whave) {\n// do {\n// output[_out++] = 0;\n// } while (--len);\n// continue top;\n// }\n// len -= op - whave;\n// do {\n// output[_out++] = 0;\n// } while (--op > whave);\n// if (op === 0) {\n// from = _out - dist;\n// do {\n// output[_out++] = output[from++];\n// } while (--len);\n// continue top;\n// }\n//#endif\n }\n from = 0; // window index\n from_source = window;\n if (wnext === 0) { /* very common case */\n from += wsize - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n else if (wnext < op) { /* wrap around window */\n from += wsize + wnext - op;\n op -= wnext;\n if (op < len) { /* some from end of window */\n len -= op;\n do {\n output[_out++] = window[from++];\n } while (--op);\n from = 0;\n if (wnext < len) { /* some from start of window */\n op = wnext;\n len -= op;\n do {\n output[_out++] = window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n }\n else { /* contiguous in window */\n from += wnext - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n while (len > 2) {\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n len -= 3;\n }\n if (len) {\n output[_out++] = from_source[from++];\n if (len > 1) {\n output[_out++] = from_source[from++];\n }\n }\n }\n else {\n from = _out - dist; /* copy direct from output */\n do { /* minimum length is three */\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n len -= 3;\n } while (len > 2);\n if (len) {\n output[_out++] = output[from++];\n if (len > 1) {\n output[_out++] = output[from++];\n }\n }\n }\n }\n else if ((op & 64) === 0) { /* 2nd level distance code */\n here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dodist;\n }\n else {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n }\n else if ((op & 64) === 0) { /* 2nd level length code */\n here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dolen;\n }\n else if (op & 32) { /* end-of-block */\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.mode = TYPE;\n break top;\n }\n else {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n } while (_in < last && _out < end);\n\n /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n len = bits >> 3;\n _in -= len;\n bits -= len << 3;\n hold &= (1 << bits) - 1;\n\n /* update state and return */\n strm.next_in = _in;\n strm.next_out = _out;\n strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n state.hold = hold;\n state.bits = bits;\n return;\n};\n\n},{}],35:[function(_dereq_,module,exports){\n'use strict';\n\n\nvar utils = _dereq_('../utils/common');\nvar adler32 = _dereq_('./adler32');\nvar crc32 = _dereq_('./crc32');\nvar inflate_fast = _dereq_('./inffast');\nvar inflate_table = _dereq_('./inftrees');\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\n//var Z_NO_FLUSH = 0;\n//var Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH = 2;\n//var Z_FULL_FLUSH = 3;\nvar Z_FINISH = 4;\nvar Z_BLOCK = 5;\nvar Z_TREES = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK = 0;\nvar Z_STREAM_END = 1;\nvar Z_NEED_DICT = 2;\n//var Z_ERRNO = -1;\nvar Z_STREAM_ERROR = -2;\nvar Z_DATA_ERROR = -3;\nvar Z_MEM_ERROR = -4;\nvar Z_BUF_ERROR = -5;\n//var Z_VERSION_ERROR = -6;\n\n/* The deflate compression method */\nvar Z_DEFLATED = 8;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nvar HEAD = 1; /* i: waiting for magic header */\nvar FLAGS = 2; /* i: waiting for method and flags (gzip) */\nvar TIME = 3; /* i: waiting for modification time (gzip) */\nvar OS = 4; /* i: waiting for extra flags and operating system (gzip) */\nvar EXLEN = 5; /* i: waiting for extra length (gzip) */\nvar EXTRA = 6; /* i: waiting for extra bytes (gzip) */\nvar NAME = 7; /* i: waiting for end of file name (gzip) */\nvar COMMENT = 8; /* i: waiting for end of comment (gzip) */\nvar HCRC = 9; /* i: waiting for header crc (gzip) */\nvar DICTID = 10; /* i: waiting for dictionary check value */\nvar DICT = 11; /* waiting for inflateSetDictionary() call */\nvar TYPE = 12; /* i: waiting for type bits, including last-flag bit */\nvar TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */\nvar STORED = 14; /* i: waiting for stored size (length and complement) */\nvar COPY_ = 15; /* i/o: same as COPY below, but only first time in */\nvar COPY = 16; /* i/o: waiting for input or output to copy stored block */\nvar TABLE = 17; /* i: waiting for dynamic block table lengths */\nvar LENLENS = 18; /* i: waiting for code length code lengths */\nvar CODELENS = 19; /* i: waiting for length/lit and distance code lengths */\nvar LEN_ = 20; /* i: same as LEN below, but only first time in */\nvar LEN = 21; /* i: waiting for length/lit/eob code */\nvar LENEXT = 22; /* i: waiting for length extra bits */\nvar DIST = 23; /* i: waiting for distance code */\nvar DISTEXT = 24; /* i: waiting for distance extra bits */\nvar MATCH = 25; /* o: waiting for output space to copy string */\nvar LIT = 26; /* o: waiting for output space to write literal */\nvar CHECK = 27; /* i: waiting for 32-bit check value */\nvar LENGTH = 28; /* i: waiting for 32-bit length (gzip) */\nvar DONE = 29; /* finished check, done -- remain here until reset */\nvar BAD = 30; /* got a data error -- remain here until reset */\nvar MEM = 31; /* got an inflate() memory error -- remain here until reset */\nvar SYNC = 32; /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_WBITS = MAX_WBITS;\n\n\nfunction ZSWAP32(q) {\n return (((q >>> 24) & 0xff) +\n ((q >>> 8) & 0xff00) +\n ((q & 0xff00) << 8) +\n ((q & 0xff) << 24));\n}\n\n\nfunction InflateState() {\n this.mode = 0; /* current inflate mode */\n this.last = false; /* true if processing last block */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.havedict = false; /* true if dictionary provided */\n this.flags = 0; /* gzip header method and flags (0 if zlib) */\n this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */\n this.check = 0; /* protected copy of check value */\n this.total = 0; /* protected copy of output count */\n // TODO: may be {}\n this.head = null; /* where to save gzip header information */\n\n /* sliding window */\n this.wbits = 0; /* log base 2 of requested window size */\n this.wsize = 0; /* window size or zero if not using window */\n this.whave = 0; /* valid bytes in the window */\n this.wnext = 0; /* window write index */\n this.window = null; /* allocated sliding window, if needed */\n\n /* bit accumulator */\n this.hold = 0; /* input bit accumulator */\n this.bits = 0; /* number of bits in \"in\" */\n\n /* for string and stored block copying */\n this.length = 0; /* literal or length of data to copy */\n this.offset = 0; /* distance back to copy string from */\n\n /* for table and code decoding */\n this.extra = 0; /* extra bits needed */\n\n /* fixed and dynamic code tables */\n this.lencode = null; /* starting table for length/literal codes */\n this.distcode = null; /* starting table for distance codes */\n this.lenbits = 0; /* index bits for lencode */\n this.distbits = 0; /* index bits for distcode */\n\n /* dynamic table building */\n this.ncode = 0; /* number of code length code lengths */\n this.nlen = 0; /* number of length code lengths */\n this.ndist = 0; /* number of distance code lengths */\n this.have = 0; /* number of code lengths in lens[] */\n this.next = null; /* next available space in codes[] */\n\n this.lens = new utils.Buf16(320); /* temporary storage for code lengths */\n this.work = new utils.Buf16(288); /* work area for code table building */\n\n /*\n because we don't have pointers in js, we use lencode and distcode directly\n as buffers so we don't need codes\n */\n //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */\n this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */\n this.distdyn = null; /* dynamic table for distance codes (JS specific) */\n this.sane = 0; /* if false, allow invalid distance too far */\n this.back = 0; /* bits back of last unprocessed length/lit */\n this.was = 0; /* initial length of match */\n}\n\nfunction inflateResetKeep(strm) {\n var state;\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n strm.total_in = strm.total_out = state.total = 0;\n strm.msg = ''; /*Z_NULL*/\n if (state.wrap) { /* to support ill-conceived Java test suite */\n strm.adler = state.wrap & 1;\n }\n state.mode = HEAD;\n state.last = 0;\n state.havedict = 0;\n state.dmax = 32768;\n state.head = null/*Z_NULL*/;\n state.hold = 0;\n state.bits = 0;\n //state.lencode = state.distcode = state.next = state.codes;\n state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);\n state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);\n\n state.sane = 1;\n state.back = -1;\n //Tracev((stderr, \"inflate: reset\\n\"));\n return Z_OK;\n}\n\nfunction inflateReset(strm) {\n var state;\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n state.wsize = 0;\n state.whave = 0;\n state.wnext = 0;\n return inflateResetKeep(strm);\n\n}\n\nfunction inflateReset2(strm, windowBits) {\n var wrap;\n var state;\n\n /* get the state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n\n /* extract wrap request from windowBits parameter */\n if (windowBits < 0) {\n wrap = 0;\n windowBits = -windowBits;\n }\n else {\n wrap = (windowBits >> 4) + 1;\n if (windowBits < 48) {\n windowBits &= 15;\n }\n }\n\n /* set number of window bits, free window if different */\n if (windowBits && (windowBits < 8 || windowBits > 15)) {\n return Z_STREAM_ERROR;\n }\n if (state.window !== null && state.wbits !== windowBits) {\n state.window = null;\n }\n\n /* update state and reset the rest of it */\n state.wrap = wrap;\n state.wbits = windowBits;\n return inflateReset(strm);\n}\n\nfunction inflateInit2(strm, windowBits) {\n var ret;\n var state;\n\n if (!strm) { return Z_STREAM_ERROR; }\n //strm.msg = Z_NULL; /* in case we return an error */\n\n state = new InflateState();\n\n //if (state === Z_NULL) return Z_MEM_ERROR;\n //Tracev((stderr, \"inflate: allocated\\n\"));\n strm.state = state;\n state.window = null/*Z_NULL*/;\n ret = inflateReset2(strm, windowBits);\n if (ret !== Z_OK) {\n strm.state = null/*Z_NULL*/;\n }\n return ret;\n}\n\nfunction inflateInit(strm) {\n return inflateInit2(strm, DEF_WBITS);\n}\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding. Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter. This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time. However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nvar virgin = true;\n\nvar lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\nfunction fixedtables(state) {\n /* build fixed huffman tables if first call (may not be thread safe) */\n if (virgin) {\n var sym;\n\n lenfix = new utils.Buf32(512);\n distfix = new utils.Buf32(32);\n\n /* literal/length table */\n sym = 0;\n while (sym < 144) { state.lens[sym++] = 8; }\n while (sym < 256) { state.lens[sym++] = 9; }\n while (sym < 280) { state.lens[sym++] = 7; }\n while (sym < 288) { state.lens[sym++] = 8; }\n\n inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, {bits: 9});\n\n /* distance table */\n sym = 0;\n while (sym < 32) { state.lens[sym++] = 5; }\n\n inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, {bits: 5});\n\n /* do this just once */\n virgin = false;\n }\n\n state.lencode = lenfix;\n state.lenbits = 9;\n state.distcode = distfix;\n state.distbits = 5;\n}\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning. If window does not exist yet, create it. This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nfunction updatewindow(strm, src, end, copy) {\n var dist;\n var state = strm.state;\n\n /* if it hasn't been done already, allocate space for the window */\n if (state.window === null) {\n state.wsize = 1 << state.wbits;\n state.wnext = 0;\n state.whave = 0;\n\n state.window = new utils.Buf8(state.wsize);\n }\n\n /* copy state->wsize or less output bytes into the circular window */\n if (copy >= state.wsize) {\n utils.arraySet(state.window,src, end - state.wsize, state.wsize, 0);\n state.wnext = 0;\n state.whave = state.wsize;\n }\n else {\n dist = state.wsize - state.wnext;\n if (dist > copy) {\n dist = copy;\n }\n //zmemcpy(state->window + state->wnext, end - copy, dist);\n utils.arraySet(state.window,src, end - copy, dist, state.wnext);\n copy -= dist;\n if (copy) {\n //zmemcpy(state->window, end - copy, copy);\n utils.arraySet(state.window,src, end - copy, copy, 0);\n state.wnext = copy;\n state.whave = state.wsize;\n }\n else {\n state.wnext += dist;\n if (state.wnext === state.wsize) { state.wnext = 0; }\n if (state.whave < state.wsize) { state.whave += dist; }\n }\n }\n return 0;\n}\n\nfunction inflate(strm, flush) {\n var state;\n var input, output; // input/output buffers\n var next; /* next input INDEX */\n var put; /* next output INDEX */\n var have, left; /* available input and output */\n var hold; /* bit buffer */\n var bits; /* bits in bit buffer */\n var _in, _out; /* save starting available input and output */\n var copy; /* number of stored or match bytes to copy */\n var from; /* where to copy match bytes from */\n var from_source;\n var here = 0; /* current decoding table entry */\n var here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n //var last; /* parent table entry */\n var last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n var len; /* length to copy for repeats, bits to drop */\n var ret; /* return code */\n var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */\n var opts;\n\n var n; // temporary var for NEED_BITS\n\n var order = /* permutation of code lengths */\n [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];\n\n\n if (!strm || !strm.state || !strm.output ||\n (!strm.input && strm.avail_in !== 0)) {\n return Z_STREAM_ERROR;\n }\n\n state = strm.state;\n if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */\n\n\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n _in = have;\n _out = left;\n ret = Z_OK;\n\n inf_leave: // goto emulation\n for (;;) {\n switch (state.mode) {\n case HEAD:\n if (state.wrap === 0) {\n state.mode = TYPEDO;\n break;\n }\n //=== NEEDBITS(16);\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */\n state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = FLAGS;\n break;\n }\n state.flags = 0; /* expect zlib header */\n if (state.head) {\n state.head.done = false;\n }\n if (!(state.wrap & 1) || /* check if zlib header allowed */\n (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n strm.msg = 'incorrect header check';\n state.mode = BAD;\n break;\n }\n if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n len = (hold & 0x0f)/*BITS(4)*/ + 8;\n if (state.wbits === 0) {\n state.wbits = len;\n }\n else if (len > state.wbits) {\n strm.msg = 'invalid window size';\n state.mode = BAD;\n break;\n }\n state.dmax = 1 << len;\n //Tracev((stderr, \"inflate: zlib header ok\\n\"));\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = hold & 0x200 ? DICTID : TYPE;\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n break;\n case FLAGS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.flags = hold;\n if ((state.flags & 0xff) !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n if (state.flags & 0xe000) {\n strm.msg = 'unknown header flags set';\n state.mode = BAD;\n break;\n }\n if (state.head) {\n state.head.text = ((hold >> 8) & 1);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = TIME;\n /* falls through */\n case TIME:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.time = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC4(state.check, hold)\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n hbuf[2] = (hold >>> 16) & 0xff;\n hbuf[3] = (hold >>> 24) & 0xff;\n state.check = crc32(state.check, hbuf, 4, 0);\n //===\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = OS;\n /* falls through */\n case OS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.xflags = (hold & 0xff);\n state.head.os = (hold >> 8);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = EXLEN;\n /* falls through */\n case EXLEN:\n if (state.flags & 0x0400) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length = hold;\n if (state.head) {\n state.head.extra_len = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n else if (state.head) {\n state.head.extra = null/*Z_NULL*/;\n }\n state.mode = EXTRA;\n /* falls through */\n case EXTRA:\n if (state.flags & 0x0400) {\n copy = state.length;\n if (copy > have) { copy = have; }\n if (copy) {\n if (state.head) {\n len = state.head.extra_len - state.length;\n if (!state.head.extra) {\n // Use untyped array for more conveniend processing later\n state.head.extra = new Array(state.head.extra_len);\n }\n utils.arraySet(\n state.head.extra,\n input,\n next,\n // extra field is limited to 65536 bytes\n // - no need for additional size check\n copy,\n /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n len\n );\n //zmemcpy(state.head.extra + len, next,\n // len + copy > state.head.extra_max ?\n // state.head.extra_max - len : copy);\n }\n if (state.flags & 0x0200) {\n state.check = crc32(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n state.length -= copy;\n }\n if (state.length) { break inf_leave; }\n }\n state.length = 0;\n state.mode = NAME;\n /* falls through */\n case NAME:\n if (state.flags & 0x0800) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n // TODO: 2 or 1 bytes?\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.name_max*/)) {\n state.head.name += String.fromCharCode(len);\n }\n } while (len && copy < have);\n\n if (state.flags & 0x0200) {\n state.check = crc32(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.name = null;\n }\n state.length = 0;\n state.mode = COMMENT;\n /* falls through */\n case COMMENT:\n if (state.flags & 0x1000) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.comm_max*/)) {\n state.head.comment += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if (state.flags & 0x0200) {\n state.check = crc32(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.comment = null;\n }\n state.mode = HCRC;\n /* falls through */\n case HCRC:\n if (state.flags & 0x0200) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.check & 0xffff)) {\n strm.msg = 'header crc mismatch';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n if (state.head) {\n state.head.hcrc = ((state.flags >> 9) & 1);\n state.head.done = true;\n }\n strm.adler = state.check = 0 /*crc32(0L, Z_NULL, 0)*/;\n state.mode = TYPE;\n break;\n case DICTID:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n strm.adler = state.check = ZSWAP32(hold);\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = DICT;\n /* falls through */\n case DICT:\n if (state.havedict === 0) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n return Z_NEED_DICT;\n }\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = TYPE;\n /* falls through */\n case TYPE:\n if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case TYPEDO:\n if (state.last) {\n //--- BYTEBITS() ---//\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n state.mode = CHECK;\n break;\n }\n //=== NEEDBITS(3); */\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.last = (hold & 0x01)/*BITS(1)*/;\n //--- DROPBITS(1) ---//\n hold >>>= 1;\n bits -= 1;\n //---//\n\n switch ((hold & 0x03)/*BITS(2)*/) {\n case 0: /* stored block */\n //Tracev((stderr, \"inflate: stored block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = STORED;\n break;\n case 1: /* fixed block */\n fixedtables(state);\n //Tracev((stderr, \"inflate: fixed codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = LEN_; /* decode codes */\n if (flush === Z_TREES) {\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break inf_leave;\n }\n break;\n case 2: /* dynamic block */\n //Tracev((stderr, \"inflate: dynamic codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = TABLE;\n break;\n case 3:\n strm.msg = 'invalid block type';\n state.mode = BAD;\n }\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break;\n case STORED:\n //--- BYTEBITS() ---// /* go to byte boundary */\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n strm.msg = 'invalid stored block lengths';\n state.mode = BAD;\n break;\n }\n state.length = hold & 0xffff;\n //Tracev((stderr, \"inflate: stored length %u\\n\",\n // state.length));\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = COPY_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case COPY_:\n state.mode = COPY;\n /* falls through */\n case COPY:\n copy = state.length;\n if (copy) {\n if (copy > have) { copy = have; }\n if (copy > left) { copy = left; }\n if (copy === 0) { break inf_leave; }\n //--- zmemcpy(put, next, copy); ---\n utils.arraySet(output, input, next, copy, put);\n //---//\n have -= copy;\n next += copy;\n left -= copy;\n put += copy;\n state.length -= copy;\n break;\n }\n //Tracev((stderr, \"inflate: stored end\\n\"));\n state.mode = TYPE;\n break;\n case TABLE:\n //=== NEEDBITS(14); */\n while (bits < 14) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n if (state.nlen > 286 || state.ndist > 30) {\n strm.msg = 'too many length or distance symbols';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracev((stderr, \"inflate: table sizes ok\\n\"));\n state.have = 0;\n state.mode = LENLENS;\n /* falls through */\n case LENLENS:\n while (state.have < state.ncode) {\n //=== NEEDBITS(3);\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n while (state.have < 19) {\n state.lens[order[state.have++]] = 0;\n }\n // We have separate tables & no pointers. 2 commented lines below not needed.\n //state.next = state.codes;\n //state.lencode = state.next;\n // Switch to use dynamic table\n state.lencode = state.lendyn;\n state.lenbits = 7;\n\n opts = {bits: state.lenbits};\n ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n state.lenbits = opts.bits;\n\n if (ret) {\n strm.msg = 'invalid code lengths set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, \"inflate: code lengths ok\\n\"));\n state.have = 0;\n state.mode = CODELENS;\n /* falls through */\n case CODELENS:\n while (state.have < state.nlen + state.ndist) {\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_val < 16) {\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.lens[state.have++] = here_val;\n }\n else {\n if (here_val === 16) {\n //=== NEEDBITS(here.bits + 2);\n n = here_bits + 2;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n if (state.have === 0) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n len = state.lens[state.have - 1];\n copy = 3 + (hold & 0x03);//BITS(2);\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n }\n else if (here_val === 17) {\n //=== NEEDBITS(here.bits + 3);\n n = here_bits + 3;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 3 + (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n else {\n //=== NEEDBITS(here.bits + 7);\n n = here_bits + 7;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 11 + (hold & 0x7f);//BITS(7);\n //--- DROPBITS(7) ---//\n hold >>>= 7;\n bits -= 7;\n //---//\n }\n if (state.have + copy > state.nlen + state.ndist) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n while (copy--) {\n state.lens[state.have++] = len;\n }\n }\n }\n\n /* handle error breaks in while */\n if (state.mode === BAD) { break; }\n\n /* check for end-of-block code (better have one) */\n if (state.lens[256] === 0) {\n strm.msg = 'invalid code -- missing end-of-block';\n state.mode = BAD;\n break;\n }\n\n /* build code tables -- note: do not change the lenbits or distbits\n values here (9 and 6) without reading the comments in inftrees.h\n concerning the ENOUGH constants, which depend on those values */\n state.lenbits = 9;\n\n opts = {bits: state.lenbits};\n ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.lenbits = opts.bits;\n // state.lencode = state.next;\n\n if (ret) {\n strm.msg = 'invalid literal/lengths set';\n state.mode = BAD;\n break;\n }\n\n state.distbits = 6;\n //state.distcode.copy(state.codes);\n // Switch to use dynamic table\n state.distcode = state.distdyn;\n opts = {bits: state.distbits};\n ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.distbits = opts.bits;\n // state.distcode = state.next;\n\n if (ret) {\n strm.msg = 'invalid distances set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, 'inflate: codes ok\\n'));\n state.mode = LEN_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case LEN_:\n state.mode = LEN;\n /* falls through */\n case LEN:\n if (have >= 6 && left >= 258) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n inflate_fast(strm, _out);\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n if (state.mode === TYPE) {\n state.back = -1;\n }\n break;\n }\n state.back = 0;\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) -1)]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if (here_bits <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_op && (here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.lencode[last_val +\n ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n state.length = here_val;\n if (here_op === 0) {\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n state.mode = LIT;\n break;\n }\n if (here_op & 32) {\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.back = -1;\n state.mode = TYPE;\n break;\n }\n if (here_op & 64) {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break;\n }\n state.extra = here_op & 15;\n state.mode = LENEXT;\n /* falls through */\n case LENEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", state.length));\n state.was = state.length;\n state.mode = DIST;\n /* falls through */\n case DIST:\n for (;;) {\n here = state.distcode[hold & ((1 << state.distbits) -1)];/*BITS(state.distbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if ((here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.distcode[last_val +\n ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n if (here_op & 64) {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break;\n }\n state.offset = here_val;\n state.extra = (here_op) & 15;\n state.mode = DISTEXT;\n /* falls through */\n case DISTEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.offset += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n//#ifdef INFLATE_STRICT\n if (state.offset > state.dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracevv((stderr, \"inflate: distance %u\\n\", state.offset));\n state.mode = MATCH;\n /* falls through */\n case MATCH:\n if (left === 0) { break inf_leave; }\n copy = _out - left;\n if (state.offset > copy) { /* copy from window */\n copy = state.offset - copy;\n if (copy > state.whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n// (!) This block is disabled in zlib defailts,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// Trace((stderr, \"inflate.c too far\\n\"));\n// copy -= state.whave;\n// if (copy > state.length) { copy = state.length; }\n// if (copy > left) { copy = left; }\n// left -= copy;\n// state.length -= copy;\n// do {\n// output[put++] = 0;\n// } while (--copy);\n// if (state.length === 0) { state.mode = LEN; }\n// break;\n//#endif\n }\n if (copy > state.wnext) {\n copy -= state.wnext;\n from = state.wsize - copy;\n }\n else {\n from = state.wnext - copy;\n }\n if (copy > state.length) { copy = state.length; }\n from_source = state.window;\n }\n else { /* copy from output */\n from_source = output;\n from = put - state.offset;\n copy = state.length;\n }\n if (copy > left) { copy = left; }\n left -= copy;\n state.length -= copy;\n do {\n output[put++] = from_source[from++];\n } while (--copy);\n if (state.length === 0) { state.mode = LEN; }\n break;\n case LIT:\n if (left === 0) { break inf_leave; }\n output[put++] = state.length;\n left--;\n state.mode = LEN;\n break;\n case CHECK:\n if (state.wrap) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n // Use '|' insdead of '+' to make sure that result is signed\n hold |= input[next++] << bits;\n bits += 8;\n }\n //===//\n _out -= left;\n strm.total_out += _out;\n state.total += _out;\n if (_out) {\n strm.adler = state.check =\n /*UPDATE(state.check, put - _out, _out);*/\n (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));\n\n }\n _out = left;\n // NB: crc32 stored as signed 32-bit int, ZSWAP32 returns signed too\n if ((state.flags ? hold : ZSWAP32(hold)) !== state.check) {\n strm.msg = 'incorrect data check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: check matches trailer\\n\"));\n }\n state.mode = LENGTH;\n /* falls through */\n case LENGTH:\n if (state.wrap && state.flags) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.total & 0xffffffff)) {\n strm.msg = 'incorrect length check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: length matches trailer\\n\"));\n }\n state.mode = DONE;\n /* falls through */\n case DONE:\n ret = Z_STREAM_END;\n break inf_leave;\n case BAD:\n ret = Z_DATA_ERROR;\n break inf_leave;\n case MEM:\n return Z_MEM_ERROR;\n case SYNC:\n /* falls through */\n default:\n return Z_STREAM_ERROR;\n }\n }\n\n // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n /*\n Return from inflate(), updating the total counts and the check value.\n If there was no progress during the inflate() call, return a buffer\n error. Call updatewindow() to create and/or update the window state.\n Note: a memory error from inflate() is non-recoverable.\n */\n\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n\n if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n (state.mode < CHECK || flush !== Z_FINISH))) {\n if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {\n state.mode = MEM;\n return Z_MEM_ERROR;\n }\n }\n _in -= strm.avail_in;\n _out -= strm.avail_out;\n strm.total_in += _in;\n strm.total_out += _out;\n state.total += _out;\n if (state.wrap && _out) {\n strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));\n }\n strm.data_type = state.bits + (state.last ? 64 : 0) +\n (state.mode === TYPE ? 128 : 0) +\n (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {\n ret = Z_BUF_ERROR;\n }\n return ret;\n}\n\nfunction inflateEnd(strm) {\n\n if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n return Z_STREAM_ERROR;\n }\n\n var state = strm.state;\n if (state.window) {\n state.window = null;\n }\n strm.state = null;\n return Z_OK;\n}\n\nfunction inflateGetHeader(strm, head) {\n var state;\n\n /* check state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }\n\n /* save header structure */\n state.head = head;\n head.done = false;\n return Z_OK;\n}\n\n\nexports.inflateReset = inflateReset;\nexports.inflateReset2 = inflateReset2;\nexports.inflateResetKeep = inflateResetKeep;\nexports.inflateInit = inflateInit;\nexports.inflateInit2 = inflateInit2;\nexports.inflate = inflate;\nexports.inflateEnd = inflateEnd;\nexports.inflateGetHeader = inflateGetHeader;\nexports.inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nexports.inflateCopy = inflateCopy;\nexports.inflateGetDictionary = inflateGetDictionary;\nexports.inflateMark = inflateMark;\nexports.inflatePrime = inflatePrime;\nexports.inflateSetDictionary = inflateSetDictionary;\nexports.inflateSync = inflateSync;\nexports.inflateSyncPoint = inflateSyncPoint;\nexports.inflateUndermine = inflateUndermine;\n*/\n},{\"../utils/common\":27,\"./adler32\":29,\"./crc32\":31,\"./inffast\":34,\"./inftrees\":36}],36:[function(_dereq_,module,exports){\n'use strict';\n\n\nvar utils = _dereq_('../utils/common');\n\nvar MAXBITS = 15;\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\nvar lbase = [ /* Length codes 257..285 base */\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n];\n\nvar lext = [ /* Length codes 257..285 extra */\n 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n];\n\nvar dbase = [ /* Distance codes 0..29 base */\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n 8193, 12289, 16385, 24577, 0, 0\n];\n\nvar dext = [ /* Distance codes 0..29 extra */\n 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n 28, 28, 29, 29, 64, 64\n];\n\nmodule.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)\n{\n var bits = opts.bits;\n //here = opts.here; /* table entry for duplication */\n\n var len = 0; /* a code's length in bits */\n var sym = 0; /* index of code symbols */\n var min = 0, max = 0; /* minimum and maximum code lengths */\n var root = 0; /* number of index bits for root table */\n var curr = 0; /* number of index bits for current table */\n var drop = 0; /* code bits to drop for sub-table */\n var left = 0; /* number of prefix codes available */\n var used = 0; /* code entries in table used */\n var huff = 0; /* Huffman code */\n var incr; /* for incrementing code, index */\n var fill; /* index for replicating entries */\n var low; /* low bits for current root entry */\n var mask; /* mask for low root bits */\n var next; /* next available space in table */\n var base = null; /* base value table to use */\n var base_index = 0;\n// var shoextra; /* extra bits table to use */\n var end; /* use base and extra for symbol > end */\n var count = new utils.Buf16(MAXBITS+1); //[MAXBITS+1]; /* number of codes of each length */\n var offs = new utils.Buf16(MAXBITS+1); //[MAXBITS+1]; /* offsets in table for each length */\n var extra = null;\n var extra_index = 0;\n\n var here_bits, here_op, here_val;\n\n /*\n Process a set of code lengths to create a canonical Huffman code. The\n code lengths are lens[0..codes-1]. Each length corresponds to the\n symbols 0..codes-1. The Huffman code is generated by first sorting the\n symbols by length from short to long, and retaining the symbol order\n for codes with equal lengths. Then the code starts with all zero bits\n for the first code of the shortest length, and the codes are integer\n increments for the same length, and zeros are appended as the length\n increases. For the deflate format, these bits are stored backwards\n from their more natural integer increment ordering, and so when the\n decoding tables are built in the large loop below, the integer codes\n are incremented backwards.\n\n This routine assumes, but does not check, that all of the entries in\n lens[] are in the range 0..MAXBITS. The caller must assure this.\n 1..MAXBITS is interpreted as that code length. zero means that that\n symbol does not occur in this code.\n\n The codes are sorted by computing a count of codes for each length,\n creating from that a table of starting indices for each length in the\n sorted table, and then entering the symbols in order in the sorted\n table. The sorted table is work[], with that space being provided by\n the caller.\n\n The length counts are used for other purposes as well, i.e. finding\n the minimum and maximum length codes, determining if there are any\n codes at all, checking for a valid set of lengths, and looking ahead\n at length counts to determine sub-table sizes when building the\n decoding tables.\n */\n\n /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n for (len = 0; len <= MAXBITS; len++) {\n count[len] = 0;\n }\n for (sym = 0; sym < codes; sym++) {\n count[lens[lens_index + sym]]++;\n }\n\n /* bound code lengths, force root to be within code lengths */\n root = bits;\n for (max = MAXBITS; max >= 1; max--) {\n if (count[max] !== 0) { break; }\n }\n if (root > max) {\n root = max;\n }\n if (max === 0) { /* no symbols to code at all */\n //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */\n //table.bits[opts.table_index] = 1; //here.bits = (var char)1;\n //table.val[opts.table_index++] = 0; //here.val = (var short)0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n //table.op[opts.table_index] = 64;\n //table.bits[opts.table_index] = 1;\n //table.val[opts.table_index++] = 0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n opts.bits = 1;\n return 0; /* no symbols, but wait for decoding to report error */\n }\n for (min = 1; min < max; min++) {\n if (count[min] !== 0) { break; }\n }\n if (root < min) {\n root = min;\n }\n\n /* check for an over-subscribed or incomplete set of lengths */\n left = 1;\n for (len = 1; len <= MAXBITS; len++) {\n left <<= 1;\n left -= count[len];\n if (left < 0) {\n return -1;\n } /* over-subscribed */\n }\n if (left > 0 && (type === CODES || max !== 1)) {\n return -1; /* incomplete set */\n }\n\n /* generate offsets into symbol table for each length for sorting */\n offs[1] = 0;\n for (len = 1; len < MAXBITS; len++) {\n offs[len + 1] = offs[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (sym = 0; sym < codes; sym++) {\n if (lens[lens_index + sym] !== 0) {\n work[offs[lens[lens_index + sym]]++] = sym;\n }\n }\n\n /*\n Create and fill in decoding tables. In this loop, the table being\n filled is at next and has curr index bits. The code being used is huff\n with length len. That code is converted to an index by dropping drop\n bits off of the bottom. For codes where len is less than drop + curr,\n those top drop + curr - len bits are incremented through all values to\n fill the table with replicated entries.\n\n root is the number of index bits for the root table. When len exceeds\n root, sub-tables are created pointed to by the root entry with an index\n of the low root bits of huff. This is saved in low to check for when a\n new sub-table should be started. drop is zero when the root table is\n being filled, and drop is root when sub-tables are being filled.\n\n When a new sub-table is needed, it is necessary to look ahead in the\n code lengths to determine what size sub-table is needed. The length\n counts are used for this, and so count[] is decremented as codes are\n entered in the tables.\n\n used keeps track of how many table entries have been allocated from the\n provided *table space. It is checked for LENS and DIST tables against\n the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n the initial root table size constants. See the comments in inftrees.h\n for more information.\n\n sym increments through all symbols, and the loop terminates when\n all codes of length max, i.e. all codes, have been processed. This\n routine permits incomplete codes, so another loop after this one fills\n in the rest of the decoding tables with invalid code markers.\n */\n\n /* set up for code type */\n // poor man optimization - use if-else instead of switch,\n // to avoid deopts in old v8\n if (type === CODES) {\n base = extra = work; /* dummy value--not used */\n end = 19;\n } else if (type === LENS) {\n base = lbase;\n base_index -= 257;\n extra = lext;\n extra_index -= 257;\n end = 256;\n } else { /* DISTS */\n base = dbase;\n extra = dext;\n end = -1;\n }\n\n /* initialize opts for loop */\n huff = 0; /* starting code */\n sym = 0; /* starting code symbol */\n len = min; /* starting code length */\n next = table_index; /* current table to fill in */\n curr = root; /* current table index bits */\n drop = 0; /* current bits to drop from code for index */\n low = -1; /* trigger new sub-table when len > root */\n used = 1 << root; /* use root table entries */\n mask = used - 1; /* mask for comparing low */\n\n /* check available table space */\n if ((type === LENS && used > ENOUGH_LENS) ||\n (type === DISTS && used > ENOUGH_DISTS)) {\n return 1;\n }\n\n var i=0;\n /* process all codes and make table entries */\n for (;;) {\n i++;\n /* create table entry */\n here_bits = len - drop;\n if (work[sym] < end) {\n here_op = 0;\n here_val = work[sym];\n }\n else if (work[sym] > end) {\n here_op = extra[extra_index + work[sym]];\n here_val = base[base_index + work[sym]];\n }\n else {\n here_op = 32 + 64; /* end of block */\n here_val = 0;\n }\n\n /* replicate for those indices with low len bits equal to huff */\n incr = 1 << (len - drop);\n fill = 1 << curr;\n min = fill; /* save offset to next table */\n do {\n fill -= incr;\n table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n } while (fill !== 0);\n\n /* backwards increment the len-bit code huff */\n incr = 1 << (len - 1);\n while (huff & incr) {\n incr >>= 1;\n }\n if (incr !== 0) {\n huff &= incr - 1;\n huff += incr;\n } else {\n huff = 0;\n }\n\n /* go to next symbol, update count, len */\n sym++;\n if (--count[len] === 0) {\n if (len === max) { break; }\n len = lens[lens_index + work[sym]];\n }\n\n /* create new sub-table if needed */\n if (len > root && (huff & mask) !== low) {\n /* if first time, transition to sub-tables */\n if (drop === 0) {\n drop = root;\n }\n\n /* increment past last table */\n next += min; /* here min is 1 << curr */\n\n /* determine length of next table */\n curr = len - drop;\n left = 1 << curr;\n while (curr + drop < max) {\n left -= count[curr + drop];\n if (left <= 0) { break; }\n curr++;\n left <<= 1;\n }\n\n /* check for enough space */\n used += 1 << curr;\n if ((type === LENS && used > ENOUGH_LENS) ||\n (type === DISTS && used > ENOUGH_DISTS)) {\n return 1;\n }\n\n /* point entry in root table to sub-table */\n low = huff & mask;\n /*table.op[low] = curr;\n table.bits[low] = root;\n table.val[low] = next - opts.table_index;*/\n table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n }\n }\n\n /* fill in remaining table entry if code is incomplete (guaranteed to have\n at most one remaining entry, since if the code is incomplete, the\n maximum code length that was allowed to get this far is one bit) */\n if (huff !== 0) {\n //table.op[next + huff] = 64; /* invalid code marker */\n //table.bits[next + huff] = len - drop;\n //table.val[next + huff] = 0;\n table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n }\n\n /* set return parameters */\n //opts.table_index += used;\n opts.bits = root;\n return 0;\n};\n\n},{\"../utils/common\":27}],37:[function(_dereq_,module,exports){\n'use strict';\n\nmodule.exports = {\n '2': 'need dictionary', /* Z_NEED_DICT 2 */\n '1': 'stream end', /* Z_STREAM_END 1 */\n '0': '', /* Z_OK 0 */\n '-1': 'file error', /* Z_ERRNO (-1) */\n '-2': 'stream error', /* Z_STREAM_ERROR (-2) */\n '-3': 'data error', /* Z_DATA_ERROR (-3) */\n '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */\n '-5': 'buffer error', /* Z_BUF_ERROR (-5) */\n '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n},{}],38:[function(_dereq_,module,exports){\n'use strict';\n\n\nvar utils = _dereq_('../utils/common');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//var Z_FILTERED = 1;\n//var Z_HUFFMAN_ONLY = 2;\n//var Z_RLE = 3;\nvar Z_FIXED = 4;\n//var Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nvar Z_BINARY = 0;\nvar Z_TEXT = 1;\n//var Z_ASCII = 1; // = Z_TEXT\nvar Z_UNKNOWN = 2;\n\n/*============================================================================*/\n\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nvar STORED_BLOCK = 0;\nvar STATIC_TREES = 1;\nvar DYN_TREES = 2;\n/* The three kinds of block type */\n\nvar MIN_MATCH = 3;\nvar MAX_MATCH = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nvar LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nvar LITERALS = 256;\n/* number of literal bytes 0..255 */\n\nvar L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nvar D_CODES = 30;\n/* number of distance codes */\n\nvar BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\n\nvar HEAP_SIZE = 2*L_CODES + 1;\n/* maximum heap size */\n\nvar MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar Buf_size = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nvar MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nvar END_BLOCK = 256;\n/* end of block literal code */\n\nvar REP_3_6 = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nvar REPZ_3_10 = 17;\n/* repeat a zero length 3-10 times (3 bits of repeat count) */\n\nvar REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times (7 bits of repeat count) */\n\nvar extra_lbits = /* extra bits for each length code */\n [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];\n\nvar extra_dbits = /* extra bits for each distance code */\n [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];\n\nvar extra_blbits = /* extra bits for each bit length code */\n [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];\n\nvar bl_order =\n [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nvar DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1\nvar static_ltree = new Array((L_CODES+2) * 2);\nzero(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nvar static_dtree = new Array(D_CODES * 2);\nzero(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nvar _dist_code = new Array(DIST_CODE_LEN);\nzero(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nvar _length_code = new Array(MAX_MATCH-MIN_MATCH+1);\nzero(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nvar base_length = new Array(LENGTH_CODES);\nzero(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nvar base_dist = new Array(D_CODES);\nzero(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nvar StaticTreeDesc = function (static_tree, extra_bits, extra_base, elems, max_length) {\n\n this.static_tree = static_tree; /* static tree or NULL */\n this.extra_bits = extra_bits; /* extra bits for each code or NULL */\n this.extra_base = extra_base; /* base index for extra_bits */\n this.elems = elems; /* max number of elements in the tree */\n this.max_length = max_length; /* max bit length for the codes */\n\n // show if `static_tree` has data or dummy - needed for monomorphic objects\n this.has_stree = static_tree && static_tree.length;\n};\n\n\nvar static_l_desc;\nvar static_d_desc;\nvar static_bl_desc;\n\n\nvar TreeDesc = function(dyn_tree, stat_desc) {\n this.dyn_tree = dyn_tree; /* the dynamic tree */\n this.max_code = 0; /* largest code with non zero frequency */\n this.stat_desc = stat_desc; /* the corresponding static tree */\n};\n\n\n\nfunction d_code(dist) {\n return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n}\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nfunction put_short (s, w) {\n// put_byte(s, (uch)((w) & 0xff));\n// put_byte(s, (uch)((ush)(w) >> 8));\n s.pending_buf[s.pending++] = (w) & 0xff;\n s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n}\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nfunction send_bits(s, value, length) {\n if (s.bi_valid > (Buf_size - length)) {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n put_short(s, s.bi_buf);\n s.bi_buf = value >> (Buf_size - s.bi_valid);\n s.bi_valid += length - Buf_size;\n } else {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n s.bi_valid += length;\n }\n}\n\n\nfunction send_code(s, c, tree) {\n send_bits(s, tree[c*2]/*.Code*/, tree[c*2 + 1]/*.Len*/);\n}\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nfunction bi_reverse(code, len) {\n var res = 0;\n do {\n res |= code & 1;\n code >>>= 1;\n res <<= 1;\n } while (--len > 0);\n return res >>> 1;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nfunction bi_flush(s) {\n if (s.bi_valid === 16) {\n put_short(s, s.bi_buf);\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n } else if (s.bi_valid >= 8) {\n s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n s.bi_buf >>= 8;\n s.bi_valid -= 8;\n }\n}\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n * above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n * array bl_count contains the frequencies for each bit length.\n * The length opt_len is updated; static_len is also updated if stree is\n * not null.\n */\nfunction gen_bitlen(s, desc)\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n var tree = desc.dyn_tree;\n var max_code = desc.max_code;\n var stree = desc.stat_desc.static_tree;\n var has_stree = desc.stat_desc.has_stree;\n var extra = desc.stat_desc.extra_bits;\n var base = desc.stat_desc.extra_base;\n var max_length = desc.stat_desc.max_length;\n var h; /* heap index */\n var n, m; /* iterate over the tree elements */\n var bits; /* bit length */\n var xbits; /* extra bits */\n var f; /* frequency */\n var overflow = 0; /* number of elements with bit length too large */\n\n for (bits = 0; bits <= MAX_BITS; bits++) {\n s.bl_count[bits] = 0;\n }\n\n /* In a first pass, compute the optimal bit lengths (which may\n * overflow in the case of the bit length tree).\n */\n tree[s.heap[s.heap_max]*2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n for (h = s.heap_max+1; h < HEAP_SIZE; h++) {\n n = s.heap[h];\n bits = tree[tree[n*2 +1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n if (bits > max_length) {\n bits = max_length;\n overflow++;\n }\n tree[n*2 + 1]/*.Len*/ = bits;\n /* We overwrite tree[n].Dad which is no longer needed */\n\n if (n > max_code) { continue; } /* not a leaf node */\n\n s.bl_count[bits]++;\n xbits = 0;\n if (n >= base) {\n xbits = extra[n-base];\n }\n f = tree[n * 2]/*.Freq*/;\n s.opt_len += f * (bits + xbits);\n if (has_stree) {\n s.static_len += f * (stree[n*2 + 1]/*.Len*/ + xbits);\n }\n }\n if (overflow === 0) { return; }\n\n // Trace((stderr,\"\\nbit length overflow\\n\"));\n /* This happens for example on obj2 and pic of the Calgary corpus */\n\n /* Find the first bit length which could increase: */\n do {\n bits = max_length-1;\n while (s.bl_count[bits] === 0) { bits--; }\n s.bl_count[bits]--; /* move one leaf down the tree */\n s.bl_count[bits+1] += 2; /* move one overflow item as its brother */\n s.bl_count[max_length]--;\n /* The brother of the overflow item also moves one step up,\n * but this does not affect bl_count[max_length]\n */\n overflow -= 2;\n } while (overflow > 0);\n\n /* Now recompute all bit lengths, scanning in increasing frequency.\n * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n * lengths instead of fixing only the wrong ones. This idea is taken\n * from 'ar' written by Haruhiko Okumura.)\n */\n for (bits = max_length; bits !== 0; bits--) {\n n = s.bl_count[bits];\n while (n !== 0) {\n m = s.heap[--h];\n if (m > max_code) { continue; }\n if (tree[m*2 + 1]/*.Len*/ !== bits) {\n // Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n s.opt_len += (bits - tree[m*2 + 1]/*.Len*/)*tree[m*2]/*.Freq*/;\n tree[m*2 + 1]/*.Len*/ = bits;\n }\n n--;\n }\n }\n}\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n * zero code length.\n */\nfunction gen_codes(tree, max_code, bl_count)\n// ct_data *tree; /* the tree to decorate */\n// int max_code; /* largest code with non zero frequency */\n// ushf *bl_count; /* number of codes at each bit length */\n{\n var next_code = new Array(MAX_BITS+1); /* next code value for each bit length */\n var code = 0; /* running code value */\n var bits; /* bit index */\n var n; /* code index */\n\n /* The distribution counts are first used to generate the code values\n * without bit reversal.\n */\n for (bits = 1; bits <= MAX_BITS; bits++) {\n next_code[bits] = code = (code + bl_count[bits-1]) << 1;\n }\n /* Check that the bit counts in bl_count are consistent. The last code\n * must be all ones.\n */\n //Assert (code + bl_count[MAX_BITS]-1 == (1< length code (0..28) */\n length = 0;\n for (code = 0; code < LENGTH_CODES-1; code++) {\n base_length[code] = length;\n for (n = 0; n < (1< dist code (0..29) */\n dist = 0;\n for (code = 0 ; code < 16; code++) {\n base_dist[code] = dist;\n for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */\n for ( ; code < D_CODES; code++) {\n base_dist[code] = dist << 7;\n for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {\n _dist_code[256 + dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n /* Construct the codes of the static literal tree */\n for (bits = 0; bits <= MAX_BITS; bits++) {\n bl_count[bits] = 0;\n }\n\n n = 0;\n while (n <= 143) {\n static_ltree[n*2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n while (n <= 255) {\n static_ltree[n*2 + 1]/*.Len*/ = 9;\n n++;\n bl_count[9]++;\n }\n while (n <= 279) {\n static_ltree[n*2 + 1]/*.Len*/ = 7;\n n++;\n bl_count[7]++;\n }\n while (n <= 287) {\n static_ltree[n*2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n /* Codes 286 and 287 do not exist, but we must include them in the\n * tree construction to get a canonical Huffman tree (longest code\n * all ones)\n */\n gen_codes(static_ltree, L_CODES+1, bl_count);\n\n /* The static distance tree is trivial: */\n for (n = 0; n < D_CODES; n++) {\n static_dtree[n*2 + 1]/*.Len*/ = 5;\n static_dtree[n*2]/*.Code*/ = bi_reverse(n, 5);\n }\n\n // Now data ready and we can init static trees\n static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS);\n static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS);\n static_bl_desc =new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS);\n\n //static_init_done = true;\n}\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nfunction init_block(s) {\n var n; /* iterates over tree elements */\n\n /* Initialize the trees. */\n for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n*2]/*.Freq*/ = 0; }\n for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n*2]/*.Freq*/ = 0; }\n for (n = 0; n < BL_CODES; n++) { s.bl_tree[n*2]/*.Freq*/ = 0; }\n\n s.dyn_ltree[END_BLOCK*2]/*.Freq*/ = 1;\n s.opt_len = s.static_len = 0;\n s.last_lit = s.matches = 0;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nfunction bi_windup(s)\n{\n if (s.bi_valid > 8) {\n put_short(s, s.bi_buf);\n } else if (s.bi_valid > 0) {\n //put_byte(s, (Byte)s->bi_buf);\n s.pending_buf[s.pending++] = s.bi_buf;\n }\n s.bi_buf = 0;\n s.bi_valid = 0;\n}\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nfunction copy_block(s, buf, len, header)\n//DeflateState *s;\n//charf *buf; /* the input data */\n//unsigned len; /* its length */\n//int header; /* true if block header must be written */\n{\n bi_windup(s); /* align on byte boundary */\n\n if (header) {\n put_short(s, len);\n put_short(s, ~len);\n }\n// while (len--) {\n// put_byte(s, *buf++);\n// }\n utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);\n s.pending += len;\n}\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nfunction smaller(tree, n, m, depth) {\n var _n2 = n*2;\n var _m2 = m*2;\n return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n}\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nfunction pqdownheap(s, tree, k)\n// deflate_state *s;\n// ct_data *tree; /* the tree to restore */\n// int k; /* node to move down */\n{\n var v = s.heap[k];\n var j = k << 1; /* left son of k */\n while (j <= s.heap_len) {\n /* Set j to the smallest of the two sons: */\n if (j < s.heap_len &&\n smaller(tree, s.heap[j+1], s.heap[j], s.depth)) {\n j++;\n }\n /* Exit if v is smaller than both sons */\n if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n /* Exchange v with the smallest son */\n s.heap[k] = s.heap[j];\n k = j;\n\n /* And continue down the tree, setting j to the left son of k */\n j <<= 1;\n }\n s.heap[k] = v;\n}\n\n\n// inlined manually\n// var SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nfunction compress_block(s, ltree, dtree)\n// deflate_state *s;\n// const ct_data *ltree; /* literal tree */\n// const ct_data *dtree; /* distance tree */\n{\n var dist; /* distance of matched string */\n var lc; /* match length or unmatched char (if dist == 0) */\n var lx = 0; /* running index in l_buf */\n var code; /* the code to send */\n var extra; /* number of extra bits to send */\n\n if (s.last_lit !== 0) {\n do {\n dist = (s.pending_buf[s.d_buf + lx*2] << 8) | (s.pending_buf[s.d_buf + lx*2 + 1]);\n lc = s.pending_buf[s.l_buf + lx];\n lx++;\n\n if (dist === 0) {\n send_code(s, lc, ltree); /* send a literal byte */\n //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n } else {\n /* Here, lc is the match length - MIN_MATCH */\n code = _length_code[lc];\n send_code(s, code+LITERALS+1, ltree); /* send the length code */\n extra = extra_lbits[code];\n if (extra !== 0) {\n lc -= base_length[code];\n send_bits(s, lc, extra); /* send the extra length bits */\n }\n dist--; /* dist is now the match distance - 1 */\n code = d_code(dist);\n //Assert (code < D_CODES, \"bad d_code\");\n\n send_code(s, code, dtree); /* send the distance code */\n extra = extra_dbits[code];\n if (extra !== 0) {\n dist -= base_dist[code];\n send_bits(s, dist, extra); /* send the extra distance bits */\n }\n } /* literal or match pair ? */\n\n /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n // \"pendingBuf overflow\");\n\n } while (lx < s.last_lit);\n }\n\n send_code(s, END_BLOCK, ltree);\n}\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n * and corresponding code. The length opt_len is updated; static_len is\n * also updated if stree is not null. The field max_code is set.\n */\nfunction build_tree(s, desc)\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n var tree = desc.dyn_tree;\n var stree = desc.stat_desc.static_tree;\n var has_stree = desc.stat_desc.has_stree;\n var elems = desc.stat_desc.elems;\n var n, m; /* iterate over heap elements */\n var max_code = -1; /* largest code with non zero frequency */\n var node; /* new node being created */\n\n /* Construct the initial heap, with least frequent element in\n * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n * heap[0] is not used.\n */\n s.heap_len = 0;\n s.heap_max = HEAP_SIZE;\n\n for (n = 0; n < elems; n++) {\n if (tree[n * 2]/*.Freq*/ !== 0) {\n s.heap[++s.heap_len] = max_code = n;\n s.depth[n] = 0;\n\n } else {\n tree[n*2 + 1]/*.Len*/ = 0;\n }\n }\n\n /* The pkzip format requires that at least one distance code exists,\n * and that at least one bit should be sent even if there is only one\n * possible code. So to avoid special checks later on we force at least\n * two codes of non zero frequency.\n */\n while (s.heap_len < 2) {\n node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n tree[node * 2]/*.Freq*/ = 1;\n s.depth[node] = 0;\n s.opt_len--;\n\n if (has_stree) {\n s.static_len -= stree[node*2 + 1]/*.Len*/;\n }\n /* node is 0 or 1 so it does not have extra bits */\n }\n desc.max_code = max_code;\n\n /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n * establish sub-heaps of increasing lengths:\n */\n for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n /* Construct the Huffman tree by repeatedly combining the least two\n * frequent nodes.\n */\n node = elems; /* next internal node of the tree */\n do {\n //pqremove(s, tree, n); /* n = node of least frequency */\n /*** pqremove ***/\n n = s.heap[1/*SMALLEST*/];\n s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n pqdownheap(s, tree, 1/*SMALLEST*/);\n /***/\n\n m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n s.heap[--s.heap_max] = m;\n\n /* Create a new node father of n and m */\n tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n tree[n*2 + 1]/*.Dad*/ = tree[m*2 + 1]/*.Dad*/ = node;\n\n /* and insert the new node in the heap */\n s.heap[1/*SMALLEST*/] = node++;\n pqdownheap(s, tree, 1/*SMALLEST*/);\n\n } while (s.heap_len >= 2);\n\n s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n /* At this point, the fields freq and dad are set. We can now\n * generate the bit lengths.\n */\n gen_bitlen(s, desc);\n\n /* The field len is now set, we can generate the bit codes */\n gen_codes(tree, max_code, s.bl_count);\n}\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nfunction scan_tree(s, tree, max_code)\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n var n; /* iterates over all tree elements */\n var prevlen = -1; /* last emitted length */\n var curlen; /* length of current code */\n\n var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */\n\n var count = 0; /* repeat count of the current code */\n var max_count = 7; /* max repeat count */\n var min_count = 4; /* min repeat count */\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n tree[(max_code+1)*2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n+1)*2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n } else if (curlen !== 0) {\n\n if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n s.bl_tree[REP_3_6*2]/*.Freq*/++;\n\n } else if (count <= 10) {\n s.bl_tree[REPZ_3_10*2]/*.Freq*/++;\n\n } else {\n s.bl_tree[REPZ_11_138*2]/*.Freq*/++;\n }\n\n count = 0;\n prevlen = curlen;\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n}\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nfunction send_tree(s, tree, max_code)\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n var n; /* iterates over all tree elements */\n var prevlen = -1; /* last emitted length */\n var curlen; /* length of current code */\n\n var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */\n\n var count = 0; /* repeat count of the current code */\n var max_count = 7; /* max repeat count */\n var min_count = 4; /* min repeat count */\n\n /* tree[max_code+1].Len = -1; */ /* guard already set */\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n+1)*2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n } else if (curlen !== 0) {\n if (curlen !== prevlen) {\n send_code(s, curlen, s.bl_tree);\n count--;\n }\n //Assert(count >= 3 && count <= 6, \" 3_6?\");\n send_code(s, REP_3_6, s.bl_tree);\n send_bits(s, count-3, 2);\n\n } else if (count <= 10) {\n send_code(s, REPZ_3_10, s.bl_tree);\n send_bits(s, count-3, 3);\n\n } else {\n send_code(s, REPZ_11_138, s.bl_tree);\n send_bits(s, count-11, 7);\n }\n\n count = 0;\n prevlen = curlen;\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n}\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nfunction build_bl_tree(s) {\n var max_blindex; /* index of last bit length code of non zero freq */\n\n /* Determine the bit length frequencies for literal and distance trees */\n scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n /* Build the bit length tree: */\n build_tree(s, s.bl_desc);\n /* opt_len now includes the length of the tree representations, except\n * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n */\n\n /* Determine the number of bit length codes to send. The pkzip format\n * requires that at least 4 bit length codes be sent. (appnote.txt says\n * 3 but the actual value used is 4.)\n */\n for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {\n if (s.bl_tree[bl_order[max_blindex]*2 + 1]/*.Len*/ !== 0) {\n break;\n }\n }\n /* Update opt_len to include the bit length tree and counts */\n s.opt_len += 3*(max_blindex+1) + 5+5+4;\n //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n // s->opt_len, s->static_len));\n\n return max_blindex;\n}\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nfunction send_all_trees(s, lcodes, dcodes, blcodes)\n// deflate_state *s;\n// int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n var rank; /* index in bl_order */\n\n //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n // \"too many codes\");\n //Tracev((stderr, \"\\nbl counts: \"));\n send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */\n send_bits(s, dcodes-1, 5);\n send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */\n for (rank = 0; rank < blcodes; rank++) {\n //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n send_bits(s, s.bl_tree[bl_order[rank]*2 + 1]/*.Len*/, 3);\n }\n //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_ltree, lcodes-1); /* literal tree */\n //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_dtree, dcodes-1); /* distance tree */\n //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n}\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n * a) There are no non-portable control characters belonging to the\n * \"black list\" (0..6, 14..25, 28..31).\n * b) There is at least one printable character belonging to the\n * \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n * \"gray list\" that is ignored in this detection algorithm:\n * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nfunction detect_data_type(s) {\n /* black_mask is the bit mask of black-listed bytes\n * set bits 0..6, 14..25, and 28..31\n * 0xf3ffc07f = binary 11110011111111111100000001111111\n */\n var black_mask = 0xf3ffc07f;\n var n;\n\n /* Check for non-textual (\"black-listed\") bytes. */\n for (n = 0; n <= 31; n++, black_mask >>>= 1) {\n if ((black_mask & 1) && (s.dyn_ltree[n*2]/*.Freq*/ !== 0)) {\n return Z_BINARY;\n }\n }\n\n /* Check for textual (\"white-listed\") bytes. */\n if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n for (n = 32; n < LITERALS; n++) {\n if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n }\n\n /* There are no \"black-listed\" or \"white-listed\" bytes:\n * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n */\n return Z_BINARY;\n}\n\n\nvar static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nfunction _tr_init(s)\n{\n\n if (!static_init_done) {\n tr_static_init();\n static_init_done = true;\n }\n\n s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);\n s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);\n s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n /* Initialize the first block of the first file: */\n init_block(s);\n}\n\n\n/* ===========================================================================\n * Send a stored block\n */\nfunction _tr_stored_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf; /* input block */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n send_bits(s, (STORED_BLOCK<<1)+(last ? 1 : 0), 3); /* send block type */\n copy_block(s, buf, stored_len, true); /* with header */\n}\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nfunction _tr_align(s) {\n send_bits(s, STATIC_TREES<<1, 3);\n send_code(s, END_BLOCK, static_ltree);\n bi_flush(s);\n}\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nfunction _tr_flush_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf; /* input block, or NULL if too old */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n var opt_lenb, static_lenb; /* opt_len and static_len in bytes */\n var max_blindex = 0; /* index of last bit length code of non zero freq */\n\n /* Build the Huffman trees unless a stored block is forced */\n if (s.level > 0) {\n\n /* Check if the file is binary or text */\n if (s.strm.data_type === Z_UNKNOWN) {\n s.strm.data_type = detect_data_type(s);\n }\n\n /* Construct the literal and distance trees */\n build_tree(s, s.l_desc);\n // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n\n build_tree(s, s.d_desc);\n // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n /* At this point, opt_len and static_len are the total bit lengths of\n * the compressed block data, excluding the tree representations.\n */\n\n /* Build the bit length tree for the above two trees, and get the index\n * in bl_order of the last bit length code to send.\n */\n max_blindex = build_bl_tree(s);\n\n /* Determine the best encoding. Compute the block lengths in bytes. */\n opt_lenb = (s.opt_len+3+7) >>> 3;\n static_lenb = (s.static_len+3+7) >>> 3;\n\n // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n // s->last_lit));\n\n if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n } else {\n // Assert(buf != (char*)0, \"lost buf\");\n opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n }\n\n if ((stored_len+4 <= opt_lenb) && (buf !== -1)) {\n /* 4: two words for the lengths */\n\n /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n * Otherwise we can't have processed more than WSIZE input bytes since\n * the last block flush, because compression would have been\n * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n * transform a block into a stored block.\n */\n _tr_stored_block(s, buf, stored_len, last);\n\n } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {\n\n send_bits(s, (STATIC_TREES<<1) + (last ? 1 : 0), 3);\n compress_block(s, static_ltree, static_dtree);\n\n } else {\n send_bits(s, (DYN_TREES<<1) + (last ? 1 : 0), 3);\n send_all_trees(s, s.l_desc.max_code+1, s.d_desc.max_code+1, max_blindex+1);\n compress_block(s, s.dyn_ltree, s.dyn_dtree);\n }\n // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n /* The above check is made mod 2^32, for files larger than 512 MB\n * and uLong implemented on 32 bits.\n */\n init_block(s);\n\n if (last) {\n bi_windup(s);\n }\n // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n // s->compressed_len-7*last));\n}\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nfunction _tr_tally(s, dist, lc)\n// deflate_state *s;\n// unsigned dist; /* distance of matched string */\n// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n //var out_length, in_length, dcode;\n\n s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff;\n s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;\n\n s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;\n s.last_lit++;\n\n if (dist === 0) {\n /* lc is the unmatched char */\n s.dyn_ltree[lc*2]/*.Freq*/++;\n } else {\n s.matches++;\n /* Here, lc is the match length - MIN_MATCH */\n dist--; /* dist = match distance - 1 */\n //Assert((ush)dist < (ush)MAX_DIST(s) &&\n // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n // (ush)d_code(dist) < (ush)D_CODES, \"_tr_tally: bad match\");\n\n s.dyn_ltree[(_length_code[lc]+LITERALS+1) * 2]/*.Freq*/++;\n s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n }\n\n// (!) This block is disabled in zlib defailts,\n// don't enable it for binary compatibility\n\n//#ifdef TRUNCATE_BLOCK\n// /* Try to guess if it is profitable to stop the current block here */\n// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {\n// /* Compute an upper bound for the compressed length */\n// out_length = s.last_lit*8;\n// in_length = s.strstart - s.block_start;\n//\n// for (dcode = 0; dcode < D_CODES; dcode++) {\n// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);\n// }\n// out_length >>>= 3;\n// //Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n// // s->last_lit, in_length, out_length,\n// // 100L - out_length*100L/in_length));\n// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {\n// return true;\n// }\n// }\n//#endif\n\n return (s.last_lit === s.lit_bufsize-1);\n /* We avoid equality with lit_bufsize because of wraparound at 64K\n * on 16 bit machines and because stored blocks are restricted to\n * 64K-1 bytes.\n */\n}\n\nexports._tr_init = _tr_init;\nexports._tr_stored_block = _tr_stored_block;\nexports._tr_flush_block = _tr_flush_block;\nexports._tr_tally = _tr_tally;\nexports._tr_align = _tr_align;\n},{\"../utils/common\":27}],39:[function(_dereq_,module,exports){\n'use strict';\n\n\nfunction ZStream() {\n /* next input byte */\n this.input = null; // JS specific, because we have no pointers\n this.next_in = 0;\n /* number of bytes available at input */\n this.avail_in = 0;\n /* total number of input bytes read so far */\n this.total_in = 0;\n /* next output byte should be put there */\n this.output = null; // JS specific, because we have no pointers\n this.next_out = 0;\n /* remaining free space at output */\n this.avail_out = 0;\n /* total number of bytes output so far */\n this.total_out = 0;\n /* last error message, NULL if no error */\n this.msg = ''/*Z_NULL*/;\n /* not visible by applications */\n this.state = null;\n /* best guess about the data type: binary or text */\n this.data_type = 2/*Z_UNKNOWN*/;\n /* adler32 value of the uncompressed data */\n this.adler = 0;\n}\n\nmodule.exports = ZStream;\n},{}]},{},[9])\n(9)\n}));\n","/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*exported XLSX */\n/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */\nvar XLSX = {};\nfunction make_xlsx_lib(XLSX){\nXLSX.version = '0.17.5';\nvar current_codepage = 1200, current_ansi = 1252;\n/*global cptable:true, window */\nif(typeof module !== \"undefined\" && typeof require !== 'undefined') {\n\tif(typeof cptable === 'undefined') {\n\t\tif(typeof global !== 'undefined') global.cptable = require('./dist/cpexcel.js');\n\t\telse if(typeof window !== 'undefined') window.cptable = require('./dist/cpexcel.js');\n\t}\n}\n\nvar VALID_ANSI = [ 874, 932, 936, 949, 950 ];\nfor(var i = 0; i <= 8; ++i) VALID_ANSI.push(1250 + i);\n/* ECMA-376 Part I 18.4.1 charset to codepage mapping */\nvar CS2CP = ({\n0: 1252, /* ANSI */\n1: 65001, /* DEFAULT */\n2: 65001, /* SYMBOL */\n77: 10000, /* MAC */\n128: 932, /* SHIFTJIS */\n129: 949, /* HANGUL */\n130: 1361, /* JOHAB */\n134: 936, /* GB2312 */\n136: 950, /* CHINESEBIG5 */\n161: 1253, /* GREEK */\n162: 1254, /* TURKISH */\n163: 1258, /* VIETNAMESE */\n177: 1255, /* HEBREW */\n178: 1256, /* ARABIC */\n186: 1257, /* BALTIC */\n204: 1251, /* RUSSIAN */\n222: 874, /* THAI */\n238: 1250, /* EASTEUROPE */\n255: 1252, /* OEM */\n69: 6969 /* MISC */\n});\n\nvar set_ansi = function(cp) { if(VALID_ANSI.indexOf(cp) == -1) return; current_ansi = CS2CP[0] = cp; };\nfunction reset_ansi() { set_ansi(1252); }\n\nvar set_cp = function(cp) { current_codepage = cp; set_ansi(cp); };\nfunction reset_cp() { set_cp(1200); reset_ansi(); }\n\nfunction char_codes(data) { var o = []; for(var i = 0, len = data.length; i < len; ++i) o[i] = data.charCodeAt(i); return o; }\n\nfunction utf16leread(data) {\n\tvar o = [];\n\tfor(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data.charCodeAt(2*i) + (data.charCodeAt(2*i+1)<<8));\n\treturn o.join(\"\");\n}\nfunction utf16beread(data) {\n\tvar o = [];\n\tfor(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data.charCodeAt(2*i+1) + (data.charCodeAt(2*i)<<8));\n\treturn o.join(\"\");\n}\n\nvar debom = function(data) {\n\tvar c1 = data.charCodeAt(0), c2 = data.charCodeAt(1);\n\tif(c1 == 0xFF && c2 == 0xFE) return utf16leread(data.slice(2));\n\tif(c1 == 0xFE && c2 == 0xFF) return utf16beread(data.slice(2));\n\tif(c1 == 0xFEFF) return data.slice(1);\n\treturn data;\n};\n\nvar _getchar = function _gc1(x) { return String.fromCharCode(x); };\nvar _getansi = function _ga1(x) { return String.fromCharCode(x); };\nif(typeof cptable !== 'undefined') {\n\tset_cp = function(cp) { current_codepage = cp; set_ansi(cp); };\n\tdebom = function(data) {\n\t\tif(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return cptable.utils.decode(1200, char_codes(data.slice(2))); }\n\t\treturn data;\n\t};\n\t_getchar = function _gc2(x) {\n\t\tif(current_codepage === 1200) return String.fromCharCode(x);\n\t\treturn cptable.utils.decode(current_codepage, [x&255,x>>8])[0];\n\t};\n\t_getansi = function _ga2(x) {\n\t\treturn cptable.utils.decode(current_ansi, [x])[0];\n\t};\n}\nvar DENSE = null;\nvar DIF_XL = true;\nvar Base64 = (function make_b64(){\n\tvar map = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\treturn {\n\t\tencode: function(input) {\n\t\t\tvar o = \"\";\n\t\t\tvar c1=0, c2=0, c3=0, e1=0, e2=0, e3=0, e4=0;\n\t\t\tfor(var i = 0; i < input.length; ) {\n\t\t\t\tc1 = input.charCodeAt(i++);\n\t\t\t\te1 = (c1 >> 2);\n\n\t\t\t\tc2 = input.charCodeAt(i++);\n\t\t\t\te2 = ((c1 & 3) << 4) | (c2 >> 4);\n\n\t\t\t\tc3 = input.charCodeAt(i++);\n\t\t\t\te3 = ((c2 & 15) << 2) | (c3 >> 6);\n\t\t\t\te4 = (c3 & 63);\n\t\t\t\tif (isNaN(c2)) { e3 = e4 = 64; }\n\t\t\t\telse if (isNaN(c3)) { e4 = 64; }\n\t\t\t\to += map.charAt(e1) + map.charAt(e2) + map.charAt(e3) + map.charAt(e4);\n\t\t\t}\n\t\t\treturn o;\n\t\t},\n\t\tdecode: function b64_decode(input) {\n\t\t\tvar o = \"\";\n\t\t\tvar c1=0, c2=0, c3=0, e1=0, e2=0, e3=0, e4=0;\n\t\t\tinput = input.replace(/[^\\w\\+\\/\\=]/g, \"\");\n\t\t\tfor(var i = 0; i < input.length;) {\n\t\t\t\te1 = map.indexOf(input.charAt(i++));\n\t\t\t\te2 = map.indexOf(input.charAt(i++));\n\t\t\t\tc1 = (e1 << 2) | (e2 >> 4);\n\t\t\t\to += String.fromCharCode(c1);\n\n\t\t\t\te3 = map.indexOf(input.charAt(i++));\n\t\t\t\tc2 = ((e2 & 15) << 4) | (e3 >> 2);\n\t\t\t\tif (e3 !== 64) { o += String.fromCharCode(c2); }\n\n\t\t\t\te4 = map.indexOf(input.charAt(i++));\n\t\t\t\tc3 = ((e3 & 3) << 6) | e4;\n\t\t\t\tif (e4 !== 64) { o += String.fromCharCode(c3); }\n\t\t\t}\n\t\t\treturn o;\n\t\t}\n\t};\n})();\nvar has_buf = (typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && !!process.versions.node);\n\nvar Buffer_from = function(){};\n\nif(typeof Buffer !== 'undefined') {\n\tvar nbfs = !Buffer.from;\n\tif(!nbfs) try { Buffer.from(\"foo\", \"utf8\"); } catch(e) { nbfs = true; }\n\tBuffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);\n\t// $FlowIgnore\n\tif(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };\n\t// $FlowIgnore\n\tif(!Buffer.allocUnsafe) Buffer.allocUnsafe = function(n) { return new Buffer(n); };\n}\n\nfunction new_raw_buf(len) {\n\t/* jshint -W056 */\n\treturn has_buf ? Buffer.alloc(len) : new Array(len);\n\t/* jshint +W056 */\n}\n\nfunction new_unsafe_buf(len) {\n\t/* jshint -W056 */\n\treturn has_buf ? Buffer.allocUnsafe(len) : new Array(len);\n\t/* jshint +W056 */\n}\n\nvar s2a = function s2a(s) {\n\tif(has_buf) return Buffer_from(s, \"binary\");\n\treturn s.split(\"\").map(function(x){ return x.charCodeAt(0) & 0xff; });\n};\n\nfunction s2ab(s) {\n\tif(typeof ArrayBuffer === 'undefined') return s2a(s);\n\tvar buf = new ArrayBuffer(s.length), view = new Uint8Array(buf);\n\tfor (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;\n\treturn buf;\n}\n\nfunction a2s(data) {\n\tif(Array.isArray(data)) return data.map(function(c) { return String.fromCharCode(c); }).join(\"\");\n\tvar o = []; for(var i = 0; i < data.length; ++i) o[i] = String.fromCharCode(data[i]); return o.join(\"\");\n}\n\nfunction a2u(data) {\n\tif(typeof Uint8Array === 'undefined') throw new Error(\"Unsupported\");\n\treturn new Uint8Array(data);\n}\n\nfunction ab2a(data) {\n\tif(typeof ArrayBuffer == 'undefined') throw new Error(\"Unsupported\");\n\tif(data instanceof ArrayBuffer) return ab2a(new Uint8Array(data));\nvar o = new Array(data.length);\n\tfor(var i = 0; i < data.length; ++i) o[i] = data[i];\n\treturn o;\n}\n\nvar bconcat = function(bufs) { return [].concat.apply([], bufs); };\n\nvar chr0 = /\\u0000/g, chr1 = /[\\u0001-\\u0006]/g;\n/* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/*jshint -W041 */\nvar SSF = ({});\nvar make_ssf = function make_ssf(SSF){\nSSF.version = '0.11.2';\nfunction _strrev(x) { var o = \"\", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; }\nfunction fill(c,l) { var o = \"\"; while(o.length < l) o+=c; return o; }\nfunction pad0(v,d){var t=\"\"+v; return t.length>=d?t:fill('0',d-t.length)+t;}\nfunction pad_(v,d){var t=\"\"+v;return t.length>=d?t:fill(' ',d-t.length)+t;}\nfunction rpad_(v,d){var t=\"\"+v; return t.length>=d?t:t+fill(' ',d-t.length);}\nfunction pad0r1(v,d){var t=\"\"+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;}\nfunction pad0r2(v,d){var t=\"\"+v; return t.length>=d?t:fill('0',d-t.length)+t;}\nvar p2_32 = Math.pow(2,32);\nfunction pad0r(v,d){if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); }\nfunction isgeneral(s, i) { i = i || 0; return s.length >= 7 + i && (s.charCodeAt(i)|32) === 103 && (s.charCodeAt(i+1)|32) === 101 && (s.charCodeAt(i+2)|32) === 110 && (s.charCodeAt(i+3)|32) === 101 && (s.charCodeAt(i+4)|32) === 114 && (s.charCodeAt(i+5)|32) === 97 && (s.charCodeAt(i+6)|32) === 108; }\nvar days = [\n\t['Sun', 'Sunday'],\n\t['Mon', 'Monday'],\n\t['Tue', 'Tuesday'],\n\t['Wed', 'Wednesday'],\n\t['Thu', 'Thursday'],\n\t['Fri', 'Friday'],\n\t['Sat', 'Saturday']\n];\nvar months = [\n\t['J', 'Jan', 'January'],\n\t['F', 'Feb', 'February'],\n\t['M', 'Mar', 'March'],\n\t['A', 'Apr', 'April'],\n\t['M', 'May', 'May'],\n\t['J', 'Jun', 'June'],\n\t['J', 'Jul', 'July'],\n\t['A', 'Aug', 'August'],\n\t['S', 'Sep', 'September'],\n\t['O', 'Oct', 'October'],\n\t['N', 'Nov', 'November'],\n\t['D', 'Dec', 'December']\n];\nfunction init_table(t) {\n\tt[0]= 'General';\n\tt[1]= '0';\n\tt[2]= '0.00';\n\tt[3]= '#,##0';\n\tt[4]= '#,##0.00';\n\tt[9]= '0%';\n\tt[10]= '0.00%';\n\tt[11]= '0.00E+00';\n\tt[12]= '# ?/?';\n\tt[13]= '# ??/??';\n\tt[14]= 'm/d/yy';\n\tt[15]= 'd-mmm-yy';\n\tt[16]= 'd-mmm';\n\tt[17]= 'mmm-yy';\n\tt[18]= 'h:mm AM/PM';\n\tt[19]= 'h:mm:ss AM/PM';\n\tt[20]= 'h:mm';\n\tt[21]= 'h:mm:ss';\n\tt[22]= 'm/d/yy h:mm';\n\tt[37]= '#,##0 ;(#,##0)';\n\tt[38]= '#,##0 ;[Red](#,##0)';\n\tt[39]= '#,##0.00;(#,##0.00)';\n\tt[40]= '#,##0.00;[Red](#,##0.00)';\n\tt[45]= 'mm:ss';\n\tt[46]= '[h]:mm:ss';\n\tt[47]= 'mmss.0';\n\tt[48]= '##0.0E+0';\n\tt[49]= '@';\n\tt[56]= '\"上午/下午 \"hh\"時\"mm\"分\"ss\"秒 \"';\n}\n\nvar table_fmt = {};\ninit_table(table_fmt);\n/* Defaults determined by systematically testing in Excel 2019 */\n\n/* These formats appear to default to other formats in the table */\nvar default_map = [];\nvar defi = 0;\n\n// 5 -> 37 ... 8 -> 40\nfor(defi = 5; defi <= 8; ++defi) default_map[defi] = 32 + defi;\n\n// 23 -> 0 ... 26 -> 0\nfor(defi = 23; defi <= 26; ++defi) default_map[defi] = 0;\n\n// 27 -> 14 ... 31 -> 14\nfor(defi = 27; defi <= 31; ++defi) default_map[defi] = 14;\n// 50 -> 14 ... 58 -> 14\nfor(defi = 50; defi <= 58; ++defi) default_map[defi] = 14;\n\n// 59 -> 1 ... 62 -> 4\nfor(defi = 59; defi <= 62; ++defi) default_map[defi] = defi - 58;\n// 67 -> 9 ... 68 -> 10\nfor(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 58;\n// 72 -> 14 ... 75 -> 17\nfor(defi = 72; defi <= 75; ++defi) default_map[defi] = defi - 58;\n\n// 69 -> 12 ... 71 -> 14\nfor(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 57;\n\n// 76 -> 20 ... 78 -> 22\nfor(defi = 76; defi <= 78; ++defi) default_map[defi] = defi - 56;\n\n// 79 -> 45 ... 81 -> 47\nfor(defi = 79; defi <= 81; ++defi) default_map[defi] = defi - 34;\n\n// 82 -> 0 ... 65536 -> 0 (omitted)\n\n/* These formats technically refer to Accounting formats with no equivalent */\nvar default_str = [];\n\n// 5 -- Currency, 0 decimal, black negative\ndefault_str[5] = default_str[63] = '\"$\"#,##0_);\\\\(\"$\"#,##0\\\\)';\n// 6 -- Currency, 0 decimal, red negative\ndefault_str[6] = default_str[64] = '\"$\"#,##0_);[Red]\\\\(\"$\"#,##0\\\\)';\n// 7 -- Currency, 2 decimal, black negative\ndefault_str[7] = default_str[65] = '\"$\"#,##0.00_);\\\\(\"$\"#,##0.00\\\\)';\n// 8 -- Currency, 2 decimal, red negative\ndefault_str[8] = default_str[66] = '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)';\n\n// 41 -- Accounting, 0 decimal, No Symbol\ndefault_str[41] = '_(* #,##0_);_(* \\\\(#,##0\\\\);_(* \"-\"_);_(@_)';\n// 42 -- Accounting, 0 decimal, $ Symbol\ndefault_str[42] = '_(\"$\"* #,##0_);_(\"$\"* \\\\(#,##0\\\\);_(\"$\"* \"-\"_);_(@_)';\n// 43 -- Accounting, 2 decimal, No Symbol\ndefault_str[43] = '_(* #,##0.00_);_(* \\\\(#,##0.00\\\\);_(* \"-\"??_);_(@_)';\n// 44 -- Accounting, 2 decimal, $ Symbol\ndefault_str[44] = '_(\"$\"* #,##0.00_);_(\"$\"* \\\\(#,##0.00\\\\);_(\"$\"* \"-\"??_);_(@_)';\nfunction frac(x, D, mixed) {\n\tvar sgn = x < 0 ? -1 : 1;\n\tvar B = x * sgn;\n\tvar P_2 = 0, P_1 = 1, P = 0;\n\tvar Q_2 = 1, Q_1 = 0, Q = 0;\n\tvar A = Math.floor(B);\n\twhile(Q_1 < D) {\n\t\tA = Math.floor(B);\n\t\tP = A * P_1 + P_2;\n\t\tQ = A * Q_1 + Q_2;\n\t\tif((B - A) < 0.00000005) break;\n\t\tB = 1 / (B - A);\n\t\tP_2 = P_1; P_1 = P;\n\t\tQ_2 = Q_1; Q_1 = Q;\n\t}\n\tif(Q > D) { if(Q_1 > D) { Q = Q_2; P = P_2; } else { Q = Q_1; P = P_1; } }\n\tif(!mixed) return [0, sgn * P, Q];\n\tvar q = Math.floor(sgn * P/Q);\n\treturn [q, sgn*P - q*Q, Q];\n}\nfunction parse_date_code(v,opts,b2) {\n\tif(v > 2958465 || v < 0) return null;\n\tvar date = (v|0), time = Math.floor(86400 * (v - date)), dow=0;\n\tvar dout=[];\n\tvar out={D:date, T:time, u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0};\n\tif(Math.abs(out.u) < 1e-6) out.u = 0;\n\tif(opts && opts.date1904) date += 1462;\n\tif(out.u > 0.9999) {\n\t\tout.u = 0;\n\t\tif(++time == 86400) { out.T = time = 0; ++date; ++out.D; }\n\t}\n\tif(date === 60) {dout = b2 ? [1317,10,29] : [1900,2,29]; dow=3;}\n\telse if(date === 0) {dout = b2 ? [1317,8,29] : [1900,1,0]; dow=6;}\n\telse {\n\t\tif(date > 60) --date;\n\t\t/* 1 = Jan 1 1900 in Gregorian */\n\t\tvar d = new Date(1900, 0, 1);\n\t\td.setDate(d.getDate() + date - 1);\n\t\tdout = [d.getFullYear(), d.getMonth()+1,d.getDate()];\n\t\tdow = d.getDay();\n\t\tif(date < 60) dow = (dow + 6) % 7;\n\t\tif(b2) dow = fix_hijri(d, dout);\n\t}\n\tout.y = dout[0]; out.m = dout[1]; out.d = dout[2];\n\tout.S = time % 60; time = Math.floor(time / 60);\n\tout.M = time % 60; time = Math.floor(time / 60);\n\tout.H = time;\n\tout.q = dow;\n\treturn out;\n}\nSSF.parse_date_code = parse_date_code;\nvar basedate = new Date(1899, 11, 31, 0, 0, 0);\nvar dnthresh = basedate.getTime();\nvar base1904 = new Date(1900, 2, 1, 0, 0, 0);\nfunction datenum_local(v, date1904) {\n\tvar epoch = v.getTime();\n\tif(date1904) epoch -= 1461*24*60*60*1000;\n\telse if(v >= base1904) epoch += 24*60*60*1000;\n\treturn (epoch - (dnthresh + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000);\n}\n/* The longest 32-bit integer text is \"-4294967296\", exactly 11 chars */\nfunction general_fmt_int(v) { return v.toString(10); }\nSSF._general_int = general_fmt_int;\n\n/* ECMA-376 18.8.30 numFmt*/\n/* Note: `toPrecision` uses standard form when prec > E and E >= -6 */\nvar general_fmt_num = (function make_general_fmt_num() {\n\tvar trailing_zeroes_and_decimal = /(?:\\.0*|(\\.\\d*[1-9])0+)$/;\n\tfunction strip_decimal(o) {\n\t\treturn (o.indexOf(\".\") == -1) ? o : o.replace(trailing_zeroes_and_decimal, \"$1\");\n\t}\n\n\t/* General Exponential always shows 2 digits exp and trims the mantissa */\n\tvar mantissa_zeroes_and_decimal = /(?:\\.0*|(\\.\\d*[1-9])0+)[Ee]/;\n\tvar exp_with_single_digit = /(E[+-])(\\d)$/;\n\tfunction normalize_exp(o) {\n\t\tif(o.indexOf(\"E\") == -1) return o;\n\t\treturn o.replace(mantissa_zeroes_and_decimal,\"$1E\").replace(exp_with_single_digit,\"$10$2\");\n\t}\n\n\t/* exponent >= -9 and <= 9 */\n\tfunction small_exp(v) {\n\t\tvar w = (v<0?12:11);\n\t\tvar o = strip_decimal(v.toFixed(12)); if(o.length <= w) return o;\n\t\to = v.toPrecision(10); if(o.length <= w) return o;\n\t\treturn v.toExponential(5);\n\t}\n\n\t/* exponent >= 11 or <= -10 likely exponential */\n\tfunction large_exp(v) {\n\t\tvar o = strip_decimal(v.toFixed(11));\n\t\treturn (o.length > (v<0?12:11) || o === \"0\" || o === \"-0\") ? v.toPrecision(6) : o;\n\t}\n\n\tfunction general_fmt_num_base(v) {\n\t\tvar V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o;\n\n\t\tif(V >= -4 && V <= -1) o = v.toPrecision(10+V);\n\t\telse if(Math.abs(V) <= 9) o = small_exp(v);\n\t\telse if(V === 10) o = v.toFixed(10).substr(0,12);\n\t\telse o = large_exp(v);\n\n\t\treturn strip_decimal(normalize_exp(o.toUpperCase()));\n\t}\n\n\treturn general_fmt_num_base;\n})();\nSSF._general_num = general_fmt_num;\n\n/*\n\t\"General\" rules:\n\t- text is passed through (\"@\")\n\t- booleans are rendered as TRUE/FALSE\n\t- \"up to 11 characters\" displayed for numbers\n\t- Default date format (code 14) used for Dates\n\n\tTODO: technically the display depends on the width of the cell\n*/\nfunction general_fmt(v, opts) {\n\tswitch(typeof v) {\n\t\tcase 'string': return v;\n\t\tcase 'boolean': return v ? \"TRUE\" : \"FALSE\";\n\t\tcase 'number': return (v|0) === v ? v.toString(10) : general_fmt_num(v);\n\t\tcase 'undefined': return \"\";\n\t\tcase 'object':\n\t\t\tif(v == null) return \"\";\n\t\t\tif(v instanceof Date) return format(14, datenum_local(v, opts && opts.date1904), opts);\n\t}\n\tthrow new Error(\"unsupported value in General format: \" + v);\n}\nSSF._general = general_fmt;\nfunction fix_hijri(date, o) {\n /* TODO: properly adjust y/m/d and */\n o[0] -= 581;\n var dow = date.getDay();\n if(date < 60) dow = (dow + 6) % 7;\n return dow;\n}\n//var THAI_DIGITS = \"\\u0E50\\u0E51\\u0E52\\u0E53\\u0E54\\u0E55\\u0E56\\u0E57\\u0E58\\u0E59\".split(\"\");\n/*jshint -W086 */\nfunction write_date(type, fmt, val, ss0) {\n\tvar o=\"\", ss=0, tt=0, y = val.y, out, outl = 0;\n\tswitch(type) {\n\t\tcase 98: /* 'b' buddhist year */\n\t\t\ty = val.y + 543;\n\t\t\t/* falls through */\n\t\tcase 121: /* 'y' year */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = y % 100; outl = 2; break;\n\t\t\tdefault: out = y % 10000; outl = 4; break;\n\t\t} break;\n\t\tcase 109: /* 'm' month */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.m; outl = fmt.length; break;\n\t\t\tcase 3: return months[val.m-1][1];\n\t\t\tcase 5: return months[val.m-1][0];\n\t\t\tdefault: return months[val.m-1][2];\n\t\t} break;\n\t\tcase 100: /* 'd' day */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.d; outl = fmt.length; break;\n\t\t\tcase 3: return days[val.q][0];\n\t\t\tdefault: return days[val.q][1];\n\t\t} break;\n\t\tcase 104: /* 'h' 12-hour */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break;\n\t\t\tdefault: throw 'bad hour format: ' + fmt;\n\t\t} break;\n\t\tcase 72: /* 'H' 24-hour */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.H; outl = fmt.length; break;\n\t\t\tdefault: throw 'bad hour format: ' + fmt;\n\t\t} break;\n\t\tcase 77: /* 'M' minutes */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.M; outl = fmt.length; break;\n\t\t\tdefault: throw 'bad minute format: ' + fmt;\n\t\t} break;\n\t\tcase 115: /* 's' seconds */\n\t\t\tif(fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000') throw 'bad second format: ' + fmt;\n\t\t\tif(val.u === 0 && (fmt == \"s\" || fmt == \"ss\")) return pad0(val.S, fmt.length);\nif(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100;\n\t\t\telse tt = ss0 === 1 ? 10 : 1;\n\t\t\tss = Math.round((tt)*(val.S + val.u));\n\t\t\tif(ss >= 60*tt) ss = 0;\n\t\t\tif(fmt === 's') return ss === 0 ? \"0\" : \"\"+ss/tt;\n\t\t\to = pad0(ss,2 + ss0);\n\t\t\tif(fmt === 'ss') return o.substr(0,2);\n\t\t\treturn \".\" + o.substr(2,fmt.length-1);\n\t\tcase 90: /* 'Z' absolute time */\n\t\tswitch(fmt) {\n\t\t\tcase '[h]': case '[hh]': out = val.D*24+val.H; break;\n\t\t\tcase '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break;\n\t\t\tcase '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u); break;\n\t\t\tdefault: throw 'bad abstime format: ' + fmt;\n\t\t} outl = fmt.length === 3 ? 1 : 2; break;\n\t\tcase 101: /* 'e' era */\n\t\t\tout = y; outl = 1; break;\n\t}\n\tvar outstr = outl > 0 ? pad0(out, outl) : \"\";\n\treturn outstr;\n}\n/*jshint +W086 */\nfunction commaify(s) {\n\tvar w = 3;\n\tif(s.length <= w) return s;\n\tvar j = (s.length % w), o = s.substr(0,j);\n\tfor(; j!=s.length; j+=w) o+=(o.length > 0 ? \",\" : \"\") + s.substr(j,w);\n\treturn o;\n}\nvar write_num = (function make_write_num(){\nvar pct1 = /%/g;\nfunction write_num_pct(type, fmt, val){\n\tvar sfmt = fmt.replace(pct1,\"\"), mul = fmt.length - sfmt.length;\n\treturn write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill(\"%\",mul);\n}\nfunction write_num_cm(type, fmt, val){\n\tvar idx = fmt.length - 1;\n\twhile(fmt.charCodeAt(idx-1) === 44) --idx;\n\treturn write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));\n}\nfunction write_num_exp(fmt, val){\n\tvar o;\n\tvar idx = fmt.indexOf(\"E\") - fmt.indexOf(\".\") - 1;\n\tif(fmt.match(/^#+0.0E\\+0$/)) {\n\t\tif(val == 0) return \"0.0E+0\";\n\t\telse if(val < 0) return \"-\" + write_num_exp(fmt, -val);\n\t\tvar period = fmt.indexOf(\".\"); if(period === -1) period=fmt.indexOf('E');\n\t\tvar ee = Math.floor(Math.log(val)*Math.LOG10E)%period;\n\t\tif(ee < 0) ee += period;\n\t\to = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);\n\t\tif(o.indexOf(\"e\") === -1) {\n\t\t\tvar fakee = Math.floor(Math.log(val)*Math.LOG10E);\n\t\t\tif(o.indexOf(\".\") === -1) o = o.charAt(0) + \".\" + o.substr(1) + \"E+\" + (fakee - o.length+ee);\n\t\t\telse o += \"E+\" + (fakee - ee);\n\t\t\twhile(o.substr(0,2) === \"0.\") {\n\t\t\t\to = o.charAt(0) + o.substr(2,period) + \".\" + o.substr(2+period);\n\t\t\t\to = o.replace(/^0+([1-9])/,\"$1\").replace(/^0+\\./,\"0.\");\n\t\t\t}\n\t\t\to = o.replace(/\\+-/,\"-\");\n\t\t}\n\t\to = o.replace(/^([+-]?)(\\d*)\\.(\\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + \".\" + $3.substr(ee) + \"E\"; });\n\t} else o = val.toExponential(idx);\n\tif(fmt.match(/E\\+00$/) && o.match(/e[+-]\\d$/)) o = o.substr(0,o.length-1) + \"0\" + o.charAt(o.length-1);\n\tif(fmt.match(/E\\-/) && o.match(/e\\+/)) o = o.replace(/e\\+/,\"e\");\n\treturn o.replace(\"e\",\"E\");\n}\nvar frac1 = /# (\\?+)( ?)\\/( ?)(\\d+)/;\nfunction write_num_f1(r, aval, sign) {\n\tvar den = parseInt(r[4],10), rr = Math.round(aval * den), base = Math.floor(rr/den);\n\tvar myn = (rr - base*den), myd = den;\n\treturn sign + (base === 0 ? \"\" : \"\"+base) + \" \" + (myn === 0 ? fill(\" \", r[1].length + 1 + r[4].length) : pad_(myn,r[1].length) + r[2] + \"/\" + r[3] + pad0(myd,r[4].length));\n}\nfunction write_num_f2(r, aval, sign) {\n\treturn sign + (aval === 0 ? \"\" : \"\"+aval) + fill(\" \", r[1].length + 2 + r[4].length);\n}\nvar dec1 = /^#*0*\\.([0#]+)/;\nvar closeparen = /\\).*[0#]/;\nvar phone = /\\(###\\) ###\\\\?-####/;\nfunction hashq(str) {\n\tvar o = \"\", cc;\n\tfor(var i = 0; i != str.length; ++i) switch((cc=str.charCodeAt(i))) {\n\t\tcase 35: break;\n\t\tcase 63: o+= \" \"; break;\n\t\tcase 48: o+= \"0\"; break;\n\t\tdefault: o+= String.fromCharCode(cc);\n\t}\n\treturn o;\n}\nfunction rnd(val, d) { var dd = Math.pow(10,d); return \"\"+(Math.round(val * dd)/dd); }\nfunction dec(val, d) {\n\tvar _frac = val - Math.floor(val), dd = Math.pow(10,d);\n\tif (d < ('' + Math.round(_frac * dd)).length) return 0;\n\treturn Math.round(_frac * dd);\n}\nfunction carry(val, d) {\n\tif (d < ('' + Math.round((val-Math.floor(val))*Math.pow(10,d))).length) {\n\t\treturn 1;\n\t}\n\treturn 0;\n}\nfunction flr(val) {\n\tif(val < 2147483647 && val > -2147483648) return \"\"+(val >= 0 ? (val|0) : (val-1|0));\n\treturn \"\"+Math.floor(val);\n}\nfunction write_num_flt(type, fmt, val) {\n\tif(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {\n\t\tvar ffmt = fmt.replace(/\\( */,\"\").replace(/ \\)/,\"\").replace(/\\)/,\"\");\n\t\tif(val >= 0) return write_num_flt('n', ffmt, val);\n\t\treturn '(' + write_num_flt('n', ffmt, -val) + ')';\n\t}\n\tif(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val);\n\tif(fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val);\n\tif(fmt.indexOf('E') !== -1) return write_num_exp(fmt, val);\n\tif(fmt.charCodeAt(0) === 36) return \"$\"+write_num_flt(type,fmt.substr(fmt.charAt(1)==' '?2:1),val);\n\tvar o;\n\tvar r, ri, ff, aval = Math.abs(val), sign = val < 0 ? \"-\" : \"\";\n\tif(fmt.match(/^00+$/)) return sign + pad0r(aval,fmt.length);\n\tif(fmt.match(/^[#?]+$/)) {\n\t\to = pad0r(val,0); if(o === \"0\") o = \"\";\n\t\treturn o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;\n\t}\n\tif((r = fmt.match(frac1))) return write_num_f1(r, aval, sign);\n\tif(fmt.match(/^#+0+$/)) return sign + pad0r(aval,fmt.length - fmt.indexOf(\"0\"));\n\tif((r = fmt.match(dec1))) {\n\t\to = rnd(val, r[1].length).replace(/^([^\\.]+)$/,\"$1.\"+hashq(r[1])).replace(/\\.$/,\".\"+hashq(r[1])).replace(/\\.(\\d*)$/,function($$, $1) { return \".\" + $1 + fill(\"0\", hashq(r[1]).length-$1.length); });\n\t\treturn fmt.indexOf(\"0.\") !== -1 ? o : o.replace(/^0\\./,\".\");\n\t}\n\tfmt = fmt.replace(/^#+([0.])/, \"$1\");\n\tif((r = fmt.match(/^(0*)\\.(#*)$/))) {\n\t\treturn sign + rnd(aval, r[2].length).replace(/\\.(\\d*[1-9])0*$/,\".$1\").replace(/^(-?\\d*)$/,\"$1.\").replace(/^0\\./,r[1].length?\"0.\":\".\");\n\t}\n\tif((r = fmt.match(/^#{1,3},##0(\\.?)$/))) return sign + commaify(pad0r(aval,0));\n\tif((r = fmt.match(/^#,##0\\.([#0]*0)$/))) {\n\t\treturn val < 0 ? \"-\" + write_num_flt(type, fmt, -val) : commaify(\"\"+(Math.floor(val) + carry(val, r[1].length))) + \".\" + pad0(dec(val, r[1].length),r[1].length);\n\t}\n\tif((r = fmt.match(/^#,#*,#0/))) return write_num_flt(type,fmt.replace(/^#,#*,/,\"\"),val);\n\tif((r = fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/))) {\n\t\to = _strrev(write_num_flt(type, fmt.replace(/[\\\\-]/g,\"\"), val));\n\t\tri = 0;\n\t\treturn _strrev(_strrev(fmt.replace(/\\\\/g,\"\")).replace(/[0#]/g,function(x){return ri= 0) return write_num_int('n', ffmt, val);\n\t\treturn '(' + write_num_int('n', ffmt, -val) + ')';\n\t}\n\tif(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val);\n\tif(fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val);\n\tif(fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val);\n\tif(fmt.charCodeAt(0) === 36) return \"$\"+write_num_int(type,fmt.substr(fmt.charAt(1)==' '?2:1),val);\n\tvar o;\n\tvar r, ri, ff, aval = Math.abs(val), sign = val < 0 ? \"-\" : \"\";\n\tif(fmt.match(/^00+$/)) return sign + pad0(aval,fmt.length);\n\tif(fmt.match(/^[#?]+$/)) {\n\t\to = (\"\"+val); if(val === 0) o = \"\";\n\t\treturn o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;\n\t}\n\tif((r = fmt.match(frac1))) return write_num_f2(r, aval, sign);\n\tif(fmt.match(/^#+0+$/)) return sign + pad0(aval,fmt.length - fmt.indexOf(\"0\"));\n\tif((r = fmt.match(dec1))) {\no = (\"\"+val).replace(/^([^\\.]+)$/,\"$1.\"+hashq(r[1])).replace(/\\.$/,\".\"+hashq(r[1]));\n\t\to = o.replace(/\\.(\\d*)$/,function($$, $1) {\nreturn \".\" + $1 + fill(\"0\", hashq(r[1]).length-$1.length); });\n\t\treturn fmt.indexOf(\"0.\") !== -1 ? o : o.replace(/^0\\./,\".\");\n\t}\n\tfmt = fmt.replace(/^#+([0.])/, \"$1\");\n\tif((r = fmt.match(/^(0*)\\.(#*)$/))) {\n\t\treturn sign + (\"\"+aval).replace(/\\.(\\d*[1-9])0*$/,\".$1\").replace(/^(-?\\d*)$/,\"$1.\").replace(/^0\\./,r[1].length?\"0.\":\".\");\n\t}\n\tif((r = fmt.match(/^#{1,3},##0(\\.?)$/))) return sign + commaify((\"\"+aval));\n\tif((r = fmt.match(/^#,##0\\.([#0]*0)$/))) {\n\t\treturn val < 0 ? \"-\" + write_num_int(type, fmt, -val) : commaify((\"\"+val)) + \".\" + fill('0',r[1].length);\n\t}\n\tif((r = fmt.match(/^#,#*,#0/))) return write_num_int(type,fmt.replace(/^#,#*,/,\"\"),val);\n\tif((r = fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/))) {\n\t\to = _strrev(write_num_int(type, fmt.replace(/[\\\\-]/g,\"\"), val));\n\t\tri = 0;\n\t\treturn _strrev(_strrev(fmt.replace(/\\\\/g,\"\")).replace(/[0#]/g,function(x){return ri -1 || (c=='\\\\' && fmt.charAt(i+1) == \"-\" && \"0#\".indexOf(fmt.charAt(i+2))>-1))){/* empty */}\n\t\t\t\tbreak;\n\t\t\tcase '?': while(fmt.charAt(++i) === c){/* empty */} break;\n\t\t\tcase '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break;\n\t\t\tcase '(': case ')': ++i; break;\n\t\t\tcase '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':\n\t\t\t\twhile(i < fmt.length && \"0123456789\".indexOf(fmt.charAt(++i)) > -1){/* empty */} break;\n\t\t\tcase ' ': ++i; break;\n\t\t\tdefault: ++i; break;\n\t\t}\n\t}\n\treturn false;\n}\nSSF.is_date = fmt_is_date;\nfunction eval_fmt(fmt, v, opts, flen) {\n\tvar out = [], o = \"\", i = 0, c = \"\", lst='t', dt, j, cc;\n\tvar hr='H';\n\t/* Tokenize */\n\twhile(i < fmt.length) {\n\t\tswitch((c = fmt.charAt(i))) {\n\t\t\tcase 'G': /* General */\n\t\t\t\tif(!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt);\n\t\t\t\tout[out.length] = {t:'G', v:'General'}; i+=7; break;\n\t\t\tcase '\"': /* Literal text */\n\t\t\t\tfor(o=\"\";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc);\n\t\t\t\tout[out.length] = {t:'t', v:o}; ++i; break;\n\t\t\tcase '\\\\': var w = fmt.charAt(++i), t = (w === \"(\" || w === \")\") ? w : 't';\n\t\t\t\tout[out.length] = {t:t, v:w}; ++i; break;\n\t\t\tcase '_': out[out.length] = {t:'t', v:\" \"}; i+=2; break;\n\t\t\tcase '@': /* Text Placeholder */\n\t\t\t\tout[out.length] = {t:'T', v:v}; ++i; break;\n\t\t\tcase 'B': case 'b':\n\t\t\t\tif(fmt.charAt(i+1) === \"1\" || fmt.charAt(i+1) === \"2\") {\n\t\t\t\t\tif(dt==null) { dt=parse_date_code(v, opts, fmt.charAt(i+1) === \"2\"); if(dt==null) return \"\"; }\n\t\t\t\t\tout[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break;\n\t\t\t\t}\n\t\t\t\t/* falls through */\n\t\t\tcase 'M': case 'D': case 'Y': case 'H': case 'S': case 'E':\n\t\t\t\tc = c.toLowerCase();\n\t\t\t\t/* falls through */\n\t\t\tcase 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g':\n\t\t\t\tif(v < 0) return \"\";\n\t\t\t\tif(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return \"\"; }\n\t\t\t\to = c; while(++i < fmt.length && fmt.charAt(i).toLowerCase() === c) o+=c;\n\t\t\t\tif(c === 'm' && lst.toLowerCase() === 'h') c = 'M';\n\t\t\t\tif(c === 'h') c = hr;\n\t\t\t\tout[out.length] = {t:c, v:o}; lst = c; break;\n\t\t\tcase 'A': case 'a': case '上':\n\t\t\t\tvar q={t:c, v:c};\n\t\t\t\tif(dt==null) dt=parse_date_code(v, opts);\n\t\t\t\tif(fmt.substr(i, 3).toUpperCase() === \"A/P\") { if(dt!=null) q.v = dt.H >= 12 ? \"P\" : \"A\"; q.t = 'T'; hr='h';i+=3;}\n\t\t\t\telse if(fmt.substr(i,5).toUpperCase() === \"AM/PM\") { if(dt!=null) q.v = dt.H >= 12 ? \"PM\" : \"AM\"; q.t = 'T'; i+=5; hr='h'; }\n\t\t\t\telse if(fmt.substr(i,5).toUpperCase() === \"上午/下午\") { if(dt!=null) q.v = dt.H >= 12 ? \"下午\" : \"上午\"; q.t = 'T'; i+=5; hr='h'; }\n\t\t\t\telse { q.t = \"t\"; ++i; }\n\t\t\t\tif(dt==null && q.t === 'T') return \"\";\n\t\t\t\tout[out.length] = q; lst = c; break;\n\t\t\tcase '[':\n\t\t\t\to = c;\n\t\t\t\twhile(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);\n\t\t\t\tif(o.slice(-1) !== ']') throw 'unterminated \"[\" block: |' + o + '|';\n\t\t\t\tif(o.match(abstime)) {\n\t\t\t\t\tif(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return \"\"; }\n\t\t\t\t\tout[out.length] = {t:'Z', v:o.toLowerCase()};\n\t\t\t\t\tlst = o.charAt(1);\n\t\t\t\t} else if(o.indexOf(\"$\") > -1) {\n\t\t\t\t\to = (o.match(/\\$([^-\\[\\]]*)/)||[])[1]||\"$\";\n\t\t\t\t\tif(!fmt_is_date(fmt)) out[out.length] = {t:'t',v:o};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t/* Numbers */\n\t\t\tcase '.':\n\t\t\t\tif(dt != null) {\n\t\t\t\t\to = c; while(++i < fmt.length && (c=fmt.charAt(i)) === \"0\") o += c;\n\t\t\t\t\tout[out.length] = {t:'s', v:o}; break;\n\t\t\t\t}\n\t\t\t\t/* falls through */\n\t\t\tcase '0': case '#':\n\t\t\t\to = c; while(++i < fmt.length && \"0#?.,E+-%\".indexOf(c=fmt.charAt(i)) > -1) o += c;\n\t\t\t\tout[out.length] = {t:'n', v:o}; break;\n\t\t\tcase '?':\n\t\t\t\to = c; while(fmt.charAt(++i) === c) o+=c;\n\t\t\t\tout[out.length] = {t:c, v:o}; lst = c; break;\n\t\t\tcase '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break; // **\n\t\t\tcase '(': case ')': out[out.length] = {t:(flen===1?'t':c), v:c}; ++i; break;\n\t\t\tcase '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':\n\t\t\t\to = c; while(i < fmt.length && \"0123456789\".indexOf(fmt.charAt(++i)) > -1) o+=fmt.charAt(i);\n\t\t\t\tout[out.length] = {t:'D', v:o}; break;\n\t\t\tcase ' ': out[out.length] = {t:c, v:c}; ++i; break;\n\t\t\tcase '$': out[out.length] = {t:'t', v:'$'}; ++i; break;\n\t\t\tdefault:\n\t\t\t\tif(\",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP\".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt);\n\t\t\t\tout[out.length] = {t:'t', v:c}; ++i; break;\n\t\t}\n\t}\n\n\t/* Scan for date/time parts */\n\tvar bt = 0, ss0 = 0, ssm;\n\tfor(i=out.length-1, lst='t'; i >= 0; --i) {\n\t\tswitch(out[i].t) {\n\t\t\tcase 'h': case 'H': out[i].t = hr; lst='h'; if(bt < 1) bt = 1; break;\n\t\t\tcase 's':\n\t\t\t\tif((ssm=out[i].v.match(/\\.0+$/))) ss0=Math.max(ss0,ssm[0].length-1);\n\t\t\t\tif(bt < 3) bt = 3;\n\t\t\t/* falls through */\n\t\t\tcase 'd': case 'y': case 'M': case 'e': lst=out[i].t; break;\n\t\t\tcase 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break;\n\t\t\tcase 'X': /*if(out[i].v === \"B2\");*/\n\t\t\t\tbreak;\n\t\t\tcase 'Z':\n\t\t\t\tif(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1;\n\t\t\t\tif(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2;\n\t\t\t\tif(bt < 3 && out[i].v.match(/[Ss]/)) bt = 3;\n\t\t}\n\t}\n\t/* time rounding depends on presence of minute / second / usec fields */\n\tswitch(bt) {\n\t\tcase 0: break;\n\t\tcase 1:\nif(dt.u >= 0.5) { dt.u = 0; ++dt.S; }\n\t\t\tif(dt.S >= 60) { dt.S = 0; ++dt.M; }\n\t\t\tif(dt.M >= 60) { dt.M = 0; ++dt.H; }\n\t\t\tbreak;\n\t\tcase 2:\nif(dt.u >= 0.5) { dt.u = 0; ++dt.S; }\n\t\t\tif(dt.S >= 60) { dt.S = 0; ++dt.M; }\n\t\t\tbreak;\n\t}\n\n\t/* replace fields */\n\tvar nstr = \"\", jj;\n\tfor(i=0; i < out.length; ++i) {\n\t\tswitch(out[i].t) {\n\t\t\tcase 't': case 'T': case ' ': case 'D': break;\n\t\t\tcase 'X': out[i].v = \"\"; out[i].t = \";\"; break;\n\t\t\tcase 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z':\nout[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);\n\t\t\t\tout[i].t = 't'; break;\n\t\t\tcase 'n': case '?':\n\t\t\t\tjj = i+1;\n\t\t\t\twhile(out[jj] != null && (\n\t\t\t\t\t(c=out[jj].t) === \"?\" || c === \"D\" ||\n\t\t\t\t\t((c === \" \" || c === \"t\") && out[jj+1] != null && (out[jj+1].t === '?' || out[jj+1].t === \"t\" && out[jj+1].v === '/')) ||\n\t\t\t\t\t(out[i].t === '(' && (c === ' ' || c === 'n' || c === ')')) ||\n\t\t\t\t\t(c === 't' && (out[jj].v === '/' || out[jj].v === ' ' && out[jj+1] != null && out[jj+1].t == '?'))\n\t\t\t\t)) {\n\t\t\t\t\tout[i].v += out[jj].v;\n\t\t\t\t\tout[jj] = {v:\"\", t:\";\"}; ++jj;\n\t\t\t\t}\n\t\t\t\tnstr += out[i].v;\n\t\t\t\ti = jj-1; break;\n\t\t\tcase 'G': out[i].t = 't'; out[i].v = general_fmt(v,opts); break;\n\t\t}\n\t}\n\tvar vv = \"\", myv, ostr;\n\tif(nstr.length > 0) {\n\t\tif(nstr.charCodeAt(0) == 40) /* '(' */ {\n\t\t\tmyv = (v<0&&nstr.charCodeAt(0) === 45 ? -v : v);\n\t\t\tostr = write_num('n', nstr, myv);\n\t\t} else {\n\t\t\tmyv = (v<0 && flen > 1 ? -v : v);\n\t\t\tostr = write_num('n', nstr, myv);\n\t\t\tif(myv < 0 && out[0] && out[0].t == 't') {\n\t\t\t\tostr = ostr.substr(1);\n\t\t\t\tout[0].v = \"-\" + out[0].v;\n\t\t\t}\n\t\t}\n\t\tjj=ostr.length-1;\n\t\tvar decpt = out.length;\n\t\tfor(i=0; i < out.length; ++i) if(out[i] != null && out[i].t != 't' && out[i].v.indexOf(\".\") > -1) { decpt = i; break; }\n\t\tvar lasti=out.length;\n\t\tif(decpt === out.length && ostr.indexOf(\"E\") === -1) {\n\t\t\tfor(i=out.length-1; i>= 0;--i) {\n\t\t\t\tif(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;\n\t\t\t\tif(jj>=out[i].v.length-1) { jj -= out[i].v.length; out[i].v = ostr.substr(jj+1, out[i].v.length); }\n\t\t\t\telse if(jj < 0) out[i].v = \"\";\n\t\t\t\telse { out[i].v = ostr.substr(0, jj+1); jj = -1; }\n\t\t\t\tout[i].t = 't';\n\t\t\t\tlasti = i;\n\t\t\t}\n\t\t\tif(jj>=0 && lasti= 0; --i) {\n\t\t\t\tif(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;\n\t\t\t\tj=out[i].v.indexOf(\".\")>-1&&i===decpt?out[i].v.indexOf(\".\")-1:out[i].v.length-1;\n\t\t\t\tvv = out[i].v.substr(j+1);\n\t\t\t\tfor(; j>=0; --j) {\n\t\t\t\t\tif(jj>=0 && (out[i].v.charAt(j) === \"0\" || out[i].v.charAt(j) === \"#\")) vv = ostr.charAt(jj--) + vv;\n\t\t\t\t}\n\t\t\t\tout[i].v = vv;\n\t\t\t\tout[i].t = 't';\n\t\t\t\tlasti = i;\n\t\t\t}\n\t\t\tif(jj>=0 && lasti-1&&i===decpt?out[i].v.indexOf(\".\")+1:0;\n\t\t\t\tvv = out[i].v.substr(0,j);\n\t\t\t\tfor(; j-1) {\n\t\tmyv = (flen >1 && v < 0 && i>0 && out[i-1].v === \"-\" ? -v:v);\n\t\tout[i].v = write_num(out[i].t, out[i].v, myv);\n\t\tout[i].t = 't';\n\t}\n\tvar retval = \"\";\n\tfor(i=0; i !== out.length; ++i) if(out[i] != null) retval += out[i].v;\n\treturn retval;\n}\nSSF._eval = eval_fmt;\nvar cfregex = /\\[[=<>]/;\nvar cfregex2 = /\\[(=|>[=]?|<[>=]?)(-?\\d+(?:\\.\\d*)?)\\]/;\nfunction chkcond(v, rr) {\n\tif(rr == null) return false;\n\tvar thresh = parseFloat(rr[2]);\n\tswitch(rr[1]) {\n\t\tcase \"=\": if(v == thresh) return true; break;\n\t\tcase \">\": if(v > thresh) return true; break;\n\t\tcase \"<\": if(v < thresh) return true; break;\n\t\tcase \"<>\": if(v != thresh) return true; break;\n\t\tcase \">=\": if(v >= thresh) return true; break;\n\t\tcase \"<=\": if(v <= thresh) return true; break;\n\t}\n\treturn false;\n}\nfunction choose_fmt(f, v) {\n\tvar fmt = split_fmt(f);\n\tvar l = fmt.length, lat = fmt[l-1].indexOf(\"@\");\n\tif(l<4 && lat>-1) --l;\n\tif(fmt.length > 4) throw new Error(\"cannot find right format for |\" + fmt.join(\"|\") + \"|\");\n\tif(typeof v !== \"number\") return [4, fmt.length === 4 || lat>-1?fmt[fmt.length-1]:\"@\"];\n\tswitch(fmt.length) {\n\t\tcase 1: fmt = lat>-1 ? [\"General\", \"General\", \"General\", fmt[0]] : [fmt[0], fmt[0], fmt[0], \"@\"]; break;\n\t\tcase 2: fmt = lat>-1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], \"@\"]; break;\n\t\tcase 3: fmt = lat>-1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], \"@\"]; break;\n\t\tcase 4: break;\n\t}\n\tvar ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];\n\tif(fmt[0].indexOf(\"[\") === -1 && fmt[1].indexOf(\"[\") === -1) return [l, ff];\n\tif(fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) {\n\t\tvar m1 = fmt[0].match(cfregex2);\n\t\tvar m2 = fmt[1].match(cfregex2);\n\t\treturn chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]];\n\t}\n\treturn [l, ff];\n}\nfunction format(fmt,v,o) {\n\tif(o == null) o = {};\n\tvar sfmt = \"\";\n\tswitch(typeof fmt) {\n\t\tcase \"string\":\n\t\t\tif(fmt == \"m/d/yy\" && o.dateNF) sfmt = o.dateNF;\n\t\t\telse sfmt = fmt;\n\t\t\tbreak;\n\t\tcase \"number\":\n\t\t\tif(fmt == 14 && o.dateNF) sfmt = o.dateNF;\n\t\t\telse sfmt = (o.table != null ? (o.table) : table_fmt)[fmt];\n\t\t\tif(sfmt == null) sfmt = (o.table && o.table[default_map[fmt]]) || table_fmt[default_map[fmt]];\n\t\t\tif(sfmt == null) sfmt = default_str[fmt] || \"General\";\n\t\t\tbreak;\n\t}\n\tif(isgeneral(sfmt,0)) return general_fmt(v, o);\n\tif(v instanceof Date) v = datenum_local(v, o.date1904);\n\tvar f = choose_fmt(sfmt, v);\n\tif(isgeneral(f[1])) return general_fmt(v, o);\n\tif(v === true) v = \"TRUE\"; else if(v === false) v = \"FALSE\";\n\telse if(v === \"\" || v == null) return \"\";\n\treturn eval_fmt(f[1], v, o, f[0]);\n}\nfunction load_entry(fmt, idx) {\n\tif(typeof idx != 'number') {\n\t\tidx = +idx || -1;\nfor(var i = 0; i < 0x0188; ++i) {\nif(table_fmt[i] == undefined) { if(idx < 0) idx = i; continue; }\n\t\t\tif(table_fmt[i] == fmt) { idx = i; break; }\n\t\t}\nif(idx < 0) idx = 0x187;\n\t}\ntable_fmt[idx] = fmt;\n\treturn idx;\n}\nSSF.load = load_entry;\nSSF._table = table_fmt;\nSSF.get_table = function get_table() { return table_fmt; };\nSSF.load_table = function load_table(tbl) {\n\tfor(var i=0; i!=0x0188; ++i)\n\t\tif(tbl[i] !== undefined) load_entry(tbl[i], i);\n};\nSSF.init_table = init_table;\nSSF.format = format;\n};\nmake_ssf(SSF);\n/* map from xlml named formats to SSF TODO: localize */\nvar XLMLFormatMap/*{[string]:string}*/ = ({\n\t\"General Number\": \"General\",\n\t\"General Date\": SSF._table[22],\n\t\"Long Date\": \"dddd, mmmm dd, yyyy\",\n\t\"Medium Date\": SSF._table[15],\n\t\"Short Date\": SSF._table[14],\n\t\"Long Time\": SSF._table[19],\n\t\"Medium Time\": SSF._table[18],\n\t\"Short Time\": SSF._table[20],\n\t\"Currency\": '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',\n\t\"Fixed\": SSF._table[2],\n\t\"Standard\": SSF._table[4],\n\t\"Percent\": SSF._table[10],\n\t\"Scientific\": SSF._table[11],\n\t\"Yes/No\": '\"Yes\";\"Yes\";\"No\";@',\n\t\"True/False\": '\"True\";\"True\";\"False\";@',\n\t\"On/Off\": '\"Yes\";\"Yes\";\"No\";@'\n});\n\nvar SSFImplicit/*{[number]:string}*/ = ({\n\t\"5\": '\"$\"#,##0_);\\\\(\"$\"#,##0\\\\)',\n\t\"6\": '\"$\"#,##0_);[Red]\\\\(\"$\"#,##0\\\\)',\n\t\"7\": '\"$\"#,##0.00_);\\\\(\"$\"#,##0.00\\\\)',\n\t\"8\": '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',\n\t\"23\": 'General', \"24\": 'General', \"25\": 'General', \"26\": 'General',\n\t\"27\": 'm/d/yy', \"28\": 'm/d/yy', \"29\": 'm/d/yy', \"30\": 'm/d/yy', \"31\": 'm/d/yy',\n\t\"32\": 'h:mm:ss', \"33\": 'h:mm:ss', \"34\": 'h:mm:ss', \"35\": 'h:mm:ss',\n\t\"36\": 'm/d/yy',\n\t\"41\": '_(* #,##0_);_(* \\(#,##0\\);_(* \"-\"_);_(@_)',\n\t\"42\": '_(\"$\"* #,##0_);_(\"$\"* \\(#,##0\\);_(\"$\"* \"-\"_);_(@_)',\n\t\"43\": '_(* #,##0.00_);_(* \\(#,##0.00\\);_(* \"-\"??_);_(@_)',\n\t\"44\": '_(\"$\"* #,##0.00_);_(\"$\"* \\(#,##0.00\\);_(\"$\"* \"-\"??_);_(@_)',\n\t\"50\": 'm/d/yy', \"51\": 'm/d/yy', \"52\": 'm/d/yy', \"53\": 'm/d/yy', \"54\": 'm/d/yy',\n\t\"55\": 'm/d/yy', \"56\": 'm/d/yy', \"57\": 'm/d/yy', \"58\": 'm/d/yy',\n\t\"59\": '0',\n\t\"60\": '0.00',\n\t\"61\": '#,##0',\n\t\"62\": '#,##0.00',\n\t\"63\": '\"$\"#,##0_);\\\\(\"$\"#,##0\\\\)',\n\t\"64\": '\"$\"#,##0_);[Red]\\\\(\"$\"#,##0\\\\)',\n\t\"65\": '\"$\"#,##0.00_);\\\\(\"$\"#,##0.00\\\\)',\n\t\"66\": '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',\n\t\"67\": '0%',\n\t\"68\": '0.00%',\n\t\"69\": '# ?/?',\n\t\"70\": '# ??/??',\n\t\"71\": 'm/d/yy',\n\t\"72\": 'm/d/yy',\n\t\"73\": 'd-mmm-yy',\n\t\"74\": 'd-mmm',\n\t\"75\": 'mmm-yy',\n\t\"76\": 'h:mm',\n\t\"77\": 'h:mm:ss',\n\t\"78\": 'm/d/yy h:mm',\n\t\"79\": 'mm:ss',\n\t\"80\": '[h]:mm:ss',\n\t\"81\": 'mmss.0'\n});\n\n/* dateNF parse TODO: move to SSF */\nvar dateNFregex = /[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g;\nfunction dateNF_regex(dateNF) {\n\tvar fmt = typeof dateNF == \"number\" ? SSF._table[dateNF] : dateNF;\n\tfmt = fmt.replace(dateNFregex, \"(\\\\d+)\");\n\treturn new RegExp(\"^\" + fmt + \"$\");\n}\nfunction dateNF_fix(str, dateNF, match) {\n\tvar Y = -1, m = -1, d = -1, H = -1, M = -1, S = -1;\n\t(dateNF.match(dateNFregex)||[]).forEach(function(n, i) {\n\t\tvar v = parseInt(match[i+1], 10);\n\t\tswitch(n.toLowerCase().charAt(0)) {\n\t\t\tcase 'y': Y = v; break; case 'd': d = v; break;\n\t\t\tcase 'h': H = v; break; case 's': S = v; break;\n\t\t\tcase 'm': if(H >= 0) M = v; else m = v; break;\n\t\t}\n\t});\n\tif(S >= 0 && M == -1 && m >= 0) { M = m; m = -1; }\n\tvar datestr = ((\"\" + (Y>=0?Y: new Date().getFullYear())).slice(-4) + \"-\" + (\"00\" + (m>=1?m:1)).slice(-2) + \"-\" + (\"00\" + (d>=1?d:1)).slice(-2));\n\tif(datestr.length == 7) datestr = \"0\" + datestr;\n\tif(datestr.length == 8) datestr = \"20\" + datestr;\n\tvar timestr = ((\"00\" + (H>=0?H:0)).slice(-2) + \":\" + (\"00\" + (M>=0?M:0)).slice(-2) + \":\" + (\"00\" + (S>=0?S:0)).slice(-2));\n\tif(H == -1 && M == -1 && S == -1) return datestr;\n\tif(Y == -1 && m == -1 && d == -1) return timestr;\n\treturn datestr + \"T\" + timestr;\n}\n\nvar DO_NOT_EXPORT_CFB = true;\n/* cfb.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*jshint eqnull:true */\n/*exported CFB */\n/*global Uint8Array:false, Uint16Array:false */\n\n/* crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*exported CRC32 */\nvar CRC32;\n(function (factory) {\n\t/*jshint ignore:start */\n\t/*eslint-disable */\n\tfactory(CRC32 = {});\n\t/*eslint-enable */\n\t/*jshint ignore:end */\n}(function(CRC32) {\nCRC32.version = '1.2.0';\n/* see perf/crc32table.js */\n/*global Int32Array */\nfunction signed_crc_table() {\n\tvar c = 0, table = new Array(256);\n\n\tfor(var n =0; n != 256; ++n){\n\t\tc = n;\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\ttable[n] = c;\n\t}\n\n\treturn typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;\n}\n\nvar T = signed_crc_table();\nfunction crc32_bstr(bstr, seed) {\n\tvar C = seed ^ -1, L = bstr.length - 1;\n\tfor(var i = 0; i < L;) {\n\t\tC = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];\n\t\tC = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];\n\t}\n\tif(i === L) C = (C>>>8) ^ T[(C ^ bstr.charCodeAt(i))&0xFF];\n\treturn C ^ -1;\n}\n\nfunction crc32_buf(buf, seed) {\n\tif(buf.length > 10000) return crc32_buf_8(buf, seed);\n\tvar C = seed ^ -1, L = buf.length - 3;\n\tfor(var i = 0; i < L;) {\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t}\n\twhile(i < L+3) C = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\treturn C ^ -1;\n}\n\nfunction crc32_buf_8(buf, seed) {\n\tvar C = seed ^ -1, L = buf.length - 7;\n\tfor(var i = 0; i < L;) {\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t}\n\twhile(i < L+7) C = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\treturn C ^ -1;\n}\n\nfunction crc32_str(str, seed) {\n\tvar C = seed ^ -1;\n\tfor(var i = 0, L=str.length, c, d; i < L;) {\n\t\tc = str.charCodeAt(i++);\n\t\tif(c < 0x80) {\n\t\t\tC = (C>>>8) ^ T[(C ^ c)&0xFF];\n\t\t} else if(c < 0x800) {\n\t\t\tC = (C>>>8) ^ T[(C ^ (192|((c>>6)&31)))&0xFF];\n\t\t\tC = (C>>>8) ^ T[(C ^ (128|(c&63)))&0xFF];\n\t\t} else if(c >= 0xD800 && c < 0xE000) {\n\t\t\tc = (c&1023)+64; d = str.charCodeAt(i++)&1023;\n\t\t\tC = (C>>>8) ^ T[(C ^ (240|((c>>8)&7)))&0xFF];\n\t\t\tC = (C>>>8) ^ T[(C ^ (128|((c>>2)&63)))&0xFF];\n\t\t\tC = (C>>>8) ^ T[(C ^ (128|((d>>6)&15)|((c&3)<<4)))&0xFF];\n\t\t\tC = (C>>>8) ^ T[(C ^ (128|(d&63)))&0xFF];\n\t\t} else {\n\t\t\tC = (C>>>8) ^ T[(C ^ (224|((c>>12)&15)))&0xFF];\n\t\t\tC = (C>>>8) ^ T[(C ^ (128|((c>>6)&63)))&0xFF];\n\t\t\tC = (C>>>8) ^ T[(C ^ (128|(c&63)))&0xFF];\n\t\t}\n\t}\n\treturn C ^ -1;\n}\nCRC32.table = T;\nCRC32.bstr = crc32_bstr;\nCRC32.buf = crc32_buf;\nCRC32.str = crc32_str;\n}));\n/* [MS-CFB] v20171201 */\nvar CFB = (function _CFB(){\nvar exports = {};\nexports.version = '1.1.4';\n/* [MS-CFB] 2.6.4 */\nfunction namecmp(l, r) {\n\tvar L = l.split(\"/\"), R = r.split(\"/\");\n\tfor(var i = 0, c = 0, Z = Math.min(L.length, R.length); i < Z; ++i) {\n\t\tif((c = L[i].length - R[i].length)) return c;\n\t\tif(L[i] != R[i]) return L[i] < R[i] ? -1 : 1;\n\t}\n\treturn L.length - R.length;\n}\nfunction dirname(p) {\n\tif(p.charAt(p.length - 1) == \"/\") return (p.slice(0,-1).indexOf(\"/\") === -1) ? p : dirname(p.slice(0, -1));\n\tvar c = p.lastIndexOf(\"/\");\n\treturn (c === -1) ? p : p.slice(0, c+1);\n}\n\nfunction filename(p) {\n\tif(p.charAt(p.length - 1) == \"/\") return filename(p.slice(0, -1));\n\tvar c = p.lastIndexOf(\"/\");\n\treturn (c === -1) ? p : p.slice(c+1);\n}\n/* -------------------------------------------------------------------------- */\n/* DOS Date format:\n high|YYYYYYYm.mmmddddd.HHHHHMMM.MMMSSSSS|low\n add 1980 to stored year\n stored second should be doubled\n*/\n\n/* write JS date to buf as a DOS date */\nfunction write_dos_date(buf, date) {\n\tif(typeof date === \"string\") date = new Date(date);\n\tvar hms = date.getHours();\n\thms = hms << 6 | date.getMinutes();\n\thms = hms << 5 | (date.getSeconds()>>>1);\n\tbuf.write_shift(2, hms);\n\tvar ymd = (date.getFullYear() - 1980);\n\tymd = ymd << 4 | (date.getMonth()+1);\n\tymd = ymd << 5 | date.getDate();\n\tbuf.write_shift(2, ymd);\n}\n\n/* read four bytes from buf and interpret as a DOS date */\nfunction parse_dos_date(buf) {\n\tvar hms = buf.read_shift(2) & 0xFFFF;\n\tvar ymd = buf.read_shift(2) & 0xFFFF;\n\tvar val = new Date();\n\tvar d = ymd & 0x1F; ymd >>>= 5;\n\tvar m = ymd & 0x0F; ymd >>>= 4;\n\tval.setMilliseconds(0);\n\tval.setFullYear(ymd + 1980);\n\tval.setMonth(m-1);\n\tval.setDate(d);\n\tvar S = hms & 0x1F; hms >>>= 5;\n\tvar M = hms & 0x3F; hms >>>= 6;\n\tval.setHours(hms);\n\tval.setMinutes(M);\n\tval.setSeconds(S<<1);\n\treturn val;\n}\nfunction parse_extra_field(blob) {\n\tprep_blob(blob, 0);\n\tvar o = {};\n\tvar flags = 0;\n\twhile(blob.l <= blob.length - 4) {\n\t\tvar type = blob.read_shift(2);\n\t\tvar sz = blob.read_shift(2), tgt = blob.l + sz;\n\t\tvar p = {};\n\t\tswitch(type) {\n\t\t\t/* UNIX-style Timestamps */\n\t\t\tcase 0x5455: {\n\t\t\t\tflags = blob.read_shift(1);\n\t\t\t\tif(flags & 1) p.mtime = blob.read_shift(4);\n\t\t\t\t/* for some reason, CD flag corresponds to LFH */\n\t\t\t\tif(sz > 5) {\n\t\t\t\t\tif(flags & 2) p.atime = blob.read_shift(4);\n\t\t\t\t\tif(flags & 4) p.ctime = blob.read_shift(4);\n\t\t\t\t}\n\t\t\t\tif(p.mtime) p.mt = new Date(p.mtime*1000);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tblob.l = tgt;\n\t\to[type] = p;\n\t}\n\treturn o;\n}\nvar fs;\nfunction get_fs() { return fs || (fs = require('fs')); }\nfunction parse(file, options) {\nif(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options);\nif(file.length < 512) throw new Error(\"CFB file size \" + file.length + \" < 512\");\nvar mver = 3;\nvar ssz = 512;\nvar nmfs = 0; // number of mini FAT sectors\nvar difat_sec_cnt = 0;\nvar dir_start = 0;\nvar minifat_start = 0;\nvar difat_start = 0;\n\nvar fat_addrs = []; // locations of FAT sectors\n\n/* [MS-CFB] 2.2 Compound File Header */\nvar blob = file.slice(0,512);\nprep_blob(blob, 0);\n\n/* major version */\nvar mv = check_get_mver(blob);\nmver = mv[0];\nswitch(mver) {\n\tcase 3: ssz = 512; break; case 4: ssz = 4096; break;\n\tcase 0: if(mv[1] == 0) return parse_zip(file, options);\n\t/* falls through */\n\tdefault: throw new Error(\"Major Version: Expected 3 or 4 saw \" + mver);\n}\n\n/* reprocess header */\nif(ssz !== 512) { blob = file.slice(0,ssz); prep_blob(blob, 28 /* blob.l */); }\n/* Save header for final object */\nvar header = file.slice(0,ssz);\n\ncheck_shifts(blob, mver);\n\n// Number of Directory Sectors\nvar dir_cnt = blob.read_shift(4, 'i');\nif(mver === 3 && dir_cnt !== 0) throw new Error('# Directory Sectors: Expected 0 saw ' + dir_cnt);\n\n// Number of FAT Sectors\nblob.l += 4;\n\n// First Directory Sector Location\ndir_start = blob.read_shift(4, 'i');\n\n// Transaction Signature\nblob.l += 4;\n\n// Mini Stream Cutoff Size\nblob.chk('00100000', 'Mini Stream Cutoff Size: ');\n\n// First Mini FAT Sector Location\nminifat_start = blob.read_shift(4, 'i');\n\n// Number of Mini FAT Sectors\nnmfs = blob.read_shift(4, 'i');\n\n// First DIFAT sector location\ndifat_start = blob.read_shift(4, 'i');\n\n// Number of DIFAT Sectors\ndifat_sec_cnt = blob.read_shift(4, 'i');\n\n// Grab FAT Sector Locations\nfor(var q = -1, j = 0; j < 109; ++j) { /* 109 = (512 - blob.l)>>>2; */\n\tq = blob.read_shift(4, 'i');\n\tif(q<0) break;\n\tfat_addrs[j] = q;\n}\n\n/** Break the file up into sectors */\nvar sectors = sectorify(file, ssz);\n\nsleuth_fat(difat_start, difat_sec_cnt, sectors, ssz, fat_addrs);\n\n/** Chains */\nvar sector_list = make_sector_list(sectors, dir_start, fat_addrs, ssz);\n\nsector_list[dir_start].name = \"!Directory\";\nif(nmfs > 0 && minifat_start !== ENDOFCHAIN) sector_list[minifat_start].name = \"!MiniFAT\";\nsector_list[fat_addrs[0]].name = \"!FAT\";\nsector_list.fat_addrs = fat_addrs;\nsector_list.ssz = ssz;\n\n/* [MS-CFB] 2.6.1 Compound File Directory Entry */\nvar files = {}, Paths = [], FileIndex = [], FullPaths = [];\nread_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start);\n\nbuild_full_paths(FileIndex, FullPaths, Paths);\nPaths.shift();\n\nvar o = {\n\tFileIndex: FileIndex,\n\tFullPaths: FullPaths\n};\n\n// $FlowIgnore\nif(options && options.raw) o.raw = {header: header, sectors: sectors};\nreturn o;\n} // parse\n\n/* [MS-CFB] 2.2 Compound File Header -- read up to major version */\nfunction check_get_mver(blob) {\n\tif(blob[blob.l] == 0x50 && blob[blob.l + 1] == 0x4b) return [0, 0];\n\t// header signature 8\n\tblob.chk(HEADER_SIGNATURE, 'Header Signature: ');\n\n\t// clsid 16\n\t//blob.chk(HEADER_CLSID, 'CLSID: ');\n\tblob.l += 16;\n\n\t// minor version 2\n\tvar mver = blob.read_shift(2, 'u');\n\n\treturn [blob.read_shift(2,'u'), mver];\n}\nfunction check_shifts(blob, mver) {\n\tvar shift = 0x09;\n\n\t// Byte Order\n\t//blob.chk('feff', 'Byte Order: '); // note: some writers put 0xffff\n\tblob.l += 2;\n\n\t// Sector Shift\n\tswitch((shift = blob.read_shift(2))) {\n\t\tcase 0x09: if(mver != 3) throw new Error('Sector Shift: Expected 9 saw ' + shift); break;\n\t\tcase 0x0c: if(mver != 4) throw new Error('Sector Shift: Expected 12 saw ' + shift); break;\n\t\tdefault: throw new Error('Sector Shift: Expected 9 or 12 saw ' + shift);\n\t}\n\n\t// Mini Sector Shift\n\tblob.chk('0600', 'Mini Sector Shift: ');\n\n\t// Reserved\n\tblob.chk('000000000000', 'Reserved: ');\n}\n\n/** Break the file up into sectors */\nfunction sectorify(file, ssz) {\n\tvar nsectors = Math.ceil(file.length/ssz)-1;\n\tvar sectors = [];\n\tfor(var i=1; i < nsectors; ++i) sectors[i-1] = file.slice(i*ssz,(i+1)*ssz);\n\tsectors[nsectors-1] = file.slice(nsectors*ssz);\n\treturn sectors;\n}\n\n/* [MS-CFB] 2.6.4 Red-Black Tree */\nfunction build_full_paths(FI, FP, Paths) {\n\tvar i = 0, L = 0, R = 0, C = 0, j = 0, pl = Paths.length;\n\tvar dad = [], q = [];\n\n\tfor(; i < pl; ++i) { dad[i]=q[i]=i; FP[i]=Paths[i]; }\n\n\tfor(; j < q.length; ++j) {\n\t\ti = q[j];\n\t\tL = FI[i].L; R = FI[i].R; C = FI[i].C;\n\t\tif(dad[i] === i) {\n\t\t\tif(L !== -1 /*NOSTREAM*/ && dad[L] !== L) dad[i] = dad[L];\n\t\t\tif(R !== -1 && dad[R] !== R) dad[i] = dad[R];\n\t\t}\n\t\tif(C !== -1 /*NOSTREAM*/) dad[C] = i;\n\t\tif(L !== -1 && i != dad[i]) { dad[L] = dad[i]; if(q.lastIndexOf(L) < j) q.push(L); }\n\t\tif(R !== -1 && i != dad[i]) { dad[R] = dad[i]; if(q.lastIndexOf(R) < j) q.push(R); }\n\t}\n\tfor(i=1; i < pl; ++i) if(dad[i] === i) {\n\t\tif(R !== -1 /*NOSTREAM*/ && dad[R] !== R) dad[i] = dad[R];\n\t\telse if(L !== -1 && dad[L] !== L) dad[i] = dad[L];\n\t}\n\n\tfor(i=1; i < pl; ++i) {\n\t\tif(FI[i].type === 0 /* unknown */) continue;\n\t\tj = i;\n\t\tif(j != dad[j]) do {\n\t\t\tj = dad[j];\n\t\t\tFP[i] = FP[j] + \"/\" + FP[i];\n\t\t} while (j !== 0 && -1 !== dad[j] && j != dad[j]);\n\t\tdad[i] = -1;\n\t}\n\n\tFP[0] += \"/\";\n\tfor(i=1; i < pl; ++i) {\n\t\tif(FI[i].type !== 2 /* stream */) FP[i] += \"/\";\n\t}\n}\n\nfunction get_mfat_entry(entry, payload, mini) {\n\tvar start = entry.start, size = entry.size;\n\t//return (payload.slice(start*MSSZ, start*MSSZ + size));\n\tvar o = [];\n\tvar idx = start;\n\twhile(mini && size > 0 && idx >= 0) {\n\t\to.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ));\n\t\tsize -= MSSZ;\n\t\tidx = __readInt32LE(mini, idx * 4);\n\t}\n\tif(o.length === 0) return (new_buf(0));\n\treturn (bconcat(o).slice(0, entry.size));\n}\n\n/** Chase down the rest of the DIFAT chain to build a comprehensive list\n DIFAT chains by storing the next sector number as the last 32 bits */\nfunction sleuth_fat(idx, cnt, sectors, ssz, fat_addrs) {\n\tvar q = ENDOFCHAIN;\n\tif(idx === ENDOFCHAIN) {\n\t\tif(cnt !== 0) throw new Error(\"DIFAT chain shorter than expected\");\n\t} else if(idx !== -1 /*FREESECT*/) {\n\t\tvar sector = sectors[idx], m = (ssz>>>2)-1;\n\t\tif(!sector) return;\n\t\tfor(var i = 0; i < m; ++i) {\n\t\t\tif((q = __readInt32LE(sector,i*4)) === ENDOFCHAIN) break;\n\t\t\tfat_addrs.push(q);\n\t\t}\n\t\tif(cnt >= 1) sleuth_fat(__readInt32LE(sector,ssz-4),cnt - 1, sectors, ssz, fat_addrs);\n\t}\n}\n\n/** Follow the linked list of sectors for a given starting point */\nfunction get_sector_list(sectors, start, fat_addrs, ssz, chkd) {\n\tvar buf = [], buf_chain = [];\n\tif(!chkd) chkd = [];\n\tvar modulus = ssz - 1, j = 0, jj = 0;\n\tfor(j=start; j>=0;) {\n\t\tchkd[j] = true;\n\t\tbuf[buf.length] = j;\n\t\tbuf_chain.push(sectors[j]);\n\t\tvar addr = fat_addrs[Math.floor(j*4/ssz)];\n\t\tjj = ((j*4) & modulus);\n\t\tif(ssz < 4 + jj) throw new Error(\"FAT boundary crossed: \" + j + \" 4 \"+ssz);\n\t\tif(!sectors[addr]) break;\n\t\tj = __readInt32LE(sectors[addr], jj);\n\t}\n\treturn {nodes: buf, data:__toBuffer([buf_chain])};\n}\n\n/** Chase down the sector linked lists */\nfunction make_sector_list(sectors, dir_start, fat_addrs, ssz) {\n\tvar sl = sectors.length, sector_list = ([]);\n\tvar chkd = [], buf = [], buf_chain = [];\n\tvar modulus = ssz - 1, i=0, j=0, k=0, jj=0;\n\tfor(i=0; i < sl; ++i) {\n\t\tbuf = ([]);\n\t\tk = (i + dir_start); if(k >= sl) k-=sl;\n\t\tif(chkd[k]) continue;\n\t\tbuf_chain = [];\n\t\tvar seen = [];\n\t\tfor(j=k; j>=0;) {\n\t\t\tseen[j] = true;\n\t\t\tchkd[j] = true;\n\t\t\tbuf[buf.length] = j;\n\t\t\tbuf_chain.push(sectors[j]);\n\t\t\tvar addr = fat_addrs[Math.floor(j*4/ssz)];\n\t\t\tjj = ((j*4) & modulus);\n\t\t\tif(ssz < 4 + jj) throw new Error(\"FAT boundary crossed: \" + j + \" 4 \"+ssz);\n\t\t\tif(!sectors[addr]) break;\n\t\t\tj = __readInt32LE(sectors[addr], jj);\n\t\t\tif(seen[j]) break;\n\t\t}\n\t\tsector_list[k] = ({nodes: buf, data:__toBuffer([buf_chain])});\n\t}\n\treturn sector_list;\n}\n\n/* [MS-CFB] 2.6.1 Compound File Directory Entry */\nfunction read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, mini) {\n\tvar minifat_store = 0, pl = (Paths.length?2:0);\n\tvar sector = sector_list[dir_start].data;\n\tvar i = 0, namelen = 0, name;\n\tfor(; i < sector.length; i+= 128) {\n\t\tvar blob = sector.slice(i, i+128);\n\t\tprep_blob(blob, 64);\n\t\tnamelen = blob.read_shift(2);\n\t\tname = __utf16le(blob,0,namelen-pl);\n\t\tPaths.push(name);\n\t\tvar o = ({\n\t\t\tname: name,\n\t\t\ttype: blob.read_shift(1),\n\t\t\tcolor: blob.read_shift(1),\n\t\t\tL: blob.read_shift(4, 'i'),\n\t\t\tR: blob.read_shift(4, 'i'),\n\t\t\tC: blob.read_shift(4, 'i'),\n\t\t\tclsid: blob.read_shift(16),\n\t\t\tstate: blob.read_shift(4, 'i'),\n\t\t\tstart: 0,\n\t\t\tsize: 0\n\t\t});\n\t\tvar ctime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);\n\t\tif(ctime !== 0) o.ct = read_date(blob, blob.l-8);\n\t\tvar mtime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);\n\t\tif(mtime !== 0) o.mt = read_date(blob, blob.l-8);\n\t\to.start = blob.read_shift(4, 'i');\n\t\to.size = blob.read_shift(4, 'i');\n\t\tif(o.size < 0 && o.start < 0) { o.size = o.type = 0; o.start = ENDOFCHAIN; o.name = \"\"; }\n\t\tif(o.type === 5) { /* root */\n\t\t\tminifat_store = o.start;\n\t\t\tif(nmfs > 0 && minifat_store !== ENDOFCHAIN) sector_list[minifat_store].name = \"!StreamData\";\n\t\t\t/*minifat_size = o.size;*/\n\t\t} else if(o.size >= 4096 /* MSCSZ */) {\n\t\t\to.storage = 'fat';\n\t\t\tif(sector_list[o.start] === undefined) sector_list[o.start] = get_sector_list(sectors, o.start, sector_list.fat_addrs, sector_list.ssz);\n\t\t\tsector_list[o.start].name = o.name;\n\t\t\to.content = (sector_list[o.start].data.slice(0,o.size));\n\t\t} else {\n\t\t\to.storage = 'minifat';\n\t\t\tif(o.size < 0) o.size = 0;\n\t\t\telse if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) {\n\t\t\t\to.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini]||{}).data);\n\t\t\t}\n\t\t}\n\t\tif(o.content) prep_blob(o.content, 0);\n\t\tfiles[name] = o;\n\t\tFileIndex.push(o);\n\t}\n}\n\nfunction read_date(blob, offset) {\n\treturn new Date(( ( (__readUInt32LE(blob,offset+4)/1e7)*Math.pow(2,32)+__readUInt32LE(blob,offset)/1e7 ) - 11644473600)*1000);\n}\n\nfunction read_file(filename, options) {\n\tget_fs();\n\treturn parse(fs.readFileSync(filename), options);\n}\n\nfunction read(blob, options) {\n\tswitch(options && options.type || \"base64\") {\n\t\tcase \"file\": return read_file(blob, options);\n\t\tcase \"base64\": return parse(s2a(Base64.decode(blob)), options);\n\t\tcase \"binary\": return parse(s2a(blob), options);\n\t}\n\treturn parse(blob, options);\n}\n\nfunction init_cfb(cfb, opts) {\n\tvar o = opts || {}, root = o.root || \"Root Entry\";\n\tif(!cfb.FullPaths) cfb.FullPaths = [];\n\tif(!cfb.FileIndex) cfb.FileIndex = [];\n\tif(cfb.FullPaths.length !== cfb.FileIndex.length) throw new Error(\"inconsistent CFB structure\");\n\tif(cfb.FullPaths.length === 0) {\n\t\tcfb.FullPaths[0] = root + \"/\";\n\t\tcfb.FileIndex[0] = ({ name: root, type: 5 });\n\t}\n\tif(o.CLSID) cfb.FileIndex[0].clsid = o.CLSID;\n\tseed_cfb(cfb);\n}\nfunction seed_cfb(cfb) {\n\tvar nm = \"\\u0001Sh33tJ5\";\n\tif(CFB.find(cfb, \"/\" + nm)) return;\n\tvar p = new_buf(4); p[0] = 55; p[1] = p[3] = 50; p[2] = 54;\n\tcfb.FileIndex.push(({ name: nm, type: 2, content:p, size:4, L:69, R:69, C:69 }));\n\tcfb.FullPaths.push(cfb.FullPaths[0] + nm);\n\trebuild_cfb(cfb);\n}\nfunction rebuild_cfb(cfb, f) {\n\tinit_cfb(cfb);\n\tvar gc = false, s = false;\n\tfor(var i = cfb.FullPaths.length - 1; i >= 0; --i) {\n\t\tvar _file = cfb.FileIndex[i];\n\t\tswitch(_file.type) {\n\t\t\tcase 0:\n\t\t\t\tif(s) gc = true;\n\t\t\t\telse { cfb.FileIndex.pop(); cfb.FullPaths.pop(); }\n\t\t\t\tbreak;\n\t\t\tcase 1: case 2: case 5:\n\t\t\t\ts = true;\n\t\t\t\tif(isNaN(_file.R * _file.L * _file.C)) gc = true;\n\t\t\t\tif(_file.R > -1 && _file.L > -1 && _file.R == _file.L) gc = true;\n\t\t\t\tbreak;\n\t\t\tdefault: gc = true; break;\n\t\t}\n\t}\n\tif(!gc && !f) return;\n\n\tvar now = new Date(1987, 1, 19), j = 0;\n\tvar data = [];\n\tfor(i = 0; i < cfb.FullPaths.length; ++i) {\n\t\tif(cfb.FileIndex[i].type === 0) continue;\n\t\tdata.push([cfb.FullPaths[i], cfb.FileIndex[i]]);\n\t}\n\tfor(i = 0; i < data.length; ++i) {\n\t\tvar dad = dirname(data[i][0]);\n\t\ts = false;\n\t\tfor(j = 0; j < data.length; ++j) if(data[j][0] === dad) s = true;\n\t\tif(!s) data.push([dad, ({\n\t\t\tname: filename(dad).replace(\"/\",\"\"),\n\t\t\ttype: 1,\n\t\t\tclsid: HEADER_CLSID,\n\t\t\tct: now, mt: now,\n\t\t\tcontent: null\n\t\t})]);\n\t}\n\n\tdata.sort(function(x,y) { return namecmp(x[0], y[0]); });\n\tcfb.FullPaths = []; cfb.FileIndex = [];\n\tfor(i = 0; i < data.length; ++i) { cfb.FullPaths[i] = data[i][0]; cfb.FileIndex[i] = data[i][1]; }\n\tfor(i = 0; i < data.length; ++i) {\n\t\tvar elt = cfb.FileIndex[i];\n\t\tvar nm = cfb.FullPaths[i];\n\n\t\telt.name = filename(nm).replace(\"/\",\"\");\n\t\telt.L = elt.R = elt.C = -(elt.color = 1);\n\t\telt.size = elt.content ? elt.content.length : 0;\n\t\telt.start = 0;\n\t\telt.clsid = (elt.clsid || HEADER_CLSID);\n\t\tif(i === 0) {\n\t\t\telt.C = data.length > 1 ? 1 : -1;\n\t\t\telt.size = 0;\n\t\t\telt.type = 5;\n\t\t} else if(nm.slice(-1) == \"/\") {\n\t\t\tfor(j=i+1;j < data.length; ++j) if(dirname(cfb.FullPaths[j])==nm) break;\n\t\t\telt.C = j >= data.length ? -1 : j;\n\t\t\tfor(j=i+1;j < data.length; ++j) if(dirname(cfb.FullPaths[j])==dirname(nm)) break;\n\t\t\telt.R = j >= data.length ? -1 : j;\n\t\t\telt.type = 1;\n\t\t} else {\n\t\t\tif(dirname(cfb.FullPaths[i+1]||\"\") == dirname(nm)) elt.R = i + 1;\n\t\t\telt.type = 2;\n\t\t}\n\t}\n\n}\n\nfunction _write(cfb, options) {\n\tvar _opts = options || {};\n\trebuild_cfb(cfb);\n\tif(_opts.fileType == 'zip') return write_zip(cfb, _opts);\n\tvar L = (function(cfb){\n\t\tvar mini_size = 0, fat_size = 0;\n\t\tfor(var i = 0; i < cfb.FileIndex.length; ++i) {\n\t\t\tvar file = cfb.FileIndex[i];\n\t\t\tif(!file.content) continue;\nvar flen = file.content.length;\n\t\t\tif(flen > 0){\n\t\t\t\tif(flen < 0x1000) mini_size += (flen + 0x3F) >> 6;\n\t\t\t\telse fat_size += (flen + 0x01FF) >> 9;\n\t\t\t}\n\t\t}\n\t\tvar dir_cnt = (cfb.FullPaths.length +3) >> 2;\n\t\tvar mini_cnt = (mini_size + 7) >> 3;\n\t\tvar mfat_cnt = (mini_size + 0x7F) >> 7;\n\t\tvar fat_base = mini_cnt + fat_size + dir_cnt + mfat_cnt;\n\t\tvar fat_cnt = (fat_base + 0x7F) >> 7;\n\t\tvar difat_cnt = fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt-109)/0x7F);\n\t\twhile(((fat_base + fat_cnt + difat_cnt + 0x7F) >> 7) > fat_cnt) difat_cnt = ++fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt-109)/0x7F);\n\t\tvar L = [1, difat_cnt, fat_cnt, mfat_cnt, dir_cnt, fat_size, mini_size, 0];\n\t\tcfb.FileIndex[0].size = mini_size << 6;\n\t\tL[7] = (cfb.FileIndex[0].start=L[0]+L[1]+L[2]+L[3]+L[4]+L[5])+((L[6]+7) >> 3);\n\t\treturn L;\n\t})(cfb);\n\tvar o = new_buf(L[7] << 9);\n\tvar i = 0, T = 0;\n\t{\n\t\tfor(i = 0; i < 8; ++i) o.write_shift(1, HEADER_SIG[i]);\n\t\tfor(i = 0; i < 8; ++i) o.write_shift(2, 0);\n\t\to.write_shift(2, 0x003E);\n\t\to.write_shift(2, 0x0003);\n\t\to.write_shift(2, 0xFFFE);\n\t\to.write_shift(2, 0x0009);\n\t\to.write_shift(2, 0x0006);\n\t\tfor(i = 0; i < 3; ++i) o.write_shift(2, 0);\n\t\to.write_shift(4, 0);\n\t\to.write_shift(4, L[2]);\n\t\to.write_shift(4, L[0] + L[1] + L[2] + L[3] - 1);\n\t\to.write_shift(4, 0);\n\t\to.write_shift(4, 1<<12);\n\t\to.write_shift(4, L[3] ? L[0] + L[1] + L[2] - 1: ENDOFCHAIN);\n\t\to.write_shift(4, L[3]);\n\t\to.write_shift(-4, L[1] ? L[0] - 1: ENDOFCHAIN);\n\t\to.write_shift(4, L[1]);\n\t\tfor(i = 0; i < 109; ++i) o.write_shift(-4, i < L[2] ? L[1] + i : -1);\n\t}\n\tif(L[1]) {\n\t\tfor(T = 0; T < L[1]; ++T) {\n\t\t\tfor(; i < 236 + T * 127; ++i) o.write_shift(-4, i < L[2] ? L[1] + i : -1);\n\t\t\to.write_shift(-4, T === L[1] - 1 ? ENDOFCHAIN : T + 1);\n\t\t}\n\t}\n\tvar chainit = function(w) {\n\t\tfor(T += w; i> 9);\n\t}\n\tchainit((L[6] + 7) >> 3);\n\twhile(o.l & 0x1FF) o.write_shift(-4, consts.ENDOFCHAIN);\n\tT = i = 0;\n\tfor(j = 0; j < cfb.FileIndex.length; ++j) {\n\t\tfile = cfb.FileIndex[j];\n\t\tif(!file.content) continue;\nflen = file.content.length;\n\t\tif(!flen || flen >= 0x1000) continue;\n\t\tfile.start = T;\n\t\tchainit((flen + 0x3F) >> 6);\n\t}\n\twhile(o.l & 0x1FF) o.write_shift(-4, consts.ENDOFCHAIN);\n\tfor(i = 0; i < L[4]<<2; ++i) {\n\t\tvar nm = cfb.FullPaths[i];\n\t\tif(!nm || nm.length === 0) {\n\t\t\tfor(j = 0; j < 17; ++j) o.write_shift(4, 0);\n\t\t\tfor(j = 0; j < 3; ++j) o.write_shift(4, -1);\n\t\t\tfor(j = 0; j < 12; ++j) o.write_shift(4, 0);\n\t\t\tcontinue;\n\t\t}\n\t\tfile = cfb.FileIndex[i];\n\t\tif(i === 0) file.start = file.size ? file.start - 1 : ENDOFCHAIN;\n\t\tvar _nm = (i === 0 && _opts.root) || file.name;\n\t\tflen = 2*(_nm.length+1);\n\t\to.write_shift(64, _nm, \"utf16le\");\n\t\to.write_shift(2, flen);\n\t\to.write_shift(1, file.type);\n\t\to.write_shift(1, file.color);\n\t\to.write_shift(-4, file.L);\n\t\to.write_shift(-4, file.R);\n\t\to.write_shift(-4, file.C);\n\t\tif(!file.clsid) for(j = 0; j < 4; ++j) o.write_shift(4, 0);\n\t\telse o.write_shift(16, file.clsid, \"hex\");\n\t\to.write_shift(4, file.state || 0);\n\t\to.write_shift(4, 0); o.write_shift(4, 0);\n\t\to.write_shift(4, 0); o.write_shift(4, 0);\n\t\to.write_shift(4, file.start);\n\t\to.write_shift(4, file.size); o.write_shift(4, 0);\n\t}\n\tfor(i = 1; i < cfb.FileIndex.length; ++i) {\n\t\tfile = cfb.FileIndex[i];\nif(file.size >= 0x1000) {\n\t\t\to.l = (file.start+1) << 9;\n\t\t\tfor(j = 0; j < file.size; ++j) o.write_shift(1, file.content[j]);\n\t\t\tfor(; j & 0x1FF; ++j) o.write_shift(1, 0);\n\t\t}\n\t}\n\tfor(i = 1; i < cfb.FileIndex.length; ++i) {\n\t\tfile = cfb.FileIndex[i];\nif(file.size > 0 && file.size < 0x1000) {\n\t\t\tfor(j = 0; j < file.size; ++j) o.write_shift(1, file.content[j]);\n\t\t\tfor(; j & 0x3F; ++j) o.write_shift(1, 0);\n\t\t}\n\t}\n\twhile(o.l < o.length) o.write_shift(1, 0);\n\treturn o;\n}\n/* [MS-CFB] 2.6.4 (Unicode 3.0.1 case conversion) */\nfunction find(cfb, path) {\n\tvar UCFullPaths = cfb.FullPaths.map(function(x) { return x.toUpperCase(); });\n\tvar UCPaths = UCFullPaths.map(function(x) { var y = x.split(\"/\"); return y[y.length - (x.slice(-1) == \"/\" ? 2 : 1)]; });\n\tvar k = false;\n\tif(path.charCodeAt(0) === 47 /* \"/\" */) { k = true; path = UCFullPaths[0].slice(0, -1) + path; }\n\telse k = path.indexOf(\"/\") !== -1;\n\tvar UCPath = path.toUpperCase();\n\tvar w = k === true ? UCFullPaths.indexOf(UCPath) : UCPaths.indexOf(UCPath);\n\tif(w !== -1) return cfb.FileIndex[w];\n\n\tvar m = !UCPath.match(chr1);\n\tUCPath = UCPath.replace(chr0,'');\n\tif(m) UCPath = UCPath.replace(chr1,'!');\n\tfor(w = 0; w < UCFullPaths.length; ++w) {\n\t\tif((m ? UCFullPaths[w].replace(chr1,'!') : UCFullPaths[w]).replace(chr0,'') == UCPath) return cfb.FileIndex[w];\n\t\tif((m ? UCPaths[w].replace(chr1,'!') : UCPaths[w]).replace(chr0,'') == UCPath) return cfb.FileIndex[w];\n\t}\n\treturn null;\n}\n/** CFB Constants */\nvar MSSZ = 64; /* Mini Sector Size = 1<<6 */\n//var MSCSZ = 4096; /* Mini Stream Cutoff Size */\n/* 2.1 Compound File Sector Numbers and Types */\nvar ENDOFCHAIN = -2;\n/* 2.2 Compound File Header */\nvar HEADER_SIGNATURE = 'd0cf11e0a1b11ae1';\nvar HEADER_SIG = [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1];\nvar HEADER_CLSID = '00000000000000000000000000000000';\nvar consts = {\n\t/* 2.1 Compund File Sector Numbers and Types */\n\tMAXREGSECT: -6,\n\tDIFSECT: -4,\n\tFATSECT: -3,\n\tENDOFCHAIN: ENDOFCHAIN,\n\tFREESECT: -1,\n\t/* 2.2 Compound File Header */\n\tHEADER_SIGNATURE: HEADER_SIGNATURE,\n\tHEADER_MINOR_VERSION: '3e00',\n\tMAXREGSID: -6,\n\tNOSTREAM: -1,\n\tHEADER_CLSID: HEADER_CLSID,\n\t/* 2.6.1 Compound File Directory Entry */\n\tEntryTypes: ['unknown','storage','stream','lockbytes','property','root']\n};\n\nfunction write_file(cfb, filename, options) {\n\tget_fs();\n\tvar o = _write(cfb, options);\nfs.writeFileSync(filename, o);\n}\n\nfunction a2s(o) {\n\tvar out = new Array(o.length);\n\tfor(var i = 0; i < o.length; ++i) out[i] = String.fromCharCode(o[i]);\n\treturn out.join(\"\");\n}\n\nfunction write(cfb, options) {\n\tvar o = _write(cfb, options);\n\tswitch(options && options.type) {\n\t\tcase \"file\": get_fs(); fs.writeFileSync(options.filename, (o)); return o;\n\t\tcase \"binary\": return a2s(o);\n\t\tcase \"base64\": return Base64.encode(a2s(o));\n\t}\n\treturn o;\n}\n/* node < 8.1 zlib does not expose bytesRead, so default to pure JS */\nvar _zlib;\nfunction use_zlib(zlib) { try {\n\tvar InflateRaw = zlib.InflateRaw;\n\tvar InflRaw = new InflateRaw();\n\tInflRaw._processChunk(new Uint8Array([3, 0]), InflRaw._finishFlushFlag);\n\tif(InflRaw.bytesRead) _zlib = zlib;\n\telse throw new Error(\"zlib does not expose bytesRead\");\n} catch(e) {console.error(\"cannot use native zlib: \" + (e.message || e)); } }\n\nfunction _inflateRawSync(payload, usz) {\n\tif(!_zlib) return _inflate(payload, usz);\n\tvar InflateRaw = _zlib.InflateRaw;\n\tvar InflRaw = new InflateRaw();\n\tvar out = InflRaw._processChunk(payload.slice(payload.l), InflRaw._finishFlushFlag);\n\tpayload.l += InflRaw.bytesRead;\n\treturn out;\n}\n\nfunction _deflateRawSync(payload) {\n\treturn _zlib ? _zlib.deflateRawSync(payload) : _deflate(payload);\n}\nvar CLEN_ORDER = [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];\n\n/* LEN_ID = [ 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285 ]; */\nvar LEN_LN = [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13 , 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258 ];\n\n/* DST_ID = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ]; */\nvar DST_LN = [ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 ];\n\nfunction bit_swap_8(n) { var t = (((((n<<1)|(n<<11)) & 0x22110) | (((n<<5)|(n<<15)) & 0x88440))); return ((t>>16) | (t>>8) |t)&0xFF; }\n\nvar use_typed_arrays = typeof Uint8Array !== 'undefined';\n\nvar bitswap8 = use_typed_arrays ? new Uint8Array(1<<8) : [];\nfor(var q = 0; q < (1<<8); ++q) bitswap8[q] = bit_swap_8(q);\n\nfunction bit_swap_n(n, b) {\n\tvar rev = bitswap8[n & 0xFF];\n\tif(b <= 8) return rev >>> (8-b);\n\trev = (rev << 8) | bitswap8[(n>>8)&0xFF];\n\tif(b <= 16) return rev >>> (16-b);\n\trev = (rev << 8) | bitswap8[(n>>16)&0xFF];\n\treturn rev >>> (24-b);\n}\n\n/* helpers for unaligned bit reads */\nfunction read_bits_2(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 6 ? 0 : buf[h+1]<<8))>>>w)& 0x03; }\nfunction read_bits_3(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 5 ? 0 : buf[h+1]<<8))>>>w)& 0x07; }\nfunction read_bits_4(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 4 ? 0 : buf[h+1]<<8))>>>w)& 0x0F; }\nfunction read_bits_5(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 3 ? 0 : buf[h+1]<<8))>>>w)& 0x1F; }\nfunction read_bits_7(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 1 ? 0 : buf[h+1]<<8))>>>w)& 0x7F; }\n\n/* works up to n = 3 * 8 + 1 = 25 */\nfunction read_bits_n(buf, bl, n) {\n\tvar w = (bl&7), h = (bl>>>3), f = ((1<>> w;\n\tif(n < 8 - w) return v & f;\n\tv |= buf[h+1]<<(8-w);\n\tif(n < 16 - w) return v & f;\n\tv |= buf[h+2]<<(16-w);\n\tif(n < 24 - w) return v & f;\n\tv |= buf[h+3]<<(24-w);\n\treturn v & f;\n}\n\n/* until ArrayBuffer#realloc is a thing, fake a realloc */\nfunction realloc(b, sz) {\n\tvar L = b.length, M = 2*L > sz ? 2*L : sz + 5, i = 0;\n\tif(L >= sz) return b;\n\tif(has_buf) {\n\t\tvar o = new_unsafe_buf(M);\n\t\t// $FlowIgnore\n\t\tif(b.copy) b.copy(o);\n\t\telse for(; i < b.length; ++i) o[i] = b[i];\n\t\treturn o;\n\t} else if(use_typed_arrays) {\n\t\tvar a = new Uint8Array(M);\n\t\tif(a.set) a.set(b);\n\t\telse for(; i < b.length; ++i) a[i] = b[i];\n\t\treturn a;\n\t}\n\tb.length = M;\n\treturn b;\n}\n\n/* zero-filled arrays for older browsers */\nfunction zero_fill_array(n) {\n\tvar o = new Array(n);\n\tfor(var i = 0; i < n; ++i) o[i] = 0;\n\treturn o;\n}var _deflate = (function() {\nvar _deflateRaw = (function() {\n\treturn function deflateRaw(data, out) {\n\t\tvar boff = 0;\n\t\twhile(boff < data.length) {\n\t\t\tvar L = Math.min(0xFFFF, data.length - boff);\n\t\t\tvar h = boff + L == data.length;\n\t\t\t/* TODO: this is only type 0 stored */\n\t\t\tout.write_shift(1, +h);\n\t\t\tout.write_shift(2, L);\n\t\t\tout.write_shift(2, (~L) & 0xFFFF);\n\t\t\twhile(L-- > 0) out[out.l++] = data[boff++];\n\t\t}\n\t\treturn out.l;\n\t};\n})();\n\nreturn function(data) {\n\tvar buf = new_buf(50+Math.floor(data.length*1.1));\n\tvar off = _deflateRaw(data, buf);\n\treturn buf.slice(0, off);\n};\n})();\n/* modified inflate function also moves original read head */\n\n/* build tree (used for literals and lengths) */\nfunction build_tree(clens, cmap, MAX) {\n\tvar maxlen = 1, w = 0, i = 0, j = 0, ccode = 0, L = clens.length;\n\n\tvar bl_count = use_typed_arrays ? new Uint16Array(32) : zero_fill_array(32);\n\tfor(i = 0; i < 32; ++i) bl_count[i] = 0;\n\n\tfor(i = L; i < MAX; ++i) clens[i] = 0;\n\tL = clens.length;\n\n\tvar ctree = use_typed_arrays ? new Uint16Array(L) : zero_fill_array(L); // []\n\n\t/* build code tree */\n\tfor(i = 0; i < L; ++i) {\n\t\tbl_count[(w = clens[i])]++;\n\t\tif(maxlen < w) maxlen = w;\n\t\tctree[i] = 0;\n\t}\n\tbl_count[0] = 0;\n\tfor(i = 1; i <= maxlen; ++i) bl_count[i+16] = (ccode = (ccode + bl_count[i-1])<<1);\n\tfor(i = 0; i < L; ++i) {\n\t\tccode = clens[i];\n\t\tif(ccode != 0) ctree[i] = bl_count[ccode+16]++;\n\t}\n\n\t/* cmap[maxlen + 4 bits] = (off&15) + (lit<<4) reverse mapping */\n\tvar cleni = 0;\n\tfor(i = 0; i < L; ++i) {\n\t\tcleni = clens[i];\n\t\tif(cleni != 0) {\n\t\t\tccode = bit_swap_n(ctree[i], maxlen)>>(maxlen-cleni);\n\t\t\tfor(j = (1<<(maxlen + 4 - cleni)) - 1; j>=0; --j)\n\t\t\t\tcmap[ccode|(j<>(8-cleni);\n\t\t\tfor(var j = (1<<(7-cleni))-1; j>=0; --j) dyn_cmap[ccode|(j<>>= 3)) {\n\t\t\tcase 16:\n\t\t\t\tw = 3 + read_bits_2(data, boff); boff += 2;\n\t\t\t\tccode = hcodes[hcodes.length - 1];\n\t\t\t\twhile(w-- > 0) hcodes.push(ccode);\n\t\t\t\tbreak;\n\t\t\tcase 17:\n\t\t\t\tw = 3 + read_bits_3(data, boff); boff += 3;\n\t\t\t\twhile(w-- > 0) hcodes.push(0);\n\t\t\t\tbreak;\n\t\t\tcase 18:\n\t\t\t\tw = 11 + read_bits_7(data, boff); boff += 7;\n\t\t\t\twhile(w -- > 0) hcodes.push(0);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\thcodes.push(ccode);\n\t\t\t\tif(maxlen < ccode) maxlen = ccode;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/* build literal / length trees */\n\tvar h1 = hcodes.slice(0, _HLIT), h2 = hcodes.slice(_HLIT);\n\tfor(i = _HLIT; i < 286; ++i) h1[i] = 0;\n\tfor(i = _HDIST; i < 30; ++i) h2[i] = 0;\n\tdyn_len_1 = build_tree(h1, dyn_lmap, 286);\n\tdyn_len_2 = build_tree(h2, dyn_dmap, 30);\n\treturn boff;\n}\n\n/* return [ data, bytesRead ] */\nfunction inflate(data, usz) {\n\t/* shortcircuit for empty buffer [0x03, 0x00] */\n\tif(data[0] == 3 && !(data[1] & 0x3)) { return [new_raw_buf(usz), 2]; }\n\n\t/* bit offset */\n\tvar boff = 0;\n\n\t/* header includes final bit and type bits */\n\tvar header = 0;\n\n\tvar outbuf = new_unsafe_buf(usz ? usz : (1<<18));\n\tvar woff = 0;\n\tvar OL = outbuf.length>>>0;\n\tvar max_len_1 = 0, max_len_2 = 0;\n\n\twhile((header&1) == 0) {\n\t\theader = read_bits_3(data, boff); boff += 3;\n\t\tif((header >>> 1) == 0) {\n\t\t\t/* Stored block */\n\t\t\tif(boff & 7) boff += 8 - (boff&7);\n\t\t\t/* 2 bytes sz, 2 bytes bit inverse */\n\t\t\tvar sz = data[boff>>>3] | data[(boff>>>3)+1]<<8;\n\t\t\tboff += 32;\n\t\t\t/* push sz bytes */\n\t\t\tif(!usz && OL < woff + sz) { outbuf = realloc(outbuf, woff + sz); OL = outbuf.length; }\n\t\t\tif(typeof data.copy === 'function') {\n\t\t\t\t// $FlowIgnore\n\t\t\t\tdata.copy(outbuf, woff, boff>>>3, (boff>>>3)+sz);\n\t\t\t\twoff += sz; boff += 8*sz;\n\t\t\t} else while(sz-- > 0) { outbuf[woff++] = data[boff>>>3]; boff += 8; }\n\t\t\tcontinue;\n\t\t} else if((header >>> 1) == 1) {\n\t\t\t/* Fixed Huffman */\n\t\t\tmax_len_1 = 9; max_len_2 = 5;\n\t\t} else {\n\t\t\t/* Dynamic Huffman */\n\t\t\tboff = dyn(data, boff);\n\t\t\tmax_len_1 = dyn_len_1; max_len_2 = dyn_len_2;\n\t\t}\n\t\tif(!usz && (OL < woff + 32767)) { outbuf = realloc(outbuf, woff + 32767); OL = outbuf.length; }\n\t\tfor(;;) { // while(true) is apparently out of vogue in modern JS circles\n\t\t\t/* ingest code and move read head */\n\t\t\tvar bits = read_bits_n(data, boff, max_len_1);\n\t\t\tvar code = (header>>>1) == 1 ? fix_lmap[bits] : dyn_lmap[bits];\n\t\t\tboff += code & 15; code >>>= 4;\n\t\t\t/* 0-255 are literals, 256 is end of block token, 257+ are copy tokens */\n\t\t\tif(((code>>>8)&0xFF) === 0) outbuf[woff++] = code;\n\t\t\telse if(code == 256) break;\n\t\t\telse {\n\t\t\t\tcode -= 257;\n\t\t\t\tvar len_eb = (code < 8) ? 0 : ((code-4)>>2); if(len_eb > 5) len_eb = 0;\n\t\t\t\tvar tgt = woff + LEN_LN[code];\n\t\t\t\t/* length extra bits */\n\t\t\t\tif(len_eb > 0) {\n\t\t\t\t\ttgt += read_bits_n(data, boff, len_eb);\n\t\t\t\t\tboff += len_eb;\n\t\t\t\t}\n\n\t\t\t\t/* dist code */\n\t\t\t\tbits = read_bits_n(data, boff, max_len_2);\n\t\t\t\tcode = (header>>>1) == 1 ? fix_dmap[bits] : dyn_dmap[bits];\n\t\t\t\tboff += code & 15; code >>>= 4;\n\t\t\t\tvar dst_eb = (code < 4 ? 0 : (code-2)>>1);\n\t\t\t\tvar dst = DST_LN[code];\n\t\t\t\t/* dist extra bits */\n\t\t\t\tif(dst_eb > 0) {\n\t\t\t\t\tdst += read_bits_n(data, boff, dst_eb);\n\t\t\t\t\tboff += dst_eb;\n\t\t\t\t}\n\n\t\t\t\t/* in the common case, manual byte copy is faster than TA set / Buffer copy */\n\t\t\t\tif(!usz && OL < tgt) { outbuf = realloc(outbuf, tgt); OL = outbuf.length; }\n\t\t\t\twhile(woff < tgt) { outbuf[woff] = outbuf[woff - dst]; ++woff; }\n\t\t\t}\n\t\t}\n\t}\n\treturn [usz ? outbuf : outbuf.slice(0, woff), (boff+7)>>>3];\n}\n\nfunction _inflate(payload, usz) {\n\tvar data = payload.slice(payload.l||0);\n\tvar out = inflate(data, usz);\n\tpayload.l += out[1];\n\treturn out[0];\n}\n\nfunction warn_or_throw(wrn, msg) {\n\tif(wrn) { if(typeof console !== 'undefined') console.error(msg); }\n\telse throw new Error(msg);\n}\n\nfunction parse_zip(file, options) {\n\tvar blob = file;\n\tprep_blob(blob, 0);\n\n\tvar FileIndex = [], FullPaths = [];\n\tvar o = {\n\t\tFileIndex: FileIndex,\n\t\tFullPaths: FullPaths\n\t};\n\tinit_cfb(o, { root: options.root });\n\n\t/* find end of central directory, start just after signature */\n\tvar i = blob.length - 4;\n\twhile((blob[i] != 0x50 || blob[i+1] != 0x4b || blob[i+2] != 0x05 || blob[i+3] != 0x06) && i >= 0) --i;\n\tblob.l = i + 4;\n\n\t/* parse end of central directory */\n\tblob.l += 4;\n\tvar fcnt = blob.read_shift(2);\n\tblob.l += 6;\n\tvar start_cd = blob.read_shift(4);\n\n\t/* parse central directory */\n\tblob.l = start_cd;\n\n\tfor(i = 0; i < fcnt; ++i) {\n\t\t/* trust local file header instead of CD entry */\n\t\tblob.l += 20;\n\t\tvar csz = blob.read_shift(4);\n\t\tvar usz = blob.read_shift(4);\n\t\tvar namelen = blob.read_shift(2);\n\t\tvar efsz = blob.read_shift(2);\n\t\tvar fcsz = blob.read_shift(2);\n\t\tblob.l += 8;\n\t\tvar offset = blob.read_shift(4);\n\t\tvar EF = parse_extra_field(blob.slice(blob.l+namelen, blob.l+namelen+efsz));\n\t\tblob.l += namelen + efsz + fcsz;\n\n\t\tvar L = blob.l;\n\t\tblob.l = offset + 4;\n\t\tparse_local_file(blob, csz, usz, o, EF);\n\t\tblob.l = L;\n\t}\n\n\treturn o;\n}\n\n\n/* head starts just after local file header signature */\nfunction parse_local_file(blob, csz, usz, o, EF) {\n\t/* [local file header] */\n\tblob.l += 2;\n\tvar flags = blob.read_shift(2);\n\tvar meth = blob.read_shift(2);\n\tvar date = parse_dos_date(blob);\n\n\tif(flags & 0x2041) throw new Error(\"Unsupported ZIP encryption\");\n\tvar crc32 = blob.read_shift(4);\n\tvar _csz = blob.read_shift(4);\n\tvar _usz = blob.read_shift(4);\n\n\tvar namelen = blob.read_shift(2);\n\tvar efsz = blob.read_shift(2);\n\n\t// TODO: flags & (1<<11) // UTF8\n\tvar name = \"\"; for(var i = 0; i < namelen; ++i) name += String.fromCharCode(blob[blob.l++]);\n\tif(efsz) {\n\t\tvar ef = parse_extra_field(blob.slice(blob.l, blob.l + efsz));\n\t\tif((ef[0x5455]||{}).mt) date = ef[0x5455].mt;\n\t\tif(((EF||{})[0x5455]||{}).mt) date = EF[0x5455].mt;\n\t}\n\tblob.l += efsz;\n\n\t/* [encryption header] */\n\n\t/* [file data] */\n\tvar data = blob.slice(blob.l, blob.l + _csz);\n\tswitch(meth) {\n\t\tcase 8: data = _inflateRawSync(blob, _usz); break;\n\t\tcase 0: break;\n\t\tdefault: throw new Error(\"Unsupported ZIP Compression method \" + meth);\n\t}\n\n\t/* [data descriptor] */\n\tvar wrn = false;\n\tif(flags & 8) {\n\t\tcrc32 = blob.read_shift(4);\n\t\tif(crc32 == 0x08074b50) { crc32 = blob.read_shift(4); wrn = true; }\n\t\t_csz = blob.read_shift(4);\n\t\t_usz = blob.read_shift(4);\n\t}\n\n\tif(_csz != csz) warn_or_throw(wrn, \"Bad compressed size: \" + csz + \" != \" + _csz);\n\tif(_usz != usz) warn_or_throw(wrn, \"Bad uncompressed size: \" + usz + \" != \" + _usz);\n\tvar _crc32 = CRC32.buf(data, 0);\n\tif((crc32>>0) != (_crc32>>0)) warn_or_throw(wrn, \"Bad CRC32 checksum: \" + crc32 + \" != \" + _crc32);\n\tcfb_add(o, name, data, {unsafe: true, mt: date});\n}\nfunction write_zip(cfb, options) {\n\tvar _opts = options || {};\n\tvar out = [], cdirs = [];\n\tvar o = new_buf(1);\n\tvar method = (_opts.compression ? 8 : 0), flags = 0;\n\tvar desc = false;\n\tif(desc) flags |= 8;\n\tvar i = 0, j = 0;\n\n\tvar start_cd = 0, fcnt = 0;\n\tvar root = cfb.FullPaths[0], fp = root, fi = cfb.FileIndex[0];\n\tvar crcs = [];\n\tvar sz_cd = 0;\n\n\tfor(i = 1; i < cfb.FullPaths.length; ++i) {\n\t\tfp = cfb.FullPaths[i].slice(root.length); fi = cfb.FileIndex[i];\n\t\tif(!fi.size || !fi.content || fp == \"\\u0001Sh33tJ5\") continue;\n\t\tvar start = start_cd;\n\n\t\t/* TODO: CP437 filename */\n\t\tvar namebuf = new_buf(fp.length);\n\t\tfor(j = 0; j < fp.length; ++j) namebuf.write_shift(1, fp.charCodeAt(j) & 0x7F);\n\t\tnamebuf = namebuf.slice(0, namebuf.l);\n\t\tcrcs[fcnt] = CRC32.buf(fi.content, 0);\n\n\t\tvar outbuf = fi.content;\n\t\tif(method == 8) outbuf = _deflateRawSync(outbuf);\n\n\t\t/* local file header */\n\t\to = new_buf(30);\n\t\to.write_shift(4, 0x04034b50);\n\t\to.write_shift(2, 20);\n\t\to.write_shift(2, flags);\n\t\to.write_shift(2, method);\n\t\t/* TODO: last mod file time/date */\n\t\tif(fi.mt) write_dos_date(o, fi.mt);\n\t\telse o.write_shift(4, 0);\n\t\to.write_shift(-4, (flags & 8) ? 0 : crcs[fcnt]);\n\t\to.write_shift(4, (flags & 8) ? 0 : outbuf.length);\n\t\to.write_shift(4, (flags & 8) ? 0 : fi.content.length);\n\t\to.write_shift(2, namebuf.length);\n\t\to.write_shift(2, 0);\n\n\t\tstart_cd += o.length;\n\t\tout.push(o);\n\t\tstart_cd += namebuf.length;\n\t\tout.push(namebuf);\n\n\t\t/* TODO: encryption header ? */\n\t\tstart_cd += outbuf.length;\n\t\tout.push(outbuf);\n\n\t\t/* data descriptor */\n\t\tif(flags & 8) {\n\t\t\to = new_buf(12);\n\t\t\to.write_shift(-4, crcs[fcnt]);\n\t\t\to.write_shift(4, outbuf.length);\n\t\t\to.write_shift(4, fi.content.length);\n\t\t\tstart_cd += o.l;\n\t\t\tout.push(o);\n\t\t}\n\n\t\t/* central directory */\n\t\to = new_buf(46);\n\t\to.write_shift(4, 0x02014b50);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 20);\n\t\to.write_shift(2, flags);\n\t\to.write_shift(2, method);\n\t\to.write_shift(4, 0); /* TODO: last mod file time/date */\n\t\to.write_shift(-4, crcs[fcnt]);\n\n\t\to.write_shift(4, outbuf.length);\n\t\to.write_shift(4, fi.content.length);\n\t\to.write_shift(2, namebuf.length);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(4, 0);\n\t\to.write_shift(4, start);\n\n\t\tsz_cd += o.l;\n\t\tcdirs.push(o);\n\t\tsz_cd += namebuf.length;\n\t\tcdirs.push(namebuf);\n\t\t++fcnt;\n\t}\n\n\t/* end of central directory */\n\to = new_buf(22);\n\to.write_shift(4, 0x06054b50);\n\to.write_shift(2, 0);\n\to.write_shift(2, 0);\n\to.write_shift(2, fcnt);\n\to.write_shift(2, fcnt);\n\to.write_shift(4, sz_cd);\n\to.write_shift(4, start_cd);\n\to.write_shift(2, 0);\n\n\treturn bconcat(([bconcat((out)), bconcat(cdirs), o]));\n}\nfunction cfb_new(opts) {\n\tvar o = ({});\n\tinit_cfb(o, opts);\n\treturn o;\n}\n\nfunction cfb_add(cfb, name, content, opts) {\n\tvar unsafe = opts && opts.unsafe;\n\tif(!unsafe) init_cfb(cfb);\n\tvar file = !unsafe && CFB.find(cfb, name);\n\tif(!file) {\n\t\tvar fpath = cfb.FullPaths[0];\n\t\tif(name.slice(0, fpath.length) == fpath) fpath = name;\n\t\telse {\n\t\t\tif(fpath.slice(-1) != \"/\") fpath += \"/\";\n\t\t\tfpath = (fpath + name).replace(\"//\",\"/\");\n\t\t}\n\t\tfile = ({name: filename(name), type: 2});\n\t\tcfb.FileIndex.push(file);\n\t\tcfb.FullPaths.push(fpath);\n\t\tif(!unsafe) CFB.utils.cfb_gc(cfb);\n\t}\nfile.content = (content);\n\tfile.size = content ? content.length : 0;\n\tif(opts) {\n\t\tif(opts.CLSID) file.clsid = opts.CLSID;\n\t\tif(opts.mt) file.mt = opts.mt;\n\t\tif(opts.ct) file.ct = opts.ct;\n\t}\n\treturn file;\n}\n\nfunction cfb_del(cfb, name) {\n\tinit_cfb(cfb);\n\tvar file = CFB.find(cfb, name);\n\tif(file) for(var j = 0; j < cfb.FileIndex.length; ++j) if(cfb.FileIndex[j] == file) {\n\t\tcfb.FileIndex.splice(j, 1);\n\t\tcfb.FullPaths.splice(j, 1);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction cfb_mov(cfb, old_name, new_name) {\n\tinit_cfb(cfb);\n\tvar file = CFB.find(cfb, old_name);\n\tif(file) for(var j = 0; j < cfb.FileIndex.length; ++j) if(cfb.FileIndex[j] == file) {\n\t\tcfb.FileIndex[j].name = filename(new_name);\n\t\tcfb.FullPaths[j] = new_name;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction cfb_gc(cfb) { rebuild_cfb(cfb, true); }\n\nexports.find = find;\nexports.read = read;\nexports.parse = parse;\nexports.write = write;\nexports.writeFile = write_file;\nexports.utils = {\n\tcfb_new: cfb_new,\n\tcfb_add: cfb_add,\n\tcfb_del: cfb_del,\n\tcfb_mov: cfb_mov,\n\tcfb_gc: cfb_gc,\n\tReadShift: ReadShift,\n\tCheckField: CheckField,\n\tprep_blob: prep_blob,\n\tbconcat: bconcat,\n\tuse_zlib: use_zlib,\n\t_deflateRaw: _deflate,\n\t_inflateRaw: _inflate,\n\tconsts: consts\n};\n\nreturn exports;\n})();\n\nif(typeof require !== 'undefined' && typeof module !== 'undefined' && typeof DO_NOT_EXPORT_CFB === 'undefined') { module.exports = CFB; }\nvar _fs;\nif(typeof require !== 'undefined') try { _fs = require('fs'); } catch(e) {}\n\n/* normalize data for blob ctor */\nfunction blobify(data) {\n\tif(typeof data === \"string\") return s2ab(data);\n\tif(Array.isArray(data)) return a2u(data);\n\treturn data;\n}\n/* write or download file */\nfunction write_dl(fname, payload, enc) {\n\t/*global IE_SaveFile, Blob, navigator, saveAs, document, File, chrome */\n\tif(typeof _fs !== 'undefined' && _fs.writeFileSync) return enc ? _fs.writeFileSync(fname, payload, enc) : _fs.writeFileSync(fname, payload);\n\tvar data = (enc == \"utf8\") ? utf8write(payload) : payload;\nif(typeof IE_SaveFile !== 'undefined') return IE_SaveFile(data, fname);\n\tif(typeof Blob !== 'undefined') {\n\t\tvar blob = new Blob([blobify(data)], {type:\"application/octet-stream\"});\nif(typeof navigator !== 'undefined' && navigator.msSaveBlob) return navigator.msSaveBlob(blob, fname);\nif(typeof saveAs !== 'undefined') return saveAs(blob, fname);\n\t\tif(typeof URL !== 'undefined' && typeof document !== 'undefined' && document.createElement && URL.createObjectURL) {\n\t\t\tvar url = URL.createObjectURL(blob);\nif(typeof chrome === 'object' && typeof (chrome.downloads||{}).download == \"function\") {\n\t\t\t\tif(URL.revokeObjectURL && typeof setTimeout !== 'undefined') setTimeout(function() { URL.revokeObjectURL(url); }, 60000);\n\t\t\t\treturn chrome.downloads.download({ url: url, filename: fname, saveAs: true});\n\t\t\t}\n\t\t\tvar a = document.createElement(\"a\");\n\t\t\tif(a.download != null) {\na.download = fname; a.href = url; document.body.appendChild(a); a.click();\ndocument.body.removeChild(a);\n\t\t\t\tif(URL.revokeObjectURL && typeof setTimeout !== 'undefined') setTimeout(function() { URL.revokeObjectURL(url); }, 60000);\n\t\t\t\treturn url;\n\t\t\t}\n\t\t}\n\t}\n\t// $FlowIgnore\n\tif(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript\n\t\t// $FlowIgnore\n\t\tvar out = File(fname); out.open(\"w\"); out.encoding = \"binary\";\n\t\tif(Array.isArray(payload)) payload = a2s(payload);\n\t\tout.write(payload); out.close(); return payload;\n\t} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; }\n\tthrow new Error(\"cannot save file \" + fname);\n}\n\n/* read binary data from file */\nfunction read_binary(path) {\n\tif(typeof _fs !== 'undefined') return _fs.readFileSync(path);\n\t// $FlowIgnore\n\tif(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript\n\t\t// $FlowIgnore\n\t\tvar infile = File(path); infile.open(\"r\"); infile.encoding = \"binary\";\n\t\tvar data = infile.read(); infile.close();\n\t\treturn data;\n\t} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; }\n\tthrow new Error(\"Cannot access file \" + path);\n}\nfunction keys(o) {\n\tvar ks = Object.keys(o), o2 = [];\n\tfor(var i = 0; i < ks.length; ++i) if(Object.prototype.hasOwnProperty.call(o, ks[i])) o2.push(ks[i]);\n\treturn o2;\n}\n\nfunction evert_key(obj, key) {\n\tvar o = ([]), K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) if(o[obj[K[i]][key]] == null) o[obj[K[i]][key]] = K[i];\n\treturn o;\n}\n\nfunction evert(obj) {\n\tvar o = ([]), K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = K[i];\n\treturn o;\n}\n\nfunction evert_num(obj) {\n\tvar o = ([]), K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = parseInt(K[i],10);\n\treturn o;\n}\n\nfunction evert_arr(obj) {\n\tvar o = ([]), K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) {\n\t\tif(o[obj[K[i]]] == null) o[obj[K[i]]] = [];\n\t\to[obj[K[i]]].push(K[i]);\n\t}\n\treturn o;\n}\n\nvar basedate = new Date(1899, 11, 30, 0, 0, 0); // 2209161600000\nfunction datenum(v, date1904) {\n\tvar epoch = v.getTime();\n\tif(date1904) epoch -= 1462*24*60*60*1000;\n\tvar dnthresh = basedate.getTime() + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000;\n\treturn (epoch - dnthresh) / (24 * 60 * 60 * 1000);\n}\nvar refdate = new Date();\nvar dnthresh = basedate.getTime() + (refdate.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000;\nvar refoffset = refdate.getTimezoneOffset();\nfunction numdate(v) {\n\tvar out = new Date();\n\tout.setTime(v * 24 * 60 * 60 * 1000 + dnthresh);\n\tif (out.getTimezoneOffset() !== refoffset) {\n\t\tout.setTime(out.getTime() + (out.getTimezoneOffset() - refoffset) * 60000);\n\t}\n\treturn out;\n}\n\n/* ISO 8601 Duration */\nfunction parse_isodur(s) {\n\tvar sec = 0, mt = 0, time = false;\n\tvar m = s.match(/P([0-9\\.]+Y)?([0-9\\.]+M)?([0-9\\.]+D)?T([0-9\\.]+H)?([0-9\\.]+M)?([0-9\\.]+S)?/);\n\tif(!m) throw new Error(\"|\" + s + \"| is not an ISO8601 Duration\");\n\tfor(var i = 1; i != m.length; ++i) {\n\t\tif(!m[i]) continue;\n\t\tmt = 1;\n\t\tif(i > 3) time = true;\n\t\tswitch(m[i].slice(m[i].length-1)) {\n\t\t\tcase 'Y':\n\t\t\t\tthrow new Error(\"Unsupported ISO Duration Field: \" + m[i].slice(m[i].length-1));\n\t\t\tcase 'D': mt *= 24;\n\t\t\t\t/* falls through */\n\t\t\tcase 'H': mt *= 60;\n\t\t\t\t/* falls through */\n\t\t\tcase 'M':\n\t\t\t\tif(!time) throw new Error(\"Unsupported ISO Duration Field: M\");\n\t\t\t\telse mt *= 60;\n\t\t\t\t/* falls through */\n\t\t\tcase 'S': break;\n\t\t}\n\t\tsec += mt * parseInt(m[i], 10);\n\t}\n\treturn sec;\n}\n\nvar good_pd_date = new Date('2017-02-19T19:06:09.000Z');\nif(isNaN(good_pd_date.getFullYear())) good_pd_date = new Date('2/19/17');\nvar good_pd = good_pd_date.getFullYear() == 2017;\n/* parses a date as a local date */\nfunction parseDate(str, fixdate) {\n\tvar d = new Date(str);\n\tif(good_pd) {\nif(fixdate > 0) d.setTime(d.getTime() + d.getTimezoneOffset() * 60 * 1000);\n\t\telse if(fixdate < 0) d.setTime(d.getTime() - d.getTimezoneOffset() * 60 * 1000);\n\t\treturn d;\n\t}\n\tif(str instanceof Date) return str;\n\tif(good_pd_date.getFullYear() == 1917 && !isNaN(d.getFullYear())) {\n\t\tvar s = d.getFullYear();\n\t\tif(str.indexOf(\"\" + s) > -1) return d;\n\t\td.setFullYear(d.getFullYear() + 100); return d;\n\t}\n\tvar n = str.match(/\\d+/g)||[\"2017\",\"2\",\"19\",\"0\",\"0\",\"0\"];\n\tvar out = new Date(+n[0], +n[1] - 1, +n[2], (+n[3]||0), (+n[4]||0), (+n[5]||0));\n\tif(str.indexOf(\"Z\") > -1) out = new Date(out.getTime() - out.getTimezoneOffset() * 60 * 1000);\n\treturn out;\n}\n\nfunction cc2str(arr) {\n\tvar o = \"\";\n\tfor(var i = 0; i != arr.length; ++i) o += String.fromCharCode(arr[i]);\n\treturn o;\n}\n\nfunction dup(o) {\n\tif(typeof JSON != 'undefined' && !Array.isArray(o)) return JSON.parse(JSON.stringify(o));\n\tif(typeof o != 'object' || o == null) return o;\n\tif(o instanceof Date) return new Date(o.getTime());\n\tvar out = {};\n\tfor(var k in o) if(Object.prototype.hasOwnProperty.call(o, k)) out[k] = dup(o[k]);\n\treturn out;\n}\n\nfunction fill(c,l) { var o = \"\"; while(o.length < l) o+=c; return o; }\n\n/* TODO: stress test */\nfunction fuzzynum(s) {\n\tvar v = Number(s);\n\tif(isFinite(v)) return v;\n\tif(!isNaN(v)) return NaN;\n\tif(!/\\d/.test(s)) return v;\n\tvar wt = 1;\n\tvar ss = s.replace(/([\\d]),([\\d])/g,\"$1$2\").replace(/[$]/g,\"\").replace(/[%]/g, function() { wt *= 100; return \"\";});\n\tif(!isNaN(v = Number(ss))) return v / wt;\n\tss = ss.replace(/[(](.*)[)]/,function($$, $1) { wt = -wt; return $1;});\n\tif(!isNaN(v = Number(ss))) return v / wt;\n\treturn v;\n}\nfunction fuzzydate(s) {\n\tvar o = new Date(s), n = new Date(NaN);\n\tvar y = o.getYear(), m = o.getMonth(), d = o.getDate();\n\tif(isNaN(d)) return n;\n\tif(y < 0 || y > 8099) return n;\n\tif((m > 0 || d > 1) && y != 101) return o;\n\tif(s.toLowerCase().match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) return o;\n\tif(s.match(/[^-0-9:,\\/\\\\]/)) return n;\n\treturn o;\n}\n\nvar safe_split_regex = \"abacaba\".split(/(:?b)/i).length == 5;\nfunction split_regex(str, re, def) {\n\tif(safe_split_regex || typeof re == \"string\") return str.split(re);\n\tvar p = str.split(re), o = [p[0]];\n\tfor(var i = 1; i < p.length; ++i) { o.push(def); o.push(p[i]); }\n\treturn o;\n}\nfunction getdatastr(data) {\n\tif(!data) return null;\n\tif(data.data) return debom(data.data);\n\tif(data.asNodeBuffer && has_buf) return debom(data.asNodeBuffer().toString('binary'));\n\tif(data.asBinary) return debom(data.asBinary());\n\tif(data._data && data._data.getContent) return debom(cc2str(Array.prototype.slice.call(data._data.getContent(),0)));\n\tif(data.content && data.type) return debom(cc2str(data.content));\n\treturn null;\n}\n\nfunction getdatabin(data) {\n\tif(!data) return null;\n\tif(data.data) return char_codes(data.data);\n\tif(data.asNodeBuffer && has_buf) return data.asNodeBuffer();\n\tif(data._data && data._data.getContent) {\n\t\tvar o = data._data.getContent();\n\t\tif(typeof o == \"string\") return char_codes(o);\n\t\treturn Array.prototype.slice.call(o);\n\t}\n\tif(data.content && data.type) return data.content;\n\treturn null;\n}\n\nfunction getdata(data) { return (data && data.name.slice(-4) === \".bin\") ? getdatabin(data) : getdatastr(data); }\n\n/* Part 2 Section 10.1.2 \"Mapping Content Types\" Names are case-insensitive */\n/* OASIS does not comment on filename case sensitivity */\nfunction safegetzipfile(zip, file) {\n\tvar k = zip.FullPaths || keys(zip.files);\n\tvar f = file.toLowerCase().replace(/[\\/]/g, '\\\\'), g = f.replace(/\\\\/g,'\\/');\n\tfor(var i=0; i\\/]+)\\s*=\\s*((?:\")([^\"]*)(?:\")|(?:')([^']*)(?:')|([^'\">\\s]+))/g;\nvar tagregex=/<[\\/\\?]?[a-zA-Z0-9:_-]+(?:\\s+[^\"\\s?>\\/]+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^'\">\\s=]+))*\\s*[\\/\\?]?>/mg;\n\nif(!(XML_HEADER.match(tagregex))) tagregex = /<[^>]*>/g;\nvar nsregex=/<\\w*:/, nsregex2 = /<(\\/?)\\w+:/;\nfunction parsexmltag(tag, skip_root, skip_LC) {\n\tvar z = ({});\n\tvar eq = 0, c = 0;\n\tfor(; eq !== tag.length; ++eq) if((c = tag.charCodeAt(eq)) === 32 || c === 10 || c === 13) break;\n\tif(!skip_root) z[0] = tag.slice(0, eq);\n\tif(eq === tag.length) return z;\n\tvar m = tag.match(attregexg), j=0, v=\"\", i=0, q=\"\", cc=\"\", quot = 1;\n\tif(m) for(i = 0; i != m.length; ++i) {\n\t\tcc = m[i];\n\t\tfor(c=0; c != cc.length; ++c) if(cc.charCodeAt(c) === 61) break;\n\t\tq = cc.slice(0,c).trim();\n\t\twhile(cc.charCodeAt(c+1) == 32) ++c;\n\t\tquot = ((eq=cc.charCodeAt(c+1)) == 34 || eq == 39) ? 1 : 0;\n\t\tv = cc.slice(c+1+quot, cc.length-quot);\n\t\tfor(j=0;j!=q.length;++j) if(q.charCodeAt(j) === 58) break;\n\t\tif(j===q.length) {\n\t\t\tif(q.indexOf(\"_\") > 0) q = q.slice(0, q.indexOf(\"_\")); // from ods\n\t\t\tz[q] = v;\n\t\t\tif(!skip_LC) z[q.toLowerCase()] = v;\n\t\t}\n\t\telse {\n\t\t\tvar k = (j===5 && q.slice(0,5)===\"xmlns\"?\"xmlns\":\"\")+q.slice(j+1);\n\t\t\tif(z[k] && q.slice(j-3,j) == \"ext\") continue; // from ods\n\t\t\tz[k] = v;\n\t\t\tif(!skip_LC) z[k.toLowerCase()] = v;\n\t\t}\n\t}\n\treturn z;\n}\nfunction strip_ns(x) { return x.replace(nsregex2, \"<$1\"); }\n\nvar encodings = {\n\t'"': '\"',\n\t''': \"'\",\n\t'>': '>',\n\t'<': '<',\n\t'&': '&'\n};\nvar rencoding = evert(encodings);\n//var rencstr = \"&<>'\\\"\".split(\"\");\n\n// TODO: CP remap (need to read file version to determine OS)\nvar unescapexml = (function() {\n\t/* 22.4.2.4 bstr (Basic String) */\n\tvar encregex = /&(?:quot|apos|gt|lt|amp|#x?([\\da-fA-F]+));/ig, coderegex = /_x([\\da-fA-F]{4})_/ig;\n\treturn function unescapexml(text) {\n\t\tvar s = text + '', i = s.indexOf(\"-1?16:10))||$$; }).replace(coderegex,function(m,c) {return String.fromCharCode(parseInt(c,16));});\n\t\tvar j = s.indexOf(\"]]>\");\n\t\treturn unescapexml(s.slice(0, i)) + s.slice(i+9,j) + unescapexml(s.slice(j+3));\n\t};\n})();\n\nvar decregex=/[&<>'\"]/g, charegex = /[\\u0000-\\u0008\\u000b-\\u001f]/g;\nfunction escapexml(text){\n\tvar s = text + '';\n\treturn s.replace(decregex, function(y) { return rencoding[y]; }).replace(charegex,function(s) { return \"_x\" + (\"000\"+s.charCodeAt(0).toString(16)).slice(-4) + \"_\";});\n}\nfunction escapexmltag(text){ return escapexml(text).replace(/ /g,\"_x0020_\"); }\n\nvar htmlcharegex = /[\\u0000-\\u001f]/g;\nfunction escapehtml(text){\n\tvar s = text + '';\n\treturn s.replace(decregex, function(y) { return rencoding[y]; }).replace(/\\n/g, \"
\").replace(htmlcharegex,function(s) { return \"&#x\" + (\"000\"+s.charCodeAt(0).toString(16)).slice(-4) + \";\"; });\n}\n\nfunction escapexlml(text){\n\tvar s = text + '';\n\treturn s.replace(decregex, function(y) { return rencoding[y]; }).replace(htmlcharegex,function(s) { return \"&#x\" + (s.charCodeAt(0).toString(16)).toUpperCase() + \";\"; });\n}\n\n/* TODO: handle codepages */\nvar xlml_fixstr = (function() {\n\tvar entregex = /&#(\\d+);/g;\n\tfunction entrepl($$,$1) { return String.fromCharCode(parseInt($1,10)); }\n\treturn function xlml_fixstr(str) { return str.replace(entregex,entrepl); };\n})();\nvar xlml_unfixstr = (function() {\n\treturn function xlml_unfixstr(str) { return str.replace(/(\\r\\n|[\\r\\n])/g,\"\\ \"); };\n})();\n\nfunction parsexmlbool(value) {\n\tswitch(value) {\n\t\tcase 1: case true: case '1': case 'true': case 'TRUE': return true;\n\t\t/* case '0': case 'false': case 'FALSE':*/\n\t\tdefault: return false;\n\t}\n}\n\nvar utf8read = function utf8reada(orig) {\n\tvar out = \"\", i = 0, c = 0, d = 0, e = 0, f = 0, w = 0;\n\twhile (i < orig.length) {\n\t\tc = orig.charCodeAt(i++);\n\t\tif (c < 128) { out += String.fromCharCode(c); continue; }\n\t\td = orig.charCodeAt(i++);\n\t\tif (c>191 && c<224) { f = ((c & 31) << 6); f |= (d & 63); out += String.fromCharCode(f); continue; }\n\t\te = orig.charCodeAt(i++);\n\t\tif (c < 240) { out += String.fromCharCode(((c & 15) << 12) | ((d & 63) << 6) | (e & 63)); continue; }\n\t\tf = orig.charCodeAt(i++);\n\t\tw = (((c & 7) << 18) | ((d & 63) << 12) | ((e & 63) << 6) | (f & 63))-65536;\n\t\tout += String.fromCharCode(0xD800 + ((w>>>10)&1023));\n\t\tout += String.fromCharCode(0xDC00 + (w&1023));\n\t}\n\treturn out;\n};\n\nvar utf8write = function(orig) {\n\tvar out = [], i = 0, c = 0, d = 0;\n\twhile(i < orig.length) {\n\t\tc = orig.charCodeAt(i++);\n\t\tswitch(true) {\n\t\t\tcase c < 128: out.push(String.fromCharCode(c)); break;\n\t\t\tcase c < 2048:\n\t\t\t\tout.push(String.fromCharCode(192 + (c >> 6)));\n\t\t\t\tout.push(String.fromCharCode(128 + (c & 63)));\n\t\t\t\tbreak;\n\t\t\tcase c >= 55296 && c < 57344:\n\t\t\t\tc -= 55296; d = orig.charCodeAt(i++) - 56320 + (c<<10);\n\t\t\t\tout.push(String.fromCharCode(240 + ((d >>18) & 7)));\n\t\t\t\tout.push(String.fromCharCode(144 + ((d >>12) & 63)));\n\t\t\t\tout.push(String.fromCharCode(128 + ((d >> 6) & 63)));\n\t\t\t\tout.push(String.fromCharCode(128 + (d & 63)));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tout.push(String.fromCharCode(224 + (c >> 12)));\n\t\t\t\tout.push(String.fromCharCode(128 + ((c >> 6) & 63)));\n\t\t\t\tout.push(String.fromCharCode(128 + (c & 63)));\n\t\t}\n\t}\n\treturn out.join(\"\");\n};\n\nif(has_buf) {\n\tvar utf8readb = function utf8readb(data) {\n\t\tvar out = Buffer.alloc(2*data.length), w, i, j = 1, k = 0, ww=0, c;\n\t\tfor(i = 0; i < data.length; i+=j) {\n\t\t\tj = 1;\n\t\t\tif((c=data.charCodeAt(i)) < 128) w = c;\n\t\t\telse if(c < 224) { w = (c&31)*64+(data.charCodeAt(i+1)&63); j=2; }\n\t\t\telse if(c < 240) { w=(c&15)*4096+(data.charCodeAt(i+1)&63)*64+(data.charCodeAt(i+2)&63); j=3; }\n\t\t\telse { j = 4;\n\t\t\t\tw = (c & 7)*262144+(data.charCodeAt(i+1)&63)*4096+(data.charCodeAt(i+2)&63)*64+(data.charCodeAt(i+3)&63);\n\t\t\t\tw -= 65536; ww = 0xD800 + ((w>>>10)&1023); w = 0xDC00 + (w&1023);\n\t\t\t}\n\t\t\tif(ww !== 0) { out[k++] = ww&255; out[k++] = ww>>>8; ww = 0; }\n\t\t\tout[k++] = w%256; out[k++] = w>>>8;\n\t\t}\n\t\treturn out.slice(0,k).toString('ucs2');\n\t};\n\tvar corpus = \"foo bar baz\\u00e2\\u0098\\u0083\\u00f0\\u009f\\u008d\\u00a3\";\n\tif(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb;\n\tvar utf8readc = function utf8readc(data) { return Buffer_from(data, 'binary').toString('utf8'); };\n\tif(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc;\n\n\tutf8write = function(data) { return Buffer_from(data, 'utf8').toString(\"binary\"); };\n}\n\n// matches ... extracts content\nvar matchtag = (function() {\n\tvar mtcache = ({});\n\treturn function matchtag(f,g) {\n\t\tvar t = f+\"|\"+(g||\"\");\n\t\tif(mtcache[t]) return mtcache[t];\n\t\treturn (mtcache[t] = new RegExp('<(?:\\\\w+:)?'+f+'(?: xml:space=\"preserve\")?(?:[^>]*)>([\\\\s\\\\S]*?)',((g||\"\"))));\n\t};\n})();\n\nvar htmldecode = (function() {\n\tvar entities = [\n\t\t['nbsp', ' '], ['middot', '·'],\n\t\t['quot', '\"'], ['apos', \"'\"], ['gt', '>'], ['lt', '<'], ['amp', '&']\n\t].map(function(x) { return [new RegExp('&' + x[0] + ';', \"ig\"), x[1]]; });\n\treturn function htmldecode(str) {\n\t\tvar o = str\n\t\t\t\t// Remove new lines and spaces from start of content\n\t\t\t\t.replace(/^[\\t\\n\\r ]+/, \"\")\n\t\t\t\t// Remove new lines and spaces from end of content\n\t\t\t\t.replace(/[\\t\\n\\r ]+$/,\"\")\n\t\t\t\t// Added line which removes any white space characters after and before html tags\n\t\t\t\t.replace(/>\\s+/g,\">\").replace(/\\s+ tags with new lines\n\t\t\t\t.replace(/<\\s*[bB][rR]\\s*\\/?>/g,\"\\n\")\n\t\t\t\t// Strip HTML elements\n\t\t\t\t.replace(/<[^>]*>/g,\"\");\n\t\tfor(var i = 0; i < entities.length; ++i) o = o.replace(entities[i][0], entities[i][1]);\n\t\treturn o;\n\t};\n})();\n\nvar vtregex = (function(){ var vt_cache = {};\n\treturn function vt_regex(bt) {\n\t\tif(vt_cache[bt] !== undefined) return vt_cache[bt];\n\t\treturn (vt_cache[bt] = new RegExp(\"<(?:vt:)?\" + bt + \">([\\\\s\\\\S]*?)\", 'g') );\n};})();\nvar vtvregex = /<\\/?(?:vt:)?variant>/g, vtmregex = /<(?:vt:)([^>]*)>([\\s\\S]*)' + g + ''; }\n\nfunction wxt_helper(h) { return keys(h).map(function(k) { return \" \" + k + '=\"' + h[k] + '\"';}).join(\"\"); }\nfunction writextag(f,g,h) { return '<' + f + ((h != null) ? wxt_helper(h) : \"\") + ((g != null) ? (g.match(wtregex)?' xml:space=\"preserve\"' : \"\") + '>' + g + '';}\n\nfunction write_w3cdtf(d, t) { try { return d.toISOString().replace(/\\.\\d*/,\"\"); } catch(e) { if(t) throw e; } return \"\"; }\n\nfunction write_vt(s, xlsx) {\n\tswitch(typeof s) {\n\t\tcase 'string':\n\t\t\tvar o = writextag('vt:lpwstr', escapexml(s));\n\t\t\tif(xlsx) o = o.replace(/"/g, \"_x0022_\");\n\t\t\treturn o;\n\t\tcase 'number': return writextag((s|0)==s?'vt:i4':'vt:r8', escapexml(String(s)));\n\t\tcase 'boolean': return writextag('vt:bool',s?'true':'false');\n\t}\n\tif(s instanceof Date) return writextag('vt:filetime', write_w3cdtf(s));\n\tthrow new Error(\"Unable to serialize \" + s);\n}\n\nvar XMLNS = ({\n\t'dc': 'http://purl.org/dc/elements/1.1/',\n\t'dcterms': 'http://purl.org/dc/terms/',\n\t'dcmitype': 'http://purl.org/dc/dcmitype/',\n\t'mx': 'http://schemas.microsoft.com/office/mac/excel/2008/main',\n\t'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n\t'sjs': 'http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties',\n\t'vt': 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes',\n\t'xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n\t'xsd': 'http://www.w3.org/2001/XMLSchema'\n});\n\nXMLNS.main = [\n\t'http://schemas.openxmlformats.org/spreadsheetml/2006/main',\n\t'http://purl.oclc.org/ooxml/spreadsheetml/main',\n\t'http://schemas.microsoft.com/office/excel/2006/main',\n\t'http://schemas.microsoft.com/office/excel/2006/2'\n];\n\nvar XLMLNS = ({\n\t'o': 'urn:schemas-microsoft-com:office:office',\n\t'x': 'urn:schemas-microsoft-com:office:excel',\n\t'ss': 'urn:schemas-microsoft-com:office:spreadsheet',\n\t'dt': 'uuid:C2F41010-65B3-11d1-A29F-00AA00C14882',\n\t'mv': 'http://macVmlSchemaUri',\n\t'v': 'urn:schemas-microsoft-com:vml',\n\t'html': 'http://www.w3.org/TR/REC-html40'\n});\nfunction read_double_le(b, idx) {\n\tvar s = 1 - 2 * (b[idx + 7] >>> 7);\n\tvar e = ((b[idx + 7] & 0x7f) << 4) + ((b[idx + 6] >>> 4) & 0x0f);\n\tvar m = (b[idx+6]&0x0f);\n\tfor(var i = 5; i >= 0; --i) m = m * 256 + b[idx + i];\n\tif(e == 0x7ff) return m == 0 ? (s * Infinity) : NaN;\n\tif(e == 0) e = -1022;\n\telse { e -= 1023; m += Math.pow(2,52); }\n\treturn s * Math.pow(2, e - 52) * m;\n}\n\nfunction write_double_le(b, v, idx) {\n\tvar bs = ((((v < 0) || (1/v == -Infinity)) ? 1 : 0) << 7), e = 0, m = 0;\n\tvar av = bs ? (-v) : v;\n\tif(!isFinite(av)) { e = 0x7ff; m = isNaN(v) ? 0x6969 : 0; }\n\telse if(av == 0) e = m = 0;\n\telse {\n\t\te = Math.floor(Math.log(av) / Math.LN2);\n\t\tm = av * Math.pow(2, 52 - e);\n\t\tif((e <= -1023) && (!isFinite(m) || (m < Math.pow(2,52)))) { e = -1022; }\n\t\telse { m -= Math.pow(2,52); e+=1023; }\n\t}\n\tfor(var i = 0; i <= 5; ++i, m/=256) b[idx + i] = m & 0xff;\n\tb[idx + 6] = ((e & 0x0f) << 4) | (m & 0xf);\n\tb[idx + 7] = (e >> 4) | bs;\n}\n\nvar __toBuffer = function(bufs) { var x=[],w=10240; for(var i=0;i 0 ? __utf8(b, i+4,i+4+len-1) : \"\";};\nvar ___lpstr = __lpstr;\nvar __cpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : \"\";};\nvar ___cpstr = __cpstr;\nvar __lpwstr = function(b,i) { var len = 2*__readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : \"\";};\nvar ___lpwstr = __lpwstr;\nvar __lpp4, ___lpp4;\n__lpp4 = ___lpp4 = function lpp4_(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf16le(b, i+4,i+4+len) : \"\";};\nvar __8lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len) : \"\";};\nvar ___8lpp4 = __8lpp4;\nvar __double, ___double;\n__double = ___double = function(b, idx) { return read_double_le(b, idx);};\nvar is_buf = function is_buf_a(a) { return Array.isArray(a); };\n\nif(has_buf) {\n\t__utf16le = function(b,s,e) { if(!Buffer.isBuffer(b)) return ___utf16le(b,s,e); return b.toString('utf16le',s,e).replace(chr0,'')/*.replace(chr1,'!')*/; };\n\t__hexlify = function(b,s,l) { return Buffer.isBuffer(b) ? b.toString('hex',s,s+l) : ___hexlify(b,s,l); };\n\t__lpstr = function lpstr_b(b, i) { if(!Buffer.isBuffer(b)) return ___lpstr(b, i); var len = b.readUInt32LE(i); return len > 0 ? b.toString('utf8',i+4,i+4+len-1) : \"\";};\n\t__cpstr = function cpstr_b(b, i) { if(!Buffer.isBuffer(b)) return ___cpstr(b, i); var len = b.readUInt32LE(i); return len > 0 ? b.toString('utf8',i+4,i+4+len-1) : \"\";};\n\t__lpwstr = function lpwstr_b(b, i) { if(!Buffer.isBuffer(b)) return ___lpwstr(b, i); var len = 2*b.readUInt32LE(i); return b.toString('utf16le',i+4,i+4+len-1);};\n\t__lpp4 = function lpp4_b(b, i) { if(!Buffer.isBuffer(b)) return ___lpp4(b, i); var len = b.readUInt32LE(i); return b.toString('utf16le',i+4,i+4+len);};\n\t__8lpp4 = function lpp4_8b(b, i) { if(!Buffer.isBuffer(b)) return ___8lpp4(b, i); var len = b.readUInt32LE(i); return b.toString('utf8',i+4,i+4+len);};\n\t__utf8 = function utf8_b(b, s, e) { return (Buffer.isBuffer(b)) ? b.toString('utf8',s,e) : ___utf8(b,s,e); };\n\t__toBuffer = function(bufs) { return (bufs[0].length > 0 && Buffer.isBuffer(bufs[0][0])) ? Buffer.concat(bufs[0]) : ___toBuffer(bufs);};\n\tbconcat = function(bufs) { return Buffer.isBuffer(bufs[0]) ? Buffer.concat(bufs) : [].concat.apply([], bufs); };\n\t__double = function double_(b, i) { if(Buffer.isBuffer(b)) return b.readDoubleLE(i); return ___double(b,i); };\n\tis_buf = function is_buf_b(a) { return Buffer.isBuffer(a) || Array.isArray(a); };\n}\n\n/* from js-xls */\nif(typeof cptable !== 'undefined') {\n\t__utf16le = function(b,s,e) { return cptable.utils.decode(1200, b.slice(s,e)).replace(chr0, ''); };\n\t__utf8 = function(b,s,e) { return cptable.utils.decode(65001, b.slice(s,e)); };\n\t__lpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(current_ansi, b.slice(i+4, i+4+len-1)) : \"\";};\n\t__cpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(current_codepage, b.slice(i+4, i+4+len-1)) : \"\";};\n\t__lpwstr = function(b,i) { var len = 2*__readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(1200, b.slice(i+4,i+4+len-1)) : \"\";};\n\t__lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(1200, b.slice(i+4,i+4+len)) : \"\";};\n\t__8lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(65001, b.slice(i+4,i+4+len)) : \"\";};\n}\n\nvar __readUInt8 = function(b, idx) { return b[idx]; };\nvar __readUInt16LE = function(b, idx) { return (b[idx+1]*(1<<8))+b[idx]; };\nvar __readInt16LE = function(b, idx) { var u = (b[idx+1]*(1<<8))+b[idx]; return (u < 0x8000) ? u : ((0xffff - u + 1) * -1); };\nvar __readUInt32LE = function(b, idx) { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; };\nvar __readInt32LE = function(b, idx) { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; };\nvar __readInt32BE = function(b, idx) { return (b[idx]<<24)|(b[idx+1]<<16)|(b[idx+2]<<8)|b[idx+3]; };\n\nfunction ReadShift(size, t) {\n\tvar o=\"\", oI, oR, oo=[], w, vv, i, loc;\n\tswitch(t) {\n\t\tcase 'dbcs':\n\t\t\tloc = this.l;\n\t\t\tif(has_buf && Buffer.isBuffer(this)) o = this.slice(this.l, this.l+2*size).toString(\"utf16le\");\n\t\t\telse for(i = 0; i < size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; }\n\t\t\tsize *= 2;\n\t\t\tbreak;\n\n\t\tcase 'utf8': o = __utf8(this, this.l, this.l + size); break;\n\t\tcase 'utf16le': size *= 2; o = __utf16le(this, this.l, this.l + size); break;\n\n\t\tcase 'wstr':\n\t\t\tif(typeof cptable !== 'undefined') o = cptable.utils.decode(current_codepage, this.slice(this.l, this.l+2*size));\n\t\t\telse return ReadShift.call(this, size, 'dbcs');\n\t\t\tsize = 2 * size; break;\n\n\t\t/* [MS-OLEDS] 2.1.4 LengthPrefixedAnsiString */\n\t\tcase 'lpstr-ansi': o = __lpstr(this, this.l); size = 4 + __readUInt32LE(this, this.l); break;\n\t\tcase 'lpstr-cp': o = __cpstr(this, this.l); size = 4 + __readUInt32LE(this, this.l); break;\n\t\t/* [MS-OLEDS] 2.1.5 LengthPrefixedUnicodeString */\n\t\tcase 'lpwstr': o = __lpwstr(this, this.l); size = 4 + 2 * __readUInt32LE(this, this.l); break;\n\t\t/* [MS-OFFCRYPTO] 2.1.2 Length-Prefixed Padded Unicode String (UNICODE-LP-P4) */\n\t\tcase 'lpp4': size = 4 + __readUInt32LE(this, this.l); o = __lpp4(this, this.l); if(size & 0x02) size += 2; break;\n\t\t/* [MS-OFFCRYPTO] 2.1.3 Length-Prefixed UTF-8 String (UTF-8-LP-P4) */\n\t\tcase '8lpp4': size = 4 + __readUInt32LE(this, this.l); o = __8lpp4(this, this.l); if(size & 0x03) size += 4 - (size & 0x03); break;\n\n\t\tcase 'cstr': size = 0; o = \"\";\n\t\t\twhile((w=__readUInt8(this, this.l + size++))!==0) oo.push(_getchar(w));\n\t\t\to = oo.join(\"\"); break;\n\t\tcase '_wstr': size = 0; o = \"\";\n\t\t\twhile((w=__readUInt16LE(this,this.l +size))!==0){oo.push(_getchar(w));size+=2;}\n\t\t\tsize+=2; o = oo.join(\"\"); break;\n\n\t\t/* sbcs and dbcs support continue records in the SST way TODO codepages */\n\t\tcase 'dbcs-cont': o = \"\"; loc = this.l;\n\t\t\tfor(i = 0; i < size; ++i) {\n\t\t\t\tif(this.lens && this.lens.indexOf(loc) !== -1) {\n\t\t\t\t\tw = __readUInt8(this, loc);\n\t\t\t\t\tthis.l = loc + 1;\n\t\t\t\t\tvv = ReadShift.call(this, size-i, w ? 'dbcs-cont' : 'sbcs-cont');\n\t\t\t\t\treturn oo.join(\"\") + vv;\n\t\t\t\t}\n\t\t\t\too.push(_getchar(__readUInt16LE(this, loc)));\n\t\t\t\tloc+=2;\n\t\t\t} o = oo.join(\"\"); size *= 2; break;\n\n\t\tcase 'cpstr':\n\t\t\tif(typeof cptable !== 'undefined') {\n\t\t\t\to = cptable.utils.decode(current_codepage, this.slice(this.l, this.l + size));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t/* falls through */\n\t\tcase 'sbcs-cont': o = \"\"; loc = this.l;\n\t\t\tfor(i = 0; i != size; ++i) {\n\t\t\t\tif(this.lens && this.lens.indexOf(loc) !== -1) {\n\t\t\t\t\tw = __readUInt8(this, loc);\n\t\t\t\t\tthis.l = loc + 1;\n\t\t\t\t\tvv = ReadShift.call(this, size-i, w ? 'dbcs-cont' : 'sbcs-cont');\n\t\t\t\t\treturn oo.join(\"\") + vv;\n\t\t\t\t}\n\t\t\t\too.push(_getchar(__readUInt8(this, loc)));\n\t\t\t\tloc+=1;\n\t\t\t} o = oo.join(\"\"); break;\n\n\t\tdefault:\n\tswitch(size) {\n\t\tcase 1: oI = __readUInt8(this, this.l); this.l++; return oI;\n\t\tcase 2: oI = (t === 'i' ? __readInt16LE : __readUInt16LE)(this, this.l); this.l += 2; return oI;\n\t\tcase 4: case -4:\n\t\t\tif(t === 'i' || ((this[this.l+3] & 0x80)===0)) { oI = ((size > 0) ? __readInt32LE : __readInt32BE)(this, this.l); this.l += 4; return oI; }\n\t\t\telse { oR = __readUInt32LE(this, this.l); this.l += 4; } return oR;\n\t\tcase 8: case -8:\n\t\t\tif(t === 'f') {\n\t\t\t\tif(size == 8) oR = __double(this, this.l);\n\t\t\t\telse oR = __double([this[this.l+7],this[this.l+6],this[this.l+5],this[this.l+4],this[this.l+3],this[this.l+2],this[this.l+1],this[this.l+0]], 0);\n\t\t\t\tthis.l += 8; return oR;\n\t\t\t} else size = 8;\n\t\t/* falls through */\n\t\tcase 16: o = __hexlify(this, this.l, size); break;\n\t}}\n\tthis.l+=size; return o;\n}\n\nvar __writeUInt32LE = function(b, val, idx) { b[idx] = (val & 0xFF); b[idx+1] = ((val >>> 8) & 0xFF); b[idx+2] = ((val >>> 16) & 0xFF); b[idx+3] = ((val >>> 24) & 0xFF); };\nvar __writeInt32LE = function(b, val, idx) { b[idx] = (val & 0xFF); b[idx+1] = ((val >> 8) & 0xFF); b[idx+2] = ((val >> 16) & 0xFF); b[idx+3] = ((val >> 24) & 0xFF); };\nvar __writeUInt16LE = function(b, val, idx) { b[idx] = (val & 0xFF); b[idx+1] = ((val >>> 8) & 0xFF); };\n\nfunction WriteShift(t, val, f) {\n\tvar size = 0, i = 0;\n\tif(f === 'dbcs') {\nfor(i = 0; i != val.length; ++i) __writeUInt16LE(this, val.charCodeAt(i), this.l + 2 * i);\n\t\tsize = 2 * val.length;\n\t} else if(f === 'sbcs') {\n\t\tif(typeof cptable !== 'undefined' && current_ansi == 874) {\n\t\t\t/* TODO: use tables directly, don't encode */\nfor(i = 0; i != val.length; ++i) {\n\t\t\t\tvar cppayload = cptable.utils.encode(current_ansi, val.charAt(i));\n\t\t\t\tthis[this.l + i] = cppayload[0];\n\t\t\t}\n\t\t} else {\nval = val.replace(/[^\\x00-\\x7F]/g, \"_\");\nfor(i = 0; i != val.length; ++i) this[this.l + i] = (val.charCodeAt(i) & 0xFF);\n\t\t}\n\t\tsize = val.length;\n\t} else if(f === 'hex') {\n\t\tfor(; i < t; ++i) {\nthis[this.l++] = (parseInt(val.slice(2*i, 2*i+2), 16)||0);\n\t\t} return this;\n\t} else if(f === 'utf16le') {\nvar end = Math.min(this.l + t, this.length);\n\t\t\tfor(i = 0; i < Math.min(val.length, t); ++i) {\n\t\t\t\tvar cc = val.charCodeAt(i);\n\t\t\t\tthis[this.l++] = (cc & 0xff);\n\t\t\t\tthis[this.l++] = (cc >> 8);\n\t\t\t}\n\t\t\twhile(this.l < end) this[this.l++] = 0;\n\t\t\treturn this;\n\t} else switch(t) {\n\t\tcase 1: size = 1; this[this.l] = val&0xFF; break;\n\t\tcase 2: size = 2; this[this.l] = val&0xFF; val >>>= 8; this[this.l+1] = val&0xFF; break;\n\t\tcase 3: size = 3; this[this.l] = val&0xFF; val >>>= 8; this[this.l+1] = val&0xFF; val >>>= 8; this[this.l+2] = val&0xFF; break;\n\t\tcase 4: size = 4; __writeUInt32LE(this, val, this.l); break;\n\t\tcase 8: size = 8; if(f === 'f') { write_double_le(this, val, this.l); break; }\n\t\t/* falls through */\n\t\tcase 16: break;\n\t\tcase -4: size = 4; __writeInt32LE(this, val, this.l); break;\n\t}\n\tthis.l += size; return this;\n}\n\nfunction CheckField(hexstr, fld) {\n\tvar m = __hexlify(this,this.l,hexstr.length>>1);\n\tif(m !== hexstr) throw new Error(fld + 'Expected ' + hexstr + ' saw ' + m);\n\tthis.l += hexstr.length>>1;\n}\n\nfunction prep_blob(blob, pos) {\n\tblob.l = pos;\n\tblob.read_shift = ReadShift;\n\tblob.chk = CheckField;\n\tblob.write_shift = WriteShift;\n}\n\nfunction parsenoop(blob, length) { blob.l += length; }\n\nfunction new_buf(sz) {\n\tvar o = new_raw_buf(sz);\n\tprep_blob(o, 0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.1.4 Record */\nfunction recordhopper(data, cb, opts) {\n\tif(!data) return;\n\tvar tmpbyte, cntbyte, length;\n\tprep_blob(data, data.l || 0);\n\tvar L = data.length, RT = 0, tgt = 0;\n\twhile(data.l < L) {\n\t\tRT = data.read_shift(1);\n\t\tif(RT & 0x80) RT = (RT & 0x7F) + ((data.read_shift(1) & 0x7F)<<7);\n\t\tvar R = XLSBRecordEnum[RT] || XLSBRecordEnum[0xFFFF];\n\t\ttmpbyte = data.read_shift(1);\n\t\tlength = tmpbyte & 0x7F;\n\t\tfor(cntbyte = 1; cntbyte <4 && (tmpbyte & 0x80); ++cntbyte) length += ((tmpbyte = data.read_shift(1)) & 0x7F)<<(7*cntbyte);\n\t\ttgt = data.l + length;\n\t\tvar d = R.f && R.f(data, length, opts);\n\t\tdata.l = tgt;\n\t\tif(cb(d, R.n, RT)) return;\n\t}\n}\n\n/* control buffer usage for fixed-length buffers */\nfunction buf_array() {\n\tvar bufs = [], blksz = has_buf ? 256 : 2048;\n\tvar newblk = function ba_newblk(sz) {\n\t\tvar o = (new_buf(sz));\n\t\tprep_blob(o, 0);\n\t\treturn o;\n\t};\n\n\tvar curbuf = newblk(blksz);\n\n\tvar endbuf = function ba_endbuf() {\n\t\tif(!curbuf) return;\n\t\tif(curbuf.length > curbuf.l) { curbuf = curbuf.slice(0, curbuf.l); curbuf.l = curbuf.length; }\n\t\tif(curbuf.length > 0) bufs.push(curbuf);\n\t\tcurbuf = null;\n\t};\n\n\tvar next = function ba_next(sz) {\n\t\tif(curbuf && (sz < (curbuf.length - curbuf.l))) return curbuf;\n\t\tendbuf();\n\t\treturn (curbuf = newblk(Math.max(sz+1, blksz)));\n\t};\n\n\tvar end = function ba_end() {\n\t\tendbuf();\n\t\treturn __toBuffer([bufs]);\n\t};\n\n\tvar push = function ba_push(buf) { endbuf(); curbuf = buf; if(curbuf.l == null) curbuf.l = curbuf.length; next(blksz); };\n\n\treturn ({ next:next, push:push, end:end, _bufs:bufs });\n}\n\nfunction write_record(ba, type, payload, length) {\n\tvar t = +XLSBRE[type], l;\n\tif(isNaN(t)) return; // TODO: throw something here?\n\tif(!length) length = XLSBRecordEnum[t].p || (payload||[]).length || 0;\n\tl = 1 + (t >= 0x80 ? 1 : 0) + 1/* + length*/;\n\tif(length >= 0x80) ++l; if(length >= 0x4000) ++l; if(length >= 0x200000) ++l;\n\tvar o = ba.next(l);\n\tif(t <= 0x7F) o.write_shift(1, t);\n\telse {\n\t\to.write_shift(1, (t & 0x7F) + 0x80);\n\t\to.write_shift(1, (t >> 7));\n\t}\n\tfor(var i = 0; i != 4; ++i) {\n\t\tif(length >= 0x80) { o.write_shift(1, (length & 0x7F)+0x80); length >>= 7; }\n\t\telse { o.write_shift(1, length); break; }\n\t}\n\tif(length > 0 && is_buf(payload)) ba.push(payload);\n}\n/* XLS ranges enforced */\nfunction shift_cell_xls(cell, tgt, opts) {\n\tvar out = dup(cell);\n\tif(tgt.s) {\n\t\tif(out.cRel) out.c += tgt.s.c;\n\t\tif(out.rRel) out.r += tgt.s.r;\n\t} else {\n\t\tif(out.cRel) out.c += tgt.c;\n\t\tif(out.rRel) out.r += tgt.r;\n\t}\n\tif(!opts || opts.biff < 12) {\n\t\twhile(out.c >= 0x100) out.c -= 0x100;\n\t\twhile(out.r >= 0x10000) out.r -= 0x10000;\n\t}\n\treturn out;\n}\n\nfunction shift_range_xls(cell, range, opts) {\n\tvar out = dup(cell);\n\tout.s = shift_cell_xls(out.s, range.s, opts);\n\tout.e = shift_cell_xls(out.e, range.s, opts);\n\treturn out;\n}\n\nfunction encode_cell_xls(c, biff) {\n\tif(c.cRel && c.c < 0) { c = dup(c); while(c.c < 0) c.c += (biff > 8) ? 0x4000 : 0x100; }\n\tif(c.rRel && c.r < 0) { c = dup(c); while(c.r < 0) c.r += (biff > 8) ? 0x100000 : ((biff > 5) ? 0x10000 : 0x4000); }\n\tvar s = encode_cell(c);\n\tif(!c.cRel && c.cRel != null) s = fix_col(s);\n\tif(!c.rRel && c.rRel != null) s = fix_row(s);\n\treturn s;\n}\n\nfunction encode_range_xls(r, opts) {\n\tif(r.s.r == 0 && !r.s.rRel) {\n\t\tif(r.e.r == (opts.biff >= 12 ? 0xFFFFF : (opts.biff >= 8 ? 0x10000 : 0x4000)) && !r.e.rRel) {\n\t\t\treturn (r.s.cRel ? \"\" : \"$\") + encode_col(r.s.c) + \":\" + (r.e.cRel ? \"\" : \"$\") + encode_col(r.e.c);\n\t\t}\n\t}\n\tif(r.s.c == 0 && !r.s.cRel) {\n\t\tif(r.e.c == (opts.biff >= 12 ? 0x3FFF : 0xFF) && !r.e.cRel) {\n\t\t\treturn (r.s.rRel ? \"\" : \"$\") + encode_row(r.s.r) + \":\" + (r.e.rRel ? \"\" : \"$\") + encode_row(r.e.r);\n\t\t}\n\t}\n\treturn encode_cell_xls(r.s, opts.biff) + \":\" + encode_cell_xls(r.e, opts.biff);\n}\nvar OFFCRYPTO = {};\n\nvar make_offcrypto = function(O, _crypto) {\n\tvar crypto;\n\tif(typeof _crypto !== 'undefined') crypto = _crypto;\n\telse if(typeof require !== 'undefined') {\n\t\ttry { crypto = require('crypto'); }\n\t\tcatch(e) { crypto = null; }\n\t}\n\n\tO.rc4 = function(key, data) {\n\t\tvar S = new Array(256);\n\t\tvar c = 0, i = 0, j = 0, t = 0;\n\t\tfor(i = 0; i != 256; ++i) S[i] = i;\n\t\tfor(i = 0; i != 256; ++i) {\n\t\t\tj = (j + S[i] + (key[i%key.length]).charCodeAt(0))&255;\n\t\t\tt = S[i]; S[i] = S[j]; S[j] = t;\n\t\t}\n\t\t// $FlowIgnore\n\t\ti = j = 0; var out = new_raw_buf(data.length);\n\t\tfor(c = 0; c != data.length; ++c) {\n\t\t\ti = (i + 1)&255;\n\t\t\tj = (j + S[i])%256;\n\t\t\tt = S[i]; S[i] = S[j]; S[j] = t;\n\t\t\tout[c] = (data[c] ^ S[(S[i]+S[j])&255]);\n\t\t}\n\t\treturn out;\n\t};\n\n\tO.md5 = function(hex) {\n\t\tif(!crypto) throw new Error(\"Unsupported crypto\");\n\t\treturn crypto.createHash('md5').update(hex).digest('hex');\n\t};\n};\n/*global crypto:true */\nmake_offcrypto(OFFCRYPTO, typeof crypto !== \"undefined\" ? crypto : undefined);\n\nfunction decode_row(rowstr) { return parseInt(unfix_row(rowstr),10) - 1; }\nfunction encode_row(row) { return \"\" + (row + 1); }\nfunction fix_row(cstr) { return cstr.replace(/([A-Z]|^)(\\d+)$/,\"$1$$$2\"); }\nfunction unfix_row(cstr) { return cstr.replace(/\\$(\\d+)$/,\"$1\"); }\n\nfunction decode_col(colstr) { var c = unfix_col(colstr), d = 0, i = 0; for(; i !== c.length; ++i) d = 26*d + c.charCodeAt(i) - 64; return d - 1; }\nfunction encode_col(col) { if(col < 0) throw new Error(\"invalid column \" + col); var s=\"\"; for(++col; col; col=Math.floor((col-1)/26)) s = String.fromCharCode(((col-1)%26) + 65) + s; return s; }\nfunction fix_col(cstr) { return cstr.replace(/^([A-Z])/,\"$$$1\"); }\nfunction unfix_col(cstr) { return cstr.replace(/^\\$([A-Z])/,\"$1\"); }\n\nfunction split_cell(cstr) { return cstr.replace(/(\\$?[A-Z]*)(\\$?\\d*)/,\"$1,$2\").split(\",\"); }\n//function decode_cell(cstr) { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }\nfunction decode_cell(cstr) {\n\tvar R = 0, C = 0;\n\tfor(var i = 0; i < cstr.length; ++i) {\n\t\tvar cc = cstr.charCodeAt(i);\n\t\tif(cc >= 48 && cc <= 57) R = 10 * R + (cc - 48);\n\t\telse if(cc >= 65 && cc <= 90) C = 26 * C + (cc - 64);\n\t}\n\treturn { c: C - 1, r:R - 1 };\n}\n//function encode_cell(cell) { return encode_col(cell.c) + encode_row(cell.r); }\nfunction encode_cell(cell) {\n\tvar col = cell.c + 1;\n\tvar s=\"\";\n\tfor(; col; col=((col-1)/26)|0) s = String.fromCharCode(((col-1)%26) + 65) + s;\n\treturn s + (cell.r + 1);\n}\nfunction decode_range(range) {\n\tvar idx = range.indexOf(\":\");\n\tif(idx == -1) return { s: decode_cell(range), e: decode_cell(range) };\n\treturn { s: decode_cell(range.slice(0, idx)), e: decode_cell(range.slice(idx + 1)) };\n}\nfunction encode_range(cs,ce) {\n\tif(typeof ce === 'undefined' || typeof ce === 'number') {\nreturn encode_range(cs.s, cs.e);\n\t}\nif(typeof cs !== 'string') cs = encode_cell((cs));\n\tif(typeof ce !== 'string') ce = encode_cell((ce));\nreturn cs == ce ? cs : cs + \":\" + ce;\n}\n\nfunction safe_decode_range(range) {\n\tvar o = {s:{c:0,r:0},e:{c:0,r:0}};\n\tvar idx = 0, i = 0, cc = 0;\n\tvar len = range.length;\n\tfor(idx = 0; i < len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break;\n\t\tidx = 26*idx + cc;\n\t}\n\to.s.c = --idx;\n\n\tfor(idx = 0; i < len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break;\n\t\tidx = 10*idx + cc;\n\t}\n\to.s.r = --idx;\n\n\tif(i === len || cc != 10) { o.e.c=o.s.c; o.e.r=o.s.r; return o; }\n\t++i;\n\n\tfor(idx = 0; i != len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break;\n\t\tidx = 26*idx + cc;\n\t}\n\to.e.c = --idx;\n\n\tfor(idx = 0; i != len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break;\n\t\tidx = 10*idx + cc;\n\t}\n\to.e.r = --idx;\n\treturn o;\n}\n\nfunction safe_format_cell(cell, v) {\n\tvar q = (cell.t == 'd' && v instanceof Date);\n\tif(cell.z != null) try { return (cell.w = SSF.format(cell.z, q ? datenum(v) : v)); } catch(e) { }\n\ttry { return (cell.w = SSF.format((cell.XF||{}).numFmtId||(q ? 14 : 0), q ? datenum(v) : v)); } catch(e) { return ''+v; }\n}\n\nfunction format_cell(cell, v, o) {\n\tif(cell == null || cell.t == null || cell.t == 'z') return \"\";\n\tif(cell.w !== undefined) return cell.w;\n\tif(cell.t == 'd' && !cell.z && o && o.dateNF) cell.z = o.dateNF;\n\tif(cell.t == \"e\") return BErr[cell.v] || cell.v;\n\tif(v == undefined) return safe_format_cell(cell, cell.v);\n\treturn safe_format_cell(cell, v);\n}\n\nfunction sheet_to_workbook(sheet, opts) {\n\tvar n = opts && opts.sheet ? opts.sheet : \"Sheet1\";\n\tvar sheets = {}; sheets[n] = sheet;\n\treturn { SheetNames: [n], Sheets: sheets };\n}\n\nfunction sheet_add_aoa(_ws, data, opts) {\n\tvar o = opts || {};\n\tvar dense = _ws ? Array.isArray(_ws) : o.dense;\n\tif(DENSE != null && dense == null) dense = DENSE;\n\tvar ws = _ws || (dense ? ([]) : ({}));\n\tvar _R = 0, _C = 0;\n\tif(ws && o.origin != null) {\n\t\tif(typeof o.origin == 'number') _R = o.origin;\n\t\telse {\n\t\t\tvar _origin = typeof o.origin == \"string\" ? decode_cell(o.origin) : o.origin;\n\t\t\t_R = _origin.r; _C = _origin.c;\n\t\t}\n\t\tif(!ws[\"!ref\"]) ws[\"!ref\"] = \"A1:A1\";\n\t}\n\tvar range = ({s: {c:10000000, r:10000000}, e: {c:0, r:0}});\n\tif(ws['!ref']) {\n\t\tvar _range = safe_decode_range(ws['!ref']);\n\t\trange.s.c = _range.s.c;\n\t\trange.s.r = _range.s.r;\n\t\trange.e.c = Math.max(range.e.c, _range.e.c);\n\t\trange.e.r = Math.max(range.e.r, _range.e.r);\n\t\tif(_R == -1) range.e.r = _R = _range.e.r + 1;\n\t}\n\tfor(var R = 0; R != data.length; ++R) {\n\t\tif(!data[R]) continue;\n\t\tif(!Array.isArray(data[R])) throw new Error(\"aoa_to_sheet expects an array of arrays\");\n\t\tfor(var C = 0; C != data[R].length; ++C) {\n\t\t\tif(typeof data[R][C] === 'undefined') continue;\n\t\t\tvar cell = ({v: data[R][C] });\n\t\t\tvar __R = _R + R, __C = _C + C;\n\t\t\tif(range.s.r > __R) range.s.r = __R;\n\t\t\tif(range.s.c > __C) range.s.c = __C;\n\t\t\tif(range.e.r < __R) range.e.r = __R;\n\t\t\tif(range.e.c < __C) range.e.c = __C;\n\t\t\tif(data[R][C] && typeof data[R][C] === 'object' && !Array.isArray(data[R][C]) && !(data[R][C] instanceof Date)) cell = data[R][C];\n\t\t\telse {\n\t\t\t\tif(Array.isArray(cell.v)) { cell.f = data[R][C][1]; cell.v = cell.v[0]; }\n\t\t\t\tif(cell.v === null) {\n\t\t\t\t\tif(cell.f) cell.t = 'n';\n\t\t\t\t\telse if(o.nullError) { cell.t = 'e'; cell.v = 0; }\n\t\t\t\t\telse if(!o.sheetStubs) continue;\n\t\t\t\t\telse cell.t = 'z';\n\t\t\t\t}\n\t\t\t\telse if(typeof cell.v === 'number') cell.t = 'n';\n\t\t\t\telse if(typeof cell.v === 'boolean') cell.t = 'b';\n\t\t\t\telse if(cell.v instanceof Date) {\n\t\t\t\t\tcell.z = o.dateNF || SSF._table[14];\n\t\t\t\t\tif(o.cellDates) { cell.t = 'd'; cell.w = SSF.format(cell.z, datenum(cell.v)); }\n\t\t\t\t\telse { cell.t = 'n'; cell.v = datenum(cell.v); cell.w = SSF.format(cell.z, cell.v); }\n\t\t\t\t}\n\t\t\t\telse cell.t = 's';\n\t\t\t}\n\t\t\tif(dense) {\n\t\t\t\tif(!ws[__R]) ws[__R] = [];\n\t\t\t\tif(ws[__R][__C] && ws[__R][__C].z) cell.z = ws[__R][__C].z;\n\t\t\t\tws[__R][__C] = cell;\n\t\t\t} else {\n\t\t\t\tvar cell_ref = encode_cell(({c:__C,r:__R}));\n\t\t\t\tif(ws[cell_ref] && ws[cell_ref].z) cell.z = ws[cell_ref].z;\n\t\t\t\tws[cell_ref] = cell;\n\t\t\t}\n\t\t}\n\t}\n\tif(range.s.c < 10000000) ws['!ref'] = encode_range(range);\n\treturn ws;\n}\nfunction aoa_to_sheet(data, opts) { return sheet_add_aoa(null, data, opts); }\n\nfunction write_UInt32LE(x, o) {\n\tif (!o) o = new_buf(4);\n\to.write_shift(4, x);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.168 */\nfunction parse_XLWideString(data) {\n\tvar cchCharacters = data.read_shift(4);\n\treturn cchCharacters === 0 ? \"\" : data.read_shift(cchCharacters, 'dbcs');\n}\nfunction write_XLWideString(data, o) {\n\tvar _null = false; if (o == null) { _null = true; o = new_buf(4 + 2 * data.length); }\n\to.write_shift(4, data.length);\n\tif (data.length > 0) o.write_shift(0, data, 'dbcs');\n\treturn _null ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.5.91 */\n//function parse_LPWideString(data) {\n//\tvar cchCharacters = data.read_shift(2);\n//\treturn cchCharacters === 0 ? \"\" : data.read_shift(cchCharacters, \"utf16le\");\n//}\n\n/* [MS-XLSB] 2.5.143 */\nfunction parse_StrRun(data) {\n\treturn { ich: data.read_shift(2), ifnt: data.read_shift(2) };\n}\nfunction write_StrRun(run, o) {\n\tif (!o) o = new_buf(4);\n\to.write_shift(2, run.ich || 0);\n\to.write_shift(2, run.ifnt || 0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.121 */\nfunction parse_RichStr(data, length) {\n\tvar start = data.l;\n\tvar flags = data.read_shift(1);\n\tvar str = parse_XLWideString(data);\n\tvar rgsStrRun = [];\n\tvar z = ({ t: str, h: str });\n\tif ((flags & 1) !== 0) { /* fRichStr */\n\t\t/* TODO: formatted string */\n\t\tvar dwSizeStrRun = data.read_shift(4);\n\t\tfor (var i = 0; i != dwSizeStrRun; ++i) rgsStrRun.push(parse_StrRun(data));\n\t\tz.r = rgsStrRun;\n\t}\n\telse z.r = [{ ich: 0, ifnt: 0 }];\n\t//if((flags & 2) !== 0) { /* fExtStr */\n\t//\t/* TODO: phonetic string */\n\t//}\n\tdata.l = start + length;\n\treturn z;\n}\nfunction write_RichStr(str, o) {\n\t/* TODO: formatted string */\n\tvar _null = false; if (o == null) { _null = true; o = new_buf(15 + 4 * str.t.length); }\n\to.write_shift(1, 0);\n\twrite_XLWideString(str.t, o);\n\treturn _null ? o.slice(0, o.l) : o;\n}\n/* [MS-XLSB] 2.4.328 BrtCommentText (RichStr w/1 run) */\nvar parse_BrtCommentText = parse_RichStr;\nfunction write_BrtCommentText(str, o) {\n\t/* TODO: formatted string */\n\tvar _null = false; if (o == null) { _null = true; o = new_buf(23 + 4 * str.t.length); }\n\to.write_shift(1, 1);\n\twrite_XLWideString(str.t, o);\n\to.write_shift(4, 1);\n\twrite_StrRun({ ich: 0, ifnt: 0 }, o);\n\treturn _null ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.5.9 */\nfunction parse_XLSBCell(data) {\n\tvar col = data.read_shift(4);\n\tvar iStyleRef = data.read_shift(2);\n\tiStyleRef += data.read_shift(1) << 16;\n\tdata.l++; //var fPhShow = data.read_shift(1);\n\treturn { c: col, iStyleRef: iStyleRef };\n}\nfunction write_XLSBCell(cell, o) {\n\tif (o == null) o = new_buf(8);\n\to.write_shift(-4, cell.c);\n\to.write_shift(3, cell.iStyleRef || cell.s);\n\to.write_shift(1, 0); /* fPhShow */\n\treturn o;\n}\n\n/* Short XLSB Cell does not include column */\nfunction parse_XLSBShortCell(data) {\n\tvar iStyleRef = data.read_shift(2);\n\tiStyleRef += data.read_shift(1) <<16;\n\tdata.l++; //var fPhShow = data.read_shift(1);\n\treturn { c:-1, iStyleRef: iStyleRef };\n}\nfunction write_XLSBShortCell(cell, o) {\n\tif(o == null) o = new_buf(4);\n\to.write_shift(3, cell.iStyleRef || cell.s);\n\to.write_shift(1, 0); /* fPhShow */\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.21 */\nvar parse_XLSBCodeName = parse_XLWideString;\nvar write_XLSBCodeName = write_XLWideString;\n\n/* [MS-XLSB] 2.5.166 */\nfunction parse_XLNullableWideString(data) {\n\tvar cchCharacters = data.read_shift(4);\n\treturn cchCharacters === 0 || cchCharacters === 0xFFFFFFFF ? \"\" : data.read_shift(cchCharacters, 'dbcs');\n}\nfunction write_XLNullableWideString(data, o) {\n\tvar _null = false; if (o == null) { _null = true; o = new_buf(127); }\n\to.write_shift(4, data.length > 0 ? data.length : 0xFFFFFFFF);\n\tif (data.length > 0) o.write_shift(0, data, 'dbcs');\n\treturn _null ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.5.165 */\nvar parse_XLNameWideString = parse_XLWideString;\n//var write_XLNameWideString = write_XLWideString;\n\n/* [MS-XLSB] 2.5.114 */\nvar parse_RelID = parse_XLNullableWideString;\nvar write_RelID = write_XLNullableWideString;\n\n\n/* [MS-XLS] 2.5.217 ; [MS-XLSB] 2.5.122 */\nfunction parse_RkNumber(data) {\n\tvar b = data.slice(data.l, data.l + 4);\n\tvar fX100 = (b[0] & 1), fInt = (b[0] & 2);\n\tdata.l += 4;\n\tb[0] &= 0xFC; // b[0] &= ~3;\n\tvar RK = fInt === 0 ? __double([0, 0, 0, 0, b[0], b[1], b[2], b[3]], 0) : __readInt32LE(b, 0) >> 2;\n\treturn fX100 ? (RK / 100) : RK;\n}\nfunction write_RkNumber(data, o) {\n\tif (o == null) o = new_buf(4);\n\tvar fX100 = 0, fInt = 0, d100 = data * 100;\n\tif ((data == (data | 0)) && (data >= -(1 << 29)) && (data < (1 << 29))) { fInt = 1; }\n\telse if ((d100 == (d100 | 0)) && (d100 >= -(1 << 29)) && (d100 < (1 << 29))) { fInt = 1; fX100 = 1; }\n\tif (fInt) o.write_shift(-4, ((fX100 ? d100 : data) << 2) + (fX100 + 2));\n\telse throw new Error(\"unsupported RkNumber \" + data); // TODO\n}\n\n\n/* [MS-XLSB] 2.5.117 RfX */\nfunction parse_RfX(data ) {\n\tvar cell = ({ s: {}, e: {} });\n\tcell.s.r = data.read_shift(4);\n\tcell.e.r = data.read_shift(4);\n\tcell.s.c = data.read_shift(4);\n\tcell.e.c = data.read_shift(4);\n\treturn cell;\n}\nfunction write_RfX(r, o) {\n\tif (!o) o = new_buf(16);\n\to.write_shift(4, r.s.r);\n\to.write_shift(4, r.e.r);\n\to.write_shift(4, r.s.c);\n\to.write_shift(4, r.e.c);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.153 UncheckedRfX */\nvar parse_UncheckedRfX = parse_RfX;\nvar write_UncheckedRfX = write_RfX;\n\n/* [MS-XLSB] 2.5.155 UncheckedSqRfX */\n//function parse_UncheckedSqRfX(data) {\n//\tvar cnt = data.read_shift(4);\n//\tvar out = [];\n//\tfor(var i = 0; i < cnt; ++i) {\n//\t\tvar rng = parse_UncheckedRfX(data);\n//\t\tout.push(encode_range(rng));\n//\t}\n//\treturn out.join(\",\");\n//}\n//function write_UncheckedSqRfX(sqrfx) {\n//\tvar parts = sqrfx.split(/\\s*,\\s*/);\n//\tvar o = new_buf(4); o.write_shift(4, parts.length);\n//\tvar out = [o];\n//\tparts.forEach(function(rng) {\n//\t\tout.push(write_UncheckedRfX(safe_decode_range(rng)));\n//\t});\n//\treturn bconcat(out);\n//}\n\n/* [MS-XLS] 2.5.342 ; [MS-XLSB] 2.5.171 */\n/* TODO: error checking, NaN and Infinity values are not valid Xnum */\nfunction parse_Xnum(data) {\n\tif(data.length - data.l < 8) throw \"XLS Xnum Buffer underflow\";\n\treturn data.read_shift(8, 'f');\n}\nfunction write_Xnum(data, o) { return (o || new_buf(8)).write_shift(8, data, 'f'); }\n\n/* [MS-XLSB] 2.4.324 BrtColor */\nfunction parse_BrtColor(data) {\n\tvar out = {};\n\tvar d = data.read_shift(1);\n\n\t//var fValidRGB = d & 1;\n\tvar xColorType = d >>> 1;\n\n\tvar index = data.read_shift(1);\n\tvar nTS = data.read_shift(2, 'i');\n\tvar bR = data.read_shift(1);\n\tvar bG = data.read_shift(1);\n\tvar bB = data.read_shift(1);\n\tdata.l++; //var bAlpha = data.read_shift(1);\n\n\tswitch (xColorType) {\n\t\tcase 0: out.auto = 1; break;\n\t\tcase 1:\n\t\t\tout.index = index;\n\t\t\tvar icv = XLSIcv[index];\n\t\t\t/* automatic pseudo index 81 */\n\t\t\tif (icv) out.rgb = rgb2Hex(icv);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\t/* if(!fValidRGB) throw new Error(\"invalid\"); */\n\t\t\tout.rgb = rgb2Hex([bR, bG, bB]);\n\t\t\tbreak;\n\t\tcase 3: out.theme = index; break;\n\t}\n\tif (nTS != 0) out.tint = nTS > 0 ? nTS / 32767 : nTS / 32768;\n\n\treturn out;\n}\nfunction write_BrtColor(color, o) {\n\tif (!o) o = new_buf(8);\n\tif (!color || color.auto) { o.write_shift(4, 0); o.write_shift(4, 0); return o; }\n\tif (color.index != null) {\n\t\to.write_shift(1, 0x02);\n\t\to.write_shift(1, color.index);\n\t} else if (color.theme != null) {\n\t\to.write_shift(1, 0x06);\n\t\to.write_shift(1, color.theme);\n\t} else {\n\t\to.write_shift(1, 0x05);\n\t\to.write_shift(1, 0);\n\t}\n\tvar nTS = color.tint || 0;\n\tif (nTS > 0) nTS *= 32767;\n\telse if (nTS < 0) nTS *= 32768;\n\to.write_shift(2, nTS);\n\tif (!color.rgb || color.theme != null) {\n\t\to.write_shift(2, 0);\n\t\to.write_shift(1, 0);\n\t\to.write_shift(1, 0);\n\t} else {\n\t\tvar rgb = (color.rgb || 'FFFFFF');\n\t\tif (typeof rgb == 'number') rgb = (\"000000\" + rgb.toString(16)).slice(-6);\n\t\to.write_shift(1, parseInt(rgb.slice(0, 2), 16));\n\t\to.write_shift(1, parseInt(rgb.slice(2, 4), 16));\n\t\to.write_shift(1, parseInt(rgb.slice(4, 6), 16));\n\t\to.write_shift(1, 0xFF);\n\t}\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.52 */\nfunction parse_FontFlags(data) {\n\tvar d = data.read_shift(1);\n\tdata.l++;\n\tvar out = {\n\t\tfBold: d & 0x01,\n\t\tfItalic: d & 0x02,\n\t\tfUnderline: d & 0x04,\n\t\tfStrikeout: d & 0x08,\n\t\tfOutline: d & 0x10,\n\t\tfShadow: d & 0x20,\n\t\tfCondense: d & 0x40,\n\t\tfExtend: d & 0x80\n\t};\n\treturn out;\n}\nfunction write_FontFlags(font, o) {\n\tif (!o) o = new_buf(2);\n\tvar grbit =\n\t\t(font.italic ? 0x02 : 0) |\n\t\t(font.strike ? 0x08 : 0) |\n\t\t(font.outline ? 0x10 : 0) |\n\t\t(font.shadow ? 0x20 : 0) |\n\t\t(font.condense ? 0x40 : 0) |\n\t\t(font.extend ? 0x80 : 0);\n\to.write_shift(1, grbit);\n\to.write_shift(1, 0);\n\treturn o;\n}\n\n/* [MS-OLEDS] 2.3.1 and 2.3.2 */\nfunction parse_ClipboardFormatOrString(o, w) {\n\t// $FlowIgnore\n\tvar ClipFmt = { 2: \"BITMAP\", 3: \"METAFILEPICT\", 8: \"DIB\", 14: \"ENHMETAFILE\" };\n\tvar m = o.read_shift(4);\n\tswitch (m) {\n\t\tcase 0x00000000: return \"\";\n\t\tcase 0xffffffff: case 0xfffffffe: return ClipFmt[o.read_shift(4)] || \"\";\n\t}\n\tif (m > 0x190) throw new Error(\"Unsupported Clipboard: \" + m.toString(16));\n\to.l -= 4;\n\treturn o.read_shift(0, w == 1 ? \"lpstr\" : \"lpwstr\");\n}\nfunction parse_ClipboardFormatOrAnsiString(o) { return parse_ClipboardFormatOrString(o, 1); }\nfunction parse_ClipboardFormatOrUnicodeString(o) { return parse_ClipboardFormatOrString(o, 2); }\n\n/* [MS-OLEPS] 2.2 PropertyType */\n//var VT_EMPTY = 0x0000;\n//var VT_NULL = 0x0001;\nvar VT_I2 = 0x0002;\nvar VT_I4 = 0x0003;\n//var VT_R4 = 0x0004;\n//var VT_R8 = 0x0005;\n//var VT_CY = 0x0006;\n//var VT_DATE = 0x0007;\n//var VT_BSTR = 0x0008;\n//var VT_ERROR = 0x000A;\nvar VT_BOOL = 0x000B;\nvar VT_VARIANT = 0x000C;\n//var VT_DECIMAL = 0x000E;\n//var VT_I1 = 0x0010;\n//var VT_UI1 = 0x0011;\n//var VT_UI2 = 0x0012;\nvar VT_UI4 = 0x0013;\n//var VT_I8 = 0x0014;\n//var VT_UI8 = 0x0015;\n//var VT_INT = 0x0016;\n//var VT_UINT = 0x0017;\nvar VT_LPSTR = 0x001E;\n//var VT_LPWSTR = 0x001F;\nvar VT_FILETIME = 0x0040;\nvar VT_BLOB = 0x0041;\n//var VT_STREAM = 0x0042;\n//var VT_STORAGE = 0x0043;\n//var VT_STREAMED_Object = 0x0044;\n//var VT_STORED_Object = 0x0045;\n//var VT_BLOB_Object = 0x0046;\nvar VT_CF = 0x0047;\n//var VT_CLSID = 0x0048;\n//var VT_VERSIONED_STREAM = 0x0049;\nvar VT_VECTOR = 0x1000;\n//var VT_ARRAY = 0x2000;\n\nvar VT_STRING = 0x0050; // 2.3.3.1.11 VtString\nvar VT_USTR = 0x0051; // 2.3.3.1.12 VtUnalignedString\nvar VT_CUSTOM = [VT_STRING, VT_USTR];\n\n/* [MS-OSHARED] 2.3.3.2.2.1 Document Summary Information PIDDSI */\nvar DocSummaryPIDDSI = {\n0x01: { n: 'CodePage', t: VT_I2 },\n0x02: { n: 'Category', t: VT_STRING },\n0x03: { n: 'PresentationFormat', t: VT_STRING },\n0x04: { n: 'ByteCount', t: VT_I4 },\n0x05: { n: 'LineCount', t: VT_I4 },\n0x06: { n: 'ParagraphCount', t: VT_I4 },\n0x07: { n: 'SlideCount', t: VT_I4 },\n0x08: { n: 'NoteCount', t: VT_I4 },\n0x09: { n: 'HiddenCount', t: VT_I4 },\n0x0a: { n: 'MultimediaClipCount', t: VT_I4 },\n0x0b: { n: 'ScaleCrop', t: VT_BOOL },\n0x0c: { n: 'HeadingPairs', t: VT_VECTOR | VT_VARIANT },\n0x0d: { n: 'TitlesOfParts', t: VT_VECTOR | VT_LPSTR },\n0x0e: { n: 'Manager', t: VT_STRING },\n0x0f: { n: 'Company', t: VT_STRING },\n0x10: { n: 'LinksUpToDate', t: VT_BOOL },\n0x11: { n: 'CharacterCount', t: VT_I4 },\n0x13: { n: 'SharedDoc', t: VT_BOOL },\n0x16: { n: 'HyperlinksChanged', t: VT_BOOL },\n0x17: { n: 'AppVersion', t: VT_I4, p: 'version' },\n0x18: { n: 'DigSig', t: VT_BLOB },\n0x1A: { n: 'ContentType', t: VT_STRING },\n0x1B: { n: 'ContentStatus', t: VT_STRING },\n0x1C: { n: 'Language', t: VT_STRING },\n0x1D: { n: 'Version', t: VT_STRING },\n0xFF: {},\n\t/* [MS-OLEPS] 2.18 */\n0x80000000: { n: 'Locale', t: VT_UI4 },\n0x80000003: { n: 'Behavior', t: VT_UI4 },\n0x72627262: {}\n};\n\n/* [MS-OSHARED] 2.3.3.2.1.1 Summary Information Property Set PIDSI */\nvar SummaryPIDSI = {\n0x01: { n: 'CodePage', t: VT_I2 },\n0x02: { n: 'Title', t: VT_STRING },\n0x03: { n: 'Subject', t: VT_STRING },\n0x04: { n: 'Author', t: VT_STRING },\n0x05: { n: 'Keywords', t: VT_STRING },\n0x06: { n: 'Comments', t: VT_STRING },\n0x07: { n: 'Template', t: VT_STRING },\n0x08: { n: 'LastAuthor', t: VT_STRING },\n0x09: { n: 'RevNumber', t: VT_STRING },\n0x0A: { n: 'EditTime', t: VT_FILETIME },\n0x0B: { n: 'LastPrinted', t: VT_FILETIME },\n0x0C: { n: 'CreatedDate', t: VT_FILETIME },\n0x0D: { n: 'ModifiedDate', t: VT_FILETIME },\n0x0E: { n: 'PageCount', t: VT_I4 },\n0x0F: { n: 'WordCount', t: VT_I4 },\n0x10: { n: 'CharCount', t: VT_I4 },\n0x11: { n: 'Thumbnail', t: VT_CF },\n0x12: { n: 'Application', t: VT_STRING },\n0x13: { n: 'DocSecurity', t: VT_I4 },\n0xFF: {},\n\t/* [MS-OLEPS] 2.18 */\n0x80000000: { n: 'Locale', t: VT_UI4 },\n0x80000003: { n: 'Behavior', t: VT_UI4 },\n0x72627262: {}\n};\n\nvar DocSummaryRE = evert_key(DocSummaryPIDDSI, \"n\");\nvar SummaryRE = evert_key(SummaryPIDSI, \"n\");\n\n/* [MS-XLS] 2.4.63 Country/Region codes */\nvar CountryEnum = {\n0x0001: \"US\", // United States\n0x0002: \"CA\", // Canada\n0x0003: \"\", // Latin America (except Brazil)\n0x0007: \"RU\", // Russia\n0x0014: \"EG\", // Egypt\n0x001E: \"GR\", // Greece\n0x001F: \"NL\", // Netherlands\n0x0020: \"BE\", // Belgium\n0x0021: \"FR\", // France\n0x0022: \"ES\", // Spain\n0x0024: \"HU\", // Hungary\n0x0027: \"IT\", // Italy\n0x0029: \"CH\", // Switzerland\n0x002B: \"AT\", // Austria\n0x002C: \"GB\", // United Kingdom\n0x002D: \"DK\", // Denmark\n0x002E: \"SE\", // Sweden\n0x002F: \"NO\", // Norway\n0x0030: \"PL\", // Poland\n0x0031: \"DE\", // Germany\n0x0034: \"MX\", // Mexico\n0x0037: \"BR\", // Brazil\n0x003d: \"AU\", // Australia\n0x0040: \"NZ\", // New Zealand\n0x0042: \"TH\", // Thailand\n0x0051: \"JP\", // Japan\n0x0052: \"KR\", // Korea\n0x0054: \"VN\", // Viet Nam\n0x0056: \"CN\", // China\n0x005A: \"TR\", // Turkey\n0x0069: \"JS\", // Ramastan\n0x00D5: \"DZ\", // Algeria\n0x00D8: \"MA\", // Morocco\n0x00DA: \"LY\", // Libya\n0x015F: \"PT\", // Portugal\n0x0162: \"IS\", // Iceland\n0x0166: \"FI\", // Finland\n0x01A4: \"CZ\", // Czech Republic\n0x0376: \"TW\", // Taiwan\n0x03C1: \"LB\", // Lebanon\n0x03C2: \"JO\", // Jordan\n0x03C3: \"SY\", // Syria\n0x03C4: \"IQ\", // Iraq\n0x03C5: \"KW\", // Kuwait\n0x03C6: \"SA\", // Saudi Arabia\n0x03CB: \"AE\", // United Arab Emirates\n0x03CC: \"IL\", // Israel\n0x03CE: \"QA\", // Qatar\n0x03D5: \"IR\", // Iran\n0xFFFF: \"US\" // United States\n};\n\n/* [MS-XLS] 2.5.127 */\nvar XLSFillPattern = [\n\tnull,\n\t'solid',\n\t'mediumGray',\n\t'darkGray',\n\t'lightGray',\n\t'darkHorizontal',\n\t'darkVertical',\n\t'darkDown',\n\t'darkUp',\n\t'darkGrid',\n\t'darkTrellis',\n\t'lightHorizontal',\n\t'lightVertical',\n\t'lightDown',\n\t'lightUp',\n\t'lightGrid',\n\t'lightTrellis',\n\t'gray125',\n\t'gray0625'\n];\n\nfunction rgbify(arr) { return arr.map(function(x) { return [(x>>16)&255,(x>>8)&255,x&255]; }); }\n\n/* [MS-XLS] 2.5.161 */\n/* [MS-XLSB] 2.5.75 Icv */\nvar _XLSIcv = rgbify([\n\t/* Color Constants */\n\t0x000000,\n\t0xFFFFFF,\n\t0xFF0000,\n\t0x00FF00,\n\t0x0000FF,\n\t0xFFFF00,\n\t0xFF00FF,\n\t0x00FFFF,\n\n\t/* Overridable Defaults */\n\t0x000000,\n\t0xFFFFFF,\n\t0xFF0000,\n\t0x00FF00,\n\t0x0000FF,\n\t0xFFFF00,\n\t0xFF00FF,\n\t0x00FFFF,\n\n\t0x800000,\n\t0x008000,\n\t0x000080,\n\t0x808000,\n\t0x800080,\n\t0x008080,\n\t0xC0C0C0,\n\t0x808080,\n\t0x9999FF,\n\t0x993366,\n\t0xFFFFCC,\n\t0xCCFFFF,\n\t0x660066,\n\t0xFF8080,\n\t0x0066CC,\n\t0xCCCCFF,\n\n\t0x000080,\n\t0xFF00FF,\n\t0xFFFF00,\n\t0x00FFFF,\n\t0x800080,\n\t0x800000,\n\t0x008080,\n\t0x0000FF,\n\t0x00CCFF,\n\t0xCCFFFF,\n\t0xCCFFCC,\n\t0xFFFF99,\n\t0x99CCFF,\n\t0xFF99CC,\n\t0xCC99FF,\n\t0xFFCC99,\n\n\t0x3366FF,\n\t0x33CCCC,\n\t0x99CC00,\n\t0xFFCC00,\n\t0xFF9900,\n\t0xFF6600,\n\t0x666699,\n\t0x969696,\n\t0x003366,\n\t0x339966,\n\t0x003300,\n\t0x333300,\n\t0x993300,\n\t0x993366,\n\t0x333399,\n\t0x333333,\n\n\t/* Other entries to appease BIFF8/12 */\n\t0xFFFFFF, /* 0x40 icvForeground ?? */\n\t0x000000, /* 0x41 icvBackground ?? */\n\t0x000000, /* 0x42 icvFrame ?? */\n\t0x000000, /* 0x43 icv3D ?? */\n\t0x000000, /* 0x44 icv3DText ?? */\n\t0x000000, /* 0x45 icv3DHilite ?? */\n\t0x000000, /* 0x46 icv3DShadow ?? */\n\t0x000000, /* 0x47 icvHilite ?? */\n\t0x000000, /* 0x48 icvCtlText ?? */\n\t0x000000, /* 0x49 icvCtlScrl ?? */\n\t0x000000, /* 0x4A icvCtlInv ?? */\n\t0x000000, /* 0x4B icvCtlBody ?? */\n\t0x000000, /* 0x4C icvCtlFrame ?? */\n\t0x000000, /* 0x4D icvCtlFore ?? */\n\t0x000000, /* 0x4E icvCtlBack ?? */\n\t0x000000, /* 0x4F icvCtlNeutral */\n\t0x000000, /* 0x50 icvInfoBk ?? */\n\t0x000000 /* 0x51 icvInfoText ?? */\n]);\nvar XLSIcv = dup(_XLSIcv);\n\n/* [MS-XLSB] 2.5.97.2 */\nvar BErr = {\n0x00: \"#NULL!\",\n0x07: \"#DIV/0!\",\n0x0F: \"#VALUE!\",\n0x17: \"#REF!\",\n0x1D: \"#NAME?\",\n0x24: \"#NUM!\",\n0x2A: \"#N/A\",\n0x2B: \"#GETTING_DATA\",\n0xFF: \"#WTF?\"\n};\nvar RBErr = evert_num(BErr);\n/* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */\n/* 12.3 Part Summary */\n/* 14.2 Part Summary */\n/* [MS-XLSX] 2.1 Part Enumerations ; [MS-XLSB] 2.1.7 Part Enumeration */\nvar ct2type/*{[string]:string}*/ = ({\n\t/* Workbook */\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\": \"workbooks\",\n\n\t/* Worksheet */\n\t\"application/vnd.ms-excel.binIndexWs\": \"TODO\", /* Binary Index */\n\n\t/* Macrosheet */\n\t\"application/vnd.ms-excel.intlmacrosheet\": \"TODO\",\n\t\"application/vnd.ms-excel.binIndexMs\": \"TODO\", /* Binary Index */\n\n\t/* File Properties */\n\t\"application/vnd.openxmlformats-package.core-properties+xml\": \"coreprops\",\n\t\"application/vnd.openxmlformats-officedocument.custom-properties+xml\": \"custprops\",\n\t\"application/vnd.openxmlformats-officedocument.extended-properties+xml\": \"extprops\",\n\n\t/* Custom Data Properties */\n\t\"application/vnd.openxmlformats-officedocument.customXmlProperties+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.customProperty\": \"TODO\",\n\n\t/* PivotTable */\n\t\"application/vnd.ms-excel.pivotTable\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml\": \"TODO\",\n\n\t/* Chart Objects */\n\t\"application/vnd.openxmlformats-officedocument.drawingml.chart+xml\": \"TODO\",\n\n\t/* Chart Colors */\n\t\"application/vnd.ms-office.chartcolorstyle+xml\": \"TODO\",\n\n\t/* Chart Style */\n\t\"application/vnd.ms-office.chartstyle+xml\": \"TODO\",\n\n\t/* Chart Advanced */\n\t\"application/vnd.ms-office.chartex+xml\": \"TODO\",\n\n\t/* Calculation Chain */\n\t\"application/vnd.ms-excel.calcChain\": \"calcchains\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml\": \"calcchains\",\n\n\t/* Printer Settings */\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings\": \"TODO\",\n\n\t/* ActiveX */\n\t\"application/vnd.ms-office.activeX\": \"TODO\",\n\t\"application/vnd.ms-office.activeX+xml\": \"TODO\",\n\n\t/* Custom Toolbars */\n\t\"application/vnd.ms-excel.attachedToolbars\": \"TODO\",\n\n\t/* External Data Connections */\n\t\"application/vnd.ms-excel.connections\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml\": \"TODO\",\n\n\t/* External Links */\n\t\"application/vnd.ms-excel.externalLink\": \"links\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml\": \"links\",\n\n\t/* Metadata */\n\t\"application/vnd.ms-excel.sheetMetadata\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml\": \"TODO\",\n\n\t/* PivotCache */\n\t\"application/vnd.ms-excel.pivotCacheDefinition\": \"TODO\",\n\t\"application/vnd.ms-excel.pivotCacheRecords\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml\": \"TODO\",\n\n\t/* Query Table */\n\t\"application/vnd.ms-excel.queryTable\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml\": \"TODO\",\n\n\t/* Shared Workbook */\n\t\"application/vnd.ms-excel.userNames\": \"TODO\",\n\t\"application/vnd.ms-excel.revisionHeaders\": \"TODO\",\n\t\"application/vnd.ms-excel.revisionLog\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml\": \"TODO\",\n\n\t/* Single Cell Table */\n\t\"application/vnd.ms-excel.tableSingleCells\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml\": \"TODO\",\n\n\t/* Slicer */\n\t\"application/vnd.ms-excel.slicer\": \"TODO\",\n\t\"application/vnd.ms-excel.slicerCache\": \"TODO\",\n\t\"application/vnd.ms-excel.slicer+xml\": \"TODO\",\n\t\"application/vnd.ms-excel.slicerCache+xml\": \"TODO\",\n\n\t/* Sort Map */\n\t\"application/vnd.ms-excel.wsSortMap\": \"TODO\",\n\n\t/* Table */\n\t\"application/vnd.ms-excel.table\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml\": \"TODO\",\n\n\t/* Themes */\n\t\"application/vnd.openxmlformats-officedocument.theme+xml\": \"themes\",\n\n\t/* Theme Override */\n\t\"application/vnd.openxmlformats-officedocument.themeOverride+xml\": \"TODO\",\n\n\t/* Timeline */\n\t\"application/vnd.ms-excel.Timeline+xml\": \"TODO\", /* verify */\n\t\"application/vnd.ms-excel.TimelineCache+xml\": \"TODO\", /* verify */\n\n\t/* VBA */\n\t\"application/vnd.ms-office.vbaProject\": \"vba\",\n\t\"application/vnd.ms-office.vbaProjectSignature\": \"vba\",\n\n\t/* Volatile Dependencies */\n\t\"application/vnd.ms-office.volatileDependencies\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml\": \"TODO\",\n\n\t/* Control Properties */\n\t\"application/vnd.ms-excel.controlproperties+xml\": \"TODO\",\n\n\t/* Data Model */\n\t\"application/vnd.openxmlformats-officedocument.model+data\": \"TODO\",\n\n\t/* Survey */\n\t\"application/vnd.ms-excel.Survey+xml\": \"TODO\",\n\n\t/* Drawing */\n\t\"application/vnd.openxmlformats-officedocument.drawing+xml\": \"drawings\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml\": \"TODO\",\n\n\t/* VML */\n\t\"application/vnd.openxmlformats-officedocument.vmlDrawing\": \"TODO\",\n\n\t\"application/vnd.openxmlformats-package.relationships+xml\": \"rels\",\n\t\"application/vnd.openxmlformats-officedocument.oleObject\": \"TODO\",\n\n\t/* Image */\n\t\"image/png\": \"TODO\",\n\n\t\"sheet\": \"js\"\n});\n\nvar CT_LIST = (function(){\n\tvar o = {\n\t\tworkbooks: {\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\",\n\t\t\txlsm: \"application/vnd.ms-excel.sheet.macroEnabled.main+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.sheet.binary.macroEnabled.main\",\n\t\t\txlam: \"application/vnd.ms-excel.addin.macroEnabled.main+xml\",\n\t\t\txltx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml\"\n\t\t},\n\t\tstrs: { /* Shared Strings */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.sharedStrings\"\n\t\t},\n\t\tcomments: { /* Comments */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.comments\"\n\t\t},\n\t\tsheets: { /* Worksheet */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.worksheet\"\n\t\t},\n\t\tcharts: { /* Chartsheet */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.chartsheet\"\n\t\t},\n\t\tdialogs: { /* Dialogsheet */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.dialogsheet\"\n\t\t},\n\t\tmacros: { /* Macrosheet (Excel 4.0 Macros) */\n\t\t\txlsx: \"application/vnd.ms-excel.macrosheet+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.macrosheet\"\n\t\t},\n\t\tstyles: { /* Styles */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.styles\"\n\t\t}\n\t};\n\tkeys(o).forEach(function(k) { [\"xlsm\", \"xlam\"].forEach(function(v) { if(!o[k][v]) o[k][v] = o[k].xlsx; }); });\n\tkeys(o).forEach(function(k){ keys(o[k]).forEach(function(v) { ct2type[o[k][v]] = k; }); });\n\treturn o;\n})();\n\nvar type2ct/*{[string]:Array}*/ = evert_arr(ct2type);\n\nXMLNS.CT = 'http://schemas.openxmlformats.org/package/2006/content-types';\n\nfunction new_ct() {\n\treturn ({\n\t\tworkbooks:[], sheets:[], charts:[], dialogs:[], macros:[],\n\t\trels:[], strs:[], comments:[], links:[],\n\t\tcoreprops:[], extprops:[], custprops:[], themes:[], styles:[],\n\t\tcalcchains:[], vba: [], drawings: [],\n\t\tTODO:[], xmlns: \"\" });\n}\n\nfunction parse_ct(data) {\n\tvar ct = new_ct();\n\tif(!data || !data.match) return ct;\n\tvar ctext = {};\n\t(data.match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0].replace(nsregex,\"<\")) {\n\t\t\tcase ' 0 ? ct.calcchains[0] : \"\";\n\tct.sst = ct.strs.length > 0 ? ct.strs[0] : \"\";\n\tct.style = ct.styles.length > 0 ? ct.styles[0] : \"\";\n\tct.defaults = ctext;\n\tdelete ct.calcchains;\n\treturn ct;\n}\n\nvar CTYPE_XML_ROOT = writextag('Types', null, {\n\t'xmlns': XMLNS.CT,\n\t'xmlns:xsd': XMLNS.xsd,\n\t'xmlns:xsi': XMLNS.xsi\n});\n\nvar CTYPE_DEFAULTS = [\n\t['xml', 'application/xml'],\n\t['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],\n\t['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'],\n\t['data', 'application/vnd.openxmlformats-officedocument.model+data'],\n\t/* from test files */\n\t['bmp', 'image/bmp'],\n\t['png', 'image/png'],\n\t['gif', 'image/gif'],\n\t['emf', 'image/x-emf'],\n\t['wmf', 'image/x-wmf'],\n\t['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'],\n\t['tif', 'image/tiff'], ['tiff', 'image/tiff'],\n\t['pdf', 'application/pdf'],\n\t['rels', type2ct.rels[0]]\n].map(function(x) {\n\treturn writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]});\n});\n\nfunction write_ct(ct, opts) {\n\tvar o = [], v;\n\to[o.length] = (XML_HEADER);\n\to[o.length] = (CTYPE_XML_ROOT);\n\to = o.concat(CTYPE_DEFAULTS);\n\n\t/* only write first instance */\n\tvar f1 = function(w) {\n\t\tif(ct[w] && ct[w].length > 0) {\n\t\t\tv = ct[w][0];\n\t\t\to[o.length] = (writextag('Override', null, {\n\t\t\t\t'PartName': (v[0] == '/' ? \"\":\"/\") + v,\n\t\t\t\t'ContentType': CT_LIST[w][opts.bookType || 'xlsx']\n\t\t\t}));\n\t\t}\n\t};\n\n\t/* book type-specific */\n\tvar f2 = function(w) {\n\t\t(ct[w]||[]).forEach(function(v) {\n\t\t\to[o.length] = (writextag('Override', null, {\n\t\t\t\t'PartName': (v[0] == '/' ? \"\":\"/\") + v,\n\t\t\t\t'ContentType': CT_LIST[w][opts.bookType || 'xlsx']\n\t\t\t}));\n\t\t});\n\t};\n\n\t/* standard type */\n\tvar f3 = function(t) {\n\t\t(ct[t]||[]).forEach(function(v) {\n\t\t\to[o.length] = (writextag('Override', null, {\n\t\t\t\t'PartName': (v[0] == '/' ? \"\":\"/\") + v,\n\t\t\t\t'ContentType': type2ct[t][0]\n\t\t\t}));\n\t\t});\n\t};\n\n\tf1('workbooks');\n\tf2('sheets');\n\tf2('charts');\n\tf3('themes');\n\t['strs', 'styles'].forEach(f1);\n\t['coreprops', 'extprops', 'custprops'].forEach(f3);\n\tf3('vba');\n\tf3('comments');\n\tf3('drawings');\n\tif(o.length>2){ o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* 9.3 Relationships */\nvar RELS = ({\n\tWB: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n\tSHEET: \"http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n\tHLINK: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\n\tVML: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\",\n\tXPATH: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath\",\n\tXMISS: \"http://schemas.microsoft.com/office/2006/relationships/xlExternalLinkPath/xlPathMissing\",\n\tXLINK: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink\",\n\tCXML: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml\",\n\tCXMLP: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps\",\n\tVBA: \"http://schemas.microsoft.com/office/2006/relationships/vbaProject\"\n});\n\n/* 9.3.3 Representing Relationships */\nfunction get_rels_path(file) {\n\tvar n = file.lastIndexOf(\"/\");\n\treturn file.slice(0,n+1) + '_rels/' + file.slice(n+1) + \".rels\";\n}\n\nfunction parse_rels(data, currentFilePath) {\n\tvar rels = {\"!id\":{}};\n\tif (!data) return rels;\n\tif (currentFilePath.charAt(0) !== '/') {\n\t\tcurrentFilePath = '/'+currentFilePath;\n\t}\n\tvar hash = {};\n\n\t(data.match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\t/* 9.3.2.2 OPC_Relationships */\n\t\tif (y[0] === '2){ o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n\nvar RELS_EXTERN = [RELS.HLINK, RELS.XPATH, RELS.XMISS];\nfunction add_rels(rels, rId, f, type, relobj, targetmode) {\n\tif(!relobj) relobj = {};\n\tif(!rels['!id']) rels['!id'] = {};\n\tif(rId < 0) for(rId = 1; rels['!id']['rId' + rId]; ++rId){/* empty */}\n\trelobj.Id = 'rId' + rId;\n\trelobj.Type = type;\n\trelobj.Target = f;\n\tif(targetmode) relobj.TargetMode = targetmode;\n\telse if(RELS_EXTERN.indexOf(relobj.Type) > -1) relobj.TargetMode = \"External\";\n\tif(rels['!id'][relobj.Id]) throw new Error(\"Cannot rewrite rId \" + rId);\n\trels['!id'][relobj.Id] = relobj;\n\trels[('/' + relobj.Target).replace(\"//\",\"/\")] = relobj;\n\treturn rId;\n}\n/* Open Document Format for Office Applications (OpenDocument) Version 1.2 */\n/* Part 3 Section 4 Manifest File */\nvar CT_ODS = \"application/vnd.oasis.opendocument.spreadsheet\";\nfunction parse_manifest(d, opts) {\n\tvar str = xlml_normalize(d);\n\tvar Rn;\n\tvar FEtag;\n\twhile((Rn = xlmlregex.exec(str))) switch(Rn[3]) {\n\t\tcase 'manifest': break; // 4.2 \n\t\tcase 'file-entry': // 4.3 \n\t\t\tFEtag = parsexmltag(Rn[0], false);\n\t\t\tif(FEtag.path == '/' && FEtag.type !== CT_ODS) throw new Error(\"This OpenDocument is not a spreadsheet\");\n\t\t\tbreak;\n\t\tcase 'encryption-data': // 4.4 \n\t\tcase 'algorithm': // 4.5 \n\t\tcase 'start-key-generation': // 4.6 \n\t\tcase 'key-derivation': // 4.7 \n\t\t\tthrow new Error(\"Unsupported ODS Encryption\");\n\t\tdefault: if(opts && opts.WTF) throw Rn;\n\t}\n}\n\nfunction write_manifest(manifest) {\n\tvar o = [XML_HEADER];\n\to.push('\\n');\n\to.push(' \\n');\n\tfor(var i = 0; i < manifest.length; ++i) o.push(' \\n');\n\to.push('');\n\treturn o.join(\"\");\n}\n\n/* Part 3 Section 6 Metadata Manifest File */\nfunction write_rdf_type(file, res, tag) {\n\treturn [\n\t\t' \\n',\n\t\t' \\n',\n\t\t' \\n'\n\t].join(\"\");\n}\nfunction write_rdf_has(base, file) {\n\treturn [\n\t\t' \\n',\n\t\t' \\n',\n\t\t' \\n'\n\t].join(\"\");\n}\nfunction write_rdf(rdf) {\n\tvar o = [XML_HEADER];\n\to.push('\\n');\n\tfor(var i = 0; i != rdf.length; ++i) {\n\t\to.push(write_rdf_type(rdf[i][0], rdf[i][1]));\n\t\to.push(write_rdf_has(\"\",rdf[i][0]));\n\t}\n\to.push(write_rdf_type(\"\",\"Document\", \"pkg\"));\n\to.push('');\n\treturn o.join(\"\");\n}\n/* TODO: pull properties */\nvar write_meta_ods = (function() {\n\tvar payload = 'Sheet' + 'JS ' + XLSX.version + '';\n\treturn function wmo() {\n\t\treturn payload;\n\t};\n})();\n\n/* ECMA-376 Part II 11.1 Core Properties Part */\n/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */\nvar CORE_PROPS = [\n\t[\"cp:category\", \"Category\"],\n\t[\"cp:contentStatus\", \"ContentStatus\"],\n\t[\"cp:keywords\", \"Keywords\"],\n\t[\"cp:lastModifiedBy\", \"LastAuthor\"],\n\t[\"cp:lastPrinted\", \"LastPrinted\"],\n\t[\"cp:revision\", \"RevNumber\"],\n\t[\"cp:version\", \"Version\"],\n\t[\"dc:creator\", \"Author\"],\n\t[\"dc:description\", \"Comments\"],\n\t[\"dc:identifier\", \"Identifier\"],\n\t[\"dc:language\", \"Language\"],\n\t[\"dc:subject\", \"Subject\"],\n\t[\"dc:title\", \"Title\"],\n\t[\"dcterms:created\", \"CreatedDate\", 'date'],\n\t[\"dcterms:modified\", \"ModifiedDate\", 'date']\n];\n\nXMLNS.CORE_PROPS = \"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\";\nRELS.CORE_PROPS = 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties';\n\nvar CORE_PROPS_REGEX = (function() {\n\tvar r = new Array(CORE_PROPS.length);\n\tfor(var i = 0; i < CORE_PROPS.length; ++i) {\n\t\tvar f = CORE_PROPS[i];\n\t\tvar g = \"(?:\"+ f[0].slice(0,f[0].indexOf(\":\")) +\":)\"+ f[0].slice(f[0].indexOf(\":\")+1);\n\t\tr[i] = new RegExp(\"<\" + g + \"[^>]*>([\\\\s\\\\S]*?)<\\/\" + g + \">\");\n\t}\n\treturn r;\n})();\n\nfunction parse_core_props(data) {\n\tvar p = {};\n\tdata = utf8read(data);\n\n\tfor(var i = 0; i < CORE_PROPS.length; ++i) {\n\t\tvar f = CORE_PROPS[i], cur = data.match(CORE_PROPS_REGEX[i]);\n\t\tif(cur != null && cur.length > 0) p[f[1]] = unescapexml(cur[1]);\n\t\tif(f[2] === 'date' && p[f[1]]) p[f[1]] = parseDate(p[f[1]]);\n\t}\n\n\treturn p;\n}\n\nvar CORE_PROPS_XML_ROOT = writextag('cp:coreProperties', null, {\n\t//'xmlns': XMLNS.CORE_PROPS,\n\t'xmlns:cp': XMLNS.CORE_PROPS,\n\t'xmlns:dc': XMLNS.dc,\n\t'xmlns:dcterms': XMLNS.dcterms,\n\t'xmlns:dcmitype': XMLNS.dcmitype,\n\t'xmlns:xsi': XMLNS.xsi\n});\n\nfunction cp_doit(f, g, h, o, p) {\n\tif(p[f] != null || g == null || g === \"\") return;\n\tp[f] = g;\n\tg = escapexml(g);\n\to[o.length] = (h ? writextag(f,g,h) : writetag(f,g));\n}\n\nfunction write_core_props(cp, _opts) {\n\tvar opts = _opts || {};\n\tvar o = [XML_HEADER, CORE_PROPS_XML_ROOT], p = {};\n\tif(!cp && !opts.Props) return o.join(\"\");\n\n\tif(cp) {\n\t\tif(cp.CreatedDate != null) cp_doit(\"dcterms:created\", typeof cp.CreatedDate === \"string\" ? cp.CreatedDate : write_w3cdtf(cp.CreatedDate, opts.WTF), {\"xsi:type\":\"dcterms:W3CDTF\"}, o, p);\n\t\tif(cp.ModifiedDate != null) cp_doit(\"dcterms:modified\", typeof cp.ModifiedDate === \"string\" ? cp.ModifiedDate : write_w3cdtf(cp.ModifiedDate, opts.WTF), {\"xsi:type\":\"dcterms:W3CDTF\"}, o, p);\n\t}\n\n\tfor(var i = 0; i != CORE_PROPS.length; ++i) {\n\t\tvar f = CORE_PROPS[i];\n\t\tvar v = opts.Props && opts.Props[f[1]] != null ? opts.Props[f[1]] : cp ? cp[f[1]] : null;\n\t\tif(v === true) v = \"1\";\n\t\telse if(v === false) v = \"0\";\n\t\telse if(typeof v == \"number\") v = String(v);\n\t\tif(v != null) cp_doit(f[0], v, null, o, p);\n\t}\n\tif(o.length>2){ o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* 15.2.12.3 Extended File Properties Part */\n/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */\nvar EXT_PROPS = [\n\t[\"Application\", \"Application\", \"string\"],\n\t[\"AppVersion\", \"AppVersion\", \"string\"],\n\t[\"Company\", \"Company\", \"string\"],\n\t[\"DocSecurity\", \"DocSecurity\", \"string\"],\n\t[\"Manager\", \"Manager\", \"string\"],\n\t[\"HyperlinksChanged\", \"HyperlinksChanged\", \"bool\"],\n\t[\"SharedDoc\", \"SharedDoc\", \"bool\"],\n\t[\"LinksUpToDate\", \"LinksUpToDate\", \"bool\"],\n\t[\"ScaleCrop\", \"ScaleCrop\", \"bool\"],\n\t[\"HeadingPairs\", \"HeadingPairs\", \"raw\"],\n\t[\"TitlesOfParts\", \"TitlesOfParts\", \"raw\"]\n];\n\nXMLNS.EXT_PROPS = \"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\";\nRELS.EXT_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties';\n\nvar PseudoPropsPairs = [\n\t\"Worksheets\", \"SheetNames\",\n\t\"NamedRanges\", \"DefinedNames\",\n\t\"Chartsheets\", \"ChartNames\"\n];\nfunction load_props_pairs(HP, TOP, props, opts) {\n\tvar v = [];\n\tif(typeof HP == \"string\") v = parseVector(HP, opts);\n\telse for(var j = 0; j < HP.length; ++j) v = v.concat(HP[j].map(function(hp) { return {v:hp}; }));\n\tvar parts = (typeof TOP == \"string\") ? parseVector(TOP, opts).map(function (x) { return x.v; }) : TOP;\n\tvar idx = 0, len = 0;\n\tif(parts.length > 0) for(var i = 0; i !== v.length; i += 2) {\n\t\tlen = +(v[i+1].v);\n\t\tswitch(v[i].v) {\n\t\t\tcase \"Worksheets\":\n\t\t\tcase \"工作表\":\n\t\t\tcase \"Листы\":\n\t\t\tcase \"أوراق العمل\":\n\t\t\tcase \"ワークシート\":\n\t\t\tcase \"גליונות עבודה\":\n\t\t\tcase \"Arbeitsblätter\":\n\t\t\tcase \"Çalışma Sayfaları\":\n\t\t\tcase \"Feuilles de calcul\":\n\t\t\tcase \"Fogli di lavoro\":\n\t\t\tcase \"Folhas de cálculo\":\n\t\t\tcase \"Planilhas\":\n\t\t\tcase \"Regneark\":\n\t\t\tcase \"Hojas de cálculo\":\n\t\t\tcase \"Werkbladen\":\n\t\t\t\tprops.Worksheets = len;\n\t\t\t\tprops.SheetNames = parts.slice(idx, idx + len);\n\t\t\t\tbreak;\n\n\t\t\tcase \"Named Ranges\":\n\t\t\tcase \"Rangos con nombre\":\n\t\t\tcase \"名前付き一覧\":\n\t\t\tcase \"Benannte Bereiche\":\n\t\t\tcase \"Navngivne områder\":\n\t\t\t\tprops.NamedRanges = len;\n\t\t\t\tprops.DefinedNames = parts.slice(idx, idx + len);\n\t\t\t\tbreak;\n\n\t\t\tcase \"Charts\":\n\t\t\tcase \"Diagramme\":\n\t\t\t\tprops.Chartsheets = len;\n\t\t\t\tprops.ChartNames = parts.slice(idx, idx + len);\n\t\t\t\tbreak;\n\t\t}\n\t\tidx += len;\n\t}\n}\n\nfunction parse_ext_props(data, p, opts) {\n\tvar q = {}; if(!p) p = {};\n\tdata = utf8read(data);\n\n\tEXT_PROPS.forEach(function(f) {\n\t\tvar xml = (data.match(matchtag(f[0]))||[])[1];\n\t\tswitch(f[2]) {\n\t\t\tcase \"string\": if(xml) p[f[1]] = unescapexml(xml); break;\n\t\t\tcase \"bool\": p[f[1]] = xml === \"true\"; break;\n\t\t\tcase \"raw\":\n\t\t\t\tvar cur = data.match(new RegExp(\"<\" + f[0] + \"[^>]*>([\\\\s\\\\S]*?)<\\/\" + f[0] + \">\"));\n\t\t\t\tif(cur && cur.length > 0) q[f[1]] = cur[1];\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tif(q.HeadingPairs && q.TitlesOfParts) load_props_pairs(q.HeadingPairs, q.TitlesOfParts, p, opts);\n\n\treturn p;\n}\n\nvar EXT_PROPS_XML_ROOT = writextag('Properties', null, {\n\t'xmlns': XMLNS.EXT_PROPS,\n\t'xmlns:vt': XMLNS.vt\n});\n\nfunction write_ext_props(cp) {\n\tvar o = [], W = writextag;\n\tif(!cp) cp = {};\n\tcp.Application = \"SheetJS\";\n\to[o.length] = (XML_HEADER);\n\to[o.length] = (EXT_PROPS_XML_ROOT);\n\n\tEXT_PROPS.forEach(function(f) {\n\t\tif(cp[f[1]] === undefined) return;\n\t\tvar v;\n\t\tswitch(f[2]) {\n\t\t\tcase 'string': v = escapexml(String(cp[f[1]])); break;\n\t\t\tcase 'bool': v = cp[f[1]] ? 'true' : 'false'; break;\n\t\t}\n\t\tif(v !== undefined) o[o.length] = (W(f[0], v));\n\t});\n\n\t/* TODO: HeadingPairs, TitlesOfParts */\n\to[o.length] = (W('HeadingPairs', W('vt:vector', W('vt:variant', 'Worksheets')+W('vt:variant', W('vt:i4', String(cp.Worksheets))), {size:2, baseType:\"variant\"})));\n\to[o.length] = (W('TitlesOfParts', W('vt:vector', cp.SheetNames.map(function(s) { return \"\" + escapexml(s) + \"\"; }).join(\"\"), {size: cp.Worksheets, baseType:\"lpstr\"})));\n\tif(o.length>2){ o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* 15.2.12.2 Custom File Properties Part */\nXMLNS.CUST_PROPS = \"http://schemas.openxmlformats.org/officeDocument/2006/custom-properties\";\nRELS.CUST_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties';\n\nvar custregex = /<[^>]+>[^<]*/g;\nfunction parse_cust_props(data, opts) {\n\tvar p = {}, name = \"\";\n\tvar m = data.match(custregex);\n\tif(m) for(var i = 0; i != m.length; ++i) {\n\t\tvar x = m[i], y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\tcase '': name = null; break;\n\t\t\tdefault: if (x.indexOf('');\n\t\t\t\tvar type = toks[0].slice(4), text = toks[1];\n\t\t\t\t/* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase 'lpstr': case 'bstr': case 'lpwstr':\n\t\t\t\t\t\tp[name] = unescapexml(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'bool':\n\t\t\t\t\t\tp[name] = parsexmlbool(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'i1': case 'i2': case 'i4': case 'i8': case 'int': case 'uint':\n\t\t\t\t\t\tp[name] = parseInt(text, 10);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'r4': case 'r8': case 'decimal':\n\t\t\t\t\t\tp[name] = parseFloat(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'filetime': case 'date':\n\t\t\t\t\t\tp[name] = parseDate(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'cy': case 'error':\n\t\t\t\t\t\tp[name] = unescapexml(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif(type.slice(-1) == '/') break;\n\t\t\t\t\t\tif(opts.WTF && typeof console !== 'undefined') console.warn('Unexpected', x, type, toks);\n\t\t\t\t}\n\t\t\t} else if(x.slice(0,2) === \"2){ o[o.length] = ''; o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* Common Name -> XLML Name */\nvar XLMLDocPropsMap = {\n\tTitle: 'Title',\n\tSubject: 'Subject',\n\tAuthor: 'Author',\n\tKeywords: 'Keywords',\n\tComments: 'Description',\n\tLastAuthor: 'LastAuthor',\n\tRevNumber: 'Revision',\n\tApplication: 'AppName',\n\t/* TotalTime: 'TotalTime', */\n\tLastPrinted: 'LastPrinted',\n\tCreatedDate: 'Created',\n\tModifiedDate: 'LastSaved',\n\t/* Pages */\n\t/* Words */\n\t/* Characters */\n\tCategory: 'Category',\n\t/* PresentationFormat */\n\tManager: 'Manager',\n\tCompany: 'Company',\n\t/* Guid */\n\t/* HyperlinkBase */\n\t/* Bytes */\n\t/* Lines */\n\t/* Paragraphs */\n\t/* CharactersWithSpaces */\n\tAppVersion: 'Version',\n\n\tContentStatus: 'ContentStatus', /* NOTE: missing from schema */\n\tIdentifier: 'Identifier', /* NOTE: missing from schema */\n\tLanguage: 'Language' /* NOTE: missing from schema */\n};\nvar evert_XLMLDPM = evert(XLMLDocPropsMap);\n\nfunction xlml_set_prop(Props, tag, val) {\n\ttag = evert_XLMLDPM[tag] || tag;\n\tProps[tag] = val;\n}\n\nfunction xlml_write_docprops(Props, opts) {\n\tvar o = [];\n\tkeys(XLMLDocPropsMap).map(function(m) {\n\t\tfor(var i = 0; i < CORE_PROPS.length; ++i) if(CORE_PROPS[i][1] == m) return CORE_PROPS[i];\n\t\tfor(i = 0; i < EXT_PROPS.length; ++i) if(EXT_PROPS[i][1] == m) return EXT_PROPS[i];\n\t\tthrow m;\n\t}).forEach(function(p) {\n\t\tif(Props[p[1]] == null) return;\n\t\tvar m = opts && opts.Props && opts.Props[p[1]] != null ? opts.Props[p[1]] : Props[p[1]];\n\t\tswitch(p[2]) {\n\t\t\tcase 'date': m = new Date(m).toISOString().replace(/\\.\\d*Z/,\"Z\"); break;\n\t\t}\n\t\tif(typeof m == 'number') m = String(m);\n\t\telse if(m === true || m === false) { m = m ? \"1\" : \"0\"; }\n\t\telse if(m instanceof Date) m = new Date(m).toISOString().replace(/\\.\\d*Z/,\"\");\n\t\to.push(writetag(XLMLDocPropsMap[p[1]] || p[1], m));\n\t});\n\treturn writextag('DocumentProperties', o.join(\"\"), {xmlns:XLMLNS.o });\n}\nfunction xlml_write_custprops(Props, Custprops) {\n\tvar BLACKLIST = [\"Worksheets\",\"SheetNames\"];\n\tvar T = 'CustomDocumentProperties';\n\tvar o = [];\n\tif(Props) keys(Props).forEach(function(k) {\nif(!Object.prototype.hasOwnProperty.call(Props, k)) return;\n\t\tfor(var i = 0; i < CORE_PROPS.length; ++i) if(k == CORE_PROPS[i][1]) return;\n\t\tfor(i = 0; i < EXT_PROPS.length; ++i) if(k == EXT_PROPS[i][1]) return;\n\t\tfor(i = 0; i < BLACKLIST.length; ++i) if(k == BLACKLIST[i]) return;\n\n\t\tvar m = Props[k];\n\t\tvar t = \"string\";\n\t\tif(typeof m == 'number') { t = \"float\"; m = String(m); }\n\t\telse if(m === true || m === false) { t = \"boolean\"; m = m ? \"1\" : \"0\"; }\n\t\telse m = String(m);\n\t\to.push(writextag(escapexmltag(k), m, {\"dt:dt\":t}));\n\t});\n\tif(Custprops) keys(Custprops).forEach(function(k) {\nif(!Object.prototype.hasOwnProperty.call(Custprops, k)) return;\n\t\tif(Props && Object.prototype.hasOwnProperty.call(Props, k)) return;\n\t\tvar m = Custprops[k];\n\t\tvar t = \"string\";\n\t\tif(typeof m == 'number') { t = \"float\"; m = String(m); }\n\t\telse if(m === true || m === false) { t = \"boolean\"; m = m ? \"1\" : \"0\"; }\n\t\telse if(m instanceof Date) { t = \"dateTime.tz\"; m = m.toISOString(); }\n\t\telse m = String(m);\n\t\to.push(writextag(escapexmltag(k), m, {\"dt:dt\":t}));\n\t});\n\treturn '<' + T + ' xmlns=\"' + XLMLNS.o + '\">' + o.join(\"\") + '';\n}\n/* [MS-DTYP] 2.3.3 FILETIME */\n/* [MS-OLEDS] 2.1.3 FILETIME (Packet Version) */\n/* [MS-OLEPS] 2.8 FILETIME (Packet Version) */\nfunction parse_FILETIME(blob) {\n\tvar dwLowDateTime = blob.read_shift(4), dwHighDateTime = blob.read_shift(4);\n\treturn new Date(((dwHighDateTime/1e7*Math.pow(2,32) + dwLowDateTime/1e7) - 11644473600)*1000).toISOString().replace(/\\.000/,\"\");\n}\nfunction write_FILETIME(time) {\n\tvar date = (typeof time == \"string\") ? new Date(Date.parse(time)) : time;\n\tvar t = date.getTime() / 1000 + 11644473600;\n\tvar l = t % Math.pow(2,32), h = (t - l) / Math.pow(2,32);\n\tl *= 1e7; h *= 1e7;\n\tvar w = (l / Math.pow(2,32)) | 0;\n\tif(w > 0) { l = l % Math.pow(2,32); h += w; }\n\tvar o = new_buf(8); o.write_shift(4, l); o.write_shift(4, h); return o;\n}\n\n/* [MS-OSHARED] 2.3.3.1.4 Lpstr */\nfunction parse_lpstr(blob, type, pad) {\n\tvar start = blob.l;\n\tvar str = blob.read_shift(0, 'lpstr-cp');\n\tif(pad) while((blob.l - start) & 3) ++blob.l;\n\treturn str;\n}\n\n/* [MS-OSHARED] 2.3.3.1.6 Lpwstr */\nfunction parse_lpwstr(blob, type, pad) {\n\tvar str = blob.read_shift(0, 'lpwstr');\n\tif(pad) blob.l += (4 - ((str.length+1) & 3)) & 3;\n\treturn str;\n}\n\n\n/* [MS-OSHARED] 2.3.3.1.11 VtString */\n/* [MS-OSHARED] 2.3.3.1.12 VtUnalignedString */\nfunction parse_VtStringBase(blob, stringType, pad) {\n\tif(stringType === 0x1F /*VT_LPWSTR*/) return parse_lpwstr(blob);\n\treturn parse_lpstr(blob, stringType, pad);\n}\n\nfunction parse_VtString(blob, t, pad) { return parse_VtStringBase(blob, t, pad === false ? 0: 4); }\nfunction parse_VtUnalignedString(blob, t) { if(!t) throw new Error(\"VtUnalignedString must have positive length\"); return parse_VtStringBase(blob, t, 0); }\n\n/* [MS-OSHARED] 2.3.3.1.7 VtVecLpwstrValue */\nfunction parse_VtVecLpwstrValue(blob) {\n\tvar length = blob.read_shift(4);\n\tvar ret = [];\n\tfor(var i = 0; i != length; ++i) {\n\t\tvar start = blob.l;\n\t\tret[i] = blob.read_shift(0, 'lpwstr').replace(chr0,'');\n\t\tif((blob.l - start) & 0x02) blob.l += 2;\n\t}\n\treturn ret;\n}\n\n/* [MS-OSHARED] 2.3.3.1.9 VtVecUnalignedLpstrValue */\nfunction parse_VtVecUnalignedLpstrValue(blob) {\n\tvar length = blob.read_shift(4);\n\tvar ret = [];\n\tfor(var i = 0; i != length; ++i) ret[i] = blob.read_shift(0, 'lpstr-cp').replace(chr0,'');\n\treturn ret;\n}\n\n\n/* [MS-OSHARED] 2.3.3.1.13 VtHeadingPair */\nfunction parse_VtHeadingPair(blob) {\n\tvar start = blob.l;\n\tvar headingString = parse_TypedPropertyValue(blob, VT_USTR);\n\tif(blob[blob.l] == 0x00 && blob[blob.l+1] == 0x00 && ((blob.l - start) & 0x02)) blob.l += 2;\n\tvar headerParts = parse_TypedPropertyValue(blob, VT_I4);\n\treturn [headingString, headerParts];\n}\n\n/* [MS-OSHARED] 2.3.3.1.14 VtVecHeadingPairValue */\nfunction parse_VtVecHeadingPairValue(blob) {\n\tvar cElements = blob.read_shift(4);\n\tvar out = [];\n\tfor(var i = 0; i < cElements / 2; ++i) out.push(parse_VtHeadingPair(blob));\n\treturn out;\n}\n\n/* [MS-OLEPS] 2.18.1 Dictionary (uses 2.17, 2.16) */\nfunction parse_dictionary(blob,CodePage) {\n\tvar cnt = blob.read_shift(4);\n\tvar dict = ({});\n\tfor(var j = 0; j != cnt; ++j) {\n\t\tvar pid = blob.read_shift(4);\n\t\tvar len = blob.read_shift(4);\n\t\tdict[pid] = blob.read_shift(len, (CodePage === 0x4B0 ?'utf16le':'utf8')).replace(chr0,'').replace(chr1,'!');\n\t\tif(CodePage === 0x4B0 && (len % 2)) blob.l += 2;\n\t}\n\tif(blob.l & 3) blob.l = (blob.l>>2+1)<<2;\n\treturn dict;\n}\n\n/* [MS-OLEPS] 2.9 BLOB */\nfunction parse_BLOB(blob) {\n\tvar size = blob.read_shift(4);\n\tvar bytes = blob.slice(blob.l,blob.l+size);\n\tblob.l += size;\n\tif((size & 3) > 0) blob.l += (4 - (size & 3)) & 3;\n\treturn bytes;\n}\n\n/* [MS-OLEPS] 2.11 ClipboardData */\nfunction parse_ClipboardData(blob) {\n\t// TODO\n\tvar o = {};\n\to.Size = blob.read_shift(4);\n\t//o.Format = blob.read_shift(4);\n\tblob.l += o.Size + 3 - (o.Size - 1) % 4;\n\treturn o;\n}\n\n/* [MS-OLEPS] 2.15 TypedPropertyValue */\nfunction parse_TypedPropertyValue(blob, type, _opts) {\n\tvar t = blob.read_shift(2), ret, opts = _opts||{};\n\tblob.l += 2;\n\tif(type !== VT_VARIANT)\n\tif(t !== type && VT_CUSTOM.indexOf(type)===-1 && !((type & 0xFFFE) == 0x101E && (t & 0xFFFE) == 0x101E)) throw new Error('Expected type ' + type + ' saw ' + t);\n\tswitch(type === VT_VARIANT ? t : type) {\n\t\tcase 0x02 /*VT_I2*/: ret = blob.read_shift(2, 'i'); if(!opts.raw) blob.l += 2; return ret;\n\t\tcase 0x03 /*VT_I4*/: ret = blob.read_shift(4, 'i'); return ret;\n\t\tcase 0x0B /*VT_BOOL*/: return blob.read_shift(4) !== 0x0;\n\t\tcase 0x13 /*VT_UI4*/: ret = blob.read_shift(4); return ret;\n\t\tcase 0x1E /*VT_LPSTR*/: return parse_lpstr(blob, t, 4).replace(chr0,'');\n\t\tcase 0x1F /*VT_LPWSTR*/: return parse_lpwstr(blob);\n\t\tcase 0x40 /*VT_FILETIME*/: return parse_FILETIME(blob);\n\t\tcase 0x41 /*VT_BLOB*/: return parse_BLOB(blob);\n\t\tcase 0x47 /*VT_CF*/: return parse_ClipboardData(blob);\n\t\tcase 0x50 /*VT_STRING*/: return parse_VtString(blob, t, !opts.raw).replace(chr0,'');\n\t\tcase 0x51 /*VT_USTR*/: return parse_VtUnalignedString(blob, t/*, 4*/).replace(chr0,'');\n\t\tcase 0x100C /*VT_VECTOR|VT_VARIANT*/: return parse_VtVecHeadingPairValue(blob);\n\t\tcase 0x101E /*VT_VECTOR|VT_LPSTR*/:\n\t\tcase 0x101F /*VT_VECTOR|VT_LPWSTR*/:\n\t\t\treturn t == 0x101F ? parse_VtVecLpwstrValue(blob) : parse_VtVecUnalignedLpstrValue(blob);\n\t\tdefault: throw new Error(\"TypedPropertyValue unrecognized type \" + type + \" \" + t);\n\t}\n}\nfunction write_TypedPropertyValue(type, value) {\n\tvar o = new_buf(4), p = new_buf(4);\n\to.write_shift(4, type == 0x50 ? 0x1F : type);\n\tswitch(type) {\n\t\tcase 0x03 /*VT_I4*/: p.write_shift(-4, value); break;\n\t\tcase 0x05 /*VT_I4*/: p = new_buf(8); p.write_shift(8, value, 'f'); break;\n\t\tcase 0x0B /*VT_BOOL*/: p.write_shift(4, value ? 0x01 : 0x00); break;\n\t\tcase 0x40 /*VT_FILETIME*/: p = write_FILETIME(value); break;\n\t\tcase 0x1F /*VT_LPWSTR*/:\n\t\tcase 0x50 /*VT_STRING*/:\np = new_buf(4 + 2 * (value.length + 1) + (value.length % 2 ? 0 : 2));\n\t\t\tp.write_shift(4, value.length + 1);\n\t\t\tp.write_shift(0, value, \"dbcs\");\n\t\t\twhile(p.l != p.length) p.write_shift(1, 0);\n\t\t\tbreak;\n\t\tdefault: throw new Error(\"TypedPropertyValue unrecognized type \" + type + \" \" + value);\n\t}\n\treturn bconcat([o, p]);\n}\n\n/* [MS-OLEPS] 2.20 PropertySet */\nfunction parse_PropertySet(blob, PIDSI) {\n\tvar start_addr = blob.l;\n\tvar size = blob.read_shift(4);\n\tvar NumProps = blob.read_shift(4);\n\tvar Props = [], i = 0;\n\tvar CodePage = 0;\n\tvar Dictionary = -1, DictObj = ({});\n\tfor(i = 0; i != NumProps; ++i) {\n\t\tvar PropID = blob.read_shift(4);\n\t\tvar Offset = blob.read_shift(4);\n\t\tProps[i] = [PropID, Offset + start_addr];\n\t}\n\tProps.sort(function(x,y) { return x[1] - y[1]; });\n\tvar PropH = {};\n\tfor(i = 0; i != NumProps; ++i) {\n\t\tif(blob.l !== Props[i][1]) {\n\t\t\tvar fail = true;\n\t\t\tif(i>0 && PIDSI) switch(PIDSI[Props[i-1][0]].t) {\n\t\t\t\tcase 0x02 /*VT_I2*/: if(blob.l+2 === Props[i][1]) { blob.l+=2; fail = false; } break;\n\t\t\t\tcase 0x50 /*VT_STRING*/: if(blob.l <= Props[i][1]) { blob.l=Props[i][1]; fail = false; } break;\n\t\t\t\tcase 0x100C /*VT_VECTOR|VT_VARIANT*/: if(blob.l <= Props[i][1]) { blob.l=Props[i][1]; fail = false; } break;\n\t\t\t}\n\t\t\tif((!PIDSI||i==0) && blob.l <= Props[i][1]) { fail=false; blob.l = Props[i][1]; }\n\t\t\tif(fail) throw new Error(\"Read Error: Expected address \" + Props[i][1] + ' at ' + blob.l + ' :' + i);\n\t\t}\n\t\tif(PIDSI) {\n\t\t\tvar piddsi = PIDSI[Props[i][0]];\n\t\t\tPropH[piddsi.n] = parse_TypedPropertyValue(blob, piddsi.t, {raw:true});\n\t\t\tif(piddsi.p === 'version') PropH[piddsi.n] = String(PropH[piddsi.n] >> 16) + \".\" + (\"0000\" + String(PropH[piddsi.n] & 0xFFFF)).slice(-4);\n\t\t\tif(piddsi.n == \"CodePage\") switch(PropH[piddsi.n]) {\n\t\t\t\tcase 0: PropH[piddsi.n] = 1252;\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase 874:\n\t\t\t\tcase 932:\n\t\t\t\tcase 936:\n\t\t\t\tcase 949:\n\t\t\t\tcase 950:\n\t\t\t\tcase 1250:\n\t\t\t\tcase 1251:\n\t\t\t\tcase 1253:\n\t\t\t\tcase 1254:\n\t\t\t\tcase 1255:\n\t\t\t\tcase 1256:\n\t\t\t\tcase 1257:\n\t\t\t\tcase 1258:\n\t\t\t\tcase 10000:\n\t\t\t\tcase 1200:\n\t\t\t\tcase 1201:\n\t\t\t\tcase 1252:\n\t\t\t\tcase 65000: case -536:\n\t\t\t\tcase 65001: case -535:\n\t\t\t\t\tset_cp(CodePage = (PropH[piddsi.n]>>>0) & 0xFFFF); break;\n\t\t\t\tdefault: throw new Error(\"Unsupported CodePage: \" + PropH[piddsi.n]);\n\t\t\t}\n\t\t} else {\n\t\t\tif(Props[i][0] === 0x1) {\n\t\t\t\tCodePage = PropH.CodePage = (parse_TypedPropertyValue(blob, VT_I2));\n\t\t\t\tset_cp(CodePage);\n\t\t\t\tif(Dictionary !== -1) {\n\t\t\t\t\tvar oldpos = blob.l;\n\t\t\t\t\tblob.l = Props[Dictionary][1];\n\t\t\t\t\tDictObj = parse_dictionary(blob,CodePage);\n\t\t\t\t\tblob.l = oldpos;\n\t\t\t\t}\n\t\t\t} else if(Props[i][0] === 0) {\n\t\t\t\tif(CodePage === 0) { Dictionary = i; blob.l = Props[i+1][1]; continue; }\n\t\t\t\tDictObj = parse_dictionary(blob,CodePage);\n\t\t\t} else {\n\t\t\t\tvar name = DictObj[Props[i][0]];\n\t\t\t\tvar val;\n\t\t\t\t/* [MS-OSHARED] 2.3.3.2.3.1.2 + PROPVARIANT */\n\t\t\t\tswitch(blob[blob.l]) {\n\t\t\t\t\tcase 0x41 /*VT_BLOB*/: blob.l += 4; val = parse_BLOB(blob); break;\n\t\t\t\t\tcase 0x1E /*VT_LPSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]).replace(/\\u0000+$/,\"\"); break;\n\t\t\t\t\tcase 0x1F /*VT_LPWSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]).replace(/\\u0000+$/,\"\"); break;\n\t\t\t\t\tcase 0x03 /*VT_I4*/: blob.l += 4; val = blob.read_shift(4, 'i'); break;\n\t\t\t\t\tcase 0x13 /*VT_UI4*/: blob.l += 4; val = blob.read_shift(4); break;\n\t\t\t\t\tcase 0x05 /*VT_R8*/: blob.l += 4; val = blob.read_shift(8, 'f'); break;\n\t\t\t\t\tcase 0x0B /*VT_BOOL*/: blob.l += 4; val = parsebool(blob, 4); break;\n\t\t\t\t\tcase 0x40 /*VT_FILETIME*/: blob.l += 4; val = parseDate(parse_FILETIME(blob)); break;\n\t\t\t\t\tdefault: throw new Error(\"unparsed value: \" + blob[blob.l]);\n\t\t\t\t}\n\t\t\t\tPropH[name] = val;\n\t\t\t}\n\t\t}\n\t}\n\tblob.l = start_addr + size; /* step ahead to skip padding */\n\treturn PropH;\n}\nvar XLSPSSkip = [ \"CodePage\", \"Thumbnail\", \"_PID_LINKBASE\", \"_PID_HLINKS\", \"SystemIdentifier\", \"FMTID\" ].concat(PseudoPropsPairs);\nfunction guess_property_type(val) {\n\tswitch(typeof val) {\n\t\tcase \"boolean\": return 0x0B;\n\t\tcase \"number\": return ((val|0)==val) ? 0x03 : 0x05;\n\t\tcase \"string\": return 0x1F;\n\t\tcase \"object\": if(val instanceof Date) return 0x40; break;\n\t}\n\treturn -1;\n}\nfunction write_PropertySet(entries, RE, PIDSI) {\n\tvar hdr = new_buf(8), piao = [], prop = [];\n\tvar sz = 8, i = 0;\n\n\tvar pr = new_buf(8), pio = new_buf(8);\n\tpr.write_shift(4, 0x0002);\n\tpr.write_shift(4, 0x04B0);\n\tpio.write_shift(4, 0x0001);\n\tprop.push(pr); piao.push(pio);\n\tsz += 8 + pr.length;\n\n\tif(!RE) {\n\t\tpio = new_buf(8);\n\t\tpio.write_shift(4, 0);\n\t\tpiao.unshift(pio);\n\n\t\tvar bufs = [new_buf(4)];\n\t\tbufs[0].write_shift(4, entries.length);\n\t\tfor(i = 0; i < entries.length; ++i) {\n\t\t\tvar value = entries[i][0];\n\t\t\tpr = new_buf(4 + 4 + 2 * (value.length + 1) + (value.length % 2 ? 0 : 2));\n\t\t\tpr.write_shift(4, i+2);\n\t\t\tpr.write_shift(4, value.length + 1);\n\t\t\tpr.write_shift(0, value, \"dbcs\");\n\t\t\twhile(pr.l != pr.length) pr.write_shift(1, 0);\n\t\t\tbufs.push(pr);\n\t\t}\n\t\tpr = bconcat(bufs);\n\t\tprop.unshift(pr);\n\t\tsz += 8 + pr.length;\n\t}\n\n\tfor(i = 0; i < entries.length; ++i) {\n\t\tif(RE && !RE[entries[i][0]]) continue;\n\t\tif(XLSPSSkip.indexOf(entries[i][0]) > -1) continue;\n\t\tif(entries[i][1] == null) continue;\n\n\t\tvar val = entries[i][1], idx = 0;\n\t\tif(RE) {\n\t\t\tidx = +RE[entries[i][0]];\n\t\t\tvar pinfo = (PIDSI)[idx];\n\t\t\tif(pinfo.p == \"version\" && typeof val == \"string\") {\nvar arr = val.split(\".\");\n\t\t\t\tval = ((+arr[0])<<16) + ((+arr[1])||0);\n\t\t\t}\n\t\t\tpr = write_TypedPropertyValue(pinfo.t, val);\n\t\t} else {\n\t\t\tvar T = guess_property_type(val);\n\t\t\tif(T == -1) { T = 0x1F; val = String(val); }\n\t\t\tpr = write_TypedPropertyValue(T, val);\n\t\t}\n\t\tprop.push(pr);\n\n\t\tpio = new_buf(8);\n\t\tpio.write_shift(4, !RE ? 2+i : idx);\n\t\tpiao.push(pio);\n\n\t\tsz += 8 + pr.length;\n\t}\n\n\tvar w = 8 * (prop.length + 1);\n\tfor(i = 0; i < prop.length; ++i) { piao[i].write_shift(4, w); w += prop[i].length; }\n\thdr.write_shift(4, sz);\n\thdr.write_shift(4, prop.length);\n\treturn bconcat([hdr].concat(piao).concat(prop));\n}\n\n/* [MS-OLEPS] 2.21 PropertySetStream */\nfunction parse_PropertySetStream(file, PIDSI, clsid) {\n\tvar blob = file.content;\n\tif(!blob) return ({});\n\tprep_blob(blob, 0);\n\n\tvar NumSets, FMTID0, FMTID1, Offset0, Offset1 = 0;\n\tblob.chk('feff', 'Byte Order: ');\n\n\t/*var vers = */blob.read_shift(2); // TODO: check version\n\tvar SystemIdentifier = blob.read_shift(4);\n\tvar CLSID = blob.read_shift(16);\n\tif(CLSID !== CFB.utils.consts.HEADER_CLSID && CLSID !== clsid) throw new Error(\"Bad PropertySet CLSID \" + CLSID);\n\tNumSets = blob.read_shift(4);\n\tif(NumSets !== 1 && NumSets !== 2) throw new Error(\"Unrecognized #Sets: \" + NumSets);\n\tFMTID0 = blob.read_shift(16); Offset0 = blob.read_shift(4);\n\n\tif(NumSets === 1 && Offset0 !== blob.l) throw new Error(\"Length mismatch: \" + Offset0 + \" !== \" + blob.l);\n\telse if(NumSets === 2) { FMTID1 = blob.read_shift(16); Offset1 = blob.read_shift(4); }\n\tvar PSet0 = parse_PropertySet(blob, PIDSI);\n\n\tvar rval = ({ SystemIdentifier: SystemIdentifier });\n\tfor(var y in PSet0) rval[y] = PSet0[y];\n\t//rval.blob = blob;\n\trval.FMTID = FMTID0;\n\t//rval.PSet0 = PSet0;\n\tif(NumSets === 1) return rval;\n\tif(Offset1 - blob.l == 2) blob.l += 2;\n\tif(blob.l !== Offset1) throw new Error(\"Length mismatch 2: \" + blob.l + \" !== \" + Offset1);\n\tvar PSet1;\n\ttry { PSet1 = parse_PropertySet(blob, null); } catch(e) {/* empty */}\n\tfor(y in PSet1) rval[y] = PSet1[y];\n\trval.FMTID = [FMTID0, FMTID1]; // TODO: verify FMTID0/1\n\treturn rval;\n}\nfunction write_PropertySetStream(entries, clsid, RE, PIDSI, entries2, clsid2) {\n\tvar hdr = new_buf(entries2 ? 68 : 48);\n\tvar bufs = [hdr];\n\thdr.write_shift(2, 0xFFFE);\n\thdr.write_shift(2, 0x0000); /* TODO: type 1 props */\n\thdr.write_shift(4, 0x32363237);\n\thdr.write_shift(16, CFB.utils.consts.HEADER_CLSID, \"hex\");\n\thdr.write_shift(4, (entries2 ? 2 : 1));\n\thdr.write_shift(16, clsid, \"hex\");\n\thdr.write_shift(4, (entries2 ? 68 : 48));\n\tvar ps0 = write_PropertySet(entries, RE, PIDSI);\n\tbufs.push(ps0);\n\n\tif(entries2) {\n\t\tvar ps1 = write_PropertySet(entries2, null, null);\n\t\thdr.write_shift(16, clsid2, \"hex\");\n\t\thdr.write_shift(4, 68 + ps0.length);\n\t\tbufs.push(ps1);\n\t}\n\treturn bconcat(bufs);\n}\n\nfunction parsenoop2(blob, length) { blob.read_shift(length); return null; }\nfunction writezeroes(n, o) { if(!o) o=new_buf(n); for(var j=0; j= 12 ? 2 : 1);\n\tvar encoding = 'sbcs-cont';\n\tvar cp = current_codepage;\n\tif(opts && opts.biff >= 8) current_codepage = 1200;\n\tif(!opts || opts.biff == 8 ) {\n\t\tvar fHighByte = blob.read_shift(1);\n\t\tif(fHighByte) { encoding = 'dbcs-cont'; }\n\t} else if(opts.biff == 12) {\n\t\tencoding = 'wstr';\n\t}\n\tif(opts.biff >= 2 && opts.biff <= 5) encoding = 'cpstr';\n\tvar o = cch ? blob.read_shift(cch, encoding) : \"\";\n\tcurrent_codepage = cp;\n\treturn o;\n}\n\n/* 2.5.293 XLUnicodeRichExtendedString */\nfunction parse_XLUnicodeRichExtendedString(blob) {\n\tvar cp = current_codepage;\n\tcurrent_codepage = 1200;\n\tvar cch = blob.read_shift(2), flags = blob.read_shift(1);\n\tvar /*fHighByte = flags & 0x1,*/ fExtSt = flags & 0x4, fRichSt = flags & 0x8;\n\tvar width = 1 + (flags & 0x1); // 0x0 -> utf8, 0x1 -> dbcs\n\tvar cRun = 0, cbExtRst;\n\tvar z = {};\n\tif(fRichSt) cRun = blob.read_shift(2);\n\tif(fExtSt) cbExtRst = blob.read_shift(4);\n\tvar encoding = width == 2 ? 'dbcs-cont' : 'sbcs-cont';\n\tvar msg = cch === 0 ? \"\" : blob.read_shift(cch, encoding);\n\tif(fRichSt) blob.l += 4 * cRun; //TODO: parse this\n\tif(fExtSt) blob.l += cbExtRst; //TODO: parse this\n\tz.t = msg;\n\tif(!fRichSt) { z.raw = \"\" + z.t + \"\"; z.r = z.t; }\n\tcurrent_codepage = cp;\n\treturn z;\n}\nfunction write_XLUnicodeRichExtendedString(xlstr) {\n\tvar str = (xlstr.t||\"\"), nfmts = 1;\n\n\tvar hdr = new_buf(3 + (nfmts > 1 ? 2 : 0));\n\thdr.write_shift(2, str.length);\n\thdr.write_shift(1, (nfmts > 1 ? 0x08 : 0x00) | 0x01);\n\tif(nfmts > 1) hdr.write_shift(2, nfmts);\n\n\tvar otext = new_buf(2 * str.length);\n\totext.write_shift(2 * str.length, str, 'utf16le');\n\n\tvar out = [hdr, otext];\n\n\treturn bconcat(out);\n}\n\n/* 2.5.296 XLUnicodeStringNoCch */\nfunction parse_XLUnicodeStringNoCch(blob, cch, opts) {\n\tvar retval;\n\tif(opts) {\n\t\tif(opts.biff >= 2 && opts.biff <= 5) return blob.read_shift(cch, 'cpstr');\n\t\tif(opts.biff >= 12) return blob.read_shift(cch, 'dbcs-cont');\n\t}\n\tvar fHighByte = blob.read_shift(1);\n\tif(fHighByte===0) { retval = blob.read_shift(cch, 'sbcs-cont'); }\n\telse { retval = blob.read_shift(cch, 'dbcs-cont'); }\n\treturn retval;\n}\n\n/* 2.5.294 XLUnicodeString */\nfunction parse_XLUnicodeString(blob, length, opts) {\n\tvar cch = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);\n\tif(cch === 0) { blob.l++; return \"\"; }\n\treturn parse_XLUnicodeStringNoCch(blob, cch, opts);\n}\n/* BIFF5 override */\nfunction parse_XLUnicodeString2(blob, length, opts) {\n\tif(opts.biff > 5) return parse_XLUnicodeString(blob, length, opts);\n\tvar cch = blob.read_shift(1);\n\tif(cch === 0) { blob.l++; return \"\"; }\n\treturn blob.read_shift(cch, (opts.biff <= 4 || !blob.lens ) ? 'cpstr' : 'sbcs-cont');\n}\n/* TODO: BIFF5 and lower, codepage awareness */\nfunction write_XLUnicodeString(str, opts, o) {\n\tif(!o) o = new_buf(3 + 2 * str.length);\n\to.write_shift(2, str.length);\n\to.write_shift(1, 1);\n\to.write_shift(31, str, 'utf16le');\n\treturn o;\n}\n\n/* [MS-XLS] 2.5.61 ControlInfo */\nfunction parse_ControlInfo(blob) {\n\tvar flags = blob.read_shift(1);\n\tblob.l++;\n\tvar accel = blob.read_shift(2);\n\tblob.l += 2;\n\treturn [flags, accel];\n}\n\n/* [MS-OSHARED] 2.3.7.6 URLMoniker TODO: flags */\nfunction parse_URLMoniker(blob) {\n\tvar len = blob.read_shift(4), start = blob.l;\n\tvar extra = false;\n\tif(len > 24) {\n\t\t/* look ahead */\n\t\tblob.l += len - 24;\n\t\tif(blob.read_shift(16) === \"795881f43b1d7f48af2c825dc4852763\") extra = true;\n\t\tblob.l = start;\n\t}\n\tvar url = blob.read_shift((extra?len-24:len)>>1, 'utf16le').replace(chr0,\"\");\n\tif(extra) blob.l += 24;\n\treturn url;\n}\n\n/* [MS-OSHARED] 2.3.7.8 FileMoniker TODO: all fields */\nfunction parse_FileMoniker(blob) {\n\tvar cAnti = blob.read_shift(2);\n\tvar preamble = \"\"; while(cAnti-- > 0) preamble += \"../\";\n\tvar ansiPath = blob.read_shift(0, 'lpstr-ansi');\n\tblob.l += 2; //var endServer = blob.read_shift(2);\n\tif(blob.read_shift(2) != 0xDEAD) throw new Error(\"Bad FileMoniker\");\n\tvar sz = blob.read_shift(4);\n\tif(sz === 0) return preamble + ansiPath.replace(/\\\\/g,\"/\");\n\tvar bytes = blob.read_shift(4);\n\tif(blob.read_shift(2) != 3) throw new Error(\"Bad FileMoniker\");\n\tvar unicodePath = blob.read_shift(bytes>>1, 'utf16le').replace(chr0,\"\");\n\treturn preamble + unicodePath;\n}\n\n/* [MS-OSHARED] 2.3.7.2 HyperlinkMoniker TODO: all the monikers */\nfunction parse_HyperlinkMoniker(blob, length) {\n\tvar clsid = blob.read_shift(16); length -= 16;\n\tswitch(clsid) {\n\t\tcase \"e0c9ea79f9bace118c8200aa004ba90b\": return parse_URLMoniker(blob, length);\n\t\tcase \"0303000000000000c000000000000046\": return parse_FileMoniker(blob, length);\n\t\tdefault: throw new Error(\"Unsupported Moniker \" + clsid);\n\t}\n}\n\n/* [MS-OSHARED] 2.3.7.9 HyperlinkString */\nfunction parse_HyperlinkString(blob) {\n\tvar len = blob.read_shift(4);\n\tvar o = len > 0 ? blob.read_shift(len, 'utf16le').replace(chr0, \"\") : \"\";\n\treturn o;\n}\nfunction write_HyperlinkString(str, o) {\n\tif(!o) o = new_buf(6 + str.length * 2);\n\to.write_shift(4, 1 + str.length);\n\tfor(var i = 0; i < str.length; ++i) o.write_shift(2, str.charCodeAt(i));\n\to.write_shift(2, 0);\n\treturn o;\n}\n\n/* [MS-OSHARED] 2.3.7.1 Hyperlink Object */\nfunction parse_Hyperlink(blob, length) {\n\tvar end = blob.l + length;\n\tvar sVer = blob.read_shift(4);\n\tif(sVer !== 2) throw new Error(\"Unrecognized streamVersion: \" + sVer);\n\tvar flags = blob.read_shift(2);\n\tblob.l += 2;\n\tvar displayName, targetFrameName, moniker, oleMoniker, Loc=\"\", guid, fileTime;\n\tif(flags & 0x0010) displayName = parse_HyperlinkString(blob, end - blob.l);\n\tif(flags & 0x0080) targetFrameName = parse_HyperlinkString(blob, end - blob.l);\n\tif((flags & 0x0101) === 0x0101) moniker = parse_HyperlinkString(blob, end - blob.l);\n\tif((flags & 0x0101) === 0x0001) oleMoniker = parse_HyperlinkMoniker(blob, end - blob.l);\n\tif(flags & 0x0008) Loc = parse_HyperlinkString(blob, end - blob.l);\n\tif(flags & 0x0020) guid = blob.read_shift(16);\n\tif(flags & 0x0040) fileTime = parse_FILETIME(blob/*, 8*/);\n\tblob.l = end;\n\tvar target = targetFrameName||moniker||oleMoniker||\"\";\n\tif(target && Loc) target+=\"#\"+Loc;\n\tif(!target) target = \"#\" + Loc;\n\tif((flags & 0x0002) && target.charAt(0) == \"/\" && target.charAt(1) != \"/\") target = \"file://\" + target;\n\tvar out = ({Target:target});\n\tif(guid) out.guid = guid;\n\tif(fileTime) out.time = fileTime;\n\tif(displayName) out.Tooltip = displayName;\n\treturn out;\n}\nfunction write_Hyperlink(hl) {\n\tvar out = new_buf(512), i = 0;\n\tvar Target = hl.Target;\n\tif(Target.slice(0,7) == \"file://\") Target = Target.slice(7);\n\tvar hashidx = Target.indexOf(\"#\");\n\tvar F = hashidx > -1 ? 0x1f : 0x17;\n\tswitch(Target.charAt(0)) { case \"#\": F=0x1c; break; case \".\": F&=~2; break; }\n\tout.write_shift(4,2); out.write_shift(4, F);\n\tvar data = [8,6815827,6619237,4849780,83]; for(i = 0; i < data.length; ++i) out.write_shift(4, data[i]);\n\tif(F == 0x1C) {\n\t\tTarget = Target.slice(1);\n\t\twrite_HyperlinkString(Target, out);\n\t} else if(F & 0x02) {\n\t\tdata = \"e0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b\".split(\" \");\n\t\tfor(i = 0; i < data.length; ++i) out.write_shift(1, parseInt(data[i], 16));\n\t\tvar Pretarget = hashidx > -1 ? Target.slice(0, hashidx) : Target;\n\t\tout.write_shift(4, 2*(Pretarget.length + 1));\n\t\tfor(i = 0; i < Pretarget.length; ++i) out.write_shift(2, Pretarget.charCodeAt(i));\n\t\tout.write_shift(2, 0);\n\t\tif(F & 0x08) write_HyperlinkString(hashidx > -1 ? Target.slice(hashidx+1): \"\", out);\n\t} else {\n\t\tdata = \"03 03 00 00 00 00 00 00 c0 00 00 00 00 00 00 46\".split(\" \");\n\t\tfor(i = 0; i < data.length; ++i) out.write_shift(1, parseInt(data[i], 16));\n\t\tvar P = 0;\n\t\twhile(Target.slice(P*3,P*3+3)==\"../\"||Target.slice(P*3,P*3+3)==\"..\\\\\") ++P;\n\t\tout.write_shift(2, P);\n\t\tout.write_shift(4, Target.length - 3 * P + 1);\n\t\tfor(i = 0; i < Target.length - 3 * P; ++i) out.write_shift(1, Target.charCodeAt(i + 3 * P) & 0xFF);\n\t\tout.write_shift(1, 0);\n\t\tout.write_shift(2, 0xFFFF);\n\t\tout.write_shift(2, 0xDEAD);\n\t\tfor(i = 0; i < 6; ++i) out.write_shift(4, 0);\n\t}\n\treturn out.slice(0, out.l);\n}\n\n/* 2.5.178 LongRGBA */\nfunction parse_LongRGBA(blob) { var r = blob.read_shift(1), g = blob.read_shift(1), b = blob.read_shift(1), a = blob.read_shift(1); return [r,g,b,a]; }\n\n/* 2.5.177 LongRGB */\nfunction parse_LongRGB(blob, length) { var x = parse_LongRGBA(blob, length); x[3] = 0; return x; }\n\n\n/* [MS-XLS] 2.5.19 */\nfunction parse_XLSCell(blob) {\n\tvar rw = blob.read_shift(2); // 0-indexed\n\tvar col = blob.read_shift(2);\n\tvar ixfe = blob.read_shift(2);\n\treturn ({r:rw, c:col, ixfe:ixfe});\n}\nfunction write_XLSCell(R, C, ixfe, o) {\n\tif(!o) o = new_buf(6);\n\to.write_shift(2, R);\n\to.write_shift(2, C);\n\to.write_shift(2, ixfe||0);\n\treturn o;\n}\n\n/* [MS-XLS] 2.5.134 */\nfunction parse_frtHeader(blob) {\n\tvar rt = blob.read_shift(2);\n\tvar flags = blob.read_shift(2); // TODO: parse these flags\n\tblob.l += 8;\n\treturn {type: rt, flags: flags};\n}\n\n\n\nfunction parse_OptXLUnicodeString(blob, length, opts) { return length === 0 ? \"\" : parse_XLUnicodeString2(blob, length, opts); }\n\n/* [MS-XLS] 2.5.344 */\nfunction parse_XTI(blob, length, opts) {\n\tvar w = opts.biff > 8 ? 4 : 2;\n\tvar iSupBook = blob.read_shift(w), itabFirst = blob.read_shift(w,'i'), itabLast = blob.read_shift(w,'i');\n\treturn [iSupBook, itabFirst, itabLast];\n}\n\n/* [MS-XLS] 2.5.218 */\nfunction parse_RkRec(blob) {\n\tvar ixfe = blob.read_shift(2);\n\tvar RK = parse_RkNumber(blob);\n\treturn [ixfe, RK];\n}\n\n/* [MS-XLS] 2.5.1 */\nfunction parse_AddinUdf(blob, length, opts) {\n\tblob.l += 4; length -= 4;\n\tvar l = blob.l + length;\n\tvar udfName = parse_ShortXLUnicodeString(blob, length, opts);\n\tvar cb = blob.read_shift(2);\n\tl -= blob.l;\n\tif(cb !== l) throw new Error(\"Malformed AddinUdf: padding = \" + l + \" != \" + cb);\n\tblob.l += cb;\n\treturn udfName;\n}\n\n/* [MS-XLS] 2.5.209 TODO: Check sizes */\nfunction parse_Ref8U(blob) {\n\tvar rwFirst = blob.read_shift(2);\n\tvar rwLast = blob.read_shift(2);\n\tvar colFirst = blob.read_shift(2);\n\tvar colLast = blob.read_shift(2);\n\treturn {s:{c:colFirst, r:rwFirst}, e:{c:colLast,r:rwLast}};\n}\nfunction write_Ref8U(r, o) {\n\tif(!o) o = new_buf(8);\n\to.write_shift(2, r.s.r);\n\to.write_shift(2, r.e.r);\n\to.write_shift(2, r.s.c);\n\to.write_shift(2, r.e.c);\n\treturn o;\n}\n\n/* [MS-XLS] 2.5.211 */\nfunction parse_RefU(blob) {\n\tvar rwFirst = blob.read_shift(2);\n\tvar rwLast = blob.read_shift(2);\n\tvar colFirst = blob.read_shift(1);\n\tvar colLast = blob.read_shift(1);\n\treturn {s:{c:colFirst, r:rwFirst}, e:{c:colLast,r:rwLast}};\n}\n\n/* [MS-XLS] 2.5.207 */\nvar parse_Ref = parse_RefU;\n\n/* [MS-XLS] 2.5.143 */\nfunction parse_FtCmo(blob) {\n\tblob.l += 4;\n\tvar ot = blob.read_shift(2);\n\tvar id = blob.read_shift(2);\n\tvar flags = blob.read_shift(2);\n\tblob.l+=12;\n\treturn [id, ot, flags];\n}\n\n/* [MS-XLS] 2.5.149 */\nfunction parse_FtNts(blob) {\n\tvar out = {};\n\tblob.l += 4;\n\tblob.l += 16; // GUID TODO\n\tout.fSharedNote = blob.read_shift(2);\n\tblob.l += 4;\n\treturn out;\n}\n\n/* [MS-XLS] 2.5.142 */\nfunction parse_FtCf(blob) {\n\tvar out = {};\n\tblob.l += 4;\n\tblob.cf = blob.read_shift(2);\n\treturn out;\n}\n\n/* [MS-XLS] 2.5.140 - 2.5.154 and friends */\nfunction parse_FtSkip(blob) { blob.l += 2; blob.l += blob.read_shift(2); }\nvar FtTab = {\n0x00: parse_FtSkip, /* FtEnd */\n0x04: parse_FtSkip, /* FtMacro */\n0x05: parse_FtSkip, /* FtButton */\n0x06: parse_FtSkip, /* FtGmo */\n0x07: parse_FtCf, /* FtCf */\n0x08: parse_FtSkip, /* FtPioGrbit */\n0x09: parse_FtSkip, /* FtPictFmla */\n0x0A: parse_FtSkip, /* FtCbls */\n0x0B: parse_FtSkip, /* FtRbo */\n0x0C: parse_FtSkip, /* FtSbs */\n0x0D: parse_FtNts, /* FtNts */\n0x0E: parse_FtSkip, /* FtSbsFmla */\n0x0F: parse_FtSkip, /* FtGboData */\n0x10: parse_FtSkip, /* FtEdoData */\n0x11: parse_FtSkip, /* FtRboData */\n0x12: parse_FtSkip, /* FtCblsData */\n0x13: parse_FtSkip, /* FtLbsData */\n0x14: parse_FtSkip, /* FtCblsFmla */\n0x15: parse_FtCmo\n};\nfunction parse_FtArray(blob, length) {\n\tvar tgt = blob.l + length;\n\tvar fts = [];\n\twhile(blob.l < tgt) {\n\t\tvar ft = blob.read_shift(2);\n\t\tblob.l-=2;\n\t\ttry {\n\t\t\tfts.push(FtTab[ft](blob, tgt - blob.l));\n\t\t} catch(e) { blob.l = tgt; return fts; }\n\t}\n\tif(blob.l != tgt) blob.l = tgt; //throw new Error(\"bad Object Ft-sequence\");\n\treturn fts;\n}\n\n/* --- 2.4 Records --- */\n\n/* [MS-XLS] 2.4.21 */\nfunction parse_BOF(blob, length) {\n\tvar o = {BIFFVer:0, dt:0};\n\to.BIFFVer = blob.read_shift(2); length -= 2;\n\tif(length >= 2) { o.dt = blob.read_shift(2); blob.l -= 2; }\n\tswitch(o.BIFFVer) {\n\t\tcase 0x0600: /* BIFF8 */\n\t\tcase 0x0500: /* BIFF5 */\n\t\tcase 0x0400: /* BIFF4 */\n\t\tcase 0x0300: /* BIFF3 */\n\t\tcase 0x0200: /* BIFF2 */\n\t\tcase 0x0002: case 0x0007: /* BIFF2 */\n\t\t\tbreak;\n\t\tdefault: if(length > 6) throw new Error(\"Unexpected BIFF Ver \" + o.BIFFVer);\n\t}\n\n\tblob.read_shift(length);\n\treturn o;\n}\nfunction write_BOF(wb, t, o) {\n\tvar h = 0x0600, w = 16;\n\tswitch(o.bookType) {\n\t\tcase 'biff8': break;\n\t\tcase 'biff5': h = 0x0500; w = 8; break;\n\t\tcase 'biff4': h = 0x0004; w = 6; break;\n\t\tcase 'biff3': h = 0x0003; w = 6; break;\n\t\tcase 'biff2': h = 0x0002; w = 4; break;\n\t\tcase 'xla': break;\n\t\tdefault: throw new Error(\"unsupported BIFF version\");\n\t}\n\tvar out = new_buf(w);\n\tout.write_shift(2, h);\n\tout.write_shift(2, t);\n\tif(w > 4) out.write_shift(2, 0x7262);\n\tif(w > 6) out.write_shift(2, 0x07CD);\n\tif(w > 8) {\n\t\tout.write_shift(2, 0xC009);\n\t\tout.write_shift(2, 0x0001);\n\t\tout.write_shift(2, 0x0706);\n\t\tout.write_shift(2, 0x0000);\n\t}\n\treturn out;\n}\n\n\n/* [MS-XLS] 2.4.146 */\nfunction parse_InterfaceHdr(blob, length) {\n\tif(length === 0) return 0x04b0;\n\tif((blob.read_shift(2))!==0x04b0){/* empty */}\n\treturn 0x04b0;\n}\n\n\n/* [MS-XLS] 2.4.349 */\nfunction parse_WriteAccess(blob, length, opts) {\n\tif(opts.enc) { blob.l += length; return \"\"; }\n\tvar l = blob.l;\n\t// TODO: make sure XLUnicodeString doesnt overrun\n\tvar UserName = parse_XLUnicodeString2(blob, 0, opts);\n\tblob.read_shift(length + l - blob.l);\n\treturn UserName;\n}\nfunction write_WriteAccess(s, opts) {\n\tvar b8 = !opts || opts.biff == 8;\n\tvar o = new_buf(b8 ? 112 : 54);\n\to.write_shift(opts.biff == 8 ? 2 : 1, 7);\n\tif(b8) o.write_shift(1, 0);\n\to.write_shift(4, 0x33336853);\n\to.write_shift(4, (0x00534A74 | (b8 ? 0 : 0x20000000)));\n\twhile(o.l < o.length) o.write_shift(1, (b8 ? 0 : 32));\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.351 */\nfunction parse_WsBool(blob, length, opts) {\n\tvar flags = opts && opts.biff == 8 || length == 2 ? blob.read_shift(2) : (blob.l += length, 0);\n\treturn { fDialog: flags & 0x10, fBelow: flags & 0x40, fRight: flags & 0x80 };\n}\n\n/* [MS-XLS] 2.4.28 */\nfunction parse_BoundSheet8(blob, length, opts) {\n\tvar pos = blob.read_shift(4);\n\tvar hidden = blob.read_shift(1) & 0x03;\n\tvar dt = blob.read_shift(1);\n\tswitch(dt) {\n\t\tcase 0: dt = 'Worksheet'; break;\n\t\tcase 1: dt = 'Macrosheet'; break;\n\t\tcase 2: dt = 'Chartsheet'; break;\n\t\tcase 6: dt = 'VBAModule'; break;\n\t}\n\tvar name = parse_ShortXLUnicodeString(blob, 0, opts);\n\tif(name.length === 0) name = \"Sheet1\";\n\treturn { pos:pos, hs:hidden, dt:dt, name:name };\n}\nfunction write_BoundSheet8(data, opts) {\n\tvar w = (!opts || opts.biff >= 8 ? 2 : 1);\n\tvar o = new_buf(8 + w * data.name.length);\n\to.write_shift(4, data.pos);\n\to.write_shift(1, data.hs || 0);\n\to.write_shift(1, data.dt);\n\to.write_shift(1, data.name.length);\n\tif(opts.biff >= 8) o.write_shift(1, 1);\n\to.write_shift(w * data.name.length, data.name, opts.biff < 8 ? 'sbcs' : 'utf16le');\n\tvar out = o.slice(0, o.l);\n\tout.l = o.l; return out;\n}\n\n/* [MS-XLS] 2.4.265 TODO */\nfunction parse_SST(blob, length) {\n\tvar end = blob.l + length;\n\tvar cnt = blob.read_shift(4);\n\tvar ucnt = blob.read_shift(4);\n\tvar strs = ([]);\n\tfor(var i = 0; i != ucnt && blob.l < end; ++i) {\n\t\tstrs.push(parse_XLUnicodeRichExtendedString(blob));\n\t}\n\tstrs.Count = cnt; strs.Unique = ucnt;\n\treturn strs;\n}\nfunction write_SST(sst, opts) {\n\tvar header = new_buf(8);\n\theader.write_shift(4, sst.Count);\n\theader.write_shift(4, sst.Unique);\n\tvar strs = [];\n\tfor(var j = 0; j < sst.length; ++j) strs[j] = write_XLUnicodeRichExtendedString(sst[j], opts);\n\tvar o = bconcat([header].concat(strs));\no.parts = [header.length].concat(strs.map(function(str) { return str.length; }));\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.107 */\nfunction parse_ExtSST(blob, length) {\n\tvar extsst = {};\n\textsst.dsst = blob.read_shift(2);\n\tblob.l += length-2;\n\treturn extsst;\n}\n\n\n/* [MS-XLS] 2.4.221 TODO: check BIFF2-4 */\nfunction parse_Row(blob) {\n\tvar z = ({});\n\tz.r = blob.read_shift(2);\n\tz.c = blob.read_shift(2);\n\tz.cnt = blob.read_shift(2) - z.c;\n\tvar miyRw = blob.read_shift(2);\n\tblob.l += 4; // reserved(2), unused(2)\n\tvar flags = blob.read_shift(1); // various flags\n\tblob.l += 3; // reserved(8), ixfe(12), flags(4)\n\tif(flags & 0x07) z.level = flags & 0x07;\n\t// collapsed: flags & 0x10\n\tif(flags & 0x20) z.hidden = true;\n\tif(flags & 0x40) z.hpt = miyRw / 20;\n\treturn z;\n}\n\n\n/* [MS-XLS] 2.4.125 */\nfunction parse_ForceFullCalculation(blob) {\n\tvar header = parse_frtHeader(blob);\n\tif(header.type != 0x08A3) throw new Error(\"Invalid Future Record \" + header.type);\n\tvar fullcalc = blob.read_shift(4);\n\treturn fullcalc !== 0x0;\n}\n\n\n\n\n\n/* [MS-XLS] 2.4.215 rt */\nfunction parse_RecalcId(blob) {\n\tblob.read_shift(2);\n\treturn blob.read_shift(4);\n}\n\n/* [MS-XLS] 2.4.87 */\nfunction parse_DefaultRowHeight(blob, length, opts) {\n\tvar f = 0;\n\tif(!(opts && opts.biff == 2)) {\n\t\tf = blob.read_shift(2);\n\t}\n\tvar miyRw = blob.read_shift(2);\n\tif((opts && opts.biff == 2)) {\n\t\tf = 1 - (miyRw >> 15); miyRw &= 0x7fff;\n\t}\n\tvar fl = {Unsynced:f&1,DyZero:(f&2)>>1,ExAsc:(f&4)>>2,ExDsc:(f&8)>>3};\n\treturn [fl, miyRw];\n}\n\n/* [MS-XLS] 2.4.345 TODO */\nfunction parse_Window1(blob) {\n\tvar xWn = blob.read_shift(2), yWn = blob.read_shift(2), dxWn = blob.read_shift(2), dyWn = blob.read_shift(2);\n\tvar flags = blob.read_shift(2), iTabCur = blob.read_shift(2), iTabFirst = blob.read_shift(2);\n\tvar ctabSel = blob.read_shift(2), wTabRatio = blob.read_shift(2);\n\treturn { Pos: [xWn, yWn], Dim: [dxWn, dyWn], Flags: flags, CurTab: iTabCur,\n\t\tFirstTab: iTabFirst, Selected: ctabSel, TabRatio: wTabRatio };\n}\nfunction write_Window1() {\n\tvar o = new_buf(18);\n\to.write_shift(2, 0);\n\to.write_shift(2, 0);\n\to.write_shift(2, 0x7260);\n\to.write_shift(2, 0x44c0);\n\to.write_shift(2, 0x38);\n\to.write_shift(2, 0);\n\to.write_shift(2, 0);\n\to.write_shift(2, 1);\n\to.write_shift(2, 0x01f4);\n\treturn o;\n}\n/* [MS-XLS] 2.4.346 TODO */\nfunction parse_Window2(blob, length, opts) {\n\tif(opts && opts.biff >= 2 && opts.biff < 5) return {};\n\tvar f = blob.read_shift(2);\n\treturn { RTL: f & 0x40 };\n}\nfunction write_Window2(view) {\n\tvar o = new_buf(18), f = 0x6b6;\n\tif(view && view.RTL) f |= 0x40;\n\to.write_shift(2, f);\n\to.write_shift(4, 0);\n\to.write_shift(4, 64);\n\to.write_shift(4, 0);\n\to.write_shift(4, 0);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.189 TODO */\nfunction parse_Pane(/*blob, length, opts*/) {\n}\n\n/* [MS-XLS] 2.4.122 TODO */\nfunction parse_Font(blob, length, opts) {\n\tvar o = {\n\t\tdyHeight: blob.read_shift(2),\n\t\tfl: blob.read_shift(2)\n\t};\n\tswitch((opts && opts.biff) || 8) {\n\t\tcase 2: break;\n\t\tcase 3: case 4: blob.l += 2; break;\n\t\tdefault: blob.l += 10; break;\n\t}\n\to.name = parse_ShortXLUnicodeString(blob, 0, opts);\n\treturn o;\n}\nfunction write_Font(data, opts) {\n\tvar name = data.name || \"Arial\";\n\tvar b5 = (opts && (opts.biff == 5)), w = (b5 ? (15 + name.length) : (16 + 2 * name.length));\n\tvar o = new_buf(w);\n\to.write_shift(2, (data.sz || 12) * 20);\n\to.write_shift(4, 0);\n\to.write_shift(2, 400);\n\to.write_shift(4, 0);\n\to.write_shift(2, 0);\n\to.write_shift(1, name.length);\n\tif(!b5) o.write_shift(1, 1);\n\to.write_shift((b5 ? 1 : 2) * name.length, name, (b5 ? \"sbcs\" : \"utf16le\"));\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.149 */\nfunction parse_LabelSst(blob) {\n\tvar cell = parse_XLSCell(blob);\n\tcell.isst = blob.read_shift(4);\n\treturn cell;\n}\nfunction write_LabelSst(R, C, v, os ) {\n\tvar o = new_buf(10);\n\twrite_XLSCell(R, C, os, o);\n\to.write_shift(4, v);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.148 */\nfunction parse_Label(blob, length, opts) {\n\tif(opts.biffguess && opts.biff == 2) opts.biff = 5;\n\tvar target = blob.l + length;\n\tvar cell = parse_XLSCell(blob, 6);\n\tif(opts.biff == 2) blob.l++;\n\tvar str = parse_XLUnicodeString(blob, target - blob.l, opts);\n\tcell.val = str;\n\treturn cell;\n}\nfunction write_Label(R, C, v, os, opts) {\n\tvar b8 = !opts || opts.biff == 8;\n\tvar o = new_buf(6 + 2 + (+b8) + (1 + b8) * v.length);\n\twrite_XLSCell(R, C, os, o);\n\to.write_shift(2, v.length);\n\tif(b8) o.write_shift(1, 1);\n\to.write_shift((1 + b8) * v.length, v, b8 ? 'utf16le' : 'sbcs');\n\treturn o;\n}\n\n\n/* [MS-XLS] 2.4.126 Number Formats */\nfunction parse_Format(blob, length, opts) {\n\tvar numFmtId = blob.read_shift(2);\n\tvar fmtstr = parse_XLUnicodeString2(blob, 0, opts);\n\treturn [numFmtId, fmtstr];\n}\nfunction write_Format(i, f, opts, o) {\n\tvar b5 = (opts && (opts.biff == 5));\n\tif(!o) o = new_buf(b5 ? (3 + f.length) : (5 + 2 * f.length));\n\to.write_shift(2, i);\n\to.write_shift((b5 ? 1 : 2), f.length);\n\tif(!b5) o.write_shift(1, 1);\n\to.write_shift((b5 ? 1 : 2) * f.length, f, (b5 ? 'sbcs' : 'utf16le'));\n\tvar out = (o.length > o.l) ? o.slice(0, o.l) : o;\n\tif(out.l == null) out.l = out.length;\n\treturn out;\n}\nvar parse_BIFF2Format = parse_XLUnicodeString2;\n\n/* [MS-XLS] 2.4.90 */\nfunction parse_Dimensions(blob, length, opts) {\n\tvar end = blob.l + length;\n\tvar w = opts.biff == 8 || !opts.biff ? 4 : 2;\n\tvar r = blob.read_shift(w), R = blob.read_shift(w);\n\tvar c = blob.read_shift(2), C = blob.read_shift(2);\n\tblob.l = end;\n\treturn {s: {r:r, c:c}, e: {r:R, c:C}};\n}\nfunction write_Dimensions(range, opts) {\n\tvar w = opts.biff == 8 || !opts.biff ? 4 : 2;\n\tvar o = new_buf(2*w + 6);\n\to.write_shift(w, range.s.r);\n\to.write_shift(w, range.e.r + 1);\n\to.write_shift(2, range.s.c);\n\to.write_shift(2, range.e.c + 1);\n\to.write_shift(2, 0);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.220 */\nfunction parse_RK(blob) {\n\tvar rw = blob.read_shift(2), col = blob.read_shift(2);\n\tvar rkrec = parse_RkRec(blob);\n\treturn {r:rw, c:col, ixfe:rkrec[0], rknum:rkrec[1]};\n}\n\n/* [MS-XLS] 2.4.175 */\nfunction parse_MulRk(blob, length) {\n\tvar target = blob.l + length - 2;\n\tvar rw = blob.read_shift(2), col = blob.read_shift(2);\n\tvar rkrecs = [];\n\twhile(blob.l < target) rkrecs.push(parse_RkRec(blob));\n\tif(blob.l !== target) throw new Error(\"MulRK read error\");\n\tvar lastcol = blob.read_shift(2);\n\tif(rkrecs.length != lastcol - col + 1) throw new Error(\"MulRK length mismatch\");\n\treturn {r:rw, c:col, C:lastcol, rkrec:rkrecs};\n}\n/* [MS-XLS] 2.4.174 */\nfunction parse_MulBlank(blob, length) {\n\tvar target = blob.l + length - 2;\n\tvar rw = blob.read_shift(2), col = blob.read_shift(2);\n\tvar ixfes = [];\n\twhile(blob.l < target) ixfes.push(blob.read_shift(2));\n\tif(blob.l !== target) throw new Error(\"MulBlank read error\");\n\tvar lastcol = blob.read_shift(2);\n\tif(ixfes.length != lastcol - col + 1) throw new Error(\"MulBlank length mismatch\");\n\treturn {r:rw, c:col, C:lastcol, ixfe:ixfes};\n}\n\n/* [MS-XLS] 2.5.20 2.5.249 TODO: interpret values here */\nfunction parse_CellStyleXF(blob, length, style, opts) {\n\tvar o = {};\n\tvar a = blob.read_shift(4), b = blob.read_shift(4);\n\tvar c = blob.read_shift(4), d = blob.read_shift(2);\n\to.patternType = XLSFillPattern[c >> 26];\n\n\tif(!opts.cellStyles) return o;\n\to.alc = a & 0x07;\n\to.fWrap = (a >> 3) & 0x01;\n\to.alcV = (a >> 4) & 0x07;\n\to.fJustLast = (a >> 7) & 0x01;\n\to.trot = (a >> 8) & 0xFF;\n\to.cIndent = (a >> 16) & 0x0F;\n\to.fShrinkToFit = (a >> 20) & 0x01;\n\to.iReadOrder = (a >> 22) & 0x02;\n\to.fAtrNum = (a >> 26) & 0x01;\n\to.fAtrFnt = (a >> 27) & 0x01;\n\to.fAtrAlc = (a >> 28) & 0x01;\n\to.fAtrBdr = (a >> 29) & 0x01;\n\to.fAtrPat = (a >> 30) & 0x01;\n\to.fAtrProt = (a >> 31) & 0x01;\n\n\to.dgLeft = b & 0x0F;\n\to.dgRight = (b >> 4) & 0x0F;\n\to.dgTop = (b >> 8) & 0x0F;\n\to.dgBottom = (b >> 12) & 0x0F;\n\to.icvLeft = (b >> 16) & 0x7F;\n\to.icvRight = (b >> 23) & 0x7F;\n\to.grbitDiag = (b >> 30) & 0x03;\n\n\to.icvTop = c & 0x7F;\n\to.icvBottom = (c >> 7) & 0x7F;\n\to.icvDiag = (c >> 14) & 0x7F;\n\to.dgDiag = (c >> 21) & 0x0F;\n\n\to.icvFore = d & 0x7F;\n\to.icvBack = (d >> 7) & 0x7F;\n\to.fsxButton = (d >> 14) & 0x01;\n\treturn o;\n}\n//function parse_CellXF(blob, length, opts) {return parse_CellStyleXF(blob,length,0, opts);}\n//function parse_StyleXF(blob, length, opts) {return parse_CellStyleXF(blob,length,1, opts);}\n\n/* [MS-XLS] 2.4.353 TODO: actually do this right */\nfunction parse_XF(blob, length, opts) {\n\tvar o = {};\n\to.ifnt = blob.read_shift(2); o.numFmtId = blob.read_shift(2); o.flags = blob.read_shift(2);\n\to.fStyle = (o.flags >> 2) & 0x01;\n\tlength -= 6;\n\to.data = parse_CellStyleXF(blob, length, o.fStyle, opts);\n\treturn o;\n}\nfunction write_XF(data, ixfeP, opts, o) {\n\tvar b5 = (opts && (opts.biff == 5));\n\tif(!o) o = new_buf(b5 ? 16 : 20);\n\to.write_shift(2, 0);\n\tif(data.style) {\n\t\to.write_shift(2, (data.numFmtId||0));\n\t\to.write_shift(2, 0xFFF4);\n\t} else {\n\t\to.write_shift(2, (data.numFmtId||0));\n\t\to.write_shift(2, (ixfeP<<4));\n\t}\n\tvar f = 0;\n\tif(data.numFmtId > 0 && b5) f |= 0x0400;\n\to.write_shift(4, f);\n\to.write_shift(4, 0);\n\tif(!b5) o.write_shift(4, 0);\n\to.write_shift(2, 0);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.134 */\nfunction parse_Guts(blob) {\n\tblob.l += 4;\n\tvar out = [blob.read_shift(2), blob.read_shift(2)];\n\tif(out[0] !== 0) out[0]--;\n\tif(out[1] !== 0) out[1]--;\n\tif(out[0] > 7 || out[1] > 7) throw new Error(\"Bad Gutters: \" + out.join(\"|\"));\n\treturn out;\n}\nfunction write_Guts(guts) {\n\tvar o = new_buf(8);\n\to.write_shift(4, 0);\n\to.write_shift(2, guts[0] ? guts[0] + 1 : 0);\n\to.write_shift(2, guts[1] ? guts[1] + 1 : 0);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.24 */\nfunction parse_BoolErr(blob, length, opts) {\n\tvar cell = parse_XLSCell(blob, 6);\n\tif(opts.biff == 2 || length == 9) ++blob.l;\n\tvar val = parse_Bes(blob, 2);\n\tcell.val = val;\n\tcell.t = (val === true || val === false) ? 'b' : 'e';\n\treturn cell;\n}\nfunction write_BoolErr(R, C, v, os, opts, t) {\n\tvar o = new_buf(8);\n\twrite_XLSCell(R, C, os, o);\n\twrite_Bes(v, t, o);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.180 Number */\nfunction parse_Number(blob, length, opts) {\n\tif(opts.biffguess && opts.biff == 2) opts.biff = 5;\n\tvar cell = parse_XLSCell(blob, 6);\n\tvar xnum = parse_Xnum(blob, 8);\n\tcell.val = xnum;\n\treturn cell;\n}\nfunction write_Number(R, C, v, os) {\n\tvar o = new_buf(14);\n\twrite_XLSCell(R, C, os, o);\n\twrite_Xnum(v, o);\n\treturn o;\n}\n\nvar parse_XLHeaderFooter = parse_OptXLUnicodeString; // TODO: parse 2.4.136\n\n/* [MS-XLS] 2.4.271 */\nfunction parse_SupBook(blob, length, opts) {\n\tvar end = blob.l + length;\n\tvar ctab = blob.read_shift(2);\n\tvar cch = blob.read_shift(2);\n\topts.sbcch = cch;\n\tif(cch == 0x0401 || cch == 0x3A01) return [cch, ctab];\n\tif(cch < 0x01 || cch >0xff) throw new Error(\"Unexpected SupBook type: \"+cch);\n\tvar virtPath = parse_XLUnicodeStringNoCch(blob, cch);\n\t/* TODO: 2.5.277 Virtual Path */\n\tvar rgst = [];\n\twhile(end > blob.l) rgst.push(parse_XLUnicodeString(blob));\n\treturn [cch, ctab, virtPath, rgst];\n}\n\n/* [MS-XLS] 2.4.105 TODO */\nfunction parse_ExternName(blob, length, opts) {\n\tvar flags = blob.read_shift(2);\n\tvar body;\n\tvar o = ({\n\t\tfBuiltIn: flags & 0x01,\n\t\tfWantAdvise: (flags >>> 1) & 0x01,\n\t\tfWantPict: (flags >>> 2) & 0x01,\n\t\tfOle: (flags >>> 3) & 0x01,\n\t\tfOleLink: (flags >>> 4) & 0x01,\n\t\tcf: (flags >>> 5) & 0x3FF,\n\t\tfIcon: flags >>> 15 & 0x01\n\t});\n\tif(opts.sbcch === 0x3A01) body = parse_AddinUdf(blob, length-2, opts);\n\t//else throw new Error(\"unsupported SupBook cch: \" + opts.sbcch);\n\to.body = body || blob.read_shift(length-2);\n\tif(typeof body === \"string\") o.Name = body;\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.150 TODO */\nvar XLSLblBuiltIn = [\n\t\"_xlnm.Consolidate_Area\",\n\t\"_xlnm.Auto_Open\",\n\t\"_xlnm.Auto_Close\",\n\t\"_xlnm.Extract\",\n\t\"_xlnm.Database\",\n\t\"_xlnm.Criteria\",\n\t\"_xlnm.Print_Area\",\n\t\"_xlnm.Print_Titles\",\n\t\"_xlnm.Recorder\",\n\t\"_xlnm.Data_Form\",\n\t\"_xlnm.Auto_Activate\",\n\t\"_xlnm.Auto_Deactivate\",\n\t\"_xlnm.Sheet_Title\",\n\t\"_xlnm._FilterDatabase\"\n];\nfunction parse_Lbl(blob, length, opts) {\n\tvar target = blob.l + length;\n\tvar flags = blob.read_shift(2);\n\tvar chKey = blob.read_shift(1);\n\tvar cch = blob.read_shift(1);\n\tvar cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);\n\tvar itab = 0;\n\tif(!opts || opts.biff >= 5) {\n\t\tif(opts.biff != 5) blob.l += 2;\n\t\titab = blob.read_shift(2);\n\t\tif(opts.biff == 5) blob.l += 2;\n\t\tblob.l += 4;\n\t}\n\tvar name = parse_XLUnicodeStringNoCch(blob, cch, opts);\n\tif(flags & 0x20) name = XLSLblBuiltIn[name.charCodeAt(0)];\n\tvar npflen = target - blob.l; if(opts && opts.biff == 2) --npflen;\n\t/*jshint -W018 */\n\tvar rgce = (target == blob.l || cce === 0 || !(npflen > 0)) ? [] : parse_NameParsedFormula(blob, npflen, opts, cce);\n\t/*jshint +W018 */\n\treturn {\n\t\tchKey: chKey,\n\t\tName: name,\n\t\titab: itab,\n\t\trgce: rgce\n\t};\n}\n\n/* [MS-XLS] 2.4.106 TODO: verify filename encoding */\nfunction parse_ExternSheet(blob, length, opts) {\n\tif(opts.biff < 8) return parse_BIFF5ExternSheet(blob, length, opts);\n\tvar o = [], target = blob.l + length, len = blob.read_shift(opts.biff > 8 ? 4 : 2);\n\twhile(len-- !== 0) o.push(parse_XTI(blob, opts.biff > 8 ? 12 : 6, opts));\n\t\t// [iSupBook, itabFirst, itabLast];\n\tif(blob.l != target) throw new Error(\"Bad ExternSheet: \" + blob.l + \" != \" + target);\n\treturn o;\n}\nfunction parse_BIFF5ExternSheet(blob, length, opts) {\n\tif(blob[blob.l + 1] == 0x03) blob[blob.l]++;\n\tvar o = parse_ShortXLUnicodeString(blob, length, opts);\n\treturn o.charCodeAt(0) == 0x03 ? o.slice(1) : o;\n}\n\n/* [MS-XLS] 2.4.176 TODO: check older biff */\nfunction parse_NameCmt(blob, length, opts) {\n\tif(opts.biff < 8) { blob.l += length; return; }\n\tvar cchName = blob.read_shift(2);\n\tvar cchComment = blob.read_shift(2);\n\tvar name = parse_XLUnicodeStringNoCch(blob, cchName, opts);\n\tvar comment = parse_XLUnicodeStringNoCch(blob, cchComment, opts);\n\treturn [name, comment];\n}\n\n/* [MS-XLS] 2.4.260 */\nfunction parse_ShrFmla(blob, length, opts) {\n\tvar ref = parse_RefU(blob, 6);\n\tblob.l++;\n\tvar cUse = blob.read_shift(1);\n\tlength -= 8;\n\treturn [parse_SharedParsedFormula(blob, length, opts), cUse, ref];\n}\n\n/* [MS-XLS] 2.4.4 TODO */\nfunction parse_Array(blob, length, opts) {\n\tvar ref = parse_Ref(blob, 6);\n\t/* TODO: fAlwaysCalc */\n\tswitch(opts.biff) {\n\t\tcase 2: blob.l ++; length -= 7; break;\n\t\tcase 3: case 4: blob.l += 2; length -= 8; break;\n\t\tdefault: blob.l += 6; length -= 12;\n\t}\n\treturn [ref, parse_ArrayParsedFormula(blob, length, opts, ref)];\n}\n\n/* [MS-XLS] 2.4.173 */\nfunction parse_MTRSettings(blob) {\n\tvar fMTREnabled = blob.read_shift(4) !== 0x00;\n\tvar fUserSetThreadCount = blob.read_shift(4) !== 0x00;\n\tvar cUserThreadCount = blob.read_shift(4);\n\treturn [fMTREnabled, fUserSetThreadCount, cUserThreadCount];\n}\n\n/* [MS-XLS] 2.5.186 TODO: BIFF5 */\nfunction parse_NoteSh(blob, length, opts) {\n\tif(opts.biff < 8) return;\n\tvar row = blob.read_shift(2), col = blob.read_shift(2);\n\tvar flags = blob.read_shift(2), idObj = blob.read_shift(2);\n\tvar stAuthor = parse_XLUnicodeString2(blob, 0, opts);\n\tif(opts.biff < 8) blob.read_shift(1);\n\treturn [{r:row,c:col}, stAuthor, idObj, flags];\n}\n\n/* [MS-XLS] 2.4.179 */\nfunction parse_Note(blob, length, opts) {\n\t/* TODO: Support revisions */\n\treturn parse_NoteSh(blob, length, opts);\n}\n\n/* [MS-XLS] 2.4.168 */\nfunction parse_MergeCells(blob, length) {\n\tvar merges = [];\n\tvar cmcs = blob.read_shift(2);\n\twhile (cmcs--) merges.push(parse_Ref8U(blob,length));\n\treturn merges;\n}\nfunction write_MergeCells(merges) {\n\tvar o = new_buf(2 + merges.length * 8);\n\to.write_shift(2, merges.length);\n\tfor(var i = 0; i < merges.length; ++i) write_Ref8U(merges[i], o);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.181 TODO: parse all the things! */\nfunction parse_Obj(blob, length, opts) {\n\tif(opts && opts.biff < 8) return parse_BIFF5Obj(blob, length, opts);\n\tvar cmo = parse_FtCmo(blob, 22); // id, ot, flags\n\tvar fts = parse_FtArray(blob, length-22, cmo[1]);\n\treturn { cmo: cmo, ft:fts };\n}\n/* from older spec */\nvar parse_BIFF5OT = [];\nparse_BIFF5OT[0x08] = function(blob, length) {\n\tvar tgt = blob.l + length;\n\tblob.l += 10; // todo\n\tvar cf = blob.read_shift(2);\n\tblob.l += 4;\n\tblob.l += 2; //var cbPictFmla = blob.read_shift(2);\n\tblob.l += 2;\n\tblob.l += 2; //var grbit = blob.read_shift(2);\n\tblob.l += 4;\n\tvar cchName = blob.read_shift(1);\n\tblob.l += cchName; // TODO: stName\n\tblob.l = tgt; // TODO: fmla\n\treturn { fmt:cf };\n};\n\nfunction parse_BIFF5Obj(blob, length, opts) {\n\tblob.l += 4; //var cnt = blob.read_shift(4);\n\tvar ot = blob.read_shift(2);\n\tvar id = blob.read_shift(2);\n\tvar grbit = blob.read_shift(2);\n\tblob.l += 2; //var colL = blob.read_shift(2);\n\tblob.l += 2; //var dxL = blob.read_shift(2);\n\tblob.l += 2; //var rwT = blob.read_shift(2);\n\tblob.l += 2; //var dyT = blob.read_shift(2);\n\tblob.l += 2; //var colR = blob.read_shift(2);\n\tblob.l += 2; //var dxR = blob.read_shift(2);\n\tblob.l += 2; //var rwB = blob.read_shift(2);\n\tblob.l += 2; //var dyB = blob.read_shift(2);\n\tblob.l += 2; //var cbMacro = blob.read_shift(2);\n\tblob.l += 6;\n\tlength -= 36;\n\tvar fts = [];\n\tfts.push((parse_BIFF5OT[ot]||parsenoop)(blob, length, opts));\n\treturn { cmo: [id, ot, grbit], ft:fts };\n}\n\n/* [MS-XLS] 2.4.329 TODO: parse properly */\nfunction parse_TxO(blob, length, opts) {\n\tvar s = blob.l;\n\tvar texts = \"\";\ntry {\n\tblob.l += 4;\n\tvar ot = (opts.lastobj||{cmo:[0,0]}).cmo[1];\n\tvar controlInfo; // eslint-disable-line no-unused-vars\n\tif([0,5,7,11,12,14].indexOf(ot) == -1) blob.l += 6;\n\telse controlInfo = parse_ControlInfo(blob, 6, opts);\n\tvar cchText = blob.read_shift(2);\n\t/*var cbRuns = */blob.read_shift(2);\n\t/*var ifntEmpty = */parseuint16(blob, 2);\n\tvar len = blob.read_shift(2);\n\tblob.l += len;\n\t//var fmla = parse_ObjFmla(blob, s + length - blob.l);\n\n\tfor(var i = 1; i < blob.lens.length-1; ++i) {\n\t\tif(blob.l-s != blob.lens[i]) throw new Error(\"TxO: bad continue record\");\n\t\tvar hdr = blob[blob.l];\n\t\tvar t = parse_XLUnicodeStringNoCch(blob, blob.lens[i+1]-blob.lens[i]-1);\n\t\ttexts += t;\n\t\tif(texts.length >= (hdr ? cchText : 2*cchText)) break;\n\t}\n\tif(texts.length !== cchText && texts.length !== cchText*2) {\n\t\tthrow new Error(\"cchText: \" + cchText + \" != \" + texts.length);\n\t}\n\n\tblob.l = s + length;\n\t/* [MS-XLS] 2.5.272 TxORuns */\n//\tvar rgTxoRuns = [];\n//\tfor(var j = 0; j != cbRuns/8-1; ++j) blob.l += 8;\n//\tvar cchText2 = blob.read_shift(2);\n//\tif(cchText2 !== cchText) throw new Error(\"TxOLastRun mismatch: \" + cchText2 + \" \" + cchText);\n//\tblob.l += 6;\n//\tif(s + length != blob.l) throw new Error(\"TxO \" + (s + length) + \", at \" + blob.l);\n\treturn { t: texts };\n} catch(e) { blob.l = s + length; return { t: texts }; }\n}\n\n/* [MS-XLS] 2.4.140 */\nfunction parse_HLink(blob, length) {\n\tvar ref = parse_Ref8U(blob, 8);\n\tblob.l += 16; /* CLSID */\n\tvar hlink = parse_Hyperlink(blob, length-24);\n\treturn [ref, hlink];\n}\nfunction write_HLink(hl) {\n\tvar O = new_buf(24);\n\tvar ref = decode_cell(hl[0]);\n\tO.write_shift(2, ref.r); O.write_shift(2, ref.r);\n\tO.write_shift(2, ref.c); O.write_shift(2, ref.c);\n\tvar clsid = \"d0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b\".split(\" \");\n\tfor(var i = 0; i < 16; ++i) O.write_shift(1, parseInt(clsid[i], 16));\n\treturn bconcat([O, write_Hyperlink(hl[1])]);\n}\n\n\n/* [MS-XLS] 2.4.141 */\nfunction parse_HLinkTooltip(blob, length) {\n\tblob.read_shift(2);\n\tvar ref = parse_Ref8U(blob, 8);\n\tvar wzTooltip = blob.read_shift((length-10)/2, 'dbcs-cont');\n\twzTooltip = wzTooltip.replace(chr0,\"\");\n\treturn [ref, wzTooltip];\n}\nfunction write_HLinkTooltip(hl) {\n\tvar TT = hl[1].Tooltip;\n\tvar O = new_buf(10 + 2 * (TT.length + 1));\n\tO.write_shift(2, 0x0800);\n\tvar ref = decode_cell(hl[0]);\n\tO.write_shift(2, ref.r); O.write_shift(2, ref.r);\n\tO.write_shift(2, ref.c); O.write_shift(2, ref.c);\n\tfor(var i = 0; i < TT.length; ++i) O.write_shift(2, TT.charCodeAt(i));\n\tO.write_shift(2, 0);\n\treturn O;\n}\n\n/* [MS-XLS] 2.4.63 */\nfunction parse_Country(blob) {\n\tvar o = [0,0], d;\n\td = blob.read_shift(2); o[0] = CountryEnum[d] || d;\n\td = blob.read_shift(2); o[1] = CountryEnum[d] || d;\n\treturn o;\n}\nfunction write_Country(o) {\n\tif(!o) o = new_buf(4);\n\to.write_shift(2, 0x01);\n\to.write_shift(2, 0x01);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.50 ClrtClient */\nfunction parse_ClrtClient(blob) {\n\tvar ccv = blob.read_shift(2);\n\tvar o = [];\n\twhile(ccv-->0) o.push(parse_LongRGB(blob, 8));\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.188 */\nfunction parse_Palette(blob) {\n\tvar ccv = blob.read_shift(2);\n\tvar o = [];\n\twhile(ccv-->0) o.push(parse_LongRGB(blob, 8));\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.354 */\nfunction parse_XFCRC(blob) {\n\tblob.l += 2;\n\tvar o = {cxfs:0, crc:0};\n\to.cxfs = blob.read_shift(2);\n\to.crc = blob.read_shift(4);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.53 TODO: parse flags */\n/* [MS-XLSB] 2.4.323 TODO: parse flags */\nfunction parse_ColInfo(blob, length, opts) {\n\tif(!opts.cellStyles) return parsenoop(blob, length);\n\tvar w = opts && opts.biff >= 12 ? 4 : 2;\n\tvar colFirst = blob.read_shift(w);\n\tvar colLast = blob.read_shift(w);\n\tvar coldx = blob.read_shift(w);\n\tvar ixfe = blob.read_shift(w);\n\tvar flags = blob.read_shift(2);\n\tif(w == 2) blob.l += 2;\n\tvar o = ({s:colFirst, e:colLast, w:coldx, ixfe:ixfe, flags:flags});\n\tif(opts.biff >= 5 || !opts.biff) o.level = (flags >> 8) & 0x7;\n\treturn o;\n}\nfunction write_ColInfo(col, idx) {\n\tvar o = new_buf(12);\n\to.write_shift(2, idx);\n\to.write_shift(2, idx);\n\to.write_shift(2, col.width * 256);\n\to.write_shift(2, 0);\n\tvar f = 0;\n\tif(col.hidden) f |= 1;\n\to.write_shift(1, f);\n\tf = col.level || 0;\n\to.write_shift(1, f);\n\to.write_shift(2, 0);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.257 */\nfunction parse_Setup(blob, length) {\n\tvar o = {};\n\tif(length < 32) return o;\n\tblob.l += 16;\n\to.header = parse_Xnum(blob, 8);\n\to.footer = parse_Xnum(blob, 8);\n\tblob.l += 2;\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.261 */\nfunction parse_ShtProps(blob, length, opts) {\n\tvar def = {area:false};\n\tif(opts.biff != 5) { blob.l += length; return def; }\n\tvar d = blob.read_shift(1); blob.l += 3;\n\tif((d & 0x10)) def.area = true;\n\treturn def;\n}\n\n/* [MS-XLS] 2.4.241 */\nfunction write_RRTabId(n) {\n\tvar out = new_buf(2 * n);\n\tfor(var i = 0; i < n; ++i) out.write_shift(2, i+1);\n\treturn out;\n}\n\nvar parse_Blank = parse_XLSCell; /* [MS-XLS] 2.4.20 Just the cell */\nvar parse_Scl = parseuint16a; /* [MS-XLS] 2.4.247 num, den */\nvar parse_String = parse_XLUnicodeString; /* [MS-XLS] 2.4.268 */\n\n/* --- Specific to versions before BIFF8 --- */\nfunction parse_ImData(blob) {\n\tvar cf = blob.read_shift(2);\n\tvar env = blob.read_shift(2);\n\tvar lcb = blob.read_shift(4);\n\tvar o = {fmt:cf, env:env, len:lcb, data:blob.slice(blob.l,blob.l+lcb)};\n\tblob.l += lcb;\n\treturn o;\n}\n\n/* BIFF2_??? where ??? is the name from [XLS] */\nfunction parse_BIFF2STR(blob, length, opts) {\n\tif(opts.biffguess && opts.biff == 5) opts.biff = 2;\n\tvar cell = parse_XLSCell(blob, 6);\n\t++blob.l;\n\tvar str = parse_XLUnicodeString2(blob, length-7, opts);\n\tcell.t = 'str';\n\tcell.val = str;\n\treturn cell;\n}\n\nfunction parse_BIFF2NUM(blob) {\n\tvar cell = parse_XLSCell(blob, 6);\n\t++blob.l;\n\tvar num = parse_Xnum(blob, 8);\n\tcell.t = 'n';\n\tcell.val = num;\n\treturn cell;\n}\nfunction write_BIFF2NUM(r, c, val) {\n\tvar out = new_buf(15);\n\twrite_BIFF2Cell(out, r, c);\n\tout.write_shift(8, val, 'f');\n\treturn out;\n}\n\nfunction parse_BIFF2INT(blob) {\n\tvar cell = parse_XLSCell(blob, 6);\n\t++blob.l;\n\tvar num = blob.read_shift(2);\n\tcell.t = 'n';\n\tcell.val = num;\n\treturn cell;\n}\nfunction write_BIFF2INT(r, c, val) {\n\tvar out = new_buf(9);\n\twrite_BIFF2Cell(out, r, c);\n\tout.write_shift(2, val);\n\treturn out;\n}\n\nfunction parse_BIFF2STRING(blob) {\n\tvar cch = blob.read_shift(1);\n\tif(cch === 0) { blob.l++; return \"\"; }\n\treturn blob.read_shift(cch, 'sbcs-cont');\n}\n\n/* TODO: convert to BIFF8 font struct */\nfunction parse_BIFF2FONTXTRA(blob, length) {\n\tblob.l += 6; // unknown\n\tblob.l += 2; // font weight \"bls\"\n\tblob.l += 1; // charset\n\tblob.l += 3; // unknown\n\tblob.l += 1; // font family\n\tblob.l += length - 13;\n}\n\n/* TODO: parse rich text runs */\nfunction parse_RString(blob, length, opts) {\n\tvar end = blob.l + length;\n\tvar cell = parse_XLSCell(blob, 6);\n\tvar cch = blob.read_shift(2);\n\tvar str = parse_XLUnicodeStringNoCch(blob, cch, opts);\n\tblob.l = end;\n\tcell.t = 'str';\n\tcell.val = str;\n\treturn cell;\n}\n/* from js-harb (C) 2014-present SheetJS */\nvar DBF = (function() {\nvar dbf_codepage_map = {\n\t/* Code Pages Supported by Visual FoxPro */\n0x01: 437, 0x02: 850,\n0x03: 1252, 0x04: 10000,\n0x64: 852, 0x65: 866,\n0x66: 865, 0x67: 861,\n0x68: 895, 0x69: 620,\n0x6A: 737, 0x6B: 857,\n0x78: 950, 0x79: 949,\n0x7A: 936, 0x7B: 932,\n0x7C: 874, 0x7D: 1255,\n0x7E: 1256, 0x96: 10007,\n0x97: 10029, 0x98: 10006,\n0xC8: 1250, 0xC9: 1251,\n0xCA: 1254, 0xCB: 1253,\n\n\t/* shapefile DBF extension */\n0x00: 20127, 0x08: 865,\n0x09: 437, 0x0A: 850,\n0x0B: 437, 0x0D: 437,\n0x0E: 850, 0x0F: 437,\n0x10: 850, 0x11: 437,\n0x12: 850, 0x13: 932,\n0x14: 850, 0x15: 437,\n0x16: 850, 0x17: 865,\n0x18: 437, 0x19: 437,\n0x1A: 850, 0x1B: 437,\n0x1C: 863, 0x1D: 850,\n0x1F: 852, 0x22: 852,\n0x23: 852, 0x24: 860,\n0x25: 850, 0x26: 866,\n0x37: 850, 0x40: 852,\n0x4D: 936, 0x4E: 949,\n0x4F: 950, 0x50: 874,\n0x57: 1252, 0x58: 1252,\n0x59: 1252, 0x6C: 863,\n0x86: 737, 0x87: 852,\n0x88: 857, 0xCC: 1257,\n\n0xFF: 16969\n};\nvar dbf_reverse_map = evert({\n0x01: 437, 0x02: 850,\n0x03: 1252, 0x04: 10000,\n0x64: 852, 0x65: 866,\n0x66: 865, 0x67: 861,\n0x68: 895, 0x69: 620,\n0x6A: 737, 0x6B: 857,\n0x78: 950, 0x79: 949,\n0x7A: 936, 0x7B: 932,\n0x7C: 874, 0x7D: 1255,\n0x7E: 1256, 0x96: 10007,\n0x97: 10029, 0x98: 10006,\n0xC8: 1250, 0xC9: 1251,\n0xCA: 1254, 0xCB: 1253,\n0x00: 20127\n});\nvar DBF_SUPPORTED_VERSIONS = [0x02, 0x03, 0x30, 0x31, 0x83, 0x8B, 0x8C, 0xF5];\n/* TODO: find an actual specification */\nfunction dbf_to_aoa(buf, opts) {\n\tvar out = [];\n\tvar d = (new_raw_buf(1));\n\tswitch(opts.type) {\n\t\tcase 'base64': d = s2a(Base64.decode(buf)); break;\n\t\tcase 'binary': d = s2a(buf); break;\n\t\tcase 'buffer':\n\t\tcase 'array': d = buf; break;\n\t}\n\tprep_blob(d, 0);\n\n\t/* header */\n\tvar ft = d.read_shift(1);\n\tvar memo = !!(ft & 0x88);\n\tvar vfp = false, l7 = false;\n\tswitch(ft) {\n\t\tcase 0x02: break; // dBASE II\n\t\tcase 0x03: break; // dBASE III\n\t\tcase 0x30: vfp = true; memo = true; break; // VFP\n\t\tcase 0x31: vfp = true; memo = true; break; // VFP with autoincrement\n\t\t// 0x43 dBASE IV SQL table files\n\t\t// 0x63 dBASE IV SQL system files\n\t\tcase 0x83: break; // dBASE III with memo\n\t\tcase 0x8B: break; // dBASE IV with memo\n\t\tcase 0x8C: l7 = true; break; // dBASE Level 7 with memo\n\t\t// case 0xCB dBASE IV SQL table files with memo\n\t\tcase 0xF5: break; // FoxPro 2.x with memo\n\t\t// case 0xFB FoxBASE\n\t\tdefault: throw new Error(\"DBF Unsupported Version: \" + ft.toString(16));\n\t}\n\n\tvar nrow = 0, fpos = 0x0209;\n\tif(ft == 0x02) nrow = d.read_shift(2);\n\td.l += 3; // dBASE II stores DDMMYY date, others use YYMMDD\n\tif(ft != 0x02) nrow = d.read_shift(4);\n\tif(nrow > 1048576) nrow = 1e6;\n\n\tif(ft != 0x02) fpos = d.read_shift(2); // header length\n\tvar rlen = d.read_shift(2); // record length\n\n\tvar /*flags = 0,*/ current_cp = opts.codepage || 1252;\n\tif(ft != 0x02) { // 20 reserved bytes\n\t\td.l+=16;\n\t\t/*flags = */d.read_shift(1);\n\t\t//if(memo && ((flags & 0x02) === 0)) throw new Error(\"DBF Flags \" + flags.toString(16) + \" ft \" + ft.toString(16));\n\n\t\t/* codepage present in FoxPro and dBASE Level 7 */\n\t\tif(d[d.l] !== 0) current_cp = dbf_codepage_map[d[d.l]];\n\t\td.l+=1;\n\n\t\td.l+=2;\n\t}\n\tif(l7) d.l += 36; // Level 7: 32 byte \"Language driver name\", 4 byte reserved\n\nvar fields = [], field = ({});\n\tvar hend = Math.min(d.length, (ft == 0x02 ? 0x209 : (fpos - 10 - (vfp ? 264 : 0))));\n\tvar ww = l7 ? 32 : 11;\n\twhile(d.l < hend && d[d.l] != 0x0d) {\n\t\tfield = ({});\n\t\tfield.name = cptable.utils.decode(current_cp, d.slice(d.l, d.l+ww)).replace(/[\\u0000\\r\\n].*$/g,\"\");\n\t\td.l += ww;\n\t\tfield.type = String.fromCharCode(d.read_shift(1));\n\t\tif(ft != 0x02 && !l7) field.offset = d.read_shift(4);\n\t\tfield.len = d.read_shift(1);\n\t\tif(ft == 0x02) field.offset = d.read_shift(2);\n\t\tfield.dec = d.read_shift(1);\n\t\tif(field.name.length) fields.push(field);\n\t\tif(ft != 0x02) d.l += l7 ? 13 : 14;\n\t\tswitch(field.type) {\n\t\t\tcase 'B': // Double (VFP) / Binary (dBASE L7)\n\t\t\t\tif((!vfp || field.len != 8) && opts.WTF) console.log('Skipping ' + field.name + ':' + field.type);\n\t\t\t\tbreak;\n\t\t\tcase 'G': // General (FoxPro and dBASE L7)\n\t\t\tcase 'P': // Picture (FoxPro and dBASE L7)\n\t\t\t\tif(opts.WTF) console.log('Skipping ' + field.name + ':' + field.type);\n\t\t\t\tbreak;\n\t\t\tcase '+': // Autoincrement (dBASE L7 only)\n\t\t\tcase '0': // _NullFlags (VFP only)\n\t\t\tcase '@': // Timestamp (dBASE L7 only)\n\t\t\tcase 'C': // Character (dBASE II)\n\t\t\tcase 'D': // Date (dBASE III)\n\t\t\tcase 'F': // Float (dBASE IV)\n\t\t\tcase 'I': // Long (VFP and dBASE L7)\n\t\t\tcase 'L': // Logical (dBASE II)\n\t\t\tcase 'M': // Memo (dBASE III)\n\t\t\tcase 'N': // Number (dBASE II)\n\t\t\tcase 'O': // Double (dBASE L7 only)\n\t\t\tcase 'T': // Datetime (VFP only)\n\t\t\tcase 'Y': // Currency (VFP only)\n\t\t\t\tbreak;\n\t\t\tdefault: throw new Error('Unknown Field Type: ' + field.type);\n\t\t}\n\t}\n\n\tif(d[d.l] !== 0x0D) d.l = fpos-1;\n\tif(d.read_shift(1) !== 0x0D) throw new Error(\"DBF Terminator not found \" + d.l + \" \" + d[d.l]);\n\td.l = fpos;\n\n\t/* data */\n\tvar R = 0, C = 0;\n\tout[0] = [];\n\tfor(C = 0; C != fields.length; ++C) out[0][C] = fields[C].name;\n\twhile(nrow-- > 0) {\n\t\tif(d[d.l] === 0x2A) {\n\t\t\t// TODO: record marked as deleted -- create a hidden row?\n\t\t\td.l+=rlen;\n\t\t\tcontinue;\n\t\t}\n\t\t++d.l;\n\t\tout[++R] = []; C = 0;\n\t\tfor(C = 0; C != fields.length; ++C) {\n\t\t\tvar dd = d.slice(d.l, d.l+fields[C].len); d.l+=fields[C].len;\n\t\t\tprep_blob(dd, 0);\n\t\t\tvar s = cptable.utils.decode(current_cp, dd);\n\t\t\tswitch(fields[C].type) {\n\t\t\t\tcase 'C':\n\t\t\t\t\t// NOTE: it is conventional to write ' / / ' for empty dates\n\t\t\t\t\tif(s.trim().length) out[R][C] = s.replace(/\\s+$/,\"\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'D':\n\t\t\t\t\tif(s.length === 8) out[R][C] = new Date(+s.slice(0,4), +s.slice(4,6)-1, +s.slice(6,8));\n\t\t\t\t\telse out[R][C] = s;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'F': out[R][C] = parseFloat(s.trim()); break;\n\t\t\t\tcase '+': case 'I': out[R][C] = l7 ? dd.read_shift(-4, 'i') ^ 0x80000000 : dd.read_shift(4, 'i'); break;\n\t\t\t\tcase 'L': switch(s.trim().toUpperCase()) {\n\t\t\t\t\tcase 'Y': case 'T': out[R][C] = true; break;\n\t\t\t\t\tcase 'N': case 'F': out[R][C] = false; break;\n\t\t\t\t\tcase '': case '?': break;\n\t\t\t\t\tdefault: throw new Error(\"DBF Unrecognized L:|\" + s + \"|\");\n\t\t\t\t\t} break;\n\t\t\t\tcase 'M': /* TODO: handle memo files */\n\t\t\t\t\tif(!memo) throw new Error(\"DBF Unexpected MEMO for type \" + ft.toString(16));\n\t\t\t\t\tout[R][C] = \"##MEMO##\" + (l7 ? parseInt(s.trim(), 10): dd.read_shift(4));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'N':\n\t\t\t\t\ts = s.replace(/\\u0000/g,\"\").trim();\n\t\t\t\t\t// NOTE: dBASE II interprets \" . \" as 0\n\t\t\t\t\tif(s && s != \".\") out[R][C] = +s || 0; break;\n\t\t\t\tcase '@':\n\t\t\t\t\t// NOTE: dBASE specs appear to be incorrect\n\t\t\t\t\tout[R][C] = new Date(dd.read_shift(-8, 'f') - 0x388317533400);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'T': out[R][C] = new Date((dd.read_shift(4) - 0x253D8C) * 0x5265C00 + dd.read_shift(4)); break;\n\t\t\t\tcase 'Y': out[R][C] = dd.read_shift(4,'i')/1e4; break;\n\t\t\t\tcase 'O': out[R][C] = -dd.read_shift(-8, 'f'); break;\n\t\t\t\tcase 'B': if(vfp && fields[C].len == 8) { out[R][C] = dd.read_shift(8,'f'); break; }\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase 'G': case 'P': dd.l += fields[C].len; break;\n\t\t\t\tcase '0':\n\t\t\t\t\tif(fields[C].name === '_NullFlags') break;\n\t\t\t\t\t/* falls through */\n\t\t\t\tdefault: throw new Error(\"DBF Unsupported data type \" + fields[C].type);\n\t\t\t}\n\t\t}\n\t}\n\tif(ft != 0x02) if(d.l < d.length && d[d.l++] != 0x1A) throw new Error(\"DBF EOF Marker missing \" + (d.l-1) + \" of \" + d.length + \" \" + d[d.l-1].toString(16));\n\tif(opts && opts.sheetRows) out = out.slice(0, opts.sheetRows);\n\treturn out;\n}\n\nfunction dbf_to_sheet(buf, opts) {\n\tvar o = opts || {};\n\tif(!o.dateNF) o.dateNF = \"yyyymmdd\";\n\treturn aoa_to_sheet(dbf_to_aoa(buf, o), o);\n}\n\nfunction dbf_to_workbook(buf, opts) {\n\ttry { return sheet_to_workbook(dbf_to_sheet(buf, opts), opts); }\n\tcatch(e) { if(opts && opts.WTF) throw e; }\n\treturn ({SheetNames:[],Sheets:{}});\n}\n\nvar _RLEN = { 'B': 8, 'C': 250, 'L': 1, 'D': 8, '?': 0, '': 0 };\nfunction sheet_to_dbf(ws, opts) {\n\tvar o = opts || {};\n\tif(+o.codepage >= 0) set_cp(+o.codepage);\n\tif(o.type == \"string\") throw new Error(\"Cannot write DBF to JS string\");\n\tvar ba = buf_array();\n\tvar aoa = sheet_to_json(ws, {header:1, raw:true, cellDates:true});\n\tvar headers = aoa[0], data = aoa.slice(1);\n\tvar i = 0, j = 0, hcnt = 0, rlen = 1;\n\tfor(i = 0; i < headers.length; ++i) {\n\t\tif(i == null) continue;\n\t\t++hcnt;\n\t\tif(typeof headers[i] === 'number') headers[i] = headers[i].toString(10);\n\t\tif(typeof headers[i] !== 'string') throw new Error(\"DBF Invalid column name \" + headers[i] + \" |\" + (typeof headers[i]) + \"|\");\n\t\tif(headers.indexOf(headers[i]) !== i) for(j=0; j<1024;++j)\n\t\t\tif(headers.indexOf(headers[i] + \"_\" + j) == -1) { headers[i] += \"_\" + j; break; }\n\t}\n\tvar range = safe_decode_range(ws['!ref']);\n\tvar coltypes = [];\n\tfor(i = 0; i <= range.e.c - range.s.c; ++i) {\n\t\tvar col = [];\n\t\tfor(j=0; j < data.length; ++j) {\n\t\t\tif(data[j][i] != null) col.push(data[j][i]);\n\t\t}\n\t\tif(col.length == 0 || headers[i] == null) { coltypes[i] = '?'; continue; }\n\t\tvar guess = '', _guess = '';\n\t\tfor(j = 0; j < col.length; ++j) {\n\t\t\tswitch(typeof col[j]) {\n\t\t\t\t/* TODO: check if L2 compat is desired */\n\t\t\t\tcase 'number': _guess = 'B'; break;\n\t\t\t\tcase 'string': _guess = 'C'; break;\n\t\t\t\tcase 'boolean': _guess = 'L'; break;\n\t\t\t\tcase 'object': _guess = col[j] instanceof Date ? 'D' : 'C'; break;\n\t\t\t\tdefault: _guess = 'C';\n\t\t\t}\n\t\t\tguess = guess && guess != _guess ? 'C' : _guess;\n\t\t\tif(guess == 'C') break;\n\t\t}\n\t\trlen += _RLEN[guess] || 0;\n\t\tcoltypes[i] = guess;\n\t}\n\n\tvar h = ba.next(32);\n\th.write_shift(4, 0x13021130);\n\th.write_shift(4, data.length);\n\th.write_shift(2, 296 + 32 * hcnt);\n\th.write_shift(2, rlen);\n\tfor(i=0; i < 4; ++i) h.write_shift(4, 0);\n\th.write_shift(4, 0x00000000 | ((+dbf_reverse_map[current_ansi] || 0x03)<<8));\n\n\tfor(i = 0, j = 0; i < headers.length; ++i) {\n\t\tif(headers[i] == null) continue;\n\t\tvar hf = ba.next(32);\n\t\tvar _f = (headers[i].slice(-10) + \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\").slice(0, 11);\n\t\thf.write_shift(1, _f, \"sbcs\");\n\t\thf.write_shift(1, coltypes[i] == '?' ? 'C' : coltypes[i], \"sbcs\");\n\t\thf.write_shift(4, j);\n\t\thf.write_shift(1, _RLEN[coltypes[i]] || 0);\n\t\thf.write_shift(1, 0);\n\t\thf.write_shift(1, 0x02);\n\t\thf.write_shift(4, 0);\n\t\thf.write_shift(1, 0);\n\t\thf.write_shift(4, 0);\n\t\thf.write_shift(4, 0);\n\t\tj += _RLEN[coltypes[i]] || 0;\n\t}\n\n\tvar hb = ba.next(264);\n\thb.write_shift(4, 0x0000000D);\n\tfor(i=0; i < 65;++i) hb.write_shift(4, 0x00000000);\n\tfor(i=0; i < data.length; ++i) {\n\t\tvar rout = ba.next(rlen);\n\t\trout.write_shift(1, 0);\n\t\tfor(j=0; j\":190, \"?\":191, \"{\":223\n\t});\n\tvar sylk_char_regex = new RegExp(\"\\u001BN(\" + keys(sylk_escapes).join(\"|\").replace(/\\|\\|\\|/, \"|\\\\||\").replace(/([?()+])/g,\"\\\\$1\") + \"|\\\\|)\", \"gm\");\n\tvar sylk_char_fn = function(_, $1){ var o = sylk_escapes[$1]; return typeof o == \"number\" ? _getansi(o) : o; };\n\tvar decode_sylk_char = function($$, $1, $2) { var newcc = (($1.charCodeAt(0) - 0x20)<<4) | ($2.charCodeAt(0) - 0x30); return newcc == 59 ? $$ : _getansi(newcc); };\n\tsylk_escapes[\"|\"] = 254;\n\t/* TODO: find an actual specification */\n\tfunction sylk_to_aoa(d, opts) {\n\t\tswitch(opts.type) {\n\t\t\tcase 'base64': return sylk_to_aoa_str(Base64.decode(d), opts);\n\t\t\tcase 'binary': return sylk_to_aoa_str(d, opts);\n\t\t\tcase 'buffer': return sylk_to_aoa_str(has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d), opts);\n\t\t\tcase 'array': return sylk_to_aoa_str(cc2str(d), opts);\n\t\t}\n\t\tthrow new Error(\"Unrecognized type \" + opts.type);\n\t}\n\tfunction sylk_to_aoa_str(str, opts) {\n\t\tvar records = str.split(/[\\n\\r]+/), R = -1, C = -1, ri = 0, rj = 0, arr = [];\n\t\tvar formats = [];\n\t\tvar next_cell_format = null;\n\t\tvar sht = {}, rowinfo = [], colinfo = [], cw = [];\n\t\tvar Mval = 0, j;\n\t\tif(+opts.codepage >= 0) set_cp(+opts.codepage);\n\t\tfor (; ri !== records.length; ++ri) {\n\t\t\tMval = 0;\n\t\t\tvar rstr=records[ri].trim().replace(/\\x1B([\\x20-\\x2F])([\\x30-\\x3F])/g, decode_sylk_char).replace(sylk_char_regex, sylk_char_fn);\n\t\t\tvar record=rstr.replace(/;;/g, \"\\u0000\").split(\";\").map(function(x) { return x.replace(/\\u0000/g, \";\"); });\n\t\t\tvar RT=record[0], val;\n\t\t\tif(rstr.length > 0) switch(RT) {\n\t\t\tcase 'ID': break; /* header */\n\t\t\tcase 'E': break; /* EOF */\n\t\t\tcase 'B': break; /* dimensions */\n\t\t\tcase 'O': break; /* options? */\n\t\t\tcase 'W': break; /* window? */\n\t\t\tcase 'P':\n\t\t\t\tif(record[1].charAt(0) == 'P')\n\t\t\t\t\tformats.push(rstr.slice(3).replace(/;;/g, \";\"));\n\t\t\t\tbreak;\n\t\t\tcase 'C':\n\t\t\tvar C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1;\n\t\t\tfor(rj=1; rj -1 && arr[_R][_C];\n\t\t\t\tif(!shrbase || !shrbase[1]) throw new Error(\"SYLK shared formula cannot find base\");\n\t\t\t\tarr[R][C][1] = shift_formula_str(shrbase[1], {r: R - _R, c: C - _C});\n\t\t\t}\n\t\t\tbreak;\n\t\t\tcase 'F':\n\t\t\tvar F_seen = 0;\n\t\t\tfor(rj=1; rj 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); }\n\t\t\t\t\telse if(Mval === 0) rowinfo[R].hidden = true;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault: if(opts && opts.WTF) throw new Error(\"SYLK bad record \" + rstr);\n\t\t\t}\n\t\t\tif(F_seen < 1) next_cell_format = null; break;\n\t\t\tdefault: if(opts && opts.WTF) throw new Error(\"SYLK bad record \" + rstr);\n\t\t\t}\n\t\t}\n\t\tif(rowinfo.length > 0) sht['!rows'] = rowinfo;\n\t\tif(colinfo.length > 0) sht['!cols'] = colinfo;\n\t\tif(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);\n\t\treturn [arr, sht];\n\t}\n\n\tfunction sylk_to_sheet(d, opts) {\n\t\tvar aoasht = sylk_to_aoa(d, opts);\n\t\tvar aoa = aoasht[0], ws = aoasht[1];\n\t\tvar o = aoa_to_sheet(aoa, opts);\n\t\tkeys(ws).forEach(function(k) { o[k] = ws[k]; });\n\t\treturn o;\n\t}\n\n\tfunction sylk_to_workbook(d, opts) { return sheet_to_workbook(sylk_to_sheet(d, opts), opts); }\n\n\tfunction write_ws_cell_sylk(cell, ws, R, C) {\n\t\tvar o = \"C;Y\" + (R+1) + \";X\" + (C+1) + \";K\";\n\t\tswitch(cell.t) {\n\t\t\tcase 'n':\n\t\t\t\to += (cell.v||0);\n\t\t\t\tif(cell.f && !cell.F) o += \";E\" + a1_to_rc(cell.f, {r:R, c:C}); break;\n\t\t\tcase 'b': o += cell.v ? \"TRUE\" : \"FALSE\"; break;\n\t\t\tcase 'e': o += cell.w || cell.v; break;\n\t\t\tcase 'd': o += '\"' + (cell.w || cell.v) + '\"'; break;\n\t\t\tcase 's': o += '\"' + cell.v.replace(/\"/g,\"\") + '\"'; break;\n\t\t}\n\t\treturn o;\n\t}\n\n\tfunction write_ws_cols_sylk(out, cols) {\n\t\tcols.forEach(function(col, i) {\n\t\t\tvar rec = \"F;W\" + (i+1) + \" \" + (i+1) + \" \";\n\t\t\tif(col.hidden) rec += \"0\";\n\t\t\telse {\n\t\t\t\tif(typeof col.width == 'number' && !col.wpx) col.wpx = width2px(col.width);\n\t\t\t\tif(typeof col.wpx == 'number' && !col.wch) col.wch = px2char(col.wpx);\n\t\t\t\tif(typeof col.wch == 'number') rec += Math.round(col.wch);\n\t\t\t}\n\t\t\tif(rec.charAt(rec.length - 1) != \" \") out.push(rec);\n\t\t});\n\t}\n\n\tfunction write_ws_rows_sylk(out, rows) {\n\t\trows.forEach(function(row, i) {\n\t\t\tvar rec = \"F;\";\n\t\t\tif(row.hidden) rec += \"M0;\";\n\t\t\telse if(row.hpt) rec += \"M\" + 20 * row.hpt + \";\";\n\t\t\telse if(row.hpx) rec += \"M\" + 20 * px2pt(row.hpx) + \";\";\n\t\t\tif(rec.length > 2) out.push(rec + \"R\" + (i+1));\n\t\t});\n\t}\n\n\tfunction sheet_to_sylk(ws, opts) {\n\t\tvar preamble = [\"ID;PWXL;N;E\"], o = [];\n\t\tvar r = safe_decode_range(ws['!ref']), cell;\n\t\tvar dense = Array.isArray(ws);\n\t\tvar RS = \"\\r\\n\";\n\n\t\tpreamble.push(\"P;PGeneral\");\n\t\tpreamble.push(\"F;P0;DG0G8;M255\");\n\t\tif(ws['!cols']) write_ws_cols_sylk(preamble, ws['!cols']);\n\t\tif(ws['!rows']) write_ws_rows_sylk(preamble, ws['!rows']);\n\n\t\tpreamble.push(\"B;Y\" + (r.e.r - r.s.r + 1) + \";X\" + (r.e.c - r.s.c + 1) + \";D\" + [r.s.c,r.s.r,r.e.c,r.e.r].join(\" \"));\n\t\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\t\tfor(var C = r.s.c; C <= r.e.c; ++C) {\n\t\t\t\tvar coord = encode_cell({r:R,c:C});\n\t\t\t\tcell = dense ? (ws[R]||[])[C]: ws[coord];\n\t\t\t\tif(!cell || (cell.v == null && (!cell.f || cell.F))) continue;\n\t\t\t\to.push(write_ws_cell_sylk(cell, ws, R, C, opts));\n\t\t\t}\n\t\t}\n\t\treturn preamble.join(RS) + RS + o.join(RS) + RS + \"E\" + RS;\n\t}\n\n\treturn {\n\t\tto_workbook: sylk_to_workbook,\n\t\tto_sheet: sylk_to_sheet,\n\t\tfrom_sheet: sheet_to_sylk\n\t};\n})();\n\nvar DIF = (function() {\n\tfunction dif_to_aoa(d, opts) {\n\t\tswitch(opts.type) {\n\t\t\tcase 'base64': return dif_to_aoa_str(Base64.decode(d), opts);\n\t\t\tcase 'binary': return dif_to_aoa_str(d, opts);\n\t\t\tcase 'buffer': return dif_to_aoa_str(has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d), opts);\n\t\t\tcase 'array': return dif_to_aoa_str(cc2str(d), opts);\n\t\t}\n\t\tthrow new Error(\"Unrecognized type \" + opts.type);\n\t}\n\tfunction dif_to_aoa_str(str, opts) {\n\t\tvar records = str.split('\\n'), R = -1, C = -1, ri = 0, arr = [];\n\t\tfor (; ri !== records.length; ++ri) {\n\t\t\tif (records[ri].trim() === 'BOT') { arr[++R] = []; C = 0; continue; }\n\t\t\tif (R < 0) continue;\n\t\t\tvar metadata = records[ri].trim().split(\",\");\n\t\t\tvar type = metadata[0], value = metadata[1];\n\t\t\t++ri;\n\t\t\tvar data = records[ri] || \"\";\n\t\t\twhile(((data.match(/[\"]/g)||[]).length & 1) && ri < records.length - 1) data += \"\\n\" + records[++ri];\n\t\t\tdata = data.trim();\n\t\t\tswitch (+type) {\n\t\t\t\tcase -1:\n\t\t\t\t\tif (data === 'BOT') { arr[++R] = []; C = 0; continue; }\n\t\t\t\t\telse if (data !== 'EOD') throw new Error(\"Unrecognized DIF special command \" + data);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0:\n\t\t\t\t\tif(data === 'TRUE') arr[R][C] = true;\n\t\t\t\t\telse if(data === 'FALSE') arr[R][C] = false;\n\t\t\t\t\telse if(!isNaN(fuzzynum(value))) arr[R][C] = fuzzynum(value);\n\t\t\t\t\telse if(!isNaN(fuzzydate(value).getDate())) arr[R][C] = parseDate(value);\n\t\t\t\t\telse arr[R][C] = value;\n\t\t\t\t\t++C; break;\n\t\t\t\tcase 1:\n\t\t\t\t\tdata = data.slice(1,data.length-1);\n\t\t\t\t\tdata = data.replace(/\"\"/g, '\"');\n\t\t\t\t\tif(DIF_XL && data && data.match(/^=\".*\"$/)) data = data.slice(2, -1);\n\t\t\t\t\tarr[R][C++] = data !== '' ? data : null;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (data === 'EOD') break;\n\t\t}\n\t\tif(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);\n\t\treturn arr;\n\t}\n\n\tfunction dif_to_sheet(str, opts) { return aoa_to_sheet(dif_to_aoa(str, opts), opts); }\n\tfunction dif_to_workbook(str, opts) { return sheet_to_workbook(dif_to_sheet(str, opts), opts); }\n\n\tvar sheet_to_dif = (function() {\n\t\tvar push_field = function pf(o, topic, v, n, s) {\n\t\t\to.push(topic);\n\t\t\to.push(v + \",\" + n);\n\t\t\to.push('\"' + s.replace(/\"/g,'\"\"') + '\"');\n\t\t};\n\t\tvar push_value = function po(o, type, v, s) {\n\t\t\to.push(type + \",\" + v);\n\t\t\to.push(type == 1 ? '\"' + s.replace(/\"/g,'\"\"') + '\"' : s);\n\t\t};\n\t\treturn function sheet_to_dif(ws) {\n\t\t\tvar o = [];\n\t\t\tvar r = safe_decode_range(ws['!ref']), cell;\n\t\t\tvar dense = Array.isArray(ws);\n\t\t\tpush_field(o, \"TABLE\", 0, 1, \"sheetjs\");\n\t\t\tpush_field(o, \"VECTORS\", 0, r.e.r - r.s.r + 1,\"\");\n\t\t\tpush_field(o, \"TUPLES\", 0, r.e.c - r.s.c + 1,\"\");\n\t\t\tpush_field(o, \"DATA\", 0, 0,\"\");\n\t\t\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\t\t\tpush_value(o, -1, 0, \"BOT\");\n\t\t\t\tfor(var C = r.s.c; C <= r.e.c; ++C) {\n\t\t\t\t\tvar coord = encode_cell({r:R,c:C});\n\t\t\t\t\tcell = dense ? (ws[R]||[])[C] : ws[coord];\n\t\t\t\t\tif(!cell) { push_value(o, 1, 0, \"\"); continue;}\n\t\t\t\t\tswitch(cell.t) {\n\t\t\t\t\t\tcase 'n':\n\t\t\t\t\t\t\tvar val = DIF_XL ? cell.w : cell.v;\n\t\t\t\t\t\t\tif(!val && cell.v != null) val = cell.v;\n\t\t\t\t\t\t\tif(val == null) {\n\t\t\t\t\t\t\t\tif(DIF_XL && cell.f && !cell.F) push_value(o, 1, 0, \"=\" + cell.f);\n\t\t\t\t\t\t\t\telse push_value(o, 1, 0, \"\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse push_value(o, 0, val, \"V\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'b':\n\t\t\t\t\t\t\tpush_value(o, 0, cell.v ? 1 : 0, cell.v ? \"TRUE\" : \"FALSE\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 's':\n\t\t\t\t\t\t\tpush_value(o, 1, 0, (!DIF_XL || isNaN(cell.v)) ? cell.v : '=\"' + cell.v + '\"');\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\t\tif(!cell.w) cell.w = SSF.format(cell.z || SSF._table[14], datenum(parseDate(cell.v)));\n\t\t\t\t\t\t\tif(DIF_XL) push_value(o, 0, cell.w, \"V\");\n\t\t\t\t\t\t\telse push_value(o, 1, 0, cell.w);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault: push_value(o, 1, 0, \"\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tpush_value(o, -1, 0, \"EOD\");\n\t\t\tvar RS = \"\\r\\n\";\n\t\t\tvar oo = o.join(RS);\n\t\t\t//while((oo.length & 0x7F) != 0) oo += \"\\0\";\n\t\t\treturn oo;\n\t\t};\n\t})();\n\treturn {\n\t\tto_workbook: dif_to_workbook,\n\t\tto_sheet: dif_to_sheet,\n\t\tfrom_sheet: sheet_to_dif\n\t};\n})();\n\nvar ETH = (function() {\n\tfunction decode(s) { return s.replace(/\\\\b/g,\"\\\\\").replace(/\\\\c/g,\":\").replace(/\\\\n/g,\"\\n\"); }\n\tfunction encode(s) { return s.replace(/\\\\/g, \"\\\\b\").replace(/:/g, \"\\\\c\").replace(/\\n/g,\"\\\\n\"); }\n\n\tfunction eth_to_aoa(str, opts) {\n\t\tvar records = str.split('\\n'), R = -1, C = -1, ri = 0, arr = [];\n\t\tfor (; ri !== records.length; ++ri) {\n\t\t\tvar record = records[ri].trim().split(\":\");\n\t\t\tif(record[0] !== 'cell') continue;\n\t\t\tvar addr = decode_cell(record[1]);\n\t\t\tif(arr.length <= addr.r) for(R = arr.length; R <= addr.r; ++R) if(!arr[R]) arr[R] = [];\n\t\t\tR = addr.r; C = addr.c;\n\t\t\tswitch(record[2]) {\n\t\t\t\tcase 't': arr[R][C] = decode(record[3]); break;\n\t\t\t\tcase 'v': arr[R][C] = +record[3]; break;\n\t\t\t\tcase 'vtf': var _f = record[record.length - 1];\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase 'vtc':\n\t\t\t\t\tswitch(record[3]) {\n\t\t\t\t\t\tcase 'nl': arr[R][C] = +record[4] ? true : false; break;\n\t\t\t\t\t\tdefault: arr[R][C] = +record[4]; break;\n\t\t\t\t\t}\n\t\t\t\t\tif(record[2] == 'vtf') arr[R][C] = [arr[R][C], _f];\n\t\t\t}\n\t\t}\n\t\tif(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);\n\t\treturn arr;\n\t}\n\n\tfunction eth_to_sheet(d, opts) { return aoa_to_sheet(eth_to_aoa(d, opts), opts); }\n\tfunction eth_to_workbook(d, opts) { return sheet_to_workbook(eth_to_sheet(d, opts), opts); }\n\n\tvar header = [\n\t\t\"socialcalc:version:1.5\",\n\t\t\"MIME-Version: 1.0\",\n\t\t\"Content-Type: multipart/mixed; boundary=SocialCalcSpreadsheetControlSave\"\n\t].join(\"\\n\");\n\n\tvar sep = [\n\t\t\"--SocialCalcSpreadsheetControlSave\",\n\t\t\"Content-type: text/plain; charset=UTF-8\"\n\t].join(\"\\n\") + \"\\n\";\n\n\t/* TODO: the other parts */\n\tvar meta = [\n\t\t\"# SocialCalc Spreadsheet Control Save\",\n\t\t\"part:sheet\"\n\t].join(\"\\n\");\n\n\tvar end = \"--SocialCalcSpreadsheetControlSave--\";\n\n\tfunction sheet_to_eth_data(ws) {\n\t\tif(!ws || !ws['!ref']) return \"\";\n\t\tvar o = [], oo = [], cell, coord = \"\";\n\t\tvar r = decode_range(ws['!ref']);\n\t\tvar dense = Array.isArray(ws);\n\t\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\t\tfor(var C = r.s.c; C <= r.e.c; ++C) {\n\t\t\t\tcoord = encode_cell({r:R,c:C});\n\t\t\t\tcell = dense ? (ws[R]||[])[C] : ws[coord];\n\t\t\t\tif(!cell || cell.v == null || cell.t === 'z') continue;\n\t\t\t\too = [\"cell\", coord, 't'];\n\t\t\t\tswitch(cell.t) {\n\t\t\t\t\tcase 's': case 'str': oo.push(encode(cell.v)); break;\n\t\t\t\t\tcase 'n':\n\t\t\t\t\t\tif(!cell.f) { oo[2]='v'; oo[3]=cell.v; }\n\t\t\t\t\t\telse { oo[2]='vtf'; oo[3]='n'; oo[4]=cell.v; oo[5]=encode(cell.f); }\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'b':\n\t\t\t\t\t\too[2] = 'vt'+(cell.f?'f':'c'); oo[3]='nl'; oo[4]=cell.v?\"1\":\"0\";\n\t\t\t\t\t\too[5] = encode(cell.f||(cell.v?'TRUE':'FALSE'));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'd':\n\t\t\t\t\t\tvar t = datenum(parseDate(cell.v));\n\t\t\t\t\t\too[2] = 'vtc'; oo[3] = 'nd'; oo[4] = \"\"+t;\n\t\t\t\t\t\too[5] = cell.w || SSF.format(cell.z || SSF._table[14], t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'e': continue;\n\t\t\t\t}\n\t\t\t\to.push(oo.join(\":\"));\n\t\t\t}\n\t\t}\n\t\to.push(\"sheet:c:\" + (r.e.c-r.s.c+1) + \":r:\" + (r.e.r-r.s.r+1) + \":tvf:1\");\n\t\to.push(\"valueformat:1:text-wiki\");\n\t\t//o.push(\"copiedfrom:\" + ws['!ref']); // clipboard only\n\t\treturn o.join(\"\\n\");\n\t}\n\n\tfunction sheet_to_eth(ws) {\n\t\treturn [header, sep, meta, sep, sheet_to_eth_data(ws), end].join(\"\\n\");\n\t\t// return [\"version:1.5\", sheet_to_eth_data(ws)].join(\"\\n\"); // clipboard form\n\t}\n\n\treturn {\n\t\tto_workbook: eth_to_workbook,\n\t\tto_sheet: eth_to_sheet,\n\t\tfrom_sheet: sheet_to_eth\n\t};\n})();\n\nvar PRN = (function() {\n\tfunction set_text_arr(data, arr, R, C, o) {\n\t\tif(o.raw) arr[R][C] = data;\n\t\telse if(data === \"\"){/* empty */}\n\t\telse if(data === 'TRUE') arr[R][C] = true;\n\t\telse if(data === 'FALSE') arr[R][C] = false;\n\t\telse if(!isNaN(fuzzynum(data))) arr[R][C] = fuzzynum(data);\n\t\telse if(!isNaN(fuzzydate(data).getDate())) arr[R][C] = parseDate(data);\n\t\telse arr[R][C] = data;\n\t}\n\n\tfunction prn_to_aoa_str(f, opts) {\n\t\tvar o = opts || {};\n\t\tvar arr = ([]);\n\t\tif(!f || f.length === 0) return arr;\n\t\tvar lines = f.split(/[\\r\\n]/);\n\t\tvar L = lines.length - 1;\n\t\twhile(L >= 0 && lines[L].length === 0) --L;\n\t\tvar start = 10, idx = 0;\n\t\tvar R = 0;\n\t\tfor(; R <= L; ++R) {\n\t\t\tidx = lines[R].indexOf(\" \");\n\t\t\tif(idx == -1) idx = lines[R].length; else idx++;\n\t\t\tstart = Math.max(start, idx);\n\t\t}\n\t\tfor(R = 0; R <= L; ++R) {\n\t\t\tarr[R] = [];\n\t\t\t/* TODO: confirm that widths are always 10 */\n\t\t\tvar C = 0;\n\t\t\tset_text_arr(lines[R].slice(0, start).trim(), arr, R, C, o);\n\t\t\tfor(C = 1; C <= (lines[R].length - start)/10 + 1; ++C)\n\t\t\t\tset_text_arr(lines[R].slice(start+(C-1)*10,start+C*10).trim(),arr,R,C,o);\n\t\t}\n\t\tif(o.sheetRows) arr = arr.slice(0, o.sheetRows);\n\t\treturn arr;\n\t}\n\n\t// List of accepted CSV separators\n\tvar guess_seps = {\n0x2C: ',',\n0x09: \"\\t\",\n0x3B: ';',\n0x7C: '|'\n\t};\n\n\t// CSV separator weights to be used in case of equal numbers\n\tvar guess_sep_weights = {\n0x2C: 3,\n0x09: 2,\n0x3B: 1,\n0x7C: 0\n\t};\n\n\tfunction guess_sep(str) {\n\t\tvar cnt = {}, instr = false, end = 0, cc = 0;\n\t\tfor(;end < str.length;++end) {\n\t\t\tif((cc=str.charCodeAt(end)) == 0x22) instr = !instr;\n\t\t\telse if(!instr && cc in guess_seps) cnt[cc] = (cnt[cc]||0)+1;\n\t\t}\n\n\t\tcc = [];\n\t\tfor(end in cnt) if ( Object.prototype.hasOwnProperty.call(cnt, end) ) {\n\t\t\tcc.push([ cnt[end], end ]);\n\t\t}\n\n\t\tif ( !cc.length ) {\n\t\t\tcnt = guess_sep_weights;\n\t\t\tfor(end in cnt) if ( Object.prototype.hasOwnProperty.call(cnt, end) ) {\n\t\t\t\tcc.push([ cnt[end], end ]);\n\t\t\t}\n\t\t}\n\n\t\tcc.sort(function(a, b) { return a[0] - b[0] || guess_sep_weights[a[1]] - guess_sep_weights[b[1]]; });\n\n\t\treturn guess_seps[cc.pop()[1]] || 0x2C;\n\t}\n\n\tfunction dsv_to_sheet_str(str, opts) {\n\t\tvar o = opts || {};\n\t\tvar sep = \"\";\n\t\tif(DENSE != null && o.dense == null) o.dense = DENSE;\n\t\tvar ws = o.dense ? ([]) : ({});\n\t\tvar range = ({s: {c:0, r:0}, e: {c:0, r:0}});\n\n\t\tif(str.slice(0,4) == \"sep=\") {\n\t\t\t// If the line ends in \\r\\n\n\t\t\tif(str.charCodeAt(5) == 13 && str.charCodeAt(6) == 10 ) {\n\t\t\t\tsep = str.charAt(4); str = str.slice(7);\n\t\t\t}\n\t\t\t// If line ends in \\r OR \\n\n\t\t\telse if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) {\n\t\t\t\tsep = str.charAt(4); str = str.slice(6);\n\t\t\t}\n\t\t\telse sep = guess_sep(str.slice(0,1024));\n\t\t}\n\t\telse if(o && o.FS) sep = o.FS;\n\t\telse sep = guess_sep(str.slice(0,1024));\n\t\tvar R = 0, C = 0, v = 0;\n\t\tvar start = 0, end = 0, sepcc = sep.charCodeAt(0), instr = false, cc=0, startcc=str.charCodeAt(0);\n\t\tstr = str.replace(/\\r\\n/mg, \"\\n\");\n\t\tvar _re = o.dateNF != null ? dateNF_regex(o.dateNF) : null;\n\t\tfunction finish_cell() {\n\t\t\tvar s = str.slice(start, end);\n\t\t\tvar cell = ({});\n\t\t\tif(s.charAt(0) == '\"' && s.charAt(s.length - 1) == '\"') s = s.slice(1,-1).replace(/\"\"/g,'\"');\n\t\t\tif(s.length === 0) cell.t = 'z';\n\t\t\telse if(o.raw) { cell.t = 's'; cell.v = s; }\n\t\t\telse if(s.trim().length === 0) { cell.t = 's'; cell.v = s; }\n\t\t\telse if(s.charCodeAt(0) == 0x3D) {\n\t\t\t\tif(s.charCodeAt(1) == 0x22 && s.charCodeAt(s.length - 1) == 0x22) { cell.t = 's'; cell.v = s.slice(2,-1).replace(/\"\"/g,'\"'); }\n\t\t\t\telse if(fuzzyfmla(s)) { cell.t = 'n'; cell.f = s.slice(1); }\n\t\t\t\telse { cell.t = 's'; cell.v = s; } }\n\t\t\telse if(s == \"TRUE\") { cell.t = 'b'; cell.v = true; }\n\t\t\telse if(s == \"FALSE\") { cell.t = 'b'; cell.v = false; }\n\t\t\telse if(!isNaN(v = fuzzynum(s))) { cell.t = 'n'; if(o.cellText !== false) cell.w = s; cell.v = v; }\n\t\t\telse if(!isNaN(fuzzydate(s).getDate()) || _re && s.match(_re)) {\n\t\t\t\tcell.z = o.dateNF || SSF._table[14];\n\t\t\t\tvar k = 0;\n\t\t\t\tif(_re && s.match(_re)){ s=dateNF_fix(s, o.dateNF, (s.match(_re)||[])); k=1; }\n\t\t\t\tif(o.cellDates) { cell.t = 'd'; cell.v = parseDate(s, k); }\n\t\t\t\telse { cell.t = 'n'; cell.v = datenum(parseDate(s, k)); }\n\t\t\t\tif(o.cellText !== false) cell.w = SSF.format(cell.z, cell.v instanceof Date ? datenum(cell.v):cell.v);\n\t\t\t\tif(!o.cellNF) delete cell.z;\n\t\t\t} else {\n\t\t\t\tcell.t = 's';\n\t\t\t\tcell.v = s;\n\t\t\t}\n\t\t\tif(cell.t == 'z'){}\n\t\t\telse if(o.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = cell; }\n\t\t\telse ws[encode_cell({c:C,r:R})] = cell;\n\t\t\tstart = end+1; startcc = str.charCodeAt(start);\n\t\t\tif(range.e.c < C) range.e.c = C;\n\t\t\tif(range.e.r < R) range.e.r = R;\n\t\t\tif(cc == sepcc) ++C; else { C = 0; ++R; if(o.sheetRows && o.sheetRows <= R) return true; }\n\t\t}\n\t\touter: for(;end < str.length;++end) switch((cc=str.charCodeAt(end))) {\n\t\t\tcase 0x22: if(startcc === 0x22) instr = !instr; break;\n\t\t\tcase sepcc: case 0x0a: case 0x0d: if(!instr && finish_cell()) break outer; break;\n\t\t\tdefault: break;\n\t\t}\n\t\tif(end - start > 0) finish_cell();\n\n\t\tws['!ref'] = encode_range(range);\n\t\treturn ws;\n\t}\n\n\tfunction prn_to_sheet_str(str, opts) {\n\t\tif(!(opts && opts.PRN)) return dsv_to_sheet_str(str, opts);\n\t\tif(opts.FS) return dsv_to_sheet_str(str, opts);\n\t\tif(str.slice(0,4) == \"sep=\") return dsv_to_sheet_str(str, opts);\n\t\tif(str.indexOf(\"\\t\") >= 0 || str.indexOf(\",\") >= 0 || str.indexOf(\";\") >= 0) return dsv_to_sheet_str(str, opts);\n\t\treturn aoa_to_sheet(prn_to_aoa_str(str, opts), opts);\n\t}\n\n\tfunction prn_to_sheet(d, opts) {\n\t\tvar str = \"\", bytes = opts.type == 'string' ? [0,0,0,0] : firstbyte(d, opts);\n\t\tswitch(opts.type) {\n\t\t\tcase 'base64': str = Base64.decode(d); break;\n\t\t\tcase 'binary': str = d; break;\n\t\t\tcase 'buffer':\n\t\t\t\tif(opts.codepage == 65001) str = d.toString('utf8'); // TODO: test if buf\n\t\t\t\telse if(opts.codepage && typeof cptable !== 'undefined') str = cptable.utils.decode(opts.codepage, d);\n\t\t\t\telse str = has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d);\n\t\t\t\tbreak;\n\t\t\tcase 'array': str = cc2str(d); break;\n\t\t\tcase 'string': str = d; break;\n\t\t\tdefault: throw new Error(\"Unrecognized type \" + opts.type);\n\t\t}\n\t\tif(bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str.slice(3));\n\t\telse if(opts.type != 'string' && opts.codepage == 65001) str = utf8read(str);\n\t\telse if((opts.type == 'binary') && typeof cptable !== 'undefined' && opts.codepage) str = cptable.utils.decode(opts.codepage, cptable.utils.encode(28591,str));\n\t\tif(str.slice(0,19) == \"socialcalc:version:\") return ETH.to_sheet(opts.type == 'string' ? str : utf8read(str), opts);\n\t\treturn prn_to_sheet_str(str, opts);\n\t}\n\n\tfunction prn_to_workbook(d, opts) { return sheet_to_workbook(prn_to_sheet(d, opts), opts); }\n\n\tfunction sheet_to_prn(ws) {\n\t\tvar o = [];\n\t\tvar r = safe_decode_range(ws['!ref']), cell;\n\t\tvar dense = Array.isArray(ws);\n\t\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\t\tvar oo = [];\n\t\t\tfor(var C = r.s.c; C <= r.e.c; ++C) {\n\t\t\t\tvar coord = encode_cell({r:R,c:C});\n\t\t\t\tcell = dense ? (ws[R]||[])[C] : ws[coord];\n\t\t\t\tif(!cell || cell.v == null) { oo.push(\" \"); continue; }\n\t\t\t\tvar w = (cell.w || (format_cell(cell), cell.w) || \"\").slice(0,10);\n\t\t\t\twhile(w.length < 10) w += \" \";\n\t\t\t\too.push(w + (C === 0 ? \" \" : \"\"));\n\t\t\t}\n\t\t\to.push(oo.join(\"\"));\n\t\t}\n\t\treturn o.join(\"\\n\");\n\t}\n\n\treturn {\n\t\tto_workbook: prn_to_workbook,\n\t\tto_sheet: prn_to_sheet,\n\t\tfrom_sheet: sheet_to_prn\n\t};\n})();\n\n/* Excel defaults to SYLK but warns if data is not valid */\nfunction read_wb_ID(d, opts) {\n\tvar o = opts || {}, OLD_WTF = !!o.WTF; o.WTF = true;\n\ttry {\n\t\tvar out = SYLK.to_workbook(d, o);\n\t\to.WTF = OLD_WTF;\n\t\treturn out;\n\t} catch(e) {\n\t\to.WTF = OLD_WTF;\n\t\tif(!e.message.match(/SYLK bad record ID/) && OLD_WTF) throw e;\n\t\treturn PRN.to_workbook(d, opts);\n\t}\n}\n\nvar WK_ = (function() {\n\tfunction lotushopper(data, cb, opts) {\n\t\tif(!data) return;\n\t\tprep_blob(data, data.l || 0);\n\t\tvar Enum = opts.Enum || WK1Enum;\n\t\twhile(data.l < data.length) {\n\t\t\tvar RT = data.read_shift(2);\n\t\t\tvar R = Enum[RT] || Enum[0xFFFF];\n\t\t\tvar length = data.read_shift(2);\n\t\t\tvar tgt = data.l + length;\n\t\t\tvar d = R.f && R.f(data, length, opts);\n\t\t\tdata.l = tgt;\n\t\t\tif(cb(d, R, RT)) return;\n\t\t}\n\t}\n\n\tfunction lotus_to_workbook(d, opts) {\n\t\tswitch(opts.type) {\n\t\t\tcase 'base64': return lotus_to_workbook_buf(s2a(Base64.decode(d)), opts);\n\t\t\tcase 'binary': return lotus_to_workbook_buf(s2a(d), opts);\n\t\t\tcase 'buffer':\n\t\t\tcase 'array': return lotus_to_workbook_buf(d, opts);\n\t\t}\n\t\tthrow \"Unsupported type \" + opts.type;\n\t}\n\n\tfunction lotus_to_workbook_buf(d, opts) {\n\t\tif(!d) return d;\n\t\tvar o = opts || {};\n\t\tif(DENSE != null && o.dense == null) o.dense = DENSE;\n\t\tvar s = ((o.dense ? [] : {})), n = \"Sheet1\", next_n = \"\", sidx = 0;\n\t\tvar sheets = {}, snames = [], realnames = [];\n\n\t\tvar refguess = {s: {r:0, c:0}, e: {r:0, c:0} };\n\t\tvar sheetRows = o.sheetRows || 0;\n\n\t\tif(d[2] == 0x00) {\n\t\t\tif(d[3] == 0x08 || d[3] == 0x09) {\n\t\t\t\tif(d.length >= 16 && d[14] == 0x05 && d[15] === 0x6c) throw new Error(\"Unsupported Works 3 for Mac file\");\n\t\t\t}\n\t\t}\n\n\t\tif(d[2] == 0x02) {\n\t\t\to.Enum = WK1Enum;\n\t\t\tlotushopper(d, function(val, R, RT) { switch(RT) {\n\t\t\t\tcase 0x00: /* BOF */\n\t\t\t\t\to.vers = val;\n\t\t\t\t\tif(val >= 0x1000) o.qpro = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x06: refguess = val; break; /* RANGE */\n\t\t\t\tcase 0xCC: if(val) next_n = val; break; /* SHEETNAMECS */\n\t\t\t\tcase 0xDE: next_n = val; break; /* SHEETNAMELP */\n\t\t\t\tcase 0x0F: /* LABEL */\n\t\t\t\tcase 0x33: /* STRING */\n\t\t\t\t\tif(!o.qpro) val[1].v = val[1].v.slice(1);\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase 0x0D: /* INTEGER */\n\t\t\t\tcase 0x0E: /* NUMBER */\n\t\t\t\tcase 0x10: /* FORMULA */\n\t\t\t\t\t/* TODO: actual translation of the format code */\n\t\t\t\t\tif(RT == 0x0E && (val[2] & 0x70) == 0x70 && (val[2] & 0x0F) > 1 && (val[2] & 0x0F) < 15) {\n\t\t\t\t\t\tval[1].z = o.dateNF || SSF._table[14];\n\t\t\t\t\t\tif(o.cellDates) { val[1].t = 'd'; val[1].v = numdate(val[1].v); }\n\t\t\t\t\t}\n\n\t\t\t\t\tif(o.qpro) {\n\t\t\t\t\t\tif(val[3] > sidx) {\n\t\t\t\t\t\t\ts[\"!ref\"] = encode_range(refguess);\n\t\t\t\t\t\t\tsheets[n] = s;\n\t\t\t\t\t\t\tsnames.push(n);\n\t\t\t\t\t\t\ts = (o.dense ? [] : {});\n\t\t\t\t\t\t\trefguess = {s: {r:0, c:0}, e: {r:0, c:0} };\n\t\t\t\t\t\t\tsidx = val[3]; n = next_n || \"Sheet\" + (sidx + 1); next_n = \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvar tmpcell = o.dense ? (s[val[0].r]||[])[val[0].c] : s[encode_cell(val[0])];\n\t\t\t\t\tif(tmpcell) {\n\t\t\t\t\t\ttmpcell.t = val[1].t; tmpcell.v = val[1].v;\n\t\t\t\t\t\tif(val[1].z != null) tmpcell.z = val[1].z;\n\t\t\t\t\t\tif(val[1].f != null) tmpcell.f = val[1].f;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif(o.dense) {\n\t\t\t\t\t\tif(!s[val[0].r]) s[val[0].r] = [];\n\t\t\t\t\t\ts[val[0].r][val[0].c] = val[1];\n\t\t\t\t\t} else s[encode_cell(val[0])] = val[1];\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t}}, o);\n\t\t} else if(d[2] == 0x1A || d[2] == 0x0E) {\n\t\t\to.Enum = WK3Enum;\n\t\t\tif(d[2] == 0x0E) { o.qpro = true; d.l = 0; }\n\t\t\tlotushopper(d, function(val, R, RT) { switch(RT) {\n\t\t\t\tcase 0xCC: n = val; break; /* SHEETNAMECS */\n\t\t\t\tcase 0x16: /* LABEL16 */\n\t\t\t\t\tval[1].v = val[1].v.slice(1);\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase 0x17: /* NUMBER17 */\n\t\t\t\tcase 0x18: /* NUMBER18 */\n\t\t\t\tcase 0x19: /* FORMULA19 */\n\t\t\t\tcase 0x25: /* NUMBER25 */\n\t\t\t\tcase 0x27: /* NUMBER27 */\n\t\t\t\tcase 0x28: /* FORMULA28 */\n\t\t\t\t\tif(val[3] > sidx) {\n\t\t\t\t\t\ts[\"!ref\"] = encode_range(refguess);\n\t\t\t\t\t\tsheets[n] = s;\n\t\t\t\t\t\tsnames.push(n);\n\t\t\t\t\t\ts = (o.dense ? [] : {});\n\t\t\t\t\t\trefguess = {s: {r:0, c:0}, e: {r:0, c:0} };\n\t\t\t\t\t\tsidx = val[3]; n = \"Sheet\" + (sidx + 1);\n\t\t\t\t\t}\n\t\t\t\t\tif(sheetRows > 0 && val[0].r >= sheetRows) break;\n\t\t\t\t\tif(o.dense) {\n\t\t\t\t\t\tif(!s[val[0].r]) s[val[0].r] = [];\n\t\t\t\t\t\ts[val[0].r][val[0].c] = val[1];\n\t\t\t\t\t} else s[encode_cell(val[0])] = val[1];\n\t\t\t\t\tif(refguess.e.c < val[0].c) refguess.e.c = val[0].c;\n\t\t\t\t\tif(refguess.e.r < val[0].r) refguess.e.r = val[0].r;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x1B: /* XFORMAT */\n\t\t\t\t\tif(val[0x36b0]) realnames[val[0x36b0][0]] = val[0x36b0][1];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0601: /* SHEETINFOQP */\n\t\t\t\t\trealnames[val[0]] = val[1]; if(val[0] == sidx) n = val[1]; break;\n\t\t\t\tdefault: break;\n\t\t\t}}, o);\n\t\t} else throw new Error(\"Unrecognized LOTUS BOF \" + d[2]);\n\t\ts[\"!ref\"] = encode_range(refguess);\n\t\tsheets[next_n || n] = s;\n\t\tsnames.push(next_n || n);\n\t\tif(!realnames.length) return { SheetNames: snames, Sheets: sheets };\n\t\tvar osheets = {}, rnames = [];\n\t\t/* TODO: verify no collisions */\n\t\tfor(var i = 0; i < realnames.length; ++i) if(sheets[snames[i]]) {\n\t\t\trnames.push(realnames[i] || snames[i]);\n\t\t\tosheets[realnames[i]] = sheets[realnames[i]] || sheets[snames[i]];\n\t\t} else {\n\t\t\trnames.push(realnames[i]);\n\t\t\tosheets[realnames[i]] = ({ \"!ref\": \"A1\" });\n\t\t}\n\t\treturn { SheetNames: rnames, Sheets: osheets };\n\t}\n\n\tfunction sheet_to_wk1(ws, opts) {\n\t\tvar o = opts || {};\n\t\tif(+o.codepage >= 0) set_cp(+o.codepage);\n\t\tif(o.type == \"string\") throw new Error(\"Cannot write WK1 to JS string\");\n\t\tvar ba = buf_array();\n\t\tvar range = safe_decode_range(ws[\"!ref\"]);\n\t\tvar dense = Array.isArray(ws);\n\t\tvar cols = [];\n\n\t\twrite_biff_rec(ba, 0x00, write_BOF_WK1(0x0406));\n\t\twrite_biff_rec(ba, 0x06, write_RANGE(range));\n\t\tvar max_R = Math.min(range.e.r, 8191);\n\t\tfor(var R = range.s.r; R <= max_R; ++R) {\n\t\t\tvar rr = encode_row(R);\n\t\t\tfor(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\t\tif(R === range.s.r) cols[C] = encode_col(C);\n\t\t\t\tvar ref = cols[C] + rr;\n\t\t\t\tvar cell = dense ? (ws[R]||[])[C] : ws[ref];\n\t\t\t\tif(!cell || cell.t == \"z\") continue;\n\t\t\t\t/* TODO: formula records */\n\t\t\t\tif(cell.t == \"n\") {\n\t\t\t\t\tif((cell.v|0)==cell.v && cell.v >= -32768 && cell.v <= 32767) write_biff_rec(ba, 0x0d, write_INTEGER(R, C, cell.v));\n\t\t\t\t\telse write_biff_rec(ba, 0x0e, write_NUMBER(R, C, cell.v));\n\t\t\t\t} else {\n\t\t\t\t\tvar str = format_cell(cell);\n\t\t\t\t\twrite_biff_rec(ba, 0x0F, write_LABEL(R, C, str.slice(0, 239)));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\twrite_biff_rec(ba, 0x01);\n\t\treturn ba.end();\n\t}\n\n\tfunction book_to_wk3(wb, opts) {\n\t\tvar o = opts || {};\n\t\tif(+o.codepage >= 0) set_cp(+o.codepage);\n\t\tif(o.type == \"string\") throw new Error(\"Cannot write WK3 to JS string\");\n\t\tvar ba = buf_array();\n\n\t\twrite_biff_rec(ba, 0x00, write_BOF_WK3(wb));\n\n\t\tfor(var i = 0, cnt = 0; i < wb.SheetNames.length; ++i) if((wb.Sheets[wb.SheetNames[i]] || {})[\"!ref\"]) write_biff_rec(ba, 0x1b, write_XFORMAT_SHEETNAME(wb.SheetNames[i], cnt++));\n\n\t\tvar wsidx = 0;\n\t\tfor(i = 0; i < wb.SheetNames.length; ++i) {\n\t\t\tvar ws = wb.Sheets[wb.SheetNames[i]];\n\t\t\tif(!ws || !ws[\"!ref\"]) continue;\n\t\t\tvar range = safe_decode_range(ws[\"!ref\"]);\n\t\t\tvar dense = Array.isArray(ws);\n\t\t\tvar cols = [];\n\t\t\tvar max_R = Math.min(range.e.r, 8191);\n\t\t\tfor(var R = range.s.r; R <= max_R; ++R) {\n\t\t\t\tvar rr = encode_row(R);\n\t\t\t\tfor(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\t\t\tif(R === range.s.r) cols[C] = encode_col(C);\n\t\t\t\t\tvar ref = cols[C] + rr;\n\t\t\t\t\tvar cell = dense ? (ws[R]||[])[C] : ws[ref];\n\t\t\t\t\tif(!cell || cell.t == \"z\") continue;\n\t\t\t\t\t/* TODO: FORMULA19 NUMBER18 records */\n\t\t\t\t\tif(cell.t == \"n\") {\n\t\t\t\t\t\twrite_biff_rec(ba, 0x17, write_NUMBER_17(R, C, wsidx, cell.v));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar str = format_cell(cell);\n\t\t\t\t\t\t/* TODO: max len? */\n\t\t\t\t\t\twrite_biff_rec(ba, 0x16, write_LABEL_16(R, C, wsidx, str.slice(0, 239)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t++wsidx;\n\t\t}\n\n\t\twrite_biff_rec(ba, 0x01);\n\t\treturn ba.end();\n\t}\n\n\n\tfunction write_BOF_WK1(v) {\n\t\tvar out = new_buf(2);\n\t\tout.write_shift(2, v);\n\t\treturn out;\n\t}\n\n\tfunction write_BOF_WK3(wb) {\n\t\tvar out = new_buf(26);\n\t\tout.write_shift(2, 0x1000);\n\t\tout.write_shift(2, 0x0004);\n\t\tout.write_shift(4, 0x0000);\n\t\tvar rows = 0, cols = 0, wscnt = 0;\n\t\tfor(var i = 0; i < wb.SheetNames.length; ++i) {\n\t\t\tvar name = wb.SheetNames[i];\n\t\t\tvar ws = wb.Sheets[name];\n\t\t\tif(!ws || !ws[\"!ref\"]) continue;\n\t\t\t++wscnt;\n\t\t\tvar range = decode_range(ws[\"!ref\"]);\n\t\t\tif(rows < range.e.r) rows = range.e.r;\n\t\t\tif(cols < range.e.c) cols = range.e.c;\n\t\t}\n\t\tif(rows > 8191) rows = 8191;\n\t\tout.write_shift(2, rows);\n\t\tout.write_shift(1, wscnt);\n\t\tout.write_shift(1, cols);\n\t\tout.write_shift(2, 0x00);\n\t\tout.write_shift(2, 0x00);\n\t\tout.write_shift(1, 0x01);\n\t\tout.write_shift(1, 0x02);\n\t\tout.write_shift(4, 0);\n\t\tout.write_shift(4, 0);\n\t\treturn out;\n\t}\n\n\tfunction parse_RANGE(blob, length, opts) {\n\t\tvar o = {s:{c:0,r:0},e:{c:0,r:0}};\n\t\tif(length == 8 && opts.qpro) {\n\t\t\to.s.c = blob.read_shift(1);\n\t\t\tblob.l++;\n\t\t\to.s.r = blob.read_shift(2);\n\t\t\to.e.c = blob.read_shift(1);\n\t\t\tblob.l++;\n\t\t\to.e.r = blob.read_shift(2);\n\t\t\treturn o;\n\t\t}\n\t\to.s.c = blob.read_shift(2);\n\t\to.s.r = blob.read_shift(2);\n\t\tif(length == 12 && opts.qpro) blob.l += 2;\n\t\to.e.c = blob.read_shift(2);\n\t\to.e.r = blob.read_shift(2);\n\t\tif(length == 12 && opts.qpro) blob.l += 2;\n\t\tif(o.s.c == 0xFFFF) o.s.c = o.e.c = o.s.r = o.e.r = 0;\n\t\treturn o;\n\t}\n\tfunction write_RANGE(range) {\n\t\tvar out = new_buf(8);\n\t\tout.write_shift(2, range.s.c);\n\t\tout.write_shift(2, range.s.r);\n\t\tout.write_shift(2, range.e.c);\n\t\tout.write_shift(2, range.e.r);\n\t\treturn out;\n\t}\n\n\tfunction parse_cell(blob, length, opts) {\n\t\tvar o = [{c:0,r:0}, {t:'n',v:0}, 0, 0];\n\t\tif(opts.qpro && opts.vers != 0x5120) {\n\t\t\to[0].c = blob.read_shift(1);\n\t\t\to[3] = blob.read_shift(1);\n\t\t\to[0].r = blob.read_shift(2);\n\t\t\tblob.l+=2;\n\t\t} else {\n\t\t\to[2] = blob.read_shift(1);\n\t\t\to[0].c = blob.read_shift(2); o[0].r = blob.read_shift(2);\n\t\t}\n\t\treturn o;\n\t}\n\n\tfunction parse_LABEL(blob, length, opts) {\n\t\tvar tgt = blob.l + length;\n\t\tvar o = parse_cell(blob, length, opts);\n\t\to[1].t = 's';\n\t\tif(opts.vers == 0x5120) {\n\t\t\tblob.l++;\n\t\t\tvar len = blob.read_shift(1);\n\t\t\to[1].v = blob.read_shift(len, 'utf8');\n\t\t\treturn o;\n\t\t}\n\t\tif(opts.qpro) blob.l++;\n\t\to[1].v = blob.read_shift(tgt - blob.l, 'cstr');\n\t\treturn o;\n\t}\n\tfunction write_LABEL(R, C, s) {\n\t\t/* TODO: encoding */\n\t\tvar o = new_buf(7 + s.length);\n\t\to.write_shift(1, 0xFF);\n\t\to.write_shift(2, C);\n\t\to.write_shift(2, R);\n\t\to.write_shift(1, 0x27); // ??\n\t\tfor(var i = 0; i < o.length; ++i) {\n\t\t\tvar cc = s.charCodeAt(i);\n\t\t\to.write_shift(1, cc >= 0x80 ? 0x5F : cc);\n\t\t}\n\t\to.write_shift(1, 0);\n\t\treturn o;\n\t}\n\n\tfunction parse_INTEGER(blob, length, opts) {\n\t\tvar o = parse_cell(blob, length, opts);\n\t\to[1].v = blob.read_shift(2, 'i');\n\t\treturn o;\n\t}\n\tfunction write_INTEGER(R, C, v) {\n\t\tvar o = new_buf(7);\n\t\to.write_shift(1, 0xFF);\n\t\to.write_shift(2, C);\n\t\to.write_shift(2, R);\n\t\to.write_shift(2, v, 'i');\n\t\treturn o;\n\t}\n\n\tfunction parse_NUMBER(blob, length, opts) {\n\t\tvar o = parse_cell(blob, length, opts);\n\t\to[1].v = blob.read_shift(8, 'f');\n\t\treturn o;\n\t}\n\tfunction write_NUMBER(R, C, v) {\n\t\tvar o = new_buf(13);\n\t\to.write_shift(1, 0xFF);\n\t\to.write_shift(2, C);\n\t\to.write_shift(2, R);\n\t\to.write_shift(8, v, 'f');\n\t\treturn o;\n\t}\n\n\tfunction parse_FORMULA(blob, length, opts) {\n\t\tvar tgt = blob.l + length;\n\t\tvar o = parse_cell(blob, length, opts);\n\t\t/* TODO: formula */\n\t\to[1].v = blob.read_shift(8, 'f');\n\t\tif(opts.qpro) blob.l = tgt;\n\t\telse {\n\t\t\tvar flen = blob.read_shift(2);\n\t\t\twk1_fmla_to_csf(blob.slice(blob.l, blob.l + flen), o);\n\t\t\tblob.l += flen;\n\t\t}\n\t\treturn o;\n\t}\n\n\tfunction wk1_parse_rc(B, V, col) {\n\t\tvar rel = V & 0x8000;\n\t\tV &= ~0x8000;\n\t\tV = (rel ? B : 0) + ((V >= 0x2000) ? V - 0x4000 : V);\n\t\treturn (rel ? \"\" : \"$\") + (col ? encode_col(V) : encode_row(V));\n\t}\n\tvar oprec = [\n\t\t8, 8, 8, 8, 8, 8, 8, 8, 6, 4, 4, 5, 5, 7, 3, 3,\n\t\t3, 3, 3, 3, 1, 1, 2, 6, 8, 8, 8, 8, 8, 8, 8, 8\n\t];\n\t/* TODO: flesh out */\n\tvar FuncTab = {\n\t\t0x33: [\"FALSE\", 0],\n\t\t0x34: [\"TRUE\", 0],\n\t\t0x46: [\"LEN\", 1],\n\t\t0x50: [\"SUM\", 69],\n\t\t0x51: [\"AVERAGEA\", 69],\n\t\t0x52: [\"COUNTA\", 69],\n\t\t0x53: [\"MINA\", 69],\n\t\t0x54: [\"MAXA\", 69],\n\t\t0x6F: [\"T\", 1]\n\t};\n\tvar BinOpTab = [\n\t\t \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n\t\t \"\", \"+\", \"-\", \"*\", \"/\", \"^\", \"=\", \"<>\",\n\t\t\"<=\", \">=\", \"<\", \">\", \"\", \"\", \"\", \"\",\n\t\t \"&\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"\n\t];\n\n\tfunction wk1_fmla_to_csf(blob, o) {\n\t\tprep_blob(blob, 0);\n\t\tvar out = [], argc = 0, R = \"\", C = \"\", argL = \"\", argR = \"\";\n\t\twhile(blob.l < blob.length) {\n\t\t\tvar cc = blob[blob.l++];\n\t\t\tswitch(cc) {\n\t\t\t\tcase 0x00: out.push(blob.read_shift(8, 'f')); break;\n\t\t\t\tcase 0x01: {\n\t\t\t\t\tC = wk1_parse_rc(o[0].c, blob.read_shift(2), true);\n\t\t\t\t\tR = wk1_parse_rc(o[0].r, blob.read_shift(2), false);\n\t\t\t\t\tout.push(C + R);\n\t\t\t\t} break;\n\t\t\t\tcase 0x02: {\n\t\t\t\t\tvar c = wk1_parse_rc(o[0].c, blob.read_shift(2), true);\n\t\t\t\t\tvar r = wk1_parse_rc(o[0].r, blob.read_shift(2), false);\n\t\t\t\t\tC = wk1_parse_rc(o[0].c, blob.read_shift(2), true);\n\t\t\t\t\tR = wk1_parse_rc(o[0].r, blob.read_shift(2), false);\n\t\t\t\t\tout.push(c + r + \":\" + C + R);\n\t\t\t\t} break;\n\t\t\t\tcase 0x03:\n\t\t\t\t\tif(blob.l < blob.length) { console.error(\"WK1 premature formula end\"); return; }\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x04: out.push(\"(\" + out.pop() + \")\"); break;\n\t\t\t\tcase 0x05: out.push(blob.read_shift(2)); break;\n\t\t\t\tcase 0x06: {\n\t\t\t\t\t/* TODO: text encoding */\n\t\t\t\t\tvar Z = \"\"; while((cc = blob[blob.l++])) Z += String.fromCharCode(cc);\n\t\t\t\t\tout.push('\"' + Z.replace(/\"/g, '\"\"') + '\"'); break;\n\t\t\t\t} break;\n\n\t\t\t\tcase 0x08: out.push(\"-\" + out.pop()); break;\n\t\t\t\tcase 0x17: out.push(\"+\" + out.pop()); break;\n\t\t\t\tcase 0x16: out.push(\"NOT(\" + out.pop() + \")\"); break;\n\n\t\t\t\tcase 0x14: case 0x15: {\n\t\t\t\t\targR = out.pop(); argL = out.pop();\n\t\t\t\t\tout.push([\"AND\", \"OR\"][cc - 0x14] + \"(\" + argL + \",\" + argR + \")\");\n\t\t\t\t} break;\n\n\t\t\t\tdefault:\n\t\t\t\t\tif(cc < 0x20 && BinOpTab[cc]) {\n\t\t\t\t\t\targR = out.pop(); argL = out.pop();\n\t\t\t\t\t\tout.push(argL + BinOpTab[cc] + argR);\n\t\t\t\t\t} else if(FuncTab[cc]) {\n\t\t\t\t\t\targc = FuncTab[cc][1];\n\t\t\t\t\t\tif(argc == 69) argc = blob[blob.l++];\n\t\t\t\t\t\tif(argc > out.length) { console.error(\"WK1 bad formula parse 0x\" + cc.toString(16) + \":|\" + out.join(\"|\") + \"|\"); return; }\n\t\t\t\t\t\tvar args = out.slice(-argc);\n\t\t\t\t\t\tout.length -= argc;\n\t\t\t\t\t\tout.push(FuncTab[cc][0] + \"(\" + args.join(\",\") + \")\");\n\t\t\t\t\t}\n\t\t\t\t\telse if(cc <= 0x07) return console.error(\"WK1 invalid opcode \" + cc.toString(16));\n\t\t\t\t\telse if(cc <= 0x18) return console.error(\"WK1 unsupported op \" + cc.toString(16));\n\t\t\t\t\telse if(cc <= 0x1E) return console.error(\"WK1 invalid opcode \" + cc.toString(16));\n\t\t\t\t\telse if(cc <= 0x73) return console.error(\"WK1 unsupported function opcode \" + cc.toString(16));\n\t\t\t\t\t// possible future functions ??\n\t\t\t\t\telse return console.error(\"WK1 unrecognized opcode \" + cc.toString(16));\n\t\t\t}\n\t\t}\n\t\tif(out.length == 1) o[1].f = \"\" + out[0];\n\t\telse console.error(\"WK1 bad formula parse |\" + out.join(\"|\") + \"|\");\n\t}\n\n\n\tfunction parse_cell_3(blob) {\n\t\tvar o = [{c:0,r:0}, {t:'n',v:0}, 0];\n\t\to[0].r = blob.read_shift(2); o[3] = blob[blob.l++]; o[0].c = blob[blob.l++];\n\t\treturn o;\n\t}\n\n\tfunction parse_LABEL_16(blob, length) {\n\t\tvar o = parse_cell_3(blob, length);\n\t\to[1].t = 's';\n\t\to[1].v = blob.read_shift(length - 4, 'cstr');\n\t\treturn o;\n\t}\n\tfunction write_LABEL_16(R, C, wsidx, s) {\n\t\t/* TODO: encoding */\n\t\tvar o = new_buf(6 + s.length);\n\t\to.write_shift(2, R);\n\t\to.write_shift(1, wsidx);\n\t\to.write_shift(1, C);\n\t\to.write_shift(1, 0x27);\n\t\tfor(var i = 0; i < s.length; ++i) {\n\t\t\tvar cc = s.charCodeAt(i);\n\t\t\to.write_shift(1, cc >= 0x80 ? 0x5F : cc);\n\t\t}\n\t\to.write_shift(1, 0);\n\t\treturn o;\n\t}\n\n\tfunction parse_NUMBER_18(blob, length) {\n\t\tvar o = parse_cell_3(blob, length);\n\t\to[1].v = blob.read_shift(2);\n\t\tvar v = o[1].v >> 1;\n\t\tif(o[1].v & 0x1) {\n\t\t\tswitch(v & 0x07) {\n\t\t\t\tcase 0: v = (v >> 3) * 5000; break;\n\t\t\t\tcase 1: v = (v >> 3) * 500; break;\n\t\t\t\tcase 2: v = (v >> 3) / 20; break;\n\t\t\t\tcase 3: v = (v >> 3) / 200; break;\n\t\t\t\tcase 4: v = (v >> 3) / 2000; break;\n\t\t\t\tcase 5: v = (v >> 3) / 20000; break;\n\t\t\t\tcase 6: v = (v >> 3) / 16; break;\n\t\t\t\tcase 7: v = (v >> 3) / 64; break;\n\t\t\t}\n\t\t}\n\t\to[1].v = v;\n\t\treturn o;\n\t}\n\n\tfunction parse_NUMBER_17(blob, length) {\n\t\tvar o = parse_cell_3(blob, length);\n\t\tvar v1 = blob.read_shift(4);\n\t\tvar v2 = blob.read_shift(4);\n\t\tvar e = blob.read_shift(2);\n\t\tif(e == 0xFFFF) {\n\t\t\tif(v1 === 0 && v2 === 0xC0000000) { o[1].t = \"e\"; o[1].v = 0x0F; } // ERR -> #VALUE!\n\t\t\telse if(v1 === 0 && v2 === 0xD0000000) { o[1].t = \"e\"; o[1].v = 0x2A; } // NA -> #N/A\n\t\t\telse o[1].v = 0;\n\t\t\treturn o;\n\t\t}\n\t\tvar s = e & 0x8000; e = (e&0x7FFF) - 16446;\n\t\to[1].v = (1 - s*2) * (v2 * Math.pow(2, e+32) + v1 * Math.pow(2, e));\n\t\treturn o;\n\t}\n\tfunction write_NUMBER_17(R, C, wsidx, v) {\n\t\tvar o = new_buf(14);\n\t\to.write_shift(2, R);\n\t\to.write_shift(1, wsidx);\n\t\to.write_shift(1, C);\n\t\tif(v == 0) {\n\t\t\to.write_shift(4, 0);\n\t\t\to.write_shift(4, 0);\n\t\t\to.write_shift(2, 0xFFFF);\n\t\t\treturn o;\n\t\t}\n\t\tvar s = 0, e = 0, v1 = 0, v2 = 0;\n\t\tif(v < 0) { s = 1; v = -v; }\n\t\te = Math.log2(v) | 0;\n\t\tv /= Math.pow(2, e-31);\n\t\tv2 = (v)>>>0;\n\t\tif((v2&0x80000000) == 0) { v/=2; ++e; v2 = v >>> 0; }\n\t\tv -= v2;\n\t\tv2 |= 0x80000000;\n\t\tv2 >>>= 0;\n\t\tv *= Math.pow(2, 32);\n\t\tv1 = v>>>0;\n\t\to.write_shift(4, v1);\n\t\to.write_shift(4, v2);\n\t\te += 0x3FFF + (s ? 0x8000 : 0);\n\t\to.write_shift(2, e);\n\t\treturn o;\n\t}\n\n\tfunction parse_FORMULA_19(blob, length) {\n\t\tvar o = parse_NUMBER_17(blob, 14);\n\t\tblob.l += length - 14; /* TODO: WK3 formula */\n\t\treturn o;\n\t}\n\n\tfunction parse_NUMBER_25(blob, length) {\n\t\tvar o = parse_cell_3(blob, length);\n\t\tvar v1 = blob.read_shift(4);\n\t\to[1].v = v1 >> 6;\n\t\treturn o;\n\t}\n\n\tfunction parse_NUMBER_27(blob, length) {\n\t\tvar o = parse_cell_3(blob, length);\n\t\tvar v1 = blob.read_shift(8,'f');\n\t\to[1].v = v1;\n\t\treturn o;\n\t}\n\n\tfunction parse_FORMULA_28(blob, length) {\n\t\tvar o = parse_NUMBER_27(blob, 14);\n\t\tblob.l += length - 10; /* TODO: formula */\n\t\treturn o;\n\t}\n\n\tfunction parse_SHEETNAMECS(blob, length) {\n\t\treturn blob[blob.l + length - 1] == 0 ? blob.read_shift(length, 'cstr') : \"\";\n\t}\n\n\tfunction parse_SHEETNAMELP(blob, length) {\n\t\tvar len = blob[blob.l++];\n\t\tif(len > length - 1) len = length - 1;\n\t\tvar o = \"\"; while(o.length < len) o += String.fromCharCode(blob[blob.l++]);\n\t\treturn o;\n\t}\n\n\tfunction parse_SHEETINFOQP(blob, length, opts) {\n\t\tif(!opts.qpro || length < 21) return;\n\t\tvar id = blob.read_shift(1);\n\t\tblob.l += 17;\n\t\tvar len = blob.read_shift(1);\n\t\tblob.l += 2;\n\t\tvar nm = blob.read_shift(length - 21, 'cstr');\n\t\treturn [id, nm];\n\t}\n\n\tfunction parse_XFORMAT(blob, length) {\n\t\tvar o = {}, tgt = blob.l + length;\n\t\twhile(blob.l < tgt) {\n\t\t\tvar dt = blob.read_shift(2);\n\t\t\tif(dt == 0x36b0) {\n\t\t\t\to[dt] = [0, \"\"];\n\t\t\t\to[dt][0] = blob.read_shift(2);\n\t\t\t\twhile(blob[blob.l]) { o[dt][1] += String.fromCharCode(blob[blob.l]); blob.l++; } blob.l++;\n\t\t\t}\n\t\t\t// TODO: 0x3a99 ??\n\t\t}\n\t\treturn o;\n\t}\n\tfunction write_XFORMAT_SHEETNAME(name, wsidx) {\n\t\tvar out = new_buf(5 + name.length);\n\t\tout.write_shift(2, 0x36b0);\n\t\tout.write_shift(2, wsidx);\n\t\tfor(var i = 0; i < name.length; ++i) {\n\t\t\tvar cc = name.charCodeAt(i);\n\t\t\tout[out.l++] = cc > 0x7F ? 0x5F : cc;\n\t\t}\n\t\tout[out.l++] = 0;\n\t\treturn out;\n\t}\n\n\tvar WK1Enum = {\n0x0000: { n:\"BOF\", f:parseuint16 },\n0x0001: { n:\"EOF\" },\n0x0002: { n:\"CALCMODE\" },\n0x0003: { n:\"CALCORDER\" },\n0x0004: { n:\"SPLIT\" },\n0x0005: { n:\"SYNC\" },\n0x0006: { n:\"RANGE\", f:parse_RANGE },\n0x0007: { n:\"WINDOW1\" },\n0x0008: { n:\"COLW1\" },\n0x0009: { n:\"WINTWO\" },\n0x000A: { n:\"COLW2\" },\n0x000B: { n:\"NAME\" },\n0x000C: { n:\"BLANK\" },\n0x000D: { n:\"INTEGER\", f:parse_INTEGER },\n0x000E: { n:\"NUMBER\", f:parse_NUMBER },\n0x000F: { n:\"LABEL\", f:parse_LABEL },\n0x0010: { n:\"FORMULA\", f:parse_FORMULA },\n0x0018: { n:\"TABLE\" },\n0x0019: { n:\"ORANGE\" },\n0x001A: { n:\"PRANGE\" },\n0x001B: { n:\"SRANGE\" },\n0x001C: { n:\"FRANGE\" },\n0x001D: { n:\"KRANGE1\" },\n0x0020: { n:\"HRANGE\" },\n0x0023: { n:\"KRANGE2\" },\n0x0024: { n:\"PROTEC\" },\n0x0025: { n:\"FOOTER\" },\n0x0026: { n:\"HEADER\" },\n0x0027: { n:\"SETUP\" },\n0x0028: { n:\"MARGINS\" },\n0x0029: { n:\"LABELFMT\" },\n0x002A: { n:\"TITLES\" },\n0x002B: { n:\"SHEETJS\" },\n0x002D: { n:\"GRAPH\" },\n0x002E: { n:\"NGRAPH\" },\n0x002F: { n:\"CALCCOUNT\" },\n0x0030: { n:\"UNFORMATTED\" },\n0x0031: { n:\"CURSORW12\" },\n0x0032: { n:\"WINDOW\" },\n0x0033: { n:\"STRING\", f:parse_LABEL },\n0x0037: { n:\"PASSWORD\" },\n0x0038: { n:\"LOCKED\" },\n0x003C: { n:\"QUERY\" },\n0x003D: { n:\"QUERYNAME\" },\n0x003E: { n:\"PRINT\" },\n0x003F: { n:\"PRINTNAME\" },\n0x0040: { n:\"GRAPH2\" },\n0x0041: { n:\"GRAPHNAME\" },\n0x0042: { n:\"ZOOM\" },\n0x0043: { n:\"SYMSPLIT\" },\n0x0044: { n:\"NSROWS\" },\n0x0045: { n:\"NSCOLS\" },\n0x0046: { n:\"RULER\" },\n0x0047: { n:\"NNAME\" },\n0x0048: { n:\"ACOMM\" },\n0x0049: { n:\"AMACRO\" },\n0x004A: { n:\"PARSE\" },\n0x0066: { n:\"PRANGES??\" },\n0x0067: { n:\"RRANGES??\" },\n0x0068: { n:\"FNAME??\" },\n0x0069: { n:\"MRANGES??\" },\n0x00CC: { n:\"SHEETNAMECS\", f:parse_SHEETNAMECS },\n0x00DE: { n:\"SHEETNAMELP\", f:parse_SHEETNAMELP },\n0xFFFF: { n:\"\" }\n\t};\n\n\tvar WK3Enum = {\n0x0000: { n:\"BOF\" },\n0x0001: { n:\"EOF\" },\n0x0002: { n:\"PASSWORD\" },\n0x0003: { n:\"CALCSET\" },\n0x0004: { n:\"WINDOWSET\" },\n0x0005: { n:\"SHEETCELLPTR\" },\n0x0006: { n:\"SHEETLAYOUT\" },\n0x0007: { n:\"COLUMNWIDTH\" },\n0x0008: { n:\"HIDDENCOLUMN\" },\n0x0009: { n:\"USERRANGE\" },\n0x000A: { n:\"SYSTEMRANGE\" },\n0x000B: { n:\"ZEROFORCE\" },\n0x000C: { n:\"SORTKEYDIR\" },\n0x000D: { n:\"FILESEAL\" },\n0x000E: { n:\"DATAFILLNUMS\" },\n0x000F: { n:\"PRINTMAIN\" },\n0x0010: { n:\"PRINTSTRING\" },\n0x0011: { n:\"GRAPHMAIN\" },\n0x0012: { n:\"GRAPHSTRING\" },\n0x0013: { n:\"??\" },\n0x0014: { n:\"ERRCELL\" },\n0x0015: { n:\"NACELL\" },\n0x0016: { n:\"LABEL16\", f:parse_LABEL_16},\n0x0017: { n:\"NUMBER17\", f:parse_NUMBER_17 },\n0x0018: { n:\"NUMBER18\", f:parse_NUMBER_18 },\n0x0019: { n:\"FORMULA19\", f:parse_FORMULA_19},\n0x001A: { n:\"FORMULA1A\" },\n0x001B: { n:\"XFORMAT\", f:parse_XFORMAT },\n0x001C: { n:\"DTLABELMISC\" },\n0x001D: { n:\"DTLABELCELL\" },\n0x001E: { n:\"GRAPHWINDOW\" },\n0x001F: { n:\"CPA\" },\n0x0020: { n:\"LPLAUTO\" },\n0x0021: { n:\"QUERY\" },\n0x0022: { n:\"HIDDENSHEET\" },\n0x0023: { n:\"??\" },\n0x0025: { n:\"NUMBER25\", f:parse_NUMBER_25 },\n0x0026: { n:\"??\" },\n0x0027: { n:\"NUMBER27\", f:parse_NUMBER_27 },\n0x0028: { n:\"FORMULA28\", f:parse_FORMULA_28 },\n0x008E: { n:\"??\" },\n0x0093: { n:\"??\" },\n0x0096: { n:\"??\" },\n0x0097: { n:\"??\" },\n0x0098: { n:\"??\" },\n0x0099: { n:\"??\" },\n0x009A: { n:\"??\" },\n0x009B: { n:\"??\" },\n0x009C: { n:\"??\" },\n0x00A3: { n:\"??\" },\n0x00AE: { n:\"??\" },\n0x00AF: { n:\"??\" },\n0x00B0: { n:\"??\" },\n0x00B1: { n:\"??\" },\n0x00B8: { n:\"??\" },\n0x00B9: { n:\"??\" },\n0x00BA: { n:\"??\" },\n0x00BB: { n:\"??\" },\n0x00BC: { n:\"??\" },\n0x00C3: { n:\"??\" },\n0x00C9: { n:\"??\" },\n0x00CC: { n:\"SHEETNAMECS\", f:parse_SHEETNAMECS },\n0x00CD: { n:\"??\" },\n0x00CE: { n:\"??\" },\n0x00CF: { n:\"??\" },\n0x00D0: { n:\"??\" },\n0x0100: { n:\"??\" },\n0x0103: { n:\"??\" },\n0x0104: { n:\"??\" },\n0x0105: { n:\"??\" },\n0x0106: { n:\"??\" },\n0x0107: { n:\"??\" },\n0x0109: { n:\"??\" },\n0x010A: { n:\"??\" },\n0x010B: { n:\"??\" },\n0x010C: { n:\"??\" },\n0x010E: { n:\"??\" },\n0x010F: { n:\"??\" },\n0x0180: { n:\"??\" },\n0x0185: { n:\"??\" },\n0x0186: { n:\"??\" },\n0x0189: { n:\"??\" },\n0x018C: { n:\"??\" },\n0x0200: { n:\"??\" },\n0x0202: { n:\"??\" },\n0x0201: { n:\"??\" },\n0x0204: { n:\"??\" },\n0x0205: { n:\"??\" },\n0x0280: { n:\"??\" },\n0x0281: { n:\"??\" },\n0x0282: { n:\"??\" },\n0x0283: { n:\"??\" },\n0x0284: { n:\"??\" },\n0x0285: { n:\"??\" },\n0x0286: { n:\"??\" },\n0x0287: { n:\"??\" },\n0x0288: { n:\"??\" },\n0x0292: { n:\"??\" },\n0x0293: { n:\"??\" },\n0x0294: { n:\"??\" },\n0x0295: { n:\"??\" },\n0x0296: { n:\"??\" },\n0x0299: { n:\"??\" },\n0x029A: { n:\"??\" },\n0x0300: { n:\"??\" },\n0x0304: { n:\"??\" },\n0x0601: { n:\"SHEETINFOQP\", f:parse_SHEETINFOQP },\n0x0640: { n:\"??\" },\n0x0642: { n:\"??\" },\n0x0701: { n:\"??\" },\n0x0702: { n:\"??\" },\n0x0703: { n:\"??\" },\n0x0704: { n:\"??\" },\n0x0780: { n:\"??\" },\n0x0800: { n:\"??\" },\n0x0801: { n:\"??\" },\n0x0804: { n:\"??\" },\n0x0A80: { n:\"??\" },\n0x2AF6: { n:\"??\" },\n0x3231: { n:\"??\" },\n0x6E49: { n:\"??\" },\n0x6F44: { n:\"??\" },\n0xFFFF: { n:\"\" }\n\t};\n\treturn {\n\t\tsheet_to_wk1: sheet_to_wk1,\n\t\tbook_to_wk3: book_to_wk3,\n\t\tto_workbook: lotus_to_workbook\n\t};\n})();\n/* 18.4.7 rPr CT_RPrElt */\nfunction parse_rpr(rpr) {\n\tvar font = {}, m = rpr.match(tagregex), i = 0;\n\tvar pass = false;\n\tif(m) for(;i!=m.length; ++i) {\n\t\tvar y = parsexmltag(m[i]);\n\t\tswitch(y[0].replace(/\\w*:/g,\"\")) {\n\t\t\t/* 18.8.12 condense CT_BooleanProperty */\n\t\t\t/* ** not required . */\n\t\t\tcase '':\n\t\t\tcase '': font.shadow = 1; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.4.1 charset CT_IntProperty TODO */\n\t\t\tcase '':\n\t\t\tcase '': font.outline = 1; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.4.5 rFont CT_FontName */\n\t\t\tcase '':\n\t\t\tcase '': font.strike = 1; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.4.13 u CT_UnderlineProperty */\n\t\t\tcase '':\n\t\t\tcase '': font.u = 1; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.2 b */\n\t\t\tcase '':\n\t\t\tcase '': font.b = 1; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.26 i */\n\t\t\tcase '':\n\t\t\tcase '': font.i = 1; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.3.1.15 color CT_Color TODO: tint, theme, auto, indexed */\n\t\t\tcase '': case '
': break;\n\t\t\tcase '': pass = false; break;\n\t\t\tdefault:\n\t\t\t\tif(y[0].charCodeAt(1) !== 47 && !pass) throw new Error('Unrecognized rich format ' + y[0]);\n\t\t}\n\t}\n\treturn font;\n}\n\nvar parse_rs = (function() {\n\tvar tregex = matchtag(\"t\"), rpregex = matchtag(\"rPr\");\n\t/* 18.4.4 r CT_RElt */\n\tfunction parse_r(r) {\n\t\t/* 18.4.12 t ST_Xstring */\n\t\tvar t = r.match(tregex)/*, cp = 65001*/;\n\t\tif(!t) return {t:\"s\", v:\"\"};\n\n\t\tvar o = ({t:'s', v:unescapexml(t[1])});\n\t\tvar rpr = r.match(rpregex);\n\t\tif(rpr) o.s = parse_rpr(rpr[1]);\n\t\treturn o;\n\t}\n\tvar rregex = /<(?:\\w+:)?r>/g, rend = /<\\/(?:\\w+:)?r>/;\n\treturn function parse_rs(rs) {\n\t\treturn rs.replace(rregex,\"\").split(rend).map(parse_r).filter(function(r) { return r.v; });\n\t};\n})();\n\n\n/* Parse a list of tags */\nvar rs_to_html = (function parse_rs_factory() {\n\tvar nlregex = /(\\r\\n|\\n)/g;\n\tfunction parse_rpr2(font, intro, outro) {\n\t\tvar style = [];\n\n\t\tif(font.u) style.push(\"text-decoration: underline;\");\n\t\tif(font.uval) style.push(\"text-underline-style:\" + font.uval + \";\");\n\t\tif(font.sz) style.push(\"font-size:\" + font.sz + \"pt;\");\n\t\tif(font.outline) style.push(\"text-effect: outline;\");\n\t\tif(font.shadow) style.push(\"text-shadow: auto;\");\n\t\tintro.push('');\n\n\t\tif(font.b) { intro.push(\"\"); outro.push(\"\"); }\n\t\tif(font.i) { intro.push(\"\"); outro.push(\"\"); }\n\t\tif(font.strike) { intro.push(\"\"); outro.push(\"\"); }\n\n\t\tvar align = font.valign || \"\";\n\t\tif(align == \"superscript\" || align == \"super\") align = \"sup\";\n\t\telse if(align == \"subscript\") align = \"sub\";\n\t\tif(align != \"\") { intro.push(\"<\" + align + \">\"); outro.push(\"\"); }\n\n\t\toutro.push(\"\");\n\t\treturn font;\n\t}\n\n\t/* 18.4.4 r CT_RElt */\n\tfunction r_to_html(r) {\n\t\tvar terms = [[],r.v,[]];\n\t\tif(!r.v) return \"\";\n\n\t\tif(r.s) parse_rpr2(r.s, terms[0], terms[2]);\n\n\t\treturn terms[0].join(\"\") + terms[1].replace(nlregex,'
') + terms[2].join(\"\");\n\t}\n\n\treturn function parse_rs(rs) {\n\t\treturn rs.map(r_to_html).join(\"\");\n\t};\n})();\n\n/* 18.4.8 si CT_Rst */\nvar sitregex = /<(?:\\w+:)?t[^>]*>([^<]*)<\\/(?:\\w+:)?t>/g, sirregex = /<(?:\\w+:)?r>/;\nvar sirphregex = /<(?:\\w+:)?rPh.*?>([\\s\\S]*?)<\\/(?:\\w+:)?rPh>/g;\nfunction parse_si(x, opts) {\n\tvar html = opts ? opts.cellHTML : true;\n\tvar z = {};\n\tif(!x) return { t: \"\" };\n\t//var y;\n\t/* 18.4.12 t ST_Xstring (Plaintext String) */\n\t// TODO: is whitespace actually valid here?\n\tif(x.match(/^\\s*<(?:\\w+:)?t[^>]*>/)) {\n\t\tz.t = unescapexml(utf8read(x.slice(x.indexOf(\">\")+1).split(/<\\/(?:\\w+:)?t>/)[0]||\"\"));\n\t\tz.r = utf8read(x);\n\t\tif(html) z.h = escapehtml(z.t);\n\t}\n\t/* 18.4.4 r CT_RElt (Rich Text Run) */\n\telse if((/*y = */x.match(sirregex))) {\n\t\tz.r = utf8read(x);\n\t\tz.t = unescapexml(utf8read((x.replace(sirphregex, '').match(sitregex)||[]).join(\"\").replace(tagregex,\"\")));\n\t\tif(html) z.h = rs_to_html(parse_rs(z.r));\n\t}\n\t/* 18.4.3 phoneticPr CT_PhoneticPr (TODO: needed for Asian support) */\n\t/* 18.4.6 rPh CT_PhoneticRun (TODO: needed for Asian support) */\n\treturn z;\n}\n\n/* 18.4 Shared String Table */\nvar sstr0 = /<(?:\\w+:)?sst([^>]*)>([\\s\\S]*)<\\/(?:\\w+:)?sst>/;\nvar sstr1 = /<(?:\\w+:)?(?:si|sstItem)>/g;\nvar sstr2 = /<\\/(?:\\w+:)?(?:si|sstItem)>/;\nfunction parse_sst_xml(data, opts) {\n\tvar s = ([]), ss = \"\";\n\tif(!data) return s;\n\t/* 18.4.9 sst CT_Sst */\n\tvar sst = data.match(sstr0);\n\tif(sst) {\n\t\tss = sst[2].replace(sstr1,\"\").split(sstr2);\n\t\tfor(var i = 0; i != ss.length; ++i) {\n\t\t\tvar o = parse_si(ss[i].trim(), opts);\n\t\t\tif(o != null) s[s.length] = o;\n\t\t}\n\t\tsst = parsexmltag(sst[1]); s.Count = sst.count; s.Unique = sst.uniqueCount;\n\t}\n\treturn s;\n}\n\nRELS.SST = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\";\nvar straywsregex = /^\\s|\\s$|[\\t\\n\\r]/;\nfunction write_sst_xml(sst, opts) {\n\tif(!opts.bookSST) return \"\";\n\tvar o = [XML_HEADER];\n\to[o.length] = (writextag('sst', null, {\n\t\txmlns: XMLNS.main[0],\n\t\tcount: sst.Count,\n\t\tuniqueCount: sst.Unique\n\t}));\n\tfor(var i = 0; i != sst.length; ++i) { if(sst[i] == null) continue;\n\t\tvar s = sst[i];\n\t\tvar sitag = \"\";\n\t\tif(s.r) sitag += s.r;\n\t\telse {\n\t\t\tsitag += \"\" + escapexml(s.t) + \"
\";\n\t\t}\n\t\tsitag += \"\";\n\t\to[o.length] = (sitag);\n\t}\n\tif(o.length>2){ o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* [MS-XLSB] 2.4.221 BrtBeginSst */\nfunction parse_BrtBeginSst(data) {\n\treturn [data.read_shift(4), data.read_shift(4)];\n}\n\n/* [MS-XLSB] 2.1.7.45 Shared Strings */\nfunction parse_sst_bin(data, opts) {\n\tvar s = ([]);\n\tvar pass = false;\n\trecordhopper(data, function hopper_sst(val, R_n, RT) {\n\t\tswitch(RT) {\n\t\t\tcase 0x009F: /* 'BrtBeginSst' */\n\t\t\t\ts.Count = val[0]; s.Unique = val[1]; break;\n\t\t\tcase 0x0013: /* 'BrtSSTItem' */\n\t\t\t\ts.push(val); break;\n\t\t\tcase 0x00A0: /* 'BrtEndSst' */\n\t\t\t\treturn true;\n\n\t\t\tcase 0x0023: /* 'BrtFRTBegin' */\n\t\t\t\tpass = true; break;\n\t\t\tcase 0x0024: /* 'BrtFRTEnd' */\n\t\t\t\tpass = false; break;\n\n\t\t\tdefault:\n\t\t\t\tif(R_n.indexOf(\"Begin\") > 0){/* empty */}\n\t\t\t\telse if(R_n.indexOf(\"End\") > 0){/* empty */}\n\t\t\t\tif(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R_n);\n\t\t}\n\t});\n\treturn s;\n}\n\nfunction write_BrtBeginSst(sst, o) {\n\tif(!o) o = new_buf(8);\n\to.write_shift(4, sst.Count);\n\to.write_shift(4, sst.Unique);\n\treturn o;\n}\n\nvar write_BrtSSTItem = write_RichStr;\n\nfunction write_sst_bin(sst) {\n\tvar ba = buf_array();\n\twrite_record(ba, \"BrtBeginSst\", write_BrtBeginSst(sst));\n\tfor(var i = 0; i < sst.length; ++i) write_record(ba, \"BrtSSTItem\", write_BrtSSTItem(sst[i]));\n\t/* FRTSST */\n\twrite_record(ba, \"BrtEndSst\");\n\treturn ba.end();\n}\nfunction _JS2ANSI(str) {\n\tif(typeof cptable !== 'undefined') return cptable.utils.encode(current_ansi, str);\n\tvar o = [], oo = str.split(\"\");\n\tfor(var i = 0; i < oo.length; ++i) o[i] = oo[i].charCodeAt(0);\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.1.4 Version */\nfunction parse_CRYPTOVersion(blob, length) {\n\tvar o = {};\n\to.Major = blob.read_shift(2);\n\to.Minor = blob.read_shift(2);\nif(length >= 4) blob.l += length - 4;\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.1.5 DataSpaceVersionInfo */\nfunction parse_DataSpaceVersionInfo(blob) {\n\tvar o = {};\n\to.id = blob.read_shift(0, 'lpp4');\n\to.R = parse_CRYPTOVersion(blob, 4);\n\to.U = parse_CRYPTOVersion(blob, 4);\n\to.W = parse_CRYPTOVersion(blob, 4);\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.1.6.1 DataSpaceMapEntry Structure */\nfunction parse_DataSpaceMapEntry(blob) {\n\tvar len = blob.read_shift(4);\n\tvar end = blob.l + len - 4;\n\tvar o = {};\n\tvar cnt = blob.read_shift(4);\n\tvar comps = [];\n\t/* [MS-OFFCRYPTO] 2.1.6.2 DataSpaceReferenceComponent Structure */\n\twhile(cnt-- > 0) comps.push({ t: blob.read_shift(4), v: blob.read_shift(0, 'lpp4') });\n\to.name = blob.read_shift(0, 'lpp4');\n\to.comps = comps;\n\tif(blob.l != end) throw new Error(\"Bad DataSpaceMapEntry: \" + blob.l + \" != \" + end);\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.1.6 DataSpaceMap */\nfunction parse_DataSpaceMap(blob) {\n\tvar o = [];\n\tblob.l += 4; // must be 0x8\n\tvar cnt = blob.read_shift(4);\n\twhile(cnt-- > 0) o.push(parse_DataSpaceMapEntry(blob));\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.1.7 DataSpaceDefinition */\nfunction parse_DataSpaceDefinition(blob) {\n\tvar o = [];\n\tblob.l += 4; // must be 0x8\n\tvar cnt = blob.read_shift(4);\n\twhile(cnt-- > 0) o.push(blob.read_shift(0, 'lpp4'));\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.1.8 DataSpaceDefinition */\nfunction parse_TransformInfoHeader(blob) {\n\tvar o = {};\n\t/*var len = */blob.read_shift(4);\n\tblob.l += 4; // must be 0x1\n\to.id = blob.read_shift(0, 'lpp4');\n\to.name = blob.read_shift(0, 'lpp4');\n\to.R = parse_CRYPTOVersion(blob, 4);\n\to.U = parse_CRYPTOVersion(blob, 4);\n\to.W = parse_CRYPTOVersion(blob, 4);\n\treturn o;\n}\n\nfunction parse_Primary(blob) {\n\t/* [MS-OFFCRYPTO] 2.2.6 IRMDSTransformInfo */\n\tvar hdr = parse_TransformInfoHeader(blob);\n\t/* [MS-OFFCRYPTO] 2.1.9 EncryptionTransformInfo */\n\thdr.ename = blob.read_shift(0, '8lpp4');\n\thdr.blksz = blob.read_shift(4);\n\thdr.cmode = blob.read_shift(4);\n\tif(blob.read_shift(4) != 0x04) throw new Error(\"Bad !Primary record\");\n\treturn hdr;\n}\n\n/* [MS-OFFCRYPTO] 2.3.2 Encryption Header */\nfunction parse_EncryptionHeader(blob, length) {\n\tvar tgt = blob.l + length;\n\tvar o = {};\n\to.Flags = (blob.read_shift(4) & 0x3F);\n\tblob.l += 4;\n\to.AlgID = blob.read_shift(4);\n\tvar valid = false;\n\tswitch(o.AlgID) {\n\t\tcase 0x660E: case 0x660F: case 0x6610: valid = (o.Flags == 0x24); break;\n\t\tcase 0x6801: valid = (o.Flags == 0x04); break;\n\t\tcase 0: valid = (o.Flags == 0x10 || o.Flags == 0x04 || o.Flags == 0x24); break;\n\t\tdefault: throw 'Unrecognized encryption algorithm: ' + o.AlgID;\n\t}\n\tif(!valid) throw new Error(\"Encryption Flags/AlgID mismatch\");\n\to.AlgIDHash = blob.read_shift(4);\n\to.KeySize = blob.read_shift(4);\n\to.ProviderType = blob.read_shift(4);\n\tblob.l += 8;\n\to.CSPName = blob.read_shift((tgt-blob.l)>>1, 'utf16le');\n\tblob.l = tgt;\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.3.3 Encryption Verifier */\nfunction parse_EncryptionVerifier(blob, length) {\n\tvar o = {}, tgt = blob.l + length;\n\tblob.l += 4; // SaltSize must be 0x10\n\to.Salt = blob.slice(blob.l, blob.l+16); blob.l += 16;\n\to.Verifier = blob.slice(blob.l, blob.l+16); blob.l += 16;\n\t/*var sz = */blob.read_shift(4);\n\to.VerifierHash = blob.slice(blob.l, tgt); blob.l = tgt;\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.3.4.* EncryptionInfo Stream */\nfunction parse_EncryptionInfo(blob) {\n\tvar vers = parse_CRYPTOVersion(blob);\n\tswitch(vers.Minor) {\n\t\tcase 0x02: return [vers.Minor, parse_EncInfoStd(blob, vers)];\n\t\tcase 0x03: return [vers.Minor, parse_EncInfoExt(blob, vers)];\n\t\tcase 0x04: return [vers.Minor, parse_EncInfoAgl(blob, vers)];\n\t}\n\tthrow new Error(\"ECMA-376 Encrypted file unrecognized Version: \" + vers.Minor);\n}\n\n/* [MS-OFFCRYPTO] 2.3.4.5 EncryptionInfo Stream (Standard Encryption) */\nfunction parse_EncInfoStd(blob) {\n\tvar flags = blob.read_shift(4);\n\tif((flags & 0x3F) != 0x24) throw new Error(\"EncryptionInfo mismatch\");\n\tvar sz = blob.read_shift(4);\n\t//var tgt = blob.l + sz;\n\tvar hdr = parse_EncryptionHeader(blob, sz);\n\tvar verifier = parse_EncryptionVerifier(blob, blob.length - blob.l);\n\treturn { t:\"Std\", h:hdr, v:verifier };\n}\n/* [MS-OFFCRYPTO] 2.3.4.6 EncryptionInfo Stream (Extensible Encryption) */\nfunction parse_EncInfoExt() { throw new Error(\"File is password-protected: ECMA-376 Extensible\"); }\n/* [MS-OFFCRYPTO] 2.3.4.10 EncryptionInfo Stream (Agile Encryption) */\nfunction parse_EncInfoAgl(blob) {\n\tvar KeyData = [\"saltSize\",\"blockSize\",\"keyBits\",\"hashSize\",\"cipherAlgorithm\",\"cipherChaining\",\"hashAlgorithm\",\"saltValue\"];\n\tblob.l+=4;\n\tvar xml = blob.read_shift(blob.length - blob.l, 'utf8');\n\tvar o = {};\n\txml.replace(tagregex, function xml_agile(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': break;\n\t\t\tcase '': case '': break;\n\n\t\t\tcase '': break;\n\t\t\tcase ' 4 || vers.Major < 2) throw new Error('unrecognized major version code: ' + vers.Major);\n\to.Flags = blob.read_shift(4); length -= 4;\n\tvar sz = blob.read_shift(4); length -= 4;\n\to.EncryptionHeader = parse_EncryptionHeader(blob, sz); length -= sz;\n\to.EncryptionVerifier = parse_EncryptionVerifier(blob, length);\n\treturn o;\n}\n/* [MS-OFFCRYPTO] 2.3.6.1 RC4 Encryption Header */\nfunction parse_RC4Header(blob) {\n\tvar o = {};\n\tvar vers = o.EncryptionVersionInfo = parse_CRYPTOVersion(blob, 4);\n\tif(vers.Major != 1 || vers.Minor != 1) throw 'unrecognized version code ' + vers.Major + ' : ' + vers.Minor;\n\to.Salt = blob.read_shift(16);\n\to.EncryptedVerifier = blob.read_shift(16);\n\to.EncryptedVerifierHash = blob.read_shift(16);\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.3.7.1 Binary Document Password Verifier Derivation */\nfunction crypto_CreatePasswordVerifier_Method1(Password) {\n\tvar Verifier = 0x0000, PasswordArray;\n\tvar PasswordDecoded = _JS2ANSI(Password);\n\tvar len = PasswordDecoded.length + 1, i, PasswordByte;\n\tvar Intermediate1, Intermediate2, Intermediate3;\n\tPasswordArray = new_raw_buf(len);\n\tPasswordArray[0] = PasswordDecoded.length;\n\tfor(i = 1; i != len; ++i) PasswordArray[i] = PasswordDecoded[i-1];\n\tfor(i = len-1; i >= 0; --i) {\n\t\tPasswordByte = PasswordArray[i];\n\t\tIntermediate1 = ((Verifier & 0x4000) === 0x0000) ? 0 : 1;\n\t\tIntermediate2 = (Verifier << 1) & 0x7FFF;\n\t\tIntermediate3 = Intermediate1 | Intermediate2;\n\t\tVerifier = Intermediate3 ^ PasswordByte;\n\t}\n\treturn Verifier ^ 0xCE4B;\n}\n\n/* [MS-OFFCRYPTO] 2.3.7.2 Binary Document XOR Array Initialization */\nvar crypto_CreateXorArray_Method1 = (function() {\n\tvar PadArray = [0xBB, 0xFF, 0xFF, 0xBA, 0xFF, 0xFF, 0xB9, 0x80, 0x00, 0xBE, 0x0F, 0x00, 0xBF, 0x0F, 0x00];\n\tvar InitialCode = [0xE1F0, 0x1D0F, 0xCC9C, 0x84C0, 0x110C, 0x0E10, 0xF1CE, 0x313E, 0x1872, 0xE139, 0xD40F, 0x84F9, 0x280C, 0xA96A, 0x4EC3];\n\tvar XorMatrix = [0xAEFC, 0x4DD9, 0x9BB2, 0x2745, 0x4E8A, 0x9D14, 0x2A09, 0x7B61, 0xF6C2, 0xFDA5, 0xEB6B, 0xC6F7, 0x9DCF, 0x2BBF, 0x4563, 0x8AC6, 0x05AD, 0x0B5A, 0x16B4, 0x2D68, 0x5AD0, 0x0375, 0x06EA, 0x0DD4, 0x1BA8, 0x3750, 0x6EA0, 0xDD40, 0xD849, 0xA0B3, 0x5147, 0xA28E, 0x553D, 0xAA7A, 0x44D5, 0x6F45, 0xDE8A, 0xAD35, 0x4A4B, 0x9496, 0x390D, 0x721A, 0xEB23, 0xC667, 0x9CEF, 0x29FF, 0x53FE, 0xA7FC, 0x5FD9, 0x47D3, 0x8FA6, 0x0F6D, 0x1EDA, 0x3DB4, 0x7B68, 0xF6D0, 0xB861, 0x60E3, 0xC1C6, 0x93AD, 0x377B, 0x6EF6, 0xDDEC, 0x45A0, 0x8B40, 0x06A1, 0x0D42, 0x1A84, 0x3508, 0x6A10, 0xAA51, 0x4483, 0x8906, 0x022D, 0x045A, 0x08B4, 0x1168, 0x76B4, 0xED68, 0xCAF1, 0x85C3, 0x1BA7, 0x374E, 0x6E9C, 0x3730, 0x6E60, 0xDCC0, 0xA9A1, 0x4363, 0x86C6, 0x1DAD, 0x3331, 0x6662, 0xCCC4, 0x89A9, 0x0373, 0x06E6, 0x0DCC, 0x1021, 0x2042, 0x4084, 0x8108, 0x1231, 0x2462, 0x48C4];\n\tvar Ror = function(Byte) { return ((Byte/2) | (Byte*128)) & 0xFF; };\n\tvar XorRor = function(byte1, byte2) { return Ror(byte1 ^ byte2); };\n\tvar CreateXorKey_Method1 = function(Password) {\n\t\tvar XorKey = InitialCode[Password.length - 1];\n\t\tvar CurrentElement = 0x68;\n\t\tfor(var i = Password.length-1; i >= 0; --i) {\n\t\t\tvar Char = Password[i];\n\t\t\tfor(var j = 0; j != 7; ++j) {\n\t\t\t\tif(Char & 0x40) XorKey ^= XorMatrix[CurrentElement];\n\t\t\t\tChar *= 2; --CurrentElement;\n\t\t\t}\n\t\t}\n\t\treturn XorKey;\n\t};\n\treturn function(password) {\n\t\tvar Password = _JS2ANSI(password);\n\t\tvar XorKey = CreateXorKey_Method1(Password);\n\t\tvar Index = Password.length;\n\t\tvar ObfuscationArray = new_raw_buf(16);\n\t\tfor(var i = 0; i != 16; ++i) ObfuscationArray[i] = 0x00;\n\t\tvar Temp, PasswordLastChar, PadIndex;\n\t\tif((Index & 1) === 1) {\n\t\t\tTemp = XorKey >> 8;\n\t\t\tObfuscationArray[Index] = XorRor(PadArray[0], Temp);\n\t\t\t--Index;\n\t\t\tTemp = XorKey & 0xFF;\n\t\t\tPasswordLastChar = Password[Password.length - 1];\n\t\t\tObfuscationArray[Index] = XorRor(PasswordLastChar, Temp);\n\t\t}\n\t\twhile(Index > 0) {\n\t\t\t--Index;\n\t\t\tTemp = XorKey >> 8;\n\t\t\tObfuscationArray[Index] = XorRor(Password[Index], Temp);\n\t\t\t--Index;\n\t\t\tTemp = XorKey & 0xFF;\n\t\t\tObfuscationArray[Index] = XorRor(Password[Index], Temp);\n\t\t}\n\t\tIndex = 15;\n\t\tPadIndex = 15 - Password.length;\n\t\twhile(PadIndex > 0) {\n\t\t\tTemp = XorKey >> 8;\n\t\t\tObfuscationArray[Index] = XorRor(PadArray[PadIndex], Temp);\n\t\t\t--Index;\n\t\t\t--PadIndex;\n\t\t\tTemp = XorKey & 0xFF;\n\t\t\tObfuscationArray[Index] = XorRor(Password[Index], Temp);\n\t\t\t--Index;\n\t\t\t--PadIndex;\n\t\t}\n\t\treturn ObfuscationArray;\n\t};\n})();\n\n/* [MS-OFFCRYPTO] 2.3.7.3 Binary Document XOR Data Transformation Method 1 */\nvar crypto_DecryptData_Method1 = function(password, Data, XorArrayIndex, XorArray, O) {\n\t/* If XorArray is set, use it; if O is not set, make changes in-place */\n\tif(!O) O = Data;\n\tif(!XorArray) XorArray = crypto_CreateXorArray_Method1(password);\n\tvar Index, Value;\n\tfor(Index = 0; Index != Data.length; ++Index) {\n\t\tValue = Data[Index];\n\t\tValue ^= XorArray[XorArrayIndex];\n\t\tValue = ((Value>>5) | (Value<<3)) & 0xFF;\n\t\tO[Index] = Value;\n\t\t++XorArrayIndex;\n\t}\n\treturn [O, XorArrayIndex, XorArray];\n};\n\nvar crypto_MakeXorDecryptor = function(password) {\n\tvar XorArrayIndex = 0, XorArray = crypto_CreateXorArray_Method1(password);\n\treturn function(Data) {\n\t\tvar O = crypto_DecryptData_Method1(\"\", Data, XorArrayIndex, XorArray);\n\t\tXorArrayIndex = O[1];\n\t\treturn O[0];\n\t};\n};\n\n/* 2.5.343 */\nfunction parse_XORObfuscation(blob, length, opts, out) {\n\tvar o = ({ key: parseuint16(blob), verificationBytes: parseuint16(blob) });\n\tif(opts.password) o.verifier = crypto_CreatePasswordVerifier_Method1(opts.password);\n\tout.valid = o.verificationBytes === o.verifier;\n\tif(out.valid) out.insitu = crypto_MakeXorDecryptor(opts.password);\n\treturn o;\n}\n\n/* 2.4.117 */\nfunction parse_FilePassHeader(blob, length, oo) {\n\tvar o = oo || {}; o.Info = blob.read_shift(2); blob.l -= 2;\n\tif(o.Info === 1) o.Data = parse_RC4Header(blob, length);\n\telse o.Data = parse_RC4CryptoHeader(blob, length);\n\treturn o;\n}\nfunction parse_FilePass(blob, length, opts) {\n\tvar o = ({ Type: opts.biff >= 8 ? blob.read_shift(2) : 0 }); /* wEncryptionType */\n\tif(o.Type) parse_FilePassHeader(blob, length-2, o);\n\telse parse_XORObfuscation(blob, opts.biff >= 8 ? length : length - 2, opts, o);\n\treturn o;\n}\n\n\nvar RTF = (function() {\n\tfunction rtf_to_sheet(d, opts) {\n\t\tswitch(opts.type) {\n\t\t\tcase 'base64': return rtf_to_sheet_str(Base64.decode(d), opts);\n\t\t\tcase 'binary': return rtf_to_sheet_str(d, opts);\n\t\t\tcase 'buffer': return rtf_to_sheet_str(has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d), opts);\n\t\t\tcase 'array': return rtf_to_sheet_str(cc2str(d), opts);\n\t\t}\n\t\tthrow new Error(\"Unrecognized type \" + opts.type);\n\t}\n\n\t/* TODO: this is a stub */\n\tfunction rtf_to_sheet_str(str, opts) {\n\t\tvar o = opts || {};\n\t\tvar ws = o.dense ? ([]) : ({});\n\n\t\tvar rows = str.match(/\\\\trowd.*?\\\\row\\b/g);\n\t\tif(!rows.length) throw new Error(\"RTF missing table\");\n\t\tvar range = ({s: {c:0, r:0}, e: {c:0, r:rows.length - 1}});\n\t\trows.forEach(function(rowtf, R) {\n\t\t\tif(Array.isArray(ws)) ws[R] = [];\n\t\t\tvar rtfre = /\\\\\\w+\\b/g;\n\t\t\tvar last_index = 0;\n\t\t\tvar res;\n\t\t\tvar C = -1;\n\t\t\twhile((res = rtfre.exec(rowtf))) {\n\t\t\t\tswitch(res[0]) {\n\t\t\t\t\tcase \"\\\\cell\":\n\t\t\t\t\t\tvar data = rowtf.slice(last_index, rtfre.lastIndex - res[0].length);\n\t\t\t\t\t\tif(data[0] == \" \") data = data.slice(1);\n\t\t\t\t\t\t++C;\n\t\t\t\t\t\tif(data.length) {\n\t\t\t\t\t\t\t// TODO: value parsing, including codepage adjustments\n\t\t\t\t\t\t\tvar cell = {v: data, t:\"s\"};\n\t\t\t\t\t\t\tif(Array.isArray(ws)) ws[R][C] = cell;\n\t\t\t\t\t\t\telse ws[encode_cell({r:R, c:C})] = cell;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tlast_index = rtfre.lastIndex;\n\t\t\t}\n\t\t\tif(C > range.e.c) range.e.c = C;\n\t\t});\n\t\tws['!ref'] = encode_range(range);\n\t\treturn ws;\n\t}\n\n\tfunction rtf_to_workbook(d, opts) { return sheet_to_workbook(rtf_to_sheet(d, opts), opts); }\n\n\t/* TODO: this is a stub */\n\tfunction sheet_to_rtf(ws) {\n\t\tvar o = [\"{\\\\rtf1\\\\ansi\"];\n\t\tvar r = safe_decode_range(ws['!ref']), cell;\n\t\tvar dense = Array.isArray(ws);\n\t\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\t\to.push(\"\\\\trowd\\\\trautofit1\");\n\t\t\tfor(var C = r.s.c; C <= r.e.c; ++C) o.push(\"\\\\cellx\" + (C+1));\n\t\t\to.push(\"\\\\pard\\\\intbl\");\n\t\t\tfor(C = r.s.c; C <= r.e.c; ++C) {\n\t\t\t\tvar coord = encode_cell({r:R,c:C});\n\t\t\t\tcell = dense ? (ws[R]||[])[C]: ws[coord];\n\t\t\t\tif(!cell || cell.v == null && (!cell.f || cell.F)) continue;\n\t\t\t\to.push(\" \" + (cell.w || (format_cell(cell), cell.w)));\n\t\t\t\to.push(\"\\\\cell\");\n\t\t\t}\n\t\t\to.push(\"\\\\pard\\\\intbl\\\\row\");\n\t\t}\n\t\treturn o.join(\"\") + \"}\";\n\t}\n\n\treturn {\n\t\tto_workbook: rtf_to_workbook,\n\t\tto_sheet: rtf_to_sheet,\n\t\tfrom_sheet: sheet_to_rtf\n\t};\n})();\nfunction hex2RGB(h) {\n\tvar o = h.slice(h[0]===\"#\"?1:0).slice(0,6);\n\treturn [parseInt(o.slice(0,2),16),parseInt(o.slice(2,4),16),parseInt(o.slice(4,6),16)];\n}\nfunction rgb2Hex(rgb) {\n\tfor(var i=0,o=1; i!=3; ++i) o = o*256 + (rgb[i]>255?255:rgb[i]<0?0:rgb[i]);\n\treturn o.toString(16).toUpperCase().slice(1);\n}\n\nfunction rgb2HSL(rgb) {\n\tvar R = rgb[0]/255, G = rgb[1]/255, B=rgb[2]/255;\n\tvar M = Math.max(R, G, B), m = Math.min(R, G, B), C = M - m;\n\tif(C === 0) return [0, 0, R];\n\n\tvar H6 = 0, S = 0, L2 = (M + m);\n\tS = C / (L2 > 1 ? 2 - L2 : L2);\n\tswitch(M){\n\t\tcase R: H6 = ((G - B) / C + 6)%6; break;\n\t\tcase G: H6 = ((B - R) / C + 2); break;\n\t\tcase B: H6 = ((R - G) / C + 4); break;\n\t}\n\treturn [H6 / 6, S, L2 / 2];\n}\n\nfunction hsl2RGB(hsl){\n\tvar H = hsl[0], S = hsl[1], L = hsl[2];\n\tvar C = S * 2 * (L < 0.5 ? L : 1 - L), m = L - C/2;\n\tvar rgb = [m,m,m], h6 = 6*H;\n\n\tvar X;\n\tif(S !== 0) switch(h6|0) {\n\t\tcase 0: case 6: X = C * h6; rgb[0] += C; rgb[1] += X; break;\n\t\tcase 1: X = C * (2 - h6); rgb[0] += X; rgb[1] += C; break;\n\t\tcase 2: X = C * (h6 - 2); rgb[1] += C; rgb[2] += X; break;\n\t\tcase 3: X = C * (4 - h6); rgb[1] += X; rgb[2] += C; break;\n\t\tcase 4: X = C * (h6 - 4); rgb[2] += C; rgb[0] += X; break;\n\t\tcase 5: X = C * (6 - h6); rgb[2] += X; rgb[0] += C; break;\n\t}\n\tfor(var i = 0; i != 3; ++i) rgb[i] = Math.round(rgb[i]*255);\n\treturn rgb;\n}\n\n/* 18.8.3 bgColor tint algorithm */\nfunction rgb_tint(hex, tint) {\n\tif(tint === 0) return hex;\n\tvar hsl = rgb2HSL(hex2RGB(hex));\n\tif (tint < 0) hsl[2] = hsl[2] * (1 + tint);\n\telse hsl[2] = 1 - (1 - hsl[2]) * (1 - tint);\n\treturn rgb2Hex(hsl2RGB(hsl));\n}\n\n/* 18.3.1.13 width calculations */\n/* [MS-OI29500] 2.1.595 Column Width & Formatting */\nvar DEF_MDW = 6, MAX_MDW = 15, MIN_MDW = 1, MDW = DEF_MDW;\nfunction width2px(width) { return Math.floor(( width + (Math.round(128/MDW))/256 )* MDW ); }\nfunction px2char(px) { return (Math.floor((px - 5)/MDW * 100 + 0.5))/100; }\nfunction char2width(chr) { return (Math.round((chr * MDW + 5)/MDW*256))/256; }\n//function px2char_(px) { return (((px - 5)/MDW * 100 + 0.5))/100; }\n//function char2width_(chr) { return (((chr * MDW + 5)/MDW*256))/256; }\nfunction cycle_width(collw) { return char2width(px2char(width2px(collw))); }\n/* XLSX/XLSB/XLS specify width in units of MDW */\nfunction find_mdw_colw(collw) {\n\tvar delta = Math.abs(collw - cycle_width(collw)), _MDW = MDW;\n\tif(delta > 0.005) for(MDW=MIN_MDW; MDW 0.5) guess--;\n\t\tif(Math.abs(guess) < delta) { delta = Math.abs(guess); _MDW = MDW; }\n\t}\n\tMDW = _MDW;\n}*/\n\nfunction process_col(coll) {\n\tif(coll.width) {\n\t\tcoll.wpx = width2px(coll.width);\n\t\tcoll.wch = px2char(coll.wpx);\n\t\tcoll.MDW = MDW;\n\t} else if(coll.wpx) {\n\t\tcoll.wch = px2char(coll.wpx);\n\t\tcoll.width = char2width(coll.wch);\n\t\tcoll.MDW = MDW;\n\t} else if(typeof coll.wch == 'number') {\n\t\tcoll.width = char2width(coll.wch);\n\t\tcoll.wpx = width2px(coll.width);\n\t\tcoll.MDW = MDW;\n\t}\n\tif(coll.customWidth) delete coll.customWidth;\n}\n\nvar DEF_PPI = 96, PPI = DEF_PPI;\nfunction px2pt(px) { return px * 96 / PPI; }\nfunction pt2px(pt) { return pt * PPI / 96; }\n\n/* [MS-EXSPXML3] 2.4.54 ST_enmPattern */\nvar XLMLPatternTypeMap = {\n\t\"None\": \"none\",\n\t\"Solid\": \"solid\",\n\t\"Gray50\": \"mediumGray\",\n\t\"Gray75\": \"darkGray\",\n\t\"Gray25\": \"lightGray\",\n\t\"HorzStripe\": \"darkHorizontal\",\n\t\"VertStripe\": \"darkVertical\",\n\t\"ReverseDiagStripe\": \"darkDown\",\n\t\"DiagStripe\": \"darkUp\",\n\t\"DiagCross\": \"darkGrid\",\n\t\"ThickDiagCross\": \"darkTrellis\",\n\t\"ThinHorzStripe\": \"lightHorizontal\",\n\t\"ThinVertStripe\": \"lightVertical\",\n\t\"ThinReverseDiagStripe\": \"lightDown\",\n\t\"ThinHorzCross\": \"lightGrid\"\n};\n\n/* 18.8.5 borders CT_Borders */\nfunction parse_borders(t, styles, themes, opts) {\n\tstyles.Borders = [];\n\tvar border = {};\n\tvar pass = false;\n\t(t[0].match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.4 border CT_Border */\n\t\t\tcase '': case '':\n\t\t\t\tborder = {};\n\t\t\t\tif(y.diagonalUp) border.diagonalUp = parsexmlbool(y.diagonalUp);\n\t\t\t\tif(y.diagonalDown) border.diagonalDown = parsexmlbool(y.diagonalDown);\n\t\t\t\tstyles.Borders.push(border);\n\t\t\t\tbreak;\n\t\t\tcase '': break;\n\n\t\t\t/* note: not in spec, appears to be CT_BorderPr */\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* note: not in spec, appears to be CT_BorderPr */\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.43 top CT_BorderPr */\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.6 bottom CT_BorderPr */\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.13 diagonal CT_BorderPr */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.25 horizontal CT_BorderPr */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.44 vertical CT_BorderPr */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.37 start CT_BorderPr */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.16 end CT_BorderPr */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.? color CT_Color */\n\t\t\tcase '':\n\t\t\t\tbreak;\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.2.10 extLst CT_ExtensionList ? */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': pass = false; break;\n\t\t\tdefault: if(opts && opts.WTF) {\n\t\t\t\tif(!pass) throw new Error('unrecognized ' + y[0] + ' in borders');\n\t\t\t}\n\t\t}\n\t});\n}\n\n/* 18.8.21 fills CT_Fills */\nfunction parse_fills(t, styles, themes, opts) {\n\tstyles.Fills = [];\n\tvar fill = {};\n\tvar pass = false;\n\t(t[0].match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.20 fill CT_Fill */\n\t\t\tcase '': case '':\n\t\t\t\tfill = {}; styles.Fills.push(fill); break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.24 gradientFill CT_GradientFill */\n\t\t\tcase '': break;\n\t\t\tcase '': styles.Fills.push(fill); fill = {}; break;\n\n\t\t\t/* 18.8.32 patternFill CT_PatternFill */\n\t\t\tcase '':\n\t\t\t\tif(y.patternType) fill.patternType = y.patternType;\n\t\t\t\tbreak;\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.3 bgColor CT_Color */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.19 fgColor CT_Color */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.38 stop CT_GradientStop */\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.? color CT_Color */\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.10 extLst CT_ExtensionList ? */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': pass = false; break;\n\t\t\tdefault: if(opts && opts.WTF) {\n\t\t\t\tif(!pass) throw new Error('unrecognized ' + y[0] + ' in fills');\n\t\t\t}\n\t\t}\n\t});\n}\n\n/* 18.8.23 fonts CT_Fonts */\nfunction parse_fonts(t, styles, themes, opts) {\n\tstyles.Fonts = [];\n\tvar font = {};\n\tvar pass = false;\n\t(t[0].match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.22 font CT_Font */\n\t\t\tcase '': break;\n\t\t\tcase '': case '':\n\t\t\t\tstyles.Fonts.push(font);\n\t\t\t\tfont = {};\n\t\t\t\tbreak;\n\n\t\t\t/* 18.8.29 name CT_FontName */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.2 b CT_BooleanProperty */\n\t\t\tcase '': font.bold = 1; break;\n\n\t\t\t/* 18.8.26 i CT_BooleanProperty */\n\t\t\tcase '': font.italic = 1; break;\n\n\t\t\t/* 18.4.13 u CT_UnderlineProperty */\n\t\t\tcase '': font.underline = 1; break;\n\n\t\t\t/* 18.4.10 strike CT_BooleanProperty */\n\t\t\tcase '': font.strike = 1; break;\n\n\t\t\t/* 18.4.2 outline CT_BooleanProperty */\n\t\t\tcase '': font.outline = 1; break;\n\n\t\t\t/* 18.8.36 shadow CT_BooleanProperty */\n\t\t\tcase '': font.shadow = 1; break;\n\n\t\t\t/* 18.8.12 condense CT_BooleanProperty */\n\t\t\tcase '': font.condense = 1; break;\n\n\t\t\t/* 18.8.17 extend CT_BooleanProperty */\n\t\t\tcase '': font.extend = 1; break;\n\n\t\t\t/* 18.4.11 sz CT_FontSize */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.4.14 vertAlign CT_VerticalAlignFontProperty */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.18 family CT_FontFamily */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.35 scheme CT_FontScheme */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.4.1 charset CT_IntProperty */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* note: sometimes mc:AlternateContent appears bare */\n\t\t\tcase '': pass = false; break;\n\n\t\t\t/* 18.2.10 extLst CT_ExtensionList ? */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': pass = false; break;\n\t\t\tdefault: if(opts && opts.WTF) {\n\t\t\t\tif(!pass) throw new Error('unrecognized ' + y[0] + ' in fonts');\n\t\t\t}\n\t\t}\n\t});\n}\n\n/* 18.8.31 numFmts CT_NumFmts */\nfunction parse_numFmts(t, styles, opts) {\n\tstyles.NumberFmt = [];\n\tvar k/*Array*/ = (keys(SSF._table));\n\tfor(var i=0; i < k.length; ++i) styles.NumberFmt[k[i]] = SSF._table[k[i]];\n\tvar m = t[0].match(tagregex);\n\tif(!m) return;\n\tfor(i=0; i < m.length; ++i) {\n\t\tvar y = parsexmltag(m[i]);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': case '': case '': break;\n\t\t\tcase '0) {\n\t\t\t\t\tif(j > 0x188) {\n\t\t\t\t\t\tfor(j = 0x188; j > 0x3c; --j) if(styles.NumberFmt[j] == null) break;\n\t\t\t\t\t\tstyles.NumberFmt[j] = f;\n\t\t\t\t\t}\n\t\t\t\t\tSSF.load(f,j);\n\t\t\t\t}\n\t\t\t} break;\n\t\t\tcase '': break;\n\t\t\tdefault: if(opts.WTF) throw new Error('unrecognized ' + y[0] + ' in numFmts');\n\t\t}\n\t}\n}\n\nfunction write_numFmts(NF) {\n\tvar o = [\"\"];\n\t[[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) {\n\t\tfor(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) o[o.length] = (writextag('numFmt',null,{numFmtId:i,formatCode:escapexml(NF[i])}));\n\t});\n\tif(o.length === 1) return \"\";\n\to[o.length] = (\"\");\n\to[0] = writextag('numFmts', null, { count:o.length-2 }).replace(\"/>\", \">\");\n\treturn o.join(\"\");\n}\n\n/* 18.8.10 cellXfs CT_CellXfs */\nvar cellXF_uint = [ \"numFmtId\", \"fillId\", \"fontId\", \"borderId\", \"xfId\" ];\nvar cellXF_bool = [ \"applyAlignment\", \"applyBorder\", \"applyFill\", \"applyFont\", \"applyNumberFormat\", \"applyProtection\", \"pivotButton\", \"quotePrefix\" ];\nfunction parse_cellXfs(t, styles, opts) {\n\tstyles.CellXf = [];\n\tvar xf;\n\tvar pass = false;\n\t(t[0].match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x), i = 0;\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': case '': case '': break;\n\n\t\t\t/* 18.8.45 xf CT_Xf */\n\t\t\tcase '':\n\t\t\t\txf = y;\n\t\t\t\tdelete xf[0];\n\t\t\t\tfor(i = 0; i < cellXF_uint.length; ++i) if(xf[cellXF_uint[i]])\n\t\t\t\t\txf[cellXF_uint[i]] = parseInt(xf[cellXF_uint[i]], 10);\n\t\t\t\tfor(i = 0; i < cellXF_bool.length; ++i) if(xf[cellXF_bool[i]])\n\t\t\t\t\txf[cellXF_bool[i]] = parsexmlbool(xf[cellXF_bool[i]]);\n\t\t\t\tif(styles.NumberFmt && xf.numFmtId > 0x188) {\n\t\t\t\t\tfor(i = 0x188; i > 0x3c; --i) if(styles.NumberFmt[xf.numFmtId] == styles.NumberFmt[i]) { xf.numFmtId = i; break; }\n\t\t\t\t}\n\t\t\t\tstyles.CellXf.push(xf); break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.1 alignment CT_CellAlignment */\n\t\t\tcase '':\n\t\t\t\tvar alignment = {};\n\t\t\t\tif(y.vertical) alignment.vertical = y.vertical;\n\t\t\t\tif(y.horizontal) alignment.horizontal = y.horizontal;\n\t\t\t\tif(y.textRotation != null) alignment.textRotation = y.textRotation;\n\t\t\t\tif(y.indent) alignment.indent = y.indent;\n\t\t\t\tif(y.wrapText) alignment.wrapText = parsexmlbool(y.wrapText);\n\t\t\t\txf.alignment = alignment;\n\t\t\t\tbreak;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.33 protection CT_CellProtection */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* note: sometimes mc:AlternateContent appears bare */\n\t\t\tcase '': pass = false; break;\n\n\t\t\t/* 18.2.10 extLst CT_ExtensionList ? */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': pass = false; break;\n\t\t\tdefault: if(opts && opts.WTF) {\n\t\t\t\tif(!pass) throw new Error('unrecognized ' + y[0] + ' in cellXfs');\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction write_cellXfs(cellXfs) {\n\tvar o = [];\n\to[o.length] = (writextag('cellXfs',null));\n\tcellXfs.forEach(function(c) {\n\t\to[o.length] = (writextag('xf', null, c));\n\t});\n\to[o.length] = (\"\");\n\tif(o.length === 2) return \"\";\n\to[0] = writextag('cellXfs',null, {count:o.length-2}).replace(\"/>\",\">\");\n\treturn o.join(\"\");\n}\n\n/* 18.8 Styles CT_Stylesheet*/\nvar parse_sty_xml= (function make_pstyx() {\nvar numFmtRegex = /<(?:\\w+:)?numFmts([^>]*)>[\\S\\s]*?<\\/(?:\\w+:)?numFmts>/;\nvar cellXfRegex = /<(?:\\w+:)?cellXfs([^>]*)>[\\S\\s]*?<\\/(?:\\w+:)?cellXfs>/;\nvar fillsRegex = /<(?:\\w+:)?fills([^>]*)>[\\S\\s]*?<\\/(?:\\w+:)?fills>/;\nvar fontsRegex = /<(?:\\w+:)?fonts([^>]*)>[\\S\\s]*?<\\/(?:\\w+:)?fonts>/;\nvar bordersRegex = /<(?:\\w+:)?borders([^>]*)>[\\S\\s]*?<\\/(?:\\w+:)?borders>/;\n\nreturn function parse_sty_xml(data, themes, opts) {\n\tvar styles = {};\n\tif(!data) return styles;\n\tdata = data.replace(//mg,\"\").replace(//gm,\"\");\n\t/* 18.8.39 styleSheet CT_Stylesheet */\n\tvar t;\n\n\t/* 18.8.31 numFmts CT_NumFmts ? */\n\tif((t=data.match(numFmtRegex))) parse_numFmts(t, styles, opts);\n\n\t/* 18.8.23 fonts CT_Fonts ? */\n\tif((t=data.match(fontsRegex))) parse_fonts(t, styles, themes, opts);\n\n\t/* 18.8.21 fills CT_Fills ? */\n\tif((t=data.match(fillsRegex))) parse_fills(t, styles, themes, opts);\n\n\t/* 18.8.5 borders CT_Borders ? */\n\tif((t=data.match(bordersRegex))) parse_borders(t, styles, themes, opts);\n\n\t/* 18.8.9 cellStyleXfs CT_CellStyleXfs ? */\n\t/* 18.8.8 cellStyles CT_CellStyles ? */\n\n\t/* 18.8.10 cellXfs CT_CellXfs ? */\n\tif((t=data.match(cellXfRegex))) parse_cellXfs(t, styles, opts);\n\n\t/* 18.8.15 dxfs CT_Dxfs ? */\n\t/* 18.8.42 tableStyles CT_TableStyles ? */\n\t/* 18.8.11 colors CT_Colors ? */\n\t/* 18.2.10 extLst CT_ExtensionList ? */\n\n\treturn styles;\n};\n})();\n\nvar STYLES_XML_ROOT = writextag('styleSheet', null, {\n\t'xmlns': XMLNS.main[0],\n\t'xmlns:vt': XMLNS.vt\n});\n\nRELS.STY = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\";\n\nfunction write_sty_xml(wb, opts) {\n\tvar o = [XML_HEADER, STYLES_XML_ROOT], w;\n\tif(wb.SSF && (w = write_numFmts(wb.SSF)) != null) o[o.length] = w;\n\to[o.length] = ('');\n\to[o.length] = ('');\n\to[o.length] = ('');\n\to[o.length] = ('');\n\tif((w = write_cellXfs(opts.cellXfs))) o[o.length] = (w);\n\to[o.length] = ('');\n\to[o.length] = ('');\n\to[o.length] = ('');\n\n\tif(o.length>2){ o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* [MS-XLSB] 2.4.657 BrtFmt */\nfunction parse_BrtFmt(data, length) {\n\tvar numFmtId = data.read_shift(2);\n\tvar stFmtCode = parse_XLWideString(data,length-2);\n\treturn [numFmtId, stFmtCode];\n}\nfunction write_BrtFmt(i, f, o) {\n\tif(!o) o = new_buf(6 + 4 * f.length);\n\to.write_shift(2, i);\n\twrite_XLWideString(f, o);\n\tvar out = (o.length > o.l) ? o.slice(0, o.l) : o;\n\tif(o.l == null) o.l = o.length;\n\treturn out;\n}\n\n/* [MS-XLSB] 2.4.659 BrtFont TODO */\nfunction parse_BrtFont(data, length, opts) {\n\tvar out = ({});\n\n\tout.sz = data.read_shift(2) / 20;\n\n\tvar grbit = parse_FontFlags(data, 2, opts);\n\tif(grbit.fItalic) out.italic = 1;\n\tif(grbit.fCondense) out.condense = 1;\n\tif(grbit.fExtend) out.extend = 1;\n\tif(grbit.fShadow) out.shadow = 1;\n\tif(grbit.fOutline) out.outline = 1;\n\tif(grbit.fStrikeout) out.strike = 1;\n\n\tvar bls = data.read_shift(2);\n\tif(bls === 0x02BC) out.bold = 1;\n\n\tswitch(data.read_shift(2)) {\n\t\t/* case 0: out.vertAlign = \"baseline\"; break; */\n\t\tcase 1: out.vertAlign = \"superscript\"; break;\n\t\tcase 2: out.vertAlign = \"subscript\"; break;\n\t}\n\n\tvar underline = data.read_shift(1);\n\tif(underline != 0) out.underline = underline;\n\n\tvar family = data.read_shift(1);\n\tif(family > 0) out.family = family;\n\n\tvar bCharSet = data.read_shift(1);\n\tif(bCharSet > 0) out.charset = bCharSet;\n\n\tdata.l++;\n\tout.color = parse_BrtColor(data, 8);\n\n\tswitch(data.read_shift(1)) {\n\t\t/* case 0: out.scheme = \"none\": break; */\n\t\tcase 1: out.scheme = \"major\"; break;\n\t\tcase 2: out.scheme = \"minor\"; break;\n\t}\n\n\tout.name = parse_XLWideString(data, length - 21);\n\n\treturn out;\n}\nfunction write_BrtFont(font, o) {\n\tif(!o) o = new_buf(25+4*32);\n\to.write_shift(2, font.sz * 20);\n\twrite_FontFlags(font, o);\n\to.write_shift(2, font.bold ? 0x02BC : 0x0190);\n\tvar sss = 0;\n\tif(font.vertAlign == \"superscript\") sss = 1;\n\telse if(font.vertAlign == \"subscript\") sss = 2;\n\to.write_shift(2, sss);\n\to.write_shift(1, font.underline || 0);\n\to.write_shift(1, font.family || 0);\n\to.write_shift(1, font.charset || 0);\n\to.write_shift(1, 0);\n\twrite_BrtColor(font.color, o);\n\tvar scheme = 0;\n\tif(font.scheme == \"major\") scheme = 1;\n\tif(font.scheme == \"minor\") scheme = 2;\n\to.write_shift(1, scheme);\n\twrite_XLWideString(font.name, o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.650 BrtFill */\nvar XLSBFillPTNames = [\n\t\"none\",\n\t\"solid\",\n\t\"mediumGray\",\n\t\"darkGray\",\n\t\"lightGray\",\n\t\"darkHorizontal\",\n\t\"darkVertical\",\n\t\"darkDown\",\n\t\"darkUp\",\n\t\"darkGrid\",\n\t\"darkTrellis\",\n\t\"lightHorizontal\",\n\t\"lightVertical\",\n\t\"lightDown\",\n\t\"lightUp\",\n\t\"lightGrid\",\n\t\"lightTrellis\",\n\t\"gray125\",\n\t\"gray0625\"\n];\nvar rev_XLSBFillPTNames = (evert(XLSBFillPTNames));\n/* TODO: gradient fill representation */\nvar parse_BrtFill = parsenoop;\nfunction write_BrtFill(fill, o) {\n\tif(!o) o = new_buf(4*3 + 8*7 + 16*1);\n\tvar fls = rev_XLSBFillPTNames[fill.patternType];\n\tif(fls == null) fls = 0x28;\n\to.write_shift(4, fls);\n\tvar j = 0;\n\tif(fls != 0x28) {\n\t\t/* TODO: custom FG Color */\n\t\twrite_BrtColor({auto:1}, o);\n\t\t/* TODO: custom BG Color */\n\t\twrite_BrtColor({auto:1}, o);\n\n\t\tfor(; j < 12; ++j) o.write_shift(4, 0);\n\t} else {\n\t\tfor(; j < 4; ++j) o.write_shift(4, 0);\n\n\t\tfor(; j < 12; ++j) o.write_shift(4, 0); /* TODO */\n\t\t/* iGradientType */\n\t\t/* xnumDegree */\n\t\t/* xnumFillToLeft */\n\t\t/* xnumFillToRight */\n\t\t/* xnumFillToTop */\n\t\t/* xnumFillToBottom */\n\t\t/* cNumStop */\n\t\t/* xfillGradientStop */\n\t}\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.824 BrtXF */\nfunction parse_BrtXF(data, length) {\n\tvar tgt = data.l + length;\n\tvar ixfeParent = data.read_shift(2);\n\tvar ifmt = data.read_shift(2);\n\tdata.l = tgt;\n\treturn {ixfe:ixfeParent, numFmtId:ifmt };\n}\nfunction write_BrtXF(data, ixfeP, o) {\n\tif(!o) o = new_buf(16);\n\to.write_shift(2, ixfeP||0);\n\to.write_shift(2, data.numFmtId||0);\n\to.write_shift(2, 0); /* iFont */\n\to.write_shift(2, 0); /* iFill */\n\to.write_shift(2, 0); /* ixBorder */\n\to.write_shift(1, 0); /* trot */\n\to.write_shift(1, 0); /* indent */\n\tvar flow = 0;\n\to.write_shift(1, flow); /* flags */\n\to.write_shift(1, 0); /* flags */\n\to.write_shift(1, 0); /* xfGrbitAtr */\n\to.write_shift(1, 0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.4 Blxf TODO */\nfunction write_Blxf(data, o) {\n\tif(!o) o = new_buf(10);\n\to.write_shift(1, 0); /* dg */\n\to.write_shift(1, 0);\n\to.write_shift(4, 0); /* color */\n\to.write_shift(4, 0); /* color */\n\treturn o;\n}\n/* [MS-XLSB] 2.4.302 BrtBorder TODO */\nvar parse_BrtBorder = parsenoop;\nfunction write_BrtBorder(border, o) {\n\tif(!o) o = new_buf(51);\n\to.write_shift(1, 0); /* diagonal */\n\twrite_Blxf(null, o); /* top */\n\twrite_Blxf(null, o); /* bottom */\n\twrite_Blxf(null, o); /* left */\n\twrite_Blxf(null, o); /* right */\n\twrite_Blxf(null, o); /* diag */\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.763 BrtStyle TODO */\nfunction write_BrtStyle(style, o) {\n\tif(!o) o = new_buf(12+4*10);\n\to.write_shift(4, style.xfId);\n\to.write_shift(2, 1);\n\to.write_shift(1, +style.builtinId);\n\to.write_shift(1, 0); /* iLevel */\n\twrite_XLNullableWideString(style.name || \"\", o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.272 BrtBeginTableStyles */\nfunction write_BrtBeginTableStyles(cnt, defTableStyle, defPivotStyle) {\n\tvar o = new_buf(4+256*2*4);\n\to.write_shift(4, cnt);\n\twrite_XLNullableWideString(defTableStyle, o);\n\twrite_XLNullableWideString(defPivotStyle, o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.1.7.50 Styles */\nfunction parse_sty_bin(data, themes, opts) {\n\tvar styles = {};\n\tstyles.NumberFmt = ([]);\n\tfor(var y in SSF._table) styles.NumberFmt[y] = SSF._table[y];\n\n\tstyles.CellXf = [];\n\tstyles.Fonts = [];\n\tvar state = [];\n\tvar pass = false;\n\trecordhopper(data, function hopper_sty(val, R_n, RT) {\n\t\tswitch(RT) {\n\t\t\tcase 0x002C: /* 'BrtFmt' */\n\t\t\t\tstyles.NumberFmt[val[0]] = val[1]; SSF.load(val[1], val[0]);\n\t\t\t\tbreak;\n\t\t\tcase 0x002B: /* 'BrtFont' */\n\t\t\t\tstyles.Fonts.push(val);\n\t\t\t\tif(val.color.theme != null && themes && themes.themeElements && themes.themeElements.clrScheme) {\n\t\t\t\t\tval.color.rgb = rgb_tint(themes.themeElements.clrScheme[val.color.theme].rgb, val.color.tint || 0);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 0x0401: /* 'BrtKnownFonts' */ break;\n\t\t\tcase 0x002D: /* 'BrtFill' */\n\t\t\t\tbreak;\n\t\t\tcase 0x002E: /* 'BrtBorder' */\n\t\t\t\tbreak;\n\t\t\tcase 0x002F: /* 'BrtXF' */\n\t\t\t\tif(state[state.length - 1] == \"BrtBeginCellXFs\") {\n\t\t\t\t\tstyles.CellXf.push(val);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 0x0030: /* 'BrtStyle' */\n\t\t\tcase 0x01FB: /* 'BrtDXF' */\n\t\t\tcase 0x023C: /* 'BrtMRUColor' */\n\t\t\tcase 0x01DB: /* 'BrtIndexedColor': */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0493: /* 'BrtDXF14' */\n\t\t\tcase 0x0836: /* 'BrtDXF15' */\n\t\t\tcase 0x046A: /* 'BrtSlicerStyleElement' */\n\t\t\tcase 0x0200: /* 'BrtTableStyleElement' */\n\t\t\tcase 0x082F: /* 'BrtTimelineStyleElement' */\n\t\t\tcase 0x0C00: /* 'BrtUid' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0023: /* 'BrtFRTBegin' */\n\t\t\t\tpass = true; break;\n\t\t\tcase 0x0024: /* 'BrtFRTEnd' */\n\t\t\t\tpass = false; break;\n\t\t\tcase 0x0025: /* 'BrtACBegin' */\n\t\t\t\tstate.push(R_n); pass = true; break;\n\t\t\tcase 0x0026: /* 'BrtACEnd' */\n\t\t\t\tstate.pop(); pass = false; break;\n\n\t\t\tdefault:\n\t\t\t\tif((R_n||\"\").indexOf(\"Begin\") > 0) state.push(R_n);\n\t\t\t\telse if((R_n||\"\").indexOf(\"End\") > 0) state.pop();\n\t\t\t\telse if(!pass || (opts.WTF && state[state.length-1] != \"BrtACBegin\")) throw new Error(\"Unexpected record \" + RT + \" \" + R_n);\n\t\t}\n\t});\n\treturn styles;\n}\n\nfunction write_FMTS_bin(ba, NF) {\n\tif(!NF) return;\n\tvar cnt = 0;\n\t[[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) {\nfor(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) ++cnt;\n\t});\n\n\tif(cnt == 0) return;\n\twrite_record(ba, \"BrtBeginFmts\", write_UInt32LE(cnt));\n\t[[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) {\nfor(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) write_record(ba, \"BrtFmt\", write_BrtFmt(i, NF[i]));\n\t});\n\twrite_record(ba, \"BrtEndFmts\");\n}\n\nfunction write_FONTS_bin(ba) {\n\tvar cnt = 1;\n\n\tif(cnt == 0) return;\n\twrite_record(ba, \"BrtBeginFonts\", write_UInt32LE(cnt));\n\twrite_record(ba, \"BrtFont\", write_BrtFont({\n\t\tsz:12,\n\t\tcolor: {theme:1},\n\t\tname: \"Calibri\",\n\t\tfamily: 2,\n\t\tscheme: \"minor\"\n\t}));\n\t/* 1*65491BrtFont [ACFONTS] */\n\twrite_record(ba, \"BrtEndFonts\");\n}\n\nfunction write_FILLS_bin(ba) {\n\tvar cnt = 2;\n\n\tif(cnt == 0) return;\n\twrite_record(ba, \"BrtBeginFills\", write_UInt32LE(cnt));\n\twrite_record(ba, \"BrtFill\", write_BrtFill({patternType:\"none\"}));\n\twrite_record(ba, \"BrtFill\", write_BrtFill({patternType:\"gray125\"}));\n\t/* 1*65431BrtFill */\n\twrite_record(ba, \"BrtEndFills\");\n}\n\nfunction write_BORDERS_bin(ba) {\n\tvar cnt = 1;\n\n\tif(cnt == 0) return;\n\twrite_record(ba, \"BrtBeginBorders\", write_UInt32LE(cnt));\n\twrite_record(ba, \"BrtBorder\", write_BrtBorder({}));\n\t/* 1*65430BrtBorder */\n\twrite_record(ba, \"BrtEndBorders\");\n}\n\nfunction write_CELLSTYLEXFS_bin(ba) {\n\tvar cnt = 1;\n\twrite_record(ba, \"BrtBeginCellStyleXFs\", write_UInt32LE(cnt));\n\twrite_record(ba, \"BrtXF\", write_BrtXF({\n\t\tnumFmtId: 0,\n\t\tfontId: 0,\n\t\tfillId: 0,\n\t\tborderId: 0\n\t}, 0xFFFF));\n\t/* 1*65430(BrtXF *FRT) */\n\twrite_record(ba, \"BrtEndCellStyleXFs\");\n}\n\nfunction write_CELLXFS_bin(ba, data) {\n\twrite_record(ba, \"BrtBeginCellXFs\", write_UInt32LE(data.length));\n\tdata.forEach(function(c) { write_record(ba, \"BrtXF\", write_BrtXF(c,0)); });\n\t/* 1*65430(BrtXF *FRT) */\n\twrite_record(ba, \"BrtEndCellXFs\");\n}\n\nfunction write_STYLES_bin(ba) {\n\tvar cnt = 1;\n\n\twrite_record(ba, \"BrtBeginStyles\", write_UInt32LE(cnt));\n\twrite_record(ba, \"BrtStyle\", write_BrtStyle({\n\t\txfId:0,\n\t\tbuiltinId:0,\n\t\tname:\"Normal\"\n\t}));\n\t/* 1*65430(BrtStyle *FRT) */\n\twrite_record(ba, \"BrtEndStyles\");\n}\n\nfunction write_DXFS_bin(ba) {\n\tvar cnt = 0;\n\n\twrite_record(ba, \"BrtBeginDXFs\", write_UInt32LE(cnt));\n\t/* *2147483647(BrtDXF *FRT) */\n\twrite_record(ba, \"BrtEndDXFs\");\n}\n\nfunction write_TABLESTYLES_bin(ba) {\n\tvar cnt = 0;\n\n\twrite_record(ba, \"BrtBeginTableStyles\", write_BrtBeginTableStyles(cnt, \"TableStyleMedium9\", \"PivotStyleMedium4\"));\n\t/* *TABLESTYLE */\n\twrite_record(ba, \"BrtEndTableStyles\");\n}\n\nfunction write_COLORPALETTE_bin() {\n\treturn;\n\t/* BrtBeginColorPalette [INDEXEDCOLORS] [MRUCOLORS] BrtEndColorPalette */\n}\n\n/* [MS-XLSB] 2.1.7.50 Styles */\nfunction write_sty_bin(wb, opts) {\n\tvar ba = buf_array();\n\twrite_record(ba, \"BrtBeginStyleSheet\");\n\twrite_FMTS_bin(ba, wb.SSF);\n\twrite_FONTS_bin(ba, wb);\n\twrite_FILLS_bin(ba, wb);\n\twrite_BORDERS_bin(ba, wb);\n\twrite_CELLSTYLEXFS_bin(ba, wb);\n\twrite_CELLXFS_bin(ba, opts.cellXfs);\n\twrite_STYLES_bin(ba, wb);\n\twrite_DXFS_bin(ba, wb);\n\twrite_TABLESTYLES_bin(ba, wb);\n\twrite_COLORPALETTE_bin(ba, wb);\n\t/* FRTSTYLESHEET*/\n\twrite_record(ba, \"BrtEndStyleSheet\");\n\treturn ba.end();\n}\nRELS.THEME = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\";\n\n/* Even though theme layout is dk1 lt1 dk2 lt2, true order is lt1 dk1 lt2 dk2 */\nvar XLSXThemeClrScheme = [\n\t'', '', '', '',\n\t'', '', '',\n\t'', '', '',\n\t'', ''\n];\n/* 20.1.6.2 clrScheme CT_ColorScheme */\nfunction parse_clrScheme(t, themes, opts) {\n\tthemes.themeElements.clrScheme = [];\n\tvar color = {};\n\t(t[0].match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\t/* 20.1.6.2 clrScheme (Color Scheme) CT_ColorScheme */\n\t\t\tcase '': break;\n\n\t\t\t/* 20.1.2.3.32 srgbClr CT_SRgbColor */\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\t\tif (y[0].charAt(1) === '/') {\n\t\t\t\t\tthemes.themeElements.clrScheme[XLSXThemeClrScheme.indexOf(y[0])] = color;\n\t\t\t\t\tcolor = {};\n\t\t\t\t} else {\n\t\t\t\t\tcolor.name = y[0].slice(3, y[0].length - 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault: if(opts && opts.WTF) throw new Error('Unrecognized ' + y[0] + ' in clrScheme');\n\t\t}\n\t});\n}\n\n/* 20.1.4.1.18 fontScheme CT_FontScheme */\nfunction parse_fontScheme() { }\n\n/* 20.1.4.1.15 fmtScheme CT_StyleMatrix */\nfunction parse_fmtScheme() { }\n\nvar clrsregex = /]*)>[\\s\\S]*<\\/a:clrScheme>/;\nvar fntsregex = /]*)>[\\s\\S]*<\\/a:fontScheme>/;\nvar fmtsregex = /]*)>[\\s\\S]*<\\/a:fmtScheme>/;\n\n/* 20.1.6.10 themeElements CT_BaseStyles */\nfunction parse_themeElements(data, themes, opts) {\n\tthemes.themeElements = {};\n\n\tvar t;\n\n\t[\n\t\t/* clrScheme CT_ColorScheme */\n\t\t['clrScheme', clrsregex, parse_clrScheme],\n\t\t/* fontScheme CT_FontScheme */\n\t\t['fontScheme', fntsregex, parse_fontScheme],\n\t\t/* fmtScheme CT_StyleMatrix */\n\t\t['fmtScheme', fmtsregex, parse_fmtScheme]\n\t].forEach(function(m) {\n\t\tif(!(t=data.match(m[1]))) throw new Error(m[0] + ' not found in themeElements');\n\t\tm[2](t, themes, opts);\n\t});\n}\n\nvar themeltregex = /]*)>[\\s\\S]*<\\/a:themeElements>/;\n\n/* 14.2.7 Theme Part */\nfunction parse_theme_xml(data, opts) {\n\t/* 20.1.6.9 theme CT_OfficeStyleSheet */\n\tif(!data || data.length === 0) return parse_theme_xml(write_theme());\n\n\tvar t;\n\tvar themes = {};\n\n\t/* themeElements CT_BaseStyles */\n\tif(!(t=data.match(themeltregex))) throw new Error('themeElements not found in theme');\n\tparse_themeElements(t[0], themes, opts);\n\tthemes.raw = data;\n\treturn themes;\n}\n\nfunction write_theme(Themes, opts) {\n\tif(opts && opts.themeXLSX) return opts.themeXLSX;\n\tif(Themes && typeof Themes.raw == \"string\") return Themes.raw;\n\tvar o = [XML_HEADER];\n\to[o.length] = '';\n\to[o.length] = '';\n\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\treturn o.join(\"\");\n}\n/* [MS-XLS] 2.4.326 TODO: payload is a zip file */\nfunction parse_Theme(blob, length, opts) {\n\tvar end = blob.l + length;\n\tvar dwThemeVersion = blob.read_shift(4);\n\tif(dwThemeVersion === 124226) return;\n\tif(!opts.cellStyles) { blob.l = end; return; }\n\tvar data = blob.slice(blob.l);\n\tblob.l = end;\n\tvar zip; try { zip = zip_read(data, {type: \"array\"}); } catch(e) { return; }\n\tvar themeXML = getzipstr(zip, \"theme/theme/theme1.xml\", true);\n\tif(!themeXML) return;\n\treturn parse_theme_xml(themeXML, opts);\n}\n\n/* 2.5.49 */\nfunction parse_ColorTheme(blob) { return blob.read_shift(4); }\n\n/* 2.5.155 */\nfunction parse_FullColorExt(blob) {\n\tvar o = {};\n\to.xclrType = blob.read_shift(2);\n\to.nTintShade = blob.read_shift(2);\n\tswitch(o.xclrType) {\n\t\tcase 0: blob.l += 4; break;\n\t\tcase 1: o.xclrValue = parse_IcvXF(blob, 4); break;\n\t\tcase 2: o.xclrValue = parse_LongRGBA(blob, 4); break;\n\t\tcase 3: o.xclrValue = parse_ColorTheme(blob, 4); break;\n\t\tcase 4: blob.l += 4; break;\n\t}\n\tblob.l += 8;\n\treturn o;\n}\n\n/* 2.5.164 TODO: read 7 bits*/\nfunction parse_IcvXF(blob, length) {\n\treturn parsenoop(blob, length);\n}\n\n/* 2.5.280 */\nfunction parse_XFExtGradient(blob, length) {\n\treturn parsenoop(blob, length);\n}\n\n/* [MS-XLS] 2.5.108 */\nfunction parse_ExtProp(blob) {\n\tvar extType = blob.read_shift(2);\n\tvar cb = blob.read_shift(2) - 4;\n\tvar o = [extType];\n\tswitch(extType) {\n\t\tcase 0x04: case 0x05: case 0x07: case 0x08:\n\t\tcase 0x09: case 0x0A: case 0x0B: case 0x0D:\n\t\t\to[1] = parse_FullColorExt(blob, cb); break;\n\t\tcase 0x06: o[1] = parse_XFExtGradient(blob, cb); break;\n\t\tcase 0x0E: case 0x0F: o[1] = blob.read_shift(cb === 1 ? 1 : 2); break;\n\t\tdefault: throw new Error(\"Unrecognized ExtProp type: \" + extType + \" \" + cb);\n\t}\n\treturn o;\n}\n\n/* 2.4.355 */\nfunction parse_XFExt(blob, length) {\n\tvar end = blob.l + length;\n\tblob.l += 2;\n\tvar ixfe = blob.read_shift(2);\n\tblob.l += 2;\n\tvar cexts = blob.read_shift(2);\n\tvar ext = [];\n\twhile(cexts-- > 0) ext.push(parse_ExtProp(blob, end-blob.l));\n\treturn {ixfe:ixfe, ext:ext};\n}\n\n/* xf is an XF, see parse_XFExt for xfext */\nfunction update_xfext(xf, xfext) {\n\txfext.forEach(function(xfe) {\n\t\tswitch(xfe[0]) { /* 2.5.108 extPropData */\n\t\t\tcase 0x04: break; /* foreground color */\n\t\t\tcase 0x05: break; /* background color */\n\t\t\tcase 0x06: break; /* gradient fill */\n\t\t\tcase 0x07: break; /* top cell border color */\n\t\t\tcase 0x08: break; /* bottom cell border color */\n\t\t\tcase 0x09: break; /* left cell border color */\n\t\t\tcase 0x0a: break; /* right cell border color */\n\t\t\tcase 0x0b: break; /* diagonal cell border color */\n\t\t\tcase 0x0d: /* text color */\n\t\t\t\tbreak;\n\t\t\tcase 0x0e: break; /* font scheme */\n\t\t\tcase 0x0f: break; /* indentation level */\n\t\t}\n\t});\n}\n\n/* 18.6 Calculation Chain */\nfunction parse_cc_xml(data) {\n\tvar d = [];\n\tif(!data) return d;\n\tvar i = 1;\n\t(data.match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\tcase '': case '': break;\n\t\t\t/* 18.6.1 c CT_CalcCell 1 */\n\t\t\tcase ' 0){/* empty */}\n\t\t\t\telse if((R_n||\"\").indexOf(\"End\") > 0){/* empty */}\n\t\t\t\telse if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R_n);\n\t\t}\n\t});\n\treturn out;\n}\n\n//function write_cc_bin(data, opts) { }\n/* 18.14 Supplementary Workbook Data */\nfunction parse_xlink_xml() {\n\t//var opts = _opts || {};\n\t//if(opts.WTF) throw \"XLSX External Link\";\n}\n\n/* [MS-XLSB] 2.1.7.25 External Link */\nfunction parse_xlink_bin(data, rel, name, _opts) {\n\tif(!data) return data;\n\tvar opts = _opts || {};\n\n\tvar pass = false, end = false;\n\n\trecordhopper(data, function xlink_parse(val, R_n, RT) {\n\t\tif(end) return;\n\t\tswitch(RT) {\n\t\t\tcase 0x0167: /* 'BrtSupTabs' */\n\t\t\tcase 0x016B: /* 'BrtExternTableStart' */\n\t\t\tcase 0x016C: /* 'BrtExternTableEnd' */\n\t\t\tcase 0x016E: /* 'BrtExternRowHdr' */\n\t\t\tcase 0x016F: /* 'BrtExternCellBlank' */\n\t\t\tcase 0x0170: /* 'BrtExternCellReal' */\n\t\t\tcase 0x0171: /* 'BrtExternCellBool' */\n\t\t\tcase 0x0172: /* 'BrtExternCellError' */\n\t\t\tcase 0x0173: /* 'BrtExternCellString' */\n\t\t\tcase 0x01D8: /* 'BrtExternValueMeta' */\n\t\t\tcase 0x0241: /* 'BrtSupNameStart' */\n\t\t\tcase 0x0242: /* 'BrtSupNameValueStart' */\n\t\t\tcase 0x0243: /* 'BrtSupNameValueEnd' */\n\t\t\tcase 0x0244: /* 'BrtSupNameNum' */\n\t\t\tcase 0x0245: /* 'BrtSupNameErr' */\n\t\t\tcase 0x0246: /* 'BrtSupNameSt' */\n\t\t\tcase 0x0247: /* 'BrtSupNameNil' */\n\t\t\tcase 0x0248: /* 'BrtSupNameBool' */\n\t\t\tcase 0x0249: /* 'BrtSupNameFmla' */\n\t\t\tcase 0x024A: /* 'BrtSupNameBits' */\n\t\t\tcase 0x024B: /* 'BrtSupNameEnd' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0023: /* 'BrtFRTBegin' */\n\t\t\t\tpass = true; break;\n\t\t\tcase 0x0024: /* 'BrtFRTEnd' */\n\t\t\t\tpass = false; break;\n\n\t\t\tdefault:\n\t\t\t\tif((R_n||\"\").indexOf(\"Begin\") > 0){/* empty */}\n\t\t\t\telse if((R_n||\"\").indexOf(\"End\") > 0){/* empty */}\n\t\t\t\telse if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT.toString(16) + \" \" + R_n);\n\t\t}\n\t}, opts);\n}\n/* 20.5 DrawingML - SpreadsheetML Drawing */\nRELS.IMG = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\";\nRELS.DRAW = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\";\n\n/* 20.5.2.35 wsDr CT_Drawing */\nfunction parse_drawing(data, rels) {\n\tif(!data) return \"??\";\n\t/*\n\t Chartsheet Drawing:\n\t - 20.5.2.35 wsDr CT_Drawing\n\t - 20.5.2.1 absoluteAnchor CT_AbsoluteAnchor\n\t - 20.5.2.16 graphicFrame CT_GraphicalObjectFrame\n\t - 20.1.2.2.16 graphic CT_GraphicalObject\n\t - 20.1.2.2.17 graphicData CT_GraphicalObjectData\n - chart reference\n\t the actual type is based on the URI of the graphicData\n\t\tTODO: handle embedded charts and other types of graphics\n\t*/\n\tvar id = (data.match(/]*r:id=\"([^\"]*)\"/)||[\"\",\"\"])[1];\n\n\treturn rels['!id'][id].Target;\n}\n\n/* L.5.5.2 SpreadsheetML Comments + VML Schema */\nvar _shapeid = 1024;\nfunction write_comments_vml(rId, comments) {\n\tvar csize = [21600, 21600];\n\t/* L.5.2.1.2 Path Attribute */\n\tvar bbox = [\"m0,0l0\",csize[1],csize[0],csize[1],csize[0],\"0xe\"].join(\",\");\n\tvar o = [\n\t\twritextag(\"xml\", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\\/>/,\">\"),\n\t\twritextag(\"o:shapelayout\", writextag(\"o:idmap\", null, {'v:ext':\"edit\", 'data':rId}), {'v:ext':\"edit\"}),\n\t\twritextag(\"v:shapetype\", [\n\t\t\twritextag(\"v:stroke\", null, {joinstyle:\"miter\"}),\n\t\t\twritextag(\"v:path\", null, {gradientshapeok:\"t\", 'o:connecttype':\"rect\"})\n\t\t].join(\"\"), {id:\"_x0000_t202\", 'o:spt':202, coordsize:csize.join(\",\"),path:bbox})\n\t];\n\twhile(_shapeid < rId * 1000) _shapeid += 1000;\n\n\tcomments.forEach(function(x) {\n\tvar c = decode_cell(x[0]);\n\tvar fillopts = {'color2':\"#BEFF82\", 'type':\"gradient\"};\n\tif(fillopts.type == \"gradient\") fillopts.angle = \"-180\";\n\tvar fillparm = fillopts.type == \"gradient\" ? writextag(\"o:fill\", null, {type:\"gradientUnscaled\", 'v:ext':\"view\"}) : null;\n\tvar fillxml = writextag('v:fill', fillparm, fillopts);\n\n\tvar shadata = ({on:\"t\", 'obscured':\"t\"});\n\t++_shapeid;\n\n\to = o.concat([\n\t'',\n\t\tfillxml,\n\t\twritextag(\"v:shadow\", null, shadata),\n\t\twritextag(\"v:path\", null, {'o:connecttype':\"none\"}),\n\t\t'
',\n\t\t'',\n\t\t\t'',\n\t\t\t'',\n\t\t\t/* Part 4 19.4.2.3 Anchor (Anchor) */\n\t\t\twritetag('x:Anchor', [c.c+1, 0, c.r+1, 0, c.c+3, 20, c.r+5, 20].join(\",\")),\n\t\t\twritetag('x:AutoFill', \"False\"),\n\t\t\twritetag('x:Row', String(c.r)),\n\t\t\twritetag('x:Column', String(c.c)),\n\t\t\tx[1].hidden ? '' : '',\n\t\t'',\n\t''\n\t]); });\n\to.push('');\n\treturn o.join(\"\");\n}\nRELS.CMNT = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\";\n\nfunction sheet_insert_comments(sheet, comments) {\n\tvar dense = Array.isArray(sheet);\n\tvar cell;\n\tcomments.forEach(function(comment) {\n\t\tvar r = decode_cell(comment.ref);\n\t\tif(dense) {\n\t\t\tif(!sheet[r.r]) sheet[r.r] = [];\n\t\t\tcell = sheet[r.r][r.c];\n\t\t} else cell = sheet[comment.ref];\n\t\tif (!cell) {\n\t\t\tcell = ({t:\"z\"});\n\t\t\tif(dense) sheet[r.r][r.c] = cell;\n\t\t\telse sheet[comment.ref] = cell;\n\t\t\tvar range = safe_decode_range(sheet[\"!ref\"]||\"BDWGO1000001:A1\");\n\t\t\tif(range.s.r > r.r) range.s.r = r.r;\n\t\t\tif(range.e.r < r.r) range.e.r = r.r;\n\t\t\tif(range.s.c > r.c) range.s.c = r.c;\n\t\t\tif(range.e.c < r.c) range.e.c = r.c;\n\t\t\tvar encoded = encode_range(range);\n\t\t\tif (encoded !== sheet[\"!ref\"]) sheet[\"!ref\"] = encoded;\n\t\t}\n\n\t\tif (!cell.c) cell.c = [];\n\t\tvar o = ({a: comment.author, t: comment.t, r: comment.r});\n\t\tif(comment.h) o.h = comment.h;\n\t\tcell.c.push(o);\n\t});\n}\n\n/* 18.7 Comments */\nfunction parse_comments_xml(data, opts) {\n\t/* 18.7.6 CT_Comments */\n\tif(data.match(/<(?:\\w+:)?comments *\\/>/)) return [];\n\tvar authors = [];\n\tvar commentList = [];\n\tvar authtag = data.match(/<(?:\\w+:)?authors>([\\s\\S]*)<\\/(?:\\w+:)?authors>/);\n\tif(authtag && authtag[1]) authtag[1].split(/<\\/\\w*:?author>/).forEach(function(x) {\n\t\tif(x === \"\" || x.trim() === \"\") return;\n\t\tvar a = x.match(/<(?:\\w+:)?author[^>]*>(.*)/);\n\t\tif(a) authors.push(a[1]);\n\t});\n\tvar cmnttag = data.match(/<(?:\\w+:)?commentList>([\\s\\S]*)<\\/(?:\\w+:)?commentList>/);\n\tif(cmnttag && cmnttag[1]) cmnttag[1].split(/<\\/\\w*:?comment>/).forEach(function(x) {\n\t\tif(x === \"\" || x.trim() === \"\") return;\n\t\tvar cm = x.match(/<(?:\\w+:)?comment[^>]*>/);\n\t\tif(!cm) return;\n\t\tvar y = parsexmltag(cm[0]);\n\t\tvar comment = ({ author: y.authorId && authors[y.authorId] || \"sheetjsghost\", ref: y.ref, guid: y.guid });\n\t\tvar cell = decode_cell(y.ref);\n\t\tif(opts.sheetRows && opts.sheetRows <= cell.r) return;\n\t\tvar textMatch = x.match(/<(?:\\w+:)?text>([\\s\\S]*)<\\/(?:\\w+:)?text>/);\n\t\tvar rt = !!textMatch && !!textMatch[1] && parse_si(textMatch[1]) || {r:\"\",t:\"\",h:\"\"};\n\t\tcomment.r = rt.r;\n\t\tif(rt.r == \"\") rt.t = rt.h = \"\";\n\t\tcomment.t = (rt.t||\"\").replace(/\\r\\n/g,\"\\n\").replace(/\\r/g,\"\\n\");\n\t\tif(opts.cellHTML) comment.h = rt.h;\n\t\tcommentList.push(comment);\n\t});\n\treturn commentList;\n}\n\nvar CMNT_XML_ROOT = writextag('comments', null, { 'xmlns': XMLNS.main[0] });\nfunction write_comments_xml(data) {\n\tvar o = [XML_HEADER, CMNT_XML_ROOT];\n\n\tvar iauthor = [];\n\to.push(\"\");\n\tdata.forEach(function(x) { x[1].forEach(function(w) { var a = escapexml(w.a);\n\t\tif(iauthor.indexOf(a) > -1) return;\n\t\tiauthor.push(a);\n\t\to.push(\"\" + a + \"\");\n\t}); });\n\to.push(\"\");\n\to.push(\"\");\n\tdata.forEach(function(d) {\n\t\td[1].forEach(function(c) {\n\t\t\t/* 18.7.3 CT_Comment */\n\t\t\to.push('');\n\t\t\to.push(writetag(\"t\", c.t == null ? \"\" : escapexml(c.t)));\n\t\t\to.push('');\n\t\t});\n\t});\n\to.push(\"\");\n\tif(o.length>2) { o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* [MS-XLSB] 2.4.28 BrtBeginComment */\nfunction parse_BrtBeginComment(data) {\n\tvar out = {};\n\tout.iauthor = data.read_shift(4);\n\tvar rfx = parse_UncheckedRfX(data, 16);\n\tout.rfx = rfx.s;\n\tout.ref = encode_cell(rfx.s);\n\tdata.l += 16; /*var guid = parse_GUID(data); */\n\treturn out;\n}\nfunction write_BrtBeginComment(data, o) {\n\tif(o == null) o = new_buf(36);\n\to.write_shift(4, data[1].iauthor);\n\twrite_UncheckedRfX((data[0]), o);\n\to.write_shift(4, 0);\n\to.write_shift(4, 0);\n\to.write_shift(4, 0);\n\to.write_shift(4, 0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.327 BrtCommentAuthor */\nvar parse_BrtCommentAuthor = parse_XLWideString;\nfunction write_BrtCommentAuthor(data) { return write_XLWideString(data.slice(0, 54)); }\n\n/* [MS-XLSB] 2.1.7.8 Comments */\nfunction parse_comments_bin(data, opts) {\n\tvar out = [];\n\tvar authors = [];\n\tvar c = {};\n\tvar pass = false;\n\trecordhopper(data, function hopper_cmnt(val, R_n, RT) {\n\t\tswitch(RT) {\n\t\t\tcase 0x0278: /* 'BrtCommentAuthor' */\n\t\t\t\tauthors.push(val); break;\n\t\t\tcase 0x027B: /* 'BrtBeginComment' */\n\t\t\t\tc = val; break;\n\t\t\tcase 0x027D: /* 'BrtCommentText' */\n\t\t\t\tc.t = val.t; c.h = val.h; c.r = val.r; break;\n\t\t\tcase 0x027C: /* 'BrtEndComment' */\n\t\t\t\tc.author = authors[c.iauthor];\n\t\t\t\tdelete (c).iauthor;\n\t\t\t\tif(opts.sheetRows && c.rfx && opts.sheetRows <= c.rfx.r) break;\n\t\t\t\tif(!c.t) c.t = \"\";\n\t\t\t\tdelete c.rfx; out.push(c); break;\n\n\t\t\tcase 0x0C00: /* 'BrtUid' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0023: /* 'BrtFRTBegin' */\n\t\t\t\tpass = true; break;\n\t\t\tcase 0x0024: /* 'BrtFRTEnd' */\n\t\t\t\tpass = false; break;\n\t\t\tcase 0x0025: /* 'BrtACBegin' */ break;\n\t\t\tcase 0x0026: /* 'BrtACEnd' */ break;\n\n\n\t\t\tdefault:\n\t\t\t\tif((R_n||\"\").indexOf(\"Begin\") > 0){/* empty */}\n\t\t\t\telse if((R_n||\"\").indexOf(\"End\") > 0){/* empty */}\n\t\t\t\telse if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R_n);\n\t\t}\n\t});\n\treturn out;\n}\n\nfunction write_comments_bin(data) {\n\tvar ba = buf_array();\n\tvar iauthor = [];\n\twrite_record(ba, \"BrtBeginComments\");\n\n\twrite_record(ba, \"BrtBeginCommentAuthors\");\n\tdata.forEach(function(comment) {\n\t\tcomment[1].forEach(function(c) {\n\t\t\tif(iauthor.indexOf(c.a) > -1) return;\n\t\t\tiauthor.push(c.a.slice(0,54));\n\t\t\twrite_record(ba, \"BrtCommentAuthor\", write_BrtCommentAuthor(c.a));\n\t\t});\n\t});\n\twrite_record(ba, \"BrtEndCommentAuthors\");\n\n\twrite_record(ba, \"BrtBeginCommentList\");\n\tdata.forEach(function(comment) {\n\t\tcomment[1].forEach(function(c) {\n\t\t\tc.iauthor = iauthor.indexOf(c.a);\n\t\t\tvar range = {s:decode_cell(comment[0]),e:decode_cell(comment[0])};\n\t\t\twrite_record(ba, \"BrtBeginComment\", write_BrtBeginComment([range, c]));\n\t\t\tif(c.t && c.t.length > 0) write_record(ba, \"BrtCommentText\", write_BrtCommentText(c));\n\t\t\twrite_record(ba, \"BrtEndComment\");\n\t\t\tdelete c.iauthor;\n\t\t});\n\t});\n\twrite_record(ba, \"BrtEndCommentList\");\n\n\twrite_record(ba, \"BrtEndComments\");\n\treturn ba.end();\n}\nvar CT_VBA = \"application/vnd.ms-office.vbaProject\";\nfunction make_vba_xls(cfb) {\n\tvar newcfb = CFB.utils.cfb_new({root:\"R\"});\n\tcfb.FullPaths.forEach(function(p, i) {\n\t\tif(p.slice(-1) === \"/\" || !p.match(/_VBA_PROJECT_CUR/)) return;\n\t\tvar newpath = p.replace(/^[^\\/]*/,\"R\").replace(/\\/_VBA_PROJECT_CUR\\u0000*/, \"\");\n\t\tCFB.utils.cfb_add(newcfb, newpath, cfb.FileIndex[i].content);\n\t});\n\treturn CFB.write(newcfb);\n}\n\nfunction fill_vba_xls(cfb, vba) {\n\tvba.FullPaths.forEach(function(p, i) {\n\t\tif(i == 0) return;\n\t\tvar newpath = p.replace(/[^\\/]*[\\/]/, \"/_VBA_PROJECT_CUR/\");\n\t\tif(newpath.slice(-1) !== \"/\") CFB.utils.cfb_add(cfb, newpath, vba.FileIndex[i].content);\n\t});\n}\n\nvar VBAFMTS = [ \"xlsb\", \"xlsm\", \"xlam\", \"biff8\", \"xla\" ];\n\nRELS.DS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/dialogsheet\";\nRELS.MS = \"http://schemas.microsoft.com/office/2006/relationships/xlMacrosheet\";\n\n/* macro and dialog sheet stubs */\nfunction parse_ds_bin() { return {'!type':'dialog'}; }\nfunction parse_ds_xml() { return {'!type':'dialog'}; }\nfunction parse_ms_bin() { return {'!type':'macro'}; }\nfunction parse_ms_xml() { return {'!type':'macro'}; }\n/* TODO: it will be useful to parse the function str */\nvar rc_to_a1 = (function(){\n\tvar rcregex = /(^|[^A-Za-z_])R(\\[?-?\\d+\\]|[1-9]\\d*|)C(\\[?-?\\d+\\]|[1-9]\\d*|)(?![A-Za-z0-9_])/g;\n\tvar rcbase = ({r:0,c:0});\n\tfunction rcfunc($$,$1,$2,$3) {\n\t\tvar cRel = false, rRel = false;\n\n\t\tif($2.length == 0) rRel = true;\n\t\telse if($2.charAt(0) == \"[\") { rRel = true; $2 = $2.slice(1, -1); }\n\n\t\tif($3.length == 0) cRel = true;\n\t\telse if($3.charAt(0) == \"[\") { cRel = true; $3 = $3.slice(1, -1); }\n\n\t\tvar R = $2.length>0?parseInt($2,10)|0:0, C = $3.length>0?parseInt($3,10)|0:0;\n\n\t\tif(cRel) C += rcbase.c; else --C;\n\t\tif(rRel) R += rcbase.r; else --R;\n\t\treturn $1 + (cRel ? \"\" : \"$\") + encode_col(C) + (rRel ? \"\" : \"$\") + encode_row(R);\n\t}\n\treturn function rc_to_a1(fstr, base) {\n\t\trcbase = base;\n\t\treturn fstr.replace(rcregex, rcfunc);\n\t};\n})();\n\nvar crefregex = /(^|[^._A-Z0-9])([$]?)([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])([$]?)(10[0-3]\\d{4}|104[0-7]\\d{3}|1048[0-4]\\d{2}|10485[0-6]\\d|104857[0-6]|[1-9]\\d{0,5})(?![_.\\(A-Za-z0-9])/g;\nvar a1_to_rc =(function(){\n\treturn function a1_to_rc(fstr, base) {\n\t\treturn fstr.replace(crefregex, function($0, $1, $2, $3, $4, $5) {\n\t\t\tvar c = decode_col($3) - ($2 ? 0 : base.c);\n\t\t\tvar r = decode_row($5) - ($4 ? 0 : base.r);\n\t\t\tvar R = (r == 0 ? \"\" : !$4 ? \"[\" + r + \"]\" : (r+1));\n\t\t\tvar C = (c == 0 ? \"\" : !$2 ? \"[\" + c + \"]\" : (c+1));\n\t\t\treturn $1 + \"R\" + R + \"C\" + C;\n\t\t});\n\t};\n})();\n\n/* no defined name can collide with a valid cell address A1:XFD1048576 ... except LOG10! */\nfunction shift_formula_str(f, delta) {\n\treturn f.replace(crefregex, function($0, $1, $2, $3, $4, $5) {\n\t\treturn $1+($2==\"$\" ? $2+$3 : encode_col(decode_col($3)+delta.c))+($4==\"$\" ? $4+$5 : encode_row(decode_row($5) + delta.r));\n\t});\n}\n\nfunction shift_formula_xlsx(f, range, cell) {\n\tvar r = decode_range(range), s = r.s, c = decode_cell(cell);\n\tvar delta = {r:c.r - s.r, c:c.c - s.c};\n\treturn shift_formula_str(f, delta);\n}\n\n/* TODO: parse formula */\nfunction fuzzyfmla(f) {\n\tif(f.length == 1) return false;\n\treturn true;\n}\n\nfunction _xlfn(f) {\n\treturn f.replace(/_xlfn\\./g,\"\");\n}\nfunction parseread1(blob) { blob.l+=1; return; }\n\n/* [MS-XLS] 2.5.51 */\nfunction parse_ColRelU(blob, length) {\n\tvar c = blob.read_shift(length == 1 ? 1 : 2);\n\treturn [c & 0x3FFF, (c >> 14) & 1, (c >> 15) & 1];\n}\n\n/* [MS-XLS] 2.5.198.105 ; [MS-XLSB] 2.5.97.89 */\nfunction parse_RgceArea(blob, length, opts) {\n\tvar w = 2;\n\tif(opts) {\n\t\tif(opts.biff >= 2 && opts.biff <= 5) return parse_RgceArea_BIFF2(blob, length, opts);\n\t\telse if(opts.biff == 12) w = 4;\n\t}\n\tvar r=blob.read_shift(w), R=blob.read_shift(w);\n\tvar c=parse_ColRelU(blob, 2);\n\tvar C=parse_ColRelU(blob, 2);\n\treturn { s:{r:r, c:c[0], cRel:c[1], rRel:c[2]}, e:{r:R, c:C[0], cRel:C[1], rRel:C[2]} };\n}\n/* BIFF 2-5 encodes flags in the row field */\nfunction parse_RgceArea_BIFF2(blob) {\n\tvar r=parse_ColRelU(blob, 2), R=parse_ColRelU(blob, 2);\n\tvar c=blob.read_shift(1);\n\tvar C=blob.read_shift(1);\n\treturn { s:{r:r[0], c:c, cRel:r[1], rRel:r[2]}, e:{r:R[0], c:C, cRel:R[1], rRel:R[2]} };\n}\n\n/* [MS-XLS] 2.5.198.105 ; [MS-XLSB] 2.5.97.90 */\nfunction parse_RgceAreaRel(blob, length, opts) {\n\tif(opts.biff < 8) return parse_RgceArea_BIFF2(blob, length, opts);\n\tvar r=blob.read_shift(opts.biff == 12 ? 4 : 2), R=blob.read_shift(opts.biff == 12 ? 4 : 2);\n\tvar c=parse_ColRelU(blob, 2);\n\tvar C=parse_ColRelU(blob, 2);\n\treturn { s:{r:r, c:c[0], cRel:c[1], rRel:c[2]}, e:{r:R, c:C[0], cRel:C[1], rRel:C[2]} };\n}\n\n/* [MS-XLS] 2.5.198.109 ; [MS-XLSB] 2.5.97.91 */\nfunction parse_RgceLoc(blob, length, opts) {\n\tif(opts && opts.biff >= 2 && opts.biff <= 5) return parse_RgceLoc_BIFF2(blob, length, opts);\n\tvar r = blob.read_shift(opts && opts.biff == 12 ? 4 : 2);\n\tvar c = parse_ColRelU(blob, 2);\n\treturn {r:r, c:c[0], cRel:c[1], rRel:c[2]};\n}\nfunction parse_RgceLoc_BIFF2(blob) {\n\tvar r = parse_ColRelU(blob, 2);\n\tvar c = blob.read_shift(1);\n\treturn {r:r[0], c:c, cRel:r[1], rRel:r[2]};\n}\n\n/* [MS-XLS] 2.5.198.107, 2.5.47 */\nfunction parse_RgceElfLoc(blob) {\n\tvar r = blob.read_shift(2);\n\tvar c = blob.read_shift(2);\n\treturn {r:r, c:c & 0xFF, fQuoted:!!(c & 0x4000), cRel:c>>15, rRel:c>>15 };\n}\n\n/* [MS-XLS] 2.5.198.111 ; [MS-XLSB] 2.5.97.92 TODO */\nfunction parse_RgceLocRel(blob, length, opts) {\n\tvar biff = opts && opts.biff ? opts.biff : 8;\n\tif(biff >= 2 && biff <= 5) return parse_RgceLocRel_BIFF2(blob, length, opts);\n\tvar r = blob.read_shift(biff >= 12 ? 4 : 2);\n\tvar cl = blob.read_shift(2);\n\tvar cRel = (cl & 0x4000) >> 14, rRel = (cl & 0x8000) >> 15;\n\tcl &= 0x3FFF;\n\tif(rRel == 1) while(r > 0x7FFFF) r -= 0x100000;\n\tif(cRel == 1) while(cl > 0x1FFF) cl = cl - 0x4000;\n\treturn {r:r,c:cl,cRel:cRel,rRel:rRel};\n}\nfunction parse_RgceLocRel_BIFF2(blob) {\n\tvar rl = blob.read_shift(2);\n\tvar c = blob.read_shift(1);\n\tvar rRel = (rl & 0x8000) >> 15, cRel = (rl & 0x4000) >> 14;\n\trl &= 0x3FFF;\n\tif(rRel == 1 && rl >= 0x2000) rl = rl - 0x4000;\n\tif(cRel == 1 && c >= 0x80) c = c - 0x100;\n\treturn {r:rl,c:c,cRel:cRel,rRel:rRel};\n}\n\n/* [MS-XLS] 2.5.198.27 ; [MS-XLSB] 2.5.97.18 */\nfunction parse_PtgArea(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar area = parse_RgceArea(blob, opts.biff >= 2 && opts.biff <= 5 ? 6 : 8, opts);\n\treturn [type, area];\n}\n\n/* [MS-XLS] 2.5.198.28 ; [MS-XLSB] 2.5.97.19 */\nfunction parse_PtgArea3d(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar ixti = blob.read_shift(2, 'i');\n\tvar w = 8;\n\tif(opts) switch(opts.biff) {\n\t\tcase 5: blob.l += 12; w = 6; break;\n\t\tcase 12: w = 12; break;\n\t}\n\tvar area = parse_RgceArea(blob, w, opts);\n\treturn [type, ixti, area];\n}\n\n/* [MS-XLS] 2.5.198.29 ; [MS-XLSB] 2.5.97.20 */\nfunction parse_PtgAreaErr(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tblob.l += opts && (opts.biff > 8) ? 12 : (opts.biff < 8 ? 6 : 8);\n\treturn [type];\n}\n/* [MS-XLS] 2.5.198.30 ; [MS-XLSB] 2.5.97.21 */\nfunction parse_PtgAreaErr3d(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar ixti = blob.read_shift(2);\n\tvar w = 8;\n\tif(opts) switch(opts.biff) {\n\t\tcase 5: blob.l += 12; w = 6; break;\n\t\tcase 12: w = 12; break;\n\t}\n\tblob.l += w;\n\treturn [type, ixti];\n}\n\n/* [MS-XLS] 2.5.198.31 ; [MS-XLSB] 2.5.97.22 */\nfunction parse_PtgAreaN(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar area = parse_RgceAreaRel(blob, length - 1, opts);\n\treturn [type, area];\n}\n\n/* [MS-XLS] 2.5.198.32 ; [MS-XLSB] 2.5.97.23 */\nfunction parse_PtgArray(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tblob.l += opts.biff == 2 ? 6 : opts.biff == 12 ? 14 : 7;\n\treturn [type];\n}\n\n/* [MS-XLS] 2.5.198.33 ; [MS-XLSB] 2.5.97.24 */\nfunction parse_PtgAttrBaxcel(blob) {\n\tvar bitSemi = blob[blob.l+1] & 0x01; /* 1 = volatile */\n\tvar bitBaxcel = 1;\n\tblob.l += 4;\n\treturn [bitSemi, bitBaxcel];\n}\n\n/* [MS-XLS] 2.5.198.34 ; [MS-XLSB] 2.5.97.25 */\nfunction parse_PtgAttrChoose(blob, length, opts) {\n\tblob.l +=2;\n\tvar offset = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);\n\tvar o = [];\n\t/* offset is 1 less than the number of elements */\n\tfor(var i = 0; i <= offset; ++i) o.push(blob.read_shift(opts && opts.biff == 2 ? 1 : 2));\n\treturn o;\n}\n\n/* [MS-XLS] 2.5.198.35 ; [MS-XLSB] 2.5.97.26 */\nfunction parse_PtgAttrGoto(blob, length, opts) {\n\tvar bitGoto = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n\tblob.l += 2;\n\treturn [bitGoto, blob.read_shift(opts && opts.biff == 2 ? 1 : 2)];\n}\n\n/* [MS-XLS] 2.5.198.36 ; [MS-XLSB] 2.5.97.27 */\nfunction parse_PtgAttrIf(blob, length, opts) {\n\tvar bitIf = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n\tblob.l += 2;\n\treturn [bitIf, blob.read_shift(opts && opts.biff == 2 ? 1 : 2)];\n}\n\n/* [MS-XLSB] 2.5.97.28 */\nfunction parse_PtgAttrIfError(blob) {\n\tvar bitIf = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n\tblob.l += 2;\n\treturn [bitIf, blob.read_shift(2)];\n}\n\n/* [MS-XLS] 2.5.198.37 ; [MS-XLSB] 2.5.97.29 */\nfunction parse_PtgAttrSemi(blob, length, opts) {\n\tvar bitSemi = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n\tblob.l += opts && opts.biff == 2 ? 3 : 4;\n\treturn [bitSemi];\n}\n\n/* [MS-XLS] 2.5.198.40 ; [MS-XLSB] 2.5.97.32 */\nfunction parse_PtgAttrSpaceType(blob) {\n\tvar type = blob.read_shift(1), cch = blob.read_shift(1);\n\treturn [type, cch];\n}\n\n/* [MS-XLS] 2.5.198.38 ; [MS-XLSB] 2.5.97.30 */\nfunction parse_PtgAttrSpace(blob) {\n\tblob.read_shift(2);\n\treturn parse_PtgAttrSpaceType(blob, 2);\n}\n\n/* [MS-XLS] 2.5.198.39 ; [MS-XLSB] 2.5.97.31 */\nfunction parse_PtgAttrSpaceSemi(blob) {\n\tblob.read_shift(2);\n\treturn parse_PtgAttrSpaceType(blob, 2);\n}\n\n/* [MS-XLS] 2.5.198.84 ; [MS-XLSB] 2.5.97.68 TODO */\nfunction parse_PtgRef(blob, length, opts) {\n\t//var ptg = blob[blob.l] & 0x1F;\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar loc = parse_RgceLoc(blob, 0, opts);\n\treturn [type, loc];\n}\n\n/* [MS-XLS] 2.5.198.88 ; [MS-XLSB] 2.5.97.72 TODO */\nfunction parse_PtgRefN(blob, length, opts) {\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar loc = parse_RgceLocRel(blob, 0, opts);\n\treturn [type, loc];\n}\n\n/* [MS-XLS] 2.5.198.85 ; [MS-XLSB] 2.5.97.69 TODO */\nfunction parse_PtgRef3d(blob, length, opts) {\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar ixti = blob.read_shift(2); // XtiIndex\n\tif(opts && opts.biff == 5) blob.l += 12;\n\tvar loc = parse_RgceLoc(blob, 0, opts); // TODO: or RgceLocRel\n\treturn [type, ixti, loc];\n}\n\n\n/* [MS-XLS] 2.5.198.62 ; [MS-XLSB] 2.5.97.45 TODO */\nfunction parse_PtgFunc(blob, length, opts) {\n\t//var ptg = blob[blob.l] & 0x1F;\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar iftab = blob.read_shift(opts && opts.biff <= 3 ? 1 : 2);\n\treturn [FtabArgc[iftab], Ftab[iftab], type];\n}\n/* [MS-XLS] 2.5.198.63 ; [MS-XLSB] 2.5.97.46 TODO */\nfunction parse_PtgFuncVar(blob, length, opts) {\n\tvar type = blob[blob.l++];\n\tvar cparams = blob.read_shift(1), tab = opts && opts.biff <= 3 ? [(type == 0x58 ? -1 : 0), blob.read_shift(1)]: parsetab(blob);\n\treturn [cparams, (tab[0] === 0 ? Ftab : Cetab)[tab[1]]];\n}\n\nfunction parsetab(blob) {\n\treturn [blob[blob.l+1]>>7, blob.read_shift(2) & 0x7FFF];\n}\n\n/* [MS-XLS] 2.5.198.41 ; [MS-XLSB] 2.5.97.33 */\nfunction parse_PtgAttrSum(blob, length, opts) {\n\tblob.l += opts && opts.biff == 2 ? 3 : 4; return;\n}\n\n/* [MS-XLS] 2.5.198.58 ; [MS-XLSB] 2.5.97.40 */\nfunction parse_PtgExp(blob, length, opts) {\n\tblob.l++;\n\tif(opts && opts.biff == 12) return [blob.read_shift(4, 'i'), 0];\n\tvar row = blob.read_shift(2);\n\tvar col = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);\n\treturn [row, col];\n}\n\n/* [MS-XLS] 2.5.198.57 ; [MS-XLSB] 2.5.97.39 */\nfunction parse_PtgErr(blob) { blob.l++; return BErr[blob.read_shift(1)]; }\n\n/* [MS-XLS] 2.5.198.66 ; [MS-XLSB] 2.5.97.49 */\nfunction parse_PtgInt(blob) { blob.l++; return blob.read_shift(2); }\n\n/* [MS-XLS] 2.5.198.42 ; [MS-XLSB] 2.5.97.34 */\nfunction parse_PtgBool(blob) { blob.l++; return blob.read_shift(1)!==0;}\n\n/* [MS-XLS] 2.5.198.79 ; [MS-XLSB] 2.5.97.63 */\nfunction parse_PtgNum(blob) { blob.l++; return parse_Xnum(blob, 8); }\n\n/* [MS-XLS] 2.5.198.89 ; [MS-XLSB] 2.5.97.74 */\nfunction parse_PtgStr(blob, length, opts) { blob.l++; return parse_ShortXLUnicodeString(blob, length-1, opts); }\n\n/* [MS-XLS] 2.5.192.112 + 2.5.192.11{3,4,5,6,7} */\n/* [MS-XLSB] 2.5.97.93 + 2.5.97.9{4,5,6,7} */\nfunction parse_SerAr(blob, biff) {\n\tvar val = [blob.read_shift(1)];\n\tif(biff == 12) switch(val[0]) {\n\t\tcase 0x02: val[0] = 0x04; break; /* SerBool */\n\t\tcase 0x04: val[0] = 0x10; break; /* SerErr */\n\t\tcase 0x00: val[0] = 0x01; break; /* SerNum */\n\t\tcase 0x01: val[0] = 0x02; break; /* SerStr */\n\t}\n\tswitch(val[0]) {\n\t\tcase 0x04: /* SerBool -- boolean */\n\t\t\tval[1] = parsebool(blob, 1) ? 'TRUE' : 'FALSE';\n\t\t\tif(biff != 12) blob.l += 7; break;\n\t\tcase 0x25: /* appears to be an alias */\n\t\tcase 0x10: /* SerErr -- error */\n\t\t\tval[1] = BErr[blob[blob.l]];\n\t\t\tblob.l += ((biff == 12) ? 4 : 8); break;\n\t\tcase 0x00: /* SerNil -- honestly, I'm not sure how to reproduce this */\n\t\t\tblob.l += 8; break;\n\t\tcase 0x01: /* SerNum -- Xnum */\n\t\t\tval[1] = parse_Xnum(blob, 8); break;\n\t\tcase 0x02: /* SerStr -- XLUnicodeString (<256 chars) */\n\t\t\tval[1] = parse_XLUnicodeString2(blob, 0, {biff:biff > 0 && biff < 8 ? 2 : biff}); break;\n\t\tdefault: throw new Error(\"Bad SerAr: \" + val[0]); /* Unreachable */\n\t}\n\treturn val;\n}\n\n/* [MS-XLS] 2.5.198.61 ; [MS-XLSB] 2.5.97.44 */\nfunction parse_PtgExtraMem(blob, cce, opts) {\n\tvar count = blob.read_shift((opts.biff == 12) ? 4 : 2);\n\tvar out = [];\n\tfor(var i = 0; i != count; ++i) out.push(((opts.biff == 12) ? parse_UncheckedRfX : parse_Ref8U)(blob, 8));\n\treturn out;\n}\n\n/* [MS-XLS] 2.5.198.59 ; [MS-XLSB] 2.5.97.41 */\nfunction parse_PtgExtraArray(blob, length, opts) {\n\tvar rows = 0, cols = 0;\n\tif(opts.biff == 12) {\n\t\trows = blob.read_shift(4); // DRw\n\t\tcols = blob.read_shift(4); // DCol\n\t} else {\n\t\tcols = 1 + blob.read_shift(1); //DColByteU\n\t\trows = 1 + blob.read_shift(2); //DRw\n\t}\n\tif(opts.biff >= 2 && opts.biff < 8) { --rows; if(--cols == 0) cols = 0x100; }\n\t// $FlowIgnore\n\tfor(var i = 0, o = []; i != rows && (o[i] = []); ++i)\n\t\tfor(var j = 0; j != cols; ++j) o[i][j] = parse_SerAr(blob, opts.biff);\n\treturn o;\n}\n\n/* [MS-XLS] 2.5.198.76 ; [MS-XLSB] 2.5.97.60 */\nfunction parse_PtgName(blob, length, opts) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar w = (!opts || (opts.biff >= 8)) ? 4 : 2;\n\tvar nameindex = blob.read_shift(w);\n\tswitch(opts.biff) {\n\t\tcase 2: blob.l += 5; break;\n\t\tcase 3: case 4: blob.l += 8; break;\n\t\tcase 5: blob.l += 12; break;\n\t}\n\treturn [type, 0, nameindex];\n}\n\n/* [MS-XLS] 2.5.198.77 ; [MS-XLSB] 2.5.97.61 */\nfunction parse_PtgNameX(blob, length, opts) {\n\tif(opts.biff == 5) return parse_PtgNameX_BIFF5(blob, length, opts);\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar ixti = blob.read_shift(2); // XtiIndex\n\tvar nameindex = blob.read_shift(4);\n\treturn [type, ixti, nameindex];\n}\nfunction parse_PtgNameX_BIFF5(blob) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar ixti = blob.read_shift(2, 'i'); // XtiIndex\n\tblob.l += 8;\n\tvar nameindex = blob.read_shift(2);\n\tblob.l += 12;\n\treturn [type, ixti, nameindex];\n}\n\n/* [MS-XLS] 2.5.198.70 ; [MS-XLSB] 2.5.97.54 */\nfunction parse_PtgMemArea(blob, length, opts) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tblob.l += (opts && opts.biff == 2 ? 3 : 4);\n\tvar cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);\n\treturn [type, cce];\n}\n\n/* [MS-XLS] 2.5.198.72 ; [MS-XLSB] 2.5.97.56 */\nfunction parse_PtgMemFunc(blob, length, opts) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);\n\treturn [type, cce];\n}\n\n\n/* [MS-XLS] 2.5.198.86 ; [MS-XLSB] 2.5.97.69 */\nfunction parse_PtgRefErr(blob, length, opts) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tblob.l += 4;\n\tif(opts.biff < 8) blob.l--;\n\tif(opts.biff == 12) blob.l += 2;\n\treturn [type];\n}\n\n/* [MS-XLS] 2.5.198.87 ; [MS-XLSB] 2.5.97.71 */\nfunction parse_PtgRefErr3d(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar ixti = blob.read_shift(2);\n\tvar w = 4;\n\tif(opts) switch(opts.biff) {\n\t\tcase 5: w = 15; break;\n\t\tcase 12: w = 6; break;\n\t}\n\tblob.l += w;\n\treturn [type, ixti];\n}\n\n/* [MS-XLS] 2.5.198.71 ; [MS-XLSB] 2.5.97.55 */\nvar parse_PtgMemErr = parsenoop;\n/* [MS-XLS] 2.5.198.73 ; [MS-XLSB] 2.5.97.57 */\nvar parse_PtgMemNoMem = parsenoop;\n/* [MS-XLS] 2.5.198.92 */\nvar parse_PtgTbl = parsenoop;\n\nfunction parse_PtgElfLoc(blob, length, opts) {\n\tblob.l += 2;\n\treturn [parse_RgceElfLoc(blob, 4, opts)];\n}\nfunction parse_PtgElfNoop(blob) {\n\tblob.l += 6;\n\treturn [];\n}\n/* [MS-XLS] 2.5.198.46 */\nvar parse_PtgElfCol = parse_PtgElfLoc;\n/* [MS-XLS] 2.5.198.47 */\nvar parse_PtgElfColS = parse_PtgElfNoop;\n/* [MS-XLS] 2.5.198.48 */\nvar parse_PtgElfColSV = parse_PtgElfNoop;\n/* [MS-XLS] 2.5.198.49 */\nvar parse_PtgElfColV = parse_PtgElfLoc;\n/* [MS-XLS] 2.5.198.50 */\nfunction parse_PtgElfLel(blob) {\n\tblob.l += 2;\n\treturn [parseuint16(blob), blob.read_shift(2) & 0x01];\n}\n/* [MS-XLS] 2.5.198.51 */\nvar parse_PtgElfRadical = parse_PtgElfLoc;\n/* [MS-XLS] 2.5.198.52 */\nvar parse_PtgElfRadicalLel = parse_PtgElfLel;\n/* [MS-XLS] 2.5.198.53 */\nvar parse_PtgElfRadicalS = parse_PtgElfNoop;\n/* [MS-XLS] 2.5.198.54 */\nvar parse_PtgElfRw = parse_PtgElfLoc;\n/* [MS-XLS] 2.5.198.55 */\nvar parse_PtgElfRwV = parse_PtgElfLoc;\n\n/* [MS-XLSB] 2.5.97.52 TODO */\nvar PtgListRT = [\n\t\"Data\",\n\t\"All\",\n\t\"Headers\",\n\t\"??\",\n\t\"?Data2\",\n\t\"??\",\n\t\"?DataHeaders\",\n\t\"??\",\n\t\"Totals\",\n\t\"??\",\n\t\"??\",\n\t\"??\",\n\t\"?DataTotals\",\n\t\"??\",\n\t\"??\",\n\t\"??\",\n\t\"?Current\"\n];\nfunction parse_PtgList(blob) {\n\tblob.l += 2;\n\tvar ixti = blob.read_shift(2);\n\tvar flags = blob.read_shift(2);\n\tvar idx = blob.read_shift(4);\n\tvar c = blob.read_shift(2);\n\tvar C = blob.read_shift(2);\n\tvar rt = PtgListRT[(flags >> 2) & 0x1F];\n\treturn {ixti: ixti, coltype:(flags&0x3), rt:rt, idx:idx, c:c, C:C};\n}\n/* [MS-XLS] 2.5.198.91 ; [MS-XLSB] 2.5.97.76 */\nfunction parse_PtgSxName(blob) {\n\tblob.l += 2;\n\treturn [blob.read_shift(4)];\n}\n\n/* [XLS] old spec */\nfunction parse_PtgSheet(blob, length, opts) {\n\tblob.l += 5;\n\tblob.l += 2;\n\tblob.l += (opts.biff == 2 ? 1 : 4);\n\treturn [\"PTGSHEET\"];\n}\nfunction parse_PtgEndSheet(blob, length, opts) {\n\tblob.l += (opts.biff == 2 ? 4 : 5);\n\treturn [\"PTGENDSHEET\"];\n}\nfunction parse_PtgMemAreaN(blob) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar cce = blob.read_shift(2);\n\treturn [type, cce];\n}\nfunction parse_PtgMemNoMemN(blob) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar cce = blob.read_shift(2);\n\treturn [type, cce];\n}\nfunction parse_PtgAttrNoop(blob) {\n\tblob.l += 4;\n\treturn [0, 0];\n}\n\n/* [MS-XLS] 2.5.198.25 ; [MS-XLSB] 2.5.97.16 */\nvar PtgTypes = {\n0x01: { n:'PtgExp', f:parse_PtgExp },\n0x02: { n:'PtgTbl', f:parse_PtgTbl },\n0x03: { n:'PtgAdd', f:parseread1 },\n0x04: { n:'PtgSub', f:parseread1 },\n0x05: { n:'PtgMul', f:parseread1 },\n0x06: { n:'PtgDiv', f:parseread1 },\n0x07: { n:'PtgPower', f:parseread1 },\n0x08: { n:'PtgConcat', f:parseread1 },\n0x09: { n:'PtgLt', f:parseread1 },\n0x0A: { n:'PtgLe', f:parseread1 },\n0x0B: { n:'PtgEq', f:parseread1 },\n0x0C: { n:'PtgGe', f:parseread1 },\n0x0D: { n:'PtgGt', f:parseread1 },\n0x0E: { n:'PtgNe', f:parseread1 },\n0x0F: { n:'PtgIsect', f:parseread1 },\n0x10: { n:'PtgUnion', f:parseread1 },\n0x11: { n:'PtgRange', f:parseread1 },\n0x12: { n:'PtgUplus', f:parseread1 },\n0x13: { n:'PtgUminus', f:parseread1 },\n0x14: { n:'PtgPercent', f:parseread1 },\n0x15: { n:'PtgParen', f:parseread1 },\n0x16: { n:'PtgMissArg', f:parseread1 },\n0x17: { n:'PtgStr', f:parse_PtgStr },\n0x1A: { n:'PtgSheet', f:parse_PtgSheet },\n0x1B: { n:'PtgEndSheet', f:parse_PtgEndSheet },\n0x1C: { n:'PtgErr', f:parse_PtgErr },\n0x1D: { n:'PtgBool', f:parse_PtgBool },\n0x1E: { n:'PtgInt', f:parse_PtgInt },\n0x1F: { n:'PtgNum', f:parse_PtgNum },\n0x20: { n:'PtgArray', f:parse_PtgArray },\n0x21: { n:'PtgFunc', f:parse_PtgFunc },\n0x22: { n:'PtgFuncVar', f:parse_PtgFuncVar },\n0x23: { n:'PtgName', f:parse_PtgName },\n0x24: { n:'PtgRef', f:parse_PtgRef },\n0x25: { n:'PtgArea', f:parse_PtgArea },\n0x26: { n:'PtgMemArea', f:parse_PtgMemArea },\n0x27: { n:'PtgMemErr', f:parse_PtgMemErr },\n0x28: { n:'PtgMemNoMem', f:parse_PtgMemNoMem },\n0x29: { n:'PtgMemFunc', f:parse_PtgMemFunc },\n0x2A: { n:'PtgRefErr', f:parse_PtgRefErr },\n0x2B: { n:'PtgAreaErr', f:parse_PtgAreaErr },\n0x2C: { n:'PtgRefN', f:parse_PtgRefN },\n0x2D: { n:'PtgAreaN', f:parse_PtgAreaN },\n0x2E: { n:'PtgMemAreaN', f:parse_PtgMemAreaN },\n0x2F: { n:'PtgMemNoMemN', f:parse_PtgMemNoMemN },\n0x39: { n:'PtgNameX', f:parse_PtgNameX },\n0x3A: { n:'PtgRef3d', f:parse_PtgRef3d },\n0x3B: { n:'PtgArea3d', f:parse_PtgArea3d },\n0x3C: { n:'PtgRefErr3d', f:parse_PtgRefErr3d },\n0x3D: { n:'PtgAreaErr3d', f:parse_PtgAreaErr3d },\n0xFF: {}\n};\n/* These are duplicated in the PtgTypes table */\nvar PtgDupes = {\n0x40: 0x20, 0x60: 0x20,\n0x41: 0x21, 0x61: 0x21,\n0x42: 0x22, 0x62: 0x22,\n0x43: 0x23, 0x63: 0x23,\n0x44: 0x24, 0x64: 0x24,\n0x45: 0x25, 0x65: 0x25,\n0x46: 0x26, 0x66: 0x26,\n0x47: 0x27, 0x67: 0x27,\n0x48: 0x28, 0x68: 0x28,\n0x49: 0x29, 0x69: 0x29,\n0x4A: 0x2A, 0x6A: 0x2A,\n0x4B: 0x2B, 0x6B: 0x2B,\n0x4C: 0x2C, 0x6C: 0x2C,\n0x4D: 0x2D, 0x6D: 0x2D,\n0x4E: 0x2E, 0x6E: 0x2E,\n0x4F: 0x2F, 0x6F: 0x2F,\n0x58: 0x22, 0x78: 0x22,\n0x59: 0x39, 0x79: 0x39,\n0x5A: 0x3A, 0x7A: 0x3A,\n0x5B: 0x3B, 0x7B: 0x3B,\n0x5C: 0x3C, 0x7C: 0x3C,\n0x5D: 0x3D, 0x7D: 0x3D\n};\n(function(){for(var y in PtgDupes) PtgTypes[y] = PtgTypes[PtgDupes[y]];})();\n\nvar Ptg18 = {\n0x01: { n:'PtgElfLel', f:parse_PtgElfLel },\n0x02: { n:'PtgElfRw', f:parse_PtgElfRw },\n0x03: { n:'PtgElfCol', f:parse_PtgElfCol },\n0x06: { n:'PtgElfRwV', f:parse_PtgElfRwV },\n0x07: { n:'PtgElfColV', f:parse_PtgElfColV },\n0x0A: { n:'PtgElfRadical', f:parse_PtgElfRadical },\n0x0B: { n:'PtgElfRadicalS', f:parse_PtgElfRadicalS },\n0x0D: { n:'PtgElfColS', f:parse_PtgElfColS },\n0x0F: { n:'PtgElfColSV', f:parse_PtgElfColSV },\n0x10: { n:'PtgElfRadicalLel', f:parse_PtgElfRadicalLel },\n0x19: { n:'PtgList', f:parse_PtgList },\n0x1D: { n:'PtgSxName', f:parse_PtgSxName },\n0xFF: {}\n};\nvar Ptg19 = {\n0x00: { n:'PtgAttrNoop', f:parse_PtgAttrNoop },\n0x01: { n:'PtgAttrSemi', f:parse_PtgAttrSemi },\n0x02: { n:'PtgAttrIf', f:parse_PtgAttrIf },\n0x04: { n:'PtgAttrChoose', f:parse_PtgAttrChoose },\n0x08: { n:'PtgAttrGoto', f:parse_PtgAttrGoto },\n0x10: { n:'PtgAttrSum', f:parse_PtgAttrSum },\n0x20: { n:'PtgAttrBaxcel', f:parse_PtgAttrBaxcel },\n0x40: { n:'PtgAttrSpace', f:parse_PtgAttrSpace },\n0x41: { n:'PtgAttrSpaceSemi', f:parse_PtgAttrSpaceSemi },\n0x80: { n:'PtgAttrIfError', f:parse_PtgAttrIfError },\n0xFF: {}\n};\nPtg19[0x21] = Ptg19[0x20];\n\n/* [MS-XLS] 2.5.198.103 ; [MS-XLSB] 2.5.97.87 */\nfunction parse_RgbExtra(blob, length, rgce, opts) {\n\tif(opts.biff < 8) return parsenoop(blob, length);\n\tvar target = blob.l + length;\n\tvar o = [];\n\tfor(var i = 0; i !== rgce.length; ++i) {\n\t\tswitch(rgce[i][0]) {\n\t\t\tcase 'PtgArray': /* PtgArray -> PtgExtraArray */\n\t\t\t\trgce[i][1] = parse_PtgExtraArray(blob, 0, opts);\n\t\t\t\to.push(rgce[i][1]);\n\t\t\t\tbreak;\n\t\t\tcase 'PtgMemArea': /* PtgMemArea -> PtgExtraMem */\n\t\t\t\trgce[i][2] = parse_PtgExtraMem(blob, rgce[i][1], opts);\n\t\t\t\to.push(rgce[i][2]);\n\t\t\t\tbreak;\n\t\t\tcase 'PtgExp': /* PtgExp -> PtgExtraCol */\n\t\t\t\tif(opts && opts.biff == 12) {\n\t\t\t\t\trgce[i][1][1] = blob.read_shift(4);\n\t\t\t\t\to.push(rgce[i][1]);\n\t\t\t\t} break;\n\t\t\tcase 'PtgList': /* TODO: PtgList -> PtgExtraList */\n\t\t\tcase 'PtgElfRadicalS': /* TODO: PtgElfRadicalS -> PtgExtraElf */\n\t\t\tcase 'PtgElfColS': /* TODO: PtgElfColS -> PtgExtraElf */\n\t\t\tcase 'PtgElfColSV': /* TODO: PtgElfColSV -> PtgExtraElf */\n\t\t\t\tthrow \"Unsupported \" + rgce[i][0];\n\t\t\tdefault: break;\n\t\t}\n\t}\n\tlength = target - blob.l;\n\t/* note: this is technically an error but Excel disregards */\n\t//if(target !== blob.l && blob.l !== target - length) throw new Error(target + \" != \" + blob.l);\n\tif(length !== 0) o.push(parsenoop(blob, length));\n\treturn o;\n}\n\n/* [MS-XLS] 2.5.198.104 ; [MS-XLSB] 2.5.97.88 */\nfunction parse_Rgce(blob, length, opts) {\n\tvar target = blob.l + length;\n\tvar R, id, ptgs = [];\n\twhile(target != blob.l) {\n\t\tlength = target - blob.l;\n\t\tid = blob[blob.l];\n\t\tR = PtgTypes[id];\n\t\tif(id === 0x18 || id === 0x19) R = (id === 0x18 ? Ptg18 : Ptg19)[blob[blob.l + 1]];\n\t\tif(!R || !R.f) { /*ptgs.push*/(parsenoop(blob, length)); }\n\t\telse { ptgs.push([R.n, R.f(blob, length, opts)]); }\n\t}\n\treturn ptgs;\n}\n\nfunction stringify_array(f) {\n\tvar o = [];\n\tfor(var i = 0; i < f.length; ++i) {\n\t\tvar x = f[i], r = [];\n\t\tfor(var j = 0; j < x.length; ++j) {\n\t\t\tvar y = x[j];\n\t\t\tif(y) switch(y[0]) {\n\t\t\t\t// TODO: handle embedded quotes\n\t\t\t\tcase 0x02:\nr.push('\"' + y[1].replace(/\"/g,'\"\"') + '\"'); break;\n\t\t\t\tdefault: r.push(y[1]);\n\t\t\t} else r.push(\"\");\n\t\t}\n\t\to.push(r.join(\",\"));\n\t}\n\treturn o.join(\";\");\n}\n\n/* [MS-XLS] 2.2.2 ; [MS-XLSB] 2.2.2 TODO */\nvar PtgBinOp = {\n\tPtgAdd: \"+\",\n\tPtgConcat: \"&\",\n\tPtgDiv: \"/\",\n\tPtgEq: \"=\",\n\tPtgGe: \">=\",\n\tPtgGt: \">\",\n\tPtgLe: \"<=\",\n\tPtgLt: \"<\",\n\tPtgMul: \"*\",\n\tPtgNe: \"<>\",\n\tPtgPower: \"^\",\n\tPtgSub: \"-\"\n};\n\n// List of invalid characters needs to be tested further\nvar quoteCharacters = new RegExp(/[^\\w\\u4E00-\\u9FFF\\u3040-\\u30FF]/);\nfunction formula_quote_sheet_name(sname, opts) {\n\tif(!sname && !(opts && opts.biff <= 5 && opts.biff >= 2)) throw new Error(\"empty sheet name\");\n\tif (quoteCharacters.test(sname)) return \"'\" + sname + \"'\";\n\treturn sname;\n}\nfunction get_ixti_raw(supbooks, ixti, opts) {\n\tif(!supbooks) return \"SH33TJSERR0\";\n\tif(opts.biff > 8 && (!supbooks.XTI || !supbooks.XTI[ixti])) return supbooks.SheetNames[ixti];\n\tif(!supbooks.XTI) return \"SH33TJSERR6\";\n\tvar XTI = supbooks.XTI[ixti];\n\tif(opts.biff < 8) {\n\t\tif(ixti > 10000) ixti-= 65536;\n\t\tif(ixti < 0) ixti = -ixti;\n\t\treturn ixti == 0 ? \"\" : supbooks.XTI[ixti - 1];\n\t}\n\tif(!XTI) return \"SH33TJSERR1\";\n\tvar o = \"\";\n\tif(opts.biff > 8) switch(supbooks[XTI[0]][0]) {\n\t\tcase 0x0165: /* 'BrtSupSelf' */\n\t\t\to = XTI[1] == -1 ? \"#REF\" : supbooks.SheetNames[XTI[1]];\n\t\t\treturn XTI[1] == XTI[2] ? o : o + \":\" + supbooks.SheetNames[XTI[2]];\n\t\tcase 0x0166: /* 'BrtSupSame' */\n\t\t\tif(opts.SID != null) return supbooks.SheetNames[opts.SID];\n\t\t\treturn \"SH33TJSSAME\" + supbooks[XTI[0]][0];\n\t\tcase 0x0163: /* 'BrtSupBookSrc' */\n\t\t\t/* falls through */\n\t\tdefault: return \"SH33TJSSRC\" + supbooks[XTI[0]][0];\n\t}\n\tswitch(supbooks[XTI[0]][0][0]) {\n\t\tcase 0x0401:\n\t\t\to = XTI[1] == -1 ? \"#REF\" : (supbooks.SheetNames[XTI[1]] || \"SH33TJSERR3\");\n\t\t\treturn XTI[1] == XTI[2] ? o : o + \":\" + supbooks.SheetNames[XTI[2]];\n\t\tcase 0x3A01: return supbooks[XTI[0]].slice(1).map(function(name) { return name.Name; }).join(\";;\"); //return \"SH33TJSERR8\";\n\t\tdefault:\n\t\t\tif(!supbooks[XTI[0]][0][3]) return \"SH33TJSERR2\";\n\t\t\to = XTI[1] == -1 ? \"#REF\" : (supbooks[XTI[0]][0][3][XTI[1]] || \"SH33TJSERR4\");\n\t\t\treturn XTI[1] == XTI[2] ? o : o + \":\" + supbooks[XTI[0]][0][3][XTI[2]];\n\t}\n}\nfunction get_ixti(supbooks, ixti, opts) {\n\tvar ixtiraw = get_ixti_raw(supbooks, ixti, opts);\n\treturn ixtiraw == \"#REF\" ? ixtiraw : formula_quote_sheet_name(ixtiraw, opts);\n}\nfunction stringify_formula(formula/*Array*/, range, cell, supbooks, opts) {\n\tvar biff = (opts && opts.biff) || 8;\n\tvar _range = /*range != null ? range :*/ {s:{c:0, r:0},e:{c:0, r:0}};\n\tvar stack = [], e1, e2, c, ixti=0, nameidx=0, r, sname=\"\";\n\tif(!formula[0] || !formula[0][0]) return \"\";\n\tvar last_sp = -1, sp = \"\";\n\tfor(var ff = 0, fflen = formula[0].length; ff < fflen; ++ff) {\n\t\tvar f = formula[0][ff];\n\t\tswitch(f[0]) {\n\t\t\tcase 'PtgUminus': /* [MS-XLS] 2.5.198.93 */\n\t\t\t\tstack.push(\"-\" + stack.pop()); break;\n\t\t\tcase 'PtgUplus': /* [MS-XLS] 2.5.198.95 */\n\t\t\t\tstack.push(\"+\" + stack.pop()); break;\n\t\t\tcase 'PtgPercent': /* [MS-XLS] 2.5.198.81 */\n\t\t\t\tstack.push(stack.pop() + \"%\"); break;\n\n\t\t\tcase 'PtgAdd': /* [MS-XLS] 2.5.198.26 */\n\t\t\tcase 'PtgConcat': /* [MS-XLS] 2.5.198.43 */\n\t\t\tcase 'PtgDiv': /* [MS-XLS] 2.5.198.45 */\n\t\t\tcase 'PtgEq': /* [MS-XLS] 2.5.198.56 */\n\t\t\tcase 'PtgGe': /* [MS-XLS] 2.5.198.64 */\n\t\t\tcase 'PtgGt': /* [MS-XLS] 2.5.198.65 */\n\t\t\tcase 'PtgLe': /* [MS-XLS] 2.5.198.68 */\n\t\t\tcase 'PtgLt': /* [MS-XLS] 2.5.198.69 */\n\t\t\tcase 'PtgMul': /* [MS-XLS] 2.5.198.75 */\n\t\t\tcase 'PtgNe': /* [MS-XLS] 2.5.198.78 */\n\t\t\tcase 'PtgPower': /* [MS-XLS] 2.5.198.82 */\n\t\t\tcase 'PtgSub': /* [MS-XLS] 2.5.198.90 */\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tif(last_sp >= 0) {\n\t\t\t\t\tswitch(formula[0][last_sp][1][0]) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\t\tsp = fill(\" \", formula[0][last_sp][1][1]); break;\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\t\tsp = fill(\"\\r\", formula[0][last_sp][1][1]); break;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tsp = \"\";\n\t\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\t\tif(opts.WTF) throw new Error(\"Unexpected PtgAttrSpaceType \" + formula[0][last_sp][1][0]);\n\t\t\t\t\t}\n\t\t\t\t\te2 = e2 + sp;\n\t\t\t\t\tlast_sp = -1;\n\t\t\t\t}\n\t\t\t\tstack.push(e2+PtgBinOp[f[0]]+e1);\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgIsect': /* [MS-XLS] 2.5.198.67 */\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\" \"+e1);\n\t\t\t\tbreak;\n\t\t\tcase 'PtgUnion': /* [MS-XLS] 2.5.198.94 */\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\",\"+e1);\n\t\t\t\tbreak;\n\t\t\tcase 'PtgRange': /* [MS-XLS] 2.5.198.83 */\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\":\"+e1);\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgAttrChoose': /* [MS-XLS] 2.5.198.34 */\n\t\t\t\tbreak;\n\t\t\tcase 'PtgAttrGoto': /* [MS-XLS] 2.5.198.35 */\n\t\t\t\tbreak;\n\t\t\tcase 'PtgAttrIf': /* [MS-XLS] 2.5.198.36 */\n\t\t\t\tbreak;\n\t\t\tcase 'PtgAttrIfError': /* [MS-XLSB] 2.5.97.28 */\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'PtgRef': /* [MS-XLS] 2.5.198.84 */\nc = shift_cell_xls((f[1][1]), _range, opts);\n\t\t\t\tstack.push(encode_cell_xls(c, biff));\n\t\t\t\tbreak;\n\t\t\tcase 'PtgRefN': /* [MS-XLS] 2.5.198.88 */\nc = cell ? shift_cell_xls((f[1][1]), cell, opts) : (f[1][1]);\n\t\t\t\tstack.push(encode_cell_xls(c, biff));\n\t\t\t\tbreak;\n\t\t\tcase 'PtgRef3d': /* [MS-XLS] 2.5.198.85 */\nixti = f[1][1]; c = shift_cell_xls((f[1][2]), _range, opts);\n\t\t\t\tsname = get_ixti(supbooks, ixti, opts);\n\t\t\t\tvar w = sname; /* IE9 fails on defined names */ // eslint-disable-line no-unused-vars\n\t\t\t\tstack.push(sname + \"!\" + encode_cell_xls(c, biff));\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgFunc': /* [MS-XLS] 2.5.198.62 */\n\t\t\tcase 'PtgFuncVar': /* [MS-XLS] 2.5.198.63 */\n\t\t\t\t/* f[1] = [argc, func, type] */\n\t\t\t\tvar argc = (f[1][0]), func = (f[1][1]);\n\t\t\t\tif(!argc) argc = 0;\n\t\t\t\targc &= 0x7F;\n\t\t\t\tvar args = argc == 0 ? [] : stack.slice(-argc);\n\t\t\t\tstack.length -= argc;\n\t\t\t\tif(func === 'User') func = args.shift();\n\t\t\t\tstack.push(func + \"(\" + args.join(\",\") + \")\");\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgBool': /* [MS-XLS] 2.5.198.42 */\n\t\t\t\tstack.push(f[1] ? \"TRUE\" : \"FALSE\"); break;\n\t\t\tcase 'PtgInt': /* [MS-XLS] 2.5.198.66 */\n\t\t\t\tstack.push(f[1]); break;\n\t\t\tcase 'PtgNum': /* [MS-XLS] 2.5.198.79 TODO: precision? */\n\t\t\t\tstack.push(String(f[1])); break;\n\t\t\tcase 'PtgStr': /* [MS-XLS] 2.5.198.89 */\n\t\t\t\t// $FlowIgnore\n\t\t\t\tstack.push('\"' + f[1].replace(/\"/g, '\"\"') + '\"'); break;\n\t\t\tcase 'PtgErr': /* [MS-XLS] 2.5.198.57 */\n\t\t\t\tstack.push(f[1]); break;\n\t\t\tcase 'PtgAreaN': /* [MS-XLS] 2.5.198.31 TODO */\nr = shift_range_xls(f[1][1], cell ? {s:cell} : _range, opts);\n\t\t\t\tstack.push(encode_range_xls((r), opts));\n\t\t\t\tbreak;\n\t\t\tcase 'PtgArea': /* [MS-XLS] 2.5.198.27 TODO: fixed points */\nr = shift_range_xls(f[1][1], _range, opts);\n\t\t\t\tstack.push(encode_range_xls((r), opts));\n\t\t\t\tbreak;\n\t\t\tcase 'PtgArea3d': /* [MS-XLS] 2.5.198.28 TODO */\nixti = f[1][1]; r = f[1][2];\n\t\t\t\tsname = get_ixti(supbooks, ixti, opts);\n\t\t\t\tstack.push(sname + \"!\" + encode_range_xls((r), opts));\n\t\t\t\tbreak;\n\t\t\tcase 'PtgAttrSum': /* [MS-XLS] 2.5.198.41 */\n\t\t\t\tstack.push(\"SUM(\" + stack.pop() + \")\");\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgAttrBaxcel': /* [MS-XLS] 2.5.198.33 */\n\t\t\tcase 'PtgAttrSemi': /* [MS-XLS] 2.5.198.37 */\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgName': /* [MS-XLS] 2.5.198.76 ; [MS-XLSB] 2.5.97.60 TODO: revisions */\n\t\t\t\t/* f[1] = type, 0, nameindex */\n\t\t\t\tnameidx = (f[1][2]);\n\t\t\t\tvar lbl = (supbooks.names||[])[nameidx-1] || (supbooks[0]||[])[nameidx];\n\t\t\t\tvar name = lbl ? lbl.Name : \"SH33TJSNAME\" + String(nameidx);\n\t\t\t\tif(name in XLSXFutureFunctions) name = XLSXFutureFunctions[name];\n\t\t\t\tstack.push(name);\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgNameX': /* [MS-XLS] 2.5.198.77 ; [MS-XLSB] 2.5.97.61 TODO: revisions */\n\t\t\t\t/* f[1] = type, ixti, nameindex */\n\t\t\t\tvar bookidx = (f[1][1]); nameidx = (f[1][2]); var externbook;\n\t\t\t\t/* TODO: Properly handle missing values -- this should be using get_ixti_raw primarily */\n\t\t\t\tif(opts.biff <= 5) {\n\t\t\t\t\tif(bookidx < 0) bookidx = -bookidx;\n\t\t\t\t\tif(supbooks[bookidx]) externbook = supbooks[bookidx][nameidx];\n\t\t\t\t} else {\n\t\t\t\t\tvar o = \"\";\n\t\t\t\t\tif(((supbooks[bookidx]||[])[0]||[])[0] == 0x3A01){/* empty */}\n\t\t\t\t\telse if(((supbooks[bookidx]||[])[0]||[])[0] == 0x0401){\n\t\t\t\t\t\tif(supbooks[bookidx][nameidx] && supbooks[bookidx][nameidx].itab > 0) {\n\t\t\t\t\t\t\to = supbooks.SheetNames[supbooks[bookidx][nameidx].itab-1] + \"!\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse o = supbooks.SheetNames[nameidx-1]+ \"!\";\n\t\t\t\t\tif(supbooks[bookidx] && supbooks[bookidx][nameidx]) o += supbooks[bookidx][nameidx].Name;\n\t\t\t\t\telse if(supbooks[0] && supbooks[0][nameidx]) o += supbooks[0][nameidx].Name;\n\t\t\t\t\telse {\n\t\t\t\t\t\tvar ixtidata = (get_ixti_raw(supbooks, bookidx, opts)||\"\").split(\";;\");\n\t\t\t\t\t\tif(ixtidata[nameidx - 1]) o = ixtidata[nameidx - 1]; // TODO: confirm this is correct\n\t\t\t\t\t\telse o += \"SH33TJSERRX\";\n\t\t\t\t\t}\n\t\t\t\t\tstack.push(o);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(!externbook) externbook = {Name: \"SH33TJSERRY\"};\n\t\t\t\tstack.push(externbook.Name);\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgParen': /* [MS-XLS] 2.5.198.80 */\n\t\t\t\tvar lp = '(', rp = ')';\n\t\t\t\tif(last_sp >= 0) {\n\t\t\t\t\tsp = \"\";\n\t\t\t\t\tswitch(formula[0][last_sp][1][0]) {\n\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\tcase 2: lp = fill(\" \", formula[0][last_sp][1][1]) + lp; break;\n\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\tcase 3: lp = fill(\"\\r\", formula[0][last_sp][1][1]) + lp; break;\n\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\tcase 4: rp = fill(\" \", formula[0][last_sp][1][1]) + rp; break;\n\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\tcase 5: rp = fill(\"\\r\", formula[0][last_sp][1][1]) + rp; break;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\t\tif(opts.WTF) throw new Error(\"Unexpected PtgAttrSpaceType \" + formula[0][last_sp][1][0]);\n\t\t\t\t\t}\n\t\t\t\t\tlast_sp = -1;\n\t\t\t\t}\n\t\t\t\tstack.push(lp + stack.pop() + rp); break;\n\n\t\t\tcase 'PtgRefErr': /* [MS-XLS] 2.5.198.86 */\n\t\t\t\tstack.push('#REF!'); break;\n\n\t\t\tcase 'PtgRefErr3d': /* [MS-XLS] 2.5.198.87 */\n\t\t\t\tstack.push('#REF!'); break;\n\n\t\t\tcase 'PtgExp': /* [MS-XLS] 2.5.198.58 TODO */\n\t\t\t\tc = {c:(f[1][1]),r:(f[1][0])};\n\t\t\t\tvar q = ({c: cell.c, r:cell.r});\n\t\t\t\tif(supbooks.sharedf[encode_cell(c)]) {\n\t\t\t\t\tvar parsedf = (supbooks.sharedf[encode_cell(c)]);\n\t\t\t\t\tstack.push(stringify_formula(parsedf, _range, q, supbooks, opts));\n\t\t\t\t} else {\n\t\t\t\t\tvar fnd = false;\n\t\t\t\t\tfor(e1=0;e1!=supbooks.arrayf.length; ++e1) {\n\t\t\t\t\t\t/* TODO: should be something like range_has */\n\t\t\t\t\t\te2 = supbooks.arrayf[e1];\n\t\t\t\t\t\tif(c.c < e2[0].s.c || c.c > e2[0].e.c) continue;\n\t\t\t\t\t\tif(c.r < e2[0].s.r || c.r > e2[0].e.r) continue;\n\t\t\t\t\t\tstack.push(stringify_formula(e2[1], _range, q, supbooks, opts));\n\t\t\t\t\t\tfnd = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif(!fnd) stack.push(f[1]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgArray': /* [MS-XLS] 2.5.198.32 TODO */\n\t\t\t\tstack.push(\"{\" + stringify_array(f[1]) + \"}\");\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgMemArea': /* [MS-XLS] 2.5.198.70 TODO: confirm this is a non-display */\n\t\t\t\t//stack.push(\"(\" + f[2].map(encode_range).join(\",\") + \")\");\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgAttrSpace': /* [MS-XLS] 2.5.198.38 */\n\t\t\tcase 'PtgAttrSpaceSemi': /* [MS-XLS] 2.5.198.39 */\n\t\t\t\tlast_sp = ff;\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgTbl': /* [MS-XLS] 2.5.198.92 TODO */\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgMemErr': /* [MS-XLS] 2.5.198.71 */\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgMissArg': /* [MS-XLS] 2.5.198.74 */\n\t\t\t\tstack.push(\"\");\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgAreaErr': /* [MS-XLS] 2.5.198.29 */\n\t\t\t\tstack.push(\"#REF!\"); break;\n\n\t\t\tcase 'PtgAreaErr3d': /* [MS-XLS] 2.5.198.30 */\n\t\t\t\tstack.push(\"#REF!\"); break;\n\n\t\t\tcase 'PtgList': /* [MS-XLSB] 2.5.97.52 */\n\t\t\t\t// $FlowIgnore\n\t\t\t\tstack.push(\"Table\" + f[1].idx + \"[#\" + f[1].rt + \"]\");\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgMemAreaN':\n\t\t\tcase 'PtgMemNoMemN':\n\t\t\tcase 'PtgAttrNoop':\n\t\t\tcase 'PtgSheet':\n\t\t\tcase 'PtgEndSheet':\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgMemFunc': /* [MS-XLS] 2.5.198.72 TODO */\n\t\t\t\tbreak;\n\t\t\tcase 'PtgMemNoMem': /* [MS-XLS] 2.5.198.73 TODO */\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgElfCol': /* [MS-XLS] 2.5.198.46 */\n\t\t\tcase 'PtgElfColS': /* [MS-XLS] 2.5.198.47 */\n\t\t\tcase 'PtgElfColSV': /* [MS-XLS] 2.5.198.48 */\n\t\t\tcase 'PtgElfColV': /* [MS-XLS] 2.5.198.49 */\n\t\t\tcase 'PtgElfLel': /* [MS-XLS] 2.5.198.50 */\n\t\t\tcase 'PtgElfRadical': /* [MS-XLS] 2.5.198.51 */\n\t\t\tcase 'PtgElfRadicalLel': /* [MS-XLS] 2.5.198.52 */\n\t\t\tcase 'PtgElfRadicalS': /* [MS-XLS] 2.5.198.53 */\n\t\t\tcase 'PtgElfRw': /* [MS-XLS] 2.5.198.54 */\n\t\t\tcase 'PtgElfRwV': /* [MS-XLS] 2.5.198.55 */\n\t\t\t\tthrow new Error(\"Unsupported ELFs\");\n\n\t\t\tcase 'PtgSxName': /* [MS-XLS] 2.5.198.91 TODO -- find a test case */\n\t\t\t\tthrow new Error('Unrecognized Formula Token: ' + String(f));\n\t\t\tdefault: throw new Error('Unrecognized Formula Token: ' + String(f));\n\t\t}\n\t\tvar PtgNonDisp = ['PtgAttrSpace', 'PtgAttrSpaceSemi', 'PtgAttrGoto'];\n\t\tif(opts.biff != 3) if(last_sp >= 0 && PtgNonDisp.indexOf(formula[0][ff][0]) == -1) {\n\t\t\tf = formula[0][last_sp];\n\t\t\tvar _left = true;\n\t\t\tswitch(f[1][0]) {\n\t\t\t\t/* note: some bad XLSB files omit the PtgParen */\n\t\t\t\tcase 4: _left = false;\n\t\t\t\t/* falls through */\n\t\t\t\tcase 0:\n\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\tsp = fill(\" \", f[1][1]); break;\n\t\t\t\tcase 5: _left = false;\n\t\t\t\t/* falls through */\n\t\t\t\tcase 1:\n\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\tsp = fill(\"\\r\", f[1][1]); break;\n\t\t\t\tdefault:\n\t\t\t\t\tsp = \"\";\n\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\tif(opts.WTF) throw new Error(\"Unexpected PtgAttrSpaceType \" + f[1][0]);\n\t\t\t}\n\t\t\tstack.push((_left ? sp : \"\") + stack.pop() + (_left ? \"\" : sp));\n\t\t\tlast_sp = -1;\n\t\t}\n\t}\n\tif(stack.length > 1 && opts.WTF) throw new Error(\"bad formula stack\");\n\treturn stack[0];\n}\n\n/* [MS-XLS] 2.5.198.1 TODO */\nfunction parse_ArrayParsedFormula(blob, length, opts) {\n\tvar target = blob.l + length, len = opts.biff == 2 ? 1 : 2;\n\tvar rgcb, cce = blob.read_shift(len); // length of rgce\n\tif(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];\n\tvar rgce = parse_Rgce(blob, cce, opts);\n\tif(length !== cce + len) rgcb = parse_RgbExtra(blob, length - cce - len, rgce, opts);\n\tblob.l = target;\n\treturn [rgce, rgcb];\n}\n\n/* [MS-XLS] 2.5.198.3 TODO */\nfunction parse_XLSCellParsedFormula(blob, length, opts) {\n\tvar target = blob.l + length, len = opts.biff == 2 ? 1 : 2;\n\tvar rgcb, cce = blob.read_shift(len); // length of rgce\n\tif(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];\n\tvar rgce = parse_Rgce(blob, cce, opts);\n\tif(length !== cce + len) rgcb = parse_RgbExtra(blob, length - cce - len, rgce, opts);\n\tblob.l = target;\n\treturn [rgce, rgcb];\n}\n\n/* [MS-XLS] 2.5.198.21 */\nfunction parse_NameParsedFormula(blob, length, opts, cce) {\n\tvar target = blob.l + length;\n\tvar rgce = parse_Rgce(blob, cce, opts);\n\tvar rgcb;\n\tif(target !== blob.l) rgcb = parse_RgbExtra(blob, target - blob.l, rgce, opts);\n\treturn [rgce, rgcb];\n}\n\n/* [MS-XLS] 2.5.198.118 TODO */\nfunction parse_SharedParsedFormula(blob, length, opts) {\n\tvar target = blob.l + length;\n\tvar rgcb, cce = blob.read_shift(2); // length of rgce\n\tvar rgce = parse_Rgce(blob, cce, opts);\n\tif(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];\n\tif(length !== cce + 2) rgcb = parse_RgbExtra(blob, target - cce - 2, rgce, opts);\n\treturn [rgce, rgcb];\n}\n\n/* [MS-XLS] 2.5.133 TODO: how to emit empty strings? */\nfunction parse_FormulaValue(blob) {\n\tvar b;\n\tif(__readUInt16LE(blob,blob.l + 6) !== 0xFFFF) return [parse_Xnum(blob),'n'];\n\tswitch(blob[blob.l]) {\n\t\tcase 0x00: blob.l += 8; return [\"String\", 's'];\n\t\tcase 0x01: b = blob[blob.l+2] === 0x1; blob.l += 8; return [b,'b'];\n\t\tcase 0x02: b = blob[blob.l+2]; blob.l += 8; return [b,'e'];\n\t\tcase 0x03: blob.l += 8; return [\"\",'s'];\n\t}\n\treturn [];\n}\nfunction write_FormulaValue(value) {\n\tif(value == null) {\n\t\t// Blank String Value\n\t\tvar o = new_buf(8);\n\t\to.write_shift(1, 0x03);\n\t\to.write_shift(1, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0xFFFF);\n\t\treturn o;\n\t} else if(typeof value == \"number\") return write_Xnum(value);\n\treturn write_Xnum(0);\n}\n\n/* [MS-XLS] 2.4.127 TODO */\nfunction parse_Formula(blob, length, opts) {\n\tvar end = blob.l + length;\n\tvar cell = parse_XLSCell(blob, 6);\n\tif(opts.biff == 2) ++blob.l;\n\tvar val = parse_FormulaValue(blob,8);\n\tvar flags = blob.read_shift(1);\n\tif(opts.biff != 2) {\n\t\tblob.read_shift(1);\n\t\tif(opts.biff >= 5) {\n\t\t\t/*var chn = */blob.read_shift(4);\n\t\t}\n\t}\n\tvar cbf = parse_XLSCellParsedFormula(blob, end - blob.l, opts);\n\treturn {cell:cell, val:val[0], formula:cbf, shared: (flags >> 3) & 1, tt:val[1]};\n}\nfunction write_Formula(cell, R, C, opts, os) {\n\t// Cell\n\tvar o1 = write_XLSCell(R, C, os);\n\n\t// FormulaValue\n\tvar o2 = write_FormulaValue(cell.v);\n\n\t// flags + cache\n\tvar o3 = new_buf(6);\n\tvar flags = 0x01 | 0x20;\n\to3.write_shift(2, flags);\n\to3.write_shift(4, 0);\n\n\t// CellParsedFormula\n\tvar bf = new_buf(cell.bf.length);\n\tfor(var i = 0; i < cell.bf.length; ++i) bf[i] = cell.bf[i];\n\n\tvar out = bconcat([o1, o2, o3, bf]);\n\treturn out;\n}\n\n\n/* XLSB Parsed Formula records have the same shape */\nfunction parse_XLSBParsedFormula(data, length, opts) {\n\tvar cce = data.read_shift(4);\n\tvar rgce = parse_Rgce(data, cce, opts);\n\tvar cb = data.read_shift(4);\n\tvar rgcb = cb > 0 ? parse_RgbExtra(data, cb, rgce, opts) : null;\n\treturn [rgce, rgcb];\n}\n\n/* [MS-XLSB] 2.5.97.1 ArrayParsedFormula */\nvar parse_XLSBArrayParsedFormula = parse_XLSBParsedFormula;\n/* [MS-XLSB] 2.5.97.4 CellParsedFormula */\nvar parse_XLSBCellParsedFormula = parse_XLSBParsedFormula;\n/* [MS-XLSB] 2.5.97.8 DVParsedFormula */\n//var parse_XLSBDVParsedFormula = parse_XLSBParsedFormula;\n/* [MS-XLSB] 2.5.97.9 FRTParsedFormula */\n//var parse_XLSBFRTParsedFormula = parse_XLSBParsedFormula2;\n/* [MS-XLSB] 2.5.97.12 NameParsedFormula */\nvar parse_XLSBNameParsedFormula = parse_XLSBParsedFormula;\n/* [MS-XLSB] 2.5.97.98 SharedParsedFormula */\nvar parse_XLSBSharedParsedFormula = parse_XLSBParsedFormula;\n/* [MS-XLS] 2.5.198.4 */\nvar Cetab = {\n0x0000: 'BEEP',\n0x0001: 'OPEN',\n0x0002: 'OPEN.LINKS',\n0x0003: 'CLOSE.ALL',\n0x0004: 'SAVE',\n0x0005: 'SAVE.AS',\n0x0006: 'FILE.DELETE',\n0x0007: 'PAGE.SETUP',\n0x0008: 'PRINT',\n0x0009: 'PRINTER.SETUP',\n0x000A: 'QUIT',\n0x000B: 'NEW.WINDOW',\n0x000C: 'ARRANGE.ALL',\n0x000D: 'WINDOW.SIZE',\n0x000E: 'WINDOW.MOVE',\n0x000F: 'FULL',\n0x0010: 'CLOSE',\n0x0011: 'RUN',\n0x0016: 'SET.PRINT.AREA',\n0x0017: 'SET.PRINT.TITLES',\n0x0018: 'SET.PAGE.BREAK',\n0x0019: 'REMOVE.PAGE.BREAK',\n0x001A: 'FONT',\n0x001B: 'DISPLAY',\n0x001C: 'PROTECT.DOCUMENT',\n0x001D: 'PRECISION',\n0x001E: 'A1.R1C1',\n0x001F: 'CALCULATE.NOW',\n0x0020: 'CALCULATION',\n0x0022: 'DATA.FIND',\n0x0023: 'EXTRACT',\n0x0024: 'DATA.DELETE',\n0x0025: 'SET.DATABASE',\n0x0026: 'SET.CRITERIA',\n0x0027: 'SORT',\n0x0028: 'DATA.SERIES',\n0x0029: 'TABLE',\n0x002A: 'FORMAT.NUMBER',\n0x002B: 'ALIGNMENT',\n0x002C: 'STYLE',\n0x002D: 'BORDER',\n0x002E: 'CELL.PROTECTION',\n0x002F: 'COLUMN.WIDTH',\n0x0030: 'UNDO',\n0x0031: 'CUT',\n0x0032: 'COPY',\n0x0033: 'PASTE',\n0x0034: 'CLEAR',\n0x0035: 'PASTE.SPECIAL',\n0x0036: 'EDIT.DELETE',\n0x0037: 'INSERT',\n0x0038: 'FILL.RIGHT',\n0x0039: 'FILL.DOWN',\n0x003D: 'DEFINE.NAME',\n0x003E: 'CREATE.NAMES',\n0x003F: 'FORMULA.GOTO',\n0x0040: 'FORMULA.FIND',\n0x0041: 'SELECT.LAST.CELL',\n0x0042: 'SHOW.ACTIVE.CELL',\n0x0043: 'GALLERY.AREA',\n0x0044: 'GALLERY.BAR',\n0x0045: 'GALLERY.COLUMN',\n0x0046: 'GALLERY.LINE',\n0x0047: 'GALLERY.PIE',\n0x0048: 'GALLERY.SCATTER',\n0x0049: 'COMBINATION',\n0x004A: 'PREFERRED',\n0x004B: 'ADD.OVERLAY',\n0x004C: 'GRIDLINES',\n0x004D: 'SET.PREFERRED',\n0x004E: 'AXES',\n0x004F: 'LEGEND',\n0x0050: 'ATTACH.TEXT',\n0x0051: 'ADD.ARROW',\n0x0052: 'SELECT.CHART',\n0x0053: 'SELECT.PLOT.AREA',\n0x0054: 'PATTERNS',\n0x0055: 'MAIN.CHART',\n0x0056: 'OVERLAY',\n0x0057: 'SCALE',\n0x0058: 'FORMAT.LEGEND',\n0x0059: 'FORMAT.TEXT',\n0x005A: 'EDIT.REPEAT',\n0x005B: 'PARSE',\n0x005C: 'JUSTIFY',\n0x005D: 'HIDE',\n0x005E: 'UNHIDE',\n0x005F: 'WORKSPACE',\n0x0060: 'FORMULA',\n0x0061: 'FORMULA.FILL',\n0x0062: 'FORMULA.ARRAY',\n0x0063: 'DATA.FIND.NEXT',\n0x0064: 'DATA.FIND.PREV',\n0x0065: 'FORMULA.FIND.NEXT',\n0x0066: 'FORMULA.FIND.PREV',\n0x0067: 'ACTIVATE',\n0x0068: 'ACTIVATE.NEXT',\n0x0069: 'ACTIVATE.PREV',\n0x006A: 'UNLOCKED.NEXT',\n0x006B: 'UNLOCKED.PREV',\n0x006C: 'COPY.PICTURE',\n0x006D: 'SELECT',\n0x006E: 'DELETE.NAME',\n0x006F: 'DELETE.FORMAT',\n0x0070: 'VLINE',\n0x0071: 'HLINE',\n0x0072: 'VPAGE',\n0x0073: 'HPAGE',\n0x0074: 'VSCROLL',\n0x0075: 'HSCROLL',\n0x0076: 'ALERT',\n0x0077: 'NEW',\n0x0078: 'CANCEL.COPY',\n0x0079: 'SHOW.CLIPBOARD',\n0x007A: 'MESSAGE',\n0x007C: 'PASTE.LINK',\n0x007D: 'APP.ACTIVATE',\n0x007E: 'DELETE.ARROW',\n0x007F: 'ROW.HEIGHT',\n0x0080: 'FORMAT.MOVE',\n0x0081: 'FORMAT.SIZE',\n0x0082: 'FORMULA.REPLACE',\n0x0083: 'SEND.KEYS',\n0x0084: 'SELECT.SPECIAL',\n0x0085: 'APPLY.NAMES',\n0x0086: 'REPLACE.FONT',\n0x0087: 'FREEZE.PANES',\n0x0088: 'SHOW.INFO',\n0x0089: 'SPLIT',\n0x008A: 'ON.WINDOW',\n0x008B: 'ON.DATA',\n0x008C: 'DISABLE.INPUT',\n0x008E: 'OUTLINE',\n0x008F: 'LIST.NAMES',\n0x0090: 'FILE.CLOSE',\n0x0091: 'SAVE.WORKBOOK',\n0x0092: 'DATA.FORM',\n0x0093: 'COPY.CHART',\n0x0094: 'ON.TIME',\n0x0095: 'WAIT',\n0x0096: 'FORMAT.FONT',\n0x0097: 'FILL.UP',\n0x0098: 'FILL.LEFT',\n0x0099: 'DELETE.OVERLAY',\n0x009B: 'SHORT.MENUS',\n0x009F: 'SET.UPDATE.STATUS',\n0x00A1: 'COLOR.PALETTE',\n0x00A2: 'DELETE.STYLE',\n0x00A3: 'WINDOW.RESTORE',\n0x00A4: 'WINDOW.MAXIMIZE',\n0x00A6: 'CHANGE.LINK',\n0x00A7: 'CALCULATE.DOCUMENT',\n0x00A8: 'ON.KEY',\n0x00A9: 'APP.RESTORE',\n0x00AA: 'APP.MOVE',\n0x00AB: 'APP.SIZE',\n0x00AC: 'APP.MINIMIZE',\n0x00AD: 'APP.MAXIMIZE',\n0x00AE: 'BRING.TO.FRONT',\n0x00AF: 'SEND.TO.BACK',\n0x00B9: 'MAIN.CHART.TYPE',\n0x00BA: 'OVERLAY.CHART.TYPE',\n0x00BB: 'SELECT.END',\n0x00BC: 'OPEN.MAIL',\n0x00BD: 'SEND.MAIL',\n0x00BE: 'STANDARD.FONT',\n0x00BF: 'CONSOLIDATE',\n0x00C0: 'SORT.SPECIAL',\n0x00C1: 'GALLERY.3D.AREA',\n0x00C2: 'GALLERY.3D.COLUMN',\n0x00C3: 'GALLERY.3D.LINE',\n0x00C4: 'GALLERY.3D.PIE',\n0x00C5: 'VIEW.3D',\n0x00C6: 'GOAL.SEEK',\n0x00C7: 'WORKGROUP',\n0x00C8: 'FILL.GROUP',\n0x00C9: 'UPDATE.LINK',\n0x00CA: 'PROMOTE',\n0x00CB: 'DEMOTE',\n0x00CC: 'SHOW.DETAIL',\n0x00CE: 'UNGROUP',\n0x00CF: 'OBJECT.PROPERTIES',\n0x00D0: 'SAVE.NEW.OBJECT',\n0x00D1: 'SHARE',\n0x00D2: 'SHARE.NAME',\n0x00D3: 'DUPLICATE',\n0x00D4: 'APPLY.STYLE',\n0x00D5: 'ASSIGN.TO.OBJECT',\n0x00D6: 'OBJECT.PROTECTION',\n0x00D7: 'HIDE.OBJECT',\n0x00D8: 'SET.EXTRACT',\n0x00D9: 'CREATE.PUBLISHER',\n0x00DA: 'SUBSCRIBE.TO',\n0x00DB: 'ATTRIBUTES',\n0x00DC: 'SHOW.TOOLBAR',\n0x00DE: 'PRINT.PREVIEW',\n0x00DF: 'EDIT.COLOR',\n0x00E0: 'SHOW.LEVELS',\n0x00E1: 'FORMAT.MAIN',\n0x00E2: 'FORMAT.OVERLAY',\n0x00E3: 'ON.RECALC',\n0x00E4: 'EDIT.SERIES',\n0x00E5: 'DEFINE.STYLE',\n0x00F0: 'LINE.PRINT',\n0x00F3: 'ENTER.DATA',\n0x00F9: 'GALLERY.RADAR',\n0x00FA: 'MERGE.STYLES',\n0x00FB: 'EDITION.OPTIONS',\n0x00FC: 'PASTE.PICTURE',\n0x00FD: 'PASTE.PICTURE.LINK',\n0x00FE: 'SPELLING',\n0x0100: 'ZOOM',\n0x0103: 'INSERT.OBJECT',\n0x0104: 'WINDOW.MINIMIZE',\n0x0109: 'SOUND.NOTE',\n0x010A: 'SOUND.PLAY',\n0x010B: 'FORMAT.SHAPE',\n0x010C: 'EXTEND.POLYGON',\n0x010D: 'FORMAT.AUTO',\n0x0110: 'GALLERY.3D.BAR',\n0x0111: 'GALLERY.3D.SURFACE',\n0x0112: 'FILL.AUTO',\n0x0114: 'CUSTOMIZE.TOOLBAR',\n0x0115: 'ADD.TOOL',\n0x0116: 'EDIT.OBJECT',\n0x0117: 'ON.DOUBLECLICK',\n0x0118: 'ON.ENTRY',\n0x0119: 'WORKBOOK.ADD',\n0x011A: 'WORKBOOK.MOVE',\n0x011B: 'WORKBOOK.COPY',\n0x011C: 'WORKBOOK.OPTIONS',\n0x011D: 'SAVE.WORKSPACE',\n0x0120: 'CHART.WIZARD',\n0x0121: 'DELETE.TOOL',\n0x0122: 'MOVE.TOOL',\n0x0123: 'WORKBOOK.SELECT',\n0x0124: 'WORKBOOK.ACTIVATE',\n0x0125: 'ASSIGN.TO.TOOL',\n0x0127: 'COPY.TOOL',\n0x0128: 'RESET.TOOL',\n0x0129: 'CONSTRAIN.NUMERIC',\n0x012A: 'PASTE.TOOL',\n0x012E: 'WORKBOOK.NEW',\n0x0131: 'SCENARIO.CELLS',\n0x0132: 'SCENARIO.DELETE',\n0x0133: 'SCENARIO.ADD',\n0x0134: 'SCENARIO.EDIT',\n0x0135: 'SCENARIO.SHOW',\n0x0136: 'SCENARIO.SHOW.NEXT',\n0x0137: 'SCENARIO.SUMMARY',\n0x0138: 'PIVOT.TABLE.WIZARD',\n0x0139: 'PIVOT.FIELD.PROPERTIES',\n0x013A: 'PIVOT.FIELD',\n0x013B: 'PIVOT.ITEM',\n0x013C: 'PIVOT.ADD.FIELDS',\n0x013E: 'OPTIONS.CALCULATION',\n0x013F: 'OPTIONS.EDIT',\n0x0140: 'OPTIONS.VIEW',\n0x0141: 'ADDIN.MANAGER',\n0x0142: 'MENU.EDITOR',\n0x0143: 'ATTACH.TOOLBARS',\n0x0144: 'VBAActivate',\n0x0145: 'OPTIONS.CHART',\n0x0148: 'VBA.INSERT.FILE',\n0x014A: 'VBA.PROCEDURE.DEFINITION',\n0x0150: 'ROUTING.SLIP',\n0x0152: 'ROUTE.DOCUMENT',\n0x0153: 'MAIL.LOGON',\n0x0156: 'INSERT.PICTURE',\n0x0157: 'EDIT.TOOL',\n0x0158: 'GALLERY.DOUGHNUT',\n0x015E: 'CHART.TREND',\n0x0160: 'PIVOT.ITEM.PROPERTIES',\n0x0162: 'WORKBOOK.INSERT',\n0x0163: 'OPTIONS.TRANSITION',\n0x0164: 'OPTIONS.GENERAL',\n0x0172: 'FILTER.ADVANCED',\n0x0175: 'MAIL.ADD.MAILER',\n0x0176: 'MAIL.DELETE.MAILER',\n0x0177: 'MAIL.REPLY',\n0x0178: 'MAIL.REPLY.ALL',\n0x0179: 'MAIL.FORWARD',\n0x017A: 'MAIL.NEXT.LETTER',\n0x017B: 'DATA.LABEL',\n0x017C: 'INSERT.TITLE',\n0x017D: 'FONT.PROPERTIES',\n0x017E: 'MACRO.OPTIONS',\n0x017F: 'WORKBOOK.HIDE',\n0x0180: 'WORKBOOK.UNHIDE',\n0x0181: 'WORKBOOK.DELETE',\n0x0182: 'WORKBOOK.NAME',\n0x0184: 'GALLERY.CUSTOM',\n0x0186: 'ADD.CHART.AUTOFORMAT',\n0x0187: 'DELETE.CHART.AUTOFORMAT',\n0x0188: 'CHART.ADD.DATA',\n0x0189: 'AUTO.OUTLINE',\n0x018A: 'TAB.ORDER',\n0x018B: 'SHOW.DIALOG',\n0x018C: 'SELECT.ALL',\n0x018D: 'UNGROUP.SHEETS',\n0x018E: 'SUBTOTAL.CREATE',\n0x018F: 'SUBTOTAL.REMOVE',\n0x0190: 'RENAME.OBJECT',\n0x019C: 'WORKBOOK.SCROLL',\n0x019D: 'WORKBOOK.NEXT',\n0x019E: 'WORKBOOK.PREV',\n0x019F: 'WORKBOOK.TAB.SPLIT',\n0x01A0: 'FULL.SCREEN',\n0x01A1: 'WORKBOOK.PROTECT',\n0x01A4: 'SCROLLBAR.PROPERTIES',\n0x01A5: 'PIVOT.SHOW.PAGES',\n0x01A6: 'TEXT.TO.COLUMNS',\n0x01A7: 'FORMAT.CHARTTYPE',\n0x01A8: 'LINK.FORMAT',\n0x01A9: 'TRACER.DISPLAY',\n0x01AE: 'TRACER.NAVIGATE',\n0x01AF: 'TRACER.CLEAR',\n0x01B0: 'TRACER.ERROR',\n0x01B1: 'PIVOT.FIELD.GROUP',\n0x01B2: 'PIVOT.FIELD.UNGROUP',\n0x01B3: 'CHECKBOX.PROPERTIES',\n0x01B4: 'LABEL.PROPERTIES',\n0x01B5: 'LISTBOX.PROPERTIES',\n0x01B6: 'EDITBOX.PROPERTIES',\n0x01B7: 'PIVOT.REFRESH',\n0x01B8: 'LINK.COMBO',\n0x01B9: 'OPEN.TEXT',\n0x01BA: 'HIDE.DIALOG',\n0x01BB: 'SET.DIALOG.FOCUS',\n0x01BC: 'ENABLE.OBJECT',\n0x01BD: 'PUSHBUTTON.PROPERTIES',\n0x01BE: 'SET.DIALOG.DEFAULT',\n0x01BF: 'FILTER',\n0x01C0: 'FILTER.SHOW.ALL',\n0x01C1: 'CLEAR.OUTLINE',\n0x01C2: 'FUNCTION.WIZARD',\n0x01C3: 'ADD.LIST.ITEM',\n0x01C4: 'SET.LIST.ITEM',\n0x01C5: 'REMOVE.LIST.ITEM',\n0x01C6: 'SELECT.LIST.ITEM',\n0x01C7: 'SET.CONTROL.VALUE',\n0x01C8: 'SAVE.COPY.AS',\n0x01CA: 'OPTIONS.LISTS.ADD',\n0x01CB: 'OPTIONS.LISTS.DELETE',\n0x01CC: 'SERIES.AXES',\n0x01CD: 'SERIES.X',\n0x01CE: 'SERIES.Y',\n0x01CF: 'ERRORBAR.X',\n0x01D0: 'ERRORBAR.Y',\n0x01D1: 'FORMAT.CHART',\n0x01D2: 'SERIES.ORDER',\n0x01D3: 'MAIL.LOGOFF',\n0x01D4: 'CLEAR.ROUTING.SLIP',\n0x01D5: 'APP.ACTIVATE.MICROSOFT',\n0x01D6: 'MAIL.EDIT.MAILER',\n0x01D7: 'ON.SHEET',\n0x01D8: 'STANDARD.WIDTH',\n0x01D9: 'SCENARIO.MERGE',\n0x01DA: 'SUMMARY.INFO',\n0x01DB: 'FIND.FILE',\n0x01DC: 'ACTIVE.CELL.FONT',\n0x01DD: 'ENABLE.TIPWIZARD',\n0x01DE: 'VBA.MAKE.ADDIN',\n0x01E0: 'INSERTDATATABLE',\n0x01E1: 'WORKGROUP.OPTIONS',\n0x01E2: 'MAIL.SEND.MAILER',\n0x01E5: 'AUTOCORRECT',\n0x01E9: 'POST.DOCUMENT',\n0x01EB: 'PICKLIST',\n0x01ED: 'VIEW.SHOW',\n0x01EE: 'VIEW.DEFINE',\n0x01EF: 'VIEW.DELETE',\n0x01FD: 'SHEET.BACKGROUND',\n0x01FE: 'INSERT.MAP.OBJECT',\n0x01FF: 'OPTIONS.MENONO',\n0x0205: 'MSOCHECKS',\n0x0206: 'NORMAL',\n0x0207: 'LAYOUT',\n0x0208: 'RM.PRINT.AREA',\n0x0209: 'CLEAR.PRINT.AREA',\n0x020A: 'ADD.PRINT.AREA',\n0x020B: 'MOVE.BRK',\n0x0221: 'HIDECURR.NOTE',\n0x0222: 'HIDEALL.NOTES',\n0x0223: 'DELETE.NOTE',\n0x0224: 'TRAVERSE.NOTES',\n0x0225: 'ACTIVATE.NOTES',\n0x026C: 'PROTECT.REVISIONS',\n0x026D: 'UNPROTECT.REVISIONS',\n0x0287: 'OPTIONS.ME',\n0x028D: 'WEB.PUBLISH',\n0x029B: 'NEWWEBQUERY',\n0x02A1: 'PIVOT.TABLE.CHART',\n0x02F1: 'OPTIONS.SAVE',\n0x02F3: 'OPTIONS.SPELL',\n0x0328: 'HIDEALL.INKANNOTS'\n};\n\n/* [MS-XLS] 2.5.198.17 */\n/* [MS-XLSB] 2.5.97.10 */\nvar Ftab = {\n0x0000: 'COUNT',\n0x0001: 'IF',\n0x0002: 'ISNA',\n0x0003: 'ISERROR',\n0x0004: 'SUM',\n0x0005: 'AVERAGE',\n0x0006: 'MIN',\n0x0007: 'MAX',\n0x0008: 'ROW',\n0x0009: 'COLUMN',\n0x000A: 'NA',\n0x000B: 'NPV',\n0x000C: 'STDEV',\n0x000D: 'DOLLAR',\n0x000E: 'FIXED',\n0x000F: 'SIN',\n0x0010: 'COS',\n0x0011: 'TAN',\n0x0012: 'ATAN',\n0x0013: 'PI',\n0x0014: 'SQRT',\n0x0015: 'EXP',\n0x0016: 'LN',\n0x0017: 'LOG10',\n0x0018: 'ABS',\n0x0019: 'INT',\n0x001A: 'SIGN',\n0x001B: 'ROUND',\n0x001C: 'LOOKUP',\n0x001D: 'INDEX',\n0x001E: 'REPT',\n0x001F: 'MID',\n0x0020: 'LEN',\n0x0021: 'VALUE',\n0x0022: 'TRUE',\n0x0023: 'FALSE',\n0x0024: 'AND',\n0x0025: 'OR',\n0x0026: 'NOT',\n0x0027: 'MOD',\n0x0028: 'DCOUNT',\n0x0029: 'DSUM',\n0x002A: 'DAVERAGE',\n0x002B: 'DMIN',\n0x002C: 'DMAX',\n0x002D: 'DSTDEV',\n0x002E: 'VAR',\n0x002F: 'DVAR',\n0x0030: 'TEXT',\n0x0031: 'LINEST',\n0x0032: 'TREND',\n0x0033: 'LOGEST',\n0x0034: 'GROWTH',\n0x0035: 'GOTO',\n0x0036: 'HALT',\n0x0037: 'RETURN',\n0x0038: 'PV',\n0x0039: 'FV',\n0x003A: 'NPER',\n0x003B: 'PMT',\n0x003C: 'RATE',\n0x003D: 'MIRR',\n0x003E: 'IRR',\n0x003F: 'RAND',\n0x0040: 'MATCH',\n0x0041: 'DATE',\n0x0042: 'TIME',\n0x0043: 'DAY',\n0x0044: 'MONTH',\n0x0045: 'YEAR',\n0x0046: 'WEEKDAY',\n0x0047: 'HOUR',\n0x0048: 'MINUTE',\n0x0049: 'SECOND',\n0x004A: 'NOW',\n0x004B: 'AREAS',\n0x004C: 'ROWS',\n0x004D: 'COLUMNS',\n0x004E: 'OFFSET',\n0x004F: 'ABSREF',\n0x0050: 'RELREF',\n0x0051: 'ARGUMENT',\n0x0052: 'SEARCH',\n0x0053: 'TRANSPOSE',\n0x0054: 'ERROR',\n0x0055: 'STEP',\n0x0056: 'TYPE',\n0x0057: 'ECHO',\n0x0058: 'SET.NAME',\n0x0059: 'CALLER',\n0x005A: 'DEREF',\n0x005B: 'WINDOWS',\n0x005C: 'SERIES',\n0x005D: 'DOCUMENTS',\n0x005E: 'ACTIVE.CELL',\n0x005F: 'SELECTION',\n0x0060: 'RESULT',\n0x0061: 'ATAN2',\n0x0062: 'ASIN',\n0x0063: 'ACOS',\n0x0064: 'CHOOSE',\n0x0065: 'HLOOKUP',\n0x0066: 'VLOOKUP',\n0x0067: 'LINKS',\n0x0068: 'INPUT',\n0x0069: 'ISREF',\n0x006A: 'GET.FORMULA',\n0x006B: 'GET.NAME',\n0x006C: 'SET.VALUE',\n0x006D: 'LOG',\n0x006E: 'EXEC',\n0x006F: 'CHAR',\n0x0070: 'LOWER',\n0x0071: 'UPPER',\n0x0072: 'PROPER',\n0x0073: 'LEFT',\n0x0074: 'RIGHT',\n0x0075: 'EXACT',\n0x0076: 'TRIM',\n0x0077: 'REPLACE',\n0x0078: 'SUBSTITUTE',\n0x0079: 'CODE',\n0x007A: 'NAMES',\n0x007B: 'DIRECTORY',\n0x007C: 'FIND',\n0x007D: 'CELL',\n0x007E: 'ISERR',\n0x007F: 'ISTEXT',\n0x0080: 'ISNUMBER',\n0x0081: 'ISBLANK',\n0x0082: 'T',\n0x0083: 'N',\n0x0084: 'FOPEN',\n0x0085: 'FCLOSE',\n0x0086: 'FSIZE',\n0x0087: 'FREADLN',\n0x0088: 'FREAD',\n0x0089: 'FWRITELN',\n0x008A: 'FWRITE',\n0x008B: 'FPOS',\n0x008C: 'DATEVALUE',\n0x008D: 'TIMEVALUE',\n0x008E: 'SLN',\n0x008F: 'SYD',\n0x0090: 'DDB',\n0x0091: 'GET.DEF',\n0x0092: 'REFTEXT',\n0x0093: 'TEXTREF',\n0x0094: 'INDIRECT',\n0x0095: 'REGISTER',\n0x0096: 'CALL',\n0x0097: 'ADD.BAR',\n0x0098: 'ADD.MENU',\n0x0099: 'ADD.COMMAND',\n0x009A: 'ENABLE.COMMAND',\n0x009B: 'CHECK.COMMAND',\n0x009C: 'RENAME.COMMAND',\n0x009D: 'SHOW.BAR',\n0x009E: 'DELETE.MENU',\n0x009F: 'DELETE.COMMAND',\n0x00A0: 'GET.CHART.ITEM',\n0x00A1: 'DIALOG.BOX',\n0x00A2: 'CLEAN',\n0x00A3: 'MDETERM',\n0x00A4: 'MINVERSE',\n0x00A5: 'MMULT',\n0x00A6: 'FILES',\n0x00A7: 'IPMT',\n0x00A8: 'PPMT',\n0x00A9: 'COUNTA',\n0x00AA: 'CANCEL.KEY',\n0x00AB: 'FOR',\n0x00AC: 'WHILE',\n0x00AD: 'BREAK',\n0x00AE: 'NEXT',\n0x00AF: 'INITIATE',\n0x00B0: 'REQUEST',\n0x00B1: 'POKE',\n0x00B2: 'EXECUTE',\n0x00B3: 'TERMINATE',\n0x00B4: 'RESTART',\n0x00B5: 'HELP',\n0x00B6: 'GET.BAR',\n0x00B7: 'PRODUCT',\n0x00B8: 'FACT',\n0x00B9: 'GET.CELL',\n0x00BA: 'GET.WORKSPACE',\n0x00BB: 'GET.WINDOW',\n0x00BC: 'GET.DOCUMENT',\n0x00BD: 'DPRODUCT',\n0x00BE: 'ISNONTEXT',\n0x00BF: 'GET.NOTE',\n0x00C0: 'NOTE',\n0x00C1: 'STDEVP',\n0x00C2: 'VARP',\n0x00C3: 'DSTDEVP',\n0x00C4: 'DVARP',\n0x00C5: 'TRUNC',\n0x00C6: 'ISLOGICAL',\n0x00C7: 'DCOUNTA',\n0x00C8: 'DELETE.BAR',\n0x00C9: 'UNREGISTER',\n0x00CC: 'USDOLLAR',\n0x00CD: 'FINDB',\n0x00CE: 'SEARCHB',\n0x00CF: 'REPLACEB',\n0x00D0: 'LEFTB',\n0x00D1: 'RIGHTB',\n0x00D2: 'MIDB',\n0x00D3: 'LENB',\n0x00D4: 'ROUNDUP',\n0x00D5: 'ROUNDDOWN',\n0x00D6: 'ASC',\n0x00D7: 'DBCS',\n0x00D8: 'RANK',\n0x00DB: 'ADDRESS',\n0x00DC: 'DAYS360',\n0x00DD: 'TODAY',\n0x00DE: 'VDB',\n0x00DF: 'ELSE',\n0x00E0: 'ELSE.IF',\n0x00E1: 'END.IF',\n0x00E2: 'FOR.CELL',\n0x00E3: 'MEDIAN',\n0x00E4: 'SUMPRODUCT',\n0x00E5: 'SINH',\n0x00E6: 'COSH',\n0x00E7: 'TANH',\n0x00E8: 'ASINH',\n0x00E9: 'ACOSH',\n0x00EA: 'ATANH',\n0x00EB: 'DGET',\n0x00EC: 'CREATE.OBJECT',\n0x00ED: 'VOLATILE',\n0x00EE: 'LAST.ERROR',\n0x00EF: 'CUSTOM.UNDO',\n0x00F0: 'CUSTOM.REPEAT',\n0x00F1: 'FORMULA.CONVERT',\n0x00F2: 'GET.LINK.INFO',\n0x00F3: 'TEXT.BOX',\n0x00F4: 'INFO',\n0x00F5: 'GROUP',\n0x00F6: 'GET.OBJECT',\n0x00F7: 'DB',\n0x00F8: 'PAUSE',\n0x00FB: 'RESUME',\n0x00FC: 'FREQUENCY',\n0x00FD: 'ADD.TOOLBAR',\n0x00FE: 'DELETE.TOOLBAR',\n0x00FF: 'User',\n0x0100: 'RESET.TOOLBAR',\n0x0101: 'EVALUATE',\n0x0102: 'GET.TOOLBAR',\n0x0103: 'GET.TOOL',\n0x0104: 'SPELLING.CHECK',\n0x0105: 'ERROR.TYPE',\n0x0106: 'APP.TITLE',\n0x0107: 'WINDOW.TITLE',\n0x0108: 'SAVE.TOOLBAR',\n0x0109: 'ENABLE.TOOL',\n0x010A: 'PRESS.TOOL',\n0x010B: 'REGISTER.ID',\n0x010C: 'GET.WORKBOOK',\n0x010D: 'AVEDEV',\n0x010E: 'BETADIST',\n0x010F: 'GAMMALN',\n0x0110: 'BETAINV',\n0x0111: 'BINOMDIST',\n0x0112: 'CHIDIST',\n0x0113: 'CHIINV',\n0x0114: 'COMBIN',\n0x0115: 'CONFIDENCE',\n0x0116: 'CRITBINOM',\n0x0117: 'EVEN',\n0x0118: 'EXPONDIST',\n0x0119: 'FDIST',\n0x011A: 'FINV',\n0x011B: 'FISHER',\n0x011C: 'FISHERINV',\n0x011D: 'FLOOR',\n0x011E: 'GAMMADIST',\n0x011F: 'GAMMAINV',\n0x0120: 'CEILING',\n0x0121: 'HYPGEOMDIST',\n0x0122: 'LOGNORMDIST',\n0x0123: 'LOGINV',\n0x0124: 'NEGBINOMDIST',\n0x0125: 'NORMDIST',\n0x0126: 'NORMSDIST',\n0x0127: 'NORMINV',\n0x0128: 'NORMSINV',\n0x0129: 'STANDARDIZE',\n0x012A: 'ODD',\n0x012B: 'PERMUT',\n0x012C: 'POISSON',\n0x012D: 'TDIST',\n0x012E: 'WEIBULL',\n0x012F: 'SUMXMY2',\n0x0130: 'SUMX2MY2',\n0x0131: 'SUMX2PY2',\n0x0132: 'CHITEST',\n0x0133: 'CORREL',\n0x0134: 'COVAR',\n0x0135: 'FORECAST',\n0x0136: 'FTEST',\n0x0137: 'INTERCEPT',\n0x0138: 'PEARSON',\n0x0139: 'RSQ',\n0x013A: 'STEYX',\n0x013B: 'SLOPE',\n0x013C: 'TTEST',\n0x013D: 'PROB',\n0x013E: 'DEVSQ',\n0x013F: 'GEOMEAN',\n0x0140: 'HARMEAN',\n0x0141: 'SUMSQ',\n0x0142: 'KURT',\n0x0143: 'SKEW',\n0x0144: 'ZTEST',\n0x0145: 'LARGE',\n0x0146: 'SMALL',\n0x0147: 'QUARTILE',\n0x0148: 'PERCENTILE',\n0x0149: 'PERCENTRANK',\n0x014A: 'MODE',\n0x014B: 'TRIMMEAN',\n0x014C: 'TINV',\n0x014E: 'MOVIE.COMMAND',\n0x014F: 'GET.MOVIE',\n0x0150: 'CONCATENATE',\n0x0151: 'POWER',\n0x0152: 'PIVOT.ADD.DATA',\n0x0153: 'GET.PIVOT.TABLE',\n0x0154: 'GET.PIVOT.FIELD',\n0x0155: 'GET.PIVOT.ITEM',\n0x0156: 'RADIANS',\n0x0157: 'DEGREES',\n0x0158: 'SUBTOTAL',\n0x0159: 'SUMIF',\n0x015A: 'COUNTIF',\n0x015B: 'COUNTBLANK',\n0x015C: 'SCENARIO.GET',\n0x015D: 'OPTIONS.LISTS.GET',\n0x015E: 'ISPMT',\n0x015F: 'DATEDIF',\n0x0160: 'DATESTRING',\n0x0161: 'NUMBERSTRING',\n0x0162: 'ROMAN',\n0x0163: 'OPEN.DIALOG',\n0x0164: 'SAVE.DIALOG',\n0x0165: 'VIEW.GET',\n0x0166: 'GETPIVOTDATA',\n0x0167: 'HYPERLINK',\n0x0168: 'PHONETIC',\n0x0169: 'AVERAGEA',\n0x016A: 'MAXA',\n0x016B: 'MINA',\n0x016C: 'STDEVPA',\n0x016D: 'VARPA',\n0x016E: 'STDEVA',\n0x016F: 'VARA',\n0x0170: 'BAHTTEXT',\n0x0171: 'THAIDAYOFWEEK',\n0x0172: 'THAIDIGIT',\n0x0173: 'THAIMONTHOFYEAR',\n0x0174: 'THAINUMSOUND',\n0x0175: 'THAINUMSTRING',\n0x0176: 'THAISTRINGLENGTH',\n0x0177: 'ISTHAIDIGIT',\n0x0178: 'ROUNDBAHTDOWN',\n0x0179: 'ROUNDBAHTUP',\n0x017A: 'THAIYEAR',\n0x017B: 'RTD',\n\n0x017C: 'CUBEVALUE',\n0x017D: 'CUBEMEMBER',\n0x017E: 'CUBEMEMBERPROPERTY',\n0x017F: 'CUBERANKEDMEMBER',\n0x0180: 'HEX2BIN',\n0x0181: 'HEX2DEC',\n0x0182: 'HEX2OCT',\n0x0183: 'DEC2BIN',\n0x0184: 'DEC2HEX',\n0x0185: 'DEC2OCT',\n0x0186: 'OCT2BIN',\n0x0187: 'OCT2HEX',\n0x0188: 'OCT2DEC',\n0x0189: 'BIN2DEC',\n0x018A: 'BIN2OCT',\n0x018B: 'BIN2HEX',\n0x018C: 'IMSUB',\n0x018D: 'IMDIV',\n0x018E: 'IMPOWER',\n0x018F: 'IMABS',\n0x0190: 'IMSQRT',\n0x0191: 'IMLN',\n0x0192: 'IMLOG2',\n0x0193: 'IMLOG10',\n0x0194: 'IMSIN',\n0x0195: 'IMCOS',\n0x0196: 'IMEXP',\n0x0197: 'IMARGUMENT',\n0x0198: 'IMCONJUGATE',\n0x0199: 'IMAGINARY',\n0x019A: 'IMREAL',\n0x019B: 'COMPLEX',\n0x019C: 'IMSUM',\n0x019D: 'IMPRODUCT',\n0x019E: 'SERIESSUM',\n0x019F: 'FACTDOUBLE',\n0x01A0: 'SQRTPI',\n0x01A1: 'QUOTIENT',\n0x01A2: 'DELTA',\n0x01A3: 'GESTEP',\n0x01A4: 'ISEVEN',\n0x01A5: 'ISODD',\n0x01A6: 'MROUND',\n0x01A7: 'ERF',\n0x01A8: 'ERFC',\n0x01A9: 'BESSELJ',\n0x01AA: 'BESSELK',\n0x01AB: 'BESSELY',\n0x01AC: 'BESSELI',\n0x01AD: 'XIRR',\n0x01AE: 'XNPV',\n0x01AF: 'PRICEMAT',\n0x01B0: 'YIELDMAT',\n0x01B1: 'INTRATE',\n0x01B2: 'RECEIVED',\n0x01B3: 'DISC',\n0x01B4: 'PRICEDISC',\n0x01B5: 'YIELDDISC',\n0x01B6: 'TBILLEQ',\n0x01B7: 'TBILLPRICE',\n0x01B8: 'TBILLYIELD',\n0x01B9: 'PRICE',\n0x01BA: 'YIELD',\n0x01BB: 'DOLLARDE',\n0x01BC: 'DOLLARFR',\n0x01BD: 'NOMINAL',\n0x01BE: 'EFFECT',\n0x01BF: 'CUMPRINC',\n0x01C0: 'CUMIPMT',\n0x01C1: 'EDATE',\n0x01C2: 'EOMONTH',\n0x01C3: 'YEARFRAC',\n0x01C4: 'COUPDAYBS',\n0x01C5: 'COUPDAYS',\n0x01C6: 'COUPDAYSNC',\n0x01C7: 'COUPNCD',\n0x01C8: 'COUPNUM',\n0x01C9: 'COUPPCD',\n0x01CA: 'DURATION',\n0x01CB: 'MDURATION',\n0x01CC: 'ODDLPRICE',\n0x01CD: 'ODDLYIELD',\n0x01CE: 'ODDFPRICE',\n0x01CF: 'ODDFYIELD',\n0x01D0: 'RANDBETWEEN',\n0x01D1: 'WEEKNUM',\n0x01D2: 'AMORDEGRC',\n0x01D3: 'AMORLINC',\n0x01D4: 'CONVERT',\n0x02D4: 'SHEETJS',\n0x01D5: 'ACCRINT',\n0x01D6: 'ACCRINTM',\n0x01D7: 'WORKDAY',\n0x01D8: 'NETWORKDAYS',\n0x01D9: 'GCD',\n0x01DA: 'MULTINOMIAL',\n0x01DB: 'LCM',\n0x01DC: 'FVSCHEDULE',\n0x01DD: 'CUBEKPIMEMBER',\n0x01DE: 'CUBESET',\n0x01DF: 'CUBESETCOUNT',\n0x01E0: 'IFERROR',\n0x01E1: 'COUNTIFS',\n0x01E2: 'SUMIFS',\n0x01E3: 'AVERAGEIF',\n0x01E4: 'AVERAGEIFS'\n};\nvar FtabArgc = {\n0x0002: 1, /* ISNA */\n0x0003: 1, /* ISERROR */\n0x000A: 0, /* NA */\n0x000F: 1, /* SIN */\n0x0010: 1, /* COS */\n0x0011: 1, /* TAN */\n0x0012: 1, /* ATAN */\n0x0013: 0, /* PI */\n0x0014: 1, /* SQRT */\n0x0015: 1, /* EXP */\n0x0016: 1, /* LN */\n0x0017: 1, /* LOG10 */\n0x0018: 1, /* ABS */\n0x0019: 1, /* INT */\n0x001A: 1, /* SIGN */\n0x001B: 2, /* ROUND */\n0x001E: 2, /* REPT */\n0x001F: 3, /* MID */\n0x0020: 1, /* LEN */\n0x0021: 1, /* VALUE */\n0x0022: 0, /* TRUE */\n0x0023: 0, /* FALSE */\n0x0026: 1, /* NOT */\n0x0027: 2, /* MOD */\n0x0028: 3, /* DCOUNT */\n0x0029: 3, /* DSUM */\n0x002A: 3, /* DAVERAGE */\n0x002B: 3, /* DMIN */\n0x002C: 3, /* DMAX */\n0x002D: 3, /* DSTDEV */\n0x002F: 3, /* DVAR */\n0x0030: 2, /* TEXT */\n0x0035: 1, /* GOTO */\n0x003D: 3, /* MIRR */\n0x003F: 0, /* RAND */\n0x0041: 3, /* DATE */\n0x0042: 3, /* TIME */\n0x0043: 1, /* DAY */\n0x0044: 1, /* MONTH */\n0x0045: 1, /* YEAR */\n0x0046: 1, /* WEEKDAY */\n0x0047: 1, /* HOUR */\n0x0048: 1, /* MINUTE */\n0x0049: 1, /* SECOND */\n0x004A: 0, /* NOW */\n0x004B: 1, /* AREAS */\n0x004C: 1, /* ROWS */\n0x004D: 1, /* COLUMNS */\n0x004F: 2, /* ABSREF */\n0x0050: 2, /* RELREF */\n0x0053: 1, /* TRANSPOSE */\n0x0055: 0, /* STEP */\n0x0056: 1, /* TYPE */\n0x0059: 0, /* CALLER */\n0x005A: 1, /* DEREF */\n0x005E: 0, /* ACTIVE.CELL */\n0x005F: 0, /* SELECTION */\n0x0061: 2, /* ATAN2 */\n0x0062: 1, /* ASIN */\n0x0063: 1, /* ACOS */\n0x0065: 3, /* HLOOKUP */\n0x0066: 3, /* VLOOKUP */\n0x0069: 1, /* ISREF */\n0x006A: 1, /* GET.FORMULA */\n0x006C: 2, /* SET.VALUE */\n0x006F: 1, /* CHAR */\n0x0070: 1, /* LOWER */\n0x0071: 1, /* UPPER */\n0x0072: 1, /* PROPER */\n0x0075: 2, /* EXACT */\n0x0076: 1, /* TRIM */\n0x0077: 4, /* REPLACE */\n0x0079: 1, /* CODE */\n0x007E: 1, /* ISERR */\n0x007F: 1, /* ISTEXT */\n0x0080: 1, /* ISNUMBER */\n0x0081: 1, /* ISBLANK */\n0x0082: 1, /* T */\n0x0083: 1, /* N */\n0x0085: 1, /* FCLOSE */\n0x0086: 1, /* FSIZE */\n0x0087: 1, /* FREADLN */\n0x0088: 2, /* FREAD */\n0x0089: 2, /* FWRITELN */\n0x008A: 2, /* FWRITE */\n0x008C: 1, /* DATEVALUE */\n0x008D: 1, /* TIMEVALUE */\n0x008E: 3, /* SLN */\n0x008F: 4, /* SYD */\n0x0090: 4, /* DDB */\n0x00A1: 1, /* DIALOG.BOX */\n0x00A2: 1, /* CLEAN */\n0x00A3: 1, /* MDETERM */\n0x00A4: 1, /* MINVERSE */\n0x00A5: 2, /* MMULT */\n0x00AC: 1, /* WHILE */\n0x00AF: 2, /* INITIATE */\n0x00B0: 2, /* REQUEST */\n0x00B1: 3, /* POKE */\n0x00B2: 2, /* EXECUTE */\n0x00B3: 1, /* TERMINATE */\n0x00B8: 1, /* FACT */\n0x00BA: 1, /* GET.WORKSPACE */\n0x00BD: 3, /* DPRODUCT */\n0x00BE: 1, /* ISNONTEXT */\n0x00C3: 3, /* DSTDEVP */\n0x00C4: 3, /* DVARP */\n0x00C5: 1, /* TRUNC */\n0x00C6: 1, /* ISLOGICAL */\n0x00C7: 3, /* DCOUNTA */\n0x00C9: 1, /* UNREGISTER */\n0x00CF: 4, /* REPLACEB */\n0x00D2: 3, /* MIDB */\n0x00D3: 1, /* LENB */\n0x00D4: 2, /* ROUNDUP */\n0x00D5: 2, /* ROUNDDOWN */\n0x00D6: 1, /* ASC */\n0x00D7: 1, /* DBCS */\n0x00E1: 0, /* END.IF */\n0x00E5: 1, /* SINH */\n0x00E6: 1, /* COSH */\n0x00E7: 1, /* TANH */\n0x00E8: 1, /* ASINH */\n0x00E9: 1, /* ACOSH */\n0x00EA: 1, /* ATANH */\n0x00EB: 3, /* DGET */\n0x00F4: 1, /* INFO */\n0x00F7: 4, /* DB */\n0x00FC: 2, /* FREQUENCY */\n0x0101: 1, /* EVALUATE */\n0x0105: 1, /* ERROR.TYPE */\n0x010F: 1, /* GAMMALN */\n0x0111: 4, /* BINOMDIST */\n0x0112: 2, /* CHIDIST */\n0x0113: 2, /* CHIINV */\n0x0114: 2, /* COMBIN */\n0x0115: 3, /* CONFIDENCE */\n0x0116: 3, /* CRITBINOM */\n0x0117: 1, /* EVEN */\n0x0118: 3, /* EXPONDIST */\n0x0119: 3, /* FDIST */\n0x011A: 3, /* FINV */\n0x011B: 1, /* FISHER */\n0x011C: 1, /* FISHERINV */\n0x011D: 2, /* FLOOR */\n0x011E: 4, /* GAMMADIST */\n0x011F: 3, /* GAMMAINV */\n0x0120: 2, /* CEILING */\n0x0121: 4, /* HYPGEOMDIST */\n0x0122: 3, /* LOGNORMDIST */\n0x0123: 3, /* LOGINV */\n0x0124: 3, /* NEGBINOMDIST */\n0x0125: 4, /* NORMDIST */\n0x0126: 1, /* NORMSDIST */\n0x0127: 3, /* NORMINV */\n0x0128: 1, /* NORMSINV */\n0x0129: 3, /* STANDARDIZE */\n0x012A: 1, /* ODD */\n0x012B: 2, /* PERMUT */\n0x012C: 3, /* POISSON */\n0x012D: 3, /* TDIST */\n0x012E: 4, /* WEIBULL */\n0x012F: 2, /* SUMXMY2 */\n0x0130: 2, /* SUMX2MY2 */\n0x0131: 2, /* SUMX2PY2 */\n0x0132: 2, /* CHITEST */\n0x0133: 2, /* CORREL */\n0x0134: 2, /* COVAR */\n0x0135: 3, /* FORECAST */\n0x0136: 2, /* FTEST */\n0x0137: 2, /* INTERCEPT */\n0x0138: 2, /* PEARSON */\n0x0139: 2, /* RSQ */\n0x013A: 2, /* STEYX */\n0x013B: 2, /* SLOPE */\n0x013C: 4, /* TTEST */\n0x0145: 2, /* LARGE */\n0x0146: 2, /* SMALL */\n0x0147: 2, /* QUARTILE */\n0x0148: 2, /* PERCENTILE */\n0x014B: 2, /* TRIMMEAN */\n0x014C: 2, /* TINV */\n0x0151: 2, /* POWER */\n0x0156: 1, /* RADIANS */\n0x0157: 1, /* DEGREES */\n0x015A: 2, /* COUNTIF */\n0x015B: 1, /* COUNTBLANK */\n0x015E: 4, /* ISPMT */\n0x015F: 3, /* DATEDIF */\n0x0160: 1, /* DATESTRING */\n0x0161: 2, /* NUMBERSTRING */\n0x0168: 1, /* PHONETIC */\n0x0170: 1, /* BAHTTEXT */\n0x0171: 1, /* THAIDAYOFWEEK */\n0x0172: 1, /* THAIDIGIT */\n0x0173: 1, /* THAIMONTHOFYEAR */\n0x0174: 1, /* THAINUMSOUND */\n0x0175: 1, /* THAINUMSTRING */\n0x0176: 1, /* THAISTRINGLENGTH */\n0x0177: 1, /* ISTHAIDIGIT */\n0x0178: 1, /* ROUNDBAHTDOWN */\n0x0179: 1, /* ROUNDBAHTUP */\n0x017A: 1, /* THAIYEAR */\n0x017E: 3, /* CUBEMEMBERPROPERTY */\n0x0181: 1, /* HEX2DEC */\n0x0188: 1, /* OCT2DEC */\n0x0189: 1, /* BIN2DEC */\n0x018C: 2, /* IMSUB */\n0x018D: 2, /* IMDIV */\n0x018E: 2, /* IMPOWER */\n0x018F: 1, /* IMABS */\n0x0190: 1, /* IMSQRT */\n0x0191: 1, /* IMLN */\n0x0192: 1, /* IMLOG2 */\n0x0193: 1, /* IMLOG10 */\n0x0194: 1, /* IMSIN */\n0x0195: 1, /* IMCOS */\n0x0196: 1, /* IMEXP */\n0x0197: 1, /* IMARGUMENT */\n0x0198: 1, /* IMCONJUGATE */\n0x0199: 1, /* IMAGINARY */\n0x019A: 1, /* IMREAL */\n0x019E: 4, /* SERIESSUM */\n0x019F: 1, /* FACTDOUBLE */\n0x01A0: 1, /* SQRTPI */\n0x01A1: 2, /* QUOTIENT */\n0x01A4: 1, /* ISEVEN */\n0x01A5: 1, /* ISODD */\n0x01A6: 2, /* MROUND */\n0x01A8: 1, /* ERFC */\n0x01A9: 2, /* BESSELJ */\n0x01AA: 2, /* BESSELK */\n0x01AB: 2, /* BESSELY */\n0x01AC: 2, /* BESSELI */\n0x01AE: 3, /* XNPV */\n0x01B6: 3, /* TBILLEQ */\n0x01B7: 3, /* TBILLPRICE */\n0x01B8: 3, /* TBILLYIELD */\n0x01BB: 2, /* DOLLARDE */\n0x01BC: 2, /* DOLLARFR */\n0x01BD: 2, /* NOMINAL */\n0x01BE: 2, /* EFFECT */\n0x01BF: 6, /* CUMPRINC */\n0x01C0: 6, /* CUMIPMT */\n0x01C1: 2, /* EDATE */\n0x01C2: 2, /* EOMONTH */\n0x01D0: 2, /* RANDBETWEEN */\n0x01D4: 3, /* CONVERT */\n0x01DC: 2, /* FVSCHEDULE */\n0x01DF: 1, /* CUBESETCOUNT */\n0x01E0: 2, /* IFERROR */\n0xFFFF: 0\n};\n/* [MS-XLSX] 2.2.3 Functions */\n/* [MS-XLSB] 2.5.97.10 Ftab */\nvar XLSXFutureFunctions = {\n\t\"_xlfn.ACOT\": \"ACOT\",\n\t\"_xlfn.ACOTH\": \"ACOTH\",\n\t\"_xlfn.AGGREGATE\": \"AGGREGATE\",\n\t\"_xlfn.ARABIC\": \"ARABIC\",\n\t\"_xlfn.AVERAGEIF\": \"AVERAGEIF\",\n\t\"_xlfn.AVERAGEIFS\": \"AVERAGEIFS\",\n\t\"_xlfn.BASE\": \"BASE\",\n\t\"_xlfn.BETA.DIST\": \"BETA.DIST\",\n\t\"_xlfn.BETA.INV\": \"BETA.INV\",\n\t\"_xlfn.BINOM.DIST\": \"BINOM.DIST\",\n\t\"_xlfn.BINOM.DIST.RANGE\": \"BINOM.DIST.RANGE\",\n\t\"_xlfn.BINOM.INV\": \"BINOM.INV\",\n\t\"_xlfn.BITAND\": \"BITAND\",\n\t\"_xlfn.BITLSHIFT\": \"BITLSHIFT\",\n\t\"_xlfn.BITOR\": \"BITOR\",\n\t\"_xlfn.BITRSHIFT\": \"BITRSHIFT\",\n\t\"_xlfn.BITXOR\": \"BITXOR\",\n\t\"_xlfn.CEILING.MATH\": \"CEILING.MATH\",\n\t\"_xlfn.CEILING.PRECISE\": \"CEILING.PRECISE\",\n\t\"_xlfn.CHISQ.DIST\": \"CHISQ.DIST\",\n\t\"_xlfn.CHISQ.DIST.RT\": \"CHISQ.DIST.RT\",\n\t\"_xlfn.CHISQ.INV\": \"CHISQ.INV\",\n\t\"_xlfn.CHISQ.INV.RT\": \"CHISQ.INV.RT\",\n\t\"_xlfn.CHISQ.TEST\": \"CHISQ.TEST\",\n\t\"_xlfn.COMBINA\": \"COMBINA\",\n\t\"_xlfn.CONCAT\": \"CONCAT\",\n\t\"_xlfn.CONFIDENCE.NORM\": \"CONFIDENCE.NORM\",\n\t\"_xlfn.CONFIDENCE.T\": \"CONFIDENCE.T\",\n\t\"_xlfn.COT\": \"COT\",\n\t\"_xlfn.COTH\": \"COTH\",\n\t\"_xlfn.COUNTIFS\": \"COUNTIFS\",\n\t\"_xlfn.COVARIANCE.P\": \"COVARIANCE.P\",\n\t\"_xlfn.COVARIANCE.S\": \"COVARIANCE.S\",\n\t\"_xlfn.CSC\": \"CSC\",\n\t\"_xlfn.CSCH\": \"CSCH\",\n\t\"_xlfn.DAYS\": \"DAYS\",\n\t\"_xlfn.DECIMAL\": \"DECIMAL\",\n\t\"_xlfn.ECMA.CEILING\": \"ECMA.CEILING\",\n\t\"_xlfn.ERF.PRECISE\": \"ERF.PRECISE\",\n\t\"_xlfn.ERFC.PRECISE\": \"ERFC.PRECISE\",\n\t\"_xlfn.EXPON.DIST\": \"EXPON.DIST\",\n\t\"_xlfn.F.DIST\": \"F.DIST\",\n\t\"_xlfn.F.DIST.RT\": \"F.DIST.RT\",\n\t\"_xlfn.F.INV\": \"F.INV\",\n\t\"_xlfn.F.INV.RT\": \"F.INV.RT\",\n\t\"_xlfn.F.TEST\": \"F.TEST\",\n\t\"_xlfn.FILTERXML\": \"FILTERXML\",\n\t\"_xlfn.FLOOR.MATH\": \"FLOOR.MATH\",\n\t\"_xlfn.FLOOR.PRECISE\": \"FLOOR.PRECISE\",\n\t\"_xlfn.FORECAST.ETS\": \"FORECAST.ETS\",\n\t\"_xlfn.FORECAST.ETS.CONFINT\": \"FORECAST.ETS.CONFINT\",\n\t\"_xlfn.FORECAST.ETS.SEASONALITY\": \"FORECAST.ETS.SEASONALITY\",\n\t\"_xlfn.FORECAST.ETS.STAT\": \"FORECAST.ETS.STAT\",\n\t\"_xlfn.FORECAST.LINEAR\": \"FORECAST.LINEAR\",\n\t\"_xlfn.FORMULATEXT\": \"FORMULATEXT\",\n\t\"_xlfn.GAMMA\": \"GAMMA\",\n\t\"_xlfn.GAMMA.DIST\": \"GAMMA.DIST\",\n\t\"_xlfn.GAMMA.INV\": \"GAMMA.INV\",\n\t\"_xlfn.GAMMALN.PRECISE\": \"GAMMALN.PRECISE\",\n\t\"_xlfn.GAUSS\": \"GAUSS\",\n\t\"_xlfn.HYPGEOM.DIST\": \"HYPGEOM.DIST\",\n\t\"_xlfn.IFERROR\": \"IFERROR\",\n\t\"_xlfn.IFNA\": \"IFNA\",\n\t\"_xlfn.IFS\": \"IFS\",\n\t\"_xlfn.IMCOSH\": \"IMCOSH\",\n\t\"_xlfn.IMCOT\": \"IMCOT\",\n\t\"_xlfn.IMCSC\": \"IMCSC\",\n\t\"_xlfn.IMCSCH\": \"IMCSCH\",\n\t\"_xlfn.IMSEC\": \"IMSEC\",\n\t\"_xlfn.IMSECH\": \"IMSECH\",\n\t\"_xlfn.IMSINH\": \"IMSINH\",\n\t\"_xlfn.IMTAN\": \"IMTAN\",\n\t\"_xlfn.ISFORMULA\": \"ISFORMULA\",\n\t\"_xlfn.ISO.CEILING\": \"ISO.CEILING\",\n\t\"_xlfn.ISOWEEKNUM\": \"ISOWEEKNUM\",\n\t\"_xlfn.LOGNORM.DIST\": \"LOGNORM.DIST\",\n\t\"_xlfn.LOGNORM.INV\": \"LOGNORM.INV\",\n\t\"_xlfn.MAXIFS\": \"MAXIFS\",\n\t\"_xlfn.MINIFS\": \"MINIFS\",\n\t\"_xlfn.MODE.MULT\": \"MODE.MULT\",\n\t\"_xlfn.MODE.SNGL\": \"MODE.SNGL\",\n\t\"_xlfn.MUNIT\": \"MUNIT\",\n\t\"_xlfn.NEGBINOM.DIST\": \"NEGBINOM.DIST\",\n\t\"_xlfn.NETWORKDAYS.INTL\": \"NETWORKDAYS.INTL\",\n\t\"_xlfn.NIGBINOM\": \"NIGBINOM\",\n\t\"_xlfn.NORM.DIST\": \"NORM.DIST\",\n\t\"_xlfn.NORM.INV\": \"NORM.INV\",\n\t\"_xlfn.NORM.S.DIST\": \"NORM.S.DIST\",\n\t\"_xlfn.NORM.S.INV\": \"NORM.S.INV\",\n\t\"_xlfn.NUMBERVALUE\": \"NUMBERVALUE\",\n\t\"_xlfn.PDURATION\": \"PDURATION\",\n\t\"_xlfn.PERCENTILE.EXC\": \"PERCENTILE.EXC\",\n\t\"_xlfn.PERCENTILE.INC\": \"PERCENTILE.INC\",\n\t\"_xlfn.PERCENTRANK.EXC\": \"PERCENTRANK.EXC\",\n\t\"_xlfn.PERCENTRANK.INC\": \"PERCENTRANK.INC\",\n\t\"_xlfn.PERMUTATIONA\": \"PERMUTATIONA\",\n\t\"_xlfn.PHI\": \"PHI\",\n\t\"_xlfn.POISSON.DIST\": \"POISSON.DIST\",\n\t\"_xlfn.QUARTILE.EXC\": \"QUARTILE.EXC\",\n\t\"_xlfn.QUARTILE.INC\": \"QUARTILE.INC\",\n\t\"_xlfn.QUERYSTRING\": \"QUERYSTRING\",\n\t\"_xlfn.RANK.AVG\": \"RANK.AVG\",\n\t\"_xlfn.RANK.EQ\": \"RANK.EQ\",\n\t\"_xlfn.RRI\": \"RRI\",\n\t\"_xlfn.SEC\": \"SEC\",\n\t\"_xlfn.SECH\": \"SECH\",\n\t\"_xlfn.SHEET\": \"SHEET\",\n\t\"_xlfn.SHEETS\": \"SHEETS\",\n\t\"_xlfn.SKEW.P\": \"SKEW.P\",\n\t\"_xlfn.STDEV.P\": \"STDEV.P\",\n\t\"_xlfn.STDEV.S\": \"STDEV.S\",\n\t\"_xlfn.SUMIFS\": \"SUMIFS\",\n\t\"_xlfn.SWITCH\": \"SWITCH\",\n\t\"_xlfn.T.DIST\": \"T.DIST\",\n\t\"_xlfn.T.DIST.2T\": \"T.DIST.2T\",\n\t\"_xlfn.T.DIST.RT\": \"T.DIST.RT\",\n\t\"_xlfn.T.INV\": \"T.INV\",\n\t\"_xlfn.T.INV.2T\": \"T.INV.2T\",\n\t\"_xlfn.T.TEST\": \"T.TEST\",\n\t\"_xlfn.TEXTJOIN\": \"TEXTJOIN\",\n\t\"_xlfn.UNICHAR\": \"UNICHAR\",\n\t\"_xlfn.UNICODE\": \"UNICODE\",\n\t\"_xlfn.VAR.P\": \"VAR.P\",\n\t\"_xlfn.VAR.S\": \"VAR.S\",\n\t\"_xlfn.WEBSERVICE\": \"WEBSERVICE\",\n\t\"_xlfn.WEIBULL.DIST\": \"WEIBULL.DIST\",\n\t\"_xlfn.WORKDAY.INTL\": \"WORKDAY.INTL\",\n\t\"_xlfn.XOR\": \"XOR\",\n\t\"_xlfn.Z.TEST\": \"Z.TEST\"\n};\n\n/* Part 3 TODO: actually parse formulae */\nfunction ods_to_csf_formula(f) {\n\tif(f.slice(0,3) == \"of:\") f = f.slice(3);\n\t/* 5.2 Basic Expressions */\n\tif(f.charCodeAt(0) == 61) {\n\t\tf = f.slice(1);\n\t\tif(f.charCodeAt(0) == 61) f = f.slice(1);\n\t}\n\tf = f.replace(/COM\\.MICROSOFT\\./g, \"\");\n\t/* Part 3 Section 5.8 References */\n\tf = f.replace(/\\[((?:\\.[A-Z]+[0-9]+)(?::\\.[A-Z]+[0-9]+)?)\\]/g, function($$, $1) { return $1.replace(/\\./g,\"\"); });\n\t/* TODO: something other than this */\n\tf = f.replace(/\\[.(#[A-Z]*[?!])\\]/g, \"$1\");\n\treturn f.replace(/[;~]/g,\",\").replace(/\\|/g,\";\");\n}\n\nfunction csf_to_ods_formula(f) {\n\tvar o = \"of:=\" + f.replace(crefregex, \"$1[.$2$3$4$5]\").replace(/\\]:\\[/g,\":\");\n\t/* TODO: something other than this */\n\treturn o.replace(/;/g, \"|\").replace(/,/g,\";\");\n}\n\nfunction ods_to_csf_3D(r) {\n\tvar a = r.split(\":\");\n\tvar s = a[0].split(\".\")[0];\n\treturn [s, a[0].split(\".\")[1] + (a.length > 1 ? (\":\" + (a[1].split(\".\")[1] || a[1].split(\".\")[0])) : \"\")];\n}\n\nfunction csf_to_ods_3D(r) {\n\treturn r.replace(/\\./,\"!\");\n}\n\nvar strs = {}; // shared strings\nvar _ssfopts = {}; // spreadsheet formatting options\n\nRELS.WS = [\n\t\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\",\n\t\"http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet\"\n];\n\n/*global Map */\nvar browser_has_Map = typeof Map !== 'undefined';\n\nfunction get_sst_id(sst, str, rev) {\n\tvar i = 0, len = sst.length;\n\tif(rev) {\n\t\tif(browser_has_Map ? rev.has(str) : Object.prototype.hasOwnProperty.call(rev, str)) {\n\t\t\tvar revarr = browser_has_Map ? rev.get(str) : rev[str];\n\t\t\tfor(; i < revarr.length; ++i) {\n\t\t\t\tif(sst[revarr[i]].t === str) { sst.Count ++; return revarr[i]; }\n\t\t\t}\n\t\t}\n\t} else for(; i < len; ++i) {\n\t\tif(sst[i].t === str) { sst.Count ++; return i; }\n\t}\n\tsst[len] = ({t:str}); sst.Count ++; sst.Unique ++;\n\tif(rev) {\n\t\tif(browser_has_Map) {\n\t\t\tif(!rev.has(str)) rev.set(str, []);\n\t\t\trev.get(str).push(len);\n\t\t} else {\n\t\t\tif(!Object.prototype.hasOwnProperty.call(rev, str)) rev[str] = [];\n\t\t\trev[str].push(len);\n\t\t}\n\t}\n\treturn len;\n}\n\nfunction col_obj_w(C, col) {\n\tvar p = ({min:C+1,max:C+1});\n\t/* wch (chars), wpx (pixels) */\n\tvar wch = -1;\n\tif(col.MDW) MDW = col.MDW;\n\tif(col.width != null) p.customWidth = 1;\n\telse if(col.wpx != null) wch = px2char(col.wpx);\n\telse if(col.wch != null) wch = col.wch;\n\tif(wch > -1) { p.width = char2width(wch); p.customWidth = 1; }\n\telse if(col.width != null) p.width = col.width;\n\tif(col.hidden) p.hidden = true;\n\tif(col.level != null) { p.outlineLevel = p.level = col.level; }\n\treturn p;\n}\n\nfunction default_margins(margins, mode) {\n\tif(!margins) return;\n\tvar defs = [0.7, 0.7, 0.75, 0.75, 0.3, 0.3];\n\tif(mode == 'xlml') defs = [1, 1, 1, 1, 0.5, 0.5];\n\tif(margins.left == null) margins.left = defs[0];\n\tif(margins.right == null) margins.right = defs[1];\n\tif(margins.top == null) margins.top = defs[2];\n\tif(margins.bottom == null) margins.bottom = defs[3];\n\tif(margins.header == null) margins.header = defs[4];\n\tif(margins.footer == null) margins.footer = defs[5];\n}\n\nfunction get_cell_style(styles, cell, opts) {\n\tvar z = opts.revssf[cell.z != null ? cell.z : \"General\"];\n\tvar i = 0x3c, len = styles.length;\n\tif(z == null && opts.ssf) {\n\t\tfor(; i < 0x188; ++i) if(opts.ssf[i] == null) {\n\t\t\tSSF.load(cell.z, i);\n\t\t\t// $FlowIgnore\n\t\t\topts.ssf[i] = cell.z;\n\t\t\topts.revssf[cell.z] = z = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\tfor(i = 0; i != len; ++i) if(styles[i].numFmtId === z) return i;\n\tstyles[len] = {\n\t\tnumFmtId:z,\n\t\tfontId:0,\n\t\tfillId:0,\n\t\tborderId:0,\n\t\txfId:0,\n\t\tapplyNumberFormat:1\n\t};\n\treturn len;\n}\n\nfunction safe_format(p, fmtid, fillid, opts, themes, styles) {\n\ttry {\n\t\tif(opts.cellNF) p.z = SSF._table[fmtid];\n\t} catch(e) { if(opts.WTF) throw e; }\n\tif(p.t === 'z' && !opts.cellStyles) return;\n\tif(p.t === 'd' && typeof p.v === 'string') p.v = parseDate(p.v);\n\tif((!opts || opts.cellText !== false) && p.t !== 'z') try {\n\t\tif(SSF._table[fmtid] == null) SSF.load(SSFImplicit[fmtid] || \"General\", fmtid);\n\t\tif(p.t === 'e') p.w = p.w || BErr[p.v];\n\t\telse if(fmtid === 0) {\n\t\t\tif(p.t === 'n') {\n\t\t\t\tif((p.v|0) === p.v) p.w = SSF._general_int(p.v);\n\t\t\t\telse p.w = SSF._general_num(p.v);\n\t\t\t}\n\t\t\telse if(p.t === 'd') {\n\t\t\t\tvar dd = datenum(p.v);\n\t\t\t\tif((dd|0) === dd) p.w = SSF._general_int(dd);\n\t\t\t\telse p.w = SSF._general_num(dd);\n\t\t\t}\n\t\t\telse if(p.v === undefined) return \"\";\n\t\t\telse p.w = SSF._general(p.v,_ssfopts);\n\t\t}\n\t\telse if(p.t === 'd') p.w = SSF.format(fmtid,datenum(p.v),_ssfopts);\n\t\telse p.w = SSF.format(fmtid,p.v,_ssfopts);\n\t} catch(e) { if(opts.WTF) throw e; }\n\tif(!opts.cellStyles) return;\n\tif(fillid != null) try {\n\t\tp.s = styles.Fills[fillid];\n\t\tif (p.s.fgColor && p.s.fgColor.theme && !p.s.fgColor.rgb) {\n\t\t\tp.s.fgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.fgColor.theme].rgb, p.s.fgColor.tint || 0);\n\t\t\tif(opts.WTF) p.s.fgColor.raw_rgb = themes.themeElements.clrScheme[p.s.fgColor.theme].rgb;\n\t\t}\n\t\tif (p.s.bgColor && p.s.bgColor.theme) {\n\t\t\tp.s.bgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.bgColor.theme].rgb, p.s.bgColor.tint || 0);\n\t\t\tif(opts.WTF) p.s.bgColor.raw_rgb = themes.themeElements.clrScheme[p.s.bgColor.theme].rgb;\n\t\t}\n\t} catch(e) { if(opts.WTF && styles.Fills) throw e; }\n}\n\nfunction check_ws(ws, sname, i) {\n\tif(ws && ws['!ref']) {\n\t\tvar range = safe_decode_range(ws['!ref']);\n\t\tif(range.e.c < range.s.c || range.e.r < range.s.r) throw new Error(\"Bad range (\" + i + \"): \" + ws['!ref']);\n\t}\n}\nfunction parse_ws_xml_dim(ws, s) {\n\tvar d = safe_decode_range(s);\n\tif(d.s.r<=d.e.r && d.s.c<=d.e.c && d.s.r>=0 && d.s.c>=0) ws[\"!ref\"] = encode_range(d);\n}\nvar mergecregex = /<(?:\\w:)?mergeCell ref=\"[A-Z0-9:]+\"\\s*[\\/]?>/g;\nvar sheetdataregex = /<(?:\\w+:)?sheetData[^>]*>([\\s\\S]*)<\\/(?:\\w+:)?sheetData>/;\nvar hlinkregex = /<(?:\\w:)?hyperlink [^>]*>/mg;\nvar dimregex = /\"(\\w*:\\w*)\"/;\nvar colregex = /<(?:\\w:)?col\\b[^>]*[\\/]?>/g;\nvar afregex = /<(?:\\w:)?autoFilter[^>]*([\\/]|>([\\s\\S]*)<\\/(?:\\w:)?autoFilter)>/g;\nvar marginregex= /<(?:\\w:)?pageMargins[^>]*\\/>/g;\nvar sheetprregex = /<(?:\\w:)?sheetPr\\b(?:[^>a-z][^>]*)?\\/>/;\nvar sheetprregex2= /<(?:\\w:)?sheetPr[^>]*(?:[\\/]|>([\\s\\S]*)<\\/(?:\\w:)?sheetPr)>/;\nvar svsregex = /<(?:\\w:)?sheetViews[^>]*(?:[\\/]|>([\\s\\S]*)<\\/(?:\\w:)?sheetViews)>/;\n\n/* 18.3 Worksheets */\nfunction parse_ws_xml(data, opts, idx, rels, wb, themes, styles) {\n\tif(!data) return data;\n\tif(!rels) rels = {'!id':{}};\n\tif(DENSE != null && opts.dense == null) opts.dense = DENSE;\n\n\t/* 18.3.1.99 worksheet CT_Worksheet */\n\tvar s = opts.dense ? ([]) : ({});\n\tvar refguess = ({s: {r:2000000, c:2000000}, e: {r:0, c:0} });\n\n\tvar data1 = \"\", data2 = \"\";\n\tvar mtch = data.match(sheetdataregex);\n\tif(mtch) {\n\t\tdata1 = data.slice(0, mtch.index);\n\t\tdata2 = data.slice(mtch.index + mtch[0].length);\n\t} else data1 = data2 = data;\n\n\t/* 18.3.1.82 sheetPr CT_SheetPr */\n\tvar sheetPr = data1.match(sheetprregex);\n\tif(sheetPr) parse_ws_xml_sheetpr(sheetPr[0], s, wb, idx);\n\telse if((sheetPr = data1.match(sheetprregex2))) parse_ws_xml_sheetpr2(sheetPr[0], sheetPr[1]||\"\", s, wb, idx, styles, themes);\n\n\t/* 18.3.1.35 dimension CT_SheetDimension */\n\tvar ridx = (data1.match(/<(?:\\w*:)?dimension/)||{index:-1}).index;\n\tif(ridx > 0) {\n\t\tvar ref = data1.slice(ridx,ridx+50).match(dimregex);\n\t\tif(ref) parse_ws_xml_dim(s, ref[1]);\n\t}\n\n\t/* 18.3.1.88 sheetViews CT_SheetViews */\n\tvar svs = data1.match(svsregex);\n\tif(svs && svs[1]) parse_ws_xml_sheetviews(svs[1], wb);\n\n\t/* 18.3.1.17 cols CT_Cols */\n\tvar columns = [];\n\tif(opts.cellStyles) {\n\t\t/* 18.3.1.13 col CT_Col */\n\t\tvar cols = data1.match(colregex);\n\t\tif(cols) parse_ws_xml_cols(columns, cols);\n\t}\n\n\t/* 18.3.1.80 sheetData CT_SheetData ? */\n\tif(mtch) parse_ws_xml_data(mtch[1], s, opts, refguess, themes, styles);\n\n\t/* 18.3.1.2 autoFilter CT_AutoFilter */\n\tvar afilter = data2.match(afregex);\n\tif(afilter) s['!autofilter'] = parse_ws_xml_autofilter(afilter[0]);\n\n\t/* 18.3.1.55 mergeCells CT_MergeCells */\n\tvar merges = [];\n\tvar _merge = data2.match(mergecregex);\n\tif(_merge) for(ridx = 0; ridx != _merge.length; ++ridx)\n\t\tmerges[ridx] = safe_decode_range(_merge[ridx].slice(_merge[ridx].indexOf(\"\\\"\")+1));\n\n\t/* 18.3.1.48 hyperlinks CT_Hyperlinks */\n\tvar hlink = data2.match(hlinkregex);\n\tif(hlink) parse_ws_xml_hlinks(s, hlink, rels);\n\n\t/* 18.3.1.62 pageMargins CT_PageMargins */\n\tvar margins = data2.match(marginregex);\n\tif(margins) s['!margins'] = parse_ws_xml_margins(parsexmltag(margins[0]));\n\n\tif(!s[\"!ref\"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s[\"!ref\"] = encode_range(refguess);\n\tif(opts.sheetRows > 0 && s[\"!ref\"]) {\n\t\tvar tmpref = safe_decode_range(s[\"!ref\"]);\n\t\tif(opts.sheetRows <= +tmpref.e.r) {\n\t\t\ttmpref.e.r = opts.sheetRows - 1;\n\t\t\tif(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;\n\t\t\tif(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;\n\t\t\tif(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;\n\t\t\tif(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;\n\t\t\ts[\"!fullref\"] = s[\"!ref\"];\n\t\t\ts[\"!ref\"] = encode_range(tmpref);\n\t\t}\n\t}\n\tif(columns.length > 0) s[\"!cols\"] = columns;\n\tif(merges.length > 0) s[\"!merges\"] = merges;\n\treturn s;\n}\n\nfunction write_ws_xml_merges(merges) {\n\tif(merges.length === 0) return \"\";\n\tvar o = '';\n\tfor(var i = 0; i != merges.length; ++i) o += '';\n\treturn o + '';\n}\n\n/* 18.3.1.82-3 sheetPr CT_ChartsheetPr / CT_SheetPr */\nfunction parse_ws_xml_sheetpr(sheetPr, s, wb, idx) {\n\tvar data = parsexmltag(sheetPr);\n\tif(!wb.Sheets[idx]) wb.Sheets[idx] = {};\n\tif(data.codeName) wb.Sheets[idx].CodeName = unescapexml(utf8read(data.codeName));\n}\nfunction parse_ws_xml_sheetpr2(sheetPr, body, s, wb, idx, styles, themes) {\n\tparse_ws_xml_sheetpr(sheetPr.slice(0, sheetPr.indexOf(\">\")), s, wb, idx);\n}\nfunction write_ws_xml_sheetpr(ws, wb, idx, opts, o) {\n\tvar needed = false;\n\tvar props = {}, payload = null;\n\tif(opts.bookType !== 'xlsx' && wb.vbaraw) {\n\t\tvar cname = wb.SheetNames[idx];\n\t\ttry { if(wb.Workbook) cname = wb.Workbook.Sheets[idx].CodeName || cname; } catch(e) {}\n\t\tneeded = true;\n\t\tprops.codeName = utf8write(escapexml(cname));\n\t}\n\n\tif(ws && ws[\"!outline\"]) {\n\t\tvar outlineprops = {summaryBelow:1, summaryRight:1};\n\t\tif(ws[\"!outline\"].above) outlineprops.summaryBelow = 0;\n\t\tif(ws[\"!outline\"].left) outlineprops.summaryRight = 0;\n\t\tpayload = (payload||\"\") + writextag('outlinePr', null, outlineprops);\n\t}\n\n\tif(!needed && !payload) return;\n\to[o.length] = (writextag('sheetPr', payload, props));\n}\n\n/* 18.3.1.85 sheetProtection CT_SheetProtection */\nvar sheetprot_deffalse = [\"objects\", \"scenarios\", \"selectLockedCells\", \"selectUnlockedCells\"];\nvar sheetprot_deftrue = [\n\t\"formatColumns\", \"formatRows\", \"formatCells\",\n\t\"insertColumns\", \"insertRows\", \"insertHyperlinks\",\n\t\"deleteColumns\", \"deleteRows\",\n\t\"sort\", \"autoFilter\", \"pivotTables\"\n];\nfunction write_ws_xml_protection(sp) {\n\t// algorithmName, hashValue, saltValue, spinCount\n\tvar o = ({sheet:1});\n\tsheetprot_deffalse.forEach(function(n) { if(sp[n] != null && sp[n]) o[n] = \"1\"; });\n\tsheetprot_deftrue.forEach(function(n) { if(sp[n] != null && !sp[n]) o[n] = \"0\"; });\n\t/* TODO: algorithm */\n\tif(sp.password) o.password = crypto_CreatePasswordVerifier_Method1(sp.password).toString(16).toUpperCase();\n\treturn writextag('sheetProtection', null, o);\n}\n\nfunction parse_ws_xml_hlinks(s, data, rels) {\n\tvar dense = Array.isArray(s);\n\tfor(var i = 0; i != data.length; ++i) {\n\t\tvar val = parsexmltag(utf8read(data[i]), true);\n\t\tif(!val.ref) return;\n\t\tvar rel = ((rels || {})['!id']||[])[val.id];\n\t\tif(rel) {\n\t\t\tval.Target = rel.Target;\n\t\t\tif(val.location) val.Target += \"#\"+unescapexml(val.location);\n\t\t} else {\n\t\t\tval.Target = \"#\" + unescapexml(val.location);\n\t\t\trel = {Target: val.Target, TargetMode: 'Internal'};\n\t\t}\n\t\tval.Rel = rel;\n\t\tif(val.tooltip) { val.Tooltip = val.tooltip; delete val.tooltip; }\n\t\tvar rng = safe_decode_range(val.ref);\n\t\tfor(var R=rng.s.r;R<=rng.e.r;++R) for(var C=rng.s.c;C<=rng.e.c;++C) {\n\t\t\tvar addr = encode_cell({c:C,r:R});\n\t\t\tif(dense) {\n\t\t\t\tif(!s[R]) s[R] = [];\n\t\t\t\tif(!s[R][C]) s[R][C] = {t:\"z\",v:undefined};\n\t\t\t\ts[R][C].l = val;\n\t\t\t} else {\n\t\t\t\tif(!s[addr]) s[addr] = {t:\"z\",v:undefined};\n\t\t\t\ts[addr].l = val;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction parse_ws_xml_margins(margin) {\n\tvar o = {};\n\t[\"left\", \"right\", \"top\", \"bottom\", \"header\", \"footer\"].forEach(function(k) {\n\t\tif(margin[k]) o[k] = parseFloat(margin[k]);\n\t});\n\treturn o;\n}\nfunction write_ws_xml_margins(margin) {\n\tdefault_margins(margin);\n\treturn writextag('pageMargins', null, margin);\n}\n\nfunction parse_ws_xml_cols(columns, cols) {\n\tvar seencol = false;\n\tfor(var coli = 0; coli != cols.length; ++coli) {\n\t\tvar coll = parsexmltag(cols[coli], true);\n\t\tif(coll.hidden) coll.hidden = parsexmlbool(coll.hidden);\n\t\tvar colm=parseInt(coll.min, 10)-1, colM=parseInt(coll.max,10)-1;\n\t\tif(coll.outlineLevel) coll.level = (+coll.outlineLevel || 0);\n\t\tdelete coll.min; delete coll.max; coll.width = +coll.width;\n\t\tif(!seencol && coll.width) { seencol = true; find_mdw_colw(coll.width); }\n\t\tprocess_col(coll);\n\t\twhile(colm <= colM) columns[colm++] = dup(coll);\n\t}\n}\nfunction write_ws_xml_cols(ws, cols) {\n\tvar o = [\"\"], col;\n\tfor(var i = 0; i != cols.length; ++i) {\n\t\tif(!(col = cols[i])) continue;\n\t\to[o.length] = (writextag('col', null, col_obj_w(i, col)));\n\t}\n\to[o.length] = \"\";\n\treturn o.join(\"\");\n}\n\nfunction parse_ws_xml_autofilter(data) {\n\tvar o = { ref: (data.match(/ref=\"([^\"]*)\"/)||[])[1]};\n\treturn o;\n}\nfunction write_ws_xml_autofilter(data, ws, wb, idx) {\n\tvar ref = typeof data.ref == \"string\" ? data.ref : encode_range(data.ref);\n\tif(!wb.Workbook) wb.Workbook = ({Sheets:[]});\n\tif(!wb.Workbook.Names) wb.Workbook.Names = [];\n\tvar names = wb.Workbook.Names;\n\tvar range = decode_range(ref);\n\tif(range.s.r == range.e.r) { range.e.r = decode_range(ws[\"!ref\"]).e.r; ref = encode_range(range); }\n\tfor(var i = 0; i < names.length; ++i) {\n\t\tvar name = names[i];\n\t\tif(name.Name != '_xlnm._FilterDatabase') continue;\n\t\tif(name.Sheet != idx) continue;\n\t\tname.Ref = \"'\" + wb.SheetNames[idx] + \"'!\" + ref; break;\n\t}\n\tif(i == names.length) names.push({ Name: '_xlnm._FilterDatabase', Sheet: idx, Ref: \"'\" + wb.SheetNames[idx] + \"'!\" + ref });\n\treturn writextag(\"autoFilter\", null, {ref:ref});\n}\n\n/* 18.3.1.88 sheetViews CT_SheetViews */\n/* 18.3.1.87 sheetView CT_SheetView */\nvar sviewregex = /<(?:\\w:)?sheetView(?:[^>a-z][^>]*)?\\/?>/;\nfunction parse_ws_xml_sheetviews(data, wb) {\n\tif(!wb.Views) wb.Views = [{}];\n\t(data.match(sviewregex)||[]).forEach(function(r, i) {\n\t\tvar tag = parsexmltag(r);\n\t\t// $FlowIgnore\n\t\tif(!wb.Views[i]) wb.Views[i] = {};\n\t\t// $FlowIgnore\n\t\tif(+tag.zoomScale) wb.Views[i].zoom = +tag.zoomScale;\n\t\t// $FlowIgnore\n\t\tif(parsexmlbool(tag.rightToLeft)) wb.Views[i].RTL = true;\n\t});\n}\nfunction write_ws_xml_sheetviews(ws, opts, idx, wb) {\n\tvar sview = ({workbookViewId:\"0\"});\n\t// $FlowIgnore\n\tif((((wb||{}).Workbook||{}).Views||[])[0]) sview.rightToLeft = wb.Workbook.Views[0].RTL ? \"1\" : \"0\";\n\treturn writextag(\"sheetViews\", writextag(\"sheetView\", null, sview), {});\n}\n\nfunction write_ws_xml_cell(cell, ref, ws, opts) {\n\tif(cell.v === undefined && typeof cell.f !== \"string\" || cell.t === 'z') return \"\";\n\tvar vv = \"\";\n\tvar oldt = cell.t, oldv = cell.v;\n\tif(cell.t !== \"z\") switch(cell.t) {\n\t\tcase 'b': vv = cell.v ? \"1\" : \"0\"; break;\n\t\tcase 'n': vv = ''+cell.v; break;\n\t\tcase 'e': vv = BErr[cell.v]; break;\n\t\tcase 'd':\n\t\t\tif(opts && opts.cellDates) vv = parseDate(cell.v, -1).toISOString();\n\t\t\telse {\n\t\t\t\tcell = dup(cell);\n\t\t\t\tcell.t = 'n';\n\t\t\t\tvv = ''+(cell.v = datenum(parseDate(cell.v)));\n\t\t\t}\n\t\t\tif(typeof cell.z === 'undefined') cell.z = SSF._table[14];\n\t\t\tbreak;\n\t\tdefault: vv = cell.v; break;\n\t}\n\tvar v = writetag('v', escapexml(vv)), o = ({r:ref});\n\t/* TODO: cell style */\n\tvar os = get_cell_style(opts.cellXfs, cell, opts);\n\tif(os !== 0) o.s = os;\n\tswitch(cell.t) {\n\t\tcase 'n': break;\n\t\tcase 'd': o.t = \"d\"; break;\n\t\tcase 'b': o.t = \"b\"; break;\n\t\tcase 'e': o.t = \"e\"; break;\n\t\tcase 'z': break;\n\t\tdefault: if(cell.v == null) { delete cell.t; break; }\n\t\t\tif(cell.v.length > 32767) throw new Error(\"Text length must not exceed 32767 characters\");\n\t\t\tif(opts && opts.bookSST) {\n\t\t\t\tv = writetag('v', ''+get_sst_id(opts.Strings, cell.v, opts.revStrings));\n\t\t\t\to.t = \"s\"; break;\n\t\t\t}\n\t\t\to.t = \"str\"; break;\n\t}\n\tif(cell.t != oldt) { cell.t = oldt; cell.v = oldv; }\n\tif(typeof cell.f == \"string\" && cell.f) {\n\t\tvar ff = cell.F && cell.F.slice(0, ref.length) == ref ? {t:\"array\", ref:cell.F} : null;\n\t\tv = writextag('f', escapexml(cell.f), ff) + (cell.v != null ? v : \"\");\n\t}\n\tif(cell.l) ws['!links'].push([ref, cell.l]);\n\tif(cell.c) ws['!comments'].push([ref, cell.c]);\n\treturn writextag('c', v, o);\n}\n\nvar parse_ws_xml_data = (function() {\n\tvar cellregex = /<(?:\\w+:)?c[ \\/>]/, rowregex = /<\\/(?:\\w+:)?row>/;\n\tvar rregex = /r=[\"']([^\"']*)[\"']/, isregex = /<(?:\\w+:)?is>([\\S\\s]*?)<\\/(?:\\w+:)?is>/;\n\tvar refregex = /ref=[\"']([^\"']*)[\"']/;\n\tvar match_v = matchtag(\"v\"), match_f = matchtag(\"f\");\n\nreturn function parse_ws_xml_data(sdata, s, opts, guess, themes, styles) {\n\tvar ri = 0, x = \"\", cells = [], cref = [], idx=0, i=0, cc=0, d=\"\", p;\n\tvar tag, tagr = 0, tagc = 0;\n\tvar sstr, ftag;\n\tvar fmtid = 0, fillid = 0;\n\tvar do_format = Array.isArray(styles.CellXf), cf;\n\tvar arrayf = [];\n\tvar sharedf = [];\n\tvar dense = Array.isArray(s);\n\tvar rows = [], rowobj = {}, rowrite = false;\n\tvar sheetStubs = !!opts.sheetStubs;\n\tfor(var marr = sdata.split(rowregex), mt = 0, marrlen = marr.length; mt != marrlen; ++mt) {\n\t\tx = marr[mt].trim();\n\t\tvar xlen = x.length;\n\t\tif(xlen === 0) continue;\n\n\t\t/* 18.3.1.73 row CT_Row */\n\t\tvar rstarti = 0;\n\t\touta: for(ri = 0; ri < xlen; ++ri) switch(/*x.charCodeAt(ri)*/x[ri]) {\n\t\t\tcase \">\" /*62*/:\n\t\t\t\tif(/*x.charCodeAt(ri-1) != 47*/x[ri-1] != \"/\") { ++ri; break outa; }\n\t\t\t\tif(opts && opts.cellStyles) {\n\t\t\t\t\t// TODO: avoid duplication\n\t\t\t\t\ttag = parsexmltag(x.slice(rstarti,ri), true);\n\t\t\t\t\ttagr = tag.r != null ? parseInt(tag.r, 10) : tagr+1; tagc = -1;\n\t\t\t\t\tif(opts.sheetRows && opts.sheetRows < tagr) continue;\n\t\t\t\t\trowobj = {}; rowrite = false;\n\t\t\t\t\tif(tag.ht) { rowrite = true; rowobj.hpt = parseFloat(tag.ht); rowobj.hpx = pt2px(rowobj.hpt); }\n\t\t\t\t\tif(tag.hidden == \"1\") { rowrite = true; rowobj.hidden = true; }\n\t\t\t\t\tif(tag.outlineLevel != null) { rowrite = true; rowobj.level = +tag.outlineLevel; }\n\t\t\t\t\tif(rowrite) rows[tagr-1] = rowobj;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"<\" /*60*/: rstarti = ri; break;\n\t\t}\n\t\tif(rstarti >= ri) break;\n\t\ttag = parsexmltag(x.slice(rstarti,ri), true);\n\t\ttagr = tag.r != null ? parseInt(tag.r, 10) : tagr+1; tagc = -1;\n\t\tif(opts.sheetRows && opts.sheetRows < tagr) continue;\n\t\tif(guess.s.r > tagr - 1) guess.s.r = tagr - 1;\n\t\tif(guess.e.r < tagr - 1) guess.e.r = tagr - 1;\n\n\t\tif(opts && opts.cellStyles) {\n\t\t\trowobj = {}; rowrite = false;\n\t\t\tif(tag.ht) { rowrite = true; rowobj.hpt = parseFloat(tag.ht); rowobj.hpx = pt2px(rowobj.hpt); }\n\t\t\tif(tag.hidden == \"1\") { rowrite = true; rowobj.hidden = true; }\n\t\t\tif(tag.outlineLevel != null) { rowrite = true; rowobj.level = +tag.outlineLevel; }\n\t\t\tif(rowrite) rows[tagr-1] = rowobj;\n\t\t}\n\n\t\t/* 18.3.1.4 c CT_Cell */\n\t\tcells = x.slice(ri).split(cellregex);\n\t\tfor(var rslice = 0; rslice != cells.length; ++rslice) if(cells[rslice].trim().charAt(0) != \"<\") break;\n\t\tcells = cells.slice(rslice);\n\t\tfor(ri = 0; ri != cells.length; ++ri) {\n\t\t\tx = cells[ri].trim();\n\t\t\tif(x.length === 0) continue;\n\t\t\tcref = x.match(rregex); idx = ri; i=0; cc=0;\n\t\t\tx = \"\":\"\") + x;\n\t\t\tif(cref != null && cref.length === 2) {\n\t\t\t\tidx = 0; d=cref[1];\n\t\t\t\tfor(i=0; i != d.length; ++i) {\n\t\t\t\t\tif((cc=d.charCodeAt(i)-64) < 1 || cc > 26) break;\n\t\t\t\t\tidx = 26*idx + cc;\n\t\t\t\t}\n\t\t\t\t--idx;\n\t\t\t\ttagc = idx;\n\t\t\t} else ++tagc;\n\t\t\tfor(i = 0; i != x.length; ++i) if(x.charCodeAt(i) === 62) break; ++i;\n\t\t\ttag = parsexmltag(x.slice(0,i), true);\n\t\t\tif(!tag.r) tag.r = encode_cell({r:tagr-1, c:tagc});\n\t\t\td = x.slice(i);\n\t\t\tp = ({t:\"\"});\n\n\t\t\tif((cref=d.match(match_v))!= null && cref[1] !== '') p.v=unescapexml(cref[1]);\n\t\t\tif(opts.cellFormula) {\n\t\t\t\tif((cref=d.match(match_f))!= null && cref[1] !== '') {\n\t\t\t\t\t/* TODO: match against XLSXFutureFunctions */\n\t\t\t\t\tp.f=unescapexml(utf8read(cref[1])).replace(/\\r\\n/g, \"\\n\");\n\t\t\t\t\tif(!opts.xlfn) p.f = _xlfn(p.f);\n\t\t\t\t\tif(cref[0].indexOf('t=\"array\"') > -1) {\n\t\t\t\t\t\tp.F = (d.match(refregex)||[])[1];\n\t\t\t\t\t\tif(p.F.indexOf(\":\") > -1) arrayf.push([safe_decode_range(p.F), p.F]);\n\t\t\t\t\t} else if(cref[0].indexOf('t=\"shared\"') > -1) {\n\t\t\t\t\t\t// TODO: parse formula\n\t\t\t\t\t\tftag = parsexmltag(cref[0]);\n\t\t\t\t\t\tvar ___f = unescapexml(utf8read(cref[1]));\n\t\t\t\t\t\tif(!opts.xlfn) ___f = _xlfn(___f);\n\t\t\t\t\t\tsharedf[parseInt(ftag.si, 10)] = [ftag, ___f, tag.r];\n\t\t\t\t\t}\n\t\t\t\t} else if((cref=d.match(/]*\\/>/))) {\n\t\t\t\t\tftag = parsexmltag(cref[0]);\n\t\t\t\t\tif(sharedf[ftag.si]) p.f = shift_formula_xlsx(sharedf[ftag.si][1], sharedf[ftag.si][2]/*[0].ref*/, tag.r);\n\t\t\t\t}\n\t\t\t\t/* TODO: factor out contains logic */\n\t\t\t\tvar _tag = decode_cell(tag.r);\n\t\t\t\tfor(i = 0; i < arrayf.length; ++i)\n\t\t\t\t\tif(_tag.r >= arrayf[i][0].s.r && _tag.r <= arrayf[i][0].e.r)\n\t\t\t\t\t\tif(_tag.c >= arrayf[i][0].s.c && _tag.c <= arrayf[i][0].e.c)\n\t\t\t\t\t\t\tp.F = arrayf[i][1];\n\t\t\t}\n\n\t\t\tif(tag.t == null && p.v === undefined) {\n\t\t\t\tif(p.f || p.F) {\n\t\t\t\t\tp.v = 0; p.t = \"n\";\n\t\t\t\t} else if(!sheetStubs) continue;\n\t\t\t\telse p.t = \"z\";\n\t\t\t}\n\t\t\telse p.t = tag.t || \"n\";\n\t\t\tif(guess.s.c > tagc) guess.s.c = tagc;\n\t\t\tif(guess.e.c < tagc) guess.e.c = tagc;\n\t\t\t/* 18.18.11 t ST_CellType */\n\t\t\tswitch(p.t) {\n\t\t\t\tcase 'n':\n\t\t\t\t\tif(p.v == \"\" || p.v == null) {\n\t\t\t\t\t\tif(!sheetStubs) continue;\n\t\t\t\t\t\tp.t = 'z';\n\t\t\t\t\t} else p.v = parseFloat(p.v);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 's':\n\t\t\t\t\tif(typeof p.v == 'undefined') {\n\t\t\t\t\t\tif(!sheetStubs) continue;\n\t\t\t\t\t\tp.t = 'z';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsstr = strs[parseInt(p.v, 10)];\n\t\t\t\t\t\tp.v = sstr.t;\n\t\t\t\t\t\tp.r = sstr.r;\n\t\t\t\t\t\tif(opts.cellHTML) p.h = sstr.h;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'str':\n\t\t\t\t\tp.t = \"s\";\n\t\t\t\t\tp.v = (p.v!=null) ? utf8read(p.v) : '';\n\t\t\t\t\tif(opts.cellHTML) p.h = escapehtml(p.v);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'inlineStr':\n\t\t\t\t\tcref = d.match(isregex);\n\t\t\t\t\tp.t = 's';\n\t\t\t\t\tif(cref != null && (sstr = parse_si(cref[1]))) {\n\t\t\t\t\t\tp.v = sstr.t;\n\t\t\t\t\t\tif(opts.cellHTML) p.h = sstr.h;\n\t\t\t\t\t} else p.v = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'b': p.v = parsexmlbool(p.v); break;\n\t\t\t\tcase 'd':\n\t\t\t\t\tif(opts.cellDates) p.v = parseDate(p.v, 1);\n\t\t\t\t\telse { p.v = datenum(parseDate(p.v, 1)); p.t = 'n'; }\n\t\t\t\t\tbreak;\n\t\t\t\t/* error string in .w, number in .v */\n\t\t\t\tcase 'e':\n\t\t\t\t\tif(!opts || opts.cellText !== false) p.w = p.v;\n\t\t\t\t\tp.v = RBErr[p.v]; break;\n\t\t\t}\n\t\t\t/* formatting */\n\t\t\tfmtid = fillid = 0;\n\t\t\tcf = null;\n\t\t\tif(do_format && tag.s !== undefined) {\n\t\t\t\tcf = styles.CellXf[tag.s];\n\t\t\t\tif(cf != null) {\n\t\t\t\t\tif(cf.numFmtId != null) fmtid = cf.numFmtId;\n\t\t\t\t\tif(opts.cellStyles) {\n\t\t\t\t\t\tif(cf.fillId != null) fillid = cf.fillId;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tsafe_format(p, fmtid, fillid, opts, themes, styles);\n\t\t\tif(opts.cellDates && do_format && p.t == 'n' && SSF.is_date(SSF._table[fmtid])) { p.t = 'd'; p.v = numdate(p.v); }\n\t\t\tif(dense) {\n\t\t\t\tvar _r = decode_cell(tag.r);\n\t\t\t\tif(!s[_r.r]) s[_r.r] = [];\n\t\t\t\ts[_r.r][_r.c] = p;\n\t\t\t} else s[tag.r] = p;\n\t\t}\n\t}\n\tif(rows.length > 0) s['!rows'] = rows;\n}; })();\n\nfunction write_ws_xml_data(ws, opts, idx, wb) {\n\tvar o = [], r = [], range = safe_decode_range(ws['!ref']), cell=\"\", ref, rr = \"\", cols = [], R=0, C=0, rows = ws['!rows'];\n\tvar dense = Array.isArray(ws);\n\tvar params = ({r:rr}), row, height = -1;\n\tfor(C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C);\n\tfor(R = range.s.r; R <= range.e.r; ++R) {\n\t\tr = [];\n\t\trr = encode_row(R);\n\t\tfor(C = range.s.c; C <= range.e.c; ++C) {\n\t\t\tref = cols[C] + rr;\n\t\t\tvar _cell = dense ? (ws[R]||[])[C]: ws[ref];\n\t\t\tif(_cell === undefined) continue;\n\t\t\tif((cell = write_ws_xml_cell(_cell, ref, ws, opts, idx, wb)) != null) r.push(cell);\n\t\t}\n\t\tif(r.length > 0 || (rows && rows[R])) {\n\t\t\tparams = ({r:rr});\n\t\t\tif(rows && rows[R]) {\n\t\t\t\trow = rows[R];\n\t\t\t\tif(row.hidden) params.hidden = 1;\n\t\t\t\theight = -1;\n\t\t\t\tif(row.hpx) height = px2pt(row.hpx);\n\t\t\t\telse if(row.hpt) height = row.hpt;\n\t\t\t\tif(height > -1) { params.ht = height; params.customHeight = 1; }\n\t\t\t\tif(row.level) { params.outlineLevel = row.level; }\n\t\t\t}\n\t\t\to[o.length] = (writextag('row', r.join(\"\"), params));\n\t\t}\n\t}\n\tif(rows) for(; R < rows.length; ++R) {\n\t\tif(rows && rows[R]) {\n\t\t\tparams = ({r:R+1});\n\t\t\trow = rows[R];\n\t\t\tif(row.hidden) params.hidden = 1;\n\t\t\theight = -1;\n\t\t\tif (row.hpx) height = px2pt(row.hpx);\n\t\t\telse if (row.hpt) height = row.hpt;\n\t\t\tif (height > -1) { params.ht = height; params.customHeight = 1; }\n\t\t\tif (row.level) { params.outlineLevel = row.level; }\n\t\t\to[o.length] = (writextag('row', \"\", params));\n\t\t}\n\t}\n\treturn o.join(\"\");\n}\n\nvar WS_XML_ROOT = writextag('worksheet', null, {\n\t'xmlns': XMLNS.main[0],\n\t'xmlns:r': XMLNS.r\n});\n\nfunction write_ws_xml(idx, opts, wb, rels) {\n\tvar o = [XML_HEADER, WS_XML_ROOT];\n\tvar s = wb.SheetNames[idx], sidx = 0, rdata = \"\";\n\tvar ws = wb.Sheets[s];\n\tif(ws == null) ws = {};\n\tvar ref = ws['!ref'] || 'A1';\n\tvar range = safe_decode_range(ref);\n\tif(range.e.c > 0x3FFF || range.e.r > 0xFFFFF) {\n\t\tif(opts.WTF) throw new Error(\"Range \" + ref + \" exceeds format limit A1:XFD1048576\");\n\t\trange.e.c = Math.min(range.e.c, 0x3FFF);\n\t\trange.e.r = Math.min(range.e.c, 0xFFFFF);\n\t\tref = encode_range(range);\n\t}\n\tif(!rels) rels = {};\n\tws['!comments'] = [];\n\tvar _drawing = [];\n\n\twrite_ws_xml_sheetpr(ws, wb, idx, opts, o);\n\n\to[o.length] = (writextag('dimension', null, {'ref': ref}));\n\n\to[o.length] = write_ws_xml_sheetviews(ws, opts, idx, wb);\n\n\t/* TODO: store in WB, process styles */\n\tif(opts.sheetFormat) o[o.length] = (writextag('sheetFormatPr', null, {\n\t\tdefaultRowHeight:opts.sheetFormat.defaultRowHeight||'16',\n\t\tbaseColWidth:opts.sheetFormat.baseColWidth||'10',\n\t\toutlineLevelRow:opts.sheetFormat.outlineLevelRow||'7'\n\t}));\n\n\tif(ws['!cols'] != null && ws['!cols'].length > 0) o[o.length] = (write_ws_xml_cols(ws, ws['!cols']));\n\n\to[sidx = o.length] = '';\n\tws['!links'] = [];\n\tif(ws['!ref'] != null) {\n\t\trdata = write_ws_xml_data(ws, opts, idx, wb, rels);\n\t\tif(rdata.length > 0) o[o.length] = (rdata);\n\t}\n\tif(o.length>sidx+1) { o[o.length] = (''); o[sidx]=o[sidx].replace(\"/>\",\">\"); }\n\n\t/* sheetCalcPr */\n\n\tif(ws['!protect']) o[o.length] = write_ws_xml_protection(ws['!protect']);\n\n\t/* protectedRanges */\n\t/* scenarios */\n\n\tif(ws['!autofilter'] != null) o[o.length] = write_ws_xml_autofilter(ws['!autofilter'], ws, wb, idx);\n\n\t/* sortState */\n\t/* dataConsolidate */\n\t/* customSheetViews */\n\n\tif(ws['!merges'] != null && ws['!merges'].length > 0) o[o.length] = (write_ws_xml_merges(ws['!merges']));\n\n\t/* phoneticPr */\n\t/* conditionalFormatting */\n\t/* dataValidations */\n\n\tvar relc = -1, rel, rId = -1;\n\tif(ws['!links'].length > 0) {\n\t\to[o.length] = \"\";\nws['!links'].forEach(function(l) {\n\t\t\tif(!l[1].Target) return;\n\t\t\trel = ({\"ref\":l[0]});\n\t\t\tif(l[1].Target.charAt(0) != \"#\") {\n\t\t\t\trId = add_rels(rels, -1, escapexml(l[1].Target).replace(/#.*$/, \"\"), RELS.HLINK);\n\t\t\t\trel[\"r:id\"] = \"rId\"+rId;\n\t\t\t}\n\t\t\tif((relc = l[1].Target.indexOf(\"#\")) > -1) rel.location = escapexml(l[1].Target.slice(relc+1));\n\t\t\tif(l[1].Tooltip) rel.tooltip = escapexml(l[1].Tooltip);\n\t\t\to[o.length] = writextag(\"hyperlink\",null,rel);\n\t\t});\n\t\to[o.length] = \"\";\n\t}\n\tdelete ws['!links'];\n\n\t/* printOptions */\n\n\tif(ws['!margins'] != null) o[o.length] = write_ws_xml_margins(ws['!margins']);\n\n\t/* pageSetup */\n\t/* headerFooter */\n\t/* rowBreaks */\n\t/* colBreaks */\n\t/* customProperties */\n\t/* cellWatches */\n\n\tif(!opts || opts.ignoreEC || (opts.ignoreEC == (void 0))) o[o.length] = writetag(\"ignoredErrors\", writextag(\"ignoredError\", null, {numberStoredAsText:1, sqref:ref}));\n\n\t/* smartTags */\n\n\tif(_drawing.length > 0) {\n\t\trId = add_rels(rels, -1, \"../drawings/drawing\" + (idx+1) + \".xml\", RELS.DRAW);\n\t\to[o.length] = writextag(\"drawing\", null, {\"r:id\":\"rId\" + rId});\n\t\tws['!drawing'] = _drawing;\n\t}\n\n\tif(ws['!comments'].length > 0) {\n\t\trId = add_rels(rels, -1, \"../drawings/vmlDrawing\" + (idx+1) + \".vml\", RELS.VML);\n\t\to[o.length] = writextag(\"legacyDrawing\", null, {\"r:id\":\"rId\" + rId});\n\t\tws['!legacy'] = rId;\n\t}\n\n\t/* legacyDrawingHF */\n\t/* picture */\n\t/* oleObjects */\n\t/* controls */\n\t/* webPublishItems */\n\t/* tableParts */\n\t/* extLst */\n\n\tif(o.length>1) { o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n\n/* [MS-XLSB] 2.4.726 BrtRowHdr */\nfunction parse_BrtRowHdr(data, length) {\n\tvar z = ({});\n\tvar tgt = data.l + length;\n\tz.r = data.read_shift(4);\n\tdata.l += 4; // TODO: ixfe\n\tvar miyRw = data.read_shift(2);\n\tdata.l += 1; // TODO: top/bot padding\n\tvar flags = data.read_shift(1);\n\tdata.l = tgt;\n\tif(flags & 0x07) z.level = flags & 0x07;\n\tif(flags & 0x10) z.hidden = true;\n\tif(flags & 0x20) z.hpt = miyRw / 20;\n\treturn z;\n}\nfunction write_BrtRowHdr(R, range, ws) {\n\tvar o = new_buf(17+8*16);\n\tvar row = (ws['!rows']||[])[R]||{};\n\to.write_shift(4, R);\n\n\to.write_shift(4, 0); /* TODO: ixfe */\n\n\tvar miyRw = 0x0140;\n\tif(row.hpx) miyRw = px2pt(row.hpx) * 20;\n\telse if(row.hpt) miyRw = row.hpt * 20;\n\to.write_shift(2, miyRw);\n\n\to.write_shift(1, 0); /* top/bot padding */\n\n\tvar flags = 0x0;\n\tif(row.level) flags |= row.level;\n\tif(row.hidden) flags |= 0x10;\n\tif(row.hpx || row.hpt) flags |= 0x20;\n\to.write_shift(1, flags);\n\n\to.write_shift(1, 0); /* phonetic guide */\n\n\t/* [MS-XLSB] 2.5.8 BrtColSpan explains the mechanism */\n\tvar ncolspan = 0, lcs = o.l;\n\to.l += 4;\n\n\tvar caddr = {r:R, c:0};\n\tfor(var i = 0; i < 16; ++i) {\n\t\tif((range.s.c > ((i+1) << 10)) || (range.e.c < (i << 10))) continue;\n\t\tvar first = -1, last = -1;\n\t\tfor(var j = (i<<10); j < ((i+1)<<10); ++j) {\n\t\t\tcaddr.c = j;\n\t\t\tvar cell = Array.isArray(ws) ? (ws[caddr.r]||[])[caddr.c] : ws[encode_cell(caddr)];\n\t\t\tif(cell) { if(first < 0) first = j; last = j; }\n\t\t}\n\t\tif(first < 0) continue;\n\t\t++ncolspan;\n\t\to.write_shift(4, first);\n\t\to.write_shift(4, last);\n\t}\n\n\tvar l = o.l;\n\to.l = lcs;\n\to.write_shift(4, ncolspan);\n\to.l = l;\n\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\nfunction write_row_header(ba, ws, range, R) {\n\tvar o = write_BrtRowHdr(R, range, ws);\n\tif((o.length > 17) || (ws['!rows']||[])[R]) write_record(ba, 'BrtRowHdr', o);\n}\n\n/* [MS-XLSB] 2.4.820 BrtWsDim */\nvar parse_BrtWsDim = parse_UncheckedRfX;\nvar write_BrtWsDim = write_UncheckedRfX;\n\n/* [MS-XLSB] 2.4.821 BrtWsFmtInfo */\nfunction parse_BrtWsFmtInfo() {\n}\n//function write_BrtWsFmtInfo(ws, o) { }\n\n/* [MS-XLSB] 2.4.823 BrtWsProp */\nfunction parse_BrtWsProp(data, length) {\n\tvar z = {};\n\tvar f = data[data.l]; ++data.l;\n\tz.above = !(f & 0x40);\n\tz.left = !(f & 0x80);\n\t/* TODO: pull flags */\n\tdata.l += 18;\n\tz.name = parse_XLSBCodeName(data, length - 19);\n\treturn z;\n}\nfunction write_BrtWsProp(str, outl, o) {\n\tif(o == null) o = new_buf(84+4*str.length);\n\tvar f = 0xC0;\n\tif(outl) {\n\t\tif(outl.above) f &= ~0x40;\n\t\tif(outl.left) f &= ~0x80;\n\t}\n\to.write_shift(1, f);\n\tfor(var i = 1; i < 3; ++i) o.write_shift(1,0);\n\twrite_BrtColor({auto:1}, o);\n\to.write_shift(-4,-1);\n\to.write_shift(-4,-1);\n\twrite_XLSBCodeName(str, o);\n\treturn o.slice(0, o.l);\n}\n\n/* [MS-XLSB] 2.4.306 BrtCellBlank */\nfunction parse_BrtCellBlank(data) {\n\tvar cell = parse_XLSBCell(data);\n\treturn [cell];\n}\nfunction write_BrtCellBlank(cell, ncell, o) {\n\tif(o == null) o = new_buf(8);\n\treturn write_XLSBCell(ncell, o);\n}\nfunction parse_BrtShortBlank(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\treturn [cell];\n}\nfunction write_BrtShortBlank(cell, ncell, o) {\n\tif(o == null) o = new_buf(4);\n\treturn write_XLSBShortCell(ncell, o);\n}\n\n/* [MS-XLSB] 2.4.307 BrtCellBool */\nfunction parse_BrtCellBool(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar fBool = data.read_shift(1);\n\treturn [cell, fBool, 'b'];\n}\nfunction write_BrtCellBool(cell, ncell, o) {\n\tif(o == null) o = new_buf(9);\n\twrite_XLSBCell(ncell, o);\n\to.write_shift(1, cell.v ? 1 : 0);\n\treturn o;\n}\nfunction parse_BrtShortBool(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\tvar fBool = data.read_shift(1);\n\treturn [cell, fBool, 'b'];\n}\nfunction write_BrtShortBool(cell, ncell, o) {\n\tif(o == null) o = new_buf(5);\n\twrite_XLSBShortCell(ncell, o);\n\to.write_shift(1, cell.v ? 1 : 0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.308 BrtCellError */\nfunction parse_BrtCellError(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar bError = data.read_shift(1);\n\treturn [cell, bError, 'e'];\n}\nfunction write_BrtCellError(cell, ncell, o) {\n\tif(o == null) o = new_buf(9);\n\twrite_XLSBCell(ncell, o);\n\to.write_shift(1, cell.v);\n\treturn o;\n}\nfunction parse_BrtShortError(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\tvar bError = data.read_shift(1);\n\treturn [cell, bError, 'e'];\n}\nfunction write_BrtShortError(cell, ncell, o) {\n\tif(o == null) o = new_buf(8);\n\twrite_XLSBShortCell(ncell, o);\n\to.write_shift(1, cell.v);\n\to.write_shift(2, 0);\n\to.write_shift(1, 0);\n\treturn o;\n}\n\n\n/* [MS-XLSB] 2.4.311 BrtCellIsst */\nfunction parse_BrtCellIsst(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar isst = data.read_shift(4);\n\treturn [cell, isst, 's'];\n}\nfunction write_BrtCellIsst(cell, ncell, o) {\n\tif(o == null) o = new_buf(12);\n\twrite_XLSBCell(ncell, o);\n\to.write_shift(4, ncell.v);\n\treturn o;\n}\nfunction parse_BrtShortIsst(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\tvar isst = data.read_shift(4);\n\treturn [cell, isst, 's'];\n}\nfunction write_BrtShortIsst(cell, ncell, o) {\n\tif(o == null) o = new_buf(8);\n\twrite_XLSBShortCell(ncell, o);\n\to.write_shift(4, ncell.v);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.313 BrtCellReal */\nfunction parse_BrtCellReal(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_Xnum(data);\n\treturn [cell, value, 'n'];\n}\nfunction write_BrtCellReal(cell, ncell, o) {\n\tif(o == null) o = new_buf(16);\n\twrite_XLSBCell(ncell, o);\n\twrite_Xnum(cell.v, o);\n\treturn o;\n}\nfunction parse_BrtShortReal(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\tvar value = parse_Xnum(data);\n\treturn [cell, value, 'n'];\n}\nfunction write_BrtShortReal(cell, ncell, o) {\n\tif(o == null) o = new_buf(12);\n\twrite_XLSBShortCell(ncell, o);\n\twrite_Xnum(cell.v, o);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.314 BrtCellRk */\nfunction parse_BrtCellRk(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_RkNumber(data);\n\treturn [cell, value, 'n'];\n}\nfunction write_BrtCellRk(cell, ncell, o) {\n\tif(o == null) o = new_buf(12);\n\twrite_XLSBCell(ncell, o);\n\twrite_RkNumber(cell.v, o);\n\treturn o;\n}\nfunction parse_BrtShortRk(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\tvar value = parse_RkNumber(data);\n\treturn [cell, value, 'n'];\n}\nfunction write_BrtShortRk(cell, ncell, o) {\n\tif(o == null) o = new_buf(8);\n\twrite_XLSBShortCell(ncell, o);\n\twrite_RkNumber(cell.v, o);\n\treturn o;\n}\n\n\n/* [MS-XLSB] 2.4.317 BrtCellSt */\nfunction parse_BrtCellSt(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_XLWideString(data);\n\treturn [cell, value, 'str'];\n}\nfunction write_BrtCellSt(cell, ncell, o) {\n\tif(o == null) o = new_buf(12 + 4 * cell.v.length);\n\twrite_XLSBCell(ncell, o);\n\twrite_XLWideString(cell.v, o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\nfunction parse_BrtShortSt(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\tvar value = parse_XLWideString(data);\n\treturn [cell, value, 'str'];\n}\nfunction write_BrtShortSt(cell, ncell, o) {\n\tif(o == null) o = new_buf(8 + 4 * cell.v.length);\n\twrite_XLSBShortCell(ncell, o);\n\twrite_XLWideString(cell.v, o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.653 BrtFmlaBool */\nfunction parse_BrtFmlaBool(data, length, opts) {\n\tvar end = data.l + length;\n\tvar cell = parse_XLSBCell(data);\n\tcell.r = opts['!row'];\n\tvar value = data.read_shift(1);\n\tvar o = [cell, value, 'b'];\n\tif(opts.cellFormula) {\n\t\tdata.l += 2;\n\t\tvar formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);\n\t\to[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */\n\t}\n\telse data.l = end;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.654 BrtFmlaError */\nfunction parse_BrtFmlaError(data, length, opts) {\n\tvar end = data.l + length;\n\tvar cell = parse_XLSBCell(data);\n\tcell.r = opts['!row'];\n\tvar value = data.read_shift(1);\n\tvar o = [cell, value, 'e'];\n\tif(opts.cellFormula) {\n\t\tdata.l += 2;\n\t\tvar formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);\n\t\to[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */\n\t}\n\telse data.l = end;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.655 BrtFmlaNum */\nfunction parse_BrtFmlaNum(data, length, opts) {\n\tvar end = data.l + length;\n\tvar cell = parse_XLSBCell(data);\n\tcell.r = opts['!row'];\n\tvar value = parse_Xnum(data);\n\tvar o = [cell, value, 'n'];\n\tif(opts.cellFormula) {\n\t\tdata.l += 2;\n\t\tvar formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);\n\t\to[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */\n\t}\n\telse data.l = end;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.656 BrtFmlaString */\nfunction parse_BrtFmlaString(data, length, opts) {\n\tvar end = data.l + length;\n\tvar cell = parse_XLSBCell(data);\n\tcell.r = opts['!row'];\n\tvar value = parse_XLWideString(data);\n\tvar o = [cell, value, 'str'];\n\tif(opts.cellFormula) {\n\t\tdata.l += 2;\n\t\tvar formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);\n\t\to[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */\n\t}\n\telse data.l = end;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.682 BrtMergeCell */\nvar parse_BrtMergeCell = parse_UncheckedRfX;\nvar write_BrtMergeCell = write_UncheckedRfX;\n/* [MS-XLSB] 2.4.107 BrtBeginMergeCells */\nfunction write_BrtBeginMergeCells(cnt, o) {\n\tif(o == null) o = new_buf(4);\n\to.write_shift(4, cnt);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.662 BrtHLink */\nfunction parse_BrtHLink(data, length) {\n\tvar end = data.l + length;\n\tvar rfx = parse_UncheckedRfX(data, 16);\n\tvar relId = parse_XLNullableWideString(data);\n\tvar loc = parse_XLWideString(data);\n\tvar tooltip = parse_XLWideString(data);\n\tvar display = parse_XLWideString(data);\n\tdata.l = end;\n\tvar o = ({rfx:rfx, relId:relId, loc:loc, display:display});\n\tif(tooltip) o.Tooltip = tooltip;\n\treturn o;\n}\nfunction write_BrtHLink(l, rId) {\n\tvar o = new_buf(50+4*(l[1].Target.length + (l[1].Tooltip || \"\").length));\n\twrite_UncheckedRfX({s:decode_cell(l[0]), e:decode_cell(l[0])}, o);\n\twrite_RelID(\"rId\" + rId, o);\n\tvar locidx = l[1].Target.indexOf(\"#\");\n\tvar loc = locidx == -1 ? \"\" : l[1].Target.slice(locidx+1);\n\twrite_XLWideString(loc || \"\", o);\n\twrite_XLWideString(l[1].Tooltip || \"\", o);\n\twrite_XLWideString(\"\", o);\n\treturn o.slice(0, o.l);\n}\n\n/* [MS-XLSB] 2.4.692 BrtPane */\nfunction parse_BrtPane(/*data, length, opts*/) {\n}\n\n/* [MS-XLSB] 2.4.6 BrtArrFmla */\nfunction parse_BrtArrFmla(data, length, opts) {\n\tvar end = data.l + length;\n\tvar rfx = parse_RfX(data, 16);\n\tvar fAlwaysCalc = data.read_shift(1);\n\tvar o = [rfx]; o[2] = fAlwaysCalc;\n\tif(opts.cellFormula) {\n\t\tvar formula = parse_XLSBArrayParsedFormula(data, end - data.l, opts);\n\t\to[1] = formula;\n\t} else data.l = end;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.750 BrtShrFmla */\nfunction parse_BrtShrFmla(data, length, opts) {\n\tvar end = data.l + length;\n\tvar rfx = parse_UncheckedRfX(data, 16);\n\tvar o = [rfx];\n\tif(opts.cellFormula) {\n\t\tvar formula = parse_XLSBSharedParsedFormula(data, end - data.l, opts);\n\t\to[1] = formula;\n\t\tdata.l = end;\n\t} else data.l = end;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.323 BrtColInfo */\n/* TODO: once XLS ColInfo is set, combine the functions */\nfunction write_BrtColInfo(C, col, o) {\n\tif(o == null) o = new_buf(18);\n\tvar p = col_obj_w(C, col);\n\to.write_shift(-4, C);\n\to.write_shift(-4, C);\n\to.write_shift(4, (p.width || 10) * 256);\n\to.write_shift(4, 0/*ixfe*/); // style\n\tvar flags = 0;\n\tif(col.hidden) flags |= 0x01;\n\tif(typeof p.width == 'number') flags |= 0x02;\n\tif(col.level) flags |= (col.level << 8);\n\to.write_shift(2, flags); // bit flag\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.678 BrtMargins */\nvar BrtMarginKeys = [\"left\",\"right\",\"top\",\"bottom\",\"header\",\"footer\"];\nfunction parse_BrtMargins(data) {\n\tvar margins = ({});\n\tBrtMarginKeys.forEach(function(k) { margins[k] = parse_Xnum(data, 8); });\n\treturn margins;\n}\nfunction write_BrtMargins(margins, o) {\n\tif(o == null) o = new_buf(6*8);\n\tdefault_margins(margins);\n\tBrtMarginKeys.forEach(function(k) { write_Xnum((margins)[k], o); });\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.299 BrtBeginWsView */\nfunction parse_BrtBeginWsView(data) {\n\tvar f = data.read_shift(2);\n\tdata.l += 28;\n\treturn { RTL: f & 0x20 };\n}\nfunction write_BrtBeginWsView(ws, Workbook, o) {\n\tif(o == null) o = new_buf(30);\n\tvar f = 0x39c;\n\tif((((Workbook||{}).Views||[])[0]||{}).RTL) f |= 0x20;\n\to.write_shift(2, f); // bit flag\n\to.write_shift(4, 0);\n\to.write_shift(4, 0); // view first row\n\to.write_shift(4, 0); // view first col\n\to.write_shift(1, 0); // gridline color ICV\n\to.write_shift(1, 0);\n\to.write_shift(2, 0);\n\to.write_shift(2, 100); // zoom scale\n\to.write_shift(2, 0);\n\to.write_shift(2, 0);\n\to.write_shift(2, 0);\n\to.write_shift(4, 0); // workbook view id\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.309 BrtCellIgnoreEC */\nfunction write_BrtCellIgnoreEC(ref) {\n\tvar o = new_buf(24);\n\to.write_shift(4, 4);\n\to.write_shift(4, 1);\n\twrite_UncheckedRfX(ref, o);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.748 BrtSheetProtection */\nfunction write_BrtSheetProtection(sp, o) {\n\tif(o == null) o = new_buf(16*4+2);\n\to.write_shift(2, sp.password ? crypto_CreatePasswordVerifier_Method1(sp.password) : 0);\n\to.write_shift(4, 1); // this record should not be written if no protection\n\t[\n\t\t[\"objects\", false], // fObjects\n\t\t[\"scenarios\", false], // fScenarios\n\t\t[\"formatCells\", true], // fFormatCells\n\t\t[\"formatColumns\", true], // fFormatColumns\n\t\t[\"formatRows\", true], // fFormatRows\n\t\t[\"insertColumns\", true], // fInsertColumns\n\t\t[\"insertRows\", true], // fInsertRows\n\t\t[\"insertHyperlinks\", true], // fInsertHyperlinks\n\t\t[\"deleteColumns\", true], // fDeleteColumns\n\t\t[\"deleteRows\", true], // fDeleteRows\n\t\t[\"selectLockedCells\", false], // fSelLockedCells\n\t\t[\"sort\", true], // fSort\n\t\t[\"autoFilter\", true], // fAutoFilter\n\t\t[\"pivotTables\", true], // fPivotTables\n\t\t[\"selectUnlockedCells\", false] // fSelUnlockedCells\n\t].forEach(function(n) {\nif(n[1]) o.write_shift(4, sp[n[0]] != null && !sp[n[0]] ? 1 : 0);\n\t\telse o.write_shift(4, sp[n[0]] != null && sp[n[0]] ? 0 : 1);\n\t});\n\treturn o;\n}\n\nfunction parse_BrtDVal(/*data, length, opts*/) {\n}\nfunction parse_BrtDVal14(/*data, length, opts*/) {\n}\n/* [MS-XLSB] 2.1.7.61 Worksheet */\nfunction parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {\n\tif(!data) return data;\n\tvar opts = _opts || {};\n\tif(!rels) rels = {'!id':{}};\n\tif(DENSE != null && opts.dense == null) opts.dense = DENSE;\n\tvar s = (opts.dense ? [] : {});\n\n\tvar ref;\n\tvar refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };\n\n\tvar state = [];\n\tvar pass = false, end = false;\n\tvar row, p, cf, R, C, addr, sstr, rr, cell;\n\tvar merges = [];\n\topts.biff = 12;\n\topts['!row'] = 0;\n\n\tvar ai = 0, af = false;\n\n\tvar arrayf = [];\n\tvar sharedf = {};\n\tvar supbooks = opts.supbooks || wb.supbooks || ([[]]);\n\tsupbooks.sharedf = sharedf;\n\tsupbooks.arrayf = arrayf;\n\tsupbooks.SheetNames = wb.SheetNames || wb.Sheets.map(function(x) { return x.name; });\n\tif(!opts.supbooks) {\n\t\topts.supbooks = supbooks;\n\t\tif(wb.Names) for(var i = 0; i < wb.Names.length; ++i) supbooks[0][i+1] = wb.Names[i];\n\t}\n\n\tvar colinfo = [], rowinfo = [];\n\tvar seencol = false;\n\n\tXLSBRecordEnum[0x0010] = { n:\"BrtShortReal\", f:parse_BrtShortReal };\n\n\trecordhopper(data, function ws_parse(val, R_n, RT) {\n\t\tif(end) return;\n\t\tswitch(RT) {\n\t\t\tcase 0x0094: /* 'BrtWsDim' */\n\t\t\t\tref = val; break;\n\t\t\tcase 0x0000: /* 'BrtRowHdr' */\n\t\t\t\trow = val;\n\t\t\t\tif(opts.sheetRows && opts.sheetRows <= row.r) end=true;\n\t\t\t\trr = encode_row(R = row.r);\n\t\t\t\topts['!row'] = row.r;\n\t\t\t\tif(val.hidden || val.hpt || val.level != null) {\n\t\t\t\t\tif(val.hpt) val.hpx = pt2px(val.hpt);\n\t\t\t\t\trowinfo[val.r] = val;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0002: /* 'BrtCellRk' */\n\t\t\tcase 0x0003: /* 'BrtCellError' */\n\t\t\tcase 0x0004: /* 'BrtCellBool' */\n\t\t\tcase 0x0005: /* 'BrtCellReal' */\n\t\t\tcase 0x0006: /* 'BrtCellSt' */\n\t\t\tcase 0x0007: /* 'BrtCellIsst' */\n\t\t\tcase 0x0008: /* 'BrtFmlaString' */\n\t\t\tcase 0x0009: /* 'BrtFmlaNum' */\n\t\t\tcase 0x000A: /* 'BrtFmlaBool' */\n\t\t\tcase 0x000B: /* 'BrtFmlaError' */\n\t\t\tcase 0x000D: /* 'BrtShortRk' */\n\t\t\tcase 0x000E: /* 'BrtShortError' */\n\t\t\tcase 0x000F: /* 'BrtShortBool' */\n\t\t\tcase 0x0010: /* 'BrtShortReal' */\n\t\t\tcase 0x0011: /* 'BrtShortSt' */\n\t\t\tcase 0x0012: /* 'BrtShortIsst' */\n\t\t\t\tp = ({t:val[2]});\n\t\t\t\tswitch(val[2]) {\n\t\t\t\t\tcase 'n': p.v = val[1]; break;\n\t\t\t\t\tcase 's': sstr = strs[val[1]]; p.v = sstr.t; p.r = sstr.r; break;\n\t\t\t\t\tcase 'b': p.v = val[1] ? true : false; break;\n\t\t\t\t\tcase 'e': p.v = val[1]; if(opts.cellText !== false) p.w = BErr[p.v]; break;\n\t\t\t\t\tcase 'str': p.t = 's'; p.v = val[1]; break;\n\t\t\t\t}\n\t\t\t\tif((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.numFmtId,null,opts, themes, styles);\n\t\t\t\tC = val[0].c == -1 ? C + 1 : val[0].c;\n\t\t\t\tif(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }\n\t\t\t\telse s[encode_col(C) + rr] = p;\n\t\t\t\tif(opts.cellFormula) {\n\t\t\t\t\taf = false;\n\t\t\t\t\tfor(ai = 0; ai < arrayf.length; ++ai) {\n\t\t\t\t\t\tvar aii = arrayf[ai];\n\t\t\t\t\t\tif(row.r >= aii[0].s.r && row.r <= aii[0].e.r)\n\t\t\t\t\t\t\tif(C >= aii[0].s.c && C <= aii[0].e.c) {\n\t\t\t\t\t\t\t\tp.F = encode_range(aii[0]); af = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(!af && val.length > 3) p.f = val[3];\n\t\t\t\t}\n\t\t\t\tif(refguess.s.r > row.r) refguess.s.r = row.r;\n\t\t\t\tif(refguess.s.c > C) refguess.s.c = C;\n\t\t\t\tif(refguess.e.r < row.r) refguess.e.r = row.r;\n\t\t\t\tif(refguess.e.c < C) refguess.e.c = C;\n\t\t\t\tif(opts.cellDates && cf && p.t == 'n' && SSF.is_date(SSF._table[cf.numFmtId])) {\n\t\t\t\t\tvar _d = SSF.parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0001: /* 'BrtCellBlank' */\n\t\t\tcase 0x000C: /* 'BrtShortBlank' */\n\t\t\t\tif(!opts.sheetStubs || pass) break;\n\t\t\t\tp = ({t:'z',v:undefined});\n\t\t\t\tC = val[0].c == -1 ? C + 1 : val[0].c;\n\t\t\t\tif(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }\n\t\t\t\telse s[encode_col(C) + rr] = p;\n\t\t\t\tif(refguess.s.r > row.r) refguess.s.r = row.r;\n\t\t\t\tif(refguess.s.c > C) refguess.s.c = C;\n\t\t\t\tif(refguess.e.r < row.r) refguess.e.r = row.r;\n\t\t\t\tif(refguess.e.c < C) refguess.e.c = C;\n\t\t\t\tbreak;\n\n\t\t\tcase 0x00B0: /* 'BrtMergeCell' */\n\t\t\t\tmerges.push(val); break;\n\n\t\t\tcase 0x01EE: /* 'BrtHLink' */\n\t\t\t\tvar rel = rels['!id'][val.relId];\n\t\t\t\tif(rel) {\n\t\t\t\t\tval.Target = rel.Target;\n\t\t\t\t\tif(val.loc) val.Target += \"#\"+val.loc;\n\t\t\t\t\tval.Rel = rel;\n\t\t\t\t} else if(val.relId == '') {\n\t\t\t\t\tval.Target = \"#\" + val.loc;\n\t\t\t\t}\n\t\t\t\tfor(R=val.rfx.s.r;R<=val.rfx.e.r;++R) for(C=val.rfx.s.c;C<=val.rfx.e.c;++C) {\n\t\t\t\t\tif(opts.dense) {\n\t\t\t\t\t\tif(!s[R]) s[R] = [];\n\t\t\t\t\t\tif(!s[R][C]) s[R][C] = {t:'z',v:undefined};\n\t\t\t\t\t\ts[R][C].l = val;\n\t\t\t\t\t} else {\n\t\t\t\t\t\taddr = encode_cell({c:C,r:R});\n\t\t\t\t\t\tif(!s[addr]) s[addr] = {t:'z',v:undefined};\n\t\t\t\t\t\ts[addr].l = val;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 0x01AA: /* 'BrtArrFmla' */\n\t\t\t\tif(!opts.cellFormula) break;\n\t\t\t\tarrayf.push(val);\n\t\t\t\tcell = ((opts.dense ? s[R][C] : s[encode_col(C) + rr]));\n\t\t\t\tcell.f = stringify_formula(val[1], refguess, {r:row.r, c:C}, supbooks, opts);\n\t\t\t\tcell.F = encode_range(val[0]);\n\t\t\t\tbreak;\n\t\t\tcase 0x01AB: /* 'BrtShrFmla' */\n\t\t\t\tif(!opts.cellFormula) break;\n\t\t\t\tsharedf[encode_cell(val[0].s)] = val[1];\n\t\t\t\tcell = (opts.dense ? s[R][C] : s[encode_col(C) + rr]);\n\t\t\t\tcell.f = stringify_formula(val[1], refguess, {r:row.r, c:C}, supbooks, opts);\n\t\t\t\tbreak;\n\n\t\t\t/* identical to 'ColInfo' in XLS */\n\t\t\tcase 0x003C: /* 'BrtColInfo' */\n\t\t\t\tif(!opts.cellStyles) break;\n\t\t\t\twhile(val.e >= val.s) {\n\t\t\t\t\tcolinfo[val.e--] = { width: val.w/256, hidden: !!(val.flags & 0x01), level: val.level };\n\t\t\t\t\tif(!seencol) { seencol = true; find_mdw_colw(val.w/256); }\n\t\t\t\t\tprocess_col(colinfo[val.e+1]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 0x00A1: /* 'BrtBeginAFilter' */\n\t\t\t\ts['!autofilter'] = { ref:encode_range(val) };\n\t\t\t\tbreak;\n\n\t\t\tcase 0x01DC: /* 'BrtMargins' */\n\t\t\t\ts['!margins'] = val;\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0093: /* 'BrtWsProp' */\n\t\t\t\tif(!wb.Sheets[idx]) wb.Sheets[idx] = {};\n\t\t\t\tif(val.name) wb.Sheets[idx].CodeName = val.name;\n\t\t\t\tif(val.above || val.left) s['!outline'] = { above: val.above, left: val.left };\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0089: /* 'BrtBeginWsView' */\n\t\t\t\tif(!wb.Views) wb.Views = [{}];\n\t\t\t\tif(!wb.Views[0]) wb.Views[0] = {};\n\t\t\t\tif(val.RTL) wb.Views[0].RTL = true;\n\t\t\t\tbreak;\n\n\t\t\tcase 0x01E5: /* 'BrtWsFmtInfo' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0040: /* 'BrtDVal' */\n\t\t\tcase 0x041D: /* 'BrtDVal14' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0097: /* 'BrtPane' */\n\t\t\t\tbreak;\n\t\t\tcase 0x0098: /* 'BrtSel' */\n\t\t\tcase 0x00AF: /* 'BrtAFilterDateGroupItem' */\n\t\t\tcase 0x0284: /* 'BrtActiveX' */\n\t\t\tcase 0x0271: /* 'BrtBigName' */\n\t\t\tcase 0x0232: /* 'BrtBkHim' */\n\t\t\tcase 0x018C: /* 'BrtBrk' */\n\t\t\tcase 0x0458: /* 'BrtCFIcon' */\n\t\t\tcase 0x047A: /* 'BrtCFRuleExt' */\n\t\t\tcase 0x01D7: /* 'BrtCFVO' */\n\t\t\tcase 0x041A: /* 'BrtCFVO14' */\n\t\t\tcase 0x0289: /* 'BrtCellIgnoreEC' */\n\t\t\tcase 0x0451: /* 'BrtCellIgnoreEC14' */\n\t\t\tcase 0x0031: /* 'BrtCellMeta' */\n\t\t\tcase 0x024D: /* 'BrtCellSmartTagProperty' */\n\t\t\tcase 0x025F: /* 'BrtCellWatch' */\n\t\t\tcase 0x0234: /* 'BrtColor' */\n\t\t\tcase 0x041F: /* 'BrtColor14' */\n\t\t\tcase 0x00A8: /* 'BrtColorFilter' */\n\t\t\tcase 0x00AE: /* 'BrtCustomFilter' */\n\t\t\tcase 0x049C: /* 'BrtCustomFilter14' */\n\t\t\tcase 0x01F3: /* 'BrtDRef' */\n\t\t\tcase 0x01FB: /* 'BrtDXF' */\n\t\t\tcase 0x0226: /* 'BrtDrawing' */\n\t\t\tcase 0x00AB: /* 'BrtDynamicFilter' */\n\t\t\tcase 0x00A7: /* 'BrtFilter' */\n\t\t\tcase 0x0499: /* 'BrtFilter14' */\n\t\t\tcase 0x00A9: /* 'BrtIconFilter' */\n\t\t\tcase 0x049D: /* 'BrtIconFilter14' */\n\t\t\tcase 0x0227: /* 'BrtLegacyDrawing' */\n\t\t\tcase 0x0228: /* 'BrtLegacyDrawingHF' */\n\t\t\tcase 0x0295: /* 'BrtListPart' */\n\t\t\tcase 0x027F: /* 'BrtOleObject' */\n\t\t\tcase 0x01DE: /* 'BrtPageSetup' */\n\t\t\tcase 0x0219: /* 'BrtPhoneticInfo' */\n\t\t\tcase 0x01DD: /* 'BrtPrintOptions' */\n\t\t\tcase 0x0218: /* 'BrtRangeProtection' */\n\t\t\tcase 0x044F: /* 'BrtRangeProtection14' */\n\t\t\tcase 0x02A8: /* 'BrtRangeProtectionIso' */\n\t\t\tcase 0x0450: /* 'BrtRangeProtectionIso14' */\n\t\t\tcase 0x0400: /* 'BrtRwDescent' */\n\t\t\tcase 0x0297: /* 'BrtSheetCalcProp' */\n\t\t\tcase 0x0217: /* 'BrtSheetProtection' */\n\t\t\tcase 0x02A6: /* 'BrtSheetProtectionIso' */\n\t\t\tcase 0x01F8: /* 'BrtSlc' */\n\t\t\tcase 0x0413: /* 'BrtSparkline' */\n\t\t\tcase 0x01AC: /* 'BrtTable' */\n\t\t\tcase 0x00AA: /* 'BrtTop10Filter' */\n\t\t\tcase 0x0C00: /* 'BrtUid' */\n\t\t\tcase 0x0032: /* 'BrtValueMeta' */\n\t\t\tcase 0x0816: /* 'BrtWebExtension' */\n\t\t\tcase 0x0415: /* 'BrtWsFmtInfoEx14' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0023: /* 'BrtFRTBegin' */\n\t\t\t\tpass = true; break;\n\t\t\tcase 0x0024: /* 'BrtFRTEnd' */\n\t\t\t\tpass = false; break;\n\t\t\tcase 0x0025: /* 'BrtACBegin' */\n\t\t\t\tstate.push(R_n); pass = true; break;\n\t\t\tcase 0x0026: /* 'BrtACEnd' */\n\t\t\t\tstate.pop(); pass = false; break;\n\n\t\t\tdefault:\n\t\t\t\tif((R_n||\"\").indexOf(\"Begin\") > 0){/* empty */}\n\t\t\t\telse if((R_n||\"\").indexOf(\"End\") > 0){/* empty */}\n\t\t\t\telse if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R_n);\n\t\t}\n\t}, opts);\n\n\tdelete opts.supbooks;\n\tdelete opts['!row'];\n\n\tif(!s[\"!ref\"] && (refguess.s.r < 2000000 || ref && (ref.e.r > 0 || ref.e.c > 0 || ref.s.r > 0 || ref.s.c > 0))) s[\"!ref\"] = encode_range(ref || refguess);\n\tif(opts.sheetRows && s[\"!ref\"]) {\n\t\tvar tmpref = safe_decode_range(s[\"!ref\"]);\n\t\tif(opts.sheetRows <= +tmpref.e.r) {\n\t\t\ttmpref.e.r = opts.sheetRows - 1;\n\t\t\tif(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;\n\t\t\tif(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;\n\t\t\tif(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;\n\t\t\tif(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;\n\t\t\ts[\"!fullref\"] = s[\"!ref\"];\n\t\t\ts[\"!ref\"] = encode_range(tmpref);\n\t\t}\n\t}\n\tif(merges.length > 0) s[\"!merges\"] = merges;\n\tif(colinfo.length > 0) s[\"!cols\"] = colinfo;\n\tif(rowinfo.length > 0) s[\"!rows\"] = rowinfo;\n\treturn s;\n}\n\n/* TODO: something useful -- this is a stub */\nfunction write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen) {\n\tif(cell.v === undefined) return false;\n\tvar vv = \"\";\n\tswitch(cell.t) {\n\t\tcase 'b': vv = cell.v ? \"1\" : \"0\"; break;\n\t\tcase 'd': // no BrtCellDate :(\n\t\t\tcell = dup(cell);\n\t\t\tcell.z = cell.z || SSF._table[14];\n\t\t\tcell.v = datenum(parseDate(cell.v)); cell.t = 'n';\n\t\t\tbreak;\n\t\t/* falls through */\n\t\tcase 'n': case 'e': vv = ''+cell.v; break;\n\t\tdefault: vv = cell.v; break;\n\t}\n\tvar o = ({r:R, c:C});\n\t/* TODO: cell style */\n\to.s = get_cell_style(opts.cellXfs, cell, opts);\n\tif(cell.l) ws['!links'].push([encode_cell(o), cell.l]);\n\tif(cell.c) ws['!comments'].push([encode_cell(o), cell.c]);\n\tswitch(cell.t) {\n\t\tcase 's': case 'str':\n\t\t\tif(opts.bookSST) {\n\t\t\t\tvv = get_sst_id(opts.Strings, (cell.v), opts.revStrings);\n\t\t\t\to.t = \"s\"; o.v = vv;\n\t\t\t\tif(last_seen) write_record(ba, \"BrtShortIsst\", write_BrtShortIsst(cell, o));\n\t\t\t\telse write_record(ba, \"BrtCellIsst\", write_BrtCellIsst(cell, o));\n\t\t\t} else {\n\t\t\t\to.t = \"str\";\n\t\t\t\tif(last_seen) write_record(ba, \"BrtShortSt\", write_BrtShortSt(cell, o));\n\t\t\t\telse write_record(ba, \"BrtCellSt\", write_BrtCellSt(cell, o));\n\t\t\t}\n\t\t\treturn true;\n\t\tcase 'n':\n\t\t\t/* TODO: determine threshold for Real vs RK */\n\t\t\tif(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) {\n\t\t\t\tif(last_seen) write_record(ba, \"BrtShortRk\", write_BrtShortRk(cell, o));\n\t\t\t\telse write_record(ba, \"BrtCellRk\", write_BrtCellRk(cell, o));\n\t\t\t} else {\n\t\t\t\tif(last_seen) write_record(ba, \"BrtShortReal\", write_BrtShortReal(cell, o));\n\t\t\t\telse write_record(ba, \"BrtCellReal\", write_BrtCellReal(cell, o));\n\t\t\t} return true;\n\t\tcase 'b':\n\t\t\to.t = \"b\";\n\t\t\tif(last_seen) write_record(ba, \"BrtShortBool\", write_BrtShortBool(cell, o));\n\t\t\telse write_record(ba, \"BrtCellBool\", write_BrtCellBool(cell, o));\n\t\t\treturn true;\n\t\tcase 'e':\n\t\t\to.t = \"e\";\n\t\t\tif(last_seen) write_record(ba, \"BrtShortError\", write_BrtShortError(cell, o));\n\t\t\telse write_record(ba, \"BrtCellError\", write_BrtCellError(cell, o));\n\t\t\treturn true;\n\t}\n\tif(last_seen) write_record(ba, \"BrtShortBlank\", write_BrtShortBlank(cell, o));\n\telse write_record(ba, \"BrtCellBlank\", write_BrtCellBlank(cell, o));\n\treturn true;\n}\n\nfunction write_CELLTABLE(ba, ws, idx, opts) {\n\tvar range = safe_decode_range(ws['!ref'] || \"A1\"), ref, rr = \"\", cols = [];\n\twrite_record(ba, 'BrtBeginSheetData');\n\tvar dense = Array.isArray(ws);\n\tvar cap = range.e.r;\n\tif(ws['!rows']) cap = Math.max(range.e.r, ws['!rows'].length - 1);\n\tfor(var R = range.s.r; R <= cap; ++R) {\n\t\trr = encode_row(R);\n\t\t/* [ACCELLTABLE] */\n\t\t/* BrtRowHdr */\n\t\twrite_row_header(ba, ws, range, R);\n\t\tvar last_seen = false;\n\t\tif(R <= range.e.r) for(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\t/* *16384CELL */\n\t\t\tif(R === range.s.r) cols[C] = encode_col(C);\n\t\t\tref = cols[C] + rr;\n\t\t\tvar cell = dense ? (ws[R]||[])[C] : ws[ref];\n\t\t\tif(!cell) { last_seen = false; continue; }\n\t\t\t/* write cell */\n\t\t\tlast_seen = write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen);\n\t\t}\n\t}\n\twrite_record(ba, 'BrtEndSheetData');\n}\n\nfunction write_MERGECELLS(ba, ws) {\n\tif(!ws || !ws['!merges']) return;\n\twrite_record(ba, 'BrtBeginMergeCells', write_BrtBeginMergeCells(ws['!merges'].length));\n\tws['!merges'].forEach(function(m) { write_record(ba, 'BrtMergeCell', write_BrtMergeCell(m)); });\n\twrite_record(ba, 'BrtEndMergeCells');\n}\n\nfunction write_COLINFOS(ba, ws) {\n\tif(!ws || !ws['!cols']) return;\n\twrite_record(ba, 'BrtBeginColInfos');\n\tws['!cols'].forEach(function(m, i) { if(m) write_record(ba, 'BrtColInfo', write_BrtColInfo(i, m)); });\n\twrite_record(ba, 'BrtEndColInfos');\n}\n\nfunction write_IGNOREECS(ba, ws) {\n\tif(!ws || !ws['!ref']) return;\n\twrite_record(ba, 'BrtBeginCellIgnoreECs');\n\twrite_record(ba, 'BrtCellIgnoreEC', write_BrtCellIgnoreEC(safe_decode_range(ws['!ref'])));\n\twrite_record(ba, 'BrtEndCellIgnoreECs');\n}\n\nfunction write_HLINKS(ba, ws, rels) {\n\t/* *BrtHLink */\n\tws['!links'].forEach(function(l) {\n\t\tif(!l[1].Target) return;\n\t\tvar rId = add_rels(rels, -1, l[1].Target.replace(/#.*$/, \"\"), RELS.HLINK);\n\t\twrite_record(ba, \"BrtHLink\", write_BrtHLink(l, rId));\n\t});\n\tdelete ws['!links'];\n}\nfunction write_LEGACYDRAWING(ba, ws, idx, rels) {\n\t/* [BrtLegacyDrawing] */\n\tif(ws['!comments'].length > 0) {\n\t\tvar rId = add_rels(rels, -1, \"../drawings/vmlDrawing\" + (idx+1) + \".vml\", RELS.VML);\n\t\twrite_record(ba, \"BrtLegacyDrawing\", write_RelID(\"rId\" + rId));\n\t\tws['!legacy'] = rId;\n\t}\n}\n\nfunction write_AUTOFILTER(ba, ws, wb, idx) {\n\tif(!ws['!autofilter']) return;\n\tvar data = ws['!autofilter'];\n\tvar ref = typeof data.ref === \"string\" ? data.ref : encode_range(data.ref);\n\n\t/* Update FilterDatabase defined name for the worksheet */\n\tif(!wb.Workbook) wb.Workbook = ({Sheets:[]});\n\tif(!wb.Workbook.Names) wb.Workbook.Names = [];\n\tvar names = wb.Workbook.Names;\n\tvar range = decode_range(ref);\n\tif(range.s.r == range.e.r) { range.e.r = decode_range(ws[\"!ref\"]).e.r; ref = encode_range(range); }\n\tfor(var i = 0; i < names.length; ++i) {\n\t\tvar name = names[i];\n\t\tif(name.Name != '_xlnm._FilterDatabase') continue;\n\t\tif(name.Sheet != idx) continue;\n\t\tname.Ref = \"'\" + wb.SheetNames[idx] + \"'!\" + ref; break;\n\t}\n\tif(i == names.length) names.push({ Name: '_xlnm._FilterDatabase', Sheet: idx, Ref: \"'\" + wb.SheetNames[idx] + \"'!\" + ref });\n\n\twrite_record(ba, \"BrtBeginAFilter\", write_UncheckedRfX(safe_decode_range(ref)));\n\t/* *FILTERCOLUMN */\n\t/* [SORTSTATE] */\n\t/* BrtEndAFilter */\n\twrite_record(ba, \"BrtEndAFilter\");\n}\n\nfunction write_WSVIEWS2(ba, ws, Workbook) {\n\twrite_record(ba, \"BrtBeginWsViews\");\n\t{ /* 1*WSVIEW2 */\n\t\t/* [ACUID] */\n\t\twrite_record(ba, \"BrtBeginWsView\", write_BrtBeginWsView(ws, Workbook));\n\t\t/* [BrtPane] */\n\t\t/* *4BrtSel */\n\t\t/* *4SXSELECT */\n\t\t/* *FRT */\n\t\twrite_record(ba, \"BrtEndWsView\");\n\t}\n\t/* *FRT */\n\twrite_record(ba, \"BrtEndWsViews\");\n}\n\nfunction write_WSFMTINFO() {\n\t/* [ACWSFMTINFO] */\n\t//write_record(ba, \"BrtWsFmtInfo\", write_BrtWsFmtInfo(ws));\n}\n\nfunction write_SHEETPROTECT(ba, ws) {\n\tif(!ws['!protect']) return;\n\t/* [BrtSheetProtectionIso] */\n\twrite_record(ba, \"BrtSheetProtection\", write_BrtSheetProtection(ws['!protect']));\n}\n\nfunction write_ws_bin(idx, opts, wb, rels) {\n\tvar ba = buf_array();\n\tvar s = wb.SheetNames[idx], ws = wb.Sheets[s] || {};\n\tvar c = s; try { if(wb && wb.Workbook) c = wb.Workbook.Sheets[idx].CodeName || c; } catch(e) {}\n\tvar r = safe_decode_range(ws['!ref'] || \"A1\");\n\tif(r.e.c > 0x3FFF || r.e.r > 0xFFFFF) {\n\t\tif(opts.WTF) throw new Error(\"Range \" + (ws['!ref'] || \"A1\") + \" exceeds format limit A1:XFD1048576\");\n\t\tr.e.c = Math.min(r.e.c, 0x3FFF);\n\t\tr.e.r = Math.min(r.e.c, 0xFFFFF);\n\t}\n\tws['!links'] = [];\n\t/* passed back to write_zip and removed there */\n\tws['!comments'] = [];\n\twrite_record(ba, \"BrtBeginSheet\");\n\tif(wb.vbaraw || ws['!outline']) write_record(ba, \"BrtWsProp\", write_BrtWsProp(c, ws['!outline']));\n\twrite_record(ba, \"BrtWsDim\", write_BrtWsDim(r));\n\twrite_WSVIEWS2(ba, ws, wb.Workbook);\n\twrite_WSFMTINFO(ba, ws);\n\twrite_COLINFOS(ba, ws, idx, opts, wb);\n\twrite_CELLTABLE(ba, ws, idx, opts, wb);\n\t/* [BrtSheetCalcProp] */\n\twrite_SHEETPROTECT(ba, ws);\n\t/* *([BrtRangeProtectionIso] BrtRangeProtection) */\n\t/* [SCENMAN] */\n\twrite_AUTOFILTER(ba, ws, wb, idx);\n\t/* [SORTSTATE] */\n\t/* [DCON] */\n\t/* [USERSHVIEWS] */\n\twrite_MERGECELLS(ba, ws);\n\t/* [BrtPhoneticInfo] */\n\t/* *CONDITIONALFORMATTING */\n\t/* [DVALS] */\n\twrite_HLINKS(ba, ws, rels);\n\t/* [BrtPrintOptions] */\n\tif(ws['!margins']) write_record(ba, \"BrtMargins\", write_BrtMargins(ws['!margins']));\n\t/* [BrtPageSetup] */\n\t/* [HEADERFOOTER] */\n\t/* [RWBRK] */\n\t/* [COLBRK] */\n\t/* *BrtBigName */\n\t/* [CELLWATCHES] */\n\tif(!opts || opts.ignoreEC || (opts.ignoreEC == (void 0))) write_IGNOREECS(ba, ws);\n\t/* [SMARTTAGS] */\n\t/* [BrtDrawing] */\n\twrite_LEGACYDRAWING(ba, ws, idx, rels);\n\t/* [BrtLegacyDrawingHF] */\n\t/* [BrtBkHim] */\n\t/* [OLEOBJECTS] */\n\t/* [ACTIVEXCONTROLS] */\n\t/* [WEBPUBITEMS] */\n\t/* [LISTPARTS] */\n\t/* FRTWORKSHEET */\n\twrite_record(ba, \"BrtEndSheet\");\n\treturn ba.end();\n}\nRELS.CHART = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\";\nRELS.CHARTEX = \"http://schemas.microsoft.com/office/2014/relationships/chartEx\";\n\nfunction parse_Cache(data) {\n\tvar col = [];\n\tvar num = data.match(/^/);\n\tvar f;\n\n\t/* 21.2.2.150 pt CT_NumVal */\n\t(data.match(/(.*?)<\\/c:pt>/mg)||[]).forEach(function(pt) {\n\t\tvar q = pt.match(/(.*)<\\/c:v><\\/c:pt>/);\n\t\tif(!q) return;\n\t\tcol[+q[1]] = num ? +q[2] : q[2];\n\t});\n\n\t/* 21.2.2.71 formatCode CT_Xstring */\n\tvar nf = unescapexml((data.match(/([\\s\\S]*?)<\\/c:formatCode>/) || [\"\",\"General\"])[1]);\n\n\t(data.match(/(.*?)<\\/c:f>/mg)||[]).forEach(function(F) { f = F.replace(/<.*?>/g,\"\"); });\n\n\treturn [col, nf, f];\n}\n\n/* 21.2 DrawingML - Charts */\nfunction parse_chart(data, name, opts, rels, wb, csheet) {\n\tvar cs = ((csheet || {\"!type\":\"chart\"}));\n\tif(!data) return csheet;\n\t/* 21.2.2.27 chart CT_Chart */\n\n\tvar C = 0, R = 0, col = \"A\";\n\tvar refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };\n\n\t/* 21.2.2.120 numCache CT_NumData */\n\t(data.match(/[\\s\\S]*?<\\/c:numCache>/gm)||[]).forEach(function(nc) {\n\t\tvar cache = parse_Cache(nc);\n\t\trefguess.s.r = refguess.s.c = 0;\n\t\trefguess.e.c = C;\n\t\tcol = encode_col(C);\n\t\tcache[0].forEach(function(n,i) {\n\t\t\tcs[col + encode_row(i)] = {t:'n', v:n, z:cache[1] };\n\t\t\tR = i;\n\t\t});\n\t\tif(refguess.e.r < R) refguess.e.r = R;\n\t\t++C;\n\t});\n\tif(C > 0) cs[\"!ref\"] = encode_range(refguess);\n\treturn cs;\n}\nRELS.CS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet\";\n\nvar CS_XML_ROOT = writextag('chartsheet', null, {\n\t'xmlns': XMLNS.main[0],\n\t'xmlns:r': XMLNS.r\n});\n\n/* 18.3 Worksheets also covers Chartsheets */\nfunction parse_cs_xml(data, opts, idx, rels, wb) {\n\tif(!data) return data;\n\t/* 18.3.1.12 chartsheet CT_ChartSheet */\n\tif(!rels) rels = {'!id':{}};\n\tvar s = ({'!type':\"chart\", '!drawel':null, '!rel':\"\"});\n\tvar m;\n\n\t/* 18.3.1.83 sheetPr CT_ChartsheetPr */\n\tvar sheetPr = data.match(sheetprregex);\n\tif(sheetPr) parse_ws_xml_sheetpr(sheetPr[0], s, wb, idx);\n\n\t/* 18.3.1.36 drawing CT_Drawing */\n\tif((m = data.match(/drawing r:id=\"(.*?)\"/))) s['!rel'] = m[1];\n\n\tif(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];\n\treturn s;\n}\nfunction write_cs_xml(idx, opts, wb, rels) {\n\tvar o = [XML_HEADER, CS_XML_ROOT];\n\to[o.length] = writextag(\"drawing\", null, {\"r:id\": \"rId1\"});\n\tadd_rels(rels, -1, \"../drawings/drawing\" + (idx+1) + \".xml\", RELS.DRAW);\n\tif(o.length>2) { o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n\n/* [MS-XLSB] 2.4.331 BrtCsProp */\nfunction parse_BrtCsProp(data, length) {\n\tdata.l += 10;\n\tvar name = parse_XLWideString(data, length - 10);\n\treturn { name: name };\n}\n\n/* [MS-XLSB] 2.1.7.7 Chart Sheet */\nfunction parse_cs_bin(data, opts, idx, rels, wb) {\n\tif(!data) return data;\n\tif(!rels) rels = {'!id':{}};\n\tvar s = {'!type':\"chart\", '!drawel':null, '!rel':\"\"};\n\tvar state = [];\n\tvar pass = false;\n\trecordhopper(data, function cs_parse(val, R_n, RT) {\n\t\tswitch(RT) {\n\n\t\t\tcase 0x0226: /* 'BrtDrawing' */\n\t\t\t\ts['!rel'] = val; break;\n\n\t\t\tcase 0x028B: /* 'BrtCsProp' */\n\t\t\t\tif(!wb.Sheets[idx]) wb.Sheets[idx] = {};\n\t\t\t\tif(val.name) wb.Sheets[idx].CodeName = val.name;\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0232: /* 'BrtBkHim' */\n\t\t\tcase 0x028C: /* 'BrtCsPageSetup' */\n\t\t\tcase 0x029D: /* 'BrtCsProtection' */\n\t\t\tcase 0x02A7: /* 'BrtCsProtectionIso' */\n\t\t\tcase 0x0227: /* 'BrtLegacyDrawing' */\n\t\t\tcase 0x0228: /* 'BrtLegacyDrawingHF' */\n\t\t\tcase 0x01DC: /* 'BrtMargins' */\n\t\t\tcase 0x0C00: /* 'BrtUid' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0023: /* 'BrtFRTBegin' */\n\t\t\t\tpass = true; break;\n\t\t\tcase 0x0024: /* 'BrtFRTEnd' */\n\t\t\t\tpass = false; break;\n\t\t\tcase 0x0025: /* 'BrtACBegin' */\n\t\t\t\tstate.push(R_n); break;\n\t\t\tcase 0x0026: /* 'BrtACEnd' */\n\t\t\t\tstate.pop(); break;\n\n\t\t\tdefault:\n\t\t\t\tif((R_n||\"\").indexOf(\"Begin\") > 0) state.push(R_n);\n\t\t\t\telse if((R_n||\"\").indexOf(\"End\") > 0) state.pop();\n\t\t\t\telse if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R_n);\n\t\t}\n\t}, opts);\n\n\tif(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];\n\treturn s;\n}\nfunction write_cs_bin() {\n\tvar ba = buf_array();\n\twrite_record(ba, \"BrtBeginSheet\");\n\t/* [BrtCsProp] */\n\t/* CSVIEWS */\n\t/* [[BrtCsProtectionIso] BrtCsProtection] */\n\t/* [USERCSVIEWS] */\n\t/* [BrtMargins] */\n\t/* [BrtCsPageSetup] */\n\t/* [HEADERFOOTER] */\n\t/* BrtDrawing */\n\t/* [BrtLegacyDrawing] */\n\t/* [BrtLegacyDrawingHF] */\n\t/* [BrtBkHim] */\n\t/* [WEBPUBITEMS] */\n\t/* FRTCHARTSHEET */\n\twrite_record(ba, \"BrtEndSheet\");\n\treturn ba.end();\n}\n/* 18.2.28 (CT_WorkbookProtection) Defaults */\nvar WBPropsDef = [\n\t['allowRefreshQuery', false, \"bool\"],\n\t['autoCompressPictures', true, \"bool\"],\n\t['backupFile', false, \"bool\"],\n\t['checkCompatibility', false, \"bool\"],\n\t['CodeName', ''],\n\t['date1904', false, \"bool\"],\n\t['defaultThemeVersion', 0, \"int\"],\n\t['filterPrivacy', false, \"bool\"],\n\t['hidePivotFieldList', false, \"bool\"],\n\t['promptedSolutions', false, \"bool\"],\n\t['publishItems', false, \"bool\"],\n\t['refreshAllConnections', false, \"bool\"],\n\t['saveExternalLinkValues', true, \"bool\"],\n\t['showBorderUnselectedTables', true, \"bool\"],\n\t['showInkAnnotation', true, \"bool\"],\n\t['showObjects', 'all'],\n\t['showPivotChartFilter', false, \"bool\"],\n\t['updateLinks', 'userSet']\n];\n\n/* 18.2.30 (CT_BookView) Defaults */\nvar WBViewDef = [\n\t['activeTab', 0, \"int\"],\n\t['autoFilterDateGrouping', true, \"bool\"],\n\t['firstSheet', 0, \"int\"],\n\t['minimized', false, \"bool\"],\n\t['showHorizontalScroll', true, \"bool\"],\n\t['showSheetTabs', true, \"bool\"],\n\t['showVerticalScroll', true, \"bool\"],\n\t['tabRatio', 600, \"int\"],\n\t['visibility', 'visible']\n\t//window{Height,Width}, {x,y}Window\n];\n\n/* 18.2.19 (CT_Sheet) Defaults */\nvar SheetDef = [\n\t//['state', 'visible']\n];\n\n/* 18.2.2 (CT_CalcPr) Defaults */\nvar CalcPrDef = [\n\t['calcCompleted', 'true'],\n\t['calcMode', 'auto'],\n\t['calcOnSave', 'true'],\n\t['concurrentCalc', 'true'],\n\t['fullCalcOnLoad', 'false'],\n\t['fullPrecision', 'true'],\n\t['iterate', 'false'],\n\t['iterateCount', '100'],\n\t['iterateDelta', '0.001'],\n\t['refMode', 'A1']\n];\n\n/* 18.2.3 (CT_CustomWorkbookView) Defaults */\n/*var CustomWBViewDef = [\n\t['autoUpdate', 'false'],\n\t['changesSavedWin', 'false'],\n\t['includeHiddenRowCol', 'true'],\n\t['includePrintSettings', 'true'],\n\t['maximized', 'false'],\n\t['minimized', 'false'],\n\t['onlySync', 'false'],\n\t['personalView', 'false'],\n\t['showComments', 'commIndicator'],\n\t['showFormulaBar', 'true'],\n\t['showHorizontalScroll', 'true'],\n\t['showObjects', 'all'],\n\t['showSheetTabs', 'true'],\n\t['showStatusbar', 'true'],\n\t['showVerticalScroll', 'true'],\n\t['tabRatio', '600'],\n\t['xWindow', '0'],\n\t['yWindow', '0']\n];*/\n\nfunction push_defaults_array(target, defaults) {\n\tfor(var j = 0; j != target.length; ++j) { var w = target[j];\n\t\tfor(var i=0; i != defaults.length; ++i) { var z = defaults[i];\n\t\t\tif(w[z[0]] == null) w[z[0]] = z[1];\n\t\t\telse switch(z[2]) {\n\t\t\tcase \"bool\": if(typeof w[z[0]] == \"string\") w[z[0]] = parsexmlbool(w[z[0]]); break;\n\t\t\tcase \"int\": if(typeof w[z[0]] == \"string\") w[z[0]] = parseInt(w[z[0]], 10); break;\n\t\t\t}\n\t\t}\n\t}\n}\nfunction push_defaults(target, defaults) {\n\tfor(var i = 0; i != defaults.length; ++i) { var z = defaults[i];\n\t\tif(target[z[0]] == null) target[z[0]] = z[1];\n\t\telse switch(z[2]) {\n\t\t\tcase \"bool\": if(typeof target[z[0]] == \"string\") target[z[0]] = parsexmlbool(target[z[0]]); break;\n\t\t\tcase \"int\": if(typeof target[z[0]] == \"string\") target[z[0]] = parseInt(target[z[0]], 10); break;\n\t\t}\n\t}\n}\n\nfunction parse_wb_defaults(wb) {\n\tpush_defaults(wb.WBProps, WBPropsDef);\n\tpush_defaults(wb.CalcPr, CalcPrDef);\n\n\tpush_defaults_array(wb.WBView, WBViewDef);\n\tpush_defaults_array(wb.Sheets, SheetDef);\n\n\t_ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904);\n}\n\nfunction safe1904(wb) {\n\t/* TODO: store date1904 somewhere else */\n\tif(!wb.Workbook) return \"false\";\n\tif(!wb.Workbook.WBProps) return \"false\";\n\treturn parsexmlbool(wb.Workbook.WBProps.date1904) ? \"true\" : \"false\";\n}\n\nvar badchars = \"][*?\\/\\\\\".split(\"\");\nfunction check_ws_name(n, safe) {\n\tif(n.length > 31) { if(safe) return false; throw new Error(\"Sheet names cannot exceed 31 chars\"); }\n\tvar _good = true;\n\tbadchars.forEach(function(c) {\n\t\tif(n.indexOf(c) == -1) return;\n\t\tif(!safe) throw new Error(\"Sheet name cannot contain : \\\\ / ? * [ ]\");\n\t\t_good = false;\n\t});\n\treturn _good;\n}\nfunction check_wb_names(N, S, codes) {\n\tN.forEach(function(n,i) {\n\t\tcheck_ws_name(n);\n\t\tfor(var j = 0; j < i; ++j) if(n == N[j]) throw new Error(\"Duplicate Sheet Name: \" + n);\n\t\tif(codes) {\n\t\t\tvar cn = (S && S[i] && S[i].CodeName) || n;\n\t\t\tif(cn.charCodeAt(0) == 95 && cn.length > 22) throw new Error(\"Bad Code Name: Worksheet\" + cn);\n\t\t}\n\t});\n}\nfunction check_wb(wb) {\n\tif(!wb || !wb.SheetNames || !wb.Sheets) throw new Error(\"Invalid Workbook\");\n\tif(!wb.SheetNames.length) throw new Error(\"Workbook is empty\");\n\tvar Sheets = (wb.Workbook && wb.Workbook.Sheets) || [];\n\tcheck_wb_names(wb.SheetNames, Sheets, !!wb.vbaraw);\n\tfor(var i = 0; i < wb.SheetNames.length; ++i) check_ws(wb.Sheets[wb.SheetNames[i]], wb.SheetNames[i], i);\n\t/* TODO: validate workbook */\n}\n/* 18.2 Workbook */\nvar wbnsregex = /<\\w+:workbook/;\nfunction parse_wb_xml(data, opts) {\n\tif(!data) throw new Error(\"Could not find file\");\n\tvar wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, Names:[], xmlns: \"\" };\n\tvar pass = false, xmlns = \"xmlns\";\n\tvar dname = {}, dnstart = 0;\n\tdata.replace(tagregex, function xml_wb(x, idx) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.13 fileVersion CT_FileVersion ? */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.2.12 fileSharing CT_FileSharing ? */\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.28 workbookPr CT_WorkbookPr ? */\n\t\t\tcase '':\n\t\t\t\tWBPropsDef.forEach(function(w) {\n\t\t\t\t\tif(y[w[0]] == null) return;\n\t\t\t\t\tswitch(w[2]) {\n\t\t\t\t\t\tcase \"bool\": wb.WBProps[w[0]] = parsexmlbool(y[w[0]]); break;\n\t\t\t\t\t\tcase \"int\": wb.WBProps[w[0]] = parseInt(y[w[0]], 10); break;\n\t\t\t\t\t\tdefault: wb.WBProps[w[0]] = y[w[0]];\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(y.codeName) wb.WBProps.CodeName = utf8read(y.codeName);\n\t\t\t\tbreak;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.29 workbookProtection CT_WorkbookProtection ? */\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.1 bookViews CT_BookViews ? */\n\t\t\tcase '': case '': break;\n\t\t\t/* 18.2.30 workbookView CT_BookView + */\n\t\t\tcase '': delete y[0]; wb.WBView.push(y); break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.20 sheets CT_Sheets 1 */\n\t\t\tcase '': case '': break; // aggregate sheet\n\t\t\t/* 18.2.19 sheet CT_Sheet + */\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.15 functionGroups CT_FunctionGroups ? */\n\t\t\tcase '': break;\n\t\t\t/* 18.2.14 functionGroup CT_FunctionGroup + */\n\t\t\tcase '': case '': break;\n\t\t\t/* 18.2.8 externalReference CT_ExternalReference + */\n\t\t\tcase '': break;\n\t\t\tcase '': case '': pass=false; break;\n\t\t\t/* 18.2.5 definedName CT_DefinedName + */\n\t\t\tcase '': {\n\t\t\t\tdname.Ref = unescapexml(utf8read(data.slice(dnstart, idx)));\n\t\t\t\twb.Names.push(dname);\n\t\t\t} break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.2 calcPr CT_CalcPr ? */\n\t\t\tcase '': delete y[0]; wb.CalcPr = y; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.16 oleSize CT_OleSize ? (ref required) */\n\t\t\tcase '': case '': case '': break;\n\n\t\t\t/* 18.2.18 pivotCaches CT_PivotCaches ? */\n\t\t\tcase '': case '': case '': break;\n\n\t\t\t/* 18.2.23 smartTagTypes CT_SmartTagTypes ? */\n\t\t\tcase '': case '': break;\n\t\t\t/* 18.2.22 smartTagType CT_SmartTagType ? */\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.11 fileRecoveryPr CT_FileRecoveryPr ? */\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.26 webPublishObjects CT_WebPublishObjects ? */\n\t\t\tcase '': case '': break;\n\t\t\t/* 18.2.25 webPublishObject CT_WebPublishObject ? */\n\t\t\tcase '': case '': case '': break;\n\t\t\t/* 18.2.7 ext CT_Extension + */\n\t\t\tcase '': pass=false; break;\n\n\t\t\t/* Others */\n\t\t\tcase '': pass=true; break;\n\t\t\tcase '': pass=false; break;\n\n\t\t\t/* TODO */\n\t\t\tcase ' 0);\n\n\t/* fileVersion */\n\t/* fileSharing */\n\n\tvar workbookPr = ({codeName:\"ThisWorkbook\"});\n\tif(wb.Workbook && wb.Workbook.WBProps) {\n\t\tWBPropsDef.forEach(function(x) {\nif((wb.Workbook.WBProps[x[0]]) == null) return;\n\t\t\tif((wb.Workbook.WBProps[x[0]]) == x[1]) return;\n\t\t\tworkbookPr[x[0]] = (wb.Workbook.WBProps[x[0]]);\n\t\t});\nif(wb.Workbook.WBProps.CodeName) { workbookPr.codeName = wb.Workbook.WBProps.CodeName; delete workbookPr.CodeName; }\n\t}\n\to[o.length] = (writextag('workbookPr', null, workbookPr));\n\n\t/* workbookProtection */\n\n\tvar sheets = wb.Workbook && wb.Workbook.Sheets || [];\n\tvar i = 0;\n\n\t/* bookViews only written if first worksheet is hidden */\n\tif(sheets && sheets[0] && !!sheets[0].Hidden) {\n\t\to[o.length] = \"\";\n\t\tfor(i = 0; i != wb.SheetNames.length; ++i) {\n\t\t\tif(!sheets[i]) break;\n\t\t\tif(!sheets[i].Hidden) break;\n\t\t}\n\t\tif(i == wb.SheetNames.length) i = 0;\n\t\to[o.length] = '';\n\t\to[o.length] = \"\";\n\t}\n\n\to[o.length] = \"\";\n\tfor(i = 0; i != wb.SheetNames.length; ++i) {\n\t\tvar sht = ({name:escapexml(wb.SheetNames[i].slice(0,31))});\n\t\tsht.sheetId = \"\"+(i+1);\n\t\tsht[\"r:id\"] = \"rId\"+(i+1);\n\t\tif(sheets[i]) switch(sheets[i].Hidden) {\n\t\t\tcase 1: sht.state = \"hidden\"; break;\n\t\t\tcase 2: sht.state = \"veryHidden\"; break;\n\t\t}\n\t\to[o.length] = (writextag('sheet',null,sht));\n\t}\n\to[o.length] = \"\";\n\n\t/* functionGroups */\n\t/* externalReferences */\n\n\tif(write_names) {\n\t\to[o.length] = \"\";\n\t\tif(wb.Workbook && wb.Workbook.Names) wb.Workbook.Names.forEach(function(n) {\n\t\t\tvar d = {name:n.Name};\n\t\t\tif(n.Comment) d.comment = n.Comment;\n\t\t\tif(n.Sheet != null) d.localSheetId = \"\"+n.Sheet;\n\t\t\tif(n.Hidden) d.hidden = \"1\";\n\t\t\tif(!n.Ref) return;\n\t\t\to[o.length] = writextag('definedName', escapexml(n.Ref), d);\n\t\t});\n\t\to[o.length] = \"\";\n\t}\n\n\t/* calcPr */\n\t/* oleSize */\n\t/* customWorkbookViews */\n\t/* pivotCaches */\n\t/* smartTagPr */\n\t/* smartTagTypes */\n\t/* webPublishing */\n\t/* fileRecoveryPr */\n\t/* webPublishObjects */\n\t/* extLst */\n\n\tif(o.length>2){ o[o.length] = ''; o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* [MS-XLSB] 2.4.304 BrtBundleSh */\nfunction parse_BrtBundleSh(data, length) {\n\tvar z = {};\n\tz.Hidden = data.read_shift(4); //hsState ST_SheetState\n\tz.iTabID = data.read_shift(4);\n\tz.strRelID = parse_RelID(data,length-8);\n\tz.name = parse_XLWideString(data);\n\treturn z;\n}\nfunction write_BrtBundleSh(data, o) {\n\tif(!o) o = new_buf(127);\n\to.write_shift(4, data.Hidden);\n\to.write_shift(4, data.iTabID);\n\twrite_RelID(data.strRelID, o);\n\twrite_XLWideString(data.name.slice(0,31), o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.815 BrtWbProp */\nfunction parse_BrtWbProp(data, length) {\n\tvar o = ({});\n\tvar flags = data.read_shift(4);\n\to.defaultThemeVersion = data.read_shift(4);\n\tvar strName = (length > 8) ? parse_XLWideString(data) : \"\";\n\tif(strName.length > 0) o.CodeName = strName;\n\to.autoCompressPictures = !!(flags & 0x10000);\n\to.backupFile = !!(flags & 0x40);\n\to.checkCompatibility = !!(flags & 0x1000);\n\to.date1904 = !!(flags & 0x01);\n\to.filterPrivacy = !!(flags & 0x08);\n\to.hidePivotFieldList = !!(flags & 0x400);\n\to.promptedSolutions = !!(flags & 0x10);\n\to.publishItems = !!(flags & 0x800);\n\to.refreshAllConnections = !!(flags & 0x40000);\n\to.saveExternalLinkValues = !!(flags & 0x80);\n\to.showBorderUnselectedTables = !!(flags & 0x04);\n\to.showInkAnnotation = !!(flags & 0x20);\n\to.showObjects = [\"all\", \"placeholders\", \"none\"][(flags >> 13) & 0x03];\n\to.showPivotChartFilter = !!(flags & 0x8000);\n\to.updateLinks = [\"userSet\", \"never\", \"always\"][(flags >> 8) & 0x03];\n\treturn o;\n}\nfunction write_BrtWbProp(data, o) {\n\tif(!o) o = new_buf(72);\n\tvar flags = 0;\n\tif(data) {\n\t\t/* TODO: mirror parse_BrtWbProp fields */\n\t\tif(data.filterPrivacy) flags |= 0x08;\n\t}\n\to.write_shift(4, flags);\n\to.write_shift(4, 0);\n\twrite_XLSBCodeName(data && data.CodeName || \"ThisWorkbook\", o);\n\treturn o.slice(0, o.l);\n}\n\nfunction parse_BrtFRTArchID$(data, length) {\n\tvar o = {};\n\tdata.read_shift(4);\n\to.ArchID = data.read_shift(4);\n\tdata.l += length - 8;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.687 BrtName */\nfunction parse_BrtName(data, length, opts) {\n\tvar end = data.l + length;\n\tdata.l += 4; //var flags = data.read_shift(4);\n\tdata.l += 1; //var chKey = data.read_shift(1);\n\tvar itab = data.read_shift(4);\n\tvar name = parse_XLNameWideString(data);\n\tvar formula = parse_XLSBNameParsedFormula(data, 0, opts);\n\tvar comment = parse_XLNullableWideString(data);\n\t//if(0 /* fProc */) {\n\t\t// unusedstring1: XLNullableWideString\n\t\t// description: XLNullableWideString\n\t\t// helpTopic: XLNullableWideString\n\t\t// unusedstring2: XLNullableWideString\n\t//}\n\tdata.l = end;\n\tvar out = ({Name:name, Ptg:formula});\n\tif(itab < 0xFFFFFFF) out.Sheet = itab;\n\tif(comment) out.Comment = comment;\n\treturn out;\n}\n\n/* [MS-XLSB] 2.1.7.61 Workbook */\nfunction parse_wb_bin(data, opts) {\n\tvar wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: \"\" };\n\tvar state = [];\n\tvar pass = false;\n\n\tif(!opts) opts = {};\n\topts.biff = 12;\n\n\tvar Names = [];\n\tvar supbooks = ([[]]);\n\tsupbooks.SheetNames = [];\n\tsupbooks.XTI = [];\n\n\tXLSBRecordEnum[0x0010] = { n:\"BrtFRTArchID$\", f:parse_BrtFRTArchID$ };\n\n\trecordhopper(data, function hopper_wb(val, R_n, RT) {\n\t\tswitch(RT) {\n\t\t\tcase 0x009C: /* 'BrtBundleSh' */\n\t\t\t\tsupbooks.SheetNames.push(val.name);\n\t\t\t\twb.Sheets.push(val); break;\n\n\t\t\tcase 0x0099: /* 'BrtWbProp' */\n\t\t\t\twb.WBProps = val; break;\n\n\t\t\tcase 0x0027: /* 'BrtName' */\n\t\t\t\tif(val.Sheet != null) opts.SID = val.Sheet;\n\t\t\t\tval.Ref = stringify_formula(val.Ptg, null, null, supbooks, opts);\n\t\t\t\tdelete opts.SID;\n\t\t\t\tdelete val.Ptg;\n\t\t\t\tNames.push(val);\n\t\t\t\tbreak;\n\t\t\tcase 0x040C: /* 'BrtNameExt' */ break;\n\n\t\t\tcase 0x0165: /* 'BrtSupSelf' */\n\t\t\tcase 0x0166: /* 'BrtSupSame' */\n\t\t\tcase 0x0163: /* 'BrtSupBookSrc' */\n\t\t\tcase 0x029B: /* 'BrtSupAddin' */\n\t\t\t\tif(!supbooks[0].length) supbooks[0] = [RT, val];\n\t\t\t\telse supbooks.push([RT, val]);\n\t\t\t\tsupbooks[supbooks.length - 1].XTI = [];\n\t\t\t\tbreak;\n\t\t\tcase 0x016A: /* 'BrtExternSheet' */\n\t\t\t\tif(supbooks.length === 0) { supbooks[0] = []; supbooks[0].XTI = []; }\n\t\t\t\tsupbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val);\n\t\t\t\tsupbooks.XTI = supbooks.XTI.concat(val);\n\t\t\t\tbreak;\n\t\t\tcase 0x0169: /* 'BrtPlaceholderName' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0817: /* 'BrtAbsPath15' */\n\t\t\tcase 0x009E: /* 'BrtBookView' */\n\t\t\tcase 0x008F: /* 'BrtBeginBundleShs' */\n\t\t\tcase 0x0298: /* 'BrtBeginFnGroup' */\n\t\t\tcase 0x0161: /* 'BrtBeginExternals' */\n\t\t\t\tbreak;\n\n\t\t\t/* case 'BrtModelTimeGroupingCalcCol' */\n\t\t\tcase 0x0C00: /* 'BrtUid' */\n\t\t\tcase 0x0C01: /* 'BrtRevisionPtr' */\n\t\t\tcase 0x0216: /* 'BrtBookProtection' */\n\t\t\tcase 0x02A5: /* 'BrtBookProtectionIso' */\n\t\t\tcase 0x009D: /* 'BrtCalcProp' */\n\t\t\tcase 0x0262: /* 'BrtCrashRecErr' */\n\t\t\tcase 0x0802: /* 'BrtDecoupledPivotCacheID' */\n\t\t\tcase 0x009B: /* 'BrtFileRecover' */\n\t\t\tcase 0x0224: /* 'BrtFileSharing' */\n\t\t\tcase 0x02A4: /* 'BrtFileSharingIso' */\n\t\t\tcase 0x0080: /* 'BrtFileVersion' */\n\t\t\tcase 0x0299: /* 'BrtFnGroup' */\n\t\t\tcase 0x0850: /* 'BrtModelRelationship' */\n\t\t\tcase 0x084D: /* 'BrtModelTable' */\n\t\t\tcase 0x0225: /* 'BrtOleSize' */\n\t\t\tcase 0x0805: /* 'BrtPivotTableRef' */\n\t\t\tcase 0x0254: /* 'BrtSmartTagType' */\n\t\t\tcase 0x081C: /* 'BrtTableSlicerCacheID' */\n\t\t\tcase 0x081B: /* 'BrtTableSlicerCacheIDs' */\n\t\t\tcase 0x0822: /* 'BrtTimelineCachePivotCacheID' */\n\t\t\tcase 0x018D: /* 'BrtUserBookView' */\n\t\t\tcase 0x009A: /* 'BrtWbFactoid' */\n\t\t\tcase 0x045D: /* 'BrtWbProp14' */\n\t\t\tcase 0x0229: /* 'BrtWebOpt' */\n\t\t\tcase 0x082B: /* 'BrtWorkBookPr15' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0023: /* 'BrtFRTBegin' */\n\t\t\t\tstate.push(R_n); pass = true; break;\n\t\t\tcase 0x0024: /* 'BrtFRTEnd' */\n\t\t\t\tstate.pop(); pass = false; break;\n\t\t\tcase 0x0025: /* 'BrtACBegin' */\n\t\t\t\tstate.push(R_n); pass = true; break;\n\t\t\tcase 0x0026: /* 'BrtACEnd' */\n\t\t\t\tstate.pop(); pass = false; break;\n\n\t\t\tcase 0x0010: /* 'BrtFRTArchID$' */ break;\n\n\t\t\tdefault:\n\t\t\t\tif((R_n||\"\").indexOf(\"Begin\") > 0){/* empty */}\n\t\t\t\telse if((R_n||\"\").indexOf(\"End\") > 0){/* empty */}\n\t\t\t\telse if(!pass || (opts.WTF && state[state.length-1] != \"BrtACBegin\" && state[state.length-1] != \"BrtFRTBegin\")) throw new Error(\"Unexpected record \" + RT + \" \" + R_n);\n\t\t}\n\t}, opts);\n\n\tparse_wb_defaults(wb);\n\n\t// $FlowIgnore\n\twb.Names = Names;\n\n\t(wb).supbooks = supbooks;\n\treturn wb;\n}\n\nfunction write_BUNDLESHS(ba, wb) {\n\twrite_record(ba, \"BrtBeginBundleShs\");\n\tfor(var idx = 0; idx != wb.SheetNames.length; ++idx) {\n\t\tvar viz = wb.Workbook && wb.Workbook.Sheets && wb.Workbook.Sheets[idx] && wb.Workbook.Sheets[idx].Hidden || 0;\n\t\tvar d = { Hidden: viz, iTabID: idx+1, strRelID: 'rId' + (idx+1), name: wb.SheetNames[idx] };\n\t\twrite_record(ba, \"BrtBundleSh\", write_BrtBundleSh(d));\n\t}\n\twrite_record(ba, \"BrtEndBundleShs\");\n}\n\n/* [MS-XLSB] 2.4.649 BrtFileVersion */\nfunction write_BrtFileVersion(data, o) {\n\tif(!o) o = new_buf(127);\n\tfor(var i = 0; i != 4; ++i) o.write_shift(4, 0);\n\twrite_XLWideString(\"SheetJS\", o);\n\twrite_XLWideString(XLSX.version, o);\n\twrite_XLWideString(XLSX.version, o);\n\twrite_XLWideString(\"7262\", o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.301 BrtBookView */\nfunction write_BrtBookView(idx, o) {\n\tif(!o) o = new_buf(29);\n\to.write_shift(-4, 0);\n\to.write_shift(-4, 460);\n\to.write_shift(4, 28800);\n\to.write_shift(4, 17600);\n\to.write_shift(4, 500);\n\to.write_shift(4, idx);\n\to.write_shift(4, idx);\n\tvar flags = 0x78;\n\to.write_shift(1, flags);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\nfunction write_BOOKVIEWS(ba, wb) {\n\t/* required if hidden tab appears before visible tab */\n\tif(!wb.Workbook || !wb.Workbook.Sheets) return;\n\tvar sheets = wb.Workbook.Sheets;\n\tvar i = 0, vistab = -1, hidden = -1;\n\tfor(; i < sheets.length; ++i) {\n\t\tif(!sheets[i] || !sheets[i].Hidden && vistab == -1) vistab = i;\n\t\telse if(sheets[i].Hidden == 1 && hidden == -1) hidden = i;\n\t}\n\tif(hidden > vistab) return;\n\twrite_record(ba, \"BrtBeginBookViews\");\n\twrite_record(ba, \"BrtBookView\", write_BrtBookView(vistab));\n\t/* 1*(BrtBookView *FRT) */\n\twrite_record(ba, \"BrtEndBookViews\");\n}\n\n/* [MS-XLSB] 2.4.305 BrtCalcProp */\n/*function write_BrtCalcProp(data, o) {\n\tif(!o) o = new_buf(26);\n\to.write_shift(4,0); // force recalc\n\to.write_shift(4,1);\n\to.write_shift(4,0);\n\twrite_Xnum(0, o);\n\to.write_shift(-4, 1023);\n\to.write_shift(1, 0x33);\n\to.write_shift(1, 0x00);\n\treturn o;\n}*/\n\n/* [MS-XLSB] 2.4.646 BrtFileRecover */\n/*function write_BrtFileRecover(data, o) {\n\tif(!o) o = new_buf(1);\n\to.write_shift(1,0);\n\treturn o;\n}*/\n\n/* [MS-XLSB] 2.1.7.61 Workbook */\nfunction write_wb_bin(wb, opts) {\n\tvar ba = buf_array();\n\twrite_record(ba, \"BrtBeginBook\");\n\twrite_record(ba, \"BrtFileVersion\", write_BrtFileVersion());\n\t/* [[BrtFileSharingIso] BrtFileSharing] */\n\twrite_record(ba, \"BrtWbProp\", write_BrtWbProp(wb.Workbook && wb.Workbook.WBProps || null));\n\t/* [ACABSPATH] */\n\t/* [[BrtBookProtectionIso] BrtBookProtection] */\n\twrite_BOOKVIEWS(ba, wb, opts);\n\twrite_BUNDLESHS(ba, wb, opts);\n\t/* [FNGROUP] */\n\t/* [EXTERNALS] */\n\t/* *BrtName */\n\t/* write_record(ba, \"BrtCalcProp\", write_BrtCalcProp()); */\n\t/* [BrtOleSize] */\n\t/* *(BrtUserBookView *FRT) */\n\t/* [PIVOTCACHEIDS] */\n\t/* [BrtWbFactoid] */\n\t/* [SMARTTAGTYPES] */\n\t/* [BrtWebOpt] */\n\t/* write_record(ba, \"BrtFileRecover\", write_BrtFileRecover()); */\n\t/* [WEBPUBITEMS] */\n\t/* [CRERRS] */\n\t/* FRTWORKBOOK */\n\twrite_record(ba, \"BrtEndBook\");\n\n\treturn ba.end();\n}\nfunction parse_wb(data, name, opts) {\n\tif(name.slice(-4)===\".bin\") return parse_wb_bin((data), opts);\n\treturn parse_wb_xml((data), opts);\n}\n\nfunction parse_ws(data, name, idx, opts, rels, wb, themes, styles) {\n\tif(name.slice(-4)===\".bin\") return parse_ws_bin((data), opts, idx, rels, wb, themes, styles);\n\treturn parse_ws_xml((data), opts, idx, rels, wb, themes, styles);\n}\n\nfunction parse_cs(data, name, idx, opts, rels, wb, themes, styles) {\n\tif(name.slice(-4)===\".bin\") return parse_cs_bin((data), opts, idx, rels, wb, themes, styles);\n\treturn parse_cs_xml((data), opts, idx, rels, wb, themes, styles);\n}\n\nfunction parse_ms(data, name, idx, opts, rels, wb, themes, styles) {\n\tif(name.slice(-4)===\".bin\") return parse_ms_bin((data), opts, idx, rels, wb, themes, styles);\n\treturn parse_ms_xml((data), opts, idx, rels, wb, themes, styles);\n}\n\nfunction parse_ds(data, name, idx, opts, rels, wb, themes, styles) {\n\tif(name.slice(-4)===\".bin\") return parse_ds_bin((data), opts, idx, rels, wb, themes, styles);\n\treturn parse_ds_xml((data), opts, idx, rels, wb, themes, styles);\n}\n\nfunction parse_sty(data, name, themes, opts) {\n\tif(name.slice(-4)===\".bin\") return parse_sty_bin((data), themes, opts);\n\treturn parse_sty_xml((data), themes, opts);\n}\n\nfunction parse_theme(data, name, opts) {\n\treturn parse_theme_xml(data, opts);\n}\n\nfunction parse_sst(data, name, opts) {\n\tif(name.slice(-4)===\".bin\") return parse_sst_bin((data), opts);\n\treturn parse_sst_xml((data), opts);\n}\n\nfunction parse_cmnt(data, name, opts) {\n\tif(name.slice(-4)===\".bin\") return parse_comments_bin((data), opts);\n\treturn parse_comments_xml((data), opts);\n}\n\nfunction parse_cc(data, name, opts) {\n\tif(name.slice(-4)===\".bin\") return parse_cc_bin((data), name, opts);\n\treturn parse_cc_xml((data), name, opts);\n}\n\nfunction parse_xlink(data, rel, name, opts) {\n\tif(name.slice(-4)===\".bin\") return parse_xlink_bin((data), rel, name, opts);\n\treturn parse_xlink_xml((data), rel, name, opts);\n}\n\nfunction write_wb(wb, name, opts) {\n\treturn (name.slice(-4)===\".bin\" ? write_wb_bin : write_wb_xml)(wb, opts);\n}\n\nfunction write_ws(data, name, opts, wb, rels) {\n\treturn (name.slice(-4)===\".bin\" ? write_ws_bin : write_ws_xml)(data, opts, wb, rels);\n}\n\n// eslint-disable-next-line no-unused-vars\nfunction write_cs(data, name, opts, wb, rels) {\n\treturn (name.slice(-4)===\".bin\" ? write_cs_bin : write_cs_xml)(data, opts, wb, rels);\n}\n\nfunction write_sty(data, name, opts) {\n\treturn (name.slice(-4)===\".bin\" ? write_sty_bin : write_sty_xml)(data, opts);\n}\n\nfunction write_sst(data, name, opts) {\n\treturn (name.slice(-4)===\".bin\" ? write_sst_bin : write_sst_xml)(data, opts);\n}\n\nfunction write_cmnt(data, name, opts) {\n\treturn (name.slice(-4)===\".bin\" ? write_comments_bin : write_comments_xml)(data, opts);\n}\n/*\nfunction write_cc(data, name:string, opts) {\n\treturn (name.slice(-4)===\".bin\" ? write_cc_bin : write_cc_xml)(data, opts);\n}\n*/\nvar attregexg2=/([\\w:]+)=((?:\")([^\"]*)(?:\")|(?:')([^']*)(?:'))/g;\nvar attregex2=/([\\w:]+)=((?:\")(?:[^\"]*)(?:\")|(?:')(?:[^']*)(?:'))/;\nfunction xlml_parsexmltag(tag, skip_root) {\n\tvar words = tag.split(/\\s+/);\n\tvar z = ([]); if(!skip_root) z[0] = words[0];\n\tif(words.length === 1) return z;\n\tvar m = tag.match(attregexg2), y, j, w, i;\n\tif(m) for(i = 0; i != m.length; ++i) {\n\t\ty = m[i].match(attregex2);\nif((j=y[1].indexOf(\":\")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1);\n\t\telse {\n\t\t\tif(y[1].slice(0,6) === \"xmlns:\") w = \"xmlns\"+y[1].slice(6);\n\t\t\telse w = y[1].slice(j+1);\n\t\t\tz[w] = y[2].slice(1,y[2].length-1);\n\t\t}\n\t}\n\treturn z;\n}\nfunction xlml_parsexmltagobj(tag) {\n\tvar words = tag.split(/\\s+/);\n\tvar z = {};\n\tif(words.length === 1) return z;\n\tvar m = tag.match(attregexg2), y, j, w, i;\n\tif(m) for(i = 0; i != m.length; ++i) {\n\t\ty = m[i].match(attregex2);\nif((j=y[1].indexOf(\":\")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1);\n\t\telse {\n\t\t\tif(y[1].slice(0,6) === \"xmlns:\") w = \"xmlns\"+y[1].slice(6);\n\t\t\telse w = y[1].slice(j+1);\n\t\t\tz[w] = y[2].slice(1,y[2].length-1);\n\t\t}\n\t}\n\treturn z;\n}\n\n// ----\n\nfunction xlml_format(format, value) {\n\tvar fmt = XLMLFormatMap[format] || unescapexml(format);\n\tif(fmt === \"General\") return SSF._general(value);\n\treturn SSF.format(fmt, value);\n}\n\nfunction xlml_set_custprop(Custprops, key, cp, val) {\n\tvar oval = val;\n\tswitch((cp[0].match(/dt:dt=\"([\\w.]+)\"/)||[\"\",\"\"])[1]) {\n\t\tcase \"boolean\": oval = parsexmlbool(val); break;\n\t\tcase \"i2\": case \"int\": oval = parseInt(val, 10); break;\n\t\tcase \"r4\": case \"float\": oval = parseFloat(val); break;\n\t\tcase \"date\": case \"dateTime.tz\": oval = parseDate(val); break;\n\t\tcase \"i8\": case \"string\": case \"fixed\": case \"uuid\": case \"bin.base64\": break;\n\t\tdefault: throw new Error(\"bad custprop:\" + cp[0]);\n\t}\n\tCustprops[unescapexml(key)] = oval;\n}\n\nfunction safe_format_xlml(cell, nf, o) {\n\tif(cell.t === 'z') return;\n\tif(!o || o.cellText !== false) try {\n\t\tif(cell.t === 'e') { cell.w = cell.w || BErr[cell.v]; }\n\t\telse if(nf === \"General\") {\n\t\t\tif(cell.t === 'n') {\n\t\t\t\tif((cell.v|0) === cell.v) cell.w = SSF._general_int(cell.v);\n\t\t\t\telse cell.w = SSF._general_num(cell.v);\n\t\t\t}\n\t\t\telse cell.w = SSF._general(cell.v);\n\t\t}\n\t\telse cell.w = xlml_format(nf||\"General\", cell.v);\n\t} catch(e) { if(o.WTF) throw e; }\n\ttry {\n\t\tvar z = XLMLFormatMap[nf]||nf||\"General\";\n\t\tif(o.cellNF) cell.z = z;\n\t\tif(o.cellDates && cell.t == 'n' && SSF.is_date(z)) {\n\t\t\tvar _d = SSF.parse_date_code(cell.v); if(_d) { cell.t = 'd'; cell.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }\n\t\t}\n\t} catch(e) { if(o.WTF) throw e; }\n}\n\nfunction process_style_xlml(styles, stag, opts) {\n\tif(opts.cellStyles) {\n\t\tif(stag.Interior) {\n\t\t\tvar I = stag.Interior;\n\t\t\tif(I.Pattern) I.patternType = XLMLPatternTypeMap[I.Pattern] || I.Pattern;\n\t\t}\n\t}\n\tstyles[stag.ID] = stag;\n}\n\n/* TODO: there must exist some form of OSP-blessed spec */\nfunction parse_xlml_data(xml, ss, data, cell, base, styles, csty, row, arrayf, o) {\n\tvar nf = \"General\", sid = cell.StyleID, S = {}; o = o || {};\n\tvar interiors = [];\n\tvar i = 0;\n\tif(sid === undefined && row) sid = row.StyleID;\n\tif(sid === undefined && csty) sid = csty.StyleID;\n\twhile(styles[sid] !== undefined) {\n\t\tif(styles[sid].nf) nf = styles[sid].nf;\n\t\tif(styles[sid].Interior) interiors.push(styles[sid].Interior);\n\t\tif(!styles[sid].Parent) break;\n\t\tsid = styles[sid].Parent;\n\t}\n\tswitch(data.Type) {\n\t\tcase 'Boolean':\n\t\t\tcell.t = 'b';\n\t\t\tcell.v = parsexmlbool(xml);\n\t\t\tbreak;\n\t\tcase 'String':\n\t\t\tcell.t = 's'; cell.r = xlml_fixstr(unescapexml(xml));\n\t\t\tcell.v = (xml.indexOf(\"<\") > -1 ? unescapexml(ss||xml).replace(/<.*?>/g, \"\") : cell.r); // todo: BR etc\n\t\t\tbreak;\n\t\tcase 'DateTime':\n\t\t\tif(xml.slice(-1) != \"Z\") xml += \"Z\";\n\t\t\tcell.v = (parseDate(xml) - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);\n\t\t\tif(cell.v !== cell.v) cell.v = unescapexml(xml);\n\t\t\telse if(cell.v<60) cell.v = cell.v -1;\n\t\t\tif(!nf || nf == \"General\") nf = \"yyyy-mm-dd\";\n\t\t\t/* falls through */\n\t\tcase 'Number':\n\t\t\tif(cell.v === undefined) cell.v=+xml;\n\t\t\tif(!cell.t) cell.t = 'n';\n\t\t\tbreak;\n\t\tcase 'Error': cell.t = 'e'; cell.v = RBErr[xml]; if(o.cellText !== false) cell.w = xml; break;\n\t\tdefault:\n\t\t\tif(xml == \"\" && ss == \"\") { cell.t = 'z'; }\n\t\t\telse { cell.t = 's'; cell.v = xlml_fixstr(ss||xml); }\n\t\t\tbreak;\n\t}\n\tsafe_format_xlml(cell, nf, o);\n\tif(o.cellFormula !== false) {\n\t\tif(cell.Formula) {\n\t\t\tvar fstr = unescapexml(cell.Formula);\n\t\t\t/* strictly speaking, the leading = is required but some writers omit */\n\t\t\tif(fstr.charCodeAt(0) == 61 /* = */) fstr = fstr.slice(1);\n\t\t\tcell.f = rc_to_a1(fstr, base);\n\t\t\tdelete cell.Formula;\n\t\t\tif(cell.ArrayRange == \"RC\") cell.F = rc_to_a1(\"RC:RC\", base);\n\t\t\telse if(cell.ArrayRange) {\n\t\t\t\tcell.F = rc_to_a1(cell.ArrayRange, base);\n\t\t\t\tarrayf.push([safe_decode_range(cell.F), cell.F]);\n\t\t\t}\n\t\t} else {\n\t\t\tfor(i = 0; i < arrayf.length; ++i)\n\t\t\t\tif(base.r >= arrayf[i][0].s.r && base.r <= arrayf[i][0].e.r)\n\t\t\t\t\tif(base.c >= arrayf[i][0].s.c && base.c <= arrayf[i][0].e.c)\n\t\t\t\t\t\tcell.F = arrayf[i][1];\n\t\t}\n\t}\n\tif(o.cellStyles) {\n\t\tinteriors.forEach(function(x) {\n\t\t\tif(!S.patternType && x.patternType) S.patternType = x.patternType;\n\t\t});\n\t\tcell.s = S;\n\t}\n\tif(cell.StyleID !== undefined) cell.ixfe = cell.StyleID;\n}\n\nfunction xlml_clean_comment(comment) {\n\tcomment.t = comment.v || \"\";\n\tcomment.t = comment.t.replace(/\\r\\n/g,\"\\n\").replace(/\\r/g,\"\\n\");\n\tcomment.v = comment.w = comment.ixfe = undefined;\n}\n\nfunction xlml_normalize(d) {\n\tif(has_buf && Buffer.isBuffer(d)) return d.toString('utf8');\n\tif(typeof d === 'string') return d;\n\t/* duktape */\n\tif(typeof Uint8Array !== 'undefined' && d instanceof Uint8Array) return utf8read(a2s(ab2a(d)));\n\tthrow new Error(\"Bad input format: expected Buffer or string\");\n}\n\n/* TODO: Everything */\n/* UOS uses CJK in tags */\nvar xlmlregex = /<(\\/?)([^\\s?>:\\/]+)(?:[\\s?:\\/][^>]*)?>/mg;\n//var xlmlregex = /<(\\/?)([a-z0-9]*:|)(\\w+)[^>]*>/mg;\nfunction parse_xlml_xml(d, _opts) {\n\tvar opts = _opts || {};\n\tmake_ssf(SSF);\n\tvar str = debom(xlml_normalize(d));\n\tif(opts.type == 'binary' || opts.type == 'array' || opts.type == 'base64') {\n\t\tif(typeof cptable !== 'undefined') str = cptable.utils.decode(65001, char_codes(str));\n\t\telse str = utf8read(str);\n\t}\n\tvar opening = str.slice(0, 1024).toLowerCase(), ishtml = false;\n\topening = opening.replace(/\".*?\"/g, \"\");\n\tif((opening.indexOf(\">\") & 1023) > Math.min((opening.indexOf(\",\") & 1023), (opening.indexOf(\";\")&1023))) { var _o = dup(opts); _o.type = \"string\"; return PRN.to_workbook(str, _o); }\n\tif(opening.indexOf(\"= 0) ishtml = true; });\n\tif(ishtml) return HTML_.to_workbook(str, opts);\n\tvar Rn;\n\tvar state = [], tmp;\n\tif(DENSE != null && opts.dense == null) opts.dense = DENSE;\n\tvar sheets = {}, sheetnames = [], cursheet = (opts.dense ? [] : {}), sheetname = \"\";\n\tvar table = {}, cell = ({}), row = {};// eslint-disable-line no-unused-vars\n\tvar dtag = xlml_parsexmltag(''), didx = 0;\n\tvar c = 0, r = 0;\n\tvar refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };\n\tvar styles = {}, stag = {};\n\tvar ss = \"\", fidx = 0;\n\tvar merges = [];\n\tvar Props = {}, Custprops = {}, pidx = 0, cp = [];\n\tvar comments = [], comment = ({});\n\tvar cstys = [], csty, seencol = false;\n\tvar arrayf = [];\n\tvar rowinfo = [], rowobj = {}, cc = 0, rr = 0;\n\tvar Workbook = ({ Sheets:[], WBProps:{date1904:false} }), wsprops = {};\n\txlmlregex.lastIndex = 0;\n\tstr = str.replace(//mg,\"\");\n\tvar raw_Rn3 = \"\";\n\twhile((Rn = xlmlregex.exec(str))) switch((Rn[3] = (raw_Rn3 = Rn[3]).toLowerCase())) {\n\t\tcase 'data' /*case 'Data'*/:\n\t\t\tif(raw_Rn3 == \"data\") {\n\t\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));}\n\t\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(state[state.length-1][1]) break;\n\t\t\tif(Rn[1]==='/') parse_xlml_data(str.slice(didx, Rn.index), ss, dtag, state[state.length-1][0]==/*\"Comment\"*/\"comment\"?comment:cell, {c:c,r:r}, styles, cstys[c], row, arrayf, opts);\n\t\t\telse { ss = \"\"; dtag = xlml_parsexmltag(Rn[0]); didx = Rn.index + Rn[0].length; }\n\t\t\tbreak;\n\t\tcase 'cell' /*case 'Cell'*/:\n\t\t\tif(Rn[1]==='/'){\n\t\t\t\tif(comments.length > 0) cell.c = comments;\n\t\t\t\tif((!opts.sheetRows || opts.sheetRows > r) && cell.v !== undefined) {\n\t\t\t\t\tif(opts.dense) {\n\t\t\t\t\t\tif(!cursheet[r]) cursheet[r] = [];\n\t\t\t\t\t\tcursheet[r][c] = cell;\n\t\t\t\t\t} else cursheet[encode_col(c) + encode_row(r)] = cell;\n\t\t\t\t}\n\t\t\t\tif(cell.HRef) {\n\t\t\t\t\tcell.l = ({Target:unescapexml(cell.HRef)});\n\t\t\t\t\tif(cell.HRefScreenTip) cell.l.Tooltip = cell.HRefScreenTip;\n\t\t\t\t\tdelete cell.HRef; delete cell.HRefScreenTip;\n\t\t\t\t}\n\t\t\t\tif(cell.MergeAcross || cell.MergeDown) {\n\t\t\t\t\tcc = c + (parseInt(cell.MergeAcross,10)|0);\n\t\t\t\t\trr = r + (parseInt(cell.MergeDown,10)|0);\n\t\t\t\t\tmerges.push({s:{c:c,r:r},e:{c:cc,r:rr}});\n\t\t\t\t}\n\t\t\t\tif(!opts.sheetStubs) { if(cell.MergeAcross) c = cc + 1; else ++c; }\n\t\t\t\telse if(cell.MergeAcross || cell.MergeDown) {\nfor(var cma = c; cma <= cc; ++cma) {\n\t\t\t\t\t\tfor(var cmd = r; cmd <= rr; ++cmd) {\n\t\t\t\t\t\t\tif(cma > c || cmd > r) {\n\t\t\t\t\t\t\t\tif(opts.dense) {\n\t\t\t\t\t\t\t\t\tif(!cursheet[cmd]) cursheet[cmd] = [];\n\t\t\t\t\t\t\t\t\tcursheet[cmd][cma] = {t:'z'};\n\t\t\t\t\t\t\t\t} else cursheet[encode_col(cma) + encode_row(cmd)] = {t:'z'};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tc = cc + 1;\n\t\t\t\t}\n\t\t\t\telse ++c;\n\t\t\t} else {\n\t\t\t\tcell = xlml_parsexmltagobj(Rn[0]);\n\t\t\t\tif(cell.Index) c = +cell.Index - 1;\n\t\t\t\tif(c < refguess.s.c) refguess.s.c = c;\n\t\t\t\tif(c > refguess.e.c) refguess.e.c = c;\n\t\t\t\tif(Rn[0].slice(-2) === \"/>\") ++c;\n\t\t\t\tcomments = [];\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'row' /*case 'Row'*/:\n\t\t\tif(Rn[1]==='/' || Rn[0].slice(-2) === \"/>\") {\n\t\t\t\tif(r < refguess.s.r) refguess.s.r = r;\n\t\t\t\tif(r > refguess.e.r) refguess.e.r = r;\n\t\t\t\tif(Rn[0].slice(-2) === \"/>\") {\n\t\t\t\t\trow = xlml_parsexmltag(Rn[0]);\n\t\t\t\t\tif(row.Index) r = +row.Index - 1;\n\t\t\t\t}\n\t\t\t\tc = 0; ++r;\n\t\t\t} else {\n\t\t\t\trow = xlml_parsexmltag(Rn[0]);\n\t\t\t\tif(row.Index) r = +row.Index - 1;\n\t\t\t\trowobj = {};\n\t\t\t\tif(row.AutoFitHeight == \"0\" || row.Height) {\n\t\t\t\t\trowobj.hpx = parseInt(row.Height, 10); rowobj.hpt = px2pt(rowobj.hpx);\n\t\t\t\t\trowinfo[r] = rowobj;\n\t\t\t\t}\n\t\t\t\tif(row.Hidden == \"1\") { rowobj.hidden = true; rowinfo[r] = rowobj; }\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'worksheet' /*case 'Worksheet'*/: /* TODO: read range from FullRows/FullColumns */\n\t\t\tif(Rn[1]==='/'){\n\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));\n\t\t\t\tsheetnames.push(sheetname);\n\t\t\t\tif(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) {\n\t\t\t\t\tcursheet[\"!ref\"] = encode_range(refguess);\n\t\t\t\t\tif(opts.sheetRows && opts.sheetRows <= refguess.e.r) {\n\t\t\t\t\t\tcursheet[\"!fullref\"] = cursheet[\"!ref\"];\n\t\t\t\t\t\trefguess.e.r = opts.sheetRows - 1;\n\t\t\t\t\t\tcursheet[\"!ref\"] = encode_range(refguess);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(merges.length) cursheet[\"!merges\"] = merges;\n\t\t\t\tif(cstys.length > 0) cursheet[\"!cols\"] = cstys;\n\t\t\t\tif(rowinfo.length > 0) cursheet[\"!rows\"] = rowinfo;\n\t\t\t\tsheets[sheetname] = cursheet;\n\t\t\t} else {\n\t\t\t\trefguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };\n\t\t\t\tr = c = 0;\n\t\t\t\tstate.push([Rn[3], false]);\n\t\t\t\ttmp = xlml_parsexmltag(Rn[0]);\n\t\t\t\tsheetname = unescapexml(tmp.Name);\n\t\t\t\tcursheet = (opts.dense ? [] : {});\n\t\t\t\tmerges = [];\n\t\t\t\tarrayf = [];\n\t\t\t\trowinfo = [];\n\t\t\t\twsprops = {name:sheetname, Hidden:0};\n\t\t\t\tWorkbook.Sheets.push(wsprops);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'table' /*case 'Table'*/:\n\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));}\n\t\t\telse if(Rn[0].slice(-2) == \"/>\") break;\n\t\t\telse {\n\t\t\t\ttable = xlml_parsexmltag(Rn[0]);\n\t\t\t\tstate.push([Rn[3], false]);\n\t\t\t\tcstys = []; seencol = false;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'style' /*case 'Style'*/:\n\t\t\tif(Rn[1]==='/') process_style_xlml(styles, stag, opts);\n\t\t\telse stag = xlml_parsexmltag(Rn[0]);\n\t\t\tbreak;\n\n\t\tcase 'numberformat' /*case 'NumberFormat'*/:\n\t\t\tstag.nf = unescapexml(xlml_parsexmltag(Rn[0]).Format || \"General\");\n\t\t\tif(XLMLFormatMap[stag.nf]) stag.nf = XLMLFormatMap[stag.nf];\n\t\t\tfor(var ssfidx = 0; ssfidx != 0x188; ++ssfidx) if(SSF._table[ssfidx] == stag.nf) break;\n\t\t\tif(ssfidx == 0x188) for(ssfidx = 0x39; ssfidx != 0x188; ++ssfidx) if(SSF._table[ssfidx] == null) { SSF.load(stag.nf, ssfidx); break; }\n\t\t\tbreak;\n\n\t\tcase 'column' /*case 'Column'*/:\n\t\t\tif(state[state.length-1][0] !== /*'Table'*/'table') break;\n\t\t\tcsty = xlml_parsexmltag(Rn[0]);\n\t\t\tif(csty.Hidden) { csty.hidden = true; delete csty.Hidden; }\n\t\t\tif(csty.Width) csty.wpx = parseInt(csty.Width, 10);\n\t\t\tif(!seencol && csty.wpx > 10) {\n\t\t\t\tseencol = true; MDW = DEF_MDW; //find_mdw_wpx(csty.wpx);\n\t\t\t\tfor(var _col = 0; _col < cstys.length; ++_col) if(cstys[_col]) process_col(cstys[_col]);\n\t\t\t}\n\t\t\tif(seencol) process_col(csty);\n\t\t\tcstys[(csty.Index-1||cstys.length)] = csty;\n\t\t\tfor(var i = 0; i < +csty.Span; ++i) cstys[cstys.length] = dup(csty);\n\t\t\tbreak;\n\n\t\tcase 'namedrange' /*case 'NamedRange'*/:\n\t\t\tif(Rn[1]==='/') break;\n\t\t\tif(!Workbook.Names) Workbook.Names = [];\n\t\t\tvar _NamedRange = parsexmltag(Rn[0]);\n\t\t\tvar _DefinedName = ({\n\t\t\t\tName: _NamedRange.Name,\n\t\t\t\tRef: rc_to_a1(_NamedRange.RefersTo.slice(1), {r:0, c:0})\n\t\t\t});\n\t\t\tif(Workbook.Sheets.length>0) _DefinedName.Sheet=Workbook.Sheets.length-1;\nWorkbook.Names.push(_DefinedName);\n\t\t\tbreak;\n\n\t\tcase 'namedcell' /*case 'NamedCell'*/: break;\n\t\tcase 'b' /*case 'B'*/: break;\n\t\tcase 'i' /*case 'I'*/: break;\n\t\tcase 'u' /*case 'U'*/: break;\n\t\tcase 's' /*case 'S'*/: break;\n\t\tcase 'em' /*case 'EM'*/: break;\n\t\tcase 'h2' /*case 'H2'*/: break;\n\t\tcase 'h3' /*case 'H3'*/: break;\n\t\tcase 'sub' /*case 'Sub'*/: break;\n\t\tcase 'sup' /*case 'Sup'*/: break;\n\t\tcase 'span' /*case 'Span'*/: break;\n\t\tcase 'alignment' /*case 'Alignment'*/:\n\t\t\tbreak;\n\t\tcase 'borders' /*case 'Borders'*/: break;\n\t\tcase 'border' /*case 'Border'*/: break;\n\t\tcase 'font' /*case 'Font'*/:\n\t\t\tif(Rn[0].slice(-2) === \"/>\") break;\n\t\t\telse if(Rn[1]===\"/\") ss += str.slice(fidx, Rn.index);\n\t\t\telse fidx = Rn.index + Rn[0].length;\n\t\t\tbreak;\n\t\tcase 'interior' /*case 'Interior'*/:\n\t\t\tif(!opts.cellStyles) break;\n\t\t\tstag.Interior = xlml_parsexmltag(Rn[0]);\n\t\t\tbreak;\n\t\tcase 'protection' /*case 'Protection'*/: break;\n\n\t\tcase 'author' /*case 'Author'*/:\n\t\tcase 'title' /*case 'Title'*/:\n\t\tcase 'description' /*case 'Description'*/:\n\t\tcase 'created' /*case 'Created'*/:\n\t\tcase 'keywords' /*case 'Keywords'*/:\n\t\tcase 'subject' /*case 'Subject'*/:\n\t\tcase 'category' /*case 'Category'*/:\n\t\tcase 'company' /*case 'Company'*/:\n\t\tcase 'lastauthor' /*case 'LastAuthor'*/:\n\t\tcase 'lastsaved' /*case 'LastSaved'*/:\n\t\tcase 'lastprinted' /*case 'LastPrinted'*/:\n\t\tcase 'version' /*case 'Version'*/:\n\t\tcase 'revision' /*case 'Revision'*/:\n\t\tcase 'totaltime' /*case 'TotalTime'*/:\n\t\tcase 'hyperlinkbase' /*case 'HyperlinkBase'*/:\n\t\tcase 'manager' /*case 'Manager'*/:\n\t\tcase 'contentstatus' /*case 'ContentStatus'*/:\n\t\tcase 'identifier' /*case 'Identifier'*/:\n\t\tcase 'language' /*case 'Language'*/:\n\t\tcase 'appname' /*case 'AppName'*/:\n\t\t\tif(Rn[0].slice(-2) === \"/>\") break;\n\t\t\telse if(Rn[1]===\"/\") xlml_set_prop(Props, raw_Rn3, str.slice(pidx, Rn.index));\n\t\t\telse pidx = Rn.index + Rn[0].length;\n\t\t\tbreak;\n\t\tcase 'paragraphs' /*case 'Paragraphs'*/: break;\n\n\t\tcase 'styles' /*case 'Styles'*/:\n\t\tcase 'workbook' /*case 'Workbook'*/:\n\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));}\n\t\t\telse state.push([Rn[3], false]);\n\t\t\tbreak;\n\n\t\tcase 'comment' /*case 'Comment'*/:\n\t\t\tif(Rn[1]==='/'){\n\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));\n\t\t\t\txlml_clean_comment(comment);\n\t\t\t\tcomments.push(comment);\n\t\t\t} else {\n\t\t\t\tstate.push([Rn[3], false]);\n\t\t\t\ttmp = xlml_parsexmltag(Rn[0]);\n\t\t\t\tcomment = ({a:tmp.Author});\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'autofilter' /*case 'AutoFilter'*/:\n\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));}\n\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') {\n\t\t\t\tvar AutoFilter = xlml_parsexmltag(Rn[0]);\n\t\t\t\tcursheet['!autofilter'] = { ref:rc_to_a1(AutoFilter.Range).replace(/\\$/g,\"\") };\n\t\t\t\tstate.push([Rn[3], true]);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'name' /*case 'Name'*/: break;\n\n\t\tcase 'datavalidation' /*case 'DataValidation'*/:\n\t\t\tif(Rn[1]==='/'){\n\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));\n\t\t\t} else {\n\t\t\t\tif(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'pixelsperinch' /*case 'PixelsPerInch'*/:\n\t\t\tbreak;\n\t\tcase 'componentoptions' /*case 'ComponentOptions'*/:\n\t\tcase 'documentproperties' /*case 'DocumentProperties'*/:\n\t\tcase 'customdocumentproperties' /*case 'CustomDocumentProperties'*/:\n\t\tcase 'officedocumentsettings' /*case 'OfficeDocumentSettings'*/:\n\t\tcase 'pivottable' /*case 'PivotTable'*/:\n\t\tcase 'pivotcache' /*case 'PivotCache'*/:\n\t\tcase 'names' /*case 'Names'*/:\n\t\tcase 'mapinfo' /*case 'MapInfo'*/:\n\t\tcase 'pagebreaks' /*case 'PageBreaks'*/:\n\t\tcase 'querytable' /*case 'QueryTable'*/:\n\t\tcase 'sorting' /*case 'Sorting'*/:\n\t\tcase 'schema' /*case 'Schema'*/: //case 'data' /*case 'data'*/:\n\t\tcase 'conditionalformatting' /*case 'ConditionalFormatting'*/:\n\t\tcase 'smarttagtype' /*case 'SmartTagType'*/:\n\t\tcase 'smarttags' /*case 'SmartTags'*/:\n\t\tcase 'excelworkbook' /*case 'ExcelWorkbook'*/:\n\t\tcase 'workbookoptions' /*case 'WorkbookOptions'*/:\n\t\tcase 'worksheetoptions' /*case 'WorksheetOptions'*/:\n\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));}\n\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);\n\t\t\tbreak;\n\n\t\tcase 'null' /*case 'Null'*/: break;\n\n\t\tdefault:\n\t\t\t/* FODS file root is */\n\t\t\tif(state.length == 0 && Rn[3] == \"document\") return parse_fods(str, opts);\n\t\t\t/* UOS file root is */\n\t\t\tif(state.length == 0 && Rn[3] == \"uof\"/*\"UOF\"*/) return parse_fods(str, opts);\n\n\t\t\tvar seen = true;\n\t\t\tswitch(state[state.length-1][0]) {\n\t\t\t\t/* OfficeDocumentSettings */\n\t\t\t\tcase 'officedocumentsettings' /*case 'OfficeDocumentSettings'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'allowpng' /*case 'AllowPNG'*/: break;\n\t\t\t\t\tcase 'removepersonalinformation' /*case 'RemovePersonalInformation'*/: break;\n\t\t\t\t\tcase 'downloadcomponents' /*case 'DownloadComponents'*/: break;\n\t\t\t\t\tcase 'locationofcomponents' /*case 'LocationOfComponents'*/: break;\n\t\t\t\t\tcase 'colors' /*case 'Colors'*/: break;\n\t\t\t\t\tcase 'color' /*case 'Color'*/: break;\n\t\t\t\t\tcase 'index' /*case 'Index'*/: break;\n\t\t\t\t\tcase 'rgb' /*case 'RGB'*/: break;\n\t\t\t\t\tcase 'targetscreensize' /*case 'TargetScreenSize'*/: break;\n\t\t\t\t\tcase 'readonlyrecommended' /*case 'ReadOnlyRecommended'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* ComponentOptions */\n\t\t\t\tcase 'componentoptions' /*case 'ComponentOptions'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'toolbar' /*case 'Toolbar'*/: break;\n\t\t\t\t\tcase 'hideofficelogo' /*case 'HideOfficeLogo'*/: break;\n\t\t\t\t\tcase 'spreadsheetautofit' /*case 'SpreadsheetAutoFit'*/: break;\n\t\t\t\t\tcase 'label' /*case 'Label'*/: break;\n\t\t\t\t\tcase 'caption' /*case 'Caption'*/: break;\n\t\t\t\t\tcase 'maxheight' /*case 'MaxHeight'*/: break;\n\t\t\t\t\tcase 'maxwidth' /*case 'MaxWidth'*/: break;\n\t\t\t\t\tcase 'nextsheetnumber' /*case 'NextSheetNumber'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* ExcelWorkbook */\n\t\t\t\tcase 'excelworkbook' /*case 'ExcelWorkbook'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'date1904' /*case 'Date1904'*/:\nWorkbook.WBProps.date1904 = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'windowheight' /*case 'WindowHeight'*/: break;\n\t\t\t\t\tcase 'windowwidth' /*case 'WindowWidth'*/: break;\n\t\t\t\t\tcase 'windowtopx' /*case 'WindowTopX'*/: break;\n\t\t\t\t\tcase 'windowtopy' /*case 'WindowTopY'*/: break;\n\t\t\t\t\tcase 'tabratio' /*case 'TabRatio'*/: break;\n\t\t\t\t\tcase 'protectstructure' /*case 'ProtectStructure'*/: break;\n\t\t\t\t\tcase 'protectwindow' /*case 'ProtectWindow'*/: break;\n\t\t\t\t\tcase 'protectwindows' /*case 'ProtectWindows'*/: break;\n\t\t\t\t\tcase 'activesheet' /*case 'ActiveSheet'*/: break;\n\t\t\t\t\tcase 'displayinknotes' /*case 'DisplayInkNotes'*/: break;\n\t\t\t\t\tcase 'firstvisiblesheet' /*case 'FirstVisibleSheet'*/: break;\n\t\t\t\t\tcase 'supbook' /*case 'SupBook'*/: break;\n\t\t\t\t\tcase 'sheetname' /*case 'SheetName'*/: break;\n\t\t\t\t\tcase 'sheetindex' /*case 'SheetIndex'*/: break;\n\t\t\t\t\tcase 'sheetindexfirst' /*case 'SheetIndexFirst'*/: break;\n\t\t\t\t\tcase 'sheetindexlast' /*case 'SheetIndexLast'*/: break;\n\t\t\t\t\tcase 'dll' /*case 'Dll'*/: break;\n\t\t\t\t\tcase 'acceptlabelsinformulas' /*case 'AcceptLabelsInFormulas'*/: break;\n\t\t\t\t\tcase 'donotsavelinkvalues' /*case 'DoNotSaveLinkValues'*/: break;\n\t\t\t\t\tcase 'iteration' /*case 'Iteration'*/: break;\n\t\t\t\t\tcase 'maxiterations' /*case 'MaxIterations'*/: break;\n\t\t\t\t\tcase 'maxchange' /*case 'MaxChange'*/: break;\n\t\t\t\t\tcase 'path' /*case 'Path'*/: break;\n\t\t\t\t\tcase 'xct' /*case 'Xct'*/: break;\n\t\t\t\t\tcase 'count' /*case 'Count'*/: break;\n\t\t\t\t\tcase 'selectedsheets' /*case 'SelectedSheets'*/: break;\n\t\t\t\t\tcase 'calculation' /*case 'Calculation'*/: break;\n\t\t\t\t\tcase 'uncalced' /*case 'Uncalced'*/: break;\n\t\t\t\t\tcase 'startupprompt' /*case 'StartupPrompt'*/: break;\n\t\t\t\t\tcase 'crn' /*case 'Crn'*/: break;\n\t\t\t\t\tcase 'externname' /*case 'ExternName'*/: break;\n\t\t\t\t\tcase 'formula' /*case 'Formula'*/: break;\n\t\t\t\t\tcase 'colfirst' /*case 'ColFirst'*/: break;\n\t\t\t\t\tcase 'collast' /*case 'ColLast'*/: break;\n\t\t\t\t\tcase 'wantadvise' /*case 'WantAdvise'*/: break;\n\t\t\t\t\tcase 'boolean' /*case 'Boolean'*/: break;\n\t\t\t\t\tcase 'error' /*case 'Error'*/: break;\n\t\t\t\t\tcase 'text' /*case 'Text'*/: break;\n\t\t\t\t\tcase 'ole' /*case 'OLE'*/: break;\n\t\t\t\t\tcase 'noautorecover' /*case 'NoAutoRecover'*/: break;\n\t\t\t\t\tcase 'publishobjects' /*case 'PublishObjects'*/: break;\n\t\t\t\t\tcase 'donotcalculatebeforesave' /*case 'DoNotCalculateBeforeSave'*/: break;\n\t\t\t\t\tcase 'number' /*case 'Number'*/: break;\n\t\t\t\t\tcase 'refmoder1c1' /*case 'RefModeR1C1'*/: break;\n\t\t\t\t\tcase 'embedsavesmarttags' /*case 'EmbedSaveSmartTags'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* WorkbookOptions */\n\t\t\t\tcase 'workbookoptions' /*case 'WorkbookOptions'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'owcversion' /*case 'OWCVersion'*/: break;\n\t\t\t\t\tcase 'height' /*case 'Height'*/: break;\n\t\t\t\t\tcase 'width' /*case 'Width'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* WorksheetOptions */\n\t\t\t\tcase 'worksheetoptions' /*case 'WorksheetOptions'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'visible' /*case 'Visible'*/:\n\t\t\t\t\t\tif(Rn[0].slice(-2) === \"/>\"){/* empty */}\n\t\t\t\t\t\telse if(Rn[1]===\"/\") switch(str.slice(pidx, Rn.index)) {\n\t\t\t\t\t\t\tcase \"SheetHidden\": wsprops.Hidden = 1; break;\n\t\t\t\t\t\t\tcase \"SheetVeryHidden\": wsprops.Hidden = 2; break;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse pidx = Rn.index + Rn[0].length;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'header' /*case 'Header'*/:\n\t\t\t\t\t\tif(!cursheet['!margins']) default_margins(cursheet['!margins']={}, 'xlml');\n\t\t\t\t\t\tcursheet['!margins'].header = parsexmltag(Rn[0]).Margin;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'footer' /*case 'Footer'*/:\n\t\t\t\t\t\tif(!cursheet['!margins']) default_margins(cursheet['!margins']={}, 'xlml');\n\t\t\t\t\t\tcursheet['!margins'].footer = parsexmltag(Rn[0]).Margin;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'pagemargins' /*case 'PageMargins'*/:\n\t\t\t\t\t\tvar pagemargins = parsexmltag(Rn[0]);\n\t\t\t\t\t\tif(!cursheet['!margins']) default_margins(cursheet['!margins']={},'xlml');\n\t\t\t\t\t\tif(pagemargins.Top) cursheet['!margins'].top = pagemargins.Top;\n\t\t\t\t\t\tif(pagemargins.Left) cursheet['!margins'].left = pagemargins.Left;\n\t\t\t\t\t\tif(pagemargins.Right) cursheet['!margins'].right = pagemargins.Right;\n\t\t\t\t\t\tif(pagemargins.Bottom) cursheet['!margins'].bottom = pagemargins.Bottom;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'displayrighttoleft' /*case 'DisplayRightToLeft'*/:\n\t\t\t\t\t\tif(!Workbook.Views) Workbook.Views = [];\n\t\t\t\t\t\tif(!Workbook.Views[0]) Workbook.Views[0] = {};\n\t\t\t\t\t\tWorkbook.Views[0].RTL = true;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'freezepanes' /*case 'FreezePanes'*/: break;\n\t\t\t\t\tcase 'frozennosplit' /*case 'FrozenNoSplit'*/: break;\n\n\t\t\t\t\tcase 'splithorizontal' /*case 'SplitHorizontal'*/:\n\t\t\t\t\tcase 'splitvertical' /*case 'SplitVertical'*/:\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'donotdisplaygridlines' /*case 'DoNotDisplayGridlines'*/:\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'activerow' /*case 'ActiveRow'*/: break;\n\t\t\t\t\tcase 'activecol' /*case 'ActiveCol'*/: break;\n\t\t\t\t\tcase 'toprowbottompane' /*case 'TopRowBottomPane'*/: break;\n\t\t\t\t\tcase 'leftcolumnrightpane' /*case 'LeftColumnRightPane'*/: break;\n\n\t\t\t\t\tcase 'unsynced' /*case 'Unsynced'*/: break;\n\t\t\t\t\tcase 'print' /*case 'Print'*/: break;\n\t\t\t\t\tcase 'printerrors' /*case 'PrintErrors'*/: break;\n\t\t\t\t\tcase 'panes' /*case 'Panes'*/: break;\n\t\t\t\t\tcase 'scale' /*case 'Scale'*/: break;\n\t\t\t\t\tcase 'pane' /*case 'Pane'*/: break;\n\t\t\t\t\tcase 'number' /*case 'Number'*/: break;\n\t\t\t\t\tcase 'layout' /*case 'Layout'*/: break;\n\t\t\t\t\tcase 'pagesetup' /*case 'PageSetup'*/: break;\n\t\t\t\t\tcase 'selected' /*case 'Selected'*/: break;\n\t\t\t\t\tcase 'protectobjects' /*case 'ProtectObjects'*/: break;\n\t\t\t\t\tcase 'enableselection' /*case 'EnableSelection'*/: break;\n\t\t\t\t\tcase 'protectscenarios' /*case 'ProtectScenarios'*/: break;\n\t\t\t\t\tcase 'validprinterinfo' /*case 'ValidPrinterInfo'*/: break;\n\t\t\t\t\tcase 'horizontalresolution' /*case 'HorizontalResolution'*/: break;\n\t\t\t\t\tcase 'verticalresolution' /*case 'VerticalResolution'*/: break;\n\t\t\t\t\tcase 'numberofcopies' /*case 'NumberofCopies'*/: break;\n\t\t\t\t\tcase 'activepane' /*case 'ActivePane'*/: break;\n\t\t\t\t\tcase 'toprowvisible' /*case 'TopRowVisible'*/: break;\n\t\t\t\t\tcase 'leftcolumnvisible' /*case 'LeftColumnVisible'*/: break;\n\t\t\t\t\tcase 'fittopage' /*case 'FitToPage'*/: break;\n\t\t\t\t\tcase 'rangeselection' /*case 'RangeSelection'*/: break;\n\t\t\t\t\tcase 'papersizeindex' /*case 'PaperSizeIndex'*/: break;\n\t\t\t\t\tcase 'pagelayoutzoom' /*case 'PageLayoutZoom'*/: break;\n\t\t\t\t\tcase 'pagebreakzoom' /*case 'PageBreakZoom'*/: break;\n\t\t\t\t\tcase 'filteron' /*case 'FilterOn'*/: break;\n\t\t\t\t\tcase 'fitwidth' /*case 'FitWidth'*/: break;\n\t\t\t\t\tcase 'fitheight' /*case 'FitHeight'*/: break;\n\t\t\t\t\tcase 'commentslayout' /*case 'CommentsLayout'*/: break;\n\t\t\t\t\tcase 'zoom' /*case 'Zoom'*/: break;\n\t\t\t\t\tcase 'lefttoright' /*case 'LeftToRight'*/: break;\n\t\t\t\t\tcase 'gridlines' /*case 'Gridlines'*/: break;\n\t\t\t\t\tcase 'allowsort' /*case 'AllowSort'*/: break;\n\t\t\t\t\tcase 'allowfilter' /*case 'AllowFilter'*/: break;\n\t\t\t\t\tcase 'allowinsertrows' /*case 'AllowInsertRows'*/: break;\n\t\t\t\t\tcase 'allowdeleterows' /*case 'AllowDeleteRows'*/: break;\n\t\t\t\t\tcase 'allowinsertcols' /*case 'AllowInsertCols'*/: break;\n\t\t\t\t\tcase 'allowdeletecols' /*case 'AllowDeleteCols'*/: break;\n\t\t\t\t\tcase 'allowinserthyperlinks' /*case 'AllowInsertHyperlinks'*/: break;\n\t\t\t\t\tcase 'allowformatcells' /*case 'AllowFormatCells'*/: break;\n\t\t\t\t\tcase 'allowsizecols' /*case 'AllowSizeCols'*/: break;\n\t\t\t\t\tcase 'allowsizerows' /*case 'AllowSizeRows'*/: break;\n\t\t\t\t\tcase 'nosummaryrowsbelowdetail' /*case 'NoSummaryRowsBelowDetail'*/:\n\t\t\t\t\t\tif(!cursheet[\"!outline\"]) cursheet[\"!outline\"] = {};\n\t\t\t\t\t\tcursheet[\"!outline\"].above = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'tabcolorindex' /*case 'TabColorIndex'*/: break;\n\t\t\t\t\tcase 'donotdisplayheadings' /*case 'DoNotDisplayHeadings'*/: break;\n\t\t\t\t\tcase 'showpagelayoutzoom' /*case 'ShowPageLayoutZoom'*/: break;\n\t\t\t\t\tcase 'nosummarycolumnsrightdetail' /*case 'NoSummaryColumnsRightDetail'*/:\n\t\t\t\t\t\tif(!cursheet[\"!outline\"]) cursheet[\"!outline\"] = {};\n\t\t\t\t\t\tcursheet[\"!outline\"].left = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'blackandwhite' /*case 'BlackAndWhite'*/: break;\n\t\t\t\t\tcase 'donotdisplayzeros' /*case 'DoNotDisplayZeros'*/: break;\n\t\t\t\t\tcase 'displaypagebreak' /*case 'DisplayPageBreak'*/: break;\n\t\t\t\t\tcase 'rowcolheadings' /*case 'RowColHeadings'*/: break;\n\t\t\t\t\tcase 'donotdisplayoutline' /*case 'DoNotDisplayOutline'*/: break;\n\t\t\t\t\tcase 'noorientation' /*case 'NoOrientation'*/: break;\n\t\t\t\t\tcase 'allowusepivottables' /*case 'AllowUsePivotTables'*/: break;\n\t\t\t\t\tcase 'zeroheight' /*case 'ZeroHeight'*/: break;\n\t\t\t\t\tcase 'viewablerange' /*case 'ViewableRange'*/: break;\n\t\t\t\t\tcase 'selection' /*case 'Selection'*/: break;\n\t\t\t\t\tcase 'protectcontents' /*case 'ProtectContents'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* PivotTable */\n\t\t\t\tcase 'pivottable' /*case 'PivotTable'*/: case 'pivotcache' /*case 'PivotCache'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'immediateitemsondrop' /*case 'ImmediateItemsOnDrop'*/: break;\n\t\t\t\t\tcase 'showpagemultipleitemlabel' /*case 'ShowPageMultipleItemLabel'*/: break;\n\t\t\t\t\tcase 'compactrowindent' /*case 'CompactRowIndent'*/: break;\n\t\t\t\t\tcase 'location' /*case 'Location'*/: break;\n\t\t\t\t\tcase 'pivotfield' /*case 'PivotField'*/: break;\n\t\t\t\t\tcase 'orientation' /*case 'Orientation'*/: break;\n\t\t\t\t\tcase 'layoutform' /*case 'LayoutForm'*/: break;\n\t\t\t\t\tcase 'layoutsubtotallocation' /*case 'LayoutSubtotalLocation'*/: break;\n\t\t\t\t\tcase 'layoutcompactrow' /*case 'LayoutCompactRow'*/: break;\n\t\t\t\t\tcase 'position' /*case 'Position'*/: break;\n\t\t\t\t\tcase 'pivotitem' /*case 'PivotItem'*/: break;\n\t\t\t\t\tcase 'datatype' /*case 'DataType'*/: break;\n\t\t\t\t\tcase 'datafield' /*case 'DataField'*/: break;\n\t\t\t\t\tcase 'sourcename' /*case 'SourceName'*/: break;\n\t\t\t\t\tcase 'parentfield' /*case 'ParentField'*/: break;\n\t\t\t\t\tcase 'ptlineitems' /*case 'PTLineItems'*/: break;\n\t\t\t\t\tcase 'ptlineitem' /*case 'PTLineItem'*/: break;\n\t\t\t\t\tcase 'countofsameitems' /*case 'CountOfSameItems'*/: break;\n\t\t\t\t\tcase 'item' /*case 'Item'*/: break;\n\t\t\t\t\tcase 'itemtype' /*case 'ItemType'*/: break;\n\t\t\t\t\tcase 'ptsource' /*case 'PTSource'*/: break;\n\t\t\t\t\tcase 'cacheindex' /*case 'CacheIndex'*/: break;\n\t\t\t\t\tcase 'consolidationreference' /*case 'ConsolidationReference'*/: break;\n\t\t\t\t\tcase 'filename' /*case 'FileName'*/: break;\n\t\t\t\t\tcase 'reference' /*case 'Reference'*/: break;\n\t\t\t\t\tcase 'nocolumngrand' /*case 'NoColumnGrand'*/: break;\n\t\t\t\t\tcase 'norowgrand' /*case 'NoRowGrand'*/: break;\n\t\t\t\t\tcase 'blanklineafteritems' /*case 'BlankLineAfterItems'*/: break;\n\t\t\t\t\tcase 'hidden' /*case 'Hidden'*/: break;\n\t\t\t\t\tcase 'subtotal' /*case 'Subtotal'*/: break;\n\t\t\t\t\tcase 'basefield' /*case 'BaseField'*/: break;\n\t\t\t\t\tcase 'mapchilditems' /*case 'MapChildItems'*/: break;\n\t\t\t\t\tcase 'function' /*case 'Function'*/: break;\n\t\t\t\t\tcase 'refreshonfileopen' /*case 'RefreshOnFileOpen'*/: break;\n\t\t\t\t\tcase 'printsettitles' /*case 'PrintSetTitles'*/: break;\n\t\t\t\t\tcase 'mergelabels' /*case 'MergeLabels'*/: break;\n\t\t\t\t\tcase 'defaultversion' /*case 'DefaultVersion'*/: break;\n\t\t\t\t\tcase 'refreshname' /*case 'RefreshName'*/: break;\n\t\t\t\t\tcase 'refreshdate' /*case 'RefreshDate'*/: break;\n\t\t\t\t\tcase 'refreshdatecopy' /*case 'RefreshDateCopy'*/: break;\n\t\t\t\t\tcase 'versionlastrefresh' /*case 'VersionLastRefresh'*/: break;\n\t\t\t\t\tcase 'versionlastupdate' /*case 'VersionLastUpdate'*/: break;\n\t\t\t\t\tcase 'versionupdateablemin' /*case 'VersionUpdateableMin'*/: break;\n\t\t\t\t\tcase 'versionrefreshablemin' /*case 'VersionRefreshableMin'*/: break;\n\t\t\t\t\tcase 'calculation' /*case 'Calculation'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* PageBreaks */\n\t\t\t\tcase 'pagebreaks' /*case 'PageBreaks'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'colbreaks' /*case 'ColBreaks'*/: break;\n\t\t\t\t\tcase 'colbreak' /*case 'ColBreak'*/: break;\n\t\t\t\t\tcase 'rowbreaks' /*case 'RowBreaks'*/: break;\n\t\t\t\t\tcase 'rowbreak' /*case 'RowBreak'*/: break;\n\t\t\t\t\tcase 'colstart' /*case 'ColStart'*/: break;\n\t\t\t\t\tcase 'colend' /*case 'ColEnd'*/: break;\n\t\t\t\t\tcase 'rowend' /*case 'RowEnd'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* AutoFilter */\n\t\t\t\tcase 'autofilter' /*case 'AutoFilter'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'autofiltercolumn' /*case 'AutoFilterColumn'*/: break;\n\t\t\t\t\tcase 'autofiltercondition' /*case 'AutoFilterCondition'*/: break;\n\t\t\t\t\tcase 'autofilterand' /*case 'AutoFilterAnd'*/: break;\n\t\t\t\t\tcase 'autofilteror' /*case 'AutoFilterOr'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* QueryTable */\n\t\t\t\tcase 'querytable' /*case 'QueryTable'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'id' /*case 'Id'*/: break;\n\t\t\t\t\tcase 'autoformatfont' /*case 'AutoFormatFont'*/: break;\n\t\t\t\t\tcase 'autoformatpattern' /*case 'AutoFormatPattern'*/: break;\n\t\t\t\t\tcase 'querysource' /*case 'QuerySource'*/: break;\n\t\t\t\t\tcase 'querytype' /*case 'QueryType'*/: break;\n\t\t\t\t\tcase 'enableredirections' /*case 'EnableRedirections'*/: break;\n\t\t\t\t\tcase 'refreshedinxl9' /*case 'RefreshedInXl9'*/: break;\n\t\t\t\t\tcase 'urlstring' /*case 'URLString'*/: break;\n\t\t\t\t\tcase 'htmltables' /*case 'HTMLTables'*/: break;\n\t\t\t\t\tcase 'connection' /*case 'Connection'*/: break;\n\t\t\t\t\tcase 'commandtext' /*case 'CommandText'*/: break;\n\t\t\t\t\tcase 'refreshinfo' /*case 'RefreshInfo'*/: break;\n\t\t\t\t\tcase 'notitles' /*case 'NoTitles'*/: break;\n\t\t\t\t\tcase 'nextid' /*case 'NextId'*/: break;\n\t\t\t\t\tcase 'columninfo' /*case 'ColumnInfo'*/: break;\n\t\t\t\t\tcase 'overwritecells' /*case 'OverwriteCells'*/: break;\n\t\t\t\t\tcase 'donotpromptforfile' /*case 'DoNotPromptForFile'*/: break;\n\t\t\t\t\tcase 'textwizardsettings' /*case 'TextWizardSettings'*/: break;\n\t\t\t\t\tcase 'source' /*case 'Source'*/: break;\n\t\t\t\t\tcase 'number' /*case 'Number'*/: break;\n\t\t\t\t\tcase 'decimal' /*case 'Decimal'*/: break;\n\t\t\t\t\tcase 'thousandseparator' /*case 'ThousandSeparator'*/: break;\n\t\t\t\t\tcase 'trailingminusnumbers' /*case 'TrailingMinusNumbers'*/: break;\n\t\t\t\t\tcase 'formatsettings' /*case 'FormatSettings'*/: break;\n\t\t\t\t\tcase 'fieldtype' /*case 'FieldType'*/: break;\n\t\t\t\t\tcase 'delimiters' /*case 'Delimiters'*/: break;\n\t\t\t\t\tcase 'tab' /*case 'Tab'*/: break;\n\t\t\t\t\tcase 'comma' /*case 'Comma'*/: break;\n\t\t\t\t\tcase 'autoformatname' /*case 'AutoFormatName'*/: break;\n\t\t\t\t\tcase 'versionlastedit' /*case 'VersionLastEdit'*/: break;\n\t\t\t\t\tcase 'versionlastrefresh' /*case 'VersionLastRefresh'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\tcase 'datavalidation' /*case 'DataValidation'*/:\n\t\t\t\tswitch(Rn[3]) {\n\t\t\t\t\tcase 'range' /*case 'Range'*/: break;\n\n\t\t\t\t\tcase 'type' /*case 'Type'*/: break;\n\t\t\t\t\tcase 'min' /*case 'Min'*/: break;\n\t\t\t\t\tcase 'max' /*case 'Max'*/: break;\n\t\t\t\t\tcase 'sort' /*case 'Sort'*/: break;\n\t\t\t\t\tcase 'descending' /*case 'Descending'*/: break;\n\t\t\t\t\tcase 'order' /*case 'Order'*/: break;\n\t\t\t\t\tcase 'casesensitive' /*case 'CaseSensitive'*/: break;\n\t\t\t\t\tcase 'value' /*case 'Value'*/: break;\n\t\t\t\t\tcase 'errorstyle' /*case 'ErrorStyle'*/: break;\n\t\t\t\t\tcase 'errormessage' /*case 'ErrorMessage'*/: break;\n\t\t\t\t\tcase 'errortitle' /*case 'ErrorTitle'*/: break;\n\t\t\t\t\tcase 'inputmessage' /*case 'InputMessage'*/: break;\n\t\t\t\t\tcase 'inputtitle' /*case 'InputTitle'*/: break;\n\t\t\t\t\tcase 'combohide' /*case 'ComboHide'*/: break;\n\t\t\t\t\tcase 'inputhide' /*case 'InputHide'*/: break;\n\t\t\t\t\tcase 'condition' /*case 'Condition'*/: break;\n\t\t\t\t\tcase 'qualifier' /*case 'Qualifier'*/: break;\n\t\t\t\t\tcase 'useblank' /*case 'UseBlank'*/: break;\n\t\t\t\t\tcase 'value1' /*case 'Value1'*/: break;\n\t\t\t\t\tcase 'value2' /*case 'Value2'*/: break;\n\t\t\t\t\tcase 'format' /*case 'Format'*/: break;\n\n\t\t\t\t\tcase 'cellrangelist' /*case 'CellRangeList'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\tcase 'sorting' /*case 'Sorting'*/:\n\t\t\t\tcase 'conditionalformatting' /*case 'ConditionalFormatting'*/:\n\t\t\t\tswitch(Rn[3]) {\n\t\t\t\t\tcase 'range' /*case 'Range'*/: break;\n\t\t\t\t\tcase 'type' /*case 'Type'*/: break;\n\t\t\t\t\tcase 'min' /*case 'Min'*/: break;\n\t\t\t\t\tcase 'max' /*case 'Max'*/: break;\n\t\t\t\t\tcase 'sort' /*case 'Sort'*/: break;\n\t\t\t\t\tcase 'descending' /*case 'Descending'*/: break;\n\t\t\t\t\tcase 'order' /*case 'Order'*/: break;\n\t\t\t\t\tcase 'casesensitive' /*case 'CaseSensitive'*/: break;\n\t\t\t\t\tcase 'value' /*case 'Value'*/: break;\n\t\t\t\t\tcase 'errorstyle' /*case 'ErrorStyle'*/: break;\n\t\t\t\t\tcase 'errormessage' /*case 'ErrorMessage'*/: break;\n\t\t\t\t\tcase 'errortitle' /*case 'ErrorTitle'*/: break;\n\t\t\t\t\tcase 'cellrangelist' /*case 'CellRangeList'*/: break;\n\t\t\t\t\tcase 'inputmessage' /*case 'InputMessage'*/: break;\n\t\t\t\t\tcase 'inputtitle' /*case 'InputTitle'*/: break;\n\t\t\t\t\tcase 'combohide' /*case 'ComboHide'*/: break;\n\t\t\t\t\tcase 'inputhide' /*case 'InputHide'*/: break;\n\t\t\t\t\tcase 'condition' /*case 'Condition'*/: break;\n\t\t\t\t\tcase 'qualifier' /*case 'Qualifier'*/: break;\n\t\t\t\t\tcase 'useblank' /*case 'UseBlank'*/: break;\n\t\t\t\t\tcase 'value1' /*case 'Value1'*/: break;\n\t\t\t\t\tcase 'value2' /*case 'Value2'*/: break;\n\t\t\t\t\tcase 'format' /*case 'Format'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* MapInfo (schema) */\n\t\t\t\tcase 'mapinfo' /*case 'MapInfo'*/: case 'schema' /*case 'Schema'*/: case 'data' /*case 'data'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'map' /*case 'Map'*/: break;\n\t\t\t\t\tcase 'entry' /*case 'Entry'*/: break;\n\t\t\t\t\tcase 'range' /*case 'Range'*/: break;\n\t\t\t\t\tcase 'xpath' /*case 'XPath'*/: break;\n\t\t\t\t\tcase 'field' /*case 'Field'*/: break;\n\t\t\t\t\tcase 'xsdtype' /*case 'XSDType'*/: break;\n\t\t\t\t\tcase 'filteron' /*case 'FilterOn'*/: break;\n\t\t\t\t\tcase 'aggregate' /*case 'Aggregate'*/: break;\n\t\t\t\t\tcase 'elementtype' /*case 'ElementType'*/: break;\n\t\t\t\t\tcase 'attributetype' /*case 'AttributeType'*/: break;\n\t\t\t\t/* These are from xsd (XML Schema Definition) */\n\t\t\t\t\tcase 'schema' /*case 'schema'*/:\n\t\t\t\t\tcase 'element' /*case 'element'*/:\n\t\t\t\t\tcase 'complextype' /*case 'complexType'*/:\n\t\t\t\t\tcase 'datatype' /*case 'datatype'*/:\n\t\t\t\t\tcase 'all' /*case 'all'*/:\n\t\t\t\t\tcase 'attribute' /*case 'attribute'*/:\n\t\t\t\t\tcase 'extends' /*case 'extends'*/: break;\n\n\t\t\t\t\tcase 'row' /*case 'row'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* SmartTags (can be anything) */\n\t\t\t\tcase 'smarttags' /*case 'SmartTags'*/: break;\n\n\t\t\t\tdefault: seen = false; break;\n\t\t\t}\n\t\t\tif(seen) break;\n\t\t\t/* CustomDocumentProperties */\n\t\t\tif(Rn[3].match(/!\\[CDATA/)) break;\n\t\t\tif(!state[state.length-1][1]) throw 'Unrecognized tag: ' + Rn[3] + \"|\" + state.join(\"|\");\n\t\t\tif(state[state.length-1][0]===/*'CustomDocumentProperties'*/'customdocumentproperties') {\n\t\t\t\tif(Rn[0].slice(-2) === \"/>\") break;\n\t\t\t\telse if(Rn[1]===\"/\") xlml_set_custprop(Custprops, raw_Rn3, cp, str.slice(pidx, Rn.index));\n\t\t\t\telse { cp = Rn; pidx = Rn.index + Rn[0].length; }\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(opts.WTF) throw 'Unrecognized tag: ' + Rn[3] + \"|\" + state.join(\"|\");\n\t}\n\tvar out = ({});\n\tif(!opts.bookSheets && !opts.bookProps) out.Sheets = sheets;\n\tout.SheetNames = sheetnames;\n\tout.Workbook = Workbook;\n\tout.SSF = SSF.get_table();\n\tout.Props = Props;\n\tout.Custprops = Custprops;\n\treturn out;\n}\n\nfunction parse_xlml(data, opts) {\n\tfix_read_opts(opts=opts||{});\n\tswitch(opts.type||\"base64\") {\n\t\tcase \"base64\": return parse_xlml_xml(Base64.decode(data), opts);\n\t\tcase \"binary\": case \"buffer\": case \"file\": return parse_xlml_xml(data, opts);\n\t\tcase \"array\": return parse_xlml_xml(a2s(data), opts);\n\t}\n}\n\n/* TODO */\nfunction write_props_xlml(wb, opts) {\n\tvar o = [];\n\t/* DocumentProperties */\n\tif(wb.Props) o.push(xlml_write_docprops(wb.Props, opts));\n\t/* CustomDocumentProperties */\n\tif(wb.Custprops) o.push(xlml_write_custprops(wb.Props, wb.Custprops, opts));\n\treturn o.join(\"\");\n}\n/* TODO */\nfunction write_wb_xlml() {\n\t/* OfficeDocumentSettings */\n\t/* ExcelWorkbook */\n\treturn \"\";\n}\n/* TODO */\nfunction write_sty_xlml(wb, opts) {\n\t/* Styles */\n\tvar styles = [''];\n\topts.cellXfs.forEach(function(xf, id) {\n\t\tvar payload = [];\n\t\tpayload.push(writextag('NumberFormat', null, {\"ss:Format\": escapexml(SSF._table[xf.numFmtId])}));\n\n\t\tvar o = {\"ss:ID\": \"s\" + (21+id)};\n\t\tstyles.push(writextag('Style', payload.join(\"\"), o));\n\t});\n\treturn writextag(\"Styles\", styles.join(\"\"));\n}\nfunction write_name_xlml(n) { return writextag(\"NamedRange\", null, {\"ss:Name\": n.Name, \"ss:RefersTo\":\"=\" + a1_to_rc(n.Ref, {r:0,c:0})}); }\nfunction write_names_xlml(wb) {\n\tif(!((wb||{}).Workbook||{}).Names) return \"\";\nvar names = wb.Workbook.Names;\n\tvar out = [];\n\tfor(var i = 0; i < names.length; ++i) {\n\t\tvar n = names[i];\n\t\tif(n.Sheet != null) continue;\n\t\tif(n.Name.match(/^_xlfn\\./)) continue;\n\t\tout.push(write_name_xlml(n));\n\t}\n\treturn writextag(\"Names\", out.join(\"\"));\n}\nfunction write_ws_xlml_names(ws, opts, idx, wb) {\n\tif(!ws) return \"\";\n\tif(!((wb||{}).Workbook||{}).Names) return \"\";\nvar names = wb.Workbook.Names;\n\tvar out = [];\n\tfor(var i = 0; i < names.length; ++i) {\n\t\tvar n = names[i];\n\t\tif(n.Sheet != idx) continue;\n\t\t/*switch(n.Name) {\n\t\t\tcase \"_\": continue;\n\t\t}*/\n\t\tif(n.Name.match(/^_xlfn\\./)) continue;\n\t\tout.push(write_name_xlml(n));\n\t}\n\treturn out.join(\"\");\n}\n/* WorksheetOptions */\nfunction write_ws_xlml_wsopts(ws, opts, idx, wb) {\n\tif(!ws) return \"\";\n\tvar o = [];\n\t/* NOTE: spec technically allows any order, but stick with implied order */\n\n\t/* FitToPage */\n\t/* DoNotDisplayColHeaders */\n\t/* DoNotDisplayRowHeaders */\n\t/* ViewableRange */\n\t/* Selection */\n\t/* GridlineColor */\n\t/* Name */\n\t/* ExcelWorksheetType */\n\t/* IntlMacro */\n\t/* Unsynced */\n\t/* Selected */\n\t/* CodeName */\n\n\tif(ws['!margins']) {\n\t\to.push(\"\");\n\t\tif(ws['!margins'].header) o.push(writextag(\"Header\", null, {'x:Margin':ws['!margins'].header}));\n\t\tif(ws['!margins'].footer) o.push(writextag(\"Footer\", null, {'x:Margin':ws['!margins'].footer}));\n\t\to.push(writextag(\"PageMargins\", null, {\n\t\t\t'x:Bottom': ws['!margins'].bottom || \"0.75\",\n\t\t\t'x:Left': ws['!margins'].left || \"0.7\",\n\t\t\t'x:Right': ws['!margins'].right || \"0.7\",\n\t\t\t'x:Top': ws['!margins'].top || \"0.75\"\n\t\t}));\n\t\to.push(\"\");\n\t}\n\n\t/* PageSetup */\n\t/* DisplayPageBreak */\n\t/* TransitionExpressionEvaluation */\n\t/* TransitionFormulaEntry */\n\t/* Print */\n\t/* Zoom */\n\t/* PageLayoutZoom */\n\t/* PageBreakZoom */\n\t/* ShowPageBreakZoom */\n\t/* DefaultRowHeight */\n\t/* DefaultColumnWidth */\n\t/* StandardWidth */\n\n\tif(wb && wb.Workbook && wb.Workbook.Sheets && wb.Workbook.Sheets[idx]) {\n\t\t/* Visible */\n\t\tif(wb.Workbook.Sheets[idx].Hidden) o.push(writextag(\"Visible\", (wb.Workbook.Sheets[idx].Hidden == 1 ? \"SheetHidden\" : \"SheetVeryHidden\"), {}));\n\t\telse {\n\t\t\t/* Selected */\n\t\t\tfor(var i = 0; i < idx; ++i) if(wb.Workbook.Sheets[i] && !wb.Workbook.Sheets[i].Hidden) break;\n\t\t\tif(i == idx) o.push(\"\");\n\t\t}\n\t}\n\n\t/* LeftColumnVisible */\n\n\tif(((((wb||{}).Workbook||{}).Views||[])[0]||{}).RTL) o.push(\"\");\n\n\t/* GridlineColorIndex */\n\t/* DisplayFormulas */\n\t/* DoNotDisplayGridlines */\n\t/* DoNotDisplayHeadings */\n\t/* DoNotDisplayOutline */\n\t/* ApplyAutomaticOutlineStyles */\n\t/* NoSummaryRowsBelowDetail */\n\t/* NoSummaryColumnsRightDetail */\n\t/* DoNotDisplayZeros */\n\t/* ActiveRow */\n\t/* ActiveColumn */\n\t/* FilterOn */\n\t/* RangeSelection */\n\t/* TopRowVisible */\n\t/* TopRowBottomPane */\n\t/* LeftColumnRightPane */\n\t/* ActivePane */\n\t/* SplitHorizontal */\n\t/* SplitVertical */\n\t/* FreezePanes */\n\t/* FrozenNoSplit */\n\t/* TabColorIndex */\n\t/* Panes */\n\n\t/* NOTE: Password not supported in XLML Format */\n\tif(ws['!protect']) {\n\t\to.push(writetag(\"ProtectContents\", \"True\"));\n\t\tif(ws['!protect'].objects) o.push(writetag(\"ProtectObjects\", \"True\"));\n\t\tif(ws['!protect'].scenarios) o.push(writetag(\"ProtectScenarios\", \"True\"));\n\t\tif(ws['!protect'].selectLockedCells != null && !ws['!protect'].selectLockedCells) o.push(writetag(\"EnableSelection\", \"NoSelection\"));\n\t\telse if(ws['!protect'].selectUnlockedCells != null && !ws['!protect'].selectUnlockedCells) o.push(writetag(\"EnableSelection\", \"UnlockedCells\"));\n\t[\n\t\t[ \"formatCells\", \"AllowFormatCells\" ],\n\t\t[ \"formatColumns\", \"AllowSizeCols\" ],\n\t\t[ \"formatRows\", \"AllowSizeRows\" ],\n\t\t[ \"insertColumns\", \"AllowInsertCols\" ],\n\t\t[ \"insertRows\", \"AllowInsertRows\" ],\n\t\t[ \"insertHyperlinks\", \"AllowInsertHyperlinks\" ],\n\t\t[ \"deleteColumns\", \"AllowDeleteCols\" ],\n\t\t[ \"deleteRows\", \"AllowDeleteRows\" ],\n\t\t[ \"sort\", \"AllowSort\" ],\n\t\t[ \"autoFilter\", \"AllowFilter\" ],\n\t\t[ \"pivotTables\", \"AllowUsePivotTables\" ]\n\t].forEach(function(x) { if(ws['!protect'][x[0]]) o.push(\"<\"+x[1]+\"/>\"); });\n\t}\n\n\tif(o.length == 0) return \"\";\n\treturn writextag(\"WorksheetOptions\", o.join(\"\"), {xmlns:XLMLNS.x});\n}\nfunction write_ws_xlml_comment(comments) {\n\treturn comments.map(function(c) {\n\t\t// TODO: formatted text\n\t\tvar t = xlml_unfixstr(c.t||\"\");\n\t\tvar d =writextag(\"ss:Data\", t, {\"xmlns\":\"http://www.w3.org/TR/REC-html40\"});\n\t\treturn writextag(\"Comment\", d, {\"ss:Author\":c.a});\n\t}).join(\"\");\n}\nfunction write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr){\n\tif(!cell || (cell.v == undefined && cell.f == undefined)) return \"\";\n\n\tvar attr = {};\n\tif(cell.f) attr[\"ss:Formula\"] = \"=\" + escapexml(a1_to_rc(cell.f, addr));\n\tif(cell.F && cell.F.slice(0, ref.length) == ref) {\n\t\tvar end = decode_cell(cell.F.slice(ref.length + 1));\n\t\tattr[\"ss:ArrayRange\"] = \"RC:R\" + (end.r == addr.r ? \"\" : \"[\" + (end.r - addr.r) + \"]\") + \"C\" + (end.c == addr.c ? \"\" : \"[\" + (end.c - addr.c) + \"]\");\n\t}\n\n\tif(cell.l && cell.l.Target) {\n\t\tattr[\"ss:HRef\"] = escapexml(cell.l.Target);\n\t\tif(cell.l.Tooltip) attr[\"x:HRefScreenTip\"] = escapexml(cell.l.Tooltip);\n\t}\n\n\tif(ws['!merges']) {\n\t\tvar marr = ws['!merges'];\n\t\tfor(var mi = 0; mi != marr.length; ++mi) {\n\t\t\tif(marr[mi].s.c != addr.c || marr[mi].s.r != addr.r) continue;\n\t\t\tif(marr[mi].e.c > marr[mi].s.c) attr['ss:MergeAcross'] = marr[mi].e.c - marr[mi].s.c;\n\t\t\tif(marr[mi].e.r > marr[mi].s.r) attr['ss:MergeDown'] = marr[mi].e.r - marr[mi].s.r;\n\t\t}\n\t}\n\n\tvar t = \"\", p = \"\";\n\tswitch(cell.t) {\n\t\tcase 'z': if(!opts.sheetStubs) return \"\"; break;\n\t\tcase 'n': t = 'Number'; p = String(cell.v); break;\n\t\tcase 'b': t = 'Boolean'; p = (cell.v ? \"1\" : \"0\"); break;\n\t\tcase 'e': t = 'Error'; p = BErr[cell.v]; break;\n\t\tcase 'd': t = 'DateTime'; p = new Date(cell.v).toISOString(); if(cell.z == null) cell.z = cell.z || SSF._table[14]; break;\n\t\tcase 's': t = 'String'; p = escapexlml(cell.v||\"\"); break;\n\t}\n\t/* TODO: cell style */\n\tvar os = get_cell_style(opts.cellXfs, cell, opts);\n\tattr[\"ss:StyleID\"] = \"s\" + (21+os);\n\tattr[\"ss:Index\"] = addr.c + 1;\n\tvar _v = (cell.v != null ? p : \"\");\n\tvar m = cell.t == 'z' ? \"\" : ('' + _v + '');\n\n\tif((cell.c||[]).length > 0) m += write_ws_xlml_comment(cell.c);\n\n\treturn writextag(\"Cell\", m, attr);\n}\nfunction write_ws_xlml_row(R, row) {\n\tvar o = '';\n}\n/* TODO */\nfunction write_ws_xlml_table(ws, opts, idx, wb) {\n\tif(!ws['!ref']) return \"\";\n\tvar range = safe_decode_range(ws['!ref']);\n\tvar marr = ws['!merges'] || [], mi = 0;\n\tvar o = [];\n\tif(ws['!cols']) ws['!cols'].forEach(function(n, i) {\n\t\tprocess_col(n);\n\t\tvar w = !!n.width;\n\t\tvar p = col_obj_w(i, n);\n\t\tvar k = {\"ss:Index\":i+1};\n\t\tif(w) k['ss:Width'] = width2px(p.width);\n\t\tif(n.hidden) k['ss:Hidden']=\"1\";\n\t\to.push(writextag(\"Column\",null,k));\n\t});\n\tvar dense = Array.isArray(ws);\n\tfor(var R = range.s.r; R <= range.e.r; ++R) {\n\t\tvar row = [write_ws_xlml_row(R, (ws['!rows']||[])[R])];\n\t\tfor(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\tvar skip = false;\n\t\t\tfor(mi = 0; mi != marr.length; ++mi) {\n\t\t\t\tif(marr[mi].s.c > C) continue;\n\t\t\t\tif(marr[mi].s.r > R) continue;\n\t\t\t\tif(marr[mi].e.c < C) continue;\n\t\t\t\tif(marr[mi].e.r < R) continue;\n\t\t\t\tif(marr[mi].s.c != C || marr[mi].s.r != R) skip = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(skip) continue;\n\t\t\tvar addr = {r:R,c:C};\n\t\t\tvar ref = encode_cell(addr), cell = dense ? (ws[R]||[])[C] : ws[ref];\n\t\t\trow.push(write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr));\n\t\t}\n\t\trow.push(\"\");\n\t\tif(row.length > 2) o.push(row.join(\"\"));\n\t}\n\treturn o.join(\"\");\n}\nfunction write_ws_xlml(idx, opts, wb) {\n\tvar o = [];\n\tvar s = wb.SheetNames[idx];\n\tvar ws = wb.Sheets[s];\n\n\tvar t = ws ? write_ws_xlml_names(ws, opts, idx, wb) : \"\";\n\tif(t.length > 0) o.push(\"\" + t + \"\");\n\n\t/* Table */\n\tt = ws ? write_ws_xlml_table(ws, opts, idx, wb) : \"\";\n\tif(t.length > 0) o.push(\"\" + t + \"
\");\n\n\t/* WorksheetOptions */\n\to.push(write_ws_xlml_wsopts(ws, opts, idx, wb));\n\n\treturn o.join(\"\");\n}\nfunction write_xlml(wb, opts) {\n\tif(!opts) opts = {};\n\tif(!wb.SSF) wb.SSF = SSF.get_table();\n\tif(wb.SSF) {\n\t\tmake_ssf(SSF); SSF.load_table(wb.SSF);\n\t\t// $FlowIgnore\n\t\topts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;\n\t\topts.ssf = wb.SSF;\n\t\topts.cellXfs = [];\n\t\tget_cell_style(opts.cellXfs, {}, {revssf:{\"General\":0}});\n\t}\n\tvar d = [];\n\td.push(write_props_xlml(wb, opts));\n\td.push(write_wb_xlml(wb, opts));\n\td.push(\"\");\n\td.push(\"\");\n\tfor(var i = 0; i < wb.SheetNames.length; ++i)\n\t\td.push(writextag(\"Worksheet\", write_ws_xlml(i, opts, wb), {\"ss:Name\":escapexml(wb.SheetNames[i])}));\n\td[2] = write_sty_xlml(wb, opts);\n\td[3] = write_names_xlml(wb, opts);\n\treturn XML_HEADER + writextag(\"Workbook\", d.join(\"\"), {\n\t\t'xmlns': XLMLNS.ss,\n\t\t'xmlns:o': XLMLNS.o,\n\t\t'xmlns:x': XLMLNS.x,\n\t\t'xmlns:ss': XLMLNS.ss,\n\t\t'xmlns:dt': XLMLNS.dt,\n\t\t'xmlns:html': XLMLNS.html\n\t});\n}\n/* [MS-OLEDS] 2.3.8 CompObjStream */\nfunction parse_compobj(obj) {\n\tvar v = {};\n\tvar o = obj.content;\n/* [MS-OLEDS] 2.3.7 CompObjHeader -- All fields MUST be ignored */\n\to.l = 28;\n\n\tv.AnsiUserType = o.read_shift(0, \"lpstr-ansi\");\n\tv.AnsiClipboardFormat = parse_ClipboardFormatOrAnsiString(o);\n\n\tif(o.length - o.l <= 4) return v;\n\n\tvar m = o.read_shift(4);\n\tif(m == 0 || m > 40) return v;\n\to.l-=4; v.Reserved1 = o.read_shift(0, \"lpstr-ansi\");\n\n\tif(o.length - o.l <= 4) return v;\n\tm = o.read_shift(4);\n\tif(m !== 0x71b239f4) return v;\n\tv.UnicodeClipboardFormat = parse_ClipboardFormatOrUnicodeString(o);\n\n\tm = o.read_shift(4);\n\tif(m == 0 || m > 40) return v;\n\to.l-=4; v.Reserved2 = o.read_shift(0, \"lpwstr\");\n}\n\n/*\n\tContinue logic for:\n\t- 2.4.58 Continue\n\t- 2.4.59 ContinueBigName\n\t- 2.4.60 ContinueFrt\n\t- 2.4.61 ContinueFrt11\n\t- 2.4.62 ContinueFrt12\n*/\nfunction slurp(R, blob, length, opts) {\n\tvar l = length;\n\tvar bufs = [];\n\tvar d = blob.slice(blob.l,blob.l+l);\n\tif(opts && opts.enc && opts.enc.insitu && d.length > 0) switch(R.n) {\n\tcase 'BOF': case 'FilePass': case 'FileLock': case 'InterfaceHdr': case 'RRDInfo': case 'RRDHead': case 'UsrExcl': case 'EOF':\n\t\tbreak;\n\tcase 'BoundSheet8':\n\t\tbreak;\n\tdefault:\n\t\topts.enc.insitu(d);\n\t}\n\tbufs.push(d);\n\tblob.l += l;\n\tvar next = (XLSRecordEnum[__readUInt16LE(blob,blob.l)]);\n\tvar start = 0;\n\twhile(next != null && next.n.slice(0,8) === 'Continue') {\n\t\tl = __readUInt16LE(blob,blob.l+2);\n\t\tstart = blob.l + 4;\n\t\tif(next.n == 'ContinueFrt') start += 4;\n\t\telse if(next.n.slice(0,11) == 'ContinueFrt') {\n\t\t\tstart += 12;\n\t\t}\n\t\td = blob.slice(start,blob.l+4+l);\n\t\tbufs.push(d);\n\t\tblob.l += 4+l;\n\t\tnext = (XLSRecordEnum[__readUInt16LE(blob, blob.l)]);\n\t}\n\tvar b = (bconcat(bufs));\n\tprep_blob(b, 0);\n\tvar ll = 0; b.lens = [];\n\tfor(var j = 0; j < bufs.length; ++j) { b.lens.push(ll); ll += bufs[j].length; }\n\tif(b.length < length) throw \"XLS Record \" + (R && R.n || \"??\") + \" Truncated: \" + b.length + \" < \" + length;\n\treturn R.f(b, b.length, opts);\n}\n\nfunction safe_format_xf(p, opts, date1904) {\n\tif(p.t === 'z') return;\n\tif(!p.XF) return;\n\tvar fmtid = 0;\n\ttry {\n\t\tfmtid = p.z || p.XF.numFmtId || 0;\n\t\tif(opts.cellNF) p.z = SSF._table[fmtid];\n\t} catch(e) { if(opts.WTF) throw e; }\n\tif(!opts || opts.cellText !== false) try {\n\t\tif(p.t === 'e') { p.w = p.w || BErr[p.v]; }\n\t\telse if(fmtid === 0 || fmtid == \"General\") {\n\t\t\tif(p.t === 'n') {\n\t\t\t\tif((p.v|0) === p.v) p.w = SSF._general_int(p.v);\n\t\t\t\telse p.w = SSF._general_num(p.v);\n\t\t\t}\n\t\t\telse p.w = SSF._general(p.v);\n\t\t}\n\t\telse p.w = SSF.format(fmtid,p.v, {date1904:!!date1904, dateNF: opts && opts.dateNF});\n\t} catch(e) { if(opts.WTF) throw e; }\n\tif(opts.cellDates && fmtid && p.t == 'n' && SSF.is_date(SSF._table[fmtid] || String(fmtid))) {\n\t\tvar _d = SSF.parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }\n\t}\n}\n\nfunction make_cell(val, ixfe, t) {\n\treturn ({v:val, ixfe:ixfe, t:t});\n}\n\n// 2.3.2\nfunction parse_workbook(blob, options) {\n\tvar wb = ({opts:{}});\n\tvar Sheets = {};\n\tif(DENSE != null && options.dense == null) options.dense = DENSE;\n\tvar out = ((options.dense ? [] : {}));\n\tvar Directory = {};\n\tvar range = ({});\n\tvar last_formula = null;\n\tvar sst = ([]);\n\tvar cur_sheet = \"\";\n\tvar Preamble = {};\n\tvar lastcell, last_cell = \"\", cc, cmnt, rngC, rngR;\n\tvar sharedf = {};\n\tvar arrayf = [];\n\tvar temp_val;\n\tvar country;\n\tvar XFs = []; /* XF records */\n\tvar palette = [];\n\tvar Workbook = ({ Sheets:[], WBProps:{date1904:false}, Views:[{}] }), wsprops = {};\n\tvar get_rgb = function getrgb(icv) {\n\t\tif(icv < 8) return XLSIcv[icv];\n\t\tif(icv < 64) return palette[icv-8] || XLSIcv[icv];\n\t\treturn XLSIcv[icv];\n\t};\n\tvar process_cell_style = function pcs(cell, line, options) {\n\t\tvar xfd = line.XF.data;\n\t\tif(!xfd || !xfd.patternType || !options || !options.cellStyles) return;\n\t\tline.s = ({});\n\t\tline.s.patternType = xfd.patternType;\n\t\tvar t;\n\t\tif((t = rgb2Hex(get_rgb(xfd.icvFore)))) { line.s.fgColor = {rgb:t}; }\n\t\tif((t = rgb2Hex(get_rgb(xfd.icvBack)))) { line.s.bgColor = {rgb:t}; }\n\t};\n\tvar addcell = function addcell(cell, line, options) {\n\t\tif(file_depth > 1) return;\n\t\tif(options.sheetRows && cell.r >= options.sheetRows) return;\n\t\tif(options.cellStyles && line.XF && line.XF.data) process_cell_style(cell, line, options);\n\t\tdelete line.ixfe; delete line.XF;\n\t\tlastcell = cell;\n\t\tlast_cell = encode_cell(cell);\n\t\tif(!range || !range.s || !range.e) range = {s:{r:0,c:0},e:{r:0,c:0}};\n\t\tif(cell.r < range.s.r) range.s.r = cell.r;\n\t\tif(cell.c < range.s.c) range.s.c = cell.c;\n\t\tif(cell.r + 1 > range.e.r) range.e.r = cell.r + 1;\n\t\tif(cell.c + 1 > range.e.c) range.e.c = cell.c + 1;\n\t\tif(options.cellFormula && line.f) {\n\t\t\tfor(var afi = 0; afi < arrayf.length; ++afi) {\n\t\t\t\tif(arrayf[afi][0].s.c > cell.c || arrayf[afi][0].s.r > cell.r) continue;\n\t\t\t\tif(arrayf[afi][0].e.c < cell.c || arrayf[afi][0].e.r < cell.r) continue;\n\t\t\t\tline.F = encode_range(arrayf[afi][0]);\n\t\t\t\tif(arrayf[afi][0].s.c != cell.c || arrayf[afi][0].s.r != cell.r) delete line.f;\n\t\t\t\tif(line.f) line.f = \"\" + stringify_formula(arrayf[afi][1], range, cell, supbooks, opts);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t{\n\t\t\tif(options.dense) {\n\t\t\t\tif(!out[cell.r]) out[cell.r] = [];\n\t\t\t\tout[cell.r][cell.c] = line;\n\t\t\t} else out[last_cell] = line;\n\t\t}\n\t};\n\tvar opts = ({\n\t\tenc: false, // encrypted\n\t\tsbcch: 0, // cch in the preceding SupBook\n\t\tsnames: [], // sheetnames\n\t\tsharedf: sharedf, // shared formulae by address\n\t\tarrayf: arrayf, // array formulae array\n\t\trrtabid: [], // RRTabId\n\t\tlastuser: \"\", // Last User from WriteAccess\n\t\tbiff: 8, // BIFF version\n\t\tcodepage: 0, // CP from CodePage record\n\t\twinlocked: 0, // fLockWn from WinProtect\n\t\tcellStyles: !!options && !!options.cellStyles,\n\t\tWTF: !!options && !!options.wtf\n\t});\n\tif(options.password) opts.password = options.password;\n\tvar themes;\n\tvar merges = [];\n\tvar objects = [];\n\tvar colinfo = [], rowinfo = [];\n\t// eslint-disable-next-line no-unused-vars\n\tvar defwidth = 0, defheight = 0; // twips / MDW respectively\n\tvar seencol = false;\n\tvar supbooks = ([]); // 1-indexed, will hold extern names\n\tsupbooks.SheetNames = opts.snames;\n\tsupbooks.sharedf = opts.sharedf;\n\tsupbooks.arrayf = opts.arrayf;\n\tsupbooks.names = [];\n\tsupbooks.XTI = [];\n\tvar last_Rn = '';\n\tvar file_depth = 0; /* TODO: make a real stack */\n\tvar BIFF2Fmt = 0, BIFF2FmtTable = [];\n\tvar FilterDatabases = []; /* TODO: sort out supbooks and process elsewhere */\n\tvar last_lbl;\n\n\t/* explicit override for some broken writers */\n\topts.codepage = 1200;\n\tset_cp(1200);\n\tvar seen_codepage = false;\n\twhile(blob.l < blob.length - 1) {\n\t\tvar s = blob.l;\n\t\tvar RecordType = blob.read_shift(2);\n\t\tif(RecordType === 0 && last_Rn === 'EOF') break;\n\t\tvar length = (blob.l === blob.length ? 0 : blob.read_shift(2));\n\t\tvar R = XLSRecordEnum[RecordType];\n\t\t//console.log(RecordType.toString(16), RecordType, R, blob.l, length, blob.length);\n\t\t//if(!R) console.log(blob.slice(blob.l, blob.l + length));\n\t\tif(R && R.f) {\n\t\t\tif(options.bookSheets) {\n\t\t\t\tif(last_Rn === 'BoundSheet8' && R.n !== 'BoundSheet8') break;\n\t\t\t}\n\t\t\tlast_Rn = R.n;\n\t\t\tif(R.r === 2 || R.r == 12) {\n\t\t\t\tvar rt = blob.read_shift(2); length -= 2;\n\t\t\t\tif(!opts.enc && rt !== RecordType && (((rt&0xFF)<<8)|(rt>>8)) !== RecordType) throw new Error(\"rt mismatch: \" + rt + \"!=\" + RecordType);\n\t\t\t\tif(R.r == 12){\n\t\t\t\t\tblob.l += 10; length -= 10;\n\t\t\t\t} // skip FRT\n\t\t\t}\n\t\t\t//console.error(R,blob.l,length,blob.length);\n\t\t\tvar val = ({});\n\t\t\tif(R.n === 'EOF') val = R.f(blob, length, opts);\n\t\t\telse val = slurp(R, blob, length, opts);\n\t\t\tvar Rn = R.n;\nif(file_depth == 0 && Rn != 'BOF') continue;\n\t\t\t/* nested switch statements to workaround V8 128 limit */\n\t\t\tswitch(Rn) {\n\t\t\t\t/* Workbook Options */\n\t\t\t\tcase 'Date1904':\nwb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;\n\t\t\t\tcase 'WriteProtect': wb.opts.WriteProtect = true; break;\n\t\t\t\tcase 'FilePass':\n\t\t\t\t\tif(!opts.enc) blob.l = 0;\n\t\t\t\t\topts.enc = val;\n\t\t\t\t\tif(!options.password) throw new Error(\"File is password-protected\");\n\t\t\t\t\tif(val.valid == null) throw new Error(\"Encryption scheme unsupported\");\n\t\t\t\t\tif(!val.valid) throw new Error(\"Password is incorrect\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'WriteAccess': opts.lastuser = val; break;\n\t\t\t\tcase 'FileSharing': break; //TODO\n\t\t\t\tcase 'CodePage':\n\t\t\t\t\tvar cpval = Number(val);\n\t\t\t\t\t/* overrides based on test cases */\n\t\t\t\t\tswitch(cpval) {\n\t\t\t\t\t\tcase 0x5212: cpval = 1200; break;\n\t\t\t\t\t\tcase 0x8000: cpval = 10000; break;\n\t\t\t\t\t\tcase 0x8001: cpval = 1252; break;\n\t\t\t\t\t}\n\t\t\t\t\tset_cp(opts.codepage = cpval);\n\t\t\t\t\tseen_codepage = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'RRTabId': opts.rrtabid = val; break;\n\t\t\t\tcase 'WinProtect': opts.winlocked = val; break;\n\t\t\t\tcase 'Template': break; // TODO\n\t\t\t\tcase 'BookBool': break; // TODO\n\t\t\t\tcase 'UsesELFs': break;\n\t\t\t\tcase 'MTRSettings': break;\n\t\t\t\tcase 'RefreshAll':\n\t\t\t\tcase 'CalcCount':\n\t\t\t\tcase 'CalcDelta':\n\t\t\t\tcase 'CalcIter':\n\t\t\t\tcase 'CalcMode':\n\t\t\t\tcase 'CalcPrecision':\n\t\t\t\tcase 'CalcSaveRecalc':\n\t\t\t\t\twb.opts[Rn] = val; break;\n\t\t\t\tcase 'CalcRefMode': opts.CalcRefMode = val; break; // TODO: implement R1C1\n\t\t\t\tcase 'Uncalced': break;\n\t\t\t\tcase 'ForceFullCalculation': wb.opts.FullCalc = val; break;\n\t\t\t\tcase 'WsBool':\n\t\t\t\t\tif(val.fDialog) out[\"!type\"] = \"dialog\";\n\t\t\t\t\tif(!val.fBelow) (out[\"!outline\"] || (out[\"!outline\"] = {})).above = true;\n\t\t\t\t\tif(!val.fRight) (out[\"!outline\"] || (out[\"!outline\"] = {})).left = true;\n\t\t\t\t\tbreak; // TODO\n\t\t\t\tcase 'XF':\n\t\t\t\t\tXFs.push(val); break;\n\t\t\t\tcase 'ExtSST': break; // TODO\n\t\t\t\tcase 'BookExt': break; // TODO\n\t\t\t\tcase 'RichTextStream': break;\n\t\t\t\tcase 'BkHim': break;\n\n\t\t\t\tcase 'SupBook':\n\t\t\t\t\tsupbooks.push([val]);\n\t\t\t\t\tsupbooks[supbooks.length-1].XTI = [];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'ExternName':\n\t\t\t\t\tsupbooks[supbooks.length-1].push(val);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Index': break; // TODO\n\t\t\t\tcase 'Lbl':\n\t\t\t\t\tlast_lbl = ({\n\t\t\t\t\t\tName: val.Name,\n\t\t\t\t\t\tRef: stringify_formula(val.rgce,range,null,supbooks,opts)\n\t\t\t\t\t});\n\t\t\t\t\tif(val.itab > 0) last_lbl.Sheet = val.itab - 1;\n\t\t\t\t\tsupbooks.names.push(last_lbl);\n\t\t\t\t\tif(!supbooks[0]) { supbooks[0] = []; supbooks[0].XTI = []; }\n\t\t\t\t\tsupbooks[supbooks.length-1].push(val);\n\t\t\t\t\tif(val.Name == \"_xlnm._FilterDatabase\" && val.itab > 0)\n\t\t\t\t\t\tif(val.rgce && val.rgce[0] && val.rgce[0][0] && val.rgce[0][0][0] == 'PtgArea3d')\n\t\t\t\t\t\t\tFilterDatabases[val.itab - 1] = { ref: encode_range(val.rgce[0][0][1][2]) };\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'ExternCount': opts.ExternCount = val; break;\n\t\t\t\tcase 'ExternSheet':\n\t\t\t\t\tif(supbooks.length == 0) { supbooks[0] = []; supbooks[0].XTI = []; }\n\t\t\t\t\tsupbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val); supbooks.XTI = supbooks.XTI.concat(val); break;\n\t\t\t\tcase 'NameCmt':\n\t\t\t\t\t/* TODO: search for correct name */\n\t\t\t\t\tif(opts.biff < 8) break;\n\t\t\t\t\tif(last_lbl != null) last_lbl.Comment = val[1];\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Protect': out[\"!protect\"] = val; break; /* for sheet or book */\n\t\t\t\tcase 'Password': if(val !== 0 && opts.WTF) console.error(\"Password verifier: \" + val); break;\n\t\t\t\tcase 'Prot4Rev': case 'Prot4RevPass': break; /*TODO: Revision Control*/\n\n\t\t\t\tcase 'BoundSheet8': {\n\t\t\t\t\tDirectory[val.pos] = val;\n\t\t\t\t\topts.snames.push(val.name);\n\t\t\t\t} break;\n\t\t\t\tcase 'EOF': {\n\t\t\t\t\tif(--file_depth) break;\n\t\t\t\t\tif(range.e) {\n\t\t\t\t\t\tif(range.e.r > 0 && range.e.c > 0) {\n\t\t\t\t\t\t\trange.e.r--; range.e.c--;\n\t\t\t\t\t\t\tout[\"!ref\"] = encode_range(range);\n\t\t\t\t\t\t\tif(options.sheetRows && options.sheetRows <= range.e.r) {\n\t\t\t\t\t\t\t\tvar tmpri = range.e.r;\n\t\t\t\t\t\t\t\trange.e.r = options.sheetRows - 1;\n\t\t\t\t\t\t\t\tout[\"!fullref\"] = out[\"!ref\"];\n\t\t\t\t\t\t\t\tout[\"!ref\"] = encode_range(range);\n\t\t\t\t\t\t\t\trange.e.r = tmpri;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\trange.e.r++; range.e.c++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(merges.length > 0) out[\"!merges\"] = merges;\n\t\t\t\t\t\tif(objects.length > 0) out[\"!objects\"] = objects;\n\t\t\t\t\t\tif(colinfo.length > 0) out[\"!cols\"] = colinfo;\n\t\t\t\t\t\tif(rowinfo.length > 0) out[\"!rows\"] = rowinfo;\n\t\t\t\t\t\tWorkbook.Sheets.push(wsprops);\n\t\t\t\t\t}\n\t\t\t\t\tif(cur_sheet === \"\") Preamble = out; else Sheets[cur_sheet] = out;\n\t\t\t\t\tout = ((options.dense ? [] : {}));\n\t\t\t\t} break;\n\t\t\t\tcase 'BOF': {\n\t\t\t\t\tif(opts.biff === 8) opts.biff = {\n0x0009:2,\n0x0209:3,\n0x0409:4\n\t\t\t\t\t}[RecordType] || {\n0x0200:2,\n0x0300:3,\n0x0400:4,\n0x0500:5,\n0x0600:8,\n0x0002:2,\n0x0007:2\n\t\t\t\t\t}[val.BIFFVer] || 8;\n\t\t\t\t\topts.biffguess = val.BIFFVer == 0;\n\t\t\t\t\tif(val.BIFFVer == 0 && val.dt == 0x1000) { opts.biff = 5; seen_codepage = true; set_cp(opts.codepage = 28591); }\n\t\t\t\t\tif(opts.biff == 8 && val.BIFFVer == 0 && val.dt == 16) opts.biff = 2;\n\t\t\t\t\tif(file_depth++) break;\n\t\t\t\t\tout = ((options.dense ? [] : {}));\n\n\t\t\t\t\tif(opts.biff < 8 && !seen_codepage) { seen_codepage = true; set_cp(opts.codepage = options.codepage || 1252); }\n\n\t\t\t\t\tif(opts.biff < 5 || val.BIFFVer == 0 && val.dt == 0x1000) {\n\t\t\t\t\t\tif(cur_sheet === \"\") cur_sheet = \"Sheet1\";\n\t\t\t\t\t\trange = {s:{r:0,c:0},e:{r:0,c:0}};\n\t\t\t\t\t\t/* fake BoundSheet8 */\n\t\t\t\t\t\tvar fakebs8 = {pos: blob.l - length, name:cur_sheet};\n\t\t\t\t\t\tDirectory[fakebs8.pos] = fakebs8;\n\t\t\t\t\t\topts.snames.push(cur_sheet);\n\t\t\t\t\t}\n\t\t\t\t\telse cur_sheet = (Directory[s] || {name:\"\"}).name;\n\t\t\t\t\tif(val.dt == 0x20) out[\"!type\"] = \"chart\";\n\t\t\t\t\tif(val.dt == 0x40) out[\"!type\"] = \"macro\";\n\t\t\t\t\tmerges = [];\n\t\t\t\t\tobjects = [];\n\t\t\t\t\topts.arrayf = arrayf = [];\n\t\t\t\t\tcolinfo = []; rowinfo = [];\n\t\t\t\t\tdefwidth = defheight = 0;\n\t\t\t\t\tseencol = false;\n\t\t\t\t\twsprops = {Hidden:(Directory[s]||{hs:0}).hs, name:cur_sheet };\n\t\t\t\t} break;\n\n\t\t\t\tcase 'Number': case 'BIFF2NUM': case 'BIFF2INT': {\n\t\t\t\t\tif(out[\"!type\"] == \"chart\") if(options.dense ? (out[val.r]||[])[val.c]: out[encode_cell({c:val.c, r:val.r})]) ++val.c;\n\t\t\t\t\ttemp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe]||{}, v:val.val, t:'n'});\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t} break;\n\t\t\t\tcase 'BoolErr': {\n\t\t\t\t\ttemp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.val, t:val.t});\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t} break;\n\t\t\t\tcase 'RK': {\n\t\t\t\t\ttemp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.rknum, t:'n'});\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t} break;\n\t\t\t\tcase 'MulRk': {\n\t\t\t\t\tfor(var j = val.c; j <= val.C; ++j) {\n\t\t\t\t\t\tvar ixfe = val.rkrec[j-val.c][0];\n\t\t\t\t\t\ttemp_val= ({ixfe:ixfe, XF:XFs[ixfe], v:val.rkrec[j-val.c][1], t:'n'});\n\t\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\t\taddcell({c:j, r:val.r}, temp_val, options);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 'Formula': {\n\t\t\t\t\tif(val.val == 'String') { last_formula = val; break; }\n\t\t\t\t\ttemp_val = make_cell(val.val, val.cell.ixfe, val.tt);\n\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\tif(options.cellFormula) {\n\t\t\t\t\t\tvar _f = val.formula;\n\t\t\t\t\t\tif(_f && _f[0] && _f[0][0] && _f[0][0][0] == 'PtgExp') {\n\t\t\t\t\t\t\tvar _fr = _f[0][0][1][0], _fc = _f[0][0][1][1];\n\t\t\t\t\t\t\tvar _fe = encode_cell({r:_fr, c:_fc});\n\t\t\t\t\t\t\tif(sharedf[_fe]) temp_val.f = \"\"+stringify_formula(val.formula,range,val.cell,supbooks, opts);\n\t\t\t\t\t\t\telse temp_val.F = ((options.dense ? (out[_fr]||[])[_fc]: out[_fe]) || {}).F;\n\t\t\t\t\t\t} else temp_val.f = \"\"+stringify_formula(val.formula,range,val.cell,supbooks, opts);\n\t\t\t\t\t}\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell(val.cell, temp_val, options);\n\t\t\t\t\tlast_formula = val;\n\t\t\t\t} break;\n\t\t\t\tcase 'String': {\n\t\t\t\t\tif(last_formula) { /* technically always true */\n\t\t\t\t\t\tlast_formula.val = val;\n\t\t\t\t\t\ttemp_val = make_cell(val, last_formula.cell.ixfe, 's');\n\t\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\t\tif(options.cellFormula) {\n\t\t\t\t\t\t\ttemp_val.f = \"\"+stringify_formula(last_formula.formula, range, last_formula.cell, supbooks, opts);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\t\taddcell(last_formula.cell, temp_val, options);\n\t\t\t\t\t\tlast_formula = null;\n\t\t\t\t\t} else throw new Error(\"String record expects Formula\");\n\t\t\t\t} break;\n\t\t\t\tcase 'Array': {\n\t\t\t\t\tarrayf.push(val);\n\t\t\t\t\tvar _arraystart = encode_cell(val[0].s);\n\t\t\t\t\tcc = options.dense ? (out[val[0].s.r]||[])[val[0].s.c] : out[_arraystart];\n\t\t\t\t\tif(options.cellFormula && cc) {\n\t\t\t\t\t\tif(!last_formula) break; /* technically unreachable */\n\t\t\t\t\t\tif(!_arraystart || !cc) break;\n\t\t\t\t\t\tcc.f = \"\"+stringify_formula(val[1], range, val[0], supbooks, opts);\n\t\t\t\t\t\tcc.F = encode_range(val[0]);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 'ShrFmla': {\n\t\t\t\t\tif(!options.cellFormula) break;\n\t\t\t\t\tif(last_cell) {\n\t\t\t\t\t\t/* TODO: capture range */\n\t\t\t\t\t\tif(!last_formula) break; /* technically unreachable */\n\t\t\t\t\t\tsharedf[encode_cell(last_formula.cell)]= val[0];\n\t\t\t\t\t\tcc = options.dense ? (out[last_formula.cell.r]||[])[last_formula.cell.c] : out[encode_cell(last_formula.cell)];\n\t\t\t\t\t\t(cc||{}).f = \"\"+stringify_formula(val[0], range, lastcell, supbooks, opts);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 'LabelSst':\n\t\t\t\t\ttemp_val=make_cell(sst[val.isst].t, val.ixfe, 's');\n\t\t\t\t\tif(sst[val.isst].h) temp_val.h = sst[val.isst].h;\n\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Blank': if(options.sheetStubs) {\n\t\t\t\t\ttemp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe], t:'z'});\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t} break;\n\t\t\t\tcase 'MulBlank': if(options.sheetStubs) {\n\t\t\t\t\tfor(var _j = val.c; _j <= val.C; ++_j) {\n\t\t\t\t\t\tvar _ixfe = val.ixfe[_j-val.c];\n\t\t\t\t\t\ttemp_val= ({ixfe:_ixfe, XF:XFs[_ixfe], t:'z'});\n\t\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\t\taddcell({c:_j, r:val.r}, temp_val, options);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 'RString':\n\t\t\t\tcase 'Label': case 'BIFF2STR':\n\t\t\t\t\ttemp_val=make_cell(val.val, val.ixfe, 's');\n\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Dimensions': {\n\t\t\t\t\tif(file_depth === 1) range = val; /* TODO: stack */\n\t\t\t\t} break;\n\t\t\t\tcase 'SST': {\n\t\t\t\t\tsst = val;\n\t\t\t\t} break;\n\t\t\t\tcase 'Format': { /* val = [id, fmt] */\n\t\t\t\t\tif(opts.biff == 4) {\n\t\t\t\t\t\tBIFF2FmtTable[BIFF2Fmt++] = val[1];\n\t\t\t\t\t\tfor(var b4idx = 0; b4idx < BIFF2Fmt + 163; ++b4idx) if(SSF._table[b4idx] == val[1]) break;\n\t\t\t\t\t\tif(b4idx >= 163) SSF.load(val[1], BIFF2Fmt + 163);\n\t\t\t\t\t}\n\t\t\t\t\telse SSF.load(val[1], val[0]);\n\t\t\t\t} break;\n\t\t\t\tcase 'BIFF2FORMAT': {\n\t\t\t\t\tBIFF2FmtTable[BIFF2Fmt++] = val;\n\t\t\t\t\tfor(var b2idx = 0; b2idx < BIFF2Fmt + 163; ++b2idx) if(SSF._table[b2idx] == val) break;\n\t\t\t\t\tif(b2idx >= 163) SSF.load(val, BIFF2Fmt + 163);\n\t\t\t\t} break;\n\n\t\t\t\tcase 'MergeCells': merges = merges.concat(val); break;\n\n\t\t\t\tcase 'Obj': objects[val.cmo[0]] = opts.lastobj = val; break;\n\t\t\t\tcase 'TxO': opts.lastobj.TxO = val; break;\n\t\t\t\tcase 'ImData': opts.lastobj.ImData = val; break;\n\n\t\t\t\tcase 'HLink': {\n\t\t\t\t\tfor(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR)\n\t\t\t\t\t\tfor(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC) {\n\t\t\t\t\t\t\tcc = options.dense ? (out[rngR]||[])[rngC] : out[encode_cell({c:rngC,r:rngR})];\n\t\t\t\t\t\t\tif(cc) cc.l = val[1];\n\t\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 'HLinkTooltip': {\n\t\t\t\t\tfor(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR)\n\t\t\t\t\t\tfor(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC) {\n\t\t\t\t\t\t\tcc = options.dense ? (out[rngR]||[])[rngC] : out[encode_cell({c:rngC,r:rngR})];\n\t\t\t\t\t\t\tif(cc && cc.l) cc.l.Tooltip = val[1];\n\t\t\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t\t/* Comments */\n\t\t\t\tcase 'Note': {\n\t\t\t\t\tif(opts.biff <= 5 && opts.biff >= 2) break; /* TODO: BIFF5 */\n\t\t\t\t\tcc = options.dense ? (out[val[0].r]||[])[val[0].c] : out[encode_cell(val[0])];\n\t\t\t\t\tvar noteobj = objects[val[2]];\n\t\t\t\t\tif(!cc) {\n\t\t\t\t\t\tif(options.dense) {\n\t\t\t\t\t\t\tif(!out[val[0].r]) out[val[0].r] = [];\n\t\t\t\t\t\t\tcc = out[val[0].r][val[0].c] = ({t:\"z\"});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcc = out[encode_cell(val[0])] = ({t:\"z\"});\n\t\t\t\t\t\t}\n\t\t\t\t\t\trange.e.r = Math.max(range.e.r, val[0].r);\n\t\t\t\t\t\trange.s.r = Math.min(range.s.r, val[0].r);\n\t\t\t\t\t\trange.e.c = Math.max(range.e.c, val[0].c);\n\t\t\t\t\t\trange.s.c = Math.min(range.s.c, val[0].c);\n\t\t\t\t\t}\n\t\t\t\t\tif(!cc.c) cc.c = [];\n\t\t\t\t\tcmnt = {a:val[1],t:noteobj.TxO.t};\n\t\t\t\t\tcc.c.push(cmnt);\n\t\t\t\t} break;\n\n\t\t\t\tdefault: switch(R.n) { /* nested */\n\t\t\t\tcase 'ClrtClient': break;\n\t\t\t\tcase 'XFExt': update_xfext(XFs[val.ixfe], val.ext); break;\n\n\t\t\t\tcase 'DefColWidth': defwidth = val; break;\n\t\t\t\tcase 'DefaultRowHeight': defheight = val[1]; break; // TODO: flags\n\n\t\t\t\tcase 'ColInfo': {\n\t\t\t\t\tif(!opts.cellStyles) break;\n\t\t\t\t\twhile(val.e >= val.s) {\n\t\t\t\t\t\tcolinfo[val.e--] = { width: val.w/256, level: (val.level || 0), hidden: !!(val.flags & 1) };\n\t\t\t\t\t\tif(!seencol) { seencol = true; find_mdw_colw(val.w/256); }\n\t\t\t\t\t\tprocess_col(colinfo[val.e+1]);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 'Row': {\n\t\t\t\t\tvar rowobj = {};\n\t\t\t\t\tif(val.level != null) { rowinfo[val.r] = rowobj; rowobj.level = val.level; }\n\t\t\t\t\tif(val.hidden) { rowinfo[val.r] = rowobj; rowobj.hidden = true; }\n\t\t\t\t\tif(val.hpt) {\n\t\t\t\t\t\trowinfo[val.r] = rowobj;\n\t\t\t\t\t\trowobj.hpt = val.hpt; rowobj.hpx = pt2px(val.hpt);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t\tcase 'LeftMargin':\n\t\t\t\tcase 'RightMargin':\n\t\t\t\tcase 'TopMargin':\n\t\t\t\tcase 'BottomMargin':\n\t\t\t\t\tif(!out['!margins']) default_margins(out['!margins'] = {});\n\t\t\t\t\tout['!margins'][Rn.slice(0,-6).toLowerCase()] = val;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Selection': break;\n\n\t\t\t\tcase 'Setup': // TODO\n\t\t\t\t\tif(!out['!margins']) default_margins(out['!margins'] = {});\n\t\t\t\t\tout['!margins'].header = val.header;\n\t\t\t\t\tout['!margins'].footer = val.footer;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Window2': // TODO\n\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\tif(val.RTL) Workbook.Views[0].RTL = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Header': break; // TODO\n\t\t\t\tcase 'Footer': break; // TODO\n\t\t\t\tcase 'HCenter': break; // TODO\n\t\t\t\tcase 'VCenter': break; // TODO\n\t\t\t\tcase 'Pls': break; // TODO\n\t\t\t\tcase 'GCW': break;\n\t\t\t\tcase 'LHRecord': break;\n\t\t\t\tcase 'DBCell': break; // TODO\n\t\t\t\tcase 'EntExU2': break; // TODO\n\t\t\t\tcase 'SxView': break; // TODO\n\t\t\t\tcase 'Sxvd': break; // TODO\n\t\t\t\tcase 'SXVI': break; // TODO\n\t\t\t\tcase 'SXVDEx': break; // TODO\n\t\t\t\tcase 'SxIvd': break; // TODO\n\t\t\t\tcase 'SXString': break; // TODO\n\t\t\t\tcase 'Sync': break;\n\t\t\t\tcase 'Addin': break;\n\t\t\t\tcase 'SXDI': break; // TODO\n\t\t\t\tcase 'SXLI': break; // TODO\n\t\t\t\tcase 'SXEx': break; // TODO\n\t\t\t\tcase 'QsiSXTag': break; // TODO\n\t\t\t\tcase 'Feat': break;\n\t\t\t\tcase 'FeatHdr': case 'FeatHdr11': break;\n\t\t\t\tcase 'Feature11': case 'Feature12': case 'List12': break;\n\t\t\t\tcase 'Country': country = val; break;\n\t\t\t\tcase 'RecalcId': break;\n\t\t\t\tcase 'DxGCol': break; // TODO: htmlify\n\t\t\t\tcase 'Fbi': case 'Fbi2': case 'GelFrame': break;\n\t\t\t\tcase 'Font': break; // TODO\n\t\t\t\tcase 'XFCRC': break; // TODO\n\t\t\t\tcase 'Style': break; // TODO\n\t\t\t\tcase 'StyleExt': break; // TODO\n\t\t\t\tcase 'Palette': palette = val; break;\n\t\t\t\tcase 'Theme': themes = val; break;\n\t\t\t\t/* Protection */\n\t\t\t\tcase 'ScenarioProtect': break;\n\t\t\t\tcase 'ObjProtect': break;\n\n\t\t\t\t/* Conditional Formatting */\n\t\t\t\tcase 'CondFmt12': break;\n\n\t\t\t\t/* Table */\n\t\t\t\tcase 'Table': break; // TODO\n\t\t\t\tcase 'TableStyles': break; // TODO\n\t\t\t\tcase 'TableStyle': break; // TODO\n\t\t\t\tcase 'TableStyleElement': break; // TODO\n\n\t\t\t\t/* PivotTable */\n\t\t\t\tcase 'SXStreamID': break; // TODO\n\t\t\t\tcase 'SXVS': break; // TODO\n\t\t\t\tcase 'DConRef': break; // TODO\n\t\t\t\tcase 'SXAddl': break; // TODO\n\t\t\t\tcase 'DConBin': break; // TODO\n\t\t\t\tcase 'DConName': break; // TODO\n\t\t\t\tcase 'SXPI': break; // TODO\n\t\t\t\tcase 'SxFormat': break; // TODO\n\t\t\t\tcase 'SxSelect': break; // TODO\n\t\t\t\tcase 'SxRule': break; // TODO\n\t\t\t\tcase 'SxFilt': break; // TODO\n\t\t\t\tcase 'SxItm': break; // TODO\n\t\t\t\tcase 'SxDXF': break; // TODO\n\n\t\t\t\t/* Scenario Manager */\n\t\t\t\tcase 'ScenMan': break;\n\n\t\t\t\t/* Data Consolidation */\n\t\t\t\tcase 'DCon': break;\n\n\t\t\t\t/* Watched Cell */\n\t\t\t\tcase 'CellWatch': break;\n\n\t\t\t\t/* Print Settings */\n\t\t\t\tcase 'PrintRowCol': break;\n\t\t\t\tcase 'PrintGrid': break;\n\t\t\t\tcase 'PrintSize': break;\n\n\t\t\t\tcase 'XCT': break;\n\t\t\t\tcase 'CRN': break;\n\n\t\t\t\tcase 'Scl': {\n\t\t\t\t\t//console.log(\"Zoom Level:\", val[0]/val[1],val);\n\t\t\t\t} break;\n\t\t\t\tcase 'SheetExt': {\n\t\t\t\t\t/* empty */\n\t\t\t\t} break;\n\t\t\t\tcase 'SheetExtOptional': {\n\t\t\t\t\t/* empty */\n\t\t\t\t} break;\n\n\t\t\t\t/* VBA */\n\t\t\t\tcase 'ObNoMacros': {\n\t\t\t\t\t/* empty */\n\t\t\t\t} break;\n\t\t\t\tcase 'ObProj': {\n\t\t\t\t\t/* empty */\n\t\t\t\t} break;\n\t\t\t\tcase 'CodeName': {\nif(!cur_sheet) Workbook.WBProps.CodeName = val || \"ThisWorkbook\";\n\t\t\t\t\telse wsprops.CodeName = val || wsprops.name;\n\t\t\t\t} break;\n\t\t\t\tcase 'GUIDTypeLib': {\n\t\t\t\t\t/* empty */\n\t\t\t\t} break;\n\n\t\t\t\tcase 'WOpt': break; // TODO: WTF?\n\t\t\t\tcase 'PhoneticInfo': break;\n\n\t\t\t\tcase 'OleObjectSize': break;\n\n\t\t\t\t/* Differential Formatting */\n\t\t\t\tcase 'DXF': case 'DXFN': case 'DXFN12': case 'DXFN12List': case 'DXFN12NoCB': break;\n\n\t\t\t\t/* Data Validation */\n\t\t\t\tcase 'Dv': case 'DVal': break;\n\n\t\t\t\t/* Data Series */\n\t\t\t\tcase 'BRAI': case 'Series': case 'SeriesText': break;\n\n\t\t\t\t/* Data Connection */\n\t\t\t\tcase 'DConn': break;\n\t\t\t\tcase 'DbOrParamQry': break;\n\t\t\t\tcase 'DBQueryExt': break;\n\n\t\t\t\tcase 'OleDbConn': break;\n\t\t\t\tcase 'ExtString': break;\n\n\t\t\t\t/* Formatting */\n\t\t\t\tcase 'IFmtRecord': break;\n\t\t\t\tcase 'CondFmt': case 'CF': case 'CF12': case 'CFEx': break;\n\n\t\t\t\t/* Explicitly Ignored */\n\t\t\t\tcase 'Excel9File': break;\n\t\t\t\tcase 'Units': break;\n\t\t\t\tcase 'InterfaceHdr': case 'Mms': case 'InterfaceEnd': case 'DSF': break;\n\t\t\t\tcase 'BuiltInFnGroupCount': /* 2.4.30 0x0E or 0x10 but excel 2011 generates 0x11? */ break;\n\t\t\t\t/* View Stuff */\n\t\t\t\tcase 'Window1': case 'HideObj': case 'GridSet': case 'Guts':\n\t\t\t\tcase 'UserBView': case 'UserSViewBegin': case 'UserSViewEnd': break;\n\t\t\t\tcase 'Pane': break;\n\t\t\t\tdefault: switch(R.n) { /* nested */\n\t\t\t\t/* Chart */\n\t\t\t\tcase 'Dat':\n\t\t\t\tcase 'Begin': case 'End':\n\t\t\t\tcase 'StartBlock': case 'EndBlock':\n\t\t\t\tcase 'Frame': case 'Area':\n\t\t\t\tcase 'Axis': case 'AxisLine': case 'Tick': break;\n\t\t\t\tcase 'AxesUsed':\n\t\t\t\tcase 'CrtLayout12': case 'CrtLayout12A': case 'CrtLink': case 'CrtLine': case 'CrtMlFrt': case 'CrtMlFrtContinue': break;\n\t\t\t\tcase 'LineFormat': case 'AreaFormat':\n\t\t\t\tcase 'Chart': case 'Chart3d': case 'Chart3DBarShape': case 'ChartFormat': case 'ChartFrtInfo': break;\n\t\t\t\tcase 'PlotArea': case 'PlotGrowth': break;\n\t\t\t\tcase 'SeriesList': case 'SerParent': case 'SerAuxTrend': break;\n\t\t\t\tcase 'DataFormat': case 'SerToCrt': case 'FontX': break;\n\t\t\t\tcase 'CatSerRange': case 'AxcExt': case 'SerFmt': break;\n\t\t\t\tcase 'ShtProps': break;\n\t\t\t\tcase 'DefaultText': case 'Text': case 'CatLab': break;\n\t\t\t\tcase 'DataLabExtContents': break;\n\t\t\t\tcase 'Legend': case 'LegendException': break;\n\t\t\t\tcase 'Pie': case 'Scatter': break;\n\t\t\t\tcase 'PieFormat': case 'MarkerFormat': break;\n\t\t\t\tcase 'StartObject': case 'EndObject': break;\n\t\t\t\tcase 'AlRuns': case 'ObjectLink': break;\n\t\t\t\tcase 'SIIndex': break;\n\t\t\t\tcase 'AttachedLabel': case 'YMult': break;\n\n\t\t\t\t/* Chart Group */\n\t\t\t\tcase 'Line': case 'Bar': break;\n\t\t\t\tcase 'Surf': break;\n\n\t\t\t\t/* Axis Group */\n\t\t\t\tcase 'AxisParent': break;\n\t\t\t\tcase 'Pos': break;\n\t\t\t\tcase 'ValueRange': break;\n\n\t\t\t\t/* Pivot Chart */\n\t\t\t\tcase 'SXViewEx9': break; // TODO\n\t\t\t\tcase 'SXViewLink': break;\n\t\t\t\tcase 'PivotChartBits': break;\n\t\t\t\tcase 'SBaseRef': break;\n\t\t\t\tcase 'TextPropsStream': break;\n\n\t\t\t\t/* Chart Misc */\n\t\t\t\tcase 'LnExt': break;\n\t\t\t\tcase 'MkrExt': break;\n\t\t\t\tcase 'CrtCoopt': break;\n\n\t\t\t\t/* Query Table */\n\t\t\t\tcase 'Qsi': case 'Qsif': case 'Qsir': case 'QsiSXTag': break;\n\t\t\t\tcase 'TxtQry': break;\n\n\t\t\t\t/* Filter */\n\t\t\t\tcase 'FilterMode': break;\n\t\t\t\tcase 'AutoFilter': case 'AutoFilterInfo': break;\n\t\t\t\tcase 'AutoFilter12': break;\n\t\t\t\tcase 'DropDownObjIds': break;\n\t\t\t\tcase 'Sort': break;\n\t\t\t\tcase 'SortData': break;\n\n\t\t\t\t/* Drawing */\n\t\t\t\tcase 'ShapePropsStream': break;\n\t\t\t\tcase 'MsoDrawing': case 'MsoDrawingGroup': case 'MsoDrawingSelection': break;\n\t\t\t\t/* Pub Stuff */\n\t\t\t\tcase 'WebPub': case 'AutoWebPub': break;\n\n\t\t\t\t/* Print Stuff */\n\t\t\t\tcase 'HeaderFooter': case 'HFPicture': case 'PLV':\n\t\t\t\tcase 'HorizontalPageBreaks': case 'VerticalPageBreaks': break;\n\t\t\t\t/* Behavioral */\n\t\t\t\tcase 'Backup': case 'CompressPictures': case 'Compat12': break;\n\n\t\t\t\t/* Should not Happen */\n\t\t\t\tcase 'Continue': case 'ContinueFrt12': break;\n\n\t\t\t\t/* Future Records */\n\t\t\t\tcase 'FrtFontList': case 'FrtWrapper': break;\n\n\t\t\t\tdefault: switch(R.n) { /* nested */\n\t\t\t\t/* BIFF5 records */\n\t\t\t\tcase 'TabIdConf': case 'Radar': case 'RadarArea': case 'DropBar': case 'Intl': case 'CoordList': case 'SerAuxErrBar': break;\n\n\t\t\t\t/* BIFF2-4 records */\n\t\t\t\tcase 'BIFF2FONTCLR': case 'BIFF2FMTCNT': case 'BIFF2FONTXTRA': break;\n\t\t\t\tcase 'BIFF2XF': case 'BIFF3XF': case 'BIFF4XF': break;\n\t\t\t\tcase 'BIFF2XFINDEX': break;\n\t\t\t\tcase 'BIFF4FMTCNT': case 'BIFF2ROW': case 'BIFF2WINDOW2': break;\n\n\t\t\t\t/* Miscellaneous */\n\t\t\t\tcase 'SCENARIO': case 'DConBin': case 'PicF': case 'DataLabExt':\n\t\t\t\tcase 'Lel': case 'BopPop': case 'BopPopCustom': case 'RealTimeData':\n\t\t\t\tcase 'Name': break;\n\t\t\t\tcase 'LHNGraph': case 'FnGroupName': case 'AddMenu': case 'LPr': break;\n\t\t\t\tcase 'ListObj': case 'ListField': break;\n\t\t\t\tcase 'RRSort': break;\n\t\t\t\tcase 'BigName': break;\n\t\t\t\tcase 'ToolbarHdr': case 'ToolbarEnd': break;\n\t\t\t\tcase 'DDEObjName': break;\n\t\t\t\tcase 'FRTArchId$': break;\n\t\t\t\tdefault: if(options.WTF) throw 'Unrecognized Record ' + R.n;\n\t\t\t}}}}\n\t\t} else blob.l += length;\n\t}\n\twb.SheetNames=keys(Directory).sort(function(a,b) { return Number(a) - Number(b); }).map(function(x){return Directory[x].name;});\n\tif(!options.bookSheets) wb.Sheets=Sheets;\n\tif(!wb.SheetNames.length && Preamble[\"!ref\"]) {\n\t\twb.SheetNames.push(\"Sheet1\");\n\t\t/*jshint -W069 */\n\t\tif(wb.Sheets) wb.Sheets[\"Sheet1\"] = Preamble;\n\t\t/*jshint +W069 */\n\t} else wb.Preamble=Preamble;\n\tif(wb.Sheets) FilterDatabases.forEach(function(r,i) { wb.Sheets[wb.SheetNames[i]]['!autofilter'] = r; });\n\twb.Strings = sst;\n\twb.SSF = SSF.get_table();\n\tif(opts.enc) wb.Encryption = opts.enc;\n\tif(themes) wb.Themes = themes;\n\twb.Metadata = {};\n\tif(country !== undefined) wb.Metadata.Country = country;\n\tif(supbooks.names.length > 0) Workbook.Names = supbooks.names;\n\twb.Workbook = Workbook;\n\treturn wb;\n}\n\n/* TODO: split props*/\nvar PSCLSID = {\n\tSI: \"e0859ff2f94f6810ab9108002b27b3d9\",\n\tDSI: \"02d5cdd59c2e1b10939708002b2cf9ae\",\n\tUDI: \"05d5cdd59c2e1b10939708002b2cf9ae\"\n};\nfunction parse_xls_props(cfb, props, o) {\n\t/* [MS-OSHARED] 2.3.3.2.2 Document Summary Information Property Set */\n\tvar DSI = CFB.find(cfb, '!DocumentSummaryInformation');\n\tif(DSI && DSI.size > 0) try {\n\t\tvar DocSummary = parse_PropertySetStream(DSI, DocSummaryPIDDSI, PSCLSID.DSI);\n\t\tfor(var d in DocSummary) props[d] = DocSummary[d];\n\t} catch(e) {if(o.WTF) throw e;/* empty */}\n\n\t/* [MS-OSHARED] 2.3.3.2.1 Summary Information Property Set*/\n\tvar SI = CFB.find(cfb, '!SummaryInformation');\n\tif(SI && SI.size > 0) try {\n\t\tvar Summary = parse_PropertySetStream(SI, SummaryPIDSI, PSCLSID.SI);\n\t\tfor(var s in Summary) if(props[s] == null) props[s] = Summary[s];\n\t} catch(e) {if(o.WTF) throw e;/* empty */}\n\n\tif(props.HeadingPairs && props.TitlesOfParts) {\n\t\tload_props_pairs(props.HeadingPairs, props.TitlesOfParts, props, o);\n\t\tdelete props.HeadingPairs; delete props.TitlesOfParts;\n\t}\n}\nfunction write_xls_props(wb, cfb) {\n\tvar DSEntries = [], SEntries = [], CEntries = [];\n\tvar i = 0, Keys;\n\tif(wb.Props) {\n\t\tKeys = keys(wb.Props);\n\t\t// $FlowIgnore\n\t\tfor(i = 0; i < Keys.length; ++i) (Object.prototype.hasOwnProperty.call(DocSummaryRE, Keys[i]) ? DSEntries : Object.prototype.hasOwnProperty.call(SummaryRE, Keys[i]) ? SEntries : CEntries).push([Keys[i], wb.Props[Keys[i]]]);\n\t}\n\tif(wb.Custprops) {\n\t\tKeys = keys(wb.Custprops);\n\t\t// $FlowIgnore\n\t\tfor(i = 0; i < Keys.length; ++i) if(!Object.prototype.hasOwnProperty.call((wb.Props||{}), Keys[i])) (Object.prototype.hasOwnProperty.call(DocSummaryRE, Keys[i]) ? DSEntries : Object.prototype.hasOwnProperty.call(SummaryRE, Keys[i]) ? SEntries : CEntries).push([Keys[i], wb.Custprops[Keys[i]]]);\n\t}\n\tvar CEntries2 = [];\n\tfor(i = 0; i < CEntries.length; ++i) {\n\t\tif(XLSPSSkip.indexOf(CEntries[i][0]) > -1) continue;\n\t\tif(CEntries[i][1] == null) continue;\n\t\tCEntries2.push(CEntries[i]);\n\t}\n\tif(SEntries.length) CFB.utils.cfb_add(cfb, \"/\\u0005SummaryInformation\", write_PropertySetStream(SEntries, PSCLSID.SI, SummaryRE, SummaryPIDSI));\n\tif(DSEntries.length || CEntries2.length) CFB.utils.cfb_add(cfb, \"/\\u0005DocumentSummaryInformation\", write_PropertySetStream(DSEntries, PSCLSID.DSI, DocSummaryRE, DocSummaryPIDDSI, CEntries2.length ? CEntries2 : null, PSCLSID.UDI));\n}\n\nfunction parse_xlscfb(cfb, options) {\nif(!options) options = {};\nfix_read_opts(options);\nreset_cp();\nif(options.codepage) set_ansi(options.codepage);\nvar CompObj, WB;\nif(cfb.FullPaths) {\n\tif(CFB.find(cfb, '/encryption')) throw new Error(\"File is password-protected\");\n\tCompObj = CFB.find(cfb, '!CompObj');\n\tWB = CFB.find(cfb, '/Workbook') || CFB.find(cfb, '/Book');\n} else {\n\tswitch(options.type) {\n\t\tcase 'base64': cfb = s2a(Base64.decode(cfb)); break;\n\t\tcase 'binary': cfb = s2a(cfb); break;\n\t\tcase 'buffer': break;\n\t\tcase 'array': if(!Array.isArray(cfb)) cfb = Array.prototype.slice.call(cfb); break;\n\t}\n\tprep_blob(cfb, 0);\n\tWB = ({content: cfb});\n}\nvar WorkbookP;\n\nvar _data;\nif(CompObj) parse_compobj(CompObj);\nif(options.bookProps && !options.bookSheets) WorkbookP = ({});\nelse {\n\tvar T = has_buf ? 'buffer' : 'array';\n\tif(WB && WB.content) WorkbookP = parse_workbook(WB.content, options);\n\t/* Quattro Pro 7-8 */\n\telse if((_data=CFB.find(cfb, 'PerfectOffice_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));\n\t/* Quattro Pro 9 */\n\telse if((_data=CFB.find(cfb, 'NativeContent_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));\n\t/* Works 4 for Mac */\n\telse if((_data=CFB.find(cfb, 'MN0')) && _data.content) throw new Error(\"Unsupported Works 4 for Mac file\");\n\telse throw new Error(\"Cannot find Workbook stream\");\n\tif(options.bookVBA && cfb.FullPaths && CFB.find(cfb, '/_VBA_PROJECT_CUR/VBA/dir')) WorkbookP.vbaraw = make_vba_xls(cfb);\n}\n\nvar props = {};\nif(cfb.FullPaths) parse_xls_props(cfb, props, options);\n\nWorkbookP.Props = WorkbookP.Custprops = props; /* TODO: split up properties */\nif(options.bookFiles) WorkbookP.cfb = cfb;\n/*WorkbookP.CompObjP = CompObjP; // TODO: storage? */\nreturn WorkbookP;\n}\n\n\nfunction write_xlscfb(wb, opts) {\n\tvar o = opts || {};\n\tvar cfb = CFB.utils.cfb_new({root:\"R\"});\n\tvar wbpath = \"/Workbook\";\n\tswitch(o.bookType || \"xls\") {\n\t\tcase \"xls\": o.bookType = \"biff8\";\n\t\t/* falls through */\n\t\tcase \"xla\": if(!o.bookType) o.bookType = \"xla\";\n\t\t/* falls through */\n\t\tcase \"biff8\": wbpath = \"/Workbook\"; o.biff = 8; break;\n\t\tcase \"biff5\": wbpath = \"/Book\"; o.biff = 5; break;\n\t\tdefault: throw new Error(\"invalid type \" + o.bookType + \" for XLS CFB\");\n\t}\n\tCFB.utils.cfb_add(cfb, wbpath, write_biff_buf(wb, o));\n\tif(o.biff == 8 && (wb.Props || wb.Custprops)) write_xls_props(wb, cfb);\n\t// TODO: SI, DSI, CO\n\tif(o.biff == 8 && wb.vbaraw) fill_vba_xls(cfb, CFB.read(wb.vbaraw, {type: typeof wb.vbaraw == \"string\" ? \"binary\" : \"buffer\"}));\n\treturn cfb;\n}\n/* [MS-XLSB] 2.3 Record Enumeration */\nvar XLSBRecordEnum = {\n0x0000: { n:\"BrtRowHdr\", f:parse_BrtRowHdr },\n0x0001: { n:\"BrtCellBlank\", f:parse_BrtCellBlank },\n0x0002: { n:\"BrtCellRk\", f:parse_BrtCellRk },\n0x0003: { n:\"BrtCellError\", f:parse_BrtCellError },\n0x0004: { n:\"BrtCellBool\", f:parse_BrtCellBool },\n0x0005: { n:\"BrtCellReal\", f:parse_BrtCellReal },\n0x0006: { n:\"BrtCellSt\", f:parse_BrtCellSt },\n0x0007: { n:\"BrtCellIsst\", f:parse_BrtCellIsst },\n0x0008: { n:\"BrtFmlaString\", f:parse_BrtFmlaString },\n0x0009: { n:\"BrtFmlaNum\", f:parse_BrtFmlaNum },\n0x000A: { n:\"BrtFmlaBool\", f:parse_BrtFmlaBool },\n0x000B: { n:\"BrtFmlaError\", f:parse_BrtFmlaError },\n0x000C: { n:\"BrtShortBlank\", f:parse_BrtShortBlank },\n0x000D: { n:\"BrtShortRk\", f:parse_BrtShortRk },\n0x000E: { n:\"BrtShortError\", f:parse_BrtShortError },\n0x000F: { n:\"BrtShortBool\", f:parse_BrtShortBool },\n0x0010: { n:\"BrtShortReal\", f:parse_BrtShortReal },\n0x0011: { n:\"BrtShortSt\", f:parse_BrtShortSt },\n0x0012: { n:\"BrtShortIsst\", f:parse_BrtShortIsst },\n0x0013: { n:\"BrtSSTItem\", f:parse_RichStr },\n0x0014: { n:\"BrtPCDIMissing\" },\n0x0015: { n:\"BrtPCDINumber\" },\n0x0016: { n:\"BrtPCDIBoolean\" },\n0x0017: { n:\"BrtPCDIError\" },\n0x0018: { n:\"BrtPCDIString\" },\n0x0019: { n:\"BrtPCDIDatetime\" },\n0x001A: { n:\"BrtPCDIIndex\" },\n0x001B: { n:\"BrtPCDIAMissing\" },\n0x001C: { n:\"BrtPCDIANumber\" },\n0x001D: { n:\"BrtPCDIABoolean\" },\n0x001E: { n:\"BrtPCDIAError\" },\n0x001F: { n:\"BrtPCDIAString\" },\n0x0020: { n:\"BrtPCDIADatetime\" },\n0x0021: { n:\"BrtPCRRecord\" },\n0x0022: { n:\"BrtPCRRecordDt\" },\n0x0023: { n:\"BrtFRTBegin\" },\n0x0024: { n:\"BrtFRTEnd\" },\n0x0025: { n:\"BrtACBegin\" },\n0x0026: { n:\"BrtACEnd\" },\n0x0027: { n:\"BrtName\", f:parse_BrtName },\n0x0028: { n:\"BrtIndexRowBlock\" },\n0x002A: { n:\"BrtIndexBlock\" },\n0x002B: { n:\"BrtFont\", f:parse_BrtFont },\n0x002C: { n:\"BrtFmt\", f:parse_BrtFmt },\n0x002D: { n:\"BrtFill\", f:parse_BrtFill },\n0x002E: { n:\"BrtBorder\", f:parse_BrtBorder },\n0x002F: { n:\"BrtXF\", f:parse_BrtXF },\n0x0030: { n:\"BrtStyle\" },\n0x0031: { n:\"BrtCellMeta\" },\n0x0032: { n:\"BrtValueMeta\" },\n0x0033: { n:\"BrtMdb\" },\n0x0034: { n:\"BrtBeginFmd\" },\n0x0035: { n:\"BrtEndFmd\" },\n0x0036: { n:\"BrtBeginMdx\" },\n0x0037: { n:\"BrtEndMdx\" },\n0x0038: { n:\"BrtBeginMdxTuple\" },\n0x0039: { n:\"BrtEndMdxTuple\" },\n0x003A: { n:\"BrtMdxMbrIstr\" },\n0x003B: { n:\"BrtStr\" },\n0x003C: { n:\"BrtColInfo\", f:parse_ColInfo },\n0x003E: { n:\"BrtCellRString\" },\n0x003F: { n:\"BrtCalcChainItem$\", f:parse_BrtCalcChainItem$ },\n0x0040: { n:\"BrtDVal\", f:parse_BrtDVal },\n0x0041: { n:\"BrtSxvcellNum\" },\n0x0042: { n:\"BrtSxvcellStr\" },\n0x0043: { n:\"BrtSxvcellBool\" },\n0x0044: { n:\"BrtSxvcellErr\" },\n0x0045: { n:\"BrtSxvcellDate\" },\n0x0046: { n:\"BrtSxvcellNil\" },\n0x0080: { n:\"BrtFileVersion\" },\n0x0081: { n:\"BrtBeginSheet\" },\n0x0082: { n:\"BrtEndSheet\" },\n0x0083: { n:\"BrtBeginBook\", f:parsenoop, p:0 },\n0x0084: { n:\"BrtEndBook\" },\n0x0085: { n:\"BrtBeginWsViews\" },\n0x0086: { n:\"BrtEndWsViews\" },\n0x0087: { n:\"BrtBeginBookViews\" },\n0x0088: { n:\"BrtEndBookViews\" },\n0x0089: { n:\"BrtBeginWsView\", f:parse_BrtBeginWsView },\n0x008A: { n:\"BrtEndWsView\" },\n0x008B: { n:\"BrtBeginCsViews\" },\n0x008C: { n:\"BrtEndCsViews\" },\n0x008D: { n:\"BrtBeginCsView\" },\n0x008E: { n:\"BrtEndCsView\" },\n0x008F: { n:\"BrtBeginBundleShs\" },\n0x0090: { n:\"BrtEndBundleShs\" },\n0x0091: { n:\"BrtBeginSheetData\" },\n0x0092: { n:\"BrtEndSheetData\" },\n0x0093: { n:\"BrtWsProp\", f:parse_BrtWsProp },\n0x0094: { n:\"BrtWsDim\", f:parse_BrtWsDim, p:16 },\n0x0097: { n:\"BrtPane\", f:parse_BrtPane },\n0x0098: { n:\"BrtSel\" },\n0x0099: { n:\"BrtWbProp\", f:parse_BrtWbProp },\n0x009A: { n:\"BrtWbFactoid\" },\n0x009B: { n:\"BrtFileRecover\" },\n0x009C: { n:\"BrtBundleSh\", f:parse_BrtBundleSh },\n0x009D: { n:\"BrtCalcProp\" },\n0x009E: { n:\"BrtBookView\" },\n0x009F: { n:\"BrtBeginSst\", f:parse_BrtBeginSst },\n0x00A0: { n:\"BrtEndSst\" },\n0x00A1: { n:\"BrtBeginAFilter\", f:parse_UncheckedRfX },\n0x00A2: { n:\"BrtEndAFilter\" },\n0x00A3: { n:\"BrtBeginFilterColumn\" },\n0x00A4: { n:\"BrtEndFilterColumn\" },\n0x00A5: { n:\"BrtBeginFilters\" },\n0x00A6: { n:\"BrtEndFilters\" },\n0x00A7: { n:\"BrtFilter\" },\n0x00A8: { n:\"BrtColorFilter\" },\n0x00A9: { n:\"BrtIconFilter\" },\n0x00AA: { n:\"BrtTop10Filter\" },\n0x00AB: { n:\"BrtDynamicFilter\" },\n0x00AC: { n:\"BrtBeginCustomFilters\" },\n0x00AD: { n:\"BrtEndCustomFilters\" },\n0x00AE: { n:\"BrtCustomFilter\" },\n0x00AF: { n:\"BrtAFilterDateGroupItem\" },\n0x00B0: { n:\"BrtMergeCell\", f:parse_BrtMergeCell },\n0x00B1: { n:\"BrtBeginMergeCells\" },\n0x00B2: { n:\"BrtEndMergeCells\" },\n0x00B3: { n:\"BrtBeginPivotCacheDef\" },\n0x00B4: { n:\"BrtEndPivotCacheDef\" },\n0x00B5: { n:\"BrtBeginPCDFields\" },\n0x00B6: { n:\"BrtEndPCDFields\" },\n0x00B7: { n:\"BrtBeginPCDField\" },\n0x00B8: { n:\"BrtEndPCDField\" },\n0x00B9: { n:\"BrtBeginPCDSource\" },\n0x00BA: { n:\"BrtEndPCDSource\" },\n0x00BB: { n:\"BrtBeginPCDSRange\" },\n0x00BC: { n:\"BrtEndPCDSRange\" },\n0x00BD: { n:\"BrtBeginPCDFAtbl\" },\n0x00BE: { n:\"BrtEndPCDFAtbl\" },\n0x00BF: { n:\"BrtBeginPCDIRun\" },\n0x00C0: { n:\"BrtEndPCDIRun\" },\n0x00C1: { n:\"BrtBeginPivotCacheRecords\" },\n0x00C2: { n:\"BrtEndPivotCacheRecords\" },\n0x00C3: { n:\"BrtBeginPCDHierarchies\" },\n0x00C4: { n:\"BrtEndPCDHierarchies\" },\n0x00C5: { n:\"BrtBeginPCDHierarchy\" },\n0x00C6: { n:\"BrtEndPCDHierarchy\" },\n0x00C7: { n:\"BrtBeginPCDHFieldsUsage\" },\n0x00C8: { n:\"BrtEndPCDHFieldsUsage\" },\n0x00C9: { n:\"BrtBeginExtConnection\" },\n0x00CA: { n:\"BrtEndExtConnection\" },\n0x00CB: { n:\"BrtBeginECDbProps\" },\n0x00CC: { n:\"BrtEndECDbProps\" },\n0x00CD: { n:\"BrtBeginECOlapProps\" },\n0x00CE: { n:\"BrtEndECOlapProps\" },\n0x00CF: { n:\"BrtBeginPCDSConsol\" },\n0x00D0: { n:\"BrtEndPCDSConsol\" },\n0x00D1: { n:\"BrtBeginPCDSCPages\" },\n0x00D2: { n:\"BrtEndPCDSCPages\" },\n0x00D3: { n:\"BrtBeginPCDSCPage\" },\n0x00D4: { n:\"BrtEndPCDSCPage\" },\n0x00D5: { n:\"BrtBeginPCDSCPItem\" },\n0x00D6: { n:\"BrtEndPCDSCPItem\" },\n0x00D7: { n:\"BrtBeginPCDSCSets\" },\n0x00D8: { n:\"BrtEndPCDSCSets\" },\n0x00D9: { n:\"BrtBeginPCDSCSet\" },\n0x00DA: { n:\"BrtEndPCDSCSet\" },\n0x00DB: { n:\"BrtBeginPCDFGroup\" },\n0x00DC: { n:\"BrtEndPCDFGroup\" },\n0x00DD: { n:\"BrtBeginPCDFGItems\" },\n0x00DE: { n:\"BrtEndPCDFGItems\" },\n0x00DF: { n:\"BrtBeginPCDFGRange\" },\n0x00E0: { n:\"BrtEndPCDFGRange\" },\n0x00E1: { n:\"BrtBeginPCDFGDiscrete\" },\n0x00E2: { n:\"BrtEndPCDFGDiscrete\" },\n0x00E3: { n:\"BrtBeginPCDSDTupleCache\" },\n0x00E4: { n:\"BrtEndPCDSDTupleCache\" },\n0x00E5: { n:\"BrtBeginPCDSDTCEntries\" },\n0x00E6: { n:\"BrtEndPCDSDTCEntries\" },\n0x00E7: { n:\"BrtBeginPCDSDTCEMembers\" },\n0x00E8: { n:\"BrtEndPCDSDTCEMembers\" },\n0x00E9: { n:\"BrtBeginPCDSDTCEMember\" },\n0x00EA: { n:\"BrtEndPCDSDTCEMember\" },\n0x00EB: { n:\"BrtBeginPCDSDTCQueries\" },\n0x00EC: { n:\"BrtEndPCDSDTCQueries\" },\n0x00ED: { n:\"BrtBeginPCDSDTCQuery\" },\n0x00EE: { n:\"BrtEndPCDSDTCQuery\" },\n0x00EF: { n:\"BrtBeginPCDSDTCSets\" },\n0x00F0: { n:\"BrtEndPCDSDTCSets\" },\n0x00F1: { n:\"BrtBeginPCDSDTCSet\" },\n0x00F2: { n:\"BrtEndPCDSDTCSet\" },\n0x00F3: { n:\"BrtBeginPCDCalcItems\" },\n0x00F4: { n:\"BrtEndPCDCalcItems\" },\n0x00F5: { n:\"BrtBeginPCDCalcItem\" },\n0x00F6: { n:\"BrtEndPCDCalcItem\" },\n0x00F7: { n:\"BrtBeginPRule\" },\n0x00F8: { n:\"BrtEndPRule\" },\n0x00F9: { n:\"BrtBeginPRFilters\" },\n0x00FA: { n:\"BrtEndPRFilters\" },\n0x00FB: { n:\"BrtBeginPRFilter\" },\n0x00FC: { n:\"BrtEndPRFilter\" },\n0x00FD: { n:\"BrtBeginPNames\" },\n0x00FE: { n:\"BrtEndPNames\" },\n0x00FF: { n:\"BrtBeginPName\" },\n0x0100: { n:\"BrtEndPName\" },\n0x0101: { n:\"BrtBeginPNPairs\" },\n0x0102: { n:\"BrtEndPNPairs\" },\n0x0103: { n:\"BrtBeginPNPair\" },\n0x0104: { n:\"BrtEndPNPair\" },\n0x0105: { n:\"BrtBeginECWebProps\" },\n0x0106: { n:\"BrtEndECWebProps\" },\n0x0107: { n:\"BrtBeginEcWpTables\" },\n0x0108: { n:\"BrtEndECWPTables\" },\n0x0109: { n:\"BrtBeginECParams\" },\n0x010A: { n:\"BrtEndECParams\" },\n0x010B: { n:\"BrtBeginECParam\" },\n0x010C: { n:\"BrtEndECParam\" },\n0x010D: { n:\"BrtBeginPCDKPIs\" },\n0x010E: { n:\"BrtEndPCDKPIs\" },\n0x010F: { n:\"BrtBeginPCDKPI\" },\n0x0110: { n:\"BrtEndPCDKPI\" },\n0x0111: { n:\"BrtBeginDims\" },\n0x0112: { n:\"BrtEndDims\" },\n0x0113: { n:\"BrtBeginDim\" },\n0x0114: { n:\"BrtEndDim\" },\n0x0115: { n:\"BrtIndexPartEnd\" },\n0x0116: { n:\"BrtBeginStyleSheet\" },\n0x0117: { n:\"BrtEndStyleSheet\" },\n0x0118: { n:\"BrtBeginSXView\" },\n0x0119: { n:\"BrtEndSXVI\" },\n0x011A: { n:\"BrtBeginSXVI\" },\n0x011B: { n:\"BrtBeginSXVIs\" },\n0x011C: { n:\"BrtEndSXVIs\" },\n0x011D: { n:\"BrtBeginSXVD\" },\n0x011E: { n:\"BrtEndSXVD\" },\n0x011F: { n:\"BrtBeginSXVDs\" },\n0x0120: { n:\"BrtEndSXVDs\" },\n0x0121: { n:\"BrtBeginSXPI\" },\n0x0122: { n:\"BrtEndSXPI\" },\n0x0123: { n:\"BrtBeginSXPIs\" },\n0x0124: { n:\"BrtEndSXPIs\" },\n0x0125: { n:\"BrtBeginSXDI\" },\n0x0126: { n:\"BrtEndSXDI\" },\n0x0127: { n:\"BrtBeginSXDIs\" },\n0x0128: { n:\"BrtEndSXDIs\" },\n0x0129: { n:\"BrtBeginSXLI\" },\n0x012A: { n:\"BrtEndSXLI\" },\n0x012B: { n:\"BrtBeginSXLIRws\" },\n0x012C: { n:\"BrtEndSXLIRws\" },\n0x012D: { n:\"BrtBeginSXLICols\" },\n0x012E: { n:\"BrtEndSXLICols\" },\n0x012F: { n:\"BrtBeginSXFormat\" },\n0x0130: { n:\"BrtEndSXFormat\" },\n0x0131: { n:\"BrtBeginSXFormats\" },\n0x0132: { n:\"BrtEndSxFormats\" },\n0x0133: { n:\"BrtBeginSxSelect\" },\n0x0134: { n:\"BrtEndSxSelect\" },\n0x0135: { n:\"BrtBeginISXVDRws\" },\n0x0136: { n:\"BrtEndISXVDRws\" },\n0x0137: { n:\"BrtBeginISXVDCols\" },\n0x0138: { n:\"BrtEndISXVDCols\" },\n0x0139: { n:\"BrtEndSXLocation\" },\n0x013A: { n:\"BrtBeginSXLocation\" },\n0x013B: { n:\"BrtEndSXView\" },\n0x013C: { n:\"BrtBeginSXTHs\" },\n0x013D: { n:\"BrtEndSXTHs\" },\n0x013E: { n:\"BrtBeginSXTH\" },\n0x013F: { n:\"BrtEndSXTH\" },\n0x0140: { n:\"BrtBeginISXTHRws\" },\n0x0141: { n:\"BrtEndISXTHRws\" },\n0x0142: { n:\"BrtBeginISXTHCols\" },\n0x0143: { n:\"BrtEndISXTHCols\" },\n0x0144: { n:\"BrtBeginSXTDMPS\" },\n0x0145: { n:\"BrtEndSXTDMPs\" },\n0x0146: { n:\"BrtBeginSXTDMP\" },\n0x0147: { n:\"BrtEndSXTDMP\" },\n0x0148: { n:\"BrtBeginSXTHItems\" },\n0x0149: { n:\"BrtEndSXTHItems\" },\n0x014A: { n:\"BrtBeginSXTHItem\" },\n0x014B: { n:\"BrtEndSXTHItem\" },\n0x014C: { n:\"BrtBeginMetadata\" },\n0x014D: { n:\"BrtEndMetadata\" },\n0x014E: { n:\"BrtBeginEsmdtinfo\" },\n0x014F: { n:\"BrtMdtinfo\" },\n0x0150: { n:\"BrtEndEsmdtinfo\" },\n0x0151: { n:\"BrtBeginEsmdb\" },\n0x0152: { n:\"BrtEndEsmdb\" },\n0x0153: { n:\"BrtBeginEsfmd\" },\n0x0154: { n:\"BrtEndEsfmd\" },\n0x0155: { n:\"BrtBeginSingleCells\" },\n0x0156: { n:\"BrtEndSingleCells\" },\n0x0157: { n:\"BrtBeginList\" },\n0x0158: { n:\"BrtEndList\" },\n0x0159: { n:\"BrtBeginListCols\" },\n0x015A: { n:\"BrtEndListCols\" },\n0x015B: { n:\"BrtBeginListCol\" },\n0x015C: { n:\"BrtEndListCol\" },\n0x015D: { n:\"BrtBeginListXmlCPr\" },\n0x015E: { n:\"BrtEndListXmlCPr\" },\n0x015F: { n:\"BrtListCCFmla\" },\n0x0160: { n:\"BrtListTrFmla\" },\n0x0161: { n:\"BrtBeginExternals\" },\n0x0162: { n:\"BrtEndExternals\" },\n0x0163: { n:\"BrtSupBookSrc\", f:parse_RelID},\n0x0165: { n:\"BrtSupSelf\" },\n0x0166: { n:\"BrtSupSame\" },\n0x0167: { n:\"BrtSupTabs\" },\n0x0168: { n:\"BrtBeginSupBook\" },\n0x0169: { n:\"BrtPlaceholderName\" },\n0x016A: { n:\"BrtExternSheet\", f:parse_ExternSheet },\n0x016B: { n:\"BrtExternTableStart\" },\n0x016C: { n:\"BrtExternTableEnd\" },\n0x016E: { n:\"BrtExternRowHdr\" },\n0x016F: { n:\"BrtExternCellBlank\" },\n0x0170: { n:\"BrtExternCellReal\" },\n0x0171: { n:\"BrtExternCellBool\" },\n0x0172: { n:\"BrtExternCellError\" },\n0x0173: { n:\"BrtExternCellString\" },\n0x0174: { n:\"BrtBeginEsmdx\" },\n0x0175: { n:\"BrtEndEsmdx\" },\n0x0176: { n:\"BrtBeginMdxSet\" },\n0x0177: { n:\"BrtEndMdxSet\" },\n0x0178: { n:\"BrtBeginMdxMbrProp\" },\n0x0179: { n:\"BrtEndMdxMbrProp\" },\n0x017A: { n:\"BrtBeginMdxKPI\" },\n0x017B: { n:\"BrtEndMdxKPI\" },\n0x017C: { n:\"BrtBeginEsstr\" },\n0x017D: { n:\"BrtEndEsstr\" },\n0x017E: { n:\"BrtBeginPRFItem\" },\n0x017F: { n:\"BrtEndPRFItem\" },\n0x0180: { n:\"BrtBeginPivotCacheIDs\" },\n0x0181: { n:\"BrtEndPivotCacheIDs\" },\n0x0182: { n:\"BrtBeginPivotCacheID\" },\n0x0183: { n:\"BrtEndPivotCacheID\" },\n0x0184: { n:\"BrtBeginISXVIs\" },\n0x0185: { n:\"BrtEndISXVIs\" },\n0x0186: { n:\"BrtBeginColInfos\" },\n0x0187: { n:\"BrtEndColInfos\" },\n0x0188: { n:\"BrtBeginRwBrk\" },\n0x0189: { n:\"BrtEndRwBrk\" },\n0x018A: { n:\"BrtBeginColBrk\" },\n0x018B: { n:\"BrtEndColBrk\" },\n0x018C: { n:\"BrtBrk\" },\n0x018D: { n:\"BrtUserBookView\" },\n0x018E: { n:\"BrtInfo\" },\n0x018F: { n:\"BrtCUsr\" },\n0x0190: { n:\"BrtUsr\" },\n0x0191: { n:\"BrtBeginUsers\" },\n0x0193: { n:\"BrtEOF\" },\n0x0194: { n:\"BrtUCR\" },\n0x0195: { n:\"BrtRRInsDel\" },\n0x0196: { n:\"BrtRREndInsDel\" },\n0x0197: { n:\"BrtRRMove\" },\n0x0198: { n:\"BrtRREndMove\" },\n0x0199: { n:\"BrtRRChgCell\" },\n0x019A: { n:\"BrtRREndChgCell\" },\n0x019B: { n:\"BrtRRHeader\" },\n0x019C: { n:\"BrtRRUserView\" },\n0x019D: { n:\"BrtRRRenSheet\" },\n0x019E: { n:\"BrtRRInsertSh\" },\n0x019F: { n:\"BrtRRDefName\" },\n0x01A0: { n:\"BrtRRNote\" },\n0x01A1: { n:\"BrtRRConflict\" },\n0x01A2: { n:\"BrtRRTQSIF\" },\n0x01A3: { n:\"BrtRRFormat\" },\n0x01A4: { n:\"BrtRREndFormat\" },\n0x01A5: { n:\"BrtRRAutoFmt\" },\n0x01A6: { n:\"BrtBeginUserShViews\" },\n0x01A7: { n:\"BrtBeginUserShView\" },\n0x01A8: { n:\"BrtEndUserShView\" },\n0x01A9: { n:\"BrtEndUserShViews\" },\n0x01AA: { n:\"BrtArrFmla\", f:parse_BrtArrFmla },\n0x01AB: { n:\"BrtShrFmla\", f:parse_BrtShrFmla },\n0x01AC: { n:\"BrtTable\" },\n0x01AD: { n:\"BrtBeginExtConnections\" },\n0x01AE: { n:\"BrtEndExtConnections\" },\n0x01AF: { n:\"BrtBeginPCDCalcMems\" },\n0x01B0: { n:\"BrtEndPCDCalcMems\" },\n0x01B1: { n:\"BrtBeginPCDCalcMem\" },\n0x01B2: { n:\"BrtEndPCDCalcMem\" },\n0x01B3: { n:\"BrtBeginPCDHGLevels\" },\n0x01B4: { n:\"BrtEndPCDHGLevels\" },\n0x01B5: { n:\"BrtBeginPCDHGLevel\" },\n0x01B6: { n:\"BrtEndPCDHGLevel\" },\n0x01B7: { n:\"BrtBeginPCDHGLGroups\" },\n0x01B8: { n:\"BrtEndPCDHGLGroups\" },\n0x01B9: { n:\"BrtBeginPCDHGLGroup\" },\n0x01BA: { n:\"BrtEndPCDHGLGroup\" },\n0x01BB: { n:\"BrtBeginPCDHGLGMembers\" },\n0x01BC: { n:\"BrtEndPCDHGLGMembers\" },\n0x01BD: { n:\"BrtBeginPCDHGLGMember\" },\n0x01BE: { n:\"BrtEndPCDHGLGMember\" },\n0x01BF: { n:\"BrtBeginQSI\" },\n0x01C0: { n:\"BrtEndQSI\" },\n0x01C1: { n:\"BrtBeginQSIR\" },\n0x01C2: { n:\"BrtEndQSIR\" },\n0x01C3: { n:\"BrtBeginDeletedNames\" },\n0x01C4: { n:\"BrtEndDeletedNames\" },\n0x01C5: { n:\"BrtBeginDeletedName\" },\n0x01C6: { n:\"BrtEndDeletedName\" },\n0x01C7: { n:\"BrtBeginQSIFs\" },\n0x01C8: { n:\"BrtEndQSIFs\" },\n0x01C9: { n:\"BrtBeginQSIF\" },\n0x01CA: { n:\"BrtEndQSIF\" },\n0x01CB: { n:\"BrtBeginAutoSortScope\" },\n0x01CC: { n:\"BrtEndAutoSortScope\" },\n0x01CD: { n:\"BrtBeginConditionalFormatting\" },\n0x01CE: { n:\"BrtEndConditionalFormatting\" },\n0x01CF: { n:\"BrtBeginCFRule\" },\n0x01D0: { n:\"BrtEndCFRule\" },\n0x01D1: { n:\"BrtBeginIconSet\" },\n0x01D2: { n:\"BrtEndIconSet\" },\n0x01D3: { n:\"BrtBeginDatabar\" },\n0x01D4: { n:\"BrtEndDatabar\" },\n0x01D5: { n:\"BrtBeginColorScale\" },\n0x01D6: { n:\"BrtEndColorScale\" },\n0x01D7: { n:\"BrtCFVO\" },\n0x01D8: { n:\"BrtExternValueMeta\" },\n0x01D9: { n:\"BrtBeginColorPalette\" },\n0x01DA: { n:\"BrtEndColorPalette\" },\n0x01DB: { n:\"BrtIndexedColor\" },\n0x01DC: { n:\"BrtMargins\", f:parse_BrtMargins },\n0x01DD: { n:\"BrtPrintOptions\" },\n0x01DE: { n:\"BrtPageSetup\" },\n0x01DF: { n:\"BrtBeginHeaderFooter\" },\n0x01E0: { n:\"BrtEndHeaderFooter\" },\n0x01E1: { n:\"BrtBeginSXCrtFormat\" },\n0x01E2: { n:\"BrtEndSXCrtFormat\" },\n0x01E3: { n:\"BrtBeginSXCrtFormats\" },\n0x01E4: { n:\"BrtEndSXCrtFormats\" },\n0x01E5: { n:\"BrtWsFmtInfo\", f:parse_BrtWsFmtInfo },\n0x01E6: { n:\"BrtBeginMgs\" },\n0x01E7: { n:\"BrtEndMGs\" },\n0x01E8: { n:\"BrtBeginMGMaps\" },\n0x01E9: { n:\"BrtEndMGMaps\" },\n0x01EA: { n:\"BrtBeginMG\" },\n0x01EB: { n:\"BrtEndMG\" },\n0x01EC: { n:\"BrtBeginMap\" },\n0x01ED: { n:\"BrtEndMap\" },\n0x01EE: { n:\"BrtHLink\", f:parse_BrtHLink },\n0x01EF: { n:\"BrtBeginDCon\" },\n0x01F0: { n:\"BrtEndDCon\" },\n0x01F1: { n:\"BrtBeginDRefs\" },\n0x01F2: { n:\"BrtEndDRefs\" },\n0x01F3: { n:\"BrtDRef\" },\n0x01F4: { n:\"BrtBeginScenMan\" },\n0x01F5: { n:\"BrtEndScenMan\" },\n0x01F6: { n:\"BrtBeginSct\" },\n0x01F7: { n:\"BrtEndSct\" },\n0x01F8: { n:\"BrtSlc\" },\n0x01F9: { n:\"BrtBeginDXFs\" },\n0x01FA: { n:\"BrtEndDXFs\" },\n0x01FB: { n:\"BrtDXF\" },\n0x01FC: { n:\"BrtBeginTableStyles\" },\n0x01FD: { n:\"BrtEndTableStyles\" },\n0x01FE: { n:\"BrtBeginTableStyle\" },\n0x01FF: { n:\"BrtEndTableStyle\" },\n0x0200: { n:\"BrtTableStyleElement\" },\n0x0201: { n:\"BrtTableStyleClient\" },\n0x0202: { n:\"BrtBeginVolDeps\" },\n0x0203: { n:\"BrtEndVolDeps\" },\n0x0204: { n:\"BrtBeginVolType\" },\n0x0205: { n:\"BrtEndVolType\" },\n0x0206: { n:\"BrtBeginVolMain\" },\n0x0207: { n:\"BrtEndVolMain\" },\n0x0208: { n:\"BrtBeginVolTopic\" },\n0x0209: { n:\"BrtEndVolTopic\" },\n0x020A: { n:\"BrtVolSubtopic\" },\n0x020B: { n:\"BrtVolRef\" },\n0x020C: { n:\"BrtVolNum\" },\n0x020D: { n:\"BrtVolErr\" },\n0x020E: { n:\"BrtVolStr\" },\n0x020F: { n:\"BrtVolBool\" },\n0x0210: { n:\"BrtBeginCalcChain$\" },\n0x0211: { n:\"BrtEndCalcChain$\" },\n0x0212: { n:\"BrtBeginSortState\" },\n0x0213: { n:\"BrtEndSortState\" },\n0x0214: { n:\"BrtBeginSortCond\" },\n0x0215: { n:\"BrtEndSortCond\" },\n0x0216: { n:\"BrtBookProtection\" },\n0x0217: { n:\"BrtSheetProtection\" },\n0x0218: { n:\"BrtRangeProtection\" },\n0x0219: { n:\"BrtPhoneticInfo\" },\n0x021A: { n:\"BrtBeginECTxtWiz\" },\n0x021B: { n:\"BrtEndECTxtWiz\" },\n0x021C: { n:\"BrtBeginECTWFldInfoLst\" },\n0x021D: { n:\"BrtEndECTWFldInfoLst\" },\n0x021E: { n:\"BrtBeginECTwFldInfo\" },\n0x0224: { n:\"BrtFileSharing\" },\n0x0225: { n:\"BrtOleSize\" },\n0x0226: { n:\"BrtDrawing\", f:parse_RelID },\n0x0227: { n:\"BrtLegacyDrawing\" },\n0x0228: { n:\"BrtLegacyDrawingHF\" },\n0x0229: { n:\"BrtWebOpt\" },\n0x022A: { n:\"BrtBeginWebPubItems\" },\n0x022B: { n:\"BrtEndWebPubItems\" },\n0x022C: { n:\"BrtBeginWebPubItem\" },\n0x022D: { n:\"BrtEndWebPubItem\" },\n0x022E: { n:\"BrtBeginSXCondFmt\" },\n0x022F: { n:\"BrtEndSXCondFmt\" },\n0x0230: { n:\"BrtBeginSXCondFmts\" },\n0x0231: { n:\"BrtEndSXCondFmts\" },\n0x0232: { n:\"BrtBkHim\" },\n0x0234: { n:\"BrtColor\" },\n0x0235: { n:\"BrtBeginIndexedColors\" },\n0x0236: { n:\"BrtEndIndexedColors\" },\n0x0239: { n:\"BrtBeginMRUColors\" },\n0x023A: { n:\"BrtEndMRUColors\" },\n0x023C: { n:\"BrtMRUColor\" },\n0x023D: { n:\"BrtBeginDVals\" },\n0x023E: { n:\"BrtEndDVals\" },\n0x0241: { n:\"BrtSupNameStart\" },\n0x0242: { n:\"BrtSupNameValueStart\" },\n0x0243: { n:\"BrtSupNameValueEnd\" },\n0x0244: { n:\"BrtSupNameNum\" },\n0x0245: { n:\"BrtSupNameErr\" },\n0x0246: { n:\"BrtSupNameSt\" },\n0x0247: { n:\"BrtSupNameNil\" },\n0x0248: { n:\"BrtSupNameBool\" },\n0x0249: { n:\"BrtSupNameFmla\" },\n0x024A: { n:\"BrtSupNameBits\" },\n0x024B: { n:\"BrtSupNameEnd\" },\n0x024C: { n:\"BrtEndSupBook\" },\n0x024D: { n:\"BrtCellSmartTagProperty\" },\n0x024E: { n:\"BrtBeginCellSmartTag\" },\n0x024F: { n:\"BrtEndCellSmartTag\" },\n0x0250: { n:\"BrtBeginCellSmartTags\" },\n0x0251: { n:\"BrtEndCellSmartTags\" },\n0x0252: { n:\"BrtBeginSmartTags\" },\n0x0253: { n:\"BrtEndSmartTags\" },\n0x0254: { n:\"BrtSmartTagType\" },\n0x0255: { n:\"BrtBeginSmartTagTypes\" },\n0x0256: { n:\"BrtEndSmartTagTypes\" },\n0x0257: { n:\"BrtBeginSXFilters\" },\n0x0258: { n:\"BrtEndSXFilters\" },\n0x0259: { n:\"BrtBeginSXFILTER\" },\n0x025A: { n:\"BrtEndSXFilter\" },\n0x025B: { n:\"BrtBeginFills\" },\n0x025C: { n:\"BrtEndFills\" },\n0x025D: { n:\"BrtBeginCellWatches\" },\n0x025E: { n:\"BrtEndCellWatches\" },\n0x025F: { n:\"BrtCellWatch\" },\n0x0260: { n:\"BrtBeginCRErrs\" },\n0x0261: { n:\"BrtEndCRErrs\" },\n0x0262: { n:\"BrtCrashRecErr\" },\n0x0263: { n:\"BrtBeginFonts\" },\n0x0264: { n:\"BrtEndFonts\" },\n0x0265: { n:\"BrtBeginBorders\" },\n0x0266: { n:\"BrtEndBorders\" },\n0x0267: { n:\"BrtBeginFmts\" },\n0x0268: { n:\"BrtEndFmts\" },\n0x0269: { n:\"BrtBeginCellXFs\" },\n0x026A: { n:\"BrtEndCellXFs\" },\n0x026B: { n:\"BrtBeginStyles\" },\n0x026C: { n:\"BrtEndStyles\" },\n0x0271: { n:\"BrtBigName\" },\n0x0272: { n:\"BrtBeginCellStyleXFs\" },\n0x0273: { n:\"BrtEndCellStyleXFs\" },\n0x0274: { n:\"BrtBeginComments\" },\n0x0275: { n:\"BrtEndComments\" },\n0x0276: { n:\"BrtBeginCommentAuthors\" },\n0x0277: { n:\"BrtEndCommentAuthors\" },\n0x0278: { n:\"BrtCommentAuthor\", f:parse_BrtCommentAuthor },\n0x0279: { n:\"BrtBeginCommentList\" },\n0x027A: { n:\"BrtEndCommentList\" },\n0x027B: { n:\"BrtBeginComment\", f:parse_BrtBeginComment},\n0x027C: { n:\"BrtEndComment\" },\n0x027D: { n:\"BrtCommentText\", f:parse_BrtCommentText },\n0x027E: { n:\"BrtBeginOleObjects\" },\n0x027F: { n:\"BrtOleObject\" },\n0x0280: { n:\"BrtEndOleObjects\" },\n0x0281: { n:\"BrtBeginSxrules\" },\n0x0282: { n:\"BrtEndSxRules\" },\n0x0283: { n:\"BrtBeginActiveXControls\" },\n0x0284: { n:\"BrtActiveX\" },\n0x0285: { n:\"BrtEndActiveXControls\" },\n0x0286: { n:\"BrtBeginPCDSDTCEMembersSortBy\" },\n0x0288: { n:\"BrtBeginCellIgnoreECs\" },\n0x0289: { n:\"BrtCellIgnoreEC\" },\n0x028A: { n:\"BrtEndCellIgnoreECs\" },\n0x028B: { n:\"BrtCsProp\", f:parse_BrtCsProp },\n0x028C: { n:\"BrtCsPageSetup\" },\n0x028D: { n:\"BrtBeginUserCsViews\" },\n0x028E: { n:\"BrtEndUserCsViews\" },\n0x028F: { n:\"BrtBeginUserCsView\" },\n0x0290: { n:\"BrtEndUserCsView\" },\n0x0291: { n:\"BrtBeginPcdSFCIEntries\" },\n0x0292: { n:\"BrtEndPCDSFCIEntries\" },\n0x0293: { n:\"BrtPCDSFCIEntry\" },\n0x0294: { n:\"BrtBeginListParts\" },\n0x0295: { n:\"BrtListPart\" },\n0x0296: { n:\"BrtEndListParts\" },\n0x0297: { n:\"BrtSheetCalcProp\" },\n0x0298: { n:\"BrtBeginFnGroup\" },\n0x0299: { n:\"BrtFnGroup\" },\n0x029A: { n:\"BrtEndFnGroup\" },\n0x029B: { n:\"BrtSupAddin\" },\n0x029C: { n:\"BrtSXTDMPOrder\" },\n0x029D: { n:\"BrtCsProtection\" },\n0x029F: { n:\"BrtBeginWsSortMap\" },\n0x02A0: { n:\"BrtEndWsSortMap\" },\n0x02A1: { n:\"BrtBeginRRSort\" },\n0x02A2: { n:\"BrtEndRRSort\" },\n0x02A3: { n:\"BrtRRSortItem\" },\n0x02A4: { n:\"BrtFileSharingIso\" },\n0x02A5: { n:\"BrtBookProtectionIso\" },\n0x02A6: { n:\"BrtSheetProtectionIso\" },\n0x02A7: { n:\"BrtCsProtectionIso\" },\n0x02A8: { n:\"BrtRangeProtectionIso\" },\n0x02A9: { n:\"BrtDValList\" },\n0x0400: { n:\"BrtRwDescent\" },\n0x0401: { n:\"BrtKnownFonts\" },\n0x0402: { n:\"BrtBeginSXTupleSet\" },\n0x0403: { n:\"BrtEndSXTupleSet\" },\n0x0404: { n:\"BrtBeginSXTupleSetHeader\" },\n0x0405: { n:\"BrtEndSXTupleSetHeader\" },\n0x0406: { n:\"BrtSXTupleSetHeaderItem\" },\n0x0407: { n:\"BrtBeginSXTupleSetData\" },\n0x0408: { n:\"BrtEndSXTupleSetData\" },\n0x0409: { n:\"BrtBeginSXTupleSetRow\" },\n0x040A: { n:\"BrtEndSXTupleSetRow\" },\n0x040B: { n:\"BrtSXTupleSetRowItem\" },\n0x040C: { n:\"BrtNameExt\" },\n0x040D: { n:\"BrtPCDH14\" },\n0x040E: { n:\"BrtBeginPCDCalcMem14\" },\n0x040F: { n:\"BrtEndPCDCalcMem14\" },\n0x0410: { n:\"BrtSXTH14\" },\n0x0411: { n:\"BrtBeginSparklineGroup\" },\n0x0412: { n:\"BrtEndSparklineGroup\" },\n0x0413: { n:\"BrtSparkline\" },\n0x0414: { n:\"BrtSXDI14\" },\n0x0415: { n:\"BrtWsFmtInfoEx14\" },\n0x0416: { n:\"BrtBeginConditionalFormatting14\" },\n0x0417: { n:\"BrtEndConditionalFormatting14\" },\n0x0418: { n:\"BrtBeginCFRule14\" },\n0x0419: { n:\"BrtEndCFRule14\" },\n0x041A: { n:\"BrtCFVO14\" },\n0x041B: { n:\"BrtBeginDatabar14\" },\n0x041C: { n:\"BrtBeginIconSet14\" },\n0x041D: { n:\"BrtDVal14\", f: parse_BrtDVal14 },\n0x041E: { n:\"BrtBeginDVals14\" },\n0x041F: { n:\"BrtColor14\" },\n0x0420: { n:\"BrtBeginSparklines\" },\n0x0421: { n:\"BrtEndSparklines\" },\n0x0422: { n:\"BrtBeginSparklineGroups\" },\n0x0423: { n:\"BrtEndSparklineGroups\" },\n0x0425: { n:\"BrtSXVD14\" },\n0x0426: { n:\"BrtBeginSXView14\" },\n0x0427: { n:\"BrtEndSXView14\" },\n0x0428: { n:\"BrtBeginSXView16\" },\n0x0429: { n:\"BrtEndSXView16\" },\n0x042A: { n:\"BrtBeginPCD14\" },\n0x042B: { n:\"BrtEndPCD14\" },\n0x042C: { n:\"BrtBeginExtConn14\" },\n0x042D: { n:\"BrtEndExtConn14\" },\n0x042E: { n:\"BrtBeginSlicerCacheIDs\" },\n0x042F: { n:\"BrtEndSlicerCacheIDs\" },\n0x0430: { n:\"BrtBeginSlicerCacheID\" },\n0x0431: { n:\"BrtEndSlicerCacheID\" },\n0x0433: { n:\"BrtBeginSlicerCache\" },\n0x0434: { n:\"BrtEndSlicerCache\" },\n0x0435: { n:\"BrtBeginSlicerCacheDef\" },\n0x0436: { n:\"BrtEndSlicerCacheDef\" },\n0x0437: { n:\"BrtBeginSlicersEx\" },\n0x0438: { n:\"BrtEndSlicersEx\" },\n0x0439: { n:\"BrtBeginSlicerEx\" },\n0x043A: { n:\"BrtEndSlicerEx\" },\n0x043B: { n:\"BrtBeginSlicer\" },\n0x043C: { n:\"BrtEndSlicer\" },\n0x043D: { n:\"BrtSlicerCachePivotTables\" },\n0x043E: { n:\"BrtBeginSlicerCacheOlapImpl\" },\n0x043F: { n:\"BrtEndSlicerCacheOlapImpl\" },\n0x0440: { n:\"BrtBeginSlicerCacheLevelsData\" },\n0x0441: { n:\"BrtEndSlicerCacheLevelsData\" },\n0x0442: { n:\"BrtBeginSlicerCacheLevelData\" },\n0x0443: { n:\"BrtEndSlicerCacheLevelData\" },\n0x0444: { n:\"BrtBeginSlicerCacheSiRanges\" },\n0x0445: { n:\"BrtEndSlicerCacheSiRanges\" },\n0x0446: { n:\"BrtBeginSlicerCacheSiRange\" },\n0x0447: { n:\"BrtEndSlicerCacheSiRange\" },\n0x0448: { n:\"BrtSlicerCacheOlapItem\" },\n0x0449: { n:\"BrtBeginSlicerCacheSelections\" },\n0x044A: { n:\"BrtSlicerCacheSelection\" },\n0x044B: { n:\"BrtEndSlicerCacheSelections\" },\n0x044C: { n:\"BrtBeginSlicerCacheNative\" },\n0x044D: { n:\"BrtEndSlicerCacheNative\" },\n0x044E: { n:\"BrtSlicerCacheNativeItem\" },\n0x044F: { n:\"BrtRangeProtection14\" },\n0x0450: { n:\"BrtRangeProtectionIso14\" },\n0x0451: { n:\"BrtCellIgnoreEC14\" },\n0x0457: { n:\"BrtList14\" },\n0x0458: { n:\"BrtCFIcon\" },\n0x0459: { n:\"BrtBeginSlicerCachesPivotCacheIDs\" },\n0x045A: { n:\"BrtEndSlicerCachesPivotCacheIDs\" },\n0x045B: { n:\"BrtBeginSlicers\" },\n0x045C: { n:\"BrtEndSlicers\" },\n0x045D: { n:\"BrtWbProp14\" },\n0x045E: { n:\"BrtBeginSXEdit\" },\n0x045F: { n:\"BrtEndSXEdit\" },\n0x0460: { n:\"BrtBeginSXEdits\" },\n0x0461: { n:\"BrtEndSXEdits\" },\n0x0462: { n:\"BrtBeginSXChange\" },\n0x0463: { n:\"BrtEndSXChange\" },\n0x0464: { n:\"BrtBeginSXChanges\" },\n0x0465: { n:\"BrtEndSXChanges\" },\n0x0466: { n:\"BrtSXTupleItems\" },\n0x0468: { n:\"BrtBeginSlicerStyle\" },\n0x0469: { n:\"BrtEndSlicerStyle\" },\n0x046A: { n:\"BrtSlicerStyleElement\" },\n0x046B: { n:\"BrtBeginStyleSheetExt14\" },\n0x046C: { n:\"BrtEndStyleSheetExt14\" },\n0x046D: { n:\"BrtBeginSlicerCachesPivotCacheID\" },\n0x046E: { n:\"BrtEndSlicerCachesPivotCacheID\" },\n0x046F: { n:\"BrtBeginConditionalFormattings\" },\n0x0470: { n:\"BrtEndConditionalFormattings\" },\n0x0471: { n:\"BrtBeginPCDCalcMemExt\" },\n0x0472: { n:\"BrtEndPCDCalcMemExt\" },\n0x0473: { n:\"BrtBeginPCDCalcMemsExt\" },\n0x0474: { n:\"BrtEndPCDCalcMemsExt\" },\n0x0475: { n:\"BrtPCDField14\" },\n0x0476: { n:\"BrtBeginSlicerStyles\" },\n0x0477: { n:\"BrtEndSlicerStyles\" },\n0x0478: { n:\"BrtBeginSlicerStyleElements\" },\n0x0479: { n:\"BrtEndSlicerStyleElements\" },\n0x047A: { n:\"BrtCFRuleExt\" },\n0x047B: { n:\"BrtBeginSXCondFmt14\" },\n0x047C: { n:\"BrtEndSXCondFmt14\" },\n0x047D: { n:\"BrtBeginSXCondFmts14\" },\n0x047E: { n:\"BrtEndSXCondFmts14\" },\n0x0480: { n:\"BrtBeginSortCond14\" },\n0x0481: { n:\"BrtEndSortCond14\" },\n0x0482: { n:\"BrtEndDVals14\" },\n0x0483: { n:\"BrtEndIconSet14\" },\n0x0484: { n:\"BrtEndDatabar14\" },\n0x0485: { n:\"BrtBeginColorScale14\" },\n0x0486: { n:\"BrtEndColorScale14\" },\n0x0487: { n:\"BrtBeginSxrules14\" },\n0x0488: { n:\"BrtEndSxrules14\" },\n0x0489: { n:\"BrtBeginPRule14\" },\n0x048A: { n:\"BrtEndPRule14\" },\n0x048B: { n:\"BrtBeginPRFilters14\" },\n0x048C: { n:\"BrtEndPRFilters14\" },\n0x048D: { n:\"BrtBeginPRFilter14\" },\n0x048E: { n:\"BrtEndPRFilter14\" },\n0x048F: { n:\"BrtBeginPRFItem14\" },\n0x0490: { n:\"BrtEndPRFItem14\" },\n0x0491: { n:\"BrtBeginCellIgnoreECs14\" },\n0x0492: { n:\"BrtEndCellIgnoreECs14\" },\n0x0493: { n:\"BrtDxf14\" },\n0x0494: { n:\"BrtBeginDxF14s\" },\n0x0495: { n:\"BrtEndDxf14s\" },\n0x0499: { n:\"BrtFilter14\" },\n0x049A: { n:\"BrtBeginCustomFilters14\" },\n0x049C: { n:\"BrtCustomFilter14\" },\n0x049D: { n:\"BrtIconFilter14\" },\n0x049E: { n:\"BrtPivotCacheConnectionName\" },\n0x0800: { n:\"BrtBeginDecoupledPivotCacheIDs\" },\n0x0801: { n:\"BrtEndDecoupledPivotCacheIDs\" },\n0x0802: { n:\"BrtDecoupledPivotCacheID\" },\n0x0803: { n:\"BrtBeginPivotTableRefs\" },\n0x0804: { n:\"BrtEndPivotTableRefs\" },\n0x0805: { n:\"BrtPivotTableRef\" },\n0x0806: { n:\"BrtSlicerCacheBookPivotTables\" },\n0x0807: { n:\"BrtBeginSxvcells\" },\n0x0808: { n:\"BrtEndSxvcells\" },\n0x0809: { n:\"BrtBeginSxRow\" },\n0x080A: { n:\"BrtEndSxRow\" },\n0x080C: { n:\"BrtPcdCalcMem15\" },\n0x0813: { n:\"BrtQsi15\" },\n0x0814: { n:\"BrtBeginWebExtensions\" },\n0x0815: { n:\"BrtEndWebExtensions\" },\n0x0816: { n:\"BrtWebExtension\" },\n0x0817: { n:\"BrtAbsPath15\" },\n0x0818: { n:\"BrtBeginPivotTableUISettings\" },\n0x0819: { n:\"BrtEndPivotTableUISettings\" },\n0x081B: { n:\"BrtTableSlicerCacheIDs\" },\n0x081C: { n:\"BrtTableSlicerCacheID\" },\n0x081D: { n:\"BrtBeginTableSlicerCache\" },\n0x081E: { n:\"BrtEndTableSlicerCache\" },\n0x081F: { n:\"BrtSxFilter15\" },\n0x0820: { n:\"BrtBeginTimelineCachePivotCacheIDs\" },\n0x0821: { n:\"BrtEndTimelineCachePivotCacheIDs\" },\n0x0822: { n:\"BrtTimelineCachePivotCacheID\" },\n0x0823: { n:\"BrtBeginTimelineCacheIDs\" },\n0x0824: { n:\"BrtEndTimelineCacheIDs\" },\n0x0825: { n:\"BrtBeginTimelineCacheID\" },\n0x0826: { n:\"BrtEndTimelineCacheID\" },\n0x0827: { n:\"BrtBeginTimelinesEx\" },\n0x0828: { n:\"BrtEndTimelinesEx\" },\n0x0829: { n:\"BrtBeginTimelineEx\" },\n0x082A: { n:\"BrtEndTimelineEx\" },\n0x082B: { n:\"BrtWorkBookPr15\" },\n0x082C: { n:\"BrtPCDH15\" },\n0x082D: { n:\"BrtBeginTimelineStyle\" },\n0x082E: { n:\"BrtEndTimelineStyle\" },\n0x082F: { n:\"BrtTimelineStyleElement\" },\n0x0830: { n:\"BrtBeginTimelineStylesheetExt15\" },\n0x0831: { n:\"BrtEndTimelineStylesheetExt15\" },\n0x0832: { n:\"BrtBeginTimelineStyles\" },\n0x0833: { n:\"BrtEndTimelineStyles\" },\n0x0834: { n:\"BrtBeginTimelineStyleElements\" },\n0x0835: { n:\"BrtEndTimelineStyleElements\" },\n0x0836: { n:\"BrtDxf15\" },\n0x0837: { n:\"BrtBeginDxfs15\" },\n0x0838: { n:\"brtEndDxfs15\" },\n0x0839: { n:\"BrtSlicerCacheHideItemsWithNoData\" },\n0x083A: { n:\"BrtBeginItemUniqueNames\" },\n0x083B: { n:\"BrtEndItemUniqueNames\" },\n0x083C: { n:\"BrtItemUniqueName\" },\n0x083D: { n:\"BrtBeginExtConn15\" },\n0x083E: { n:\"BrtEndExtConn15\" },\n0x083F: { n:\"BrtBeginOledbPr15\" },\n0x0840: { n:\"BrtEndOledbPr15\" },\n0x0841: { n:\"BrtBeginDataFeedPr15\" },\n0x0842: { n:\"BrtEndDataFeedPr15\" },\n0x0843: { n:\"BrtTextPr15\" },\n0x0844: { n:\"BrtRangePr15\" },\n0x0845: { n:\"BrtDbCommand15\" },\n0x0846: { n:\"BrtBeginDbTables15\" },\n0x0847: { n:\"BrtEndDbTables15\" },\n0x0848: { n:\"BrtDbTable15\" },\n0x0849: { n:\"BrtBeginDataModel\" },\n0x084A: { n:\"BrtEndDataModel\" },\n0x084B: { n:\"BrtBeginModelTables\" },\n0x084C: { n:\"BrtEndModelTables\" },\n0x084D: { n:\"BrtModelTable\" },\n0x084E: { n:\"BrtBeginModelRelationships\" },\n0x084F: { n:\"BrtEndModelRelationships\" },\n0x0850: { n:\"BrtModelRelationship\" },\n0x0851: { n:\"BrtBeginECTxtWiz15\" },\n0x0852: { n:\"BrtEndECTxtWiz15\" },\n0x0853: { n:\"BrtBeginECTWFldInfoLst15\" },\n0x0854: { n:\"BrtEndECTWFldInfoLst15\" },\n0x0855: { n:\"BrtBeginECTWFldInfo15\" },\n0x0856: { n:\"BrtFieldListActiveItem\" },\n0x0857: { n:\"BrtPivotCacheIdVersion\" },\n0x0858: { n:\"BrtSXDI15\" },\n0x0859: { n:\"BrtBeginModelTimeGroupings\" },\n0x085A: { n:\"BrtEndModelTimeGroupings\" },\n0x085B: { n:\"BrtBeginModelTimeGrouping\" },\n0x085C: { n:\"BrtEndModelTimeGrouping\" },\n0x085D: { n:\"BrtModelTimeGroupingCalcCol\" },\n0x0C00: { n:\"BrtUid\" },\n0x0C01: { n:\"BrtRevisionPtr\" },\n0x13e7: { n:\"BrtBeginCalcFeatures\" },\n0x13e8: { n:\"BrtEndCalcFeatures\" },\n0x13e9: { n:\"BrtCalcFeature\" },\n0xFFFF: { n:\"\" }\n};\n\nvar XLSBRE = evert_key(XLSBRecordEnum, 'n');\n/*jshint -W069 */\nXLSBRE[\"BrtFRTArchID$\"] = 0x0010;\n/*jshint +W069 */\n\n/* [MS-XLS] 2.3 Record Enumeration (and other sources) */\nvar XLSRecordEnum = {\n\t/* [MS-XLS] 2.3 Record Enumeration 2021-08-17 */\n0x0006: { n:\"Formula\", f:parse_Formula },\n0x000a: { n:'EOF', f:parsenoop2 },\n0x000c: { n:\"CalcCount\", f:parseuint16 },\n0x000d: { n:\"CalcMode\", f:parseuint16 },\n0x000e: { n:\"CalcPrecision\", f:parsebool },\n0x000f: { n:\"CalcRefMode\", f:parsebool },\n0x0010: { n:\"CalcDelta\", f:parse_Xnum },\n0x0011: { n:\"CalcIter\", f:parsebool },\n0x0012: { n:\"Protect\", f:parsebool },\n0x0013: { n:\"Password\", f:parseuint16 },\n0x0014: { n:\"Header\", f:parse_XLHeaderFooter },\n0x0015: { n:\"Footer\", f:parse_XLHeaderFooter },\n0x0017: { n:\"ExternSheet\", f:parse_ExternSheet },\n0x0018: { n:\"Lbl\", f:parse_Lbl },\n0x0019: { n:\"WinProtect\", f:parsebool },\n0x001a: { n:\"VerticalPageBreaks\" },\n0x001b: { n:\"HorizontalPageBreaks\" },\n0x001c: { n:\"Note\", f:parse_Note },\n0x001d: { n:\"Selection\" },\n0x0022: { n:\"Date1904\", f:parsebool },\n0x0023: { n:\"ExternName\", f:parse_ExternName },\n0x0026: { n:\"LeftMargin\", f:parse_Xnum },\n0x0027: { n:\"RightMargin\", f:parse_Xnum },\n0x0028: { n:\"TopMargin\", f:parse_Xnum },\n0x0029: { n:\"BottomMargin\", f:parse_Xnum },\n0x002a: { n:\"PrintRowCol\", f:parsebool },\n0x002b: { n:\"PrintGrid\", f:parsebool },\n0x002f: { n:\"FilePass\", f:parse_FilePass },\n0x0031: { n:\"Font\", f:parse_Font },\n0x0033: { n:\"PrintSize\", f:parseuint16 },\n0x003c: { n:\"Continue\" },\n0x003d: { n:\"Window1\", f:parse_Window1 },\n0x0040: { n:\"Backup\", f:parsebool },\n0x0041: { n:\"Pane\", f:parse_Pane },\n0x0042: { n:'CodePage', f:parseuint16 },\n0x004d: { n:\"Pls\" },\n0x0050: { n:\"DCon\" },\n0x0051: { n:\"DConRef\" },\n0x0052: { n:\"DConName\" },\n0x0055: { n:\"DefColWidth\", f:parseuint16 },\n0x0059: { n:\"XCT\" },\n0x005a: { n:\"CRN\" },\n0x005b: { n:\"FileSharing\" },\n0x005c: { n:'WriteAccess', f:parse_WriteAccess },\n0x005d: { n:\"Obj\", f:parse_Obj },\n0x005e: { n:\"Uncalced\" },\n0x005f: { n:\"CalcSaveRecalc\", f:parsebool },\n0x0060: { n:\"Template\" },\n0x0061: { n:\"Intl\" },\n0x0063: { n:\"ObjProtect\", f:parsebool },\n0x007d: { n:\"ColInfo\", f:parse_ColInfo },\n0x0080: { n:\"Guts\", f:parse_Guts },\n0x0081: { n:\"WsBool\", f:parse_WsBool },\n0x0082: { n:\"GridSet\", f:parseuint16 },\n0x0083: { n:\"HCenter\", f:parsebool },\n0x0084: { n:\"VCenter\", f:parsebool },\n0x0085: { n:'BoundSheet8', f:parse_BoundSheet8 },\n0x0086: { n:\"WriteProtect\" },\n0x008c: { n:\"Country\", f:parse_Country },\n0x008d: { n:\"HideObj\", f:parseuint16 },\n0x0090: { n:\"Sort\" },\n0x0092: { n:\"Palette\", f:parse_Palette },\n0x0097: { n:\"Sync\" },\n0x0098: { n:\"LPr\" },\n0x0099: { n:\"DxGCol\" },\n0x009a: { n:\"FnGroupName\" },\n0x009b: { n:\"FilterMode\" },\n0x009c: { n:\"BuiltInFnGroupCount\", f:parseuint16 },\n0x009d: { n:\"AutoFilterInfo\" },\n0x009e: { n:\"AutoFilter\" },\n0x00a0: { n:\"Scl\", f:parse_Scl },\n0x00a1: { n:\"Setup\", f:parse_Setup },\n0x00ae: { n:\"ScenMan\" },\n0x00af: { n:\"SCENARIO\" },\n0x00b0: { n:\"SxView\" },\n0x00b1: { n:\"Sxvd\" },\n0x00b2: { n:\"SXVI\" },\n0x00b4: { n:\"SxIvd\" },\n0x00b5: { n:\"SXLI\" },\n0x00b6: { n:\"SXPI\" },\n0x00b8: { n:\"DocRoute\" },\n0x00b9: { n:\"RecipName\" },\n0x00bd: { n:\"MulRk\", f:parse_MulRk },\n0x00be: { n:\"MulBlank\", f:parse_MulBlank },\n0x00c1: { n:'Mms', f:parsenoop2 },\n0x00c5: { n:\"SXDI\" },\n0x00c6: { n:\"SXDB\" },\n0x00c7: { n:\"SXFDB\" },\n0x00c8: { n:\"SXDBB\" },\n0x00c9: { n:\"SXNum\" },\n0x00ca: { n:\"SxBool\", f:parsebool },\n0x00cb: { n:\"SxErr\" },\n0x00cc: { n:\"SXInt\" },\n0x00cd: { n:\"SXString\" },\n0x00ce: { n:\"SXDtr\" },\n0x00cf: { n:\"SxNil\" },\n0x00d0: { n:\"SXTbl\" },\n0x00d1: { n:\"SXTBRGIITM\" },\n0x00d2: { n:\"SxTbpg\" },\n0x00d3: { n:\"ObProj\" },\n0x00d5: { n:\"SXStreamID\" },\n0x00d7: { n:\"DBCell\" },\n0x00d8: { n:\"SXRng\" },\n0x00d9: { n:\"SxIsxoper\" },\n0x00da: { n:\"BookBool\", f:parseuint16 },\n0x00dc: { n:\"DbOrParamQry\" },\n0x00dd: { n:\"ScenarioProtect\", f:parsebool },\n0x00de: { n:\"OleObjectSize\" },\n0x00e0: { n:\"XF\", f:parse_XF },\n0x00e1: { n:'InterfaceHdr', f:parse_InterfaceHdr },\n0x00e2: { n:'InterfaceEnd', f:parsenoop2 },\n0x00e3: { n:\"SXVS\" },\n0x00e5: { n:\"MergeCells\", f:parse_MergeCells },\n0x00e9: { n:\"BkHim\" },\n0x00eb: { n:\"MsoDrawingGroup\" },\n0x00ec: { n:\"MsoDrawing\" },\n0x00ed: { n:\"MsoDrawingSelection\" },\n0x00ef: { n:\"PhoneticInfo\" },\n0x00f0: { n:\"SxRule\" },\n0x00f1: { n:\"SXEx\" },\n0x00f2: { n:\"SxFilt\" },\n0x00f4: { n:\"SxDXF\" },\n0x00f5: { n:\"SxItm\" },\n0x00f6: { n:\"SxName\" },\n0x00f7: { n:\"SxSelect\" },\n0x00f8: { n:\"SXPair\" },\n0x00f9: { n:\"SxFmla\" },\n0x00fb: { n:\"SxFormat\" },\n0x00fc: { n:\"SST\", f:parse_SST },\n0x00fd: { n:\"LabelSst\", f:parse_LabelSst },\n0x00ff: { n:\"ExtSST\", f:parse_ExtSST },\n0x0100: { n:\"SXVDEx\" },\n0x0103: { n:\"SXFormula\" },\n0x0122: { n:\"SXDBEx\" },\n0x0137: { n:\"RRDInsDel\" },\n0x0138: { n:\"RRDHead\" },\n0x013b: { n:\"RRDChgCell\" },\n0x013d: { n:\"RRTabId\", f:parseuint16a },\n0x013e: { n:\"RRDRenSheet\" },\n0x013f: { n:\"RRSort\" },\n0x0140: { n:\"RRDMove\" },\n0x014a: { n:\"RRFormat\" },\n0x014b: { n:\"RRAutoFmt\" },\n0x014d: { n:\"RRInsertSh\" },\n0x014e: { n:\"RRDMoveBegin\" },\n0x014f: { n:\"RRDMoveEnd\" },\n0x0150: { n:\"RRDInsDelBegin\" },\n0x0151: { n:\"RRDInsDelEnd\" },\n0x0152: { n:\"RRDConflict\" },\n0x0153: { n:\"RRDDefName\" },\n0x0154: { n:\"RRDRstEtxp\" },\n0x015f: { n:\"LRng\" },\n0x0160: { n:\"UsesELFs\", f:parsebool },\n0x0161: { n:\"DSF\", f:parsenoop2 },\n0x0191: { n:\"CUsr\" },\n0x0192: { n:\"CbUsr\" },\n0x0193: { n:\"UsrInfo\" },\n0x0194: { n:\"UsrExcl\" },\n0x0195: { n:\"FileLock\" },\n0x0196: { n:\"RRDInfo\" },\n0x0197: { n:\"BCUsrs\" },\n0x0198: { n:\"UsrChk\" },\n0x01a9: { n:\"UserBView\" },\n0x01aa: { n:\"UserSViewBegin\" },\n0x01ab: { n:\"UserSViewEnd\" },\n0x01ac: { n:\"RRDUserView\" },\n0x01ad: { n:\"Qsi\" },\n0x01ae: { n:\"SupBook\", f:parse_SupBook },\n0x01af: { n:\"Prot4Rev\", f:parsebool },\n0x01b0: { n:\"CondFmt\" },\n0x01b1: { n:\"CF\" },\n0x01b2: { n:\"DVal\" },\n0x01b5: { n:\"DConBin\" },\n0x01b6: { n:\"TxO\", f:parse_TxO },\n0x01b7: { n:\"RefreshAll\", f:parsebool },\n0x01b8: { n:\"HLink\", f:parse_HLink },\n0x01b9: { n:\"Lel\" },\n0x01ba: { n:\"CodeName\", f:parse_XLUnicodeString },\n0x01bb: { n:\"SXFDBType\" },\n0x01bc: { n:\"Prot4RevPass\", f:parseuint16 },\n0x01bd: { n:\"ObNoMacros\" },\n0x01be: { n:\"Dv\" },\n0x01c0: { n:\"Excel9File\", f:parsenoop2 },\n0x01c1: { n:\"RecalcId\", f:parse_RecalcId, r:2},\n0x01c2: { n:\"EntExU2\", f:parsenoop2 },\n0x0200: { n:\"Dimensions\", f:parse_Dimensions },\n0x0201: { n:\"Blank\", f:parse_Blank },\n0x0203: { n:\"Number\", f:parse_Number },\n0x0204: { n:\"Label\", f:parse_Label },\n0x0205: { n:\"BoolErr\", f:parse_BoolErr },\n0x0207: { n:\"String\", f:parse_String },\n0x0208: { n:'Row', f:parse_Row },\n0x020b: { n:\"Index\" },\n0x0221: { n:\"Array\", f:parse_Array },\n0x0225: { n:\"DefaultRowHeight\", f:parse_DefaultRowHeight },\n0x0236: { n:\"Table\" },\n0x023e: { n:\"Window2\", f:parse_Window2 },\n0x027e: { n:\"RK\", f:parse_RK },\n0x0293: { n:\"Style\" },\n0x0418: { n:\"BigName\" },\n0x041e: { n:\"Format\", f:parse_Format },\n0x043c: { n:\"ContinueBigName\" },\n0x04bc: { n:\"ShrFmla\", f:parse_ShrFmla },\n0x0800: { n:\"HLinkTooltip\", f:parse_HLinkTooltip },\n0x0801: { n:\"WebPub\" },\n0x0802: { n:\"QsiSXTag\" },\n0x0803: { n:\"DBQueryExt\" },\n0x0804: { n:\"ExtString\" },\n0x0805: { n:\"TxtQry\" },\n0x0806: { n:\"Qsir\" },\n0x0807: { n:\"Qsif\" },\n0x0808: { n:\"RRDTQSIF\" },\n0x0809: { n:'BOF', f:parse_BOF },\n0x080a: { n:\"OleDbConn\" },\n0x080b: { n:\"WOpt\" },\n0x080c: { n:\"SXViewEx\" },\n0x080d: { n:\"SXTH\" },\n0x080e: { n:\"SXPIEx\" },\n0x080f: { n:\"SXVDTEx\" },\n0x0810: { n:\"SXViewEx9\" },\n0x0812: { n:\"ContinueFrt\" },\n0x0813: { n:\"RealTimeData\" },\n0x0850: { n:\"ChartFrtInfo\" },\n0x0851: { n:\"FrtWrapper\" },\n0x0852: { n:\"StartBlock\" },\n0x0853: { n:\"EndBlock\" },\n0x0854: { n:\"StartObject\" },\n0x0855: { n:\"EndObject\" },\n0x0856: { n:\"CatLab\" },\n0x0857: { n:\"YMult\" },\n0x0858: { n:\"SXViewLink\" },\n0x0859: { n:\"PivotChartBits\" },\n0x085a: { n:\"FrtFontList\" },\n0x0862: { n:\"SheetExt\" },\n0x0863: { n:\"BookExt\", r:12},\n0x0864: { n:\"SXAddl\" },\n0x0865: { n:\"CrErr\" },\n0x0866: { n:\"HFPicture\" },\n0x0867: { n:'FeatHdr', f:parsenoop2 },\n0x0868: { n:\"Feat\" },\n0x086a: { n:\"DataLabExt\" },\n0x086b: { n:\"DataLabExtContents\" },\n0x086c: { n:\"CellWatch\" },\n0x0871: { n:\"FeatHdr11\" },\n0x0872: { n:\"Feature11\" },\n0x0874: { n:\"DropDownObjIds\" },\n0x0875: { n:\"ContinueFrt11\" },\n0x0876: { n:\"DConn\" },\n0x0877: { n:\"List12\" },\n0x0878: { n:\"Feature12\" },\n0x0879: { n:\"CondFmt12\" },\n0x087a: { n:\"CF12\" },\n0x087b: { n:\"CFEx\" },\n0x087c: { n:\"XFCRC\", f:parse_XFCRC, r:12 },\n0x087d: { n:\"XFExt\", f:parse_XFExt, r:12 },\n0x087e: { n:\"AutoFilter12\" },\n0x087f: { n:\"ContinueFrt12\" },\n0x0884: { n:\"MDTInfo\" },\n0x0885: { n:\"MDXStr\" },\n0x0886: { n:\"MDXTuple\" },\n0x0887: { n:\"MDXSet\" },\n0x0888: { n:\"MDXProp\" },\n0x0889: { n:\"MDXKPI\" },\n0x088a: { n:\"MDB\" },\n0x088b: { n:\"PLV\" },\n0x088c: { n:\"Compat12\", f:parsebool, r:12 },\n0x088d: { n:\"DXF\" },\n0x088e: { n:\"TableStyles\", r:12 },\n0x088f: { n:\"TableStyle\" },\n0x0890: { n:\"TableStyleElement\" },\n0x0892: { n:\"StyleExt\" },\n0x0893: { n:\"NamePublish\" },\n0x0894: { n:\"NameCmt\", f:parse_NameCmt, r:12 },\n0x0895: { n:\"SortData\" },\n0x0896: { n:\"Theme\", f:parse_Theme, r:12 },\n0x0897: { n:\"GUIDTypeLib\" },\n0x0898: { n:\"FnGrp12\" },\n0x0899: { n:\"NameFnGrp12\" },\n0x089a: { n:\"MTRSettings\", f:parse_MTRSettings, r:12 },\n0x089b: { n:\"CompressPictures\", f:parsenoop2 },\n0x089c: { n:\"HeaderFooter\" },\n0x089d: { n:\"CrtLayout12\" },\n0x089e: { n:\"CrtMlFrt\" },\n0x089f: { n:\"CrtMlFrtContinue\" },\n0x08a3: { n:\"ForceFullCalculation\", f:parse_ForceFullCalculation },\n0x08a4: { n:\"ShapePropsStream\" },\n0x08a5: { n:\"TextPropsStream\" },\n0x08a6: { n:\"RichTextStream\" },\n0x08a7: { n:\"CrtLayout12A\" },\n0x1001: { n:\"Units\" },\n0x1002: { n:\"Chart\" },\n0x1003: { n:\"Series\" },\n0x1006: { n:\"DataFormat\" },\n0x1007: { n:\"LineFormat\" },\n0x1009: { n:\"MarkerFormat\" },\n0x100a: { n:\"AreaFormat\" },\n0x100b: { n:\"PieFormat\" },\n0x100c: { n:\"AttachedLabel\" },\n0x100d: { n:\"SeriesText\" },\n0x1014: { n:\"ChartFormat\" },\n0x1015: { n:\"Legend\" },\n0x1016: { n:\"SeriesList\" },\n0x1017: { n:\"Bar\" },\n0x1018: { n:\"Line\" },\n0x1019: { n:\"Pie\" },\n0x101a: { n:\"Area\" },\n0x101b: { n:\"Scatter\" },\n0x101c: { n:\"CrtLine\" },\n0x101d: { n:\"Axis\" },\n0x101e: { n:\"Tick\" },\n0x101f: { n:\"ValueRange\" },\n0x1020: { n:\"CatSerRange\" },\n0x1021: { n:\"AxisLine\" },\n0x1022: { n:\"CrtLink\" },\n0x1024: { n:\"DefaultText\" },\n0x1025: { n:\"Text\" },\n0x1026: { n:\"FontX\", f:parseuint16 },\n0x1027: { n:\"ObjectLink\" },\n0x1032: { n:\"Frame\" },\n0x1033: { n:\"Begin\" },\n0x1034: { n:\"End\" },\n0x1035: { n:\"PlotArea\" },\n0x103a: { n:\"Chart3d\" },\n0x103c: { n:\"PicF\" },\n0x103d: { n:\"DropBar\" },\n0x103e: { n:\"Radar\" },\n0x103f: { n:\"Surf\" },\n0x1040: { n:\"RadarArea\" },\n0x1041: { n:\"AxisParent\" },\n0x1043: { n:\"LegendException\" },\n0x1044: { n:\"ShtProps\", f:parse_ShtProps },\n0x1045: { n:\"SerToCrt\" },\n0x1046: { n:\"AxesUsed\" },\n0x1048: { n:\"SBaseRef\" },\n0x104a: { n:\"SerParent\" },\n0x104b: { n:\"SerAuxTrend\" },\n0x104e: { n:\"IFmtRecord\" },\n0x104f: { n:\"Pos\" },\n0x1050: { n:\"AlRuns\" },\n0x1051: { n:\"BRAI\" },\n0x105b: { n:\"SerAuxErrBar\" },\n0x105c: { n:\"ClrtClient\", f:parse_ClrtClient },\n0x105d: { n:\"SerFmt\" },\n0x105f: { n:\"Chart3DBarShape\" },\n0x1060: { n:\"Fbi\" },\n0x1061: { n:\"BopPop\" },\n0x1062: { n:\"AxcExt\" },\n0x1063: { n:\"Dat\" },\n0x1064: { n:\"PlotGrowth\" },\n0x1065: { n:\"SIIndex\" },\n0x1066: { n:\"GelFrame\" },\n0x1067: { n:\"BopPopCustom\" },\n0x1068: { n:\"Fbi2\" },\n\n0x0000: { n:\"Dimensions\", f:parse_Dimensions },\n0x0001: { n:\"BIFF2BLANK\" },\n0x0002: { n:\"BIFF2INT\", f:parse_BIFF2INT },\n0x0003: { n:\"BIFF2NUM\", f:parse_BIFF2NUM },\n0x0004: { n:\"BIFF2STR\", f:parse_BIFF2STR },\n0x0005: { n:\"BoolErr\", f:parse_BoolErr },\n0x0007: { n:\"String\", f:parse_BIFF2STRING },\n0x0008: { n:\"BIFF2ROW\" },\n0x0009: { n:'BOF', f:parse_BOF },\n0x000b: { n:\"Index\" },\n0x0016: { n:\"ExternCount\", f:parseuint16 },\n0x001e: { n:\"BIFF2FORMAT\", f:parse_BIFF2Format },\n0x001f: { n:\"BIFF2FMTCNT\" }, /* 16-bit cnt of BIFF2FORMAT records */\n0x0020: { n:\"BIFF2COLINFO\" },\n0x0021: { n:\"Array\", f:parse_Array },\n0x0024: { n:\"COLWIDTH\" },\n0x0025: { n:\"DefaultRowHeight\", f:parse_DefaultRowHeight },\n\t// 0x2c ??\n\t// 0x2d ??\n\t// 0x2e ??\n\t// 0x30 FONTCOUNT: number of fonts\n0x0032: { n:\"BIFF2FONTXTRA\", f:parse_BIFF2FONTXTRA },\n\t// 0x35: INFOOPTS\n\t// 0x36: TABLE (BIFF2 only)\n\t// 0x37: TABLE2 (BIFF2 only)\n\t// 0x38: WNDESK\n\t// 0x39 ??\n\t// 0x3a: BEGINPREF\n\t// 0x3b: ENDPREF\n0x003e: { n:\"BIFF2WINDOW2\" },\n\t// 0x3f ??\n\t// 0x46: SHOWSCROLL\n\t// 0x47: SHOWFORMULA\n\t// 0x48: STATUSBAR\n\t// 0x49: SHORTMENUS\n\t// 0x4A:\n\t// 0x4B:\n\t// 0x4C:\n\t// 0x4E:\n\t// 0x4F:\n\t// 0x58: TOOLBAR (BIFF3)\n\n\t/* - - - */\n0x0034: { n:\"DDEObjName\" },\n0x0043: { n:\"BIFF2XF\" },\n0x0044: { n:\"BIFF2XFINDEX\", f:parseuint16 },\n0x0045: { n:\"BIFF2FONTCLR\" },\n0x0056: { n:\"BIFF4FMTCNT\" }, /* 16-bit cnt, similar to BIFF2 */\n0x007e: { n:\"RK\" }, /* Not necessarily same as 0x027e */\n0x007f: { n:\"ImData\", f:parse_ImData },\n0x0087: { n:\"Addin\" },\n0x0088: { n:\"Edg\" },\n0x0089: { n:\"Pub\" },\n\t// 0x8A\n\t// 0x8B LH: alternate menu key flag (BIFF3/4)\n\t// 0x8E\n\t// 0x8F\n0x0091: { n:\"Sub\" },\n\t// 0x93 STYLE\n0x0094: { n:\"LHRecord\" },\n0x0095: { n:\"LHNGraph\" },\n0x0096: { n:\"Sound\" },\n\t// 0xA2 FNPROTO: function prototypes (BIFF4)\n\t// 0xA3\n\t// 0xA8\n0x00a9: { n:\"CoordList\" },\n0x00ab: { n:\"GCW\" },\n0x00bc: { n:\"ShrFmla\" }, /* Not necessarily same as 0x04bc */\n0x00bf: { n:\"ToolbarHdr\" },\n0x00c0: { n:\"ToolbarEnd\" },\n0x00c2: { n:\"AddMenu\" },\n0x00c3: { n:\"DelMenu\" },\n0x00d6: { n:\"RString\", f:parse_RString },\n0x00df: { n:\"UDDesc\" },\n0x00ea: { n:\"TabIdConf\" },\n0x0162: { n:\"XL5Modify\" },\n0x01a5: { n:\"FileSharing2\" },\n0x0206: { n:\"Formula\", f:parse_Formula },\n0x0209: { n:'BOF', f:parse_BOF },\n0x0218: { n:\"Lbl\", f:parse_Lbl },\n0x0223: { n:\"ExternName\", f:parse_ExternName },\n0x0231: { n:\"Font\" },\n0x0243: { n:\"BIFF3XF\" },\n0x0406: { n:\"Formula\", f:parse_Formula },\n0x0409: { n:'BOF', f:parse_BOF },\n0x0443: { n:\"BIFF4XF\" },\n0x086d: { n:\"FeatInfo\" },\n0x0873: { n:\"FeatInfo11\" },\n0x0881: { n:\"SXAddl12\" },\n0x08c0: { n:\"AutoWebPub\" },\n0x08c1: { n:\"ListObj\" },\n0x08c2: { n:\"ListField\" },\n0x08c3: { n:\"ListDV\" },\n0x08c4: { n:\"ListCondFmt\" },\n0x08c5: { n:\"ListCF\" },\n0x08c6: { n:\"FMQry\" },\n0x08c7: { n:\"FMSQry\" },\n0x08c8: { n:\"PLV\" },\n0x08c9: { n:\"LnExt\" },\n0x08ca: { n:\"MkrExt\" },\n0x08cb: { n:\"CrtCoopt\" },\n0x08d6: { n:\"FRTArchId$\", r:12 },\n\n0x7262: {}\n};\n\nvar XLSRE = evert_key(XLSRecordEnum, 'n');\nfunction write_biff_rec(ba, type, payload, length) {\n\tvar t = typeof type == \"number\" ? type : (+type || +XLSRE[type]);\n\tif(isNaN(t)) return;\n\tvar len = length || (payload||[]).length || 0;\n\tvar o = ba.next(4);\n\to.write_shift(2, t);\n\to.write_shift(2, len);\n\tif(len > 0 && is_buf(payload)) ba.push(payload);\n}\n\nfunction write_biff_continue(ba, type, payload, length) {\n\tvar len = length || (payload||[]).length || 0;\n\tif(len <= 8224) return write_biff_rec(ba, type, payload, len);\n\tvar t = +type || +XLSRE[type];\n\tif(isNaN(t)) return;\n\tvar parts = payload.parts || [], sidx = 0;\n\tvar i = 0, w = 0;\n\twhile(w + (parts[sidx] || 8224) <= 8224) { w+= (parts[sidx] || 8224); sidx++; }\n\tvar o = ba.next(4);\n\to.write_shift(2, t);\n\to.write_shift(2, w);\n\tba.push(payload.slice(i, i + w));\n\ti += w;\n\twhile(i < len) {\n\t\to = ba.next(4);\n\t\to.write_shift(2, 0x3c); // TODO: figure out correct continue type\n\t\tw = 0;\n\t\twhile(w + (parts[sidx] || 8224) <= 8224) { w+= (parts[sidx] || 8224); sidx++; }\n\t\to.write_shift(2, w);\n\t\tba.push(payload.slice(i, i+w)); i+= w;\n\t}\n}\n\nfunction write_BIFF2Cell(out, r, c) {\n\tif(!out) out = new_buf(7);\n\tout.write_shift(2, r);\n\tout.write_shift(2, c);\n\tout.write_shift(2, 0);\n\tout.write_shift(1, 0);\n\treturn out;\n}\n\nfunction write_BIFF2BERR(r, c, val, t) {\n\tvar out = new_buf(9);\n\twrite_BIFF2Cell(out, r, c);\n\twrite_Bes(val, t || 'b', out);\n\treturn out;\n}\n\n/* TODO: codepage, large strings */\nfunction write_BIFF2LABEL(r, c, val) {\n\tvar out = new_buf(8 + 2*val.length);\n\twrite_BIFF2Cell(out, r, c);\n\tout.write_shift(1, val.length);\n\tout.write_shift(val.length, val, 'sbcs');\n\treturn out.l < out.length ? out.slice(0, out.l) : out;\n}\n\nfunction write_ws_biff2_cell(ba, cell, R, C) {\n\tif(cell.v != null) switch(cell.t) {\n\t\tcase 'd': case 'n':\n\t\t\tvar v = cell.t == 'd' ? datenum(parseDate(cell.v)) : cell.v;\n\t\t\tif((v == (v|0)) && (v >= 0) && (v < 65536))\n\t\t\t\twrite_biff_rec(ba, 0x0002, write_BIFF2INT(R, C, v));\n\t\t\telse\n\t\t\t\twrite_biff_rec(ba, 0x0003, write_BIFF2NUM(R,C, v));\n\t\t\treturn;\n\t\tcase 'b': case 'e': write_biff_rec(ba, 0x0005, write_BIFF2BERR(R, C, cell.v, cell.t)); return;\n\t\t/* TODO: codepage, sst */\n\t\tcase 's': case 'str':\n\t\t\twrite_biff_rec(ba, 0x0004, write_BIFF2LABEL(R, C, (cell.v||\"\").slice(0,255)));\n\t\t\treturn;\n\t}\n\twrite_biff_rec(ba, 0x0001, write_BIFF2Cell(null, R, C));\n}\n\nfunction write_ws_biff2(ba, ws, idx, opts) {\n\tvar dense = Array.isArray(ws);\n\tvar range = safe_decode_range(ws['!ref'] || \"A1\"), ref, rr = \"\", cols = [];\n\tif(range.e.c > 0xFF || range.e.r > 0x3FFF) {\n\t\tif(opts.WTF) throw new Error(\"Range \" + (ws['!ref'] || \"A1\") + \" exceeds format limit A1:IV16384\");\n\t\trange.e.c = Math.min(range.e.c, 0xFF);\n\t\trange.e.r = Math.min(range.e.c, 0x3FFF);\n\t\tref = encode_range(range);\n\t}\n\tfor(var R = range.s.r; R <= range.e.r; ++R) {\n\t\trr = encode_row(R);\n\t\tfor(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\tif(R === range.s.r) cols[C] = encode_col(C);\n\t\t\tref = cols[C] + rr;\n\t\t\tvar cell = dense ? (ws[R]||[])[C] : ws[ref];\n\t\t\tif(!cell) continue;\n\t\t\t/* write cell */\n\t\t\twrite_ws_biff2_cell(ba, cell, R, C, opts);\n\t\t}\n\t}\n}\n\n/* Based on test files */\nfunction write_biff2_buf(wb, opts) {\n\tvar o = opts || {};\n\tif(DENSE != null && o.dense == null) o.dense = DENSE;\n\tvar ba = buf_array();\n\tvar idx = 0;\n\tfor(var i=0;i 0xFF || range.e.r >= MAX_ROWS) {\n\t\tif(opts.WTF) throw new Error(\"Range \" + (ws['!ref'] || \"A1\") + \" exceeds format limit A1:IV16384\");\n\t\trange.e.c = Math.min(range.e.c, 0xFF);\n\t\trange.e.r = Math.min(range.e.c, MAX_ROWS-1);\n\t}\n\n\twrite_biff_rec(ba, 0x0809, write_BOF(wb, 0x10, opts));\n\t/* [Uncalced] Index */\n\twrite_biff_rec(ba, \"CalcMode\", writeuint16(1));\n\twrite_biff_rec(ba, \"CalcCount\", writeuint16(100));\n\twrite_biff_rec(ba, \"CalcRefMode\", writebool(true));\n\twrite_biff_rec(ba, \"CalcIter\", writebool(false));\n\twrite_biff_rec(ba, \"CalcDelta\", write_Xnum(0.001));\n\twrite_biff_rec(ba, \"CalcSaveRecalc\", writebool(true));\n\twrite_biff_rec(ba, \"PrintRowCol\", writebool(false));\n\twrite_biff_rec(ba, \"PrintGrid\", writebool(false));\n\twrite_biff_rec(ba, \"GridSet\", writeuint16(1));\n\twrite_biff_rec(ba, \"Guts\", write_Guts([0,0]));\n\t/* DefaultRowHeight WsBool [Sync] [LPr] [HorizontalPageBreaks] [VerticalPageBreaks] */\n\t/* Header (string) */\n\t/* Footer (string) */\n\twrite_biff_rec(ba, \"HCenter\", writebool(false));\n\twrite_biff_rec(ba, \"VCenter\", writebool(false));\n\t/* ... */\n\tif(b8) write_ws_cols_biff8(ba, ws[\"!cols\"], ws);\n\t/* ... */\n\twrite_biff_rec(ba, 0x200, write_Dimensions(range, opts));\n\t/* ... */\n\n\tif(b8) ws['!links'] = [];\n\tfor(var R = range.s.r; R <= range.e.r; ++R) {\n\t\trr = encode_row(R);\n\t\tfor(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\tif(R === range.s.r) cols[C] = encode_col(C);\n\t\t\tref = cols[C] + rr;\n\t\t\tvar cell = dense ? (ws[R]||[])[C] : ws[ref];\n\t\t\tif(!cell) continue;\n\t\t\t/* write cell */\n\t\t\twrite_ws_biff8_cell(ba, cell, R, C, opts);\n\t\t\tif(b8 && cell.l) ws['!links'].push([ref, cell.l]);\n\t\t}\n\t}\n\tvar cname = _sheet.CodeName || _sheet.name || s;\n\t/* ... */\n\tif(b8) write_biff_rec(ba, \"Window2\", write_Window2((_WB.Views||[])[0]));\n\t/* ... */\n\tif(b8 && (ws['!merges']||[]).length) write_biff_rec(ba, \"MergeCells\", write_MergeCells(ws['!merges']));\n\t/* [LRng] *QUERYTABLE [PHONETICINFO] CONDFMTS */\n\tif(b8) write_ws_biff8_hlinks(ba, ws);\n\t/* [DVAL] */\n\twrite_biff_rec(ba, \"CodeName\", write_XLUnicodeString(cname, opts));\n\t/* *WebPub *CellWatch [SheetExt] */\n\tif(b8) write_FEAT(ba, ws);\n\t/* *FEAT11 *RECORD12 */\n\twrite_biff_rec(ba, \"EOF\");\n\treturn ba.end();\n}\n\n/* [MS-XLS] 2.1.7.20.3 */\nfunction write_biff8_global(wb, bufs, opts) {\n\tvar A = buf_array();\n\tvar _WB = ((wb||{}).Workbook||{});\n\tvar _sheets = (_WB.Sheets||[]);\n\tvar _wb = _WB.WBProps||{};\n\tvar b8 = opts.biff == 8, b5 = opts.biff == 5;\n\twrite_biff_rec(A, 0x0809, write_BOF(wb, 0x05, opts));\n\tif(opts.bookType == \"xla\") write_biff_rec(A, \"Addin\");\n\twrite_biff_rec(A, \"InterfaceHdr\", b8 ? writeuint16(0x04b0) : null);\n\twrite_biff_rec(A, \"Mms\", writezeroes(2));\n\tif(b5) write_biff_rec(A, \"ToolbarHdr\");\n\tif(b5) write_biff_rec(A, \"ToolbarEnd\");\n\twrite_biff_rec(A, \"InterfaceEnd\");\n\twrite_biff_rec(A, \"WriteAccess\", write_WriteAccess(\"SheetJS\", opts));\n\t/* [FileSharing] */\n\twrite_biff_rec(A, \"CodePage\", writeuint16(b8 ? 0x04b0 : 0x04E4));\n\t/* *2047 Lel */\n\tif(b8) write_biff_rec(A, \"DSF\", writeuint16(0));\n\tif(b8) write_biff_rec(A, \"Excel9File\");\n\twrite_biff_rec(A, \"RRTabId\", write_RRTabId(wb.SheetNames.length));\n\tif(b8 && wb.vbaraw) write_biff_rec(A, \"ObProj\");\n\t/* [ObNoMacros] */\n\tif(b8 && wb.vbaraw) {\n\t\tvar cname = _wb.CodeName || \"ThisWorkbook\";\n\t\twrite_biff_rec(A, \"CodeName\", write_XLUnicodeString(cname, opts));\n\t}\n\twrite_biff_rec(A, \"BuiltInFnGroupCount\", writeuint16(0x11));\n\t/* *FnGroupName *FnGrp12 */\n\t/* *Lbl */\n\t/* [OleObjectSize] */\n\twrite_biff_rec(A, \"WinProtect\", writebool(false));\n\twrite_biff_rec(A, \"Protect\", writebool(false));\n\twrite_biff_rec(A, \"Password\", writeuint16(0));\n\tif(b8) write_biff_rec(A, \"Prot4Rev\", writebool(false));\n\tif(b8) write_biff_rec(A, \"Prot4RevPass\", writeuint16(0));\n\twrite_biff_rec(A, \"Window1\", write_Window1(opts));\n\twrite_biff_rec(A, \"Backup\", writebool(false));\n\twrite_biff_rec(A, \"HideObj\", writeuint16(0));\n\twrite_biff_rec(A, \"Date1904\", writebool(safe1904(wb)==\"true\"));\n\twrite_biff_rec(A, \"CalcPrecision\", writebool(true));\n\tif(b8) write_biff_rec(A, \"RefreshAll\", writebool(false));\n\twrite_biff_rec(A, \"BookBool\", writeuint16(0));\n\t/* ... */\n\twrite_FONTS_biff8(A, wb, opts);\n\twrite_FMTS_biff8(A, wb.SSF, opts);\n\twrite_CELLXFS_biff8(A, opts);\n\t/* ... */\n\tif(b8) write_biff_rec(A, \"UsesELFs\", writebool(false));\n\tvar a = A.end();\n\n\tvar C = buf_array();\n\t/* METADATA [MTRSettings] [ForceFullCalculation] */\n\tif(b8) write_biff_rec(C, \"Country\", write_Country());\n\t/* *SUPBOOK *LBL *RTD [RecalcId] *HFPicture *MSODRAWINGGROUP */\n\n\t/* BIFF8: [SST *Continue] ExtSST */\n\tif(b8 && opts.Strings) write_biff_continue(C, \"SST\", write_SST(opts.Strings, opts));\n\n\t/* *WebPub [WOpt] [CrErr] [BookExt] *FeatHdr *DConn [THEME] [CompressPictures] [Compat12] [GUIDTypeLib] */\n\twrite_biff_rec(C, \"EOF\");\n\tvar c = C.end();\n\n\tvar B = buf_array();\n\tvar blen = 0, j = 0;\n\tfor(j = 0; j < wb.SheetNames.length; ++j) blen += (b8 ? 12 : 11) + (b8 ? 2 : 1) * wb.SheetNames[j].length;\n\tvar start = a.length + blen + c.length;\n\tfor(j = 0; j < wb.SheetNames.length; ++j) {\n\t\tvar _sheet = _sheets[j] || ({});\n\t\twrite_biff_rec(B, \"BoundSheet8\", write_BoundSheet8({pos:start, hs:_sheet.Hidden||0, dt:0, name:wb.SheetNames[j]}, opts));\n\t\tstart += bufs[j].length;\n\t}\n\t/* 1*BoundSheet8 */\n\tvar b = B.end();\n\tif(blen != b.length) throw new Error(\"BS8 \" + blen + \" != \" + b.length);\n\n\tvar out = [];\n\tif(a.length) out.push(a);\n\tif(b.length) out.push(b);\n\tif(c.length) out.push(c);\n\treturn __toBuffer([out]);\n}\n\n/* [MS-XLS] 2.1.7.20 Workbook Stream */\nfunction write_biff8_buf(wb, opts) {\n\tvar o = opts || {};\n\tvar bufs = [];\n\n\tif(wb && !wb.SSF) {\n\t\twb.SSF = SSF.get_table();\n\t}\n\tif(wb && wb.SSF) {\n\t\tmake_ssf(SSF); SSF.load_table(wb.SSF);\n\t\t// $FlowIgnore\n\t\to.revssf = evert_num(wb.SSF); o.revssf[wb.SSF[65535]] = 0;\n\t\to.ssf = wb.SSF;\n\t}\n\n\to.Strings = []; o.Strings.Count = 0; o.Strings.Unique = 0;\n\tfix_write_opts(o);\n\n\to.cellXfs = [];\n\tget_cell_style(o.cellXfs, {}, {revssf:{\"General\":0}});\n\n\tif(!wb.Props) wb.Props = {};\n\n\tfor(var i = 0; i < wb.SheetNames.length; ++i) bufs[bufs.length] = write_ws_biff8(i, o, wb);\n\tbufs.unshift(write_biff8_global(wb, bufs, o));\n\treturn __toBuffer([bufs]);\n}\n\nfunction write_biff_buf(wb, opts) {\n\tfor(var i = 0; i <= wb.SheetNames.length; ++i) {\n\t\tvar ws = wb.Sheets[wb.SheetNames[i]];\n\t\tif(!ws || !ws[\"!ref\"]) continue;\n\t\tvar range = decode_range(ws[\"!ref\"]);\n\t\tif(range.e.c > 255) { // note: 255 is IV\n\t\t console.error(\"Worksheet '\" + wb.SheetNames[i] + \"' extends beyond column IV (255). Data may be lost.\");\n\t\t}\n\t}\n\n\tvar o = opts || {};\n\tswitch(o.biff || 2) {\n\t\tcase 8: case 5: return write_biff8_buf(wb, opts);\n\t\tcase 4: case 3: case 2: return write_biff2_buf(wb, opts);\n\t}\n\tthrow new Error(\"invalid type \" + o.bookType + \" for BIFF\");\n}\n/* note: browser DOM element cannot see mso- style attrs, must parse */\nvar HTML_ = (function() {\n\tfunction html_to_sheet(str, _opts) {\n\t\tvar opts = _opts || {};\n\t\tif(DENSE != null && opts.dense == null) opts.dense = DENSE;\n\t\tvar ws = opts.dense ? ([]) : ({});\n\t\tstr = str.replace(//g, \"\");\n\t\tvar mtch = str.match(/\");\n\t\tvar mtch2 = str.match(/<\\/table/i);\n\t\tvar i = mtch.index, j = mtch2 && mtch2.index || str.length;\n\t\tvar rows = split_regex(str.slice(i, j), /(:?]*>)/i, \"\");\n\t\tvar R = -1, C = 0, RS = 0, CS = 0;\n\t\tvar range = {s:{r:10000000, c:10000000},e:{r:0,c:0}};\n\t\tvar merges = [];\n\t\tfor(i = 0; i < rows.length; ++i) {\n\t\t\tvar row = rows[i].trim();\n\t\t\tvar hd = row.slice(0,3).toLowerCase();\n\t\t\tif(hd == \"/i);\n\t\t\tfor(j = 0; j < cells.length; ++j) {\n\t\t\t\tvar cell = cells[j].trim();\n\t\t\t\tif(!cell.match(/\")) > -1) m = m.slice(cc+1);\n\t\t\t\tfor(var midx = 0; midx < merges.length; ++midx) {\n\t\t\t\t\tvar _merge = merges[midx];\n\t\t\t\t\tif(_merge.s.c == C && _merge.s.r < R && R <= _merge.e.r) { C = _merge.e.c + 1; midx = -1; }\n\t\t\t\t}\n\t\t\t\tvar tag = parsexmltag(cell.slice(0, cell.indexOf(\">\")));\n\t\t\t\tCS = tag.colspan ? +tag.colspan : 1;\n\t\t\t\tif((RS = +tag.rowspan)>1 || CS>1) merges.push({s:{r:R,c:C},e:{r:R + (RS||1) - 1, c:C + CS - 1}});\n\t\t\t\tvar _t = tag.t || tag[\"data-t\"] || \"\";\n\t\t\t\t/* TODO: generate stub cells */\n\t\t\t\tif(!m.length) { C += CS; continue; }\n\t\t\t\tm = htmldecode(m);\n\t\t\t\tif(range.s.r > R) range.s.r = R; if(range.e.r < R) range.e.r = R;\n\t\t\t\tif(range.s.c > C) range.s.c = C; if(range.e.c < C) range.e.c = C;\n\t\t\t\tif(!m.length) continue;\n\t\t\t\tvar o = {t:'s', v:m};\n\t\t\t\tif(opts.raw || !m.trim().length || _t == 's'){}\n\t\t\t\telse if(m === 'TRUE') o = {t:'b', v:true};\n\t\t\t\telse if(m === 'FALSE') o = {t:'b', v:false};\n\t\t\t\telse if(!isNaN(fuzzynum(m))) o = {t:'n', v:fuzzynum(m)};\n\t\t\t\telse if(!isNaN(fuzzydate(m).getDate())) {\n\t\t\t\t\to = ({t:'d', v:parseDate(m)});\n\t\t\t\t\tif(!opts.cellDates) o = ({t:'n', v:datenum(o.v)});\n\t\t\t\t\to.z = opts.dateNF || SSF._table[14];\n\t\t\t\t}\n\t\t\t\tif(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = o; }\n\t\t\t\telse ws[encode_cell({r:R, c:C})] = o;\n\t\t\t\tC += CS;\n\t\t\t}\n\t\t}\n\t\tws['!ref'] = encode_range(range);\n\t\tif(merges.length) ws[\"!merges\"] = merges;\n\t\treturn ws;\n\t}\n\tfunction html_to_book(str, opts) {\n\t\tvar mtch = str.match(/[\\s\\S]*?<\\/table>/gi);\n\t\tif(!mtch || mtch.length == 0) throw new Error(\"Invalid HTML: could not find
\");\n\t\tif(mtch.length == 1) return sheet_to_workbook(html_to_sheet(mtch[0], opts), opts);\n\t\tvar wb = utils.book_new();\n\t\tmtch.forEach(function(s, idx) { utils.book_append_sheet(wb, html_to_sheet(s, opts), \"Sheet\" + (idx+1)); });\n\t\treturn wb;\n\t}\n\tfunction make_html_row(ws, r, R, o) {\n\t\tvar M = (ws['!merges'] ||[]);\n\t\tvar oo = [];\n\t\tfor(var C = r.s.c; C <= r.e.c; ++C) {\n\t\t\tvar RS = 0, CS = 0;\n\t\t\tfor(var j = 0; j < M.length; ++j) {\n\t\t\t\tif(M[j].s.r > R || M[j].s.c > C) continue;\n\t\t\t\tif(M[j].e.r < R || M[j].e.c < C) continue;\n\t\t\t\tif(M[j].s.r < R || M[j].s.c < C) { RS = -1; break; }\n\t\t\t\tRS = M[j].e.r - M[j].s.r + 1; CS = M[j].e.c - M[j].s.c + 1; break;\n\t\t\t}\n\t\t\tif(RS < 0) continue;\n\t\t\tvar coord = encode_cell({r:R,c:C});\n\t\t\tvar cell = o.dense ? (ws[R]||[])[C] : ws[coord];\n\t\t\t/* TODO: html entities */\n\t\t\tvar w = (cell && cell.v != null) && (cell.h || escapehtml(cell.w || (format_cell(cell), cell.w) || \"\")) || \"\";\n\t\t\tvar sp = ({});\n\t\t\tif(RS > 1) sp.rowspan = RS;\n\t\t\tif(CS > 1) sp.colspan = CS;\n\t\t\tif(o.editable) w = '' + w + '';\n\t\t\telse if(cell) {\n\t\t\t\tsp[\"data-t\"] = cell && cell.t || 'z';\n\t\t\t\tif(cell.v != null) sp[\"data-v\"] = cell.v;\n\t\t\t\tif(cell.z != null) sp[\"data-z\"] = cell.z;\n\t\t\t\tif(cell.l && (cell.l.Target || \"#\").charAt(0) != \"#\") w = '' + w + '';\n\t\t\t}\n\t\t\tsp.id = (o.id || \"sjs\") + \"-\" + coord;\n\t\t\too.push(writextag('td', w, sp));\n\t\t}\n\t\tvar preamble = \"\";\n\t\treturn preamble + oo.join(\"\") + \"\";\n\t}\n\tfunction make_html_preamble(ws, R, o) {\n\t\tvar out = [];\n\t\treturn out.join(\"\") + '';\n\t}\n\tvar _BEGIN = 'SheetJS Table Export';\n\tvar _END = '';\n\tfunction sheet_to_html(ws, opts/*, wb:?Workbook*/) {\n\t\tvar o = opts || {};\n\t\tvar header = o.header != null ? o.header : _BEGIN;\n\t\tvar footer = o.footer != null ? o.footer : _END;\n\t\tvar out = [header];\n\t\tvar r = decode_range(ws['!ref']);\n\t\to.dense = Array.isArray(ws);\n\t\tout.push(make_html_preamble(ws, r, o));\n\t\tfor(var R = r.s.r; R <= r.e.r; ++R) out.push(make_html_row(ws, r, R, o));\n\t\tout.push(\"
\" + footer);\n\t\treturn out.join(\"\");\n\n\t}\n\treturn {\n\t\tto_workbook: html_to_book,\n\t\tto_sheet: html_to_sheet,\n\t\t_row: make_html_row,\n\t\tBEGIN: _BEGIN,\n\t\tEND: _END,\n\t\t_preamble: make_html_preamble,\n\t\tfrom_sheet: sheet_to_html\n\t};\n})();\n\nfunction sheet_add_dom(ws, table, _opts) {\n\tvar opts = _opts || {};\n\tif(DENSE != null) opts.dense = DENSE;\n\tvar or_R = 0, or_C = 0;\n\tif(opts.origin != null) {\n\t\tif(typeof opts.origin == 'number') or_R = opts.origin;\n\t\telse {\n\t\t\tvar _origin = typeof opts.origin == \"string\" ? decode_cell(opts.origin) : opts.origin;\n\t\t\tor_R = _origin.r; or_C = _origin.c;\n\t\t}\n\t}\n\tvar rows = table.getElementsByTagName('tr');\n\tvar sheetRows = Math.min(opts.sheetRows||10000000, rows.length);\n\tvar range = {s:{r:0,c:0},e:{r:or_R,c:or_C}};\n\tif(ws[\"!ref\"]) {\n\t\tvar _range = decode_range(ws[\"!ref\"]);\n\t\trange.s.r = Math.min(range.s.r, _range.s.r);\n\t\trange.s.c = Math.min(range.s.c, _range.s.c);\n\t\trange.e.r = Math.max(range.e.r, _range.e.r);\n\t\trange.e.c = Math.max(range.e.c, _range.e.c);\n\t\tif(or_R == -1) range.e.r = or_R = _range.e.r + 1;\n\t}\n\tvar merges = [], midx = 0;\n\tvar rowinfo = ws[\"!rows\"] || (ws[\"!rows\"] = []);\n\tvar _R = 0, R = 0, _C = 0, C = 0, RS = 0, CS = 0;\n\tif(!ws[\"!cols\"]) ws['!cols'] = [];\n\tfor(; _R < rows.length && R < sheetRows; ++_R) {\n\t\tvar row = rows[_R];\n\t\tif (is_dom_element_hidden(row)) {\n\t\t\tif (opts.display) continue;\n\t\t\trowinfo[R] = {hidden: true};\n\t\t}\n\t\tvar elts = (row.children);\n\t\tfor(_C = C = 0; _C < elts.length; ++_C) {\n\t\t\tvar elt = elts[_C];\n\t\t\tif (opts.display && is_dom_element_hidden(elt)) continue;\n\t\t\tvar v = elt.hasAttribute('data-v') ? elt.getAttribute('data-v') : elt.hasAttribute('v') ? elt.getAttribute('v') : htmldecode(elt.innerHTML);\n\t\t\tvar z = elt.getAttribute('data-z') || elt.getAttribute('z');\n\t\t\tfor(midx = 0; midx < merges.length; ++midx) {\n\t\t\t\tvar m = merges[midx];\n\t\t\t\tif(m.s.c == C + or_C && m.s.r < R + or_R && R + or_R <= m.e.r) { C = m.e.c+1 - or_C; midx = -1; }\n\t\t\t}\n\t\t\t/* TODO: figure out how to extract nonstandard mso- style */\n\t\t\tCS = +elt.getAttribute(\"colspan\") || 1;\n\t\t\tif( ((RS = (+elt.getAttribute(\"rowspan\") || 1)))>1 || CS>1) merges.push({s:{r:R + or_R,c:C + or_C},e:{r:R + or_R + (RS||1) - 1, c:C + or_C + (CS||1) - 1}});\n\t\t\tvar o = {t:'s', v:v};\n\t\t\tvar _t = elt.getAttribute(\"data-t\") || elt.getAttribute(\"t\") || \"\";\n\t\t\tif(v != null) {\n\t\t\t\tif(v.length == 0) o.t = _t || 'z';\n\t\t\t\telse if(opts.raw || v.trim().length == 0 || _t == \"s\"){}\n\t\t\t\telse if(v === 'TRUE') o = {t:'b', v:true};\n\t\t\t\telse if(v === 'FALSE') o = {t:'b', v:false};\n\t\t\t\telse if(!isNaN(fuzzynum(v))) o = {t:'n', v:fuzzynum(v)};\n\t\t\t\telse if(!isNaN(fuzzydate(v).getDate())) {\n\t\t\t\t\to = ({t:'d', v:parseDate(v)});\n\t\t\t\t\tif(!opts.cellDates) o = ({t:'n', v:datenum(o.v)});\n\t\t\t\t\to.z = opts.dateNF || SSF._table[14];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(o.z === undefined && z != null) o.z = z;\n\t\t\t/* The first link is used. Links are assumed to be fully specified.\n\t\t\t * TODO: The right way to process relative links is to make a new */\n\t\t\tvar l = \"\", Aelts = elt.getElementsByTagName(\"A\");\n\t\t\tif(Aelts && Aelts.length) for(var Aelti = 0; Aelti < Aelts.length; ++Aelti)\tif(Aelts[Aelti].hasAttribute(\"href\")) {\n\t\t\t\tl = Aelts[Aelti].getAttribute(\"href\"); if(l.charAt(0) != \"#\") break;\n\t\t\t}\n\t\t\tif(l && l.charAt(0) != \"#\") o.l = ({ Target: l });\n\t\t\tif(opts.dense) { if(!ws[R + or_R]) ws[R + or_R] = []; ws[R + or_R][C + or_C] = o; }\n\t\t\telse ws[encode_cell({c:C + or_C, r:R + or_R})] = o;\n\t\t\tif(range.e.c < C + or_C) range.e.c = C + or_C;\n\t\t\tC += CS;\n\t\t}\n\t\t++R;\n\t}\n\tif(merges.length) ws['!merges'] = (ws[\"!merges\"] || []).concat(merges);\n\trange.e.r = Math.max(range.e.r, R - 1 + or_R);\n\tws['!ref'] = encode_range(range);\n\tif(R >= sheetRows) ws['!fullref'] = encode_range((range.e.r = rows.length-_R+R-1 + or_R,range)); // We can count the real number of rows to parse but we don't to improve the performance\n\treturn ws;\n}\n\nfunction parse_dom_table(table, _opts) {\n\tvar opts = _opts || {};\n\tvar ws = opts.dense ? ([]) : ({});\n\treturn sheet_add_dom(ws, table, _opts);\n}\n\nfunction table_to_book(table, opts) {\n\treturn sheet_to_workbook(parse_dom_table(table, opts), opts);\n}\n\nfunction is_dom_element_hidden(element) {\n\tvar display = '';\n\tvar get_computed_style = get_get_computed_style_function(element);\n\tif(get_computed_style) display = get_computed_style(element).getPropertyValue('display');\n\tif(!display) display = element.style.display; // Fallback for cases when getComputedStyle is not available (e.g. an old browser or some Node.js environments) or doesn't work (e.g. if the element is not inserted to a document)\n\treturn display === 'none';\n}\n\n/* global getComputedStyle */\nfunction get_get_computed_style_function(element) {\n\t// The proper getComputedStyle implementation is the one defined in the element window\n\tif(element.ownerDocument.defaultView && typeof element.ownerDocument.defaultView.getComputedStyle === 'function') return element.ownerDocument.defaultView.getComputedStyle;\n\t// If it is not available, try to get one from the global namespace\n\tif(typeof getComputedStyle === 'function') return getComputedStyle;\n\treturn null;\n}\n/* OpenDocument */\nvar parse_content_xml = (function() {\n\n\tvar parse_text_p = function(text) {\n\t\t/* 6.1.2 White Space Characters */\n\t\tvar fixed = text\n\t\t\t.replace(/[\\t\\r\\n]/g, \" \").trim().replace(/ +/g, \" \")\n\t\t\t.replace(//g,\" \")\n\t\t\t.replace(//g, function($$,$1) { return Array(parseInt($1,10)+1).join(\" \"); })\n\t\t\t.replace(/]*\\/>/g,\"\\t\")\n\t\t\t.replace(//g,\"\\n\");\n\t\tvar v = unescapexml(fixed.replace(/<[^>]*>/g,\"\"));\n\n\t\treturn [v];\n\t};\n\n\tvar number_formats = {\n\t\t/* ods name: [short ssf fmt, long ssf fmt] */\n\t\tday: [\"d\", \"dd\"],\n\t\tmonth: [\"m\", \"mm\"],\n\t\tyear: [\"y\", \"yy\"],\n\t\thours: [\"h\", \"hh\"],\n\t\tminutes: [\"m\", \"mm\"],\n\t\tseconds: [\"s\", \"ss\"],\n\t\t\"am-pm\": [\"A/P\", \"AM/PM\"],\n\t\t\"day-of-week\": [\"ddd\", \"dddd\"],\n\t\tera: [\"e\", \"ee\"],\n\t\t/* there is no native representation of LO \"Q\" format */\n\t\tquarter: [\"\\\\Qm\", \"m\\\\\\\"th quarter\\\"\"]\n\t};\n\n\treturn function pcx(d, _opts) {\n\t\tvar opts = _opts || {};\n\t\tif(DENSE != null && opts.dense == null) opts.dense = DENSE;\n\t\tvar str = xlml_normalize(d);\n\t\tvar state = [], tmp;\n\t\tvar tag;\n\t\tvar NFtag = {name:\"\"}, NF = \"\", pidx = 0;\n\t\tvar sheetag;\n\t\tvar rowtag;\n\t\tvar Sheets = {}, SheetNames = [];\n\t\tvar ws = opts.dense ? ([]) : ({});\n\t\tvar Rn, q;\n\t\tvar ctag = ({value:\"\"});\n\t\tvar textp = \"\", textpidx = 0, textptag;\n\t\tvar textR = [];\n\t\tvar R = -1, C = -1, range = {s: {r:1000000,c:10000000}, e: {r:0, c:0}};\n\t\tvar row_ol = 0;\n\t\tvar number_format_map = {};\n\t\tvar merges = [], mrange = {}, mR = 0, mC = 0;\n\t\tvar rowinfo = [], rowpeat = 1, colpeat = 1;\n\t\tvar arrayf = [];\n\t\tvar WB = {Names:[]};\n\t\tvar atag = ({});\n\t\tvar _Ref = [\"\", \"\"];\n\t\tvar comments = [], comment = ({});\n\t\tvar creator = \"\", creatoridx = 0;\n\t\tvar isstub = false, intable = false;\n\t\tvar i = 0;\n\t\txlmlregex.lastIndex = 0;\n\t\tstr = str.replace(//mg,\"\").replace(//gm,\"\");\n\t\twhile((Rn = xlmlregex.exec(str))) switch((Rn[3]=Rn[3].replace(/_.*$/,\"\"))) {\n\n\t\t\tcase 'table': case '工作表': // 9.1.2 \n\t\t\t\tif(Rn[1]==='/') {\n\t\t\t\t\tif(range.e.c >= range.s.c && range.e.r >= range.s.r) ws['!ref'] = encode_range(range);\n\t\t\t\t\telse ws['!ref'] = \"A1:A1\";\n\t\t\t\t\tif(opts.sheetRows > 0 && opts.sheetRows <= range.e.r) {\n\t\t\t\t\t\tws['!fullref'] = ws['!ref'];\n\t\t\t\t\t\trange.e.r = opts.sheetRows - 1;\n\t\t\t\t\t\tws['!ref'] = encode_range(range);\n\t\t\t\t\t}\n\t\t\t\t\tif(merges.length) ws['!merges'] = merges;\n\t\t\t\t\tif(rowinfo.length) ws[\"!rows\"] = rowinfo;\n\t\t\t\t\tsheetag.name = sheetag['名称'] || sheetag.name;\n\t\t\t\t\tif(typeof JSON !== 'undefined') JSON.stringify(sheetag);\n\t\t\t\t\tSheetNames.push(sheetag.name);\n\t\t\t\t\tSheets[sheetag.name] = ws;\n\t\t\t\t\tintable = false;\n\t\t\t\t}\n\t\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') {\n\t\t\t\t\tsheetag = parsexmltag(Rn[0], false);\n\t\t\t\t\tR = C = -1;\n\t\t\t\t\trange.s.r = range.s.c = 10000000; range.e.r = range.e.c = 0;\n\t\t\t\t\tws = opts.dense ? ([]) : ({}); merges = [];\n\t\t\t\t\trowinfo = [];\n\t\t\t\t\tintable = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'table-row-group': // 9.1.9 \n\t\t\t\tif(Rn[1] === \"/\") --row_ol; else ++row_ol;\n\t\t\t\tbreak;\n\t\t\tcase 'table-row': case '行': // 9.1.3 \n\t\t\t\tif(Rn[1] === '/') { R+=rowpeat; rowpeat = 1; break; }\n\t\t\t\trowtag = parsexmltag(Rn[0], false);\n\t\t\t\tif(rowtag['行号']) R = rowtag['行号'] - 1; else if(R == -1) R = 0;\n\t\t\t\trowpeat = +rowtag['number-rows-repeated'] || 1;\n\t\t\t\t/* TODO: remove magic */\n\t\t\t\tif(rowpeat < 10) for(i = 0; i < rowpeat; ++i) if(row_ol > 0) rowinfo[R + i] = {level: row_ol};\n\t\t\t\tC = -1; break;\n\t\t\tcase 'covered-table-cell': // 9.1.5 \n\t\t\t\tif(Rn[1] !== '/') ++C;\n\t\t\t\tif(opts.sheetStubs) {\n\t\t\t\t\tif(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = {t:'z'}; }\n\t\t\t\t\telse ws[encode_cell({r:R,c:C})] = {t:'z'};\n\t\t\t\t}\n\t\t\t\ttextp = \"\"; textR = [];\n\t\t\t\tbreak; /* stub */\n\t\t\tcase 'table-cell': case '数据':\n\t\t\t\tif(Rn[0].charAt(Rn[0].length-2) === '/') {\n\t\t\t\t\t++C;\n\t\t\t\t\tctag = parsexmltag(Rn[0], false);\n\t\t\t\t\tcolpeat = parseInt(ctag['number-columns-repeated']||\"1\", 10);\n\t\t\t\t\tq = ({t:'z', v:null});\n\t\t\t\t\tif(ctag.formula && opts.cellFormula != false) q.f = ods_to_csf_formula(unescapexml(ctag.formula));\n\t\t\t\t\tif((ctag['数据类型'] || ctag['value-type']) == \"string\") {\n\t\t\t\t\t\tq.t = \"s\"; q.v = unescapexml(ctag['string-value'] || \"\");\n\t\t\t\t\t\tif(opts.dense) {\n\t\t\t\t\t\t\tif(!ws[R]) ws[R] = [];\n\t\t\t\t\t\t\tws[R][C] = q;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tws[encode_cell({r:R,c:C})] = q;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tC+= colpeat-1;\n\t\t\t\t} else if(Rn[1]!=='/') {\n\t\t\t\t\t++C;\n\t\t\t\t\ttextp = \"\"; textpidx = 0; textR = [];\n\t\t\t\t\tcolpeat = 1;\n\t\t\t\t\tvar rptR = rowpeat ? R + rowpeat - 1 : R;\n\t\t\t\t\tif(C > range.e.c) range.e.c = C;\n\t\t\t\t\tif(C < range.s.c) range.s.c = C;\n\t\t\t\t\tif(R < range.s.r) range.s.r = R;\n\t\t\t\t\tif(rptR > range.e.r) range.e.r = rptR;\n\t\t\t\t\tctag = parsexmltag(Rn[0], false);\n\t\t\t\t\tcomments = []; comment = ({});\n\t\t\t\t\tq = ({t:ctag['数据类型'] || ctag['value-type'], v:null});\n\t\t\t\t\tif(opts.cellFormula) {\n\t\t\t\t\t\tif(ctag.formula) ctag.formula = unescapexml(ctag.formula);\n\t\t\t\t\t\tif(ctag['number-matrix-columns-spanned'] && ctag['number-matrix-rows-spanned']) {\n\t\t\t\t\t\t\tmR = parseInt(ctag['number-matrix-rows-spanned'],10) || 0;\n\t\t\t\t\t\t\tmC = parseInt(ctag['number-matrix-columns-spanned'],10) || 0;\n\t\t\t\t\t\t\tmrange = {s: {r:R,c:C}, e:{r:R + mR-1,c:C + mC-1}};\n\t\t\t\t\t\t\tq.F = encode_range(mrange);\n\t\t\t\t\t\t\tarrayf.push([mrange, q.F]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(ctag.formula) q.f = ods_to_csf_formula(ctag.formula);\n\t\t\t\t\t\telse for(i = 0; i < arrayf.length; ++i)\n\t\t\t\t\t\t\tif(R >= arrayf[i][0].s.r && R <= arrayf[i][0].e.r)\n\t\t\t\t\t\t\t\tif(C >= arrayf[i][0].s.c && C <= arrayf[i][0].e.c)\n\t\t\t\t\t\t\t\t\tq.F = arrayf[i][1];\n\t\t\t\t\t}\n\t\t\t\t\tif(ctag['number-columns-spanned'] || ctag['number-rows-spanned']) {\n\t\t\t\t\t\tmR = parseInt(ctag['number-rows-spanned'],10) || 0;\n\t\t\t\t\t\tmC = parseInt(ctag['number-columns-spanned'],10) || 0;\n\t\t\t\t\t\tmrange = {s: {r:R,c:C}, e:{r:R + mR-1,c:C + mC-1}};\n\t\t\t\t\t\tmerges.push(mrange);\n\t\t\t\t\t}\n\n\t\t\t\t\t/* 19.675.2 table:number-columns-repeated */\n\t\t\t\t\tif(ctag['number-columns-repeated']) colpeat = parseInt(ctag['number-columns-repeated'], 10);\n\n\t\t\t\t\t/* 19.385 office:value-type */\n\t\t\t\t\tswitch(q.t) {\n\t\t\t\t\t\tcase 'boolean': q.t = 'b'; q.v = parsexmlbool(ctag['boolean-value']); break;\n\t\t\t\t\t\tcase 'float': q.t = 'n'; q.v = parseFloat(ctag.value); break;\n\t\t\t\t\t\tcase 'percentage': q.t = 'n'; q.v = parseFloat(ctag.value); break;\n\t\t\t\t\t\tcase 'currency': q.t = 'n'; q.v = parseFloat(ctag.value); break;\n\t\t\t\t\t\tcase 'date': q.t = 'd'; q.v = parseDate(ctag['date-value']);\n\t\t\t\t\t\t\tif(!opts.cellDates) { q.t = 'n'; q.v = datenum(q.v); }\n\t\t\t\t\t\t\tq.z = 'm/d/yy'; break;\n\t\t\t\t\t\tcase 'time': q.t = 'n'; q.v = parse_isodur(ctag['time-value'])/86400;\n\t\t\t\t\t\t\tif(opts.cellDates) { q.t = 'd'; q.v = numdate(q.v); }\n\t\t\t\t\t\t\tq.z = 'HH:MM:SS'; break;\n\t\t\t\t\t\tcase 'number': q.t = 'n'; q.v = parseFloat(ctag['数据数值']); break;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tif(q.t === 'string' || q.t === 'text' || !q.t) {\n\t\t\t\t\t\t\t\tq.t = 's';\n\t\t\t\t\t\t\t\tif(ctag['string-value'] != null) { textp = unescapexml(ctag['string-value']); textR = []; }\n\t\t\t\t\t\t\t} else throw new Error('Unsupported value type ' + q.t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tisstub = false;\n\t\t\t\t\tif(q.t === 's') {\n\t\t\t\t\t\tq.v = textp || '';\n\t\t\t\t\t\tif(textR.length) q.R = textR;\n\t\t\t\t\t\tisstub = textpidx == 0;\n\t\t\t\t\t}\n\t\t\t\t\tif(atag.Target) q.l = atag;\n\t\t\t\t\tif(comments.length > 0) { q.c = comments; comments = []; }\n\t\t\t\t\tif(textp && opts.cellText !== false) q.w = textp;\n\t\t\t\t\tif(isstub) { q.t = \"z\"; delete q.v; }\n\t\t\t\t\tif(!isstub || opts.sheetStubs) {\n\t\t\t\t\t\tif(!(opts.sheetRows && opts.sheetRows <= R)) {\n\t\t\t\t\t\t\tfor(var rpt = 0; rpt < rowpeat; ++rpt) {\n\t\t\t\t\t\t\t\tcolpeat = parseInt(ctag['number-columns-repeated']||\"1\", 10);\n\t\t\t\t\t\t\t\tif(opts.dense) {\n\t\t\t\t\t\t\t\t\tif(!ws[R + rpt]) ws[R + rpt] = [];\n\t\t\t\t\t\t\t\t\tws[R + rpt][C] = rpt == 0 ? q : dup(q);\n\t\t\t\t\t\t\t\t\twhile(--colpeat > 0) ws[R + rpt][C + colpeat] = dup(q);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tws[encode_cell({r:R + rpt,c:C})] = q;\n\t\t\t\t\t\t\t\t\twhile(--colpeat > 0) ws[encode_cell({r:R + rpt,c:C + colpeat})] = dup(q);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(range.e.c <= C) range.e.c = C;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcolpeat = parseInt(ctag['number-columns-repeated']||\"1\", 10);\n\t\t\t\t\tC += colpeat-1; colpeat = 0;\n\t\t\t\t\tq = {};\n\t\t\t\t\ttextp = \"\"; textR = [];\n\t\t\t\t}\n\t\t\t\tatag = ({});\n\t\t\t\tbreak; // 9.1.4 \n\n\t\t\t/* pure state */\n\t\t\tcase 'document': // TODO: is the root for FODS\n\t\t\tcase 'document-content': case '电子表格文档': // 3.1.3.2 \n\t\t\tcase 'spreadsheet': case '主体': // 3.7 \n\t\t\tcase 'scripts': // 3.12 \n\t\t\tcase 'styles': // TODO \n\t\t\tcase 'font-face-decls': // 3.14 \n\t\t\tcase 'master-styles': // 3.15.4 -- relevant for FODS\n\t\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;}\n\t\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);\n\t\t\t\tbreak;\n\n\t\t\tcase 'annotation': // 14.1 \n\t\t\t\tif(Rn[1]==='/'){\n\t\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;\n\t\t\t\t\tcomment.t = textp;\n\t\t\t\t\tif(textR.length) comment.R = textR;\n\t\t\t\t\tcomment.a = creator;\n\t\t\t\t\tcomments.push(comment);\n\t\t\t\t}\n\t\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') {state.push([Rn[3], false]);}\n\t\t\t\tcreator = \"\"; creatoridx = 0;\n\t\t\t\ttextp = \"\"; textpidx = 0; textR = [];\n\t\t\t\tbreak;\n\n\t\t\tcase 'creator': // 4.3.2.7 \n\t\t\t\tif(Rn[1]==='/') { creator = str.slice(creatoridx,Rn.index); }\n\t\t\t\telse creatoridx = Rn.index + Rn[0].length;\n\t\t\t\tbreak;\n\n\t\t\t/* ignore state */\n\t\t\tcase 'meta': case '元数据': // TODO: FODS/UOF\n\t\t\tcase 'settings': // TODO: \n\t\t\tcase 'config-item-set': // TODO: \n\t\t\tcase 'config-item-map-indexed': // TODO: \n\t\t\tcase 'config-item-map-entry': // TODO: \n\t\t\tcase 'config-item-map-named': // TODO: \n\t\t\tcase 'shapes': // 9.2.8 \n\t\t\tcase 'frame': // 10.4.2 \n\t\t\tcase 'text-box': // 10.4.3 \n\t\t\tcase 'image': // 10.4.4 \n\t\t\tcase 'data-pilot-tables': // 9.6.2 \n\t\t\tcase 'list-style': // 16.30 \n\t\t\tcase 'form': // 13.13 \n\t\t\tcase 'dde-links': // 9.8 \n\t\t\tcase 'event-listeners': // TODO\n\t\t\tcase 'chart': // TODO\n\t\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;}\n\t\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], false]);\n\t\t\t\ttextp = \"\"; textpidx = 0; textR = [];\n\t\t\t\tbreak;\n\n\t\t\tcase 'scientific-number': // TODO: \n\t\t\t\tbreak;\n\t\t\tcase 'currency-symbol': // TODO: \n\t\t\t\tbreak;\n\t\t\tcase 'currency-style': // TODO: \n\t\t\t\tbreak;\n\t\t\tcase 'number-style': // 16.27.2 \n\t\t\tcase 'percentage-style': // 16.27.9 \n\t\t\tcase 'date-style': // 16.27.10 \n\t\t\tcase 'time-style': // 16.27.18 \n\t\t\t\tif(Rn[1]==='/'){\n\t\t\t\t\tnumber_format_map[NFtag.name] = NF;\n\t\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;\n\t\t\t\t} else if(Rn[0].charAt(Rn[0].length-2) !== '/') {\n\t\t\t\t\tNF = \"\";\n\t\t\t\t\tNFtag = parsexmltag(Rn[0], false);\n\t\t\t\t\tstate.push([Rn[3], true]);\n\t\t\t\t} break;\n\n\t\t\tcase 'script': break; // 3.13 \n\t\t\tcase 'libraries': break; // TODO: \n\t\t\tcase 'automatic-styles': break; // 3.15.3 \n\n\t\t\tcase 'default-style': // TODO: \n\t\t\tcase 'page-layout': break; // TODO: \n\t\t\tcase 'style': // 16.2 \n\t\t\t\tbreak;\n\t\t\tcase 'map': break; // 16.3 \n\t\t\tcase 'font-face': break; // 16.21 \n\n\t\t\tcase 'paragraph-properties': break; // 17.6 \n\t\t\tcase 'table-properties': break; // 17.15 \n\t\t\tcase 'table-column-properties': break; // 17.16 \n\t\t\tcase 'table-row-properties': break; // 17.17 \n\t\t\tcase 'table-cell-properties': break; // 17.18 \n\n\t\t\tcase 'number': // 16.27.3 \n\t\t\t\tswitch(state[state.length-1][0]) {\n\t\t\t\t\tcase 'time-style':\n\t\t\t\t\tcase 'date-style':\n\t\t\t\t\t\ttag = parsexmltag(Rn[0], false);\n\t\t\t\t\t\tNF += number_formats[Rn[3]][tag.style==='long'?1:0]; break;\n\t\t\t\t} break;\n\n\t\t\tcase 'fraction': break; // TODO 16.27.6 \n\n\t\t\tcase 'day': // 16.27.11 \n\t\t\tcase 'month': // 16.27.12 \n\t\t\tcase 'year': // 16.27.13 \n\t\t\tcase 'era': // 16.27.14 \n\t\t\tcase 'day-of-week': // 16.27.15 \n\t\t\tcase 'week-of-year': // 16.27.16 \n\t\t\tcase 'quarter': // 16.27.17 \n\t\t\tcase 'hours': // 16.27.19 \n\t\t\tcase 'minutes': // 16.27.20 \n\t\t\tcase 'seconds': // 16.27.21 \n\t\t\tcase 'am-pm': // 16.27.22 \n\t\t\t\tswitch(state[state.length-1][0]) {\n\t\t\t\t\tcase 'time-style':\n\t\t\t\t\tcase 'date-style':\n\t\t\t\t\t\ttag = parsexmltag(Rn[0], false);\n\t\t\t\t\t\tNF += number_formats[Rn[3]][tag.style==='long'?1:0]; break;\n\t\t\t\t} break;\n\n\t\t\tcase 'boolean-style': break; // 16.27.23 \n\t\t\tcase 'boolean': break; // 16.27.24 \n\t\t\tcase 'text-style': break; // 16.27.25 \n\t\t\tcase 'text': // 16.27.26 \n\t\t\t\tif(Rn[0].slice(-2) === \"/>\") break;\n\t\t\t\telse if(Rn[1]===\"/\") switch(state[state.length-1][0]) {\n\t\t\t\t\tcase 'number-style':\n\t\t\t\t\tcase 'date-style':\n\t\t\t\t\tcase 'time-style':\n\t\t\t\t\t\tNF += str.slice(pidx, Rn.index);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse pidx = Rn.index + Rn[0].length;\n\t\t\t\tbreak;\n\n\t\t\tcase 'named-range': // 9.4.12 \n\t\t\t\ttag = parsexmltag(Rn[0], false);\n\t\t\t\t_Ref = ods_to_csf_3D(tag['cell-range-address']);\n\t\t\t\tvar nrange = ({Name:tag.name, Ref:_Ref[0] + '!' + _Ref[1]});\n\t\t\t\tif(intable) nrange.Sheet = SheetNames.length;\n\t\t\t\tWB.Names.push(nrange);\n\t\t\t\tbreak;\n\n\t\t\tcase 'text-content': break; // 16.27.27 \n\t\t\tcase 'text-properties': break; // 16.27.27 \n\t\t\tcase 'embedded-text': break; // 16.27.4 \n\n\t\t\tcase 'body': case '电子表格': break; // 3.3 16.9.6 19.726.3\n\n\t\t\tcase 'forms': break; // 12.25.2 13.2\n\t\t\tcase 'table-column': break; // 9.1.6 \n\t\t\tcase 'table-header-rows': break; // 9.1.7 \n\t\t\tcase 'table-rows': break; // 9.1.12 \n\t\t\t/* TODO: outline levels */\n\t\t\tcase 'table-column-group': break; // 9.1.10 \n\t\t\tcase 'table-header-columns': break; // 9.1.11 \n\t\t\tcase 'table-columns': break; // 9.1.12 \n\n\t\t\tcase 'null-date': break; // 9.4.2 TODO: date1904\n\n\t\t\tcase 'graphic-properties': break; // 17.21 \n\t\t\tcase 'calculation-settings': break; // 9.4.1 \n\t\t\tcase 'named-expressions': break; // 9.4.11 \n\t\t\tcase 'label-range': break; // 9.4.9 \n\t\t\tcase 'label-ranges': break; // 9.4.10 \n\t\t\tcase 'named-expression': break; // 9.4.13 \n\t\t\tcase 'sort': break; // 9.4.19 \n\t\t\tcase 'sort-by': break; // 9.4.20 \n\t\t\tcase 'sort-groups': break; // 9.4.22 \n\n\t\t\tcase 'tab': break; // 6.1.4 \n\t\t\tcase 'line-break': break; // 6.1.5 \n\t\t\tcase 'span': break; // 6.1.7 \n\t\t\tcase 'p': case '文本串': // 5.1.3 \n\t\t\t\tif(['master-styles'].indexOf(state[state.length-1][0]) > -1) break;\n\t\t\t\tif(Rn[1]==='/' && (!ctag || !ctag['string-value'])) {\n\t\t\t\t\tvar ptp = parse_text_p(str.slice(textpidx,Rn.index), textptag);\n\t\t\t\t\ttextp = (textp.length > 0 ? textp + \"\\n\" : \"\") + ptp[0];\n\t\t\t\t} else { textptag = parsexmltag(Rn[0], false); textpidx = Rn.index + Rn[0].length; }\n\t\t\t\tbreak; // \n\t\t\tcase 's': break; // \n\n\t\t\tcase 'database-range': // 9.4.15 \n\t\t\t\tif(Rn[1]==='/') break;\n\t\t\t\ttry {\n\t\t\t\t\t_Ref = ods_to_csf_3D(parsexmltag(Rn[0])['target-range-address']);\n\t\t\t\t\tSheets[_Ref[0]]['!autofilter'] = { ref:_Ref[1] };\n\t\t\t\t} catch(e) {/* empty */}\n\t\t\t\tbreak;\n\n\t\t\tcase 'date': break; // <*:date>\n\n\t\t\tcase 'object': break; // 10.4.6.2 \n\t\t\tcase 'title': case '标题': break; // <*:title> OR \n\t\t\tcase 'desc': break; // <*:desc>\n\t\t\tcase 'binary-data': break; // 10.4.5 TODO: b64 blob\n\n\t\t\t/* 9.2 Advanced Tables */\n\t\t\tcase 'table-source': break; // 9.2.6\n\t\t\tcase 'scenario': break; // 9.2.6\n\n\t\t\tcase 'iteration': break; // 9.4.3 \n\t\t\tcase 'content-validations': break; // 9.4.4 \n\t\t\tcase 'filter': break; // 9.5.2 \n\t\t\tcase 'filter-and': break; // 9.5.3 \n\t\t\tcase 'filter-or': break; // 9.5.4 \n\t\t\tcase 'filter-condition': break; // 9.5.5 \n\n\t\t\tcase 'list-level-style-bullet': break; // 16.31 \n\t\t\tcase 'page-count': break; // TODO \n\t\t\tcase 'time': break; // TODO \n\n\t\t\t/* 9.3 Advanced Table Cells */\n\t\t\tcase 'cell-range-source': break; // 9.3.1 \n\t\t\tcase 'property': break; // 13.8 \n\n\t\t\tcase 'a': // 6.1.8 hyperlink\n\t\t\t\tif(Rn[1]!== '/') {\n\t\t\t\t\tatag = parsexmltag(Rn[0], false);\n\t\t\t\t\tif(!atag.href) break;\n\t\t\t\t\tatag.Target = unescapexml(atag.href); delete atag.href;\n\t\t\t\t\tif(atag.Target.charAt(0) == \"#\" && atag.Target.indexOf(\".\") > -1) {\n\t\t\t\t\t\t_Ref = ods_to_csf_3D(atag.Target.slice(1));\n\t\t\t\t\t\tatag.Target = \"#\" + _Ref[0] + \"!\" + _Ref[1];\n\t\t\t\t\t} else if(atag.Target.match(/^\\.\\.[\\\\\\/]/)) atag.Target = atag.Target.slice(3);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\t/* non-standard */\n\t\t\tcase 'table-protection': break;\n\t\t\tcase 'data-pilot-grand-total': break; // ',\n\t\t\t'',\n\t\t\t\t'',\n\t\t\t\t'',\n\t\t\t\t'',\n\t\t\t\t'',\n\t\t\t'',\n\t\t''\n\t].join(\"\");\n\n\tvar payload = '' + master_styles + '';\n\n\treturn function wso() {\n\t\treturn XML_HEADER + payload;\n\t};\n})();\nvar write_content_ods = (function() {\n\t/* 6.1.2 White Space Characters */\n\tvar write_text_p = function(text) {\n\t\treturn escapexml(text)\n\t\t\t.replace(/ +/g, function($$){return '';})\n\t\t\t.replace(/\\t/g, \"\")\n\t\t\t.replace(/\\n/g, \"\")\n\t\t\t.replace(/^ /, \"\").replace(/ $/, \"\");\n\t};\n\n\tvar null_cell_xml = ' \\n';\n\tvar covered_cell_xml = ' \\n';\n\tvar write_ws = function(ws, wb, i) {\n\t\t/* Section 9 Tables */\n\t\tvar o = [];\n\t\to.push(' \\n');\n\t\tvar R=0,C=0, range = decode_range(ws['!ref']||\"A1\");\n\t\tvar marr = ws['!merges'] || [], mi = 0;\n\t\tvar dense = Array.isArray(ws);\n\t\tif(ws[\"!cols\"]) {\n\t\t\tfor(C = 0; C <= range.e.c; ++C) o.push(' \\n');\n\t\t}\n\t\tvar H = \"\", ROWS = ws[\"!rows\"]||[];\n\t\tfor(R = 0; R < range.s.r; ++R) {\n\t\t\tH = ROWS[R] ? ' table:style-name=\"ro' + ROWS[R].ods + '\"' : \"\";\n\t\t\to.push(' \\n');\n\t\t}\n\t\tfor(; R <= range.e.r; ++R) {\n\t\t\tH = ROWS[R] ? ' table:style-name=\"ro' + ROWS[R].ods + '\"' : \"\";\n\t\t\to.push(' \\n');\n\t\t\tfor(C=0; C < range.s.c; ++C) o.push(null_cell_xml);\n\t\t\tfor(; C <= range.e.c; ++C) {\n\t\t\t\tvar skip = false, ct = {}, textp = \"\";\n\t\t\t\tfor(mi = 0; mi != marr.length; ++mi) {\n\t\t\t\t\tif(marr[mi].s.c > C) continue;\n\t\t\t\t\tif(marr[mi].s.r > R) continue;\n\t\t\t\t\tif(marr[mi].e.c < C) continue;\n\t\t\t\t\tif(marr[mi].e.r < R) continue;\n\t\t\t\t\tif(marr[mi].s.c != C || marr[mi].s.r != R) skip = true;\n\t\t\t\t\tct['table:number-columns-spanned'] = (marr[mi].e.c - marr[mi].s.c + 1);\n\t\t\t\t\tct['table:number-rows-spanned'] = (marr[mi].e.r - marr[mi].s.r + 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(skip) { o.push(covered_cell_xml); continue; }\n\t\t\t\tvar ref = encode_cell({r:R, c:C}), cell = dense ? (ws[R]||[])[C]: ws[ref];\n\t\t\t\tif(cell && cell.f) {\n\t\t\t\t\tct['table:formula'] = escapexml(csf_to_ods_formula(cell.f));\n\t\t\t\t\tif(cell.F) {\n\t\t\t\t\t\tif(cell.F.slice(0, ref.length) == ref) {\n\t\t\t\t\t\t\tvar _Fref = decode_range(cell.F);\n\t\t\t\t\t\t\tct['table:number-matrix-columns-spanned'] = (_Fref.e.c - _Fref.s.c + 1);\n\t\t\t\t\t\t\tct['table:number-matrix-rows-spanned'] = (_Fref.e.r - _Fref.s.r + 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(!cell) { o.push(null_cell_xml); continue; }\n\t\t\t\tswitch(cell.t) {\n\t\t\t\t\tcase 'b':\n\t\t\t\t\t\ttextp = (cell.v ? 'TRUE' : 'FALSE');\n\t\t\t\t\t\tct['office:value-type'] = \"boolean\";\n\t\t\t\t\t\tct['office:boolean-value'] = (cell.v ? 'true' : 'false');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'n':\n\t\t\t\t\t\ttextp = (cell.w||String(cell.v||0));\n\t\t\t\t\t\tct['office:value-type'] = \"float\";\n\t\t\t\t\t\tct['office:value'] = (cell.v||0);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 's': case 'str':\n\t\t\t\t\t\ttextp = cell.v == null ? \"\" : cell.v;\n\t\t\t\t\t\tct['office:value-type'] = \"string\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'd':\n\t\t\t\t\t\ttextp = (cell.w||(parseDate(cell.v).toISOString()));\n\t\t\t\t\t\tct['office:value-type'] = \"date\";\n\t\t\t\t\t\tct['office:date-value'] = (parseDate(cell.v).toISOString());\n\t\t\t\t\t\tct['table:style-name'] = \"ce1\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t//case 'e':\n\t\t\t\t\tdefault: o.push(null_cell_xml); continue;\n\t\t\t\t}\n\t\t\t\tvar text_p = write_text_p(textp);\n\t\t\t\tif(cell.l && cell.l.Target) {\n\t\t\t\t\tvar _tgt = cell.l.Target;\n\t\t\t\t\t_tgt = _tgt.charAt(0) == \"#\" ? \"#\" + csf_to_ods_3D(_tgt.slice(1)) : _tgt;\n\t\t\t\t\t// TODO: choose correct parent path format based on link delimiters\n\t\t\t\t\tif(_tgt.charAt(0) != \"#\" && !_tgt.match(/^\\w+:/)) _tgt = '../' + _tgt;\n\t\t\t\t\ttext_p = writextag('text:a', text_p, {'xlink:href': _tgt.replace(/&/g, \"&\")});\n\t\t\t\t}\n\t\t\t\to.push(' ' + writextag('table:table-cell', writextag('text:p', text_p, {}), ct) + '\\n');\n\t\t\t}\n\t\t\to.push(' \\n');\n\t\t}\n\t\to.push(' \\n');\n\t\treturn o.join(\"\");\n\t};\n\n\tvar write_automatic_styles_ods = function(o, wb) {\n\t\to.push(' \\n');\n\n\t\to.push(' \\n');\n\t\to.push(' \\n');\n\t\to.push(' /\\n');\n\t\to.push(' \\n');\n\t\to.push(' /\\n');\n\t\to.push(' \\n');\n\t\to.push(' \\n');\n\n\t\t/* column styles */\n\t\tvar cidx = 0;\n\t\twb.SheetNames.map(function(n) { return wb.Sheets[n]; }).forEach(function(ws) {\n\t\t\tif(!ws) return;\n\t\t\tif(ws[\"!cols\"]) {\n\t\t\t\tfor(var C = 0; C < ws[\"!cols\"].length; ++C) if(ws[\"!cols\"][C]) {\n\t\t\t\t\tvar colobj = ws[\"!cols\"][C];\n\t\t\t\t\tif(colobj.width == null && colobj.wpx == null && colobj.wch == null) continue;\n\t\t\t\t\tprocess_col(colobj);\n\t\t\t\t\tcolobj.ods = cidx;\n\t\t\t\t\tvar w = ws[\"!cols\"][C].wpx + \"px\";\n\t\t\t\t\to.push(' \\n');\n\t\t\t\t\to.push(' \\n');\n\t\t\t\t\to.push(' \\n');\n\t\t\t\t\t++cidx;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t/* row styles */\n\t\tvar ridx = 0;\n\t\twb.SheetNames.map(function(n) { return wb.Sheets[n]; }).forEach(function(ws) {\n\t\t\tif(!ws) return;\n\t\t\tif(ws[\"!rows\"]) {\n\t\t\t\tfor(var R = 0; R < ws[\"!rows\"].length; ++R) if(ws[\"!rows\"][R]) {\n\t\t\t\t\tws[\"!rows\"][R].ods = ridx;\n\t\t\t\t\tvar h = ws[\"!rows\"][R].hpx + \"px\";\n\t\t\t\t\to.push(' \\n');\n\t\t\t\t\to.push(' \\n');\n\t\t\t\t\to.push(' \\n');\n\t\t\t\t\t++ridx;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t/* table */\n\t\to.push(' \\n');\n\t\to.push(' \\n');\n\t\to.push(' \\n');\n\n\t\t/* table cells, text */\n\t\to.push(' \\n');\n\n\t\t/* page-layout */\n\n\t\to.push(' \\n');\n\t};\n\n\treturn function wcx(wb, opts) {\n\t\tvar o = [XML_HEADER];\n\t\t/* 3.1.3.2 */\n\t\tvar attr = wxt_helper({\n\t\t\t'xmlns:office': \"urn:oasis:names:tc:opendocument:xmlns:office:1.0\",\n\t\t\t'xmlns:table': \"urn:oasis:names:tc:opendocument:xmlns:table:1.0\",\n\t\t\t'xmlns:style': \"urn:oasis:names:tc:opendocument:xmlns:style:1.0\",\n\t\t\t'xmlns:text': \"urn:oasis:names:tc:opendocument:xmlns:text:1.0\",\n\t\t\t'xmlns:draw': \"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0\",\n\t\t\t'xmlns:fo': \"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0\",\n\t\t\t'xmlns:xlink': \"http://www.w3.org/1999/xlink\",\n\t\t\t'xmlns:dc': \"http://purl.org/dc/elements/1.1/\",\n\t\t\t'xmlns:meta': \"urn:oasis:names:tc:opendocument:xmlns:meta:1.0\",\n\t\t\t'xmlns:number': \"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0\",\n\t\t\t'xmlns:presentation': \"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0\",\n\t\t\t'xmlns:svg': \"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0\",\n\t\t\t'xmlns:chart': \"urn:oasis:names:tc:opendocument:xmlns:chart:1.0\",\n\t\t\t'xmlns:dr3d': \"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0\",\n\t\t\t'xmlns:math': \"http://www.w3.org/1998/Math/MathML\",\n\t\t\t'xmlns:form': \"urn:oasis:names:tc:opendocument:xmlns:form:1.0\",\n\t\t\t'xmlns:script': \"urn:oasis:names:tc:opendocument:xmlns:script:1.0\",\n\t\t\t'xmlns:ooo': \"http://openoffice.org/2004/office\",\n\t\t\t'xmlns:ooow': \"http://openoffice.org/2004/writer\",\n\t\t\t'xmlns:oooc': \"http://openoffice.org/2004/calc\",\n\t\t\t'xmlns:dom': \"http://www.w3.org/2001/xml-events\",\n\t\t\t'xmlns:xforms': \"http://www.w3.org/2002/xforms\",\n\t\t\t'xmlns:xsd': \"http://www.w3.org/2001/XMLSchema\",\n\t\t\t'xmlns:xsi': \"http://www.w3.org/2001/XMLSchema-instance\",\n\t\t\t'xmlns:sheet': \"urn:oasis:names:tc:opendocument:sh33tjs:1.0\",\n\t\t\t'xmlns:rpt': \"http://openoffice.org/2005/report\",\n\t\t\t'xmlns:of': \"urn:oasis:names:tc:opendocument:xmlns:of:1.2\",\n\t\t\t'xmlns:xhtml': \"http://www.w3.org/1999/xhtml\",\n\t\t\t'xmlns:grddl': \"http://www.w3.org/2003/g/data-view#\",\n\t\t\t'xmlns:tableooo': \"http://openoffice.org/2009/table\",\n\t\t\t'xmlns:drawooo': \"http://openoffice.org/2010/draw\",\n\t\t\t'xmlns:calcext': \"urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0\",\n\t\t\t'xmlns:loext': \"urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0\",\n\t\t\t'xmlns:field': \"urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0\",\n\t\t\t'xmlns:formx': \"urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0\",\n\t\t\t'xmlns:css3t': \"http://www.w3.org/TR/css3-text/\",\n\t\t\t'office:version': \"1.2\"\n\t\t});\n\n\t\tvar fods = wxt_helper({\n\t\t\t'xmlns:config': \"urn:oasis:names:tc:opendocument:xmlns:config:1.0\",\n\t\t\t'office:mimetype': \"application/vnd.oasis.opendocument.spreadsheet\"\n\t\t});\n\n\t\tif(opts.bookType == \"fods\") {\n\t\t\to.push('\\n');\n\t\t\to.push(write_meta_ods().replace(/office:document-meta/g, \"office:meta\"));\n\t\t\t// TODO: settings (equiv of settings.xml for ODS)\n\t\t} else o.push('\\n');\n\t\t// o.push(' \\n');\n\t\twrite_automatic_styles_ods(o, wb);\n\t\to.push(' \\n');\n\t\to.push(' \\n');\n\t\tfor(var i = 0; i != wb.SheetNames.length; ++i) o.push(write_ws(wb.Sheets[wb.SheetNames[i]], wb, i, opts));\n\t\to.push(' \\n');\n\t\to.push(' \\n');\n\t\tif(opts.bookType == \"fods\") o.push('
');\n\t\telse o.push('');\n\t\treturn o.join(\"\");\n\t};\n})();\n\nfunction write_ods(wb, opts) {\n\tif(opts.bookType == \"fods\") return write_content_ods(wb, opts);\n\n\tvar zip = zip_new();\n\tvar f = \"\";\n\n\tvar manifest = [];\n\tvar rdf = [];\n\n\t/* Part 3 Section 3.3 MIME Media Type */\n\tf = \"mimetype\";\n\tzip_add_file(zip, f, \"application/vnd.oasis.opendocument.spreadsheet\");\n\n\t/* Part 1 Section 2.2 Documents */\n\tf = \"content.xml\";\n\tzip_add_file(zip, f, write_content_ods(wb, opts));\n\tmanifest.push([f, \"text/xml\"]);\n\trdf.push([f, \"ContentFile\"]);\n\n\t/* TODO: these are hard-coded styles to satiate excel */\n\tf = \"styles.xml\";\n\tzip_add_file(zip, f, write_styles_ods(wb, opts));\n\tmanifest.push([f, \"text/xml\"]);\n\trdf.push([f, \"StylesFile\"]);\n\n\t/* TODO: this is hard-coded to satiate excel */\n\tf = \"meta.xml\";\n\tzip_add_file(zip, f, XML_HEADER + write_meta_ods());\n\tmanifest.push([f, \"text/xml\"]);\n\trdf.push([f, \"MetadataFile\"]);\n\n\t/* Part 3 Section 6 Metadata Manifest File */\n\tf = \"manifest.rdf\";\n\tzip_add_file(zip, f, write_rdf(rdf/*, opts*/));\n\tmanifest.push([f, \"application/rdf+xml\"]);\n\n\t/* Part 3 Section 4 Manifest File */\n\tf = \"META-INF/manifest.xml\";\n\tzip_add_file(zip, f, write_manifest(manifest/*, opts*/));\n\n\treturn zip;\n}\n\nfunction write_sheet_index(wb, sheet) {\n\tif(!sheet) return 0;\n\tvar idx = wb.SheetNames.indexOf(sheet);\n\tif(idx == -1) throw new Error(\"Sheet not found: \" + sheet);\n\treturn idx;\n}\n\nfunction write_obj_str(factory) {\n\treturn function write_str(wb, o) {\n\t\tvar idx = write_sheet_index(wb, o.sheet);\n\t\treturn factory.from_sheet(wb.Sheets[wb.SheetNames[idx]], o, wb);\n\t};\n}\n\nvar write_htm_str = write_obj_str(HTML_);\nvar write_csv_str = write_obj_str({from_sheet:sheet_to_csv});\nvar write_slk_str = write_obj_str(typeof SYLK !== \"undefined\" ? SYLK : {});\nvar write_dif_str = write_obj_str(typeof DIF !== \"undefined\" ? DIF : {});\nvar write_prn_str = write_obj_str(typeof PRN !== \"undefined\" ? PRN : {});\nvar write_rtf_str = write_obj_str(typeof RTF !== \"undefined\" ? RTF : {});\nvar write_txt_str = write_obj_str({from_sheet:sheet_to_txt});\nvar write_dbf_buf = write_obj_str(typeof DBF !== \"undefined\" ? DBF : {});\nvar write_eth_str = write_obj_str(typeof ETH !== \"undefined\" ? ETH : {});\nvar write_wk1_buf = write_obj_str(typeof WK_ !== \"undefined\" ? {from_sheet:WK_.sheet_to_wk1} : {});\n\nfunction fix_opts_func(defaults) {\n\treturn function fix_opts(opts) {\n\t\tfor(var i = 0; i != defaults.length; ++i) {\n\t\t\tvar d = defaults[i];\n\t\t\tif(opts[d[0]] === undefined) opts[d[0]] = d[1];\n\t\t\tif(d[2] === 'n') opts[d[0]] = Number(opts[d[0]]);\n\t\t}\n\t};\n}\n\nvar fix_read_opts = function(opts) {\nfix_opts_func([\n\t['cellNF', false], /* emit cell number format string as .z */\n\t['cellHTML', true], /* emit html string as .h */\n\t['cellFormula', true], /* emit formulae as .f */\n\t['cellStyles', false], /* emits style/theme as .s */\n\t['cellText', true], /* emit formatted text as .w */\n\t['cellDates', false], /* emit date cells with type `d` */\n\n\t['sheetStubs', false], /* emit empty cells */\n\t['sheetRows', 0, 'n'], /* read n rows (0 = read all rows) */\n\n\t['bookDeps', false], /* parse calculation chains */\n\t['bookSheets', false], /* only try to get sheet names (no Sheets) */\n\t['bookProps', false], /* only try to get properties (no Sheets) */\n\t['bookFiles', false], /* include raw file structure (keys, files, cfb) */\n\t['bookVBA', false], /* include vba raw data (vbaraw) */\n\n\t['password',''], /* password */\n\t['WTF', false] /* WTF mode (throws errors) */\n])(opts);\n};\n\nvar fix_write_opts = fix_opts_func([\n\t['cellDates', false], /* write date cells with type `d` */\n\n\t['bookSST', false], /* Generate Shared String Table */\n\n\t['bookType', 'xlsx'], /* Type of workbook (xlsx/m/b) */\n\n\t['compression', false], /* Use file compression */\n\n\t['WTF', false] /* WTF mode (throws errors) */\n]);\nfunction get_sheet_type(n) {\n\tif(RELS.WS.indexOf(n) > -1) return \"sheet\";\n\tif(RELS.CS && n == RELS.CS) return \"chart\";\n\tif(RELS.DS && n == RELS.DS) return \"dialog\";\n\tif(RELS.MS && n == RELS.MS) return \"macro\";\n\treturn (n && n.length) ? n : \"sheet\";\n}\nfunction safe_parse_wbrels(wbrels, sheets) {\n\tif(!wbrels) return 0;\n\ttry {\n\t\twbrels = sheets.map(function pwbr(w) { if(!w.id) w.id = w.strRelID; return [w.name, wbrels['!id'][w.id].Target, get_sheet_type(wbrels['!id'][w.id].Type)]; });\n\t} catch(e) { return null; }\n\treturn !wbrels || wbrels.length === 0 ? null : wbrels;\n}\n\nfunction safe_parse_sheet(zip, path, relsPath, sheet, idx, sheetRels, sheets, stype, opts, wb, themes, styles) {\n\ttry {\n\t\tsheetRels[sheet]=parse_rels(getzipstr(zip, relsPath, true), path);\n\t\tvar data = getzipdata(zip, path);\n\t\tvar _ws;\n\t\tswitch(stype) {\n\t\t\tcase 'sheet': _ws = parse_ws(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break;\n\t\t\tcase 'chart': _ws = parse_cs(data, path, idx, opts, sheetRels[sheet], wb, themes, styles);\n\t\t\t\tif(!_ws || !_ws['!drawel']) break;\n\t\t\t\tvar dfile = resolve_path(_ws['!drawel'].Target, path);\n\t\t\t\tvar drelsp = get_rels_path(dfile);\n\t\t\t\tvar draw = parse_drawing(getzipstr(zip, dfile, true), parse_rels(getzipstr(zip, drelsp, true), dfile));\n\t\t\t\tvar chartp = resolve_path(draw, dfile);\n\t\t\t\tvar crelsp = get_rels_path(chartp);\n\t\t\t\t_ws = parse_chart(getzipstr(zip, chartp, true), chartp, opts, parse_rels(getzipstr(zip, crelsp, true), chartp), wb, _ws);\n\t\t\t\tbreak;\n\t\t\tcase 'macro': _ws = parse_ms(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break;\n\t\t\tcase 'dialog': _ws = parse_ds(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break;\n\t\t\tdefault: throw new Error(\"Unrecognized sheet type \" + stype);\n\t\t}\n\t\tsheets[sheet] = _ws;\n\n\t\t/* scan rels for comments */\n\t\tvar comments = [];\n\t\tif(sheetRels && sheetRels[sheet]) keys(sheetRels[sheet]).forEach(function(n) {\n\t\t\tif(sheetRels[sheet][n].Type == RELS.CMNT) {\n\t\t\t\tvar dfile = resolve_path(sheetRels[sheet][n].Target, path);\n\t\t\t\tcomments = parse_cmnt(getzipdata(zip, dfile, true), dfile, opts);\n\t\t\t\tif(!comments || !comments.length) return;\n\t\t\t\tsheet_insert_comments(_ws, comments);\n\t\t\t}\n\t\t});\n\t} catch(e) { if(opts.WTF) throw e; }\n}\n\nfunction strip_front_slash(x) { return x.charAt(0) == '/' ? x.slice(1) : x; }\n\nfunction parse_zip(zip, opts) {\n\tmake_ssf(SSF);\n\topts = opts || {};\n\tfix_read_opts(opts);\n\n\t/* OpenDocument Part 3 Section 2.2.1 OpenDocument Package */\n\tif(safegetzipfile(zip, 'META-INF/manifest.xml')) return parse_ods(zip, opts);\n\t/* UOC */\n\tif(safegetzipfile(zip, 'objectdata.xml')) return parse_ods(zip, opts);\n\t/* Numbers */\n\tif(safegetzipfile(zip, 'Index/Document.iwa')) throw new Error('Unsupported NUMBERS file');\n\tif(!safegetzipfile(zip, '[Content_Types].xml')) {\n\t\tif(safegetzipfile(zip, 'index.xml.gz')) throw new Error('Unsupported NUMBERS 08 file');\n\t\tif(safegetzipfile(zip, 'index.xml')) throw new Error('Unsupported NUMBERS 09 file');\n\t\tthrow new Error('Unsupported ZIP file');\n\t}\n\n\tvar entries = zipentries(zip);\n\tvar dir = parse_ct((getzipstr(zip, '[Content_Types].xml')));\n\tvar xlsb = false;\n\tvar sheets, binname;\n\tif(dir.workbooks.length === 0) {\n\t\tbinname = \"xl/workbook.xml\";\n\t\tif(getzipdata(zip,binname, true)) dir.workbooks.push(binname);\n\t}\n\tif(dir.workbooks.length === 0) {\n\t\tbinname = \"xl/workbook.bin\";\n\t\tif(!getzipdata(zip,binname,true)) throw new Error(\"Could not find workbook\");\n\t\tdir.workbooks.push(binname);\n\t\txlsb = true;\n\t}\n\tif(dir.workbooks[0].slice(-3) == \"bin\") xlsb = true;\n\n\tvar themes = ({});\n\tvar styles = ({});\n\tif(!opts.bookSheets && !opts.bookProps) {\n\t\tstrs = [];\n\t\tif(dir.sst) try { strs=parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts); } catch(e) { if(opts.WTF) throw e; }\n\n\t\tif(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\\//,''), true)||\"\",dir.themes[0], opts);\n\n\t\tif(dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);\n\t}\n\n\t/*var externbooks = */dir.links.map(function(link) {\n\t\ttry {\n\t\t\tvar rels = parse_rels(getzipstr(zip, get_rels_path(strip_front_slash(link))), link);\n\t\t\treturn parse_xlink(getzipdata(zip, strip_front_slash(link)), rels, link, opts);\n\t\t} catch(e) {}\n\t});\n\n\tvar wb = parse_wb(getzipdata(zip, strip_front_slash(dir.workbooks[0])), dir.workbooks[0], opts);\n\n\tvar props = {}, propdata = \"\";\n\n\tif(dir.coreprops.length) {\n\t\tpropdata = getzipdata(zip, strip_front_slash(dir.coreprops[0]), true);\n\t\tif(propdata) props = parse_core_props(propdata);\n\t\tif(dir.extprops.length !== 0) {\n\t\t\tpropdata = getzipdata(zip, strip_front_slash(dir.extprops[0]), true);\n\t\t\tif(propdata) parse_ext_props(propdata, props, opts);\n\t\t}\n\t}\n\n\tvar custprops = {};\n\tif(!opts.bookSheets || opts.bookProps) {\n\t\tif (dir.custprops.length !== 0) {\n\t\t\tpropdata = getzipstr(zip, strip_front_slash(dir.custprops[0]), true);\n\t\t\tif(propdata) custprops = parse_cust_props(propdata, opts);\n\t\t}\n\t}\n\n\tvar out = ({});\n\tif(opts.bookSheets || opts.bookProps) {\n\t\tif(wb.Sheets) sheets = wb.Sheets.map(function pluck(x){ return x.name; });\n\t\telse if(props.Worksheets && props.SheetNames.length > 0) sheets=props.SheetNames;\n\t\tif(opts.bookProps) { out.Props = props; out.Custprops = custprops; }\n\t\tif(opts.bookSheets && typeof sheets !== 'undefined') out.SheetNames = sheets;\n\t\tif(opts.bookSheets ? out.SheetNames : opts.bookProps) return out;\n\t}\n\tsheets = {};\n\n\tvar deps = {};\n\tif(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, strip_front_slash(dir.calcchain)),dir.calcchain,opts);\n\n\tvar i=0;\n\tvar sheetRels = ({});\n\tvar path, relsPath;\n\n\t{\n\t\tvar wbsheets = wb.Sheets;\n\t\tprops.Worksheets = wbsheets.length;\n\t\tprops.SheetNames = [];\n\t\tfor(var j = 0; j != wbsheets.length; ++j) {\n\t\t\tprops.SheetNames[j] = wbsheets[j].name;\n\t\t}\n\t}\n\n\tvar wbext = xlsb ? \"bin\" : \"xml\";\n\tvar wbrelsi = dir.workbooks[0].lastIndexOf(\"/\");\n\tvar wbrelsfile = (dir.workbooks[0].slice(0, wbrelsi+1) + \"_rels/\" + dir.workbooks[0].slice(wbrelsi+1) + \".rels\").replace(/^\\//,\"\");\n\tif(!safegetzipfile(zip, wbrelsfile)) wbrelsfile = 'xl/_rels/workbook.' + wbext + '.rels';\n\tvar wbrels = parse_rels(getzipstr(zip, wbrelsfile, true), wbrelsfile);\n\tif(wbrels) wbrels = safe_parse_wbrels(wbrels, wb.Sheets);\n\n\t/* Numbers iOS hack */\n\tvar nmode = (getzipdata(zip,\"xl/worksheets/sheet.xml\",true))?1:0;\n\twsloop: for(i = 0; i != props.Worksheets; ++i) {\n\t\tvar stype = \"sheet\";\n\t\tif(wbrels && wbrels[i]) {\n\t\t\tpath = 'xl/' + (wbrels[i][1]).replace(/[\\/]?xl\\//, \"\");\n\t\t\tif(!safegetzipfile(zip, path)) path = wbrels[i][1];\n\t\t\tif(!safegetzipfile(zip, path)) path = wbrelsfile.replace(/_rels\\/.*$/,\"\") + wbrels[i][1];\n\t\t\tstype = wbrels[i][2];\n\t\t} else {\n\t\t\tpath = 'xl/worksheets/sheet'+(i+1-nmode)+\".\" + wbext;\n\t\t\tpath = path.replace(/sheet0\\./,\"sheet.\");\n\t\t}\n\t\trelsPath = path.replace(/^(.*)(\\/)([^\\/]*)$/, \"$1/_rels/$3.rels\");\n\t\tif(opts && opts.sheets != null) switch(typeof opts.sheets) {\n\t\t\tcase \"number\": if(i != opts.sheets) continue wsloop; break;\n\t\t\tcase \"string\": if(props.SheetNames[i].toLowerCase() != opts.sheets.toLowerCase()) continue wsloop; break;\n\t\t\tdefault: if(Array.isArray && Array.isArray(opts.sheets)) {\n\t\t\t\tvar snjseen = false;\n\t\t\t\tfor(var snj = 0; snj != opts.sheets.length; ++snj) {\n\t\t\t\t\tif(typeof opts.sheets[snj] == \"number\" && opts.sheets[snj] == i) snjseen=1;\n\t\t\t\t\tif(typeof opts.sheets[snj] == \"string\" && opts.sheets[snj].toLowerCase() == props.SheetNames[i].toLowerCase()) snjseen = 1;\n\t\t\t\t}\n\t\t\t\tif(!snjseen) continue wsloop;\n\t\t\t}\n\t\t}\n\t\tsafe_parse_sheet(zip, path, relsPath, props.SheetNames[i], i, sheetRels, sheets, stype, opts, wb, themes, styles);\n\t}\n\n\tout = ({\n\t\tDirectory: dir,\n\t\tWorkbook: wb,\n\t\tProps: props,\n\t\tCustprops: custprops,\n\t\tDeps: deps,\n\t\tSheets: sheets,\n\t\tSheetNames: props.SheetNames,\n\t\tStrings: strs,\n\t\tStyles: styles,\n\t\tThemes: themes,\n\t\tSSF: SSF.get_table()\n\t});\n\tif(opts && opts.bookFiles) {\n\t\tif(zip.files) {\n\t\t\tout.keys = entries;\n\t\t\tout.files = zip.files;\n\t\t} else {\n\t\t\tout.keys = [];\n\t\t\tout.files = {};\n\t\t\tzip.FullPaths.forEach(function(p, idx) {\n\t\t\t\tp = p.replace(/^Root Entry[\\/]/, \"\");\n\t\t\t\tout.keys.push(p);\n\t\t\t\tout.files[p] = zip.FileIndex[idx];\n\t\t\t});\n\t\t}\n\t}\n\tif(opts && opts.bookVBA) {\n\t\tif(dir.vba.length > 0) out.vbaraw = getzipdata(zip,strip_front_slash(dir.vba[0]),true);\n\t\telse if(dir.defaults && dir.defaults.bin === CT_VBA) out.vbaraw = getzipdata(zip, 'xl/vbaProject.bin',true);\n\t}\n\treturn out;\n}\n\n/* [MS-OFFCRYPTO] 2.1.1 */\nfunction parse_xlsxcfb(cfb, _opts) {\n\tvar opts = _opts || {};\n\tvar f = 'Workbook', data = CFB.find(cfb, f);\n\ttry {\n\tf = '/!DataSpaces/Version';\n\tdata = CFB.find(cfb, f); if(!data || !data.content) throw new Error(\"ECMA-376 Encrypted file missing \" + f);\n\t/*var version = */parse_DataSpaceVersionInfo(data.content);\n\n\t/* 2.3.4.1 */\n\tf = '/!DataSpaces/DataSpaceMap';\n\tdata = CFB.find(cfb, f); if(!data || !data.content) throw new Error(\"ECMA-376 Encrypted file missing \" + f);\n\tvar dsm = parse_DataSpaceMap(data.content);\n\tif(dsm.length !== 1 || dsm[0].comps.length !== 1 || dsm[0].comps[0].t !== 0 || dsm[0].name !== \"StrongEncryptionDataSpace\" || dsm[0].comps[0].v !== \"EncryptedPackage\")\n\t\tthrow new Error(\"ECMA-376 Encrypted file bad \" + f);\n\n\t/* 2.3.4.2 */\n\tf = '/!DataSpaces/DataSpaceInfo/StrongEncryptionDataSpace';\n\tdata = CFB.find(cfb, f); if(!data || !data.content) throw new Error(\"ECMA-376 Encrypted file missing \" + f);\n\tvar seds = parse_DataSpaceDefinition(data.content);\n\tif(seds.length != 1 || seds[0] != \"StrongEncryptionTransform\")\n\t\tthrow new Error(\"ECMA-376 Encrypted file bad \" + f);\n\n\t/* 2.3.4.3 */\n\tf = '/!DataSpaces/TransformInfo/StrongEncryptionTransform/!Primary';\n\tdata = CFB.find(cfb, f); if(!data || !data.content) throw new Error(\"ECMA-376 Encrypted file missing \" + f);\n\t/*var hdr = */parse_Primary(data.content);\n\t} catch(e) {}\n\n\tf = '/EncryptionInfo';\n\tdata = CFB.find(cfb, f); if(!data || !data.content) throw new Error(\"ECMA-376 Encrypted file missing \" + f);\n\tvar einfo = parse_EncryptionInfo(data.content);\n\n\t/* 2.3.4.4 */\n\tf = '/EncryptedPackage';\n\tdata = CFB.find(cfb, f); if(!data || !data.content) throw new Error(\"ECMA-376 Encrypted file missing \" + f);\n\n/*global decrypt_agile */\nif(einfo[0] == 0x04 && typeof decrypt_agile !== 'undefined') return decrypt_agile(einfo[1], data.content, opts.password || \"\", opts);\n/*global decrypt_std76 */\nif(einfo[0] == 0x02 && typeof decrypt_std76 !== 'undefined') return decrypt_std76(einfo[1], data.content, opts.password || \"\", opts);\n\tthrow new Error(\"File is password-protected\");\n}\n\nfunction write_zip(wb, opts) {\n\t_shapeid = 1024;\n\tif(opts.bookType == \"ods\") return write_ods(wb, opts);\n\tif(wb && !wb.SSF) {\n\t\twb.SSF = SSF.get_table();\n\t}\n\tif(wb && wb.SSF) {\n\t\tmake_ssf(SSF); SSF.load_table(wb.SSF);\n\t\t// $FlowIgnore\n\t\topts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;\n\t\topts.ssf = wb.SSF;\n\t}\n\topts.rels = {}; opts.wbrels = {};\n\topts.Strings = []; opts.Strings.Count = 0; opts.Strings.Unique = 0;\n\tif(browser_has_Map) opts.revStrings = new Map();\n\telse { opts.revStrings = {}; opts.revStrings.foo = []; delete opts.revStrings.foo; }\n\tvar wbext = opts.bookType == \"xlsb\" ? \"bin\" : \"xml\";\n\tvar vbafmt = VBAFMTS.indexOf(opts.bookType) > -1;\n\tvar ct = new_ct();\n\tfix_write_opts(opts = opts || {});\n\tvar zip = zip_new();\n\tvar f = \"\", rId = 0;\n\n\topts.cellXfs = [];\n\tget_cell_style(opts.cellXfs, {}, {revssf:{\"General\":0}});\n\n\tif(!wb.Props) wb.Props = {};\n\n\tf = \"docProps/core.xml\";\n\tzip_add_file(zip, f, write_core_props(wb.Props, opts));\n\tct.coreprops.push(f);\n\tadd_rels(opts.rels, 2, f, RELS.CORE_PROPS);\n\nf = \"docProps/app.xml\";\n\tif(wb.Props && wb.Props.SheetNames){/* empty */}\n\telse if(!wb.Workbook || !wb.Workbook.Sheets) wb.Props.SheetNames = wb.SheetNames;\n\telse {\n\t\tvar _sn = [];\n\t\tfor(var _i = 0; _i < wb.SheetNames.length; ++_i)\n\t\t\tif((wb.Workbook.Sheets[_i]||{}).Hidden != 2) _sn.push(wb.SheetNames[_i]);\n\t\twb.Props.SheetNames = _sn;\n\t}\n\twb.Props.Worksheets = wb.Props.SheetNames.length;\n\tzip_add_file(zip, f, write_ext_props(wb.Props, opts));\n\tct.extprops.push(f);\n\tadd_rels(opts.rels, 3, f, RELS.EXT_PROPS);\n\n\tif(wb.Custprops !== wb.Props && keys(wb.Custprops||{}).length > 0) {\n\t\tf = \"docProps/custom.xml\";\n\t\tzip_add_file(zip, f, write_cust_props(wb.Custprops, opts));\n\t\tct.custprops.push(f);\n\t\tadd_rels(opts.rels, 4, f, RELS.CUST_PROPS);\n\t}\n\n\tfor(rId=1;rId <= wb.SheetNames.length; ++rId) {\n\t\tvar wsrels = {'!id':{}};\n\t\tvar ws = wb.Sheets[wb.SheetNames[rId-1]];\n\t\tvar _type = (ws || {})[\"!type\"] || \"sheet\";\n\t\tswitch(_type) {\n\t\tcase \"chart\":\n\t\t\t/* falls through */\n\t\tdefault:\n\t\t\tf = \"xl/worksheets/sheet\" + rId + \".\" + wbext;\n\t\t\tzip_add_file(zip, f, write_ws(rId-1, f, opts, wb, wsrels));\n\t\t\tct.sheets.push(f);\n\t\t\tadd_rels(opts.wbrels, -1, \"worksheets/sheet\" + rId + \".\" + wbext, RELS.WS[0]);\n\t\t}\n\n\t\tif(ws) {\n\t\t\tvar comments = ws['!comments'];\n\t\t\tvar need_vml = false;\n\t\t\tif(comments && comments.length > 0) {\n\t\t\t\tvar cf = \"xl/comments\" + rId + \".\" + wbext;\n\t\t\t\tzip_add_file(zip, cf, write_cmnt(comments, cf, opts));\n\t\t\t\tct.comments.push(cf);\n\t\t\t\tadd_rels(wsrels, -1, \"../comments\" + rId + \".\" + wbext, RELS.CMNT);\n\t\t\t\tneed_vml = true;\n\t\t\t}\n\t\t\tif(ws['!legacy']) {\n\t\t\t\tif(need_vml) zip_add_file(zip, \"xl/drawings/vmlDrawing\" + (rId) + \".vml\", write_comments_vml(rId, ws['!comments']));\n\t\t\t}\n\t\t\tdelete ws['!comments'];\n\t\t\tdelete ws['!legacy'];\n\t\t}\n\n\t\tif(wsrels['!id'].rId1) zip_add_file(zip, get_rels_path(f), write_rels(wsrels));\n\t}\n\n\tif(opts.Strings != null && opts.Strings.length > 0) {\n\t\tf = \"xl/sharedStrings.\" + wbext;\n\t\tzip_add_file(zip, f, write_sst(opts.Strings, f, opts));\n\t\tct.strs.push(f);\n\t\tadd_rels(opts.wbrels, -1, \"sharedStrings.\" + wbext, RELS.SST);\n\t}\n\n\tf = \"xl/workbook.\" + wbext;\n\tzip_add_file(zip, f, write_wb(wb, f, opts));\n\tct.workbooks.push(f);\n\tadd_rels(opts.rels, 1, f, RELS.WB);\n\n\t/* TODO: something more intelligent with themes */\n\n\tf = \"xl/theme/theme1.xml\";\n\tzip_add_file(zip, f, write_theme(wb.Themes, opts));\n\tct.themes.push(f);\n\tadd_rels(opts.wbrels, -1, \"theme/theme1.xml\", RELS.THEME);\n\n\t/* TODO: something more intelligent with styles */\n\n\tf = \"xl/styles.\" + wbext;\n\tzip_add_file(zip, f, write_sty(wb, f, opts));\n\tct.styles.push(f);\n\tadd_rels(opts.wbrels, -1, \"styles.\" + wbext, RELS.STY);\n\n\tif(wb.vbaraw && vbafmt) {\n\t\tf = \"xl/vbaProject.bin\";\n\t\tzip_add_file(zip, f, wb.vbaraw);\n\t\tct.vba.push(f);\n\t\tadd_rels(opts.wbrels, -1, \"vbaProject.bin\", RELS.VBA);\n\t}\n\n\tzip_add_file(zip, \"[Content_Types].xml\", write_ct(ct, opts));\n\tzip_add_file(zip, '_rels/.rels', write_rels(opts.rels));\n\tzip_add_file(zip, 'xl/_rels/workbook.' + wbext + '.rels', write_rels(opts.wbrels));\n\n\tdelete opts.revssf; delete opts.ssf;\n\treturn zip;\n}\nfunction firstbyte(f,o) {\n\tvar x = \"\";\n\tswitch((o||{}).type || \"base64\") {\n\t\tcase 'buffer': return [f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7]];\n\t\tcase 'base64': x = Base64.decode(f.slice(0,12)); break;\n\t\tcase 'binary': x = f; break;\n\t\tcase 'array': return [f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7]];\n\t\tdefault: throw new Error(\"Unrecognized type \" + (o && o.type || \"undefined\"));\n\t}\n\treturn [x.charCodeAt(0), x.charCodeAt(1), x.charCodeAt(2), x.charCodeAt(3), x.charCodeAt(4), x.charCodeAt(5), x.charCodeAt(6), x.charCodeAt(7)];\n}\n\nfunction read_cfb(cfb, opts) {\n\tif(CFB.find(cfb, \"EncryptedPackage\")) return parse_xlsxcfb(cfb, opts);\n\treturn parse_xlscfb(cfb, opts);\n}\n\nfunction read_zip(data, opts) {\n\tvar zip, d = data;\n\tvar o = opts||{};\n\tif(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? \"buffer\" : \"base64\";\n\tzip = zip_read(d, o);\n\treturn parse_zip(zip, o);\n}\n\nfunction read_plaintext(data, o) {\n\tvar i = 0;\n\tmain: while(i < data.length) switch(data.charCodeAt(i)) {\n\t\tcase 0x0A: case 0x0D: case 0x20: ++i; break;\n\t\tcase 0x3C: return parse_xlml(data.slice(i),o);\n\t\tdefault: break main;\n\t}\n\treturn PRN.to_workbook(data, o);\n}\n\nfunction read_plaintext_raw(data, o) {\n\tvar str = \"\", bytes = firstbyte(data, o);\n\tswitch(o.type) {\n\t\tcase 'base64': str = Base64.decode(data); break;\n\t\tcase 'binary': str = data; break;\n\t\tcase 'buffer': str = data.toString('binary'); break;\n\t\tcase 'array': str = cc2str(data); break;\n\t\tdefault: throw new Error(\"Unrecognized type \" + o.type);\n\t}\n\tif(bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str);\n\treturn read_plaintext(str, o);\n}\n\nfunction read_utf16(data, o) {\n\tvar d = data;\n\tif(o.type == 'base64') d = Base64.decode(d);\n\td = cptable.utils.decode(1200, d.slice(2), 'str');\n\to.type = \"binary\";\n\treturn read_plaintext(d, o);\n}\n\nfunction bstrify(data) {\n\treturn !data.match(/[^\\x00-\\x7F]/) ? data : utf8write(data);\n}\n\nfunction read_prn(data, d, o, str) {\n\tif(str) { o.type = \"string\"; return PRN.to_workbook(data, o); }\n\treturn PRN.to_workbook(d, o);\n}\n\nfunction readSync(data, opts) {\n\treset_cp();\n\tvar o = opts||{};\n\tif(typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer) return readSync(new Uint8Array(data), (o = dup(o), o.type = \"array\", o));\n\tvar d = data, n = [0,0,0,0], str = false;\n\tif(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; }\n\t_ssfopts = {};\n\tif(o.dateNF) _ssfopts.dateNF = o.dateNF;\n\tif(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? \"buffer\" : \"base64\";\n\tif(o.type == \"file\") { o.type = has_buf ? \"buffer\" : \"binary\"; d = read_binary(data); }\n\tif(o.type == \"string\") { str = true; o.type = \"binary\"; o.codepage = 65001; d = bstrify(data); }\n\tif(o.type == 'array' && typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && typeof ArrayBuffer !== 'undefined') {\n\t\t// $FlowIgnore\n\t\tvar ab=new ArrayBuffer(3), vu=new Uint8Array(ab); vu.foo=\"bar\";\n\t\t// $FlowIgnore\n\t\tif(!vu.foo) {o=dup(o); o.type='array'; return readSync(ab2a(d), o);}\n\t}\n\tswitch((n = firstbyte(d, o))[0]) {\n\t\tcase 0xD0: if(n[1] === 0xCF && n[2] === 0x11 && n[3] === 0xE0 && n[4] === 0xA1 && n[5] === 0xB1 && n[6] === 0x1A && n[7] === 0xE1) return read_cfb(CFB.read(d, o), o); break;\n\t\tcase 0x09: if(n[1] <= 0x08) return parse_xlscfb(d, o); break;\n\t\tcase 0x3C: return parse_xlml(d, o);\n\t\tcase 0x49:\n\t\t\tif(n[1] === 0x49 && n[2] === 0x2a && n[3] === 0x00) throw new Error(\"TIFF Image File is not a spreadsheet\");\n\t\t\tif(n[1] === 0x44) return read_wb_ID(d, o);\n\t\t\tbreak;\n\t\tcase 0x54: if(n[1] === 0x41 && n[2] === 0x42 && n[3] === 0x4C) return DIF.to_workbook(d, o); break;\n\t\tcase 0x50: return (n[1] === 0x4B && n[2] < 0x09 && n[3] < 0x09) ? read_zip(d, o) : read_prn(data, d, o, str);\n\t\tcase 0xEF: return n[3] === 0x3C ? parse_xlml(d, o) : read_prn(data, d, o, str);\n\t\tcase 0xFF:\n\t\t\tif(n[1] === 0xFE) { return read_utf16(d, o); }\n\t\t\telse if(n[1] === 0x00 && n[2] === 0x02 && n[3] === 0x00) return WK_.to_workbook(d, o);\n\t\t\tbreak;\n\t\tcase 0x00:\n\t\t\tif(n[1] === 0x00) {\n\t\t\t\tif(n[2] >= 0x02 && n[3] === 0x00) return WK_.to_workbook(d, o);\n\t\t\t\tif(n[2] === 0x00 && (n[3] === 0x08 || n[3] === 0x09)) return WK_.to_workbook(d, o);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 0x03: case 0x83: case 0x8B: case 0x8C: return DBF.to_workbook(d, o);\n\t\tcase 0x7B: if(n[1] === 0x5C && n[2] === 0x72 && n[3] === 0x74) return RTF.to_workbook(d, o); break;\n\t\tcase 0x0A: case 0x0D: case 0x20: return read_plaintext_raw(d, o);\n\t\tcase 0x89: if(n[1] === 0x50 && n[2] === 0x4E && n[3] === 0x47) throw new Error(\"PNG Image File is not a spreadsheet\"); break;\n\t}\n\tif(DBF.versions.indexOf(n[0]) > -1 && n[2] <= 12 && n[3] <= 31) return DBF.to_workbook(d, o);\n\treturn read_prn(data, d, o, str);\n}\n\nfunction readFileSync(filename, opts) {\n\tvar o = opts||{}; o.type = 'file';\n\treturn readSync(filename, o);\n}\nfunction write_cfb_ctr(cfb, o) {\n\tswitch(o.type) {\n\t\tcase \"base64\": case \"binary\": break;\n\t\tcase \"buffer\": case \"array\": o.type = \"\"; break;\n\t\tcase \"file\": return write_dl(o.file, CFB.write(cfb, {type:has_buf ? 'buffer' : \"\"}));\n\t\tcase \"string\": throw new Error(\"'string' output type invalid for '\" + o.bookType + \"' files\");\n\t\tdefault: throw new Error(\"Unrecognized type \" + o.type);\n\t}\n\treturn CFB.write(cfb, o);\n}\n\nfunction write_zip_type(wb, opts) {\n\tvar o = dup(opts||{});\n\tvar z = write_zip(wb, o);\n\tvar oopts = {};\n\tif(o.compression) oopts.compression = 'DEFLATE';\n\tif(o.password) oopts.type = has_buf ? \"nodebuffer\" : \"string\";\n\telse switch(o.type) {\n\t\tcase \"base64\": oopts.type = \"base64\"; break;\n\t\tcase \"binary\": oopts.type = \"string\"; break;\n\t\tcase \"string\": throw new Error(\"'string' output type invalid for '\" + o.bookType + \"' files\");\n\t\tcase \"buffer\":\n\t\tcase \"file\": oopts.type = has_buf ? \"nodebuffer\" : \"string\"; break;\n\t\tdefault: throw new Error(\"Unrecognized type \" + o.type);\n\t}\n\tvar out = z.FullPaths ? CFB.write(z, {fileType:\"zip\", type: {\"nodebuffer\": \"buffer\", \"string\": \"binary\"}[oopts.type] || oopts.type}) : z.generate(oopts);\n/*jshint -W083 */\n\tif(o.password && typeof encrypt_agile !== 'undefined') return write_cfb_ctr(encrypt_agile(out, o.password), o); // eslint-disable-line no-undef\n/*jshint +W083 */\n\tif(o.type === \"file\") return write_dl(o.file, out);\n\treturn o.type == \"string\" ? utf8read(out) : out;\n}\n\nfunction write_cfb_type(wb, opts) {\n\tvar o = opts||{};\n\tvar cfb = write_xlscfb(wb, o);\n\treturn write_cfb_ctr(cfb, o);\n}\n\nfunction write_string_type(out, opts, bom) {\n\tif(!bom) bom = \"\";\n\tvar o = bom + out;\n\tswitch(opts.type) {\n\t\tcase \"base64\": return Base64.encode(utf8write(o));\n\t\tcase \"binary\": return utf8write(o);\n\t\tcase \"string\": return out;\n\t\tcase \"file\": return write_dl(opts.file, o, 'utf8');\n\t\tcase \"buffer\": {\n\t\t\tif(has_buf) return Buffer_from(o, 'utf8');\n\t\t\telse return write_string_type(o, {type:'binary'}).split(\"\").map(function(c) { return c.charCodeAt(0); });\n\t\t}\n\t}\n\tthrow new Error(\"Unrecognized type \" + opts.type);\n}\n\nfunction write_stxt_type(out, opts) {\n\tswitch(opts.type) {\n\t\tcase \"base64\": return Base64.encode(out);\n\t\tcase \"binary\": return out;\n\t\tcase \"string\": return out; /* override in sheet_to_txt */\n\t\tcase \"file\": return write_dl(opts.file, out, 'binary');\n\t\tcase \"buffer\": {\n\t\t\tif(has_buf) return Buffer_from(out, 'binary');\n\t\t\telse return out.split(\"\").map(function(c) { return c.charCodeAt(0); });\n\t\t}\n\t}\n\tthrow new Error(\"Unrecognized type \" + opts.type);\n}\n\n/* TODO: test consistency */\nfunction write_binary_type(out, opts) {\n\tswitch(opts.type) {\n\t\tcase \"string\":\n\t\tcase \"base64\":\n\t\tcase \"binary\":\n\t\t\tvar bstr = \"\";\n\t\t\t// $FlowIgnore\n\t\t\tfor(var i = 0; i < out.length; ++i) bstr += String.fromCharCode(out[i]);\n\t\t\treturn opts.type == 'base64' ? Base64.encode(bstr) : opts.type == 'string' ? utf8read(bstr) : bstr;\n\t\tcase \"file\": return write_dl(opts.file, out);\n\t\tcase \"buffer\": return out;\n\t\tdefault: throw new Error(\"Unrecognized type \" + opts.type);\n\t}\n}\n\nfunction writeSync(wb, opts) {\n\treset_cp();\n\tcheck_wb(wb);\n\tvar o = dup(opts||{});\n\tif(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; }\n\tif(o.type == \"array\") { o.type = \"binary\"; var out = (writeSync(wb, o)); o.type = \"array\"; return s2ab(out); }\n\tswitch(o.bookType || 'xlsb') {\n\t\tcase 'xml':\n\t\tcase 'xlml': return write_string_type(write_xlml(wb, o), o);\n\t\tcase 'slk':\n\t\tcase 'sylk': return write_string_type(write_slk_str(wb, o), o);\n\t\tcase 'htm':\n\t\tcase 'html': return write_string_type(write_htm_str(wb, o), o);\n\t\tcase 'txt': return write_stxt_type(write_txt_str(wb, o), o);\n\t\tcase 'csv': return write_string_type(write_csv_str(wb, o), o, \"\\ufeff\");\n\t\tcase 'dif': return write_string_type(write_dif_str(wb, o), o);\n\t\tcase 'dbf': return write_binary_type(write_dbf_buf(wb, o), o);\n\t\tcase 'prn': return write_string_type(write_prn_str(wb, o), o);\n\t\tcase 'rtf': return write_string_type(write_rtf_str(wb, o), o);\n\t\tcase 'eth': return write_string_type(write_eth_str(wb, o), o);\n\t\tcase 'fods': return write_string_type(write_ods(wb, o), o);\n\t\tcase 'wk1': return write_binary_type(write_wk1_buf(wb, o), o);\n\t\tcase 'wk3': return write_binary_type(WK_.book_to_wk3(wb, o), o);\n\t\tcase 'biff2': if(!o.biff) o.biff = 2; /* falls through */\n\t\tcase 'biff3': if(!o.biff) o.biff = 3; /* falls through */\n\t\tcase 'biff4': if(!o.biff) o.biff = 4; return write_binary_type(write_biff_buf(wb, o), o);\n\t\tcase 'biff5': if(!o.biff) o.biff = 5; /* falls through */\n\t\tcase 'biff8':\n\t\tcase 'xla':\n\t\tcase 'xls': if(!o.biff) o.biff = 8; return write_cfb_type(wb, o);\n\t\tcase 'xlsx':\n\t\tcase 'xlsm':\n\t\tcase 'xlam':\n\t\tcase 'xlsb':\n\t\tcase 'ods': return write_zip_type(wb, o);\n\t\tdefault: throw new Error (\"Unrecognized bookType |\" + o.bookType + \"|\");\n\t}\n}\n\nfunction resolve_book_type(o) {\n\tif(o.bookType) return;\n\tvar _BT = {\n\t\t\"xls\": \"biff8\",\n\t\t\"htm\": \"html\",\n\t\t\"slk\": \"sylk\",\n\t\t\"socialcalc\": \"eth\",\n\t\t\"Sh33tJS\": \"WTF\"\n\t};\n\tvar ext = o.file.slice(o.file.lastIndexOf(\".\")).toLowerCase();\n\tif(ext.match(/^\\.[a-z]+$/)) o.bookType = ext.slice(1);\n\to.bookType = _BT[o.bookType] || o.bookType;\n}\n\nfunction writeFileSync(wb, filename, opts) {\n\tvar o = opts||{}; o.type = 'file';\n\to.file = filename;\n\tresolve_book_type(o);\n\treturn writeSync(wb, o);\n}\n\nfunction writeFileAsync(filename, wb, opts, cb) {\n\tvar o = opts||{}; o.type = 'file';\n\to.file = filename;\n\tresolve_book_type(o);\n\to.type = 'buffer';\n\tvar _cb = cb; if(!(_cb instanceof Function)) _cb = (opts);\n\treturn _fs.writeFile(filename, writeSync(wb, o), _cb);\n}\nfunction make_json_row(sheet, r, R, cols, header, hdr, dense, o) {\n\tvar rr = encode_row(R);\n\tvar defval = o.defval, raw = o.raw || !Object.prototype.hasOwnProperty.call(o, \"raw\");\n\tvar isempty = true;\n\tvar row = (header === 1) ? [] : {};\n\tif(header !== 1) {\n\t\tif(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; }\n\t\telse row.__rowNum__ = R;\n\t}\n\tif(!dense || sheet[R]) for (var C = r.s.c; C <= r.e.c; ++C) {\n\t\tvar val = dense ? sheet[R][C] : sheet[cols[C] + rr];\n\t\tif(val === undefined || val.t === undefined) {\n\t\t\tif(defval === undefined) continue;\n\t\t\tif(hdr[C] != null) { row[hdr[C]] = defval; }\n\t\t\tcontinue;\n\t\t}\n\t\tvar v = val.v;\n\t\tswitch(val.t){\n\t\t\tcase 'z': if(v == null) break; continue;\n\t\t\tcase 'e': v = (v == 0 ? null : void 0); break;\n\t\t\tcase 's': case 'd': case 'b': case 'n': break;\n\t\t\tdefault: throw new Error('unrecognized type ' + val.t);\n\t\t}\n\t\tif(hdr[C] != null) {\n\t\t\tif(v == null) {\n\t\t\t\tif(val.t == \"e\" && v === null) row[hdr[C]] = null;\n\t\t\t\telse if(defval !== undefined) row[hdr[C]] = defval;\n\t\t\t\telse if(raw && v === null) row[hdr[C]] = null;\n\t\t\t\telse continue;\n\t\t\t} else {\n\t\t\t\trow[hdr[C]] = raw || (o.rawNumbers && val.t == \"n\") ? v : format_cell(val,v,o);\n\t\t\t}\n\t\t\tif(v != null) isempty = false;\n\t\t}\n\t}\n\treturn { row: row, isempty: isempty };\n}\n\n\nfunction sheet_to_json(sheet, opts) {\n\tif(sheet == null || sheet[\"!ref\"] == null) return [];\n\tvar val = {t:'n',v:0}, header = 0, offset = 1, hdr = [], v=0, vv=\"\";\n\tvar r = {s:{r:0,c:0},e:{r:0,c:0}};\n\tvar o = opts || {};\n\tvar range = o.range != null ? o.range : sheet[\"!ref\"];\n\tif(o.header === 1) header = 1;\n\telse if(o.header === \"A\") header = 2;\n\telse if(Array.isArray(o.header)) header = 3;\n\telse if(o.header == null) header = 0;\n\tswitch(typeof range) {\n\t\tcase 'string': r = safe_decode_range(range); break;\n\t\tcase 'number': r = safe_decode_range(sheet[\"!ref\"]); r.s.r = range; break;\n\t\tdefault: r = range;\n\t}\n\tif(header > 0) offset = 0;\n\tvar rr = encode_row(r.s.r);\n\tvar cols = [];\n\tvar out = [];\n\tvar outi = 0, counter = 0;\n\tvar dense = Array.isArray(sheet);\n\tvar R = r.s.r, C = 0, CC = 0;\n\tif(dense && !sheet[R]) sheet[R] = [];\n\tfor(C = r.s.c; C <= r.e.c; ++C) {\n\t\tcols[C] = encode_col(C);\n\t\tval = dense ? sheet[R][C] : sheet[cols[C] + rr];\n\t\tswitch(header) {\n\t\t\tcase 1: hdr[C] = C - r.s.c; break;\n\t\t\tcase 2: hdr[C] = cols[C]; break;\n\t\t\tcase 3: hdr[C] = o.header[C - r.s.c]; break;\n\t\t\tdefault:\n\t\t\t\tif(val == null) val = {w: \"__EMPTY\", t: \"s\"};\n\t\t\t\tvv = v = format_cell(val, null, o);\n\t\t\t\tcounter = 0;\n\t\t\t\tfor(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) vv = v + \"_\" + (++counter);\n\t\t\t\thdr[C] = vv;\n\t\t}\n\t}\n\tfor (R = r.s.r + offset; R <= r.e.r; ++R) {\n\t\tvar row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);\n\t\tif((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row.row;\n\t}\n\tout.length = outi;\n\treturn out;\n}\n\nvar qreg = /\"/g;\nfunction make_csv_row(sheet, r, R, cols, fs, rs, FS, o) {\n\tvar isempty = true;\n\tvar row = [], txt = \"\", rr = encode_row(R);\n\tfor(var C = r.s.c; C <= r.e.c; ++C) {\n\t\tif (!cols[C]) continue;\n\t\tvar val = o.dense ? (sheet[R]||[])[C]: sheet[cols[C] + rr];\n\t\tif(val == null) txt = \"\";\n\t\telse if(val.v != null) {\n\t\t\tisempty = false;\n\t\t\ttxt = ''+(o.rawNumbers && val.t == \"n\" ? val.v : format_cell(val, null, o));\n\t\t\tfor(var i = 0, cc = 0; i !== txt.length; ++i) if((cc = txt.charCodeAt(i)) === fs || cc === rs || cc === 34 || o.forceQuotes) {txt = \"\\\"\" + txt.replace(qreg, '\"\"') + \"\\\"\"; break; }\n\t\t\tif(txt == \"ID\") txt = '\"ID\"';\n\t\t} else if(val.f != null && !val.F) {\n\t\t\tisempty = false;\n\t\t\ttxt = '=' + val.f; if(txt.indexOf(\",\") >= 0) txt = '\"' + txt.replace(qreg, '\"\"') + '\"';\n\t\t} else txt = \"\";\n\t\t/* NOTE: Excel CSV does not support array formulae */\n\t\trow.push(txt);\n\t}\n\tif(o.blankrows === false && isempty) return null;\n\treturn row.join(FS);\n}\n\nfunction sheet_to_csv(sheet, opts) {\n\tvar out = [];\n\tvar o = opts == null ? {} : opts;\n\tif(sheet == null || sheet[\"!ref\"] == null) return \"\";\n\tvar r = safe_decode_range(sheet[\"!ref\"]);\n\tvar FS = o.FS !== undefined ? o.FS : \",\", fs = FS.charCodeAt(0);\n\tvar RS = o.RS !== undefined ? o.RS : \"\\n\", rs = RS.charCodeAt(0);\n\tvar endregex = new RegExp((FS==\"|\" ? \"\\\\|\" : FS)+\"+$\");\n\tvar row = \"\", cols = [];\n\to.dense = Array.isArray(sheet);\n\tvar colinfo = o.skipHidden && sheet[\"!cols\"] || [];\n\tvar rowinfo = o.skipHidden && sheet[\"!rows\"] || [];\n\tfor(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C);\n\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\tif ((rowinfo[R]||{}).hidden) continue;\n\t\trow = make_csv_row(sheet, r, R, cols, fs, rs, FS, o);\n\t\tif(row == null) { continue; }\n\t\tif(o.strip) row = row.replace(endregex,\"\");\n\t\tout.push(row + RS);\n\t}\n\tdelete o.dense;\n\treturn out.join(\"\");\n}\n\nfunction sheet_to_txt(sheet, opts) {\n\tif(!opts) opts = {}; opts.FS = \"\\t\"; opts.RS = \"\\n\";\n\tvar s = sheet_to_csv(sheet, opts);\n\tif(typeof cptable == 'undefined' || opts.type == 'string') return s;\n\tvar o = cptable.utils.encode(1200, s, 'str');\n\treturn String.fromCharCode(255) + String.fromCharCode(254) + o;\n}\n\nfunction sheet_to_formulae(sheet) {\n\tvar y = \"\", x, val=\"\";\n\tif(sheet == null || sheet[\"!ref\"] == null) return [];\n\tvar r = safe_decode_range(sheet['!ref']), rr = \"\", cols = [], C;\n\tvar cmds = [];\n\tvar dense = Array.isArray(sheet);\n\tfor(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C);\n\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\trr = encode_row(R);\n\t\tfor(C = r.s.c; C <= r.e.c; ++C) {\n\t\t\ty = cols[C] + rr;\n\t\t\tx = dense ? (sheet[R]||[])[C] : sheet[y];\n\t\t\tval = \"\";\n\t\t\tif(x === undefined) continue;\n\t\t\telse if(x.F != null) {\n\t\t\t\ty = x.F;\n\t\t\t\tif(!x.f) continue;\n\t\t\t\tval = x.f;\n\t\t\t\tif(y.indexOf(\":\") == -1) y = y + \":\" + y;\n\t\t\t}\n\t\t\tif(x.f != null) val = x.f;\n\t\t\telse if(x.t == 'z') continue;\n\t\t\telse if(x.t == 'n' && x.v != null) val = \"\" + x.v;\n\t\t\telse if(x.t == 'b') val = x.v ? \"TRUE\" : \"FALSE\";\n\t\t\telse if(x.w !== undefined) val = \"'\" + x.w;\n\t\t\telse if(x.v === undefined) continue;\n\t\t\telse if(x.t == 's') val = \"'\" + x.v;\n\t\t\telse val = \"\"+x.v;\n\t\t\tcmds[cmds.length] = y + \"=\" + val;\n\t\t}\n\t}\n\treturn cmds;\n}\n\nfunction sheet_add_json(_ws, js, opts) {\n\tvar o = opts || {};\n\tvar offset = +!o.skipHeader;\n\tvar ws = _ws || ({});\n\tvar _R = 0, _C = 0;\n\tif(ws && o.origin != null) {\n\t\tif(typeof o.origin == 'number') _R = o.origin;\n\t\telse {\n\t\t\tvar _origin = typeof o.origin == \"string\" ? decode_cell(o.origin) : o.origin;\n\t\t\t_R = _origin.r; _C = _origin.c;\n\t\t}\n\t}\n\tvar cell;\n\tvar range = ({s: {c:0, r:0}, e: {c:_C, r:_R + js.length - 1 + offset}});\n\tif(ws['!ref']) {\n\t\tvar _range = safe_decode_range(ws['!ref']);\n\t\trange.e.c = Math.max(range.e.c, _range.e.c);\n\t\trange.e.r = Math.max(range.e.r, _range.e.r);\n\t\tif(_R == -1) { _R = _range.e.r + 1; range.e.r = _R + js.length - 1 + offset; }\n\t} else {\n\t\tif(_R == -1) { _R = 0; range.e.r = js.length - 1 + offset; }\n\t}\n\tvar hdr = o.header || [], C = 0;\n\n\tjs.forEach(function (JS, R) {\n\t\tkeys(JS).forEach(function(k) {\n\t\t\tif((C=hdr.indexOf(k)) == -1) hdr[C=hdr.length] = k;\n\t\t\tvar v = JS[k];\n\t\t\tvar t = 'z';\n\t\t\tvar z = \"\";\n\t\t\tvar ref = encode_cell({c:_C + C,r:_R + R + offset});\n\t\t\tcell = utils.sheet_get_cell(ws, ref);\n\t\t\tif(v && typeof v === 'object' && !(v instanceof Date)){\n\t\t\t\tws[ref] = v;\n\t\t\t} else {\n\t\t\t\tif(typeof v == 'number') t = 'n';\n\t\t\t\telse if(typeof v == 'boolean') t = 'b';\n\t\t\t\telse if(typeof v == 'string') t = 's';\n\t\t\t\telse if(v instanceof Date) {\n\t\t\t\t\tt = 'd';\n\t\t\t\t\tif(!o.cellDates) { t = 'n'; v = datenum(v); }\n\t\t\t\t\tz = (o.dateNF || SSF._table[14]);\n\t\t\t\t}\n\t\t\t\telse if(v === null && o.nullError) { t = 'e'; v = 0; }\n\t\t\t\tif(!cell) ws[ref] = cell = ({t:t, v:v});\n\t\t\t\telse {\n\t\t\t\t\tcell.t = t; cell.v = v;\n\t\t\t\t\tdelete cell.w; delete cell.R;\n\t\t\t\t\tif(z) cell.z = z;\n\t\t\t\t}\n\t\t\t\tif(z) cell.z = z;\n\t\t\t}\n\t\t});\n\t});\n\trange.e.c = Math.max(range.e.c, _C + hdr.length - 1);\n\tvar __R = encode_row(_R);\n\tif(offset) for(C = 0; C < hdr.length; ++C) ws[encode_col(C + _C) + __R] = {t:'s', v:hdr[C]};\n\tws['!ref'] = encode_range(range);\n\treturn ws;\n}\nfunction json_to_sheet(js, opts) { return sheet_add_json(null, js, opts); }\n\nvar utils = {\n\tencode_col: encode_col,\n\tencode_row: encode_row,\n\tencode_cell: encode_cell,\n\tencode_range: encode_range,\n\tdecode_col: decode_col,\n\tdecode_row: decode_row,\n\tsplit_cell: split_cell,\n\tdecode_cell: decode_cell,\n\tdecode_range: decode_range,\n\tformat_cell: format_cell,\n\tget_formulae: sheet_to_formulae,\n\tmake_csv: sheet_to_csv,\n\tmake_json: sheet_to_json,\n\tmake_formulae: sheet_to_formulae,\n\tsheet_add_aoa: sheet_add_aoa,\n\tsheet_add_json: sheet_add_json,\n\tsheet_add_dom: sheet_add_dom,\n\taoa_to_sheet: aoa_to_sheet,\n\tjson_to_sheet: json_to_sheet,\n\ttable_to_sheet: parse_dom_table,\n\ttable_to_book: table_to_book,\n\tsheet_to_csv: sheet_to_csv,\n\tsheet_to_txt: sheet_to_txt,\n\tsheet_to_json: sheet_to_json,\n\tsheet_to_html: HTML_.from_sheet,\n\tsheet_to_formulae: sheet_to_formulae,\n\tsheet_to_row_object_array: sheet_to_json\n};\n\n(function(utils) {\nutils.consts = utils.consts || {};\nfunction add_consts(R/*Array*/) { R.forEach(function(a){ utils.consts[a[0]] = a[1]; }); }\n\nfunction get_default(x, y, z) { return x[y] != null ? x[y] : (x[y] = z); }\n\n/* get cell, creating a stub if necessary */\nfunction ws_get_cell_stub(ws, R, C) {\n\t/* A1 cell address */\n\tif(typeof R == \"string\") {\n\t\t/* dense */\n\t\tif(Array.isArray(ws)) {\n\t\t\tvar RC = decode_cell(R);\n\t\t\tif(!ws[RC.r]) ws[RC.r] = [];\n\t\t\treturn ws[RC.r][RC.c] || (ws[RC.r][RC.c] = {t:'z'});\n\t\t}\n\t\treturn ws[R] || (ws[R] = {t:'z'});\n\t}\n\t/* cell address object */\n\tif(typeof R != \"number\") return ws_get_cell_stub(ws, encode_cell(R));\n\t/* R and C are 0-based indices */\n\treturn ws_get_cell_stub(ws, encode_cell({r:R,c:C||0}));\n}\nutils.sheet_get_cell = ws_get_cell_stub;\n\n/* find sheet index for given name / validate index */\nfunction wb_sheet_idx(wb, sh) {\n\tif(typeof sh == \"number\") {\n\t\tif(sh >= 0 && wb.SheetNames.length > sh) return sh;\n\t\tthrow new Error(\"Cannot find sheet # \" + sh);\n\t} else if(typeof sh == \"string\") {\n\t\tvar idx = wb.SheetNames.indexOf(sh);\n\t\tif(idx > -1) return idx;\n\t\tthrow new Error(\"Cannot find sheet name |\" + sh + \"|\");\n\t} else throw new Error(\"Cannot find sheet |\" + sh + \"|\");\n}\n\n/* simple blank workbook object */\nutils.book_new = function() {\n\treturn { SheetNames: [], Sheets: {} };\n};\n\n/* add a worksheet to the end of a given workbook */\nutils.book_append_sheet = function(wb, ws, name) {\n\tif(!name) for(var i = 1; i <= 0xFFFF; ++i, name = undefined) if(wb.SheetNames.indexOf(name = \"Sheet\" + i) == -1) break;\n\tif(!name || wb.SheetNames.length >= 0xFFFF) throw new Error(\"Too many worksheets\");\n\tcheck_ws_name(name);\n\tif(wb.SheetNames.indexOf(name) >= 0) throw new Error(\"Worksheet with name |\" + name + \"| already exists!\");\n\n\twb.SheetNames.push(name);\n\twb.Sheets[name] = ws;\n};\n\n/* set sheet visibility (visible/hidden/very hidden) */\nutils.book_set_sheet_visibility = function(wb, sh, vis) {\n\tget_default(wb,\"Workbook\",{});\n\tget_default(wb.Workbook,\"Sheets\",[]);\n\n\tvar idx = wb_sheet_idx(wb, sh);\n\t// $FlowIgnore\n\tget_default(wb.Workbook.Sheets,idx, {});\n\n\tswitch(vis) {\n\t\tcase 0: case 1: case 2: break;\n\t\tdefault: throw new Error(\"Bad sheet visibility setting \" + vis);\n\t}\n\t// $FlowIgnore\n\twb.Workbook.Sheets[idx].Hidden = vis;\n};\nadd_consts([\n\t[\"SHEET_VISIBLE\", 0],\n\t[\"SHEET_HIDDEN\", 1],\n\t[\"SHEET_VERY_HIDDEN\", 2]\n]);\n\n/* set number format */\nutils.cell_set_number_format = function(cell, fmt) {\n\tcell.z = fmt;\n\treturn cell;\n};\n\n/* set cell hyperlink */\nutils.cell_set_hyperlink = function(cell, target, tooltip) {\n\tif(!target) {\n\t\tdelete cell.l;\n\t} else {\n\t\tcell.l = ({ Target: target });\n\t\tif(tooltip) cell.l.Tooltip = tooltip;\n\t}\n\treturn cell;\n};\nutils.cell_set_internal_link = function(cell, range, tooltip) { return utils.cell_set_hyperlink(cell, \"#\" + range, tooltip); };\n\n/* add to cell comments */\nutils.cell_add_comment = function(cell, text, author) {\n\tif(!cell.c) cell.c = [];\n\tcell.c.push({t:text, a:author||\"SheetJS\"});\n};\n\n/* set array formula and flush related cells */\nutils.sheet_set_array_formula = function(ws, range, formula) {\n\tvar rng = typeof range != \"string\" ? range : safe_decode_range(range);\n\tvar rngstr = typeof range == \"string\" ? range : encode_range(range);\n\tfor(var R = rng.s.r; R <= rng.e.r; ++R) for(var C = rng.s.c; C <= rng.e.c; ++C) {\n\t\tvar cell = ws_get_cell_stub(ws, R, C);\n\t\tcell.t = 'n';\n\t\tcell.F = rngstr;\n\t\tdelete cell.v;\n\t\tif(R == rng.s.r && C == rng.s.c) cell.f = formula;\n\t}\n\treturn ws;\n};\n\nreturn utils;\n})(utils);\n\nif(has_buf && typeof require != 'undefined') (function() {\n\tvar strmod = require('stream');\n\tif(!strmod) return;\n\tvar Readable = strmod.Readable;\n\tif(!Readable) return;\n\n\tvar write_csv_stream = function(sheet, opts) {\n\t\tvar stream = Readable();\n\t\tvar o = opts == null ? {} : opts;\n\t\tif(sheet == null || sheet[\"!ref\"] == null) { stream.push(null); return stream; }\n\t\tvar r = safe_decode_range(sheet[\"!ref\"]);\n\t\tvar FS = o.FS !== undefined ? o.FS : \",\", fs = FS.charCodeAt(0);\n\t\tvar RS = o.RS !== undefined ? o.RS : \"\\n\", rs = RS.charCodeAt(0);\n\t\tvar endregex = new RegExp((FS==\"|\" ? \"\\\\|\" : FS)+\"+$\");\n\t\tvar row = \"\", cols = [];\n\t\to.dense = Array.isArray(sheet);\n\t\tvar colinfo = o.skipHidden && sheet[\"!cols\"] || [];\n\t\tvar rowinfo = o.skipHidden && sheet[\"!rows\"] || [];\n\t\tfor(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C);\n\t\tvar R = r.s.r;\n\t\tvar BOM = false;\n\t\tstream._read = function() {\n\t\t\tif(!BOM) { BOM = true; return stream.push(\"\\uFEFF\"); }\n\t\t\twhile(R <= r.e.r) {\n\t\t\t\t++R;\n\t\t\t\tif ((rowinfo[R-1]||{}).hidden) continue;\n\t\t\t\trow = make_csv_row(sheet, r, R-1, cols, fs, rs, FS, o);\n\t\t\t\tif(row != null) {\n\t\t\t\t\tif(o.strip) row = row.replace(endregex,\"\");\n\t\t\t\t\tstream.push(row + RS);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(R > r.e.r) return stream.push(null);\n\t\t};\n\t\treturn stream;\n\t};\n\n\tvar write_html_stream = function(ws, opts) {\n\t\tvar stream = Readable();\n\n\t\tvar o = opts || {};\n\t\tvar header = o.header != null ? o.header : HTML_.BEGIN;\n\t\tvar footer = o.footer != null ? o.footer : HTML_.END;\n\t\tstream.push(header);\n\t\tvar r = decode_range(ws['!ref']);\n\t\to.dense = Array.isArray(ws);\n\t\tstream.push(HTML_._preamble(ws, r, o));\n\t\tvar R = r.s.r;\n\t\tvar end = false;\n\t\tstream._read = function() {\n\t\t\tif(R > r.e.r) {\n\t\t\t\tif(!end) { end = true; stream.push(\"\" + footer); }\n\t\t\t\treturn stream.push(null);\n\t\t\t}\n\t\t\twhile(R <= r.e.r) {\n\t\t\t\tstream.push(HTML_._row(ws, r, R, o));\n\t\t\t\t++R;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t};\n\t\treturn stream;\n\t};\n\n\tvar write_json_stream = function(sheet, opts) {\n\t\tvar stream = Readable({objectMode:true});\n\n\t\tif(sheet == null || sheet[\"!ref\"] == null) { stream.push(null); return stream; }\n\t\tvar val = {t:'n',v:0}, header = 0, offset = 1, hdr = [], v=0, vv=\"\";\n\t\tvar r = {s:{r:0,c:0},e:{r:0,c:0}};\n\t\tvar o = opts || {};\n\t\tvar range = o.range != null ? o.range : sheet[\"!ref\"];\n\t\tif(o.header === 1) header = 1;\n\t\telse if(o.header === \"A\") header = 2;\n\t\telse if(Array.isArray(o.header)) header = 3;\n\t\tswitch(typeof range) {\n\t\t\tcase 'string': r = safe_decode_range(range); break;\n\t\t\tcase 'number': r = safe_decode_range(sheet[\"!ref\"]); r.s.r = range; break;\n\t\t\tdefault: r = range;\n\t\t}\n\t\tif(header > 0) offset = 0;\n\t\tvar rr = encode_row(r.s.r);\n\t\tvar cols = [];\n\t\tvar counter = 0;\n\t\tvar dense = Array.isArray(sheet);\n\t\tvar R = r.s.r, C = 0, CC = 0;\n\t\tif(dense && !sheet[R]) sheet[R] = [];\n\t\tfor(C = r.s.c; C <= r.e.c; ++C) {\n\t\t\tcols[C] = encode_col(C);\n\t\t\tval = dense ? sheet[R][C] : sheet[cols[C] + rr];\n\t\t\tswitch(header) {\n\t\t\t\tcase 1: hdr[C] = C - r.s.c; break;\n\t\t\t\tcase 2: hdr[C] = cols[C]; break;\n\t\t\t\tcase 3: hdr[C] = o.header[C - r.s.c]; break;\n\t\t\t\tdefault:\n\t\t\t\t\tif(val == null) val = {w: \"__EMPTY\", t: \"s\"};\n\t\t\t\t\tvv = v = format_cell(val, null, o);\n\t\t\t\t\tcounter = 0;\n\t\t\t\t\tfor(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) vv = v + \"_\" + (++counter);\n\t\t\t\t\thdr[C] = vv;\n\t\t\t}\n\t\t}\n\t\tR = r.s.r + offset;\n\t\tstream._read = function() {\n\t\t\tif(R > r.e.r) return stream.push(null);\n\t\t\twhile(R <= r.e.r) {\n\t\t\t\t//if ((rowinfo[R-1]||{}).hidden) continue;\n\t\t\t\tvar row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);\n\t\t\t\t++R;\n\t\t\t\tif((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) {\n\t\t\t\t\tstream.push(row.row);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn stream;\n\t};\n\n\tXLSX.stream = {\n\t\tto_json: write_json_stream,\n\t\tto_html: write_html_stream,\n\t\tto_csv: write_csv_stream\n\t};\n})();\n\nif(typeof parse_xlscfb !== \"undefined\") XLSX.parse_xlscfb = parse_xlscfb;\nXLSX.parse_zip = parse_zip;\nXLSX.read = readSync; //xlsread\nXLSX.readFile = readFileSync; //readFile\nXLSX.readFileSync = readFileSync;\nXLSX.write = writeSync;\nXLSX.writeFile = writeFileSync;\nXLSX.writeFileSync = writeFileSync;\nXLSX.writeFileAsync = writeFileAsync;\nXLSX.utils = utils;\nXLSX.SSF = SSF;\nif(typeof CFB !== \"undefined\") XLSX.CFB = CFB;\n}\n/*global define */\nif(typeof exports !== 'undefined') make_xlsx_lib(exports);\nelse if(typeof module !== 'undefined' && module.exports) make_xlsx_lib(module.exports);\nelse if(typeof define === 'function' && define.amd) define('xlsx', function() { if(!XLSX.version) make_xlsx_lib(XLSX); return XLSX; });\nelse make_xlsx_lib(XLSX);\n/* NOTE: the following extra line is needed for \"Lightning Locker Service\" */\nif(typeof window !== 'undefined' && !window.XLSX) try { window.XLSX = XLSX; } catch(e) {}\n/*exported XLS, ODS */\nvar XLS = XLSX, ODS = XLSX;\n"],"names":["cptable","version","d","D","e","i","charCodeAt","charAt","enc","dec","j","split","length","module","exports","DO_NOT_EXPORT_CODEPAGE","root","factory","cpt","this","magic","sbcs_cache","dbcs_cache","magic_cache","magic_decode","magic_encode","cpdcache","cpecache","sfcc","x","String","fromCharCode","cca","has_buf","Buffer","Buffer_from","nbfs","from","buf","bind","allocUnsafe","n","mdl","mdb","sbcs_encode","cp","EE","E","keys","Object","len","ee","make_EE","data","ofmt","out","w","isBuffer","slice","toString","call","sbcs_decode","DD","c","dbcs_encode","f","jj","k","dbcs_decode","utf8_d","map","ww","direct","encache","s","null_enc","cp_decache","cache","decache","forEach","last_enc","last_cp","sbcs","dbcs","BM","utils","decode","F","Array","C","M","Error","match","dash","tt","o64","c1","c2","c3","e2","e3","e4","l","indexOf","push","join","encode","isstr","hascp","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","DO_NOT_EXPORT_JSZIP","JSZipSync","undefined","apply","globalThis","window","__webpack_require__","g","$","global","self","t","r","o","u","_dereq_","_keyStr","input","utf8","chr1","chr2","chr3","enc1","enc2","enc3","enc4","output","isNaN","replace","CompressedObject","compressedSize","uncompressedSize","crc32","compressionMethod","compressedContent","prototype","getContent","getCompressedContent","STORE","compress","content","uncompress","compressInputType","uncompressInputType","DEFLATE","table","crc","isArray","getTypeOf","b","iTop","DataReader","index","checkOffset","offset","checkIndex","newIndex","setIndex","skip","byteAt","readInt","size","result","readString","transformTo","readData","lastIndexOfSignature","sig","readDate","dostime","Date","base64","binary","dir","createFolders","date","compression","comment","string2binary","str","string2Uint8Array","uint8Array2String","array","string2Blob","buffer","arrayBuffer2Blob","outputType","checkSupport","type","MAX_VALUE_16BITS","MAX_VALUE_32BITS","pretty","findCompression","isRegExp","object","USE_TYPEDARRAY","Uint8Array","Uint16Array","Uint32Array","pako","deflateRaw","inflateRaw","options","files","load","clone","newObj","support","defaults","compressions","ZipEntries","zipEntries","file","fileName","decompressed","optimizedBinaryString","fileComment","zipComment","alloc","encoding","test","Uint8ArrayReader","NodeBufferReader","signature","nodeBuffer","StringWriter","Uint8ArrayWriter","getRawData","_data","copy","set","getBinaryData","nodebuffer","asBinary","dataToString","asUTF8","utf8decode","utf8encode","ZipObject","name","_initialMetadata","asText","asNodeBuffer","asUint8Array","asArrayBuffer","decToHex","bytes","hex","extend","attr","arguments","hasOwnProperty","fileAdd","parent","dataType","toUpperCase","prepareFileAttrs","parentFolder","folderAdd","path","substring","lastSlash","lastIndexOf","generateCompressedObjectFrom","generateZipParts","compressedObject","dosTime","dosDate","utfEncodedFileName","utfEncodedComment","useUTF8ForFileName","useUTF8ForComment","extraFields","unicodePathExtraField","unicodeCommentExtraField","getHours","getMinutes","getSeconds","getFullYear","getMonth","getDate","header","fileRecord","LOCAL_FILE_HEADER","dirRecord","CENTRAL_FILE_HEADER","stream","filter","search","filename","relativePath","fileClone","regexp","folder","arg","newFolder","ret","remove","kids","generate","writer","dirEnd","zipData","localDirLength","centralDirLength","compressionName","zipPart","CENTRAL_DIRECTORY_END","typeName","toLowerCase","append","zip","finalize","string","ZIP64_CENTRAL_DIRECTORY_LOCATOR","ZIP64_CENTRAL_DIRECTORY_END","DATA_DESCRIPTOR","StringReader","arraybuffer","ArrayBuffer","uint8array","blob","Blob","builder","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","getBlob","sig0","sig1","sig2","sig3","subarray","_utf8len","utf8border","max","pos","buf2string","c_len","utf16buf","applyFromCharCode","m_pos","str_len","buf_len","string2buf","nextBoundary","Math","min","identity","stringToArrayLike","arrayLikeToString","chunk","canUseApply","resultStr","floor","arrayLikeToArrayLike","arrayFrom","arrayTo","transform","byteLength","inputType","code","res","method","ZipEntry","jszipProto","loadOptions","checkSignature","expectedSignature","reader","readBlockEndOfCentral","diskNumber","diskWithCentralDirStart","centralDirRecordsOnThisDisk","centralDirRecords","centralDirSize","centralDirOffset","zipCommentLength","readBlockZip64EndOfCentral","zip64EndOfCentralSize","versionMadeBy","versionNeeded","zip64ExtensibleData","extraFieldId","extraFieldLength","extraFieldValue","extraDataSize","id","value","readBlockZip64EndOfCentralLocator","diskWithZip64CentralDirStart","relativeOffsetEndOfZip64CentralDir","disksCount","readLocalFiles","localHeaderOffset","readLocalPart","handleUTF8","readCentralDir","zip64","readCentralPart","readEndOfCentral","prepareReader","isEncrypted","bitFlag","useUTF8","prepareCompressedContent","previousIndex","compressedFileData","prepareContent","uncompressedFileData","localExtraFieldsLength","fileNameLength","checkCRC32","extraFieldsLength","fileCommentLength","diskNumberStart","internalFileAttributes","externalFileAttributes","readExtraFields","parseZIP64ExtraField","extraReader","start","upath","findExtraFieldUnicodePath","ucomment","findExtraFieldUnicodeComment","upathField","ucommentField","assign","zlib_deflate","strings","msg","zstream","Deflate","level","chunkSize","windowBits","memLevel","strategy","to","opt","raw","gzip","err","ended","chunks","strm","avail_out","status","deflateInit2","deflateSetHeader","deflate","deflator","mode","_mode","next_in","avail_in","Buf8","next_out","onEnd","onData","buf2binstring","shrinkBuf","deflateEnd","flattenChunks","zlib_inflate","gzheader","Inflate","inflateInit2","Z_OK","inflateGetHeader","inflate","inflator","next_out_utf8","tail","utf8str","Z_FINISH","Z_NO_FLUSH","binstring2buf","Z_STREAM_END","arraySet","inflateEnd","ungzip","TYPED_OK","Int32Array","obj","sources","source","shift","TypeError","p","fnTyped","dest","src","src_offs","dest_offs","fnUntyped","concat","setTyped","on","Buf16","Buf32","STR_APPLY_OK","STR_APPLY_UIA_OK","__","adler","s1","s2","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_BLOCK","Z_TREES","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","crcTable","makeTable","end","trees","adler32","MAX_MATCH","MIN_LOOKAHEAD","HCRC_STATE","BUSY_STATE","FINISH_STATE","errorCode","rank","zero","flush_pending","state","pending","pending_buf","pending_out","total_out","flush_block_only","last","_tr_flush_block","block_start","strstart","put_byte","putShortMSB","read_buf","wrap","total_in","longest_match","cur_match","chain_length","max_chain_length","scan","best_len","prev_length","nice_match","limit","w_size","_win","wmask","w_mask","prev","strend","scan_end1","scan_end","good_match","lookahead","match_start","fill_window","m","more","_w_size","window_size","hash_size","head","insert","ins_h","hash_shift","hash_mask","deflate_fast","flush","hash_head","bflush","match_length","_tr_tally","max_lazy_match","MIN_MATCH","last_lit","deflate_slow","max_insert","prev_match","match_available","configuration_table","Config","good_length","max_lazy","nice_length","max_chain","func","DeflateState","pending_buf_size","gzhead","gzindex","last_flush","w_bits","hash_bits","dyn_ltree","HEAP_SIZE","dyn_dtree","bl_tree","l_desc","d_desc","bl_desc","bl_count","MAX_BITS","heap","heap_len","heap_max","depth","l_buf","lit_bufsize","d_buf","opt_len","static_len","matches","bi_buf","bi_valid","deflateResetKeep","data_type","_tr_init","deflateReset","max_block_size","max_start","deflateInit","old_flush","beg","val","text","hcrc","extra","time","os","bstate","deflate_huff","deflate_rle","_tr_align","_tr_stored_block","deflateInfo","xflags","extra_len","done","_in","_out","dmax","wsize","whave","wnext","hold","bits","lcode","dcode","lmask","dmask","here","op","dist","from_source","lencode","distcode","lenbits","distbits","top","dolen","sane","inflate_fast","inflate_table","TYPE","BAD","ZSWAP32","q","InflateState","havedict","flags","check","total","wbits","ncode","nlen","ndist","have","next","lens","work","lendyn","distdyn","back","was","inflateResetKeep","inflateReset","inflateReset2","lenfix","distfix","virgin","fixedtables","sym","inflateInit","put","left","here_bits","here_op","here_val","last_bits","last_op","last_val","opts","hbuf","order","inf_leave","updatewindow","inflateInfo","lbase","lext","dbase","dext","lens_index","codes","table_index","incr","fill","low","mask","curr","drop","used","huff","base","base_index","count","MAXBITS","offs","extra_index","extra_lbits","extra_dbits","extra_blbits","bl_order","static_ltree","static_dtree","D_CODES","_dist_code","_length_code","base_length","base_dist","static_l_desc","static_d_desc","static_bl_desc","StaticTreeDesc","static_tree","extra_bits","extra_base","elems","max_length","has_stree","TreeDesc","dyn_tree","stat_desc","max_code","d_code","put_short","send_bits","send_code","tree","bi_reverse","gen_codes","next_code","init_block","LITERALS","END_BLOCK","bi_windup","smaller","_n2","_m2","pqdownheap","v","compress_block","ltree","dtree","lc","lx","build_tree","desc","node","stree","h","xbits","overflow","gen_bitlen","scan_tree","curlen","prevlen","nextlen","max_count","min_count","REP_3_6","REPZ_3_10","REPZ_11_138","send_tree","static_init_done","stored_len","copy_block","LENGTH_CODES","L_CODES","tr_static_init","opt_lenb","static_lenb","max_blindex","black_mask","detect_data_type","BL_CODES","build_bl_tree","lcodes","dcodes","blcodes","send_all_trees","STATIC_TREES","bi_flush","XLSX","current_codepage","current_ansi","VALID_ANSI","CS2CP","set_ansi","set_cp","reset_cp","char_codes","debom","utf16leread","utf16beread","_getchar","_getansi","Base64","e1","process","versions","new_raw_buf","new_unsafe_buf","s2a","s2ab","view","a2s","ab2a","bconcat","bufs","chr0","SSF","make_ssf","_strrev","pad0","pad_","rpad_","p2_32","pow","pad0r","round","pad0r1","pad0r2","isgeneral","days","months","init_table","table_fmt","default_map","defi","default_str","frac","mixed","sgn","B","P_2","P_1","P","Q_2","Q_1","Q","A","parse_date_code","b2","dow","dout","T","y","H","S","abs","date1904","setDate","getDay","fix_hijri","basedate","dnthresh","getTime","base1904","datenum_local","epoch","getTimezoneOffset","_general_int","general_fmt_num","trailing_zeroes_and_decimal","strip_decimal","mantissa_zeroes_and_decimal","exp_with_single_digit","V","log","LOG10E","toPrecision","toFixed","toExponential","small_exp","substr","large_exp","normalize_exp","general_fmt","format","write_date","fmt","ss0","ss","outl","commaify","_general_num","_general","write_num","pct1","write_num_exp","idx","period","fakee","$$","$1","$2","$3","frac1","dec1","closeparen","phone","hashq","cc","rnd","dd","_frac","write_num_flt","ffmt","write_num_cm","sfmt","mul","write_num_pct","ri","ff","aval","sign","den","parseInt","rr","myn","myd","write_num_f1","carry","oa","lres","rres","flr","write_num_exp2","write_num_int","write_num_cm2","write_num_pct2","write_num_f2","split_fmt","in_str","_split","abstime","fmt_is_date","eval_fmt","flen","dt","lst","hr","ssm","bt","nstr","myv","ostr","vv","decpt","lasti","retval","is_date","_eval","cfregex","cfregex2","chkcond","thresh","parseFloat","dateNF","lat","m1","m2","choose_fmt","load_entry","_table","get_table","load_table","tbl","CRC32","XLMLFormatMap","Currency","Fixed","Standard","Percent","Scientific","SSFImplicit","dateNFregex","signed_crc_table","bstr","seed","L","crc32_buf_8","_fs","CFB","fs","dirname","write_dos_date","hms","write_shift","ymd","parse_extra_field","prep_blob","read_shift","sz","tgt","mtime","atime","ctime","mt","get_fs","parse","parse_zip","mver","nmfs","difat_sec_cnt","dir_start","minifat_start","difat_start","ssz","fat_addrs","mv","chk","HEADER_SIGNATURE","check_get_mver","check_shifts","dir_cnt","sectors","nsectors","ceil","sectorify","sleuth_fat","sector_list","sl","chkd","buf_chain","modulus","seen","addr","__readInt32LE","nodes","__toBuffer","make_sector_list","ENDOFCHAIN","Paths","FileIndex","FullPaths","mini","minifat_store","pl","sector","namelen","__utf16le","color","R","clsid","ct","read_date","storage","get_sector_list","get_mfat_entry","read_directory","FI","FP","dad","build_full_paths","entry","payload","MSSZ","new_buf","cnt","__readUInt32LE","init_cfb","cfb","CLSID","nm","find","rebuild_cfb","seed_cfb","gc","_file","pop","now","HEADER_CLSID","sort","Z","namecmp","elt","_write","_opts","fileType","cdirs","start_cd","fcnt","fp","fi","crcs","sz_cd","namebuf","outbuf","_deflateRawSync","write_zip","mini_size","fat_size","mfat_cnt","fat_base","fat_cnt","difat_cnt","HEADER_SIG","chainit","consts","DIFSECT","FATSECT","_nm","_zlib","MAXREGSECT","FREESECT","HEADER_MINOR_VERSION","MAXREGSID","NOSTREAM","EntryTypes","deflateRawSync","_deflate","CLEN_ORDER","LEN_LN","DST_LN","bit_swap_8","use_typed_arrays","bitswap8","bit_swap_n","rev","read_bits_2","bl","read_bits_3","read_bits_5","read_bits_7","read_bits_n","realloc","a","zero_fill_array","_deflateRaw","boff","off","clens","cmap","MAX","maxlen","ccode","ctree","cleni","fix_lmap","fix_dmap","dlens","dyn_lmap","dyn_dmap","dyn_cmap","dyn_len_1","dyn_len_2","dyn","_HLIT","_HDIST","_HCLEN","read_bits_4","hcodes","h1","h2","_inflate","usz","woff","OL","max_len_1","max_len_2","len_eb","dst_eb","dst","warn_or_throw","wrn","console","error","csz","efsz","fcsz","EF","parse_local_file","meth","setMilliseconds","setFullYear","setMonth","setHours","setMinutes","setSeconds","parse_dos_date","_csz","_usz","ef","InflRaw","InflateRaw","_processChunk","_finishFlushFlag","bytesRead","_inflateRawSync","_crc32","cfb_add","unsafe","fpath","cfb_gc","UCFullPaths","UCPaths","UCPath","read","readFileSync","read_file","write","writeFileSync","writeFile","cfb_new","cfb_del","splice","cfb_mov","old_name","new_name","ReadShift","CheckField","use_zlib","zlib","message","_inflateRaw","blobify","a2u","write_dl","fname","utf8write","IE_SaveFile","navigator","msSaveBlob","saveAs","URL","document","createElement","createObjectURL","url","chrome","downloads","download","revokeObjectURL","setTimeout","href","body","appendChild","click","removeChild","File","Folder","open","close","ks","o2","evert_key","key","K","evert","evert_num","datenum","refdate","refoffset","numdate","setTime","parse_isodur","sec","good_pd_date","good_pd","parseDate","fixdate","cc2str","arr","dup","JSON","stringify","fuzzynum","Number","isFinite","NaN","wt","fuzzydate","getYear","jszip","safe_split_regex","getdatastr","safegetzipfile","getzipfile","getzipdata","safe","getdatabin","getzipstr","zip_add_file","zip_new","zip_read","resolve_path","target","step","XML_HEADER","attregexg","tagregex","nsregex","nsregex2","parsexmltag","tag","skip_root","skip_LC","z","eq","quot","trim","strip_ns","encregex","coderegex","encodings","rencoding","unescapexml","decregex","charegex","escapexml","escapexmltag","htmlcharegex","escapehtml","xlml_fixstr","entregex","entrepl","parsexmlbool","utf8read","orig","utf8readb","corpus","utf8readc","mtcache","entities","vt_cache","matchtag","RegExp","htmldecode","vtregex","vtvregex","vtmregex","parseVector","baseType","WTF","wtregex","writetag","wxt_helper","writextag","write_w3cdtf","toISOString","__lpp4","___lpp4","XMLNS","dc","dcterms","dcmitype","mx","sjs","vt","xsi","xsd","XLMLNS","___toBuffer","__readUInt16LE","___utf16le","__hexlify","___hexlify","__utf8","__readUInt8","___utf8","__lpstr","___lpstr","__cpstr","___cpstr","__lpwstr","___lpwstr","__double","___double","__8lpp4","___8lpp4","Infinity","read_double_le","is_buf","readUInt32LE","readDoubleLE","__readInt16LE","__readInt32BE","oI","oR","loc","oo","__writeUInt32LE","__writeInt32LE","__writeUInt16LE","WriteShift","cppayload","bs","av","LN2","write_double_le","hexstr","fld","parsenoop","recordhopper","cb","tmpbyte","cntbyte","RT","XLSBRecordEnum","buf_array","blksz","newblk","curbuf","endbuf","_bufs","write_record","ba","XLSBRE","shift_cell_xls","cell","cRel","rRel","biff","shift_range_xls","range","encode_cell_xls","encode_cell","encode_range_xls","encode_row","encode_col","decode_row","rowstr","row","decode_col","colstr","col","decode_cell","cstr","decode_range","encode_range","cs","ce","safe_decode_range","format_cell","BErr","XF","numFmtId","safe_format_cell","sheet_to_workbook","sheet","sheets","SheetNames","Sheets","sheet_add_aoa","_ws","dense","ws","_R","_C","origin","_origin","_range","__R","__C","nullError","sheetStubs","cellDates","cell_ref","aoa_to_sheet","write_UInt32LE","parse_XLWideString","cchCharacters","write_XLWideString","_null","parse_StrRun","ich","ifnt","parse_RichStr","rgsStrRun","dwSizeStrRun","O","_crypto","crypto","rc4","md5","createHash","update","digest","make_offcrypto","parse_BrtCommentText","parse_XLSBCell","iStyleRef","write_XLSBCell","parse_XLSBShortCell","write_XLSBShortCell","parse_XLSBCodeName","write_XLSBCodeName","parse_XLNullableWideString","write_XLNullableWideString","parse_XLNameWideString","parse_RelID","write_RelID","parse_RkNumber","fX100","fInt","RK","write_RkNumber","d100","parse_RfX","parse_UncheckedRfX","write_UncheckedRfX","parse_Xnum","write_Xnum","write_BrtColor","auto","theme","nTS","tint","rgb","parse_ClipboardFormatOrString","VT_STRING","VT_CUSTOM","DocSummaryPIDDSI","VT_VECTOR","SummaryPIDSI","DocSummaryRE","SummaryRE","CountryEnum","XLSFillPattern","XLSIcv","RBErr","ct2type","CT_LIST","workbooks","xlsx","xlsm","xlsb","xlam","xltx","strs","comments","charts","dialogs","macros","styles","type2ct","evert_arr","CT","CTYPE_XML_ROOT","xmlns","CTYPE_DEFAULTS","rels","Extension","ContentType","RELS","WB","SHEET","HLINK","VML","XPATH","XMISS","XLINK","CXML","CXMLP","VBA","get_rels_path","parse_rels","currentFilePath","hash","rel","Type","Target","Id","TargetMode","canonictarget","RELS_ROOT","write_rels","rid","RELS_EXTERN","add_rels","rId","relobj","targetmode","write_rdf_type","write_rdf_has","write_meta_ods","CORE_PROPS","CORE_PROPS_REGEX","parse_core_props","cur","CORE_PROPS_XML_ROOT","cp_doit","EXT_PROPS","load_props_pairs","HP","TOP","props","hp","parts","Worksheets","NamedRanges","DefinedNames","Chartsheets","ChartNames","EXT_PROPS_XML_ROOT","CUST_PROPS","custregex","CUST_PROPS_XML_ROOT","XLMLDocPropsMap","Title","Subject","Author","Keywords","Comments","LastAuthor","RevNumber","Application","LastPrinted","CreatedDate","ModifiedDate","Category","Manager","Company","AppVersion","ContentStatus","Identifier","Language","evert_XLMLDPM","xlml_set_prop","Props","parse_FILETIME","dwLowDateTime","dwHighDateTime","parse_lpstr","pad","parse_lpwstr","parse_VtStringBase","stringType","parse_VtString","parse_VtHeadingPair","headingString","parse_TypedPropertyValue","parse_dictionary","CodePage","dict","pid","parse_BLOB","Size","parse_ClipboardData","parse_VtUnalignedString","cElements","parse_VtVecHeadingPairValue","parse_VtVecLpwstrValue","parse_VtVecUnalignedLpstrValue","write_TypedPropertyValue","write_FILETIME","parse_PropertySet","PIDSI","start_addr","NumProps","Dictionary","DictObj","PropID","Offset","PropH","fail","piddsi","oldpos","parsebool","XLSPSSkip","guess_property_type","write_PropertySet","entries","RE","hdr","piao","prop","pr","pio","unshift","pinfo","parse_PropertySetStream","NumSets","FMTID0","FMTID1","Offset0","Offset1","SystemIdentifier","PSet1","PSet0","rval","FMTID","write_PropertySetStream","entries2","clsid2","ps0","ps1","parsenoop2","writebool","parseuint16","writeuint16","parseuint16a","parslurp","write_Bes","parse_ShortXLUnicodeString","cch","parse_XLUnicodeRichExtendedString","cbExtRst","fExtSt","fRichSt","width","cRun","write_XLUnicodeRichExtendedString","xlstr","otext","parse_XLUnicodeStringNoCch","parse_XLUnicodeString","parse_XLUnicodeString2","write_XLUnicodeString","parse_HyperlinkString","write_HyperlinkString","write_Hyperlink","hl","hashidx","Pretarget","parse_LongRGBA","parse_LongRGB","parse_XLSCell","ixfe","write_XLSCell","parse_XTI","parse_RkRec","parse_Ref8U","rwFirst","rwLast","write_Ref8U","parse_RefU","parse_Ref","parse_FtCmo","ot","parse_FtSkip","FtTab","cf","fSharedNote","parse_BOF","BIFFVer","write_BOF","wb","bookType","write_BoundSheet8","hs","parse_DefaultRowHeight","miyRw","Unsynced","DyZero","ExAsc","ExDsc","write_Format","b5","parse_BIFF2Format","parse_Dimensions","write_XF","ixfeP","style","parse_BoolErr","parse_Bes","parse_XLHeaderFooter","parse_ExternName","fBuiltIn","fWantAdvise","fWantPict","fOle","fOleLink","fIcon","sbcch","udfName","parse_AddinUdf","Name","XLSLblBuiltIn","parse_Lbl","chKey","cce","itab","npflen","rgce","rgcb","parse_Rgce","parse_RgbExtra","parse_NameParsedFormula","parse_ExternSheet","parse_BIFF5ExternSheet","parse_Array","ref","parse_ArrayParsedFormula","parse_BIFF5OT","write_HLink","write_HLinkTooltip","TT","Tooltip","parse_ColInfo","cellStyles","colFirst","colLast","coldx","cchName","parse_Blank","parse_Scl","parse_String","DBF","dbf_codepage_map","dbf_reverse_map","dbf_to_sheet","ft","memo","vfp","l7","nrow","fpos","rlen","current_cp","codepage","fields","field","hend","sheetRows","dbf_to_aoa","_RLEN","to_workbook","to_sheet","from_sheet","aoa","sheet_to_json","headers","hcnt","coltypes","guess","_guess","hf","_f","hb","rout","_s","SYLK","sylk_escapes","AA","BA","CA","DA","HA","JA","AE","BE","CE","HE","AI","BI","CI","HI","AO","BO","CO","DO","HO","AU","BU","CU","HU","Aa","Ba","Ca","Da","Ha","Ja","Ae","Be","Ce","He","Ai","Bi","Ci","Hi","Ao","Bo","Co","Do","Ho","Au","Bu","Cu","Hu","KC","Kc","DN","Dn","Hy","sylk_char_regex","sylk_char_fn","_","decode_sylk_char","newcc","sylk_to_aoa_str","records","rj","formats","next_cell_format","sht","rowinfo","colinfo","cw","Mval","rstr","record","C_seen_K","C_seen_X","C_seen_S","C_seen_E","formula","rc_to_a1","shrbase","shift_formula_str","F_seen","hidden","wch","process_col","hpt","hpx","pt2px","sylk_to_sheet","aoasht","sylk_to_aoa","write_ws_cell_sylk","a1_to_rc","preamble","RS","rec","wpx","width2px","px2char","rows","px2pt","write_ws_rows_sylk","coord","DIF","dif_to_aoa_str","metadata","dif_to_sheet","dif_to_aoa","push_field","push_value","sheet_to_dif","topic","ETH","eth_to_sheet","eth_to_aoa","sep","meta","sheet_to_eth_data","PRN","set_text_arr","guess_seps","guess_sep_weights","guess_sep","instr","dsv_to_sheet_str","FS","sepcc","startcc","_re","finish_cell","Y","datestr","timestr","dateNF_fix","cellText","cellNF","outer","prn_to_sheet","firstbyte","lines","prn_to_aoa_str","prn_to_sheet_str","WK_","lotushopper","Enum","WK1Enum","lotus_to_workbook_buf","next_n","sidx","snames","realnames","refguess","vers","qpro","tmpcell","WK3Enum","osheets","rnames","parse_cell","parse_LABEL","write_LABEL","write_INTEGER","write_NUMBER","wk1_parse_rc","FuncTab","BinOpTab","parse_cell_3","write_LABEL_16","wsidx","parse_NUMBER_17","v1","v2","write_NUMBER_17","log2","parse_NUMBER_27","parse_SHEETNAMECS","write_XFORMAT_SHEETNAME","argc","argL","argR","args","wk1_fmla_to_csf","sheet_to_wk1","cols","write_biff_rec","write_RANGE","max_R","book_to_wk3","wscnt","write_BOF_WK3","parse_rs","tregex","rpregex","parse_r","rpr","font","pass","shadow","outline","strike","uval","family","valign","parse_rpr","rregex","rend","rs","rs_to_html","nlregex","r_to_html","terms","intro","outro","align","parse_rpr2","sitregex","sirregex","sirphregex","parse_si","html","cellHTML","sstr0","sstr1","sstr2","SST","straywsregex","write_sst_xml","sst","bookSST","main","Count","uniqueCount","Unique","sitag","write_BrtSSTItem","write_sst_bin","write_BrtBeginSst","_JS2ANSI","parse_CRYPTOVersion","Major","Minor","parse_DataSpaceMapEntry","comps","parse_EncryptionHeader","Flags","AlgID","valid","AlgIDHash","KeySize","ProviderType","CSPName","parse_EncryptionVerifier","Salt","Verifier","VerifierHash","parse_EncInfoStd","parse_EncInfoExt","parse_EncInfoAgl","KeyData","xml","encryptedHmacKey","encryptedHmacValue","encs","uri","crypto_CreatePasswordVerifier_Method1","Password","PasswordArray","PasswordDecoded","PadArray","InitialCode","XorMatrix","XorRor","crypto_CreateXorArray_Method1","byte1","byte2","Byte","password","Temp","PasswordLastChar","PadIndex","XorKey","CurrentElement","Char","CreateXorKey_Method1","Index","ObfuscationArray","RTF","rtf_to_sheet","rtf_to_sheet_str","rowtf","rtfre","last_index","exec","lastIndex","rgb2Hex","rgb_tint","hsl","G","H6","L2","rgb2HSL","hex2RGB","X","h6","hsl2RGB","MDW","px","char2width","chr","cycle_width","collw","find_mdw_colw","delta","_MDW","coll","customWidth","PPI","pt","numFmtRegex","cellXfRegex","fillsRegex","fontsRegex","bordersRegex","XLMLPatternTypeMap","None","Solid","Gray50","Gray75","Gray25","HorzStripe","VertStripe","ReverseDiagStripe","DiagStripe","DiagCross","ThickDiagCross","ThinHorzStripe","ThinVertStripe","ThinReverseDiagStripe","ThinHorzCross","cellXF_uint","cellXF_bool","parse_sty_xml","themes","NumberFmt","formatCode","parse_numFmts","Fonts","bold","italic","underline","condense","vertAlign","scheme","indexed","icv","themeElements","clrScheme","parse_fonts","Fills","patternType","bgColor","fgColor","parse_fills","Borders","border","diagonalUp","diagonalDown","parse_borders","xf","CellXf","alignment","vertical","horizontal","textRotation","indent","wrapText","parse_cellXfs","STYLES_XML_ROOT","write_sty_xml","NF","write_numFmts","cellXfs","write_cellXfs","write_BrtFmt","STY","rev_XLSBFillPTNames","parse_BrtFill","write_BrtFill","fls","write_BrtXF","write_Blxf","parse_BrtBorder","write_sty_bin","write_FMTS_bin","grbit","write_FontFlags","sss","charset","write_BrtFont","write_FONTS_bin","write_FILLS_bin","write_BrtBorder","write_BORDERS_bin","fontId","fillId","borderId","write_CELLSTYLEXFS_bin","write_CELLXFS_bin","xfId","builtinId","write_BrtStyle","write_STYLES_bin","write_DXFS_bin","write_BrtBeginTableStyles","write_TABLESTYLES_bin","THEME","XLSXThemeClrScheme","parse_clrScheme","lastClr","parse_fontScheme","parse_fmtScheme","clrsregex","fntsregex","fmtsregex","themeltregex","parse_theme_xml","write_theme","parse_themeElements","Themes","themeXLSX","parse_ExtProp","extType","xclrType","nTintShade","xclrValue","parse_IcvXF","parse_ColorTheme","parse_FullColorExt","parse_XFExtGradient","update_xfext","xfext","xfe","IMG","DRAW","_shapeid","write_comments_vml","csize","bbox","joinstyle","gradientshapeok","coordsize","fillopts","color2","angle","fillparm","fillxml","fillcolor","strokecolor","obscured","CMNT","CMNT_XML_ROOT","write_comments_xml","iauthor","parse_BrtCommentAuthor","write_comments_bin","write_BrtCommentAuthor","write_BrtBeginComment","run","write_StrRun","write_BrtCommentText","VBAFMTS","DS","MS","rcregex","rcbase","rcfunc","fstr","crefregex","$0","$4","$5","shift_formula_xlsx","_xlfn","parseread1","parse_ColRelU","parse_RgceArea","parse_RgceArea_BIFF2","parse_RgceLoc","parse_RgceLoc_BIFF2","parse_RgceElfLoc","fQuoted","parse_PtgAttrSpaceType","parse_SerAr","parse_PtgExtraMem","parse_PtgExtraArray","parse_PtgElfLoc","parse_PtgElfNoop","parse_PtgElfCol","parse_PtgElfColS","parse_PtgElfColSV","parse_PtgElfColV","parse_PtgElfLel","parse_PtgElfRadical","parse_PtgElfRadicalLel","parse_PtgElfRadicalS","parse_PtgElfRw","parse_PtgElfRwV","PtgListRT","PtgTypes","iftab","FtabArgc","Ftab","cparams","tab","parsetab","Cetab","nameindex","rl","parse_RgceLocRel_BIFF2","cl","parse_RgceLocRel","area","parse_RgceAreaRel","ixti","parse_PtgNameX_BIFF5","PtgDupes","Ptg18","coltype","rt","Ptg19","bitSemi","bitIf","bitGoto","ptgs","stringify_array","PtgBinOp","PtgAdd","PtgConcat","PtgDiv","PtgEq","PtgGe","PtgGt","PtgLe","PtgLt","PtgMul","PtgNe","PtgPower","PtgSub","quoteCharacters","get_ixti_raw","supbooks","XTI","SID","get_ixti","ixtiraw","sname","formula_quote_sheet_name","stringify_formula","stack","nameidx","last_sp","sp","fflen","lbl","names","XLSXFutureFunctions","externbook","bookidx","ixtidata","lp","rp","sharedf","parsedf","fnd","arrayf","_left","parse_SharedParsedFormula","parse_Formula","parse_FormulaValue","cbf","parse_XLSCellParsedFormula","shared","parse_XLSBParsedFormula","parse_XLSBArrayParsedFormula","parse_XLSBCellParsedFormula","parse_XLSBNameParsedFormula","parse_XLSBSharedParsedFormula","ods_to_csf_formula","csf_to_ods_formula","ods_to_csf_3D","csf_to_ods_3D","_ssfopts","WS","browser_has_Map","Map","get_sst_id","has","revarr","get","col_obj_w","outlineLevel","default_margins","margins","defs","right","bottom","footer","get_cell_style","revssf","ssf","applyNumberFormat","safe_format","fmtid","fillid","raw_rgb","check_ws","mergecregex","sheetdataregex","hlinkregex","dimregex","colregex","afregex","marginregex","sheetprregex","sheetprregex2","svsregex","parse_ws_xml_sheetpr","sheetPr","codeName","CodeName","sheetprot_deffalse","sheetprot_deftrue","sviewregex","write_ws_xml_cell","oldt","oldv","Strings","revStrings","cellregex","rowregex","isregex","refregex","match_v","match_f","parse_ws_xml_data","sdata","sstr","ftag","cells","cref","tagr","tagc","do_format","rowobj","rowrite","marr","marrlen","xlen","rstarti","outa","ht","rslice","cellFormula","xlfn","___f","si","_tag","_r","WS_XML_ROOT","write_ws_xml","rdata","_drawing","needed","vbaraw","cname","Workbook","outlineprops","summaryBelow","summaryRight","above","write_ws_xml_sheetpr","sview","workbookViewId","Views","rightToLeft","RTL","write_ws_xml_sheetviews","sheetFormat","defaultRowHeight","baseColWidth","outlineLevelRow","params","height","_cell","customHeight","write_ws_xml_data","write_ws_xml_protection","Names","Sheet","Ref","write_ws_xml_autofilter","merges","margin","relc","location","tooltip","ignoreEC","numberStoredAsText","sqref","write_row_header","ncolspan","lcs","caddr","first","write_BrtRowHdr","parse_BrtWsDim","write_BrtWsDim","parse_BrtShortReal","parse_BrtMergeCell","write_BrtMergeCell","BrtMarginKeys","write_ws_bin_cell","last_seen","ncell","write_BrtShortIsst","write_BrtCellIsst","write_BrtShortSt","write_BrtCellSt","write_BrtShortRk","write_BrtCellRk","write_BrtShortReal","write_BrtCellReal","write_BrtShortBool","write_BrtCellBool","write_BrtShortError","write_BrtCellError","write_BrtShortBlank","write_BrtCellBlank","write_ws_bin","write_BrtWsProp","write_BrtBeginWsView","write_WSVIEWS2","write_BrtColInfo","write_COLINFOS","cap","write_CELLTABLE","write_BrtSheetProtection","write_SHEETPROTECT","write_AUTOFILTER","write_BrtBeginMergeCells","write_MERGECELLS","locidx","write_BrtHLink","write_HLINKS","write_BrtMargins","write_BrtCellIgnoreEC","write_IGNOREECS","write_LEGACYDRAWING","CHART","CHARTEX","CS","WBPropsDef","WBViewDef","SheetDef","CalcPrDef","push_defaults_array","push_defaults","parse_wb_defaults","WBProps","CalcPr","WBView","badchars","check_ws_name","_good","wbnsregex","WB_XML_ROOT","write_wb_xml","write_names","workbookPr","Hidden","sheetId","Comment","localSheetId","write_BrtBundleSh","iTabID","strRelID","parse_BrtFRTArchID$","ArchID","write_wb_bin","write_BrtFileVersion","filterPrivacy","write_BrtWbProp","vistab","write_BrtBookView","write_BOOKVIEWS","write_BUNDLESHS","parse_ws","ai","af","seencol","R_n","aii","_d","relId","Rel","rfx","tmpref","parse_ws_bin","data1","data2","mtch","parse_ws_xml_sheetpr2","ridx","parse_ws_xml_dim","svs","zoomScale","zoom","parse_ws_xml_sheetviews","columns","coli","colm","colM","parse_ws_xml_cols","afilter","parse_ws_xml_autofilter","_merge","hlink","rng","parse_ws_xml_hlinks","parse_ws_xml_margins","parse_ws_xml","write_wb","write_ws","write_sst","write_cmnt","attregexg2","attregex2","xlml_parsexmltag","words","xlml_parsexmltagobj","xlml_set_custprop","Custprops","oval","process_style_xlml","stag","Interior","I","Pattern","ID","parse_xlml_data","csty","nf","sid","StyleID","interiors","Parent","UTC","safe_format_xlml","Formula","ArrayRange","xlml_clean_comment","xlml_normalize","xlmlregex","parse_xlml_xml","Rn","opening","ishtml","_o","HTML_","tmp","sheetnames","cursheet","sheetname","dtag","didx","fidx","pidx","cstys","wsprops","raw_Rn3","HRef","HRefScreenTip","MergeAcross","MergeDown","cma","cmd","AutoFitHeight","Height","Format","ssfidx","Width","_col","Span","_NamedRange","_DefinedName","RefersTo","AutoFilter","Range","parse_fods","Margin","pagemargins","Top","Left","Right","Bottom","bookSheets","bookProps","parse_xlml","fix_read_opts","write_name_xlml","write_ws_xlml_cell","mi","_v","write_ws_xlml_row","write_ws_xlml","write_ws_xlml_names","write_ws_xlml_table","objects","scenarios","selectLockedCells","selectUnlockedCells","write_ws_xlml_wsopts","write_xlml","General","xlml_write_docprops","BLACKLIST","xlml_write_custprops","write_props_xlml","write_sty_xlml","write_names_xlml","slurp","insitu","XLSRecordEnum","ll","safe_format_xf","make_cell","PSCLSID","parse_xlscfb","CompObj","WorkbookP","AnsiUserType","AnsiClipboardFormat","parse_ClipboardFormatOrAnsiString","Reserved1","UnicodeClipboardFormat","parse_ClipboardFormatOrUnicodeString","Reserved2","parse_compobj","lastcell","cmnt","rngC","rngR","temp_val","country","Directory","last_formula","cur_sheet","Preamble","last_cell","XFs","palette","get_rgb","addcell","line","file_depth","xfd","icvFore","icvBack","process_cell_style","afi","rrtabid","lastuser","winlocked","wtf","last_lbl","last_Rn","BIFF2Fmt","BIFF2FmtTable","FilterDatabases","seen_codepage","RecordType","Date1904","WriteProtect","cpval","CalcRefMode","FullCalc","fDialog","fBelow","fRight","ExternCount","tmpri","biffguess","fakebs8","rknum","rkrec","_fr","_fc","_fe","_arraystart","isst","_j","_ixfe","b4idx","b2idx","cmo","lastobj","TxO","ImData","noteobj","ext","Encryption","Metadata","Country","parse_workbook","bookVBA","newcfb","newpath","make_vba_xls","DSI","DocSummary","SI","Summary","HeadingPairs","TitlesOfParts","parse_xls_props","bookFiles","Ptg","fBold","fItalic","fUnderline","fStrikeout","fOutline","fShadow","fCondense","fExtend","parse_FontFlags","bCharSet","xColorType","bR","bG","bB","parse_BrtColor","ixfeParent","ifmt","defaultThemeVersion","strName","autoCompressPictures","backupFile","checkCompatibility","hidePivotFieldList","promptedSolutions","publishItems","refreshAllConnections","saveExternalLinkValues","showBorderUnselectedTables","showInkAnnotation","showObjects","showPivotChartFilter","updateLinks","fAlwaysCalc","display","idObj","stAuthor","parse_NoteSh","Info","Data","EncryptionVersionInfo","EncryptedVerifier","EncryptedVerifierHash","parse_RC4Header","EncryptionHeader","EncryptionVerifier","parse_RC4CryptoHeader","parse_FilePassHeader","XorArrayIndex","XorArray","verificationBytes","verifier","Value","crypto_DecryptData_Method1","parse_XORObfuscation","dyHeight","fl","Pos","Dim","CurTab","FirstTab","Selected","TabRatio","UserName","fts","parse_BIFF5Obj","parse_FtArray","ccv","rw","rkrecs","lastcol","ixfes","fStyle","alc","fWrap","alcV","fJustLast","trot","cIndent","fShrinkToFit","iReadOrder","fAtrNum","fAtrFnt","fAtrAlc","fAtrBdr","fAtrPat","fAtrProt","dgLeft","dgRight","dgTop","dgBottom","icvLeft","icvRight","grbitDiag","icvTop","icvBottom","icvDiag","dgDiag","fsxButton","parse_CellStyleXF","cmcs","ucnt","extsst","dsst","ctab","virtPath","rgst","texts","accel","parse_ControlInfo","cchText","sVer","displayName","targetFrameName","moniker","oleMoniker","guid","fileTime","Loc","parse_URLMoniker","cAnti","ansiPath","parse_FileMoniker","parse_HyperlinkMoniker","parse_Hyperlink","xnum","cUse","wzTooltip","cxfs","cexts","cchComment","themeXML","parse_frtHeader","def","num","env","lcb","XLSRE","write_BIFF2Cell","write_ws_biff2_cell","write_BIFF2NUM","write_BIFF2BERR","write_BIFF2LABEL","write_ws_biff8_cell","bf","o1","write_FormulaValue","o3","write_Formula","write_Number","write_BoolErr","write_LabelSst","b8","write_Label","write_ws_biff8","_WB","_sheet","MAX_ROWS","guts","write_Guts","write_ColInfo","write_ws_cols_biff8","write_Dimensions","write_Window2","write_MergeCells","HL","write_ws_biff8_hlinks","write_FEAT","write_biff8_global","_sheets","_wb","writezeroes","write_WriteAccess","write_RRTabId","write_Window1","safe1904","write_Font","write_FONTS_biff8","write_FMTS_biff8","write_CELLXFS_biff8","write_Country","write_biff_continue","write_SST","blen","write_biff_buf","fix_write_opts","write_biff8_buf","write_ws_biff2","write_biff2_buf","html_to_sheet","mtch2","re","split_regex","hd","midx","colspan","rowspan","_t","make_html_row","editable","make_html_preamble","_BEGIN","_END","book_new","book_append_sheet","_row","BEGIN","END","_preamble","sheet_add_dom","or_R","or_C","getElementsByTagName","is_dom_element_hidden","elts","hasAttribute","getAttribute","innerHTML","Aelts","Aelti","parse_dom_table","element","get_computed_style","ownerDocument","defaultView","getComputedStyle","get_get_computed_style_function","getPropertyValue","parse_text_p","number_formats","parse_content_xml","fixed","day","month","year","hours","minutes","seconds","era","quarter","sheetag","rowtag","NFtag","ctag","textp","textpidx","textR","row_ol","number_format_map","mrange","rowpeat","colpeat","atag","_Ref","creator","creatoridx","isstub","intable","rptR","rpt","nrange","ptp","parse_ods","FEtag","parse_manifest","write_styles_ods","master_styles","write_content_ods","write_text_p","null_cell_xml","ods","ROWS","_Fref","text_p","_tgt","fods","cidx","colobj","write_automatic_styles_ods","write_ods","manifest","rdf","write_rdf","write_manifest","write_obj_str","write_sheet_index","write_htm_str","write_csv_str","sheet_to_csv","write_slk_str","write_dif_str","write_prn_str","write_rtf_str","write_txt_str","sheet_to_txt","write_dbf_buf","write_eth_str","write_wk1_buf","fix_opts_func","safe_parse_sheet","relsPath","sheetRels","stype","parse_cs_bin","parse_cs_xml","parse_cs","dfile","drelsp","draw","parse_drawing","chartp","crelsp","csheet","nc","parse_Cache","parse_chart","parse_ds","authors","author","parse_comments_bin","commentList","authtag","cmnttag","cm","authorId","textMatch","parse_comments_xml","parse_cmnt","encoded","sheet_insert_comments","strip_front_slash","binname","zipentries","links","coreprops","extprops","custprops","calcchains","vba","drawings","TODO","ctext","PartName","calcchain","parse_ct","parse_sst_bin","parse_sst_xml","parse_sst","parse_theme","parse_sty_bin","parse_sty","link","parse_xlink_bin","parse_xlink","parse_wb_bin","dname","dnstart","parse_wb_xml","parse_wb","propdata","parse_ext_props","toks","warn","parse_cust_props","deps","bookDeps","parse_cc_bin","parse_cc_xml","wbsheets","wbext","wbrelsi","wbrelsfile","wbrels","safe_parse_wbrels","nmode","wsloop","snjseen","snj","Deps","Styles","bin","parse_xlsxcfb","U","W","parse_DataSpaceVersionInfo","dsm","parse_DataSpaceMap","seds","parse_DataSpaceDefinition","parse_TransformInfoHeader","ename","cmode","parse_Primary","einfo","parse_EncryptionInfo","decrypt_agile","decrypt_std76","foo","vbafmt","write_core_props","_sn","_i","write_ext_props","write_vt","write_cust_props","wsrels","need_vml","rId1","write_sty","f1","f2","f3","write_ct","read_plaintext","read_prn","readSync","infile","read_binary","bstrify","ab","vu","read_cfb","OLD_WTF","read_wb_ID","read_zip","read_utf16","read_plaintext_raw","write_cfb_ctr","write_string_type","bom","write_binary_type","writeSync","N","cn","check_wb","write_stxt_type","wbpath","Keys","DSEntries","SEntries","CEntries","CEntries2","write_xls_props","fill_vba_xls","write_xlscfb","write_cfb_type","oopts","encrypt_agile","write_zip_type","resolve_book_type","xls","htm","slk","socialcalc","Sh33tJS","make_json_row","defval","isempty","defineProperty","enumerable","__rowNum__","rawNumbers","outi","counter","CC","blankrows","qreg","make_csv_row","txt","forceQuotes","endregex","skipHidden","strip","sheet_to_formulae","cmds","sheet_add_json","js","skipHeader","JS","sheet_get_cell","split_cell","get_formulae","make_csv","make_json","make_formulae","json_to_sheet","table_to_sheet","table_to_book","sheet_to_html","sheet_to_row_object_array","get_default","ws_get_cell_stub","RC","book_set_sheet_visibility","sh","vis","wb_sheet_idx","cell_set_number_format","cell_set_hyperlink","cell_set_internal_link","cell_add_comment","sheet_set_array_formula","rngstr","strmod","Readable","to_json","objectMode","_read","to_html","to_csv","BOM","readFile","writeFileAsync","_cb","Function","make_xlsx_lib"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"async-export.js","mappings":"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C,GAAAhQ,GA5FA,CAEA,EACA,SACA,SACA,MACA,IACA,SACA,SACA,MAGA,EACA,SACA,SACA,MACA,IACA,SACA,SACA,MAEA,QACA,MACA,IACA,QACA,QACA,MACA,SACA,QACA,SACA,SACA,SACA,SACA,QACA,SACA,MACA,SAEA,IACA,SACA,SACA,MACA,QACA,QACA,MACA,IACA,MACA,SACA,SACA,SACA,SACA,SACA,SACA,SAEA,QACA,QACA,SACA,SACA,SACA,SACA,QACA,QACA,MACA,QACA,MACA,QACA,SACA,SACA,QACA,QAGA,SACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GA9FuB9uC,IAAA,SAAAzC,GAA6B,OAAAA,GAAA,OAAAA,GAAA,UAAAA,EAAA,IAmGpDk8C,GAAA,CACA,WACA,YACA,aACA,WACA,YACA,WACA,UACA,mBACA,aAEAsF,GAAA/Q,EAAAyL,IAKAuF,GAA8B,CAE9B,yFAGA,6CAGA,iDACA,6CAGA,yEACA,kFACA,mFAGA,+EACA,oFAGA,6CACA,oFAGA,2EAGA,uDAGA,kDAGA,+CAGA,kDACA,yFAGA,qFAGA,2CACA,+CAGA,mDAGA,8CACA,qFAGA,gDACA,uFAGA,gDACA,uFAGA,uDACA,oDACA,8FACA,2FAGA,6CACA,oFAGA,4CACA,kDACA,8CACA,yFACA,qFACA,mFAGA,mDACA,0FAGA,yCACA,8CACA,6CACA,kDAGA,4CAGA,wCACA,+EAGA,mEAGA,yEAGA,+CACA,oDAGA,6CACA,sDAGA,wDACA,8FAGA,wDAGA,kEAGA,6CAGA,uEACA,iFACA,mFACA,iFACA,mFACA,kFAGA,kEAEA,kEACA,iEAGA,mBAEAlF,MAAA,MAGAmF,IAsCAvgD,EArCA6E,GAAA,CACA27C,UAAA,CACAC,KAAA,6EACAC,KAAA,uDACAC,KAAA,0DACAC,KAAA,uDACAC,KAAA,iFAEAC,KAAA,CACAL,KAAA,gFACAE,KAAA,0CAEAI,SAAA,CACAN,KAAA,2EACAE,KAAA,qCAEAtF,OAAA,CACAoF,K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,eACA,aACA,mBACA,iBACA,eACA,aACA,iBACA,kBACA,kBACA,UACA,iBACA,WACA,mBACA,eACA,WACA,YACA,qBACA,kBACA,UACA,SACA,UACA,WACA,WACA,mBACA,iBACA,YACA,gBACA,eACA,iBACA,kBACA,kBACA,kBACA,sBACA,sBACA,kBACA,iBACA,oBACA,kBACA,iBACA,qBACA,iBACA,eACA,iBACA,eACA,mBACA,UACA,YACA,iBACA,eACA,kBACA,sBACA,cACA,gBACA,aACA,WACA,mBACA,iBACA,iBACA,WACA,aACA,UACA,YACA,eACA,aACA,kBACA,mBACA,oBACA,qBACA,wBACA,wBACA,eACA,oBACA,oBACA,oBACA,oBACA,mBACA,aACA,kBACA,oBACA,YACA,YACA,YACA,YACA,cACA,cACA,YACA,UACA,kBACA,qBACA,cACA,iBACA,mBACA,mBACA,iBACA,kBACA,kBACA,sBACA,gBACA,qBACA,kBACA,mBACA,mBACA,gBACA,YACA,gBACA,cACA,oBACA,cACA,iBACA,iBACA,oBACA,gBACA,iBACA,cACA,WACA,kBACA,cACA,gBACA,qBACA,kBACA,wBACA,oBACA,mBACA,qBACA,sBACA,kBACA,yBACA,aACA,kBACA,eACA,eACA,mBACA,mBACA,qBACA,mBACA,sBACA,yBACA,iBACA,gBACA,gBACA,oBACA,kBACA,mBACA,sBACA,wBACA,sBACA,qBACA,cACA,gBACA,gBACA,iBACA,kBACA,cACA,aACA,kBACA,cACA,wBACA,sBACA,YACA,iBACA,gBACA,kBACA,uBACA,wBACA,kBACA,kBACA,uBACA,mBACA,iBACA,mBACA,oBACA,iBACA,kBACA,kBACA,qBACA,gBACA,kBACA,mBACA,iBACA,iBACA,oBACA,mBACA,sBACA,oBACA,yBACA,eACA,WACA,oBACA,sBACA,iBACA,iBACA,mBACA,qBACA,kBACA,qBACA,yBACA,gBACA,wBACA,eACA,kBACA,qBACA,eACA,mBACA,oBACA,oBACA,uBACA,qBACA,mBACA,kBACA,gBACA,sBACA,wBACA,qBACA,gBACA,iBACA,wBACA,iBACA,mBACA,qBACA,sBACA,mBACA,oBACA,oBACA,yBACA,uBACA,yBACA,6BACA,kBACA,iBACA,uBACA,0BACA,mBACA,mBACA,oBACA,kBACA,sBACA,kBACA,oBACA,sBACA,+BACA,mBACA,qBACA,iBACA,qBACA,gBACA,uBACA,kBACA,4BACA,sBACA,yBACA,sBACA,sBACA,sBACA,yBACA,iBACA,qBACA,mBACA,uBACA,iBACA,mBACA,sBACA,oBACA,oBACA,sBACA,sBACA,oBACA,qBACA,2BACA,8BACA,qBACA,mBACA,gBACA,kBACA,iBACA,qBACA,sBACA,sBACA,oBACA,sBACA,oBACA,oBACA,yBACA,kBACA,uBACA,2BACA,uBACA,sBACA,uBACA,kBACA,qBACA,sBACA,mBACA,mBACA,wBACA,0BACA,0BACA,uBACA,yBACA,yBACA,oBACA,iBACA,gBACA,kBACA,uBACA,oBACA,4BACA,yBACA,aACA,sBACA,oBACA,sBACA,oBACA,oBACA,uBACA,uBACA,wBACA,mBACA,wBACA,2BACA,kBACA,eACA,eACA,iBACA,iBACA,mBACA,mBACA,kBACA,yBACA,6BACA,uBACA,eACA,qBACA,qBACA,mBACA,gBACA,uBACA,uBACA,qBACA,sBACA,wBACA,uBACA,kBACA,oBACA,eACA,gBACA,kBACA,kBACA,uBACA,wBACA,qBACA,gBACA,aACA,aACA,oBACA,uBACA,qBACA,eACA,oBACA,oBACA,kBACA,qBACA,qBACA,wBACA,0BACA,iBACA,kBACA,kBACA,wBACA,mBACA,oBACA,yBAKAJ,GAAA,CACA,UACA,OACA,SACA,YACA,QACA,YACA,QACA,QACA,QACA,WACA,QACA,SACA,WACA,YACA,WACA,SACA,SACA,SACA,UACA,QACA,UACA,SACA,QACA,WACA,SACA,SACA,UACA,WACA,YACA,WACA,UACA,SACA,SACA,WACA,UACA,WACA,SACA,QACA,SACA,SACA,YACA,UACA,cACA,UACA,UACA,YACA,SACA,UACA,UACA,YACA,WACA,YACA,YACA,UACA,UACA,YACA,QACA,QACA,UACA,SACA,UACA,UACA,SACA,UACA,WACA,UACA,UACA,SACA,WACA,UACA,aACA,UACA,YACA,YACA,SACA,WACA,UACA,aACA,YACA,YACA,YACA,cACA,YACA,eACA,WACA,UACA,UACA,UACA,cACA,YACA,WACA,aACA,YACA,eACA,iBACA,eACA,YACA,WACA,UACA,UACA,aACA,cACA,cACA,YACA,YACA,YACA,kBACA,eACA,gBACA,UACA,WACA,WACA,YACA,YACA,aACA,WACA,YACA,YACA,WACA,cACA,iBACA,WACA,YACA,gBACA,WACA,WACA,YACA,aACA,eACA,cACA,QACA,QACA,YACA,aACA,YACA,cACA,YACA,eACA,aACA,WACA,gBACA,gBACA,UACA,UACA,UACA,cACA,cACA,cACA,eACA,eACA,WACA,cACA,eACA,kBACA,qBACA,oBACA,qBACA,eACA,kBACA,qBACA,qBACA,iBACA,YACA,cACA,eACA,YACA,YACA,WACA,WACA,aACA,iBACA,UACA,YACA,YACA,WACA,eACA,cACA,WACA,cACA,gBACA,cACA,WACA,cACA,cACA,WACA,eACA,oBACA,iBACA,mBACA,eACA,gBACA,eACA,WACA,aACA,WACA,cACA,YACA,YACA,gBACA,cACA,iBACA,iBACA,eACA,YACA,cACA,eACA,YACA,aACA,WACA,WACA,cACA,gBACA,UACA,WACA,WACA,cACA,cACA,YACA,UACA,WACA,cACA,aACA,eACA,aACA,iBACA,WACA,WACA,WACA,YACA,YACA,YACA,WACA,oBACA,eACA,iBACA,kBACA,oBACA,sBACA,oBACA,eACA,WACA,YACA,iBACA,SACA,YACA,aACA,gBACA,kBACA,qBACA,WACA,oBACA,eACA,kBACA,eACA,qBACA,iBACA,gBACA,mBACA,mBACA,kBACA,iBACA,kBACA,mBACA,aACA,eACA,cACA,cACA,gBACA,cACA,aACA,aACA,iBACA,gBACA,WACA,gBACA,YACA,WACA,aACA,gBACA,YACA,gBACA,eACA,cACA,kBACA,kBACA,aACA,mBACA,eACA,gBACA,cACA,eACA,kBACA,UACA,aACA,cACA,YACA,cACA,cACA,eACA,eACA,cACA,aACA,YACA,eACA,YACA,gBACA,cACA,UACA,YACA,YACA,YACA,WACA,YACA,cACA,cACA,YACA,WACA,WACA,YACA,YACA,YACA,eACA,iBACA,kBACA,WACA,eACA,WACA,oBACA,gBACA,kBACA,YACA,qBACA,sBACA,sBACA,qBACA,cACA,cACA,eACA,YACA,cACA,iBACA,mBACA,wBACA,YACA,cACA,iBACA,mBACA,YACA,kBACA,kBACA,eACA,mBACA,gBACA,eACA,eACA,WACA,WACA,cACA,YACA,aACA,WACA,eACA,oBACA,gBACA,sBACA,mBACA,oBACA,uBACA,kBACA,oBACA,kBACA,eACA,UAEA,gBACA,iBACA,yBACA,uBACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,YACA,YACA,cACA,YACA,aACA,WACA,aACA,cACA,YACA,YACA,YACA,iBACA,kBACA,gBACA,aACA,cACA,YACA,gBACA,gBACA,iBACA,aACA,eACA,YACA,aACA,aACA,YACA,aACA,UACA,WACA,cACA,cACA,cACA,cACA,WACA,WACA,eACA,eACA,cACA,eACA,WACA,gBACA,gBACA,cACA,iBACA,iBACA,YACA,YACA,eACA,eACA,cACA,aACA,eACA,cACA,YACA,cACA,eACA,gBACA,eACA,iBACA,cACA,cACA,cACA,eACA,gBACA,gBACA,gBACA,gBACA,gBACA,kBACA,cACA,gBACA,eACA,cACA,cACA,cACA,eACA,cACA,kBACA,UACA,kBACA,UACA,iBACA,oBACA,cACA,mBACA,cACA,eACA,aACA,gBACA,kBAEAD,GAAA,CACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,SAIAuD,GAAA,CACA,oBACA,sBACA,8BACA,wBACA,8BACA,gCACA,oBACA,8BACA,4BACA,gCACA,4CACA,8BACA,wBACA,8BACA,sBACA,8BACA,wBACA,oCACA,0CACA,gCACA,sCACA,8BACA,oCACA,gCACA,0BACA,wBACA,0CACA,oCACA,kBACA,oBACA,4BACA,oCACA,oCACA,kBACA,oBACA,oBACA,0BACA,oCACA,kCACA,oCACA,gCACA,wBACA,8BACA,sBACA,4BACA,wBACA,8BACA,gCACA,sCACA,oCACA,oDACA,4DACA,8CACA,0CACA,kCACA,sBACA,gCACA,8BACA,0CACA,sBACA,oCACA,0BACA,oBACA,kBACA,wBACA,sBACA,sBACA,wBACA,sBACA,wBACA,wBACA,sBACA,8BACA,kCACA,gCACA,oCACA,kCACA,wBACA,wBACA,8BACA,8BACA,sBACA,sCACA,4CACA,4BACA,8BACA,4BACA,kCACA,gCACA,kCACA,8BACA,wCACA,wCACA,0CACA,0CACA,oCACA,kBACA,oCACA,oCACA,oCACA,kCACA,4BACA,0BACA,kBACA,kBACA,oBACA,sBACA,wBACA,wBACA,0BACA,0BACA,wBACA,wBACA,wBACA,8BACA,8BACA,sBACA,4BACA,wBACA,4BACA,0BACA,0BACA,sBACA,sBACA,gCACA,oCACA,oCACA,kBACA,yBAIA,SAAAsB,GAAAp3E,GAYA,MAXA,OAAAA,EAAAP,MAAA,OAAAO,EAAAA,EAAAP,MAAA,IAEA,IAAAO,EAAA3D,WAAA,IAEA,KADA2D,EAAAA,EAAAP,MAAA,IACApD,WAAA,KAAA2D,EAAAA,EAAAP,MAAA,KAMAO,GAFAA,GAFAA,EAAAA,EAAA2E,QAAA,yBAEAA,QAAA,yDAAAqzB,EAAAC,GAAmF,OAAAA,EAAAtzB,QAAA,aAEnFA,QAAA,6BACAA,QAAA,QAAqB,KAAAA,QAAA,UACrB,CAEA,SAAA0yE,GAAAr3E,GAGA,OAFA,OAAAA,EAAA2E,QAAA2rE,GAAA,iBAAA3rE,QAAA,eAEAA,QAAA,KAAoB,KAAAA,QAAA,SACpB,CAEA,SAAA2yE,GAAA3zE,GACA,IAAA+iC,EAAA/iC,EAAAjH,MAAA,KAEA,OADAgqC,EAAA,GAAAhqC,MAAA,QACAgqC,EAAA,GAAAhqC,MAAA,SAAAgqC,EAAA/pC,OAAA,OAAA+pC,EAAA,GAAAhqC,MAAA,SAAAgqC,EAAA,GAAAhqC,MAAA,aACA,CAEA,SAAA66E,GAAA5zE,GACA,OAAAA,EAAAgB,QAAA,SACA,CAEA,IAAAk7C,GAAA,GACA23B,GAAA,GAEA52B,GAAA62B,GAAA,CACA,gFACA,qEAIA,IAAAC,GAAA,oBAAAC,IAEA,SAAAC,GAAAhX,EAAA94D,EAAAo+B,GACA,IAAA9pC,EAAA,EAAA6C,EAAA2hE,EAAAjkE,OACA,GAAAupC,GACA,GAAAwxC,GAAAxxC,EAAA2xC,IAAA/vE,GAAA9I,OAAAkG,UAAAoH,eAAA3M,KAAAumC,EAAAp+B,GAEA,IADA,IAAAgwE,EAAAJ,GAAAxxC,EAAA6xC,IAAAjwE,GAAAo+B,EAAAp+B,GACS1L,EAAA07E,EAAAn7E,SAAmBP,EAC5B,GAAAwkE,EAAAkX,EAAA17E,IAAAsH,IAAAoE,EAAiD,OAAd84D,EAAAG,QAAc+W,EAAA17E,QAG9C,KAAWA,EAAA6C,IAAS7C,EACvB,GAAAwkE,EAAAxkE,GAAAsH,IAAAoE,EAAuC,OAAd84D,EAAAG,QAAc3kE,EAYvC,OAVAwkE,EAAA3hE,GAAA,CAAcyE,EAAAoE,GAAS84D,EAAAG,QAAcH,EAAAK,SACrC/6B,IACAwxC,IACAxxC,EAAA2xC,IAAA/vE,IAAAo+B,EAAAj7B,IAAAnD,EAAA,IACAo+B,EAAA6xC,IAAAjwE,GAAAvF,KAAAtD,KAEAD,OAAAkG,UAAAoH,eAAA3M,KAAAumC,EAAAp+B,KAAAo+B,EAAAp+B,GAAA,IACAo+B,EAAAp+B,GAAAvF,KAAAtD,KAGAA,CACA,CAEA,SAAA+4E,GAAAx2E,EAAA63C,GACA,IAAA/9B,EAAA,CAAW/I,IAAA/Q,EAAA,EAAAmQ,IAAAnQ,EAAA,GAEXo2D,GAAA,EASA,OARAve,EAAAqsB,MAAAA,GAAArsB,EAAAqsB,KACA,MAAArsB,EAAAmR,MAAAlvC,EAAA8qD,YAAA,EACA,MAAA/sB,EAAAof,IAAAb,EAAAe,GAAAtf,EAAAof,KACA,MAAApf,EAAAue,MAAAA,EAAAve,EAAAue,KACAA,GAAA,GAAgBt8C,EAAAkvC,MAAAob,GAAAhO,GAA2Bt8C,EAAA8qD,YAAA,GAC3C,MAAA/sB,EAAAmR,QAAAlvC,EAAAkvC,MAAAnR,EAAAmR,OACAnR,EAAAse,SAAAr8C,EAAAq8C,QAAA,GACA,MAAAte,EAAAvhC,QAAyBwD,EAAA28D,aAAA38D,EAAAxD,MAAAuhC,EAAAvhC,OACzBwD,CACA,CAEA,SAAA48D,GAAAC,EAAAl/D,GACA,GAAAk/D,EAAA,CACA,IAAAC,EAAA,sBACA,QAAAn/D,IAAAm/D,EAAA,iBACA,MAAAD,EAAAxuD,OAAAwuD,EAAAxuD,KAAAyuD,EAAA,IACA,MAAAD,EAAAE,QAAAF,EAAAE,MAAAD,EAAA,IACA,MAAAD,EAAA5wD,MAAA4wD,EAAA5wD,IAAA6wD,EAAA,IACA,MAAAD,EAAAG,SAAAH,EAAAG,OAAAF,EAAA,IACA,MAAAD,EAAA/pE,SAAA+pE,EAAA/pE,OAAAgqE,EAAA,IACA,MAAAD,EAAAI,SAAAJ,EAAAI,OAAAH,EAAA,GARA,CASA,CAEA,SAAAI,GAAAt4B,EAAA7H,EAAAnuB,GACA,IAAAmnB,EAAAnnB,EAAAuuD,OAAA,MAAApgC,EAAAhH,EAAAgH,EAAAhH,EAAA,WACAj1C,EAAA,GAAA6C,EAAAihD,EAAAvjD,OACA,SAAA00C,GAAAnnB,EAAAwuD,IACA,KAAQt8E,EAAA,MAAWA,EAAA,SAAA8tB,EAAAwuD,IAAAt8E,GAAA,CACnBy2B,EAAAtpB,KAAA8uC,EAAAhH,EAAAj1C,GAEA8tB,EAAAwuD,IAAAt8E,GAAAi8C,EAAAhH,EACAnnB,EAAAuuD,OAAApgC,EAAAhH,GAAAA,EAAAj1C,EACA,KACA,CAEA,IAAAA,EAAA,EAAYA,GAAA6C,IAAU7C,EAAA,GAAA8jD,EAAA9jD,GAAA49C,WAAA3I,EAAA,OAAAj1C,EAStB,OARA8jD,EAAAjhD,GAAA,CACA+6C,SAAA3I,EACAu6B,OAAA,EACAC,OAAA,EACAC,SAAA,EACAG,KAAA,EACA0M,kBAAA,GAEA15E,CACA,CAEA,SAAA25E,GAAAt9D,EAAAu9D,EAAAC,EAAA5uD,EAAA69C,EAAA7nB,GACA,IACAh2B,EAAA8wC,SAAA1/C,EAAA+1B,EAAAxe,EAAA0J,OAAAs8C,GACA,CAAG,MAAA18E,GAAW,GAAA+tB,EAAAupB,IAAA,MAAAt3C,CAAA,CACd,SAAAmf,EAAA5X,GAAAwmB,EAAAgmC,WAAA,CAEA,GADA,MAAA50C,EAAA5X,GAAA,iBAAA4X,EAAAgT,IAAAhT,EAAAgT,EAAAygB,EAAAzzB,EAAAgT,MACApE,IAAA,IAAAA,EAAA6wC,WAAA,MAAAz/C,EAAA5X,EAAA,IAEA,GADA,MAAAmvB,EAAA0J,OAAAs8C,IAAAhmD,EAAAtpB,KAAA2zB,EAAA27C,IAAA,UAAAA,GACA,MAAAv9D,EAAA5X,EAAA4X,EAAA/b,EAAA+b,EAAA/b,GAAAu6C,GAAAx+B,EAAAgT,QACA,OAAAuqD,EACA,SAAAv9D,EAAA5X,GACA,EAAA4X,EAAAgT,KAAAhT,EAAAgT,EAAAhT,EAAA/b,EAAAszB,EAAAmD,aAAA1a,EAAAgT,GACAhT,EAAA/b,EAAAszB,EAAA2E,aAAAlc,EAAAgT,QAEA,SAAAhT,EAAA5X,EAAA,CACA,IAAAi1B,EAAA2V,EAAAhzB,EAAAgT,GACAhT,EAAA/b,GAAA,EAAAo5B,KAAAA,EAAA9F,EAAAmD,aAAA2C,GACA9F,EAAA2E,aAAAmB,EACA,KACA,SAAA11B,IAAAqY,EAAAgT,EAAA,SACAhT,EAAA/b,EAAAszB,EAAA4E,SAAAnc,EAAAgT,EAAAkpD,GAAA,KAEA,MAAAl8D,EAAA5X,EAAA4X,EAAA/b,EAAAszB,EAAAoE,OAAA4hD,EAAAvqC,EAAAhzB,EAAAgT,GAAAkpD,IACAl8D,EAAA/b,EAAAszB,EAAAoE,OAAA4hD,EAAAv9D,EAAAgT,EAAAkpD,GACA,CAAG,MAAAr7E,GAAW,GAAA+tB,EAAAupB,IAAA,MAAAt3C,CAAA,CACd,GAAA+tB,EAAAgmC,YACA,MAAA4oB,EAAA,IACAx9D,EAAA7a,EAAAy/C,EAAA6oB,MAAA+P,GACAx9D,EAAA7a,EAAAyoE,SAAA5tD,EAAA7a,EAAAyoE,QAAA7qB,QAAA/iC,EAAA7a,EAAAyoE,QAAA1qB,MACAljC,EAAA7a,EAAAyoE,QAAA1qB,IAAAwmB,GAAA+C,EAAAa,cAAAC,UAAAvtD,EAAA7a,EAAAyoE,QAAA7qB,OAAAG,IAAAljC,EAAA7a,EAAAyoE,QAAA3qB,MAAA,GACAr0B,EAAAupB,MAAAn4B,EAAA7a,EAAAyoE,QAAA6P,QAAAhR,EAAAa,cAAAC,UAAAvtD,EAAA7a,EAAAyoE,QAAA7qB,OAAAG,MAEAljC,EAAA7a,EAAAwoE,SAAA3tD,EAAA7a,EAAAwoE,QAAA5qB,QACA/iC,EAAA7a,EAAAwoE,QAAAzqB,IAAAwmB,GAAA+C,EAAAa,cAAAC,UAAAvtD,EAAA7a,EAAAwoE,QAAA5qB,OAAAG,IAAAljC,EAAA7a,EAAAwoE,QAAA1qB,MAAA,GACAr0B,EAAAupB,MAAAn4B,EAAA7a,EAAAwoE,QAAA8P,QAAAhR,EAAAa,cAAAC,UAAAvtD,EAAA7a,EAAAwoE,QAAA5qB,OAAAG,KAEA,CAAG,MAAAriD,GAAW,GAAA+tB,EAAAupB,KAAAyM,EAAA6oB,MAAA,MAAA5sE,CAAA,CAhCd,CAiCA,CAEA,SAAA68E,GAAAt+B,EAAA06B,EAAAh5E,GACA,GAAAs+C,GAAAA,EAAA,SACA,IAAAhC,EAAAkB,GAAAc,EAAA,SACA,GAAAhC,EAAAv8C,EAAA2D,EAAA44C,EAAAj4C,EAAAX,GAAA44C,EAAAv8C,EAAAwH,EAAA+0C,EAAAj4C,EAAAkD,EAAA,UAAAjC,MAAA,cAAAtF,EAAA,MAAAs+C,EAAA,QACA,CACA,CAKA,IAAAu+B,GAAA,gDACAC,GAAA,2DACAC,GAAA,8BACAC,GAAA,cACAC,GAAA,6BACAC,GAAA,mEACAC,GAAA,gCACAC,GAAA,yCACAC,GAAA,8DACAC,GAAA,oEA0FA,SAAAC,GAAAC,EAAAn5E,EAAAosD,EAAAh1B,GACA,IAAAz4B,EAAA6xC,GAAA2oC,GACA/sB,EAAAvS,OAAAziB,KAAAg1B,EAAAvS,OAAAziB,GAAA,IACAz4B,EAAAy6E,WAAAhtB,EAAAvS,OAAAziB,GAAAiiD,SAAAhoC,GAAAW,GAAArzC,EAAAy6E,WACA,CA0BA,IAAAE,GAAA,kEACAC,GAAA,CACA,2CACA,gDACA,6BACA,mCAoGAC,GAAA,0CAoBA,SAAAC,GAAA7hC,EAAAqX,EAAAhV,EAAAxwB,GACA,QAAAjnB,IAAAo1C,EAAA/pB,GAAA,iBAAA+pB,EAAAr4C,GAAA,MAAAq4C,EAAA30C,EAAA,SACA,IAAA43B,EAAA,GACA6+C,EAAA9hC,EAAA30C,EAAA02E,EAAA/hC,EAAA/pB,EACA,SAAA+pB,EAAA30C,EAAA,OAAA20C,EAAA30C,GACA,QAAA43B,EAAA+c,EAAA/pB,EAAA,QAAqC,MACrC,QAAAgN,EAAA,GAAA+c,EAAA/pB,EAA4B,MAC5B,QAAAgN,EAAAwe,GAAAzB,EAAA/pB,GAA+B,MAC/B,QACApE,GAAAA,EAAAkxB,UAAA9f,EAAAyT,EAAAsJ,EAAA/pB,GAAA,GAAAylB,gBAEAsE,EAAAlJ,GAAAkJ,IACA30C,EAAA,IACA43B,EAAA,IAAA+c,EAAA/pB,EAAAggB,EAAAS,EAAAsJ,EAAA/pB,WAEA,IAAA+pB,EAAAhH,IAAAgH,EAAAhH,EAAAxe,EAAA0J,OAAA,KACA,MACA,QAAAjB,EAAA+c,EAAA/pB,EAEA,IAAAA,EAAAqlB,GAAA,IAAA1B,GAAA3W,IAAA13B,EAAA,CAA6CD,EAAA+rD,GAE7CjqC,EAAA+yD,GAAAtuD,EAAAogD,QAAAjyB,EAAAnuB,GAEA,OADA,IAAAzE,IAAA7hB,EAAAnD,EAAAglB,GACA4yB,EAAA30C,GACA,QAIA,cAHA,QAAAE,EAAAF,EAAA,IAAuB,MACvB,QAAAE,EAAAF,EAAA,IAAuB,MACvB,QAAAE,EAAAF,EAAA,IAAuB,MAEvB,iBAAA20C,EAAA/pB,EAAA,QAAgC+pB,EAAA30C,EAAe,MAC/C,GAAA20C,EAAA/pB,EAAA3xB,OAAA,gBAAA+E,MAAA,gDACA,GAAAwoB,GAAAA,EAAA22C,QAAA,CACAvyC,EAAAqlB,GAAA,OAAAikC,GAAA1tD,EAAAmwD,QAAAhiC,EAAA/pB,EAAApE,EAAAowD,aACA12E,EAAAF,EAAA,IAAe,KACf,CACAE,EAAAF,EAAA,MAGA,GADA20C,EAAA30C,GAAAy2E,IAAsB9hC,EAAA30C,EAAAy2E,EAAe9hC,EAAA/pB,EAAA8rD,GACrC,iBAAA/hC,EAAAr4C,GAAAq4C,EAAAr4C,EAAA,CACA,IAAAo5B,EAAAif,EAAA/2C,GAAA+2C,EAAA/2C,EAAA7B,MAAA,EAAAiwD,EAAA/yD,SAAA+yD,EAAA,CAA2DhsD,EAAA,QAAAgsD,IAAArX,EAAA/2C,GAAuB,KAClFgtB,EAAAulB,GAAA,IAAA5B,GAAAoG,EAAAr4C,GAAAo5B,IAAA,MAAAif,EAAA/pB,EAAAA,EAAA,GACA,CAGA,OAFA+pB,EAAAh2C,GAAAq4C,EAAA,UAAAn4C,KAAA,CAAAmtD,EAAArX,EAAAh2C,IACAg2C,EAAAv4C,GAAA46C,EAAA,aAAAn4C,KAAA,CAAAmtD,EAAArX,EAAAv4C,IACA+zC,GAAA,IAAAvlB,EAAA1qB,EACA,CAEA,IACA22E,GAAAC,GACAnb,GAAAob,GACAC,GACAC,GAAAC,GAJAC,IACAN,GAAA,oBAAAC,GAAA,mBACAnb,GAAA,qBAAAob,GAAA,yCACAC,GAAA,uBACAC,GAAA1nC,GAAA,KAAA2nC,GAAA3nC,GAAA,KAEA,SAAA6nC,EAAAr6E,EAAAypB,EAAAmoC,EAAA0V,EAAA7nB,GAWA,IAVA,IAAA5kC,EACA41B,EACA6pC,EAAAC,EAEAxuB,EAJArzB,EAAA,EAAAv7B,EAAA,GAAAq9E,EAAA,GAAAC,EAAA,GAAArjD,EAAA,EAAAz7B,EAAA,EAAAq8B,EAAA,EAAAx8B,EAAA,GACAk/E,EAAA,EAAAC,EAAA,EAEAvC,EAAA,EAAAC,EAAA,EACAuC,EAAA95E,MAAAuE,QAAAo6C,EAAAwpB,QACA6M,EAAA,GACAH,EAAA,GACA37B,EAAAl5C,MAAAuE,QAAArF,GACAm4D,EAAA,GAAA0iB,EAAA,GAA2BC,GAAA,EAC3BpgC,IAAAjxB,EAAAixB,WACAqgC,EAAAV,EAAAp+E,MAAA89E,IAAA/7C,EAAA,EAAAg9C,EAAAD,EAAA7+E,OAAsE8hC,GAAAg9C,IAAeh9C,EAAA,CAErF,IAAAi9C,GADA99E,EAAA49E,EAAA/8C,GAAA+S,QACA70C,OACA,OAAA++E,EAAA,CAGA,IAAAC,EAAA,EACAC,EAAA,IAAAziD,EAAA,EAAoBA,EAAAuiD,IAAWviD,EAAA,OAAAv7B,EAAAu7B,IAC/B,QACA,QAAAv7B,EAAAu7B,EAAA,MAAqDA,EAAM,MAAAyiD,CAAA,CAC3D,GAAA1xD,GAAAA,EAAAgmC,WAAA,CAIA,GADAirB,EAAA,OADAjqC,EAAAD,GAAArzC,EAAA6B,MAAAk8E,EAAAxiD,IAAA,IACAx1B,EAAA61B,SAAA0X,EAAAvtC,EAAA,IAAAw3E,EAAA,EAA0DC,GAAA,EAC1DlxD,EAAAwnC,WAAAxnC,EAAAwnC,UAAAypB,EAAA,SACAG,EAAA,GAAkBC,GAAA,EAClBrqC,EAAA2qC,KAAkBN,GAAA,EAAgBD,EAAAxjB,IAAA97B,WAAAkV,EAAA2qC,IAAiCP,EAAAvjB,IAAAC,GAAAsjB,EAAAxjB,MACnE,KAAA5mB,EAAAymB,SAA6B4jB,GAAA,EAAgBD,EAAA3jB,QAAA,GAC7C,MAAAzmB,EAAA+mC,eAAoCsD,GAAA,EAAgBD,EAAAxjE,OAAAo5B,EAAA+mC,cACpDsD,IAAA3iB,EAAAuiB,EAAA,GAAAG,EACA,CACA,MACA,QAAAK,EAAAxiD,EAEA,GAAAwiD,GAAAxiD,EAAA,MAGA,GADAgiD,EAAA,OADAjqC,EAAAD,GAAArzC,EAAA6B,MAAAk8E,EAAAxiD,IAAA,IACAx1B,EAAA61B,SAAA0X,EAAAvtC,EAAA,IAAAw3E,EAAA,EAAuDC,GAAA,IACvDlxD,EAAAwnC,WAAAxnC,EAAAwnC,UAAAypB,GAAA,CACA9oB,EAAA5xD,EAAAkD,EAAAw3E,EAAA,IAAA9oB,EAAA5xD,EAAAkD,EAAAw3E,EAAA,GACA9oB,EAAAl2D,EAAAwH,EAAAw3E,EAAA,IAAA9oB,EAAAl2D,EAAAwH,EAAAw3E,EAAA,GAEAjxD,GAAAA,EAAAgmC,aACAorB,EAAA,GAAgBC,GAAA,EAChBrqC,EAAA2qC,KAAgBN,GAAA,EAAgBD,EAAAxjB,IAAA97B,WAAAkV,EAAA2qC,IAAiCP,EAAAvjB,IAAAC,GAAAsjB,EAAAxjB,MACjE,KAAA5mB,EAAAymB,SAA2B4jB,GAAA,EAAgBD,EAAA3jB,QAAA,GAC3C,MAAAzmB,EAAA+mC,eAAkCsD,GAAA,EAAgBD,EAAAxjE,OAAAo5B,EAAA+mC,cAClDsD,IAAA3iB,EAAAuiB,EAAA,GAAAG,IAIAL,EAAAr9E,EAAA6B,MAAA05B,GAAAz8B,MAAA69E,IACA,QAAAuB,EAAA,EAAsBA,GAAAb,EAAAt+E,QAAwB,KAAAs+E,EAAAa,GAAAtqC,OAAAl1C,OAAA,KAAAw/E,GAE9C,IADAb,EAAAA,EAAAx7E,MAAAq8E,GACA3iD,EAAA,EAAcA,GAAA8hD,EAAAt+E,SAAoBw8B,EAElC,QADAv7B,EAAAq9E,EAAA9hD,GAAAqY,QACA70C,OAAA,CAGA,GAFAu+E,EAAAt9E,EAAA+D,MAAA09D,IAA2BxnC,EAAAsB,EAAU/8B,EAAA,EAAKq8B,EAAA,EAC1C76B,EAAA,YAAAA,EAAA6B,MAAA,aAAA7B,EACA,MAAAs9E,GAAA,IAAAA,EAAAv+E,OAAA,CAEA,IADAk7B,EAAA,EAAa57B,EAAAi/E,EAAA,GACb9+E,EAAA,EAAaA,GAAAH,EAAAU,WACb87B,EAAAx8B,EAAAI,WAAAD,GAAA,OAAAq8B,EAAA,MAD4Br8B,EAE5By7B,EAAA,GAAAA,EAAAY,EAGA2iD,IADAvjD,CAEA,OAAKujD,EACL,IAAAh/E,EAAA,EAAcA,GAAAwB,EAAAjB,QAAe,KAAAiB,EAAAvB,WAAAD,KAAAA,GAO7B,KAPoEA,GACpE80C,EAAAD,GAAArzC,EAAA6B,MAAA,EAAArD,IAAA,IACAuH,IAAAutC,EAAAvtC,EAAAi1C,GAAA,CAAmCj1C,EAAAw3E,EAAA,EAAAr7E,EAAAs7E,KAEnC9/D,EAAA,CAAS5X,EAAA,IAET,OAAAw3E,GAHAj/E,EAAA2B,EAAA6B,MAAArD,IAGAuF,MAAAg5E,MAAA,KAAAO,EAAA,KAAA5/D,EAAAgT,EAAAwjB,GAAAopC,EAAA,KACAhxD,EAAA6xD,YAAA,CACA,UAAAb,EAAAj/E,EAAA0F,MAAAi5E,MAAA,KAAAM,EAAA,IAIA,GAFA5/D,EAAAtb,EAAA8xC,GAAAW,GAAAyoC,EAAA,KAAAv2E,QAAA,cACAulB,EAAA8xD,OAAA1gE,EAAAtb,EAAA2wE,GAAAr1D,EAAAtb,IACAk7E,EAAA,GAAA54E,QAAA,gBACAgZ,EAAAha,GAAArF,EAAA0F,MAAA+4E,KAAA,OACAp/D,EAAAha,EAAAgB,QAAA,SAAAi0E,EAAAh0E,KAAA,CAAAq3C,GAAAt+B,EAAAha,GAAAga,EAAAha,SACO,GAAA45E,EAAA,GAAA54E,QAAA,kBAEP04E,EAAA/pC,GAAAiqC,EAAA,IACA,IAAAe,EAAAnqC,GAAAW,GAAAyoC,EAAA,KACAhxD,EAAA8xD,OAAAC,EAAAtL,GAAAsL,IACA7F,EAAA58C,SAAAwhD,EAAAkB,GAAA,MAAAlB,EAAAiB,EAAA/qC,EAAAvtC,EACA,OACMu3E,EAAAj/E,EAAA0F,MAAA,gBAENy0E,GADA4E,EAAA/pC,GAAAiqC,EAAA,KACAgB,MAAA5gE,EAAAtb,EAAA0wE,GAAA0F,EAAA4E,EAAAkB,IAAA,GAAA9F,EAAA4E,EAAAkB,IAAA,GAAAhrC,EAAAvtC,IAGA,IAAAw4E,EAAA7iC,GAAApI,EAAAvtC,GACA,IAAAvH,EAAA,EAAeA,EAAAm6E,EAAA55E,SAAmBP,EAClC+/E,EAAAx4E,GAAA4yE,EAAAn6E,GAAA,GAAAqE,EAAAkD,GAAAw4E,EAAAx4E,GAAA4yE,EAAAn6E,GAAA,GAAAD,EAAAwH,GACAw4E,EAAAr8E,GAAAy2E,EAAAn6E,GAAA,GAAAqE,EAAAX,GAAAq8E,EAAAr8E,GAAAy2E,EAAAn6E,GAAA,GAAAD,EAAA2D,IACAwb,EAAAha,EAAAi1E,EAAAn6E,GAAA,GACA,CAEA,SAAA80C,EAAAxtC,QAAAT,IAAAqY,EAAAgT,EACA,GAAAhT,EAAAtb,GAAAsb,EAAAha,EACAga,EAAAgT,EAAA,EAAchT,EAAA5X,EAAA,QACR,KAAAy3C,EAAA,SACN7/B,EAAA5X,EAAA,SAEA4X,EAAA5X,EAAAwtC,EAAAxtC,GAAA,IAIA,OAHA2uD,EAAA5xD,EAAAX,EAAAs7E,IAAA/oB,EAAA5xD,EAAAX,EAAAs7E,GACA/oB,EAAAl2D,EAAA2D,EAAAs7E,IAAA/oB,EAAAl2D,EAAA2D,EAAAs7E,GAEA9/D,EAAA5X,GACA,QACA,OAAA4X,EAAAgT,GAAA,MAAAhT,EAAAgT,EAAA,CACA,IAAA6sB,EAAA,SACA7/B,EAAA5X,EAAA,GACA,MAAO4X,EAAAgT,EAAA0N,WAAA1gB,EAAAgT,GACP,MACA,QACA,YAAAhT,EAAAgT,EAAA,CACA,IAAA6sB,EAAA,SACA7/B,EAAA5X,EAAA,GACA,MACAq3E,EAAAl7B,GAAArmB,SAAAle,EAAAgT,EAAA,KACAhT,EAAAgT,EAAAysD,EAAAr3E,EACA4X,EAAA3X,EAAAo3E,EAAAp3E,EACAumB,EAAAm2C,WAAA/kD,EAAA0T,EAAA+rD,EAAA/rD,GAEA,MACA,UACA1T,EAAA5X,EAAA,IACA4X,EAAAgT,EAAA,MAAAhT,EAAAgT,EAAAmkB,GAAAn3B,EAAAgT,GAAA,GACApE,EAAAm2C,WAAA/kD,EAAA0T,EAAAojB,GAAA92B,EAAAgT,IACA,MACA,gBACA4sD,EAAAj/E,EAAA0F,MAAA84E,IACAn/D,EAAA5X,EAAA,IACA,MAAAw3E,IAAAH,EAAA5a,GAAA+a,EAAA,MACA5/D,EAAAgT,EAAAysD,EAAAr3E,EACAwmB,EAAAm2C,WAAA/kD,EAAA0T,EAAA+rD,EAAA/rD,IACO1T,EAAAgT,EAAA,GACP,MACA,QAAAhT,EAAAgT,EAAAkkB,GAAAl3B,EAAAgT,GAAuC,MACvC,QACApE,EAAAkxB,UAAA9/B,EAAAgT,EAAAygB,EAAAzzB,EAAAgT,EAAA,IACYhT,EAAAgT,EAAAggB,EAAAS,EAAAzzB,EAAAgT,EAAA,IAAkChT,EAAA5X,EAAA,KAC9C,MAEA,QACAwmB,IAAA,IAAAA,EAAA6wC,WAAAz/C,EAAA/b,EAAA+b,EAAAgT,GACAhT,EAAAgT,EAAA8wB,GAAA9jC,EAAAgT,GAgBA,GAbAuqD,EAAAC,EAAA,EACAtsB,EAAA,KACA6uB,QAAAp4E,IAAAiuC,EAAAzwC,GAEA,OADA+rD,EAAAtM,EAAAwpB,OAAAx4B,EAAAzwC,MAEA,MAAA+rD,EAAAxS,WAAA6+B,EAAArsB,EAAAxS,UACA9vB,EAAAgmC,YACA,MAAA1D,EAAAqf,SAAAiN,EAAAtsB,EAAAqf,SAIA+M,GAAAt9D,EAAAu9D,EAAAC,EAAA5uD,EAAA69C,EAAA7nB,GACAh2B,EAAAkxB,WAAAigC,GAAA,KAAA//D,EAAA5X,GAAAmvB,EAAA6I,QAAA7I,EAAA0J,OAAAs8C,MAAqFv9D,EAAA5X,EAAA,IAAW4X,EAAAgT,EAAAmgB,EAAAnzB,EAAAgT,IAChGmsB,EAAA,CACA,IAAA2hC,EAAA9iC,GAAApI,EAAAvtC,GACAlD,EAAA27E,EAAAz4E,KAAAlD,EAAA27E,EAAAz4E,GAAA,IACAlD,EAAA27E,EAAAz4E,GAAAy4E,EAAAt8E,GAAAwb,CACA,MAAK7a,EAAAywC,EAAAvtC,GAAA2X,CAnHL,CAlBA,CAxBA,CA+JA,CACAs9C,EAAAj8D,OAAA,IAAA8D,EAAA,SAAAm4D,EACA,GA8CAyjB,GAAAxoC,GAAA,kBACA0M,MAAArM,GAAA4sB,KAAA,GACA,UAAA5sB,GAAAvwC,IAGA,SAAA24E,GAAAzkD,EAAA3N,EAAA2iC,EAAApM,GACA,IACAob,EADAj4D,EAAA,CAAAgtC,GAAAyrC,IACA57E,EAAAosD,EAAAxS,WAAAxiB,GAAA0kD,EAAA,GACA7hC,EAAAmS,EAAAvS,OAAA75C,GACA,MAAAi6C,IAAAA,EAAA,IACA,IAAAgV,EAAAhV,EAAA,cACAhC,EAAAkB,GAAA8V,GACA,GAAAhX,EAAAv8C,EAAA2D,EAAA,OAAA44C,EAAAv8C,EAAAwH,EAAA,SACA,GAAAumB,EAAAupB,IAAA,UAAA/xC,MAAA,SAAAguD,EAAA,uCACAhX,EAAAv8C,EAAA2D,EAAAwS,KAAAC,IAAAmmC,EAAAv8C,EAAA2D,EAAA,OACA44C,EAAAv8C,EAAAwH,EAAA2O,KAAAC,IAAAmmC,EAAAv8C,EAAA2D,EAAA,SACA4vD,EAAAjW,GAAAf,EACA,CACA+H,IAAAA,EAAA,IACA/F,EAAA,gBACA,IAAA8hC,EAAA,IAzbA,SAAA9hC,EAAAmS,EAAAh1B,EAAA3N,EAAAtmB,GACA,IAAA64E,GAAA,EACAn5B,EAAA,GAAenhB,EAAA,KACf,YAAAjY,EAAA4iC,UAAAD,EAAA6vB,OAAA,CACA,IAAAC,EAAA9vB,EAAAxS,WAAAxiB,GACA,IAAQg1B,EAAA+vB,WAAAD,EAAA9vB,EAAA+vB,SAAAtiC,OAAAziB,GAAAiiD,UAAA6C,EAAA,CAAqE,MAAAxgF,GAAA,CAC7EsgF,GAAA,EACAn5B,EAAAu2B,SAAAttC,GAAA0F,GAAA0qC,GACA,CAEA,GAAAjiC,GAAAA,EAAA,aACA,IAAAmiC,EAAA,CAAsBC,aAAA,EAAAC,aAAA,GACtBriC,EAAA,YAAAsiC,QAAAH,EAAAC,aAAA,GACApiC,EAAA,YAAA/wB,OAAAkzD,EAAAE,aAAA,GACA56C,GAAAA,GAAA,IAAA0R,GAAA,iBAAAgpC,EACA,EAEAJ,GAAAt6C,KACAv+B,EAAAA,EAAAjH,QAAAk3C,GAAA,UAAA1R,EAAAmhB,GACA,CAwaA25B,CAAAviC,EAAAmS,EAAAh1B,EAAA3N,EAAAtmB,GAEAA,EAAAA,EAAAjH,QAAAk3C,GAAA,kBAA8C6b,IAAAA,IAE9C9rD,EAAAA,EAAAjH,QAnTA,SAAA+9C,EAAAxwB,EAAA2N,EAAAg1B,GACA,IAAAqwB,EAAA,CAAeC,eAAA,KAGf,SADAtwB,GAAA,IAAa+vB,UAAA,IAAcQ,OAAA,SAAAF,EAAAG,YAAAxwB,EAAA+vB,SAAAQ,MAAA,GAAAE,IAAA,SAC3BzpC,GAAA,aAAAA,GAAA,iBAAAqpC,GAAA,GACA,CA8SAK,CAAA7iC,EAAAxwB,EAAA2N,EAAAg1B,GAGA3iC,EAAAszD,cAAA55E,EAAAA,EAAAjH,QAAAk3C,GAAA,sBACA4pC,iBAAAvzD,EAAAszD,YAAAC,kBAAA,KACAC,aAAAxzD,EAAAszD,YAAAE,cAAA,KACAC,gBAAAzzD,EAAAszD,YAAAG,iBAAA,OAGA,MAAAjjC,EAAA,UAAAA,EAAA,SAAA/9C,OAAA,IAAAiH,EAAAA,EAAAjH,QA1WA,SAAA+9C,EAAAsjB,GAEA,IADA,IAAA3kB,EAAAz1C,EAAA,WACAxH,EAAA,EAAgBA,GAAA4hE,EAAArhE,SAAkBP,GAClCi9C,EAAA2kB,EAAA5hE,MACAwH,EAAAA,EAAAjH,QAAAk3C,GAAA,WAAAmkC,GAAA57E,EAAAi9C,KAGA,OADAz1C,EAAAA,EAAAjH,QAAA,UACAiH,EAAApB,KAAA,GACA,CAkWA,CAAAk4C,EAAAA,EAAA,WAEA92C,EAAAi4D,EAAAj4D,EAAAjH,QAAA,eACA+9C,EAAA,aACA,MAAAA,EAAA,UACA6hC,EApFA,SAAA7hC,EAAAxwB,GACA,IAAAwlC,EAEqBxW,EAFrBt1C,EAAA,GAAAD,EAAA,GAAA+0C,EAAAkB,GAAAc,EAAA,SAAArC,EAAA,GAAA5e,EAAA,GAAAukC,EAAA,GAAA18B,EAAA,EAAA9/B,EAAA,EAAAo3D,EAAAle,EAAA,SACAD,EAAAl5C,MAAAuE,QAAA40C,GACAkjC,EAAA,CAAgBj6E,EAAA81B,GAAKokD,GAAA,EACrB,IAAAr8E,EAAAk3C,EAAAj4C,EAAAX,EAAoB0B,GAAAk3C,EAAAv8C,EAAA2D,IAAgB0B,EAAAw8D,EAAAx8D,GAAAu3C,GAAAv3C,GACpC,IAAA8/B,EAAAoX,EAAAj4C,EAAAkD,EAAoB29B,GAAAoX,EAAAv8C,EAAAwH,IAAgB29B,EAAA,CAGpC,IAFA39B,EAAA,GACA81B,EAAAqf,GAAAxX,GACA9/B,EAAAk3C,EAAAj4C,EAAAX,EAAqB0B,GAAAk3C,EAAAv8C,EAAA2D,IAAgB0B,EAAA,CACrCkuD,EAAAsO,EAAAx8D,GAAAi4B,EACA,IAAAqkD,EAAArjC,GAAAC,EAAApZ,IAAA,IAAA9/B,GAAAk5C,EAAAgV,QACAzsD,IAAA66E,GACA,OAAAzlC,EAAA6hC,GAAA4D,EAAApuB,EAAAhV,EAAAxwB,KAAAvmB,EAAApB,KAAA81C,EACA,EACA10C,EAAAhH,OAAA,GAAAi8D,GAAAA,EAAAt3B,MACAs8C,EAAA,CAAcj6E,EAAA81B,GACdm/B,GAAAA,EAAAt3B,MACA4X,EAAA0f,EAAAt3B,IACAq2B,SAAAimB,EAAAjmB,OAAA,GACAkmB,GAAA,EACA3kC,EAAA6e,IAAA8lB,EAAAhlB,GAAA3f,EAAA6e,KACA7e,EAAA4e,MAAA+lB,EAAA3kC,EAAA4e,KACA+lB,GAAA,IAAsBD,EAAA/B,GAAAgC,EAAoBD,EAAAG,aAAA,GAC1C7kC,EAAAphC,QAAoB8lE,EAAA3F,aAAA/+B,EAAAphC,QAEpBlU,EAAAA,EAAAjH,QAAAk3C,GAAA,MAAAlwC,EAAAnB,KAAA,IAAAo7E,GAEA,CACA,GAAAhlB,EAAA,KAAgBt3B,EAAAs3B,EAAAj8D,SAAiB2kC,EACjCs3B,GAAAA,EAAAt3B,KACAs8C,EAAA,CAAcj6E,EAAA29B,EAAA,IACd4X,EAAA0f,EAAAt3B,IACAq2B,SAAAimB,EAAAjmB,OAAA,GACAkmB,GAAA,EACA3kC,EAAA6e,IAAA8lB,EAAAhlB,GAAA3f,EAAA6e,KACA7e,EAAA4e,MAAA+lB,EAAA3kC,EAAA4e,KACA+lB,GAAA,IAAsBD,EAAA/B,GAAAgC,EAAoBD,EAAAG,aAAA,GAC1C7kC,EAAAphC,QAAoB8lE,EAAA3F,aAAA/+B,EAAAphC,OACpBlU,EAAAA,EAAAjH,QAAAk3C,GAAA,SAAA+pC,IAGA,OAAAh6E,EAAApB,KAAA,GACA,CA0CAw7E,CAAAtjC,EAAAxwB,GACAqyD,EAAA5/E,OAAA,IAAAiH,EAAAA,EAAAjH,QAAA,IAEAiH,EAAAjH,OAAAk/D,EAAA,IAAuBj4D,EAAAA,EAAAjH,QAAA,eAAgCiH,EAAAi4D,GAAAj4D,EAAAi4D,GAAAl3D,QAAA,WAIvD+1C,EAAA,cAAA92C,EAAAA,EAAAjH,QAvbA,SAAA+4E,GAEA,IAAA9xE,EAAA,CAAWu2C,MAAA,GAKX,OAJA4/B,GAAAj5E,QAAA,SAAAtC,GAA0C,MAAAk3E,EAAAl3E,IAAAk3E,EAAAl3E,KAAAoF,EAAApF,GAAA,OAC1Cw7E,GAAAl5E,QAAA,SAAAtC,GAAyC,MAAAk3E,EAAAl3E,IAAAk3E,EAAAl3E,KAAAoF,EAAApF,GAAA,OAEzCk3E,EAAA7R,WAAAjgE,EAAAigE,SAAAZ,GAAAyS,EAAA7R,UAAAnkE,SAAA,IAAAgN,eACAmnC,GAAA,uBAAAjwC,EACA,CA+aAq6E,CAAAvjC,EAAA,cAKA,MAAAA,EAAA,iBAAA92C,EAAAA,EAAAjH,QA7WA,SAAAyC,EAAAs7C,EAAAmS,EAAAh1B,GACA,IAAA63B,EAAA,iBAAAtwD,EAAAswD,IAAAtwD,EAAAswD,IAAAjW,GAAAr6C,EAAAswD,KACA7C,EAAA+vB,WAAA/vB,EAAA+vB,SAAA,CAAkCtiC,OAAA,KAClCuS,EAAA+vB,SAAAsB,QAAArxB,EAAA+vB,SAAAsB,MAAA,IACA,IAAArI,EAAAhpB,EAAA+vB,SAAAsB,MACAxlC,EAAAc,GAAAkW,GACAhX,EAAAj4C,EAAAkD,GAAA+0C,EAAAv8C,EAAAwH,IAA8B+0C,EAAAv8C,EAAAwH,EAAA61C,GAAAkB,EAAA,SAAAv+C,EAAAwH,EAA0C+rD,EAAAjW,GAAAf,IACxE,QAAAt8C,EAAA,EAAgBA,EAAAy5E,EAAAl5E,SAAkBP,EAAA,CAClC,IAAAsP,EAAAmqE,EAAAz5E,GACA,4BAAAsP,EAAAijD,MACAjjD,EAAAyyE,OAAAtmD,EAAA,CACAnsB,EAAA0yE,IAAA,IAAAvxB,EAAAxS,WAAAxiB,GAAA,KAAA63B,EAAoD,KADpD,CAEA,CAEA,OADAtzD,GAAAy5E,EAAAl5E,QAAAk5E,EAAAtzE,KAAA,CAAoCosD,KAAA,wBAAAwvB,MAAAtmD,EAAAumD,IAAA,IAAAvxB,EAAAxS,WAAAxiB,GAAA,KAAA63B,IACpC7b,GAAA,mBAAuC6b,IAAAA,GACvC,CA8VA2uB,CAAA3jC,EAAA,eAAAA,EAAAmS,EAAAh1B,IAMA,MAAA6iB,EAAA,YAAAA,EAAA,WAAA/9C,OAAA,IAAAiH,EAAAA,EAAAjH,QA/eA,SAAA2hF,GACA,OAAAA,EAAA3hF,OAAA,SAEA,IADA,IAAAiH,EAAA,sBAAA06E,EAAA3hF,OAAA,KACAP,EAAA,EAAgBA,GAAAkiF,EAAA3hF,SAAoBP,EAAAwH,GAAA,mBAAA61C,GAAA6kC,EAAAliF,IAAA,MACpC,OAAAwH,EAAA,eACA,CA0eA,CAAA82C,EAAA,aAMA,IAAAiH,EAzZA48B,EAyZAC,GAAA,EAAAl8B,GAAA,EAsDA,OArDA5H,EAAA,UAAA/9C,OAAA,IACAiH,EAAAA,EAAAjH,QAAA,eACA+9C,EAAA,UAAA55C,QAAA,SAAAuB,GACAA,EAAA,GAAAw/C,SACAF,EAAA,CAAW+N,IAAArtD,EAAA,IACX,KAAAA,EAAA,GAAAw/C,OAAAvlD,OAAA,KACAgmD,EAAAD,GAAA5B,GAAA,EAAAxO,GAAA5vC,EAAA,GAAAw/C,QAAAl9C,QAAA,WAAAi8C,GAAAG,OACAY,EAAA,cAAAW,IAEAk8B,EAAAn8E,EAAA,GAAAw/C,OAAAv/C,QAAA,WAAAq/C,EAAA88B,SAAAxsC,GAAA5vC,EAAA,GAAAw/C,OAAApiD,MAAA++E,EAAA,KACAn8E,EAAA,GAAA2tD,UAAArO,EAAA+8B,QAAAzsC,GAAA5vC,EAAA,GAAA2tD,UACApsD,EAAAA,EAAAjH,QAAAk3C,GAAA,iBAAA8N,GACA,GACA/9C,EAAAA,EAAAjH,QAAA,wBAEA+9C,EAAA,UAIA,MAAAA,EAAA,cAAA92C,EAAAA,EAAAjH,SA5aAu7E,GADAqG,EA6aA7jC,EAAA,aA3aA7G,GAAA,mBAAA0qC,KAobAr0D,IAAAA,EAAAy0D,UAAA,MAAAz0D,EAAAy0D,WAAA/6E,EAAAA,EAAAjH,QAAAg3C,GAAA,gBAAAE,GAAA,qBAAoI+qC,mBAAA,EAAAC,MAAAnvB,MAIpI8sB,EAAA7/E,OAAA,IACA2lD,EAAAD,GAAA5B,GAAA,yBAAA5oB,EAAA,UAAA+oB,GAAAwtB,MACAxqE,EAAAA,EAAAjH,QAAAk3C,GAAA,gBAA4C,aAAAyO,IAC5C5H,EAAA,YAAA8hC,GAGA9hC,EAAA,aAAA/9C,OAAA,IACA2lD,EAAAD,GAAA5B,GAAA,4BAAA5oB,EAAA,UAAA+oB,GAAAI,KACAp9C,EAAAA,EAAAjH,QAAAk3C,GAAA,sBAAkD,aAAAyO,IAClD5H,EAAA,WAAA4H,GAWA1+C,EAAAjH,OAAA,IAAkBiH,EAAAA,EAAAjH,QAAA,eAAgCiH,EAAA,GAAAA,EAAA,GAAAe,QAAA,WAClDf,EAAApB,KAAA,GACA,CAiEA,SAAAs8E,GAAA5mC,EAAAwC,EAAAhC,EAAApX,GACA,IAAA19B,EAjDA,SAAA09B,EAAAoX,EAAAgC,GACA,IAAA92C,EAAAy+B,GAAA,KACA6W,GAAAwB,EAAA,cAAApZ,IAAA,GACA19B,EAAAm6B,YAAA,EAAAuD,GAEA19B,EAAAm6B,YAAA,KAEA,IAAAmvB,EAAA,IACAhU,EAAA6e,IAAA7K,EAAA,GAAA2L,GAAA3f,EAAA6e,KACA7e,EAAA4e,MAAA5K,EAAA,GAAAhU,EAAA4e,KACAl0D,EAAAm6B,YAAA,EAAAmvB,GAEAtpD,EAAAm6B,YAAA,KAEA,IAAA7V,EAAA,EACAgxB,EAAAphC,QAAAoQ,GAAAgxB,EAAAphC,OACAohC,EAAAye,SAAAzvC,GAAA,KACAgxB,EAAA6e,KAAA7e,EAAA4e,OAAA5vC,GAAA,IACAtkB,EAAAm6B,YAAA,EAAA7V,GAEAtkB,EAAAm6B,YAAA,KAGA,IAAAghD,EAAA,EAAAC,EAAAp7E,EAAAvB,EACAuB,EAAAvB,GAAA,EAGA,IADA,IAAA48E,EAAA,CAAct7E,EAAA29B,EAAAxhC,EAAA,GACd1D,EAAA,EAAgBA,EAAA,KAAQA,EACxB,KAAAs8C,EAAAj4C,EAAAX,EAAA1D,EAAA,OAAAs8C,EAAAv8C,EAAA2D,EAAA1D,GAAA,KAEA,IADA,IAAA8iF,GAAA,EAAA//D,GAAA,EACA1iB,EAAAL,GAAA,GAAuBK,EAAAL,EAAA,QAAiBK,EACxCwiF,EAAAn/E,EAAArD,GACA8E,MAAAuE,QAAA40C,IAAAA,EAAAukC,EAAAt7E,IAAA,IAAAs7E,EAAAn/E,GAAA46C,EAAA9B,GAAAqmC,OACcC,EAAA,IAAAA,EAAAziF,GAAyB0iB,EAAA1iB,GAEvCyiF,EAAA,MACAH,EACAn7E,EAAAm6B,YAAA,EAAAmhD,GACAt7E,EAAAm6B,YAAA,EAAA5e,GAVA,CAaA,IAAA9c,EAAAuB,EAAAvB,EAKA,OAJAuB,EAAAvB,EAAA28E,EACAp7E,EAAAm6B,YAAA,EAAAghD,GACAn7E,EAAAvB,EAAAA,EAEAuB,EAAAjH,OAAAiH,EAAAvB,EAAAuB,EAAAnE,MAAA,EAAAmE,EAAAvB,GAAAuB,CACA,CAEAu7E,CAAA79C,EAAAoX,EAAAgC,IACA92C,EAAAjH,OAAA,KAAA+9C,EAAA,cAAApZ,KAAA2W,GAAAC,EAAA,YAAAt0C,EACA,CAGA,IAAAw7E,GAAArhC,GACAshC,GAAArhC,GA2IA,SAAAshC,GAAAlgF,GAGA,OAFA29C,GAAA39C,GACA6+C,GAAA7+C,GACA,IACA,CA0HA,IAAAmgF,GAAAxhC,GACAyhC,GAAAxhC,GAiFAyhC,GAAA,kDA0WA,SAAAC,GAAAxnC,EAAAG,EAAA/W,EAAA9/B,EAAA0oB,EAAAwwB,EAAAilC,GACA,QAAA18E,IAAAo1C,EAAA/pB,EAAA,SACA,IAAAgN,EAAA,GACA,OAAA+c,EAAA30C,GACA,QAAA43B,EAAA+c,EAAA/pB,EAAA,QAAqC,MACrC,SACA+pB,EAAAlJ,GAAAkJ,IACAhH,EAAAgH,EAAAhH,GAAAxe,EAAA0J,OAAA,IACA8b,EAAA/pB,EAAAggB,EAAAS,EAAAsJ,EAAA/pB,IAAwC+pB,EAAA30C,EAAA,IACxC,MAEA,gBAAA43B,EAAA,GAAA+c,EAAA/pB,EAAsC,MACtC,QAAAgN,EAAA+c,EAAA/pB,EAEA,IAAA1qB,EAAA,CAAWD,EAAA29B,EAAAxhC,EAAA0B,GAKX,OAHAoC,EAAAnD,EAAA+3E,GAAAtuD,EAAAogD,QAAAjyB,EAAAnuB,GACAmuB,EAAAh2C,GAAAq4C,EAAA,UAAAn4C,KAAA,CAAAq2C,GAAAh1C,GAAAy0C,EAAAh2C,IACAg2C,EAAAv4C,GAAA46C,EAAA,aAAAn4C,KAAA,CAAAq2C,GAAAh1C,GAAAy0C,EAAAv4C,IACAu4C,EAAA30C,GACA,kBAWA,OAVAwmB,EAAA22C,SACAvlC,EAAAs8C,GAAA1tD,EAAAmwD,QAAAhiC,EAAA,EAAAnuB,EAAAowD,YACA12E,EAAAF,EAAA,IAAeE,EAAA0qB,EAAAgN,EACfqkD,EAAA1nC,GAAAC,EAAA,eArmBA,SAAAG,EAAAunC,EAAAh8E,GAIA,OAHA,MAAAA,IAAAA,EAAAy+B,GAAA,IACA2a,GAAA4iC,EAAAh8E,GACAA,EAAAm6B,YAAA,EAAA6hD,EAAAtxD,GACA1qB,CACA,CAgmBAi8E,CAAAxnC,EAAAz0C,IACAq0C,GAAAC,EAAA,cAjnBA,SAAAG,EAAAunC,EAAAh8E,GAIA,OAHA,MAAAA,IAAAA,EAAAy+B,GAAA,KACAya,GAAA8iC,EAAAh8E,GACAA,EAAAm6B,YAAA,EAAA6hD,EAAAtxD,GACA1qB,CACA,CA4mBAk8E,CAAAznC,EAAAz0C,MAEAA,EAAAF,EAAA,MACAi8E,EAAA1nC,GAAAC,EAAA,aAhiBA,SAAAG,EAAAunC,EAAAh8E,GAIA,OAHA,MAAAA,IAAAA,EAAAy+B,GAAA,IAAAgW,EAAA/pB,EAAA3xB,SACAqgD,GAAA4iC,EAAAh8E,GACA83C,GAAArD,EAAA/pB,EAAA1qB,GACAA,EAAAjH,OAAAiH,EAAAvB,EAAAuB,EAAAnE,MAAA,EAAAmE,EAAAvB,GAAAuB,CACA,CA2hBAm8E,CAAA1nC,EAAAz0C,IACAq0C,GAAAC,EAAA,YA5iBA,SAAAG,EAAAunC,EAAAh8E,GAIA,OAHA,MAAAA,IAAAA,EAAAy+B,GAAA,KAAAgW,EAAA/pB,EAAA3xB,SACAmgD,GAAA8iC,EAAAh8E,GACA83C,GAAArD,EAAA/pB,EAAA1qB,GACAA,EAAAjH,OAAAiH,EAAAvB,EAAAuB,EAAAnE,MAAA,EAAAmE,EAAAvB,GAAAuB,CACA,CAuiBAo8E,CAAA3nC,EAAAz0C,MAEA,EACA,QAQK,OANLy0C,EAAA/pB,IAAA,EAAA+pB,EAAA/pB,IAAA+pB,EAAA/pB,GAAA,KAAA+pB,EAAA/pB,EAAA,IACAqxD,EAAA1nC,GAAAC,EAAA,aAhkBA,SAAAG,EAAAunC,EAAAh8E,GAIA,OAHA,MAAAA,IAAAA,EAAAy+B,GAAA,IACA2a,GAAA4iC,EAAAh8E,GACAg6C,GAAAvF,EAAA/pB,EAAA1qB,GACAA,CACA,CA2jBAq8E,CAAA5nC,EAAAz0C,IACAq0C,GAAAC,EAAA,YA5kBA,SAAAG,EAAAunC,EAAAh8E,GAIA,OAHA,MAAAA,IAAAA,EAAAy+B,GAAA,KACAya,GAAA8iC,EAAAh8E,GACAg6C,GAAAvF,EAAA/pB,EAAA1qB,GACAA,CACA,CAukBAs8E,CAAA7nC,EAAAz0C,IAEA+7E,EAAA1nC,GAAAC,EAAA,eA3lBA,SAAAG,EAAAunC,EAAAh8E,GAIA,OAHA,MAAAA,IAAAA,EAAAy+B,GAAA,KACA2a,GAAA4iC,EAAAh8E,GACAs6C,GAAA7F,EAAA/pB,EAAA1qB,GACAA,CACA,CAslBAu8E,CAAA9nC,EAAAz0C,IACAq0C,GAAAC,EAAA,cAvmBA,SAAAG,EAAAunC,EAAAh8E,GAIA,OAHA,MAAAA,IAAAA,EAAAy+B,GAAA,KACAya,GAAA8iC,EAAAh8E,GACAs6C,GAAA7F,EAAA/pB,EAAA1qB,GACAA,CACA,CAkmBAw8E,CAAA/nC,EAAAz0C,KACK,EACL,QAIA,OAHAA,EAAAF,EAAA,IACAi8E,EAAA1nC,GAAAC,EAAA,eA3qBA,SAAAG,EAAAunC,EAAAh8E,GAIA,OAHA,MAAAA,IAAAA,EAAAy+B,GAAA,IACA2a,GAAA4iC,EAAAh8E,GACAA,EAAAm6B,YAAA,EAAAsa,EAAA/pB,EAAA,KACA1qB,CACA,CAsqBAy8E,CAAAhoC,EAAAz0C,IACAq0C,GAAAC,EAAA,cAvrBA,SAAAG,EAAAunC,EAAAh8E,GAIA,OAHA,MAAAA,IAAAA,EAAAy+B,GAAA,IACAya,GAAA8iC,EAAAh8E,GACAA,EAAAm6B,YAAA,EAAAsa,EAAA/pB,EAAA,KACA1qB,CACA,CAkrBA08E,CAAAjoC,EAAAz0C,KACA,EACA,QAIA,OAHAA,EAAAF,EAAA,IACAi8E,EAAA1nC,GAAAC,EAAA,gBAxpBA,SAAAG,EAAAunC,EAAAh8E,GAMA,OALA,MAAAA,IAAAA,EAAAy+B,GAAA,IACA2a,GAAA4iC,EAAAh8E,GACAA,EAAAm6B,YAAA,EAAAsa,EAAA/pB,GACA1qB,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAn6B,CACA,CAipBA28E,CAAAloC,EAAAz0C,IACAq0C,GAAAC,EAAA,eApqBA,SAAAG,EAAAunC,EAAAh8E,GAIA,OAHA,MAAAA,IAAAA,EAAAy+B,GAAA,IACAya,GAAA8iC,EAAAh8E,GACAA,EAAAm6B,YAAA,EAAAsa,EAAA/pB,GACA1qB,CACA,CA+pBA48E,CAAAnoC,EAAAz0C,KACA,EAIA,OAFA+7E,EAAA1nC,GAAAC,EAAA,gBA1sBA,SAAAG,EAAAunC,EAAAh8E,GAEA,OADA,MAAAA,IAAAA,EAAAy+B,GAAA,IACA2a,GAAA4iC,EAAAh8E,EACA,CAusBA68E,CAAApoC,EAAAz0C,IACAq0C,GAAAC,EAAA,eAntBA,SAAAG,EAAAunC,EAAAh8E,GAEA,OADA,MAAAA,IAAAA,EAAAy+B,GAAA,IACAya,GAAA8iC,EAAAh8E,EACA,CAgtBA88E,CAAAroC,EAAAz0C,KACA,CACA,CAsHA,SAAA+8E,GAAA9oD,EAAA3N,EAAA2iC,EAAApM,GACA,IAAAvI,EAAAP,KACAl3C,EAAAosD,EAAAxS,WAAAxiB,GAAA6iB,EAAAmS,EAAAvS,OAAA75C,IAAA,GACAX,EAAAW,EAAY,IAAMosD,GAAAA,EAAA+vB,WAAA98E,EAAA+sD,EAAA+vB,SAAAtiC,OAAAziB,GAAAiiD,UAAAh6E,EAAA,CAAmE,MAAA3D,GAAA,CACrF,IAAAwH,EAAAi2C,GAAAc,EAAA,eACA,GAAA/2C,EAAAxH,EAAA2D,EAAA,OAAA6D,EAAAxH,EAAAwH,EAAA,SACA,GAAAumB,EAAAupB,IAAA,UAAA/xC,MAAA,UAAAg5C,EAAA,sDACA/2C,EAAAxH,EAAA2D,EAAAwS,KAAAC,IAAA5O,EAAAxH,EAAA2D,EAAA,OACA6D,EAAAxH,EAAAwH,EAAA2O,KAAAC,IAAA5O,EAAAxH,EAAA2D,EAAA,QACA,CA4CA,OA3CA46C,EAAA,aAEAA,EAAA,gBACAzC,GAAAC,EAAA,kBACA2U,EAAA6vB,QAAAhiC,EAAA,cAAAzC,GAAAC,EAAA,YA92BA,SAAApwC,EAAAwvB,EAAA1zB,GACA,MAAAA,IAAAA,EAAAy+B,GAAA,KAAAv6B,EAAAnL,SACA,IAAAqD,EAAA,IACAs3B,IACAA,EAAA0lD,QAAAh9E,IAAA,IACAs3B,EAAA3N,OAAA3pB,IAAA,MAEA4D,EAAAm6B,YAAA,EAAA/9B,GACA,QAAA5D,EAAA,EAAgBA,EAAA,IAAOA,EAAAwH,EAAAm6B,YAAA,KAKvB,OAJAogB,GAAA,CAAiBC,KAAA,GAAOx6C,GACxBA,EAAAm6B,aAAA,MACAn6B,EAAAm6B,aAAA,MACAmf,GAAAp1C,EAAAlE,GACAA,EAAAnE,MAAA,EAAAmE,EAAAvB,EACA,CAg2BAu+E,CAAA9gF,EAAA46C,EAAA,cACAzC,GAAAC,EAAA,WAAAmnC,GAAA17E,IAzCA,SAAAu0C,EAAAwC,EAAAkiC,GACA3kC,GAAAC,EAAA,mBAGAD,GAAAC,EAAA,iBA9eA,SAAAwC,EAAAkiC,EAAAh5E,GACA,MAAAA,IAAAA,EAAAy+B,GAAA,KACA,IAAAriC,EAAA,IAcA,SAbA48E,GAAA,IAAmBQ,OAAA,YAAmBE,MAAAt9E,GAAA,IACtC4D,EAAAm6B,YAAA,EAAA/9B,GACA4D,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,OACAn6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAn6B,CACA,CA6dAi9E,CAAAnmC,EAAAkiC,IAKA3kC,GAAAC,EAAA,gBAGAD,GAAAC,EAAA,gBACA,CA6BA4oC,CAAA5oC,EAAAwC,EAAAmS,EAAA+vB,UApGA,SAAA1kC,EAAAwC,GACAA,GAAAA,EAAA,WACAzC,GAAAC,EAAA,oBACAwC,EAAA,SAAA55C,QAAA,SAAAmgB,EAAA7kB,GAAsC6kB,GAAAg3B,GAAAC,EAAA,aAtdtC,SAAA12C,EAAA63C,EAAAz1C,GACA,MAAAA,IAAAA,EAAAy+B,GAAA,KACA,IAAA/mB,EAAA08D,GAAAx2E,EAAA63C,GACAz1C,EAAAm6B,aAAA,EAAAv8B,GACAoC,EAAAm6B,aAAA,EAAAv8B,GACAoC,EAAAm6B,YAAA,OAAAziB,EAAAkvC,OAAA,KACA5mD,EAAAm6B,YAAA,KACA,IAAA7V,EAAA,EAKA,OAJAmxB,EAAAse,SAAAzvC,GAAA,GACA,iBAAA5M,EAAAkvC,QAAAtiC,GAAA,GACAmxB,EAAAvhC,QAAAoQ,GAAAmxB,EAAAvhC,OAAA,GACAlU,EAAAm6B,YAAA,EAAA7V,GACAtkB,CACA,CAycsCm9E,CAAA3kF,EAAA6kB,GAAA,GACtCg3B,GAAAC,EAAA,kBACA,CAiGA8oC,CAAA9oC,EAAAwC,GAtIA,SAAAxC,EAAAwC,EAAA7iB,EAAA3N,GACA,IAAAwlC,EAAAhX,EAAAkB,GAAAc,EAAA,eAAAjhB,EAAA,GAAAukC,EAAA,GACA/lB,GAAAC,EAAA,qBACA,IAAAuC,EAAAl5C,MAAAuE,QAAA40C,GACAumC,EAAAvoC,EAAAv8C,EAAAwH,EACA+2C,EAAA,WAAAumC,EAAA3uE,KAAAX,IAAA+mC,EAAAv8C,EAAAwH,EAAA+2C,EAAA,SAAA/9C,OAAA,IACA,QAAA2kC,EAAAoX,EAAAj4C,EAAAkD,EAAwB29B,GAAA2/C,IAAU3/C,EAAA,CAClC7H,EAAAqf,GAAAxX,GAGAw9C,GAAA5mC,EAAAwC,EAAAhC,EAAApX,GACA,IAAAq+C,GAAA,EACA,GAAAr+C,GAAAoX,EAAAv8C,EAAAwH,EAAA,QAAAnC,EAAAk3C,EAAAj4C,EAAAX,EAA4C0B,GAAAk3C,EAAAv8C,EAAA2D,IAAgB0B,EAAA,CAE5D8/B,IAAAoX,EAAAj4C,EAAAkD,IAAAq6D,EAAAx8D,GAAAu3C,GAAAv3C,IACAkuD,EAAAsO,EAAAx8D,GAAAi4B,EACA,IAAA4e,EAAAoC,GAAAC,EAAApZ,IAAA,IAAA9/B,GAAAk5C,EAAAgV,GAGAiwB,IAFAtnC,GAEAqnC,GAAAxnC,EAAAG,EAAA/W,EAAA9/B,EAAA0oB,EAAAwwB,EAAAilC,EACA,CACA,CACA1nC,GAAAC,EAAA,kBACA,CAgHAgpC,CAAAhpC,EAAAwC,EAAA7iB,EAAA3N,GAzBA,SAAAguB,EAAAwC,GACAA,EAAA,aAEAzC,GAAAC,EAAA,qBApeA,SAAAw9B,EAAA9xE,GAwBA,OAvBA,MAAAA,IAAAA,EAAAy+B,GAAA,KACAz+B,EAAAm6B,YAAA,EAAA23C,EAAA7R,SAAAZ,GAAAyS,EAAA7R,UAAA,GACAjgE,EAAAm6B,YAAA,KACA,CACA,eACA,iBACA,mBACA,qBACA,kBACA,qBACA,kBACA,wBACA,qBACA,kBACA,yBACA,YACA,kBACA,mBACA,4BACAj9B,QAAA,SAAAtC,GACAA,EAAA,GAAAoF,EAAAm6B,YAAA,QAAA23C,EAAAl3E,EAAA,KAAAk3E,EAAAl3E,EAAA,SACAoF,EAAAm6B,YAAA,QAAA23C,EAAAl3E,EAAA,KAAAk3E,EAAAl3E,EAAA,QACA,GACAoF,CACA,CA2cAu9E,CAAAzmC,EAAA,aACA,CAuBA0mC,CAAAlpC,EAAAwC,GAzEA,SAAAxC,EAAAwC,EAAAmS,EAAAh1B,GACA,GAAA6iB,EAAA,gBACA,IAAAt7C,EAAAs7C,EAAA,eACAgV,EAAA,iBAAAtwD,EAAAswD,IAAAtwD,EAAAswD,IAAAjW,GAAAr6C,EAAAswD,KAGA7C,EAAA+vB,WAAA/vB,EAAA+vB,SAAA,CAAkCtiC,OAAA,KAClCuS,EAAA+vB,SAAAsB,QAAArxB,EAAA+vB,SAAAsB,MAAA,IACA,IAAArI,EAAAhpB,EAAA+vB,SAAAsB,MACAxlC,EAAAc,GAAAkW,GACAhX,EAAAj4C,EAAAkD,GAAA+0C,EAAAv8C,EAAAwH,IAA8B+0C,EAAAv8C,EAAAwH,EAAA61C,GAAAkB,EAAA,SAAAv+C,EAAAwH,EAA0C+rD,EAAAjW,GAAAf,IACxE,QAAAt8C,EAAA,EAAgBA,EAAAy5E,EAAAl5E,SAAkBP,EAAA,CAClC,IAAAsP,EAAAmqE,EAAAz5E,GACA,4BAAAsP,EAAAijD,MACAjjD,EAAAyyE,OAAAtmD,EAAA,CACAnsB,EAAA0yE,IAAA,IAAAvxB,EAAAxS,WAAAxiB,GAAA,KAAA63B,EAAoD,KADpD,CAEA,CACAtzD,GAAAy5E,EAAAl5E,QAAAk5E,EAAAtzE,KAAA,CAAoCosD,KAAA,wBAAAwvB,MAAAtmD,EAAAumD,IAAA,IAAAvxB,EAAAxS,WAAAxiB,GAAA,KAAA63B,IAEpCzX,GAAAC,EAAA,kBAAA8F,GAAApE,GAAA8V,KAIAzX,GAAAC,EAAA,gBAtBA,CAuBA,CAoDAmpC,CAAAnpC,EAAAwC,EAAAmS,EAAAh1B,GAnHA,SAAAqgB,EAAAwC,GACAA,GAAAA,EAAA,aACAzC,GAAAC,EAAA,qBA7gBA,SAAA5V,EAAA1+B,GAGA,OAFA,MAAAA,IAAAA,EAAAy+B,GAAA,IACAz+B,EAAAm6B,YAAA,EAAAuE,GACA1+B,CACA,CAygBA09E,CAAA5mC,EAAA,WAAA/9C,SACA+9C,EAAA,WAAA55C,QAAA,SAAAmgB,GAAqCg3B,GAAAC,EAAA,eAAAsnC,GAAAv+D,GAAA,GACrCg3B,GAAAC,EAAA,oBACA,CAkHAqpC,CAAArpC,EAAAwC,GAlGA,SAAAxC,EAAAwC,EAAA+F,GAEA/F,EAAA,UAAA55C,QAAA,SAAAuB,GACA,GAAAA,EAAA,GAAAw/C,OAAA,CACA,IAAAS,EAAAD,GAAA5B,GAAA,EAAAp+C,EAAA,GAAAw/C,OAAAl9C,QAAA,WAAAi8C,GAAAG,OACA9I,GAAAC,EAAA,WAlhBA,SAAA71C,EAAAigD,GACA,IAAA1+C,EAAAy+B,GAAA,MAAAhgC,EAAA,GAAAw/C,OAAAllD,QAAA0F,EAAA,GAAA2tD,SAAA,IAAArzD,SACAqhD,GAAA,CAAqBv9C,EAAA64C,GAAAj3C,EAAA,IAAAlG,EAAAm9C,GAAAj3C,EAAA,KAAyCuB,GAC9D25C,GAAA,MAAA+E,EAAA1+C,GACA,IAAA49E,EAAAn/E,EAAA,GAAAw/C,OAAAv/C,QAAA,KAKA,OAHAo5C,KADA,GAAA8lC,EAAA,GAAAn/E,EAAA,GAAAw/C,OAAApiD,MAAA+hF,EAAA,KACA,GAAA59E,GACA83C,GAAAr5C,EAAA,GAAA2tD,SAAA,GAAApsD,GACA83C,GAAA,GAAA93C,GACAA,EAAAnE,MAAA,EAAAmE,EAAAvB,EACA,CAwgBAo/E,CAAAp/E,EAAAigD,GAFA,CAGA,UACA5H,EAAA,SACA,CA8FAgnC,CAAAxpC,EAAAwC,EAAA+F,GAEA/F,EAAA,aAAAzC,GAAAC,EAAA,aAnjBA,SAAAigC,EAAAv0E,GAIA,OAHA,MAAAA,IAAAA,EAAAy+B,GAAA,KACA61C,GAAAC,GACAsH,GAAA3+E,QAAA,SAAAZ,GAAqCg+C,GAAA,EAAAh+C,GAAA0D,EAAA,GACrCA,CACA,CA8iBA+9E,CAAAjnC,EAAA,cAOAxwB,IAAAA,EAAAy0D,UAAA,MAAAz0D,EAAAy0D,UAtHA,SAAAzmC,EAAAwC,GACAA,GAAAA,EAAA,UACAzC,GAAAC,EAAA,yBACAD,GAAAC,EAAA,kBAtaA,SAAAwX,GACA,IAAA9rD,EAAAy+B,GAAA,IAIA,OAHAz+B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAigB,GAAA0R,EAAA9rD,GACAA,CACA,CAgaAg+E,CAAAhoC,GAAAc,EAAA,WACAzC,GAAAC,EAAA,uBACA,CAiHA2pC,CAAA3pC,EAAAwC,GAtGA,SAAAxC,EAAAwC,EAAA7iB,EAAA4oB,GAEA,GAAA/F,EAAA,aAAA/9C,OAAA,GACA,IAAA2lD,EAAAD,GAAA5B,GAAA,4BAAA5oB,EAAA,UAAA+oB,GAAAI,KACA/I,GAAAC,EAAA,mBAAAqF,GAAA,MAAA+E,IACA5H,EAAA,WAAA4H,CACA,CACA,CAkGAw/B,CAAA5pC,EAAAwC,EAAA7iB,EAAA4oB,GAQAxI,GAAAC,EAAA,eACAA,EAAAj6B,KACA,CACA2iC,GAAAmhC,MAAA,4EACAnhC,GAAAohC,QAAA,iEA+CAphC,GAAAqhC,GAAA,iFAEApuC,GAAA,mBACA0M,MAAArM,GAAA4sB,KAAA,GACA,UAAA5sB,GAAAvwC,IAuGA,IAAAu+E,GAAA,CACA,gCACA,mCACA,yBACA,iCACA,gBACA,uBACA,gCACA,4BACA,iCACA,gCACA,2BACA,oCACA,qCACA,yCACA,gCACA,sBACA,mCACA,2BAIAC,GAAA,CACA,sBACA,qCACA,uBACA,wBACA,mCACA,4BACA,iCACA,uBACA,0BAKAC,GAAA,GAKAC,GAAA,CACA,yBACA,oBACA,sBACA,0BACA,2BACA,yBACA,oBACA,uBACA,yBACA,kBAyBA,SAAAC,GAAA5xC,EAAA/mC,GACA,QAAAlN,EAAA,EAAgBA,GAAAi0C,EAAA/zC,SAAoBF,EACpC,IAD2C,IAAA8C,EAAAmxC,EAAAj0C,GAC3CL,EAAA,EAAeA,GAAAuN,EAAAhN,SAAsBP,EAAA,CAAO,IAAAi1C,EAAA1nC,EAAAvN,GAC5C,SAAAmD,EAAA8xC,EAAA,IAAA9xC,EAAA8xC,EAAA,IAAAA,EAAA,QACA,OAAAA,EAAA,IACA,4BAAA9xC,EAAA8xC,EAAA,MAAA9xC,EAAA8xC,EAAA,IAAAmB,GAAAjzC,EAAA8xC,EAAA,MAAgF,MAChF,2BAAA9xC,EAAA8xC,EAAA,MAAA9xC,EAAA8xC,EAAA,IAAA7X,SAAAj6B,EAAA8xC,EAAA,SAEA,CAEA,CACA,SAAAkxC,GAAA7xC,EAAA/mC,GACA,QAAAvN,EAAA,EAAgBA,GAAAuN,EAAAhN,SAAsBP,EAAA,CAAO,IAAAi1C,EAAA1nC,EAAAvN,GAC7C,SAAAs0C,EAAAW,EAAA,IAAAX,EAAAW,EAAA,IAAAA,EAAA,QACA,OAAAA,EAAA,IACA,4BAAAX,EAAAW,EAAA,MAAAX,EAAAW,EAAA,IAAAmB,GAAA9B,EAAAW,EAAA,MAA+F,MAC/F,2BAAAX,EAAAW,EAAA,MAAAX,EAAAW,EAAA,IAAA7X,SAAAkX,EAAAW,EAAA,SAEA,CACA,CAEA,SAAAmxC,GAAA31B,GACA01B,GAAA11B,EAAA41B,QAAAP,IACAK,GAAA11B,EAAA61B,OAAAL,IAEAC,GAAAz1B,EAAA81B,OAAAR,IACAG,GAAAz1B,EAAAvS,OAAA8nC,IAEA5K,GAAAniD,SAAAmd,GAAAqa,EAAA41B,QAAAptD,SACA,CASA,IAAAutD,GAAA,UAAAlmF,MAAA,IACA,SAAAmmF,GAAArkF,EAAA2xC,GACA,GAAA3xC,EAAA7B,OAAA,IAAqB,GAAAwzC,EAAA,SAAuB,UAAAzuC,MAAA,sCAC5C,IAAAohF,GAAA,EAMA,OALAF,GAAA9hF,QAAA,SAAAhB,GACA,OAAAtB,EAAA8D,QAAAxC,GAAA,CACA,IAAAqwC,EAAA,UAAAzuC,MAAA,4CACAohF,GAAA,CAFA,CAGA,GACAA,CACA,CAoBA,IAAAC,GAAA,gBA+JAC,GAAAnvC,GAAA,iBACA0M,MAAArM,GAAA4sB,KAAA,GAGA,UAAA5sB,GAAAvwC,IAGA,SAAAs/E,GAAAp2B,GACA,IAAAjpD,EAAA,CAAAgtC,IACAhtC,EAAAA,EAAAjH,QAAAqmF,GAEA,IAAAE,EAAAr2B,EAAA+vB,WAAA/vB,EAAA+vB,SAAAsB,OAAA,IAAAvhF,OAAA,EAKAwmF,EAAA,CAAoBtJ,SAAA,gBACpBhtB,EAAA+vB,UAAA/vB,EAAA+vB,SAAA6F,UACAP,GAAAphF,QAAA,SAAAlD,GACA,MAAAivD,EAAA+vB,SAAA6F,QAAA7kF,EAAA,KACAivD,EAAA+vB,SAAA6F,QAAA7kF,EAAA,KAAAA,EAAA,KACAulF,EAAAvlF,EAAA,IAAAivD,EAAA+vB,SAAA6F,QAAA7kF,EAAA,IACA,GACAivD,EAAA+vB,SAAA6F,QAAA3I,WAAmCqJ,EAAAtJ,SAAAhtB,EAAA+vB,SAAA6F,QAAA3I,gBAAoDqJ,EAAArJ,WAEvFl2E,EAAAA,EAAAjH,QAAAk3C,GAAA,kBAAAsvC,GAIA,IAAA/oC,EAAAyS,EAAA+vB,UAAA/vB,EAAA+vB,SAAAtiC,QAAA,GACAl+C,EAAA,EAGA,GAAAg+C,GAAAA,EAAA,IAAAA,EAAA,GAAAgpC,OAAA,CAEA,IADAx/E,EAAAA,EAAAjH,QAAA,cACAP,EAAA,EAAaA,GAAAywD,EAAAxS,WAAA19C,QACby9C,EAAAh+C,IACAg+C,EAAAh+C,GAAAgnF,SAFwChnF,GAIxCA,GAAAywD,EAAAxS,WAAA19C,SAAAP,EAAA,GACAwH,EAAAA,EAAAjH,QAAA,6BAAAP,EAAA,gBAAAA,EAAA,MACAwH,EAAAA,EAAAjH,QAAA,cACA,CAGA,IADAiH,EAAAA,EAAAjH,QAAA,WACAP,EAAA,EAAYA,GAAAywD,EAAAxS,WAAA19C,SAA2BP,EAAA,CACvC,IAAAu6D,EAAA,CAAcjrD,KAAAumC,GAAA4a,EAAAxS,WAAAj+C,GAAAqD,MAAA,QAGd,GAFAk3D,EAAA0sB,QAAA,IAAAjnF,EAAA,GACAu6D,EAAA,eAAAv6D,EAAA,GACAg+C,EAAAh+C,GAAA,OAAAg+C,EAAAh+C,GAAAgnF,QACA,OAAAzsB,EAAA93C,MAAA,SAAiC,MACjC,OAAA83C,EAAA93C,MAAA,aAEAjb,EAAAA,EAAAjH,QAAAk3C,GAAA,aAAA8iB,EACA,CA+BA,OA9BA/yD,EAAAA,EAAAjH,QAAA,YAKAumF,IACAt/E,EAAAA,EAAAjH,QAAA,iBACAkwD,EAAA+vB,UAAA/vB,EAAA+vB,SAAAsB,OAAArxB,EAAA+vB,SAAAsB,MAAAp9E,QAAA,SAAAtC,GACA,IAAAvC,EAAA,CAAYyP,KAAAlN,EAAAmwD,MACZnwD,EAAA8kF,UAAArnF,EAAA2L,QAAApJ,EAAA8kF,SACA,MAAA9kF,EAAA2/E,QAAAliF,EAAAsnF,aAAA,GAAA/kF,EAAA2/E,OACA3/E,EAAA4kF,SAAAnnF,EAAA07D,OAAA,KACAn5D,EAAA4/E,MACAx6E,EAAAA,EAAAjH,QAAAk3C,GAAA,cAAA5B,GAAAzzC,EAAA4/E,KAAAniF,GACA,GACA2H,EAAAA,EAAAjH,QAAA,mBAcAiH,EAAAjH,OAAA,IAAiBiH,EAAAA,EAAAjH,QAAA,cAA6BiH,EAAA,GAAAA,EAAA,GAAAe,QAAA,WAC9Cf,EAAApB,KAAA,GACA,CAUA,SAAAghF,GAAApkF,EAAAwE,GAMA,OALAA,IAAAA,EAAAy+B,GAAA,MACAz+B,EAAAm6B,YAAA,EAAA3+B,EAAAgkF,QACAx/E,EAAAm6B,YAAA,EAAA3+B,EAAAqkF,QACAlmC,GAAAn+C,EAAAskF,SAAA9/E,GACA83C,GAAAt8C,EAAAsM,KAAAjM,MAAA,MAAAmE,GACAA,EAAAjH,OAAAiH,EAAAvB,EAAAuB,EAAAnE,MAAA,EAAAmE,EAAAvB,GAAAuB,CACA,CAuCA,SAAA+/E,GAAAvkF,EAAAzC,GACA,IAAAiH,EAAA,GAIA,OAHAxE,EAAA++B,WAAA,GACAv6B,EAAAggF,OAAAxkF,EAAA++B,WAAA,GACA/+B,EAAAiD,GAAA1F,EAAA,EACAiH,CACA,CAiNA,SAAAigF,GAAAh3B,EAAA3iC,GACA,IAAAguB,EAAAP,KAyBA,OAxBAM,GAAAC,EAAA,gBACAD,GAAAC,EAAA,iBAjEA,SAAA94C,EAAAwE,GACAA,IAAAA,EAAAy+B,GAAA,MACA,QAAAjmC,EAAA,EAAgB,GAAAA,IAAQA,EAAAwH,EAAAm6B,YAAA,KAKxB,OAJA2d,GAAA,UAAA93C,GACA83C,GAAAzqB,EAAAj1B,QAAA4H,GACA83C,GAAAzqB,EAAAj1B,QAAA4H,GACA83C,GAAA,OAAA93C,GACAA,EAAAjH,OAAAiH,EAAAvB,EAAAuB,EAAAnE,MAAA,EAAAmE,EAAAvB,GAAAuB,CACA,CAyDAkgF,IAEA7rC,GAAAC,EAAA,YAzOA,SAAA94C,EAAAwE,GACAA,IAAAA,EAAAy+B,GAAA,KACA,IAAAna,EAAA,EAQA,OAPA9oB,GAEAA,EAAA2kF,gBAAA77D,GAAA,GAEAtkB,EAAAm6B,YAAA,EAAA7V,GACAtkB,EAAAm6B,YAAA,KACAmf,GAAA99C,GAAAA,EAAA06E,UAAA,eAAAl2E,GACAA,EAAAnE,MAAA,EAAAmE,EAAAvB,EACA,CA8NA2hF,CAAAn3B,EAAA+vB,UAAA/vB,EAAA+vB,SAAA6F,SAAA,OA1CA,SAAAvqC,EAAA2U,GAEA,GAAAA,EAAA+vB,UAAA/vB,EAAA+vB,SAAAtiC,OAAA,CAGA,IAFA,IAAAF,EAAAyS,EAAA+vB,SAAAtiC,OACAl+C,EAAA,EAAA6nF,GAAA,EAAAtsB,GAAA,EACOv7D,EAAAg+C,EAAAz9C,SAAmBP,GAC1Bg+C,EAAAh+C,KAAAg+C,EAAAh+C,GAAAgnF,SAAA,GAAAa,EAAAA,EAAA7nF,EACA,GAAAg+C,EAAAh+C,GAAAgnF,SAAA,GAAAzrB,IAAAA,EAAAv7D,GAEAu7D,EAAAssB,IACAhsC,GAAAC,EAAA,qBACAD,GAAAC,EAAA,cAzBA,SAAArgB,EAAAj0B,GAWA,OAVAA,IAAAA,EAAAy+B,GAAA,KACAz+B,EAAAm6B,aAAA,KACAn6B,EAAAm6B,aAAA,OACAn6B,EAAAm6B,YAAA,SACAn6B,EAAAm6B,YAAA,SACAn6B,EAAAm6B,YAAA,OACAn6B,EAAAm6B,YAAA,EAAAlG,GACAj0B,EAAAm6B,YAAA,EAAAlG,GAEAj0B,EAAAm6B,YAAA,EADA,KAEAn6B,EAAAjH,OAAAiH,EAAAvB,EAAAuB,EAAAnE,MAAA,EAAAmE,EAAAvB,GAAAuB,CACA,CAaAsgF,CAAAD,IAEAhsC,GAAAC,EAAA,mBAXA,CAYA,CA+BAisC,CAAAjsC,EAAA2U,GAjFA,SAAA3U,EAAA2U,GACA5U,GAAAC,EAAA,qBACA,QAAArgB,EAAA,EAAkBA,GAAAg1B,EAAAxS,WAAA19C,SAA6Bk7B,EAG/CogB,GAAAC,EAAA,cAAAsrC,GADA,CAAYJ,OADZv2B,EAAA+vB,UAAA/vB,EAAA+vB,SAAAtiC,QAAAuS,EAAA+vB,SAAAtiC,OAAAziB,IAAAg1B,EAAA+vB,SAAAtiC,OAAAziB,GAAAurD,QAAA,EACYK,OAAA5rD,EAAA,EAAA6rD,SAAA,OAAA7rD,EAAA,GAAAnsB,KAAAmhD,EAAAxS,WAAAxiB,MAGZogB,GAAAC,EAAA,kBACA,CA0EAksC,CAAAlsC,EAAA2U,GAeA5U,GAAAC,EAAA,cAEAA,EAAAj6B,KACA,CAMA,SAAAomE,GAAAjlF,EAAAsM,EAAAmsB,EAAA3N,EAAAu2B,EAAAoM,EAAAkb,EAAA7nB,GACA,eAAAx0C,EAAAjM,OAAA,GA/0CA,SAAAL,EAAAqkC,EAAA5L,EAAA4oB,EAAAoM,EAAAkb,EAAA7nB,GACA,IAAA9gD,EAAA,OAAAA,EACA,IAAA8qB,EAAAuZ,GAAA,GACAgd,IAAAA,EAAA,CAAmB,WAEnB,IAEAiP,EAKAxW,EAAA59B,EAAAkxC,EAAAlrB,EAAA9/B,EAAA8+B,EAAAy6C,EAAAthD,EAAA4e,EAPA53C,EAAAypB,EAAAuwB,MAAA,MAGAuhB,EAAA,CAAiBv7D,EAAA,CAAIkD,EAAA,IAAA7D,EAAA,KAAqB3D,EAAA,CAAMwH,EAAA,EAAA7D,EAAA,IAEhD+e,EAAA,GACAggD,GAAA,EAAA5gD,GAAA,EAEAqgE,EAAA,GACAp0D,EAAAsuB,KAAA,GACAtuB,EAAA,UAEA,IAAAo6D,EAAA,EAAAC,GAAA,EAEAhO,EAAA,GACAH,EAAA,GACArB,EAAA7qD,EAAA6qD,UAAAloB,EAAAkoB,UAAA,KAIA,GAHAA,EAAAqB,QAAAA,EACArB,EAAAwB,OAAAA,EACAxB,EAAA16B,WAAAwS,EAAAxS,YAAAwS,EAAAvS,OAAAj6C,IAAA,SAAAzC,GAAoE,OAAAA,EAAA8N,IAAA,IACpEwe,EAAA6qD,WACA7qD,EAAA6qD,SAAAA,EACAloB,EAAAqxB,OAAA,QAAA9hF,EAAA,EAA8BA,EAAAywD,EAAAqxB,MAAAvhF,SAAqBP,EAAA24E,EAAA,GAAA34E,EAAA,GAAAywD,EAAAqxB,MAAA9hF,GAGnD,IAAAy6D,EAAA,GAAAD,EAAA,GACA4tB,GAAA,EAwOA,GAtOA9sC,GAAA,KAA4Bl5C,EAAA,eAAAwB,EAAAs/E,IAE5BjoC,GAAAj4C,EAAA,SAAAgmB,EAAAq/D,EAAAhtC,GACA,IAAAx5B,EACA,OAAAw5B,GACA,SACAiY,EAAAtqC,EAAe,MACf,OACA8zB,EAAA9zB,EACA8E,EAAAwnC,WAAAxnC,EAAAwnC,WAAAxY,EAAAv1C,IAAAsa,GAAA,GACAwb,EAAAqf,GAAAxX,EAAA4X,EAAAv1C,GACAumB,EAAA,QAAAgvB,EAAAv1C,GACAyhB,EAAAuyC,QAAAvyC,EAAA0yC,KAAA,MAAA1yC,EAAAtN,SACAsN,EAAA0yC,MAAA1yC,EAAA2yC,IAAAC,GAAA5yC,EAAA0yC,MACAlB,EAAAxxC,EAAAzhB,GAAAyhB,GAEA,MAEA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QAEA,OADA9J,EAAA,CAAU5X,EAAA0hB,EAAA,IACVA,EAAA,IACA,QAAA9J,EAAAgT,EAAAlJ,EAAA,GAA6B,MAC7B,QAAA21D,EAAAl7B,GAAAz6B,EAAA,IAAoC9J,EAAAgT,EAAAysD,EAAAr3E,EAAc4X,EAAA3X,EAAAo3E,EAAAp3E,EAAc,MAChE,QAAA2X,EAAAgT,IAAAlJ,EAAA,GAA4C,MAC5C,QAAA9J,EAAAgT,EAAAlJ,EAAA,IAA6B,IAAA8E,EAAA6wC,WAAAz/C,EAAA/b,EAAAu6C,GAAAx+B,EAAAgT,IAA6C,MAC1E,UAAAhT,EAAA5X,EAAA,IAA4B4X,EAAAgT,EAAAlJ,EAAA,GAM5B,IAJAonC,EAAAtM,EAAAwpB,OAAAtkD,EAAA,GAAAy3B,aAAA+7B,GAAAt9D,EAAAkxC,EAAAxS,SAAA,KAAA9vB,EAAA69C,EAAA7nB,GACA1+C,GAAA,GAAA4jB,EAAA,GAAAtlB,EAAA0B,EAAA,EAAA4jB,EAAA,GAAAtlB,EACAoqB,EAAAuwB,OAAqBh6C,EAAA6gC,KAAA7gC,EAAA6gC,GAAA,IAAqB7gC,EAAA6gC,GAAA9/B,GAAA8Z,GAC1C7a,EAAAs4C,GAAAv3C,GAAAi4B,GAAAne,EACA4O,EAAA6xD,YAAA,CAEA,IADAwI,GAAA,EACAD,EAAA,EAAiBA,EAAA/N,EAAA55E,SAAoB2nF,EAAA,CACrC,IAAAI,EAAAnO,EAAA+N,GACAprC,EAAAv1C,GAAA+gF,EAAA,GAAAjkF,EAAAkD,GAAAu1C,EAAAv1C,GAAA+gF,EAAA,GAAAvoF,EAAAwH,GACAnC,GAAAkjF,EAAA,GAAAjkF,EAAAX,GAAA0B,GAAAkjF,EAAA,GAAAvoF,EAAA2D,IACAwb,EAAAha,EAAAm4C,GAAAirC,EAAA,IAAoCH,GAAA,EAEpC,EACAA,GAAAn/D,EAAAzoB,OAAA,IAAA2e,EAAAtb,EAAAolB,EAAA,GACA,CAKA,GAJA42C,EAAAv7D,EAAAkD,EAAAu1C,EAAAv1C,IAAAq4D,EAAAv7D,EAAAkD,EAAAu1C,EAAAv1C,GACAq4D,EAAAv7D,EAAAX,EAAA0B,IAAAw6D,EAAAv7D,EAAAX,EAAA0B,GACAw6D,EAAA7/D,EAAAwH,EAAAu1C,EAAAv1C,IAAAq4D,EAAA7/D,EAAAwH,EAAAu1C,EAAAv1C,GACAq4D,EAAA7/D,EAAA2D,EAAA0B,IAAAw6D,EAAA7/D,EAAA2D,EAAA0B,GACA0oB,EAAAkxB,WAAAoR,GAAA,KAAAlxC,EAAA5X,GAAAmvB,EAAA6I,QAAA7I,EAAA0J,OAAAiwB,EAAAxS,WAAA,CACA,IAAA2qC,EAAA9xD,EAAA+B,gBAAAtZ,EAAAgT,GAAwCq2D,IAASrpE,EAAA5X,EAAA,IAAW4X,EAAAgT,EAAA,IAAAjnB,KAAAs9E,EAAA1vD,EAAA0vD,EAAA1jE,EAAA,EAAA0jE,EAAA1oF,EAAA0oF,EAAAzvD,EAAAyvD,EAAAljF,EAAAkjF,EAAAxvD,EAAAwvD,EAAA9gF,GAC5D,CACA,MAEA,OACA,QACA,IAAAqmB,EAAAixB,YAAA0jB,EAAA,MACAvjD,EAAA,CAAU5X,EAAA,IAAA4qB,OAAArrB,GACVzB,GAAA,GAAA4jB,EAAA,GAAAtlB,EAAA0B,EAAA,EAAA4jB,EAAA,GAAAtlB,EACAoqB,EAAAuwB,OAAqBh6C,EAAA6gC,KAAA7gC,EAAA6gC,GAAA,IAAqB7gC,EAAA6gC,GAAA9/B,GAAA8Z,GAC1C7a,EAAAs4C,GAAAv3C,GAAAi4B,GAAAne,EACA0gD,EAAAv7D,EAAAkD,EAAAu1C,EAAAv1C,IAAAq4D,EAAAv7D,EAAAkD,EAAAu1C,EAAAv1C,GACAq4D,EAAAv7D,EAAAX,EAAA0B,IAAAw6D,EAAAv7D,EAAAX,EAAA0B,GACAw6D,EAAA7/D,EAAAwH,EAAAu1C,EAAAv1C,IAAAq4D,EAAA7/D,EAAAwH,EAAAu1C,EAAAv1C,GACAq4D,EAAA7/D,EAAA2D,EAAA0B,IAAAw6D,EAAA7/D,EAAA2D,EAAA0B,GACA,MAEA,SACA88E,EAAA/7E,KAAA6iB,GAAsB,MAEtB,SACA,IAAAu8B,EAAAlB,EAAA,OAAAr7B,EAAAw/D,OAQA,IAPAjjC,GACAv8B,EAAAy8B,OAAAF,EAAAE,OACAz8B,EAAAmxB,MAAAnxB,EAAAy8B,QAAA,IAAAz8B,EAAAmxB,KACAnxB,EAAAy/D,IAAAljC,GACM,IAAAv8B,EAAAw/D,QACNx/D,EAAAy8B,OAAA,IAAAz8B,EAAAmxB,KAEAjV,EAAAlc,EAAA0/D,IAAArkF,EAAAkD,EAAsB29B,GAAAlc,EAAA0/D,IAAA3oF,EAAAwH,IAAe29B,EAAA,IAAA9/B,EAAA4jB,EAAA0/D,IAAArkF,EAAAX,EAAuB0B,GAAA4jB,EAAA0/D,IAAA3oF,EAAA2D,IAAe0B,EAC3E0oB,EAAAuwB,OACAh6C,EAAA6gC,KAAA7gC,EAAA6gC,GAAA,IACA7gC,EAAA6gC,GAAA9/B,KAAAf,EAAA6gC,GAAA9/B,GAAA,CAA8BkC,EAAA,IAAA4qB,OAAArrB,IAC9BxC,EAAA6gC,GAAA9/B,GAAAa,EAAA+iB,IAEAkb,EAAAsY,GAAA,CAA0B94C,EAAA0B,EAAAmC,EAAA29B,IAC1B7gC,EAAA6/B,KAAA7/B,EAAA6/B,GAAA,CAA8B58B,EAAA,IAAA4qB,OAAArrB,IAC9BxC,EAAA6/B,GAAAj+B,EAAA+iB,GAGA,MAEA,SACA,IAAA8E,EAAA6xD,YAAA,MACAxF,EAAAh0E,KAAA6iB,IACAizB,EAAAnuB,EAAAuwB,MAAAh6C,EAAA6gC,GAAA9/B,GAAAf,EAAAs4C,GAAAv3C,GAAAi4B,IACAz5B,EAAAs1E,GAAAlwD,EAAA,GAAA42C,EAAA,CAAkDr4D,EAAAu1C,EAAAv1C,EAAA7D,EAAA0B,GAAauzE,EAAA7qD,GAC/DmuB,EAAA/2C,EAAAm4C,GAAAr0B,EAAA,IACA,MACA,SACA,IAAA8E,EAAA6xD,YAAA,MACA3F,EAAAx9B,GAAAxzB,EAAA,GAAA3kB,IAAA2kB,EAAA,IACAizB,EAAAnuB,EAAAuwB,MAAAh6C,EAAA6gC,GAAA9/B,GAAAf,EAAAs4C,GAAAv3C,GAAAi4B,IACAz5B,EAAAs1E,GAAAlwD,EAAA,GAAA42C,EAAA,CAAkDr4D,EAAAu1C,EAAAv1C,EAAA7D,EAAA0B,GAAauzE,EAAA7qD,GAC/D,MAGA,QACA,IAAAA,EAAAgmC,WAAA,MACA,KAAA9qC,EAAAjpB,GAAAipB,EAAA3kB,GACAo2D,EAAAzxC,EAAAjpB,KAAA,CAA0BquD,MAAAplC,EAAA7lB,EAAA,IAAAo4D,UAAA,EAAAvyC,EAAA8C,OAAApQ,MAAAsN,EAAAtN,OAC1B0sE,IAAoBA,GAAA,EAAgBxe,GAAA5gD,EAAA7lB,EAAA,MACpCs4D,GAAAhB,EAAAzxC,EAAAjpB,EAAA,IAEA,MAEA,SACAsE,EAAA,gBAAyBivD,IAAAjW,GAAAr0B,IACzB,MAEA,SACA3kB,EAAA,YAAA2kB,EACA,MAEA,SACAynC,EAAAvS,OAAAziB,KAAAg1B,EAAAvS,OAAAziB,GAAA,IACAzS,EAAA1Z,OAAAmhD,EAAAvS,OAAAziB,GAAAiiD,SAAA10D,EAAA1Z,OACA0Z,EAAA43D,OAAA53D,EAAAuE,QAAAlpB,EAAA,aAAgDu8E,MAAA53D,EAAA43D,MAAArzD,KAAAvE,EAAAuE,OAChD,MAEA,SACAkjC,EAAAuwB,QAAAvwB,EAAAuwB,MAAA,MACAvwB,EAAAuwB,MAAA,KAAAvwB,EAAAuwB,MAAA,OACAh4D,EAAAk4D,MAAAzwB,EAAAuwB,MAAA,GAAAE,KAAA,GACA,MAEA,SAGA,QACA,UAGA,SAEA,SACA,SACA,SACA,SACA,SACA,SACA,UACA,UACA,SACA,UACA,SACA,UACA,QACA,SACA,SACA,SACA,UACA,SACA,SACA,UACA,SACA,SACA,SACA,SACA,SACA,UACA,SACA,UACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,UACA,SACA,UACA,UACA,SACA,SACA,SACA,SACA,UACA,SACA,SACA,UACA,QACA,UACA,UACA,MAEA,QACAze,GAAA,EAAiB,MACjB,QACAA,GAAA,EAAkB,MAClB,QACAhgD,EAAAtc,KAAAkiF,GAAqB5lB,GAAA,EAAa,MAClC,QACAhgD,EAAAokB,MAAiB47B,GAAA,EAAc,MAE/B,QACA,IAAA4lB,GAAA,IAAAniF,QAAA,iBACA,IAAAmiF,GAAA,IAAAniF,QAAA,eACA,IAAAu8D,GAAA30C,EAAAupB,IAAA,UAAA/xC,MAAA,qBAAA+1C,EAAA,IAAAgtC,GAEA,EAAEv6D,UAEFA,EAAA6qD,gBACA7qD,EAAA,SAEAzpB,EAAA,UAAAu7D,EAAAv7D,EAAAkD,EAAA,KAAA+rD,IAAAA,EAAAvzD,EAAAwH,EAAA,GAAA+rD,EAAAvzD,EAAA2D,EAAA,GAAA4vD,EAAAjvD,EAAAkD,EAAA,GAAA+rD,EAAAjvD,EAAAX,EAAA,MAAAW,EAAA,QAAAg5C,GAAAiW,GAAAsM,IACA9xC,EAAAwnC,WAAAjxD,EAAA,SACA,IAAAskF,EAAAnrC,GAAAn5C,EAAA,SACAypB,EAAAwnC,YAAAqzB,EAAA5oF,EAAAwH,IACAohF,EAAA5oF,EAAAwH,EAAAumB,EAAAwnC,UAAA,EACAqzB,EAAA5oF,EAAAwH,EAAAq4D,EAAA7/D,EAAAwH,IAAAohF,EAAA5oF,EAAAwH,EAAAq4D,EAAA7/D,EAAAwH,GACAohF,EAAA5oF,EAAAwH,EAAAohF,EAAAtkF,EAAAkD,IAAAohF,EAAAtkF,EAAAkD,EAAAohF,EAAA5oF,EAAAwH,GACAohF,EAAA5oF,EAAA2D,EAAAk8D,EAAA7/D,EAAA2D,IAAAilF,EAAA5oF,EAAA2D,EAAAk8D,EAAA7/D,EAAA2D,GACAilF,EAAA5oF,EAAA2D,EAAAilF,EAAAtkF,EAAAX,IAAAilF,EAAAtkF,EAAAX,EAAAilF,EAAA5oF,EAAA2D,GACAW,EAAA,YAAAA,EAAA,QACAA,EAAA,QAAAg5C,GAAAsrC,GAEA,CAIA,OAHAzG,EAAA3hF,OAAA,IAAA8D,EAAA,WAAA69E,GACAznB,EAAAl6D,OAAA,IAAA8D,EAAA,SAAAo2D,GACAD,EAAAj6D,OAAA,IAAA8D,EAAA,SAAAm2D,GACAn2D,CACA,CAwjCAukF,CAAA,EAAA96D,EAAA2N,EAAA4oB,EAAAoM,EAAAkb,EAAA7nB,GA77EA,SAAA9gD,EAAA8qB,EAAA2N,EAAA4oB,EAAAoM,EAAAkb,EAAA7nB,GACA,IAAA9gD,EAAA,OAAAA,EACAqhD,IAAAA,EAAA,CAAmB,WAInB,IAAAhgD,EAAAypB,EAAAuwB,MAAA,IAAgC,EAChCuhB,EAAA,CAAkBv7D,EAAA,CAAIkD,EAAA,IAAA7D,EAAA,KAAqB3D,EAAA,CAAMwH,EAAA,EAAA7D,EAAA,IAEjDmlF,EAAA,GAAAC,EAAA,GACAC,EAAA/lF,EAAAuC,MAAAu3E,IACAiM,GACAF,EAAA7lF,EAAAK,MAAA,EAAA0lF,EAAAh/E,OACA++E,EAAA9lF,EAAAK,MAAA0lF,EAAAh/E,MAAAg/E,EAAA,GAAAxoF,SACGsoF,EAAAC,EAAA9lF,EAGH,IAAAw6E,EAAAqL,EAAAtjF,MAAA63E,IACAI,EAAAD,GAAAC,EAAA,GAAAn5E,EAAAosD,EAAAh1B,IACA+hD,EAAAqL,EAAAtjF,MAAA83E,MAyEA,SAAAG,EAAArsC,EAAA9sC,EAAAosD,EAAAh1B,GACA8hD,GAAAC,EAAAn6E,MAAA,EAAAm6E,EAAAt3E,QAAA,MAAA7B,EAAAosD,EAAAh1B,EACA,CA3EAutD,CAAAxL,EAAA,GAAAA,EAAA,GAAAn5E,EAAAosD,EAAAh1B,GAGA,IAAAwtD,GAAAJ,EAAAtjF,MAAA,yBAAkDwE,OAAA,IAASA,MAC3D,GAAAk/E,EAAA,GACA,IAAA31B,EAAAu1B,EAAAxlF,MAAA4lF,EAAAA,EAAA,IAAA1jF,MAAAy3E,IACA1pB,GAzCA,SAAAhV,EAAAj6C,GACA,IAAAxE,EAAA29C,GAAAn5C,GACAxE,EAAAwE,EAAAkD,GAAA1H,EAAAE,EAAAwH,GAAA1H,EAAAwE,EAAAX,GAAA7D,EAAAE,EAAA2D,GAAA7D,EAAAwE,EAAAkD,GAAA,GAAA1H,EAAAwE,EAAAX,GAAA,IAAA46C,EAAA,QAAAjB,GAAAx9C,GACA,CAsCAqpF,CAAA7kF,EAAAivD,EAAA,GACA,CAGA,IAAA61B,EAAAN,EAAAtjF,MAAA+3E,IACA6L,GAAAA,EAAA,IAiMA,SAAAnmF,EAAAytD,GACAA,EAAAuwB,QAAAvwB,EAAAuwB,MAAA,OACAh+E,EAAAuC,MAAAs4E,KAAA,IAAAn5E,QAAA,SAAA6C,EAAAvH,GACA,IAAA80C,EAAAD,GAAAttC,GAEAkpD,EAAAuwB,MAAAhhF,KAAAywD,EAAAuwB,MAAAhhF,GAAA,KAEA80C,EAAAs0C,YAAA34B,EAAAuwB,MAAAhhF,GAAAqpF,MAAAv0C,EAAAs0C,WAEAhzC,GAAAtB,EAAAmsC,eAAAxwB,EAAAuwB,MAAAhhF,GAAAkhF,KAAA,EACA,EACA,CA5MAoI,CAAAH,EAAA,GAAA14B,GAGA,IAAA84B,EAAA,GACA,GAAAz7D,EAAAgmC,WAAA,CAEA,IAAA8N,EAAAinB,EAAAtjF,MAAA03E,IACArb,GA2IA,SAAA2nB,EAAA3nB,GAEA,IADA,IAAAwmB,GAAA,EACAoB,EAAA,EAAmBA,GAAA5nB,EAAArhE,SAAqBipF,EAAA,CACxC,IAAAzf,EAAAl1B,GAAA+sB,EAAA4nB,IAAA,GACAzf,EAAAxO,SAAAwO,EAAAxO,OAAAnlB,GAAA2zB,EAAAxO,SACA,IAAAkuB,EAAArsD,SAAA2sC,EAAA5zD,IAAA,MAAAuzE,EAAAtsD,SAAA2sC,EAAAx0D,IAAA,MAKA,IAJAw0D,EAAA8R,eAAA9R,EAAAruD,OAAAquD,EAAA8R,cAAA,UACA9R,EAAA5zD,WAAmB4zD,EAAAx0D,IAAiBw0D,EAAA3b,OAAA2b,EAAA3b,OACpCg6B,GAAAre,EAAA3b,QAA+Bg6B,GAAA,EAAgBxe,GAAAG,EAAA3b,QAC/CqN,GAAAsO,GACA0f,GAAAC,GAAAH,EAAAE,KAAA12C,GAAAg3B,EACA,CACA,CAvJA4f,CAAAJ,EAAA3nB,EACA,CAGAmnB,GAAAtK,GAAAsK,EAAA,GAAA1kF,EAAAypB,EAAA8xC,EAAA+L,EAAA7nB,GAGA,IAAA8lC,EAAAd,EAAAvjF,MAAA23E,IACA0M,IAAAvlF,EAAA,eA0JA,SAAArB,GAEA,MADA,CAAWswD,KAAAtwD,EAAAuC,MAAA,yBAEX,CA7JAskF,CAAAD,EAAA,KAGA,IAAA1H,EAAA,GACA4H,EAAAhB,EAAAvjF,MAAAs3E,IACA,GAAAiN,EAAA,IAAAb,EAAA,EAA0BA,GAAAa,EAAAvpF,SAAuB0oF,EACjD/G,EAAA+G,GAAAzrC,GAAAssC,EAAAb,GAAA5lF,MAAAymF,EAAAb,GAAA/iF,QAAA,SAGA,IAAA6jF,EAAAjB,EAAAvjF,MAAAw3E,IACAgN,GA+EA,SAAA1lF,EAAArB,EAAAqhD,GAEA,IADA,IAAAhG,EAAAl5C,MAAAuE,QAAArF,GACArE,EAAA,EAAgBA,GAAAgD,EAAAzC,SAAkBP,EAAA,CAClC,IAAAgpB,EAAA6rB,GAAAwB,GAAArzC,EAAAhD,KAAA,GACA,IAAAgpB,EAAAsqC,IAAA,OACA,IAAA/N,IAAAlB,GAAA,IAAwB,YAAAr7B,EAAArQ,IACxB4sC,GACAv8B,EAAAy8B,OAAAF,EAAAE,OACAz8B,EAAAq5D,WAAAr5D,EAAAy8B,QAAA,IAAA/P,GAAA1sB,EAAAq5D,aAEAr5D,EAAAy8B,OAAA,IAAA/P,GAAA1sB,EAAAq5D,UACA98B,EAAA,CAAUE,OAAAz8B,EAAAy8B,OAAAE,WAAA,aAEV38B,EAAAy/D,IAAAljC,EACAv8B,EAAAs5D,UAAoBt5D,EAAA4qC,QAAA5qC,EAAAs5D,eAA2Bt5D,EAAAs5D,SAE/C,IADA,IAAA0H,EAAAxsC,GAAAx0B,EAAAsqC,KACApuB,EAAA8kD,EAAA3lF,EAAAkD,EAAoB29B,GAAA8kD,EAAAjqF,EAAAwH,IAAW29B,EAAA,QAAA9/B,EAAA4kF,EAAA3lF,EAAAX,EAAuB0B,GAAA4kF,EAAAjqF,EAAA2D,IAAW0B,EAAA,CACjE,IAAA8+B,EAAAsY,GAAA,CAA2B94C,EAAA0B,EAAAmC,EAAA29B,IAC3BmZ,GACAh6C,EAAA6gC,KAAA7gC,EAAA6gC,GAAA,IACA7gC,EAAA6gC,GAAA9/B,KAAAf,EAAA6gC,GAAA9/B,GAAA,CAA4BkC,EAAA,IAAA4qB,OAAArrB,IAC5BxC,EAAA6gC,GAAA9/B,GAAAa,EAAA+iB,IAEA3kB,EAAA6/B,KAAA7/B,EAAA6/B,GAAA,CAA4B58B,EAAA,IAAA4qB,OAAArrB,IAC5BxC,EAAA6/B,GAAAj+B,EAAA+iB,EAEA,CACA,CACA,CA3GAihE,CAAA5lF,EAAA0lF,EAAA1lC,GAGA,IAAA03B,EAAA+M,EAAAvjF,MAAA43E,IAIA,GAHApB,IAAA13E,EAAA,YAyGA,SAAA89E,GACA,IAAA36E,EAAA,GAIA,MAHA,kDAAA9C,QAAA,SAAAZ,GACAq+E,EAAAr+E,KAAA0D,EAAA1D,GAAA87B,WAAAuiD,EAAAr+E,IACA,GACA0D,CACA,CA/GA0iF,CAAAr1C,GAAAknC,EAAA,OAEA13E,EAAA,SAAAu7D,EAAA7/D,EAAA2D,GAAAk8D,EAAAv7D,EAAAX,GAAAk8D,EAAA7/D,EAAAwH,GAAAq4D,EAAAv7D,EAAAkD,IAAAlD,EAAA,QAAAg5C,GAAAuiB,IACA9xC,EAAAwnC,UAAA,GAAAjxD,EAAA,SACA,IAAAskF,EAAAnrC,GAAAn5C,EAAA,SACAypB,EAAAwnC,YAAAqzB,EAAA5oF,EAAAwH,IACAohF,EAAA5oF,EAAAwH,EAAAumB,EAAAwnC,UAAA,EACAqzB,EAAA5oF,EAAAwH,EAAAq4D,EAAA7/D,EAAAwH,IAAAohF,EAAA5oF,EAAAwH,EAAAq4D,EAAA7/D,EAAAwH,GACAohF,EAAA5oF,EAAAwH,EAAAohF,EAAAtkF,EAAAkD,IAAAohF,EAAAtkF,EAAAkD,EAAAohF,EAAA5oF,EAAAwH,GACAohF,EAAA5oF,EAAA2D,EAAAk8D,EAAA7/D,EAAA2D,IAAAilF,EAAA5oF,EAAA2D,EAAAk8D,EAAA7/D,EAAA2D,GACAilF,EAAA5oF,EAAA2D,EAAAilF,EAAAtkF,EAAAX,IAAAilF,EAAAtkF,EAAAX,EAAAilF,EAAA5oF,EAAA2D,GACAW,EAAA,YAAAA,EAAA,QACAA,EAAA,QAAAg5C,GAAAsrC,GAEA,CAGA,OAFAY,EAAAhpF,OAAA,IAAA8D,EAAA,SAAAklF,GACArH,EAAA3hF,OAAA,IAAA8D,EAAA,WAAA69E,GACA79E,CACA,CAi3EA8lF,CAAA,EAAAr8D,EAAA2N,EAAA4oB,EAAAoM,EAAAkb,EAAA7nB,EACA,CA8CA,SAAAsmC,GAAA35B,EAAAnhD,EAAAwe,GACA,gBAAAxe,EAAAjM,OAAA,GAAAokF,GAAAZ,IAAAp2B,EAAA3iC,EACA,CAEA,SAAAu8D,GAAArnF,EAAAsM,EAAAwe,EAAA2iC,EAAApM,GACA,gBAAA/0C,EAAAjM,OAAA,GAAAkhF,GAAArE,IAAAl9E,EAAA8qB,EAAA2iC,EAAApM,EACA,CAWA,SAAAimC,GAAAtnF,EAAAsM,EAAAwe,GACA,gBAAAxe,EAAAjM,OAAA,GAAA2hE,GAAAT,IAAAvhE,EAAA8qB,EACA,CAEA,SAAAy8D,GAAAvnF,EAAAsM,EAAAwe,GACA,gBAAAxe,EAAAjM,OAAA,GAAAgwE,GAAAH,IAAAlwE,EAAA8qB,EACA,CAMA,IAAA08D,GAAA,kDACAC,GAAA,qDACA,SAAAC,GAAA51C,EAAAC,GACA,IAAA41C,EAAA71C,EAAAx0C,MAAA,OACA20C,EAAA,GACA,GADeF,IAAAE,EAAA,GAAA01C,EAAA,IACf,IAAAA,EAAApqF,OAAA,OAAA00C,EACA,IAAApc,EAAAx4B,EAAAL,EAAA6kB,EAAAiwB,EAAAvvC,MAAAilF,IACA,GAAA3lE,EAAA,IAAA7kB,EAAA,EAAkBA,GAAA6kB,EAAAtkB,SAAeP,GAEjC,KAAAK,GADAw4B,EAAAhU,EAAA7kB,GAAAuF,MAAAklF,KACA,GAAAvkF,QAAA,MAAA+uC,EAAApc,EAAA,IAAAA,EAAA,GAAAx1B,MAAA,EAAAw1B,EAAA,GAAAt4B,OAAA,GAIA00C,EAFA,WAAApc,EAAA,GAAAx1B,MAAA,aAAAw1B,EAAA,GAAAx1B,MAAA,GACAw1B,EAAA,GAAAx1B,MAAAhD,EAAA,IACAw4B,EAAA,GAAAx1B,MAAA,EAAAw1B,EAAA,GAAAt4B,OAAA,GAGA,OAAA00C,CACA,CACA,SAAA21C,GAAA91C,GACA,IACAG,EAAA,GACA,OAFAH,EAAAx0C,MAAA,OAEAC,OAAA,OAAA00C,EACA,IAAApc,EAAAx4B,EAAAL,EAAA6kB,EAAAiwB,EAAAvvC,MAAAilF,IACA,GAAA3lE,EAAA,IAAA7kB,EAAA,EAAkBA,GAAA6kB,EAAAtkB,SAAeP,GAEjC,KAAAK,GADAw4B,EAAAhU,EAAA7kB,GAAAuF,MAAAklF,KACA,GAAAvkF,QAAA,MAAA+uC,EAAApc,EAAA,IAAAA,EAAA,GAAAx1B,MAAA,EAAAw1B,EAAA,GAAAt4B,OAAA,GAIA00C,EAFA,WAAApc,EAAA,GAAAx1B,MAAA,aAAAw1B,EAAA,GAAAx1B,MAAA,GACAw1B,EAAA,GAAAx1B,MAAAhD,EAAA,IACAw4B,EAAA,GAAAx1B,MAAA,EAAAw1B,EAAA,GAAAt4B,OAAA,GAGA,OAAA00C,CACA,CAUA,SAAA41C,GAAAC,EAAAh5C,EAAAtvC,EAAAwmB,GACA,IAAA+hE,EAAA/hE,EACA,QAAAxmB,EAAA,GAAA+C,MAAA,kCACA,cAAAwlF,EAAA30C,GAAAptB,GAA4C,MAC5C,mBAAA+hE,EAAA3tD,SAAApU,EAAA,IAAmD,MACnD,qBAAA+hE,EAAAnrD,WAAA5W,GAAmD,MACnD,6BAAA+hE,EAAAp4C,EAAA3pB,GAA0D,MAC1D,oEACA,kBAAA1jB,MAAA,gBAAA9C,EAAA,IAEAsoF,EAAAp1C,GAAA5D,IAAAi5C,CACA,CAwBA,SAAAC,GAAAlnC,EAAAmnC,EAAAn9D,GACA,GAAAA,EAAAgmC,YACAm3B,EAAAC,SAAA,CACA,IAAAC,EAAAF,EAAAC,SACAC,EAAAC,UAAAD,EAAAve,YAAApC,GAAA2gB,EAAAC,UAAAD,EAAAC,QACA,CAEAtnC,EAAAmnC,EAAAI,IAAAJ,CACA,CAGA,SAAAK,GAAA9kB,EAAAvrC,EAAAj4B,EAAAi5C,EAAA9sB,EAAA20B,EAAAynC,EAAAzuC,EAAAq9B,EAAA3yE,GACA,IAAAgkF,EAAA,UAAAC,EAAAxvC,EAAAyvC,QAAA3yD,EAAA,GAAiDvxB,EAAAA,GAAA,GACjD,IAAAmkF,EAAA,GACA3rF,EAAA,EAGA,SAFA6G,IAAA4kF,GAAA3uC,IAAA2uC,EAAA3uC,EAAA4uC,cACA7kF,IAAA4kF,GAAAF,IAAAE,EAAAF,EAAAG,cACA7kF,IAAAi9C,EAAA2nC,KACA3nC,EAAA2nC,GAAAD,KAAAA,EAAA1nC,EAAA2nC,GAAAD,IACA1nC,EAAA2nC,GAAAP,UAAAS,EAAAxlF,KAAA29C,EAAA2nC,GAAAP,UACApnC,EAAA2nC,GAAAG,SACAH,EAAA3nC,EAAA2nC,GAAAG,OAEA,OAAA5oF,EAAAwiD,MACA,cACAvJ,EAAA30C,EAAA,IACA20C,EAAA/pB,EAAAkkB,GAAAowB,GACA,MACA,aACAvqB,EAAA30C,EAAA,IAAiB20C,EAAA10C,EAAA0uC,GAAAP,GAAA8wB,IACjBvqB,EAAA/pB,EAAAs0C,EAAAtgE,QAAA,QAAAwvC,GAAAza,GAAAurC,GAAAj+D,QAAA,aAAA0zC,EAAA10C,EACA,MACA,eACA,KAAAi/D,EAAAnjE,OAAA,KAAAmjE,GAAA,KACAvqB,EAAA/pB,GAAAygB,EAAA6zB,GAAA,IAAAv7D,KAAAA,KAAA4gF,IAAA,oBACA5vC,EAAA/pB,GAAA+pB,EAAA/pB,EAAA+pB,EAAA/pB,EAAAwjB,GAAA8wB,GACAvqB,EAAA/pB,EAAA,KAAA+pB,EAAA/pB,EAAA+pB,EAAA/pB,EAAA,GACAs5D,GAAA,WAAAA,IAAAA,EAAA,cAEA,kBACA3kF,IAAAo1C,EAAA/pB,IAAA+pB,EAAA/pB,GAAAs0C,GACAvqB,EAAA30C,IAAA20C,EAAA30C,EAAA,KACA,MACA,YAAA20C,EAAA30C,EAAA,IAA8B20C,EAAA/pB,EAAA8wB,GAAAwjB,IAAqB,IAAAh/D,EAAAm3D,WAAA1iB,EAAA94C,EAAAqjE,GAAuC,MAC1F,QACA,IAAAA,GAAA,IAAAvrC,EAA+BghB,EAAA30C,EAAA,KACrB20C,EAAA30C,EAAA,IAAc20C,EAAA/pB,EAAA+jB,GAAAhb,GAAAurC,IAIxB,GAxEA,SAAAvqB,EAAAuvC,EAAAhkF,GACA,SAAAy0C,EAAA30C,EAAA,CACA,IAAAE,IAAA,IAAAA,EAAAm3D,SAAA,IACA,MAAA1iB,EAAA30C,EAAuB20C,EAAA94C,EAAA84C,EAAA94C,GAAAu6C,GAAAzB,EAAA/pB,GACvB,YAAAs5D,EACA,MAAAvvC,EAAA30C,GACA,EAAA20C,EAAA/pB,KAAA+pB,EAAA/pB,EAAA+pB,EAAA94C,EAAAszB,EAAAmD,aAAAqiB,EAAA/pB,GACA+pB,EAAA94C,EAAAszB,EAAA2E,aAAA6gB,EAAA/pB,GAEA+pB,EAAA94C,EAAAszB,EAAA4E,SAAA4gB,EAAA/pB,GAEA+pB,EAAA94C,GA9BA03B,EA8BA2wD,GAAA,UA9BA5yE,EA8BAqjC,EAAA/pB,EA5BA,aADA6I,EAAAyF,EAAA3F,IAAA6a,GAAA7a,IACApE,EAAA4E,SAAAziB,GACA6d,EAAAoE,OAAAE,EAAAniB,GA4BA,CAAG,MAAA7Y,GAAW,GAAAyH,EAAA6vC,IAAA,MAAAt3C,CAAA,CA/Bd,IAAA86B,EAAAjiB,EACAmiB,EA+BA,IACA,IAAAka,EAAAzU,EAAAgrD,IAAAA,GAAA,UAEA,GADAhkF,EAAAo3D,SAAA3iB,EAAAhH,EAAAA,GACAztC,EAAAw3C,WAAA,KAAA/C,EAAA30C,GAAAmvB,EAAA6I,QAAA2V,GAAA,CACA,IAAAszC,EAAA9xD,EAAA+B,gBAAAyjB,EAAA/pB,GAAyCq2D,IAAStsC,EAAA30C,EAAA,IAAc20C,EAAA/pB,EAAA,IAAAjnB,KAAAs9E,EAAA1vD,EAAA0vD,EAAA1jE,EAAA,EAAA0jE,EAAA1oF,EAAA0oF,EAAAzvD,EAAAyvD,EAAAljF,EAAAkjF,EAAAxvD,EAAAwvD,EAAA9gF,GAChE,CACA,CAAG,MAAA1H,GAAW,GAAAyH,EAAA6vC,IAAA,MAAAt3C,CAAA,CAlBd,CAmBA,CAmDA+rF,CAAA7vC,EAAAuvC,EAAAhkF,IACA,IAAAA,EAAAm4E,YACA,GAAA1jC,EAAA8vC,QAAA,CACA,IAAA9X,EAAAv+B,GAAAuG,EAAA8vC,SAEA,IAAA9X,EAAAh0E,WAAA,KAAAg0E,EAAAA,EAAA5wE,MAAA,IACA44C,EAAAr4C,EAAAu3D,GAAA8Y,EAAA9kD,UACA8sB,EAAA8vC,QACA,MAAA9vC,EAAA+vC,WAAA/vC,EAAA/2C,EAAAi2D,GAAA,QAAAhsC,GACA8sB,EAAA+vC,aACA/vC,EAAA/2C,EAAAi2D,GAAAlf,EAAA+vC,WAAA78D,GACAgrD,EAAAh0E,KAAA,CAAAq3C,GAAAvB,EAAA/2C,GAAA+2C,EAAA/2C,IAEA,MACA,IAAAlF,EAAA,EAAcA,EAAAm6E,EAAA55E,SAAmBP,EACjCmvB,EAAA5nB,GAAA4yE,EAAAn6E,GAAA,GAAAqE,EAAAkD,GAAA4nB,EAAA5nB,GAAA4yE,EAAAn6E,GAAA,GAAAD,EAAAwH,GACA4nB,EAAAzrB,GAAAy2E,EAAAn6E,GAAA,GAAAqE,EAAAX,GAAAyrB,EAAAzrB,GAAAy2E,EAAAn6E,GAAA,GAAAD,EAAA2D,IACAu4C,EAAA/2C,EAAAi1E,EAAAn6E,GAAA,IAGAwH,EAAAssD,aACA63B,EAAAjnF,QAAA,SAAAlD,IACAu3B,EAAA6zC,aAAAprE,EAAAorE,cAAA7zC,EAAA6zC,YAAAprE,EAAAorE,YACA,GACA3wB,EAAA53C,EAAA00B,QAEAlyB,IAAAo1C,EAAAyvC,UAAAzvC,EAAAqT,KAAArT,EAAAyvC,QACA,CAEA,SAAAO,GAAAzgF,GACAA,EAAAlE,EAAAkE,EAAA0mB,GAAA,GACA1mB,EAAAlE,EAAAkE,EAAAlE,EAAAiB,QAAA,cAAAA,QAAA,YACAiD,EAAA0mB,EAAA1mB,EAAArI,EAAAqI,EAAA8jD,UAAAzoD,CACA,CAEA,SAAAqlF,GAAArsF,GACA,GAAA+B,GAAAC,OAAAuB,SAAAvD,GAAA,OAAAA,EAAAyD,SAAA,QACA,oBAAAzD,EAAA,OAAAA,EAEA,uBAAA8M,YAAA9M,aAAA8M,WAAA,OAAA0pC,GAAAjgB,EAAAC,EAAAx2B,KACA,UAAAyF,MAAA,8CACA,CAIA,IAAA6mF,GAAA,6DAEA,SAAAC,GAAAvsF,EAAAwnC,GACA,IAAAvZ,EAAAuZ,GAAA,GACA3Q,EAAAD,GACA,IAAA/qB,EAAA4pB,EAAA42D,GAAArsF,IACA,UAAAiuB,EAAA3hB,MAAA,SAAA2hB,EAAA3hB,MAAA,UAAA2hB,EAAA3hB,OACAT,EAAA,oBAAA/L,QAAAA,QAAAqF,MAAAC,OAAA,MAAAowB,EAAA3pB,IACA2qC,GAAA3qC,IAEA,IAKA2gF,EALAC,EAAA5gF,EAAArI,MAAA,QAAAuQ,cAAA24E,GAAA,EAEA,UADAD,EAAAA,EAAA/jF,QAAA,cACArC,QAAA,MAAAgQ,KAAAC,IAAA,KAAAm2E,EAAApmF,QAAA,KAA+F,KAA/FomF,EAAApmF,QAAA,MAA+F,CAAa,IAAAsmF,EAAAz5C,GAAAjlB,GAAwC,OAApB0+D,EAAArgF,KAAA,SAAoBwxD,GAAAlI,YAAA/pD,EAAA8gF,EAAA,CAEpJ,IADA,GAAAF,EAAApmF,QAAA,gEAAAxB,QAAA,SAAAowC,GAAwHw3C,EAAApmF,QAAA,IAAA4uC,IAAA,IAAAy3C,GAAA,KACxHA,EAAA,OAAAE,GAAAh3B,YAAA/pD,EAAAoiB,GAEA,IAAA4+D,EAYAnB,EAZA9oE,EAAA,GAEAu7B,EAAA,GAAgB2uC,EAAA,GAAAC,EAAA9+D,EAAAuwB,MAAA,MAAmDwuC,EAAA,GACpD5wC,EAAA,CAAY,EAAAa,EAAA,GAC3BgwC,EAAApC,GAAA,2BAAAqC,EAAA,EACArpF,EAAA,EAAA6D,EAAA,EACAq4D,EAAA,CAAiBv7D,EAAA,CAAIkD,EAAA,IAAA7D,EAAA,KAAqB3D,EAAA,CAAMwH,EAAA,EAAA7D,EAAA,IAChDogD,EAAA,GAAgBmnC,EAAA,GAChBhwD,EAAA,GAAA+xD,EAAA,EACA9K,EAAA,GACA/4B,EAAA,GAAe2hC,EAAA,GAAgBmC,EAAA,EAAAzqF,EAAA,GAC/BkhD,EAAA,GAAAl4C,EAAA,CAAiC,EACjC0hF,EAAA,GAAA9E,GAAA,EACAjO,EAAA,GACA3f,EAAA,GAAA0kB,EAAA,GAA8B7iD,EAAA,EAAAgB,EAAA,EAC9BmjD,EAAA,CAAmBtiC,OAAA,GAAAmoC,QAAA,CAAoBptD,UAAA,IAAiBk0D,EAAA,GACxDhB,GAAAzjB,UAAA,EACAh9D,EAAAA,EAAAnD,QAAA,0BAEA,IADA,IAAA6kF,EAAA,GACAf,EAAAF,GAAA1jB,KAAA/8D,WAAA2gF,EAAA,IAAAe,EAAAf,EAAA,IAAAz4E,eACA,WACA,WAAAw5E,EAAA,CACA,SAAAf,EAAA,IAAoB,IAAAK,EAAAjqE,EAAAokB,OAAA,KAAAwlD,EAAA,aAAA/mF,MAAA,cAAAonF,EAAAtmF,KAAA,UACpB,MAAAimF,EAAA,GAAAnsF,OAAAmsF,EAAA,GAAA9rF,OAAA,IAAAkiB,EAAAtc,KAAA,CAAAkmF,EAAA,QACA,KACA,CACA,GAAA5pE,EAAAA,EAAAliB,OAAA,YACA,MAAA8rF,EAAA,GAAAf,GAAA5/E,EAAArI,MAAA0pF,EAAAV,EAAAtiF,OAAAkxB,EAAA6xD,EAAA,WAAArqE,EAAAA,EAAAliB,OAAA,MAAAiL,EAAAywC,EAAA,CAAwIv4C,EAAAA,EAAA6D,EAAAA,GAAQu8C,EAAAopC,EAAAxpF,GAAAo5C,EAAAq9B,EAAArsD,IACtImN,EAAA,GAAS6xD,EAAApC,GAAA2B,EAAA,IAAgCU,EAAAV,EAAAtiF,MAAAsiF,EAAA,GAAA9rF,QACnD,MACA,WACA,SAAA8rF,EAAA,GAkBA,GAjBA3oC,EAAAnjD,OAAA,IAAA07C,EAAAv4C,EAAAggD,KACA51B,EAAAwnC,WAAAxnC,EAAAwnC,UAAA/tD,SAAAV,IAAAo1C,EAAA/pB,IACApE,EAAAuwB,OACAuuC,EAAArlF,KAAAqlF,EAAArlF,GAAA,IACAqlF,EAAArlF,GAAA7D,GAAAu4C,GACO2wC,EAAAjwC,GAAAj5C,GAAAg5C,GAAAn1C,IAAA00C,GAEPA,EAAAoxC,OACApxC,EAAAh2C,EAAA,CAAgBw/C,OAAA/P,GAAAuG,EAAAoxC,OAChBpxC,EAAAqxC,gBAAArxC,EAAAh2C,EAAA2tD,QAAA3X,EAAAqxC,sBACArxC,EAAAoxC,YAAuBpxC,EAAAqxC,gBAEvBrxC,EAAAsxC,aAAAtxC,EAAAuxC,aACAnxD,EAAA34B,GAAA,EAAA05B,SAAA6e,EAAAsxC,YAAA,KACAlwD,EAAA91B,GAAA,EAAA61B,SAAA6e,EAAAuxC,UAAA,KACAtL,EAAA/7E,KAAA,CAAkB9B,EAAA,CAAGX,EAAAA,EAAA6D,EAAAA,GAAQxH,EAAA,CAAI2D,EAAA24B,EAAA90B,EAAA81B,MAEjCvP,EAAAixB,WACA,GAAA9C,EAAAsxC,aAAAtxC,EAAAuxC,UAAA,CACA,QAAAC,EAAA/pF,EAAiB+pF,GAAApxD,IAAWoxD,EAC5B,QAAAC,EAAAnmF,EAAuBmmF,GAAArwD,IAAWqwD,GAClCD,EAAA/pF,GAAAgqF,EAAAnmF,KACAumB,EAAAuwB,OACAuuC,EAAAc,KAAAd,EAAAc,GAAA,IACAd,EAAAc,GAAAD,GAAA,CAA+BnmF,EAAA,MACrBslF,EAAAjwC,GAAA8wC,GAAA/wC,GAAAgxC,IAAA,CAAoDpmF,EAAA,MAI9D5D,EAAA24B,EAAA,CACA,OACA34B,OAd2Bu4C,EAAAsxC,YAAA7pF,EAAA24B,EAAA,IAAiC34B,OAgB5Du4C,EAAA2uC,GAAAyB,EAAA,KACApkB,QAAAvkE,GAAAu4C,EAAAgsB,MAAA,GACAvkE,EAAAk8D,EAAAv7D,EAAAX,IAAAk8D,EAAAv7D,EAAAX,EAAAA,GACAA,EAAAk8D,EAAA7/D,EAAA2D,IAAAk8D,EAAA7/D,EAAA2D,EAAAA,GACA,OAAA2oF,EAAA,GAAAhpF,OAAA,MAAAK,EACAggD,EAAA,GAEA,MACA,UACA,MAAA2oC,EAAA,WAAAA,EAAA,GAAAhpF,OAAA,IACAkE,EAAAq4D,EAAAv7D,EAAAkD,IAAAq4D,EAAAv7D,EAAAkD,EAAAA,GACAA,EAAAq4D,EAAA7/D,EAAAwH,IAAAq4D,EAAA7/D,EAAAwH,EAAAA,GACA,OAAA8kF,EAAA,GAAAhpF,OAAA,KACAy5C,EAAA4tC,GAAA2B,EAAA,KACApkB,QAAA1gE,GAAAu1C,EAAAmrB,MAAA,GAEAvkE,EAAA,IAAW6D,KAEXu1C,EAAA4tC,GAAA2B,EAAA,KACApkB,QAAA1gE,GAAAu1C,EAAAmrB,MAAA,GACAiX,EAAA,IACA,KAAApiC,EAAA6wC,eAAA7wC,EAAA8wC,UACA1O,EAAAvjB,IAAAv+B,SAAA0f,EAAA8wC,OAAA,IAA4C1O,EAAAxjB,IAAAe,GAAAyiB,EAAAvjB,KAC5CnB,EAAAjzD,GAAA23E,GAEA,KAAApiC,EAAAkqC,SAA4B9H,EAAA3jB,QAAA,EAAsBf,EAAAjzD,GAAA23E,IAElD,MACA,gBACA,SAAAmN,EAAA,IACA,IAAAK,EAAAjqE,EAAAokB,OAAA,KAAAwlD,EAAA,aAAA/mF,MAAA,cAAAonF,EAAAtmF,KAAA,MACAumF,EAAAxmF,KAAA0mF,GACAjtB,EAAAv7D,EAAAkD,GAAAq4D,EAAA7/D,EAAAwH,GAAAq4D,EAAAv7D,EAAAX,GAAAk8D,EAAA7/D,EAAA2D,IACAkpF,EAAA,QAAAvvC,GAAAuiB,GACA9xC,EAAAwnC,WAAAxnC,EAAAwnC,WAAAsK,EAAA7/D,EAAAwH,IACAqlF,EAAA,YAAAA,EAAA,QACAhtB,EAAA7/D,EAAAwH,EAAAumB,EAAAwnC,UAAA,EACAs3B,EAAA,QAAAvvC,GAAAuiB,KAGAsiB,EAAA3hF,SAAAqsF,EAAA,WAAA1K,GACAgL,EAAA3sF,OAAA,IAAAqsF,EAAA,SAAAM,GACA1yB,EAAAj6D,OAAA,IAAAqsF,EAAA,SAAApyB,GACAxc,EAAA6uC,GAAAD,CACA,MACAhtB,EAAA,CAAgBv7D,EAAA,CAAIkD,EAAA,IAAA7D,EAAA,KAAqB3D,EAAA,CAAMwH,EAAA,EAAA7D,EAAA,IAC/C6D,EAAA7D,EAAA,EACA+e,EAAAtc,KAAA,CAAAkmF,EAAA,QACAK,EAAAhC,GAAA2B,EAAA,IACAQ,EAAAn3C,GAAAg3C,EAAAn6B,MACAq6B,EAAA9+D,EAAAuwB,MAAA,MACA6jC,EAAA,GACA/H,EAAA,GACA3f,EAAA,GACA2yB,EAAA,CAAe79E,KAAAu9E,EAAA7F,OAAA,GACfxG,EAAAtiC,OAAA/3C,KAAAgnF,GAEA,MACA,YACA,SAAAd,EAAA,IAAmB,IAAAK,EAAAjqE,EAAAokB,OAAA,KAAAwlD,EAAA,aAAA/mF,MAAA,cAAAonF,EAAAtmF,KAAA,UACnB,UAAAimF,EAAA,GAAAhpF,OAAA,SAEAqnF,GAAA2B,EAAA,IACA5pE,EAAAtc,KAAA,CAAAkmF,EAAA,QACAa,EAAA,GAAgB9E,GAAA,CAChB,CACA,MAEA,YACA,MAAAiE,EAAA,GAAArB,GAAAlnC,EAAAmnC,EAAAn9D,GACAm9D,EAAAP,GAAA2B,EAAA,IACA,MAEA,mBACApB,EAAAO,GAAA91C,GAAAg1C,GAAA2B,EAAA,IAAAwB,QAAA,WACArtD,EAAAyqD,EAAAO,MAAAP,EAAAO,GAAAhrD,EAAAyqD,EAAAO,KACA,QAAAsC,EAAA,EAAuB,KAAAA,GAAiBr3D,EAAA0J,OAAA2tD,IAAA7C,EAAAO,KAAAsC,GACxC,QAAAA,EAAA,IAAAA,EAAA,GAA0C,KAAAA,IAAiBA,EAAA,SAAAr3D,EAAA0J,OAAA2tD,GAAA,CAA2Cr3D,EAAAtpB,KAAA89E,EAAAO,GAAAsC,GAA2B,MACjI,MAEA,aACA,aAAArrE,EAAAA,EAAAliB,OAAA,YAIA,IAHAgrF,EAAAb,GAAA2B,EAAA,KACArF,SAAqBuE,EAAAhwB,QAAA,SAAoBgwB,EAAAvE,QACzCuE,EAAAwC,QAAAxC,EAAAlvB,IAAAj/B,SAAAmuD,EAAAwC,MAAA,MACA3F,GAAAmD,EAAAlvB,IAAA,IACA+rB,GAAA,EAAoB9e,GA7kOpB,EA8kOA,QAAA0kB,EAAA,EAAsBA,EAAAd,EAAA3sF,SAAqBytF,EAAAd,EAAAc,IAAAvyB,GAAAyxB,EAAAc,GAC3C,CACA5F,GAAA3sB,GAAA8vB,GACA2B,EAAA3B,EAAAtjB,MAAA,GAAAilB,EAAA3sF,QAAAgrF,EACA,QAAAvrF,EAAA,EAAkBA,GAAAurF,EAAA0C,OAAgBjuF,EAAAktF,EAAAA,EAAA3sF,QAAAwyC,GAAAw4C,GAClC,MAEA,iBACA,SAAAc,EAAA,SACA7L,EAAAsB,QAAAtB,EAAAsB,MAAA,IACA,IAAAoM,EAAAr5C,GAAAw3C,EAAA,IACA8B,GAAA,CACA57B,KAAA27B,EAAA37B,KACAyvB,IAAA7mB,GAAA+yB,EAAAE,SAAA/qF,MAAA,IAAkDkE,EAAA,EAAA7D,EAAA,KAElD88E,EAAAtiC,OAAA39C,OAAA,IAAA4tF,GAAApM,MAAAvB,EAAAtiC,OAAA39C,OAAA,GACAigF,EAAAsB,MAAA37E,KAAAgoF,IACA,MAEA,gBACA,QACA,QACA,QACA,QACA,SACA,SACA,SACA,UACA,UACA,WACA,gBAEA,cACA,aAUA,iBA0BA,iBA6BA,WAUA,oBAwBA,iBAlGA,WACA,UAAA9B,EAAA,GAAAhpF,OAAA,SACA,MAAAgpF,EAAA,GAAApxD,GAAAvvB,EAAArI,MAAA2pF,EAAAX,EAAAtiF,OACAijF,EAAAX,EAAAtiF,MAAAsiF,EAAA,GAAA9rF,OACA,MACA,eACA,IAAAutB,EAAAgmC,WAAA,MACAm3B,EAAAC,SAAAR,GAAA2B,EAAA,IACA,MAGA,aACA,YACA,kBACA,cACA,eACA,cACA,eACA,cACA,iBACA,gBACA,kBACA,cACA,eACA,gBACA,oBACA,cACA,oBACA,iBACA,eACA,cACA,UAAAA,EAAA,GAAAhpF,OAAA,SACA,MAAAgpF,EAAA,GAAAnjC,GAAAC,EAAAikC,EAAA1hF,EAAArI,MAAA4pF,EAAAZ,EAAAtiF,QACAkjF,EAAAZ,EAAAtiF,MAAAsiF,EAAA,GAAA9rF,OACA,MAGA,aACA,eACA,SAAA8rF,EAAA,IAAmB,IAAAK,EAAAjqE,EAAAokB,OAAA,KAAAwlD,EAAA,aAAA/mF,MAAA,cAAAonF,EAAAtmF,KAAA,WACnBqc,EAAAtc,KAAA,CAAAkmF,EAAA,QACA,MAEA,cACA,SAAAA,EAAA,IACA,IAAAK,EAAAjqE,EAAAokB,OAAA,KAAAwlD,EAAA,aAAA/mF,MAAA,cAAAonF,EAAAtmF,KAAA,MACA6lF,GAAAzgF,GACAk4C,EAAAv9C,KAAAqF,EACA,MACAiX,EAAAtc,KAAA,CAAAkmF,EAAA,QAEA7gF,EAAA,CAAgB8+B,GADhBoiD,EAAAhC,GAAA2B,EAAA,KACgBpkC,QAEhB,MAEA,iBACA,SAAAokC,EAAA,IAAmB,IAAAK,EAAAjqE,EAAAokB,OAAA,KAAAwlD,EAAA,aAAA/mF,MAAA,cAAAonF,EAAAtmF,KAAA,WACnB,SAAAimF,EAAA,GAAAnsF,OAAAmsF,EAAA,GAAA9rF,OAAA,IACA,IAAA8tF,GAAA3D,GAAA2B,EAAA,IACAO,EAAA,gBAAgCt5B,IAAA6H,GAAAkzB,GAAAC,OAAA/lF,QAAA,WAChCka,EAAAtc,KAAA,CAAAkmF,EAAA,OACA,CACA,MAIA,qBACA,SAAAA,EAAA,IACA,IAAAK,EAAAjqE,EAAAokB,OAAA,KAAAwlD,EAAA,aAAA/mF,MAAA,cAAAonF,EAAAtmF,KAAA,UAEA,MAAAimF,EAAA,GAAAnsF,OAAAmsF,EAAA,GAAA9rF,OAAA,IAAAkiB,EAAAtc,KAAA,CAAAkmF,EAAA,QAEA,MAIA,uBACA,yBACA,+BACA,6BACA,iBACA,iBACA,YACA,cACA,iBACA,iBACA,cACA,aACA,4BACA,mBACA,gBACA,oBACA,sBACA,uBACA,SAAAA,EAAA,IAAmB,IAAAK,EAAAjqE,EAAAokB,OAAA,KAAAwlD,EAAA,aAAA/mF,MAAA,cAAAonF,EAAAtmF,KAAA,UACnB,MAAAimF,EAAA,GAAAnsF,OAAAmsF,EAAA,GAAA9rF,OAAA,IAAAkiB,EAAAtc,KAAA,CAAAkmF,EAAA,QACA,MAIA,QAEA,MAAA5pE,EAAAliB,QAAA,YAAA8rF,EAAA,UAAAkC,GAAA7iF,EAAAoiB,GAEA,MAAArL,EAAAliB,QAAA,OAAA8rF,EAAA,UAAAkC,GAAA7iF,EAAAoiB,GAEA,IAAAmW,IAAA,EACA,OAAAxhB,EAAAA,EAAAliB,OAAA,OAEA,oCAAA8rF,EAAA,IACA,eACA,gCACA,yBACA,2BACA,aACA,YACA,YACA,UACA,uBACA,gCACA,QAAApoD,IAAA,EACM,MAGN,8BAAAooD,EAAA,IACA,cACA,qBACA,yBACA,YACA,cACA,gBACA,eACA,4BACA,QAAApoD,IAAA,EACM,MAGN,2BAAAooD,EAAA,IACA,eACA7L,EAAA6F,QAAAptD,UAAA,EACA,MACA,mBACA,kBACA,iBACA,iBACA,eACA,uBACA,oBACA,qBACA,kBACA,sBACA,wBACA,cACA,gBACA,iBACA,sBACA,qBACA,UACA,6BACA,0BACA,gBACA,oBACA,gBACA,WACA,UACA,YACA,qBACA,kBACA,eACA,oBACA,UACA,iBACA,cACA,eACA,cACA,iBACA,cACA,YACA,WACA,UACA,oBACA,qBACA,+BACA,aACA,kBACA,+BACA,QAAAgL,IAAA,EACM,MAGN,6BAAAooD,EAAA,IACA,iBACA,aACA,kBACA,QAAApoD,IAAA,EACM,MAGN,8BAAAooD,EAAA,IACA,cACA,UAAAA,EAAA,GAAAhpF,OAAA,SACA,SAAAgpF,EAAA,UAAA3gF,EAAArI,MAAA4pF,EAAAZ,EAAAtiF,QACA,kBAAAojF,EAAAnG,OAAA,EAA+C,MAC/C,sBAAAmG,EAAAnG,OAAA,OAEAiG,EAAAZ,EAAAtiF,MAAAsiF,EAAA,GAAA9rF,OACA,MACA,aACAqsF,EAAA,aAAA9Q,GAAA8Q,EAAA,eAAuE,QACvEA,EAAA,YAAA56E,OAAA6iC,GAAAw3C,EAAA,IAAAmC,OACA,MACA,aACA5B,EAAA,aAAA9Q,GAAA8Q,EAAA,eAAuE,QACvEA,EAAA,YAAAzQ,OAAAtnC,GAAAw3C,EAAA,IAAAmC,OACA,MACA,kBACA,IAAAC,GAAA55C,GAAAw3C,EAAA,IACAO,EAAA,aAAA9Q,GAAA8Q,EAAA,eAAuE,QACvE6B,GAAAC,MAAA9B,EAAA,YAAAzhE,IAAAsjE,GAAAC,KACAD,GAAAE,OAAA/B,EAAA,YAAAr/D,KAAAkhE,GAAAE,MACAF,GAAAG,QAAAhC,EAAA,YAAA3Q,MAAAwS,GAAAG,OACAH,GAAAI,SAAAjC,EAAA,YAAA1Q,OAAAuS,GAAAI,QACA,MACA,yBACArO,EAAAQ,QAAAR,EAAAQ,MAAA,IACAR,EAAAQ,MAAA,KAAAR,EAAAQ,MAAA,OACAR,EAAAQ,MAAA,GAAAE,KAAA,EACA,MAEA,kBACA,oBAEA,sBACA,oBAGA,4BAGA,gBACA,gBACA,uBACA,0BAEA,eACA,YACA,kBACA,YACA,YACA,WACA,aACA,aACA,gBACA,eACA,qBACA,sBACA,uBACA,uBACA,2BACA,yBACA,qBACA,iBACA,oBACA,wBACA,gBACA,qBACA,qBACA,qBACA,oBACA,eACA,eACA,gBACA,qBACA,WACA,kBACA,gBACA,gBACA,kBACA,sBACA,sBACA,sBACA,sBACA,4BACA,uBACA,oBACA,oBAKA,oBACA,2BACA,yBAKA,oBACA,wBACA,uBACA,qBACA,0BACA,oBACA,0BACA,iBACA,oBACA,gBACA,4BArBA,+BACA0L,EAAA,cAAAA,EAAA,gBACAA,EAAA,YAAAhM,OAAA,EACA,MAIA,kCACAgM,EAAA,cAAAA,EAAA,gBACAA,EAAA,YAAAr/D,MAAA,EACA,MAYA,QAAA0W,IAAA,EACM,MAGN,yCAAAooD,EAAA,IACA,2BACA,gCACA,uBACA,eACA,iBACA,kBACA,iBACA,6BACA,uBACA,eACA,gBACA,eACA,gBACA,iBACA,kBACA,kBACA,iBACA,uBACA,WACA,eACA,eACA,iBACA,6BACA,eACA,gBACA,oBACA,iBACA,0BACA,aACA,eACA,gBACA,oBACA,eACA,wBACA,qBACA,kBACA,qBACA,kBACA,kBACA,sBACA,yBACA,wBACA,2BACA,4BACA,wBACA,QAAApoD,IAAA,EACM,MAGN,wBAAAooD,EAAA,IACA,gBACA,eACA,gBACA,eACA,eACA,aACA,mBACA,QAAApoD,IAAA,EACM,MAGN,wBAAAooD,EAAA,IACA,uBACA,0BACA,oBACA,yBACA,QAAApoD,IAAA,EACM,MAGN,wBAAAooD,EAAA,IACA,SACA,qBACA,wBACA,kBACA,gBACA,yBACA,qBACA,gBACA,iBACA,iBACA,kBACA,kBACA,eACA,aACA,iBACA,qBACA,yBACA,yBACA,aACA,aACA,cACA,wBACA,2BACA,qBACA,gBACA,iBACA,UACA,YACA,qBACA,sBACA,+BACA,QAAApoD,IAAA,EACM,MAEN,qBACA,OAAAooD,EAAA,IACA,YAEA,WACA,UACA,UACA,WACA,iBACA,YACA,oBACA,YACA,iBACA,mBACA,iBACA,mBACA,iBACA,gBACA,gBACA,gBACA,gBACA,eACA,aACA,aACA,aAEA,0BACA,QAAApoD,IAAA,EACM,MAEN,cACA,4BACA,OAAAooD,EAAA,IACA,YACA,WACA,UACA,UACA,WACA,iBACA,YACA,oBACA,YACA,iBACA,mBACA,iBACA,oBACA,mBACA,iBACA,gBACA,gBACA,gBACA,gBACA,eACA,aACA,aACA,mBACA,QAAApoD,IAAA,EACM,MAGN,6CAAAooD,EAAA,IACA,UACA,YACA,YACA,YACA,YACA,cACA,eACA,gBACA,kBACA,oBAEA,aACA,cACA,kBACA,eACA,UACA,gBACA,cAEA,gBACA,QAAApoD,IAAA,EACM,MAGN,sBAEA,QAAAA,IAAA,EAEA,GAAAA,GAAA,MAEA,GAAAooD,EAAA,GAAA9mF,MAAA,kBACA,IAAAkd,EAAAA,EAAAliB,OAAA,gCAAA8rF,EAAA,OAAA5pE,EAAArc,KAAA,KACA,gCAAAqc,EAAAA,EAAAliB,OAAA,OACA,UAAA8rF,EAAA,GAAAhpF,OAAA,SACA,MAAAgpF,EAAA,GAAAxB,GAAAC,EAAAsC,EAAA5qF,EAAAkJ,EAAArI,MAAA4pF,EAAAZ,EAAAtiF,SACWvH,EAAA6pF,EAASY,EAAAZ,EAAAtiF,MAAAsiF,EAAA,GAAA9rF,QACpB,KACA,CACA,GAAAutB,EAAAupB,IAAA,0BAAAg1C,EAAA,OAAA5pE,EAAArc,KAAA,KAEA,IAAAlD,GAAA,CAAc,EAOd,OANA4qB,EAAAghE,YAAAhhE,EAAAihE,YAAA7rF,GAAAg7C,OAAAF,GACA96C,GAAA+6C,WAAA0uC,EACAzpF,GAAAs9E,SAAAA,EACAt9E,GAAAuzB,IAAAA,EAAA2J,YACAl9B,GAAAimD,MAAAA,EACAjmD,GAAA4nF,UAAAA,EACA5nF,EACA,CAEA,SAAA8rF,GAAAhsF,EAAA8qB,GAEA,OADAmhE,GAAAnhE,EAAAA,GAAA,IACAA,EAAA3hB,MAAA,UACA,oBAAAigF,GAAAz2D,EAAA1wB,OAAAjC,GAAA8qB,GACA,4CAAAs+D,GAAAppF,EAAA8qB,GACA,mBAAAs+D,GAAAh2D,EAAApzB,GAAA8qB,GAEA,CA8BA,SAAAohE,GAAA9sF,GAA8B,OAAAq1C,GAAA,mBAAsC,UAAAr1C,EAAAmwD,KAAA,kBAAA0J,GAAA75D,EAAA4/E,IAAA,CAAwDz6E,EAAA,EAAA7D,EAAA,KAAU,CAiJtI,SAAAyrF,GAAAlzC,EAAAqX,EAAAhV,EAAAxwB,EAAA2N,EAAAg1B,EAAAvsB,GACA,IAAA+X,GAAAp1C,MAAAo1C,EAAA/pB,GAAArrB,MAAAo1C,EAAAr4C,EAAA,SAEA,IAAAoM,EAAA,GAEA,GADAisC,EAAAr4C,IAAAoM,EAAA,kBAAA6lC,GAAAomB,GAAAhgB,EAAAr4C,EAAAsgC,KACA+X,EAAA/2C,GAAA+2C,EAAA/2C,EAAA7B,MAAA,EAAAiwD,EAAA/yD,SAAA+yD,EAAA,CACA,IAAAzxC,EAAAq7B,GAAAjB,EAAA/2C,EAAA7B,MAAAiwD,EAAA/yD,OAAA,IACAyP,EAAA,yBAAA6R,EAAAta,GAAA28B,EAAA38B,EAAA,QAAAsa,EAAAta,EAAA28B,EAAA38B,GAAA,UAAAsa,EAAAne,GAAAwgC,EAAAxgC,EAAA,QAAAme,EAAAne,EAAAwgC,EAAAxgC,GAAA,IACA,CAOA,GALAu4C,EAAAh2C,GAAAg2C,EAAAh2C,EAAAw/C,SACAz1C,EAAA,WAAA6lC,GAAAoG,EAAAh2C,EAAAw/C,QACAxJ,EAAAh2C,EAAA2tD,UAAA5jD,EAAA,mBAAA6lC,GAAAoG,EAAAh2C,EAAA2tD,WAGAtV,EAAA,WAEA,IADA,IAAA8gC,EAAA9gC,EAAA,WACA8wC,EAAA,EAAkBA,GAAAhQ,EAAA7+E,SAAmB6uF,EACrChQ,EAAAgQ,GAAA/qF,EAAAX,GAAAwgC,EAAAxgC,GAAA07E,EAAAgQ,GAAA/qF,EAAAkD,GAAA28B,EAAA38B,IACA63E,EAAAgQ,GAAArvF,EAAA2D,EAAA07E,EAAAgQ,GAAA/qF,EAAAX,IAAAsM,EAAA,kBAAAovE,EAAAgQ,GAAArvF,EAAA2D,EAAA07E,EAAAgQ,GAAA/qF,EAAAX,GACA07E,EAAAgQ,GAAArvF,EAAAwH,EAAA63E,EAAAgQ,GAAA/qF,EAAAkD,IAAAyI,EAAA,gBAAAovE,EAAAgQ,GAAArvF,EAAAwH,EAAA63E,EAAAgQ,GAAA/qF,EAAAkD,IAIA,IAAAD,EAAA,GAAA4X,EAAA,GACA,OAAA+8B,EAAA30C,GACA,YAAAwmB,EAAAixB,WAAA,SAA4C,MAC5C,QAAAz3C,EAAA,SAA0B4X,EAAAzd,OAAAw6C,EAAA/pB,GAAoB,MAC9C,QAAA5qB,EAAA,UAA2B4X,EAAA+8B,EAAA/pB,EAAA,QAA0B,MACrD,QAAA5qB,EAAA,QAAyB4X,EAAAw+B,GAAAzB,EAAA/pB,GAAkB,MAC3C,QAAA5qB,EAAA,WAA4B4X,EAAA,IAAAjU,KAAAgxC,EAAA/pB,GAAAylB,cAAoC,MAAAsE,EAAAhH,IAAAgH,EAAAhH,EAAAgH,EAAAhH,GAAAxe,EAAA0J,OAAA,KAAsD,MACtH,QAAA74B,EAAA,SAA0B4X,IAAA+8B,EAAA/pB,GAAA,IA1nc1B,IACA3pB,QAAAotC,GAAA,SAAA9c,GAA0C,OAAA4c,GAAA5c,EAAA,GAAsBtwB,QAAAwtC,GAAA,SAAA1xC,GAAqC,YAAAA,EAAApE,WAAA,GAAAqD,SAAA,IAAAgN,cAAA,GAAgE,GA4ncrK,IAAA+Y,EAAA+yD,GAAAtuD,EAAAogD,QAAAjyB,EAAAnuB,GACA9d,EAAA,sBAAAqZ,GACArZ,EAAA,YAAAk0B,EAAAxgC,EAAA,EACA,IAAA2rF,EAAA,MAAApzC,EAAA/pB,EAAAhT,EAAA,GACA2F,EAAA,KAAAo3B,EAAA30C,EAAA,qBAAAA,EAAA,KAAA+nF,EAAA,UAIA,OAFApzC,EAAAv4C,GAAA,IAAAnD,OAAA,IAAAskB,GAAAo3B,EAAAv4C,EA/CAO,IAAA,SAAAP,GAEA,IACA7D,EAAA43C,GAAA,WADA/zC,EAAA4D,GAAA,IA3kcsCiB,QAAA,0BA4kctC,CAAkC47C,MAAA,oCAClC,OAAA1M,GAAA,UAAA53C,EAAA,CAAkC,YAAA6D,EAAA4mC,GAClC,GAAElkC,KAAA,KA4CFqxC,GAAA,OAAA5yB,EAAA7U,EACA,CACA,SAAAs/E,GAAApqD,EAAA4X,GACA,IAAAt1C,EAAA,mBAAA09B,EAAA,OAMA,OALA4X,IACAA,EAAA4e,MAAA5e,EAAA6e,MAAA7e,EAAA6e,IAAAC,GAAA9e,EAAA4e,MACA5e,EAAA6e,MAAAn0D,GAAA,oCAAAs1C,EAAA6e,IAAA,KACA7e,EAAAye,SAAA/zD,GAAA,mBAEAA,EAAA,GACA,CAuCA,SAAA+nF,GAAA9zD,EAAA3N,EAAA2iC,GACA,IAAAjpD,EAAA,GACAnD,EAAAosD,EAAAxS,WAAAxiB,GACA6iB,EAAAmS,EAAAvS,OAAA75C,GAEAiD,EAAAg3C,EApOA,SAAAA,EAAAxwB,EAAA2N,EAAAg1B,GACA,IAAAnS,EAAA,SACA,MAAAmS,GAAA,IAAa+vB,UAAA,IAAcsB,MAAA,SAG3B,IAFA,IAAArI,EAAAhpB,EAAA+vB,SAAAsB,MACA5+E,EAAA,GACAlD,EAAA,EAAgBA,EAAAy5E,EAAAl5E,SAAkBP,EAAA,CAClC,IAAAoC,EAAAq3E,EAAAz5E,GACAoC,EAAA2/E,OAAAtmD,IAIAr5B,EAAAmwD,KAAAhtD,MAAA,aACArC,EAAAiD,KAAA+oF,GAAA9sF,IACA,CACA,OAAAc,EAAAkD,KAAA,GACA,CAqNAopF,CAAAlxC,EAAAxwB,EAAA2N,EAAAg1B,GAAA,GAUA,OATAnpD,EAAA/G,OAAA,GAAAiH,EAAArB,KAAA,UAAAmB,EAAA,YAGAA,EAAAg3C,EA9CA,SAAAA,EAAAxwB,GACA,IAAAwwB,EAAA,iBACA,IAAAhC,EAAAkB,GAAAc,EAAA,SACA8gC,EAAA9gC,EAAA,eAAA8wC,EAAA,EACA5nF,EAAA,GACA82C,EAAA,UAAAA,EAAA,SAAA55C,QAAA,SAAAtC,EAAApC,GACAy7D,GAAAr5D,GACA,IAAAe,IAAAf,EAAAgsD,MACAlvC,EAAA08D,GAAA57E,EAAAoC,GACA0B,EAAA,CAAW,WAAA9D,EAAA,GACXmD,IAAAW,EAAA,YAAAw4D,GAAAp9C,EAAAkvC,QACAhsD,EAAAm5D,SAAAz3D,EAAA,kBACA0D,EAAArB,KAAAsxC,GAAA,cAAA3zC,GACA,GAEA,IADA,IAAAu6C,EAAAl5C,MAAAuE,QAAA40C,GACApZ,EAAAoX,EAAAj4C,EAAAkD,EAAwB29B,GAAAoX,EAAAv8C,EAAAwH,IAAgB29B,EAAA,CAExC,IADA,IAAA4X,EAAA,CAAAwyC,GAAApqD,GAAAoZ,EAAA,cAAApZ,KACA9/B,EAAAk3C,EAAAj4C,EAAAX,EAAyB0B,GAAAk3C,EAAAv8C,EAAA2D,IAAgB0B,EAAA,CACzC,IAAAiF,GAAA,EACA,IAAA+kF,EAAA,EAAeA,GAAAhQ,EAAA7+E,SAAmB6uF,EAClC,KAAAhQ,EAAAgQ,GAAA/qF,EAAAX,EAAA0B,GACAg6E,EAAAgQ,GAAA/qF,EAAAkD,EAAA29B,GACAk6C,EAAAgQ,GAAArvF,EAAA2D,EAAA0B,GACAg6E,EAAAgQ,GAAArvF,EAAAwH,EAAA29B,GAAA,CACAk6C,EAAAgQ,GAAA/qF,EAAAX,GAAA0B,GAAAg6E,EAAAgQ,GAAA/qF,EAAAkD,GAAA29B,IAAA76B,GAAA,GACA,KAFA,CAIA,IAAAA,EAAA,CACA,IAAA65B,EAAA,CAAe38B,EAAA29B,EAAAxhC,EAAA0B,GACfkuD,EAAA9W,GAAAtY,GAAA+X,EAAAoC,GAAAC,EAAApZ,IAAA,IAAA9/B,GAAAk5C,EAAAgV,GACAxW,EAAA32C,KAAAgpF,GAAAlzC,EAAAqX,EAAAhV,EAAAxwB,EAAA2N,EAAAg1B,EAAAvsB,GAHA,CAIA,CACA4Y,EAAA32C,KAAA,UACA22C,EAAAv8C,OAAA,GAAAiH,EAAArB,KAAA22C,EAAA12C,KAAA,IACA,CACA,OAAAoB,EAAApB,KAAA,GACA,CAUAqpF,CAAAnxC,EAAAxwB,GAAA,GACAxmB,EAAA/G,OAAA,GAAAiH,EAAArB,KAAA,UAAAmB,EAAA,YAGAE,EAAArB,KA3NA,SAAAm4C,EAAAxwB,EAAA2N,EAAAg1B,GACA,IAAAnS,EAAA,SACA,IAAA92C,EAAA,GA0CA,GA1BA82C,EAAA,cACA92C,EAAArB,KAAA,eACAm4C,EAAA,YAAAtsC,QAAAxK,EAAArB,KAAAsxC,GAAA,eAA8D,WAAA6G,EAAA,YAAAtsC,UAC9DssC,EAAA,YAAA69B,QAAA30E,EAAArB,KAAAsxC,GAAA,eAA8D,WAAA6G,EAAA,YAAA69B,UAC9D30E,EAAArB,KAAAsxC,GAAA,oBACA,WAAA6G,EAAA,YAAA49B,QAAA,OACA,SAAA59B,EAAA,YAAA/wB,MAAA,MACA,UAAA+wB,EAAA,YAAA29B,OAAA,MACA,QAAA39B,EAAA,YAAAnzB,KAAA,UAEA3jB,EAAArB,KAAA,iBAgBAsqD,GAAAA,EAAA+vB,UAAA/vB,EAAA+vB,SAAAtiC,QAAAuS,EAAA+vB,SAAAtiC,OAAAziB,GAEA,GAAAg1B,EAAA+vB,SAAAtiC,OAAAziB,GAAAurD,OAAAx/E,EAAArB,KAAAsxC,GAAA,aAAAgZ,EAAA+vB,SAAAtiC,OAAAziB,GAAAurD,OAAA,yCACA,CAEA,QAAAhnF,EAAA,EAAkBA,EAAAy7B,KAASg1B,EAAA+vB,SAAAtiC,OAAAl+C,IAAAywD,EAAA+vB,SAAAtiC,OAAAl+C,GAAAgnF,UAAAhnF,GAC3BA,GAAAy7B,GAAAj0B,EAAArB,KAAA,cACA,CAqDA,UAhDAsqD,GAAA,IAAc+vB,UAAA,IAAcQ,OAAA,YAAmBE,KAAA15E,EAAArB,KAAA,yBA2B/Cm4C,EAAA,cACA92C,EAAArB,KAAAoxC,GAAA,2BACA+G,EAAA,YAAAoxC,SAAAloF,EAAArB,KAAAoxC,GAAA,0BACA+G,EAAA,YAAAqxC,WAAAnoF,EAAArB,KAAAoxC,GAAA,4BACA,MAAA+G,EAAA,YAAAsxC,mBAAAtxC,EAAA,YAAAsxC,kBACA,MAAAtxC,EAAA,YAAAuxC,qBAAAvxC,EAAA,YAAAuxC,qBAAAroF,EAAArB,KAAAoxC,GAAA,oCADA/vC,EAAArB,KAAAoxC,GAAA,kCAEA,CACA,mCACA,kCACA,+BACA,oCACA,iCACA,6CACA,oCACA,iCACA,qBACA,6BACA,uCACA7yC,QAAA,SAAAlD,GAAyB88C,EAAA,YAAA98C,EAAA,KAAAgG,EAAArB,KAAA,IAAA3E,EAAA,YAGzB,GAAAgG,EAAAjH,OAAA,GACAk3C,GAAA,mBAAAjwC,EAAApB,KAAA,KAAmD+9C,MAAA5L,IACnD,CAiHAu3C,CAAAxxC,EAAAxwB,EAAA2N,EAAAg1B,IAEAjpD,EAAApB,KAAA,GACA,CACA,SAAA2pF,GAAAt/B,EAAA3iC,GACAA,IAAAA,EAAA,IACA2iC,EAAAh6B,MAAAg6B,EAAAh6B,IAAAA,EAAA2J,aACAqwB,EAAAh6B,MACAC,EAAAD,GAAiBA,EAAA4J,WAAAowB,EAAAh6B,KAEjB3I,EAAAuuD,OAAApqC,EAAAwe,EAAAh6B,KAAmC3I,EAAAuuD,OAAA5rB,EAAAh6B,IAAA,UACnC3I,EAAAwuD,IAAA7rB,EAAAh6B,IACA3I,EAAAogD,QAAA,GACAkO,GAAAtuD,EAAAogD,QAAA,GAAiC,CAAGmO,OAAA,CAAQ2T,QAAA,MAE5C,IAAAnwF,EAAA,GACAA,EAAAsG,KApSA,SAAAsqD,EAAA3iC,GACA,IAAAtmB,EAAA,GAKA,OAHAipD,EAAAtH,OAAA3hD,EAAArB,KA13XA,SAAAgjD,EAAAr7B,GACA,IAAAtmB,EAAA,GAgBA,OAfA7E,EAAAmlD,IAAA7jD,IAAA,SAAA4gB,GACA,QAAA7kB,EAAA,EAAiBA,EAAAwmD,GAAAjmD,SAAuBP,EAAA,GAAAwmD,GAAAxmD,GAAA,IAAA6kB,EAAA,OAAA2hC,GAAAxmD,GACxC,IAAAA,EAAA,EAAaA,EAAA8mD,GAAAvmD,SAAsBP,EAAA,GAAA8mD,GAAA9mD,GAAA,IAAA6kB,EAAA,OAAAiiC,GAAA9mD,GACnC,MAAA6kB,CACA,GAAEngB,QAAA,SAAAwa,GACF,SAAAiqC,EAAAjqC,EAAA,KACA,IAAA2F,EAAAiJ,GAAAA,EAAAq7B,OAAA,MAAAr7B,EAAAq7B,MAAAjqC,EAAA,IAAA4O,EAAAq7B,MAAAjqC,EAAA,IAAAiqC,EAAAjqC,EAAA,IAEA,SADAA,EAAA,KACA2F,EAAA,IAAA5Z,KAAA4Z,GAAA8yB,cAAApvC,QAAA,eAEA,iBAAAsc,EAAAA,EAAApjB,OAAAojB,IACA,IAAAA,IAAA,IAAAA,EAAuCA,EAAAA,EAAA,QACvCA,aAAA5Z,OAAA4Z,EAAA,IAAA5Z,KAAA4Z,GAAA8yB,cAAApvC,QAAA,cACAf,EAAArB,KAAAoxC,GAAAuQ,GAAA5oC,EAAA,KAAAA,EAAA,GAAA2F,GARA,CASA,GACA4yB,GAAA,qBAAAjwC,EAAApB,KAAA,KAAqD+9C,MAAA5L,IACrD,CAw2XA03C,CAAAx/B,EAAAtH,MAAAr7B,IAEA2iC,EAAAq6B,WAAAtjF,EAAArB,KAz2XA,SAAAgjD,EAAA2hC,GACA,IAAAoF,EAAA,4BACAt3D,EAAA,2BACApxB,EAAA,GAyBA,OAxBA2hD,GAAAxmD,EAAAwmD,GAAAzkD,QAAA,SAAAZ,GACA,GAAAlB,OAAAkG,UAAAoH,eAAA3M,KAAA4lD,EAAArlD,GAAA,CACA,QAAA9D,EAAA,EAAiBA,EAAAwmD,GAAAjmD,SAAuBP,EAAA,GAAA8D,GAAA0iD,GAAAxmD,GAAA,UACxC,IAAAA,EAAA,EAAaA,EAAA8mD,GAAAvmD,SAAsBP,EAAA,GAAA8D,GAAAgjD,GAAA9mD,GAAA,UACnC,IAAAA,EAAA,EAAaA,EAAAkwF,EAAA3vF,SAAsBP,EAAA,GAAA8D,GAAAosF,EAAAlwF,GAAA,OAEnC,IAAA6kB,EAAAskC,EAAArlD,GACAwD,EAAA,SACA,iBAAAud,GAA6Bvd,EAAA,QAAaud,EAAApjB,OAAAojB,KAC1C,IAAAA,IAAA,IAAAA,GAAuCvd,EAAA,UAAeud,EAAAA,EAAA,SACtDA,EAAApjB,OAAAojB,GACArd,EAAArB,KAAAsxC,GAAA3B,GAAAhyC,GAAA+gB,EAAA,CAAwC,QAAAvd,IAVxC,CAWA,GACAwjF,GAAAnoF,EAAAmoF,GAAApmF,QAAA,SAAAZ,GACA,GAAAlB,OAAAkG,UAAAoH,eAAA3M,KAAAunF,EAAAhnF,MACAqlD,IAAAvmD,OAAAkG,UAAAoH,eAAA3M,KAAA4lD,EAAArlD,IAAA,CACA,IAAA+gB,EAAAimE,EAAAhnF,GACAwD,EAAA,SACA,iBAAAud,GAA6Bvd,EAAA,QAAaud,EAAApjB,OAAAojB,KAC1C,IAAAA,IAAA,IAAAA,GAAuCvd,EAAA,UAAeud,EAAAA,EAAA,SACtDA,aAAA5Z,MAA+B3D,EAAA,cAAmBud,EAAAA,EAAA8yB,eAClD9yB,EAAApjB,OAAAojB,GACArd,EAAArB,KAAAsxC,GAAA3B,GAAAhyC,GAAA+gB,EAAA,CAAwC,QAAAvd,IAPxC,CAQA,GACA,IAAAsxB,EAAA,WAAA2f,GAAA,KAAA/wC,EAAApB,KAAA,SAAAwyB,EAAA,GACA,CA40XAu3D,CAAA1/B,EAAAtH,MAAAsH,EAAAq6B,YACAtjF,EAAApB,KAAA,GACA,CA6RAgqF,CAAA3/B,EAAA3iC,IACAjuB,EAAAsG,KAzRA,IA0RAtG,EAAAsG,KAAA,IACAtG,EAAAsG,KAAA,IACA,QAAAnG,EAAA,EAAgBA,EAAAywD,EAAAxS,WAAA19C,SAA0BP,EAC1CH,EAAAsG,KAAAsxC,GAAA,YAAA83C,GAAAvvF,EAAA8tB,EAAA2iC,GAAA,CAA6D,UAAA5a,GAAA4a,EAAAxS,WAAAj+C,OAG7D,OAFAH,EAAA,GA3RA,SAAA4wD,EAAA3iC,GAEA,IAAAg2B,EAAA,oEAQA,OAPAh2B,EAAAogD,QAAAxpE,QAAA,SAAA2oE,EAAA10D,GACA,IAAAotB,EAAA,GACAA,EAAA5/B,KAAAsxC,GAAA,qBAAgD,YAAA5B,GAAApf,EAAA0J,OAAAktC,EAAAzvB,cAEhD,IAAAp2C,EAAA,CAAW,gBAAAmR,IACXmrC,EAAA39C,KAAAsxC,GAAA,QAAA1R,EAAA3/B,KAAA,IAAAoB,GACA,GACAiwC,GAAA,SAAAqM,EAAA19C,KAAA,IACA,CAgRAiqF,CAAA5/B,EAAA3iC,GACAjuB,EAAA,GA/QA,SAAA4wD,GACA,MAAAA,GAAA,IAAa+vB,UAAA,IAAcsB,MAAA,SAG3B,IAFA,IAAArI,EAAAhpB,EAAA+vB,SAAAsB,MACA5+E,EAAA,GACAlD,EAAA,EAAgBA,EAAAy5E,EAAAl5E,SAAkBP,EAAA,CAClC,IAAAoC,EAAAq3E,EAAAz5E,GACA,MAAAoC,EAAA2/E,QACA3/E,EAAAmwD,KAAAhtD,MAAA,aACArC,EAAAiD,KAAA+oF,GAAA9sF,IACA,CACA,OAAAq1C,GAAA,QAAAv0C,EAAAkD,KAAA,IACA,CAoQAkqF,CAAA7/B,GACAjc,GAAAiD,GAAA,WAAA53C,EAAAuG,KAAA,KACA+9C,MAAA5L,GACA,UAAAA,GACA,UAAAA,GACA,WAAAA,GACA,WAlicA,4CAmicA,aAhicA,mCAkicA,CAmCA,SAAAg4C,GAAArrD,EAAA1wB,EAAAjU,EAAAutB,GACA,IAAA7nB,EAAA1F,EACAg2B,EAAA,GACA12B,EAAA2U,EAAAnR,MAAAmR,EAAAvO,EAAAuO,EAAAvO,EAAAA,GACA,GAAA6nB,GAAAA,EAAA3tB,KAAA2tB,EAAA3tB,IAAAqwF,QAAA3wF,EAAAU,OAAA,SAAA2kC,EAAA9iC,GACA,+GAEA,kBACA,MACA,QACA0rB,EAAA3tB,IAAAqwF,OAAA3wF,GAEA02B,EAAApwB,KAAAtG,GACA2U,EAAAvO,GAAAA,EAGA,IAFA,IAAAqmB,EAAAmkE,GAAAh4C,GAAAjkC,EAAAA,EAAAvO,IACA4U,EAAA,EACA,MAAAyR,GAAA,aAAAA,EAAAlqB,EAAAiB,MAAA,MACA4C,EAAAwyC,GAAAjkC,EAAAA,EAAAvO,EAAA,GACA4U,EAAArG,EAAAvO,EAAA,EACA,eAAAqmB,EAAAlqB,EAAAyY,GAAA,EACA,eAAAyR,EAAAlqB,EAAAiB,MAAA,QACAwX,GAAA,IAEAhb,EAAA2U,EAAAnR,MAAAwX,EAAArG,EAAAvO,EAAA,EAAAA,GACAswB,EAAApwB,KAAAtG,GACA2U,EAAAvO,GAAA,EAAAA,EACAqmB,EAAAmkE,GAAAh4C,GAAAjkC,EAAAA,EAAAvO,IAEA,IAAA2D,EAAA0sB,EAAAC,GACAuL,GAAAl4B,EAAA,GACA,IAAA8mF,EAAA,EAAa9mF,EAAA2iB,KAAA,GACb,QAAAlsB,EAAA,EAAgBA,EAAAk2B,EAAAh2B,SAAiBF,EAAOuJ,EAAA2iB,KAAApmB,KAAAuqF,GAAiBA,GAAAn6D,EAAAl2B,GAAAE,OACzD,GAAAqJ,EAAArJ,OAAAA,EAAA,oBAAA2kC,GAAAA,EAAA9iC,GAAA,qBAAAwH,EAAArJ,OAAA,MAAAA,EACA,OAAA2kC,EAAAthC,EAAAgG,EAAAA,EAAArJ,OAAAutB,EACA,CAEA,SAAA6iE,GAAAzxE,EAAA4O,EAAAmL,GACA,SAAA/Z,EAAA5X,GACA4X,EAAAy+B,GAAA,CACA,IAAA8+B,EAAA,EACA,IACAA,EAAAv9D,EAAA+1B,GAAA/1B,EAAAy+B,GAAAC,UAAA,EACA9vB,EAAA8wC,SAAA1/C,EAAA+1B,EAAAxe,EAAA0J,OAAAs8C,GACA,CAAG,MAAA18E,GAAW,GAAA+tB,EAAAupB,IAAA,MAAAt3C,CAAA,CACd,IAAA+tB,IAAA,IAAAA,EAAA6wC,SAAA,IACA,MAAAz/C,EAAA5X,EAAoB4X,EAAA/b,EAAA+b,EAAA/b,GAAAu6C,GAAAx+B,EAAAgT,GACpB,IAAAuqD,GAAA,WAAAA,EACA,MAAAv9D,EAAA5X,GACA,EAAA4X,EAAAgT,KAAAhT,EAAAgT,EAAAhT,EAAA/b,EAAAszB,EAAAmD,aAAA1a,EAAAgT,GACAhT,EAAA/b,EAAAszB,EAAA2E,aAAAlc,EAAAgT,GAEAhT,EAAA/b,EAAAszB,EAAA4E,SAAAnc,EAAAgT,GAEAhT,EAAA/b,EAAAszB,EAAAoE,OAAA4hD,EAAAv9D,EAAAgT,EAAA,CAAoC+G,WAAAA,EAAA4G,OAAA/R,GAAAA,EAAA+R,QACpC,CAAG,MAAA9/B,GAAW,GAAA+tB,EAAAupB,IAAA,MAAAt3C,CAAA,CACd,GAAA+tB,EAAAkxB,WAAAy9B,GAAA,KAAAv9D,EAAA5X,GAAAmvB,EAAA6I,QAAA7I,EAAA0J,OAAAs8C,IAAAh7E,OAAAg7E,IAAA,CACA,IAAA8L,EAAA9xD,EAAA+B,gBAAAtZ,EAAAgT,GAAqCq2D,IAASrpE,EAAA5X,EAAA,IAAW4X,EAAAgT,EAAA,IAAAjnB,KAAAs9E,EAAA1vD,EAAA0vD,EAAA1jE,EAAA,EAAA0jE,EAAA1oF,EAAA0oF,EAAAzvD,EAAAyvD,EAAAljF,EAAAkjF,EAAAxvD,EAAAwvD,EAAA9gF,GACzD,CAnBA,CAoBA,CAEA,SAAAmpF,GAAA5nE,EAAAsmC,EAAAhoD,GACA,OAAU4qB,EAAAlJ,EAAAsmC,KAAAA,EAAAhoD,EAAAA,EACV,CAqwBA,IAAAupF,GACA,mCADAA,GAEA,mCA8CA,SAAAC,GAAAzqD,EAAAp5B,GAKA,IAAA8jF,EAAAtsC,EAeAusC,EAEAriF,EAhBA,GALA1B,IAAAA,EAAA,IACAgiF,GAAAhiF,GACAmoB,IACAnoB,EAAAioD,UAAAhgC,EAAAjoB,EAAAioD,UAEA7uB,EAAA3B,UAAA,CACA,GAAApD,EAAAkF,KAAAH,EAAA,yBAAA/gC,MAAA,8BACAyrF,EAAAzvD,EAAAkF,KAAAH,EAAA,YACAoe,EAAAnjB,EAAAkF,KAAAH,EAAA,cAAA/E,EAAAkF,KAAAH,EAAA,QACA,KAAE,CACF,OAAAp5B,EAAAd,MACA,aAAAk6B,EAAApQ,EAAAN,EAAA1wB,OAAAohC,IAAgD,MAChD,aAAAA,EAAApQ,EAAAoQ,GAAiC,MACjC,mBACA,YAAAlhC,MAAAuE,QAAA28B,KAAAA,EAAAlhC,MAAA2D,UAAAzF,MAAAE,KAAA8iC,IAEAvE,GAAAuE,EAAA,GACAoe,EAAA,CAAQt7C,QAAAk9B,EACR,CAKA,GADA0qD,GA36BA,SAAAlyE,GACA,IAAAqT,EAAA,GACA1qB,EAAAqX,EAAA1V,QAOA,GALA3B,EAAAvB,EAAA,GAEAisB,EAAA++D,aAAAzpF,EAAAu6B,WAAA,gBACA7P,EAAAg/D,oBA7saA,SAAA1pF,GAAgD,OAAA66C,GAAA76C,EAAA,GA6sahD2pF,CAAA3pF,GAEAA,EAAAjH,OAAAiH,EAAAvB,GAAA,SAAAisB,EAEA,IAAArN,EAAArd,EAAAu6B,WAAA,GACA,GAAAld,GAAAA,EAAA,KACArd,EAAAvB,GAAA,EAASisB,EAAAk/D,UAAA5pF,EAAAu6B,WAAA,gBAETv6B,EAAAjH,OAAAiH,EAAAvB,GAAA,GAEA,cADA4e,EAAArd,EAAAu6B,WAAA,MAEA7P,EAAAm/D,uBAvtaA,SAAA7pF,GAAmD,OAAA66C,GAAA76C,EAAA,GAutanD8pF,CAAA9pF,GAGA,IADAqd,EAAArd,EAAAu6B,WAAA,KACAld,EAAA,KACArd,EAAAvB,GAAA,EAASisB,EAAAq/D,UAAA/pF,EAAAu6B,WAAA,cACT,CAo5BAyvD,CAAAT,GACA9jF,EAAA8hF,YAAA9hF,EAAA6hF,WAAAkC,EAAA,CAA4D,MAC5D,CACA,IAAAp4D,EAAAh3B,EAAA,iBACA,GAAA6iD,GAAAA,EAAAt7C,QAAA6nF,EA70BA,SAAAx8E,EAAAvH,GACA,IAUAwkF,EAAAp1D,EAAAq1D,EAAAC,EAAAC,EAGAC,EACAC,EA8DAnmB,EA5EAlb,EAAA,CAAY3iC,KAAA,IACZowB,EAAA,GAEAh7C,EAAA+J,EAAAoxC,MAAA,MACA0zC,EAAA,GACAz1C,EAAA,CAAgB,EAChB01C,EAAA,KACAxtB,EAAA,GACAytB,EAAA,GACAC,EAAA,GACAC,EAAA,GACAnY,EAAA,GACAG,EAAA,GAGAiY,EAAA,GACAC,EAAA,GACA7R,EAAA,CAAmBtiC,OAAA,GAAAmoC,QAAA,CAAoBptD,UAAA,GAAe+nD,MAAA,MAAcmM,EAAA,GACpEmF,EAAA,SAAA/lB,GACA,OAAAA,EAAA,EAAAxpB,GAAAwpB,GACAA,EAAA,IAAA8lB,EAAA9lB,EAAA,IACAxpB,GAAAwpB,EACA,EAUAgmB,EAAA,SAAAt2C,EAAAu2C,EAAAvlF,GACA,KAAAwlF,EAAA,GACAxlF,EAAAqoD,WAAArZ,EAAA10C,GAAA0F,EAAAqoD,WAAA,CAUA,GATAroD,EAAA6mD,YAAA0+B,EAAA70C,IAAA60C,EAAA70C,GAAA36C,MAZA,SAAAi5C,EAAAu2C,EAAAvlF,GACA,IAIA3F,EAJAorF,EAAAF,EAAA70C,GAAA36C,KACA0vF,GAAAA,EAAA9lB,aAAA3/D,GAAAA,EAAA6mD,aACA0+B,EAAAnuF,EAAA,CAAc,EACdmuF,EAAAnuF,EAAAuoE,YAAA8lB,EAAA9lB,aAEAtlE,EAAAqhE,GAAA2pB,EAAAI,EAAAC,aAA4CH,EAAAnuF,EAAAyoE,QAAA,CAAkB1qB,IAAA96C,KAC9DA,EAAAqhE,GAAA2pB,EAAAI,EAAAE,aAA4CJ,EAAAnuF,EAAAwoE,QAAA,CAAkBzqB,IAAA96C,IAC9D,CAIAurF,CAAA52C,EAAAu2C,EAAAvlF,UACAulF,EAAAljC,YAAoBkjC,EAAA70C,GACpB8zC,EAAAx1C,EACAk2C,EAAA31C,GAAAP,GACAK,GAAAA,EAAAj4C,GAAAi4C,EAAAv8C,IAAAu8C,EAAA,CAA8Cj4C,EAAA,CAAGkD,EAAA,EAAA7D,EAAA,GAAQ3D,EAAA,CAAIwH,EAAA,EAAA7D,EAAA,KAC7Du4C,EAAA10C,EAAA+0C,EAAAj4C,EAAAkD,IAAA+0C,EAAAj4C,EAAAkD,EAAA00C,EAAA10C,GACA00C,EAAAv4C,EAAA44C,EAAAj4C,EAAAX,IAAA44C,EAAAj4C,EAAAX,EAAAu4C,EAAAv4C,GACAu4C,EAAA10C,EAAA,EAAA+0C,EAAAv8C,EAAAwH,IAAA+0C,EAAAv8C,EAAAwH,EAAA00C,EAAA10C,EAAA,GACA00C,EAAAv4C,EAAA,EAAA44C,EAAAv8C,EAAA2D,IAAA44C,EAAAv8C,EAAA2D,EAAAu4C,EAAAv4C,EAAA,GACAuJ,EAAA0yE,aAAA6S,EAAA5uF,EACA,QAAAkvF,EAAA,EAAoBA,EAAA3Y,EAAA55E,SAAqBuyF,EACzC,KAAA3Y,EAAA2Y,GAAA,GAAAzuF,EAAAX,EAAAu4C,EAAAv4C,GAAAy2E,EAAA2Y,GAAA,GAAAzuF,EAAAkD,EAAA00C,EAAA10C,GACA4yE,EAAA2Y,GAAA,GAAA/yF,EAAA2D,EAAAu4C,EAAAv4C,GAAAy2E,EAAA2Y,GAAA,GAAA/yF,EAAAwH,EAAA00C,EAAA10C,GAAA,CACAirF,EAAAttF,EAAAm4C,GAAA88B,EAAA2Y,GAAA,IACA3Y,EAAA2Y,GAAA,GAAAzuF,EAAAX,GAAAu4C,EAAAv4C,GAAAy2E,EAAA2Y,GAAA,GAAAzuF,EAAAkD,GAAA00C,EAAA10C,UAAAirF,EAAA5uF,EACA4uF,EAAA5uF,IAAA4uF,EAAA5uF,EAAA,GAAAs1E,GAAAiB,EAAA2Y,GAAA,GAAAx2C,EAAAL,EAAA08B,EAAA7qD,IACA,KAJA,CAQA7gB,EAAAoxC,OACAn7C,EAAA+4C,EAAA10C,KAAArE,EAAA+4C,EAAA10C,GAAA,IACArE,EAAA+4C,EAAA10C,GAAA00C,EAAAv4C,GAAA8uF,GACKtvF,EAAAivF,GAAAK,CAxBL,CA0BA,EACA1kE,EAAA,CACA3tB,KAAA,EACAiyD,MAAA,EACAsN,OAAA,GACAsa,QAAAA,EACAG,OAAAA,EACA4Y,QAAA,GACAC,SAAA,GACA52C,KAAA,EACA8Y,SAAA,EACA+9B,UAAA,EACAn/B,aAAA7mD,KAAAA,EAAA6mD,WACAzc,MAAApqC,KAAAA,EAAAimF,KAEAjmF,EAAAw6D,WAAA35C,EAAA25C,SAAAx6D,EAAAw6D,UAEA,IAAAya,EAAA,GACAwN,EAAA,GACAj1B,EAAA,GAAAD,EAAA,GAGA4tB,GAAA,EACAzP,EAAA,GACAA,EAAA16B,WAAAnwB,EAAA4xC,OACAiZ,EAAAqB,QAAAlsD,EAAAksD,QACArB,EAAAwB,OAAArsD,EAAAqsD,OACAxB,EAAAc,MAAA,GACAd,EAAAC,IAAA,GACA,IAIAua,EAJAC,EAAA,GACAX,EAAA,EACAY,EAAA,EAAAC,EAAA,GACAC,EAAA,GAIAzlE,EAAAonC,SAAA,KACA//B,EAAA,MAEA,IADA,IAAAq+D,GAAA,EACAh/E,EAAAvO,EAAAuO,EAAAjU,OAAA,IACA,IAAA8D,EAAAmQ,EAAAvO,EACAwtF,EAAAj/E,EAAAutB,WAAA,GACA,OAAA0xD,GAAA,QAAAL,EAAA,MACA,IAAA7yF,EAAAiU,EAAAvO,IAAAuO,EAAAjU,OAAA,EAAAiU,EAAAutB,WAAA,GACAmD,EAAAurD,GAAAgD,GAGA,GAAAvuD,GAAAA,EAAAthC,EAAA,CACA,GAAAqJ,EAAA6hF,YACA,gBAAAsE,GAAA,gBAAAluD,EAAA9iC,EAAA,MAGA,GADAgxF,EAAAluD,EAAA9iC,EACA,IAAA8iC,EAAA39B,GAAA,IAAA29B,EAAA39B,EAAA,CACA,IAAA8vE,EAAA7iE,EAAAutB,WAAA,GACA,GADiCxhC,GAAA,GACjCutB,EAAA3tB,KAAAk3E,IAAAoc,KAAA,IAAApc,IAAA,EAAAA,GAAA,KAAAoc,EAAA,UAAAnuF,MAAA,gBAAA+xE,EAAA,KAAAoc,GACA,IAAAvuD,EAAA39B,IACAiN,EAAAvO,GAAA,GAAmB1F,GAAA,GAEnB,CAEA,IAAAyoB,EAAA,CAAgB,EAChBA,EAAA,QAAAkc,EAAA9iC,EAAA8iC,EAAAthC,EAAA4Q,EAAAjU,EAAAutB,GACAyiE,GAAArrD,EAAA1wB,EAAAjU,EAAAutB,GACA,IAAAu+D,EAAAnnD,EAAA9iC,EACA,MAAAqwF,GAAA,OAAApG,EAAA,SAEA,OAAAA,GAEA,eACA57B,EAAA3iC,KAAA4lE,SAAAlT,EAAA6F,QAAAptD,SAAAjQ,EAAoD,MACpD,mBAAAynC,EAAA3iC,KAAA6lE,cAAA,EAAsD,MACtD,eAGA,GAFA7lE,EAAA3tB,MAAAqU,EAAAvO,EAAA,GACA6nB,EAAA3tB,IAAA6oB,GACA/b,EAAAw6D,SAAA,UAAAniE,MAAA,8BACA,SAAA0jB,EAAA28C,MAAA,UAAArgE,MAAA,iCACA,IAAA0jB,EAAA28C,MAAA,UAAArgE,MAAA,yBACA,MACA,kBAAAwoB,EAAAklE,SAAAhqE,EAA6C,MAC7C,kBAcA,eACA,eACA,eACA,kBAUA,eASA,aACA,cACA,qBACA,YASA,YA0BA,wCAzEA,eACA,IAAA4qE,EAAAzgD,OAAAnqB,GAEA,OAAA4qE,GACA,WAAAA,EAAA,KAAkC,MAClC,WAAAA,EAAA,IAAkC,MAClC,WAAAA,EAAA,KAEAz+D,EAAArH,EAAAonC,SAAA0+B,GACAJ,GAAA,EACA,MACA,cAAA1lE,EAAAilE,QAAA/pE,EAAwC,MACxC,iBAAA8E,EAAAmlE,UAAAjqE,EAA6C,MAK7C,iBACA,gBACA,gBACA,eACA,eACA,oBACA,qBACAynC,EAAA3iC,KAAAu+D,GAAArjE,EAAwB,MACxB,kBAAA8E,EAAA+lE,YAAA7qE,EAAgD,MAEhD,2BAAAynC,EAAA3iC,KAAAgmE,SAAA9qE,EAAyD,MACzD,aACAA,EAAA+qE,UAAA7wF,EAAA,mBACA8lB,EAAAgrE,UAAA9wF,EAAA,cAAAA,EAAA,iBAA8D09E,OAAA,GAC9D53D,EAAAirE,UAAA/wF,EAAA,cAAAA,EAAA,iBAA8DqqB,MAAA,GAC9D,MACA,SACA6kE,EAAAjsF,KAAA6iB,GAAoB,MAMpB,cACA2vD,EAAAxyE,KAAA,CAAA6iB,IACA2vD,EAAAA,EAAAp4E,OAAA,GAAAq4E,IAAA,GACA,MACA,iBACAD,EAAAA,EAAAp4E,OAAA,GAAA4F,KAAA6iB,GACA,MAEA,UACAmqE,EAAA,CACA5gC,KAAAvpC,EAAAupC,KACAyvB,IAAA9I,GAAAlwD,EAAA8pC,KAAAxW,EAAA,KAAAq8B,EAAA7qD,IAEA9E,EAAA4pC,KAAA,IAAAugC,EAAApR,MAAA/4D,EAAA4pC,KAAA,GACA+lB,EAAAc,MAAAtzE,KAAAgtF,GACAxa,EAAA,KAAwBA,EAAA,MAAkBA,EAAA,GAAAC,IAAA,IAC1CD,EAAAA,EAAAp4E,OAAA,GAAA4F,KAAA6iB,GACA,yBAAAA,EAAAupC,MAAAvpC,EAAA4pC,KAAA,GACA5pC,EAAA8pC,MAAA9pC,EAAA8pC,KAAA,IAAA9pC,EAAA8pC,KAAA,oBAAA9pC,EAAA8pC,KAAA,WACAygC,EAAAvqE,EAAA4pC,KAAA,IAAyCU,IAAAjW,GAAAr0B,EAAA8pC,KAAA,eACzC,MACA,kBAAAhlC,EAAAomE,YAAAlrE,EAAgD,MAChD,kBACA,GAAA2vD,EAAAp4E,SAAgCo4E,EAAA,MAAkBA,EAAA,GAAAC,IAAA,IAClDD,EAAAA,EAAAp4E,OAAA,GAAAq4E,IAAAD,EAAAA,EAAAp4E,OAAA,GAAAq4E,IAAAn5D,OAAAuJ,GAAwF2vD,EAAAC,IAAAD,EAAAC,IAAAn5D,OAAAuJ,GAAyC,MACjI,cAEA,GAAA8E,EAAAsuB,KAAA,QACA,MAAA+2C,IAAAA,EAAAjM,QAAAl+D,EAAA,IACA,MAEA,cAAA9lB,EAAA,YAAA8lB,EAA2C,MAC3C,mBAAAA,GAAA8E,EAAAupB,KAAAxK,QAAAC,MAAA,sBAAA9jB,GAA2F,MAG3F,kBACA+oE,EAAA/oE,EAAAxT,KAAAwT,EACA8E,EAAA4xC,OAAAv5D,KAAA6iB,EAAA1Z,MACM,MACN,UACA,KAAAmjF,EAAA,MACA,GAAAn2C,EAAAv8C,EAAA,CACA,GAAAu8C,EAAAv8C,EAAAwH,EAAA,GAAA+0C,EAAAv8C,EAAA2D,EAAA,GAGA,GAFA44C,EAAAv8C,EAAAwH,IAAoB+0C,EAAAv8C,EAAA2D,IACpBR,EAAA,QAAAm6C,GAAAf,GACArvC,EAAAqoD,WAAAroD,EAAAqoD,WAAAhZ,EAAAv8C,EAAAwH,EAAA,CACA,IAAA4sF,EAAA73C,EAAAv8C,EAAAwH,EACA+0C,EAAAv8C,EAAAwH,EAAA0F,EAAAqoD,UAAA,EACApyD,EAAA,YAAAA,EAAA,QACAA,EAAA,QAAAm6C,GAAAf,GACAA,EAAAv8C,EAAAwH,EAAA4sF,CACA,CACA73C,EAAAv8C,EAAAwH,IAAoB+0C,EAAAv8C,EAAA2D,GACpB,CACAw+E,EAAA3hF,OAAA,IAAA2C,EAAA,WAAAg/E,GACAwN,EAAAnvF,OAAA,IAAA2C,EAAA,YAAAwsF,GACAj1B,EAAAl6D,OAAA,IAAA2C,EAAA,SAAAu3D,GACAD,EAAAj6D,OAAA,IAAA2C,EAAA,SAAAs3D,GACAgmB,EAAAtiC,OAAA/3C,KAAAgnF,EACA,CACA,KAAA8E,EAAAC,EAAAhvF,EAA0Cg7C,EAAA+zC,GAAA/uF,EAC1CA,EAAA+J,EAAAoxC,MAAA,MACM,MACN,UAiBA,GAhBA,IAAAvwB,EAAAsuB,OAAAtuB,EAAAsuB,KAAA,CACA,IACA,MACA,QACMq3C,IAAA,CACN,MACA,MACA,OACA,OACA,OACA,IACA,KACMzqE,EAAAunC,UAAA,GACNziC,EAAAsmE,UAAA,GAAAprE,EAAAunC,QACA,GAAAvnC,EAAAunC,SAAA,MAAAvnC,EAAA0V,KAAgD5Q,EAAAsuB,KAAA,EAAeo3C,GAAA,EAAsBr+D,EAAArH,EAAAonC,SAAA,QACrF,GAAApnC,EAAAsuB,MAAA,GAAApzB,EAAAunC,SAAA,IAAAvnC,EAAA0V,KAAA5Q,EAAAsuB,KAAA,GACAq2C,IAAA,MAKA,GAJAvvF,EAAA+J,EAAAoxC,MAAA,MAEAvwB,EAAAsuB,KAAA,IAAAo3C,IAA2CA,GAAA,EAAsBr+D,EAAArH,EAAAonC,SAAAjoD,EAAAioD,UAAA,OAEjEpnC,EAAAsuB,KAAA,MAAApzB,EAAAunC,SAAA,MAAAvnC,EAAA0V,GAAA,CACA,KAAAuzD,IAAAA,EAAA,UACA31C,EAAA,CAAej4C,EAAA,CAAGkD,EAAA,EAAA7D,EAAA,GAAQ3D,EAAA,CAAIwH,EAAA,EAAA7D,EAAA,IAE9B,IAAA2wF,GAAA,CAAqB7+E,IAAAhB,EAAAvO,EAAA1F,EAAA+O,KAAA2iF,GACrBF,EAAAsC,GAAA7+E,KAAA6+E,GACAvmE,EAAA4xC,OAAAv5D,KAAA8rF,EACA,MACAA,GAAAF,EAAA1tF,IAAA,CAAwCiL,KAAA,KAAQA,KAChD,IAAA0Z,EAAA0V,KAAAx7B,EAAA,kBACA,IAAA8lB,EAAA0V,KAAAx7B,EAAA,kBACAg/E,EAAA,GACAwN,EAAA,GACA5hE,EAAAqsD,OAAAA,EAAA,GACA1f,EAAA,GAAmBD,EAAA,GAEnB4tB,GAAA,EACA+E,EAAA,CAAgBnG,QAAA+K,EAAA1tF,IAAA,CAAuBusD,GAAA,IAAKA,GAAAthD,KAAA2iF,GACtC,MAEN,2CACA,SAAA/uF,EAAA,WAAA+J,EAAAoxC,OAAAn7C,EAAA8lB,EAAAzhB,IAAA,IAAAyhB,EAAAtlB,GAAAR,EAAAs5C,GAAA,CAA8F94C,EAAAslB,EAAAtlB,EAAA6D,EAAAyhB,EAAAzhB,SAAiByhB,EAAAtlB,EAC/GmuF,EAAA,CAAkBviC,KAAAtmC,EAAAsmC,KAAA3R,GAAAy0C,EAAAppE,EAAAsmC,OAAA,GAAqCp9B,EAAAlJ,EAAAA,IAAA1hB,EAAA,KACvD+rF,EAAA,IAAAxB,EAAA58C,EAAAq+C,EAAAzB,EAAAviC,MAAA,OACAqhC,GAAAkB,EAAA5kF,EAAAwjD,EAAA3iC,KAAA4lE,UACAnB,EAAA,CAAc7uF,EAAAslB,EAAAtlB,EAAA6D,EAAAyhB,EAAAzhB,GAAiBsqF,EAAA5kF,GACzB,MACN,cACA4kF,EAAA,CAAkBviC,KAAAtmC,EAAAsmC,KAAA3R,GAAAy0C,EAAAppE,EAAAsmC,MAAAp9B,EAAAlJ,EAAAA,IAAA1hB,EAAA0hB,EAAA1hB,GAClB+rF,EAAA,IAAAxB,EAAA58C,EAAAq+C,EAAAzB,EAAAviC,MAAA,OACAqhC,GAAAkB,EAAA5kF,EAAAwjD,EAAA3iC,KAAA4lE,UACAnB,EAAA,CAAc7uF,EAAAslB,EAAAtlB,EAAA6D,EAAAyhB,EAAAzhB,GAAiBsqF,EAAA5kF,GACzB,MACN,SACA4kF,EAAA,CAAkBviC,KAAAtmC,EAAAsmC,KAAA3R,GAAAy0C,EAAAppE,EAAAsmC,MAAAp9B,EAAAlJ,EAAAsrE,MAAAhtF,EAAA,KAClB+rF,EAAA,IAAAxB,EAAA58C,EAAAq+C,EAAAzB,EAAAviC,MAAA,OACAqhC,GAAAkB,EAAA5kF,EAAAwjD,EAAA3iC,KAAA4lE,UACAnB,EAAA,CAAc7uF,EAAAslB,EAAAtlB,EAAA6D,EAAAyhB,EAAAzhB,GAAiBsqF,EAAA5kF,GACzB,MACN,YACA,QAAA5M,GAAA2oB,EAAAtlB,EAAwBrD,IAAA2oB,EAAA5jB,IAAY/E,GAAA,CACpC,IAAAivD,GAAAtmC,EAAAurE,MAAAl0F,GAAA2oB,EAAAtlB,GAAA,GACAmuF,EAAA,CAAkBviC,KAAAA,GAAA3R,GAAAy0C,EAAA9iC,IAAAp9B,EAAAlJ,EAAAurE,MAAAl0F,GAAA2oB,EAAAtlB,GAAA,GAAA4D,EAAA,KAClB+rF,EAAA,IAAAxB,EAAA58C,EAAAq+C,EAAAzB,EAAAviC,MAAA,OACAqhC,GAAAkB,EAAA5kF,EAAAwjD,EAAA3iC,KAAA4lE,UACAnB,EAAA,CAAe7uF,EAAArD,GAAAkH,EAAAyhB,EAAAzhB,GAAasqF,EAAA5kF,EAC5B,CACM,MACN,cACA,aAAA+b,EAAAA,IAAA,CAA+BgpE,EAAAhpE,EAAoB,MAGnD,IAFA6oE,EAAAjB,GAAA5nE,EAAAA,IAAAA,EAAAizB,KAAAqT,KAAAtmC,EAAAvjB,KACAk4C,GAAAy0C,EAAAP,EAAAviC,MACAriD,EAAA0yE,YAAA,CACA,IAAAvpB,GAAAptC,EAAAkyC,QACA,GAAA9E,IAAAA,GAAA,IAAAA,GAAA,iBAAAA,GAAA,UACA,IAAAo+B,GAAAp+B,GAAA,YAAAq+B,GAAAr+B,GAAA,YACAs+B,GAAAl4C,GAAA,CAA8Bj1C,EAAAitF,GAAA9wF,EAAA+wF,KAC9Bza,EAAA0a,IAAA7C,EAAAjuF,EAAA,GAAAs1E,GAAAlwD,EAAAkyC,QAAA5e,EAAAtzB,EAAAizB,KAAA08B,EAAA7qD,GACA+jE,EAAA3sF,IAAA+H,EAAAoxC,OAAAn7C,EAAAsxF,KAAA,IAAAC,IAAAvxF,EAAAwxF,MAAA,IAA+ExvF,CAC/E,MAAQ2sF,EAAAjuF,EAAA,GAAAs1E,GAAAlwD,EAAAkyC,QAAA5e,EAAAtzB,EAAAizB,KAAA08B,EAAA7qD,EACR,CACAulE,EAAA,IAAAxB,EAAA58C,EAAAq+C,EAAAzB,EAAAviC,MAAA,OACAqhC,GAAAkB,EAAA5kF,EAAAwjD,EAAA3iC,KAAA4lE,UACAnB,EAAAvpE,EAAAizB,KAAA41C,EAAA5kF,GACA+kF,EAAAhpE,EACM,MACN,aACA,IAAAgpE,EAWO,UAAA1sF,MAAA,iCAVP0sF,EAAAhpE,IAAAA,GACA6oE,EAAAjB,GAAA5nE,EAAAgpE,EAAA/1C,KAAAqT,KAAA,MACA3R,GAAAy0C,EAAAP,EAAAviC,MACAriD,EAAA0yE,cACAkS,EAAAjuF,EAAA,GAAAs1E,GAAA8Y,EAAA92B,QAAA5e,EAAA01C,EAAA/1C,KAAA08B,EAAA7qD,IAEAulE,EAAA,IAAAxB,EAAA58C,EAAAq+C,EAAAzB,EAAAviC,MAAA,OACAqhC,GAAAkB,EAAA5kF,EAAAwjD,EAAA3iC,KAAA4lE,UACAnB,EAAAP,EAAA/1C,KAAA41C,EAAA5kF,GACA+kF,EAAA,KAEM,MACN,YACA7X,EAAAh0E,KAAA6iB,GACA,IAAA2rE,GAAAn4C,GAAAxzB,EAAA,GAAA3kB,GAEA,GADAg4B,EAAApvB,EAAAoxC,OAAAn7C,EAAA8lB,EAAA,GAAA3kB,EAAAkD,IAAA,IAAAyhB,EAAA,GAAA3kB,EAAAX,GAAAR,EAAAyxF,IACA1nF,EAAA0yE,aAAAtjD,EAAA,CACA,IAAA21D,EAAA,MACA,IAAA2C,KAAAt4D,EAAA,MACAA,EAAAz4B,EAAA,GAAAs1E,GAAAlwD,EAAA,GAAAszB,EAAAtzB,EAAA,GAAA2vD,EAAA7qD,GACAuO,EAAAn3B,EAAAm4C,GAAAr0B,EAAA,GACA,CACM,MACN,cACA,IAAA/b,EAAA0yE,YAAA,MACA,GAAAwS,EAAA,CAEA,IAAAH,EAAA,MACAhY,EAAAx9B,GAAAw1C,EAAA/1C,OAAAjzB,EAAA,KACAqT,EAAApvB,EAAAoxC,OAAAn7C,EAAA8uF,EAAA/1C,KAAA10C,IAAA,IAAAyqF,EAAA/1C,KAAAv4C,GAAAR,EAAAs5C,GAAAw1C,EAAA/1C,SACA,IAAar4C,EAAA,GAAAs1E,GAAAlwD,EAAA,GAAAszB,EAAAm1C,EAAA9Y,EAAA7qD,EACb,CACM,MACN,eACA+jE,EAAAjB,GAAApsB,EAAAx7C,EAAA4rE,MAAAttF,EAAA0hB,EAAAsmC,KAAA,KACAkV,EAAAx7C,EAAA4rE,MAAAhiE,IAAAi/D,EAAAj/D,EAAA4xC,EAAAx7C,EAAA4rE,MAAAhiE,GACAi/D,EAAAl0C,GAAAy0C,EAAAP,EAAAviC,MACA+jC,EAAA,IAAAxB,EAAA58C,EAAAq+C,EAAAzB,EAAAviC,MAAA,OACAqhC,GAAAkB,EAAA5kF,EAAAwjD,EAAA3iC,KAAA4lE,UACAnB,EAAA,CAAc7uF,EAAAslB,EAAAtlB,EAAA6D,EAAAyhB,EAAAzhB,GAAiBsqF,EAAA5kF,GAC/B,MACA,YAAAA,EAAA8xC,aACA8yC,EAAA,CAAkBviC,KAAAtmC,EAAAsmC,KAAA3R,GAAAy0C,EAAAppE,EAAAsmC,MAAAhoD,EAAA,KAClB+rF,EAAA,IAAAxB,EAAA58C,EAAAq+C,EAAAzB,EAAAviC,MAAA,OACAqhC,GAAAkB,EAAA5kF,EAAAwjD,EAAA3iC,KAAA4lE,UACAnB,EAAA,CAAc7uF,EAAAslB,EAAAtlB,EAAA6D,EAAAyhB,EAAAzhB,GAAiBsqF,EAAA5kF,IACzB,MACN,kBAAAA,EAAA8xC,WACA,QAAA81C,GAAA7rE,EAAAtlB,EAAyBmxF,IAAA7rE,EAAA5jB,IAAayvF,GAAA,CACtC,IAAAC,GAAA9rE,EAAAsmC,KAAAulC,GAAA7rE,EAAAtlB,GACAmuF,EAAA,CAAkBviC,KAAAwlC,GAAAn3C,GAAAy0C,EAAA0C,IAAAxtF,EAAA,KAClB+rF,EAAA,IAAAxB,EAAA58C,EAAAq+C,EAAAzB,EAAAviC,MAAA,OACAqhC,GAAAkB,EAAA5kF,EAAAwjD,EAAA3iC,KAAA4lE,UACAnB,EAAA,CAAe7uF,EAAAmxF,GAAAttF,EAAAyhB,EAAAzhB,GAAcsqF,EAAA5kF,EAC7B,CACM,MACN,cACA,4BACA4kF,EAAAjB,GAAA5nE,EAAAA,IAAAA,EAAAsmC,KAAA,MACA3R,GAAAy0C,EAAAP,EAAAviC,MACA+jC,EAAA,IAAAxB,EAAA58C,EAAAq+C,EAAAzB,EAAAviC,MAAA,OACAqhC,GAAAkB,EAAA5kF,EAAAwjD,EAAA3iC,KAAA4lE,UACAnB,EAAA,CAAc7uF,EAAAslB,EAAAtlB,EAAA6D,EAAAyhB,EAAAzhB,GAAiBsqF,EAAA5kF,GAC/B,MAEA,iBACA,IAAAwlF,IAAAn2C,EAAAtzB,GACM,MACN,UACAw7C,EAAAx7C,EACM,MACN,aACA,MAAA8E,EAAAsuB,KAAA,CACAk3C,EAAAD,KAAArqE,EAAA,GACA,QAAA+rE,GAAA,EAAyBA,GAAA1B,EAAA,KAAwB58D,EAAA0J,OAAA40D,KAAA/rE,EAAA,KAAA+rE,IACjDA,IAAA,KAAAt+D,EAAAtpB,KAAA6b,EAAA,GAAAqqE,EAAA,IACA,MACA58D,EAAAtpB,KAAA6b,EAAA,GAAAA,EAAA,IACM,MACN,kBACAsqE,EAAAD,KAAArqE,EACA,QAAAgsE,GAAA,EAAwBA,GAAA3B,EAAA,KAAwB58D,EAAA0J,OAAA60D,KAAAhsE,IAAAgsE,IAChDA,IAAA,KAAAv+D,EAAAtpB,KAAA6b,EAAAqqE,EAAA,KACM,MAEN,iBAAAnR,EAAAA,EAAAziE,OAAAuJ,GAAoD,MAEpD,UAAA0mE,EAAA1mE,EAAAisE,IAAA,IAAAnnE,EAAAonE,QAAAlsE,EAA0D,MAC1D,UAAA8E,EAAAonE,QAAAC,IAAAnsE,EAAwC,MACxC,aAAA8E,EAAAonE,QAAAE,OAAApsE,EAA8C,MAE9C,YACA,IAAA4oE,EAAA5oE,EAAA,GAAA3kB,EAAAkD,EAA4BqqF,GAAA5oE,EAAA,GAAAjpB,EAAAwH,IAAoBqqF,EAChD,IAAAD,EAAA3oE,EAAA,GAAA3kB,EAAAX,EAA6BiuF,GAAA3oE,EAAA,GAAAjpB,EAAA2D,IAAoBiuF,GACjDt1D,EAAApvB,EAAAoxC,OAAAn7C,EAAA0uF,IAAA,IAAAD,GAAAzuF,EAAAs5C,GAAA,CAAqE94C,EAAAiuF,EAAApqF,EAAAqqF,QACrEv1D,EAAAp2B,EAAA+iB,EAAA,IAEM,MACN,mBACA,IAAA4oE,EAAA5oE,EAAA,GAAA3kB,EAAAkD,EAA4BqqF,GAAA5oE,EAAA,GAAAjpB,EAAAwH,IAAoBqqF,EAChD,IAAAD,EAAA3oE,EAAA,GAAA3kB,EAAAX,EAA6BiuF,GAAA3oE,EAAA,GAAAjpB,EAAA2D,IAAoBiuF,GACjDt1D,EAAApvB,EAAAoxC,OAAAn7C,EAAA0uF,IAAA,IAAAD,GAAAzuF,EAAAs5C,GAAA,CAAqE94C,EAAAiuF,EAAApqF,EAAAqqF,OACrEv1D,EAAAp2B,IAAAo2B,EAAAp2B,EAAA2tD,QAAA5qC,EAAA,IAEM,MAGN,WACA,GAAA8E,EAAAsuB,MAAA,GAAAtuB,EAAAsuB,MAAA,QACA/f,EAAApvB,EAAAoxC,OAAAn7C,EAAA8lB,EAAA,GAAAzhB,IAAA,IAAAyhB,EAAA,GAAAtlB,GAAAR,EAAAs5C,GAAAxzB,EAAA,KACA,IAAAqsE,GAAA3F,EAAA1mE,EAAA,IACAqT,IACApvB,EAAAoxC,OACAn7C,EAAA8lB,EAAA,GAAAzhB,KAAArE,EAAA8lB,EAAA,GAAAzhB,GAAA,IACA80B,EAAAn5B,EAAA8lB,EAAA,GAAAzhB,GAAAyhB,EAAA,GAAAtlB,GAAA,CAAwC4D,EAAA,MAExC+0B,EAAAn5B,EAAAs5C,GAAAxzB,EAAA,MAAyC1hB,EAAA,KAEzCg1C,EAAAv8C,EAAAwH,EAAA2O,KAAAX,IAAA+mC,EAAAv8C,EAAAwH,EAAAyhB,EAAA,GAAAzhB,GACA+0C,EAAAj4C,EAAAkD,EAAA2O,KAAAC,IAAAmmC,EAAAj4C,EAAAkD,EAAAyhB,EAAA,GAAAzhB,GACA+0C,EAAAv8C,EAAA2D,EAAAwS,KAAAX,IAAA+mC,EAAAv8C,EAAA2D,EAAAslB,EAAA,GAAAtlB,GACA44C,EAAAj4C,EAAAX,EAAAwS,KAAAC,IAAAmmC,EAAAj4C,EAAAX,EAAAslB,EAAA,GAAAtlB,IAEA24B,EAAA34B,IAAA24B,EAAA34B,EAAA,IACAguF,EAAA,CAAapnD,EAAAthB,EAAA,GAAA1hB,EAAA+tF,GAAAF,IAAA7tF,GACb+0B,EAAA34B,EAAAyC,KAAAurF,GACM,MAEN,eAAAxsD,EAAA9iC,GACA,iBAgCA,gBAaA,aACA,aACA,cACA,cACA,UACA,UACA,eACA,aACA,cACA,aACA,WACA,WACA,aACA,YACA,eACA,WACA,YACA,WACA,WACA,WACA,eACA,WACA,8BACA,6CAEA,eACA,aACA,oCACA,WACA,YACA,YACA,eAIA,sBACA,iBAGA,gBAGA,YACA,kBACA,iBACA,wBAGA,iBACA,WACA,cACA,aACA,cACA,eACA,WACA,eACA,eACA,aACA,aACA,YACA,YAGA,cAGA,WAGA,gBAGA,kBACA,gBACA,gBAEA,UACA,UAEA,UAGA,eAGA,uBAKA,iBAGA,aAOA,kBAIA,WACA,mBAEA,oBAGA,oEAGA,oBAGA,yCAGA,YACA,mBACA,iBAEA,gBACA,gBAGA,iBACA,6CAGA,iBACA,YACA,0DACA,0BAEA,qDACA,wDACA,WApLA,kBAAwC,MAFxC,YAAAwvE,GAAAwgB,EAAAppE,EAAAsmC,MAAAtmC,EAAAssE,KAAwD,MAGxD,uBAAAtsE,EAAA,GAAiD,MAEjD,cACA,IAAA8E,EAAAgmC,WAAA,MACA,KAAA9qC,EAAAjpB,GAAAipB,EAAA3kB,GACAo2D,EAAAzxC,EAAAjpB,KAAA,CAA2BquD,MAAAplC,EAAA7lB,EAAA,IAAAuY,MAAAsN,EAAAtN,OAAA,EAAA6/C,UAAA,EAAAvyC,EAAA8C,QAC3Bs8D,IAAqBA,GAAA,EAAgBxe,GAAA5gD,EAAA7lB,EAAA,MACrCs4D,GAAAhB,EAAAzxC,EAAAjpB,EAAA,IAEM,MACN,UACA,IAAAm/E,GAAA,GACA,MAAAl2D,EAAAtN,QAA6B8+C,EAAAxxC,EAAAzhB,GAAA23E,GAAyBA,GAAAxjE,MAAAsN,EAAAtN,OACtDsN,EAAAuyC,SAAsBf,EAAAxxC,EAAAzhB,GAAA23E,GAAyBA,GAAA3jB,QAAA,GAC/CvyC,EAAA0yC,MACAlB,EAAAxxC,EAAAzhB,GAAA23E,GACAA,GAAAxjB,IAAA1yC,EAAA0yC,IAA4BwjB,GAAAvjB,IAAAC,GAAA5yC,EAAA0yC,MAEtB,MAEN,iBACA,kBACA,gBACA,mBACAx4D,EAAA,aAAA44E,GAAA54E,EAAA,gBACAA,EAAA,YAAAmpF,EAAAhpF,MAAA,MAAAuQ,eAAAoV,EACA,MAIA,YACA9lB,EAAA,aAAA44E,GAAA54E,EAAA,gBACAA,EAAA,YAAA8O,OAAAgX,EAAAhX,OACA9O,EAAA,YAAAi5E,OAAAnzD,EAAAmzD,OACA,MAEA,cAEAnzD,EAAAk4D,MAAAV,EAAAQ,MAAA,GAAAE,KAAA,GACA,MA0BA,cAAA4Q,EAAA9oE,EAAmC,MAQnC,cAAAqpE,EAAArpE,EAAmC,MACnC,YAAA2iD,EAAA3iD,EAAgC,MA+DhC,eACAipE,EACA9E,EAAAzP,SAAA10D,GAAAmkE,EAAA79E,KADAkxE,EAAA6F,QAAA3I,SAAA10D,GAAA,eAEM,MAwCN,eAAAkc,EAAA9iC,GAEA,UACA,sBACA,gCACA,uBACA,qCACA,eACA,uGACA,kCACA,qFACA,gCACA,mDACA,4CACA,4CACA,eACA,0CACA,yBACA,mCACA,wBACA,mCACA,kCACA,8BACA,cACA,gCAGA,qBACA,WAGA,iBACA,UACA,iBAGA,gBACA,iBACA,qBACA,eACA,sBAGA,YACA,aACA,eAGA,+CACA,aAGA,iBACA,sCACA,mBACA,qBACA,WACA,eAGA,uBACA,iEAEA,8BAGA,6CACA,oDAEA,mDAGA,mCAGA,yCAEA,eAAA8iC,EAAA9iC,GAEA,wGAGA,yDACA,0CACA,mBACA,oDAGA,yDACA,6DACA,WACA,yDACA,8BACA,aACA,cACA,kCACA,iBACA,uBACA,WAAA6K,EAAAoqC,IAAA,4BAAAnS,EAAA9iC,KAEA,MAAIoS,EAAAvO,GAAA1F,CACJ,CAkBA,OAjBAkwD,EAAAxS,WAAAt7C,EAAAovF,GAAA/qD,KAAA,SAAAsD,EAAA1gC,GAAoD,OAAAupC,OAAA7I,GAAA6I,OAAAvpC,EAAA,GAA+B3F,IAAA,SAAAzC,GAAkB,OAAAuwF,EAAAvwF,GAAA8N,IAAA,GACrGrC,EAAA6hF,aAAAr+B,EAAAvS,OAAAA,IACAuS,EAAAxS,WAAA19C,QAAA2xF,EAAA,SACAzhC,EAAAxS,WAAA93C,KAAA,UAEAsqD,EAAAvS,SAAAuS,EAAAvS,OAAA,OAAAg0C,IAEGzhC,EAAAyhC,SAAAA,EACHzhC,EAAAvS,QAAAq1C,EAAA7uF,QAAA,SAAA6C,EAAAvH,GAAuDywD,EAAAvS,OAAAuS,EAAAxS,WAAAj+C,IAAA,eAAAuH,CAAA,GACvDkpD,EAAAwtB,QAAAzZ,EACA/T,EAAAh6B,IAAAA,EAAA2J,YACAtS,EAAA3tB,MAAAswD,EAAA8kC,WAAAznE,EAAA3tB,KACAwrE,IAAAlb,EAAAwgB,OAAAtF,GACAlb,EAAA+kC,SAAA,QACA3uF,IAAAirF,IAAArhC,EAAA+kC,SAAAC,QAAA3D,GACAnZ,EAAAc,MAAAl5E,OAAA,IAAAigF,EAAAsB,MAAAnJ,EAAAc,OACAhpB,EAAA+vB,SAAAA,EACA/vB,CACA,CA8EAilC,CAAAjxC,EAAAt7C,QAAA8D,QAEA,IAAA0B,EAAA2yB,EAAAkF,KAAAH,EAAA,wBAAA13B,EAAAxF,QAAA6nF,EAAA7xB,GAAA1J,YAAA9mD,EAAAxF,SAAA8D,EAAAd,KAAAysB,EAAA3rB,QAEA,MAAA0B,EAAA2yB,EAAAkF,KAAAH,EAAA,yBAAA13B,EAAAxF,QAEA,MAAAwF,EAAA2yB,EAAAkF,KAAAH,EAAA,SAAA13B,EAAAxF,QAAA,IAAA7D,MAAA,oCACA,IAAAA,MAAA,+BAHA0rF,EAAA7xB,GAAA1J,YAAA9mD,EAAAxF,SAAA8D,EAAAd,KAAAysB,EAAA3rB,GAGA,CACAA,EAAA0oF,SAAAtvD,EAAA3B,WAAApD,EAAAkF,KAAAH,EAAA,+BAAA2qD,EAAA1Q,OA7xOA,SAAAj6C,GACA,IAAAuvD,EAAAt0D,EAAAt8B,MAAAmqC,QAAA,CAAiCxuC,KAAA,MAMjC,OALA0lC,EAAA3B,UAAAhgC,QAAA,SAAAwa,EAAAlf,GACA,SAAAkf,EAAA7b,OAAA,IAAA6b,EAAA3Z,MAAA,qBACA,IAAAswF,EAAA32E,EAAA3W,QAAA,eAAAA,QAAA,gCACA+4B,EAAAt8B,MAAAspC,QAAAsnD,EAAAC,EAAAxvD,EAAA5B,UAAAzkC,GAAAmJ,QAFA,CAGA,GACAm4B,EAAA0N,MAAA4mD,EACA,CAqxOAE,CAAAzvD,GACA,CAEA,IAAA6gB,EAAA,GAMA,OALA7gB,EAAA3B,WAlFA,SAAA2B,EAAA6gB,EAAA1/C,GAEA,IAAAuuF,EAAAz0D,EAAAkF,KAAAH,EAAA,+BACA,GAAA0vD,GAAAA,EAAAvrF,KAAA,MACA,IAAAwrF,EAAAzpC,GAAAwpC,EAAAvzC,GAAAquC,IACA,QAAAhxF,KAAAm2F,EAAA9uC,EAAArnD,GAAAm2F,EAAAn2F,EACA,CAAG,MAAAE,GAAU,GAAAyH,EAAA6vC,IAAA,MAAAt3C,CAAkB,CAG/B,IAAAk2F,EAAA30D,EAAAkF,KAAAH,EAAA,uBACA,GAAA4vD,GAAAA,EAAAzrF,KAAA,MACA,IAAA0rF,EAAA3pC,GAAA0pC,EAAAvzC,GAAAmuC,IACA,QAAAxsF,KAAA6xF,EAAA,MAAAhvC,EAAA7iD,KAAA6iD,EAAA7iD,GAAA6xF,EAAA7xF,GACA,CAAG,MAAAtE,GAAU,GAAAyH,EAAA6vC,IAAA,MAAAt3C,CAAkB,CAE/BmnD,EAAAivC,cAAAjvC,EAAAkvC,gBACArvC,GAAAG,EAAAivC,aAAAjvC,EAAAkvC,cAAAlvC,EAAA1/C,UACA0/C,EAAAivC,oBAA6BjvC,EAAAkvC,cAE7B,CA+DAC,CAAAhwD,EAAA6gB,EAAAj6C,GAEA+jF,EAAA7nC,MAAA6nC,EAAAlG,UAAA5jC,EACAj6C,EAAAqpF,YAAAtF,EAAA3qD,IAAAA,GAEA2qD,CACA,CAuBA,IAAA11C,GAAA,CACA,GAAUl5C,EAAA,YAAAwB,EA5iIV,SAAAZ,EAAAzC,GACA,IAAA00C,EAAA,CAAY,EACZhT,EAAAj/B,EAAAiD,EAAA1F,EACA00C,EAAA1tC,EAAAvE,EAAA++B,WAAA,GACA/+B,EAAAiD,GAAA,EACA,IAAA6qD,EAAA9tD,EAAA++B,WAAA,GACA/+B,EAAAiD,GAAA,EACA,IAAA6lB,EAAA9oB,EAAA++B,WAAA,GAKA,OAJA/+B,EAAAiD,EAAAg8B,EACA,EAAAnW,IAAAmpB,EAAAv5B,MAAA,EAAAoQ,GACA,GAAAA,IAAAmpB,EAAAsmB,QAAA,GACA,GAAAzvC,IAAAmpB,EAAAymB,IAAA5K,EAAA,IACA7b,CACA,GAgiIA,GAAU7yC,EAAA,eAAAwB,EAr8HV,SAAAZ,GAEA,OADAw9C,GAAAx9C,GAEA,GAm8HA,GAAUZ,EAAA,YAAAwB,EAj1HV,SAAAZ,GAGA,OAFAw9C,GAAAx9C,GACAo+C,GAAAp+C,GACA,IACA,GA80HA,GAAUZ,EAAA,eAAAwB,EA75HV,SAAAZ,GAGA,OAFAw9C,GAAAx9C,GACAA,EAAA++B,WAAA,GACA,IACA,GA05HA,GAAU3/B,EAAA,cAAAwB,EAt7HV,SAAAZ,GAGA,OAFAw9C,GAAAx9C,GACAA,EAAA++B,WAAA,GACA,IACA,GAm7HA,GAAU3/B,EAAA,cAAAwB,EA52HV,SAAAZ,GAGA,OAFAw9C,GAAAx9C,GACA6+C,GAAA7+C,GACA,IACA,GAy2HA,GAAUZ,EAAA,YAAAwB,EA5zHV,SAAAZ,GAGA,OAFAw9C,GAAAx9C,GACAo8C,GAAAp8C,GACA,MACA,GAyzHA,GAAUZ,EAAA,cAAAwB,EAt4HV,SAAAZ,GAGA,OAFAw9C,GAAAx9C,GACAA,EAAA++B,WAAA,GACA,IACA,GAm4HA,GAAU3/B,EAAA,gBAAAwB,EAtvHV,SAAAZ,EAAAzC,EAAAutB,GACA,IAAAjM,EAAA7e,EAAAiD,EAAA1F,EACA07C,EAAAuE,GAAAx9C,GACAi5C,EAAA10C,EAAAumB,EAAA,QACA,IACAtmB,EAAA,CAAAy0C,EADAmD,GAAAp8C,GACA,OACA,GAAA8qB,EAAA6xD,YAAA,CACA38E,EAAAiD,GAAA,EACA,IAAAi1D,EAAA2f,GAAA73E,EAAA6e,EAAA7e,EAAAiD,EAAA6nB,GACAtmB,EAAA,GAAA0xE,GAAAhe,EAAA,EAAAjf,EAAAnuB,EAAA6qD,SAAA7qD,EACA,MACA9qB,EAAAiD,EAAA4b,EACA,OAAAra,CACA,GA0uHA,GAAUpF,EAAA,aAAAwB,EAvwHV,SAAAZ,EAAAzC,EAAAutB,GACA,IAAAjM,EAAA7e,EAAAiD,EAAA1F,EACA07C,EAAAuE,GAAAx9C,GACAi5C,EAAA10C,EAAAumB,EAAA,QACA,IACAtmB,EAAA,CAAAy0C,EADA4F,GAAA7+C,GACA,KACA,GAAA8qB,EAAA6xD,YAAA,CACA38E,EAAAiD,GAAA,EACA,IAAAi1D,EAAA2f,GAAA73E,EAAA6e,EAAA7e,EAAAiD,EAAA6nB,GACAtmB,EAAA,GAAA0xE,GAAAhe,EAAA,EAAAjf,EAAAnuB,EAAA6qD,SAAA7qD,EACA,MACA9qB,EAAAiD,EAAA4b,EACA,OAAAra,CACA,GA2vHA,IAAUpF,EAAA,cAAAwB,EAxyHV,SAAAZ,EAAAzC,EAAAutB,GACA,IAAAjM,EAAA7e,EAAAiD,EAAA1F,EACA07C,EAAAuE,GAAAx9C,GACAi5C,EAAA10C,EAAAumB,EAAA,QACA,IACAtmB,EAAA,CAAAy0C,EADAj5C,EAAA++B,WAAA,GACA,KACA,GAAAjU,EAAA6xD,YAAA,CACA38E,EAAAiD,GAAA,EACA,IAAAi1D,EAAA2f,GAAA73E,EAAA6e,EAAA7e,EAAAiD,EAAA6nB,GACAtmB,EAAA,GAAA0xE,GAAAhe,EAAA,EAAAjf,EAAAnuB,EAAA6qD,SAAA7qD,EACA,MACA9qB,EAAAiD,EAAA4b,EACA,OAAAra,CACA,GA4xHA,IAAUpF,EAAA,eAAAwB,EAzxHV,SAAAZ,EAAAzC,EAAAutB,GACA,IAAAjM,EAAA7e,EAAAiD,EAAA1F,EACA07C,EAAAuE,GAAAx9C,GACAi5C,EAAA10C,EAAAumB,EAAA,QACA,IACAtmB,EAAA,CAAAy0C,EADAj5C,EAAA++B,WAAA,GACA,KACA,GAAAjU,EAAA6xD,YAAA,CACA38E,EAAAiD,GAAA,EACA,IAAAi1D,EAAA2f,GAAA73E,EAAA6e,EAAA7e,EAAAiD,EAAA6nB,GACAtmB,EAAA,GAAA0xE,GAAAhe,EAAA,EAAAjf,EAAAnuB,EAAA6qD,SAAA7qD,EACA,MACA9qB,EAAAiD,EAAA4b,EACA,OAAAra,CACA,GA6wHA,IAAUpF,EAAA,gBAAAwB,EAx8HV,SAAAZ,GAEA,OADA29C,GAAA39C,GAEA,GAs8HA,IAAUZ,EAAA,aAAAwB,EAj1HV,SAAAZ,GAGA,OAFA29C,GAAA39C,GACAo+C,GAAAp+C,GACA,IACA,GA80HA,IAAUZ,EAAA,gBAAAwB,EA75HV,SAAAZ,GAGA,OAFA29C,GAAA39C,GACAA,EAAA++B,WAAA,GACA,IACA,GA05HA,IAAU3/B,EAAA,eAAAwB,EAt7HV,SAAAZ,GAGA,OAFA29C,GAAA39C,GACAA,EAAA++B,WAAA,GACA,IACA,GAm7HA,IAAU3/B,EAAA,eAAAwB,EAAAs/E,IACV,IAAU9gF,EAAA,aAAAwB,EA5zHV,SAAAZ,GAGA,OAFA29C,GAAA39C,GACAo8C,GAAAp8C,GACA,MACA,GAyzHA,IAAUZ,EAAA,eAAAwB,EAt4HV,SAAAZ,GAGA,OAFA29C,GAAA39C,GACAA,EAAA++B,WAAA,GACA,IACA,GAm4HA,IAAU3/B,EAAA,aAAAwB,EAAA+7C,IACV,IAAUv9C,EAAA,kBACV,IAAUA,EAAA,iBACV,IAAUA,EAAA,kBACV,IAAUA,EAAA,gBACV,IAAUA,EAAA,iBACV,IAAUA,EAAA,mBACV,IAAUA,EAAA,gBACV,IAAUA,EAAA,mBACV,IAAUA,EAAA,kBACV,IAAUA,EAAA,mBACV,IAAUA,EAAA,iBACV,IAAUA,EAAA,kBACV,IAAUA,EAAA,oBACV,IAAUA,EAAA,gBACV,IAAUA,EAAA,kBACV,IAAUA,EAAA,eACV,IAAUA,EAAA,aACV,IAAUA,EAAA,cACV,IAAUA,EAAA,YACV,IAAUA,EAAA,UAAAwB,EApgFV,SAAAZ,EAAAzC,EAAAutB,GACA,IAAAjM,EAAA7e,EAAAiD,EAAA1F,EACAyC,EAAAiD,GAAA,EACAjD,EAAAiD,GAAA,EACA,IAAA2sD,EAAA5vD,EAAA++B,WAAA,GACAzyB,EAAA2xC,GAAAj+C,GACAk4D,EAAA4f,GAAA93E,EAAA,EAAA8qB,GACAtiB,EAAAu1C,GAAA/9C,GAOAA,EAAAiD,EAAA4b,EACA,IAAA3e,EAAA,CAAaqvD,KAAAjjD,EAAAinF,IAAAr7B,GAGb,OAFAtI,EAAA,YAAA1vD,EAAA6+E,MAAAnvB,GACApnD,IAAAtI,EAAAgkF,QAAA17E,GACAtI,CACA,GAk/EA,IAAUd,EAAA,oBACV,IAAUA,EAAA,iBACV,IAAUA,EAAA,UAAAwB,EAj8QV,SAAAZ,EAAAzC,EAAAutB,GACA,IAAA5qB,EAAA,CAAc,EAEdA,EAAA8+B,GAAAh/B,EAAA++B,WAAA,MAEA,IAAAgtC,EAvzLA,SAAA/rE,GACA,IAAAnD,EAAAmD,EAAA++B,WAAA,GAYA,OAXA/+B,EAAAiD,IACA,CACAuwF,MAAA,EAAA32F,EACA42F,QAAA,EAAA52F,EACA62F,WAAA,EAAA72F,EACA82F,WAAA,EAAA92F,EACA+2F,SAAA,GAAA/2F,EACAg3F,QAAA,GAAAh3F,EACAi3F,UAAA,GAAAj3F,EACAk3F,QAAA,IAAAl3F,EAGA,CAyyLAm3F,CAAAh0F,GAWA,OAVA+rE,EAAA0nB,UAAAvzF,EAAA+oE,OAAA,GACA8C,EAAA+nB,YAAA5zF,EAAAipE,SAAA,GACA4C,EAAAgoB,UAAA7zF,EAAA6M,OAAA,GACAg/D,EAAA8nB,UAAA3zF,EAAAw/D,OAAA,GACAqM,EAAA6nB,WAAA1zF,EAAAy/D,QAAA,GACAoM,EAAA4nB,aAAAzzF,EAAA0/D,OAAA,GAGA,MADA5/D,EAAA++B,WAAA,KACA7+B,EAAA8oE,KAAA,GAEAhpE,EAAA++B,WAAA,IAEA,OAAA7+B,EAAAkpE,UAAA,cAAyC,MACzC,OAAAlpE,EAAAkpE,UAAA,YAGA,IAAAF,EAAAlpE,EAAA++B,WAAA,GACA,GAAAmqC,IAAAhpE,EAAAgpE,UAAAA,GAEA,IAAApJ,EAAA9/D,EAAA++B,WAAA,GACA+gC,EAAA,IAAA5/D,EAAA4/D,OAAAA,GAEA,IAAAm0B,EAAAj0F,EAAA++B,WAAA,GAMA,OALAk1D,EAAA,IAAA/zF,EAAAgsE,QAAA+nB,GAEAj0F,EAAAiD,IACA/C,EAAA+hC,MAn5LA,SAAAjiC,GACA,IAAAE,EAAA,GAIAg0F,EAHAl0F,EAAA++B,WAAA,KAGA,EAEAh4B,EAAA/G,EAAA++B,WAAA,GACAmgB,EAAAl/C,EAAA++B,WAAA,OACAo1D,EAAAn0F,EAAA++B,WAAA,GACAq1D,EAAAp0F,EAAA++B,WAAA,GACAs1D,EAAAr0F,EAAA++B,WAAA,GAGA,OAFA/+B,EAAAiD,IAEAixF,GACA,OAAAh0F,EAAA8+C,KAAA,EAAwB,MACxB,OACA9+C,EAAA6G,MAAAA,EACA,IAAAwiE,EAAAxpB,GAAAh5C,GAEAwiE,IAAArpE,EAAAk/C,IAAAumB,GAAA4D,IACA,MACA,OAEArpE,EAAAk/C,IAAAumB,GAAA,CAAAwuB,EAAAC,EAAAC,IACA,MACA,OAAAn0F,EAAA++C,MAAAl4C,EAIA,OAFA,GAAAm4C,IAAAh/C,EAAAi/C,KAAAD,EAAA,EAAAA,EAAA,MAAAA,EAAA,OAEAh/C,CACA,CAo3LAo0F,CAAAt0F,GAEAA,EAAA++B,WAAA,IAEA,OAAA7+B,EAAAmpE,OAAA,QAAgC,MAChC,OAAAnpE,EAAAmpE,OAAA,QAKA,OAFAnpE,EAAAoM,KAAA8vC,GAAAp8C,GAEAE,CACA,GAu5QA,IAAUd,EAAA,SAAAwB,EAj9QV,SAAAZ,EAAAzC,GAGA,OAFAyC,EAAA++B,WAAA,GACAqd,GAAAp8C,GAEA,GA88QA,IAAUZ,EAAA,UAAAwB,EAAA2qE,IACV,IAAUnsE,EAAA,YAAAwB,EAAAgrE,IACV,IAAUxsE,EAAA,QAAAwB,EA50QV,SAAAZ,EAAAzC,GACA,IAAA0hC,EAAAj/B,EAAAiD,EAAA1F,EACAg3F,EAAAv0F,EAAA++B,WAAA,GACAy1D,EAAAx0F,EAAA++B,WAAA,GAEA,OADA/+B,EAAAiD,EAAAg8B,EACA,CAASqtB,KAAAioC,EAAA35C,SAAA45C,EACT,GAu0QA,IAAUp1F,EAAA,YACV,IAAUA,EAAA,eACV,IAAUA,EAAA,gBACV,IAAUA,EAAA,UACV,IAAUA,EAAA,eACV,IAAUA,EAAA,aACV,IAAUA,EAAA,eACV,IAAUA,EAAA,aACV,IAAUA,EAAA,oBACV,IAAUA,EAAA,kBACV,IAAUA,EAAA,iBACV,IAAUA,EAAA,UACV,IAAUA,EAAA,aAAAwB,EAAAiwD,IACV,IAAUzxD,EAAA,kBACV,IAAUA,EAAA,oBAAAwB,EArtPV,SAAAZ,GACA,IAAAE,EAAA,GACAA,EAAAlD,EAAAgD,EAAA++B,WAAA,GACA,IAAAka,EAAA,GACAA,EAAA10C,EAAAvE,EAAA++B,WAAA,GACAka,EAAAv4C,EAAAV,EAAA++B,WAAA,GACA7+B,EAAAqE,EAAAi1C,GAAAP,GACA,IAAAnwB,EAAA9oB,EAAA++B,WAAA,GAGA,OAFA,EAAAjW,IAAA5oB,EAAA+C,EAAA,KACA,EAAA6lB,IAAA5oB,EAAAonC,EAAA,KACApnC,CACA,GA2sPA,IAAUd,EAAA,UAAAwB,EA/nHV,WACA,GA+nHA,IAAUxB,EAAA,iBACV,IAAUA,EAAA,iBACV,IAAUA,EAAA,kBACV,IAAUA,EAAA,iBACV,IAAUA,EAAA,kBACV,IAAUA,EAAA,iBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,eAAAwB,EAAAo3C,GAAA97B,EAAA,GACV,KAAU9c,EAAA,cACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBAAAwB,EA5sHV,SAAAZ,GACA,IAAAY,EAAAZ,EAAA++B,WAAA,GAEA,OADA/+B,EAAAiD,GAAA,GACA,CAAUi7E,IAAA,GAAAt9E,EACV,GAysHA,KAAUxB,EAAA,gBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,YAAAwB,EAvjIV,SAAAZ,EAAAzC,GACA,IAAA00C,EAAA,GACArxC,EAAAZ,EAAAA,EAAAiD,GAMA,QANuBjD,EAAAiD,EACvBgvC,EAAA2rC,QAAA,GAAAh9E,GACAqxC,EAAA1nB,OAAA,IAAA3pB,GAEAZ,EAAAiD,GAAA,GACAgvC,EAAA3lC,KAAAuxC,GAAA79C,EAAAzC,EAAA,IACA00C,CACA,GA+iIA,KAAU7yC,EAAA,WAAAwB,EAAAo/E,GAAA9jE,EAAA,IACV,KAAU9c,EAAA,UAAAwB,EArxHV,WACA,GAqxHA,KAAUxB,EAAA,UACV,KAAUA,EAAA,YAAAwB,EAtmFV,SAAAZ,EAAAzC,GACA,IAAAiH,EAAA,CAAY,EACZskB,EAAA9oB,EAAA++B,WAAA,GACAv6B,EAAAiwF,oBAAAz0F,EAAA++B,WAAA,GACA,IAAA21D,EAAAn3F,EAAA,EAAA6+C,GAAAp8C,GAAA,GAiBA,OAhBA00F,EAAAn3F,OAAA,IAAAiH,EAAAk2E,SAAAga,GACAlwF,EAAAmwF,wBAAA,MAAA7rE,GACAtkB,EAAAowF,cAAA,GAAA9rE,GACAtkB,EAAAqwF,sBAAA,KAAA/rE,GACAtkB,EAAAyxB,YAAA,EAAAnN,GACAtkB,EAAAmgF,iBAAA,EAAA77D,GACAtkB,EAAAswF,sBAAA,KAAAhsE,GACAtkB,EAAAuwF,qBAAA,GAAAjsE,GACAtkB,EAAAwwF,gBAAA,KAAAlsE,GACAtkB,EAAAywF,yBAAA,OAAAnsE,GACAtkB,EAAA0wF,0BAAA,IAAApsE,GACAtkB,EAAA2wF,8BAAA,EAAArsE,GACAtkB,EAAA4wF,qBAAA,GAAAtsE,GACAtkB,EAAA6wF,YAAA,8BAAAvsE,GAAA,MACAtkB,EAAA8wF,wBAAA,MAAAxsE,GACAtkB,EAAA+wF,YAAA,6BAAAzsE,GAAA,KACAtkB,CACA,GAilFA,KAAUpF,EAAA,gBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,cAAAwB,EA3nFV,SAAAZ,EAAAzC,GACA,IAAA00C,EAAA,GAKA,OAJAA,EAAA+xC,OAAAhkF,EAAA++B,WAAA,GACAkT,EAAAoyC,OAAArkF,EAAA++B,WAAA,GACAkT,EAAAqyC,SAAApmC,GAAAl+C,EAAAzC,EAAA,GACA00C,EAAA3lC,KAAA8vC,GAAAp8C,GACAiyC,CACA,GAqnFA,KAAU7yC,EAAA,eACV,KAAUA,EAAA,eACV,KAAUA,EAAA,cAAAwB,EAx+SV,SAAAZ,GACA,OAAAA,EAAA++B,WAAA,GAAA/+B,EAAA++B,WAAA,GACA,GAu+SA,KAAU3/B,EAAA,aACV,KAAUA,EAAA,kBAAAwB,EAAA+9C,IACV,KAAUv/C,EAAA,iBACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,aACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,yBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,2BACV,KAAUA,EAAA,eAAAwB,EAAAu/E,IACV,KAAU/gF,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,yBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,6BACV,KAAUA,EAAA,2BACV,KAAUA,EAAA,0BACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,2BACV,KAAUA,EAAA,yBACV,KAAUA,EAAA,yBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,yBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,2BACV,KAAUA,EAAA,yBACV,KAAUA,EAAA,0BACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,2BACV,KAAUA,EAAA,yBACV,KAAUA,EAAA,0BACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,0BACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,eACV,KAAUA,EAAA,aACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,gBAAAwB,EAAAs9C,IACV,KAAU9+C,EAAA,cACV,KAAUA,EAAA,cACV,KAAUA,EAAA,cACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,iBAAAwB,EAAAuvD,IACV,KAAU/wD,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,yBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,UACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,WACV,KAAUA,EAAA,WACV,KAAUA,EAAA,UACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,UACV,KAAUA,EAAA,UACV,KAAUA,EAAA,eACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,aACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,aACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,eACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,aAAAwB,EAjiIV,SAAAZ,EAAAzC,EAAAutB,GACA,IAAAjM,EAAA7e,EAAAiD,EAAA1F,EACAmoF,EAAAhnC,GAAA1+C,GACAw1F,EAAAx1F,EAAA++B,WAAA,GACAv6B,EAAA,CAAAkhF,GACA,GADgBlhF,EAAA,GAAAgxF,EAChB1qE,EAAA6xD,YAAA,CACA,IAAAzkB,EAAA0f,GAAA53E,EAAA6e,EAAA7e,EAAAiD,EAAA6nB,GACAtmB,EAAA,GAAA0zD,CACA,MAAGl4D,EAAAiD,EAAA4b,EACH,OAAAra,CACA,GAwhIA,KAAUpF,EAAA,aAAAwB,EArhIV,SAAAZ,EAAAzC,EAAAutB,GACA,IAAAjM,EAAA7e,EAAAiD,EAAA1F,EAEAiH,EAAA,CADAm6C,GAAA3+C,EAAA,KAEA,GAAA8qB,EAAA6xD,YAAA,CACA,IAAAzkB,EAAA6f,GAAA/3E,EAAA6e,EAAA7e,EAAAiD,EAAA6nB,GACAtmB,EAAA,GAAA0zD,EACAl4D,EAAAiD,EAAA4b,CACA,MAAG7e,EAAAiD,EAAA4b,EACH,OAAAra,CACA,GA4gIA,KAAUpF,EAAA,YACV,KAAUA,EAAA,0BACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,0BACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,yBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,aACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,yBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,iCACV,KAAUA,EAAA,+BACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,WACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,aAAAwB,EAviIV,SAAAZ,GACA,IAAA+4E,EAAA,CAAkB,EAElB,OADAsH,GAAA3+E,QAAA,SAAAZ,GAAqCi4E,EAAAj4E,GAAA+9C,GAAA7+C,EAAA,GACrC+4E,CACA,GAoiIA,KAAU35E,EAAA,mBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,eAAAwB,EAz4IV,WACA,GAy4IA,KAAUxB,EAAA,eACV,KAAUA,EAAA,aACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,YACV,KAAUA,EAAA,eACV,KAAUA,EAAA,aACV,KAAUA,EAAA,WAAAwB,EAloIV,SAAAZ,EAAAzC,GACA,IAAAshB,EAAA7e,EAAAiD,EAAA1F,EACAmoF,EAAA/mC,GAAA3+C,EAAA,IACAwlF,EAAAznC,GAAA/9C,GACAm3C,EAAAiF,GAAAp8C,GACAs/E,EAAAljC,GAAAp8C,GACAy1F,EAAAr5C,GAAAp8C,GACAA,EAAAiD,EAAA4b,EACA,IAAAra,EAAA,CAAWkhF,IAAAA,EAAAF,MAAAA,EAAAruC,IAAAA,EAAAs+C,QAAAA,GAEX,OADAnW,IAAA96E,EAAAosD,QAAA0uB,GACA96E,CACA,GAwnIA,KAAUpF,EAAA,gBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,WACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,aACV,KAAUA,EAAA,UACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,UACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,aACV,KAAUA,EAAA,aACV,KAAUA,EAAA,aACV,KAAUA,EAAA,aACV,KAAUA,EAAA,cACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,0BACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,aAAAwB,EAAAs9C,IACV,KAAU9+C,EAAA,oBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,aACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,YACV,KAAUA,EAAA,YACV,KAAUA,EAAA,yBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,2BACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,yBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,yBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,0BACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,mBAAAwB,EAAAwvE,IACV,KAAUhxE,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,kBAAAwB,EA58PV,SAAAZ,GACA,IAAAE,EAAA,GACAA,EAAAiwE,QAAAnwE,EAAA++B,WAAA,GACA,IAAA2mD,EAAA/mC,GAAA3+C,EAAA,IAIA,OAHAE,EAAAwlF,IAAAA,EAAArkF,EACAnB,EAAAowD,IAAA9W,GAAAksC,EAAArkF,GACArB,EAAAiD,GAAA,GACA/C,CACA,GAq8PA,KAAUd,EAAA,iBACV,KAAUA,EAAA,iBAAAwB,EAAA28C,IACV,KAAUn+C,EAAA,sBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,2BACV,KAAUA,EAAA,cACV,KAAUA,EAAA,yBACV,KAAUA,EAAA,iCACV,KAAUA,EAAA,yBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,YAAAwB,EAviHV,SAAAZ,EAAAzC,GAGA,OAFAyC,EAAAiD,GAAA,GAEA,CAAUqJ,KADV8vC,GAAAp8C,GAEA,GAoiHA,KAAUZ,EAAA,kBACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,0BACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,oBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,iBACV,KAAUA,EAAA,qBACV,KAAUA,EAAA,wBACV,KAAUA,EAAA,yBACV,KAAUA,EAAA,sBACV,KAAUA,EAAA,yBACV,KAAUA,EAAA,eACV,MAAUA,EAAA,gBACV,MAAUA,EAAA,iBACV,MAAUA,EAAA,sBACV,MAAUA,EAAA,oBACV,MAAUA,EAAA,4BACV,MAAUA,EAAA,0BACV,MAAUA,EAAA,2BACV,MAAUA,EAAA,0BACV,MAAUA,EAAA,wBACV,MAAUA,EAAA,yBACV,MAAUA,EAAA,uBACV,MAAUA,EAAA,wBACV,MAAUA,EAAA,cACV,MAAUA,EAAA,aACV,MAAUA,EAAA,wBACV,MAAUA,EAAA,sBACV,MAAUA,EAAA,aACV,MAAUA,EAAA,0BACV,MAAUA,EAAA,wBACV,MAAUA,EAAA,gBACV,MAAUA,EAAA,aACV,MAAUA,EAAA,oBACV,MAAUA,EAAA,mCACV,MAAUA,EAAA,iCACV,MAAUA,EAAA,oBACV,MAAUA,EAAA,kBACV,MAAUA,EAAA,aACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,YAAAwB,EArrIV,WACA,GAqrIA,MAAUxB,EAAA,mBACV,MAAUA,EAAA,cACV,MAAUA,EAAA,sBACV,MAAUA,EAAA,oBACV,MAAUA,EAAA,2BACV,MAAUA,EAAA,yBACV,MAAUA,EAAA,aACV,MAAUA,EAAA,oBACV,MAAUA,EAAA,kBACV,MAAUA,EAAA,oBACV,MAAUA,EAAA,kBACV,MAAUA,EAAA,iBACV,MAAUA,EAAA,eACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,0BACV,MAAUA,EAAA,wBACV,MAAUA,EAAA,yBACV,MAAUA,EAAA,uBACV,MAAUA,EAAA,uBACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,0BACV,MAAUA,EAAA,wBACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,oBACV,MAAUA,EAAA,kBACV,MAAUA,EAAA,kBACV,MAAUA,EAAA,gBACV,MAAUA,EAAA,6BACV,MAAUA,EAAA,+BACV,MAAUA,EAAA,6BACV,MAAUA,EAAA,iCACV,MAAUA,EAAA,+BACV,MAAUA,EAAA,gCACV,MAAUA,EAAA,8BACV,MAAUA,EAAA,+BACV,MAAUA,EAAA,6BACV,MAAUA,EAAA,8BACV,MAAUA,EAAA,4BACV,MAAUA,EAAA,0BACV,MAAUA,EAAA,iCACV,MAAUA,EAAA,2BACV,MAAUA,EAAA,+BACV,MAAUA,EAAA,6BACV,MAAUA,EAAA,2BACV,MAAUA,EAAA,4BACV,MAAUA,EAAA,wBACV,MAAUA,EAAA,2BACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,aACV,MAAUA,EAAA,aACV,MAAUA,EAAA,qCACV,MAAUA,EAAA,mCACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,iBACV,MAAUA,EAAA,eACV,MAAUA,EAAA,kBACV,MAAUA,EAAA,gBACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,iBACV,MAAUA,EAAA,oBACV,MAAUA,EAAA,kBACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,uBACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,yBACV,MAAUA,EAAA,2BACV,MAAUA,EAAA,yBACV,MAAUA,EAAA,oCACV,MAAUA,EAAA,kCACV,MAAUA,EAAA,kCACV,MAAUA,EAAA,gCACV,MAAUA,EAAA,yBACV,MAAUA,EAAA,uBACV,MAAUA,EAAA,0BACV,MAAUA,EAAA,wBACV,MAAUA,EAAA,iBACV,MAAUA,EAAA,wBACV,MAAUA,EAAA,sBACV,MAAUA,EAAA,+BACV,MAAUA,EAAA,6BACV,MAAUA,EAAA,gBACV,MAAUA,EAAA,uBACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,wBACV,MAAUA,EAAA,sBACV,MAAUA,EAAA,sBACV,MAAUA,EAAA,oBACV,MAAUA,EAAA,iBACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,wBACV,MAAUA,EAAA,sBACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,iBACV,MAAUA,EAAA,uBACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,sBACV,MAAUA,EAAA,oBACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,2BACV,MAAUA,EAAA,yBACV,MAAUA,EAAA,YACV,MAAUA,EAAA,kBACV,MAAUA,EAAA,gBACV,MAAUA,EAAA,eACV,MAAUA,EAAA,2BACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,+BACV,MAAUA,EAAA,kCACV,MAAUA,EAAA,gCACV,MAAUA,EAAA,4BACV,MAAUA,EAAA,0BACV,MAAUA,EAAA,wBACV,MAAUA,EAAA,oBACV,MAAUA,EAAA,iCACV,MAAUA,EAAA,oBACV,MAAUA,EAAA,kBACV,MAAUA,EAAA,iBACV,MAAUA,EAAA,eACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,YACV,MAAUA,EAAA,yBACV,MAAUA,EAAA,uBACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,gBACV,MAAUA,EAAA,gCACV,MAAUA,EAAA,8BACV,MAAUA,EAAA,0BACV,MAAUA,EAAA,yBACV,MAAUA,EAAA,4BACV,MAAUA,EAAA,0BACV,MAAUA,EAAA,iBACV,MAAUA,EAAA,sCACV,MAAUA,EAAA,oCACV,MAAUA,EAAA,gCACV,MAAUA,EAAA,4BACV,MAAUA,EAAA,0BACV,MAAUA,EAAA,2BACV,MAAUA,EAAA,yBACV,MAAUA,EAAA,uBACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,sBACV,MAAUA,EAAA,oBACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,aACV,MAAUA,EAAA,yBACV,MAAUA,EAAA,uBACV,MAAUA,EAAA,2BACV,MAAUA,EAAA,mCACV,MAAUA,EAAA,iCACV,MAAUA,EAAA,0BACV,MAAUA,EAAA,wBACV,MAAUA,EAAA,iCACV,MAAUA,EAAA,+BACV,MAAUA,EAAA,YACV,MAAUA,EAAA,kBACV,MAAUA,EAAA,gBACV,MAAUA,EAAA,qCACV,MAAUA,EAAA,2BACV,MAAUA,EAAA,yBACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,wBACV,MAAUA,EAAA,sBACV,MAAUA,EAAA,eACV,MAAUA,EAAA,gBACV,MAAUA,EAAA,kBACV,MAAUA,EAAA,sBACV,MAAUA,EAAA,oBACV,MAAUA,EAAA,gBACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,uBACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,iBACV,MAAUA,EAAA,8BACV,MAAUA,EAAA,4BACV,MAAUA,EAAA,wBACV,MAAUA,EAAA,sBACV,MAAUA,EAAA,oBACV,MAAUA,EAAA,4BACV,MAAUA,EAAA,0BACV,MAAUA,EAAA,yBACV,MAAUA,EAAA,0BACV,MAAUA,EAAA,0BACV,MAAUA,EAAA,aACV,MAAUA,EAAA,8BACV,MAAUA,EAAA,4BACV,MAAUA,EAAA,6BACV,MAAUA,EAAA,2BACV,MAAUA,EAAA,+BACV,MAAUA,EAAA,UACV,MAAUA,EAAA,kBACV,MAAUA,EAAA,wBACV,MAAUA,EAAA,sBACV,MAAUA,EAAA,kBACV,OAAUA,EAAA,KAGV25C,GAAAlK,EAAAyJ,GAAA,KAEAS,GAAA,iBAIA,IAAA00C,GAAA,CAEA,GAAUruF,EAAA,UAAAwB,EAAA02E,IACV,IAAUl4E,EAAA,MAAAwB,EAAA2pD,IACV,IAAUnrD,EAAA,YAAAwB,EAAA6pD,IACV,IAAUrrD,EAAA,WAAAwB,EAAA6pD,IACV,IAAUrrD,EAAA,gBAAAwB,EAAA8nD,IACV,IAAUtpD,EAAA,cAAAwB,EAAA8nD,IACV,IAAUtpD,EAAA,YAAAwB,EAAAi+C,IACV,IAAUz/C,EAAA,WAAAwB,EAAA8nD,IACV,IAAUtpD,EAAA,UAAAwB,EAAA8nD,IACV,IAAUtpD,EAAA,WAAAwB,EAAA6pD,IACV,IAAUrrD,EAAA,SAAAwB,EAAAguD,IACV,IAAUxvD,EAAA,SAAAwB,EAAAguD,IACV,IAAUxvD,EAAA,cAAAwB,EAAAuvD,IACV,IAAU/wD,EAAA,MAAAwB,EAAA6uD,IACV,IAAUrwD,EAAA,aAAAwB,EAAA8nD,IACV,IAAUtpD,EAAA,sBACV,IAAUA,EAAA,wBACV,IAAUA,EAAA,OAAAwB,EAjjZV,SAAA4Q,EAAAjU,EAAAutB,GAEA,OAZA,SAAAtZ,EAAAjU,EAAAutB,GACA,KAAAA,EAAAsuB,KAAA,IACA,IAAAU,EAAAtoC,EAAAutB,WAAA,GAAAkb,EAAAzoC,EAAAutB,WAAA,GACAjW,EAAAtX,EAAAutB,WAAA,GAAA22D,EAAAlkF,EAAAutB,WAAA,GACA42D,EAAAhqC,GAAAn6C,EAAA,EAAAsZ,GAEA,OADAA,EAAAsuB,KAAA,GAAA5nC,EAAAutB,WAAA,GACA,EAAUx6B,EAAAu1C,EAAAp5C,EAAAu5C,GAAY07C,EAAAD,EAAA5sE,EALtB,CAMA,CAKA8sE,CAAApkF,EAAAjU,EAAAutB,EACA,GA+iZA,IAAU1rB,EAAA,aACV,IAAUA,EAAA,WAAAwB,EAAA8nD,IACV,IAAUtpD,EAAA,aAAAwB,EAAAiuD,IACV,IAAUzvD,EAAA,aAAAwB,EAAAi+C,IACV,IAAUz/C,EAAA,cAAAwB,EAAAi+C,IACV,IAAUz/C,EAAA,YAAAwB,EAAAi+C,IACV,IAAUz/C,EAAA,eAAAwB,EAAAi+C,IACV,IAAUz/C,EAAA,cAAAwB,EAAA8nD,IACV,IAAUtpD,EAAA,YAAAwB,EAAA8nD,IACV,IAAUtpD,EAAA,WAAAwB,EA/4TV,SAAA4Q,EAAAjU,EAAAutB,GACA,IAAAtmB,EAAA,CAAYg+C,KAAA13B,EAAAsuB,MAAA,EAAA5nC,EAAAutB,WAAA,MAGZ,OAFAv6B,EAAAg+C,KARA,SAAAhxC,EAAAjU,EAAA65C,GACA,IAAA5yC,EAAA4yC,GAAA,GAAmB5yC,EAAAqxF,KAAArkF,EAAAutB,WAAA,GAA6BvtB,EAAAvO,GAAA,EAChD,IAAAuB,EAAAqxF,KAAArxF,EAAAsxF,KA5HA,SAAAtkF,GACA,IAAAhN,EAAA,GACAq4D,EAAAr4D,EAAAuxF,sBAAA5zB,GAAA3wD,EAAA,GACA,MAAAqrD,EAAAuF,OAAA,GAAAvF,EAAAwF,MAAA,kCAAAxF,EAAAuF,MAAA,MAAAvF,EAAAwF,MAIA,OAHA79D,EAAAy+D,KAAAzxD,EAAAutB,WAAA,IACAv6B,EAAAwxF,kBAAAxkF,EAAAutB,WAAA,IACAv6B,EAAAyxF,sBAAAzkF,EAAAutB,WAAA,IACAv6B,CACA,CAoHA0xF,CAAA1kF,GACAhN,EAAAsxF,KAzIA,SAAAtkF,EAAAjU,GACA,IAAAiH,EAAA,GACAq4D,EAAAr4D,EAAAuxF,sBAAA5zB,GAAA3wD,EAAA,GACA,GADoEjU,GAAA,EACpE,GAAAs/D,EAAAwF,MAAA,UAAA//D,MAAA,oCAAAu6D,EAAAwF,OACA,GAAAxF,EAAAuF,MAAA,GAAAvF,EAAAuF,MAAA,YAAA9/D,MAAA,oCAAAu6D,EAAAuF,OACA59D,EAAAi+D,MAAAjxD,EAAAutB,WAAA,GAA+BxhC,GAAA,EAC/B,IAAAyhC,EAAAxtB,EAAAutB,WAAA,GAGA,OAH8BxhC,GAAA,EAC9BiH,EAAA2xF,iBAAA3zB,GAAAhxD,EAAAwtB,GAAwDzhC,GAAAyhC,EACxDx6B,EAAA4xF,mBAAApzB,GAAAxxD,EAAAjU,GACAiH,CACA,CA+HA6xF,CAAA7kF,EAAAjU,EAEA,CAGA+4F,CAAA9kF,EAAAjU,EAAA,EAAAiH,GAjBA,SAAAgN,EAAAjU,EAAAutB,EAAA5qB,GACA,IAXAukE,EACA8xB,EAAAC,EAUAhyF,EAAA,CAAYsqC,IAAA2b,GAAAj5C,GAAAilF,kBAAAhsC,GAAAj5C,IACZsZ,EAAA25C,WAAAjgE,EAAAkyF,SAAA7yB,GAAA/4C,EAAA25C,WACAvkE,EAAAyiE,MAAAn+D,EAAAiyF,oBAAAjyF,EAAAkyF,SACAx2F,EAAAyiE,QAAAziE,EAAAstF,QAdA/oB,EAcA35C,EAAA25C,SAbA8xB,EAAA,EAAAC,EAAAnyB,GAAAI,GACA,SAAAqxB,GACA,IAAAh5C,EAlBA,SAAA2nB,EAAAqxB,EAAAS,EAAAC,EAAA15C,GAIA,IAAAmoB,EAAA0xB,EACA,IAHA75C,IAAAA,EAAAg5C,GACAU,IAAAA,EAAAnyB,GAeA,KAbAY,EAAA,EAAgBA,GAAA6wB,EAAAv4F,SAAsB0nE,EACtC0xB,EAAAb,EAAA7wB,GAEA0xB,EAAA,MADAA,GAAAH,EAAAD,KACA,EAAAI,GAAA,GACA75C,EAAAmoB,GAAA0xB,IACAJ,EAEA,OAAAz5C,EAAAy5C,EAAAC,EACA,CAKAI,CAAA,EAAAd,EAAAS,EAAAC,GAEA,OADAD,EAAAz5C,EAAA,GACAA,EAAA,EACA,GAUA,CAYA+5C,CAAArlF,EAAAsZ,EAAAsuB,KAAAtuB,EAAAtmB,GACAA,CACA,GA24TA,IAAUpF,EAAA,OAAAwB,EA18ZV,SAAA4Q,EAAAjU,EAAAutB,GACA,IAAAtmB,EAAA,CACAsyF,SAAAtlF,EAAAutB,WAAA,GACAg4D,GAAAvlF,EAAAutB,WAAA,IAEA,OAAAjU,GAAAA,EAAAsuB,MAAA,GACA,aACA,cAAA5nC,EAAAvO,GAAA,EAA+B,MAC/B,QAAAuO,EAAAvO,GAAA,GAGA,OADAuB,EAAA8H,KAAAw+C,GAAAt5C,EAAA,EAAAsZ,GACAtmB,CACA,GA+7ZA,IAAUpF,EAAA,YAAAwB,EAAA6pD,IACV,IAAUrrD,EAAA,YACV,IAAUA,EAAA,UAAAwB,EAv/ZV,SAAA4Q,GAIA,OAAUwlF,IAAA,CAHVxlF,EAAAutB,WAAA,GAAAvtB,EAAAutB,WAAA,IAGUk4D,IAAA,CAHVzlF,EAAAutB,WAAA,GAAAvtB,EAAAutB,WAAA,IAGU0jC,MAFVjxD,EAAAutB,WAAA,GAEUm4D,OAFV1lF,EAAAutB,WAAA,GAGAo4D,SAHA3lF,EAAAutB,WAAA,GAGAq4D,SAFA5lF,EAAAutB,WAAA,GAEAs4D,SAFA7lF,EAAAutB,WAAA,GAGA,GAk/ZA,IAAU3/B,EAAA,SAAAwB,EAAA8nD,IACV,IAAUtpD,EAAA,OAAAwB,EAn9ZV,WACA,GAm9ZA,IAAUxB,EAAA,WAAAwB,EAAA6pD,IACV,IAAUrrD,EAAA,OACV,IAAUA,EAAA,QACV,IAAUA,EAAA,WACV,IAAUA,EAAA,YACV,IAAUA,EAAA,cAAAwB,EAAA6pD,IACV,IAAUrrD,EAAA,OACV,IAAUA,EAAA,OACV,IAAUA,EAAA,eACV,IAAUA,EAAA,cAAAwB,EA3oaV,SAAA4Q,EAAAjU,EAAAutB,GACA,GAAAA,EAAA3tB,IAAkC,OAAlBqU,EAAAvO,GAAA1F,EAAkB,GAClC,IAAA0F,EAAAuO,EAAAvO,EAEAq0F,EAAA3rC,GAAAn6C,EAAA,EAAAsZ,GAEA,OADAtZ,EAAAutB,WAAAxhC,EAAA0F,EAAAuO,EAAAvO,GACAq0F,CACA,GAqoaA,IAAUl4F,EAAA,MAAAwB,EAxjZV,SAAA4Q,EAAAjU,EAAAutB,GACA,GAAAA,GAAAA,EAAAsuB,KAAA,SAsBA,SAAA5nC,EAAAjU,EAAAutB,GACAtZ,EAAAvO,GAAA,EACA,IAAAgqD,EAAAz7C,EAAAutB,WAAA,GACAppB,EAAAnE,EAAAutB,WAAA,GACAgtC,EAAAv6D,EAAAutB,WAAA,GACAvtB,EAAAvO,GAAA,EACAuO,EAAAvO,GAAA,EACAuO,EAAAvO,GAAA,EACAuO,EAAAvO,GAAA,EACAuO,EAAAvO,GAAA,EACAuO,EAAAvO,GAAA,EACAuO,EAAAvO,GAAA,EACAuO,EAAAvO,GAAA,EACAuO,EAAAvO,GAAA,EACAuO,EAAAvO,GAAA,EACA1F,GAAA,GACA,IAAAg6F,EAAA,GAEA,OADAA,EAAAp0F,MAAAqtD,GAAAvD,IAAAjV,IAAAxmC,EAAAjU,EAAAutB,IACA,CAAUmnE,IAAA,CAAAt8E,EAAAs3C,EAAA8e,GAAAra,GAAA6lC,EACV,CAzCAC,CAAAhmF,EAAAjU,EAAAutB,GACA,IAAAmnE,EAAAjlC,GAAAx7C,GACA+lF,EA7pBA,SAAA/lF,EAAAjU,GAGA,IAFA,IAAA0hC,EAAAztB,EAAAvO,EAAA1F,EACAg6F,EAAA,GACA/lF,EAAAvO,EAAAg8B,GAAA,CACA,IAAAyyB,EAAAlgD,EAAAutB,WAAA,GACAvtB,EAAAvO,GAAA,EACA,IACAs0F,EAAAp0F,KAAAgqD,GAAAuE,GAAAlgD,EAAAytB,EAAAztB,EAAAvO,GACA,CAAI,MAAAlG,GAAyB,OAAdyU,EAAAvO,EAAAg8B,EAAcs4D,CAAA,CAC7B,CAEA,OADA/lF,EAAAvO,GAAAg8B,IAAAztB,EAAAvO,EAAAg8B,GACAs4D,CACA,CAipBAE,CAAAjmF,EAAAjU,EAAA,GAAA00F,EAAA,IACA,OAAUA,IAAAA,EAAAvgC,GAAA6lC,EACV,GAojZA,IAAUn4F,EAAA,YACV,IAAUA,EAAA,iBAAAwB,EAAA8nD,IACV,IAAUtpD,EAAA,YACV,IAAUA,EAAA,QACV,IAAUA,EAAA,aAAAwB,EAAA8nD,IACV,KAAUtpD,EAAA,UAAAwB,EAAAiwD,IACV,KAAUzxD,EAAA,OAAAwB,EApxZV,SAAA4Q,GACAA,EAAAvO,GAAA,EACA,IAAA/C,EAAA,CAAAsR,EAAAutB,WAAA,GAAAvtB,EAAAutB,WAAA,IAGA,GAFA,IAAA7+B,EAAA,IAAAA,EAAA,KACA,IAAAA,EAAA,IAAAA,EAAA,KACAA,EAAA,MAAAA,EAAA,eAAAoC,MAAA,gBAAApC,EAAAkD,KAAA,MACA,OAAAlD,CACA,GA8wZA,KAAUd,EAAA,SAAAwB,EAhoaV,SAAA4Q,EAAAjU,EAAAutB,GACA,IAAAhC,EAAAgC,GAAA,GAAAA,EAAAsuB,MAAA,GAAA77C,EAAAiU,EAAAutB,WAAA,IAAAvtB,EAAAvO,GAAA1F,EAAA,GACA,OAAUwzF,QAAA,GAAAjoE,EAAAkoE,OAAA,GAAAloE,EAAAmoE,OAAA,IAAAnoE,EACV,GA8naA,KAAU1pB,EAAA,UAAAwB,EAAA6pD,IACV,KAAUrrD,EAAA,UAAAwB,EAAA8nD,IACV,KAAUtpD,EAAA,UAAAwB,EAAA8nD,IACV,KAAUtpD,EAAA,cAAAwB,EA9naV,SAAA4Q,EAAAjU,EAAAutB,GACA,IAAAtY,EAAAhB,EAAAutB,WAAA,GACAw5B,EAAA,EAAA/mD,EAAAutB,WAAA,GACArD,EAAAlqB,EAAAutB,WAAA,GACA,OAAArD,GACA,OAAAA,EAAA,YAA4B,MAC5B,OAAAA,EAAA,aAA6B,MAC7B,OAAAA,EAAA,aAA6B,MAC7B,OAAAA,EAAA,YAEA,IAAApvB,EAAAw+C,GAAAt5C,EAAA,EAAAsZ,GAEA,OADA,IAAAxe,EAAA/O,SAAA+O,EAAA,UACA,CAAUkG,IAAAA,EAAAo7C,GAAA2K,EAAA78B,GAAAA,EAAApvB,KAAAA,EACV,GAknaA,KAAUlN,EAAA,gBACV,KAAUA,EAAA,UAAAwB,EA38YV,SAAA4Q,GACA,IAAA3U,EAAA2H,EAAA,MAGA,OAFA3H,EAAA2U,EAAAutB,WAAA,GAAyBv6B,EAAA,GAAAq7C,GAAAhjD,IAAAA,EACzBA,EAAA2U,EAAAutB,WAAA,GAAyBv6B,EAAA,GAAAq7C,GAAAhjD,IAAAA,EACzB2H,CACA,GAu8YA,KAAUpF,EAAA,UAAAwB,EAAA6pD,IACV,KAAUrrD,EAAA,QACV,KAAUA,EAAA,UAAAwB,EAx7YV,SAAA4Q,GAGA,IAFA,IAAAkmF,EAAAlmF,EAAAutB,WAAA,GACAv6B,EAAA,GACAkzF,KAAA,GAAAlzF,EAAArB,KAAAipD,GAAA56C,IACA,OAAAhN,CACA,GAo7YA,KAAUpF,EAAA,QACV,KAAUA,EAAA,OACV,KAAUA,EAAA,UACV,KAAUA,EAAA,eACV,KAAUA,EAAA,cACV,KAAUA,EAAA,sBAAAwB,EAAA6pD,IACV,KAAUrrD,EAAA,kBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,MAAAwB,EAAAwwD,IACV,KAAUhyD,EAAA,QAAAwB,EAn5YV,SAAA4Q,EAAAjU,GACA,IAAAiH,EAAA,GACA,OAAAjH,EAAA,KACAiU,EAAAvO,GAAA,GACAuB,EAAAwK,OAAA6vC,GAAArtC,GACAhN,EAAA20E,OAAAt6B,GAAArtC,GACAA,EAAAvO,GAAA,GAJAuB,CAMA,GA44YA,KAAUpF,EAAA,WACV,KAAUA,EAAA,YACV,KAAUA,EAAA,UACV,KAAUA,EAAA,QACV,KAAUA,EAAA,QACV,KAAUA,EAAA,SACV,KAAUA,EAAA,QACV,KAAUA,EAAA,QACV,KAAUA,EAAA,YACV,KAAUA,EAAA,aACV,KAAUA,EAAA,QAAAwB,EAn5ZV,SAAA4Q,EAAAjU,GAIA,IAHA,IAAA+zC,EAAA9/B,EAAAvO,EAAA1F,EAAA,EACAo6F,EAAAnmF,EAAAutB,WAAA,GAAAkb,EAAAzoC,EAAAutB,WAAA,GACA64D,EAAA,GACApmF,EAAAvO,EAAAquC,GAAAsmD,EAAAz0F,KAAAspD,GAAAj7C,IACA,GAAAA,EAAAvO,IAAAquC,EAAA,UAAAhvC,MAAA,oBACA,IAAAu1F,EAAArmF,EAAAutB,WAAA,GACA,GAAA64D,EAAAr6F,QAAAs6F,EAAA59C,EAAA,YAAA33C,MAAA,yBACA,OAASiC,EAAAozF,EAAAj3F,EAAAu5C,EAAA73C,EAAAy1F,EAAAtG,MAAAqG,EACT,GA24ZA,KAAUx4F,EAAA,WAAAwB,EAz4ZV,SAAA4Q,EAAAjU,GAIA,IAHA,IAAA+zC,EAAA9/B,EAAAvO,EAAA1F,EAAA,EACAo6F,EAAAnmF,EAAAutB,WAAA,GAAAkb,EAAAzoC,EAAAutB,WAAA,GACA+4D,EAAA,GACAtmF,EAAAvO,EAAAquC,GAAAwmD,EAAA30F,KAAAqO,EAAAutB,WAAA,IACA,GAAAvtB,EAAAvO,IAAAquC,EAAA,UAAAhvC,MAAA,uBACA,IAAAu1F,EAAArmF,EAAAutB,WAAA,GACA,GAAA+4D,EAAAv6F,QAAAs6F,EAAA59C,EAAA,YAAA33C,MAAA,4BACA,OAASiC,EAAAozF,EAAAj3F,EAAAu5C,EAAA73C,EAAAy1F,EAAAvrC,KAAAwrC,EACT,GAi4ZA,KAAU14F,EAAA,MAAAwB,EAAA2pD,IACV,KAAUnrD,EAAA,QACV,KAAUA,EAAA,QACV,KAAUA,EAAA,SACV,KAAUA,EAAA,SACV,KAAUA,EAAA,SACV,KAAUA,EAAA,SAAAwB,EAAA8nD,IACV,KAAUtpD,EAAA,SACV,KAAUA,EAAA,SACV,KAAUA,EAAA,YACV,KAAUA,EAAA,SACV,KAAUA,EAAA,SACV,KAAUA,EAAA,SACV,KAAUA,EAAA,cACV,KAAUA,EAAA,UACV,KAAUA,EAAA,UACV,KAAUA,EAAA,cACV,KAAUA,EAAA,UACV,KAAUA,EAAA,SACV,KAAUA,EAAA,aACV,KAAUA,EAAA,WAAAwB,EAAA6pD,IACV,KAAUrrD,EAAA,gBACV,KAAUA,EAAA,kBAAAwB,EAAA8nD,IACV,KAAUtpD,EAAA,iBACV,KAAUA,EAAA,KAAAwB,EA12ZV,SAAA4Q,EAAAjU,EAAAutB,GACA,IAAAtmB,EAAA,GAKA,OAJAA,EAAAk4C,KAAAlrC,EAAAutB,WAAA,GAA8Bv6B,EAAAo2C,SAAAppC,EAAAutB,WAAA,GAAiCv6B,EAAAskB,MAAAtX,EAAAutB,WAAA,GAC/Dv6B,EAAAuzF,OAAAvzF,EAAAskB,OAAA,IAEAtkB,EAAAxE,KAjDA,SAAAwR,EAAAjU,EAAAkxD,EAAA3jC,GACA,IAAAtmB,EAAA,GACA8iC,EAAA91B,EAAAutB,WAAA,GAAAn4B,EAAA4K,EAAAutB,WAAA,GACAr+B,EAAA8Q,EAAAutB,WAAA,GAAAliC,EAAA2U,EAAAutB,WAAA,GAGA,OAFAv6B,EAAAolE,YAAA9pB,GAAAp/C,GAAA,IAEAoqB,EAAAgmC,YACAtsD,EAAAwzF,IAAA,EAAA1wD,EACA9iC,EAAAyzF,MAAA3wD,GAAA,IACA9iC,EAAA0zF,KAAA5wD,GAAA,IACA9iC,EAAA2zF,UAAA7wD,GAAA,IACA9iC,EAAA4zF,KAAA9wD,GAAA,MACA9iC,EAAA6zF,QAAA/wD,GAAA,MACA9iC,EAAA8zF,aAAAhxD,GAAA,KACA9iC,EAAA+zF,WAAAjxD,GAAA,KACA9iC,EAAAg0F,QAAAlxD,GAAA,KACA9iC,EAAAi0F,QAAAnxD,GAAA,KACA9iC,EAAAk0F,QAAApxD,GAAA,KACA9iC,EAAAm0F,QAAArxD,GAAA,KACA9iC,EAAAo0F,QAAAtxD,GAAA,KACA9iC,EAAAq0F,SAAAvxD,GAAA,KAEA9iC,EAAAs0F,OAAA,GAAAlyF,EACApC,EAAAu0F,QAAAnyF,GAAA,KACApC,EAAAw0F,MAAApyF,GAAA,KACApC,EAAAy0F,SAAAryF,GAAA,MACApC,EAAA00F,QAAAtyF,GAAA,OACApC,EAAA20F,SAAAvyF,GAAA,OACApC,EAAA40F,UAAAxyF,GAAA,KAEApC,EAAA60F,OAAA,IAAA34F,EACA8D,EAAA80F,UAAA54F,GAAA,MACA8D,EAAA+0F,QAAA74F,GAAA,OACA8D,EAAAg1F,OAAA94F,GAAA,MAEA8D,EAAAmrF,QAAA,IAAA9yF,EACA2H,EAAAorF,QAAA/yF,GAAA,MACA2H,EAAAi1F,UAAA58F,GAAA,KACA2H,GAhCAA,CAiCA,CAUAk1F,CAAAloF,EAAAjU,EAAAiH,EAAAuzF,OAAAjtE,GACAtmB,CACA,GAo2ZA,KAAUpF,EAAA,eAAAwB,EArtaV,SAAA4Q,EAAAjU,GACA,WAAAA,GACAiU,EAAAutB,WAAA,GADA,IAGA,GAktaA,KAAU3/B,EAAA,eAAAwB,EAAA2pD,IACV,KAAUnrD,EAAA,QACV,KAAUA,EAAA,aAAAwB,EA1oZV,SAAA4Q,EAAAjU,GAGA,IAFA,IAAA2hF,EAAA,GACAya,EAAAnoF,EAAAutB,WAAA,GACA46D,KAAAza,EAAA/7E,KAAAupD,GAAAl7C,IACA,OAAA0tE,CACA,GAsoZA,KAAU9/E,EAAA,SACV,KAAUA,EAAA,mBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,uBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,UACV,KAAUA,EAAA,QACV,KAAUA,EAAA,UACV,KAAUA,EAAA,SACV,KAAUA,EAAA,SACV,KAAUA,EAAA,UACV,KAAUA,EAAA,YACV,KAAUA,EAAA,UACV,KAAUA,EAAA,UACV,KAAUA,EAAA,YACV,KAAUA,EAAA,MAAAwB,EA1qaV,SAAA4Q,EAAAjU,GAKA,IAJA,IAAAshB,EAAArN,EAAAvO,EAAA1F,EACA2lC,EAAA1xB,EAAAutB,WAAA,GACA66D,EAAApoF,EAAAutB,WAAA,GACA0hB,EAAA,GACAzjD,EAAA,EAAgBA,GAAA48F,GAAApoF,EAAAvO,EAAA4b,IAA2B7hB,EAC3CyjD,EAAAt9C,KAAA6nD,GAAAx5C,IAGA,OADAivC,EAAAkhB,MAAAz+B,EAAmBud,EAAAohB,OAAA+3B,EACnBn5C,CACA,GAiqaA,KAAUrhD,EAAA,WAAAwB,EAlhaV,SAAA4Q,GACA,IAAAynC,EAAAoT,GAAA76C,GAEA,OADAynC,EAAA24C,KAAApgF,EAAAutB,WAAA,GACAka,CACA,GA+gaA,KAAU75C,EAAA,SAAAwB,EArpaV,SAAA4Q,EAAAjU,GACA,IAAAs8F,EAAA,GAGA,OAFAA,EAAAC,KAAAtoF,EAAAutB,WAAA,GACAvtB,EAAAvO,GAAA1F,EAAA,EACAs8F,CACA,GAipaA,KAAUz6F,EAAA,UACV,KAAUA,EAAA,aACV,KAAUA,EAAA,UACV,KAAUA,EAAA,aACV,KAAUA,EAAA,WACV,KAAUA,EAAA,cACV,KAAUA,EAAA,UAAAwB,EAAA+pD,IACV,KAAUvrD,EAAA,eACV,KAAUA,EAAA,UACV,KAAUA,EAAA,WACV,KAAUA,EAAA,YACV,KAAUA,EAAA,aACV,KAAUA,EAAA,cACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,cACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,cACV,KAAUA,EAAA,cACV,KAAUA,EAAA,QACV,KAAUA,EAAA,WAAAwB,EAAA8nD,IACV,KAAUtpD,EAAA,MAAAwB,EAAA2pD,IACV,KAAUnrD,EAAA,QACV,KAAUA,EAAA,SACV,KAAUA,EAAA,WACV,KAAUA,EAAA,WACV,KAAUA,EAAA,YACV,KAAUA,EAAA,WACV,KAAUA,EAAA,UACV,KAAUA,EAAA,UACV,KAAUA,EAAA,aACV,KAAUA,EAAA,kBACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,eACV,KAAUA,EAAA,OACV,KAAUA,EAAA,UAAAwB,EAt1ZV,SAAA4Q,EAAAjU,EAAAutB,GACA,IAAAjM,EAAArN,EAAAvO,EAAA1F,EACAw8F,EAAAvoF,EAAAutB,WAAA,GACAgsB,EAAAv5C,EAAAutB,WAAA,GAEA,GADAjU,EAAAskC,MAAArE,EACA,MAAAA,GAAA,OAAAA,EAAA,OAAAA,EAAAgvC,GACA,GAAAhvC,EAAA,GAAAA,EAAA,cAAAzoD,MAAA,4BAAAyoD,GAIA,IAHA,IAAAivC,EAAAvuC,GAAAj6C,EAAAu5C,GAEAkvC,EAAA,GACAp7E,EAAArN,EAAAvO,GAAAg3F,EAAA92F,KAAAuoD,GAAAl6C,IACA,OAAAu5C,EAAAgvC,EAAAC,EAAAC,EACA,GA20ZA,KAAU76F,EAAA,WAAAwB,EAAA8nD,IACV,KAAUtpD,EAAA,WACV,KAAUA,EAAA,MACV,KAAUA,EAAA,QACV,KAAUA,EAAA,WACV,KAAUA,EAAA,MAAAwB,EA5oZV,SAAA4Q,EAAAjU,EAAAutB,GACA,IAAAzpB,EAAAmQ,EAAAvO,EACAi3F,EAAA,GACA,IACA1oF,EAAAvO,GAAA,EACA,IAAAgqD,GAAAniC,EAAAonE,SAAA,CAA0BD,IAAA,QAAUA,IAAA,IAEpC,oBAAA/uF,QAAA+pD,GAAAz7C,EAAAvO,GAAA,EAt9BA,SAAAuO,GACA,IAAAsX,EAAAtX,EAAAutB,WAAA,GACAvtB,EAAAvO,IACA,IAAAk3F,EAAA3oF,EAAAutB,WAAA,GACAvtB,EAAAvO,GAAA,CAEA,CAi9BAm3F,CAAA5oF,GACA,IAAA6oF,EAAA7oF,EAAAutB,WAAA,GACAvtB,EAAAutB,WAAA,GACA0rB,GAAAj5C,GACA,IAAA3R,EAAA2R,EAAAutB,WAAA,GACAvtB,EAAAvO,GAAApD,EAGA,QAAA7C,EAAA,EAAgBA,EAAAwU,EAAA+X,KAAAhsB,OAAA,IAAwBP,EAAA,CACxC,GAAAwU,EAAAvO,EAAA5B,GAAAmQ,EAAA+X,KAAAvsB,GAAA,UAAAsF,MAAA,4BACA,IAAA0mD,EAAAx3C,EAAAA,EAAAvO,GAGA,IADAi3F,GADAzuC,GAAAj6C,EAAAA,EAAA+X,KAAAvsB,EAAA,GAAAwU,EAAA+X,KAAAvsB,GAAA,IAEAO,SAAAyrD,EAAAqxC,EAAA,EAAAA,GAAA,KACA,CACA,GAAAH,EAAA38F,SAAA88F,GAAAH,EAAA38F,SAAA,EAAA88F,EACA,UAAA/3F,MAAA,YAAA+3F,EAAA,OAAAH,EAAA38F,QAWA,OARAiU,EAAAvO,EAAA5B,EAAA9D,EAQA,CAAU+G,EAAA41F,EACV,CAAE,MAAAn9F,GAAgC,OAArByU,EAAAvO,EAAA5B,EAAA9D,EAAqB,CAAS+G,EAAA41F,EAAA,CAC3C,GAwmZA,KAAU96F,EAAA,aAAAwB,EAAA8nD,IACV,KAAUtpD,EAAA,QAAAwB,EAtmZV,SAAA4Q,EAAAjU,GACA,IAAA+yD,EAAA5D,GAAAl7C,GACAA,EAAAvO,GAAA,GACA,IAAA8jF,EA37BA,SAAAv1E,EAAAjU,GACA,IAAAshB,EAAArN,EAAAvO,EAAA1F,EACA+8F,EAAA9oF,EAAAutB,WAAA,GACA,OAAAu7D,EAAA,UAAAh4F,MAAA,+BAAAg4F,GACA,IAAAxxE,EAAAtX,EAAAutB,WAAA,GACAvtB,EAAAvO,GAAA,EACA,IAAAs3F,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,GACA,GAAA/xE,IAAAyxE,EAAA1uC,GAAAr6C,EAAAA,EAAAvO,IACA,IAAA6lB,IAAA0xE,EAAA3uC,GAAAr6C,EAAAA,EAAAvO,IACA,KAAA6lB,IAAA2xE,EAAA5uC,GAAAr6C,EAAAA,EAAAvO,IACA,QAAA6lB,KAAA4xE,EAlCA,SAAAlpF,GACA,IAAA2wB,EAAA3wB,EAAAutB,WAAA,IACA,OAAAoD,GACA,8CAjCA,SAAA3wB,GACA,IAAA3R,EAAA2R,EAAAutB,WAAA,GAAAlnB,EAAArG,EAAAvO,EACAkjB,GAAA,EACAtmB,EAAA,KAEA2R,EAAAvO,GAAApD,EAAA,GACA,qCAAA2R,EAAAutB,WAAA,MAAA5Y,GAAA,GACA3U,EAAAvO,EAAA4U,GAEA,IAAA+1B,EAAAp8B,EAAAutB,YAAA5Y,EAAAtmB,EAAA,GAAAA,IAAA,aAAA0F,QAAAiuB,EAAA,IAEA,OADArN,IAAA3U,EAAAvO,GAAA,IACA2qC,CACA,CAqBAktD,CAAAtpF,GACA,8CAnBA,SAAAA,GAEoB,IADpB,IAAAupF,EAAAvpF,EAAAutB,WAAA,GACAm6B,EAAA,GAAoB6hC,KAAA,GAAA7hC,GAAA,MACpB,IAAA8hC,EAAAxpF,EAAAutB,WAAA,gBAEA,GADAvtB,EAAAvO,GAAA,EACA,OAAAuO,EAAAutB,WAAA,aAAAz8B,MAAA,mBAEA,OADAkP,EAAAutB,WAAA,GACA,OAAAm6B,EAAA8hC,EAAAz1F,QAAA,WACA,IAAAsH,EAAA2E,EAAAutB,WAAA,GACA,MAAAvtB,EAAAutB,WAAA,aAAAz8B,MAAA,mBAEA,OAAA42D,EADA1nD,EAAAutB,WAAAlyB,GAAA,aAAAtH,QAAAiuB,EAAA,GAEA,CAOAynE,CAAAzpF,GACA,kBAAAlP,MAAA,uBAAA6/B,GAEA,CA2BA+4D,CAAA1pF,EAAAA,EAAAvO,IACA,EAAA6lB,IAAA+xE,EAAAhvC,GAAAr6C,EAAAA,EAAAvO,IACA,GAAA6lB,IAAA6xE,EAAAnpF,EAAAutB,WAAA,KACA,GAAAjW,IAAA8xE,EAAAx0C,GAAA50C,IACAA,EAAAvO,EAAA4b,EACA,IAAAyyB,EAAAkpD,GAAAC,GAAAC,GAAA,GACAppD,GAAAupD,IAAAvpD,GAAA,IAAAupD,GACAvpD,IAAAA,EAAA,IAAAupD,GACA,EAAA/xE,GAAA,KAAAwoB,EAAAp0C,OAAA,SAAAo0C,EAAAp0C,OAAA,KAAAo0C,EAAA,UAAAA,GACA,IAAApxC,EAAA,CAAauiD,OAAAnR,GAIb,OAHAqpD,IAAAz6F,EAAAy6F,KAAAA,GACAC,IAAA16F,EAAAkmB,KAAAw0E,GACAL,IAAAr6F,EAAA0wD,QAAA2pC,GACAr6F,CACA,CAm6BAi7F,CAAA3pF,EAAAjU,EAAA,IACA,OAAA+yD,EAAAy2B,EACA,GAkmZA,KAAU3nF,EAAA,OACV,KAAUA,EAAA,WAAAwB,EAAA8qD,IACV,KAAUtsD,EAAA,aACV,KAAUA,EAAA,eAAAwB,EAAA6pD,IACV,KAAUrrD,EAAA,cACV,KAAUA,EAAA,MACV,KAAUA,EAAA,aAAAwB,EAAA2pD,IACV,KAAUnrD,EAAA,WAAAwB,EAnqaV,SAAA4Q,GAEA,OADAA,EAAAutB,WAAA,GACAvtB,EAAAutB,WAAA,EACA,EAgqaUx6B,EAAA,GACV,KAAUnF,EAAA,UAAAwB,EAAA2pD,IACV,KAAUnrD,EAAA,aAAAwB,EAAA0tD,IACV,KAAUlvD,EAAA,QAAAwB,EAAAuwD,IACV,KAAU/xD,EAAA,SAAAwB,EA33ZV,SAAA4Q,EAAAjU,EAAAutB,GACAA,EAAAsmE,WAAA,GAAAtmE,EAAAsuB,OAAAtuB,EAAAsuB,KAAA,GACA,IAAAH,EAAAoT,GAAA76C,GACA4pF,EAAAv8C,GAAArtC,GAEA,OADAynC,EAAAjzB,IAAAo1E,EACAniD,CACA,GAs3ZA,KAAU75C,EAAA,QAAAwB,EAhkaV,SAAA4Q,EAAAjU,EAAAutB,GACAA,EAAAsmE,WAAA,GAAAtmE,EAAAsuB,OAAAtuB,EAAAsuB,KAAA,GACA5nC,EAAAvO,EAAA,IACAg2C,EAAAoT,GAAA76C,GACA,GAAAsZ,EAAAsuB,MAAA5nC,EAAAvO,IACA,IAAAyF,EAAAgjD,GAAAl6C,EAAAA,EAAAvO,EAAA6nB,GAEA,OADAmuB,EAAAjzB,IAAAtd,EACAuwC,CACA,GAyjaA,KAAU75C,EAAA,UAAAwB,EAAA8tD,IACV,KAAUtvD,EAAA,SAAAwB,EAAAywD,IACV,KAAUjyD,EAAA,MAAAwB,EAzsaV,SAAA4Q,GACA,IAAAygC,EAAA,CAAY,EACZA,EAAA1tC,EAAAiN,EAAAutB,WAAA,GACAkT,EAAAvxC,EAAA8Q,EAAAutB,WAAA,GACAkT,EAAA/O,IAAA1xB,EAAAutB,WAAA,GAAAkT,EAAAvxC,EACA,IAAAotD,EAAAt8C,EAAAutB,WAAA,GACAvtB,EAAAvO,GAAA,EACA,IAAA6lB,EAAAtX,EAAAutB,WAAA,GAMA,OALAvtB,EAAAvO,GAAA,EACA,EAAA6lB,IAAAmpB,EAAAv5B,MAAA,EAAAoQ,GAEA,GAAAA,IAAAmpB,EAAAsmB,QAAA,GACA,GAAAzvC,IAAAmpB,EAAAymB,IAAA5K,EAAA,IACA7b,CACA,GA4raA,KAAU7yC,EAAA,SACV,KAAUA,EAAA,QAAAwB,EAAAyvD,IACV,KAAUjxD,EAAA,mBAAAwB,EAAAitD,IACV,KAAUzuD,EAAA,SACV,KAAUA,EAAA,UAAAwB,EAvoaV,SAAA4Q,EAAAjU,EAAAutB,GACA,OAAAA,GAAAA,EAAAsuB,MAAA,GAAAtuB,EAAAsuB,KAAA,KAEA,CAAU8kC,IAAA,GADV1sE,EAAAutB,WAAA,GAEA,GAooaA,KAAU3/B,EAAA,KAAAwB,EA7gaV,SAAA4Q,GACA,IAAAmmF,EAAAnmF,EAAAutB,WAAA,GAAAkb,EAAAzoC,EAAAutB,WAAA,GACAwyD,EAAA9kC,GAAAj7C,GACA,OAASjN,EAAAozF,EAAAj3F,EAAAu5C,EAAAqS,KAAAilC,EAAA,GAAAD,MAAAC,EAAA,GACT,GA0gaA,KAAUnyF,EAAA,SACV,MAAUA,EAAA,WACV,MAAUA,EAAA,SAAAwB,EAvjaV,SAAA4Q,EAAAjU,EAAAutB,GAGA,OAFAtZ,EAAAutB,WAAA,GACA4sB,GAAAn6C,EAAA,EAAAsZ,GAEA,GAojaA,MAAU1rB,EAAA,mBACV,MAAUA,EAAA,UAAAwB,EAjxZV,SAAA4Q,EAAAjU,EAAAutB,GACA,IAAAwlC,EAAAxD,GAAAt7C,GACAA,EAAAvO,IACA,IAAAo4F,EAAA7pF,EAAAutB,WAAA,GAEA,OAAAs4C,GAAA7lE,EADAjU,GAAA,EACAutB,GAAAuwE,EAAA/qC,EACA,GA4wZA,MAAUlxD,EAAA,eAAAwB,EAhnZV,SAAA4Q,EAAAjU,GACAiU,EAAAutB,WAAA,GACA,IAAAuxB,EAAA5D,GAAAl7C,GACA8pF,EAAA9pF,EAAAutB,YAAAxhC,EAAA,mBAEA,OAAA+yD,EADAgrC,EAAAA,EAAA/1F,QAAAiuB,EAAA,IAEA,GA2mZA,MAAUp0B,EAAA,UACV,MAAUA,EAAA,YACV,MAAUA,EAAA,cACV,MAAUA,EAAA,aACV,MAAUA,EAAA,UACV,MAAUA,EAAA,QACV,MAAUA,EAAA,QACV,MAAUA,EAAA,YACV,MAAUA,EAAA,MAAAwB,EAAA0sD,IACV,MAAUluD,EAAA,aACV,MAAUA,EAAA,QACV,MAAUA,EAAA,YACV,MAAUA,EAAA,QACV,MAAUA,EAAA,UACV,MAAUA,EAAA,WACV,MAAUA,EAAA,aACV,MAAUA,EAAA,eACV,MAAUA,EAAA,gBACV,MAAUA,EAAA,gBACV,MAAUA,EAAA,cACV,MAAUA,EAAA,cACV,MAAUA,EAAA,YACV,MAAUA,EAAA,eACV,MAAUA,EAAA,aACV,MAAUA,EAAA,UACV,MAAUA,EAAA,SACV,MAAUA,EAAA,cACV,MAAUA,EAAA,kBACV,MAAUA,EAAA,eACV,MAAUA,EAAA,YACV,MAAUA,EAAA,UAAAmF,EAAA,IACV,MAAUnF,EAAA,UACV,MAAUA,EAAA,SACV,MAAUA,EAAA,aACV,MAAUA,EAAA,UAAAwB,EAAA2pD,IACV,MAAUnrD,EAAA,QACV,MAAUA,EAAA,cACV,MAAUA,EAAA,sBACV,MAAUA,EAAA,aACV,MAAUA,EAAA,aACV,MAAUA,EAAA,aACV,MAAUA,EAAA,kBACV,MAAUA,EAAA,iBACV,MAAUA,EAAA,SACV,MAAUA,EAAA,UACV,MAAUA,EAAA,aACV,MAAUA,EAAA,aACV,MAAUA,EAAA,QACV,MAAUA,EAAA,QACV,MAAUA,EAAA,QAAAwB,EAhnZV,SAAA4Q,GACAA,EAAAvO,GAAA,EACA,IAAAuB,EAAA,CAAU+2F,KAAA,EAAA90F,IAAA,GAGV,OAFAjC,EAAA+2F,KAAA/pF,EAAAutB,WAAA,GACAv6B,EAAAiC,IAAA+K,EAAAutB,WAAA,GACAv6B,CACA,EA0mZUD,EAAA,IACV,MAAUnF,EAAA,QAAAwB,EA3xRV,SAAA4Q,EAAAjU,GACAiU,EAAAvO,EACAuO,EAAAvO,GAAA,EACA,IAAAqpD,EAAA96C,EAAAutB,WAAA,GACAvtB,EAAAvO,GAAA,EAGA,IAFA,IAAAu4F,EAAAhqF,EAAAutB,WAAA,GACAuzD,EAAA,GACAkJ,KAAA,GAAAlJ,EAAAnvF,KAAAgrE,GAAA38D,EAAAA,EAAAvO,IACA,OAASqpD,KAAAA,EAAAgmC,IAAAA,EACT,EAkxRU/tF,EAAA,IACV,MAAUnF,EAAA,gBACV,MAAUA,EAAA,iBACV,MAAUA,EAAA,WACV,MAAUA,EAAA,UACV,MAAUA,EAAA,YACV,MAAUA,EAAA,UACV,MAAUA,EAAA,WACV,MAAUA,EAAA,UACV,MAAUA,EAAA,OACV,MAAUA,EAAA,OACV,MAAUA,EAAA,WAAAwB,EAAA8nD,GAAAnkD,EAAA,IACV,MAAUnF,EAAA,OACV,MAAUA,EAAA,cAAAmF,EAAA,IACV,MAAUnF,EAAA,cACV,MAAUA,EAAA,qBACV,MAAUA,EAAA,YACV,MAAUA,EAAA,eACV,MAAUA,EAAA,UAAAwB,EAj2ZV,SAAA4Q,EAAAjU,EAAAutB,GACA,KAAAA,EAAAsuB,KAAA,IACA,IAAA8X,EAAA1/C,EAAAutB,WAAA,GACA08D,EAAAjqF,EAAAutB,WAAA,GAGA,OAFA0sB,GAAAj6C,EAAA0/C,EAAApmC,GACA2gC,GAAAj6C,EAAAiqF,EAAA3wE,GAJuC,CAAlBtZ,EAAAvO,GAAA1F,CAMrB,EA01ZUgH,EAAA,IACV,MAAUnF,EAAA,YACV,MAAUA,EAAA,QAAAwB,EA12RV,SAAA4Q,EAAAjU,EAAAutB,GACA,IAAAjM,EAAArN,EAAAvO,EAAA1F,EAEA,YADAiU,EAAAutB,WAAA,GAEA,GAAAjU,EAAAgmC,WAAA,CACA,IAEAhgD,EAFA9Q,EAAAwR,EAAAnR,MAAAmR,EAAAvO,GACAuO,EAAAvO,EAAA4b,EACU,IAAM/N,EAAAsgC,GAAApxC,EAAA,CAAsBmJ,KAAA,SAAc,CAAK,MAAApM,GAAW,OACpE,IAAA2+F,EAAAzqD,GAAAngC,EAAA,6BACA,GAAA4qF,EACA,OAAA5tB,GAAA4tB,EAAA5wE,EANsC,MAAdtZ,EAAAvO,EAAA4b,CAOxB,EA+1RUta,EAAA,IACV,MAAUnF,EAAA,eACV,MAAUA,EAAA,WACV,MAAUA,EAAA,eACV,MAAUA,EAAA,cAAAwB,EAx0ZV,SAAA4Q,GAIA,OAHA,IAAAA,EAAAutB,WAAA,GACA,IAAAvtB,EAAAutB,WAAA,GACAvtB,EAAAutB,WAAA,GAEA,EAm0ZUx6B,EAAA,IACV,MAAUnF,EAAA,mBAAAwB,EAAA2pD,IACV,MAAUnrD,EAAA,gBACV,MAAUA,EAAA,eACV,MAAUA,EAAA,YACV,MAAUA,EAAA,oBACV,MAAUA,EAAA,uBAAAwB,EApxaV,SAAA4Q,GACA,IAAAxC,EApSA,SAAAwC,GACA,IAAA6iE,EAAA7iE,EAAAutB,WAAA,GACAjW,EAAAtX,EAAAutB,WAAA,GAEA,OADAvtB,EAAAvO,GAAA,EACA,CAASkG,KAAAkrE,EAAAvrD,MAAAA,EACT,CA+RA6yE,CAAAnqF,GACA,SAAAxC,EAAA7F,KAAA,UAAA7G,MAAA,yBAAA0M,EAAA7F,MAEA,WADAqI,EAAAutB,WAAA,EAEA,GAgxaA,MAAU3/B,EAAA,oBACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,kBACV,MAAUA,EAAA,gBACV,MAAUA,EAAA,SACV,MAAUA,EAAA,SACV,MAAUA,EAAA,UACV,MAAUA,EAAA,cACV,MAAUA,EAAA,cACV,MAAUA,EAAA,gBACV,MAAUA,EAAA,cACV,MAAUA,EAAA,aACV,MAAUA,EAAA,iBACV,MAAUA,EAAA,cACV,MAAUA,EAAA,eACV,MAAUA,EAAA,UACV,MAAUA,EAAA,cACV,MAAUA,EAAA,OACV,MAAUA,EAAA,QACV,MAAUA,EAAA,OACV,MAAUA,EAAA,QACV,MAAUA,EAAA,WACV,MAAUA,EAAA,WACV,MAAUA,EAAA,QACV,MAAUA,EAAA,QACV,MAAUA,EAAA,cACV,MAAUA,EAAA,eACV,MAAUA,EAAA,YACV,MAAUA,EAAA,WACV,MAAUA,EAAA,eACV,MAAUA,EAAA,QACV,MAAUA,EAAA,QAAAwB,EAAA6pD,IACV,MAAUrrD,EAAA,cACV,MAAUA,EAAA,SACV,MAAUA,EAAA,SACV,MAAUA,EAAA,OACV,MAAUA,EAAA,YACV,MAAUA,EAAA,WACV,MAAUA,EAAA,QACV,MAAUA,EAAA,WACV,MAAUA,EAAA,SACV,MAAUA,EAAA,QACV,MAAUA,EAAA,aACV,MAAUA,EAAA,cACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,WAAAwB,EA3oZV,SAAA4Q,EAAAjU,EAAAutB,GACA,IAAA8wE,EAAA,CAAY9nB,MAAA,GACZ,MAAAhpD,EAAAsuB,KAAwC,OAAlB5nC,EAAAvO,GAAA1F,EAAkBq+F,EACxC,IAAA/+F,EAAA2U,EAAAutB,WAAA,GAEA,OAF6BvtB,EAAAvO,GAAA,EAC7B,GAAApG,IAAA++F,EAAA9nB,MAAA,GACA8nB,CACA,GAsoZA,MAAUx8F,EAAA,YACV,MAAUA,EAAA,YACV,MAAUA,EAAA,YACV,MAAUA,EAAA,aACV,MAAUA,EAAA,eACV,MAAUA,EAAA,cACV,MAAUA,EAAA,OACV,MAAUA,EAAA,UACV,MAAUA,EAAA,QACV,MAAUA,EAAA,gBACV,MAAUA,EAAA,aAAAwB,EAxtZV,SAAA4Q,GAGA,IAFA,IAAAkmF,EAAAlmF,EAAAutB,WAAA,GACAv6B,EAAA,GACAkzF,KAAA,GAAAlzF,EAAArB,KAAAipD,GAAA56C,IACA,OAAAhN,CACA,GAotZA,MAAUpF,EAAA,UACV,MAAUA,EAAA,mBACV,MAAUA,EAAA,OACV,MAAUA,EAAA,UACV,MAAUA,EAAA,UACV,MAAUA,EAAA,OACV,MAAUA,EAAA,cACV,MAAUA,EAAA,WACV,MAAUA,EAAA,YACV,MAAUA,EAAA,gBACV,MAAUA,EAAA,QAEV,GAAUA,EAAA,aAAAwB,EAAA0tD,IACV,GAAUlvD,EAAA,cACV,GAAUA,EAAA,WAAAwB,EA9mZV,SAAA4Q,GACA,IAAAynC,EAAAoT,GAAA76C,KACAA,EAAAvO,EACA,IAAA44F,EAAArqF,EAAAutB,WAAA,GAGA,OAFAka,EAAA30C,EAAA,IACA20C,EAAAjzB,IAAA61E,EACA5iD,CACA,GAwmZA,GAAU75C,EAAA,WAAAwB,EA9nZV,SAAA4Q,GACA,IAAAynC,EAAAoT,GAAA76C,KACAA,EAAAvO,EACA,IAAA44F,EAAAh9C,GAAArtC,GAGA,OAFAynC,EAAA30C,EAAA,IACA20C,EAAAjzB,IAAA61E,EACA5iD,CACA,GAwnZA,GAAU75C,EAAA,WAAAwB,EAzoZV,SAAA4Q,EAAAjU,EAAAutB,GACAA,EAAAsmE,WAAA,GAAAtmE,EAAAsuB,OAAAtuB,EAAAsuB,KAAA,GACA,IAAAH,EAAAoT,GAAA76C,KACAA,EAAAvO,EACA,IAAAyF,EAAAijD,GAAAn6C,EAAAjU,EAAAutB,GAGA,OAFAmuB,EAAA30C,EAAA,MACA20C,EAAAjzB,IAAAtd,EACAuwC,CACA,GAkoZA,GAAU75C,EAAA,UAAAwB,EAAA8tD,IACV,GAAUtvD,EAAA,SAAAwB,EAnmZV,SAAA4Q,GACA,IAAAu5C,EAAAv5C,EAAAutB,WAAA,GACA,WAAAgsB,GAAiBv5C,EAAAvO,IAAU,IAC3BuO,EAAAutB,WAAAgsB,EAAA,YACA,GAgmZA,GAAU3rD,EAAA,YACV,GAAUA,EAAA,MAAAwB,EAAA0sD,IACV,IAAUluD,EAAA,SACV,IAAUA,EAAA,cAAAwB,EAAA6pD,IACV,IAAUrrD,EAAA,cAAAwB,EAAAytD,IACV,IAAUjvD,EAAA,eACV,IAAUA,EAAA,gBACV,IAAUA,EAAA,QAAAwB,EAAAyvD,IACV,IAAUjxD,EAAA,YACV,IAAUA,EAAA,mBAAAwB,EAAAitD,IAKV,IAAUzuD,EAAA,gBAAAwB,EA3mZV,SAAA4Q,EAAAjU,GACAiU,EAAAvO,GAAA,EACAuO,EAAAvO,GAAA,EACAuO,EAAAvO,GAAA,EACAuO,EAAAvO,GAAA,EACAuO,EAAAvO,GAAA,EACAuO,EAAAvO,GAAA1F,EAAA,EACA,GA4mZA,IAAU6B,EAAA,gBAcV,IAAUA,EAAA,cACV,IAAUA,EAAA,WACV,IAAUA,EAAA,eAAAwB,EAAA6pD,IACV,IAAUrrD,EAAA,gBACV,IAAUA,EAAA,eACV,KAAUA,EAAA,MACV,KAAUA,EAAA,SAAAwB,EAhsZV,SAAA4Q,GACA,IAAA47C,EAAA57C,EAAAutB,WAAA,GACA+8D,EAAAtqF,EAAAutB,WAAA,GACAg9D,EAAAvqF,EAAAutB,WAAA,GACAv6B,EAAA,CAAUuzB,IAAAq1B,EAAA0uC,IAAAA,EAAAj8F,IAAAk8F,EAAA/7F,KAAAwR,EAAAnR,MAAAmR,EAAAvO,EAAAuO,EAAAvO,EAAA84F,IAEV,OADAvqF,EAAAvO,GAAA84F,EACAv3F,CACA,GA0rZA,KAAUpF,EAAA,SACV,KAAUA,EAAA,OACV,KAAUA,EAAA,OAKV,KAAUA,EAAA,OAEV,KAAUA,EAAA,YACV,KAAUA,EAAA,YACV,KAAUA,EAAA,SAIV,KAAUA,EAAA,aACV,KAAUA,EAAA,OACV,KAAUA,EAAA,WACV,KAAUA,EAAA,cACV,KAAUA,EAAA,cACV,KAAUA,EAAA,WACV,KAAUA,EAAA,WACV,KAAUA,EAAA,UAAAwB,EAppZV,SAAA4Q,EAAAjU,EAAAutB,GACA,IAAAjM,EAAArN,EAAAvO,EAAA1F,EACA07C,EAAAoT,GAAA76C,GACAu5C,EAAAv5C,EAAAutB,WAAA,GACAr2B,EAAA+iD,GAAAj6C,EAAAu5C,EAAAjgC,GAIA,OAHAtZ,EAAAvO,EAAA4b,EACAo6B,EAAA30C,EAAA,MACA20C,EAAAjzB,IAAAtd,EACAuwC,CACA,GA4oZA,KAAU75C,EAAA,UACV,KAAUA,EAAA,aACV,KAAUA,EAAA,aACV,KAAUA,EAAA,gBACV,KAAUA,EAAA,UAAAwB,EAAA02E,IACV,KAAUl4E,EAAA,MAAAwB,EAAA0sD,IACV,KAAUluD,EAAA,MAAAwB,EAAA6uD,IACV,KAAUrwD,EAAA,aAAAwB,EAAAiuD,IACV,KAAUzvD,EAAA,QACV,KAAUA,EAAA,WACV,MAAUA,EAAA,UAAAwB,EAAA02E,IACV,MAAUl4E,EAAA,MAAAwB,EAAA0sD,IACV,MAAUluD,EAAA,WACV,MAAUA,EAAA,YACV,MAAUA,EAAA,cACV,MAAUA,EAAA,YACV,MAAUA,EAAA,cACV,MAAUA,EAAA,WACV,MAAUA,EAAA,aACV,MAAUA,EAAA,UACV,MAAUA,EAAA,eACV,MAAUA,EAAA,UACV,MAAUA,EAAA,SACV,MAAUA,EAAA,UACV,MAAUA,EAAA,OACV,MAAUA,EAAA,SACV,MAAUA,EAAA,UACV,MAAUA,EAAA,YACV,MAAUA,EAAA,aAAAmF,EAAA,IAEV,UAGAy3F,GAAAntD,EAAA4+C,GAAA,KACA,SAAA5uB,GAAA/lB,EAAA3vC,EAAA45B,EAAAxlC,GACA,IAAA+G,EAAA,iBAAA6E,EAAAA,GAAAA,IAAA6yF,GAAA7yF,GACA,IAAA7D,MAAAhB,GAAA,CACA,IAAAzE,EAAAtC,IAAAwlC,GAAA,IAAAxlC,QAAA,EACAiH,EAAAs0C,EAAAxvB,KAAA,GACA9kB,EAAAm6B,YAAA,EAAAr6B,GACAE,EAAAm6B,YAAA,EAAA9+B,GACAA,EAAA,GAAA+2C,GAAA7T,IAAA+V,EAAA31C,KAAA4/B,EALA,CAMA,CAyBA,SAAAk5D,GAAA/7F,EAAAqE,EAAA7D,GAMA,OALAR,IAAAA,EAAA+iC,GAAA,IACA/iC,EAAAy+B,YAAA,EAAAp6B,GACArE,EAAAy+B,YAAA,EAAAj+B,GACAR,EAAAy+B,YAAA,KACAz+B,EAAAy+B,YAAA,KACAz+B,CACA,CAkBA,SAAAg8F,GAAApjD,EAAAG,EAAA/W,EAAA9/B,GACA,SAAA62C,EAAA/pB,EAAA,OAAA+pB,EAAA30C,GACA,gBACA,IAAA4qB,EAAA,KAAA+pB,EAAA30C,EAAA4qC,EAAAS,EAAAsJ,EAAA/pB,IAAA+pB,EAAA/pB,EAKA,YAJAA,IAAA,EAAAA,IAAAA,GAAA,GAAAA,EAAA,MACA2vC,GAAA/lB,EAAA,GA9wZAv0C,EA8wZA29B,EA9wZAxhC,EA8wZA0B,EA9wZA4jB,EA8wZAkJ,EA7wZAhvB,EAAA+iC,GAAA,GACAg5D,GAAA/7F,EAAAqE,EAAA7D,GACAR,EAAAy+B,YAAA,EAAA3Y,GACA9lB,IA4wZA2+D,GAAA/lB,EAAA,EA/xZA,SAAAv0C,EAAA7D,EAAAslB,GACA,IAAA9lB,EAAA+iC,GAAA,IAGA,OAFAg5D,GAAA/7F,EAAAqE,EAAA7D,GACAR,EAAAy+B,YAAA,EAAA3Y,EAAA,KACA9lB,CACA,CA0xZAi8F,CAAAj6D,EAAA9/B,EAAA8sB,KAEA,gBAAyF,YAAzF2vC,GAAA/lB,EAAA,EAzBA,SAAAv0C,EAAA7D,EAAAslB,EAAA1hB,GACA,IAAApE,EAAA+iC,GAAA,GAGA,OAFAg5D,GAAA/7F,EAAAqE,EAAA7D,GACAmqD,GAAA7kC,EAAA1hB,GAAA,IAAApE,GACAA,CACA,CAoBAk8F,CAAAl6D,EAAA9/B,EAAA62C,EAAA/pB,EAAA+pB,EAAA30C,IAEA,kBAEA,YADAu6D,GAAA/lB,EAAA,EApBA,SAAAv0C,EAAA7D,EAAAslB,GACA,IAAA9lB,EAAA+iC,GAAA,IAAAjd,EAAAzoB,QAIA,OAHA0+F,GAAA/7F,EAAAqE,EAAA7D,GACAR,EAAAy+B,YAAA,EAAA3Y,EAAAzoB,QACA2C,EAAAy+B,YAAA3Y,EAAAzoB,OAAAyoB,EAAA,QACA9lB,EAAA+C,EAAA/C,EAAA3C,OAAA2C,EAAAG,MAAA,EAAAH,EAAA+C,GAAA/C,CACA,CAcAm8F,CAAAn6D,EAAA9/B,GAAA62C,EAAA/pB,GAAA,IAAA7uB,MAAA,SArxZA,IAAAkE,EAAA7D,EAAAslB,EACA9lB,EAuxZA2+D,GAAA/lB,EAAA,EAAAmjD,GAAA,KAAA/5D,EAAA9/B,GACA,CAoGA,SAAAk6F,GAAAxjD,EAAAG,EAAA/W,EAAA9/B,EAAA0oB,GACA,IAAAzE,EAAA,GAAA+yD,GAAAtuD,EAAAogD,QAAAjyB,EAAAnuB,GACA,SAAAmuB,EAAA/pB,GAAA+pB,EAAAsjD,GAIA,GAAAtjD,EAAAsjD,GAAA19B,GAAA/lB,EAAA,UAnlPA,SAAAG,EAAA/W,EAAA9/B,EAAA0oB,EAAAzE,GAEA,IAAAm2E,EAAAjwC,GAAArqB,EAAA9/B,EAAAikB,GAGAuoB,EAnCA,SAAAh5B,GACA,SAAAA,EAAA,CAEA,IAAApR,EAAAy+B,GAAA,GAMA,OALAz+B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,SACAn6B,CACA,CAAG,OAAAs6C,GAAA,iBAAAlpC,EAAAA,EACH,EACA,CAuBA6mF,CAAAxjD,EAAA/pB,GAGAwtE,EAAAz5D,GAAA,GAEAy5D,EAAA/9D,YAAA,EADA,IAEA+9D,EAAA/9D,YAAA,KAIA,IADA,IAAA49D,EAAAt5D,GAAAgW,EAAAsjD,GAAAh/F,QACAP,EAAA,EAAgBA,EAAAi8C,EAAAsjD,GAAAh/F,SAAoBP,EAAAu/F,EAAAv/F,GAAAi8C,EAAAsjD,GAAAv/F,GAGpC,OADAs2B,EAAA,CAAAkpE,EAAA5tD,EAAA8tD,EAAAH,GAEA,CAgkPAI,CAAA1jD,EAAA/W,EAAA9/B,EAAA0oB,EAAAzE,SACA,OAAA4yB,EAAA30C,GACA,gBAGAu6D,GAAA/lB,EAAA,SA/zaA,SAAA5W,EAAA9/B,EAAA8sB,EAAA7I,GACA,IAAA7hB,EAAAy+B,GAAA,IAGA,OAFAspB,GAAArqB,EAAA9/B,EAAAikB,EAAA7hB,GACAs6C,GAAA5vB,EAAA1qB,GACAA,CACA,CA0zaAo4F,CAAA16D,EAAA9/B,EAFA,KAAA62C,EAAA30C,EAAA4qC,EAAAS,EAAAsJ,EAAA/pB,IAAA+pB,EAAA/pB,EAEA7I,IACA,MACA,gBACAw4C,GAAA/lB,EAAA,IAj1aA,SAAA5W,EAAA9/B,EAAA8sB,EAAA7I,EAAAyE,EAAAxmB,GACA,IAAAE,EAAAy+B,GAAA,GAGA,OAFAspB,GAAArqB,EAAA9/B,EAAAikB,EAAA7hB,GACAqmD,GAAA37B,EAAA5qB,EAAAE,GACAA,CACA,CA40aAq4F,CAAA36D,EAAA9/B,EAAA62C,EAAA/pB,EAAA7I,EAAAyE,EAAAmuB,EAAA30C,IACA,MAEA,kBACAwmB,EAAA22C,QAEA5C,GAAA/lB,EAAA,WA3hbA,SAAA5W,EAAA9/B,EAAA8sB,EAAA7I,GACA,IAAA7hB,EAAAy+B,GAAA,IAGA,OAFAspB,GAAArqB,EAAA9/B,EAAAikB,EAAA7hB,GACAA,EAAAm6B,YAAA,EAAAzP,GACA1qB,CACA,CAshbAs4F,CAAA56D,EAAA9/B,EADAo2E,GAAA1tD,EAAAmwD,QAAAhiC,EAAA/pB,EAAApE,EAAAowD,YACA70D,IACKw4C,GAAA/lB,EAAA,QA3gbL,SAAA5W,EAAA9/B,EAAA8sB,EAAA7I,EAAAyE,GACA,IAAAiyE,GAAAjyE,GAAA,GAAAA,EAAAsuB,KACA50C,EAAAy+B,IAAA85D,EAAA,KAAAA,GAAA7tE,EAAA3xB,QAKA,OAJAgvD,GAAArqB,EAAA9/B,EAAAikB,EAAA7hB,GACAA,EAAAm6B,YAAA,EAAAzP,EAAA3xB,QACAw/F,GAAAv4F,EAAAm6B,YAAA,KACAn6B,EAAAm6B,aAAA,EAAAo+D,GAAA7tE,EAAA3xB,OAAA2xB,EAAA6tE,EAAA,kBACAv4F,CACA,CAmgbKw4F,CAAA96D,EAAA9/B,GAAA62C,EAAA/pB,GAAA,IAAA7uB,MAAA,OAAAgmB,EAAAyE,IACL,MACA,QACA+zC,GAAA/lB,EAAA,QAAAyT,GAAArqB,EAAA9/B,EAAAikB,SArBAw4C,GAAA/lB,EAAA,QAAAyT,GAAArqB,EAAA9/B,EAAAikB,GAuBA,CAGA,SAAA42E,GAAAxkE,EAAA3N,EAAA2iC,GACA,IAMA6C,EANAxX,EAAAP,KACAl3C,EAAAosD,EAAAxS,WAAAxiB,GAAA6iB,EAAAmS,EAAAvS,OAAA75C,IAAA,GACA67F,GAAAzvC,GAAA,IAAmB+vB,UAAA,GACnB2f,GAAAD,EAAAhiD,QAAA,IAAAziB,IAAA,GACA4iB,EAAAl5C,MAAAuE,QAAA40C,GACAyhD,EAAA,GAAAjyE,EAAAsuB,KACA/e,EAAA,GAAAukC,EAAA,GACAtlB,EAAAkB,GAAAc,EAAA,eACA8hD,EAAAL,EAAA,YACA,GAAAzjD,EAAAv8C,EAAA2D,EAAA,KAAA44C,EAAAv8C,EAAAwH,GAAA64F,EAAA,CACA,GAAAtyE,EAAAupB,IAAA,UAAA/xC,MAAA,UAAAg5C,EAAA,mDACAhC,EAAAv8C,EAAA2D,EAAAwS,KAAAC,IAAAmmC,EAAAv8C,EAAA2D,EAAA,KACA44C,EAAAv8C,EAAAwH,EAAA2O,KAAAC,IAAAmmC,EAAAv8C,EAAA2D,EAAA08F,EAAA,EACA,CAEAv+B,GAAA/lB,EAAA,KAAA0U,GAAAC,EAAA,GAAA3iC,IAEA+zC,GAAA/lB,EAAA,WAAA4R,GAAA,IACAmU,GAAA/lB,EAAA,YAAA4R,GAAA,MACAmU,GAAA/lB,EAAA,cAAA0R,IAAA,IACAqU,GAAA/lB,EAAA,WAAA0R,IAAA,IACAqU,GAAA/lB,EAAA,YAAAgG,GAAA,OACA+f,GAAA/lB,EAAA,iBAAA0R,IAAA,IACAqU,GAAA/lB,EAAA,cAAA0R,IAAA,IACAqU,GAAA/lB,EAAA,YAAA0R,IAAA,IACAqU,GAAA/lB,EAAA,UAAA4R,GAAA,IACAmU,GAAA/lB,EAAA,OA54aA,SAAAukD,GACA,IAAA74F,EAAAy+B,GAAA,GAIA,OAHAz+B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,EAAA0+D,EAAA,GAAAA,EAAA,QACA74F,EAAAm6B,YAAA,EAAA0+D,EAAA,GAAAA,EAAA,QACA74F,CACA,CAs4aA84F,CAAA,QAIAz+B,GAAA/lB,EAAA,UAAA0R,IAAA,IACAqU,GAAA/lB,EAAA,UAAA0R,IAAA,IAEAuyC,GAzEA,SAAAjkD,EAAA8lB,GACA,GAAAA,EAAA,CACA,IAAA17B,EAAA,EACA07B,EAAAl9D,QAAA,SAAAu4C,EAAAxhB,KACAyK,GAAA,KAAA+W,GACA4kB,GAAA/lB,EAAA,UAl9ZA,SAAAmB,EAAAxhB,GACA,IAAAj0B,EAAAy+B,GAAA,IACAz+B,EAAAm6B,YAAA,EAAAlG,GACAj0B,EAAAm6B,YAAA,EAAAlG,GACAj0B,EAAAm6B,YAAA,MAAAsb,EAAAmR,OACA5mD,EAAAm6B,YAAA,KACA,IAAA/9B,EAAA,EAMA,OALAq5C,EAAAse,SAAA33D,GAAA,GACA4D,EAAAm6B,YAAA,EAAA/9B,GACAA,EAAAq5C,EAAAvhC,OAAA,EACAlU,EAAAm6B,YAAA,EAAA/9B,GACA4D,EAAAm6B,YAAA,KACAn6B,CACA,CAq8ZA+4F,CAAA3kB,GAAAngD,EAAAwhB,GAAAxhB,GAEA,EANA,CAOA,CAiEA+kE,CAAA1kD,EAAAwC,EAAA,UAEAujB,GAAA/lB,EAAA,IAhhbA,SAAAQ,EAAAxuB,GACA,IAAA3qB,EAAA,GAAA2qB,EAAAsuB,MAAAtuB,EAAAsuB,KAAA,IACA50C,EAAAy+B,GAAA,EAAA9iC,EAAA,GAMA,OALAqE,EAAAm6B,YAAAx+B,EAAAm5C,EAAAj4C,EAAAkD,GACAC,EAAAm6B,YAAAx+B,EAAAm5C,EAAAv8C,EAAAwH,EAAA,GACAC,EAAAm6B,YAAA,EAAA2a,EAAAj4C,EAAAX,GACA8D,EAAAm6B,YAAA,EAAA2a,EAAAv8C,EAAA2D,EAAA,GACA8D,EAAAm6B,YAAA,KACAn6B,CACA,CAugbAi5F,CAAAnkD,EAAAxuB,IAGAiyE,IAAAzhD,EAAA,cACA,QAAApZ,EAAAoX,EAAAj4C,EAAAkD,EAAwB29B,GAAAoX,EAAAv8C,EAAAwH,IAAgB29B,EAAA,CACxC7H,EAAAqf,GAAAxX,GACA,QAAA9/B,EAAAk3C,EAAAj4C,EAAAX,EAAyB0B,GAAAk3C,EAAAv8C,EAAA2D,IAAgB0B,EAAA,CACzC8/B,IAAAoX,EAAAj4C,EAAAkD,IAAAq6D,EAAAx8D,GAAAu3C,GAAAv3C,IACAkuD,EAAAsO,EAAAx8D,GAAAi4B,EACA,IAAA4e,EAAAoC,GAAAC,EAAApZ,IAAA,IAAA9/B,GAAAk5C,EAAAgV,GACArX,IAEAqjD,GAAAxjD,EAAAG,EAAA/W,EAAA9/B,EAAA0oB,GACAiyE,GAAA9jD,EAAAh2C,GAAAq4C,EAAA,UAAAn4C,KAAA,CAAAmtD,EAAArX,EAAAh2C,IACA,CACA,CACA,IAAAs6E,EAAA4f,EAAAziB,UAAAyiB,EAAA7wF,MAAAjL,EAaA,OAXA07F,GAAAl+B,GAAA/lB,EAAA,UA5obA,SAAA3lB,GACA,IAAA3uB,EAAAy+B,GAAA,IAAAriC,EAAA,KAOA,OANAuyB,GAAAA,EAAA+qD,MAAAt9E,GAAA,IACA4D,EAAAm6B,YAAA,EAAA/9B,GACA4D,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,MACAn6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAn6B,CACA,CAmobAk5F,EAAAR,EAAAlf,OAAA,SAEA+e,IAAAzhD,EAAA,gBAAA/9C,QAAAshE,GAAA/lB,EAAA,aApuaA,SAAAomC,GACA,IAAA16E,EAAAy+B,GAAA,IAAAi8C,EAAA3hF,QACAiH,EAAAm6B,YAAA,EAAAugD,EAAA3hF,QACA,QAAAP,EAAA,EAAgBA,EAAAkiF,EAAA3hF,SAAmBP,EAAA6vD,GAAAqyB,EAAAliF,GAAAwH,GACnC,OAAAA,CACA,CA+taAm5F,CAAAriD,EAAA,aAEAyhD,GA1GA,SAAAjkD,EAAAwC,GACA,QAAApZ,EAAA,EAAcA,EAAAoZ,EAAA,UAAA/9C,SAAuB2kC,EAAA,CACrC,IAAA07D,EAAAtiD,EAAA,UAAApZ,GACA28B,GAAA/lB,EAAA,QAAA2X,GAAAmtC,IACAA,EAAA,GAAAhtC,SAAAiO,GAAA/lB,EAAA,eAAA4X,GAAAktC,GACA,QACAtiD,EAAA,SACA,CAmGAuiD,CAAA/kD,EAAAwC,GAEAujB,GAAA/lB,EAAA,WAAA8S,GAAA2xB,IAEAwf,GArIA,SAAAjkD,EAAAwC,GAEA,IAAA92C,EAAAy+B,GAAA,IACAz+B,EAAAm6B,YAAA,QAA0Bn6B,EAAAm6B,YAAA,KAAqBn6B,EAAAm6B,YAAA,KAC/Cn6B,EAAAm6B,YAAA,KAAsBn6B,EAAAm6B,YAAA,KAAqBn6B,EAAAm6B,YAAA,KAC3CkgC,GAAA/lB,EAAA,UAAAt0C,IAEAA,EAAAy+B,GAAA,KACAtE,YAAA,QAA0Bn6B,EAAAm6B,YAAA,KAAqBn6B,EAAAm6B,YAAA,KAC/Cn6B,EAAAm6B,YAAA,KAAsBn6B,EAAAm6B,YAAA,KAAqBn6B,EAAAm6B,YAAA,KAC3Cn6B,EAAAm6B,YAAA,KAAsBn6B,EAAAm6B,YAAA,KAAqBn6B,EAAAm6B,YAAA,KAC3CkuB,GAAArS,GAAAc,EAAA,eAAA92C,GACAA,EAAAm6B,YAAA,KACAkgC,GAAA/lB,EAAA,OAAAt0C,EACA,CAuHAs5F,CAAAhlD,EAAAwC,GAEAujB,GAAA/lB,EAAA,OACAA,EAAAj6B,KACA,CAGA,SAAAk/E,GAAAtwC,EAAAl6B,EAAAzI,GACA,IAAAyK,EAAAgjB,KACA2kD,GAAAzvC,GAAA,IAAmB+vB,UAAA,GACnBwgB,EAAAd,EAAAhiD,QAAA,GACA+iD,EAAAf,EAAA7Z,SAAA,GACA0Z,EAAA,GAAAjyE,EAAAsuB,KAAAgV,EAAA,GAAAtjC,EAAAsuB,KACAylB,GAAAtpC,EAAA,KAAAi4B,GAAAC,EAAA,EAAA3iC,IACA,OAAAA,EAAA4iC,UAAAmR,GAAAtpC,EAAA,SACAspC,GAAAtpC,EAAA,eAAAwnE,EAAAryC,GAAA,YACAmU,GAAAtpC,EAAA,MA5wcA,SAAAn2B,EAAAoF,GAA6BA,IAAAA,EAAAy+B,GA4wc7B,IA5wckD,QAAA5lC,EAAA,EAAaA,EA4wc/D,IA5wcoEA,EAAAmH,EAAAm6B,YAAA,KAA0B,OAAAn6B,CAAA,CA4wc9F05F,IACA9vC,GAAAyQ,GAAAtpC,EAAA,cACA64B,GAAAyQ,GAAAtpC,EAAA,cACAspC,GAAAtpC,EAAA,gBACAspC,GAAAtpC,EAAA,cAl0bA,SAAAl0B,EAAAypB,GACA,IAAAiyE,GAAAjyE,GAAA,GAAAA,EAAAsuB,KACA50C,EAAAy+B,GAAA85D,EAAA,QAKA,IAJAv4F,EAAAm6B,YAAA,GAAA7T,EAAAsuB,KAAA,OACA2jD,GAAAv4F,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,aACAn6B,EAAAm6B,YAAA,WAAAo+D,EAAA,cACAv4F,EAAAvB,EAAAuB,EAAAjH,QAAAiH,EAAAm6B,YAAA,EAAAo+D,EAAA,MACA,OAAAv4F,CACA,CAyzbA25F,CAAA,EAAArzE,IAEA+zC,GAAAtpC,EAAA,WAAAm1B,GAAAqyC,EAAA,YAEAA,GAAAl+B,GAAAtpC,EAAA,MAAAm1B,GAAA,IACAqyC,GAAAl+B,GAAAtpC,EAAA,cACAspC,GAAAtpC,EAAA,UAxiaA,SAAAn2B,GAEA,IADA,IAAAc,EAAA+iC,GAAA,EAAA7jC,GACApC,EAAA,EAAgBA,EAAAoC,IAAOpC,EAAAkD,EAAAy+B,YAAA,EAAA3hC,EAAA,GACvB,OAAAkD,CACA,CAoiaAk+F,CAAA3wC,EAAAxS,WAAA19C,SACAw/F,GAAAtvC,EAAA6vB,QAAAze,GAAAtpC,EAAA,UAEAwnE,GAAAtvC,EAAA6vB,QAEAze,GAAAtpC,EAAA,WAAAq2B,GADAqyC,EAAAvjB,UAAA,iBAGA7b,GAAAtpC,EAAA,sBAAAm1B,GAAA,KAIAmU,GAAAtpC,EAAA,aAAAi1B,IAAA,IACAqU,GAAAtpC,EAAA,UAAAi1B,IAAA,IACAqU,GAAAtpC,EAAA,WAAAm1B,GAAA,IACAqyC,GAAAl+B,GAAAtpC,EAAA,WAAAi1B,IAAA,IACAuyC,GAAAl+B,GAAAtpC,EAAA,eAAAm1B,GAAA,IACAmU,GAAAtpC,EAAA,UAjtbA,WACA,IAAA/wB,EAAAy+B,GAAA,IAUA,OATAz+B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,SACAn6B,EAAAm6B,YAAA,SACAn6B,EAAAm6B,YAAA,MACAn6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,OACAn6B,CACA,CAqsbA65F,IACAx/B,GAAAtpC,EAAA,SAAAi1B,IAAA,IACAqU,GAAAtpC,EAAA,UAAAm1B,GAAA,IACAmU,GAAAtpC,EAAA,WAAAi1B,GAAA,QA54IA,SAAAiD,GAEA,OAAAA,EAAA+vB,UACA/vB,EAAA+vB,SAAA6F,SACAjwC,GAAAqa,EAAA+vB,SAAA6F,QAAAptD,UAAA,OAFA,OAGA,CAu4IAqoE,CAAA7wC,KACAoR,GAAAtpC,EAAA,gBAAAi1B,IAAA,IACAuyC,GAAAl+B,GAAAtpC,EAAA,aAAAi1B,IAAA,IACAqU,GAAAtpC,EAAA,WAAAm1B,GAAA,IAvMA,SAAA5R,EAAA94C,EAAA8qB,GACA+zC,GAAA/lB,EAAA,OAj+aA,SAAA94C,EAAA8qB,GACA,IAAAxe,EAAAtM,EAAAsM,MAAA,QACA8hD,EAAAtjC,GAAA,GAAAA,EAAAsuB,KACA50C,EAAAy+B,GADAmrB,EAAA,GAAA9hD,EAAA/O,OAAA,KAAA+O,EAAA/O,QAUA,OARAiH,EAAAm6B,YAAA,MAAA3+B,EAAAg/B,IAAA,KACAx6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,OACAn6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,EAAAryB,EAAA/O,QACA6wD,GAAA5pD,EAAAm6B,YAAA,KACAn6B,EAAAm6B,aAAAyvB,EAAA,KAAA9hD,EAAA/O,OAAA+O,EAAA8hD,EAAA,kBACA5pD,CACA,CAo9aA+5F,CAAA,CACAv/D,GAAA,GACAiD,MAAA,CAAUgd,MAAA,GACV3yC,KAAA,QACAwzD,OAAA,EACAuJ,OAAA,SACEv+C,GACF,CAiMA0zE,CAAAjpE,EAAAk4B,EAAA3iC,GA9LA,SAAAguB,EAAAkyB,EAAAlgD,GACAkgD,GACA,iCAAAtpE,QAAA,SAAA6C,GACA,QAAAvH,EAAAuH,EAAA,GAAkBvH,GAAAuH,EAAA,KAAWvH,EAAA,MAAAguE,EAAAhuE,IAAA6hE,GAAA/lB,EAAA,SAAAqV,GAAAnxD,EAAAguE,EAAAhuE,GAAA8tB,GAC7B,EACA,CA0LA2zE,CAAAlpE,EAAAk4B,EAAAh6B,IAAA3I,GAxKA,SAAAguB,EAAAhuB,GACA,QAAA9tB,EAAA,EAAgBA,EAAA,KAAQA,EAAA6hE,GAAA/lB,EAAA,KAAAyV,GAAA,CAAwC3T,SAAA,EAAA6T,OAAA,GAAuB,EAAA3jC,IACvFA,EAAAogD,QAAAxpE,QAAA,SAAAhB,GACAm+D,GAAA/lB,EAAA,KAAAyV,GAAA7tD,EAAA,EAAAoqB,GACA,EACA,CAoKA4zE,CAAAnpE,EAAAzK,GAEAiyE,GAAAl+B,GAAAtpC,EAAA,WAAAi1B,IAAA,IACA,IAAAljB,EAAA/R,EAAA1W,MAEAzc,EAAAm2C,KAEAwkD,GAAAl+B,GAAAz8D,EAAA,UA5paA,SAAAoC,GAIA,OAHAA,IAAAA,EAAAy+B,GAAA,IACAz+B,EAAAm6B,YAAA,KACAn6B,EAAAm6B,YAAA,KACAn6B,CACA,CAupaAm6F,IAIA5B,GAAAjyE,EAAAmwD,SA9TA,SAAAniC,EAAA3vC,EAAA45B,GACA,IAAAljC,GAAAkjC,GAAA,IAAAxlC,QAAA,EACA,GAAAsC,GAAA,YAAAg/D,GAAA/lB,EAAA3vC,EAAA45B,EAAAljC,GACA,IAAAyE,GAAA03F,GAAA7yF,GACA,IAAA7D,MAAAhB,GAAA,CAGA,IAFA,IAAA8/C,EAAArhB,EAAAqhB,OAAA,GAAAqY,EAAA,EACAz/D,EAAA,EAAAmD,EAAA,EACAA,GAAAikD,EAAAqY,IAAA,aAA4Ct8D,GAAAikD,EAAAqY,IAAA,KAA2BA,IACvE,IAAAj4D,EAAAs0C,EAAAxvB,KAAA,GAKA,IAJA9kB,EAAAm6B,YAAA,EAAAr6B,GACAE,EAAAm6B,YAAA,EAAAx+B,GACA24C,EAAA31C,KAAA4/B,EAAA1iC,MAAArD,EAAAA,EAAAmD,IACAnD,GAAAmD,EACAnD,EAAA6C,GAAA,CAIA,KAHA2E,EAAAs0C,EAAAxvB,KAAA,IACAqV,YAAA,MACAx+B,EAAA,EACAA,GAAAikD,EAAAqY,IAAA,aAA6Ct8D,GAAAikD,EAAAqY,IAAA,KAA2BA,IACxEj4D,EAAAm6B,YAAA,EAAAx+B,GACA24C,EAAA31C,KAAA4/B,EAAA1iC,MAAArD,EAAAA,EAAAmD,IAAkCnD,GAAAmD,CAClC,CAhBA,CAiBA,CAySAy+F,CAAAx8F,EAAA,MApzbA,SAAAo/D,GACA,IAAAxyD,EAAAi0B,GAAA,GACAj0B,EAAA2vB,YAAA,EAAA6iC,EAAAG,OACA3yD,EAAA2vB,YAAA,EAAA6iC,EAAAK,QAEA,IADA,IAAAphB,EAAA,GACApjD,EAAA,EAAgBA,EAAAmkE,EAAAjkE,SAAgBF,EAAAojD,EAAApjD,GAAAiuD,GAAAkW,EAAAnkE,IAChC,IAAAmH,EAAA8uB,EAAA,CAAAtkB,GAAAyN,OAAAgkC,IAEA,OADAj8C,EAAA4/C,MAAA,CAAAp1C,EAAAzR,QAAAkf,OAAAgkC,EAAAx/C,IAAA,SAAAyH,GAA0D,OAAAA,EAAAnL,MAAA,IAC1DiH,CACA,CA2ybAq6F,CAAA/zE,EAAAmwD,UAGApc,GAAAz8D,EAAA,OACA,IAAA1B,EAAA0B,EAAAyc,MAEAmW,EAAAujB,KACAumD,EAAA,EAAAzhG,EAAA,EACA,IAAAA,EAAA,EAAYA,EAAAowD,EAAAxS,WAAA19C,SAA0BF,EAAAyhG,IAAA/B,EAAA,QAAAA,EAAA,KAAAtvC,EAAAxS,WAAA59C,GAAAE,OACtC,IAAAsa,EAAAyvB,EAAA/pC,OAAAuhG,EAAAp+F,EAAAnD,OACA,IAAAF,EAAA,EAAYA,EAAAowD,EAAAxS,WAAA19C,SAA0BF,EAEtCwhE,GAAA7pC,EAAA,cAAA24B,GAAA,CAAsDn7C,IAAAqF,EAAA+1C,IADtDowC,EAAA3gG,IAAA,CAAgC,GACsB2mF,QAAA,EAAAtoD,GAAA,EAAApvB,KAAAmhD,EAAAxS,WAAA59C,IAA4DytB,IAClHjT,GAAA0b,EAAAl2B,GAAAE,OAGA,IAAAqJ,EAAAouB,EAAAnW,MACA,GAAAigF,GAAAl4F,EAAArJ,OAAA,UAAA+E,MAAA,OAAAw8F,EAAA,OAAAl4F,EAAArJ,QAEA,IAAA2C,EAAA,GAIA,OAHAonC,EAAA/pC,QAAA2C,EAAAiD,KAAAmkC,GACA1gC,EAAArJ,QAAA2C,EAAAiD,KAAAyD,GACAlG,EAAAnD,QAAA2C,EAAAiD,KAAAzC,GACA2gC,GAAA,CAAAnhC,GACA,CA8BA,SAAA6+F,GAAAtxC,EAAA3iC,GACA,QAAA9tB,EAAA,EAAgBA,GAAAywD,EAAAxS,WAAA19C,SAA2BP,EAAA,CAC3C,IAAAs+C,EAAAmS,EAAAvS,OAAAuS,EAAAxS,WAAAj+C,IACAs+C,GAAAA,EAAA,SACAlB,GAAAkB,EAAA,SACAv+C,EAAA2D,EAAA,KACAmpC,QAAAC,MAAA,cAAA2jB,EAAAxS,WAAAj+C,GAAA,uDAEA,CAEA,IAAAwH,EAAAsmB,GAAA,GACA,OAAAtmB,EAAA40C,MAAA,GACA,qBAvCA,SAAAqU,EAAA3iC,GACA,IAAAtmB,EAAAsmB,GAAA,GACAyI,EAAA,GAEAk6B,IAAAA,EAAAh6B,MACAg6B,EAAAh6B,IAAAA,EAAA2J,aAEAqwB,GAAAA,EAAAh6B,MACAC,EAAAD,GAAiBA,EAAA4J,WAAAowB,EAAAh6B,KAEjBjvB,EAAA60E,OAAApqC,EAAAwe,EAAAh6B,KAAgCjvB,EAAA60E,OAAA5rB,EAAAh6B,IAAA,UAChCjvB,EAAA80E,IAAA7rB,EAAAh6B,KAGAjvB,EAAAy2E,QAAA,GAAiBz2E,EAAAy2E,QAAAtZ,MAAA,EAAqBn9D,EAAAy2E,QAAApZ,OAAA,EACtCm9B,GAAAx6F,GAEAA,EAAA0mE,QAAA,GACAkO,GAAA50E,EAAA0mE,QAAA,GAA6B,CAAGmO,OAAA,CAAQ2T,QAAA,KAExCv/B,EAAAtH,QAAAsH,EAAAtH,MAAA,IAEA,QAAAnpD,EAAA,EAAgBA,EAAAywD,EAAAxS,WAAA19C,SAA0BP,EAAAu2B,EAAAA,EAAAh2B,QAAA0/F,GAAAjgG,EAAAwH,EAAAipD,GAE1C,OADAl6B,EAAA81B,QAAA00C,GAAAtwC,EAAAl6B,EAAA/uB,IACA68B,GAAA,CAAA9N,GACA,CAcA0rE,CAAAxxC,EAAA3iC,GACA,4BAxSA,SAAA2iC,EAAA3iC,GAKA,IAJA,IAAAtmB,EAAAsmB,GAAA,GAEAguB,EAAAP,KACA9f,EAAA,EACAz7B,EAAA,EAAaA,EAAAywD,EAAAxS,WAAA19C,SAAuBP,EAAAywD,EAAAxS,WAAAj+C,IAAAwH,EAAAu2C,QAAAtiB,EAAAz7B,GACpC,MAAAy7B,GAAAj0B,EAAAu2C,OAAA0S,EAAAxS,WAAA,IAAAz2C,EAAAu2C,MAAA,UAAAz4C,MAAA,oBAAAkC,EAAAu2C,OAMA,OALA8jB,GAAA/lB,EAAA,GAAAt0C,EAAA40C,KAAA,QAAA50C,EAAA40C,KAAA,MAAAoU,GAAAC,EAAA,GAAAjpD,IA9BA,SAAAs0C,EAAAwC,EAAA7iB,EAAA3N,GACA,IACAwlC,EADAjV,EAAAl5C,MAAAuE,QAAA40C,GACAhC,EAAAkB,GAAAc,EAAA,eAAAjhB,EAAA,GAAAukC,EAAA,GACA,GAAAtlB,EAAAv8C,EAAA2D,EAAA,KAAA44C,EAAAv8C,EAAAwH,EAAA,OACA,GAAAumB,EAAAupB,IAAA,UAAA/xC,MAAA,UAAAg5C,EAAA,mDACAhC,EAAAv8C,EAAA2D,EAAAwS,KAAAC,IAAAmmC,EAAAv8C,EAAA2D,EAAA,KACA44C,EAAAv8C,EAAAwH,EAAA2O,KAAAC,IAAAmmC,EAAAv8C,EAAA2D,EAAA,OACA4vD,EAAAjW,GAAAf,EACA,CACA,QAAApX,EAAAoX,EAAAj4C,EAAAkD,EAAwB29B,GAAAoX,EAAAv8C,EAAAwH,IAAgB29B,EAAA,CACxC7H,EAAAqf,GAAAxX,GACA,QAAA9/B,EAAAk3C,EAAAj4C,EAAAX,EAAyB0B,GAAAk3C,EAAAv8C,EAAA2D,IAAgB0B,EAAA,CACzC8/B,IAAAoX,EAAAj4C,EAAAkD,IAAAq6D,EAAAx8D,GAAAu3C,GAAAv3C,IACAkuD,EAAAsO,EAAAx8D,GAAAi4B,EACA,IAAA4e,EAAAoC,GAAAC,EAAApZ,IAAA,IAAA9/B,GAAAk5C,EAAAgV,GACArX,GAEAijD,GAAApjD,EAAAG,EAAA/W,EAAA9/B,EACA,CACA,CACA,CAYA88F,CAAApmD,EAAA2U,EAAAvS,OAAAuS,EAAAxS,WAAAxiB,IAAAA,EAAAj0B,GAEAq6D,GAAA/lB,EAAA,IACAA,EAAAj6B,KACA,CA2RAsgF,CAAA1xC,EAAA3iC,GAEA,UAAAxoB,MAAA,gBAAAkC,EAAAkpD,SAAA,YACA,CAEA,IAAA+7B,GAAA,WACA,SAAA2V,EAAA12F,EAAA27B,GACA,IAAAvZ,EAAAuZ,GAAA,GAEAiX,EAAAxwB,EAAAuwB,MAAA,IAAkC,EAElC0qC,GADAr9E,EAAAA,EAAAnD,QAAA,mBACAhD,MAAA,WACA,IAAAwjF,EAAA,UAAAzjF,MAAA,wCACA,IAAA+8F,EAAA32F,EAAAnG,MAAA,aACAvF,EAAA+oF,EAAAh/E,MAAA1J,EAAAgiG,GAAAA,EAAAt4F,OAAA2B,EAAAnL,OACAi8D,EAljiBA,SAAA9wD,EAAA42F,GACA,GAAA5uD,IAAA,iBAAA4uD,EAAA,OAAA52F,EAAApL,MAAAgiG,GAEA,IADA,IAAApjF,EAAAxT,EAAApL,MAAAgiG,GAAA96F,EAAA,CAAA0X,EAAA,IACAlf,EAAA,EAAgBA,EAAAkf,EAAA3e,SAAcP,EAAOwH,EAAArB,KA+iiBrC,QA/iiBkDqB,EAAArB,KAAA+Y,EAAAlf,IAClD,OAAAwH,CACA,CA6iiBA+6F,CAAA72F,EAAArI,MAAArD,EAAAK,GAAA,kBACA6kC,GAAA,EAAA9/B,EAAA,EAAA+2D,EAAA,EAAA0pB,EAAA,EACAvpC,EAAA,CAAej4C,EAAA,CAAGkD,EAAA,IAAA7D,EAAA,KAAuB3D,EAAA,CAAIwH,EAAA,EAAA7D,EAAA,IAC7Cw+E,EAAA,GACA,IAAAliF,EAAA,EAAaA,EAAAw8D,EAAAj8D,SAAiBP,EAAA,CAC9B,IAAA88C,EAAA0f,EAAAx8D,GAAAo1C,OACAotD,EAAA1lD,EAAAz5C,MAAA,KAAAuQ,cACA,UAAA4uF,GACA,UAAAA,GAAA,OAAAA,EAAA,CACA,IAAA3jB,EAAA/hC,EAAAx8C,MAAA,cACA,IAAAD,EAAA,EAAcA,EAAAw+E,EAAAt+E,SAAkBF,EAAA,CAChC,IAAA47C,EAAA4iC,EAAAx+E,GAAA+0C,OACA,GAAA6G,EAAA12C,MAAA,YAGA,IAFA,IAAAsf,EAAAo3B,EAAA5f,EAAA,EAEA,KAAAxX,EAAA3kB,OAAA,KAAAm8B,EAAAxX,EAAA3e,QAAA,UAAA2e,EAAAA,EAAAxhB,MAAAg5B,EAAA,GACA,QAAAomE,EAAA,EAAsBA,EAAAvgB,EAAA3hF,SAAsBkiG,EAAA,CAC5C,IAAA3Y,EAAA5H,EAAAugB,GACA3Y,EAAAzlF,EAAAX,GAAA0B,GAAA0kF,EAAAzlF,EAAAkD,EAAA29B,GAAAA,GAAA4kD,EAAA/pF,EAAAwH,IAAgEnC,EAAA0kF,EAAA/pF,EAAA2D,EAAA,EAAoB++F,GAAA,EACpF,CACA,IAAA3tD,EAAAD,GAAAoH,EAAA54C,MAAA,EAAA44C,EAAA/1C,QAAA,OACA2/E,EAAA/wC,EAAA4tD,SAAA5tD,EAAA4tD,QAAA,IACAvmC,GAAArnB,EAAA6tD,SAAA,GAAA9c,EAAA,IAAA3D,EAAA/7E,KAAA,CAAmD9B,EAAA,CAAGkD,EAAA29B,EAAAxhC,EAAA0B,GAAQrF,EAAA,CAAIwH,EAAA29B,GAAAi3B,GAAA,KAAAz4D,EAAA0B,EAAAygF,EAAA,KAClE,IAAA+c,EAAA9tD,EAAAxtC,GAAAwtC,EAAA,cAEA,GAAAjwB,EAAAtkB,QAIA,GAHAskB,EAAAkyB,GAAAlyB,GACAy3B,EAAAj4C,EAAAkD,EAAA29B,IAAAoX,EAAAj4C,EAAAkD,EAAA29B,GAAqCoX,EAAAv8C,EAAAwH,EAAA29B,IAAAoX,EAAAv8C,EAAAwH,EAAA29B,GACrCoX,EAAAj4C,EAAAX,EAAA0B,IAAAk3C,EAAAj4C,EAAAX,EAAA0B,GAAqCk3C,EAAAv8C,EAAA2D,EAAA0B,IAAAk3C,EAAAv8C,EAAA2D,EAAA0B,GACrCyf,EAAAtkB,OAAA,CACA,IAAAiH,EAAA,CAAaF,EAAA,IAAA4qB,EAAArN,GACbiJ,EAAA7R,MAAA4I,EAAAuwB,OAAA70C,QAAA,KAAAqiG,IACA,SAAA/9E,EAAArd,EAAA,CAA+BF,EAAA,IAAA4qB,GAAA,GAC/B,UAAArN,EAAArd,EAAA,CAAgCF,EAAA,IAAA4qB,GAAA,GAChC5pB,MAAA4qC,GAAAruB,IACAvc,MAAAirC,GAAA1uB,GAAA9S,aACAvK,EAAA,CAAWF,EAAA,IAAA4qB,EAAAygB,EAAA9tB,IACXiJ,EAAAkxB,YAAAx3C,EAAA,CAA+BF,EAAA,IAAA4qB,EAAAggB,EAAA1qC,EAAA0qB,KAC/B1qB,EAAAytC,EAAAnnB,EAAA+R,QAAApJ,EAAA0J,OAAA,KAJA34B,EAAA,CAAsCF,EAAA,IAAA4qB,EAAAghB,GAAAruB,KAMtCiJ,EAAAuwB,OAAqBC,EAAApZ,KAAAoZ,EAAApZ,GAAA,IAAuBoZ,EAAApZ,GAAA9/B,GAAAoC,GAC5C82C,EAAA9B,GAAA,CAAyBj1C,EAAA29B,EAAAxhC,EAAA0B,KAASoC,EAClCpC,GAAAygF,CAbA,OAJoBzgF,GAAAygF,CAbpB,CA+BA,CAnCA,MADA,CAA0B,KAAL3gD,EAAKpX,EAAAwnC,WAAAxnC,EAAAwnC,WAAApwB,EAAA,GAA4CA,EAAK,MAAS9/B,EAAA,CAAO,CAqC3F,CAGA,OAFAk5C,EAAA,QAAAjB,GAAAf,GACA4lC,EAAA3hF,SAAA+9C,EAAA,WAAA4jC,GACA5jC,CACA,CASA,SAAAukD,EAAAvkD,EAAA/2C,EAAA29B,EAAA19B,GAGA,IAFA,IAAAnC,EAAAi5C,EAAA,eACAlE,EAAA,GACAh1C,EAAAmC,EAAAlD,EAAAX,EAAqB0B,GAAAmC,EAAAxH,EAAA2D,IAAY0B,EAAA,CAEjC,IADA,IAAA+2D,EAAA,EAAA0pB,EAAA,EACAxlF,EAAA,EAAkBA,EAAAgF,EAAA9E,SAAcF,EAChC,KAAAgF,EAAAhF,GAAAgE,EAAAkD,EAAA29B,GAAA7/B,EAAAhF,GAAAgE,EAAAX,EAAA0B,GACAC,EAAAhF,GAAAN,EAAAwH,EAAA29B,GAAA7/B,EAAAhF,GAAAN,EAAA2D,EAAA0B,GAAA,CACA,GAAAC,EAAAhF,GAAAgE,EAAAkD,EAAA29B,GAAA7/B,EAAAhF,GAAAgE,EAAAX,EAAA0B,EAAA,CAAuC+2D,GAAA,EAAS,MAChDA,EAAA92D,EAAAhF,GAAAN,EAAAwH,EAAAlC,EAAAhF,GAAAgE,EAAAkD,EAAA,EAAkCs+E,EAAAxgF,EAAAhF,GAAAN,EAAA2D,EAAA2B,EAAAhF,GAAAgE,EAAAX,EAAA,EAA8B,KAFhE,CAIA,KAAAy4D,EAAA,IACA,IAAAQ,EAAAngB,GAAA,CAA4Bj1C,EAAA29B,EAAAxhC,EAAA0B,IAC5B62C,EAAAz0C,EAAA62C,OAAAC,EAAApZ,IAAA,IAAA9/B,GAAAk5C,EAAAqe,GAEAx5D,EAAA84C,GAAA,MAAAA,EAAA/pB,IAAA+pB,EAAArpB,GAAAojB,GAAAiG,EAAA94C,IAAAs6C,GAAAxB,GAAAA,EAAA94C,IAAA,SACAm2E,EAAA,CAAe,EACfnd,EAAA,IAAAmd,EAAAqpB,QAAAxmC,GACA0pB,EAAA,IAAAvM,EAAAopB,QAAA7c,GACAr+E,EAAAs7F,SAAA3/F,EAAA,gCAAAA,EAAA,UACA84C,IACAq9B,EAAA,UAAAr9B,GAAAA,EAAA30C,GAAA,IACA,MAAA20C,EAAA/pB,IAAAonD,EAAA,UAAAr9B,EAAA/pB,GACA,MAAA+pB,EAAAhH,IAAAqkC,EAAA,UAAAr9B,EAAAhH,GACAgH,EAAAh2C,GAAA,MAAAg2C,EAAAh2C,EAAAw/C,QAAA,KAAAvlD,OAAA,KAAAiD,EAAA,YAAA84C,EAAAh2C,EAAAw/C,OAAA,KAAAtiD,EAAA,SAEAm2E,EAAA3gE,IAAAnR,EAAAmR,IAAA,WAAAgkD,EACAviB,EAAAj0C,KAAAsxC,GAAA,KAAAt0C,EAAAm2E,GAhBA,CAiBA,CAEA,MADA,OACAl/B,EAAAh0C,KAAA,WACA,CACA,SAAA28F,EAAAzkD,EAAApZ,EAAA19B,GAEA,MADA,GACApB,KAAA,cAAAoB,GAAAA,EAAAmR,GAAA,QAAAnR,EAAAmR,GAAA,WACA,CACA,IAAAqqF,EAAA,sFACAC,EAAA,iBAcA,OACAxtC,YA5DA,SAAA/pD,EAAAoiB,GACA,IAAAi7D,EAAAr9E,EAAAnG,MAAA,iCACA,IAAAwjF,GAAA,GAAAA,EAAAxoF,OAAA,UAAA+E,MAAA,wCACA,MAAAyjF,EAAAxoF,OAAA,OAAAu9C,GAAAskD,EAAArZ,EAAA,GAAAj7D,GAAAA,GACA,IAAA2iC,EAAAzrD,GAAAk+F,WAEA,OADAna,EAAArkF,QAAA,SAAAL,EAAAo3B,GAAkCz2B,GAAAm+F,kBAAA1yC,EAAA2xC,EAAA/9F,EAAAypB,GAAA,SAAA2N,EAAA,MAClCg1B,CACA,EAsDAiF,SAAA0sC,EACAgB,KAAAP,EACAQ,MAAAL,EACAM,IAAAL,EACAM,UAAAR,EACAptC,WApBA,SAAArX,EAAAxwB,GACA,IAAAtmB,EAAAsmB,GAAA,GACA9b,EAAA,MAAAxK,EAAAwK,OAAAxK,EAAAwK,OAAAgxF,EACA7mB,EAAA,MAAA30E,EAAA20E,OAAA30E,EAAA20E,OAAA8mB,EACA//F,EAAA,CAAA8O,GACAzK,EAAA61C,GAAAkB,EAAA,SACA92C,EAAA62C,MAAAl5C,MAAAuE,QAAA40C,GACAp7C,EAAAiD,KAAA48F,EAAAzkD,EAAA/2C,EAAAC,IACA,QAAA09B,EAAA39B,EAAAlD,EAAAkD,EAAqB29B,GAAA39B,EAAAxH,EAAAwH,IAAY29B,EAAAhiC,EAAAiD,KAAA08F,EAAAvkD,EAAA/2C,EAAA29B,EAAA19B,IAEjC,OADAtE,EAAAiD,KAAA,WAAAg2E,GACAj5E,EAAAkD,KAAA,GAEA,EAUC,CA/HD,GAiIA,SAAAo9F,GAAAllD,EAAA90C,EAAA69B,GACA,IAAAvZ,EAAAuZ,GAAA,GAEAo8D,EAAA,EAAAC,EAAA,EACA,SAAA51E,EAAA2wB,OACA,oBAAA3wB,EAAA2wB,OAAAglD,EAAA31E,EAAA2wB,WACA,CACA,IAAAC,EAAA,iBAAA5wB,EAAA2wB,OAAAvB,GAAApvB,EAAA2wB,QAAA3wB,EAAA2wB,OACAglD,EAAA/kD,EAAAn3C,EAAqBm8F,EAAAhlD,EAAAh7C,CACrB,CAEA,IAAA84D,EAAAhzD,EAAAm6F,qBAAA,MACAruC,EAAAp/C,KAAAC,IAAA2X,EAAAwnC,WAAA,IAAAkH,EAAAj8D,QACA+7C,EAAA,CAAcj4C,EAAA,CAAGkD,EAAA,EAAA7D,EAAA,GAAQ3D,EAAA,CAAIwH,EAAAk8F,EAAA//F,EAAAggG,IAC7B,GAAAplD,EAAA,SACA,IAAAK,EAAAvB,GAAAkB,EAAA,SACAhC,EAAAj4C,EAAAkD,EAAA2O,KAAAC,IAAAmmC,EAAAj4C,EAAAkD,EAAAo3C,EAAAt6C,EAAAkD,GACA+0C,EAAAj4C,EAAAX,EAAAwS,KAAAC,IAAAmmC,EAAAj4C,EAAAX,EAAAi7C,EAAAt6C,EAAAX,GACA44C,EAAAv8C,EAAAwH,EAAA2O,KAAAX,IAAA+mC,EAAAv8C,EAAAwH,EAAAo3C,EAAA5+C,EAAAwH,GACA+0C,EAAAv8C,EAAA2D,EAAAwS,KAAAX,IAAA+mC,EAAAv8C,EAAA2D,EAAAi7C,EAAA5+C,EAAA2D,IACA,GAAA+/F,IAAAnnD,EAAAv8C,EAAAwH,EAAAk8F,EAAA9kD,EAAA5+C,EAAAwH,EAAA,EACA,CACA,IAAA26E,EAAA,GAAAugB,EAAA,EACAjoC,EAAAlc,EAAA,WAAAA,EAAA,aACAC,EAAA,EAAArZ,EAAA,EAAAsZ,EAAA,EAAAp5C,EAAA,EAAA+2D,EAAA,EAAA0pB,EAAA,EAEA,IADAvnC,EAAA,WAAAA,EAAA,aACOC,EAAAie,EAAAj8D,QAAA2kC,EAAAowB,IAAmC/W,EAAA,CAC1C,IAAAzB,EAAA0f,EAAAje,GACA,GAAAqlD,GAAA9mD,GAAA,CACA,GAAAhvB,EAAA2qE,QAAA,SACAj+B,EAAAt1B,GAAA,CAAiBq2B,QAAA,EACjB,CACA,IAAAsoC,EAAA/mD,EAAA,SACA,IAAA0B,EAAAp5C,EAAA,EAAkBo5C,EAAAqlD,EAAAtjG,SAAkBi+C,EAAA,CACpC,IAAArX,EAAA08D,EAAArlD,GACA,IAAA1wB,EAAA2qE,UAAAmL,GAAAz8D,GAAA,CACA,IAAAjV,EAAAiV,EAAA28D,aAAA,UAAA38D,EAAA48D,aAAA,UAAA58D,EAAA28D,aAAA,KAAA38D,EAAA48D,aAAA,KAAAhtD,GAAA5P,EAAA68D,WACA/uD,EAAA9N,EAAA48D,aAAA,WAAA58D,EAAA48D,aAAA,KACA,IAAAtB,EAAA,EAAiBA,EAAAvgB,EAAA3hF,SAAsBkiG,EAAA,CACvC,IAAA59E,EAAAq9D,EAAAugB,GACA59E,EAAAxgB,EAAAX,GAAA0B,EAAAs+F,GAAA7+E,EAAAxgB,EAAAkD,EAAA29B,EAAAu+D,GAAAv+D,EAAAu+D,GAAA5+E,EAAA9kB,EAAAwH,IAAqEnC,EAAAyf,EAAA9kB,EAAA2D,EAAA,EAAAggG,EAAoBjB,GAAA,EACzF,CAEA5c,GAAA1+C,EAAA48D,aAAA,gBACA5nC,GAAAh1B,EAAA48D,aAAA,kBAAAle,EAAA,IAAA3D,EAAA/7E,KAAA,CAA4E9B,EAAA,CAAGkD,EAAA29B,EAAAu+D,EAAA//F,EAAA0B,EAAAs+F,GAAsB3jG,EAAA,CAAIwH,EAAA29B,EAAAu+D,GAAAtnC,GAAA,KAAAz4D,EAAA0B,EAAAs+F,GAAA7d,GAAA,QACzG,IAAAr+E,EAAA,CAAYF,EAAA,IAAA4qB,EAAAA,GACZ0wE,EAAAz7D,EAAA48D,aAAA,WAAA58D,EAAA48D,aAAA,SACA,MAAA7xE,IACA,GAAAA,EAAA3xB,OAAAiH,EAAAF,EAAAs7F,GAAA,IACA90E,EAAA7R,KAAA,GAAAiW,EAAAkjB,OAAA70C,QAAA,KAAAqiG,IACA,SAAA1wE,EAAA1qB,EAAA,CAA+BF,EAAA,IAAA4qB,GAAA,GAC/B,UAAAA,EAAA1qB,EAAA,CAAgCF,EAAA,IAAA4qB,GAAA,GAChC5pB,MAAA4qC,GAAAhhB,IACA5pB,MAAAirC,GAAArhB,GAAAngB,aACAvK,EAAA,CAAWF,EAAA,IAAA4qB,EAAAygB,EAAAzgB,IACXpE,EAAAkxB,YAAAx3C,EAAA,CAA+BF,EAAA,IAAA4qB,EAAAggB,EAAA1qC,EAAA0qB,KAC/B1qB,EAAAytC,EAAAnnB,EAAA+R,QAAApJ,EAAA0J,OAAA,KAJA34B,EAAA,CAAsCF,EAAA,IAAA4qB,EAAAghB,GAAAhhB,WAOtCrrB,IAAAW,EAAAytC,GAAA,MAAAA,IAAAztC,EAAAytC,EAAAA,GAGA,IAAAhvC,EAAA,GAAAg+F,EAAA98D,EAAAw8D,qBAAA,KACA,GAAAM,GAAAA,EAAA1jG,OAAA,QAAA2jG,EAAA,EAAgDA,EAAAD,EAAA1jG,UAAsB0jG,EAAAC,GAAAJ,aAAA,SAC3B,MAA3C79F,EAAAg+F,EAAAC,GAAAH,aAAA,SAA2C7jG,OAAA,MAD2BgkG,GAGtEj+F,GAAA,KAAAA,EAAA/F,OAAA,KAAAsH,EAAAvB,EAAA,CAAwCw/C,OAAAx/C,IACxC6nB,EAAAuwB,OAAoBC,EAAApZ,EAAAu+D,KAAAnlD,EAAApZ,EAAAu+D,GAAA,IAAqCnlD,EAAApZ,EAAAu+D,GAAAr+F,EAAAs+F,GAAAl8F,GACzD82C,EAAA9B,GAAA,CAAwB94C,EAAA0B,EAAAs+F,EAAAn8F,EAAA29B,EAAAu+D,KAAuBj8F,EAC/C80C,EAAAv8C,EAAA2D,EAAA0B,EAAAs+F,IAAApnD,EAAAv8C,EAAA2D,EAAA0B,EAAAs+F,GACAt+F,GAAAygF,CAnCA,CAoCA,GACA3gD,CACA,CAKA,OAJAg9C,EAAA3hF,SAAA+9C,EAAA,YAAAA,EAAA,gBAAA7+B,OAAAyiE,IACA5lC,EAAAv8C,EAAAwH,EAAA2O,KAAAX,IAAA+mC,EAAAv8C,EAAAwH,EAAA29B,EAAA,EAAAu+D,GACAnlD,EAAA,QAAAjB,GAAAf,GACApX,GAAAowB,IAAAhX,EAAA,YAAAjB,IAAAf,EAAAv8C,EAAAwH,EAAAi1D,EAAAj8D,OAAAg+C,EAAArZ,EAAA,EAAAu+D,EAAAnnD,KACAgC,CACA,CAEA,SAAA6lD,GAAA36F,EAAA69B,GAGA,OAAAm8D,IAFAn8D,GAAA,IACAgX,MAAA,IAAiC,EACjC70C,EAAA69B,EACA,CAMA,SAAAu8D,GAAAQ,GACA,IAAA3L,EAAA,GACA4L,EAOA,SAAAD,GAEA,OAAAA,EAAAE,cAAAC,aAAA,mBAAAH,EAAAE,cAAAC,YAAAC,iBAAAJ,EAAAE,cAAAC,YAAAC,iBAEA,mBAAAA,iBAAAA,iBACA,IACA,CAbAC,CAAAL,GAGA,OAFAC,IAAA5L,EAAA4L,EAAAD,GAAAM,iBAAA,YACAjM,IAAAA,EAAA2L,EAAA3yC,MAAAgnC,SACA,SAAAA,CACA,CAWA,IAEAkM,GAaAC,GAfAC,IAEAF,GAAA,SAAA17E,GAEA,IAAA67E,EAAA77E,EACA1gB,QAAA,iBAAA6sC,OAAA7sC,QAAA,WACAA,QAAA,mBACAA,QAAA,sCAAAqzB,EAAAC,GAA4D,OAAA12B,MAAAi4B,SAAAvB,EAAA,OAAAz1B,KAAA,OAC5DmC,QAAA,2BACAA,QAAA,6BAGA,OAFAmtC,GAAAovD,EAAAv8F,QAAA,gBAGA,EAEAq8F,GAAA,CAEAG,IAAA,WACAC,MAAA,WACAC,KAAA,WACAC,MAAA,WACAC,QAAA,WACAC,QAAA,WACA,wBACA,6BACAC,IAAA,WAEAC,QAAA,4BAGA,SAAAzlG,EAAAwnC,GACA,IAGAqlD,EACA53C,EAEAywD,EACAC,EAGAnZ,EAAA1gE,EAVAmC,EAAAuZ,GAAA,GAEA37B,EAAAwgF,GAAArsF,GACA4iB,EAAA,GAEAgjF,EAAA,CAAen2F,KAAA,IAAQ0+D,EAAA,GAAAif,EAAA,EAGvB/uC,EAAA,GAAiBD,EAAA,GACjBK,EAAAxwB,EAAAuwB,MAAA,IAAkC,EAElCqnD,EAAA,CAAe9sF,MAAA,IACf+sF,EAAA,GAAAC,EAAA,EACAC,EAAA,GACA3gE,GAAA,EAAA9/B,GAAA,EAAAk3C,EAAA,CAA+Bj4C,EAAA,CAAIkD,EAAA,IAAA7D,EAAA,KAAqB3D,EAAA,CAAMwH,EAAA,EAAA7D,EAAA,IAC9DoiG,EAAA,EACAC,EAAA,GACA7jB,EAAA,GAAA8jB,EAAA,GACAxrC,EAAA,GAAAyrC,EAAA,EAAAC,EAAA,EACA/rB,EAAA,GACA11B,EAAA,CAAYq9B,MAAA,IACZqkB,EAAA,CAAgB,EAChBC,EAAA,QACA1iD,EAAA,GAAAl4C,EAAA,CAAkC,EAClC66F,EAAA,GAAAC,EAAA,EACAC,GAAA,EAAAC,GAAA,EACAxmG,EAAA,EAGA,IAFAmsF,GAAAzjB,UAAA,EACAh9D,EAAAA,EAAAnD,QAAA,0BAAAA,QAAA,mCACA8jF,EAAAF,GAAA1jB,KAAA/8D,WAAA2gF,EAAA,GAAAA,EAAA,GAAA9jF,QAAA,YAEA,sBACA,MAAA8jF,EAAA,IACA/vC,EAAAv8C,EAAA2D,GAAA44C,EAAAj4C,EAAAX,GAAA44C,EAAAv8C,EAAAwH,GAAA+0C,EAAAj4C,EAAAkD,EAAA+2C,EAAA,QAAAjB,GAAAf,GACAgC,EAAA,gBACAxwB,EAAAwnC,UAAA,GAAAxnC,EAAAwnC,WAAAhZ,EAAAv8C,EAAAwH,IACA+2C,EAAA,YAAAA,EAAA,QACAhC,EAAAv8C,EAAAwH,EAAAumB,EAAAwnC,UAAA,EACAhX,EAAA,QAAAjB,GAAAf,IAEA4lC,EAAA3hF,SAAA+9C,EAAA,WAAA4jC,GACA1nB,EAAAj6D,SAAA+9C,EAAA,SAAAkc,GACA+qC,EAAAj2F,KAAAi2F,EAAA,OAAAA,EAAAj2F,KACA,oBAAA0jC,MAAAA,KAAAC,UAAAsyD,GACAtnD,EAAA93C,KAAAo/F,EAAAj2F,MACA4uC,EAAAqnD,EAAAj2F,MAAAgvC,EACAkoD,GAAA,GAEA,MAAAna,EAAA,GAAAnsF,OAAAmsF,EAAA,GAAA9rF,OAAA,KACAglG,EAAA1wD,GAAAw3C,EAAA,OACAnnD,EAAA9/B,GAAA,EACAk3C,EAAAj4C,EAAAkD,EAAA+0C,EAAAj4C,EAAAX,EAAA,IAAuC44C,EAAAv8C,EAAAwH,EAAA+0C,EAAAv8C,EAAA2D,EAAA,EACvC46C,EAAAxwB,EAAAuwB,MAAA,IAAiC,EAAG6jC,EAAA,GACpC1nB,EAAA,GACAgsC,GAAA,GAEA,MAEA,sBACA,MAAAna,EAAA,KAAAyZ,IAAgCA,EAChC,MACA,wBACA,SAAAzZ,EAAA,IAAwBnnD,GAAA+gE,EAAYA,EAAA,EAAa,MAKjD,IAJAT,EAAA3wD,GAAAw3C,EAAA,QACA,MAAAnnD,EAAAsgE,EAAA,SAA2C,GAAAtgE,IAAAA,EAAA,IAC3C+gE,GAAAT,EAAA,4BAEA,OAAAxlG,EAAA,EAAgCA,EAAAimG,IAAajmG,EAAA8lG,EAAA,IAAAtrC,EAAAt1B,EAAAllC,GAAA,CAAsC0b,MAAAoqF,IACnF1gG,GAAA,EAAY,MACZ,yBACA,MAAAinF,EAAA,MAAAjnF,EACA0oB,EAAAixB,aACAjxB,EAAAuwB,OAAsBC,EAAApZ,KAAAoZ,EAAApZ,GAAA,IAAuBoZ,EAAApZ,GAAA9/B,GAAA,CAAYkC,EAAA,MACzDg3C,EAAA9B,GAAA,CAA0Bj1C,EAAA29B,EAAAxhC,EAAA0B,KAAQ,CAAMkC,EAAA,MAExCq+F,EAAA,GAAgBE,EAAA,GAChB,MACA,0BACA,SAAAxZ,EAAA,GAAAnsF,OAAAmsF,EAAA,GAAA9rF,OAAA,KACA6E,EACAsgG,EAAA7wD,GAAAw3C,EAAA,OACA6Z,EAAA9oE,SAAAsoE,EAAA,oCACA/5E,EAAA,CAAWrkB,EAAA,IAAA4qB,EAAA,MACXwzE,EAAAxqC,SAAA,GAAAptC,EAAA6xD,cAAAh0D,EAAA/nB,EAAAo3E,GAAAtlC,GAAAgwD,EAAAxqC,WACA,WAAAwqC,EAAA,SAAAA,EAAA,iBACA/5E,EAAArkB,EAAA,IAAiBqkB,EAAAuG,EAAAwjB,GAAAgwD,EAAA,qBACjB53E,EAAAuwB,OACAC,EAAApZ,KAAAoZ,EAAApZ,GAAA,IACAoZ,EAAApZ,GAAA9/B,GAAAumB,GAEA2yB,EAAA9B,GAAA,CAAuBj1C,EAAA29B,EAAAxhC,EAAA0B,KAAQumB,GAG/BvmB,GAAA8gG,EAAA,OACM,SAAA7Z,EAAA,IAENsZ,EAAA,GAAiBC,EAAA,EAAcC,EAAA,GAC/BK,EAAA,EACA,IAAAO,EAAAR,EAAA/gE,EAAA+gE,EAAA,EAAA/gE,EAQA,KAXA9/B,EAIAk3C,EAAAv8C,EAAA2D,IAAA44C,EAAAv8C,EAAA2D,EAAA0B,GACAA,EAAAk3C,EAAAj4C,EAAAX,IAAA44C,EAAAj4C,EAAAX,EAAA0B,GACA8/B,EAAAoX,EAAAj4C,EAAAkD,IAAA+0C,EAAAj4C,EAAAkD,EAAA29B,GACAuhE,EAAAnqD,EAAAv8C,EAAAwH,IAAA+0C,EAAAv8C,EAAAwH,EAAAk/F,GAEA/iD,EAAA,GAAoBl4C,EAAA,CAAa,EACjCmgB,EAAA,CAAWrkB,GAFXo+F,EAAA7wD,GAAAw3C,EAAA,QAEW,SAAAqZ,EAAA,cAAAxzE,EAAA,MACXpE,EAAA6xD,YASA,GARA+lB,EAAAxqC,UAAAwqC,EAAAxqC,QAAAxlB,GAAAgwD,EAAAxqC,UACAwqC,EAAA,kCAAAA,EAAA,gCAGAM,EAAA,CAAiB3hG,EAAA,CAAIkD,EAAA29B,EAAAxhC,EAAA0B,GAAQrF,EAAA,CAAKwH,EAAA29B,GAFlC9H,SAAAsoE,EAAA,sCAEkC,EAAAhiG,EAAA0B,GADlCg4B,SAAAsoE,EAAA,yCACkC,IAClC/5E,EAAAzmB,EAAAm4C,GAAA2oD,GACA7rB,EAAAh0E,KAAA,CAAA6/F,EAAAr6E,EAAAzmB,KAEAwgG,EAAAxqC,QAAAvvC,EAAA/nB,EAAAo3E,GAAA0qB,EAAAxqC,cACA,IAAAl7D,EAAA,EAAsBA,EAAAm6E,EAAA55E,SAAmBP,EACzCklC,GAAAi1C,EAAAn6E,GAAA,GAAAqE,EAAAkD,GAAA29B,GAAAi1C,EAAAn6E,GAAA,GAAAD,EAAAwH,GACAnC,GAAA+0E,EAAAn6E,GAAA,GAAAqE,EAAAX,GAAA0B,GAAA+0E,EAAAn6E,GAAA,GAAAD,EAAA2D,IACAioB,EAAAzmB,EAAAi1E,EAAAn6E,GAAA,IAaA,QAXA0lG,EAAA,2BAAAA,EAAA,0BAGAM,EAAA,CAAgB3hG,EAAA,CAAIkD,EAAA29B,EAAAxhC,EAAA0B,GAAQrF,EAAA,CAAKwH,EAAA29B,GAFjC9H,SAAAsoE,EAAA,+BAEiC,EAAAhiG,EAAA0B,GADjCg4B,SAAAsoE,EAAA,kCACiC,IACjCxjB,EAAA/7E,KAAA6/F,IAIAN,EAAA,6BAAAQ,EAAA9oE,SAAAsoE,EAAA,gCAGA/5E,EAAArkB,GACA,cAAAqkB,EAAArkB,EAAA,IAAiCqkB,EAAAuG,EAAAkkB,GAAAsvD,EAAA,kBAA2C,MAC5E,YACA,iBACA,eAAA/5E,EAAArkB,EAAA,IAAkCqkB,EAAAuG,EAAA0N,WAAA8lE,EAAA9sF,OAA8B,MAChE,WAAA+S,EAAArkB,EAAA,IAA8BqkB,EAAAuG,EAAAygB,EAAA+yD,EAAA,eAC9B53E,EAAAkxB,YAA6BrzB,EAAArkB,EAAA,IAAWqkB,EAAAuG,EAAAggB,EAAAvmB,EAAAuG,IACxCvG,EAAAspB,EAAA,SAAuB,MACvB,WAAAtpB,EAAArkB,EAAA,IAA8BqkB,EAAAuG,EAAAqgB,EAAAmzD,EAAA,qBAC9B53E,EAAAkxB,YAA4BrzB,EAAArkB,EAAA,IAAWqkB,EAAAuG,EAAAmgB,EAAA1mB,EAAAuG,IACvCvG,EAAAspB,EAAA,WAAyB,MACzB,aAAAtpB,EAAArkB,EAAA,IAAgCqkB,EAAAuG,EAAA0N,WAAA8lE,EAAA,SAAgC,MAChE,QACA,cAAA/5E,EAAArkB,GAAA,SAAAqkB,EAAArkB,GAAAqkB,EAAArkB,EAGS,UAAAhC,MAAA,0BAAAqmB,EAAArkB,GAFTqkB,EAAArkB,EAAA,IACA,MAAAo+F,EAAA,kBAA2CC,EAAAjwD,GAAAgwD,EAAA,iBAA2CG,EAAA,IAGtF,KAAM,CAWN,GAVAU,GAAA,EACA,MAAA56E,EAAArkB,IACAqkB,EAAAuG,EAAAyzE,GAAA,GACAE,EAAAtlG,SAAAorB,EAAAuZ,EAAA2gE,GACAU,EAAA,GAAAX,GAEAO,EAAA1gD,SAAA95B,EAAA1lB,EAAAkgG,GACAziD,EAAAnjD,OAAA,IAA+BorB,EAAAjoB,EAAAggD,EAAgBA,EAAA,IAC/CiiD,IAAA,IAAA73E,EAAA6wC,WAAAhzC,EAAAxoB,EAAAwiG,GACAY,IAAkB56E,EAAArkB,EAAA,WAAWqkB,EAAAuG,KAC7Bq0E,GAAAz4E,EAAAixB,eACAjxB,EAAAwnC,WAAAxnC,EAAAwnC,WAAApwB,GACA,QAAAwhE,EAAA,EAAwBA,EAAAT,IAAeS,EAAA,CAEvC,GADAR,EAAA9oE,SAAAsoE,EAAA,oCACA53E,EAAAuwB,MAGA,IAFAC,EAAApZ,EAAAwhE,KAAApoD,EAAApZ,EAAAwhE,GAAA,IACApoD,EAAApZ,EAAAwhE,GAAAthG,GAAA,GAAAshG,EAAA/6E,EAAAonB,GAAApnB,KACAu6E,EAAA,GAAA5nD,EAAApZ,EAAAwhE,GAAAthG,EAAA8gG,GAAAnzD,GAAApnB,QAGA,IADA2yB,EAAA9B,GAAA,CAAyBj1C,EAAA29B,EAAAwhE,EAAAhjG,EAAA0B,KAAcumB,IACvCu6E,EAAA,GAAA5nD,EAAA9B,GAAA,CAA8Cj1C,EAAA29B,EAAAwhE,EAAAhjG,EAAA0B,EAAA8gG,KAAwBnzD,GAAApnB,GAEtE2wB,EAAAv8C,EAAA2D,GAAA0B,IAAAk3C,EAAAv8C,EAAA2D,EAAA0B,EACA,CAIAA,IADA8gG,EAAA9oE,SAAAsoE,EAAA,qCACA,EAAqBQ,EAAA,EACrBv6E,EAAA,GACAg6E,EAAA,GAAiBE,EAAA,EACjB,CACAM,EAAA,CAAc,EACd,MAGA,eACA,oCACA,2BACA,cACA,aACA,sBACA,oBACA,SAAA9Z,EAAA,IAAoB,IAAAK,EAAAjqE,EAAAokB,OAAA,KAAAwlD,EAAA,sBAAAK,MACpB,MAAAL,EAAA,GAAAnsF,OAAAmsF,EAAA,GAAA9rF,OAAA,IAAAkiB,EAAAtc,KAAA,CAAAkmF,EAAA,QACA,MAEA,iBACA,SAAAA,EAAA,IACA,IAAAK,EAAAjqE,EAAAokB,OAAA,KAAAwlD,EAAA,sBAAAK,EACAlhF,EAAAlE,EAAAq+F,EACAE,EAAAtlG,SAAAiL,EAAA05B,EAAA2gE,GACAr6F,EAAA8+B,EAAA+7D,EACA3iD,EAAAv9C,KAAAqF,EACA,KACA,MAAA6gF,EAAA,GAAAnsF,OAAAmsF,EAAA,GAAA9rF,OAAA,IAAmDkiB,EAAAtc,KAAA,CAAAkmF,EAAA,QACnDga,EAAA,GAAkBC,EAAA,EAClBX,EAAA,GAAgBC,EAAA,EAAcC,EAAA,GAC9B,MAEA,cACA,MAAAxZ,EAAA,GAAsBga,EAAA36F,EAAArI,MAAAijG,EAAAja,EAAAtiF,OACtBu8F,EAAAja,EAAAtiF,MAAAsiF,EAAA,GAAA9rF,OACA,MAGA,qBACA,eACA,sBACA,8BACA,4BACA,4BACA,aACA,YACA,eACA,YACA,wBACA,iBACA,WACA,gBACA,sBACA,YACA,SAAA8rF,EAAA,IAAoB,IAAAK,EAAAjqE,EAAAokB,OAAA,KAAAwlD,EAAA,sBAAAK,MACpB,MAAAL,EAAA,GAAAnsF,OAAAmsF,EAAA,GAAA9rF,OAAA,IAAAkiB,EAAAtc,KAAA,CAAAkmF,EAAA,QACAsZ,EAAA,GAAgBC,EAAA,EAAcC,EAAA,GAC9B,MAEA,wBAEA,sBAEA,qBAeA,aACA,gBACA,uBAEA,oBACA,kBACA,YAEA,UACA,gBAEA,2BACA,uBACA,8BACA,2BACA,4BAUA,eAoBA,oBACA,cACA,iBAqBA,mBACA,sBACA,oBAEA,sBAEA,YACA,mBACA,wBACA,iBAEA,yBACA,2BACA,oBAEA,gBAEA,yBACA,2BACA,wBACA,kBACA,mBACA,uBACA,WACA,cACA,kBAEA,UACA,iBACA,WAQA,QAUA,WAEA,aACA,qBACA,WACA,kBAGA,mBACA,eAEA,gBACA,0BACA,yBACA,mBACA,oBACA,sBACA,aACA,iBACA,gBACA,uBAEA,8BACA,8BACA,4BAGA,uBACA,sBACA,sBACA,mBACA,sBACA,mBACA,2BACA,iBACA,qBACA,wBACA,oBACA,kBACA,yBACA,qBACA,+BACA,kBACA,sBACA,cACA,gBACA,oBACA,iBAGA,qBAGA,sBACA,oBACA,iBACA,gBACA,yBACA,mBACA,uBACA,qBAIA,kBAIA,kBACA,iBACA,WAGA,wBACA,gBACA,gBACA,wBAGA,uBACA,wBACA,qBACA,uBACA,uBACA,2BACA,0BACA,yBACA,wBACA,8BACA,2BACA,6BACA,iCACA,wBACA,uBACA,8BAIA,WAIA,2BACA,0BACA,eACA,iBAGA,iBACA,eAeA,uBACA,6BACA,yCA9PA,mBACA,uBACA,iBACA,iBACA,SAAAxZ,EAAA,IAEA,GADA0Z,EAAAN,EAAAn2F,MAAA0+D,GACA0e,EAAAjqE,EAAAokB,OAAA,KAAAwlD,EAAA,sBAAAK,MACM,MAAAL,EAAA,GAAAnsF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","sources":["webpack://dash_table/./node_modules/xlsx/dist/cpexcel.js","webpack://dash_table/./node_modules/xlsx/jszip.js","webpack://dash_table/./node_modules/xlsx/xlsx.js"],"sourcesContent":["/*! cpexcel.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/*jshint -W100 */\nvar cptable = {version:\"1.15.0\"};\ncptable[437] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[620] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàąçêëèïîćÄĄĘęłôöĆûùŚÖܢ٥śƒŹŻóÓńŃźż¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[737] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[850] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[852] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘ꬟Ⱥ«»░▒▓│┤ÁÂĚŞ╣║╗╝Żż┐└┴┬├─┼Ăă╚╔╩╦╠═╬¤đĐĎËďŇÍÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÝţ´­˝˛ˇ˘§÷¸°¨˙űŘř■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[857] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞ𿮬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ºªÊËÈ�ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµ�×ÚÛÙìÿ¯´­±�¾¶§÷¸°¨·¹³²■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[861] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèÐðÞÄÅÉæÆôöþûÝýÖÜø£Ø₧ƒáíóúÁÍÓÚ¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[865] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñѪº¿⌐¬½¼¡«¤░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[866] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[874] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€����…�����������‘’“”•–—�������� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[895] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ČüéďäĎŤčěĚĹÍľǪÄÁÉžŽôöÓůÚýÖÜŠĽÝŘťáíóúňŇŮÔšřŕŔ¼§«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[932] = (function(){ var d = [], e = {}, D = [], j;\nD[0] = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~���������������������������������。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚��������������������������������\".split(\"\");\nfor(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}\nD[129] = \"���������������������������������������������������������������� 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈〉《》「」『』【】+-±×�÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓�����������∈∋⊆⊇⊂⊃∪∩��������∧∨¬⇒⇔∀∃�����������∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬�������ʼn♯♭♪†‡¶����◯���\".split(\"\");\nfor(j = 0; j != D[129].length; ++j) if(D[129][j].charCodeAt(0) !== 0xFFFD) { e[D[129][j]] = 33024 + j; d[33024 + j] = D[129][j];}\nD[130] = \"�������������������������������������������������������������������������������0123456789�������ABCDEFGHIJKLMNOPQRSTUVWXYZ�������abcdefghijklmnopqrstuvwxyz����ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん��������������\".split(\"\");\nfor(j = 0; j != D[130].length; ++j) if(D[130][j].charCodeAt(0) !== 0xFFFD) { e[D[130][j]] = 33280 + j; d[33280 + j] = D[130][j];}\nD[131] = \"����������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミ�ムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ��������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�����������������������������������������\".split(\"\");\nfor(j = 0; j != D[131].length; ++j) if(D[131][j].charCodeAt(0) !== 0xFFFD) { e[D[131][j]] = 33536 + j; d[33536 + j] = D[131][j];}\nD[132] = \"����������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмн�опрстуфхцчшщъыьэюя�������������─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂�����������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[132].length; ++j) if(D[132][j].charCodeAt(0) !== 0xFFFD) { e[D[132][j]] = 33792 + j; d[33792 + j] = D[132][j];}\nD[135] = \"����������������������������������������������������������������①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ�㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡��������㍻�〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪���������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[135].length; ++j) if(D[135][j].charCodeAt(0) !== 0xFFFD) { e[D[135][j]] = 34560 + j; d[34560 + j] = D[135][j];}\nD[136] = \"���������������������������������������������������������������������������������������������������������������������������������������������������������������亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭���\".split(\"\");\nfor(j = 0; j != D[136].length; ++j) if(D[136][j].charCodeAt(0) !== 0xFFFD) { e[D[136][j]] = 34816 + j; d[34816 + j] = D[136][j];}\nD[137] = \"����������������������������������������������������������������院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円�園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改���\".split(\"\");\nfor(j = 0; j != D[137].length; ++j) if(D[137][j].charCodeAt(0) !== 0xFFFD) { e[D[137][j]] = 35072 + j; d[35072 + j] = D[137][j];}\nD[138] = \"����������������������������������������������������������������魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫�橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄���\".split(\"\");\nfor(j = 0; j != D[138].length; ++j) if(D[138][j].charCodeAt(0) !== 0xFFFD) { e[D[138][j]] = 35328 + j; d[35328 + j] = D[138][j];}\nD[139] = \"����������������������������������������������������������������機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救�朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈���\".split(\"\");\nfor(j = 0; j != D[139].length; ++j) if(D[139][j].charCodeAt(0) !== 0xFFFD) { e[D[139][j]] = 35584 + j; d[35584 + j] = D[139][j];}\nD[140] = \"����������������������������������������������������������������掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨�劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向���\".split(\"\");\nfor(j = 0; j != D[140].length; ++j) if(D[140][j].charCodeAt(0) !== 0xFFFD) { e[D[140][j]] = 35840 + j; d[35840 + j] = D[140][j];}\nD[141] = \"����������������������������������������������������������������后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降�項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷���\".split(\"\");\nfor(j = 0; j != D[141].length; ++j) if(D[141][j].charCodeAt(0) !== 0xFFFD) { e[D[141][j]] = 36096 + j; d[36096 + j] = D[141][j];}\nD[142] = \"����������������������������������������������������������������察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止�死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周���\".split(\"\");\nfor(j = 0; j != D[142].length; ++j) if(D[142][j].charCodeAt(0) !== 0xFFFD) { e[D[142][j]] = 36352 + j; d[36352 + j] = D[142][j];}\nD[143] = \"����������������������������������������������������������������宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳�準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾���\".split(\"\");\nfor(j = 0; j != D[143].length; ++j) if(D[143][j].charCodeAt(0) !== 0xFFFD) { e[D[143][j]] = 36608 + j; d[36608 + j] = D[143][j];}\nD[144] = \"����������������������������������������������������������������拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨�逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線���\".split(\"\");\nfor(j = 0; j != D[144].length; ++j) if(D[144][j].charCodeAt(0) !== 0xFFFD) { e[D[144][j]] = 36864 + j; d[36864 + j] = D[144][j];}\nD[145] = \"����������������������������������������������������������������繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻�操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只���\".split(\"\");\nfor(j = 0; j != D[145].length; ++j) if(D[145][j].charCodeAt(0) !== 0xFFFD) { e[D[145][j]] = 37120 + j; d[37120 + j] = D[145][j];}\nD[146] = \"����������������������������������������������������������������叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄�逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓���\".split(\"\");\nfor(j = 0; j != D[146].length; ++j) if(D[146][j].charCodeAt(0) !== 0xFFFD) { e[D[146][j]] = 37376 + j; d[37376 + j] = D[146][j];}\nD[147] = \"����������������������������������������������������������������邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬�凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入���\".split(\"\");\nfor(j = 0; j != D[147].length; ++j) if(D[147][j].charCodeAt(0) !== 0xFFFD) { e[D[147][j]] = 37632 + j; d[37632 + j] = D[147][j];}\nD[148] = \"����������������������������������������������������������������如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅�楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美���\".split(\"\");\nfor(j = 0; j != D[148].length; ++j) if(D[148][j].charCodeAt(0) !== 0xFFFD) { e[D[148][j]] = 37888 + j; d[37888 + j] = D[148][j];}\nD[149] = \"����������������������������������������������������������������鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷�斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋���\".split(\"\");\nfor(j = 0; j != D[149].length; ++j) if(D[149][j].charCodeAt(0) !== 0xFFFD) { e[D[149][j]] = 38144 + j; d[38144 + j] = D[149][j];}\nD[150] = \"����������������������������������������������������������������法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆�摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒���\".split(\"\");\nfor(j = 0; j != D[150].length; ++j) if(D[150][j].charCodeAt(0) !== 0xFFFD) { e[D[150][j]] = 38400 + j; d[38400 + j] = D[150][j];}\nD[151] = \"����������������������������������������������������������������諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲�沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯���\".split(\"\");\nfor(j = 0; j != D[151].length; ++j) if(D[151][j].charCodeAt(0) !== 0xFFFD) { e[D[151][j]] = 38656 + j; d[38656 + j] = D[151][j];}\nD[152] = \"����������������������������������������������������������������蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕��������������������������������������������弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲���\".split(\"\");\nfor(j = 0; j != D[152].length; ++j) if(D[152][j].charCodeAt(0) !== 0xFFFD) { e[D[152][j]] = 38912 + j; d[38912 + j] = D[152][j];}\nD[153] = \"����������������������������������������������������������������僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭�凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨���\".split(\"\");\nfor(j = 0; j != D[153].length; ++j) if(D[153][j].charCodeAt(0) !== 0xFFFD) { e[D[153][j]] = 39168 + j; d[39168 + j] = D[153][j];}\nD[154] = \"����������������������������������������������������������������咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸�噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩���\".split(\"\");\nfor(j = 0; j != D[154].length; ++j) if(D[154][j].charCodeAt(0) !== 0xFFFD) { e[D[154][j]] = 39424 + j; d[39424 + j] = D[154][j];}\nD[155] = \"����������������������������������������������������������������奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀�它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏���\".split(\"\");\nfor(j = 0; j != D[155].length; ++j) if(D[155][j].charCodeAt(0) !== 0xFFFD) { e[D[155][j]] = 39680 + j; d[39680 + j] = D[155][j];}\nD[156] = \"����������������������������������������������������������������廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠�怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛���\".split(\"\");\nfor(j = 0; j != D[156].length; ++j) if(D[156][j].charCodeAt(0) !== 0xFFFD) { e[D[156][j]] = 39936 + j; d[39936 + j] = D[156][j];}\nD[157] = \"����������������������������������������������������������������戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫�捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼���\".split(\"\");\nfor(j = 0; j != D[157].length; ++j) if(D[157][j].charCodeAt(0) !== 0xFFFD) { e[D[157][j]] = 40192 + j; d[40192 + j] = D[157][j];}\nD[158] = \"����������������������������������������������������������������曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎�梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣���\".split(\"\");\nfor(j = 0; j != D[158].length; ++j) if(D[158][j].charCodeAt(0) !== 0xFFFD) { e[D[158][j]] = 40448 + j; d[40448 + j] = D[158][j];}\nD[159] = \"����������������������������������������������������������������檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯�麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌���\".split(\"\");\nfor(j = 0; j != D[159].length; ++j) if(D[159][j].charCodeAt(0) !== 0xFFFD) { e[D[159][j]] = 40704 + j; d[40704 + j] = D[159][j];}\nD[224] = \"����������������������������������������������������������������漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝�烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱���\".split(\"\");\nfor(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}\nD[225] = \"����������������������������������������������������������������瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿�痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬���\".split(\"\");\nfor(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}\nD[226] = \"����������������������������������������������������������������磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰�窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆���\".split(\"\");\nfor(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}\nD[227] = \"����������������������������������������������������������������紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷�縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋���\".split(\"\");\nfor(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}\nD[228] = \"����������������������������������������������������������������隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤�艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈���\".split(\"\");\nfor(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}\nD[229] = \"����������������������������������������������������������������蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬�蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞���\".split(\"\");\nfor(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}\nD[230] = \"����������������������������������������������������������������襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧�諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊���\".split(\"\");\nfor(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}\nD[231] = \"����������������������������������������������������������������蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜�轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮���\".split(\"\");\nfor(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}\nD[232] = \"����������������������������������������������������������������錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙�閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰���\".split(\"\");\nfor(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}\nD[233] = \"����������������������������������������������������������������顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃�騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈���\".split(\"\");\nfor(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}\nD[234] = \"����������������������������������������������������������������鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯�黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙�������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}\nD[237] = \"����������������������������������������������������������������纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏�塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱���\".split(\"\");\nfor(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}\nD[238] = \"����������������������������������������������������������������犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙�蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑��ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ¬¦'"���\".split(\"\");\nfor(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}\nD[250] = \"����������������������������������������������������������������ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ¬¦'"㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊�兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯���\".split(\"\");\nfor(j = 0; j != D[250].length; ++j) if(D[250][j].charCodeAt(0) !== 0xFFFD) { e[D[250][j]] = 64000 + j; d[64000 + j] = D[250][j];}\nD[251] = \"����������������������������������������������������������������涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神�祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙���\".split(\"\");\nfor(j = 0; j != D[251].length; ++j) if(D[251][j].charCodeAt(0) !== 0xFFFD) { e[D[251][j]] = 64256 + j; d[64256 + j] = D[251][j];}\nD[252] = \"����������������������������������������������������������������髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[252].length; ++j) if(D[252][j].charCodeAt(0) !== 0xFFFD) { e[D[252][j]] = 64512 + j; d[64512 + j] = D[252][j];}\nreturn {\"enc\": e, \"dec\": d }; })();\ncptable[936] = (function(){ var d = [], e = {}, D = [], j;\nD[0] = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}\nD[129] = \"����������������������������������������������������������������丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪乫乬乭乮乯乲乴乵乶乷乸乹乺乻乼乽乿亀亁亂亃亄亅亇亊�亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂伃伄伅伆伇伈伋伌伒伓伔伕伖伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾伿佀佁佂佄佅佇佈佉佊佋佌佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢�\".split(\"\");\nfor(j = 0; j != D[129].length; ++j) if(D[129][j].charCodeAt(0) !== 0xFFFD) { e[D[129][j]] = 33024 + j; d[33024 + j] = D[129][j];}\nD[130] = \"����������������������������������������������������������������侤侫侭侰侱侲侳侴侶侷侸侹侺侻侼侽侾俀俁係俆俇俈俉俋俌俍俒俓俔俕俖俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿倀倁倂倃倄倅倆倇倈倉倊�個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯倰倱倲倳倴倵倶倷倸倹倻倽倿偀偁偂偄偅偆偉偊偋偍偐偑偒偓偔偖偗偘偙偛偝偞偟偠偡偢偣偤偦偧偨偩偪偫偭偮偯偰偱偲偳側偵偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎傏傐傑傒傓傔傕傖傗傘備傚傛傜傝傞傟傠傡傢傤傦傪傫傭傮傯傰傱傳傴債傶傷傸傹傼�\".split(\"\");\nfor(j = 0; j != D[130].length; ++j) if(D[130][j].charCodeAt(0) !== 0xFFFD) { e[D[130][j]] = 33280 + j; d[33280 + j] = D[130][j];}\nD[131] = \"����������������������������������������������������������������傽傾傿僀僁僂僃僄僅僆僇僈僉僊僋僌働僎僐僑僒僓僔僕僗僘僙僛僜僝僞僟僠僡僢僣僤僥僨僩僪僫僯僰僱僲僴僶僷僸價僺僼僽僾僿儀儁儂儃億儅儈�儉儊儌儍儎儏儐儑儓儔儕儖儗儘儙儚儛儜儝儞償儠儢儣儤儥儦儧儨儩優儫儬儭儮儯儰儱儲儳儴儵儶儷儸儹儺儻儼儽儾兂兇兊兌兎兏児兒兓兗兘兙兛兝兞兟兠兡兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦冧冨冩冪冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒凓凔凕凖凗�\".split(\"\");\nfor(j = 0; j != D[131].length; ++j) if(D[131][j].charCodeAt(0) !== 0xFFFD) { e[D[131][j]] = 33536 + j; d[33536 + j] = D[131][j];}\nD[132] = \"����������������������������������������������������������������凘凙凚凜凞凟凢凣凥処凧凨凩凪凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄剅剆則剈剉剋剎剏剒剓剕剗剘�剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳剴創剶剷剸剹剺剻剼剾劀劃劄劅劆劇劉劊劋劌劍劎劏劑劒劔劕劖劗劘劙劚劜劤劥劦劧劮劯劰労劵劶劷劸効劺劻劼劽勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務勚勛勜勝勞勠勡勢勣勥勦勧勨勩勪勫勬勭勮勯勱勲勳勴勵勶勷勸勻勼勽匁匂匃匄匇匉匊匋匌匎�\".split(\"\");\nfor(j = 0; j != D[132].length; ++j) if(D[132][j].charCodeAt(0) !== 0xFFFD) { e[D[132][j]] = 33792 + j; d[33792 + j] = D[132][j];}\nD[133] = \"����������������������������������������������������������������匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯匰匱匲匳匴匵匶匷匸匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏�厐厑厒厓厔厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯厰厱厲厳厴厵厷厸厹厺厼厽厾叀參叄叅叆叇収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝呞呟呠呡呣呥呧呩呪呫呬呭呮呯呰呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡�\".split(\"\");\nfor(j = 0; j != D[133].length; ++j) if(D[133][j].charCodeAt(0) !== 0xFFFD) { e[D[133][j]] = 34048 + j; d[34048 + j] = D[133][j];}\nD[134] = \"����������������������������������������������������������������咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠員哢哣哤哫哬哯哰哱哴哵哶哷哸哹哻哾唀唂唃唄唅唈唊唋唌唍唎唒唓唕唖唗唘唙唚唜唝唞唟唡唥唦�唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋啌啍啎問啑啒啓啔啗啘啙啚啛啝啞啟啠啢啣啨啩啫啯啰啱啲啳啴啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠喡喢喣喤喥喦喨喩喪喫喬喭單喯喰喲喴営喸喺喼喿嗀嗁嗂嗃嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗嗘嗙嗚嗛嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸嗹嗺嗻嗼嗿嘂嘃嘄嘅�\".split(\"\");\nfor(j = 0; j != D[134].length; ++j) if(D[134][j].charCodeAt(0) !== 0xFFFD) { e[D[134][j]] = 34304 + j; d[34304 + j] = D[134][j];}\nD[135] = \"����������������������������������������������������������������嘆嘇嘊嘋嘍嘐嘑嘒嘓嘔嘕嘖嘗嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀噁噂噃噄噅噆噇噈噉噊噋噏噐噑噒噓噕噖噚噛噝噞噟噠噡�噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽噾噿嚀嚁嚂嚃嚄嚇嚈嚉嚊嚋嚌嚍嚐嚑嚒嚔嚕嚖嚗嚘嚙嚚嚛嚜嚝嚞嚟嚠嚡嚢嚤嚥嚦嚧嚨嚩嚪嚫嚬嚭嚮嚰嚱嚲嚳嚴嚵嚶嚸嚹嚺嚻嚽嚾嚿囀囁囂囃囄囅囆囇囈囉囋囌囍囎囏囐囑囒囓囕囖囘囙囜団囥囦囧囨囩囪囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國圌圍圎圏圐圑�\".split(\"\");\nfor(j = 0; j != D[135].length; ++j) if(D[135][j].charCodeAt(0) !== 0xFFFD) { e[D[135][j]] = 34560 + j; d[34560 + j] = D[135][j];}\nD[136] = \"����������������������������������������������������������������園圓圔圕圖圗團圙圚圛圝圞圠圡圢圤圥圦圧圫圱圲圴圵圶圷圸圼圽圿坁坃坄坅坆坈坉坋坒坓坔坕坖坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀�垁垇垈垉垊垍垎垏垐垑垔垕垖垗垘垙垚垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹垺垻垼垽垾垿埀埁埄埅埆埇埈埉埊埌埍埐埑埓埖埗埛埜埞埡埢埣埥埦埧埨埩埪埫埬埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥堦堧堨堩堫堬堭堮堯報堲堳場堶堷堸堹堺堻堼堽�\".split(\"\");\nfor(j = 0; j != D[136].length; ++j) if(D[136][j].charCodeAt(0) !== 0xFFFD) { e[D[136][j]] = 34816 + j; d[34816 + j] = D[136][j];}\nD[137] = \"����������������������������������������������������������������堾堿塀塁塂塃塅塆塇塈塉塊塋塎塏塐塒塓塕塖塗塙塚塛塜塝塟塠塡塢塣塤塦塧塨塩塪塭塮塯塰塱塲塳塴塵塶塷塸塹塺塻塼塽塿墂墄墆墇墈墊墋墌�墍墎墏墐墑墔墕墖増墘墛墜墝墠墡墢墣墤墥墦墧墪墫墬墭墮墯墰墱墲墳墴墵墶墷墸墹墺墻墽墾墿壀壂壃壄壆壇壈壉壊壋壌壍壎壏壐壒壓壔壖壗壘壙壚壛壜壝壞壟壠壡壢壣壥壦壧壨壩壪壭壯壱売壴壵壷壸壺壻壼壽壾壿夀夁夃夅夆夈変夊夋夌夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻�\".split(\"\");\nfor(j = 0; j != D[137].length; ++j) if(D[137][j].charCodeAt(0) !== 0xFFFD) { e[D[137][j]] = 35072 + j; d[35072 + j] = D[137][j];}\nD[138] = \"����������������������������������������������������������������夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛奜奝奞奟奡奣奤奦奧奨奩奪奫奬奭奮奯奰奱奲奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦�妧妬妭妰妱妳妴妵妶妷妸妺妼妽妿姀姁姂姃姄姅姇姈姉姌姍姎姏姕姖姙姛姞姟姠姡姢姤姦姧姩姪姫姭姮姯姰姱姲姳姴姵姶姷姸姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪娫娬娭娮娯娰娳娵娷娸娹娺娻娽娾娿婁婂婃婄婅婇婈婋婌婍婎婏婐婑婒婓婔婖婗婘婙婛婜婝婞婟婠�\".split(\"\");\nfor(j = 0; j != D[138].length; ++j) if(D[138][j].charCodeAt(0) !== 0xFFFD) { e[D[138][j]] = 35328 + j; d[35328 + j] = D[138][j];}\nD[139] = \"����������������������������������������������������������������婡婣婤婥婦婨婩婫婬婭婮婯婰婱婲婳婸婹婻婼婽婾媀媁媂媃媄媅媆媇媈媉媊媋媌媍媎媏媐媑媓媔媕媖媗媘媙媜媝媞媟媠媡媢媣媤媥媦媧媨媩媫媬�媭媮媯媰媱媴媶媷媹媺媻媼媽媿嫀嫃嫄嫅嫆嫇嫈嫊嫋嫍嫎嫏嫐嫑嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬嫭嫮嫯嫰嫲嫳嫴嫵嫶嫷嫸嫹嫺嫻嫼嫽嫾嫿嬀嬁嬂嬃嬄嬅嬆嬇嬈嬊嬋嬌嬍嬎嬏嬐嬑嬒嬓嬔嬕嬘嬙嬚嬛嬜嬝嬞嬟嬠嬡嬢嬣嬤嬥嬦嬧嬨嬩嬪嬫嬬嬭嬮嬯嬰嬱嬳嬵嬶嬸嬹嬺嬻嬼嬽嬾嬿孁孂孃孄孅孆孇�\".split(\"\");\nfor(j = 0; j != D[139].length; ++j) if(D[139][j].charCodeAt(0) !== 0xFFFD) { e[D[139][j]] = 35584 + j; d[35584 + j] = D[139][j];}\nD[140] = \"����������������������������������������������������������������孈孉孊孋孌孍孎孏孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏�寑寔寕寖寗寘寙寚寛寜寠寢寣實寧審寪寫寬寭寯寱寲寳寴寵寶寷寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧屨屩屪屫屬屭屰屲屳屴屵屶屷屸屻屼屽屾岀岃岄岅岆岇岉岊岋岎岏岒岓岕岝岞岟岠岡岤岥岦岧岨�\".split(\"\");\nfor(j = 0; j != D[140].length; ++j) if(D[140][j].charCodeAt(0) !== 0xFFFD) { e[D[140][j]] = 35840 + j; d[35840 + j] = D[140][j];}\nD[141] = \"����������������������������������������������������������������岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅峆峇峈峉峊峌峍峎峏峐峑峓峔峕峖峗峘峚峛峜峝峞峟峠峢峣峧峩峫峬峮峯峱峲峳峴峵島峷峸峹峺峼峽峾峿崀�崁崄崅崈崉崊崋崌崍崏崐崑崒崓崕崗崘崙崚崜崝崟崠崡崢崣崥崨崪崫崬崯崰崱崲崳崵崶崷崸崹崺崻崼崿嵀嵁嵂嵃嵄嵅嵆嵈嵉嵍嵎嵏嵐嵑嵒嵓嵔嵕嵖嵗嵙嵚嵜嵞嵟嵠嵡嵢嵣嵤嵥嵦嵧嵨嵪嵭嵮嵰嵱嵲嵳嵵嵶嵷嵸嵹嵺嵻嵼嵽嵾嵿嶀嶁嶃嶄嶅嶆嶇嶈嶉嶊嶋嶌嶍嶎嶏嶐嶑嶒嶓嶔嶕嶖嶗嶘嶚嶛嶜嶞嶟嶠�\".split(\"\");\nfor(j = 0; j != D[141].length; ++j) if(D[141][j].charCodeAt(0) !== 0xFFFD) { e[D[141][j]] = 36096 + j; d[36096 + j] = D[141][j];}\nD[142] = \"����������������������������������������������������������������嶡嶢嶣嶤嶥嶦嶧嶨嶩嶪嶫嶬嶭嶮嶯嶰嶱嶲嶳嶴嶵嶶嶸嶹嶺嶻嶼嶽嶾嶿巀巁巂巃巄巆巇巈巉巊巋巌巎巏巐巑巒巓巔巕巖巗巘巙巚巜巟巠巣巤巪巬巭�巰巵巶巸巹巺巻巼巿帀帄帇帉帊帋帍帎帒帓帗帞帟帠帡帢帣帤帥帨帩帪師帬帯帰帲帳帴帵帶帹帺帾帿幀幁幃幆幇幈幉幊幋幍幎幏幐幑幒幓幖幗幘幙幚幜幝幟幠幣幤幥幦幧幨幩幪幫幬幭幮幯幰幱幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨庩庪庫庬庮庯庰庱庲庴庺庻庼庽庿廀廁廂廃廄廅�\".split(\"\");\nfor(j = 0; j != D[142].length; ++j) if(D[142][j].charCodeAt(0) !== 0xFFFD) { e[D[142][j]] = 36352 + j; d[36352 + j] = D[142][j];}\nD[143] = \"����������������������������������������������������������������廆廇廈廋廌廍廎廏廐廔廕廗廘廙廚廜廝廞廟廠廡廢廣廤廥廦廧廩廫廬廭廮廯廰廱廲廳廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤�弨弫弬弮弰弲弳弴張弶強弸弻弽弾弿彁彂彃彄彅彆彇彈彉彊彋彌彍彎彏彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢徣徤徥徦徧復徫徬徯徰徱徲徳徴徶徸徹徺徻徾徿忀忁忂忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇�\".split(\"\");\nfor(j = 0; j != D[143].length; ++j) if(D[143][j].charCodeAt(0) !== 0xFFFD) { e[D[143][j]] = 36608 + j; d[36608 + j] = D[143][j];}\nD[144] = \"����������������������������������������������������������������怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰怱怲怳怴怶怷怸怹怺怽怾恀恄恅恆恇恈恉恊恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀�悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽悾悿惀惁惂惃惄惇惈惉惌惍惎惏惐惒惓惔惖惗惙惛惞惡惢惣惤惥惪惱惲惵惷惸惻惼惽惾惿愂愃愄愅愇愊愋愌愐愑愒愓愔愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬愭愮愯愰愱愲愳愴愵愶愷愸愹愺愻愼愽愾慀慁慂慃慄慅慆�\".split(\"\");\nfor(j = 0; j != D[144].length; ++j) if(D[144][j].charCodeAt(0) !== 0xFFFD) { e[D[144][j]] = 36864 + j; d[36864 + j] = D[144][j];}\nD[145] = \"����������������������������������������������������������������慇慉態慍慏慐慒慓慔慖慗慘慙慚慛慜慞慟慠慡慣慤慥慦慩慪慫慬慭慮慯慱慲慳慴慶慸慹慺慻慼慽慾慿憀憁憂憃憄憅憆憇憈憉憊憌憍憏憐憑憒憓憕�憖憗憘憙憚憛憜憞憟憠憡憢憣憤憥憦憪憫憭憮憯憰憱憲憳憴憵憶憸憹憺憻憼憽憿懀懁懃懄懅懆懇應懌懍懎懏懐懓懕懖懗懘懙懚懛懜懝懞懟懠懡懢懣懤懥懧懨懩懪懫懬懭懮懯懰懱懲懳懴懶懷懸懹懺懻懼懽懾戀戁戂戃戄戅戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸戹戺戻戼扂扄扅扆扊�\".split(\"\");\nfor(j = 0; j != D[145].length; ++j) if(D[145][j].charCodeAt(0) !== 0xFFFD) { e[D[145][j]] = 37120 + j; d[37120 + j] = D[145][j];}\nD[146] = \"����������������������������������������������������������������扏扐払扖扗扙扚扜扝扞扟扠扡扢扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋抌抍抎抏抐抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁�拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳挴挵挶挷挸挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖捗捘捙捚捛捜捝捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙掚掛掜掝掞掟採掤掦掫掯掱掲掵掶掹掻掽掿揀�\".split(\"\");\nfor(j = 0; j != D[146].length; ++j) if(D[146][j].charCodeAt(0) !== 0xFFFD) { e[D[146][j]] = 37376 + j; d[37376 + j] = D[146][j];}\nD[147] = \"����������������������������������������������������������������揁揂揃揅揇揈揊揋揌揑揓揔揕揗揘揙揚換揜揝揟揢揤揥揦揧揨揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆搇搈搉搊損搎搑搒搕搖搗搘搙搚搝搟搢搣搤�搥搧搨搩搫搮搯搰搱搲搳搵搶搷搸搹搻搼搾摀摂摃摉摋摌摍摎摏摐摑摓摕摖摗摙摚摛摜摝摟摠摡摢摣摤摥摦摨摪摫摬摮摯摰摱摲摳摴摵摶摷摻摼摽摾摿撀撁撃撆撈撉撊撋撌撍撎撏撐撓撔撗撘撚撛撜撝撟撠撡撢撣撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆擇擈擉擊擋擌擏擑擓擔擕擖擙據�\".split(\"\");\nfor(j = 0; j != D[147].length; ++j) if(D[147][j].charCodeAt(0) !== 0xFFFD) { e[D[147][j]] = 37632 + j; d[37632 + j] = D[147][j];}\nD[148] = \"����������������������������������������������������������������擛擜擝擟擠擡擣擥擧擨擩擪擫擬擭擮擯擰擱擲擳擴擵擶擷擸擹擺擻擼擽擾擿攁攂攃攄攅攆攇攈攊攋攌攍攎攏攐攑攓攔攕攖攗攙攚攛攜攝攞攟攠攡�攢攣攤攦攧攨攩攪攬攭攰攱攲攳攷攺攼攽敀敁敂敃敄敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數敹敺敻敼敽敾敿斀斁斂斃斄斅斆斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱斲斳斴斵斶斷斸斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘旙旚旛旜旝旞旟旡旣旤旪旫�\".split(\"\");\nfor(j = 0; j != D[148].length; ++j) if(D[148][j].charCodeAt(0) !== 0xFFFD) { e[D[148][j]] = 37888 + j; d[37888 + j] = D[148][j];}\nD[149] = \"����������������������������������������������������������������旲旳旴旵旸旹旻旼旽旾旿昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷昸昹昺昻昽昿晀時晄晅晆晇晈晉晊晍晎晐晑晘�晙晛晜晝晞晠晢晣晥晧晩晪晫晬晭晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘暙暚暛暜暞暟暠暡暢暣暤暥暦暩暪暫暬暭暯暰暱暲暳暵暶暷暸暺暻暼暽暿曀曁曂曃曄曅曆曇曈曉曊曋曌曍曎曏曐曑曒曓曔曕曖曗曘曚曞曟曠曡曢曣曤曥曧曨曪曫曬曭曮曯曱曵曶書曺曻曽朁朂會�\".split(\"\");\nfor(j = 0; j != D[149].length; ++j) if(D[149][j].charCodeAt(0) !== 0xFFFD) { e[D[149][j]] = 38144 + j; d[38144 + j] = D[149][j];}\nD[150] = \"����������������������������������������������������������������朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠朡朢朣朤朥朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗杘杙杚杛杝杢杣杤杦杧杫杬杮東杴杶�杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹枺枻枼枽枾枿柀柂柅柆柇柈柉柊柋柌柍柎柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵柶柷柸柹柺査柼柾栁栂栃栄栆栍栐栒栔栕栘栙栚栛栜栞栟栠栢栣栤栥栦栧栨栫栬栭栮栯栰栱栴栵栶栺栻栿桇桋桍桏桒桖桗桘桙桚桛�\".split(\"\");\nfor(j = 0; j != D[150].length; ++j) if(D[150][j].charCodeAt(0) !== 0xFFFD) { e[D[150][j]] = 38400 + j; d[38400 + j] = D[150][j];}\nD[151] = \"����������������������������������������������������������������桜桝桞桟桪桬桭桮桯桰桱桲桳桵桸桹桺桻桼桽桾桿梀梂梄梇梈梉梊梋梌梍梎梐梑梒梔梕梖梘梙梚梛梜條梞梟梠梡梣梤梥梩梪梫梬梮梱梲梴梶梷梸�梹梺梻梼梽梾梿棁棃棄棅棆棇棈棊棌棎棏棐棑棓棔棖棗棙棛棜棝棞棟棡棢棤棥棦棧棨棩棪棫棬棭棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆椇椈椉椊椌椏椑椓椔椕椖椗椘椙椚椛検椝椞椡椢椣椥椦椧椨椩椪椫椬椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃楄楅楆楇楈楉楊楋楌楍楎楏楐楑楒楓楕楖楘楙楛楜楟�\".split(\"\");\nfor(j = 0; j != D[151].length; ++j) if(D[151][j].charCodeAt(0) !== 0xFFFD) { e[D[151][j]] = 38656 + j; d[38656 + j] = D[151][j];}\nD[152] = \"����������������������������������������������������������������楡楢楤楥楧楨楩楪楬業楯楰楲楳楴極楶楺楻楽楾楿榁榃榅榊榋榌榎榏榐榑榒榓榖榗榙榚榝榞榟榠榡榢榣榤榥榦榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽�榾榿槀槂槃槄槅槆槇槈槉構槍槏槑槒槓槕槖槗様槙槚槜槝槞槡槢槣槤槥槦槧槨槩槪槫槬槮槯槰槱槳槴槵槶槷槸槹槺槻槼槾樀樁樂樃樄樅樆樇樈樉樋樌樍樎樏樐樑樒樓樔樕樖標樚樛樜樝樞樠樢樣樤樥樦樧権樫樬樭樮樰樲樳樴樶樷樸樹樺樻樼樿橀橁橂橃橅橆橈橉橊橋橌橍橎橏橑橒橓橔橕橖橗橚�\".split(\"\");\nfor(j = 0; j != D[152].length; ++j) if(D[152][j].charCodeAt(0) !== 0xFFFD) { e[D[152][j]] = 38912 + j; d[38912 + j] = D[152][j];}\nD[153] = \"����������������������������������������������������������������橜橝橞機橠橢橣橤橦橧橨橩橪橫橬橭橮橯橰橲橳橴橵橶橷橸橺橻橽橾橿檁檂檃檅檆檇檈檉檊檋檌檍檏檒檓檔檕檖檘檙檚檛檜檝檞檟檡檢檣檤檥檦�檧檨檪檭檮檯檰檱檲檳檴檵檶檷檸檹檺檻檼檽檾檿櫀櫁櫂櫃櫄櫅櫆櫇櫈櫉櫊櫋櫌櫍櫎櫏櫐櫑櫒櫓櫔櫕櫖櫗櫘櫙櫚櫛櫜櫝櫞櫟櫠櫡櫢櫣櫤櫥櫦櫧櫨櫩櫪櫫櫬櫭櫮櫯櫰櫱櫲櫳櫴櫵櫶櫷櫸櫹櫺櫻櫼櫽櫾櫿欀欁欂欃欄欅欆欇欈欉權欋欌欍欎欏欐欑欒欓欔欕欖欗欘欙欚欛欜欝欞欟欥欦欨欩欪欫欬欭欮�\".split(\"\");\nfor(j = 0; j != D[153].length; ++j) if(D[153][j].charCodeAt(0) !== 0xFFFD) { e[D[153][j]] = 39168 + j; d[39168 + j] = D[153][j];}\nD[154] = \"����������������������������������������������������������������欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍歎歏歐歑歒歓歔歕歖歗歘歚歛歜歝歞歟歠歡歨歩歫歬歭歮歯歰歱歲歳歴歵歶歷歸歺歽歾歿殀殅殈�殌殎殏殐殑殔殕殗殘殙殜殝殞殟殠殢殣殤殥殦殧殨殩殫殬殭殮殯殰殱殲殶殸殹殺殻殼殽殾毀毃毄毆毇毈毉毊毌毎毐毑毘毚毜毝毞毟毠毢毣毤毥毦毧毨毩毬毭毮毰毱毲毴毶毷毸毺毻毼毾毿氀氁氂氃氄氈氉氊氋氌氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋汌汍汎汏汑汒汓汖汘�\".split(\"\");\nfor(j = 0; j != D[154].length; ++j) if(D[154][j].charCodeAt(0) !== 0xFFFD) { e[D[154][j]] = 39424 + j; d[39424 + j] = D[154][j];}\nD[155] = \"����������������������������������������������������������������汙汚汢汣汥汦汧汫汬汭汮汯汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘�泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟洠洡洢洣洤洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽浾浿涀涁涃涄涆涇涊涋涍涏涐涒涖涗涘涙涚涜涢涥涬涭涰涱涳涴涶涷涹涺涻涼涽涾淁淂淃淈淉淊�\".split(\"\");\nfor(j = 0; j != D[155].length; ++j) if(D[155][j].charCodeAt(0) !== 0xFFFD) { e[D[155][j]] = 39680 + j; d[39680 + j] = D[155][j];}\nD[156] = \"����������������������������������������������������������������淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽淾淿渀渁渂渃渄渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵�渶渷渹渻渼渽渾渿湀湁湂湅湆湇湈湉湊湋湌湏湐湑湒湕湗湙湚湜湝湞湠湡湢湣湤湥湦湧湨湩湪湬湭湯湰湱湲湳湴湵湶湷湸湹湺湻湼湽満溁溂溄溇溈溊溋溌溍溎溑溒溓溔溕準溗溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪滫滬滭滮滯�\".split(\"\");\nfor(j = 0; j != D[156].length; ++j) if(D[156][j].charCodeAt(0) !== 0xFFFD) { e[D[156][j]] = 39936 + j; d[39936 + j] = D[156][j];}\nD[157] = \"����������������������������������������������������������������滰滱滲滳滵滶滷滸滺滻滼滽滾滿漀漁漃漄漅漇漈漊漋漌漍漎漐漑漒漖漗漘漙漚漛漜漝漞漟漡漢漣漥漦漧漨漬漮漰漲漴漵漷漸漹漺漻漼漽漿潀潁潂�潃潄潅潈潉潊潌潎潏潐潑潒潓潔潕潖潗潙潚潛潝潟潠潡潣潤潥潧潨潩潪潫潬潯潰潱潳潵潶潷潹潻潽潾潿澀澁澂澃澅澆澇澊澋澏澐澑澒澓澔澕澖澗澘澙澚澛澝澞澟澠澢澣澤澥澦澨澩澪澫澬澭澮澯澰澱澲澴澵澷澸澺澻澼澽澾澿濁濃濄濅濆濇濈濊濋濌濍濎濏濐濓濔濕濖濗濘濙濚濛濜濝濟濢濣濤濥�\".split(\"\");\nfor(j = 0; j != D[157].length; ++j) if(D[157][j].charCodeAt(0) !== 0xFFFD) { e[D[157][j]] = 40192 + j; d[40192 + j] = D[157][j];}\nD[158] = \"����������������������������������������������������������������濦濧濨濩濪濫濬濭濰濱濲濳濴濵濶濷濸濹濺濻濼濽濾濿瀀瀁瀂瀃瀄瀅瀆瀇瀈瀉瀊瀋瀌瀍瀎瀏瀐瀒瀓瀔瀕瀖瀗瀘瀙瀜瀝瀞瀟瀠瀡瀢瀤瀥瀦瀧瀨瀩瀪�瀫瀬瀭瀮瀯瀰瀱瀲瀳瀴瀶瀷瀸瀺瀻瀼瀽瀾瀿灀灁灂灃灄灅灆灇灈灉灊灋灍灎灐灑灒灓灔灕灖灗灘灙灚灛灜灝灟灠灡灢灣灤灥灦灧灨灩灪灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞炟炠炡炢炣炤炥炦炧炨炩炪炰炲炴炵炶為炾炿烄烅烆烇烉烋烌烍烎烏烐烑烒烓烔烕烖烗烚�\".split(\"\");\nfor(j = 0; j != D[158].length; ++j) if(D[158][j].charCodeAt(0) !== 0xFFFD) { e[D[158][j]] = 40448 + j; d[40448 + j] = D[158][j];}\nD[159] = \"����������������������������������������������������������������烜烝烞烠烡烢烣烥烪烮烰烱烲烳烴烵烶烸烺烻烼烾烿焀焁焂焃焄焅焆焇焈焋焌焍焎焏焑焒焔焗焛焜焝焞焟焠無焢焣焤焥焧焨焩焪焫焬焭焮焲焳焴�焵焷焸焹焺焻焼焽焾焿煀煁煂煃煄煆煇煈煉煋煍煏煐煑煒煓煔煕煖煗煘煙煚煛煝煟煠煡煢煣煥煩煪煫煬煭煯煰煱煴煵煶煷煹煻煼煾煿熀熁熂熃熅熆熇熈熉熋熌熍熎熐熑熒熓熕熖熗熚熛熜熝熞熡熢熣熤熥熦熧熩熪熫熭熮熯熰熱熲熴熶熷熸熺熻熼熽熾熿燀燁燂燄燅燆燇燈燉燊燋燌燍燏燐燑燒燓�\".split(\"\");\nfor(j = 0; j != D[159].length; ++j) if(D[159][j].charCodeAt(0) !== 0xFFFD) { e[D[159][j]] = 40704 + j; d[40704 + j] = D[159][j];}\nD[160] = \"����������������������������������������������������������������燖燗燘燙燚燛燜燝燞營燡燢燣燤燦燨燩燪燫燬燭燯燰燱燲燳燴燵燶燷燸燺燻燼燽燾燿爀爁爂爃爄爅爇爈爉爊爋爌爍爎爏爐爑爒爓爔爕爖爗爘爙爚�爛爜爞爟爠爡爢爣爤爥爦爧爩爫爭爮爯爲爳爴爺爼爾牀牁牂牃牄牅牆牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅犆犇犈犉犌犎犐犑犓犔犕犖犗犘犙犚犛犜犝犞犠犡犢犣犤犥犦犧犨犩犪犫犮犱犲犳犵犺犻犼犽犾犿狀狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛�\".split(\"\");\nfor(j = 0; j != D[160].length; ++j) if(D[160][j].charCodeAt(0) !== 0xFFFD) { e[D[160][j]] = 40960 + j; d[40960 + j] = D[160][j];}\nD[161] = \"����������������������������������������������������������������������������������������������������������������������������������������������������������������� 、。·ˉˇ¨〃々—~‖…‘’“”〔〕〈〉《》「」『』〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓�\".split(\"\");\nfor(j = 0; j != D[161].length; ++j) if(D[161][j].charCodeAt(0) !== 0xFFFD) { e[D[161][j]] = 41216 + j; d[41216 + j] = D[161][j];}\nD[162] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ������⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩��㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩��ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ���\".split(\"\");\nfor(j = 0; j != D[162].length; ++j) if(D[162][j].charCodeAt(0) !== 0xFFFD) { e[D[162][j]] = 41472 + j; d[41472 + j] = D[162][j];}\nD[163] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������!"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�\".split(\"\");\nfor(j = 0; j != D[163].length; ++j) if(D[163][j].charCodeAt(0) !== 0xFFFD) { e[D[163][j]] = 41728 + j; d[41728 + j] = D[163][j];}\nD[164] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������\".split(\"\");\nfor(j = 0; j != D[164].length; ++j) if(D[164][j].charCodeAt(0) !== 0xFFFD) { e[D[164][j]] = 41984 + j; d[41984 + j] = D[164][j];}\nD[165] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������\".split(\"\");\nfor(j = 0; j != D[165].length; ++j) if(D[165][j].charCodeAt(0) !== 0xFFFD) { e[D[165][j]] = 42240 + j; d[42240 + j] = D[165][j];}\nD[166] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�������︵︶︹︺︿﹀︽︾﹁﹂﹃﹄��︻︼︷︸︱�︳︴����������\".split(\"\");\nfor(j = 0; j != D[166].length; ++j) if(D[166][j].charCodeAt(0) !== 0xFFFD) { e[D[166][j]] = 42496 + j; d[42496 + j] = D[166][j];}\nD[167] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������\".split(\"\");\nfor(j = 0; j != D[167].length; ++j) if(D[167][j].charCodeAt(0) !== 0xFFFD) { e[D[167][j]] = 42752 + j; d[42752 + j] = D[167][j];}\nD[168] = \"����������������������������������������������������������������ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳▁▂▃▄▅▆▇�█▉▊▋▌▍▎▏▓▔▕▼▽◢◣◤◥☉⊕〒〝〞�����������āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑ�ńň�ɡ����ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ����������������������\".split(\"\");\nfor(j = 0; j != D[168].length; ++j) if(D[168][j].charCodeAt(0) !== 0xFFFD) { e[D[168][j]] = 43008 + j; d[43008 + j] = D[168][j];}\nD[169] = \"����������������������������������������������������������������〡〢〣〤〥〦〧〨〩㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰¬¦�℡㈱�‐���ー゛゜ヽヾ〆ゝゞ﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹔﹕﹖﹗﹙﹚﹛﹜﹝﹞﹟﹠﹡�﹢﹣﹤﹥﹦﹨﹩﹪﹫�������������〇�������������─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋����������������\".split(\"\");\nfor(j = 0; j != D[169].length; ++j) if(D[169][j].charCodeAt(0) !== 0xFFFD) { e[D[169][j]] = 43264 + j; d[43264 + j] = D[169][j];}\nD[170] = \"����������������������������������������������������������������狜狝狟狢狣狤狥狦狧狪狫狵狶狹狽狾狿猀猂猄猅猆猇猈猉猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀獁獂獃獄獅獆獇獈�獉獊獋獌獎獏獑獓獔獕獖獘獙獚獛獜獝獞獟獡獢獣獤獥獦獧獨獩獪獫獮獰獱�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[170].length; ++j) if(D[170][j].charCodeAt(0) !== 0xFFFD) { e[D[170][j]] = 43520 + j; d[43520 + j] = D[170][j];}\nD[171] = \"����������������������������������������������������������������獲獳獴獵獶獷獸獹獺獻獼獽獿玀玁玂玃玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣玤玥玦玧玨玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃珄珅珆珇�珋珌珎珒珓珔珕珖珗珘珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳珴珵珶珷�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[171].length; ++j) if(D[171][j].charCodeAt(0) !== 0xFFFD) { e[D[171][j]] = 43776 + j; d[43776 + j] = D[171][j];}\nD[172] = \"����������������������������������������������������������������珸珹珺珻珼珽現珿琀琁琂琄琇琈琋琌琍琎琑琒琓琔琕琖琗琘琙琜琝琞琟琠琡琣琤琧琩琫琭琯琱琲琷琸琹琺琻琽琾琿瑀瑂瑃瑄瑅瑆瑇瑈瑉瑊瑋瑌瑍�瑎瑏瑐瑑瑒瑓瑔瑖瑘瑝瑠瑡瑢瑣瑤瑥瑦瑧瑨瑩瑪瑫瑬瑮瑯瑱瑲瑳瑴瑵瑸瑹瑺�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[172].length; ++j) if(D[172][j].charCodeAt(0) !== 0xFFFD) { e[D[172][j]] = 44032 + j; d[44032 + j] = D[172][j];}\nD[173] = \"����������������������������������������������������������������瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑璒璓璔璕璖璗璘璙璚璛璝璟璠璡璢璣璤璥璦璪璫璬璭璮璯環璱璲璳璴璵璶璷璸璹璻璼璽璾璿瓀瓁瓂瓃瓄瓅瓆瓇�瓈瓉瓊瓋瓌瓍瓎瓏瓐瓑瓓瓔瓕瓖瓗瓘瓙瓚瓛瓝瓟瓡瓥瓧瓨瓩瓪瓫瓬瓭瓰瓱瓲�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[173].length; ++j) if(D[173][j].charCodeAt(0) !== 0xFFFD) { e[D[173][j]] = 44288 + j; d[44288 + j] = D[173][j];}\nD[174] = \"����������������������������������������������������������������瓳瓵瓸瓹瓺瓻瓼瓽瓾甀甁甂甃甅甆甇甈甉甊甋甌甎甐甒甔甕甖甗甛甝甞甠甡產産甤甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘�畝畞畟畠畡畢畣畤畧畨畩畫畬畭畮畯異畱畳畵當畷畺畻畼畽畾疀疁疂疄疅疇�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[174].length; ++j) if(D[174][j].charCodeAt(0) !== 0xFFFD) { e[D[174][j]] = 44544 + j; d[44544 + j] = D[174][j];}\nD[175] = \"����������������������������������������������������������������疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦疧疨疩疪疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇�瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[175].length; ++j) if(D[175][j].charCodeAt(0) !== 0xFFFD) { e[D[175][j]] = 44800 + j; d[44800 + j] = D[175][j];}\nD[176] = \"����������������������������������������������������������������癅癆癇癈癉癊癋癎癏癐癑癒癓癕癗癘癙癚癛癝癟癠癡癢癤癥癦癧癨癩癪癬癭癮癰癱癲癳癴癵癶癷癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛�皜皝皞皟皠皡皢皣皥皦皧皨皩皪皫皬皭皯皰皳皵皶皷皸皹皺皻皼皽皾盀盁盃啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥�\".split(\"\");\nfor(j = 0; j != D[176].length; ++j) if(D[176][j].charCodeAt(0) !== 0xFFFD) { e[D[176][j]] = 45056 + j; d[45056 + j] = D[176][j];}\nD[177] = \"����������������������������������������������������������������盄盇盉盋盌盓盕盙盚盜盝盞盠盡盢監盤盦盧盨盩盪盫盬盭盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎眏眐眑眒眓眔眕眖眗眘眛眜眝眞眡眣眤眥眧眪眫�眬眮眰眱眲眳眴眹眻眽眾眿睂睄睅睆睈睉睊睋睌睍睎睏睒睓睔睕睖睗睘睙睜薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳�\".split(\"\");\nfor(j = 0; j != D[177].length; ++j) if(D[177][j].charCodeAt(0) !== 0xFFFD) { e[D[177][j]] = 45312 + j; d[45312 + j] = D[177][j];}\nD[178] = \"����������������������������������������������������������������睝睞睟睠睤睧睩睪睭睮睯睰睱睲睳睴睵睶睷睸睺睻睼瞁瞂瞃瞆瞇瞈瞉瞊瞋瞏瞐瞓瞔瞕瞖瞗瞘瞙瞚瞛瞜瞝瞞瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶瞷瞸瞹瞺�瞼瞾矀矁矂矃矄矅矆矇矈矉矊矋矌矎矏矐矑矒矓矔矕矖矘矙矚矝矞矟矠矡矤病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖�\".split(\"\");\nfor(j = 0; j != D[178].length; ++j) if(D[178][j].charCodeAt(0) !== 0xFFFD) { e[D[178][j]] = 45568 + j; d[45568 + j] = D[178][j];}\nD[179] = \"����������������������������������������������������������������矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃砄砅砆砇砈砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚�硛硜硞硟硠硡硢硣硤硥硦硧硨硩硯硰硱硲硳硴硵硶硸硹硺硻硽硾硿碀碁碂碃场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚�\".split(\"\");\nfor(j = 0; j != D[179].length; ++j) if(D[179][j].charCodeAt(0) !== 0xFFFD) { e[D[179][j]] = 45824 + j; d[45824 + j] = D[179][j];}\nD[180] = \"����������������������������������������������������������������碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨碩碪碫碬碭碮碯碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚磛磜磝磞磟磠磡磢磣�磤磥磦磧磩磪磫磭磮磯磰磱磳磵磶磸磹磻磼磽磾磿礀礂礃礄礆礇礈礉礊礋礌础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮�\".split(\"\");\nfor(j = 0; j != D[180].length; ++j) if(D[180][j].charCodeAt(0) !== 0xFFFD) { e[D[180][j]] = 46080 + j; d[46080 + j] = D[180][j];}\nD[181] = \"����������������������������������������������������������������礍礎礏礐礑礒礔礕礖礗礘礙礚礛礜礝礟礠礡礢礣礥礦礧礨礩礪礫礬礭礮礯礰礱礲礳礵礶礷礸礹礽礿祂祃祄祅祇祊祋祌祍祎祏祐祑祒祔祕祘祙祡祣�祤祦祩祪祫祬祮祰祱祲祳祴祵祶祹祻祼祽祾祿禂禃禆禇禈禉禋禌禍禎禐禑禒怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠�\".split(\"\");\nfor(j = 0; j != D[181].length; ++j) if(D[181][j].charCodeAt(0) !== 0xFFFD) { e[D[181][j]] = 46336 + j; d[46336 + j] = D[181][j];}\nD[182] = \"����������������������������������������������������������������禓禔禕禖禗禘禙禛禜禝禞禟禠禡禢禣禤禥禦禨禩禪禫禬禭禮禯禰禱禲禴禵禶禷禸禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙秚秛秜秝秞秠秡秢秥秨秪�秬秮秱秲秳秴秵秶秷秹秺秼秾秿稁稄稅稇稈稉稊稌稏稐稑稒稓稕稖稘稙稛稜丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二�\".split(\"\");\nfor(j = 0; j != D[182].length; ++j) if(D[182][j].charCodeAt(0) !== 0xFFFD) { e[D[182][j]] = 46592 + j; d[46592 + j] = D[182][j];}\nD[183] = \"����������������������������������������������������������������稝稟稡稢稤稥稦稧稨稩稪稫稬稭種稯稰稱稲稴稵稶稸稺稾穀穁穂穃穄穅穇穈穉穊穋穌積穎穏穐穒穓穔穕穖穘穙穚穛穜穝穞穟穠穡穢穣穤穥穦穧穨�穩穪穫穬穭穮穯穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服�\".split(\"\");\nfor(j = 0; j != D[183].length; ++j) if(D[183][j].charCodeAt(0) !== 0xFFFD) { e[D[183][j]] = 46848 + j; d[46848 + j] = D[183][j];}\nD[184] = \"����������������������������������������������������������������窣窤窧窩窪窫窮窯窰窱窲窴窵窶窷窸窹窺窻窼窽窾竀竁竂竃竄竅竆竇竈竉竊竌竍竎竏竐竑竒竓竔竕竗竘竚竛竜竝竡竢竤竧竨竩竪竫竬竮竰竱竲竳�竴竵競竷竸竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹�\".split(\"\");\nfor(j = 0; j != D[184].length; ++j) if(D[184][j].charCodeAt(0) !== 0xFFFD) { e[D[184][j]] = 47104 + j; d[47104 + j] = D[184][j];}\nD[185] = \"����������������������������������������������������������������笯笰笲笴笵笶笷笹笻笽笿筀筁筂筃筄筆筈筊筍筎筓筕筗筙筜筞筟筡筣筤筥筦筧筨筩筪筫筬筭筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆箇箈箉箊箋箌箎箏�箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹箺箻箼箽箾箿節篂篃範埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈�\".split(\"\");\nfor(j = 0; j != D[185].length; ++j) if(D[185][j].charCodeAt(0) !== 0xFFFD) { e[D[185][j]] = 47360 + j; d[47360 + j] = D[185][j];}\nD[186] = \"����������������������������������������������������������������篅篈築篊篋篍篎篏篐篒篔篕篖篗篘篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲篳篴篵篶篸篹篺篻篽篿簀簁簂簃簄簅簆簈簉簊簍簎簐簑簒簓簔簕簗簘簙�簚簛簜簝簞簠簡簢簣簤簥簨簩簫簬簭簮簯簰簱簲簳簴簵簶簷簹簺簻簼簽簾籂骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖�\".split(\"\");\nfor(j = 0; j != D[186].length; ++j) if(D[186][j].charCodeAt(0) !== 0xFFFD) { e[D[186][j]] = 47616 + j; d[47616 + j] = D[186][j];}\nD[187] = \"����������������������������������������������������������������籃籄籅籆籇籈籉籊籋籌籎籏籐籑籒籓籔籕籖籗籘籙籚籛籜籝籞籟籠籡籢籣籤籥籦籧籨籩籪籫籬籭籮籯籰籱籲籵籶籷籸籹籺籾籿粀粁粂粃粄粅粆粇�粈粊粋粌粍粎粏粐粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴粵粶粷粸粺粻弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕�\".split(\"\");\nfor(j = 0; j != D[187].length; ++j) if(D[187][j].charCodeAt(0) !== 0xFFFD) { e[D[187][j]] = 47872 + j; d[47872 + j] = D[187][j];}\nD[188] = \"����������������������������������������������������������������粿糀糂糃糄糆糉糋糎糏糐糑糒糓糔糘糚糛糝糞糡糢糣糤糥糦糧糩糪糫糬糭糮糰糱糲糳糴糵糶糷糹糺糼糽糾糿紀紁紂紃約紅紆紇紈紉紋紌納紎紏紐�紑紒紓純紕紖紗紘紙級紛紜紝紞紟紡紣紤紥紦紨紩紪紬紭紮細紱紲紳紴紵紶肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件�\".split(\"\");\nfor(j = 0; j != D[188].length; ++j) if(D[188][j].charCodeAt(0) !== 0xFFFD) { e[D[188][j]] = 48128 + j; d[48128 + j] = D[188][j];}\nD[189] = \"����������������������������������������������������������������紷紸紹紺紻紼紽紾紿絀絁終絃組絅絆絇絈絉絊絋経絍絎絏結絑絒絓絔絕絖絗絘絙絚絛絜絝絞絟絠絡絢絣絤絥給絧絨絩絪絫絬絭絯絰統絲絳絴絵絶�絸絹絺絻絼絽絾絿綀綁綂綃綄綅綆綇綈綉綊綋綌綍綎綏綐綑綒經綔綕綖綗綘健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸�\".split(\"\");\nfor(j = 0; j != D[189].length; ++j) if(D[189][j].charCodeAt(0) !== 0xFFFD) { e[D[189][j]] = 48384 + j; d[48384 + j] = D[189][j];}\nD[190] = \"����������������������������������������������������������������継続綛綜綝綞綟綠綡綢綣綤綥綧綨綩綪綫綬維綯綰綱網綳綴綵綶綷綸綹綺綻綼綽綾綿緀緁緂緃緄緅緆緇緈緉緊緋緌緍緎総緐緑緒緓緔緕緖緗緘緙�線緛緜緝緞緟締緡緢緣緤緥緦緧編緩緪緫緬緭緮緯緰緱緲緳練緵緶緷緸緹緺尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻�\".split(\"\");\nfor(j = 0; j != D[190].length; ++j) if(D[190][j].charCodeAt(0) !== 0xFFFD) { e[D[190][j]] = 48640 + j; d[48640 + j] = D[190][j];}\nD[191] = \"����������������������������������������������������������������緻緼緽緾緿縀縁縂縃縄縅縆縇縈縉縊縋縌縍縎縏縐縑縒縓縔縕縖縗縘縙縚縛縜縝縞縟縠縡縢縣縤縥縦縧縨縩縪縫縬縭縮縯縰縱縲縳縴縵縶縷縸縹�縺縼總績縿繀繂繃繄繅繆繈繉繊繋繌繍繎繏繐繑繒繓織繕繖繗繘繙繚繛繜繝俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀�\".split(\"\");\nfor(j = 0; j != D[191].length; ++j) if(D[191][j].charCodeAt(0) !== 0xFFFD) { e[D[191][j]] = 48896 + j; d[48896 + j] = D[191][j];}\nD[192] = \"����������������������������������������������������������������繞繟繠繡繢繣繤繥繦繧繨繩繪繫繬繭繮繯繰繱繲繳繴繵繶繷繸繹繺繻繼繽繾繿纀纁纃纄纅纆纇纈纉纊纋續纍纎纏纐纑纒纓纔纕纖纗纘纙纚纜纝纞�纮纴纻纼绖绤绬绹缊缐缞缷缹缻缼缽缾缿罀罁罃罆罇罈罉罊罋罌罍罎罏罒罓馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐�\".split(\"\");\nfor(j = 0; j != D[192].length; ++j) if(D[192][j].charCodeAt(0) !== 0xFFFD) { e[D[192][j]] = 49152 + j; d[49152 + j] = D[192][j];}\nD[193] = \"����������������������������������������������������������������罖罙罛罜罝罞罠罣罤罥罦罧罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂羃羄羅羆羇羈羉羋羍羏羐羑羒羓羕羖羗羘羙羛羜羠羢羣羥羦羨義羪羫羬羭羮羱�羳羴羵羶羷羺羻羾翀翂翃翄翆翇翈翉翋翍翏翐翑習翓翖翗翙翚翛翜翝翞翢翣痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿�\".split(\"\");\nfor(j = 0; j != D[193].length; ++j) if(D[193][j].charCodeAt(0) !== 0xFFFD) { e[D[193][j]] = 49408 + j; d[49408 + j] = D[193][j];}\nD[194] = \"����������������������������������������������������������������翤翧翨翪翫翬翭翯翲翴翵翶翷翸翹翺翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫耬耭耮耯耰耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗�聙聛聜聝聞聟聠聡聢聣聤聥聦聧聨聫聬聭聮聯聰聲聳聴聵聶職聸聹聺聻聼聽隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫�\".split(\"\");\nfor(j = 0; j != D[194].length; ++j) if(D[194][j].charCodeAt(0) !== 0xFFFD) { e[D[194][j]] = 49664 + j; d[49664 + j] = D[194][j];}\nD[195] = \"����������������������������������������������������������������聾肁肂肅肈肊肍肎肏肐肑肒肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇胈胉胊胋胏胐胑胒胓胔胕胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋�脌脕脗脙脛脜脝脟脠脡脢脣脤脥脦脧脨脩脪脫脭脮脰脳脴脵脷脹脺脻脼脽脿谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸�\".split(\"\");\nfor(j = 0; j != D[195].length; ++j) if(D[195][j].charCodeAt(0) !== 0xFFFD) { e[D[195][j]] = 49920 + j; d[49920 + j] = D[195][j];}\nD[196] = \"����������������������������������������������������������������腀腁腂腃腄腅腇腉腍腎腏腒腖腗腘腛腜腝腞腟腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃膄膅膆膇膉膋膌膍膎膐膒膓膔膕膖膗膙膚膞膟膠膡膢膤膥�膧膩膫膬膭膮膯膰膱膲膴膵膶膷膸膹膼膽膾膿臄臅臇臈臉臋臍臎臏臐臑臒臓摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁�\".split(\"\");\nfor(j = 0; j != D[196].length; ++j) if(D[196][j].charCodeAt(0) !== 0xFFFD) { e[D[196][j]] = 50176 + j; d[50176 + j] = D[196][j];}\nD[197] = \"����������������������������������������������������������������臔臕臖臗臘臙臚臛臜臝臞臟臠臡臢臤臥臦臨臩臫臮臯臰臱臲臵臶臷臸臹臺臽臿舃與興舉舊舋舎舏舑舓舕舖舗舘舙舚舝舠舤舥舦舧舩舮舲舺舼舽舿�艀艁艂艃艅艆艈艊艌艍艎艐艑艒艓艔艕艖艗艙艛艜艝艞艠艡艢艣艤艥艦艧艩拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗�\".split(\"\");\nfor(j = 0; j != D[197].length; ++j) if(D[197][j].charCodeAt(0) !== 0xFFFD) { e[D[197][j]] = 50432 + j; d[50432 + j] = D[197][j];}\nD[198] = \"����������������������������������������������������������������艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸�苺苼苽苾苿茀茊茋茍茐茒茓茖茘茙茝茞茟茠茡茢茣茤茥茦茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐�\".split(\"\");\nfor(j = 0; j != D[198].length; ++j) if(D[198][j].charCodeAt(0) !== 0xFFFD) { e[D[198][j]] = 50688 + j; d[50688 + j] = D[198][j];}\nD[199] = \"����������������������������������������������������������������茾茿荁荂荄荅荈荊荋荌荍荎荓荕荖荗荘荙荝荢荰荱荲荳荴荵荶荹荺荾荿莀莁莂莃莄莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡莢莣莤莥莦莧莬莭莮�莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠�\".split(\"\");\nfor(j = 0; j != D[199].length; ++j) if(D[199][j].charCodeAt(0) !== 0xFFFD) { e[D[199][j]] = 50944 + j; d[50944 + j] = D[199][j];}\nD[200] = \"����������������������������������������������������������������菮華菳菴菵菶菷菺菻菼菾菿萀萂萅萇萈萉萊萐萒萓萔萕萖萗萙萚萛萞萟萠萡萢萣萩萪萫萬萭萮萯萰萲萳萴萵萶萷萹萺萻萾萿葀葁葂葃葄葅葇葈葉�葊葋葌葍葎葏葐葒葓葔葕葖葘葝葞葟葠葢葤葥葦葧葨葪葮葯葰葲葴葷葹葻葼取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁�\".split(\"\");\nfor(j = 0; j != D[200].length; ++j) if(D[200][j].charCodeAt(0) !== 0xFFFD) { e[D[200][j]] = 51200 + j; d[51200 + j] = D[200][j];}\nD[201] = \"����������������������������������������������������������������葽葾葿蒀蒁蒃蒄蒅蒆蒊蒍蒏蒐蒑蒒蒓蒔蒕蒖蒘蒚蒛蒝蒞蒟蒠蒢蒣蒤蒥蒦蒧蒨蒩蒪蒫蒬蒭蒮蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗�蓘蓙蓚蓛蓜蓞蓡蓢蓤蓧蓨蓩蓪蓫蓭蓮蓯蓱蓲蓳蓴蓵蓶蓷蓸蓹蓺蓻蓽蓾蔀蔁蔂伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳�\".split(\"\");\nfor(j = 0; j != D[201].length; ++j) if(D[201][j].charCodeAt(0) !== 0xFFFD) { e[D[201][j]] = 51456 + j; d[51456 + j] = D[201][j];}\nD[202] = \"����������������������������������������������������������������蔃蔄蔅蔆蔇蔈蔉蔊蔋蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢蔣蔤蔥蔦蔧蔨蔩蔪蔭蔮蔯蔰蔱蔲蔳蔴蔵蔶蔾蔿蕀蕁蕂蕄蕅蕆蕇蕋蕌蕍蕎蕏蕐蕑蕒蕓蕔蕕�蕗蕘蕚蕛蕜蕝蕟蕠蕡蕢蕣蕥蕦蕧蕩蕪蕫蕬蕭蕮蕯蕰蕱蕳蕵蕶蕷蕸蕼蕽蕿薀薁省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱�\".split(\"\");\nfor(j = 0; j != D[202].length; ++j) if(D[202][j].charCodeAt(0) !== 0xFFFD) { e[D[202][j]] = 51712 + j; d[51712 + j] = D[202][j];}\nD[203] = \"����������������������������������������������������������������薂薃薆薈薉薊薋薌薍薎薐薑薒薓薔薕薖薗薘薙薚薝薞薟薠薡薢薣薥薦薧薩薫薬薭薱薲薳薴薵薶薸薺薻薼薽薾薿藀藂藃藄藅藆藇藈藊藋藌藍藎藑藒�藔藖藗藘藙藚藛藝藞藟藠藡藢藣藥藦藧藨藪藫藬藭藮藯藰藱藲藳藴藵藶藷藸恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔�\".split(\"\");\nfor(j = 0; j != D[203].length; ++j) if(D[203][j].charCodeAt(0) !== 0xFFFD) { e[D[203][j]] = 51968 + j; d[51968 + j] = D[203][j];}\nD[204] = \"����������������������������������������������������������������藹藺藼藽藾蘀蘁蘂蘃蘄蘆蘇蘈蘉蘊蘋蘌蘍蘎蘏蘐蘒蘓蘔蘕蘗蘘蘙蘚蘛蘜蘝蘞蘟蘠蘡蘢蘣蘤蘥蘦蘨蘪蘫蘬蘭蘮蘯蘰蘱蘲蘳蘴蘵蘶蘷蘹蘺蘻蘽蘾蘿虀�虁虂虃虄虅虆虇虈虉虊虋虌虒虓處虖虗虘虙虛虜虝號虠虡虣虤虥虦虧虨虩虪獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃�\".split(\"\");\nfor(j = 0; j != D[204].length; ++j) if(D[204][j].charCodeAt(0) !== 0xFFFD) { e[D[204][j]] = 52224 + j; d[52224 + j] = D[204][j];}\nD[205] = \"����������������������������������������������������������������虭虯虰虲虳虴虵虶虷虸蚃蚄蚅蚆蚇蚈蚉蚎蚏蚐蚑蚒蚔蚖蚗蚘蚙蚚蚛蚞蚟蚠蚡蚢蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻蚼蚽蚾蚿蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜�蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威�\".split(\"\");\nfor(j = 0; j != D[205].length; ++j) if(D[205][j].charCodeAt(0) !== 0xFFFD) { e[D[205][j]] = 52480 + j; d[52480 + j] = D[205][j];}\nD[206] = \"����������������������������������������������������������������蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀蝁蝂蝃蝄蝅蝆蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚蝛蝜蝝蝞蝟蝡蝢蝦蝧蝨蝩蝪蝫蝬蝭蝯蝱蝲蝳蝵�蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎螏螐螑螒螔螕螖螘螙螚螛螜螝螞螠螡螢螣螤巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺�\".split(\"\");\nfor(j = 0; j != D[206].length; ++j) if(D[206][j].charCodeAt(0) !== 0xFFFD) { e[D[206][j]] = 52736 + j; d[52736 + j] = D[206][j];}\nD[207] = \"����������������������������������������������������������������螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁蟂蟃蟄蟅蟇蟈蟉蟌蟍蟎蟏蟐蟔蟕蟖蟗蟘蟙蟚蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯蟰蟱蟲蟳蟴蟵蟶蟷蟸�蟺蟻蟼蟽蟿蠀蠁蠂蠄蠅蠆蠇蠈蠉蠋蠌蠍蠎蠏蠐蠑蠒蠔蠗蠘蠙蠚蠜蠝蠞蠟蠠蠣稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓�\".split(\"\");\nfor(j = 0; j != D[207].length; ++j) if(D[207][j].charCodeAt(0) !== 0xFFFD) { e[D[207][j]] = 52992 + j; d[52992 + j] = D[207][j];}\nD[208] = \"����������������������������������������������������������������蠤蠥蠦蠧蠨蠩蠪蠫蠬蠭蠮蠯蠰蠱蠳蠴蠵蠶蠷蠸蠺蠻蠽蠾蠿衁衂衃衆衇衈衉衊衋衎衏衐衑衒術衕衖衘衚衛衜衝衞衟衠衦衧衪衭衯衱衳衴衵衶衸衹衺�衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗袘袙袚袛袝袞袟袠袡袣袥袦袧袨袩袪小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄�\".split(\"\");\nfor(j = 0; j != D[208].length; ++j) if(D[208][j].charCodeAt(0) !== 0xFFFD) { e[D[208][j]] = 53248 + j; d[53248 + j] = D[208][j];}\nD[209] = \"����������������������������������������������������������������袬袮袯袰袲袳袴袵袶袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚裛補裝裞裠裡裦裧裩裪裫裬裭裮裯裲裵裶裷裺裻製裿褀褁褃褄褅褆複褈�褉褋褌褍褎褏褑褔褕褖褗褘褜褝褞褟褠褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶�\".split(\"\");\nfor(j = 0; j != D[209].length; ++j) if(D[209][j].charCodeAt(0) !== 0xFFFD) { e[D[209][j]] = 53504 + j; d[53504 + j] = D[209][j];}\nD[210] = \"����������������������������������������������������������������褸褹褺褻褼褽褾褿襀襂襃襅襆襇襈襉襊襋襌襍襎襏襐襑襒襓襔襕襖襗襘襙襚襛襜襝襠襡襢襣襤襥襧襨襩襪襫襬襭襮襯襰襱襲襳襴襵襶襷襸襹襺襼�襽襾覀覂覄覅覇覈覉覊見覌覍覎規覐覑覒覓覔覕視覗覘覙覚覛覜覝覞覟覠覡摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐�\".split(\"\");\nfor(j = 0; j != D[210].length; ++j) if(D[210][j].charCodeAt(0) !== 0xFFFD) { e[D[210][j]] = 53760 + j; d[53760 + j] = D[210][j];}\nD[211] = \"����������������������������������������������������������������覢覣覤覥覦覧覨覩親覫覬覭覮覯覰覱覲観覴覵覶覷覸覹覺覻覼覽覾覿觀觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴觵觶觷觸觹觺�觻觼觽觾觿訁訂訃訄訅訆計訉訊訋訌訍討訏訐訑訒訓訔訕訖託記訙訚訛訜訝印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉�\".split(\"\");\nfor(j = 0; j != D[211].length; ++j) if(D[211][j].charCodeAt(0) !== 0xFFFD) { e[D[211][j]] = 54016 + j; d[54016 + j] = D[211][j];}\nD[212] = \"����������������������������������������������������������������訞訟訠訡訢訣訤訥訦訧訨訩訪訫訬設訮訯訰許訲訳訴訵訶訷訸訹診註証訽訿詀詁詂詃詄詅詆詇詉詊詋詌詍詎詏詐詑詒詓詔評詖詗詘詙詚詛詜詝詞�詟詠詡詢詣詤詥試詧詨詩詪詫詬詭詮詯詰話該詳詴詵詶詷詸詺詻詼詽詾詿誀浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧�\".split(\"\");\nfor(j = 0; j != D[212].length; ++j) if(D[212][j].charCodeAt(0) !== 0xFFFD) { e[D[212][j]] = 54272 + j; d[54272 + j] = D[212][j];}\nD[213] = \"����������������������������������������������������������������誁誂誃誄誅誆誇誈誋誌認誎誏誐誑誒誔誕誖誗誘誙誚誛誜誝語誟誠誡誢誣誤誥誦誧誨誩說誫説読誮誯誰誱課誳誴誵誶誷誸誹誺誻誼誽誾調諀諁諂�諃諄諅諆談諈諉諊請諌諍諎諏諐諑諒諓諔諕論諗諘諙諚諛諜諝諞諟諠諡諢諣铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政�\".split(\"\");\nfor(j = 0; j != D[213].length; ++j) if(D[213][j].charCodeAt(0) !== 0xFFFD) { e[D[213][j]] = 54528 + j; d[54528 + j] = D[213][j];}\nD[214] = \"����������������������������������������������������������������諤諥諦諧諨諩諪諫諬諭諮諯諰諱諲諳諴諵諶諷諸諹諺諻諼諽諾諿謀謁謂謃謄謅謆謈謉謊謋謌謍謎謏謐謑謒謓謔謕謖謗謘謙謚講謜謝謞謟謠謡謢謣�謤謥謧謨謩謪謫謬謭謮謯謰謱謲謳謴謵謶謷謸謹謺謻謼謽謾謿譀譁譂譃譄譅帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑�\".split(\"\");\nfor(j = 0; j != D[214].length; ++j) if(D[214][j].charCodeAt(0) !== 0xFFFD) { e[D[214][j]] = 54784 + j; d[54784 + j] = D[214][j];}\nD[215] = \"����������������������������������������������������������������譆譇譈證譊譋譌譍譎譏譐譑譒譓譔譕譖譗識譙譚譛譜譝譞譟譠譡譢譣譤譥譧譨譩譪譫譭譮譯議譱譲譳譴譵譶護譸譹譺譻譼譽譾譿讀讁讂讃讄讅讆�讇讈讉變讋讌讍讎讏讐讑讒讓讔讕讖讗讘讙讚讛讜讝讞讟讬讱讻诇诐诪谉谞住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座������\".split(\"\");\nfor(j = 0; j != D[215].length; ++j) if(D[215][j].charCodeAt(0) !== 0xFFFD) { e[D[215][j]] = 55040 + j; d[55040 + j] = D[215][j];}\nD[216] = \"����������������������������������������������������������������谸谹谺谻谼谽谾谿豀豂豃豄豅豈豊豋豍豎豏豐豑豒豓豔豖豗豘豙豛豜豝豞豟豠豣豤豥豦豧豨豩豬豭豮豯豰豱豲豴豵豶豷豻豼豽豾豿貀貁貃貄貆貇�貈貋貍貎貏貐貑貒貓貕貖貗貙貚貛貜貝貞貟負財貢貣貤貥貦貧貨販貪貫責貭亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝�\".split(\"\");\nfor(j = 0; j != D[216].length; ++j) if(D[216][j].charCodeAt(0) !== 0xFFFD) { e[D[216][j]] = 55296 + j; d[55296 + j] = D[216][j];}\nD[217] = \"����������������������������������������������������������������貮貯貰貱貲貳貴貵貶買貸貹貺費貼貽貾貿賀賁賂賃賄賅賆資賈賉賊賋賌賍賎賏賐賑賒賓賔賕賖賗賘賙賚賛賜賝賞賟賠賡賢賣賤賥賦賧賨賩質賫賬�賭賮賯賰賱賲賳賴賵賶賷賸賹賺賻購賽賾賿贀贁贂贃贄贅贆贇贈贉贊贋贌贍佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼�\".split(\"\");\nfor(j = 0; j != D[217].length; ++j) if(D[217][j].charCodeAt(0) !== 0xFFFD) { e[D[217][j]] = 55552 + j; d[55552 + j] = D[217][j];}\nD[218] = \"����������������������������������������������������������������贎贏贐贑贒贓贔贕贖贗贘贙贚贛贜贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸赹赺赻赼赽赾赿趀趂趃趆趇趈趉趌趍趎趏趐趒趓趕趖趗趘趙趚趛趜趝趞趠趡�趢趤趥趦趧趨趩趪趫趬趭趮趯趰趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺�\".split(\"\");\nfor(j = 0; j != D[218].length; ++j) if(D[218][j].charCodeAt(0) !== 0xFFFD) { e[D[218][j]] = 55808 + j; d[55808 + j] = D[218][j];}\nD[219] = \"����������������������������������������������������������������跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾跿踀踁踂踃踄踆踇踈踋踍踎踐踑踒踓踕踖踗踘踙踚踛踜踠踡踤踥踦踧踨踫踭踰踲踳踴踶踷踸踻踼踾�踿蹃蹅蹆蹌蹍蹎蹏蹐蹓蹔蹕蹖蹗蹘蹚蹛蹜蹝蹞蹟蹠蹡蹢蹣蹤蹥蹧蹨蹪蹫蹮蹱邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝�\".split(\"\");\nfor(j = 0; j != D[219].length; ++j) if(D[219][j].charCodeAt(0) !== 0xFFFD) { e[D[219][j]] = 56064 + j; d[56064 + j] = D[219][j];}\nD[220] = \"����������������������������������������������������������������蹳蹵蹷蹸蹹蹺蹻蹽蹾躀躂躃躄躆躈躉躊躋躌躍躎躑躒躓躕躖躗躘躙躚躛躝躟躠躡躢躣躤躥躦躧躨躩躪躭躮躰躱躳躴躵躶躷躸躹躻躼躽躾躿軀軁軂�軃軄軅軆軇軈軉車軋軌軍軏軐軑軒軓軔軕軖軗軘軙軚軛軜軝軞軟軠軡転軣軤堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥�\".split(\"\");\nfor(j = 0; j != D[220].length; ++j) if(D[220][j].charCodeAt(0) !== 0xFFFD) { e[D[220][j]] = 56320 + j; d[56320 + j] = D[220][j];}\nD[221] = \"����������������������������������������������������������������軥軦軧軨軩軪軫軬軭軮軯軰軱軲軳軴軵軶軷軸軹軺軻軼軽軾軿輀輁輂較輄輅輆輇輈載輊輋輌輍輎輏輐輑輒輓輔輕輖輗輘輙輚輛輜輝輞輟輠輡輢輣�輤輥輦輧輨輩輪輫輬輭輮輯輰輱輲輳輴輵輶輷輸輹輺輻輼輽輾輿轀轁轂轃轄荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺�\".split(\"\");\nfor(j = 0; j != D[221].length; ++j) if(D[221][j].charCodeAt(0) !== 0xFFFD) { e[D[221][j]] = 56576 + j; d[56576 + j] = D[221][j];}\nD[222] = \"����������������������������������������������������������������轅轆轇轈轉轊轋轌轍轎轏轐轑轒轓轔轕轖轗轘轙轚轛轜轝轞轟轠轡轢轣轤轥轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆�迉迊迋迌迍迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖�\".split(\"\");\nfor(j = 0; j != D[222].length; ++j) if(D[222][j].charCodeAt(0) !== 0xFFFD) { e[D[222][j]] = 56832 + j; d[56832 + j] = D[222][j];}\nD[223] = \"����������������������������������������������������������������這逜連逤逥逧逨逩逪逫逬逰週進逳逴逷逹逺逽逿遀遃遅遆遈遉遊運遌過達違遖遙遚遜遝遞遟遠遡遤遦遧適遪遫遬遯遰遱遲遳遶遷選遹遺遻遼遾邁�還邅邆邇邉邊邌邍邎邏邐邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼�\".split(\"\");\nfor(j = 0; j != D[223].length; ++j) if(D[223][j].charCodeAt(0) !== 0xFFFD) { e[D[223][j]] = 57088 + j; d[57088 + j] = D[223][j];}\nD[224] = \"����������������������������������������������������������������郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅鄆鄇鄈鄉鄊鄋鄌鄍鄎鄏鄐鄑鄒鄓鄔鄕鄖鄗鄘鄚鄛鄜�鄝鄟鄠鄡鄤鄥鄦鄧鄨鄩鄪鄫鄬鄭鄮鄰鄲鄳鄴鄵鄶鄷鄸鄺鄻鄼鄽鄾鄿酀酁酂酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼�\".split(\"\");\nfor(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}\nD[225] = \"����������������������������������������������������������������酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀醁醂醃醄醆醈醊醎醏醓醔醕醖醗醘醙醜醝醞醟醠醡醤醥醦醧醨醩醫醬醰醱醲醳醶醷醸醹醻�醼醽醾醿釀釁釂釃釄釅釆釈釋釐釒釓釔釕釖釗釘釙釚釛針釞釟釠釡釢釣釤釥帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺�\".split(\"\");\nfor(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}\nD[226] = \"����������������������������������������������������������������釦釧釨釩釪釫釬釭釮釯釰釱釲釳釴釵釶釷釸釹釺釻釼釽釾釿鈀鈁鈂鈃鈄鈅鈆鈇鈈鈉鈊鈋鈌鈍鈎鈏鈐鈑鈒鈓鈔鈕鈖鈗鈘鈙鈚鈛鈜鈝鈞鈟鈠鈡鈢鈣鈤�鈥鈦鈧鈨鈩鈪鈫鈬鈭鈮鈯鈰鈱鈲鈳鈴鈵鈶鈷鈸鈹鈺鈻鈼鈽鈾鈿鉀鉁鉂鉃鉄鉅狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂�\".split(\"\");\nfor(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}\nD[227] = \"����������������������������������������������������������������鉆鉇鉈鉉鉊鉋鉌鉍鉎鉏鉐鉑鉒鉓鉔鉕鉖鉗鉘鉙鉚鉛鉜鉝鉞鉟鉠鉡鉢鉣鉤鉥鉦鉧鉨鉩鉪鉫鉬鉭鉮鉯鉰鉱鉲鉳鉵鉶鉷鉸鉹鉺鉻鉼鉽鉾鉿銀銁銂銃銄銅�銆銇銈銉銊銋銌銍銏銐銑銒銓銔銕銖銗銘銙銚銛銜銝銞銟銠銡銢銣銤銥銦銧恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾�\".split(\"\");\nfor(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}\nD[228] = \"����������������������������������������������������������������銨銩銪銫銬銭銯銰銱銲銳銴銵銶銷銸銹銺銻銼銽銾銿鋀鋁鋂鋃鋄鋅鋆鋇鋉鋊鋋鋌鋍鋎鋏鋐鋑鋒鋓鋔鋕鋖鋗鋘鋙鋚鋛鋜鋝鋞鋟鋠鋡鋢鋣鋤鋥鋦鋧鋨�鋩鋪鋫鋬鋭鋮鋯鋰鋱鋲鋳鋴鋵鋶鋷鋸鋹鋺鋻鋼鋽鋾鋿錀錁錂錃錄錅錆錇錈錉洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑�\".split(\"\");\nfor(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}\nD[229] = \"����������������������������������������������������������������錊錋錌錍錎錏錐錑錒錓錔錕錖錗錘錙錚錛錜錝錞錟錠錡錢錣錤錥錦錧錨錩錪錫錬錭錮錯錰錱録錳錴錵錶錷錸錹錺錻錼錽錿鍀鍁鍂鍃鍄鍅鍆鍇鍈鍉�鍊鍋鍌鍍鍎鍏鍐鍑鍒鍓鍔鍕鍖鍗鍘鍙鍚鍛鍜鍝鍞鍟鍠鍡鍢鍣鍤鍥鍦鍧鍨鍩鍫濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣�\".split(\"\");\nfor(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}\nD[230] = \"����������������������������������������������������������������鍬鍭鍮鍯鍰鍱鍲鍳鍴鍵鍶鍷鍸鍹鍺鍻鍼鍽鍾鍿鎀鎁鎂鎃鎄鎅鎆鎇鎈鎉鎊鎋鎌鎍鎎鎐鎑鎒鎓鎔鎕鎖鎗鎘鎙鎚鎛鎜鎝鎞鎟鎠鎡鎢鎣鎤鎥鎦鎧鎨鎩鎪鎫�鎬鎭鎮鎯鎰鎱鎲鎳鎴鎵鎶鎷鎸鎹鎺鎻鎼鎽鎾鎿鏀鏁鏂鏃鏄鏅鏆鏇鏈鏉鏋鏌鏍妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩�\".split(\"\");\nfor(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}\nD[231] = \"����������������������������������������������������������������鏎鏏鏐鏑鏒鏓鏔鏕鏗鏘鏙鏚鏛鏜鏝鏞鏟鏠鏡鏢鏣鏤鏥鏦鏧鏨鏩鏪鏫鏬鏭鏮鏯鏰鏱鏲鏳鏴鏵鏶鏷鏸鏹鏺鏻鏼鏽鏾鏿鐀鐁鐂鐃鐄鐅鐆鐇鐈鐉鐊鐋鐌鐍�鐎鐏鐐鐑鐒鐓鐔鐕鐖鐗鐘鐙鐚鐛鐜鐝鐞鐟鐠鐡鐢鐣鐤鐥鐦鐧鐨鐩鐪鐫鐬鐭鐮纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬�\".split(\"\");\nfor(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}\nD[232] = \"����������������������������������������������������������������鐯鐰鐱鐲鐳鐴鐵鐶鐷鐸鐹鐺鐻鐼鐽鐿鑀鑁鑂鑃鑄鑅鑆鑇鑈鑉鑊鑋鑌鑍鑎鑏鑐鑑鑒鑓鑔鑕鑖鑗鑘鑙鑚鑛鑜鑝鑞鑟鑠鑡鑢鑣鑤鑥鑦鑧鑨鑩鑪鑬鑭鑮鑯�鑰鑱鑲鑳鑴鑵鑶鑷鑸鑹鑺鑻鑼鑽鑾鑿钀钁钂钃钄钑钖钘铇铏铓铔铚铦铻锜锠琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹�\".split(\"\");\nfor(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}\nD[233] = \"����������������������������������������������������������������锧锳锽镃镈镋镕镚镠镮镴镵長镸镹镺镻镼镽镾門閁閂閃閄閅閆閇閈閉閊開閌閍閎閏閐閑閒間閔閕閖閗閘閙閚閛閜閝閞閟閠閡関閣閤閥閦閧閨閩閪�閫閬閭閮閯閰閱閲閳閴閵閶閷閸閹閺閻閼閽閾閿闀闁闂闃闄闅闆闇闈闉闊闋椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋�\".split(\"\");\nfor(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}\nD[234] = \"����������������������������������������������������������������闌闍闎闏闐闑闒闓闔闕闖闗闘闙闚闛關闝闞闟闠闡闢闣闤闥闦闧闬闿阇阓阘阛阞阠阣阤阥阦阧阨阩阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗�陘陙陚陜陝陞陠陣陥陦陫陭陮陯陰陱陳陸陹険陻陼陽陾陿隀隁隂隃隄隇隉隊辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰�\".split(\"\");\nfor(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}\nD[235] = \"����������������������������������������������������������������隌階隑隒隓隕隖隚際隝隞隟隠隡隢隣隤隥隦隨隩險隫隬隭隮隯隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖雗雘雙雚雛雜雝雞雟雡離難雤雥雦雧雫�雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗霘霙霚霛霝霟霠搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻�\".split(\"\");\nfor(j = 0; j != D[235].length; ++j) if(D[235][j].charCodeAt(0) !== 0xFFFD) { e[D[235][j]] = 60160 + j; d[60160 + j] = D[235][j];}\nD[236] = \"����������������������������������������������������������������霡霢霣霤霥霦霧霨霩霫霬霮霯霱霳霴霵霶霷霺霻霼霽霿靀靁靂靃靄靅靆靇靈靉靊靋靌靍靎靏靐靑靔靕靗靘靚靜靝靟靣靤靦靧靨靪靫靬靭靮靯靰靱�靲靵靷靸靹靺靻靽靾靿鞀鞁鞂鞃鞄鞆鞇鞈鞉鞊鞌鞎鞏鞐鞓鞕鞖鞗鞙鞚鞛鞜鞝臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐�\".split(\"\");\nfor(j = 0; j != D[236].length; ++j) if(D[236][j].charCodeAt(0) !== 0xFFFD) { e[D[236][j]] = 60416 + j; d[60416 + j] = D[236][j];}\nD[237] = \"����������������������������������������������������������������鞞鞟鞡鞢鞤鞥鞦鞧鞨鞩鞪鞬鞮鞰鞱鞳鞵鞶鞷鞸鞹鞺鞻鞼鞽鞾鞿韀韁韂韃韄韅韆韇韈韉韊韋韌韍韎韏韐韑韒韓韔韕韖韗韘韙韚韛韜韝韞韟韠韡韢韣�韤韥韨韮韯韰韱韲韴韷韸韹韺韻韼韽韾響頀頁頂頃頄項順頇須頉頊頋頌頍頎怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨�\".split(\"\");\nfor(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}\nD[238] = \"����������������������������������������������������������������頏預頑頒頓頔頕頖頗領頙頚頛頜頝頞頟頠頡頢頣頤頥頦頧頨頩頪頫頬頭頮頯頰頱頲頳頴頵頶頷頸頹頺頻頼頽頾頿顀顁顂顃顄顅顆顇顈顉顊顋題額�顎顏顐顑顒顓顔顕顖顗願顙顚顛顜顝類顟顠顡顢顣顤顥顦顧顨顩顪顫顬顭顮睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪�\".split(\"\");\nfor(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}\nD[239] = \"����������������������������������������������������������������顯顰顱顲顳顴颋颎颒颕颙颣風颩颪颫颬颭颮颯颰颱颲颳颴颵颶颷颸颹颺颻颼颽颾颿飀飁飂飃飄飅飆飇飈飉飊飋飌飍飏飐飔飖飗飛飜飝飠飡飢飣飤�飥飦飩飪飫飬飭飮飯飰飱飲飳飴飵飶飷飸飹飺飻飼飽飾飿餀餁餂餃餄餅餆餇铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔�\".split(\"\");\nfor(j = 0; j != D[239].length; ++j) if(D[239][j].charCodeAt(0) !== 0xFFFD) { e[D[239][j]] = 61184 + j; d[61184 + j] = D[239][j];}\nD[240] = \"����������������������������������������������������������������餈餉養餋餌餎餏餑餒餓餔餕餖餗餘餙餚餛餜餝餞餟餠餡餢餣餤餥餦餧館餩餪餫餬餭餯餰餱餲餳餴餵餶餷餸餹餺餻餼餽餾餿饀饁饂饃饄饅饆饇饈饉�饊饋饌饍饎饏饐饑饒饓饖饗饘饙饚饛饜饝饞饟饠饡饢饤饦饳饸饹饻饾馂馃馉稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙�\".split(\"\");\nfor(j = 0; j != D[240].length; ++j) if(D[240][j].charCodeAt(0) !== 0xFFFD) { e[D[240][j]] = 61440 + j; d[61440 + j] = D[240][j];}\nD[241] = \"����������������������������������������������������������������馌馎馚馛馜馝馞馟馠馡馢馣馤馦馧馩馪馫馬馭馮馯馰馱馲馳馴馵馶馷馸馹馺馻馼馽馾馿駀駁駂駃駄駅駆駇駈駉駊駋駌駍駎駏駐駑駒駓駔駕駖駗駘�駙駚駛駜駝駞駟駠駡駢駣駤駥駦駧駨駩駪駫駬駭駮駯駰駱駲駳駴駵駶駷駸駹瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃�\".split(\"\");\nfor(j = 0; j != D[241].length; ++j) if(D[241][j].charCodeAt(0) !== 0xFFFD) { e[D[241][j]] = 61696 + j; d[61696 + j] = D[241][j];}\nD[242] = \"����������������������������������������������������������������駺駻駼駽駾駿騀騁騂騃騄騅騆騇騈騉騊騋騌騍騎騏騐騑騒験騔騕騖騗騘騙騚騛騜騝騞騟騠騡騢騣騤騥騦騧騨騩騪騫騬騭騮騯騰騱騲騳騴騵騶騷騸�騹騺騻騼騽騾騿驀驁驂驃驄驅驆驇驈驉驊驋驌驍驎驏驐驑驒驓驔驕驖驗驘驙颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒�\".split(\"\");\nfor(j = 0; j != D[242].length; ++j) if(D[242][j].charCodeAt(0) !== 0xFFFD) { e[D[242][j]] = 61952 + j; d[61952 + j] = D[242][j];}\nD[243] = \"����������������������������������������������������������������驚驛驜驝驞驟驠驡驢驣驤驥驦驧驨驩驪驫驲骃骉骍骎骔骕骙骦骩骪骫骬骭骮骯骲骳骴骵骹骻骽骾骿髃髄髆髇髈髉髊髍髎髏髐髒體髕髖髗髙髚髛髜�髝髞髠髢髣髤髥髧髨髩髪髬髮髰髱髲髳髴髵髶髷髸髺髼髽髾髿鬀鬁鬂鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋�\".split(\"\");\nfor(j = 0; j != D[243].length; ++j) if(D[243][j].charCodeAt(0) !== 0xFFFD) { e[D[243][j]] = 62208 + j; d[62208 + j] = D[243][j];}\nD[244] = \"����������������������������������������������������������������鬇鬉鬊鬋鬌鬍鬎鬐鬑鬒鬔鬕鬖鬗鬘鬙鬚鬛鬜鬝鬞鬠鬡鬢鬤鬥鬦鬧鬨鬩鬪鬫鬬鬭鬮鬰鬱鬳鬴鬵鬶鬷鬸鬹鬺鬽鬾鬿魀魆魊魋魌魎魐魒魓魕魖魗魘魙魚�魛魜魝魞魟魠魡魢魣魤魥魦魧魨魩魪魫魬魭魮魯魰魱魲魳魴魵魶魷魸魹魺魻簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤�\".split(\"\");\nfor(j = 0; j != D[244].length; ++j) if(D[244][j].charCodeAt(0) !== 0xFFFD) { e[D[244][j]] = 62464 + j; d[62464 + j] = D[244][j];}\nD[245] = \"����������������������������������������������������������������魼魽魾魿鮀鮁鮂鮃鮄鮅鮆鮇鮈鮉鮊鮋鮌鮍鮎鮏鮐鮑鮒鮓鮔鮕鮖鮗鮘鮙鮚鮛鮜鮝鮞鮟鮠鮡鮢鮣鮤鮥鮦鮧鮨鮩鮪鮫鮬鮭鮮鮯鮰鮱鮲鮳鮴鮵鮶鮷鮸鮹鮺�鮻鮼鮽鮾鮿鯀鯁鯂鯃鯄鯅鯆鯇鯈鯉鯊鯋鯌鯍鯎鯏鯐鯑鯒鯓鯔鯕鯖鯗鯘鯙鯚鯛酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜�\".split(\"\");\nfor(j = 0; j != D[245].length; ++j) if(D[245][j].charCodeAt(0) !== 0xFFFD) { e[D[245][j]] = 62720 + j; d[62720 + j] = D[245][j];}\nD[246] = \"����������������������������������������������������������������鯜鯝鯞鯟鯠鯡鯢鯣鯤鯥鯦鯧鯨鯩鯪鯫鯬鯭鯮鯯鯰鯱鯲鯳鯴鯵鯶鯷鯸鯹鯺鯻鯼鯽鯾鯿鰀鰁鰂鰃鰄鰅鰆鰇鰈鰉鰊鰋鰌鰍鰎鰏鰐鰑鰒鰓鰔鰕鰖鰗鰘鰙鰚�鰛鰜鰝鰞鰟鰠鰡鰢鰣鰤鰥鰦鰧鰨鰩鰪鰫鰬鰭鰮鰯鰰鰱鰲鰳鰴鰵鰶鰷鰸鰹鰺鰻觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋�\".split(\"\");\nfor(j = 0; j != D[246].length; ++j) if(D[246][j].charCodeAt(0) !== 0xFFFD) { e[D[246][j]] = 62976 + j; d[62976 + j] = D[246][j];}\nD[247] = \"����������������������������������������������������������������鰼鰽鰾鰿鱀鱁鱂鱃鱄鱅鱆鱇鱈鱉鱊鱋鱌鱍鱎鱏鱐鱑鱒鱓鱔鱕鱖鱗鱘鱙鱚鱛鱜鱝鱞鱟鱠鱡鱢鱣鱤鱥鱦鱧鱨鱩鱪鱫鱬鱭鱮鱯鱰鱱鱲鱳鱴鱵鱶鱷鱸鱹鱺�鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾鲿鳀鳁鳂鳈鳉鳑鳒鳚鳛鳠鳡鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄�\".split(\"\");\nfor(j = 0; j != D[247].length; ++j) if(D[247][j].charCodeAt(0) !== 0xFFFD) { e[D[247][j]] = 63232 + j; d[63232 + j] = D[247][j];}\nD[248] = \"����������������������������������������������������������������鳣鳤鳥鳦鳧鳨鳩鳪鳫鳬鳭鳮鳯鳰鳱鳲鳳鳴鳵鳶鳷鳸鳹鳺鳻鳼鳽鳾鳿鴀鴁鴂鴃鴄鴅鴆鴇鴈鴉鴊鴋鴌鴍鴎鴏鴐鴑鴒鴓鴔鴕鴖鴗鴘鴙鴚鴛鴜鴝鴞鴟鴠鴡�鴢鴣鴤鴥鴦鴧鴨鴩鴪鴫鴬鴭鴮鴯鴰鴱鴲鴳鴴鴵鴶鴷鴸鴹鴺鴻鴼鴽鴾鴿鵀鵁鵂�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[248].length; ++j) if(D[248][j].charCodeAt(0) !== 0xFFFD) { e[D[248][j]] = 63488 + j; d[63488 + j] = D[248][j];}\nD[249] = \"����������������������������������������������������������������鵃鵄鵅鵆鵇鵈鵉鵊鵋鵌鵍鵎鵏鵐鵑鵒鵓鵔鵕鵖鵗鵘鵙鵚鵛鵜鵝鵞鵟鵠鵡鵢鵣鵤鵥鵦鵧鵨鵩鵪鵫鵬鵭鵮鵯鵰鵱鵲鵳鵴鵵鵶鵷鵸鵹鵺鵻鵼鵽鵾鵿鶀鶁�鶂鶃鶄鶅鶆鶇鶈鶉鶊鶋鶌鶍鶎鶏鶐鶑鶒鶓鶔鶕鶖鶗鶘鶙鶚鶛鶜鶝鶞鶟鶠鶡鶢�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[249].length; ++j) if(D[249][j].charCodeAt(0) !== 0xFFFD) { e[D[249][j]] = 63744 + j; d[63744 + j] = D[249][j];}\nD[250] = \"����������������������������������������������������������������鶣鶤鶥鶦鶧鶨鶩鶪鶫鶬鶭鶮鶯鶰鶱鶲鶳鶴鶵鶶鶷鶸鶹鶺鶻鶼鶽鶾鶿鷀鷁鷂鷃鷄鷅鷆鷇鷈鷉鷊鷋鷌鷍鷎鷏鷐鷑鷒鷓鷔鷕鷖鷗鷘鷙鷚鷛鷜鷝鷞鷟鷠鷡�鷢鷣鷤鷥鷦鷧鷨鷩鷪鷫鷬鷭鷮鷯鷰鷱鷲鷳鷴鷵鷶鷷鷸鷹鷺鷻鷼鷽鷾鷿鸀鸁鸂�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[250].length; ++j) if(D[250][j].charCodeAt(0) !== 0xFFFD) { e[D[250][j]] = 64000 + j; d[64000 + j] = D[250][j];}\nD[251] = \"����������������������������������������������������������������鸃鸄鸅鸆鸇鸈鸉鸊鸋鸌鸍鸎鸏鸐鸑鸒鸓鸔鸕鸖鸗鸘鸙鸚鸛鸜鸝鸞鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴鹵鹶鹷鹸鹹鹺鹻鹼鹽麀�麁麃麄麅麆麉麊麌麍麎麏麐麑麔麕麖麗麘麙麚麛麜麞麠麡麢麣麤麥麧麨麩麪�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[251].length; ++j) if(D[251][j].charCodeAt(0) !== 0xFFFD) { e[D[251][j]] = 64256 + j; d[64256 + j] = D[251][j];}\nD[252] = \"����������������������������������������������������������������麫麬麭麮麯麰麱麲麳麵麶麷麹麺麼麿黀黁黂黃黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰黱黲黳黴黵黶黷黸黺黽黿鼀鼁鼂鼃鼄鼅�鼆鼇鼈鼉鼊鼌鼏鼑鼒鼔鼕鼖鼘鼚鼛鼜鼝鼞鼟鼡鼣鼤鼥鼦鼧鼨鼩鼪鼫鼭鼮鼰鼱�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[252].length; ++j) if(D[252][j].charCodeAt(0) !== 0xFFFD) { e[D[252][j]] = 64512 + j; d[64512 + j] = D[252][j];}\nD[253] = \"����������������������������������������������������������������鼲鼳鼴鼵鼶鼸鼺鼼鼿齀齁齂齃齅齆齇齈齉齊齋齌齍齎齏齒齓齔齕齖齗齘齙齚齛齜齝齞齟齠齡齢齣齤齥齦齧齨齩齪齫齬齭齮齯齰齱齲齳齴齵齶齷齸�齹齺齻齼齽齾龁龂龍龎龏龐龑龒龓龔龕龖龗龘龜龝龞龡龢龣龤龥郎凉秊裏隣�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[253].length; ++j) if(D[253][j].charCodeAt(0) !== 0xFFFD) { e[D[253][j]] = 64768 + j; d[64768 + j] = D[253][j];}\nD[254] = \"����������������������������������������������������������������兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[254].length; ++j) if(D[254][j].charCodeAt(0) !== 0xFFFD) { e[D[254][j]] = 65024 + j; d[65024 + j] = D[254][j];}\nreturn {\"enc\": e, \"dec\": d }; })();\ncptable[949] = (function(){ var d = [], e = {}, D = [], j;\nD[0] = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}\nD[129] = \"�����������������������������������������������������������������갂갃갅갆갋갌갍갎갏갘갞갟갡갢갣갥갦갧갨갩갪갫갮갲갳갴������갵갶갷갺갻갽갾갿걁걂걃걄걅걆걇걈걉걊걌걎걏걐걑걒걓걕������걖걗걙걚걛걝걞걟걠걡걢걣걤걥걦걧걨걩걪걫걬걭걮걯걲걳걵걶걹걻걼걽걾걿겂겇겈겍겎겏겑겒겓겕겖겗겘겙겚겛겞겢겣겤겥겦겧겫겭겮겱겲겳겴겵겶겷겺겾겿곀곂곃곅곆곇곉곊곋곍곎곏곐곑곒곓곔곖곘곙곚곛곜곝곞곟곢곣곥곦곩곫곭곮곲곴곷곸곹곺곻곾곿괁괂괃괅괇괈괉괊괋괎괐괒괓�\".split(\"\");\nfor(j = 0; j != D[129].length; ++j) if(D[129][j].charCodeAt(0) !== 0xFFFD) { e[D[129][j]] = 33024 + j; d[33024 + j] = D[129][j];}\nD[130] = \"�����������������������������������������������������������������괔괕괖괗괙괚괛괝괞괟괡괢괣괤괥괦괧괨괪괫괮괯괰괱괲괳������괶괷괹괺괻괽괾괿굀굁굂굃굆굈굊굋굌굍굎굏굑굒굓굕굖굗������굙굚굛굜굝굞굟굠굢굤굥굦굧굨굩굪굫굮굯굱굲굷굸굹굺굾궀궃궄궅궆궇궊궋궍궎궏궑궒궓궔궕궖궗궘궙궚궛궞궟궠궡궢궣궥궦궧궨궩궪궫궬궭궮궯궰궱궲궳궴궵궶궸궹궺궻궼궽궾궿귂귃귅귆귇귉귊귋귌귍귎귏귒귔귕귖귗귘귙귚귛귝귞귟귡귢귣귥귦귧귨귩귪귫귬귭귮귯귰귱귲귳귴귵귶귷�\".split(\"\");\nfor(j = 0; j != D[130].length; ++j) if(D[130][j].charCodeAt(0) !== 0xFFFD) { e[D[130][j]] = 33280 + j; d[33280 + j] = D[130][j];}\nD[131] = \"�����������������������������������������������������������������귺귻귽귾긂긃긄긅긆긇긊긌긎긏긐긑긒긓긕긖긗긘긙긚긛긜������긝긞긟긠긡긢긣긤긥긦긧긨긩긪긫긬긭긮긯긲긳긵긶긹긻긼������긽긾긿깂깄깇깈깉깋깏깑깒깓깕깗깘깙깚깛깞깢깣깤깦깧깪깫깭깮깯깱깲깳깴깵깶깷깺깾깿꺀꺁꺂꺃꺆꺇꺈꺉꺊꺋꺍꺎꺏꺐꺑꺒꺓꺔꺕꺖꺗꺘꺙꺚꺛꺜꺝꺞꺟꺠꺡꺢꺣꺤꺥꺦꺧꺨꺩꺪꺫꺬꺭꺮꺯꺰꺱꺲꺳꺴꺵꺶꺷꺸꺹꺺꺻꺿껁껂껃껅껆껇껈껉껊껋껎껒껓껔껕껖껗껚껛껝껞껟껠껡껢껣껤껥�\".split(\"\");\nfor(j = 0; j != D[131].length; ++j) if(D[131][j].charCodeAt(0) !== 0xFFFD) { e[D[131][j]] = 33536 + j; d[33536 + j] = D[131][j];}\nD[132] = \"�����������������������������������������������������������������껦껧껩껪껬껮껯껰껱껲껳껵껶껷껹껺껻껽껾껿꼀꼁꼂꼃꼄꼅������꼆꼉꼊꼋꼌꼎꼏꼑꼒꼓꼔꼕꼖꼗꼘꼙꼚꼛꼜꼝꼞꼟꼠꼡꼢꼣������꼤꼥꼦꼧꼨꼩꼪꼫꼮꼯꼱꼳꼵꼶꼷꼸꼹꼺꼻꼾꽀꽄꽅꽆꽇꽊꽋꽌꽍꽎꽏꽑꽒꽓꽔꽕꽖꽗꽘꽙꽚꽛꽞꽟꽠꽡꽢꽣꽦꽧꽨꽩꽪꽫꽬꽭꽮꽯꽰꽱꽲꽳꽴꽵꽶꽷꽸꽺꽻꽼꽽꽾꽿꾁꾂꾃꾅꾆꾇꾉꾊꾋꾌꾍꾎꾏꾒꾓꾔꾖꾗꾘꾙꾚꾛꾝꾞꾟꾠꾡꾢꾣꾤꾥꾦꾧꾨꾩꾪꾫꾬꾭꾮꾯꾰꾱꾲꾳꾴꾵꾶꾷꾺꾻꾽꾾�\".split(\"\");\nfor(j = 0; j != D[132].length; ++j) if(D[132][j].charCodeAt(0) !== 0xFFFD) { e[D[132][j]] = 33792 + j; d[33792 + j] = D[132][j];}\nD[133] = \"�����������������������������������������������������������������꾿꿁꿂꿃꿄꿅꿆꿊꿌꿏꿐꿑꿒꿓꿕꿖꿗꿘꿙꿚꿛꿝꿞꿟꿠꿡������꿢꿣꿤꿥꿦꿧꿪꿫꿬꿭꿮꿯꿲꿳꿵꿶꿷꿹꿺꿻꿼꿽꿾꿿뀂뀃������뀅뀆뀇뀈뀉뀊뀋뀍뀎뀏뀑뀒뀓뀕뀖뀗뀘뀙뀚뀛뀞뀟뀠뀡뀢뀣뀤뀥뀦뀧뀩뀪뀫뀬뀭뀮뀯뀰뀱뀲뀳뀴뀵뀶뀷뀸뀹뀺뀻뀼뀽뀾뀿끀끁끂끃끆끇끉끋끍끏끐끑끒끖끘끚끛끜끞끟끠끡끢끣끤끥끦끧끨끩끪끫끬끭끮끯끰끱끲끳끴끵끶끷끸끹끺끻끾끿낁낂낃낅낆낇낈낉낊낋낎낐낒낓낔낕낖낗낛낝낞낣낤�\".split(\"\");\nfor(j = 0; j != D[133].length; ++j) if(D[133][j].charCodeAt(0) !== 0xFFFD) { e[D[133][j]] = 34048 + j; d[34048 + j] = D[133][j];}\nD[134] = \"�����������������������������������������������������������������낥낦낧낪낰낲낶낷낹낺낻낽낾낿냀냁냂냃냆냊냋냌냍냎냏냒������냓냕냖냗냙냚냛냜냝냞냟냡냢냣냤냦냧냨냩냪냫냬냭냮냯냰������냱냲냳냴냵냶냷냸냹냺냻냼냽냾냿넀넁넂넃넄넅넆넇넊넍넎넏넑넔넕넖넗넚넞넟넠넡넢넦넧넩넪넫넭넮넯넰넱넲넳넶넺넻넼넽넾넿녂녃녅녆녇녉녊녋녌녍녎녏녒녓녖녗녙녚녛녝녞녟녡녢녣녤녥녦녧녨녩녪녫녬녭녮녯녰녱녲녳녴녵녶녷녺녻녽녾녿놁놃놄놅놆놇놊놌놎놏놐놑놕놖놗놙놚놛놝�\".split(\"\");\nfor(j = 0; j != D[134].length; ++j) if(D[134][j].charCodeAt(0) !== 0xFFFD) { e[D[134][j]] = 34304 + j; d[34304 + j] = D[134][j];}\nD[135] = \"�����������������������������������������������������������������놞놟놠놡놢놣놤놥놦놧놩놪놫놬놭놮놯놰놱놲놳놴놵놶놷놸������놹놺놻놼놽놾놿뇀뇁뇂뇃뇄뇅뇆뇇뇈뇉뇊뇋뇍뇎뇏뇑뇒뇓뇕������뇖뇗뇘뇙뇚뇛뇞뇠뇡뇢뇣뇤뇥뇦뇧뇪뇫뇭뇮뇯뇱뇲뇳뇴뇵뇶뇷뇸뇺뇼뇾뇿눀눁눂눃눆눇눉눊눍눎눏눐눑눒눓눖눘눚눛눜눝눞눟눡눢눣눤눥눦눧눨눩눪눫눬눭눮눯눰눱눲눳눵눶눷눸눹눺눻눽눾눿뉀뉁뉂뉃뉄뉅뉆뉇뉈뉉뉊뉋뉌뉍뉎뉏뉐뉑뉒뉓뉔뉕뉖뉗뉙뉚뉛뉝뉞뉟뉡뉢뉣뉤뉥뉦뉧뉪뉫뉬뉭뉮�\".split(\"\");\nfor(j = 0; j != D[135].length; ++j) if(D[135][j].charCodeAt(0) !== 0xFFFD) { e[D[135][j]] = 34560 + j; d[34560 + j] = D[135][j];}\nD[136] = \"�����������������������������������������������������������������뉯뉰뉱뉲뉳뉶뉷뉸뉹뉺뉻뉽뉾뉿늀늁늂늃늆늇늈늊늋늌늍늎������늏늒늓늕늖늗늛늜늝늞늟늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷������늸늹늺늻늼늽늾늿닀닁닂닃닄닅닆닇닊닋닍닎닏닑닓닔닕닖닗닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉댊댋댌댍댎댏댒댖댗댘댙댚댛댝댞댟댠댡댢댣댤댥댦댧댨댩댪댫댬댭댮댯댰댱댲댳댴댵댶댷댸댹댺댻댼댽댾댿덀덁덂덃덄덅덆덇덈덉덊덋덌덍덎덏덐덑덒덓덗덙덚덝덠덡덢덣�\".split(\"\");\nfor(j = 0; j != D[136].length; ++j) if(D[136][j].charCodeAt(0) !== 0xFFFD) { e[D[136][j]] = 34816 + j; d[34816 + j] = D[136][j];}\nD[137] = \"�����������������������������������������������������������������덦덨덪덬덭덯덲덳덵덶덷덹덺덻덼덽덾덿뎂뎆뎇뎈뎉뎊뎋뎍������뎎뎏뎑뎒뎓뎕뎖뎗뎘뎙뎚뎛뎜뎝뎞뎟뎢뎣뎤뎥뎦뎧뎩뎪뎫뎭������뎮뎯뎰뎱뎲뎳뎴뎵뎶뎷뎸뎹뎺뎻뎼뎽뎾뎿돀돁돂돃돆돇돉돊돍돏돑돒돓돖돘돚돜돞돟돡돢돣돥돦돧돩돪돫돬돭돮돯돰돱돲돳돴돵돶돷돸돹돺돻돽돾돿됀됁됂됃됄됅됆됇됈됉됊됋됌됍됎됏됑됒됓됔됕됖됗됙됚됛됝됞됟됡됢됣됤됥됦됧됪됬됭됮됯됰됱됲됳됵됶됷됸됹됺됻됼됽됾됿둀둁둂둃둄�\".split(\"\");\nfor(j = 0; j != D[137].length; ++j) if(D[137][j].charCodeAt(0) !== 0xFFFD) { e[D[137][j]] = 35072 + j; d[35072 + j] = D[137][j];}\nD[138] = \"�����������������������������������������������������������������둅둆둇둈둉둊둋둌둍둎둏둒둓둕둖둗둙둚둛둜둝둞둟둢둤둦������둧둨둩둪둫둭둮둯둰둱둲둳둴둵둶둷둸둹둺둻둼둽둾둿뒁뒂������뒃뒄뒅뒆뒇뒉뒊뒋뒌뒍뒎뒏뒐뒑뒒뒓뒔뒕뒖뒗뒘뒙뒚뒛뒜뒞뒟뒠뒡뒢뒣뒥뒦뒧뒩뒪뒫뒭뒮뒯뒰뒱뒲뒳뒴뒶뒸뒺뒻뒼뒽뒾뒿듁듂듃듅듆듇듉듊듋듌듍듎듏듑듒듓듔듖듗듘듙듚듛듞듟듡듢듥듧듨듩듪듫듮듰듲듳듴듵듶듷듹듺듻듼듽듾듿딀딁딂딃딄딅딆딇딈딉딊딋딌딍딎딏딐딑딒딓딖딗딙딚딝�\".split(\"\");\nfor(j = 0; j != D[138].length; ++j) if(D[138][j].charCodeAt(0) !== 0xFFFD) { e[D[138][j]] = 35328 + j; d[35328 + j] = D[138][j];}\nD[139] = \"�����������������������������������������������������������������딞딟딠딡딢딣딦딫딬딭딮딯딲딳딵딶딷딹딺딻딼딽딾딿땂땆������땇땈땉땊땎땏땑땒땓땕땖땗땘땙땚땛땞땢땣땤땥땦땧땨땩땪������땫땬땭땮땯땰땱땲땳땴땵땶땷땸땹땺땻땼땽땾땿떀떁떂떃떄떅떆떇떈떉떊떋떌떍떎떏떐떑떒떓떔떕떖떗떘떙떚떛떜떝떞떟떢떣떥떦떧떩떬떭떮떯떲떶떷떸떹떺떾떿뗁뗂뗃뗅뗆뗇뗈뗉뗊뗋뗎뗒뗓뗔뗕뗖뗗뗙뗚뗛뗜뗝뗞뗟뗠뗡뗢뗣뗤뗥뗦뗧뗨뗩뗪뗫뗭뗮뗯뗰뗱뗲뗳뗴뗵뗶뗷뗸뗹뗺뗻뗼뗽뗾뗿�\".split(\"\");\nfor(j = 0; j != D[139].length; ++j) if(D[139][j].charCodeAt(0) !== 0xFFFD) { e[D[139][j]] = 35584 + j; d[35584 + j] = D[139][j];}\nD[140] = \"�����������������������������������������������������������������똀똁똂똃똄똅똆똇똈똉똊똋똌똍똎똏똒똓똕똖똗똙똚똛똜똝������똞똟똠똡똢똣똤똦똧똨똩똪똫똭똮똯똰똱똲똳똵똶똷똸똹똺������똻똼똽똾똿뙀뙁뙂뙃뙄뙅뙆뙇뙉뙊뙋뙌뙍뙎뙏뙐뙑뙒뙓뙔뙕뙖뙗뙘뙙뙚뙛뙜뙝뙞뙟뙠뙡뙢뙣뙥뙦뙧뙩뙪뙫뙬뙭뙮뙯뙰뙱뙲뙳뙴뙵뙶뙷뙸뙹뙺뙻뙼뙽뙾뙿뚀뚁뚂뚃뚄뚅뚆뚇뚈뚉뚊뚋뚌뚍뚎뚏뚐뚑뚒뚓뚔뚕뚖뚗뚘뚙뚚뚛뚞뚟뚡뚢뚣뚥뚦뚧뚨뚩뚪뚭뚮뚯뚰뚲뚳뚴뚵뚶뚷뚸뚹뚺뚻뚼뚽뚾뚿뛀뛁뛂�\".split(\"\");\nfor(j = 0; j != D[140].length; ++j) if(D[140][j].charCodeAt(0) !== 0xFFFD) { e[D[140][j]] = 35840 + j; d[35840 + j] = D[140][j];}\nD[141] = \"�����������������������������������������������������������������뛃뛄뛅뛆뛇뛈뛉뛊뛋뛌뛍뛎뛏뛐뛑뛒뛓뛕뛖뛗뛘뛙뛚뛛뛜뛝������뛞뛟뛠뛡뛢뛣뛤뛥뛦뛧뛨뛩뛪뛫뛬뛭뛮뛯뛱뛲뛳뛵뛶뛷뛹뛺������뛻뛼뛽뛾뛿뜂뜃뜄뜆뜇뜈뜉뜊뜋뜌뜍뜎뜏뜐뜑뜒뜓뜔뜕뜖뜗뜘뜙뜚뜛뜜뜝뜞뜟뜠뜡뜢뜣뜤뜥뜦뜧뜪뜫뜭뜮뜱뜲뜳뜴뜵뜶뜷뜺뜼뜽뜾뜿띀띁띂띃띅띆띇띉띊띋띍띎띏띐띑띒띓띖띗띘띙띚띛띜띝띞띟띡띢띣띥띦띧띩띪띫띬띭띮띯띲띴띶띷띸띹띺띻띾띿랁랂랃랅랆랇랈랉랊랋랎랓랔랕랚랛랝랞�\".split(\"\");\nfor(j = 0; j != D[141].length; ++j) if(D[141][j].charCodeAt(0) !== 0xFFFD) { e[D[141][j]] = 36096 + j; d[36096 + j] = D[141][j];}\nD[142] = \"�����������������������������������������������������������������랟랡랢랣랤랥랦랧랪랮랯랰랱랲랳랶랷랹랺랻랼랽랾랿럀럁������럂럃럄럅럆럈럊럋럌럍럎럏럐럑럒럓럔럕럖럗럘럙럚럛럜럝������럞럟럠럡럢럣럤럥럦럧럨럩럪럫럮럯럱럲럳럵럶럷럸럹럺럻럾렂렃렄렅렆렊렋렍렎렏렑렒렓렔렕렖렗렚렜렞렟렠렡렢렣렦렧렩렪렫렭렮렯렰렱렲렳렶렺렻렼렽렾렿롁롂롃롅롆롇롈롉롊롋롌롍롎롏롐롒롔롕롖롗롘롙롚롛롞롟롡롢롣롥롦롧롨롩롪롫롮롰롲롳롴롵롶롷롹롺롻롽롾롿뢀뢁뢂뢃뢄�\".split(\"\");\nfor(j = 0; j != D[142].length; ++j) if(D[142][j].charCodeAt(0) !== 0xFFFD) { e[D[142][j]] = 36352 + j; d[36352 + j] = D[142][j];}\nD[143] = \"�����������������������������������������������������������������뢅뢆뢇뢈뢉뢊뢋뢌뢎뢏뢐뢑뢒뢓뢔뢕뢖뢗뢘뢙뢚뢛뢜뢝뢞뢟������뢠뢡뢢뢣뢤뢥뢦뢧뢩뢪뢫뢬뢭뢮뢯뢱뢲뢳뢵뢶뢷뢹뢺뢻뢼뢽������뢾뢿룂룄룆룇룈룉룊룋룍룎룏룑룒룓룕룖룗룘룙룚룛룜룞룠룢룣룤룥룦룧룪룫룭룮룯룱룲룳룴룵룶룷룺룼룾룿뤀뤁뤂뤃뤅뤆뤇뤈뤉뤊뤋뤌뤍뤎뤏뤐뤑뤒뤓뤔뤕뤖뤗뤙뤚뤛뤜뤝뤞뤟뤡뤢뤣뤤뤥뤦뤧뤨뤩뤪뤫뤬뤭뤮뤯뤰뤱뤲뤳뤴뤵뤶뤷뤸뤹뤺뤻뤾뤿륁륂륃륅륆륇륈륉륊륋륍륎륐륒륓륔륕륖륗�\".split(\"\");\nfor(j = 0; j != D[143].length; ++j) if(D[143][j].charCodeAt(0) !== 0xFFFD) { e[D[143][j]] = 36608 + j; d[36608 + j] = D[143][j];}\nD[144] = \"�����������������������������������������������������������������륚륛륝륞륟륡륢륣륤륥륦륧륪륬륮륯륰륱륲륳륶륷륹륺륻륽������륾륿릀릁릂릃릆릈릋릌릏릐릑릒릓릔릕릖릗릘릙릚릛릜릝릞������릟릠릡릢릣릤릥릦릧릨릩릪릫릮릯릱릲릳릵릶릷릸릹릺릻릾맀맂맃맄맅맆맇맊맋맍맓맔맕맖맗맚맜맟맠맢맦맧맩맪맫맭맮맯맰맱맲맳맶맻맼맽맾맿먂먃먄먅먆먇먉먊먋먌먍먎먏먐먑먒먓먔먖먗먘먙먚먛먜먝먞먟먠먡먢먣먤먥먦먧먨먩먪먫먬먭먮먯먰먱먲먳먴먵먶먷먺먻먽먾먿멁멃멄멅멆�\".split(\"\");\nfor(j = 0; j != D[144].length; ++j) if(D[144][j].charCodeAt(0) !== 0xFFFD) { e[D[144][j]] = 36864 + j; d[36864 + j] = D[144][j];}\nD[145] = \"�����������������������������������������������������������������멇멊멌멏멐멑멒멖멗멙멚멛멝멞멟멠멡멢멣멦멪멫멬멭멮멯������멲멳멵멶멷멹멺멻멼멽멾멿몀몁몂몆몈몉몊몋몍몎몏몐몑몒������몓몔몕몖몗몘몙몚몛몜몝몞몟몠몡몢몣몤몥몦몧몪몭몮몯몱몳몴몵몶몷몺몼몾몿뫀뫁뫂뫃뫅뫆뫇뫉뫊뫋뫌뫍뫎뫏뫐뫑뫒뫓뫔뫕뫖뫗뫚뫛뫜뫝뫞뫟뫠뫡뫢뫣뫤뫥뫦뫧뫨뫩뫪뫫뫬뫭뫮뫯뫰뫱뫲뫳뫴뫵뫶뫷뫸뫹뫺뫻뫽뫾뫿묁묂묃묅묆묇묈묉묊묋묌묎묐묒묓묔묕묖묗묙묚묛묝묞묟묡묢묣묤묥묦묧�\".split(\"\");\nfor(j = 0; j != D[145].length; ++j) if(D[145][j].charCodeAt(0) !== 0xFFFD) { e[D[145][j]] = 37120 + j; d[37120 + j] = D[145][j];}\nD[146] = \"�����������������������������������������������������������������묨묪묬묭묮묯묰묱묲묳묷묹묺묿뭀뭁뭂뭃뭆뭈뭊뭋뭌뭎뭑뭒������뭓뭕뭖뭗뭙뭚뭛뭜뭝뭞뭟뭠뭢뭤뭥뭦뭧뭨뭩뭪뭫뭭뭮뭯뭰뭱������뭲뭳뭴뭵뭶뭷뭸뭹뭺뭻뭼뭽뭾뭿뮀뮁뮂뮃뮄뮅뮆뮇뮉뮊뮋뮍뮎뮏뮑뮒뮓뮔뮕뮖뮗뮘뮙뮚뮛뮜뮝뮞뮟뮠뮡뮢뮣뮥뮦뮧뮩뮪뮫뮭뮮뮯뮰뮱뮲뮳뮵뮶뮸뮹뮺뮻뮼뮽뮾뮿믁믂믃믅믆믇믉믊믋믌믍믎믏믑믒믔믕믖믗믘믙믚믛믜믝믞믟믠믡믢믣믤믥믦믧믨믩믪믫믬믭믮믯믰믱믲믳믴믵믶믷믺믻믽믾밁�\".split(\"\");\nfor(j = 0; j != D[146].length; ++j) if(D[146][j].charCodeAt(0) !== 0xFFFD) { e[D[146][j]] = 37376 + j; d[37376 + j] = D[146][j];}\nD[147] = \"�����������������������������������������������������������������밃밄밅밆밇밊밎밐밒밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵������밶밷밹밺밻밼밽밾밿뱂뱆뱇뱈뱊뱋뱎뱏뱑뱒뱓뱔뱕뱖뱗뱘뱙������뱚뱛뱜뱞뱟뱠뱡뱢뱣뱤뱥뱦뱧뱨뱩뱪뱫뱬뱭뱮뱯뱰뱱뱲뱳뱴뱵뱶뱷뱸뱹뱺뱻뱼뱽뱾뱿벀벁벂벃벆벇벉벊벍벏벐벑벒벓벖벘벛벜벝벞벟벢벣벥벦벩벪벫벬벭벮벯벲벶벷벸벹벺벻벾벿볁볂볃볅볆볇볈볉볊볋볌볎볒볓볔볖볗볙볚볛볝볞볟볠볡볢볣볤볥볦볧볨볩볪볫볬볭볮볯볰볱볲볳볷볹볺볻볽�\".split(\"\");\nfor(j = 0; j != D[147].length; ++j) if(D[147][j].charCodeAt(0) !== 0xFFFD) { e[D[147][j]] = 37632 + j; d[37632 + j] = D[147][j];}\nD[148] = \"�����������������������������������������������������������������볾볿봀봁봂봃봆봈봊봋봌봍봎봏봑봒봓봕봖봗봘봙봚봛봜봝������봞봟봠봡봢봣봥봦봧봨봩봪봫봭봮봯봰봱봲봳봴봵봶봷봸봹������봺봻봼봽봾봿뵁뵂뵃뵄뵅뵆뵇뵊뵋뵍뵎뵏뵑뵒뵓뵔뵕뵖뵗뵚뵛뵜뵝뵞뵟뵠뵡뵢뵣뵥뵦뵧뵩뵪뵫뵬뵭뵮뵯뵰뵱뵲뵳뵴뵵뵶뵷뵸뵹뵺뵻뵼뵽뵾뵿붂붃붅붆붋붌붍붎붏붒붔붖붗붘붛붝붞붟붠붡붢붣붥붦붧붨붩붪붫붬붭붮붯붱붲붳붴붵붶붷붹붺붻붼붽붾붿뷀뷁뷂뷃뷄뷅뷆뷇뷈뷉뷊뷋뷌뷍뷎뷏뷐뷑�\".split(\"\");\nfor(j = 0; j != D[148].length; ++j) if(D[148][j].charCodeAt(0) !== 0xFFFD) { e[D[148][j]] = 37888 + j; d[37888 + j] = D[148][j];}\nD[149] = \"�����������������������������������������������������������������뷒뷓뷖뷗뷙뷚뷛뷝뷞뷟뷠뷡뷢뷣뷤뷥뷦뷧뷨뷪뷫뷬뷭뷮뷯뷱������뷲뷳뷵뷶뷷뷹뷺뷻뷼뷽뷾뷿븁븂븄븆븇븈븉븊븋븎븏븑븒븓������븕븖븗븘븙븚븛븞븠븡븢븣븤븥븦븧븨븩븪븫븬븭븮븯븰븱븲븳븴븵븶븷븸븹븺븻븼븽븾븿빀빁빂빃빆빇빉빊빋빍빏빐빑빒빓빖빘빜빝빞빟빢빣빥빦빧빩빫빬빭빮빯빲빶빷빸빹빺빾빿뺁뺂뺃뺅뺆뺇뺈뺉뺊뺋뺎뺒뺓뺔뺕뺖뺗뺚뺛뺜뺝뺞뺟뺠뺡뺢뺣뺤뺥뺦뺧뺩뺪뺫뺬뺭뺮뺯뺰뺱뺲뺳뺴뺵뺶뺷�\".split(\"\");\nfor(j = 0; j != D[149].length; ++j) if(D[149][j].charCodeAt(0) !== 0xFFFD) { e[D[149][j]] = 38144 + j; d[38144 + j] = D[149][j];}\nD[150] = \"�����������������������������������������������������������������뺸뺹뺺뺻뺼뺽뺾뺿뻀뻁뻂뻃뻄뻅뻆뻇뻈뻉뻊뻋뻌뻍뻎뻏뻒뻓������뻕뻖뻙뻚뻛뻜뻝뻞뻟뻡뻢뻦뻧뻨뻩뻪뻫뻭뻮뻯뻰뻱뻲뻳뻴뻵������뻶뻷뻸뻹뻺뻻뻼뻽뻾뻿뼀뼂뼃뼄뼅뼆뼇뼊뼋뼌뼍뼎뼏뼐뼑뼒뼓뼔뼕뼖뼗뼚뼞뼟뼠뼡뼢뼣뼤뼥뼦뼧뼨뼩뼪뼫뼬뼭뼮뼯뼰뼱뼲뼳뼴뼵뼶뼷뼸뼹뼺뼻뼼뼽뼾뼿뽂뽃뽅뽆뽇뽉뽊뽋뽌뽍뽎뽏뽒뽓뽔뽖뽗뽘뽙뽚뽛뽜뽝뽞뽟뽠뽡뽢뽣뽤뽥뽦뽧뽨뽩뽪뽫뽬뽭뽮뽯뽰뽱뽲뽳뽴뽵뽶뽷뽸뽹뽺뽻뽼뽽뽾뽿뾀뾁뾂�\".split(\"\");\nfor(j = 0; j != D[150].length; ++j) if(D[150][j].charCodeAt(0) !== 0xFFFD) { e[D[150][j]] = 38400 + j; d[38400 + j] = D[150][j];}\nD[151] = \"�����������������������������������������������������������������뾃뾄뾅뾆뾇뾈뾉뾊뾋뾌뾍뾎뾏뾐뾑뾒뾓뾕뾖뾗뾘뾙뾚뾛뾜뾝������뾞뾟뾠뾡뾢뾣뾤뾥뾦뾧뾨뾩뾪뾫뾬뾭뾮뾯뾱뾲뾳뾴뾵뾶뾷뾸������뾹뾺뾻뾼뾽뾾뾿뿀뿁뿂뿃뿄뿆뿇뿈뿉뿊뿋뿎뿏뿑뿒뿓뿕뿖뿗뿘뿙뿚뿛뿝뿞뿠뿢뿣뿤뿥뿦뿧뿨뿩뿪뿫뿬뿭뿮뿯뿰뿱뿲뿳뿴뿵뿶뿷뿸뿹뿺뿻뿼뿽뿾뿿쀀쀁쀂쀃쀄쀅쀆쀇쀈쀉쀊쀋쀌쀍쀎쀏쀐쀑쀒쀓쀔쀕쀖쀗쀘쀙쀚쀛쀜쀝쀞쀟쀠쀡쀢쀣쀤쀥쀦쀧쀨쀩쀪쀫쀬쀭쀮쀯쀰쀱쀲쀳쀴쀵쀶쀷쀸쀹쀺쀻쀽쀾쀿�\".split(\"\");\nfor(j = 0; j != D[151].length; ++j) if(D[151][j].charCodeAt(0) !== 0xFFFD) { e[D[151][j]] = 38656 + j; d[38656 + j] = D[151][j];}\nD[152] = \"�����������������������������������������������������������������쁀쁁쁂쁃쁄쁅쁆쁇쁈쁉쁊쁋쁌쁍쁎쁏쁐쁒쁓쁔쁕쁖쁗쁙쁚쁛������쁝쁞쁟쁡쁢쁣쁤쁥쁦쁧쁪쁫쁬쁭쁮쁯쁰쁱쁲쁳쁴쁵쁶쁷쁸쁹������쁺쁻쁼쁽쁾쁿삀삁삂삃삄삅삆삇삈삉삊삋삌삍삎삏삒삓삕삖삗삙삚삛삜삝삞삟삢삤삦삧삨삩삪삫삮삱삲삷삸삹삺삻삾샂샃샄샆샇샊샋샍샎샏샑샒샓샔샕샖샗샚샞샟샠샡샢샣샦샧샩샪샫샭샮샯샰샱샲샳샶샸샺샻샼샽샾샿섁섂섃섅섆섇섉섊섋섌섍섎섏섑섒섓섔섖섗섘섙섚섛섡섢섥섨섩섪섫섮�\".split(\"\");\nfor(j = 0; j != D[152].length; ++j) if(D[152][j].charCodeAt(0) !== 0xFFFD) { e[D[152][j]] = 38912 + j; d[38912 + j] = D[152][j];}\nD[153] = \"�����������������������������������������������������������������섲섳섴섵섷섺섻섽섾섿셁셂셃셄셅셆셇셊셎셏셐셑셒셓셖셗������셙셚셛셝셞셟셠셡셢셣셦셪셫셬셭셮셯셱셲셳셵셶셷셹셺셻������셼셽셾셿솀솁솂솃솄솆솇솈솉솊솋솏솑솒솓솕솗솘솙솚솛솞솠솢솣솤솦솧솪솫솭솮솯솱솲솳솴솵솶솷솸솹솺솻솼솾솿쇀쇁쇂쇃쇅쇆쇇쇉쇊쇋쇍쇎쇏쇐쇑쇒쇓쇕쇖쇙쇚쇛쇜쇝쇞쇟쇡쇢쇣쇥쇦쇧쇩쇪쇫쇬쇭쇮쇯쇲쇴쇵쇶쇷쇸쇹쇺쇻쇾쇿숁숂숃숅숆숇숈숉숊숋숎숐숒숓숔숕숖숗숚숛숝숞숡숢숣�\".split(\"\");\nfor(j = 0; j != D[153].length; ++j) if(D[153][j].charCodeAt(0) !== 0xFFFD) { e[D[153][j]] = 39168 + j; d[39168 + j] = D[153][j];}\nD[154] = \"�����������������������������������������������������������������숤숥숦숧숪숬숮숰숳숵숶숷숸숹숺숻숼숽숾숿쉀쉁쉂쉃쉄쉅������쉆쉇쉉쉊쉋쉌쉍쉎쉏쉒쉓쉕쉖쉗쉙쉚쉛쉜쉝쉞쉟쉡쉢쉣쉤쉦������쉧쉨쉩쉪쉫쉮쉯쉱쉲쉳쉵쉶쉷쉸쉹쉺쉻쉾슀슂슃슄슅슆슇슊슋슌슍슎슏슑슒슓슔슕슖슗슙슚슜슞슟슠슡슢슣슦슧슩슪슫슮슯슰슱슲슳슶슸슺슻슼슽슾슿싀싁싂싃싄싅싆싇싈싉싊싋싌싍싎싏싐싑싒싓싔싕싖싗싘싙싚싛싞싟싡싢싥싦싧싨싩싪싮싰싲싳싴싵싷싺싽싾싿쌁쌂쌃쌄쌅쌆쌇쌊쌋쌎쌏�\".split(\"\");\nfor(j = 0; j != D[154].length; ++j) if(D[154][j].charCodeAt(0) !== 0xFFFD) { e[D[154][j]] = 39424 + j; d[39424 + j] = D[154][j];}\nD[155] = \"�����������������������������������������������������������������쌐쌑쌒쌖쌗쌙쌚쌛쌝쌞쌟쌠쌡쌢쌣쌦쌧쌪쌫쌬쌭쌮쌯쌰쌱쌲������쌳쌴쌵쌶쌷쌸쌹쌺쌻쌼쌽쌾쌿썀썁썂썃썄썆썇썈썉썊썋썌썍������썎썏썐썑썒썓썔썕썖썗썘썙썚썛썜썝썞썟썠썡썢썣썤썥썦썧썪썫썭썮썯썱썳썴썵썶썷썺썻썾썿쎀쎁쎂쎃쎅쎆쎇쎉쎊쎋쎍쎎쎏쎐쎑쎒쎓쎔쎕쎖쎗쎘쎙쎚쎛쎜쎝쎞쎟쎠쎡쎢쎣쎤쎥쎦쎧쎨쎩쎪쎫쎬쎭쎮쎯쎰쎱쎲쎳쎴쎵쎶쎷쎸쎹쎺쎻쎼쎽쎾쎿쏁쏂쏃쏄쏅쏆쏇쏈쏉쏊쏋쏌쏍쏎쏏쏐쏑쏒쏓쏔쏕쏖쏗쏚�\".split(\"\");\nfor(j = 0; j != D[155].length; ++j) if(D[155][j].charCodeAt(0) !== 0xFFFD) { e[D[155][j]] = 39680 + j; d[39680 + j] = D[155][j];}\nD[156] = \"�����������������������������������������������������������������쏛쏝쏞쏡쏣쏤쏥쏦쏧쏪쏫쏬쏮쏯쏰쏱쏲쏳쏶쏷쏹쏺쏻쏼쏽쏾������쏿쐀쐁쐂쐃쐄쐅쐆쐇쐉쐊쐋쐌쐍쐎쐏쐑쐒쐓쐔쐕쐖쐗쐘쐙쐚������쐛쐜쐝쐞쐟쐠쐡쐢쐣쐥쐦쐧쐨쐩쐪쐫쐭쐮쐯쐱쐲쐳쐵쐶쐷쐸쐹쐺쐻쐾쐿쑀쑁쑂쑃쑄쑅쑆쑇쑉쑊쑋쑌쑍쑎쑏쑐쑑쑒쑓쑔쑕쑖쑗쑘쑙쑚쑛쑜쑝쑞쑟쑠쑡쑢쑣쑦쑧쑩쑪쑫쑭쑮쑯쑰쑱쑲쑳쑶쑷쑸쑺쑻쑼쑽쑾쑿쒁쒂쒃쒄쒅쒆쒇쒈쒉쒊쒋쒌쒍쒎쒏쒐쒑쒒쒓쒕쒖쒗쒘쒙쒚쒛쒝쒞쒟쒠쒡쒢쒣쒤쒥쒦쒧쒨쒩�\".split(\"\");\nfor(j = 0; j != D[156].length; ++j) if(D[156][j].charCodeAt(0) !== 0xFFFD) { e[D[156][j]] = 39936 + j; d[39936 + j] = D[156][j];}\nD[157] = \"�����������������������������������������������������������������쒪쒫쒬쒭쒮쒯쒰쒱쒲쒳쒴쒵쒶쒷쒹쒺쒻쒽쒾쒿쓀쓁쓂쓃쓄쓅������쓆쓇쓈쓉쓊쓋쓌쓍쓎쓏쓐쓑쓒쓓쓔쓕쓖쓗쓘쓙쓚쓛쓜쓝쓞쓟������쓠쓡쓢쓣쓤쓥쓦쓧쓨쓪쓫쓬쓭쓮쓯쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂씃씄씅씆씇씈씉씊씋씍씎씏씑씒씓씕씖씗씘씙씚씛씝씞씟씠씡씢씣씤씥씦씧씪씫씭씮씯씱씲씳씴씵씶씷씺씼씾씿앀앁앂앃앆앇앋앏앐앑앒앖앚앛앜앟앢앣앥앦앧앩앪앫앬앭앮앯앲앶앷앸앹앺앻앾앿얁얂얃얅얆얈얉얊얋얎얐얒얓얔�\".split(\"\");\nfor(j = 0; j != D[157].length; ++j) if(D[157][j].charCodeAt(0) !== 0xFFFD) { e[D[157][j]] = 40192 + j; d[40192 + j] = D[157][j];}\nD[158] = \"�����������������������������������������������������������������얖얙얚얛얝얞얟얡얢얣얤얥얦얧얨얪얫얬얭얮얯얰얱얲얳얶������얷얺얿엀엁엂엃엋엍엏엒엓엕엖엗엙엚엛엜엝엞엟엢엤엦엧������엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋옍옎옏옑옒옓옔옕옖옗옚옝옞옟옠옡옢옣옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉왊왋왌왍왎왏왒왖왗왘왙왚왛왞왟왡왢왣왤왥왦왧왨왩왪왫왭왮왰왲왳왴왵왶왷왺왻왽왾왿욁욂욃욄욅욆욇욊욌욎욏욐욑욒욓욖욗욙욚욛욝욞욟욠욡욢욣욦�\".split(\"\");\nfor(j = 0; j != D[158].length; ++j) if(D[158][j].charCodeAt(0) !== 0xFFFD) { e[D[158][j]] = 40448 + j; d[40448 + j] = D[158][j];}\nD[159] = \"�����������������������������������������������������������������욨욪욫욬욭욮욯욲욳욵욶욷욻욼욽욾욿웂웄웆웇웈웉웊웋웎������웏웑웒웓웕웖웗웘웙웚웛웞웟웢웣웤웥웦웧웪웫웭웮웯웱웲������웳웴웵웶웷웺웻웼웾웿윀윁윂윃윆윇윉윊윋윍윎윏윐윑윒윓윖윘윚윛윜윝윞윟윢윣윥윦윧윩윪윫윬윭윮윯윲윴윶윸윹윺윻윾윿읁읂읃읅읆읇읈읉읋읎읐읙읚읛읝읞읟읡읢읣읤읥읦읧읩읪읬읭읮읯읰읱읲읳읶읷읹읺읻읿잀잁잂잆잋잌잍잏잒잓잕잙잛잜잝잞잟잢잧잨잩잪잫잮잯잱잲잳잵잶잷�\".split(\"\");\nfor(j = 0; j != D[159].length; ++j) if(D[159][j].charCodeAt(0) !== 0xFFFD) { e[D[159][j]] = 40704 + j; d[40704 + j] = D[159][j];}\nD[160] = \"�����������������������������������������������������������������잸잹잺잻잾쟂쟃쟄쟅쟆쟇쟊쟋쟍쟏쟑쟒쟓쟔쟕쟖쟗쟙쟚쟛쟜������쟞쟟쟠쟡쟢쟣쟥쟦쟧쟩쟪쟫쟭쟮쟯쟰쟱쟲쟳쟴쟵쟶쟷쟸쟹쟺������쟻쟼쟽쟾쟿젂젃젅젆젇젉젋젌젍젎젏젒젔젗젘젙젚젛젞젟젡젢젣젥젦젧젨젩젪젫젮젰젲젳젴젵젶젷젹젺젻젽젾젿졁졂졃졄졅졆졇졊졋졎졏졐졑졒졓졕졖졗졘졙졚졛졜졝졞졟졠졡졢졣졤졥졦졧졨졩졪졫졬졭졮졯졲졳졵졶졷졹졻졼졽졾졿좂좄좈좉좊좎좏좐좑좒좓좕좖좗좘좙좚좛좜좞좠좢좣좤�\".split(\"\");\nfor(j = 0; j != D[160].length; ++j) if(D[160][j].charCodeAt(0) !== 0xFFFD) { e[D[160][j]] = 40960 + j; d[40960 + j] = D[160][j];}\nD[161] = \"�����������������������������������������������������������������좥좦좧좩좪좫좬좭좮좯좰좱좲좳좴좵좶좷좸좹좺좻좾좿죀죁������죂죃죅죆죇죉죊죋죍죎죏죐죑죒죓죖죘죚죛죜죝죞죟죢죣죥������죦죧죨죩죪죫죬죭죮죯죰죱죲죳죴죶죷죸죹죺죻죾죿줁줂줃줇줈줉줊줋줎 、。·‥…¨〃­―∥\∼‘’“”〔〕〈〉《》「」『』【】±×÷≠≤≥∞∴°′″℃Å¢£¥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨¬�\".split(\"\");\nfor(j = 0; j != D[161].length; ++j) if(D[161][j].charCodeAt(0) !== 0xFFFD) { e[D[161][j]] = 41216 + j; d[41216 + j] = D[161][j];}\nD[162] = \"�����������������������������������������������������������������줐줒줓줔줕줖줗줙줚줛줜줝줞줟줠줡줢줣줤줥줦줧줨줩줪줫������줭줮줯줰줱줲줳줵줶줷줸줹줺줻줼줽줾줿쥀쥁쥂쥃쥄쥅쥆쥇������쥈쥉쥊쥋쥌쥍쥎쥏쥒쥓쥕쥖쥗쥙쥚쥛쥜쥝쥞쥟쥢쥤쥥쥦쥧쥨쥩쥪쥫쥭쥮쥯⇒⇔∀∃´~ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®������������������������\".split(\"\");\nfor(j = 0; j != D[162].length; ++j) if(D[162][j].charCodeAt(0) !== 0xFFFD) { e[D[162][j]] = 41472 + j; d[41472 + j] = D[162][j];}\nD[163] = \"�����������������������������������������������������������������쥱쥲쥳쥵쥶쥷쥸쥹쥺쥻쥽쥾쥿즀즁즂즃즄즅즆즇즊즋즍즎즏������즑즒즓즔즕즖즗즚즜즞즟즠즡즢즣즤즥즦즧즨즩즪즫즬즭즮������즯즰즱즲즳즴즵즶즷즸즹즺즻즼즽즾즿짂짃짅짆짉짋짌짍짎짏짒짔짗짘짛!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[₩]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�\".split(\"\");\nfor(j = 0; j != D[163].length; ++j) if(D[163][j].charCodeAt(0) !== 0xFFFD) { e[D[163][j]] = 41728 + j; d[41728 + j] = D[163][j];}\nD[164] = \"�����������������������������������������������������������������짞짟짡짣짥짦짨짩짪짫짮짲짳짴짵짶짷짺짻짽짾짿쨁쨂쨃쨄������쨅쨆쨇쨊쨎쨏쨐쨑쨒쨓쨕쨖쨗쨙쨚쨛쨜쨝쨞쨟쨠쨡쨢쨣쨤쨥������쨦쨧쨨쨪쨫쨬쨭쨮쨯쨰쨱쨲쨳쨴쨵쨶쨷쨸쨹쨺쨻쨼쨽쨾쨿쩀쩁쩂쩃쩄쩅쩆ㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅃㅄㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣㅤㅥㅦㅧㅨㅩㅪㅫㅬㅭㅮㅯㅰㅱㅲㅳㅴㅵㅶㅷㅸㅹㅺㅻㅼㅽㅾㅿㆀㆁㆂㆃㆄㆅㆆㆇㆈㆉㆊㆋㆌㆍㆎ�\".split(\"\");\nfor(j = 0; j != D[164].length; ++j) if(D[164][j].charCodeAt(0) !== 0xFFFD) { e[D[164][j]] = 41984 + j; d[41984 + j] = D[164][j];}\nD[165] = \"�����������������������������������������������������������������쩇쩈쩉쩊쩋쩎쩏쩑쩒쩓쩕쩖쩗쩘쩙쩚쩛쩞쩢쩣쩤쩥쩦쩧쩩쩪������쩫쩬쩭쩮쩯쩰쩱쩲쩳쩴쩵쩶쩷쩸쩹쩺쩻쩼쩾쩿쪀쪁쪂쪃쪅쪆������쪇쪈쪉쪊쪋쪌쪍쪎쪏쪐쪑쪒쪓쪔쪕쪖쪗쪙쪚쪛쪜쪝쪞쪟쪠쪡쪢쪣쪤쪥쪦쪧ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ�����ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ�������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�������\".split(\"\");\nfor(j = 0; j != D[165].length; ++j) if(D[165][j].charCodeAt(0) !== 0xFFFD) { e[D[165][j]] = 42240 + j; d[42240 + j] = D[165][j];}\nD[166] = \"�����������������������������������������������������������������쪨쪩쪪쪫쪬쪭쪮쪯쪰쪱쪲쪳쪴쪵쪶쪷쪸쪹쪺쪻쪾쪿쫁쫂쫃쫅������쫆쫇쫈쫉쫊쫋쫎쫐쫒쫔쫕쫖쫗쫚쫛쫜쫝쫞쫟쫡쫢쫣쫤쫥쫦쫧������쫨쫩쫪쫫쫭쫮쫯쫰쫱쫲쫳쫵쫶쫷쫸쫹쫺쫻쫼쫽쫾쫿쬀쬁쬂쬃쬄쬅쬆쬇쬉쬊─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂┒┑┚┙┖┕┎┍┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀╁╃╄╅╆╇╈╉╊���������������������������\".split(\"\");\nfor(j = 0; j != D[166].length; ++j) if(D[166][j].charCodeAt(0) !== 0xFFFD) { e[D[166][j]] = 42496 + j; d[42496 + j] = D[166][j];}\nD[167] = \"�����������������������������������������������������������������쬋쬌쬍쬎쬏쬑쬒쬓쬕쬖쬗쬙쬚쬛쬜쬝쬞쬟쬢쬣쬤쬥쬦쬧쬨쬩������쬪쬫쬬쬭쬮쬯쬰쬱쬲쬳쬴쬵쬶쬷쬸쬹쬺쬻쬼쬽쬾쬿쭀쭂쭃쭄������쭅쭆쭇쭊쭋쭍쭎쭏쭑쭒쭓쭔쭕쭖쭗쭚쭛쭜쭞쭟쭠쭡쭢쭣쭥쭦쭧쭨쭩쭪쭫쭬㎕㎖㎗ℓ㎘㏄㎣㎤㎥㎦㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㏊㎍㎎㎏㏏㎈㎉㏈㎧㎨㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎀㎁㎂㎃㎄㎺㎻㎼㎽㎾㎿㎐㎑㎒㎓㎔Ω㏀㏁㎊㎋㎌㏖㏅㎭㎮㎯㏛㎩㎪㎫㎬㏝㏐㏓㏃㏉㏜㏆����������������\".split(\"\");\nfor(j = 0; j != D[167].length; ++j) if(D[167][j].charCodeAt(0) !== 0xFFFD) { e[D[167][j]] = 42752 + j; d[42752 + j] = D[167][j];}\nD[168] = \"�����������������������������������������������������������������쭭쭮쭯쭰쭱쭲쭳쭴쭵쭶쭷쭺쭻쭼쭽쭾쭿쮀쮁쮂쮃쮄쮅쮆쮇쮈������쮉쮊쮋쮌쮍쮎쮏쮐쮑쮒쮓쮔쮕쮖쮗쮘쮙쮚쮛쮝쮞쮟쮠쮡쮢쮣������쮤쮥쮦쮧쮨쮩쮪쮫쮬쮭쮮쮯쮰쮱쮲쮳쮴쮵쮶쮷쮹쮺쮻쮼쮽쮾쮿쯀쯁쯂쯃쯄ÆÐªĦ�IJ�ĿŁØŒºÞŦŊ�㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮½⅓⅔¼¾⅛⅜⅝⅞�\".split(\"\");\nfor(j = 0; j != D[168].length; ++j) if(D[168][j].charCodeAt(0) !== 0xFFFD) { e[D[168][j]] = 43008 + j; d[43008 + j] = D[168][j];}\nD[169] = \"�����������������������������������������������������������������쯅쯆쯇쯈쯉쯊쯋쯌쯍쯎쯏쯐쯑쯒쯓쯕쯖쯗쯘쯙쯚쯛쯜쯝쯞쯟������쯠쯡쯢쯣쯥쯦쯨쯪쯫쯬쯭쯮쯯쯰쯱쯲쯳쯴쯵쯶쯷쯸쯹쯺쯻쯼������쯽쯾쯿찀찁찂찃찄찅찆찇찈찉찊찋찎찏찑찒찓찕찖찗찘찙찚찛찞찟찠찣찤æđðħıijĸŀłøœßþŧŋʼn㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗㈘㈙㈚㈛⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂¹²³⁴ⁿ₁₂₃₄�\".split(\"\");\nfor(j = 0; j != D[169].length; ++j) if(D[169][j].charCodeAt(0) !== 0xFFFD) { e[D[169][j]] = 43264 + j; d[43264 + j] = D[169][j];}\nD[170] = \"�����������������������������������������������������������������찥찦찪찫찭찯찱찲찳찴찵찶찷찺찿챀챁챂챃챆챇챉챊챋챍챎������챏챐챑챒챓챖챚챛챜챝챞챟챡챢챣챥챧챩챪챫챬챭챮챯챱챲������챳챴챶챷챸챹챺챻챼챽챾챿첀첁첂첃첄첅첆첇첈첉첊첋첌첍첎첏첐첑첒첓ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������\".split(\"\");\nfor(j = 0; j != D[170].length; ++j) if(D[170][j].charCodeAt(0) !== 0xFFFD) { e[D[170][j]] = 43520 + j; d[43520 + j] = D[170][j];}\nD[171] = \"�����������������������������������������������������������������첔첕첖첗첚첛첝첞첟첡첢첣첤첥첦첧첪첮첯첰첱첲첳첶첷첹������첺첻첽첾첿쳀쳁쳂쳃쳆쳈쳊쳋쳌쳍쳎쳏쳑쳒쳓쳕쳖쳗쳘쳙쳚������쳛쳜쳝쳞쳟쳠쳡쳢쳣쳥쳦쳧쳨쳩쳪쳫쳭쳮쳯쳱쳲쳳쳴쳵쳶쳷쳸쳹쳺쳻쳼쳽ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������\".split(\"\");\nfor(j = 0; j != D[171].length; ++j) if(D[171][j].charCodeAt(0) !== 0xFFFD) { e[D[171][j]] = 43776 + j; d[43776 + j] = D[171][j];}\nD[172] = \"�����������������������������������������������������������������쳾쳿촀촂촃촄촅촆촇촊촋촍촎촏촑촒촓촔촕촖촗촚촜촞촟촠������촡촢촣촥촦촧촩촪촫촭촮촯촰촱촲촳촴촵촶촷촸촺촻촼촽촾������촿쵀쵁쵂쵃쵄쵅쵆쵇쵈쵉쵊쵋쵌쵍쵎쵏쵐쵑쵒쵓쵔쵕쵖쵗쵘쵙쵚쵛쵝쵞쵟АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������\".split(\"\");\nfor(j = 0; j != D[172].length; ++j) if(D[172][j].charCodeAt(0) !== 0xFFFD) { e[D[172][j]] = 44032 + j; d[44032 + j] = D[172][j];}\nD[173] = \"�����������������������������������������������������������������쵡쵢쵣쵥쵦쵧쵨쵩쵪쵫쵮쵰쵲쵳쵴쵵쵶쵷쵹쵺쵻쵼쵽쵾쵿춀������춁춂춃춄춅춆춇춉춊춋춌춍춎춏춐춑춒춓춖춗춙춚춛춝춞춟������춠춡춢춣춦춨춪춫춬춭춮춯춱춲춳춴춵춶춷춸춹춺춻춼춽춾춿췀췁췂췃췅�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[173].length; ++j) if(D[173][j].charCodeAt(0) !== 0xFFFD) { e[D[173][j]] = 44288 + j; d[44288 + j] = D[173][j];}\nD[174] = \"�����������������������������������������������������������������췆췇췈췉췊췋췍췎췏췑췒췓췔췕췖췗췘췙췚췛췜췝췞췟췠췡������췢췣췤췥췦췧췩췪췫췭췮췯췱췲췳췴췵췶췷췺췼췾췿츀츁츂������츃츅츆츇츉츊츋츍츎츏츐츑츒츓츕츖츗츘츚츛츜츝츞츟츢츣츥츦츧츩츪츫�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[174].length; ++j) if(D[174][j].charCodeAt(0) !== 0xFFFD) { e[D[174][j]] = 44544 + j; d[44544 + j] = D[174][j];}\nD[175] = \"�����������������������������������������������������������������츬츭츮츯츲츴츶츷츸츹츺츻츼츽츾츿칀칁칂칃칄칅칆칇칈칉������칊칋칌칍칎칏칐칑칒칓칔칕칖칗칚칛칝칞칢칣칤칥칦칧칪칬������칮칯칰칱칲칳칶칷칹칺칻칽칾칿캀캁캂캃캆캈캊캋캌캍캎캏캒캓캕캖캗캙�����������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[175].length; ++j) if(D[175][j].charCodeAt(0) !== 0xFFFD) { e[D[175][j]] = 44800 + j; d[44800 + j] = D[175][j];}\nD[176] = \"�����������������������������������������������������������������캚캛캜캝캞캟캢캦캧캨캩캪캫캮캯캰캱캲캳캴캵캶캷캸캹캺������캻캼캽캾캿컀컂컃컄컅컆컇컈컉컊컋컌컍컎컏컐컑컒컓컔컕������컖컗컘컙컚컛컜컝컞컟컠컡컢컣컦컧컩컪컭컮컯컰컱컲컳컶컺컻컼컽컾컿가각간갇갈갉갊감갑값갓갔강갖갗같갚갛개객갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆�\".split(\"\");\nfor(j = 0; j != D[176].length; ++j) if(D[176][j].charCodeAt(0) !== 0xFFFD) { e[D[176][j]] = 45056 + j; d[45056 + j] = D[176][j];}\nD[177] = \"�����������������������������������������������������������������켂켃켅켆켇켉켊켋켌켍켎켏켒켔켖켗켘켙켚켛켝켞켟켡켢켣������켥켦켧켨켩켪켫켮켲켳켴켵켶켷켹켺켻켼켽켾켿콀콁콂콃콄������콅콆콇콈콉콊콋콌콍콎콏콐콑콒콓콖콗콙콚콛콝콞콟콠콡콢콣콦콨콪콫콬괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸�\".split(\"\");\nfor(j = 0; j != D[177].length; ++j) if(D[177][j].charCodeAt(0) !== 0xFFFD) { e[D[177][j]] = 45312 + j; d[45312 + j] = D[177][j];}\nD[178] = \"�����������������������������������������������������������������콭콮콯콲콳콵콶콷콹콺콻콼콽콾콿쾁쾂쾃쾄쾆쾇쾈쾉쾊쾋쾍������쾎쾏쾐쾑쾒쾓쾔쾕쾖쾗쾘쾙쾚쾛쾜쾝쾞쾟쾠쾢쾣쾤쾥쾦쾧쾩������쾪쾫쾬쾭쾮쾯쾱쾲쾳쾴쾵쾶쾷쾸쾹쾺쾻쾼쾽쾾쾿쿀쿁쿂쿃쿅쿆쿇쿈쿉쿊쿋깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙�\".split(\"\");\nfor(j = 0; j != D[178].length; ++j) if(D[178][j].charCodeAt(0) !== 0xFFFD) { e[D[178][j]] = 45568 + j; d[45568 + j] = D[178][j];}\nD[179] = \"�����������������������������������������������������������������쿌쿍쿎쿏쿐쿑쿒쿓쿔쿕쿖쿗쿘쿙쿚쿛쿜쿝쿞쿟쿢쿣쿥쿦쿧쿩������쿪쿫쿬쿭쿮쿯쿲쿴쿶쿷쿸쿹쿺쿻쿽쿾쿿퀁퀂퀃퀅퀆퀇퀈퀉퀊������퀋퀌퀍퀎퀏퀐퀒퀓퀔퀕퀖퀗퀙퀚퀛퀜퀝퀞퀟퀠퀡퀢퀣퀤퀥퀦퀧퀨퀩퀪퀫퀬끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫났낭낮낯낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝�\".split(\"\");\nfor(j = 0; j != D[179].length; ++j) if(D[179][j].charCodeAt(0) !== 0xFFFD) { e[D[179][j]] = 45824 + j; d[45824 + j] = D[179][j];}\nD[180] = \"�����������������������������������������������������������������퀮퀯퀰퀱퀲퀳퀶퀷퀹퀺퀻퀽퀾퀿큀큁큂큃큆큈큊큋큌큍큎큏������큑큒큓큕큖큗큙큚큛큜큝큞큟큡큢큣큤큥큦큧큨큩큪큫큮큯������큱큲큳큵큶큷큸큹큺큻큾큿킀킂킃킄킅킆킇킈킉킊킋킌킍킎킏킐킑킒킓킔뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫달닭닮닯닳담답닷닸당닺닻닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥�\".split(\"\");\nfor(j = 0; j != D[180].length; ++j) if(D[180][j].charCodeAt(0) !== 0xFFFD) { e[D[180][j]] = 46080 + j; d[46080 + j] = D[180][j];}\nD[181] = \"�����������������������������������������������������������������킕킖킗킘킙킚킛킜킝킞킟킠킡킢킣킦킧킩킪킫킭킮킯킰킱킲������킳킶킸킺킻킼킽킾킿탂탃탅탆탇탊탋탌탍탎탏탒탖탗탘탙탚������탛탞탟탡탢탣탥탦탧탨탩탪탫탮탲탳탴탵탶탷탹탺탻탼탽탾탿턀턁턂턃턄덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸�\".split(\"\");\nfor(j = 0; j != D[181].length; ++j) if(D[181][j].charCodeAt(0) !== 0xFFFD) { e[D[181][j]] = 46336 + j; d[46336 + j] = D[181][j];}\nD[182] = \"�����������������������������������������������������������������턅턆턇턈턉턊턋턌턎턏턐턑턒턓턔턕턖턗턘턙턚턛턜턝턞턟������턠턡턢턣턤턥턦턧턨턩턪턫턬턭턮턯턲턳턵턶턷턹턻턼턽턾������턿텂텆텇텈텉텊텋텎텏텑텒텓텕텖텗텘텙텚텛텞텠텢텣텤텥텦텧텩텪텫텭땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗�\".split(\"\");\nfor(j = 0; j != D[182].length; ++j) if(D[182][j].charCodeAt(0) !== 0xFFFD) { e[D[182][j]] = 46592 + j; d[46592 + j] = D[182][j];}\nD[183] = \"�����������������������������������������������������������������텮텯텰텱텲텳텴텵텶텷텸텹텺텻텽텾텿톀톁톂톃톅톆톇톉톊������톋톌톍톎톏톐톑톒톓톔톕톖톗톘톙톚톛톜톝톞톟톢톣톥톦톧������톩톪톫톬톭톮톯톲톴톶톷톸톹톻톽톾톿퇁퇂퇃퇄퇅퇆퇇퇈퇉퇊퇋퇌퇍퇎퇏래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩�\".split(\"\");\nfor(j = 0; j != D[183].length; ++j) if(D[183][j].charCodeAt(0) !== 0xFFFD) { e[D[183][j]] = 46848 + j; d[46848 + j] = D[183][j];}\nD[184] = \"�����������������������������������������������������������������퇐퇑퇒퇓퇔퇕퇖퇗퇙퇚퇛퇜퇝퇞퇟퇠퇡퇢퇣퇤퇥퇦퇧퇨퇩퇪������퇫퇬퇭퇮퇯퇰퇱퇲퇳퇵퇶퇷퇹퇺퇻퇼퇽퇾퇿툀툁툂툃툄툅툆������툈툊툋툌툍툎툏툑툒툓툔툕툖툗툘툙툚툛툜툝툞툟툠툡툢툣툤툥툦툧툨툩륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많맏말맑맒맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼�\".split(\"\");\nfor(j = 0; j != D[184].length; ++j) if(D[184][j].charCodeAt(0) !== 0xFFFD) { e[D[184][j]] = 47104 + j; d[47104 + j] = D[184][j];}\nD[185] = \"�����������������������������������������������������������������툪툫툮툯툱툲툳툵툶툷툸툹툺툻툾퉀퉂퉃퉄퉅퉆퉇퉉퉊퉋퉌������퉍퉎퉏퉐퉑퉒퉓퉔퉕퉖퉗퉘퉙퉚퉛퉝퉞퉟퉠퉡퉢퉣퉥퉦퉧퉨������퉩퉪퉫퉬퉭퉮퉯퉰퉱퉲퉳퉴퉵퉶퉷퉸퉹퉺퉻퉼퉽퉾퉿튂튃튅튆튇튉튊튋튌묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바박밖밗반받발밝밞밟밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗�\".split(\"\");\nfor(j = 0; j != D[185].length; ++j) if(D[185][j].charCodeAt(0) !== 0xFFFD) { e[D[185][j]] = 47360 + j; d[47360 + j] = D[185][j];}\nD[186] = \"�����������������������������������������������������������������튍튎튏튒튓튔튖튗튘튙튚튛튝튞튟튡튢튣튥튦튧튨튩튪튫튭������튮튯튰튲튳튴튵튶튷튺튻튽튾틁틃틄틅틆틇틊틌틍틎틏틐틑������틒틓틕틖틗틙틚틛틝틞틟틠틡틢틣틦틧틨틩틪틫틬틭틮틯틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤�\".split(\"\");\nfor(j = 0; j != D[186].length; ++j) if(D[186][j].charCodeAt(0) !== 0xFFFD) { e[D[186][j]] = 47616 + j; d[47616 + j] = D[186][j];}\nD[187] = \"�����������������������������������������������������������������틻틼틽틾틿팂팄팆팇팈팉팊팋팏팑팒팓팕팗팘팙팚팛팞팢팣������팤팦팧팪팫팭팮팯팱팲팳팴팵팶팷팺팾팿퍀퍁퍂퍃퍆퍇퍈퍉������퍊퍋퍌퍍퍎퍏퍐퍑퍒퍓퍔퍕퍖퍗퍘퍙퍚퍛퍜퍝퍞퍟퍠퍡퍢퍣퍤퍥퍦퍧퍨퍩빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤�\".split(\"\");\nfor(j = 0; j != D[187].length; ++j) if(D[187][j].charCodeAt(0) !== 0xFFFD) { e[D[187][j]] = 47872 + j; d[47872 + j] = D[187][j];}\nD[188] = \"�����������������������������������������������������������������퍪퍫퍬퍭퍮퍯퍰퍱퍲퍳퍴퍵퍶퍷퍸퍹퍺퍻퍾퍿펁펂펃펅펆펇������펈펉펊펋펎펒펓펔펕펖펗펚펛펝펞펟펡펢펣펤펥펦펧펪펬펮������펯펰펱펲펳펵펶펷펹펺펻펽펾펿폀폁폂폃폆폇폊폋폌폍폎폏폑폒폓폔폕폖샥샨샬샴샵샷샹섀섄섈섐섕서석섞섟선섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭�\".split(\"\");\nfor(j = 0; j != D[188].length; ++j) if(D[188][j].charCodeAt(0) !== 0xFFFD) { e[D[188][j]] = 48128 + j; d[48128 + j] = D[188][j];}\nD[189] = \"�����������������������������������������������������������������폗폙폚폛폜폝폞폟폠폢폤폥폦폧폨폩폪폫폮폯폱폲폳폵폶폷������폸폹폺폻폾퐀퐂퐃퐄퐅퐆퐇퐉퐊퐋퐌퐍퐎퐏퐐퐑퐒퐓퐔퐕퐖������퐗퐘퐙퐚퐛퐜퐞퐟퐠퐡퐢퐣퐤퐥퐦퐧퐨퐩퐪퐫퐬퐭퐮퐯퐰퐱퐲퐳퐴퐵퐶퐷숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰�\".split(\"\");\nfor(j = 0; j != D[189].length; ++j) if(D[189][j].charCodeAt(0) !== 0xFFFD) { e[D[189][j]] = 48384 + j; d[48384 + j] = D[189][j];}\nD[190] = \"�����������������������������������������������������������������퐸퐹퐺퐻퐼퐽퐾퐿푁푂푃푅푆푇푈푉푊푋푌푍푎푏푐푑푒푓������푔푕푖푗푘푙푚푛푝푞푟푡푢푣푥푦푧푨푩푪푫푬푮푰푱푲������푳푴푵푶푷푺푻푽푾풁풃풄풅풆풇풊풌풎풏풐풑풒풓풕풖풗풘풙풚풛풜풝쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄업없엇었엉엊엌엎�\".split(\"\");\nfor(j = 0; j != D[190].length; ++j) if(D[190][j].charCodeAt(0) !== 0xFFFD) { e[D[190][j]] = 48640 + j; d[48640 + j] = D[190][j];}\nD[191] = \"�����������������������������������������������������������������풞풟풠풡풢풣풤풥풦풧풨풪풫풬풭풮풯풰풱풲풳풴풵풶풷풸������풹풺풻풼풽풾풿퓀퓁퓂퓃퓄퓅퓆퓇퓈퓉퓊퓋퓍퓎퓏퓑퓒퓓퓕������퓖퓗퓘퓙퓚퓛퓝퓞퓠퓡퓢퓣퓤퓥퓦퓧퓩퓪퓫퓭퓮퓯퓱퓲퓳퓴퓵퓶퓷퓹퓺퓼에엑엔엘엠엡엣엥여역엮연열엶엷염엽엾엿였영옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨�\".split(\"\");\nfor(j = 0; j != D[191].length; ++j) if(D[191][j].charCodeAt(0) !== 0xFFFD) { e[D[191][j]] = 48896 + j; d[48896 + j] = D[191][j];}\nD[192] = \"�����������������������������������������������������������������퓾퓿픀픁픂픃픅픆픇픉픊픋픍픎픏픐픑픒픓픖픘픙픚픛픜픝������픞픟픠픡픢픣픤픥픦픧픨픩픪픫픬픭픮픯픰픱픲픳픴픵픶픷������픸픹픺픻픾픿핁핂핃핅핆핇핈핉핊핋핎핐핒핓핔핕핖핗핚핛핝핞핟핡핢핣웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응읒읓읔읕읖읗의읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊�\".split(\"\");\nfor(j = 0; j != D[192].length; ++j) if(D[192][j].charCodeAt(0) !== 0xFFFD) { e[D[192][j]] = 49152 + j; d[49152 + j] = D[192][j];}\nD[193] = \"�����������������������������������������������������������������핤핦핧핪핬핮핯핰핱핲핳핶핷핹핺핻핽핾핿햀햁햂햃햆햊햋������햌햍햎햏햑햒햓햔햕햖햗햘햙햚햛햜햝햞햟햠햡햢햣햤햦햧������햨햩햪햫햬햭햮햯햰햱햲햳햴햵햶햷햸햹햺햻햼햽햾햿헀헁헂헃헄헅헆헇점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓�\".split(\"\");\nfor(j = 0; j != D[193].length; ++j) if(D[193][j].charCodeAt(0) !== 0xFFFD) { e[D[193][j]] = 49408 + j; d[49408 + j] = D[193][j];}\nD[194] = \"�����������������������������������������������������������������헊헋헍헎헏헑헓헔헕헖헗헚헜헞헟헠헡헢헣헦헧헩헪헫헭헮������헯헰헱헲헳헶헸헺헻헼헽헾헿혂혃혅혆혇혉혊혋혌혍혎혏혒������혖혗혘혙혚혛혝혞혟혡혢혣혥혦혧혨혩혪혫혬혮혯혰혱혲혳혴혵혶혷혺혻징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻�\".split(\"\");\nfor(j = 0; j != D[194].length; ++j) if(D[194][j].charCodeAt(0) !== 0xFFFD) { e[D[194][j]] = 49664 + j; d[49664 + j] = D[194][j];}\nD[195] = \"�����������������������������������������������������������������혽혾혿홁홂홃홄홆홇홊홌홎홏홐홒홓홖홗홙홚홛홝홞홟홠홡������홢홣홤홥홦홨홪홫홬홭홮홯홲홳홵홶홷홸홹홺홻홼홽홾홿횀������횁횂횄횆횇횈횉횊횋횎횏횑횒횓횕횖횗횘횙횚횛횜횞횠횢횣횤횥횦횧횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층�\".split(\"\");\nfor(j = 0; j != D[195].length; ++j) if(D[195][j].charCodeAt(0) !== 0xFFFD) { e[D[195][j]] = 49920 + j; d[49920 + j] = D[195][j];}\nD[196] = \"�����������������������������������������������������������������횫횭횮횯횱횲횳횴횵횶횷횸횺횼횽횾횿훀훁훂훃훆훇훉훊훋������훍훎훏훐훒훓훕훖훘훚훛훜훝훞훟훡훢훣훥훦훧훩훪훫훬훭������훮훯훱훲훳훴훶훷훸훹훺훻훾훿휁휂휃휅휆휇휈휉휊휋휌휍휎휏휐휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼�\".split(\"\");\nfor(j = 0; j != D[196].length; ++j) if(D[196][j].charCodeAt(0) !== 0xFFFD) { e[D[196][j]] = 50176 + j; d[50176 + j] = D[196][j];}\nD[197] = \"�����������������������������������������������������������������휕휖휗휚휛휝휞휟휡휢휣휤휥휦휧휪휬휮휯휰휱휲휳휶휷휹������휺휻휽휾휿흀흁흂흃흅흆흈흊흋흌흍흎흏흒흓흕흚흛흜흝흞������흟흢흤흦흧흨흪흫흭흮흯흱흲흳흵흶흷흸흹흺흻흾흿힀힂힃힄힅힆힇힊힋큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜�\".split(\"\");\nfor(j = 0; j != D[197].length; ++j) if(D[197][j].charCodeAt(0) !== 0xFFFD) { e[D[197][j]] = 50432 + j; d[50432 + j] = D[197][j];}\nD[198] = \"�����������������������������������������������������������������힍힎힏힑힒힓힔힕힖힗힚힜힞힟힠힡힢힣������������������������������������������������������������������������������퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁�\".split(\"\");\nfor(j = 0; j != D[198].length; ++j) if(D[198][j].charCodeAt(0) !== 0xFFFD) { e[D[198][j]] = 50688 + j; d[50688 + j] = D[198][j];}\nD[199] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠�\".split(\"\");\nfor(j = 0; j != D[199].length; ++j) if(D[199][j].charCodeAt(0) !== 0xFFFD) { e[D[199][j]] = 50944 + j; d[50944 + j] = D[199][j];}\nD[200] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝�\".split(\"\");\nfor(j = 0; j != D[200].length; ++j) if(D[200][j].charCodeAt(0) !== 0xFFFD) { e[D[200][j]] = 51200 + j; d[51200 + j] = D[200][j];}\nD[202] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕刻却各恪慤殼珏脚覺角閣侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間乫喝曷渴碣竭葛褐蝎鞨勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕�\".split(\"\");\nfor(j = 0; j != D[202].length; ++j) if(D[202][j].charCodeAt(0) !== 0xFFFD) { e[D[202][j]] = 51712 + j; d[51712 + j] = D[202][j];}\nD[203] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開喀客坑更粳羹醵倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸乾件健巾建愆楗腱虔蹇鍵騫乞傑杰桀儉劍劒檢�\".split(\"\");\nfor(j = 0; j != D[203].length; ++j) if(D[203][j].charCodeAt(0) !== 0xFFFD) { e[D[203][j]] = 51968 + j; d[51968 + j] = D[203][j];}\nD[204] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������瞼鈐黔劫怯迲偈憩揭擊格檄激膈覡隔堅牽犬甄絹繭肩見譴遣鵑抉決潔結缺訣兼慊箝謙鉗鎌京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨係啓堺契季屆悸戒桂械�\".split(\"\");\nfor(j = 0; j != D[204].length; ++j) if(D[204][j].charCodeAt(0) !== 0xFFFD) { e[D[204][j]] = 52224 + j; d[52224 + j] = D[204][j];}\nD[205] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������棨溪界癸磎稽系繫繼計誡谿階鷄古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓哭斛曲梏穀谷鵠困坤崑昆梱棍滾琨袞鯤汨滑骨供公共功孔工恐恭拱控攻珙空蚣貢鞏串寡戈果瓜�\".split(\"\");\nfor(j = 0; j != D[205].length; ++j) if(D[205][j].charCodeAt(0) !== 0xFFFD) { e[D[205][j]] = 52480 + j; d[52480 + j] = D[205][j];}\nD[206] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������科菓誇課跨過鍋顆廓槨藿郭串冠官寬慣棺款灌琯瓘管罐菅觀貫關館刮恝括适侊光匡壙廣曠洸炚狂珖筐胱鑛卦掛罫乖傀塊壞怪愧拐槐魁宏紘肱轟交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久九仇俱具勾�\".split(\"\");\nfor(j = 0; j != D[206].length; ++j) if(D[206][j].charCodeAt(0) !== 0xFFFD) { e[D[206][j]] = 52736 + j; d[52736 + j] = D[206][j];}\nD[207] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局菊鞠鞫麴君窘群裙軍郡堀屈掘窟宮弓穹窮芎躬倦券勸卷圈拳捲權淃眷厥獗蕨蹶闕机櫃潰詭軌饋句晷歸貴�\".split(\"\");\nfor(j = 0; j != D[207].length; ++j) if(D[207][j].charCodeAt(0) !== 0xFFFD) { e[D[207][j]] = 52992 + j; d[52992 + j] = D[207][j];}\nD[208] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������鬼龜叫圭奎揆槻珪硅窺竅糾葵規赳逵閨勻均畇筠菌鈞龜橘克剋劇戟棘極隙僅劤勤懃斤根槿瑾筋芹菫覲謹近饉契今妗擒昑檎琴禁禽芩衾衿襟金錦伋及急扱汲級給亘兢矜肯企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣�\".split(\"\");\nfor(j = 0; j != D[208].length; ++j) if(D[208][j].charCodeAt(0) !== 0xFFFD) { e[D[208][j]] = 53248 + j; d[53248 + j] = D[208][j];}\nD[209] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒緊佶吉拮桔金喫儺喇奈娜懦懶拏拿癩羅蘿螺裸邏那樂洛烙珞落諾酪駱亂卵暖欄煖爛蘭難鸞捏捺南嵐枏楠湳濫男藍襤拉�\".split(\"\");\nfor(j = 0; j != D[209].length; ++j) if(D[209][j].charCodeAt(0) !== 0xFFFD) { e[D[209][j]] = 53504 + j; d[53504 + j] = D[209][j];}\nD[210] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������納臘蠟衲囊娘廊朗浪狼郎乃來內奈柰耐冷女年撚秊念恬拈捻寧寗努勞奴弩怒擄櫓爐瑙盧老蘆虜路露駑魯鷺碌祿綠菉錄鹿論壟弄濃籠聾膿農惱牢磊腦賂雷尿壘屢樓淚漏累縷陋嫩訥杻紐勒肋凜凌稜綾能菱陵尼泥匿溺多茶�\".split(\"\");\nfor(j = 0; j != D[210].length; ++j) if(D[210][j].charCodeAt(0) !== 0xFFFD) { e[D[210][j]] = 53760 + j; d[53760 + j] = D[210][j];}\nD[211] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛撻澾獺疸達啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟沓畓答踏遝唐堂塘幢戇撞棠當糖螳黨代垈坮大對岱帶待戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃�\".split(\"\");\nfor(j = 0; j != D[211].length; ++j) if(D[211][j].charCodeAt(0) !== 0xFFFD) { e[D[211][j]] = 54016 + j; d[54016 + j] = D[211][j];}\nD[212] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������棹櫂淘渡滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜毒瀆牘犢獨督禿篤纛讀墩惇敦旽暾沌焞燉豚頓乭突仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅兜斗杜枓痘竇荳讀豆逗頭屯臀芚遁遯鈍得嶝橙燈登等藤謄鄧騰喇懶拏癩羅�\".split(\"\");\nfor(j = 0; j != D[212].length; ++j) if(D[212][j].charCodeAt(0) !== 0xFFFD) { e[D[212][j]] = 54272 + j; d[54272 + j] = D[212][j];}\nD[213] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������蘿螺裸邏樂洛烙珞絡落諾酪駱丹亂卵欄欒瀾爛蘭鸞剌辣嵐擥攬欖濫籃纜藍襤覽拉臘蠟廊朗浪狼琅瑯螂郞來崍徠萊冷掠略亮倆兩凉梁樑粮粱糧良諒輛量侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷瀝礫轢靂憐戀攣漣�\".split(\"\");\nfor(j = 0; j != D[213].length; ++j) if(D[213][j].charCodeAt(0) !== 0xFFFD) { e[D[213][j]] = 54528 + j; d[54528 + j] = D[213][j];}\nD[214] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������煉璉練聯蓮輦連鍊冽列劣洌烈裂廉斂殮濂簾獵令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡例澧禮醴隷勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵碌祿綠菉錄鹿麓論壟弄朧瀧瓏籠聾儡瀨牢磊賂賚賴雷了僚寮廖料燎療瞭聊蓼�\".split(\"\");\nfor(j = 0; j != D[214].length; ++j) if(D[214][j].charCodeAt(0) !== 0xFFFD) { e[D[214][j]] = 54784 + j; d[54784 + j] = D[214][j];}\nD[215] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������遼鬧龍壘婁屢樓淚漏瘻累縷蔞褸鏤陋劉旒柳榴流溜瀏琉瑠留瘤硫謬類六戮陸侖倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾菱陵俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉吝潾燐璘藺躪隣鱗麟林淋琳臨霖砬�\".split(\"\");\nfor(j = 0; j != D[215].length; ++j) if(D[215][j].charCodeAt(0) !== 0xFFFD) { e[D[215][j]] = 55040 + j; d[55040 + j] = D[215][j];}\nD[216] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻唜抹末沫茉襪靺亡妄忘忙望網罔芒茫莽輞邙埋妹媒寐昧枚梅每煤罵買賣邁魅脈貊陌驀麥孟氓猛盲盟萌冪覓免冕勉棉沔眄眠綿緬面麵滅�\".split(\"\");\nfor(j = 0; j != D[216].length; ++j) if(D[216][j].charCodeAt(0) !== 0xFFFD) { e[D[216][j]] = 55296 + j; d[55296 + j] = D[216][j];}\nD[217] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������蔑冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌木沐牧目睦穆鶩歿沒夢朦蒙卯墓妙廟描昴杳渺猫竗苗錨務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡墨默們刎吻問文�\".split(\"\");\nfor(j = 0; j != D[217].length; ++j) if(D[217][j].charCodeAt(0) !== 0xFFFD) { e[D[217][j]] = 55552 + j; d[55552 + j] = D[217][j];}\nD[218] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������汶紊紋聞蚊門雯勿沕物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴岷悶愍憫敏旻旼民泯玟珉緡閔密蜜謐剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯勃拔撥渤潑�\".split(\"\");\nfor(j = 0; j != D[218].length; ++j) if(D[218][j].charCodeAt(0) !== 0xFFFD) { e[D[218][j]] = 55808 + j; d[55808 + j] = D[218][j];}\nD[219] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������發跋醱鉢髮魃倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪伯佰帛柏栢白百魄幡樊煩燔番磻繁蕃藩飜伐筏罰閥凡帆梵氾汎泛犯範范法琺僻劈壁擘檗璧癖�\".split(\"\");\nfor(j = 0; j != D[219].length; ++j) if(D[219][j].charCodeAt(0) !== 0xFFFD) { e[D[219][j]] = 56064 + j; d[56064 + j] = D[219][j];}\nD[220] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������碧蘗闢霹便卞弁變辨辯邊別瞥鱉鼈丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈保堡報寶普步洑湺潽珤甫菩補褓譜輔伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒本乶俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳不付俯傅剖副否咐埠夫婦�\".split(\"\");\nfor(j = 0; j != D[220].length; ++j) if(D[220][j].charCodeAt(0) !== 0xFFFD) { e[D[220][j]] = 56320 + j; d[56320 + j] = D[220][j];}\nD[221] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰不佛弗彿拂崩朋棚硼繃鵬丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥�\".split(\"\");\nfor(j = 0; j != D[221].length; ++j) if(D[221][j].charCodeAt(0) !== 0xFFFD) { e[D[221][j]] = 56576 + j; d[56576 + j] = D[221][j];}\nD[222] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������脾臂菲蜚裨誹譬費鄙非飛鼻嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻憑氷聘騁乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝削數朔索�\".split(\"\");\nfor(j = 0; j != D[222].length; ++j) if(D[222][j].charCodeAt(0) !== 0xFFFD) { e[D[222][j]] = 56832 + j; d[56832 + j] = D[222][j];}\nD[223] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������傘刪山散汕珊産疝算蒜酸霰乷撒殺煞薩三參杉森渗芟蔘衫揷澁鈒颯上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署�\".split(\"\");\nfor(j = 0; j != D[223].length; ++j) if(D[223][j].charCodeAt(0) !== 0xFFFD) { e[D[223][j]] = 57088 + j; d[57088 + j] = D[223][j];}\nD[224] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������胥舒薯西誓逝鋤黍鼠夕奭席惜昔晳析汐淅潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮卨屑楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾贍閃陝攝涉燮葉城姓宬性惺成星晟猩珹盛省筬�\".split(\"\");\nfor(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}\nD[225] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������聖聲腥誠醒世勢歲洗稅笹細說貰召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷俗屬束涑粟續謖贖速孫巽損蓀遜飡率宋悚松淞訟誦送頌刷殺灑碎鎖衰釗修受嗽囚垂壽嫂守岫峀帥愁�\".split(\"\");\nfor(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}\nD[226] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚叔塾夙孰宿淑潚熟琡璹肅菽巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴戌術述鉥崇崧�\".split(\"\");\nfor(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}\nD[227] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������嵩瑟膝蝨濕拾習褶襲丞乘僧勝升承昇繩蠅陞侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺埴寔式息拭植殖湜熄篒蝕識軾食飾伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅失室實悉審尋心沁�\".split(\"\");\nfor(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}\nD[228] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������沈深瀋甚芯諶什十拾雙氏亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷安岸按晏案眼雁鞍顔鮟斡謁軋閼唵岩巖庵暗癌菴闇壓押狎鴨仰央怏昻殃秧鴦厓哀埃崖愛曖涯碍艾隘靄厄扼掖液縊腋額�\".split(\"\");\nfor(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}\nD[229] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������櫻罌鶯鸚也倻冶夜惹揶椰爺耶若野弱掠略約若葯蒻藥躍亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養圄御於漁瘀禦語馭魚齬億憶抑檍臆偃堰彦焉言諺孼蘖俺儼嚴奄掩淹嶪業円予余勵呂女如廬�\".split(\"\");\nfor(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}\nD[230] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎亦力域役易曆歷疫繹譯轢逆驛嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶列劣咽悅涅烈熱裂說閱厭廉念捻染殮炎焰琰艶苒�\".split(\"\");\nfor(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}\nD[231] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������簾閻髥鹽曄獵燁葉令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳�\".split(\"\");\nfor(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}\nD[232] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������烏熬獒筽蜈誤鰲鼇屋沃獄玉鈺溫瑥瘟穩縕蘊兀壅擁瓮甕癰翁邕雍饔渦瓦窩窪臥蛙蝸訛婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬巍猥畏了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療�\".split(\"\");\nfor(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}\nD[233] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������窈窯繇繞耀腰蓼蟯要謠遙遼邀饒慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩勖彧旭昱栯煜稶郁頊云暈橒殞澐熉耘芸蕓�\".split(\"\");\nfor(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}\nD[234] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������運隕雲韻蔚鬱亐熊雄元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛月越鉞位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜�\".split(\"\");\nfor(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}\nD[235] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類六堉戮毓肉育陸倫允奫尹崙淪潤玧胤贇輪鈗閏律慄栗率聿戎瀜絨融隆垠恩慇殷誾銀隱乙吟淫蔭陰音飮揖泣邑凝應膺鷹依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼�\".split(\"\");\nfor(j = 0; j != D[235].length; ++j) if(D[235][j].charCodeAt(0) !== 0xFFFD) { e[D[235][j]] = 60160 + j; d[60160 + j] = D[235][j];}\nD[236] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������議醫二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟一佚佾壹日溢逸鎰馹任壬妊姙恁林淋稔臨荏賃入卄�\".split(\"\");\nfor(j = 0; j != D[236].length; ++j) if(D[236][j].charCodeAt(0) !== 0xFFFD) { e[D[236][j]] = 60416 + j; d[60416 + j] = D[236][j];}\nD[237] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������立笠粒仍剩孕芿仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌作勺嚼斫昨灼炸爵綽芍酌雀鵲孱棧殘潺盞岑暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長�\".split(\"\");\nfor(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}\nD[238] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������障再哉在宰才材栽梓渽滓災縡裁財載齋齎爭箏諍錚佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱�\".split(\"\");\nfor(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}\nD[239] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞切截折浙癤竊節絶占岾店漸点粘霑鮎點接摺蝶丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖�\".split(\"\");\nfor(j = 0; j != D[239].length; ++j) if(D[239][j].charCodeAt(0) !== 0xFFFD) { e[D[239][j]] = 61184 + j; d[61184 + j] = D[239][j];}\nD[240] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������靜頂鼎制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥族簇足鏃存尊卒拙猝倧宗從悰慫棕淙琮種終綜縱腫�\".split(\"\");\nfor(j = 0; j != D[240].length; ++j) if(D[240][j].charCodeAt(0) !== 0xFFFD) { e[D[240][j]] = 61440 + j; d[61440 + j] = D[240][j];}\nD[241] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������踪踵鍾鐘佐坐左座挫罪主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐竹粥俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿茁中仲衆重卽櫛楫汁葺增憎曾拯烝甑症繒蒸證贈之只�\".split(\"\");\nfor(j = 0; j != D[241].length; ++j) if(D[241][j].charCodeAt(0) !== 0xFFFD) { e[D[241][j]] = 61696 + j; d[61696 + j] = D[241][j];}\nD[242] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲直稙稷織職唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭斟朕什執潗緝輯�\".split(\"\");\nfor(j = 0; j != D[242].length; ++j) if(D[242][j].charCodeAt(0) !== 0xFFFD) { e[D[242][j]] = 61952 + j; d[61952 + j] = D[242][j];}\nD[243] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������鏶集徵懲澄且侘借叉嗟嵯差次此磋箚茶蹉車遮捉搾着窄錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌刹察擦札紮僭參塹慘慙懺斬站讒讖倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼債埰寀寨彩採砦綵菜蔡采釵冊柵策�\".split(\"\");\nfor(j = 0; j != D[243].length; ++j) if(D[243][j].charCodeAt(0) !== 0xFFFD) { e[D[243][j]] = 62208 + j; d[62208 + j] = D[243][j];}\nD[244] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆凸哲喆徹撤澈綴輟轍鐵僉尖沾添甛瞻簽籤詹諂堞妾帖捷牒疊睫諜貼輒廳晴淸聽菁請靑鯖切剃替涕滯締諦逮遞體初剿哨憔抄招梢�\".split(\"\");\nfor(j = 0; j != D[244].length; ++j) if(D[244][j].charCodeAt(0) !== 0xFFFD) { e[D[244][j]] = 62464 + j; d[62464 + j] = D[244][j];}\nD[245] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮促囑燭矗蜀觸寸忖村邨叢塚寵悤憁摠總聰蔥銃撮催崔最墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍丑畜祝竺筑築縮蓄蹙蹴軸逐春椿瑃出朮黜充忠沖蟲衝衷悴膵萃�\".split(\"\");\nfor(j = 0; j != D[245].length; ++j) if(D[245][j].charCodeAt(0) !== 0xFFFD) { e[D[245][j]] = 62720 + j; d[62720 + j] = D[245][j];}\nD[246] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲側仄厠惻測層侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸琛砧針鍼蟄秤稱快他咤唾墮妥惰打拖朶楕舵陀馱駝倬卓啄坼度托拓擢晫柝濁濯琢琸託�\".split(\"\");\nfor(j = 0; j != D[246].length; ++j) if(D[246][j].charCodeAt(0) !== 0xFFFD) { e[D[246][j]] = 62976 + j; d[62976 + j] = D[246][j];}\nD[247] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������鐸呑嘆坦彈憚歎灘炭綻誕奪脫探眈耽貪塔搭榻宕帑湯糖蕩兌台太怠態殆汰泰笞胎苔跆邰颱宅擇澤撑攄兎吐土討慟桶洞痛筒統通堆槌腿褪退頹偸套妬投透鬪慝特闖坡婆巴把播擺杷波派爬琶破罷芭跛頗判坂板版瓣販辦鈑�\".split(\"\");\nfor(j = 0; j != D[247].length; ++j) if(D[247][j].charCodeAt(0) !== 0xFFFD) { e[D[247][j]] = 63232 + j; d[63232 + j] = D[247][j];}\nD[248] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������阪八叭捌佩唄悖敗沛浿牌狽稗覇貝彭澎烹膨愎便偏扁片篇編翩遍鞭騙貶坪平枰萍評吠嬖幣廢弊斃肺蔽閉陛佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑幅暴曝瀑爆輻俵剽彪慓杓標漂瓢票表豹飇飄驃�\".split(\"\");\nfor(j = 0; j != D[248].length; ++j) if(D[248][j].charCodeAt(0) !== 0xFFFD) { e[D[248][j]] = 63488 + j; d[63488 + j] = D[248][j];}\nD[249] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������品稟楓諷豊風馮彼披疲皮被避陂匹弼必泌珌畢疋筆苾馝乏逼下何厦夏廈昰河瑕荷蝦賀遐霞鰕壑學虐謔鶴寒恨悍旱汗漢澣瀚罕翰閑閒限韓割轄函含咸啣喊檻涵緘艦銜陷鹹合哈盒蛤閤闔陜亢伉姮嫦巷恒抗杭桁沆港缸肛航�\".split(\"\");\nfor(j = 0; j != D[249].length; ++j) if(D[249][j].charCodeAt(0) !== 0xFFFD) { e[D[249][j]] = 63744 + j; d[63744 + j] = D[249][j];}\nD[250] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������行降項亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸杏荇行享向嚮珦鄕響餉饗香噓墟虛許憲櫶獻軒歇險驗奕爀赫革俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯孑穴血頁嫌俠協夾峽挾浹狹脅脇莢鋏頰亨兄刑型�\".split(\"\");\nfor(j = 0; j != D[250].length; ++j) if(D[250][j].charCodeAt(0) !== 0xFFFD) { e[D[250][j]] = 64000 + j; d[64000 + j] = D[250][j];}\nD[251] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨兮彗惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥惑或酷婚昏混渾琿魂忽惚笏哄弘汞泓洪烘紅虹訌鴻化和嬅樺火畵�\".split(\"\");\nfor(j = 0; j != D[251].length; ++j) if(D[251][j].charCodeAt(0) !== 0xFFFD) { e[D[251][j]] = 64256 + j; d[64256 + j] = D[251][j];}\nD[252] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������禍禾花華話譁貨靴廓擴攫確碻穫丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥活滑猾豁闊凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄劃獲宖橫鐄哮嚆孝效斅曉梟涍淆�\".split(\"\");\nfor(j = 0; j != D[252].length; ++j) if(D[252][j].charCodeAt(0) !== 0xFFFD) { e[D[252][j]] = 64512 + j; d[64512 + j] = D[252][j];}\nD[253] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������爻肴酵驍侯候厚后吼喉嗅帿後朽煦珝逅勛勳塤壎焄熏燻薰訓暈薨喧暄煊萱卉喙毁彙徽揮暉煇諱輝麾休携烋畦虧恤譎鷸兇凶匈洶胸黑昕欣炘痕吃屹紇訖欠欽歆吸恰洽翕興僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲詰�\".split(\"\");\nfor(j = 0; j != D[253].length; ++j) if(D[253][j].charCodeAt(0) !== 0xFFFD) { e[D[253][j]] = 64768 + j; d[64768 + j] = D[253][j];}\nreturn {\"enc\": e, \"dec\": d }; })();\ncptable[950] = (function(){ var d = [], e = {}, D = [], j;\nD[0] = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}\nD[161] = \"���������������������������������������������������������������� ,、。.‧;:?!︰…‥﹐﹑﹒·﹔﹕﹖﹗|–︱—︳╴︴﹏()︵︶{}︷︸〔〕︹︺【】︻︼《》︽︾〈〉︿﹀「」﹁﹂『』﹃﹄﹙﹚����������������������������������﹛﹜﹝﹞‘’“”〝〞‵′#&*※§〃○●△▲◎☆★◇◆□■▽▼㊣℅¯ ̄_ˍ﹉﹊﹍﹎﹋﹌﹟﹠﹡+-×÷±√<>=≦≧≠∞≒≡﹢﹣﹤﹥﹦~∩∪⊥∠∟⊿㏒㏑∫∮∵∴♀♂⊕⊙↑↓←→↖↗↙↘∥∣/�\".split(\"\");\nfor(j = 0; j != D[161].length; ++j) if(D[161][j].charCodeAt(0) !== 0xFFFD) { e[D[161][j]] = 41216 + j; d[41216 + j] = D[161][j];}\nD[162] = \"����������������������������������������������������������������\∕﹨$¥〒¢£%@℃℉﹩﹪﹫㏕㎜㎝㎞㏎㎡㎎㎏㏄°兙兛兞兝兡兣嗧瓩糎▁▂▃▄▅▆▇█▏▎▍▌▋▊▉┼┴┬┤├▔─│▕┌┐└┘╭����������������������������������╮╰╯═╞╪╡◢◣◥◤╱╲╳0123456789ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ〡〢〣〤〥〦〧〨〩十卄卅ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv�\".split(\"\");\nfor(j = 0; j != D[162].length; ++j) if(D[162][j].charCodeAt(0) !== 0xFFFD) { e[D[162][j]] = 41472 + j; d[41472 + j] = D[162][j];}\nD[163] = \"����������������������������������������������������������������wxyzΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏ����������������������������������ㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ˙ˉˊˇˋ���������������������������������€������������������������������\".split(\"\");\nfor(j = 0; j != D[163].length; ++j) if(D[163][j].charCodeAt(0) !== 0xFFFD) { e[D[163][j]] = 41728 + j; d[41728 + j] = D[163][j];}\nD[164] = \"����������������������������������������������������������������一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才����������������������������������丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙�\".split(\"\");\nfor(j = 0; j != D[164].length; ++j) if(D[164][j].charCodeAt(0) !== 0xFFFD) { e[D[164][j]] = 41984 + j; d[41984 + j] = D[164][j];}\nD[165] = \"����������������������������������������������������������������世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外����������������������������������央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全�\".split(\"\");\nfor(j = 0; j != D[165].length; ++j) if(D[165][j].charCodeAt(0) !== 0xFFFD) { e[D[165][j]] = 42240 + j; d[42240 + j] = D[165][j];}\nD[166] = \"����������������������������������������������������������������共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年����������������������������������式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣�\".split(\"\");\nfor(j = 0; j != D[166].length; ++j) if(D[166][j].charCodeAt(0) !== 0xFFFD) { e[D[166][j]] = 42496 + j; d[42496 + j] = D[166][j];}\nD[167] = \"����������������������������������������������������������������作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍����������������������������������均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠�\".split(\"\");\nfor(j = 0; j != D[167].length; ++j) if(D[167][j].charCodeAt(0) !== 0xFFFD) { e[D[167][j]] = 42752 + j; d[42752 + j] = D[167][j];}\nD[168] = \"����������������������������������������������������������������杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒����������������������������������芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵�\".split(\"\");\nfor(j = 0; j != D[168].length; ++j) if(D[168][j].charCodeAt(0) !== 0xFFFD) { e[D[168][j]] = 43008 + j; d[43008 + j] = D[168][j];}\nD[169] = \"����������������������������������������������������������������咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居����������������������������������屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊�\".split(\"\");\nfor(j = 0; j != D[169].length; ++j) if(D[169][j].charCodeAt(0) !== 0xFFFD) { e[D[169][j]] = 43264 + j; d[43264 + j] = D[169][j];}\nD[170] = \"����������������������������������������������������������������昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠����������������������������������炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附�\".split(\"\");\nfor(j = 0; j != D[170].length; ++j) if(D[170][j].charCodeAt(0) !== 0xFFFD) { e[D[170][j]] = 43520 + j; d[43520 + j] = D[170][j];}\nD[171] = \"����������������������������������������������������������������陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品����������������������������������哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷�\".split(\"\");\nfor(j = 0; j != D[171].length; ++j) if(D[171][j].charCodeAt(0) !== 0xFFFD) { e[D[171][j]] = 43776 + j; d[43776 + j] = D[171][j];}\nD[172] = \"����������������������������������������������������������������拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗����������������������������������活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄�\".split(\"\");\nfor(j = 0; j != D[172].length; ++j) if(D[172][j].charCodeAt(0) !== 0xFFFD) { e[D[172][j]] = 44032 + j; d[44032 + j] = D[172][j];}\nD[173] = \"����������������������������������������������������������������耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥����������������������������������迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪�\".split(\"\");\nfor(j = 0; j != D[173].length; ++j) if(D[173][j].charCodeAt(0) !== 0xFFFD) { e[D[173][j]] = 44288 + j; d[44288 + j] = D[173][j];}\nD[174] = \"����������������������������������������������������������������哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙����������������������������������恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓�\".split(\"\");\nfor(j = 0; j != D[174].length; ++j) if(D[174][j].charCodeAt(0) !== 0xFFFD) { e[D[174][j]] = 44544 + j; d[44544 + j] = D[174][j];}\nD[175] = \"����������������������������������������������������������������浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷����������������������������������砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃�\".split(\"\");\nfor(j = 0; j != D[175].length; ++j) if(D[175][j].charCodeAt(0) !== 0xFFFD) { e[D[175][j]] = 44800 + j; d[44800 + j] = D[175][j];}\nD[176] = \"����������������������������������������������������������������虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡����������������������������������陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀�\".split(\"\");\nfor(j = 0; j != D[176].length; ++j) if(D[176][j].charCodeAt(0) !== 0xFFFD) { e[D[176][j]] = 45056 + j; d[45056 + j] = D[176][j];}\nD[177] = \"����������������������������������������������������������������娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽����������������������������������情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺�\".split(\"\");\nfor(j = 0; j != D[177].length; ++j) if(D[177][j].charCodeAt(0) !== 0xFFFD) { e[D[177][j]] = 45312 + j; d[45312 + j] = D[177][j];}\nD[178] = \"����������������������������������������������������������������毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶����������������������������������瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼�\".split(\"\");\nfor(j = 0; j != D[178].length; ++j) if(D[178][j].charCodeAt(0) !== 0xFFFD) { e[D[178][j]] = 45568 + j; d[45568 + j] = D[178][j];}\nD[179] = \"����������������������������������������������������������������莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途����������������������������������部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠�\".split(\"\");\nfor(j = 0; j != D[179].length; ++j) if(D[179][j].charCodeAt(0) !== 0xFFFD) { e[D[179][j]] = 45824 + j; d[45824 + j] = D[179][j];}\nD[180] = \"����������������������������������������������������������������婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍����������������������������������插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋�\".split(\"\");\nfor(j = 0; j != D[180].length; ++j) if(D[180][j].charCodeAt(0) !== 0xFFFD) { e[D[180][j]] = 46080 + j; d[46080 + j] = D[180][j];}\nD[181] = \"����������������������������������������������������������������溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘����������������������������������窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁�\".split(\"\");\nfor(j = 0; j != D[181].length; ++j) if(D[181][j].charCodeAt(0) !== 0xFFFD) { e[D[181][j]] = 46336 + j; d[46336 + j] = D[181][j];}\nD[182] = \"����������������������������������������������������������������詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑����������������������������������間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼�\".split(\"\");\nfor(j = 0; j != D[182].length; ++j) if(D[182][j].charCodeAt(0) !== 0xFFFD) { e[D[182][j]] = 46592 + j; d[46592 + j] = D[182][j];}\nD[183] = \"����������������������������������������������������������������媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業����������������������������������楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督�\".split(\"\");\nfor(j = 0; j != D[183].length; ++j) if(D[183][j].charCodeAt(0) !== 0xFFFD) { e[D[183][j]] = 46848 + j; d[46848 + j] = D[183][j];}\nD[184] = \"����������������������������������������������������������������睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫����������������������������������腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊�\".split(\"\");\nfor(j = 0; j != D[184].length; ++j) if(D[184][j].charCodeAt(0) !== 0xFFFD) { e[D[184][j]] = 47104 + j; d[47104 + j] = D[184][j];}\nD[185] = \"����������������������������������������������������������������辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴����������������������������������飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇�\".split(\"\");\nfor(j = 0; j != D[185].length; ++j) if(D[185][j].charCodeAt(0) !== 0xFFFD) { e[D[185][j]] = 47360 + j; d[47360 + j] = D[185][j];}\nD[186] = \"����������������������������������������������������������������愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢����������������������������������滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬�\".split(\"\");\nfor(j = 0; j != D[186].length; ++j) if(D[186][j].charCodeAt(0) !== 0xFFFD) { e[D[186][j]] = 47616 + j; d[47616 + j] = D[186][j];}\nD[187] = \"����������������������������������������������������������������罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤����������������������������������說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜�\".split(\"\");\nfor(j = 0; j != D[187].length; ++j) if(D[187][j].charCodeAt(0) !== 0xFFFD) { e[D[187][j]] = 47872 + j; d[47872 + j] = D[187][j];}\nD[188] = \"����������������������������������������������������������������劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂����������������������������������慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃�\".split(\"\");\nfor(j = 0; j != D[188].length; ++j) if(D[188][j].charCodeAt(0) !== 0xFFFD) { e[D[188][j]] = 48128 + j; d[48128 + j] = D[188][j];}\nD[189] = \"����������������������������������������������������������������瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯����������������������������������翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞�\".split(\"\");\nfor(j = 0; j != D[189].length; ++j) if(D[189][j].charCodeAt(0) !== 0xFFFD) { e[D[189][j]] = 48384 + j; d[48384 + j] = D[189][j];}\nD[190] = \"����������������������������������������������������������������輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉����������������������������������鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡�\".split(\"\");\nfor(j = 0; j != D[190].length; ++j) if(D[190][j].charCodeAt(0) !== 0xFFFD) { e[D[190][j]] = 48640 + j; d[48640 + j] = D[190][j];}\nD[191] = \"����������������������������������������������������������������濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊����������������������������������縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚�\".split(\"\");\nfor(j = 0; j != D[191].length; ++j) if(D[191][j].charCodeAt(0) !== 0xFFFD) { e[D[191][j]] = 48896 + j; d[48896 + j] = D[191][j];}\nD[192] = \"����������������������������������������������������������������錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇����������������������������������嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬�\".split(\"\");\nfor(j = 0; j != D[192].length; ++j) if(D[192][j].charCodeAt(0) !== 0xFFFD) { e[D[192][j]] = 49152 + j; d[49152 + j] = D[192][j];}\nD[193] = \"����������������������������������������������������������������瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪����������������������������������薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁�\".split(\"\");\nfor(j = 0; j != D[193].length; ++j) if(D[193][j].charCodeAt(0) !== 0xFFFD) { e[D[193][j]] = 49408 + j; d[49408 + j] = D[193][j];}\nD[194] = \"����������������������������������������������������������������駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘����������������������������������癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦�\".split(\"\");\nfor(j = 0; j != D[194].length; ++j) if(D[194][j].charCodeAt(0) !== 0xFFFD) { e[D[194][j]] = 49664 + j; d[49664 + j] = D[194][j];}\nD[195] = \"����������������������������������������������������������������鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸����������������������������������獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類�\".split(\"\");\nfor(j = 0; j != D[195].length; ++j) if(D[195][j].charCodeAt(0) !== 0xFFFD) { e[D[195][j]] = 49920 + j; d[49920 + j] = D[195][j];}\nD[196] = \"����������������������������������������������������������������願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼����������������������������������纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴�\".split(\"\");\nfor(j = 0; j != D[196].length; ++j) if(D[196][j].charCodeAt(0) !== 0xFFFD) { e[D[196][j]] = 50176 + j; d[50176 + j] = D[196][j];}\nD[197] = \"����������������������������������������������������������������護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬����������������������������������禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒�\".split(\"\");\nfor(j = 0; j != D[197].length; ++j) if(D[197][j].charCodeAt(0) !== 0xFFFD) { e[D[197][j]] = 50432 + j; d[50432 + j] = D[197][j];}\nD[198] = \"����������������������������������������������������������������讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲���������������������������������������������������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[198].length; ++j) if(D[198][j].charCodeAt(0) !== 0xFFFD) { e[D[198][j]] = 50688 + j; d[50688 + j] = D[198][j];}\nD[201] = \"����������������������������������������������������������������乂乜凵匚厂万丌乇亍囗兀屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕����������������������������������氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋�\".split(\"\");\nfor(j = 0; j != D[201].length; ++j) if(D[201][j].charCodeAt(0) !== 0xFFFD) { e[D[201][j]] = 51456 + j; d[51456 + j] = D[201][j];}\nD[202] = \"����������������������������������������������������������������汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘����������������������������������吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇�\".split(\"\");\nfor(j = 0; j != D[202].length; ++j) if(D[202][j].charCodeAt(0) !== 0xFFFD) { e[D[202][j]] = 51712 + j; d[51712 + j] = D[202][j];}\nD[203] = \"����������������������������������������������������������������杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓����������������������������������芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢�\".split(\"\");\nfor(j = 0; j != D[203].length; ++j) if(D[203][j].charCodeAt(0) !== 0xFFFD) { e[D[203][j]] = 51968 + j; d[51968 + j] = D[203][j];}\nD[204] = \"����������������������������������������������������������������坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋����������������������������������怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲�\".split(\"\");\nfor(j = 0; j != D[204].length; ++j) if(D[204][j].charCodeAt(0) !== 0xFFFD) { e[D[204][j]] = 52224 + j; d[52224 + j] = D[204][j];}\nD[205] = \"����������������������������������������������������������������泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺����������������������������������矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏�\".split(\"\");\nfor(j = 0; j != D[205].length; ++j) if(D[205][j].charCodeAt(0) !== 0xFFFD) { e[D[205][j]] = 52480 + j; d[52480 + j] = D[205][j];}\nD[206] = \"����������������������������������������������������������������哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛����������������������������������峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺�\".split(\"\");\nfor(j = 0; j != D[206].length; ++j) if(D[206][j].charCodeAt(0) !== 0xFFFD) { e[D[206][j]] = 52736 + j; d[52736 + j] = D[206][j];}\nD[207] = \"����������������������������������������������������������������柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂����������������������������������洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀�\".split(\"\");\nfor(j = 0; j != D[207].length; ++j) if(D[207][j].charCodeAt(0) !== 0xFFFD) { e[D[207][j]] = 52992 + j; d[52992 + j] = D[207][j];}\nD[208] = \"����������������������������������������������������������������穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪����������������������������������苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱�\".split(\"\");\nfor(j = 0; j != D[208].length; ++j) if(D[208][j].charCodeAt(0) !== 0xFFFD) { e[D[208][j]] = 53248 + j; d[53248 + j] = D[208][j];}\nD[209] = \"����������������������������������������������������������������唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧����������������������������������恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤�\".split(\"\");\nfor(j = 0; j != D[209].length; ++j) if(D[209][j].charCodeAt(0) !== 0xFFFD) { e[D[209][j]] = 53504 + j; d[53504 + j] = D[209][j];}\nD[210] = \"����������������������������������������������������������������毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸����������������������������������牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐�\".split(\"\");\nfor(j = 0; j != D[210].length; ++j) if(D[210][j].charCodeAt(0) !== 0xFFFD) { e[D[210][j]] = 53760 + j; d[53760 + j] = D[210][j];}\nD[211] = \"����������������������������������������������������������������笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢����������������������������������荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐�\".split(\"\");\nfor(j = 0; j != D[211].length; ++j) if(D[211][j].charCodeAt(0) !== 0xFFFD) { e[D[211][j]] = 54016 + j; d[54016 + j] = D[211][j];}\nD[212] = \"����������������������������������������������������������������酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅����������������������������������唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏�\".split(\"\");\nfor(j = 0; j != D[212].length; ++j) if(D[212][j].charCodeAt(0) !== 0xFFFD) { e[D[212][j]] = 54272 + j; d[54272 + j] = D[212][j];}\nD[213] = \"����������������������������������������������������������������崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟����������������������������������捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉�\".split(\"\");\nfor(j = 0; j != D[213].length; ++j) if(D[213][j].charCodeAt(0) !== 0xFFFD) { e[D[213][j]] = 54528 + j; d[54528 + j] = D[213][j];}\nD[214] = \"����������������������������������������������������������������淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏����������������������������������痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟�\".split(\"\");\nfor(j = 0; j != D[214].length; ++j) if(D[214][j].charCodeAt(0) !== 0xFFFD) { e[D[214][j]] = 54784 + j; d[54784 + j] = D[214][j];}\nD[215] = \"����������������������������������������������������������������耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷����������������������������������蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪�\".split(\"\");\nfor(j = 0; j != D[215].length; ++j) if(D[215][j].charCodeAt(0) !== 0xFFFD) { e[D[215][j]] = 55040 + j; d[55040 + j] = D[215][j];}\nD[216] = \"����������������������������������������������������������������釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷����������������������������������堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔�\".split(\"\");\nfor(j = 0; j != D[216].length; ++j) if(D[216][j].charCodeAt(0) !== 0xFFFD) { e[D[216][j]] = 55296 + j; d[55296 + j] = D[216][j];}\nD[217] = \"����������������������������������������������������������������惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒����������������������������������晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞�\".split(\"\");\nfor(j = 0; j != D[217].length; ++j) if(D[217][j].charCodeAt(0) !== 0xFFFD) { e[D[217][j]] = 55552 + j; d[55552 + j] = D[217][j];}\nD[218] = \"����������������������������������������������������������������湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖����������������������������������琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥�\".split(\"\");\nfor(j = 0; j != D[218].length; ++j) if(D[218][j].charCodeAt(0) !== 0xFFFD) { e[D[218][j]] = 55808 + j; d[55808 + j] = D[218][j];}\nD[219] = \"����������������������������������������������������������������罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳����������������������������������菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺�\".split(\"\");\nfor(j = 0; j != D[219].length; ++j) if(D[219][j].charCodeAt(0) !== 0xFFFD) { e[D[219][j]] = 56064 + j; d[56064 + j] = D[219][j];}\nD[220] = \"����������������������������������������������������������������軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈����������������������������������隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆�\".split(\"\");\nfor(j = 0; j != D[220].length; ++j) if(D[220][j].charCodeAt(0) !== 0xFFFD) { e[D[220][j]] = 56320 + j; d[56320 + j] = D[220][j];}\nD[221] = \"����������������������������������������������������������������媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤����������������������������������搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛嗀毻毼�\".split(\"\");\nfor(j = 0; j != D[221].length; ++j) if(D[221][j].charCodeAt(0) !== 0xFFFD) { e[D[221][j]] = 56576 + j; d[56576 + j] = D[221][j];}\nD[222] = \"����������������������������������������������������������������毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓����������������������������������煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓�\".split(\"\");\nfor(j = 0; j != D[222].length; ++j) if(D[222][j].charCodeAt(0) !== 0xFFFD) { e[D[222][j]] = 56832 + j; d[56832 + j] = D[222][j];}\nD[223] = \"����������������������������������������������������������������稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯����������������������������������腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤�\".split(\"\");\nfor(j = 0; j != D[223].length; ++j) if(D[223][j].charCodeAt(0) !== 0xFFFD) { e[D[223][j]] = 57088 + j; d[57088 + j] = D[223][j];}\nD[224] = \"����������������������������������������������������������������觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿����������������������������������遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠�\".split(\"\");\nfor(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}\nD[225] = \"����������������������������������������������������������������凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠����������������������������������寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉�\".split(\"\");\nfor(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}\nD[226] = \"����������������������������������������������������������������榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊����������������������������������漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓�\".split(\"\");\nfor(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}\nD[227] = \"����������������������������������������������������������������禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞����������������������������������耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻�\".split(\"\");\nfor(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}\nD[228] = \"����������������������������������������������������������������裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍����������������������������������銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘�\".split(\"\");\nfor(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}\nD[229] = \"����������������������������������������������������������������噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉����������������������������������憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒�\".split(\"\");\nfor(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}\nD[230] = \"����������������������������������������������������������������澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙����������������������������������獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟�\".split(\"\");\nfor(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}\nD[231] = \"����������������������������������������������������������������膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢����������������������������������蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧�\".split(\"\");\nfor(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}\nD[232] = \"����������������������������������������������������������������踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓����������������������������������銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮�\".split(\"\");\nfor(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}\nD[233] = \"����������������������������������������������������������������噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺����������������������������������憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸�\".split(\"\");\nfor(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}\nD[234] = \"����������������������������������������������������������������澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙����������������������������������瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘�\".split(\"\");\nfor(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}\nD[235] = \"����������������������������������������������������������������蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠����������������������������������諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌�\".split(\"\");\nfor(j = 0; j != D[235].length; ++j) if(D[235][j].charCodeAt(0) !== 0xFFFD) { e[D[235][j]] = 60160 + j; d[60160 + j] = D[235][j];}\nD[236] = \"����������������������������������������������������������������錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕����������������������������������魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎�\".split(\"\");\nfor(j = 0; j != D[236].length; ++j) if(D[236][j].charCodeAt(0) !== 0xFFFD) { e[D[236][j]] = 60416 + j; d[60416 + j] = D[236][j];}\nD[237] = \"����������������������������������������������������������������檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶����������������������������������瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞�\".split(\"\");\nfor(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}\nD[238] = \"����������������������������������������������������������������蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞����������������������������������謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜�\".split(\"\");\nfor(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}\nD[239] = \"����������������������������������������������������������������鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰����������������������������������鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶�\".split(\"\");\nfor(j = 0; j != D[239].length; ++j) if(D[239][j].charCodeAt(0) !== 0xFFFD) { e[D[239][j]] = 61184 + j; d[61184 + j] = D[239][j];}\nD[240] = \"����������������������������������������������������������������璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒����������������������������������臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧�\".split(\"\");\nfor(j = 0; j != D[240].length; ++j) if(D[240][j].charCodeAt(0) !== 0xFFFD) { e[D[240][j]] = 61440 + j; d[61440 + j] = D[240][j];}\nD[241] = \"����������������������������������������������������������������蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪����������������������������������鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰�\".split(\"\");\nfor(j = 0; j != D[241].length; ++j) if(D[241][j].charCodeAt(0) !== 0xFFFD) { e[D[241][j]] = 61696 + j; d[61696 + j] = D[241][j];}\nD[242] = \"����������������������������������������������������������������徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛����������������������������������礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕�\".split(\"\");\nfor(j = 0; j != D[242].length; ++j) if(D[242][j].charCodeAt(0) !== 0xFFFD) { e[D[242][j]] = 61952 + j; d[61952 + j] = D[242][j];}\nD[243] = \"����������������������������������������������������������������譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦����������������������������������鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲�\".split(\"\");\nfor(j = 0; j != D[243].length; ++j) if(D[243][j].charCodeAt(0) !== 0xFFFD) { e[D[243][j]] = 62208 + j; d[62208 + j] = D[243][j];}\nD[244] = \"����������������������������������������������������������������嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩����������������������������������禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿�\".split(\"\");\nfor(j = 0; j != D[244].length; ++j) if(D[244][j].charCodeAt(0) !== 0xFFFD) { e[D[244][j]] = 62464 + j; d[62464 + j] = D[244][j];}\nD[245] = \"����������������������������������������������������������������鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛����������������������������������鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥�\".split(\"\");\nfor(j = 0; j != D[245].length; ++j) if(D[245][j].charCodeAt(0) !== 0xFFFD) { e[D[245][j]] = 62720 + j; d[62720 + j] = D[245][j];}\nD[246] = \"����������������������������������������������������������������蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺����������������������������������騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚�\".split(\"\");\nfor(j = 0; j != D[246].length; ++j) if(D[246][j].charCodeAt(0) !== 0xFFFD) { e[D[246][j]] = 62976 + j; d[62976 + j] = D[246][j];}\nD[247] = \"����������������������������������������������������������������糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊����������������������������������驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾�\".split(\"\");\nfor(j = 0; j != D[247].length; ++j) if(D[247][j].charCodeAt(0) !== 0xFFFD) { e[D[247][j]] = 63232 + j; d[63232 + j] = D[247][j];}\nD[248] = \"����������������������������������������������������������������讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏����������������������������������齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚�\".split(\"\");\nfor(j = 0; j != D[248].length; ++j) if(D[248][j].charCodeAt(0) !== 0xFFFD) { e[D[248][j]] = 63488 + j; d[63488 + j] = D[248][j];}\nD[249] = \"����������������������������������������������������������������纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊����������������������������������龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯▓�\".split(\"\");\nfor(j = 0; j != D[249].length; ++j) if(D[249][j].charCodeAt(0) !== 0xFFFD) { e[D[249][j]] = 63744 + j; d[63744 + j] = D[249][j];}\nreturn {\"enc\": e, \"dec\": d }; })();\ncptable[1250] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“”•–—�™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1251] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1252] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1253] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1254] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“”•–—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1255] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰�‹�����‘’“”•–—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹ�ֻּֽ־ֿ׀ׁׂ׃װױײ׳״�������אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1256] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1257] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[1258] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“”•–—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖרÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[10000] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[10006] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦­ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ�\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[10007] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[10008] = (function(){ var d = [], e = {}, D = [], j;\nD[0] = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€���������������������������������������������������������������������������������������\".split(\"\");\nfor(j = 0; j != D[0].length; ++j) if(D[0][j].charCodeAt(0) !== 0xFFFD) { e[D[0][j]] = 0 + j; d[0 + j] = D[0][j];}\nD[161] = \"����������������������������������������������������������������������������������������������������������������������������������������������������������������� 、。・ˉˇ¨〃々―~�…‘’“”〔〕〈〉《》「」『』〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓�\".split(\"\");\nfor(j = 0; j != D[161].length; ++j) if(D[161][j].charCodeAt(0) !== 0xFFFD) { e[D[161][j]] = 41216 + j; d[41216 + j] = D[161][j];}\nD[162] = \"���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩��㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩��ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ���\".split(\"\");\nfor(j = 0; j != D[162].length; ++j) if(D[162][j].charCodeAt(0) !== 0xFFFD) { e[D[162][j]] = 41472 + j; d[41472 + j] = D[162][j];}\nD[163] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������!"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�\".split(\"\");\nfor(j = 0; j != D[163].length; ++j) if(D[163][j].charCodeAt(0) !== 0xFFFD) { e[D[163][j]] = 41728 + j; d[41728 + j] = D[163][j];}\nD[164] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������\".split(\"\");\nfor(j = 0; j != D[164].length; ++j) if(D[164][j].charCodeAt(0) !== 0xFFFD) { e[D[164][j]] = 41984 + j; d[41984 + j] = D[164][j];}\nD[165] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������\".split(\"\");\nfor(j = 0; j != D[165].length; ++j) if(D[165][j].charCodeAt(0) !== 0xFFFD) { e[D[165][j]] = 42240 + j; d[42240 + j] = D[165][j];}\nD[166] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω���������������������������������������\".split(\"\");\nfor(j = 0; j != D[166].length; ++j) if(D[166][j].charCodeAt(0) !== 0xFFFD) { e[D[166][j]] = 42496 + j; d[42496 + j] = D[166][j];}\nD[167] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������\".split(\"\");\nfor(j = 0; j != D[167].length; ++j) if(D[167][j].charCodeAt(0) !== 0xFFFD) { e[D[167][j]] = 42752 + j; d[42752 + j] = D[167][j];}\nD[168] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüê����������ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ����������������������\".split(\"\");\nfor(j = 0; j != D[168].length; ++j) if(D[168][j].charCodeAt(0) !== 0xFFFD) { e[D[168][j]] = 43008 + j; d[43008 + j] = D[168][j];}\nD[169] = \"��������������������������������������������������������������������������������������������������������������������������������������������������������������������─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋����������������\".split(\"\");\nfor(j = 0; j != D[169].length; ++j) if(D[169][j].charCodeAt(0) !== 0xFFFD) { e[D[169][j]] = 43264 + j; d[43264 + j] = D[169][j];}\nD[176] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥�\".split(\"\");\nfor(j = 0; j != D[176].length; ++j) if(D[176][j].charCodeAt(0) !== 0xFFFD) { e[D[176][j]] = 45056 + j; d[45056 + j] = D[176][j];}\nD[177] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳�\".split(\"\");\nfor(j = 0; j != D[177].length; ++j) if(D[177][j].charCodeAt(0) !== 0xFFFD) { e[D[177][j]] = 45312 + j; d[45312 + j] = D[177][j];}\nD[178] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖�\".split(\"\");\nfor(j = 0; j != D[178].length; ++j) if(D[178][j].charCodeAt(0) !== 0xFFFD) { e[D[178][j]] = 45568 + j; d[45568 + j] = D[178][j];}\nD[179] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚�\".split(\"\");\nfor(j = 0; j != D[179].length; ++j) if(D[179][j].charCodeAt(0) !== 0xFFFD) { e[D[179][j]] = 45824 + j; d[45824 + j] = D[179][j];}\nD[180] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮�\".split(\"\");\nfor(j = 0; j != D[180].length; ++j) if(D[180][j].charCodeAt(0) !== 0xFFFD) { e[D[180][j]] = 46080 + j; d[46080 + j] = D[180][j];}\nD[181] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠�\".split(\"\");\nfor(j = 0; j != D[181].length; ++j) if(D[181][j].charCodeAt(0) !== 0xFFFD) { e[D[181][j]] = 46336 + j; d[46336 + j] = D[181][j];}\nD[182] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二�\".split(\"\");\nfor(j = 0; j != D[182].length; ++j) if(D[182][j].charCodeAt(0) !== 0xFFFD) { e[D[182][j]] = 46592 + j; d[46592 + j] = D[182][j];}\nD[183] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服�\".split(\"\");\nfor(j = 0; j != D[183].length; ++j) if(D[183][j].charCodeAt(0) !== 0xFFFD) { e[D[183][j]] = 46848 + j; d[46848 + j] = D[183][j];}\nD[184] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹�\".split(\"\");\nfor(j = 0; j != D[184].length; ++j) if(D[184][j].charCodeAt(0) !== 0xFFFD) { e[D[184][j]] = 47104 + j; d[47104 + j] = D[184][j];}\nD[185] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈�\".split(\"\");\nfor(j = 0; j != D[185].length; ++j) if(D[185][j].charCodeAt(0) !== 0xFFFD) { e[D[185][j]] = 47360 + j; d[47360 + j] = D[185][j];}\nD[186] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖�\".split(\"\");\nfor(j = 0; j != D[186].length; ++j) if(D[186][j].charCodeAt(0) !== 0xFFFD) { e[D[186][j]] = 47616 + j; d[47616 + j] = D[186][j];}\nD[187] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕�\".split(\"\");\nfor(j = 0; j != D[187].length; ++j) if(D[187][j].charCodeAt(0) !== 0xFFFD) { e[D[187][j]] = 47872 + j; d[47872 + j] = D[187][j];}\nD[188] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件�\".split(\"\");\nfor(j = 0; j != D[188].length; ++j) if(D[188][j].charCodeAt(0) !== 0xFFFD) { e[D[188][j]] = 48128 + j; d[48128 + j] = D[188][j];}\nD[189] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸�\".split(\"\");\nfor(j = 0; j != D[189].length; ++j) if(D[189][j].charCodeAt(0) !== 0xFFFD) { e[D[189][j]] = 48384 + j; d[48384 + j] = D[189][j];}\nD[190] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻�\".split(\"\");\nfor(j = 0; j != D[190].length; ++j) if(D[190][j].charCodeAt(0) !== 0xFFFD) { e[D[190][j]] = 48640 + j; d[48640 + j] = D[190][j];}\nD[191] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀�\".split(\"\");\nfor(j = 0; j != D[191].length; ++j) if(D[191][j].charCodeAt(0) !== 0xFFFD) { e[D[191][j]] = 48896 + j; d[48896 + j] = D[191][j];}\nD[192] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐�\".split(\"\");\nfor(j = 0; j != D[192].length; ++j) if(D[192][j].charCodeAt(0) !== 0xFFFD) { e[D[192][j]] = 49152 + j; d[49152 + j] = D[192][j];}\nD[193] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿�\".split(\"\");\nfor(j = 0; j != D[193].length; ++j) if(D[193][j].charCodeAt(0) !== 0xFFFD) { e[D[193][j]] = 49408 + j; d[49408 + j] = D[193][j];}\nD[194] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫�\".split(\"\");\nfor(j = 0; j != D[194].length; ++j) if(D[194][j].charCodeAt(0) !== 0xFFFD) { e[D[194][j]] = 49664 + j; d[49664 + j] = D[194][j];}\nD[195] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸�\".split(\"\");\nfor(j = 0; j != D[195].length; ++j) if(D[195][j].charCodeAt(0) !== 0xFFFD) { e[D[195][j]] = 49920 + j; d[49920 + j] = D[195][j];}\nD[196] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁�\".split(\"\");\nfor(j = 0; j != D[196].length; ++j) if(D[196][j].charCodeAt(0) !== 0xFFFD) { e[D[196][j]] = 50176 + j; d[50176 + j] = D[196][j];}\nD[197] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗�\".split(\"\");\nfor(j = 0; j != D[197].length; ++j) if(D[197][j].charCodeAt(0) !== 0xFFFD) { e[D[197][j]] = 50432 + j; d[50432 + j] = D[197][j];}\nD[198] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐�\".split(\"\");\nfor(j = 0; j != D[198].length; ++j) if(D[198][j].charCodeAt(0) !== 0xFFFD) { e[D[198][j]] = 50688 + j; d[50688 + j] = D[198][j];}\nD[199] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠�\".split(\"\");\nfor(j = 0; j != D[199].length; ++j) if(D[199][j].charCodeAt(0) !== 0xFFFD) { e[D[199][j]] = 50944 + j; d[50944 + j] = D[199][j];}\nD[200] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁�\".split(\"\");\nfor(j = 0; j != D[200].length; ++j) if(D[200][j].charCodeAt(0) !== 0xFFFD) { e[D[200][j]] = 51200 + j; d[51200 + j] = D[200][j];}\nD[201] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳�\".split(\"\");\nfor(j = 0; j != D[201].length; ++j) if(D[201][j].charCodeAt(0) !== 0xFFFD) { e[D[201][j]] = 51456 + j; d[51456 + j] = D[201][j];}\nD[202] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱�\".split(\"\");\nfor(j = 0; j != D[202].length; ++j) if(D[202][j].charCodeAt(0) !== 0xFFFD) { e[D[202][j]] = 51712 + j; d[51712 + j] = D[202][j];}\nD[203] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔�\".split(\"\");\nfor(j = 0; j != D[203].length; ++j) if(D[203][j].charCodeAt(0) !== 0xFFFD) { e[D[203][j]] = 51968 + j; d[51968 + j] = D[203][j];}\nD[204] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃�\".split(\"\");\nfor(j = 0; j != D[204].length; ++j) if(D[204][j].charCodeAt(0) !== 0xFFFD) { e[D[204][j]] = 52224 + j; d[52224 + j] = D[204][j];}\nD[205] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威�\".split(\"\");\nfor(j = 0; j != D[205].length; ++j) if(D[205][j].charCodeAt(0) !== 0xFFFD) { e[D[205][j]] = 52480 + j; d[52480 + j] = D[205][j];}\nD[206] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺�\".split(\"\");\nfor(j = 0; j != D[206].length; ++j) if(D[206][j].charCodeAt(0) !== 0xFFFD) { e[D[206][j]] = 52736 + j; d[52736 + j] = D[206][j];}\nD[207] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓�\".split(\"\");\nfor(j = 0; j != D[207].length; ++j) if(D[207][j].charCodeAt(0) !== 0xFFFD) { e[D[207][j]] = 52992 + j; d[52992 + j] = D[207][j];}\nD[208] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄�\".split(\"\");\nfor(j = 0; j != D[208].length; ++j) if(D[208][j].charCodeAt(0) !== 0xFFFD) { e[D[208][j]] = 53248 + j; d[53248 + j] = D[208][j];}\nD[209] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶�\".split(\"\");\nfor(j = 0; j != D[209].length; ++j) if(D[209][j].charCodeAt(0) !== 0xFFFD) { e[D[209][j]] = 53504 + j; d[53504 + j] = D[209][j];}\nD[210] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐�\".split(\"\");\nfor(j = 0; j != D[210].length; ++j) if(D[210][j].charCodeAt(0) !== 0xFFFD) { e[D[210][j]] = 53760 + j; d[53760 + j] = D[210][j];}\nD[211] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉�\".split(\"\");\nfor(j = 0; j != D[211].length; ++j) if(D[211][j].charCodeAt(0) !== 0xFFFD) { e[D[211][j]] = 54016 + j; d[54016 + j] = D[211][j];}\nD[212] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧�\".split(\"\");\nfor(j = 0; j != D[212].length; ++j) if(D[212][j].charCodeAt(0) !== 0xFFFD) { e[D[212][j]] = 54272 + j; d[54272 + j] = D[212][j];}\nD[213] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政�\".split(\"\");\nfor(j = 0; j != D[213].length; ++j) if(D[213][j].charCodeAt(0) !== 0xFFFD) { e[D[213][j]] = 54528 + j; d[54528 + j] = D[213][j];}\nD[214] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑�\".split(\"\");\nfor(j = 0; j != D[214].length; ++j) if(D[214][j].charCodeAt(0) !== 0xFFFD) { e[D[214][j]] = 54784 + j; d[54784 + j] = D[214][j];}\nD[215] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座������\".split(\"\");\nfor(j = 0; j != D[215].length; ++j) if(D[215][j].charCodeAt(0) !== 0xFFFD) { e[D[215][j]] = 55040 + j; d[55040 + j] = D[215][j];}\nD[216] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝�\".split(\"\");\nfor(j = 0; j != D[216].length; ++j) if(D[216][j].charCodeAt(0) !== 0xFFFD) { e[D[216][j]] = 55296 + j; d[55296 + j] = D[216][j];}\nD[217] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼�\".split(\"\");\nfor(j = 0; j != D[217].length; ++j) if(D[217][j].charCodeAt(0) !== 0xFFFD) { e[D[217][j]] = 55552 + j; d[55552 + j] = D[217][j];}\nD[218] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺�\".split(\"\");\nfor(j = 0; j != D[218].length; ++j) if(D[218][j].charCodeAt(0) !== 0xFFFD) { e[D[218][j]] = 55808 + j; d[55808 + j] = D[218][j];}\nD[219] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝�\".split(\"\");\nfor(j = 0; j != D[219].length; ++j) if(D[219][j].charCodeAt(0) !== 0xFFFD) { e[D[219][j]] = 56064 + j; d[56064 + j] = D[219][j];}\nD[220] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥�\".split(\"\");\nfor(j = 0; j != D[220].length; ++j) if(D[220][j].charCodeAt(0) !== 0xFFFD) { e[D[220][j]] = 56320 + j; d[56320 + j] = D[220][j];}\nD[221] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺�\".split(\"\");\nfor(j = 0; j != D[221].length; ++j) if(D[221][j].charCodeAt(0) !== 0xFFFD) { e[D[221][j]] = 56576 + j; d[56576 + j] = D[221][j];}\nD[222] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖�\".split(\"\");\nfor(j = 0; j != D[222].length; ++j) if(D[222][j].charCodeAt(0) !== 0xFFFD) { e[D[222][j]] = 56832 + j; d[56832 + j] = D[222][j];}\nD[223] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼�\".split(\"\");\nfor(j = 0; j != D[223].length; ++j) if(D[223][j].charCodeAt(0) !== 0xFFFD) { e[D[223][j]] = 57088 + j; d[57088 + j] = D[223][j];}\nD[224] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼�\".split(\"\");\nfor(j = 0; j != D[224].length; ++j) if(D[224][j].charCodeAt(0) !== 0xFFFD) { e[D[224][j]] = 57344 + j; d[57344 + j] = D[224][j];}\nD[225] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺�\".split(\"\");\nfor(j = 0; j != D[225].length; ++j) if(D[225][j].charCodeAt(0) !== 0xFFFD) { e[D[225][j]] = 57600 + j; d[57600 + j] = D[225][j];}\nD[226] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂�\".split(\"\");\nfor(j = 0; j != D[226].length; ++j) if(D[226][j].charCodeAt(0) !== 0xFFFD) { e[D[226][j]] = 57856 + j; d[57856 + j] = D[226][j];}\nD[227] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾�\".split(\"\");\nfor(j = 0; j != D[227].length; ++j) if(D[227][j].charCodeAt(0) !== 0xFFFD) { e[D[227][j]] = 58112 + j; d[58112 + j] = D[227][j];}\nD[228] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑�\".split(\"\");\nfor(j = 0; j != D[228].length; ++j) if(D[228][j].charCodeAt(0) !== 0xFFFD) { e[D[228][j]] = 58368 + j; d[58368 + j] = D[228][j];}\nD[229] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣�\".split(\"\");\nfor(j = 0; j != D[229].length; ++j) if(D[229][j].charCodeAt(0) !== 0xFFFD) { e[D[229][j]] = 58624 + j; d[58624 + j] = D[229][j];}\nD[230] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩�\".split(\"\");\nfor(j = 0; j != D[230].length; ++j) if(D[230][j].charCodeAt(0) !== 0xFFFD) { e[D[230][j]] = 58880 + j; d[58880 + j] = D[230][j];}\nD[231] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬�\".split(\"\");\nfor(j = 0; j != D[231].length; ++j) if(D[231][j].charCodeAt(0) !== 0xFFFD) { e[D[231][j]] = 59136 + j; d[59136 + j] = D[231][j];}\nD[232] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹�\".split(\"\");\nfor(j = 0; j != D[232].length; ++j) if(D[232][j].charCodeAt(0) !== 0xFFFD) { e[D[232][j]] = 59392 + j; d[59392 + j] = D[232][j];}\nD[233] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋�\".split(\"\");\nfor(j = 0; j != D[233].length; ++j) if(D[233][j].charCodeAt(0) !== 0xFFFD) { e[D[233][j]] = 59648 + j; d[59648 + j] = D[233][j];}\nD[234] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰�\".split(\"\");\nfor(j = 0; j != D[234].length; ++j) if(D[234][j].charCodeAt(0) !== 0xFFFD) { e[D[234][j]] = 59904 + j; d[59904 + j] = D[234][j];}\nD[235] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻�\".split(\"\");\nfor(j = 0; j != D[235].length; ++j) if(D[235][j].charCodeAt(0) !== 0xFFFD) { e[D[235][j]] = 60160 + j; d[60160 + j] = D[235][j];}\nD[236] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐�\".split(\"\");\nfor(j = 0; j != D[236].length; ++j) if(D[236][j].charCodeAt(0) !== 0xFFFD) { e[D[236][j]] = 60416 + j; d[60416 + j] = D[236][j];}\nD[237] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨�\".split(\"\");\nfor(j = 0; j != D[237].length; ++j) if(D[237][j].charCodeAt(0) !== 0xFFFD) { e[D[237][j]] = 60672 + j; d[60672 + j] = D[237][j];}\nD[238] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪�\".split(\"\");\nfor(j = 0; j != D[238].length; ++j) if(D[238][j].charCodeAt(0) !== 0xFFFD) { e[D[238][j]] = 60928 + j; d[60928 + j] = D[238][j];}\nD[239] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔�\".split(\"\");\nfor(j = 0; j != D[239].length; ++j) if(D[239][j].charCodeAt(0) !== 0xFFFD) { e[D[239][j]] = 61184 + j; d[61184 + j] = D[239][j];}\nD[240] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙�\".split(\"\");\nfor(j = 0; j != D[240].length; ++j) if(D[240][j].charCodeAt(0) !== 0xFFFD) { e[D[240][j]] = 61440 + j; d[61440 + j] = D[240][j];}\nD[241] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃�\".split(\"\");\nfor(j = 0; j != D[241].length; ++j) if(D[241][j].charCodeAt(0) !== 0xFFFD) { e[D[241][j]] = 61696 + j; d[61696 + j] = D[241][j];}\nD[242] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒�\".split(\"\");\nfor(j = 0; j != D[242].length; ++j) if(D[242][j].charCodeAt(0) !== 0xFFFD) { e[D[242][j]] = 61952 + j; d[61952 + j] = D[242][j];}\nD[243] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋�\".split(\"\");\nfor(j = 0; j != D[243].length; ++j) if(D[243][j].charCodeAt(0) !== 0xFFFD) { e[D[243][j]] = 62208 + j; d[62208 + j] = D[243][j];}\nD[244] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤�\".split(\"\");\nfor(j = 0; j != D[244].length; ++j) if(D[244][j].charCodeAt(0) !== 0xFFFD) { e[D[244][j]] = 62464 + j; d[62464 + j] = D[244][j];}\nD[245] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜�\".split(\"\");\nfor(j = 0; j != D[245].length; ++j) if(D[245][j].charCodeAt(0) !== 0xFFFD) { e[D[245][j]] = 62720 + j; d[62720 + j] = D[245][j];}\nD[246] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋�\".split(\"\");\nfor(j = 0; j != D[246].length; ++j) if(D[246][j].charCodeAt(0) !== 0xFFFD) { e[D[246][j]] = 62976 + j; d[62976 + j] = D[246][j];}\nD[247] = \"�����������������������������������������������������������������������������������������������������������������������������������������������������������������鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄�\".split(\"\");\nfor(j = 0; j != D[247].length; ++j) if(D[247][j].charCodeAt(0) !== 0xFFFD) { e[D[247][j]] = 63232 + j; d[63232 + j] = D[247][j];}\nreturn {\"enc\": e, \"dec\": d }; })();\ncptable[10029] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[10079] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüݰ¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[10081] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸˝˛ˇ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\ncptable[28591] = (function(){ var d = \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\", D = [], e = {}; for(var i=0;i!=d.length;++i) { if(d.charCodeAt(i) !== 0xFFFD) e[d.charAt(i)] = i; D[i] = d.charAt(i); } return {\"enc\": e, \"dec\": D }; })();\n// eslint-disable-next-line no-undef\nif (typeof module !== 'undefined' && module.exports && typeof DO_NOT_EXPORT_CODEPAGE === 'undefined') module.exports = cptable;\n/*! cputils.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/* vim: set ft=javascript: */\n/*jshint newcap: false */\n(function(root, factory) {\n /*jshint ignore:start */\n /*eslint-disable */\n \"use strict\";\n if(typeof cptable === \"undefined\") {\n if(typeof require !== \"undefined\"){\n var cpt = cptable;\n if (typeof module !== 'undefined' && module.exports && typeof DO_NOT_EXPORT_CODEPAGE === 'undefined') module.exports = factory(cpt);\n else root.cptable = factory(cpt);\n } else throw new Error(\"cptable not found\");\n } else cptable = factory(cptable);\n /*eslint-enable */\n /*jshint ignore:end */\n}(this, function(cpt){\n \"use strict\";\n /*global module, Buffer */\n var magic = {\n \"1200\":\"utf16le\",\n \"1201\":\"utf16be\",\n \"12000\":\"utf32le\",\n \"12001\":\"utf32be\",\n \"16969\":\"utf64le\",\n \"20127\":\"ascii\",\n \"65000\":\"utf7\",\n \"65001\":\"utf8\"\n };\n\n var sbcs_cache = [874,1250,1251,1252,1253,1254,1255,1256,10000];\n var dbcs_cache = [932,936,949,950];\n var magic_cache = [65001];\n var magic_decode = {};\n var magic_encode = {};\n var cpdcache = {};\n var cpecache = {};\n\n var sfcc = function sfcc(x) { return String.fromCharCode(x); };\n var cca = function cca(x) { return x.charCodeAt(0); };\n\n var has_buf = (typeof Buffer !== 'undefined');\n var Buffer_from = function(){};\n if(has_buf) {\n var nbfs = !Buffer.from;\n if(!nbfs) try { Buffer.from(\"foo\", \"utf8\"); } catch(e) { nbfs = true; }\n Buffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);\n // $FlowIgnore\n if(!Buffer.allocUnsafe) Buffer.allocUnsafe = function(n) { return new Buffer(n); };\n\n var mdl = 1024, mdb = Buffer.allocUnsafe(mdl);\n var make_EE = function make_EE(E){\n var EE = Buffer.allocUnsafe(65536);\n for(var i = 0; i < 65536;++i) EE[i] = 0;\n var keys = Object.keys(E), len = keys.length;\n for(var ee = 0, e = keys[ee]; ee < len; ++ee) {\n if(!(e = keys[ee])) continue;\n EE[e.charCodeAt(0)] = E[e];\n }\n return EE;\n };\n var sbcs_encode = function make_sbcs_encode(cp) {\n var EE = make_EE(cpt[cp].enc);\n return function sbcs_e(data, ofmt) {\n var len = data.length;\n var out, i=0, j=0, D=0, w=0;\n if(typeof data === 'string') {\n out = Buffer.allocUnsafe(len);\n for(i = 0; i < len; ++i) out[i] = EE[data.charCodeAt(i)];\n } else if(Buffer.isBuffer(data)) {\n out = Buffer.allocUnsafe(2*len);\n j = 0;\n for(i = 0; i < len; ++i) {\n D = data[i];\n if(D < 128) out[j++] = EE[D];\n else if(D < 224) { out[j++] = EE[((D&31)<<6)+(data[i+1]&63)]; ++i; }\n else if(D < 240) { out[j++] = EE[((D&15)<<12)+((data[i+1]&63)<<6)+(data[i+2]&63)]; i+=2; }\n else {\n w = ((D&7)<<18)+((data[i+1]&63)<<12)+((data[i+2]&63)<<6)+(data[i+3]&63); i+=3;\n if(w < 65536) out[j++] = EE[w];\n else { w -= 65536; out[j++] = EE[0xD800 + ((w>>10)&1023)]; out[j++] = EE[0xDC00 + (w&1023)]; }\n }\n }\n out = out.slice(0,j);\n } else {\n out = Buffer.allocUnsafe(len);\n for(i = 0; i < len; ++i) out[i] = EE[data[i].charCodeAt(0)];\n }\n if(!ofmt || ofmt === 'buf') return out;\n if(ofmt !== 'arr') return out.toString('binary');\n return [].slice.call(out);\n };\n };\n var sbcs_decode = function make_sbcs_decode(cp) {\n var D = cpt[cp].dec;\n var DD = Buffer.allocUnsafe(131072), d=0, c=\"\";\n for(d=0;d>8;\n }\n return function sbcs_d(data) {\n var len = data.length, i=0, j=0;\n if(2 * len > mdl) { mdl = 2 * len; mdb = Buffer.allocUnsafe(mdl); }\n if(Buffer.isBuffer(data)) {\n for(i = 0; i < len; i++) {\n j = 2*data[i];\n mdb[2*i] = DD[j]; mdb[2*i+1] = DD[j+1];\n }\n } else if(typeof data === \"string\") {\n for(i = 0; i < len; i++) {\n j = 2*data.charCodeAt(i);\n mdb[2*i] = DD[j]; mdb[2*i+1] = DD[j+1];\n }\n } else {\n for(i = 0; i < len; i++) {\n j = 2*data[i];\n mdb[2*i] = DD[j]; mdb[2*i+1] = DD[j+1];\n }\n }\n return mdb.slice(0, 2 * len).toString('ucs2');\n };\n };\n var dbcs_encode = function make_dbcs_encode(cp) {\n var E = cpt[cp].enc;\n var EE = Buffer.allocUnsafe(131072);\n for(var i = 0; i < 131072; ++i) EE[i] = 0;\n var keys = Object.keys(E);\n for(var ee = 0, e = keys[ee]; ee < keys.length; ++ee) {\n if(!(e = keys[ee])) continue;\n var f = e.charCodeAt(0);\n EE[2*f] = E[e] & 255; EE[2*f+1] = E[e]>>8;\n }\n return function dbcs_e(data, ofmt) {\n var len = data.length, out = Buffer.allocUnsafe(2*len), i=0, j=0, jj=0, k=0, D=0;\n if(typeof data === 'string') {\n for(i = k = 0; i < len; ++i) {\n j = data.charCodeAt(i)*2;\n out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];\n }\n out = out.slice(0,k);\n } else if(Buffer.isBuffer(data)) {\n for(i = k = 0; i < len; ++i) {\n D = data[i];\n if(D < 128) j = D;\n else if(D < 224) { j = ((D&31)<<6)+(data[i+1]&63); ++i; }\n else if(D < 240) { j = ((D&15)<<12)+((data[i+1]&63)<<6)+(data[i+2]&63); i+=2; }\n else { j = ((D&7)<<18)+((data[i+1]&63)<<12)+((data[i+2]&63)<<6)+(data[i+3]&63); i+=3; }\n if(j<65536) { j*=2; out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j]; }\n else { jj = j-65536;\n j=2*(0xD800 + ((jj>>10)&1023)); out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];\n j=2*(0xDC00 + (jj&1023)); out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];\n }\n }\n out = out.slice(0,k);\n } else {\n for(i = k = 0; i < len; i++) {\n j = data[i].charCodeAt(0)*2;\n out[k++] = EE[j+1] || EE[j]; if(EE[j+1] > 0) out[k++] = EE[j];\n }\n }\n if(!ofmt || ofmt === 'buf') return out;\n if(ofmt !== 'arr') return out.toString('binary');\n return [].slice.call(out);\n };\n };\n var dbcs_decode = function make_dbcs_decode(cp) {\n var D = cpt[cp].dec;\n var DD = Buffer.allocUnsafe(131072), d=0, c, w=0, j=0, i=0;\n for(i = 0; i < 65536; ++i) { DD[2*i] = 0xFF; DD[2*i+1] = 0xFD;}\n for(d = 0; d < D.length; ++d) {\n if(!(c=D[d])) continue;\n w = c.charCodeAt(0);\n j = 2*d;\n DD[j] = w&255; DD[j+1] = w>>8;\n }\n return function dbcs_d(data) {\n var len = data.length, out = Buffer.allocUnsafe(2*len), i=0, j=0, k=0;\n if(Buffer.isBuffer(data)) {\n for(i = 0; i < len; i++) {\n j = 2*data[i];\n if(DD[j]===0xFF && DD[j+1]===0xFD) { j=2*((data[i]<<8)+data[i+1]); ++i; }\n out[k++] = DD[j]; out[k++] = DD[j+1];\n }\n } else if(typeof data === \"string\") {\n for(i = 0; i < len; i++) {\n j = 2*data.charCodeAt(i);\n if(DD[j]===0xFF && DD[j+1]===0xFD) { j=2*((data.charCodeAt(i)<<8)+data.charCodeAt(i+1)); ++i; }\n out[k++] = DD[j]; out[k++] = DD[j+1];\n }\n } else {\n for(i = 0; i < len; i++) {\n j = 2*data[i];\n if(DD[j]===0xFF && DD[j+1]===0xFD) { j=2*((data[i]<<8)+data[i+1]); ++i; }\n out[k++] = DD[j]; out[k++] = DD[j+1];\n }\n }\n return out.slice(0,k).toString('ucs2');\n };\n };\n magic_decode[65001] = function utf8_d(data) {\n if(typeof data === \"string\") return utf8_d(data.split(\"\").map(cca));\n var len = data.length, w = 0, ww = 0;\n if(4 * len > mdl) { mdl = 4 * len; mdb = Buffer.allocUnsafe(mdl); }\n var i = 0;\n if(len >= 3 && data[0] == 0xEF) if(data[1] == 0xBB && data[2] == 0xBF) i = 3;\n for(var j = 1, k = 0, D = 0; i < len; i+=j) {\n j = 1; D = data[i];\n if(D < 128) w = D;\n else if(D < 224) { w=(D&31)*64+(data[i+1]&63); j=2; }\n else if(D < 240) { w=((D&15)<<12)+(data[i+1]&63)*64+(data[i+2]&63); j=3; }\n else { w=(D&7)*262144+((data[i+1]&63)<<12)+(data[i+2]&63)*64+(data[i+3]&63); j=4; }\n if(w < 65536) { mdb[k++] = w&255; mdb[k++] = w>>8; }\n else {\n w -= 65536; ww = 0xD800 + ((w>>10)&1023); w = 0xDC00 + (w&1023);\n mdb[k++] = ww&255; mdb[k++] = ww>>>8; mdb[k++] = w&255; mdb[k++] = (w>>>8)&255;\n }\n }\n return mdb.slice(0,k).toString('ucs2');\n };\n magic_encode[65001] = function utf8_e(data, ofmt) {\n if(has_buf && Buffer.isBuffer(data)) {\n if(!ofmt || ofmt === 'buf') return data;\n if(ofmt !== 'arr') return data.toString('binary');\n return [].slice.call(data);\n }\n var len = data.length, w = 0, ww = 0, j = 0;\n var direct = typeof data === \"string\";\n if(4 * len > mdl) { mdl = 4 * len; mdb = Buffer.allocUnsafe(mdl); }\n for(var i = 0; i < len; ++i) {\n w = direct ? data.charCodeAt(i) : data[i].charCodeAt(0);\n if(w <= 0x007F) mdb[j++] = w;\n else if(w <= 0x07FF) {\n mdb[j++] = 192 + (w >> 6);\n mdb[j++] = 128 + (w&63);\n } else if(w >= 0xD800 && w <= 0xDFFF) {\n w -= 0xD800; ++i;\n ww = (direct ? data.charCodeAt(i) : data[i].charCodeAt(0)) - 0xDC00 + (w << 10);\n mdb[j++] = 240 + ((ww>>>18) & 0x07);\n mdb[j++] = 144 + ((ww>>>12) & 0x3F);\n mdb[j++] = 128 + ((ww>>>6) & 0x3F);\n mdb[j++] = 128 + (ww & 0x3F);\n } else {\n mdb[j++] = 224 + (w >> 12);\n mdb[j++] = 128 + ((w >> 6)&63);\n mdb[j++] = 128 + (w&63);\n }\n }\n if(!ofmt || ofmt === 'buf') return mdb.slice(0,j);\n if(ofmt !== 'arr') return mdb.slice(0,j).toString('binary');\n return [].slice.call(mdb, 0, j);\n };\n }\n\n var encache = function encache() {\n if(has_buf) {\n if(cpdcache[sbcs_cache[0]]) return;\n var i=0, s=0;\n for(i = 0; i < sbcs_cache.length; ++i) {\n s = sbcs_cache[i];\n if(cpt[s]) {\n cpdcache[s] = sbcs_decode(s);\n cpecache[s] = sbcs_encode(s);\n }\n }\n for(i = 0; i < dbcs_cache.length; ++i) {\n s = dbcs_cache[i];\n if(cpt[s]) {\n cpdcache[s] = dbcs_decode(s);\n cpecache[s] = dbcs_encode(s);\n }\n }\n for(i = 0; i < magic_cache.length; ++i) {\n s = magic_cache[i];\n if(magic_decode[s]) cpdcache[s] = magic_decode[s];\n if(magic_encode[s]) cpecache[s] = magic_encode[s];\n }\n }\n };\n var null_enc = function(data, ofmt) { void ofmt; return \"\"; };\n var cp_decache = function cp_decache(cp) { delete cpdcache[cp]; delete cpecache[cp]; };\n var decache = function decache() {\n if(has_buf) {\n if(!cpdcache[sbcs_cache[0]]) return;\n sbcs_cache.forEach(cp_decache);\n dbcs_cache.forEach(cp_decache);\n magic_cache.forEach(cp_decache);\n }\n last_enc = null_enc; last_cp = 0;\n };\n var cache = {\n encache: encache,\n decache: decache,\n sbcs: sbcs_cache,\n dbcs: dbcs_cache\n };\n\n encache();\n\n var BM = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n var SetD = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'(),-./:?\";\n var last_enc = null_enc, last_cp = 0;\n var encode = function encode(cp, data, ofmt) {\n if(cp === last_cp && last_enc) { return last_enc(data, ofmt); }\n if(cpecache[cp]) { last_enc = cpecache[last_cp=cp]; return last_enc(data, ofmt); }\n if(has_buf && Buffer.isBuffer(data)) data = data.toString('utf8');\n var len = data.length;\n var out = has_buf ? Buffer.allocUnsafe(4*len) : [], w=0, i=0, j = 0, ww=0;\n var C = cpt[cp], E, M = \"\";\n var isstr = typeof data === 'string';\n if(C && (E=C.enc)) for(i = 0; i < len; ++i, ++j) {\n w = E[isstr? data.charAt(i) : data[i]];\n if(w > 255) {\n out[j] = w>>8;\n out[++j] = w&255;\n } else out[j] = w&255;\n }\n else if((M=magic[cp])) switch(M) {\n case \"utf8\":\n if(has_buf && isstr) { out = Buffer_from(data, M); j = out.length; break; }\n for(i = 0; i < len; ++i, ++j) {\n w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);\n if(w <= 0x007F) out[j] = w;\n else if(w <= 0x07FF) {\n out[j] = 192 + (w >> 6);\n out[++j] = 128 + (w&63);\n } else if(w >= 0xD800 && w <= 0xDFFF) {\n w -= 0xD800;\n ww = (isstr ? data.charCodeAt(++i) : data[++i].charCodeAt(0)) - 0xDC00 + (w << 10);\n out[j] = 240 + ((ww>>>18) & 0x07);\n out[++j] = 144 + ((ww>>>12) & 0x3F);\n out[++j] = 128 + ((ww>>>6) & 0x3F);\n out[++j] = 128 + (ww & 0x3F);\n } else {\n out[j] = 224 + (w >> 12);\n out[++j] = 128 + ((w >> 6)&63);\n out[++j] = 128 + (w&63);\n }\n }\n break;\n case \"ascii\":\n if(has_buf && typeof data === \"string\") { out = Buffer_from(data, M); j = out.length; break; }\n for(i = 0; i < len; ++i, ++j) {\n w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);\n if(w <= 0x007F) out[j] = w;\n else throw new Error(\"bad ascii \" + w);\n }\n break;\n case \"utf16le\":\n if(has_buf && typeof data === \"string\") { out = Buffer_from(data, M); j = out.length; break; }\n for(i = 0; i < len; ++i) {\n w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);\n out[j++] = w&255;\n out[j++] = w>>8;\n }\n break;\n case \"utf16be\":\n for(i = 0; i < len; ++i) {\n w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);\n out[j++] = w>>8;\n out[j++] = w&255;\n }\n break;\n case \"utf32le\":\n for(i = 0; i < len; ++i) {\n w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);\n if(w >= 0xD800 && w <= 0xDFFF) w = 0x10000 + ((w - 0xD800) << 10) + (data[++i].charCodeAt(0) - 0xDC00);\n out[j++] = w&255; w >>= 8;\n out[j++] = w&255; w >>= 8;\n out[j++] = w&255; w >>= 8;\n out[j++] = w&255;\n }\n break;\n case \"utf32be\":\n for(i = 0; i < len; ++i) {\n w = isstr ? data.charCodeAt(i) : data[i].charCodeAt(0);\n if(w >= 0xD800 && w <= 0xDFFF) w = 0x10000 + ((w - 0xD800) << 10) + (data[++i].charCodeAt(0) - 0xDC00);\n out[j+3] = w&255; w >>= 8;\n out[j+2] = w&255; w >>= 8;\n out[j+1] = w&255; w >>= 8;\n out[j] = w&255;\n j+=4;\n }\n break;\n case \"utf7\":\n for(i = 0; i < len; i++) {\n var c = isstr ? data.charAt(i) : data[i].charAt(0);\n if(c === \"+\") { out[j++] = 0x2b; out[j++] = 0x2d; continue; }\n if(SetD.indexOf(c) > -1) { out[j++] = c.charCodeAt(0); continue; }\n var tt = encode(1201, c);\n out[j++] = 0x2b;\n out[j++] = BM.charCodeAt(tt[0]>>2);\n out[j++] = BM.charCodeAt(((tt[0]&0x03)<<4) + ((tt[1]||0)>>4));\n out[j++] = BM.charCodeAt(((tt[1]&0x0F)<<2) + ((tt[2]||0)>>6));\n out[j++] = 0x2d;\n }\n break;\n default: throw new Error(\"Unsupported magic: \" + cp + \" \" + magic[cp]);\n }\n else throw new Error(\"Unrecognized CP: \" + cp);\n out = out.slice(0,j);\n if(!has_buf) return (ofmt == 'str') ? (out).map(sfcc).join(\"\") : out;\n if(!ofmt || ofmt === 'buf') return out;\n if(ofmt !== 'arr') return out.toString('binary');\n return [].slice.call(out);\n };\n var decode = function decode(cp, data) {\n var F; if((F=cpdcache[cp])) return F(data);\n if(typeof data === \"string\") return decode(cp, data.split(\"\").map(cca));\n var len = data.length, out = new Array(len), s=\"\", w=0, i=0, j=1, k=0, ww=0;\n var C = cpt[cp], D, M=\"\";\n if(C && (D=C.dec)) {\n for(i = 0; i < len; i+=j) {\n j = 2;\n s = D[(data[i]<<8)+ data[i+1]];\n if(!s) {\n j = 1;\n s = D[data[i]];\n }\n if(!s) throw new Error('Unrecognized code: ' + data[i] + ' ' + data[i+j-1] + ' ' + i + ' ' + j + ' ' + D[data[i]]);\n out[k++] = s;\n }\n }\n else if((M=magic[cp])) switch(M) {\n case \"utf8\":\n if(len >= 3 && data[0] == 0xEF) if(data[1] == 0xBB && data[2] == 0xBF) i = 3;\n for(; i < len; i+=j) {\n j = 1;\n if(data[i] < 128) w = data[i];\n else if(data[i] < 224) { w=(data[i]&31)*64+(data[i+1]&63); j=2; }\n else if(data[i] < 240) { w=((data[i]&15)<<12)+(data[i+1]&63)*64+(data[i+2]&63); j=3; }\n else { w=(data[i]&7)*262144+((data[i+1]&63)<<12)+(data[i+2]&63)*64+(data[i+3]&63); j=4; }\n if(w < 65536) { out[k++] = String.fromCharCode(w); }\n else {\n w -= 65536; ww = 0xD800 + ((w>>10)&1023); w = 0xDC00 + (w&1023);\n out[k++] = String.fromCharCode(ww); out[k++] = String.fromCharCode(w);\n }\n }\n break;\n case \"ascii\":\n if(has_buf && Buffer.isBuffer(data)) return data.toString(M);\n for(i = 0; i < len; i++) out[i] = String.fromCharCode(data[i]);\n k = len; break;\n case \"utf16le\":\n if(len >= 2 && data[0] == 0xFF) if(data[1] == 0xFE) i = 2;\n if(has_buf && Buffer.isBuffer(data)) return data.toString(M);\n j = 2;\n for(; i+1 < len; i+=j) {\n out[k++] = String.fromCharCode((data[i+1]<<8) + data[i]);\n }\n break;\n case \"utf16be\":\n if(len >= 2 && data[0] == 0xFE) if(data[1] == 0xFF) i = 2;\n j = 2;\n for(; i+1 < len; i+=j) {\n out[k++] = String.fromCharCode((data[i]<<8) + data[i+1]);\n }\n break;\n case \"utf32le\":\n if(len >= 4 && data[0] == 0xFF) if(data[1] == 0xFE && data[2] === 0 && data[3] === 0) i = 4;\n j = 4;\n for(; i < len; i+=j) {\n w = (data[i+3]<<24) + (data[i+2]<<16) + (data[i+1]<<8) + (data[i]);\n if(w > 0xFFFF) {\n w -= 0x10000;\n out[k++] = String.fromCharCode(0xD800 + ((w >> 10) & 0x3FF));\n out[k++] = String.fromCharCode(0xDC00 + (w & 0x3FF));\n }\n else out[k++] = String.fromCharCode(w);\n }\n break;\n case \"utf32be\":\n if(len >= 4 && data[3] == 0xFF) if(data[2] == 0xFE && data[1] === 0 && data[0] === 0) i = 4;\n j = 4;\n for(; i < len; i+=j) {\n w = (data[i]<<24) + (data[i+1]<<16) + (data[i+2]<<8) + (data[i+3]);\n if(w > 0xFFFF) {\n w -= 0x10000;\n out[k++] = String.fromCharCode(0xD800 + ((w >> 10) & 0x3FF));\n out[k++] = String.fromCharCode(0xDC00 + (w & 0x3FF));\n }\n else out[k++] = String.fromCharCode(w);\n }\n break;\n case \"utf7\":\n if(len >= 4 && data[0] == 0x2B && data[1] == 0x2F && data[2] == 0x76) {\n if(len >= 5 && data[3] == 0x38 && data[4] == 0x2D) i = 5;\n else if(data[3] == 0x38 || data[3] == 0x39 || data[3] == 0x2B || data[3] == 0x2F) i = 4;\n }\n for(; i < len; i+=j) {\n if(data[i] !== 0x2b) { j=1; out[k++] = String.fromCharCode(data[i]); continue; }\n j=1;\n if(data[i+1] === 0x2d) { j = 2; out[k++] = \"+\"; continue; }\n // eslint-disable-next-line no-useless-escape\n while(String.fromCharCode(data[i+j]).match(/[A-Za-z0-9+\\/]/)) j++;\n var dash = 0;\n if(data[i+j] === 0x2d) { ++j; dash=1; }\n var tt = [];\n var o64 = \"\";\n var c1=0, c2=0, c3=0;\n var e1=0, e2=0, e3=0, e4=0;\n for(var l = 1; l < j - dash;) {\n e1 = BM.indexOf(String.fromCharCode(data[i+l++]));\n e2 = BM.indexOf(String.fromCharCode(data[i+l++]));\n c1 = e1 << 2 | e2 >> 4;\n tt.push(c1);\n e3 = BM.indexOf(String.fromCharCode(data[i+l++]));\n if(e3 === -1) break;\n c2 = (e2 & 15) << 4 | e3 >> 2;\n tt.push(c2);\n e4 = BM.indexOf(String.fromCharCode(data[i+l++]));\n if(e4 === -1) break;\n c3 = (e3 & 3) << 6 | e4;\n if(e4 < 64) tt.push(c3);\n }\n o64 = decode(1201, tt);\n for(l = 0; l < o64.length; ++l) out[k++] = o64.charAt(l);\n }\n break;\n default: throw new Error(\"Unsupported magic: \" + cp + \" \" + magic[cp]);\n }\n else throw new Error(\"Unrecognized CP: \" + cp);\n return out.slice(0,k).join(\"\");\n };\n var hascp = function hascp(cp) { return !!(cpt[cp] || magic[cp]); };\n cpt.utils = { decode: decode, encode: encode, hascp: hascp, magic: magic, cache:cache };\n return cpt;\n}));\n","/*\n\nJSZip - A Javascript class for generating and reading zip files\n\n\n(c) 2009-2014 Stuart Knightley \nDual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.\n\nJSZip uses the library pako released under the MIT license :\nhttps://github.com/nodeca/pako/blob/master/LICENSE\n\nNote: since JSZip 3 removed critical functionality, this version assigns to the\n`JSZipSync` variable. Another JSZip version can be loaded in parallel.\n*/\n(function(e){\n\tif(\"object\"==typeof exports&&\"undefined\"!=typeof module&&\"undefined\"==typeof DO_NOT_EXPORT_JSZIP)module.exports=e();\n\telse if(\"function\"==typeof define&&define.amd&&\"undefined\"==typeof DO_NOT_EXPORT_JSZIP){JSZipSync=e();define('j',[],e);}\n\telse{\n\t\tvar f;\n\t\t\"undefined\"!=typeof globalThis?f=globalThis:\n\t\t\"undefined\"!=typeof window?f=window:\n\t\t\"undefined\"!=typeof global?f=global:\n\t\t\"undefined\"!=typeof $ && $.global?f=$.global:\n\t\t\"undefined\"!=typeof self&&(f=self),f.JSZipSync=e()\n\t}\n}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error(\"Cannot find module '\"+o+\"'\")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o> 2;\n enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n enc4 = chr3 & 63;\n\n if (isNaN(chr2)) {\n enc3 = enc4 = 64;\n }\n else if (isNaN(chr3)) {\n enc4 = 64;\n }\n\n output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4);\n\n }\n\n return output;\n};\n\n// public method for decoding\nexports.decode = function(input, utf8) {\n var output = \"\";\n var chr1, chr2, chr3;\n var enc1, enc2, enc3, enc4;\n var i = 0;\n\n input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\n while (i < input.length) {\n\n enc1 = _keyStr.indexOf(input.charAt(i++));\n enc2 = _keyStr.indexOf(input.charAt(i++));\n enc3 = _keyStr.indexOf(input.charAt(i++));\n enc4 = _keyStr.indexOf(input.charAt(i++));\n\n chr1 = (enc1 << 2) | (enc2 >> 4);\n chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\n chr3 = ((enc3 & 3) << 6) | enc4;\n\n output = output + String.fromCharCode(chr1);\n\n if (enc3 != 64) {\n output = output + String.fromCharCode(chr2);\n }\n if (enc4 != 64) {\n output = output + String.fromCharCode(chr3);\n }\n\n }\n\n return output;\n\n};\n\n},{}],2:[function(_dereq_,module,exports){\n'use strict';\nfunction CompressedObject() {\n this.compressedSize = 0;\n this.uncompressedSize = 0;\n this.crc32 = 0;\n this.compressionMethod = null;\n this.compressedContent = null;\n}\n\nCompressedObject.prototype = {\n /**\n * Return the decompressed content in an unspecified format.\n * The format will depend on the decompressor.\n * @return {Object} the decompressed content.\n */\n getContent: function() {\n return null; // see implementation\n },\n /**\n * Return the compressed content in an unspecified format.\n * The format will depend on the compressed conten source.\n * @return {Object} the compressed content.\n */\n getCompressedContent: function() {\n return null; // see implementation\n }\n};\nmodule.exports = CompressedObject;\n\n},{}],3:[function(_dereq_,module,exports){\n'use strict';\nexports.STORE = {\n magic: \"\\x00\\x00\",\n compress: function(content) {\n return content; // no compression\n },\n uncompress: function(content) {\n return content; // no compression\n },\n compressInputType: null,\n uncompressInputType: null\n};\nexports.DEFLATE = _dereq_('./flate');\n\n},{\"./flate\":8}],4:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('./utils');\n\nvar table = [\n 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,\n 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,\n 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,\n 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,\n 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,\n 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,\n 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,\n 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,\n 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,\n 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,\n 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,\n 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,\n 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,\n 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,\n 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,\n 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,\n 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,\n 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,\n 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,\n 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,\n 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,\n 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,\n 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,\n 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,\n 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,\n 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,\n 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,\n 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,\n 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,\n 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,\n 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,\n 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,\n 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,\n 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,\n 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,\n 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,\n 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,\n 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,\n 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,\n 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,\n 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,\n 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,\n 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,\n 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,\n 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,\n 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,\n 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,\n 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,\n 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,\n 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,\n 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,\n 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,\n 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,\n 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,\n 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,\n 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,\n 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,\n 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,\n 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,\n 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,\n 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,\n 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,\n 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,\n 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D\n];\n\n/**\n *\n * Javascript crc32\n * http://www.webtoolkit.info/\n *\n */\nmodule.exports = function crc32(input, crc) {\n if (typeof input === \"undefined\" || !input.length) {\n return 0;\n }\n\n var isArray = utils.getTypeOf(input) !== \"string\";\n\n if (typeof(crc) == \"undefined\") {\n crc = 0;\n }\n var x = 0;\n var y = 0;\n var b = 0;\n\n crc = crc ^ (-1);\n for (var i = 0, iTop = input.length; i < iTop; i++) {\n b = isArray ? input[i] : input.charCodeAt(i);\n y = (crc ^ b) & 0xFF;\n x = table[y];\n crc = (crc >>> 8) ^ x;\n }\n\n return crc ^ (-1);\n};\n// vim: set shiftwidth=4 softtabstop=4:\n\n},{\"./utils\":21}],5:[function(_dereq_,module,exports){\n'use strict';\nvar utils = _dereq_('./utils');\n\nfunction DataReader(data) {\n this.data = null; // type : see implementation\n this.length = 0;\n this.index = 0;\n}\nDataReader.prototype = {\n /**\n * Check that the offset will not go too far.\n * @param {string} offset the additional offset to check.\n * @throws {Error} an Error if the offset is out of bounds.\n */\n checkOffset: function(offset) {\n this.checkIndex(this.index + offset);\n },\n /**\n * Check that the specifed index will not be too far.\n * @param {string} newIndex the index to check.\n * @throws {Error} an Error if the index is out of bounds.\n */\n checkIndex: function(newIndex) {\n if (this.length < newIndex || newIndex < 0) {\n throw new Error(\"End of data reached (data length = \" + this.length + \", asked index = \" + (newIndex) + \"). Corrupted zip ?\");\n }\n },\n /**\n * Change the index.\n * @param {number} newIndex The new index.\n * @throws {Error} if the new index is out of the data.\n */\n setIndex: function(newIndex) {\n this.checkIndex(newIndex);\n this.index = newIndex;\n },\n /**\n * Skip the next n bytes.\n * @param {number} n the number of bytes to skip.\n * @throws {Error} if the new index is out of the data.\n */\n skip: function(n) {\n this.setIndex(this.index + n);\n },\n /**\n * Get the byte at the specified index.\n * @param {number} i the index to use.\n * @return {number} a byte.\n */\n byteAt: function(i) {\n // see implementations\n },\n /**\n * Get the next number with a given byte size.\n * @param {number} size the number of bytes to read.\n * @return {number} the corresponding number.\n */\n readInt: function(size) {\n var result = 0,\n i;\n this.checkOffset(size);\n for (i = this.index + size - 1; i >= this.index; i--) {\n result = (result << 8) + this.byteAt(i);\n }\n this.index += size;\n return result;\n },\n /**\n * Get the next string with a given byte size.\n * @param {number} size the number of bytes to read.\n * @return {string} the corresponding string.\n */\n readString: function(size) {\n return utils.transformTo(\"string\", this.readData(size));\n },\n /**\n * Get raw data without conversion, bytes.\n * @param {number} size the number of bytes to read.\n * @return {Object} the raw data, implementation specific.\n */\n readData: function(size) {\n // see implementations\n },\n /**\n * Find the last occurrence of a zip signature (4 bytes).\n * @param {string} sig the signature to find.\n * @return {number} the index of the last occurrence, -1 if not found.\n */\n lastIndexOfSignature: function(sig) {\n // see implementations\n },\n /**\n * Get the next date.\n * @return {Date} the date.\n */\n readDate: function() {\n var dostime = this.readInt(4);\n return new Date(\n ((dostime >> 25) & 0x7f) + 1980, // year\n ((dostime >> 21) & 0x0f) - 1, // month\n (dostime >> 16) & 0x1f, // day\n (dostime >> 11) & 0x1f, // hour\n (dostime >> 5) & 0x3f, // minute\n (dostime & 0x1f) << 1); // second\n }\n};\nmodule.exports = DataReader;\n\n},{\"./utils\":21}],6:[function(_dereq_,module,exports){\n'use strict';\nexports.base64 = false;\nexports.binary = false;\nexports.dir = false;\nexports.createFolders = false;\nexports.date = null;\nexports.compression = null;\nexports.comment = null;\n\n},{}],7:[function(_dereq_,module,exports){\n'use strict';\nvar utils = _dereq_('./utils');\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.string2binary = function(str) {\n return utils.string2binary(str);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.string2Uint8Array = function(str) {\n return utils.transformTo(\"uint8array\", str);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.uint8Array2String = function(array) {\n return utils.transformTo(\"string\", array);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.string2Blob = function(str) {\n var buffer = utils.transformTo(\"arraybuffer\", str);\n return utils.arrayBuffer2Blob(buffer);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.arrayBuffer2Blob = function(buffer) {\n return utils.arrayBuffer2Blob(buffer);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.transformTo = function(outputType, input) {\n return utils.transformTo(outputType, input);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.getTypeOf = function(input) {\n return utils.getTypeOf(input);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.checkSupport = function(type) {\n return utils.checkSupport(type);\n};\n\n/**\n * @deprecated\n * This value will be removed in a future version without replacement.\n */\nexports.MAX_VALUE_16BITS = utils.MAX_VALUE_16BITS;\n\n/**\n * @deprecated\n * This value will be removed in a future version without replacement.\n */\nexports.MAX_VALUE_32BITS = utils.MAX_VALUE_32BITS;\n\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.pretty = function(str) {\n return utils.pretty(str);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.findCompression = function(compressionMethod) {\n return utils.findCompression(compressionMethod);\n};\n\n/**\n * @deprecated\n * This function will be removed in a future version without replacement.\n */\nexports.isRegExp = function (object) {\n return utils.isRegExp(object);\n};\n\n\n},{\"./utils\":21}],8:[function(_dereq_,module,exports){\n'use strict';\nvar USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined');\n\nvar pako = _dereq_(\"pako\");\nexports.uncompressInputType = USE_TYPEDARRAY ? \"uint8array\" : \"array\";\nexports.compressInputType = USE_TYPEDARRAY ? \"uint8array\" : \"array\";\n\nexports.magic = \"\\x08\\x00\";\nexports.compress = function(input) {\n return pako.deflateRaw(input);\n};\nexports.uncompress = function(input) {\n return pako.inflateRaw(input);\n};\n\n},{\"pako\":24}],9:[function(_dereq_,module,exports){\n'use strict';\n\nvar base64 = _dereq_('./base64');\n\n/**\nUsage:\n zip = new JSZip();\n zip.file(\"hello.txt\", \"Hello, World!\").file(\"tempfile\", \"nothing\");\n zip.folder(\"images\").file(\"smile.gif\", base64Data, {base64: true});\n zip.file(\"Xmas.txt\", \"Ho ho ho !\", {date : new Date(\"December 25, 2007 00:00:01\")});\n zip.remove(\"tempfile\");\n\n base64zip = zip.generate();\n\n**/\n\n/**\n * Representation a of zip file in js\n * @constructor\n * @param {String=|ArrayBuffer=|Uint8Array=} data the data to load, if any (optional).\n * @param {Object=} options the options for creating this objects (optional).\n */\nfunction JSZipSync(data, options) {\n // if this constructor is used without `new`, it adds `new` before itself:\n if(!(this instanceof JSZipSync)) return new JSZipSync(data, options);\n\n // object containing the files :\n // {\n // \"folder/\" : {...},\n // \"folder/data.txt\" : {...}\n // }\n this.files = {};\n\n this.comment = null;\n\n // Where we are in the hierarchy\n this.root = \"\";\n if (data) {\n this.load(data, options);\n }\n this.clone = function() {\n var newObj = new JSZipSync();\n for (var i in this) {\n if (typeof this[i] !== \"function\") {\n newObj[i] = this[i];\n }\n }\n return newObj;\n };\n}\nJSZipSync.prototype = _dereq_('./object');\nJSZipSync.prototype.load = _dereq_('./load');\nJSZipSync.support = _dereq_('./support');\nJSZipSync.defaults = _dereq_('./defaults');\n\n/**\n * @deprecated\n * This namespace will be removed in a future version without replacement.\n */\nJSZipSync.utils = _dereq_('./deprecatedPublicUtils');\n\nJSZipSync.base64 = {\n /**\n * @deprecated\n * This method will be removed in a future version without replacement.\n */\n encode : function(input) {\n return base64.encode(input);\n },\n /**\n * @deprecated\n * This method will be removed in a future version without replacement.\n */\n decode : function(input) {\n return base64.decode(input);\n }\n};\nJSZipSync.compressions = _dereq_('./compressions');\nmodule.exports = JSZipSync;\n\n},{\"./base64\":1,\"./compressions\":3,\"./defaults\":6,\"./deprecatedPublicUtils\":7,\"./load\":10,\"./object\":13,\"./support\":17}],10:[function(_dereq_,module,exports){\n'use strict';\nvar base64 = _dereq_('./base64');\nvar ZipEntries = _dereq_('./zipEntries');\nmodule.exports = function(data, options) {\n var files, zipEntries, i, input;\n options = options || {};\n if (options.base64) {\n data = base64.decode(data);\n }\n\n zipEntries = new ZipEntries(data, options);\n files = zipEntries.files;\n for (i = 0; i < files.length; i++) {\n input = files[i];\n this.file(input.fileName, input.decompressed, {\n binary: true,\n optimizedBinaryString: true,\n date: input.date,\n dir: input.dir,\n comment : input.fileComment.length ? input.fileComment : null,\n createFolders: options.createFolders\n });\n }\n if (zipEntries.zipComment.length) {\n this.comment = zipEntries.zipComment;\n }\n\n return this;\n};\n\n},{\"./base64\":1,\"./zipEntries\":22}],11:[function(_dereq_,module,exports){\n(function (Buffer){\n'use strict';\nvar Buffer_from = /*::(*/function(){}/*:: :any)*/;\nif(typeof Buffer !== 'undefined') {\n\tvar nbfs = !Buffer.from;\n\tif(!nbfs) try { Buffer.from(\"foo\", \"utf8\"); } catch(e) { nbfs = true; }\n\tBuffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);\n\t// $FlowIgnore\n\tif(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };\n}\nmodule.exports = function(data, encoding){\n return typeof data == 'number' ? Buffer.alloc(data) : Buffer_from(data, encoding);\n};\nmodule.exports.test = function(b){\n return Buffer.isBuffer(b);\n};\n}).call(this,(typeof Buffer !== \"undefined\" ? Buffer : undefined))\n},{}],12:[function(_dereq_,module,exports){\n'use strict';\nvar Uint8ArrayReader = _dereq_('./uint8ArrayReader');\n\nfunction NodeBufferReader(data) {\n this.data = data;\n this.length = this.data.length;\n this.index = 0;\n}\nNodeBufferReader.prototype = new Uint8ArrayReader();\n\n/**\n * @see DataReader.readData\n */\nNodeBufferReader.prototype.readData = function(size) {\n this.checkOffset(size);\n var result = this.data.slice(this.index, this.index + size);\n this.index += size;\n return result;\n};\nmodule.exports = NodeBufferReader;\n\n},{\"./uint8ArrayReader\":18}],13:[function(_dereq_,module,exports){\n'use strict';\nvar support = _dereq_('./support');\nvar utils = _dereq_('./utils');\nvar crc32 = _dereq_('./crc32');\nvar signature = _dereq_('./signature');\nvar defaults = _dereq_('./defaults');\nvar base64 = _dereq_('./base64');\nvar compressions = _dereq_('./compressions');\nvar CompressedObject = _dereq_('./compressedObject');\nvar nodeBuffer = _dereq_('./nodeBuffer');\nvar utf8 = _dereq_('./utf8');\nvar StringWriter = _dereq_('./stringWriter');\nvar Uint8ArrayWriter = _dereq_('./uint8ArrayWriter');\n\n/**\n * Returns the raw data of a ZipObject, decompress the content if necessary.\n * @param {ZipObject} file the file to use.\n * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.\n */\nvar getRawData = function(file) {\n if (file._data instanceof CompressedObject) {\n file._data = file._data.getContent();\n file.options.binary = true;\n file.options.base64 = false;\n\n if (utils.getTypeOf(file._data) === \"uint8array\") {\n var copy = file._data;\n // when reading an arraybuffer, the CompressedObject mechanism will keep it and subarray() a Uint8Array.\n // if we request a file in the same format, we might get the same Uint8Array or its ArrayBuffer (the original zip file).\n file._data = new Uint8Array(copy.length);\n // with an empty Uint8Array, Opera fails with a \"Offset larger than array size\"\n if (copy.length !== 0) {\n file._data.set(copy, 0);\n }\n }\n }\n return file._data;\n};\n\n/**\n * Returns the data of a ZipObject in a binary form. If the content is an unicode string, encode it.\n * @param {ZipObject} file the file to use.\n * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.\n */\nvar getBinaryData = function(file) {\n var result = getRawData(file),\n type = utils.getTypeOf(result);\n if (type === \"string\") {\n if (!file.options.binary) {\n // unicode text !\n // unicode string => binary string is a painful process, check if we can avoid it.\n if (support.nodebuffer) {\n return nodeBuffer(result, \"utf-8\");\n }\n }\n return file.asBinary();\n }\n return result;\n};\n\n/**\n * Transform this._data into a string.\n * @param {function} filter a function String -> String, applied if not null on the result.\n * @return {String} the string representing this._data.\n */\nvar dataToString = function(asUTF8) {\n var result = getRawData(this);\n if (result === null || typeof result === \"undefined\") {\n return \"\";\n }\n // if the data is a base64 string, we decode it before checking the encoding !\n if (this.options.base64) {\n result = base64.decode(result);\n }\n if (asUTF8 && this.options.binary) {\n // JSZip.prototype.utf8decode supports arrays as input\n // skip to array => string step, utf8decode will do it.\n result = out.utf8decode(result);\n }\n else {\n // no utf8 transformation, do the array => string step.\n result = utils.transformTo(\"string\", result);\n }\n\n if (!asUTF8 && !this.options.binary) {\n result = utils.transformTo(\"string\", out.utf8encode(result));\n }\n return result;\n};\n/**\n * A simple object representing a file in the zip file.\n * @constructor\n * @param {string} name the name of the file\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data\n * @param {Object} options the options of the file\n */\nvar ZipObject = function(name, data, options) {\n this.name = name;\n this.dir = options.dir;\n this.date = options.date;\n this.comment = options.comment;\n\n this._data = data;\n this.options = options;\n\n /*\n * This object contains initial values for dir and date.\n * With them, we can check if the user changed the deprecated metadata in\n * `ZipObject#options` or not.\n */\n this._initialMetadata = {\n dir : options.dir,\n date : options.date\n };\n};\n\nZipObject.prototype = {\n /**\n * Return the content as UTF8 string.\n * @return {string} the UTF8 string.\n */\n asText: function() {\n return dataToString.call(this, true);\n },\n /**\n * Returns the binary content.\n * @return {string} the content as binary.\n */\n asBinary: function() {\n return dataToString.call(this, false);\n },\n /**\n * Returns the content as a nodejs Buffer.\n * @return {Buffer} the content as a Buffer.\n */\n asNodeBuffer: function() {\n var result = getBinaryData(this);\n return utils.transformTo(\"nodebuffer\", result);\n },\n /**\n * Returns the content as an Uint8Array.\n * @return {Uint8Array} the content as an Uint8Array.\n */\n asUint8Array: function() {\n var result = getBinaryData(this);\n return utils.transformTo(\"uint8array\", result);\n },\n /**\n * Returns the content as an ArrayBuffer.\n * @return {ArrayBuffer} the content as an ArrayBufer.\n */\n asArrayBuffer: function() {\n return this.asUint8Array().buffer;\n }\n};\n\n/**\n * Transform an integer into a string in hexadecimal.\n * @private\n * @param {number} dec the number to convert.\n * @param {number} bytes the number of bytes to generate.\n * @returns {string} the result.\n */\nvar decToHex = function(dec, bytes) {\n var hex = \"\",\n i;\n for (i = 0; i < bytes; i++) {\n hex += String.fromCharCode(dec & 0xff);\n dec = dec >>> 8;\n }\n return hex;\n};\n\n/**\n * Merge the objects passed as parameters into a new one.\n * @private\n * @param {...Object} var_args All objects to merge.\n * @return {Object} a new object with the data of the others.\n */\nvar extend = function() {\n var result = {}, i, attr;\n for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers\n for (attr in arguments[i]) {\n if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === \"undefined\") {\n result[attr] = arguments[i][attr];\n }\n }\n }\n return result;\n};\n\n/**\n * Transforms the (incomplete) options from the user into the complete\n * set of options to create a file.\n * @private\n * @param {Object} o the options from the user.\n * @return {Object} the complete set of options.\n */\nvar prepareFileAttrs = function(o) {\n o = o || {};\n if (o.base64 === true && (o.binary === null || o.binary === undefined)) {\n o.binary = true;\n }\n o = extend(o, defaults);\n o.date = o.date || new Date();\n if (o.compression !== null) o.compression = o.compression.toUpperCase();\n\n return o;\n};\n\n/**\n * Add a file in the current folder.\n * @private\n * @param {string} name the name of the file\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file\n * @param {Object} o the options of the file\n * @return {Object} the new file.\n */\nvar fileAdd = function(name, data, o) {\n // be sure sub folders exist\n var dataType = utils.getTypeOf(data),\n parent;\n\n o = prepareFileAttrs(o);\n\n if (o.createFolders && (parent = parentFolder(name))) {\n folderAdd.call(this, parent, true);\n }\n\n if (o.dir || data === null || typeof data === \"undefined\") {\n o.base64 = false;\n o.binary = false;\n data = null;\n }\n else if (dataType === \"string\") {\n if (o.binary && !o.base64) {\n // optimizedBinaryString == true means that the file has already been filtered with a 0xFF mask\n if (o.optimizedBinaryString !== true) {\n // this is a string, not in a base64 format.\n // Be sure that this is a correct \"binary string\"\n data = utils.string2binary(data);\n }\n }\n }\n else { // arraybuffer, uint8array, ...\n o.base64 = false;\n o.binary = true;\n\n if (!dataType && !(data instanceof CompressedObject)) {\n throw new Error(\"The data of '\" + name + \"' is in an unsupported format !\");\n }\n\n // special case : it's way easier to work with Uint8Array than with ArrayBuffer\n if (dataType === \"arraybuffer\") {\n data = utils.transformTo(\"uint8array\", data);\n }\n }\n\n var object = new ZipObject(name, data, o);\n this.files[name] = object;\n return object;\n};\n\n/**\n * Find the parent folder of the path.\n * @private\n * @param {string} path the path to use\n * @return {string} the parent folder, or \"\"\n */\nvar parentFolder = function (path) {\n if (path.slice(-1) == '/') {\n path = path.substring(0, path.length - 1);\n }\n var lastSlash = path.lastIndexOf('/');\n return (lastSlash > 0) ? path.substring(0, lastSlash) : \"\";\n};\n\n/**\n * Add a (sub) folder in the current folder.\n * @private\n * @param {string} name the folder's name\n * @param {boolean=} [createFolders] If true, automatically create sub\n * folders. Defaults to false.\n * @return {Object} the new folder.\n */\nvar folderAdd = function(name, createFolders) {\n // Check the name ends with a /\n if (name.slice(-1) != \"/\") {\n name += \"/\"; // IE doesn't like substr(-1)\n }\n\n createFolders = (typeof createFolders !== 'undefined') ? createFolders : false;\n\n // Does this folder already exist?\n if (!this.files[name]) {\n fileAdd.call(this, name, null, {\n dir: true,\n createFolders: createFolders\n });\n }\n return this.files[name];\n};\n\n/**\n * Generate a JSZip.CompressedObject for a given zipOject.\n * @param {ZipObject} file the object to read.\n * @param {JSZip.compression} compression the compression to use.\n * @return {JSZip.CompressedObject} the compressed result.\n */\nvar generateCompressedObjectFrom = function(file, compression) {\n var result = new CompressedObject(),\n content;\n\n // the data has not been decompressed, we might reuse things !\n if (file._data instanceof CompressedObject) {\n result.uncompressedSize = file._data.uncompressedSize;\n result.crc32 = file._data.crc32;\n\n if (result.uncompressedSize === 0 || file.dir) {\n compression = compressions['STORE'];\n result.compressedContent = \"\";\n result.crc32 = 0;\n }\n else if (file._data.compressionMethod === compression.magic) {\n result.compressedContent = file._data.getCompressedContent();\n }\n else {\n content = file._data.getContent();\n // need to decompress / recompress\n result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content));\n }\n }\n else {\n // have uncompressed data\n content = getBinaryData(file);\n if (!content || content.length === 0 || file.dir) {\n compression = compressions['STORE'];\n content = \"\";\n }\n result.uncompressedSize = content.length;\n result.crc32 = crc32(content);\n result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content));\n }\n\n result.compressedSize = result.compressedContent.length;\n result.compressionMethod = compression.magic;\n\n return result;\n};\n\n/**\n * Generate the various parts used in the construction of the final zip file.\n * @param {string} name the file name.\n * @param {ZipObject} file the file content.\n * @param {JSZip.CompressedObject} compressedObject the compressed object.\n * @param {number} offset the current offset from the start of the zip file.\n * @return {object} the zip parts.\n */\nvar generateZipParts = function(name, file, compressedObject, offset) {\n var data = compressedObject.compressedContent,\n utfEncodedFileName = utils.transformTo(\"string\", utf8.utf8encode(file.name)),\n comment = file.comment || \"\",\n utfEncodedComment = utils.transformTo(\"string\", utf8.utf8encode(comment)),\n useUTF8ForFileName = utfEncodedFileName.length !== file.name.length,\n useUTF8ForComment = utfEncodedComment.length !== comment.length,\n o = file.options,\n dosTime,\n dosDate,\n extraFields = \"\",\n unicodePathExtraField = \"\",\n unicodeCommentExtraField = \"\",\n dir, date;\n\n\n // handle the deprecated options.dir\n if (file._initialMetadata.dir !== file.dir) {\n dir = file.dir;\n } else {\n dir = o.dir;\n }\n\n // handle the deprecated options.date\n if(file._initialMetadata.date !== file.date) {\n date = file.date;\n } else {\n date = o.date;\n }\n\n\n dosTime = date.getHours();\n dosTime = dosTime << 6;\n dosTime = dosTime | date.getMinutes();\n dosTime = dosTime << 5;\n dosTime = dosTime | date.getSeconds() / 2;\n\n dosDate = date.getFullYear() - 1980;\n dosDate = dosDate << 4;\n dosDate = dosDate | (date.getMonth() + 1);\n dosDate = dosDate << 5;\n dosDate = dosDate | date.getDate();\n\n if (useUTF8ForFileName) {\n // set the unicode path extra field. unzip needs at least one extra\n // field to correctly handle unicode path, so using the path is as good\n // as any other information. This could improve the situation with\n // other archive managers too.\n // This field is usually used without the utf8 flag, with a non\n // unicode path in the header (winrar, winzip). This helps (a bit)\n // with the messy Windows' default compressed folders feature but\n // breaks on p7zip which doesn't seek the unicode path extra field.\n // So for now, UTF-8 everywhere !\n unicodePathExtraField =\n // Version\n decToHex(1, 1) +\n // NameCRC32\n decToHex(crc32(utfEncodedFileName), 4) +\n // UnicodeName\n utfEncodedFileName;\n\n extraFields +=\n // Info-ZIP Unicode Path Extra Field\n \"\\x75\\x70\" +\n // size\n decToHex(unicodePathExtraField.length, 2) +\n // content\n unicodePathExtraField;\n }\n\n if(useUTF8ForComment) {\n\n unicodeCommentExtraField =\n // Version\n decToHex(1, 1) +\n // CommentCRC32\n decToHex(this.crc32(utfEncodedComment), 4) +\n // UnicodeName\n utfEncodedComment;\n\n extraFields +=\n // Info-ZIP Unicode Path Extra Field\n \"\\x75\\x63\" +\n // size\n decToHex(unicodeCommentExtraField.length, 2) +\n // content\n unicodeCommentExtraField;\n }\n\n var header = \"\";\n\n // version needed to extract\n header += \"\\x0A\\x00\";\n // general purpose bit flag\n // set bit 11 if utf8\n header += (useUTF8ForFileName || useUTF8ForComment) ? \"\\x00\\x08\" : \"\\x00\\x00\";\n // compression method\n header += compressedObject.compressionMethod;\n // last mod file time\n header += decToHex(dosTime, 2);\n // last mod file date\n header += decToHex(dosDate, 2);\n // crc-32\n header += decToHex(compressedObject.crc32, 4);\n // compressed size\n header += decToHex(compressedObject.compressedSize, 4);\n // uncompressed size\n header += decToHex(compressedObject.uncompressedSize, 4);\n // file name length\n header += decToHex(utfEncodedFileName.length, 2);\n // extra field length\n header += decToHex(extraFields.length, 2);\n\n\n var fileRecord = signature.LOCAL_FILE_HEADER + header + utfEncodedFileName + extraFields;\n\n var dirRecord = signature.CENTRAL_FILE_HEADER +\n // version made by (00: DOS)\n \"\\x14\\x00\" +\n // file header (common to file and central directory)\n header +\n // file comment length\n decToHex(utfEncodedComment.length, 2) +\n // disk number start\n \"\\x00\\x00\" +\n // internal file attributes TODO\n \"\\x00\\x00\" +\n // external file attributes\n (dir === true ? \"\\x10\\x00\\x00\\x00\" : \"\\x00\\x00\\x00\\x00\") +\n // relative offset of local header\n decToHex(offset, 4) +\n // file name\n utfEncodedFileName +\n // extra field\n extraFields +\n // file comment\n utfEncodedComment;\n\n return {\n fileRecord: fileRecord,\n dirRecord: dirRecord,\n compressedObject: compressedObject\n };\n};\n\n\n// return the actual prototype of JSZip\nvar out = {\n /**\n * Read an existing zip and merge the data in the current JSZip object.\n * The implementation is in jszip-load.js, don't forget to include it.\n * @param {String|ArrayBuffer|Uint8Array|Buffer} stream The stream to load\n * @param {Object} options Options for loading the stream.\n * options.base64 : is the stream in base64 ? default : false\n * @return {JSZip} the current JSZip object\n */\n load: function(stream, options) {\n throw new Error(\"Load method is not defined. Is the file jszip-load.js included ?\");\n },\n\n /**\n * Filter nested files/folders with the specified function.\n * @param {Function} search the predicate to use :\n * function (relativePath, file) {...}\n * It takes 2 arguments : the relative path and the file.\n * @return {Array} An array of matching elements.\n */\n filter: function(search) {\n var result = [],\n filename, relativePath, file, fileClone;\n for (filename in this.files) {\n if (!this.files.hasOwnProperty(filename)) {\n continue;\n }\n file = this.files[filename];\n // return a new object, don't let the user mess with our internal objects :)\n fileClone = new ZipObject(file.name, file._data, extend(file.options));\n relativePath = filename.slice(this.root.length, filename.length);\n if (filename.slice(0, this.root.length) === this.root && // the file is in the current root\n search(relativePath, fileClone)) { // and the file matches the function\n result.push(fileClone);\n }\n }\n return result;\n },\n\n /**\n * Add a file to the zip file, or search a file.\n * @param {string|RegExp} name The name of the file to add (if data is defined),\n * the name of the file to find (if no data) or a regex to match files.\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data The file data, either raw or base64 encoded\n * @param {Object} o File options\n * @return {JSZip|Object|Array} this JSZip object (when adding a file),\n * a file (when searching by string) or an array of files (when searching by regex).\n */\n file: function(name, data, o) {\n if (arguments.length === 1) {\n if (utils.isRegExp(name)) {\n var regexp = name;\n return this.filter(function(relativePath, file) {\n return !file.dir && regexp.test(relativePath);\n });\n }\n else { // text\n return this.filter(function(relativePath, file) {\n return !file.dir && relativePath === name;\n })[0] || null;\n }\n }\n else { // more than one argument : we have data !\n name = this.root + name;\n fileAdd.call(this, name, data, o);\n }\n return this;\n },\n\n /**\n * Add a directory to the zip file, or search.\n * @param {String|RegExp} arg The name of the directory to add, or a regex to search folders.\n * @return {JSZip} an object with the new directory as the root, or an array containing matching folders.\n */\n folder: function(arg) {\n if (!arg) {\n return this;\n }\n\n if (utils.isRegExp(arg)) {\n return this.filter(function(relativePath, file) {\n return file.dir && arg.test(relativePath);\n });\n }\n\n // else, name is a new folder\n var name = this.root + arg;\n var newFolder = folderAdd.call(this, name);\n\n // Allow chaining by returning a new object with this folder as the root\n var ret = this.clone();\n ret.root = newFolder.name;\n return ret;\n },\n\n /**\n * Delete a file, or a directory and all sub-files, from the zip\n * @param {string} name the name of the file to delete\n * @return {JSZip} this JSZip object\n */\n remove: function(name) {\n name = this.root + name;\n var file = this.files[name];\n if (!file) {\n // Look for any folders\n if (name.slice(-1) != \"/\") {\n name += \"/\";\n }\n file = this.files[name];\n }\n\n if (file && !file.dir) {\n // file\n delete this.files[name];\n } else {\n // maybe a folder, delete recursively\n var kids = this.filter(function(relativePath, file) {\n return file.name.slice(0, name.length) === name;\n });\n for (var i = 0; i < kids.length; i++) {\n delete this.files[kids[i].name];\n }\n }\n\n return this;\n },\n\n /**\n * Generate the complete zip file\n * @param {Object} options the options to generate the zip file :\n * - base64, (deprecated, use type instead) true to generate base64.\n * - compression, \"STORE\" by default.\n * - type, \"base64\" by default. Values are : string, base64, uint8array, arraybuffer, blob.\n * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file\n */\n generate: function(options) {\n options = extend(options || {}, {\n base64: true,\n compression: \"STORE\",\n type: \"base64\",\n comment: null\n });\n\n utils.checkSupport(options.type);\n\n var zipData = [],\n localDirLength = 0,\n centralDirLength = 0,\n writer, i,\n utfEncodedComment = utils.transformTo(\"string\", this.utf8encode(options.comment || this.comment || \"\"));\n\n // first, generate all the zip parts.\n for (var name in this.files) {\n if (!this.files.hasOwnProperty(name)) {\n continue;\n }\n var file = this.files[name];\n\n var compressionName = file.options.compression || options.compression.toUpperCase();\n var compression = compressions[compressionName];\n if (!compression) {\n throw new Error(compressionName + \" is not a valid compression method !\");\n }\n\n var compressedObject = generateCompressedObjectFrom.call(this, file, compression);\n\n var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength);\n localDirLength += zipPart.fileRecord.length + compressedObject.compressedSize;\n centralDirLength += zipPart.dirRecord.length;\n zipData.push(zipPart);\n }\n\n var dirEnd = \"\";\n\n // end of central dir signature\n dirEnd = signature.CENTRAL_DIRECTORY_END +\n // number of this disk\n \"\\x00\\x00\" +\n // number of the disk with the start of the central directory\n \"\\x00\\x00\" +\n // total number of entries in the central directory on this disk\n decToHex(zipData.length, 2) +\n // total number of entries in the central directory\n decToHex(zipData.length, 2) +\n // size of the central directory 4 bytes\n decToHex(centralDirLength, 4) +\n // offset of start of central directory with respect to the starting disk number\n decToHex(localDirLength, 4) +\n // .ZIP file comment length\n decToHex(utfEncodedComment.length, 2) +\n // .ZIP file comment\n utfEncodedComment;\n\n\n // we have all the parts (and the total length)\n // time to create a writer !\n var typeName = options.type.toLowerCase();\n if(typeName===\"uint8array\"||typeName===\"arraybuffer\"||typeName===\"blob\"||typeName===\"nodebuffer\") {\n writer = new Uint8ArrayWriter(localDirLength + centralDirLength + dirEnd.length);\n }else{\n writer = new StringWriter(localDirLength + centralDirLength + dirEnd.length);\n }\n\n for (i = 0; i < zipData.length; i++) {\n writer.append(zipData[i].fileRecord);\n writer.append(zipData[i].compressedObject.compressedContent);\n }\n for (i = 0; i < zipData.length; i++) {\n writer.append(zipData[i].dirRecord);\n }\n\n writer.append(dirEnd);\n\n var zip = writer.finalize();\n\n\n\n switch(options.type.toLowerCase()) {\n // case \"zip is an Uint8Array\"\n case \"uint8array\" :\n case \"arraybuffer\" :\n case \"nodebuffer\" :\n return utils.transformTo(options.type.toLowerCase(), zip);\n case \"blob\" :\n return utils.arrayBuffer2Blob(utils.transformTo(\"arraybuffer\", zip));\n // case \"zip is a string\"\n case \"base64\" :\n return (options.base64) ? base64.encode(zip) : zip;\n default : // case \"string\" :\n return zip;\n }\n\n },\n\n /**\n * @deprecated\n * This method will be removed in a future version without replacement.\n */\n crc32: function (input, crc) {\n return crc32(input, crc);\n },\n\n /**\n * @deprecated\n * This method will be removed in a future version without replacement.\n */\n utf8encode: function (string) {\n return utils.transformTo(\"string\", utf8.utf8encode(string));\n },\n\n /**\n * @deprecated\n * This method will be removed in a future version without replacement.\n */\n utf8decode: function (input) {\n return utf8.utf8decode(input);\n }\n};\nmodule.exports = out;\n\n},{\"./base64\":1,\"./compressedObject\":2,\"./compressions\":3,\"./crc32\":4,\"./defaults\":6,\"./nodeBuffer\":11,\"./signature\":14,\"./stringWriter\":16,\"./support\":17,\"./uint8ArrayWriter\":19,\"./utf8\":20,\"./utils\":21}],14:[function(_dereq_,module,exports){\n'use strict';\nexports.LOCAL_FILE_HEADER = \"PK\\x03\\x04\";\nexports.CENTRAL_FILE_HEADER = \"PK\\x01\\x02\";\nexports.CENTRAL_DIRECTORY_END = \"PK\\x05\\x06\";\nexports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = \"PK\\x06\\x07\";\nexports.ZIP64_CENTRAL_DIRECTORY_END = \"PK\\x06\\x06\";\nexports.DATA_DESCRIPTOR = \"PK\\x07\\x08\";\n\n},{}],15:[function(_dereq_,module,exports){\n'use strict';\nvar DataReader = _dereq_('./dataReader');\nvar utils = _dereq_('./utils');\n\nfunction StringReader(data, optimizedBinaryString) {\n this.data = data;\n if (!optimizedBinaryString) {\n this.data = utils.string2binary(this.data);\n }\n this.length = this.data.length;\n this.index = 0;\n}\nStringReader.prototype = new DataReader();\n/**\n * @see DataReader.byteAt\n */\nStringReader.prototype.byteAt = function(i) {\n return this.data.charCodeAt(i);\n};\n/**\n * @see DataReader.lastIndexOfSignature\n */\nStringReader.prototype.lastIndexOfSignature = function(sig) {\n return this.data.lastIndexOf(sig);\n};\n/**\n * @see DataReader.readData\n */\nStringReader.prototype.readData = function(size) {\n this.checkOffset(size);\n // this will work because the constructor applied the \"& 0xff\" mask.\n var result = this.data.slice(this.index, this.index + size);\n this.index += size;\n return result;\n};\nmodule.exports = StringReader;\n\n},{\"./dataReader\":5,\"./utils\":21}],16:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('./utils');\n\n/**\n * An object to write any content to a string.\n * @constructor\n */\nvar StringWriter = function() {\n this.data = [];\n};\nStringWriter.prototype = {\n /**\n * Append any content to the current string.\n * @param {Object} input the content to add.\n */\n append: function(input) {\n input = utils.transformTo(\"string\", input);\n this.data.push(input);\n },\n /**\n * Finalize the construction an return the result.\n * @return {string} the generated string.\n */\n finalize: function() {\n return this.data.join(\"\");\n }\n};\n\nmodule.exports = StringWriter;\n\n},{\"./utils\":21}],17:[function(_dereq_,module,exports){\n(function (Buffer){\n'use strict';\nexports.base64 = true;\nexports.array = true;\nexports.string = true;\nexports.arraybuffer = typeof ArrayBuffer !== \"undefined\" && typeof Uint8Array !== \"undefined\";\n// contains true if JSZip can read/generate nodejs Buffer, false otherwise.\n// Browserify will provide a Buffer implementation for browsers, which is\n// an augmented Uint8Array (i.e., can be used as either Buffer or U8).\nexports.nodebuffer = typeof Buffer !== \"undefined\";\n// contains true if JSZip can read/generate Uint8Array, false otherwise.\nexports.uint8array = typeof Uint8Array !== \"undefined\";\n\nif (typeof ArrayBuffer === \"undefined\") {\n exports.blob = false;\n}\nelse {\n var buffer = new ArrayBuffer(0);\n try {\n exports.blob = new Blob([buffer], {\n type: \"application/zip\"\n }).size === 0;\n }\n catch (e) {\n try {\n var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\n var builder = new Builder();\n builder.append(buffer);\n exports.blob = builder.getBlob('application/zip').size === 0;\n }\n catch (e) {\n exports.blob = false;\n }\n }\n}\n\n}).call(this,(typeof Buffer !== \"undefined\" ? Buffer : undefined))\n},{}],18:[function(_dereq_,module,exports){\n'use strict';\nvar DataReader = _dereq_('./dataReader');\n\nfunction Uint8ArrayReader(data) {\n if (data) {\n this.data = data;\n this.length = this.data.length;\n this.index = 0;\n }\n}\nUint8ArrayReader.prototype = new DataReader();\n/**\n * @see DataReader.byteAt\n */\nUint8ArrayReader.prototype.byteAt = function(i) {\n return this.data[i];\n};\n/**\n * @see DataReader.lastIndexOfSignature\n */\nUint8ArrayReader.prototype.lastIndexOfSignature = function(sig) {\n var sig0 = sig.charCodeAt(0),\n sig1 = sig.charCodeAt(1),\n sig2 = sig.charCodeAt(2),\n sig3 = sig.charCodeAt(3);\n for (var i = this.length - 4; i >= 0; --i) {\n if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) {\n return i;\n }\n }\n\n return -1;\n};\n/**\n * @see DataReader.readData\n */\nUint8ArrayReader.prototype.readData = function(size) {\n this.checkOffset(size);\n if(size === 0) {\n // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of [].\n return new Uint8Array(0);\n }\n var result = this.data.subarray(this.index, this.index + size);\n this.index += size;\n return result;\n};\nmodule.exports = Uint8ArrayReader;\n\n},{\"./dataReader\":5}],19:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('./utils');\n\n/**\n * An object to write any content to an Uint8Array.\n * @constructor\n * @param {number} length The length of the array.\n */\nvar Uint8ArrayWriter = function(length) {\n this.data = new Uint8Array(length);\n this.index = 0;\n};\nUint8ArrayWriter.prototype = {\n /**\n * Append any content to the current array.\n * @param {Object} input the content to add.\n */\n append: function(input) {\n if (input.length !== 0) {\n // with an empty Uint8Array, Opera fails with a \"Offset larger than array size\"\n input = utils.transformTo(\"uint8array\", input);\n this.data.set(input, this.index);\n this.index += input.length;\n }\n },\n /**\n * Finalize the construction an return the result.\n * @return {Uint8Array} the generated array.\n */\n finalize: function() {\n return this.data;\n }\n};\n\nmodule.exports = Uint8ArrayWriter;\n\n},{\"./utils\":21}],20:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('./utils');\nvar support = _dereq_('./support');\nvar nodeBuffer = _dereq_('./nodeBuffer');\n\n/**\n * The following functions come from pako, from pako/lib/utils/strings\n * released under the MIT license, see pako https://github.com/nodeca/pako/\n */\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nvar _utf8len = new Array(256);\nfor (var i=0; i<256; i++) {\n _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);\n}\n_utf8len[254]=_utf8len[254]=1; // Invalid sequence start\n\n// convert string to array (typed, when possible)\nvar string2buf = function (str) {\n var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if (((c & 0xfc00) === 0xd800) && (m_pos+1 < str_len)) {\n c2 = str.charCodeAt(m_pos+1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += (c < 0x80) ? 1 : ((c < 0x800) ? 2 : ((c < 0x10000) ? 3 : 4));\n }\n\n // allocate buffer\n if (support.uint8array) {\n buf = new Uint8Array(buf_len);\n } else {\n buf = new Array(buf_len);\n }\n\n // convert\n for (i=0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {\n c2 = str.charCodeAt(m_pos+1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | ((c >>> 6) & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | ((c >>> 12) & 0x3f);\n buf[i++] = 0x80 | ((c >>> 6) & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n};\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max - length limit (mandatory);\nvar utf8border = function(buf, max) {\n var pos;\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n pos = max-1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Fuckup - very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means vuffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\n// convert array to string\nvar buf2string = function (buf) {\n var str, i, out, c, c_len;\n var len = buf.length;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n var utf16buf = new Array(len*2);\n\n for (out=0, i=0; i 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n // shrinkBuf(utf16buf, out)\n if (utf16buf.length !== out) {\n if(utf16buf.subarray) {\n utf16buf = utf16buf.subarray(0, out);\n } else {\n utf16buf.length = out;\n }\n }\n\n // return String.fromCharCode.apply(null, utf16buf);\n return utils.applyFromCharCode(utf16buf);\n};\n\n\n// That's all for the pako functions.\n\n\n/**\n * Transform a javascript string into an array (typed if possible) of bytes,\n * UTF-8 encoded.\n * @param {String} str the string to encode\n * @return {Array|Uint8Array|Buffer} the UTF-8 encoded string.\n */\nexports.utf8encode = function utf8encode(str) {\n if (support.nodebuffer) {\n return nodeBuffer(str, \"utf-8\");\n }\n\n return string2buf(str);\n};\n\n\n/**\n * Transform a bytes array (or a representation) representing an UTF-8 encoded\n * string into a javascript string.\n * @param {Array|Uint8Array|Buffer} buf the data de decode\n * @return {String} the decoded string.\n */\nexports.utf8decode = function utf8decode(buf) {\n if (support.nodebuffer) {\n return utils.transformTo(\"nodebuffer\", buf).toString(\"utf-8\");\n }\n\n buf = utils.transformTo(support.uint8array ? \"uint8array\" : \"array\", buf);\n\n // return buf2string(buf);\n // Chrome prefers to work with \"small\" chunks of data\n // for the method buf2string.\n // Firefox and Chrome has their own shortcut, IE doesn't seem to really care.\n var result = [], k = 0, len = buf.length, chunk = 65536;\n while (k < len) {\n var nextBoundary = utf8border(buf, Math.min(k + chunk, len));\n if (support.uint8array) {\n result.push(buf2string(buf.subarray(k, nextBoundary)));\n } else {\n result.push(buf2string(buf.slice(k, nextBoundary)));\n }\n k = nextBoundary;\n }\n return result.join(\"\");\n\n};\n// vim: set shiftwidth=4 softtabstop=4:\n\n},{\"./nodeBuffer\":11,\"./support\":17,\"./utils\":21}],21:[function(_dereq_,module,exports){\n'use strict';\nvar support = _dereq_('./support');\nvar compressions = _dereq_('./compressions');\nvar nodeBuffer = _dereq_('./nodeBuffer');\n/**\n * Convert a string to a \"binary string\" : a string containing only char codes between 0 and 255.\n * @param {string} str the string to transform.\n * @return {String} the binary string.\n */\nexports.string2binary = function(str) {\n var result = \"\";\n for (var i = 0; i < str.length; i++) {\n result += String.fromCharCode(str.charCodeAt(i) & 0xff);\n }\n return result;\n};\nexports.arrayBuffer2Blob = function(buffer) {\n exports.checkSupport(\"blob\");\n\n try {\n // Blob constructor\n return new Blob([buffer], {\n type: \"application/zip\"\n });\n }\n catch (e) {\n\n try {\n // deprecated, browser only, old way\n var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\n var builder = new Builder();\n builder.append(buffer);\n return builder.getBlob('application/zip');\n }\n catch (e) {\n\n // well, fuck ?!\n throw new Error(\"Bug : can't construct the Blob.\");\n }\n }\n\n\n};\n/**\n * The identity function.\n * @param {Object} input the input.\n * @return {Object} the same input.\n */\nfunction identity(input) {\n return input;\n}\n\n/**\n * Fill in an array with a string.\n * @param {String} str the string to use.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated).\n * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array.\n */\nfunction stringToArrayLike(str, array) {\n for (var i = 0; i < str.length; ++i) {\n array[i] = str.charCodeAt(i) & 0xFF;\n }\n return array;\n}\n\n/**\n * Transform an array-like object to a string.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.\n * @return {String} the result.\n */\nfunction arrayLikeToString(array) {\n // Performances notes :\n // --------------------\n // String.fromCharCode.apply(null, array) is the fastest, see\n // see http://jsperf.com/converting-a-uint8array-to-a-string/2\n // but the stack is limited (and we can get huge arrays !).\n //\n // result += String.fromCharCode(array[i]); generate too many strings !\n //\n // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2\n var chunk = 65536;\n var result = [],\n len = array.length,\n type = exports.getTypeOf(array),\n k = 0,\n canUseApply = true;\n try {\n switch(type) {\n case \"uint8array\":\n String.fromCharCode.apply(null, new Uint8Array(0));\n break;\n case \"nodebuffer\":\n String.fromCharCode.apply(null, nodeBuffer(0));\n break;\n }\n } catch(e) {\n canUseApply = false;\n }\n\n // no apply : slow and painful algorithm\n // default browser on android 4.*\n if (!canUseApply) {\n var resultStr = \"\";\n for(var i = 0; i < array.length;i++) {\n resultStr += String.fromCharCode(array[i]);\n }\n return resultStr;\n }\n while (k < len && chunk > 1) {\n try {\n if (type === \"array\" || type === \"nodebuffer\") {\n result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len))));\n }\n else {\n result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len))));\n }\n k += chunk;\n }\n catch (e) {\n chunk = Math.floor(chunk / 2);\n }\n }\n return result.join(\"\");\n}\n\nexports.applyFromCharCode = arrayLikeToString;\n\n\n/**\n * Copy the data from an array-like to an other array-like.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array.\n * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated.\n * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array.\n */\nfunction arrayLikeToArrayLike(arrayFrom, arrayTo) {\n for (var i = 0; i < arrayFrom.length; i++) {\n arrayTo[i] = arrayFrom[i];\n }\n return arrayTo;\n}\n\n// a matrix containing functions to transform everything into everything.\nvar transform = {};\n\n// string to ?\ntransform[\"string\"] = {\n \"string\": identity,\n \"array\": function(input) {\n return stringToArrayLike(input, new Array(input.length));\n },\n \"arraybuffer\": function(input) {\n return transform[\"string\"][\"uint8array\"](input).buffer;\n },\n \"uint8array\": function(input) {\n return stringToArrayLike(input, new Uint8Array(input.length));\n },\n \"nodebuffer\": function(input) {\n return stringToArrayLike(input, nodeBuffer(input.length));\n }\n};\n\n// array to ?\ntransform[\"array\"] = {\n \"string\": arrayLikeToString,\n \"array\": identity,\n \"arraybuffer\": function(input) {\n return (new Uint8Array(input)).buffer;\n },\n \"uint8array\": function(input) {\n return new Uint8Array(input);\n },\n \"nodebuffer\": function(input) {\n return nodeBuffer(input);\n }\n};\n\n// arraybuffer to ?\ntransform[\"arraybuffer\"] = {\n \"string\": function(input) {\n return arrayLikeToString(new Uint8Array(input));\n },\n \"array\": function(input) {\n return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength));\n },\n \"arraybuffer\": identity,\n \"uint8array\": function(input) {\n return new Uint8Array(input);\n },\n \"nodebuffer\": function(input) {\n return nodeBuffer(new Uint8Array(input));\n }\n};\n\n// uint8array to ?\ntransform[\"uint8array\"] = {\n \"string\": arrayLikeToString,\n \"array\": function(input) {\n return arrayLikeToArrayLike(input, new Array(input.length));\n },\n \"arraybuffer\": function(input) {\n return input.buffer;\n },\n \"uint8array\": identity,\n \"nodebuffer\": function(input) {\n return nodeBuffer(input);\n }\n};\n\n// nodebuffer to ?\ntransform[\"nodebuffer\"] = {\n \"string\": arrayLikeToString,\n \"array\": function(input) {\n return arrayLikeToArrayLike(input, new Array(input.length));\n },\n \"arraybuffer\": function(input) {\n return transform[\"nodebuffer\"][\"uint8array\"](input).buffer;\n },\n \"uint8array\": function(input) {\n return arrayLikeToArrayLike(input, new Uint8Array(input.length));\n },\n \"nodebuffer\": identity\n};\n\n/**\n * Transform an input into any type.\n * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer.\n * If no output type is specified, the unmodified input will be returned.\n * @param {String} outputType the output type.\n * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert.\n * @throws {Error} an Error if the browser doesn't support the requested output type.\n */\nexports.transformTo = function(outputType, input) {\n if (!input) {\n // undefined, null, etc\n // an empty string won't harm.\n input = \"\";\n }\n if (!outputType) {\n return input;\n }\n exports.checkSupport(outputType);\n var inputType = exports.getTypeOf(input);\n var result = transform[inputType][outputType](input);\n return result;\n};\n\n/**\n * Return the type of the input.\n * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer.\n * @param {Object} input the input to identify.\n * @return {String} the (lowercase) type of the input.\n */\nexports.getTypeOf = function(input) {\n if (typeof input === \"string\") {\n return \"string\";\n }\n if (Object.prototype.toString.call(input) === \"[object Array]\") {\n return \"array\";\n }\n if (support.nodebuffer && nodeBuffer.test(input)) {\n return \"nodebuffer\";\n }\n if (support.uint8array && input instanceof Uint8Array) {\n return \"uint8array\";\n }\n if (support.arraybuffer && input instanceof ArrayBuffer) {\n return \"arraybuffer\";\n }\n};\n\n/**\n * Throw an exception if the type is not supported.\n * @param {String} type the type to check.\n * @throws {Error} an Error if the browser doesn't support the requested type.\n */\nexports.checkSupport = function(type) {\n var supported = support[type.toLowerCase()];\n if (!supported) {\n throw new Error(type + \" is not supported by this browser\");\n }\n};\nexports.MAX_VALUE_16BITS = 65535;\nexports.MAX_VALUE_32BITS = -1; // well, \"\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\\xFF\" is parsed as -1\n\n/**\n * Prettify a string read as binary.\n * @param {string} str the string to prettify.\n * @return {string} a pretty string.\n */\nexports.pretty = function(str) {\n var res = '',\n code, i;\n for (i = 0; i < (str || \"\").length; i++) {\n code = str.charCodeAt(i);\n res += '\\\\x' + (code < 16 ? \"0\" : \"\") + code.toString(16).toUpperCase();\n }\n return res;\n};\n\n/**\n * Find a compression registered in JSZip.\n * @param {string} compressionMethod the method magic to find.\n * @return {Object|null} the JSZip compression object, null if none found.\n */\nexports.findCompression = function(compressionMethod) {\n for (var method in compressions) {\n if (!compressions.hasOwnProperty(method)) {\n continue;\n }\n if (compressions[method].magic === compressionMethod) {\n return compressions[method];\n }\n }\n return null;\n};\n/**\n* Cross-window, cross-Node-context regular expression detection\n* @param {Object} object Anything\n* @return {Boolean} true if the object is a regular expression,\n* false otherwise\n*/\nexports.isRegExp = function (object) {\n return Object.prototype.toString.call(object) === \"[object RegExp]\";\n};\n\n\n},{\"./compressions\":3,\"./nodeBuffer\":11,\"./support\":17}],22:[function(_dereq_,module,exports){\n'use strict';\nvar StringReader = _dereq_('./stringReader');\nvar NodeBufferReader = _dereq_('./nodeBufferReader');\nvar Uint8ArrayReader = _dereq_('./uint8ArrayReader');\nvar utils = _dereq_('./utils');\nvar sig = _dereq_('./signature');\nvar ZipEntry = _dereq_('./zipEntry');\nvar support = _dereq_('./support');\nvar jszipProto = _dereq_('./object');\n// class ZipEntries {{{\n/**\n * All the entries in the zip file.\n * @constructor\n * @param {String|ArrayBuffer|Uint8Array} data the binary stream to load.\n * @param {Object} loadOptions Options for loading the stream.\n */\nfunction ZipEntries(data, loadOptions) {\n this.files = [];\n this.loadOptions = loadOptions;\n if (data) {\n this.load(data);\n }\n}\nZipEntries.prototype = {\n /**\n * Check that the reader is on the speficied signature.\n * @param {string} expectedSignature the expected signature.\n * @throws {Error} if it is an other signature.\n */\n checkSignature: function(expectedSignature) {\n var signature = this.reader.readString(4);\n if (signature !== expectedSignature) {\n throw new Error(\"Corrupted zip or bug : unexpected signature \" + \"(\" + utils.pretty(signature) + \", expected \" + utils.pretty(expectedSignature) + \")\");\n }\n },\n /**\n * Read the end of the central directory.\n */\n readBlockEndOfCentral: function() {\n this.diskNumber = this.reader.readInt(2);\n this.diskWithCentralDirStart = this.reader.readInt(2);\n this.centralDirRecordsOnThisDisk = this.reader.readInt(2);\n this.centralDirRecords = this.reader.readInt(2);\n this.centralDirSize = this.reader.readInt(4);\n this.centralDirOffset = this.reader.readInt(4);\n\n this.zipCommentLength = this.reader.readInt(2);\n // warning : the encoding depends of the system locale\n // On a linux machine with LANG=en_US.utf8, this field is utf8 encoded.\n // On a windows machine, this field is encoded with the localized windows code page.\n this.zipComment = this.reader.readString(this.zipCommentLength);\n // To get consistent behavior with the generation part, we will assume that\n // this is utf8 encoded.\n this.zipComment = jszipProto.utf8decode(this.zipComment);\n },\n /**\n * Read the end of the Zip 64 central directory.\n * Not merged with the method readEndOfCentral :\n * The end of central can coexist with its Zip64 brother,\n * I don't want to read the wrong number of bytes !\n */\n readBlockZip64EndOfCentral: function() {\n this.zip64EndOfCentralSize = this.reader.readInt(8);\n this.versionMadeBy = this.reader.readString(2);\n this.versionNeeded = this.reader.readInt(2);\n this.diskNumber = this.reader.readInt(4);\n this.diskWithCentralDirStart = this.reader.readInt(4);\n this.centralDirRecordsOnThisDisk = this.reader.readInt(8);\n this.centralDirRecords = this.reader.readInt(8);\n this.centralDirSize = this.reader.readInt(8);\n this.centralDirOffset = this.reader.readInt(8);\n\n this.zip64ExtensibleData = {};\n var extraDataSize = this.zip64EndOfCentralSize - 44,\n index = 0,\n extraFieldId,\n extraFieldLength,\n extraFieldValue;\n while (index < extraDataSize) {\n extraFieldId = this.reader.readInt(2);\n extraFieldLength = this.reader.readInt(4);\n extraFieldValue = this.reader.readString(extraFieldLength);\n this.zip64ExtensibleData[extraFieldId] = {\n id: extraFieldId,\n length: extraFieldLength,\n value: extraFieldValue\n };\n }\n },\n /**\n * Read the end of the Zip 64 central directory locator.\n */\n readBlockZip64EndOfCentralLocator: function() {\n this.diskWithZip64CentralDirStart = this.reader.readInt(4);\n this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8);\n this.disksCount = this.reader.readInt(4);\n if (this.disksCount > 1) {\n throw new Error(\"Multi-volumes zip are not supported\");\n }\n },\n /**\n * Read the local files, based on the offset read in the central part.\n */\n readLocalFiles: function() {\n var i, file;\n for (i = 0; i < this.files.length; i++) {\n file = this.files[i];\n this.reader.setIndex(file.localHeaderOffset);\n this.checkSignature(sig.LOCAL_FILE_HEADER);\n file.readLocalPart(this.reader);\n file.handleUTF8();\n }\n },\n /**\n * Read the central directory.\n */\n readCentralDir: function() {\n var file;\n\n this.reader.setIndex(this.centralDirOffset);\n while (this.reader.readString(4) === sig.CENTRAL_FILE_HEADER) {\n file = new ZipEntry({\n zip64: this.zip64\n }, this.loadOptions);\n file.readCentralPart(this.reader);\n this.files.push(file);\n }\n },\n /**\n * Read the end of central directory.\n */\n readEndOfCentral: function() {\n var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END);\n if (offset === -1) {\n throw new Error(\"Corrupted zip : can't find end of central directory\");\n }\n this.reader.setIndex(offset);\n this.checkSignature(sig.CENTRAL_DIRECTORY_END);\n this.readBlockEndOfCentral();\n\n\n /* extract from the zip spec :\n 4) If one of the fields in the end of central directory\n record is too small to hold required data, the field\n should be set to -1 (0xFFFF or 0xFFFFFFFF) and the\n ZIP64 format record should be created.\n 5) The end of central directory record and the\n Zip64 end of central directory locator record must\n reside on the same disk when splitting or spanning\n an archive.\n */\n if (this.diskNumber === utils.MAX_VALUE_16BITS || this.diskWithCentralDirStart === utils.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === utils.MAX_VALUE_16BITS || this.centralDirRecords === utils.MAX_VALUE_16BITS || this.centralDirSize === utils.MAX_VALUE_32BITS || this.centralDirOffset === utils.MAX_VALUE_32BITS) {\n this.zip64 = true;\n\n /*\n Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from\n the zip file can fit into a 32bits integer. This cannot be solved : Javascript represents\n all numbers as 64-bit double precision IEEE 754 floating point numbers.\n So, we have 53bits for integers and bitwise operations treat everything as 32bits.\n see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators\n and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5\n */\n\n // should look for a zip64 EOCD locator\n offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);\n if (offset === -1) {\n throw new Error(\"Corrupted zip : can't find the ZIP64 end of central directory locator\");\n }\n this.reader.setIndex(offset);\n this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);\n this.readBlockZip64EndOfCentralLocator();\n\n // now the zip64 EOCD record\n this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir);\n this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END);\n this.readBlockZip64EndOfCentral();\n }\n },\n prepareReader: function(data) {\n var type = utils.getTypeOf(data);\n if (type === \"string\" && !support.uint8array) {\n this.reader = new StringReader(data, this.loadOptions.optimizedBinaryString);\n }\n else if (type === \"nodebuffer\") {\n this.reader = new NodeBufferReader(data);\n }\n else {\n this.reader = new Uint8ArrayReader(utils.transformTo(\"uint8array\", data));\n }\n },\n /**\n * Read a zip file and create ZipEntries.\n * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file.\n */\n load: function(data) {\n this.prepareReader(data);\n this.readEndOfCentral();\n this.readCentralDir();\n this.readLocalFiles();\n }\n};\n// }}} end of ZipEntries\nmodule.exports = ZipEntries;\n\n},{\"./nodeBufferReader\":12,\"./object\":13,\"./signature\":14,\"./stringReader\":15,\"./support\":17,\"./uint8ArrayReader\":18,\"./utils\":21,\"./zipEntry\":23}],23:[function(_dereq_,module,exports){\n'use strict';\nvar StringReader = _dereq_('./stringReader');\nvar utils = _dereq_('./utils');\nvar CompressedObject = _dereq_('./compressedObject');\nvar jszipProto = _dereq_('./object');\n// class ZipEntry {{{\n/**\n * An entry in the zip file.\n * @constructor\n * @param {Object} options Options of the current file.\n * @param {Object} loadOptions Options for loading the stream.\n */\nfunction ZipEntry(options, loadOptions) {\n this.options = options;\n this.loadOptions = loadOptions;\n}\nZipEntry.prototype = {\n /**\n * say if the file is encrypted.\n * @return {boolean} true if the file is encrypted, false otherwise.\n */\n isEncrypted: function() {\n // bit 1 is set\n return (this.bitFlag & 0x0001) === 0x0001;\n },\n /**\n * say if the file has utf-8 filename/comment.\n * @return {boolean} true if the filename/comment is in utf-8, false otherwise.\n */\n useUTF8: function() {\n // bit 11 is set\n return (this.bitFlag & 0x0800) === 0x0800;\n },\n /**\n * Prepare the function used to generate the compressed content from this ZipFile.\n * @param {DataReader} reader the reader to use.\n * @param {number} from the offset from where we should read the data.\n * @param {number} length the length of the data to read.\n * @return {Function} the callback to get the compressed content (the type depends of the DataReader class).\n */\n prepareCompressedContent: function(reader, from, length) {\n return function() {\n var previousIndex = reader.index;\n reader.setIndex(from);\n var compressedFileData = reader.readData(length);\n reader.setIndex(previousIndex);\n\n return compressedFileData;\n };\n },\n /**\n * Prepare the function used to generate the uncompressed content from this ZipFile.\n * @param {DataReader} reader the reader to use.\n * @param {number} from the offset from where we should read the data.\n * @param {number} length the length of the data to read.\n * @param {JSZip.compression} compression the compression used on this file.\n * @param {number} uncompressedSize the uncompressed size to expect.\n * @return {Function} the callback to get the uncompressed content (the type depends of the DataReader class).\n */\n prepareContent: function(reader, from, length, compression, uncompressedSize) {\n return function() {\n\n var compressedFileData = utils.transformTo(compression.uncompressInputType, this.getCompressedContent());\n var uncompressedFileData = compression.uncompress(compressedFileData);\n\n if (uncompressedFileData.length !== uncompressedSize) {\n throw new Error(\"Bug : uncompressed data size mismatch\");\n }\n\n return uncompressedFileData;\n };\n },\n /**\n * Read the local part of a zip file and add the info in this object.\n * @param {DataReader} reader the reader to use.\n */\n readLocalPart: function(reader) {\n var compression, localExtraFieldsLength;\n\n // we already know everything from the central dir !\n // If the central dir data are false, we are doomed.\n // On the bright side, the local part is scary : zip64, data descriptors, both, etc.\n // The less data we get here, the more reliable this should be.\n // Let's skip the whole header and dash to the data !\n reader.skip(22);\n // in some zip created on windows, the filename stored in the central dir contains \\ instead of /.\n // Strangely, the filename here is OK.\n // I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes\n // or APPNOTE#4.4.17.1, \"All slashes MUST be forward slashes '/'\") but there are a lot of bad zip generators...\n // Search \"unzip mismatching \"local\" filename continuing with \"central\" filename version\" on\n // the internet.\n //\n // I think I see the logic here : the central directory is used to display\n // content and the local directory is used to extract the files. Mixing / and \\\n // may be used to display \\ to windows users and use / when extracting the files.\n // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394\n this.fileNameLength = reader.readInt(2);\n localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir\n this.fileName = reader.readString(this.fileNameLength);\n reader.skip(localExtraFieldsLength);\n\n if (this.compressedSize == -1 || this.uncompressedSize == -1) {\n throw new Error(\"Bug or corrupted zip : didn't get enough informations from the central directory \" + \"(compressedSize == -1 || uncompressedSize == -1)\");\n }\n\n compression = utils.findCompression(this.compressionMethod);\n if (compression === null) { // no compression found\n throw new Error(\"Corrupted zip : compression \" + utils.pretty(this.compressionMethod) + \" unknown (inner file : \" + this.fileName + \")\");\n }\n this.decompressed = new CompressedObject();\n this.decompressed.compressedSize = this.compressedSize;\n this.decompressed.uncompressedSize = this.uncompressedSize;\n this.decompressed.crc32 = this.crc32;\n this.decompressed.compressionMethod = this.compressionMethod;\n this.decompressed.getCompressedContent = this.prepareCompressedContent(reader, reader.index, this.compressedSize, compression);\n this.decompressed.getContent = this.prepareContent(reader, reader.index, this.compressedSize, compression, this.uncompressedSize);\n\n // we need to compute the crc32...\n if (this.loadOptions.checkCRC32) {\n this.decompressed = utils.transformTo(\"string\", this.decompressed.getContent());\n if (jszipProto.crc32(this.decompressed) !== this.crc32) {\n throw new Error(\"Corrupted zip : CRC32 mismatch\");\n }\n }\n },\n\n /**\n * Read the central part of a zip file and add the info in this object.\n * @param {DataReader} reader the reader to use.\n */\n readCentralPart: function(reader) {\n this.versionMadeBy = reader.readString(2);\n this.versionNeeded = reader.readInt(2);\n this.bitFlag = reader.readInt(2);\n this.compressionMethod = reader.readString(2);\n this.date = reader.readDate();\n this.crc32 = reader.readInt(4);\n this.compressedSize = reader.readInt(4);\n this.uncompressedSize = reader.readInt(4);\n this.fileNameLength = reader.readInt(2);\n this.extraFieldsLength = reader.readInt(2);\n this.fileCommentLength = reader.readInt(2);\n this.diskNumberStart = reader.readInt(2);\n this.internalFileAttributes = reader.readInt(2);\n this.externalFileAttributes = reader.readInt(4);\n this.localHeaderOffset = reader.readInt(4);\n\n if (this.isEncrypted()) {\n throw new Error(\"Encrypted zip are not supported\");\n }\n\n this.fileName = reader.readString(this.fileNameLength);\n this.readExtraFields(reader);\n this.parseZIP64ExtraField(reader);\n this.fileComment = reader.readString(this.fileCommentLength);\n\n // warning, this is true only for zip with madeBy == DOS (plateform dependent feature)\n this.dir = this.externalFileAttributes & 0x00000010 ? true : false;\n },\n /**\n * Parse the ZIP64 extra field and merge the info in the current ZipEntry.\n * @param {DataReader} reader the reader to use.\n */\n parseZIP64ExtraField: function(reader) {\n\n if (!this.extraFields[0x0001]) {\n return;\n }\n\n // should be something, preparing the extra reader\n var extraReader = new StringReader(this.extraFields[0x0001].value);\n\n // I really hope that these 64bits integer can fit in 32 bits integer, because js\n // won't let us have more.\n if (this.uncompressedSize === utils.MAX_VALUE_32BITS) {\n this.uncompressedSize = extraReader.readInt(8);\n }\n if (this.compressedSize === utils.MAX_VALUE_32BITS) {\n this.compressedSize = extraReader.readInt(8);\n }\n if (this.localHeaderOffset === utils.MAX_VALUE_32BITS) {\n this.localHeaderOffset = extraReader.readInt(8);\n }\n if (this.diskNumberStart === utils.MAX_VALUE_32BITS) {\n this.diskNumberStart = extraReader.readInt(4);\n }\n },\n /**\n * Read the central part of a zip file and add the info in this object.\n * @param {DataReader} reader the reader to use.\n */\n readExtraFields: function(reader) {\n var start = reader.index,\n extraFieldId,\n extraFieldLength,\n extraFieldValue;\n\n this.extraFields = this.extraFields || {};\n\n while (reader.index < start + this.extraFieldsLength) {\n extraFieldId = reader.readInt(2);\n extraFieldLength = reader.readInt(2);\n extraFieldValue = reader.readString(extraFieldLength);\n\n this.extraFields[extraFieldId] = {\n id: extraFieldId,\n length: extraFieldLength,\n value: extraFieldValue\n };\n }\n },\n /**\n * Apply an UTF8 transformation if needed.\n */\n handleUTF8: function() {\n if (this.useUTF8()) {\n this.fileName = jszipProto.utf8decode(this.fileName);\n this.fileComment = jszipProto.utf8decode(this.fileComment);\n } else {\n var upath = this.findExtraFieldUnicodePath();\n if (upath !== null) {\n this.fileName = upath;\n }\n var ucomment = this.findExtraFieldUnicodeComment();\n if (ucomment !== null) {\n this.fileComment = ucomment;\n }\n }\n },\n\n /**\n * Find the unicode path declared in the extra field, if any.\n * @return {String} the unicode path, null otherwise.\n */\n findExtraFieldUnicodePath: function() {\n var upathField = this.extraFields[0x7075];\n if (upathField) {\n var extraReader = new StringReader(upathField.value);\n\n // wrong version\n if (extraReader.readInt(1) !== 1) {\n return null;\n }\n\n // the crc of the filename changed, this field is out of date.\n if (jszipProto.crc32(this.fileName) !== extraReader.readInt(4)) {\n return null;\n }\n\n return jszipProto.utf8decode(extraReader.readString(upathField.length - 5));\n }\n return null;\n },\n\n /**\n * Find the unicode comment declared in the extra field, if any.\n * @return {String} the unicode comment, null otherwise.\n */\n findExtraFieldUnicodeComment: function() {\n var ucommentField = this.extraFields[0x6375];\n if (ucommentField) {\n var extraReader = new StringReader(ucommentField.value);\n\n // wrong version\n if (extraReader.readInt(1) !== 1) {\n return null;\n }\n\n // the crc of the comment changed, this field is out of date.\n if (jszipProto.crc32(this.fileComment) !== extraReader.readInt(4)) {\n return null;\n }\n\n return jszipProto.utf8decode(extraReader.readString(ucommentField.length - 5));\n }\n return null;\n }\n};\nmodule.exports = ZipEntry;\n\n},{\"./compressedObject\":2,\"./object\":13,\"./stringReader\":15,\"./utils\":21}],24:[function(_dereq_,module,exports){\n// Top level file is just a mixin of submodules & constants\n'use strict';\n\nvar assign = _dereq_('./lib/utils/common').assign;\n\nvar deflate = _dereq_('./lib/deflate');\nvar inflate = _dereq_('./lib/inflate');\nvar constants = _dereq_('./lib/zlib/constants');\n\nvar pako = {};\n\nassign(pako, deflate, inflate, constants);\n\nmodule.exports = pako;\n},{\"./lib/deflate\":25,\"./lib/inflate\":26,\"./lib/utils/common\":27,\"./lib/zlib/constants\":30}],25:[function(_dereq_,module,exports){\n'use strict';\n\n\nvar zlib_deflate = _dereq_('./zlib/deflate.js');\nvar utils = _dereq_('./utils/common');\nvar strings = _dereq_('./utils/strings');\nvar msg = _dereq_('./zlib/messages');\nvar zstream = _dereq_('./zlib/zstream');\n\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nvar Z_NO_FLUSH = 0;\nvar Z_FINISH = 4;\n\nvar Z_OK = 0;\nvar Z_STREAM_END = 1;\n\nvar Z_DEFAULT_COMPRESSION = -1;\n\nvar Z_DEFAULT_STRATEGY = 0;\n\nvar Z_DEFLATED = 8;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overriden.\n **/\n\n/**\n * Deflate.result -> Uint8Array|Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n * (each char code [0..255])\n * - `header` (Object) - custom header for gzip\n * - `text` (Boolean) - true if compressed data believed to be text\n * - `time` (Number) - modification time, unix timestamp\n * - `os` (Number) - operation system code\n * - `extra` (Array) - array of bytes with extra data (max 65536)\n * - `name` (String) - file name (binary string)\n * - `comment` (String) - comment (binary string)\n * - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true); // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nvar Deflate = function(options) {\n\n this.options = utils.assign({\n level: Z_DEFAULT_COMPRESSION,\n method: Z_DEFLATED,\n chunkSize: 16384,\n windowBits: 15,\n memLevel: 8,\n strategy: Z_DEFAULT_STRATEGY,\n to: ''\n }, options || {});\n\n var opt = this.options;\n\n if (opt.raw && (opt.windowBits > 0)) {\n opt.windowBits = -opt.windowBits;\n }\n\n else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n opt.windowBits += 16;\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n var status = zlib_deflate.deflateInit2(\n this.strm,\n opt.level,\n opt.method,\n opt.windowBits,\n opt.memLevel,\n opt.strategy\n );\n\n if (status !== Z_OK) {\n throw new Error(msg[status]);\n }\n\n if (opt.header) {\n zlib_deflate.deflateSetHeader(this.strm, opt.header);\n }\n};\n\n/**\n * Deflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|String): input data. Strings will be converted to\n * utf8 byte sequence.\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That flush internal pending buffers and call\n * [[Deflate#onEnd]].\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * array format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nDeflate.prototype.push = function(data, mode) {\n var strm = this.strm;\n var chunkSize = this.options.chunkSize;\n var status, _mode;\n\n if (this.ended) { return false; }\n\n _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);\n\n // Convert data if needed\n if (typeof data === 'string') {\n // If we need to compress text, change encoding to utf8.\n strm.input = strings.string2buf(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n do {\n if (strm.avail_out === 0) {\n strm.output = new utils.Buf8(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n status = zlib_deflate.deflate(strm, _mode); /* no bad return value */\n\n if (status !== Z_STREAM_END && status !== Z_OK) {\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n if (strm.avail_out === 0 || (strm.avail_in === 0 && _mode === Z_FINISH)) {\n if (this.options.to === 'string') {\n this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));\n } else {\n this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n }\n }\n } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);\n\n // Finalize on the last chunk.\n if (_mode === Z_FINISH) {\n status = zlib_deflate.deflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === Z_OK;\n }\n\n return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): ouput data. Type of array depends\n * on js engine support. When string output requested, each chunk\n * will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate.prototype.onData = function(chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called once after you tell deflate that input stream complete\n * or error happenned. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate.prototype.onEnd = function(status) {\n // On success - join\n if (status === Z_OK) {\n if (this.options.to === 'string') {\n this.result = this.chunks.join('');\n } else {\n this.result = utils.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate alrorythm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n * (each char code [0..255])\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , data = Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate(input, options) {\n var deflator = new Deflate(options);\n\n deflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (deflator.err) { throw deflator.msg; }\n\n return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return deflate(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip(input, options) {\n options = options || {};\n options.gzip = true;\n return deflate(input, options);\n}\n\n\nexports.Deflate = Deflate;\nexports.deflate = deflate;\nexports.deflateRaw = deflateRaw;\nexports.gzip = gzip;\n},{\"./utils/common\":27,\"./utils/strings\":28,\"./zlib/deflate.js\":32,\"./zlib/messages\":37,\"./zlib/zstream\":39}],26:[function(_dereq_,module,exports){\n'use strict';\n\n\nvar zlib_inflate = _dereq_('./zlib/inflate.js');\nvar utils = _dereq_('./utils/common');\nvar strings = _dereq_('./utils/strings');\nvar c = _dereq_('./zlib/constants');\nvar msg = _dereq_('./zlib/messages');\nvar zstream = _dereq_('./zlib/zstream');\nvar gzheader = _dereq_('./zlib/gzheader');\n\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overriden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true); // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nvar Inflate = function(options) {\n\n this.options = utils.assign({\n chunkSize: 16384,\n windowBits: 0,\n to: ''\n }, options || {});\n\n var opt = this.options;\n\n // Force window size for `raw` data, if not set directly,\n // because we have no header for autodetect.\n if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n opt.windowBits = -opt.windowBits;\n if (opt.windowBits === 0) { opt.windowBits = -15; }\n }\n\n // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n !(options && options.windowBits)) {\n opt.windowBits += 32;\n }\n\n // Gzip header has no info about windows size, we can do autodetect only\n // for deflate. So, if window size not set, force it to max when gzip possible\n if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n // bit 3 (16) -> gzipped data\n // bit 4 (32) -> autodetect gzip/deflate\n if ((opt.windowBits & 15) === 0) {\n opt.windowBits |= 15;\n }\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n var status = zlib_inflate.inflateInit2(\n this.strm,\n opt.windowBits\n );\n\n if (status !== c.Z_OK) {\n throw new Error(msg[status]);\n }\n\n this.header = new gzheader();\n\n zlib_inflate.inflateGetHeader(this.strm, this.header);\n};\n\n/**\n * Inflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|String): input data\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That flush internal pending buffers and call\n * [[Inflate#onEnd]].\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nInflate.prototype.push = function(data, mode) {\n var strm = this.strm;\n var chunkSize = this.options.chunkSize;\n var status, _mode;\n var next_out_utf8, tail, utf8str;\n\n if (this.ended) { return false; }\n _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);\n\n // Convert data if needed\n if (typeof data === 'string') {\n // Only binary strings can be decompressed on practice\n strm.input = strings.binstring2buf(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n do {\n if (strm.avail_out === 0) {\n strm.output = new utils.Buf8(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH); /* no bad return value */\n\n if (status !== c.Z_STREAM_END && status !== c.Z_OK) {\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n\n if (strm.next_out) {\n if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && _mode === c.Z_FINISH)) {\n\n if (this.options.to === 'string') {\n\n next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n tail = strm.next_out - next_out_utf8;\n utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n // move tail\n strm.next_out = tail;\n strm.avail_out = chunkSize - tail;\n if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }\n\n this.onData(utf8str);\n\n } else {\n this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n }\n }\n }\n } while ((strm.avail_in > 0) && status !== c.Z_STREAM_END);\n\n if (status === c.Z_STREAM_END) {\n _mode = c.Z_FINISH;\n }\n // Finalize on the last chunk.\n if (_mode === c.Z_FINISH) {\n status = zlib_inflate.inflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === c.Z_OK;\n }\n\n return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): ouput data. Type of array depends\n * on js engine support. When string output requested, each chunk\n * will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate.prototype.onData = function(chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called once after you tell inflate that input stream complete\n * or error happenned. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate.prototype.onEnd = function(status) {\n // On success - join\n if (status === c.Z_OK) {\n if (this.options.to === 'string') {\n // Glue & convert here, until we teach pako to send\n // utf8 alligned strings to onData\n this.result = this.chunks.join('');\n } else {\n this.result = utils.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , input = pako.deflate([1,2,3,4,5,6,7,8,9])\n * , output;\n *\n * try {\n * output = pako.inflate(input);\n * } catch (err)\n * console.log(err);\n * }\n * ```\n **/\nfunction inflate(input, options) {\n var inflator = new Inflate(options);\n\n inflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (inflator.err) { throw inflator.msg; }\n\n return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return inflate(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nexports.Inflate = Inflate;\nexports.inflate = inflate;\nexports.inflateRaw = inflateRaw;\nexports.ungzip = inflate;\n\n},{\"./utils/common\":27,\"./utils/strings\":28,\"./zlib/constants\":30,\"./zlib/gzheader\":33,\"./zlib/inflate.js\":35,\"./zlib/messages\":37,\"./zlib/zstream\":39}],27:[function(_dereq_,module,exports){\n'use strict';\n\n\nvar TYPED_OK = (typeof Uint8Array !== 'undefined') &&\n (typeof Uint16Array !== 'undefined') &&\n (typeof Int32Array !== 'undefined');\n\n\nexports.assign = function (obj /*from1, from2, from3, ...*/) {\n var sources = Array.prototype.slice.call(arguments, 1);\n while (sources.length) {\n var source = sources.shift();\n if (!source) { continue; }\n\n if (typeof(source) !== 'object') {\n throw new TypeError(source + 'must be non-object');\n }\n\n for (var p in source) {\n if (source.hasOwnProperty(p)) {\n obj[p] = source[p];\n }\n }\n }\n\n return obj;\n};\n\n\n// reduce buffer size, avoiding mem copy\nexports.shrinkBuf = function (buf, size) {\n if (buf.length === size) { return buf; }\n if (buf.subarray) { return buf.subarray(0, size); }\n buf.length = size;\n return buf;\n};\n\n\nvar fnTyped = {\n arraySet: function (dest, src, src_offs, len, dest_offs) {\n if (src.subarray && dest.subarray) {\n dest.set(src.subarray(src_offs, src_offs+len), dest_offs);\n return;\n }\n // Fallback to ordinary array\n for(var i=0; i= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);\n}\n_utf8len[254]=_utf8len[254]=1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nexports.string2buf = function (str) {\n var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {\n c2 = str.charCodeAt(m_pos+1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n buf = new utils.Buf8(buf_len);\n\n // convert\n for (i=0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {\n c2 = str.charCodeAt(m_pos+1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n};\n\n// Helper (used in 2 places)\nfunction buf2binstring(buf, len) {\n // use fallback for big arrays to avoid stack overflow\n if (len < 65537) {\n if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {\n return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));\n }\n }\n\n var result = '';\n for(var i=0; i < len; i++) {\n result += String.fromCharCode(buf[i]);\n }\n return result;\n}\n\n\n// Convert byte array to binary string\nexports.buf2binstring = function(buf) {\n return buf2binstring(buf, buf.length);\n};\n\n\n// Convert binary string (typed, when possible)\nexports.binstring2buf = function(str) {\n var buf = new utils.Buf8(str.length);\n for(var i=0, len=buf.length; i < len; i++) {\n buf[i] = str.charCodeAt(i);\n }\n return buf;\n};\n\n\n// convert array to string\nexports.buf2string = function (buf, max) {\n var i, out, c, c_len;\n var len = max || buf.length;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n var utf16buf = new Array(len*2);\n\n for (out=0, i=0; i 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max - length limit (mandatory);\nexports.utf8border = function(buf, max) {\n var pos;\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n pos = max-1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Fuckup - very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means vuffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\n},{\"./common\":27}],29:[function(_dereq_,module,exports){\n'use strict';\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It doesn't worth to make additional optimizationa as in original.\n// Small size is preferable.\n\nfunction adler32(adler, buf, len, pos) {\n var s1 = (adler & 0xffff) |0\n , s2 = ((adler >>> 16) & 0xffff) |0\n , n = 0;\n\n while (len !== 0) {\n // Set limit ~ twice less than 5552, to keep\n // s2 in 31-bits, because we force signed ints.\n // in other case %= will fail.\n n = len > 2000 ? 2000 : len;\n len -= n;\n\n do {\n s1 = (s1 + buf[pos++]) |0;\n s2 = (s2 + s1) |0;\n } while (--n);\n\n s1 %= 65521;\n s2 %= 65521;\n }\n\n return (s1 | (s2 << 16)) |0;\n}\n\n\nmodule.exports = adler32;\n},{}],30:[function(_dereq_,module,exports){\nmodule.exports = {\n\n /* Allowed flush values; see deflate() and inflate() below for details */\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_TREES: 6,\n\n /* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n //Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n //Z_VERSION_ERROR: -6,\n\n /* compression levels */\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n\n\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n\n /* Possible values of the data_type field (though see inflate()) */\n Z_BINARY: 0,\n Z_TEXT: 1,\n //Z_ASCII: 1, // = Z_TEXT (deprecated)\n Z_UNKNOWN: 2,\n\n /* The deflate compression method */\n Z_DEFLATED: 8\n //Z_NULL: null // Use -1 or null inline, depending on var type\n};\n},{}],31:[function(_dereq_,module,exports){\n'use strict';\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n\n// Use ordinary array, since untyped makes no boost here\nfunction makeTable() {\n var c, table = [];\n\n for(var n =0; n < 256; n++){\n c = n;\n for(var k =0; k < 8; k++){\n c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n table[n] = c;\n }\n\n return table;\n}\n\n// Create table on load. Just 255 signed longs. Not a problem.\nvar crcTable = makeTable();\n\n\nfunction crc32(crc, buf, len, pos) {\n var t = crcTable\n , end = pos + len;\n\n crc = crc ^ (-1);\n\n for (var i = pos; i < end; i++ ) {\n crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n}\n\n\nmodule.exports = crc32;\n},{}],32:[function(_dereq_,module,exports){\n'use strict';\n\nvar utils = _dereq_('../utils/common');\nvar trees = _dereq_('./trees');\nvar adler32 = _dereq_('./adler32');\nvar crc32 = _dereq_('./crc32');\nvar msg = _dereq_('./messages');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\nvar Z_NO_FLUSH = 0;\nvar Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH = 2;\nvar Z_FULL_FLUSH = 3;\nvar Z_FINISH = 4;\nvar Z_BLOCK = 5;\n//var Z_TREES = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK = 0;\nvar Z_STREAM_END = 1;\n//var Z_NEED_DICT = 2;\n//var Z_ERRNO = -1;\nvar Z_STREAM_ERROR = -2;\nvar Z_DATA_ERROR = -3;\n//var Z_MEM_ERROR = -4;\nvar Z_BUF_ERROR = -5;\n//var Z_VERSION_ERROR = -6;\n\n\n/* compression levels */\n//var Z_NO_COMPRESSION = 0;\n//var Z_BEST_SPEED = 1;\n//var Z_BEST_COMPRESSION = 9;\nvar Z_DEFAULT_COMPRESSION = -1;\n\n\nvar Z_FILTERED = 1;\nvar Z_HUFFMAN_ONLY = 2;\nvar Z_RLE = 3;\nvar Z_FIXED = 4;\nvar Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\n//var Z_BINARY = 0;\n//var Z_TEXT = 1;\n//var Z_ASCII = 1; // = Z_TEXT\nvar Z_UNKNOWN = 2;\n\n\n/* The deflate compression method */\nvar Z_DEFLATED = 8;\n\n/*============================================================================*/\n\n\nvar MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_MEM_LEVEL = 8;\n\n\nvar LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nvar LITERALS = 256;\n/* number of literal bytes 0..255 */\nvar L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nvar D_CODES = 30;\n/* number of distance codes */\nvar BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\nvar HEAP_SIZE = 2*L_CODES + 1;\n/* maximum heap size */\nvar MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar MIN_MATCH = 3;\nvar MAX_MATCH = 258;\nvar MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nvar PRESET_DICT = 0x20;\n\nvar INIT_STATE = 42;\nvar EXTRA_STATE = 69;\nvar NAME_STATE = 73;\nvar COMMENT_STATE = 91;\nvar HCRC_STATE = 103;\nvar BUSY_STATE = 113;\nvar FINISH_STATE = 666;\n\nvar BS_NEED_MORE = 1; /* block not completed, need more input or more output */\nvar BS_BLOCK_DONE = 2; /* block flush performed */\nvar BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nvar BS_FINISH_DONE = 4; /* finish done, accept no more input or output */\n\nvar OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nfunction err(strm, errorCode) {\n strm.msg = msg[errorCode];\n return errorCode;\n}\n\nfunction rank(f) {\n return ((f) << 1) - ((f) > 4 ? 9 : 0);\n}\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->output buffer and copying into it.\n * (See also read_buf()).\n */\nfunction flush_pending(strm) {\n var s = strm.state;\n\n //_tr_flush_bits(s);\n var len = s.pending;\n if (len > strm.avail_out) {\n len = strm.avail_out;\n }\n if (len === 0) { return; }\n\n utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);\n strm.next_out += len;\n s.pending_out += len;\n strm.total_out += len;\n strm.avail_out -= len;\n s.pending -= len;\n if (s.pending === 0) {\n s.pending_out = 0;\n }\n}\n\n\nfunction flush_block_only (s, last) {\n trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n s.block_start = s.strstart;\n flush_pending(s.strm);\n}\n\n\nfunction put_byte(s, b) {\n s.pending_buf[s.pending++] = b;\n}\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nfunction putShortMSB(s, b) {\n// put_byte(s, (Byte)(b >> 8));\n// put_byte(s, (Byte)(b & 0xff));\n s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n s.pending_buf[s.pending++] = b & 0xff;\n}\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read. All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nfunction read_buf(strm, buf, start, size) {\n var len = strm.avail_in;\n\n if (len > size) { len = size; }\n if (len === 0) { return 0; }\n\n strm.avail_in -= len;\n\n utils.arraySet(buf, strm.input, strm.next_in, len, start);\n if (strm.state.wrap === 1) {\n strm.adler = adler32(strm.adler, buf, len, start);\n }\n\n else if (strm.state.wrap === 2) {\n strm.adler = crc32(strm.adler, buf, len, start);\n }\n\n strm.next_in += len;\n strm.total_in += len;\n\n return len;\n}\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nfunction longest_match(s, cur_match) {\n var chain_length = s.max_chain_length; /* max hash chain length */\n var scan = s.strstart; /* current string */\n var match; /* matched string */\n var len; /* length of current match */\n var best_len = s.prev_length; /* best match length so far */\n var nice_match = s.nice_match; /* stop if match long enough */\n var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n var _win = s.window; // shortcut\n\n var wmask = s.w_mask;\n var prev = s.prev;\n\n /* Stop when cur_match becomes <= limit. To simplify the code,\n * we prevent matches with the string of window index 0.\n */\n\n var strend = s.strstart + MAX_MATCH;\n var scan_end1 = _win[scan + best_len - 1];\n var scan_end = _win[scan + best_len];\n\n /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n * It is easy to get rid of this optimization if necessary.\n */\n // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n /* Do not waste too much time if we already have a good match: */\n if (s.prev_length >= s.good_match) {\n chain_length >>= 2;\n }\n /* Do not look for matches beyond the end of the input. This is necessary\n * to make deflate deterministic.\n */\n if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n do {\n // Assert(cur_match < s->strstart, \"no future\");\n match = cur_match;\n\n /* Skip to next match if the match length cannot increase\n * or if the match length is less than 2. Note that the checks below\n * for insufficient lookahead only occur occasionally for performance\n * reasons. Therefore uninitialized memory will be accessed, and\n * conditional jumps will be made that depend on those values.\n * However the length of the match is limited to the lookahead, so\n * the output of deflate is not affected by the uninitialized values.\n */\n\n if (_win[match + best_len] !== scan_end ||\n _win[match + best_len - 1] !== scan_end1 ||\n _win[match] !== _win[scan] ||\n _win[++match] !== _win[scan + 1]) {\n continue;\n }\n\n /* The check at best_len-1 can be removed because it will be made\n * again later. (This heuristic is not always a win.)\n * It is not necessary to compare scan[2] and match[2] since they\n * are always equal when the other bytes match, given that\n * the hash keys are equal and that HASH_BITS >= 8.\n */\n scan += 2;\n match++;\n // Assert(*scan == *match, \"match[2]?\");\n\n /* We check for insufficient lookahead only every 8th comparison;\n * the 256th check will be made at strstart+258.\n */\n do {\n /*jshint noempty:false*/\n } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n scan < strend);\n\n // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n len = MAX_MATCH - (strend - scan);\n scan = strend - MAX_MATCH;\n\n if (len > best_len) {\n s.match_start = cur_match;\n best_len = len;\n if (len >= nice_match) {\n break;\n }\n scan_end1 = _win[scan + best_len - 1];\n scan_end = _win[scan + best_len];\n }\n } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n if (best_len <= s.lookahead) {\n return best_len;\n }\n return s.lookahead;\n}\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n * At least one byte has been read, or avail_in == 0; reads are\n * performed for at least two bytes (required for the zip translate_eol\n * option -- not supported here).\n */\nfunction fill_window(s) {\n var _w_size = s.w_size;\n var p, n, m, more, str;\n\n //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n do {\n more = s.window_size - s.lookahead - s.strstart;\n\n // JS ints have 32 bit, block below not needed\n /* Deal with !@#$% 64K limit: */\n //if (sizeof(int) <= 2) {\n // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n // more = wsize;\n //\n // } else if (more == (unsigned)(-1)) {\n // /* Very unlikely, but possible on 16 bit machine if\n // * strstart == 0 && lookahead == 1 (input done a byte at time)\n // */\n // more--;\n // }\n //}\n\n\n /* If the window is almost full and there is insufficient lookahead,\n * move the upper half to the lower one to make room in the upper half.\n */\n if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n utils.arraySet(s.window, s.window, _w_size, _w_size, 0);\n s.match_start -= _w_size;\n s.strstart -= _w_size;\n /* we now have strstart >= MAX_DIST */\n s.block_start -= _w_size;\n\n /* Slide the hash table (could be avoided with 32 bit values\n at the expense of memory usage). We slide even when level == 0\n to keep the hash table consistent if we switch back to level > 0\n later. (Using level 0 permanently is not an optimal usage of\n zlib, so we don't care about this pathological case.)\n */\n\n n = s.hash_size;\n p = n;\n do {\n m = s.head[--p];\n s.head[p] = (m >= _w_size ? m - _w_size : 0);\n } while (--n);\n\n n = _w_size;\n p = n;\n do {\n m = s.prev[--p];\n s.prev[p] = (m >= _w_size ? m - _w_size : 0);\n /* If n is not on any hash chain, prev[n] is garbage but\n * its value will never be used.\n */\n } while (--n);\n\n more += _w_size;\n }\n if (s.strm.avail_in === 0) {\n break;\n }\n\n /* If there was no sliding:\n * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n * more == window_size - lookahead - strstart\n * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n * => more >= window_size - 2*WSIZE + 2\n * In the BIG_MEM or MMAP case (not yet supported),\n * window_size == input_size + MIN_LOOKAHEAD &&\n * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n * Otherwise, window_size == 2*WSIZE so more >= 2.\n * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n */\n //Assert(more >= 2, \"more < 2\");\n n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n s.lookahead += n;\n\n /* Initialize the hash value now that we have some input: */\n if (s.lookahead + s.insert >= MIN_MATCH) {\n str = s.strstart - s.insert;\n s.ins_h = s.window[str];\n\n /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;\n//#if MIN_MATCH != 3\n// Call update_hash() MIN_MATCH-3 more times\n//#endif\n while (s.insert) {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH-1]) & s.hash_mask;\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = str;\n str++;\n s.insert--;\n if (s.lookahead + s.insert < MIN_MATCH) {\n break;\n }\n }\n }\n /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n * but this is not important since only literal bytes will be emitted.\n */\n\n } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n /* If the WIN_INIT bytes after the end of the current data have never been\n * written, then zero those bytes in order to avoid memory check reports of\n * the use of uninitialized (or uninitialised as Julian writes) bytes by\n * the longest match routines. Update the high water mark for the next\n * time through here. WIN_INIT is set to MAX_MATCH since the longest match\n * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n */\n// if (s.high_water < s.window_size) {\n// var curr = s.strstart + s.lookahead;\n// var init = 0;\n//\n// if (s.high_water < curr) {\n// /* Previous high water mark below current data -- zero WIN_INIT\n// * bytes or up to end of window, whichever is less.\n// */\n// init = s.window_size - curr;\n// if (init > WIN_INIT)\n// init = WIN_INIT;\n// zmemzero(s->window + curr, (unsigned)init);\n// s->high_water = curr + init;\n// }\n// else if (s->high_water < (ulg)curr + WIN_INIT) {\n// /* High water mark at or above current data, but below current data\n// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n// * to end of window, whichever is less.\n// */\n// init = (ulg)curr + WIN_INIT - s->high_water;\n// if (init > s->window_size - s->high_water)\n// init = s->window_size - s->high_water;\n// zmemzero(s->window + s->high_water, (unsigned)init);\n// s->high_water += init;\n// }\n// }\n//\n// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n// \"not enough room for search\");\n}\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nfunction deflate_stored(s, flush) {\n /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n * to pending_buf_size, and each stored block has a 5 byte header:\n */\n var max_block_size = 0xffff;\n\n if (max_block_size > s.pending_buf_size - 5) {\n max_block_size = s.pending_buf_size - 5;\n }\n\n /* Copy as much as possible from input to output: */\n for (;;) {\n /* Fill the window as much as possible: */\n if (s.lookahead <= 1) {\n\n //Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n // s->block_start >= (long)s->w_size, \"slide too late\");\n// if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||\n// s.block_start >= s.w_size)) {\n// throw new Error(\"slide too late\");\n// }\n\n fill_window(s);\n if (s.lookahead === 0 && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n\n if (s.lookahead === 0) {\n break;\n }\n /* flush the current block */\n }\n //Assert(s->block_start >= 0L, \"block gone\");\n// if (s.block_start < 0) throw new Error(\"block gone\");\n\n s.strstart += s.lookahead;\n s.lookahead = 0;\n\n /* Emit a stored block if pending_buf will be full: */\n var max_start = s.block_start + max_block_size;\n\n if (s.strstart === 0 || s.strstart >= max_start) {\n /* strstart == 0 is possible when wraparound on 16-bit machine */\n s.lookahead = s.strstart - max_start;\n s.strstart = max_start;\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n\n\n }\n /* Flush if we may have to slide, otherwise block_start may become\n * negative and the data will be gone:\n */\n if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n\n s.insert = 0;\n\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n\n if (s.strstart > s.block_start) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_NEED_MORE;\n}\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nfunction deflate_fast(s, flush) {\n var hash_head; /* head of the hash chain */\n var bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) {\n break; /* flush the current block */\n }\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n * At this point we have always match_length < MIN_MATCH\n */\n if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n }\n if (s.match_length >= MIN_MATCH) {\n // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n /*** _tr_tally_dist(s, s.strstart - s.match_start,\n s.match_length - MIN_MATCH, bflush); ***/\n bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n\n /* Insert new strings in the hash table only if the match length\n * is not too large. This saves time but degrades compression.\n */\n if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n s.match_length--; /* string at strstart already in table */\n do {\n s.strstart++;\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n * always MIN_MATCH bytes ahead.\n */\n } while (--s.match_length !== 0);\n s.strstart++;\n } else\n {\n s.strstart += s.match_length;\n s.match_length = 0;\n s.ins_h = s.window[s.strstart];\n /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;\n\n//#if MIN_MATCH != 3\n// Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n * matter since it will be recomputed at next deflate call.\n */\n }\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = ((s.strstart < (MIN_MATCH-1)) ? s.strstart : MIN_MATCH-1);\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nfunction deflate_slow(s, flush) {\n var hash_head; /* head of hash chain */\n var bflush; /* set if current block must be flushed */\n\n var max_insert;\n\n /* Process the input block. */\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n */\n s.prev_length = s.match_length;\n s.prev_match = s.match_start;\n s.match_length = MIN_MATCH-1;\n\n if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n s.strstart - hash_head <= (s.w_size-MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n\n if (s.match_length <= 5 &&\n (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n /* If prev_match is also MIN_MATCH, match_start is garbage\n * but we will ignore the current match anyway.\n */\n s.match_length = MIN_MATCH-1;\n }\n }\n /* If there was a match at the previous step and the current\n * match is not better, output the previous match:\n */\n if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n max_insert = s.strstart + s.lookahead - MIN_MATCH;\n /* Do not insert strings in hash table beyond this. */\n\n //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n s.prev_length - MIN_MATCH, bflush);***/\n bflush = trees._tr_tally(s, s.strstart - 1- s.prev_match, s.prev_length - MIN_MATCH);\n /* Insert in hash table all strings up to the end of the match.\n * strstart-1 and strstart are already inserted. If there is not\n * enough lookahead, the last two strings are not inserted in\n * the hash table.\n */\n s.lookahead -= s.prev_length-1;\n s.prev_length -= 2;\n do {\n if (++s.strstart <= max_insert) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n } while (--s.prev_length !== 0);\n s.match_available = 0;\n s.match_length = MIN_MATCH-1;\n s.strstart++;\n\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n } else if (s.match_available) {\n /* If there was no match at the previous position, output a\n * single literal. If there was a match but the current match\n * is longer, truncate the previous match to a single literal.\n */\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]);\n\n if (bflush) {\n /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n flush_block_only(s, false);\n /***/\n }\n s.strstart++;\n s.lookahead--;\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n } else {\n /* There is no previous match to compare with, wait for\n * the next step to decide.\n */\n s.match_available = 1;\n s.strstart++;\n s.lookahead--;\n }\n }\n //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n if (s.match_available) {\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]);\n\n s.match_available = 0;\n }\n s.insert = s.strstart < MIN_MATCH-1 ? s.strstart : MIN_MATCH-1;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_BLOCK_DONE;\n}\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one. Do not maintain a hash table. (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nfunction deflate_rle(s, flush) {\n var bflush; /* set if current block must be flushed */\n var prev; /* byte at distance one to match */\n var scan, strend; /* scan goes up to strend for length of run */\n\n var _win = s.window;\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the longest run, plus one for the unrolled loop.\n */\n if (s.lookahead <= MAX_MATCH) {\n fill_window(s);\n if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* See how many times the previous byte repeats */\n s.match_length = 0;\n if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n scan = s.strstart - 1;\n prev = _win[scan];\n if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n strend = s.strstart + MAX_MATCH;\n do {\n /*jshint noempty:false*/\n } while (prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n scan < strend);\n s.match_length = MAX_MATCH - (strend - scan);\n if (s.match_length > s.lookahead) {\n s.match_length = s.lookahead;\n }\n }\n //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n }\n\n /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n if (s.match_length >= MIN_MATCH) {\n //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n s.strstart += s.match_length;\n s.match_length = 0;\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nfunction deflate_huff(s, flush) {\n var bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we have a literal to write. */\n if (s.lookahead === 0) {\n fill_window(s);\n if (s.lookahead === 0) {\n if (flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n break; /* flush the current block */\n }\n }\n\n /* Output a literal byte */\n s.match_length = 0;\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n s.lookahead--;\n s.strstart++;\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n}\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nvar Config = function (good_length, max_lazy, nice_length, max_chain, func) {\n this.good_length = good_length;\n this.max_lazy = max_lazy;\n this.nice_length = nice_length;\n this.max_chain = max_chain;\n this.func = func;\n};\n\nvar configuration_table;\n\nconfiguration_table = [\n /* good lazy nice chain */\n new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */\n new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */\n new Config(4, 5, 16, 8, deflate_fast), /* 2 */\n new Config(4, 6, 32, 32, deflate_fast), /* 3 */\n\n new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */\n new Config(8, 16, 32, 32, deflate_slow), /* 5 */\n new Config(8, 16, 128, 128, deflate_slow), /* 6 */\n new Config(8, 32, 128, 256, deflate_slow), /* 7 */\n new Config(32, 128, 258, 1024, deflate_slow), /* 8 */\n new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nfunction lm_init(s) {\n s.window_size = 2 * s.w_size;\n\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n\n /* Set the default configuration parameters:\n */\n s.max_lazy_match = configuration_table[s.level].max_lazy;\n s.good_match = configuration_table[s.level].good_length;\n s.nice_match = configuration_table[s.level].nice_length;\n s.max_chain_length = configuration_table[s.level].max_chain;\n\n s.strstart = 0;\n s.block_start = 0;\n s.lookahead = 0;\n s.insert = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n s.ins_h = 0;\n}\n\n\nfunction DeflateState() {\n this.strm = null; /* pointer back to this zlib stream */\n this.status = 0; /* as the name implies */\n this.pending_buf = null; /* output still pending */\n this.pending_buf_size = 0; /* size of pending_buf */\n this.pending_out = 0; /* next pending byte to output to the stream */\n this.pending = 0; /* nb of bytes in the pending buffer */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.gzhead = null; /* gzip header information to write */\n this.gzindex = 0; /* where in extra, name, or comment */\n this.method = Z_DEFLATED; /* can only be DEFLATED */\n this.last_flush = -1; /* value of flush param for previous deflate call */\n\n this.w_size = 0; /* LZ77 window size (32K by default) */\n this.w_bits = 0; /* log2(w_size) (8..16) */\n this.w_mask = 0; /* w_size - 1 */\n\n this.window = null;\n /* Sliding window. Input bytes are read into the second half of the window,\n * and move to the first half later to keep a dictionary of at least wSize\n * bytes. With this organization, matches are limited to a distance of\n * wSize-MAX_MATCH bytes, but this ensures that IO is always\n * performed with a length multiple of the block size.\n */\n\n this.window_size = 0;\n /* Actual size of window: 2*wSize, except when the user input buffer\n * is directly used as sliding window.\n */\n\n this.prev = null;\n /* Link to older string with same hash index. To limit the size of this\n * array to 64K, this link is maintained only for the last 32K strings.\n * An index in this array is thus a window index modulo 32K.\n */\n\n this.head = null; /* Heads of the hash chains or NIL. */\n\n this.ins_h = 0; /* hash index of string to be inserted */\n this.hash_size = 0; /* number of elements in hash table */\n this.hash_bits = 0; /* log2(hash_size) */\n this.hash_mask = 0; /* hash_size-1 */\n\n this.hash_shift = 0;\n /* Number of bits by which ins_h must be shifted at each input\n * step. It must be such that after MIN_MATCH steps, the oldest\n * byte no longer takes part in the hash key, that is:\n * hash_shift * MIN_MATCH >= hash_bits\n */\n\n this.block_start = 0;\n /* Window position at the beginning of the current output block. Gets\n * negative when the window is moved backwards.\n */\n\n this.match_length = 0; /* length of best match */\n this.prev_match = 0; /* previous match */\n this.match_available = 0; /* set if previous match exists */\n this.strstart = 0; /* start of string to insert */\n this.match_start = 0; /* start of matching string */\n this.lookahead = 0; /* number of valid bytes ahead in window */\n\n this.prev_length = 0;\n /* Length of the best match at previous step. Matches not greater than this\n * are discarded. This is used in the lazy match evaluation.\n */\n\n this.max_chain_length = 0;\n /* To speed up deflation, hash chains are never searched beyond this\n * length. A higher limit improves compression ratio but degrades the\n * speed.\n */\n\n this.max_lazy_match = 0;\n /* Attempt to find a better match only when the current match is strictly\n * smaller than this value. This mechanism is used only for compression\n * levels >= 4.\n */\n // That's alias to max_lazy_match, don't use directly\n //this.max_insert_length = 0;\n /* Insert new strings in the hash table only if the match length is not\n * greater than this length. This saves time but degrades compression.\n * max_insert_length is used only for compression levels <= 3.\n */\n\n this.level = 0; /* compression level (1..9) */\n this.strategy = 0; /* favor or force Huffman coding*/\n\n this.good_match = 0;\n /* Use a faster search when the previous match is longer than this */\n\n this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n /* used by trees.c: */\n\n /* Didn't use ct_data typedef below to suppress compiler warning */\n\n // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */\n // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */\n\n // Use flat array of DOUBLE size, with interleaved fata,\n // because JS does not support effective\n this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2);\n this.dyn_dtree = new utils.Buf16((2*D_CODES+1) * 2);\n this.bl_tree = new utils.Buf16((2*BL_CODES+1) * 2);\n zero(this.dyn_ltree);\n zero(this.dyn_dtree);\n zero(this.bl_tree);\n\n this.l_desc = null; /* desc. for literal tree */\n this.d_desc = null; /* desc. for distance tree */\n this.bl_desc = null; /* desc. for bit length tree */\n\n //ush bl_count[MAX_BITS+1];\n this.bl_count = new utils.Buf16(MAX_BITS+1);\n /* number of codes at each bit length for an optimal tree */\n\n //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */\n this.heap = new utils.Buf16(2*L_CODES+1); /* heap used to build the Huffman trees */\n zero(this.heap);\n\n this.heap_len = 0; /* number of elements in the heap */\n this.heap_max = 0; /* element of largest frequency */\n /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n * The same heap array is used to build all trees.\n */\n\n this.depth = new utils.Buf16(2*L_CODES+1); //uch depth[2*L_CODES+1];\n zero(this.depth);\n /* Depth of each subtree used as tie breaker for trees of equal frequency\n */\n\n this.l_buf = 0; /* buffer index for literals or lengths */\n\n this.lit_bufsize = 0;\n /* Size of match buffer for literals/lengths. There are 4 reasons for\n * limiting lit_bufsize to 64K:\n * - frequencies can be kept in 16 bit counters\n * - if compression is not successful for the first block, all input\n * data is still in the window so we can still emit a stored block even\n * when input comes from standard input. (This can also be done for\n * all blocks if lit_bufsize is not greater than 32K.)\n * - if compression is not successful for a file smaller than 64K, we can\n * even emit a stored file instead of a stored block (saving 5 bytes).\n * This is applicable only for zip (not gzip or zlib).\n * - creating new Huffman trees less frequently may not provide fast\n * adaptation to changes in the input data statistics. (Take for\n * example a binary file with poorly compressible code followed by\n * a highly compressible string table.) Smaller buffer sizes give\n * fast adaptation but have of course the overhead of transmitting\n * trees more frequently.\n * - I can't count above 4\n */\n\n this.last_lit = 0; /* running index in l_buf */\n\n this.d_buf = 0;\n /* Buffer index for distances. To simplify the code, d_buf and l_buf have\n * the same number of elements. To use different lengths, an extra flag\n * array would be necessary.\n */\n\n this.opt_len = 0; /* bit length of current block with optimal trees */\n this.static_len = 0; /* bit length of current block with static trees */\n this.matches = 0; /* number of string matches in current block */\n this.insert = 0; /* bytes at end of window left to insert */\n\n\n this.bi_buf = 0;\n /* Output buffer. bits are inserted starting at the bottom (least\n * significant bits).\n */\n this.bi_valid = 0;\n /* Number of valid bits in bi_buf. All bits above the last valid bit\n * are always zero.\n */\n\n // Used for window memory init. We safely ignore it for JS. That makes\n // sense only for pointers and memory check tools.\n //this.high_water = 0;\n /* High water mark offset in window for initialized bytes -- bytes above\n * this are set to zero in order to avoid memory check warnings when\n * longest match routines access bytes past the input. This is then\n * updated to the new high water mark.\n */\n}\n\n\nfunction deflateResetKeep(strm) {\n var s;\n\n if (!strm || !strm.state) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n strm.total_in = strm.total_out = 0;\n strm.data_type = Z_UNKNOWN;\n\n s = strm.state;\n s.pending = 0;\n s.pending_out = 0;\n\n if (s.wrap < 0) {\n s.wrap = -s.wrap;\n /* was made negative by deflate(..., Z_FINISH); */\n }\n s.status = (s.wrap ? INIT_STATE : BUSY_STATE);\n strm.adler = (s.wrap === 2) ?\n 0 // crc32(0, Z_NULL, 0)\n :\n 1; // adler32(0, Z_NULL, 0)\n s.last_flush = Z_NO_FLUSH;\n trees._tr_init(s);\n return Z_OK;\n}\n\n\nfunction deflateReset(strm) {\n var ret = deflateResetKeep(strm);\n if (ret === Z_OK) {\n lm_init(strm.state);\n }\n return ret;\n}\n\n\nfunction deflateSetHeader(strm, head) {\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }\n strm.state.gzhead = head;\n return Z_OK;\n}\n\n\nfunction deflateInit2(strm, level, method, windowBits, memLevel, strategy) {\n if (!strm) { // === Z_NULL\n return Z_STREAM_ERROR;\n }\n var wrap = 1;\n\n if (level === Z_DEFAULT_COMPRESSION) {\n level = 6;\n }\n\n if (windowBits < 0) { /* suppress zlib wrapper */\n wrap = 0;\n windowBits = -windowBits;\n }\n\n else if (windowBits > 15) {\n wrap = 2; /* write gzip wrapper instead */\n windowBits -= 16;\n }\n\n\n if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||\n windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n strategy < 0 || strategy > Z_FIXED) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n\n if (windowBits === 8) {\n windowBits = 9;\n }\n /* until 256-byte window bug fixed */\n\n var s = new DeflateState();\n\n strm.state = s;\n s.strm = strm;\n\n s.wrap = wrap;\n s.gzhead = null;\n s.w_bits = windowBits;\n s.w_size = 1 << s.w_bits;\n s.w_mask = s.w_size - 1;\n\n s.hash_bits = memLevel + 7;\n s.hash_size = 1 << s.hash_bits;\n s.hash_mask = s.hash_size - 1;\n s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n s.window = new utils.Buf8(s.w_size * 2);\n s.head = new utils.Buf16(s.hash_size);\n s.prev = new utils.Buf16(s.w_size);\n\n // Don't need mem init magic for JS.\n //s.high_water = 0; /* nothing written to s->window yet */\n\n s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n s.pending_buf_size = s.lit_bufsize * 4;\n s.pending_buf = new utils.Buf8(s.pending_buf_size);\n\n s.d_buf = s.lit_bufsize >> 1;\n s.l_buf = (1 + 2) * s.lit_bufsize;\n\n s.level = level;\n s.strategy = strategy;\n s.method = method;\n\n return deflateReset(strm);\n}\n\nfunction deflateInit(strm, level) {\n return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);\n}\n\n\nfunction deflate(strm, flush) {\n var old_flush, s;\n var beg, val; // for gzip header write only\n\n if (!strm || !strm.state ||\n flush > Z_BLOCK || flush < 0) {\n return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;\n }\n\n s = strm.state;\n\n if (!strm.output ||\n (!strm.input && strm.avail_in !== 0) ||\n (s.status === FINISH_STATE && flush !== Z_FINISH)) {\n return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);\n }\n\n s.strm = strm; /* just in case */\n old_flush = s.last_flush;\n s.last_flush = flush;\n\n /* Write the header */\n if (s.status === INIT_STATE) {\n\n if (s.wrap === 2) { // GZIP header\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n put_byte(s, 31);\n put_byte(s, 139);\n put_byte(s, 8);\n if (!s.gzhead) { // s->gzhead == Z_NULL\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, OS_CODE);\n s.status = BUSY_STATE;\n }\n else {\n put_byte(s, (s.gzhead.text ? 1 : 0) +\n (s.gzhead.hcrc ? 2 : 0) +\n (!s.gzhead.extra ? 0 : 4) +\n (!s.gzhead.name ? 0 : 8) +\n (!s.gzhead.comment ? 0 : 16)\n );\n put_byte(s, s.gzhead.time & 0xff);\n put_byte(s, (s.gzhead.time >> 8) & 0xff);\n put_byte(s, (s.gzhead.time >> 16) & 0xff);\n put_byte(s, (s.gzhead.time >> 24) & 0xff);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, s.gzhead.os & 0xff);\n if (s.gzhead.extra && s.gzhead.extra.length) {\n put_byte(s, s.gzhead.extra.length & 0xff);\n put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n }\n if (s.gzhead.hcrc) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);\n }\n s.gzindex = 0;\n s.status = EXTRA_STATE;\n }\n }\n else // DEFLATE header\n {\n var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;\n var level_flags = -1;\n\n if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n level_flags = 0;\n } else if (s.level < 6) {\n level_flags = 1;\n } else if (s.level === 6) {\n level_flags = 2;\n } else {\n level_flags = 3;\n }\n header |= (level_flags << 6);\n if (s.strstart !== 0) { header |= PRESET_DICT; }\n header += 31 - (header % 31);\n\n s.status = BUSY_STATE;\n putShortMSB(s, header);\n\n /* Save the adler32 of the preset dictionary: */\n if (s.strstart !== 0) {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n strm.adler = 1; // adler32(0L, Z_NULL, 0);\n }\n }\n\n//#ifdef GZIP\n if (s.status === EXTRA_STATE) {\n if (s.gzhead.extra/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n\n while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n break;\n }\n }\n put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);\n s.gzindex++;\n }\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (s.gzindex === s.gzhead.extra.length) {\n s.gzindex = 0;\n s.status = NAME_STATE;\n }\n }\n else {\n s.status = NAME_STATE;\n }\n }\n if (s.status === NAME_STATE) {\n if (s.gzhead.name/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.name.length) {\n val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg){\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.gzindex = 0;\n s.status = COMMENT_STATE;\n }\n }\n else {\n s.status = COMMENT_STATE;\n }\n }\n if (s.status === COMMENT_STATE) {\n if (s.gzhead.comment/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.comment.length) {\n val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.status = HCRC_STATE;\n }\n }\n else {\n s.status = HCRC_STATE;\n }\n }\n if (s.status === HCRC_STATE) {\n if (s.gzhead.hcrc) {\n if (s.pending + 2 > s.pending_buf_size) {\n flush_pending(strm);\n }\n if (s.pending + 2 <= s.pending_buf_size) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n s.status = BUSY_STATE;\n }\n }\n else {\n s.status = BUSY_STATE;\n }\n }\n//#endif\n\n /* Flush as much pending output as possible */\n if (s.pending !== 0) {\n flush_pending(strm);\n if (strm.avail_out === 0) {\n /* Since avail_out is 0, deflate will be called again with\n * more output space, but possibly with both pending and\n * avail_in equal to zero. There won't be anything to do,\n * but this is not an error situation so make sure we\n * return OK instead of BUF_ERROR at next call of deflate:\n */\n s.last_flush = -1;\n return Z_OK;\n }\n\n /* Make sure there is something to do and avoid duplicate consecutive\n * flushes. For repeated and useless calls with Z_FINISH, we keep\n * returning Z_STREAM_END instead of Z_BUF_ERROR.\n */\n } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n flush !== Z_FINISH) {\n return err(strm, Z_BUF_ERROR);\n }\n\n /* User must not provide more input after the first FINISH: */\n if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n return err(strm, Z_BUF_ERROR);\n }\n\n /* Start a new block or continue the current one.\n */\n if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {\n var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :\n (s.strategy === Z_RLE ? deflate_rle(s, flush) :\n configuration_table[s.level].func(s, flush));\n\n if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n s.status = FINISH_STATE;\n }\n if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n if (strm.avail_out === 0) {\n s.last_flush = -1;\n /* avoid BUF_ERROR next call, see above */\n }\n return Z_OK;\n /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n * of deflate should use the same flush parameter to make sure\n * that the flush is complete. So we don't have to output an\n * empty block here, this will be done at next call. This also\n * ensures that for a very small output buffer, we emit at most\n * one empty block.\n */\n }\n if (bstate === BS_BLOCK_DONE) {\n if (flush === Z_PARTIAL_FLUSH) {\n trees._tr_align(s);\n }\n else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */\n\n trees._tr_stored_block(s, 0, 0, false);\n /* For a full flush, this empty block will be recognized\n * as a special marker by inflate_sync().\n */\n if (flush === Z_FULL_FLUSH) {\n /*** CLEAR_HASH(s); ***/ /* forget history */\n zero(s.head); // Fill with NIL (= 0);\n\n if (s.lookahead === 0) {\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n }\n }\n flush_pending(strm);\n if (strm.avail_out === 0) {\n s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n return Z_OK;\n }\n }\n }\n //Assert(strm->avail_out > 0, \"bug2\");\n //if (strm.avail_out <= 0) { throw new Error(\"bug2\");}\n\n if (flush !== Z_FINISH) { return Z_OK; }\n if (s.wrap <= 0) { return Z_STREAM_END; }\n\n /* Write the trailer */\n if (s.wrap === 2) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n put_byte(s, (strm.adler >> 16) & 0xff);\n put_byte(s, (strm.adler >> 24) & 0xff);\n put_byte(s, strm.total_in & 0xff);\n put_byte(s, (strm.total_in >> 8) & 0xff);\n put_byte(s, (strm.total_in >> 16) & 0xff);\n put_byte(s, (strm.total_in >> 24) & 0xff);\n }\n else\n {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n\n flush_pending(strm);\n /* If avail_out is zero, the application will call deflate again\n * to flush the rest.\n */\n if (s.wrap > 0) { s.wrap = -s.wrap; }\n /* write the trailer only once! */\n return s.pending !== 0 ? Z_OK : Z_STREAM_END;\n}\n\nfunction deflateEnd(strm) {\n var status;\n\n if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n return Z_STREAM_ERROR;\n }\n\n status = strm.state.status;\n if (status !== INIT_STATE &&\n status !== EXTRA_STATE &&\n status !== NAME_STATE &&\n status !== COMMENT_STATE &&\n status !== HCRC_STATE &&\n status !== BUSY_STATE &&\n status !== FINISH_STATE\n ) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n strm.state = null;\n\n return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;\n}\n\n/* =========================================================================\n * Copy the source state to the destination state\n */\n//function deflateCopy(dest, source) {\n//\n//}\n\nexports.deflateInit = deflateInit;\nexports.deflateInit2 = deflateInit2;\nexports.deflateReset = deflateReset;\nexports.deflateResetKeep = deflateResetKeep;\nexports.deflateSetHeader = deflateSetHeader;\nexports.deflate = deflate;\nexports.deflateEnd = deflateEnd;\nexports.deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nexports.deflateBound = deflateBound;\nexports.deflateCopy = deflateCopy;\nexports.deflateSetDictionary = deflateSetDictionary;\nexports.deflateParams = deflateParams;\nexports.deflatePending = deflatePending;\nexports.deflatePrime = deflatePrime;\nexports.deflateTune = deflateTune;\n*/\n},{\"../utils/common\":27,\"./adler32\":29,\"./crc32\":31,\"./messages\":37,\"./trees\":38}],33:[function(_dereq_,module,exports){\n'use strict';\n\n\nfunction GZheader() {\n /* true if compressed data believed to be text */\n this.text = 0;\n /* modification time */\n this.time = 0;\n /* extra flags (not used when writing a gzip file) */\n this.xflags = 0;\n /* operating system */\n this.os = 0;\n /* pointer to extra field or Z_NULL if none */\n this.extra = null;\n /* extra field length (valid if extra != Z_NULL) */\n this.extra_len = 0; // Actually, we don't need it in JS,\n // but leave for few code modifications\n\n //\n // Setup limits is not necessary because in js we should not preallocate memory\n // for inflate use constant limit in 65536 bytes\n //\n\n /* space at extra (only when reading header) */\n // this.extra_max = 0;\n /* pointer to zero-terminated file name or Z_NULL */\n this.name = '';\n /* space at name (only when reading header) */\n // this.name_max = 0;\n /* pointer to zero-terminated comment or Z_NULL */\n this.comment = '';\n /* space at comment (only when reading header) */\n // this.comm_max = 0;\n /* true if there was or will be a header crc */\n this.hcrc = 0;\n /* true when done reading gzip header (not used when writing a gzip file) */\n this.done = false;\n}\n\nmodule.exports = GZheader;\n},{}],34:[function(_dereq_,module,exports){\n'use strict';\n\n// See state defs from inflate.js\nvar BAD = 30; /* got a data error -- remain here until reset */\nvar TYPE = 12; /* i: waiting for type bits, including last-flag bit */\n\n/*\n Decode literal, length, and distance codes and write out the resulting\n literal and match bytes until either not enough input or output is\n available, an end-of-block is encountered, or a data error is encountered.\n When large enough input and output buffers are supplied to inflate(), for\n example, a 16K input buffer and a 64K output buffer, more than 95% of the\n inflate execution time is spent in this routine.\n\n Entry assumptions:\n\n state.mode === LEN\n strm.avail_in >= 6\n strm.avail_out >= 258\n start >= strm.avail_out\n state.bits < 8\n\n On return, state.mode is one of:\n\n LEN -- ran out of enough output space or enough available input\n TYPE -- reached end of block code, inflate() to interpret next block\n BAD -- error in block data\n\n Notes:\n\n - The maximum input bits used by a length/distance pair is 15 bits for the\n length code, 5 bits for the length extra, 15 bits for the distance code,\n and 13 bits for the distance extra. This totals 48 bits, or six bytes.\n Therefore if strm.avail_in >= 6, then there is enough input to avoid\n checking for available input while decoding.\n\n - The maximum bytes that a single length/distance pair can output is 258\n bytes, which is the maximum length that can be coded. inflate_fast()\n requires strm.avail_out >= 258 for each loop to avoid checking for\n output space.\n */\nmodule.exports = function inflate_fast(strm, start) {\n var state;\n var _in; /* local strm.input */\n var last; /* have enough input while in < last */\n var _out; /* local strm.output */\n var beg; /* inflate()'s initial strm.output */\n var end; /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n var dmax; /* maximum distance from zlib header */\n//#endif\n var wsize; /* window size or zero if not using window */\n var whave; /* valid bytes in the window */\n var wnext; /* window write index */\n var window; /* allocated sliding window, if wsize != 0 */\n var hold; /* local strm.hold */\n var bits; /* local strm.bits */\n var lcode; /* local strm.lencode */\n var dcode; /* local strm.distcode */\n var lmask; /* mask for first level of length codes */\n var dmask; /* mask for first level of distance codes */\n var here; /* retrieved table entry */\n var op; /* code bits, operation, extra bits, or */\n /* window position, window bytes to copy */\n var len; /* match length, unused bytes */\n var dist; /* match distance */\n var from; /* where to copy match from */\n var from_source;\n\n\n var input, output; // JS specific, because we have no pointers\n\n /* copy state to local variables */\n state = strm.state;\n //here = state.here;\n _in = strm.next_in;\n input = strm.input;\n last = _in + (strm.avail_in - 5);\n _out = strm.next_out;\n output = strm.output;\n beg = _out - (start - strm.avail_out);\n end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n dmax = state.dmax;\n//#endif\n wsize = state.wsize;\n whave = state.whave;\n wnext = state.wnext;\n window = state.window;\n hold = state.hold;\n bits = state.bits;\n lcode = state.lencode;\n dcode = state.distcode;\n lmask = (1 << state.lenbits) - 1;\n dmask = (1 << state.distbits) - 1;\n\n\n /* decode literals and length/distances until end-of-block or not enough\n input data or output space */\n\n top:\n do {\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n\n here = lcode[hold & lmask];\n\n dolen:\n for (;;) { // Goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n if (op === 0) { /* literal */\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n output[_out++] = here & 0xffff/*here.val*/;\n }\n else if (op & 16) { /* length base */\n len = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (op) {\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n len += hold & ((1 << op) - 1);\n hold >>>= op;\n bits -= op;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", len));\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = dcode[hold & dmask];\n\n dodist:\n for (;;) { // goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n\n if (op & 16) { /* distance base */\n dist = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n }\n dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n if (dist > dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break top;\n }\n//#endif\n hold >>>= op;\n bits -= op;\n //Tracevv((stderr, \"inflate: distance %u\\n\", dist));\n op = _out - beg; /* max distance in output */\n if (dist > op) { /* see if copy from window */\n op = dist - op; /* distance back in window */\n if (op > whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break top;\n }\n\n// (!) This block is disabled in zlib defailts,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// if (len <= op - whave) {\n// do {\n// output[_out++] = 0;\n// } while (--len);\n// continue top;\n// }\n// len -= op - whave;\n// do {\n// output[_out++] = 0;\n// } while (--op > whave);\n// if (op === 0) {\n// from = _out - dist;\n// do {\n// output[_out++] = output[from++];\n// } while (--len);\n// continue top;\n// }\n//#endif\n }\n from = 0; // window index\n from_source = window;\n if (wnext === 0) { /* very common case */\n from += wsize - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n else if (wnext < op) { /* wrap around window */\n from += wsize + wnext - op;\n op -= wnext;\n if (op < len) { /* some from end of window */\n len -= op;\n do {\n output[_out++] = window[from++];\n } while (--op);\n from = 0;\n if (wnext < len) { /* some from start of window */\n op = wnext;\n len -= op;\n do {\n output[_out++] = window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n }\n else { /* contiguous in window */\n from += wnext - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n while (len > 2) {\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n len -= 3;\n }\n if (len) {\n output[_out++] = from_source[from++];\n if (len > 1) {\n output[_out++] = from_source[from++];\n }\n }\n }\n else {\n from = _out - dist; /* copy direct from output */\n do { /* minimum length is three */\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n len -= 3;\n } while (len > 2);\n if (len) {\n output[_out++] = output[from++];\n if (len > 1) {\n output[_out++] = output[from++];\n }\n }\n }\n }\n else if ((op & 64) === 0) { /* 2nd level distance code */\n here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dodist;\n }\n else {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n }\n else if ((op & 64) === 0) { /* 2nd level length code */\n here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dolen;\n }\n else if (op & 32) { /* end-of-block */\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.mode = TYPE;\n break top;\n }\n else {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n } while (_in < last && _out < end);\n\n /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n len = bits >> 3;\n _in -= len;\n bits -= len << 3;\n hold &= (1 << bits) - 1;\n\n /* update state and return */\n strm.next_in = _in;\n strm.next_out = _out;\n strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n state.hold = hold;\n state.bits = bits;\n return;\n};\n\n},{}],35:[function(_dereq_,module,exports){\n'use strict';\n\n\nvar utils = _dereq_('../utils/common');\nvar adler32 = _dereq_('./adler32');\nvar crc32 = _dereq_('./crc32');\nvar inflate_fast = _dereq_('./inffast');\nvar inflate_table = _dereq_('./inftrees');\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\n//var Z_NO_FLUSH = 0;\n//var Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH = 2;\n//var Z_FULL_FLUSH = 3;\nvar Z_FINISH = 4;\nvar Z_BLOCK = 5;\nvar Z_TREES = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK = 0;\nvar Z_STREAM_END = 1;\nvar Z_NEED_DICT = 2;\n//var Z_ERRNO = -1;\nvar Z_STREAM_ERROR = -2;\nvar Z_DATA_ERROR = -3;\nvar Z_MEM_ERROR = -4;\nvar Z_BUF_ERROR = -5;\n//var Z_VERSION_ERROR = -6;\n\n/* The deflate compression method */\nvar Z_DEFLATED = 8;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nvar HEAD = 1; /* i: waiting for magic header */\nvar FLAGS = 2; /* i: waiting for method and flags (gzip) */\nvar TIME = 3; /* i: waiting for modification time (gzip) */\nvar OS = 4; /* i: waiting for extra flags and operating system (gzip) */\nvar EXLEN = 5; /* i: waiting for extra length (gzip) */\nvar EXTRA = 6; /* i: waiting for extra bytes (gzip) */\nvar NAME = 7; /* i: waiting for end of file name (gzip) */\nvar COMMENT = 8; /* i: waiting for end of comment (gzip) */\nvar HCRC = 9; /* i: waiting for header crc (gzip) */\nvar DICTID = 10; /* i: waiting for dictionary check value */\nvar DICT = 11; /* waiting for inflateSetDictionary() call */\nvar TYPE = 12; /* i: waiting for type bits, including last-flag bit */\nvar TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */\nvar STORED = 14; /* i: waiting for stored size (length and complement) */\nvar COPY_ = 15; /* i/o: same as COPY below, but only first time in */\nvar COPY = 16; /* i/o: waiting for input or output to copy stored block */\nvar TABLE = 17; /* i: waiting for dynamic block table lengths */\nvar LENLENS = 18; /* i: waiting for code length code lengths */\nvar CODELENS = 19; /* i: waiting for length/lit and distance code lengths */\nvar LEN_ = 20; /* i: same as LEN below, but only first time in */\nvar LEN = 21; /* i: waiting for length/lit/eob code */\nvar LENEXT = 22; /* i: waiting for length extra bits */\nvar DIST = 23; /* i: waiting for distance code */\nvar DISTEXT = 24; /* i: waiting for distance extra bits */\nvar MATCH = 25; /* o: waiting for output space to copy string */\nvar LIT = 26; /* o: waiting for output space to write literal */\nvar CHECK = 27; /* i: waiting for 32-bit check value */\nvar LENGTH = 28; /* i: waiting for 32-bit length (gzip) */\nvar DONE = 29; /* finished check, done -- remain here until reset */\nvar BAD = 30; /* got a data error -- remain here until reset */\nvar MEM = 31; /* got an inflate() memory error -- remain here until reset */\nvar SYNC = 32; /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_WBITS = MAX_WBITS;\n\n\nfunction ZSWAP32(q) {\n return (((q >>> 24) & 0xff) +\n ((q >>> 8) & 0xff00) +\n ((q & 0xff00) << 8) +\n ((q & 0xff) << 24));\n}\n\n\nfunction InflateState() {\n this.mode = 0; /* current inflate mode */\n this.last = false; /* true if processing last block */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.havedict = false; /* true if dictionary provided */\n this.flags = 0; /* gzip header method and flags (0 if zlib) */\n this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */\n this.check = 0; /* protected copy of check value */\n this.total = 0; /* protected copy of output count */\n // TODO: may be {}\n this.head = null; /* where to save gzip header information */\n\n /* sliding window */\n this.wbits = 0; /* log base 2 of requested window size */\n this.wsize = 0; /* window size or zero if not using window */\n this.whave = 0; /* valid bytes in the window */\n this.wnext = 0; /* window write index */\n this.window = null; /* allocated sliding window, if needed */\n\n /* bit accumulator */\n this.hold = 0; /* input bit accumulator */\n this.bits = 0; /* number of bits in \"in\" */\n\n /* for string and stored block copying */\n this.length = 0; /* literal or length of data to copy */\n this.offset = 0; /* distance back to copy string from */\n\n /* for table and code decoding */\n this.extra = 0; /* extra bits needed */\n\n /* fixed and dynamic code tables */\n this.lencode = null; /* starting table for length/literal codes */\n this.distcode = null; /* starting table for distance codes */\n this.lenbits = 0; /* index bits for lencode */\n this.distbits = 0; /* index bits for distcode */\n\n /* dynamic table building */\n this.ncode = 0; /* number of code length code lengths */\n this.nlen = 0; /* number of length code lengths */\n this.ndist = 0; /* number of distance code lengths */\n this.have = 0; /* number of code lengths in lens[] */\n this.next = null; /* next available space in codes[] */\n\n this.lens = new utils.Buf16(320); /* temporary storage for code lengths */\n this.work = new utils.Buf16(288); /* work area for code table building */\n\n /*\n because we don't have pointers in js, we use lencode and distcode directly\n as buffers so we don't need codes\n */\n //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */\n this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */\n this.distdyn = null; /* dynamic table for distance codes (JS specific) */\n this.sane = 0; /* if false, allow invalid distance too far */\n this.back = 0; /* bits back of last unprocessed length/lit */\n this.was = 0; /* initial length of match */\n}\n\nfunction inflateResetKeep(strm) {\n var state;\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n strm.total_in = strm.total_out = state.total = 0;\n strm.msg = ''; /*Z_NULL*/\n if (state.wrap) { /* to support ill-conceived Java test suite */\n strm.adler = state.wrap & 1;\n }\n state.mode = HEAD;\n state.last = 0;\n state.havedict = 0;\n state.dmax = 32768;\n state.head = null/*Z_NULL*/;\n state.hold = 0;\n state.bits = 0;\n //state.lencode = state.distcode = state.next = state.codes;\n state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);\n state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);\n\n state.sane = 1;\n state.back = -1;\n //Tracev((stderr, \"inflate: reset\\n\"));\n return Z_OK;\n}\n\nfunction inflateReset(strm) {\n var state;\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n state.wsize = 0;\n state.whave = 0;\n state.wnext = 0;\n return inflateResetKeep(strm);\n\n}\n\nfunction inflateReset2(strm, windowBits) {\n var wrap;\n var state;\n\n /* get the state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n\n /* extract wrap request from windowBits parameter */\n if (windowBits < 0) {\n wrap = 0;\n windowBits = -windowBits;\n }\n else {\n wrap = (windowBits >> 4) + 1;\n if (windowBits < 48) {\n windowBits &= 15;\n }\n }\n\n /* set number of window bits, free window if different */\n if (windowBits && (windowBits < 8 || windowBits > 15)) {\n return Z_STREAM_ERROR;\n }\n if (state.window !== null && state.wbits !== windowBits) {\n state.window = null;\n }\n\n /* update state and reset the rest of it */\n state.wrap = wrap;\n state.wbits = windowBits;\n return inflateReset(strm);\n}\n\nfunction inflateInit2(strm, windowBits) {\n var ret;\n var state;\n\n if (!strm) { return Z_STREAM_ERROR; }\n //strm.msg = Z_NULL; /* in case we return an error */\n\n state = new InflateState();\n\n //if (state === Z_NULL) return Z_MEM_ERROR;\n //Tracev((stderr, \"inflate: allocated\\n\"));\n strm.state = state;\n state.window = null/*Z_NULL*/;\n ret = inflateReset2(strm, windowBits);\n if (ret !== Z_OK) {\n strm.state = null/*Z_NULL*/;\n }\n return ret;\n}\n\nfunction inflateInit(strm) {\n return inflateInit2(strm, DEF_WBITS);\n}\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding. Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter. This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time. However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nvar virgin = true;\n\nvar lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\nfunction fixedtables(state) {\n /* build fixed huffman tables if first call (may not be thread safe) */\n if (virgin) {\n var sym;\n\n lenfix = new utils.Buf32(512);\n distfix = new utils.Buf32(32);\n\n /* literal/length table */\n sym = 0;\n while (sym < 144) { state.lens[sym++] = 8; }\n while (sym < 256) { state.lens[sym++] = 9; }\n while (sym < 280) { state.lens[sym++] = 7; }\n while (sym < 288) { state.lens[sym++] = 8; }\n\n inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, {bits: 9});\n\n /* distance table */\n sym = 0;\n while (sym < 32) { state.lens[sym++] = 5; }\n\n inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, {bits: 5});\n\n /* do this just once */\n virgin = false;\n }\n\n state.lencode = lenfix;\n state.lenbits = 9;\n state.distcode = distfix;\n state.distbits = 5;\n}\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning. If window does not exist yet, create it. This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nfunction updatewindow(strm, src, end, copy) {\n var dist;\n var state = strm.state;\n\n /* if it hasn't been done already, allocate space for the window */\n if (state.window === null) {\n state.wsize = 1 << state.wbits;\n state.wnext = 0;\n state.whave = 0;\n\n state.window = new utils.Buf8(state.wsize);\n }\n\n /* copy state->wsize or less output bytes into the circular window */\n if (copy >= state.wsize) {\n utils.arraySet(state.window,src, end - state.wsize, state.wsize, 0);\n state.wnext = 0;\n state.whave = state.wsize;\n }\n else {\n dist = state.wsize - state.wnext;\n if (dist > copy) {\n dist = copy;\n }\n //zmemcpy(state->window + state->wnext, end - copy, dist);\n utils.arraySet(state.window,src, end - copy, dist, state.wnext);\n copy -= dist;\n if (copy) {\n //zmemcpy(state->window, end - copy, copy);\n utils.arraySet(state.window,src, end - copy, copy, 0);\n state.wnext = copy;\n state.whave = state.wsize;\n }\n else {\n state.wnext += dist;\n if (state.wnext === state.wsize) { state.wnext = 0; }\n if (state.whave < state.wsize) { state.whave += dist; }\n }\n }\n return 0;\n}\n\nfunction inflate(strm, flush) {\n var state;\n var input, output; // input/output buffers\n var next; /* next input INDEX */\n var put; /* next output INDEX */\n var have, left; /* available input and output */\n var hold; /* bit buffer */\n var bits; /* bits in bit buffer */\n var _in, _out; /* save starting available input and output */\n var copy; /* number of stored or match bytes to copy */\n var from; /* where to copy match bytes from */\n var from_source;\n var here = 0; /* current decoding table entry */\n var here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n //var last; /* parent table entry */\n var last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n var len; /* length to copy for repeats, bits to drop */\n var ret; /* return code */\n var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */\n var opts;\n\n var n; // temporary var for NEED_BITS\n\n var order = /* permutation of code lengths */\n [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];\n\n\n if (!strm || !strm.state || !strm.output ||\n (!strm.input && strm.avail_in !== 0)) {\n return Z_STREAM_ERROR;\n }\n\n state = strm.state;\n if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */\n\n\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n _in = have;\n _out = left;\n ret = Z_OK;\n\n inf_leave: // goto emulation\n for (;;) {\n switch (state.mode) {\n case HEAD:\n if (state.wrap === 0) {\n state.mode = TYPEDO;\n break;\n }\n //=== NEEDBITS(16);\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */\n state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = FLAGS;\n break;\n }\n state.flags = 0; /* expect zlib header */\n if (state.head) {\n state.head.done = false;\n }\n if (!(state.wrap & 1) || /* check if zlib header allowed */\n (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n strm.msg = 'incorrect header check';\n state.mode = BAD;\n break;\n }\n if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n len = (hold & 0x0f)/*BITS(4)*/ + 8;\n if (state.wbits === 0) {\n state.wbits = len;\n }\n else if (len > state.wbits) {\n strm.msg = 'invalid window size';\n state.mode = BAD;\n break;\n }\n state.dmax = 1 << len;\n //Tracev((stderr, \"inflate: zlib header ok\\n\"));\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = hold & 0x200 ? DICTID : TYPE;\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n break;\n case FLAGS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.flags = hold;\n if ((state.flags & 0xff) !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n if (state.flags & 0xe000) {\n strm.msg = 'unknown header flags set';\n state.mode = BAD;\n break;\n }\n if (state.head) {\n state.head.text = ((hold >> 8) & 1);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = TIME;\n /* falls through */\n case TIME:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.time = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC4(state.check, hold)\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n hbuf[2] = (hold >>> 16) & 0xff;\n hbuf[3] = (hold >>> 24) & 0xff;\n state.check = crc32(state.check, hbuf, 4, 0);\n //===\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = OS;\n /* falls through */\n case OS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.xflags = (hold & 0xff);\n state.head.os = (hold >> 8);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = EXLEN;\n /* falls through */\n case EXLEN:\n if (state.flags & 0x0400) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length = hold;\n if (state.head) {\n state.head.extra_len = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n else if (state.head) {\n state.head.extra = null/*Z_NULL*/;\n }\n state.mode = EXTRA;\n /* falls through */\n case EXTRA:\n if (state.flags & 0x0400) {\n copy = state.length;\n if (copy > have) { copy = have; }\n if (copy) {\n if (state.head) {\n len = state.head.extra_len - state.length;\n if (!state.head.extra) {\n // Use untyped array for more conveniend processing later\n state.head.extra = new Array(state.head.extra_len);\n }\n utils.arraySet(\n state.head.extra,\n input,\n next,\n // extra field is limited to 65536 bytes\n // - no need for additional size check\n copy,\n /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n len\n );\n //zmemcpy(state.head.extra + len, next,\n // len + copy > state.head.extra_max ?\n // state.head.extra_max - len : copy);\n }\n if (state.flags & 0x0200) {\n state.check = crc32(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n state.length -= copy;\n }\n if (state.length) { break inf_leave; }\n }\n state.length = 0;\n state.mode = NAME;\n /* falls through */\n case NAME:\n if (state.flags & 0x0800) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n // TODO: 2 or 1 bytes?\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.name_max*/)) {\n state.head.name += String.fromCharCode(len);\n }\n } while (len && copy < have);\n\n if (state.flags & 0x0200) {\n state.check = crc32(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.name = null;\n }\n state.length = 0;\n state.mode = COMMENT;\n /* falls through */\n case COMMENT:\n if (state.flags & 0x1000) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.comm_max*/)) {\n state.head.comment += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if (state.flags & 0x0200) {\n state.check = crc32(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.comment = null;\n }\n state.mode = HCRC;\n /* falls through */\n case HCRC:\n if (state.flags & 0x0200) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.check & 0xffff)) {\n strm.msg = 'header crc mismatch';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n if (state.head) {\n state.head.hcrc = ((state.flags >> 9) & 1);\n state.head.done = true;\n }\n strm.adler = state.check = 0 /*crc32(0L, Z_NULL, 0)*/;\n state.mode = TYPE;\n break;\n case DICTID:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n strm.adler = state.check = ZSWAP32(hold);\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = DICT;\n /* falls through */\n case DICT:\n if (state.havedict === 0) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n return Z_NEED_DICT;\n }\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = TYPE;\n /* falls through */\n case TYPE:\n if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case TYPEDO:\n if (state.last) {\n //--- BYTEBITS() ---//\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n state.mode = CHECK;\n break;\n }\n //=== NEEDBITS(3); */\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.last = (hold & 0x01)/*BITS(1)*/;\n //--- DROPBITS(1) ---//\n hold >>>= 1;\n bits -= 1;\n //---//\n\n switch ((hold & 0x03)/*BITS(2)*/) {\n case 0: /* stored block */\n //Tracev((stderr, \"inflate: stored block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = STORED;\n break;\n case 1: /* fixed block */\n fixedtables(state);\n //Tracev((stderr, \"inflate: fixed codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = LEN_; /* decode codes */\n if (flush === Z_TREES) {\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break inf_leave;\n }\n break;\n case 2: /* dynamic block */\n //Tracev((stderr, \"inflate: dynamic codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = TABLE;\n break;\n case 3:\n strm.msg = 'invalid block type';\n state.mode = BAD;\n }\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break;\n case STORED:\n //--- BYTEBITS() ---// /* go to byte boundary */\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n strm.msg = 'invalid stored block lengths';\n state.mode = BAD;\n break;\n }\n state.length = hold & 0xffff;\n //Tracev((stderr, \"inflate: stored length %u\\n\",\n // state.length));\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = COPY_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case COPY_:\n state.mode = COPY;\n /* falls through */\n case COPY:\n copy = state.length;\n if (copy) {\n if (copy > have) { copy = have; }\n if (copy > left) { copy = left; }\n if (copy === 0) { break inf_leave; }\n //--- zmemcpy(put, next, copy); ---\n utils.arraySet(output, input, next, copy, put);\n //---//\n have -= copy;\n next += copy;\n left -= copy;\n put += copy;\n state.length -= copy;\n break;\n }\n //Tracev((stderr, \"inflate: stored end\\n\"));\n state.mode = TYPE;\n break;\n case TABLE:\n //=== NEEDBITS(14); */\n while (bits < 14) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n if (state.nlen > 286 || state.ndist > 30) {\n strm.msg = 'too many length or distance symbols';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracev((stderr, \"inflate: table sizes ok\\n\"));\n state.have = 0;\n state.mode = LENLENS;\n /* falls through */\n case LENLENS:\n while (state.have < state.ncode) {\n //=== NEEDBITS(3);\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n while (state.have < 19) {\n state.lens[order[state.have++]] = 0;\n }\n // We have separate tables & no pointers. 2 commented lines below not needed.\n //state.next = state.codes;\n //state.lencode = state.next;\n // Switch to use dynamic table\n state.lencode = state.lendyn;\n state.lenbits = 7;\n\n opts = {bits: state.lenbits};\n ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n state.lenbits = opts.bits;\n\n if (ret) {\n strm.msg = 'invalid code lengths set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, \"inflate: code lengths ok\\n\"));\n state.have = 0;\n state.mode = CODELENS;\n /* falls through */\n case CODELENS:\n while (state.have < state.nlen + state.ndist) {\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_val < 16) {\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.lens[state.have++] = here_val;\n }\n else {\n if (here_val === 16) {\n //=== NEEDBITS(here.bits + 2);\n n = here_bits + 2;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n if (state.have === 0) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n len = state.lens[state.have - 1];\n copy = 3 + (hold & 0x03);//BITS(2);\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n }\n else if (here_val === 17) {\n //=== NEEDBITS(here.bits + 3);\n n = here_bits + 3;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 3 + (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n else {\n //=== NEEDBITS(here.bits + 7);\n n = here_bits + 7;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 11 + (hold & 0x7f);//BITS(7);\n //--- DROPBITS(7) ---//\n hold >>>= 7;\n bits -= 7;\n //---//\n }\n if (state.have + copy > state.nlen + state.ndist) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n while (copy--) {\n state.lens[state.have++] = len;\n }\n }\n }\n\n /* handle error breaks in while */\n if (state.mode === BAD) { break; }\n\n /* check for end-of-block code (better have one) */\n if (state.lens[256] === 0) {\n strm.msg = 'invalid code -- missing end-of-block';\n state.mode = BAD;\n break;\n }\n\n /* build code tables -- note: do not change the lenbits or distbits\n values here (9 and 6) without reading the comments in inftrees.h\n concerning the ENOUGH constants, which depend on those values */\n state.lenbits = 9;\n\n opts = {bits: state.lenbits};\n ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.lenbits = opts.bits;\n // state.lencode = state.next;\n\n if (ret) {\n strm.msg = 'invalid literal/lengths set';\n state.mode = BAD;\n break;\n }\n\n state.distbits = 6;\n //state.distcode.copy(state.codes);\n // Switch to use dynamic table\n state.distcode = state.distdyn;\n opts = {bits: state.distbits};\n ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.distbits = opts.bits;\n // state.distcode = state.next;\n\n if (ret) {\n strm.msg = 'invalid distances set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, 'inflate: codes ok\\n'));\n state.mode = LEN_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case LEN_:\n state.mode = LEN;\n /* falls through */\n case LEN:\n if (have >= 6 && left >= 258) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n inflate_fast(strm, _out);\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n if (state.mode === TYPE) {\n state.back = -1;\n }\n break;\n }\n state.back = 0;\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) -1)]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if (here_bits <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_op && (here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.lencode[last_val +\n ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n state.length = here_val;\n if (here_op === 0) {\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n state.mode = LIT;\n break;\n }\n if (here_op & 32) {\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.back = -1;\n state.mode = TYPE;\n break;\n }\n if (here_op & 64) {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break;\n }\n state.extra = here_op & 15;\n state.mode = LENEXT;\n /* falls through */\n case LENEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", state.length));\n state.was = state.length;\n state.mode = DIST;\n /* falls through */\n case DIST:\n for (;;) {\n here = state.distcode[hold & ((1 << state.distbits) -1)];/*BITS(state.distbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if ((here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.distcode[last_val +\n ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n if (here_op & 64) {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break;\n }\n state.offset = here_val;\n state.extra = (here_op) & 15;\n state.mode = DISTEXT;\n /* falls through */\n case DISTEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.offset += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n//#ifdef INFLATE_STRICT\n if (state.offset > state.dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracevv((stderr, \"inflate: distance %u\\n\", state.offset));\n state.mode = MATCH;\n /* falls through */\n case MATCH:\n if (left === 0) { break inf_leave; }\n copy = _out - left;\n if (state.offset > copy) { /* copy from window */\n copy = state.offset - copy;\n if (copy > state.whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n// (!) This block is disabled in zlib defailts,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// Trace((stderr, \"inflate.c too far\\n\"));\n// copy -= state.whave;\n// if (copy > state.length) { copy = state.length; }\n// if (copy > left) { copy = left; }\n// left -= copy;\n// state.length -= copy;\n// do {\n// output[put++] = 0;\n// } while (--copy);\n// if (state.length === 0) { state.mode = LEN; }\n// break;\n//#endif\n }\n if (copy > state.wnext) {\n copy -= state.wnext;\n from = state.wsize - copy;\n }\n else {\n from = state.wnext - copy;\n }\n if (copy > state.length) { copy = state.length; }\n from_source = state.window;\n }\n else { /* copy from output */\n from_source = output;\n from = put - state.offset;\n copy = state.length;\n }\n if (copy > left) { copy = left; }\n left -= copy;\n state.length -= copy;\n do {\n output[put++] = from_source[from++];\n } while (--copy);\n if (state.length === 0) { state.mode = LEN; }\n break;\n case LIT:\n if (left === 0) { break inf_leave; }\n output[put++] = state.length;\n left--;\n state.mode = LEN;\n break;\n case CHECK:\n if (state.wrap) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n // Use '|' insdead of '+' to make sure that result is signed\n hold |= input[next++] << bits;\n bits += 8;\n }\n //===//\n _out -= left;\n strm.total_out += _out;\n state.total += _out;\n if (_out) {\n strm.adler = state.check =\n /*UPDATE(state.check, put - _out, _out);*/\n (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));\n\n }\n _out = left;\n // NB: crc32 stored as signed 32-bit int, ZSWAP32 returns signed too\n if ((state.flags ? hold : ZSWAP32(hold)) !== state.check) {\n strm.msg = 'incorrect data check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: check matches trailer\\n\"));\n }\n state.mode = LENGTH;\n /* falls through */\n case LENGTH:\n if (state.wrap && state.flags) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.total & 0xffffffff)) {\n strm.msg = 'incorrect length check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: length matches trailer\\n\"));\n }\n state.mode = DONE;\n /* falls through */\n case DONE:\n ret = Z_STREAM_END;\n break inf_leave;\n case BAD:\n ret = Z_DATA_ERROR;\n break inf_leave;\n case MEM:\n return Z_MEM_ERROR;\n case SYNC:\n /* falls through */\n default:\n return Z_STREAM_ERROR;\n }\n }\n\n // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n /*\n Return from inflate(), updating the total counts and the check value.\n If there was no progress during the inflate() call, return a buffer\n error. Call updatewindow() to create and/or update the window state.\n Note: a memory error from inflate() is non-recoverable.\n */\n\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n\n if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n (state.mode < CHECK || flush !== Z_FINISH))) {\n if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {\n state.mode = MEM;\n return Z_MEM_ERROR;\n }\n }\n _in -= strm.avail_in;\n _out -= strm.avail_out;\n strm.total_in += _in;\n strm.total_out += _out;\n state.total += _out;\n if (state.wrap && _out) {\n strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));\n }\n strm.data_type = state.bits + (state.last ? 64 : 0) +\n (state.mode === TYPE ? 128 : 0) +\n (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {\n ret = Z_BUF_ERROR;\n }\n return ret;\n}\n\nfunction inflateEnd(strm) {\n\n if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n return Z_STREAM_ERROR;\n }\n\n var state = strm.state;\n if (state.window) {\n state.window = null;\n }\n strm.state = null;\n return Z_OK;\n}\n\nfunction inflateGetHeader(strm, head) {\n var state;\n\n /* check state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }\n\n /* save header structure */\n state.head = head;\n head.done = false;\n return Z_OK;\n}\n\n\nexports.inflateReset = inflateReset;\nexports.inflateReset2 = inflateReset2;\nexports.inflateResetKeep = inflateResetKeep;\nexports.inflateInit = inflateInit;\nexports.inflateInit2 = inflateInit2;\nexports.inflate = inflate;\nexports.inflateEnd = inflateEnd;\nexports.inflateGetHeader = inflateGetHeader;\nexports.inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nexports.inflateCopy = inflateCopy;\nexports.inflateGetDictionary = inflateGetDictionary;\nexports.inflateMark = inflateMark;\nexports.inflatePrime = inflatePrime;\nexports.inflateSetDictionary = inflateSetDictionary;\nexports.inflateSync = inflateSync;\nexports.inflateSyncPoint = inflateSyncPoint;\nexports.inflateUndermine = inflateUndermine;\n*/\n},{\"../utils/common\":27,\"./adler32\":29,\"./crc32\":31,\"./inffast\":34,\"./inftrees\":36}],36:[function(_dereq_,module,exports){\n'use strict';\n\n\nvar utils = _dereq_('../utils/common');\n\nvar MAXBITS = 15;\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\nvar lbase = [ /* Length codes 257..285 base */\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n];\n\nvar lext = [ /* Length codes 257..285 extra */\n 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n];\n\nvar dbase = [ /* Distance codes 0..29 base */\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n 8193, 12289, 16385, 24577, 0, 0\n];\n\nvar dext = [ /* Distance codes 0..29 extra */\n 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n 28, 28, 29, 29, 64, 64\n];\n\nmodule.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)\n{\n var bits = opts.bits;\n //here = opts.here; /* table entry for duplication */\n\n var len = 0; /* a code's length in bits */\n var sym = 0; /* index of code symbols */\n var min = 0, max = 0; /* minimum and maximum code lengths */\n var root = 0; /* number of index bits for root table */\n var curr = 0; /* number of index bits for current table */\n var drop = 0; /* code bits to drop for sub-table */\n var left = 0; /* number of prefix codes available */\n var used = 0; /* code entries in table used */\n var huff = 0; /* Huffman code */\n var incr; /* for incrementing code, index */\n var fill; /* index for replicating entries */\n var low; /* low bits for current root entry */\n var mask; /* mask for low root bits */\n var next; /* next available space in table */\n var base = null; /* base value table to use */\n var base_index = 0;\n// var shoextra; /* extra bits table to use */\n var end; /* use base and extra for symbol > end */\n var count = new utils.Buf16(MAXBITS+1); //[MAXBITS+1]; /* number of codes of each length */\n var offs = new utils.Buf16(MAXBITS+1); //[MAXBITS+1]; /* offsets in table for each length */\n var extra = null;\n var extra_index = 0;\n\n var here_bits, here_op, here_val;\n\n /*\n Process a set of code lengths to create a canonical Huffman code. The\n code lengths are lens[0..codes-1]. Each length corresponds to the\n symbols 0..codes-1. The Huffman code is generated by first sorting the\n symbols by length from short to long, and retaining the symbol order\n for codes with equal lengths. Then the code starts with all zero bits\n for the first code of the shortest length, and the codes are integer\n increments for the same length, and zeros are appended as the length\n increases. For the deflate format, these bits are stored backwards\n from their more natural integer increment ordering, and so when the\n decoding tables are built in the large loop below, the integer codes\n are incremented backwards.\n\n This routine assumes, but does not check, that all of the entries in\n lens[] are in the range 0..MAXBITS. The caller must assure this.\n 1..MAXBITS is interpreted as that code length. zero means that that\n symbol does not occur in this code.\n\n The codes are sorted by computing a count of codes for each length,\n creating from that a table of starting indices for each length in the\n sorted table, and then entering the symbols in order in the sorted\n table. The sorted table is work[], with that space being provided by\n the caller.\n\n The length counts are used for other purposes as well, i.e. finding\n the minimum and maximum length codes, determining if there are any\n codes at all, checking for a valid set of lengths, and looking ahead\n at length counts to determine sub-table sizes when building the\n decoding tables.\n */\n\n /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n for (len = 0; len <= MAXBITS; len++) {\n count[len] = 0;\n }\n for (sym = 0; sym < codes; sym++) {\n count[lens[lens_index + sym]]++;\n }\n\n /* bound code lengths, force root to be within code lengths */\n root = bits;\n for (max = MAXBITS; max >= 1; max--) {\n if (count[max] !== 0) { break; }\n }\n if (root > max) {\n root = max;\n }\n if (max === 0) { /* no symbols to code at all */\n //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */\n //table.bits[opts.table_index] = 1; //here.bits = (var char)1;\n //table.val[opts.table_index++] = 0; //here.val = (var short)0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n //table.op[opts.table_index] = 64;\n //table.bits[opts.table_index] = 1;\n //table.val[opts.table_index++] = 0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n opts.bits = 1;\n return 0; /* no symbols, but wait for decoding to report error */\n }\n for (min = 1; min < max; min++) {\n if (count[min] !== 0) { break; }\n }\n if (root < min) {\n root = min;\n }\n\n /* check for an over-subscribed or incomplete set of lengths */\n left = 1;\n for (len = 1; len <= MAXBITS; len++) {\n left <<= 1;\n left -= count[len];\n if (left < 0) {\n return -1;\n } /* over-subscribed */\n }\n if (left > 0 && (type === CODES || max !== 1)) {\n return -1; /* incomplete set */\n }\n\n /* generate offsets into symbol table for each length for sorting */\n offs[1] = 0;\n for (len = 1; len < MAXBITS; len++) {\n offs[len + 1] = offs[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (sym = 0; sym < codes; sym++) {\n if (lens[lens_index + sym] !== 0) {\n work[offs[lens[lens_index + sym]]++] = sym;\n }\n }\n\n /*\n Create and fill in decoding tables. In this loop, the table being\n filled is at next and has curr index bits. The code being used is huff\n with length len. That code is converted to an index by dropping drop\n bits off of the bottom. For codes where len is less than drop + curr,\n those top drop + curr - len bits are incremented through all values to\n fill the table with replicated entries.\n\n root is the number of index bits for the root table. When len exceeds\n root, sub-tables are created pointed to by the root entry with an index\n of the low root bits of huff. This is saved in low to check for when a\n new sub-table should be started. drop is zero when the root table is\n being filled, and drop is root when sub-tables are being filled.\n\n When a new sub-table is needed, it is necessary to look ahead in the\n code lengths to determine what size sub-table is needed. The length\n counts are used for this, and so count[] is decremented as codes are\n entered in the tables.\n\n used keeps track of how many table entries have been allocated from the\n provided *table space. It is checked for LENS and DIST tables against\n the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n the initial root table size constants. See the comments in inftrees.h\n for more information.\n\n sym increments through all symbols, and the loop terminates when\n all codes of length max, i.e. all codes, have been processed. This\n routine permits incomplete codes, so another loop after this one fills\n in the rest of the decoding tables with invalid code markers.\n */\n\n /* set up for code type */\n // poor man optimization - use if-else instead of switch,\n // to avoid deopts in old v8\n if (type === CODES) {\n base = extra = work; /* dummy value--not used */\n end = 19;\n } else if (type === LENS) {\n base = lbase;\n base_index -= 257;\n extra = lext;\n extra_index -= 257;\n end = 256;\n } else { /* DISTS */\n base = dbase;\n extra = dext;\n end = -1;\n }\n\n /* initialize opts for loop */\n huff = 0; /* starting code */\n sym = 0; /* starting code symbol */\n len = min; /* starting code length */\n next = table_index; /* current table to fill in */\n curr = root; /* current table index bits */\n drop = 0; /* current bits to drop from code for index */\n low = -1; /* trigger new sub-table when len > root */\n used = 1 << root; /* use root table entries */\n mask = used - 1; /* mask for comparing low */\n\n /* check available table space */\n if ((type === LENS && used > ENOUGH_LENS) ||\n (type === DISTS && used > ENOUGH_DISTS)) {\n return 1;\n }\n\n var i=0;\n /* process all codes and make table entries */\n for (;;) {\n i++;\n /* create table entry */\n here_bits = len - drop;\n if (work[sym] < end) {\n here_op = 0;\n here_val = work[sym];\n }\n else if (work[sym] > end) {\n here_op = extra[extra_index + work[sym]];\n here_val = base[base_index + work[sym]];\n }\n else {\n here_op = 32 + 64; /* end of block */\n here_val = 0;\n }\n\n /* replicate for those indices with low len bits equal to huff */\n incr = 1 << (len - drop);\n fill = 1 << curr;\n min = fill; /* save offset to next table */\n do {\n fill -= incr;\n table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n } while (fill !== 0);\n\n /* backwards increment the len-bit code huff */\n incr = 1 << (len - 1);\n while (huff & incr) {\n incr >>= 1;\n }\n if (incr !== 0) {\n huff &= incr - 1;\n huff += incr;\n } else {\n huff = 0;\n }\n\n /* go to next symbol, update count, len */\n sym++;\n if (--count[len] === 0) {\n if (len === max) { break; }\n len = lens[lens_index + work[sym]];\n }\n\n /* create new sub-table if needed */\n if (len > root && (huff & mask) !== low) {\n /* if first time, transition to sub-tables */\n if (drop === 0) {\n drop = root;\n }\n\n /* increment past last table */\n next += min; /* here min is 1 << curr */\n\n /* determine length of next table */\n curr = len - drop;\n left = 1 << curr;\n while (curr + drop < max) {\n left -= count[curr + drop];\n if (left <= 0) { break; }\n curr++;\n left <<= 1;\n }\n\n /* check for enough space */\n used += 1 << curr;\n if ((type === LENS && used > ENOUGH_LENS) ||\n (type === DISTS && used > ENOUGH_DISTS)) {\n return 1;\n }\n\n /* point entry in root table to sub-table */\n low = huff & mask;\n /*table.op[low] = curr;\n table.bits[low] = root;\n table.val[low] = next - opts.table_index;*/\n table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n }\n }\n\n /* fill in remaining table entry if code is incomplete (guaranteed to have\n at most one remaining entry, since if the code is incomplete, the\n maximum code length that was allowed to get this far is one bit) */\n if (huff !== 0) {\n //table.op[next + huff] = 64; /* invalid code marker */\n //table.bits[next + huff] = len - drop;\n //table.val[next + huff] = 0;\n table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n }\n\n /* set return parameters */\n //opts.table_index += used;\n opts.bits = root;\n return 0;\n};\n\n},{\"../utils/common\":27}],37:[function(_dereq_,module,exports){\n'use strict';\n\nmodule.exports = {\n '2': 'need dictionary', /* Z_NEED_DICT 2 */\n '1': 'stream end', /* Z_STREAM_END 1 */\n '0': '', /* Z_OK 0 */\n '-1': 'file error', /* Z_ERRNO (-1) */\n '-2': 'stream error', /* Z_STREAM_ERROR (-2) */\n '-3': 'data error', /* Z_DATA_ERROR (-3) */\n '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */\n '-5': 'buffer error', /* Z_BUF_ERROR (-5) */\n '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n},{}],38:[function(_dereq_,module,exports){\n'use strict';\n\n\nvar utils = _dereq_('../utils/common');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//var Z_FILTERED = 1;\n//var Z_HUFFMAN_ONLY = 2;\n//var Z_RLE = 3;\nvar Z_FIXED = 4;\n//var Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nvar Z_BINARY = 0;\nvar Z_TEXT = 1;\n//var Z_ASCII = 1; // = Z_TEXT\nvar Z_UNKNOWN = 2;\n\n/*============================================================================*/\n\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nvar STORED_BLOCK = 0;\nvar STATIC_TREES = 1;\nvar DYN_TREES = 2;\n/* The three kinds of block type */\n\nvar MIN_MATCH = 3;\nvar MAX_MATCH = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nvar LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nvar LITERALS = 256;\n/* number of literal bytes 0..255 */\n\nvar L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nvar D_CODES = 30;\n/* number of distance codes */\n\nvar BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\n\nvar HEAP_SIZE = 2*L_CODES + 1;\n/* maximum heap size */\n\nvar MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar Buf_size = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nvar MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nvar END_BLOCK = 256;\n/* end of block literal code */\n\nvar REP_3_6 = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nvar REPZ_3_10 = 17;\n/* repeat a zero length 3-10 times (3 bits of repeat count) */\n\nvar REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times (7 bits of repeat count) */\n\nvar extra_lbits = /* extra bits for each length code */\n [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];\n\nvar extra_dbits = /* extra bits for each distance code */\n [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];\n\nvar extra_blbits = /* extra bits for each bit length code */\n [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];\n\nvar bl_order =\n [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nvar DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1\nvar static_ltree = new Array((L_CODES+2) * 2);\nzero(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nvar static_dtree = new Array(D_CODES * 2);\nzero(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nvar _dist_code = new Array(DIST_CODE_LEN);\nzero(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nvar _length_code = new Array(MAX_MATCH-MIN_MATCH+1);\nzero(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nvar base_length = new Array(LENGTH_CODES);\nzero(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nvar base_dist = new Array(D_CODES);\nzero(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nvar StaticTreeDesc = function (static_tree, extra_bits, extra_base, elems, max_length) {\n\n this.static_tree = static_tree; /* static tree or NULL */\n this.extra_bits = extra_bits; /* extra bits for each code or NULL */\n this.extra_base = extra_base; /* base index for extra_bits */\n this.elems = elems; /* max number of elements in the tree */\n this.max_length = max_length; /* max bit length for the codes */\n\n // show if `static_tree` has data or dummy - needed for monomorphic objects\n this.has_stree = static_tree && static_tree.length;\n};\n\n\nvar static_l_desc;\nvar static_d_desc;\nvar static_bl_desc;\n\n\nvar TreeDesc = function(dyn_tree, stat_desc) {\n this.dyn_tree = dyn_tree; /* the dynamic tree */\n this.max_code = 0; /* largest code with non zero frequency */\n this.stat_desc = stat_desc; /* the corresponding static tree */\n};\n\n\n\nfunction d_code(dist) {\n return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n}\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nfunction put_short (s, w) {\n// put_byte(s, (uch)((w) & 0xff));\n// put_byte(s, (uch)((ush)(w) >> 8));\n s.pending_buf[s.pending++] = (w) & 0xff;\n s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n}\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nfunction send_bits(s, value, length) {\n if (s.bi_valid > (Buf_size - length)) {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n put_short(s, s.bi_buf);\n s.bi_buf = value >> (Buf_size - s.bi_valid);\n s.bi_valid += length - Buf_size;\n } else {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n s.bi_valid += length;\n }\n}\n\n\nfunction send_code(s, c, tree) {\n send_bits(s, tree[c*2]/*.Code*/, tree[c*2 + 1]/*.Len*/);\n}\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nfunction bi_reverse(code, len) {\n var res = 0;\n do {\n res |= code & 1;\n code >>>= 1;\n res <<= 1;\n } while (--len > 0);\n return res >>> 1;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nfunction bi_flush(s) {\n if (s.bi_valid === 16) {\n put_short(s, s.bi_buf);\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n } else if (s.bi_valid >= 8) {\n s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n s.bi_buf >>= 8;\n s.bi_valid -= 8;\n }\n}\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n * above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n * array bl_count contains the frequencies for each bit length.\n * The length opt_len is updated; static_len is also updated if stree is\n * not null.\n */\nfunction gen_bitlen(s, desc)\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n var tree = desc.dyn_tree;\n var max_code = desc.max_code;\n var stree = desc.stat_desc.static_tree;\n var has_stree = desc.stat_desc.has_stree;\n var extra = desc.stat_desc.extra_bits;\n var base = desc.stat_desc.extra_base;\n var max_length = desc.stat_desc.max_length;\n var h; /* heap index */\n var n, m; /* iterate over the tree elements */\n var bits; /* bit length */\n var xbits; /* extra bits */\n var f; /* frequency */\n var overflow = 0; /* number of elements with bit length too large */\n\n for (bits = 0; bits <= MAX_BITS; bits++) {\n s.bl_count[bits] = 0;\n }\n\n /* In a first pass, compute the optimal bit lengths (which may\n * overflow in the case of the bit length tree).\n */\n tree[s.heap[s.heap_max]*2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n for (h = s.heap_max+1; h < HEAP_SIZE; h++) {\n n = s.heap[h];\n bits = tree[tree[n*2 +1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n if (bits > max_length) {\n bits = max_length;\n overflow++;\n }\n tree[n*2 + 1]/*.Len*/ = bits;\n /* We overwrite tree[n].Dad which is no longer needed */\n\n if (n > max_code) { continue; } /* not a leaf node */\n\n s.bl_count[bits]++;\n xbits = 0;\n if (n >= base) {\n xbits = extra[n-base];\n }\n f = tree[n * 2]/*.Freq*/;\n s.opt_len += f * (bits + xbits);\n if (has_stree) {\n s.static_len += f * (stree[n*2 + 1]/*.Len*/ + xbits);\n }\n }\n if (overflow === 0) { return; }\n\n // Trace((stderr,\"\\nbit length overflow\\n\"));\n /* This happens for example on obj2 and pic of the Calgary corpus */\n\n /* Find the first bit length which could increase: */\n do {\n bits = max_length-1;\n while (s.bl_count[bits] === 0) { bits--; }\n s.bl_count[bits]--; /* move one leaf down the tree */\n s.bl_count[bits+1] += 2; /* move one overflow item as its brother */\n s.bl_count[max_length]--;\n /* The brother of the overflow item also moves one step up,\n * but this does not affect bl_count[max_length]\n */\n overflow -= 2;\n } while (overflow > 0);\n\n /* Now recompute all bit lengths, scanning in increasing frequency.\n * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n * lengths instead of fixing only the wrong ones. This idea is taken\n * from 'ar' written by Haruhiko Okumura.)\n */\n for (bits = max_length; bits !== 0; bits--) {\n n = s.bl_count[bits];\n while (n !== 0) {\n m = s.heap[--h];\n if (m > max_code) { continue; }\n if (tree[m*2 + 1]/*.Len*/ !== bits) {\n // Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n s.opt_len += (bits - tree[m*2 + 1]/*.Len*/)*tree[m*2]/*.Freq*/;\n tree[m*2 + 1]/*.Len*/ = bits;\n }\n n--;\n }\n }\n}\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n * zero code length.\n */\nfunction gen_codes(tree, max_code, bl_count)\n// ct_data *tree; /* the tree to decorate */\n// int max_code; /* largest code with non zero frequency */\n// ushf *bl_count; /* number of codes at each bit length */\n{\n var next_code = new Array(MAX_BITS+1); /* next code value for each bit length */\n var code = 0; /* running code value */\n var bits; /* bit index */\n var n; /* code index */\n\n /* The distribution counts are first used to generate the code values\n * without bit reversal.\n */\n for (bits = 1; bits <= MAX_BITS; bits++) {\n next_code[bits] = code = (code + bl_count[bits-1]) << 1;\n }\n /* Check that the bit counts in bl_count are consistent. The last code\n * must be all ones.\n */\n //Assert (code + bl_count[MAX_BITS]-1 == (1< length code (0..28) */\n length = 0;\n for (code = 0; code < LENGTH_CODES-1; code++) {\n base_length[code] = length;\n for (n = 0; n < (1< dist code (0..29) */\n dist = 0;\n for (code = 0 ; code < 16; code++) {\n base_dist[code] = dist;\n for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */\n for ( ; code < D_CODES; code++) {\n base_dist[code] = dist << 7;\n for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {\n _dist_code[256 + dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n /* Construct the codes of the static literal tree */\n for (bits = 0; bits <= MAX_BITS; bits++) {\n bl_count[bits] = 0;\n }\n\n n = 0;\n while (n <= 143) {\n static_ltree[n*2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n while (n <= 255) {\n static_ltree[n*2 + 1]/*.Len*/ = 9;\n n++;\n bl_count[9]++;\n }\n while (n <= 279) {\n static_ltree[n*2 + 1]/*.Len*/ = 7;\n n++;\n bl_count[7]++;\n }\n while (n <= 287) {\n static_ltree[n*2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n /* Codes 286 and 287 do not exist, but we must include them in the\n * tree construction to get a canonical Huffman tree (longest code\n * all ones)\n */\n gen_codes(static_ltree, L_CODES+1, bl_count);\n\n /* The static distance tree is trivial: */\n for (n = 0; n < D_CODES; n++) {\n static_dtree[n*2 + 1]/*.Len*/ = 5;\n static_dtree[n*2]/*.Code*/ = bi_reverse(n, 5);\n }\n\n // Now data ready and we can init static trees\n static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS);\n static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS);\n static_bl_desc =new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS);\n\n //static_init_done = true;\n}\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nfunction init_block(s) {\n var n; /* iterates over tree elements */\n\n /* Initialize the trees. */\n for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n*2]/*.Freq*/ = 0; }\n for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n*2]/*.Freq*/ = 0; }\n for (n = 0; n < BL_CODES; n++) { s.bl_tree[n*2]/*.Freq*/ = 0; }\n\n s.dyn_ltree[END_BLOCK*2]/*.Freq*/ = 1;\n s.opt_len = s.static_len = 0;\n s.last_lit = s.matches = 0;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nfunction bi_windup(s)\n{\n if (s.bi_valid > 8) {\n put_short(s, s.bi_buf);\n } else if (s.bi_valid > 0) {\n //put_byte(s, (Byte)s->bi_buf);\n s.pending_buf[s.pending++] = s.bi_buf;\n }\n s.bi_buf = 0;\n s.bi_valid = 0;\n}\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nfunction copy_block(s, buf, len, header)\n//DeflateState *s;\n//charf *buf; /* the input data */\n//unsigned len; /* its length */\n//int header; /* true if block header must be written */\n{\n bi_windup(s); /* align on byte boundary */\n\n if (header) {\n put_short(s, len);\n put_short(s, ~len);\n }\n// while (len--) {\n// put_byte(s, *buf++);\n// }\n utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);\n s.pending += len;\n}\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nfunction smaller(tree, n, m, depth) {\n var _n2 = n*2;\n var _m2 = m*2;\n return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n}\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nfunction pqdownheap(s, tree, k)\n// deflate_state *s;\n// ct_data *tree; /* the tree to restore */\n// int k; /* node to move down */\n{\n var v = s.heap[k];\n var j = k << 1; /* left son of k */\n while (j <= s.heap_len) {\n /* Set j to the smallest of the two sons: */\n if (j < s.heap_len &&\n smaller(tree, s.heap[j+1], s.heap[j], s.depth)) {\n j++;\n }\n /* Exit if v is smaller than both sons */\n if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n /* Exchange v with the smallest son */\n s.heap[k] = s.heap[j];\n k = j;\n\n /* And continue down the tree, setting j to the left son of k */\n j <<= 1;\n }\n s.heap[k] = v;\n}\n\n\n// inlined manually\n// var SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nfunction compress_block(s, ltree, dtree)\n// deflate_state *s;\n// const ct_data *ltree; /* literal tree */\n// const ct_data *dtree; /* distance tree */\n{\n var dist; /* distance of matched string */\n var lc; /* match length or unmatched char (if dist == 0) */\n var lx = 0; /* running index in l_buf */\n var code; /* the code to send */\n var extra; /* number of extra bits to send */\n\n if (s.last_lit !== 0) {\n do {\n dist = (s.pending_buf[s.d_buf + lx*2] << 8) | (s.pending_buf[s.d_buf + lx*2 + 1]);\n lc = s.pending_buf[s.l_buf + lx];\n lx++;\n\n if (dist === 0) {\n send_code(s, lc, ltree); /* send a literal byte */\n //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n } else {\n /* Here, lc is the match length - MIN_MATCH */\n code = _length_code[lc];\n send_code(s, code+LITERALS+1, ltree); /* send the length code */\n extra = extra_lbits[code];\n if (extra !== 0) {\n lc -= base_length[code];\n send_bits(s, lc, extra); /* send the extra length bits */\n }\n dist--; /* dist is now the match distance - 1 */\n code = d_code(dist);\n //Assert (code < D_CODES, \"bad d_code\");\n\n send_code(s, code, dtree); /* send the distance code */\n extra = extra_dbits[code];\n if (extra !== 0) {\n dist -= base_dist[code];\n send_bits(s, dist, extra); /* send the extra distance bits */\n }\n } /* literal or match pair ? */\n\n /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n // \"pendingBuf overflow\");\n\n } while (lx < s.last_lit);\n }\n\n send_code(s, END_BLOCK, ltree);\n}\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n * and corresponding code. The length opt_len is updated; static_len is\n * also updated if stree is not null. The field max_code is set.\n */\nfunction build_tree(s, desc)\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n var tree = desc.dyn_tree;\n var stree = desc.stat_desc.static_tree;\n var has_stree = desc.stat_desc.has_stree;\n var elems = desc.stat_desc.elems;\n var n, m; /* iterate over heap elements */\n var max_code = -1; /* largest code with non zero frequency */\n var node; /* new node being created */\n\n /* Construct the initial heap, with least frequent element in\n * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n * heap[0] is not used.\n */\n s.heap_len = 0;\n s.heap_max = HEAP_SIZE;\n\n for (n = 0; n < elems; n++) {\n if (tree[n * 2]/*.Freq*/ !== 0) {\n s.heap[++s.heap_len] = max_code = n;\n s.depth[n] = 0;\n\n } else {\n tree[n*2 + 1]/*.Len*/ = 0;\n }\n }\n\n /* The pkzip format requires that at least one distance code exists,\n * and that at least one bit should be sent even if there is only one\n * possible code. So to avoid special checks later on we force at least\n * two codes of non zero frequency.\n */\n while (s.heap_len < 2) {\n node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n tree[node * 2]/*.Freq*/ = 1;\n s.depth[node] = 0;\n s.opt_len--;\n\n if (has_stree) {\n s.static_len -= stree[node*2 + 1]/*.Len*/;\n }\n /* node is 0 or 1 so it does not have extra bits */\n }\n desc.max_code = max_code;\n\n /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n * establish sub-heaps of increasing lengths:\n */\n for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n /* Construct the Huffman tree by repeatedly combining the least two\n * frequent nodes.\n */\n node = elems; /* next internal node of the tree */\n do {\n //pqremove(s, tree, n); /* n = node of least frequency */\n /*** pqremove ***/\n n = s.heap[1/*SMALLEST*/];\n s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n pqdownheap(s, tree, 1/*SMALLEST*/);\n /***/\n\n m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n s.heap[--s.heap_max] = m;\n\n /* Create a new node father of n and m */\n tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n tree[n*2 + 1]/*.Dad*/ = tree[m*2 + 1]/*.Dad*/ = node;\n\n /* and insert the new node in the heap */\n s.heap[1/*SMALLEST*/] = node++;\n pqdownheap(s, tree, 1/*SMALLEST*/);\n\n } while (s.heap_len >= 2);\n\n s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n /* At this point, the fields freq and dad are set. We can now\n * generate the bit lengths.\n */\n gen_bitlen(s, desc);\n\n /* The field len is now set, we can generate the bit codes */\n gen_codes(tree, max_code, s.bl_count);\n}\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nfunction scan_tree(s, tree, max_code)\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n var n; /* iterates over all tree elements */\n var prevlen = -1; /* last emitted length */\n var curlen; /* length of current code */\n\n var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */\n\n var count = 0; /* repeat count of the current code */\n var max_count = 7; /* max repeat count */\n var min_count = 4; /* min repeat count */\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n tree[(max_code+1)*2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n+1)*2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n } else if (curlen !== 0) {\n\n if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n s.bl_tree[REP_3_6*2]/*.Freq*/++;\n\n } else if (count <= 10) {\n s.bl_tree[REPZ_3_10*2]/*.Freq*/++;\n\n } else {\n s.bl_tree[REPZ_11_138*2]/*.Freq*/++;\n }\n\n count = 0;\n prevlen = curlen;\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n}\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nfunction send_tree(s, tree, max_code)\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n var n; /* iterates over all tree elements */\n var prevlen = -1; /* last emitted length */\n var curlen; /* length of current code */\n\n var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */\n\n var count = 0; /* repeat count of the current code */\n var max_count = 7; /* max repeat count */\n var min_count = 4; /* min repeat count */\n\n /* tree[max_code+1].Len = -1; */ /* guard already set */\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n+1)*2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n } else if (curlen !== 0) {\n if (curlen !== prevlen) {\n send_code(s, curlen, s.bl_tree);\n count--;\n }\n //Assert(count >= 3 && count <= 6, \" 3_6?\");\n send_code(s, REP_3_6, s.bl_tree);\n send_bits(s, count-3, 2);\n\n } else if (count <= 10) {\n send_code(s, REPZ_3_10, s.bl_tree);\n send_bits(s, count-3, 3);\n\n } else {\n send_code(s, REPZ_11_138, s.bl_tree);\n send_bits(s, count-11, 7);\n }\n\n count = 0;\n prevlen = curlen;\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n}\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nfunction build_bl_tree(s) {\n var max_blindex; /* index of last bit length code of non zero freq */\n\n /* Determine the bit length frequencies for literal and distance trees */\n scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n /* Build the bit length tree: */\n build_tree(s, s.bl_desc);\n /* opt_len now includes the length of the tree representations, except\n * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n */\n\n /* Determine the number of bit length codes to send. The pkzip format\n * requires that at least 4 bit length codes be sent. (appnote.txt says\n * 3 but the actual value used is 4.)\n */\n for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {\n if (s.bl_tree[bl_order[max_blindex]*2 + 1]/*.Len*/ !== 0) {\n break;\n }\n }\n /* Update opt_len to include the bit length tree and counts */\n s.opt_len += 3*(max_blindex+1) + 5+5+4;\n //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n // s->opt_len, s->static_len));\n\n return max_blindex;\n}\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nfunction send_all_trees(s, lcodes, dcodes, blcodes)\n// deflate_state *s;\n// int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n var rank; /* index in bl_order */\n\n //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n // \"too many codes\");\n //Tracev((stderr, \"\\nbl counts: \"));\n send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */\n send_bits(s, dcodes-1, 5);\n send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */\n for (rank = 0; rank < blcodes; rank++) {\n //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n send_bits(s, s.bl_tree[bl_order[rank]*2 + 1]/*.Len*/, 3);\n }\n //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_ltree, lcodes-1); /* literal tree */\n //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_dtree, dcodes-1); /* distance tree */\n //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n}\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n * a) There are no non-portable control characters belonging to the\n * \"black list\" (0..6, 14..25, 28..31).\n * b) There is at least one printable character belonging to the\n * \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n * \"gray list\" that is ignored in this detection algorithm:\n * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nfunction detect_data_type(s) {\n /* black_mask is the bit mask of black-listed bytes\n * set bits 0..6, 14..25, and 28..31\n * 0xf3ffc07f = binary 11110011111111111100000001111111\n */\n var black_mask = 0xf3ffc07f;\n var n;\n\n /* Check for non-textual (\"black-listed\") bytes. */\n for (n = 0; n <= 31; n++, black_mask >>>= 1) {\n if ((black_mask & 1) && (s.dyn_ltree[n*2]/*.Freq*/ !== 0)) {\n return Z_BINARY;\n }\n }\n\n /* Check for textual (\"white-listed\") bytes. */\n if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n for (n = 32; n < LITERALS; n++) {\n if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n }\n\n /* There are no \"black-listed\" or \"white-listed\" bytes:\n * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n */\n return Z_BINARY;\n}\n\n\nvar static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nfunction _tr_init(s)\n{\n\n if (!static_init_done) {\n tr_static_init();\n static_init_done = true;\n }\n\n s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);\n s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);\n s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n /* Initialize the first block of the first file: */\n init_block(s);\n}\n\n\n/* ===========================================================================\n * Send a stored block\n */\nfunction _tr_stored_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf; /* input block */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n send_bits(s, (STORED_BLOCK<<1)+(last ? 1 : 0), 3); /* send block type */\n copy_block(s, buf, stored_len, true); /* with header */\n}\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nfunction _tr_align(s) {\n send_bits(s, STATIC_TREES<<1, 3);\n send_code(s, END_BLOCK, static_ltree);\n bi_flush(s);\n}\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nfunction _tr_flush_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf; /* input block, or NULL if too old */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n var opt_lenb, static_lenb; /* opt_len and static_len in bytes */\n var max_blindex = 0; /* index of last bit length code of non zero freq */\n\n /* Build the Huffman trees unless a stored block is forced */\n if (s.level > 0) {\n\n /* Check if the file is binary or text */\n if (s.strm.data_type === Z_UNKNOWN) {\n s.strm.data_type = detect_data_type(s);\n }\n\n /* Construct the literal and distance trees */\n build_tree(s, s.l_desc);\n // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n\n build_tree(s, s.d_desc);\n // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n /* At this point, opt_len and static_len are the total bit lengths of\n * the compressed block data, excluding the tree representations.\n */\n\n /* Build the bit length tree for the above two trees, and get the index\n * in bl_order of the last bit length code to send.\n */\n max_blindex = build_bl_tree(s);\n\n /* Determine the best encoding. Compute the block lengths in bytes. */\n opt_lenb = (s.opt_len+3+7) >>> 3;\n static_lenb = (s.static_len+3+7) >>> 3;\n\n // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n // s->last_lit));\n\n if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n } else {\n // Assert(buf != (char*)0, \"lost buf\");\n opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n }\n\n if ((stored_len+4 <= opt_lenb) && (buf !== -1)) {\n /* 4: two words for the lengths */\n\n /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n * Otherwise we can't have processed more than WSIZE input bytes since\n * the last block flush, because compression would have been\n * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n * transform a block into a stored block.\n */\n _tr_stored_block(s, buf, stored_len, last);\n\n } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {\n\n send_bits(s, (STATIC_TREES<<1) + (last ? 1 : 0), 3);\n compress_block(s, static_ltree, static_dtree);\n\n } else {\n send_bits(s, (DYN_TREES<<1) + (last ? 1 : 0), 3);\n send_all_trees(s, s.l_desc.max_code+1, s.d_desc.max_code+1, max_blindex+1);\n compress_block(s, s.dyn_ltree, s.dyn_dtree);\n }\n // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n /* The above check is made mod 2^32, for files larger than 512 MB\n * and uLong implemented on 32 bits.\n */\n init_block(s);\n\n if (last) {\n bi_windup(s);\n }\n // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n // s->compressed_len-7*last));\n}\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nfunction _tr_tally(s, dist, lc)\n// deflate_state *s;\n// unsigned dist; /* distance of matched string */\n// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n //var out_length, in_length, dcode;\n\n s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff;\n s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;\n\n s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;\n s.last_lit++;\n\n if (dist === 0) {\n /* lc is the unmatched char */\n s.dyn_ltree[lc*2]/*.Freq*/++;\n } else {\n s.matches++;\n /* Here, lc is the match length - MIN_MATCH */\n dist--; /* dist = match distance - 1 */\n //Assert((ush)dist < (ush)MAX_DIST(s) &&\n // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n // (ush)d_code(dist) < (ush)D_CODES, \"_tr_tally: bad match\");\n\n s.dyn_ltree[(_length_code[lc]+LITERALS+1) * 2]/*.Freq*/++;\n s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n }\n\n// (!) This block is disabled in zlib defailts,\n// don't enable it for binary compatibility\n\n//#ifdef TRUNCATE_BLOCK\n// /* Try to guess if it is profitable to stop the current block here */\n// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {\n// /* Compute an upper bound for the compressed length */\n// out_length = s.last_lit*8;\n// in_length = s.strstart - s.block_start;\n//\n// for (dcode = 0; dcode < D_CODES; dcode++) {\n// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);\n// }\n// out_length >>>= 3;\n// //Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n// // s->last_lit, in_length, out_length,\n// // 100L - out_length*100L/in_length));\n// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {\n// return true;\n// }\n// }\n//#endif\n\n return (s.last_lit === s.lit_bufsize-1);\n /* We avoid equality with lit_bufsize because of wraparound at 64K\n * on 16 bit machines and because stored blocks are restricted to\n * 64K-1 bytes.\n */\n}\n\nexports._tr_init = _tr_init;\nexports._tr_stored_block = _tr_stored_block;\nexports._tr_flush_block = _tr_flush_block;\nexports._tr_tally = _tr_tally;\nexports._tr_align = _tr_align;\n},{\"../utils/common\":27}],39:[function(_dereq_,module,exports){\n'use strict';\n\n\nfunction ZStream() {\n /* next input byte */\n this.input = null; // JS specific, because we have no pointers\n this.next_in = 0;\n /* number of bytes available at input */\n this.avail_in = 0;\n /* total number of input bytes read so far */\n this.total_in = 0;\n /* next output byte should be put there */\n this.output = null; // JS specific, because we have no pointers\n this.next_out = 0;\n /* remaining free space at output */\n this.avail_out = 0;\n /* total number of bytes output so far */\n this.total_out = 0;\n /* last error message, NULL if no error */\n this.msg = ''/*Z_NULL*/;\n /* not visible by applications */\n this.state = null;\n /* best guess about the data type: binary or text */\n this.data_type = 2/*Z_UNKNOWN*/;\n /* adler32 value of the uncompressed data */\n this.adler = 0;\n}\n\nmodule.exports = ZStream;\n},{}]},{},[9])\n(9)\n}));\n","/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*exported XLSX */\n/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */\nvar XLSX = {};\nfunction make_xlsx_lib(XLSX){\nXLSX.version = '0.17.5';\nvar current_codepage = 1200, current_ansi = 1252;\n/*global cptable:true, window */\nif(typeof module !== \"undefined\" && typeof require !== 'undefined') {\n\tif(typeof cptable === 'undefined') {\n\t\tif(typeof global !== 'undefined') global.cptable = require('./dist/cpexcel.js');\n\t\telse if(typeof window !== 'undefined') window.cptable = require('./dist/cpexcel.js');\n\t}\n}\n\nvar VALID_ANSI = [ 874, 932, 936, 949, 950 ];\nfor(var i = 0; i <= 8; ++i) VALID_ANSI.push(1250 + i);\n/* ECMA-376 Part I 18.4.1 charset to codepage mapping */\nvar CS2CP = ({\n0: 1252, /* ANSI */\n1: 65001, /* DEFAULT */\n2: 65001, /* SYMBOL */\n77: 10000, /* MAC */\n128: 932, /* SHIFTJIS */\n129: 949, /* HANGUL */\n130: 1361, /* JOHAB */\n134: 936, /* GB2312 */\n136: 950, /* CHINESEBIG5 */\n161: 1253, /* GREEK */\n162: 1254, /* TURKISH */\n163: 1258, /* VIETNAMESE */\n177: 1255, /* HEBREW */\n178: 1256, /* ARABIC */\n186: 1257, /* BALTIC */\n204: 1251, /* RUSSIAN */\n222: 874, /* THAI */\n238: 1250, /* EASTEUROPE */\n255: 1252, /* OEM */\n69: 6969 /* MISC */\n});\n\nvar set_ansi = function(cp) { if(VALID_ANSI.indexOf(cp) == -1) return; current_ansi = CS2CP[0] = cp; };\nfunction reset_ansi() { set_ansi(1252); }\n\nvar set_cp = function(cp) { current_codepage = cp; set_ansi(cp); };\nfunction reset_cp() { set_cp(1200); reset_ansi(); }\n\nfunction char_codes(data) { var o = []; for(var i = 0, len = data.length; i < len; ++i) o[i] = data.charCodeAt(i); return o; }\n\nfunction utf16leread(data) {\n\tvar o = [];\n\tfor(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data.charCodeAt(2*i) + (data.charCodeAt(2*i+1)<<8));\n\treturn o.join(\"\");\n}\nfunction utf16beread(data) {\n\tvar o = [];\n\tfor(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data.charCodeAt(2*i+1) + (data.charCodeAt(2*i)<<8));\n\treturn o.join(\"\");\n}\n\nvar debom = function(data) {\n\tvar c1 = data.charCodeAt(0), c2 = data.charCodeAt(1);\n\tif(c1 == 0xFF && c2 == 0xFE) return utf16leread(data.slice(2));\n\tif(c1 == 0xFE && c2 == 0xFF) return utf16beread(data.slice(2));\n\tif(c1 == 0xFEFF) return data.slice(1);\n\treturn data;\n};\n\nvar _getchar = function _gc1(x) { return String.fromCharCode(x); };\nvar _getansi = function _ga1(x) { return String.fromCharCode(x); };\nif(typeof cptable !== 'undefined') {\n\tset_cp = function(cp) { current_codepage = cp; set_ansi(cp); };\n\tdebom = function(data) {\n\t\tif(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return cptable.utils.decode(1200, char_codes(data.slice(2))); }\n\t\treturn data;\n\t};\n\t_getchar = function _gc2(x) {\n\t\tif(current_codepage === 1200) return String.fromCharCode(x);\n\t\treturn cptable.utils.decode(current_codepage, [x&255,x>>8])[0];\n\t};\n\t_getansi = function _ga2(x) {\n\t\treturn cptable.utils.decode(current_ansi, [x])[0];\n\t};\n}\nvar DENSE = null;\nvar DIF_XL = true;\nvar Base64 = (function make_b64(){\n\tvar map = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\treturn {\n\t\tencode: function(input) {\n\t\t\tvar o = \"\";\n\t\t\tvar c1=0, c2=0, c3=0, e1=0, e2=0, e3=0, e4=0;\n\t\t\tfor(var i = 0; i < input.length; ) {\n\t\t\t\tc1 = input.charCodeAt(i++);\n\t\t\t\te1 = (c1 >> 2);\n\n\t\t\t\tc2 = input.charCodeAt(i++);\n\t\t\t\te2 = ((c1 & 3) << 4) | (c2 >> 4);\n\n\t\t\t\tc3 = input.charCodeAt(i++);\n\t\t\t\te3 = ((c2 & 15) << 2) | (c3 >> 6);\n\t\t\t\te4 = (c3 & 63);\n\t\t\t\tif (isNaN(c2)) { e3 = e4 = 64; }\n\t\t\t\telse if (isNaN(c3)) { e4 = 64; }\n\t\t\t\to += map.charAt(e1) + map.charAt(e2) + map.charAt(e3) + map.charAt(e4);\n\t\t\t}\n\t\t\treturn o;\n\t\t},\n\t\tdecode: function b64_decode(input) {\n\t\t\tvar o = \"\";\n\t\t\tvar c1=0, c2=0, c3=0, e1=0, e2=0, e3=0, e4=0;\n\t\t\tinput = input.replace(/[^\\w\\+\\/\\=]/g, \"\");\n\t\t\tfor(var i = 0; i < input.length;) {\n\t\t\t\te1 = map.indexOf(input.charAt(i++));\n\t\t\t\te2 = map.indexOf(input.charAt(i++));\n\t\t\t\tc1 = (e1 << 2) | (e2 >> 4);\n\t\t\t\to += String.fromCharCode(c1);\n\n\t\t\t\te3 = map.indexOf(input.charAt(i++));\n\t\t\t\tc2 = ((e2 & 15) << 4) | (e3 >> 2);\n\t\t\t\tif (e3 !== 64) { o += String.fromCharCode(c2); }\n\n\t\t\t\te4 = map.indexOf(input.charAt(i++));\n\t\t\t\tc3 = ((e3 & 3) << 6) | e4;\n\t\t\t\tif (e4 !== 64) { o += String.fromCharCode(c3); }\n\t\t\t}\n\t\t\treturn o;\n\t\t}\n\t};\n})();\nvar has_buf = (typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && !!process.versions.node);\n\nvar Buffer_from = function(){};\n\nif(typeof Buffer !== 'undefined') {\n\tvar nbfs = !Buffer.from;\n\tif(!nbfs) try { Buffer.from(\"foo\", \"utf8\"); } catch(e) { nbfs = true; }\n\tBuffer_from = nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);\n\t// $FlowIgnore\n\tif(!Buffer.alloc) Buffer.alloc = function(n) { return new Buffer(n); };\n\t// $FlowIgnore\n\tif(!Buffer.allocUnsafe) Buffer.allocUnsafe = function(n) { return new Buffer(n); };\n}\n\nfunction new_raw_buf(len) {\n\t/* jshint -W056 */\n\treturn has_buf ? Buffer.alloc(len) : new Array(len);\n\t/* jshint +W056 */\n}\n\nfunction new_unsafe_buf(len) {\n\t/* jshint -W056 */\n\treturn has_buf ? Buffer.allocUnsafe(len) : new Array(len);\n\t/* jshint +W056 */\n}\n\nvar s2a = function s2a(s) {\n\tif(has_buf) return Buffer_from(s, \"binary\");\n\treturn s.split(\"\").map(function(x){ return x.charCodeAt(0) & 0xff; });\n};\n\nfunction s2ab(s) {\n\tif(typeof ArrayBuffer === 'undefined') return s2a(s);\n\tvar buf = new ArrayBuffer(s.length), view = new Uint8Array(buf);\n\tfor (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;\n\treturn buf;\n}\n\nfunction a2s(data) {\n\tif(Array.isArray(data)) return data.map(function(c) { return String.fromCharCode(c); }).join(\"\");\n\tvar o = []; for(var i = 0; i < data.length; ++i) o[i] = String.fromCharCode(data[i]); return o.join(\"\");\n}\n\nfunction a2u(data) {\n\tif(typeof Uint8Array === 'undefined') throw new Error(\"Unsupported\");\n\treturn new Uint8Array(data);\n}\n\nfunction ab2a(data) {\n\tif(typeof ArrayBuffer == 'undefined') throw new Error(\"Unsupported\");\n\tif(data instanceof ArrayBuffer) return ab2a(new Uint8Array(data));\nvar o = new Array(data.length);\n\tfor(var i = 0; i < data.length; ++i) o[i] = data[i];\n\treturn o;\n}\n\nvar bconcat = function(bufs) { return [].concat.apply([], bufs); };\n\nvar chr0 = /\\u0000/g, chr1 = /[\\u0001-\\u0006]/g;\n/* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/*jshint -W041 */\nvar SSF = ({});\nvar make_ssf = function make_ssf(SSF){\nSSF.version = '0.11.2';\nfunction _strrev(x) { var o = \"\", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; }\nfunction fill(c,l) { var o = \"\"; while(o.length < l) o+=c; return o; }\nfunction pad0(v,d){var t=\"\"+v; return t.length>=d?t:fill('0',d-t.length)+t;}\nfunction pad_(v,d){var t=\"\"+v;return t.length>=d?t:fill(' ',d-t.length)+t;}\nfunction rpad_(v,d){var t=\"\"+v; return t.length>=d?t:t+fill(' ',d-t.length);}\nfunction pad0r1(v,d){var t=\"\"+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;}\nfunction pad0r2(v,d){var t=\"\"+v; return t.length>=d?t:fill('0',d-t.length)+t;}\nvar p2_32 = Math.pow(2,32);\nfunction pad0r(v,d){if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); }\nfunction isgeneral(s, i) { i = i || 0; return s.length >= 7 + i && (s.charCodeAt(i)|32) === 103 && (s.charCodeAt(i+1)|32) === 101 && (s.charCodeAt(i+2)|32) === 110 && (s.charCodeAt(i+3)|32) === 101 && (s.charCodeAt(i+4)|32) === 114 && (s.charCodeAt(i+5)|32) === 97 && (s.charCodeAt(i+6)|32) === 108; }\nvar days = [\n\t['Sun', 'Sunday'],\n\t['Mon', 'Monday'],\n\t['Tue', 'Tuesday'],\n\t['Wed', 'Wednesday'],\n\t['Thu', 'Thursday'],\n\t['Fri', 'Friday'],\n\t['Sat', 'Saturday']\n];\nvar months = [\n\t['J', 'Jan', 'January'],\n\t['F', 'Feb', 'February'],\n\t['M', 'Mar', 'March'],\n\t['A', 'Apr', 'April'],\n\t['M', 'May', 'May'],\n\t['J', 'Jun', 'June'],\n\t['J', 'Jul', 'July'],\n\t['A', 'Aug', 'August'],\n\t['S', 'Sep', 'September'],\n\t['O', 'Oct', 'October'],\n\t['N', 'Nov', 'November'],\n\t['D', 'Dec', 'December']\n];\nfunction init_table(t) {\n\tt[0]= 'General';\n\tt[1]= '0';\n\tt[2]= '0.00';\n\tt[3]= '#,##0';\n\tt[4]= '#,##0.00';\n\tt[9]= '0%';\n\tt[10]= '0.00%';\n\tt[11]= '0.00E+00';\n\tt[12]= '# ?/?';\n\tt[13]= '# ??/??';\n\tt[14]= 'm/d/yy';\n\tt[15]= 'd-mmm-yy';\n\tt[16]= 'd-mmm';\n\tt[17]= 'mmm-yy';\n\tt[18]= 'h:mm AM/PM';\n\tt[19]= 'h:mm:ss AM/PM';\n\tt[20]= 'h:mm';\n\tt[21]= 'h:mm:ss';\n\tt[22]= 'm/d/yy h:mm';\n\tt[37]= '#,##0 ;(#,##0)';\n\tt[38]= '#,##0 ;[Red](#,##0)';\n\tt[39]= '#,##0.00;(#,##0.00)';\n\tt[40]= '#,##0.00;[Red](#,##0.00)';\n\tt[45]= 'mm:ss';\n\tt[46]= '[h]:mm:ss';\n\tt[47]= 'mmss.0';\n\tt[48]= '##0.0E+0';\n\tt[49]= '@';\n\tt[56]= '\"上午/下午 \"hh\"時\"mm\"分\"ss\"秒 \"';\n}\n\nvar table_fmt = {};\ninit_table(table_fmt);\n/* Defaults determined by systematically testing in Excel 2019 */\n\n/* These formats appear to default to other formats in the table */\nvar default_map = [];\nvar defi = 0;\n\n// 5 -> 37 ... 8 -> 40\nfor(defi = 5; defi <= 8; ++defi) default_map[defi] = 32 + defi;\n\n// 23 -> 0 ... 26 -> 0\nfor(defi = 23; defi <= 26; ++defi) default_map[defi] = 0;\n\n// 27 -> 14 ... 31 -> 14\nfor(defi = 27; defi <= 31; ++defi) default_map[defi] = 14;\n// 50 -> 14 ... 58 -> 14\nfor(defi = 50; defi <= 58; ++defi) default_map[defi] = 14;\n\n// 59 -> 1 ... 62 -> 4\nfor(defi = 59; defi <= 62; ++defi) default_map[defi] = defi - 58;\n// 67 -> 9 ... 68 -> 10\nfor(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 58;\n// 72 -> 14 ... 75 -> 17\nfor(defi = 72; defi <= 75; ++defi) default_map[defi] = defi - 58;\n\n// 69 -> 12 ... 71 -> 14\nfor(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 57;\n\n// 76 -> 20 ... 78 -> 22\nfor(defi = 76; defi <= 78; ++defi) default_map[defi] = defi - 56;\n\n// 79 -> 45 ... 81 -> 47\nfor(defi = 79; defi <= 81; ++defi) default_map[defi] = defi - 34;\n\n// 82 -> 0 ... 65536 -> 0 (omitted)\n\n/* These formats technically refer to Accounting formats with no equivalent */\nvar default_str = [];\n\n// 5 -- Currency, 0 decimal, black negative\ndefault_str[5] = default_str[63] = '\"$\"#,##0_);\\\\(\"$\"#,##0\\\\)';\n// 6 -- Currency, 0 decimal, red negative\ndefault_str[6] = default_str[64] = '\"$\"#,##0_);[Red]\\\\(\"$\"#,##0\\\\)';\n// 7 -- Currency, 2 decimal, black negative\ndefault_str[7] = default_str[65] = '\"$\"#,##0.00_);\\\\(\"$\"#,##0.00\\\\)';\n// 8 -- Currency, 2 decimal, red negative\ndefault_str[8] = default_str[66] = '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)';\n\n// 41 -- Accounting, 0 decimal, No Symbol\ndefault_str[41] = '_(* #,##0_);_(* \\\\(#,##0\\\\);_(* \"-\"_);_(@_)';\n// 42 -- Accounting, 0 decimal, $ Symbol\ndefault_str[42] = '_(\"$\"* #,##0_);_(\"$\"* \\\\(#,##0\\\\);_(\"$\"* \"-\"_);_(@_)';\n// 43 -- Accounting, 2 decimal, No Symbol\ndefault_str[43] = '_(* #,##0.00_);_(* \\\\(#,##0.00\\\\);_(* \"-\"??_);_(@_)';\n// 44 -- Accounting, 2 decimal, $ Symbol\ndefault_str[44] = '_(\"$\"* #,##0.00_);_(\"$\"* \\\\(#,##0.00\\\\);_(\"$\"* \"-\"??_);_(@_)';\nfunction frac(x, D, mixed) {\n\tvar sgn = x < 0 ? -1 : 1;\n\tvar B = x * sgn;\n\tvar P_2 = 0, P_1 = 1, P = 0;\n\tvar Q_2 = 1, Q_1 = 0, Q = 0;\n\tvar A = Math.floor(B);\n\twhile(Q_1 < D) {\n\t\tA = Math.floor(B);\n\t\tP = A * P_1 + P_2;\n\t\tQ = A * Q_1 + Q_2;\n\t\tif((B - A) < 0.00000005) break;\n\t\tB = 1 / (B - A);\n\t\tP_2 = P_1; P_1 = P;\n\t\tQ_2 = Q_1; Q_1 = Q;\n\t}\n\tif(Q > D) { if(Q_1 > D) { Q = Q_2; P = P_2; } else { Q = Q_1; P = P_1; } }\n\tif(!mixed) return [0, sgn * P, Q];\n\tvar q = Math.floor(sgn * P/Q);\n\treturn [q, sgn*P - q*Q, Q];\n}\nfunction parse_date_code(v,opts,b2) {\n\tif(v > 2958465 || v < 0) return null;\n\tvar date = (v|0), time = Math.floor(86400 * (v - date)), dow=0;\n\tvar dout=[];\n\tvar out={D:date, T:time, u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0};\n\tif(Math.abs(out.u) < 1e-6) out.u = 0;\n\tif(opts && opts.date1904) date += 1462;\n\tif(out.u > 0.9999) {\n\t\tout.u = 0;\n\t\tif(++time == 86400) { out.T = time = 0; ++date; ++out.D; }\n\t}\n\tif(date === 60) {dout = b2 ? [1317,10,29] : [1900,2,29]; dow=3;}\n\telse if(date === 0) {dout = b2 ? [1317,8,29] : [1900,1,0]; dow=6;}\n\telse {\n\t\tif(date > 60) --date;\n\t\t/* 1 = Jan 1 1900 in Gregorian */\n\t\tvar d = new Date(1900, 0, 1);\n\t\td.setDate(d.getDate() + date - 1);\n\t\tdout = [d.getFullYear(), d.getMonth()+1,d.getDate()];\n\t\tdow = d.getDay();\n\t\tif(date < 60) dow = (dow + 6) % 7;\n\t\tif(b2) dow = fix_hijri(d, dout);\n\t}\n\tout.y = dout[0]; out.m = dout[1]; out.d = dout[2];\n\tout.S = time % 60; time = Math.floor(time / 60);\n\tout.M = time % 60; time = Math.floor(time / 60);\n\tout.H = time;\n\tout.q = dow;\n\treturn out;\n}\nSSF.parse_date_code = parse_date_code;\nvar basedate = new Date(1899, 11, 31, 0, 0, 0);\nvar dnthresh = basedate.getTime();\nvar base1904 = new Date(1900, 2, 1, 0, 0, 0);\nfunction datenum_local(v, date1904) {\n\tvar epoch = v.getTime();\n\tif(date1904) epoch -= 1461*24*60*60*1000;\n\telse if(v >= base1904) epoch += 24*60*60*1000;\n\treturn (epoch - (dnthresh + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000);\n}\n/* The longest 32-bit integer text is \"-4294967296\", exactly 11 chars */\nfunction general_fmt_int(v) { return v.toString(10); }\nSSF._general_int = general_fmt_int;\n\n/* ECMA-376 18.8.30 numFmt*/\n/* Note: `toPrecision` uses standard form when prec > E and E >= -6 */\nvar general_fmt_num = (function make_general_fmt_num() {\n\tvar trailing_zeroes_and_decimal = /(?:\\.0*|(\\.\\d*[1-9])0+)$/;\n\tfunction strip_decimal(o) {\n\t\treturn (o.indexOf(\".\") == -1) ? o : o.replace(trailing_zeroes_and_decimal, \"$1\");\n\t}\n\n\t/* General Exponential always shows 2 digits exp and trims the mantissa */\n\tvar mantissa_zeroes_and_decimal = /(?:\\.0*|(\\.\\d*[1-9])0+)[Ee]/;\n\tvar exp_with_single_digit = /(E[+-])(\\d)$/;\n\tfunction normalize_exp(o) {\n\t\tif(o.indexOf(\"E\") == -1) return o;\n\t\treturn o.replace(mantissa_zeroes_and_decimal,\"$1E\").replace(exp_with_single_digit,\"$10$2\");\n\t}\n\n\t/* exponent >= -9 and <= 9 */\n\tfunction small_exp(v) {\n\t\tvar w = (v<0?12:11);\n\t\tvar o = strip_decimal(v.toFixed(12)); if(o.length <= w) return o;\n\t\to = v.toPrecision(10); if(o.length <= w) return o;\n\t\treturn v.toExponential(5);\n\t}\n\n\t/* exponent >= 11 or <= -10 likely exponential */\n\tfunction large_exp(v) {\n\t\tvar o = strip_decimal(v.toFixed(11));\n\t\treturn (o.length > (v<0?12:11) || o === \"0\" || o === \"-0\") ? v.toPrecision(6) : o;\n\t}\n\n\tfunction general_fmt_num_base(v) {\n\t\tvar V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o;\n\n\t\tif(V >= -4 && V <= -1) o = v.toPrecision(10+V);\n\t\telse if(Math.abs(V) <= 9) o = small_exp(v);\n\t\telse if(V === 10) o = v.toFixed(10).substr(0,12);\n\t\telse o = large_exp(v);\n\n\t\treturn strip_decimal(normalize_exp(o.toUpperCase()));\n\t}\n\n\treturn general_fmt_num_base;\n})();\nSSF._general_num = general_fmt_num;\n\n/*\n\t\"General\" rules:\n\t- text is passed through (\"@\")\n\t- booleans are rendered as TRUE/FALSE\n\t- \"up to 11 characters\" displayed for numbers\n\t- Default date format (code 14) used for Dates\n\n\tTODO: technically the display depends on the width of the cell\n*/\nfunction general_fmt(v, opts) {\n\tswitch(typeof v) {\n\t\tcase 'string': return v;\n\t\tcase 'boolean': return v ? \"TRUE\" : \"FALSE\";\n\t\tcase 'number': return (v|0) === v ? v.toString(10) : general_fmt_num(v);\n\t\tcase 'undefined': return \"\";\n\t\tcase 'object':\n\t\t\tif(v == null) return \"\";\n\t\t\tif(v instanceof Date) return format(14, datenum_local(v, opts && opts.date1904), opts);\n\t}\n\tthrow new Error(\"unsupported value in General format: \" + v);\n}\nSSF._general = general_fmt;\nfunction fix_hijri(date, o) {\n /* TODO: properly adjust y/m/d and */\n o[0] -= 581;\n var dow = date.getDay();\n if(date < 60) dow = (dow + 6) % 7;\n return dow;\n}\n//var THAI_DIGITS = \"\\u0E50\\u0E51\\u0E52\\u0E53\\u0E54\\u0E55\\u0E56\\u0E57\\u0E58\\u0E59\".split(\"\");\n/*jshint -W086 */\nfunction write_date(type, fmt, val, ss0) {\n\tvar o=\"\", ss=0, tt=0, y = val.y, out, outl = 0;\n\tswitch(type) {\n\t\tcase 98: /* 'b' buddhist year */\n\t\t\ty = val.y + 543;\n\t\t\t/* falls through */\n\t\tcase 121: /* 'y' year */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = y % 100; outl = 2; break;\n\t\t\tdefault: out = y % 10000; outl = 4; break;\n\t\t} break;\n\t\tcase 109: /* 'm' month */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.m; outl = fmt.length; break;\n\t\t\tcase 3: return months[val.m-1][1];\n\t\t\tcase 5: return months[val.m-1][0];\n\t\t\tdefault: return months[val.m-1][2];\n\t\t} break;\n\t\tcase 100: /* 'd' day */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.d; outl = fmt.length; break;\n\t\t\tcase 3: return days[val.q][0];\n\t\t\tdefault: return days[val.q][1];\n\t\t} break;\n\t\tcase 104: /* 'h' 12-hour */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break;\n\t\t\tdefault: throw 'bad hour format: ' + fmt;\n\t\t} break;\n\t\tcase 72: /* 'H' 24-hour */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.H; outl = fmt.length; break;\n\t\t\tdefault: throw 'bad hour format: ' + fmt;\n\t\t} break;\n\t\tcase 77: /* 'M' minutes */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.M; outl = fmt.length; break;\n\t\t\tdefault: throw 'bad minute format: ' + fmt;\n\t\t} break;\n\t\tcase 115: /* 's' seconds */\n\t\t\tif(fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000') throw 'bad second format: ' + fmt;\n\t\t\tif(val.u === 0 && (fmt == \"s\" || fmt == \"ss\")) return pad0(val.S, fmt.length);\nif(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100;\n\t\t\telse tt = ss0 === 1 ? 10 : 1;\n\t\t\tss = Math.round((tt)*(val.S + val.u));\n\t\t\tif(ss >= 60*tt) ss = 0;\n\t\t\tif(fmt === 's') return ss === 0 ? \"0\" : \"\"+ss/tt;\n\t\t\to = pad0(ss,2 + ss0);\n\t\t\tif(fmt === 'ss') return o.substr(0,2);\n\t\t\treturn \".\" + o.substr(2,fmt.length-1);\n\t\tcase 90: /* 'Z' absolute time */\n\t\tswitch(fmt) {\n\t\t\tcase '[h]': case '[hh]': out = val.D*24+val.H; break;\n\t\t\tcase '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break;\n\t\t\tcase '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u); break;\n\t\t\tdefault: throw 'bad abstime format: ' + fmt;\n\t\t} outl = fmt.length === 3 ? 1 : 2; break;\n\t\tcase 101: /* 'e' era */\n\t\t\tout = y; outl = 1; break;\n\t}\n\tvar outstr = outl > 0 ? pad0(out, outl) : \"\";\n\treturn outstr;\n}\n/*jshint +W086 */\nfunction commaify(s) {\n\tvar w = 3;\n\tif(s.length <= w) return s;\n\tvar j = (s.length % w), o = s.substr(0,j);\n\tfor(; j!=s.length; j+=w) o+=(o.length > 0 ? \",\" : \"\") + s.substr(j,w);\n\treturn o;\n}\nvar write_num = (function make_write_num(){\nvar pct1 = /%/g;\nfunction write_num_pct(type, fmt, val){\n\tvar sfmt = fmt.replace(pct1,\"\"), mul = fmt.length - sfmt.length;\n\treturn write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill(\"%\",mul);\n}\nfunction write_num_cm(type, fmt, val){\n\tvar idx = fmt.length - 1;\n\twhile(fmt.charCodeAt(idx-1) === 44) --idx;\n\treturn write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));\n}\nfunction write_num_exp(fmt, val){\n\tvar o;\n\tvar idx = fmt.indexOf(\"E\") - fmt.indexOf(\".\") - 1;\n\tif(fmt.match(/^#+0.0E\\+0$/)) {\n\t\tif(val == 0) return \"0.0E+0\";\n\t\telse if(val < 0) return \"-\" + write_num_exp(fmt, -val);\n\t\tvar period = fmt.indexOf(\".\"); if(period === -1) period=fmt.indexOf('E');\n\t\tvar ee = Math.floor(Math.log(val)*Math.LOG10E)%period;\n\t\tif(ee < 0) ee += period;\n\t\to = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);\n\t\tif(o.indexOf(\"e\") === -1) {\n\t\t\tvar fakee = Math.floor(Math.log(val)*Math.LOG10E);\n\t\t\tif(o.indexOf(\".\") === -1) o = o.charAt(0) + \".\" + o.substr(1) + \"E+\" + (fakee - o.length+ee);\n\t\t\telse o += \"E+\" + (fakee - ee);\n\t\t\twhile(o.substr(0,2) === \"0.\") {\n\t\t\t\to = o.charAt(0) + o.substr(2,period) + \".\" + o.substr(2+period);\n\t\t\t\to = o.replace(/^0+([1-9])/,\"$1\").replace(/^0+\\./,\"0.\");\n\t\t\t}\n\t\t\to = o.replace(/\\+-/,\"-\");\n\t\t}\n\t\to = o.replace(/^([+-]?)(\\d*)\\.(\\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + \".\" + $3.substr(ee) + \"E\"; });\n\t} else o = val.toExponential(idx);\n\tif(fmt.match(/E\\+00$/) && o.match(/e[+-]\\d$/)) o = o.substr(0,o.length-1) + \"0\" + o.charAt(o.length-1);\n\tif(fmt.match(/E\\-/) && o.match(/e\\+/)) o = o.replace(/e\\+/,\"e\");\n\treturn o.replace(\"e\",\"E\");\n}\nvar frac1 = /# (\\?+)( ?)\\/( ?)(\\d+)/;\nfunction write_num_f1(r, aval, sign) {\n\tvar den = parseInt(r[4],10), rr = Math.round(aval * den), base = Math.floor(rr/den);\n\tvar myn = (rr - base*den), myd = den;\n\treturn sign + (base === 0 ? \"\" : \"\"+base) + \" \" + (myn === 0 ? fill(\" \", r[1].length + 1 + r[4].length) : pad_(myn,r[1].length) + r[2] + \"/\" + r[3] + pad0(myd,r[4].length));\n}\nfunction write_num_f2(r, aval, sign) {\n\treturn sign + (aval === 0 ? \"\" : \"\"+aval) + fill(\" \", r[1].length + 2 + r[4].length);\n}\nvar dec1 = /^#*0*\\.([0#]+)/;\nvar closeparen = /\\).*[0#]/;\nvar phone = /\\(###\\) ###\\\\?-####/;\nfunction hashq(str) {\n\tvar o = \"\", cc;\n\tfor(var i = 0; i != str.length; ++i) switch((cc=str.charCodeAt(i))) {\n\t\tcase 35: break;\n\t\tcase 63: o+= \" \"; break;\n\t\tcase 48: o+= \"0\"; break;\n\t\tdefault: o+= String.fromCharCode(cc);\n\t}\n\treturn o;\n}\nfunction rnd(val, d) { var dd = Math.pow(10,d); return \"\"+(Math.round(val * dd)/dd); }\nfunction dec(val, d) {\n\tvar _frac = val - Math.floor(val), dd = Math.pow(10,d);\n\tif (d < ('' + Math.round(_frac * dd)).length) return 0;\n\treturn Math.round(_frac * dd);\n}\nfunction carry(val, d) {\n\tif (d < ('' + Math.round((val-Math.floor(val))*Math.pow(10,d))).length) {\n\t\treturn 1;\n\t}\n\treturn 0;\n}\nfunction flr(val) {\n\tif(val < 2147483647 && val > -2147483648) return \"\"+(val >= 0 ? (val|0) : (val-1|0));\n\treturn \"\"+Math.floor(val);\n}\nfunction write_num_flt(type, fmt, val) {\n\tif(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {\n\t\tvar ffmt = fmt.replace(/\\( */,\"\").replace(/ \\)/,\"\").replace(/\\)/,\"\");\n\t\tif(val >= 0) return write_num_flt('n', ffmt, val);\n\t\treturn '(' + write_num_flt('n', ffmt, -val) + ')';\n\t}\n\tif(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val);\n\tif(fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val);\n\tif(fmt.indexOf('E') !== -1) return write_num_exp(fmt, val);\n\tif(fmt.charCodeAt(0) === 36) return \"$\"+write_num_flt(type,fmt.substr(fmt.charAt(1)==' '?2:1),val);\n\tvar o;\n\tvar r, ri, ff, aval = Math.abs(val), sign = val < 0 ? \"-\" : \"\";\n\tif(fmt.match(/^00+$/)) return sign + pad0r(aval,fmt.length);\n\tif(fmt.match(/^[#?]+$/)) {\n\t\to = pad0r(val,0); if(o === \"0\") o = \"\";\n\t\treturn o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;\n\t}\n\tif((r = fmt.match(frac1))) return write_num_f1(r, aval, sign);\n\tif(fmt.match(/^#+0+$/)) return sign + pad0r(aval,fmt.length - fmt.indexOf(\"0\"));\n\tif((r = fmt.match(dec1))) {\n\t\to = rnd(val, r[1].length).replace(/^([^\\.]+)$/,\"$1.\"+hashq(r[1])).replace(/\\.$/,\".\"+hashq(r[1])).replace(/\\.(\\d*)$/,function($$, $1) { return \".\" + $1 + fill(\"0\", hashq(r[1]).length-$1.length); });\n\t\treturn fmt.indexOf(\"0.\") !== -1 ? o : o.replace(/^0\\./,\".\");\n\t}\n\tfmt = fmt.replace(/^#+([0.])/, \"$1\");\n\tif((r = fmt.match(/^(0*)\\.(#*)$/))) {\n\t\treturn sign + rnd(aval, r[2].length).replace(/\\.(\\d*[1-9])0*$/,\".$1\").replace(/^(-?\\d*)$/,\"$1.\").replace(/^0\\./,r[1].length?\"0.\":\".\");\n\t}\n\tif((r = fmt.match(/^#{1,3},##0(\\.?)$/))) return sign + commaify(pad0r(aval,0));\n\tif((r = fmt.match(/^#,##0\\.([#0]*0)$/))) {\n\t\treturn val < 0 ? \"-\" + write_num_flt(type, fmt, -val) : commaify(\"\"+(Math.floor(val) + carry(val, r[1].length))) + \".\" + pad0(dec(val, r[1].length),r[1].length);\n\t}\n\tif((r = fmt.match(/^#,#*,#0/))) return write_num_flt(type,fmt.replace(/^#,#*,/,\"\"),val);\n\tif((r = fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/))) {\n\t\to = _strrev(write_num_flt(type, fmt.replace(/[\\\\-]/g,\"\"), val));\n\t\tri = 0;\n\t\treturn _strrev(_strrev(fmt.replace(/\\\\/g,\"\")).replace(/[0#]/g,function(x){return ri= 0) return write_num_int('n', ffmt, val);\n\t\treturn '(' + write_num_int('n', ffmt, -val) + ')';\n\t}\n\tif(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val);\n\tif(fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val);\n\tif(fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val);\n\tif(fmt.charCodeAt(0) === 36) return \"$\"+write_num_int(type,fmt.substr(fmt.charAt(1)==' '?2:1),val);\n\tvar o;\n\tvar r, ri, ff, aval = Math.abs(val), sign = val < 0 ? \"-\" : \"\";\n\tif(fmt.match(/^00+$/)) return sign + pad0(aval,fmt.length);\n\tif(fmt.match(/^[#?]+$/)) {\n\t\to = (\"\"+val); if(val === 0) o = \"\";\n\t\treturn o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;\n\t}\n\tif((r = fmt.match(frac1))) return write_num_f2(r, aval, sign);\n\tif(fmt.match(/^#+0+$/)) return sign + pad0(aval,fmt.length - fmt.indexOf(\"0\"));\n\tif((r = fmt.match(dec1))) {\no = (\"\"+val).replace(/^([^\\.]+)$/,\"$1.\"+hashq(r[1])).replace(/\\.$/,\".\"+hashq(r[1]));\n\t\to = o.replace(/\\.(\\d*)$/,function($$, $1) {\nreturn \".\" + $1 + fill(\"0\", hashq(r[1]).length-$1.length); });\n\t\treturn fmt.indexOf(\"0.\") !== -1 ? o : o.replace(/^0\\./,\".\");\n\t}\n\tfmt = fmt.replace(/^#+([0.])/, \"$1\");\n\tif((r = fmt.match(/^(0*)\\.(#*)$/))) {\n\t\treturn sign + (\"\"+aval).replace(/\\.(\\d*[1-9])0*$/,\".$1\").replace(/^(-?\\d*)$/,\"$1.\").replace(/^0\\./,r[1].length?\"0.\":\".\");\n\t}\n\tif((r = fmt.match(/^#{1,3},##0(\\.?)$/))) return sign + commaify((\"\"+aval));\n\tif((r = fmt.match(/^#,##0\\.([#0]*0)$/))) {\n\t\treturn val < 0 ? \"-\" + write_num_int(type, fmt, -val) : commaify((\"\"+val)) + \".\" + fill('0',r[1].length);\n\t}\n\tif((r = fmt.match(/^#,#*,#0/))) return write_num_int(type,fmt.replace(/^#,#*,/,\"\"),val);\n\tif((r = fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/))) {\n\t\to = _strrev(write_num_int(type, fmt.replace(/[\\\\-]/g,\"\"), val));\n\t\tri = 0;\n\t\treturn _strrev(_strrev(fmt.replace(/\\\\/g,\"\")).replace(/[0#]/g,function(x){return ri -1 || (c=='\\\\' && fmt.charAt(i+1) == \"-\" && \"0#\".indexOf(fmt.charAt(i+2))>-1))){/* empty */}\n\t\t\t\tbreak;\n\t\t\tcase '?': while(fmt.charAt(++i) === c){/* empty */} break;\n\t\t\tcase '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break;\n\t\t\tcase '(': case ')': ++i; break;\n\t\t\tcase '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':\n\t\t\t\twhile(i < fmt.length && \"0123456789\".indexOf(fmt.charAt(++i)) > -1){/* empty */} break;\n\t\t\tcase ' ': ++i; break;\n\t\t\tdefault: ++i; break;\n\t\t}\n\t}\n\treturn false;\n}\nSSF.is_date = fmt_is_date;\nfunction eval_fmt(fmt, v, opts, flen) {\n\tvar out = [], o = \"\", i = 0, c = \"\", lst='t', dt, j, cc;\n\tvar hr='H';\n\t/* Tokenize */\n\twhile(i < fmt.length) {\n\t\tswitch((c = fmt.charAt(i))) {\n\t\t\tcase 'G': /* General */\n\t\t\t\tif(!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt);\n\t\t\t\tout[out.length] = {t:'G', v:'General'}; i+=7; break;\n\t\t\tcase '\"': /* Literal text */\n\t\t\t\tfor(o=\"\";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc);\n\t\t\t\tout[out.length] = {t:'t', v:o}; ++i; break;\n\t\t\tcase '\\\\': var w = fmt.charAt(++i), t = (w === \"(\" || w === \")\") ? w : 't';\n\t\t\t\tout[out.length] = {t:t, v:w}; ++i; break;\n\t\t\tcase '_': out[out.length] = {t:'t', v:\" \"}; i+=2; break;\n\t\t\tcase '@': /* Text Placeholder */\n\t\t\t\tout[out.length] = {t:'T', v:v}; ++i; break;\n\t\t\tcase 'B': case 'b':\n\t\t\t\tif(fmt.charAt(i+1) === \"1\" || fmt.charAt(i+1) === \"2\") {\n\t\t\t\t\tif(dt==null) { dt=parse_date_code(v, opts, fmt.charAt(i+1) === \"2\"); if(dt==null) return \"\"; }\n\t\t\t\t\tout[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break;\n\t\t\t\t}\n\t\t\t\t/* falls through */\n\t\t\tcase 'M': case 'D': case 'Y': case 'H': case 'S': case 'E':\n\t\t\t\tc = c.toLowerCase();\n\t\t\t\t/* falls through */\n\t\t\tcase 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g':\n\t\t\t\tif(v < 0) return \"\";\n\t\t\t\tif(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return \"\"; }\n\t\t\t\to = c; while(++i < fmt.length && fmt.charAt(i).toLowerCase() === c) o+=c;\n\t\t\t\tif(c === 'm' && lst.toLowerCase() === 'h') c = 'M';\n\t\t\t\tif(c === 'h') c = hr;\n\t\t\t\tout[out.length] = {t:c, v:o}; lst = c; break;\n\t\t\tcase 'A': case 'a': case '上':\n\t\t\t\tvar q={t:c, v:c};\n\t\t\t\tif(dt==null) dt=parse_date_code(v, opts);\n\t\t\t\tif(fmt.substr(i, 3).toUpperCase() === \"A/P\") { if(dt!=null) q.v = dt.H >= 12 ? \"P\" : \"A\"; q.t = 'T'; hr='h';i+=3;}\n\t\t\t\telse if(fmt.substr(i,5).toUpperCase() === \"AM/PM\") { if(dt!=null) q.v = dt.H >= 12 ? \"PM\" : \"AM\"; q.t = 'T'; i+=5; hr='h'; }\n\t\t\t\telse if(fmt.substr(i,5).toUpperCase() === \"上午/下午\") { if(dt!=null) q.v = dt.H >= 12 ? \"下午\" : \"上午\"; q.t = 'T'; i+=5; hr='h'; }\n\t\t\t\telse { q.t = \"t\"; ++i; }\n\t\t\t\tif(dt==null && q.t === 'T') return \"\";\n\t\t\t\tout[out.length] = q; lst = c; break;\n\t\t\tcase '[':\n\t\t\t\to = c;\n\t\t\t\twhile(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);\n\t\t\t\tif(o.slice(-1) !== ']') throw 'unterminated \"[\" block: |' + o + '|';\n\t\t\t\tif(o.match(abstime)) {\n\t\t\t\t\tif(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return \"\"; }\n\t\t\t\t\tout[out.length] = {t:'Z', v:o.toLowerCase()};\n\t\t\t\t\tlst = o.charAt(1);\n\t\t\t\t} else if(o.indexOf(\"$\") > -1) {\n\t\t\t\t\to = (o.match(/\\$([^-\\[\\]]*)/)||[])[1]||\"$\";\n\t\t\t\t\tif(!fmt_is_date(fmt)) out[out.length] = {t:'t',v:o};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t/* Numbers */\n\t\t\tcase '.':\n\t\t\t\tif(dt != null) {\n\t\t\t\t\to = c; while(++i < fmt.length && (c=fmt.charAt(i)) === \"0\") o += c;\n\t\t\t\t\tout[out.length] = {t:'s', v:o}; break;\n\t\t\t\t}\n\t\t\t\t/* falls through */\n\t\t\tcase '0': case '#':\n\t\t\t\to = c; while(++i < fmt.length && \"0#?.,E+-%\".indexOf(c=fmt.charAt(i)) > -1) o += c;\n\t\t\t\tout[out.length] = {t:'n', v:o}; break;\n\t\t\tcase '?':\n\t\t\t\to = c; while(fmt.charAt(++i) === c) o+=c;\n\t\t\t\tout[out.length] = {t:c, v:o}; lst = c; break;\n\t\t\tcase '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break; // **\n\t\t\tcase '(': case ')': out[out.length] = {t:(flen===1?'t':c), v:c}; ++i; break;\n\t\t\tcase '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':\n\t\t\t\to = c; while(i < fmt.length && \"0123456789\".indexOf(fmt.charAt(++i)) > -1) o+=fmt.charAt(i);\n\t\t\t\tout[out.length] = {t:'D', v:o}; break;\n\t\t\tcase ' ': out[out.length] = {t:c, v:c}; ++i; break;\n\t\t\tcase '$': out[out.length] = {t:'t', v:'$'}; ++i; break;\n\t\t\tdefault:\n\t\t\t\tif(\",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP\".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt);\n\t\t\t\tout[out.length] = {t:'t', v:c}; ++i; break;\n\t\t}\n\t}\n\n\t/* Scan for date/time parts */\n\tvar bt = 0, ss0 = 0, ssm;\n\tfor(i=out.length-1, lst='t'; i >= 0; --i) {\n\t\tswitch(out[i].t) {\n\t\t\tcase 'h': case 'H': out[i].t = hr; lst='h'; if(bt < 1) bt = 1; break;\n\t\t\tcase 's':\n\t\t\t\tif((ssm=out[i].v.match(/\\.0+$/))) ss0=Math.max(ss0,ssm[0].length-1);\n\t\t\t\tif(bt < 3) bt = 3;\n\t\t\t/* falls through */\n\t\t\tcase 'd': case 'y': case 'M': case 'e': lst=out[i].t; break;\n\t\t\tcase 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break;\n\t\t\tcase 'X': /*if(out[i].v === \"B2\");*/\n\t\t\t\tbreak;\n\t\t\tcase 'Z':\n\t\t\t\tif(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1;\n\t\t\t\tif(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2;\n\t\t\t\tif(bt < 3 && out[i].v.match(/[Ss]/)) bt = 3;\n\t\t}\n\t}\n\t/* time rounding depends on presence of minute / second / usec fields */\n\tswitch(bt) {\n\t\tcase 0: break;\n\t\tcase 1:\nif(dt.u >= 0.5) { dt.u = 0; ++dt.S; }\n\t\t\tif(dt.S >= 60) { dt.S = 0; ++dt.M; }\n\t\t\tif(dt.M >= 60) { dt.M = 0; ++dt.H; }\n\t\t\tbreak;\n\t\tcase 2:\nif(dt.u >= 0.5) { dt.u = 0; ++dt.S; }\n\t\t\tif(dt.S >= 60) { dt.S = 0; ++dt.M; }\n\t\t\tbreak;\n\t}\n\n\t/* replace fields */\n\tvar nstr = \"\", jj;\n\tfor(i=0; i < out.length; ++i) {\n\t\tswitch(out[i].t) {\n\t\t\tcase 't': case 'T': case ' ': case 'D': break;\n\t\t\tcase 'X': out[i].v = \"\"; out[i].t = \";\"; break;\n\t\t\tcase 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z':\nout[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);\n\t\t\t\tout[i].t = 't'; break;\n\t\t\tcase 'n': case '?':\n\t\t\t\tjj = i+1;\n\t\t\t\twhile(out[jj] != null && (\n\t\t\t\t\t(c=out[jj].t) === \"?\" || c === \"D\" ||\n\t\t\t\t\t((c === \" \" || c === \"t\") && out[jj+1] != null && (out[jj+1].t === '?' || out[jj+1].t === \"t\" && out[jj+1].v === '/')) ||\n\t\t\t\t\t(out[i].t === '(' && (c === ' ' || c === 'n' || c === ')')) ||\n\t\t\t\t\t(c === 't' && (out[jj].v === '/' || out[jj].v === ' ' && out[jj+1] != null && out[jj+1].t == '?'))\n\t\t\t\t)) {\n\t\t\t\t\tout[i].v += out[jj].v;\n\t\t\t\t\tout[jj] = {v:\"\", t:\";\"}; ++jj;\n\t\t\t\t}\n\t\t\t\tnstr += out[i].v;\n\t\t\t\ti = jj-1; break;\n\t\t\tcase 'G': out[i].t = 't'; out[i].v = general_fmt(v,opts); break;\n\t\t}\n\t}\n\tvar vv = \"\", myv, ostr;\n\tif(nstr.length > 0) {\n\t\tif(nstr.charCodeAt(0) == 40) /* '(' */ {\n\t\t\tmyv = (v<0&&nstr.charCodeAt(0) === 45 ? -v : v);\n\t\t\tostr = write_num('n', nstr, myv);\n\t\t} else {\n\t\t\tmyv = (v<0 && flen > 1 ? -v : v);\n\t\t\tostr = write_num('n', nstr, myv);\n\t\t\tif(myv < 0 && out[0] && out[0].t == 't') {\n\t\t\t\tostr = ostr.substr(1);\n\t\t\t\tout[0].v = \"-\" + out[0].v;\n\t\t\t}\n\t\t}\n\t\tjj=ostr.length-1;\n\t\tvar decpt = out.length;\n\t\tfor(i=0; i < out.length; ++i) if(out[i] != null && out[i].t != 't' && out[i].v.indexOf(\".\") > -1) { decpt = i; break; }\n\t\tvar lasti=out.length;\n\t\tif(decpt === out.length && ostr.indexOf(\"E\") === -1) {\n\t\t\tfor(i=out.length-1; i>= 0;--i) {\n\t\t\t\tif(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;\n\t\t\t\tif(jj>=out[i].v.length-1) { jj -= out[i].v.length; out[i].v = ostr.substr(jj+1, out[i].v.length); }\n\t\t\t\telse if(jj < 0) out[i].v = \"\";\n\t\t\t\telse { out[i].v = ostr.substr(0, jj+1); jj = -1; }\n\t\t\t\tout[i].t = 't';\n\t\t\t\tlasti = i;\n\t\t\t}\n\t\t\tif(jj>=0 && lasti= 0; --i) {\n\t\t\t\tif(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;\n\t\t\t\tj=out[i].v.indexOf(\".\")>-1&&i===decpt?out[i].v.indexOf(\".\")-1:out[i].v.length-1;\n\t\t\t\tvv = out[i].v.substr(j+1);\n\t\t\t\tfor(; j>=0; --j) {\n\t\t\t\t\tif(jj>=0 && (out[i].v.charAt(j) === \"0\" || out[i].v.charAt(j) === \"#\")) vv = ostr.charAt(jj--) + vv;\n\t\t\t\t}\n\t\t\t\tout[i].v = vv;\n\t\t\t\tout[i].t = 't';\n\t\t\t\tlasti = i;\n\t\t\t}\n\t\t\tif(jj>=0 && lasti-1&&i===decpt?out[i].v.indexOf(\".\")+1:0;\n\t\t\t\tvv = out[i].v.substr(0,j);\n\t\t\t\tfor(; j-1) {\n\t\tmyv = (flen >1 && v < 0 && i>0 && out[i-1].v === \"-\" ? -v:v);\n\t\tout[i].v = write_num(out[i].t, out[i].v, myv);\n\t\tout[i].t = 't';\n\t}\n\tvar retval = \"\";\n\tfor(i=0; i !== out.length; ++i) if(out[i] != null) retval += out[i].v;\n\treturn retval;\n}\nSSF._eval = eval_fmt;\nvar cfregex = /\\[[=<>]/;\nvar cfregex2 = /\\[(=|>[=]?|<[>=]?)(-?\\d+(?:\\.\\d*)?)\\]/;\nfunction chkcond(v, rr) {\n\tif(rr == null) return false;\n\tvar thresh = parseFloat(rr[2]);\n\tswitch(rr[1]) {\n\t\tcase \"=\": if(v == thresh) return true; break;\n\t\tcase \">\": if(v > thresh) return true; break;\n\t\tcase \"<\": if(v < thresh) return true; break;\n\t\tcase \"<>\": if(v != thresh) return true; break;\n\t\tcase \">=\": if(v >= thresh) return true; break;\n\t\tcase \"<=\": if(v <= thresh) return true; break;\n\t}\n\treturn false;\n}\nfunction choose_fmt(f, v) {\n\tvar fmt = split_fmt(f);\n\tvar l = fmt.length, lat = fmt[l-1].indexOf(\"@\");\n\tif(l<4 && lat>-1) --l;\n\tif(fmt.length > 4) throw new Error(\"cannot find right format for |\" + fmt.join(\"|\") + \"|\");\n\tif(typeof v !== \"number\") return [4, fmt.length === 4 || lat>-1?fmt[fmt.length-1]:\"@\"];\n\tswitch(fmt.length) {\n\t\tcase 1: fmt = lat>-1 ? [\"General\", \"General\", \"General\", fmt[0]] : [fmt[0], fmt[0], fmt[0], \"@\"]; break;\n\t\tcase 2: fmt = lat>-1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], \"@\"]; break;\n\t\tcase 3: fmt = lat>-1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], \"@\"]; break;\n\t\tcase 4: break;\n\t}\n\tvar ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];\n\tif(fmt[0].indexOf(\"[\") === -1 && fmt[1].indexOf(\"[\") === -1) return [l, ff];\n\tif(fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) {\n\t\tvar m1 = fmt[0].match(cfregex2);\n\t\tvar m2 = fmt[1].match(cfregex2);\n\t\treturn chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]];\n\t}\n\treturn [l, ff];\n}\nfunction format(fmt,v,o) {\n\tif(o == null) o = {};\n\tvar sfmt = \"\";\n\tswitch(typeof fmt) {\n\t\tcase \"string\":\n\t\t\tif(fmt == \"m/d/yy\" && o.dateNF) sfmt = o.dateNF;\n\t\t\telse sfmt = fmt;\n\t\t\tbreak;\n\t\tcase \"number\":\n\t\t\tif(fmt == 14 && o.dateNF) sfmt = o.dateNF;\n\t\t\telse sfmt = (o.table != null ? (o.table) : table_fmt)[fmt];\n\t\t\tif(sfmt == null) sfmt = (o.table && o.table[default_map[fmt]]) || table_fmt[default_map[fmt]];\n\t\t\tif(sfmt == null) sfmt = default_str[fmt] || \"General\";\n\t\t\tbreak;\n\t}\n\tif(isgeneral(sfmt,0)) return general_fmt(v, o);\n\tif(v instanceof Date) v = datenum_local(v, o.date1904);\n\tvar f = choose_fmt(sfmt, v);\n\tif(isgeneral(f[1])) return general_fmt(v, o);\n\tif(v === true) v = \"TRUE\"; else if(v === false) v = \"FALSE\";\n\telse if(v === \"\" || v == null) return \"\";\n\treturn eval_fmt(f[1], v, o, f[0]);\n}\nfunction load_entry(fmt, idx) {\n\tif(typeof idx != 'number') {\n\t\tidx = +idx || -1;\nfor(var i = 0; i < 0x0188; ++i) {\nif(table_fmt[i] == undefined) { if(idx < 0) idx = i; continue; }\n\t\t\tif(table_fmt[i] == fmt) { idx = i; break; }\n\t\t}\nif(idx < 0) idx = 0x187;\n\t}\ntable_fmt[idx] = fmt;\n\treturn idx;\n}\nSSF.load = load_entry;\nSSF._table = table_fmt;\nSSF.get_table = function get_table() { return table_fmt; };\nSSF.load_table = function load_table(tbl) {\n\tfor(var i=0; i!=0x0188; ++i)\n\t\tif(tbl[i] !== undefined) load_entry(tbl[i], i);\n};\nSSF.init_table = init_table;\nSSF.format = format;\n};\nmake_ssf(SSF);\n/* map from xlml named formats to SSF TODO: localize */\nvar XLMLFormatMap/*{[string]:string}*/ = ({\n\t\"General Number\": \"General\",\n\t\"General Date\": SSF._table[22],\n\t\"Long Date\": \"dddd, mmmm dd, yyyy\",\n\t\"Medium Date\": SSF._table[15],\n\t\"Short Date\": SSF._table[14],\n\t\"Long Time\": SSF._table[19],\n\t\"Medium Time\": SSF._table[18],\n\t\"Short Time\": SSF._table[20],\n\t\"Currency\": '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',\n\t\"Fixed\": SSF._table[2],\n\t\"Standard\": SSF._table[4],\n\t\"Percent\": SSF._table[10],\n\t\"Scientific\": SSF._table[11],\n\t\"Yes/No\": '\"Yes\";\"Yes\";\"No\";@',\n\t\"True/False\": '\"True\";\"True\";\"False\";@',\n\t\"On/Off\": '\"Yes\";\"Yes\";\"No\";@'\n});\n\nvar SSFImplicit/*{[number]:string}*/ = ({\n\t\"5\": '\"$\"#,##0_);\\\\(\"$\"#,##0\\\\)',\n\t\"6\": '\"$\"#,##0_);[Red]\\\\(\"$\"#,##0\\\\)',\n\t\"7\": '\"$\"#,##0.00_);\\\\(\"$\"#,##0.00\\\\)',\n\t\"8\": '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',\n\t\"23\": 'General', \"24\": 'General', \"25\": 'General', \"26\": 'General',\n\t\"27\": 'm/d/yy', \"28\": 'm/d/yy', \"29\": 'm/d/yy', \"30\": 'm/d/yy', \"31\": 'm/d/yy',\n\t\"32\": 'h:mm:ss', \"33\": 'h:mm:ss', \"34\": 'h:mm:ss', \"35\": 'h:mm:ss',\n\t\"36\": 'm/d/yy',\n\t\"41\": '_(* #,##0_);_(* \\(#,##0\\);_(* \"-\"_);_(@_)',\n\t\"42\": '_(\"$\"* #,##0_);_(\"$\"* \\(#,##0\\);_(\"$\"* \"-\"_);_(@_)',\n\t\"43\": '_(* #,##0.00_);_(* \\(#,##0.00\\);_(* \"-\"??_);_(@_)',\n\t\"44\": '_(\"$\"* #,##0.00_);_(\"$\"* \\(#,##0.00\\);_(\"$\"* \"-\"??_);_(@_)',\n\t\"50\": 'm/d/yy', \"51\": 'm/d/yy', \"52\": 'm/d/yy', \"53\": 'm/d/yy', \"54\": 'm/d/yy',\n\t\"55\": 'm/d/yy', \"56\": 'm/d/yy', \"57\": 'm/d/yy', \"58\": 'm/d/yy',\n\t\"59\": '0',\n\t\"60\": '0.00',\n\t\"61\": '#,##0',\n\t\"62\": '#,##0.00',\n\t\"63\": '\"$\"#,##0_);\\\\(\"$\"#,##0\\\\)',\n\t\"64\": '\"$\"#,##0_);[Red]\\\\(\"$\"#,##0\\\\)',\n\t\"65\": '\"$\"#,##0.00_);\\\\(\"$\"#,##0.00\\\\)',\n\t\"66\": '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',\n\t\"67\": '0%',\n\t\"68\": '0.00%',\n\t\"69\": '# ?/?',\n\t\"70\": '# ??/??',\n\t\"71\": 'm/d/yy',\n\t\"72\": 'm/d/yy',\n\t\"73\": 'd-mmm-yy',\n\t\"74\": 'd-mmm',\n\t\"75\": 'mmm-yy',\n\t\"76\": 'h:mm',\n\t\"77\": 'h:mm:ss',\n\t\"78\": 'm/d/yy h:mm',\n\t\"79\": 'mm:ss',\n\t\"80\": '[h]:mm:ss',\n\t\"81\": 'mmss.0'\n});\n\n/* dateNF parse TODO: move to SSF */\nvar dateNFregex = /[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g;\nfunction dateNF_regex(dateNF) {\n\tvar fmt = typeof dateNF == \"number\" ? SSF._table[dateNF] : dateNF;\n\tfmt = fmt.replace(dateNFregex, \"(\\\\d+)\");\n\treturn new RegExp(\"^\" + fmt + \"$\");\n}\nfunction dateNF_fix(str, dateNF, match) {\n\tvar Y = -1, m = -1, d = -1, H = -1, M = -1, S = -1;\n\t(dateNF.match(dateNFregex)||[]).forEach(function(n, i) {\n\t\tvar v = parseInt(match[i+1], 10);\n\t\tswitch(n.toLowerCase().charAt(0)) {\n\t\t\tcase 'y': Y = v; break; case 'd': d = v; break;\n\t\t\tcase 'h': H = v; break; case 's': S = v; break;\n\t\t\tcase 'm': if(H >= 0) M = v; else m = v; break;\n\t\t}\n\t});\n\tif(S >= 0 && M == -1 && m >= 0) { M = m; m = -1; }\n\tvar datestr = ((\"\" + (Y>=0?Y: new Date().getFullYear())).slice(-4) + \"-\" + (\"00\" + (m>=1?m:1)).slice(-2) + \"-\" + (\"00\" + (d>=1?d:1)).slice(-2));\n\tif(datestr.length == 7) datestr = \"0\" + datestr;\n\tif(datestr.length == 8) datestr = \"20\" + datestr;\n\tvar timestr = ((\"00\" + (H>=0?H:0)).slice(-2) + \":\" + (\"00\" + (M>=0?M:0)).slice(-2) + \":\" + (\"00\" + (S>=0?S:0)).slice(-2));\n\tif(H == -1 && M == -1 && S == -1) return datestr;\n\tif(Y == -1 && m == -1 && d == -1) return timestr;\n\treturn datestr + \"T\" + timestr;\n}\n\nvar DO_NOT_EXPORT_CFB = true;\n/* cfb.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*jshint eqnull:true */\n/*exported CFB */\n/*global Uint8Array:false, Uint16Array:false */\n\n/* crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*exported CRC32 */\nvar CRC32;\n(function (factory) {\n\t/*jshint ignore:start */\n\t/*eslint-disable */\n\tfactory(CRC32 = {});\n\t/*eslint-enable */\n\t/*jshint ignore:end */\n}(function(CRC32) {\nCRC32.version = '1.2.0';\n/* see perf/crc32table.js */\n/*global Int32Array */\nfunction signed_crc_table() {\n\tvar c = 0, table = new Array(256);\n\n\tfor(var n =0; n != 256; ++n){\n\t\tc = n;\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\ttable[n] = c;\n\t}\n\n\treturn typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;\n}\n\nvar T = signed_crc_table();\nfunction crc32_bstr(bstr, seed) {\n\tvar C = seed ^ -1, L = bstr.length - 1;\n\tfor(var i = 0; i < L;) {\n\t\tC = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];\n\t\tC = (C>>>8) ^ T[(C^bstr.charCodeAt(i++))&0xFF];\n\t}\n\tif(i === L) C = (C>>>8) ^ T[(C ^ bstr.charCodeAt(i))&0xFF];\n\treturn C ^ -1;\n}\n\nfunction crc32_buf(buf, seed) {\n\tif(buf.length > 10000) return crc32_buf_8(buf, seed);\n\tvar C = seed ^ -1, L = buf.length - 3;\n\tfor(var i = 0; i < L;) {\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t}\n\twhile(i < L+3) C = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\treturn C ^ -1;\n}\n\nfunction crc32_buf_8(buf, seed) {\n\tvar C = seed ^ -1, L = buf.length - 7;\n\tfor(var i = 0; i < L;) {\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t\tC = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\t}\n\twhile(i < L+7) C = (C>>>8) ^ T[(C^buf[i++])&0xFF];\n\treturn C ^ -1;\n}\n\nfunction crc32_str(str, seed) {\n\tvar C = seed ^ -1;\n\tfor(var i = 0, L=str.length, c, d; i < L;) {\n\t\tc = str.charCodeAt(i++);\n\t\tif(c < 0x80) {\n\t\t\tC = (C>>>8) ^ T[(C ^ c)&0xFF];\n\t\t} else if(c < 0x800) {\n\t\t\tC = (C>>>8) ^ T[(C ^ (192|((c>>6)&31)))&0xFF];\n\t\t\tC = (C>>>8) ^ T[(C ^ (128|(c&63)))&0xFF];\n\t\t} else if(c >= 0xD800 && c < 0xE000) {\n\t\t\tc = (c&1023)+64; d = str.charCodeAt(i++)&1023;\n\t\t\tC = (C>>>8) ^ T[(C ^ (240|((c>>8)&7)))&0xFF];\n\t\t\tC = (C>>>8) ^ T[(C ^ (128|((c>>2)&63)))&0xFF];\n\t\t\tC = (C>>>8) ^ T[(C ^ (128|((d>>6)&15)|((c&3)<<4)))&0xFF];\n\t\t\tC = (C>>>8) ^ T[(C ^ (128|(d&63)))&0xFF];\n\t\t} else {\n\t\t\tC = (C>>>8) ^ T[(C ^ (224|((c>>12)&15)))&0xFF];\n\t\t\tC = (C>>>8) ^ T[(C ^ (128|((c>>6)&63)))&0xFF];\n\t\t\tC = (C>>>8) ^ T[(C ^ (128|(c&63)))&0xFF];\n\t\t}\n\t}\n\treturn C ^ -1;\n}\nCRC32.table = T;\nCRC32.bstr = crc32_bstr;\nCRC32.buf = crc32_buf;\nCRC32.str = crc32_str;\n}));\n/* [MS-CFB] v20171201 */\nvar CFB = (function _CFB(){\nvar exports = {};\nexports.version = '1.1.4';\n/* [MS-CFB] 2.6.4 */\nfunction namecmp(l, r) {\n\tvar L = l.split(\"/\"), R = r.split(\"/\");\n\tfor(var i = 0, c = 0, Z = Math.min(L.length, R.length); i < Z; ++i) {\n\t\tif((c = L[i].length - R[i].length)) return c;\n\t\tif(L[i] != R[i]) return L[i] < R[i] ? -1 : 1;\n\t}\n\treturn L.length - R.length;\n}\nfunction dirname(p) {\n\tif(p.charAt(p.length - 1) == \"/\") return (p.slice(0,-1).indexOf(\"/\") === -1) ? p : dirname(p.slice(0, -1));\n\tvar c = p.lastIndexOf(\"/\");\n\treturn (c === -1) ? p : p.slice(0, c+1);\n}\n\nfunction filename(p) {\n\tif(p.charAt(p.length - 1) == \"/\") return filename(p.slice(0, -1));\n\tvar c = p.lastIndexOf(\"/\");\n\treturn (c === -1) ? p : p.slice(c+1);\n}\n/* -------------------------------------------------------------------------- */\n/* DOS Date format:\n high|YYYYYYYm.mmmddddd.HHHHHMMM.MMMSSSSS|low\n add 1980 to stored year\n stored second should be doubled\n*/\n\n/* write JS date to buf as a DOS date */\nfunction write_dos_date(buf, date) {\n\tif(typeof date === \"string\") date = new Date(date);\n\tvar hms = date.getHours();\n\thms = hms << 6 | date.getMinutes();\n\thms = hms << 5 | (date.getSeconds()>>>1);\n\tbuf.write_shift(2, hms);\n\tvar ymd = (date.getFullYear() - 1980);\n\tymd = ymd << 4 | (date.getMonth()+1);\n\tymd = ymd << 5 | date.getDate();\n\tbuf.write_shift(2, ymd);\n}\n\n/* read four bytes from buf and interpret as a DOS date */\nfunction parse_dos_date(buf) {\n\tvar hms = buf.read_shift(2) & 0xFFFF;\n\tvar ymd = buf.read_shift(2) & 0xFFFF;\n\tvar val = new Date();\n\tvar d = ymd & 0x1F; ymd >>>= 5;\n\tvar m = ymd & 0x0F; ymd >>>= 4;\n\tval.setMilliseconds(0);\n\tval.setFullYear(ymd + 1980);\n\tval.setMonth(m-1);\n\tval.setDate(d);\n\tvar S = hms & 0x1F; hms >>>= 5;\n\tvar M = hms & 0x3F; hms >>>= 6;\n\tval.setHours(hms);\n\tval.setMinutes(M);\n\tval.setSeconds(S<<1);\n\treturn val;\n}\nfunction parse_extra_field(blob) {\n\tprep_blob(blob, 0);\n\tvar o = {};\n\tvar flags = 0;\n\twhile(blob.l <= blob.length - 4) {\n\t\tvar type = blob.read_shift(2);\n\t\tvar sz = blob.read_shift(2), tgt = blob.l + sz;\n\t\tvar p = {};\n\t\tswitch(type) {\n\t\t\t/* UNIX-style Timestamps */\n\t\t\tcase 0x5455: {\n\t\t\t\tflags = blob.read_shift(1);\n\t\t\t\tif(flags & 1) p.mtime = blob.read_shift(4);\n\t\t\t\t/* for some reason, CD flag corresponds to LFH */\n\t\t\t\tif(sz > 5) {\n\t\t\t\t\tif(flags & 2) p.atime = blob.read_shift(4);\n\t\t\t\t\tif(flags & 4) p.ctime = blob.read_shift(4);\n\t\t\t\t}\n\t\t\t\tif(p.mtime) p.mt = new Date(p.mtime*1000);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tblob.l = tgt;\n\t\to[type] = p;\n\t}\n\treturn o;\n}\nvar fs;\nfunction get_fs() { return fs || (fs = require('fs')); }\nfunction parse(file, options) {\nif(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options);\nif(file.length < 512) throw new Error(\"CFB file size \" + file.length + \" < 512\");\nvar mver = 3;\nvar ssz = 512;\nvar nmfs = 0; // number of mini FAT sectors\nvar difat_sec_cnt = 0;\nvar dir_start = 0;\nvar minifat_start = 0;\nvar difat_start = 0;\n\nvar fat_addrs = []; // locations of FAT sectors\n\n/* [MS-CFB] 2.2 Compound File Header */\nvar blob = file.slice(0,512);\nprep_blob(blob, 0);\n\n/* major version */\nvar mv = check_get_mver(blob);\nmver = mv[0];\nswitch(mver) {\n\tcase 3: ssz = 512; break; case 4: ssz = 4096; break;\n\tcase 0: if(mv[1] == 0) return parse_zip(file, options);\n\t/* falls through */\n\tdefault: throw new Error(\"Major Version: Expected 3 or 4 saw \" + mver);\n}\n\n/* reprocess header */\nif(ssz !== 512) { blob = file.slice(0,ssz); prep_blob(blob, 28 /* blob.l */); }\n/* Save header for final object */\nvar header = file.slice(0,ssz);\n\ncheck_shifts(blob, mver);\n\n// Number of Directory Sectors\nvar dir_cnt = blob.read_shift(4, 'i');\nif(mver === 3 && dir_cnt !== 0) throw new Error('# Directory Sectors: Expected 0 saw ' + dir_cnt);\n\n// Number of FAT Sectors\nblob.l += 4;\n\n// First Directory Sector Location\ndir_start = blob.read_shift(4, 'i');\n\n// Transaction Signature\nblob.l += 4;\n\n// Mini Stream Cutoff Size\nblob.chk('00100000', 'Mini Stream Cutoff Size: ');\n\n// First Mini FAT Sector Location\nminifat_start = blob.read_shift(4, 'i');\n\n// Number of Mini FAT Sectors\nnmfs = blob.read_shift(4, 'i');\n\n// First DIFAT sector location\ndifat_start = blob.read_shift(4, 'i');\n\n// Number of DIFAT Sectors\ndifat_sec_cnt = blob.read_shift(4, 'i');\n\n// Grab FAT Sector Locations\nfor(var q = -1, j = 0; j < 109; ++j) { /* 109 = (512 - blob.l)>>>2; */\n\tq = blob.read_shift(4, 'i');\n\tif(q<0) break;\n\tfat_addrs[j] = q;\n}\n\n/** Break the file up into sectors */\nvar sectors = sectorify(file, ssz);\n\nsleuth_fat(difat_start, difat_sec_cnt, sectors, ssz, fat_addrs);\n\n/** Chains */\nvar sector_list = make_sector_list(sectors, dir_start, fat_addrs, ssz);\n\nsector_list[dir_start].name = \"!Directory\";\nif(nmfs > 0 && minifat_start !== ENDOFCHAIN) sector_list[minifat_start].name = \"!MiniFAT\";\nsector_list[fat_addrs[0]].name = \"!FAT\";\nsector_list.fat_addrs = fat_addrs;\nsector_list.ssz = ssz;\n\n/* [MS-CFB] 2.6.1 Compound File Directory Entry */\nvar files = {}, Paths = [], FileIndex = [], FullPaths = [];\nread_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start);\n\nbuild_full_paths(FileIndex, FullPaths, Paths);\nPaths.shift();\n\nvar o = {\n\tFileIndex: FileIndex,\n\tFullPaths: FullPaths\n};\n\n// $FlowIgnore\nif(options && options.raw) o.raw = {header: header, sectors: sectors};\nreturn o;\n} // parse\n\n/* [MS-CFB] 2.2 Compound File Header -- read up to major version */\nfunction check_get_mver(blob) {\n\tif(blob[blob.l] == 0x50 && blob[blob.l + 1] == 0x4b) return [0, 0];\n\t// header signature 8\n\tblob.chk(HEADER_SIGNATURE, 'Header Signature: ');\n\n\t// clsid 16\n\t//blob.chk(HEADER_CLSID, 'CLSID: ');\n\tblob.l += 16;\n\n\t// minor version 2\n\tvar mver = blob.read_shift(2, 'u');\n\n\treturn [blob.read_shift(2,'u'), mver];\n}\nfunction check_shifts(blob, mver) {\n\tvar shift = 0x09;\n\n\t// Byte Order\n\t//blob.chk('feff', 'Byte Order: '); // note: some writers put 0xffff\n\tblob.l += 2;\n\n\t// Sector Shift\n\tswitch((shift = blob.read_shift(2))) {\n\t\tcase 0x09: if(mver != 3) throw new Error('Sector Shift: Expected 9 saw ' + shift); break;\n\t\tcase 0x0c: if(mver != 4) throw new Error('Sector Shift: Expected 12 saw ' + shift); break;\n\t\tdefault: throw new Error('Sector Shift: Expected 9 or 12 saw ' + shift);\n\t}\n\n\t// Mini Sector Shift\n\tblob.chk('0600', 'Mini Sector Shift: ');\n\n\t// Reserved\n\tblob.chk('000000000000', 'Reserved: ');\n}\n\n/** Break the file up into sectors */\nfunction sectorify(file, ssz) {\n\tvar nsectors = Math.ceil(file.length/ssz)-1;\n\tvar sectors = [];\n\tfor(var i=1; i < nsectors; ++i) sectors[i-1] = file.slice(i*ssz,(i+1)*ssz);\n\tsectors[nsectors-1] = file.slice(nsectors*ssz);\n\treturn sectors;\n}\n\n/* [MS-CFB] 2.6.4 Red-Black Tree */\nfunction build_full_paths(FI, FP, Paths) {\n\tvar i = 0, L = 0, R = 0, C = 0, j = 0, pl = Paths.length;\n\tvar dad = [], q = [];\n\n\tfor(; i < pl; ++i) { dad[i]=q[i]=i; FP[i]=Paths[i]; }\n\n\tfor(; j < q.length; ++j) {\n\t\ti = q[j];\n\t\tL = FI[i].L; R = FI[i].R; C = FI[i].C;\n\t\tif(dad[i] === i) {\n\t\t\tif(L !== -1 /*NOSTREAM*/ && dad[L] !== L) dad[i] = dad[L];\n\t\t\tif(R !== -1 && dad[R] !== R) dad[i] = dad[R];\n\t\t}\n\t\tif(C !== -1 /*NOSTREAM*/) dad[C] = i;\n\t\tif(L !== -1 && i != dad[i]) { dad[L] = dad[i]; if(q.lastIndexOf(L) < j) q.push(L); }\n\t\tif(R !== -1 && i != dad[i]) { dad[R] = dad[i]; if(q.lastIndexOf(R) < j) q.push(R); }\n\t}\n\tfor(i=1; i < pl; ++i) if(dad[i] === i) {\n\t\tif(R !== -1 /*NOSTREAM*/ && dad[R] !== R) dad[i] = dad[R];\n\t\telse if(L !== -1 && dad[L] !== L) dad[i] = dad[L];\n\t}\n\n\tfor(i=1; i < pl; ++i) {\n\t\tif(FI[i].type === 0 /* unknown */) continue;\n\t\tj = i;\n\t\tif(j != dad[j]) do {\n\t\t\tj = dad[j];\n\t\t\tFP[i] = FP[j] + \"/\" + FP[i];\n\t\t} while (j !== 0 && -1 !== dad[j] && j != dad[j]);\n\t\tdad[i] = -1;\n\t}\n\n\tFP[0] += \"/\";\n\tfor(i=1; i < pl; ++i) {\n\t\tif(FI[i].type !== 2 /* stream */) FP[i] += \"/\";\n\t}\n}\n\nfunction get_mfat_entry(entry, payload, mini) {\n\tvar start = entry.start, size = entry.size;\n\t//return (payload.slice(start*MSSZ, start*MSSZ + size));\n\tvar o = [];\n\tvar idx = start;\n\twhile(mini && size > 0 && idx >= 0) {\n\t\to.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ));\n\t\tsize -= MSSZ;\n\t\tidx = __readInt32LE(mini, idx * 4);\n\t}\n\tif(o.length === 0) return (new_buf(0));\n\treturn (bconcat(o).slice(0, entry.size));\n}\n\n/** Chase down the rest of the DIFAT chain to build a comprehensive list\n DIFAT chains by storing the next sector number as the last 32 bits */\nfunction sleuth_fat(idx, cnt, sectors, ssz, fat_addrs) {\n\tvar q = ENDOFCHAIN;\n\tif(idx === ENDOFCHAIN) {\n\t\tif(cnt !== 0) throw new Error(\"DIFAT chain shorter than expected\");\n\t} else if(idx !== -1 /*FREESECT*/) {\n\t\tvar sector = sectors[idx], m = (ssz>>>2)-1;\n\t\tif(!sector) return;\n\t\tfor(var i = 0; i < m; ++i) {\n\t\t\tif((q = __readInt32LE(sector,i*4)) === ENDOFCHAIN) break;\n\t\t\tfat_addrs.push(q);\n\t\t}\n\t\tif(cnt >= 1) sleuth_fat(__readInt32LE(sector,ssz-4),cnt - 1, sectors, ssz, fat_addrs);\n\t}\n}\n\n/** Follow the linked list of sectors for a given starting point */\nfunction get_sector_list(sectors, start, fat_addrs, ssz, chkd) {\n\tvar buf = [], buf_chain = [];\n\tif(!chkd) chkd = [];\n\tvar modulus = ssz - 1, j = 0, jj = 0;\n\tfor(j=start; j>=0;) {\n\t\tchkd[j] = true;\n\t\tbuf[buf.length] = j;\n\t\tbuf_chain.push(sectors[j]);\n\t\tvar addr = fat_addrs[Math.floor(j*4/ssz)];\n\t\tjj = ((j*4) & modulus);\n\t\tif(ssz < 4 + jj) throw new Error(\"FAT boundary crossed: \" + j + \" 4 \"+ssz);\n\t\tif(!sectors[addr]) break;\n\t\tj = __readInt32LE(sectors[addr], jj);\n\t}\n\treturn {nodes: buf, data:__toBuffer([buf_chain])};\n}\n\n/** Chase down the sector linked lists */\nfunction make_sector_list(sectors, dir_start, fat_addrs, ssz) {\n\tvar sl = sectors.length, sector_list = ([]);\n\tvar chkd = [], buf = [], buf_chain = [];\n\tvar modulus = ssz - 1, i=0, j=0, k=0, jj=0;\n\tfor(i=0; i < sl; ++i) {\n\t\tbuf = ([]);\n\t\tk = (i + dir_start); if(k >= sl) k-=sl;\n\t\tif(chkd[k]) continue;\n\t\tbuf_chain = [];\n\t\tvar seen = [];\n\t\tfor(j=k; j>=0;) {\n\t\t\tseen[j] = true;\n\t\t\tchkd[j] = true;\n\t\t\tbuf[buf.length] = j;\n\t\t\tbuf_chain.push(sectors[j]);\n\t\t\tvar addr = fat_addrs[Math.floor(j*4/ssz)];\n\t\t\tjj = ((j*4) & modulus);\n\t\t\tif(ssz < 4 + jj) throw new Error(\"FAT boundary crossed: \" + j + \" 4 \"+ssz);\n\t\t\tif(!sectors[addr]) break;\n\t\t\tj = __readInt32LE(sectors[addr], jj);\n\t\t\tif(seen[j]) break;\n\t\t}\n\t\tsector_list[k] = ({nodes: buf, data:__toBuffer([buf_chain])});\n\t}\n\treturn sector_list;\n}\n\n/* [MS-CFB] 2.6.1 Compound File Directory Entry */\nfunction read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, mini) {\n\tvar minifat_store = 0, pl = (Paths.length?2:0);\n\tvar sector = sector_list[dir_start].data;\n\tvar i = 0, namelen = 0, name;\n\tfor(; i < sector.length; i+= 128) {\n\t\tvar blob = sector.slice(i, i+128);\n\t\tprep_blob(blob, 64);\n\t\tnamelen = blob.read_shift(2);\n\t\tname = __utf16le(blob,0,namelen-pl);\n\t\tPaths.push(name);\n\t\tvar o = ({\n\t\t\tname: name,\n\t\t\ttype: blob.read_shift(1),\n\t\t\tcolor: blob.read_shift(1),\n\t\t\tL: blob.read_shift(4, 'i'),\n\t\t\tR: blob.read_shift(4, 'i'),\n\t\t\tC: blob.read_shift(4, 'i'),\n\t\t\tclsid: blob.read_shift(16),\n\t\t\tstate: blob.read_shift(4, 'i'),\n\t\t\tstart: 0,\n\t\t\tsize: 0\n\t\t});\n\t\tvar ctime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);\n\t\tif(ctime !== 0) o.ct = read_date(blob, blob.l-8);\n\t\tvar mtime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);\n\t\tif(mtime !== 0) o.mt = read_date(blob, blob.l-8);\n\t\to.start = blob.read_shift(4, 'i');\n\t\to.size = blob.read_shift(4, 'i');\n\t\tif(o.size < 0 && o.start < 0) { o.size = o.type = 0; o.start = ENDOFCHAIN; o.name = \"\"; }\n\t\tif(o.type === 5) { /* root */\n\t\t\tminifat_store = o.start;\n\t\t\tif(nmfs > 0 && minifat_store !== ENDOFCHAIN) sector_list[minifat_store].name = \"!StreamData\";\n\t\t\t/*minifat_size = o.size;*/\n\t\t} else if(o.size >= 4096 /* MSCSZ */) {\n\t\t\to.storage = 'fat';\n\t\t\tif(sector_list[o.start] === undefined) sector_list[o.start] = get_sector_list(sectors, o.start, sector_list.fat_addrs, sector_list.ssz);\n\t\t\tsector_list[o.start].name = o.name;\n\t\t\to.content = (sector_list[o.start].data.slice(0,o.size));\n\t\t} else {\n\t\t\to.storage = 'minifat';\n\t\t\tif(o.size < 0) o.size = 0;\n\t\t\telse if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) {\n\t\t\t\to.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini]||{}).data);\n\t\t\t}\n\t\t}\n\t\tif(o.content) prep_blob(o.content, 0);\n\t\tfiles[name] = o;\n\t\tFileIndex.push(o);\n\t}\n}\n\nfunction read_date(blob, offset) {\n\treturn new Date(( ( (__readUInt32LE(blob,offset+4)/1e7)*Math.pow(2,32)+__readUInt32LE(blob,offset)/1e7 ) - 11644473600)*1000);\n}\n\nfunction read_file(filename, options) {\n\tget_fs();\n\treturn parse(fs.readFileSync(filename), options);\n}\n\nfunction read(blob, options) {\n\tswitch(options && options.type || \"base64\") {\n\t\tcase \"file\": return read_file(blob, options);\n\t\tcase \"base64\": return parse(s2a(Base64.decode(blob)), options);\n\t\tcase \"binary\": return parse(s2a(blob), options);\n\t}\n\treturn parse(blob, options);\n}\n\nfunction init_cfb(cfb, opts) {\n\tvar o = opts || {}, root = o.root || \"Root Entry\";\n\tif(!cfb.FullPaths) cfb.FullPaths = [];\n\tif(!cfb.FileIndex) cfb.FileIndex = [];\n\tif(cfb.FullPaths.length !== cfb.FileIndex.length) throw new Error(\"inconsistent CFB structure\");\n\tif(cfb.FullPaths.length === 0) {\n\t\tcfb.FullPaths[0] = root + \"/\";\n\t\tcfb.FileIndex[0] = ({ name: root, type: 5 });\n\t}\n\tif(o.CLSID) cfb.FileIndex[0].clsid = o.CLSID;\n\tseed_cfb(cfb);\n}\nfunction seed_cfb(cfb) {\n\tvar nm = \"\\u0001Sh33tJ5\";\n\tif(CFB.find(cfb, \"/\" + nm)) return;\n\tvar p = new_buf(4); p[0] = 55; p[1] = p[3] = 50; p[2] = 54;\n\tcfb.FileIndex.push(({ name: nm, type: 2, content:p, size:4, L:69, R:69, C:69 }));\n\tcfb.FullPaths.push(cfb.FullPaths[0] + nm);\n\trebuild_cfb(cfb);\n}\nfunction rebuild_cfb(cfb, f) {\n\tinit_cfb(cfb);\n\tvar gc = false, s = false;\n\tfor(var i = cfb.FullPaths.length - 1; i >= 0; --i) {\n\t\tvar _file = cfb.FileIndex[i];\n\t\tswitch(_file.type) {\n\t\t\tcase 0:\n\t\t\t\tif(s) gc = true;\n\t\t\t\telse { cfb.FileIndex.pop(); cfb.FullPaths.pop(); }\n\t\t\t\tbreak;\n\t\t\tcase 1: case 2: case 5:\n\t\t\t\ts = true;\n\t\t\t\tif(isNaN(_file.R * _file.L * _file.C)) gc = true;\n\t\t\t\tif(_file.R > -1 && _file.L > -1 && _file.R == _file.L) gc = true;\n\t\t\t\tbreak;\n\t\t\tdefault: gc = true; break;\n\t\t}\n\t}\n\tif(!gc && !f) return;\n\n\tvar now = new Date(1987, 1, 19), j = 0;\n\tvar data = [];\n\tfor(i = 0; i < cfb.FullPaths.length; ++i) {\n\t\tif(cfb.FileIndex[i].type === 0) continue;\n\t\tdata.push([cfb.FullPaths[i], cfb.FileIndex[i]]);\n\t}\n\tfor(i = 0; i < data.length; ++i) {\n\t\tvar dad = dirname(data[i][0]);\n\t\ts = false;\n\t\tfor(j = 0; j < data.length; ++j) if(data[j][0] === dad) s = true;\n\t\tif(!s) data.push([dad, ({\n\t\t\tname: filename(dad).replace(\"/\",\"\"),\n\t\t\ttype: 1,\n\t\t\tclsid: HEADER_CLSID,\n\t\t\tct: now, mt: now,\n\t\t\tcontent: null\n\t\t})]);\n\t}\n\n\tdata.sort(function(x,y) { return namecmp(x[0], y[0]); });\n\tcfb.FullPaths = []; cfb.FileIndex = [];\n\tfor(i = 0; i < data.length; ++i) { cfb.FullPaths[i] = data[i][0]; cfb.FileIndex[i] = data[i][1]; }\n\tfor(i = 0; i < data.length; ++i) {\n\t\tvar elt = cfb.FileIndex[i];\n\t\tvar nm = cfb.FullPaths[i];\n\n\t\telt.name = filename(nm).replace(\"/\",\"\");\n\t\telt.L = elt.R = elt.C = -(elt.color = 1);\n\t\telt.size = elt.content ? elt.content.length : 0;\n\t\telt.start = 0;\n\t\telt.clsid = (elt.clsid || HEADER_CLSID);\n\t\tif(i === 0) {\n\t\t\telt.C = data.length > 1 ? 1 : -1;\n\t\t\telt.size = 0;\n\t\t\telt.type = 5;\n\t\t} else if(nm.slice(-1) == \"/\") {\n\t\t\tfor(j=i+1;j < data.length; ++j) if(dirname(cfb.FullPaths[j])==nm) break;\n\t\t\telt.C = j >= data.length ? -1 : j;\n\t\t\tfor(j=i+1;j < data.length; ++j) if(dirname(cfb.FullPaths[j])==dirname(nm)) break;\n\t\t\telt.R = j >= data.length ? -1 : j;\n\t\t\telt.type = 1;\n\t\t} else {\n\t\t\tif(dirname(cfb.FullPaths[i+1]||\"\") == dirname(nm)) elt.R = i + 1;\n\t\t\telt.type = 2;\n\t\t}\n\t}\n\n}\n\nfunction _write(cfb, options) {\n\tvar _opts = options || {};\n\trebuild_cfb(cfb);\n\tif(_opts.fileType == 'zip') return write_zip(cfb, _opts);\n\tvar L = (function(cfb){\n\t\tvar mini_size = 0, fat_size = 0;\n\t\tfor(var i = 0; i < cfb.FileIndex.length; ++i) {\n\t\t\tvar file = cfb.FileIndex[i];\n\t\t\tif(!file.content) continue;\nvar flen = file.content.length;\n\t\t\tif(flen > 0){\n\t\t\t\tif(flen < 0x1000) mini_size += (flen + 0x3F) >> 6;\n\t\t\t\telse fat_size += (flen + 0x01FF) >> 9;\n\t\t\t}\n\t\t}\n\t\tvar dir_cnt = (cfb.FullPaths.length +3) >> 2;\n\t\tvar mini_cnt = (mini_size + 7) >> 3;\n\t\tvar mfat_cnt = (mini_size + 0x7F) >> 7;\n\t\tvar fat_base = mini_cnt + fat_size + dir_cnt + mfat_cnt;\n\t\tvar fat_cnt = (fat_base + 0x7F) >> 7;\n\t\tvar difat_cnt = fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt-109)/0x7F);\n\t\twhile(((fat_base + fat_cnt + difat_cnt + 0x7F) >> 7) > fat_cnt) difat_cnt = ++fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt-109)/0x7F);\n\t\tvar L = [1, difat_cnt, fat_cnt, mfat_cnt, dir_cnt, fat_size, mini_size, 0];\n\t\tcfb.FileIndex[0].size = mini_size << 6;\n\t\tL[7] = (cfb.FileIndex[0].start=L[0]+L[1]+L[2]+L[3]+L[4]+L[5])+((L[6]+7) >> 3);\n\t\treturn L;\n\t})(cfb);\n\tvar o = new_buf(L[7] << 9);\n\tvar i = 0, T = 0;\n\t{\n\t\tfor(i = 0; i < 8; ++i) o.write_shift(1, HEADER_SIG[i]);\n\t\tfor(i = 0; i < 8; ++i) o.write_shift(2, 0);\n\t\to.write_shift(2, 0x003E);\n\t\to.write_shift(2, 0x0003);\n\t\to.write_shift(2, 0xFFFE);\n\t\to.write_shift(2, 0x0009);\n\t\to.write_shift(2, 0x0006);\n\t\tfor(i = 0; i < 3; ++i) o.write_shift(2, 0);\n\t\to.write_shift(4, 0);\n\t\to.write_shift(4, L[2]);\n\t\to.write_shift(4, L[0] + L[1] + L[2] + L[3] - 1);\n\t\to.write_shift(4, 0);\n\t\to.write_shift(4, 1<<12);\n\t\to.write_shift(4, L[3] ? L[0] + L[1] + L[2] - 1: ENDOFCHAIN);\n\t\to.write_shift(4, L[3]);\n\t\to.write_shift(-4, L[1] ? L[0] - 1: ENDOFCHAIN);\n\t\to.write_shift(4, L[1]);\n\t\tfor(i = 0; i < 109; ++i) o.write_shift(-4, i < L[2] ? L[1] + i : -1);\n\t}\n\tif(L[1]) {\n\t\tfor(T = 0; T < L[1]; ++T) {\n\t\t\tfor(; i < 236 + T * 127; ++i) o.write_shift(-4, i < L[2] ? L[1] + i : -1);\n\t\t\to.write_shift(-4, T === L[1] - 1 ? ENDOFCHAIN : T + 1);\n\t\t}\n\t}\n\tvar chainit = function(w) {\n\t\tfor(T += w; i> 9);\n\t}\n\tchainit((L[6] + 7) >> 3);\n\twhile(o.l & 0x1FF) o.write_shift(-4, consts.ENDOFCHAIN);\n\tT = i = 0;\n\tfor(j = 0; j < cfb.FileIndex.length; ++j) {\n\t\tfile = cfb.FileIndex[j];\n\t\tif(!file.content) continue;\nflen = file.content.length;\n\t\tif(!flen || flen >= 0x1000) continue;\n\t\tfile.start = T;\n\t\tchainit((flen + 0x3F) >> 6);\n\t}\n\twhile(o.l & 0x1FF) o.write_shift(-4, consts.ENDOFCHAIN);\n\tfor(i = 0; i < L[4]<<2; ++i) {\n\t\tvar nm = cfb.FullPaths[i];\n\t\tif(!nm || nm.length === 0) {\n\t\t\tfor(j = 0; j < 17; ++j) o.write_shift(4, 0);\n\t\t\tfor(j = 0; j < 3; ++j) o.write_shift(4, -1);\n\t\t\tfor(j = 0; j < 12; ++j) o.write_shift(4, 0);\n\t\t\tcontinue;\n\t\t}\n\t\tfile = cfb.FileIndex[i];\n\t\tif(i === 0) file.start = file.size ? file.start - 1 : ENDOFCHAIN;\n\t\tvar _nm = (i === 0 && _opts.root) || file.name;\n\t\tflen = 2*(_nm.length+1);\n\t\to.write_shift(64, _nm, \"utf16le\");\n\t\to.write_shift(2, flen);\n\t\to.write_shift(1, file.type);\n\t\to.write_shift(1, file.color);\n\t\to.write_shift(-4, file.L);\n\t\to.write_shift(-4, file.R);\n\t\to.write_shift(-4, file.C);\n\t\tif(!file.clsid) for(j = 0; j < 4; ++j) o.write_shift(4, 0);\n\t\telse o.write_shift(16, file.clsid, \"hex\");\n\t\to.write_shift(4, file.state || 0);\n\t\to.write_shift(4, 0); o.write_shift(4, 0);\n\t\to.write_shift(4, 0); o.write_shift(4, 0);\n\t\to.write_shift(4, file.start);\n\t\to.write_shift(4, file.size); o.write_shift(4, 0);\n\t}\n\tfor(i = 1; i < cfb.FileIndex.length; ++i) {\n\t\tfile = cfb.FileIndex[i];\nif(file.size >= 0x1000) {\n\t\t\to.l = (file.start+1) << 9;\n\t\t\tfor(j = 0; j < file.size; ++j) o.write_shift(1, file.content[j]);\n\t\t\tfor(; j & 0x1FF; ++j) o.write_shift(1, 0);\n\t\t}\n\t}\n\tfor(i = 1; i < cfb.FileIndex.length; ++i) {\n\t\tfile = cfb.FileIndex[i];\nif(file.size > 0 && file.size < 0x1000) {\n\t\t\tfor(j = 0; j < file.size; ++j) o.write_shift(1, file.content[j]);\n\t\t\tfor(; j & 0x3F; ++j) o.write_shift(1, 0);\n\t\t}\n\t}\n\twhile(o.l < o.length) o.write_shift(1, 0);\n\treturn o;\n}\n/* [MS-CFB] 2.6.4 (Unicode 3.0.1 case conversion) */\nfunction find(cfb, path) {\n\tvar UCFullPaths = cfb.FullPaths.map(function(x) { return x.toUpperCase(); });\n\tvar UCPaths = UCFullPaths.map(function(x) { var y = x.split(\"/\"); return y[y.length - (x.slice(-1) == \"/\" ? 2 : 1)]; });\n\tvar k = false;\n\tif(path.charCodeAt(0) === 47 /* \"/\" */) { k = true; path = UCFullPaths[0].slice(0, -1) + path; }\n\telse k = path.indexOf(\"/\") !== -1;\n\tvar UCPath = path.toUpperCase();\n\tvar w = k === true ? UCFullPaths.indexOf(UCPath) : UCPaths.indexOf(UCPath);\n\tif(w !== -1) return cfb.FileIndex[w];\n\n\tvar m = !UCPath.match(chr1);\n\tUCPath = UCPath.replace(chr0,'');\n\tif(m) UCPath = UCPath.replace(chr1,'!');\n\tfor(w = 0; w < UCFullPaths.length; ++w) {\n\t\tif((m ? UCFullPaths[w].replace(chr1,'!') : UCFullPaths[w]).replace(chr0,'') == UCPath) return cfb.FileIndex[w];\n\t\tif((m ? UCPaths[w].replace(chr1,'!') : UCPaths[w]).replace(chr0,'') == UCPath) return cfb.FileIndex[w];\n\t}\n\treturn null;\n}\n/** CFB Constants */\nvar MSSZ = 64; /* Mini Sector Size = 1<<6 */\n//var MSCSZ = 4096; /* Mini Stream Cutoff Size */\n/* 2.1 Compound File Sector Numbers and Types */\nvar ENDOFCHAIN = -2;\n/* 2.2 Compound File Header */\nvar HEADER_SIGNATURE = 'd0cf11e0a1b11ae1';\nvar HEADER_SIG = [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1];\nvar HEADER_CLSID = '00000000000000000000000000000000';\nvar consts = {\n\t/* 2.1 Compund File Sector Numbers and Types */\n\tMAXREGSECT: -6,\n\tDIFSECT: -4,\n\tFATSECT: -3,\n\tENDOFCHAIN: ENDOFCHAIN,\n\tFREESECT: -1,\n\t/* 2.2 Compound File Header */\n\tHEADER_SIGNATURE: HEADER_SIGNATURE,\n\tHEADER_MINOR_VERSION: '3e00',\n\tMAXREGSID: -6,\n\tNOSTREAM: -1,\n\tHEADER_CLSID: HEADER_CLSID,\n\t/* 2.6.1 Compound File Directory Entry */\n\tEntryTypes: ['unknown','storage','stream','lockbytes','property','root']\n};\n\nfunction write_file(cfb, filename, options) {\n\tget_fs();\n\tvar o = _write(cfb, options);\nfs.writeFileSync(filename, o);\n}\n\nfunction a2s(o) {\n\tvar out = new Array(o.length);\n\tfor(var i = 0; i < o.length; ++i) out[i] = String.fromCharCode(o[i]);\n\treturn out.join(\"\");\n}\n\nfunction write(cfb, options) {\n\tvar o = _write(cfb, options);\n\tswitch(options && options.type) {\n\t\tcase \"file\": get_fs(); fs.writeFileSync(options.filename, (o)); return o;\n\t\tcase \"binary\": return a2s(o);\n\t\tcase \"base64\": return Base64.encode(a2s(o));\n\t}\n\treturn o;\n}\n/* node < 8.1 zlib does not expose bytesRead, so default to pure JS */\nvar _zlib;\nfunction use_zlib(zlib) { try {\n\tvar InflateRaw = zlib.InflateRaw;\n\tvar InflRaw = new InflateRaw();\n\tInflRaw._processChunk(new Uint8Array([3, 0]), InflRaw._finishFlushFlag);\n\tif(InflRaw.bytesRead) _zlib = zlib;\n\telse throw new Error(\"zlib does not expose bytesRead\");\n} catch(e) {console.error(\"cannot use native zlib: \" + (e.message || e)); } }\n\nfunction _inflateRawSync(payload, usz) {\n\tif(!_zlib) return _inflate(payload, usz);\n\tvar InflateRaw = _zlib.InflateRaw;\n\tvar InflRaw = new InflateRaw();\n\tvar out = InflRaw._processChunk(payload.slice(payload.l), InflRaw._finishFlushFlag);\n\tpayload.l += InflRaw.bytesRead;\n\treturn out;\n}\n\nfunction _deflateRawSync(payload) {\n\treturn _zlib ? _zlib.deflateRawSync(payload) : _deflate(payload);\n}\nvar CLEN_ORDER = [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];\n\n/* LEN_ID = [ 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285 ]; */\nvar LEN_LN = [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13 , 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258 ];\n\n/* DST_ID = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ]; */\nvar DST_LN = [ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 ];\n\nfunction bit_swap_8(n) { var t = (((((n<<1)|(n<<11)) & 0x22110) | (((n<<5)|(n<<15)) & 0x88440))); return ((t>>16) | (t>>8) |t)&0xFF; }\n\nvar use_typed_arrays = typeof Uint8Array !== 'undefined';\n\nvar bitswap8 = use_typed_arrays ? new Uint8Array(1<<8) : [];\nfor(var q = 0; q < (1<<8); ++q) bitswap8[q] = bit_swap_8(q);\n\nfunction bit_swap_n(n, b) {\n\tvar rev = bitswap8[n & 0xFF];\n\tif(b <= 8) return rev >>> (8-b);\n\trev = (rev << 8) | bitswap8[(n>>8)&0xFF];\n\tif(b <= 16) return rev >>> (16-b);\n\trev = (rev << 8) | bitswap8[(n>>16)&0xFF];\n\treturn rev >>> (24-b);\n}\n\n/* helpers for unaligned bit reads */\nfunction read_bits_2(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 6 ? 0 : buf[h+1]<<8))>>>w)& 0x03; }\nfunction read_bits_3(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 5 ? 0 : buf[h+1]<<8))>>>w)& 0x07; }\nfunction read_bits_4(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 4 ? 0 : buf[h+1]<<8))>>>w)& 0x0F; }\nfunction read_bits_5(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 3 ? 0 : buf[h+1]<<8))>>>w)& 0x1F; }\nfunction read_bits_7(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 1 ? 0 : buf[h+1]<<8))>>>w)& 0x7F; }\n\n/* works up to n = 3 * 8 + 1 = 25 */\nfunction read_bits_n(buf, bl, n) {\n\tvar w = (bl&7), h = (bl>>>3), f = ((1<>> w;\n\tif(n < 8 - w) return v & f;\n\tv |= buf[h+1]<<(8-w);\n\tif(n < 16 - w) return v & f;\n\tv |= buf[h+2]<<(16-w);\n\tif(n < 24 - w) return v & f;\n\tv |= buf[h+3]<<(24-w);\n\treturn v & f;\n}\n\n/* until ArrayBuffer#realloc is a thing, fake a realloc */\nfunction realloc(b, sz) {\n\tvar L = b.length, M = 2*L > sz ? 2*L : sz + 5, i = 0;\n\tif(L >= sz) return b;\n\tif(has_buf) {\n\t\tvar o = new_unsafe_buf(M);\n\t\t// $FlowIgnore\n\t\tif(b.copy) b.copy(o);\n\t\telse for(; i < b.length; ++i) o[i] = b[i];\n\t\treturn o;\n\t} else if(use_typed_arrays) {\n\t\tvar a = new Uint8Array(M);\n\t\tif(a.set) a.set(b);\n\t\telse for(; i < b.length; ++i) a[i] = b[i];\n\t\treturn a;\n\t}\n\tb.length = M;\n\treturn b;\n}\n\n/* zero-filled arrays for older browsers */\nfunction zero_fill_array(n) {\n\tvar o = new Array(n);\n\tfor(var i = 0; i < n; ++i) o[i] = 0;\n\treturn o;\n}var _deflate = (function() {\nvar _deflateRaw = (function() {\n\treturn function deflateRaw(data, out) {\n\t\tvar boff = 0;\n\t\twhile(boff < data.length) {\n\t\t\tvar L = Math.min(0xFFFF, data.length - boff);\n\t\t\tvar h = boff + L == data.length;\n\t\t\t/* TODO: this is only type 0 stored */\n\t\t\tout.write_shift(1, +h);\n\t\t\tout.write_shift(2, L);\n\t\t\tout.write_shift(2, (~L) & 0xFFFF);\n\t\t\twhile(L-- > 0) out[out.l++] = data[boff++];\n\t\t}\n\t\treturn out.l;\n\t};\n})();\n\nreturn function(data) {\n\tvar buf = new_buf(50+Math.floor(data.length*1.1));\n\tvar off = _deflateRaw(data, buf);\n\treturn buf.slice(0, off);\n};\n})();\n/* modified inflate function also moves original read head */\n\n/* build tree (used for literals and lengths) */\nfunction build_tree(clens, cmap, MAX) {\n\tvar maxlen = 1, w = 0, i = 0, j = 0, ccode = 0, L = clens.length;\n\n\tvar bl_count = use_typed_arrays ? new Uint16Array(32) : zero_fill_array(32);\n\tfor(i = 0; i < 32; ++i) bl_count[i] = 0;\n\n\tfor(i = L; i < MAX; ++i) clens[i] = 0;\n\tL = clens.length;\n\n\tvar ctree = use_typed_arrays ? new Uint16Array(L) : zero_fill_array(L); // []\n\n\t/* build code tree */\n\tfor(i = 0; i < L; ++i) {\n\t\tbl_count[(w = clens[i])]++;\n\t\tif(maxlen < w) maxlen = w;\n\t\tctree[i] = 0;\n\t}\n\tbl_count[0] = 0;\n\tfor(i = 1; i <= maxlen; ++i) bl_count[i+16] = (ccode = (ccode + bl_count[i-1])<<1);\n\tfor(i = 0; i < L; ++i) {\n\t\tccode = clens[i];\n\t\tif(ccode != 0) ctree[i] = bl_count[ccode+16]++;\n\t}\n\n\t/* cmap[maxlen + 4 bits] = (off&15) + (lit<<4) reverse mapping */\n\tvar cleni = 0;\n\tfor(i = 0; i < L; ++i) {\n\t\tcleni = clens[i];\n\t\tif(cleni != 0) {\n\t\t\tccode = bit_swap_n(ctree[i], maxlen)>>(maxlen-cleni);\n\t\t\tfor(j = (1<<(maxlen + 4 - cleni)) - 1; j>=0; --j)\n\t\t\t\tcmap[ccode|(j<>(8-cleni);\n\t\t\tfor(var j = (1<<(7-cleni))-1; j>=0; --j) dyn_cmap[ccode|(j<>>= 3)) {\n\t\t\tcase 16:\n\t\t\t\tw = 3 + read_bits_2(data, boff); boff += 2;\n\t\t\t\tccode = hcodes[hcodes.length - 1];\n\t\t\t\twhile(w-- > 0) hcodes.push(ccode);\n\t\t\t\tbreak;\n\t\t\tcase 17:\n\t\t\t\tw = 3 + read_bits_3(data, boff); boff += 3;\n\t\t\t\twhile(w-- > 0) hcodes.push(0);\n\t\t\t\tbreak;\n\t\t\tcase 18:\n\t\t\t\tw = 11 + read_bits_7(data, boff); boff += 7;\n\t\t\t\twhile(w -- > 0) hcodes.push(0);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\thcodes.push(ccode);\n\t\t\t\tif(maxlen < ccode) maxlen = ccode;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/* build literal / length trees */\n\tvar h1 = hcodes.slice(0, _HLIT), h2 = hcodes.slice(_HLIT);\n\tfor(i = _HLIT; i < 286; ++i) h1[i] = 0;\n\tfor(i = _HDIST; i < 30; ++i) h2[i] = 0;\n\tdyn_len_1 = build_tree(h1, dyn_lmap, 286);\n\tdyn_len_2 = build_tree(h2, dyn_dmap, 30);\n\treturn boff;\n}\n\n/* return [ data, bytesRead ] */\nfunction inflate(data, usz) {\n\t/* shortcircuit for empty buffer [0x03, 0x00] */\n\tif(data[0] == 3 && !(data[1] & 0x3)) { return [new_raw_buf(usz), 2]; }\n\n\t/* bit offset */\n\tvar boff = 0;\n\n\t/* header includes final bit and type bits */\n\tvar header = 0;\n\n\tvar outbuf = new_unsafe_buf(usz ? usz : (1<<18));\n\tvar woff = 0;\n\tvar OL = outbuf.length>>>0;\n\tvar max_len_1 = 0, max_len_2 = 0;\n\n\twhile((header&1) == 0) {\n\t\theader = read_bits_3(data, boff); boff += 3;\n\t\tif((header >>> 1) == 0) {\n\t\t\t/* Stored block */\n\t\t\tif(boff & 7) boff += 8 - (boff&7);\n\t\t\t/* 2 bytes sz, 2 bytes bit inverse */\n\t\t\tvar sz = data[boff>>>3] | data[(boff>>>3)+1]<<8;\n\t\t\tboff += 32;\n\t\t\t/* push sz bytes */\n\t\t\tif(!usz && OL < woff + sz) { outbuf = realloc(outbuf, woff + sz); OL = outbuf.length; }\n\t\t\tif(typeof data.copy === 'function') {\n\t\t\t\t// $FlowIgnore\n\t\t\t\tdata.copy(outbuf, woff, boff>>>3, (boff>>>3)+sz);\n\t\t\t\twoff += sz; boff += 8*sz;\n\t\t\t} else while(sz-- > 0) { outbuf[woff++] = data[boff>>>3]; boff += 8; }\n\t\t\tcontinue;\n\t\t} else if((header >>> 1) == 1) {\n\t\t\t/* Fixed Huffman */\n\t\t\tmax_len_1 = 9; max_len_2 = 5;\n\t\t} else {\n\t\t\t/* Dynamic Huffman */\n\t\t\tboff = dyn(data, boff);\n\t\t\tmax_len_1 = dyn_len_1; max_len_2 = dyn_len_2;\n\t\t}\n\t\tif(!usz && (OL < woff + 32767)) { outbuf = realloc(outbuf, woff + 32767); OL = outbuf.length; }\n\t\tfor(;;) { // while(true) is apparently out of vogue in modern JS circles\n\t\t\t/* ingest code and move read head */\n\t\t\tvar bits = read_bits_n(data, boff, max_len_1);\n\t\t\tvar code = (header>>>1) == 1 ? fix_lmap[bits] : dyn_lmap[bits];\n\t\t\tboff += code & 15; code >>>= 4;\n\t\t\t/* 0-255 are literals, 256 is end of block token, 257+ are copy tokens */\n\t\t\tif(((code>>>8)&0xFF) === 0) outbuf[woff++] = code;\n\t\t\telse if(code == 256) break;\n\t\t\telse {\n\t\t\t\tcode -= 257;\n\t\t\t\tvar len_eb = (code < 8) ? 0 : ((code-4)>>2); if(len_eb > 5) len_eb = 0;\n\t\t\t\tvar tgt = woff + LEN_LN[code];\n\t\t\t\t/* length extra bits */\n\t\t\t\tif(len_eb > 0) {\n\t\t\t\t\ttgt += read_bits_n(data, boff, len_eb);\n\t\t\t\t\tboff += len_eb;\n\t\t\t\t}\n\n\t\t\t\t/* dist code */\n\t\t\t\tbits = read_bits_n(data, boff, max_len_2);\n\t\t\t\tcode = (header>>>1) == 1 ? fix_dmap[bits] : dyn_dmap[bits];\n\t\t\t\tboff += code & 15; code >>>= 4;\n\t\t\t\tvar dst_eb = (code < 4 ? 0 : (code-2)>>1);\n\t\t\t\tvar dst = DST_LN[code];\n\t\t\t\t/* dist extra bits */\n\t\t\t\tif(dst_eb > 0) {\n\t\t\t\t\tdst += read_bits_n(data, boff, dst_eb);\n\t\t\t\t\tboff += dst_eb;\n\t\t\t\t}\n\n\t\t\t\t/* in the common case, manual byte copy is faster than TA set / Buffer copy */\n\t\t\t\tif(!usz && OL < tgt) { outbuf = realloc(outbuf, tgt); OL = outbuf.length; }\n\t\t\t\twhile(woff < tgt) { outbuf[woff] = outbuf[woff - dst]; ++woff; }\n\t\t\t}\n\t\t}\n\t}\n\treturn [usz ? outbuf : outbuf.slice(0, woff), (boff+7)>>>3];\n}\n\nfunction _inflate(payload, usz) {\n\tvar data = payload.slice(payload.l||0);\n\tvar out = inflate(data, usz);\n\tpayload.l += out[1];\n\treturn out[0];\n}\n\nfunction warn_or_throw(wrn, msg) {\n\tif(wrn) { if(typeof console !== 'undefined') console.error(msg); }\n\telse throw new Error(msg);\n}\n\nfunction parse_zip(file, options) {\n\tvar blob = file;\n\tprep_blob(blob, 0);\n\n\tvar FileIndex = [], FullPaths = [];\n\tvar o = {\n\t\tFileIndex: FileIndex,\n\t\tFullPaths: FullPaths\n\t};\n\tinit_cfb(o, { root: options.root });\n\n\t/* find end of central directory, start just after signature */\n\tvar i = blob.length - 4;\n\twhile((blob[i] != 0x50 || blob[i+1] != 0x4b || blob[i+2] != 0x05 || blob[i+3] != 0x06) && i >= 0) --i;\n\tblob.l = i + 4;\n\n\t/* parse end of central directory */\n\tblob.l += 4;\n\tvar fcnt = blob.read_shift(2);\n\tblob.l += 6;\n\tvar start_cd = blob.read_shift(4);\n\n\t/* parse central directory */\n\tblob.l = start_cd;\n\n\tfor(i = 0; i < fcnt; ++i) {\n\t\t/* trust local file header instead of CD entry */\n\t\tblob.l += 20;\n\t\tvar csz = blob.read_shift(4);\n\t\tvar usz = blob.read_shift(4);\n\t\tvar namelen = blob.read_shift(2);\n\t\tvar efsz = blob.read_shift(2);\n\t\tvar fcsz = blob.read_shift(2);\n\t\tblob.l += 8;\n\t\tvar offset = blob.read_shift(4);\n\t\tvar EF = parse_extra_field(blob.slice(blob.l+namelen, blob.l+namelen+efsz));\n\t\tblob.l += namelen + efsz + fcsz;\n\n\t\tvar L = blob.l;\n\t\tblob.l = offset + 4;\n\t\tparse_local_file(blob, csz, usz, o, EF);\n\t\tblob.l = L;\n\t}\n\n\treturn o;\n}\n\n\n/* head starts just after local file header signature */\nfunction parse_local_file(blob, csz, usz, o, EF) {\n\t/* [local file header] */\n\tblob.l += 2;\n\tvar flags = blob.read_shift(2);\n\tvar meth = blob.read_shift(2);\n\tvar date = parse_dos_date(blob);\n\n\tif(flags & 0x2041) throw new Error(\"Unsupported ZIP encryption\");\n\tvar crc32 = blob.read_shift(4);\n\tvar _csz = blob.read_shift(4);\n\tvar _usz = blob.read_shift(4);\n\n\tvar namelen = blob.read_shift(2);\n\tvar efsz = blob.read_shift(2);\n\n\t// TODO: flags & (1<<11) // UTF8\n\tvar name = \"\"; for(var i = 0; i < namelen; ++i) name += String.fromCharCode(blob[blob.l++]);\n\tif(efsz) {\n\t\tvar ef = parse_extra_field(blob.slice(blob.l, blob.l + efsz));\n\t\tif((ef[0x5455]||{}).mt) date = ef[0x5455].mt;\n\t\tif(((EF||{})[0x5455]||{}).mt) date = EF[0x5455].mt;\n\t}\n\tblob.l += efsz;\n\n\t/* [encryption header] */\n\n\t/* [file data] */\n\tvar data = blob.slice(blob.l, blob.l + _csz);\n\tswitch(meth) {\n\t\tcase 8: data = _inflateRawSync(blob, _usz); break;\n\t\tcase 0: break;\n\t\tdefault: throw new Error(\"Unsupported ZIP Compression method \" + meth);\n\t}\n\n\t/* [data descriptor] */\n\tvar wrn = false;\n\tif(flags & 8) {\n\t\tcrc32 = blob.read_shift(4);\n\t\tif(crc32 == 0x08074b50) { crc32 = blob.read_shift(4); wrn = true; }\n\t\t_csz = blob.read_shift(4);\n\t\t_usz = blob.read_shift(4);\n\t}\n\n\tif(_csz != csz) warn_or_throw(wrn, \"Bad compressed size: \" + csz + \" != \" + _csz);\n\tif(_usz != usz) warn_or_throw(wrn, \"Bad uncompressed size: \" + usz + \" != \" + _usz);\n\tvar _crc32 = CRC32.buf(data, 0);\n\tif((crc32>>0) != (_crc32>>0)) warn_or_throw(wrn, \"Bad CRC32 checksum: \" + crc32 + \" != \" + _crc32);\n\tcfb_add(o, name, data, {unsafe: true, mt: date});\n}\nfunction write_zip(cfb, options) {\n\tvar _opts = options || {};\n\tvar out = [], cdirs = [];\n\tvar o = new_buf(1);\n\tvar method = (_opts.compression ? 8 : 0), flags = 0;\n\tvar desc = false;\n\tif(desc) flags |= 8;\n\tvar i = 0, j = 0;\n\n\tvar start_cd = 0, fcnt = 0;\n\tvar root = cfb.FullPaths[0], fp = root, fi = cfb.FileIndex[0];\n\tvar crcs = [];\n\tvar sz_cd = 0;\n\n\tfor(i = 1; i < cfb.FullPaths.length; ++i) {\n\t\tfp = cfb.FullPaths[i].slice(root.length); fi = cfb.FileIndex[i];\n\t\tif(!fi.size || !fi.content || fp == \"\\u0001Sh33tJ5\") continue;\n\t\tvar start = start_cd;\n\n\t\t/* TODO: CP437 filename */\n\t\tvar namebuf = new_buf(fp.length);\n\t\tfor(j = 0; j < fp.length; ++j) namebuf.write_shift(1, fp.charCodeAt(j) & 0x7F);\n\t\tnamebuf = namebuf.slice(0, namebuf.l);\n\t\tcrcs[fcnt] = CRC32.buf(fi.content, 0);\n\n\t\tvar outbuf = fi.content;\n\t\tif(method == 8) outbuf = _deflateRawSync(outbuf);\n\n\t\t/* local file header */\n\t\to = new_buf(30);\n\t\to.write_shift(4, 0x04034b50);\n\t\to.write_shift(2, 20);\n\t\to.write_shift(2, flags);\n\t\to.write_shift(2, method);\n\t\t/* TODO: last mod file time/date */\n\t\tif(fi.mt) write_dos_date(o, fi.mt);\n\t\telse o.write_shift(4, 0);\n\t\to.write_shift(-4, (flags & 8) ? 0 : crcs[fcnt]);\n\t\to.write_shift(4, (flags & 8) ? 0 : outbuf.length);\n\t\to.write_shift(4, (flags & 8) ? 0 : fi.content.length);\n\t\to.write_shift(2, namebuf.length);\n\t\to.write_shift(2, 0);\n\n\t\tstart_cd += o.length;\n\t\tout.push(o);\n\t\tstart_cd += namebuf.length;\n\t\tout.push(namebuf);\n\n\t\t/* TODO: encryption header ? */\n\t\tstart_cd += outbuf.length;\n\t\tout.push(outbuf);\n\n\t\t/* data descriptor */\n\t\tif(flags & 8) {\n\t\t\to = new_buf(12);\n\t\t\to.write_shift(-4, crcs[fcnt]);\n\t\t\to.write_shift(4, outbuf.length);\n\t\t\to.write_shift(4, fi.content.length);\n\t\t\tstart_cd += o.l;\n\t\t\tout.push(o);\n\t\t}\n\n\t\t/* central directory */\n\t\to = new_buf(46);\n\t\to.write_shift(4, 0x02014b50);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 20);\n\t\to.write_shift(2, flags);\n\t\to.write_shift(2, method);\n\t\to.write_shift(4, 0); /* TODO: last mod file time/date */\n\t\to.write_shift(-4, crcs[fcnt]);\n\n\t\to.write_shift(4, outbuf.length);\n\t\to.write_shift(4, fi.content.length);\n\t\to.write_shift(2, namebuf.length);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(4, 0);\n\t\to.write_shift(4, start);\n\n\t\tsz_cd += o.l;\n\t\tcdirs.push(o);\n\t\tsz_cd += namebuf.length;\n\t\tcdirs.push(namebuf);\n\t\t++fcnt;\n\t}\n\n\t/* end of central directory */\n\to = new_buf(22);\n\to.write_shift(4, 0x06054b50);\n\to.write_shift(2, 0);\n\to.write_shift(2, 0);\n\to.write_shift(2, fcnt);\n\to.write_shift(2, fcnt);\n\to.write_shift(4, sz_cd);\n\to.write_shift(4, start_cd);\n\to.write_shift(2, 0);\n\n\treturn bconcat(([bconcat((out)), bconcat(cdirs), o]));\n}\nfunction cfb_new(opts) {\n\tvar o = ({});\n\tinit_cfb(o, opts);\n\treturn o;\n}\n\nfunction cfb_add(cfb, name, content, opts) {\n\tvar unsafe = opts && opts.unsafe;\n\tif(!unsafe) init_cfb(cfb);\n\tvar file = !unsafe && CFB.find(cfb, name);\n\tif(!file) {\n\t\tvar fpath = cfb.FullPaths[0];\n\t\tif(name.slice(0, fpath.length) == fpath) fpath = name;\n\t\telse {\n\t\t\tif(fpath.slice(-1) != \"/\") fpath += \"/\";\n\t\t\tfpath = (fpath + name).replace(\"//\",\"/\");\n\t\t}\n\t\tfile = ({name: filename(name), type: 2});\n\t\tcfb.FileIndex.push(file);\n\t\tcfb.FullPaths.push(fpath);\n\t\tif(!unsafe) CFB.utils.cfb_gc(cfb);\n\t}\nfile.content = (content);\n\tfile.size = content ? content.length : 0;\n\tif(opts) {\n\t\tif(opts.CLSID) file.clsid = opts.CLSID;\n\t\tif(opts.mt) file.mt = opts.mt;\n\t\tif(opts.ct) file.ct = opts.ct;\n\t}\n\treturn file;\n}\n\nfunction cfb_del(cfb, name) {\n\tinit_cfb(cfb);\n\tvar file = CFB.find(cfb, name);\n\tif(file) for(var j = 0; j < cfb.FileIndex.length; ++j) if(cfb.FileIndex[j] == file) {\n\t\tcfb.FileIndex.splice(j, 1);\n\t\tcfb.FullPaths.splice(j, 1);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction cfb_mov(cfb, old_name, new_name) {\n\tinit_cfb(cfb);\n\tvar file = CFB.find(cfb, old_name);\n\tif(file) for(var j = 0; j < cfb.FileIndex.length; ++j) if(cfb.FileIndex[j] == file) {\n\t\tcfb.FileIndex[j].name = filename(new_name);\n\t\tcfb.FullPaths[j] = new_name;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction cfb_gc(cfb) { rebuild_cfb(cfb, true); }\n\nexports.find = find;\nexports.read = read;\nexports.parse = parse;\nexports.write = write;\nexports.writeFile = write_file;\nexports.utils = {\n\tcfb_new: cfb_new,\n\tcfb_add: cfb_add,\n\tcfb_del: cfb_del,\n\tcfb_mov: cfb_mov,\n\tcfb_gc: cfb_gc,\n\tReadShift: ReadShift,\n\tCheckField: CheckField,\n\tprep_blob: prep_blob,\n\tbconcat: bconcat,\n\tuse_zlib: use_zlib,\n\t_deflateRaw: _deflate,\n\t_inflateRaw: _inflate,\n\tconsts: consts\n};\n\nreturn exports;\n})();\n\nif(typeof require !== 'undefined' && typeof module !== 'undefined' && typeof DO_NOT_EXPORT_CFB === 'undefined') { module.exports = CFB; }\nvar _fs;\nif(typeof require !== 'undefined') try { _fs = require('fs'); } catch(e) {}\n\n/* normalize data for blob ctor */\nfunction blobify(data) {\n\tif(typeof data === \"string\") return s2ab(data);\n\tif(Array.isArray(data)) return a2u(data);\n\treturn data;\n}\n/* write or download file */\nfunction write_dl(fname, payload, enc) {\n\t/*global IE_SaveFile, Blob, navigator, saveAs, document, File, chrome */\n\tif(typeof _fs !== 'undefined' && _fs.writeFileSync) return enc ? _fs.writeFileSync(fname, payload, enc) : _fs.writeFileSync(fname, payload);\n\tvar data = (enc == \"utf8\") ? utf8write(payload) : payload;\nif(typeof IE_SaveFile !== 'undefined') return IE_SaveFile(data, fname);\n\tif(typeof Blob !== 'undefined') {\n\t\tvar blob = new Blob([blobify(data)], {type:\"application/octet-stream\"});\nif(typeof navigator !== 'undefined' && navigator.msSaveBlob) return navigator.msSaveBlob(blob, fname);\nif(typeof saveAs !== 'undefined') return saveAs(blob, fname);\n\t\tif(typeof URL !== 'undefined' && typeof document !== 'undefined' && document.createElement && URL.createObjectURL) {\n\t\t\tvar url = URL.createObjectURL(blob);\nif(typeof chrome === 'object' && typeof (chrome.downloads||{}).download == \"function\") {\n\t\t\t\tif(URL.revokeObjectURL && typeof setTimeout !== 'undefined') setTimeout(function() { URL.revokeObjectURL(url); }, 60000);\n\t\t\t\treturn chrome.downloads.download({ url: url, filename: fname, saveAs: true});\n\t\t\t}\n\t\t\tvar a = document.createElement(\"a\");\n\t\t\tif(a.download != null) {\na.download = fname; a.href = url; document.body.appendChild(a); a.click();\ndocument.body.removeChild(a);\n\t\t\t\tif(URL.revokeObjectURL && typeof setTimeout !== 'undefined') setTimeout(function() { URL.revokeObjectURL(url); }, 60000);\n\t\t\t\treturn url;\n\t\t\t}\n\t\t}\n\t}\n\t// $FlowIgnore\n\tif(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript\n\t\t// $FlowIgnore\n\t\tvar out = File(fname); out.open(\"w\"); out.encoding = \"binary\";\n\t\tif(Array.isArray(payload)) payload = a2s(payload);\n\t\tout.write(payload); out.close(); return payload;\n\t} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; }\n\tthrow new Error(\"cannot save file \" + fname);\n}\n\n/* read binary data from file */\nfunction read_binary(path) {\n\tif(typeof _fs !== 'undefined') return _fs.readFileSync(path);\n\t// $FlowIgnore\n\tif(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript\n\t\t// $FlowIgnore\n\t\tvar infile = File(path); infile.open(\"r\"); infile.encoding = \"binary\";\n\t\tvar data = infile.read(); infile.close();\n\t\treturn data;\n\t} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; }\n\tthrow new Error(\"Cannot access file \" + path);\n}\nfunction keys(o) {\n\tvar ks = Object.keys(o), o2 = [];\n\tfor(var i = 0; i < ks.length; ++i) if(Object.prototype.hasOwnProperty.call(o, ks[i])) o2.push(ks[i]);\n\treturn o2;\n}\n\nfunction evert_key(obj, key) {\n\tvar o = ([]), K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) if(o[obj[K[i]][key]] == null) o[obj[K[i]][key]] = K[i];\n\treturn o;\n}\n\nfunction evert(obj) {\n\tvar o = ([]), K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = K[i];\n\treturn o;\n}\n\nfunction evert_num(obj) {\n\tvar o = ([]), K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = parseInt(K[i],10);\n\treturn o;\n}\n\nfunction evert_arr(obj) {\n\tvar o = ([]), K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) {\n\t\tif(o[obj[K[i]]] == null) o[obj[K[i]]] = [];\n\t\to[obj[K[i]]].push(K[i]);\n\t}\n\treturn o;\n}\n\nvar basedate = new Date(1899, 11, 30, 0, 0, 0); // 2209161600000\nfunction datenum(v, date1904) {\n\tvar epoch = v.getTime();\n\tif(date1904) epoch -= 1462*24*60*60*1000;\n\tvar dnthresh = basedate.getTime() + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000;\n\treturn (epoch - dnthresh) / (24 * 60 * 60 * 1000);\n}\nvar refdate = new Date();\nvar dnthresh = basedate.getTime() + (refdate.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000;\nvar refoffset = refdate.getTimezoneOffset();\nfunction numdate(v) {\n\tvar out = new Date();\n\tout.setTime(v * 24 * 60 * 60 * 1000 + dnthresh);\n\tif (out.getTimezoneOffset() !== refoffset) {\n\t\tout.setTime(out.getTime() + (out.getTimezoneOffset() - refoffset) * 60000);\n\t}\n\treturn out;\n}\n\n/* ISO 8601 Duration */\nfunction parse_isodur(s) {\n\tvar sec = 0, mt = 0, time = false;\n\tvar m = s.match(/P([0-9\\.]+Y)?([0-9\\.]+M)?([0-9\\.]+D)?T([0-9\\.]+H)?([0-9\\.]+M)?([0-9\\.]+S)?/);\n\tif(!m) throw new Error(\"|\" + s + \"| is not an ISO8601 Duration\");\n\tfor(var i = 1; i != m.length; ++i) {\n\t\tif(!m[i]) continue;\n\t\tmt = 1;\n\t\tif(i > 3) time = true;\n\t\tswitch(m[i].slice(m[i].length-1)) {\n\t\t\tcase 'Y':\n\t\t\t\tthrow new Error(\"Unsupported ISO Duration Field: \" + m[i].slice(m[i].length-1));\n\t\t\tcase 'D': mt *= 24;\n\t\t\t\t/* falls through */\n\t\t\tcase 'H': mt *= 60;\n\t\t\t\t/* falls through */\n\t\t\tcase 'M':\n\t\t\t\tif(!time) throw new Error(\"Unsupported ISO Duration Field: M\");\n\t\t\t\telse mt *= 60;\n\t\t\t\t/* falls through */\n\t\t\tcase 'S': break;\n\t\t}\n\t\tsec += mt * parseInt(m[i], 10);\n\t}\n\treturn sec;\n}\n\nvar good_pd_date = new Date('2017-02-19T19:06:09.000Z');\nif(isNaN(good_pd_date.getFullYear())) good_pd_date = new Date('2/19/17');\nvar good_pd = good_pd_date.getFullYear() == 2017;\n/* parses a date as a local date */\nfunction parseDate(str, fixdate) {\n\tvar d = new Date(str);\n\tif(good_pd) {\nif(fixdate > 0) d.setTime(d.getTime() + d.getTimezoneOffset() * 60 * 1000);\n\t\telse if(fixdate < 0) d.setTime(d.getTime() - d.getTimezoneOffset() * 60 * 1000);\n\t\treturn d;\n\t}\n\tif(str instanceof Date) return str;\n\tif(good_pd_date.getFullYear() == 1917 && !isNaN(d.getFullYear())) {\n\t\tvar s = d.getFullYear();\n\t\tif(str.indexOf(\"\" + s) > -1) return d;\n\t\td.setFullYear(d.getFullYear() + 100); return d;\n\t}\n\tvar n = str.match(/\\d+/g)||[\"2017\",\"2\",\"19\",\"0\",\"0\",\"0\"];\n\tvar out = new Date(+n[0], +n[1] - 1, +n[2], (+n[3]||0), (+n[4]||0), (+n[5]||0));\n\tif(str.indexOf(\"Z\") > -1) out = new Date(out.getTime() - out.getTimezoneOffset() * 60 * 1000);\n\treturn out;\n}\n\nfunction cc2str(arr) {\n\tvar o = \"\";\n\tfor(var i = 0; i != arr.length; ++i) o += String.fromCharCode(arr[i]);\n\treturn o;\n}\n\nfunction dup(o) {\n\tif(typeof JSON != 'undefined' && !Array.isArray(o)) return JSON.parse(JSON.stringify(o));\n\tif(typeof o != 'object' || o == null) return o;\n\tif(o instanceof Date) return new Date(o.getTime());\n\tvar out = {};\n\tfor(var k in o) if(Object.prototype.hasOwnProperty.call(o, k)) out[k] = dup(o[k]);\n\treturn out;\n}\n\nfunction fill(c,l) { var o = \"\"; while(o.length < l) o+=c; return o; }\n\n/* TODO: stress test */\nfunction fuzzynum(s) {\n\tvar v = Number(s);\n\tif(isFinite(v)) return v;\n\tif(!isNaN(v)) return NaN;\n\tif(!/\\d/.test(s)) return v;\n\tvar wt = 1;\n\tvar ss = s.replace(/([\\d]),([\\d])/g,\"$1$2\").replace(/[$]/g,\"\").replace(/[%]/g, function() { wt *= 100; return \"\";});\n\tif(!isNaN(v = Number(ss))) return v / wt;\n\tss = ss.replace(/[(](.*)[)]/,function($$, $1) { wt = -wt; return $1;});\n\tif(!isNaN(v = Number(ss))) return v / wt;\n\treturn v;\n}\nfunction fuzzydate(s) {\n\tvar o = new Date(s), n = new Date(NaN);\n\tvar y = o.getYear(), m = o.getMonth(), d = o.getDate();\n\tif(isNaN(d)) return n;\n\tif(y < 0 || y > 8099) return n;\n\tif((m > 0 || d > 1) && y != 101) return o;\n\tif(s.toLowerCase().match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) return o;\n\tif(s.match(/[^-0-9:,\\/\\\\]/)) return n;\n\treturn o;\n}\n\nvar safe_split_regex = \"abacaba\".split(/(:?b)/i).length == 5;\nfunction split_regex(str, re, def) {\n\tif(safe_split_regex || typeof re == \"string\") return str.split(re);\n\tvar p = str.split(re), o = [p[0]];\n\tfor(var i = 1; i < p.length; ++i) { o.push(def); o.push(p[i]); }\n\treturn o;\n}\nfunction getdatastr(data) {\n\tif(!data) return null;\n\tif(data.data) return debom(data.data);\n\tif(data.asNodeBuffer && has_buf) return debom(data.asNodeBuffer().toString('binary'));\n\tif(data.asBinary) return debom(data.asBinary());\n\tif(data._data && data._data.getContent) return debom(cc2str(Array.prototype.slice.call(data._data.getContent(),0)));\n\tif(data.content && data.type) return debom(cc2str(data.content));\n\treturn null;\n}\n\nfunction getdatabin(data) {\n\tif(!data) return null;\n\tif(data.data) return char_codes(data.data);\n\tif(data.asNodeBuffer && has_buf) return data.asNodeBuffer();\n\tif(data._data && data._data.getContent) {\n\t\tvar o = data._data.getContent();\n\t\tif(typeof o == \"string\") return char_codes(o);\n\t\treturn Array.prototype.slice.call(o);\n\t}\n\tif(data.content && data.type) return data.content;\n\treturn null;\n}\n\nfunction getdata(data) { return (data && data.name.slice(-4) === \".bin\") ? getdatabin(data) : getdatastr(data); }\n\n/* Part 2 Section 10.1.2 \"Mapping Content Types\" Names are case-insensitive */\n/* OASIS does not comment on filename case sensitivity */\nfunction safegetzipfile(zip, file) {\n\tvar k = zip.FullPaths || keys(zip.files);\n\tvar f = file.toLowerCase().replace(/[\\/]/g, '\\\\'), g = f.replace(/\\\\/g,'\\/');\n\tfor(var i=0; i\\/]+)\\s*=\\s*((?:\")([^\"]*)(?:\")|(?:')([^']*)(?:')|([^'\">\\s]+))/g;\nvar tagregex=/<[\\/\\?]?[a-zA-Z0-9:_-]+(?:\\s+[^\"\\s?>\\/]+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^'\">\\s=]+))*\\s*[\\/\\?]?>/mg;\n\nif(!(XML_HEADER.match(tagregex))) tagregex = /<[^>]*>/g;\nvar nsregex=/<\\w*:/, nsregex2 = /<(\\/?)\\w+:/;\nfunction parsexmltag(tag, skip_root, skip_LC) {\n\tvar z = ({});\n\tvar eq = 0, c = 0;\n\tfor(; eq !== tag.length; ++eq) if((c = tag.charCodeAt(eq)) === 32 || c === 10 || c === 13) break;\n\tif(!skip_root) z[0] = tag.slice(0, eq);\n\tif(eq === tag.length) return z;\n\tvar m = tag.match(attregexg), j=0, v=\"\", i=0, q=\"\", cc=\"\", quot = 1;\n\tif(m) for(i = 0; i != m.length; ++i) {\n\t\tcc = m[i];\n\t\tfor(c=0; c != cc.length; ++c) if(cc.charCodeAt(c) === 61) break;\n\t\tq = cc.slice(0,c).trim();\n\t\twhile(cc.charCodeAt(c+1) == 32) ++c;\n\t\tquot = ((eq=cc.charCodeAt(c+1)) == 34 || eq == 39) ? 1 : 0;\n\t\tv = cc.slice(c+1+quot, cc.length-quot);\n\t\tfor(j=0;j!=q.length;++j) if(q.charCodeAt(j) === 58) break;\n\t\tif(j===q.length) {\n\t\t\tif(q.indexOf(\"_\") > 0) q = q.slice(0, q.indexOf(\"_\")); // from ods\n\t\t\tz[q] = v;\n\t\t\tif(!skip_LC) z[q.toLowerCase()] = v;\n\t\t}\n\t\telse {\n\t\t\tvar k = (j===5 && q.slice(0,5)===\"xmlns\"?\"xmlns\":\"\")+q.slice(j+1);\n\t\t\tif(z[k] && q.slice(j-3,j) == \"ext\") continue; // from ods\n\t\t\tz[k] = v;\n\t\t\tif(!skip_LC) z[k.toLowerCase()] = v;\n\t\t}\n\t}\n\treturn z;\n}\nfunction strip_ns(x) { return x.replace(nsregex2, \"<$1\"); }\n\nvar encodings = {\n\t'"': '\"',\n\t''': \"'\",\n\t'>': '>',\n\t'<': '<',\n\t'&': '&'\n};\nvar rencoding = evert(encodings);\n//var rencstr = \"&<>'\\\"\".split(\"\");\n\n// TODO: CP remap (need to read file version to determine OS)\nvar unescapexml = (function() {\n\t/* 22.4.2.4 bstr (Basic String) */\n\tvar encregex = /&(?:quot|apos|gt|lt|amp|#x?([\\da-fA-F]+));/ig, coderegex = /_x([\\da-fA-F]{4})_/ig;\n\treturn function unescapexml(text) {\n\t\tvar s = text + '', i = s.indexOf(\"-1?16:10))||$$; }).replace(coderegex,function(m,c) {return String.fromCharCode(parseInt(c,16));});\n\t\tvar j = s.indexOf(\"]]>\");\n\t\treturn unescapexml(s.slice(0, i)) + s.slice(i+9,j) + unescapexml(s.slice(j+3));\n\t};\n})();\n\nvar decregex=/[&<>'\"]/g, charegex = /[\\u0000-\\u0008\\u000b-\\u001f]/g;\nfunction escapexml(text){\n\tvar s = text + '';\n\treturn s.replace(decregex, function(y) { return rencoding[y]; }).replace(charegex,function(s) { return \"_x\" + (\"000\"+s.charCodeAt(0).toString(16)).slice(-4) + \"_\";});\n}\nfunction escapexmltag(text){ return escapexml(text).replace(/ /g,\"_x0020_\"); }\n\nvar htmlcharegex = /[\\u0000-\\u001f]/g;\nfunction escapehtml(text){\n\tvar s = text + '';\n\treturn s.replace(decregex, function(y) { return rencoding[y]; }).replace(/\\n/g, \"
\").replace(htmlcharegex,function(s) { return \"&#x\" + (\"000\"+s.charCodeAt(0).toString(16)).slice(-4) + \";\"; });\n}\n\nfunction escapexlml(text){\n\tvar s = text + '';\n\treturn s.replace(decregex, function(y) { return rencoding[y]; }).replace(htmlcharegex,function(s) { return \"&#x\" + (s.charCodeAt(0).toString(16)).toUpperCase() + \";\"; });\n}\n\n/* TODO: handle codepages */\nvar xlml_fixstr = (function() {\n\tvar entregex = /&#(\\d+);/g;\n\tfunction entrepl($$,$1) { return String.fromCharCode(parseInt($1,10)); }\n\treturn function xlml_fixstr(str) { return str.replace(entregex,entrepl); };\n})();\nvar xlml_unfixstr = (function() {\n\treturn function xlml_unfixstr(str) { return str.replace(/(\\r\\n|[\\r\\n])/g,\"\\ \"); };\n})();\n\nfunction parsexmlbool(value) {\n\tswitch(value) {\n\t\tcase 1: case true: case '1': case 'true': case 'TRUE': return true;\n\t\t/* case '0': case 'false': case 'FALSE':*/\n\t\tdefault: return false;\n\t}\n}\n\nvar utf8read = function utf8reada(orig) {\n\tvar out = \"\", i = 0, c = 0, d = 0, e = 0, f = 0, w = 0;\n\twhile (i < orig.length) {\n\t\tc = orig.charCodeAt(i++);\n\t\tif (c < 128) { out += String.fromCharCode(c); continue; }\n\t\td = orig.charCodeAt(i++);\n\t\tif (c>191 && c<224) { f = ((c & 31) << 6); f |= (d & 63); out += String.fromCharCode(f); continue; }\n\t\te = orig.charCodeAt(i++);\n\t\tif (c < 240) { out += String.fromCharCode(((c & 15) << 12) | ((d & 63) << 6) | (e & 63)); continue; }\n\t\tf = orig.charCodeAt(i++);\n\t\tw = (((c & 7) << 18) | ((d & 63) << 12) | ((e & 63) << 6) | (f & 63))-65536;\n\t\tout += String.fromCharCode(0xD800 + ((w>>>10)&1023));\n\t\tout += String.fromCharCode(0xDC00 + (w&1023));\n\t}\n\treturn out;\n};\n\nvar utf8write = function(orig) {\n\tvar out = [], i = 0, c = 0, d = 0;\n\twhile(i < orig.length) {\n\t\tc = orig.charCodeAt(i++);\n\t\tswitch(true) {\n\t\t\tcase c < 128: out.push(String.fromCharCode(c)); break;\n\t\t\tcase c < 2048:\n\t\t\t\tout.push(String.fromCharCode(192 + (c >> 6)));\n\t\t\t\tout.push(String.fromCharCode(128 + (c & 63)));\n\t\t\t\tbreak;\n\t\t\tcase c >= 55296 && c < 57344:\n\t\t\t\tc -= 55296; d = orig.charCodeAt(i++) - 56320 + (c<<10);\n\t\t\t\tout.push(String.fromCharCode(240 + ((d >>18) & 7)));\n\t\t\t\tout.push(String.fromCharCode(144 + ((d >>12) & 63)));\n\t\t\t\tout.push(String.fromCharCode(128 + ((d >> 6) & 63)));\n\t\t\t\tout.push(String.fromCharCode(128 + (d & 63)));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tout.push(String.fromCharCode(224 + (c >> 12)));\n\t\t\t\tout.push(String.fromCharCode(128 + ((c >> 6) & 63)));\n\t\t\t\tout.push(String.fromCharCode(128 + (c & 63)));\n\t\t}\n\t}\n\treturn out.join(\"\");\n};\n\nif(has_buf) {\n\tvar utf8readb = function utf8readb(data) {\n\t\tvar out = Buffer.alloc(2*data.length), w, i, j = 1, k = 0, ww=0, c;\n\t\tfor(i = 0; i < data.length; i+=j) {\n\t\t\tj = 1;\n\t\t\tif((c=data.charCodeAt(i)) < 128) w = c;\n\t\t\telse if(c < 224) { w = (c&31)*64+(data.charCodeAt(i+1)&63); j=2; }\n\t\t\telse if(c < 240) { w=(c&15)*4096+(data.charCodeAt(i+1)&63)*64+(data.charCodeAt(i+2)&63); j=3; }\n\t\t\telse { j = 4;\n\t\t\t\tw = (c & 7)*262144+(data.charCodeAt(i+1)&63)*4096+(data.charCodeAt(i+2)&63)*64+(data.charCodeAt(i+3)&63);\n\t\t\t\tw -= 65536; ww = 0xD800 + ((w>>>10)&1023); w = 0xDC00 + (w&1023);\n\t\t\t}\n\t\t\tif(ww !== 0) { out[k++] = ww&255; out[k++] = ww>>>8; ww = 0; }\n\t\t\tout[k++] = w%256; out[k++] = w>>>8;\n\t\t}\n\t\treturn out.slice(0,k).toString('ucs2');\n\t};\n\tvar corpus = \"foo bar baz\\u00e2\\u0098\\u0083\\u00f0\\u009f\\u008d\\u00a3\";\n\tif(utf8read(corpus) == utf8readb(corpus)) utf8read = utf8readb;\n\tvar utf8readc = function utf8readc(data) { return Buffer_from(data, 'binary').toString('utf8'); };\n\tif(utf8read(corpus) == utf8readc(corpus)) utf8read = utf8readc;\n\n\tutf8write = function(data) { return Buffer_from(data, 'utf8').toString(\"binary\"); };\n}\n\n// matches ... extracts content\nvar matchtag = (function() {\n\tvar mtcache = ({});\n\treturn function matchtag(f,g) {\n\t\tvar t = f+\"|\"+(g||\"\");\n\t\tif(mtcache[t]) return mtcache[t];\n\t\treturn (mtcache[t] = new RegExp('<(?:\\\\w+:)?'+f+'(?: xml:space=\"preserve\")?(?:[^>]*)>([\\\\s\\\\S]*?)',((g||\"\"))));\n\t};\n})();\n\nvar htmldecode = (function() {\n\tvar entities = [\n\t\t['nbsp', ' '], ['middot', '·'],\n\t\t['quot', '\"'], ['apos', \"'\"], ['gt', '>'], ['lt', '<'], ['amp', '&']\n\t].map(function(x) { return [new RegExp('&' + x[0] + ';', \"ig\"), x[1]]; });\n\treturn function htmldecode(str) {\n\t\tvar o = str\n\t\t\t\t// Remove new lines and spaces from start of content\n\t\t\t\t.replace(/^[\\t\\n\\r ]+/, \"\")\n\t\t\t\t// Remove new lines and spaces from end of content\n\t\t\t\t.replace(/[\\t\\n\\r ]+$/,\"\")\n\t\t\t\t// Added line which removes any white space characters after and before html tags\n\t\t\t\t.replace(/>\\s+/g,\">\").replace(/\\s+ tags with new lines\n\t\t\t\t.replace(/<\\s*[bB][rR]\\s*\\/?>/g,\"\\n\")\n\t\t\t\t// Strip HTML elements\n\t\t\t\t.replace(/<[^>]*>/g,\"\");\n\t\tfor(var i = 0; i < entities.length; ++i) o = o.replace(entities[i][0], entities[i][1]);\n\t\treturn o;\n\t};\n})();\n\nvar vtregex = (function(){ var vt_cache = {};\n\treturn function vt_regex(bt) {\n\t\tif(vt_cache[bt] !== undefined) return vt_cache[bt];\n\t\treturn (vt_cache[bt] = new RegExp(\"<(?:vt:)?\" + bt + \">([\\\\s\\\\S]*?)\", 'g') );\n};})();\nvar vtvregex = /<\\/?(?:vt:)?variant>/g, vtmregex = /<(?:vt:)([^>]*)>([\\s\\S]*)' + g + ''; }\n\nfunction wxt_helper(h) { return keys(h).map(function(k) { return \" \" + k + '=\"' + h[k] + '\"';}).join(\"\"); }\nfunction writextag(f,g,h) { return '<' + f + ((h != null) ? wxt_helper(h) : \"\") + ((g != null) ? (g.match(wtregex)?' xml:space=\"preserve\"' : \"\") + '>' + g + '';}\n\nfunction write_w3cdtf(d, t) { try { return d.toISOString().replace(/\\.\\d*/,\"\"); } catch(e) { if(t) throw e; } return \"\"; }\n\nfunction write_vt(s, xlsx) {\n\tswitch(typeof s) {\n\t\tcase 'string':\n\t\t\tvar o = writextag('vt:lpwstr', escapexml(s));\n\t\t\tif(xlsx) o = o.replace(/"/g, \"_x0022_\");\n\t\t\treturn o;\n\t\tcase 'number': return writextag((s|0)==s?'vt:i4':'vt:r8', escapexml(String(s)));\n\t\tcase 'boolean': return writextag('vt:bool',s?'true':'false');\n\t}\n\tif(s instanceof Date) return writextag('vt:filetime', write_w3cdtf(s));\n\tthrow new Error(\"Unable to serialize \" + s);\n}\n\nvar XMLNS = ({\n\t'dc': 'http://purl.org/dc/elements/1.1/',\n\t'dcterms': 'http://purl.org/dc/terms/',\n\t'dcmitype': 'http://purl.org/dc/dcmitype/',\n\t'mx': 'http://schemas.microsoft.com/office/mac/excel/2008/main',\n\t'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n\t'sjs': 'http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties',\n\t'vt': 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes',\n\t'xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n\t'xsd': 'http://www.w3.org/2001/XMLSchema'\n});\n\nXMLNS.main = [\n\t'http://schemas.openxmlformats.org/spreadsheetml/2006/main',\n\t'http://purl.oclc.org/ooxml/spreadsheetml/main',\n\t'http://schemas.microsoft.com/office/excel/2006/main',\n\t'http://schemas.microsoft.com/office/excel/2006/2'\n];\n\nvar XLMLNS = ({\n\t'o': 'urn:schemas-microsoft-com:office:office',\n\t'x': 'urn:schemas-microsoft-com:office:excel',\n\t'ss': 'urn:schemas-microsoft-com:office:spreadsheet',\n\t'dt': 'uuid:C2F41010-65B3-11d1-A29F-00AA00C14882',\n\t'mv': 'http://macVmlSchemaUri',\n\t'v': 'urn:schemas-microsoft-com:vml',\n\t'html': 'http://www.w3.org/TR/REC-html40'\n});\nfunction read_double_le(b, idx) {\n\tvar s = 1 - 2 * (b[idx + 7] >>> 7);\n\tvar e = ((b[idx + 7] & 0x7f) << 4) + ((b[idx + 6] >>> 4) & 0x0f);\n\tvar m = (b[idx+6]&0x0f);\n\tfor(var i = 5; i >= 0; --i) m = m * 256 + b[idx + i];\n\tif(e == 0x7ff) return m == 0 ? (s * Infinity) : NaN;\n\tif(e == 0) e = -1022;\n\telse { e -= 1023; m += Math.pow(2,52); }\n\treturn s * Math.pow(2, e - 52) * m;\n}\n\nfunction write_double_le(b, v, idx) {\n\tvar bs = ((((v < 0) || (1/v == -Infinity)) ? 1 : 0) << 7), e = 0, m = 0;\n\tvar av = bs ? (-v) : v;\n\tif(!isFinite(av)) { e = 0x7ff; m = isNaN(v) ? 0x6969 : 0; }\n\telse if(av == 0) e = m = 0;\n\telse {\n\t\te = Math.floor(Math.log(av) / Math.LN2);\n\t\tm = av * Math.pow(2, 52 - e);\n\t\tif((e <= -1023) && (!isFinite(m) || (m < Math.pow(2,52)))) { e = -1022; }\n\t\telse { m -= Math.pow(2,52); e+=1023; }\n\t}\n\tfor(var i = 0; i <= 5; ++i, m/=256) b[idx + i] = m & 0xff;\n\tb[idx + 6] = ((e & 0x0f) << 4) | (m & 0xf);\n\tb[idx + 7] = (e >> 4) | bs;\n}\n\nvar __toBuffer = function(bufs) { var x=[],w=10240; for(var i=0;i 0 ? __utf8(b, i+4,i+4+len-1) : \"\";};\nvar ___lpstr = __lpstr;\nvar __cpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : \"\";};\nvar ___cpstr = __cpstr;\nvar __lpwstr = function(b,i) { var len = 2*__readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : \"\";};\nvar ___lpwstr = __lpwstr;\nvar __lpp4, ___lpp4;\n__lpp4 = ___lpp4 = function lpp4_(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf16le(b, i+4,i+4+len) : \"\";};\nvar __8lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len) : \"\";};\nvar ___8lpp4 = __8lpp4;\nvar __double, ___double;\n__double = ___double = function(b, idx) { return read_double_le(b, idx);};\nvar is_buf = function is_buf_a(a) { return Array.isArray(a); };\n\nif(has_buf) {\n\t__utf16le = function(b,s,e) { if(!Buffer.isBuffer(b)) return ___utf16le(b,s,e); return b.toString('utf16le',s,e).replace(chr0,'')/*.replace(chr1,'!')*/; };\n\t__hexlify = function(b,s,l) { return Buffer.isBuffer(b) ? b.toString('hex',s,s+l) : ___hexlify(b,s,l); };\n\t__lpstr = function lpstr_b(b, i) { if(!Buffer.isBuffer(b)) return ___lpstr(b, i); var len = b.readUInt32LE(i); return len > 0 ? b.toString('utf8',i+4,i+4+len-1) : \"\";};\n\t__cpstr = function cpstr_b(b, i) { if(!Buffer.isBuffer(b)) return ___cpstr(b, i); var len = b.readUInt32LE(i); return len > 0 ? b.toString('utf8',i+4,i+4+len-1) : \"\";};\n\t__lpwstr = function lpwstr_b(b, i) { if(!Buffer.isBuffer(b)) return ___lpwstr(b, i); var len = 2*b.readUInt32LE(i); return b.toString('utf16le',i+4,i+4+len-1);};\n\t__lpp4 = function lpp4_b(b, i) { if(!Buffer.isBuffer(b)) return ___lpp4(b, i); var len = b.readUInt32LE(i); return b.toString('utf16le',i+4,i+4+len);};\n\t__8lpp4 = function lpp4_8b(b, i) { if(!Buffer.isBuffer(b)) return ___8lpp4(b, i); var len = b.readUInt32LE(i); return b.toString('utf8',i+4,i+4+len);};\n\t__utf8 = function utf8_b(b, s, e) { return (Buffer.isBuffer(b)) ? b.toString('utf8',s,e) : ___utf8(b,s,e); };\n\t__toBuffer = function(bufs) { return (bufs[0].length > 0 && Buffer.isBuffer(bufs[0][0])) ? Buffer.concat(bufs[0]) : ___toBuffer(bufs);};\n\tbconcat = function(bufs) { return Buffer.isBuffer(bufs[0]) ? Buffer.concat(bufs) : [].concat.apply([], bufs); };\n\t__double = function double_(b, i) { if(Buffer.isBuffer(b)) return b.readDoubleLE(i); return ___double(b,i); };\n\tis_buf = function is_buf_b(a) { return Buffer.isBuffer(a) || Array.isArray(a); };\n}\n\n/* from js-xls */\nif(typeof cptable !== 'undefined') {\n\t__utf16le = function(b,s,e) { return cptable.utils.decode(1200, b.slice(s,e)).replace(chr0, ''); };\n\t__utf8 = function(b,s,e) { return cptable.utils.decode(65001, b.slice(s,e)); };\n\t__lpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(current_ansi, b.slice(i+4, i+4+len-1)) : \"\";};\n\t__cpstr = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(current_codepage, b.slice(i+4, i+4+len-1)) : \"\";};\n\t__lpwstr = function(b,i) { var len = 2*__readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(1200, b.slice(i+4,i+4+len-1)) : \"\";};\n\t__lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(1200, b.slice(i+4,i+4+len)) : \"\";};\n\t__8lpp4 = function(b,i) { var len = __readUInt32LE(b,i); return len > 0 ? cptable.utils.decode(65001, b.slice(i+4,i+4+len)) : \"\";};\n}\n\nvar __readUInt8 = function(b, idx) { return b[idx]; };\nvar __readUInt16LE = function(b, idx) { return (b[idx+1]*(1<<8))+b[idx]; };\nvar __readInt16LE = function(b, idx) { var u = (b[idx+1]*(1<<8))+b[idx]; return (u < 0x8000) ? u : ((0xffff - u + 1) * -1); };\nvar __readUInt32LE = function(b, idx) { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; };\nvar __readInt32LE = function(b, idx) { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; };\nvar __readInt32BE = function(b, idx) { return (b[idx]<<24)|(b[idx+1]<<16)|(b[idx+2]<<8)|b[idx+3]; };\n\nfunction ReadShift(size, t) {\n\tvar o=\"\", oI, oR, oo=[], w, vv, i, loc;\n\tswitch(t) {\n\t\tcase 'dbcs':\n\t\t\tloc = this.l;\n\t\t\tif(has_buf && Buffer.isBuffer(this)) o = this.slice(this.l, this.l+2*size).toString(\"utf16le\");\n\t\t\telse for(i = 0; i < size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; }\n\t\t\tsize *= 2;\n\t\t\tbreak;\n\n\t\tcase 'utf8': o = __utf8(this, this.l, this.l + size); break;\n\t\tcase 'utf16le': size *= 2; o = __utf16le(this, this.l, this.l + size); break;\n\n\t\tcase 'wstr':\n\t\t\tif(typeof cptable !== 'undefined') o = cptable.utils.decode(current_codepage, this.slice(this.l, this.l+2*size));\n\t\t\telse return ReadShift.call(this, size, 'dbcs');\n\t\t\tsize = 2 * size; break;\n\n\t\t/* [MS-OLEDS] 2.1.4 LengthPrefixedAnsiString */\n\t\tcase 'lpstr-ansi': o = __lpstr(this, this.l); size = 4 + __readUInt32LE(this, this.l); break;\n\t\tcase 'lpstr-cp': o = __cpstr(this, this.l); size = 4 + __readUInt32LE(this, this.l); break;\n\t\t/* [MS-OLEDS] 2.1.5 LengthPrefixedUnicodeString */\n\t\tcase 'lpwstr': o = __lpwstr(this, this.l); size = 4 + 2 * __readUInt32LE(this, this.l); break;\n\t\t/* [MS-OFFCRYPTO] 2.1.2 Length-Prefixed Padded Unicode String (UNICODE-LP-P4) */\n\t\tcase 'lpp4': size = 4 + __readUInt32LE(this, this.l); o = __lpp4(this, this.l); if(size & 0x02) size += 2; break;\n\t\t/* [MS-OFFCRYPTO] 2.1.3 Length-Prefixed UTF-8 String (UTF-8-LP-P4) */\n\t\tcase '8lpp4': size = 4 + __readUInt32LE(this, this.l); o = __8lpp4(this, this.l); if(size & 0x03) size += 4 - (size & 0x03); break;\n\n\t\tcase 'cstr': size = 0; o = \"\";\n\t\t\twhile((w=__readUInt8(this, this.l + size++))!==0) oo.push(_getchar(w));\n\t\t\to = oo.join(\"\"); break;\n\t\tcase '_wstr': size = 0; o = \"\";\n\t\t\twhile((w=__readUInt16LE(this,this.l +size))!==0){oo.push(_getchar(w));size+=2;}\n\t\t\tsize+=2; o = oo.join(\"\"); break;\n\n\t\t/* sbcs and dbcs support continue records in the SST way TODO codepages */\n\t\tcase 'dbcs-cont': o = \"\"; loc = this.l;\n\t\t\tfor(i = 0; i < size; ++i) {\n\t\t\t\tif(this.lens && this.lens.indexOf(loc) !== -1) {\n\t\t\t\t\tw = __readUInt8(this, loc);\n\t\t\t\t\tthis.l = loc + 1;\n\t\t\t\t\tvv = ReadShift.call(this, size-i, w ? 'dbcs-cont' : 'sbcs-cont');\n\t\t\t\t\treturn oo.join(\"\") + vv;\n\t\t\t\t}\n\t\t\t\too.push(_getchar(__readUInt16LE(this, loc)));\n\t\t\t\tloc+=2;\n\t\t\t} o = oo.join(\"\"); size *= 2; break;\n\n\t\tcase 'cpstr':\n\t\t\tif(typeof cptable !== 'undefined') {\n\t\t\t\to = cptable.utils.decode(current_codepage, this.slice(this.l, this.l + size));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t/* falls through */\n\t\tcase 'sbcs-cont': o = \"\"; loc = this.l;\n\t\t\tfor(i = 0; i != size; ++i) {\n\t\t\t\tif(this.lens && this.lens.indexOf(loc) !== -1) {\n\t\t\t\t\tw = __readUInt8(this, loc);\n\t\t\t\t\tthis.l = loc + 1;\n\t\t\t\t\tvv = ReadShift.call(this, size-i, w ? 'dbcs-cont' : 'sbcs-cont');\n\t\t\t\t\treturn oo.join(\"\") + vv;\n\t\t\t\t}\n\t\t\t\too.push(_getchar(__readUInt8(this, loc)));\n\t\t\t\tloc+=1;\n\t\t\t} o = oo.join(\"\"); break;\n\n\t\tdefault:\n\tswitch(size) {\n\t\tcase 1: oI = __readUInt8(this, this.l); this.l++; return oI;\n\t\tcase 2: oI = (t === 'i' ? __readInt16LE : __readUInt16LE)(this, this.l); this.l += 2; return oI;\n\t\tcase 4: case -4:\n\t\t\tif(t === 'i' || ((this[this.l+3] & 0x80)===0)) { oI = ((size > 0) ? __readInt32LE : __readInt32BE)(this, this.l); this.l += 4; return oI; }\n\t\t\telse { oR = __readUInt32LE(this, this.l); this.l += 4; } return oR;\n\t\tcase 8: case -8:\n\t\t\tif(t === 'f') {\n\t\t\t\tif(size == 8) oR = __double(this, this.l);\n\t\t\t\telse oR = __double([this[this.l+7],this[this.l+6],this[this.l+5],this[this.l+4],this[this.l+3],this[this.l+2],this[this.l+1],this[this.l+0]], 0);\n\t\t\t\tthis.l += 8; return oR;\n\t\t\t} else size = 8;\n\t\t/* falls through */\n\t\tcase 16: o = __hexlify(this, this.l, size); break;\n\t}}\n\tthis.l+=size; return o;\n}\n\nvar __writeUInt32LE = function(b, val, idx) { b[idx] = (val & 0xFF); b[idx+1] = ((val >>> 8) & 0xFF); b[idx+2] = ((val >>> 16) & 0xFF); b[idx+3] = ((val >>> 24) & 0xFF); };\nvar __writeInt32LE = function(b, val, idx) { b[idx] = (val & 0xFF); b[idx+1] = ((val >> 8) & 0xFF); b[idx+2] = ((val >> 16) & 0xFF); b[idx+3] = ((val >> 24) & 0xFF); };\nvar __writeUInt16LE = function(b, val, idx) { b[idx] = (val & 0xFF); b[idx+1] = ((val >>> 8) & 0xFF); };\n\nfunction WriteShift(t, val, f) {\n\tvar size = 0, i = 0;\n\tif(f === 'dbcs') {\nfor(i = 0; i != val.length; ++i) __writeUInt16LE(this, val.charCodeAt(i), this.l + 2 * i);\n\t\tsize = 2 * val.length;\n\t} else if(f === 'sbcs') {\n\t\tif(typeof cptable !== 'undefined' && current_ansi == 874) {\n\t\t\t/* TODO: use tables directly, don't encode */\nfor(i = 0; i != val.length; ++i) {\n\t\t\t\tvar cppayload = cptable.utils.encode(current_ansi, val.charAt(i));\n\t\t\t\tthis[this.l + i] = cppayload[0];\n\t\t\t}\n\t\t} else {\nval = val.replace(/[^\\x00-\\x7F]/g, \"_\");\nfor(i = 0; i != val.length; ++i) this[this.l + i] = (val.charCodeAt(i) & 0xFF);\n\t\t}\n\t\tsize = val.length;\n\t} else if(f === 'hex') {\n\t\tfor(; i < t; ++i) {\nthis[this.l++] = (parseInt(val.slice(2*i, 2*i+2), 16)||0);\n\t\t} return this;\n\t} else if(f === 'utf16le') {\nvar end = Math.min(this.l + t, this.length);\n\t\t\tfor(i = 0; i < Math.min(val.length, t); ++i) {\n\t\t\t\tvar cc = val.charCodeAt(i);\n\t\t\t\tthis[this.l++] = (cc & 0xff);\n\t\t\t\tthis[this.l++] = (cc >> 8);\n\t\t\t}\n\t\t\twhile(this.l < end) this[this.l++] = 0;\n\t\t\treturn this;\n\t} else switch(t) {\n\t\tcase 1: size = 1; this[this.l] = val&0xFF; break;\n\t\tcase 2: size = 2; this[this.l] = val&0xFF; val >>>= 8; this[this.l+1] = val&0xFF; break;\n\t\tcase 3: size = 3; this[this.l] = val&0xFF; val >>>= 8; this[this.l+1] = val&0xFF; val >>>= 8; this[this.l+2] = val&0xFF; break;\n\t\tcase 4: size = 4; __writeUInt32LE(this, val, this.l); break;\n\t\tcase 8: size = 8; if(f === 'f') { write_double_le(this, val, this.l); break; }\n\t\t/* falls through */\n\t\tcase 16: break;\n\t\tcase -4: size = 4; __writeInt32LE(this, val, this.l); break;\n\t}\n\tthis.l += size; return this;\n}\n\nfunction CheckField(hexstr, fld) {\n\tvar m = __hexlify(this,this.l,hexstr.length>>1);\n\tif(m !== hexstr) throw new Error(fld + 'Expected ' + hexstr + ' saw ' + m);\n\tthis.l += hexstr.length>>1;\n}\n\nfunction prep_blob(blob, pos) {\n\tblob.l = pos;\n\tblob.read_shift = ReadShift;\n\tblob.chk = CheckField;\n\tblob.write_shift = WriteShift;\n}\n\nfunction parsenoop(blob, length) { blob.l += length; }\n\nfunction new_buf(sz) {\n\tvar o = new_raw_buf(sz);\n\tprep_blob(o, 0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.1.4 Record */\nfunction recordhopper(data, cb, opts) {\n\tif(!data) return;\n\tvar tmpbyte, cntbyte, length;\n\tprep_blob(data, data.l || 0);\n\tvar L = data.length, RT = 0, tgt = 0;\n\twhile(data.l < L) {\n\t\tRT = data.read_shift(1);\n\t\tif(RT & 0x80) RT = (RT & 0x7F) + ((data.read_shift(1) & 0x7F)<<7);\n\t\tvar R = XLSBRecordEnum[RT] || XLSBRecordEnum[0xFFFF];\n\t\ttmpbyte = data.read_shift(1);\n\t\tlength = tmpbyte & 0x7F;\n\t\tfor(cntbyte = 1; cntbyte <4 && (tmpbyte & 0x80); ++cntbyte) length += ((tmpbyte = data.read_shift(1)) & 0x7F)<<(7*cntbyte);\n\t\ttgt = data.l + length;\n\t\tvar d = R.f && R.f(data, length, opts);\n\t\tdata.l = tgt;\n\t\tif(cb(d, R.n, RT)) return;\n\t}\n}\n\n/* control buffer usage for fixed-length buffers */\nfunction buf_array() {\n\tvar bufs = [], blksz = has_buf ? 256 : 2048;\n\tvar newblk = function ba_newblk(sz) {\n\t\tvar o = (new_buf(sz));\n\t\tprep_blob(o, 0);\n\t\treturn o;\n\t};\n\n\tvar curbuf = newblk(blksz);\n\n\tvar endbuf = function ba_endbuf() {\n\t\tif(!curbuf) return;\n\t\tif(curbuf.length > curbuf.l) { curbuf = curbuf.slice(0, curbuf.l); curbuf.l = curbuf.length; }\n\t\tif(curbuf.length > 0) bufs.push(curbuf);\n\t\tcurbuf = null;\n\t};\n\n\tvar next = function ba_next(sz) {\n\t\tif(curbuf && (sz < (curbuf.length - curbuf.l))) return curbuf;\n\t\tendbuf();\n\t\treturn (curbuf = newblk(Math.max(sz+1, blksz)));\n\t};\n\n\tvar end = function ba_end() {\n\t\tendbuf();\n\t\treturn __toBuffer([bufs]);\n\t};\n\n\tvar push = function ba_push(buf) { endbuf(); curbuf = buf; if(curbuf.l == null) curbuf.l = curbuf.length; next(blksz); };\n\n\treturn ({ next:next, push:push, end:end, _bufs:bufs });\n}\n\nfunction write_record(ba, type, payload, length) {\n\tvar t = +XLSBRE[type], l;\n\tif(isNaN(t)) return; // TODO: throw something here?\n\tif(!length) length = XLSBRecordEnum[t].p || (payload||[]).length || 0;\n\tl = 1 + (t >= 0x80 ? 1 : 0) + 1/* + length*/;\n\tif(length >= 0x80) ++l; if(length >= 0x4000) ++l; if(length >= 0x200000) ++l;\n\tvar o = ba.next(l);\n\tif(t <= 0x7F) o.write_shift(1, t);\n\telse {\n\t\to.write_shift(1, (t & 0x7F) + 0x80);\n\t\to.write_shift(1, (t >> 7));\n\t}\n\tfor(var i = 0; i != 4; ++i) {\n\t\tif(length >= 0x80) { o.write_shift(1, (length & 0x7F)+0x80); length >>= 7; }\n\t\telse { o.write_shift(1, length); break; }\n\t}\n\tif(length > 0 && is_buf(payload)) ba.push(payload);\n}\n/* XLS ranges enforced */\nfunction shift_cell_xls(cell, tgt, opts) {\n\tvar out = dup(cell);\n\tif(tgt.s) {\n\t\tif(out.cRel) out.c += tgt.s.c;\n\t\tif(out.rRel) out.r += tgt.s.r;\n\t} else {\n\t\tif(out.cRel) out.c += tgt.c;\n\t\tif(out.rRel) out.r += tgt.r;\n\t}\n\tif(!opts || opts.biff < 12) {\n\t\twhile(out.c >= 0x100) out.c -= 0x100;\n\t\twhile(out.r >= 0x10000) out.r -= 0x10000;\n\t}\n\treturn out;\n}\n\nfunction shift_range_xls(cell, range, opts) {\n\tvar out = dup(cell);\n\tout.s = shift_cell_xls(out.s, range.s, opts);\n\tout.e = shift_cell_xls(out.e, range.s, opts);\n\treturn out;\n}\n\nfunction encode_cell_xls(c, biff) {\n\tif(c.cRel && c.c < 0) { c = dup(c); while(c.c < 0) c.c += (biff > 8) ? 0x4000 : 0x100; }\n\tif(c.rRel && c.r < 0) { c = dup(c); while(c.r < 0) c.r += (biff > 8) ? 0x100000 : ((biff > 5) ? 0x10000 : 0x4000); }\n\tvar s = encode_cell(c);\n\tif(!c.cRel && c.cRel != null) s = fix_col(s);\n\tif(!c.rRel && c.rRel != null) s = fix_row(s);\n\treturn s;\n}\n\nfunction encode_range_xls(r, opts) {\n\tif(r.s.r == 0 && !r.s.rRel) {\n\t\tif(r.e.r == (opts.biff >= 12 ? 0xFFFFF : (opts.biff >= 8 ? 0x10000 : 0x4000)) && !r.e.rRel) {\n\t\t\treturn (r.s.cRel ? \"\" : \"$\") + encode_col(r.s.c) + \":\" + (r.e.cRel ? \"\" : \"$\") + encode_col(r.e.c);\n\t\t}\n\t}\n\tif(r.s.c == 0 && !r.s.cRel) {\n\t\tif(r.e.c == (opts.biff >= 12 ? 0x3FFF : 0xFF) && !r.e.cRel) {\n\t\t\treturn (r.s.rRel ? \"\" : \"$\") + encode_row(r.s.r) + \":\" + (r.e.rRel ? \"\" : \"$\") + encode_row(r.e.r);\n\t\t}\n\t}\n\treturn encode_cell_xls(r.s, opts.biff) + \":\" + encode_cell_xls(r.e, opts.biff);\n}\nvar OFFCRYPTO = {};\n\nvar make_offcrypto = function(O, _crypto) {\n\tvar crypto;\n\tif(typeof _crypto !== 'undefined') crypto = _crypto;\n\telse if(typeof require !== 'undefined') {\n\t\ttry { crypto = require('crypto'); }\n\t\tcatch(e) { crypto = null; }\n\t}\n\n\tO.rc4 = function(key, data) {\n\t\tvar S = new Array(256);\n\t\tvar c = 0, i = 0, j = 0, t = 0;\n\t\tfor(i = 0; i != 256; ++i) S[i] = i;\n\t\tfor(i = 0; i != 256; ++i) {\n\t\t\tj = (j + S[i] + (key[i%key.length]).charCodeAt(0))&255;\n\t\t\tt = S[i]; S[i] = S[j]; S[j] = t;\n\t\t}\n\t\t// $FlowIgnore\n\t\ti = j = 0; var out = new_raw_buf(data.length);\n\t\tfor(c = 0; c != data.length; ++c) {\n\t\t\ti = (i + 1)&255;\n\t\t\tj = (j + S[i])%256;\n\t\t\tt = S[i]; S[i] = S[j]; S[j] = t;\n\t\t\tout[c] = (data[c] ^ S[(S[i]+S[j])&255]);\n\t\t}\n\t\treturn out;\n\t};\n\n\tO.md5 = function(hex) {\n\t\tif(!crypto) throw new Error(\"Unsupported crypto\");\n\t\treturn crypto.createHash('md5').update(hex).digest('hex');\n\t};\n};\n/*global crypto:true */\nmake_offcrypto(OFFCRYPTO, typeof crypto !== \"undefined\" ? crypto : undefined);\n\nfunction decode_row(rowstr) { return parseInt(unfix_row(rowstr),10) - 1; }\nfunction encode_row(row) { return \"\" + (row + 1); }\nfunction fix_row(cstr) { return cstr.replace(/([A-Z]|^)(\\d+)$/,\"$1$$$2\"); }\nfunction unfix_row(cstr) { return cstr.replace(/\\$(\\d+)$/,\"$1\"); }\n\nfunction decode_col(colstr) { var c = unfix_col(colstr), d = 0, i = 0; for(; i !== c.length; ++i) d = 26*d + c.charCodeAt(i) - 64; return d - 1; }\nfunction encode_col(col) { if(col < 0) throw new Error(\"invalid column \" + col); var s=\"\"; for(++col; col; col=Math.floor((col-1)/26)) s = String.fromCharCode(((col-1)%26) + 65) + s; return s; }\nfunction fix_col(cstr) { return cstr.replace(/^([A-Z])/,\"$$$1\"); }\nfunction unfix_col(cstr) { return cstr.replace(/^\\$([A-Z])/,\"$1\"); }\n\nfunction split_cell(cstr) { return cstr.replace(/(\\$?[A-Z]*)(\\$?\\d*)/,\"$1,$2\").split(\",\"); }\n//function decode_cell(cstr) { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }\nfunction decode_cell(cstr) {\n\tvar R = 0, C = 0;\n\tfor(var i = 0; i < cstr.length; ++i) {\n\t\tvar cc = cstr.charCodeAt(i);\n\t\tif(cc >= 48 && cc <= 57) R = 10 * R + (cc - 48);\n\t\telse if(cc >= 65 && cc <= 90) C = 26 * C + (cc - 64);\n\t}\n\treturn { c: C - 1, r:R - 1 };\n}\n//function encode_cell(cell) { return encode_col(cell.c) + encode_row(cell.r); }\nfunction encode_cell(cell) {\n\tvar col = cell.c + 1;\n\tvar s=\"\";\n\tfor(; col; col=((col-1)/26)|0) s = String.fromCharCode(((col-1)%26) + 65) + s;\n\treturn s + (cell.r + 1);\n}\nfunction decode_range(range) {\n\tvar idx = range.indexOf(\":\");\n\tif(idx == -1) return { s: decode_cell(range), e: decode_cell(range) };\n\treturn { s: decode_cell(range.slice(0, idx)), e: decode_cell(range.slice(idx + 1)) };\n}\nfunction encode_range(cs,ce) {\n\tif(typeof ce === 'undefined' || typeof ce === 'number') {\nreturn encode_range(cs.s, cs.e);\n\t}\nif(typeof cs !== 'string') cs = encode_cell((cs));\n\tif(typeof ce !== 'string') ce = encode_cell((ce));\nreturn cs == ce ? cs : cs + \":\" + ce;\n}\n\nfunction safe_decode_range(range) {\n\tvar o = {s:{c:0,r:0},e:{c:0,r:0}};\n\tvar idx = 0, i = 0, cc = 0;\n\tvar len = range.length;\n\tfor(idx = 0; i < len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break;\n\t\tidx = 26*idx + cc;\n\t}\n\to.s.c = --idx;\n\n\tfor(idx = 0; i < len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break;\n\t\tidx = 10*idx + cc;\n\t}\n\to.s.r = --idx;\n\n\tif(i === len || cc != 10) { o.e.c=o.s.c; o.e.r=o.s.r; return o; }\n\t++i;\n\n\tfor(idx = 0; i != len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break;\n\t\tidx = 26*idx + cc;\n\t}\n\to.e.c = --idx;\n\n\tfor(idx = 0; i != len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break;\n\t\tidx = 10*idx + cc;\n\t}\n\to.e.r = --idx;\n\treturn o;\n}\n\nfunction safe_format_cell(cell, v) {\n\tvar q = (cell.t == 'd' && v instanceof Date);\n\tif(cell.z != null) try { return (cell.w = SSF.format(cell.z, q ? datenum(v) : v)); } catch(e) { }\n\ttry { return (cell.w = SSF.format((cell.XF||{}).numFmtId||(q ? 14 : 0), q ? datenum(v) : v)); } catch(e) { return ''+v; }\n}\n\nfunction format_cell(cell, v, o) {\n\tif(cell == null || cell.t == null || cell.t == 'z') return \"\";\n\tif(cell.w !== undefined) return cell.w;\n\tif(cell.t == 'd' && !cell.z && o && o.dateNF) cell.z = o.dateNF;\n\tif(cell.t == \"e\") return BErr[cell.v] || cell.v;\n\tif(v == undefined) return safe_format_cell(cell, cell.v);\n\treturn safe_format_cell(cell, v);\n}\n\nfunction sheet_to_workbook(sheet, opts) {\n\tvar n = opts && opts.sheet ? opts.sheet : \"Sheet1\";\n\tvar sheets = {}; sheets[n] = sheet;\n\treturn { SheetNames: [n], Sheets: sheets };\n}\n\nfunction sheet_add_aoa(_ws, data, opts) {\n\tvar o = opts || {};\n\tvar dense = _ws ? Array.isArray(_ws) : o.dense;\n\tif(DENSE != null && dense == null) dense = DENSE;\n\tvar ws = _ws || (dense ? ([]) : ({}));\n\tvar _R = 0, _C = 0;\n\tif(ws && o.origin != null) {\n\t\tif(typeof o.origin == 'number') _R = o.origin;\n\t\telse {\n\t\t\tvar _origin = typeof o.origin == \"string\" ? decode_cell(o.origin) : o.origin;\n\t\t\t_R = _origin.r; _C = _origin.c;\n\t\t}\n\t\tif(!ws[\"!ref\"]) ws[\"!ref\"] = \"A1:A1\";\n\t}\n\tvar range = ({s: {c:10000000, r:10000000}, e: {c:0, r:0}});\n\tif(ws['!ref']) {\n\t\tvar _range = safe_decode_range(ws['!ref']);\n\t\trange.s.c = _range.s.c;\n\t\trange.s.r = _range.s.r;\n\t\trange.e.c = Math.max(range.e.c, _range.e.c);\n\t\trange.e.r = Math.max(range.e.r, _range.e.r);\n\t\tif(_R == -1) range.e.r = _R = _range.e.r + 1;\n\t}\n\tfor(var R = 0; R != data.length; ++R) {\n\t\tif(!data[R]) continue;\n\t\tif(!Array.isArray(data[R])) throw new Error(\"aoa_to_sheet expects an array of arrays\");\n\t\tfor(var C = 0; C != data[R].length; ++C) {\n\t\t\tif(typeof data[R][C] === 'undefined') continue;\n\t\t\tvar cell = ({v: data[R][C] });\n\t\t\tvar __R = _R + R, __C = _C + C;\n\t\t\tif(range.s.r > __R) range.s.r = __R;\n\t\t\tif(range.s.c > __C) range.s.c = __C;\n\t\t\tif(range.e.r < __R) range.e.r = __R;\n\t\t\tif(range.e.c < __C) range.e.c = __C;\n\t\t\tif(data[R][C] && typeof data[R][C] === 'object' && !Array.isArray(data[R][C]) && !(data[R][C] instanceof Date)) cell = data[R][C];\n\t\t\telse {\n\t\t\t\tif(Array.isArray(cell.v)) { cell.f = data[R][C][1]; cell.v = cell.v[0]; }\n\t\t\t\tif(cell.v === null) {\n\t\t\t\t\tif(cell.f) cell.t = 'n';\n\t\t\t\t\telse if(o.nullError) { cell.t = 'e'; cell.v = 0; }\n\t\t\t\t\telse if(!o.sheetStubs) continue;\n\t\t\t\t\telse cell.t = 'z';\n\t\t\t\t}\n\t\t\t\telse if(typeof cell.v === 'number') cell.t = 'n';\n\t\t\t\telse if(typeof cell.v === 'boolean') cell.t = 'b';\n\t\t\t\telse if(cell.v instanceof Date) {\n\t\t\t\t\tcell.z = o.dateNF || SSF._table[14];\n\t\t\t\t\tif(o.cellDates) { cell.t = 'd'; cell.w = SSF.format(cell.z, datenum(cell.v)); }\n\t\t\t\t\telse { cell.t = 'n'; cell.v = datenum(cell.v); cell.w = SSF.format(cell.z, cell.v); }\n\t\t\t\t}\n\t\t\t\telse cell.t = 's';\n\t\t\t}\n\t\t\tif(dense) {\n\t\t\t\tif(!ws[__R]) ws[__R] = [];\n\t\t\t\tif(ws[__R][__C] && ws[__R][__C].z) cell.z = ws[__R][__C].z;\n\t\t\t\tws[__R][__C] = cell;\n\t\t\t} else {\n\t\t\t\tvar cell_ref = encode_cell(({c:__C,r:__R}));\n\t\t\t\tif(ws[cell_ref] && ws[cell_ref].z) cell.z = ws[cell_ref].z;\n\t\t\t\tws[cell_ref] = cell;\n\t\t\t}\n\t\t}\n\t}\n\tif(range.s.c < 10000000) ws['!ref'] = encode_range(range);\n\treturn ws;\n}\nfunction aoa_to_sheet(data, opts) { return sheet_add_aoa(null, data, opts); }\n\nfunction write_UInt32LE(x, o) {\n\tif (!o) o = new_buf(4);\n\to.write_shift(4, x);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.168 */\nfunction parse_XLWideString(data) {\n\tvar cchCharacters = data.read_shift(4);\n\treturn cchCharacters === 0 ? \"\" : data.read_shift(cchCharacters, 'dbcs');\n}\nfunction write_XLWideString(data, o) {\n\tvar _null = false; if (o == null) { _null = true; o = new_buf(4 + 2 * data.length); }\n\to.write_shift(4, data.length);\n\tif (data.length > 0) o.write_shift(0, data, 'dbcs');\n\treturn _null ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.5.91 */\n//function parse_LPWideString(data) {\n//\tvar cchCharacters = data.read_shift(2);\n//\treturn cchCharacters === 0 ? \"\" : data.read_shift(cchCharacters, \"utf16le\");\n//}\n\n/* [MS-XLSB] 2.5.143 */\nfunction parse_StrRun(data) {\n\treturn { ich: data.read_shift(2), ifnt: data.read_shift(2) };\n}\nfunction write_StrRun(run, o) {\n\tif (!o) o = new_buf(4);\n\to.write_shift(2, run.ich || 0);\n\to.write_shift(2, run.ifnt || 0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.121 */\nfunction parse_RichStr(data, length) {\n\tvar start = data.l;\n\tvar flags = data.read_shift(1);\n\tvar str = parse_XLWideString(data);\n\tvar rgsStrRun = [];\n\tvar z = ({ t: str, h: str });\n\tif ((flags & 1) !== 0) { /* fRichStr */\n\t\t/* TODO: formatted string */\n\t\tvar dwSizeStrRun = data.read_shift(4);\n\t\tfor (var i = 0; i != dwSizeStrRun; ++i) rgsStrRun.push(parse_StrRun(data));\n\t\tz.r = rgsStrRun;\n\t}\n\telse z.r = [{ ich: 0, ifnt: 0 }];\n\t//if((flags & 2) !== 0) { /* fExtStr */\n\t//\t/* TODO: phonetic string */\n\t//}\n\tdata.l = start + length;\n\treturn z;\n}\nfunction write_RichStr(str, o) {\n\t/* TODO: formatted string */\n\tvar _null = false; if (o == null) { _null = true; o = new_buf(15 + 4 * str.t.length); }\n\to.write_shift(1, 0);\n\twrite_XLWideString(str.t, o);\n\treturn _null ? o.slice(0, o.l) : o;\n}\n/* [MS-XLSB] 2.4.328 BrtCommentText (RichStr w/1 run) */\nvar parse_BrtCommentText = parse_RichStr;\nfunction write_BrtCommentText(str, o) {\n\t/* TODO: formatted string */\n\tvar _null = false; if (o == null) { _null = true; o = new_buf(23 + 4 * str.t.length); }\n\to.write_shift(1, 1);\n\twrite_XLWideString(str.t, o);\n\to.write_shift(4, 1);\n\twrite_StrRun({ ich: 0, ifnt: 0 }, o);\n\treturn _null ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.5.9 */\nfunction parse_XLSBCell(data) {\n\tvar col = data.read_shift(4);\n\tvar iStyleRef = data.read_shift(2);\n\tiStyleRef += data.read_shift(1) << 16;\n\tdata.l++; //var fPhShow = data.read_shift(1);\n\treturn { c: col, iStyleRef: iStyleRef };\n}\nfunction write_XLSBCell(cell, o) {\n\tif (o == null) o = new_buf(8);\n\to.write_shift(-4, cell.c);\n\to.write_shift(3, cell.iStyleRef || cell.s);\n\to.write_shift(1, 0); /* fPhShow */\n\treturn o;\n}\n\n/* Short XLSB Cell does not include column */\nfunction parse_XLSBShortCell(data) {\n\tvar iStyleRef = data.read_shift(2);\n\tiStyleRef += data.read_shift(1) <<16;\n\tdata.l++; //var fPhShow = data.read_shift(1);\n\treturn { c:-1, iStyleRef: iStyleRef };\n}\nfunction write_XLSBShortCell(cell, o) {\n\tif(o == null) o = new_buf(4);\n\to.write_shift(3, cell.iStyleRef || cell.s);\n\to.write_shift(1, 0); /* fPhShow */\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.21 */\nvar parse_XLSBCodeName = parse_XLWideString;\nvar write_XLSBCodeName = write_XLWideString;\n\n/* [MS-XLSB] 2.5.166 */\nfunction parse_XLNullableWideString(data) {\n\tvar cchCharacters = data.read_shift(4);\n\treturn cchCharacters === 0 || cchCharacters === 0xFFFFFFFF ? \"\" : data.read_shift(cchCharacters, 'dbcs');\n}\nfunction write_XLNullableWideString(data, o) {\n\tvar _null = false; if (o == null) { _null = true; o = new_buf(127); }\n\to.write_shift(4, data.length > 0 ? data.length : 0xFFFFFFFF);\n\tif (data.length > 0) o.write_shift(0, data, 'dbcs');\n\treturn _null ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.5.165 */\nvar parse_XLNameWideString = parse_XLWideString;\n//var write_XLNameWideString = write_XLWideString;\n\n/* [MS-XLSB] 2.5.114 */\nvar parse_RelID = parse_XLNullableWideString;\nvar write_RelID = write_XLNullableWideString;\n\n\n/* [MS-XLS] 2.5.217 ; [MS-XLSB] 2.5.122 */\nfunction parse_RkNumber(data) {\n\tvar b = data.slice(data.l, data.l + 4);\n\tvar fX100 = (b[0] & 1), fInt = (b[0] & 2);\n\tdata.l += 4;\n\tb[0] &= 0xFC; // b[0] &= ~3;\n\tvar RK = fInt === 0 ? __double([0, 0, 0, 0, b[0], b[1], b[2], b[3]], 0) : __readInt32LE(b, 0) >> 2;\n\treturn fX100 ? (RK / 100) : RK;\n}\nfunction write_RkNumber(data, o) {\n\tif (o == null) o = new_buf(4);\n\tvar fX100 = 0, fInt = 0, d100 = data * 100;\n\tif ((data == (data | 0)) && (data >= -(1 << 29)) && (data < (1 << 29))) { fInt = 1; }\n\telse if ((d100 == (d100 | 0)) && (d100 >= -(1 << 29)) && (d100 < (1 << 29))) { fInt = 1; fX100 = 1; }\n\tif (fInt) o.write_shift(-4, ((fX100 ? d100 : data) << 2) + (fX100 + 2));\n\telse throw new Error(\"unsupported RkNumber \" + data); // TODO\n}\n\n\n/* [MS-XLSB] 2.5.117 RfX */\nfunction parse_RfX(data ) {\n\tvar cell = ({ s: {}, e: {} });\n\tcell.s.r = data.read_shift(4);\n\tcell.e.r = data.read_shift(4);\n\tcell.s.c = data.read_shift(4);\n\tcell.e.c = data.read_shift(4);\n\treturn cell;\n}\nfunction write_RfX(r, o) {\n\tif (!o) o = new_buf(16);\n\to.write_shift(4, r.s.r);\n\to.write_shift(4, r.e.r);\n\to.write_shift(4, r.s.c);\n\to.write_shift(4, r.e.c);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.153 UncheckedRfX */\nvar parse_UncheckedRfX = parse_RfX;\nvar write_UncheckedRfX = write_RfX;\n\n/* [MS-XLSB] 2.5.155 UncheckedSqRfX */\n//function parse_UncheckedSqRfX(data) {\n//\tvar cnt = data.read_shift(4);\n//\tvar out = [];\n//\tfor(var i = 0; i < cnt; ++i) {\n//\t\tvar rng = parse_UncheckedRfX(data);\n//\t\tout.push(encode_range(rng));\n//\t}\n//\treturn out.join(\",\");\n//}\n//function write_UncheckedSqRfX(sqrfx) {\n//\tvar parts = sqrfx.split(/\\s*,\\s*/);\n//\tvar o = new_buf(4); o.write_shift(4, parts.length);\n//\tvar out = [o];\n//\tparts.forEach(function(rng) {\n//\t\tout.push(write_UncheckedRfX(safe_decode_range(rng)));\n//\t});\n//\treturn bconcat(out);\n//}\n\n/* [MS-XLS] 2.5.342 ; [MS-XLSB] 2.5.171 */\n/* TODO: error checking, NaN and Infinity values are not valid Xnum */\nfunction parse_Xnum(data) {\n\tif(data.length - data.l < 8) throw \"XLS Xnum Buffer underflow\";\n\treturn data.read_shift(8, 'f');\n}\nfunction write_Xnum(data, o) { return (o || new_buf(8)).write_shift(8, data, 'f'); }\n\n/* [MS-XLSB] 2.4.324 BrtColor */\nfunction parse_BrtColor(data) {\n\tvar out = {};\n\tvar d = data.read_shift(1);\n\n\t//var fValidRGB = d & 1;\n\tvar xColorType = d >>> 1;\n\n\tvar index = data.read_shift(1);\n\tvar nTS = data.read_shift(2, 'i');\n\tvar bR = data.read_shift(1);\n\tvar bG = data.read_shift(1);\n\tvar bB = data.read_shift(1);\n\tdata.l++; //var bAlpha = data.read_shift(1);\n\n\tswitch (xColorType) {\n\t\tcase 0: out.auto = 1; break;\n\t\tcase 1:\n\t\t\tout.index = index;\n\t\t\tvar icv = XLSIcv[index];\n\t\t\t/* automatic pseudo index 81 */\n\t\t\tif (icv) out.rgb = rgb2Hex(icv);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\t/* if(!fValidRGB) throw new Error(\"invalid\"); */\n\t\t\tout.rgb = rgb2Hex([bR, bG, bB]);\n\t\t\tbreak;\n\t\tcase 3: out.theme = index; break;\n\t}\n\tif (nTS != 0) out.tint = nTS > 0 ? nTS / 32767 : nTS / 32768;\n\n\treturn out;\n}\nfunction write_BrtColor(color, o) {\n\tif (!o) o = new_buf(8);\n\tif (!color || color.auto) { o.write_shift(4, 0); o.write_shift(4, 0); return o; }\n\tif (color.index != null) {\n\t\to.write_shift(1, 0x02);\n\t\to.write_shift(1, color.index);\n\t} else if (color.theme != null) {\n\t\to.write_shift(1, 0x06);\n\t\to.write_shift(1, color.theme);\n\t} else {\n\t\to.write_shift(1, 0x05);\n\t\to.write_shift(1, 0);\n\t}\n\tvar nTS = color.tint || 0;\n\tif (nTS > 0) nTS *= 32767;\n\telse if (nTS < 0) nTS *= 32768;\n\to.write_shift(2, nTS);\n\tif (!color.rgb || color.theme != null) {\n\t\to.write_shift(2, 0);\n\t\to.write_shift(1, 0);\n\t\to.write_shift(1, 0);\n\t} else {\n\t\tvar rgb = (color.rgb || 'FFFFFF');\n\t\tif (typeof rgb == 'number') rgb = (\"000000\" + rgb.toString(16)).slice(-6);\n\t\to.write_shift(1, parseInt(rgb.slice(0, 2), 16));\n\t\to.write_shift(1, parseInt(rgb.slice(2, 4), 16));\n\t\to.write_shift(1, parseInt(rgb.slice(4, 6), 16));\n\t\to.write_shift(1, 0xFF);\n\t}\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.52 */\nfunction parse_FontFlags(data) {\n\tvar d = data.read_shift(1);\n\tdata.l++;\n\tvar out = {\n\t\tfBold: d & 0x01,\n\t\tfItalic: d & 0x02,\n\t\tfUnderline: d & 0x04,\n\t\tfStrikeout: d & 0x08,\n\t\tfOutline: d & 0x10,\n\t\tfShadow: d & 0x20,\n\t\tfCondense: d & 0x40,\n\t\tfExtend: d & 0x80\n\t};\n\treturn out;\n}\nfunction write_FontFlags(font, o) {\n\tif (!o) o = new_buf(2);\n\tvar grbit =\n\t\t(font.italic ? 0x02 : 0) |\n\t\t(font.strike ? 0x08 : 0) |\n\t\t(font.outline ? 0x10 : 0) |\n\t\t(font.shadow ? 0x20 : 0) |\n\t\t(font.condense ? 0x40 : 0) |\n\t\t(font.extend ? 0x80 : 0);\n\to.write_shift(1, grbit);\n\to.write_shift(1, 0);\n\treturn o;\n}\n\n/* [MS-OLEDS] 2.3.1 and 2.3.2 */\nfunction parse_ClipboardFormatOrString(o, w) {\n\t// $FlowIgnore\n\tvar ClipFmt = { 2: \"BITMAP\", 3: \"METAFILEPICT\", 8: \"DIB\", 14: \"ENHMETAFILE\" };\n\tvar m = o.read_shift(4);\n\tswitch (m) {\n\t\tcase 0x00000000: return \"\";\n\t\tcase 0xffffffff: case 0xfffffffe: return ClipFmt[o.read_shift(4)] || \"\";\n\t}\n\tif (m > 0x190) throw new Error(\"Unsupported Clipboard: \" + m.toString(16));\n\to.l -= 4;\n\treturn o.read_shift(0, w == 1 ? \"lpstr\" : \"lpwstr\");\n}\nfunction parse_ClipboardFormatOrAnsiString(o) { return parse_ClipboardFormatOrString(o, 1); }\nfunction parse_ClipboardFormatOrUnicodeString(o) { return parse_ClipboardFormatOrString(o, 2); }\n\n/* [MS-OLEPS] 2.2 PropertyType */\n//var VT_EMPTY = 0x0000;\n//var VT_NULL = 0x0001;\nvar VT_I2 = 0x0002;\nvar VT_I4 = 0x0003;\n//var VT_R4 = 0x0004;\n//var VT_R8 = 0x0005;\n//var VT_CY = 0x0006;\n//var VT_DATE = 0x0007;\n//var VT_BSTR = 0x0008;\n//var VT_ERROR = 0x000A;\nvar VT_BOOL = 0x000B;\nvar VT_VARIANT = 0x000C;\n//var VT_DECIMAL = 0x000E;\n//var VT_I1 = 0x0010;\n//var VT_UI1 = 0x0011;\n//var VT_UI2 = 0x0012;\nvar VT_UI4 = 0x0013;\n//var VT_I8 = 0x0014;\n//var VT_UI8 = 0x0015;\n//var VT_INT = 0x0016;\n//var VT_UINT = 0x0017;\nvar VT_LPSTR = 0x001E;\n//var VT_LPWSTR = 0x001F;\nvar VT_FILETIME = 0x0040;\nvar VT_BLOB = 0x0041;\n//var VT_STREAM = 0x0042;\n//var VT_STORAGE = 0x0043;\n//var VT_STREAMED_Object = 0x0044;\n//var VT_STORED_Object = 0x0045;\n//var VT_BLOB_Object = 0x0046;\nvar VT_CF = 0x0047;\n//var VT_CLSID = 0x0048;\n//var VT_VERSIONED_STREAM = 0x0049;\nvar VT_VECTOR = 0x1000;\n//var VT_ARRAY = 0x2000;\n\nvar VT_STRING = 0x0050; // 2.3.3.1.11 VtString\nvar VT_USTR = 0x0051; // 2.3.3.1.12 VtUnalignedString\nvar VT_CUSTOM = [VT_STRING, VT_USTR];\n\n/* [MS-OSHARED] 2.3.3.2.2.1 Document Summary Information PIDDSI */\nvar DocSummaryPIDDSI = {\n0x01: { n: 'CodePage', t: VT_I2 },\n0x02: { n: 'Category', t: VT_STRING },\n0x03: { n: 'PresentationFormat', t: VT_STRING },\n0x04: { n: 'ByteCount', t: VT_I4 },\n0x05: { n: 'LineCount', t: VT_I4 },\n0x06: { n: 'ParagraphCount', t: VT_I4 },\n0x07: { n: 'SlideCount', t: VT_I4 },\n0x08: { n: 'NoteCount', t: VT_I4 },\n0x09: { n: 'HiddenCount', t: VT_I4 },\n0x0a: { n: 'MultimediaClipCount', t: VT_I4 },\n0x0b: { n: 'ScaleCrop', t: VT_BOOL },\n0x0c: { n: 'HeadingPairs', t: VT_VECTOR | VT_VARIANT },\n0x0d: { n: 'TitlesOfParts', t: VT_VECTOR | VT_LPSTR },\n0x0e: { n: 'Manager', t: VT_STRING },\n0x0f: { n: 'Company', t: VT_STRING },\n0x10: { n: 'LinksUpToDate', t: VT_BOOL },\n0x11: { n: 'CharacterCount', t: VT_I4 },\n0x13: { n: 'SharedDoc', t: VT_BOOL },\n0x16: { n: 'HyperlinksChanged', t: VT_BOOL },\n0x17: { n: 'AppVersion', t: VT_I4, p: 'version' },\n0x18: { n: 'DigSig', t: VT_BLOB },\n0x1A: { n: 'ContentType', t: VT_STRING },\n0x1B: { n: 'ContentStatus', t: VT_STRING },\n0x1C: { n: 'Language', t: VT_STRING },\n0x1D: { n: 'Version', t: VT_STRING },\n0xFF: {},\n\t/* [MS-OLEPS] 2.18 */\n0x80000000: { n: 'Locale', t: VT_UI4 },\n0x80000003: { n: 'Behavior', t: VT_UI4 },\n0x72627262: {}\n};\n\n/* [MS-OSHARED] 2.3.3.2.1.1 Summary Information Property Set PIDSI */\nvar SummaryPIDSI = {\n0x01: { n: 'CodePage', t: VT_I2 },\n0x02: { n: 'Title', t: VT_STRING },\n0x03: { n: 'Subject', t: VT_STRING },\n0x04: { n: 'Author', t: VT_STRING },\n0x05: { n: 'Keywords', t: VT_STRING },\n0x06: { n: 'Comments', t: VT_STRING },\n0x07: { n: 'Template', t: VT_STRING },\n0x08: { n: 'LastAuthor', t: VT_STRING },\n0x09: { n: 'RevNumber', t: VT_STRING },\n0x0A: { n: 'EditTime', t: VT_FILETIME },\n0x0B: { n: 'LastPrinted', t: VT_FILETIME },\n0x0C: { n: 'CreatedDate', t: VT_FILETIME },\n0x0D: { n: 'ModifiedDate', t: VT_FILETIME },\n0x0E: { n: 'PageCount', t: VT_I4 },\n0x0F: { n: 'WordCount', t: VT_I4 },\n0x10: { n: 'CharCount', t: VT_I4 },\n0x11: { n: 'Thumbnail', t: VT_CF },\n0x12: { n: 'Application', t: VT_STRING },\n0x13: { n: 'DocSecurity', t: VT_I4 },\n0xFF: {},\n\t/* [MS-OLEPS] 2.18 */\n0x80000000: { n: 'Locale', t: VT_UI4 },\n0x80000003: { n: 'Behavior', t: VT_UI4 },\n0x72627262: {}\n};\n\nvar DocSummaryRE = evert_key(DocSummaryPIDDSI, \"n\");\nvar SummaryRE = evert_key(SummaryPIDSI, \"n\");\n\n/* [MS-XLS] 2.4.63 Country/Region codes */\nvar CountryEnum = {\n0x0001: \"US\", // United States\n0x0002: \"CA\", // Canada\n0x0003: \"\", // Latin America (except Brazil)\n0x0007: \"RU\", // Russia\n0x0014: \"EG\", // Egypt\n0x001E: \"GR\", // Greece\n0x001F: \"NL\", // Netherlands\n0x0020: \"BE\", // Belgium\n0x0021: \"FR\", // France\n0x0022: \"ES\", // Spain\n0x0024: \"HU\", // Hungary\n0x0027: \"IT\", // Italy\n0x0029: \"CH\", // Switzerland\n0x002B: \"AT\", // Austria\n0x002C: \"GB\", // United Kingdom\n0x002D: \"DK\", // Denmark\n0x002E: \"SE\", // Sweden\n0x002F: \"NO\", // Norway\n0x0030: \"PL\", // Poland\n0x0031: \"DE\", // Germany\n0x0034: \"MX\", // Mexico\n0x0037: \"BR\", // Brazil\n0x003d: \"AU\", // Australia\n0x0040: \"NZ\", // New Zealand\n0x0042: \"TH\", // Thailand\n0x0051: \"JP\", // Japan\n0x0052: \"KR\", // Korea\n0x0054: \"VN\", // Viet Nam\n0x0056: \"CN\", // China\n0x005A: \"TR\", // Turkey\n0x0069: \"JS\", // Ramastan\n0x00D5: \"DZ\", // Algeria\n0x00D8: \"MA\", // Morocco\n0x00DA: \"LY\", // Libya\n0x015F: \"PT\", // Portugal\n0x0162: \"IS\", // Iceland\n0x0166: \"FI\", // Finland\n0x01A4: \"CZ\", // Czech Republic\n0x0376: \"TW\", // Taiwan\n0x03C1: \"LB\", // Lebanon\n0x03C2: \"JO\", // Jordan\n0x03C3: \"SY\", // Syria\n0x03C4: \"IQ\", // Iraq\n0x03C5: \"KW\", // Kuwait\n0x03C6: \"SA\", // Saudi Arabia\n0x03CB: \"AE\", // United Arab Emirates\n0x03CC: \"IL\", // Israel\n0x03CE: \"QA\", // Qatar\n0x03D5: \"IR\", // Iran\n0xFFFF: \"US\" // United States\n};\n\n/* [MS-XLS] 2.5.127 */\nvar XLSFillPattern = [\n\tnull,\n\t'solid',\n\t'mediumGray',\n\t'darkGray',\n\t'lightGray',\n\t'darkHorizontal',\n\t'darkVertical',\n\t'darkDown',\n\t'darkUp',\n\t'darkGrid',\n\t'darkTrellis',\n\t'lightHorizontal',\n\t'lightVertical',\n\t'lightDown',\n\t'lightUp',\n\t'lightGrid',\n\t'lightTrellis',\n\t'gray125',\n\t'gray0625'\n];\n\nfunction rgbify(arr) { return arr.map(function(x) { return [(x>>16)&255,(x>>8)&255,x&255]; }); }\n\n/* [MS-XLS] 2.5.161 */\n/* [MS-XLSB] 2.5.75 Icv */\nvar _XLSIcv = rgbify([\n\t/* Color Constants */\n\t0x000000,\n\t0xFFFFFF,\n\t0xFF0000,\n\t0x00FF00,\n\t0x0000FF,\n\t0xFFFF00,\n\t0xFF00FF,\n\t0x00FFFF,\n\n\t/* Overridable Defaults */\n\t0x000000,\n\t0xFFFFFF,\n\t0xFF0000,\n\t0x00FF00,\n\t0x0000FF,\n\t0xFFFF00,\n\t0xFF00FF,\n\t0x00FFFF,\n\n\t0x800000,\n\t0x008000,\n\t0x000080,\n\t0x808000,\n\t0x800080,\n\t0x008080,\n\t0xC0C0C0,\n\t0x808080,\n\t0x9999FF,\n\t0x993366,\n\t0xFFFFCC,\n\t0xCCFFFF,\n\t0x660066,\n\t0xFF8080,\n\t0x0066CC,\n\t0xCCCCFF,\n\n\t0x000080,\n\t0xFF00FF,\n\t0xFFFF00,\n\t0x00FFFF,\n\t0x800080,\n\t0x800000,\n\t0x008080,\n\t0x0000FF,\n\t0x00CCFF,\n\t0xCCFFFF,\n\t0xCCFFCC,\n\t0xFFFF99,\n\t0x99CCFF,\n\t0xFF99CC,\n\t0xCC99FF,\n\t0xFFCC99,\n\n\t0x3366FF,\n\t0x33CCCC,\n\t0x99CC00,\n\t0xFFCC00,\n\t0xFF9900,\n\t0xFF6600,\n\t0x666699,\n\t0x969696,\n\t0x003366,\n\t0x339966,\n\t0x003300,\n\t0x333300,\n\t0x993300,\n\t0x993366,\n\t0x333399,\n\t0x333333,\n\n\t/* Other entries to appease BIFF8/12 */\n\t0xFFFFFF, /* 0x40 icvForeground ?? */\n\t0x000000, /* 0x41 icvBackground ?? */\n\t0x000000, /* 0x42 icvFrame ?? */\n\t0x000000, /* 0x43 icv3D ?? */\n\t0x000000, /* 0x44 icv3DText ?? */\n\t0x000000, /* 0x45 icv3DHilite ?? */\n\t0x000000, /* 0x46 icv3DShadow ?? */\n\t0x000000, /* 0x47 icvHilite ?? */\n\t0x000000, /* 0x48 icvCtlText ?? */\n\t0x000000, /* 0x49 icvCtlScrl ?? */\n\t0x000000, /* 0x4A icvCtlInv ?? */\n\t0x000000, /* 0x4B icvCtlBody ?? */\n\t0x000000, /* 0x4C icvCtlFrame ?? */\n\t0x000000, /* 0x4D icvCtlFore ?? */\n\t0x000000, /* 0x4E icvCtlBack ?? */\n\t0x000000, /* 0x4F icvCtlNeutral */\n\t0x000000, /* 0x50 icvInfoBk ?? */\n\t0x000000 /* 0x51 icvInfoText ?? */\n]);\nvar XLSIcv = dup(_XLSIcv);\n\n/* [MS-XLSB] 2.5.97.2 */\nvar BErr = {\n0x00: \"#NULL!\",\n0x07: \"#DIV/0!\",\n0x0F: \"#VALUE!\",\n0x17: \"#REF!\",\n0x1D: \"#NAME?\",\n0x24: \"#NUM!\",\n0x2A: \"#N/A\",\n0x2B: \"#GETTING_DATA\",\n0xFF: \"#WTF?\"\n};\nvar RBErr = evert_num(BErr);\n/* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */\n/* 12.3 Part Summary */\n/* 14.2 Part Summary */\n/* [MS-XLSX] 2.1 Part Enumerations ; [MS-XLSB] 2.1.7 Part Enumeration */\nvar ct2type/*{[string]:string}*/ = ({\n\t/* Workbook */\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\": \"workbooks\",\n\n\t/* Worksheet */\n\t\"application/vnd.ms-excel.binIndexWs\": \"TODO\", /* Binary Index */\n\n\t/* Macrosheet */\n\t\"application/vnd.ms-excel.intlmacrosheet\": \"TODO\",\n\t\"application/vnd.ms-excel.binIndexMs\": \"TODO\", /* Binary Index */\n\n\t/* File Properties */\n\t\"application/vnd.openxmlformats-package.core-properties+xml\": \"coreprops\",\n\t\"application/vnd.openxmlformats-officedocument.custom-properties+xml\": \"custprops\",\n\t\"application/vnd.openxmlformats-officedocument.extended-properties+xml\": \"extprops\",\n\n\t/* Custom Data Properties */\n\t\"application/vnd.openxmlformats-officedocument.customXmlProperties+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.customProperty\": \"TODO\",\n\n\t/* PivotTable */\n\t\"application/vnd.ms-excel.pivotTable\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml\": \"TODO\",\n\n\t/* Chart Objects */\n\t\"application/vnd.openxmlformats-officedocument.drawingml.chart+xml\": \"TODO\",\n\n\t/* Chart Colors */\n\t\"application/vnd.ms-office.chartcolorstyle+xml\": \"TODO\",\n\n\t/* Chart Style */\n\t\"application/vnd.ms-office.chartstyle+xml\": \"TODO\",\n\n\t/* Chart Advanced */\n\t\"application/vnd.ms-office.chartex+xml\": \"TODO\",\n\n\t/* Calculation Chain */\n\t\"application/vnd.ms-excel.calcChain\": \"calcchains\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml\": \"calcchains\",\n\n\t/* Printer Settings */\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings\": \"TODO\",\n\n\t/* ActiveX */\n\t\"application/vnd.ms-office.activeX\": \"TODO\",\n\t\"application/vnd.ms-office.activeX+xml\": \"TODO\",\n\n\t/* Custom Toolbars */\n\t\"application/vnd.ms-excel.attachedToolbars\": \"TODO\",\n\n\t/* External Data Connections */\n\t\"application/vnd.ms-excel.connections\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml\": \"TODO\",\n\n\t/* External Links */\n\t\"application/vnd.ms-excel.externalLink\": \"links\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml\": \"links\",\n\n\t/* Metadata */\n\t\"application/vnd.ms-excel.sheetMetadata\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml\": \"TODO\",\n\n\t/* PivotCache */\n\t\"application/vnd.ms-excel.pivotCacheDefinition\": \"TODO\",\n\t\"application/vnd.ms-excel.pivotCacheRecords\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml\": \"TODO\",\n\n\t/* Query Table */\n\t\"application/vnd.ms-excel.queryTable\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml\": \"TODO\",\n\n\t/* Shared Workbook */\n\t\"application/vnd.ms-excel.userNames\": \"TODO\",\n\t\"application/vnd.ms-excel.revisionHeaders\": \"TODO\",\n\t\"application/vnd.ms-excel.revisionLog\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml\": \"TODO\",\n\n\t/* Single Cell Table */\n\t\"application/vnd.ms-excel.tableSingleCells\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml\": \"TODO\",\n\n\t/* Slicer */\n\t\"application/vnd.ms-excel.slicer\": \"TODO\",\n\t\"application/vnd.ms-excel.slicerCache\": \"TODO\",\n\t\"application/vnd.ms-excel.slicer+xml\": \"TODO\",\n\t\"application/vnd.ms-excel.slicerCache+xml\": \"TODO\",\n\n\t/* Sort Map */\n\t\"application/vnd.ms-excel.wsSortMap\": \"TODO\",\n\n\t/* Table */\n\t\"application/vnd.ms-excel.table\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml\": \"TODO\",\n\n\t/* Themes */\n\t\"application/vnd.openxmlformats-officedocument.theme+xml\": \"themes\",\n\n\t/* Theme Override */\n\t\"application/vnd.openxmlformats-officedocument.themeOverride+xml\": \"TODO\",\n\n\t/* Timeline */\n\t\"application/vnd.ms-excel.Timeline+xml\": \"TODO\", /* verify */\n\t\"application/vnd.ms-excel.TimelineCache+xml\": \"TODO\", /* verify */\n\n\t/* VBA */\n\t\"application/vnd.ms-office.vbaProject\": \"vba\",\n\t\"application/vnd.ms-office.vbaProjectSignature\": \"vba\",\n\n\t/* Volatile Dependencies */\n\t\"application/vnd.ms-office.volatileDependencies\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml\": \"TODO\",\n\n\t/* Control Properties */\n\t\"application/vnd.ms-excel.controlproperties+xml\": \"TODO\",\n\n\t/* Data Model */\n\t\"application/vnd.openxmlformats-officedocument.model+data\": \"TODO\",\n\n\t/* Survey */\n\t\"application/vnd.ms-excel.Survey+xml\": \"TODO\",\n\n\t/* Drawing */\n\t\"application/vnd.openxmlformats-officedocument.drawing+xml\": \"drawings\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml\": \"TODO\",\n\n\t/* VML */\n\t\"application/vnd.openxmlformats-officedocument.vmlDrawing\": \"TODO\",\n\n\t\"application/vnd.openxmlformats-package.relationships+xml\": \"rels\",\n\t\"application/vnd.openxmlformats-officedocument.oleObject\": \"TODO\",\n\n\t/* Image */\n\t\"image/png\": \"TODO\",\n\n\t\"sheet\": \"js\"\n});\n\nvar CT_LIST = (function(){\n\tvar o = {\n\t\tworkbooks: {\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\",\n\t\t\txlsm: \"application/vnd.ms-excel.sheet.macroEnabled.main+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.sheet.binary.macroEnabled.main\",\n\t\t\txlam: \"application/vnd.ms-excel.addin.macroEnabled.main+xml\",\n\t\t\txltx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml\"\n\t\t},\n\t\tstrs: { /* Shared Strings */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.sharedStrings\"\n\t\t},\n\t\tcomments: { /* Comments */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.comments\"\n\t\t},\n\t\tsheets: { /* Worksheet */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.worksheet\"\n\t\t},\n\t\tcharts: { /* Chartsheet */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.chartsheet\"\n\t\t},\n\t\tdialogs: { /* Dialogsheet */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.dialogsheet\"\n\t\t},\n\t\tmacros: { /* Macrosheet (Excel 4.0 Macros) */\n\t\t\txlsx: \"application/vnd.ms-excel.macrosheet+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.macrosheet\"\n\t\t},\n\t\tstyles: { /* Styles */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.styles\"\n\t\t}\n\t};\n\tkeys(o).forEach(function(k) { [\"xlsm\", \"xlam\"].forEach(function(v) { if(!o[k][v]) o[k][v] = o[k].xlsx; }); });\n\tkeys(o).forEach(function(k){ keys(o[k]).forEach(function(v) { ct2type[o[k][v]] = k; }); });\n\treturn o;\n})();\n\nvar type2ct/*{[string]:Array}*/ = evert_arr(ct2type);\n\nXMLNS.CT = 'http://schemas.openxmlformats.org/package/2006/content-types';\n\nfunction new_ct() {\n\treturn ({\n\t\tworkbooks:[], sheets:[], charts:[], dialogs:[], macros:[],\n\t\trels:[], strs:[], comments:[], links:[],\n\t\tcoreprops:[], extprops:[], custprops:[], themes:[], styles:[],\n\t\tcalcchains:[], vba: [], drawings: [],\n\t\tTODO:[], xmlns: \"\" });\n}\n\nfunction parse_ct(data) {\n\tvar ct = new_ct();\n\tif(!data || !data.match) return ct;\n\tvar ctext = {};\n\t(data.match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0].replace(nsregex,\"<\")) {\n\t\t\tcase ' 0 ? ct.calcchains[0] : \"\";\n\tct.sst = ct.strs.length > 0 ? ct.strs[0] : \"\";\n\tct.style = ct.styles.length > 0 ? ct.styles[0] : \"\";\n\tct.defaults = ctext;\n\tdelete ct.calcchains;\n\treturn ct;\n}\n\nvar CTYPE_XML_ROOT = writextag('Types', null, {\n\t'xmlns': XMLNS.CT,\n\t'xmlns:xsd': XMLNS.xsd,\n\t'xmlns:xsi': XMLNS.xsi\n});\n\nvar CTYPE_DEFAULTS = [\n\t['xml', 'application/xml'],\n\t['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],\n\t['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'],\n\t['data', 'application/vnd.openxmlformats-officedocument.model+data'],\n\t/* from test files */\n\t['bmp', 'image/bmp'],\n\t['png', 'image/png'],\n\t['gif', 'image/gif'],\n\t['emf', 'image/x-emf'],\n\t['wmf', 'image/x-wmf'],\n\t['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'],\n\t['tif', 'image/tiff'], ['tiff', 'image/tiff'],\n\t['pdf', 'application/pdf'],\n\t['rels', type2ct.rels[0]]\n].map(function(x) {\n\treturn writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]});\n});\n\nfunction write_ct(ct, opts) {\n\tvar o = [], v;\n\to[o.length] = (XML_HEADER);\n\to[o.length] = (CTYPE_XML_ROOT);\n\to = o.concat(CTYPE_DEFAULTS);\n\n\t/* only write first instance */\n\tvar f1 = function(w) {\n\t\tif(ct[w] && ct[w].length > 0) {\n\t\t\tv = ct[w][0];\n\t\t\to[o.length] = (writextag('Override', null, {\n\t\t\t\t'PartName': (v[0] == '/' ? \"\":\"/\") + v,\n\t\t\t\t'ContentType': CT_LIST[w][opts.bookType || 'xlsx']\n\t\t\t}));\n\t\t}\n\t};\n\n\t/* book type-specific */\n\tvar f2 = function(w) {\n\t\t(ct[w]||[]).forEach(function(v) {\n\t\t\to[o.length] = (writextag('Override', null, {\n\t\t\t\t'PartName': (v[0] == '/' ? \"\":\"/\") + v,\n\t\t\t\t'ContentType': CT_LIST[w][opts.bookType || 'xlsx']\n\t\t\t}));\n\t\t});\n\t};\n\n\t/* standard type */\n\tvar f3 = function(t) {\n\t\t(ct[t]||[]).forEach(function(v) {\n\t\t\to[o.length] = (writextag('Override', null, {\n\t\t\t\t'PartName': (v[0] == '/' ? \"\":\"/\") + v,\n\t\t\t\t'ContentType': type2ct[t][0]\n\t\t\t}));\n\t\t});\n\t};\n\n\tf1('workbooks');\n\tf2('sheets');\n\tf2('charts');\n\tf3('themes');\n\t['strs', 'styles'].forEach(f1);\n\t['coreprops', 'extprops', 'custprops'].forEach(f3);\n\tf3('vba');\n\tf3('comments');\n\tf3('drawings');\n\tif(o.length>2){ o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* 9.3 Relationships */\nvar RELS = ({\n\tWB: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n\tSHEET: \"http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n\tHLINK: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\n\tVML: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\",\n\tXPATH: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath\",\n\tXMISS: \"http://schemas.microsoft.com/office/2006/relationships/xlExternalLinkPath/xlPathMissing\",\n\tXLINK: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink\",\n\tCXML: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml\",\n\tCXMLP: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps\",\n\tVBA: \"http://schemas.microsoft.com/office/2006/relationships/vbaProject\"\n});\n\n/* 9.3.3 Representing Relationships */\nfunction get_rels_path(file) {\n\tvar n = file.lastIndexOf(\"/\");\n\treturn file.slice(0,n+1) + '_rels/' + file.slice(n+1) + \".rels\";\n}\n\nfunction parse_rels(data, currentFilePath) {\n\tvar rels = {\"!id\":{}};\n\tif (!data) return rels;\n\tif (currentFilePath.charAt(0) !== '/') {\n\t\tcurrentFilePath = '/'+currentFilePath;\n\t}\n\tvar hash = {};\n\n\t(data.match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\t/* 9.3.2.2 OPC_Relationships */\n\t\tif (y[0] === '2){ o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n\nvar RELS_EXTERN = [RELS.HLINK, RELS.XPATH, RELS.XMISS];\nfunction add_rels(rels, rId, f, type, relobj, targetmode) {\n\tif(!relobj) relobj = {};\n\tif(!rels['!id']) rels['!id'] = {};\n\tif(rId < 0) for(rId = 1; rels['!id']['rId' + rId]; ++rId){/* empty */}\n\trelobj.Id = 'rId' + rId;\n\trelobj.Type = type;\n\trelobj.Target = f;\n\tif(targetmode) relobj.TargetMode = targetmode;\n\telse if(RELS_EXTERN.indexOf(relobj.Type) > -1) relobj.TargetMode = \"External\";\n\tif(rels['!id'][relobj.Id]) throw new Error(\"Cannot rewrite rId \" + rId);\n\trels['!id'][relobj.Id] = relobj;\n\trels[('/' + relobj.Target).replace(\"//\",\"/\")] = relobj;\n\treturn rId;\n}\n/* Open Document Format for Office Applications (OpenDocument) Version 1.2 */\n/* Part 3 Section 4 Manifest File */\nvar CT_ODS = \"application/vnd.oasis.opendocument.spreadsheet\";\nfunction parse_manifest(d, opts) {\n\tvar str = xlml_normalize(d);\n\tvar Rn;\n\tvar FEtag;\n\twhile((Rn = xlmlregex.exec(str))) switch(Rn[3]) {\n\t\tcase 'manifest': break; // 4.2 \n\t\tcase 'file-entry': // 4.3 \n\t\t\tFEtag = parsexmltag(Rn[0], false);\n\t\t\tif(FEtag.path == '/' && FEtag.type !== CT_ODS) throw new Error(\"This OpenDocument is not a spreadsheet\");\n\t\t\tbreak;\n\t\tcase 'encryption-data': // 4.4 \n\t\tcase 'algorithm': // 4.5 \n\t\tcase 'start-key-generation': // 4.6 \n\t\tcase 'key-derivation': // 4.7 \n\t\t\tthrow new Error(\"Unsupported ODS Encryption\");\n\t\tdefault: if(opts && opts.WTF) throw Rn;\n\t}\n}\n\nfunction write_manifest(manifest) {\n\tvar o = [XML_HEADER];\n\to.push('\\n');\n\to.push(' \\n');\n\tfor(var i = 0; i < manifest.length; ++i) o.push(' \\n');\n\to.push('');\n\treturn o.join(\"\");\n}\n\n/* Part 3 Section 6 Metadata Manifest File */\nfunction write_rdf_type(file, res, tag) {\n\treturn [\n\t\t' \\n',\n\t\t' \\n',\n\t\t' \\n'\n\t].join(\"\");\n}\nfunction write_rdf_has(base, file) {\n\treturn [\n\t\t' \\n',\n\t\t' \\n',\n\t\t' \\n'\n\t].join(\"\");\n}\nfunction write_rdf(rdf) {\n\tvar o = [XML_HEADER];\n\to.push('\\n');\n\tfor(var i = 0; i != rdf.length; ++i) {\n\t\to.push(write_rdf_type(rdf[i][0], rdf[i][1]));\n\t\to.push(write_rdf_has(\"\",rdf[i][0]));\n\t}\n\to.push(write_rdf_type(\"\",\"Document\", \"pkg\"));\n\to.push('');\n\treturn o.join(\"\");\n}\n/* TODO: pull properties */\nvar write_meta_ods = (function() {\n\tvar payload = 'Sheet' + 'JS ' + XLSX.version + '';\n\treturn function wmo() {\n\t\treturn payload;\n\t};\n})();\n\n/* ECMA-376 Part II 11.1 Core Properties Part */\n/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */\nvar CORE_PROPS = [\n\t[\"cp:category\", \"Category\"],\n\t[\"cp:contentStatus\", \"ContentStatus\"],\n\t[\"cp:keywords\", \"Keywords\"],\n\t[\"cp:lastModifiedBy\", \"LastAuthor\"],\n\t[\"cp:lastPrinted\", \"LastPrinted\"],\n\t[\"cp:revision\", \"RevNumber\"],\n\t[\"cp:version\", \"Version\"],\n\t[\"dc:creator\", \"Author\"],\n\t[\"dc:description\", \"Comments\"],\n\t[\"dc:identifier\", \"Identifier\"],\n\t[\"dc:language\", \"Language\"],\n\t[\"dc:subject\", \"Subject\"],\n\t[\"dc:title\", \"Title\"],\n\t[\"dcterms:created\", \"CreatedDate\", 'date'],\n\t[\"dcterms:modified\", \"ModifiedDate\", 'date']\n];\n\nXMLNS.CORE_PROPS = \"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\";\nRELS.CORE_PROPS = 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties';\n\nvar CORE_PROPS_REGEX = (function() {\n\tvar r = new Array(CORE_PROPS.length);\n\tfor(var i = 0; i < CORE_PROPS.length; ++i) {\n\t\tvar f = CORE_PROPS[i];\n\t\tvar g = \"(?:\"+ f[0].slice(0,f[0].indexOf(\":\")) +\":)\"+ f[0].slice(f[0].indexOf(\":\")+1);\n\t\tr[i] = new RegExp(\"<\" + g + \"[^>]*>([\\\\s\\\\S]*?)<\\/\" + g + \">\");\n\t}\n\treturn r;\n})();\n\nfunction parse_core_props(data) {\n\tvar p = {};\n\tdata = utf8read(data);\n\n\tfor(var i = 0; i < CORE_PROPS.length; ++i) {\n\t\tvar f = CORE_PROPS[i], cur = data.match(CORE_PROPS_REGEX[i]);\n\t\tif(cur != null && cur.length > 0) p[f[1]] = unescapexml(cur[1]);\n\t\tif(f[2] === 'date' && p[f[1]]) p[f[1]] = parseDate(p[f[1]]);\n\t}\n\n\treturn p;\n}\n\nvar CORE_PROPS_XML_ROOT = writextag('cp:coreProperties', null, {\n\t//'xmlns': XMLNS.CORE_PROPS,\n\t'xmlns:cp': XMLNS.CORE_PROPS,\n\t'xmlns:dc': XMLNS.dc,\n\t'xmlns:dcterms': XMLNS.dcterms,\n\t'xmlns:dcmitype': XMLNS.dcmitype,\n\t'xmlns:xsi': XMLNS.xsi\n});\n\nfunction cp_doit(f, g, h, o, p) {\n\tif(p[f] != null || g == null || g === \"\") return;\n\tp[f] = g;\n\tg = escapexml(g);\n\to[o.length] = (h ? writextag(f,g,h) : writetag(f,g));\n}\n\nfunction write_core_props(cp, _opts) {\n\tvar opts = _opts || {};\n\tvar o = [XML_HEADER, CORE_PROPS_XML_ROOT], p = {};\n\tif(!cp && !opts.Props) return o.join(\"\");\n\n\tif(cp) {\n\t\tif(cp.CreatedDate != null) cp_doit(\"dcterms:created\", typeof cp.CreatedDate === \"string\" ? cp.CreatedDate : write_w3cdtf(cp.CreatedDate, opts.WTF), {\"xsi:type\":\"dcterms:W3CDTF\"}, o, p);\n\t\tif(cp.ModifiedDate != null) cp_doit(\"dcterms:modified\", typeof cp.ModifiedDate === \"string\" ? cp.ModifiedDate : write_w3cdtf(cp.ModifiedDate, opts.WTF), {\"xsi:type\":\"dcterms:W3CDTF\"}, o, p);\n\t}\n\n\tfor(var i = 0; i != CORE_PROPS.length; ++i) {\n\t\tvar f = CORE_PROPS[i];\n\t\tvar v = opts.Props && opts.Props[f[1]] != null ? opts.Props[f[1]] : cp ? cp[f[1]] : null;\n\t\tif(v === true) v = \"1\";\n\t\telse if(v === false) v = \"0\";\n\t\telse if(typeof v == \"number\") v = String(v);\n\t\tif(v != null) cp_doit(f[0], v, null, o, p);\n\t}\n\tif(o.length>2){ o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* 15.2.12.3 Extended File Properties Part */\n/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */\nvar EXT_PROPS = [\n\t[\"Application\", \"Application\", \"string\"],\n\t[\"AppVersion\", \"AppVersion\", \"string\"],\n\t[\"Company\", \"Company\", \"string\"],\n\t[\"DocSecurity\", \"DocSecurity\", \"string\"],\n\t[\"Manager\", \"Manager\", \"string\"],\n\t[\"HyperlinksChanged\", \"HyperlinksChanged\", \"bool\"],\n\t[\"SharedDoc\", \"SharedDoc\", \"bool\"],\n\t[\"LinksUpToDate\", \"LinksUpToDate\", \"bool\"],\n\t[\"ScaleCrop\", \"ScaleCrop\", \"bool\"],\n\t[\"HeadingPairs\", \"HeadingPairs\", \"raw\"],\n\t[\"TitlesOfParts\", \"TitlesOfParts\", \"raw\"]\n];\n\nXMLNS.EXT_PROPS = \"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\";\nRELS.EXT_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties';\n\nvar PseudoPropsPairs = [\n\t\"Worksheets\", \"SheetNames\",\n\t\"NamedRanges\", \"DefinedNames\",\n\t\"Chartsheets\", \"ChartNames\"\n];\nfunction load_props_pairs(HP, TOP, props, opts) {\n\tvar v = [];\n\tif(typeof HP == \"string\") v = parseVector(HP, opts);\n\telse for(var j = 0; j < HP.length; ++j) v = v.concat(HP[j].map(function(hp) { return {v:hp}; }));\n\tvar parts = (typeof TOP == \"string\") ? parseVector(TOP, opts).map(function (x) { return x.v; }) : TOP;\n\tvar idx = 0, len = 0;\n\tif(parts.length > 0) for(var i = 0; i !== v.length; i += 2) {\n\t\tlen = +(v[i+1].v);\n\t\tswitch(v[i].v) {\n\t\t\tcase \"Worksheets\":\n\t\t\tcase \"工作表\":\n\t\t\tcase \"Листы\":\n\t\t\tcase \"أوراق العمل\":\n\t\t\tcase \"ワークシート\":\n\t\t\tcase \"גליונות עבודה\":\n\t\t\tcase \"Arbeitsblätter\":\n\t\t\tcase \"Çalışma Sayfaları\":\n\t\t\tcase \"Feuilles de calcul\":\n\t\t\tcase \"Fogli di lavoro\":\n\t\t\tcase \"Folhas de cálculo\":\n\t\t\tcase \"Planilhas\":\n\t\t\tcase \"Regneark\":\n\t\t\tcase \"Hojas de cálculo\":\n\t\t\tcase \"Werkbladen\":\n\t\t\t\tprops.Worksheets = len;\n\t\t\t\tprops.SheetNames = parts.slice(idx, idx + len);\n\t\t\t\tbreak;\n\n\t\t\tcase \"Named Ranges\":\n\t\t\tcase \"Rangos con nombre\":\n\t\t\tcase \"名前付き一覧\":\n\t\t\tcase \"Benannte Bereiche\":\n\t\t\tcase \"Navngivne områder\":\n\t\t\t\tprops.NamedRanges = len;\n\t\t\t\tprops.DefinedNames = parts.slice(idx, idx + len);\n\t\t\t\tbreak;\n\n\t\t\tcase \"Charts\":\n\t\t\tcase \"Diagramme\":\n\t\t\t\tprops.Chartsheets = len;\n\t\t\t\tprops.ChartNames = parts.slice(idx, idx + len);\n\t\t\t\tbreak;\n\t\t}\n\t\tidx += len;\n\t}\n}\n\nfunction parse_ext_props(data, p, opts) {\n\tvar q = {}; if(!p) p = {};\n\tdata = utf8read(data);\n\n\tEXT_PROPS.forEach(function(f) {\n\t\tvar xml = (data.match(matchtag(f[0]))||[])[1];\n\t\tswitch(f[2]) {\n\t\t\tcase \"string\": if(xml) p[f[1]] = unescapexml(xml); break;\n\t\t\tcase \"bool\": p[f[1]] = xml === \"true\"; break;\n\t\t\tcase \"raw\":\n\t\t\t\tvar cur = data.match(new RegExp(\"<\" + f[0] + \"[^>]*>([\\\\s\\\\S]*?)<\\/\" + f[0] + \">\"));\n\t\t\t\tif(cur && cur.length > 0) q[f[1]] = cur[1];\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tif(q.HeadingPairs && q.TitlesOfParts) load_props_pairs(q.HeadingPairs, q.TitlesOfParts, p, opts);\n\n\treturn p;\n}\n\nvar EXT_PROPS_XML_ROOT = writextag('Properties', null, {\n\t'xmlns': XMLNS.EXT_PROPS,\n\t'xmlns:vt': XMLNS.vt\n});\n\nfunction write_ext_props(cp) {\n\tvar o = [], W = writextag;\n\tif(!cp) cp = {};\n\tcp.Application = \"SheetJS\";\n\to[o.length] = (XML_HEADER);\n\to[o.length] = (EXT_PROPS_XML_ROOT);\n\n\tEXT_PROPS.forEach(function(f) {\n\t\tif(cp[f[1]] === undefined) return;\n\t\tvar v;\n\t\tswitch(f[2]) {\n\t\t\tcase 'string': v = escapexml(String(cp[f[1]])); break;\n\t\t\tcase 'bool': v = cp[f[1]] ? 'true' : 'false'; break;\n\t\t}\n\t\tif(v !== undefined) o[o.length] = (W(f[0], v));\n\t});\n\n\t/* TODO: HeadingPairs, TitlesOfParts */\n\to[o.length] = (W('HeadingPairs', W('vt:vector', W('vt:variant', 'Worksheets')+W('vt:variant', W('vt:i4', String(cp.Worksheets))), {size:2, baseType:\"variant\"})));\n\to[o.length] = (W('TitlesOfParts', W('vt:vector', cp.SheetNames.map(function(s) { return \"\" + escapexml(s) + \"\"; }).join(\"\"), {size: cp.Worksheets, baseType:\"lpstr\"})));\n\tif(o.length>2){ o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* 15.2.12.2 Custom File Properties Part */\nXMLNS.CUST_PROPS = \"http://schemas.openxmlformats.org/officeDocument/2006/custom-properties\";\nRELS.CUST_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties';\n\nvar custregex = /<[^>]+>[^<]*/g;\nfunction parse_cust_props(data, opts) {\n\tvar p = {}, name = \"\";\n\tvar m = data.match(custregex);\n\tif(m) for(var i = 0; i != m.length; ++i) {\n\t\tvar x = m[i], y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\tcase '': name = null; break;\n\t\t\tdefault: if (x.indexOf('');\n\t\t\t\tvar type = toks[0].slice(4), text = toks[1];\n\t\t\t\t/* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase 'lpstr': case 'bstr': case 'lpwstr':\n\t\t\t\t\t\tp[name] = unescapexml(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'bool':\n\t\t\t\t\t\tp[name] = parsexmlbool(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'i1': case 'i2': case 'i4': case 'i8': case 'int': case 'uint':\n\t\t\t\t\t\tp[name] = parseInt(text, 10);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'r4': case 'r8': case 'decimal':\n\t\t\t\t\t\tp[name] = parseFloat(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'filetime': case 'date':\n\t\t\t\t\t\tp[name] = parseDate(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'cy': case 'error':\n\t\t\t\t\t\tp[name] = unescapexml(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif(type.slice(-1) == '/') break;\n\t\t\t\t\t\tif(opts.WTF && typeof console !== 'undefined') console.warn('Unexpected', x, type, toks);\n\t\t\t\t}\n\t\t\t} else if(x.slice(0,2) === \"2){ o[o.length] = ''; o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* Common Name -> XLML Name */\nvar XLMLDocPropsMap = {\n\tTitle: 'Title',\n\tSubject: 'Subject',\n\tAuthor: 'Author',\n\tKeywords: 'Keywords',\n\tComments: 'Description',\n\tLastAuthor: 'LastAuthor',\n\tRevNumber: 'Revision',\n\tApplication: 'AppName',\n\t/* TotalTime: 'TotalTime', */\n\tLastPrinted: 'LastPrinted',\n\tCreatedDate: 'Created',\n\tModifiedDate: 'LastSaved',\n\t/* Pages */\n\t/* Words */\n\t/* Characters */\n\tCategory: 'Category',\n\t/* PresentationFormat */\n\tManager: 'Manager',\n\tCompany: 'Company',\n\t/* Guid */\n\t/* HyperlinkBase */\n\t/* Bytes */\n\t/* Lines */\n\t/* Paragraphs */\n\t/* CharactersWithSpaces */\n\tAppVersion: 'Version',\n\n\tContentStatus: 'ContentStatus', /* NOTE: missing from schema */\n\tIdentifier: 'Identifier', /* NOTE: missing from schema */\n\tLanguage: 'Language' /* NOTE: missing from schema */\n};\nvar evert_XLMLDPM = evert(XLMLDocPropsMap);\n\nfunction xlml_set_prop(Props, tag, val) {\n\ttag = evert_XLMLDPM[tag] || tag;\n\tProps[tag] = val;\n}\n\nfunction xlml_write_docprops(Props, opts) {\n\tvar o = [];\n\tkeys(XLMLDocPropsMap).map(function(m) {\n\t\tfor(var i = 0; i < CORE_PROPS.length; ++i) if(CORE_PROPS[i][1] == m) return CORE_PROPS[i];\n\t\tfor(i = 0; i < EXT_PROPS.length; ++i) if(EXT_PROPS[i][1] == m) return EXT_PROPS[i];\n\t\tthrow m;\n\t}).forEach(function(p) {\n\t\tif(Props[p[1]] == null) return;\n\t\tvar m = opts && opts.Props && opts.Props[p[1]] != null ? opts.Props[p[1]] : Props[p[1]];\n\t\tswitch(p[2]) {\n\t\t\tcase 'date': m = new Date(m).toISOString().replace(/\\.\\d*Z/,\"Z\"); break;\n\t\t}\n\t\tif(typeof m == 'number') m = String(m);\n\t\telse if(m === true || m === false) { m = m ? \"1\" : \"0\"; }\n\t\telse if(m instanceof Date) m = new Date(m).toISOString().replace(/\\.\\d*Z/,\"\");\n\t\to.push(writetag(XLMLDocPropsMap[p[1]] || p[1], m));\n\t});\n\treturn writextag('DocumentProperties', o.join(\"\"), {xmlns:XLMLNS.o });\n}\nfunction xlml_write_custprops(Props, Custprops) {\n\tvar BLACKLIST = [\"Worksheets\",\"SheetNames\"];\n\tvar T = 'CustomDocumentProperties';\n\tvar o = [];\n\tif(Props) keys(Props).forEach(function(k) {\nif(!Object.prototype.hasOwnProperty.call(Props, k)) return;\n\t\tfor(var i = 0; i < CORE_PROPS.length; ++i) if(k == CORE_PROPS[i][1]) return;\n\t\tfor(i = 0; i < EXT_PROPS.length; ++i) if(k == EXT_PROPS[i][1]) return;\n\t\tfor(i = 0; i < BLACKLIST.length; ++i) if(k == BLACKLIST[i]) return;\n\n\t\tvar m = Props[k];\n\t\tvar t = \"string\";\n\t\tif(typeof m == 'number') { t = \"float\"; m = String(m); }\n\t\telse if(m === true || m === false) { t = \"boolean\"; m = m ? \"1\" : \"0\"; }\n\t\telse m = String(m);\n\t\to.push(writextag(escapexmltag(k), m, {\"dt:dt\":t}));\n\t});\n\tif(Custprops) keys(Custprops).forEach(function(k) {\nif(!Object.prototype.hasOwnProperty.call(Custprops, k)) return;\n\t\tif(Props && Object.prototype.hasOwnProperty.call(Props, k)) return;\n\t\tvar m = Custprops[k];\n\t\tvar t = \"string\";\n\t\tif(typeof m == 'number') { t = \"float\"; m = String(m); }\n\t\telse if(m === true || m === false) { t = \"boolean\"; m = m ? \"1\" : \"0\"; }\n\t\telse if(m instanceof Date) { t = \"dateTime.tz\"; m = m.toISOString(); }\n\t\telse m = String(m);\n\t\to.push(writextag(escapexmltag(k), m, {\"dt:dt\":t}));\n\t});\n\treturn '<' + T + ' xmlns=\"' + XLMLNS.o + '\">' + o.join(\"\") + '';\n}\n/* [MS-DTYP] 2.3.3 FILETIME */\n/* [MS-OLEDS] 2.1.3 FILETIME (Packet Version) */\n/* [MS-OLEPS] 2.8 FILETIME (Packet Version) */\nfunction parse_FILETIME(blob) {\n\tvar dwLowDateTime = blob.read_shift(4), dwHighDateTime = blob.read_shift(4);\n\treturn new Date(((dwHighDateTime/1e7*Math.pow(2,32) + dwLowDateTime/1e7) - 11644473600)*1000).toISOString().replace(/\\.000/,\"\");\n}\nfunction write_FILETIME(time) {\n\tvar date = (typeof time == \"string\") ? new Date(Date.parse(time)) : time;\n\tvar t = date.getTime() / 1000 + 11644473600;\n\tvar l = t % Math.pow(2,32), h = (t - l) / Math.pow(2,32);\n\tl *= 1e7; h *= 1e7;\n\tvar w = (l / Math.pow(2,32)) | 0;\n\tif(w > 0) { l = l % Math.pow(2,32); h += w; }\n\tvar o = new_buf(8); o.write_shift(4, l); o.write_shift(4, h); return o;\n}\n\n/* [MS-OSHARED] 2.3.3.1.4 Lpstr */\nfunction parse_lpstr(blob, type, pad) {\n\tvar start = blob.l;\n\tvar str = blob.read_shift(0, 'lpstr-cp');\n\tif(pad) while((blob.l - start) & 3) ++blob.l;\n\treturn str;\n}\n\n/* [MS-OSHARED] 2.3.3.1.6 Lpwstr */\nfunction parse_lpwstr(blob, type, pad) {\n\tvar str = blob.read_shift(0, 'lpwstr');\n\tif(pad) blob.l += (4 - ((str.length+1) & 3)) & 3;\n\treturn str;\n}\n\n\n/* [MS-OSHARED] 2.3.3.1.11 VtString */\n/* [MS-OSHARED] 2.3.3.1.12 VtUnalignedString */\nfunction parse_VtStringBase(blob, stringType, pad) {\n\tif(stringType === 0x1F /*VT_LPWSTR*/) return parse_lpwstr(blob);\n\treturn parse_lpstr(blob, stringType, pad);\n}\n\nfunction parse_VtString(blob, t, pad) { return parse_VtStringBase(blob, t, pad === false ? 0: 4); }\nfunction parse_VtUnalignedString(blob, t) { if(!t) throw new Error(\"VtUnalignedString must have positive length\"); return parse_VtStringBase(blob, t, 0); }\n\n/* [MS-OSHARED] 2.3.3.1.7 VtVecLpwstrValue */\nfunction parse_VtVecLpwstrValue(blob) {\n\tvar length = blob.read_shift(4);\n\tvar ret = [];\n\tfor(var i = 0; i != length; ++i) {\n\t\tvar start = blob.l;\n\t\tret[i] = blob.read_shift(0, 'lpwstr').replace(chr0,'');\n\t\tif((blob.l - start) & 0x02) blob.l += 2;\n\t}\n\treturn ret;\n}\n\n/* [MS-OSHARED] 2.3.3.1.9 VtVecUnalignedLpstrValue */\nfunction parse_VtVecUnalignedLpstrValue(blob) {\n\tvar length = blob.read_shift(4);\n\tvar ret = [];\n\tfor(var i = 0; i != length; ++i) ret[i] = blob.read_shift(0, 'lpstr-cp').replace(chr0,'');\n\treturn ret;\n}\n\n\n/* [MS-OSHARED] 2.3.3.1.13 VtHeadingPair */\nfunction parse_VtHeadingPair(blob) {\n\tvar start = blob.l;\n\tvar headingString = parse_TypedPropertyValue(blob, VT_USTR);\n\tif(blob[blob.l] == 0x00 && blob[blob.l+1] == 0x00 && ((blob.l - start) & 0x02)) blob.l += 2;\n\tvar headerParts = parse_TypedPropertyValue(blob, VT_I4);\n\treturn [headingString, headerParts];\n}\n\n/* [MS-OSHARED] 2.3.3.1.14 VtVecHeadingPairValue */\nfunction parse_VtVecHeadingPairValue(blob) {\n\tvar cElements = blob.read_shift(4);\n\tvar out = [];\n\tfor(var i = 0; i < cElements / 2; ++i) out.push(parse_VtHeadingPair(blob));\n\treturn out;\n}\n\n/* [MS-OLEPS] 2.18.1 Dictionary (uses 2.17, 2.16) */\nfunction parse_dictionary(blob,CodePage) {\n\tvar cnt = blob.read_shift(4);\n\tvar dict = ({});\n\tfor(var j = 0; j != cnt; ++j) {\n\t\tvar pid = blob.read_shift(4);\n\t\tvar len = blob.read_shift(4);\n\t\tdict[pid] = blob.read_shift(len, (CodePage === 0x4B0 ?'utf16le':'utf8')).replace(chr0,'').replace(chr1,'!');\n\t\tif(CodePage === 0x4B0 && (len % 2)) blob.l += 2;\n\t}\n\tif(blob.l & 3) blob.l = (blob.l>>2+1)<<2;\n\treturn dict;\n}\n\n/* [MS-OLEPS] 2.9 BLOB */\nfunction parse_BLOB(blob) {\n\tvar size = blob.read_shift(4);\n\tvar bytes = blob.slice(blob.l,blob.l+size);\n\tblob.l += size;\n\tif((size & 3) > 0) blob.l += (4 - (size & 3)) & 3;\n\treturn bytes;\n}\n\n/* [MS-OLEPS] 2.11 ClipboardData */\nfunction parse_ClipboardData(blob) {\n\t// TODO\n\tvar o = {};\n\to.Size = blob.read_shift(4);\n\t//o.Format = blob.read_shift(4);\n\tblob.l += o.Size + 3 - (o.Size - 1) % 4;\n\treturn o;\n}\n\n/* [MS-OLEPS] 2.15 TypedPropertyValue */\nfunction parse_TypedPropertyValue(blob, type, _opts) {\n\tvar t = blob.read_shift(2), ret, opts = _opts||{};\n\tblob.l += 2;\n\tif(type !== VT_VARIANT)\n\tif(t !== type && VT_CUSTOM.indexOf(type)===-1 && !((type & 0xFFFE) == 0x101E && (t & 0xFFFE) == 0x101E)) throw new Error('Expected type ' + type + ' saw ' + t);\n\tswitch(type === VT_VARIANT ? t : type) {\n\t\tcase 0x02 /*VT_I2*/: ret = blob.read_shift(2, 'i'); if(!opts.raw) blob.l += 2; return ret;\n\t\tcase 0x03 /*VT_I4*/: ret = blob.read_shift(4, 'i'); return ret;\n\t\tcase 0x0B /*VT_BOOL*/: return blob.read_shift(4) !== 0x0;\n\t\tcase 0x13 /*VT_UI4*/: ret = blob.read_shift(4); return ret;\n\t\tcase 0x1E /*VT_LPSTR*/: return parse_lpstr(blob, t, 4).replace(chr0,'');\n\t\tcase 0x1F /*VT_LPWSTR*/: return parse_lpwstr(blob);\n\t\tcase 0x40 /*VT_FILETIME*/: return parse_FILETIME(blob);\n\t\tcase 0x41 /*VT_BLOB*/: return parse_BLOB(blob);\n\t\tcase 0x47 /*VT_CF*/: return parse_ClipboardData(blob);\n\t\tcase 0x50 /*VT_STRING*/: return parse_VtString(blob, t, !opts.raw).replace(chr0,'');\n\t\tcase 0x51 /*VT_USTR*/: return parse_VtUnalignedString(blob, t/*, 4*/).replace(chr0,'');\n\t\tcase 0x100C /*VT_VECTOR|VT_VARIANT*/: return parse_VtVecHeadingPairValue(blob);\n\t\tcase 0x101E /*VT_VECTOR|VT_LPSTR*/:\n\t\tcase 0x101F /*VT_VECTOR|VT_LPWSTR*/:\n\t\t\treturn t == 0x101F ? parse_VtVecLpwstrValue(blob) : parse_VtVecUnalignedLpstrValue(blob);\n\t\tdefault: throw new Error(\"TypedPropertyValue unrecognized type \" + type + \" \" + t);\n\t}\n}\nfunction write_TypedPropertyValue(type, value) {\n\tvar o = new_buf(4), p = new_buf(4);\n\to.write_shift(4, type == 0x50 ? 0x1F : type);\n\tswitch(type) {\n\t\tcase 0x03 /*VT_I4*/: p.write_shift(-4, value); break;\n\t\tcase 0x05 /*VT_I4*/: p = new_buf(8); p.write_shift(8, value, 'f'); break;\n\t\tcase 0x0B /*VT_BOOL*/: p.write_shift(4, value ? 0x01 : 0x00); break;\n\t\tcase 0x40 /*VT_FILETIME*/: p = write_FILETIME(value); break;\n\t\tcase 0x1F /*VT_LPWSTR*/:\n\t\tcase 0x50 /*VT_STRING*/:\np = new_buf(4 + 2 * (value.length + 1) + (value.length % 2 ? 0 : 2));\n\t\t\tp.write_shift(4, value.length + 1);\n\t\t\tp.write_shift(0, value, \"dbcs\");\n\t\t\twhile(p.l != p.length) p.write_shift(1, 0);\n\t\t\tbreak;\n\t\tdefault: throw new Error(\"TypedPropertyValue unrecognized type \" + type + \" \" + value);\n\t}\n\treturn bconcat([o, p]);\n}\n\n/* [MS-OLEPS] 2.20 PropertySet */\nfunction parse_PropertySet(blob, PIDSI) {\n\tvar start_addr = blob.l;\n\tvar size = blob.read_shift(4);\n\tvar NumProps = blob.read_shift(4);\n\tvar Props = [], i = 0;\n\tvar CodePage = 0;\n\tvar Dictionary = -1, DictObj = ({});\n\tfor(i = 0; i != NumProps; ++i) {\n\t\tvar PropID = blob.read_shift(4);\n\t\tvar Offset = blob.read_shift(4);\n\t\tProps[i] = [PropID, Offset + start_addr];\n\t}\n\tProps.sort(function(x,y) { return x[1] - y[1]; });\n\tvar PropH = {};\n\tfor(i = 0; i != NumProps; ++i) {\n\t\tif(blob.l !== Props[i][1]) {\n\t\t\tvar fail = true;\n\t\t\tif(i>0 && PIDSI) switch(PIDSI[Props[i-1][0]].t) {\n\t\t\t\tcase 0x02 /*VT_I2*/: if(blob.l+2 === Props[i][1]) { blob.l+=2; fail = false; } break;\n\t\t\t\tcase 0x50 /*VT_STRING*/: if(blob.l <= Props[i][1]) { blob.l=Props[i][1]; fail = false; } break;\n\t\t\t\tcase 0x100C /*VT_VECTOR|VT_VARIANT*/: if(blob.l <= Props[i][1]) { blob.l=Props[i][1]; fail = false; } break;\n\t\t\t}\n\t\t\tif((!PIDSI||i==0) && blob.l <= Props[i][1]) { fail=false; blob.l = Props[i][1]; }\n\t\t\tif(fail) throw new Error(\"Read Error: Expected address \" + Props[i][1] + ' at ' + blob.l + ' :' + i);\n\t\t}\n\t\tif(PIDSI) {\n\t\t\tvar piddsi = PIDSI[Props[i][0]];\n\t\t\tPropH[piddsi.n] = parse_TypedPropertyValue(blob, piddsi.t, {raw:true});\n\t\t\tif(piddsi.p === 'version') PropH[piddsi.n] = String(PropH[piddsi.n] >> 16) + \".\" + (\"0000\" + String(PropH[piddsi.n] & 0xFFFF)).slice(-4);\n\t\t\tif(piddsi.n == \"CodePage\") switch(PropH[piddsi.n]) {\n\t\t\t\tcase 0: PropH[piddsi.n] = 1252;\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase 874:\n\t\t\t\tcase 932:\n\t\t\t\tcase 936:\n\t\t\t\tcase 949:\n\t\t\t\tcase 950:\n\t\t\t\tcase 1250:\n\t\t\t\tcase 1251:\n\t\t\t\tcase 1253:\n\t\t\t\tcase 1254:\n\t\t\t\tcase 1255:\n\t\t\t\tcase 1256:\n\t\t\t\tcase 1257:\n\t\t\t\tcase 1258:\n\t\t\t\tcase 10000:\n\t\t\t\tcase 1200:\n\t\t\t\tcase 1201:\n\t\t\t\tcase 1252:\n\t\t\t\tcase 65000: case -536:\n\t\t\t\tcase 65001: case -535:\n\t\t\t\t\tset_cp(CodePage = (PropH[piddsi.n]>>>0) & 0xFFFF); break;\n\t\t\t\tdefault: throw new Error(\"Unsupported CodePage: \" + PropH[piddsi.n]);\n\t\t\t}\n\t\t} else {\n\t\t\tif(Props[i][0] === 0x1) {\n\t\t\t\tCodePage = PropH.CodePage = (parse_TypedPropertyValue(blob, VT_I2));\n\t\t\t\tset_cp(CodePage);\n\t\t\t\tif(Dictionary !== -1) {\n\t\t\t\t\tvar oldpos = blob.l;\n\t\t\t\t\tblob.l = Props[Dictionary][1];\n\t\t\t\t\tDictObj = parse_dictionary(blob,CodePage);\n\t\t\t\t\tblob.l = oldpos;\n\t\t\t\t}\n\t\t\t} else if(Props[i][0] === 0) {\n\t\t\t\tif(CodePage === 0) { Dictionary = i; blob.l = Props[i+1][1]; continue; }\n\t\t\t\tDictObj = parse_dictionary(blob,CodePage);\n\t\t\t} else {\n\t\t\t\tvar name = DictObj[Props[i][0]];\n\t\t\t\tvar val;\n\t\t\t\t/* [MS-OSHARED] 2.3.3.2.3.1.2 + PROPVARIANT */\n\t\t\t\tswitch(blob[blob.l]) {\n\t\t\t\t\tcase 0x41 /*VT_BLOB*/: blob.l += 4; val = parse_BLOB(blob); break;\n\t\t\t\t\tcase 0x1E /*VT_LPSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]).replace(/\\u0000+$/,\"\"); break;\n\t\t\t\t\tcase 0x1F /*VT_LPWSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]).replace(/\\u0000+$/,\"\"); break;\n\t\t\t\t\tcase 0x03 /*VT_I4*/: blob.l += 4; val = blob.read_shift(4, 'i'); break;\n\t\t\t\t\tcase 0x13 /*VT_UI4*/: blob.l += 4; val = blob.read_shift(4); break;\n\t\t\t\t\tcase 0x05 /*VT_R8*/: blob.l += 4; val = blob.read_shift(8, 'f'); break;\n\t\t\t\t\tcase 0x0B /*VT_BOOL*/: blob.l += 4; val = parsebool(blob, 4); break;\n\t\t\t\t\tcase 0x40 /*VT_FILETIME*/: blob.l += 4; val = parseDate(parse_FILETIME(blob)); break;\n\t\t\t\t\tdefault: throw new Error(\"unparsed value: \" + blob[blob.l]);\n\t\t\t\t}\n\t\t\t\tPropH[name] = val;\n\t\t\t}\n\t\t}\n\t}\n\tblob.l = start_addr + size; /* step ahead to skip padding */\n\treturn PropH;\n}\nvar XLSPSSkip = [ \"CodePage\", \"Thumbnail\", \"_PID_LINKBASE\", \"_PID_HLINKS\", \"SystemIdentifier\", \"FMTID\" ].concat(PseudoPropsPairs);\nfunction guess_property_type(val) {\n\tswitch(typeof val) {\n\t\tcase \"boolean\": return 0x0B;\n\t\tcase \"number\": return ((val|0)==val) ? 0x03 : 0x05;\n\t\tcase \"string\": return 0x1F;\n\t\tcase \"object\": if(val instanceof Date) return 0x40; break;\n\t}\n\treturn -1;\n}\nfunction write_PropertySet(entries, RE, PIDSI) {\n\tvar hdr = new_buf(8), piao = [], prop = [];\n\tvar sz = 8, i = 0;\n\n\tvar pr = new_buf(8), pio = new_buf(8);\n\tpr.write_shift(4, 0x0002);\n\tpr.write_shift(4, 0x04B0);\n\tpio.write_shift(4, 0x0001);\n\tprop.push(pr); piao.push(pio);\n\tsz += 8 + pr.length;\n\n\tif(!RE) {\n\t\tpio = new_buf(8);\n\t\tpio.write_shift(4, 0);\n\t\tpiao.unshift(pio);\n\n\t\tvar bufs = [new_buf(4)];\n\t\tbufs[0].write_shift(4, entries.length);\n\t\tfor(i = 0; i < entries.length; ++i) {\n\t\t\tvar value = entries[i][0];\n\t\t\tpr = new_buf(4 + 4 + 2 * (value.length + 1) + (value.length % 2 ? 0 : 2));\n\t\t\tpr.write_shift(4, i+2);\n\t\t\tpr.write_shift(4, value.length + 1);\n\t\t\tpr.write_shift(0, value, \"dbcs\");\n\t\t\twhile(pr.l != pr.length) pr.write_shift(1, 0);\n\t\t\tbufs.push(pr);\n\t\t}\n\t\tpr = bconcat(bufs);\n\t\tprop.unshift(pr);\n\t\tsz += 8 + pr.length;\n\t}\n\n\tfor(i = 0; i < entries.length; ++i) {\n\t\tif(RE && !RE[entries[i][0]]) continue;\n\t\tif(XLSPSSkip.indexOf(entries[i][0]) > -1) continue;\n\t\tif(entries[i][1] == null) continue;\n\n\t\tvar val = entries[i][1], idx = 0;\n\t\tif(RE) {\n\t\t\tidx = +RE[entries[i][0]];\n\t\t\tvar pinfo = (PIDSI)[idx];\n\t\t\tif(pinfo.p == \"version\" && typeof val == \"string\") {\nvar arr = val.split(\".\");\n\t\t\t\tval = ((+arr[0])<<16) + ((+arr[1])||0);\n\t\t\t}\n\t\t\tpr = write_TypedPropertyValue(pinfo.t, val);\n\t\t} else {\n\t\t\tvar T = guess_property_type(val);\n\t\t\tif(T == -1) { T = 0x1F; val = String(val); }\n\t\t\tpr = write_TypedPropertyValue(T, val);\n\t\t}\n\t\tprop.push(pr);\n\n\t\tpio = new_buf(8);\n\t\tpio.write_shift(4, !RE ? 2+i : idx);\n\t\tpiao.push(pio);\n\n\t\tsz += 8 + pr.length;\n\t}\n\n\tvar w = 8 * (prop.length + 1);\n\tfor(i = 0; i < prop.length; ++i) { piao[i].write_shift(4, w); w += prop[i].length; }\n\thdr.write_shift(4, sz);\n\thdr.write_shift(4, prop.length);\n\treturn bconcat([hdr].concat(piao).concat(prop));\n}\n\n/* [MS-OLEPS] 2.21 PropertySetStream */\nfunction parse_PropertySetStream(file, PIDSI, clsid) {\n\tvar blob = file.content;\n\tif(!blob) return ({});\n\tprep_blob(blob, 0);\n\n\tvar NumSets, FMTID0, FMTID1, Offset0, Offset1 = 0;\n\tblob.chk('feff', 'Byte Order: ');\n\n\t/*var vers = */blob.read_shift(2); // TODO: check version\n\tvar SystemIdentifier = blob.read_shift(4);\n\tvar CLSID = blob.read_shift(16);\n\tif(CLSID !== CFB.utils.consts.HEADER_CLSID && CLSID !== clsid) throw new Error(\"Bad PropertySet CLSID \" + CLSID);\n\tNumSets = blob.read_shift(4);\n\tif(NumSets !== 1 && NumSets !== 2) throw new Error(\"Unrecognized #Sets: \" + NumSets);\n\tFMTID0 = blob.read_shift(16); Offset0 = blob.read_shift(4);\n\n\tif(NumSets === 1 && Offset0 !== blob.l) throw new Error(\"Length mismatch: \" + Offset0 + \" !== \" + blob.l);\n\telse if(NumSets === 2) { FMTID1 = blob.read_shift(16); Offset1 = blob.read_shift(4); }\n\tvar PSet0 = parse_PropertySet(blob, PIDSI);\n\n\tvar rval = ({ SystemIdentifier: SystemIdentifier });\n\tfor(var y in PSet0) rval[y] = PSet0[y];\n\t//rval.blob = blob;\n\trval.FMTID = FMTID0;\n\t//rval.PSet0 = PSet0;\n\tif(NumSets === 1) return rval;\n\tif(Offset1 - blob.l == 2) blob.l += 2;\n\tif(blob.l !== Offset1) throw new Error(\"Length mismatch 2: \" + blob.l + \" !== \" + Offset1);\n\tvar PSet1;\n\ttry { PSet1 = parse_PropertySet(blob, null); } catch(e) {/* empty */}\n\tfor(y in PSet1) rval[y] = PSet1[y];\n\trval.FMTID = [FMTID0, FMTID1]; // TODO: verify FMTID0/1\n\treturn rval;\n}\nfunction write_PropertySetStream(entries, clsid, RE, PIDSI, entries2, clsid2) {\n\tvar hdr = new_buf(entries2 ? 68 : 48);\n\tvar bufs = [hdr];\n\thdr.write_shift(2, 0xFFFE);\n\thdr.write_shift(2, 0x0000); /* TODO: type 1 props */\n\thdr.write_shift(4, 0x32363237);\n\thdr.write_shift(16, CFB.utils.consts.HEADER_CLSID, \"hex\");\n\thdr.write_shift(4, (entries2 ? 2 : 1));\n\thdr.write_shift(16, clsid, \"hex\");\n\thdr.write_shift(4, (entries2 ? 68 : 48));\n\tvar ps0 = write_PropertySet(entries, RE, PIDSI);\n\tbufs.push(ps0);\n\n\tif(entries2) {\n\t\tvar ps1 = write_PropertySet(entries2, null, null);\n\t\thdr.write_shift(16, clsid2, \"hex\");\n\t\thdr.write_shift(4, 68 + ps0.length);\n\t\tbufs.push(ps1);\n\t}\n\treturn bconcat(bufs);\n}\n\nfunction parsenoop2(blob, length) { blob.read_shift(length); return null; }\nfunction writezeroes(n, o) { if(!o) o=new_buf(n); for(var j=0; j= 12 ? 2 : 1);\n\tvar encoding = 'sbcs-cont';\n\tvar cp = current_codepage;\n\tif(opts && opts.biff >= 8) current_codepage = 1200;\n\tif(!opts || opts.biff == 8 ) {\n\t\tvar fHighByte = blob.read_shift(1);\n\t\tif(fHighByte) { encoding = 'dbcs-cont'; }\n\t} else if(opts.biff == 12) {\n\t\tencoding = 'wstr';\n\t}\n\tif(opts.biff >= 2 && opts.biff <= 5) encoding = 'cpstr';\n\tvar o = cch ? blob.read_shift(cch, encoding) : \"\";\n\tcurrent_codepage = cp;\n\treturn o;\n}\n\n/* 2.5.293 XLUnicodeRichExtendedString */\nfunction parse_XLUnicodeRichExtendedString(blob) {\n\tvar cp = current_codepage;\n\tcurrent_codepage = 1200;\n\tvar cch = blob.read_shift(2), flags = blob.read_shift(1);\n\tvar /*fHighByte = flags & 0x1,*/ fExtSt = flags & 0x4, fRichSt = flags & 0x8;\n\tvar width = 1 + (flags & 0x1); // 0x0 -> utf8, 0x1 -> dbcs\n\tvar cRun = 0, cbExtRst;\n\tvar z = {};\n\tif(fRichSt) cRun = blob.read_shift(2);\n\tif(fExtSt) cbExtRst = blob.read_shift(4);\n\tvar encoding = width == 2 ? 'dbcs-cont' : 'sbcs-cont';\n\tvar msg = cch === 0 ? \"\" : blob.read_shift(cch, encoding);\n\tif(fRichSt) blob.l += 4 * cRun; //TODO: parse this\n\tif(fExtSt) blob.l += cbExtRst; //TODO: parse this\n\tz.t = msg;\n\tif(!fRichSt) { z.raw = \"\" + z.t + \"\"; z.r = z.t; }\n\tcurrent_codepage = cp;\n\treturn z;\n}\nfunction write_XLUnicodeRichExtendedString(xlstr) {\n\tvar str = (xlstr.t||\"\"), nfmts = 1;\n\n\tvar hdr = new_buf(3 + (nfmts > 1 ? 2 : 0));\n\thdr.write_shift(2, str.length);\n\thdr.write_shift(1, (nfmts > 1 ? 0x08 : 0x00) | 0x01);\n\tif(nfmts > 1) hdr.write_shift(2, nfmts);\n\n\tvar otext = new_buf(2 * str.length);\n\totext.write_shift(2 * str.length, str, 'utf16le');\n\n\tvar out = [hdr, otext];\n\n\treturn bconcat(out);\n}\n\n/* 2.5.296 XLUnicodeStringNoCch */\nfunction parse_XLUnicodeStringNoCch(blob, cch, opts) {\n\tvar retval;\n\tif(opts) {\n\t\tif(opts.biff >= 2 && opts.biff <= 5) return blob.read_shift(cch, 'cpstr');\n\t\tif(opts.biff >= 12) return blob.read_shift(cch, 'dbcs-cont');\n\t}\n\tvar fHighByte = blob.read_shift(1);\n\tif(fHighByte===0) { retval = blob.read_shift(cch, 'sbcs-cont'); }\n\telse { retval = blob.read_shift(cch, 'dbcs-cont'); }\n\treturn retval;\n}\n\n/* 2.5.294 XLUnicodeString */\nfunction parse_XLUnicodeString(blob, length, opts) {\n\tvar cch = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);\n\tif(cch === 0) { blob.l++; return \"\"; }\n\treturn parse_XLUnicodeStringNoCch(blob, cch, opts);\n}\n/* BIFF5 override */\nfunction parse_XLUnicodeString2(blob, length, opts) {\n\tif(opts.biff > 5) return parse_XLUnicodeString(blob, length, opts);\n\tvar cch = blob.read_shift(1);\n\tif(cch === 0) { blob.l++; return \"\"; }\n\treturn blob.read_shift(cch, (opts.biff <= 4 || !blob.lens ) ? 'cpstr' : 'sbcs-cont');\n}\n/* TODO: BIFF5 and lower, codepage awareness */\nfunction write_XLUnicodeString(str, opts, o) {\n\tif(!o) o = new_buf(3 + 2 * str.length);\n\to.write_shift(2, str.length);\n\to.write_shift(1, 1);\n\to.write_shift(31, str, 'utf16le');\n\treturn o;\n}\n\n/* [MS-XLS] 2.5.61 ControlInfo */\nfunction parse_ControlInfo(blob) {\n\tvar flags = blob.read_shift(1);\n\tblob.l++;\n\tvar accel = blob.read_shift(2);\n\tblob.l += 2;\n\treturn [flags, accel];\n}\n\n/* [MS-OSHARED] 2.3.7.6 URLMoniker TODO: flags */\nfunction parse_URLMoniker(blob) {\n\tvar len = blob.read_shift(4), start = blob.l;\n\tvar extra = false;\n\tif(len > 24) {\n\t\t/* look ahead */\n\t\tblob.l += len - 24;\n\t\tif(blob.read_shift(16) === \"795881f43b1d7f48af2c825dc4852763\") extra = true;\n\t\tblob.l = start;\n\t}\n\tvar url = blob.read_shift((extra?len-24:len)>>1, 'utf16le').replace(chr0,\"\");\n\tif(extra) blob.l += 24;\n\treturn url;\n}\n\n/* [MS-OSHARED] 2.3.7.8 FileMoniker TODO: all fields */\nfunction parse_FileMoniker(blob) {\n\tvar cAnti = blob.read_shift(2);\n\tvar preamble = \"\"; while(cAnti-- > 0) preamble += \"../\";\n\tvar ansiPath = blob.read_shift(0, 'lpstr-ansi');\n\tblob.l += 2; //var endServer = blob.read_shift(2);\n\tif(blob.read_shift(2) != 0xDEAD) throw new Error(\"Bad FileMoniker\");\n\tvar sz = blob.read_shift(4);\n\tif(sz === 0) return preamble + ansiPath.replace(/\\\\/g,\"/\");\n\tvar bytes = blob.read_shift(4);\n\tif(blob.read_shift(2) != 3) throw new Error(\"Bad FileMoniker\");\n\tvar unicodePath = blob.read_shift(bytes>>1, 'utf16le').replace(chr0,\"\");\n\treturn preamble + unicodePath;\n}\n\n/* [MS-OSHARED] 2.3.7.2 HyperlinkMoniker TODO: all the monikers */\nfunction parse_HyperlinkMoniker(blob, length) {\n\tvar clsid = blob.read_shift(16); length -= 16;\n\tswitch(clsid) {\n\t\tcase \"e0c9ea79f9bace118c8200aa004ba90b\": return parse_URLMoniker(blob, length);\n\t\tcase \"0303000000000000c000000000000046\": return parse_FileMoniker(blob, length);\n\t\tdefault: throw new Error(\"Unsupported Moniker \" + clsid);\n\t}\n}\n\n/* [MS-OSHARED] 2.3.7.9 HyperlinkString */\nfunction parse_HyperlinkString(blob) {\n\tvar len = blob.read_shift(4);\n\tvar o = len > 0 ? blob.read_shift(len, 'utf16le').replace(chr0, \"\") : \"\";\n\treturn o;\n}\nfunction write_HyperlinkString(str, o) {\n\tif(!o) o = new_buf(6 + str.length * 2);\n\to.write_shift(4, 1 + str.length);\n\tfor(var i = 0; i < str.length; ++i) o.write_shift(2, str.charCodeAt(i));\n\to.write_shift(2, 0);\n\treturn o;\n}\n\n/* [MS-OSHARED] 2.3.7.1 Hyperlink Object */\nfunction parse_Hyperlink(blob, length) {\n\tvar end = blob.l + length;\n\tvar sVer = blob.read_shift(4);\n\tif(sVer !== 2) throw new Error(\"Unrecognized streamVersion: \" + sVer);\n\tvar flags = blob.read_shift(2);\n\tblob.l += 2;\n\tvar displayName, targetFrameName, moniker, oleMoniker, Loc=\"\", guid, fileTime;\n\tif(flags & 0x0010) displayName = parse_HyperlinkString(blob, end - blob.l);\n\tif(flags & 0x0080) targetFrameName = parse_HyperlinkString(blob, end - blob.l);\n\tif((flags & 0x0101) === 0x0101) moniker = parse_HyperlinkString(blob, end - blob.l);\n\tif((flags & 0x0101) === 0x0001) oleMoniker = parse_HyperlinkMoniker(blob, end - blob.l);\n\tif(flags & 0x0008) Loc = parse_HyperlinkString(blob, end - blob.l);\n\tif(flags & 0x0020) guid = blob.read_shift(16);\n\tif(flags & 0x0040) fileTime = parse_FILETIME(blob/*, 8*/);\n\tblob.l = end;\n\tvar target = targetFrameName||moniker||oleMoniker||\"\";\n\tif(target && Loc) target+=\"#\"+Loc;\n\tif(!target) target = \"#\" + Loc;\n\tif((flags & 0x0002) && target.charAt(0) == \"/\" && target.charAt(1) != \"/\") target = \"file://\" + target;\n\tvar out = ({Target:target});\n\tif(guid) out.guid = guid;\n\tif(fileTime) out.time = fileTime;\n\tif(displayName) out.Tooltip = displayName;\n\treturn out;\n}\nfunction write_Hyperlink(hl) {\n\tvar out = new_buf(512), i = 0;\n\tvar Target = hl.Target;\n\tif(Target.slice(0,7) == \"file://\") Target = Target.slice(7);\n\tvar hashidx = Target.indexOf(\"#\");\n\tvar F = hashidx > -1 ? 0x1f : 0x17;\n\tswitch(Target.charAt(0)) { case \"#\": F=0x1c; break; case \".\": F&=~2; break; }\n\tout.write_shift(4,2); out.write_shift(4, F);\n\tvar data = [8,6815827,6619237,4849780,83]; for(i = 0; i < data.length; ++i) out.write_shift(4, data[i]);\n\tif(F == 0x1C) {\n\t\tTarget = Target.slice(1);\n\t\twrite_HyperlinkString(Target, out);\n\t} else if(F & 0x02) {\n\t\tdata = \"e0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b\".split(\" \");\n\t\tfor(i = 0; i < data.length; ++i) out.write_shift(1, parseInt(data[i], 16));\n\t\tvar Pretarget = hashidx > -1 ? Target.slice(0, hashidx) : Target;\n\t\tout.write_shift(4, 2*(Pretarget.length + 1));\n\t\tfor(i = 0; i < Pretarget.length; ++i) out.write_shift(2, Pretarget.charCodeAt(i));\n\t\tout.write_shift(2, 0);\n\t\tif(F & 0x08) write_HyperlinkString(hashidx > -1 ? Target.slice(hashidx+1): \"\", out);\n\t} else {\n\t\tdata = \"03 03 00 00 00 00 00 00 c0 00 00 00 00 00 00 46\".split(\" \");\n\t\tfor(i = 0; i < data.length; ++i) out.write_shift(1, parseInt(data[i], 16));\n\t\tvar P = 0;\n\t\twhile(Target.slice(P*3,P*3+3)==\"../\"||Target.slice(P*3,P*3+3)==\"..\\\\\") ++P;\n\t\tout.write_shift(2, P);\n\t\tout.write_shift(4, Target.length - 3 * P + 1);\n\t\tfor(i = 0; i < Target.length - 3 * P; ++i) out.write_shift(1, Target.charCodeAt(i + 3 * P) & 0xFF);\n\t\tout.write_shift(1, 0);\n\t\tout.write_shift(2, 0xFFFF);\n\t\tout.write_shift(2, 0xDEAD);\n\t\tfor(i = 0; i < 6; ++i) out.write_shift(4, 0);\n\t}\n\treturn out.slice(0, out.l);\n}\n\n/* 2.5.178 LongRGBA */\nfunction parse_LongRGBA(blob) { var r = blob.read_shift(1), g = blob.read_shift(1), b = blob.read_shift(1), a = blob.read_shift(1); return [r,g,b,a]; }\n\n/* 2.5.177 LongRGB */\nfunction parse_LongRGB(blob, length) { var x = parse_LongRGBA(blob, length); x[3] = 0; return x; }\n\n\n/* [MS-XLS] 2.5.19 */\nfunction parse_XLSCell(blob) {\n\tvar rw = blob.read_shift(2); // 0-indexed\n\tvar col = blob.read_shift(2);\n\tvar ixfe = blob.read_shift(2);\n\treturn ({r:rw, c:col, ixfe:ixfe});\n}\nfunction write_XLSCell(R, C, ixfe, o) {\n\tif(!o) o = new_buf(6);\n\to.write_shift(2, R);\n\to.write_shift(2, C);\n\to.write_shift(2, ixfe||0);\n\treturn o;\n}\n\n/* [MS-XLS] 2.5.134 */\nfunction parse_frtHeader(blob) {\n\tvar rt = blob.read_shift(2);\n\tvar flags = blob.read_shift(2); // TODO: parse these flags\n\tblob.l += 8;\n\treturn {type: rt, flags: flags};\n}\n\n\n\nfunction parse_OptXLUnicodeString(blob, length, opts) { return length === 0 ? \"\" : parse_XLUnicodeString2(blob, length, opts); }\n\n/* [MS-XLS] 2.5.344 */\nfunction parse_XTI(blob, length, opts) {\n\tvar w = opts.biff > 8 ? 4 : 2;\n\tvar iSupBook = blob.read_shift(w), itabFirst = blob.read_shift(w,'i'), itabLast = blob.read_shift(w,'i');\n\treturn [iSupBook, itabFirst, itabLast];\n}\n\n/* [MS-XLS] 2.5.218 */\nfunction parse_RkRec(blob) {\n\tvar ixfe = blob.read_shift(2);\n\tvar RK = parse_RkNumber(blob);\n\treturn [ixfe, RK];\n}\n\n/* [MS-XLS] 2.5.1 */\nfunction parse_AddinUdf(blob, length, opts) {\n\tblob.l += 4; length -= 4;\n\tvar l = blob.l + length;\n\tvar udfName = parse_ShortXLUnicodeString(blob, length, opts);\n\tvar cb = blob.read_shift(2);\n\tl -= blob.l;\n\tif(cb !== l) throw new Error(\"Malformed AddinUdf: padding = \" + l + \" != \" + cb);\n\tblob.l += cb;\n\treturn udfName;\n}\n\n/* [MS-XLS] 2.5.209 TODO: Check sizes */\nfunction parse_Ref8U(blob) {\n\tvar rwFirst = blob.read_shift(2);\n\tvar rwLast = blob.read_shift(2);\n\tvar colFirst = blob.read_shift(2);\n\tvar colLast = blob.read_shift(2);\n\treturn {s:{c:colFirst, r:rwFirst}, e:{c:colLast,r:rwLast}};\n}\nfunction write_Ref8U(r, o) {\n\tif(!o) o = new_buf(8);\n\to.write_shift(2, r.s.r);\n\to.write_shift(2, r.e.r);\n\to.write_shift(2, r.s.c);\n\to.write_shift(2, r.e.c);\n\treturn o;\n}\n\n/* [MS-XLS] 2.5.211 */\nfunction parse_RefU(blob) {\n\tvar rwFirst = blob.read_shift(2);\n\tvar rwLast = blob.read_shift(2);\n\tvar colFirst = blob.read_shift(1);\n\tvar colLast = blob.read_shift(1);\n\treturn {s:{c:colFirst, r:rwFirst}, e:{c:colLast,r:rwLast}};\n}\n\n/* [MS-XLS] 2.5.207 */\nvar parse_Ref = parse_RefU;\n\n/* [MS-XLS] 2.5.143 */\nfunction parse_FtCmo(blob) {\n\tblob.l += 4;\n\tvar ot = blob.read_shift(2);\n\tvar id = blob.read_shift(2);\n\tvar flags = blob.read_shift(2);\n\tblob.l+=12;\n\treturn [id, ot, flags];\n}\n\n/* [MS-XLS] 2.5.149 */\nfunction parse_FtNts(blob) {\n\tvar out = {};\n\tblob.l += 4;\n\tblob.l += 16; // GUID TODO\n\tout.fSharedNote = blob.read_shift(2);\n\tblob.l += 4;\n\treturn out;\n}\n\n/* [MS-XLS] 2.5.142 */\nfunction parse_FtCf(blob) {\n\tvar out = {};\n\tblob.l += 4;\n\tblob.cf = blob.read_shift(2);\n\treturn out;\n}\n\n/* [MS-XLS] 2.5.140 - 2.5.154 and friends */\nfunction parse_FtSkip(blob) { blob.l += 2; blob.l += blob.read_shift(2); }\nvar FtTab = {\n0x00: parse_FtSkip, /* FtEnd */\n0x04: parse_FtSkip, /* FtMacro */\n0x05: parse_FtSkip, /* FtButton */\n0x06: parse_FtSkip, /* FtGmo */\n0x07: parse_FtCf, /* FtCf */\n0x08: parse_FtSkip, /* FtPioGrbit */\n0x09: parse_FtSkip, /* FtPictFmla */\n0x0A: parse_FtSkip, /* FtCbls */\n0x0B: parse_FtSkip, /* FtRbo */\n0x0C: parse_FtSkip, /* FtSbs */\n0x0D: parse_FtNts, /* FtNts */\n0x0E: parse_FtSkip, /* FtSbsFmla */\n0x0F: parse_FtSkip, /* FtGboData */\n0x10: parse_FtSkip, /* FtEdoData */\n0x11: parse_FtSkip, /* FtRboData */\n0x12: parse_FtSkip, /* FtCblsData */\n0x13: parse_FtSkip, /* FtLbsData */\n0x14: parse_FtSkip, /* FtCblsFmla */\n0x15: parse_FtCmo\n};\nfunction parse_FtArray(blob, length) {\n\tvar tgt = blob.l + length;\n\tvar fts = [];\n\twhile(blob.l < tgt) {\n\t\tvar ft = blob.read_shift(2);\n\t\tblob.l-=2;\n\t\ttry {\n\t\t\tfts.push(FtTab[ft](blob, tgt - blob.l));\n\t\t} catch(e) { blob.l = tgt; return fts; }\n\t}\n\tif(blob.l != tgt) blob.l = tgt; //throw new Error(\"bad Object Ft-sequence\");\n\treturn fts;\n}\n\n/* --- 2.4 Records --- */\n\n/* [MS-XLS] 2.4.21 */\nfunction parse_BOF(blob, length) {\n\tvar o = {BIFFVer:0, dt:0};\n\to.BIFFVer = blob.read_shift(2); length -= 2;\n\tif(length >= 2) { o.dt = blob.read_shift(2); blob.l -= 2; }\n\tswitch(o.BIFFVer) {\n\t\tcase 0x0600: /* BIFF8 */\n\t\tcase 0x0500: /* BIFF5 */\n\t\tcase 0x0400: /* BIFF4 */\n\t\tcase 0x0300: /* BIFF3 */\n\t\tcase 0x0200: /* BIFF2 */\n\t\tcase 0x0002: case 0x0007: /* BIFF2 */\n\t\t\tbreak;\n\t\tdefault: if(length > 6) throw new Error(\"Unexpected BIFF Ver \" + o.BIFFVer);\n\t}\n\n\tblob.read_shift(length);\n\treturn o;\n}\nfunction write_BOF(wb, t, o) {\n\tvar h = 0x0600, w = 16;\n\tswitch(o.bookType) {\n\t\tcase 'biff8': break;\n\t\tcase 'biff5': h = 0x0500; w = 8; break;\n\t\tcase 'biff4': h = 0x0004; w = 6; break;\n\t\tcase 'biff3': h = 0x0003; w = 6; break;\n\t\tcase 'biff2': h = 0x0002; w = 4; break;\n\t\tcase 'xla': break;\n\t\tdefault: throw new Error(\"unsupported BIFF version\");\n\t}\n\tvar out = new_buf(w);\n\tout.write_shift(2, h);\n\tout.write_shift(2, t);\n\tif(w > 4) out.write_shift(2, 0x7262);\n\tif(w > 6) out.write_shift(2, 0x07CD);\n\tif(w > 8) {\n\t\tout.write_shift(2, 0xC009);\n\t\tout.write_shift(2, 0x0001);\n\t\tout.write_shift(2, 0x0706);\n\t\tout.write_shift(2, 0x0000);\n\t}\n\treturn out;\n}\n\n\n/* [MS-XLS] 2.4.146 */\nfunction parse_InterfaceHdr(blob, length) {\n\tif(length === 0) return 0x04b0;\n\tif((blob.read_shift(2))!==0x04b0){/* empty */}\n\treturn 0x04b0;\n}\n\n\n/* [MS-XLS] 2.4.349 */\nfunction parse_WriteAccess(blob, length, opts) {\n\tif(opts.enc) { blob.l += length; return \"\"; }\n\tvar l = blob.l;\n\t// TODO: make sure XLUnicodeString doesnt overrun\n\tvar UserName = parse_XLUnicodeString2(blob, 0, opts);\n\tblob.read_shift(length + l - blob.l);\n\treturn UserName;\n}\nfunction write_WriteAccess(s, opts) {\n\tvar b8 = !opts || opts.biff == 8;\n\tvar o = new_buf(b8 ? 112 : 54);\n\to.write_shift(opts.biff == 8 ? 2 : 1, 7);\n\tif(b8) o.write_shift(1, 0);\n\to.write_shift(4, 0x33336853);\n\to.write_shift(4, (0x00534A74 | (b8 ? 0 : 0x20000000)));\n\twhile(o.l < o.length) o.write_shift(1, (b8 ? 0 : 32));\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.351 */\nfunction parse_WsBool(blob, length, opts) {\n\tvar flags = opts && opts.biff == 8 || length == 2 ? blob.read_shift(2) : (blob.l += length, 0);\n\treturn { fDialog: flags & 0x10, fBelow: flags & 0x40, fRight: flags & 0x80 };\n}\n\n/* [MS-XLS] 2.4.28 */\nfunction parse_BoundSheet8(blob, length, opts) {\n\tvar pos = blob.read_shift(4);\n\tvar hidden = blob.read_shift(1) & 0x03;\n\tvar dt = blob.read_shift(1);\n\tswitch(dt) {\n\t\tcase 0: dt = 'Worksheet'; break;\n\t\tcase 1: dt = 'Macrosheet'; break;\n\t\tcase 2: dt = 'Chartsheet'; break;\n\t\tcase 6: dt = 'VBAModule'; break;\n\t}\n\tvar name = parse_ShortXLUnicodeString(blob, 0, opts);\n\tif(name.length === 0) name = \"Sheet1\";\n\treturn { pos:pos, hs:hidden, dt:dt, name:name };\n}\nfunction write_BoundSheet8(data, opts) {\n\tvar w = (!opts || opts.biff >= 8 ? 2 : 1);\n\tvar o = new_buf(8 + w * data.name.length);\n\to.write_shift(4, data.pos);\n\to.write_shift(1, data.hs || 0);\n\to.write_shift(1, data.dt);\n\to.write_shift(1, data.name.length);\n\tif(opts.biff >= 8) o.write_shift(1, 1);\n\to.write_shift(w * data.name.length, data.name, opts.biff < 8 ? 'sbcs' : 'utf16le');\n\tvar out = o.slice(0, o.l);\n\tout.l = o.l; return out;\n}\n\n/* [MS-XLS] 2.4.265 TODO */\nfunction parse_SST(blob, length) {\n\tvar end = blob.l + length;\n\tvar cnt = blob.read_shift(4);\n\tvar ucnt = blob.read_shift(4);\n\tvar strs = ([]);\n\tfor(var i = 0; i != ucnt && blob.l < end; ++i) {\n\t\tstrs.push(parse_XLUnicodeRichExtendedString(blob));\n\t}\n\tstrs.Count = cnt; strs.Unique = ucnt;\n\treturn strs;\n}\nfunction write_SST(sst, opts) {\n\tvar header = new_buf(8);\n\theader.write_shift(4, sst.Count);\n\theader.write_shift(4, sst.Unique);\n\tvar strs = [];\n\tfor(var j = 0; j < sst.length; ++j) strs[j] = write_XLUnicodeRichExtendedString(sst[j], opts);\n\tvar o = bconcat([header].concat(strs));\no.parts = [header.length].concat(strs.map(function(str) { return str.length; }));\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.107 */\nfunction parse_ExtSST(blob, length) {\n\tvar extsst = {};\n\textsst.dsst = blob.read_shift(2);\n\tblob.l += length-2;\n\treturn extsst;\n}\n\n\n/* [MS-XLS] 2.4.221 TODO: check BIFF2-4 */\nfunction parse_Row(blob) {\n\tvar z = ({});\n\tz.r = blob.read_shift(2);\n\tz.c = blob.read_shift(2);\n\tz.cnt = blob.read_shift(2) - z.c;\n\tvar miyRw = blob.read_shift(2);\n\tblob.l += 4; // reserved(2), unused(2)\n\tvar flags = blob.read_shift(1); // various flags\n\tblob.l += 3; // reserved(8), ixfe(12), flags(4)\n\tif(flags & 0x07) z.level = flags & 0x07;\n\t// collapsed: flags & 0x10\n\tif(flags & 0x20) z.hidden = true;\n\tif(flags & 0x40) z.hpt = miyRw / 20;\n\treturn z;\n}\n\n\n/* [MS-XLS] 2.4.125 */\nfunction parse_ForceFullCalculation(blob) {\n\tvar header = parse_frtHeader(blob);\n\tif(header.type != 0x08A3) throw new Error(\"Invalid Future Record \" + header.type);\n\tvar fullcalc = blob.read_shift(4);\n\treturn fullcalc !== 0x0;\n}\n\n\n\n\n\n/* [MS-XLS] 2.4.215 rt */\nfunction parse_RecalcId(blob) {\n\tblob.read_shift(2);\n\treturn blob.read_shift(4);\n}\n\n/* [MS-XLS] 2.4.87 */\nfunction parse_DefaultRowHeight(blob, length, opts) {\n\tvar f = 0;\n\tif(!(opts && opts.biff == 2)) {\n\t\tf = blob.read_shift(2);\n\t}\n\tvar miyRw = blob.read_shift(2);\n\tif((opts && opts.biff == 2)) {\n\t\tf = 1 - (miyRw >> 15); miyRw &= 0x7fff;\n\t}\n\tvar fl = {Unsynced:f&1,DyZero:(f&2)>>1,ExAsc:(f&4)>>2,ExDsc:(f&8)>>3};\n\treturn [fl, miyRw];\n}\n\n/* [MS-XLS] 2.4.345 TODO */\nfunction parse_Window1(blob) {\n\tvar xWn = blob.read_shift(2), yWn = blob.read_shift(2), dxWn = blob.read_shift(2), dyWn = blob.read_shift(2);\n\tvar flags = blob.read_shift(2), iTabCur = blob.read_shift(2), iTabFirst = blob.read_shift(2);\n\tvar ctabSel = blob.read_shift(2), wTabRatio = blob.read_shift(2);\n\treturn { Pos: [xWn, yWn], Dim: [dxWn, dyWn], Flags: flags, CurTab: iTabCur,\n\t\tFirstTab: iTabFirst, Selected: ctabSel, TabRatio: wTabRatio };\n}\nfunction write_Window1() {\n\tvar o = new_buf(18);\n\to.write_shift(2, 0);\n\to.write_shift(2, 0);\n\to.write_shift(2, 0x7260);\n\to.write_shift(2, 0x44c0);\n\to.write_shift(2, 0x38);\n\to.write_shift(2, 0);\n\to.write_shift(2, 0);\n\to.write_shift(2, 1);\n\to.write_shift(2, 0x01f4);\n\treturn o;\n}\n/* [MS-XLS] 2.4.346 TODO */\nfunction parse_Window2(blob, length, opts) {\n\tif(opts && opts.biff >= 2 && opts.biff < 5) return {};\n\tvar f = blob.read_shift(2);\n\treturn { RTL: f & 0x40 };\n}\nfunction write_Window2(view) {\n\tvar o = new_buf(18), f = 0x6b6;\n\tif(view && view.RTL) f |= 0x40;\n\to.write_shift(2, f);\n\to.write_shift(4, 0);\n\to.write_shift(4, 64);\n\to.write_shift(4, 0);\n\to.write_shift(4, 0);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.189 TODO */\nfunction parse_Pane(/*blob, length, opts*/) {\n}\n\n/* [MS-XLS] 2.4.122 TODO */\nfunction parse_Font(blob, length, opts) {\n\tvar o = {\n\t\tdyHeight: blob.read_shift(2),\n\t\tfl: blob.read_shift(2)\n\t};\n\tswitch((opts && opts.biff) || 8) {\n\t\tcase 2: break;\n\t\tcase 3: case 4: blob.l += 2; break;\n\t\tdefault: blob.l += 10; break;\n\t}\n\to.name = parse_ShortXLUnicodeString(blob, 0, opts);\n\treturn o;\n}\nfunction write_Font(data, opts) {\n\tvar name = data.name || \"Arial\";\n\tvar b5 = (opts && (opts.biff == 5)), w = (b5 ? (15 + name.length) : (16 + 2 * name.length));\n\tvar o = new_buf(w);\n\to.write_shift(2, (data.sz || 12) * 20);\n\to.write_shift(4, 0);\n\to.write_shift(2, 400);\n\to.write_shift(4, 0);\n\to.write_shift(2, 0);\n\to.write_shift(1, name.length);\n\tif(!b5) o.write_shift(1, 1);\n\to.write_shift((b5 ? 1 : 2) * name.length, name, (b5 ? \"sbcs\" : \"utf16le\"));\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.149 */\nfunction parse_LabelSst(blob) {\n\tvar cell = parse_XLSCell(blob);\n\tcell.isst = blob.read_shift(4);\n\treturn cell;\n}\nfunction write_LabelSst(R, C, v, os ) {\n\tvar o = new_buf(10);\n\twrite_XLSCell(R, C, os, o);\n\to.write_shift(4, v);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.148 */\nfunction parse_Label(blob, length, opts) {\n\tif(opts.biffguess && opts.biff == 2) opts.biff = 5;\n\tvar target = blob.l + length;\n\tvar cell = parse_XLSCell(blob, 6);\n\tif(opts.biff == 2) blob.l++;\n\tvar str = parse_XLUnicodeString(blob, target - blob.l, opts);\n\tcell.val = str;\n\treturn cell;\n}\nfunction write_Label(R, C, v, os, opts) {\n\tvar b8 = !opts || opts.biff == 8;\n\tvar o = new_buf(6 + 2 + (+b8) + (1 + b8) * v.length);\n\twrite_XLSCell(R, C, os, o);\n\to.write_shift(2, v.length);\n\tif(b8) o.write_shift(1, 1);\n\to.write_shift((1 + b8) * v.length, v, b8 ? 'utf16le' : 'sbcs');\n\treturn o;\n}\n\n\n/* [MS-XLS] 2.4.126 Number Formats */\nfunction parse_Format(blob, length, opts) {\n\tvar numFmtId = blob.read_shift(2);\n\tvar fmtstr = parse_XLUnicodeString2(blob, 0, opts);\n\treturn [numFmtId, fmtstr];\n}\nfunction write_Format(i, f, opts, o) {\n\tvar b5 = (opts && (opts.biff == 5));\n\tif(!o) o = new_buf(b5 ? (3 + f.length) : (5 + 2 * f.length));\n\to.write_shift(2, i);\n\to.write_shift((b5 ? 1 : 2), f.length);\n\tif(!b5) o.write_shift(1, 1);\n\to.write_shift((b5 ? 1 : 2) * f.length, f, (b5 ? 'sbcs' : 'utf16le'));\n\tvar out = (o.length > o.l) ? o.slice(0, o.l) : o;\n\tif(out.l == null) out.l = out.length;\n\treturn out;\n}\nvar parse_BIFF2Format = parse_XLUnicodeString2;\n\n/* [MS-XLS] 2.4.90 */\nfunction parse_Dimensions(blob, length, opts) {\n\tvar end = blob.l + length;\n\tvar w = opts.biff == 8 || !opts.biff ? 4 : 2;\n\tvar r = blob.read_shift(w), R = blob.read_shift(w);\n\tvar c = blob.read_shift(2), C = blob.read_shift(2);\n\tblob.l = end;\n\treturn {s: {r:r, c:c}, e: {r:R, c:C}};\n}\nfunction write_Dimensions(range, opts) {\n\tvar w = opts.biff == 8 || !opts.biff ? 4 : 2;\n\tvar o = new_buf(2*w + 6);\n\to.write_shift(w, range.s.r);\n\to.write_shift(w, range.e.r + 1);\n\to.write_shift(2, range.s.c);\n\to.write_shift(2, range.e.c + 1);\n\to.write_shift(2, 0);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.220 */\nfunction parse_RK(blob) {\n\tvar rw = blob.read_shift(2), col = blob.read_shift(2);\n\tvar rkrec = parse_RkRec(blob);\n\treturn {r:rw, c:col, ixfe:rkrec[0], rknum:rkrec[1]};\n}\n\n/* [MS-XLS] 2.4.175 */\nfunction parse_MulRk(blob, length) {\n\tvar target = blob.l + length - 2;\n\tvar rw = blob.read_shift(2), col = blob.read_shift(2);\n\tvar rkrecs = [];\n\twhile(blob.l < target) rkrecs.push(parse_RkRec(blob));\n\tif(blob.l !== target) throw new Error(\"MulRK read error\");\n\tvar lastcol = blob.read_shift(2);\n\tif(rkrecs.length != lastcol - col + 1) throw new Error(\"MulRK length mismatch\");\n\treturn {r:rw, c:col, C:lastcol, rkrec:rkrecs};\n}\n/* [MS-XLS] 2.4.174 */\nfunction parse_MulBlank(blob, length) {\n\tvar target = blob.l + length - 2;\n\tvar rw = blob.read_shift(2), col = blob.read_shift(2);\n\tvar ixfes = [];\n\twhile(blob.l < target) ixfes.push(blob.read_shift(2));\n\tif(blob.l !== target) throw new Error(\"MulBlank read error\");\n\tvar lastcol = blob.read_shift(2);\n\tif(ixfes.length != lastcol - col + 1) throw new Error(\"MulBlank length mismatch\");\n\treturn {r:rw, c:col, C:lastcol, ixfe:ixfes};\n}\n\n/* [MS-XLS] 2.5.20 2.5.249 TODO: interpret values here */\nfunction parse_CellStyleXF(blob, length, style, opts) {\n\tvar o = {};\n\tvar a = blob.read_shift(4), b = blob.read_shift(4);\n\tvar c = blob.read_shift(4), d = blob.read_shift(2);\n\to.patternType = XLSFillPattern[c >> 26];\n\n\tif(!opts.cellStyles) return o;\n\to.alc = a & 0x07;\n\to.fWrap = (a >> 3) & 0x01;\n\to.alcV = (a >> 4) & 0x07;\n\to.fJustLast = (a >> 7) & 0x01;\n\to.trot = (a >> 8) & 0xFF;\n\to.cIndent = (a >> 16) & 0x0F;\n\to.fShrinkToFit = (a >> 20) & 0x01;\n\to.iReadOrder = (a >> 22) & 0x02;\n\to.fAtrNum = (a >> 26) & 0x01;\n\to.fAtrFnt = (a >> 27) & 0x01;\n\to.fAtrAlc = (a >> 28) & 0x01;\n\to.fAtrBdr = (a >> 29) & 0x01;\n\to.fAtrPat = (a >> 30) & 0x01;\n\to.fAtrProt = (a >> 31) & 0x01;\n\n\to.dgLeft = b & 0x0F;\n\to.dgRight = (b >> 4) & 0x0F;\n\to.dgTop = (b >> 8) & 0x0F;\n\to.dgBottom = (b >> 12) & 0x0F;\n\to.icvLeft = (b >> 16) & 0x7F;\n\to.icvRight = (b >> 23) & 0x7F;\n\to.grbitDiag = (b >> 30) & 0x03;\n\n\to.icvTop = c & 0x7F;\n\to.icvBottom = (c >> 7) & 0x7F;\n\to.icvDiag = (c >> 14) & 0x7F;\n\to.dgDiag = (c >> 21) & 0x0F;\n\n\to.icvFore = d & 0x7F;\n\to.icvBack = (d >> 7) & 0x7F;\n\to.fsxButton = (d >> 14) & 0x01;\n\treturn o;\n}\n//function parse_CellXF(blob, length, opts) {return parse_CellStyleXF(blob,length,0, opts);}\n//function parse_StyleXF(blob, length, opts) {return parse_CellStyleXF(blob,length,1, opts);}\n\n/* [MS-XLS] 2.4.353 TODO: actually do this right */\nfunction parse_XF(blob, length, opts) {\n\tvar o = {};\n\to.ifnt = blob.read_shift(2); o.numFmtId = blob.read_shift(2); o.flags = blob.read_shift(2);\n\to.fStyle = (o.flags >> 2) & 0x01;\n\tlength -= 6;\n\to.data = parse_CellStyleXF(blob, length, o.fStyle, opts);\n\treturn o;\n}\nfunction write_XF(data, ixfeP, opts, o) {\n\tvar b5 = (opts && (opts.biff == 5));\n\tif(!o) o = new_buf(b5 ? 16 : 20);\n\to.write_shift(2, 0);\n\tif(data.style) {\n\t\to.write_shift(2, (data.numFmtId||0));\n\t\to.write_shift(2, 0xFFF4);\n\t} else {\n\t\to.write_shift(2, (data.numFmtId||0));\n\t\to.write_shift(2, (ixfeP<<4));\n\t}\n\tvar f = 0;\n\tif(data.numFmtId > 0 && b5) f |= 0x0400;\n\to.write_shift(4, f);\n\to.write_shift(4, 0);\n\tif(!b5) o.write_shift(4, 0);\n\to.write_shift(2, 0);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.134 */\nfunction parse_Guts(blob) {\n\tblob.l += 4;\n\tvar out = [blob.read_shift(2), blob.read_shift(2)];\n\tif(out[0] !== 0) out[0]--;\n\tif(out[1] !== 0) out[1]--;\n\tif(out[0] > 7 || out[1] > 7) throw new Error(\"Bad Gutters: \" + out.join(\"|\"));\n\treturn out;\n}\nfunction write_Guts(guts) {\n\tvar o = new_buf(8);\n\to.write_shift(4, 0);\n\to.write_shift(2, guts[0] ? guts[0] + 1 : 0);\n\to.write_shift(2, guts[1] ? guts[1] + 1 : 0);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.24 */\nfunction parse_BoolErr(blob, length, opts) {\n\tvar cell = parse_XLSCell(blob, 6);\n\tif(opts.biff == 2 || length == 9) ++blob.l;\n\tvar val = parse_Bes(blob, 2);\n\tcell.val = val;\n\tcell.t = (val === true || val === false) ? 'b' : 'e';\n\treturn cell;\n}\nfunction write_BoolErr(R, C, v, os, opts, t) {\n\tvar o = new_buf(8);\n\twrite_XLSCell(R, C, os, o);\n\twrite_Bes(v, t, o);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.180 Number */\nfunction parse_Number(blob, length, opts) {\n\tif(opts.biffguess && opts.biff == 2) opts.biff = 5;\n\tvar cell = parse_XLSCell(blob, 6);\n\tvar xnum = parse_Xnum(blob, 8);\n\tcell.val = xnum;\n\treturn cell;\n}\nfunction write_Number(R, C, v, os) {\n\tvar o = new_buf(14);\n\twrite_XLSCell(R, C, os, o);\n\twrite_Xnum(v, o);\n\treturn o;\n}\n\nvar parse_XLHeaderFooter = parse_OptXLUnicodeString; // TODO: parse 2.4.136\n\n/* [MS-XLS] 2.4.271 */\nfunction parse_SupBook(blob, length, opts) {\n\tvar end = blob.l + length;\n\tvar ctab = blob.read_shift(2);\n\tvar cch = blob.read_shift(2);\n\topts.sbcch = cch;\n\tif(cch == 0x0401 || cch == 0x3A01) return [cch, ctab];\n\tif(cch < 0x01 || cch >0xff) throw new Error(\"Unexpected SupBook type: \"+cch);\n\tvar virtPath = parse_XLUnicodeStringNoCch(blob, cch);\n\t/* TODO: 2.5.277 Virtual Path */\n\tvar rgst = [];\n\twhile(end > blob.l) rgst.push(parse_XLUnicodeString(blob));\n\treturn [cch, ctab, virtPath, rgst];\n}\n\n/* [MS-XLS] 2.4.105 TODO */\nfunction parse_ExternName(blob, length, opts) {\n\tvar flags = blob.read_shift(2);\n\tvar body;\n\tvar o = ({\n\t\tfBuiltIn: flags & 0x01,\n\t\tfWantAdvise: (flags >>> 1) & 0x01,\n\t\tfWantPict: (flags >>> 2) & 0x01,\n\t\tfOle: (flags >>> 3) & 0x01,\n\t\tfOleLink: (flags >>> 4) & 0x01,\n\t\tcf: (flags >>> 5) & 0x3FF,\n\t\tfIcon: flags >>> 15 & 0x01\n\t});\n\tif(opts.sbcch === 0x3A01) body = parse_AddinUdf(blob, length-2, opts);\n\t//else throw new Error(\"unsupported SupBook cch: \" + opts.sbcch);\n\to.body = body || blob.read_shift(length-2);\n\tif(typeof body === \"string\") o.Name = body;\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.150 TODO */\nvar XLSLblBuiltIn = [\n\t\"_xlnm.Consolidate_Area\",\n\t\"_xlnm.Auto_Open\",\n\t\"_xlnm.Auto_Close\",\n\t\"_xlnm.Extract\",\n\t\"_xlnm.Database\",\n\t\"_xlnm.Criteria\",\n\t\"_xlnm.Print_Area\",\n\t\"_xlnm.Print_Titles\",\n\t\"_xlnm.Recorder\",\n\t\"_xlnm.Data_Form\",\n\t\"_xlnm.Auto_Activate\",\n\t\"_xlnm.Auto_Deactivate\",\n\t\"_xlnm.Sheet_Title\",\n\t\"_xlnm._FilterDatabase\"\n];\nfunction parse_Lbl(blob, length, opts) {\n\tvar target = blob.l + length;\n\tvar flags = blob.read_shift(2);\n\tvar chKey = blob.read_shift(1);\n\tvar cch = blob.read_shift(1);\n\tvar cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);\n\tvar itab = 0;\n\tif(!opts || opts.biff >= 5) {\n\t\tif(opts.biff != 5) blob.l += 2;\n\t\titab = blob.read_shift(2);\n\t\tif(opts.biff == 5) blob.l += 2;\n\t\tblob.l += 4;\n\t}\n\tvar name = parse_XLUnicodeStringNoCch(blob, cch, opts);\n\tif(flags & 0x20) name = XLSLblBuiltIn[name.charCodeAt(0)];\n\tvar npflen = target - blob.l; if(opts && opts.biff == 2) --npflen;\n\t/*jshint -W018 */\n\tvar rgce = (target == blob.l || cce === 0 || !(npflen > 0)) ? [] : parse_NameParsedFormula(blob, npflen, opts, cce);\n\t/*jshint +W018 */\n\treturn {\n\t\tchKey: chKey,\n\t\tName: name,\n\t\titab: itab,\n\t\trgce: rgce\n\t};\n}\n\n/* [MS-XLS] 2.4.106 TODO: verify filename encoding */\nfunction parse_ExternSheet(blob, length, opts) {\n\tif(opts.biff < 8) return parse_BIFF5ExternSheet(blob, length, opts);\n\tvar o = [], target = blob.l + length, len = blob.read_shift(opts.biff > 8 ? 4 : 2);\n\twhile(len-- !== 0) o.push(parse_XTI(blob, opts.biff > 8 ? 12 : 6, opts));\n\t\t// [iSupBook, itabFirst, itabLast];\n\tif(blob.l != target) throw new Error(\"Bad ExternSheet: \" + blob.l + \" != \" + target);\n\treturn o;\n}\nfunction parse_BIFF5ExternSheet(blob, length, opts) {\n\tif(blob[blob.l + 1] == 0x03) blob[blob.l]++;\n\tvar o = parse_ShortXLUnicodeString(blob, length, opts);\n\treturn o.charCodeAt(0) == 0x03 ? o.slice(1) : o;\n}\n\n/* [MS-XLS] 2.4.176 TODO: check older biff */\nfunction parse_NameCmt(blob, length, opts) {\n\tif(opts.biff < 8) { blob.l += length; return; }\n\tvar cchName = blob.read_shift(2);\n\tvar cchComment = blob.read_shift(2);\n\tvar name = parse_XLUnicodeStringNoCch(blob, cchName, opts);\n\tvar comment = parse_XLUnicodeStringNoCch(blob, cchComment, opts);\n\treturn [name, comment];\n}\n\n/* [MS-XLS] 2.4.260 */\nfunction parse_ShrFmla(blob, length, opts) {\n\tvar ref = parse_RefU(blob, 6);\n\tblob.l++;\n\tvar cUse = blob.read_shift(1);\n\tlength -= 8;\n\treturn [parse_SharedParsedFormula(blob, length, opts), cUse, ref];\n}\n\n/* [MS-XLS] 2.4.4 TODO */\nfunction parse_Array(blob, length, opts) {\n\tvar ref = parse_Ref(blob, 6);\n\t/* TODO: fAlwaysCalc */\n\tswitch(opts.biff) {\n\t\tcase 2: blob.l ++; length -= 7; break;\n\t\tcase 3: case 4: blob.l += 2; length -= 8; break;\n\t\tdefault: blob.l += 6; length -= 12;\n\t}\n\treturn [ref, parse_ArrayParsedFormula(blob, length, opts, ref)];\n}\n\n/* [MS-XLS] 2.4.173 */\nfunction parse_MTRSettings(blob) {\n\tvar fMTREnabled = blob.read_shift(4) !== 0x00;\n\tvar fUserSetThreadCount = blob.read_shift(4) !== 0x00;\n\tvar cUserThreadCount = blob.read_shift(4);\n\treturn [fMTREnabled, fUserSetThreadCount, cUserThreadCount];\n}\n\n/* [MS-XLS] 2.5.186 TODO: BIFF5 */\nfunction parse_NoteSh(blob, length, opts) {\n\tif(opts.biff < 8) return;\n\tvar row = blob.read_shift(2), col = blob.read_shift(2);\n\tvar flags = blob.read_shift(2), idObj = blob.read_shift(2);\n\tvar stAuthor = parse_XLUnicodeString2(blob, 0, opts);\n\tif(opts.biff < 8) blob.read_shift(1);\n\treturn [{r:row,c:col}, stAuthor, idObj, flags];\n}\n\n/* [MS-XLS] 2.4.179 */\nfunction parse_Note(blob, length, opts) {\n\t/* TODO: Support revisions */\n\treturn parse_NoteSh(blob, length, opts);\n}\n\n/* [MS-XLS] 2.4.168 */\nfunction parse_MergeCells(blob, length) {\n\tvar merges = [];\n\tvar cmcs = blob.read_shift(2);\n\twhile (cmcs--) merges.push(parse_Ref8U(blob,length));\n\treturn merges;\n}\nfunction write_MergeCells(merges) {\n\tvar o = new_buf(2 + merges.length * 8);\n\to.write_shift(2, merges.length);\n\tfor(var i = 0; i < merges.length; ++i) write_Ref8U(merges[i], o);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.181 TODO: parse all the things! */\nfunction parse_Obj(blob, length, opts) {\n\tif(opts && opts.biff < 8) return parse_BIFF5Obj(blob, length, opts);\n\tvar cmo = parse_FtCmo(blob, 22); // id, ot, flags\n\tvar fts = parse_FtArray(blob, length-22, cmo[1]);\n\treturn { cmo: cmo, ft:fts };\n}\n/* from older spec */\nvar parse_BIFF5OT = [];\nparse_BIFF5OT[0x08] = function(blob, length) {\n\tvar tgt = blob.l + length;\n\tblob.l += 10; // todo\n\tvar cf = blob.read_shift(2);\n\tblob.l += 4;\n\tblob.l += 2; //var cbPictFmla = blob.read_shift(2);\n\tblob.l += 2;\n\tblob.l += 2; //var grbit = blob.read_shift(2);\n\tblob.l += 4;\n\tvar cchName = blob.read_shift(1);\n\tblob.l += cchName; // TODO: stName\n\tblob.l = tgt; // TODO: fmla\n\treturn { fmt:cf };\n};\n\nfunction parse_BIFF5Obj(blob, length, opts) {\n\tblob.l += 4; //var cnt = blob.read_shift(4);\n\tvar ot = blob.read_shift(2);\n\tvar id = blob.read_shift(2);\n\tvar grbit = blob.read_shift(2);\n\tblob.l += 2; //var colL = blob.read_shift(2);\n\tblob.l += 2; //var dxL = blob.read_shift(2);\n\tblob.l += 2; //var rwT = blob.read_shift(2);\n\tblob.l += 2; //var dyT = blob.read_shift(2);\n\tblob.l += 2; //var colR = blob.read_shift(2);\n\tblob.l += 2; //var dxR = blob.read_shift(2);\n\tblob.l += 2; //var rwB = blob.read_shift(2);\n\tblob.l += 2; //var dyB = blob.read_shift(2);\n\tblob.l += 2; //var cbMacro = blob.read_shift(2);\n\tblob.l += 6;\n\tlength -= 36;\n\tvar fts = [];\n\tfts.push((parse_BIFF5OT[ot]||parsenoop)(blob, length, opts));\n\treturn { cmo: [id, ot, grbit], ft:fts };\n}\n\n/* [MS-XLS] 2.4.329 TODO: parse properly */\nfunction parse_TxO(blob, length, opts) {\n\tvar s = blob.l;\n\tvar texts = \"\";\ntry {\n\tblob.l += 4;\n\tvar ot = (opts.lastobj||{cmo:[0,0]}).cmo[1];\n\tvar controlInfo; // eslint-disable-line no-unused-vars\n\tif([0,5,7,11,12,14].indexOf(ot) == -1) blob.l += 6;\n\telse controlInfo = parse_ControlInfo(blob, 6, opts);\n\tvar cchText = blob.read_shift(2);\n\t/*var cbRuns = */blob.read_shift(2);\n\t/*var ifntEmpty = */parseuint16(blob, 2);\n\tvar len = blob.read_shift(2);\n\tblob.l += len;\n\t//var fmla = parse_ObjFmla(blob, s + length - blob.l);\n\n\tfor(var i = 1; i < blob.lens.length-1; ++i) {\n\t\tif(blob.l-s != blob.lens[i]) throw new Error(\"TxO: bad continue record\");\n\t\tvar hdr = blob[blob.l];\n\t\tvar t = parse_XLUnicodeStringNoCch(blob, blob.lens[i+1]-blob.lens[i]-1);\n\t\ttexts += t;\n\t\tif(texts.length >= (hdr ? cchText : 2*cchText)) break;\n\t}\n\tif(texts.length !== cchText && texts.length !== cchText*2) {\n\t\tthrow new Error(\"cchText: \" + cchText + \" != \" + texts.length);\n\t}\n\n\tblob.l = s + length;\n\t/* [MS-XLS] 2.5.272 TxORuns */\n//\tvar rgTxoRuns = [];\n//\tfor(var j = 0; j != cbRuns/8-1; ++j) blob.l += 8;\n//\tvar cchText2 = blob.read_shift(2);\n//\tif(cchText2 !== cchText) throw new Error(\"TxOLastRun mismatch: \" + cchText2 + \" \" + cchText);\n//\tblob.l += 6;\n//\tif(s + length != blob.l) throw new Error(\"TxO \" + (s + length) + \", at \" + blob.l);\n\treturn { t: texts };\n} catch(e) { blob.l = s + length; return { t: texts }; }\n}\n\n/* [MS-XLS] 2.4.140 */\nfunction parse_HLink(blob, length) {\n\tvar ref = parse_Ref8U(blob, 8);\n\tblob.l += 16; /* CLSID */\n\tvar hlink = parse_Hyperlink(blob, length-24);\n\treturn [ref, hlink];\n}\nfunction write_HLink(hl) {\n\tvar O = new_buf(24);\n\tvar ref = decode_cell(hl[0]);\n\tO.write_shift(2, ref.r); O.write_shift(2, ref.r);\n\tO.write_shift(2, ref.c); O.write_shift(2, ref.c);\n\tvar clsid = \"d0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b\".split(\" \");\n\tfor(var i = 0; i < 16; ++i) O.write_shift(1, parseInt(clsid[i], 16));\n\treturn bconcat([O, write_Hyperlink(hl[1])]);\n}\n\n\n/* [MS-XLS] 2.4.141 */\nfunction parse_HLinkTooltip(blob, length) {\n\tblob.read_shift(2);\n\tvar ref = parse_Ref8U(blob, 8);\n\tvar wzTooltip = blob.read_shift((length-10)/2, 'dbcs-cont');\n\twzTooltip = wzTooltip.replace(chr0,\"\");\n\treturn [ref, wzTooltip];\n}\nfunction write_HLinkTooltip(hl) {\n\tvar TT = hl[1].Tooltip;\n\tvar O = new_buf(10 + 2 * (TT.length + 1));\n\tO.write_shift(2, 0x0800);\n\tvar ref = decode_cell(hl[0]);\n\tO.write_shift(2, ref.r); O.write_shift(2, ref.r);\n\tO.write_shift(2, ref.c); O.write_shift(2, ref.c);\n\tfor(var i = 0; i < TT.length; ++i) O.write_shift(2, TT.charCodeAt(i));\n\tO.write_shift(2, 0);\n\treturn O;\n}\n\n/* [MS-XLS] 2.4.63 */\nfunction parse_Country(blob) {\n\tvar o = [0,0], d;\n\td = blob.read_shift(2); o[0] = CountryEnum[d] || d;\n\td = blob.read_shift(2); o[1] = CountryEnum[d] || d;\n\treturn o;\n}\nfunction write_Country(o) {\n\tif(!o) o = new_buf(4);\n\to.write_shift(2, 0x01);\n\to.write_shift(2, 0x01);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.50 ClrtClient */\nfunction parse_ClrtClient(blob) {\n\tvar ccv = blob.read_shift(2);\n\tvar o = [];\n\twhile(ccv-->0) o.push(parse_LongRGB(blob, 8));\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.188 */\nfunction parse_Palette(blob) {\n\tvar ccv = blob.read_shift(2);\n\tvar o = [];\n\twhile(ccv-->0) o.push(parse_LongRGB(blob, 8));\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.354 */\nfunction parse_XFCRC(blob) {\n\tblob.l += 2;\n\tvar o = {cxfs:0, crc:0};\n\to.cxfs = blob.read_shift(2);\n\to.crc = blob.read_shift(4);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.53 TODO: parse flags */\n/* [MS-XLSB] 2.4.323 TODO: parse flags */\nfunction parse_ColInfo(blob, length, opts) {\n\tif(!opts.cellStyles) return parsenoop(blob, length);\n\tvar w = opts && opts.biff >= 12 ? 4 : 2;\n\tvar colFirst = blob.read_shift(w);\n\tvar colLast = blob.read_shift(w);\n\tvar coldx = blob.read_shift(w);\n\tvar ixfe = blob.read_shift(w);\n\tvar flags = blob.read_shift(2);\n\tif(w == 2) blob.l += 2;\n\tvar o = ({s:colFirst, e:colLast, w:coldx, ixfe:ixfe, flags:flags});\n\tif(opts.biff >= 5 || !opts.biff) o.level = (flags >> 8) & 0x7;\n\treturn o;\n}\nfunction write_ColInfo(col, idx) {\n\tvar o = new_buf(12);\n\to.write_shift(2, idx);\n\to.write_shift(2, idx);\n\to.write_shift(2, col.width * 256);\n\to.write_shift(2, 0);\n\tvar f = 0;\n\tif(col.hidden) f |= 1;\n\to.write_shift(1, f);\n\tf = col.level || 0;\n\to.write_shift(1, f);\n\to.write_shift(2, 0);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.257 */\nfunction parse_Setup(blob, length) {\n\tvar o = {};\n\tif(length < 32) return o;\n\tblob.l += 16;\n\to.header = parse_Xnum(blob, 8);\n\to.footer = parse_Xnum(blob, 8);\n\tblob.l += 2;\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.261 */\nfunction parse_ShtProps(blob, length, opts) {\n\tvar def = {area:false};\n\tif(opts.biff != 5) { blob.l += length; return def; }\n\tvar d = blob.read_shift(1); blob.l += 3;\n\tif((d & 0x10)) def.area = true;\n\treturn def;\n}\n\n/* [MS-XLS] 2.4.241 */\nfunction write_RRTabId(n) {\n\tvar out = new_buf(2 * n);\n\tfor(var i = 0; i < n; ++i) out.write_shift(2, i+1);\n\treturn out;\n}\n\nvar parse_Blank = parse_XLSCell; /* [MS-XLS] 2.4.20 Just the cell */\nvar parse_Scl = parseuint16a; /* [MS-XLS] 2.4.247 num, den */\nvar parse_String = parse_XLUnicodeString; /* [MS-XLS] 2.4.268 */\n\n/* --- Specific to versions before BIFF8 --- */\nfunction parse_ImData(blob) {\n\tvar cf = blob.read_shift(2);\n\tvar env = blob.read_shift(2);\n\tvar lcb = blob.read_shift(4);\n\tvar o = {fmt:cf, env:env, len:lcb, data:blob.slice(blob.l,blob.l+lcb)};\n\tblob.l += lcb;\n\treturn o;\n}\n\n/* BIFF2_??? where ??? is the name from [XLS] */\nfunction parse_BIFF2STR(blob, length, opts) {\n\tif(opts.biffguess && opts.biff == 5) opts.biff = 2;\n\tvar cell = parse_XLSCell(blob, 6);\n\t++blob.l;\n\tvar str = parse_XLUnicodeString2(blob, length-7, opts);\n\tcell.t = 'str';\n\tcell.val = str;\n\treturn cell;\n}\n\nfunction parse_BIFF2NUM(blob) {\n\tvar cell = parse_XLSCell(blob, 6);\n\t++blob.l;\n\tvar num = parse_Xnum(blob, 8);\n\tcell.t = 'n';\n\tcell.val = num;\n\treturn cell;\n}\nfunction write_BIFF2NUM(r, c, val) {\n\tvar out = new_buf(15);\n\twrite_BIFF2Cell(out, r, c);\n\tout.write_shift(8, val, 'f');\n\treturn out;\n}\n\nfunction parse_BIFF2INT(blob) {\n\tvar cell = parse_XLSCell(blob, 6);\n\t++blob.l;\n\tvar num = blob.read_shift(2);\n\tcell.t = 'n';\n\tcell.val = num;\n\treturn cell;\n}\nfunction write_BIFF2INT(r, c, val) {\n\tvar out = new_buf(9);\n\twrite_BIFF2Cell(out, r, c);\n\tout.write_shift(2, val);\n\treturn out;\n}\n\nfunction parse_BIFF2STRING(blob) {\n\tvar cch = blob.read_shift(1);\n\tif(cch === 0) { blob.l++; return \"\"; }\n\treturn blob.read_shift(cch, 'sbcs-cont');\n}\n\n/* TODO: convert to BIFF8 font struct */\nfunction parse_BIFF2FONTXTRA(blob, length) {\n\tblob.l += 6; // unknown\n\tblob.l += 2; // font weight \"bls\"\n\tblob.l += 1; // charset\n\tblob.l += 3; // unknown\n\tblob.l += 1; // font family\n\tblob.l += length - 13;\n}\n\n/* TODO: parse rich text runs */\nfunction parse_RString(blob, length, opts) {\n\tvar end = blob.l + length;\n\tvar cell = parse_XLSCell(blob, 6);\n\tvar cch = blob.read_shift(2);\n\tvar str = parse_XLUnicodeStringNoCch(blob, cch, opts);\n\tblob.l = end;\n\tcell.t = 'str';\n\tcell.val = str;\n\treturn cell;\n}\n/* from js-harb (C) 2014-present SheetJS */\nvar DBF = (function() {\nvar dbf_codepage_map = {\n\t/* Code Pages Supported by Visual FoxPro */\n0x01: 437, 0x02: 850,\n0x03: 1252, 0x04: 10000,\n0x64: 852, 0x65: 866,\n0x66: 865, 0x67: 861,\n0x68: 895, 0x69: 620,\n0x6A: 737, 0x6B: 857,\n0x78: 950, 0x79: 949,\n0x7A: 936, 0x7B: 932,\n0x7C: 874, 0x7D: 1255,\n0x7E: 1256, 0x96: 10007,\n0x97: 10029, 0x98: 10006,\n0xC8: 1250, 0xC9: 1251,\n0xCA: 1254, 0xCB: 1253,\n\n\t/* shapefile DBF extension */\n0x00: 20127, 0x08: 865,\n0x09: 437, 0x0A: 850,\n0x0B: 437, 0x0D: 437,\n0x0E: 850, 0x0F: 437,\n0x10: 850, 0x11: 437,\n0x12: 850, 0x13: 932,\n0x14: 850, 0x15: 437,\n0x16: 850, 0x17: 865,\n0x18: 437, 0x19: 437,\n0x1A: 850, 0x1B: 437,\n0x1C: 863, 0x1D: 850,\n0x1F: 852, 0x22: 852,\n0x23: 852, 0x24: 860,\n0x25: 850, 0x26: 866,\n0x37: 850, 0x40: 852,\n0x4D: 936, 0x4E: 949,\n0x4F: 950, 0x50: 874,\n0x57: 1252, 0x58: 1252,\n0x59: 1252, 0x6C: 863,\n0x86: 737, 0x87: 852,\n0x88: 857, 0xCC: 1257,\n\n0xFF: 16969\n};\nvar dbf_reverse_map = evert({\n0x01: 437, 0x02: 850,\n0x03: 1252, 0x04: 10000,\n0x64: 852, 0x65: 866,\n0x66: 865, 0x67: 861,\n0x68: 895, 0x69: 620,\n0x6A: 737, 0x6B: 857,\n0x78: 950, 0x79: 949,\n0x7A: 936, 0x7B: 932,\n0x7C: 874, 0x7D: 1255,\n0x7E: 1256, 0x96: 10007,\n0x97: 10029, 0x98: 10006,\n0xC8: 1250, 0xC9: 1251,\n0xCA: 1254, 0xCB: 1253,\n0x00: 20127\n});\nvar DBF_SUPPORTED_VERSIONS = [0x02, 0x03, 0x30, 0x31, 0x83, 0x8B, 0x8C, 0xF5];\n/* TODO: find an actual specification */\nfunction dbf_to_aoa(buf, opts) {\n\tvar out = [];\n\tvar d = (new_raw_buf(1));\n\tswitch(opts.type) {\n\t\tcase 'base64': d = s2a(Base64.decode(buf)); break;\n\t\tcase 'binary': d = s2a(buf); break;\n\t\tcase 'buffer':\n\t\tcase 'array': d = buf; break;\n\t}\n\tprep_blob(d, 0);\n\n\t/* header */\n\tvar ft = d.read_shift(1);\n\tvar memo = !!(ft & 0x88);\n\tvar vfp = false, l7 = false;\n\tswitch(ft) {\n\t\tcase 0x02: break; // dBASE II\n\t\tcase 0x03: break; // dBASE III\n\t\tcase 0x30: vfp = true; memo = true; break; // VFP\n\t\tcase 0x31: vfp = true; memo = true; break; // VFP with autoincrement\n\t\t// 0x43 dBASE IV SQL table files\n\t\t// 0x63 dBASE IV SQL system files\n\t\tcase 0x83: break; // dBASE III with memo\n\t\tcase 0x8B: break; // dBASE IV with memo\n\t\tcase 0x8C: l7 = true; break; // dBASE Level 7 with memo\n\t\t// case 0xCB dBASE IV SQL table files with memo\n\t\tcase 0xF5: break; // FoxPro 2.x with memo\n\t\t// case 0xFB FoxBASE\n\t\tdefault: throw new Error(\"DBF Unsupported Version: \" + ft.toString(16));\n\t}\n\n\tvar nrow = 0, fpos = 0x0209;\n\tif(ft == 0x02) nrow = d.read_shift(2);\n\td.l += 3; // dBASE II stores DDMMYY date, others use YYMMDD\n\tif(ft != 0x02) nrow = d.read_shift(4);\n\tif(nrow > 1048576) nrow = 1e6;\n\n\tif(ft != 0x02) fpos = d.read_shift(2); // header length\n\tvar rlen = d.read_shift(2); // record length\n\n\tvar /*flags = 0,*/ current_cp = opts.codepage || 1252;\n\tif(ft != 0x02) { // 20 reserved bytes\n\t\td.l+=16;\n\t\t/*flags = */d.read_shift(1);\n\t\t//if(memo && ((flags & 0x02) === 0)) throw new Error(\"DBF Flags \" + flags.toString(16) + \" ft \" + ft.toString(16));\n\n\t\t/* codepage present in FoxPro and dBASE Level 7 */\n\t\tif(d[d.l] !== 0) current_cp = dbf_codepage_map[d[d.l]];\n\t\td.l+=1;\n\n\t\td.l+=2;\n\t}\n\tif(l7) d.l += 36; // Level 7: 32 byte \"Language driver name\", 4 byte reserved\n\nvar fields = [], field = ({});\n\tvar hend = Math.min(d.length, (ft == 0x02 ? 0x209 : (fpos - 10 - (vfp ? 264 : 0))));\n\tvar ww = l7 ? 32 : 11;\n\twhile(d.l < hend && d[d.l] != 0x0d) {\n\t\tfield = ({});\n\t\tfield.name = cptable.utils.decode(current_cp, d.slice(d.l, d.l+ww)).replace(/[\\u0000\\r\\n].*$/g,\"\");\n\t\td.l += ww;\n\t\tfield.type = String.fromCharCode(d.read_shift(1));\n\t\tif(ft != 0x02 && !l7) field.offset = d.read_shift(4);\n\t\tfield.len = d.read_shift(1);\n\t\tif(ft == 0x02) field.offset = d.read_shift(2);\n\t\tfield.dec = d.read_shift(1);\n\t\tif(field.name.length) fields.push(field);\n\t\tif(ft != 0x02) d.l += l7 ? 13 : 14;\n\t\tswitch(field.type) {\n\t\t\tcase 'B': // Double (VFP) / Binary (dBASE L7)\n\t\t\t\tif((!vfp || field.len != 8) && opts.WTF) console.log('Skipping ' + field.name + ':' + field.type);\n\t\t\t\tbreak;\n\t\t\tcase 'G': // General (FoxPro and dBASE L7)\n\t\t\tcase 'P': // Picture (FoxPro and dBASE L7)\n\t\t\t\tif(opts.WTF) console.log('Skipping ' + field.name + ':' + field.type);\n\t\t\t\tbreak;\n\t\t\tcase '+': // Autoincrement (dBASE L7 only)\n\t\t\tcase '0': // _NullFlags (VFP only)\n\t\t\tcase '@': // Timestamp (dBASE L7 only)\n\t\t\tcase 'C': // Character (dBASE II)\n\t\t\tcase 'D': // Date (dBASE III)\n\t\t\tcase 'F': // Float (dBASE IV)\n\t\t\tcase 'I': // Long (VFP and dBASE L7)\n\t\t\tcase 'L': // Logical (dBASE II)\n\t\t\tcase 'M': // Memo (dBASE III)\n\t\t\tcase 'N': // Number (dBASE II)\n\t\t\tcase 'O': // Double (dBASE L7 only)\n\t\t\tcase 'T': // Datetime (VFP only)\n\t\t\tcase 'Y': // Currency (VFP only)\n\t\t\t\tbreak;\n\t\t\tdefault: throw new Error('Unknown Field Type: ' + field.type);\n\t\t}\n\t}\n\n\tif(d[d.l] !== 0x0D) d.l = fpos-1;\n\tif(d.read_shift(1) !== 0x0D) throw new Error(\"DBF Terminator not found \" + d.l + \" \" + d[d.l]);\n\td.l = fpos;\n\n\t/* data */\n\tvar R = 0, C = 0;\n\tout[0] = [];\n\tfor(C = 0; C != fields.length; ++C) out[0][C] = fields[C].name;\n\twhile(nrow-- > 0) {\n\t\tif(d[d.l] === 0x2A) {\n\t\t\t// TODO: record marked as deleted -- create a hidden row?\n\t\t\td.l+=rlen;\n\t\t\tcontinue;\n\t\t}\n\t\t++d.l;\n\t\tout[++R] = []; C = 0;\n\t\tfor(C = 0; C != fields.length; ++C) {\n\t\t\tvar dd = d.slice(d.l, d.l+fields[C].len); d.l+=fields[C].len;\n\t\t\tprep_blob(dd, 0);\n\t\t\tvar s = cptable.utils.decode(current_cp, dd);\n\t\t\tswitch(fields[C].type) {\n\t\t\t\tcase 'C':\n\t\t\t\t\t// NOTE: it is conventional to write ' / / ' for empty dates\n\t\t\t\t\tif(s.trim().length) out[R][C] = s.replace(/\\s+$/,\"\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'D':\n\t\t\t\t\tif(s.length === 8) out[R][C] = new Date(+s.slice(0,4), +s.slice(4,6)-1, +s.slice(6,8));\n\t\t\t\t\telse out[R][C] = s;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'F': out[R][C] = parseFloat(s.trim()); break;\n\t\t\t\tcase '+': case 'I': out[R][C] = l7 ? dd.read_shift(-4, 'i') ^ 0x80000000 : dd.read_shift(4, 'i'); break;\n\t\t\t\tcase 'L': switch(s.trim().toUpperCase()) {\n\t\t\t\t\tcase 'Y': case 'T': out[R][C] = true; break;\n\t\t\t\t\tcase 'N': case 'F': out[R][C] = false; break;\n\t\t\t\t\tcase '': case '?': break;\n\t\t\t\t\tdefault: throw new Error(\"DBF Unrecognized L:|\" + s + \"|\");\n\t\t\t\t\t} break;\n\t\t\t\tcase 'M': /* TODO: handle memo files */\n\t\t\t\t\tif(!memo) throw new Error(\"DBF Unexpected MEMO for type \" + ft.toString(16));\n\t\t\t\t\tout[R][C] = \"##MEMO##\" + (l7 ? parseInt(s.trim(), 10): dd.read_shift(4));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'N':\n\t\t\t\t\ts = s.replace(/\\u0000/g,\"\").trim();\n\t\t\t\t\t// NOTE: dBASE II interprets \" . \" as 0\n\t\t\t\t\tif(s && s != \".\") out[R][C] = +s || 0; break;\n\t\t\t\tcase '@':\n\t\t\t\t\t// NOTE: dBASE specs appear to be incorrect\n\t\t\t\t\tout[R][C] = new Date(dd.read_shift(-8, 'f') - 0x388317533400);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'T': out[R][C] = new Date((dd.read_shift(4) - 0x253D8C) * 0x5265C00 + dd.read_shift(4)); break;\n\t\t\t\tcase 'Y': out[R][C] = dd.read_shift(4,'i')/1e4; break;\n\t\t\t\tcase 'O': out[R][C] = -dd.read_shift(-8, 'f'); break;\n\t\t\t\tcase 'B': if(vfp && fields[C].len == 8) { out[R][C] = dd.read_shift(8,'f'); break; }\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase 'G': case 'P': dd.l += fields[C].len; break;\n\t\t\t\tcase '0':\n\t\t\t\t\tif(fields[C].name === '_NullFlags') break;\n\t\t\t\t\t/* falls through */\n\t\t\t\tdefault: throw new Error(\"DBF Unsupported data type \" + fields[C].type);\n\t\t\t}\n\t\t}\n\t}\n\tif(ft != 0x02) if(d.l < d.length && d[d.l++] != 0x1A) throw new Error(\"DBF EOF Marker missing \" + (d.l-1) + \" of \" + d.length + \" \" + d[d.l-1].toString(16));\n\tif(opts && opts.sheetRows) out = out.slice(0, opts.sheetRows);\n\treturn out;\n}\n\nfunction dbf_to_sheet(buf, opts) {\n\tvar o = opts || {};\n\tif(!o.dateNF) o.dateNF = \"yyyymmdd\";\n\treturn aoa_to_sheet(dbf_to_aoa(buf, o), o);\n}\n\nfunction dbf_to_workbook(buf, opts) {\n\ttry { return sheet_to_workbook(dbf_to_sheet(buf, opts), opts); }\n\tcatch(e) { if(opts && opts.WTF) throw e; }\n\treturn ({SheetNames:[],Sheets:{}});\n}\n\nvar _RLEN = { 'B': 8, 'C': 250, 'L': 1, 'D': 8, '?': 0, '': 0 };\nfunction sheet_to_dbf(ws, opts) {\n\tvar o = opts || {};\n\tif(+o.codepage >= 0) set_cp(+o.codepage);\n\tif(o.type == \"string\") throw new Error(\"Cannot write DBF to JS string\");\n\tvar ba = buf_array();\n\tvar aoa = sheet_to_json(ws, {header:1, raw:true, cellDates:true});\n\tvar headers = aoa[0], data = aoa.slice(1);\n\tvar i = 0, j = 0, hcnt = 0, rlen = 1;\n\tfor(i = 0; i < headers.length; ++i) {\n\t\tif(i == null) continue;\n\t\t++hcnt;\n\t\tif(typeof headers[i] === 'number') headers[i] = headers[i].toString(10);\n\t\tif(typeof headers[i] !== 'string') throw new Error(\"DBF Invalid column name \" + headers[i] + \" |\" + (typeof headers[i]) + \"|\");\n\t\tif(headers.indexOf(headers[i]) !== i) for(j=0; j<1024;++j)\n\t\t\tif(headers.indexOf(headers[i] + \"_\" + j) == -1) { headers[i] += \"_\" + j; break; }\n\t}\n\tvar range = safe_decode_range(ws['!ref']);\n\tvar coltypes = [];\n\tfor(i = 0; i <= range.e.c - range.s.c; ++i) {\n\t\tvar col = [];\n\t\tfor(j=0; j < data.length; ++j) {\n\t\t\tif(data[j][i] != null) col.push(data[j][i]);\n\t\t}\n\t\tif(col.length == 0 || headers[i] == null) { coltypes[i] = '?'; continue; }\n\t\tvar guess = '', _guess = '';\n\t\tfor(j = 0; j < col.length; ++j) {\n\t\t\tswitch(typeof col[j]) {\n\t\t\t\t/* TODO: check if L2 compat is desired */\n\t\t\t\tcase 'number': _guess = 'B'; break;\n\t\t\t\tcase 'string': _guess = 'C'; break;\n\t\t\t\tcase 'boolean': _guess = 'L'; break;\n\t\t\t\tcase 'object': _guess = col[j] instanceof Date ? 'D' : 'C'; break;\n\t\t\t\tdefault: _guess = 'C';\n\t\t\t}\n\t\t\tguess = guess && guess != _guess ? 'C' : _guess;\n\t\t\tif(guess == 'C') break;\n\t\t}\n\t\trlen += _RLEN[guess] || 0;\n\t\tcoltypes[i] = guess;\n\t}\n\n\tvar h = ba.next(32);\n\th.write_shift(4, 0x13021130);\n\th.write_shift(4, data.length);\n\th.write_shift(2, 296 + 32 * hcnt);\n\th.write_shift(2, rlen);\n\tfor(i=0; i < 4; ++i) h.write_shift(4, 0);\n\th.write_shift(4, 0x00000000 | ((+dbf_reverse_map[current_ansi] || 0x03)<<8));\n\n\tfor(i = 0, j = 0; i < headers.length; ++i) {\n\t\tif(headers[i] == null) continue;\n\t\tvar hf = ba.next(32);\n\t\tvar _f = (headers[i].slice(-10) + \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\").slice(0, 11);\n\t\thf.write_shift(1, _f, \"sbcs\");\n\t\thf.write_shift(1, coltypes[i] == '?' ? 'C' : coltypes[i], \"sbcs\");\n\t\thf.write_shift(4, j);\n\t\thf.write_shift(1, _RLEN[coltypes[i]] || 0);\n\t\thf.write_shift(1, 0);\n\t\thf.write_shift(1, 0x02);\n\t\thf.write_shift(4, 0);\n\t\thf.write_shift(1, 0);\n\t\thf.write_shift(4, 0);\n\t\thf.write_shift(4, 0);\n\t\tj += _RLEN[coltypes[i]] || 0;\n\t}\n\n\tvar hb = ba.next(264);\n\thb.write_shift(4, 0x0000000D);\n\tfor(i=0; i < 65;++i) hb.write_shift(4, 0x00000000);\n\tfor(i=0; i < data.length; ++i) {\n\t\tvar rout = ba.next(rlen);\n\t\trout.write_shift(1, 0);\n\t\tfor(j=0; j\":190, \"?\":191, \"{\":223\n\t});\n\tvar sylk_char_regex = new RegExp(\"\\u001BN(\" + keys(sylk_escapes).join(\"|\").replace(/\\|\\|\\|/, \"|\\\\||\").replace(/([?()+])/g,\"\\\\$1\") + \"|\\\\|)\", \"gm\");\n\tvar sylk_char_fn = function(_, $1){ var o = sylk_escapes[$1]; return typeof o == \"number\" ? _getansi(o) : o; };\n\tvar decode_sylk_char = function($$, $1, $2) { var newcc = (($1.charCodeAt(0) - 0x20)<<4) | ($2.charCodeAt(0) - 0x30); return newcc == 59 ? $$ : _getansi(newcc); };\n\tsylk_escapes[\"|\"] = 254;\n\t/* TODO: find an actual specification */\n\tfunction sylk_to_aoa(d, opts) {\n\t\tswitch(opts.type) {\n\t\t\tcase 'base64': return sylk_to_aoa_str(Base64.decode(d), opts);\n\t\t\tcase 'binary': return sylk_to_aoa_str(d, opts);\n\t\t\tcase 'buffer': return sylk_to_aoa_str(has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d), opts);\n\t\t\tcase 'array': return sylk_to_aoa_str(cc2str(d), opts);\n\t\t}\n\t\tthrow new Error(\"Unrecognized type \" + opts.type);\n\t}\n\tfunction sylk_to_aoa_str(str, opts) {\n\t\tvar records = str.split(/[\\n\\r]+/), R = -1, C = -1, ri = 0, rj = 0, arr = [];\n\t\tvar formats = [];\n\t\tvar next_cell_format = null;\n\t\tvar sht = {}, rowinfo = [], colinfo = [], cw = [];\n\t\tvar Mval = 0, j;\n\t\tif(+opts.codepage >= 0) set_cp(+opts.codepage);\n\t\tfor (; ri !== records.length; ++ri) {\n\t\t\tMval = 0;\n\t\t\tvar rstr=records[ri].trim().replace(/\\x1B([\\x20-\\x2F])([\\x30-\\x3F])/g, decode_sylk_char).replace(sylk_char_regex, sylk_char_fn);\n\t\t\tvar record=rstr.replace(/;;/g, \"\\u0000\").split(\";\").map(function(x) { return x.replace(/\\u0000/g, \";\"); });\n\t\t\tvar RT=record[0], val;\n\t\t\tif(rstr.length > 0) switch(RT) {\n\t\t\tcase 'ID': break; /* header */\n\t\t\tcase 'E': break; /* EOF */\n\t\t\tcase 'B': break; /* dimensions */\n\t\t\tcase 'O': break; /* options? */\n\t\t\tcase 'W': break; /* window? */\n\t\t\tcase 'P':\n\t\t\t\tif(record[1].charAt(0) == 'P')\n\t\t\t\t\tformats.push(rstr.slice(3).replace(/;;/g, \";\"));\n\t\t\t\tbreak;\n\t\t\tcase 'C':\n\t\t\tvar C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1;\n\t\t\tfor(rj=1; rj -1 && arr[_R][_C];\n\t\t\t\tif(!shrbase || !shrbase[1]) throw new Error(\"SYLK shared formula cannot find base\");\n\t\t\t\tarr[R][C][1] = shift_formula_str(shrbase[1], {r: R - _R, c: C - _C});\n\t\t\t}\n\t\t\tbreak;\n\t\t\tcase 'F':\n\t\t\tvar F_seen = 0;\n\t\t\tfor(rj=1; rj 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); }\n\t\t\t\t\telse if(Mval === 0) rowinfo[R].hidden = true;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault: if(opts && opts.WTF) throw new Error(\"SYLK bad record \" + rstr);\n\t\t\t}\n\t\t\tif(F_seen < 1) next_cell_format = null; break;\n\t\t\tdefault: if(opts && opts.WTF) throw new Error(\"SYLK bad record \" + rstr);\n\t\t\t}\n\t\t}\n\t\tif(rowinfo.length > 0) sht['!rows'] = rowinfo;\n\t\tif(colinfo.length > 0) sht['!cols'] = colinfo;\n\t\tif(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);\n\t\treturn [arr, sht];\n\t}\n\n\tfunction sylk_to_sheet(d, opts) {\n\t\tvar aoasht = sylk_to_aoa(d, opts);\n\t\tvar aoa = aoasht[0], ws = aoasht[1];\n\t\tvar o = aoa_to_sheet(aoa, opts);\n\t\tkeys(ws).forEach(function(k) { o[k] = ws[k]; });\n\t\treturn o;\n\t}\n\n\tfunction sylk_to_workbook(d, opts) { return sheet_to_workbook(sylk_to_sheet(d, opts), opts); }\n\n\tfunction write_ws_cell_sylk(cell, ws, R, C) {\n\t\tvar o = \"C;Y\" + (R+1) + \";X\" + (C+1) + \";K\";\n\t\tswitch(cell.t) {\n\t\t\tcase 'n':\n\t\t\t\to += (cell.v||0);\n\t\t\t\tif(cell.f && !cell.F) o += \";E\" + a1_to_rc(cell.f, {r:R, c:C}); break;\n\t\t\tcase 'b': o += cell.v ? \"TRUE\" : \"FALSE\"; break;\n\t\t\tcase 'e': o += cell.w || cell.v; break;\n\t\t\tcase 'd': o += '\"' + (cell.w || cell.v) + '\"'; break;\n\t\t\tcase 's': o += '\"' + cell.v.replace(/\"/g,\"\") + '\"'; break;\n\t\t}\n\t\treturn o;\n\t}\n\n\tfunction write_ws_cols_sylk(out, cols) {\n\t\tcols.forEach(function(col, i) {\n\t\t\tvar rec = \"F;W\" + (i+1) + \" \" + (i+1) + \" \";\n\t\t\tif(col.hidden) rec += \"0\";\n\t\t\telse {\n\t\t\t\tif(typeof col.width == 'number' && !col.wpx) col.wpx = width2px(col.width);\n\t\t\t\tif(typeof col.wpx == 'number' && !col.wch) col.wch = px2char(col.wpx);\n\t\t\t\tif(typeof col.wch == 'number') rec += Math.round(col.wch);\n\t\t\t}\n\t\t\tif(rec.charAt(rec.length - 1) != \" \") out.push(rec);\n\t\t});\n\t}\n\n\tfunction write_ws_rows_sylk(out, rows) {\n\t\trows.forEach(function(row, i) {\n\t\t\tvar rec = \"F;\";\n\t\t\tif(row.hidden) rec += \"M0;\";\n\t\t\telse if(row.hpt) rec += \"M\" + 20 * row.hpt + \";\";\n\t\t\telse if(row.hpx) rec += \"M\" + 20 * px2pt(row.hpx) + \";\";\n\t\t\tif(rec.length > 2) out.push(rec + \"R\" + (i+1));\n\t\t});\n\t}\n\n\tfunction sheet_to_sylk(ws, opts) {\n\t\tvar preamble = [\"ID;PWXL;N;E\"], o = [];\n\t\tvar r = safe_decode_range(ws['!ref']), cell;\n\t\tvar dense = Array.isArray(ws);\n\t\tvar RS = \"\\r\\n\";\n\n\t\tpreamble.push(\"P;PGeneral\");\n\t\tpreamble.push(\"F;P0;DG0G8;M255\");\n\t\tif(ws['!cols']) write_ws_cols_sylk(preamble, ws['!cols']);\n\t\tif(ws['!rows']) write_ws_rows_sylk(preamble, ws['!rows']);\n\n\t\tpreamble.push(\"B;Y\" + (r.e.r - r.s.r + 1) + \";X\" + (r.e.c - r.s.c + 1) + \";D\" + [r.s.c,r.s.r,r.e.c,r.e.r].join(\" \"));\n\t\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\t\tfor(var C = r.s.c; C <= r.e.c; ++C) {\n\t\t\t\tvar coord = encode_cell({r:R,c:C});\n\t\t\t\tcell = dense ? (ws[R]||[])[C]: ws[coord];\n\t\t\t\tif(!cell || (cell.v == null && (!cell.f || cell.F))) continue;\n\t\t\t\to.push(write_ws_cell_sylk(cell, ws, R, C, opts));\n\t\t\t}\n\t\t}\n\t\treturn preamble.join(RS) + RS + o.join(RS) + RS + \"E\" + RS;\n\t}\n\n\treturn {\n\t\tto_workbook: sylk_to_workbook,\n\t\tto_sheet: sylk_to_sheet,\n\t\tfrom_sheet: sheet_to_sylk\n\t};\n})();\n\nvar DIF = (function() {\n\tfunction dif_to_aoa(d, opts) {\n\t\tswitch(opts.type) {\n\t\t\tcase 'base64': return dif_to_aoa_str(Base64.decode(d), opts);\n\t\t\tcase 'binary': return dif_to_aoa_str(d, opts);\n\t\t\tcase 'buffer': return dif_to_aoa_str(has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d), opts);\n\t\t\tcase 'array': return dif_to_aoa_str(cc2str(d), opts);\n\t\t}\n\t\tthrow new Error(\"Unrecognized type \" + opts.type);\n\t}\n\tfunction dif_to_aoa_str(str, opts) {\n\t\tvar records = str.split('\\n'), R = -1, C = -1, ri = 0, arr = [];\n\t\tfor (; ri !== records.length; ++ri) {\n\t\t\tif (records[ri].trim() === 'BOT') { arr[++R] = []; C = 0; continue; }\n\t\t\tif (R < 0) continue;\n\t\t\tvar metadata = records[ri].trim().split(\",\");\n\t\t\tvar type = metadata[0], value = metadata[1];\n\t\t\t++ri;\n\t\t\tvar data = records[ri] || \"\";\n\t\t\twhile(((data.match(/[\"]/g)||[]).length & 1) && ri < records.length - 1) data += \"\\n\" + records[++ri];\n\t\t\tdata = data.trim();\n\t\t\tswitch (+type) {\n\t\t\t\tcase -1:\n\t\t\t\t\tif (data === 'BOT') { arr[++R] = []; C = 0; continue; }\n\t\t\t\t\telse if (data !== 'EOD') throw new Error(\"Unrecognized DIF special command \" + data);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0:\n\t\t\t\t\tif(data === 'TRUE') arr[R][C] = true;\n\t\t\t\t\telse if(data === 'FALSE') arr[R][C] = false;\n\t\t\t\t\telse if(!isNaN(fuzzynum(value))) arr[R][C] = fuzzynum(value);\n\t\t\t\t\telse if(!isNaN(fuzzydate(value).getDate())) arr[R][C] = parseDate(value);\n\t\t\t\t\telse arr[R][C] = value;\n\t\t\t\t\t++C; break;\n\t\t\t\tcase 1:\n\t\t\t\t\tdata = data.slice(1,data.length-1);\n\t\t\t\t\tdata = data.replace(/\"\"/g, '\"');\n\t\t\t\t\tif(DIF_XL && data && data.match(/^=\".*\"$/)) data = data.slice(2, -1);\n\t\t\t\t\tarr[R][C++] = data !== '' ? data : null;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (data === 'EOD') break;\n\t\t}\n\t\tif(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);\n\t\treturn arr;\n\t}\n\n\tfunction dif_to_sheet(str, opts) { return aoa_to_sheet(dif_to_aoa(str, opts), opts); }\n\tfunction dif_to_workbook(str, opts) { return sheet_to_workbook(dif_to_sheet(str, opts), opts); }\n\n\tvar sheet_to_dif = (function() {\n\t\tvar push_field = function pf(o, topic, v, n, s) {\n\t\t\to.push(topic);\n\t\t\to.push(v + \",\" + n);\n\t\t\to.push('\"' + s.replace(/\"/g,'\"\"') + '\"');\n\t\t};\n\t\tvar push_value = function po(o, type, v, s) {\n\t\t\to.push(type + \",\" + v);\n\t\t\to.push(type == 1 ? '\"' + s.replace(/\"/g,'\"\"') + '\"' : s);\n\t\t};\n\t\treturn function sheet_to_dif(ws) {\n\t\t\tvar o = [];\n\t\t\tvar r = safe_decode_range(ws['!ref']), cell;\n\t\t\tvar dense = Array.isArray(ws);\n\t\t\tpush_field(o, \"TABLE\", 0, 1, \"sheetjs\");\n\t\t\tpush_field(o, \"VECTORS\", 0, r.e.r - r.s.r + 1,\"\");\n\t\t\tpush_field(o, \"TUPLES\", 0, r.e.c - r.s.c + 1,\"\");\n\t\t\tpush_field(o, \"DATA\", 0, 0,\"\");\n\t\t\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\t\t\tpush_value(o, -1, 0, \"BOT\");\n\t\t\t\tfor(var C = r.s.c; C <= r.e.c; ++C) {\n\t\t\t\t\tvar coord = encode_cell({r:R,c:C});\n\t\t\t\t\tcell = dense ? (ws[R]||[])[C] : ws[coord];\n\t\t\t\t\tif(!cell) { push_value(o, 1, 0, \"\"); continue;}\n\t\t\t\t\tswitch(cell.t) {\n\t\t\t\t\t\tcase 'n':\n\t\t\t\t\t\t\tvar val = DIF_XL ? cell.w : cell.v;\n\t\t\t\t\t\t\tif(!val && cell.v != null) val = cell.v;\n\t\t\t\t\t\t\tif(val == null) {\n\t\t\t\t\t\t\t\tif(DIF_XL && cell.f && !cell.F) push_value(o, 1, 0, \"=\" + cell.f);\n\t\t\t\t\t\t\t\telse push_value(o, 1, 0, \"\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse push_value(o, 0, val, \"V\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'b':\n\t\t\t\t\t\t\tpush_value(o, 0, cell.v ? 1 : 0, cell.v ? \"TRUE\" : \"FALSE\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 's':\n\t\t\t\t\t\t\tpush_value(o, 1, 0, (!DIF_XL || isNaN(cell.v)) ? cell.v : '=\"' + cell.v + '\"');\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\t\tif(!cell.w) cell.w = SSF.format(cell.z || SSF._table[14], datenum(parseDate(cell.v)));\n\t\t\t\t\t\t\tif(DIF_XL) push_value(o, 0, cell.w, \"V\");\n\t\t\t\t\t\t\telse push_value(o, 1, 0, cell.w);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault: push_value(o, 1, 0, \"\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tpush_value(o, -1, 0, \"EOD\");\n\t\t\tvar RS = \"\\r\\n\";\n\t\t\tvar oo = o.join(RS);\n\t\t\t//while((oo.length & 0x7F) != 0) oo += \"\\0\";\n\t\t\treturn oo;\n\t\t};\n\t})();\n\treturn {\n\t\tto_workbook: dif_to_workbook,\n\t\tto_sheet: dif_to_sheet,\n\t\tfrom_sheet: sheet_to_dif\n\t};\n})();\n\nvar ETH = (function() {\n\tfunction decode(s) { return s.replace(/\\\\b/g,\"\\\\\").replace(/\\\\c/g,\":\").replace(/\\\\n/g,\"\\n\"); }\n\tfunction encode(s) { return s.replace(/\\\\/g, \"\\\\b\").replace(/:/g, \"\\\\c\").replace(/\\n/g,\"\\\\n\"); }\n\n\tfunction eth_to_aoa(str, opts) {\n\t\tvar records = str.split('\\n'), R = -1, C = -1, ri = 0, arr = [];\n\t\tfor (; ri !== records.length; ++ri) {\n\t\t\tvar record = records[ri].trim().split(\":\");\n\t\t\tif(record[0] !== 'cell') continue;\n\t\t\tvar addr = decode_cell(record[1]);\n\t\t\tif(arr.length <= addr.r) for(R = arr.length; R <= addr.r; ++R) if(!arr[R]) arr[R] = [];\n\t\t\tR = addr.r; C = addr.c;\n\t\t\tswitch(record[2]) {\n\t\t\t\tcase 't': arr[R][C] = decode(record[3]); break;\n\t\t\t\tcase 'v': arr[R][C] = +record[3]; break;\n\t\t\t\tcase 'vtf': var _f = record[record.length - 1];\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase 'vtc':\n\t\t\t\t\tswitch(record[3]) {\n\t\t\t\t\t\tcase 'nl': arr[R][C] = +record[4] ? true : false; break;\n\t\t\t\t\t\tdefault: arr[R][C] = +record[4]; break;\n\t\t\t\t\t}\n\t\t\t\t\tif(record[2] == 'vtf') arr[R][C] = [arr[R][C], _f];\n\t\t\t}\n\t\t}\n\t\tif(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);\n\t\treturn arr;\n\t}\n\n\tfunction eth_to_sheet(d, opts) { return aoa_to_sheet(eth_to_aoa(d, opts), opts); }\n\tfunction eth_to_workbook(d, opts) { return sheet_to_workbook(eth_to_sheet(d, opts), opts); }\n\n\tvar header = [\n\t\t\"socialcalc:version:1.5\",\n\t\t\"MIME-Version: 1.0\",\n\t\t\"Content-Type: multipart/mixed; boundary=SocialCalcSpreadsheetControlSave\"\n\t].join(\"\\n\");\n\n\tvar sep = [\n\t\t\"--SocialCalcSpreadsheetControlSave\",\n\t\t\"Content-type: text/plain; charset=UTF-8\"\n\t].join(\"\\n\") + \"\\n\";\n\n\t/* TODO: the other parts */\n\tvar meta = [\n\t\t\"# SocialCalc Spreadsheet Control Save\",\n\t\t\"part:sheet\"\n\t].join(\"\\n\");\n\n\tvar end = \"--SocialCalcSpreadsheetControlSave--\";\n\n\tfunction sheet_to_eth_data(ws) {\n\t\tif(!ws || !ws['!ref']) return \"\";\n\t\tvar o = [], oo = [], cell, coord = \"\";\n\t\tvar r = decode_range(ws['!ref']);\n\t\tvar dense = Array.isArray(ws);\n\t\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\t\tfor(var C = r.s.c; C <= r.e.c; ++C) {\n\t\t\t\tcoord = encode_cell({r:R,c:C});\n\t\t\t\tcell = dense ? (ws[R]||[])[C] : ws[coord];\n\t\t\t\tif(!cell || cell.v == null || cell.t === 'z') continue;\n\t\t\t\too = [\"cell\", coord, 't'];\n\t\t\t\tswitch(cell.t) {\n\t\t\t\t\tcase 's': case 'str': oo.push(encode(cell.v)); break;\n\t\t\t\t\tcase 'n':\n\t\t\t\t\t\tif(!cell.f) { oo[2]='v'; oo[3]=cell.v; }\n\t\t\t\t\t\telse { oo[2]='vtf'; oo[3]='n'; oo[4]=cell.v; oo[5]=encode(cell.f); }\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'b':\n\t\t\t\t\t\too[2] = 'vt'+(cell.f?'f':'c'); oo[3]='nl'; oo[4]=cell.v?\"1\":\"0\";\n\t\t\t\t\t\too[5] = encode(cell.f||(cell.v?'TRUE':'FALSE'));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'd':\n\t\t\t\t\t\tvar t = datenum(parseDate(cell.v));\n\t\t\t\t\t\too[2] = 'vtc'; oo[3] = 'nd'; oo[4] = \"\"+t;\n\t\t\t\t\t\too[5] = cell.w || SSF.format(cell.z || SSF._table[14], t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'e': continue;\n\t\t\t\t}\n\t\t\t\to.push(oo.join(\":\"));\n\t\t\t}\n\t\t}\n\t\to.push(\"sheet:c:\" + (r.e.c-r.s.c+1) + \":r:\" + (r.e.r-r.s.r+1) + \":tvf:1\");\n\t\to.push(\"valueformat:1:text-wiki\");\n\t\t//o.push(\"copiedfrom:\" + ws['!ref']); // clipboard only\n\t\treturn o.join(\"\\n\");\n\t}\n\n\tfunction sheet_to_eth(ws) {\n\t\treturn [header, sep, meta, sep, sheet_to_eth_data(ws), end].join(\"\\n\");\n\t\t// return [\"version:1.5\", sheet_to_eth_data(ws)].join(\"\\n\"); // clipboard form\n\t}\n\n\treturn {\n\t\tto_workbook: eth_to_workbook,\n\t\tto_sheet: eth_to_sheet,\n\t\tfrom_sheet: sheet_to_eth\n\t};\n})();\n\nvar PRN = (function() {\n\tfunction set_text_arr(data, arr, R, C, o) {\n\t\tif(o.raw) arr[R][C] = data;\n\t\telse if(data === \"\"){/* empty */}\n\t\telse if(data === 'TRUE') arr[R][C] = true;\n\t\telse if(data === 'FALSE') arr[R][C] = false;\n\t\telse if(!isNaN(fuzzynum(data))) arr[R][C] = fuzzynum(data);\n\t\telse if(!isNaN(fuzzydate(data).getDate())) arr[R][C] = parseDate(data);\n\t\telse arr[R][C] = data;\n\t}\n\n\tfunction prn_to_aoa_str(f, opts) {\n\t\tvar o = opts || {};\n\t\tvar arr = ([]);\n\t\tif(!f || f.length === 0) return arr;\n\t\tvar lines = f.split(/[\\r\\n]/);\n\t\tvar L = lines.length - 1;\n\t\twhile(L >= 0 && lines[L].length === 0) --L;\n\t\tvar start = 10, idx = 0;\n\t\tvar R = 0;\n\t\tfor(; R <= L; ++R) {\n\t\t\tidx = lines[R].indexOf(\" \");\n\t\t\tif(idx == -1) idx = lines[R].length; else idx++;\n\t\t\tstart = Math.max(start, idx);\n\t\t}\n\t\tfor(R = 0; R <= L; ++R) {\n\t\t\tarr[R] = [];\n\t\t\t/* TODO: confirm that widths are always 10 */\n\t\t\tvar C = 0;\n\t\t\tset_text_arr(lines[R].slice(0, start).trim(), arr, R, C, o);\n\t\t\tfor(C = 1; C <= (lines[R].length - start)/10 + 1; ++C)\n\t\t\t\tset_text_arr(lines[R].slice(start+(C-1)*10,start+C*10).trim(),arr,R,C,o);\n\t\t}\n\t\tif(o.sheetRows) arr = arr.slice(0, o.sheetRows);\n\t\treturn arr;\n\t}\n\n\t// List of accepted CSV separators\n\tvar guess_seps = {\n0x2C: ',',\n0x09: \"\\t\",\n0x3B: ';',\n0x7C: '|'\n\t};\n\n\t// CSV separator weights to be used in case of equal numbers\n\tvar guess_sep_weights = {\n0x2C: 3,\n0x09: 2,\n0x3B: 1,\n0x7C: 0\n\t};\n\n\tfunction guess_sep(str) {\n\t\tvar cnt = {}, instr = false, end = 0, cc = 0;\n\t\tfor(;end < str.length;++end) {\n\t\t\tif((cc=str.charCodeAt(end)) == 0x22) instr = !instr;\n\t\t\telse if(!instr && cc in guess_seps) cnt[cc] = (cnt[cc]||0)+1;\n\t\t}\n\n\t\tcc = [];\n\t\tfor(end in cnt) if ( Object.prototype.hasOwnProperty.call(cnt, end) ) {\n\t\t\tcc.push([ cnt[end], end ]);\n\t\t}\n\n\t\tif ( !cc.length ) {\n\t\t\tcnt = guess_sep_weights;\n\t\t\tfor(end in cnt) if ( Object.prototype.hasOwnProperty.call(cnt, end) ) {\n\t\t\t\tcc.push([ cnt[end], end ]);\n\t\t\t}\n\t\t}\n\n\t\tcc.sort(function(a, b) { return a[0] - b[0] || guess_sep_weights[a[1]] - guess_sep_weights[b[1]]; });\n\n\t\treturn guess_seps[cc.pop()[1]] || 0x2C;\n\t}\n\n\tfunction dsv_to_sheet_str(str, opts) {\n\t\tvar o = opts || {};\n\t\tvar sep = \"\";\n\t\tif(DENSE != null && o.dense == null) o.dense = DENSE;\n\t\tvar ws = o.dense ? ([]) : ({});\n\t\tvar range = ({s: {c:0, r:0}, e: {c:0, r:0}});\n\n\t\tif(str.slice(0,4) == \"sep=\") {\n\t\t\t// If the line ends in \\r\\n\n\t\t\tif(str.charCodeAt(5) == 13 && str.charCodeAt(6) == 10 ) {\n\t\t\t\tsep = str.charAt(4); str = str.slice(7);\n\t\t\t}\n\t\t\t// If line ends in \\r OR \\n\n\t\t\telse if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) {\n\t\t\t\tsep = str.charAt(4); str = str.slice(6);\n\t\t\t}\n\t\t\telse sep = guess_sep(str.slice(0,1024));\n\t\t}\n\t\telse if(o && o.FS) sep = o.FS;\n\t\telse sep = guess_sep(str.slice(0,1024));\n\t\tvar R = 0, C = 0, v = 0;\n\t\tvar start = 0, end = 0, sepcc = sep.charCodeAt(0), instr = false, cc=0, startcc=str.charCodeAt(0);\n\t\tstr = str.replace(/\\r\\n/mg, \"\\n\");\n\t\tvar _re = o.dateNF != null ? dateNF_regex(o.dateNF) : null;\n\t\tfunction finish_cell() {\n\t\t\tvar s = str.slice(start, end);\n\t\t\tvar cell = ({});\n\t\t\tif(s.charAt(0) == '\"' && s.charAt(s.length - 1) == '\"') s = s.slice(1,-1).replace(/\"\"/g,'\"');\n\t\t\tif(s.length === 0) cell.t = 'z';\n\t\t\telse if(o.raw) { cell.t = 's'; cell.v = s; }\n\t\t\telse if(s.trim().length === 0) { cell.t = 's'; cell.v = s; }\n\t\t\telse if(s.charCodeAt(0) == 0x3D) {\n\t\t\t\tif(s.charCodeAt(1) == 0x22 && s.charCodeAt(s.length - 1) == 0x22) { cell.t = 's'; cell.v = s.slice(2,-1).replace(/\"\"/g,'\"'); }\n\t\t\t\telse if(fuzzyfmla(s)) { cell.t = 'n'; cell.f = s.slice(1); }\n\t\t\t\telse { cell.t = 's'; cell.v = s; } }\n\t\t\telse if(s == \"TRUE\") { cell.t = 'b'; cell.v = true; }\n\t\t\telse if(s == \"FALSE\") { cell.t = 'b'; cell.v = false; }\n\t\t\telse if(!isNaN(v = fuzzynum(s))) { cell.t = 'n'; if(o.cellText !== false) cell.w = s; cell.v = v; }\n\t\t\telse if(!isNaN(fuzzydate(s).getDate()) || _re && s.match(_re)) {\n\t\t\t\tcell.z = o.dateNF || SSF._table[14];\n\t\t\t\tvar k = 0;\n\t\t\t\tif(_re && s.match(_re)){ s=dateNF_fix(s, o.dateNF, (s.match(_re)||[])); k=1; }\n\t\t\t\tif(o.cellDates) { cell.t = 'd'; cell.v = parseDate(s, k); }\n\t\t\t\telse { cell.t = 'n'; cell.v = datenum(parseDate(s, k)); }\n\t\t\t\tif(o.cellText !== false) cell.w = SSF.format(cell.z, cell.v instanceof Date ? datenum(cell.v):cell.v);\n\t\t\t\tif(!o.cellNF) delete cell.z;\n\t\t\t} else {\n\t\t\t\tcell.t = 's';\n\t\t\t\tcell.v = s;\n\t\t\t}\n\t\t\tif(cell.t == 'z'){}\n\t\t\telse if(o.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = cell; }\n\t\t\telse ws[encode_cell({c:C,r:R})] = cell;\n\t\t\tstart = end+1; startcc = str.charCodeAt(start);\n\t\t\tif(range.e.c < C) range.e.c = C;\n\t\t\tif(range.e.r < R) range.e.r = R;\n\t\t\tif(cc == sepcc) ++C; else { C = 0; ++R; if(o.sheetRows && o.sheetRows <= R) return true; }\n\t\t}\n\t\touter: for(;end < str.length;++end) switch((cc=str.charCodeAt(end))) {\n\t\t\tcase 0x22: if(startcc === 0x22) instr = !instr; break;\n\t\t\tcase sepcc: case 0x0a: case 0x0d: if(!instr && finish_cell()) break outer; break;\n\t\t\tdefault: break;\n\t\t}\n\t\tif(end - start > 0) finish_cell();\n\n\t\tws['!ref'] = encode_range(range);\n\t\treturn ws;\n\t}\n\n\tfunction prn_to_sheet_str(str, opts) {\n\t\tif(!(opts && opts.PRN)) return dsv_to_sheet_str(str, opts);\n\t\tif(opts.FS) return dsv_to_sheet_str(str, opts);\n\t\tif(str.slice(0,4) == \"sep=\") return dsv_to_sheet_str(str, opts);\n\t\tif(str.indexOf(\"\\t\") >= 0 || str.indexOf(\",\") >= 0 || str.indexOf(\";\") >= 0) return dsv_to_sheet_str(str, opts);\n\t\treturn aoa_to_sheet(prn_to_aoa_str(str, opts), opts);\n\t}\n\n\tfunction prn_to_sheet(d, opts) {\n\t\tvar str = \"\", bytes = opts.type == 'string' ? [0,0,0,0] : firstbyte(d, opts);\n\t\tswitch(opts.type) {\n\t\t\tcase 'base64': str = Base64.decode(d); break;\n\t\t\tcase 'binary': str = d; break;\n\t\t\tcase 'buffer':\n\t\t\t\tif(opts.codepage == 65001) str = d.toString('utf8'); // TODO: test if buf\n\t\t\t\telse if(opts.codepage && typeof cptable !== 'undefined') str = cptable.utils.decode(opts.codepage, d);\n\t\t\t\telse str = has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d);\n\t\t\t\tbreak;\n\t\t\tcase 'array': str = cc2str(d); break;\n\t\t\tcase 'string': str = d; break;\n\t\t\tdefault: throw new Error(\"Unrecognized type \" + opts.type);\n\t\t}\n\t\tif(bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str.slice(3));\n\t\telse if(opts.type != 'string' && opts.codepage == 65001) str = utf8read(str);\n\t\telse if((opts.type == 'binary') && typeof cptable !== 'undefined' && opts.codepage) str = cptable.utils.decode(opts.codepage, cptable.utils.encode(28591,str));\n\t\tif(str.slice(0,19) == \"socialcalc:version:\") return ETH.to_sheet(opts.type == 'string' ? str : utf8read(str), opts);\n\t\treturn prn_to_sheet_str(str, opts);\n\t}\n\n\tfunction prn_to_workbook(d, opts) { return sheet_to_workbook(prn_to_sheet(d, opts), opts); }\n\n\tfunction sheet_to_prn(ws) {\n\t\tvar o = [];\n\t\tvar r = safe_decode_range(ws['!ref']), cell;\n\t\tvar dense = Array.isArray(ws);\n\t\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\t\tvar oo = [];\n\t\t\tfor(var C = r.s.c; C <= r.e.c; ++C) {\n\t\t\t\tvar coord = encode_cell({r:R,c:C});\n\t\t\t\tcell = dense ? (ws[R]||[])[C] : ws[coord];\n\t\t\t\tif(!cell || cell.v == null) { oo.push(\" \"); continue; }\n\t\t\t\tvar w = (cell.w || (format_cell(cell), cell.w) || \"\").slice(0,10);\n\t\t\t\twhile(w.length < 10) w += \" \";\n\t\t\t\too.push(w + (C === 0 ? \" \" : \"\"));\n\t\t\t}\n\t\t\to.push(oo.join(\"\"));\n\t\t}\n\t\treturn o.join(\"\\n\");\n\t}\n\n\treturn {\n\t\tto_workbook: prn_to_workbook,\n\t\tto_sheet: prn_to_sheet,\n\t\tfrom_sheet: sheet_to_prn\n\t};\n})();\n\n/* Excel defaults to SYLK but warns if data is not valid */\nfunction read_wb_ID(d, opts) {\n\tvar o = opts || {}, OLD_WTF = !!o.WTF; o.WTF = true;\n\ttry {\n\t\tvar out = SYLK.to_workbook(d, o);\n\t\to.WTF = OLD_WTF;\n\t\treturn out;\n\t} catch(e) {\n\t\to.WTF = OLD_WTF;\n\t\tif(!e.message.match(/SYLK bad record ID/) && OLD_WTF) throw e;\n\t\treturn PRN.to_workbook(d, opts);\n\t}\n}\n\nvar WK_ = (function() {\n\tfunction lotushopper(data, cb, opts) {\n\t\tif(!data) return;\n\t\tprep_blob(data, data.l || 0);\n\t\tvar Enum = opts.Enum || WK1Enum;\n\t\twhile(data.l < data.length) {\n\t\t\tvar RT = data.read_shift(2);\n\t\t\tvar R = Enum[RT] || Enum[0xFFFF];\n\t\t\tvar length = data.read_shift(2);\n\t\t\tvar tgt = data.l + length;\n\t\t\tvar d = R.f && R.f(data, length, opts);\n\t\t\tdata.l = tgt;\n\t\t\tif(cb(d, R, RT)) return;\n\t\t}\n\t}\n\n\tfunction lotus_to_workbook(d, opts) {\n\t\tswitch(opts.type) {\n\t\t\tcase 'base64': return lotus_to_workbook_buf(s2a(Base64.decode(d)), opts);\n\t\t\tcase 'binary': return lotus_to_workbook_buf(s2a(d), opts);\n\t\t\tcase 'buffer':\n\t\t\tcase 'array': return lotus_to_workbook_buf(d, opts);\n\t\t}\n\t\tthrow \"Unsupported type \" + opts.type;\n\t}\n\n\tfunction lotus_to_workbook_buf(d, opts) {\n\t\tif(!d) return d;\n\t\tvar o = opts || {};\n\t\tif(DENSE != null && o.dense == null) o.dense = DENSE;\n\t\tvar s = ((o.dense ? [] : {})), n = \"Sheet1\", next_n = \"\", sidx = 0;\n\t\tvar sheets = {}, snames = [], realnames = [];\n\n\t\tvar refguess = {s: {r:0, c:0}, e: {r:0, c:0} };\n\t\tvar sheetRows = o.sheetRows || 0;\n\n\t\tif(d[2] == 0x00) {\n\t\t\tif(d[3] == 0x08 || d[3] == 0x09) {\n\t\t\t\tif(d.length >= 16 && d[14] == 0x05 && d[15] === 0x6c) throw new Error(\"Unsupported Works 3 for Mac file\");\n\t\t\t}\n\t\t}\n\n\t\tif(d[2] == 0x02) {\n\t\t\to.Enum = WK1Enum;\n\t\t\tlotushopper(d, function(val, R, RT) { switch(RT) {\n\t\t\t\tcase 0x00: /* BOF */\n\t\t\t\t\to.vers = val;\n\t\t\t\t\tif(val >= 0x1000) o.qpro = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x06: refguess = val; break; /* RANGE */\n\t\t\t\tcase 0xCC: if(val) next_n = val; break; /* SHEETNAMECS */\n\t\t\t\tcase 0xDE: next_n = val; break; /* SHEETNAMELP */\n\t\t\t\tcase 0x0F: /* LABEL */\n\t\t\t\tcase 0x33: /* STRING */\n\t\t\t\t\tif(!o.qpro) val[1].v = val[1].v.slice(1);\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase 0x0D: /* INTEGER */\n\t\t\t\tcase 0x0E: /* NUMBER */\n\t\t\t\tcase 0x10: /* FORMULA */\n\t\t\t\t\t/* TODO: actual translation of the format code */\n\t\t\t\t\tif(RT == 0x0E && (val[2] & 0x70) == 0x70 && (val[2] & 0x0F) > 1 && (val[2] & 0x0F) < 15) {\n\t\t\t\t\t\tval[1].z = o.dateNF || SSF._table[14];\n\t\t\t\t\t\tif(o.cellDates) { val[1].t = 'd'; val[1].v = numdate(val[1].v); }\n\t\t\t\t\t}\n\n\t\t\t\t\tif(o.qpro) {\n\t\t\t\t\t\tif(val[3] > sidx) {\n\t\t\t\t\t\t\ts[\"!ref\"] = encode_range(refguess);\n\t\t\t\t\t\t\tsheets[n] = s;\n\t\t\t\t\t\t\tsnames.push(n);\n\t\t\t\t\t\t\ts = (o.dense ? [] : {});\n\t\t\t\t\t\t\trefguess = {s: {r:0, c:0}, e: {r:0, c:0} };\n\t\t\t\t\t\t\tsidx = val[3]; n = next_n || \"Sheet\" + (sidx + 1); next_n = \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvar tmpcell = o.dense ? (s[val[0].r]||[])[val[0].c] : s[encode_cell(val[0])];\n\t\t\t\t\tif(tmpcell) {\n\t\t\t\t\t\ttmpcell.t = val[1].t; tmpcell.v = val[1].v;\n\t\t\t\t\t\tif(val[1].z != null) tmpcell.z = val[1].z;\n\t\t\t\t\t\tif(val[1].f != null) tmpcell.f = val[1].f;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif(o.dense) {\n\t\t\t\t\t\tif(!s[val[0].r]) s[val[0].r] = [];\n\t\t\t\t\t\ts[val[0].r][val[0].c] = val[1];\n\t\t\t\t\t} else s[encode_cell(val[0])] = val[1];\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t}}, o);\n\t\t} else if(d[2] == 0x1A || d[2] == 0x0E) {\n\t\t\to.Enum = WK3Enum;\n\t\t\tif(d[2] == 0x0E) { o.qpro = true; d.l = 0; }\n\t\t\tlotushopper(d, function(val, R, RT) { switch(RT) {\n\t\t\t\tcase 0xCC: n = val; break; /* SHEETNAMECS */\n\t\t\t\tcase 0x16: /* LABEL16 */\n\t\t\t\t\tval[1].v = val[1].v.slice(1);\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase 0x17: /* NUMBER17 */\n\t\t\t\tcase 0x18: /* NUMBER18 */\n\t\t\t\tcase 0x19: /* FORMULA19 */\n\t\t\t\tcase 0x25: /* NUMBER25 */\n\t\t\t\tcase 0x27: /* NUMBER27 */\n\t\t\t\tcase 0x28: /* FORMULA28 */\n\t\t\t\t\tif(val[3] > sidx) {\n\t\t\t\t\t\ts[\"!ref\"] = encode_range(refguess);\n\t\t\t\t\t\tsheets[n] = s;\n\t\t\t\t\t\tsnames.push(n);\n\t\t\t\t\t\ts = (o.dense ? [] : {});\n\t\t\t\t\t\trefguess = {s: {r:0, c:0}, e: {r:0, c:0} };\n\t\t\t\t\t\tsidx = val[3]; n = \"Sheet\" + (sidx + 1);\n\t\t\t\t\t}\n\t\t\t\t\tif(sheetRows > 0 && val[0].r >= sheetRows) break;\n\t\t\t\t\tif(o.dense) {\n\t\t\t\t\t\tif(!s[val[0].r]) s[val[0].r] = [];\n\t\t\t\t\t\ts[val[0].r][val[0].c] = val[1];\n\t\t\t\t\t} else s[encode_cell(val[0])] = val[1];\n\t\t\t\t\tif(refguess.e.c < val[0].c) refguess.e.c = val[0].c;\n\t\t\t\t\tif(refguess.e.r < val[0].r) refguess.e.r = val[0].r;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x1B: /* XFORMAT */\n\t\t\t\t\tif(val[0x36b0]) realnames[val[0x36b0][0]] = val[0x36b0][1];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0601: /* SHEETINFOQP */\n\t\t\t\t\trealnames[val[0]] = val[1]; if(val[0] == sidx) n = val[1]; break;\n\t\t\t\tdefault: break;\n\t\t\t}}, o);\n\t\t} else throw new Error(\"Unrecognized LOTUS BOF \" + d[2]);\n\t\ts[\"!ref\"] = encode_range(refguess);\n\t\tsheets[next_n || n] = s;\n\t\tsnames.push(next_n || n);\n\t\tif(!realnames.length) return { SheetNames: snames, Sheets: sheets };\n\t\tvar osheets = {}, rnames = [];\n\t\t/* TODO: verify no collisions */\n\t\tfor(var i = 0; i < realnames.length; ++i) if(sheets[snames[i]]) {\n\t\t\trnames.push(realnames[i] || snames[i]);\n\t\t\tosheets[realnames[i]] = sheets[realnames[i]] || sheets[snames[i]];\n\t\t} else {\n\t\t\trnames.push(realnames[i]);\n\t\t\tosheets[realnames[i]] = ({ \"!ref\": \"A1\" });\n\t\t}\n\t\treturn { SheetNames: rnames, Sheets: osheets };\n\t}\n\n\tfunction sheet_to_wk1(ws, opts) {\n\t\tvar o = opts || {};\n\t\tif(+o.codepage >= 0) set_cp(+o.codepage);\n\t\tif(o.type == \"string\") throw new Error(\"Cannot write WK1 to JS string\");\n\t\tvar ba = buf_array();\n\t\tvar range = safe_decode_range(ws[\"!ref\"]);\n\t\tvar dense = Array.isArray(ws);\n\t\tvar cols = [];\n\n\t\twrite_biff_rec(ba, 0x00, write_BOF_WK1(0x0406));\n\t\twrite_biff_rec(ba, 0x06, write_RANGE(range));\n\t\tvar max_R = Math.min(range.e.r, 8191);\n\t\tfor(var R = range.s.r; R <= max_R; ++R) {\n\t\t\tvar rr = encode_row(R);\n\t\t\tfor(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\t\tif(R === range.s.r) cols[C] = encode_col(C);\n\t\t\t\tvar ref = cols[C] + rr;\n\t\t\t\tvar cell = dense ? (ws[R]||[])[C] : ws[ref];\n\t\t\t\tif(!cell || cell.t == \"z\") continue;\n\t\t\t\t/* TODO: formula records */\n\t\t\t\tif(cell.t == \"n\") {\n\t\t\t\t\tif((cell.v|0)==cell.v && cell.v >= -32768 && cell.v <= 32767) write_biff_rec(ba, 0x0d, write_INTEGER(R, C, cell.v));\n\t\t\t\t\telse write_biff_rec(ba, 0x0e, write_NUMBER(R, C, cell.v));\n\t\t\t\t} else {\n\t\t\t\t\tvar str = format_cell(cell);\n\t\t\t\t\twrite_biff_rec(ba, 0x0F, write_LABEL(R, C, str.slice(0, 239)));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\twrite_biff_rec(ba, 0x01);\n\t\treturn ba.end();\n\t}\n\n\tfunction book_to_wk3(wb, opts) {\n\t\tvar o = opts || {};\n\t\tif(+o.codepage >= 0) set_cp(+o.codepage);\n\t\tif(o.type == \"string\") throw new Error(\"Cannot write WK3 to JS string\");\n\t\tvar ba = buf_array();\n\n\t\twrite_biff_rec(ba, 0x00, write_BOF_WK3(wb));\n\n\t\tfor(var i = 0, cnt = 0; i < wb.SheetNames.length; ++i) if((wb.Sheets[wb.SheetNames[i]] || {})[\"!ref\"]) write_biff_rec(ba, 0x1b, write_XFORMAT_SHEETNAME(wb.SheetNames[i], cnt++));\n\n\t\tvar wsidx = 0;\n\t\tfor(i = 0; i < wb.SheetNames.length; ++i) {\n\t\t\tvar ws = wb.Sheets[wb.SheetNames[i]];\n\t\t\tif(!ws || !ws[\"!ref\"]) continue;\n\t\t\tvar range = safe_decode_range(ws[\"!ref\"]);\n\t\t\tvar dense = Array.isArray(ws);\n\t\t\tvar cols = [];\n\t\t\tvar max_R = Math.min(range.e.r, 8191);\n\t\t\tfor(var R = range.s.r; R <= max_R; ++R) {\n\t\t\t\tvar rr = encode_row(R);\n\t\t\t\tfor(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\t\t\tif(R === range.s.r) cols[C] = encode_col(C);\n\t\t\t\t\tvar ref = cols[C] + rr;\n\t\t\t\t\tvar cell = dense ? (ws[R]||[])[C] : ws[ref];\n\t\t\t\t\tif(!cell || cell.t == \"z\") continue;\n\t\t\t\t\t/* TODO: FORMULA19 NUMBER18 records */\n\t\t\t\t\tif(cell.t == \"n\") {\n\t\t\t\t\t\twrite_biff_rec(ba, 0x17, write_NUMBER_17(R, C, wsidx, cell.v));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar str = format_cell(cell);\n\t\t\t\t\t\t/* TODO: max len? */\n\t\t\t\t\t\twrite_biff_rec(ba, 0x16, write_LABEL_16(R, C, wsidx, str.slice(0, 239)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t++wsidx;\n\t\t}\n\n\t\twrite_biff_rec(ba, 0x01);\n\t\treturn ba.end();\n\t}\n\n\n\tfunction write_BOF_WK1(v) {\n\t\tvar out = new_buf(2);\n\t\tout.write_shift(2, v);\n\t\treturn out;\n\t}\n\n\tfunction write_BOF_WK3(wb) {\n\t\tvar out = new_buf(26);\n\t\tout.write_shift(2, 0x1000);\n\t\tout.write_shift(2, 0x0004);\n\t\tout.write_shift(4, 0x0000);\n\t\tvar rows = 0, cols = 0, wscnt = 0;\n\t\tfor(var i = 0; i < wb.SheetNames.length; ++i) {\n\t\t\tvar name = wb.SheetNames[i];\n\t\t\tvar ws = wb.Sheets[name];\n\t\t\tif(!ws || !ws[\"!ref\"]) continue;\n\t\t\t++wscnt;\n\t\t\tvar range = decode_range(ws[\"!ref\"]);\n\t\t\tif(rows < range.e.r) rows = range.e.r;\n\t\t\tif(cols < range.e.c) cols = range.e.c;\n\t\t}\n\t\tif(rows > 8191) rows = 8191;\n\t\tout.write_shift(2, rows);\n\t\tout.write_shift(1, wscnt);\n\t\tout.write_shift(1, cols);\n\t\tout.write_shift(2, 0x00);\n\t\tout.write_shift(2, 0x00);\n\t\tout.write_shift(1, 0x01);\n\t\tout.write_shift(1, 0x02);\n\t\tout.write_shift(4, 0);\n\t\tout.write_shift(4, 0);\n\t\treturn out;\n\t}\n\n\tfunction parse_RANGE(blob, length, opts) {\n\t\tvar o = {s:{c:0,r:0},e:{c:0,r:0}};\n\t\tif(length == 8 && opts.qpro) {\n\t\t\to.s.c = blob.read_shift(1);\n\t\t\tblob.l++;\n\t\t\to.s.r = blob.read_shift(2);\n\t\t\to.e.c = blob.read_shift(1);\n\t\t\tblob.l++;\n\t\t\to.e.r = blob.read_shift(2);\n\t\t\treturn o;\n\t\t}\n\t\to.s.c = blob.read_shift(2);\n\t\to.s.r = blob.read_shift(2);\n\t\tif(length == 12 && opts.qpro) blob.l += 2;\n\t\to.e.c = blob.read_shift(2);\n\t\to.e.r = blob.read_shift(2);\n\t\tif(length == 12 && opts.qpro) blob.l += 2;\n\t\tif(o.s.c == 0xFFFF) o.s.c = o.e.c = o.s.r = o.e.r = 0;\n\t\treturn o;\n\t}\n\tfunction write_RANGE(range) {\n\t\tvar out = new_buf(8);\n\t\tout.write_shift(2, range.s.c);\n\t\tout.write_shift(2, range.s.r);\n\t\tout.write_shift(2, range.e.c);\n\t\tout.write_shift(2, range.e.r);\n\t\treturn out;\n\t}\n\n\tfunction parse_cell(blob, length, opts) {\n\t\tvar o = [{c:0,r:0}, {t:'n',v:0}, 0, 0];\n\t\tif(opts.qpro && opts.vers != 0x5120) {\n\t\t\to[0].c = blob.read_shift(1);\n\t\t\to[3] = blob.read_shift(1);\n\t\t\to[0].r = blob.read_shift(2);\n\t\t\tblob.l+=2;\n\t\t} else {\n\t\t\to[2] = blob.read_shift(1);\n\t\t\to[0].c = blob.read_shift(2); o[0].r = blob.read_shift(2);\n\t\t}\n\t\treturn o;\n\t}\n\n\tfunction parse_LABEL(blob, length, opts) {\n\t\tvar tgt = blob.l + length;\n\t\tvar o = parse_cell(blob, length, opts);\n\t\to[1].t = 's';\n\t\tif(opts.vers == 0x5120) {\n\t\t\tblob.l++;\n\t\t\tvar len = blob.read_shift(1);\n\t\t\to[1].v = blob.read_shift(len, 'utf8');\n\t\t\treturn o;\n\t\t}\n\t\tif(opts.qpro) blob.l++;\n\t\to[1].v = blob.read_shift(tgt - blob.l, 'cstr');\n\t\treturn o;\n\t}\n\tfunction write_LABEL(R, C, s) {\n\t\t/* TODO: encoding */\n\t\tvar o = new_buf(7 + s.length);\n\t\to.write_shift(1, 0xFF);\n\t\to.write_shift(2, C);\n\t\to.write_shift(2, R);\n\t\to.write_shift(1, 0x27); // ??\n\t\tfor(var i = 0; i < o.length; ++i) {\n\t\t\tvar cc = s.charCodeAt(i);\n\t\t\to.write_shift(1, cc >= 0x80 ? 0x5F : cc);\n\t\t}\n\t\to.write_shift(1, 0);\n\t\treturn o;\n\t}\n\n\tfunction parse_INTEGER(blob, length, opts) {\n\t\tvar o = parse_cell(blob, length, opts);\n\t\to[1].v = blob.read_shift(2, 'i');\n\t\treturn o;\n\t}\n\tfunction write_INTEGER(R, C, v) {\n\t\tvar o = new_buf(7);\n\t\to.write_shift(1, 0xFF);\n\t\to.write_shift(2, C);\n\t\to.write_shift(2, R);\n\t\to.write_shift(2, v, 'i');\n\t\treturn o;\n\t}\n\n\tfunction parse_NUMBER(blob, length, opts) {\n\t\tvar o = parse_cell(blob, length, opts);\n\t\to[1].v = blob.read_shift(8, 'f');\n\t\treturn o;\n\t}\n\tfunction write_NUMBER(R, C, v) {\n\t\tvar o = new_buf(13);\n\t\to.write_shift(1, 0xFF);\n\t\to.write_shift(2, C);\n\t\to.write_shift(2, R);\n\t\to.write_shift(8, v, 'f');\n\t\treturn o;\n\t}\n\n\tfunction parse_FORMULA(blob, length, opts) {\n\t\tvar tgt = blob.l + length;\n\t\tvar o = parse_cell(blob, length, opts);\n\t\t/* TODO: formula */\n\t\to[1].v = blob.read_shift(8, 'f');\n\t\tif(opts.qpro) blob.l = tgt;\n\t\telse {\n\t\t\tvar flen = blob.read_shift(2);\n\t\t\twk1_fmla_to_csf(blob.slice(blob.l, blob.l + flen), o);\n\t\t\tblob.l += flen;\n\t\t}\n\t\treturn o;\n\t}\n\n\tfunction wk1_parse_rc(B, V, col) {\n\t\tvar rel = V & 0x8000;\n\t\tV &= ~0x8000;\n\t\tV = (rel ? B : 0) + ((V >= 0x2000) ? V - 0x4000 : V);\n\t\treturn (rel ? \"\" : \"$\") + (col ? encode_col(V) : encode_row(V));\n\t}\n\tvar oprec = [\n\t\t8, 8, 8, 8, 8, 8, 8, 8, 6, 4, 4, 5, 5, 7, 3, 3,\n\t\t3, 3, 3, 3, 1, 1, 2, 6, 8, 8, 8, 8, 8, 8, 8, 8\n\t];\n\t/* TODO: flesh out */\n\tvar FuncTab = {\n\t\t0x33: [\"FALSE\", 0],\n\t\t0x34: [\"TRUE\", 0],\n\t\t0x46: [\"LEN\", 1],\n\t\t0x50: [\"SUM\", 69],\n\t\t0x51: [\"AVERAGEA\", 69],\n\t\t0x52: [\"COUNTA\", 69],\n\t\t0x53: [\"MINA\", 69],\n\t\t0x54: [\"MAXA\", 69],\n\t\t0x6F: [\"T\", 1]\n\t};\n\tvar BinOpTab = [\n\t\t \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\",\n\t\t \"\", \"+\", \"-\", \"*\", \"/\", \"^\", \"=\", \"<>\",\n\t\t\"<=\", \">=\", \"<\", \">\", \"\", \"\", \"\", \"\",\n\t\t \"&\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"\n\t];\n\n\tfunction wk1_fmla_to_csf(blob, o) {\n\t\tprep_blob(blob, 0);\n\t\tvar out = [], argc = 0, R = \"\", C = \"\", argL = \"\", argR = \"\";\n\t\twhile(blob.l < blob.length) {\n\t\t\tvar cc = blob[blob.l++];\n\t\t\tswitch(cc) {\n\t\t\t\tcase 0x00: out.push(blob.read_shift(8, 'f')); break;\n\t\t\t\tcase 0x01: {\n\t\t\t\t\tC = wk1_parse_rc(o[0].c, blob.read_shift(2), true);\n\t\t\t\t\tR = wk1_parse_rc(o[0].r, blob.read_shift(2), false);\n\t\t\t\t\tout.push(C + R);\n\t\t\t\t} break;\n\t\t\t\tcase 0x02: {\n\t\t\t\t\tvar c = wk1_parse_rc(o[0].c, blob.read_shift(2), true);\n\t\t\t\t\tvar r = wk1_parse_rc(o[0].r, blob.read_shift(2), false);\n\t\t\t\t\tC = wk1_parse_rc(o[0].c, blob.read_shift(2), true);\n\t\t\t\t\tR = wk1_parse_rc(o[0].r, blob.read_shift(2), false);\n\t\t\t\t\tout.push(c + r + \":\" + C + R);\n\t\t\t\t} break;\n\t\t\t\tcase 0x03:\n\t\t\t\t\tif(blob.l < blob.length) { console.error(\"WK1 premature formula end\"); return; }\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x04: out.push(\"(\" + out.pop() + \")\"); break;\n\t\t\t\tcase 0x05: out.push(blob.read_shift(2)); break;\n\t\t\t\tcase 0x06: {\n\t\t\t\t\t/* TODO: text encoding */\n\t\t\t\t\tvar Z = \"\"; while((cc = blob[blob.l++])) Z += String.fromCharCode(cc);\n\t\t\t\t\tout.push('\"' + Z.replace(/\"/g, '\"\"') + '\"'); break;\n\t\t\t\t} break;\n\n\t\t\t\tcase 0x08: out.push(\"-\" + out.pop()); break;\n\t\t\t\tcase 0x17: out.push(\"+\" + out.pop()); break;\n\t\t\t\tcase 0x16: out.push(\"NOT(\" + out.pop() + \")\"); break;\n\n\t\t\t\tcase 0x14: case 0x15: {\n\t\t\t\t\targR = out.pop(); argL = out.pop();\n\t\t\t\t\tout.push([\"AND\", \"OR\"][cc - 0x14] + \"(\" + argL + \",\" + argR + \")\");\n\t\t\t\t} break;\n\n\t\t\t\tdefault:\n\t\t\t\t\tif(cc < 0x20 && BinOpTab[cc]) {\n\t\t\t\t\t\targR = out.pop(); argL = out.pop();\n\t\t\t\t\t\tout.push(argL + BinOpTab[cc] + argR);\n\t\t\t\t\t} else if(FuncTab[cc]) {\n\t\t\t\t\t\targc = FuncTab[cc][1];\n\t\t\t\t\t\tif(argc == 69) argc = blob[blob.l++];\n\t\t\t\t\t\tif(argc > out.length) { console.error(\"WK1 bad formula parse 0x\" + cc.toString(16) + \":|\" + out.join(\"|\") + \"|\"); return; }\n\t\t\t\t\t\tvar args = out.slice(-argc);\n\t\t\t\t\t\tout.length -= argc;\n\t\t\t\t\t\tout.push(FuncTab[cc][0] + \"(\" + args.join(\",\") + \")\");\n\t\t\t\t\t}\n\t\t\t\t\telse if(cc <= 0x07) return console.error(\"WK1 invalid opcode \" + cc.toString(16));\n\t\t\t\t\telse if(cc <= 0x18) return console.error(\"WK1 unsupported op \" + cc.toString(16));\n\t\t\t\t\telse if(cc <= 0x1E) return console.error(\"WK1 invalid opcode \" + cc.toString(16));\n\t\t\t\t\telse if(cc <= 0x73) return console.error(\"WK1 unsupported function opcode \" + cc.toString(16));\n\t\t\t\t\t// possible future functions ??\n\t\t\t\t\telse return console.error(\"WK1 unrecognized opcode \" + cc.toString(16));\n\t\t\t}\n\t\t}\n\t\tif(out.length == 1) o[1].f = \"\" + out[0];\n\t\telse console.error(\"WK1 bad formula parse |\" + out.join(\"|\") + \"|\");\n\t}\n\n\n\tfunction parse_cell_3(blob) {\n\t\tvar o = [{c:0,r:0}, {t:'n',v:0}, 0];\n\t\to[0].r = blob.read_shift(2); o[3] = blob[blob.l++]; o[0].c = blob[blob.l++];\n\t\treturn o;\n\t}\n\n\tfunction parse_LABEL_16(blob, length) {\n\t\tvar o = parse_cell_3(blob, length);\n\t\to[1].t = 's';\n\t\to[1].v = blob.read_shift(length - 4, 'cstr');\n\t\treturn o;\n\t}\n\tfunction write_LABEL_16(R, C, wsidx, s) {\n\t\t/* TODO: encoding */\n\t\tvar o = new_buf(6 + s.length);\n\t\to.write_shift(2, R);\n\t\to.write_shift(1, wsidx);\n\t\to.write_shift(1, C);\n\t\to.write_shift(1, 0x27);\n\t\tfor(var i = 0; i < s.length; ++i) {\n\t\t\tvar cc = s.charCodeAt(i);\n\t\t\to.write_shift(1, cc >= 0x80 ? 0x5F : cc);\n\t\t}\n\t\to.write_shift(1, 0);\n\t\treturn o;\n\t}\n\n\tfunction parse_NUMBER_18(blob, length) {\n\t\tvar o = parse_cell_3(blob, length);\n\t\to[1].v = blob.read_shift(2);\n\t\tvar v = o[1].v >> 1;\n\t\tif(o[1].v & 0x1) {\n\t\t\tswitch(v & 0x07) {\n\t\t\t\tcase 0: v = (v >> 3) * 5000; break;\n\t\t\t\tcase 1: v = (v >> 3) * 500; break;\n\t\t\t\tcase 2: v = (v >> 3) / 20; break;\n\t\t\t\tcase 3: v = (v >> 3) / 200; break;\n\t\t\t\tcase 4: v = (v >> 3) / 2000; break;\n\t\t\t\tcase 5: v = (v >> 3) / 20000; break;\n\t\t\t\tcase 6: v = (v >> 3) / 16; break;\n\t\t\t\tcase 7: v = (v >> 3) / 64; break;\n\t\t\t}\n\t\t}\n\t\to[1].v = v;\n\t\treturn o;\n\t}\n\n\tfunction parse_NUMBER_17(blob, length) {\n\t\tvar o = parse_cell_3(blob, length);\n\t\tvar v1 = blob.read_shift(4);\n\t\tvar v2 = blob.read_shift(4);\n\t\tvar e = blob.read_shift(2);\n\t\tif(e == 0xFFFF) {\n\t\t\tif(v1 === 0 && v2 === 0xC0000000) { o[1].t = \"e\"; o[1].v = 0x0F; } // ERR -> #VALUE!\n\t\t\telse if(v1 === 0 && v2 === 0xD0000000) { o[1].t = \"e\"; o[1].v = 0x2A; } // NA -> #N/A\n\t\t\telse o[1].v = 0;\n\t\t\treturn o;\n\t\t}\n\t\tvar s = e & 0x8000; e = (e&0x7FFF) - 16446;\n\t\to[1].v = (1 - s*2) * (v2 * Math.pow(2, e+32) + v1 * Math.pow(2, e));\n\t\treturn o;\n\t}\n\tfunction write_NUMBER_17(R, C, wsidx, v) {\n\t\tvar o = new_buf(14);\n\t\to.write_shift(2, R);\n\t\to.write_shift(1, wsidx);\n\t\to.write_shift(1, C);\n\t\tif(v == 0) {\n\t\t\to.write_shift(4, 0);\n\t\t\to.write_shift(4, 0);\n\t\t\to.write_shift(2, 0xFFFF);\n\t\t\treturn o;\n\t\t}\n\t\tvar s = 0, e = 0, v1 = 0, v2 = 0;\n\t\tif(v < 0) { s = 1; v = -v; }\n\t\te = Math.log2(v) | 0;\n\t\tv /= Math.pow(2, e-31);\n\t\tv2 = (v)>>>0;\n\t\tif((v2&0x80000000) == 0) { v/=2; ++e; v2 = v >>> 0; }\n\t\tv -= v2;\n\t\tv2 |= 0x80000000;\n\t\tv2 >>>= 0;\n\t\tv *= Math.pow(2, 32);\n\t\tv1 = v>>>0;\n\t\to.write_shift(4, v1);\n\t\to.write_shift(4, v2);\n\t\te += 0x3FFF + (s ? 0x8000 : 0);\n\t\to.write_shift(2, e);\n\t\treturn o;\n\t}\n\n\tfunction parse_FORMULA_19(blob, length) {\n\t\tvar o = parse_NUMBER_17(blob, 14);\n\t\tblob.l += length - 14; /* TODO: WK3 formula */\n\t\treturn o;\n\t}\n\n\tfunction parse_NUMBER_25(blob, length) {\n\t\tvar o = parse_cell_3(blob, length);\n\t\tvar v1 = blob.read_shift(4);\n\t\to[1].v = v1 >> 6;\n\t\treturn o;\n\t}\n\n\tfunction parse_NUMBER_27(blob, length) {\n\t\tvar o = parse_cell_3(blob, length);\n\t\tvar v1 = blob.read_shift(8,'f');\n\t\to[1].v = v1;\n\t\treturn o;\n\t}\n\n\tfunction parse_FORMULA_28(blob, length) {\n\t\tvar o = parse_NUMBER_27(blob, 14);\n\t\tblob.l += length - 10; /* TODO: formula */\n\t\treturn o;\n\t}\n\n\tfunction parse_SHEETNAMECS(blob, length) {\n\t\treturn blob[blob.l + length - 1] == 0 ? blob.read_shift(length, 'cstr') : \"\";\n\t}\n\n\tfunction parse_SHEETNAMELP(blob, length) {\n\t\tvar len = blob[blob.l++];\n\t\tif(len > length - 1) len = length - 1;\n\t\tvar o = \"\"; while(o.length < len) o += String.fromCharCode(blob[blob.l++]);\n\t\treturn o;\n\t}\n\n\tfunction parse_SHEETINFOQP(blob, length, opts) {\n\t\tif(!opts.qpro || length < 21) return;\n\t\tvar id = blob.read_shift(1);\n\t\tblob.l += 17;\n\t\tvar len = blob.read_shift(1);\n\t\tblob.l += 2;\n\t\tvar nm = blob.read_shift(length - 21, 'cstr');\n\t\treturn [id, nm];\n\t}\n\n\tfunction parse_XFORMAT(blob, length) {\n\t\tvar o = {}, tgt = blob.l + length;\n\t\twhile(blob.l < tgt) {\n\t\t\tvar dt = blob.read_shift(2);\n\t\t\tif(dt == 0x36b0) {\n\t\t\t\to[dt] = [0, \"\"];\n\t\t\t\to[dt][0] = blob.read_shift(2);\n\t\t\t\twhile(blob[blob.l]) { o[dt][1] += String.fromCharCode(blob[blob.l]); blob.l++; } blob.l++;\n\t\t\t}\n\t\t\t// TODO: 0x3a99 ??\n\t\t}\n\t\treturn o;\n\t}\n\tfunction write_XFORMAT_SHEETNAME(name, wsidx) {\n\t\tvar out = new_buf(5 + name.length);\n\t\tout.write_shift(2, 0x36b0);\n\t\tout.write_shift(2, wsidx);\n\t\tfor(var i = 0; i < name.length; ++i) {\n\t\t\tvar cc = name.charCodeAt(i);\n\t\t\tout[out.l++] = cc > 0x7F ? 0x5F : cc;\n\t\t}\n\t\tout[out.l++] = 0;\n\t\treturn out;\n\t}\n\n\tvar WK1Enum = {\n0x0000: { n:\"BOF\", f:parseuint16 },\n0x0001: { n:\"EOF\" },\n0x0002: { n:\"CALCMODE\" },\n0x0003: { n:\"CALCORDER\" },\n0x0004: { n:\"SPLIT\" },\n0x0005: { n:\"SYNC\" },\n0x0006: { n:\"RANGE\", f:parse_RANGE },\n0x0007: { n:\"WINDOW1\" },\n0x0008: { n:\"COLW1\" },\n0x0009: { n:\"WINTWO\" },\n0x000A: { n:\"COLW2\" },\n0x000B: { n:\"NAME\" },\n0x000C: { n:\"BLANK\" },\n0x000D: { n:\"INTEGER\", f:parse_INTEGER },\n0x000E: { n:\"NUMBER\", f:parse_NUMBER },\n0x000F: { n:\"LABEL\", f:parse_LABEL },\n0x0010: { n:\"FORMULA\", f:parse_FORMULA },\n0x0018: { n:\"TABLE\" },\n0x0019: { n:\"ORANGE\" },\n0x001A: { n:\"PRANGE\" },\n0x001B: { n:\"SRANGE\" },\n0x001C: { n:\"FRANGE\" },\n0x001D: { n:\"KRANGE1\" },\n0x0020: { n:\"HRANGE\" },\n0x0023: { n:\"KRANGE2\" },\n0x0024: { n:\"PROTEC\" },\n0x0025: { n:\"FOOTER\" },\n0x0026: { n:\"HEADER\" },\n0x0027: { n:\"SETUP\" },\n0x0028: { n:\"MARGINS\" },\n0x0029: { n:\"LABELFMT\" },\n0x002A: { n:\"TITLES\" },\n0x002B: { n:\"SHEETJS\" },\n0x002D: { n:\"GRAPH\" },\n0x002E: { n:\"NGRAPH\" },\n0x002F: { n:\"CALCCOUNT\" },\n0x0030: { n:\"UNFORMATTED\" },\n0x0031: { n:\"CURSORW12\" },\n0x0032: { n:\"WINDOW\" },\n0x0033: { n:\"STRING\", f:parse_LABEL },\n0x0037: { n:\"PASSWORD\" },\n0x0038: { n:\"LOCKED\" },\n0x003C: { n:\"QUERY\" },\n0x003D: { n:\"QUERYNAME\" },\n0x003E: { n:\"PRINT\" },\n0x003F: { n:\"PRINTNAME\" },\n0x0040: { n:\"GRAPH2\" },\n0x0041: { n:\"GRAPHNAME\" },\n0x0042: { n:\"ZOOM\" },\n0x0043: { n:\"SYMSPLIT\" },\n0x0044: { n:\"NSROWS\" },\n0x0045: { n:\"NSCOLS\" },\n0x0046: { n:\"RULER\" },\n0x0047: { n:\"NNAME\" },\n0x0048: { n:\"ACOMM\" },\n0x0049: { n:\"AMACRO\" },\n0x004A: { n:\"PARSE\" },\n0x0066: { n:\"PRANGES??\" },\n0x0067: { n:\"RRANGES??\" },\n0x0068: { n:\"FNAME??\" },\n0x0069: { n:\"MRANGES??\" },\n0x00CC: { n:\"SHEETNAMECS\", f:parse_SHEETNAMECS },\n0x00DE: { n:\"SHEETNAMELP\", f:parse_SHEETNAMELP },\n0xFFFF: { n:\"\" }\n\t};\n\n\tvar WK3Enum = {\n0x0000: { n:\"BOF\" },\n0x0001: { n:\"EOF\" },\n0x0002: { n:\"PASSWORD\" },\n0x0003: { n:\"CALCSET\" },\n0x0004: { n:\"WINDOWSET\" },\n0x0005: { n:\"SHEETCELLPTR\" },\n0x0006: { n:\"SHEETLAYOUT\" },\n0x0007: { n:\"COLUMNWIDTH\" },\n0x0008: { n:\"HIDDENCOLUMN\" },\n0x0009: { n:\"USERRANGE\" },\n0x000A: { n:\"SYSTEMRANGE\" },\n0x000B: { n:\"ZEROFORCE\" },\n0x000C: { n:\"SORTKEYDIR\" },\n0x000D: { n:\"FILESEAL\" },\n0x000E: { n:\"DATAFILLNUMS\" },\n0x000F: { n:\"PRINTMAIN\" },\n0x0010: { n:\"PRINTSTRING\" },\n0x0011: { n:\"GRAPHMAIN\" },\n0x0012: { n:\"GRAPHSTRING\" },\n0x0013: { n:\"??\" },\n0x0014: { n:\"ERRCELL\" },\n0x0015: { n:\"NACELL\" },\n0x0016: { n:\"LABEL16\", f:parse_LABEL_16},\n0x0017: { n:\"NUMBER17\", f:parse_NUMBER_17 },\n0x0018: { n:\"NUMBER18\", f:parse_NUMBER_18 },\n0x0019: { n:\"FORMULA19\", f:parse_FORMULA_19},\n0x001A: { n:\"FORMULA1A\" },\n0x001B: { n:\"XFORMAT\", f:parse_XFORMAT },\n0x001C: { n:\"DTLABELMISC\" },\n0x001D: { n:\"DTLABELCELL\" },\n0x001E: { n:\"GRAPHWINDOW\" },\n0x001F: { n:\"CPA\" },\n0x0020: { n:\"LPLAUTO\" },\n0x0021: { n:\"QUERY\" },\n0x0022: { n:\"HIDDENSHEET\" },\n0x0023: { n:\"??\" },\n0x0025: { n:\"NUMBER25\", f:parse_NUMBER_25 },\n0x0026: { n:\"??\" },\n0x0027: { n:\"NUMBER27\", f:parse_NUMBER_27 },\n0x0028: { n:\"FORMULA28\", f:parse_FORMULA_28 },\n0x008E: { n:\"??\" },\n0x0093: { n:\"??\" },\n0x0096: { n:\"??\" },\n0x0097: { n:\"??\" },\n0x0098: { n:\"??\" },\n0x0099: { n:\"??\" },\n0x009A: { n:\"??\" },\n0x009B: { n:\"??\" },\n0x009C: { n:\"??\" },\n0x00A3: { n:\"??\" },\n0x00AE: { n:\"??\" },\n0x00AF: { n:\"??\" },\n0x00B0: { n:\"??\" },\n0x00B1: { n:\"??\" },\n0x00B8: { n:\"??\" },\n0x00B9: { n:\"??\" },\n0x00BA: { n:\"??\" },\n0x00BB: { n:\"??\" },\n0x00BC: { n:\"??\" },\n0x00C3: { n:\"??\" },\n0x00C9: { n:\"??\" },\n0x00CC: { n:\"SHEETNAMECS\", f:parse_SHEETNAMECS },\n0x00CD: { n:\"??\" },\n0x00CE: { n:\"??\" },\n0x00CF: { n:\"??\" },\n0x00D0: { n:\"??\" },\n0x0100: { n:\"??\" },\n0x0103: { n:\"??\" },\n0x0104: { n:\"??\" },\n0x0105: { n:\"??\" },\n0x0106: { n:\"??\" },\n0x0107: { n:\"??\" },\n0x0109: { n:\"??\" },\n0x010A: { n:\"??\" },\n0x010B: { n:\"??\" },\n0x010C: { n:\"??\" },\n0x010E: { n:\"??\" },\n0x010F: { n:\"??\" },\n0x0180: { n:\"??\" },\n0x0185: { n:\"??\" },\n0x0186: { n:\"??\" },\n0x0189: { n:\"??\" },\n0x018C: { n:\"??\" },\n0x0200: { n:\"??\" },\n0x0202: { n:\"??\" },\n0x0201: { n:\"??\" },\n0x0204: { n:\"??\" },\n0x0205: { n:\"??\" },\n0x0280: { n:\"??\" },\n0x0281: { n:\"??\" },\n0x0282: { n:\"??\" },\n0x0283: { n:\"??\" },\n0x0284: { n:\"??\" },\n0x0285: { n:\"??\" },\n0x0286: { n:\"??\" },\n0x0287: { n:\"??\" },\n0x0288: { n:\"??\" },\n0x0292: { n:\"??\" },\n0x0293: { n:\"??\" },\n0x0294: { n:\"??\" },\n0x0295: { n:\"??\" },\n0x0296: { n:\"??\" },\n0x0299: { n:\"??\" },\n0x029A: { n:\"??\" },\n0x0300: { n:\"??\" },\n0x0304: { n:\"??\" },\n0x0601: { n:\"SHEETINFOQP\", f:parse_SHEETINFOQP },\n0x0640: { n:\"??\" },\n0x0642: { n:\"??\" },\n0x0701: { n:\"??\" },\n0x0702: { n:\"??\" },\n0x0703: { n:\"??\" },\n0x0704: { n:\"??\" },\n0x0780: { n:\"??\" },\n0x0800: { n:\"??\" },\n0x0801: { n:\"??\" },\n0x0804: { n:\"??\" },\n0x0A80: { n:\"??\" },\n0x2AF6: { n:\"??\" },\n0x3231: { n:\"??\" },\n0x6E49: { n:\"??\" },\n0x6F44: { n:\"??\" },\n0xFFFF: { n:\"\" }\n\t};\n\treturn {\n\t\tsheet_to_wk1: sheet_to_wk1,\n\t\tbook_to_wk3: book_to_wk3,\n\t\tto_workbook: lotus_to_workbook\n\t};\n})();\n/* 18.4.7 rPr CT_RPrElt */\nfunction parse_rpr(rpr) {\n\tvar font = {}, m = rpr.match(tagregex), i = 0;\n\tvar pass = false;\n\tif(m) for(;i!=m.length; ++i) {\n\t\tvar y = parsexmltag(m[i]);\n\t\tswitch(y[0].replace(/\\w*:/g,\"\")) {\n\t\t\t/* 18.8.12 condense CT_BooleanProperty */\n\t\t\t/* ** not required . */\n\t\t\tcase '':\n\t\t\tcase '': font.shadow = 1; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.4.1 charset CT_IntProperty TODO */\n\t\t\tcase '':\n\t\t\tcase '': font.outline = 1; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.4.5 rFont CT_FontName */\n\t\t\tcase '':\n\t\t\tcase '': font.strike = 1; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.4.13 u CT_UnderlineProperty */\n\t\t\tcase '':\n\t\t\tcase '': font.u = 1; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.2 b */\n\t\t\tcase '':\n\t\t\tcase '': font.b = 1; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.26 i */\n\t\t\tcase '':\n\t\t\tcase '': font.i = 1; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.3.1.15 color CT_Color TODO: tint, theme, auto, indexed */\n\t\t\tcase '': case '
': break;\n\t\t\tcase '': pass = false; break;\n\t\t\tdefault:\n\t\t\t\tif(y[0].charCodeAt(1) !== 47 && !pass) throw new Error('Unrecognized rich format ' + y[0]);\n\t\t}\n\t}\n\treturn font;\n}\n\nvar parse_rs = (function() {\n\tvar tregex = matchtag(\"t\"), rpregex = matchtag(\"rPr\");\n\t/* 18.4.4 r CT_RElt */\n\tfunction parse_r(r) {\n\t\t/* 18.4.12 t ST_Xstring */\n\t\tvar t = r.match(tregex)/*, cp = 65001*/;\n\t\tif(!t) return {t:\"s\", v:\"\"};\n\n\t\tvar o = ({t:'s', v:unescapexml(t[1])});\n\t\tvar rpr = r.match(rpregex);\n\t\tif(rpr) o.s = parse_rpr(rpr[1]);\n\t\treturn o;\n\t}\n\tvar rregex = /<(?:\\w+:)?r>/g, rend = /<\\/(?:\\w+:)?r>/;\n\treturn function parse_rs(rs) {\n\t\treturn rs.replace(rregex,\"\").split(rend).map(parse_r).filter(function(r) { return r.v; });\n\t};\n})();\n\n\n/* Parse a list of tags */\nvar rs_to_html = (function parse_rs_factory() {\n\tvar nlregex = /(\\r\\n|\\n)/g;\n\tfunction parse_rpr2(font, intro, outro) {\n\t\tvar style = [];\n\n\t\tif(font.u) style.push(\"text-decoration: underline;\");\n\t\tif(font.uval) style.push(\"text-underline-style:\" + font.uval + \";\");\n\t\tif(font.sz) style.push(\"font-size:\" + font.sz + \"pt;\");\n\t\tif(font.outline) style.push(\"text-effect: outline;\");\n\t\tif(font.shadow) style.push(\"text-shadow: auto;\");\n\t\tintro.push('');\n\n\t\tif(font.b) { intro.push(\"\"); outro.push(\"\"); }\n\t\tif(font.i) { intro.push(\"\"); outro.push(\"\"); }\n\t\tif(font.strike) { intro.push(\"\"); outro.push(\"\"); }\n\n\t\tvar align = font.valign || \"\";\n\t\tif(align == \"superscript\" || align == \"super\") align = \"sup\";\n\t\telse if(align == \"subscript\") align = \"sub\";\n\t\tif(align != \"\") { intro.push(\"<\" + align + \">\"); outro.push(\"\"); }\n\n\t\toutro.push(\"\");\n\t\treturn font;\n\t}\n\n\t/* 18.4.4 r CT_RElt */\n\tfunction r_to_html(r) {\n\t\tvar terms = [[],r.v,[]];\n\t\tif(!r.v) return \"\";\n\n\t\tif(r.s) parse_rpr2(r.s, terms[0], terms[2]);\n\n\t\treturn terms[0].join(\"\") + terms[1].replace(nlregex,'
') + terms[2].join(\"\");\n\t}\n\n\treturn function parse_rs(rs) {\n\t\treturn rs.map(r_to_html).join(\"\");\n\t};\n})();\n\n/* 18.4.8 si CT_Rst */\nvar sitregex = /<(?:\\w+:)?t[^>]*>([^<]*)<\\/(?:\\w+:)?t>/g, sirregex = /<(?:\\w+:)?r>/;\nvar sirphregex = /<(?:\\w+:)?rPh.*?>([\\s\\S]*?)<\\/(?:\\w+:)?rPh>/g;\nfunction parse_si(x, opts) {\n\tvar html = opts ? opts.cellHTML : true;\n\tvar z = {};\n\tif(!x) return { t: \"\" };\n\t//var y;\n\t/* 18.4.12 t ST_Xstring (Plaintext String) */\n\t// TODO: is whitespace actually valid here?\n\tif(x.match(/^\\s*<(?:\\w+:)?t[^>]*>/)) {\n\t\tz.t = unescapexml(utf8read(x.slice(x.indexOf(\">\")+1).split(/<\\/(?:\\w+:)?t>/)[0]||\"\"));\n\t\tz.r = utf8read(x);\n\t\tif(html) z.h = escapehtml(z.t);\n\t}\n\t/* 18.4.4 r CT_RElt (Rich Text Run) */\n\telse if((/*y = */x.match(sirregex))) {\n\t\tz.r = utf8read(x);\n\t\tz.t = unescapexml(utf8read((x.replace(sirphregex, '').match(sitregex)||[]).join(\"\").replace(tagregex,\"\")));\n\t\tif(html) z.h = rs_to_html(parse_rs(z.r));\n\t}\n\t/* 18.4.3 phoneticPr CT_PhoneticPr (TODO: needed for Asian support) */\n\t/* 18.4.6 rPh CT_PhoneticRun (TODO: needed for Asian support) */\n\treturn z;\n}\n\n/* 18.4 Shared String Table */\nvar sstr0 = /<(?:\\w+:)?sst([^>]*)>([\\s\\S]*)<\\/(?:\\w+:)?sst>/;\nvar sstr1 = /<(?:\\w+:)?(?:si|sstItem)>/g;\nvar sstr2 = /<\\/(?:\\w+:)?(?:si|sstItem)>/;\nfunction parse_sst_xml(data, opts) {\n\tvar s = ([]), ss = \"\";\n\tif(!data) return s;\n\t/* 18.4.9 sst CT_Sst */\n\tvar sst = data.match(sstr0);\n\tif(sst) {\n\t\tss = sst[2].replace(sstr1,\"\").split(sstr2);\n\t\tfor(var i = 0; i != ss.length; ++i) {\n\t\t\tvar o = parse_si(ss[i].trim(), opts);\n\t\t\tif(o != null) s[s.length] = o;\n\t\t}\n\t\tsst = parsexmltag(sst[1]); s.Count = sst.count; s.Unique = sst.uniqueCount;\n\t}\n\treturn s;\n}\n\nRELS.SST = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\";\nvar straywsregex = /^\\s|\\s$|[\\t\\n\\r]/;\nfunction write_sst_xml(sst, opts) {\n\tif(!opts.bookSST) return \"\";\n\tvar o = [XML_HEADER];\n\to[o.length] = (writextag('sst', null, {\n\t\txmlns: XMLNS.main[0],\n\t\tcount: sst.Count,\n\t\tuniqueCount: sst.Unique\n\t}));\n\tfor(var i = 0; i != sst.length; ++i) { if(sst[i] == null) continue;\n\t\tvar s = sst[i];\n\t\tvar sitag = \"\";\n\t\tif(s.r) sitag += s.r;\n\t\telse {\n\t\t\tsitag += \"\" + escapexml(s.t) + \"\";\n\t\t}\n\t\tsitag += \"\";\n\t\to[o.length] = (sitag);\n\t}\n\tif(o.length>2){ o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* [MS-XLSB] 2.4.221 BrtBeginSst */\nfunction parse_BrtBeginSst(data) {\n\treturn [data.read_shift(4), data.read_shift(4)];\n}\n\n/* [MS-XLSB] 2.1.7.45 Shared Strings */\nfunction parse_sst_bin(data, opts) {\n\tvar s = ([]);\n\tvar pass = false;\n\trecordhopper(data, function hopper_sst(val, R_n, RT) {\n\t\tswitch(RT) {\n\t\t\tcase 0x009F: /* 'BrtBeginSst' */\n\t\t\t\ts.Count = val[0]; s.Unique = val[1]; break;\n\t\t\tcase 0x0013: /* 'BrtSSTItem' */\n\t\t\t\ts.push(val); break;\n\t\t\tcase 0x00A0: /* 'BrtEndSst' */\n\t\t\t\treturn true;\n\n\t\t\tcase 0x0023: /* 'BrtFRTBegin' */\n\t\t\t\tpass = true; break;\n\t\t\tcase 0x0024: /* 'BrtFRTEnd' */\n\t\t\t\tpass = false; break;\n\n\t\t\tdefault:\n\t\t\t\tif(R_n.indexOf(\"Begin\") > 0){/* empty */}\n\t\t\t\telse if(R_n.indexOf(\"End\") > 0){/* empty */}\n\t\t\t\tif(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R_n);\n\t\t}\n\t});\n\treturn s;\n}\n\nfunction write_BrtBeginSst(sst, o) {\n\tif(!o) o = new_buf(8);\n\to.write_shift(4, sst.Count);\n\to.write_shift(4, sst.Unique);\n\treturn o;\n}\n\nvar write_BrtSSTItem = write_RichStr;\n\nfunction write_sst_bin(sst) {\n\tvar ba = buf_array();\n\twrite_record(ba, \"BrtBeginSst\", write_BrtBeginSst(sst));\n\tfor(var i = 0; i < sst.length; ++i) write_record(ba, \"BrtSSTItem\", write_BrtSSTItem(sst[i]));\n\t/* FRTSST */\n\twrite_record(ba, \"BrtEndSst\");\n\treturn ba.end();\n}\nfunction _JS2ANSI(str) {\n\tif(typeof cptable !== 'undefined') return cptable.utils.encode(current_ansi, str);\n\tvar o = [], oo = str.split(\"\");\n\tfor(var i = 0; i < oo.length; ++i) o[i] = oo[i].charCodeAt(0);\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.1.4 Version */\nfunction parse_CRYPTOVersion(blob, length) {\n\tvar o = {};\n\to.Major = blob.read_shift(2);\n\to.Minor = blob.read_shift(2);\nif(length >= 4) blob.l += length - 4;\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.1.5 DataSpaceVersionInfo */\nfunction parse_DataSpaceVersionInfo(blob) {\n\tvar o = {};\n\to.id = blob.read_shift(0, 'lpp4');\n\to.R = parse_CRYPTOVersion(blob, 4);\n\to.U = parse_CRYPTOVersion(blob, 4);\n\to.W = parse_CRYPTOVersion(blob, 4);\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.1.6.1 DataSpaceMapEntry Structure */\nfunction parse_DataSpaceMapEntry(blob) {\n\tvar len = blob.read_shift(4);\n\tvar end = blob.l + len - 4;\n\tvar o = {};\n\tvar cnt = blob.read_shift(4);\n\tvar comps = [];\n\t/* [MS-OFFCRYPTO] 2.1.6.2 DataSpaceReferenceComponent Structure */\n\twhile(cnt-- > 0) comps.push({ t: blob.read_shift(4), v: blob.read_shift(0, 'lpp4') });\n\to.name = blob.read_shift(0, 'lpp4');\n\to.comps = comps;\n\tif(blob.l != end) throw new Error(\"Bad DataSpaceMapEntry: \" + blob.l + \" != \" + end);\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.1.6 DataSpaceMap */\nfunction parse_DataSpaceMap(blob) {\n\tvar o = [];\n\tblob.l += 4; // must be 0x8\n\tvar cnt = blob.read_shift(4);\n\twhile(cnt-- > 0) o.push(parse_DataSpaceMapEntry(blob));\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.1.7 DataSpaceDefinition */\nfunction parse_DataSpaceDefinition(blob) {\n\tvar o = [];\n\tblob.l += 4; // must be 0x8\n\tvar cnt = blob.read_shift(4);\n\twhile(cnt-- > 0) o.push(blob.read_shift(0, 'lpp4'));\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.1.8 DataSpaceDefinition */\nfunction parse_TransformInfoHeader(blob) {\n\tvar o = {};\n\t/*var len = */blob.read_shift(4);\n\tblob.l += 4; // must be 0x1\n\to.id = blob.read_shift(0, 'lpp4');\n\to.name = blob.read_shift(0, 'lpp4');\n\to.R = parse_CRYPTOVersion(blob, 4);\n\to.U = parse_CRYPTOVersion(blob, 4);\n\to.W = parse_CRYPTOVersion(blob, 4);\n\treturn o;\n}\n\nfunction parse_Primary(blob) {\n\t/* [MS-OFFCRYPTO] 2.2.6 IRMDSTransformInfo */\n\tvar hdr = parse_TransformInfoHeader(blob);\n\t/* [MS-OFFCRYPTO] 2.1.9 EncryptionTransformInfo */\n\thdr.ename = blob.read_shift(0, '8lpp4');\n\thdr.blksz = blob.read_shift(4);\n\thdr.cmode = blob.read_shift(4);\n\tif(blob.read_shift(4) != 0x04) throw new Error(\"Bad !Primary record\");\n\treturn hdr;\n}\n\n/* [MS-OFFCRYPTO] 2.3.2 Encryption Header */\nfunction parse_EncryptionHeader(blob, length) {\n\tvar tgt = blob.l + length;\n\tvar o = {};\n\to.Flags = (blob.read_shift(4) & 0x3F);\n\tblob.l += 4;\n\to.AlgID = blob.read_shift(4);\n\tvar valid = false;\n\tswitch(o.AlgID) {\n\t\tcase 0x660E: case 0x660F: case 0x6610: valid = (o.Flags == 0x24); break;\n\t\tcase 0x6801: valid = (o.Flags == 0x04); break;\n\t\tcase 0: valid = (o.Flags == 0x10 || o.Flags == 0x04 || o.Flags == 0x24); break;\n\t\tdefault: throw 'Unrecognized encryption algorithm: ' + o.AlgID;\n\t}\n\tif(!valid) throw new Error(\"Encryption Flags/AlgID mismatch\");\n\to.AlgIDHash = blob.read_shift(4);\n\to.KeySize = blob.read_shift(4);\n\to.ProviderType = blob.read_shift(4);\n\tblob.l += 8;\n\to.CSPName = blob.read_shift((tgt-blob.l)>>1, 'utf16le');\n\tblob.l = tgt;\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.3.3 Encryption Verifier */\nfunction parse_EncryptionVerifier(blob, length) {\n\tvar o = {}, tgt = blob.l + length;\n\tblob.l += 4; // SaltSize must be 0x10\n\to.Salt = blob.slice(blob.l, blob.l+16); blob.l += 16;\n\to.Verifier = blob.slice(blob.l, blob.l+16); blob.l += 16;\n\t/*var sz = */blob.read_shift(4);\n\to.VerifierHash = blob.slice(blob.l, tgt); blob.l = tgt;\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.3.4.* EncryptionInfo Stream */\nfunction parse_EncryptionInfo(blob) {\n\tvar vers = parse_CRYPTOVersion(blob);\n\tswitch(vers.Minor) {\n\t\tcase 0x02: return [vers.Minor, parse_EncInfoStd(blob, vers)];\n\t\tcase 0x03: return [vers.Minor, parse_EncInfoExt(blob, vers)];\n\t\tcase 0x04: return [vers.Minor, parse_EncInfoAgl(blob, vers)];\n\t}\n\tthrow new Error(\"ECMA-376 Encrypted file unrecognized Version: \" + vers.Minor);\n}\n\n/* [MS-OFFCRYPTO] 2.3.4.5 EncryptionInfo Stream (Standard Encryption) */\nfunction parse_EncInfoStd(blob) {\n\tvar flags = blob.read_shift(4);\n\tif((flags & 0x3F) != 0x24) throw new Error(\"EncryptionInfo mismatch\");\n\tvar sz = blob.read_shift(4);\n\t//var tgt = blob.l + sz;\n\tvar hdr = parse_EncryptionHeader(blob, sz);\n\tvar verifier = parse_EncryptionVerifier(blob, blob.length - blob.l);\n\treturn { t:\"Std\", h:hdr, v:verifier };\n}\n/* [MS-OFFCRYPTO] 2.3.4.6 EncryptionInfo Stream (Extensible Encryption) */\nfunction parse_EncInfoExt() { throw new Error(\"File is password-protected: ECMA-376 Extensible\"); }\n/* [MS-OFFCRYPTO] 2.3.4.10 EncryptionInfo Stream (Agile Encryption) */\nfunction parse_EncInfoAgl(blob) {\n\tvar KeyData = [\"saltSize\",\"blockSize\",\"keyBits\",\"hashSize\",\"cipherAlgorithm\",\"cipherChaining\",\"hashAlgorithm\",\"saltValue\"];\n\tblob.l+=4;\n\tvar xml = blob.read_shift(blob.length - blob.l, 'utf8');\n\tvar o = {};\n\txml.replace(tagregex, function xml_agile(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': break;\n\t\t\tcase '': case '': break;\n\n\t\t\tcase '': break;\n\t\t\tcase ' 4 || vers.Major < 2) throw new Error('unrecognized major version code: ' + vers.Major);\n\to.Flags = blob.read_shift(4); length -= 4;\n\tvar sz = blob.read_shift(4); length -= 4;\n\to.EncryptionHeader = parse_EncryptionHeader(blob, sz); length -= sz;\n\to.EncryptionVerifier = parse_EncryptionVerifier(blob, length);\n\treturn o;\n}\n/* [MS-OFFCRYPTO] 2.3.6.1 RC4 Encryption Header */\nfunction parse_RC4Header(blob) {\n\tvar o = {};\n\tvar vers = o.EncryptionVersionInfo = parse_CRYPTOVersion(blob, 4);\n\tif(vers.Major != 1 || vers.Minor != 1) throw 'unrecognized version code ' + vers.Major + ' : ' + vers.Minor;\n\to.Salt = blob.read_shift(16);\n\to.EncryptedVerifier = blob.read_shift(16);\n\to.EncryptedVerifierHash = blob.read_shift(16);\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.3.7.1 Binary Document Password Verifier Derivation */\nfunction crypto_CreatePasswordVerifier_Method1(Password) {\n\tvar Verifier = 0x0000, PasswordArray;\n\tvar PasswordDecoded = _JS2ANSI(Password);\n\tvar len = PasswordDecoded.length + 1, i, PasswordByte;\n\tvar Intermediate1, Intermediate2, Intermediate3;\n\tPasswordArray = new_raw_buf(len);\n\tPasswordArray[0] = PasswordDecoded.length;\n\tfor(i = 1; i != len; ++i) PasswordArray[i] = PasswordDecoded[i-1];\n\tfor(i = len-1; i >= 0; --i) {\n\t\tPasswordByte = PasswordArray[i];\n\t\tIntermediate1 = ((Verifier & 0x4000) === 0x0000) ? 0 : 1;\n\t\tIntermediate2 = (Verifier << 1) & 0x7FFF;\n\t\tIntermediate3 = Intermediate1 | Intermediate2;\n\t\tVerifier = Intermediate3 ^ PasswordByte;\n\t}\n\treturn Verifier ^ 0xCE4B;\n}\n\n/* [MS-OFFCRYPTO] 2.3.7.2 Binary Document XOR Array Initialization */\nvar crypto_CreateXorArray_Method1 = (function() {\n\tvar PadArray = [0xBB, 0xFF, 0xFF, 0xBA, 0xFF, 0xFF, 0xB9, 0x80, 0x00, 0xBE, 0x0F, 0x00, 0xBF, 0x0F, 0x00];\n\tvar InitialCode = [0xE1F0, 0x1D0F, 0xCC9C, 0x84C0, 0x110C, 0x0E10, 0xF1CE, 0x313E, 0x1872, 0xE139, 0xD40F, 0x84F9, 0x280C, 0xA96A, 0x4EC3];\n\tvar XorMatrix = [0xAEFC, 0x4DD9, 0x9BB2, 0x2745, 0x4E8A, 0x9D14, 0x2A09, 0x7B61, 0xF6C2, 0xFDA5, 0xEB6B, 0xC6F7, 0x9DCF, 0x2BBF, 0x4563, 0x8AC6, 0x05AD, 0x0B5A, 0x16B4, 0x2D68, 0x5AD0, 0x0375, 0x06EA, 0x0DD4, 0x1BA8, 0x3750, 0x6EA0, 0xDD40, 0xD849, 0xA0B3, 0x5147, 0xA28E, 0x553D, 0xAA7A, 0x44D5, 0x6F45, 0xDE8A, 0xAD35, 0x4A4B, 0x9496, 0x390D, 0x721A, 0xEB23, 0xC667, 0x9CEF, 0x29FF, 0x53FE, 0xA7FC, 0x5FD9, 0x47D3, 0x8FA6, 0x0F6D, 0x1EDA, 0x3DB4, 0x7B68, 0xF6D0, 0xB861, 0x60E3, 0xC1C6, 0x93AD, 0x377B, 0x6EF6, 0xDDEC, 0x45A0, 0x8B40, 0x06A1, 0x0D42, 0x1A84, 0x3508, 0x6A10, 0xAA51, 0x4483, 0x8906, 0x022D, 0x045A, 0x08B4, 0x1168, 0x76B4, 0xED68, 0xCAF1, 0x85C3, 0x1BA7, 0x374E, 0x6E9C, 0x3730, 0x6E60, 0xDCC0, 0xA9A1, 0x4363, 0x86C6, 0x1DAD, 0x3331, 0x6662, 0xCCC4, 0x89A9, 0x0373, 0x06E6, 0x0DCC, 0x1021, 0x2042, 0x4084, 0x8108, 0x1231, 0x2462, 0x48C4];\n\tvar Ror = function(Byte) { return ((Byte/2) | (Byte*128)) & 0xFF; };\n\tvar XorRor = function(byte1, byte2) { return Ror(byte1 ^ byte2); };\n\tvar CreateXorKey_Method1 = function(Password) {\n\t\tvar XorKey = InitialCode[Password.length - 1];\n\t\tvar CurrentElement = 0x68;\n\t\tfor(var i = Password.length-1; i >= 0; --i) {\n\t\t\tvar Char = Password[i];\n\t\t\tfor(var j = 0; j != 7; ++j) {\n\t\t\t\tif(Char & 0x40) XorKey ^= XorMatrix[CurrentElement];\n\t\t\t\tChar *= 2; --CurrentElement;\n\t\t\t}\n\t\t}\n\t\treturn XorKey;\n\t};\n\treturn function(password) {\n\t\tvar Password = _JS2ANSI(password);\n\t\tvar XorKey = CreateXorKey_Method1(Password);\n\t\tvar Index = Password.length;\n\t\tvar ObfuscationArray = new_raw_buf(16);\n\t\tfor(var i = 0; i != 16; ++i) ObfuscationArray[i] = 0x00;\n\t\tvar Temp, PasswordLastChar, PadIndex;\n\t\tif((Index & 1) === 1) {\n\t\t\tTemp = XorKey >> 8;\n\t\t\tObfuscationArray[Index] = XorRor(PadArray[0], Temp);\n\t\t\t--Index;\n\t\t\tTemp = XorKey & 0xFF;\n\t\t\tPasswordLastChar = Password[Password.length - 1];\n\t\t\tObfuscationArray[Index] = XorRor(PasswordLastChar, Temp);\n\t\t}\n\t\twhile(Index > 0) {\n\t\t\t--Index;\n\t\t\tTemp = XorKey >> 8;\n\t\t\tObfuscationArray[Index] = XorRor(Password[Index], Temp);\n\t\t\t--Index;\n\t\t\tTemp = XorKey & 0xFF;\n\t\t\tObfuscationArray[Index] = XorRor(Password[Index], Temp);\n\t\t}\n\t\tIndex = 15;\n\t\tPadIndex = 15 - Password.length;\n\t\twhile(PadIndex > 0) {\n\t\t\tTemp = XorKey >> 8;\n\t\t\tObfuscationArray[Index] = XorRor(PadArray[PadIndex], Temp);\n\t\t\t--Index;\n\t\t\t--PadIndex;\n\t\t\tTemp = XorKey & 0xFF;\n\t\t\tObfuscationArray[Index] = XorRor(Password[Index], Temp);\n\t\t\t--Index;\n\t\t\t--PadIndex;\n\t\t}\n\t\treturn ObfuscationArray;\n\t};\n})();\n\n/* [MS-OFFCRYPTO] 2.3.7.3 Binary Document XOR Data Transformation Method 1 */\nvar crypto_DecryptData_Method1 = function(password, Data, XorArrayIndex, XorArray, O) {\n\t/* If XorArray is set, use it; if O is not set, make changes in-place */\n\tif(!O) O = Data;\n\tif(!XorArray) XorArray = crypto_CreateXorArray_Method1(password);\n\tvar Index, Value;\n\tfor(Index = 0; Index != Data.length; ++Index) {\n\t\tValue = Data[Index];\n\t\tValue ^= XorArray[XorArrayIndex];\n\t\tValue = ((Value>>5) | (Value<<3)) & 0xFF;\n\t\tO[Index] = Value;\n\t\t++XorArrayIndex;\n\t}\n\treturn [O, XorArrayIndex, XorArray];\n};\n\nvar crypto_MakeXorDecryptor = function(password) {\n\tvar XorArrayIndex = 0, XorArray = crypto_CreateXorArray_Method1(password);\n\treturn function(Data) {\n\t\tvar O = crypto_DecryptData_Method1(\"\", Data, XorArrayIndex, XorArray);\n\t\tXorArrayIndex = O[1];\n\t\treturn O[0];\n\t};\n};\n\n/* 2.5.343 */\nfunction parse_XORObfuscation(blob, length, opts, out) {\n\tvar o = ({ key: parseuint16(blob), verificationBytes: parseuint16(blob) });\n\tif(opts.password) o.verifier = crypto_CreatePasswordVerifier_Method1(opts.password);\n\tout.valid = o.verificationBytes === o.verifier;\n\tif(out.valid) out.insitu = crypto_MakeXorDecryptor(opts.password);\n\treturn o;\n}\n\n/* 2.4.117 */\nfunction parse_FilePassHeader(blob, length, oo) {\n\tvar o = oo || {}; o.Info = blob.read_shift(2); blob.l -= 2;\n\tif(o.Info === 1) o.Data = parse_RC4Header(blob, length);\n\telse o.Data = parse_RC4CryptoHeader(blob, length);\n\treturn o;\n}\nfunction parse_FilePass(blob, length, opts) {\n\tvar o = ({ Type: opts.biff >= 8 ? blob.read_shift(2) : 0 }); /* wEncryptionType */\n\tif(o.Type) parse_FilePassHeader(blob, length-2, o);\n\telse parse_XORObfuscation(blob, opts.biff >= 8 ? length : length - 2, opts, o);\n\treturn o;\n}\n\n\nvar RTF = (function() {\n\tfunction rtf_to_sheet(d, opts) {\n\t\tswitch(opts.type) {\n\t\t\tcase 'base64': return rtf_to_sheet_str(Base64.decode(d), opts);\n\t\t\tcase 'binary': return rtf_to_sheet_str(d, opts);\n\t\t\tcase 'buffer': return rtf_to_sheet_str(has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d), opts);\n\t\t\tcase 'array': return rtf_to_sheet_str(cc2str(d), opts);\n\t\t}\n\t\tthrow new Error(\"Unrecognized type \" + opts.type);\n\t}\n\n\t/* TODO: this is a stub */\n\tfunction rtf_to_sheet_str(str, opts) {\n\t\tvar o = opts || {};\n\t\tvar ws = o.dense ? ([]) : ({});\n\n\t\tvar rows = str.match(/\\\\trowd.*?\\\\row\\b/g);\n\t\tif(!rows.length) throw new Error(\"RTF missing table\");\n\t\tvar range = ({s: {c:0, r:0}, e: {c:0, r:rows.length - 1}});\n\t\trows.forEach(function(rowtf, R) {\n\t\t\tif(Array.isArray(ws)) ws[R] = [];\n\t\t\tvar rtfre = /\\\\\\w+\\b/g;\n\t\t\tvar last_index = 0;\n\t\t\tvar res;\n\t\t\tvar C = -1;\n\t\t\twhile((res = rtfre.exec(rowtf))) {\n\t\t\t\tswitch(res[0]) {\n\t\t\t\t\tcase \"\\\\cell\":\n\t\t\t\t\t\tvar data = rowtf.slice(last_index, rtfre.lastIndex - res[0].length);\n\t\t\t\t\t\tif(data[0] == \" \") data = data.slice(1);\n\t\t\t\t\t\t++C;\n\t\t\t\t\t\tif(data.length) {\n\t\t\t\t\t\t\t// TODO: value parsing, including codepage adjustments\n\t\t\t\t\t\t\tvar cell = {v: data, t:\"s\"};\n\t\t\t\t\t\t\tif(Array.isArray(ws)) ws[R][C] = cell;\n\t\t\t\t\t\t\telse ws[encode_cell({r:R, c:C})] = cell;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tlast_index = rtfre.lastIndex;\n\t\t\t}\n\t\t\tif(C > range.e.c) range.e.c = C;\n\t\t});\n\t\tws['!ref'] = encode_range(range);\n\t\treturn ws;\n\t}\n\n\tfunction rtf_to_workbook(d, opts) { return sheet_to_workbook(rtf_to_sheet(d, opts), opts); }\n\n\t/* TODO: this is a stub */\n\tfunction sheet_to_rtf(ws) {\n\t\tvar o = [\"{\\\\rtf1\\\\ansi\"];\n\t\tvar r = safe_decode_range(ws['!ref']), cell;\n\t\tvar dense = Array.isArray(ws);\n\t\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\t\to.push(\"\\\\trowd\\\\trautofit1\");\n\t\t\tfor(var C = r.s.c; C <= r.e.c; ++C) o.push(\"\\\\cellx\" + (C+1));\n\t\t\to.push(\"\\\\pard\\\\intbl\");\n\t\t\tfor(C = r.s.c; C <= r.e.c; ++C) {\n\t\t\t\tvar coord = encode_cell({r:R,c:C});\n\t\t\t\tcell = dense ? (ws[R]||[])[C]: ws[coord];\n\t\t\t\tif(!cell || cell.v == null && (!cell.f || cell.F)) continue;\n\t\t\t\to.push(\" \" + (cell.w || (format_cell(cell), cell.w)));\n\t\t\t\to.push(\"\\\\cell\");\n\t\t\t}\n\t\t\to.push(\"\\\\pard\\\\intbl\\\\row\");\n\t\t}\n\t\treturn o.join(\"\") + \"}\";\n\t}\n\n\treturn {\n\t\tto_workbook: rtf_to_workbook,\n\t\tto_sheet: rtf_to_sheet,\n\t\tfrom_sheet: sheet_to_rtf\n\t};\n})();\nfunction hex2RGB(h) {\n\tvar o = h.slice(h[0]===\"#\"?1:0).slice(0,6);\n\treturn [parseInt(o.slice(0,2),16),parseInt(o.slice(2,4),16),parseInt(o.slice(4,6),16)];\n}\nfunction rgb2Hex(rgb) {\n\tfor(var i=0,o=1; i!=3; ++i) o = o*256 + (rgb[i]>255?255:rgb[i]<0?0:rgb[i]);\n\treturn o.toString(16).toUpperCase().slice(1);\n}\n\nfunction rgb2HSL(rgb) {\n\tvar R = rgb[0]/255, G = rgb[1]/255, B=rgb[2]/255;\n\tvar M = Math.max(R, G, B), m = Math.min(R, G, B), C = M - m;\n\tif(C === 0) return [0, 0, R];\n\n\tvar H6 = 0, S = 0, L2 = (M + m);\n\tS = C / (L2 > 1 ? 2 - L2 : L2);\n\tswitch(M){\n\t\tcase R: H6 = ((G - B) / C + 6)%6; break;\n\t\tcase G: H6 = ((B - R) / C + 2); break;\n\t\tcase B: H6 = ((R - G) / C + 4); break;\n\t}\n\treturn [H6 / 6, S, L2 / 2];\n}\n\nfunction hsl2RGB(hsl){\n\tvar H = hsl[0], S = hsl[1], L = hsl[2];\n\tvar C = S * 2 * (L < 0.5 ? L : 1 - L), m = L - C/2;\n\tvar rgb = [m,m,m], h6 = 6*H;\n\n\tvar X;\n\tif(S !== 0) switch(h6|0) {\n\t\tcase 0: case 6: X = C * h6; rgb[0] += C; rgb[1] += X; break;\n\t\tcase 1: X = C * (2 - h6); rgb[0] += X; rgb[1] += C; break;\n\t\tcase 2: X = C * (h6 - 2); rgb[1] += C; rgb[2] += X; break;\n\t\tcase 3: X = C * (4 - h6); rgb[1] += X; rgb[2] += C; break;\n\t\tcase 4: X = C * (h6 - 4); rgb[2] += C; rgb[0] += X; break;\n\t\tcase 5: X = C * (6 - h6); rgb[2] += X; rgb[0] += C; break;\n\t}\n\tfor(var i = 0; i != 3; ++i) rgb[i] = Math.round(rgb[i]*255);\n\treturn rgb;\n}\n\n/* 18.8.3 bgColor tint algorithm */\nfunction rgb_tint(hex, tint) {\n\tif(tint === 0) return hex;\n\tvar hsl = rgb2HSL(hex2RGB(hex));\n\tif (tint < 0) hsl[2] = hsl[2] * (1 + tint);\n\telse hsl[2] = 1 - (1 - hsl[2]) * (1 - tint);\n\treturn rgb2Hex(hsl2RGB(hsl));\n}\n\n/* 18.3.1.13 width calculations */\n/* [MS-OI29500] 2.1.595 Column Width & Formatting */\nvar DEF_MDW = 6, MAX_MDW = 15, MIN_MDW = 1, MDW = DEF_MDW;\nfunction width2px(width) { return Math.floor(( width + (Math.round(128/MDW))/256 )* MDW ); }\nfunction px2char(px) { return (Math.floor((px - 5)/MDW * 100 + 0.5))/100; }\nfunction char2width(chr) { return (Math.round((chr * MDW + 5)/MDW*256))/256; }\n//function px2char_(px) { return (((px - 5)/MDW * 100 + 0.5))/100; }\n//function char2width_(chr) { return (((chr * MDW + 5)/MDW*256))/256; }\nfunction cycle_width(collw) { return char2width(px2char(width2px(collw))); }\n/* XLSX/XLSB/XLS specify width in units of MDW */\nfunction find_mdw_colw(collw) {\n\tvar delta = Math.abs(collw - cycle_width(collw)), _MDW = MDW;\n\tif(delta > 0.005) for(MDW=MIN_MDW; MDW 0.5) guess--;\n\t\tif(Math.abs(guess) < delta) { delta = Math.abs(guess); _MDW = MDW; }\n\t}\n\tMDW = _MDW;\n}*/\n\nfunction process_col(coll) {\n\tif(coll.width) {\n\t\tcoll.wpx = width2px(coll.width);\n\t\tcoll.wch = px2char(coll.wpx);\n\t\tcoll.MDW = MDW;\n\t} else if(coll.wpx) {\n\t\tcoll.wch = px2char(coll.wpx);\n\t\tcoll.width = char2width(coll.wch);\n\t\tcoll.MDW = MDW;\n\t} else if(typeof coll.wch == 'number') {\n\t\tcoll.width = char2width(coll.wch);\n\t\tcoll.wpx = width2px(coll.width);\n\t\tcoll.MDW = MDW;\n\t}\n\tif(coll.customWidth) delete coll.customWidth;\n}\n\nvar DEF_PPI = 96, PPI = DEF_PPI;\nfunction px2pt(px) { return px * 96 / PPI; }\nfunction pt2px(pt) { return pt * PPI / 96; }\n\n/* [MS-EXSPXML3] 2.4.54 ST_enmPattern */\nvar XLMLPatternTypeMap = {\n\t\"None\": \"none\",\n\t\"Solid\": \"solid\",\n\t\"Gray50\": \"mediumGray\",\n\t\"Gray75\": \"darkGray\",\n\t\"Gray25\": \"lightGray\",\n\t\"HorzStripe\": \"darkHorizontal\",\n\t\"VertStripe\": \"darkVertical\",\n\t\"ReverseDiagStripe\": \"darkDown\",\n\t\"DiagStripe\": \"darkUp\",\n\t\"DiagCross\": \"darkGrid\",\n\t\"ThickDiagCross\": \"darkTrellis\",\n\t\"ThinHorzStripe\": \"lightHorizontal\",\n\t\"ThinVertStripe\": \"lightVertical\",\n\t\"ThinReverseDiagStripe\": \"lightDown\",\n\t\"ThinHorzCross\": \"lightGrid\"\n};\n\n/* 18.8.5 borders CT_Borders */\nfunction parse_borders(t, styles, themes, opts) {\n\tstyles.Borders = [];\n\tvar border = {};\n\tvar pass = false;\n\t(t[0].match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.4 border CT_Border */\n\t\t\tcase '': case '':\n\t\t\t\tborder = {};\n\t\t\t\tif(y.diagonalUp) border.diagonalUp = parsexmlbool(y.diagonalUp);\n\t\t\t\tif(y.diagonalDown) border.diagonalDown = parsexmlbool(y.diagonalDown);\n\t\t\t\tstyles.Borders.push(border);\n\t\t\t\tbreak;\n\t\t\tcase '': break;\n\n\t\t\t/* note: not in spec, appears to be CT_BorderPr */\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* note: not in spec, appears to be CT_BorderPr */\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.43 top CT_BorderPr */\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.6 bottom CT_BorderPr */\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.13 diagonal CT_BorderPr */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.25 horizontal CT_BorderPr */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.44 vertical CT_BorderPr */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.37 start CT_BorderPr */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.16 end CT_BorderPr */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.? color CT_Color */\n\t\t\tcase '':\n\t\t\t\tbreak;\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.2.10 extLst CT_ExtensionList ? */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': pass = false; break;\n\t\t\tdefault: if(opts && opts.WTF) {\n\t\t\t\tif(!pass) throw new Error('unrecognized ' + y[0] + ' in borders');\n\t\t\t}\n\t\t}\n\t});\n}\n\n/* 18.8.21 fills CT_Fills */\nfunction parse_fills(t, styles, themes, opts) {\n\tstyles.Fills = [];\n\tvar fill = {};\n\tvar pass = false;\n\t(t[0].match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.20 fill CT_Fill */\n\t\t\tcase '': case '':\n\t\t\t\tfill = {}; styles.Fills.push(fill); break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.24 gradientFill CT_GradientFill */\n\t\t\tcase '': break;\n\t\t\tcase '': styles.Fills.push(fill); fill = {}; break;\n\n\t\t\t/* 18.8.32 patternFill CT_PatternFill */\n\t\t\tcase '':\n\t\t\t\tif(y.patternType) fill.patternType = y.patternType;\n\t\t\t\tbreak;\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.3 bgColor CT_Color */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.19 fgColor CT_Color */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.38 stop CT_GradientStop */\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.? color CT_Color */\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.10 extLst CT_ExtensionList ? */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': pass = false; break;\n\t\t\tdefault: if(opts && opts.WTF) {\n\t\t\t\tif(!pass) throw new Error('unrecognized ' + y[0] + ' in fills');\n\t\t\t}\n\t\t}\n\t});\n}\n\n/* 18.8.23 fonts CT_Fonts */\nfunction parse_fonts(t, styles, themes, opts) {\n\tstyles.Fonts = [];\n\tvar font = {};\n\tvar pass = false;\n\t(t[0].match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.22 font CT_Font */\n\t\t\tcase '': break;\n\t\t\tcase '
': case '':\n\t\t\t\tstyles.Fonts.push(font);\n\t\t\t\tfont = {};\n\t\t\t\tbreak;\n\n\t\t\t/* 18.8.29 name CT_FontName */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.2 b CT_BooleanProperty */\n\t\t\tcase '': font.bold = 1; break;\n\n\t\t\t/* 18.8.26 i CT_BooleanProperty */\n\t\t\tcase '': font.italic = 1; break;\n\n\t\t\t/* 18.4.13 u CT_UnderlineProperty */\n\t\t\tcase '': font.underline = 1; break;\n\n\t\t\t/* 18.4.10 strike CT_BooleanProperty */\n\t\t\tcase '': font.strike = 1; break;\n\n\t\t\t/* 18.4.2 outline CT_BooleanProperty */\n\t\t\tcase '': font.outline = 1; break;\n\n\t\t\t/* 18.8.36 shadow CT_BooleanProperty */\n\t\t\tcase '': font.shadow = 1; break;\n\n\t\t\t/* 18.8.12 condense CT_BooleanProperty */\n\t\t\tcase '': font.condense = 1; break;\n\n\t\t\t/* 18.8.17 extend CT_BooleanProperty */\n\t\t\tcase '': font.extend = 1; break;\n\n\t\t\t/* 18.4.11 sz CT_FontSize */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.4.14 vertAlign CT_VerticalAlignFontProperty */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.18 family CT_FontFamily */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.35 scheme CT_FontScheme */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.4.1 charset CT_IntProperty */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* note: sometimes mc:AlternateContent appears bare */\n\t\t\tcase '': pass = false; break;\n\n\t\t\t/* 18.2.10 extLst CT_ExtensionList ? */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': pass = false; break;\n\t\t\tdefault: if(opts && opts.WTF) {\n\t\t\t\tif(!pass) throw new Error('unrecognized ' + y[0] + ' in fonts');\n\t\t\t}\n\t\t}\n\t});\n}\n\n/* 18.8.31 numFmts CT_NumFmts */\nfunction parse_numFmts(t, styles, opts) {\n\tstyles.NumberFmt = [];\n\tvar k/*Array*/ = (keys(SSF._table));\n\tfor(var i=0; i < k.length; ++i) styles.NumberFmt[k[i]] = SSF._table[k[i]];\n\tvar m = t[0].match(tagregex);\n\tif(!m) return;\n\tfor(i=0; i < m.length; ++i) {\n\t\tvar y = parsexmltag(m[i]);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': case '': case '': break;\n\t\t\tcase '0) {\n\t\t\t\t\tif(j > 0x188) {\n\t\t\t\t\t\tfor(j = 0x188; j > 0x3c; --j) if(styles.NumberFmt[j] == null) break;\n\t\t\t\t\t\tstyles.NumberFmt[j] = f;\n\t\t\t\t\t}\n\t\t\t\t\tSSF.load(f,j);\n\t\t\t\t}\n\t\t\t} break;\n\t\t\tcase '': break;\n\t\t\tdefault: if(opts.WTF) throw new Error('unrecognized ' + y[0] + ' in numFmts');\n\t\t}\n\t}\n}\n\nfunction write_numFmts(NF) {\n\tvar o = [\"\"];\n\t[[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) {\n\t\tfor(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) o[o.length] = (writextag('numFmt',null,{numFmtId:i,formatCode:escapexml(NF[i])}));\n\t});\n\tif(o.length === 1) return \"\";\n\to[o.length] = (\"\");\n\to[0] = writextag('numFmts', null, { count:o.length-2 }).replace(\"/>\", \">\");\n\treturn o.join(\"\");\n}\n\n/* 18.8.10 cellXfs CT_CellXfs */\nvar cellXF_uint = [ \"numFmtId\", \"fillId\", \"fontId\", \"borderId\", \"xfId\" ];\nvar cellXF_bool = [ \"applyAlignment\", \"applyBorder\", \"applyFill\", \"applyFont\", \"applyNumberFormat\", \"applyProtection\", \"pivotButton\", \"quotePrefix\" ];\nfunction parse_cellXfs(t, styles, opts) {\n\tstyles.CellXf = [];\n\tvar xf;\n\tvar pass = false;\n\t(t[0].match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x), i = 0;\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': case '': case '': break;\n\n\t\t\t/* 18.8.45 xf CT_Xf */\n\t\t\tcase '':\n\t\t\t\txf = y;\n\t\t\t\tdelete xf[0];\n\t\t\t\tfor(i = 0; i < cellXF_uint.length; ++i) if(xf[cellXF_uint[i]])\n\t\t\t\t\txf[cellXF_uint[i]] = parseInt(xf[cellXF_uint[i]], 10);\n\t\t\t\tfor(i = 0; i < cellXF_bool.length; ++i) if(xf[cellXF_bool[i]])\n\t\t\t\t\txf[cellXF_bool[i]] = parsexmlbool(xf[cellXF_bool[i]]);\n\t\t\t\tif(styles.NumberFmt && xf.numFmtId > 0x188) {\n\t\t\t\t\tfor(i = 0x188; i > 0x3c; --i) if(styles.NumberFmt[xf.numFmtId] == styles.NumberFmt[i]) { xf.numFmtId = i; break; }\n\t\t\t\t}\n\t\t\t\tstyles.CellXf.push(xf); break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.1 alignment CT_CellAlignment */\n\t\t\tcase '':\n\t\t\t\tvar alignment = {};\n\t\t\t\tif(y.vertical) alignment.vertical = y.vertical;\n\t\t\t\tif(y.horizontal) alignment.horizontal = y.horizontal;\n\t\t\t\tif(y.textRotation != null) alignment.textRotation = y.textRotation;\n\t\t\t\tif(y.indent) alignment.indent = y.indent;\n\t\t\t\tif(y.wrapText) alignment.wrapText = parsexmlbool(y.wrapText);\n\t\t\t\txf.alignment = alignment;\n\t\t\t\tbreak;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.33 protection CT_CellProtection */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* note: sometimes mc:AlternateContent appears bare */\n\t\t\tcase '': pass = false; break;\n\n\t\t\t/* 18.2.10 extLst CT_ExtensionList ? */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': pass = false; break;\n\t\t\tdefault: if(opts && opts.WTF) {\n\t\t\t\tif(!pass) throw new Error('unrecognized ' + y[0] + ' in cellXfs');\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction write_cellXfs(cellXfs) {\n\tvar o = [];\n\to[o.length] = (writextag('cellXfs',null));\n\tcellXfs.forEach(function(c) {\n\t\to[o.length] = (writextag('xf', null, c));\n\t});\n\to[o.length] = (\"\");\n\tif(o.length === 2) return \"\";\n\to[0] = writextag('cellXfs',null, {count:o.length-2}).replace(\"/>\",\">\");\n\treturn o.join(\"\");\n}\n\n/* 18.8 Styles CT_Stylesheet*/\nvar parse_sty_xml= (function make_pstyx() {\nvar numFmtRegex = /<(?:\\w+:)?numFmts([^>]*)>[\\S\\s]*?<\\/(?:\\w+:)?numFmts>/;\nvar cellXfRegex = /<(?:\\w+:)?cellXfs([^>]*)>[\\S\\s]*?<\\/(?:\\w+:)?cellXfs>/;\nvar fillsRegex = /<(?:\\w+:)?fills([^>]*)>[\\S\\s]*?<\\/(?:\\w+:)?fills>/;\nvar fontsRegex = /<(?:\\w+:)?fonts([^>]*)>[\\S\\s]*?<\\/(?:\\w+:)?fonts>/;\nvar bordersRegex = /<(?:\\w+:)?borders([^>]*)>[\\S\\s]*?<\\/(?:\\w+:)?borders>/;\n\nreturn function parse_sty_xml(data, themes, opts) {\n\tvar styles = {};\n\tif(!data) return styles;\n\tdata = data.replace(//mg,\"\").replace(//gm,\"\");\n\t/* 18.8.39 styleSheet CT_Stylesheet */\n\tvar t;\n\n\t/* 18.8.31 numFmts CT_NumFmts ? */\n\tif((t=data.match(numFmtRegex))) parse_numFmts(t, styles, opts);\n\n\t/* 18.8.23 fonts CT_Fonts ? */\n\tif((t=data.match(fontsRegex))) parse_fonts(t, styles, themes, opts);\n\n\t/* 18.8.21 fills CT_Fills ? */\n\tif((t=data.match(fillsRegex))) parse_fills(t, styles, themes, opts);\n\n\t/* 18.8.5 borders CT_Borders ? */\n\tif((t=data.match(bordersRegex))) parse_borders(t, styles, themes, opts);\n\n\t/* 18.8.9 cellStyleXfs CT_CellStyleXfs ? */\n\t/* 18.8.8 cellStyles CT_CellStyles ? */\n\n\t/* 18.8.10 cellXfs CT_CellXfs ? */\n\tif((t=data.match(cellXfRegex))) parse_cellXfs(t, styles, opts);\n\n\t/* 18.8.15 dxfs CT_Dxfs ? */\n\t/* 18.8.42 tableStyles CT_TableStyles ? */\n\t/* 18.8.11 colors CT_Colors ? */\n\t/* 18.2.10 extLst CT_ExtensionList ? */\n\n\treturn styles;\n};\n})();\n\nvar STYLES_XML_ROOT = writextag('styleSheet', null, {\n\t'xmlns': XMLNS.main[0],\n\t'xmlns:vt': XMLNS.vt\n});\n\nRELS.STY = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\";\n\nfunction write_sty_xml(wb, opts) {\n\tvar o = [XML_HEADER, STYLES_XML_ROOT], w;\n\tif(wb.SSF && (w = write_numFmts(wb.SSF)) != null) o[o.length] = w;\n\to[o.length] = ('');\n\to[o.length] = ('');\n\to[o.length] = ('');\n\to[o.length] = ('');\n\tif((w = write_cellXfs(opts.cellXfs))) o[o.length] = (w);\n\to[o.length] = ('');\n\to[o.length] = ('');\n\to[o.length] = ('');\n\n\tif(o.length>2){ o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* [MS-XLSB] 2.4.657 BrtFmt */\nfunction parse_BrtFmt(data, length) {\n\tvar numFmtId = data.read_shift(2);\n\tvar stFmtCode = parse_XLWideString(data,length-2);\n\treturn [numFmtId, stFmtCode];\n}\nfunction write_BrtFmt(i, f, o) {\n\tif(!o) o = new_buf(6 + 4 * f.length);\n\to.write_shift(2, i);\n\twrite_XLWideString(f, o);\n\tvar out = (o.length > o.l) ? o.slice(0, o.l) : o;\n\tif(o.l == null) o.l = o.length;\n\treturn out;\n}\n\n/* [MS-XLSB] 2.4.659 BrtFont TODO */\nfunction parse_BrtFont(data, length, opts) {\n\tvar out = ({});\n\n\tout.sz = data.read_shift(2) / 20;\n\n\tvar grbit = parse_FontFlags(data, 2, opts);\n\tif(grbit.fItalic) out.italic = 1;\n\tif(grbit.fCondense) out.condense = 1;\n\tif(grbit.fExtend) out.extend = 1;\n\tif(grbit.fShadow) out.shadow = 1;\n\tif(grbit.fOutline) out.outline = 1;\n\tif(grbit.fStrikeout) out.strike = 1;\n\n\tvar bls = data.read_shift(2);\n\tif(bls === 0x02BC) out.bold = 1;\n\n\tswitch(data.read_shift(2)) {\n\t\t/* case 0: out.vertAlign = \"baseline\"; break; */\n\t\tcase 1: out.vertAlign = \"superscript\"; break;\n\t\tcase 2: out.vertAlign = \"subscript\"; break;\n\t}\n\n\tvar underline = data.read_shift(1);\n\tif(underline != 0) out.underline = underline;\n\n\tvar family = data.read_shift(1);\n\tif(family > 0) out.family = family;\n\n\tvar bCharSet = data.read_shift(1);\n\tif(bCharSet > 0) out.charset = bCharSet;\n\n\tdata.l++;\n\tout.color = parse_BrtColor(data, 8);\n\n\tswitch(data.read_shift(1)) {\n\t\t/* case 0: out.scheme = \"none\": break; */\n\t\tcase 1: out.scheme = \"major\"; break;\n\t\tcase 2: out.scheme = \"minor\"; break;\n\t}\n\n\tout.name = parse_XLWideString(data, length - 21);\n\n\treturn out;\n}\nfunction write_BrtFont(font, o) {\n\tif(!o) o = new_buf(25+4*32);\n\to.write_shift(2, font.sz * 20);\n\twrite_FontFlags(font, o);\n\to.write_shift(2, font.bold ? 0x02BC : 0x0190);\n\tvar sss = 0;\n\tif(font.vertAlign == \"superscript\") sss = 1;\n\telse if(font.vertAlign == \"subscript\") sss = 2;\n\to.write_shift(2, sss);\n\to.write_shift(1, font.underline || 0);\n\to.write_shift(1, font.family || 0);\n\to.write_shift(1, font.charset || 0);\n\to.write_shift(1, 0);\n\twrite_BrtColor(font.color, o);\n\tvar scheme = 0;\n\tif(font.scheme == \"major\") scheme = 1;\n\tif(font.scheme == \"minor\") scheme = 2;\n\to.write_shift(1, scheme);\n\twrite_XLWideString(font.name, o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.650 BrtFill */\nvar XLSBFillPTNames = [\n\t\"none\",\n\t\"solid\",\n\t\"mediumGray\",\n\t\"darkGray\",\n\t\"lightGray\",\n\t\"darkHorizontal\",\n\t\"darkVertical\",\n\t\"darkDown\",\n\t\"darkUp\",\n\t\"darkGrid\",\n\t\"darkTrellis\",\n\t\"lightHorizontal\",\n\t\"lightVertical\",\n\t\"lightDown\",\n\t\"lightUp\",\n\t\"lightGrid\",\n\t\"lightTrellis\",\n\t\"gray125\",\n\t\"gray0625\"\n];\nvar rev_XLSBFillPTNames = (evert(XLSBFillPTNames));\n/* TODO: gradient fill representation */\nvar parse_BrtFill = parsenoop;\nfunction write_BrtFill(fill, o) {\n\tif(!o) o = new_buf(4*3 + 8*7 + 16*1);\n\tvar fls = rev_XLSBFillPTNames[fill.patternType];\n\tif(fls == null) fls = 0x28;\n\to.write_shift(4, fls);\n\tvar j = 0;\n\tif(fls != 0x28) {\n\t\t/* TODO: custom FG Color */\n\t\twrite_BrtColor({auto:1}, o);\n\t\t/* TODO: custom BG Color */\n\t\twrite_BrtColor({auto:1}, o);\n\n\t\tfor(; j < 12; ++j) o.write_shift(4, 0);\n\t} else {\n\t\tfor(; j < 4; ++j) o.write_shift(4, 0);\n\n\t\tfor(; j < 12; ++j) o.write_shift(4, 0); /* TODO */\n\t\t/* iGradientType */\n\t\t/* xnumDegree */\n\t\t/* xnumFillToLeft */\n\t\t/* xnumFillToRight */\n\t\t/* xnumFillToTop */\n\t\t/* xnumFillToBottom */\n\t\t/* cNumStop */\n\t\t/* xfillGradientStop */\n\t}\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.824 BrtXF */\nfunction parse_BrtXF(data, length) {\n\tvar tgt = data.l + length;\n\tvar ixfeParent = data.read_shift(2);\n\tvar ifmt = data.read_shift(2);\n\tdata.l = tgt;\n\treturn {ixfe:ixfeParent, numFmtId:ifmt };\n}\nfunction write_BrtXF(data, ixfeP, o) {\n\tif(!o) o = new_buf(16);\n\to.write_shift(2, ixfeP||0);\n\to.write_shift(2, data.numFmtId||0);\n\to.write_shift(2, 0); /* iFont */\n\to.write_shift(2, 0); /* iFill */\n\to.write_shift(2, 0); /* ixBorder */\n\to.write_shift(1, 0); /* trot */\n\to.write_shift(1, 0); /* indent */\n\tvar flow = 0;\n\to.write_shift(1, flow); /* flags */\n\to.write_shift(1, 0); /* flags */\n\to.write_shift(1, 0); /* xfGrbitAtr */\n\to.write_shift(1, 0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.4 Blxf TODO */\nfunction write_Blxf(data, o) {\n\tif(!o) o = new_buf(10);\n\to.write_shift(1, 0); /* dg */\n\to.write_shift(1, 0);\n\to.write_shift(4, 0); /* color */\n\to.write_shift(4, 0); /* color */\n\treturn o;\n}\n/* [MS-XLSB] 2.4.302 BrtBorder TODO */\nvar parse_BrtBorder = parsenoop;\nfunction write_BrtBorder(border, o) {\n\tif(!o) o = new_buf(51);\n\to.write_shift(1, 0); /* diagonal */\n\twrite_Blxf(null, o); /* top */\n\twrite_Blxf(null, o); /* bottom */\n\twrite_Blxf(null, o); /* left */\n\twrite_Blxf(null, o); /* right */\n\twrite_Blxf(null, o); /* diag */\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.763 BrtStyle TODO */\nfunction write_BrtStyle(style, o) {\n\tif(!o) o = new_buf(12+4*10);\n\to.write_shift(4, style.xfId);\n\to.write_shift(2, 1);\n\to.write_shift(1, +style.builtinId);\n\to.write_shift(1, 0); /* iLevel */\n\twrite_XLNullableWideString(style.name || \"\", o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.272 BrtBeginTableStyles */\nfunction write_BrtBeginTableStyles(cnt, defTableStyle, defPivotStyle) {\n\tvar o = new_buf(4+256*2*4);\n\to.write_shift(4, cnt);\n\twrite_XLNullableWideString(defTableStyle, o);\n\twrite_XLNullableWideString(defPivotStyle, o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.1.7.50 Styles */\nfunction parse_sty_bin(data, themes, opts) {\n\tvar styles = {};\n\tstyles.NumberFmt = ([]);\n\tfor(var y in SSF._table) styles.NumberFmt[y] = SSF._table[y];\n\n\tstyles.CellXf = [];\n\tstyles.Fonts = [];\n\tvar state = [];\n\tvar pass = false;\n\trecordhopper(data, function hopper_sty(val, R_n, RT) {\n\t\tswitch(RT) {\n\t\t\tcase 0x002C: /* 'BrtFmt' */\n\t\t\t\tstyles.NumberFmt[val[0]] = val[1]; SSF.load(val[1], val[0]);\n\t\t\t\tbreak;\n\t\t\tcase 0x002B: /* 'BrtFont' */\n\t\t\t\tstyles.Fonts.push(val);\n\t\t\t\tif(val.color.theme != null && themes && themes.themeElements && themes.themeElements.clrScheme) {\n\t\t\t\t\tval.color.rgb = rgb_tint(themes.themeElements.clrScheme[val.color.theme].rgb, val.color.tint || 0);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 0x0401: /* 'BrtKnownFonts' */ break;\n\t\t\tcase 0x002D: /* 'BrtFill' */\n\t\t\t\tbreak;\n\t\t\tcase 0x002E: /* 'BrtBorder' */\n\t\t\t\tbreak;\n\t\t\tcase 0x002F: /* 'BrtXF' */\n\t\t\t\tif(state[state.length - 1] == \"BrtBeginCellXFs\") {\n\t\t\t\t\tstyles.CellXf.push(val);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 0x0030: /* 'BrtStyle' */\n\t\t\tcase 0x01FB: /* 'BrtDXF' */\n\t\t\tcase 0x023C: /* 'BrtMRUColor' */\n\t\t\tcase 0x01DB: /* 'BrtIndexedColor': */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0493: /* 'BrtDXF14' */\n\t\t\tcase 0x0836: /* 'BrtDXF15' */\n\t\t\tcase 0x046A: /* 'BrtSlicerStyleElement' */\n\t\t\tcase 0x0200: /* 'BrtTableStyleElement' */\n\t\t\tcase 0x082F: /* 'BrtTimelineStyleElement' */\n\t\t\tcase 0x0C00: /* 'BrtUid' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0023: /* 'BrtFRTBegin' */\n\t\t\t\tpass = true; break;\n\t\t\tcase 0x0024: /* 'BrtFRTEnd' */\n\t\t\t\tpass = false; break;\n\t\t\tcase 0x0025: /* 'BrtACBegin' */\n\t\t\t\tstate.push(R_n); pass = true; break;\n\t\t\tcase 0x0026: /* 'BrtACEnd' */\n\t\t\t\tstate.pop(); pass = false; break;\n\n\t\t\tdefault:\n\t\t\t\tif((R_n||\"\").indexOf(\"Begin\") > 0) state.push(R_n);\n\t\t\t\telse if((R_n||\"\").indexOf(\"End\") > 0) state.pop();\n\t\t\t\telse if(!pass || (opts.WTF && state[state.length-1] != \"BrtACBegin\")) throw new Error(\"Unexpected record \" + RT + \" \" + R_n);\n\t\t}\n\t});\n\treturn styles;\n}\n\nfunction write_FMTS_bin(ba, NF) {\n\tif(!NF) return;\n\tvar cnt = 0;\n\t[[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) {\nfor(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) ++cnt;\n\t});\n\n\tif(cnt == 0) return;\n\twrite_record(ba, \"BrtBeginFmts\", write_UInt32LE(cnt));\n\t[[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) {\nfor(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) write_record(ba, \"BrtFmt\", write_BrtFmt(i, NF[i]));\n\t});\n\twrite_record(ba, \"BrtEndFmts\");\n}\n\nfunction write_FONTS_bin(ba) {\n\tvar cnt = 1;\n\n\tif(cnt == 0) return;\n\twrite_record(ba, \"BrtBeginFonts\", write_UInt32LE(cnt));\n\twrite_record(ba, \"BrtFont\", write_BrtFont({\n\t\tsz:12,\n\t\tcolor: {theme:1},\n\t\tname: \"Calibri\",\n\t\tfamily: 2,\n\t\tscheme: \"minor\"\n\t}));\n\t/* 1*65491BrtFont [ACFONTS] */\n\twrite_record(ba, \"BrtEndFonts\");\n}\n\nfunction write_FILLS_bin(ba) {\n\tvar cnt = 2;\n\n\tif(cnt == 0) return;\n\twrite_record(ba, \"BrtBeginFills\", write_UInt32LE(cnt));\n\twrite_record(ba, \"BrtFill\", write_BrtFill({patternType:\"none\"}));\n\twrite_record(ba, \"BrtFill\", write_BrtFill({patternType:\"gray125\"}));\n\t/* 1*65431BrtFill */\n\twrite_record(ba, \"BrtEndFills\");\n}\n\nfunction write_BORDERS_bin(ba) {\n\tvar cnt = 1;\n\n\tif(cnt == 0) return;\n\twrite_record(ba, \"BrtBeginBorders\", write_UInt32LE(cnt));\n\twrite_record(ba, \"BrtBorder\", write_BrtBorder({}));\n\t/* 1*65430BrtBorder */\n\twrite_record(ba, \"BrtEndBorders\");\n}\n\nfunction write_CELLSTYLEXFS_bin(ba) {\n\tvar cnt = 1;\n\twrite_record(ba, \"BrtBeginCellStyleXFs\", write_UInt32LE(cnt));\n\twrite_record(ba, \"BrtXF\", write_BrtXF({\n\t\tnumFmtId: 0,\n\t\tfontId: 0,\n\t\tfillId: 0,\n\t\tborderId: 0\n\t}, 0xFFFF));\n\t/* 1*65430(BrtXF *FRT) */\n\twrite_record(ba, \"BrtEndCellStyleXFs\");\n}\n\nfunction write_CELLXFS_bin(ba, data) {\n\twrite_record(ba, \"BrtBeginCellXFs\", write_UInt32LE(data.length));\n\tdata.forEach(function(c) { write_record(ba, \"BrtXF\", write_BrtXF(c,0)); });\n\t/* 1*65430(BrtXF *FRT) */\n\twrite_record(ba, \"BrtEndCellXFs\");\n}\n\nfunction write_STYLES_bin(ba) {\n\tvar cnt = 1;\n\n\twrite_record(ba, \"BrtBeginStyles\", write_UInt32LE(cnt));\n\twrite_record(ba, \"BrtStyle\", write_BrtStyle({\n\t\txfId:0,\n\t\tbuiltinId:0,\n\t\tname:\"Normal\"\n\t}));\n\t/* 1*65430(BrtStyle *FRT) */\n\twrite_record(ba, \"BrtEndStyles\");\n}\n\nfunction write_DXFS_bin(ba) {\n\tvar cnt = 0;\n\n\twrite_record(ba, \"BrtBeginDXFs\", write_UInt32LE(cnt));\n\t/* *2147483647(BrtDXF *FRT) */\n\twrite_record(ba, \"BrtEndDXFs\");\n}\n\nfunction write_TABLESTYLES_bin(ba) {\n\tvar cnt = 0;\n\n\twrite_record(ba, \"BrtBeginTableStyles\", write_BrtBeginTableStyles(cnt, \"TableStyleMedium9\", \"PivotStyleMedium4\"));\n\t/* *TABLESTYLE */\n\twrite_record(ba, \"BrtEndTableStyles\");\n}\n\nfunction write_COLORPALETTE_bin() {\n\treturn;\n\t/* BrtBeginColorPalette [INDEXEDCOLORS] [MRUCOLORS] BrtEndColorPalette */\n}\n\n/* [MS-XLSB] 2.1.7.50 Styles */\nfunction write_sty_bin(wb, opts) {\n\tvar ba = buf_array();\n\twrite_record(ba, \"BrtBeginStyleSheet\");\n\twrite_FMTS_bin(ba, wb.SSF);\n\twrite_FONTS_bin(ba, wb);\n\twrite_FILLS_bin(ba, wb);\n\twrite_BORDERS_bin(ba, wb);\n\twrite_CELLSTYLEXFS_bin(ba, wb);\n\twrite_CELLXFS_bin(ba, opts.cellXfs);\n\twrite_STYLES_bin(ba, wb);\n\twrite_DXFS_bin(ba, wb);\n\twrite_TABLESTYLES_bin(ba, wb);\n\twrite_COLORPALETTE_bin(ba, wb);\n\t/* FRTSTYLESHEET*/\n\twrite_record(ba, \"BrtEndStyleSheet\");\n\treturn ba.end();\n}\nRELS.THEME = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\";\n\n/* Even though theme layout is dk1 lt1 dk2 lt2, true order is lt1 dk1 lt2 dk2 */\nvar XLSXThemeClrScheme = [\n\t'', '', '', '',\n\t'', '', '',\n\t'', '', '',\n\t'', ''\n];\n/* 20.1.6.2 clrScheme CT_ColorScheme */\nfunction parse_clrScheme(t, themes, opts) {\n\tthemes.themeElements.clrScheme = [];\n\tvar color = {};\n\t(t[0].match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\t/* 20.1.6.2 clrScheme (Color Scheme) CT_ColorScheme */\n\t\t\tcase '': break;\n\n\t\t\t/* 20.1.2.3.32 srgbClr CT_SRgbColor */\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\t\tif (y[0].charAt(1) === '/') {\n\t\t\t\t\tthemes.themeElements.clrScheme[XLSXThemeClrScheme.indexOf(y[0])] = color;\n\t\t\t\t\tcolor = {};\n\t\t\t\t} else {\n\t\t\t\t\tcolor.name = y[0].slice(3, y[0].length - 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault: if(opts && opts.WTF) throw new Error('Unrecognized ' + y[0] + ' in clrScheme');\n\t\t}\n\t});\n}\n\n/* 20.1.4.1.18 fontScheme CT_FontScheme */\nfunction parse_fontScheme() { }\n\n/* 20.1.4.1.15 fmtScheme CT_StyleMatrix */\nfunction parse_fmtScheme() { }\n\nvar clrsregex = /]*)>[\\s\\S]*<\\/a:clrScheme>/;\nvar fntsregex = /]*)>[\\s\\S]*<\\/a:fontScheme>/;\nvar fmtsregex = /]*)>[\\s\\S]*<\\/a:fmtScheme>/;\n\n/* 20.1.6.10 themeElements CT_BaseStyles */\nfunction parse_themeElements(data, themes, opts) {\n\tthemes.themeElements = {};\n\n\tvar t;\n\n\t[\n\t\t/* clrScheme CT_ColorScheme */\n\t\t['clrScheme', clrsregex, parse_clrScheme],\n\t\t/* fontScheme CT_FontScheme */\n\t\t['fontScheme', fntsregex, parse_fontScheme],\n\t\t/* fmtScheme CT_StyleMatrix */\n\t\t['fmtScheme', fmtsregex, parse_fmtScheme]\n\t].forEach(function(m) {\n\t\tif(!(t=data.match(m[1]))) throw new Error(m[0] + ' not found in themeElements');\n\t\tm[2](t, themes, opts);\n\t});\n}\n\nvar themeltregex = /]*)>[\\s\\S]*<\\/a:themeElements>/;\n\n/* 14.2.7 Theme Part */\nfunction parse_theme_xml(data, opts) {\n\t/* 20.1.6.9 theme CT_OfficeStyleSheet */\n\tif(!data || data.length === 0) return parse_theme_xml(write_theme());\n\n\tvar t;\n\tvar themes = {};\n\n\t/* themeElements CT_BaseStyles */\n\tif(!(t=data.match(themeltregex))) throw new Error('themeElements not found in theme');\n\tparse_themeElements(t[0], themes, opts);\n\tthemes.raw = data;\n\treturn themes;\n}\n\nfunction write_theme(Themes, opts) {\n\tif(opts && opts.themeXLSX) return opts.themeXLSX;\n\tif(Themes && typeof Themes.raw == \"string\") return Themes.raw;\n\tvar o = [XML_HEADER];\n\to[o.length] = '';\n\to[o.length] = '';\n\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\treturn o.join(\"\");\n}\n/* [MS-XLS] 2.4.326 TODO: payload is a zip file */\nfunction parse_Theme(blob, length, opts) {\n\tvar end = blob.l + length;\n\tvar dwThemeVersion = blob.read_shift(4);\n\tif(dwThemeVersion === 124226) return;\n\tif(!opts.cellStyles) { blob.l = end; return; }\n\tvar data = blob.slice(blob.l);\n\tblob.l = end;\n\tvar zip; try { zip = zip_read(data, {type: \"array\"}); } catch(e) { return; }\n\tvar themeXML = getzipstr(zip, \"theme/theme/theme1.xml\", true);\n\tif(!themeXML) return;\n\treturn parse_theme_xml(themeXML, opts);\n}\n\n/* 2.5.49 */\nfunction parse_ColorTheme(blob) { return blob.read_shift(4); }\n\n/* 2.5.155 */\nfunction parse_FullColorExt(blob) {\n\tvar o = {};\n\to.xclrType = blob.read_shift(2);\n\to.nTintShade = blob.read_shift(2);\n\tswitch(o.xclrType) {\n\t\tcase 0: blob.l += 4; break;\n\t\tcase 1: o.xclrValue = parse_IcvXF(blob, 4); break;\n\t\tcase 2: o.xclrValue = parse_LongRGBA(blob, 4); break;\n\t\tcase 3: o.xclrValue = parse_ColorTheme(blob, 4); break;\n\t\tcase 4: blob.l += 4; break;\n\t}\n\tblob.l += 8;\n\treturn o;\n}\n\n/* 2.5.164 TODO: read 7 bits*/\nfunction parse_IcvXF(blob, length) {\n\treturn parsenoop(blob, length);\n}\n\n/* 2.5.280 */\nfunction parse_XFExtGradient(blob, length) {\n\treturn parsenoop(blob, length);\n}\n\n/* [MS-XLS] 2.5.108 */\nfunction parse_ExtProp(blob) {\n\tvar extType = blob.read_shift(2);\n\tvar cb = blob.read_shift(2) - 4;\n\tvar o = [extType];\n\tswitch(extType) {\n\t\tcase 0x04: case 0x05: case 0x07: case 0x08:\n\t\tcase 0x09: case 0x0A: case 0x0B: case 0x0D:\n\t\t\to[1] = parse_FullColorExt(blob, cb); break;\n\t\tcase 0x06: o[1] = parse_XFExtGradient(blob, cb); break;\n\t\tcase 0x0E: case 0x0F: o[1] = blob.read_shift(cb === 1 ? 1 : 2); break;\n\t\tdefault: throw new Error(\"Unrecognized ExtProp type: \" + extType + \" \" + cb);\n\t}\n\treturn o;\n}\n\n/* 2.4.355 */\nfunction parse_XFExt(blob, length) {\n\tvar end = blob.l + length;\n\tblob.l += 2;\n\tvar ixfe = blob.read_shift(2);\n\tblob.l += 2;\n\tvar cexts = blob.read_shift(2);\n\tvar ext = [];\n\twhile(cexts-- > 0) ext.push(parse_ExtProp(blob, end-blob.l));\n\treturn {ixfe:ixfe, ext:ext};\n}\n\n/* xf is an XF, see parse_XFExt for xfext */\nfunction update_xfext(xf, xfext) {\n\txfext.forEach(function(xfe) {\n\t\tswitch(xfe[0]) { /* 2.5.108 extPropData */\n\t\t\tcase 0x04: break; /* foreground color */\n\t\t\tcase 0x05: break; /* background color */\n\t\t\tcase 0x06: break; /* gradient fill */\n\t\t\tcase 0x07: break; /* top cell border color */\n\t\t\tcase 0x08: break; /* bottom cell border color */\n\t\t\tcase 0x09: break; /* left cell border color */\n\t\t\tcase 0x0a: break; /* right cell border color */\n\t\t\tcase 0x0b: break; /* diagonal cell border color */\n\t\t\tcase 0x0d: /* text color */\n\t\t\t\tbreak;\n\t\t\tcase 0x0e: break; /* font scheme */\n\t\t\tcase 0x0f: break; /* indentation level */\n\t\t}\n\t});\n}\n\n/* 18.6 Calculation Chain */\nfunction parse_cc_xml(data) {\n\tvar d = [];\n\tif(!data) return d;\n\tvar i = 1;\n\t(data.match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\tcase '': case '': break;\n\t\t\t/* 18.6.1 c CT_CalcCell 1 */\n\t\t\tcase ' 0){/* empty */}\n\t\t\t\telse if((R_n||\"\").indexOf(\"End\") > 0){/* empty */}\n\t\t\t\telse if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R_n);\n\t\t}\n\t});\n\treturn out;\n}\n\n//function write_cc_bin(data, opts) { }\n/* 18.14 Supplementary Workbook Data */\nfunction parse_xlink_xml() {\n\t//var opts = _opts || {};\n\t//if(opts.WTF) throw \"XLSX External Link\";\n}\n\n/* [MS-XLSB] 2.1.7.25 External Link */\nfunction parse_xlink_bin(data, rel, name, _opts) {\n\tif(!data) return data;\n\tvar opts = _opts || {};\n\n\tvar pass = false, end = false;\n\n\trecordhopper(data, function xlink_parse(val, R_n, RT) {\n\t\tif(end) return;\n\t\tswitch(RT) {\n\t\t\tcase 0x0167: /* 'BrtSupTabs' */\n\t\t\tcase 0x016B: /* 'BrtExternTableStart' */\n\t\t\tcase 0x016C: /* 'BrtExternTableEnd' */\n\t\t\tcase 0x016E: /* 'BrtExternRowHdr' */\n\t\t\tcase 0x016F: /* 'BrtExternCellBlank' */\n\t\t\tcase 0x0170: /* 'BrtExternCellReal' */\n\t\t\tcase 0x0171: /* 'BrtExternCellBool' */\n\t\t\tcase 0x0172: /* 'BrtExternCellError' */\n\t\t\tcase 0x0173: /* 'BrtExternCellString' */\n\t\t\tcase 0x01D8: /* 'BrtExternValueMeta' */\n\t\t\tcase 0x0241: /* 'BrtSupNameStart' */\n\t\t\tcase 0x0242: /* 'BrtSupNameValueStart' */\n\t\t\tcase 0x0243: /* 'BrtSupNameValueEnd' */\n\t\t\tcase 0x0244: /* 'BrtSupNameNum' */\n\t\t\tcase 0x0245: /* 'BrtSupNameErr' */\n\t\t\tcase 0x0246: /* 'BrtSupNameSt' */\n\t\t\tcase 0x0247: /* 'BrtSupNameNil' */\n\t\t\tcase 0x0248: /* 'BrtSupNameBool' */\n\t\t\tcase 0x0249: /* 'BrtSupNameFmla' */\n\t\t\tcase 0x024A: /* 'BrtSupNameBits' */\n\t\t\tcase 0x024B: /* 'BrtSupNameEnd' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0023: /* 'BrtFRTBegin' */\n\t\t\t\tpass = true; break;\n\t\t\tcase 0x0024: /* 'BrtFRTEnd' */\n\t\t\t\tpass = false; break;\n\n\t\t\tdefault:\n\t\t\t\tif((R_n||\"\").indexOf(\"Begin\") > 0){/* empty */}\n\t\t\t\telse if((R_n||\"\").indexOf(\"End\") > 0){/* empty */}\n\t\t\t\telse if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT.toString(16) + \" \" + R_n);\n\t\t}\n\t}, opts);\n}\n/* 20.5 DrawingML - SpreadsheetML Drawing */\nRELS.IMG = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\";\nRELS.DRAW = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\";\n\n/* 20.5.2.35 wsDr CT_Drawing */\nfunction parse_drawing(data, rels) {\n\tif(!data) return \"??\";\n\t/*\n\t Chartsheet Drawing:\n\t - 20.5.2.35 wsDr CT_Drawing\n\t - 20.5.2.1 absoluteAnchor CT_AbsoluteAnchor\n\t - 20.5.2.16 graphicFrame CT_GraphicalObjectFrame\n\t - 20.1.2.2.16 graphic CT_GraphicalObject\n\t - 20.1.2.2.17 graphicData CT_GraphicalObjectData\n - chart reference\n\t the actual type is based on the URI of the graphicData\n\t\tTODO: handle embedded charts and other types of graphics\n\t*/\n\tvar id = (data.match(/]*r:id=\"([^\"]*)\"/)||[\"\",\"\"])[1];\n\n\treturn rels['!id'][id].Target;\n}\n\n/* L.5.5.2 SpreadsheetML Comments + VML Schema */\nvar _shapeid = 1024;\nfunction write_comments_vml(rId, comments) {\n\tvar csize = [21600, 21600];\n\t/* L.5.2.1.2 Path Attribute */\n\tvar bbox = [\"m0,0l0\",csize[1],csize[0],csize[1],csize[0],\"0xe\"].join(\",\");\n\tvar o = [\n\t\twritextag(\"xml\", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\\/>/,\">\"),\n\t\twritextag(\"o:shapelayout\", writextag(\"o:idmap\", null, {'v:ext':\"edit\", 'data':rId}), {'v:ext':\"edit\"}),\n\t\twritextag(\"v:shapetype\", [\n\t\t\twritextag(\"v:stroke\", null, {joinstyle:\"miter\"}),\n\t\t\twritextag(\"v:path\", null, {gradientshapeok:\"t\", 'o:connecttype':\"rect\"})\n\t\t].join(\"\"), {id:\"_x0000_t202\", 'o:spt':202, coordsize:csize.join(\",\"),path:bbox})\n\t];\n\twhile(_shapeid < rId * 1000) _shapeid += 1000;\n\n\tcomments.forEach(function(x) {\n\tvar c = decode_cell(x[0]);\n\tvar fillopts = {'color2':\"#BEFF82\", 'type':\"gradient\"};\n\tif(fillopts.type == \"gradient\") fillopts.angle = \"-180\";\n\tvar fillparm = fillopts.type == \"gradient\" ? writextag(\"o:fill\", null, {type:\"gradientUnscaled\", 'v:ext':\"view\"}) : null;\n\tvar fillxml = writextag('v:fill', fillparm, fillopts);\n\n\tvar shadata = ({on:\"t\", 'obscured':\"t\"});\n\t++_shapeid;\n\n\to = o.concat([\n\t'',\n\t\tfillxml,\n\t\twritextag(\"v:shadow\", null, shadata),\n\t\twritextag(\"v:path\", null, {'o:connecttype':\"none\"}),\n\t\t'
',\n\t\t'',\n\t\t\t'',\n\t\t\t'',\n\t\t\t/* Part 4 19.4.2.3 Anchor (Anchor) */\n\t\t\twritetag('x:Anchor', [c.c+1, 0, c.r+1, 0, c.c+3, 20, c.r+5, 20].join(\",\")),\n\t\t\twritetag('x:AutoFill', \"False\"),\n\t\t\twritetag('x:Row', String(c.r)),\n\t\t\twritetag('x:Column', String(c.c)),\n\t\t\tx[1].hidden ? '' : '',\n\t\t'',\n\t''\n\t]); });\n\to.push('');\n\treturn o.join(\"\");\n}\nRELS.CMNT = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\";\n\nfunction sheet_insert_comments(sheet, comments) {\n\tvar dense = Array.isArray(sheet);\n\tvar cell;\n\tcomments.forEach(function(comment) {\n\t\tvar r = decode_cell(comment.ref);\n\t\tif(dense) {\n\t\t\tif(!sheet[r.r]) sheet[r.r] = [];\n\t\t\tcell = sheet[r.r][r.c];\n\t\t} else cell = sheet[comment.ref];\n\t\tif (!cell) {\n\t\t\tcell = ({t:\"z\"});\n\t\t\tif(dense) sheet[r.r][r.c] = cell;\n\t\t\telse sheet[comment.ref] = cell;\n\t\t\tvar range = safe_decode_range(sheet[\"!ref\"]||\"BDWGO1000001:A1\");\n\t\t\tif(range.s.r > r.r) range.s.r = r.r;\n\t\t\tif(range.e.r < r.r) range.e.r = r.r;\n\t\t\tif(range.s.c > r.c) range.s.c = r.c;\n\t\t\tif(range.e.c < r.c) range.e.c = r.c;\n\t\t\tvar encoded = encode_range(range);\n\t\t\tif (encoded !== sheet[\"!ref\"]) sheet[\"!ref\"] = encoded;\n\t\t}\n\n\t\tif (!cell.c) cell.c = [];\n\t\tvar o = ({a: comment.author, t: comment.t, r: comment.r});\n\t\tif(comment.h) o.h = comment.h;\n\t\tcell.c.push(o);\n\t});\n}\n\n/* 18.7 Comments */\nfunction parse_comments_xml(data, opts) {\n\t/* 18.7.6 CT_Comments */\n\tif(data.match(/<(?:\\w+:)?comments *\\/>/)) return [];\n\tvar authors = [];\n\tvar commentList = [];\n\tvar authtag = data.match(/<(?:\\w+:)?authors>([\\s\\S]*)<\\/(?:\\w+:)?authors>/);\n\tif(authtag && authtag[1]) authtag[1].split(/<\\/\\w*:?author>/).forEach(function(x) {\n\t\tif(x === \"\" || x.trim() === \"\") return;\n\t\tvar a = x.match(/<(?:\\w+:)?author[^>]*>(.*)/);\n\t\tif(a) authors.push(a[1]);\n\t});\n\tvar cmnttag = data.match(/<(?:\\w+:)?commentList>([\\s\\S]*)<\\/(?:\\w+:)?commentList>/);\n\tif(cmnttag && cmnttag[1]) cmnttag[1].split(/<\\/\\w*:?comment>/).forEach(function(x) {\n\t\tif(x === \"\" || x.trim() === \"\") return;\n\t\tvar cm = x.match(/<(?:\\w+:)?comment[^>]*>/);\n\t\tif(!cm) return;\n\t\tvar y = parsexmltag(cm[0]);\n\t\tvar comment = ({ author: y.authorId && authors[y.authorId] || \"sheetjsghost\", ref: y.ref, guid: y.guid });\n\t\tvar cell = decode_cell(y.ref);\n\t\tif(opts.sheetRows && opts.sheetRows <= cell.r) return;\n\t\tvar textMatch = x.match(/<(?:\\w+:)?text>([\\s\\S]*)<\\/(?:\\w+:)?text>/);\n\t\tvar rt = !!textMatch && !!textMatch[1] && parse_si(textMatch[1]) || {r:\"\",t:\"\",h:\"\"};\n\t\tcomment.r = rt.r;\n\t\tif(rt.r == \"\") rt.t = rt.h = \"\";\n\t\tcomment.t = (rt.t||\"\").replace(/\\r\\n/g,\"\\n\").replace(/\\r/g,\"\\n\");\n\t\tif(opts.cellHTML) comment.h = rt.h;\n\t\tcommentList.push(comment);\n\t});\n\treturn commentList;\n}\n\nvar CMNT_XML_ROOT = writextag('comments', null, { 'xmlns': XMLNS.main[0] });\nfunction write_comments_xml(data) {\n\tvar o = [XML_HEADER, CMNT_XML_ROOT];\n\n\tvar iauthor = [];\n\to.push(\"\");\n\tdata.forEach(function(x) { x[1].forEach(function(w) { var a = escapexml(w.a);\n\t\tif(iauthor.indexOf(a) > -1) return;\n\t\tiauthor.push(a);\n\t\to.push(\"\" + a + \"\");\n\t}); });\n\to.push(\"\");\n\to.push(\"\");\n\tdata.forEach(function(d) {\n\t\td[1].forEach(function(c) {\n\t\t\t/* 18.7.3 CT_Comment */\n\t\t\to.push('');\n\t\t\to.push(writetag(\"t\", c.t == null ? \"\" : escapexml(c.t)));\n\t\t\to.push('');\n\t\t});\n\t});\n\to.push(\"\");\n\tif(o.length>2) { o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* [MS-XLSB] 2.4.28 BrtBeginComment */\nfunction parse_BrtBeginComment(data) {\n\tvar out = {};\n\tout.iauthor = data.read_shift(4);\n\tvar rfx = parse_UncheckedRfX(data, 16);\n\tout.rfx = rfx.s;\n\tout.ref = encode_cell(rfx.s);\n\tdata.l += 16; /*var guid = parse_GUID(data); */\n\treturn out;\n}\nfunction write_BrtBeginComment(data, o) {\n\tif(o == null) o = new_buf(36);\n\to.write_shift(4, data[1].iauthor);\n\twrite_UncheckedRfX((data[0]), o);\n\to.write_shift(4, 0);\n\to.write_shift(4, 0);\n\to.write_shift(4, 0);\n\to.write_shift(4, 0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.327 BrtCommentAuthor */\nvar parse_BrtCommentAuthor = parse_XLWideString;\nfunction write_BrtCommentAuthor(data) { return write_XLWideString(data.slice(0, 54)); }\n\n/* [MS-XLSB] 2.1.7.8 Comments */\nfunction parse_comments_bin(data, opts) {\n\tvar out = [];\n\tvar authors = [];\n\tvar c = {};\n\tvar pass = false;\n\trecordhopper(data, function hopper_cmnt(val, R_n, RT) {\n\t\tswitch(RT) {\n\t\t\tcase 0x0278: /* 'BrtCommentAuthor' */\n\t\t\t\tauthors.push(val); break;\n\t\t\tcase 0x027B: /* 'BrtBeginComment' */\n\t\t\t\tc = val; break;\n\t\t\tcase 0x027D: /* 'BrtCommentText' */\n\t\t\t\tc.t = val.t; c.h = val.h; c.r = val.r; break;\n\t\t\tcase 0x027C: /* 'BrtEndComment' */\n\t\t\t\tc.author = authors[c.iauthor];\n\t\t\t\tdelete (c).iauthor;\n\t\t\t\tif(opts.sheetRows && c.rfx && opts.sheetRows <= c.rfx.r) break;\n\t\t\t\tif(!c.t) c.t = \"\";\n\t\t\t\tdelete c.rfx; out.push(c); break;\n\n\t\t\tcase 0x0C00: /* 'BrtUid' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0023: /* 'BrtFRTBegin' */\n\t\t\t\tpass = true; break;\n\t\t\tcase 0x0024: /* 'BrtFRTEnd' */\n\t\t\t\tpass = false; break;\n\t\t\tcase 0x0025: /* 'BrtACBegin' */ break;\n\t\t\tcase 0x0026: /* 'BrtACEnd' */ break;\n\n\n\t\t\tdefault:\n\t\t\t\tif((R_n||\"\").indexOf(\"Begin\") > 0){/* empty */}\n\t\t\t\telse if((R_n||\"\").indexOf(\"End\") > 0){/* empty */}\n\t\t\t\telse if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R_n);\n\t\t}\n\t});\n\treturn out;\n}\n\nfunction write_comments_bin(data) {\n\tvar ba = buf_array();\n\tvar iauthor = [];\n\twrite_record(ba, \"BrtBeginComments\");\n\n\twrite_record(ba, \"BrtBeginCommentAuthors\");\n\tdata.forEach(function(comment) {\n\t\tcomment[1].forEach(function(c) {\n\t\t\tif(iauthor.indexOf(c.a) > -1) return;\n\t\t\tiauthor.push(c.a.slice(0,54));\n\t\t\twrite_record(ba, \"BrtCommentAuthor\", write_BrtCommentAuthor(c.a));\n\t\t});\n\t});\n\twrite_record(ba, \"BrtEndCommentAuthors\");\n\n\twrite_record(ba, \"BrtBeginCommentList\");\n\tdata.forEach(function(comment) {\n\t\tcomment[1].forEach(function(c) {\n\t\t\tc.iauthor = iauthor.indexOf(c.a);\n\t\t\tvar range = {s:decode_cell(comment[0]),e:decode_cell(comment[0])};\n\t\t\twrite_record(ba, \"BrtBeginComment\", write_BrtBeginComment([range, c]));\n\t\t\tif(c.t && c.t.length > 0) write_record(ba, \"BrtCommentText\", write_BrtCommentText(c));\n\t\t\twrite_record(ba, \"BrtEndComment\");\n\t\t\tdelete c.iauthor;\n\t\t});\n\t});\n\twrite_record(ba, \"BrtEndCommentList\");\n\n\twrite_record(ba, \"BrtEndComments\");\n\treturn ba.end();\n}\nvar CT_VBA = \"application/vnd.ms-office.vbaProject\";\nfunction make_vba_xls(cfb) {\n\tvar newcfb = CFB.utils.cfb_new({root:\"R\"});\n\tcfb.FullPaths.forEach(function(p, i) {\n\t\tif(p.slice(-1) === \"/\" || !p.match(/_VBA_PROJECT_CUR/)) return;\n\t\tvar newpath = p.replace(/^[^\\/]*/,\"R\").replace(/\\/_VBA_PROJECT_CUR\\u0000*/, \"\");\n\t\tCFB.utils.cfb_add(newcfb, newpath, cfb.FileIndex[i].content);\n\t});\n\treturn CFB.write(newcfb);\n}\n\nfunction fill_vba_xls(cfb, vba) {\n\tvba.FullPaths.forEach(function(p, i) {\n\t\tif(i == 0) return;\n\t\tvar newpath = p.replace(/[^\\/]*[\\/]/, \"/_VBA_PROJECT_CUR/\");\n\t\tif(newpath.slice(-1) !== \"/\") CFB.utils.cfb_add(cfb, newpath, vba.FileIndex[i].content);\n\t});\n}\n\nvar VBAFMTS = [ \"xlsb\", \"xlsm\", \"xlam\", \"biff8\", \"xla\" ];\n\nRELS.DS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/dialogsheet\";\nRELS.MS = \"http://schemas.microsoft.com/office/2006/relationships/xlMacrosheet\";\n\n/* macro and dialog sheet stubs */\nfunction parse_ds_bin() { return {'!type':'dialog'}; }\nfunction parse_ds_xml() { return {'!type':'dialog'}; }\nfunction parse_ms_bin() { return {'!type':'macro'}; }\nfunction parse_ms_xml() { return {'!type':'macro'}; }\n/* TODO: it will be useful to parse the function str */\nvar rc_to_a1 = (function(){\n\tvar rcregex = /(^|[^A-Za-z_])R(\\[?-?\\d+\\]|[1-9]\\d*|)C(\\[?-?\\d+\\]|[1-9]\\d*|)(?![A-Za-z0-9_])/g;\n\tvar rcbase = ({r:0,c:0});\n\tfunction rcfunc($$,$1,$2,$3) {\n\t\tvar cRel = false, rRel = false;\n\n\t\tif($2.length == 0) rRel = true;\n\t\telse if($2.charAt(0) == \"[\") { rRel = true; $2 = $2.slice(1, -1); }\n\n\t\tif($3.length == 0) cRel = true;\n\t\telse if($3.charAt(0) == \"[\") { cRel = true; $3 = $3.slice(1, -1); }\n\n\t\tvar R = $2.length>0?parseInt($2,10)|0:0, C = $3.length>0?parseInt($3,10)|0:0;\n\n\t\tif(cRel) C += rcbase.c; else --C;\n\t\tif(rRel) R += rcbase.r; else --R;\n\t\treturn $1 + (cRel ? \"\" : \"$\") + encode_col(C) + (rRel ? \"\" : \"$\") + encode_row(R);\n\t}\n\treturn function rc_to_a1(fstr, base) {\n\t\trcbase = base;\n\t\treturn fstr.replace(rcregex, rcfunc);\n\t};\n})();\n\nvar crefregex = /(^|[^._A-Z0-9])([$]?)([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])([$]?)(10[0-3]\\d{4}|104[0-7]\\d{3}|1048[0-4]\\d{2}|10485[0-6]\\d|104857[0-6]|[1-9]\\d{0,5})(?![_.\\(A-Za-z0-9])/g;\nvar a1_to_rc =(function(){\n\treturn function a1_to_rc(fstr, base) {\n\t\treturn fstr.replace(crefregex, function($0, $1, $2, $3, $4, $5) {\n\t\t\tvar c = decode_col($3) - ($2 ? 0 : base.c);\n\t\t\tvar r = decode_row($5) - ($4 ? 0 : base.r);\n\t\t\tvar R = (r == 0 ? \"\" : !$4 ? \"[\" + r + \"]\" : (r+1));\n\t\t\tvar C = (c == 0 ? \"\" : !$2 ? \"[\" + c + \"]\" : (c+1));\n\t\t\treturn $1 + \"R\" + R + \"C\" + C;\n\t\t});\n\t};\n})();\n\n/* no defined name can collide with a valid cell address A1:XFD1048576 ... except LOG10! */\nfunction shift_formula_str(f, delta) {\n\treturn f.replace(crefregex, function($0, $1, $2, $3, $4, $5) {\n\t\treturn $1+($2==\"$\" ? $2+$3 : encode_col(decode_col($3)+delta.c))+($4==\"$\" ? $4+$5 : encode_row(decode_row($5) + delta.r));\n\t});\n}\n\nfunction shift_formula_xlsx(f, range, cell) {\n\tvar r = decode_range(range), s = r.s, c = decode_cell(cell);\n\tvar delta = {r:c.r - s.r, c:c.c - s.c};\n\treturn shift_formula_str(f, delta);\n}\n\n/* TODO: parse formula */\nfunction fuzzyfmla(f) {\n\tif(f.length == 1) return false;\n\treturn true;\n}\n\nfunction _xlfn(f) {\n\treturn f.replace(/_xlfn\\./g,\"\");\n}\nfunction parseread1(blob) { blob.l+=1; return; }\n\n/* [MS-XLS] 2.5.51 */\nfunction parse_ColRelU(blob, length) {\n\tvar c = blob.read_shift(length == 1 ? 1 : 2);\n\treturn [c & 0x3FFF, (c >> 14) & 1, (c >> 15) & 1];\n}\n\n/* [MS-XLS] 2.5.198.105 ; [MS-XLSB] 2.5.97.89 */\nfunction parse_RgceArea(blob, length, opts) {\n\tvar w = 2;\n\tif(opts) {\n\t\tif(opts.biff >= 2 && opts.biff <= 5) return parse_RgceArea_BIFF2(blob, length, opts);\n\t\telse if(opts.biff == 12) w = 4;\n\t}\n\tvar r=blob.read_shift(w), R=blob.read_shift(w);\n\tvar c=parse_ColRelU(blob, 2);\n\tvar C=parse_ColRelU(blob, 2);\n\treturn { s:{r:r, c:c[0], cRel:c[1], rRel:c[2]}, e:{r:R, c:C[0], cRel:C[1], rRel:C[2]} };\n}\n/* BIFF 2-5 encodes flags in the row field */\nfunction parse_RgceArea_BIFF2(blob) {\n\tvar r=parse_ColRelU(blob, 2), R=parse_ColRelU(blob, 2);\n\tvar c=blob.read_shift(1);\n\tvar C=blob.read_shift(1);\n\treturn { s:{r:r[0], c:c, cRel:r[1], rRel:r[2]}, e:{r:R[0], c:C, cRel:R[1], rRel:R[2]} };\n}\n\n/* [MS-XLS] 2.5.198.105 ; [MS-XLSB] 2.5.97.90 */\nfunction parse_RgceAreaRel(blob, length, opts) {\n\tif(opts.biff < 8) return parse_RgceArea_BIFF2(blob, length, opts);\n\tvar r=blob.read_shift(opts.biff == 12 ? 4 : 2), R=blob.read_shift(opts.biff == 12 ? 4 : 2);\n\tvar c=parse_ColRelU(blob, 2);\n\tvar C=parse_ColRelU(blob, 2);\n\treturn { s:{r:r, c:c[0], cRel:c[1], rRel:c[2]}, e:{r:R, c:C[0], cRel:C[1], rRel:C[2]} };\n}\n\n/* [MS-XLS] 2.5.198.109 ; [MS-XLSB] 2.5.97.91 */\nfunction parse_RgceLoc(blob, length, opts) {\n\tif(opts && opts.biff >= 2 && opts.biff <= 5) return parse_RgceLoc_BIFF2(blob, length, opts);\n\tvar r = blob.read_shift(opts && opts.biff == 12 ? 4 : 2);\n\tvar c = parse_ColRelU(blob, 2);\n\treturn {r:r, c:c[0], cRel:c[1], rRel:c[2]};\n}\nfunction parse_RgceLoc_BIFF2(blob) {\n\tvar r = parse_ColRelU(blob, 2);\n\tvar c = blob.read_shift(1);\n\treturn {r:r[0], c:c, cRel:r[1], rRel:r[2]};\n}\n\n/* [MS-XLS] 2.5.198.107, 2.5.47 */\nfunction parse_RgceElfLoc(blob) {\n\tvar r = blob.read_shift(2);\n\tvar c = blob.read_shift(2);\n\treturn {r:r, c:c & 0xFF, fQuoted:!!(c & 0x4000), cRel:c>>15, rRel:c>>15 };\n}\n\n/* [MS-XLS] 2.5.198.111 ; [MS-XLSB] 2.5.97.92 TODO */\nfunction parse_RgceLocRel(blob, length, opts) {\n\tvar biff = opts && opts.biff ? opts.biff : 8;\n\tif(biff >= 2 && biff <= 5) return parse_RgceLocRel_BIFF2(blob, length, opts);\n\tvar r = blob.read_shift(biff >= 12 ? 4 : 2);\n\tvar cl = blob.read_shift(2);\n\tvar cRel = (cl & 0x4000) >> 14, rRel = (cl & 0x8000) >> 15;\n\tcl &= 0x3FFF;\n\tif(rRel == 1) while(r > 0x7FFFF) r -= 0x100000;\n\tif(cRel == 1) while(cl > 0x1FFF) cl = cl - 0x4000;\n\treturn {r:r,c:cl,cRel:cRel,rRel:rRel};\n}\nfunction parse_RgceLocRel_BIFF2(blob) {\n\tvar rl = blob.read_shift(2);\n\tvar c = blob.read_shift(1);\n\tvar rRel = (rl & 0x8000) >> 15, cRel = (rl & 0x4000) >> 14;\n\trl &= 0x3FFF;\n\tif(rRel == 1 && rl >= 0x2000) rl = rl - 0x4000;\n\tif(cRel == 1 && c >= 0x80) c = c - 0x100;\n\treturn {r:rl,c:c,cRel:cRel,rRel:rRel};\n}\n\n/* [MS-XLS] 2.5.198.27 ; [MS-XLSB] 2.5.97.18 */\nfunction parse_PtgArea(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar area = parse_RgceArea(blob, opts.biff >= 2 && opts.biff <= 5 ? 6 : 8, opts);\n\treturn [type, area];\n}\n\n/* [MS-XLS] 2.5.198.28 ; [MS-XLSB] 2.5.97.19 */\nfunction parse_PtgArea3d(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar ixti = blob.read_shift(2, 'i');\n\tvar w = 8;\n\tif(opts) switch(opts.biff) {\n\t\tcase 5: blob.l += 12; w = 6; break;\n\t\tcase 12: w = 12; break;\n\t}\n\tvar area = parse_RgceArea(blob, w, opts);\n\treturn [type, ixti, area];\n}\n\n/* [MS-XLS] 2.5.198.29 ; [MS-XLSB] 2.5.97.20 */\nfunction parse_PtgAreaErr(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tblob.l += opts && (opts.biff > 8) ? 12 : (opts.biff < 8 ? 6 : 8);\n\treturn [type];\n}\n/* [MS-XLS] 2.5.198.30 ; [MS-XLSB] 2.5.97.21 */\nfunction parse_PtgAreaErr3d(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar ixti = blob.read_shift(2);\n\tvar w = 8;\n\tif(opts) switch(opts.biff) {\n\t\tcase 5: blob.l += 12; w = 6; break;\n\t\tcase 12: w = 12; break;\n\t}\n\tblob.l += w;\n\treturn [type, ixti];\n}\n\n/* [MS-XLS] 2.5.198.31 ; [MS-XLSB] 2.5.97.22 */\nfunction parse_PtgAreaN(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar area = parse_RgceAreaRel(blob, length - 1, opts);\n\treturn [type, area];\n}\n\n/* [MS-XLS] 2.5.198.32 ; [MS-XLSB] 2.5.97.23 */\nfunction parse_PtgArray(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tblob.l += opts.biff == 2 ? 6 : opts.biff == 12 ? 14 : 7;\n\treturn [type];\n}\n\n/* [MS-XLS] 2.5.198.33 ; [MS-XLSB] 2.5.97.24 */\nfunction parse_PtgAttrBaxcel(blob) {\n\tvar bitSemi = blob[blob.l+1] & 0x01; /* 1 = volatile */\n\tvar bitBaxcel = 1;\n\tblob.l += 4;\n\treturn [bitSemi, bitBaxcel];\n}\n\n/* [MS-XLS] 2.5.198.34 ; [MS-XLSB] 2.5.97.25 */\nfunction parse_PtgAttrChoose(blob, length, opts) {\n\tblob.l +=2;\n\tvar offset = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);\n\tvar o = [];\n\t/* offset is 1 less than the number of elements */\n\tfor(var i = 0; i <= offset; ++i) o.push(blob.read_shift(opts && opts.biff == 2 ? 1 : 2));\n\treturn o;\n}\n\n/* [MS-XLS] 2.5.198.35 ; [MS-XLSB] 2.5.97.26 */\nfunction parse_PtgAttrGoto(blob, length, opts) {\n\tvar bitGoto = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n\tblob.l += 2;\n\treturn [bitGoto, blob.read_shift(opts && opts.biff == 2 ? 1 : 2)];\n}\n\n/* [MS-XLS] 2.5.198.36 ; [MS-XLSB] 2.5.97.27 */\nfunction parse_PtgAttrIf(blob, length, opts) {\n\tvar bitIf = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n\tblob.l += 2;\n\treturn [bitIf, blob.read_shift(opts && opts.biff == 2 ? 1 : 2)];\n}\n\n/* [MS-XLSB] 2.5.97.28 */\nfunction parse_PtgAttrIfError(blob) {\n\tvar bitIf = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n\tblob.l += 2;\n\treturn [bitIf, blob.read_shift(2)];\n}\n\n/* [MS-XLS] 2.5.198.37 ; [MS-XLSB] 2.5.97.29 */\nfunction parse_PtgAttrSemi(blob, length, opts) {\n\tvar bitSemi = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n\tblob.l += opts && opts.biff == 2 ? 3 : 4;\n\treturn [bitSemi];\n}\n\n/* [MS-XLS] 2.5.198.40 ; [MS-XLSB] 2.5.97.32 */\nfunction parse_PtgAttrSpaceType(blob) {\n\tvar type = blob.read_shift(1), cch = blob.read_shift(1);\n\treturn [type, cch];\n}\n\n/* [MS-XLS] 2.5.198.38 ; [MS-XLSB] 2.5.97.30 */\nfunction parse_PtgAttrSpace(blob) {\n\tblob.read_shift(2);\n\treturn parse_PtgAttrSpaceType(blob, 2);\n}\n\n/* [MS-XLS] 2.5.198.39 ; [MS-XLSB] 2.5.97.31 */\nfunction parse_PtgAttrSpaceSemi(blob) {\n\tblob.read_shift(2);\n\treturn parse_PtgAttrSpaceType(blob, 2);\n}\n\n/* [MS-XLS] 2.5.198.84 ; [MS-XLSB] 2.5.97.68 TODO */\nfunction parse_PtgRef(blob, length, opts) {\n\t//var ptg = blob[blob.l] & 0x1F;\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar loc = parse_RgceLoc(blob, 0, opts);\n\treturn [type, loc];\n}\n\n/* [MS-XLS] 2.5.198.88 ; [MS-XLSB] 2.5.97.72 TODO */\nfunction parse_PtgRefN(blob, length, opts) {\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar loc = parse_RgceLocRel(blob, 0, opts);\n\treturn [type, loc];\n}\n\n/* [MS-XLS] 2.5.198.85 ; [MS-XLSB] 2.5.97.69 TODO */\nfunction parse_PtgRef3d(blob, length, opts) {\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar ixti = blob.read_shift(2); // XtiIndex\n\tif(opts && opts.biff == 5) blob.l += 12;\n\tvar loc = parse_RgceLoc(blob, 0, opts); // TODO: or RgceLocRel\n\treturn [type, ixti, loc];\n}\n\n\n/* [MS-XLS] 2.5.198.62 ; [MS-XLSB] 2.5.97.45 TODO */\nfunction parse_PtgFunc(blob, length, opts) {\n\t//var ptg = blob[blob.l] & 0x1F;\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar iftab = blob.read_shift(opts && opts.biff <= 3 ? 1 : 2);\n\treturn [FtabArgc[iftab], Ftab[iftab], type];\n}\n/* [MS-XLS] 2.5.198.63 ; [MS-XLSB] 2.5.97.46 TODO */\nfunction parse_PtgFuncVar(blob, length, opts) {\n\tvar type = blob[blob.l++];\n\tvar cparams = blob.read_shift(1), tab = opts && opts.biff <= 3 ? [(type == 0x58 ? -1 : 0), blob.read_shift(1)]: parsetab(blob);\n\treturn [cparams, (tab[0] === 0 ? Ftab : Cetab)[tab[1]]];\n}\n\nfunction parsetab(blob) {\n\treturn [blob[blob.l+1]>>7, blob.read_shift(2) & 0x7FFF];\n}\n\n/* [MS-XLS] 2.5.198.41 ; [MS-XLSB] 2.5.97.33 */\nfunction parse_PtgAttrSum(blob, length, opts) {\n\tblob.l += opts && opts.biff == 2 ? 3 : 4; return;\n}\n\n/* [MS-XLS] 2.5.198.58 ; [MS-XLSB] 2.5.97.40 */\nfunction parse_PtgExp(blob, length, opts) {\n\tblob.l++;\n\tif(opts && opts.biff == 12) return [blob.read_shift(4, 'i'), 0];\n\tvar row = blob.read_shift(2);\n\tvar col = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);\n\treturn [row, col];\n}\n\n/* [MS-XLS] 2.5.198.57 ; [MS-XLSB] 2.5.97.39 */\nfunction parse_PtgErr(blob) { blob.l++; return BErr[blob.read_shift(1)]; }\n\n/* [MS-XLS] 2.5.198.66 ; [MS-XLSB] 2.5.97.49 */\nfunction parse_PtgInt(blob) { blob.l++; return blob.read_shift(2); }\n\n/* [MS-XLS] 2.5.198.42 ; [MS-XLSB] 2.5.97.34 */\nfunction parse_PtgBool(blob) { blob.l++; return blob.read_shift(1)!==0;}\n\n/* [MS-XLS] 2.5.198.79 ; [MS-XLSB] 2.5.97.63 */\nfunction parse_PtgNum(blob) { blob.l++; return parse_Xnum(blob, 8); }\n\n/* [MS-XLS] 2.5.198.89 ; [MS-XLSB] 2.5.97.74 */\nfunction parse_PtgStr(blob, length, opts) { blob.l++; return parse_ShortXLUnicodeString(blob, length-1, opts); }\n\n/* [MS-XLS] 2.5.192.112 + 2.5.192.11{3,4,5,6,7} */\n/* [MS-XLSB] 2.5.97.93 + 2.5.97.9{4,5,6,7} */\nfunction parse_SerAr(blob, biff) {\n\tvar val = [blob.read_shift(1)];\n\tif(biff == 12) switch(val[0]) {\n\t\tcase 0x02: val[0] = 0x04; break; /* SerBool */\n\t\tcase 0x04: val[0] = 0x10; break; /* SerErr */\n\t\tcase 0x00: val[0] = 0x01; break; /* SerNum */\n\t\tcase 0x01: val[0] = 0x02; break; /* SerStr */\n\t}\n\tswitch(val[0]) {\n\t\tcase 0x04: /* SerBool -- boolean */\n\t\t\tval[1] = parsebool(blob, 1) ? 'TRUE' : 'FALSE';\n\t\t\tif(biff != 12) blob.l += 7; break;\n\t\tcase 0x25: /* appears to be an alias */\n\t\tcase 0x10: /* SerErr -- error */\n\t\t\tval[1] = BErr[blob[blob.l]];\n\t\t\tblob.l += ((biff == 12) ? 4 : 8); break;\n\t\tcase 0x00: /* SerNil -- honestly, I'm not sure how to reproduce this */\n\t\t\tblob.l += 8; break;\n\t\tcase 0x01: /* SerNum -- Xnum */\n\t\t\tval[1] = parse_Xnum(blob, 8); break;\n\t\tcase 0x02: /* SerStr -- XLUnicodeString (<256 chars) */\n\t\t\tval[1] = parse_XLUnicodeString2(blob, 0, {biff:biff > 0 && biff < 8 ? 2 : biff}); break;\n\t\tdefault: throw new Error(\"Bad SerAr: \" + val[0]); /* Unreachable */\n\t}\n\treturn val;\n}\n\n/* [MS-XLS] 2.5.198.61 ; [MS-XLSB] 2.5.97.44 */\nfunction parse_PtgExtraMem(blob, cce, opts) {\n\tvar count = blob.read_shift((opts.biff == 12) ? 4 : 2);\n\tvar out = [];\n\tfor(var i = 0; i != count; ++i) out.push(((opts.biff == 12) ? parse_UncheckedRfX : parse_Ref8U)(blob, 8));\n\treturn out;\n}\n\n/* [MS-XLS] 2.5.198.59 ; [MS-XLSB] 2.5.97.41 */\nfunction parse_PtgExtraArray(blob, length, opts) {\n\tvar rows = 0, cols = 0;\n\tif(opts.biff == 12) {\n\t\trows = blob.read_shift(4); // DRw\n\t\tcols = blob.read_shift(4); // DCol\n\t} else {\n\t\tcols = 1 + blob.read_shift(1); //DColByteU\n\t\trows = 1 + blob.read_shift(2); //DRw\n\t}\n\tif(opts.biff >= 2 && opts.biff < 8) { --rows; if(--cols == 0) cols = 0x100; }\n\t// $FlowIgnore\n\tfor(var i = 0, o = []; i != rows && (o[i] = []); ++i)\n\t\tfor(var j = 0; j != cols; ++j) o[i][j] = parse_SerAr(blob, opts.biff);\n\treturn o;\n}\n\n/* [MS-XLS] 2.5.198.76 ; [MS-XLSB] 2.5.97.60 */\nfunction parse_PtgName(blob, length, opts) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar w = (!opts || (opts.biff >= 8)) ? 4 : 2;\n\tvar nameindex = blob.read_shift(w);\n\tswitch(opts.biff) {\n\t\tcase 2: blob.l += 5; break;\n\t\tcase 3: case 4: blob.l += 8; break;\n\t\tcase 5: blob.l += 12; break;\n\t}\n\treturn [type, 0, nameindex];\n}\n\n/* [MS-XLS] 2.5.198.77 ; [MS-XLSB] 2.5.97.61 */\nfunction parse_PtgNameX(blob, length, opts) {\n\tif(opts.biff == 5) return parse_PtgNameX_BIFF5(blob, length, opts);\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar ixti = blob.read_shift(2); // XtiIndex\n\tvar nameindex = blob.read_shift(4);\n\treturn [type, ixti, nameindex];\n}\nfunction parse_PtgNameX_BIFF5(blob) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar ixti = blob.read_shift(2, 'i'); // XtiIndex\n\tblob.l += 8;\n\tvar nameindex = blob.read_shift(2);\n\tblob.l += 12;\n\treturn [type, ixti, nameindex];\n}\n\n/* [MS-XLS] 2.5.198.70 ; [MS-XLSB] 2.5.97.54 */\nfunction parse_PtgMemArea(blob, length, opts) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tblob.l += (opts && opts.biff == 2 ? 3 : 4);\n\tvar cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);\n\treturn [type, cce];\n}\n\n/* [MS-XLS] 2.5.198.72 ; [MS-XLSB] 2.5.97.56 */\nfunction parse_PtgMemFunc(blob, length, opts) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);\n\treturn [type, cce];\n}\n\n\n/* [MS-XLS] 2.5.198.86 ; [MS-XLSB] 2.5.97.69 */\nfunction parse_PtgRefErr(blob, length, opts) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tblob.l += 4;\n\tif(opts.biff < 8) blob.l--;\n\tif(opts.biff == 12) blob.l += 2;\n\treturn [type];\n}\n\n/* [MS-XLS] 2.5.198.87 ; [MS-XLSB] 2.5.97.71 */\nfunction parse_PtgRefErr3d(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar ixti = blob.read_shift(2);\n\tvar w = 4;\n\tif(opts) switch(opts.biff) {\n\t\tcase 5: w = 15; break;\n\t\tcase 12: w = 6; break;\n\t}\n\tblob.l += w;\n\treturn [type, ixti];\n}\n\n/* [MS-XLS] 2.5.198.71 ; [MS-XLSB] 2.5.97.55 */\nvar parse_PtgMemErr = parsenoop;\n/* [MS-XLS] 2.5.198.73 ; [MS-XLSB] 2.5.97.57 */\nvar parse_PtgMemNoMem = parsenoop;\n/* [MS-XLS] 2.5.198.92 */\nvar parse_PtgTbl = parsenoop;\n\nfunction parse_PtgElfLoc(blob, length, opts) {\n\tblob.l += 2;\n\treturn [parse_RgceElfLoc(blob, 4, opts)];\n}\nfunction parse_PtgElfNoop(blob) {\n\tblob.l += 6;\n\treturn [];\n}\n/* [MS-XLS] 2.5.198.46 */\nvar parse_PtgElfCol = parse_PtgElfLoc;\n/* [MS-XLS] 2.5.198.47 */\nvar parse_PtgElfColS = parse_PtgElfNoop;\n/* [MS-XLS] 2.5.198.48 */\nvar parse_PtgElfColSV = parse_PtgElfNoop;\n/* [MS-XLS] 2.5.198.49 */\nvar parse_PtgElfColV = parse_PtgElfLoc;\n/* [MS-XLS] 2.5.198.50 */\nfunction parse_PtgElfLel(blob) {\n\tblob.l += 2;\n\treturn [parseuint16(blob), blob.read_shift(2) & 0x01];\n}\n/* [MS-XLS] 2.5.198.51 */\nvar parse_PtgElfRadical = parse_PtgElfLoc;\n/* [MS-XLS] 2.5.198.52 */\nvar parse_PtgElfRadicalLel = parse_PtgElfLel;\n/* [MS-XLS] 2.5.198.53 */\nvar parse_PtgElfRadicalS = parse_PtgElfNoop;\n/* [MS-XLS] 2.5.198.54 */\nvar parse_PtgElfRw = parse_PtgElfLoc;\n/* [MS-XLS] 2.5.198.55 */\nvar parse_PtgElfRwV = parse_PtgElfLoc;\n\n/* [MS-XLSB] 2.5.97.52 TODO */\nvar PtgListRT = [\n\t\"Data\",\n\t\"All\",\n\t\"Headers\",\n\t\"??\",\n\t\"?Data2\",\n\t\"??\",\n\t\"?DataHeaders\",\n\t\"??\",\n\t\"Totals\",\n\t\"??\",\n\t\"??\",\n\t\"??\",\n\t\"?DataTotals\",\n\t\"??\",\n\t\"??\",\n\t\"??\",\n\t\"?Current\"\n];\nfunction parse_PtgList(blob) {\n\tblob.l += 2;\n\tvar ixti = blob.read_shift(2);\n\tvar flags = blob.read_shift(2);\n\tvar idx = blob.read_shift(4);\n\tvar c = blob.read_shift(2);\n\tvar C = blob.read_shift(2);\n\tvar rt = PtgListRT[(flags >> 2) & 0x1F];\n\treturn {ixti: ixti, coltype:(flags&0x3), rt:rt, idx:idx, c:c, C:C};\n}\n/* [MS-XLS] 2.5.198.91 ; [MS-XLSB] 2.5.97.76 */\nfunction parse_PtgSxName(blob) {\n\tblob.l += 2;\n\treturn [blob.read_shift(4)];\n}\n\n/* [XLS] old spec */\nfunction parse_PtgSheet(blob, length, opts) {\n\tblob.l += 5;\n\tblob.l += 2;\n\tblob.l += (opts.biff == 2 ? 1 : 4);\n\treturn [\"PTGSHEET\"];\n}\nfunction parse_PtgEndSheet(blob, length, opts) {\n\tblob.l += (opts.biff == 2 ? 4 : 5);\n\treturn [\"PTGENDSHEET\"];\n}\nfunction parse_PtgMemAreaN(blob) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar cce = blob.read_shift(2);\n\treturn [type, cce];\n}\nfunction parse_PtgMemNoMemN(blob) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar cce = blob.read_shift(2);\n\treturn [type, cce];\n}\nfunction parse_PtgAttrNoop(blob) {\n\tblob.l += 4;\n\treturn [0, 0];\n}\n\n/* [MS-XLS] 2.5.198.25 ; [MS-XLSB] 2.5.97.16 */\nvar PtgTypes = {\n0x01: { n:'PtgExp', f:parse_PtgExp },\n0x02: { n:'PtgTbl', f:parse_PtgTbl },\n0x03: { n:'PtgAdd', f:parseread1 },\n0x04: { n:'PtgSub', f:parseread1 },\n0x05: { n:'PtgMul', f:parseread1 },\n0x06: { n:'PtgDiv', f:parseread1 },\n0x07: { n:'PtgPower', f:parseread1 },\n0x08: { n:'PtgConcat', f:parseread1 },\n0x09: { n:'PtgLt', f:parseread1 },\n0x0A: { n:'PtgLe', f:parseread1 },\n0x0B: { n:'PtgEq', f:parseread1 },\n0x0C: { n:'PtgGe', f:parseread1 },\n0x0D: { n:'PtgGt', f:parseread1 },\n0x0E: { n:'PtgNe', f:parseread1 },\n0x0F: { n:'PtgIsect', f:parseread1 },\n0x10: { n:'PtgUnion', f:parseread1 },\n0x11: { n:'PtgRange', f:parseread1 },\n0x12: { n:'PtgUplus', f:parseread1 },\n0x13: { n:'PtgUminus', f:parseread1 },\n0x14: { n:'PtgPercent', f:parseread1 },\n0x15: { n:'PtgParen', f:parseread1 },\n0x16: { n:'PtgMissArg', f:parseread1 },\n0x17: { n:'PtgStr', f:parse_PtgStr },\n0x1A: { n:'PtgSheet', f:parse_PtgSheet },\n0x1B: { n:'PtgEndSheet', f:parse_PtgEndSheet },\n0x1C: { n:'PtgErr', f:parse_PtgErr },\n0x1D: { n:'PtgBool', f:parse_PtgBool },\n0x1E: { n:'PtgInt', f:parse_PtgInt },\n0x1F: { n:'PtgNum', f:parse_PtgNum },\n0x20: { n:'PtgArray', f:parse_PtgArray },\n0x21: { n:'PtgFunc', f:parse_PtgFunc },\n0x22: { n:'PtgFuncVar', f:parse_PtgFuncVar },\n0x23: { n:'PtgName', f:parse_PtgName },\n0x24: { n:'PtgRef', f:parse_PtgRef },\n0x25: { n:'PtgArea', f:parse_PtgArea },\n0x26: { n:'PtgMemArea', f:parse_PtgMemArea },\n0x27: { n:'PtgMemErr', f:parse_PtgMemErr },\n0x28: { n:'PtgMemNoMem', f:parse_PtgMemNoMem },\n0x29: { n:'PtgMemFunc', f:parse_PtgMemFunc },\n0x2A: { n:'PtgRefErr', f:parse_PtgRefErr },\n0x2B: { n:'PtgAreaErr', f:parse_PtgAreaErr },\n0x2C: { n:'PtgRefN', f:parse_PtgRefN },\n0x2D: { n:'PtgAreaN', f:parse_PtgAreaN },\n0x2E: { n:'PtgMemAreaN', f:parse_PtgMemAreaN },\n0x2F: { n:'PtgMemNoMemN', f:parse_PtgMemNoMemN },\n0x39: { n:'PtgNameX', f:parse_PtgNameX },\n0x3A: { n:'PtgRef3d', f:parse_PtgRef3d },\n0x3B: { n:'PtgArea3d', f:parse_PtgArea3d },\n0x3C: { n:'PtgRefErr3d', f:parse_PtgRefErr3d },\n0x3D: { n:'PtgAreaErr3d', f:parse_PtgAreaErr3d },\n0xFF: {}\n};\n/* These are duplicated in the PtgTypes table */\nvar PtgDupes = {\n0x40: 0x20, 0x60: 0x20,\n0x41: 0x21, 0x61: 0x21,\n0x42: 0x22, 0x62: 0x22,\n0x43: 0x23, 0x63: 0x23,\n0x44: 0x24, 0x64: 0x24,\n0x45: 0x25, 0x65: 0x25,\n0x46: 0x26, 0x66: 0x26,\n0x47: 0x27, 0x67: 0x27,\n0x48: 0x28, 0x68: 0x28,\n0x49: 0x29, 0x69: 0x29,\n0x4A: 0x2A, 0x6A: 0x2A,\n0x4B: 0x2B, 0x6B: 0x2B,\n0x4C: 0x2C, 0x6C: 0x2C,\n0x4D: 0x2D, 0x6D: 0x2D,\n0x4E: 0x2E, 0x6E: 0x2E,\n0x4F: 0x2F, 0x6F: 0x2F,\n0x58: 0x22, 0x78: 0x22,\n0x59: 0x39, 0x79: 0x39,\n0x5A: 0x3A, 0x7A: 0x3A,\n0x5B: 0x3B, 0x7B: 0x3B,\n0x5C: 0x3C, 0x7C: 0x3C,\n0x5D: 0x3D, 0x7D: 0x3D\n};\n(function(){for(var y in PtgDupes) PtgTypes[y] = PtgTypes[PtgDupes[y]];})();\n\nvar Ptg18 = {\n0x01: { n:'PtgElfLel', f:parse_PtgElfLel },\n0x02: { n:'PtgElfRw', f:parse_PtgElfRw },\n0x03: { n:'PtgElfCol', f:parse_PtgElfCol },\n0x06: { n:'PtgElfRwV', f:parse_PtgElfRwV },\n0x07: { n:'PtgElfColV', f:parse_PtgElfColV },\n0x0A: { n:'PtgElfRadical', f:parse_PtgElfRadical },\n0x0B: { n:'PtgElfRadicalS', f:parse_PtgElfRadicalS },\n0x0D: { n:'PtgElfColS', f:parse_PtgElfColS },\n0x0F: { n:'PtgElfColSV', f:parse_PtgElfColSV },\n0x10: { n:'PtgElfRadicalLel', f:parse_PtgElfRadicalLel },\n0x19: { n:'PtgList', f:parse_PtgList },\n0x1D: { n:'PtgSxName', f:parse_PtgSxName },\n0xFF: {}\n};\nvar Ptg19 = {\n0x00: { n:'PtgAttrNoop', f:parse_PtgAttrNoop },\n0x01: { n:'PtgAttrSemi', f:parse_PtgAttrSemi },\n0x02: { n:'PtgAttrIf', f:parse_PtgAttrIf },\n0x04: { n:'PtgAttrChoose', f:parse_PtgAttrChoose },\n0x08: { n:'PtgAttrGoto', f:parse_PtgAttrGoto },\n0x10: { n:'PtgAttrSum', f:parse_PtgAttrSum },\n0x20: { n:'PtgAttrBaxcel', f:parse_PtgAttrBaxcel },\n0x40: { n:'PtgAttrSpace', f:parse_PtgAttrSpace },\n0x41: { n:'PtgAttrSpaceSemi', f:parse_PtgAttrSpaceSemi },\n0x80: { n:'PtgAttrIfError', f:parse_PtgAttrIfError },\n0xFF: {}\n};\nPtg19[0x21] = Ptg19[0x20];\n\n/* [MS-XLS] 2.5.198.103 ; [MS-XLSB] 2.5.97.87 */\nfunction parse_RgbExtra(blob, length, rgce, opts) {\n\tif(opts.biff < 8) return parsenoop(blob, length);\n\tvar target = blob.l + length;\n\tvar o = [];\n\tfor(var i = 0; i !== rgce.length; ++i) {\n\t\tswitch(rgce[i][0]) {\n\t\t\tcase 'PtgArray': /* PtgArray -> PtgExtraArray */\n\t\t\t\trgce[i][1] = parse_PtgExtraArray(blob, 0, opts);\n\t\t\t\to.push(rgce[i][1]);\n\t\t\t\tbreak;\n\t\t\tcase 'PtgMemArea': /* PtgMemArea -> PtgExtraMem */\n\t\t\t\trgce[i][2] = parse_PtgExtraMem(blob, rgce[i][1], opts);\n\t\t\t\to.push(rgce[i][2]);\n\t\t\t\tbreak;\n\t\t\tcase 'PtgExp': /* PtgExp -> PtgExtraCol */\n\t\t\t\tif(opts && opts.biff == 12) {\n\t\t\t\t\trgce[i][1][1] = blob.read_shift(4);\n\t\t\t\t\to.push(rgce[i][1]);\n\t\t\t\t} break;\n\t\t\tcase 'PtgList': /* TODO: PtgList -> PtgExtraList */\n\t\t\tcase 'PtgElfRadicalS': /* TODO: PtgElfRadicalS -> PtgExtraElf */\n\t\t\tcase 'PtgElfColS': /* TODO: PtgElfColS -> PtgExtraElf */\n\t\t\tcase 'PtgElfColSV': /* TODO: PtgElfColSV -> PtgExtraElf */\n\t\t\t\tthrow \"Unsupported \" + rgce[i][0];\n\t\t\tdefault: break;\n\t\t}\n\t}\n\tlength = target - blob.l;\n\t/* note: this is technically an error but Excel disregards */\n\t//if(target !== blob.l && blob.l !== target - length) throw new Error(target + \" != \" + blob.l);\n\tif(length !== 0) o.push(parsenoop(blob, length));\n\treturn o;\n}\n\n/* [MS-XLS] 2.5.198.104 ; [MS-XLSB] 2.5.97.88 */\nfunction parse_Rgce(blob, length, opts) {\n\tvar target = blob.l + length;\n\tvar R, id, ptgs = [];\n\twhile(target != blob.l) {\n\t\tlength = target - blob.l;\n\t\tid = blob[blob.l];\n\t\tR = PtgTypes[id];\n\t\tif(id === 0x18 || id === 0x19) R = (id === 0x18 ? Ptg18 : Ptg19)[blob[blob.l + 1]];\n\t\tif(!R || !R.f) { /*ptgs.push*/(parsenoop(blob, length)); }\n\t\telse { ptgs.push([R.n, R.f(blob, length, opts)]); }\n\t}\n\treturn ptgs;\n}\n\nfunction stringify_array(f) {\n\tvar o = [];\n\tfor(var i = 0; i < f.length; ++i) {\n\t\tvar x = f[i], r = [];\n\t\tfor(var j = 0; j < x.length; ++j) {\n\t\t\tvar y = x[j];\n\t\t\tif(y) switch(y[0]) {\n\t\t\t\t// TODO: handle embedded quotes\n\t\t\t\tcase 0x02:\nr.push('\"' + y[1].replace(/\"/g,'\"\"') + '\"'); break;\n\t\t\t\tdefault: r.push(y[1]);\n\t\t\t} else r.push(\"\");\n\t\t}\n\t\to.push(r.join(\",\"));\n\t}\n\treturn o.join(\";\");\n}\n\n/* [MS-XLS] 2.2.2 ; [MS-XLSB] 2.2.2 TODO */\nvar PtgBinOp = {\n\tPtgAdd: \"+\",\n\tPtgConcat: \"&\",\n\tPtgDiv: \"/\",\n\tPtgEq: \"=\",\n\tPtgGe: \">=\",\n\tPtgGt: \">\",\n\tPtgLe: \"<=\",\n\tPtgLt: \"<\",\n\tPtgMul: \"*\",\n\tPtgNe: \"<>\",\n\tPtgPower: \"^\",\n\tPtgSub: \"-\"\n};\n\n// List of invalid characters needs to be tested further\nvar quoteCharacters = new RegExp(/[^\\w\\u4E00-\\u9FFF\\u3040-\\u30FF]/);\nfunction formula_quote_sheet_name(sname, opts) {\n\tif(!sname && !(opts && opts.biff <= 5 && opts.biff >= 2)) throw new Error(\"empty sheet name\");\n\tif (quoteCharacters.test(sname)) return \"'\" + sname + \"'\";\n\treturn sname;\n}\nfunction get_ixti_raw(supbooks, ixti, opts) {\n\tif(!supbooks) return \"SH33TJSERR0\";\n\tif(opts.biff > 8 && (!supbooks.XTI || !supbooks.XTI[ixti])) return supbooks.SheetNames[ixti];\n\tif(!supbooks.XTI) return \"SH33TJSERR6\";\n\tvar XTI = supbooks.XTI[ixti];\n\tif(opts.biff < 8) {\n\t\tif(ixti > 10000) ixti-= 65536;\n\t\tif(ixti < 0) ixti = -ixti;\n\t\treturn ixti == 0 ? \"\" : supbooks.XTI[ixti - 1];\n\t}\n\tif(!XTI) return \"SH33TJSERR1\";\n\tvar o = \"\";\n\tif(opts.biff > 8) switch(supbooks[XTI[0]][0]) {\n\t\tcase 0x0165: /* 'BrtSupSelf' */\n\t\t\to = XTI[1] == -1 ? \"#REF\" : supbooks.SheetNames[XTI[1]];\n\t\t\treturn XTI[1] == XTI[2] ? o : o + \":\" + supbooks.SheetNames[XTI[2]];\n\t\tcase 0x0166: /* 'BrtSupSame' */\n\t\t\tif(opts.SID != null) return supbooks.SheetNames[opts.SID];\n\t\t\treturn \"SH33TJSSAME\" + supbooks[XTI[0]][0];\n\t\tcase 0x0163: /* 'BrtSupBookSrc' */\n\t\t\t/* falls through */\n\t\tdefault: return \"SH33TJSSRC\" + supbooks[XTI[0]][0];\n\t}\n\tswitch(supbooks[XTI[0]][0][0]) {\n\t\tcase 0x0401:\n\t\t\to = XTI[1] == -1 ? \"#REF\" : (supbooks.SheetNames[XTI[1]] || \"SH33TJSERR3\");\n\t\t\treturn XTI[1] == XTI[2] ? o : o + \":\" + supbooks.SheetNames[XTI[2]];\n\t\tcase 0x3A01: return supbooks[XTI[0]].slice(1).map(function(name) { return name.Name; }).join(\";;\"); //return \"SH33TJSERR8\";\n\t\tdefault:\n\t\t\tif(!supbooks[XTI[0]][0][3]) return \"SH33TJSERR2\";\n\t\t\to = XTI[1] == -1 ? \"#REF\" : (supbooks[XTI[0]][0][3][XTI[1]] || \"SH33TJSERR4\");\n\t\t\treturn XTI[1] == XTI[2] ? o : o + \":\" + supbooks[XTI[0]][0][3][XTI[2]];\n\t}\n}\nfunction get_ixti(supbooks, ixti, opts) {\n\tvar ixtiraw = get_ixti_raw(supbooks, ixti, opts);\n\treturn ixtiraw == \"#REF\" ? ixtiraw : formula_quote_sheet_name(ixtiraw, opts);\n}\nfunction stringify_formula(formula/*Array*/, range, cell, supbooks, opts) {\n\tvar biff = (opts && opts.biff) || 8;\n\tvar _range = /*range != null ? range :*/ {s:{c:0, r:0},e:{c:0, r:0}};\n\tvar stack = [], e1, e2, c, ixti=0, nameidx=0, r, sname=\"\";\n\tif(!formula[0] || !formula[0][0]) return \"\";\n\tvar last_sp = -1, sp = \"\";\n\tfor(var ff = 0, fflen = formula[0].length; ff < fflen; ++ff) {\n\t\tvar f = formula[0][ff];\n\t\tswitch(f[0]) {\n\t\t\tcase 'PtgUminus': /* [MS-XLS] 2.5.198.93 */\n\t\t\t\tstack.push(\"-\" + stack.pop()); break;\n\t\t\tcase 'PtgUplus': /* [MS-XLS] 2.5.198.95 */\n\t\t\t\tstack.push(\"+\" + stack.pop()); break;\n\t\t\tcase 'PtgPercent': /* [MS-XLS] 2.5.198.81 */\n\t\t\t\tstack.push(stack.pop() + \"%\"); break;\n\n\t\t\tcase 'PtgAdd': /* [MS-XLS] 2.5.198.26 */\n\t\t\tcase 'PtgConcat': /* [MS-XLS] 2.5.198.43 */\n\t\t\tcase 'PtgDiv': /* [MS-XLS] 2.5.198.45 */\n\t\t\tcase 'PtgEq': /* [MS-XLS] 2.5.198.56 */\n\t\t\tcase 'PtgGe': /* [MS-XLS] 2.5.198.64 */\n\t\t\tcase 'PtgGt': /* [MS-XLS] 2.5.198.65 */\n\t\t\tcase 'PtgLe': /* [MS-XLS] 2.5.198.68 */\n\t\t\tcase 'PtgLt': /* [MS-XLS] 2.5.198.69 */\n\t\t\tcase 'PtgMul': /* [MS-XLS] 2.5.198.75 */\n\t\t\tcase 'PtgNe': /* [MS-XLS] 2.5.198.78 */\n\t\t\tcase 'PtgPower': /* [MS-XLS] 2.5.198.82 */\n\t\t\tcase 'PtgSub': /* [MS-XLS] 2.5.198.90 */\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tif(last_sp >= 0) {\n\t\t\t\t\tswitch(formula[0][last_sp][1][0]) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\t\tsp = fill(\" \", formula[0][last_sp][1][1]); break;\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\t\tsp = fill(\"\\r\", formula[0][last_sp][1][1]); break;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tsp = \"\";\n\t\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\t\tif(opts.WTF) throw new Error(\"Unexpected PtgAttrSpaceType \" + formula[0][last_sp][1][0]);\n\t\t\t\t\t}\n\t\t\t\t\te2 = e2 + sp;\n\t\t\t\t\tlast_sp = -1;\n\t\t\t\t}\n\t\t\t\tstack.push(e2+PtgBinOp[f[0]]+e1);\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgIsect': /* [MS-XLS] 2.5.198.67 */\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\" \"+e1);\n\t\t\t\tbreak;\n\t\t\tcase 'PtgUnion': /* [MS-XLS] 2.5.198.94 */\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\",\"+e1);\n\t\t\t\tbreak;\n\t\t\tcase 'PtgRange': /* [MS-XLS] 2.5.198.83 */\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\":\"+e1);\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgAttrChoose': /* [MS-XLS] 2.5.198.34 */\n\t\t\t\tbreak;\n\t\t\tcase 'PtgAttrGoto': /* [MS-XLS] 2.5.198.35 */\n\t\t\t\tbreak;\n\t\t\tcase 'PtgAttrIf': /* [MS-XLS] 2.5.198.36 */\n\t\t\t\tbreak;\n\t\t\tcase 'PtgAttrIfError': /* [MS-XLSB] 2.5.97.28 */\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'PtgRef': /* [MS-XLS] 2.5.198.84 */\nc = shift_cell_xls((f[1][1]), _range, opts);\n\t\t\t\tstack.push(encode_cell_xls(c, biff));\n\t\t\t\tbreak;\n\t\t\tcase 'PtgRefN': /* [MS-XLS] 2.5.198.88 */\nc = cell ? shift_cell_xls((f[1][1]), cell, opts) : (f[1][1]);\n\t\t\t\tstack.push(encode_cell_xls(c, biff));\n\t\t\t\tbreak;\n\t\t\tcase 'PtgRef3d': /* [MS-XLS] 2.5.198.85 */\nixti = f[1][1]; c = shift_cell_xls((f[1][2]), _range, opts);\n\t\t\t\tsname = get_ixti(supbooks, ixti, opts);\n\t\t\t\tvar w = sname; /* IE9 fails on defined names */ // eslint-disable-line no-unused-vars\n\t\t\t\tstack.push(sname + \"!\" + encode_cell_xls(c, biff));\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgFunc': /* [MS-XLS] 2.5.198.62 */\n\t\t\tcase 'PtgFuncVar': /* [MS-XLS] 2.5.198.63 */\n\t\t\t\t/* f[1] = [argc, func, type] */\n\t\t\t\tvar argc = (f[1][0]), func = (f[1][1]);\n\t\t\t\tif(!argc) argc = 0;\n\t\t\t\targc &= 0x7F;\n\t\t\t\tvar args = argc == 0 ? [] : stack.slice(-argc);\n\t\t\t\tstack.length -= argc;\n\t\t\t\tif(func === 'User') func = args.shift();\n\t\t\t\tstack.push(func + \"(\" + args.join(\",\") + \")\");\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgBool': /* [MS-XLS] 2.5.198.42 */\n\t\t\t\tstack.push(f[1] ? \"TRUE\" : \"FALSE\"); break;\n\t\t\tcase 'PtgInt': /* [MS-XLS] 2.5.198.66 */\n\t\t\t\tstack.push(f[1]); break;\n\t\t\tcase 'PtgNum': /* [MS-XLS] 2.5.198.79 TODO: precision? */\n\t\t\t\tstack.push(String(f[1])); break;\n\t\t\tcase 'PtgStr': /* [MS-XLS] 2.5.198.89 */\n\t\t\t\t// $FlowIgnore\n\t\t\t\tstack.push('\"' + f[1].replace(/\"/g, '\"\"') + '\"'); break;\n\t\t\tcase 'PtgErr': /* [MS-XLS] 2.5.198.57 */\n\t\t\t\tstack.push(f[1]); break;\n\t\t\tcase 'PtgAreaN': /* [MS-XLS] 2.5.198.31 TODO */\nr = shift_range_xls(f[1][1], cell ? {s:cell} : _range, opts);\n\t\t\t\tstack.push(encode_range_xls((r), opts));\n\t\t\t\tbreak;\n\t\t\tcase 'PtgArea': /* [MS-XLS] 2.5.198.27 TODO: fixed points */\nr = shift_range_xls(f[1][1], _range, opts);\n\t\t\t\tstack.push(encode_range_xls((r), opts));\n\t\t\t\tbreak;\n\t\t\tcase 'PtgArea3d': /* [MS-XLS] 2.5.198.28 TODO */\nixti = f[1][1]; r = f[1][2];\n\t\t\t\tsname = get_ixti(supbooks, ixti, opts);\n\t\t\t\tstack.push(sname + \"!\" + encode_range_xls((r), opts));\n\t\t\t\tbreak;\n\t\t\tcase 'PtgAttrSum': /* [MS-XLS] 2.5.198.41 */\n\t\t\t\tstack.push(\"SUM(\" + stack.pop() + \")\");\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgAttrBaxcel': /* [MS-XLS] 2.5.198.33 */\n\t\t\tcase 'PtgAttrSemi': /* [MS-XLS] 2.5.198.37 */\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgName': /* [MS-XLS] 2.5.198.76 ; [MS-XLSB] 2.5.97.60 TODO: revisions */\n\t\t\t\t/* f[1] = type, 0, nameindex */\n\t\t\t\tnameidx = (f[1][2]);\n\t\t\t\tvar lbl = (supbooks.names||[])[nameidx-1] || (supbooks[0]||[])[nameidx];\n\t\t\t\tvar name = lbl ? lbl.Name : \"SH33TJSNAME\" + String(nameidx);\n\t\t\t\tif(name in XLSXFutureFunctions) name = XLSXFutureFunctions[name];\n\t\t\t\tstack.push(name);\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgNameX': /* [MS-XLS] 2.5.198.77 ; [MS-XLSB] 2.5.97.61 TODO: revisions */\n\t\t\t\t/* f[1] = type, ixti, nameindex */\n\t\t\t\tvar bookidx = (f[1][1]); nameidx = (f[1][2]); var externbook;\n\t\t\t\t/* TODO: Properly handle missing values -- this should be using get_ixti_raw primarily */\n\t\t\t\tif(opts.biff <= 5) {\n\t\t\t\t\tif(bookidx < 0) bookidx = -bookidx;\n\t\t\t\t\tif(supbooks[bookidx]) externbook = supbooks[bookidx][nameidx];\n\t\t\t\t} else {\n\t\t\t\t\tvar o = \"\";\n\t\t\t\t\tif(((supbooks[bookidx]||[])[0]||[])[0] == 0x3A01){/* empty */}\n\t\t\t\t\telse if(((supbooks[bookidx]||[])[0]||[])[0] == 0x0401){\n\t\t\t\t\t\tif(supbooks[bookidx][nameidx] && supbooks[bookidx][nameidx].itab > 0) {\n\t\t\t\t\t\t\to = supbooks.SheetNames[supbooks[bookidx][nameidx].itab-1] + \"!\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse o = supbooks.SheetNames[nameidx-1]+ \"!\";\n\t\t\t\t\tif(supbooks[bookidx] && supbooks[bookidx][nameidx]) o += supbooks[bookidx][nameidx].Name;\n\t\t\t\t\telse if(supbooks[0] && supbooks[0][nameidx]) o += supbooks[0][nameidx].Name;\n\t\t\t\t\telse {\n\t\t\t\t\t\tvar ixtidata = (get_ixti_raw(supbooks, bookidx, opts)||\"\").split(\";;\");\n\t\t\t\t\t\tif(ixtidata[nameidx - 1]) o = ixtidata[nameidx - 1]; // TODO: confirm this is correct\n\t\t\t\t\t\telse o += \"SH33TJSERRX\";\n\t\t\t\t\t}\n\t\t\t\t\tstack.push(o);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(!externbook) externbook = {Name: \"SH33TJSERRY\"};\n\t\t\t\tstack.push(externbook.Name);\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgParen': /* [MS-XLS] 2.5.198.80 */\n\t\t\t\tvar lp = '(', rp = ')';\n\t\t\t\tif(last_sp >= 0) {\n\t\t\t\t\tsp = \"\";\n\t\t\t\t\tswitch(formula[0][last_sp][1][0]) {\n\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\tcase 2: lp = fill(\" \", formula[0][last_sp][1][1]) + lp; break;\n\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\tcase 3: lp = fill(\"\\r\", formula[0][last_sp][1][1]) + lp; break;\n\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\tcase 4: rp = fill(\" \", formula[0][last_sp][1][1]) + rp; break;\n\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\tcase 5: rp = fill(\"\\r\", formula[0][last_sp][1][1]) + rp; break;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\t\tif(opts.WTF) throw new Error(\"Unexpected PtgAttrSpaceType \" + formula[0][last_sp][1][0]);\n\t\t\t\t\t}\n\t\t\t\t\tlast_sp = -1;\n\t\t\t\t}\n\t\t\t\tstack.push(lp + stack.pop() + rp); break;\n\n\t\t\tcase 'PtgRefErr': /* [MS-XLS] 2.5.198.86 */\n\t\t\t\tstack.push('#REF!'); break;\n\n\t\t\tcase 'PtgRefErr3d': /* [MS-XLS] 2.5.198.87 */\n\t\t\t\tstack.push('#REF!'); break;\n\n\t\t\tcase 'PtgExp': /* [MS-XLS] 2.5.198.58 TODO */\n\t\t\t\tc = {c:(f[1][1]),r:(f[1][0])};\n\t\t\t\tvar q = ({c: cell.c, r:cell.r});\n\t\t\t\tif(supbooks.sharedf[encode_cell(c)]) {\n\t\t\t\t\tvar parsedf = (supbooks.sharedf[encode_cell(c)]);\n\t\t\t\t\tstack.push(stringify_formula(parsedf, _range, q, supbooks, opts));\n\t\t\t\t} else {\n\t\t\t\t\tvar fnd = false;\n\t\t\t\t\tfor(e1=0;e1!=supbooks.arrayf.length; ++e1) {\n\t\t\t\t\t\t/* TODO: should be something like range_has */\n\t\t\t\t\t\te2 = supbooks.arrayf[e1];\n\t\t\t\t\t\tif(c.c < e2[0].s.c || c.c > e2[0].e.c) continue;\n\t\t\t\t\t\tif(c.r < e2[0].s.r || c.r > e2[0].e.r) continue;\n\t\t\t\t\t\tstack.push(stringify_formula(e2[1], _range, q, supbooks, opts));\n\t\t\t\t\t\tfnd = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif(!fnd) stack.push(f[1]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgArray': /* [MS-XLS] 2.5.198.32 TODO */\n\t\t\t\tstack.push(\"{\" + stringify_array(f[1]) + \"}\");\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgMemArea': /* [MS-XLS] 2.5.198.70 TODO: confirm this is a non-display */\n\t\t\t\t//stack.push(\"(\" + f[2].map(encode_range).join(\",\") + \")\");\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgAttrSpace': /* [MS-XLS] 2.5.198.38 */\n\t\t\tcase 'PtgAttrSpaceSemi': /* [MS-XLS] 2.5.198.39 */\n\t\t\t\tlast_sp = ff;\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgTbl': /* [MS-XLS] 2.5.198.92 TODO */\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgMemErr': /* [MS-XLS] 2.5.198.71 */\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgMissArg': /* [MS-XLS] 2.5.198.74 */\n\t\t\t\tstack.push(\"\");\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgAreaErr': /* [MS-XLS] 2.5.198.29 */\n\t\t\t\tstack.push(\"#REF!\"); break;\n\n\t\t\tcase 'PtgAreaErr3d': /* [MS-XLS] 2.5.198.30 */\n\t\t\t\tstack.push(\"#REF!\"); break;\n\n\t\t\tcase 'PtgList': /* [MS-XLSB] 2.5.97.52 */\n\t\t\t\t// $FlowIgnore\n\t\t\t\tstack.push(\"Table\" + f[1].idx + \"[#\" + f[1].rt + \"]\");\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgMemAreaN':\n\t\t\tcase 'PtgMemNoMemN':\n\t\t\tcase 'PtgAttrNoop':\n\t\t\tcase 'PtgSheet':\n\t\t\tcase 'PtgEndSheet':\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgMemFunc': /* [MS-XLS] 2.5.198.72 TODO */\n\t\t\t\tbreak;\n\t\t\tcase 'PtgMemNoMem': /* [MS-XLS] 2.5.198.73 TODO */\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgElfCol': /* [MS-XLS] 2.5.198.46 */\n\t\t\tcase 'PtgElfColS': /* [MS-XLS] 2.5.198.47 */\n\t\t\tcase 'PtgElfColSV': /* [MS-XLS] 2.5.198.48 */\n\t\t\tcase 'PtgElfColV': /* [MS-XLS] 2.5.198.49 */\n\t\t\tcase 'PtgElfLel': /* [MS-XLS] 2.5.198.50 */\n\t\t\tcase 'PtgElfRadical': /* [MS-XLS] 2.5.198.51 */\n\t\t\tcase 'PtgElfRadicalLel': /* [MS-XLS] 2.5.198.52 */\n\t\t\tcase 'PtgElfRadicalS': /* [MS-XLS] 2.5.198.53 */\n\t\t\tcase 'PtgElfRw': /* [MS-XLS] 2.5.198.54 */\n\t\t\tcase 'PtgElfRwV': /* [MS-XLS] 2.5.198.55 */\n\t\t\t\tthrow new Error(\"Unsupported ELFs\");\n\n\t\t\tcase 'PtgSxName': /* [MS-XLS] 2.5.198.91 TODO -- find a test case */\n\t\t\t\tthrow new Error('Unrecognized Formula Token: ' + String(f));\n\t\t\tdefault: throw new Error('Unrecognized Formula Token: ' + String(f));\n\t\t}\n\t\tvar PtgNonDisp = ['PtgAttrSpace', 'PtgAttrSpaceSemi', 'PtgAttrGoto'];\n\t\tif(opts.biff != 3) if(last_sp >= 0 && PtgNonDisp.indexOf(formula[0][ff][0]) == -1) {\n\t\t\tf = formula[0][last_sp];\n\t\t\tvar _left = true;\n\t\t\tswitch(f[1][0]) {\n\t\t\t\t/* note: some bad XLSB files omit the PtgParen */\n\t\t\t\tcase 4: _left = false;\n\t\t\t\t/* falls through */\n\t\t\t\tcase 0:\n\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\tsp = fill(\" \", f[1][1]); break;\n\t\t\t\tcase 5: _left = false;\n\t\t\t\t/* falls through */\n\t\t\t\tcase 1:\n\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\tsp = fill(\"\\r\", f[1][1]); break;\n\t\t\t\tdefault:\n\t\t\t\t\tsp = \"\";\n\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\tif(opts.WTF) throw new Error(\"Unexpected PtgAttrSpaceType \" + f[1][0]);\n\t\t\t}\n\t\t\tstack.push((_left ? sp : \"\") + stack.pop() + (_left ? \"\" : sp));\n\t\t\tlast_sp = -1;\n\t\t}\n\t}\n\tif(stack.length > 1 && opts.WTF) throw new Error(\"bad formula stack\");\n\treturn stack[0];\n}\n\n/* [MS-XLS] 2.5.198.1 TODO */\nfunction parse_ArrayParsedFormula(blob, length, opts) {\n\tvar target = blob.l + length, len = opts.biff == 2 ? 1 : 2;\n\tvar rgcb, cce = blob.read_shift(len); // length of rgce\n\tif(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];\n\tvar rgce = parse_Rgce(blob, cce, opts);\n\tif(length !== cce + len) rgcb = parse_RgbExtra(blob, length - cce - len, rgce, opts);\n\tblob.l = target;\n\treturn [rgce, rgcb];\n}\n\n/* [MS-XLS] 2.5.198.3 TODO */\nfunction parse_XLSCellParsedFormula(blob, length, opts) {\n\tvar target = blob.l + length, len = opts.biff == 2 ? 1 : 2;\n\tvar rgcb, cce = blob.read_shift(len); // length of rgce\n\tif(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];\n\tvar rgce = parse_Rgce(blob, cce, opts);\n\tif(length !== cce + len) rgcb = parse_RgbExtra(blob, length - cce - len, rgce, opts);\n\tblob.l = target;\n\treturn [rgce, rgcb];\n}\n\n/* [MS-XLS] 2.5.198.21 */\nfunction parse_NameParsedFormula(blob, length, opts, cce) {\n\tvar target = blob.l + length;\n\tvar rgce = parse_Rgce(blob, cce, opts);\n\tvar rgcb;\n\tif(target !== blob.l) rgcb = parse_RgbExtra(blob, target - blob.l, rgce, opts);\n\treturn [rgce, rgcb];\n}\n\n/* [MS-XLS] 2.5.198.118 TODO */\nfunction parse_SharedParsedFormula(blob, length, opts) {\n\tvar target = blob.l + length;\n\tvar rgcb, cce = blob.read_shift(2); // length of rgce\n\tvar rgce = parse_Rgce(blob, cce, opts);\n\tif(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];\n\tif(length !== cce + 2) rgcb = parse_RgbExtra(blob, target - cce - 2, rgce, opts);\n\treturn [rgce, rgcb];\n}\n\n/* [MS-XLS] 2.5.133 TODO: how to emit empty strings? */\nfunction parse_FormulaValue(blob) {\n\tvar b;\n\tif(__readUInt16LE(blob,blob.l + 6) !== 0xFFFF) return [parse_Xnum(blob),'n'];\n\tswitch(blob[blob.l]) {\n\t\tcase 0x00: blob.l += 8; return [\"String\", 's'];\n\t\tcase 0x01: b = blob[blob.l+2] === 0x1; blob.l += 8; return [b,'b'];\n\t\tcase 0x02: b = blob[blob.l+2]; blob.l += 8; return [b,'e'];\n\t\tcase 0x03: blob.l += 8; return [\"\",'s'];\n\t}\n\treturn [];\n}\nfunction write_FormulaValue(value) {\n\tif(value == null) {\n\t\t// Blank String Value\n\t\tvar o = new_buf(8);\n\t\to.write_shift(1, 0x03);\n\t\to.write_shift(1, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0xFFFF);\n\t\treturn o;\n\t} else if(typeof value == \"number\") return write_Xnum(value);\n\treturn write_Xnum(0);\n}\n\n/* [MS-XLS] 2.4.127 TODO */\nfunction parse_Formula(blob, length, opts) {\n\tvar end = blob.l + length;\n\tvar cell = parse_XLSCell(blob, 6);\n\tif(opts.biff == 2) ++blob.l;\n\tvar val = parse_FormulaValue(blob,8);\n\tvar flags = blob.read_shift(1);\n\tif(opts.biff != 2) {\n\t\tblob.read_shift(1);\n\t\tif(opts.biff >= 5) {\n\t\t\t/*var chn = */blob.read_shift(4);\n\t\t}\n\t}\n\tvar cbf = parse_XLSCellParsedFormula(blob, end - blob.l, opts);\n\treturn {cell:cell, val:val[0], formula:cbf, shared: (flags >> 3) & 1, tt:val[1]};\n}\nfunction write_Formula(cell, R, C, opts, os) {\n\t// Cell\n\tvar o1 = write_XLSCell(R, C, os);\n\n\t// FormulaValue\n\tvar o2 = write_FormulaValue(cell.v);\n\n\t// flags + cache\n\tvar o3 = new_buf(6);\n\tvar flags = 0x01 | 0x20;\n\to3.write_shift(2, flags);\n\to3.write_shift(4, 0);\n\n\t// CellParsedFormula\n\tvar bf = new_buf(cell.bf.length);\n\tfor(var i = 0; i < cell.bf.length; ++i) bf[i] = cell.bf[i];\n\n\tvar out = bconcat([o1, o2, o3, bf]);\n\treturn out;\n}\n\n\n/* XLSB Parsed Formula records have the same shape */\nfunction parse_XLSBParsedFormula(data, length, opts) {\n\tvar cce = data.read_shift(4);\n\tvar rgce = parse_Rgce(data, cce, opts);\n\tvar cb = data.read_shift(4);\n\tvar rgcb = cb > 0 ? parse_RgbExtra(data, cb, rgce, opts) : null;\n\treturn [rgce, rgcb];\n}\n\n/* [MS-XLSB] 2.5.97.1 ArrayParsedFormula */\nvar parse_XLSBArrayParsedFormula = parse_XLSBParsedFormula;\n/* [MS-XLSB] 2.5.97.4 CellParsedFormula */\nvar parse_XLSBCellParsedFormula = parse_XLSBParsedFormula;\n/* [MS-XLSB] 2.5.97.8 DVParsedFormula */\n//var parse_XLSBDVParsedFormula = parse_XLSBParsedFormula;\n/* [MS-XLSB] 2.5.97.9 FRTParsedFormula */\n//var parse_XLSBFRTParsedFormula = parse_XLSBParsedFormula2;\n/* [MS-XLSB] 2.5.97.12 NameParsedFormula */\nvar parse_XLSBNameParsedFormula = parse_XLSBParsedFormula;\n/* [MS-XLSB] 2.5.97.98 SharedParsedFormula */\nvar parse_XLSBSharedParsedFormula = parse_XLSBParsedFormula;\n/* [MS-XLS] 2.5.198.4 */\nvar Cetab = {\n0x0000: 'BEEP',\n0x0001: 'OPEN',\n0x0002: 'OPEN.LINKS',\n0x0003: 'CLOSE.ALL',\n0x0004: 'SAVE',\n0x0005: 'SAVE.AS',\n0x0006: 'FILE.DELETE',\n0x0007: 'PAGE.SETUP',\n0x0008: 'PRINT',\n0x0009: 'PRINTER.SETUP',\n0x000A: 'QUIT',\n0x000B: 'NEW.WINDOW',\n0x000C: 'ARRANGE.ALL',\n0x000D: 'WINDOW.SIZE',\n0x000E: 'WINDOW.MOVE',\n0x000F: 'FULL',\n0x0010: 'CLOSE',\n0x0011: 'RUN',\n0x0016: 'SET.PRINT.AREA',\n0x0017: 'SET.PRINT.TITLES',\n0x0018: 'SET.PAGE.BREAK',\n0x0019: 'REMOVE.PAGE.BREAK',\n0x001A: 'FONT',\n0x001B: 'DISPLAY',\n0x001C: 'PROTECT.DOCUMENT',\n0x001D: 'PRECISION',\n0x001E: 'A1.R1C1',\n0x001F: 'CALCULATE.NOW',\n0x0020: 'CALCULATION',\n0x0022: 'DATA.FIND',\n0x0023: 'EXTRACT',\n0x0024: 'DATA.DELETE',\n0x0025: 'SET.DATABASE',\n0x0026: 'SET.CRITERIA',\n0x0027: 'SORT',\n0x0028: 'DATA.SERIES',\n0x0029: 'TABLE',\n0x002A: 'FORMAT.NUMBER',\n0x002B: 'ALIGNMENT',\n0x002C: 'STYLE',\n0x002D: 'BORDER',\n0x002E: 'CELL.PROTECTION',\n0x002F: 'COLUMN.WIDTH',\n0x0030: 'UNDO',\n0x0031: 'CUT',\n0x0032: 'COPY',\n0x0033: 'PASTE',\n0x0034: 'CLEAR',\n0x0035: 'PASTE.SPECIAL',\n0x0036: 'EDIT.DELETE',\n0x0037: 'INSERT',\n0x0038: 'FILL.RIGHT',\n0x0039: 'FILL.DOWN',\n0x003D: 'DEFINE.NAME',\n0x003E: 'CREATE.NAMES',\n0x003F: 'FORMULA.GOTO',\n0x0040: 'FORMULA.FIND',\n0x0041: 'SELECT.LAST.CELL',\n0x0042: 'SHOW.ACTIVE.CELL',\n0x0043: 'GALLERY.AREA',\n0x0044: 'GALLERY.BAR',\n0x0045: 'GALLERY.COLUMN',\n0x0046: 'GALLERY.LINE',\n0x0047: 'GALLERY.PIE',\n0x0048: 'GALLERY.SCATTER',\n0x0049: 'COMBINATION',\n0x004A: 'PREFERRED',\n0x004B: 'ADD.OVERLAY',\n0x004C: 'GRIDLINES',\n0x004D: 'SET.PREFERRED',\n0x004E: 'AXES',\n0x004F: 'LEGEND',\n0x0050: 'ATTACH.TEXT',\n0x0051: 'ADD.ARROW',\n0x0052: 'SELECT.CHART',\n0x0053: 'SELECT.PLOT.AREA',\n0x0054: 'PATTERNS',\n0x0055: 'MAIN.CHART',\n0x0056: 'OVERLAY',\n0x0057: 'SCALE',\n0x0058: 'FORMAT.LEGEND',\n0x0059: 'FORMAT.TEXT',\n0x005A: 'EDIT.REPEAT',\n0x005B: 'PARSE',\n0x005C: 'JUSTIFY',\n0x005D: 'HIDE',\n0x005E: 'UNHIDE',\n0x005F: 'WORKSPACE',\n0x0060: 'FORMULA',\n0x0061: 'FORMULA.FILL',\n0x0062: 'FORMULA.ARRAY',\n0x0063: 'DATA.FIND.NEXT',\n0x0064: 'DATA.FIND.PREV',\n0x0065: 'FORMULA.FIND.NEXT',\n0x0066: 'FORMULA.FIND.PREV',\n0x0067: 'ACTIVATE',\n0x0068: 'ACTIVATE.NEXT',\n0x0069: 'ACTIVATE.PREV',\n0x006A: 'UNLOCKED.NEXT',\n0x006B: 'UNLOCKED.PREV',\n0x006C: 'COPY.PICTURE',\n0x006D: 'SELECT',\n0x006E: 'DELETE.NAME',\n0x006F: 'DELETE.FORMAT',\n0x0070: 'VLINE',\n0x0071: 'HLINE',\n0x0072: 'VPAGE',\n0x0073: 'HPAGE',\n0x0074: 'VSCROLL',\n0x0075: 'HSCROLL',\n0x0076: 'ALERT',\n0x0077: 'NEW',\n0x0078: 'CANCEL.COPY',\n0x0079: 'SHOW.CLIPBOARD',\n0x007A: 'MESSAGE',\n0x007C: 'PASTE.LINK',\n0x007D: 'APP.ACTIVATE',\n0x007E: 'DELETE.ARROW',\n0x007F: 'ROW.HEIGHT',\n0x0080: 'FORMAT.MOVE',\n0x0081: 'FORMAT.SIZE',\n0x0082: 'FORMULA.REPLACE',\n0x0083: 'SEND.KEYS',\n0x0084: 'SELECT.SPECIAL',\n0x0085: 'APPLY.NAMES',\n0x0086: 'REPLACE.FONT',\n0x0087: 'FREEZE.PANES',\n0x0088: 'SHOW.INFO',\n0x0089: 'SPLIT',\n0x008A: 'ON.WINDOW',\n0x008B: 'ON.DATA',\n0x008C: 'DISABLE.INPUT',\n0x008E: 'OUTLINE',\n0x008F: 'LIST.NAMES',\n0x0090: 'FILE.CLOSE',\n0x0091: 'SAVE.WORKBOOK',\n0x0092: 'DATA.FORM',\n0x0093: 'COPY.CHART',\n0x0094: 'ON.TIME',\n0x0095: 'WAIT',\n0x0096: 'FORMAT.FONT',\n0x0097: 'FILL.UP',\n0x0098: 'FILL.LEFT',\n0x0099: 'DELETE.OVERLAY',\n0x009B: 'SHORT.MENUS',\n0x009F: 'SET.UPDATE.STATUS',\n0x00A1: 'COLOR.PALETTE',\n0x00A2: 'DELETE.STYLE',\n0x00A3: 'WINDOW.RESTORE',\n0x00A4: 'WINDOW.MAXIMIZE',\n0x00A6: 'CHANGE.LINK',\n0x00A7: 'CALCULATE.DOCUMENT',\n0x00A8: 'ON.KEY',\n0x00A9: 'APP.RESTORE',\n0x00AA: 'APP.MOVE',\n0x00AB: 'APP.SIZE',\n0x00AC: 'APP.MINIMIZE',\n0x00AD: 'APP.MAXIMIZE',\n0x00AE: 'BRING.TO.FRONT',\n0x00AF: 'SEND.TO.BACK',\n0x00B9: 'MAIN.CHART.TYPE',\n0x00BA: 'OVERLAY.CHART.TYPE',\n0x00BB: 'SELECT.END',\n0x00BC: 'OPEN.MAIL',\n0x00BD: 'SEND.MAIL',\n0x00BE: 'STANDARD.FONT',\n0x00BF: 'CONSOLIDATE',\n0x00C0: 'SORT.SPECIAL',\n0x00C1: 'GALLERY.3D.AREA',\n0x00C2: 'GALLERY.3D.COLUMN',\n0x00C3: 'GALLERY.3D.LINE',\n0x00C4: 'GALLERY.3D.PIE',\n0x00C5: 'VIEW.3D',\n0x00C6: 'GOAL.SEEK',\n0x00C7: 'WORKGROUP',\n0x00C8: 'FILL.GROUP',\n0x00C9: 'UPDATE.LINK',\n0x00CA: 'PROMOTE',\n0x00CB: 'DEMOTE',\n0x00CC: 'SHOW.DETAIL',\n0x00CE: 'UNGROUP',\n0x00CF: 'OBJECT.PROPERTIES',\n0x00D0: 'SAVE.NEW.OBJECT',\n0x00D1: 'SHARE',\n0x00D2: 'SHARE.NAME',\n0x00D3: 'DUPLICATE',\n0x00D4: 'APPLY.STYLE',\n0x00D5: 'ASSIGN.TO.OBJECT',\n0x00D6: 'OBJECT.PROTECTION',\n0x00D7: 'HIDE.OBJECT',\n0x00D8: 'SET.EXTRACT',\n0x00D9: 'CREATE.PUBLISHER',\n0x00DA: 'SUBSCRIBE.TO',\n0x00DB: 'ATTRIBUTES',\n0x00DC: 'SHOW.TOOLBAR',\n0x00DE: 'PRINT.PREVIEW',\n0x00DF: 'EDIT.COLOR',\n0x00E0: 'SHOW.LEVELS',\n0x00E1: 'FORMAT.MAIN',\n0x00E2: 'FORMAT.OVERLAY',\n0x00E3: 'ON.RECALC',\n0x00E4: 'EDIT.SERIES',\n0x00E5: 'DEFINE.STYLE',\n0x00F0: 'LINE.PRINT',\n0x00F3: 'ENTER.DATA',\n0x00F9: 'GALLERY.RADAR',\n0x00FA: 'MERGE.STYLES',\n0x00FB: 'EDITION.OPTIONS',\n0x00FC: 'PASTE.PICTURE',\n0x00FD: 'PASTE.PICTURE.LINK',\n0x00FE: 'SPELLING',\n0x0100: 'ZOOM',\n0x0103: 'INSERT.OBJECT',\n0x0104: 'WINDOW.MINIMIZE',\n0x0109: 'SOUND.NOTE',\n0x010A: 'SOUND.PLAY',\n0x010B: 'FORMAT.SHAPE',\n0x010C: 'EXTEND.POLYGON',\n0x010D: 'FORMAT.AUTO',\n0x0110: 'GALLERY.3D.BAR',\n0x0111: 'GALLERY.3D.SURFACE',\n0x0112: 'FILL.AUTO',\n0x0114: 'CUSTOMIZE.TOOLBAR',\n0x0115: 'ADD.TOOL',\n0x0116: 'EDIT.OBJECT',\n0x0117: 'ON.DOUBLECLICK',\n0x0118: 'ON.ENTRY',\n0x0119: 'WORKBOOK.ADD',\n0x011A: 'WORKBOOK.MOVE',\n0x011B: 'WORKBOOK.COPY',\n0x011C: 'WORKBOOK.OPTIONS',\n0x011D: 'SAVE.WORKSPACE',\n0x0120: 'CHART.WIZARD',\n0x0121: 'DELETE.TOOL',\n0x0122: 'MOVE.TOOL',\n0x0123: 'WORKBOOK.SELECT',\n0x0124: 'WORKBOOK.ACTIVATE',\n0x0125: 'ASSIGN.TO.TOOL',\n0x0127: 'COPY.TOOL',\n0x0128: 'RESET.TOOL',\n0x0129: 'CONSTRAIN.NUMERIC',\n0x012A: 'PASTE.TOOL',\n0x012E: 'WORKBOOK.NEW',\n0x0131: 'SCENARIO.CELLS',\n0x0132: 'SCENARIO.DELETE',\n0x0133: 'SCENARIO.ADD',\n0x0134: 'SCENARIO.EDIT',\n0x0135: 'SCENARIO.SHOW',\n0x0136: 'SCENARIO.SHOW.NEXT',\n0x0137: 'SCENARIO.SUMMARY',\n0x0138: 'PIVOT.TABLE.WIZARD',\n0x0139: 'PIVOT.FIELD.PROPERTIES',\n0x013A: 'PIVOT.FIELD',\n0x013B: 'PIVOT.ITEM',\n0x013C: 'PIVOT.ADD.FIELDS',\n0x013E: 'OPTIONS.CALCULATION',\n0x013F: 'OPTIONS.EDIT',\n0x0140: 'OPTIONS.VIEW',\n0x0141: 'ADDIN.MANAGER',\n0x0142: 'MENU.EDITOR',\n0x0143: 'ATTACH.TOOLBARS',\n0x0144: 'VBAActivate',\n0x0145: 'OPTIONS.CHART',\n0x0148: 'VBA.INSERT.FILE',\n0x014A: 'VBA.PROCEDURE.DEFINITION',\n0x0150: 'ROUTING.SLIP',\n0x0152: 'ROUTE.DOCUMENT',\n0x0153: 'MAIL.LOGON',\n0x0156: 'INSERT.PICTURE',\n0x0157: 'EDIT.TOOL',\n0x0158: 'GALLERY.DOUGHNUT',\n0x015E: 'CHART.TREND',\n0x0160: 'PIVOT.ITEM.PROPERTIES',\n0x0162: 'WORKBOOK.INSERT',\n0x0163: 'OPTIONS.TRANSITION',\n0x0164: 'OPTIONS.GENERAL',\n0x0172: 'FILTER.ADVANCED',\n0x0175: 'MAIL.ADD.MAILER',\n0x0176: 'MAIL.DELETE.MAILER',\n0x0177: 'MAIL.REPLY',\n0x0178: 'MAIL.REPLY.ALL',\n0x0179: 'MAIL.FORWARD',\n0x017A: 'MAIL.NEXT.LETTER',\n0x017B: 'DATA.LABEL',\n0x017C: 'INSERT.TITLE',\n0x017D: 'FONT.PROPERTIES',\n0x017E: 'MACRO.OPTIONS',\n0x017F: 'WORKBOOK.HIDE',\n0x0180: 'WORKBOOK.UNHIDE',\n0x0181: 'WORKBOOK.DELETE',\n0x0182: 'WORKBOOK.NAME',\n0x0184: 'GALLERY.CUSTOM',\n0x0186: 'ADD.CHART.AUTOFORMAT',\n0x0187: 'DELETE.CHART.AUTOFORMAT',\n0x0188: 'CHART.ADD.DATA',\n0x0189: 'AUTO.OUTLINE',\n0x018A: 'TAB.ORDER',\n0x018B: 'SHOW.DIALOG',\n0x018C: 'SELECT.ALL',\n0x018D: 'UNGROUP.SHEETS',\n0x018E: 'SUBTOTAL.CREATE',\n0x018F: 'SUBTOTAL.REMOVE',\n0x0190: 'RENAME.OBJECT',\n0x019C: 'WORKBOOK.SCROLL',\n0x019D: 'WORKBOOK.NEXT',\n0x019E: 'WORKBOOK.PREV',\n0x019F: 'WORKBOOK.TAB.SPLIT',\n0x01A0: 'FULL.SCREEN',\n0x01A1: 'WORKBOOK.PROTECT',\n0x01A4: 'SCROLLBAR.PROPERTIES',\n0x01A5: 'PIVOT.SHOW.PAGES',\n0x01A6: 'TEXT.TO.COLUMNS',\n0x01A7: 'FORMAT.CHARTTYPE',\n0x01A8: 'LINK.FORMAT',\n0x01A9: 'TRACER.DISPLAY',\n0x01AE: 'TRACER.NAVIGATE',\n0x01AF: 'TRACER.CLEAR',\n0x01B0: 'TRACER.ERROR',\n0x01B1: 'PIVOT.FIELD.GROUP',\n0x01B2: 'PIVOT.FIELD.UNGROUP',\n0x01B3: 'CHECKBOX.PROPERTIES',\n0x01B4: 'LABEL.PROPERTIES',\n0x01B5: 'LISTBOX.PROPERTIES',\n0x01B6: 'EDITBOX.PROPERTIES',\n0x01B7: 'PIVOT.REFRESH',\n0x01B8: 'LINK.COMBO',\n0x01B9: 'OPEN.TEXT',\n0x01BA: 'HIDE.DIALOG',\n0x01BB: 'SET.DIALOG.FOCUS',\n0x01BC: 'ENABLE.OBJECT',\n0x01BD: 'PUSHBUTTON.PROPERTIES',\n0x01BE: 'SET.DIALOG.DEFAULT',\n0x01BF: 'FILTER',\n0x01C0: 'FILTER.SHOW.ALL',\n0x01C1: 'CLEAR.OUTLINE',\n0x01C2: 'FUNCTION.WIZARD',\n0x01C3: 'ADD.LIST.ITEM',\n0x01C4: 'SET.LIST.ITEM',\n0x01C5: 'REMOVE.LIST.ITEM',\n0x01C6: 'SELECT.LIST.ITEM',\n0x01C7: 'SET.CONTROL.VALUE',\n0x01C8: 'SAVE.COPY.AS',\n0x01CA: 'OPTIONS.LISTS.ADD',\n0x01CB: 'OPTIONS.LISTS.DELETE',\n0x01CC: 'SERIES.AXES',\n0x01CD: 'SERIES.X',\n0x01CE: 'SERIES.Y',\n0x01CF: 'ERRORBAR.X',\n0x01D0: 'ERRORBAR.Y',\n0x01D1: 'FORMAT.CHART',\n0x01D2: 'SERIES.ORDER',\n0x01D3: 'MAIL.LOGOFF',\n0x01D4: 'CLEAR.ROUTING.SLIP',\n0x01D5: 'APP.ACTIVATE.MICROSOFT',\n0x01D6: 'MAIL.EDIT.MAILER',\n0x01D7: 'ON.SHEET',\n0x01D8: 'STANDARD.WIDTH',\n0x01D9: 'SCENARIO.MERGE',\n0x01DA: 'SUMMARY.INFO',\n0x01DB: 'FIND.FILE',\n0x01DC: 'ACTIVE.CELL.FONT',\n0x01DD: 'ENABLE.TIPWIZARD',\n0x01DE: 'VBA.MAKE.ADDIN',\n0x01E0: 'INSERTDATATABLE',\n0x01E1: 'WORKGROUP.OPTIONS',\n0x01E2: 'MAIL.SEND.MAILER',\n0x01E5: 'AUTOCORRECT',\n0x01E9: 'POST.DOCUMENT',\n0x01EB: 'PICKLIST',\n0x01ED: 'VIEW.SHOW',\n0x01EE: 'VIEW.DEFINE',\n0x01EF: 'VIEW.DELETE',\n0x01FD: 'SHEET.BACKGROUND',\n0x01FE: 'INSERT.MAP.OBJECT',\n0x01FF: 'OPTIONS.MENONO',\n0x0205: 'MSOCHECKS',\n0x0206: 'NORMAL',\n0x0207: 'LAYOUT',\n0x0208: 'RM.PRINT.AREA',\n0x0209: 'CLEAR.PRINT.AREA',\n0x020A: 'ADD.PRINT.AREA',\n0x020B: 'MOVE.BRK',\n0x0221: 'HIDECURR.NOTE',\n0x0222: 'HIDEALL.NOTES',\n0x0223: 'DELETE.NOTE',\n0x0224: 'TRAVERSE.NOTES',\n0x0225: 'ACTIVATE.NOTES',\n0x026C: 'PROTECT.REVISIONS',\n0x026D: 'UNPROTECT.REVISIONS',\n0x0287: 'OPTIONS.ME',\n0x028D: 'WEB.PUBLISH',\n0x029B: 'NEWWEBQUERY',\n0x02A1: 'PIVOT.TABLE.CHART',\n0x02F1: 'OPTIONS.SAVE',\n0x02F3: 'OPTIONS.SPELL',\n0x0328: 'HIDEALL.INKANNOTS'\n};\n\n/* [MS-XLS] 2.5.198.17 */\n/* [MS-XLSB] 2.5.97.10 */\nvar Ftab = {\n0x0000: 'COUNT',\n0x0001: 'IF',\n0x0002: 'ISNA',\n0x0003: 'ISERROR',\n0x0004: 'SUM',\n0x0005: 'AVERAGE',\n0x0006: 'MIN',\n0x0007: 'MAX',\n0x0008: 'ROW',\n0x0009: 'COLUMN',\n0x000A: 'NA',\n0x000B: 'NPV',\n0x000C: 'STDEV',\n0x000D: 'DOLLAR',\n0x000E: 'FIXED',\n0x000F: 'SIN',\n0x0010: 'COS',\n0x0011: 'TAN',\n0x0012: 'ATAN',\n0x0013: 'PI',\n0x0014: 'SQRT',\n0x0015: 'EXP',\n0x0016: 'LN',\n0x0017: 'LOG10',\n0x0018: 'ABS',\n0x0019: 'INT',\n0x001A: 'SIGN',\n0x001B: 'ROUND',\n0x001C: 'LOOKUP',\n0x001D: 'INDEX',\n0x001E: 'REPT',\n0x001F: 'MID',\n0x0020: 'LEN',\n0x0021: 'VALUE',\n0x0022: 'TRUE',\n0x0023: 'FALSE',\n0x0024: 'AND',\n0x0025: 'OR',\n0x0026: 'NOT',\n0x0027: 'MOD',\n0x0028: 'DCOUNT',\n0x0029: 'DSUM',\n0x002A: 'DAVERAGE',\n0x002B: 'DMIN',\n0x002C: 'DMAX',\n0x002D: 'DSTDEV',\n0x002E: 'VAR',\n0x002F: 'DVAR',\n0x0030: 'TEXT',\n0x0031: 'LINEST',\n0x0032: 'TREND',\n0x0033: 'LOGEST',\n0x0034: 'GROWTH',\n0x0035: 'GOTO',\n0x0036: 'HALT',\n0x0037: 'RETURN',\n0x0038: 'PV',\n0x0039: 'FV',\n0x003A: 'NPER',\n0x003B: 'PMT',\n0x003C: 'RATE',\n0x003D: 'MIRR',\n0x003E: 'IRR',\n0x003F: 'RAND',\n0x0040: 'MATCH',\n0x0041: 'DATE',\n0x0042: 'TIME',\n0x0043: 'DAY',\n0x0044: 'MONTH',\n0x0045: 'YEAR',\n0x0046: 'WEEKDAY',\n0x0047: 'HOUR',\n0x0048: 'MINUTE',\n0x0049: 'SECOND',\n0x004A: 'NOW',\n0x004B: 'AREAS',\n0x004C: 'ROWS',\n0x004D: 'COLUMNS',\n0x004E: 'OFFSET',\n0x004F: 'ABSREF',\n0x0050: 'RELREF',\n0x0051: 'ARGUMENT',\n0x0052: 'SEARCH',\n0x0053: 'TRANSPOSE',\n0x0054: 'ERROR',\n0x0055: 'STEP',\n0x0056: 'TYPE',\n0x0057: 'ECHO',\n0x0058: 'SET.NAME',\n0x0059: 'CALLER',\n0x005A: 'DEREF',\n0x005B: 'WINDOWS',\n0x005C: 'SERIES',\n0x005D: 'DOCUMENTS',\n0x005E: 'ACTIVE.CELL',\n0x005F: 'SELECTION',\n0x0060: 'RESULT',\n0x0061: 'ATAN2',\n0x0062: 'ASIN',\n0x0063: 'ACOS',\n0x0064: 'CHOOSE',\n0x0065: 'HLOOKUP',\n0x0066: 'VLOOKUP',\n0x0067: 'LINKS',\n0x0068: 'INPUT',\n0x0069: 'ISREF',\n0x006A: 'GET.FORMULA',\n0x006B: 'GET.NAME',\n0x006C: 'SET.VALUE',\n0x006D: 'LOG',\n0x006E: 'EXEC',\n0x006F: 'CHAR',\n0x0070: 'LOWER',\n0x0071: 'UPPER',\n0x0072: 'PROPER',\n0x0073: 'LEFT',\n0x0074: 'RIGHT',\n0x0075: 'EXACT',\n0x0076: 'TRIM',\n0x0077: 'REPLACE',\n0x0078: 'SUBSTITUTE',\n0x0079: 'CODE',\n0x007A: 'NAMES',\n0x007B: 'DIRECTORY',\n0x007C: 'FIND',\n0x007D: 'CELL',\n0x007E: 'ISERR',\n0x007F: 'ISTEXT',\n0x0080: 'ISNUMBER',\n0x0081: 'ISBLANK',\n0x0082: 'T',\n0x0083: 'N',\n0x0084: 'FOPEN',\n0x0085: 'FCLOSE',\n0x0086: 'FSIZE',\n0x0087: 'FREADLN',\n0x0088: 'FREAD',\n0x0089: 'FWRITELN',\n0x008A: 'FWRITE',\n0x008B: 'FPOS',\n0x008C: 'DATEVALUE',\n0x008D: 'TIMEVALUE',\n0x008E: 'SLN',\n0x008F: 'SYD',\n0x0090: 'DDB',\n0x0091: 'GET.DEF',\n0x0092: 'REFTEXT',\n0x0093: 'TEXTREF',\n0x0094: 'INDIRECT',\n0x0095: 'REGISTER',\n0x0096: 'CALL',\n0x0097: 'ADD.BAR',\n0x0098: 'ADD.MENU',\n0x0099: 'ADD.COMMAND',\n0x009A: 'ENABLE.COMMAND',\n0x009B: 'CHECK.COMMAND',\n0x009C: 'RENAME.COMMAND',\n0x009D: 'SHOW.BAR',\n0x009E: 'DELETE.MENU',\n0x009F: 'DELETE.COMMAND',\n0x00A0: 'GET.CHART.ITEM',\n0x00A1: 'DIALOG.BOX',\n0x00A2: 'CLEAN',\n0x00A3: 'MDETERM',\n0x00A4: 'MINVERSE',\n0x00A5: 'MMULT',\n0x00A6: 'FILES',\n0x00A7: 'IPMT',\n0x00A8: 'PPMT',\n0x00A9: 'COUNTA',\n0x00AA: 'CANCEL.KEY',\n0x00AB: 'FOR',\n0x00AC: 'WHILE',\n0x00AD: 'BREAK',\n0x00AE: 'NEXT',\n0x00AF: 'INITIATE',\n0x00B0: 'REQUEST',\n0x00B1: 'POKE',\n0x00B2: 'EXECUTE',\n0x00B3: 'TERMINATE',\n0x00B4: 'RESTART',\n0x00B5: 'HELP',\n0x00B6: 'GET.BAR',\n0x00B7: 'PRODUCT',\n0x00B8: 'FACT',\n0x00B9: 'GET.CELL',\n0x00BA: 'GET.WORKSPACE',\n0x00BB: 'GET.WINDOW',\n0x00BC: 'GET.DOCUMENT',\n0x00BD: 'DPRODUCT',\n0x00BE: 'ISNONTEXT',\n0x00BF: 'GET.NOTE',\n0x00C0: 'NOTE',\n0x00C1: 'STDEVP',\n0x00C2: 'VARP',\n0x00C3: 'DSTDEVP',\n0x00C4: 'DVARP',\n0x00C5: 'TRUNC',\n0x00C6: 'ISLOGICAL',\n0x00C7: 'DCOUNTA',\n0x00C8: 'DELETE.BAR',\n0x00C9: 'UNREGISTER',\n0x00CC: 'USDOLLAR',\n0x00CD: 'FINDB',\n0x00CE: 'SEARCHB',\n0x00CF: 'REPLACEB',\n0x00D0: 'LEFTB',\n0x00D1: 'RIGHTB',\n0x00D2: 'MIDB',\n0x00D3: 'LENB',\n0x00D4: 'ROUNDUP',\n0x00D5: 'ROUNDDOWN',\n0x00D6: 'ASC',\n0x00D7: 'DBCS',\n0x00D8: 'RANK',\n0x00DB: 'ADDRESS',\n0x00DC: 'DAYS360',\n0x00DD: 'TODAY',\n0x00DE: 'VDB',\n0x00DF: 'ELSE',\n0x00E0: 'ELSE.IF',\n0x00E1: 'END.IF',\n0x00E2: 'FOR.CELL',\n0x00E3: 'MEDIAN',\n0x00E4: 'SUMPRODUCT',\n0x00E5: 'SINH',\n0x00E6: 'COSH',\n0x00E7: 'TANH',\n0x00E8: 'ASINH',\n0x00E9: 'ACOSH',\n0x00EA: 'ATANH',\n0x00EB: 'DGET',\n0x00EC: 'CREATE.OBJECT',\n0x00ED: 'VOLATILE',\n0x00EE: 'LAST.ERROR',\n0x00EF: 'CUSTOM.UNDO',\n0x00F0: 'CUSTOM.REPEAT',\n0x00F1: 'FORMULA.CONVERT',\n0x00F2: 'GET.LINK.INFO',\n0x00F3: 'TEXT.BOX',\n0x00F4: 'INFO',\n0x00F5: 'GROUP',\n0x00F6: 'GET.OBJECT',\n0x00F7: 'DB',\n0x00F8: 'PAUSE',\n0x00FB: 'RESUME',\n0x00FC: 'FREQUENCY',\n0x00FD: 'ADD.TOOLBAR',\n0x00FE: 'DELETE.TOOLBAR',\n0x00FF: 'User',\n0x0100: 'RESET.TOOLBAR',\n0x0101: 'EVALUATE',\n0x0102: 'GET.TOOLBAR',\n0x0103: 'GET.TOOL',\n0x0104: 'SPELLING.CHECK',\n0x0105: 'ERROR.TYPE',\n0x0106: 'APP.TITLE',\n0x0107: 'WINDOW.TITLE',\n0x0108: 'SAVE.TOOLBAR',\n0x0109: 'ENABLE.TOOL',\n0x010A: 'PRESS.TOOL',\n0x010B: 'REGISTER.ID',\n0x010C: 'GET.WORKBOOK',\n0x010D: 'AVEDEV',\n0x010E: 'BETADIST',\n0x010F: 'GAMMALN',\n0x0110: 'BETAINV',\n0x0111: 'BINOMDIST',\n0x0112: 'CHIDIST',\n0x0113: 'CHIINV',\n0x0114: 'COMBIN',\n0x0115: 'CONFIDENCE',\n0x0116: 'CRITBINOM',\n0x0117: 'EVEN',\n0x0118: 'EXPONDIST',\n0x0119: 'FDIST',\n0x011A: 'FINV',\n0x011B: 'FISHER',\n0x011C: 'FISHERINV',\n0x011D: 'FLOOR',\n0x011E: 'GAMMADIST',\n0x011F: 'GAMMAINV',\n0x0120: 'CEILING',\n0x0121: 'HYPGEOMDIST',\n0x0122: 'LOGNORMDIST',\n0x0123: 'LOGINV',\n0x0124: 'NEGBINOMDIST',\n0x0125: 'NORMDIST',\n0x0126: 'NORMSDIST',\n0x0127: 'NORMINV',\n0x0128: 'NORMSINV',\n0x0129: 'STANDARDIZE',\n0x012A: 'ODD',\n0x012B: 'PERMUT',\n0x012C: 'POISSON',\n0x012D: 'TDIST',\n0x012E: 'WEIBULL',\n0x012F: 'SUMXMY2',\n0x0130: 'SUMX2MY2',\n0x0131: 'SUMX2PY2',\n0x0132: 'CHITEST',\n0x0133: 'CORREL',\n0x0134: 'COVAR',\n0x0135: 'FORECAST',\n0x0136: 'FTEST',\n0x0137: 'INTERCEPT',\n0x0138: 'PEARSON',\n0x0139: 'RSQ',\n0x013A: 'STEYX',\n0x013B: 'SLOPE',\n0x013C: 'TTEST',\n0x013D: 'PROB',\n0x013E: 'DEVSQ',\n0x013F: 'GEOMEAN',\n0x0140: 'HARMEAN',\n0x0141: 'SUMSQ',\n0x0142: 'KURT',\n0x0143: 'SKEW',\n0x0144: 'ZTEST',\n0x0145: 'LARGE',\n0x0146: 'SMALL',\n0x0147: 'QUARTILE',\n0x0148: 'PERCENTILE',\n0x0149: 'PERCENTRANK',\n0x014A: 'MODE',\n0x014B: 'TRIMMEAN',\n0x014C: 'TINV',\n0x014E: 'MOVIE.COMMAND',\n0x014F: 'GET.MOVIE',\n0x0150: 'CONCATENATE',\n0x0151: 'POWER',\n0x0152: 'PIVOT.ADD.DATA',\n0x0153: 'GET.PIVOT.TABLE',\n0x0154: 'GET.PIVOT.FIELD',\n0x0155: 'GET.PIVOT.ITEM',\n0x0156: 'RADIANS',\n0x0157: 'DEGREES',\n0x0158: 'SUBTOTAL',\n0x0159: 'SUMIF',\n0x015A: 'COUNTIF',\n0x015B: 'COUNTBLANK',\n0x015C: 'SCENARIO.GET',\n0x015D: 'OPTIONS.LISTS.GET',\n0x015E: 'ISPMT',\n0x015F: 'DATEDIF',\n0x0160: 'DATESTRING',\n0x0161: 'NUMBERSTRING',\n0x0162: 'ROMAN',\n0x0163: 'OPEN.DIALOG',\n0x0164: 'SAVE.DIALOG',\n0x0165: 'VIEW.GET',\n0x0166: 'GETPIVOTDATA',\n0x0167: 'HYPERLINK',\n0x0168: 'PHONETIC',\n0x0169: 'AVERAGEA',\n0x016A: 'MAXA',\n0x016B: 'MINA',\n0x016C: 'STDEVPA',\n0x016D: 'VARPA',\n0x016E: 'STDEVA',\n0x016F: 'VARA',\n0x0170: 'BAHTTEXT',\n0x0171: 'THAIDAYOFWEEK',\n0x0172: 'THAIDIGIT',\n0x0173: 'THAIMONTHOFYEAR',\n0x0174: 'THAINUMSOUND',\n0x0175: 'THAINUMSTRING',\n0x0176: 'THAISTRINGLENGTH',\n0x0177: 'ISTHAIDIGIT',\n0x0178: 'ROUNDBAHTDOWN',\n0x0179: 'ROUNDBAHTUP',\n0x017A: 'THAIYEAR',\n0x017B: 'RTD',\n\n0x017C: 'CUBEVALUE',\n0x017D: 'CUBEMEMBER',\n0x017E: 'CUBEMEMBERPROPERTY',\n0x017F: 'CUBERANKEDMEMBER',\n0x0180: 'HEX2BIN',\n0x0181: 'HEX2DEC',\n0x0182: 'HEX2OCT',\n0x0183: 'DEC2BIN',\n0x0184: 'DEC2HEX',\n0x0185: 'DEC2OCT',\n0x0186: 'OCT2BIN',\n0x0187: 'OCT2HEX',\n0x0188: 'OCT2DEC',\n0x0189: 'BIN2DEC',\n0x018A: 'BIN2OCT',\n0x018B: 'BIN2HEX',\n0x018C: 'IMSUB',\n0x018D: 'IMDIV',\n0x018E: 'IMPOWER',\n0x018F: 'IMABS',\n0x0190: 'IMSQRT',\n0x0191: 'IMLN',\n0x0192: 'IMLOG2',\n0x0193: 'IMLOG10',\n0x0194: 'IMSIN',\n0x0195: 'IMCOS',\n0x0196: 'IMEXP',\n0x0197: 'IMARGUMENT',\n0x0198: 'IMCONJUGATE',\n0x0199: 'IMAGINARY',\n0x019A: 'IMREAL',\n0x019B: 'COMPLEX',\n0x019C: 'IMSUM',\n0x019D: 'IMPRODUCT',\n0x019E: 'SERIESSUM',\n0x019F: 'FACTDOUBLE',\n0x01A0: 'SQRTPI',\n0x01A1: 'QUOTIENT',\n0x01A2: 'DELTA',\n0x01A3: 'GESTEP',\n0x01A4: 'ISEVEN',\n0x01A5: 'ISODD',\n0x01A6: 'MROUND',\n0x01A7: 'ERF',\n0x01A8: 'ERFC',\n0x01A9: 'BESSELJ',\n0x01AA: 'BESSELK',\n0x01AB: 'BESSELY',\n0x01AC: 'BESSELI',\n0x01AD: 'XIRR',\n0x01AE: 'XNPV',\n0x01AF: 'PRICEMAT',\n0x01B0: 'YIELDMAT',\n0x01B1: 'INTRATE',\n0x01B2: 'RECEIVED',\n0x01B3: 'DISC',\n0x01B4: 'PRICEDISC',\n0x01B5: 'YIELDDISC',\n0x01B6: 'TBILLEQ',\n0x01B7: 'TBILLPRICE',\n0x01B8: 'TBILLYIELD',\n0x01B9: 'PRICE',\n0x01BA: 'YIELD',\n0x01BB: 'DOLLARDE',\n0x01BC: 'DOLLARFR',\n0x01BD: 'NOMINAL',\n0x01BE: 'EFFECT',\n0x01BF: 'CUMPRINC',\n0x01C0: 'CUMIPMT',\n0x01C1: 'EDATE',\n0x01C2: 'EOMONTH',\n0x01C3: 'YEARFRAC',\n0x01C4: 'COUPDAYBS',\n0x01C5: 'COUPDAYS',\n0x01C6: 'COUPDAYSNC',\n0x01C7: 'COUPNCD',\n0x01C8: 'COUPNUM',\n0x01C9: 'COUPPCD',\n0x01CA: 'DURATION',\n0x01CB: 'MDURATION',\n0x01CC: 'ODDLPRICE',\n0x01CD: 'ODDLYIELD',\n0x01CE: 'ODDFPRICE',\n0x01CF: 'ODDFYIELD',\n0x01D0: 'RANDBETWEEN',\n0x01D1: 'WEEKNUM',\n0x01D2: 'AMORDEGRC',\n0x01D3: 'AMORLINC',\n0x01D4: 'CONVERT',\n0x02D4: 'SHEETJS',\n0x01D5: 'ACCRINT',\n0x01D6: 'ACCRINTM',\n0x01D7: 'WORKDAY',\n0x01D8: 'NETWORKDAYS',\n0x01D9: 'GCD',\n0x01DA: 'MULTINOMIAL',\n0x01DB: 'LCM',\n0x01DC: 'FVSCHEDULE',\n0x01DD: 'CUBEKPIMEMBER',\n0x01DE: 'CUBESET',\n0x01DF: 'CUBESETCOUNT',\n0x01E0: 'IFERROR',\n0x01E1: 'COUNTIFS',\n0x01E2: 'SUMIFS',\n0x01E3: 'AVERAGEIF',\n0x01E4: 'AVERAGEIFS'\n};\nvar FtabArgc = {\n0x0002: 1, /* ISNA */\n0x0003: 1, /* ISERROR */\n0x000A: 0, /* NA */\n0x000F: 1, /* SIN */\n0x0010: 1, /* COS */\n0x0011: 1, /* TAN */\n0x0012: 1, /* ATAN */\n0x0013: 0, /* PI */\n0x0014: 1, /* SQRT */\n0x0015: 1, /* EXP */\n0x0016: 1, /* LN */\n0x0017: 1, /* LOG10 */\n0x0018: 1, /* ABS */\n0x0019: 1, /* INT */\n0x001A: 1, /* SIGN */\n0x001B: 2, /* ROUND */\n0x001E: 2, /* REPT */\n0x001F: 3, /* MID */\n0x0020: 1, /* LEN */\n0x0021: 1, /* VALUE */\n0x0022: 0, /* TRUE */\n0x0023: 0, /* FALSE */\n0x0026: 1, /* NOT */\n0x0027: 2, /* MOD */\n0x0028: 3, /* DCOUNT */\n0x0029: 3, /* DSUM */\n0x002A: 3, /* DAVERAGE */\n0x002B: 3, /* DMIN */\n0x002C: 3, /* DMAX */\n0x002D: 3, /* DSTDEV */\n0x002F: 3, /* DVAR */\n0x0030: 2, /* TEXT */\n0x0035: 1, /* GOTO */\n0x003D: 3, /* MIRR */\n0x003F: 0, /* RAND */\n0x0041: 3, /* DATE */\n0x0042: 3, /* TIME */\n0x0043: 1, /* DAY */\n0x0044: 1, /* MONTH */\n0x0045: 1, /* YEAR */\n0x0046: 1, /* WEEKDAY */\n0x0047: 1, /* HOUR */\n0x0048: 1, /* MINUTE */\n0x0049: 1, /* SECOND */\n0x004A: 0, /* NOW */\n0x004B: 1, /* AREAS */\n0x004C: 1, /* ROWS */\n0x004D: 1, /* COLUMNS */\n0x004F: 2, /* ABSREF */\n0x0050: 2, /* RELREF */\n0x0053: 1, /* TRANSPOSE */\n0x0055: 0, /* STEP */\n0x0056: 1, /* TYPE */\n0x0059: 0, /* CALLER */\n0x005A: 1, /* DEREF */\n0x005E: 0, /* ACTIVE.CELL */\n0x005F: 0, /* SELECTION */\n0x0061: 2, /* ATAN2 */\n0x0062: 1, /* ASIN */\n0x0063: 1, /* ACOS */\n0x0065: 3, /* HLOOKUP */\n0x0066: 3, /* VLOOKUP */\n0x0069: 1, /* ISREF */\n0x006A: 1, /* GET.FORMULA */\n0x006C: 2, /* SET.VALUE */\n0x006F: 1, /* CHAR */\n0x0070: 1, /* LOWER */\n0x0071: 1, /* UPPER */\n0x0072: 1, /* PROPER */\n0x0075: 2, /* EXACT */\n0x0076: 1, /* TRIM */\n0x0077: 4, /* REPLACE */\n0x0079: 1, /* CODE */\n0x007E: 1, /* ISERR */\n0x007F: 1, /* ISTEXT */\n0x0080: 1, /* ISNUMBER */\n0x0081: 1, /* ISBLANK */\n0x0082: 1, /* T */\n0x0083: 1, /* N */\n0x0085: 1, /* FCLOSE */\n0x0086: 1, /* FSIZE */\n0x0087: 1, /* FREADLN */\n0x0088: 2, /* FREAD */\n0x0089: 2, /* FWRITELN */\n0x008A: 2, /* FWRITE */\n0x008C: 1, /* DATEVALUE */\n0x008D: 1, /* TIMEVALUE */\n0x008E: 3, /* SLN */\n0x008F: 4, /* SYD */\n0x0090: 4, /* DDB */\n0x00A1: 1, /* DIALOG.BOX */\n0x00A2: 1, /* CLEAN */\n0x00A3: 1, /* MDETERM */\n0x00A4: 1, /* MINVERSE */\n0x00A5: 2, /* MMULT */\n0x00AC: 1, /* WHILE */\n0x00AF: 2, /* INITIATE */\n0x00B0: 2, /* REQUEST */\n0x00B1: 3, /* POKE */\n0x00B2: 2, /* EXECUTE */\n0x00B3: 1, /* TERMINATE */\n0x00B8: 1, /* FACT */\n0x00BA: 1, /* GET.WORKSPACE */\n0x00BD: 3, /* DPRODUCT */\n0x00BE: 1, /* ISNONTEXT */\n0x00C3: 3, /* DSTDEVP */\n0x00C4: 3, /* DVARP */\n0x00C5: 1, /* TRUNC */\n0x00C6: 1, /* ISLOGICAL */\n0x00C7: 3, /* DCOUNTA */\n0x00C9: 1, /* UNREGISTER */\n0x00CF: 4, /* REPLACEB */\n0x00D2: 3, /* MIDB */\n0x00D3: 1, /* LENB */\n0x00D4: 2, /* ROUNDUP */\n0x00D5: 2, /* ROUNDDOWN */\n0x00D6: 1, /* ASC */\n0x00D7: 1, /* DBCS */\n0x00E1: 0, /* END.IF */\n0x00E5: 1, /* SINH */\n0x00E6: 1, /* COSH */\n0x00E7: 1, /* TANH */\n0x00E8: 1, /* ASINH */\n0x00E9: 1, /* ACOSH */\n0x00EA: 1, /* ATANH */\n0x00EB: 3, /* DGET */\n0x00F4: 1, /* INFO */\n0x00F7: 4, /* DB */\n0x00FC: 2, /* FREQUENCY */\n0x0101: 1, /* EVALUATE */\n0x0105: 1, /* ERROR.TYPE */\n0x010F: 1, /* GAMMALN */\n0x0111: 4, /* BINOMDIST */\n0x0112: 2, /* CHIDIST */\n0x0113: 2, /* CHIINV */\n0x0114: 2, /* COMBIN */\n0x0115: 3, /* CONFIDENCE */\n0x0116: 3, /* CRITBINOM */\n0x0117: 1, /* EVEN */\n0x0118: 3, /* EXPONDIST */\n0x0119: 3, /* FDIST */\n0x011A: 3, /* FINV */\n0x011B: 1, /* FISHER */\n0x011C: 1, /* FISHERINV */\n0x011D: 2, /* FLOOR */\n0x011E: 4, /* GAMMADIST */\n0x011F: 3, /* GAMMAINV */\n0x0120: 2, /* CEILING */\n0x0121: 4, /* HYPGEOMDIST */\n0x0122: 3, /* LOGNORMDIST */\n0x0123: 3, /* LOGINV */\n0x0124: 3, /* NEGBINOMDIST */\n0x0125: 4, /* NORMDIST */\n0x0126: 1, /* NORMSDIST */\n0x0127: 3, /* NORMINV */\n0x0128: 1, /* NORMSINV */\n0x0129: 3, /* STANDARDIZE */\n0x012A: 1, /* ODD */\n0x012B: 2, /* PERMUT */\n0x012C: 3, /* POISSON */\n0x012D: 3, /* TDIST */\n0x012E: 4, /* WEIBULL */\n0x012F: 2, /* SUMXMY2 */\n0x0130: 2, /* SUMX2MY2 */\n0x0131: 2, /* SUMX2PY2 */\n0x0132: 2, /* CHITEST */\n0x0133: 2, /* CORREL */\n0x0134: 2, /* COVAR */\n0x0135: 3, /* FORECAST */\n0x0136: 2, /* FTEST */\n0x0137: 2, /* INTERCEPT */\n0x0138: 2, /* PEARSON */\n0x0139: 2, /* RSQ */\n0x013A: 2, /* STEYX */\n0x013B: 2, /* SLOPE */\n0x013C: 4, /* TTEST */\n0x0145: 2, /* LARGE */\n0x0146: 2, /* SMALL */\n0x0147: 2, /* QUARTILE */\n0x0148: 2, /* PERCENTILE */\n0x014B: 2, /* TRIMMEAN */\n0x014C: 2, /* TINV */\n0x0151: 2, /* POWER */\n0x0156: 1, /* RADIANS */\n0x0157: 1, /* DEGREES */\n0x015A: 2, /* COUNTIF */\n0x015B: 1, /* COUNTBLANK */\n0x015E: 4, /* ISPMT */\n0x015F: 3, /* DATEDIF */\n0x0160: 1, /* DATESTRING */\n0x0161: 2, /* NUMBERSTRING */\n0x0168: 1, /* PHONETIC */\n0x0170: 1, /* BAHTTEXT */\n0x0171: 1, /* THAIDAYOFWEEK */\n0x0172: 1, /* THAIDIGIT */\n0x0173: 1, /* THAIMONTHOFYEAR */\n0x0174: 1, /* THAINUMSOUND */\n0x0175: 1, /* THAINUMSTRING */\n0x0176: 1, /* THAISTRINGLENGTH */\n0x0177: 1, /* ISTHAIDIGIT */\n0x0178: 1, /* ROUNDBAHTDOWN */\n0x0179: 1, /* ROUNDBAHTUP */\n0x017A: 1, /* THAIYEAR */\n0x017E: 3, /* CUBEMEMBERPROPERTY */\n0x0181: 1, /* HEX2DEC */\n0x0188: 1, /* OCT2DEC */\n0x0189: 1, /* BIN2DEC */\n0x018C: 2, /* IMSUB */\n0x018D: 2, /* IMDIV */\n0x018E: 2, /* IMPOWER */\n0x018F: 1, /* IMABS */\n0x0190: 1, /* IMSQRT */\n0x0191: 1, /* IMLN */\n0x0192: 1, /* IMLOG2 */\n0x0193: 1, /* IMLOG10 */\n0x0194: 1, /* IMSIN */\n0x0195: 1, /* IMCOS */\n0x0196: 1, /* IMEXP */\n0x0197: 1, /* IMARGUMENT */\n0x0198: 1, /* IMCONJUGATE */\n0x0199: 1, /* IMAGINARY */\n0x019A: 1, /* IMREAL */\n0x019E: 4, /* SERIESSUM */\n0x019F: 1, /* FACTDOUBLE */\n0x01A0: 1, /* SQRTPI */\n0x01A1: 2, /* QUOTIENT */\n0x01A4: 1, /* ISEVEN */\n0x01A5: 1, /* ISODD */\n0x01A6: 2, /* MROUND */\n0x01A8: 1, /* ERFC */\n0x01A9: 2, /* BESSELJ */\n0x01AA: 2, /* BESSELK */\n0x01AB: 2, /* BESSELY */\n0x01AC: 2, /* BESSELI */\n0x01AE: 3, /* XNPV */\n0x01B6: 3, /* TBILLEQ */\n0x01B7: 3, /* TBILLPRICE */\n0x01B8: 3, /* TBILLYIELD */\n0x01BB: 2, /* DOLLARDE */\n0x01BC: 2, /* DOLLARFR */\n0x01BD: 2, /* NOMINAL */\n0x01BE: 2, /* EFFECT */\n0x01BF: 6, /* CUMPRINC */\n0x01C0: 6, /* CUMIPMT */\n0x01C1: 2, /* EDATE */\n0x01C2: 2, /* EOMONTH */\n0x01D0: 2, /* RANDBETWEEN */\n0x01D4: 3, /* CONVERT */\n0x01DC: 2, /* FVSCHEDULE */\n0x01DF: 1, /* CUBESETCOUNT */\n0x01E0: 2, /* IFERROR */\n0xFFFF: 0\n};\n/* [MS-XLSX] 2.2.3 Functions */\n/* [MS-XLSB] 2.5.97.10 Ftab */\nvar XLSXFutureFunctions = {\n\t\"_xlfn.ACOT\": \"ACOT\",\n\t\"_xlfn.ACOTH\": \"ACOTH\",\n\t\"_xlfn.AGGREGATE\": \"AGGREGATE\",\n\t\"_xlfn.ARABIC\": \"ARABIC\",\n\t\"_xlfn.AVERAGEIF\": \"AVERAGEIF\",\n\t\"_xlfn.AVERAGEIFS\": \"AVERAGEIFS\",\n\t\"_xlfn.BASE\": \"BASE\",\n\t\"_xlfn.BETA.DIST\": \"BETA.DIST\",\n\t\"_xlfn.BETA.INV\": \"BETA.INV\",\n\t\"_xlfn.BINOM.DIST\": \"BINOM.DIST\",\n\t\"_xlfn.BINOM.DIST.RANGE\": \"BINOM.DIST.RANGE\",\n\t\"_xlfn.BINOM.INV\": \"BINOM.INV\",\n\t\"_xlfn.BITAND\": \"BITAND\",\n\t\"_xlfn.BITLSHIFT\": \"BITLSHIFT\",\n\t\"_xlfn.BITOR\": \"BITOR\",\n\t\"_xlfn.BITRSHIFT\": \"BITRSHIFT\",\n\t\"_xlfn.BITXOR\": \"BITXOR\",\n\t\"_xlfn.CEILING.MATH\": \"CEILING.MATH\",\n\t\"_xlfn.CEILING.PRECISE\": \"CEILING.PRECISE\",\n\t\"_xlfn.CHISQ.DIST\": \"CHISQ.DIST\",\n\t\"_xlfn.CHISQ.DIST.RT\": \"CHISQ.DIST.RT\",\n\t\"_xlfn.CHISQ.INV\": \"CHISQ.INV\",\n\t\"_xlfn.CHISQ.INV.RT\": \"CHISQ.INV.RT\",\n\t\"_xlfn.CHISQ.TEST\": \"CHISQ.TEST\",\n\t\"_xlfn.COMBINA\": \"COMBINA\",\n\t\"_xlfn.CONCAT\": \"CONCAT\",\n\t\"_xlfn.CONFIDENCE.NORM\": \"CONFIDENCE.NORM\",\n\t\"_xlfn.CONFIDENCE.T\": \"CONFIDENCE.T\",\n\t\"_xlfn.COT\": \"COT\",\n\t\"_xlfn.COTH\": \"COTH\",\n\t\"_xlfn.COUNTIFS\": \"COUNTIFS\",\n\t\"_xlfn.COVARIANCE.P\": \"COVARIANCE.P\",\n\t\"_xlfn.COVARIANCE.S\": \"COVARIANCE.S\",\n\t\"_xlfn.CSC\": \"CSC\",\n\t\"_xlfn.CSCH\": \"CSCH\",\n\t\"_xlfn.DAYS\": \"DAYS\",\n\t\"_xlfn.DECIMAL\": \"DECIMAL\",\n\t\"_xlfn.ECMA.CEILING\": \"ECMA.CEILING\",\n\t\"_xlfn.ERF.PRECISE\": \"ERF.PRECISE\",\n\t\"_xlfn.ERFC.PRECISE\": \"ERFC.PRECISE\",\n\t\"_xlfn.EXPON.DIST\": \"EXPON.DIST\",\n\t\"_xlfn.F.DIST\": \"F.DIST\",\n\t\"_xlfn.F.DIST.RT\": \"F.DIST.RT\",\n\t\"_xlfn.F.INV\": \"F.INV\",\n\t\"_xlfn.F.INV.RT\": \"F.INV.RT\",\n\t\"_xlfn.F.TEST\": \"F.TEST\",\n\t\"_xlfn.FILTERXML\": \"FILTERXML\",\n\t\"_xlfn.FLOOR.MATH\": \"FLOOR.MATH\",\n\t\"_xlfn.FLOOR.PRECISE\": \"FLOOR.PRECISE\",\n\t\"_xlfn.FORECAST.ETS\": \"FORECAST.ETS\",\n\t\"_xlfn.FORECAST.ETS.CONFINT\": \"FORECAST.ETS.CONFINT\",\n\t\"_xlfn.FORECAST.ETS.SEASONALITY\": \"FORECAST.ETS.SEASONALITY\",\n\t\"_xlfn.FORECAST.ETS.STAT\": \"FORECAST.ETS.STAT\",\n\t\"_xlfn.FORECAST.LINEAR\": \"FORECAST.LINEAR\",\n\t\"_xlfn.FORMULATEXT\": \"FORMULATEXT\",\n\t\"_xlfn.GAMMA\": \"GAMMA\",\n\t\"_xlfn.GAMMA.DIST\": \"GAMMA.DIST\",\n\t\"_xlfn.GAMMA.INV\": \"GAMMA.INV\",\n\t\"_xlfn.GAMMALN.PRECISE\": \"GAMMALN.PRECISE\",\n\t\"_xlfn.GAUSS\": \"GAUSS\",\n\t\"_xlfn.HYPGEOM.DIST\": \"HYPGEOM.DIST\",\n\t\"_xlfn.IFERROR\": \"IFERROR\",\n\t\"_xlfn.IFNA\": \"IFNA\",\n\t\"_xlfn.IFS\": \"IFS\",\n\t\"_xlfn.IMCOSH\": \"IMCOSH\",\n\t\"_xlfn.IMCOT\": \"IMCOT\",\n\t\"_xlfn.IMCSC\": \"IMCSC\",\n\t\"_xlfn.IMCSCH\": \"IMCSCH\",\n\t\"_xlfn.IMSEC\": \"IMSEC\",\n\t\"_xlfn.IMSECH\": \"IMSECH\",\n\t\"_xlfn.IMSINH\": \"IMSINH\",\n\t\"_xlfn.IMTAN\": \"IMTAN\",\n\t\"_xlfn.ISFORMULA\": \"ISFORMULA\",\n\t\"_xlfn.ISO.CEILING\": \"ISO.CEILING\",\n\t\"_xlfn.ISOWEEKNUM\": \"ISOWEEKNUM\",\n\t\"_xlfn.LOGNORM.DIST\": \"LOGNORM.DIST\",\n\t\"_xlfn.LOGNORM.INV\": \"LOGNORM.INV\",\n\t\"_xlfn.MAXIFS\": \"MAXIFS\",\n\t\"_xlfn.MINIFS\": \"MINIFS\",\n\t\"_xlfn.MODE.MULT\": \"MODE.MULT\",\n\t\"_xlfn.MODE.SNGL\": \"MODE.SNGL\",\n\t\"_xlfn.MUNIT\": \"MUNIT\",\n\t\"_xlfn.NEGBINOM.DIST\": \"NEGBINOM.DIST\",\n\t\"_xlfn.NETWORKDAYS.INTL\": \"NETWORKDAYS.INTL\",\n\t\"_xlfn.NIGBINOM\": \"NIGBINOM\",\n\t\"_xlfn.NORM.DIST\": \"NORM.DIST\",\n\t\"_xlfn.NORM.INV\": \"NORM.INV\",\n\t\"_xlfn.NORM.S.DIST\": \"NORM.S.DIST\",\n\t\"_xlfn.NORM.S.INV\": \"NORM.S.INV\",\n\t\"_xlfn.NUMBERVALUE\": \"NUMBERVALUE\",\n\t\"_xlfn.PDURATION\": \"PDURATION\",\n\t\"_xlfn.PERCENTILE.EXC\": \"PERCENTILE.EXC\",\n\t\"_xlfn.PERCENTILE.INC\": \"PERCENTILE.INC\",\n\t\"_xlfn.PERCENTRANK.EXC\": \"PERCENTRANK.EXC\",\n\t\"_xlfn.PERCENTRANK.INC\": \"PERCENTRANK.INC\",\n\t\"_xlfn.PERMUTATIONA\": \"PERMUTATIONA\",\n\t\"_xlfn.PHI\": \"PHI\",\n\t\"_xlfn.POISSON.DIST\": \"POISSON.DIST\",\n\t\"_xlfn.QUARTILE.EXC\": \"QUARTILE.EXC\",\n\t\"_xlfn.QUARTILE.INC\": \"QUARTILE.INC\",\n\t\"_xlfn.QUERYSTRING\": \"QUERYSTRING\",\n\t\"_xlfn.RANK.AVG\": \"RANK.AVG\",\n\t\"_xlfn.RANK.EQ\": \"RANK.EQ\",\n\t\"_xlfn.RRI\": \"RRI\",\n\t\"_xlfn.SEC\": \"SEC\",\n\t\"_xlfn.SECH\": \"SECH\",\n\t\"_xlfn.SHEET\": \"SHEET\",\n\t\"_xlfn.SHEETS\": \"SHEETS\",\n\t\"_xlfn.SKEW.P\": \"SKEW.P\",\n\t\"_xlfn.STDEV.P\": \"STDEV.P\",\n\t\"_xlfn.STDEV.S\": \"STDEV.S\",\n\t\"_xlfn.SUMIFS\": \"SUMIFS\",\n\t\"_xlfn.SWITCH\": \"SWITCH\",\n\t\"_xlfn.T.DIST\": \"T.DIST\",\n\t\"_xlfn.T.DIST.2T\": \"T.DIST.2T\",\n\t\"_xlfn.T.DIST.RT\": \"T.DIST.RT\",\n\t\"_xlfn.T.INV\": \"T.INV\",\n\t\"_xlfn.T.INV.2T\": \"T.INV.2T\",\n\t\"_xlfn.T.TEST\": \"T.TEST\",\n\t\"_xlfn.TEXTJOIN\": \"TEXTJOIN\",\n\t\"_xlfn.UNICHAR\": \"UNICHAR\",\n\t\"_xlfn.UNICODE\": \"UNICODE\",\n\t\"_xlfn.VAR.P\": \"VAR.P\",\n\t\"_xlfn.VAR.S\": \"VAR.S\",\n\t\"_xlfn.WEBSERVICE\": \"WEBSERVICE\",\n\t\"_xlfn.WEIBULL.DIST\": \"WEIBULL.DIST\",\n\t\"_xlfn.WORKDAY.INTL\": \"WORKDAY.INTL\",\n\t\"_xlfn.XOR\": \"XOR\",\n\t\"_xlfn.Z.TEST\": \"Z.TEST\"\n};\n\n/* Part 3 TODO: actually parse formulae */\nfunction ods_to_csf_formula(f) {\n\tif(f.slice(0,3) == \"of:\") f = f.slice(3);\n\t/* 5.2 Basic Expressions */\n\tif(f.charCodeAt(0) == 61) {\n\t\tf = f.slice(1);\n\t\tif(f.charCodeAt(0) == 61) f = f.slice(1);\n\t}\n\tf = f.replace(/COM\\.MICROSOFT\\./g, \"\");\n\t/* Part 3 Section 5.8 References */\n\tf = f.replace(/\\[((?:\\.[A-Z]+[0-9]+)(?::\\.[A-Z]+[0-9]+)?)\\]/g, function($$, $1) { return $1.replace(/\\./g,\"\"); });\n\t/* TODO: something other than this */\n\tf = f.replace(/\\[.(#[A-Z]*[?!])\\]/g, \"$1\");\n\treturn f.replace(/[;~]/g,\",\").replace(/\\|/g,\";\");\n}\n\nfunction csf_to_ods_formula(f) {\n\tvar o = \"of:=\" + f.replace(crefregex, \"$1[.$2$3$4$5]\").replace(/\\]:\\[/g,\":\");\n\t/* TODO: something other than this */\n\treturn o.replace(/;/g, \"|\").replace(/,/g,\";\");\n}\n\nfunction ods_to_csf_3D(r) {\n\tvar a = r.split(\":\");\n\tvar s = a[0].split(\".\")[0];\n\treturn [s, a[0].split(\".\")[1] + (a.length > 1 ? (\":\" + (a[1].split(\".\")[1] || a[1].split(\".\")[0])) : \"\")];\n}\n\nfunction csf_to_ods_3D(r) {\n\treturn r.replace(/\\./,\"!\");\n}\n\nvar strs = {}; // shared strings\nvar _ssfopts = {}; // spreadsheet formatting options\n\nRELS.WS = [\n\t\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\",\n\t\"http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet\"\n];\n\n/*global Map */\nvar browser_has_Map = typeof Map !== 'undefined';\n\nfunction get_sst_id(sst, str, rev) {\n\tvar i = 0, len = sst.length;\n\tif(rev) {\n\t\tif(browser_has_Map ? rev.has(str) : Object.prototype.hasOwnProperty.call(rev, str)) {\n\t\t\tvar revarr = browser_has_Map ? rev.get(str) : rev[str];\n\t\t\tfor(; i < revarr.length; ++i) {\n\t\t\t\tif(sst[revarr[i]].t === str) { sst.Count ++; return revarr[i]; }\n\t\t\t}\n\t\t}\n\t} else for(; i < len; ++i) {\n\t\tif(sst[i].t === str) { sst.Count ++; return i; }\n\t}\n\tsst[len] = ({t:str}); sst.Count ++; sst.Unique ++;\n\tif(rev) {\n\t\tif(browser_has_Map) {\n\t\t\tif(!rev.has(str)) rev.set(str, []);\n\t\t\trev.get(str).push(len);\n\t\t} else {\n\t\t\tif(!Object.prototype.hasOwnProperty.call(rev, str)) rev[str] = [];\n\t\t\trev[str].push(len);\n\t\t}\n\t}\n\treturn len;\n}\n\nfunction col_obj_w(C, col) {\n\tvar p = ({min:C+1,max:C+1});\n\t/* wch (chars), wpx (pixels) */\n\tvar wch = -1;\n\tif(col.MDW) MDW = col.MDW;\n\tif(col.width != null) p.customWidth = 1;\n\telse if(col.wpx != null) wch = px2char(col.wpx);\n\telse if(col.wch != null) wch = col.wch;\n\tif(wch > -1) { p.width = char2width(wch); p.customWidth = 1; }\n\telse if(col.width != null) p.width = col.width;\n\tif(col.hidden) p.hidden = true;\n\tif(col.level != null) { p.outlineLevel = p.level = col.level; }\n\treturn p;\n}\n\nfunction default_margins(margins, mode) {\n\tif(!margins) return;\n\tvar defs = [0.7, 0.7, 0.75, 0.75, 0.3, 0.3];\n\tif(mode == 'xlml') defs = [1, 1, 1, 1, 0.5, 0.5];\n\tif(margins.left == null) margins.left = defs[0];\n\tif(margins.right == null) margins.right = defs[1];\n\tif(margins.top == null) margins.top = defs[2];\n\tif(margins.bottom == null) margins.bottom = defs[3];\n\tif(margins.header == null) margins.header = defs[4];\n\tif(margins.footer == null) margins.footer = defs[5];\n}\n\nfunction get_cell_style(styles, cell, opts) {\n\tvar z = opts.revssf[cell.z != null ? cell.z : \"General\"];\n\tvar i = 0x3c, len = styles.length;\n\tif(z == null && opts.ssf) {\n\t\tfor(; i < 0x188; ++i) if(opts.ssf[i] == null) {\n\t\t\tSSF.load(cell.z, i);\n\t\t\t// $FlowIgnore\n\t\t\topts.ssf[i] = cell.z;\n\t\t\topts.revssf[cell.z] = z = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\tfor(i = 0; i != len; ++i) if(styles[i].numFmtId === z) return i;\n\tstyles[len] = {\n\t\tnumFmtId:z,\n\t\tfontId:0,\n\t\tfillId:0,\n\t\tborderId:0,\n\t\txfId:0,\n\t\tapplyNumberFormat:1\n\t};\n\treturn len;\n}\n\nfunction safe_format(p, fmtid, fillid, opts, themes, styles) {\n\ttry {\n\t\tif(opts.cellNF) p.z = SSF._table[fmtid];\n\t} catch(e) { if(opts.WTF) throw e; }\n\tif(p.t === 'z' && !opts.cellStyles) return;\n\tif(p.t === 'd' && typeof p.v === 'string') p.v = parseDate(p.v);\n\tif((!opts || opts.cellText !== false) && p.t !== 'z') try {\n\t\tif(SSF._table[fmtid] == null) SSF.load(SSFImplicit[fmtid] || \"General\", fmtid);\n\t\tif(p.t === 'e') p.w = p.w || BErr[p.v];\n\t\telse if(fmtid === 0) {\n\t\t\tif(p.t === 'n') {\n\t\t\t\tif((p.v|0) === p.v) p.w = SSF._general_int(p.v);\n\t\t\t\telse p.w = SSF._general_num(p.v);\n\t\t\t}\n\t\t\telse if(p.t === 'd') {\n\t\t\t\tvar dd = datenum(p.v);\n\t\t\t\tif((dd|0) === dd) p.w = SSF._general_int(dd);\n\t\t\t\telse p.w = SSF._general_num(dd);\n\t\t\t}\n\t\t\telse if(p.v === undefined) return \"\";\n\t\t\telse p.w = SSF._general(p.v,_ssfopts);\n\t\t}\n\t\telse if(p.t === 'd') p.w = SSF.format(fmtid,datenum(p.v),_ssfopts);\n\t\telse p.w = SSF.format(fmtid,p.v,_ssfopts);\n\t} catch(e) { if(opts.WTF) throw e; }\n\tif(!opts.cellStyles) return;\n\tif(fillid != null) try {\n\t\tp.s = styles.Fills[fillid];\n\t\tif (p.s.fgColor && p.s.fgColor.theme && !p.s.fgColor.rgb) {\n\t\t\tp.s.fgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.fgColor.theme].rgb, p.s.fgColor.tint || 0);\n\t\t\tif(opts.WTF) p.s.fgColor.raw_rgb = themes.themeElements.clrScheme[p.s.fgColor.theme].rgb;\n\t\t}\n\t\tif (p.s.bgColor && p.s.bgColor.theme) {\n\t\t\tp.s.bgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.bgColor.theme].rgb, p.s.bgColor.tint || 0);\n\t\t\tif(opts.WTF) p.s.bgColor.raw_rgb = themes.themeElements.clrScheme[p.s.bgColor.theme].rgb;\n\t\t}\n\t} catch(e) { if(opts.WTF && styles.Fills) throw e; }\n}\n\nfunction check_ws(ws, sname, i) {\n\tif(ws && ws['!ref']) {\n\t\tvar range = safe_decode_range(ws['!ref']);\n\t\tif(range.e.c < range.s.c || range.e.r < range.s.r) throw new Error(\"Bad range (\" + i + \"): \" + ws['!ref']);\n\t}\n}\nfunction parse_ws_xml_dim(ws, s) {\n\tvar d = safe_decode_range(s);\n\tif(d.s.r<=d.e.r && d.s.c<=d.e.c && d.s.r>=0 && d.s.c>=0) ws[\"!ref\"] = encode_range(d);\n}\nvar mergecregex = /<(?:\\w:)?mergeCell ref=\"[A-Z0-9:]+\"\\s*[\\/]?>/g;\nvar sheetdataregex = /<(?:\\w+:)?sheetData[^>]*>([\\s\\S]*)<\\/(?:\\w+:)?sheetData>/;\nvar hlinkregex = /<(?:\\w:)?hyperlink [^>]*>/mg;\nvar dimregex = /\"(\\w*:\\w*)\"/;\nvar colregex = /<(?:\\w:)?col\\b[^>]*[\\/]?>/g;\nvar afregex = /<(?:\\w:)?autoFilter[^>]*([\\/]|>([\\s\\S]*)<\\/(?:\\w:)?autoFilter)>/g;\nvar marginregex= /<(?:\\w:)?pageMargins[^>]*\\/>/g;\nvar sheetprregex = /<(?:\\w:)?sheetPr\\b(?:[^>a-z][^>]*)?\\/>/;\nvar sheetprregex2= /<(?:\\w:)?sheetPr[^>]*(?:[\\/]|>([\\s\\S]*)<\\/(?:\\w:)?sheetPr)>/;\nvar svsregex = /<(?:\\w:)?sheetViews[^>]*(?:[\\/]|>([\\s\\S]*)<\\/(?:\\w:)?sheetViews)>/;\n\n/* 18.3 Worksheets */\nfunction parse_ws_xml(data, opts, idx, rels, wb, themes, styles) {\n\tif(!data) return data;\n\tif(!rels) rels = {'!id':{}};\n\tif(DENSE != null && opts.dense == null) opts.dense = DENSE;\n\n\t/* 18.3.1.99 worksheet CT_Worksheet */\n\tvar s = opts.dense ? ([]) : ({});\n\tvar refguess = ({s: {r:2000000, c:2000000}, e: {r:0, c:0} });\n\n\tvar data1 = \"\", data2 = \"\";\n\tvar mtch = data.match(sheetdataregex);\n\tif(mtch) {\n\t\tdata1 = data.slice(0, mtch.index);\n\t\tdata2 = data.slice(mtch.index + mtch[0].length);\n\t} else data1 = data2 = data;\n\n\t/* 18.3.1.82 sheetPr CT_SheetPr */\n\tvar sheetPr = data1.match(sheetprregex);\n\tif(sheetPr) parse_ws_xml_sheetpr(sheetPr[0], s, wb, idx);\n\telse if((sheetPr = data1.match(sheetprregex2))) parse_ws_xml_sheetpr2(sheetPr[0], sheetPr[1]||\"\", s, wb, idx, styles, themes);\n\n\t/* 18.3.1.35 dimension CT_SheetDimension */\n\tvar ridx = (data1.match(/<(?:\\w*:)?dimension/)||{index:-1}).index;\n\tif(ridx > 0) {\n\t\tvar ref = data1.slice(ridx,ridx+50).match(dimregex);\n\t\tif(ref) parse_ws_xml_dim(s, ref[1]);\n\t}\n\n\t/* 18.3.1.88 sheetViews CT_SheetViews */\n\tvar svs = data1.match(svsregex);\n\tif(svs && svs[1]) parse_ws_xml_sheetviews(svs[1], wb);\n\n\t/* 18.3.1.17 cols CT_Cols */\n\tvar columns = [];\n\tif(opts.cellStyles) {\n\t\t/* 18.3.1.13 col CT_Col */\n\t\tvar cols = data1.match(colregex);\n\t\tif(cols) parse_ws_xml_cols(columns, cols);\n\t}\n\n\t/* 18.3.1.80 sheetData CT_SheetData ? */\n\tif(mtch) parse_ws_xml_data(mtch[1], s, opts, refguess, themes, styles);\n\n\t/* 18.3.1.2 autoFilter CT_AutoFilter */\n\tvar afilter = data2.match(afregex);\n\tif(afilter) s['!autofilter'] = parse_ws_xml_autofilter(afilter[0]);\n\n\t/* 18.3.1.55 mergeCells CT_MergeCells */\n\tvar merges = [];\n\tvar _merge = data2.match(mergecregex);\n\tif(_merge) for(ridx = 0; ridx != _merge.length; ++ridx)\n\t\tmerges[ridx] = safe_decode_range(_merge[ridx].slice(_merge[ridx].indexOf(\"\\\"\")+1));\n\n\t/* 18.3.1.48 hyperlinks CT_Hyperlinks */\n\tvar hlink = data2.match(hlinkregex);\n\tif(hlink) parse_ws_xml_hlinks(s, hlink, rels);\n\n\t/* 18.3.1.62 pageMargins CT_PageMargins */\n\tvar margins = data2.match(marginregex);\n\tif(margins) s['!margins'] = parse_ws_xml_margins(parsexmltag(margins[0]));\n\n\tif(!s[\"!ref\"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s[\"!ref\"] = encode_range(refguess);\n\tif(opts.sheetRows > 0 && s[\"!ref\"]) {\n\t\tvar tmpref = safe_decode_range(s[\"!ref\"]);\n\t\tif(opts.sheetRows <= +tmpref.e.r) {\n\t\t\ttmpref.e.r = opts.sheetRows - 1;\n\t\t\tif(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;\n\t\t\tif(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;\n\t\t\tif(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;\n\t\t\tif(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;\n\t\t\ts[\"!fullref\"] = s[\"!ref\"];\n\t\t\ts[\"!ref\"] = encode_range(tmpref);\n\t\t}\n\t}\n\tif(columns.length > 0) s[\"!cols\"] = columns;\n\tif(merges.length > 0) s[\"!merges\"] = merges;\n\treturn s;\n}\n\nfunction write_ws_xml_merges(merges) {\n\tif(merges.length === 0) return \"\";\n\tvar o = '';\n\tfor(var i = 0; i != merges.length; ++i) o += '';\n\treturn o + '';\n}\n\n/* 18.3.1.82-3 sheetPr CT_ChartsheetPr / CT_SheetPr */\nfunction parse_ws_xml_sheetpr(sheetPr, s, wb, idx) {\n\tvar data = parsexmltag(sheetPr);\n\tif(!wb.Sheets[idx]) wb.Sheets[idx] = {};\n\tif(data.codeName) wb.Sheets[idx].CodeName = unescapexml(utf8read(data.codeName));\n}\nfunction parse_ws_xml_sheetpr2(sheetPr, body, s, wb, idx, styles, themes) {\n\tparse_ws_xml_sheetpr(sheetPr.slice(0, sheetPr.indexOf(\">\")), s, wb, idx);\n}\nfunction write_ws_xml_sheetpr(ws, wb, idx, opts, o) {\n\tvar needed = false;\n\tvar props = {}, payload = null;\n\tif(opts.bookType !== 'xlsx' && wb.vbaraw) {\n\t\tvar cname = wb.SheetNames[idx];\n\t\ttry { if(wb.Workbook) cname = wb.Workbook.Sheets[idx].CodeName || cname; } catch(e) {}\n\t\tneeded = true;\n\t\tprops.codeName = utf8write(escapexml(cname));\n\t}\n\n\tif(ws && ws[\"!outline\"]) {\n\t\tvar outlineprops = {summaryBelow:1, summaryRight:1};\n\t\tif(ws[\"!outline\"].above) outlineprops.summaryBelow = 0;\n\t\tif(ws[\"!outline\"].left) outlineprops.summaryRight = 0;\n\t\tpayload = (payload||\"\") + writextag('outlinePr', null, outlineprops);\n\t}\n\n\tif(!needed && !payload) return;\n\to[o.length] = (writextag('sheetPr', payload, props));\n}\n\n/* 18.3.1.85 sheetProtection CT_SheetProtection */\nvar sheetprot_deffalse = [\"objects\", \"scenarios\", \"selectLockedCells\", \"selectUnlockedCells\"];\nvar sheetprot_deftrue = [\n\t\"formatColumns\", \"formatRows\", \"formatCells\",\n\t\"insertColumns\", \"insertRows\", \"insertHyperlinks\",\n\t\"deleteColumns\", \"deleteRows\",\n\t\"sort\", \"autoFilter\", \"pivotTables\"\n];\nfunction write_ws_xml_protection(sp) {\n\t// algorithmName, hashValue, saltValue, spinCount\n\tvar o = ({sheet:1});\n\tsheetprot_deffalse.forEach(function(n) { if(sp[n] != null && sp[n]) o[n] = \"1\"; });\n\tsheetprot_deftrue.forEach(function(n) { if(sp[n] != null && !sp[n]) o[n] = \"0\"; });\n\t/* TODO: algorithm */\n\tif(sp.password) o.password = crypto_CreatePasswordVerifier_Method1(sp.password).toString(16).toUpperCase();\n\treturn writextag('sheetProtection', null, o);\n}\n\nfunction parse_ws_xml_hlinks(s, data, rels) {\n\tvar dense = Array.isArray(s);\n\tfor(var i = 0; i != data.length; ++i) {\n\t\tvar val = parsexmltag(utf8read(data[i]), true);\n\t\tif(!val.ref) return;\n\t\tvar rel = ((rels || {})['!id']||[])[val.id];\n\t\tif(rel) {\n\t\t\tval.Target = rel.Target;\n\t\t\tif(val.location) val.Target += \"#\"+unescapexml(val.location);\n\t\t} else {\n\t\t\tval.Target = \"#\" + unescapexml(val.location);\n\t\t\trel = {Target: val.Target, TargetMode: 'Internal'};\n\t\t}\n\t\tval.Rel = rel;\n\t\tif(val.tooltip) { val.Tooltip = val.tooltip; delete val.tooltip; }\n\t\tvar rng = safe_decode_range(val.ref);\n\t\tfor(var R=rng.s.r;R<=rng.e.r;++R) for(var C=rng.s.c;C<=rng.e.c;++C) {\n\t\t\tvar addr = encode_cell({c:C,r:R});\n\t\t\tif(dense) {\n\t\t\t\tif(!s[R]) s[R] = [];\n\t\t\t\tif(!s[R][C]) s[R][C] = {t:\"z\",v:undefined};\n\t\t\t\ts[R][C].l = val;\n\t\t\t} else {\n\t\t\t\tif(!s[addr]) s[addr] = {t:\"z\",v:undefined};\n\t\t\t\ts[addr].l = val;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction parse_ws_xml_margins(margin) {\n\tvar o = {};\n\t[\"left\", \"right\", \"top\", \"bottom\", \"header\", \"footer\"].forEach(function(k) {\n\t\tif(margin[k]) o[k] = parseFloat(margin[k]);\n\t});\n\treturn o;\n}\nfunction write_ws_xml_margins(margin) {\n\tdefault_margins(margin);\n\treturn writextag('pageMargins', null, margin);\n}\n\nfunction parse_ws_xml_cols(columns, cols) {\n\tvar seencol = false;\n\tfor(var coli = 0; coli != cols.length; ++coli) {\n\t\tvar coll = parsexmltag(cols[coli], true);\n\t\tif(coll.hidden) coll.hidden = parsexmlbool(coll.hidden);\n\t\tvar colm=parseInt(coll.min, 10)-1, colM=parseInt(coll.max,10)-1;\n\t\tif(coll.outlineLevel) coll.level = (+coll.outlineLevel || 0);\n\t\tdelete coll.min; delete coll.max; coll.width = +coll.width;\n\t\tif(!seencol && coll.width) { seencol = true; find_mdw_colw(coll.width); }\n\t\tprocess_col(coll);\n\t\twhile(colm <= colM) columns[colm++] = dup(coll);\n\t}\n}\nfunction write_ws_xml_cols(ws, cols) {\n\tvar o = [\"\"], col;\n\tfor(var i = 0; i != cols.length; ++i) {\n\t\tif(!(col = cols[i])) continue;\n\t\to[o.length] = (writextag('col', null, col_obj_w(i, col)));\n\t}\n\to[o.length] = \"\";\n\treturn o.join(\"\");\n}\n\nfunction parse_ws_xml_autofilter(data) {\n\tvar o = { ref: (data.match(/ref=\"([^\"]*)\"/)||[])[1]};\n\treturn o;\n}\nfunction write_ws_xml_autofilter(data, ws, wb, idx) {\n\tvar ref = typeof data.ref == \"string\" ? data.ref : encode_range(data.ref);\n\tif(!wb.Workbook) wb.Workbook = ({Sheets:[]});\n\tif(!wb.Workbook.Names) wb.Workbook.Names = [];\n\tvar names = wb.Workbook.Names;\n\tvar range = decode_range(ref);\n\tif(range.s.r == range.e.r) { range.e.r = decode_range(ws[\"!ref\"]).e.r; ref = encode_range(range); }\n\tfor(var i = 0; i < names.length; ++i) {\n\t\tvar name = names[i];\n\t\tif(name.Name != '_xlnm._FilterDatabase') continue;\n\t\tif(name.Sheet != idx) continue;\n\t\tname.Ref = \"'\" + wb.SheetNames[idx] + \"'!\" + ref; break;\n\t}\n\tif(i == names.length) names.push({ Name: '_xlnm._FilterDatabase', Sheet: idx, Ref: \"'\" + wb.SheetNames[idx] + \"'!\" + ref });\n\treturn writextag(\"autoFilter\", null, {ref:ref});\n}\n\n/* 18.3.1.88 sheetViews CT_SheetViews */\n/* 18.3.1.87 sheetView CT_SheetView */\nvar sviewregex = /<(?:\\w:)?sheetView(?:[^>a-z][^>]*)?\\/?>/;\nfunction parse_ws_xml_sheetviews(data, wb) {\n\tif(!wb.Views) wb.Views = [{}];\n\t(data.match(sviewregex)||[]).forEach(function(r, i) {\n\t\tvar tag = parsexmltag(r);\n\t\t// $FlowIgnore\n\t\tif(!wb.Views[i]) wb.Views[i] = {};\n\t\t// $FlowIgnore\n\t\tif(+tag.zoomScale) wb.Views[i].zoom = +tag.zoomScale;\n\t\t// $FlowIgnore\n\t\tif(parsexmlbool(tag.rightToLeft)) wb.Views[i].RTL = true;\n\t});\n}\nfunction write_ws_xml_sheetviews(ws, opts, idx, wb) {\n\tvar sview = ({workbookViewId:\"0\"});\n\t// $FlowIgnore\n\tif((((wb||{}).Workbook||{}).Views||[])[0]) sview.rightToLeft = wb.Workbook.Views[0].RTL ? \"1\" : \"0\";\n\treturn writextag(\"sheetViews\", writextag(\"sheetView\", null, sview), {});\n}\n\nfunction write_ws_xml_cell(cell, ref, ws, opts) {\n\tif(cell.v === undefined && typeof cell.f !== \"string\" || cell.t === 'z') return \"\";\n\tvar vv = \"\";\n\tvar oldt = cell.t, oldv = cell.v;\n\tif(cell.t !== \"z\") switch(cell.t) {\n\t\tcase 'b': vv = cell.v ? \"1\" : \"0\"; break;\n\t\tcase 'n': vv = ''+cell.v; break;\n\t\tcase 'e': vv = BErr[cell.v]; break;\n\t\tcase 'd':\n\t\t\tif(opts && opts.cellDates) vv = parseDate(cell.v, -1).toISOString();\n\t\t\telse {\n\t\t\t\tcell = dup(cell);\n\t\t\t\tcell.t = 'n';\n\t\t\t\tvv = ''+(cell.v = datenum(parseDate(cell.v)));\n\t\t\t}\n\t\t\tif(typeof cell.z === 'undefined') cell.z = SSF._table[14];\n\t\t\tbreak;\n\t\tdefault: vv = cell.v; break;\n\t}\n\tvar v = writetag('v', escapexml(vv)), o = ({r:ref});\n\t/* TODO: cell style */\n\tvar os = get_cell_style(opts.cellXfs, cell, opts);\n\tif(os !== 0) o.s = os;\n\tswitch(cell.t) {\n\t\tcase 'n': break;\n\t\tcase 'd': o.t = \"d\"; break;\n\t\tcase 'b': o.t = \"b\"; break;\n\t\tcase 'e': o.t = \"e\"; break;\n\t\tcase 'z': break;\n\t\tdefault: if(cell.v == null) { delete cell.t; break; }\n\t\t\tif(cell.v.length > 32767) throw new Error(\"Text length must not exceed 32767 characters\");\n\t\t\tif(opts && opts.bookSST) {\n\t\t\t\tv = writetag('v', ''+get_sst_id(opts.Strings, cell.v, opts.revStrings));\n\t\t\t\to.t = \"s\"; break;\n\t\t\t}\n\t\t\to.t = \"str\"; break;\n\t}\n\tif(cell.t != oldt) { cell.t = oldt; cell.v = oldv; }\n\tif(typeof cell.f == \"string\" && cell.f) {\n\t\tvar ff = cell.F && cell.F.slice(0, ref.length) == ref ? {t:\"array\", ref:cell.F} : null;\n\t\tv = writextag('f', escapexml(cell.f), ff) + (cell.v != null ? v : \"\");\n\t}\n\tif(cell.l) ws['!links'].push([ref, cell.l]);\n\tif(cell.c) ws['!comments'].push([ref, cell.c]);\n\treturn writextag('c', v, o);\n}\n\nvar parse_ws_xml_data = (function() {\n\tvar cellregex = /<(?:\\w+:)?c[ \\/>]/, rowregex = /<\\/(?:\\w+:)?row>/;\n\tvar rregex = /r=[\"']([^\"']*)[\"']/, isregex = /<(?:\\w+:)?is>([\\S\\s]*?)<\\/(?:\\w+:)?is>/;\n\tvar refregex = /ref=[\"']([^\"']*)[\"']/;\n\tvar match_v = matchtag(\"v\"), match_f = matchtag(\"f\");\n\nreturn function parse_ws_xml_data(sdata, s, opts, guess, themes, styles) {\n\tvar ri = 0, x = \"\", cells = [], cref = [], idx=0, i=0, cc=0, d=\"\", p;\n\tvar tag, tagr = 0, tagc = 0;\n\tvar sstr, ftag;\n\tvar fmtid = 0, fillid = 0;\n\tvar do_format = Array.isArray(styles.CellXf), cf;\n\tvar arrayf = [];\n\tvar sharedf = [];\n\tvar dense = Array.isArray(s);\n\tvar rows = [], rowobj = {}, rowrite = false;\n\tvar sheetStubs = !!opts.sheetStubs;\n\tfor(var marr = sdata.split(rowregex), mt = 0, marrlen = marr.length; mt != marrlen; ++mt) {\n\t\tx = marr[mt].trim();\n\t\tvar xlen = x.length;\n\t\tif(xlen === 0) continue;\n\n\t\t/* 18.3.1.73 row CT_Row */\n\t\tvar rstarti = 0;\n\t\touta: for(ri = 0; ri < xlen; ++ri) switch(/*x.charCodeAt(ri)*/x[ri]) {\n\t\t\tcase \">\" /*62*/:\n\t\t\t\tif(/*x.charCodeAt(ri-1) != 47*/x[ri-1] != \"/\") { ++ri; break outa; }\n\t\t\t\tif(opts && opts.cellStyles) {\n\t\t\t\t\t// TODO: avoid duplication\n\t\t\t\t\ttag = parsexmltag(x.slice(rstarti,ri), true);\n\t\t\t\t\ttagr = tag.r != null ? parseInt(tag.r, 10) : tagr+1; tagc = -1;\n\t\t\t\t\tif(opts.sheetRows && opts.sheetRows < tagr) continue;\n\t\t\t\t\trowobj = {}; rowrite = false;\n\t\t\t\t\tif(tag.ht) { rowrite = true; rowobj.hpt = parseFloat(tag.ht); rowobj.hpx = pt2px(rowobj.hpt); }\n\t\t\t\t\tif(tag.hidden == \"1\") { rowrite = true; rowobj.hidden = true; }\n\t\t\t\t\tif(tag.outlineLevel != null) { rowrite = true; rowobj.level = +tag.outlineLevel; }\n\t\t\t\t\tif(rowrite) rows[tagr-1] = rowobj;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"<\" /*60*/: rstarti = ri; break;\n\t\t}\n\t\tif(rstarti >= ri) break;\n\t\ttag = parsexmltag(x.slice(rstarti,ri), true);\n\t\ttagr = tag.r != null ? parseInt(tag.r, 10) : tagr+1; tagc = -1;\n\t\tif(opts.sheetRows && opts.sheetRows < tagr) continue;\n\t\tif(guess.s.r > tagr - 1) guess.s.r = tagr - 1;\n\t\tif(guess.e.r < tagr - 1) guess.e.r = tagr - 1;\n\n\t\tif(opts && opts.cellStyles) {\n\t\t\trowobj = {}; rowrite = false;\n\t\t\tif(tag.ht) { rowrite = true; rowobj.hpt = parseFloat(tag.ht); rowobj.hpx = pt2px(rowobj.hpt); }\n\t\t\tif(tag.hidden == \"1\") { rowrite = true; rowobj.hidden = true; }\n\t\t\tif(tag.outlineLevel != null) { rowrite = true; rowobj.level = +tag.outlineLevel; }\n\t\t\tif(rowrite) rows[tagr-1] = rowobj;\n\t\t}\n\n\t\t/* 18.3.1.4 c CT_Cell */\n\t\tcells = x.slice(ri).split(cellregex);\n\t\tfor(var rslice = 0; rslice != cells.length; ++rslice) if(cells[rslice].trim().charAt(0) != \"<\") break;\n\t\tcells = cells.slice(rslice);\n\t\tfor(ri = 0; ri != cells.length; ++ri) {\n\t\t\tx = cells[ri].trim();\n\t\t\tif(x.length === 0) continue;\n\t\t\tcref = x.match(rregex); idx = ri; i=0; cc=0;\n\t\t\tx = \"\":\"\") + x;\n\t\t\tif(cref != null && cref.length === 2) {\n\t\t\t\tidx = 0; d=cref[1];\n\t\t\t\tfor(i=0; i != d.length; ++i) {\n\t\t\t\t\tif((cc=d.charCodeAt(i)-64) < 1 || cc > 26) break;\n\t\t\t\t\tidx = 26*idx + cc;\n\t\t\t\t}\n\t\t\t\t--idx;\n\t\t\t\ttagc = idx;\n\t\t\t} else ++tagc;\n\t\t\tfor(i = 0; i != x.length; ++i) if(x.charCodeAt(i) === 62) break; ++i;\n\t\t\ttag = parsexmltag(x.slice(0,i), true);\n\t\t\tif(!tag.r) tag.r = encode_cell({r:tagr-1, c:tagc});\n\t\t\td = x.slice(i);\n\t\t\tp = ({t:\"\"});\n\n\t\t\tif((cref=d.match(match_v))!= null && cref[1] !== '') p.v=unescapexml(cref[1]);\n\t\t\tif(opts.cellFormula) {\n\t\t\t\tif((cref=d.match(match_f))!= null && cref[1] !== '') {\n\t\t\t\t\t/* TODO: match against XLSXFutureFunctions */\n\t\t\t\t\tp.f=unescapexml(utf8read(cref[1])).replace(/\\r\\n/g, \"\\n\");\n\t\t\t\t\tif(!opts.xlfn) p.f = _xlfn(p.f);\n\t\t\t\t\tif(cref[0].indexOf('t=\"array\"') > -1) {\n\t\t\t\t\t\tp.F = (d.match(refregex)||[])[1];\n\t\t\t\t\t\tif(p.F.indexOf(\":\") > -1) arrayf.push([safe_decode_range(p.F), p.F]);\n\t\t\t\t\t} else if(cref[0].indexOf('t=\"shared\"') > -1) {\n\t\t\t\t\t\t// TODO: parse formula\n\t\t\t\t\t\tftag = parsexmltag(cref[0]);\n\t\t\t\t\t\tvar ___f = unescapexml(utf8read(cref[1]));\n\t\t\t\t\t\tif(!opts.xlfn) ___f = _xlfn(___f);\n\t\t\t\t\t\tsharedf[parseInt(ftag.si, 10)] = [ftag, ___f, tag.r];\n\t\t\t\t\t}\n\t\t\t\t} else if((cref=d.match(/]*\\/>/))) {\n\t\t\t\t\tftag = parsexmltag(cref[0]);\n\t\t\t\t\tif(sharedf[ftag.si]) p.f = shift_formula_xlsx(sharedf[ftag.si][1], sharedf[ftag.si][2]/*[0].ref*/, tag.r);\n\t\t\t\t}\n\t\t\t\t/* TODO: factor out contains logic */\n\t\t\t\tvar _tag = decode_cell(tag.r);\n\t\t\t\tfor(i = 0; i < arrayf.length; ++i)\n\t\t\t\t\tif(_tag.r >= arrayf[i][0].s.r && _tag.r <= arrayf[i][0].e.r)\n\t\t\t\t\t\tif(_tag.c >= arrayf[i][0].s.c && _tag.c <= arrayf[i][0].e.c)\n\t\t\t\t\t\t\tp.F = arrayf[i][1];\n\t\t\t}\n\n\t\t\tif(tag.t == null && p.v === undefined) {\n\t\t\t\tif(p.f || p.F) {\n\t\t\t\t\tp.v = 0; p.t = \"n\";\n\t\t\t\t} else if(!sheetStubs) continue;\n\t\t\t\telse p.t = \"z\";\n\t\t\t}\n\t\t\telse p.t = tag.t || \"n\";\n\t\t\tif(guess.s.c > tagc) guess.s.c = tagc;\n\t\t\tif(guess.e.c < tagc) guess.e.c = tagc;\n\t\t\t/* 18.18.11 t ST_CellType */\n\t\t\tswitch(p.t) {\n\t\t\t\tcase 'n':\n\t\t\t\t\tif(p.v == \"\" || p.v == null) {\n\t\t\t\t\t\tif(!sheetStubs) continue;\n\t\t\t\t\t\tp.t = 'z';\n\t\t\t\t\t} else p.v = parseFloat(p.v);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 's':\n\t\t\t\t\tif(typeof p.v == 'undefined') {\n\t\t\t\t\t\tif(!sheetStubs) continue;\n\t\t\t\t\t\tp.t = 'z';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsstr = strs[parseInt(p.v, 10)];\n\t\t\t\t\t\tp.v = sstr.t;\n\t\t\t\t\t\tp.r = sstr.r;\n\t\t\t\t\t\tif(opts.cellHTML) p.h = sstr.h;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'str':\n\t\t\t\t\tp.t = \"s\";\n\t\t\t\t\tp.v = (p.v!=null) ? utf8read(p.v) : '';\n\t\t\t\t\tif(opts.cellHTML) p.h = escapehtml(p.v);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'inlineStr':\n\t\t\t\t\tcref = d.match(isregex);\n\t\t\t\t\tp.t = 's';\n\t\t\t\t\tif(cref != null && (sstr = parse_si(cref[1]))) {\n\t\t\t\t\t\tp.v = sstr.t;\n\t\t\t\t\t\tif(opts.cellHTML) p.h = sstr.h;\n\t\t\t\t\t} else p.v = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'b': p.v = parsexmlbool(p.v); break;\n\t\t\t\tcase 'd':\n\t\t\t\t\tif(opts.cellDates) p.v = parseDate(p.v, 1);\n\t\t\t\t\telse { p.v = datenum(parseDate(p.v, 1)); p.t = 'n'; }\n\t\t\t\t\tbreak;\n\t\t\t\t/* error string in .w, number in .v */\n\t\t\t\tcase 'e':\n\t\t\t\t\tif(!opts || opts.cellText !== false) p.w = p.v;\n\t\t\t\t\tp.v = RBErr[p.v]; break;\n\t\t\t}\n\t\t\t/* formatting */\n\t\t\tfmtid = fillid = 0;\n\t\t\tcf = null;\n\t\t\tif(do_format && tag.s !== undefined) {\n\t\t\t\tcf = styles.CellXf[tag.s];\n\t\t\t\tif(cf != null) {\n\t\t\t\t\tif(cf.numFmtId != null) fmtid = cf.numFmtId;\n\t\t\t\t\tif(opts.cellStyles) {\n\t\t\t\t\t\tif(cf.fillId != null) fillid = cf.fillId;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tsafe_format(p, fmtid, fillid, opts, themes, styles);\n\t\t\tif(opts.cellDates && do_format && p.t == 'n' && SSF.is_date(SSF._table[fmtid])) { p.t = 'd'; p.v = numdate(p.v); }\n\t\t\tif(dense) {\n\t\t\t\tvar _r = decode_cell(tag.r);\n\t\t\t\tif(!s[_r.r]) s[_r.r] = [];\n\t\t\t\ts[_r.r][_r.c] = p;\n\t\t\t} else s[tag.r] = p;\n\t\t}\n\t}\n\tif(rows.length > 0) s['!rows'] = rows;\n}; })();\n\nfunction write_ws_xml_data(ws, opts, idx, wb) {\n\tvar o = [], r = [], range = safe_decode_range(ws['!ref']), cell=\"\", ref, rr = \"\", cols = [], R=0, C=0, rows = ws['!rows'];\n\tvar dense = Array.isArray(ws);\n\tvar params = ({r:rr}), row, height = -1;\n\tfor(C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C);\n\tfor(R = range.s.r; R <= range.e.r; ++R) {\n\t\tr = [];\n\t\trr = encode_row(R);\n\t\tfor(C = range.s.c; C <= range.e.c; ++C) {\n\t\t\tref = cols[C] + rr;\n\t\t\tvar _cell = dense ? (ws[R]||[])[C]: ws[ref];\n\t\t\tif(_cell === undefined) continue;\n\t\t\tif((cell = write_ws_xml_cell(_cell, ref, ws, opts, idx, wb)) != null) r.push(cell);\n\t\t}\n\t\tif(r.length > 0 || (rows && rows[R])) {\n\t\t\tparams = ({r:rr});\n\t\t\tif(rows && rows[R]) {\n\t\t\t\trow = rows[R];\n\t\t\t\tif(row.hidden) params.hidden = 1;\n\t\t\t\theight = -1;\n\t\t\t\tif(row.hpx) height = px2pt(row.hpx);\n\t\t\t\telse if(row.hpt) height = row.hpt;\n\t\t\t\tif(height > -1) { params.ht = height; params.customHeight = 1; }\n\t\t\t\tif(row.level) { params.outlineLevel = row.level; }\n\t\t\t}\n\t\t\to[o.length] = (writextag('row', r.join(\"\"), params));\n\t\t}\n\t}\n\tif(rows) for(; R < rows.length; ++R) {\n\t\tif(rows && rows[R]) {\n\t\t\tparams = ({r:R+1});\n\t\t\trow = rows[R];\n\t\t\tif(row.hidden) params.hidden = 1;\n\t\t\theight = -1;\n\t\t\tif (row.hpx) height = px2pt(row.hpx);\n\t\t\telse if (row.hpt) height = row.hpt;\n\t\t\tif (height > -1) { params.ht = height; params.customHeight = 1; }\n\t\t\tif (row.level) { params.outlineLevel = row.level; }\n\t\t\to[o.length] = (writextag('row', \"\", params));\n\t\t}\n\t}\n\treturn o.join(\"\");\n}\n\nvar WS_XML_ROOT = writextag('worksheet', null, {\n\t'xmlns': XMLNS.main[0],\n\t'xmlns:r': XMLNS.r\n});\n\nfunction write_ws_xml(idx, opts, wb, rels) {\n\tvar o = [XML_HEADER, WS_XML_ROOT];\n\tvar s = wb.SheetNames[idx], sidx = 0, rdata = \"\";\n\tvar ws = wb.Sheets[s];\n\tif(ws == null) ws = {};\n\tvar ref = ws['!ref'] || 'A1';\n\tvar range = safe_decode_range(ref);\n\tif(range.e.c > 0x3FFF || range.e.r > 0xFFFFF) {\n\t\tif(opts.WTF) throw new Error(\"Range \" + ref + \" exceeds format limit A1:XFD1048576\");\n\t\trange.e.c = Math.min(range.e.c, 0x3FFF);\n\t\trange.e.r = Math.min(range.e.c, 0xFFFFF);\n\t\tref = encode_range(range);\n\t}\n\tif(!rels) rels = {};\n\tws['!comments'] = [];\n\tvar _drawing = [];\n\n\twrite_ws_xml_sheetpr(ws, wb, idx, opts, o);\n\n\to[o.length] = (writextag('dimension', null, {'ref': ref}));\n\n\to[o.length] = write_ws_xml_sheetviews(ws, opts, idx, wb);\n\n\t/* TODO: store in WB, process styles */\n\tif(opts.sheetFormat) o[o.length] = (writextag('sheetFormatPr', null, {\n\t\tdefaultRowHeight:opts.sheetFormat.defaultRowHeight||'16',\n\t\tbaseColWidth:opts.sheetFormat.baseColWidth||'10',\n\t\toutlineLevelRow:opts.sheetFormat.outlineLevelRow||'7'\n\t}));\n\n\tif(ws['!cols'] != null && ws['!cols'].length > 0) o[o.length] = (write_ws_xml_cols(ws, ws['!cols']));\n\n\to[sidx = o.length] = '';\n\tws['!links'] = [];\n\tif(ws['!ref'] != null) {\n\t\trdata = write_ws_xml_data(ws, opts, idx, wb, rels);\n\t\tif(rdata.length > 0) o[o.length] = (rdata);\n\t}\n\tif(o.length>sidx+1) { o[o.length] = (''); o[sidx]=o[sidx].replace(\"/>\",\">\"); }\n\n\t/* sheetCalcPr */\n\n\tif(ws['!protect']) o[o.length] = write_ws_xml_protection(ws['!protect']);\n\n\t/* protectedRanges */\n\t/* scenarios */\n\n\tif(ws['!autofilter'] != null) o[o.length] = write_ws_xml_autofilter(ws['!autofilter'], ws, wb, idx);\n\n\t/* sortState */\n\t/* dataConsolidate */\n\t/* customSheetViews */\n\n\tif(ws['!merges'] != null && ws['!merges'].length > 0) o[o.length] = (write_ws_xml_merges(ws['!merges']));\n\n\t/* phoneticPr */\n\t/* conditionalFormatting */\n\t/* dataValidations */\n\n\tvar relc = -1, rel, rId = -1;\n\tif(ws['!links'].length > 0) {\n\t\to[o.length] = \"\";\nws['!links'].forEach(function(l) {\n\t\t\tif(!l[1].Target) return;\n\t\t\trel = ({\"ref\":l[0]});\n\t\t\tif(l[1].Target.charAt(0) != \"#\") {\n\t\t\t\trId = add_rels(rels, -1, escapexml(l[1].Target).replace(/#.*$/, \"\"), RELS.HLINK);\n\t\t\t\trel[\"r:id\"] = \"rId\"+rId;\n\t\t\t}\n\t\t\tif((relc = l[1].Target.indexOf(\"#\")) > -1) rel.location = escapexml(l[1].Target.slice(relc+1));\n\t\t\tif(l[1].Tooltip) rel.tooltip = escapexml(l[1].Tooltip);\n\t\t\to[o.length] = writextag(\"hyperlink\",null,rel);\n\t\t});\n\t\to[o.length] = \"\";\n\t}\n\tdelete ws['!links'];\n\n\t/* printOptions */\n\n\tif(ws['!margins'] != null) o[o.length] = write_ws_xml_margins(ws['!margins']);\n\n\t/* pageSetup */\n\t/* headerFooter */\n\t/* rowBreaks */\n\t/* colBreaks */\n\t/* customProperties */\n\t/* cellWatches */\n\n\tif(!opts || opts.ignoreEC || (opts.ignoreEC == (void 0))) o[o.length] = writetag(\"ignoredErrors\", writextag(\"ignoredError\", null, {numberStoredAsText:1, sqref:ref}));\n\n\t/* smartTags */\n\n\tif(_drawing.length > 0) {\n\t\trId = add_rels(rels, -1, \"../drawings/drawing\" + (idx+1) + \".xml\", RELS.DRAW);\n\t\to[o.length] = writextag(\"drawing\", null, {\"r:id\":\"rId\" + rId});\n\t\tws['!drawing'] = _drawing;\n\t}\n\n\tif(ws['!comments'].length > 0) {\n\t\trId = add_rels(rels, -1, \"../drawings/vmlDrawing\" + (idx+1) + \".vml\", RELS.VML);\n\t\to[o.length] = writextag(\"legacyDrawing\", null, {\"r:id\":\"rId\" + rId});\n\t\tws['!legacy'] = rId;\n\t}\n\n\t/* legacyDrawingHF */\n\t/* picture */\n\t/* oleObjects */\n\t/* controls */\n\t/* webPublishItems */\n\t/* tableParts */\n\t/* extLst */\n\n\tif(o.length>1) { o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n\n/* [MS-XLSB] 2.4.726 BrtRowHdr */\nfunction parse_BrtRowHdr(data, length) {\n\tvar z = ({});\n\tvar tgt = data.l + length;\n\tz.r = data.read_shift(4);\n\tdata.l += 4; // TODO: ixfe\n\tvar miyRw = data.read_shift(2);\n\tdata.l += 1; // TODO: top/bot padding\n\tvar flags = data.read_shift(1);\n\tdata.l = tgt;\n\tif(flags & 0x07) z.level = flags & 0x07;\n\tif(flags & 0x10) z.hidden = true;\n\tif(flags & 0x20) z.hpt = miyRw / 20;\n\treturn z;\n}\nfunction write_BrtRowHdr(R, range, ws) {\n\tvar o = new_buf(17+8*16);\n\tvar row = (ws['!rows']||[])[R]||{};\n\to.write_shift(4, R);\n\n\to.write_shift(4, 0); /* TODO: ixfe */\n\n\tvar miyRw = 0x0140;\n\tif(row.hpx) miyRw = px2pt(row.hpx) * 20;\n\telse if(row.hpt) miyRw = row.hpt * 20;\n\to.write_shift(2, miyRw);\n\n\to.write_shift(1, 0); /* top/bot padding */\n\n\tvar flags = 0x0;\n\tif(row.level) flags |= row.level;\n\tif(row.hidden) flags |= 0x10;\n\tif(row.hpx || row.hpt) flags |= 0x20;\n\to.write_shift(1, flags);\n\n\to.write_shift(1, 0); /* phonetic guide */\n\n\t/* [MS-XLSB] 2.5.8 BrtColSpan explains the mechanism */\n\tvar ncolspan = 0, lcs = o.l;\n\to.l += 4;\n\n\tvar caddr = {r:R, c:0};\n\tfor(var i = 0; i < 16; ++i) {\n\t\tif((range.s.c > ((i+1) << 10)) || (range.e.c < (i << 10))) continue;\n\t\tvar first = -1, last = -1;\n\t\tfor(var j = (i<<10); j < ((i+1)<<10); ++j) {\n\t\t\tcaddr.c = j;\n\t\t\tvar cell = Array.isArray(ws) ? (ws[caddr.r]||[])[caddr.c] : ws[encode_cell(caddr)];\n\t\t\tif(cell) { if(first < 0) first = j; last = j; }\n\t\t}\n\t\tif(first < 0) continue;\n\t\t++ncolspan;\n\t\to.write_shift(4, first);\n\t\to.write_shift(4, last);\n\t}\n\n\tvar l = o.l;\n\to.l = lcs;\n\to.write_shift(4, ncolspan);\n\to.l = l;\n\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\nfunction write_row_header(ba, ws, range, R) {\n\tvar o = write_BrtRowHdr(R, range, ws);\n\tif((o.length > 17) || (ws['!rows']||[])[R]) write_record(ba, 'BrtRowHdr', o);\n}\n\n/* [MS-XLSB] 2.4.820 BrtWsDim */\nvar parse_BrtWsDim = parse_UncheckedRfX;\nvar write_BrtWsDim = write_UncheckedRfX;\n\n/* [MS-XLSB] 2.4.821 BrtWsFmtInfo */\nfunction parse_BrtWsFmtInfo() {\n}\n//function write_BrtWsFmtInfo(ws, o) { }\n\n/* [MS-XLSB] 2.4.823 BrtWsProp */\nfunction parse_BrtWsProp(data, length) {\n\tvar z = {};\n\tvar f = data[data.l]; ++data.l;\n\tz.above = !(f & 0x40);\n\tz.left = !(f & 0x80);\n\t/* TODO: pull flags */\n\tdata.l += 18;\n\tz.name = parse_XLSBCodeName(data, length - 19);\n\treturn z;\n}\nfunction write_BrtWsProp(str, outl, o) {\n\tif(o == null) o = new_buf(84+4*str.length);\n\tvar f = 0xC0;\n\tif(outl) {\n\t\tif(outl.above) f &= ~0x40;\n\t\tif(outl.left) f &= ~0x80;\n\t}\n\to.write_shift(1, f);\n\tfor(var i = 1; i < 3; ++i) o.write_shift(1,0);\n\twrite_BrtColor({auto:1}, o);\n\to.write_shift(-4,-1);\n\to.write_shift(-4,-1);\n\twrite_XLSBCodeName(str, o);\n\treturn o.slice(0, o.l);\n}\n\n/* [MS-XLSB] 2.4.306 BrtCellBlank */\nfunction parse_BrtCellBlank(data) {\n\tvar cell = parse_XLSBCell(data);\n\treturn [cell];\n}\nfunction write_BrtCellBlank(cell, ncell, o) {\n\tif(o == null) o = new_buf(8);\n\treturn write_XLSBCell(ncell, o);\n}\nfunction parse_BrtShortBlank(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\treturn [cell];\n}\nfunction write_BrtShortBlank(cell, ncell, o) {\n\tif(o == null) o = new_buf(4);\n\treturn write_XLSBShortCell(ncell, o);\n}\n\n/* [MS-XLSB] 2.4.307 BrtCellBool */\nfunction parse_BrtCellBool(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar fBool = data.read_shift(1);\n\treturn [cell, fBool, 'b'];\n}\nfunction write_BrtCellBool(cell, ncell, o) {\n\tif(o == null) o = new_buf(9);\n\twrite_XLSBCell(ncell, o);\n\to.write_shift(1, cell.v ? 1 : 0);\n\treturn o;\n}\nfunction parse_BrtShortBool(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\tvar fBool = data.read_shift(1);\n\treturn [cell, fBool, 'b'];\n}\nfunction write_BrtShortBool(cell, ncell, o) {\n\tif(o == null) o = new_buf(5);\n\twrite_XLSBShortCell(ncell, o);\n\to.write_shift(1, cell.v ? 1 : 0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.308 BrtCellError */\nfunction parse_BrtCellError(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar bError = data.read_shift(1);\n\treturn [cell, bError, 'e'];\n}\nfunction write_BrtCellError(cell, ncell, o) {\n\tif(o == null) o = new_buf(9);\n\twrite_XLSBCell(ncell, o);\n\to.write_shift(1, cell.v);\n\treturn o;\n}\nfunction parse_BrtShortError(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\tvar bError = data.read_shift(1);\n\treturn [cell, bError, 'e'];\n}\nfunction write_BrtShortError(cell, ncell, o) {\n\tif(o == null) o = new_buf(8);\n\twrite_XLSBShortCell(ncell, o);\n\to.write_shift(1, cell.v);\n\to.write_shift(2, 0);\n\to.write_shift(1, 0);\n\treturn o;\n}\n\n\n/* [MS-XLSB] 2.4.311 BrtCellIsst */\nfunction parse_BrtCellIsst(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar isst = data.read_shift(4);\n\treturn [cell, isst, 's'];\n}\nfunction write_BrtCellIsst(cell, ncell, o) {\n\tif(o == null) o = new_buf(12);\n\twrite_XLSBCell(ncell, o);\n\to.write_shift(4, ncell.v);\n\treturn o;\n}\nfunction parse_BrtShortIsst(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\tvar isst = data.read_shift(4);\n\treturn [cell, isst, 's'];\n}\nfunction write_BrtShortIsst(cell, ncell, o) {\n\tif(o == null) o = new_buf(8);\n\twrite_XLSBShortCell(ncell, o);\n\to.write_shift(4, ncell.v);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.313 BrtCellReal */\nfunction parse_BrtCellReal(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_Xnum(data);\n\treturn [cell, value, 'n'];\n}\nfunction write_BrtCellReal(cell, ncell, o) {\n\tif(o == null) o = new_buf(16);\n\twrite_XLSBCell(ncell, o);\n\twrite_Xnum(cell.v, o);\n\treturn o;\n}\nfunction parse_BrtShortReal(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\tvar value = parse_Xnum(data);\n\treturn [cell, value, 'n'];\n}\nfunction write_BrtShortReal(cell, ncell, o) {\n\tif(o == null) o = new_buf(12);\n\twrite_XLSBShortCell(ncell, o);\n\twrite_Xnum(cell.v, o);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.314 BrtCellRk */\nfunction parse_BrtCellRk(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_RkNumber(data);\n\treturn [cell, value, 'n'];\n}\nfunction write_BrtCellRk(cell, ncell, o) {\n\tif(o == null) o = new_buf(12);\n\twrite_XLSBCell(ncell, o);\n\twrite_RkNumber(cell.v, o);\n\treturn o;\n}\nfunction parse_BrtShortRk(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\tvar value = parse_RkNumber(data);\n\treturn [cell, value, 'n'];\n}\nfunction write_BrtShortRk(cell, ncell, o) {\n\tif(o == null) o = new_buf(8);\n\twrite_XLSBShortCell(ncell, o);\n\twrite_RkNumber(cell.v, o);\n\treturn o;\n}\n\n\n/* [MS-XLSB] 2.4.317 BrtCellSt */\nfunction parse_BrtCellSt(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_XLWideString(data);\n\treturn [cell, value, 'str'];\n}\nfunction write_BrtCellSt(cell, ncell, o) {\n\tif(o == null) o = new_buf(12 + 4 * cell.v.length);\n\twrite_XLSBCell(ncell, o);\n\twrite_XLWideString(cell.v, o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\nfunction parse_BrtShortSt(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\tvar value = parse_XLWideString(data);\n\treturn [cell, value, 'str'];\n}\nfunction write_BrtShortSt(cell, ncell, o) {\n\tif(o == null) o = new_buf(8 + 4 * cell.v.length);\n\twrite_XLSBShortCell(ncell, o);\n\twrite_XLWideString(cell.v, o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.653 BrtFmlaBool */\nfunction parse_BrtFmlaBool(data, length, opts) {\n\tvar end = data.l + length;\n\tvar cell = parse_XLSBCell(data);\n\tcell.r = opts['!row'];\n\tvar value = data.read_shift(1);\n\tvar o = [cell, value, 'b'];\n\tif(opts.cellFormula) {\n\t\tdata.l += 2;\n\t\tvar formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);\n\t\to[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */\n\t}\n\telse data.l = end;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.654 BrtFmlaError */\nfunction parse_BrtFmlaError(data, length, opts) {\n\tvar end = data.l + length;\n\tvar cell = parse_XLSBCell(data);\n\tcell.r = opts['!row'];\n\tvar value = data.read_shift(1);\n\tvar o = [cell, value, 'e'];\n\tif(opts.cellFormula) {\n\t\tdata.l += 2;\n\t\tvar formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);\n\t\to[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */\n\t}\n\telse data.l = end;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.655 BrtFmlaNum */\nfunction parse_BrtFmlaNum(data, length, opts) {\n\tvar end = data.l + length;\n\tvar cell = parse_XLSBCell(data);\n\tcell.r = opts['!row'];\n\tvar value = parse_Xnum(data);\n\tvar o = [cell, value, 'n'];\n\tif(opts.cellFormula) {\n\t\tdata.l += 2;\n\t\tvar formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);\n\t\to[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */\n\t}\n\telse data.l = end;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.656 BrtFmlaString */\nfunction parse_BrtFmlaString(data, length, opts) {\n\tvar end = data.l + length;\n\tvar cell = parse_XLSBCell(data);\n\tcell.r = opts['!row'];\n\tvar value = parse_XLWideString(data);\n\tvar o = [cell, value, 'str'];\n\tif(opts.cellFormula) {\n\t\tdata.l += 2;\n\t\tvar formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);\n\t\to[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */\n\t}\n\telse data.l = end;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.682 BrtMergeCell */\nvar parse_BrtMergeCell = parse_UncheckedRfX;\nvar write_BrtMergeCell = write_UncheckedRfX;\n/* [MS-XLSB] 2.4.107 BrtBeginMergeCells */\nfunction write_BrtBeginMergeCells(cnt, o) {\n\tif(o == null) o = new_buf(4);\n\to.write_shift(4, cnt);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.662 BrtHLink */\nfunction parse_BrtHLink(data, length) {\n\tvar end = data.l + length;\n\tvar rfx = parse_UncheckedRfX(data, 16);\n\tvar relId = parse_XLNullableWideString(data);\n\tvar loc = parse_XLWideString(data);\n\tvar tooltip = parse_XLWideString(data);\n\tvar display = parse_XLWideString(data);\n\tdata.l = end;\n\tvar o = ({rfx:rfx, relId:relId, loc:loc, display:display});\n\tif(tooltip) o.Tooltip = tooltip;\n\treturn o;\n}\nfunction write_BrtHLink(l, rId) {\n\tvar o = new_buf(50+4*(l[1].Target.length + (l[1].Tooltip || \"\").length));\n\twrite_UncheckedRfX({s:decode_cell(l[0]), e:decode_cell(l[0])}, o);\n\twrite_RelID(\"rId\" + rId, o);\n\tvar locidx = l[1].Target.indexOf(\"#\");\n\tvar loc = locidx == -1 ? \"\" : l[1].Target.slice(locidx+1);\n\twrite_XLWideString(loc || \"\", o);\n\twrite_XLWideString(l[1].Tooltip || \"\", o);\n\twrite_XLWideString(\"\", o);\n\treturn o.slice(0, o.l);\n}\n\n/* [MS-XLSB] 2.4.692 BrtPane */\nfunction parse_BrtPane(/*data, length, opts*/) {\n}\n\n/* [MS-XLSB] 2.4.6 BrtArrFmla */\nfunction parse_BrtArrFmla(data, length, opts) {\n\tvar end = data.l + length;\n\tvar rfx = parse_RfX(data, 16);\n\tvar fAlwaysCalc = data.read_shift(1);\n\tvar o = [rfx]; o[2] = fAlwaysCalc;\n\tif(opts.cellFormula) {\n\t\tvar formula = parse_XLSBArrayParsedFormula(data, end - data.l, opts);\n\t\to[1] = formula;\n\t} else data.l = end;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.750 BrtShrFmla */\nfunction parse_BrtShrFmla(data, length, opts) {\n\tvar end = data.l + length;\n\tvar rfx = parse_UncheckedRfX(data, 16);\n\tvar o = [rfx];\n\tif(opts.cellFormula) {\n\t\tvar formula = parse_XLSBSharedParsedFormula(data, end - data.l, opts);\n\t\to[1] = formula;\n\t\tdata.l = end;\n\t} else data.l = end;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.323 BrtColInfo */\n/* TODO: once XLS ColInfo is set, combine the functions */\nfunction write_BrtColInfo(C, col, o) {\n\tif(o == null) o = new_buf(18);\n\tvar p = col_obj_w(C, col);\n\to.write_shift(-4, C);\n\to.write_shift(-4, C);\n\to.write_shift(4, (p.width || 10) * 256);\n\to.write_shift(4, 0/*ixfe*/); // style\n\tvar flags = 0;\n\tif(col.hidden) flags |= 0x01;\n\tif(typeof p.width == 'number') flags |= 0x02;\n\tif(col.level) flags |= (col.level << 8);\n\to.write_shift(2, flags); // bit flag\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.678 BrtMargins */\nvar BrtMarginKeys = [\"left\",\"right\",\"top\",\"bottom\",\"header\",\"footer\"];\nfunction parse_BrtMargins(data) {\n\tvar margins = ({});\n\tBrtMarginKeys.forEach(function(k) { margins[k] = parse_Xnum(data, 8); });\n\treturn margins;\n}\nfunction write_BrtMargins(margins, o) {\n\tif(o == null) o = new_buf(6*8);\n\tdefault_margins(margins);\n\tBrtMarginKeys.forEach(function(k) { write_Xnum((margins)[k], o); });\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.299 BrtBeginWsView */\nfunction parse_BrtBeginWsView(data) {\n\tvar f = data.read_shift(2);\n\tdata.l += 28;\n\treturn { RTL: f & 0x20 };\n}\nfunction write_BrtBeginWsView(ws, Workbook, o) {\n\tif(o == null) o = new_buf(30);\n\tvar f = 0x39c;\n\tif((((Workbook||{}).Views||[])[0]||{}).RTL) f |= 0x20;\n\to.write_shift(2, f); // bit flag\n\to.write_shift(4, 0);\n\to.write_shift(4, 0); // view first row\n\to.write_shift(4, 0); // view first col\n\to.write_shift(1, 0); // gridline color ICV\n\to.write_shift(1, 0);\n\to.write_shift(2, 0);\n\to.write_shift(2, 100); // zoom scale\n\to.write_shift(2, 0);\n\to.write_shift(2, 0);\n\to.write_shift(2, 0);\n\to.write_shift(4, 0); // workbook view id\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.309 BrtCellIgnoreEC */\nfunction write_BrtCellIgnoreEC(ref) {\n\tvar o = new_buf(24);\n\to.write_shift(4, 4);\n\to.write_shift(4, 1);\n\twrite_UncheckedRfX(ref, o);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.748 BrtSheetProtection */\nfunction write_BrtSheetProtection(sp, o) {\n\tif(o == null) o = new_buf(16*4+2);\n\to.write_shift(2, sp.password ? crypto_CreatePasswordVerifier_Method1(sp.password) : 0);\n\to.write_shift(4, 1); // this record should not be written if no protection\n\t[\n\t\t[\"objects\", false], // fObjects\n\t\t[\"scenarios\", false], // fScenarios\n\t\t[\"formatCells\", true], // fFormatCells\n\t\t[\"formatColumns\", true], // fFormatColumns\n\t\t[\"formatRows\", true], // fFormatRows\n\t\t[\"insertColumns\", true], // fInsertColumns\n\t\t[\"insertRows\", true], // fInsertRows\n\t\t[\"insertHyperlinks\", true], // fInsertHyperlinks\n\t\t[\"deleteColumns\", true], // fDeleteColumns\n\t\t[\"deleteRows\", true], // fDeleteRows\n\t\t[\"selectLockedCells\", false], // fSelLockedCells\n\t\t[\"sort\", true], // fSort\n\t\t[\"autoFilter\", true], // fAutoFilter\n\t\t[\"pivotTables\", true], // fPivotTables\n\t\t[\"selectUnlockedCells\", false] // fSelUnlockedCells\n\t].forEach(function(n) {\nif(n[1]) o.write_shift(4, sp[n[0]] != null && !sp[n[0]] ? 1 : 0);\n\t\telse o.write_shift(4, sp[n[0]] != null && sp[n[0]] ? 0 : 1);\n\t});\n\treturn o;\n}\n\nfunction parse_BrtDVal(/*data, length, opts*/) {\n}\nfunction parse_BrtDVal14(/*data, length, opts*/) {\n}\n/* [MS-XLSB] 2.1.7.61 Worksheet */\nfunction parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {\n\tif(!data) return data;\n\tvar opts = _opts || {};\n\tif(!rels) rels = {'!id':{}};\n\tif(DENSE != null && opts.dense == null) opts.dense = DENSE;\n\tvar s = (opts.dense ? [] : {});\n\n\tvar ref;\n\tvar refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };\n\n\tvar state = [];\n\tvar pass = false, end = false;\n\tvar row, p, cf, R, C, addr, sstr, rr, cell;\n\tvar merges = [];\n\topts.biff = 12;\n\topts['!row'] = 0;\n\n\tvar ai = 0, af = false;\n\n\tvar arrayf = [];\n\tvar sharedf = {};\n\tvar supbooks = opts.supbooks || wb.supbooks || ([[]]);\n\tsupbooks.sharedf = sharedf;\n\tsupbooks.arrayf = arrayf;\n\tsupbooks.SheetNames = wb.SheetNames || wb.Sheets.map(function(x) { return x.name; });\n\tif(!opts.supbooks) {\n\t\topts.supbooks = supbooks;\n\t\tif(wb.Names) for(var i = 0; i < wb.Names.length; ++i) supbooks[0][i+1] = wb.Names[i];\n\t}\n\n\tvar colinfo = [], rowinfo = [];\n\tvar seencol = false;\n\n\tXLSBRecordEnum[0x0010] = { n:\"BrtShortReal\", f:parse_BrtShortReal };\n\n\trecordhopper(data, function ws_parse(val, R_n, RT) {\n\t\tif(end) return;\n\t\tswitch(RT) {\n\t\t\tcase 0x0094: /* 'BrtWsDim' */\n\t\t\t\tref = val; break;\n\t\t\tcase 0x0000: /* 'BrtRowHdr' */\n\t\t\t\trow = val;\n\t\t\t\tif(opts.sheetRows && opts.sheetRows <= row.r) end=true;\n\t\t\t\trr = encode_row(R = row.r);\n\t\t\t\topts['!row'] = row.r;\n\t\t\t\tif(val.hidden || val.hpt || val.level != null) {\n\t\t\t\t\tif(val.hpt) val.hpx = pt2px(val.hpt);\n\t\t\t\t\trowinfo[val.r] = val;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0002: /* 'BrtCellRk' */\n\t\t\tcase 0x0003: /* 'BrtCellError' */\n\t\t\tcase 0x0004: /* 'BrtCellBool' */\n\t\t\tcase 0x0005: /* 'BrtCellReal' */\n\t\t\tcase 0x0006: /* 'BrtCellSt' */\n\t\t\tcase 0x0007: /* 'BrtCellIsst' */\n\t\t\tcase 0x0008: /* 'BrtFmlaString' */\n\t\t\tcase 0x0009: /* 'BrtFmlaNum' */\n\t\t\tcase 0x000A: /* 'BrtFmlaBool' */\n\t\t\tcase 0x000B: /* 'BrtFmlaError' */\n\t\t\tcase 0x000D: /* 'BrtShortRk' */\n\t\t\tcase 0x000E: /* 'BrtShortError' */\n\t\t\tcase 0x000F: /* 'BrtShortBool' */\n\t\t\tcase 0x0010: /* 'BrtShortReal' */\n\t\t\tcase 0x0011: /* 'BrtShortSt' */\n\t\t\tcase 0x0012: /* 'BrtShortIsst' */\n\t\t\t\tp = ({t:val[2]});\n\t\t\t\tswitch(val[2]) {\n\t\t\t\t\tcase 'n': p.v = val[1]; break;\n\t\t\t\t\tcase 's': sstr = strs[val[1]]; p.v = sstr.t; p.r = sstr.r; break;\n\t\t\t\t\tcase 'b': p.v = val[1] ? true : false; break;\n\t\t\t\t\tcase 'e': p.v = val[1]; if(opts.cellText !== false) p.w = BErr[p.v]; break;\n\t\t\t\t\tcase 'str': p.t = 's'; p.v = val[1]; break;\n\t\t\t\t}\n\t\t\t\tif((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.numFmtId,null,opts, themes, styles);\n\t\t\t\tC = val[0].c == -1 ? C + 1 : val[0].c;\n\t\t\t\tif(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }\n\t\t\t\telse s[encode_col(C) + rr] = p;\n\t\t\t\tif(opts.cellFormula) {\n\t\t\t\t\taf = false;\n\t\t\t\t\tfor(ai = 0; ai < arrayf.length; ++ai) {\n\t\t\t\t\t\tvar aii = arrayf[ai];\n\t\t\t\t\t\tif(row.r >= aii[0].s.r && row.r <= aii[0].e.r)\n\t\t\t\t\t\t\tif(C >= aii[0].s.c && C <= aii[0].e.c) {\n\t\t\t\t\t\t\t\tp.F = encode_range(aii[0]); af = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(!af && val.length > 3) p.f = val[3];\n\t\t\t\t}\n\t\t\t\tif(refguess.s.r > row.r) refguess.s.r = row.r;\n\t\t\t\tif(refguess.s.c > C) refguess.s.c = C;\n\t\t\t\tif(refguess.e.r < row.r) refguess.e.r = row.r;\n\t\t\t\tif(refguess.e.c < C) refguess.e.c = C;\n\t\t\t\tif(opts.cellDates && cf && p.t == 'n' && SSF.is_date(SSF._table[cf.numFmtId])) {\n\t\t\t\t\tvar _d = SSF.parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0001: /* 'BrtCellBlank' */\n\t\t\tcase 0x000C: /* 'BrtShortBlank' */\n\t\t\t\tif(!opts.sheetStubs || pass) break;\n\t\t\t\tp = ({t:'z',v:undefined});\n\t\t\t\tC = val[0].c == -1 ? C + 1 : val[0].c;\n\t\t\t\tif(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }\n\t\t\t\telse s[encode_col(C) + rr] = p;\n\t\t\t\tif(refguess.s.r > row.r) refguess.s.r = row.r;\n\t\t\t\tif(refguess.s.c > C) refguess.s.c = C;\n\t\t\t\tif(refguess.e.r < row.r) refguess.e.r = row.r;\n\t\t\t\tif(refguess.e.c < C) refguess.e.c = C;\n\t\t\t\tbreak;\n\n\t\t\tcase 0x00B0: /* 'BrtMergeCell' */\n\t\t\t\tmerges.push(val); break;\n\n\t\t\tcase 0x01EE: /* 'BrtHLink' */\n\t\t\t\tvar rel = rels['!id'][val.relId];\n\t\t\t\tif(rel) {\n\t\t\t\t\tval.Target = rel.Target;\n\t\t\t\t\tif(val.loc) val.Target += \"#\"+val.loc;\n\t\t\t\t\tval.Rel = rel;\n\t\t\t\t} else if(val.relId == '') {\n\t\t\t\t\tval.Target = \"#\" + val.loc;\n\t\t\t\t}\n\t\t\t\tfor(R=val.rfx.s.r;R<=val.rfx.e.r;++R) for(C=val.rfx.s.c;C<=val.rfx.e.c;++C) {\n\t\t\t\t\tif(opts.dense) {\n\t\t\t\t\t\tif(!s[R]) s[R] = [];\n\t\t\t\t\t\tif(!s[R][C]) s[R][C] = {t:'z',v:undefined};\n\t\t\t\t\t\ts[R][C].l = val;\n\t\t\t\t\t} else {\n\t\t\t\t\t\taddr = encode_cell({c:C,r:R});\n\t\t\t\t\t\tif(!s[addr]) s[addr] = {t:'z',v:undefined};\n\t\t\t\t\t\ts[addr].l = val;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 0x01AA: /* 'BrtArrFmla' */\n\t\t\t\tif(!opts.cellFormula) break;\n\t\t\t\tarrayf.push(val);\n\t\t\t\tcell = ((opts.dense ? s[R][C] : s[encode_col(C) + rr]));\n\t\t\t\tcell.f = stringify_formula(val[1], refguess, {r:row.r, c:C}, supbooks, opts);\n\t\t\t\tcell.F = encode_range(val[0]);\n\t\t\t\tbreak;\n\t\t\tcase 0x01AB: /* 'BrtShrFmla' */\n\t\t\t\tif(!opts.cellFormula) break;\n\t\t\t\tsharedf[encode_cell(val[0].s)] = val[1];\n\t\t\t\tcell = (opts.dense ? s[R][C] : s[encode_col(C) + rr]);\n\t\t\t\tcell.f = stringify_formula(val[1], refguess, {r:row.r, c:C}, supbooks, opts);\n\t\t\t\tbreak;\n\n\t\t\t/* identical to 'ColInfo' in XLS */\n\t\t\tcase 0x003C: /* 'BrtColInfo' */\n\t\t\t\tif(!opts.cellStyles) break;\n\t\t\t\twhile(val.e >= val.s) {\n\t\t\t\t\tcolinfo[val.e--] = { width: val.w/256, hidden: !!(val.flags & 0x01), level: val.level };\n\t\t\t\t\tif(!seencol) { seencol = true; find_mdw_colw(val.w/256); }\n\t\t\t\t\tprocess_col(colinfo[val.e+1]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 0x00A1: /* 'BrtBeginAFilter' */\n\t\t\t\ts['!autofilter'] = { ref:encode_range(val) };\n\t\t\t\tbreak;\n\n\t\t\tcase 0x01DC: /* 'BrtMargins' */\n\t\t\t\ts['!margins'] = val;\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0093: /* 'BrtWsProp' */\n\t\t\t\tif(!wb.Sheets[idx]) wb.Sheets[idx] = {};\n\t\t\t\tif(val.name) wb.Sheets[idx].CodeName = val.name;\n\t\t\t\tif(val.above || val.left) s['!outline'] = { above: val.above, left: val.left };\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0089: /* 'BrtBeginWsView' */\n\t\t\t\tif(!wb.Views) wb.Views = [{}];\n\t\t\t\tif(!wb.Views[0]) wb.Views[0] = {};\n\t\t\t\tif(val.RTL) wb.Views[0].RTL = true;\n\t\t\t\tbreak;\n\n\t\t\tcase 0x01E5: /* 'BrtWsFmtInfo' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0040: /* 'BrtDVal' */\n\t\t\tcase 0x041D: /* 'BrtDVal14' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0097: /* 'BrtPane' */\n\t\t\t\tbreak;\n\t\t\tcase 0x0098: /* 'BrtSel' */\n\t\t\tcase 0x00AF: /* 'BrtAFilterDateGroupItem' */\n\t\t\tcase 0x0284: /* 'BrtActiveX' */\n\t\t\tcase 0x0271: /* 'BrtBigName' */\n\t\t\tcase 0x0232: /* 'BrtBkHim' */\n\t\t\tcase 0x018C: /* 'BrtBrk' */\n\t\t\tcase 0x0458: /* 'BrtCFIcon' */\n\t\t\tcase 0x047A: /* 'BrtCFRuleExt' */\n\t\t\tcase 0x01D7: /* 'BrtCFVO' */\n\t\t\tcase 0x041A: /* 'BrtCFVO14' */\n\t\t\tcase 0x0289: /* 'BrtCellIgnoreEC' */\n\t\t\tcase 0x0451: /* 'BrtCellIgnoreEC14' */\n\t\t\tcase 0x0031: /* 'BrtCellMeta' */\n\t\t\tcase 0x024D: /* 'BrtCellSmartTagProperty' */\n\t\t\tcase 0x025F: /* 'BrtCellWatch' */\n\t\t\tcase 0x0234: /* 'BrtColor' */\n\t\t\tcase 0x041F: /* 'BrtColor14' */\n\t\t\tcase 0x00A8: /* 'BrtColorFilter' */\n\t\t\tcase 0x00AE: /* 'BrtCustomFilter' */\n\t\t\tcase 0x049C: /* 'BrtCustomFilter14' */\n\t\t\tcase 0x01F3: /* 'BrtDRef' */\n\t\t\tcase 0x01FB: /* 'BrtDXF' */\n\t\t\tcase 0x0226: /* 'BrtDrawing' */\n\t\t\tcase 0x00AB: /* 'BrtDynamicFilter' */\n\t\t\tcase 0x00A7: /* 'BrtFilter' */\n\t\t\tcase 0x0499: /* 'BrtFilter14' */\n\t\t\tcase 0x00A9: /* 'BrtIconFilter' */\n\t\t\tcase 0x049D: /* 'BrtIconFilter14' */\n\t\t\tcase 0x0227: /* 'BrtLegacyDrawing' */\n\t\t\tcase 0x0228: /* 'BrtLegacyDrawingHF' */\n\t\t\tcase 0x0295: /* 'BrtListPart' */\n\t\t\tcase 0x027F: /* 'BrtOleObject' */\n\t\t\tcase 0x01DE: /* 'BrtPageSetup' */\n\t\t\tcase 0x0219: /* 'BrtPhoneticInfo' */\n\t\t\tcase 0x01DD: /* 'BrtPrintOptions' */\n\t\t\tcase 0x0218: /* 'BrtRangeProtection' */\n\t\t\tcase 0x044F: /* 'BrtRangeProtection14' */\n\t\t\tcase 0x02A8: /* 'BrtRangeProtectionIso' */\n\t\t\tcase 0x0450: /* 'BrtRangeProtectionIso14' */\n\t\t\tcase 0x0400: /* 'BrtRwDescent' */\n\t\t\tcase 0x0297: /* 'BrtSheetCalcProp' */\n\t\t\tcase 0x0217: /* 'BrtSheetProtection' */\n\t\t\tcase 0x02A6: /* 'BrtSheetProtectionIso' */\n\t\t\tcase 0x01F8: /* 'BrtSlc' */\n\t\t\tcase 0x0413: /* 'BrtSparkline' */\n\t\t\tcase 0x01AC: /* 'BrtTable' */\n\t\t\tcase 0x00AA: /* 'BrtTop10Filter' */\n\t\t\tcase 0x0C00: /* 'BrtUid' */\n\t\t\tcase 0x0032: /* 'BrtValueMeta' */\n\t\t\tcase 0x0816: /* 'BrtWebExtension' */\n\t\t\tcase 0x0415: /* 'BrtWsFmtInfoEx14' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0023: /* 'BrtFRTBegin' */\n\t\t\t\tpass = true; break;\n\t\t\tcase 0x0024: /* 'BrtFRTEnd' */\n\t\t\t\tpass = false; break;\n\t\t\tcase 0x0025: /* 'BrtACBegin' */\n\t\t\t\tstate.push(R_n); pass = true; break;\n\t\t\tcase 0x0026: /* 'BrtACEnd' */\n\t\t\t\tstate.pop(); pass = false; break;\n\n\t\t\tdefault:\n\t\t\t\tif((R_n||\"\").indexOf(\"Begin\") > 0){/* empty */}\n\t\t\t\telse if((R_n||\"\").indexOf(\"End\") > 0){/* empty */}\n\t\t\t\telse if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R_n);\n\t\t}\n\t}, opts);\n\n\tdelete opts.supbooks;\n\tdelete opts['!row'];\n\n\tif(!s[\"!ref\"] && (refguess.s.r < 2000000 || ref && (ref.e.r > 0 || ref.e.c > 0 || ref.s.r > 0 || ref.s.c > 0))) s[\"!ref\"] = encode_range(ref || refguess);\n\tif(opts.sheetRows && s[\"!ref\"]) {\n\t\tvar tmpref = safe_decode_range(s[\"!ref\"]);\n\t\tif(opts.sheetRows <= +tmpref.e.r) {\n\t\t\ttmpref.e.r = opts.sheetRows - 1;\n\t\t\tif(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;\n\t\t\tif(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;\n\t\t\tif(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;\n\t\t\tif(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;\n\t\t\ts[\"!fullref\"] = s[\"!ref\"];\n\t\t\ts[\"!ref\"] = encode_range(tmpref);\n\t\t}\n\t}\n\tif(merges.length > 0) s[\"!merges\"] = merges;\n\tif(colinfo.length > 0) s[\"!cols\"] = colinfo;\n\tif(rowinfo.length > 0) s[\"!rows\"] = rowinfo;\n\treturn s;\n}\n\n/* TODO: something useful -- this is a stub */\nfunction write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen) {\n\tif(cell.v === undefined) return false;\n\tvar vv = \"\";\n\tswitch(cell.t) {\n\t\tcase 'b': vv = cell.v ? \"1\" : \"0\"; break;\n\t\tcase 'd': // no BrtCellDate :(\n\t\t\tcell = dup(cell);\n\t\t\tcell.z = cell.z || SSF._table[14];\n\t\t\tcell.v = datenum(parseDate(cell.v)); cell.t = 'n';\n\t\t\tbreak;\n\t\t/* falls through */\n\t\tcase 'n': case 'e': vv = ''+cell.v; break;\n\t\tdefault: vv = cell.v; break;\n\t}\n\tvar o = ({r:R, c:C});\n\t/* TODO: cell style */\n\to.s = get_cell_style(opts.cellXfs, cell, opts);\n\tif(cell.l) ws['!links'].push([encode_cell(o), cell.l]);\n\tif(cell.c) ws['!comments'].push([encode_cell(o), cell.c]);\n\tswitch(cell.t) {\n\t\tcase 's': case 'str':\n\t\t\tif(opts.bookSST) {\n\t\t\t\tvv = get_sst_id(opts.Strings, (cell.v), opts.revStrings);\n\t\t\t\to.t = \"s\"; o.v = vv;\n\t\t\t\tif(last_seen) write_record(ba, \"BrtShortIsst\", write_BrtShortIsst(cell, o));\n\t\t\t\telse write_record(ba, \"BrtCellIsst\", write_BrtCellIsst(cell, o));\n\t\t\t} else {\n\t\t\t\to.t = \"str\";\n\t\t\t\tif(last_seen) write_record(ba, \"BrtShortSt\", write_BrtShortSt(cell, o));\n\t\t\t\telse write_record(ba, \"BrtCellSt\", write_BrtCellSt(cell, o));\n\t\t\t}\n\t\t\treturn true;\n\t\tcase 'n':\n\t\t\t/* TODO: determine threshold for Real vs RK */\n\t\t\tif(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) {\n\t\t\t\tif(last_seen) write_record(ba, \"BrtShortRk\", write_BrtShortRk(cell, o));\n\t\t\t\telse write_record(ba, \"BrtCellRk\", write_BrtCellRk(cell, o));\n\t\t\t} else {\n\t\t\t\tif(last_seen) write_record(ba, \"BrtShortReal\", write_BrtShortReal(cell, o));\n\t\t\t\telse write_record(ba, \"BrtCellReal\", write_BrtCellReal(cell, o));\n\t\t\t} return true;\n\t\tcase 'b':\n\t\t\to.t = \"b\";\n\t\t\tif(last_seen) write_record(ba, \"BrtShortBool\", write_BrtShortBool(cell, o));\n\t\t\telse write_record(ba, \"BrtCellBool\", write_BrtCellBool(cell, o));\n\t\t\treturn true;\n\t\tcase 'e':\n\t\t\to.t = \"e\";\n\t\t\tif(last_seen) write_record(ba, \"BrtShortError\", write_BrtShortError(cell, o));\n\t\t\telse write_record(ba, \"BrtCellError\", write_BrtCellError(cell, o));\n\t\t\treturn true;\n\t}\n\tif(last_seen) write_record(ba, \"BrtShortBlank\", write_BrtShortBlank(cell, o));\n\telse write_record(ba, \"BrtCellBlank\", write_BrtCellBlank(cell, o));\n\treturn true;\n}\n\nfunction write_CELLTABLE(ba, ws, idx, opts) {\n\tvar range = safe_decode_range(ws['!ref'] || \"A1\"), ref, rr = \"\", cols = [];\n\twrite_record(ba, 'BrtBeginSheetData');\n\tvar dense = Array.isArray(ws);\n\tvar cap = range.e.r;\n\tif(ws['!rows']) cap = Math.max(range.e.r, ws['!rows'].length - 1);\n\tfor(var R = range.s.r; R <= cap; ++R) {\n\t\trr = encode_row(R);\n\t\t/* [ACCELLTABLE] */\n\t\t/* BrtRowHdr */\n\t\twrite_row_header(ba, ws, range, R);\n\t\tvar last_seen = false;\n\t\tif(R <= range.e.r) for(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\t/* *16384CELL */\n\t\t\tif(R === range.s.r) cols[C] = encode_col(C);\n\t\t\tref = cols[C] + rr;\n\t\t\tvar cell = dense ? (ws[R]||[])[C] : ws[ref];\n\t\t\tif(!cell) { last_seen = false; continue; }\n\t\t\t/* write cell */\n\t\t\tlast_seen = write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen);\n\t\t}\n\t}\n\twrite_record(ba, 'BrtEndSheetData');\n}\n\nfunction write_MERGECELLS(ba, ws) {\n\tif(!ws || !ws['!merges']) return;\n\twrite_record(ba, 'BrtBeginMergeCells', write_BrtBeginMergeCells(ws['!merges'].length));\n\tws['!merges'].forEach(function(m) { write_record(ba, 'BrtMergeCell', write_BrtMergeCell(m)); });\n\twrite_record(ba, 'BrtEndMergeCells');\n}\n\nfunction write_COLINFOS(ba, ws) {\n\tif(!ws || !ws['!cols']) return;\n\twrite_record(ba, 'BrtBeginColInfos');\n\tws['!cols'].forEach(function(m, i) { if(m) write_record(ba, 'BrtColInfo', write_BrtColInfo(i, m)); });\n\twrite_record(ba, 'BrtEndColInfos');\n}\n\nfunction write_IGNOREECS(ba, ws) {\n\tif(!ws || !ws['!ref']) return;\n\twrite_record(ba, 'BrtBeginCellIgnoreECs');\n\twrite_record(ba, 'BrtCellIgnoreEC', write_BrtCellIgnoreEC(safe_decode_range(ws['!ref'])));\n\twrite_record(ba, 'BrtEndCellIgnoreECs');\n}\n\nfunction write_HLINKS(ba, ws, rels) {\n\t/* *BrtHLink */\n\tws['!links'].forEach(function(l) {\n\t\tif(!l[1].Target) return;\n\t\tvar rId = add_rels(rels, -1, l[1].Target.replace(/#.*$/, \"\"), RELS.HLINK);\n\t\twrite_record(ba, \"BrtHLink\", write_BrtHLink(l, rId));\n\t});\n\tdelete ws['!links'];\n}\nfunction write_LEGACYDRAWING(ba, ws, idx, rels) {\n\t/* [BrtLegacyDrawing] */\n\tif(ws['!comments'].length > 0) {\n\t\tvar rId = add_rels(rels, -1, \"../drawings/vmlDrawing\" + (idx+1) + \".vml\", RELS.VML);\n\t\twrite_record(ba, \"BrtLegacyDrawing\", write_RelID(\"rId\" + rId));\n\t\tws['!legacy'] = rId;\n\t}\n}\n\nfunction write_AUTOFILTER(ba, ws, wb, idx) {\n\tif(!ws['!autofilter']) return;\n\tvar data = ws['!autofilter'];\n\tvar ref = typeof data.ref === \"string\" ? data.ref : encode_range(data.ref);\n\n\t/* Update FilterDatabase defined name for the worksheet */\n\tif(!wb.Workbook) wb.Workbook = ({Sheets:[]});\n\tif(!wb.Workbook.Names) wb.Workbook.Names = [];\n\tvar names = wb.Workbook.Names;\n\tvar range = decode_range(ref);\n\tif(range.s.r == range.e.r) { range.e.r = decode_range(ws[\"!ref\"]).e.r; ref = encode_range(range); }\n\tfor(var i = 0; i < names.length; ++i) {\n\t\tvar name = names[i];\n\t\tif(name.Name != '_xlnm._FilterDatabase') continue;\n\t\tif(name.Sheet != idx) continue;\n\t\tname.Ref = \"'\" + wb.SheetNames[idx] + \"'!\" + ref; break;\n\t}\n\tif(i == names.length) names.push({ Name: '_xlnm._FilterDatabase', Sheet: idx, Ref: \"'\" + wb.SheetNames[idx] + \"'!\" + ref });\n\n\twrite_record(ba, \"BrtBeginAFilter\", write_UncheckedRfX(safe_decode_range(ref)));\n\t/* *FILTERCOLUMN */\n\t/* [SORTSTATE] */\n\t/* BrtEndAFilter */\n\twrite_record(ba, \"BrtEndAFilter\");\n}\n\nfunction write_WSVIEWS2(ba, ws, Workbook) {\n\twrite_record(ba, \"BrtBeginWsViews\");\n\t{ /* 1*WSVIEW2 */\n\t\t/* [ACUID] */\n\t\twrite_record(ba, \"BrtBeginWsView\", write_BrtBeginWsView(ws, Workbook));\n\t\t/* [BrtPane] */\n\t\t/* *4BrtSel */\n\t\t/* *4SXSELECT */\n\t\t/* *FRT */\n\t\twrite_record(ba, \"BrtEndWsView\");\n\t}\n\t/* *FRT */\n\twrite_record(ba, \"BrtEndWsViews\");\n}\n\nfunction write_WSFMTINFO() {\n\t/* [ACWSFMTINFO] */\n\t//write_record(ba, \"BrtWsFmtInfo\", write_BrtWsFmtInfo(ws));\n}\n\nfunction write_SHEETPROTECT(ba, ws) {\n\tif(!ws['!protect']) return;\n\t/* [BrtSheetProtectionIso] */\n\twrite_record(ba, \"BrtSheetProtection\", write_BrtSheetProtection(ws['!protect']));\n}\n\nfunction write_ws_bin(idx, opts, wb, rels) {\n\tvar ba = buf_array();\n\tvar s = wb.SheetNames[idx], ws = wb.Sheets[s] || {};\n\tvar c = s; try { if(wb && wb.Workbook) c = wb.Workbook.Sheets[idx].CodeName || c; } catch(e) {}\n\tvar r = safe_decode_range(ws['!ref'] || \"A1\");\n\tif(r.e.c > 0x3FFF || r.e.r > 0xFFFFF) {\n\t\tif(opts.WTF) throw new Error(\"Range \" + (ws['!ref'] || \"A1\") + \" exceeds format limit A1:XFD1048576\");\n\t\tr.e.c = Math.min(r.e.c, 0x3FFF);\n\t\tr.e.r = Math.min(r.e.c, 0xFFFFF);\n\t}\n\tws['!links'] = [];\n\t/* passed back to write_zip and removed there */\n\tws['!comments'] = [];\n\twrite_record(ba, \"BrtBeginSheet\");\n\tif(wb.vbaraw || ws['!outline']) write_record(ba, \"BrtWsProp\", write_BrtWsProp(c, ws['!outline']));\n\twrite_record(ba, \"BrtWsDim\", write_BrtWsDim(r));\n\twrite_WSVIEWS2(ba, ws, wb.Workbook);\n\twrite_WSFMTINFO(ba, ws);\n\twrite_COLINFOS(ba, ws, idx, opts, wb);\n\twrite_CELLTABLE(ba, ws, idx, opts, wb);\n\t/* [BrtSheetCalcProp] */\n\twrite_SHEETPROTECT(ba, ws);\n\t/* *([BrtRangeProtectionIso] BrtRangeProtection) */\n\t/* [SCENMAN] */\n\twrite_AUTOFILTER(ba, ws, wb, idx);\n\t/* [SORTSTATE] */\n\t/* [DCON] */\n\t/* [USERSHVIEWS] */\n\twrite_MERGECELLS(ba, ws);\n\t/* [BrtPhoneticInfo] */\n\t/* *CONDITIONALFORMATTING */\n\t/* [DVALS] */\n\twrite_HLINKS(ba, ws, rels);\n\t/* [BrtPrintOptions] */\n\tif(ws['!margins']) write_record(ba, \"BrtMargins\", write_BrtMargins(ws['!margins']));\n\t/* [BrtPageSetup] */\n\t/* [HEADERFOOTER] */\n\t/* [RWBRK] */\n\t/* [COLBRK] */\n\t/* *BrtBigName */\n\t/* [CELLWATCHES] */\n\tif(!opts || opts.ignoreEC || (opts.ignoreEC == (void 0))) write_IGNOREECS(ba, ws);\n\t/* [SMARTTAGS] */\n\t/* [BrtDrawing] */\n\twrite_LEGACYDRAWING(ba, ws, idx, rels);\n\t/* [BrtLegacyDrawingHF] */\n\t/* [BrtBkHim] */\n\t/* [OLEOBJECTS] */\n\t/* [ACTIVEXCONTROLS] */\n\t/* [WEBPUBITEMS] */\n\t/* [LISTPARTS] */\n\t/* FRTWORKSHEET */\n\twrite_record(ba, \"BrtEndSheet\");\n\treturn ba.end();\n}\nRELS.CHART = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\";\nRELS.CHARTEX = \"http://schemas.microsoft.com/office/2014/relationships/chartEx\";\n\nfunction parse_Cache(data) {\n\tvar col = [];\n\tvar num = data.match(/^/);\n\tvar f;\n\n\t/* 21.2.2.150 pt CT_NumVal */\n\t(data.match(/(.*?)<\\/c:pt>/mg)||[]).forEach(function(pt) {\n\t\tvar q = pt.match(/(.*)<\\/c:v><\\/c:pt>/);\n\t\tif(!q) return;\n\t\tcol[+q[1]] = num ? +q[2] : q[2];\n\t});\n\n\t/* 21.2.2.71 formatCode CT_Xstring */\n\tvar nf = unescapexml((data.match(/([\\s\\S]*?)<\\/c:formatCode>/) || [\"\",\"General\"])[1]);\n\n\t(data.match(/(.*?)<\\/c:f>/mg)||[]).forEach(function(F) { f = F.replace(/<.*?>/g,\"\"); });\n\n\treturn [col, nf, f];\n}\n\n/* 21.2 DrawingML - Charts */\nfunction parse_chart(data, name, opts, rels, wb, csheet) {\n\tvar cs = ((csheet || {\"!type\":\"chart\"}));\n\tif(!data) return csheet;\n\t/* 21.2.2.27 chart CT_Chart */\n\n\tvar C = 0, R = 0, col = \"A\";\n\tvar refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };\n\n\t/* 21.2.2.120 numCache CT_NumData */\n\t(data.match(/[\\s\\S]*?<\\/c:numCache>/gm)||[]).forEach(function(nc) {\n\t\tvar cache = parse_Cache(nc);\n\t\trefguess.s.r = refguess.s.c = 0;\n\t\trefguess.e.c = C;\n\t\tcol = encode_col(C);\n\t\tcache[0].forEach(function(n,i) {\n\t\t\tcs[col + encode_row(i)] = {t:'n', v:n, z:cache[1] };\n\t\t\tR = i;\n\t\t});\n\t\tif(refguess.e.r < R) refguess.e.r = R;\n\t\t++C;\n\t});\n\tif(C > 0) cs[\"!ref\"] = encode_range(refguess);\n\treturn cs;\n}\nRELS.CS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet\";\n\nvar CS_XML_ROOT = writextag('chartsheet', null, {\n\t'xmlns': XMLNS.main[0],\n\t'xmlns:r': XMLNS.r\n});\n\n/* 18.3 Worksheets also covers Chartsheets */\nfunction parse_cs_xml(data, opts, idx, rels, wb) {\n\tif(!data) return data;\n\t/* 18.3.1.12 chartsheet CT_ChartSheet */\n\tif(!rels) rels = {'!id':{}};\n\tvar s = ({'!type':\"chart\", '!drawel':null, '!rel':\"\"});\n\tvar m;\n\n\t/* 18.3.1.83 sheetPr CT_ChartsheetPr */\n\tvar sheetPr = data.match(sheetprregex);\n\tif(sheetPr) parse_ws_xml_sheetpr(sheetPr[0], s, wb, idx);\n\n\t/* 18.3.1.36 drawing CT_Drawing */\n\tif((m = data.match(/drawing r:id=\"(.*?)\"/))) s['!rel'] = m[1];\n\n\tif(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];\n\treturn s;\n}\nfunction write_cs_xml(idx, opts, wb, rels) {\n\tvar o = [XML_HEADER, CS_XML_ROOT];\n\to[o.length] = writextag(\"drawing\", null, {\"r:id\": \"rId1\"});\n\tadd_rels(rels, -1, \"../drawings/drawing\" + (idx+1) + \".xml\", RELS.DRAW);\n\tif(o.length>2) { o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n\n/* [MS-XLSB] 2.4.331 BrtCsProp */\nfunction parse_BrtCsProp(data, length) {\n\tdata.l += 10;\n\tvar name = parse_XLWideString(data, length - 10);\n\treturn { name: name };\n}\n\n/* [MS-XLSB] 2.1.7.7 Chart Sheet */\nfunction parse_cs_bin(data, opts, idx, rels, wb) {\n\tif(!data) return data;\n\tif(!rels) rels = {'!id':{}};\n\tvar s = {'!type':\"chart\", '!drawel':null, '!rel':\"\"};\n\tvar state = [];\n\tvar pass = false;\n\trecordhopper(data, function cs_parse(val, R_n, RT) {\n\t\tswitch(RT) {\n\n\t\t\tcase 0x0226: /* 'BrtDrawing' */\n\t\t\t\ts['!rel'] = val; break;\n\n\t\t\tcase 0x028B: /* 'BrtCsProp' */\n\t\t\t\tif(!wb.Sheets[idx]) wb.Sheets[idx] = {};\n\t\t\t\tif(val.name) wb.Sheets[idx].CodeName = val.name;\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0232: /* 'BrtBkHim' */\n\t\t\tcase 0x028C: /* 'BrtCsPageSetup' */\n\t\t\tcase 0x029D: /* 'BrtCsProtection' */\n\t\t\tcase 0x02A7: /* 'BrtCsProtectionIso' */\n\t\t\tcase 0x0227: /* 'BrtLegacyDrawing' */\n\t\t\tcase 0x0228: /* 'BrtLegacyDrawingHF' */\n\t\t\tcase 0x01DC: /* 'BrtMargins' */\n\t\t\tcase 0x0C00: /* 'BrtUid' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0023: /* 'BrtFRTBegin' */\n\t\t\t\tpass = true; break;\n\t\t\tcase 0x0024: /* 'BrtFRTEnd' */\n\t\t\t\tpass = false; break;\n\t\t\tcase 0x0025: /* 'BrtACBegin' */\n\t\t\t\tstate.push(R_n); break;\n\t\t\tcase 0x0026: /* 'BrtACEnd' */\n\t\t\t\tstate.pop(); break;\n\n\t\t\tdefault:\n\t\t\t\tif((R_n||\"\").indexOf(\"Begin\") > 0) state.push(R_n);\n\t\t\t\telse if((R_n||\"\").indexOf(\"End\") > 0) state.pop();\n\t\t\t\telse if(!pass || opts.WTF) throw new Error(\"Unexpected record \" + RT + \" \" + R_n);\n\t\t}\n\t}, opts);\n\n\tif(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];\n\treturn s;\n}\nfunction write_cs_bin() {\n\tvar ba = buf_array();\n\twrite_record(ba, \"BrtBeginSheet\");\n\t/* [BrtCsProp] */\n\t/* CSVIEWS */\n\t/* [[BrtCsProtectionIso] BrtCsProtection] */\n\t/* [USERCSVIEWS] */\n\t/* [BrtMargins] */\n\t/* [BrtCsPageSetup] */\n\t/* [HEADERFOOTER] */\n\t/* BrtDrawing */\n\t/* [BrtLegacyDrawing] */\n\t/* [BrtLegacyDrawingHF] */\n\t/* [BrtBkHim] */\n\t/* [WEBPUBITEMS] */\n\t/* FRTCHARTSHEET */\n\twrite_record(ba, \"BrtEndSheet\");\n\treturn ba.end();\n}\n/* 18.2.28 (CT_WorkbookProtection) Defaults */\nvar WBPropsDef = [\n\t['allowRefreshQuery', false, \"bool\"],\n\t['autoCompressPictures', true, \"bool\"],\n\t['backupFile', false, \"bool\"],\n\t['checkCompatibility', false, \"bool\"],\n\t['CodeName', ''],\n\t['date1904', false, \"bool\"],\n\t['defaultThemeVersion', 0, \"int\"],\n\t['filterPrivacy', false, \"bool\"],\n\t['hidePivotFieldList', false, \"bool\"],\n\t['promptedSolutions', false, \"bool\"],\n\t['publishItems', false, \"bool\"],\n\t['refreshAllConnections', false, \"bool\"],\n\t['saveExternalLinkValues', true, \"bool\"],\n\t['showBorderUnselectedTables', true, \"bool\"],\n\t['showInkAnnotation', true, \"bool\"],\n\t['showObjects', 'all'],\n\t['showPivotChartFilter', false, \"bool\"],\n\t['updateLinks', 'userSet']\n];\n\n/* 18.2.30 (CT_BookView) Defaults */\nvar WBViewDef = [\n\t['activeTab', 0, \"int\"],\n\t['autoFilterDateGrouping', true, \"bool\"],\n\t['firstSheet', 0, \"int\"],\n\t['minimized', false, \"bool\"],\n\t['showHorizontalScroll', true, \"bool\"],\n\t['showSheetTabs', true, \"bool\"],\n\t['showVerticalScroll', true, \"bool\"],\n\t['tabRatio', 600, \"int\"],\n\t['visibility', 'visible']\n\t//window{Height,Width}, {x,y}Window\n];\n\n/* 18.2.19 (CT_Sheet) Defaults */\nvar SheetDef = [\n\t//['state', 'visible']\n];\n\n/* 18.2.2 (CT_CalcPr) Defaults */\nvar CalcPrDef = [\n\t['calcCompleted', 'true'],\n\t['calcMode', 'auto'],\n\t['calcOnSave', 'true'],\n\t['concurrentCalc', 'true'],\n\t['fullCalcOnLoad', 'false'],\n\t['fullPrecision', 'true'],\n\t['iterate', 'false'],\n\t['iterateCount', '100'],\n\t['iterateDelta', '0.001'],\n\t['refMode', 'A1']\n];\n\n/* 18.2.3 (CT_CustomWorkbookView) Defaults */\n/*var CustomWBViewDef = [\n\t['autoUpdate', 'false'],\n\t['changesSavedWin', 'false'],\n\t['includeHiddenRowCol', 'true'],\n\t['includePrintSettings', 'true'],\n\t['maximized', 'false'],\n\t['minimized', 'false'],\n\t['onlySync', 'false'],\n\t['personalView', 'false'],\n\t['showComments', 'commIndicator'],\n\t['showFormulaBar', 'true'],\n\t['showHorizontalScroll', 'true'],\n\t['showObjects', 'all'],\n\t['showSheetTabs', 'true'],\n\t['showStatusbar', 'true'],\n\t['showVerticalScroll', 'true'],\n\t['tabRatio', '600'],\n\t['xWindow', '0'],\n\t['yWindow', '0']\n];*/\n\nfunction push_defaults_array(target, defaults) {\n\tfor(var j = 0; j != target.length; ++j) { var w = target[j];\n\t\tfor(var i=0; i != defaults.length; ++i) { var z = defaults[i];\n\t\t\tif(w[z[0]] == null) w[z[0]] = z[1];\n\t\t\telse switch(z[2]) {\n\t\t\tcase \"bool\": if(typeof w[z[0]] == \"string\") w[z[0]] = parsexmlbool(w[z[0]]); break;\n\t\t\tcase \"int\": if(typeof w[z[0]] == \"string\") w[z[0]] = parseInt(w[z[0]], 10); break;\n\t\t\t}\n\t\t}\n\t}\n}\nfunction push_defaults(target, defaults) {\n\tfor(var i = 0; i != defaults.length; ++i) { var z = defaults[i];\n\t\tif(target[z[0]] == null) target[z[0]] = z[1];\n\t\telse switch(z[2]) {\n\t\t\tcase \"bool\": if(typeof target[z[0]] == \"string\") target[z[0]] = parsexmlbool(target[z[0]]); break;\n\t\t\tcase \"int\": if(typeof target[z[0]] == \"string\") target[z[0]] = parseInt(target[z[0]], 10); break;\n\t\t}\n\t}\n}\n\nfunction parse_wb_defaults(wb) {\n\tpush_defaults(wb.WBProps, WBPropsDef);\n\tpush_defaults(wb.CalcPr, CalcPrDef);\n\n\tpush_defaults_array(wb.WBView, WBViewDef);\n\tpush_defaults_array(wb.Sheets, SheetDef);\n\n\t_ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904);\n}\n\nfunction safe1904(wb) {\n\t/* TODO: store date1904 somewhere else */\n\tif(!wb.Workbook) return \"false\";\n\tif(!wb.Workbook.WBProps) return \"false\";\n\treturn parsexmlbool(wb.Workbook.WBProps.date1904) ? \"true\" : \"false\";\n}\n\nvar badchars = \"][*?\\/\\\\\".split(\"\");\nfunction check_ws_name(n, safe) {\n\tif(n.length > 31) { if(safe) return false; throw new Error(\"Sheet names cannot exceed 31 chars\"); }\n\tvar _good = true;\n\tbadchars.forEach(function(c) {\n\t\tif(n.indexOf(c) == -1) return;\n\t\tif(!safe) throw new Error(\"Sheet name cannot contain : \\\\ / ? * [ ]\");\n\t\t_good = false;\n\t});\n\treturn _good;\n}\nfunction check_wb_names(N, S, codes) {\n\tN.forEach(function(n,i) {\n\t\tcheck_ws_name(n);\n\t\tfor(var j = 0; j < i; ++j) if(n == N[j]) throw new Error(\"Duplicate Sheet Name: \" + n);\n\t\tif(codes) {\n\t\t\tvar cn = (S && S[i] && S[i].CodeName) || n;\n\t\t\tif(cn.charCodeAt(0) == 95 && cn.length > 22) throw new Error(\"Bad Code Name: Worksheet\" + cn);\n\t\t}\n\t});\n}\nfunction check_wb(wb) {\n\tif(!wb || !wb.SheetNames || !wb.Sheets) throw new Error(\"Invalid Workbook\");\n\tif(!wb.SheetNames.length) throw new Error(\"Workbook is empty\");\n\tvar Sheets = (wb.Workbook && wb.Workbook.Sheets) || [];\n\tcheck_wb_names(wb.SheetNames, Sheets, !!wb.vbaraw);\n\tfor(var i = 0; i < wb.SheetNames.length; ++i) check_ws(wb.Sheets[wb.SheetNames[i]], wb.SheetNames[i], i);\n\t/* TODO: validate workbook */\n}\n/* 18.2 Workbook */\nvar wbnsregex = /<\\w+:workbook/;\nfunction parse_wb_xml(data, opts) {\n\tif(!data) throw new Error(\"Could not find file\");\n\tvar wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, Names:[], xmlns: \"\" };\n\tvar pass = false, xmlns = \"xmlns\";\n\tvar dname = {}, dnstart = 0;\n\tdata.replace(tagregex, function xml_wb(x, idx) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.13 fileVersion CT_FileVersion ? */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.2.12 fileSharing CT_FileSharing ? */\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.28 workbookPr CT_WorkbookPr ? */\n\t\t\tcase '':\n\t\t\t\tWBPropsDef.forEach(function(w) {\n\t\t\t\t\tif(y[w[0]] == null) return;\n\t\t\t\t\tswitch(w[2]) {\n\t\t\t\t\t\tcase \"bool\": wb.WBProps[w[0]] = parsexmlbool(y[w[0]]); break;\n\t\t\t\t\t\tcase \"int\": wb.WBProps[w[0]] = parseInt(y[w[0]], 10); break;\n\t\t\t\t\t\tdefault: wb.WBProps[w[0]] = y[w[0]];\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(y.codeName) wb.WBProps.CodeName = utf8read(y.codeName);\n\t\t\t\tbreak;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.29 workbookProtection CT_WorkbookProtection ? */\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.1 bookViews CT_BookViews ? */\n\t\t\tcase '': case '': break;\n\t\t\t/* 18.2.30 workbookView CT_BookView + */\n\t\t\tcase '': delete y[0]; wb.WBView.push(y); break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.20 sheets CT_Sheets 1 */\n\t\t\tcase '': case '': break; // aggregate sheet\n\t\t\t/* 18.2.19 sheet CT_Sheet + */\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.15 functionGroups CT_FunctionGroups ? */\n\t\t\tcase '': break;\n\t\t\t/* 18.2.14 functionGroup CT_FunctionGroup + */\n\t\t\tcase '': case '': break;\n\t\t\t/* 18.2.8 externalReference CT_ExternalReference + */\n\t\t\tcase '': break;\n\t\t\tcase '': case '': pass=false; break;\n\t\t\t/* 18.2.5 definedName CT_DefinedName + */\n\t\t\tcase '': {\n\t\t\t\tdname.Ref = unescapexml(utf8read(data.slice(dnstart, idx)));\n\t\t\t\twb.Names.push(dname);\n\t\t\t} break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.2 calcPr CT_CalcPr ? */\n\t\t\tcase '': delete y[0]; wb.CalcPr = y; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.16 oleSize CT_OleSize ? (ref required) */\n\t\t\tcase '': case '': case '': break;\n\n\t\t\t/* 18.2.18 pivotCaches CT_PivotCaches ? */\n\t\t\tcase '': case '': case '': break;\n\n\t\t\t/* 18.2.23 smartTagTypes CT_SmartTagTypes ? */\n\t\t\tcase '': case '': break;\n\t\t\t/* 18.2.22 smartTagType CT_SmartTagType ? */\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.11 fileRecoveryPr CT_FileRecoveryPr ? */\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.26 webPublishObjects CT_WebPublishObjects ? */\n\t\t\tcase '': case '': break;\n\t\t\t/* 18.2.25 webPublishObject CT_WebPublishObject ? */\n\t\t\tcase '': case '': case '': break;\n\t\t\t/* 18.2.7 ext CT_Extension + */\n\t\t\tcase '': pass=false; break;\n\n\t\t\t/* Others */\n\t\t\tcase '': pass=true; break;\n\t\t\tcase '': pass=false; break;\n\n\t\t\t/* TODO */\n\t\t\tcase ' 0);\n\n\t/* fileVersion */\n\t/* fileSharing */\n\n\tvar workbookPr = ({codeName:\"ThisWorkbook\"});\n\tif(wb.Workbook && wb.Workbook.WBProps) {\n\t\tWBPropsDef.forEach(function(x) {\nif((wb.Workbook.WBProps[x[0]]) == null) return;\n\t\t\tif((wb.Workbook.WBProps[x[0]]) == x[1]) return;\n\t\t\tworkbookPr[x[0]] = (wb.Workbook.WBProps[x[0]]);\n\t\t});\nif(wb.Workbook.WBProps.CodeName) { workbookPr.codeName = wb.Workbook.WBProps.CodeName; delete workbookPr.CodeName; }\n\t}\n\to[o.length] = (writextag('workbookPr', null, workbookPr));\n\n\t/* workbookProtection */\n\n\tvar sheets = wb.Workbook && wb.Workbook.Sheets || [];\n\tvar i = 0;\n\n\t/* bookViews only written if first worksheet is hidden */\n\tif(sheets && sheets[0] && !!sheets[0].Hidden) {\n\t\to[o.length] = \"\";\n\t\tfor(i = 0; i != wb.SheetNames.length; ++i) {\n\t\t\tif(!sheets[i]) break;\n\t\t\tif(!sheets[i].Hidden) break;\n\t\t}\n\t\tif(i == wb.SheetNames.length) i = 0;\n\t\to[o.length] = '';\n\t\to[o.length] = \"\";\n\t}\n\n\to[o.length] = \"\";\n\tfor(i = 0; i != wb.SheetNames.length; ++i) {\n\t\tvar sht = ({name:escapexml(wb.SheetNames[i].slice(0,31))});\n\t\tsht.sheetId = \"\"+(i+1);\n\t\tsht[\"r:id\"] = \"rId\"+(i+1);\n\t\tif(sheets[i]) switch(sheets[i].Hidden) {\n\t\t\tcase 1: sht.state = \"hidden\"; break;\n\t\t\tcase 2: sht.state = \"veryHidden\"; break;\n\t\t}\n\t\to[o.length] = (writextag('sheet',null,sht));\n\t}\n\to[o.length] = \"\";\n\n\t/* functionGroups */\n\t/* externalReferences */\n\n\tif(write_names) {\n\t\to[o.length] = \"\";\n\t\tif(wb.Workbook && wb.Workbook.Names) wb.Workbook.Names.forEach(function(n) {\n\t\t\tvar d = {name:n.Name};\n\t\t\tif(n.Comment) d.comment = n.Comment;\n\t\t\tif(n.Sheet != null) d.localSheetId = \"\"+n.Sheet;\n\t\t\tif(n.Hidden) d.hidden = \"1\";\n\t\t\tif(!n.Ref) return;\n\t\t\to[o.length] = writextag('definedName', escapexml(n.Ref), d);\n\t\t});\n\t\to[o.length] = \"\";\n\t}\n\n\t/* calcPr */\n\t/* oleSize */\n\t/* customWorkbookViews */\n\t/* pivotCaches */\n\t/* smartTagPr */\n\t/* smartTagTypes */\n\t/* webPublishing */\n\t/* fileRecoveryPr */\n\t/* webPublishObjects */\n\t/* extLst */\n\n\tif(o.length>2){ o[o.length] = ''; o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* [MS-XLSB] 2.4.304 BrtBundleSh */\nfunction parse_BrtBundleSh(data, length) {\n\tvar z = {};\n\tz.Hidden = data.read_shift(4); //hsState ST_SheetState\n\tz.iTabID = data.read_shift(4);\n\tz.strRelID = parse_RelID(data,length-8);\n\tz.name = parse_XLWideString(data);\n\treturn z;\n}\nfunction write_BrtBundleSh(data, o) {\n\tif(!o) o = new_buf(127);\n\to.write_shift(4, data.Hidden);\n\to.write_shift(4, data.iTabID);\n\twrite_RelID(data.strRelID, o);\n\twrite_XLWideString(data.name.slice(0,31), o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.815 BrtWbProp */\nfunction parse_BrtWbProp(data, length) {\n\tvar o = ({});\n\tvar flags = data.read_shift(4);\n\to.defaultThemeVersion = data.read_shift(4);\n\tvar strName = (length > 8) ? parse_XLWideString(data) : \"\";\n\tif(strName.length > 0) o.CodeName = strName;\n\to.autoCompressPictures = !!(flags & 0x10000);\n\to.backupFile = !!(flags & 0x40);\n\to.checkCompatibility = !!(flags & 0x1000);\n\to.date1904 = !!(flags & 0x01);\n\to.filterPrivacy = !!(flags & 0x08);\n\to.hidePivotFieldList = !!(flags & 0x400);\n\to.promptedSolutions = !!(flags & 0x10);\n\to.publishItems = !!(flags & 0x800);\n\to.refreshAllConnections = !!(flags & 0x40000);\n\to.saveExternalLinkValues = !!(flags & 0x80);\n\to.showBorderUnselectedTables = !!(flags & 0x04);\n\to.showInkAnnotation = !!(flags & 0x20);\n\to.showObjects = [\"all\", \"placeholders\", \"none\"][(flags >> 13) & 0x03];\n\to.showPivotChartFilter = !!(flags & 0x8000);\n\to.updateLinks = [\"userSet\", \"never\", \"always\"][(flags >> 8) & 0x03];\n\treturn o;\n}\nfunction write_BrtWbProp(data, o) {\n\tif(!o) o = new_buf(72);\n\tvar flags = 0;\n\tif(data) {\n\t\t/* TODO: mirror parse_BrtWbProp fields */\n\t\tif(data.filterPrivacy) flags |= 0x08;\n\t}\n\to.write_shift(4, flags);\n\to.write_shift(4, 0);\n\twrite_XLSBCodeName(data && data.CodeName || \"ThisWorkbook\", o);\n\treturn o.slice(0, o.l);\n}\n\nfunction parse_BrtFRTArchID$(data, length) {\n\tvar o = {};\n\tdata.read_shift(4);\n\to.ArchID = data.read_shift(4);\n\tdata.l += length - 8;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.687 BrtName */\nfunction parse_BrtName(data, length, opts) {\n\tvar end = data.l + length;\n\tdata.l += 4; //var flags = data.read_shift(4);\n\tdata.l += 1; //var chKey = data.read_shift(1);\n\tvar itab = data.read_shift(4);\n\tvar name = parse_XLNameWideString(data);\n\tvar formula = parse_XLSBNameParsedFormula(data, 0, opts);\n\tvar comment = parse_XLNullableWideString(data);\n\t//if(0 /* fProc */) {\n\t\t// unusedstring1: XLNullableWideString\n\t\t// description: XLNullableWideString\n\t\t// helpTopic: XLNullableWideString\n\t\t// unusedstring2: XLNullableWideString\n\t//}\n\tdata.l = end;\n\tvar out = ({Name:name, Ptg:formula});\n\tif(itab < 0xFFFFFFF) out.Sheet = itab;\n\tif(comment) out.Comment = comment;\n\treturn out;\n}\n\n/* [MS-XLSB] 2.1.7.61 Workbook */\nfunction parse_wb_bin(data, opts) {\n\tvar wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: \"\" };\n\tvar state = [];\n\tvar pass = false;\n\n\tif(!opts) opts = {};\n\topts.biff = 12;\n\n\tvar Names = [];\n\tvar supbooks = ([[]]);\n\tsupbooks.SheetNames = [];\n\tsupbooks.XTI = [];\n\n\tXLSBRecordEnum[0x0010] = { n:\"BrtFRTArchID$\", f:parse_BrtFRTArchID$ };\n\n\trecordhopper(data, function hopper_wb(val, R_n, RT) {\n\t\tswitch(RT) {\n\t\t\tcase 0x009C: /* 'BrtBundleSh' */\n\t\t\t\tsupbooks.SheetNames.push(val.name);\n\t\t\t\twb.Sheets.push(val); break;\n\n\t\t\tcase 0x0099: /* 'BrtWbProp' */\n\t\t\t\twb.WBProps = val; break;\n\n\t\t\tcase 0x0027: /* 'BrtName' */\n\t\t\t\tif(val.Sheet != null) opts.SID = val.Sheet;\n\t\t\t\tval.Ref = stringify_formula(val.Ptg, null, null, supbooks, opts);\n\t\t\t\tdelete opts.SID;\n\t\t\t\tdelete val.Ptg;\n\t\t\t\tNames.push(val);\n\t\t\t\tbreak;\n\t\t\tcase 0x040C: /* 'BrtNameExt' */ break;\n\n\t\t\tcase 0x0165: /* 'BrtSupSelf' */\n\t\t\tcase 0x0166: /* 'BrtSupSame' */\n\t\t\tcase 0x0163: /* 'BrtSupBookSrc' */\n\t\t\tcase 0x029B: /* 'BrtSupAddin' */\n\t\t\t\tif(!supbooks[0].length) supbooks[0] = [RT, val];\n\t\t\t\telse supbooks.push([RT, val]);\n\t\t\t\tsupbooks[supbooks.length - 1].XTI = [];\n\t\t\t\tbreak;\n\t\t\tcase 0x016A: /* 'BrtExternSheet' */\n\t\t\t\tif(supbooks.length === 0) { supbooks[0] = []; supbooks[0].XTI = []; }\n\t\t\t\tsupbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val);\n\t\t\t\tsupbooks.XTI = supbooks.XTI.concat(val);\n\t\t\t\tbreak;\n\t\t\tcase 0x0169: /* 'BrtPlaceholderName' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0817: /* 'BrtAbsPath15' */\n\t\t\tcase 0x009E: /* 'BrtBookView' */\n\t\t\tcase 0x008F: /* 'BrtBeginBundleShs' */\n\t\t\tcase 0x0298: /* 'BrtBeginFnGroup' */\n\t\t\tcase 0x0161: /* 'BrtBeginExternals' */\n\t\t\t\tbreak;\n\n\t\t\t/* case 'BrtModelTimeGroupingCalcCol' */\n\t\t\tcase 0x0C00: /* 'BrtUid' */\n\t\t\tcase 0x0C01: /* 'BrtRevisionPtr' */\n\t\t\tcase 0x0216: /* 'BrtBookProtection' */\n\t\t\tcase 0x02A5: /* 'BrtBookProtectionIso' */\n\t\t\tcase 0x009D: /* 'BrtCalcProp' */\n\t\t\tcase 0x0262: /* 'BrtCrashRecErr' */\n\t\t\tcase 0x0802: /* 'BrtDecoupledPivotCacheID' */\n\t\t\tcase 0x009B: /* 'BrtFileRecover' */\n\t\t\tcase 0x0224: /* 'BrtFileSharing' */\n\t\t\tcase 0x02A4: /* 'BrtFileSharingIso' */\n\t\t\tcase 0x0080: /* 'BrtFileVersion' */\n\t\t\tcase 0x0299: /* 'BrtFnGroup' */\n\t\t\tcase 0x0850: /* 'BrtModelRelationship' */\n\t\t\tcase 0x084D: /* 'BrtModelTable' */\n\t\t\tcase 0x0225: /* 'BrtOleSize' */\n\t\t\tcase 0x0805: /* 'BrtPivotTableRef' */\n\t\t\tcase 0x0254: /* 'BrtSmartTagType' */\n\t\t\tcase 0x081C: /* 'BrtTableSlicerCacheID' */\n\t\t\tcase 0x081B: /* 'BrtTableSlicerCacheIDs' */\n\t\t\tcase 0x0822: /* 'BrtTimelineCachePivotCacheID' */\n\t\t\tcase 0x018D: /* 'BrtUserBookView' */\n\t\t\tcase 0x009A: /* 'BrtWbFactoid' */\n\t\t\tcase 0x045D: /* 'BrtWbProp14' */\n\t\t\tcase 0x0229: /* 'BrtWebOpt' */\n\t\t\tcase 0x082B: /* 'BrtWorkBookPr15' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0023: /* 'BrtFRTBegin' */\n\t\t\t\tstate.push(R_n); pass = true; break;\n\t\t\tcase 0x0024: /* 'BrtFRTEnd' */\n\t\t\t\tstate.pop(); pass = false; break;\n\t\t\tcase 0x0025: /* 'BrtACBegin' */\n\t\t\t\tstate.push(R_n); pass = true; break;\n\t\t\tcase 0x0026: /* 'BrtACEnd' */\n\t\t\t\tstate.pop(); pass = false; break;\n\n\t\t\tcase 0x0010: /* 'BrtFRTArchID$' */ break;\n\n\t\t\tdefault:\n\t\t\t\tif((R_n||\"\").indexOf(\"Begin\") > 0){/* empty */}\n\t\t\t\telse if((R_n||\"\").indexOf(\"End\") > 0){/* empty */}\n\t\t\t\telse if(!pass || (opts.WTF && state[state.length-1] != \"BrtACBegin\" && state[state.length-1] != \"BrtFRTBegin\")) throw new Error(\"Unexpected record \" + RT + \" \" + R_n);\n\t\t}\n\t}, opts);\n\n\tparse_wb_defaults(wb);\n\n\t// $FlowIgnore\n\twb.Names = Names;\n\n\t(wb).supbooks = supbooks;\n\treturn wb;\n}\n\nfunction write_BUNDLESHS(ba, wb) {\n\twrite_record(ba, \"BrtBeginBundleShs\");\n\tfor(var idx = 0; idx != wb.SheetNames.length; ++idx) {\n\t\tvar viz = wb.Workbook && wb.Workbook.Sheets && wb.Workbook.Sheets[idx] && wb.Workbook.Sheets[idx].Hidden || 0;\n\t\tvar d = { Hidden: viz, iTabID: idx+1, strRelID: 'rId' + (idx+1), name: wb.SheetNames[idx] };\n\t\twrite_record(ba, \"BrtBundleSh\", write_BrtBundleSh(d));\n\t}\n\twrite_record(ba, \"BrtEndBundleShs\");\n}\n\n/* [MS-XLSB] 2.4.649 BrtFileVersion */\nfunction write_BrtFileVersion(data, o) {\n\tif(!o) o = new_buf(127);\n\tfor(var i = 0; i != 4; ++i) o.write_shift(4, 0);\n\twrite_XLWideString(\"SheetJS\", o);\n\twrite_XLWideString(XLSX.version, o);\n\twrite_XLWideString(XLSX.version, o);\n\twrite_XLWideString(\"7262\", o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.301 BrtBookView */\nfunction write_BrtBookView(idx, o) {\n\tif(!o) o = new_buf(29);\n\to.write_shift(-4, 0);\n\to.write_shift(-4, 460);\n\to.write_shift(4, 28800);\n\to.write_shift(4, 17600);\n\to.write_shift(4, 500);\n\to.write_shift(4, idx);\n\to.write_shift(4, idx);\n\tvar flags = 0x78;\n\to.write_shift(1, flags);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\nfunction write_BOOKVIEWS(ba, wb) {\n\t/* required if hidden tab appears before visible tab */\n\tif(!wb.Workbook || !wb.Workbook.Sheets) return;\n\tvar sheets = wb.Workbook.Sheets;\n\tvar i = 0, vistab = -1, hidden = -1;\n\tfor(; i < sheets.length; ++i) {\n\t\tif(!sheets[i] || !sheets[i].Hidden && vistab == -1) vistab = i;\n\t\telse if(sheets[i].Hidden == 1 && hidden == -1) hidden = i;\n\t}\n\tif(hidden > vistab) return;\n\twrite_record(ba, \"BrtBeginBookViews\");\n\twrite_record(ba, \"BrtBookView\", write_BrtBookView(vistab));\n\t/* 1*(BrtBookView *FRT) */\n\twrite_record(ba, \"BrtEndBookViews\");\n}\n\n/* [MS-XLSB] 2.4.305 BrtCalcProp */\n/*function write_BrtCalcProp(data, o) {\n\tif(!o) o = new_buf(26);\n\to.write_shift(4,0); // force recalc\n\to.write_shift(4,1);\n\to.write_shift(4,0);\n\twrite_Xnum(0, o);\n\to.write_shift(-4, 1023);\n\to.write_shift(1, 0x33);\n\to.write_shift(1, 0x00);\n\treturn o;\n}*/\n\n/* [MS-XLSB] 2.4.646 BrtFileRecover */\n/*function write_BrtFileRecover(data, o) {\n\tif(!o) o = new_buf(1);\n\to.write_shift(1,0);\n\treturn o;\n}*/\n\n/* [MS-XLSB] 2.1.7.61 Workbook */\nfunction write_wb_bin(wb, opts) {\n\tvar ba = buf_array();\n\twrite_record(ba, \"BrtBeginBook\");\n\twrite_record(ba, \"BrtFileVersion\", write_BrtFileVersion());\n\t/* [[BrtFileSharingIso] BrtFileSharing] */\n\twrite_record(ba, \"BrtWbProp\", write_BrtWbProp(wb.Workbook && wb.Workbook.WBProps || null));\n\t/* [ACABSPATH] */\n\t/* [[BrtBookProtectionIso] BrtBookProtection] */\n\twrite_BOOKVIEWS(ba, wb, opts);\n\twrite_BUNDLESHS(ba, wb, opts);\n\t/* [FNGROUP] */\n\t/* [EXTERNALS] */\n\t/* *BrtName */\n\t/* write_record(ba, \"BrtCalcProp\", write_BrtCalcProp()); */\n\t/* [BrtOleSize] */\n\t/* *(BrtUserBookView *FRT) */\n\t/* [PIVOTCACHEIDS] */\n\t/* [BrtWbFactoid] */\n\t/* [SMARTTAGTYPES] */\n\t/* [BrtWebOpt] */\n\t/* write_record(ba, \"BrtFileRecover\", write_BrtFileRecover()); */\n\t/* [WEBPUBITEMS] */\n\t/* [CRERRS] */\n\t/* FRTWORKBOOK */\n\twrite_record(ba, \"BrtEndBook\");\n\n\treturn ba.end();\n}\nfunction parse_wb(data, name, opts) {\n\tif(name.slice(-4)===\".bin\") return parse_wb_bin((data), opts);\n\treturn parse_wb_xml((data), opts);\n}\n\nfunction parse_ws(data, name, idx, opts, rels, wb, themes, styles) {\n\tif(name.slice(-4)===\".bin\") return parse_ws_bin((data), opts, idx, rels, wb, themes, styles);\n\treturn parse_ws_xml((data), opts, idx, rels, wb, themes, styles);\n}\n\nfunction parse_cs(data, name, idx, opts, rels, wb, themes, styles) {\n\tif(name.slice(-4)===\".bin\") return parse_cs_bin((data), opts, idx, rels, wb, themes, styles);\n\treturn parse_cs_xml((data), opts, idx, rels, wb, themes, styles);\n}\n\nfunction parse_ms(data, name, idx, opts, rels, wb, themes, styles) {\n\tif(name.slice(-4)===\".bin\") return parse_ms_bin((data), opts, idx, rels, wb, themes, styles);\n\treturn parse_ms_xml((data), opts, idx, rels, wb, themes, styles);\n}\n\nfunction parse_ds(data, name, idx, opts, rels, wb, themes, styles) {\n\tif(name.slice(-4)===\".bin\") return parse_ds_bin((data), opts, idx, rels, wb, themes, styles);\n\treturn parse_ds_xml((data), opts, idx, rels, wb, themes, styles);\n}\n\nfunction parse_sty(data, name, themes, opts) {\n\tif(name.slice(-4)===\".bin\") return parse_sty_bin((data), themes, opts);\n\treturn parse_sty_xml((data), themes, opts);\n}\n\nfunction parse_theme(data, name, opts) {\n\treturn parse_theme_xml(data, opts);\n}\n\nfunction parse_sst(data, name, opts) {\n\tif(name.slice(-4)===\".bin\") return parse_sst_bin((data), opts);\n\treturn parse_sst_xml((data), opts);\n}\n\nfunction parse_cmnt(data, name, opts) {\n\tif(name.slice(-4)===\".bin\") return parse_comments_bin((data), opts);\n\treturn parse_comments_xml((data), opts);\n}\n\nfunction parse_cc(data, name, opts) {\n\tif(name.slice(-4)===\".bin\") return parse_cc_bin((data), name, opts);\n\treturn parse_cc_xml((data), name, opts);\n}\n\nfunction parse_xlink(data, rel, name, opts) {\n\tif(name.slice(-4)===\".bin\") return parse_xlink_bin((data), rel, name, opts);\n\treturn parse_xlink_xml((data), rel, name, opts);\n}\n\nfunction write_wb(wb, name, opts) {\n\treturn (name.slice(-4)===\".bin\" ? write_wb_bin : write_wb_xml)(wb, opts);\n}\n\nfunction write_ws(data, name, opts, wb, rels) {\n\treturn (name.slice(-4)===\".bin\" ? write_ws_bin : write_ws_xml)(data, opts, wb, rels);\n}\n\n// eslint-disable-next-line no-unused-vars\nfunction write_cs(data, name, opts, wb, rels) {\n\treturn (name.slice(-4)===\".bin\" ? write_cs_bin : write_cs_xml)(data, opts, wb, rels);\n}\n\nfunction write_sty(data, name, opts) {\n\treturn (name.slice(-4)===\".bin\" ? write_sty_bin : write_sty_xml)(data, opts);\n}\n\nfunction write_sst(data, name, opts) {\n\treturn (name.slice(-4)===\".bin\" ? write_sst_bin : write_sst_xml)(data, opts);\n}\n\nfunction write_cmnt(data, name, opts) {\n\treturn (name.slice(-4)===\".bin\" ? write_comments_bin : write_comments_xml)(data, opts);\n}\n/*\nfunction write_cc(data, name:string, opts) {\n\treturn (name.slice(-4)===\".bin\" ? write_cc_bin : write_cc_xml)(data, opts);\n}\n*/\nvar attregexg2=/([\\w:]+)=((?:\")([^\"]*)(?:\")|(?:')([^']*)(?:'))/g;\nvar attregex2=/([\\w:]+)=((?:\")(?:[^\"]*)(?:\")|(?:')(?:[^']*)(?:'))/;\nfunction xlml_parsexmltag(tag, skip_root) {\n\tvar words = tag.split(/\\s+/);\n\tvar z = ([]); if(!skip_root) z[0] = words[0];\n\tif(words.length === 1) return z;\n\tvar m = tag.match(attregexg2), y, j, w, i;\n\tif(m) for(i = 0; i != m.length; ++i) {\n\t\ty = m[i].match(attregex2);\nif((j=y[1].indexOf(\":\")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1);\n\t\telse {\n\t\t\tif(y[1].slice(0,6) === \"xmlns:\") w = \"xmlns\"+y[1].slice(6);\n\t\t\telse w = y[1].slice(j+1);\n\t\t\tz[w] = y[2].slice(1,y[2].length-1);\n\t\t}\n\t}\n\treturn z;\n}\nfunction xlml_parsexmltagobj(tag) {\n\tvar words = tag.split(/\\s+/);\n\tvar z = {};\n\tif(words.length === 1) return z;\n\tvar m = tag.match(attregexg2), y, j, w, i;\n\tif(m) for(i = 0; i != m.length; ++i) {\n\t\ty = m[i].match(attregex2);\nif((j=y[1].indexOf(\":\")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1);\n\t\telse {\n\t\t\tif(y[1].slice(0,6) === \"xmlns:\") w = \"xmlns\"+y[1].slice(6);\n\t\t\telse w = y[1].slice(j+1);\n\t\t\tz[w] = y[2].slice(1,y[2].length-1);\n\t\t}\n\t}\n\treturn z;\n}\n\n// ----\n\nfunction xlml_format(format, value) {\n\tvar fmt = XLMLFormatMap[format] || unescapexml(format);\n\tif(fmt === \"General\") return SSF._general(value);\n\treturn SSF.format(fmt, value);\n}\n\nfunction xlml_set_custprop(Custprops, key, cp, val) {\n\tvar oval = val;\n\tswitch((cp[0].match(/dt:dt=\"([\\w.]+)\"/)||[\"\",\"\"])[1]) {\n\t\tcase \"boolean\": oval = parsexmlbool(val); break;\n\t\tcase \"i2\": case \"int\": oval = parseInt(val, 10); break;\n\t\tcase \"r4\": case \"float\": oval = parseFloat(val); break;\n\t\tcase \"date\": case \"dateTime.tz\": oval = parseDate(val); break;\n\t\tcase \"i8\": case \"string\": case \"fixed\": case \"uuid\": case \"bin.base64\": break;\n\t\tdefault: throw new Error(\"bad custprop:\" + cp[0]);\n\t}\n\tCustprops[unescapexml(key)] = oval;\n}\n\nfunction safe_format_xlml(cell, nf, o) {\n\tif(cell.t === 'z') return;\n\tif(!o || o.cellText !== false) try {\n\t\tif(cell.t === 'e') { cell.w = cell.w || BErr[cell.v]; }\n\t\telse if(nf === \"General\") {\n\t\t\tif(cell.t === 'n') {\n\t\t\t\tif((cell.v|0) === cell.v) cell.w = SSF._general_int(cell.v);\n\t\t\t\telse cell.w = SSF._general_num(cell.v);\n\t\t\t}\n\t\t\telse cell.w = SSF._general(cell.v);\n\t\t}\n\t\telse cell.w = xlml_format(nf||\"General\", cell.v);\n\t} catch(e) { if(o.WTF) throw e; }\n\ttry {\n\t\tvar z = XLMLFormatMap[nf]||nf||\"General\";\n\t\tif(o.cellNF) cell.z = z;\n\t\tif(o.cellDates && cell.t == 'n' && SSF.is_date(z)) {\n\t\t\tvar _d = SSF.parse_date_code(cell.v); if(_d) { cell.t = 'd'; cell.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }\n\t\t}\n\t} catch(e) { if(o.WTF) throw e; }\n}\n\nfunction process_style_xlml(styles, stag, opts) {\n\tif(opts.cellStyles) {\n\t\tif(stag.Interior) {\n\t\t\tvar I = stag.Interior;\n\t\t\tif(I.Pattern) I.patternType = XLMLPatternTypeMap[I.Pattern] || I.Pattern;\n\t\t}\n\t}\n\tstyles[stag.ID] = stag;\n}\n\n/* TODO: there must exist some form of OSP-blessed spec */\nfunction parse_xlml_data(xml, ss, data, cell, base, styles, csty, row, arrayf, o) {\n\tvar nf = \"General\", sid = cell.StyleID, S = {}; o = o || {};\n\tvar interiors = [];\n\tvar i = 0;\n\tif(sid === undefined && row) sid = row.StyleID;\n\tif(sid === undefined && csty) sid = csty.StyleID;\n\twhile(styles[sid] !== undefined) {\n\t\tif(styles[sid].nf) nf = styles[sid].nf;\n\t\tif(styles[sid].Interior) interiors.push(styles[sid].Interior);\n\t\tif(!styles[sid].Parent) break;\n\t\tsid = styles[sid].Parent;\n\t}\n\tswitch(data.Type) {\n\t\tcase 'Boolean':\n\t\t\tcell.t = 'b';\n\t\t\tcell.v = parsexmlbool(xml);\n\t\t\tbreak;\n\t\tcase 'String':\n\t\t\tcell.t = 's'; cell.r = xlml_fixstr(unescapexml(xml));\n\t\t\tcell.v = (xml.indexOf(\"<\") > -1 ? unescapexml(ss||xml).replace(/<.*?>/g, \"\") : cell.r); // todo: BR etc\n\t\t\tbreak;\n\t\tcase 'DateTime':\n\t\t\tif(xml.slice(-1) != \"Z\") xml += \"Z\";\n\t\t\tcell.v = (parseDate(xml) - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);\n\t\t\tif(cell.v !== cell.v) cell.v = unescapexml(xml);\n\t\t\telse if(cell.v<60) cell.v = cell.v -1;\n\t\t\tif(!nf || nf == \"General\") nf = \"yyyy-mm-dd\";\n\t\t\t/* falls through */\n\t\tcase 'Number':\n\t\t\tif(cell.v === undefined) cell.v=+xml;\n\t\t\tif(!cell.t) cell.t = 'n';\n\t\t\tbreak;\n\t\tcase 'Error': cell.t = 'e'; cell.v = RBErr[xml]; if(o.cellText !== false) cell.w = xml; break;\n\t\tdefault:\n\t\t\tif(xml == \"\" && ss == \"\") { cell.t = 'z'; }\n\t\t\telse { cell.t = 's'; cell.v = xlml_fixstr(ss||xml); }\n\t\t\tbreak;\n\t}\n\tsafe_format_xlml(cell, nf, o);\n\tif(o.cellFormula !== false) {\n\t\tif(cell.Formula) {\n\t\t\tvar fstr = unescapexml(cell.Formula);\n\t\t\t/* strictly speaking, the leading = is required but some writers omit */\n\t\t\tif(fstr.charCodeAt(0) == 61 /* = */) fstr = fstr.slice(1);\n\t\t\tcell.f = rc_to_a1(fstr, base);\n\t\t\tdelete cell.Formula;\n\t\t\tif(cell.ArrayRange == \"RC\") cell.F = rc_to_a1(\"RC:RC\", base);\n\t\t\telse if(cell.ArrayRange) {\n\t\t\t\tcell.F = rc_to_a1(cell.ArrayRange, base);\n\t\t\t\tarrayf.push([safe_decode_range(cell.F), cell.F]);\n\t\t\t}\n\t\t} else {\n\t\t\tfor(i = 0; i < arrayf.length; ++i)\n\t\t\t\tif(base.r >= arrayf[i][0].s.r && base.r <= arrayf[i][0].e.r)\n\t\t\t\t\tif(base.c >= arrayf[i][0].s.c && base.c <= arrayf[i][0].e.c)\n\t\t\t\t\t\tcell.F = arrayf[i][1];\n\t\t}\n\t}\n\tif(o.cellStyles) {\n\t\tinteriors.forEach(function(x) {\n\t\t\tif(!S.patternType && x.patternType) S.patternType = x.patternType;\n\t\t});\n\t\tcell.s = S;\n\t}\n\tif(cell.StyleID !== undefined) cell.ixfe = cell.StyleID;\n}\n\nfunction xlml_clean_comment(comment) {\n\tcomment.t = comment.v || \"\";\n\tcomment.t = comment.t.replace(/\\r\\n/g,\"\\n\").replace(/\\r/g,\"\\n\");\n\tcomment.v = comment.w = comment.ixfe = undefined;\n}\n\nfunction xlml_normalize(d) {\n\tif(has_buf && Buffer.isBuffer(d)) return d.toString('utf8');\n\tif(typeof d === 'string') return d;\n\t/* duktape */\n\tif(typeof Uint8Array !== 'undefined' && d instanceof Uint8Array) return utf8read(a2s(ab2a(d)));\n\tthrow new Error(\"Bad input format: expected Buffer or string\");\n}\n\n/* TODO: Everything */\n/* UOS uses CJK in tags */\nvar xlmlregex = /<(\\/?)([^\\s?>:\\/]+)(?:[\\s?:\\/][^>]*)?>/mg;\n//var xlmlregex = /<(\\/?)([a-z0-9]*:|)(\\w+)[^>]*>/mg;\nfunction parse_xlml_xml(d, _opts) {\n\tvar opts = _opts || {};\n\tmake_ssf(SSF);\n\tvar str = debom(xlml_normalize(d));\n\tif(opts.type == 'binary' || opts.type == 'array' || opts.type == 'base64') {\n\t\tif(typeof cptable !== 'undefined') str = cptable.utils.decode(65001, char_codes(str));\n\t\telse str = utf8read(str);\n\t}\n\tvar opening = str.slice(0, 1024).toLowerCase(), ishtml = false;\n\topening = opening.replace(/\".*?\"/g, \"\");\n\tif((opening.indexOf(\">\") & 1023) > Math.min((opening.indexOf(\",\") & 1023), (opening.indexOf(\";\")&1023))) { var _o = dup(opts); _o.type = \"string\"; return PRN.to_workbook(str, _o); }\n\tif(opening.indexOf(\"= 0) ishtml = true; });\n\tif(ishtml) return HTML_.to_workbook(str, opts);\n\tvar Rn;\n\tvar state = [], tmp;\n\tif(DENSE != null && opts.dense == null) opts.dense = DENSE;\n\tvar sheets = {}, sheetnames = [], cursheet = (opts.dense ? [] : {}), sheetname = \"\";\n\tvar table = {}, cell = ({}), row = {};// eslint-disable-line no-unused-vars\n\tvar dtag = xlml_parsexmltag(''), didx = 0;\n\tvar c = 0, r = 0;\n\tvar refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };\n\tvar styles = {}, stag = {};\n\tvar ss = \"\", fidx = 0;\n\tvar merges = [];\n\tvar Props = {}, Custprops = {}, pidx = 0, cp = [];\n\tvar comments = [], comment = ({});\n\tvar cstys = [], csty, seencol = false;\n\tvar arrayf = [];\n\tvar rowinfo = [], rowobj = {}, cc = 0, rr = 0;\n\tvar Workbook = ({ Sheets:[], WBProps:{date1904:false} }), wsprops = {};\n\txlmlregex.lastIndex = 0;\n\tstr = str.replace(//mg,\"\");\n\tvar raw_Rn3 = \"\";\n\twhile((Rn = xlmlregex.exec(str))) switch((Rn[3] = (raw_Rn3 = Rn[3]).toLowerCase())) {\n\t\tcase 'data' /*case 'Data'*/:\n\t\t\tif(raw_Rn3 == \"data\") {\n\t\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));}\n\t\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(state[state.length-1][1]) break;\n\t\t\tif(Rn[1]==='/') parse_xlml_data(str.slice(didx, Rn.index), ss, dtag, state[state.length-1][0]==/*\"Comment\"*/\"comment\"?comment:cell, {c:c,r:r}, styles, cstys[c], row, arrayf, opts);\n\t\t\telse { ss = \"\"; dtag = xlml_parsexmltag(Rn[0]); didx = Rn.index + Rn[0].length; }\n\t\t\tbreak;\n\t\tcase 'cell' /*case 'Cell'*/:\n\t\t\tif(Rn[1]==='/'){\n\t\t\t\tif(comments.length > 0) cell.c = comments;\n\t\t\t\tif((!opts.sheetRows || opts.sheetRows > r) && cell.v !== undefined) {\n\t\t\t\t\tif(opts.dense) {\n\t\t\t\t\t\tif(!cursheet[r]) cursheet[r] = [];\n\t\t\t\t\t\tcursheet[r][c] = cell;\n\t\t\t\t\t} else cursheet[encode_col(c) + encode_row(r)] = cell;\n\t\t\t\t}\n\t\t\t\tif(cell.HRef) {\n\t\t\t\t\tcell.l = ({Target:unescapexml(cell.HRef)});\n\t\t\t\t\tif(cell.HRefScreenTip) cell.l.Tooltip = cell.HRefScreenTip;\n\t\t\t\t\tdelete cell.HRef; delete cell.HRefScreenTip;\n\t\t\t\t}\n\t\t\t\tif(cell.MergeAcross || cell.MergeDown) {\n\t\t\t\t\tcc = c + (parseInt(cell.MergeAcross,10)|0);\n\t\t\t\t\trr = r + (parseInt(cell.MergeDown,10)|0);\n\t\t\t\t\tmerges.push({s:{c:c,r:r},e:{c:cc,r:rr}});\n\t\t\t\t}\n\t\t\t\tif(!opts.sheetStubs) { if(cell.MergeAcross) c = cc + 1; else ++c; }\n\t\t\t\telse if(cell.MergeAcross || cell.MergeDown) {\nfor(var cma = c; cma <= cc; ++cma) {\n\t\t\t\t\t\tfor(var cmd = r; cmd <= rr; ++cmd) {\n\t\t\t\t\t\t\tif(cma > c || cmd > r) {\n\t\t\t\t\t\t\t\tif(opts.dense) {\n\t\t\t\t\t\t\t\t\tif(!cursheet[cmd]) cursheet[cmd] = [];\n\t\t\t\t\t\t\t\t\tcursheet[cmd][cma] = {t:'z'};\n\t\t\t\t\t\t\t\t} else cursheet[encode_col(cma) + encode_row(cmd)] = {t:'z'};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tc = cc + 1;\n\t\t\t\t}\n\t\t\t\telse ++c;\n\t\t\t} else {\n\t\t\t\tcell = xlml_parsexmltagobj(Rn[0]);\n\t\t\t\tif(cell.Index) c = +cell.Index - 1;\n\t\t\t\tif(c < refguess.s.c) refguess.s.c = c;\n\t\t\t\tif(c > refguess.e.c) refguess.e.c = c;\n\t\t\t\tif(Rn[0].slice(-2) === \"/>\") ++c;\n\t\t\t\tcomments = [];\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'row' /*case 'Row'*/:\n\t\t\tif(Rn[1]==='/' || Rn[0].slice(-2) === \"/>\") {\n\t\t\t\tif(r < refguess.s.r) refguess.s.r = r;\n\t\t\t\tif(r > refguess.e.r) refguess.e.r = r;\n\t\t\t\tif(Rn[0].slice(-2) === \"/>\") {\n\t\t\t\t\trow = xlml_parsexmltag(Rn[0]);\n\t\t\t\t\tif(row.Index) r = +row.Index - 1;\n\t\t\t\t}\n\t\t\t\tc = 0; ++r;\n\t\t\t} else {\n\t\t\t\trow = xlml_parsexmltag(Rn[0]);\n\t\t\t\tif(row.Index) r = +row.Index - 1;\n\t\t\t\trowobj = {};\n\t\t\t\tif(row.AutoFitHeight == \"0\" || row.Height) {\n\t\t\t\t\trowobj.hpx = parseInt(row.Height, 10); rowobj.hpt = px2pt(rowobj.hpx);\n\t\t\t\t\trowinfo[r] = rowobj;\n\t\t\t\t}\n\t\t\t\tif(row.Hidden == \"1\") { rowobj.hidden = true; rowinfo[r] = rowobj; }\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'worksheet' /*case 'Worksheet'*/: /* TODO: read range from FullRows/FullColumns */\n\t\t\tif(Rn[1]==='/'){\n\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));\n\t\t\t\tsheetnames.push(sheetname);\n\t\t\t\tif(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) {\n\t\t\t\t\tcursheet[\"!ref\"] = encode_range(refguess);\n\t\t\t\t\tif(opts.sheetRows && opts.sheetRows <= refguess.e.r) {\n\t\t\t\t\t\tcursheet[\"!fullref\"] = cursheet[\"!ref\"];\n\t\t\t\t\t\trefguess.e.r = opts.sheetRows - 1;\n\t\t\t\t\t\tcursheet[\"!ref\"] = encode_range(refguess);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(merges.length) cursheet[\"!merges\"] = merges;\n\t\t\t\tif(cstys.length > 0) cursheet[\"!cols\"] = cstys;\n\t\t\t\tif(rowinfo.length > 0) cursheet[\"!rows\"] = rowinfo;\n\t\t\t\tsheets[sheetname] = cursheet;\n\t\t\t} else {\n\t\t\t\trefguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };\n\t\t\t\tr = c = 0;\n\t\t\t\tstate.push([Rn[3], false]);\n\t\t\t\ttmp = xlml_parsexmltag(Rn[0]);\n\t\t\t\tsheetname = unescapexml(tmp.Name);\n\t\t\t\tcursheet = (opts.dense ? [] : {});\n\t\t\t\tmerges = [];\n\t\t\t\tarrayf = [];\n\t\t\t\trowinfo = [];\n\t\t\t\twsprops = {name:sheetname, Hidden:0};\n\t\t\t\tWorkbook.Sheets.push(wsprops);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'table' /*case 'Table'*/:\n\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));}\n\t\t\telse if(Rn[0].slice(-2) == \"/>\") break;\n\t\t\telse {\n\t\t\t\ttable = xlml_parsexmltag(Rn[0]);\n\t\t\t\tstate.push([Rn[3], false]);\n\t\t\t\tcstys = []; seencol = false;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'style' /*case 'Style'*/:\n\t\t\tif(Rn[1]==='/') process_style_xlml(styles, stag, opts);\n\t\t\telse stag = xlml_parsexmltag(Rn[0]);\n\t\t\tbreak;\n\n\t\tcase 'numberformat' /*case 'NumberFormat'*/:\n\t\t\tstag.nf = unescapexml(xlml_parsexmltag(Rn[0]).Format || \"General\");\n\t\t\tif(XLMLFormatMap[stag.nf]) stag.nf = XLMLFormatMap[stag.nf];\n\t\t\tfor(var ssfidx = 0; ssfidx != 0x188; ++ssfidx) if(SSF._table[ssfidx] == stag.nf) break;\n\t\t\tif(ssfidx == 0x188) for(ssfidx = 0x39; ssfidx != 0x188; ++ssfidx) if(SSF._table[ssfidx] == null) { SSF.load(stag.nf, ssfidx); break; }\n\t\t\tbreak;\n\n\t\tcase 'column' /*case 'Column'*/:\n\t\t\tif(state[state.length-1][0] !== /*'Table'*/'table') break;\n\t\t\tcsty = xlml_parsexmltag(Rn[0]);\n\t\t\tif(csty.Hidden) { csty.hidden = true; delete csty.Hidden; }\n\t\t\tif(csty.Width) csty.wpx = parseInt(csty.Width, 10);\n\t\t\tif(!seencol && csty.wpx > 10) {\n\t\t\t\tseencol = true; MDW = DEF_MDW; //find_mdw_wpx(csty.wpx);\n\t\t\t\tfor(var _col = 0; _col < cstys.length; ++_col) if(cstys[_col]) process_col(cstys[_col]);\n\t\t\t}\n\t\t\tif(seencol) process_col(csty);\n\t\t\tcstys[(csty.Index-1||cstys.length)] = csty;\n\t\t\tfor(var i = 0; i < +csty.Span; ++i) cstys[cstys.length] = dup(csty);\n\t\t\tbreak;\n\n\t\tcase 'namedrange' /*case 'NamedRange'*/:\n\t\t\tif(Rn[1]==='/') break;\n\t\t\tif(!Workbook.Names) Workbook.Names = [];\n\t\t\tvar _NamedRange = parsexmltag(Rn[0]);\n\t\t\tvar _DefinedName = ({\n\t\t\t\tName: _NamedRange.Name,\n\t\t\t\tRef: rc_to_a1(_NamedRange.RefersTo.slice(1), {r:0, c:0})\n\t\t\t});\n\t\t\tif(Workbook.Sheets.length>0) _DefinedName.Sheet=Workbook.Sheets.length-1;\nWorkbook.Names.push(_DefinedName);\n\t\t\tbreak;\n\n\t\tcase 'namedcell' /*case 'NamedCell'*/: break;\n\t\tcase 'b' /*case 'B'*/: break;\n\t\tcase 'i' /*case 'I'*/: break;\n\t\tcase 'u' /*case 'U'*/: break;\n\t\tcase 's' /*case 'S'*/: break;\n\t\tcase 'em' /*case 'EM'*/: break;\n\t\tcase 'h2' /*case 'H2'*/: break;\n\t\tcase 'h3' /*case 'H3'*/: break;\n\t\tcase 'sub' /*case 'Sub'*/: break;\n\t\tcase 'sup' /*case 'Sup'*/: break;\n\t\tcase 'span' /*case 'Span'*/: break;\n\t\tcase 'alignment' /*case 'Alignment'*/:\n\t\t\tbreak;\n\t\tcase 'borders' /*case 'Borders'*/: break;\n\t\tcase 'border' /*case 'Border'*/: break;\n\t\tcase 'font' /*case 'Font'*/:\n\t\t\tif(Rn[0].slice(-2) === \"/>\") break;\n\t\t\telse if(Rn[1]===\"/\") ss += str.slice(fidx, Rn.index);\n\t\t\telse fidx = Rn.index + Rn[0].length;\n\t\t\tbreak;\n\t\tcase 'interior' /*case 'Interior'*/:\n\t\t\tif(!opts.cellStyles) break;\n\t\t\tstag.Interior = xlml_parsexmltag(Rn[0]);\n\t\t\tbreak;\n\t\tcase 'protection' /*case 'Protection'*/: break;\n\n\t\tcase 'author' /*case 'Author'*/:\n\t\tcase 'title' /*case 'Title'*/:\n\t\tcase 'description' /*case 'Description'*/:\n\t\tcase 'created' /*case 'Created'*/:\n\t\tcase 'keywords' /*case 'Keywords'*/:\n\t\tcase 'subject' /*case 'Subject'*/:\n\t\tcase 'category' /*case 'Category'*/:\n\t\tcase 'company' /*case 'Company'*/:\n\t\tcase 'lastauthor' /*case 'LastAuthor'*/:\n\t\tcase 'lastsaved' /*case 'LastSaved'*/:\n\t\tcase 'lastprinted' /*case 'LastPrinted'*/:\n\t\tcase 'version' /*case 'Version'*/:\n\t\tcase 'revision' /*case 'Revision'*/:\n\t\tcase 'totaltime' /*case 'TotalTime'*/:\n\t\tcase 'hyperlinkbase' /*case 'HyperlinkBase'*/:\n\t\tcase 'manager' /*case 'Manager'*/:\n\t\tcase 'contentstatus' /*case 'ContentStatus'*/:\n\t\tcase 'identifier' /*case 'Identifier'*/:\n\t\tcase 'language' /*case 'Language'*/:\n\t\tcase 'appname' /*case 'AppName'*/:\n\t\t\tif(Rn[0].slice(-2) === \"/>\") break;\n\t\t\telse if(Rn[1]===\"/\") xlml_set_prop(Props, raw_Rn3, str.slice(pidx, Rn.index));\n\t\t\telse pidx = Rn.index + Rn[0].length;\n\t\t\tbreak;\n\t\tcase 'paragraphs' /*case 'Paragraphs'*/: break;\n\n\t\tcase 'styles' /*case 'Styles'*/:\n\t\tcase 'workbook' /*case 'Workbook'*/:\n\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));}\n\t\t\telse state.push([Rn[3], false]);\n\t\t\tbreak;\n\n\t\tcase 'comment' /*case 'Comment'*/:\n\t\t\tif(Rn[1]==='/'){\n\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));\n\t\t\t\txlml_clean_comment(comment);\n\t\t\t\tcomments.push(comment);\n\t\t\t} else {\n\t\t\t\tstate.push([Rn[3], false]);\n\t\t\t\ttmp = xlml_parsexmltag(Rn[0]);\n\t\t\t\tcomment = ({a:tmp.Author});\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'autofilter' /*case 'AutoFilter'*/:\n\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));}\n\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') {\n\t\t\t\tvar AutoFilter = xlml_parsexmltag(Rn[0]);\n\t\t\t\tcursheet['!autofilter'] = { ref:rc_to_a1(AutoFilter.Range).replace(/\\$/g,\"\") };\n\t\t\t\tstate.push([Rn[3], true]);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'name' /*case 'Name'*/: break;\n\n\t\tcase 'datavalidation' /*case 'DataValidation'*/:\n\t\t\tif(Rn[1]==='/'){\n\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));\n\t\t\t} else {\n\t\t\t\tif(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'pixelsperinch' /*case 'PixelsPerInch'*/:\n\t\t\tbreak;\n\t\tcase 'componentoptions' /*case 'ComponentOptions'*/:\n\t\tcase 'documentproperties' /*case 'DocumentProperties'*/:\n\t\tcase 'customdocumentproperties' /*case 'CustomDocumentProperties'*/:\n\t\tcase 'officedocumentsettings' /*case 'OfficeDocumentSettings'*/:\n\t\tcase 'pivottable' /*case 'PivotTable'*/:\n\t\tcase 'pivotcache' /*case 'PivotCache'*/:\n\t\tcase 'names' /*case 'Names'*/:\n\t\tcase 'mapinfo' /*case 'MapInfo'*/:\n\t\tcase 'pagebreaks' /*case 'PageBreaks'*/:\n\t\tcase 'querytable' /*case 'QueryTable'*/:\n\t\tcase 'sorting' /*case 'Sorting'*/:\n\t\tcase 'schema' /*case 'Schema'*/: //case 'data' /*case 'data'*/:\n\t\tcase 'conditionalformatting' /*case 'ConditionalFormatting'*/:\n\t\tcase 'smarttagtype' /*case 'SmartTagType'*/:\n\t\tcase 'smarttags' /*case 'SmartTags'*/:\n\t\tcase 'excelworkbook' /*case 'ExcelWorkbook'*/:\n\t\tcase 'workbookoptions' /*case 'WorkbookOptions'*/:\n\t\tcase 'worksheetoptions' /*case 'WorksheetOptions'*/:\n\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));}\n\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);\n\t\t\tbreak;\n\n\t\tcase 'null' /*case 'Null'*/: break;\n\n\t\tdefault:\n\t\t\t/* FODS file root is */\n\t\t\tif(state.length == 0 && Rn[3] == \"document\") return parse_fods(str, opts);\n\t\t\t/* UOS file root is */\n\t\t\tif(state.length == 0 && Rn[3] == \"uof\"/*\"UOF\"*/) return parse_fods(str, opts);\n\n\t\t\tvar seen = true;\n\t\t\tswitch(state[state.length-1][0]) {\n\t\t\t\t/* OfficeDocumentSettings */\n\t\t\t\tcase 'officedocumentsettings' /*case 'OfficeDocumentSettings'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'allowpng' /*case 'AllowPNG'*/: break;\n\t\t\t\t\tcase 'removepersonalinformation' /*case 'RemovePersonalInformation'*/: break;\n\t\t\t\t\tcase 'downloadcomponents' /*case 'DownloadComponents'*/: break;\n\t\t\t\t\tcase 'locationofcomponents' /*case 'LocationOfComponents'*/: break;\n\t\t\t\t\tcase 'colors' /*case 'Colors'*/: break;\n\t\t\t\t\tcase 'color' /*case 'Color'*/: break;\n\t\t\t\t\tcase 'index' /*case 'Index'*/: break;\n\t\t\t\t\tcase 'rgb' /*case 'RGB'*/: break;\n\t\t\t\t\tcase 'targetscreensize' /*case 'TargetScreenSize'*/: break;\n\t\t\t\t\tcase 'readonlyrecommended' /*case 'ReadOnlyRecommended'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* ComponentOptions */\n\t\t\t\tcase 'componentoptions' /*case 'ComponentOptions'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'toolbar' /*case 'Toolbar'*/: break;\n\t\t\t\t\tcase 'hideofficelogo' /*case 'HideOfficeLogo'*/: break;\n\t\t\t\t\tcase 'spreadsheetautofit' /*case 'SpreadsheetAutoFit'*/: break;\n\t\t\t\t\tcase 'label' /*case 'Label'*/: break;\n\t\t\t\t\tcase 'caption' /*case 'Caption'*/: break;\n\t\t\t\t\tcase 'maxheight' /*case 'MaxHeight'*/: break;\n\t\t\t\t\tcase 'maxwidth' /*case 'MaxWidth'*/: break;\n\t\t\t\t\tcase 'nextsheetnumber' /*case 'NextSheetNumber'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* ExcelWorkbook */\n\t\t\t\tcase 'excelworkbook' /*case 'ExcelWorkbook'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'date1904' /*case 'Date1904'*/:\nWorkbook.WBProps.date1904 = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'windowheight' /*case 'WindowHeight'*/: break;\n\t\t\t\t\tcase 'windowwidth' /*case 'WindowWidth'*/: break;\n\t\t\t\t\tcase 'windowtopx' /*case 'WindowTopX'*/: break;\n\t\t\t\t\tcase 'windowtopy' /*case 'WindowTopY'*/: break;\n\t\t\t\t\tcase 'tabratio' /*case 'TabRatio'*/: break;\n\t\t\t\t\tcase 'protectstructure' /*case 'ProtectStructure'*/: break;\n\t\t\t\t\tcase 'protectwindow' /*case 'ProtectWindow'*/: break;\n\t\t\t\t\tcase 'protectwindows' /*case 'ProtectWindows'*/: break;\n\t\t\t\t\tcase 'activesheet' /*case 'ActiveSheet'*/: break;\n\t\t\t\t\tcase 'displayinknotes' /*case 'DisplayInkNotes'*/: break;\n\t\t\t\t\tcase 'firstvisiblesheet' /*case 'FirstVisibleSheet'*/: break;\n\t\t\t\t\tcase 'supbook' /*case 'SupBook'*/: break;\n\t\t\t\t\tcase 'sheetname' /*case 'SheetName'*/: break;\n\t\t\t\t\tcase 'sheetindex' /*case 'SheetIndex'*/: break;\n\t\t\t\t\tcase 'sheetindexfirst' /*case 'SheetIndexFirst'*/: break;\n\t\t\t\t\tcase 'sheetindexlast' /*case 'SheetIndexLast'*/: break;\n\t\t\t\t\tcase 'dll' /*case 'Dll'*/: break;\n\t\t\t\t\tcase 'acceptlabelsinformulas' /*case 'AcceptLabelsInFormulas'*/: break;\n\t\t\t\t\tcase 'donotsavelinkvalues' /*case 'DoNotSaveLinkValues'*/: break;\n\t\t\t\t\tcase 'iteration' /*case 'Iteration'*/: break;\n\t\t\t\t\tcase 'maxiterations' /*case 'MaxIterations'*/: break;\n\t\t\t\t\tcase 'maxchange' /*case 'MaxChange'*/: break;\n\t\t\t\t\tcase 'path' /*case 'Path'*/: break;\n\t\t\t\t\tcase 'xct' /*case 'Xct'*/: break;\n\t\t\t\t\tcase 'count' /*case 'Count'*/: break;\n\t\t\t\t\tcase 'selectedsheets' /*case 'SelectedSheets'*/: break;\n\t\t\t\t\tcase 'calculation' /*case 'Calculation'*/: break;\n\t\t\t\t\tcase 'uncalced' /*case 'Uncalced'*/: break;\n\t\t\t\t\tcase 'startupprompt' /*case 'StartupPrompt'*/: break;\n\t\t\t\t\tcase 'crn' /*case 'Crn'*/: break;\n\t\t\t\t\tcase 'externname' /*case 'ExternName'*/: break;\n\t\t\t\t\tcase 'formula' /*case 'Formula'*/: break;\n\t\t\t\t\tcase 'colfirst' /*case 'ColFirst'*/: break;\n\t\t\t\t\tcase 'collast' /*case 'ColLast'*/: break;\n\t\t\t\t\tcase 'wantadvise' /*case 'WantAdvise'*/: break;\n\t\t\t\t\tcase 'boolean' /*case 'Boolean'*/: break;\n\t\t\t\t\tcase 'error' /*case 'Error'*/: break;\n\t\t\t\t\tcase 'text' /*case 'Text'*/: break;\n\t\t\t\t\tcase 'ole' /*case 'OLE'*/: break;\n\t\t\t\t\tcase 'noautorecover' /*case 'NoAutoRecover'*/: break;\n\t\t\t\t\tcase 'publishobjects' /*case 'PublishObjects'*/: break;\n\t\t\t\t\tcase 'donotcalculatebeforesave' /*case 'DoNotCalculateBeforeSave'*/: break;\n\t\t\t\t\tcase 'number' /*case 'Number'*/: break;\n\t\t\t\t\tcase 'refmoder1c1' /*case 'RefModeR1C1'*/: break;\n\t\t\t\t\tcase 'embedsavesmarttags' /*case 'EmbedSaveSmartTags'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* WorkbookOptions */\n\t\t\t\tcase 'workbookoptions' /*case 'WorkbookOptions'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'owcversion' /*case 'OWCVersion'*/: break;\n\t\t\t\t\tcase 'height' /*case 'Height'*/: break;\n\t\t\t\t\tcase 'width' /*case 'Width'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* WorksheetOptions */\n\t\t\t\tcase 'worksheetoptions' /*case 'WorksheetOptions'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'visible' /*case 'Visible'*/:\n\t\t\t\t\t\tif(Rn[0].slice(-2) === \"/>\"){/* empty */}\n\t\t\t\t\t\telse if(Rn[1]===\"/\") switch(str.slice(pidx, Rn.index)) {\n\t\t\t\t\t\t\tcase \"SheetHidden\": wsprops.Hidden = 1; break;\n\t\t\t\t\t\t\tcase \"SheetVeryHidden\": wsprops.Hidden = 2; break;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse pidx = Rn.index + Rn[0].length;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'header' /*case 'Header'*/:\n\t\t\t\t\t\tif(!cursheet['!margins']) default_margins(cursheet['!margins']={}, 'xlml');\n\t\t\t\t\t\tcursheet['!margins'].header = parsexmltag(Rn[0]).Margin;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'footer' /*case 'Footer'*/:\n\t\t\t\t\t\tif(!cursheet['!margins']) default_margins(cursheet['!margins']={}, 'xlml');\n\t\t\t\t\t\tcursheet['!margins'].footer = parsexmltag(Rn[0]).Margin;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'pagemargins' /*case 'PageMargins'*/:\n\t\t\t\t\t\tvar pagemargins = parsexmltag(Rn[0]);\n\t\t\t\t\t\tif(!cursheet['!margins']) default_margins(cursheet['!margins']={},'xlml');\n\t\t\t\t\t\tif(pagemargins.Top) cursheet['!margins'].top = pagemargins.Top;\n\t\t\t\t\t\tif(pagemargins.Left) cursheet['!margins'].left = pagemargins.Left;\n\t\t\t\t\t\tif(pagemargins.Right) cursheet['!margins'].right = pagemargins.Right;\n\t\t\t\t\t\tif(pagemargins.Bottom) cursheet['!margins'].bottom = pagemargins.Bottom;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'displayrighttoleft' /*case 'DisplayRightToLeft'*/:\n\t\t\t\t\t\tif(!Workbook.Views) Workbook.Views = [];\n\t\t\t\t\t\tif(!Workbook.Views[0]) Workbook.Views[0] = {};\n\t\t\t\t\t\tWorkbook.Views[0].RTL = true;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'freezepanes' /*case 'FreezePanes'*/: break;\n\t\t\t\t\tcase 'frozennosplit' /*case 'FrozenNoSplit'*/: break;\n\n\t\t\t\t\tcase 'splithorizontal' /*case 'SplitHorizontal'*/:\n\t\t\t\t\tcase 'splitvertical' /*case 'SplitVertical'*/:\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'donotdisplaygridlines' /*case 'DoNotDisplayGridlines'*/:\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'activerow' /*case 'ActiveRow'*/: break;\n\t\t\t\t\tcase 'activecol' /*case 'ActiveCol'*/: break;\n\t\t\t\t\tcase 'toprowbottompane' /*case 'TopRowBottomPane'*/: break;\n\t\t\t\t\tcase 'leftcolumnrightpane' /*case 'LeftColumnRightPane'*/: break;\n\n\t\t\t\t\tcase 'unsynced' /*case 'Unsynced'*/: break;\n\t\t\t\t\tcase 'print' /*case 'Print'*/: break;\n\t\t\t\t\tcase 'printerrors' /*case 'PrintErrors'*/: break;\n\t\t\t\t\tcase 'panes' /*case 'Panes'*/: break;\n\t\t\t\t\tcase 'scale' /*case 'Scale'*/: break;\n\t\t\t\t\tcase 'pane' /*case 'Pane'*/: break;\n\t\t\t\t\tcase 'number' /*case 'Number'*/: break;\n\t\t\t\t\tcase 'layout' /*case 'Layout'*/: break;\n\t\t\t\t\tcase 'pagesetup' /*case 'PageSetup'*/: break;\n\t\t\t\t\tcase 'selected' /*case 'Selected'*/: break;\n\t\t\t\t\tcase 'protectobjects' /*case 'ProtectObjects'*/: break;\n\t\t\t\t\tcase 'enableselection' /*case 'EnableSelection'*/: break;\n\t\t\t\t\tcase 'protectscenarios' /*case 'ProtectScenarios'*/: break;\n\t\t\t\t\tcase 'validprinterinfo' /*case 'ValidPrinterInfo'*/: break;\n\t\t\t\t\tcase 'horizontalresolution' /*case 'HorizontalResolution'*/: break;\n\t\t\t\t\tcase 'verticalresolution' /*case 'VerticalResolution'*/: break;\n\t\t\t\t\tcase 'numberofcopies' /*case 'NumberofCopies'*/: break;\n\t\t\t\t\tcase 'activepane' /*case 'ActivePane'*/: break;\n\t\t\t\t\tcase 'toprowvisible' /*case 'TopRowVisible'*/: break;\n\t\t\t\t\tcase 'leftcolumnvisible' /*case 'LeftColumnVisible'*/: break;\n\t\t\t\t\tcase 'fittopage' /*case 'FitToPage'*/: break;\n\t\t\t\t\tcase 'rangeselection' /*case 'RangeSelection'*/: break;\n\t\t\t\t\tcase 'papersizeindex' /*case 'PaperSizeIndex'*/: break;\n\t\t\t\t\tcase 'pagelayoutzoom' /*case 'PageLayoutZoom'*/: break;\n\t\t\t\t\tcase 'pagebreakzoom' /*case 'PageBreakZoom'*/: break;\n\t\t\t\t\tcase 'filteron' /*case 'FilterOn'*/: break;\n\t\t\t\t\tcase 'fitwidth' /*case 'FitWidth'*/: break;\n\t\t\t\t\tcase 'fitheight' /*case 'FitHeight'*/: break;\n\t\t\t\t\tcase 'commentslayout' /*case 'CommentsLayout'*/: break;\n\t\t\t\t\tcase 'zoom' /*case 'Zoom'*/: break;\n\t\t\t\t\tcase 'lefttoright' /*case 'LeftToRight'*/: break;\n\t\t\t\t\tcase 'gridlines' /*case 'Gridlines'*/: break;\n\t\t\t\t\tcase 'allowsort' /*case 'AllowSort'*/: break;\n\t\t\t\t\tcase 'allowfilter' /*case 'AllowFilter'*/: break;\n\t\t\t\t\tcase 'allowinsertrows' /*case 'AllowInsertRows'*/: break;\n\t\t\t\t\tcase 'allowdeleterows' /*case 'AllowDeleteRows'*/: break;\n\t\t\t\t\tcase 'allowinsertcols' /*case 'AllowInsertCols'*/: break;\n\t\t\t\t\tcase 'allowdeletecols' /*case 'AllowDeleteCols'*/: break;\n\t\t\t\t\tcase 'allowinserthyperlinks' /*case 'AllowInsertHyperlinks'*/: break;\n\t\t\t\t\tcase 'allowformatcells' /*case 'AllowFormatCells'*/: break;\n\t\t\t\t\tcase 'allowsizecols' /*case 'AllowSizeCols'*/: break;\n\t\t\t\t\tcase 'allowsizerows' /*case 'AllowSizeRows'*/: break;\n\t\t\t\t\tcase 'nosummaryrowsbelowdetail' /*case 'NoSummaryRowsBelowDetail'*/:\n\t\t\t\t\t\tif(!cursheet[\"!outline\"]) cursheet[\"!outline\"] = {};\n\t\t\t\t\t\tcursheet[\"!outline\"].above = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'tabcolorindex' /*case 'TabColorIndex'*/: break;\n\t\t\t\t\tcase 'donotdisplayheadings' /*case 'DoNotDisplayHeadings'*/: break;\n\t\t\t\t\tcase 'showpagelayoutzoom' /*case 'ShowPageLayoutZoom'*/: break;\n\t\t\t\t\tcase 'nosummarycolumnsrightdetail' /*case 'NoSummaryColumnsRightDetail'*/:\n\t\t\t\t\t\tif(!cursheet[\"!outline\"]) cursheet[\"!outline\"] = {};\n\t\t\t\t\t\tcursheet[\"!outline\"].left = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'blackandwhite' /*case 'BlackAndWhite'*/: break;\n\t\t\t\t\tcase 'donotdisplayzeros' /*case 'DoNotDisplayZeros'*/: break;\n\t\t\t\t\tcase 'displaypagebreak' /*case 'DisplayPageBreak'*/: break;\n\t\t\t\t\tcase 'rowcolheadings' /*case 'RowColHeadings'*/: break;\n\t\t\t\t\tcase 'donotdisplayoutline' /*case 'DoNotDisplayOutline'*/: break;\n\t\t\t\t\tcase 'noorientation' /*case 'NoOrientation'*/: break;\n\t\t\t\t\tcase 'allowusepivottables' /*case 'AllowUsePivotTables'*/: break;\n\t\t\t\t\tcase 'zeroheight' /*case 'ZeroHeight'*/: break;\n\t\t\t\t\tcase 'viewablerange' /*case 'ViewableRange'*/: break;\n\t\t\t\t\tcase 'selection' /*case 'Selection'*/: break;\n\t\t\t\t\tcase 'protectcontents' /*case 'ProtectContents'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* PivotTable */\n\t\t\t\tcase 'pivottable' /*case 'PivotTable'*/: case 'pivotcache' /*case 'PivotCache'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'immediateitemsondrop' /*case 'ImmediateItemsOnDrop'*/: break;\n\t\t\t\t\tcase 'showpagemultipleitemlabel' /*case 'ShowPageMultipleItemLabel'*/: break;\n\t\t\t\t\tcase 'compactrowindent' /*case 'CompactRowIndent'*/: break;\n\t\t\t\t\tcase 'location' /*case 'Location'*/: break;\n\t\t\t\t\tcase 'pivotfield' /*case 'PivotField'*/: break;\n\t\t\t\t\tcase 'orientation' /*case 'Orientation'*/: break;\n\t\t\t\t\tcase 'layoutform' /*case 'LayoutForm'*/: break;\n\t\t\t\t\tcase 'layoutsubtotallocation' /*case 'LayoutSubtotalLocation'*/: break;\n\t\t\t\t\tcase 'layoutcompactrow' /*case 'LayoutCompactRow'*/: break;\n\t\t\t\t\tcase 'position' /*case 'Position'*/: break;\n\t\t\t\t\tcase 'pivotitem' /*case 'PivotItem'*/: break;\n\t\t\t\t\tcase 'datatype' /*case 'DataType'*/: break;\n\t\t\t\t\tcase 'datafield' /*case 'DataField'*/: break;\n\t\t\t\t\tcase 'sourcename' /*case 'SourceName'*/: break;\n\t\t\t\t\tcase 'parentfield' /*case 'ParentField'*/: break;\n\t\t\t\t\tcase 'ptlineitems' /*case 'PTLineItems'*/: break;\n\t\t\t\t\tcase 'ptlineitem' /*case 'PTLineItem'*/: break;\n\t\t\t\t\tcase 'countofsameitems' /*case 'CountOfSameItems'*/: break;\n\t\t\t\t\tcase 'item' /*case 'Item'*/: break;\n\t\t\t\t\tcase 'itemtype' /*case 'ItemType'*/: break;\n\t\t\t\t\tcase 'ptsource' /*case 'PTSource'*/: break;\n\t\t\t\t\tcase 'cacheindex' /*case 'CacheIndex'*/: break;\n\t\t\t\t\tcase 'consolidationreference' /*case 'ConsolidationReference'*/: break;\n\t\t\t\t\tcase 'filename' /*case 'FileName'*/: break;\n\t\t\t\t\tcase 'reference' /*case 'Reference'*/: break;\n\t\t\t\t\tcase 'nocolumngrand' /*case 'NoColumnGrand'*/: break;\n\t\t\t\t\tcase 'norowgrand' /*case 'NoRowGrand'*/: break;\n\t\t\t\t\tcase 'blanklineafteritems' /*case 'BlankLineAfterItems'*/: break;\n\t\t\t\t\tcase 'hidden' /*case 'Hidden'*/: break;\n\t\t\t\t\tcase 'subtotal' /*case 'Subtotal'*/: break;\n\t\t\t\t\tcase 'basefield' /*case 'BaseField'*/: break;\n\t\t\t\t\tcase 'mapchilditems' /*case 'MapChildItems'*/: break;\n\t\t\t\t\tcase 'function' /*case 'Function'*/: break;\n\t\t\t\t\tcase 'refreshonfileopen' /*case 'RefreshOnFileOpen'*/: break;\n\t\t\t\t\tcase 'printsettitles' /*case 'PrintSetTitles'*/: break;\n\t\t\t\t\tcase 'mergelabels' /*case 'MergeLabels'*/: break;\n\t\t\t\t\tcase 'defaultversion' /*case 'DefaultVersion'*/: break;\n\t\t\t\t\tcase 'refreshname' /*case 'RefreshName'*/: break;\n\t\t\t\t\tcase 'refreshdate' /*case 'RefreshDate'*/: break;\n\t\t\t\t\tcase 'refreshdatecopy' /*case 'RefreshDateCopy'*/: break;\n\t\t\t\t\tcase 'versionlastrefresh' /*case 'VersionLastRefresh'*/: break;\n\t\t\t\t\tcase 'versionlastupdate' /*case 'VersionLastUpdate'*/: break;\n\t\t\t\t\tcase 'versionupdateablemin' /*case 'VersionUpdateableMin'*/: break;\n\t\t\t\t\tcase 'versionrefreshablemin' /*case 'VersionRefreshableMin'*/: break;\n\t\t\t\t\tcase 'calculation' /*case 'Calculation'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* PageBreaks */\n\t\t\t\tcase 'pagebreaks' /*case 'PageBreaks'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'colbreaks' /*case 'ColBreaks'*/: break;\n\t\t\t\t\tcase 'colbreak' /*case 'ColBreak'*/: break;\n\t\t\t\t\tcase 'rowbreaks' /*case 'RowBreaks'*/: break;\n\t\t\t\t\tcase 'rowbreak' /*case 'RowBreak'*/: break;\n\t\t\t\t\tcase 'colstart' /*case 'ColStart'*/: break;\n\t\t\t\t\tcase 'colend' /*case 'ColEnd'*/: break;\n\t\t\t\t\tcase 'rowend' /*case 'RowEnd'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* AutoFilter */\n\t\t\t\tcase 'autofilter' /*case 'AutoFilter'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'autofiltercolumn' /*case 'AutoFilterColumn'*/: break;\n\t\t\t\t\tcase 'autofiltercondition' /*case 'AutoFilterCondition'*/: break;\n\t\t\t\t\tcase 'autofilterand' /*case 'AutoFilterAnd'*/: break;\n\t\t\t\t\tcase 'autofilteror' /*case 'AutoFilterOr'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* QueryTable */\n\t\t\t\tcase 'querytable' /*case 'QueryTable'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'id' /*case 'Id'*/: break;\n\t\t\t\t\tcase 'autoformatfont' /*case 'AutoFormatFont'*/: break;\n\t\t\t\t\tcase 'autoformatpattern' /*case 'AutoFormatPattern'*/: break;\n\t\t\t\t\tcase 'querysource' /*case 'QuerySource'*/: break;\n\t\t\t\t\tcase 'querytype' /*case 'QueryType'*/: break;\n\t\t\t\t\tcase 'enableredirections' /*case 'EnableRedirections'*/: break;\n\t\t\t\t\tcase 'refreshedinxl9' /*case 'RefreshedInXl9'*/: break;\n\t\t\t\t\tcase 'urlstring' /*case 'URLString'*/: break;\n\t\t\t\t\tcase 'htmltables' /*case 'HTMLTables'*/: break;\n\t\t\t\t\tcase 'connection' /*case 'Connection'*/: break;\n\t\t\t\t\tcase 'commandtext' /*case 'CommandText'*/: break;\n\t\t\t\t\tcase 'refreshinfo' /*case 'RefreshInfo'*/: break;\n\t\t\t\t\tcase 'notitles' /*case 'NoTitles'*/: break;\n\t\t\t\t\tcase 'nextid' /*case 'NextId'*/: break;\n\t\t\t\t\tcase 'columninfo' /*case 'ColumnInfo'*/: break;\n\t\t\t\t\tcase 'overwritecells' /*case 'OverwriteCells'*/: break;\n\t\t\t\t\tcase 'donotpromptforfile' /*case 'DoNotPromptForFile'*/: break;\n\t\t\t\t\tcase 'textwizardsettings' /*case 'TextWizardSettings'*/: break;\n\t\t\t\t\tcase 'source' /*case 'Source'*/: break;\n\t\t\t\t\tcase 'number' /*case 'Number'*/: break;\n\t\t\t\t\tcase 'decimal' /*case 'Decimal'*/: break;\n\t\t\t\t\tcase 'thousandseparator' /*case 'ThousandSeparator'*/: break;\n\t\t\t\t\tcase 'trailingminusnumbers' /*case 'TrailingMinusNumbers'*/: break;\n\t\t\t\t\tcase 'formatsettings' /*case 'FormatSettings'*/: break;\n\t\t\t\t\tcase 'fieldtype' /*case 'FieldType'*/: break;\n\t\t\t\t\tcase 'delimiters' /*case 'Delimiters'*/: break;\n\t\t\t\t\tcase 'tab' /*case 'Tab'*/: break;\n\t\t\t\t\tcase 'comma' /*case 'Comma'*/: break;\n\t\t\t\t\tcase 'autoformatname' /*case 'AutoFormatName'*/: break;\n\t\t\t\t\tcase 'versionlastedit' /*case 'VersionLastEdit'*/: break;\n\t\t\t\t\tcase 'versionlastrefresh' /*case 'VersionLastRefresh'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\tcase 'datavalidation' /*case 'DataValidation'*/:\n\t\t\t\tswitch(Rn[3]) {\n\t\t\t\t\tcase 'range' /*case 'Range'*/: break;\n\n\t\t\t\t\tcase 'type' /*case 'Type'*/: break;\n\t\t\t\t\tcase 'min' /*case 'Min'*/: break;\n\t\t\t\t\tcase 'max' /*case 'Max'*/: break;\n\t\t\t\t\tcase 'sort' /*case 'Sort'*/: break;\n\t\t\t\t\tcase 'descending' /*case 'Descending'*/: break;\n\t\t\t\t\tcase 'order' /*case 'Order'*/: break;\n\t\t\t\t\tcase 'casesensitive' /*case 'CaseSensitive'*/: break;\n\t\t\t\t\tcase 'value' /*case 'Value'*/: break;\n\t\t\t\t\tcase 'errorstyle' /*case 'ErrorStyle'*/: break;\n\t\t\t\t\tcase 'errormessage' /*case 'ErrorMessage'*/: break;\n\t\t\t\t\tcase 'errortitle' /*case 'ErrorTitle'*/: break;\n\t\t\t\t\tcase 'inputmessage' /*case 'InputMessage'*/: break;\n\t\t\t\t\tcase 'inputtitle' /*case 'InputTitle'*/: break;\n\t\t\t\t\tcase 'combohide' /*case 'ComboHide'*/: break;\n\t\t\t\t\tcase 'inputhide' /*case 'InputHide'*/: break;\n\t\t\t\t\tcase 'condition' /*case 'Condition'*/: break;\n\t\t\t\t\tcase 'qualifier' /*case 'Qualifier'*/: break;\n\t\t\t\t\tcase 'useblank' /*case 'UseBlank'*/: break;\n\t\t\t\t\tcase 'value1' /*case 'Value1'*/: break;\n\t\t\t\t\tcase 'value2' /*case 'Value2'*/: break;\n\t\t\t\t\tcase 'format' /*case 'Format'*/: break;\n\n\t\t\t\t\tcase 'cellrangelist' /*case 'CellRangeList'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\tcase 'sorting' /*case 'Sorting'*/:\n\t\t\t\tcase 'conditionalformatting' /*case 'ConditionalFormatting'*/:\n\t\t\t\tswitch(Rn[3]) {\n\t\t\t\t\tcase 'range' /*case 'Range'*/: break;\n\t\t\t\t\tcase 'type' /*case 'Type'*/: break;\n\t\t\t\t\tcase 'min' /*case 'Min'*/: break;\n\t\t\t\t\tcase 'max' /*case 'Max'*/: break;\n\t\t\t\t\tcase 'sort' /*case 'Sort'*/: break;\n\t\t\t\t\tcase 'descending' /*case 'Descending'*/: break;\n\t\t\t\t\tcase 'order' /*case 'Order'*/: break;\n\t\t\t\t\tcase 'casesensitive' /*case 'CaseSensitive'*/: break;\n\t\t\t\t\tcase 'value' /*case 'Value'*/: break;\n\t\t\t\t\tcase 'errorstyle' /*case 'ErrorStyle'*/: break;\n\t\t\t\t\tcase 'errormessage' /*case 'ErrorMessage'*/: break;\n\t\t\t\t\tcase 'errortitle' /*case 'ErrorTitle'*/: break;\n\t\t\t\t\tcase 'cellrangelist' /*case 'CellRangeList'*/: break;\n\t\t\t\t\tcase 'inputmessage' /*case 'InputMessage'*/: break;\n\t\t\t\t\tcase 'inputtitle' /*case 'InputTitle'*/: break;\n\t\t\t\t\tcase 'combohide' /*case 'ComboHide'*/: break;\n\t\t\t\t\tcase 'inputhide' /*case 'InputHide'*/: break;\n\t\t\t\t\tcase 'condition' /*case 'Condition'*/: break;\n\t\t\t\t\tcase 'qualifier' /*case 'Qualifier'*/: break;\n\t\t\t\t\tcase 'useblank' /*case 'UseBlank'*/: break;\n\t\t\t\t\tcase 'value1' /*case 'Value1'*/: break;\n\t\t\t\t\tcase 'value2' /*case 'Value2'*/: break;\n\t\t\t\t\tcase 'format' /*case 'Format'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* MapInfo (schema) */\n\t\t\t\tcase 'mapinfo' /*case 'MapInfo'*/: case 'schema' /*case 'Schema'*/: case 'data' /*case 'data'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'map' /*case 'Map'*/: break;\n\t\t\t\t\tcase 'entry' /*case 'Entry'*/: break;\n\t\t\t\t\tcase 'range' /*case 'Range'*/: break;\n\t\t\t\t\tcase 'xpath' /*case 'XPath'*/: break;\n\t\t\t\t\tcase 'field' /*case 'Field'*/: break;\n\t\t\t\t\tcase 'xsdtype' /*case 'XSDType'*/: break;\n\t\t\t\t\tcase 'filteron' /*case 'FilterOn'*/: break;\n\t\t\t\t\tcase 'aggregate' /*case 'Aggregate'*/: break;\n\t\t\t\t\tcase 'elementtype' /*case 'ElementType'*/: break;\n\t\t\t\t\tcase 'attributetype' /*case 'AttributeType'*/: break;\n\t\t\t\t/* These are from xsd (XML Schema Definition) */\n\t\t\t\t\tcase 'schema' /*case 'schema'*/:\n\t\t\t\t\tcase 'element' /*case 'element'*/:\n\t\t\t\t\tcase 'complextype' /*case 'complexType'*/:\n\t\t\t\t\tcase 'datatype' /*case 'datatype'*/:\n\t\t\t\t\tcase 'all' /*case 'all'*/:\n\t\t\t\t\tcase 'attribute' /*case 'attribute'*/:\n\t\t\t\t\tcase 'extends' /*case 'extends'*/: break;\n\n\t\t\t\t\tcase 'row' /*case 'row'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* SmartTags (can be anything) */\n\t\t\t\tcase 'smarttags' /*case 'SmartTags'*/: break;\n\n\t\t\t\tdefault: seen = false; break;\n\t\t\t}\n\t\t\tif(seen) break;\n\t\t\t/* CustomDocumentProperties */\n\t\t\tif(Rn[3].match(/!\\[CDATA/)) break;\n\t\t\tif(!state[state.length-1][1]) throw 'Unrecognized tag: ' + Rn[3] + \"|\" + state.join(\"|\");\n\t\t\tif(state[state.length-1][0]===/*'CustomDocumentProperties'*/'customdocumentproperties') {\n\t\t\t\tif(Rn[0].slice(-2) === \"/>\") break;\n\t\t\t\telse if(Rn[1]===\"/\") xlml_set_custprop(Custprops, raw_Rn3, cp, str.slice(pidx, Rn.index));\n\t\t\t\telse { cp = Rn; pidx = Rn.index + Rn[0].length; }\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(opts.WTF) throw 'Unrecognized tag: ' + Rn[3] + \"|\" + state.join(\"|\");\n\t}\n\tvar out = ({});\n\tif(!opts.bookSheets && !opts.bookProps) out.Sheets = sheets;\n\tout.SheetNames = sheetnames;\n\tout.Workbook = Workbook;\n\tout.SSF = SSF.get_table();\n\tout.Props = Props;\n\tout.Custprops = Custprops;\n\treturn out;\n}\n\nfunction parse_xlml(data, opts) {\n\tfix_read_opts(opts=opts||{});\n\tswitch(opts.type||\"base64\") {\n\t\tcase \"base64\": return parse_xlml_xml(Base64.decode(data), opts);\n\t\tcase \"binary\": case \"buffer\": case \"file\": return parse_xlml_xml(data, opts);\n\t\tcase \"array\": return parse_xlml_xml(a2s(data), opts);\n\t}\n}\n\n/* TODO */\nfunction write_props_xlml(wb, opts) {\n\tvar o = [];\n\t/* DocumentProperties */\n\tif(wb.Props) o.push(xlml_write_docprops(wb.Props, opts));\n\t/* CustomDocumentProperties */\n\tif(wb.Custprops) o.push(xlml_write_custprops(wb.Props, wb.Custprops, opts));\n\treturn o.join(\"\");\n}\n/* TODO */\nfunction write_wb_xlml() {\n\t/* OfficeDocumentSettings */\n\t/* ExcelWorkbook */\n\treturn \"\";\n}\n/* TODO */\nfunction write_sty_xlml(wb, opts) {\n\t/* Styles */\n\tvar styles = [''];\n\topts.cellXfs.forEach(function(xf, id) {\n\t\tvar payload = [];\n\t\tpayload.push(writextag('NumberFormat', null, {\"ss:Format\": escapexml(SSF._table[xf.numFmtId])}));\n\n\t\tvar o = {\"ss:ID\": \"s\" + (21+id)};\n\t\tstyles.push(writextag('Style', payload.join(\"\"), o));\n\t});\n\treturn writextag(\"Styles\", styles.join(\"\"));\n}\nfunction write_name_xlml(n) { return writextag(\"NamedRange\", null, {\"ss:Name\": n.Name, \"ss:RefersTo\":\"=\" + a1_to_rc(n.Ref, {r:0,c:0})}); }\nfunction write_names_xlml(wb) {\n\tif(!((wb||{}).Workbook||{}).Names) return \"\";\nvar names = wb.Workbook.Names;\n\tvar out = [];\n\tfor(var i = 0; i < names.length; ++i) {\n\t\tvar n = names[i];\n\t\tif(n.Sheet != null) continue;\n\t\tif(n.Name.match(/^_xlfn\\./)) continue;\n\t\tout.push(write_name_xlml(n));\n\t}\n\treturn writextag(\"Names\", out.join(\"\"));\n}\nfunction write_ws_xlml_names(ws, opts, idx, wb) {\n\tif(!ws) return \"\";\n\tif(!((wb||{}).Workbook||{}).Names) return \"\";\nvar names = wb.Workbook.Names;\n\tvar out = [];\n\tfor(var i = 0; i < names.length; ++i) {\n\t\tvar n = names[i];\n\t\tif(n.Sheet != idx) continue;\n\t\t/*switch(n.Name) {\n\t\t\tcase \"_\": continue;\n\t\t}*/\n\t\tif(n.Name.match(/^_xlfn\\./)) continue;\n\t\tout.push(write_name_xlml(n));\n\t}\n\treturn out.join(\"\");\n}\n/* WorksheetOptions */\nfunction write_ws_xlml_wsopts(ws, opts, idx, wb) {\n\tif(!ws) return \"\";\n\tvar o = [];\n\t/* NOTE: spec technically allows any order, but stick with implied order */\n\n\t/* FitToPage */\n\t/* DoNotDisplayColHeaders */\n\t/* DoNotDisplayRowHeaders */\n\t/* ViewableRange */\n\t/* Selection */\n\t/* GridlineColor */\n\t/* Name */\n\t/* ExcelWorksheetType */\n\t/* IntlMacro */\n\t/* Unsynced */\n\t/* Selected */\n\t/* CodeName */\n\n\tif(ws['!margins']) {\n\t\to.push(\"\");\n\t\tif(ws['!margins'].header) o.push(writextag(\"Header\", null, {'x:Margin':ws['!margins'].header}));\n\t\tif(ws['!margins'].footer) o.push(writextag(\"Footer\", null, {'x:Margin':ws['!margins'].footer}));\n\t\to.push(writextag(\"PageMargins\", null, {\n\t\t\t'x:Bottom': ws['!margins'].bottom || \"0.75\",\n\t\t\t'x:Left': ws['!margins'].left || \"0.7\",\n\t\t\t'x:Right': ws['!margins'].right || \"0.7\",\n\t\t\t'x:Top': ws['!margins'].top || \"0.75\"\n\t\t}));\n\t\to.push(\"\");\n\t}\n\n\t/* PageSetup */\n\t/* DisplayPageBreak */\n\t/* TransitionExpressionEvaluation */\n\t/* TransitionFormulaEntry */\n\t/* Print */\n\t/* Zoom */\n\t/* PageLayoutZoom */\n\t/* PageBreakZoom */\n\t/* ShowPageBreakZoom */\n\t/* DefaultRowHeight */\n\t/* DefaultColumnWidth */\n\t/* StandardWidth */\n\n\tif(wb && wb.Workbook && wb.Workbook.Sheets && wb.Workbook.Sheets[idx]) {\n\t\t/* Visible */\n\t\tif(wb.Workbook.Sheets[idx].Hidden) o.push(writextag(\"Visible\", (wb.Workbook.Sheets[idx].Hidden == 1 ? \"SheetHidden\" : \"SheetVeryHidden\"), {}));\n\t\telse {\n\t\t\t/* Selected */\n\t\t\tfor(var i = 0; i < idx; ++i) if(wb.Workbook.Sheets[i] && !wb.Workbook.Sheets[i].Hidden) break;\n\t\t\tif(i == idx) o.push(\"\");\n\t\t}\n\t}\n\n\t/* LeftColumnVisible */\n\n\tif(((((wb||{}).Workbook||{}).Views||[])[0]||{}).RTL) o.push(\"\");\n\n\t/* GridlineColorIndex */\n\t/* DisplayFormulas */\n\t/* DoNotDisplayGridlines */\n\t/* DoNotDisplayHeadings */\n\t/* DoNotDisplayOutline */\n\t/* ApplyAutomaticOutlineStyles */\n\t/* NoSummaryRowsBelowDetail */\n\t/* NoSummaryColumnsRightDetail */\n\t/* DoNotDisplayZeros */\n\t/* ActiveRow */\n\t/* ActiveColumn */\n\t/* FilterOn */\n\t/* RangeSelection */\n\t/* TopRowVisible */\n\t/* TopRowBottomPane */\n\t/* LeftColumnRightPane */\n\t/* ActivePane */\n\t/* SplitHorizontal */\n\t/* SplitVertical */\n\t/* FreezePanes */\n\t/* FrozenNoSplit */\n\t/* TabColorIndex */\n\t/* Panes */\n\n\t/* NOTE: Password not supported in XLML Format */\n\tif(ws['!protect']) {\n\t\to.push(writetag(\"ProtectContents\", \"True\"));\n\t\tif(ws['!protect'].objects) o.push(writetag(\"ProtectObjects\", \"True\"));\n\t\tif(ws['!protect'].scenarios) o.push(writetag(\"ProtectScenarios\", \"True\"));\n\t\tif(ws['!protect'].selectLockedCells != null && !ws['!protect'].selectLockedCells) o.push(writetag(\"EnableSelection\", \"NoSelection\"));\n\t\telse if(ws['!protect'].selectUnlockedCells != null && !ws['!protect'].selectUnlockedCells) o.push(writetag(\"EnableSelection\", \"UnlockedCells\"));\n\t[\n\t\t[ \"formatCells\", \"AllowFormatCells\" ],\n\t\t[ \"formatColumns\", \"AllowSizeCols\" ],\n\t\t[ \"formatRows\", \"AllowSizeRows\" ],\n\t\t[ \"insertColumns\", \"AllowInsertCols\" ],\n\t\t[ \"insertRows\", \"AllowInsertRows\" ],\n\t\t[ \"insertHyperlinks\", \"AllowInsertHyperlinks\" ],\n\t\t[ \"deleteColumns\", \"AllowDeleteCols\" ],\n\t\t[ \"deleteRows\", \"AllowDeleteRows\" ],\n\t\t[ \"sort\", \"AllowSort\" ],\n\t\t[ \"autoFilter\", \"AllowFilter\" ],\n\t\t[ \"pivotTables\", \"AllowUsePivotTables\" ]\n\t].forEach(function(x) { if(ws['!protect'][x[0]]) o.push(\"<\"+x[1]+\"/>\"); });\n\t}\n\n\tif(o.length == 0) return \"\";\n\treturn writextag(\"WorksheetOptions\", o.join(\"\"), {xmlns:XLMLNS.x});\n}\nfunction write_ws_xlml_comment(comments) {\n\treturn comments.map(function(c) {\n\t\t// TODO: formatted text\n\t\tvar t = xlml_unfixstr(c.t||\"\");\n\t\tvar d =writextag(\"ss:Data\", t, {\"xmlns\":\"http://www.w3.org/TR/REC-html40\"});\n\t\treturn writextag(\"Comment\", d, {\"ss:Author\":c.a});\n\t}).join(\"\");\n}\nfunction write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr){\n\tif(!cell || (cell.v == undefined && cell.f == undefined)) return \"\";\n\n\tvar attr = {};\n\tif(cell.f) attr[\"ss:Formula\"] = \"=\" + escapexml(a1_to_rc(cell.f, addr));\n\tif(cell.F && cell.F.slice(0, ref.length) == ref) {\n\t\tvar end = decode_cell(cell.F.slice(ref.length + 1));\n\t\tattr[\"ss:ArrayRange\"] = \"RC:R\" + (end.r == addr.r ? \"\" : \"[\" + (end.r - addr.r) + \"]\") + \"C\" + (end.c == addr.c ? \"\" : \"[\" + (end.c - addr.c) + \"]\");\n\t}\n\n\tif(cell.l && cell.l.Target) {\n\t\tattr[\"ss:HRef\"] = escapexml(cell.l.Target);\n\t\tif(cell.l.Tooltip) attr[\"x:HRefScreenTip\"] = escapexml(cell.l.Tooltip);\n\t}\n\n\tif(ws['!merges']) {\n\t\tvar marr = ws['!merges'];\n\t\tfor(var mi = 0; mi != marr.length; ++mi) {\n\t\t\tif(marr[mi].s.c != addr.c || marr[mi].s.r != addr.r) continue;\n\t\t\tif(marr[mi].e.c > marr[mi].s.c) attr['ss:MergeAcross'] = marr[mi].e.c - marr[mi].s.c;\n\t\t\tif(marr[mi].e.r > marr[mi].s.r) attr['ss:MergeDown'] = marr[mi].e.r - marr[mi].s.r;\n\t\t}\n\t}\n\n\tvar t = \"\", p = \"\";\n\tswitch(cell.t) {\n\t\tcase 'z': if(!opts.sheetStubs) return \"\"; break;\n\t\tcase 'n': t = 'Number'; p = String(cell.v); break;\n\t\tcase 'b': t = 'Boolean'; p = (cell.v ? \"1\" : \"0\"); break;\n\t\tcase 'e': t = 'Error'; p = BErr[cell.v]; break;\n\t\tcase 'd': t = 'DateTime'; p = new Date(cell.v).toISOString(); if(cell.z == null) cell.z = cell.z || SSF._table[14]; break;\n\t\tcase 's': t = 'String'; p = escapexlml(cell.v||\"\"); break;\n\t}\n\t/* TODO: cell style */\n\tvar os = get_cell_style(opts.cellXfs, cell, opts);\n\tattr[\"ss:StyleID\"] = \"s\" + (21+os);\n\tattr[\"ss:Index\"] = addr.c + 1;\n\tvar _v = (cell.v != null ? p : \"\");\n\tvar m = cell.t == 'z' ? \"\" : ('' + _v + '');\n\n\tif((cell.c||[]).length > 0) m += write_ws_xlml_comment(cell.c);\n\n\treturn writextag(\"Cell\", m, attr);\n}\nfunction write_ws_xlml_row(R, row) {\n\tvar o = '';\n}\n/* TODO */\nfunction write_ws_xlml_table(ws, opts, idx, wb) {\n\tif(!ws['!ref']) return \"\";\n\tvar range = safe_decode_range(ws['!ref']);\n\tvar marr = ws['!merges'] || [], mi = 0;\n\tvar o = [];\n\tif(ws['!cols']) ws['!cols'].forEach(function(n, i) {\n\t\tprocess_col(n);\n\t\tvar w = !!n.width;\n\t\tvar p = col_obj_w(i, n);\n\t\tvar k = {\"ss:Index\":i+1};\n\t\tif(w) k['ss:Width'] = width2px(p.width);\n\t\tif(n.hidden) k['ss:Hidden']=\"1\";\n\t\to.push(writextag(\"Column\",null,k));\n\t});\n\tvar dense = Array.isArray(ws);\n\tfor(var R = range.s.r; R <= range.e.r; ++R) {\n\t\tvar row = [write_ws_xlml_row(R, (ws['!rows']||[])[R])];\n\t\tfor(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\tvar skip = false;\n\t\t\tfor(mi = 0; mi != marr.length; ++mi) {\n\t\t\t\tif(marr[mi].s.c > C) continue;\n\t\t\t\tif(marr[mi].s.r > R) continue;\n\t\t\t\tif(marr[mi].e.c < C) continue;\n\t\t\t\tif(marr[mi].e.r < R) continue;\n\t\t\t\tif(marr[mi].s.c != C || marr[mi].s.r != R) skip = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(skip) continue;\n\t\t\tvar addr = {r:R,c:C};\n\t\t\tvar ref = encode_cell(addr), cell = dense ? (ws[R]||[])[C] : ws[ref];\n\t\t\trow.push(write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr));\n\t\t}\n\t\trow.push(\"\");\n\t\tif(row.length > 2) o.push(row.join(\"\"));\n\t}\n\treturn o.join(\"\");\n}\nfunction write_ws_xlml(idx, opts, wb) {\n\tvar o = [];\n\tvar s = wb.SheetNames[idx];\n\tvar ws = wb.Sheets[s];\n\n\tvar t = ws ? write_ws_xlml_names(ws, opts, idx, wb) : \"\";\n\tif(t.length > 0) o.push(\"\" + t + \"\");\n\n\t/* Table */\n\tt = ws ? write_ws_xlml_table(ws, opts, idx, wb) : \"\";\n\tif(t.length > 0) o.push(\"\" + t + \"
\");\n\n\t/* WorksheetOptions */\n\to.push(write_ws_xlml_wsopts(ws, opts, idx, wb));\n\n\treturn o.join(\"\");\n}\nfunction write_xlml(wb, opts) {\n\tif(!opts) opts = {};\n\tif(!wb.SSF) wb.SSF = SSF.get_table();\n\tif(wb.SSF) {\n\t\tmake_ssf(SSF); SSF.load_table(wb.SSF);\n\t\t// $FlowIgnore\n\t\topts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;\n\t\topts.ssf = wb.SSF;\n\t\topts.cellXfs = [];\n\t\tget_cell_style(opts.cellXfs, {}, {revssf:{\"General\":0}});\n\t}\n\tvar d = [];\n\td.push(write_props_xlml(wb, opts));\n\td.push(write_wb_xlml(wb, opts));\n\td.push(\"\");\n\td.push(\"\");\n\tfor(var i = 0; i < wb.SheetNames.length; ++i)\n\t\td.push(writextag(\"Worksheet\", write_ws_xlml(i, opts, wb), {\"ss:Name\":escapexml(wb.SheetNames[i])}));\n\td[2] = write_sty_xlml(wb, opts);\n\td[3] = write_names_xlml(wb, opts);\n\treturn XML_HEADER + writextag(\"Workbook\", d.join(\"\"), {\n\t\t'xmlns': XLMLNS.ss,\n\t\t'xmlns:o': XLMLNS.o,\n\t\t'xmlns:x': XLMLNS.x,\n\t\t'xmlns:ss': XLMLNS.ss,\n\t\t'xmlns:dt': XLMLNS.dt,\n\t\t'xmlns:html': XLMLNS.html\n\t});\n}\n/* [MS-OLEDS] 2.3.8 CompObjStream */\nfunction parse_compobj(obj) {\n\tvar v = {};\n\tvar o = obj.content;\n/* [MS-OLEDS] 2.3.7 CompObjHeader -- All fields MUST be ignored */\n\to.l = 28;\n\n\tv.AnsiUserType = o.read_shift(0, \"lpstr-ansi\");\n\tv.AnsiClipboardFormat = parse_ClipboardFormatOrAnsiString(o);\n\n\tif(o.length - o.l <= 4) return v;\n\n\tvar m = o.read_shift(4);\n\tif(m == 0 || m > 40) return v;\n\to.l-=4; v.Reserved1 = o.read_shift(0, \"lpstr-ansi\");\n\n\tif(o.length - o.l <= 4) return v;\n\tm = o.read_shift(4);\n\tif(m !== 0x71b239f4) return v;\n\tv.UnicodeClipboardFormat = parse_ClipboardFormatOrUnicodeString(o);\n\n\tm = o.read_shift(4);\n\tif(m == 0 || m > 40) return v;\n\to.l-=4; v.Reserved2 = o.read_shift(0, \"lpwstr\");\n}\n\n/*\n\tContinue logic for:\n\t- 2.4.58 Continue\n\t- 2.4.59 ContinueBigName\n\t- 2.4.60 ContinueFrt\n\t- 2.4.61 ContinueFrt11\n\t- 2.4.62 ContinueFrt12\n*/\nfunction slurp(R, blob, length, opts) {\n\tvar l = length;\n\tvar bufs = [];\n\tvar d = blob.slice(blob.l,blob.l+l);\n\tif(opts && opts.enc && opts.enc.insitu && d.length > 0) switch(R.n) {\n\tcase 'BOF': case 'FilePass': case 'FileLock': case 'InterfaceHdr': case 'RRDInfo': case 'RRDHead': case 'UsrExcl': case 'EOF':\n\t\tbreak;\n\tcase 'BoundSheet8':\n\t\tbreak;\n\tdefault:\n\t\topts.enc.insitu(d);\n\t}\n\tbufs.push(d);\n\tblob.l += l;\n\tvar next = (XLSRecordEnum[__readUInt16LE(blob,blob.l)]);\n\tvar start = 0;\n\twhile(next != null && next.n.slice(0,8) === 'Continue') {\n\t\tl = __readUInt16LE(blob,blob.l+2);\n\t\tstart = blob.l + 4;\n\t\tif(next.n == 'ContinueFrt') start += 4;\n\t\telse if(next.n.slice(0,11) == 'ContinueFrt') {\n\t\t\tstart += 12;\n\t\t}\n\t\td = blob.slice(start,blob.l+4+l);\n\t\tbufs.push(d);\n\t\tblob.l += 4+l;\n\t\tnext = (XLSRecordEnum[__readUInt16LE(blob, blob.l)]);\n\t}\n\tvar b = (bconcat(bufs));\n\tprep_blob(b, 0);\n\tvar ll = 0; b.lens = [];\n\tfor(var j = 0; j < bufs.length; ++j) { b.lens.push(ll); ll += bufs[j].length; }\n\tif(b.length < length) throw \"XLS Record \" + (R && R.n || \"??\") + \" Truncated: \" + b.length + \" < \" + length;\n\treturn R.f(b, b.length, opts);\n}\n\nfunction safe_format_xf(p, opts, date1904) {\n\tif(p.t === 'z') return;\n\tif(!p.XF) return;\n\tvar fmtid = 0;\n\ttry {\n\t\tfmtid = p.z || p.XF.numFmtId || 0;\n\t\tif(opts.cellNF) p.z = SSF._table[fmtid];\n\t} catch(e) { if(opts.WTF) throw e; }\n\tif(!opts || opts.cellText !== false) try {\n\t\tif(p.t === 'e') { p.w = p.w || BErr[p.v]; }\n\t\telse if(fmtid === 0 || fmtid == \"General\") {\n\t\t\tif(p.t === 'n') {\n\t\t\t\tif((p.v|0) === p.v) p.w = SSF._general_int(p.v);\n\t\t\t\telse p.w = SSF._general_num(p.v);\n\t\t\t}\n\t\t\telse p.w = SSF._general(p.v);\n\t\t}\n\t\telse p.w = SSF.format(fmtid,p.v, {date1904:!!date1904, dateNF: opts && opts.dateNF});\n\t} catch(e) { if(opts.WTF) throw e; }\n\tif(opts.cellDates && fmtid && p.t == 'n' && SSF.is_date(SSF._table[fmtid] || String(fmtid))) {\n\t\tvar _d = SSF.parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }\n\t}\n}\n\nfunction make_cell(val, ixfe, t) {\n\treturn ({v:val, ixfe:ixfe, t:t});\n}\n\n// 2.3.2\nfunction parse_workbook(blob, options) {\n\tvar wb = ({opts:{}});\n\tvar Sheets = {};\n\tif(DENSE != null && options.dense == null) options.dense = DENSE;\n\tvar out = ((options.dense ? [] : {}));\n\tvar Directory = {};\n\tvar range = ({});\n\tvar last_formula = null;\n\tvar sst = ([]);\n\tvar cur_sheet = \"\";\n\tvar Preamble = {};\n\tvar lastcell, last_cell = \"\", cc, cmnt, rngC, rngR;\n\tvar sharedf = {};\n\tvar arrayf = [];\n\tvar temp_val;\n\tvar country;\n\tvar XFs = []; /* XF records */\n\tvar palette = [];\n\tvar Workbook = ({ Sheets:[], WBProps:{date1904:false}, Views:[{}] }), wsprops = {};\n\tvar get_rgb = function getrgb(icv) {\n\t\tif(icv < 8) return XLSIcv[icv];\n\t\tif(icv < 64) return palette[icv-8] || XLSIcv[icv];\n\t\treturn XLSIcv[icv];\n\t};\n\tvar process_cell_style = function pcs(cell, line, options) {\n\t\tvar xfd = line.XF.data;\n\t\tif(!xfd || !xfd.patternType || !options || !options.cellStyles) return;\n\t\tline.s = ({});\n\t\tline.s.patternType = xfd.patternType;\n\t\tvar t;\n\t\tif((t = rgb2Hex(get_rgb(xfd.icvFore)))) { line.s.fgColor = {rgb:t}; }\n\t\tif((t = rgb2Hex(get_rgb(xfd.icvBack)))) { line.s.bgColor = {rgb:t}; }\n\t};\n\tvar addcell = function addcell(cell, line, options) {\n\t\tif(file_depth > 1) return;\n\t\tif(options.sheetRows && cell.r >= options.sheetRows) return;\n\t\tif(options.cellStyles && line.XF && line.XF.data) process_cell_style(cell, line, options);\n\t\tdelete line.ixfe; delete line.XF;\n\t\tlastcell = cell;\n\t\tlast_cell = encode_cell(cell);\n\t\tif(!range || !range.s || !range.e) range = {s:{r:0,c:0},e:{r:0,c:0}};\n\t\tif(cell.r < range.s.r) range.s.r = cell.r;\n\t\tif(cell.c < range.s.c) range.s.c = cell.c;\n\t\tif(cell.r + 1 > range.e.r) range.e.r = cell.r + 1;\n\t\tif(cell.c + 1 > range.e.c) range.e.c = cell.c + 1;\n\t\tif(options.cellFormula && line.f) {\n\t\t\tfor(var afi = 0; afi < arrayf.length; ++afi) {\n\t\t\t\tif(arrayf[afi][0].s.c > cell.c || arrayf[afi][0].s.r > cell.r) continue;\n\t\t\t\tif(arrayf[afi][0].e.c < cell.c || arrayf[afi][0].e.r < cell.r) continue;\n\t\t\t\tline.F = encode_range(arrayf[afi][0]);\n\t\t\t\tif(arrayf[afi][0].s.c != cell.c || arrayf[afi][0].s.r != cell.r) delete line.f;\n\t\t\t\tif(line.f) line.f = \"\" + stringify_formula(arrayf[afi][1], range, cell, supbooks, opts);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t{\n\t\t\tif(options.dense) {\n\t\t\t\tif(!out[cell.r]) out[cell.r] = [];\n\t\t\t\tout[cell.r][cell.c] = line;\n\t\t\t} else out[last_cell] = line;\n\t\t}\n\t};\n\tvar opts = ({\n\t\tenc: false, // encrypted\n\t\tsbcch: 0, // cch in the preceding SupBook\n\t\tsnames: [], // sheetnames\n\t\tsharedf: sharedf, // shared formulae by address\n\t\tarrayf: arrayf, // array formulae array\n\t\trrtabid: [], // RRTabId\n\t\tlastuser: \"\", // Last User from WriteAccess\n\t\tbiff: 8, // BIFF version\n\t\tcodepage: 0, // CP from CodePage record\n\t\twinlocked: 0, // fLockWn from WinProtect\n\t\tcellStyles: !!options && !!options.cellStyles,\n\t\tWTF: !!options && !!options.wtf\n\t});\n\tif(options.password) opts.password = options.password;\n\tvar themes;\n\tvar merges = [];\n\tvar objects = [];\n\tvar colinfo = [], rowinfo = [];\n\t// eslint-disable-next-line no-unused-vars\n\tvar defwidth = 0, defheight = 0; // twips / MDW respectively\n\tvar seencol = false;\n\tvar supbooks = ([]); // 1-indexed, will hold extern names\n\tsupbooks.SheetNames = opts.snames;\n\tsupbooks.sharedf = opts.sharedf;\n\tsupbooks.arrayf = opts.arrayf;\n\tsupbooks.names = [];\n\tsupbooks.XTI = [];\n\tvar last_Rn = '';\n\tvar file_depth = 0; /* TODO: make a real stack */\n\tvar BIFF2Fmt = 0, BIFF2FmtTable = [];\n\tvar FilterDatabases = []; /* TODO: sort out supbooks and process elsewhere */\n\tvar last_lbl;\n\n\t/* explicit override for some broken writers */\n\topts.codepage = 1200;\n\tset_cp(1200);\n\tvar seen_codepage = false;\n\twhile(blob.l < blob.length - 1) {\n\t\tvar s = blob.l;\n\t\tvar RecordType = blob.read_shift(2);\n\t\tif(RecordType === 0 && last_Rn === 'EOF') break;\n\t\tvar length = (blob.l === blob.length ? 0 : blob.read_shift(2));\n\t\tvar R = XLSRecordEnum[RecordType];\n\t\t//console.log(RecordType.toString(16), RecordType, R, blob.l, length, blob.length);\n\t\t//if(!R) console.log(blob.slice(blob.l, blob.l + length));\n\t\tif(R && R.f) {\n\t\t\tif(options.bookSheets) {\n\t\t\t\tif(last_Rn === 'BoundSheet8' && R.n !== 'BoundSheet8') break;\n\t\t\t}\n\t\t\tlast_Rn = R.n;\n\t\t\tif(R.r === 2 || R.r == 12) {\n\t\t\t\tvar rt = blob.read_shift(2); length -= 2;\n\t\t\t\tif(!opts.enc && rt !== RecordType && (((rt&0xFF)<<8)|(rt>>8)) !== RecordType) throw new Error(\"rt mismatch: \" + rt + \"!=\" + RecordType);\n\t\t\t\tif(R.r == 12){\n\t\t\t\t\tblob.l += 10; length -= 10;\n\t\t\t\t} // skip FRT\n\t\t\t}\n\t\t\t//console.error(R,blob.l,length,blob.length);\n\t\t\tvar val = ({});\n\t\t\tif(R.n === 'EOF') val = R.f(blob, length, opts);\n\t\t\telse val = slurp(R, blob, length, opts);\n\t\t\tvar Rn = R.n;\nif(file_depth == 0 && Rn != 'BOF') continue;\n\t\t\t/* nested switch statements to workaround V8 128 limit */\n\t\t\tswitch(Rn) {\n\t\t\t\t/* Workbook Options */\n\t\t\t\tcase 'Date1904':\nwb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;\n\t\t\t\tcase 'WriteProtect': wb.opts.WriteProtect = true; break;\n\t\t\t\tcase 'FilePass':\n\t\t\t\t\tif(!opts.enc) blob.l = 0;\n\t\t\t\t\topts.enc = val;\n\t\t\t\t\tif(!options.password) throw new Error(\"File is password-protected\");\n\t\t\t\t\tif(val.valid == null) throw new Error(\"Encryption scheme unsupported\");\n\t\t\t\t\tif(!val.valid) throw new Error(\"Password is incorrect\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'WriteAccess': opts.lastuser = val; break;\n\t\t\t\tcase 'FileSharing': break; //TODO\n\t\t\t\tcase 'CodePage':\n\t\t\t\t\tvar cpval = Number(val);\n\t\t\t\t\t/* overrides based on test cases */\n\t\t\t\t\tswitch(cpval) {\n\t\t\t\t\t\tcase 0x5212: cpval = 1200; break;\n\t\t\t\t\t\tcase 0x8000: cpval = 10000; break;\n\t\t\t\t\t\tcase 0x8001: cpval = 1252; break;\n\t\t\t\t\t}\n\t\t\t\t\tset_cp(opts.codepage = cpval);\n\t\t\t\t\tseen_codepage = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'RRTabId': opts.rrtabid = val; break;\n\t\t\t\tcase 'WinProtect': opts.winlocked = val; break;\n\t\t\t\tcase 'Template': break; // TODO\n\t\t\t\tcase 'BookBool': break; // TODO\n\t\t\t\tcase 'UsesELFs': break;\n\t\t\t\tcase 'MTRSettings': break;\n\t\t\t\tcase 'RefreshAll':\n\t\t\t\tcase 'CalcCount':\n\t\t\t\tcase 'CalcDelta':\n\t\t\t\tcase 'CalcIter':\n\t\t\t\tcase 'CalcMode':\n\t\t\t\tcase 'CalcPrecision':\n\t\t\t\tcase 'CalcSaveRecalc':\n\t\t\t\t\twb.opts[Rn] = val; break;\n\t\t\t\tcase 'CalcRefMode': opts.CalcRefMode = val; break; // TODO: implement R1C1\n\t\t\t\tcase 'Uncalced': break;\n\t\t\t\tcase 'ForceFullCalculation': wb.opts.FullCalc = val; break;\n\t\t\t\tcase 'WsBool':\n\t\t\t\t\tif(val.fDialog) out[\"!type\"] = \"dialog\";\n\t\t\t\t\tif(!val.fBelow) (out[\"!outline\"] || (out[\"!outline\"] = {})).above = true;\n\t\t\t\t\tif(!val.fRight) (out[\"!outline\"] || (out[\"!outline\"] = {})).left = true;\n\t\t\t\t\tbreak; // TODO\n\t\t\t\tcase 'XF':\n\t\t\t\t\tXFs.push(val); break;\n\t\t\t\tcase 'ExtSST': break; // TODO\n\t\t\t\tcase 'BookExt': break; // TODO\n\t\t\t\tcase 'RichTextStream': break;\n\t\t\t\tcase 'BkHim': break;\n\n\t\t\t\tcase 'SupBook':\n\t\t\t\t\tsupbooks.push([val]);\n\t\t\t\t\tsupbooks[supbooks.length-1].XTI = [];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'ExternName':\n\t\t\t\t\tsupbooks[supbooks.length-1].push(val);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Index': break; // TODO\n\t\t\t\tcase 'Lbl':\n\t\t\t\t\tlast_lbl = ({\n\t\t\t\t\t\tName: val.Name,\n\t\t\t\t\t\tRef: stringify_formula(val.rgce,range,null,supbooks,opts)\n\t\t\t\t\t});\n\t\t\t\t\tif(val.itab > 0) last_lbl.Sheet = val.itab - 1;\n\t\t\t\t\tsupbooks.names.push(last_lbl);\n\t\t\t\t\tif(!supbooks[0]) { supbooks[0] = []; supbooks[0].XTI = []; }\n\t\t\t\t\tsupbooks[supbooks.length-1].push(val);\n\t\t\t\t\tif(val.Name == \"_xlnm._FilterDatabase\" && val.itab > 0)\n\t\t\t\t\t\tif(val.rgce && val.rgce[0] && val.rgce[0][0] && val.rgce[0][0][0] == 'PtgArea3d')\n\t\t\t\t\t\t\tFilterDatabases[val.itab - 1] = { ref: encode_range(val.rgce[0][0][1][2]) };\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'ExternCount': opts.ExternCount = val; break;\n\t\t\t\tcase 'ExternSheet':\n\t\t\t\t\tif(supbooks.length == 0) { supbooks[0] = []; supbooks[0].XTI = []; }\n\t\t\t\t\tsupbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val); supbooks.XTI = supbooks.XTI.concat(val); break;\n\t\t\t\tcase 'NameCmt':\n\t\t\t\t\t/* TODO: search for correct name */\n\t\t\t\t\tif(opts.biff < 8) break;\n\t\t\t\t\tif(last_lbl != null) last_lbl.Comment = val[1];\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Protect': out[\"!protect\"] = val; break; /* for sheet or book */\n\t\t\t\tcase 'Password': if(val !== 0 && opts.WTF) console.error(\"Password verifier: \" + val); break;\n\t\t\t\tcase 'Prot4Rev': case 'Prot4RevPass': break; /*TODO: Revision Control*/\n\n\t\t\t\tcase 'BoundSheet8': {\n\t\t\t\t\tDirectory[val.pos] = val;\n\t\t\t\t\topts.snames.push(val.name);\n\t\t\t\t} break;\n\t\t\t\tcase 'EOF': {\n\t\t\t\t\tif(--file_depth) break;\n\t\t\t\t\tif(range.e) {\n\t\t\t\t\t\tif(range.e.r > 0 && range.e.c > 0) {\n\t\t\t\t\t\t\trange.e.r--; range.e.c--;\n\t\t\t\t\t\t\tout[\"!ref\"] = encode_range(range);\n\t\t\t\t\t\t\tif(options.sheetRows && options.sheetRows <= range.e.r) {\n\t\t\t\t\t\t\t\tvar tmpri = range.e.r;\n\t\t\t\t\t\t\t\trange.e.r = options.sheetRows - 1;\n\t\t\t\t\t\t\t\tout[\"!fullref\"] = out[\"!ref\"];\n\t\t\t\t\t\t\t\tout[\"!ref\"] = encode_range(range);\n\t\t\t\t\t\t\t\trange.e.r = tmpri;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\trange.e.r++; range.e.c++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(merges.length > 0) out[\"!merges\"] = merges;\n\t\t\t\t\t\tif(objects.length > 0) out[\"!objects\"] = objects;\n\t\t\t\t\t\tif(colinfo.length > 0) out[\"!cols\"] = colinfo;\n\t\t\t\t\t\tif(rowinfo.length > 0) out[\"!rows\"] = rowinfo;\n\t\t\t\t\t\tWorkbook.Sheets.push(wsprops);\n\t\t\t\t\t}\n\t\t\t\t\tif(cur_sheet === \"\") Preamble = out; else Sheets[cur_sheet] = out;\n\t\t\t\t\tout = ((options.dense ? [] : {}));\n\t\t\t\t} break;\n\t\t\t\tcase 'BOF': {\n\t\t\t\t\tif(opts.biff === 8) opts.biff = {\n0x0009:2,\n0x0209:3,\n0x0409:4\n\t\t\t\t\t}[RecordType] || {\n0x0200:2,\n0x0300:3,\n0x0400:4,\n0x0500:5,\n0x0600:8,\n0x0002:2,\n0x0007:2\n\t\t\t\t\t}[val.BIFFVer] || 8;\n\t\t\t\t\topts.biffguess = val.BIFFVer == 0;\n\t\t\t\t\tif(val.BIFFVer == 0 && val.dt == 0x1000) { opts.biff = 5; seen_codepage = true; set_cp(opts.codepage = 28591); }\n\t\t\t\t\tif(opts.biff == 8 && val.BIFFVer == 0 && val.dt == 16) opts.biff = 2;\n\t\t\t\t\tif(file_depth++) break;\n\t\t\t\t\tout = ((options.dense ? [] : {}));\n\n\t\t\t\t\tif(opts.biff < 8 && !seen_codepage) { seen_codepage = true; set_cp(opts.codepage = options.codepage || 1252); }\n\n\t\t\t\t\tif(opts.biff < 5 || val.BIFFVer == 0 && val.dt == 0x1000) {\n\t\t\t\t\t\tif(cur_sheet === \"\") cur_sheet = \"Sheet1\";\n\t\t\t\t\t\trange = {s:{r:0,c:0},e:{r:0,c:0}};\n\t\t\t\t\t\t/* fake BoundSheet8 */\n\t\t\t\t\t\tvar fakebs8 = {pos: blob.l - length, name:cur_sheet};\n\t\t\t\t\t\tDirectory[fakebs8.pos] = fakebs8;\n\t\t\t\t\t\topts.snames.push(cur_sheet);\n\t\t\t\t\t}\n\t\t\t\t\telse cur_sheet = (Directory[s] || {name:\"\"}).name;\n\t\t\t\t\tif(val.dt == 0x20) out[\"!type\"] = \"chart\";\n\t\t\t\t\tif(val.dt == 0x40) out[\"!type\"] = \"macro\";\n\t\t\t\t\tmerges = [];\n\t\t\t\t\tobjects = [];\n\t\t\t\t\topts.arrayf = arrayf = [];\n\t\t\t\t\tcolinfo = []; rowinfo = [];\n\t\t\t\t\tdefwidth = defheight = 0;\n\t\t\t\t\tseencol = false;\n\t\t\t\t\twsprops = {Hidden:(Directory[s]||{hs:0}).hs, name:cur_sheet };\n\t\t\t\t} break;\n\n\t\t\t\tcase 'Number': case 'BIFF2NUM': case 'BIFF2INT': {\n\t\t\t\t\tif(out[\"!type\"] == \"chart\") if(options.dense ? (out[val.r]||[])[val.c]: out[encode_cell({c:val.c, r:val.r})]) ++val.c;\n\t\t\t\t\ttemp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe]||{}, v:val.val, t:'n'});\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t} break;\n\t\t\t\tcase 'BoolErr': {\n\t\t\t\t\ttemp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.val, t:val.t});\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t} break;\n\t\t\t\tcase 'RK': {\n\t\t\t\t\ttemp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.rknum, t:'n'});\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t} break;\n\t\t\t\tcase 'MulRk': {\n\t\t\t\t\tfor(var j = val.c; j <= val.C; ++j) {\n\t\t\t\t\t\tvar ixfe = val.rkrec[j-val.c][0];\n\t\t\t\t\t\ttemp_val= ({ixfe:ixfe, XF:XFs[ixfe], v:val.rkrec[j-val.c][1], t:'n'});\n\t\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\t\taddcell({c:j, r:val.r}, temp_val, options);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 'Formula': {\n\t\t\t\t\tif(val.val == 'String') { last_formula = val; break; }\n\t\t\t\t\ttemp_val = make_cell(val.val, val.cell.ixfe, val.tt);\n\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\tif(options.cellFormula) {\n\t\t\t\t\t\tvar _f = val.formula;\n\t\t\t\t\t\tif(_f && _f[0] && _f[0][0] && _f[0][0][0] == 'PtgExp') {\n\t\t\t\t\t\t\tvar _fr = _f[0][0][1][0], _fc = _f[0][0][1][1];\n\t\t\t\t\t\t\tvar _fe = encode_cell({r:_fr, c:_fc});\n\t\t\t\t\t\t\tif(sharedf[_fe]) temp_val.f = \"\"+stringify_formula(val.formula,range,val.cell,supbooks, opts);\n\t\t\t\t\t\t\telse temp_val.F = ((options.dense ? (out[_fr]||[])[_fc]: out[_fe]) || {}).F;\n\t\t\t\t\t\t} else temp_val.f = \"\"+stringify_formula(val.formula,range,val.cell,supbooks, opts);\n\t\t\t\t\t}\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell(val.cell, temp_val, options);\n\t\t\t\t\tlast_formula = val;\n\t\t\t\t} break;\n\t\t\t\tcase 'String': {\n\t\t\t\t\tif(last_formula) { /* technically always true */\n\t\t\t\t\t\tlast_formula.val = val;\n\t\t\t\t\t\ttemp_val = make_cell(val, last_formula.cell.ixfe, 's');\n\t\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\t\tif(options.cellFormula) {\n\t\t\t\t\t\t\ttemp_val.f = \"\"+stringify_formula(last_formula.formula, range, last_formula.cell, supbooks, opts);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\t\taddcell(last_formula.cell, temp_val, options);\n\t\t\t\t\t\tlast_formula = null;\n\t\t\t\t\t} else throw new Error(\"String record expects Formula\");\n\t\t\t\t} break;\n\t\t\t\tcase 'Array': {\n\t\t\t\t\tarrayf.push(val);\n\t\t\t\t\tvar _arraystart = encode_cell(val[0].s);\n\t\t\t\t\tcc = options.dense ? (out[val[0].s.r]||[])[val[0].s.c] : out[_arraystart];\n\t\t\t\t\tif(options.cellFormula && cc) {\n\t\t\t\t\t\tif(!last_formula) break; /* technically unreachable */\n\t\t\t\t\t\tif(!_arraystart || !cc) break;\n\t\t\t\t\t\tcc.f = \"\"+stringify_formula(val[1], range, val[0], supbooks, opts);\n\t\t\t\t\t\tcc.F = encode_range(val[0]);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 'ShrFmla': {\n\t\t\t\t\tif(!options.cellFormula) break;\n\t\t\t\t\tif(last_cell) {\n\t\t\t\t\t\t/* TODO: capture range */\n\t\t\t\t\t\tif(!last_formula) break; /* technically unreachable */\n\t\t\t\t\t\tsharedf[encode_cell(last_formula.cell)]= val[0];\n\t\t\t\t\t\tcc = options.dense ? (out[last_formula.cell.r]||[])[last_formula.cell.c] : out[encode_cell(last_formula.cell)];\n\t\t\t\t\t\t(cc||{}).f = \"\"+stringify_formula(val[0], range, lastcell, supbooks, opts);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 'LabelSst':\n\t\t\t\t\ttemp_val=make_cell(sst[val.isst].t, val.ixfe, 's');\n\t\t\t\t\tif(sst[val.isst].h) temp_val.h = sst[val.isst].h;\n\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Blank': if(options.sheetStubs) {\n\t\t\t\t\ttemp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe], t:'z'});\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t} break;\n\t\t\t\tcase 'MulBlank': if(options.sheetStubs) {\n\t\t\t\t\tfor(var _j = val.c; _j <= val.C; ++_j) {\n\t\t\t\t\t\tvar _ixfe = val.ixfe[_j-val.c];\n\t\t\t\t\t\ttemp_val= ({ixfe:_ixfe, XF:XFs[_ixfe], t:'z'});\n\t\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\t\taddcell({c:_j, r:val.r}, temp_val, options);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 'RString':\n\t\t\t\tcase 'Label': case 'BIFF2STR':\n\t\t\t\t\ttemp_val=make_cell(val.val, val.ixfe, 's');\n\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Dimensions': {\n\t\t\t\t\tif(file_depth === 1) range = val; /* TODO: stack */\n\t\t\t\t} break;\n\t\t\t\tcase 'SST': {\n\t\t\t\t\tsst = val;\n\t\t\t\t} break;\n\t\t\t\tcase 'Format': { /* val = [id, fmt] */\n\t\t\t\t\tif(opts.biff == 4) {\n\t\t\t\t\t\tBIFF2FmtTable[BIFF2Fmt++] = val[1];\n\t\t\t\t\t\tfor(var b4idx = 0; b4idx < BIFF2Fmt + 163; ++b4idx) if(SSF._table[b4idx] == val[1]) break;\n\t\t\t\t\t\tif(b4idx >= 163) SSF.load(val[1], BIFF2Fmt + 163);\n\t\t\t\t\t}\n\t\t\t\t\telse SSF.load(val[1], val[0]);\n\t\t\t\t} break;\n\t\t\t\tcase 'BIFF2FORMAT': {\n\t\t\t\t\tBIFF2FmtTable[BIFF2Fmt++] = val;\n\t\t\t\t\tfor(var b2idx = 0; b2idx < BIFF2Fmt + 163; ++b2idx) if(SSF._table[b2idx] == val) break;\n\t\t\t\t\tif(b2idx >= 163) SSF.load(val, BIFF2Fmt + 163);\n\t\t\t\t} break;\n\n\t\t\t\tcase 'MergeCells': merges = merges.concat(val); break;\n\n\t\t\t\tcase 'Obj': objects[val.cmo[0]] = opts.lastobj = val; break;\n\t\t\t\tcase 'TxO': opts.lastobj.TxO = val; break;\n\t\t\t\tcase 'ImData': opts.lastobj.ImData = val; break;\n\n\t\t\t\tcase 'HLink': {\n\t\t\t\t\tfor(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR)\n\t\t\t\t\t\tfor(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC) {\n\t\t\t\t\t\t\tcc = options.dense ? (out[rngR]||[])[rngC] : out[encode_cell({c:rngC,r:rngR})];\n\t\t\t\t\t\t\tif(cc) cc.l = val[1];\n\t\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 'HLinkTooltip': {\n\t\t\t\t\tfor(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR)\n\t\t\t\t\t\tfor(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC) {\n\t\t\t\t\t\t\tcc = options.dense ? (out[rngR]||[])[rngC] : out[encode_cell({c:rngC,r:rngR})];\n\t\t\t\t\t\t\tif(cc && cc.l) cc.l.Tooltip = val[1];\n\t\t\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t\t/* Comments */\n\t\t\t\tcase 'Note': {\n\t\t\t\t\tif(opts.biff <= 5 && opts.biff >= 2) break; /* TODO: BIFF5 */\n\t\t\t\t\tcc = options.dense ? (out[val[0].r]||[])[val[0].c] : out[encode_cell(val[0])];\n\t\t\t\t\tvar noteobj = objects[val[2]];\n\t\t\t\t\tif(!cc) {\n\t\t\t\t\t\tif(options.dense) {\n\t\t\t\t\t\t\tif(!out[val[0].r]) out[val[0].r] = [];\n\t\t\t\t\t\t\tcc = out[val[0].r][val[0].c] = ({t:\"z\"});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcc = out[encode_cell(val[0])] = ({t:\"z\"});\n\t\t\t\t\t\t}\n\t\t\t\t\t\trange.e.r = Math.max(range.e.r, val[0].r);\n\t\t\t\t\t\trange.s.r = Math.min(range.s.r, val[0].r);\n\t\t\t\t\t\trange.e.c = Math.max(range.e.c, val[0].c);\n\t\t\t\t\t\trange.s.c = Math.min(range.s.c, val[0].c);\n\t\t\t\t\t}\n\t\t\t\t\tif(!cc.c) cc.c = [];\n\t\t\t\t\tcmnt = {a:val[1],t:noteobj.TxO.t};\n\t\t\t\t\tcc.c.push(cmnt);\n\t\t\t\t} break;\n\n\t\t\t\tdefault: switch(R.n) { /* nested */\n\t\t\t\tcase 'ClrtClient': break;\n\t\t\t\tcase 'XFExt': update_xfext(XFs[val.ixfe], val.ext); break;\n\n\t\t\t\tcase 'DefColWidth': defwidth = val; break;\n\t\t\t\tcase 'DefaultRowHeight': defheight = val[1]; break; // TODO: flags\n\n\t\t\t\tcase 'ColInfo': {\n\t\t\t\t\tif(!opts.cellStyles) break;\n\t\t\t\t\twhile(val.e >= val.s) {\n\t\t\t\t\t\tcolinfo[val.e--] = { width: val.w/256, level: (val.level || 0), hidden: !!(val.flags & 1) };\n\t\t\t\t\t\tif(!seencol) { seencol = true; find_mdw_colw(val.w/256); }\n\t\t\t\t\t\tprocess_col(colinfo[val.e+1]);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 'Row': {\n\t\t\t\t\tvar rowobj = {};\n\t\t\t\t\tif(val.level != null) { rowinfo[val.r] = rowobj; rowobj.level = val.level; }\n\t\t\t\t\tif(val.hidden) { rowinfo[val.r] = rowobj; rowobj.hidden = true; }\n\t\t\t\t\tif(val.hpt) {\n\t\t\t\t\t\trowinfo[val.r] = rowobj;\n\t\t\t\t\t\trowobj.hpt = val.hpt; rowobj.hpx = pt2px(val.hpt);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\n\t\t\t\tcase 'LeftMargin':\n\t\t\t\tcase 'RightMargin':\n\t\t\t\tcase 'TopMargin':\n\t\t\t\tcase 'BottomMargin':\n\t\t\t\t\tif(!out['!margins']) default_margins(out['!margins'] = {});\n\t\t\t\t\tout['!margins'][Rn.slice(0,-6).toLowerCase()] = val;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Selection': break;\n\n\t\t\t\tcase 'Setup': // TODO\n\t\t\t\t\tif(!out['!margins']) default_margins(out['!margins'] = {});\n\t\t\t\t\tout['!margins'].header = val.header;\n\t\t\t\t\tout['!margins'].footer = val.footer;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Window2': // TODO\n\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\tif(val.RTL) Workbook.Views[0].RTL = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Header': break; // TODO\n\t\t\t\tcase 'Footer': break; // TODO\n\t\t\t\tcase 'HCenter': break; // TODO\n\t\t\t\tcase 'VCenter': break; // TODO\n\t\t\t\tcase 'Pls': break; // TODO\n\t\t\t\tcase 'GCW': break;\n\t\t\t\tcase 'LHRecord': break;\n\t\t\t\tcase 'DBCell': break; // TODO\n\t\t\t\tcase 'EntExU2': break; // TODO\n\t\t\t\tcase 'SxView': break; // TODO\n\t\t\t\tcase 'Sxvd': break; // TODO\n\t\t\t\tcase 'SXVI': break; // TODO\n\t\t\t\tcase 'SXVDEx': break; // TODO\n\t\t\t\tcase 'SxIvd': break; // TODO\n\t\t\t\tcase 'SXString': break; // TODO\n\t\t\t\tcase 'Sync': break;\n\t\t\t\tcase 'Addin': break;\n\t\t\t\tcase 'SXDI': break; // TODO\n\t\t\t\tcase 'SXLI': break; // TODO\n\t\t\t\tcase 'SXEx': break; // TODO\n\t\t\t\tcase 'QsiSXTag': break; // TODO\n\t\t\t\tcase 'Feat': break;\n\t\t\t\tcase 'FeatHdr': case 'FeatHdr11': break;\n\t\t\t\tcase 'Feature11': case 'Feature12': case 'List12': break;\n\t\t\t\tcase 'Country': country = val; break;\n\t\t\t\tcase 'RecalcId': break;\n\t\t\t\tcase 'DxGCol': break; // TODO: htmlify\n\t\t\t\tcase 'Fbi': case 'Fbi2': case 'GelFrame': break;\n\t\t\t\tcase 'Font': break; // TODO\n\t\t\t\tcase 'XFCRC': break; // TODO\n\t\t\t\tcase 'Style': break; // TODO\n\t\t\t\tcase 'StyleExt': break; // TODO\n\t\t\t\tcase 'Palette': palette = val; break;\n\t\t\t\tcase 'Theme': themes = val; break;\n\t\t\t\t/* Protection */\n\t\t\t\tcase 'ScenarioProtect': break;\n\t\t\t\tcase 'ObjProtect': break;\n\n\t\t\t\t/* Conditional Formatting */\n\t\t\t\tcase 'CondFmt12': break;\n\n\t\t\t\t/* Table */\n\t\t\t\tcase 'Table': break; // TODO\n\t\t\t\tcase 'TableStyles': break; // TODO\n\t\t\t\tcase 'TableStyle': break; // TODO\n\t\t\t\tcase 'TableStyleElement': break; // TODO\n\n\t\t\t\t/* PivotTable */\n\t\t\t\tcase 'SXStreamID': break; // TODO\n\t\t\t\tcase 'SXVS': break; // TODO\n\t\t\t\tcase 'DConRef': break; // TODO\n\t\t\t\tcase 'SXAddl': break; // TODO\n\t\t\t\tcase 'DConBin': break; // TODO\n\t\t\t\tcase 'DConName': break; // TODO\n\t\t\t\tcase 'SXPI': break; // TODO\n\t\t\t\tcase 'SxFormat': break; // TODO\n\t\t\t\tcase 'SxSelect': break; // TODO\n\t\t\t\tcase 'SxRule': break; // TODO\n\t\t\t\tcase 'SxFilt': break; // TODO\n\t\t\t\tcase 'SxItm': break; // TODO\n\t\t\t\tcase 'SxDXF': break; // TODO\n\n\t\t\t\t/* Scenario Manager */\n\t\t\t\tcase 'ScenMan': break;\n\n\t\t\t\t/* Data Consolidation */\n\t\t\t\tcase 'DCon': break;\n\n\t\t\t\t/* Watched Cell */\n\t\t\t\tcase 'CellWatch': break;\n\n\t\t\t\t/* Print Settings */\n\t\t\t\tcase 'PrintRowCol': break;\n\t\t\t\tcase 'PrintGrid': break;\n\t\t\t\tcase 'PrintSize': break;\n\n\t\t\t\tcase 'XCT': break;\n\t\t\t\tcase 'CRN': break;\n\n\t\t\t\tcase 'Scl': {\n\t\t\t\t\t//console.log(\"Zoom Level:\", val[0]/val[1],val);\n\t\t\t\t} break;\n\t\t\t\tcase 'SheetExt': {\n\t\t\t\t\t/* empty */\n\t\t\t\t} break;\n\t\t\t\tcase 'SheetExtOptional': {\n\t\t\t\t\t/* empty */\n\t\t\t\t} break;\n\n\t\t\t\t/* VBA */\n\t\t\t\tcase 'ObNoMacros': {\n\t\t\t\t\t/* empty */\n\t\t\t\t} break;\n\t\t\t\tcase 'ObProj': {\n\t\t\t\t\t/* empty */\n\t\t\t\t} break;\n\t\t\t\tcase 'CodeName': {\nif(!cur_sheet) Workbook.WBProps.CodeName = val || \"ThisWorkbook\";\n\t\t\t\t\telse wsprops.CodeName = val || wsprops.name;\n\t\t\t\t} break;\n\t\t\t\tcase 'GUIDTypeLib': {\n\t\t\t\t\t/* empty */\n\t\t\t\t} break;\n\n\t\t\t\tcase 'WOpt': break; // TODO: WTF?\n\t\t\t\tcase 'PhoneticInfo': break;\n\n\t\t\t\tcase 'OleObjectSize': break;\n\n\t\t\t\t/* Differential Formatting */\n\t\t\t\tcase 'DXF': case 'DXFN': case 'DXFN12': case 'DXFN12List': case 'DXFN12NoCB': break;\n\n\t\t\t\t/* Data Validation */\n\t\t\t\tcase 'Dv': case 'DVal': break;\n\n\t\t\t\t/* Data Series */\n\t\t\t\tcase 'BRAI': case 'Series': case 'SeriesText': break;\n\n\t\t\t\t/* Data Connection */\n\t\t\t\tcase 'DConn': break;\n\t\t\t\tcase 'DbOrParamQry': break;\n\t\t\t\tcase 'DBQueryExt': break;\n\n\t\t\t\tcase 'OleDbConn': break;\n\t\t\t\tcase 'ExtString': break;\n\n\t\t\t\t/* Formatting */\n\t\t\t\tcase 'IFmtRecord': break;\n\t\t\t\tcase 'CondFmt': case 'CF': case 'CF12': case 'CFEx': break;\n\n\t\t\t\t/* Explicitly Ignored */\n\t\t\t\tcase 'Excel9File': break;\n\t\t\t\tcase 'Units': break;\n\t\t\t\tcase 'InterfaceHdr': case 'Mms': case 'InterfaceEnd': case 'DSF': break;\n\t\t\t\tcase 'BuiltInFnGroupCount': /* 2.4.30 0x0E or 0x10 but excel 2011 generates 0x11? */ break;\n\t\t\t\t/* View Stuff */\n\t\t\t\tcase 'Window1': case 'HideObj': case 'GridSet': case 'Guts':\n\t\t\t\tcase 'UserBView': case 'UserSViewBegin': case 'UserSViewEnd': break;\n\t\t\t\tcase 'Pane': break;\n\t\t\t\tdefault: switch(R.n) { /* nested */\n\t\t\t\t/* Chart */\n\t\t\t\tcase 'Dat':\n\t\t\t\tcase 'Begin': case 'End':\n\t\t\t\tcase 'StartBlock': case 'EndBlock':\n\t\t\t\tcase 'Frame': case 'Area':\n\t\t\t\tcase 'Axis': case 'AxisLine': case 'Tick': break;\n\t\t\t\tcase 'AxesUsed':\n\t\t\t\tcase 'CrtLayout12': case 'CrtLayout12A': case 'CrtLink': case 'CrtLine': case 'CrtMlFrt': case 'CrtMlFrtContinue': break;\n\t\t\t\tcase 'LineFormat': case 'AreaFormat':\n\t\t\t\tcase 'Chart': case 'Chart3d': case 'Chart3DBarShape': case 'ChartFormat': case 'ChartFrtInfo': break;\n\t\t\t\tcase 'PlotArea': case 'PlotGrowth': break;\n\t\t\t\tcase 'SeriesList': case 'SerParent': case 'SerAuxTrend': break;\n\t\t\t\tcase 'DataFormat': case 'SerToCrt': case 'FontX': break;\n\t\t\t\tcase 'CatSerRange': case 'AxcExt': case 'SerFmt': break;\n\t\t\t\tcase 'ShtProps': break;\n\t\t\t\tcase 'DefaultText': case 'Text': case 'CatLab': break;\n\t\t\t\tcase 'DataLabExtContents': break;\n\t\t\t\tcase 'Legend': case 'LegendException': break;\n\t\t\t\tcase 'Pie': case 'Scatter': break;\n\t\t\t\tcase 'PieFormat': case 'MarkerFormat': break;\n\t\t\t\tcase 'StartObject': case 'EndObject': break;\n\t\t\t\tcase 'AlRuns': case 'ObjectLink': break;\n\t\t\t\tcase 'SIIndex': break;\n\t\t\t\tcase 'AttachedLabel': case 'YMult': break;\n\n\t\t\t\t/* Chart Group */\n\t\t\t\tcase 'Line': case 'Bar': break;\n\t\t\t\tcase 'Surf': break;\n\n\t\t\t\t/* Axis Group */\n\t\t\t\tcase 'AxisParent': break;\n\t\t\t\tcase 'Pos': break;\n\t\t\t\tcase 'ValueRange': break;\n\n\t\t\t\t/* Pivot Chart */\n\t\t\t\tcase 'SXViewEx9': break; // TODO\n\t\t\t\tcase 'SXViewLink': break;\n\t\t\t\tcase 'PivotChartBits': break;\n\t\t\t\tcase 'SBaseRef': break;\n\t\t\t\tcase 'TextPropsStream': break;\n\n\t\t\t\t/* Chart Misc */\n\t\t\t\tcase 'LnExt': break;\n\t\t\t\tcase 'MkrExt': break;\n\t\t\t\tcase 'CrtCoopt': break;\n\n\t\t\t\t/* Query Table */\n\t\t\t\tcase 'Qsi': case 'Qsif': case 'Qsir': case 'QsiSXTag': break;\n\t\t\t\tcase 'TxtQry': break;\n\n\t\t\t\t/* Filter */\n\t\t\t\tcase 'FilterMode': break;\n\t\t\t\tcase 'AutoFilter': case 'AutoFilterInfo': break;\n\t\t\t\tcase 'AutoFilter12': break;\n\t\t\t\tcase 'DropDownObjIds': break;\n\t\t\t\tcase 'Sort': break;\n\t\t\t\tcase 'SortData': break;\n\n\t\t\t\t/* Drawing */\n\t\t\t\tcase 'ShapePropsStream': break;\n\t\t\t\tcase 'MsoDrawing': case 'MsoDrawingGroup': case 'MsoDrawingSelection': break;\n\t\t\t\t/* Pub Stuff */\n\t\t\t\tcase 'WebPub': case 'AutoWebPub': break;\n\n\t\t\t\t/* Print Stuff */\n\t\t\t\tcase 'HeaderFooter': case 'HFPicture': case 'PLV':\n\t\t\t\tcase 'HorizontalPageBreaks': case 'VerticalPageBreaks': break;\n\t\t\t\t/* Behavioral */\n\t\t\t\tcase 'Backup': case 'CompressPictures': case 'Compat12': break;\n\n\t\t\t\t/* Should not Happen */\n\t\t\t\tcase 'Continue': case 'ContinueFrt12': break;\n\n\t\t\t\t/* Future Records */\n\t\t\t\tcase 'FrtFontList': case 'FrtWrapper': break;\n\n\t\t\t\tdefault: switch(R.n) { /* nested */\n\t\t\t\t/* BIFF5 records */\n\t\t\t\tcase 'TabIdConf': case 'Radar': case 'RadarArea': case 'DropBar': case 'Intl': case 'CoordList': case 'SerAuxErrBar': break;\n\n\t\t\t\t/* BIFF2-4 records */\n\t\t\t\tcase 'BIFF2FONTCLR': case 'BIFF2FMTCNT': case 'BIFF2FONTXTRA': break;\n\t\t\t\tcase 'BIFF2XF': case 'BIFF3XF': case 'BIFF4XF': break;\n\t\t\t\tcase 'BIFF2XFINDEX': break;\n\t\t\t\tcase 'BIFF4FMTCNT': case 'BIFF2ROW': case 'BIFF2WINDOW2': break;\n\n\t\t\t\t/* Miscellaneous */\n\t\t\t\tcase 'SCENARIO': case 'DConBin': case 'PicF': case 'DataLabExt':\n\t\t\t\tcase 'Lel': case 'BopPop': case 'BopPopCustom': case 'RealTimeData':\n\t\t\t\tcase 'Name': break;\n\t\t\t\tcase 'LHNGraph': case 'FnGroupName': case 'AddMenu': case 'LPr': break;\n\t\t\t\tcase 'ListObj': case 'ListField': break;\n\t\t\t\tcase 'RRSort': break;\n\t\t\t\tcase 'BigName': break;\n\t\t\t\tcase 'ToolbarHdr': case 'ToolbarEnd': break;\n\t\t\t\tcase 'DDEObjName': break;\n\t\t\t\tcase 'FRTArchId$': break;\n\t\t\t\tdefault: if(options.WTF) throw 'Unrecognized Record ' + R.n;\n\t\t\t}}}}\n\t\t} else blob.l += length;\n\t}\n\twb.SheetNames=keys(Directory).sort(function(a,b) { return Number(a) - Number(b); }).map(function(x){return Directory[x].name;});\n\tif(!options.bookSheets) wb.Sheets=Sheets;\n\tif(!wb.SheetNames.length && Preamble[\"!ref\"]) {\n\t\twb.SheetNames.push(\"Sheet1\");\n\t\t/*jshint -W069 */\n\t\tif(wb.Sheets) wb.Sheets[\"Sheet1\"] = Preamble;\n\t\t/*jshint +W069 */\n\t} else wb.Preamble=Preamble;\n\tif(wb.Sheets) FilterDatabases.forEach(function(r,i) { wb.Sheets[wb.SheetNames[i]]['!autofilter'] = r; });\n\twb.Strings = sst;\n\twb.SSF = SSF.get_table();\n\tif(opts.enc) wb.Encryption = opts.enc;\n\tif(themes) wb.Themes = themes;\n\twb.Metadata = {};\n\tif(country !== undefined) wb.Metadata.Country = country;\n\tif(supbooks.names.length > 0) Workbook.Names = supbooks.names;\n\twb.Workbook = Workbook;\n\treturn wb;\n}\n\n/* TODO: split props*/\nvar PSCLSID = {\n\tSI: \"e0859ff2f94f6810ab9108002b27b3d9\",\n\tDSI: \"02d5cdd59c2e1b10939708002b2cf9ae\",\n\tUDI: \"05d5cdd59c2e1b10939708002b2cf9ae\"\n};\nfunction parse_xls_props(cfb, props, o) {\n\t/* [MS-OSHARED] 2.3.3.2.2 Document Summary Information Property Set */\n\tvar DSI = CFB.find(cfb, '!DocumentSummaryInformation');\n\tif(DSI && DSI.size > 0) try {\n\t\tvar DocSummary = parse_PropertySetStream(DSI, DocSummaryPIDDSI, PSCLSID.DSI);\n\t\tfor(var d in DocSummary) props[d] = DocSummary[d];\n\t} catch(e) {if(o.WTF) throw e;/* empty */}\n\n\t/* [MS-OSHARED] 2.3.3.2.1 Summary Information Property Set*/\n\tvar SI = CFB.find(cfb, '!SummaryInformation');\n\tif(SI && SI.size > 0) try {\n\t\tvar Summary = parse_PropertySetStream(SI, SummaryPIDSI, PSCLSID.SI);\n\t\tfor(var s in Summary) if(props[s] == null) props[s] = Summary[s];\n\t} catch(e) {if(o.WTF) throw e;/* empty */}\n\n\tif(props.HeadingPairs && props.TitlesOfParts) {\n\t\tload_props_pairs(props.HeadingPairs, props.TitlesOfParts, props, o);\n\t\tdelete props.HeadingPairs; delete props.TitlesOfParts;\n\t}\n}\nfunction write_xls_props(wb, cfb) {\n\tvar DSEntries = [], SEntries = [], CEntries = [];\n\tvar i = 0, Keys;\n\tif(wb.Props) {\n\t\tKeys = keys(wb.Props);\n\t\t// $FlowIgnore\n\t\tfor(i = 0; i < Keys.length; ++i) (Object.prototype.hasOwnProperty.call(DocSummaryRE, Keys[i]) ? DSEntries : Object.prototype.hasOwnProperty.call(SummaryRE, Keys[i]) ? SEntries : CEntries).push([Keys[i], wb.Props[Keys[i]]]);\n\t}\n\tif(wb.Custprops) {\n\t\tKeys = keys(wb.Custprops);\n\t\t// $FlowIgnore\n\t\tfor(i = 0; i < Keys.length; ++i) if(!Object.prototype.hasOwnProperty.call((wb.Props||{}), Keys[i])) (Object.prototype.hasOwnProperty.call(DocSummaryRE, Keys[i]) ? DSEntries : Object.prototype.hasOwnProperty.call(SummaryRE, Keys[i]) ? SEntries : CEntries).push([Keys[i], wb.Custprops[Keys[i]]]);\n\t}\n\tvar CEntries2 = [];\n\tfor(i = 0; i < CEntries.length; ++i) {\n\t\tif(XLSPSSkip.indexOf(CEntries[i][0]) > -1) continue;\n\t\tif(CEntries[i][1] == null) continue;\n\t\tCEntries2.push(CEntries[i]);\n\t}\n\tif(SEntries.length) CFB.utils.cfb_add(cfb, \"/\\u0005SummaryInformation\", write_PropertySetStream(SEntries, PSCLSID.SI, SummaryRE, SummaryPIDSI));\n\tif(DSEntries.length || CEntries2.length) CFB.utils.cfb_add(cfb, \"/\\u0005DocumentSummaryInformation\", write_PropertySetStream(DSEntries, PSCLSID.DSI, DocSummaryRE, DocSummaryPIDDSI, CEntries2.length ? CEntries2 : null, PSCLSID.UDI));\n}\n\nfunction parse_xlscfb(cfb, options) {\nif(!options) options = {};\nfix_read_opts(options);\nreset_cp();\nif(options.codepage) set_ansi(options.codepage);\nvar CompObj, WB;\nif(cfb.FullPaths) {\n\tif(CFB.find(cfb, '/encryption')) throw new Error(\"File is password-protected\");\n\tCompObj = CFB.find(cfb, '!CompObj');\n\tWB = CFB.find(cfb, '/Workbook') || CFB.find(cfb, '/Book');\n} else {\n\tswitch(options.type) {\n\t\tcase 'base64': cfb = s2a(Base64.decode(cfb)); break;\n\t\tcase 'binary': cfb = s2a(cfb); break;\n\t\tcase 'buffer': break;\n\t\tcase 'array': if(!Array.isArray(cfb)) cfb = Array.prototype.slice.call(cfb); break;\n\t}\n\tprep_blob(cfb, 0);\n\tWB = ({content: cfb});\n}\nvar WorkbookP;\n\nvar _data;\nif(CompObj) parse_compobj(CompObj);\nif(options.bookProps && !options.bookSheets) WorkbookP = ({});\nelse {\n\tvar T = has_buf ? 'buffer' : 'array';\n\tif(WB && WB.content) WorkbookP = parse_workbook(WB.content, options);\n\t/* Quattro Pro 7-8 */\n\telse if((_data=CFB.find(cfb, 'PerfectOffice_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));\n\t/* Quattro Pro 9 */\n\telse if((_data=CFB.find(cfb, 'NativeContent_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));\n\t/* Works 4 for Mac */\n\telse if((_data=CFB.find(cfb, 'MN0')) && _data.content) throw new Error(\"Unsupported Works 4 for Mac file\");\n\telse throw new Error(\"Cannot find Workbook stream\");\n\tif(options.bookVBA && cfb.FullPaths && CFB.find(cfb, '/_VBA_PROJECT_CUR/VBA/dir')) WorkbookP.vbaraw = make_vba_xls(cfb);\n}\n\nvar props = {};\nif(cfb.FullPaths) parse_xls_props(cfb, props, options);\n\nWorkbookP.Props = WorkbookP.Custprops = props; /* TODO: split up properties */\nif(options.bookFiles) WorkbookP.cfb = cfb;\n/*WorkbookP.CompObjP = CompObjP; // TODO: storage? */\nreturn WorkbookP;\n}\n\n\nfunction write_xlscfb(wb, opts) {\n\tvar o = opts || {};\n\tvar cfb = CFB.utils.cfb_new({root:\"R\"});\n\tvar wbpath = \"/Workbook\";\n\tswitch(o.bookType || \"xls\") {\n\t\tcase \"xls\": o.bookType = \"biff8\";\n\t\t/* falls through */\n\t\tcase \"xla\": if(!o.bookType) o.bookType = \"xla\";\n\t\t/* falls through */\n\t\tcase \"biff8\": wbpath = \"/Workbook\"; o.biff = 8; break;\n\t\tcase \"biff5\": wbpath = \"/Book\"; o.biff = 5; break;\n\t\tdefault: throw new Error(\"invalid type \" + o.bookType + \" for XLS CFB\");\n\t}\n\tCFB.utils.cfb_add(cfb, wbpath, write_biff_buf(wb, o));\n\tif(o.biff == 8 && (wb.Props || wb.Custprops)) write_xls_props(wb, cfb);\n\t// TODO: SI, DSI, CO\n\tif(o.biff == 8 && wb.vbaraw) fill_vba_xls(cfb, CFB.read(wb.vbaraw, {type: typeof wb.vbaraw == \"string\" ? \"binary\" : \"buffer\"}));\n\treturn cfb;\n}\n/* [MS-XLSB] 2.3 Record Enumeration */\nvar XLSBRecordEnum = {\n0x0000: { n:\"BrtRowHdr\", f:parse_BrtRowHdr },\n0x0001: { n:\"BrtCellBlank\", f:parse_BrtCellBlank },\n0x0002: { n:\"BrtCellRk\", f:parse_BrtCellRk },\n0x0003: { n:\"BrtCellError\", f:parse_BrtCellError },\n0x0004: { n:\"BrtCellBool\", f:parse_BrtCellBool },\n0x0005: { n:\"BrtCellReal\", f:parse_BrtCellReal },\n0x0006: { n:\"BrtCellSt\", f:parse_BrtCellSt },\n0x0007: { n:\"BrtCellIsst\", f:parse_BrtCellIsst },\n0x0008: { n:\"BrtFmlaString\", f:parse_BrtFmlaString },\n0x0009: { n:\"BrtFmlaNum\", f:parse_BrtFmlaNum },\n0x000A: { n:\"BrtFmlaBool\", f:parse_BrtFmlaBool },\n0x000B: { n:\"BrtFmlaError\", f:parse_BrtFmlaError },\n0x000C: { n:\"BrtShortBlank\", f:parse_BrtShortBlank },\n0x000D: { n:\"BrtShortRk\", f:parse_BrtShortRk },\n0x000E: { n:\"BrtShortError\", f:parse_BrtShortError },\n0x000F: { n:\"BrtShortBool\", f:parse_BrtShortBool },\n0x0010: { n:\"BrtShortReal\", f:parse_BrtShortReal },\n0x0011: { n:\"BrtShortSt\", f:parse_BrtShortSt },\n0x0012: { n:\"BrtShortIsst\", f:parse_BrtShortIsst },\n0x0013: { n:\"BrtSSTItem\", f:parse_RichStr },\n0x0014: { n:\"BrtPCDIMissing\" },\n0x0015: { n:\"BrtPCDINumber\" },\n0x0016: { n:\"BrtPCDIBoolean\" },\n0x0017: { n:\"BrtPCDIError\" },\n0x0018: { n:\"BrtPCDIString\" },\n0x0019: { n:\"BrtPCDIDatetime\" },\n0x001A: { n:\"BrtPCDIIndex\" },\n0x001B: { n:\"BrtPCDIAMissing\" },\n0x001C: { n:\"BrtPCDIANumber\" },\n0x001D: { n:\"BrtPCDIABoolean\" },\n0x001E: { n:\"BrtPCDIAError\" },\n0x001F: { n:\"BrtPCDIAString\" },\n0x0020: { n:\"BrtPCDIADatetime\" },\n0x0021: { n:\"BrtPCRRecord\" },\n0x0022: { n:\"BrtPCRRecordDt\" },\n0x0023: { n:\"BrtFRTBegin\" },\n0x0024: { n:\"BrtFRTEnd\" },\n0x0025: { n:\"BrtACBegin\" },\n0x0026: { n:\"BrtACEnd\" },\n0x0027: { n:\"BrtName\", f:parse_BrtName },\n0x0028: { n:\"BrtIndexRowBlock\" },\n0x002A: { n:\"BrtIndexBlock\" },\n0x002B: { n:\"BrtFont\", f:parse_BrtFont },\n0x002C: { n:\"BrtFmt\", f:parse_BrtFmt },\n0x002D: { n:\"BrtFill\", f:parse_BrtFill },\n0x002E: { n:\"BrtBorder\", f:parse_BrtBorder },\n0x002F: { n:\"BrtXF\", f:parse_BrtXF },\n0x0030: { n:\"BrtStyle\" },\n0x0031: { n:\"BrtCellMeta\" },\n0x0032: { n:\"BrtValueMeta\" },\n0x0033: { n:\"BrtMdb\" },\n0x0034: { n:\"BrtBeginFmd\" },\n0x0035: { n:\"BrtEndFmd\" },\n0x0036: { n:\"BrtBeginMdx\" },\n0x0037: { n:\"BrtEndMdx\" },\n0x0038: { n:\"BrtBeginMdxTuple\" },\n0x0039: { n:\"BrtEndMdxTuple\" },\n0x003A: { n:\"BrtMdxMbrIstr\" },\n0x003B: { n:\"BrtStr\" },\n0x003C: { n:\"BrtColInfo\", f:parse_ColInfo },\n0x003E: { n:\"BrtCellRString\" },\n0x003F: { n:\"BrtCalcChainItem$\", f:parse_BrtCalcChainItem$ },\n0x0040: { n:\"BrtDVal\", f:parse_BrtDVal },\n0x0041: { n:\"BrtSxvcellNum\" },\n0x0042: { n:\"BrtSxvcellStr\" },\n0x0043: { n:\"BrtSxvcellBool\" },\n0x0044: { n:\"BrtSxvcellErr\" },\n0x0045: { n:\"BrtSxvcellDate\" },\n0x0046: { n:\"BrtSxvcellNil\" },\n0x0080: { n:\"BrtFileVersion\" },\n0x0081: { n:\"BrtBeginSheet\" },\n0x0082: { n:\"BrtEndSheet\" },\n0x0083: { n:\"BrtBeginBook\", f:parsenoop, p:0 },\n0x0084: { n:\"BrtEndBook\" },\n0x0085: { n:\"BrtBeginWsViews\" },\n0x0086: { n:\"BrtEndWsViews\" },\n0x0087: { n:\"BrtBeginBookViews\" },\n0x0088: { n:\"BrtEndBookViews\" },\n0x0089: { n:\"BrtBeginWsView\", f:parse_BrtBeginWsView },\n0x008A: { n:\"BrtEndWsView\" },\n0x008B: { n:\"BrtBeginCsViews\" },\n0x008C: { n:\"BrtEndCsViews\" },\n0x008D: { n:\"BrtBeginCsView\" },\n0x008E: { n:\"BrtEndCsView\" },\n0x008F: { n:\"BrtBeginBundleShs\" },\n0x0090: { n:\"BrtEndBundleShs\" },\n0x0091: { n:\"BrtBeginSheetData\" },\n0x0092: { n:\"BrtEndSheetData\" },\n0x0093: { n:\"BrtWsProp\", f:parse_BrtWsProp },\n0x0094: { n:\"BrtWsDim\", f:parse_BrtWsDim, p:16 },\n0x0097: { n:\"BrtPane\", f:parse_BrtPane },\n0x0098: { n:\"BrtSel\" },\n0x0099: { n:\"BrtWbProp\", f:parse_BrtWbProp },\n0x009A: { n:\"BrtWbFactoid\" },\n0x009B: { n:\"BrtFileRecover\" },\n0x009C: { n:\"BrtBundleSh\", f:parse_BrtBundleSh },\n0x009D: { n:\"BrtCalcProp\" },\n0x009E: { n:\"BrtBookView\" },\n0x009F: { n:\"BrtBeginSst\", f:parse_BrtBeginSst },\n0x00A0: { n:\"BrtEndSst\" },\n0x00A1: { n:\"BrtBeginAFilter\", f:parse_UncheckedRfX },\n0x00A2: { n:\"BrtEndAFilter\" },\n0x00A3: { n:\"BrtBeginFilterColumn\" },\n0x00A4: { n:\"BrtEndFilterColumn\" },\n0x00A5: { n:\"BrtBeginFilters\" },\n0x00A6: { n:\"BrtEndFilters\" },\n0x00A7: { n:\"BrtFilter\" },\n0x00A8: { n:\"BrtColorFilter\" },\n0x00A9: { n:\"BrtIconFilter\" },\n0x00AA: { n:\"BrtTop10Filter\" },\n0x00AB: { n:\"BrtDynamicFilter\" },\n0x00AC: { n:\"BrtBeginCustomFilters\" },\n0x00AD: { n:\"BrtEndCustomFilters\" },\n0x00AE: { n:\"BrtCustomFilter\" },\n0x00AF: { n:\"BrtAFilterDateGroupItem\" },\n0x00B0: { n:\"BrtMergeCell\", f:parse_BrtMergeCell },\n0x00B1: { n:\"BrtBeginMergeCells\" },\n0x00B2: { n:\"BrtEndMergeCells\" },\n0x00B3: { n:\"BrtBeginPivotCacheDef\" },\n0x00B4: { n:\"BrtEndPivotCacheDef\" },\n0x00B5: { n:\"BrtBeginPCDFields\" },\n0x00B6: { n:\"BrtEndPCDFields\" },\n0x00B7: { n:\"BrtBeginPCDField\" },\n0x00B8: { n:\"BrtEndPCDField\" },\n0x00B9: { n:\"BrtBeginPCDSource\" },\n0x00BA: { n:\"BrtEndPCDSource\" },\n0x00BB: { n:\"BrtBeginPCDSRange\" },\n0x00BC: { n:\"BrtEndPCDSRange\" },\n0x00BD: { n:\"BrtBeginPCDFAtbl\" },\n0x00BE: { n:\"BrtEndPCDFAtbl\" },\n0x00BF: { n:\"BrtBeginPCDIRun\" },\n0x00C0: { n:\"BrtEndPCDIRun\" },\n0x00C1: { n:\"BrtBeginPivotCacheRecords\" },\n0x00C2: { n:\"BrtEndPivotCacheRecords\" },\n0x00C3: { n:\"BrtBeginPCDHierarchies\" },\n0x00C4: { n:\"BrtEndPCDHierarchies\" },\n0x00C5: { n:\"BrtBeginPCDHierarchy\" },\n0x00C6: { n:\"BrtEndPCDHierarchy\" },\n0x00C7: { n:\"BrtBeginPCDHFieldsUsage\" },\n0x00C8: { n:\"BrtEndPCDHFieldsUsage\" },\n0x00C9: { n:\"BrtBeginExtConnection\" },\n0x00CA: { n:\"BrtEndExtConnection\" },\n0x00CB: { n:\"BrtBeginECDbProps\" },\n0x00CC: { n:\"BrtEndECDbProps\" },\n0x00CD: { n:\"BrtBeginECOlapProps\" },\n0x00CE: { n:\"BrtEndECOlapProps\" },\n0x00CF: { n:\"BrtBeginPCDSConsol\" },\n0x00D0: { n:\"BrtEndPCDSConsol\" },\n0x00D1: { n:\"BrtBeginPCDSCPages\" },\n0x00D2: { n:\"BrtEndPCDSCPages\" },\n0x00D3: { n:\"BrtBeginPCDSCPage\" },\n0x00D4: { n:\"BrtEndPCDSCPage\" },\n0x00D5: { n:\"BrtBeginPCDSCPItem\" },\n0x00D6: { n:\"BrtEndPCDSCPItem\" },\n0x00D7: { n:\"BrtBeginPCDSCSets\" },\n0x00D8: { n:\"BrtEndPCDSCSets\" },\n0x00D9: { n:\"BrtBeginPCDSCSet\" },\n0x00DA: { n:\"BrtEndPCDSCSet\" },\n0x00DB: { n:\"BrtBeginPCDFGroup\" },\n0x00DC: { n:\"BrtEndPCDFGroup\" },\n0x00DD: { n:\"BrtBeginPCDFGItems\" },\n0x00DE: { n:\"BrtEndPCDFGItems\" },\n0x00DF: { n:\"BrtBeginPCDFGRange\" },\n0x00E0: { n:\"BrtEndPCDFGRange\" },\n0x00E1: { n:\"BrtBeginPCDFGDiscrete\" },\n0x00E2: { n:\"BrtEndPCDFGDiscrete\" },\n0x00E3: { n:\"BrtBeginPCDSDTupleCache\" },\n0x00E4: { n:\"BrtEndPCDSDTupleCache\" },\n0x00E5: { n:\"BrtBeginPCDSDTCEntries\" },\n0x00E6: { n:\"BrtEndPCDSDTCEntries\" },\n0x00E7: { n:\"BrtBeginPCDSDTCEMembers\" },\n0x00E8: { n:\"BrtEndPCDSDTCEMembers\" },\n0x00E9: { n:\"BrtBeginPCDSDTCEMember\" },\n0x00EA: { n:\"BrtEndPCDSDTCEMember\" },\n0x00EB: { n:\"BrtBeginPCDSDTCQueries\" },\n0x00EC: { n:\"BrtEndPCDSDTCQueries\" },\n0x00ED: { n:\"BrtBeginPCDSDTCQuery\" },\n0x00EE: { n:\"BrtEndPCDSDTCQuery\" },\n0x00EF: { n:\"BrtBeginPCDSDTCSets\" },\n0x00F0: { n:\"BrtEndPCDSDTCSets\" },\n0x00F1: { n:\"BrtBeginPCDSDTCSet\" },\n0x00F2: { n:\"BrtEndPCDSDTCSet\" },\n0x00F3: { n:\"BrtBeginPCDCalcItems\" },\n0x00F4: { n:\"BrtEndPCDCalcItems\" },\n0x00F5: { n:\"BrtBeginPCDCalcItem\" },\n0x00F6: { n:\"BrtEndPCDCalcItem\" },\n0x00F7: { n:\"BrtBeginPRule\" },\n0x00F8: { n:\"BrtEndPRule\" },\n0x00F9: { n:\"BrtBeginPRFilters\" },\n0x00FA: { n:\"BrtEndPRFilters\" },\n0x00FB: { n:\"BrtBeginPRFilter\" },\n0x00FC: { n:\"BrtEndPRFilter\" },\n0x00FD: { n:\"BrtBeginPNames\" },\n0x00FE: { n:\"BrtEndPNames\" },\n0x00FF: { n:\"BrtBeginPName\" },\n0x0100: { n:\"BrtEndPName\" },\n0x0101: { n:\"BrtBeginPNPairs\" },\n0x0102: { n:\"BrtEndPNPairs\" },\n0x0103: { n:\"BrtBeginPNPair\" },\n0x0104: { n:\"BrtEndPNPair\" },\n0x0105: { n:\"BrtBeginECWebProps\" },\n0x0106: { n:\"BrtEndECWebProps\" },\n0x0107: { n:\"BrtBeginEcWpTables\" },\n0x0108: { n:\"BrtEndECWPTables\" },\n0x0109: { n:\"BrtBeginECParams\" },\n0x010A: { n:\"BrtEndECParams\" },\n0x010B: { n:\"BrtBeginECParam\" },\n0x010C: { n:\"BrtEndECParam\" },\n0x010D: { n:\"BrtBeginPCDKPIs\" },\n0x010E: { n:\"BrtEndPCDKPIs\" },\n0x010F: { n:\"BrtBeginPCDKPI\" },\n0x0110: { n:\"BrtEndPCDKPI\" },\n0x0111: { n:\"BrtBeginDims\" },\n0x0112: { n:\"BrtEndDims\" },\n0x0113: { n:\"BrtBeginDim\" },\n0x0114: { n:\"BrtEndDim\" },\n0x0115: { n:\"BrtIndexPartEnd\" },\n0x0116: { n:\"BrtBeginStyleSheet\" },\n0x0117: { n:\"BrtEndStyleSheet\" },\n0x0118: { n:\"BrtBeginSXView\" },\n0x0119: { n:\"BrtEndSXVI\" },\n0x011A: { n:\"BrtBeginSXVI\" },\n0x011B: { n:\"BrtBeginSXVIs\" },\n0x011C: { n:\"BrtEndSXVIs\" },\n0x011D: { n:\"BrtBeginSXVD\" },\n0x011E: { n:\"BrtEndSXVD\" },\n0x011F: { n:\"BrtBeginSXVDs\" },\n0x0120: { n:\"BrtEndSXVDs\" },\n0x0121: { n:\"BrtBeginSXPI\" },\n0x0122: { n:\"BrtEndSXPI\" },\n0x0123: { n:\"BrtBeginSXPIs\" },\n0x0124: { n:\"BrtEndSXPIs\" },\n0x0125: { n:\"BrtBeginSXDI\" },\n0x0126: { n:\"BrtEndSXDI\" },\n0x0127: { n:\"BrtBeginSXDIs\" },\n0x0128: { n:\"BrtEndSXDIs\" },\n0x0129: { n:\"BrtBeginSXLI\" },\n0x012A: { n:\"BrtEndSXLI\" },\n0x012B: { n:\"BrtBeginSXLIRws\" },\n0x012C: { n:\"BrtEndSXLIRws\" },\n0x012D: { n:\"BrtBeginSXLICols\" },\n0x012E: { n:\"BrtEndSXLICols\" },\n0x012F: { n:\"BrtBeginSXFormat\" },\n0x0130: { n:\"BrtEndSXFormat\" },\n0x0131: { n:\"BrtBeginSXFormats\" },\n0x0132: { n:\"BrtEndSxFormats\" },\n0x0133: { n:\"BrtBeginSxSelect\" },\n0x0134: { n:\"BrtEndSxSelect\" },\n0x0135: { n:\"BrtBeginISXVDRws\" },\n0x0136: { n:\"BrtEndISXVDRws\" },\n0x0137: { n:\"BrtBeginISXVDCols\" },\n0x0138: { n:\"BrtEndISXVDCols\" },\n0x0139: { n:\"BrtEndSXLocation\" },\n0x013A: { n:\"BrtBeginSXLocation\" },\n0x013B: { n:\"BrtEndSXView\" },\n0x013C: { n:\"BrtBeginSXTHs\" },\n0x013D: { n:\"BrtEndSXTHs\" },\n0x013E: { n:\"BrtBeginSXTH\" },\n0x013F: { n:\"BrtEndSXTH\" },\n0x0140: { n:\"BrtBeginISXTHRws\" },\n0x0141: { n:\"BrtEndISXTHRws\" },\n0x0142: { n:\"BrtBeginISXTHCols\" },\n0x0143: { n:\"BrtEndISXTHCols\" },\n0x0144: { n:\"BrtBeginSXTDMPS\" },\n0x0145: { n:\"BrtEndSXTDMPs\" },\n0x0146: { n:\"BrtBeginSXTDMP\" },\n0x0147: { n:\"BrtEndSXTDMP\" },\n0x0148: { n:\"BrtBeginSXTHItems\" },\n0x0149: { n:\"BrtEndSXTHItems\" },\n0x014A: { n:\"BrtBeginSXTHItem\" },\n0x014B: { n:\"BrtEndSXTHItem\" },\n0x014C: { n:\"BrtBeginMetadata\" },\n0x014D: { n:\"BrtEndMetadata\" },\n0x014E: { n:\"BrtBeginEsmdtinfo\" },\n0x014F: { n:\"BrtMdtinfo\" },\n0x0150: { n:\"BrtEndEsmdtinfo\" },\n0x0151: { n:\"BrtBeginEsmdb\" },\n0x0152: { n:\"BrtEndEsmdb\" },\n0x0153: { n:\"BrtBeginEsfmd\" },\n0x0154: { n:\"BrtEndEsfmd\" },\n0x0155: { n:\"BrtBeginSingleCells\" },\n0x0156: { n:\"BrtEndSingleCells\" },\n0x0157: { n:\"BrtBeginList\" },\n0x0158: { n:\"BrtEndList\" },\n0x0159: { n:\"BrtBeginListCols\" },\n0x015A: { n:\"BrtEndListCols\" },\n0x015B: { n:\"BrtBeginListCol\" },\n0x015C: { n:\"BrtEndListCol\" },\n0x015D: { n:\"BrtBeginListXmlCPr\" },\n0x015E: { n:\"BrtEndListXmlCPr\" },\n0x015F: { n:\"BrtListCCFmla\" },\n0x0160: { n:\"BrtListTrFmla\" },\n0x0161: { n:\"BrtBeginExternals\" },\n0x0162: { n:\"BrtEndExternals\" },\n0x0163: { n:\"BrtSupBookSrc\", f:parse_RelID},\n0x0165: { n:\"BrtSupSelf\" },\n0x0166: { n:\"BrtSupSame\" },\n0x0167: { n:\"BrtSupTabs\" },\n0x0168: { n:\"BrtBeginSupBook\" },\n0x0169: { n:\"BrtPlaceholderName\" },\n0x016A: { n:\"BrtExternSheet\", f:parse_ExternSheet },\n0x016B: { n:\"BrtExternTableStart\" },\n0x016C: { n:\"BrtExternTableEnd\" },\n0x016E: { n:\"BrtExternRowHdr\" },\n0x016F: { n:\"BrtExternCellBlank\" },\n0x0170: { n:\"BrtExternCellReal\" },\n0x0171: { n:\"BrtExternCellBool\" },\n0x0172: { n:\"BrtExternCellError\" },\n0x0173: { n:\"BrtExternCellString\" },\n0x0174: { n:\"BrtBeginEsmdx\" },\n0x0175: { n:\"BrtEndEsmdx\" },\n0x0176: { n:\"BrtBeginMdxSet\" },\n0x0177: { n:\"BrtEndMdxSet\" },\n0x0178: { n:\"BrtBeginMdxMbrProp\" },\n0x0179: { n:\"BrtEndMdxMbrProp\" },\n0x017A: { n:\"BrtBeginMdxKPI\" },\n0x017B: { n:\"BrtEndMdxKPI\" },\n0x017C: { n:\"BrtBeginEsstr\" },\n0x017D: { n:\"BrtEndEsstr\" },\n0x017E: { n:\"BrtBeginPRFItem\" },\n0x017F: { n:\"BrtEndPRFItem\" },\n0x0180: { n:\"BrtBeginPivotCacheIDs\" },\n0x0181: { n:\"BrtEndPivotCacheIDs\" },\n0x0182: { n:\"BrtBeginPivotCacheID\" },\n0x0183: { n:\"BrtEndPivotCacheID\" },\n0x0184: { n:\"BrtBeginISXVIs\" },\n0x0185: { n:\"BrtEndISXVIs\" },\n0x0186: { n:\"BrtBeginColInfos\" },\n0x0187: { n:\"BrtEndColInfos\" },\n0x0188: { n:\"BrtBeginRwBrk\" },\n0x0189: { n:\"BrtEndRwBrk\" },\n0x018A: { n:\"BrtBeginColBrk\" },\n0x018B: { n:\"BrtEndColBrk\" },\n0x018C: { n:\"BrtBrk\" },\n0x018D: { n:\"BrtUserBookView\" },\n0x018E: { n:\"BrtInfo\" },\n0x018F: { n:\"BrtCUsr\" },\n0x0190: { n:\"BrtUsr\" },\n0x0191: { n:\"BrtBeginUsers\" },\n0x0193: { n:\"BrtEOF\" },\n0x0194: { n:\"BrtUCR\" },\n0x0195: { n:\"BrtRRInsDel\" },\n0x0196: { n:\"BrtRREndInsDel\" },\n0x0197: { n:\"BrtRRMove\" },\n0x0198: { n:\"BrtRREndMove\" },\n0x0199: { n:\"BrtRRChgCell\" },\n0x019A: { n:\"BrtRREndChgCell\" },\n0x019B: { n:\"BrtRRHeader\" },\n0x019C: { n:\"BrtRRUserView\" },\n0x019D: { n:\"BrtRRRenSheet\" },\n0x019E: { n:\"BrtRRInsertSh\" },\n0x019F: { n:\"BrtRRDefName\" },\n0x01A0: { n:\"BrtRRNote\" },\n0x01A1: { n:\"BrtRRConflict\" },\n0x01A2: { n:\"BrtRRTQSIF\" },\n0x01A3: { n:\"BrtRRFormat\" },\n0x01A4: { n:\"BrtRREndFormat\" },\n0x01A5: { n:\"BrtRRAutoFmt\" },\n0x01A6: { n:\"BrtBeginUserShViews\" },\n0x01A7: { n:\"BrtBeginUserShView\" },\n0x01A8: { n:\"BrtEndUserShView\" },\n0x01A9: { n:\"BrtEndUserShViews\" },\n0x01AA: { n:\"BrtArrFmla\", f:parse_BrtArrFmla },\n0x01AB: { n:\"BrtShrFmla\", f:parse_BrtShrFmla },\n0x01AC: { n:\"BrtTable\" },\n0x01AD: { n:\"BrtBeginExtConnections\" },\n0x01AE: { n:\"BrtEndExtConnections\" },\n0x01AF: { n:\"BrtBeginPCDCalcMems\" },\n0x01B0: { n:\"BrtEndPCDCalcMems\" },\n0x01B1: { n:\"BrtBeginPCDCalcMem\" },\n0x01B2: { n:\"BrtEndPCDCalcMem\" },\n0x01B3: { n:\"BrtBeginPCDHGLevels\" },\n0x01B4: { n:\"BrtEndPCDHGLevels\" },\n0x01B5: { n:\"BrtBeginPCDHGLevel\" },\n0x01B6: { n:\"BrtEndPCDHGLevel\" },\n0x01B7: { n:\"BrtBeginPCDHGLGroups\" },\n0x01B8: { n:\"BrtEndPCDHGLGroups\" },\n0x01B9: { n:\"BrtBeginPCDHGLGroup\" },\n0x01BA: { n:\"BrtEndPCDHGLGroup\" },\n0x01BB: { n:\"BrtBeginPCDHGLGMembers\" },\n0x01BC: { n:\"BrtEndPCDHGLGMembers\" },\n0x01BD: { n:\"BrtBeginPCDHGLGMember\" },\n0x01BE: { n:\"BrtEndPCDHGLGMember\" },\n0x01BF: { n:\"BrtBeginQSI\" },\n0x01C0: { n:\"BrtEndQSI\" },\n0x01C1: { n:\"BrtBeginQSIR\" },\n0x01C2: { n:\"BrtEndQSIR\" },\n0x01C3: { n:\"BrtBeginDeletedNames\" },\n0x01C4: { n:\"BrtEndDeletedNames\" },\n0x01C5: { n:\"BrtBeginDeletedName\" },\n0x01C6: { n:\"BrtEndDeletedName\" },\n0x01C7: { n:\"BrtBeginQSIFs\" },\n0x01C8: { n:\"BrtEndQSIFs\" },\n0x01C9: { n:\"BrtBeginQSIF\" },\n0x01CA: { n:\"BrtEndQSIF\" },\n0x01CB: { n:\"BrtBeginAutoSortScope\" },\n0x01CC: { n:\"BrtEndAutoSortScope\" },\n0x01CD: { n:\"BrtBeginConditionalFormatting\" },\n0x01CE: { n:\"BrtEndConditionalFormatting\" },\n0x01CF: { n:\"BrtBeginCFRule\" },\n0x01D0: { n:\"BrtEndCFRule\" },\n0x01D1: { n:\"BrtBeginIconSet\" },\n0x01D2: { n:\"BrtEndIconSet\" },\n0x01D3: { n:\"BrtBeginDatabar\" },\n0x01D4: { n:\"BrtEndDatabar\" },\n0x01D5: { n:\"BrtBeginColorScale\" },\n0x01D6: { n:\"BrtEndColorScale\" },\n0x01D7: { n:\"BrtCFVO\" },\n0x01D8: { n:\"BrtExternValueMeta\" },\n0x01D9: { n:\"BrtBeginColorPalette\" },\n0x01DA: { n:\"BrtEndColorPalette\" },\n0x01DB: { n:\"BrtIndexedColor\" },\n0x01DC: { n:\"BrtMargins\", f:parse_BrtMargins },\n0x01DD: { n:\"BrtPrintOptions\" },\n0x01DE: { n:\"BrtPageSetup\" },\n0x01DF: { n:\"BrtBeginHeaderFooter\" },\n0x01E0: { n:\"BrtEndHeaderFooter\" },\n0x01E1: { n:\"BrtBeginSXCrtFormat\" },\n0x01E2: { n:\"BrtEndSXCrtFormat\" },\n0x01E3: { n:\"BrtBeginSXCrtFormats\" },\n0x01E4: { n:\"BrtEndSXCrtFormats\" },\n0x01E5: { n:\"BrtWsFmtInfo\", f:parse_BrtWsFmtInfo },\n0x01E6: { n:\"BrtBeginMgs\" },\n0x01E7: { n:\"BrtEndMGs\" },\n0x01E8: { n:\"BrtBeginMGMaps\" },\n0x01E9: { n:\"BrtEndMGMaps\" },\n0x01EA: { n:\"BrtBeginMG\" },\n0x01EB: { n:\"BrtEndMG\" },\n0x01EC: { n:\"BrtBeginMap\" },\n0x01ED: { n:\"BrtEndMap\" },\n0x01EE: { n:\"BrtHLink\", f:parse_BrtHLink },\n0x01EF: { n:\"BrtBeginDCon\" },\n0x01F0: { n:\"BrtEndDCon\" },\n0x01F1: { n:\"BrtBeginDRefs\" },\n0x01F2: { n:\"BrtEndDRefs\" },\n0x01F3: { n:\"BrtDRef\" },\n0x01F4: { n:\"BrtBeginScenMan\" },\n0x01F5: { n:\"BrtEndScenMan\" },\n0x01F6: { n:\"BrtBeginSct\" },\n0x01F7: { n:\"BrtEndSct\" },\n0x01F8: { n:\"BrtSlc\" },\n0x01F9: { n:\"BrtBeginDXFs\" },\n0x01FA: { n:\"BrtEndDXFs\" },\n0x01FB: { n:\"BrtDXF\" },\n0x01FC: { n:\"BrtBeginTableStyles\" },\n0x01FD: { n:\"BrtEndTableStyles\" },\n0x01FE: { n:\"BrtBeginTableStyle\" },\n0x01FF: { n:\"BrtEndTableStyle\" },\n0x0200: { n:\"BrtTableStyleElement\" },\n0x0201: { n:\"BrtTableStyleClient\" },\n0x0202: { n:\"BrtBeginVolDeps\" },\n0x0203: { n:\"BrtEndVolDeps\" },\n0x0204: { n:\"BrtBeginVolType\" },\n0x0205: { n:\"BrtEndVolType\" },\n0x0206: { n:\"BrtBeginVolMain\" },\n0x0207: { n:\"BrtEndVolMain\" },\n0x0208: { n:\"BrtBeginVolTopic\" },\n0x0209: { n:\"BrtEndVolTopic\" },\n0x020A: { n:\"BrtVolSubtopic\" },\n0x020B: { n:\"BrtVolRef\" },\n0x020C: { n:\"BrtVolNum\" },\n0x020D: { n:\"BrtVolErr\" },\n0x020E: { n:\"BrtVolStr\" },\n0x020F: { n:\"BrtVolBool\" },\n0x0210: { n:\"BrtBeginCalcChain$\" },\n0x0211: { n:\"BrtEndCalcChain$\" },\n0x0212: { n:\"BrtBeginSortState\" },\n0x0213: { n:\"BrtEndSortState\" },\n0x0214: { n:\"BrtBeginSortCond\" },\n0x0215: { n:\"BrtEndSortCond\" },\n0x0216: { n:\"BrtBookProtection\" },\n0x0217: { n:\"BrtSheetProtection\" },\n0x0218: { n:\"BrtRangeProtection\" },\n0x0219: { n:\"BrtPhoneticInfo\" },\n0x021A: { n:\"BrtBeginECTxtWiz\" },\n0x021B: { n:\"BrtEndECTxtWiz\" },\n0x021C: { n:\"BrtBeginECTWFldInfoLst\" },\n0x021D: { n:\"BrtEndECTWFldInfoLst\" },\n0x021E: { n:\"BrtBeginECTwFldInfo\" },\n0x0224: { n:\"BrtFileSharing\" },\n0x0225: { n:\"BrtOleSize\" },\n0x0226: { n:\"BrtDrawing\", f:parse_RelID },\n0x0227: { n:\"BrtLegacyDrawing\" },\n0x0228: { n:\"BrtLegacyDrawingHF\" },\n0x0229: { n:\"BrtWebOpt\" },\n0x022A: { n:\"BrtBeginWebPubItems\" },\n0x022B: { n:\"BrtEndWebPubItems\" },\n0x022C: { n:\"BrtBeginWebPubItem\" },\n0x022D: { n:\"BrtEndWebPubItem\" },\n0x022E: { n:\"BrtBeginSXCondFmt\" },\n0x022F: { n:\"BrtEndSXCondFmt\" },\n0x0230: { n:\"BrtBeginSXCondFmts\" },\n0x0231: { n:\"BrtEndSXCondFmts\" },\n0x0232: { n:\"BrtBkHim\" },\n0x0234: { n:\"BrtColor\" },\n0x0235: { n:\"BrtBeginIndexedColors\" },\n0x0236: { n:\"BrtEndIndexedColors\" },\n0x0239: { n:\"BrtBeginMRUColors\" },\n0x023A: { n:\"BrtEndMRUColors\" },\n0x023C: { n:\"BrtMRUColor\" },\n0x023D: { n:\"BrtBeginDVals\" },\n0x023E: { n:\"BrtEndDVals\" },\n0x0241: { n:\"BrtSupNameStart\" },\n0x0242: { n:\"BrtSupNameValueStart\" },\n0x0243: { n:\"BrtSupNameValueEnd\" },\n0x0244: { n:\"BrtSupNameNum\" },\n0x0245: { n:\"BrtSupNameErr\" },\n0x0246: { n:\"BrtSupNameSt\" },\n0x0247: { n:\"BrtSupNameNil\" },\n0x0248: { n:\"BrtSupNameBool\" },\n0x0249: { n:\"BrtSupNameFmla\" },\n0x024A: { n:\"BrtSupNameBits\" },\n0x024B: { n:\"BrtSupNameEnd\" },\n0x024C: { n:\"BrtEndSupBook\" },\n0x024D: { n:\"BrtCellSmartTagProperty\" },\n0x024E: { n:\"BrtBeginCellSmartTag\" },\n0x024F: { n:\"BrtEndCellSmartTag\" },\n0x0250: { n:\"BrtBeginCellSmartTags\" },\n0x0251: { n:\"BrtEndCellSmartTags\" },\n0x0252: { n:\"BrtBeginSmartTags\" },\n0x0253: { n:\"BrtEndSmartTags\" },\n0x0254: { n:\"BrtSmartTagType\" },\n0x0255: { n:\"BrtBeginSmartTagTypes\" },\n0x0256: { n:\"BrtEndSmartTagTypes\" },\n0x0257: { n:\"BrtBeginSXFilters\" },\n0x0258: { n:\"BrtEndSXFilters\" },\n0x0259: { n:\"BrtBeginSXFILTER\" },\n0x025A: { n:\"BrtEndSXFilter\" },\n0x025B: { n:\"BrtBeginFills\" },\n0x025C: { n:\"BrtEndFills\" },\n0x025D: { n:\"BrtBeginCellWatches\" },\n0x025E: { n:\"BrtEndCellWatches\" },\n0x025F: { n:\"BrtCellWatch\" },\n0x0260: { n:\"BrtBeginCRErrs\" },\n0x0261: { n:\"BrtEndCRErrs\" },\n0x0262: { n:\"BrtCrashRecErr\" },\n0x0263: { n:\"BrtBeginFonts\" },\n0x0264: { n:\"BrtEndFonts\" },\n0x0265: { n:\"BrtBeginBorders\" },\n0x0266: { n:\"BrtEndBorders\" },\n0x0267: { n:\"BrtBeginFmts\" },\n0x0268: { n:\"BrtEndFmts\" },\n0x0269: { n:\"BrtBeginCellXFs\" },\n0x026A: { n:\"BrtEndCellXFs\" },\n0x026B: { n:\"BrtBeginStyles\" },\n0x026C: { n:\"BrtEndStyles\" },\n0x0271: { n:\"BrtBigName\" },\n0x0272: { n:\"BrtBeginCellStyleXFs\" },\n0x0273: { n:\"BrtEndCellStyleXFs\" },\n0x0274: { n:\"BrtBeginComments\" },\n0x0275: { n:\"BrtEndComments\" },\n0x0276: { n:\"BrtBeginCommentAuthors\" },\n0x0277: { n:\"BrtEndCommentAuthors\" },\n0x0278: { n:\"BrtCommentAuthor\", f:parse_BrtCommentAuthor },\n0x0279: { n:\"BrtBeginCommentList\" },\n0x027A: { n:\"BrtEndCommentList\" },\n0x027B: { n:\"BrtBeginComment\", f:parse_BrtBeginComment},\n0x027C: { n:\"BrtEndComment\" },\n0x027D: { n:\"BrtCommentText\", f:parse_BrtCommentText },\n0x027E: { n:\"BrtBeginOleObjects\" },\n0x027F: { n:\"BrtOleObject\" },\n0x0280: { n:\"BrtEndOleObjects\" },\n0x0281: { n:\"BrtBeginSxrules\" },\n0x0282: { n:\"BrtEndSxRules\" },\n0x0283: { n:\"BrtBeginActiveXControls\" },\n0x0284: { n:\"BrtActiveX\" },\n0x0285: { n:\"BrtEndActiveXControls\" },\n0x0286: { n:\"BrtBeginPCDSDTCEMembersSortBy\" },\n0x0288: { n:\"BrtBeginCellIgnoreECs\" },\n0x0289: { n:\"BrtCellIgnoreEC\" },\n0x028A: { n:\"BrtEndCellIgnoreECs\" },\n0x028B: { n:\"BrtCsProp\", f:parse_BrtCsProp },\n0x028C: { n:\"BrtCsPageSetup\" },\n0x028D: { n:\"BrtBeginUserCsViews\" },\n0x028E: { n:\"BrtEndUserCsViews\" },\n0x028F: { n:\"BrtBeginUserCsView\" },\n0x0290: { n:\"BrtEndUserCsView\" },\n0x0291: { n:\"BrtBeginPcdSFCIEntries\" },\n0x0292: { n:\"BrtEndPCDSFCIEntries\" },\n0x0293: { n:\"BrtPCDSFCIEntry\" },\n0x0294: { n:\"BrtBeginListParts\" },\n0x0295: { n:\"BrtListPart\" },\n0x0296: { n:\"BrtEndListParts\" },\n0x0297: { n:\"BrtSheetCalcProp\" },\n0x0298: { n:\"BrtBeginFnGroup\" },\n0x0299: { n:\"BrtFnGroup\" },\n0x029A: { n:\"BrtEndFnGroup\" },\n0x029B: { n:\"BrtSupAddin\" },\n0x029C: { n:\"BrtSXTDMPOrder\" },\n0x029D: { n:\"BrtCsProtection\" },\n0x029F: { n:\"BrtBeginWsSortMap\" },\n0x02A0: { n:\"BrtEndWsSortMap\" },\n0x02A1: { n:\"BrtBeginRRSort\" },\n0x02A2: { n:\"BrtEndRRSort\" },\n0x02A3: { n:\"BrtRRSortItem\" },\n0x02A4: { n:\"BrtFileSharingIso\" },\n0x02A5: { n:\"BrtBookProtectionIso\" },\n0x02A6: { n:\"BrtSheetProtectionIso\" },\n0x02A7: { n:\"BrtCsProtectionIso\" },\n0x02A8: { n:\"BrtRangeProtectionIso\" },\n0x02A9: { n:\"BrtDValList\" },\n0x0400: { n:\"BrtRwDescent\" },\n0x0401: { n:\"BrtKnownFonts\" },\n0x0402: { n:\"BrtBeginSXTupleSet\" },\n0x0403: { n:\"BrtEndSXTupleSet\" },\n0x0404: { n:\"BrtBeginSXTupleSetHeader\" },\n0x0405: { n:\"BrtEndSXTupleSetHeader\" },\n0x0406: { n:\"BrtSXTupleSetHeaderItem\" },\n0x0407: { n:\"BrtBeginSXTupleSetData\" },\n0x0408: { n:\"BrtEndSXTupleSetData\" },\n0x0409: { n:\"BrtBeginSXTupleSetRow\" },\n0x040A: { n:\"BrtEndSXTupleSetRow\" },\n0x040B: { n:\"BrtSXTupleSetRowItem\" },\n0x040C: { n:\"BrtNameExt\" },\n0x040D: { n:\"BrtPCDH14\" },\n0x040E: { n:\"BrtBeginPCDCalcMem14\" },\n0x040F: { n:\"BrtEndPCDCalcMem14\" },\n0x0410: { n:\"BrtSXTH14\" },\n0x0411: { n:\"BrtBeginSparklineGroup\" },\n0x0412: { n:\"BrtEndSparklineGroup\" },\n0x0413: { n:\"BrtSparkline\" },\n0x0414: { n:\"BrtSXDI14\" },\n0x0415: { n:\"BrtWsFmtInfoEx14\" },\n0x0416: { n:\"BrtBeginConditionalFormatting14\" },\n0x0417: { n:\"BrtEndConditionalFormatting14\" },\n0x0418: { n:\"BrtBeginCFRule14\" },\n0x0419: { n:\"BrtEndCFRule14\" },\n0x041A: { n:\"BrtCFVO14\" },\n0x041B: { n:\"BrtBeginDatabar14\" },\n0x041C: { n:\"BrtBeginIconSet14\" },\n0x041D: { n:\"BrtDVal14\", f: parse_BrtDVal14 },\n0x041E: { n:\"BrtBeginDVals14\" },\n0x041F: { n:\"BrtColor14\" },\n0x0420: { n:\"BrtBeginSparklines\" },\n0x0421: { n:\"BrtEndSparklines\" },\n0x0422: { n:\"BrtBeginSparklineGroups\" },\n0x0423: { n:\"BrtEndSparklineGroups\" },\n0x0425: { n:\"BrtSXVD14\" },\n0x0426: { n:\"BrtBeginSXView14\" },\n0x0427: { n:\"BrtEndSXView14\" },\n0x0428: { n:\"BrtBeginSXView16\" },\n0x0429: { n:\"BrtEndSXView16\" },\n0x042A: { n:\"BrtBeginPCD14\" },\n0x042B: { n:\"BrtEndPCD14\" },\n0x042C: { n:\"BrtBeginExtConn14\" },\n0x042D: { n:\"BrtEndExtConn14\" },\n0x042E: { n:\"BrtBeginSlicerCacheIDs\" },\n0x042F: { n:\"BrtEndSlicerCacheIDs\" },\n0x0430: { n:\"BrtBeginSlicerCacheID\" },\n0x0431: { n:\"BrtEndSlicerCacheID\" },\n0x0433: { n:\"BrtBeginSlicerCache\" },\n0x0434: { n:\"BrtEndSlicerCache\" },\n0x0435: { n:\"BrtBeginSlicerCacheDef\" },\n0x0436: { n:\"BrtEndSlicerCacheDef\" },\n0x0437: { n:\"BrtBeginSlicersEx\" },\n0x0438: { n:\"BrtEndSlicersEx\" },\n0x0439: { n:\"BrtBeginSlicerEx\" },\n0x043A: { n:\"BrtEndSlicerEx\" },\n0x043B: { n:\"BrtBeginSlicer\" },\n0x043C: { n:\"BrtEndSlicer\" },\n0x043D: { n:\"BrtSlicerCachePivotTables\" },\n0x043E: { n:\"BrtBeginSlicerCacheOlapImpl\" },\n0x043F: { n:\"BrtEndSlicerCacheOlapImpl\" },\n0x0440: { n:\"BrtBeginSlicerCacheLevelsData\" },\n0x0441: { n:\"BrtEndSlicerCacheLevelsData\" },\n0x0442: { n:\"BrtBeginSlicerCacheLevelData\" },\n0x0443: { n:\"BrtEndSlicerCacheLevelData\" },\n0x0444: { n:\"BrtBeginSlicerCacheSiRanges\" },\n0x0445: { n:\"BrtEndSlicerCacheSiRanges\" },\n0x0446: { n:\"BrtBeginSlicerCacheSiRange\" },\n0x0447: { n:\"BrtEndSlicerCacheSiRange\" },\n0x0448: { n:\"BrtSlicerCacheOlapItem\" },\n0x0449: { n:\"BrtBeginSlicerCacheSelections\" },\n0x044A: { n:\"BrtSlicerCacheSelection\" },\n0x044B: { n:\"BrtEndSlicerCacheSelections\" },\n0x044C: { n:\"BrtBeginSlicerCacheNative\" },\n0x044D: { n:\"BrtEndSlicerCacheNative\" },\n0x044E: { n:\"BrtSlicerCacheNativeItem\" },\n0x044F: { n:\"BrtRangeProtection14\" },\n0x0450: { n:\"BrtRangeProtectionIso14\" },\n0x0451: { n:\"BrtCellIgnoreEC14\" },\n0x0457: { n:\"BrtList14\" },\n0x0458: { n:\"BrtCFIcon\" },\n0x0459: { n:\"BrtBeginSlicerCachesPivotCacheIDs\" },\n0x045A: { n:\"BrtEndSlicerCachesPivotCacheIDs\" },\n0x045B: { n:\"BrtBeginSlicers\" },\n0x045C: { n:\"BrtEndSlicers\" },\n0x045D: { n:\"BrtWbProp14\" },\n0x045E: { n:\"BrtBeginSXEdit\" },\n0x045F: { n:\"BrtEndSXEdit\" },\n0x0460: { n:\"BrtBeginSXEdits\" },\n0x0461: { n:\"BrtEndSXEdits\" },\n0x0462: { n:\"BrtBeginSXChange\" },\n0x0463: { n:\"BrtEndSXChange\" },\n0x0464: { n:\"BrtBeginSXChanges\" },\n0x0465: { n:\"BrtEndSXChanges\" },\n0x0466: { n:\"BrtSXTupleItems\" },\n0x0468: { n:\"BrtBeginSlicerStyle\" },\n0x0469: { n:\"BrtEndSlicerStyle\" },\n0x046A: { n:\"BrtSlicerStyleElement\" },\n0x046B: { n:\"BrtBeginStyleSheetExt14\" },\n0x046C: { n:\"BrtEndStyleSheetExt14\" },\n0x046D: { n:\"BrtBeginSlicerCachesPivotCacheID\" },\n0x046E: { n:\"BrtEndSlicerCachesPivotCacheID\" },\n0x046F: { n:\"BrtBeginConditionalFormattings\" },\n0x0470: { n:\"BrtEndConditionalFormattings\" },\n0x0471: { n:\"BrtBeginPCDCalcMemExt\" },\n0x0472: { n:\"BrtEndPCDCalcMemExt\" },\n0x0473: { n:\"BrtBeginPCDCalcMemsExt\" },\n0x0474: { n:\"BrtEndPCDCalcMemsExt\" },\n0x0475: { n:\"BrtPCDField14\" },\n0x0476: { n:\"BrtBeginSlicerStyles\" },\n0x0477: { n:\"BrtEndSlicerStyles\" },\n0x0478: { n:\"BrtBeginSlicerStyleElements\" },\n0x0479: { n:\"BrtEndSlicerStyleElements\" },\n0x047A: { n:\"BrtCFRuleExt\" },\n0x047B: { n:\"BrtBeginSXCondFmt14\" },\n0x047C: { n:\"BrtEndSXCondFmt14\" },\n0x047D: { n:\"BrtBeginSXCondFmts14\" },\n0x047E: { n:\"BrtEndSXCondFmts14\" },\n0x0480: { n:\"BrtBeginSortCond14\" },\n0x0481: { n:\"BrtEndSortCond14\" },\n0x0482: { n:\"BrtEndDVals14\" },\n0x0483: { n:\"BrtEndIconSet14\" },\n0x0484: { n:\"BrtEndDatabar14\" },\n0x0485: { n:\"BrtBeginColorScale14\" },\n0x0486: { n:\"BrtEndColorScale14\" },\n0x0487: { n:\"BrtBeginSxrules14\" },\n0x0488: { n:\"BrtEndSxrules14\" },\n0x0489: { n:\"BrtBeginPRule14\" },\n0x048A: { n:\"BrtEndPRule14\" },\n0x048B: { n:\"BrtBeginPRFilters14\" },\n0x048C: { n:\"BrtEndPRFilters14\" },\n0x048D: { n:\"BrtBeginPRFilter14\" },\n0x048E: { n:\"BrtEndPRFilter14\" },\n0x048F: { n:\"BrtBeginPRFItem14\" },\n0x0490: { n:\"BrtEndPRFItem14\" },\n0x0491: { n:\"BrtBeginCellIgnoreECs14\" },\n0x0492: { n:\"BrtEndCellIgnoreECs14\" },\n0x0493: { n:\"BrtDxf14\" },\n0x0494: { n:\"BrtBeginDxF14s\" },\n0x0495: { n:\"BrtEndDxf14s\" },\n0x0499: { n:\"BrtFilter14\" },\n0x049A: { n:\"BrtBeginCustomFilters14\" },\n0x049C: { n:\"BrtCustomFilter14\" },\n0x049D: { n:\"BrtIconFilter14\" },\n0x049E: { n:\"BrtPivotCacheConnectionName\" },\n0x0800: { n:\"BrtBeginDecoupledPivotCacheIDs\" },\n0x0801: { n:\"BrtEndDecoupledPivotCacheIDs\" },\n0x0802: { n:\"BrtDecoupledPivotCacheID\" },\n0x0803: { n:\"BrtBeginPivotTableRefs\" },\n0x0804: { n:\"BrtEndPivotTableRefs\" },\n0x0805: { n:\"BrtPivotTableRef\" },\n0x0806: { n:\"BrtSlicerCacheBookPivotTables\" },\n0x0807: { n:\"BrtBeginSxvcells\" },\n0x0808: { n:\"BrtEndSxvcells\" },\n0x0809: { n:\"BrtBeginSxRow\" },\n0x080A: { n:\"BrtEndSxRow\" },\n0x080C: { n:\"BrtPcdCalcMem15\" },\n0x0813: { n:\"BrtQsi15\" },\n0x0814: { n:\"BrtBeginWebExtensions\" },\n0x0815: { n:\"BrtEndWebExtensions\" },\n0x0816: { n:\"BrtWebExtension\" },\n0x0817: { n:\"BrtAbsPath15\" },\n0x0818: { n:\"BrtBeginPivotTableUISettings\" },\n0x0819: { n:\"BrtEndPivotTableUISettings\" },\n0x081B: { n:\"BrtTableSlicerCacheIDs\" },\n0x081C: { n:\"BrtTableSlicerCacheID\" },\n0x081D: { n:\"BrtBeginTableSlicerCache\" },\n0x081E: { n:\"BrtEndTableSlicerCache\" },\n0x081F: { n:\"BrtSxFilter15\" },\n0x0820: { n:\"BrtBeginTimelineCachePivotCacheIDs\" },\n0x0821: { n:\"BrtEndTimelineCachePivotCacheIDs\" },\n0x0822: { n:\"BrtTimelineCachePivotCacheID\" },\n0x0823: { n:\"BrtBeginTimelineCacheIDs\" },\n0x0824: { n:\"BrtEndTimelineCacheIDs\" },\n0x0825: { n:\"BrtBeginTimelineCacheID\" },\n0x0826: { n:\"BrtEndTimelineCacheID\" },\n0x0827: { n:\"BrtBeginTimelinesEx\" },\n0x0828: { n:\"BrtEndTimelinesEx\" },\n0x0829: { n:\"BrtBeginTimelineEx\" },\n0x082A: { n:\"BrtEndTimelineEx\" },\n0x082B: { n:\"BrtWorkBookPr15\" },\n0x082C: { n:\"BrtPCDH15\" },\n0x082D: { n:\"BrtBeginTimelineStyle\" },\n0x082E: { n:\"BrtEndTimelineStyle\" },\n0x082F: { n:\"BrtTimelineStyleElement\" },\n0x0830: { n:\"BrtBeginTimelineStylesheetExt15\" },\n0x0831: { n:\"BrtEndTimelineStylesheetExt15\" },\n0x0832: { n:\"BrtBeginTimelineStyles\" },\n0x0833: { n:\"BrtEndTimelineStyles\" },\n0x0834: { n:\"BrtBeginTimelineStyleElements\" },\n0x0835: { n:\"BrtEndTimelineStyleElements\" },\n0x0836: { n:\"BrtDxf15\" },\n0x0837: { n:\"BrtBeginDxfs15\" },\n0x0838: { n:\"brtEndDxfs15\" },\n0x0839: { n:\"BrtSlicerCacheHideItemsWithNoData\" },\n0x083A: { n:\"BrtBeginItemUniqueNames\" },\n0x083B: { n:\"BrtEndItemUniqueNames\" },\n0x083C: { n:\"BrtItemUniqueName\" },\n0x083D: { n:\"BrtBeginExtConn15\" },\n0x083E: { n:\"BrtEndExtConn15\" },\n0x083F: { n:\"BrtBeginOledbPr15\" },\n0x0840: { n:\"BrtEndOledbPr15\" },\n0x0841: { n:\"BrtBeginDataFeedPr15\" },\n0x0842: { n:\"BrtEndDataFeedPr15\" },\n0x0843: { n:\"BrtTextPr15\" },\n0x0844: { n:\"BrtRangePr15\" },\n0x0845: { n:\"BrtDbCommand15\" },\n0x0846: { n:\"BrtBeginDbTables15\" },\n0x0847: { n:\"BrtEndDbTables15\" },\n0x0848: { n:\"BrtDbTable15\" },\n0x0849: { n:\"BrtBeginDataModel\" },\n0x084A: { n:\"BrtEndDataModel\" },\n0x084B: { n:\"BrtBeginModelTables\" },\n0x084C: { n:\"BrtEndModelTables\" },\n0x084D: { n:\"BrtModelTable\" },\n0x084E: { n:\"BrtBeginModelRelationships\" },\n0x084F: { n:\"BrtEndModelRelationships\" },\n0x0850: { n:\"BrtModelRelationship\" },\n0x0851: { n:\"BrtBeginECTxtWiz15\" },\n0x0852: { n:\"BrtEndECTxtWiz15\" },\n0x0853: { n:\"BrtBeginECTWFldInfoLst15\" },\n0x0854: { n:\"BrtEndECTWFldInfoLst15\" },\n0x0855: { n:\"BrtBeginECTWFldInfo15\" },\n0x0856: { n:\"BrtFieldListActiveItem\" },\n0x0857: { n:\"BrtPivotCacheIdVersion\" },\n0x0858: { n:\"BrtSXDI15\" },\n0x0859: { n:\"BrtBeginModelTimeGroupings\" },\n0x085A: { n:\"BrtEndModelTimeGroupings\" },\n0x085B: { n:\"BrtBeginModelTimeGrouping\" },\n0x085C: { n:\"BrtEndModelTimeGrouping\" },\n0x085D: { n:\"BrtModelTimeGroupingCalcCol\" },\n0x0C00: { n:\"BrtUid\" },\n0x0C01: { n:\"BrtRevisionPtr\" },\n0x13e7: { n:\"BrtBeginCalcFeatures\" },\n0x13e8: { n:\"BrtEndCalcFeatures\" },\n0x13e9: { n:\"BrtCalcFeature\" },\n0xFFFF: { n:\"\" }\n};\n\nvar XLSBRE = evert_key(XLSBRecordEnum, 'n');\n/*jshint -W069 */\nXLSBRE[\"BrtFRTArchID$\"] = 0x0010;\n/*jshint +W069 */\n\n/* [MS-XLS] 2.3 Record Enumeration (and other sources) */\nvar XLSRecordEnum = {\n\t/* [MS-XLS] 2.3 Record Enumeration 2021-08-17 */\n0x0006: { n:\"Formula\", f:parse_Formula },\n0x000a: { n:'EOF', f:parsenoop2 },\n0x000c: { n:\"CalcCount\", f:parseuint16 },\n0x000d: { n:\"CalcMode\", f:parseuint16 },\n0x000e: { n:\"CalcPrecision\", f:parsebool },\n0x000f: { n:\"CalcRefMode\", f:parsebool },\n0x0010: { n:\"CalcDelta\", f:parse_Xnum },\n0x0011: { n:\"CalcIter\", f:parsebool },\n0x0012: { n:\"Protect\", f:parsebool },\n0x0013: { n:\"Password\", f:parseuint16 },\n0x0014: { n:\"Header\", f:parse_XLHeaderFooter },\n0x0015: { n:\"Footer\", f:parse_XLHeaderFooter },\n0x0017: { n:\"ExternSheet\", f:parse_ExternSheet },\n0x0018: { n:\"Lbl\", f:parse_Lbl },\n0x0019: { n:\"WinProtect\", f:parsebool },\n0x001a: { n:\"VerticalPageBreaks\" },\n0x001b: { n:\"HorizontalPageBreaks\" },\n0x001c: { n:\"Note\", f:parse_Note },\n0x001d: { n:\"Selection\" },\n0x0022: { n:\"Date1904\", f:parsebool },\n0x0023: { n:\"ExternName\", f:parse_ExternName },\n0x0026: { n:\"LeftMargin\", f:parse_Xnum },\n0x0027: { n:\"RightMargin\", f:parse_Xnum },\n0x0028: { n:\"TopMargin\", f:parse_Xnum },\n0x0029: { n:\"BottomMargin\", f:parse_Xnum },\n0x002a: { n:\"PrintRowCol\", f:parsebool },\n0x002b: { n:\"PrintGrid\", f:parsebool },\n0x002f: { n:\"FilePass\", f:parse_FilePass },\n0x0031: { n:\"Font\", f:parse_Font },\n0x0033: { n:\"PrintSize\", f:parseuint16 },\n0x003c: { n:\"Continue\" },\n0x003d: { n:\"Window1\", f:parse_Window1 },\n0x0040: { n:\"Backup\", f:parsebool },\n0x0041: { n:\"Pane\", f:parse_Pane },\n0x0042: { n:'CodePage', f:parseuint16 },\n0x004d: { n:\"Pls\" },\n0x0050: { n:\"DCon\" },\n0x0051: { n:\"DConRef\" },\n0x0052: { n:\"DConName\" },\n0x0055: { n:\"DefColWidth\", f:parseuint16 },\n0x0059: { n:\"XCT\" },\n0x005a: { n:\"CRN\" },\n0x005b: { n:\"FileSharing\" },\n0x005c: { n:'WriteAccess', f:parse_WriteAccess },\n0x005d: { n:\"Obj\", f:parse_Obj },\n0x005e: { n:\"Uncalced\" },\n0x005f: { n:\"CalcSaveRecalc\", f:parsebool },\n0x0060: { n:\"Template\" },\n0x0061: { n:\"Intl\" },\n0x0063: { n:\"ObjProtect\", f:parsebool },\n0x007d: { n:\"ColInfo\", f:parse_ColInfo },\n0x0080: { n:\"Guts\", f:parse_Guts },\n0x0081: { n:\"WsBool\", f:parse_WsBool },\n0x0082: { n:\"GridSet\", f:parseuint16 },\n0x0083: { n:\"HCenter\", f:parsebool },\n0x0084: { n:\"VCenter\", f:parsebool },\n0x0085: { n:'BoundSheet8', f:parse_BoundSheet8 },\n0x0086: { n:\"WriteProtect\" },\n0x008c: { n:\"Country\", f:parse_Country },\n0x008d: { n:\"HideObj\", f:parseuint16 },\n0x0090: { n:\"Sort\" },\n0x0092: { n:\"Palette\", f:parse_Palette },\n0x0097: { n:\"Sync\" },\n0x0098: { n:\"LPr\" },\n0x0099: { n:\"DxGCol\" },\n0x009a: { n:\"FnGroupName\" },\n0x009b: { n:\"FilterMode\" },\n0x009c: { n:\"BuiltInFnGroupCount\", f:parseuint16 },\n0x009d: { n:\"AutoFilterInfo\" },\n0x009e: { n:\"AutoFilter\" },\n0x00a0: { n:\"Scl\", f:parse_Scl },\n0x00a1: { n:\"Setup\", f:parse_Setup },\n0x00ae: { n:\"ScenMan\" },\n0x00af: { n:\"SCENARIO\" },\n0x00b0: { n:\"SxView\" },\n0x00b1: { n:\"Sxvd\" },\n0x00b2: { n:\"SXVI\" },\n0x00b4: { n:\"SxIvd\" },\n0x00b5: { n:\"SXLI\" },\n0x00b6: { n:\"SXPI\" },\n0x00b8: { n:\"DocRoute\" },\n0x00b9: { n:\"RecipName\" },\n0x00bd: { n:\"MulRk\", f:parse_MulRk },\n0x00be: { n:\"MulBlank\", f:parse_MulBlank },\n0x00c1: { n:'Mms', f:parsenoop2 },\n0x00c5: { n:\"SXDI\" },\n0x00c6: { n:\"SXDB\" },\n0x00c7: { n:\"SXFDB\" },\n0x00c8: { n:\"SXDBB\" },\n0x00c9: { n:\"SXNum\" },\n0x00ca: { n:\"SxBool\", f:parsebool },\n0x00cb: { n:\"SxErr\" },\n0x00cc: { n:\"SXInt\" },\n0x00cd: { n:\"SXString\" },\n0x00ce: { n:\"SXDtr\" },\n0x00cf: { n:\"SxNil\" },\n0x00d0: { n:\"SXTbl\" },\n0x00d1: { n:\"SXTBRGIITM\" },\n0x00d2: { n:\"SxTbpg\" },\n0x00d3: { n:\"ObProj\" },\n0x00d5: { n:\"SXStreamID\" },\n0x00d7: { n:\"DBCell\" },\n0x00d8: { n:\"SXRng\" },\n0x00d9: { n:\"SxIsxoper\" },\n0x00da: { n:\"BookBool\", f:parseuint16 },\n0x00dc: { n:\"DbOrParamQry\" },\n0x00dd: { n:\"ScenarioProtect\", f:parsebool },\n0x00de: { n:\"OleObjectSize\" },\n0x00e0: { n:\"XF\", f:parse_XF },\n0x00e1: { n:'InterfaceHdr', f:parse_InterfaceHdr },\n0x00e2: { n:'InterfaceEnd', f:parsenoop2 },\n0x00e3: { n:\"SXVS\" },\n0x00e5: { n:\"MergeCells\", f:parse_MergeCells },\n0x00e9: { n:\"BkHim\" },\n0x00eb: { n:\"MsoDrawingGroup\" },\n0x00ec: { n:\"MsoDrawing\" },\n0x00ed: { n:\"MsoDrawingSelection\" },\n0x00ef: { n:\"PhoneticInfo\" },\n0x00f0: { n:\"SxRule\" },\n0x00f1: { n:\"SXEx\" },\n0x00f2: { n:\"SxFilt\" },\n0x00f4: { n:\"SxDXF\" },\n0x00f5: { n:\"SxItm\" },\n0x00f6: { n:\"SxName\" },\n0x00f7: { n:\"SxSelect\" },\n0x00f8: { n:\"SXPair\" },\n0x00f9: { n:\"SxFmla\" },\n0x00fb: { n:\"SxFormat\" },\n0x00fc: { n:\"SST\", f:parse_SST },\n0x00fd: { n:\"LabelSst\", f:parse_LabelSst },\n0x00ff: { n:\"ExtSST\", f:parse_ExtSST },\n0x0100: { n:\"SXVDEx\" },\n0x0103: { n:\"SXFormula\" },\n0x0122: { n:\"SXDBEx\" },\n0x0137: { n:\"RRDInsDel\" },\n0x0138: { n:\"RRDHead\" },\n0x013b: { n:\"RRDChgCell\" },\n0x013d: { n:\"RRTabId\", f:parseuint16a },\n0x013e: { n:\"RRDRenSheet\" },\n0x013f: { n:\"RRSort\" },\n0x0140: { n:\"RRDMove\" },\n0x014a: { n:\"RRFormat\" },\n0x014b: { n:\"RRAutoFmt\" },\n0x014d: { n:\"RRInsertSh\" },\n0x014e: { n:\"RRDMoveBegin\" },\n0x014f: { n:\"RRDMoveEnd\" },\n0x0150: { n:\"RRDInsDelBegin\" },\n0x0151: { n:\"RRDInsDelEnd\" },\n0x0152: { n:\"RRDConflict\" },\n0x0153: { n:\"RRDDefName\" },\n0x0154: { n:\"RRDRstEtxp\" },\n0x015f: { n:\"LRng\" },\n0x0160: { n:\"UsesELFs\", f:parsebool },\n0x0161: { n:\"DSF\", f:parsenoop2 },\n0x0191: { n:\"CUsr\" },\n0x0192: { n:\"CbUsr\" },\n0x0193: { n:\"UsrInfo\" },\n0x0194: { n:\"UsrExcl\" },\n0x0195: { n:\"FileLock\" },\n0x0196: { n:\"RRDInfo\" },\n0x0197: { n:\"BCUsrs\" },\n0x0198: { n:\"UsrChk\" },\n0x01a9: { n:\"UserBView\" },\n0x01aa: { n:\"UserSViewBegin\" },\n0x01ab: { n:\"UserSViewEnd\" },\n0x01ac: { n:\"RRDUserView\" },\n0x01ad: { n:\"Qsi\" },\n0x01ae: { n:\"SupBook\", f:parse_SupBook },\n0x01af: { n:\"Prot4Rev\", f:parsebool },\n0x01b0: { n:\"CondFmt\" },\n0x01b1: { n:\"CF\" },\n0x01b2: { n:\"DVal\" },\n0x01b5: { n:\"DConBin\" },\n0x01b6: { n:\"TxO\", f:parse_TxO },\n0x01b7: { n:\"RefreshAll\", f:parsebool },\n0x01b8: { n:\"HLink\", f:parse_HLink },\n0x01b9: { n:\"Lel\" },\n0x01ba: { n:\"CodeName\", f:parse_XLUnicodeString },\n0x01bb: { n:\"SXFDBType\" },\n0x01bc: { n:\"Prot4RevPass\", f:parseuint16 },\n0x01bd: { n:\"ObNoMacros\" },\n0x01be: { n:\"Dv\" },\n0x01c0: { n:\"Excel9File\", f:parsenoop2 },\n0x01c1: { n:\"RecalcId\", f:parse_RecalcId, r:2},\n0x01c2: { n:\"EntExU2\", f:parsenoop2 },\n0x0200: { n:\"Dimensions\", f:parse_Dimensions },\n0x0201: { n:\"Blank\", f:parse_Blank },\n0x0203: { n:\"Number\", f:parse_Number },\n0x0204: { n:\"Label\", f:parse_Label },\n0x0205: { n:\"BoolErr\", f:parse_BoolErr },\n0x0207: { n:\"String\", f:parse_String },\n0x0208: { n:'Row', f:parse_Row },\n0x020b: { n:\"Index\" },\n0x0221: { n:\"Array\", f:parse_Array },\n0x0225: { n:\"DefaultRowHeight\", f:parse_DefaultRowHeight },\n0x0236: { n:\"Table\" },\n0x023e: { n:\"Window2\", f:parse_Window2 },\n0x027e: { n:\"RK\", f:parse_RK },\n0x0293: { n:\"Style\" },\n0x0418: { n:\"BigName\" },\n0x041e: { n:\"Format\", f:parse_Format },\n0x043c: { n:\"ContinueBigName\" },\n0x04bc: { n:\"ShrFmla\", f:parse_ShrFmla },\n0x0800: { n:\"HLinkTooltip\", f:parse_HLinkTooltip },\n0x0801: { n:\"WebPub\" },\n0x0802: { n:\"QsiSXTag\" },\n0x0803: { n:\"DBQueryExt\" },\n0x0804: { n:\"ExtString\" },\n0x0805: { n:\"TxtQry\" },\n0x0806: { n:\"Qsir\" },\n0x0807: { n:\"Qsif\" },\n0x0808: { n:\"RRDTQSIF\" },\n0x0809: { n:'BOF', f:parse_BOF },\n0x080a: { n:\"OleDbConn\" },\n0x080b: { n:\"WOpt\" },\n0x080c: { n:\"SXViewEx\" },\n0x080d: { n:\"SXTH\" },\n0x080e: { n:\"SXPIEx\" },\n0x080f: { n:\"SXVDTEx\" },\n0x0810: { n:\"SXViewEx9\" },\n0x0812: { n:\"ContinueFrt\" },\n0x0813: { n:\"RealTimeData\" },\n0x0850: { n:\"ChartFrtInfo\" },\n0x0851: { n:\"FrtWrapper\" },\n0x0852: { n:\"StartBlock\" },\n0x0853: { n:\"EndBlock\" },\n0x0854: { n:\"StartObject\" },\n0x0855: { n:\"EndObject\" },\n0x0856: { n:\"CatLab\" },\n0x0857: { n:\"YMult\" },\n0x0858: { n:\"SXViewLink\" },\n0x0859: { n:\"PivotChartBits\" },\n0x085a: { n:\"FrtFontList\" },\n0x0862: { n:\"SheetExt\" },\n0x0863: { n:\"BookExt\", r:12},\n0x0864: { n:\"SXAddl\" },\n0x0865: { n:\"CrErr\" },\n0x0866: { n:\"HFPicture\" },\n0x0867: { n:'FeatHdr', f:parsenoop2 },\n0x0868: { n:\"Feat\" },\n0x086a: { n:\"DataLabExt\" },\n0x086b: { n:\"DataLabExtContents\" },\n0x086c: { n:\"CellWatch\" },\n0x0871: { n:\"FeatHdr11\" },\n0x0872: { n:\"Feature11\" },\n0x0874: { n:\"DropDownObjIds\" },\n0x0875: { n:\"ContinueFrt11\" },\n0x0876: { n:\"DConn\" },\n0x0877: { n:\"List12\" },\n0x0878: { n:\"Feature12\" },\n0x0879: { n:\"CondFmt12\" },\n0x087a: { n:\"CF12\" },\n0x087b: { n:\"CFEx\" },\n0x087c: { n:\"XFCRC\", f:parse_XFCRC, r:12 },\n0x087d: { n:\"XFExt\", f:parse_XFExt, r:12 },\n0x087e: { n:\"AutoFilter12\" },\n0x087f: { n:\"ContinueFrt12\" },\n0x0884: { n:\"MDTInfo\" },\n0x0885: { n:\"MDXStr\" },\n0x0886: { n:\"MDXTuple\" },\n0x0887: { n:\"MDXSet\" },\n0x0888: { n:\"MDXProp\" },\n0x0889: { n:\"MDXKPI\" },\n0x088a: { n:\"MDB\" },\n0x088b: { n:\"PLV\" },\n0x088c: { n:\"Compat12\", f:parsebool, r:12 },\n0x088d: { n:\"DXF\" },\n0x088e: { n:\"TableStyles\", r:12 },\n0x088f: { n:\"TableStyle\" },\n0x0890: { n:\"TableStyleElement\" },\n0x0892: { n:\"StyleExt\" },\n0x0893: { n:\"NamePublish\" },\n0x0894: { n:\"NameCmt\", f:parse_NameCmt, r:12 },\n0x0895: { n:\"SortData\" },\n0x0896: { n:\"Theme\", f:parse_Theme, r:12 },\n0x0897: { n:\"GUIDTypeLib\" },\n0x0898: { n:\"FnGrp12\" },\n0x0899: { n:\"NameFnGrp12\" },\n0x089a: { n:\"MTRSettings\", f:parse_MTRSettings, r:12 },\n0x089b: { n:\"CompressPictures\", f:parsenoop2 },\n0x089c: { n:\"HeaderFooter\" },\n0x089d: { n:\"CrtLayout12\" },\n0x089e: { n:\"CrtMlFrt\" },\n0x089f: { n:\"CrtMlFrtContinue\" },\n0x08a3: { n:\"ForceFullCalculation\", f:parse_ForceFullCalculation },\n0x08a4: { n:\"ShapePropsStream\" },\n0x08a5: { n:\"TextPropsStream\" },\n0x08a6: { n:\"RichTextStream\" },\n0x08a7: { n:\"CrtLayout12A\" },\n0x1001: { n:\"Units\" },\n0x1002: { n:\"Chart\" },\n0x1003: { n:\"Series\" },\n0x1006: { n:\"DataFormat\" },\n0x1007: { n:\"LineFormat\" },\n0x1009: { n:\"MarkerFormat\" },\n0x100a: { n:\"AreaFormat\" },\n0x100b: { n:\"PieFormat\" },\n0x100c: { n:\"AttachedLabel\" },\n0x100d: { n:\"SeriesText\" },\n0x1014: { n:\"ChartFormat\" },\n0x1015: { n:\"Legend\" },\n0x1016: { n:\"SeriesList\" },\n0x1017: { n:\"Bar\" },\n0x1018: { n:\"Line\" },\n0x1019: { n:\"Pie\" },\n0x101a: { n:\"Area\" },\n0x101b: { n:\"Scatter\" },\n0x101c: { n:\"CrtLine\" },\n0x101d: { n:\"Axis\" },\n0x101e: { n:\"Tick\" },\n0x101f: { n:\"ValueRange\" },\n0x1020: { n:\"CatSerRange\" },\n0x1021: { n:\"AxisLine\" },\n0x1022: { n:\"CrtLink\" },\n0x1024: { n:\"DefaultText\" },\n0x1025: { n:\"Text\" },\n0x1026: { n:\"FontX\", f:parseuint16 },\n0x1027: { n:\"ObjectLink\" },\n0x1032: { n:\"Frame\" },\n0x1033: { n:\"Begin\" },\n0x1034: { n:\"End\" },\n0x1035: { n:\"PlotArea\" },\n0x103a: { n:\"Chart3d\" },\n0x103c: { n:\"PicF\" },\n0x103d: { n:\"DropBar\" },\n0x103e: { n:\"Radar\" },\n0x103f: { n:\"Surf\" },\n0x1040: { n:\"RadarArea\" },\n0x1041: { n:\"AxisParent\" },\n0x1043: { n:\"LegendException\" },\n0x1044: { n:\"ShtProps\", f:parse_ShtProps },\n0x1045: { n:\"SerToCrt\" },\n0x1046: { n:\"AxesUsed\" },\n0x1048: { n:\"SBaseRef\" },\n0x104a: { n:\"SerParent\" },\n0x104b: { n:\"SerAuxTrend\" },\n0x104e: { n:\"IFmtRecord\" },\n0x104f: { n:\"Pos\" },\n0x1050: { n:\"AlRuns\" },\n0x1051: { n:\"BRAI\" },\n0x105b: { n:\"SerAuxErrBar\" },\n0x105c: { n:\"ClrtClient\", f:parse_ClrtClient },\n0x105d: { n:\"SerFmt\" },\n0x105f: { n:\"Chart3DBarShape\" },\n0x1060: { n:\"Fbi\" },\n0x1061: { n:\"BopPop\" },\n0x1062: { n:\"AxcExt\" },\n0x1063: { n:\"Dat\" },\n0x1064: { n:\"PlotGrowth\" },\n0x1065: { n:\"SIIndex\" },\n0x1066: { n:\"GelFrame\" },\n0x1067: { n:\"BopPopCustom\" },\n0x1068: { n:\"Fbi2\" },\n\n0x0000: { n:\"Dimensions\", f:parse_Dimensions },\n0x0001: { n:\"BIFF2BLANK\" },\n0x0002: { n:\"BIFF2INT\", f:parse_BIFF2INT },\n0x0003: { n:\"BIFF2NUM\", f:parse_BIFF2NUM },\n0x0004: { n:\"BIFF2STR\", f:parse_BIFF2STR },\n0x0005: { n:\"BoolErr\", f:parse_BoolErr },\n0x0007: { n:\"String\", f:parse_BIFF2STRING },\n0x0008: { n:\"BIFF2ROW\" },\n0x0009: { n:'BOF', f:parse_BOF },\n0x000b: { n:\"Index\" },\n0x0016: { n:\"ExternCount\", f:parseuint16 },\n0x001e: { n:\"BIFF2FORMAT\", f:parse_BIFF2Format },\n0x001f: { n:\"BIFF2FMTCNT\" }, /* 16-bit cnt of BIFF2FORMAT records */\n0x0020: { n:\"BIFF2COLINFO\" },\n0x0021: { n:\"Array\", f:parse_Array },\n0x0024: { n:\"COLWIDTH\" },\n0x0025: { n:\"DefaultRowHeight\", f:parse_DefaultRowHeight },\n\t// 0x2c ??\n\t// 0x2d ??\n\t// 0x2e ??\n\t// 0x30 FONTCOUNT: number of fonts\n0x0032: { n:\"BIFF2FONTXTRA\", f:parse_BIFF2FONTXTRA },\n\t// 0x35: INFOOPTS\n\t// 0x36: TABLE (BIFF2 only)\n\t// 0x37: TABLE2 (BIFF2 only)\n\t// 0x38: WNDESK\n\t// 0x39 ??\n\t// 0x3a: BEGINPREF\n\t// 0x3b: ENDPREF\n0x003e: { n:\"BIFF2WINDOW2\" },\n\t// 0x3f ??\n\t// 0x46: SHOWSCROLL\n\t// 0x47: SHOWFORMULA\n\t// 0x48: STATUSBAR\n\t// 0x49: SHORTMENUS\n\t// 0x4A:\n\t// 0x4B:\n\t// 0x4C:\n\t// 0x4E:\n\t// 0x4F:\n\t// 0x58: TOOLBAR (BIFF3)\n\n\t/* - - - */\n0x0034: { n:\"DDEObjName\" },\n0x0043: { n:\"BIFF2XF\" },\n0x0044: { n:\"BIFF2XFINDEX\", f:parseuint16 },\n0x0045: { n:\"BIFF2FONTCLR\" },\n0x0056: { n:\"BIFF4FMTCNT\" }, /* 16-bit cnt, similar to BIFF2 */\n0x007e: { n:\"RK\" }, /* Not necessarily same as 0x027e */\n0x007f: { n:\"ImData\", f:parse_ImData },\n0x0087: { n:\"Addin\" },\n0x0088: { n:\"Edg\" },\n0x0089: { n:\"Pub\" },\n\t// 0x8A\n\t// 0x8B LH: alternate menu key flag (BIFF3/4)\n\t// 0x8E\n\t// 0x8F\n0x0091: { n:\"Sub\" },\n\t// 0x93 STYLE\n0x0094: { n:\"LHRecord\" },\n0x0095: { n:\"LHNGraph\" },\n0x0096: { n:\"Sound\" },\n\t// 0xA2 FNPROTO: function prototypes (BIFF4)\n\t// 0xA3\n\t// 0xA8\n0x00a9: { n:\"CoordList\" },\n0x00ab: { n:\"GCW\" },\n0x00bc: { n:\"ShrFmla\" }, /* Not necessarily same as 0x04bc */\n0x00bf: { n:\"ToolbarHdr\" },\n0x00c0: { n:\"ToolbarEnd\" },\n0x00c2: { n:\"AddMenu\" },\n0x00c3: { n:\"DelMenu\" },\n0x00d6: { n:\"RString\", f:parse_RString },\n0x00df: { n:\"UDDesc\" },\n0x00ea: { n:\"TabIdConf\" },\n0x0162: { n:\"XL5Modify\" },\n0x01a5: { n:\"FileSharing2\" },\n0x0206: { n:\"Formula\", f:parse_Formula },\n0x0209: { n:'BOF', f:parse_BOF },\n0x0218: { n:\"Lbl\", f:parse_Lbl },\n0x0223: { n:\"ExternName\", f:parse_ExternName },\n0x0231: { n:\"Font\" },\n0x0243: { n:\"BIFF3XF\" },\n0x0406: { n:\"Formula\", f:parse_Formula },\n0x0409: { n:'BOF', f:parse_BOF },\n0x0443: { n:\"BIFF4XF\" },\n0x086d: { n:\"FeatInfo\" },\n0x0873: { n:\"FeatInfo11\" },\n0x0881: { n:\"SXAddl12\" },\n0x08c0: { n:\"AutoWebPub\" },\n0x08c1: { n:\"ListObj\" },\n0x08c2: { n:\"ListField\" },\n0x08c3: { n:\"ListDV\" },\n0x08c4: { n:\"ListCondFmt\" },\n0x08c5: { n:\"ListCF\" },\n0x08c6: { n:\"FMQry\" },\n0x08c7: { n:\"FMSQry\" },\n0x08c8: { n:\"PLV\" },\n0x08c9: { n:\"LnExt\" },\n0x08ca: { n:\"MkrExt\" },\n0x08cb: { n:\"CrtCoopt\" },\n0x08d6: { n:\"FRTArchId$\", r:12 },\n\n0x7262: {}\n};\n\nvar XLSRE = evert_key(XLSRecordEnum, 'n');\nfunction write_biff_rec(ba, type, payload, length) {\n\tvar t = typeof type == \"number\" ? type : (+type || +XLSRE[type]);\n\tif(isNaN(t)) return;\n\tvar len = length || (payload||[]).length || 0;\n\tvar o = ba.next(4);\n\to.write_shift(2, t);\n\to.write_shift(2, len);\n\tif(len > 0 && is_buf(payload)) ba.push(payload);\n}\n\nfunction write_biff_continue(ba, type, payload, length) {\n\tvar len = length || (payload||[]).length || 0;\n\tif(len <= 8224) return write_biff_rec(ba, type, payload, len);\n\tvar t = +type || +XLSRE[type];\n\tif(isNaN(t)) return;\n\tvar parts = payload.parts || [], sidx = 0;\n\tvar i = 0, w = 0;\n\twhile(w + (parts[sidx] || 8224) <= 8224) { w+= (parts[sidx] || 8224); sidx++; }\n\tvar o = ba.next(4);\n\to.write_shift(2, t);\n\to.write_shift(2, w);\n\tba.push(payload.slice(i, i + w));\n\ti += w;\n\twhile(i < len) {\n\t\to = ba.next(4);\n\t\to.write_shift(2, 0x3c); // TODO: figure out correct continue type\n\t\tw = 0;\n\t\twhile(w + (parts[sidx] || 8224) <= 8224) { w+= (parts[sidx] || 8224); sidx++; }\n\t\to.write_shift(2, w);\n\t\tba.push(payload.slice(i, i+w)); i+= w;\n\t}\n}\n\nfunction write_BIFF2Cell(out, r, c) {\n\tif(!out) out = new_buf(7);\n\tout.write_shift(2, r);\n\tout.write_shift(2, c);\n\tout.write_shift(2, 0);\n\tout.write_shift(1, 0);\n\treturn out;\n}\n\nfunction write_BIFF2BERR(r, c, val, t) {\n\tvar out = new_buf(9);\n\twrite_BIFF2Cell(out, r, c);\n\twrite_Bes(val, t || 'b', out);\n\treturn out;\n}\n\n/* TODO: codepage, large strings */\nfunction write_BIFF2LABEL(r, c, val) {\n\tvar out = new_buf(8 + 2*val.length);\n\twrite_BIFF2Cell(out, r, c);\n\tout.write_shift(1, val.length);\n\tout.write_shift(val.length, val, 'sbcs');\n\treturn out.l < out.length ? out.slice(0, out.l) : out;\n}\n\nfunction write_ws_biff2_cell(ba, cell, R, C) {\n\tif(cell.v != null) switch(cell.t) {\n\t\tcase 'd': case 'n':\n\t\t\tvar v = cell.t == 'd' ? datenum(parseDate(cell.v)) : cell.v;\n\t\t\tif((v == (v|0)) && (v >= 0) && (v < 65536))\n\t\t\t\twrite_biff_rec(ba, 0x0002, write_BIFF2INT(R, C, v));\n\t\t\telse\n\t\t\t\twrite_biff_rec(ba, 0x0003, write_BIFF2NUM(R,C, v));\n\t\t\treturn;\n\t\tcase 'b': case 'e': write_biff_rec(ba, 0x0005, write_BIFF2BERR(R, C, cell.v, cell.t)); return;\n\t\t/* TODO: codepage, sst */\n\t\tcase 's': case 'str':\n\t\t\twrite_biff_rec(ba, 0x0004, write_BIFF2LABEL(R, C, (cell.v||\"\").slice(0,255)));\n\t\t\treturn;\n\t}\n\twrite_biff_rec(ba, 0x0001, write_BIFF2Cell(null, R, C));\n}\n\nfunction write_ws_biff2(ba, ws, idx, opts) {\n\tvar dense = Array.isArray(ws);\n\tvar range = safe_decode_range(ws['!ref'] || \"A1\"), ref, rr = \"\", cols = [];\n\tif(range.e.c > 0xFF || range.e.r > 0x3FFF) {\n\t\tif(opts.WTF) throw new Error(\"Range \" + (ws['!ref'] || \"A1\") + \" exceeds format limit A1:IV16384\");\n\t\trange.e.c = Math.min(range.e.c, 0xFF);\n\t\trange.e.r = Math.min(range.e.c, 0x3FFF);\n\t\tref = encode_range(range);\n\t}\n\tfor(var R = range.s.r; R <= range.e.r; ++R) {\n\t\trr = encode_row(R);\n\t\tfor(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\tif(R === range.s.r) cols[C] = encode_col(C);\n\t\t\tref = cols[C] + rr;\n\t\t\tvar cell = dense ? (ws[R]||[])[C] : ws[ref];\n\t\t\tif(!cell) continue;\n\t\t\t/* write cell */\n\t\t\twrite_ws_biff2_cell(ba, cell, R, C, opts);\n\t\t}\n\t}\n}\n\n/* Based on test files */\nfunction write_biff2_buf(wb, opts) {\n\tvar o = opts || {};\n\tif(DENSE != null && o.dense == null) o.dense = DENSE;\n\tvar ba = buf_array();\n\tvar idx = 0;\n\tfor(var i=0;i 0xFF || range.e.r >= MAX_ROWS) {\n\t\tif(opts.WTF) throw new Error(\"Range \" + (ws['!ref'] || \"A1\") + \" exceeds format limit A1:IV16384\");\n\t\trange.e.c = Math.min(range.e.c, 0xFF);\n\t\trange.e.r = Math.min(range.e.c, MAX_ROWS-1);\n\t}\n\n\twrite_biff_rec(ba, 0x0809, write_BOF(wb, 0x10, opts));\n\t/* [Uncalced] Index */\n\twrite_biff_rec(ba, \"CalcMode\", writeuint16(1));\n\twrite_biff_rec(ba, \"CalcCount\", writeuint16(100));\n\twrite_biff_rec(ba, \"CalcRefMode\", writebool(true));\n\twrite_biff_rec(ba, \"CalcIter\", writebool(false));\n\twrite_biff_rec(ba, \"CalcDelta\", write_Xnum(0.001));\n\twrite_biff_rec(ba, \"CalcSaveRecalc\", writebool(true));\n\twrite_biff_rec(ba, \"PrintRowCol\", writebool(false));\n\twrite_biff_rec(ba, \"PrintGrid\", writebool(false));\n\twrite_biff_rec(ba, \"GridSet\", writeuint16(1));\n\twrite_biff_rec(ba, \"Guts\", write_Guts([0,0]));\n\t/* DefaultRowHeight WsBool [Sync] [LPr] [HorizontalPageBreaks] [VerticalPageBreaks] */\n\t/* Header (string) */\n\t/* Footer (string) */\n\twrite_biff_rec(ba, \"HCenter\", writebool(false));\n\twrite_biff_rec(ba, \"VCenter\", writebool(false));\n\t/* ... */\n\tif(b8) write_ws_cols_biff8(ba, ws[\"!cols\"], ws);\n\t/* ... */\n\twrite_biff_rec(ba, 0x200, write_Dimensions(range, opts));\n\t/* ... */\n\n\tif(b8) ws['!links'] = [];\n\tfor(var R = range.s.r; R <= range.e.r; ++R) {\n\t\trr = encode_row(R);\n\t\tfor(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\tif(R === range.s.r) cols[C] = encode_col(C);\n\t\t\tref = cols[C] + rr;\n\t\t\tvar cell = dense ? (ws[R]||[])[C] : ws[ref];\n\t\t\tif(!cell) continue;\n\t\t\t/* write cell */\n\t\t\twrite_ws_biff8_cell(ba, cell, R, C, opts);\n\t\t\tif(b8 && cell.l) ws['!links'].push([ref, cell.l]);\n\t\t}\n\t}\n\tvar cname = _sheet.CodeName || _sheet.name || s;\n\t/* ... */\n\tif(b8) write_biff_rec(ba, \"Window2\", write_Window2((_WB.Views||[])[0]));\n\t/* ... */\n\tif(b8 && (ws['!merges']||[]).length) write_biff_rec(ba, \"MergeCells\", write_MergeCells(ws['!merges']));\n\t/* [LRng] *QUERYTABLE [PHONETICINFO] CONDFMTS */\n\tif(b8) write_ws_biff8_hlinks(ba, ws);\n\t/* [DVAL] */\n\twrite_biff_rec(ba, \"CodeName\", write_XLUnicodeString(cname, opts));\n\t/* *WebPub *CellWatch [SheetExt] */\n\tif(b8) write_FEAT(ba, ws);\n\t/* *FEAT11 *RECORD12 */\n\twrite_biff_rec(ba, \"EOF\");\n\treturn ba.end();\n}\n\n/* [MS-XLS] 2.1.7.20.3 */\nfunction write_biff8_global(wb, bufs, opts) {\n\tvar A = buf_array();\n\tvar _WB = ((wb||{}).Workbook||{});\n\tvar _sheets = (_WB.Sheets||[]);\n\tvar _wb = _WB.WBProps||{};\n\tvar b8 = opts.biff == 8, b5 = opts.biff == 5;\n\twrite_biff_rec(A, 0x0809, write_BOF(wb, 0x05, opts));\n\tif(opts.bookType == \"xla\") write_biff_rec(A, \"Addin\");\n\twrite_biff_rec(A, \"InterfaceHdr\", b8 ? writeuint16(0x04b0) : null);\n\twrite_biff_rec(A, \"Mms\", writezeroes(2));\n\tif(b5) write_biff_rec(A, \"ToolbarHdr\");\n\tif(b5) write_biff_rec(A, \"ToolbarEnd\");\n\twrite_biff_rec(A, \"InterfaceEnd\");\n\twrite_biff_rec(A, \"WriteAccess\", write_WriteAccess(\"SheetJS\", opts));\n\t/* [FileSharing] */\n\twrite_biff_rec(A, \"CodePage\", writeuint16(b8 ? 0x04b0 : 0x04E4));\n\t/* *2047 Lel */\n\tif(b8) write_biff_rec(A, \"DSF\", writeuint16(0));\n\tif(b8) write_biff_rec(A, \"Excel9File\");\n\twrite_biff_rec(A, \"RRTabId\", write_RRTabId(wb.SheetNames.length));\n\tif(b8 && wb.vbaraw) write_biff_rec(A, \"ObProj\");\n\t/* [ObNoMacros] */\n\tif(b8 && wb.vbaraw) {\n\t\tvar cname = _wb.CodeName || \"ThisWorkbook\";\n\t\twrite_biff_rec(A, \"CodeName\", write_XLUnicodeString(cname, opts));\n\t}\n\twrite_biff_rec(A, \"BuiltInFnGroupCount\", writeuint16(0x11));\n\t/* *FnGroupName *FnGrp12 */\n\t/* *Lbl */\n\t/* [OleObjectSize] */\n\twrite_biff_rec(A, \"WinProtect\", writebool(false));\n\twrite_biff_rec(A, \"Protect\", writebool(false));\n\twrite_biff_rec(A, \"Password\", writeuint16(0));\n\tif(b8) write_biff_rec(A, \"Prot4Rev\", writebool(false));\n\tif(b8) write_biff_rec(A, \"Prot4RevPass\", writeuint16(0));\n\twrite_biff_rec(A, \"Window1\", write_Window1(opts));\n\twrite_biff_rec(A, \"Backup\", writebool(false));\n\twrite_biff_rec(A, \"HideObj\", writeuint16(0));\n\twrite_biff_rec(A, \"Date1904\", writebool(safe1904(wb)==\"true\"));\n\twrite_biff_rec(A, \"CalcPrecision\", writebool(true));\n\tif(b8) write_biff_rec(A, \"RefreshAll\", writebool(false));\n\twrite_biff_rec(A, \"BookBool\", writeuint16(0));\n\t/* ... */\n\twrite_FONTS_biff8(A, wb, opts);\n\twrite_FMTS_biff8(A, wb.SSF, opts);\n\twrite_CELLXFS_biff8(A, opts);\n\t/* ... */\n\tif(b8) write_biff_rec(A, \"UsesELFs\", writebool(false));\n\tvar a = A.end();\n\n\tvar C = buf_array();\n\t/* METADATA [MTRSettings] [ForceFullCalculation] */\n\tif(b8) write_biff_rec(C, \"Country\", write_Country());\n\t/* *SUPBOOK *LBL *RTD [RecalcId] *HFPicture *MSODRAWINGGROUP */\n\n\t/* BIFF8: [SST *Continue] ExtSST */\n\tif(b8 && opts.Strings) write_biff_continue(C, \"SST\", write_SST(opts.Strings, opts));\n\n\t/* *WebPub [WOpt] [CrErr] [BookExt] *FeatHdr *DConn [THEME] [CompressPictures] [Compat12] [GUIDTypeLib] */\n\twrite_biff_rec(C, \"EOF\");\n\tvar c = C.end();\n\n\tvar B = buf_array();\n\tvar blen = 0, j = 0;\n\tfor(j = 0; j < wb.SheetNames.length; ++j) blen += (b8 ? 12 : 11) + (b8 ? 2 : 1) * wb.SheetNames[j].length;\n\tvar start = a.length + blen + c.length;\n\tfor(j = 0; j < wb.SheetNames.length; ++j) {\n\t\tvar _sheet = _sheets[j] || ({});\n\t\twrite_biff_rec(B, \"BoundSheet8\", write_BoundSheet8({pos:start, hs:_sheet.Hidden||0, dt:0, name:wb.SheetNames[j]}, opts));\n\t\tstart += bufs[j].length;\n\t}\n\t/* 1*BoundSheet8 */\n\tvar b = B.end();\n\tif(blen != b.length) throw new Error(\"BS8 \" + blen + \" != \" + b.length);\n\n\tvar out = [];\n\tif(a.length) out.push(a);\n\tif(b.length) out.push(b);\n\tif(c.length) out.push(c);\n\treturn __toBuffer([out]);\n}\n\n/* [MS-XLS] 2.1.7.20 Workbook Stream */\nfunction write_biff8_buf(wb, opts) {\n\tvar o = opts || {};\n\tvar bufs = [];\n\n\tif(wb && !wb.SSF) {\n\t\twb.SSF = SSF.get_table();\n\t}\n\tif(wb && wb.SSF) {\n\t\tmake_ssf(SSF); SSF.load_table(wb.SSF);\n\t\t// $FlowIgnore\n\t\to.revssf = evert_num(wb.SSF); o.revssf[wb.SSF[65535]] = 0;\n\t\to.ssf = wb.SSF;\n\t}\n\n\to.Strings = []; o.Strings.Count = 0; o.Strings.Unique = 0;\n\tfix_write_opts(o);\n\n\to.cellXfs = [];\n\tget_cell_style(o.cellXfs, {}, {revssf:{\"General\":0}});\n\n\tif(!wb.Props) wb.Props = {};\n\n\tfor(var i = 0; i < wb.SheetNames.length; ++i) bufs[bufs.length] = write_ws_biff8(i, o, wb);\n\tbufs.unshift(write_biff8_global(wb, bufs, o));\n\treturn __toBuffer([bufs]);\n}\n\nfunction write_biff_buf(wb, opts) {\n\tfor(var i = 0; i <= wb.SheetNames.length; ++i) {\n\t\tvar ws = wb.Sheets[wb.SheetNames[i]];\n\t\tif(!ws || !ws[\"!ref\"]) continue;\n\t\tvar range = decode_range(ws[\"!ref\"]);\n\t\tif(range.e.c > 255) { // note: 255 is IV\n\t\t console.error(\"Worksheet '\" + wb.SheetNames[i] + \"' extends beyond column IV (255). Data may be lost.\");\n\t\t}\n\t}\n\n\tvar o = opts || {};\n\tswitch(o.biff || 2) {\n\t\tcase 8: case 5: return write_biff8_buf(wb, opts);\n\t\tcase 4: case 3: case 2: return write_biff2_buf(wb, opts);\n\t}\n\tthrow new Error(\"invalid type \" + o.bookType + \" for BIFF\");\n}\n/* note: browser DOM element cannot see mso- style attrs, must parse */\nvar HTML_ = (function() {\n\tfunction html_to_sheet(str, _opts) {\n\t\tvar opts = _opts || {};\n\t\tif(DENSE != null && opts.dense == null) opts.dense = DENSE;\n\t\tvar ws = opts.dense ? ([]) : ({});\n\t\tstr = str.replace(//g, \"\");\n\t\tvar mtch = str.match(/\");\n\t\tvar mtch2 = str.match(/<\\/table/i);\n\t\tvar i = mtch.index, j = mtch2 && mtch2.index || str.length;\n\t\tvar rows = split_regex(str.slice(i, j), /(:?]*>)/i, \"\");\n\t\tvar R = -1, C = 0, RS = 0, CS = 0;\n\t\tvar range = {s:{r:10000000, c:10000000},e:{r:0,c:0}};\n\t\tvar merges = [];\n\t\tfor(i = 0; i < rows.length; ++i) {\n\t\t\tvar row = rows[i].trim();\n\t\t\tvar hd = row.slice(0,3).toLowerCase();\n\t\t\tif(hd == \"/i);\n\t\t\tfor(j = 0; j < cells.length; ++j) {\n\t\t\t\tvar cell = cells[j].trim();\n\t\t\t\tif(!cell.match(/\")) > -1) m = m.slice(cc+1);\n\t\t\t\tfor(var midx = 0; midx < merges.length; ++midx) {\n\t\t\t\t\tvar _merge = merges[midx];\n\t\t\t\t\tif(_merge.s.c == C && _merge.s.r < R && R <= _merge.e.r) { C = _merge.e.c + 1; midx = -1; }\n\t\t\t\t}\n\t\t\t\tvar tag = parsexmltag(cell.slice(0, cell.indexOf(\">\")));\n\t\t\t\tCS = tag.colspan ? +tag.colspan : 1;\n\t\t\t\tif((RS = +tag.rowspan)>1 || CS>1) merges.push({s:{r:R,c:C},e:{r:R + (RS||1) - 1, c:C + CS - 1}});\n\t\t\t\tvar _t = tag.t || tag[\"data-t\"] || \"\";\n\t\t\t\t/* TODO: generate stub cells */\n\t\t\t\tif(!m.length) { C += CS; continue; }\n\t\t\t\tm = htmldecode(m);\n\t\t\t\tif(range.s.r > R) range.s.r = R; if(range.e.r < R) range.e.r = R;\n\t\t\t\tif(range.s.c > C) range.s.c = C; if(range.e.c < C) range.e.c = C;\n\t\t\t\tif(!m.length) continue;\n\t\t\t\tvar o = {t:'s', v:m};\n\t\t\t\tif(opts.raw || !m.trim().length || _t == 's'){}\n\t\t\t\telse if(m === 'TRUE') o = {t:'b', v:true};\n\t\t\t\telse if(m === 'FALSE') o = {t:'b', v:false};\n\t\t\t\telse if(!isNaN(fuzzynum(m))) o = {t:'n', v:fuzzynum(m)};\n\t\t\t\telse if(!isNaN(fuzzydate(m).getDate())) {\n\t\t\t\t\to = ({t:'d', v:parseDate(m)});\n\t\t\t\t\tif(!opts.cellDates) o = ({t:'n', v:datenum(o.v)});\n\t\t\t\t\to.z = opts.dateNF || SSF._table[14];\n\t\t\t\t}\n\t\t\t\tif(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = o; }\n\t\t\t\telse ws[encode_cell({r:R, c:C})] = o;\n\t\t\t\tC += CS;\n\t\t\t}\n\t\t}\n\t\tws['!ref'] = encode_range(range);\n\t\tif(merges.length) ws[\"!merges\"] = merges;\n\t\treturn ws;\n\t}\n\tfunction html_to_book(str, opts) {\n\t\tvar mtch = str.match(/[\\s\\S]*?<\\/table>/gi);\n\t\tif(!mtch || mtch.length == 0) throw new Error(\"Invalid HTML: could not find
\");\n\t\tif(mtch.length == 1) return sheet_to_workbook(html_to_sheet(mtch[0], opts), opts);\n\t\tvar wb = utils.book_new();\n\t\tmtch.forEach(function(s, idx) { utils.book_append_sheet(wb, html_to_sheet(s, opts), \"Sheet\" + (idx+1)); });\n\t\treturn wb;\n\t}\n\tfunction make_html_row(ws, r, R, o) {\n\t\tvar M = (ws['!merges'] ||[]);\n\t\tvar oo = [];\n\t\tfor(var C = r.s.c; C <= r.e.c; ++C) {\n\t\t\tvar RS = 0, CS = 0;\n\t\t\tfor(var j = 0; j < M.length; ++j) {\n\t\t\t\tif(M[j].s.r > R || M[j].s.c > C) continue;\n\t\t\t\tif(M[j].e.r < R || M[j].e.c < C) continue;\n\t\t\t\tif(M[j].s.r < R || M[j].s.c < C) { RS = -1; break; }\n\t\t\t\tRS = M[j].e.r - M[j].s.r + 1; CS = M[j].e.c - M[j].s.c + 1; break;\n\t\t\t}\n\t\t\tif(RS < 0) continue;\n\t\t\tvar coord = encode_cell({r:R,c:C});\n\t\t\tvar cell = o.dense ? (ws[R]||[])[C] : ws[coord];\n\t\t\t/* TODO: html entities */\n\t\t\tvar w = (cell && cell.v != null) && (cell.h || escapehtml(cell.w || (format_cell(cell), cell.w) || \"\")) || \"\";\n\t\t\tvar sp = ({});\n\t\t\tif(RS > 1) sp.rowspan = RS;\n\t\t\tif(CS > 1) sp.colspan = CS;\n\t\t\tif(o.editable) w = '' + w + '';\n\t\t\telse if(cell) {\n\t\t\t\tsp[\"data-t\"] = cell && cell.t || 'z';\n\t\t\t\tif(cell.v != null) sp[\"data-v\"] = cell.v;\n\t\t\t\tif(cell.z != null) sp[\"data-z\"] = cell.z;\n\t\t\t\tif(cell.l && (cell.l.Target || \"#\").charAt(0) != \"#\") w = '' + w + '';\n\t\t\t}\n\t\t\tsp.id = (o.id || \"sjs\") + \"-\" + coord;\n\t\t\too.push(writextag('td', w, sp));\n\t\t}\n\t\tvar preamble = \"\";\n\t\treturn preamble + oo.join(\"\") + \"\";\n\t}\n\tfunction make_html_preamble(ws, R, o) {\n\t\tvar out = [];\n\t\treturn out.join(\"\") + '';\n\t}\n\tvar _BEGIN = 'SheetJS Table Export';\n\tvar _END = '';\n\tfunction sheet_to_html(ws, opts/*, wb:?Workbook*/) {\n\t\tvar o = opts || {};\n\t\tvar header = o.header != null ? o.header : _BEGIN;\n\t\tvar footer = o.footer != null ? o.footer : _END;\n\t\tvar out = [header];\n\t\tvar r = decode_range(ws['!ref']);\n\t\to.dense = Array.isArray(ws);\n\t\tout.push(make_html_preamble(ws, r, o));\n\t\tfor(var R = r.s.r; R <= r.e.r; ++R) out.push(make_html_row(ws, r, R, o));\n\t\tout.push(\"
\" + footer);\n\t\treturn out.join(\"\");\n\n\t}\n\treturn {\n\t\tto_workbook: html_to_book,\n\t\tto_sheet: html_to_sheet,\n\t\t_row: make_html_row,\n\t\tBEGIN: _BEGIN,\n\t\tEND: _END,\n\t\t_preamble: make_html_preamble,\n\t\tfrom_sheet: sheet_to_html\n\t};\n})();\n\nfunction sheet_add_dom(ws, table, _opts) {\n\tvar opts = _opts || {};\n\tif(DENSE != null) opts.dense = DENSE;\n\tvar or_R = 0, or_C = 0;\n\tif(opts.origin != null) {\n\t\tif(typeof opts.origin == 'number') or_R = opts.origin;\n\t\telse {\n\t\t\tvar _origin = typeof opts.origin == \"string\" ? decode_cell(opts.origin) : opts.origin;\n\t\t\tor_R = _origin.r; or_C = _origin.c;\n\t\t}\n\t}\n\tvar rows = table.getElementsByTagName('tr');\n\tvar sheetRows = Math.min(opts.sheetRows||10000000, rows.length);\n\tvar range = {s:{r:0,c:0},e:{r:or_R,c:or_C}};\n\tif(ws[\"!ref\"]) {\n\t\tvar _range = decode_range(ws[\"!ref\"]);\n\t\trange.s.r = Math.min(range.s.r, _range.s.r);\n\t\trange.s.c = Math.min(range.s.c, _range.s.c);\n\t\trange.e.r = Math.max(range.e.r, _range.e.r);\n\t\trange.e.c = Math.max(range.e.c, _range.e.c);\n\t\tif(or_R == -1) range.e.r = or_R = _range.e.r + 1;\n\t}\n\tvar merges = [], midx = 0;\n\tvar rowinfo = ws[\"!rows\"] || (ws[\"!rows\"] = []);\n\tvar _R = 0, R = 0, _C = 0, C = 0, RS = 0, CS = 0;\n\tif(!ws[\"!cols\"]) ws['!cols'] = [];\n\tfor(; _R < rows.length && R < sheetRows; ++_R) {\n\t\tvar row = rows[_R];\n\t\tif (is_dom_element_hidden(row)) {\n\t\t\tif (opts.display) continue;\n\t\t\trowinfo[R] = {hidden: true};\n\t\t}\n\t\tvar elts = (row.children);\n\t\tfor(_C = C = 0; _C < elts.length; ++_C) {\n\t\t\tvar elt = elts[_C];\n\t\t\tif (opts.display && is_dom_element_hidden(elt)) continue;\n\t\t\tvar v = elt.hasAttribute('data-v') ? elt.getAttribute('data-v') : elt.hasAttribute('v') ? elt.getAttribute('v') : htmldecode(elt.innerHTML);\n\t\t\tvar z = elt.getAttribute('data-z') || elt.getAttribute('z');\n\t\t\tfor(midx = 0; midx < merges.length; ++midx) {\n\t\t\t\tvar m = merges[midx];\n\t\t\t\tif(m.s.c == C + or_C && m.s.r < R + or_R && R + or_R <= m.e.r) { C = m.e.c+1 - or_C; midx = -1; }\n\t\t\t}\n\t\t\t/* TODO: figure out how to extract nonstandard mso- style */\n\t\t\tCS = +elt.getAttribute(\"colspan\") || 1;\n\t\t\tif( ((RS = (+elt.getAttribute(\"rowspan\") || 1)))>1 || CS>1) merges.push({s:{r:R + or_R,c:C + or_C},e:{r:R + or_R + (RS||1) - 1, c:C + or_C + (CS||1) - 1}});\n\t\t\tvar o = {t:'s', v:v};\n\t\t\tvar _t = elt.getAttribute(\"data-t\") || elt.getAttribute(\"t\") || \"\";\n\t\t\tif(v != null) {\n\t\t\t\tif(v.length == 0) o.t = _t || 'z';\n\t\t\t\telse if(opts.raw || v.trim().length == 0 || _t == \"s\"){}\n\t\t\t\telse if(v === 'TRUE') o = {t:'b', v:true};\n\t\t\t\telse if(v === 'FALSE') o = {t:'b', v:false};\n\t\t\t\telse if(!isNaN(fuzzynum(v))) o = {t:'n', v:fuzzynum(v)};\n\t\t\t\telse if(!isNaN(fuzzydate(v).getDate())) {\n\t\t\t\t\to = ({t:'d', v:parseDate(v)});\n\t\t\t\t\tif(!opts.cellDates) o = ({t:'n', v:datenum(o.v)});\n\t\t\t\t\to.z = opts.dateNF || SSF._table[14];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(o.z === undefined && z != null) o.z = z;\n\t\t\t/* The first link is used. Links are assumed to be fully specified.\n\t\t\t * TODO: The right way to process relative links is to make a new */\n\t\t\tvar l = \"\", Aelts = elt.getElementsByTagName(\"A\");\n\t\t\tif(Aelts && Aelts.length) for(var Aelti = 0; Aelti < Aelts.length; ++Aelti)\tif(Aelts[Aelti].hasAttribute(\"href\")) {\n\t\t\t\tl = Aelts[Aelti].getAttribute(\"href\"); if(l.charAt(0) != \"#\") break;\n\t\t\t}\n\t\t\tif(l && l.charAt(0) != \"#\") o.l = ({ Target: l });\n\t\t\tif(opts.dense) { if(!ws[R + or_R]) ws[R + or_R] = []; ws[R + or_R][C + or_C] = o; }\n\t\t\telse ws[encode_cell({c:C + or_C, r:R + or_R})] = o;\n\t\t\tif(range.e.c < C + or_C) range.e.c = C + or_C;\n\t\t\tC += CS;\n\t\t}\n\t\t++R;\n\t}\n\tif(merges.length) ws['!merges'] = (ws[\"!merges\"] || []).concat(merges);\n\trange.e.r = Math.max(range.e.r, R - 1 + or_R);\n\tws['!ref'] = encode_range(range);\n\tif(R >= sheetRows) ws['!fullref'] = encode_range((range.e.r = rows.length-_R+R-1 + or_R,range)); // We can count the real number of rows to parse but we don't to improve the performance\n\treturn ws;\n}\n\nfunction parse_dom_table(table, _opts) {\n\tvar opts = _opts || {};\n\tvar ws = opts.dense ? ([]) : ({});\n\treturn sheet_add_dom(ws, table, _opts);\n}\n\nfunction table_to_book(table, opts) {\n\treturn sheet_to_workbook(parse_dom_table(table, opts), opts);\n}\n\nfunction is_dom_element_hidden(element) {\n\tvar display = '';\n\tvar get_computed_style = get_get_computed_style_function(element);\n\tif(get_computed_style) display = get_computed_style(element).getPropertyValue('display');\n\tif(!display) display = element.style.display; // Fallback for cases when getComputedStyle is not available (e.g. an old browser or some Node.js environments) or doesn't work (e.g. if the element is not inserted to a document)\n\treturn display === 'none';\n}\n\n/* global getComputedStyle */\nfunction get_get_computed_style_function(element) {\n\t// The proper getComputedStyle implementation is the one defined in the element window\n\tif(element.ownerDocument.defaultView && typeof element.ownerDocument.defaultView.getComputedStyle === 'function') return element.ownerDocument.defaultView.getComputedStyle;\n\t// If it is not available, try to get one from the global namespace\n\tif(typeof getComputedStyle === 'function') return getComputedStyle;\n\treturn null;\n}\n/* OpenDocument */\nvar parse_content_xml = (function() {\n\n\tvar parse_text_p = function(text) {\n\t\t/* 6.1.2 White Space Characters */\n\t\tvar fixed = text\n\t\t\t.replace(/[\\t\\r\\n]/g, \" \").trim().replace(/ +/g, \" \")\n\t\t\t.replace(//g,\" \")\n\t\t\t.replace(//g, function($$,$1) { return Array(parseInt($1,10)+1).join(\" \"); })\n\t\t\t.replace(/]*\\/>/g,\"\\t\")\n\t\t\t.replace(//g,\"\\n\");\n\t\tvar v = unescapexml(fixed.replace(/<[^>]*>/g,\"\"));\n\n\t\treturn [v];\n\t};\n\n\tvar number_formats = {\n\t\t/* ods name: [short ssf fmt, long ssf fmt] */\n\t\tday: [\"d\", \"dd\"],\n\t\tmonth: [\"m\", \"mm\"],\n\t\tyear: [\"y\", \"yy\"],\n\t\thours: [\"h\", \"hh\"],\n\t\tminutes: [\"m\", \"mm\"],\n\t\tseconds: [\"s\", \"ss\"],\n\t\t\"am-pm\": [\"A/P\", \"AM/PM\"],\n\t\t\"day-of-week\": [\"ddd\", \"dddd\"],\n\t\tera: [\"e\", \"ee\"],\n\t\t/* there is no native representation of LO \"Q\" format */\n\t\tquarter: [\"\\\\Qm\", \"m\\\\\\\"th quarter\\\"\"]\n\t};\n\n\treturn function pcx(d, _opts) {\n\t\tvar opts = _opts || {};\n\t\tif(DENSE != null && opts.dense == null) opts.dense = DENSE;\n\t\tvar str = xlml_normalize(d);\n\t\tvar state = [], tmp;\n\t\tvar tag;\n\t\tvar NFtag = {name:\"\"}, NF = \"\", pidx = 0;\n\t\tvar sheetag;\n\t\tvar rowtag;\n\t\tvar Sheets = {}, SheetNames = [];\n\t\tvar ws = opts.dense ? ([]) : ({});\n\t\tvar Rn, q;\n\t\tvar ctag = ({value:\"\"});\n\t\tvar textp = \"\", textpidx = 0, textptag;\n\t\tvar textR = [];\n\t\tvar R = -1, C = -1, range = {s: {r:1000000,c:10000000}, e: {r:0, c:0}};\n\t\tvar row_ol = 0;\n\t\tvar number_format_map = {};\n\t\tvar merges = [], mrange = {}, mR = 0, mC = 0;\n\t\tvar rowinfo = [], rowpeat = 1, colpeat = 1;\n\t\tvar arrayf = [];\n\t\tvar WB = {Names:[]};\n\t\tvar atag = ({});\n\t\tvar _Ref = [\"\", \"\"];\n\t\tvar comments = [], comment = ({});\n\t\tvar creator = \"\", creatoridx = 0;\n\t\tvar isstub = false, intable = false;\n\t\tvar i = 0;\n\t\txlmlregex.lastIndex = 0;\n\t\tstr = str.replace(//mg,\"\").replace(//gm,\"\");\n\t\twhile((Rn = xlmlregex.exec(str))) switch((Rn[3]=Rn[3].replace(/_.*$/,\"\"))) {\n\n\t\t\tcase 'table': case '工作表': // 9.1.2 \n\t\t\t\tif(Rn[1]==='/') {\n\t\t\t\t\tif(range.e.c >= range.s.c && range.e.r >= range.s.r) ws['!ref'] = encode_range(range);\n\t\t\t\t\telse ws['!ref'] = \"A1:A1\";\n\t\t\t\t\tif(opts.sheetRows > 0 && opts.sheetRows <= range.e.r) {\n\t\t\t\t\t\tws['!fullref'] = ws['!ref'];\n\t\t\t\t\t\trange.e.r = opts.sheetRows - 1;\n\t\t\t\t\t\tws['!ref'] = encode_range(range);\n\t\t\t\t\t}\n\t\t\t\t\tif(merges.length) ws['!merges'] = merges;\n\t\t\t\t\tif(rowinfo.length) ws[\"!rows\"] = rowinfo;\n\t\t\t\t\tsheetag.name = sheetag['名称'] || sheetag.name;\n\t\t\t\t\tif(typeof JSON !== 'undefined') JSON.stringify(sheetag);\n\t\t\t\t\tSheetNames.push(sheetag.name);\n\t\t\t\t\tSheets[sheetag.name] = ws;\n\t\t\t\t\tintable = false;\n\t\t\t\t}\n\t\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') {\n\t\t\t\t\tsheetag = parsexmltag(Rn[0], false);\n\t\t\t\t\tR = C = -1;\n\t\t\t\t\trange.s.r = range.s.c = 10000000; range.e.r = range.e.c = 0;\n\t\t\t\t\tws = opts.dense ? ([]) : ({}); merges = [];\n\t\t\t\t\trowinfo = [];\n\t\t\t\t\tintable = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'table-row-group': // 9.1.9 \n\t\t\t\tif(Rn[1] === \"/\") --row_ol; else ++row_ol;\n\t\t\t\tbreak;\n\t\t\tcase 'table-row': case '行': // 9.1.3 \n\t\t\t\tif(Rn[1] === '/') { R+=rowpeat; rowpeat = 1; break; }\n\t\t\t\trowtag = parsexmltag(Rn[0], false);\n\t\t\t\tif(rowtag['行号']) R = rowtag['行号'] - 1; else if(R == -1) R = 0;\n\t\t\t\trowpeat = +rowtag['number-rows-repeated'] || 1;\n\t\t\t\t/* TODO: remove magic */\n\t\t\t\tif(rowpeat < 10) for(i = 0; i < rowpeat; ++i) if(row_ol > 0) rowinfo[R + i] = {level: row_ol};\n\t\t\t\tC = -1; break;\n\t\t\tcase 'covered-table-cell': // 9.1.5 \n\t\t\t\tif(Rn[1] !== '/') ++C;\n\t\t\t\tif(opts.sheetStubs) {\n\t\t\t\t\tif(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = {t:'z'}; }\n\t\t\t\t\telse ws[encode_cell({r:R,c:C})] = {t:'z'};\n\t\t\t\t}\n\t\t\t\ttextp = \"\"; textR = [];\n\t\t\t\tbreak; /* stub */\n\t\t\tcase 'table-cell': case '数据':\n\t\t\t\tif(Rn[0].charAt(Rn[0].length-2) === '/') {\n\t\t\t\t\t++C;\n\t\t\t\t\tctag = parsexmltag(Rn[0], false);\n\t\t\t\t\tcolpeat = parseInt(ctag['number-columns-repeated']||\"1\", 10);\n\t\t\t\t\tq = ({t:'z', v:null});\n\t\t\t\t\tif(ctag.formula && opts.cellFormula != false) q.f = ods_to_csf_formula(unescapexml(ctag.formula));\n\t\t\t\t\tif((ctag['数据类型'] || ctag['value-type']) == \"string\") {\n\t\t\t\t\t\tq.t = \"s\"; q.v = unescapexml(ctag['string-value'] || \"\");\n\t\t\t\t\t\tif(opts.dense) {\n\t\t\t\t\t\t\tif(!ws[R]) ws[R] = [];\n\t\t\t\t\t\t\tws[R][C] = q;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tws[encode_cell({r:R,c:C})] = q;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tC+= colpeat-1;\n\t\t\t\t} else if(Rn[1]!=='/') {\n\t\t\t\t\t++C;\n\t\t\t\t\ttextp = \"\"; textpidx = 0; textR = [];\n\t\t\t\t\tcolpeat = 1;\n\t\t\t\t\tvar rptR = rowpeat ? R + rowpeat - 1 : R;\n\t\t\t\t\tif(C > range.e.c) range.e.c = C;\n\t\t\t\t\tif(C < range.s.c) range.s.c = C;\n\t\t\t\t\tif(R < range.s.r) range.s.r = R;\n\t\t\t\t\tif(rptR > range.e.r) range.e.r = rptR;\n\t\t\t\t\tctag = parsexmltag(Rn[0], false);\n\t\t\t\t\tcomments = []; comment = ({});\n\t\t\t\t\tq = ({t:ctag['数据类型'] || ctag['value-type'], v:null});\n\t\t\t\t\tif(opts.cellFormula) {\n\t\t\t\t\t\tif(ctag.formula) ctag.formula = unescapexml(ctag.formula);\n\t\t\t\t\t\tif(ctag['number-matrix-columns-spanned'] && ctag['number-matrix-rows-spanned']) {\n\t\t\t\t\t\t\tmR = parseInt(ctag['number-matrix-rows-spanned'],10) || 0;\n\t\t\t\t\t\t\tmC = parseInt(ctag['number-matrix-columns-spanned'],10) || 0;\n\t\t\t\t\t\t\tmrange = {s: {r:R,c:C}, e:{r:R + mR-1,c:C + mC-1}};\n\t\t\t\t\t\t\tq.F = encode_range(mrange);\n\t\t\t\t\t\t\tarrayf.push([mrange, q.F]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(ctag.formula) q.f = ods_to_csf_formula(ctag.formula);\n\t\t\t\t\t\telse for(i = 0; i < arrayf.length; ++i)\n\t\t\t\t\t\t\tif(R >= arrayf[i][0].s.r && R <= arrayf[i][0].e.r)\n\t\t\t\t\t\t\t\tif(C >= arrayf[i][0].s.c && C <= arrayf[i][0].e.c)\n\t\t\t\t\t\t\t\t\tq.F = arrayf[i][1];\n\t\t\t\t\t}\n\t\t\t\t\tif(ctag['number-columns-spanned'] || ctag['number-rows-spanned']) {\n\t\t\t\t\t\tmR = parseInt(ctag['number-rows-spanned'],10) || 0;\n\t\t\t\t\t\tmC = parseInt(ctag['number-columns-spanned'],10) || 0;\n\t\t\t\t\t\tmrange = {s: {r:R,c:C}, e:{r:R + mR-1,c:C + mC-1}};\n\t\t\t\t\t\tmerges.push(mrange);\n\t\t\t\t\t}\n\n\t\t\t\t\t/* 19.675.2 table:number-columns-repeated */\n\t\t\t\t\tif(ctag['number-columns-repeated']) colpeat = parseInt(ctag['number-columns-repeated'], 10);\n\n\t\t\t\t\t/* 19.385 office:value-type */\n\t\t\t\t\tswitch(q.t) {\n\t\t\t\t\t\tcase 'boolean': q.t = 'b'; q.v = parsexmlbool(ctag['boolean-value']); break;\n\t\t\t\t\t\tcase 'float': q.t = 'n'; q.v = parseFloat(ctag.value); break;\n\t\t\t\t\t\tcase 'percentage': q.t = 'n'; q.v = parseFloat(ctag.value); break;\n\t\t\t\t\t\tcase 'currency': q.t = 'n'; q.v = parseFloat(ctag.value); break;\n\t\t\t\t\t\tcase 'date': q.t = 'd'; q.v = parseDate(ctag['date-value']);\n\t\t\t\t\t\t\tif(!opts.cellDates) { q.t = 'n'; q.v = datenum(q.v); }\n\t\t\t\t\t\t\tq.z = 'm/d/yy'; break;\n\t\t\t\t\t\tcase 'time': q.t = 'n'; q.v = parse_isodur(ctag['time-value'])/86400;\n\t\t\t\t\t\t\tif(opts.cellDates) { q.t = 'd'; q.v = numdate(q.v); }\n\t\t\t\t\t\t\tq.z = 'HH:MM:SS'; break;\n\t\t\t\t\t\tcase 'number': q.t = 'n'; q.v = parseFloat(ctag['数据数值']); break;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tif(q.t === 'string' || q.t === 'text' || !q.t) {\n\t\t\t\t\t\t\t\tq.t = 's';\n\t\t\t\t\t\t\t\tif(ctag['string-value'] != null) { textp = unescapexml(ctag['string-value']); textR = []; }\n\t\t\t\t\t\t\t} else throw new Error('Unsupported value type ' + q.t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tisstub = false;\n\t\t\t\t\tif(q.t === 's') {\n\t\t\t\t\t\tq.v = textp || '';\n\t\t\t\t\t\tif(textR.length) q.R = textR;\n\t\t\t\t\t\tisstub = textpidx == 0;\n\t\t\t\t\t}\n\t\t\t\t\tif(atag.Target) q.l = atag;\n\t\t\t\t\tif(comments.length > 0) { q.c = comments; comments = []; }\n\t\t\t\t\tif(textp && opts.cellText !== false) q.w = textp;\n\t\t\t\t\tif(isstub) { q.t = \"z\"; delete q.v; }\n\t\t\t\t\tif(!isstub || opts.sheetStubs) {\n\t\t\t\t\t\tif(!(opts.sheetRows && opts.sheetRows <= R)) {\n\t\t\t\t\t\t\tfor(var rpt = 0; rpt < rowpeat; ++rpt) {\n\t\t\t\t\t\t\t\tcolpeat = parseInt(ctag['number-columns-repeated']||\"1\", 10);\n\t\t\t\t\t\t\t\tif(opts.dense) {\n\t\t\t\t\t\t\t\t\tif(!ws[R + rpt]) ws[R + rpt] = [];\n\t\t\t\t\t\t\t\t\tws[R + rpt][C] = rpt == 0 ? q : dup(q);\n\t\t\t\t\t\t\t\t\twhile(--colpeat > 0) ws[R + rpt][C + colpeat] = dup(q);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tws[encode_cell({r:R + rpt,c:C})] = q;\n\t\t\t\t\t\t\t\t\twhile(--colpeat > 0) ws[encode_cell({r:R + rpt,c:C + colpeat})] = dup(q);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(range.e.c <= C) range.e.c = C;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcolpeat = parseInt(ctag['number-columns-repeated']||\"1\", 10);\n\t\t\t\t\tC += colpeat-1; colpeat = 0;\n\t\t\t\t\tq = {};\n\t\t\t\t\ttextp = \"\"; textR = [];\n\t\t\t\t}\n\t\t\t\tatag = ({});\n\t\t\t\tbreak; // 9.1.4 \n\n\t\t\t/* pure state */\n\t\t\tcase 'document': // TODO: is the root for FODS\n\t\t\tcase 'document-content': case '电子表格文档': // 3.1.3.2 \n\t\t\tcase 'spreadsheet': case '主体': // 3.7 \n\t\t\tcase 'scripts': // 3.12 \n\t\t\tcase 'styles': // TODO \n\t\t\tcase 'font-face-decls': // 3.14 \n\t\t\tcase 'master-styles': // 3.15.4 -- relevant for FODS\n\t\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;}\n\t\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);\n\t\t\t\tbreak;\n\n\t\t\tcase 'annotation': // 14.1 \n\t\t\t\tif(Rn[1]==='/'){\n\t\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;\n\t\t\t\t\tcomment.t = textp;\n\t\t\t\t\tif(textR.length) comment.R = textR;\n\t\t\t\t\tcomment.a = creator;\n\t\t\t\t\tcomments.push(comment);\n\t\t\t\t}\n\t\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') {state.push([Rn[3], false]);}\n\t\t\t\tcreator = \"\"; creatoridx = 0;\n\t\t\t\ttextp = \"\"; textpidx = 0; textR = [];\n\t\t\t\tbreak;\n\n\t\t\tcase 'creator': // 4.3.2.7 \n\t\t\t\tif(Rn[1]==='/') { creator = str.slice(creatoridx,Rn.index); }\n\t\t\t\telse creatoridx = Rn.index + Rn[0].length;\n\t\t\t\tbreak;\n\n\t\t\t/* ignore state */\n\t\t\tcase 'meta': case '元数据': // TODO: FODS/UOF\n\t\t\tcase 'settings': // TODO: \n\t\t\tcase 'config-item-set': // TODO: \n\t\t\tcase 'config-item-map-indexed': // TODO: \n\t\t\tcase 'config-item-map-entry': // TODO: \n\t\t\tcase 'config-item-map-named': // TODO: \n\t\t\tcase 'shapes': // 9.2.8 \n\t\t\tcase 'frame': // 10.4.2 \n\t\t\tcase 'text-box': // 10.4.3 \n\t\t\tcase 'image': // 10.4.4 \n\t\t\tcase 'data-pilot-tables': // 9.6.2 \n\t\t\tcase 'list-style': // 16.30 \n\t\t\tcase 'form': // 13.13 \n\t\t\tcase 'dde-links': // 9.8 \n\t\t\tcase 'event-listeners': // TODO\n\t\t\tcase 'chart': // TODO\n\t\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;}\n\t\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], false]);\n\t\t\t\ttextp = \"\"; textpidx = 0; textR = [];\n\t\t\t\tbreak;\n\n\t\t\tcase 'scientific-number': // TODO: \n\t\t\t\tbreak;\n\t\t\tcase 'currency-symbol': // TODO: \n\t\t\t\tbreak;\n\t\t\tcase 'currency-style': // TODO: \n\t\t\t\tbreak;\n\t\t\tcase 'number-style': // 16.27.2 \n\t\t\tcase 'percentage-style': // 16.27.9 \n\t\t\tcase 'date-style': // 16.27.10 \n\t\t\tcase 'time-style': // 16.27.18 \n\t\t\t\tif(Rn[1]==='/'){\n\t\t\t\t\tnumber_format_map[NFtag.name] = NF;\n\t\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;\n\t\t\t\t} else if(Rn[0].charAt(Rn[0].length-2) !== '/') {\n\t\t\t\t\tNF = \"\";\n\t\t\t\t\tNFtag = parsexmltag(Rn[0], false);\n\t\t\t\t\tstate.push([Rn[3], true]);\n\t\t\t\t} break;\n\n\t\t\tcase 'script': break; // 3.13 \n\t\t\tcase 'libraries': break; // TODO: \n\t\t\tcase 'automatic-styles': break; // 3.15.3 \n\n\t\t\tcase 'default-style': // TODO: \n\t\t\tcase 'page-layout': break; // TODO: \n\t\t\tcase 'style': // 16.2 \n\t\t\t\tbreak;\n\t\t\tcase 'map': break; // 16.3 \n\t\t\tcase 'font-face': break; // 16.21 \n\n\t\t\tcase 'paragraph-properties': break; // 17.6 \n\t\t\tcase 'table-properties': break; // 17.15 \n\t\t\tcase 'table-column-properties': break; // 17.16 \n\t\t\tcase 'table-row-properties': break; // 17.17 \n\t\t\tcase 'table-cell-properties': break; // 17.18 \n\n\t\t\tcase 'number': // 16.27.3 \n\t\t\t\tswitch(state[state.length-1][0]) {\n\t\t\t\t\tcase 'time-style':\n\t\t\t\t\tcase 'date-style':\n\t\t\t\t\t\ttag = parsexmltag(Rn[0], false);\n\t\t\t\t\t\tNF += number_formats[Rn[3]][tag.style==='long'?1:0]; break;\n\t\t\t\t} break;\n\n\t\t\tcase 'fraction': break; // TODO 16.27.6 \n\n\t\t\tcase 'day': // 16.27.11 \n\t\t\tcase 'month': // 16.27.12 \n\t\t\tcase 'year': // 16.27.13 \n\t\t\tcase 'era': // 16.27.14 \n\t\t\tcase 'day-of-week': // 16.27.15 \n\t\t\tcase 'week-of-year': // 16.27.16 \n\t\t\tcase 'quarter': // 16.27.17 \n\t\t\tcase 'hours': // 16.27.19 \n\t\t\tcase 'minutes': // 16.27.20 \n\t\t\tcase 'seconds': // 16.27.21 \n\t\t\tcase 'am-pm': // 16.27.22 \n\t\t\t\tswitch(state[state.length-1][0]) {\n\t\t\t\t\tcase 'time-style':\n\t\t\t\t\tcase 'date-style':\n\t\t\t\t\t\ttag = parsexmltag(Rn[0], false);\n\t\t\t\t\t\tNF += number_formats[Rn[3]][tag.style==='long'?1:0]; break;\n\t\t\t\t} break;\n\n\t\t\tcase 'boolean-style': break; // 16.27.23 \n\t\t\tcase 'boolean': break; // 16.27.24 \n\t\t\tcase 'text-style': break; // 16.27.25 \n\t\t\tcase 'text': // 16.27.26 \n\t\t\t\tif(Rn[0].slice(-2) === \"/>\") break;\n\t\t\t\telse if(Rn[1]===\"/\") switch(state[state.length-1][0]) {\n\t\t\t\t\tcase 'number-style':\n\t\t\t\t\tcase 'date-style':\n\t\t\t\t\tcase 'time-style':\n\t\t\t\t\t\tNF += str.slice(pidx, Rn.index);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse pidx = Rn.index + Rn[0].length;\n\t\t\t\tbreak;\n\n\t\t\tcase 'named-range': // 9.4.12 \n\t\t\t\ttag = parsexmltag(Rn[0], false);\n\t\t\t\t_Ref = ods_to_csf_3D(tag['cell-range-address']);\n\t\t\t\tvar nrange = ({Name:tag.name, Ref:_Ref[0] + '!' + _Ref[1]});\n\t\t\t\tif(intable) nrange.Sheet = SheetNames.length;\n\t\t\t\tWB.Names.push(nrange);\n\t\t\t\tbreak;\n\n\t\t\tcase 'text-content': break; // 16.27.27 \n\t\t\tcase 'text-properties': break; // 16.27.27 \n\t\t\tcase 'embedded-text': break; // 16.27.4 \n\n\t\t\tcase 'body': case '电子表格': break; // 3.3 16.9.6 19.726.3\n\n\t\t\tcase 'forms': break; // 12.25.2 13.2\n\t\t\tcase 'table-column': break; // 9.1.6 \n\t\t\tcase 'table-header-rows': break; // 9.1.7 \n\t\t\tcase 'table-rows': break; // 9.1.12 \n\t\t\t/* TODO: outline levels */\n\t\t\tcase 'table-column-group': break; // 9.1.10 \n\t\t\tcase 'table-header-columns': break; // 9.1.11 \n\t\t\tcase 'table-columns': break; // 9.1.12 \n\n\t\t\tcase 'null-date': break; // 9.4.2 TODO: date1904\n\n\t\t\tcase 'graphic-properties': break; // 17.21 \n\t\t\tcase 'calculation-settings': break; // 9.4.1 \n\t\t\tcase 'named-expressions': break; // 9.4.11 \n\t\t\tcase 'label-range': break; // 9.4.9 \n\t\t\tcase 'label-ranges': break; // 9.4.10 \n\t\t\tcase 'named-expression': break; // 9.4.13 \n\t\t\tcase 'sort': break; // 9.4.19 \n\t\t\tcase 'sort-by': break; // 9.4.20 \n\t\t\tcase 'sort-groups': break; // 9.4.22 \n\n\t\t\tcase 'tab': break; // 6.1.4 \n\t\t\tcase 'line-break': break; // 6.1.5 \n\t\t\tcase 'span': break; // 6.1.7 \n\t\t\tcase 'p': case '文本串': // 5.1.3 \n\t\t\t\tif(['master-styles'].indexOf(state[state.length-1][0]) > -1) break;\n\t\t\t\tif(Rn[1]==='/' && (!ctag || !ctag['string-value'])) {\n\t\t\t\t\tvar ptp = parse_text_p(str.slice(textpidx,Rn.index), textptag);\n\t\t\t\t\ttextp = (textp.length > 0 ? textp + \"\\n\" : \"\") + ptp[0];\n\t\t\t\t} else { textptag = parsexmltag(Rn[0], false); textpidx = Rn.index + Rn[0].length; }\n\t\t\t\tbreak; // \n\t\t\tcase 's': break; // \n\n\t\t\tcase 'database-range': // 9.4.15 \n\t\t\t\tif(Rn[1]==='/') break;\n\t\t\t\ttry {\n\t\t\t\t\t_Ref = ods_to_csf_3D(parsexmltag(Rn[0])['target-range-address']);\n\t\t\t\t\tSheets[_Ref[0]]['!autofilter'] = { ref:_Ref[1] };\n\t\t\t\t} catch(e) {/* empty */}\n\t\t\t\tbreak;\n\n\t\t\tcase 'date': break; // <*:date>\n\n\t\t\tcase 'object': break; // 10.4.6.2 \n\t\t\tcase 'title': case '标题': break; // <*:title> OR \n\t\t\tcase 'desc': break; // <*:desc>\n\t\t\tcase 'binary-data': break; // 10.4.5 TODO: b64 blob\n\n\t\t\t/* 9.2 Advanced Tables */\n\t\t\tcase 'table-source': break; // 9.2.6\n\t\t\tcase 'scenario': break; // 9.2.6\n\n\t\t\tcase 'iteration': break; // 9.4.3 \n\t\t\tcase 'content-validations': break; // 9.4.4 \n\t\t\tcase 'filter': break; // 9.5.2 \n\t\t\tcase 'filter-and': break; // 9.5.3 \n\t\t\tcase 'filter-or': break; // 9.5.4 \n\t\t\tcase 'filter-condition': break; // 9.5.5 \n\n\t\t\tcase 'list-level-style-bullet': break; // 16.31 \n\t\t\tcase 'page-count': break; // TODO \n\t\t\tcase 'time': break; // TODO \n\n\t\t\t/* 9.3 Advanced Table Cells */\n\t\t\tcase 'cell-range-source': break; // 9.3.1 \n\t\t\tcase 'property': break; // 13.8 \n\n\t\t\tcase 'a': // 6.1.8 hyperlink\n\t\t\t\tif(Rn[1]!== '/') {\n\t\t\t\t\tatag = parsexmltag(Rn[0], false);\n\t\t\t\t\tif(!atag.href) break;\n\t\t\t\t\tatag.Target = unescapexml(atag.href); delete atag.href;\n\t\t\t\t\tif(atag.Target.charAt(0) == \"#\" && atag.Target.indexOf(\".\") > -1) {\n\t\t\t\t\t\t_Ref = ods_to_csf_3D(atag.Target.slice(1));\n\t\t\t\t\t\tatag.Target = \"#\" + _Ref[0] + \"!\" + _Ref[1];\n\t\t\t\t\t} else if(atag.Target.match(/^\\.\\.[\\\\\\/]/)) atag.Target = atag.Target.slice(3);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\t/* non-standard */\n\t\t\tcase 'table-protection': break;\n\t\t\tcase 'data-pilot-grand-total': break; // ',\n\t\t\t'',\n\t\t\t\t'',\n\t\t\t\t'',\n\t\t\t\t'',\n\t\t\t\t'',\n\t\t\t'',\n\t\t''\n\t].join(\"\");\n\n\tvar payload = '' + master_styles + '';\n\n\treturn function wso() {\n\t\treturn XML_HEADER + payload;\n\t};\n})();\nvar write_content_ods = (function() {\n\t/* 6.1.2 White Space Characters */\n\tvar write_text_p = function(text) {\n\t\treturn escapexml(text)\n\t\t\t.replace(/ +/g, function($$){return '';})\n\t\t\t.replace(/\\t/g, \"\")\n\t\t\t.replace(/\\n/g, \"\")\n\t\t\t.replace(/^ /, \"\").replace(/ $/, \"\");\n\t};\n\n\tvar null_cell_xml = ' \\n';\n\tvar covered_cell_xml = ' \\n';\n\tvar write_ws = function(ws, wb, i) {\n\t\t/* Section 9 Tables */\n\t\tvar o = [];\n\t\to.push(' \\n');\n\t\tvar R=0,C=0, range = decode_range(ws['!ref']||\"A1\");\n\t\tvar marr = ws['!merges'] || [], mi = 0;\n\t\tvar dense = Array.isArray(ws);\n\t\tif(ws[\"!cols\"]) {\n\t\t\tfor(C = 0; C <= range.e.c; ++C) o.push(' \\n');\n\t\t}\n\t\tvar H = \"\", ROWS = ws[\"!rows\"]||[];\n\t\tfor(R = 0; R < range.s.r; ++R) {\n\t\t\tH = ROWS[R] ? ' table:style-name=\"ro' + ROWS[R].ods + '\"' : \"\";\n\t\t\to.push(' \\n');\n\t\t}\n\t\tfor(; R <= range.e.r; ++R) {\n\t\t\tH = ROWS[R] ? ' table:style-name=\"ro' + ROWS[R].ods + '\"' : \"\";\n\t\t\to.push(' \\n');\n\t\t\tfor(C=0; C < range.s.c; ++C) o.push(null_cell_xml);\n\t\t\tfor(; C <= range.e.c; ++C) {\n\t\t\t\tvar skip = false, ct = {}, textp = \"\";\n\t\t\t\tfor(mi = 0; mi != marr.length; ++mi) {\n\t\t\t\t\tif(marr[mi].s.c > C) continue;\n\t\t\t\t\tif(marr[mi].s.r > R) continue;\n\t\t\t\t\tif(marr[mi].e.c < C) continue;\n\t\t\t\t\tif(marr[mi].e.r < R) continue;\n\t\t\t\t\tif(marr[mi].s.c != C || marr[mi].s.r != R) skip = true;\n\t\t\t\t\tct['table:number-columns-spanned'] = (marr[mi].e.c - marr[mi].s.c + 1);\n\t\t\t\t\tct['table:number-rows-spanned'] = (marr[mi].e.r - marr[mi].s.r + 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(skip) { o.push(covered_cell_xml); continue; }\n\t\t\t\tvar ref = encode_cell({r:R, c:C}), cell = dense ? (ws[R]||[])[C]: ws[ref];\n\t\t\t\tif(cell && cell.f) {\n\t\t\t\t\tct['table:formula'] = escapexml(csf_to_ods_formula(cell.f));\n\t\t\t\t\tif(cell.F) {\n\t\t\t\t\t\tif(cell.F.slice(0, ref.length) == ref) {\n\t\t\t\t\t\t\tvar _Fref = decode_range(cell.F);\n\t\t\t\t\t\t\tct['table:number-matrix-columns-spanned'] = (_Fref.e.c - _Fref.s.c + 1);\n\t\t\t\t\t\t\tct['table:number-matrix-rows-spanned'] = (_Fref.e.r - _Fref.s.r + 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(!cell) { o.push(null_cell_xml); continue; }\n\t\t\t\tswitch(cell.t) {\n\t\t\t\t\tcase 'b':\n\t\t\t\t\t\ttextp = (cell.v ? 'TRUE' : 'FALSE');\n\t\t\t\t\t\tct['office:value-type'] = \"boolean\";\n\t\t\t\t\t\tct['office:boolean-value'] = (cell.v ? 'true' : 'false');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'n':\n\t\t\t\t\t\ttextp = (cell.w||String(cell.v||0));\n\t\t\t\t\t\tct['office:value-type'] = \"float\";\n\t\t\t\t\t\tct['office:value'] = (cell.v||0);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 's': case 'str':\n\t\t\t\t\t\ttextp = cell.v == null ? \"\" : cell.v;\n\t\t\t\t\t\tct['office:value-type'] = \"string\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'd':\n\t\t\t\t\t\ttextp = (cell.w||(parseDate(cell.v).toISOString()));\n\t\t\t\t\t\tct['office:value-type'] = \"date\";\n\t\t\t\t\t\tct['office:date-value'] = (parseDate(cell.v).toISOString());\n\t\t\t\t\t\tct['table:style-name'] = \"ce1\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t//case 'e':\n\t\t\t\t\tdefault: o.push(null_cell_xml); continue;\n\t\t\t\t}\n\t\t\t\tvar text_p = write_text_p(textp);\n\t\t\t\tif(cell.l && cell.l.Target) {\n\t\t\t\t\tvar _tgt = cell.l.Target;\n\t\t\t\t\t_tgt = _tgt.charAt(0) == \"#\" ? \"#\" + csf_to_ods_3D(_tgt.slice(1)) : _tgt;\n\t\t\t\t\t// TODO: choose correct parent path format based on link delimiters\n\t\t\t\t\tif(_tgt.charAt(0) != \"#\" && !_tgt.match(/^\\w+:/)) _tgt = '../' + _tgt;\n\t\t\t\t\ttext_p = writextag('text:a', text_p, {'xlink:href': _tgt.replace(/&/g, \"&\")});\n\t\t\t\t}\n\t\t\t\to.push(' ' + writextag('table:table-cell', writextag('text:p', text_p, {}), ct) + '\\n');\n\t\t\t}\n\t\t\to.push(' \\n');\n\t\t}\n\t\to.push(' \\n');\n\t\treturn o.join(\"\");\n\t};\n\n\tvar write_automatic_styles_ods = function(o, wb) {\n\t\to.push(' \\n');\n\n\t\to.push(' \\n');\n\t\to.push(' \\n');\n\t\to.push(' /\\n');\n\t\to.push(' \\n');\n\t\to.push(' /\\n');\n\t\to.push(' \\n');\n\t\to.push(' \\n');\n\n\t\t/* column styles */\n\t\tvar cidx = 0;\n\t\twb.SheetNames.map(function(n) { return wb.Sheets[n]; }).forEach(function(ws) {\n\t\t\tif(!ws) return;\n\t\t\tif(ws[\"!cols\"]) {\n\t\t\t\tfor(var C = 0; C < ws[\"!cols\"].length; ++C) if(ws[\"!cols\"][C]) {\n\t\t\t\t\tvar colobj = ws[\"!cols\"][C];\n\t\t\t\t\tif(colobj.width == null && colobj.wpx == null && colobj.wch == null) continue;\n\t\t\t\t\tprocess_col(colobj);\n\t\t\t\t\tcolobj.ods = cidx;\n\t\t\t\t\tvar w = ws[\"!cols\"][C].wpx + \"px\";\n\t\t\t\t\to.push(' \\n');\n\t\t\t\t\to.push(' \\n');\n\t\t\t\t\to.push(' \\n');\n\t\t\t\t\t++cidx;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t/* row styles */\n\t\tvar ridx = 0;\n\t\twb.SheetNames.map(function(n) { return wb.Sheets[n]; }).forEach(function(ws) {\n\t\t\tif(!ws) return;\n\t\t\tif(ws[\"!rows\"]) {\n\t\t\t\tfor(var R = 0; R < ws[\"!rows\"].length; ++R) if(ws[\"!rows\"][R]) {\n\t\t\t\t\tws[\"!rows\"][R].ods = ridx;\n\t\t\t\t\tvar h = ws[\"!rows\"][R].hpx + \"px\";\n\t\t\t\t\to.push(' \\n');\n\t\t\t\t\to.push(' \\n');\n\t\t\t\t\to.push(' \\n');\n\t\t\t\t\t++ridx;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t/* table */\n\t\to.push(' \\n');\n\t\to.push(' \\n');\n\t\to.push(' \\n');\n\n\t\t/* table cells, text */\n\t\to.push(' \\n');\n\n\t\t/* page-layout */\n\n\t\to.push(' \\n');\n\t};\n\n\treturn function wcx(wb, opts) {\n\t\tvar o = [XML_HEADER];\n\t\t/* 3.1.3.2 */\n\t\tvar attr = wxt_helper({\n\t\t\t'xmlns:office': \"urn:oasis:names:tc:opendocument:xmlns:office:1.0\",\n\t\t\t'xmlns:table': \"urn:oasis:names:tc:opendocument:xmlns:table:1.0\",\n\t\t\t'xmlns:style': \"urn:oasis:names:tc:opendocument:xmlns:style:1.0\",\n\t\t\t'xmlns:text': \"urn:oasis:names:tc:opendocument:xmlns:text:1.0\",\n\t\t\t'xmlns:draw': \"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0\",\n\t\t\t'xmlns:fo': \"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0\",\n\t\t\t'xmlns:xlink': \"http://www.w3.org/1999/xlink\",\n\t\t\t'xmlns:dc': \"http://purl.org/dc/elements/1.1/\",\n\t\t\t'xmlns:meta': \"urn:oasis:names:tc:opendocument:xmlns:meta:1.0\",\n\t\t\t'xmlns:number': \"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0\",\n\t\t\t'xmlns:presentation': \"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0\",\n\t\t\t'xmlns:svg': \"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0\",\n\t\t\t'xmlns:chart': \"urn:oasis:names:tc:opendocument:xmlns:chart:1.0\",\n\t\t\t'xmlns:dr3d': \"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0\",\n\t\t\t'xmlns:math': \"http://www.w3.org/1998/Math/MathML\",\n\t\t\t'xmlns:form': \"urn:oasis:names:tc:opendocument:xmlns:form:1.0\",\n\t\t\t'xmlns:script': \"urn:oasis:names:tc:opendocument:xmlns:script:1.0\",\n\t\t\t'xmlns:ooo': \"http://openoffice.org/2004/office\",\n\t\t\t'xmlns:ooow': \"http://openoffice.org/2004/writer\",\n\t\t\t'xmlns:oooc': \"http://openoffice.org/2004/calc\",\n\t\t\t'xmlns:dom': \"http://www.w3.org/2001/xml-events\",\n\t\t\t'xmlns:xforms': \"http://www.w3.org/2002/xforms\",\n\t\t\t'xmlns:xsd': \"http://www.w3.org/2001/XMLSchema\",\n\t\t\t'xmlns:xsi': \"http://www.w3.org/2001/XMLSchema-instance\",\n\t\t\t'xmlns:sheet': \"urn:oasis:names:tc:opendocument:sh33tjs:1.0\",\n\t\t\t'xmlns:rpt': \"http://openoffice.org/2005/report\",\n\t\t\t'xmlns:of': \"urn:oasis:names:tc:opendocument:xmlns:of:1.2\",\n\t\t\t'xmlns:xhtml': \"http://www.w3.org/1999/xhtml\",\n\t\t\t'xmlns:grddl': \"http://www.w3.org/2003/g/data-view#\",\n\t\t\t'xmlns:tableooo': \"http://openoffice.org/2009/table\",\n\t\t\t'xmlns:drawooo': \"http://openoffice.org/2010/draw\",\n\t\t\t'xmlns:calcext': \"urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0\",\n\t\t\t'xmlns:loext': \"urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0\",\n\t\t\t'xmlns:field': \"urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0\",\n\t\t\t'xmlns:formx': \"urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0\",\n\t\t\t'xmlns:css3t': \"http://www.w3.org/TR/css3-text/\",\n\t\t\t'office:version': \"1.2\"\n\t\t});\n\n\t\tvar fods = wxt_helper({\n\t\t\t'xmlns:config': \"urn:oasis:names:tc:opendocument:xmlns:config:1.0\",\n\t\t\t'office:mimetype': \"application/vnd.oasis.opendocument.spreadsheet\"\n\t\t});\n\n\t\tif(opts.bookType == \"fods\") {\n\t\t\to.push('\\n');\n\t\t\to.push(write_meta_ods().replace(/office:document-meta/g, \"office:meta\"));\n\t\t\t// TODO: settings (equiv of settings.xml for ODS)\n\t\t} else o.push('\\n');\n\t\t// o.push(' \\n');\n\t\twrite_automatic_styles_ods(o, wb);\n\t\to.push(' \\n');\n\t\to.push(' \\n');\n\t\tfor(var i = 0; i != wb.SheetNames.length; ++i) o.push(write_ws(wb.Sheets[wb.SheetNames[i]], wb, i, opts));\n\t\to.push(' \\n');\n\t\to.push(' \\n');\n\t\tif(opts.bookType == \"fods\") o.push('
');\n\t\telse o.push('');\n\t\treturn o.join(\"\");\n\t};\n})();\n\nfunction write_ods(wb, opts) {\n\tif(opts.bookType == \"fods\") return write_content_ods(wb, opts);\n\n\tvar zip = zip_new();\n\tvar f = \"\";\n\n\tvar manifest = [];\n\tvar rdf = [];\n\n\t/* Part 3 Section 3.3 MIME Media Type */\n\tf = \"mimetype\";\n\tzip_add_file(zip, f, \"application/vnd.oasis.opendocument.spreadsheet\");\n\n\t/* Part 1 Section 2.2 Documents */\n\tf = \"content.xml\";\n\tzip_add_file(zip, f, write_content_ods(wb, opts));\n\tmanifest.push([f, \"text/xml\"]);\n\trdf.push([f, \"ContentFile\"]);\n\n\t/* TODO: these are hard-coded styles to satiate excel */\n\tf = \"styles.xml\";\n\tzip_add_file(zip, f, write_styles_ods(wb, opts));\n\tmanifest.push([f, \"text/xml\"]);\n\trdf.push([f, \"StylesFile\"]);\n\n\t/* TODO: this is hard-coded to satiate excel */\n\tf = \"meta.xml\";\n\tzip_add_file(zip, f, XML_HEADER + write_meta_ods());\n\tmanifest.push([f, \"text/xml\"]);\n\trdf.push([f, \"MetadataFile\"]);\n\n\t/* Part 3 Section 6 Metadata Manifest File */\n\tf = \"manifest.rdf\";\n\tzip_add_file(zip, f, write_rdf(rdf/*, opts*/));\n\tmanifest.push([f, \"application/rdf+xml\"]);\n\n\t/* Part 3 Section 4 Manifest File */\n\tf = \"META-INF/manifest.xml\";\n\tzip_add_file(zip, f, write_manifest(manifest/*, opts*/));\n\n\treturn zip;\n}\n\nfunction write_sheet_index(wb, sheet) {\n\tif(!sheet) return 0;\n\tvar idx = wb.SheetNames.indexOf(sheet);\n\tif(idx == -1) throw new Error(\"Sheet not found: \" + sheet);\n\treturn idx;\n}\n\nfunction write_obj_str(factory) {\n\treturn function write_str(wb, o) {\n\t\tvar idx = write_sheet_index(wb, o.sheet);\n\t\treturn factory.from_sheet(wb.Sheets[wb.SheetNames[idx]], o, wb);\n\t};\n}\n\nvar write_htm_str = write_obj_str(HTML_);\nvar write_csv_str = write_obj_str({from_sheet:sheet_to_csv});\nvar write_slk_str = write_obj_str(typeof SYLK !== \"undefined\" ? SYLK : {});\nvar write_dif_str = write_obj_str(typeof DIF !== \"undefined\" ? DIF : {});\nvar write_prn_str = write_obj_str(typeof PRN !== \"undefined\" ? PRN : {});\nvar write_rtf_str = write_obj_str(typeof RTF !== \"undefined\" ? RTF : {});\nvar write_txt_str = write_obj_str({from_sheet:sheet_to_txt});\nvar write_dbf_buf = write_obj_str(typeof DBF !== \"undefined\" ? DBF : {});\nvar write_eth_str = write_obj_str(typeof ETH !== \"undefined\" ? ETH : {});\nvar write_wk1_buf = write_obj_str(typeof WK_ !== \"undefined\" ? {from_sheet:WK_.sheet_to_wk1} : {});\n\nfunction fix_opts_func(defaults) {\n\treturn function fix_opts(opts) {\n\t\tfor(var i = 0; i != defaults.length; ++i) {\n\t\t\tvar d = defaults[i];\n\t\t\tif(opts[d[0]] === undefined) opts[d[0]] = d[1];\n\t\t\tif(d[2] === 'n') opts[d[0]] = Number(opts[d[0]]);\n\t\t}\n\t};\n}\n\nvar fix_read_opts = function(opts) {\nfix_opts_func([\n\t['cellNF', false], /* emit cell number format string as .z */\n\t['cellHTML', true], /* emit html string as .h */\n\t['cellFormula', true], /* emit formulae as .f */\n\t['cellStyles', false], /* emits style/theme as .s */\n\t['cellText', true], /* emit formatted text as .w */\n\t['cellDates', false], /* emit date cells with type `d` */\n\n\t['sheetStubs', false], /* emit empty cells */\n\t['sheetRows', 0, 'n'], /* read n rows (0 = read all rows) */\n\n\t['bookDeps', false], /* parse calculation chains */\n\t['bookSheets', false], /* only try to get sheet names (no Sheets) */\n\t['bookProps', false], /* only try to get properties (no Sheets) */\n\t['bookFiles', false], /* include raw file structure (keys, files, cfb) */\n\t['bookVBA', false], /* include vba raw data (vbaraw) */\n\n\t['password',''], /* password */\n\t['WTF', false] /* WTF mode (throws errors) */\n])(opts);\n};\n\nvar fix_write_opts = fix_opts_func([\n\t['cellDates', false], /* write date cells with type `d` */\n\n\t['bookSST', false], /* Generate Shared String Table */\n\n\t['bookType', 'xlsx'], /* Type of workbook (xlsx/m/b) */\n\n\t['compression', false], /* Use file compression */\n\n\t['WTF', false] /* WTF mode (throws errors) */\n]);\nfunction get_sheet_type(n) {\n\tif(RELS.WS.indexOf(n) > -1) return \"sheet\";\n\tif(RELS.CS && n == RELS.CS) return \"chart\";\n\tif(RELS.DS && n == RELS.DS) return \"dialog\";\n\tif(RELS.MS && n == RELS.MS) return \"macro\";\n\treturn (n && n.length) ? n : \"sheet\";\n}\nfunction safe_parse_wbrels(wbrels, sheets) {\n\tif(!wbrels) return 0;\n\ttry {\n\t\twbrels = sheets.map(function pwbr(w) { if(!w.id) w.id = w.strRelID; return [w.name, wbrels['!id'][w.id].Target, get_sheet_type(wbrels['!id'][w.id].Type)]; });\n\t} catch(e) { return null; }\n\treturn !wbrels || wbrels.length === 0 ? null : wbrels;\n}\n\nfunction safe_parse_sheet(zip, path, relsPath, sheet, idx, sheetRels, sheets, stype, opts, wb, themes, styles) {\n\ttry {\n\t\tsheetRels[sheet]=parse_rels(getzipstr(zip, relsPath, true), path);\n\t\tvar data = getzipdata(zip, path);\n\t\tvar _ws;\n\t\tswitch(stype) {\n\t\t\tcase 'sheet': _ws = parse_ws(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break;\n\t\t\tcase 'chart': _ws = parse_cs(data, path, idx, opts, sheetRels[sheet], wb, themes, styles);\n\t\t\t\tif(!_ws || !_ws['!drawel']) break;\n\t\t\t\tvar dfile = resolve_path(_ws['!drawel'].Target, path);\n\t\t\t\tvar drelsp = get_rels_path(dfile);\n\t\t\t\tvar draw = parse_drawing(getzipstr(zip, dfile, true), parse_rels(getzipstr(zip, drelsp, true), dfile));\n\t\t\t\tvar chartp = resolve_path(draw, dfile);\n\t\t\t\tvar crelsp = get_rels_path(chartp);\n\t\t\t\t_ws = parse_chart(getzipstr(zip, chartp, true), chartp, opts, parse_rels(getzipstr(zip, crelsp, true), chartp), wb, _ws);\n\t\t\t\tbreak;\n\t\t\tcase 'macro': _ws = parse_ms(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break;\n\t\t\tcase 'dialog': _ws = parse_ds(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break;\n\t\t\tdefault: throw new Error(\"Unrecognized sheet type \" + stype);\n\t\t}\n\t\tsheets[sheet] = _ws;\n\n\t\t/* scan rels for comments */\n\t\tvar comments = [];\n\t\tif(sheetRels && sheetRels[sheet]) keys(sheetRels[sheet]).forEach(function(n) {\n\t\t\tif(sheetRels[sheet][n].Type == RELS.CMNT) {\n\t\t\t\tvar dfile = resolve_path(sheetRels[sheet][n].Target, path);\n\t\t\t\tcomments = parse_cmnt(getzipdata(zip, dfile, true), dfile, opts);\n\t\t\t\tif(!comments || !comments.length) return;\n\t\t\t\tsheet_insert_comments(_ws, comments);\n\t\t\t}\n\t\t});\n\t} catch(e) { if(opts.WTF) throw e; }\n}\n\nfunction strip_front_slash(x) { return x.charAt(0) == '/' ? x.slice(1) : x; }\n\nfunction parse_zip(zip, opts) {\n\tmake_ssf(SSF);\n\topts = opts || {};\n\tfix_read_opts(opts);\n\n\t/* OpenDocument Part 3 Section 2.2.1 OpenDocument Package */\n\tif(safegetzipfile(zip, 'META-INF/manifest.xml')) return parse_ods(zip, opts);\n\t/* UOC */\n\tif(safegetzipfile(zip, 'objectdata.xml')) return parse_ods(zip, opts);\n\t/* Numbers */\n\tif(safegetzipfile(zip, 'Index/Document.iwa')) throw new Error('Unsupported NUMBERS file');\n\tif(!safegetzipfile(zip, '[Content_Types].xml')) {\n\t\tif(safegetzipfile(zip, 'index.xml.gz')) throw new Error('Unsupported NUMBERS 08 file');\n\t\tif(safegetzipfile(zip, 'index.xml')) throw new Error('Unsupported NUMBERS 09 file');\n\t\tthrow new Error('Unsupported ZIP file');\n\t}\n\n\tvar entries = zipentries(zip);\n\tvar dir = parse_ct((getzipstr(zip, '[Content_Types].xml')));\n\tvar xlsb = false;\n\tvar sheets, binname;\n\tif(dir.workbooks.length === 0) {\n\t\tbinname = \"xl/workbook.xml\";\n\t\tif(getzipdata(zip,binname, true)) dir.workbooks.push(binname);\n\t}\n\tif(dir.workbooks.length === 0) {\n\t\tbinname = \"xl/workbook.bin\";\n\t\tif(!getzipdata(zip,binname,true)) throw new Error(\"Could not find workbook\");\n\t\tdir.workbooks.push(binname);\n\t\txlsb = true;\n\t}\n\tif(dir.workbooks[0].slice(-3) == \"bin\") xlsb = true;\n\n\tvar themes = ({});\n\tvar styles = ({});\n\tif(!opts.bookSheets && !opts.bookProps) {\n\t\tstrs = [];\n\t\tif(dir.sst) try { strs=parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts); } catch(e) { if(opts.WTF) throw e; }\n\n\t\tif(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\\//,''), true)||\"\",dir.themes[0], opts);\n\n\t\tif(dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);\n\t}\n\n\t/*var externbooks = */dir.links.map(function(link) {\n\t\ttry {\n\t\t\tvar rels = parse_rels(getzipstr(zip, get_rels_path(strip_front_slash(link))), link);\n\t\t\treturn parse_xlink(getzipdata(zip, strip_front_slash(link)), rels, link, opts);\n\t\t} catch(e) {}\n\t});\n\n\tvar wb = parse_wb(getzipdata(zip, strip_front_slash(dir.workbooks[0])), dir.workbooks[0], opts);\n\n\tvar props = {}, propdata = \"\";\n\n\tif(dir.coreprops.length) {\n\t\tpropdata = getzipdata(zip, strip_front_slash(dir.coreprops[0]), true);\n\t\tif(propdata) props = parse_core_props(propdata);\n\t\tif(dir.extprops.length !== 0) {\n\t\t\tpropdata = getzipdata(zip, strip_front_slash(dir.extprops[0]), true);\n\t\t\tif(propdata) parse_ext_props(propdata, props, opts);\n\t\t}\n\t}\n\n\tvar custprops = {};\n\tif(!opts.bookSheets || opts.bookProps) {\n\t\tif (dir.custprops.length !== 0) {\n\t\t\tpropdata = getzipstr(zip, strip_front_slash(dir.custprops[0]), true);\n\t\t\tif(propdata) custprops = parse_cust_props(propdata, opts);\n\t\t}\n\t}\n\n\tvar out = ({});\n\tif(opts.bookSheets || opts.bookProps) {\n\t\tif(wb.Sheets) sheets = wb.Sheets.map(function pluck(x){ return x.name; });\n\t\telse if(props.Worksheets && props.SheetNames.length > 0) sheets=props.SheetNames;\n\t\tif(opts.bookProps) { out.Props = props; out.Custprops = custprops; }\n\t\tif(opts.bookSheets && typeof sheets !== 'undefined') out.SheetNames = sheets;\n\t\tif(opts.bookSheets ? out.SheetNames : opts.bookProps) return out;\n\t}\n\tsheets = {};\n\n\tvar deps = {};\n\tif(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, strip_front_slash(dir.calcchain)),dir.calcchain,opts);\n\n\tvar i=0;\n\tvar sheetRels = ({});\n\tvar path, relsPath;\n\n\t{\n\t\tvar wbsheets = wb.Sheets;\n\t\tprops.Worksheets = wbsheets.length;\n\t\tprops.SheetNames = [];\n\t\tfor(var j = 0; j != wbsheets.length; ++j) {\n\t\t\tprops.SheetNames[j] = wbsheets[j].name;\n\t\t}\n\t}\n\n\tvar wbext = xlsb ? \"bin\" : \"xml\";\n\tvar wbrelsi = dir.workbooks[0].lastIndexOf(\"/\");\n\tvar wbrelsfile = (dir.workbooks[0].slice(0, wbrelsi+1) + \"_rels/\" + dir.workbooks[0].slice(wbrelsi+1) + \".rels\").replace(/^\\//,\"\");\n\tif(!safegetzipfile(zip, wbrelsfile)) wbrelsfile = 'xl/_rels/workbook.' + wbext + '.rels';\n\tvar wbrels = parse_rels(getzipstr(zip, wbrelsfile, true), wbrelsfile);\n\tif(wbrels) wbrels = safe_parse_wbrels(wbrels, wb.Sheets);\n\n\t/* Numbers iOS hack */\n\tvar nmode = (getzipdata(zip,\"xl/worksheets/sheet.xml\",true))?1:0;\n\twsloop: for(i = 0; i != props.Worksheets; ++i) {\n\t\tvar stype = \"sheet\";\n\t\tif(wbrels && wbrels[i]) {\n\t\t\tpath = 'xl/' + (wbrels[i][1]).replace(/[\\/]?xl\\//, \"\");\n\t\t\tif(!safegetzipfile(zip, path)) path = wbrels[i][1];\n\t\t\tif(!safegetzipfile(zip, path)) path = wbrelsfile.replace(/_rels\\/.*$/,\"\") + wbrels[i][1];\n\t\t\tstype = wbrels[i][2];\n\t\t} else {\n\t\t\tpath = 'xl/worksheets/sheet'+(i+1-nmode)+\".\" + wbext;\n\t\t\tpath = path.replace(/sheet0\\./,\"sheet.\");\n\t\t}\n\t\trelsPath = path.replace(/^(.*)(\\/)([^\\/]*)$/, \"$1/_rels/$3.rels\");\n\t\tif(opts && opts.sheets != null) switch(typeof opts.sheets) {\n\t\t\tcase \"number\": if(i != opts.sheets) continue wsloop; break;\n\t\t\tcase \"string\": if(props.SheetNames[i].toLowerCase() != opts.sheets.toLowerCase()) continue wsloop; break;\n\t\t\tdefault: if(Array.isArray && Array.isArray(opts.sheets)) {\n\t\t\t\tvar snjseen = false;\n\t\t\t\tfor(var snj = 0; snj != opts.sheets.length; ++snj) {\n\t\t\t\t\tif(typeof opts.sheets[snj] == \"number\" && opts.sheets[snj] == i) snjseen=1;\n\t\t\t\t\tif(typeof opts.sheets[snj] == \"string\" && opts.sheets[snj].toLowerCase() == props.SheetNames[i].toLowerCase()) snjseen = 1;\n\t\t\t\t}\n\t\t\t\tif(!snjseen) continue wsloop;\n\t\t\t}\n\t\t}\n\t\tsafe_parse_sheet(zip, path, relsPath, props.SheetNames[i], i, sheetRels, sheets, stype, opts, wb, themes, styles);\n\t}\n\n\tout = ({\n\t\tDirectory: dir,\n\t\tWorkbook: wb,\n\t\tProps: props,\n\t\tCustprops: custprops,\n\t\tDeps: deps,\n\t\tSheets: sheets,\n\t\tSheetNames: props.SheetNames,\n\t\tStrings: strs,\n\t\tStyles: styles,\n\t\tThemes: themes,\n\t\tSSF: SSF.get_table()\n\t});\n\tif(opts && opts.bookFiles) {\n\t\tif(zip.files) {\n\t\t\tout.keys = entries;\n\t\t\tout.files = zip.files;\n\t\t} else {\n\t\t\tout.keys = [];\n\t\t\tout.files = {};\n\t\t\tzip.FullPaths.forEach(function(p, idx) {\n\t\t\t\tp = p.replace(/^Root Entry[\\/]/, \"\");\n\t\t\t\tout.keys.push(p);\n\t\t\t\tout.files[p] = zip.FileIndex[idx];\n\t\t\t});\n\t\t}\n\t}\n\tif(opts && opts.bookVBA) {\n\t\tif(dir.vba.length > 0) out.vbaraw = getzipdata(zip,strip_front_slash(dir.vba[0]),true);\n\t\telse if(dir.defaults && dir.defaults.bin === CT_VBA) out.vbaraw = getzipdata(zip, 'xl/vbaProject.bin',true);\n\t}\n\treturn out;\n}\n\n/* [MS-OFFCRYPTO] 2.1.1 */\nfunction parse_xlsxcfb(cfb, _opts) {\n\tvar opts = _opts || {};\n\tvar f = 'Workbook', data = CFB.find(cfb, f);\n\ttry {\n\tf = '/!DataSpaces/Version';\n\tdata = CFB.find(cfb, f); if(!data || !data.content) throw new Error(\"ECMA-376 Encrypted file missing \" + f);\n\t/*var version = */parse_DataSpaceVersionInfo(data.content);\n\n\t/* 2.3.4.1 */\n\tf = '/!DataSpaces/DataSpaceMap';\n\tdata = CFB.find(cfb, f); if(!data || !data.content) throw new Error(\"ECMA-376 Encrypted file missing \" + f);\n\tvar dsm = parse_DataSpaceMap(data.content);\n\tif(dsm.length !== 1 || dsm[0].comps.length !== 1 || dsm[0].comps[0].t !== 0 || dsm[0].name !== \"StrongEncryptionDataSpace\" || dsm[0].comps[0].v !== \"EncryptedPackage\")\n\t\tthrow new Error(\"ECMA-376 Encrypted file bad \" + f);\n\n\t/* 2.3.4.2 */\n\tf = '/!DataSpaces/DataSpaceInfo/StrongEncryptionDataSpace';\n\tdata = CFB.find(cfb, f); if(!data || !data.content) throw new Error(\"ECMA-376 Encrypted file missing \" + f);\n\tvar seds = parse_DataSpaceDefinition(data.content);\n\tif(seds.length != 1 || seds[0] != \"StrongEncryptionTransform\")\n\t\tthrow new Error(\"ECMA-376 Encrypted file bad \" + f);\n\n\t/* 2.3.4.3 */\n\tf = '/!DataSpaces/TransformInfo/StrongEncryptionTransform/!Primary';\n\tdata = CFB.find(cfb, f); if(!data || !data.content) throw new Error(\"ECMA-376 Encrypted file missing \" + f);\n\t/*var hdr = */parse_Primary(data.content);\n\t} catch(e) {}\n\n\tf = '/EncryptionInfo';\n\tdata = CFB.find(cfb, f); if(!data || !data.content) throw new Error(\"ECMA-376 Encrypted file missing \" + f);\n\tvar einfo = parse_EncryptionInfo(data.content);\n\n\t/* 2.3.4.4 */\n\tf = '/EncryptedPackage';\n\tdata = CFB.find(cfb, f); if(!data || !data.content) throw new Error(\"ECMA-376 Encrypted file missing \" + f);\n\n/*global decrypt_agile */\nif(einfo[0] == 0x04 && typeof decrypt_agile !== 'undefined') return decrypt_agile(einfo[1], data.content, opts.password || \"\", opts);\n/*global decrypt_std76 */\nif(einfo[0] == 0x02 && typeof decrypt_std76 !== 'undefined') return decrypt_std76(einfo[1], data.content, opts.password || \"\", opts);\n\tthrow new Error(\"File is password-protected\");\n}\n\nfunction write_zip(wb, opts) {\n\t_shapeid = 1024;\n\tif(opts.bookType == \"ods\") return write_ods(wb, opts);\n\tif(wb && !wb.SSF) {\n\t\twb.SSF = SSF.get_table();\n\t}\n\tif(wb && wb.SSF) {\n\t\tmake_ssf(SSF); SSF.load_table(wb.SSF);\n\t\t// $FlowIgnore\n\t\topts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;\n\t\topts.ssf = wb.SSF;\n\t}\n\topts.rels = {}; opts.wbrels = {};\n\topts.Strings = []; opts.Strings.Count = 0; opts.Strings.Unique = 0;\n\tif(browser_has_Map) opts.revStrings = new Map();\n\telse { opts.revStrings = {}; opts.revStrings.foo = []; delete opts.revStrings.foo; }\n\tvar wbext = opts.bookType == \"xlsb\" ? \"bin\" : \"xml\";\n\tvar vbafmt = VBAFMTS.indexOf(opts.bookType) > -1;\n\tvar ct = new_ct();\n\tfix_write_opts(opts = opts || {});\n\tvar zip = zip_new();\n\tvar f = \"\", rId = 0;\n\n\topts.cellXfs = [];\n\tget_cell_style(opts.cellXfs, {}, {revssf:{\"General\":0}});\n\n\tif(!wb.Props) wb.Props = {};\n\n\tf = \"docProps/core.xml\";\n\tzip_add_file(zip, f, write_core_props(wb.Props, opts));\n\tct.coreprops.push(f);\n\tadd_rels(opts.rels, 2, f, RELS.CORE_PROPS);\n\nf = \"docProps/app.xml\";\n\tif(wb.Props && wb.Props.SheetNames){/* empty */}\n\telse if(!wb.Workbook || !wb.Workbook.Sheets) wb.Props.SheetNames = wb.SheetNames;\n\telse {\n\t\tvar _sn = [];\n\t\tfor(var _i = 0; _i < wb.SheetNames.length; ++_i)\n\t\t\tif((wb.Workbook.Sheets[_i]||{}).Hidden != 2) _sn.push(wb.SheetNames[_i]);\n\t\twb.Props.SheetNames = _sn;\n\t}\n\twb.Props.Worksheets = wb.Props.SheetNames.length;\n\tzip_add_file(zip, f, write_ext_props(wb.Props, opts));\n\tct.extprops.push(f);\n\tadd_rels(opts.rels, 3, f, RELS.EXT_PROPS);\n\n\tif(wb.Custprops !== wb.Props && keys(wb.Custprops||{}).length > 0) {\n\t\tf = \"docProps/custom.xml\";\n\t\tzip_add_file(zip, f, write_cust_props(wb.Custprops, opts));\n\t\tct.custprops.push(f);\n\t\tadd_rels(opts.rels, 4, f, RELS.CUST_PROPS);\n\t}\n\n\tfor(rId=1;rId <= wb.SheetNames.length; ++rId) {\n\t\tvar wsrels = {'!id':{}};\n\t\tvar ws = wb.Sheets[wb.SheetNames[rId-1]];\n\t\tvar _type = (ws || {})[\"!type\"] || \"sheet\";\n\t\tswitch(_type) {\n\t\tcase \"chart\":\n\t\t\t/* falls through */\n\t\tdefault:\n\t\t\tf = \"xl/worksheets/sheet\" + rId + \".\" + wbext;\n\t\t\tzip_add_file(zip, f, write_ws(rId-1, f, opts, wb, wsrels));\n\t\t\tct.sheets.push(f);\n\t\t\tadd_rels(opts.wbrels, -1, \"worksheets/sheet\" + rId + \".\" + wbext, RELS.WS[0]);\n\t\t}\n\n\t\tif(ws) {\n\t\t\tvar comments = ws['!comments'];\n\t\t\tvar need_vml = false;\n\t\t\tif(comments && comments.length > 0) {\n\t\t\t\tvar cf = \"xl/comments\" + rId + \".\" + wbext;\n\t\t\t\tzip_add_file(zip, cf, write_cmnt(comments, cf, opts));\n\t\t\t\tct.comments.push(cf);\n\t\t\t\tadd_rels(wsrels, -1, \"../comments\" + rId + \".\" + wbext, RELS.CMNT);\n\t\t\t\tneed_vml = true;\n\t\t\t}\n\t\t\tif(ws['!legacy']) {\n\t\t\t\tif(need_vml) zip_add_file(zip, \"xl/drawings/vmlDrawing\" + (rId) + \".vml\", write_comments_vml(rId, ws['!comments']));\n\t\t\t}\n\t\t\tdelete ws['!comments'];\n\t\t\tdelete ws['!legacy'];\n\t\t}\n\n\t\tif(wsrels['!id'].rId1) zip_add_file(zip, get_rels_path(f), write_rels(wsrels));\n\t}\n\n\tif(opts.Strings != null && opts.Strings.length > 0) {\n\t\tf = \"xl/sharedStrings.\" + wbext;\n\t\tzip_add_file(zip, f, write_sst(opts.Strings, f, opts));\n\t\tct.strs.push(f);\n\t\tadd_rels(opts.wbrels, -1, \"sharedStrings.\" + wbext, RELS.SST);\n\t}\n\n\tf = \"xl/workbook.\" + wbext;\n\tzip_add_file(zip, f, write_wb(wb, f, opts));\n\tct.workbooks.push(f);\n\tadd_rels(opts.rels, 1, f, RELS.WB);\n\n\t/* TODO: something more intelligent with themes */\n\n\tf = \"xl/theme/theme1.xml\";\n\tzip_add_file(zip, f, write_theme(wb.Themes, opts));\n\tct.themes.push(f);\n\tadd_rels(opts.wbrels, -1, \"theme/theme1.xml\", RELS.THEME);\n\n\t/* TODO: something more intelligent with styles */\n\n\tf = \"xl/styles.\" + wbext;\n\tzip_add_file(zip, f, write_sty(wb, f, opts));\n\tct.styles.push(f);\n\tadd_rels(opts.wbrels, -1, \"styles.\" + wbext, RELS.STY);\n\n\tif(wb.vbaraw && vbafmt) {\n\t\tf = \"xl/vbaProject.bin\";\n\t\tzip_add_file(zip, f, wb.vbaraw);\n\t\tct.vba.push(f);\n\t\tadd_rels(opts.wbrels, -1, \"vbaProject.bin\", RELS.VBA);\n\t}\n\n\tzip_add_file(zip, \"[Content_Types].xml\", write_ct(ct, opts));\n\tzip_add_file(zip, '_rels/.rels', write_rels(opts.rels));\n\tzip_add_file(zip, 'xl/_rels/workbook.' + wbext + '.rels', write_rels(opts.wbrels));\n\n\tdelete opts.revssf; delete opts.ssf;\n\treturn zip;\n}\nfunction firstbyte(f,o) {\n\tvar x = \"\";\n\tswitch((o||{}).type || \"base64\") {\n\t\tcase 'buffer': return [f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7]];\n\t\tcase 'base64': x = Base64.decode(f.slice(0,12)); break;\n\t\tcase 'binary': x = f; break;\n\t\tcase 'array': return [f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7]];\n\t\tdefault: throw new Error(\"Unrecognized type \" + (o && o.type || \"undefined\"));\n\t}\n\treturn [x.charCodeAt(0), x.charCodeAt(1), x.charCodeAt(2), x.charCodeAt(3), x.charCodeAt(4), x.charCodeAt(5), x.charCodeAt(6), x.charCodeAt(7)];\n}\n\nfunction read_cfb(cfb, opts) {\n\tif(CFB.find(cfb, \"EncryptedPackage\")) return parse_xlsxcfb(cfb, opts);\n\treturn parse_xlscfb(cfb, opts);\n}\n\nfunction read_zip(data, opts) {\n\tvar zip, d = data;\n\tvar o = opts||{};\n\tif(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? \"buffer\" : \"base64\";\n\tzip = zip_read(d, o);\n\treturn parse_zip(zip, o);\n}\n\nfunction read_plaintext(data, o) {\n\tvar i = 0;\n\tmain: while(i < data.length) switch(data.charCodeAt(i)) {\n\t\tcase 0x0A: case 0x0D: case 0x20: ++i; break;\n\t\tcase 0x3C: return parse_xlml(data.slice(i),o);\n\t\tdefault: break main;\n\t}\n\treturn PRN.to_workbook(data, o);\n}\n\nfunction read_plaintext_raw(data, o) {\n\tvar str = \"\", bytes = firstbyte(data, o);\n\tswitch(o.type) {\n\t\tcase 'base64': str = Base64.decode(data); break;\n\t\tcase 'binary': str = data; break;\n\t\tcase 'buffer': str = data.toString('binary'); break;\n\t\tcase 'array': str = cc2str(data); break;\n\t\tdefault: throw new Error(\"Unrecognized type \" + o.type);\n\t}\n\tif(bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str);\n\treturn read_plaintext(str, o);\n}\n\nfunction read_utf16(data, o) {\n\tvar d = data;\n\tif(o.type == 'base64') d = Base64.decode(d);\n\td = cptable.utils.decode(1200, d.slice(2), 'str');\n\to.type = \"binary\";\n\treturn read_plaintext(d, o);\n}\n\nfunction bstrify(data) {\n\treturn !data.match(/[^\\x00-\\x7F]/) ? data : utf8write(data);\n}\n\nfunction read_prn(data, d, o, str) {\n\tif(str) { o.type = \"string\"; return PRN.to_workbook(data, o); }\n\treturn PRN.to_workbook(d, o);\n}\n\nfunction readSync(data, opts) {\n\treset_cp();\n\tvar o = opts||{};\n\tif(typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer) return readSync(new Uint8Array(data), (o = dup(o), o.type = \"array\", o));\n\tvar d = data, n = [0,0,0,0], str = false;\n\tif(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; }\n\t_ssfopts = {};\n\tif(o.dateNF) _ssfopts.dateNF = o.dateNF;\n\tif(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? \"buffer\" : \"base64\";\n\tif(o.type == \"file\") { o.type = has_buf ? \"buffer\" : \"binary\"; d = read_binary(data); }\n\tif(o.type == \"string\") { str = true; o.type = \"binary\"; o.codepage = 65001; d = bstrify(data); }\n\tif(o.type == 'array' && typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && typeof ArrayBuffer !== 'undefined') {\n\t\t// $FlowIgnore\n\t\tvar ab=new ArrayBuffer(3), vu=new Uint8Array(ab); vu.foo=\"bar\";\n\t\t// $FlowIgnore\n\t\tif(!vu.foo) {o=dup(o); o.type='array'; return readSync(ab2a(d), o);}\n\t}\n\tswitch((n = firstbyte(d, o))[0]) {\n\t\tcase 0xD0: if(n[1] === 0xCF && n[2] === 0x11 && n[3] === 0xE0 && n[4] === 0xA1 && n[5] === 0xB1 && n[6] === 0x1A && n[7] === 0xE1) return read_cfb(CFB.read(d, o), o); break;\n\t\tcase 0x09: if(n[1] <= 0x08) return parse_xlscfb(d, o); break;\n\t\tcase 0x3C: return parse_xlml(d, o);\n\t\tcase 0x49:\n\t\t\tif(n[1] === 0x49 && n[2] === 0x2a && n[3] === 0x00) throw new Error(\"TIFF Image File is not a spreadsheet\");\n\t\t\tif(n[1] === 0x44) return read_wb_ID(d, o);\n\t\t\tbreak;\n\t\tcase 0x54: if(n[1] === 0x41 && n[2] === 0x42 && n[3] === 0x4C) return DIF.to_workbook(d, o); break;\n\t\tcase 0x50: return (n[1] === 0x4B && n[2] < 0x09 && n[3] < 0x09) ? read_zip(d, o) : read_prn(data, d, o, str);\n\t\tcase 0xEF: return n[3] === 0x3C ? parse_xlml(d, o) : read_prn(data, d, o, str);\n\t\tcase 0xFF:\n\t\t\tif(n[1] === 0xFE) { return read_utf16(d, o); }\n\t\t\telse if(n[1] === 0x00 && n[2] === 0x02 && n[3] === 0x00) return WK_.to_workbook(d, o);\n\t\t\tbreak;\n\t\tcase 0x00:\n\t\t\tif(n[1] === 0x00) {\n\t\t\t\tif(n[2] >= 0x02 && n[3] === 0x00) return WK_.to_workbook(d, o);\n\t\t\t\tif(n[2] === 0x00 && (n[3] === 0x08 || n[3] === 0x09)) return WK_.to_workbook(d, o);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 0x03: case 0x83: case 0x8B: case 0x8C: return DBF.to_workbook(d, o);\n\t\tcase 0x7B: if(n[1] === 0x5C && n[2] === 0x72 && n[3] === 0x74) return RTF.to_workbook(d, o); break;\n\t\tcase 0x0A: case 0x0D: case 0x20: return read_plaintext_raw(d, o);\n\t\tcase 0x89: if(n[1] === 0x50 && n[2] === 0x4E && n[3] === 0x47) throw new Error(\"PNG Image File is not a spreadsheet\"); break;\n\t}\n\tif(DBF.versions.indexOf(n[0]) > -1 && n[2] <= 12 && n[3] <= 31) return DBF.to_workbook(d, o);\n\treturn read_prn(data, d, o, str);\n}\n\nfunction readFileSync(filename, opts) {\n\tvar o = opts||{}; o.type = 'file';\n\treturn readSync(filename, o);\n}\nfunction write_cfb_ctr(cfb, o) {\n\tswitch(o.type) {\n\t\tcase \"base64\": case \"binary\": break;\n\t\tcase \"buffer\": case \"array\": o.type = \"\"; break;\n\t\tcase \"file\": return write_dl(o.file, CFB.write(cfb, {type:has_buf ? 'buffer' : \"\"}));\n\t\tcase \"string\": throw new Error(\"'string' output type invalid for '\" + o.bookType + \"' files\");\n\t\tdefault: throw new Error(\"Unrecognized type \" + o.type);\n\t}\n\treturn CFB.write(cfb, o);\n}\n\nfunction write_zip_type(wb, opts) {\n\tvar o = dup(opts||{});\n\tvar z = write_zip(wb, o);\n\tvar oopts = {};\n\tif(o.compression) oopts.compression = 'DEFLATE';\n\tif(o.password) oopts.type = has_buf ? \"nodebuffer\" : \"string\";\n\telse switch(o.type) {\n\t\tcase \"base64\": oopts.type = \"base64\"; break;\n\t\tcase \"binary\": oopts.type = \"string\"; break;\n\t\tcase \"string\": throw new Error(\"'string' output type invalid for '\" + o.bookType + \"' files\");\n\t\tcase \"buffer\":\n\t\tcase \"file\": oopts.type = has_buf ? \"nodebuffer\" : \"string\"; break;\n\t\tdefault: throw new Error(\"Unrecognized type \" + o.type);\n\t}\n\tvar out = z.FullPaths ? CFB.write(z, {fileType:\"zip\", type: {\"nodebuffer\": \"buffer\", \"string\": \"binary\"}[oopts.type] || oopts.type}) : z.generate(oopts);\n/*jshint -W083 */\n\tif(o.password && typeof encrypt_agile !== 'undefined') return write_cfb_ctr(encrypt_agile(out, o.password), o); // eslint-disable-line no-undef\n/*jshint +W083 */\n\tif(o.type === \"file\") return write_dl(o.file, out);\n\treturn o.type == \"string\" ? utf8read(out) : out;\n}\n\nfunction write_cfb_type(wb, opts) {\n\tvar o = opts||{};\n\tvar cfb = write_xlscfb(wb, o);\n\treturn write_cfb_ctr(cfb, o);\n}\n\nfunction write_string_type(out, opts, bom) {\n\tif(!bom) bom = \"\";\n\tvar o = bom + out;\n\tswitch(opts.type) {\n\t\tcase \"base64\": return Base64.encode(utf8write(o));\n\t\tcase \"binary\": return utf8write(o);\n\t\tcase \"string\": return out;\n\t\tcase \"file\": return write_dl(opts.file, o, 'utf8');\n\t\tcase \"buffer\": {\n\t\t\tif(has_buf) return Buffer_from(o, 'utf8');\n\t\t\telse return write_string_type(o, {type:'binary'}).split(\"\").map(function(c) { return c.charCodeAt(0); });\n\t\t}\n\t}\n\tthrow new Error(\"Unrecognized type \" + opts.type);\n}\n\nfunction write_stxt_type(out, opts) {\n\tswitch(opts.type) {\n\t\tcase \"base64\": return Base64.encode(out);\n\t\tcase \"binary\": return out;\n\t\tcase \"string\": return out; /* override in sheet_to_txt */\n\t\tcase \"file\": return write_dl(opts.file, out, 'binary');\n\t\tcase \"buffer\": {\n\t\t\tif(has_buf) return Buffer_from(out, 'binary');\n\t\t\telse return out.split(\"\").map(function(c) { return c.charCodeAt(0); });\n\t\t}\n\t}\n\tthrow new Error(\"Unrecognized type \" + opts.type);\n}\n\n/* TODO: test consistency */\nfunction write_binary_type(out, opts) {\n\tswitch(opts.type) {\n\t\tcase \"string\":\n\t\tcase \"base64\":\n\t\tcase \"binary\":\n\t\t\tvar bstr = \"\";\n\t\t\t// $FlowIgnore\n\t\t\tfor(var i = 0; i < out.length; ++i) bstr += String.fromCharCode(out[i]);\n\t\t\treturn opts.type == 'base64' ? Base64.encode(bstr) : opts.type == 'string' ? utf8read(bstr) : bstr;\n\t\tcase \"file\": return write_dl(opts.file, out);\n\t\tcase \"buffer\": return out;\n\t\tdefault: throw new Error(\"Unrecognized type \" + opts.type);\n\t}\n}\n\nfunction writeSync(wb, opts) {\n\treset_cp();\n\tcheck_wb(wb);\n\tvar o = dup(opts||{});\n\tif(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; }\n\tif(o.type == \"array\") { o.type = \"binary\"; var out = (writeSync(wb, o)); o.type = \"array\"; return s2ab(out); }\n\tswitch(o.bookType || 'xlsb') {\n\t\tcase 'xml':\n\t\tcase 'xlml': return write_string_type(write_xlml(wb, o), o);\n\t\tcase 'slk':\n\t\tcase 'sylk': return write_string_type(write_slk_str(wb, o), o);\n\t\tcase 'htm':\n\t\tcase 'html': return write_string_type(write_htm_str(wb, o), o);\n\t\tcase 'txt': return write_stxt_type(write_txt_str(wb, o), o);\n\t\tcase 'csv': return write_string_type(write_csv_str(wb, o), o, \"\\ufeff\");\n\t\tcase 'dif': return write_string_type(write_dif_str(wb, o), o);\n\t\tcase 'dbf': return write_binary_type(write_dbf_buf(wb, o), o);\n\t\tcase 'prn': return write_string_type(write_prn_str(wb, o), o);\n\t\tcase 'rtf': return write_string_type(write_rtf_str(wb, o), o);\n\t\tcase 'eth': return write_string_type(write_eth_str(wb, o), o);\n\t\tcase 'fods': return write_string_type(write_ods(wb, o), o);\n\t\tcase 'wk1': return write_binary_type(write_wk1_buf(wb, o), o);\n\t\tcase 'wk3': return write_binary_type(WK_.book_to_wk3(wb, o), o);\n\t\tcase 'biff2': if(!o.biff) o.biff = 2; /* falls through */\n\t\tcase 'biff3': if(!o.biff) o.biff = 3; /* falls through */\n\t\tcase 'biff4': if(!o.biff) o.biff = 4; return write_binary_type(write_biff_buf(wb, o), o);\n\t\tcase 'biff5': if(!o.biff) o.biff = 5; /* falls through */\n\t\tcase 'biff8':\n\t\tcase 'xla':\n\t\tcase 'xls': if(!o.biff) o.biff = 8; return write_cfb_type(wb, o);\n\t\tcase 'xlsx':\n\t\tcase 'xlsm':\n\t\tcase 'xlam':\n\t\tcase 'xlsb':\n\t\tcase 'ods': return write_zip_type(wb, o);\n\t\tdefault: throw new Error (\"Unrecognized bookType |\" + o.bookType + \"|\");\n\t}\n}\n\nfunction resolve_book_type(o) {\n\tif(o.bookType) return;\n\tvar _BT = {\n\t\t\"xls\": \"biff8\",\n\t\t\"htm\": \"html\",\n\t\t\"slk\": \"sylk\",\n\t\t\"socialcalc\": \"eth\",\n\t\t\"Sh33tJS\": \"WTF\"\n\t};\n\tvar ext = o.file.slice(o.file.lastIndexOf(\".\")).toLowerCase();\n\tif(ext.match(/^\\.[a-z]+$/)) o.bookType = ext.slice(1);\n\to.bookType = _BT[o.bookType] || o.bookType;\n}\n\nfunction writeFileSync(wb, filename, opts) {\n\tvar o = opts||{}; o.type = 'file';\n\to.file = filename;\n\tresolve_book_type(o);\n\treturn writeSync(wb, o);\n}\n\nfunction writeFileAsync(filename, wb, opts, cb) {\n\tvar o = opts||{}; o.type = 'file';\n\to.file = filename;\n\tresolve_book_type(o);\n\to.type = 'buffer';\n\tvar _cb = cb; if(!(_cb instanceof Function)) _cb = (opts);\n\treturn _fs.writeFile(filename, writeSync(wb, o), _cb);\n}\nfunction make_json_row(sheet, r, R, cols, header, hdr, dense, o) {\n\tvar rr = encode_row(R);\n\tvar defval = o.defval, raw = o.raw || !Object.prototype.hasOwnProperty.call(o, \"raw\");\n\tvar isempty = true;\n\tvar row = (header === 1) ? [] : {};\n\tif(header !== 1) {\n\t\tif(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; }\n\t\telse row.__rowNum__ = R;\n\t}\n\tif(!dense || sheet[R]) for (var C = r.s.c; C <= r.e.c; ++C) {\n\t\tvar val = dense ? sheet[R][C] : sheet[cols[C] + rr];\n\t\tif(val === undefined || val.t === undefined) {\n\t\t\tif(defval === undefined) continue;\n\t\t\tif(hdr[C] != null) { row[hdr[C]] = defval; }\n\t\t\tcontinue;\n\t\t}\n\t\tvar v = val.v;\n\t\tswitch(val.t){\n\t\t\tcase 'z': if(v == null) break; continue;\n\t\t\tcase 'e': v = (v == 0 ? null : void 0); break;\n\t\t\tcase 's': case 'd': case 'b': case 'n': break;\n\t\t\tdefault: throw new Error('unrecognized type ' + val.t);\n\t\t}\n\t\tif(hdr[C] != null) {\n\t\t\tif(v == null) {\n\t\t\t\tif(val.t == \"e\" && v === null) row[hdr[C]] = null;\n\t\t\t\telse if(defval !== undefined) row[hdr[C]] = defval;\n\t\t\t\telse if(raw && v === null) row[hdr[C]] = null;\n\t\t\t\telse continue;\n\t\t\t} else {\n\t\t\t\trow[hdr[C]] = raw || (o.rawNumbers && val.t == \"n\") ? v : format_cell(val,v,o);\n\t\t\t}\n\t\t\tif(v != null) isempty = false;\n\t\t}\n\t}\n\treturn { row: row, isempty: isempty };\n}\n\n\nfunction sheet_to_json(sheet, opts) {\n\tif(sheet == null || sheet[\"!ref\"] == null) return [];\n\tvar val = {t:'n',v:0}, header = 0, offset = 1, hdr = [], v=0, vv=\"\";\n\tvar r = {s:{r:0,c:0},e:{r:0,c:0}};\n\tvar o = opts || {};\n\tvar range = o.range != null ? o.range : sheet[\"!ref\"];\n\tif(o.header === 1) header = 1;\n\telse if(o.header === \"A\") header = 2;\n\telse if(Array.isArray(o.header)) header = 3;\n\telse if(o.header == null) header = 0;\n\tswitch(typeof range) {\n\t\tcase 'string': r = safe_decode_range(range); break;\n\t\tcase 'number': r = safe_decode_range(sheet[\"!ref\"]); r.s.r = range; break;\n\t\tdefault: r = range;\n\t}\n\tif(header > 0) offset = 0;\n\tvar rr = encode_row(r.s.r);\n\tvar cols = [];\n\tvar out = [];\n\tvar outi = 0, counter = 0;\n\tvar dense = Array.isArray(sheet);\n\tvar R = r.s.r, C = 0, CC = 0;\n\tif(dense && !sheet[R]) sheet[R] = [];\n\tfor(C = r.s.c; C <= r.e.c; ++C) {\n\t\tcols[C] = encode_col(C);\n\t\tval = dense ? sheet[R][C] : sheet[cols[C] + rr];\n\t\tswitch(header) {\n\t\t\tcase 1: hdr[C] = C - r.s.c; break;\n\t\t\tcase 2: hdr[C] = cols[C]; break;\n\t\t\tcase 3: hdr[C] = o.header[C - r.s.c]; break;\n\t\t\tdefault:\n\t\t\t\tif(val == null) val = {w: \"__EMPTY\", t: \"s\"};\n\t\t\t\tvv = v = format_cell(val, null, o);\n\t\t\t\tcounter = 0;\n\t\t\t\tfor(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) vv = v + \"_\" + (++counter);\n\t\t\t\thdr[C] = vv;\n\t\t}\n\t}\n\tfor (R = r.s.r + offset; R <= r.e.r; ++R) {\n\t\tvar row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);\n\t\tif((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row.row;\n\t}\n\tout.length = outi;\n\treturn out;\n}\n\nvar qreg = /\"/g;\nfunction make_csv_row(sheet, r, R, cols, fs, rs, FS, o) {\n\tvar isempty = true;\n\tvar row = [], txt = \"\", rr = encode_row(R);\n\tfor(var C = r.s.c; C <= r.e.c; ++C) {\n\t\tif (!cols[C]) continue;\n\t\tvar val = o.dense ? (sheet[R]||[])[C]: sheet[cols[C] + rr];\n\t\tif(val == null) txt = \"\";\n\t\telse if(val.v != null) {\n\t\t\tisempty = false;\n\t\t\ttxt = ''+(o.rawNumbers && val.t == \"n\" ? val.v : format_cell(val, null, o));\n\t\t\tfor(var i = 0, cc = 0; i !== txt.length; ++i) if((cc = txt.charCodeAt(i)) === fs || cc === rs || cc === 34 || o.forceQuotes) {txt = \"\\\"\" + txt.replace(qreg, '\"\"') + \"\\\"\"; break; }\n\t\t\tif(txt == \"ID\") txt = '\"ID\"';\n\t\t} else if(val.f != null && !val.F) {\n\t\t\tisempty = false;\n\t\t\ttxt = '=' + val.f; if(txt.indexOf(\",\") >= 0) txt = '\"' + txt.replace(qreg, '\"\"') + '\"';\n\t\t} else txt = \"\";\n\t\t/* NOTE: Excel CSV does not support array formulae */\n\t\trow.push(txt);\n\t}\n\tif(o.blankrows === false && isempty) return null;\n\treturn row.join(FS);\n}\n\nfunction sheet_to_csv(sheet, opts) {\n\tvar out = [];\n\tvar o = opts == null ? {} : opts;\n\tif(sheet == null || sheet[\"!ref\"] == null) return \"\";\n\tvar r = safe_decode_range(sheet[\"!ref\"]);\n\tvar FS = o.FS !== undefined ? o.FS : \",\", fs = FS.charCodeAt(0);\n\tvar RS = o.RS !== undefined ? o.RS : \"\\n\", rs = RS.charCodeAt(0);\n\tvar endregex = new RegExp((FS==\"|\" ? \"\\\\|\" : FS)+\"+$\");\n\tvar row = \"\", cols = [];\n\to.dense = Array.isArray(sheet);\n\tvar colinfo = o.skipHidden && sheet[\"!cols\"] || [];\n\tvar rowinfo = o.skipHidden && sheet[\"!rows\"] || [];\n\tfor(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C);\n\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\tif ((rowinfo[R]||{}).hidden) continue;\n\t\trow = make_csv_row(sheet, r, R, cols, fs, rs, FS, o);\n\t\tif(row == null) { continue; }\n\t\tif(o.strip) row = row.replace(endregex,\"\");\n\t\tout.push(row + RS);\n\t}\n\tdelete o.dense;\n\treturn out.join(\"\");\n}\n\nfunction sheet_to_txt(sheet, opts) {\n\tif(!opts) opts = {}; opts.FS = \"\\t\"; opts.RS = \"\\n\";\n\tvar s = sheet_to_csv(sheet, opts);\n\tif(typeof cptable == 'undefined' || opts.type == 'string') return s;\n\tvar o = cptable.utils.encode(1200, s, 'str');\n\treturn String.fromCharCode(255) + String.fromCharCode(254) + o;\n}\n\nfunction sheet_to_formulae(sheet) {\n\tvar y = \"\", x, val=\"\";\n\tif(sheet == null || sheet[\"!ref\"] == null) return [];\n\tvar r = safe_decode_range(sheet['!ref']), rr = \"\", cols = [], C;\n\tvar cmds = [];\n\tvar dense = Array.isArray(sheet);\n\tfor(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C);\n\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\trr = encode_row(R);\n\t\tfor(C = r.s.c; C <= r.e.c; ++C) {\n\t\t\ty = cols[C] + rr;\n\t\t\tx = dense ? (sheet[R]||[])[C] : sheet[y];\n\t\t\tval = \"\";\n\t\t\tif(x === undefined) continue;\n\t\t\telse if(x.F != null) {\n\t\t\t\ty = x.F;\n\t\t\t\tif(!x.f) continue;\n\t\t\t\tval = x.f;\n\t\t\t\tif(y.indexOf(\":\") == -1) y = y + \":\" + y;\n\t\t\t}\n\t\t\tif(x.f != null) val = x.f;\n\t\t\telse if(x.t == 'z') continue;\n\t\t\telse if(x.t == 'n' && x.v != null) val = \"\" + x.v;\n\t\t\telse if(x.t == 'b') val = x.v ? \"TRUE\" : \"FALSE\";\n\t\t\telse if(x.w !== undefined) val = \"'\" + x.w;\n\t\t\telse if(x.v === undefined) continue;\n\t\t\telse if(x.t == 's') val = \"'\" + x.v;\n\t\t\telse val = \"\"+x.v;\n\t\t\tcmds[cmds.length] = y + \"=\" + val;\n\t\t}\n\t}\n\treturn cmds;\n}\n\nfunction sheet_add_json(_ws, js, opts) {\n\tvar o = opts || {};\n\tvar offset = +!o.skipHeader;\n\tvar ws = _ws || ({});\n\tvar _R = 0, _C = 0;\n\tif(ws && o.origin != null) {\n\t\tif(typeof o.origin == 'number') _R = o.origin;\n\t\telse {\n\t\t\tvar _origin = typeof o.origin == \"string\" ? decode_cell(o.origin) : o.origin;\n\t\t\t_R = _origin.r; _C = _origin.c;\n\t\t}\n\t}\n\tvar cell;\n\tvar range = ({s: {c:0, r:0}, e: {c:_C, r:_R + js.length - 1 + offset}});\n\tif(ws['!ref']) {\n\t\tvar _range = safe_decode_range(ws['!ref']);\n\t\trange.e.c = Math.max(range.e.c, _range.e.c);\n\t\trange.e.r = Math.max(range.e.r, _range.e.r);\n\t\tif(_R == -1) { _R = _range.e.r + 1; range.e.r = _R + js.length - 1 + offset; }\n\t} else {\n\t\tif(_R == -1) { _R = 0; range.e.r = js.length - 1 + offset; }\n\t}\n\tvar hdr = o.header || [], C = 0;\n\n\tjs.forEach(function (JS, R) {\n\t\tkeys(JS).forEach(function(k) {\n\t\t\tif((C=hdr.indexOf(k)) == -1) hdr[C=hdr.length] = k;\n\t\t\tvar v = JS[k];\n\t\t\tvar t = 'z';\n\t\t\tvar z = \"\";\n\t\t\tvar ref = encode_cell({c:_C + C,r:_R + R + offset});\n\t\t\tcell = utils.sheet_get_cell(ws, ref);\n\t\t\tif(v && typeof v === 'object' && !(v instanceof Date)){\n\t\t\t\tws[ref] = v;\n\t\t\t} else {\n\t\t\t\tif(typeof v == 'number') t = 'n';\n\t\t\t\telse if(typeof v == 'boolean') t = 'b';\n\t\t\t\telse if(typeof v == 'string') t = 's';\n\t\t\t\telse if(v instanceof Date) {\n\t\t\t\t\tt = 'd';\n\t\t\t\t\tif(!o.cellDates) { t = 'n'; v = datenum(v); }\n\t\t\t\t\tz = (o.dateNF || SSF._table[14]);\n\t\t\t\t}\n\t\t\t\telse if(v === null && o.nullError) { t = 'e'; v = 0; }\n\t\t\t\tif(!cell) ws[ref] = cell = ({t:t, v:v});\n\t\t\t\telse {\n\t\t\t\t\tcell.t = t; cell.v = v;\n\t\t\t\t\tdelete cell.w; delete cell.R;\n\t\t\t\t\tif(z) cell.z = z;\n\t\t\t\t}\n\t\t\t\tif(z) cell.z = z;\n\t\t\t}\n\t\t});\n\t});\n\trange.e.c = Math.max(range.e.c, _C + hdr.length - 1);\n\tvar __R = encode_row(_R);\n\tif(offset) for(C = 0; C < hdr.length; ++C) ws[encode_col(C + _C) + __R] = {t:'s', v:hdr[C]};\n\tws['!ref'] = encode_range(range);\n\treturn ws;\n}\nfunction json_to_sheet(js, opts) { return sheet_add_json(null, js, opts); }\n\nvar utils = {\n\tencode_col: encode_col,\n\tencode_row: encode_row,\n\tencode_cell: encode_cell,\n\tencode_range: encode_range,\n\tdecode_col: decode_col,\n\tdecode_row: decode_row,\n\tsplit_cell: split_cell,\n\tdecode_cell: decode_cell,\n\tdecode_range: decode_range,\n\tformat_cell: format_cell,\n\tget_formulae: sheet_to_formulae,\n\tmake_csv: sheet_to_csv,\n\tmake_json: sheet_to_json,\n\tmake_formulae: sheet_to_formulae,\n\tsheet_add_aoa: sheet_add_aoa,\n\tsheet_add_json: sheet_add_json,\n\tsheet_add_dom: sheet_add_dom,\n\taoa_to_sheet: aoa_to_sheet,\n\tjson_to_sheet: json_to_sheet,\n\ttable_to_sheet: parse_dom_table,\n\ttable_to_book: table_to_book,\n\tsheet_to_csv: sheet_to_csv,\n\tsheet_to_txt: sheet_to_txt,\n\tsheet_to_json: sheet_to_json,\n\tsheet_to_html: HTML_.from_sheet,\n\tsheet_to_formulae: sheet_to_formulae,\n\tsheet_to_row_object_array: sheet_to_json\n};\n\n(function(utils) {\nutils.consts = utils.consts || {};\nfunction add_consts(R/*Array*/) { R.forEach(function(a){ utils.consts[a[0]] = a[1]; }); }\n\nfunction get_default(x, y, z) { return x[y] != null ? x[y] : (x[y] = z); }\n\n/* get cell, creating a stub if necessary */\nfunction ws_get_cell_stub(ws, R, C) {\n\t/* A1 cell address */\n\tif(typeof R == \"string\") {\n\t\t/* dense */\n\t\tif(Array.isArray(ws)) {\n\t\t\tvar RC = decode_cell(R);\n\t\t\tif(!ws[RC.r]) ws[RC.r] = [];\n\t\t\treturn ws[RC.r][RC.c] || (ws[RC.r][RC.c] = {t:'z'});\n\t\t}\n\t\treturn ws[R] || (ws[R] = {t:'z'});\n\t}\n\t/* cell address object */\n\tif(typeof R != \"number\") return ws_get_cell_stub(ws, encode_cell(R));\n\t/* R and C are 0-based indices */\n\treturn ws_get_cell_stub(ws, encode_cell({r:R,c:C||0}));\n}\nutils.sheet_get_cell = ws_get_cell_stub;\n\n/* find sheet index for given name / validate index */\nfunction wb_sheet_idx(wb, sh) {\n\tif(typeof sh == \"number\") {\n\t\tif(sh >= 0 && wb.SheetNames.length > sh) return sh;\n\t\tthrow new Error(\"Cannot find sheet # \" + sh);\n\t} else if(typeof sh == \"string\") {\n\t\tvar idx = wb.SheetNames.indexOf(sh);\n\t\tif(idx > -1) return idx;\n\t\tthrow new Error(\"Cannot find sheet name |\" + sh + \"|\");\n\t} else throw new Error(\"Cannot find sheet |\" + sh + \"|\");\n}\n\n/* simple blank workbook object */\nutils.book_new = function() {\n\treturn { SheetNames: [], Sheets: {} };\n};\n\n/* add a worksheet to the end of a given workbook */\nutils.book_append_sheet = function(wb, ws, name) {\n\tif(!name) for(var i = 1; i <= 0xFFFF; ++i, name = undefined) if(wb.SheetNames.indexOf(name = \"Sheet\" + i) == -1) break;\n\tif(!name || wb.SheetNames.length >= 0xFFFF) throw new Error(\"Too many worksheets\");\n\tcheck_ws_name(name);\n\tif(wb.SheetNames.indexOf(name) >= 0) throw new Error(\"Worksheet with name |\" + name + \"| already exists!\");\n\n\twb.SheetNames.push(name);\n\twb.Sheets[name] = ws;\n};\n\n/* set sheet visibility (visible/hidden/very hidden) */\nutils.book_set_sheet_visibility = function(wb, sh, vis) {\n\tget_default(wb,\"Workbook\",{});\n\tget_default(wb.Workbook,\"Sheets\",[]);\n\n\tvar idx = wb_sheet_idx(wb, sh);\n\t// $FlowIgnore\n\tget_default(wb.Workbook.Sheets,idx, {});\n\n\tswitch(vis) {\n\t\tcase 0: case 1: case 2: break;\n\t\tdefault: throw new Error(\"Bad sheet visibility setting \" + vis);\n\t}\n\t// $FlowIgnore\n\twb.Workbook.Sheets[idx].Hidden = vis;\n};\nadd_consts([\n\t[\"SHEET_VISIBLE\", 0],\n\t[\"SHEET_HIDDEN\", 1],\n\t[\"SHEET_VERY_HIDDEN\", 2]\n]);\n\n/* set number format */\nutils.cell_set_number_format = function(cell, fmt) {\n\tcell.z = fmt;\n\treturn cell;\n};\n\n/* set cell hyperlink */\nutils.cell_set_hyperlink = function(cell, target, tooltip) {\n\tif(!target) {\n\t\tdelete cell.l;\n\t} else {\n\t\tcell.l = ({ Target: target });\n\t\tif(tooltip) cell.l.Tooltip = tooltip;\n\t}\n\treturn cell;\n};\nutils.cell_set_internal_link = function(cell, range, tooltip) { return utils.cell_set_hyperlink(cell, \"#\" + range, tooltip); };\n\n/* add to cell comments */\nutils.cell_add_comment = function(cell, text, author) {\n\tif(!cell.c) cell.c = [];\n\tcell.c.push({t:text, a:author||\"SheetJS\"});\n};\n\n/* set array formula and flush related cells */\nutils.sheet_set_array_formula = function(ws, range, formula) {\n\tvar rng = typeof range != \"string\" ? range : safe_decode_range(range);\n\tvar rngstr = typeof range == \"string\" ? range : encode_range(range);\n\tfor(var R = rng.s.r; R <= rng.e.r; ++R) for(var C = rng.s.c; C <= rng.e.c; ++C) {\n\t\tvar cell = ws_get_cell_stub(ws, R, C);\n\t\tcell.t = 'n';\n\t\tcell.F = rngstr;\n\t\tdelete cell.v;\n\t\tif(R == rng.s.r && C == rng.s.c) cell.f = formula;\n\t}\n\treturn ws;\n};\n\nreturn utils;\n})(utils);\n\nif(has_buf && typeof require != 'undefined') (function() {\n\tvar strmod = require('stream');\n\tif(!strmod) return;\n\tvar Readable = strmod.Readable;\n\tif(!Readable) return;\n\n\tvar write_csv_stream = function(sheet, opts) {\n\t\tvar stream = Readable();\n\t\tvar o = opts == null ? {} : opts;\n\t\tif(sheet == null || sheet[\"!ref\"] == null) { stream.push(null); return stream; }\n\t\tvar r = safe_decode_range(sheet[\"!ref\"]);\n\t\tvar FS = o.FS !== undefined ? o.FS : \",\", fs = FS.charCodeAt(0);\n\t\tvar RS = o.RS !== undefined ? o.RS : \"\\n\", rs = RS.charCodeAt(0);\n\t\tvar endregex = new RegExp((FS==\"|\" ? \"\\\\|\" : FS)+\"+$\");\n\t\tvar row = \"\", cols = [];\n\t\to.dense = Array.isArray(sheet);\n\t\tvar colinfo = o.skipHidden && sheet[\"!cols\"] || [];\n\t\tvar rowinfo = o.skipHidden && sheet[\"!rows\"] || [];\n\t\tfor(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C);\n\t\tvar R = r.s.r;\n\t\tvar BOM = false;\n\t\tstream._read = function() {\n\t\t\tif(!BOM) { BOM = true; return stream.push(\"\\uFEFF\"); }\n\t\t\twhile(R <= r.e.r) {\n\t\t\t\t++R;\n\t\t\t\tif ((rowinfo[R-1]||{}).hidden) continue;\n\t\t\t\trow = make_csv_row(sheet, r, R-1, cols, fs, rs, FS, o);\n\t\t\t\tif(row != null) {\n\t\t\t\t\tif(o.strip) row = row.replace(endregex,\"\");\n\t\t\t\t\tstream.push(row + RS);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(R > r.e.r) return stream.push(null);\n\t\t};\n\t\treturn stream;\n\t};\n\n\tvar write_html_stream = function(ws, opts) {\n\t\tvar stream = Readable();\n\n\t\tvar o = opts || {};\n\t\tvar header = o.header != null ? o.header : HTML_.BEGIN;\n\t\tvar footer = o.footer != null ? o.footer : HTML_.END;\n\t\tstream.push(header);\n\t\tvar r = decode_range(ws['!ref']);\n\t\to.dense = Array.isArray(ws);\n\t\tstream.push(HTML_._preamble(ws, r, o));\n\t\tvar R = r.s.r;\n\t\tvar end = false;\n\t\tstream._read = function() {\n\t\t\tif(R > r.e.r) {\n\t\t\t\tif(!end) { end = true; stream.push(\"\" + footer); }\n\t\t\t\treturn stream.push(null);\n\t\t\t}\n\t\t\twhile(R <= r.e.r) {\n\t\t\t\tstream.push(HTML_._row(ws, r, R, o));\n\t\t\t\t++R;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t};\n\t\treturn stream;\n\t};\n\n\tvar write_json_stream = function(sheet, opts) {\n\t\tvar stream = Readable({objectMode:true});\n\n\t\tif(sheet == null || sheet[\"!ref\"] == null) { stream.push(null); return stream; }\n\t\tvar val = {t:'n',v:0}, header = 0, offset = 1, hdr = [], v=0, vv=\"\";\n\t\tvar r = {s:{r:0,c:0},e:{r:0,c:0}};\n\t\tvar o = opts || {};\n\t\tvar range = o.range != null ? o.range : sheet[\"!ref\"];\n\t\tif(o.header === 1) header = 1;\n\t\telse if(o.header === \"A\") header = 2;\n\t\telse if(Array.isArray(o.header)) header = 3;\n\t\tswitch(typeof range) {\n\t\t\tcase 'string': r = safe_decode_range(range); break;\n\t\t\tcase 'number': r = safe_decode_range(sheet[\"!ref\"]); r.s.r = range; break;\n\t\t\tdefault: r = range;\n\t\t}\n\t\tif(header > 0) offset = 0;\n\t\tvar rr = encode_row(r.s.r);\n\t\tvar cols = [];\n\t\tvar counter = 0;\n\t\tvar dense = Array.isArray(sheet);\n\t\tvar R = r.s.r, C = 0, CC = 0;\n\t\tif(dense && !sheet[R]) sheet[R] = [];\n\t\tfor(C = r.s.c; C <= r.e.c; ++C) {\n\t\t\tcols[C] = encode_col(C);\n\t\t\tval = dense ? sheet[R][C] : sheet[cols[C] + rr];\n\t\t\tswitch(header) {\n\t\t\t\tcase 1: hdr[C] = C - r.s.c; break;\n\t\t\t\tcase 2: hdr[C] = cols[C]; break;\n\t\t\t\tcase 3: hdr[C] = o.header[C - r.s.c]; break;\n\t\t\t\tdefault:\n\t\t\t\t\tif(val == null) val = {w: \"__EMPTY\", t: \"s\"};\n\t\t\t\t\tvv = v = format_cell(val, null, o);\n\t\t\t\t\tcounter = 0;\n\t\t\t\t\tfor(CC = 0; CC < hdr.length; ++CC) if(hdr[CC] == vv) vv = v + \"_\" + (++counter);\n\t\t\t\t\thdr[C] = vv;\n\t\t\t}\n\t\t}\n\t\tR = r.s.r + offset;\n\t\tstream._read = function() {\n\t\t\tif(R > r.e.r) return stream.push(null);\n\t\t\twhile(R <= r.e.r) {\n\t\t\t\t//if ((rowinfo[R-1]||{}).hidden) continue;\n\t\t\t\tvar row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);\n\t\t\t\t++R;\n\t\t\t\tif((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) {\n\t\t\t\t\tstream.push(row.row);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn stream;\n\t};\n\n\tXLSX.stream = {\n\t\tto_json: write_json_stream,\n\t\tto_html: write_html_stream,\n\t\tto_csv: write_csv_stream\n\t};\n})();\n\nif(typeof parse_xlscfb !== \"undefined\") XLSX.parse_xlscfb = parse_xlscfb;\nXLSX.parse_zip = parse_zip;\nXLSX.read = readSync; //xlsread\nXLSX.readFile = readFileSync; //readFile\nXLSX.readFileSync = readFileSync;\nXLSX.write = writeSync;\nXLSX.writeFile = writeFileSync;\nXLSX.writeFileSync = writeFileSync;\nXLSX.writeFileAsync = writeFileAsync;\nXLSX.utils = utils;\nXLSX.SSF = SSF;\nif(typeof CFB !== \"undefined\") XLSX.CFB = CFB;\n}\n/*global define */\nif(typeof exports !== 'undefined') make_xlsx_lib(exports);\nelse if(typeof module !== 'undefined' && module.exports) make_xlsx_lib(module.exports);\nelse if(typeof define === 'function' && define.amd) define('xlsx', function() { if(!XLSX.version) make_xlsx_lib(XLSX); return XLSX; });\nelse make_xlsx_lib(XLSX);\n/* NOTE: the following extra line is needed for \"Lightning Locker Service\" */\nif(typeof window !== 'undefined' && !window.XLSX) try { window.XLSX = XLSX; } catch(e) {}\n/*exported XLS, ODS */\nvar XLS = XLSX, ODS = XLSX;\n"],"names":["cptable","version","d","D","e","i","charCodeAt","charAt","enc","dec","j","split","length","module","exports","DO_NOT_EXPORT_CODEPAGE","root","factory","cpt","this","magic","sbcs_cache","dbcs_cache","magic_cache","magic_decode","magic_encode","cpdcache","cpecache","sfcc","x","String","fromCharCode","cca","has_buf","Buffer","Buffer_from","nbfs","from","buf","bind","allocUnsafe","n","mdl","mdb","sbcs_encode","cp","EE","E","keys","Object","len","ee","make_EE","data","ofmt","out","w","isBuffer","slice","toString","call","sbcs_decode","DD","c","dbcs_encode","f","jj","k","dbcs_decode","utf8_d","map","ww","direct","encache","s","null_enc","cp_decache","cache","decache","forEach","last_enc","last_cp","sbcs","dbcs","BM","utils","decode","F","Array","C","M","Error","match","dash","tt","o64","c1","c2","c3","e2","e3","e4","l","indexOf","push","join","encode","isstr","hascp","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","DO_NOT_EXPORT_JSZIP","JSZipSync","undefined","apply","globalThis","window","__webpack_require__","g","$","global","self","t","r","o","u","_dereq_","_keyStr","input","utf8","chr1","chr2","chr3","enc1","enc2","enc3","enc4","output","isNaN","replace","CompressedObject","compressedSize","uncompressedSize","crc32","compressionMethod","compressedContent","prototype","getContent","getCompressedContent","STORE","compress","content","uncompress","compressInputType","uncompressInputType","DEFLATE","table","crc","isArray","getTypeOf","b","iTop","DataReader","index","checkOffset","offset","checkIndex","newIndex","setIndex","skip","byteAt","readInt","size","result","readString","transformTo","readData","lastIndexOfSignature","sig","readDate","dostime","Date","base64","binary","dir","createFolders","date","compression","comment","string2binary","str","string2Uint8Array","uint8Array2String","array","string2Blob","buffer","arrayBuffer2Blob","outputType","checkSupport","type","MAX_VALUE_16BITS","MAX_VALUE_32BITS","pretty","findCompression","isRegExp","object","USE_TYPEDARRAY","Uint8Array","Uint16Array","Uint32Array","pako","deflateRaw","inflateRaw","options","files","load","clone","newObj","support","defaults","compressions","ZipEntries","zipEntries","file","fileName","decompressed","optimizedBinaryString","fileComment","zipComment","alloc","encoding","test","Uint8ArrayReader","NodeBufferReader","signature","nodeBuffer","StringWriter","Uint8ArrayWriter","getRawData","_data","copy","set","getBinaryData","nodebuffer","asBinary","dataToString","asUTF8","utf8decode","utf8encode","ZipObject","name","_initialMetadata","asText","asNodeBuffer","asUint8Array","asArrayBuffer","decToHex","bytes","hex","extend","attr","arguments","hasOwnProperty","fileAdd","parent","dataType","toUpperCase","prepareFileAttrs","parentFolder","folderAdd","path","substring","lastSlash","lastIndexOf","generateCompressedObjectFrom","generateZipParts","compressedObject","dosTime","dosDate","utfEncodedFileName","utfEncodedComment","useUTF8ForFileName","useUTF8ForComment","extraFields","unicodePathExtraField","unicodeCommentExtraField","getHours","getMinutes","getSeconds","getFullYear","getMonth","getDate","header","fileRecord","LOCAL_FILE_HEADER","dirRecord","CENTRAL_FILE_HEADER","stream","filter","search","filename","relativePath","fileClone","regexp","folder","arg","newFolder","ret","remove","kids","generate","writer","dirEnd","zipData","localDirLength","centralDirLength","compressionName","zipPart","CENTRAL_DIRECTORY_END","typeName","toLowerCase","append","zip","finalize","string","ZIP64_CENTRAL_DIRECTORY_LOCATOR","ZIP64_CENTRAL_DIRECTORY_END","DATA_DESCRIPTOR","StringReader","arraybuffer","ArrayBuffer","uint8array","blob","Blob","builder","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","getBlob","sig0","sig1","sig2","sig3","subarray","_utf8len","utf8border","max","pos","buf2string","c_len","utf16buf","applyFromCharCode","m_pos","str_len","buf_len","string2buf","nextBoundary","Math","min","identity","stringToArrayLike","arrayLikeToString","chunk","canUseApply","resultStr","floor","arrayLikeToArrayLike","arrayFrom","arrayTo","transform","byteLength","inputType","code","res","method","ZipEntry","jszipProto","loadOptions","checkSignature","expectedSignature","reader","readBlockEndOfCentral","diskNumber","diskWithCentralDirStart","centralDirRecordsOnThisDisk","centralDirRecords","centralDirSize","centralDirOffset","zipCommentLength","readBlockZip64EndOfCentral","zip64EndOfCentralSize","versionMadeBy","versionNeeded","zip64ExtensibleData","extraFieldId","extraFieldLength","extraFieldValue","extraDataSize","id","value","readBlockZip64EndOfCentralLocator","diskWithZip64CentralDirStart","relativeOffsetEndOfZip64CentralDir","disksCount","readLocalFiles","localHeaderOffset","readLocalPart","handleUTF8","readCentralDir","zip64","readCentralPart","readEndOfCentral","prepareReader","isEncrypted","bitFlag","useUTF8","prepareCompressedContent","previousIndex","compressedFileData","prepareContent","uncompressedFileData","localExtraFieldsLength","fileNameLength","checkCRC32","extraFieldsLength","fileCommentLength","diskNumberStart","internalFileAttributes","externalFileAttributes","readExtraFields","parseZIP64ExtraField","extraReader","start","upath","findExtraFieldUnicodePath","ucomment","findExtraFieldUnicodeComment","upathField","ucommentField","assign","zlib_deflate","strings","msg","zstream","Deflate","level","chunkSize","windowBits","memLevel","strategy","to","opt","raw","gzip","err","ended","chunks","strm","avail_out","status","deflateInit2","deflateSetHeader","deflate","deflator","mode","_mode","next_in","avail_in","Buf8","next_out","onEnd","onData","buf2binstring","shrinkBuf","deflateEnd","flattenChunks","zlib_inflate","gzheader","Inflate","inflateInit2","Z_OK","inflateGetHeader","inflate","inflator","next_out_utf8","tail","utf8str","Z_FINISH","Z_NO_FLUSH","binstring2buf","Z_STREAM_END","arraySet","inflateEnd","ungzip","TYPED_OK","Int32Array","obj","sources","source","shift","TypeError","p","fnTyped","dest","src","src_offs","dest_offs","fnUntyped","concat","setTyped","on","Buf16","Buf32","STR_APPLY_OK","STR_APPLY_UIA_OK","__","adler","s1","s2","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_BLOCK","Z_TREES","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","crcTable","makeTable","end","trees","adler32","MAX_MATCH","MIN_LOOKAHEAD","HCRC_STATE","BUSY_STATE","FINISH_STATE","errorCode","rank","zero","flush_pending","state","pending","pending_buf","pending_out","total_out","flush_block_only","last","_tr_flush_block","block_start","strstart","put_byte","putShortMSB","read_buf","wrap","total_in","longest_match","cur_match","chain_length","max_chain_length","scan","best_len","prev_length","nice_match","limit","w_size","_win","wmask","w_mask","prev","strend","scan_end1","scan_end","good_match","lookahead","match_start","fill_window","m","more","_w_size","window_size","hash_size","head","insert","ins_h","hash_shift","hash_mask","deflate_fast","flush","hash_head","bflush","match_length","_tr_tally","max_lazy_match","MIN_MATCH","last_lit","deflate_slow","max_insert","prev_match","match_available","configuration_table","Config","good_length","max_lazy","nice_length","max_chain","func","DeflateState","pending_buf_size","gzhead","gzindex","last_flush","w_bits","hash_bits","dyn_ltree","HEAP_SIZE","dyn_dtree","bl_tree","l_desc","d_desc","bl_desc","bl_count","MAX_BITS","heap","heap_len","heap_max","depth","l_buf","lit_bufsize","d_buf","opt_len","static_len","matches","bi_buf","bi_valid","deflateResetKeep","data_type","_tr_init","deflateReset","max_block_size","max_start","deflateInit","old_flush","beg","val","text","hcrc","extra","time","os","bstate","deflate_huff","deflate_rle","_tr_align","_tr_stored_block","deflateInfo","xflags","extra_len","done","_in","_out","dmax","wsize","whave","wnext","hold","bits","lcode","dcode","lmask","dmask","here","op","dist","from_source","lencode","distcode","lenbits","distbits","top","dolen","sane","inflate_fast","inflate_table","TYPE","BAD","ZSWAP32","q","InflateState","havedict","flags","check","total","wbits","ncode","nlen","ndist","have","next","lens","work","lendyn","distdyn","back","was","inflateResetKeep","inflateReset","inflateReset2","lenfix","distfix","virgin","fixedtables","sym","inflateInit","put","left","here_bits","here_op","here_val","last_bits","last_op","last_val","opts","hbuf","order","inf_leave","updatewindow","inflateInfo","lbase","lext","dbase","dext","lens_index","codes","table_index","incr","fill","low","mask","curr","drop","used","huff","base","base_index","count","MAXBITS","offs","extra_index","extra_lbits","extra_dbits","extra_blbits","bl_order","static_ltree","static_dtree","D_CODES","_dist_code","_length_code","base_length","base_dist","static_l_desc","static_d_desc","static_bl_desc","StaticTreeDesc","static_tree","extra_bits","extra_base","elems","max_length","has_stree","TreeDesc","dyn_tree","stat_desc","max_code","d_code","put_short","send_bits","send_code","tree","bi_reverse","gen_codes","next_code","init_block","LITERALS","END_BLOCK","bi_windup","smaller","_n2","_m2","pqdownheap","v","compress_block","ltree","dtree","lc","lx","build_tree","desc","node","stree","h","xbits","overflow","gen_bitlen","scan_tree","curlen","prevlen","nextlen","max_count","min_count","REP_3_6","REPZ_3_10","REPZ_11_138","send_tree","static_init_done","stored_len","copy_block","LENGTH_CODES","L_CODES","tr_static_init","opt_lenb","static_lenb","max_blindex","black_mask","detect_data_type","BL_CODES","build_bl_tree","lcodes","dcodes","blcodes","send_all_trees","STATIC_TREES","bi_flush","XLSX","current_codepage","current_ansi","VALID_ANSI","CS2CP","set_ansi","set_cp","reset_cp","char_codes","debom","utf16leread","utf16beread","_getchar","_getansi","Base64","e1","process","versions","new_raw_buf","new_unsafe_buf","s2a","s2ab","view","a2s","ab2a","bconcat","bufs","chr0","SSF","make_ssf","_strrev","pad0","pad_","rpad_","p2_32","pow","pad0r","round","pad0r1","pad0r2","isgeneral","days","months","init_table","table_fmt","default_map","defi","default_str","frac","mixed","sgn","B","P_2","P_1","P","Q_2","Q_1","Q","A","parse_date_code","b2","dow","dout","T","y","H","S","abs","date1904","setDate","getDay","fix_hijri","basedate","dnthresh","getTime","base1904","datenum_local","epoch","getTimezoneOffset","_general_int","general_fmt_num","trailing_zeroes_and_decimal","strip_decimal","mantissa_zeroes_and_decimal","exp_with_single_digit","V","log","LOG10E","toPrecision","toFixed","toExponential","small_exp","substr","large_exp","normalize_exp","general_fmt","format","write_date","fmt","ss0","ss","outl","commaify","_general_num","_general","write_num","pct1","write_num_exp","idx","period","fakee","$$","$1","$2","$3","frac1","dec1","closeparen","phone","hashq","cc","rnd","dd","_frac","write_num_flt","ffmt","write_num_cm","sfmt","mul","write_num_pct","ri","ff","aval","sign","den","parseInt","rr","myn","myd","write_num_f1","carry","oa","lres","rres","flr","write_num_exp2","write_num_int","write_num_cm2","write_num_pct2","write_num_f2","split_fmt","in_str","_split","abstime","fmt_is_date","eval_fmt","flen","dt","lst","hr","ssm","bt","nstr","myv","ostr","vv","decpt","lasti","retval","is_date","_eval","cfregex","cfregex2","chkcond","thresh","parseFloat","dateNF","lat","m1","m2","choose_fmt","load_entry","_table","get_table","load_table","tbl","CRC32","XLMLFormatMap","Currency","Fixed","Standard","Percent","Scientific","SSFImplicit","dateNFregex","signed_crc_table","bstr","seed","L","crc32_buf_8","_fs","CFB","fs","dirname","write_dos_date","hms","write_shift","ymd","parse_extra_field","prep_blob","read_shift","sz","tgt","mtime","atime","ctime","mt","get_fs","parse","parse_zip","mver","nmfs","difat_sec_cnt","dir_start","minifat_start","difat_start","ssz","fat_addrs","mv","chk","HEADER_SIGNATURE","check_get_mver","check_shifts","dir_cnt","sectors","nsectors","ceil","sectorify","sleuth_fat","sector_list","sl","chkd","buf_chain","modulus","seen","addr","__readInt32LE","nodes","__toBuffer","make_sector_list","ENDOFCHAIN","Paths","FileIndex","FullPaths","mini","minifat_store","pl","sector","namelen","__utf16le","color","R","clsid","ct","read_date","storage","get_sector_list","get_mfat_entry","read_directory","FI","FP","dad","build_full_paths","entry","payload","MSSZ","new_buf","cnt","__readUInt32LE","init_cfb","cfb","CLSID","nm","find","rebuild_cfb","seed_cfb","gc","_file","pop","now","HEADER_CLSID","sort","Z","namecmp","elt","_write","_opts","fileType","cdirs","start_cd","fcnt","fp","fi","crcs","sz_cd","namebuf","outbuf","_deflateRawSync","write_zip","mini_size","fat_size","mfat_cnt","fat_base","fat_cnt","difat_cnt","HEADER_SIG","chainit","consts","DIFSECT","FATSECT","_nm","_zlib","MAXREGSECT","FREESECT","HEADER_MINOR_VERSION","MAXREGSID","NOSTREAM","EntryTypes","deflateRawSync","_deflate","CLEN_ORDER","LEN_LN","DST_LN","bit_swap_8","use_typed_arrays","bitswap8","bit_swap_n","rev","read_bits_2","bl","read_bits_3","read_bits_5","read_bits_7","read_bits_n","realloc","a","zero_fill_array","_deflateRaw","boff","off","clens","cmap","MAX","maxlen","ccode","ctree","cleni","fix_lmap","fix_dmap","dlens","dyn_lmap","dyn_dmap","dyn_cmap","dyn_len_1","dyn_len_2","dyn","_HLIT","_HDIST","_HCLEN","read_bits_4","hcodes","h1","h2","_inflate","usz","woff","OL","max_len_1","max_len_2","len_eb","dst_eb","dst","warn_or_throw","wrn","console","error","csz","efsz","fcsz","EF","parse_local_file","meth","setMilliseconds","setFullYear","setMonth","setHours","setMinutes","setSeconds","parse_dos_date","_csz","_usz","ef","InflRaw","InflateRaw","_processChunk","_finishFlushFlag","bytesRead","_inflateRawSync","_crc32","cfb_add","unsafe","fpath","cfb_gc","UCFullPaths","UCPaths","UCPath","read","readFileSync","read_file","write","writeFileSync","writeFile","cfb_new","cfb_del","splice","cfb_mov","old_name","new_name","ReadShift","CheckField","use_zlib","zlib","message","_inflateRaw","blobify","a2u","write_dl","fname","utf8write","IE_SaveFile","navigator","msSaveBlob","saveAs","URL","document","createElement","createObjectURL","url","chrome","downloads","download","revokeObjectURL","setTimeout","href","body","appendChild","click","removeChild","File","Folder","open","close","ks","o2","evert_key","key","K","evert","evert_num","datenum","refdate","refoffset","numdate","setTime","parse_isodur","sec","good_pd_date","good_pd","parseDate","fixdate","cc2str","arr","dup","JSON","stringify","fuzzynum","Number","isFinite","NaN","wt","fuzzydate","getYear","jszip","safe_split_regex","getdatastr","safegetzipfile","getzipfile","getzipdata","safe","getdatabin","getzipstr","zip_add_file","zip_new","zip_read","resolve_path","target","step","XML_HEADER","attregexg","tagregex","nsregex","nsregex2","parsexmltag","tag","skip_root","skip_LC","z","eq","quot","trim","strip_ns","encregex","coderegex","encodings","rencoding","unescapexml","decregex","charegex","escapexml","escapexmltag","htmlcharegex","escapehtml","xlml_fixstr","entregex","entrepl","parsexmlbool","utf8read","orig","utf8readb","corpus","utf8readc","mtcache","entities","vt_cache","matchtag","RegExp","htmldecode","vtregex","vtvregex","vtmregex","parseVector","baseType","WTF","wtregex","writetag","wxt_helper","writextag","write_w3cdtf","toISOString","__lpp4","___lpp4","XMLNS","dc","dcterms","dcmitype","mx","sjs","vt","xsi","xsd","XLMLNS","___toBuffer","__readUInt16LE","___utf16le","__hexlify","___hexlify","__utf8","__readUInt8","___utf8","__lpstr","___lpstr","__cpstr","___cpstr","__lpwstr","___lpwstr","__double","___double","__8lpp4","___8lpp4","Infinity","read_double_le","is_buf","readUInt32LE","readDoubleLE","__readInt16LE","__readInt32BE","oI","oR","loc","oo","__writeUInt32LE","__writeInt32LE","__writeUInt16LE","WriteShift","cppayload","bs","av","LN2","write_double_le","hexstr","fld","parsenoop","recordhopper","cb","tmpbyte","cntbyte","RT","XLSBRecordEnum","buf_array","blksz","newblk","curbuf","endbuf","_bufs","write_record","ba","XLSBRE","shift_cell_xls","cell","cRel","rRel","biff","shift_range_xls","range","encode_cell_xls","encode_cell","encode_range_xls","encode_row","encode_col","decode_row","rowstr","row","decode_col","colstr","col","decode_cell","cstr","decode_range","encode_range","cs","ce","safe_decode_range","format_cell","BErr","XF","numFmtId","safe_format_cell","sheet_to_workbook","sheet","sheets","SheetNames","Sheets","sheet_add_aoa","_ws","dense","ws","_R","_C","origin","_origin","_range","__R","__C","nullError","sheetStubs","cellDates","cell_ref","aoa_to_sheet","write_UInt32LE","parse_XLWideString","cchCharacters","write_XLWideString","_null","parse_StrRun","ich","ifnt","parse_RichStr","rgsStrRun","dwSizeStrRun","O","_crypto","crypto","rc4","md5","createHash","update","digest","make_offcrypto","parse_BrtCommentText","parse_XLSBCell","iStyleRef","write_XLSBCell","parse_XLSBShortCell","write_XLSBShortCell","parse_XLSBCodeName","write_XLSBCodeName","parse_XLNullableWideString","write_XLNullableWideString","parse_XLNameWideString","parse_RelID","write_RelID","parse_RkNumber","fX100","fInt","RK","write_RkNumber","d100","parse_RfX","parse_UncheckedRfX","write_UncheckedRfX","parse_Xnum","write_Xnum","write_BrtColor","auto","theme","nTS","tint","rgb","parse_ClipboardFormatOrString","VT_STRING","VT_CUSTOM","DocSummaryPIDDSI","VT_VECTOR","SummaryPIDSI","DocSummaryRE","SummaryRE","CountryEnum","XLSFillPattern","XLSIcv","RBErr","ct2type","CT_LIST","workbooks","xlsx","xlsm","xlsb","xlam","xltx","strs","comments","charts","dialogs","macros","styles","type2ct","evert_arr","CT","CTYPE_XML_ROOT","xmlns","CTYPE_DEFAULTS","rels","Extension","ContentType","RELS","WB","SHEET","HLINK","VML","XPATH","XMISS","XLINK","CXML","CXMLP","VBA","get_rels_path","parse_rels","currentFilePath","hash","rel","Type","Target","Id","TargetMode","canonictarget","RELS_ROOT","write_rels","rid","RELS_EXTERN","add_rels","rId","relobj","targetmode","write_rdf_type","write_rdf_has","write_meta_ods","CORE_PROPS","CORE_PROPS_REGEX","parse_core_props","cur","CORE_PROPS_XML_ROOT","cp_doit","EXT_PROPS","load_props_pairs","HP","TOP","props","hp","parts","Worksheets","NamedRanges","DefinedNames","Chartsheets","ChartNames","EXT_PROPS_XML_ROOT","CUST_PROPS","custregex","CUST_PROPS_XML_ROOT","XLMLDocPropsMap","Title","Subject","Author","Keywords","Comments","LastAuthor","RevNumber","Application","LastPrinted","CreatedDate","ModifiedDate","Category","Manager","Company","AppVersion","ContentStatus","Identifier","Language","evert_XLMLDPM","xlml_set_prop","Props","parse_FILETIME","dwLowDateTime","dwHighDateTime","parse_lpstr","pad","parse_lpwstr","parse_VtStringBase","stringType","parse_VtString","parse_VtHeadingPair","headingString","parse_TypedPropertyValue","parse_dictionary","CodePage","dict","pid","parse_BLOB","Size","parse_ClipboardData","parse_VtUnalignedString","cElements","parse_VtVecHeadingPairValue","parse_VtVecLpwstrValue","parse_VtVecUnalignedLpstrValue","write_TypedPropertyValue","write_FILETIME","parse_PropertySet","PIDSI","start_addr","NumProps","Dictionary","DictObj","PropID","Offset","PropH","fail","piddsi","oldpos","parsebool","XLSPSSkip","guess_property_type","write_PropertySet","entries","RE","hdr","piao","prop","pr","pio","unshift","pinfo","parse_PropertySetStream","NumSets","FMTID0","FMTID1","Offset0","Offset1","SystemIdentifier","PSet1","PSet0","rval","FMTID","write_PropertySetStream","entries2","clsid2","ps0","ps1","parsenoop2","writebool","parseuint16","writeuint16","parseuint16a","parslurp","write_Bes","parse_ShortXLUnicodeString","cch","parse_XLUnicodeRichExtendedString","cbExtRst","fExtSt","fRichSt","width","cRun","write_XLUnicodeRichExtendedString","xlstr","otext","parse_XLUnicodeStringNoCch","parse_XLUnicodeString","parse_XLUnicodeString2","write_XLUnicodeString","parse_HyperlinkString","write_HyperlinkString","write_Hyperlink","hl","hashidx","Pretarget","parse_LongRGBA","parse_LongRGB","parse_XLSCell","ixfe","write_XLSCell","parse_XTI","parse_RkRec","parse_Ref8U","rwFirst","rwLast","write_Ref8U","parse_RefU","parse_Ref","parse_FtCmo","ot","parse_FtSkip","FtTab","cf","fSharedNote","parse_BOF","BIFFVer","write_BOF","wb","bookType","write_BoundSheet8","hs","parse_DefaultRowHeight","miyRw","Unsynced","DyZero","ExAsc","ExDsc","write_Format","b5","parse_BIFF2Format","parse_Dimensions","write_XF","ixfeP","style","parse_BoolErr","parse_Bes","parse_XLHeaderFooter","parse_ExternName","fBuiltIn","fWantAdvise","fWantPict","fOle","fOleLink","fIcon","sbcch","udfName","parse_AddinUdf","Name","XLSLblBuiltIn","parse_Lbl","chKey","cce","itab","npflen","rgce","rgcb","parse_Rgce","parse_RgbExtra","parse_NameParsedFormula","parse_ExternSheet","parse_BIFF5ExternSheet","parse_Array","ref","parse_ArrayParsedFormula","parse_BIFF5OT","write_HLink","write_HLinkTooltip","TT","Tooltip","parse_ColInfo","cellStyles","colFirst","colLast","coldx","cchName","parse_Blank","parse_Scl","parse_String","DBF","dbf_codepage_map","dbf_reverse_map","dbf_to_sheet","ft","memo","vfp","l7","nrow","fpos","rlen","current_cp","codepage","fields","field","hend","sheetRows","dbf_to_aoa","_RLEN","to_workbook","to_sheet","from_sheet","aoa","sheet_to_json","headers","hcnt","coltypes","guess","_guess","hf","_f","hb","rout","_s","SYLK","sylk_escapes","AA","BA","CA","DA","HA","JA","AE","BE","CE","HE","AI","BI","CI","HI","AO","BO","CO","DO","HO","AU","BU","CU","HU","Aa","Ba","Ca","Da","Ha","Ja","Ae","Be","Ce","He","Ai","Bi","Ci","Hi","Ao","Bo","Co","Do","Ho","Au","Bu","Cu","Hu","KC","Kc","DN","Dn","Hy","sylk_char_regex","sylk_char_fn","_","decode_sylk_char","newcc","sylk_to_aoa_str","records","rj","formats","next_cell_format","sht","rowinfo","colinfo","cw","Mval","rstr","record","C_seen_K","C_seen_X","C_seen_S","C_seen_E","formula","rc_to_a1","shrbase","shift_formula_str","F_seen","hidden","wch","process_col","hpt","hpx","pt2px","sylk_to_sheet","aoasht","sylk_to_aoa","write_ws_cell_sylk","a1_to_rc","preamble","RS","rec","wpx","width2px","px2char","rows","px2pt","write_ws_rows_sylk","coord","DIF","dif_to_aoa_str","metadata","dif_to_sheet","dif_to_aoa","push_field","push_value","sheet_to_dif","topic","ETH","eth_to_sheet","eth_to_aoa","sep","meta","sheet_to_eth_data","PRN","set_text_arr","guess_seps","guess_sep_weights","guess_sep","instr","dsv_to_sheet_str","FS","sepcc","startcc","_re","finish_cell","Y","datestr","timestr","dateNF_fix","cellText","cellNF","outer","prn_to_sheet","firstbyte","lines","prn_to_aoa_str","prn_to_sheet_str","WK_","lotushopper","Enum","WK1Enum","lotus_to_workbook_buf","next_n","sidx","snames","realnames","refguess","vers","qpro","tmpcell","WK3Enum","osheets","rnames","parse_cell","parse_LABEL","write_LABEL","write_INTEGER","write_NUMBER","wk1_parse_rc","FuncTab","BinOpTab","parse_cell_3","write_LABEL_16","wsidx","parse_NUMBER_17","v1","v2","write_NUMBER_17","log2","parse_NUMBER_27","parse_SHEETNAMECS","write_XFORMAT_SHEETNAME","argc","argL","argR","args","wk1_fmla_to_csf","sheet_to_wk1","cols","write_biff_rec","write_RANGE","max_R","book_to_wk3","wscnt","write_BOF_WK3","parse_rs","tregex","rpregex","parse_r","rpr","font","pass","shadow","outline","strike","uval","family","valign","parse_rpr","rregex","rend","rs","rs_to_html","nlregex","r_to_html","terms","intro","outro","align","parse_rpr2","sitregex","sirregex","sirphregex","parse_si","html","cellHTML","sstr0","sstr1","sstr2","SST","straywsregex","write_sst_xml","sst","bookSST","main","Count","uniqueCount","Unique","sitag","write_BrtSSTItem","write_sst_bin","write_BrtBeginSst","_JS2ANSI","parse_CRYPTOVersion","Major","Minor","parse_DataSpaceMapEntry","comps","parse_EncryptionHeader","Flags","AlgID","valid","AlgIDHash","KeySize","ProviderType","CSPName","parse_EncryptionVerifier","Salt","Verifier","VerifierHash","parse_EncInfoStd","parse_EncInfoExt","parse_EncInfoAgl","KeyData","xml","encryptedHmacKey","encryptedHmacValue","encs","uri","crypto_CreatePasswordVerifier_Method1","Password","PasswordArray","PasswordDecoded","PadArray","InitialCode","XorMatrix","XorRor","crypto_CreateXorArray_Method1","byte1","byte2","Byte","password","Temp","PasswordLastChar","PadIndex","XorKey","CurrentElement","Char","CreateXorKey_Method1","Index","ObfuscationArray","RTF","rtf_to_sheet","rtf_to_sheet_str","rowtf","rtfre","last_index","exec","lastIndex","rgb2Hex","rgb_tint","hsl","G","H6","L2","rgb2HSL","hex2RGB","X","h6","hsl2RGB","MDW","px","char2width","chr","cycle_width","collw","find_mdw_colw","delta","_MDW","coll","customWidth","PPI","pt","numFmtRegex","cellXfRegex","fillsRegex","fontsRegex","bordersRegex","XLMLPatternTypeMap","None","Solid","Gray50","Gray75","Gray25","HorzStripe","VertStripe","ReverseDiagStripe","DiagStripe","DiagCross","ThickDiagCross","ThinHorzStripe","ThinVertStripe","ThinReverseDiagStripe","ThinHorzCross","cellXF_uint","cellXF_bool","parse_sty_xml","themes","NumberFmt","formatCode","parse_numFmts","Fonts","bold","italic","underline","condense","vertAlign","scheme","indexed","icv","themeElements","clrScheme","parse_fonts","Fills","patternType","bgColor","fgColor","parse_fills","Borders","border","diagonalUp","diagonalDown","parse_borders","xf","CellXf","alignment","vertical","horizontal","textRotation","indent","wrapText","parse_cellXfs","STYLES_XML_ROOT","write_sty_xml","NF","write_numFmts","cellXfs","write_cellXfs","write_BrtFmt","STY","rev_XLSBFillPTNames","parse_BrtFill","write_BrtFill","fls","write_BrtXF","write_Blxf","parse_BrtBorder","write_sty_bin","write_FMTS_bin","grbit","write_FontFlags","sss","charset","write_BrtFont","write_FONTS_bin","write_FILLS_bin","write_BrtBorder","write_BORDERS_bin","fontId","fillId","borderId","write_CELLSTYLEXFS_bin","write_CELLXFS_bin","xfId","builtinId","write_BrtStyle","write_STYLES_bin","write_DXFS_bin","write_BrtBeginTableStyles","write_TABLESTYLES_bin","THEME","XLSXThemeClrScheme","parse_clrScheme","lastClr","parse_fontScheme","parse_fmtScheme","clrsregex","fntsregex","fmtsregex","themeltregex","parse_theme_xml","write_theme","parse_themeElements","Themes","themeXLSX","parse_ExtProp","extType","xclrType","nTintShade","xclrValue","parse_IcvXF","parse_ColorTheme","parse_FullColorExt","parse_XFExtGradient","update_xfext","xfext","xfe","IMG","DRAW","_shapeid","write_comments_vml","csize","bbox","joinstyle","gradientshapeok","coordsize","fillopts","color2","angle","fillparm","fillxml","fillcolor","strokecolor","obscured","CMNT","CMNT_XML_ROOT","write_comments_xml","iauthor","parse_BrtCommentAuthor","write_comments_bin","write_BrtCommentAuthor","write_BrtBeginComment","run","write_StrRun","write_BrtCommentText","VBAFMTS","DS","MS","rcregex","rcbase","rcfunc","fstr","crefregex","$0","$4","$5","shift_formula_xlsx","_xlfn","parseread1","parse_ColRelU","parse_RgceArea","parse_RgceArea_BIFF2","parse_RgceLoc","parse_RgceLoc_BIFF2","parse_RgceElfLoc","fQuoted","parse_PtgAttrSpaceType","parse_SerAr","parse_PtgExtraMem","parse_PtgExtraArray","parse_PtgElfLoc","parse_PtgElfNoop","parse_PtgElfCol","parse_PtgElfColS","parse_PtgElfColSV","parse_PtgElfColV","parse_PtgElfLel","parse_PtgElfRadical","parse_PtgElfRadicalLel","parse_PtgElfRadicalS","parse_PtgElfRw","parse_PtgElfRwV","PtgListRT","PtgTypes","iftab","FtabArgc","Ftab","cparams","tab","parsetab","Cetab","nameindex","rl","parse_RgceLocRel_BIFF2","cl","parse_RgceLocRel","area","parse_RgceAreaRel","ixti","parse_PtgNameX_BIFF5","PtgDupes","Ptg18","coltype","rt","Ptg19","bitSemi","bitIf","bitGoto","ptgs","stringify_array","PtgBinOp","PtgAdd","PtgConcat","PtgDiv","PtgEq","PtgGe","PtgGt","PtgLe","PtgLt","PtgMul","PtgNe","PtgPower","PtgSub","quoteCharacters","get_ixti_raw","supbooks","XTI","SID","get_ixti","ixtiraw","sname","formula_quote_sheet_name","stringify_formula","stack","nameidx","last_sp","sp","fflen","lbl","names","XLSXFutureFunctions","externbook","bookidx","ixtidata","lp","rp","sharedf","parsedf","fnd","arrayf","_left","parse_SharedParsedFormula","parse_Formula","parse_FormulaValue","cbf","parse_XLSCellParsedFormula","shared","parse_XLSBParsedFormula","parse_XLSBArrayParsedFormula","parse_XLSBCellParsedFormula","parse_XLSBNameParsedFormula","parse_XLSBSharedParsedFormula","ods_to_csf_formula","csf_to_ods_formula","ods_to_csf_3D","csf_to_ods_3D","_ssfopts","WS","browser_has_Map","Map","get_sst_id","has","revarr","get","col_obj_w","outlineLevel","default_margins","margins","defs","right","bottom","footer","get_cell_style","revssf","ssf","applyNumberFormat","safe_format","fmtid","fillid","raw_rgb","check_ws","mergecregex","sheetdataregex","hlinkregex","dimregex","colregex","afregex","marginregex","sheetprregex","sheetprregex2","svsregex","parse_ws_xml_sheetpr","sheetPr","codeName","CodeName","sheetprot_deffalse","sheetprot_deftrue","sviewregex","write_ws_xml_cell","oldt","oldv","Strings","revStrings","cellregex","rowregex","isregex","refregex","match_v","match_f","parse_ws_xml_data","sdata","sstr","ftag","cells","cref","tagr","tagc","do_format","rowobj","rowrite","marr","marrlen","xlen","rstarti","outa","ht","rslice","cellFormula","xlfn","___f","si","_tag","_r","WS_XML_ROOT","write_ws_xml","rdata","_drawing","needed","vbaraw","cname","Workbook","outlineprops","summaryBelow","summaryRight","above","write_ws_xml_sheetpr","sview","workbookViewId","Views","rightToLeft","RTL","write_ws_xml_sheetviews","sheetFormat","defaultRowHeight","baseColWidth","outlineLevelRow","params","height","_cell","customHeight","write_ws_xml_data","write_ws_xml_protection","Names","Sheet","Ref","write_ws_xml_autofilter","merges","margin","relc","location","tooltip","ignoreEC","numberStoredAsText","sqref","write_row_header","ncolspan","lcs","caddr","first","write_BrtRowHdr","parse_BrtWsDim","write_BrtWsDim","parse_BrtShortReal","parse_BrtMergeCell","write_BrtMergeCell","BrtMarginKeys","write_ws_bin_cell","last_seen","ncell","write_BrtShortIsst","write_BrtCellIsst","write_BrtShortSt","write_BrtCellSt","write_BrtShortRk","write_BrtCellRk","write_BrtShortReal","write_BrtCellReal","write_BrtShortBool","write_BrtCellBool","write_BrtShortError","write_BrtCellError","write_BrtShortBlank","write_BrtCellBlank","write_ws_bin","write_BrtWsProp","write_BrtBeginWsView","write_WSVIEWS2","write_BrtColInfo","write_COLINFOS","cap","write_CELLTABLE","write_BrtSheetProtection","write_SHEETPROTECT","write_AUTOFILTER","write_BrtBeginMergeCells","write_MERGECELLS","locidx","write_BrtHLink","write_HLINKS","write_BrtMargins","write_BrtCellIgnoreEC","write_IGNOREECS","write_LEGACYDRAWING","CHART","CHARTEX","CS","WBPropsDef","WBViewDef","SheetDef","CalcPrDef","push_defaults_array","push_defaults","parse_wb_defaults","WBProps","CalcPr","WBView","badchars","check_ws_name","_good","wbnsregex","WB_XML_ROOT","write_wb_xml","write_names","workbookPr","Hidden","sheetId","Comment","localSheetId","write_BrtBundleSh","iTabID","strRelID","parse_BrtFRTArchID$","ArchID","write_wb_bin","write_BrtFileVersion","filterPrivacy","write_BrtWbProp","vistab","write_BrtBookView","write_BOOKVIEWS","write_BUNDLESHS","parse_ws","ai","af","seencol","R_n","aii","_d","relId","Rel","rfx","tmpref","parse_ws_bin","data1","data2","mtch","parse_ws_xml_sheetpr2","ridx","parse_ws_xml_dim","svs","zoomScale","zoom","parse_ws_xml_sheetviews","columns","coli","colm","colM","parse_ws_xml_cols","afilter","parse_ws_xml_autofilter","_merge","hlink","rng","parse_ws_xml_hlinks","parse_ws_xml_margins","parse_ws_xml","write_wb","write_ws","write_sst","write_cmnt","attregexg2","attregex2","xlml_parsexmltag","words","xlml_parsexmltagobj","xlml_set_custprop","Custprops","oval","process_style_xlml","stag","Interior","I","Pattern","ID","parse_xlml_data","csty","nf","sid","StyleID","interiors","Parent","UTC","safe_format_xlml","Formula","ArrayRange","xlml_clean_comment","xlml_normalize","xlmlregex","parse_xlml_xml","Rn","opening","ishtml","_o","HTML_","tmp","sheetnames","cursheet","sheetname","dtag","didx","fidx","pidx","cstys","wsprops","raw_Rn3","HRef","HRefScreenTip","MergeAcross","MergeDown","cma","cmd","AutoFitHeight","Height","Format","ssfidx","Width","_col","Span","_NamedRange","_DefinedName","RefersTo","AutoFilter","Range","parse_fods","Margin","pagemargins","Top","Left","Right","Bottom","bookSheets","bookProps","parse_xlml","fix_read_opts","write_name_xlml","write_ws_xlml_cell","mi","_v","write_ws_xlml_row","write_ws_xlml","write_ws_xlml_names","write_ws_xlml_table","objects","scenarios","selectLockedCells","selectUnlockedCells","write_ws_xlml_wsopts","write_xlml","General","xlml_write_docprops","BLACKLIST","xlml_write_custprops","write_props_xlml","write_sty_xlml","write_names_xlml","slurp","insitu","XLSRecordEnum","ll","safe_format_xf","make_cell","PSCLSID","parse_xlscfb","CompObj","WorkbookP","AnsiUserType","AnsiClipboardFormat","parse_ClipboardFormatOrAnsiString","Reserved1","UnicodeClipboardFormat","parse_ClipboardFormatOrUnicodeString","Reserved2","parse_compobj","lastcell","cmnt","rngC","rngR","temp_val","country","Directory","last_formula","cur_sheet","Preamble","last_cell","XFs","palette","get_rgb","addcell","line","file_depth","xfd","icvFore","icvBack","process_cell_style","afi","rrtabid","lastuser","winlocked","wtf","last_lbl","last_Rn","BIFF2Fmt","BIFF2FmtTable","FilterDatabases","seen_codepage","RecordType","Date1904","WriteProtect","cpval","CalcRefMode","FullCalc","fDialog","fBelow","fRight","ExternCount","tmpri","biffguess","fakebs8","rknum","rkrec","_fr","_fc","_fe","_arraystart","isst","_j","_ixfe","b4idx","b2idx","cmo","lastobj","TxO","ImData","noteobj","ext","Encryption","Metadata","Country","parse_workbook","bookVBA","newcfb","newpath","make_vba_xls","DSI","DocSummary","SI","Summary","HeadingPairs","TitlesOfParts","parse_xls_props","bookFiles","Ptg","fBold","fItalic","fUnderline","fStrikeout","fOutline","fShadow","fCondense","fExtend","parse_FontFlags","bCharSet","xColorType","bR","bG","bB","parse_BrtColor","ixfeParent","ifmt","defaultThemeVersion","strName","autoCompressPictures","backupFile","checkCompatibility","hidePivotFieldList","promptedSolutions","publishItems","refreshAllConnections","saveExternalLinkValues","showBorderUnselectedTables","showInkAnnotation","showObjects","showPivotChartFilter","updateLinks","fAlwaysCalc","display","idObj","stAuthor","parse_NoteSh","Info","Data","EncryptionVersionInfo","EncryptedVerifier","EncryptedVerifierHash","parse_RC4Header","EncryptionHeader","EncryptionVerifier","parse_RC4CryptoHeader","parse_FilePassHeader","XorArrayIndex","XorArray","verificationBytes","verifier","Value","crypto_DecryptData_Method1","parse_XORObfuscation","dyHeight","fl","Pos","Dim","CurTab","FirstTab","Selected","TabRatio","UserName","fts","parse_BIFF5Obj","parse_FtArray","ccv","rw","rkrecs","lastcol","ixfes","fStyle","alc","fWrap","alcV","fJustLast","trot","cIndent","fShrinkToFit","iReadOrder","fAtrNum","fAtrFnt","fAtrAlc","fAtrBdr","fAtrPat","fAtrProt","dgLeft","dgRight","dgTop","dgBottom","icvLeft","icvRight","grbitDiag","icvTop","icvBottom","icvDiag","dgDiag","fsxButton","parse_CellStyleXF","cmcs","ucnt","extsst","dsst","ctab","virtPath","rgst","texts","accel","parse_ControlInfo","cchText","sVer","displayName","targetFrameName","moniker","oleMoniker","guid","fileTime","Loc","parse_URLMoniker","cAnti","ansiPath","parse_FileMoniker","parse_HyperlinkMoniker","parse_Hyperlink","xnum","cUse","wzTooltip","cxfs","cexts","cchComment","themeXML","parse_frtHeader","def","num","env","lcb","XLSRE","write_BIFF2Cell","write_ws_biff2_cell","write_BIFF2NUM","write_BIFF2BERR","write_BIFF2LABEL","write_ws_biff8_cell","bf","o1","write_FormulaValue","o3","write_Formula","write_Number","write_BoolErr","write_LabelSst","b8","write_Label","write_ws_biff8","_WB","_sheet","MAX_ROWS","guts","write_Guts","write_ColInfo","write_ws_cols_biff8","write_Dimensions","write_Window2","write_MergeCells","HL","write_ws_biff8_hlinks","write_FEAT","write_biff8_global","_sheets","_wb","writezeroes","write_WriteAccess","write_RRTabId","write_Window1","safe1904","write_Font","write_FONTS_biff8","write_FMTS_biff8","write_CELLXFS_biff8","write_Country","write_biff_continue","write_SST","blen","write_biff_buf","fix_write_opts","write_biff8_buf","write_ws_biff2","write_biff2_buf","html_to_sheet","mtch2","re","split_regex","hd","midx","colspan","rowspan","_t","make_html_row","editable","make_html_preamble","_BEGIN","_END","book_new","book_append_sheet","_row","BEGIN","END","_preamble","sheet_add_dom","or_R","or_C","getElementsByTagName","is_dom_element_hidden","elts","hasAttribute","getAttribute","innerHTML","Aelts","Aelti","parse_dom_table","element","get_computed_style","ownerDocument","defaultView","getComputedStyle","get_get_computed_style_function","getPropertyValue","parse_text_p","number_formats","parse_content_xml","fixed","day","month","year","hours","minutes","seconds","era","quarter","sheetag","rowtag","NFtag","ctag","textp","textpidx","textR","row_ol","number_format_map","mrange","rowpeat","colpeat","atag","_Ref","creator","creatoridx","isstub","intable","rptR","rpt","nrange","ptp","parse_ods","FEtag","parse_manifest","write_styles_ods","master_styles","write_content_ods","write_text_p","null_cell_xml","ods","ROWS","_Fref","text_p","_tgt","fods","cidx","colobj","write_automatic_styles_ods","write_ods","manifest","rdf","write_rdf","write_manifest","write_obj_str","write_sheet_index","write_htm_str","write_csv_str","sheet_to_csv","write_slk_str","write_dif_str","write_prn_str","write_rtf_str","write_txt_str","sheet_to_txt","write_dbf_buf","write_eth_str","write_wk1_buf","fix_opts_func","safe_parse_sheet","relsPath","sheetRels","stype","parse_cs_bin","parse_cs_xml","parse_cs","dfile","drelsp","draw","parse_drawing","chartp","crelsp","csheet","nc","parse_Cache","parse_chart","parse_ds","authors","author","parse_comments_bin","commentList","authtag","cmnttag","cm","authorId","textMatch","parse_comments_xml","parse_cmnt","encoded","sheet_insert_comments","strip_front_slash","binname","zipentries","links","coreprops","extprops","custprops","calcchains","vba","drawings","TODO","ctext","PartName","calcchain","parse_ct","parse_sst_bin","parse_sst_xml","parse_sst","parse_theme","parse_sty_bin","parse_sty","link","parse_xlink_bin","parse_xlink","parse_wb_bin","dname","dnstart","parse_wb_xml","parse_wb","propdata","parse_ext_props","toks","warn","parse_cust_props","deps","bookDeps","parse_cc_bin","parse_cc_xml","wbsheets","wbext","wbrelsi","wbrelsfile","wbrels","safe_parse_wbrels","nmode","wsloop","snjseen","snj","Deps","Styles","bin","parse_xlsxcfb","U","W","parse_DataSpaceVersionInfo","dsm","parse_DataSpaceMap","seds","parse_DataSpaceDefinition","parse_TransformInfoHeader","ename","cmode","parse_Primary","einfo","parse_EncryptionInfo","decrypt_agile","decrypt_std76","foo","vbafmt","write_core_props","_sn","_i","write_ext_props","write_vt","write_cust_props","wsrels","need_vml","rId1","write_sty","f1","f2","f3","write_ct","read_plaintext","read_prn","readSync","infile","read_binary","bstrify","ab","vu","read_cfb","OLD_WTF","read_wb_ID","read_zip","read_utf16","read_plaintext_raw","write_cfb_ctr","write_string_type","bom","write_binary_type","writeSync","N","cn","check_wb","write_stxt_type","wbpath","Keys","DSEntries","SEntries","CEntries","CEntries2","write_xls_props","fill_vba_xls","write_xlscfb","write_cfb_type","oopts","encrypt_agile","write_zip_type","resolve_book_type","xls","htm","slk","socialcalc","Sh33tJS","make_json_row","defval","isempty","defineProperty","enumerable","__rowNum__","rawNumbers","outi","counter","CC","blankrows","qreg","make_csv_row","txt","forceQuotes","endregex","skipHidden","strip","sheet_to_formulae","cmds","sheet_add_json","js","skipHeader","JS","sheet_get_cell","split_cell","get_formulae","make_csv","make_json","make_formulae","json_to_sheet","table_to_sheet","table_to_book","sheet_to_html","sheet_to_row_object_array","get_default","ws_get_cell_stub","RC","book_set_sheet_visibility","sh","vis","wb_sheet_idx","cell_set_number_format","cell_set_hyperlink","cell_set_internal_link","cell_add_comment","sheet_set_array_formula","rngstr","strmod","Readable","to_json","objectMode","_read","to_html","to_csv","BOM","readFile","writeFileAsync","_cb","Function","make_xlsx_lib"],"sourceRoot":""} \ No newline at end of file diff --git a/dash/dash_table/async-highlight.js b/dash/dash_table/async-highlight.js index 15afeb2b8a..da2094cc90 100644 --- a/dash/dash_table/async-highlight.js +++ b/dash/dash_table/async-highlight.js @@ -1,2 +1,2 @@ -(self.webpackChunkdash_table=self.webpackChunkdash_table||[]).push([[254],{3948(u,D,e){"use strict";e.d(D,{default:()=>T});var n=e(2006),t=e(5072),a=e.n(t),r=e(7825),i=e.n(r),s=e(7659),o=e.n(s),F=e(5056),l=e.n(F),c=e(540),E=e.n(c),A=e(1113),C=e.n(A),d=e(6991),g={};g.styleTagTransform=C(),g.setAttributes=l(),g.insert=o().bind(null,"head"),g.domAPI=i(),g.insertStyleElement=E(),a()(d.A,g),d.A&&d.A.locals&&d.A.locals;var B=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video","defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],b=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),m=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),h=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),p=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse();function f(u){return new RegExp(u.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}function v(u){return u?"string"==typeof u?u:u.source:null}function y(u){return _("(?=",u,")")}function _(){for(var u=arguments.length,D=new Array(u),e=0;ev(u)).join("")}function x(){for(var u=arguments.length,D=new Array(u),e=0;ev(u)).join("|")+")"}var w="[A-Za-z$_][0-9A-Za-z$_]*",N=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],k=["true","false","null","undefined","NaN","Infinity"],S=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],M=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],O=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],j=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],R=[].concat(O,S,M);n.registerLanguage("bash",function(u){var D=u.regex,e={},n={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[e]}]};Object.assign(e,{className:"variable",variants:[{begin:D.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},n]});var t={className:"subst",begin:/\$\(/,end:/\)/,contains:[u.BACKSLASH_ESCAPE]},a=u.inherit(u.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:"comment"}}),r={begin:/<<-?\s*(?=\w+)/,starts:{contains:[u.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},i={className:"string",begin:/"/,end:/"/,contains:[u.BACKSLASH_ESCAPE,e,t]};t.contains.push(i);var s={begin:/\$?\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},u.NUMBER_MODE,e]},o=u.SHEBANG({binary:"(".concat(["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"].join("|"),")"),relevance:10}),F={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[u.inherit(u.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,keyword:["if","then","else","elif","fi","time","for","while","until","in","do","done","case","esac","coproc","function","select"],literal:["true","false"],built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","sudo","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"]},contains:[o,u.SHEBANG(),F,s,a,r,{match:/(\/[a-z._-]+)+/},i,{match:/\\"/},{className:"string",begin:/'/,end:/'/},{match:/\\'/},e]}}),n.registerLanguage("csharp",function(u){var D={keyword:["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","scoped","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"].concat(["add","alias","and","ascending","args","async","await","by","descending","dynamic","equals","file","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","record","remove","required","scoped","select","set","unmanaged","value|0","var","when","where","with","yield"]),built_in:["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"],literal:["default","false","null","true"]},e=u.inherit(u.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),n={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},t={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},a=u.inherit(t,{illegal:/\n/}),r={className:"subst",begin:/\{/,end:/\}/,keywords:D},i=u.inherit(r,{illegal:/\n/}),s={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/},u.BACKSLASH_ESCAPE,i]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},r]},F=u.inherit(o,{illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},i]});r.contains=[o,s,t,u.APOS_STRING_MODE,u.QUOTE_STRING_MODE,n,u.C_BLOCK_COMMENT_MODE],i.contains=[F,s,a,u.APOS_STRING_MODE,u.QUOTE_STRING_MODE,n,u.inherit(u.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var l={variants:[{className:"string",begin:/"""("*)(?!")(.|\n)*?"""\1/,relevance:1},o,s,t,u.APOS_STRING_MODE,u.QUOTE_STRING_MODE]},c={begin:"<",end:">",contains:[{beginKeywords:"in out"},e]},E=u.IDENT_RE+"(<"+u.IDENT_RE+"(\\s*,\\s*"+u.IDENT_RE+")*>)?(\\[\\])?",A={begin:"@"+u.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:D,illegal:/::/,contains:[u.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:""}]}]}),u.C_LINE_COMMENT_MODE,u.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{keyword:"if else elif endif define undef warning error line region endregion pragma checksum"}},l,n,{beginKeywords:"class interface",relevance:0,end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},e,c,u.C_LINE_COMMENT_MODE,u.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,contains:[e,u.C_LINE_COMMENT_MODE,u.C_BLOCK_COMMENT_MODE]},{beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,contains:[e,c,u.C_LINE_COMMENT_MODE,u.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+E+"\\s+)+"+u.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:D,contains:[{beginKeywords:["public","private","protected","static","internal","protected","abstract","async","extern","override","unsafe","virtual","new","sealed","partial"].join(" "),relevance:0},{begin:u.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,contains:[u.TITLE_MODE,c],relevance:0},{match:/\(\)/},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:D,relevance:0,contains:[l,n,u.C_BLOCK_COMMENT_MODE]},u.C_LINE_COMMENT_MODE,u.C_BLOCK_COMMENT_MODE]},A]}}),n.registerLanguage("css",function(u){var D=u.regex,e=(u=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:u.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[u.APOS_STRING_MODE,u.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:u.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}))(u),n=[u.APOS_STRING_MODE,u.QUOTE_STRING_MODE];return{name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"},contains:[e.BLOCK_COMMENT,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/},e.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},e.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{begin:":("+m.join("|")+")"},{begin:":(:)?("+h.join("|")+")"}]},e.CSS_VARIABLE,{className:"attribute",begin:"\\b("+p.join("|")+")\\b"},{begin:/:/,end:/[;}{]/,contains:[e.BLOCK_COMMENT,e.HEXCOLOR,e.IMPORTANT,e.CSS_NUMBER_MODE,...n,{begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"},contains:[...n,{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}]},e.FUNCTION_DISPATCH]},{begin:D.lookahead(/@/),end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword",begin:/@-?\w[\w]*(-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:"and or not only",attribute:b.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute"},...n,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"\\b("+B.join("|")+")\\b"}]}}),n.registerLanguage("fsharp",function(u){var D={scope:"keyword",match:/\b(yield|return|let|do|match|use)!/},e=["bool","byte","sbyte","int8","int16","int32","uint8","uint16","uint32","int","uint","int64","uint64","nativeint","unativeint","decimal","float","double","float32","single","char","string","unit","bigint","option","voption","list","array","seq","byref","exn","inref","nativeptr","obj","outref","voidptr","Result"],n={keyword:["abstract","and","as","assert","base","begin","class","default","delegate","do","done","downcast","downto","elif","else","end","exception","extern","finally","fixed","for","fun","function","global","if","in","inherit","inline","interface","internal","lazy","let","match","member","module","mutable","namespace","new","of","open","or","override","private","public","rec","return","static","struct","then","to","try","type","upcast","use","val","void","when","while","with","yield"],literal:["true","false","null","Some","None","Ok","Error","infinity","infinityf","nan","nanf"],built_in:["not","ref","raise","reraise","dict","readOnlyDict","set","get","enum","sizeof","typeof","typedefof","nameof","nullArg","invalidArg","invalidOp","id","fst","snd","ignore","lock","using","box","unbox","tryUnbox","printf","printfn","sprintf","eprintf","eprintfn","fprintf","fprintfn","failwith","failwithf"],"variable.constant":["__LINE__","__SOURCE_DIRECTORY__","__SOURCE_FILE__"]},t={variants:[u.COMMENT(/\(\*(?!\))/,/\*\)/,{contains:["self"]}),u.C_LINE_COMMENT_MODE]},a={scope:"variable",begin:/``/,end:/``/},r=/\B('|\^)/,i={scope:"symbol",variants:[{match:_(r,/``.*?``/)},{match:_(r,u.UNDERSCORE_IDENT_RE)}],relevance:0},s=function(u){var D;D=u.includeEqual?"!%&*+-/<=>@^|~?":"!%&*+-/<>@^|~?";var e=_("[",...Array.from(D).map(f),"]"),n=x(e,/\./),t=_(n,y(n)),a=x(_(t,n,"*"),_(e,"+"));return{scope:"operator",match:x(a,/:\?>/,/:\?/,/:>/,/:=/,/::?/,/\$/),relevance:0}},o=s({includeEqual:!0}),F=s({includeEqual:!1}),l=function(D,r){return{begin:_(D,y(_(/\s*/,x(/\w/,/'/,/\^/,/#/,/``/,/\(/,/{\|/)))),beginScope:r,end:y(x(/\n/,/=/)),relevance:0,keywords:u.inherit(n,{type:e}),contains:[t,i,u.inherit(a,{scope:null}),F]}},c=l(/:/,"operator"),E=l(/\bof\b/,"keyword"),A={begin:[/(^|\s+)/,/type/,/\s+/,/[a-zA-Z_](\w|')*/],beginScope:{2:"keyword",4:"title.class"},end:y(/\(|=|$/),keywords:n,contains:[t,u.inherit(a,{scope:null}),i,{scope:"operator",match:/<|>/},c]},C={scope:"computation-expression",match:/\b[_a-z]\w*(?=\s*\{)/},d={begin:[/^\s*/,_(/#/,x("if","else","endif","line","nowarn","light","r","i","I","load","time","help","quit")),/\b/],beginScope:{2:"meta"},end:y(/\s|$/)},g={variants:[u.BINARY_NUMBER_MODE,u.C_NUMBER_MODE]},B={scope:"string",begin:/"/,end:/"/,contains:[u.BACKSLASH_ESCAPE]},b={scope:"string",begin:/@"/,end:/"/,contains:[{match:/""/},u.BACKSLASH_ESCAPE]},m={scope:"string",begin:/"""/,end:/"""/,relevance:2},h={scope:"subst",begin:/\{/,end:/\}/,keywords:n},p={scope:"string",begin:/\$"/,end:/"/,contains:[{match:/\{\{/},{match:/\}\}/},u.BACKSLASH_ESCAPE,h]},v={scope:"string",begin:/(\$@|@\$)"/,end:/"/,contains:[{match:/\{\{/},{match:/\}\}/},{match:/""/},u.BACKSLASH_ESCAPE,h]},w={scope:"string",begin:/\$"""/,end:/"""/,contains:[{match:/\{\{/},{match:/\}\}/},h],relevance:2},N={scope:"string",match:_(/'/,x(/[^\\']/,/\\(?:.|\d{3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}|U[a-fA-F\d]{8})/),/'/)};return h.contains=[v,p,b,B,N,D,t,a,c,C,d,g,i,o],{name:"F#",aliases:["fs","f#"],keywords:n,illegal:/\/\*/,classNameAliases:{"computation-expression":"keyword"},contains:[D,{variants:[w,v,p,m,b,B,N]},t,a,A,{scope:"meta",begin:/\[\]/,relevance:2,contains:[a,m,b,B,N,g]},E,c,C,d,g,i,o]}}),n.registerLanguage("http",function(u){var D="HTTP/([32]|1\\.[01])",e={className:"attribute",begin:u.regex.concat("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]}},n=[e,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+D+" \\d{3})",end:/$/,contains:[{className:"meta",begin:D},{className:"number",begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:n}},{begin:"(?=^[A-Z]+ (.*?) "+D+"$)",end:/$/,contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:D},{className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:n}},u.inherit(e,{relevance:0})]}}),n.registerLanguage("javascript",function(u){var D=u.regex,e=w,n={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(u,D)=>{var e=u[0].length+u.index,n=u.input[e];if("<"!==n&&","!==n){var t;">"===n&&(((u,D)=>{var e=D.after,n=""".concat(u,"\\s*\\(")),D.concat("(?!",d.join("|"),")")),e,D.lookahead(/\s*\(/)),className:"title.function",relevance:0},v={begin:D.concat(/\./,D.lookahead(D.concat(e,/(?![0-9A-Za-z$_(])/))),end:e,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},y={match:[/get|set/,/\s+/,e,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},b]},_="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+u.UNDERSCORE_IDENT_RE+")\\s*=>",x={match:[/const|var|let/,/\s+/,e,/\s*/,/=\s*/,/(async\s*)?/,D.lookahead(_)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[b]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:t,exports:{PARAMS_CONTAINS:B,CLASS_REFERENCE:h},illegal:/#(?![$_A-z])/,contains:[u.SHEBANG({label:"shebang",binary:"node",relevance:5}),{label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},u.APOS_STRING_MODE,u.QUOTE_STRING_MODE,F,l,c,E,A,{match:/\$\d+/},s,h,{scope:"attr",match:e+D.lookahead(":"),relevance:0},x,{begin:"("+u.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[A,u.REGEXP_MODE,{className:"function",begin:_,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:u.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:B}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:"<>",end:""},{match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:n.begin,"on:begin":n.isTrulyOpeningTag,end:n.end}],subLanguage:"xml",contains:[{begin:n.begin,end:n.end,skip:!0,contains:["self"]}]}]},p,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+u.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[b,u.inherit(u.TITLE_MODE,{begin:e,className:"title.function"})]},{match:/\.\.\./,relevance:0},v,{match:"\\$"+e,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[b]},f,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"},m,y,{match:/\$[(.]/}]}}),n.registerLanguage("json",function(u){var D=["true","false","null"],e={scope:"literal",beginKeywords:D.join(" ")};return{name:"JSON",aliases:["jsonc"],keywords:{literal:D},contains:[{className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},{match:/[{}[\],:]/,className:"punctuation",relevance:0},u.QUOTE_STRING_MODE,e,u.C_NUMBER_MODE,u.C_LINE_COMMENT_MODE,u.C_BLOCK_COMMENT_MODE],illegal:"\\S"}}),n.registerLanguage("julia",function(u){var D="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",e={$pattern:D,keyword:["baremodule","begin","break","catch","ccall","const","continue","do","else","elseif","end","export","false","finally","for","function","global","if","import","in","isa","let","local","macro","module","quote","return","true","try","using","where","while"],literal:["ARGS","C_NULL","DEPOT_PATH","ENDIAN_BOM","ENV","Inf","Inf16","Inf32","Inf64","InsertionSort","LOAD_PATH","MergeSort","NaN","NaN16","NaN32","NaN64","PROGRAM_FILE","QuickSort","RoundDown","RoundFromZero","RoundNearest","RoundNearestTiesAway","RoundNearestTiesUp","RoundToZero","RoundUp","VERSION|0","devnull","false","im","missing","nothing","pi","stderr","stdin","stdout","true","undef","π","ℯ"],built_in:["AbstractArray","AbstractChannel","AbstractChar","AbstractDict","AbstractDisplay","AbstractFloat","AbstractIrrational","AbstractMatrix","AbstractRange","AbstractSet","AbstractString","AbstractUnitRange","AbstractVecOrMat","AbstractVector","Any","ArgumentError","Array","AssertionError","BigFloat","BigInt","BitArray","BitMatrix","BitSet","BitVector","Bool","BoundsError","CapturedException","CartesianIndex","CartesianIndices","Cchar","Cdouble","Cfloat","Channel","Char","Cint","Cintmax_t","Clong","Clonglong","Cmd","Colon","Complex","ComplexF16","ComplexF32","ComplexF64","CompositeException","Condition","Cptrdiff_t","Cshort","Csize_t","Cssize_t","Cstring","Cuchar","Cuint","Cuintmax_t","Culong","Culonglong","Cushort","Cvoid","Cwchar_t","Cwstring","DataType","DenseArray","DenseMatrix","DenseVecOrMat","DenseVector","Dict","DimensionMismatch","Dims","DivideError","DomainError","EOFError","Enum","ErrorException","Exception","ExponentialBackOff","Expr","Float16","Float32","Float64","Function","GlobalRef","HTML","IO","IOBuffer","IOContext","IOStream","IdDict","IndexCartesian","IndexLinear","IndexStyle","InexactError","InitError","Int","Int128","Int16","Int32","Int64","Int8","Integer","InterruptException","InvalidStateException","Irrational","KeyError","LinRange","LineNumberNode","LinearIndices","LoadError","MIME","Matrix","Method","MethodError","Missing","MissingException","Module","NTuple","NamedTuple","Nothing","Number","OrdinalRange","OutOfMemoryError","OverflowError","Pair","PartialQuickSort","PermutedDimsArray","Pipe","ProcessFailedException","Ptr","QuoteNode","Rational","RawFD","ReadOnlyMemoryError","Real","ReentrantLock","Ref","Regex","RegexMatch","RoundingMode","SegmentationFault","Set","Signed","Some","StackOverflowError","StepRange","StepRangeLen","StridedArray","StridedMatrix","StridedVecOrMat","StridedVector","String","StringIndexError","SubArray","SubString","SubstitutionString","Symbol","SystemError","Task","TaskFailedException","Text","TextDisplay","Timer","Tuple","Type","TypeError","TypeVar","UInt","UInt128","UInt16","UInt32","UInt64","UInt8","UndefInitializer","UndefKeywordError","UndefRefError","UndefVarError","Union","UnionAll","UnitRange","Unsigned","Val","Vararg","VecElement","VecOrMat","Vector","VersionNumber","WeakKeyDict","WeakRef"]},n={keywords:e,illegal:/<\//},t={className:"subst",begin:/\$\(/,end:/\)/,keywords:e},a={className:"variable",begin:"\\$"+D},r={className:"string",contains:[u.BACKSLASH_ESCAPE,t,a],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},i={className:"string",contains:[u.BACKSLASH_ESCAPE,t,a],begin:"`",end:"`"},s={className:"meta",begin:"@"+D};return n.name="Julia",n.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},r,i,s,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},u.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],t.contains=n.contains,n}),n.registerLanguage("markdown",function(u){var D={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},e={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:u.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]},n={className:"strong",contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]},t={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0}]},a=u.inherit(n,{contains:[]}),r=u.inherit(t,{contains:[]});n.contains.push(r),t.contains.push(a);var i=[D,e];return[n,t,a,r].forEach(u=>{u.contains=u.contains.concat(i)}),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:i=i.concat(n,t)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:i}]}]},D,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},n,t,{className:"quote",begin:"^>\\s+",contains:i,end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},e,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},{scope:"literal",match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}),n.registerLanguage("matlab",function(u){var D="('|\\.')+",e={relevance:0,contains:[{begin:D}]};return{name:"Matlab",keywords:{keyword:"arguments break case catch classdef continue else elseif end enumeration events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i|0 inf nan isnan isinf isfinite j|0 why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson max min nanmax nanmin mean nanmean type table readtable writetable sortrows sort figure plot plot3 scatter scatter3 cellfun legend intersect ismember procrustes hold num2cell "},illegal:'(//|"|#|/\\*|\\s+/\\w+)',contains:[{className:"function",beginKeywords:"function",end:"$",contains:[u.UNDERSCORE_TITLE_MODE,{className:"params",variants:[{begin:"\\(",end:"\\)"},{begin:"\\[",end:"\\]"}]}]},{className:"built_in",begin:/true|false/,relevance:0,starts:e},{begin:"[a-zA-Z][a-zA-Z_0-9]*"+D,relevance:0},{className:"number",begin:u.C_NUMBER_RE,relevance:0,starts:e},{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{begin:/\]|\}|\)/,relevance:0,starts:e},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}],starts:e},u.COMMENT("^\\s*%\\{\\s*$","^\\s*%\\}\\s*$"),u.COMMENT("%","$")]}}),n.registerLanguage("plaintext",function(u){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}),n.registerLanguage("python",function(u){var D=u.regex,e=/(?:[A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037B-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088F\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5C\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDC-\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C8A\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7DC\uA7F1-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFC5D\uFC64-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDF9\uFE71\uFE73\uFE77\uFE79\uFE7B\uFE7D\uFE7F-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDDC0-\uDDF3\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD40-\uDD59\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDD4A-\uDD65\uDD6F-\uDD85\uDE80-\uDEA9\uDEB0\uDEB1\uDEC2-\uDEC7\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61\uDF80-\uDF89\uDF8B\uDF8E\uDF90-\uDFB5\uDFB7\uDFD1\uDFD3]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8\uDFC0-\uDFE0]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDB0-\uDDDB\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD80E\uD80F\uD81C-\uD822\uD840-\uD868\uD86A-\uD86D\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD88C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46\uDC60-\uDFFF]|\uD810[\uDC00-\uDFFA]|\uD811[\uDC00-\uDE46]|\uD818[\uDD00-\uDD1D]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDD40-\uDD6C\uDE40-\uDE7F\uDEA0-\uDEB8\uDEBB-\uDED3\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3\uDFF2-\uDFF6]|\uD823[\uDC00-\uDCD5\uDCFF-\uDD1E\uDD80-\uDDF2]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDCD0-\uDCEB\uDDD0-\uDDED\uDDF0\uDEC0-\uDEDE\uDEE0-\uDEE2\uDEE4\uDEE5\uDEE7-\uDEED\uDEF0-\uDEF4\uDEFE\uDEFF\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEAD\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0\uDFF0-\uDFFF]|\uD87B[\uDC00-\uDE5D]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD88D[\uDC00-\uDC79])(?:[0-9A-Z_a-z\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037B-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05EF-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u07FD\u0800-\u082D\u0840-\u085B\u0860-\u086A\u0870-\u0887\u0889-\u088F\u0897-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u09FE\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3C-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C5C\u0C5D\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDC-\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1-\u0CF3\u0D00-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D81-\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECE\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1715\u171F-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u180F-\u1819\u1820-\u1878\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1ABF-\u1ADD\u1AE0-\u1AEB\u1B00-\u1B4C\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C8A\u1C90-\u1CBA\u1CBD-\u1CBF\u1CD0-\u1CD2\u1CD4-\u1CFA\u1D00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7DC\uA7F1-\uA827\uA82C\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFC5D\uFC64-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDF9\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE71\uFE73\uFE77\uFE79\uFE7B\uFE7D\uFE7F-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF65-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDDC0-\uDDF3\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD40-\uDD59\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD27\uDD30-\uDD39\uDD40-\uDD65\uDD69-\uDD6D\uDD6F-\uDD85\uDE80-\uDEA9\uDEAB\uDEAC\uDEB0\uDEB1\uDEC2-\uDEC7\uDEFA-\uDF1C\uDF27\uDF30-\uDF50\uDF70-\uDF85\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC00-\uDC46\uDC66-\uDC75\uDC7F-\uDCBA\uDCC2\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD44-\uDD47\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDC9-\uDDCC\uDDCE-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E-\uDE41\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3B-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74\uDF80-\uDF89\uDF8B\uDF8E\uDF90-\uDFB5\uDFB7-\uDFC0\uDFC2\uDFC5\uDFC7-\uDFCA\uDFCC-\uDFD3\uDFE1\uDFE2]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC5E-\uDC61\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB8\uDEC0-\uDEC9\uDED0-\uDEE3\uDF00-\uDF1A\uDF1D-\uDF2B\uDF30-\uDF39\uDF40-\uDF46]|\uD806[\uDC00-\uDC3A\uDCA0-\uDCE9\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD35\uDD37\uDD38\uDD3B-\uDD43\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD7\uDDDA-\uDDE1\uDDE3\uDDE4\uDE00-\uDE3E\uDE47\uDE50-\uDE99\uDE9D\uDEB0-\uDEF8\uDF60-\uDF67\uDFC0-\uDFE0\uDFF0-\uDFF9]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD8E\uDD90\uDD91\uDD93-\uDD98\uDDA0-\uDDA9\uDDB0-\uDDDB\uDDE0-\uDDE9\uDEE0-\uDEF6\uDF00-\uDF10\uDF12-\uDF3A\uDF3E-\uDF42\uDF50-\uDF5A\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD80E\uD80F\uD81C-\uD822\uD840-\uD868\uD86A-\uD86D\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD88C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC40-\uDC55\uDC60-\uDFFF]|\uD810[\uDC00-\uDFFA]|\uD811[\uDC00-\uDE46]|\uD818[\uDD00-\uDD39]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDD40-\uDD6C\uDD70-\uDD79\uDE40-\uDE7F\uDEA0-\uDEB8\uDEBB-\uDED3\uDF00-\uDF4A\uDF4F-\uDF87\uDF8F-\uDF9F\uDFE0\uDFE1\uDFE3\uDFE4\uDFF0-\uDFF6]|\uD823[\uDC00-\uDCD5\uDCFF-\uDD1E\uDD80-\uDDF2]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD833[\uDCF0-\uDCF9\uDF00-\uDF2D\uDF30-\uDF46]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDC30-\uDC6D\uDC8F\uDD00-\uDD2C\uDD30-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAE\uDEC0-\uDEF9]|\uD839[\uDCD0-\uDCF9\uDDD0-\uDDFA\uDEC0-\uDEDE\uDEE0-\uDEF5\uDEFE\uDEFF\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4B\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEAD\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0\uDFF0-\uDFFF]|\uD87B[\uDC00-\uDE5D]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD88D[\uDC00-\uDC79]|\uDB40[\uDD00-\uDDEF])*/,n=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],t={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:n,built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]},a={className:"meta",begin:/^(>>>|\.\.\.) /},r={className:"subst",begin:/\{/,end:/\}/,keywords:t,illegal:/#/},i={begin:/\{\{/,relevance:0},s={className:"string",contains:[u.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[u.BACKSLASH_ESCAPE,a],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[u.BACKSLASH_ESCAPE,a],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[u.BACKSLASH_ESCAPE,a,i,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,end:/"""/,contains:[u.BACKSLASH_ESCAPE,a,i,r]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[u.BACKSLASH_ESCAPE,i,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,contains:[u.BACKSLASH_ESCAPE,i,r]},u.APOS_STRING_MODE,u.QUOTE_STRING_MODE]},o="[0-9](_?[0-9])*",F="(\\b(".concat(o,"))?\\.(").concat(o,")|\\b(").concat(o,")\\."),l="\\b|".concat(n.join("|")),c={className:"number",relevance:0,variants:[{begin:"(\\b(".concat(o,")|(").concat(F,"))[eE][+-]?(").concat(o,")[jJ]?(?=").concat(l,")")},{begin:"(".concat(F,")[jJ]?")},{begin:"\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=".concat(l,")")},{begin:"\\b0[bB](_?[01])+[lL]?(?=".concat(l,")")},{begin:"\\b0[oO](_?[0-7])+[lL]?(?=".concat(l,")")},{begin:"\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=".concat(l,")")},{begin:"\\b(".concat(o,")[jJ](?=").concat(l,")")}]},E={className:"comment",begin:D.lookahead(/# type:/),end:/$/,keywords:t,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},A={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:["self",a,c,s,u.HASH_COMMENT_MODE]}]};return r.contains=[s,c,a],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:t,illegal:/(<\/|\?)|=>/,contains:[a,c,{scope:"variable.language",match:/\bself\b/},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword"},s,E,u.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,e],scope:{1:"keyword",3:"title.function"},contains:[A]},{variants:[{match:[/\bclass/,/\s+/,e,/\s*/,/\(\s*/,e,/\s*\)/]},{match:[/\bclass/,/\s+/,e]}],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[c,A,s]}]}}),n.registerLanguage("r",function(u){var D=u.regex,e=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,n=D.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),t=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,a=D.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/);return{name:"R",keywords:{$pattern:e,keyword:"function if in break next repeat else for while",literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10",built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm"},contains:[u.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/,starts:{end:D.lookahead(D.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)),endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{scope:"variable",variants:[{match:e},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0}]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/}]}),u.HASH_COMMENT_MODE,{scope:"string",contains:[u.BACKSLASH_ESCAPE],variants:[u.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/}),u.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/}),u.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/}),u.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/}),u.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/}),u.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"',relevance:0},{begin:"'",end:"'",relevance:0}]},{relevance:0,variants:[{scope:{1:"operator",2:"number"},match:[t,n]},{scope:{1:"operator",2:"number"},match:[/%[^%]*%/,n]},{scope:{1:"punctuation",2:"number"},match:[a,n]},{scope:{2:"number"},match:[/[^a-zA-Z0-9._]|^/,n]}]},{scope:{3:"operator"},match:[e,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:t},{match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:a},{begin:"`",end:"`",contains:[{begin:/\\./}]}]}}),n.registerLanguage("ruby",function(u){var D=u.regex,e="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",n=D.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),t=D.concat(n,/(::\w+)*/),a={"variable.constant":["__FILE__","__LINE__","__ENCODING__"],"variable.language":["self","super"],keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield","include","extend","prepend","public","private","protected","raise","throw"],built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"],literal:["true","false","nil"]},r={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},s=[u.COMMENT("#","$",{contains:[r]}),u.COMMENT("^=begin","^=end",{contains:[r],relevance:10}),u.COMMENT("^__END__",u.MATCH_NOTHING_RE)],o={className:"subst",begin:/#\{/,end:/\}/,keywords:a},F={className:"string",contains:[u.BACKSLASH_ESCAPE,o],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{begin:D.concat(/<<[-~]?'?/,D.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)),contains:[u.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[u.BACKSLASH_ESCAPE,o]})]}]},l="[0-9](_?[0-9])*",c={className:"number",relevance:0,variants:[{begin:"\\b(".concat("[1-9](_?[0-9])*|0",")(\\.(").concat(l,"))?([eE][+-]?(").concat(l,")|r)?i?\\b")},{begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{begin:"\\b0(_?[0-7])+r?i?\\b"}]},E={variants:[{match:/\(\)/},{className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0,keywords:a}]},A=[F,{variants:[{match:[/class\s+/,t,/\s+<\s+/,t]},{match:[/\b(class|module)\s+/,t]}],scope:{2:"title.class",4:"title.class.inherited"},keywords:a},{match:[/(include|extend)\s+/,t],scope:{2:"title.class"},keywords:a},{relevance:0,match:[t,/\.new[. (]/],scope:{1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"},{relevance:0,match:n,scope:"title.class"},{match:[/def/,/\s+/,e],scope:{1:"keyword",3:"title.function"},contains:[E]},{begin:u.IDENT_RE+"::"},{className:"symbol",begin:u.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[F,{begin:e}],relevance:0},c,{className:"variable",begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{className:"params",begin:/\|(?!=)/,end:/\|/,excludeBegin:!0,excludeEnd:!0,relevance:0,keywords:a},{begin:"("+u.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{className:"regexp",contains:[u.BACKSLASH_ESCAPE,o],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(i,s),relevance:0}].concat(i,s);o.contains=A,E.contains=A;var C=[{begin:/^\s*=>/,starts:{end:"$",contains:A}},{className:"meta.prompt",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])",starts:{end:"$",keywords:a,contains:A}}];return s.unshift(i),{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:[u.SHEBANG({binary:"ruby"})].concat(C).concat(s).concat(A)}}),n.registerLanguage("shell",function(u){return{name:"Shell Session",aliases:["console","shellsession"],contains:[{className:"meta.prompt",begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,subLanguage:"bash"}}]}}),n.registerLanguage("sql",function(u){var D=u.regex,e=u.COMMENT("--","$"),n=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],t=n,a=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter(u=>!n.includes(u)),r={match:D.concat(/\b/,D.either(...t),/\s*\(/),relevance:0,keywords:{built_in:t}};function i(u){return D.concat(/\b/,D.either(...u.map(u=>u.replace(/\s+/,"\\s+"))),/\b/)}var s={scope:"keyword",match:i(["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"]),relevance:0};return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:function(u){var D=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=D.exceptions,n=D.when;return e=e||[],u.map(u=>u.match(/\|\d+$/)||e.includes(u)?u:n(u)?"".concat(u,"|0"):u)}(a,{when:u=>u.length<3}),literal:["true","false","unknown"],type:["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"]},contains:[{scope:"type",match:i(["double precision","large object","with timezone","without timezone"])},s,r,{scope:"variable",match:/@[a-z0-9][a-z0-9_]*/},{scope:"string",variants:[{begin:/'/,end:/'/,contains:[{match:/''/}]}]},{begin:/"/,end:/"/,contains:[{match:/""/}]},u.C_NUMBER_MODE,u.C_BLOCK_COMMENT_MODE,e,{scope:"operator",match:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0}]}}),n.registerLanguage("xml",function(u){var D=u.regex,e=D.concat(/(?:[A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088F\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5C\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDC-\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C8A\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7DC\uA7F1-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDDC0-\uDDF3\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD40-\uDD59\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDD4A-\uDD65\uDD6F-\uDD85\uDE80-\uDEA9\uDEB0\uDEB1\uDEC2-\uDEC7\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61\uDF80-\uDF89\uDF8B\uDF8E\uDF90-\uDFB5\uDFB7\uDFD1\uDFD3]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8\uDFC0-\uDFE0]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDB0-\uDDDB\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD80E\uD80F\uD81C-\uD822\uD840-\uD868\uD86A-\uD86D\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD88C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46\uDC60-\uDFFF]|\uD810[\uDC00-\uDFFA]|\uD811[\uDC00-\uDE46]|\uD818[\uDD00-\uDD1D]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDD40-\uDD6C\uDE40-\uDE7F\uDEA0-\uDEB8\uDEBB-\uDED3\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3\uDFF2\uDFF3]|\uD823[\uDC00-\uDCD5\uDCFF-\uDD1E\uDD80-\uDDF2]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDCD0-\uDCEB\uDDD0-\uDDED\uDDF0\uDEC0-\uDEDE\uDEE0-\uDEE2\uDEE4\uDEE5\uDEE7-\uDEED\uDEF0-\uDEF4\uDEFE\uDEFF\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEAD\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0\uDFF0-\uDFFF]|\uD87B[\uDC00-\uDE5D]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD88D[\uDC00-\uDC79])/,D.optional(/(?:[\x2D\.0-9A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088F\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5C\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDC-\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C8A\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7DC\uA7F1-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDDC0-\uDDF3\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD40-\uDD59\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDD4A-\uDD65\uDD6F-\uDD85\uDE80-\uDEA9\uDEB0\uDEB1\uDEC2-\uDEC7\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61\uDF80-\uDF89\uDF8B\uDF8E\uDF90-\uDFB5\uDFB7\uDFD1\uDFD3]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8\uDFC0-\uDFE0]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDB0-\uDDDB\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD80E\uD80F\uD81C-\uD822\uD840-\uD868\uD86A-\uD86D\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD88C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46\uDC60-\uDFFF]|\uD810[\uDC00-\uDFFA]|\uD811[\uDC00-\uDE46]|\uD818[\uDD00-\uDD1D]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDD40-\uDD6C\uDE40-\uDE7F\uDEA0-\uDEB8\uDEBB-\uDED3\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3\uDFF2\uDFF3]|\uD823[\uDC00-\uDCD5\uDCFF-\uDD1E\uDD80-\uDDF2]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDCD0-\uDCEB\uDDD0-\uDDED\uDDF0\uDEC0-\uDEDE\uDEE0-\uDEE2\uDEE4\uDEE5\uDEE7-\uDEED\uDEF0-\uDEF4\uDEFE\uDEFF\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEAD\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0\uDFF0-\uDFFF]|\uD87B[\uDC00-\uDE5D]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD88D[\uDC00-\uDC79])*:/),/(?:[\x2D\.0-9A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088F\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5C\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDC-\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C8A\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7DC\uA7F1-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDDC0-\uDDF3\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD40-\uDD59\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDD4A-\uDD65\uDD6F-\uDD85\uDE80-\uDEA9\uDEB0\uDEB1\uDEC2-\uDEC7\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61\uDF80-\uDF89\uDF8B\uDF8E\uDF90-\uDFB5\uDFB7\uDFD1\uDFD3]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8\uDFC0-\uDFE0]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDB0-\uDDDB\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD80E\uD80F\uD81C-\uD822\uD840-\uD868\uD86A-\uD86D\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD88C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46\uDC60-\uDFFF]|\uD810[\uDC00-\uDFFA]|\uD811[\uDC00-\uDE46]|\uD818[\uDD00-\uDD1D]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDD40-\uDD6C\uDE40-\uDE7F\uDEA0-\uDEB8\uDEBB-\uDED3\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3\uDFF2\uDFF3]|\uD823[\uDC00-\uDCD5\uDCFF-\uDD1E\uDD80-\uDDF2]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDCD0-\uDCEB\uDDD0-\uDDED\uDDF0\uDEC0-\uDEDE\uDEE0-\uDEE2\uDEE4\uDEE5\uDEE7-\uDEED\uDEF0-\uDEF4\uDEFE\uDEFF\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEAD\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0\uDFF0-\uDFFF]|\uD87B[\uDC00-\uDE5D]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD88D[\uDC00-\uDC79])*/),n={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},t={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},a=u.inherit(t,{begin:/\(/,end:/\)/}),r=u.inherit(u.APOS_STRING_MODE,{className:"string"}),i=u.inherit(u.QUOTE_STRING_MODE,{className:"string"}),s={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[t,i,r,a,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[t,a,i,r]}]}]},u.COMMENT(//,{relevance:10}),{begin://,relevance:10},n,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[i]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[s],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[s],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:D.concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:e,relevance:0,starts:s}]},{className:"tag",begin:D.concat(/<\//,D.lookahead(D.concat(e,/>/))),contains:[{className:"name",begin:e,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}),n.registerLanguage("yaml",function(u){var D="true false yes no null",e="[\\w#;/?:@&=+$,.~*'()[\\]]+",n={className:"string",relevance:0,variants:[{begin:/"/,end:/"/},{begin:/\S+/}],contains:[u.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},t=u.inherit(n,{variants:[{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),a={end:",",endsWithParent:!0,excludeEnd:!0,keywords:D,relevance:0},r={begin:/\{/,end:/\}/,contains:[a],illegal:"\\n",relevance:0},i={begin:"\\[",end:"\\]",contains:[a],illegal:"\\n",relevance:0},s=[{className:"attr",variants:[{begin:/[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/},{begin:/"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/},{begin:/'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+e},{className:"type",begin:"!<"+e+">"},{className:"type",begin:"!"+e},{className:"type",begin:"!!"+e},{className:"meta",begin:"&"+u.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+u.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},u.HASH_COMMENT_MODE,{beginKeywords:D,keywords:{literal:D}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:u.C_NUMBER_RE+"\\b",relevance:0},r,i,{className:"string",relevance:0,begin:/'/,end:/'/,contains:[{match:/''/,scope:"char.escape",relevance:0}]},n],o=[...s];return o.pop(),o.push(t),a.contains=o,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:s}});var T=n},6991(u,D,e){"use strict";var n=e(1354),t=e.n(n),a=e(6314),r=e.n(a)()(t());r.push([u.id,"pre code.hljs {\n display: block;\n overflow-x: auto;\n padding: 1em\n}\ncode.hljs {\n padding: 3px 5px\n}\n/*!\n Theme: GitHub\n Description: Light theme as seen on github.com\n Author: github.com\n Maintainer: @Hirse\n Updated: 2021-05-15\n\n Outdated base version: https://github.com/primer/github-syntax-light\n Current colors taken from GitHub's CSS\n*/\n.hljs {\n color: #24292e;\n background: #ffffff\n}\n.hljs-doctag,\n.hljs-keyword,\n.hljs-meta .hljs-keyword,\n.hljs-template-tag,\n.hljs-template-variable,\n.hljs-type,\n.hljs-variable.language_ {\n /* prettylights-syntax-keyword */\n color: #d73a49\n}\n.hljs-title,\n.hljs-title.class_,\n.hljs-title.class_.inherited__,\n.hljs-title.function_ {\n /* prettylights-syntax-entity */\n color: #6f42c1\n}\n.hljs-attr,\n.hljs-attribute,\n.hljs-literal,\n.hljs-meta,\n.hljs-number,\n.hljs-operator,\n.hljs-variable,\n.hljs-selector-attr,\n.hljs-selector-class,\n.hljs-selector-id {\n /* prettylights-syntax-constant */\n color: #005cc5\n}\n.hljs-regexp,\n.hljs-string,\n.hljs-meta .hljs-string {\n /* prettylights-syntax-string */\n color: #032f62\n}\n.hljs-built_in,\n.hljs-symbol {\n /* prettylights-syntax-variable */\n color: #e36209\n}\n.hljs-comment,\n.hljs-code,\n.hljs-formula {\n /* prettylights-syntax-comment */\n color: #6a737d\n}\n.hljs-name,\n.hljs-quote,\n.hljs-selector-tag,\n.hljs-selector-pseudo {\n /* prettylights-syntax-entity-tag */\n color: #22863a\n}\n.hljs-subst {\n /* prettylights-syntax-storage-modifier-import */\n color: #24292e\n}\n.hljs-section {\n /* prettylights-syntax-markup-heading */\n color: #005cc5;\n font-weight: bold\n}\n.hljs-bullet {\n /* prettylights-syntax-markup-list */\n color: #735c0f\n}\n.hljs-emphasis {\n /* prettylights-syntax-markup-italic */\n color: #24292e;\n font-style: italic\n}\n.hljs-strong {\n /* prettylights-syntax-markup-bold */\n color: #24292e;\n font-weight: bold\n}\n.hljs-addition {\n /* prettylights-syntax-markup-inserted */\n color: #22863a;\n background-color: #f0fff4\n}\n.hljs-deletion {\n /* prettylights-syntax-markup-deleted */\n color: #b31d28;\n background-color: #ffeef0\n}\n.hljs-char.escape_,\n.hljs-link,\n.hljs-params,\n.hljs-property,\n.hljs-punctuation,\n.hljs-tag {\n /* purposely ignored */\n \n}","",{version:3,sources:["webpack://./node_modules/highlight.js/styles/github.css"],names:[],mappings:"AAAA;EACE,cAAc;EACd,gBAAgB;EAChB;AACF;AACA;EACE;AACF;AACA;;;;;;;;;CASC;AACD;EACE,cAAc;EACd;AACF;AACA;;;;;;;EAOE,gCAAgC;EAChC;AACF;AACA;;;;EAIE,+BAA+B;EAC/B;AACF;AACA;;;;;;;;;;EAUE,iCAAiC;EACjC;AACF;AACA;;;EAGE,+BAA+B;EAC/B;AACF;AACA;;EAEE,iCAAiC;EACjC;AACF;AACA;;;EAGE,gCAAgC;EAChC;AACF;AACA;;;;EAIE,mCAAmC;EACnC;AACF;AACA;EACE,gDAAgD;EAChD;AACF;AACA;EACE,uCAAuC;EACvC,cAAc;EACd;AACF;AACA;EACE,oCAAoC;EACpC;AACF;AACA;EACE,sCAAsC;EACtC,cAAc;EACd;AACF;AACA;EACE,oCAAoC;EACpC,cAAc;EACd;AACF;AACA;EACE,wCAAwC;EACxC,cAAc;EACd;AACF;AACA;EACE,uCAAuC;EACvC,cAAc;EACd;AACF;AACA;;;;;;EAME,sBAAsB;;AAExB",sourcesContent:["pre code.hljs {\n display: block;\n overflow-x: auto;\n padding: 1em\n}\ncode.hljs {\n padding: 3px 5px\n}\n/*!\n Theme: GitHub\n Description: Light theme as seen on github.com\n Author: github.com\n Maintainer: @Hirse\n Updated: 2021-05-15\n\n Outdated base version: https://github.com/primer/github-syntax-light\n Current colors taken from GitHub's CSS\n*/\n.hljs {\n color: #24292e;\n background: #ffffff\n}\n.hljs-doctag,\n.hljs-keyword,\n.hljs-meta .hljs-keyword,\n.hljs-template-tag,\n.hljs-template-variable,\n.hljs-type,\n.hljs-variable.language_ {\n /* prettylights-syntax-keyword */\n color: #d73a49\n}\n.hljs-title,\n.hljs-title.class_,\n.hljs-title.class_.inherited__,\n.hljs-title.function_ {\n /* prettylights-syntax-entity */\n color: #6f42c1\n}\n.hljs-attr,\n.hljs-attribute,\n.hljs-literal,\n.hljs-meta,\n.hljs-number,\n.hljs-operator,\n.hljs-variable,\n.hljs-selector-attr,\n.hljs-selector-class,\n.hljs-selector-id {\n /* prettylights-syntax-constant */\n color: #005cc5\n}\n.hljs-regexp,\n.hljs-string,\n.hljs-meta .hljs-string {\n /* prettylights-syntax-string */\n color: #032f62\n}\n.hljs-built_in,\n.hljs-symbol {\n /* prettylights-syntax-variable */\n color: #e36209\n}\n.hljs-comment,\n.hljs-code,\n.hljs-formula {\n /* prettylights-syntax-comment */\n color: #6a737d\n}\n.hljs-name,\n.hljs-quote,\n.hljs-selector-tag,\n.hljs-selector-pseudo {\n /* prettylights-syntax-entity-tag */\n color: #22863a\n}\n.hljs-subst {\n /* prettylights-syntax-storage-modifier-import */\n color: #24292e\n}\n.hljs-section {\n /* prettylights-syntax-markup-heading */\n color: #005cc5;\n font-weight: bold\n}\n.hljs-bullet {\n /* prettylights-syntax-markup-list */\n color: #735c0f\n}\n.hljs-emphasis {\n /* prettylights-syntax-markup-italic */\n color: #24292e;\n font-style: italic\n}\n.hljs-strong {\n /* prettylights-syntax-markup-bold */\n color: #24292e;\n font-weight: bold\n}\n.hljs-addition {\n /* prettylights-syntax-markup-inserted */\n color: #22863a;\n background-color: #f0fff4\n}\n.hljs-deletion {\n /* prettylights-syntax-markup-deleted */\n color: #b31d28;\n background-color: #ffeef0\n}\n.hljs-char.escape_,\n.hljs-link,\n.hljs-params,\n.hljs-property,\n.hljs-punctuation,\n.hljs-tag {\n /* purposely ignored */\n \n}"],sourceRoot:""}]),D.A=r},6314(u){"use strict";u.exports=function(u){var D=[];return D.toString=function(){return this.map(function(D){var e="",n=void 0!==D[5];return D[4]&&(e+="@supports (".concat(D[4],") {")),D[2]&&(e+="@media ".concat(D[2]," {")),n&&(e+="@layer".concat(D[5].length>0?" ".concat(D[5]):""," {")),e+=u(D),n&&(e+="}"),D[2]&&(e+="}"),D[4]&&(e+="}"),e}).join("")},D.i=function(u,e,n,t,a){"string"==typeof u&&(u=[[null,u,void 0]]);var r={};if(n)for(var i=0;i0?" ".concat(F[5]):""," {").concat(F[1],"}")),F[5]=a),e&&(F[2]?(F[1]="@media ".concat(F[2]," {").concat(F[1],"}"),F[2]=e):F[2]=e),t&&(F[4]?(F[1]="@supports (".concat(F[4],") {").concat(F[1],"}"),F[4]=t):F[4]="".concat(t)),D.push(F))}},D}},1354(u){"use strict";u.exports=function(u){var D=u[1],e=u[3];if(!e)return D;if("function"==typeof btoa){var n=btoa(unescape(encodeURIComponent(JSON.stringify(e)))),t="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(n),a="/*# ".concat(t," */");return[D].concat([a]).join("\n")}return[D].join("\n")}},5072(u){"use strict";var D=[];function e(u){for(var e=-1,n=0;n0?" ".concat(e.layer):""," {")),n+=e.css,t&&(n+="}"),e.media&&(n+="}"),e.supports&&(n+="}");var a=e.sourceMap;a&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),D.styleTagTransform(n,u,D.options)}(D,u,e)},remove:function(){!function(u){if(null===u.parentNode)return!1;u.parentNode.removeChild(u)}(D)}}}},1113(u){"use strict";u.exports=function(u,D){if(D.styleSheet)D.styleSheet.cssText=u;else{for(;D.firstChild;)D.removeChild(D.firstChild);D.appendChild(document.createTextNode(u))}}},2006(u){function D(u,D){return function(u){if(Array.isArray(u))return u}(u)||function(u,D){var e=null==u?null:"undefined"!=typeof Symbol&&u[Symbol.iterator]||u["@@iterator"];if(null!=e){var n,t,a,r,i=[],s=!0,o=!1;try{if(a=(e=e.call(u)).next,0===D){if(Object(e)!==e)return;s=!1}else for(;!(s=(n=a.call(e)).done)&&(i.push(n.value),i.length!==D);s=!0);}catch(u){o=!0,t=u}finally{try{if(!s&&null!=e.return&&(r=e.return(),Object(r)!==r))return}finally{if(o)throw t}}return i}}(u,D)||function(u,D){if(u){if("string"==typeof u)return e(u,D);var n={}.toString.call(u).slice(8,-1);return"Object"===n&&u.constructor&&(n=u.constructor.name),"Map"===n||"Set"===n?Array.from(u):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?e(u,D):void 0}}(u,D)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e(u,D){(null==D||D>u.length)&&(D=u.length);for(var e=0,n=Array(D);e{var e=u[D],t=typeof e;"object"!==t&&"function"!==t||Object.isFrozen(e)||n(e)}),u}class t{constructor(u){void 0===u.data&&(u.data={}),this.data=u.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function a(u){return u.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function r(u){var D=Object.create(null);for(var e in u)D[e]=u[e];for(var n=arguments.length,t=new Array(n>1?n-1:0),a=1;a!!u.scope;class s{constructor(u,D){this.buffer="",this.classPrefix=D.classPrefix,u.walk(this)}addText(u){this.buffer+=a(u)}openNode(u){if(i(u)){var D=(u=>{var D={prefix:this.classPrefix}.prefix;if(u.startsWith("language:"))return u.replace("language:","language-");if(u.includes(".")){var e=u.split(".");return["".concat(D).concat(e.shift()),...e.map((u,D)=>"".concat(u).concat("_".repeat(D+1)))].join(" ")}return"".concat(D).concat(u)})(u.scope);this.span(D)}}closeNode(u){i(u)&&(this.buffer+="")}value(){return this.buffer}span(u){this.buffer+='')}}var o=function(){var u=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},D={children:[]};return Object.assign(D,u),D};class F{constructor(){this.rootNode=o(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(u){this.top.children.push(u)}openNode(u){var D=o({scope:u});this.add(D),this.stack.push(D)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(u){return this.constructor._walk(u,this.rootNode)}static _walk(u,D){return"string"==typeof D?u.addText(D):D.children&&(u.openNode(D),D.children.forEach(D=>this._walk(u,D)),u.closeNode(D)),u}static _collapse(u){"string"!=typeof u&&u.children&&(u.children.every(u=>"string"==typeof u)?u.children=[u.children.join("")]:u.children.forEach(u=>{F._collapse(u)}))}}class l extends F{constructor(u){super(),this.options=u}addText(u){""!==u&&this.add(u)}startScope(u){this.openNode(u)}endScope(){this.closeNode()}__addSublanguage(u,D){var e=u.root;D&&(e.scope="language:".concat(D)),this.add(e)}toHTML(){return new s(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}}function c(u){return u?"string"==typeof u?u:u.source:null}function E(u){return d("(?=",u,")")}function A(u){return d("(?:",u,")*")}function C(u){return d("(?:",u,")?")}function d(){for(var u=arguments.length,D=new Array(u),e=0;ec(u)).join("")}function g(){for(var u=arguments.length,D=new Array(u),e=0;ec(u)).join("|")+")"}function B(u){return new RegExp(u.toString()+"|").exec("").length-1}var b=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function m(u,D){var e=D.joinWith,n=0;return u.map(u=>{for(var D=n+=1,e=c(u),t="";e.length>0;){var a=b.exec(e);if(!a){t+=e;break}t+=e.substring(0,a.index),e=e.substring(a.index+a[0].length),"\\"===a[0][0]&&a[1]?t+="\\"+String(Number(a[1])+D):(t+=a[0],"("===a[0]&&n++)}return t}).map(u=>"(".concat(u,")")).join(e)}var h="[a-zA-Z]\\w*",p="[a-zA-Z_]\\w*",f="\\b\\d+(\\.\\d+)?",v="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",y="\\b(0b[01]+)",_={begin:"\\\\[\\s\\S]",relevance:0},x={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[_]},w={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[_]},N=function(u,D){var e=r({scope:"comment",begin:u,end:D,contains:[]},arguments.length>2&&void 0!==arguments[2]?arguments[2]:{});e.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});var n=g("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return e.contains.push({begin:d(/[ ]+/,"(",n,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),e},k=N("//","$"),S=N("/\\*","\\*/"),M=N("#","$"),O={scope:"number",begin:f,relevance:0},j={scope:"number",begin:v,relevance:0},R={scope:"number",begin:y,relevance:0},T={scope:"regexp",begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[_,{begin:/\[/,end:/\]/,relevance:0,contains:[_]}]},I={scope:"title",begin:h,relevance:0},L={scope:"title",begin:p,relevance:0},z={begin:"\\.\\s*"+p,relevance:0},P=Object.freeze({__proto__:null,APOS_STRING_MODE:x,BACKSLASH_ESCAPE:_,BINARY_NUMBER_MODE:R,BINARY_NUMBER_RE:y,COMMENT:N,C_BLOCK_COMMENT_MODE:S,C_LINE_COMMENT_MODE:k,C_NUMBER_MODE:j,C_NUMBER_RE:v,END_SAME_AS_BEGIN:function(u){return Object.assign(u,{"on:begin":(u,D)=>{D.data._beginMatch=u[1]},"on:end":(u,D)=>{D.data._beginMatch!==u[1]&&D.ignoreMatch()}})},HASH_COMMENT_MODE:M,IDENT_RE:h,MATCH_NOTHING_RE:/\b\B/,METHOD_GUARD:z,NUMBER_MODE:O,NUMBER_RE:f,PHRASAL_WORDS_MODE:{begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},QUOTE_STRING_MODE:w,REGEXP_MODE:T,RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:function(){var u=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},D=/^#![ ]*\//;return u.binary&&(u.begin=d(D,/.*\b/,u.binary,/\b.*/)),r({scope:"meta",begin:D,end:/$/,relevance:0,"on:begin":(u,D)=>{0!==u.index&&D.ignoreMatch()}},u)},TITLE_MODE:I,UNDERSCORE_IDENT_RE:p,UNDERSCORE_TITLE_MODE:L});function U(u,D){"."===u.input[u.index-1]&&D.ignoreMatch()}function H(u,D){void 0!==u.className&&(u.scope=u.className,delete u.className)}function $(u,D){D&&u.beginKeywords&&(u.begin="\\b("+u.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",u.__beforeBegin=U,u.keywords=u.keywords||u.beginKeywords,delete u.beginKeywords,void 0===u.relevance&&(u.relevance=0))}function Z(u,D){Array.isArray(u.illegal)&&(u.illegal=g(...u.illegal))}function K(u,D){if(u.match){if(u.begin||u.end)throw new Error("begin & end are not supported with match");u.begin=u.match,delete u.match}}function G(u,D){void 0===u.relevance&&(u.relevance=1)}var q=(u,D)=>{if(u.beforeMatch){if(u.starts)throw new Error("beforeMatch cannot be used with starts");var e=Object.assign({},u);Object.keys(u).forEach(D=>{delete u[D]}),u.keywords=e.keywords,u.begin=d(e.beforeMatch,E(e.begin)),u.starts={relevance:0,contains:[Object.assign(e,{endsParent:!0})]},u.relevance=0,delete e.beforeMatch}},W=["of","and","for","in","not","or","if","then","parent","list","value"];function V(u,D){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"keyword",n=Object.create(null);return"string"==typeof u?t(e,u.split(" ")):Array.isArray(u)?t(e,u):Object.keys(u).forEach(function(e){Object.assign(n,V(u[e],D,e))}),n;function t(u,e){D&&(e=e.map(u=>u.toLowerCase())),e.forEach(function(D){var e=D.split("|");n[e[0]]=[u,Q(e[0],e[1])]})}}function Q(u,D){return D?Number(D):function(u){return W.includes(u.toLowerCase())}(u)?0:1}var X={},J=u=>{console.error(u)},Y=function(u){for(var D=arguments.length,e=new Array(D>1?D-1:0),n=1;n{X["".concat(u,"/").concat(D)]||(console.log("Deprecated as of ".concat(u,". ").concat(D)),X["".concat(u,"/").concat(D)]=!0)},Du=new Error;function eu(u,D,e){for(var n=e.key,t=0,a=u[n],r={},i={},s=1;s<=D.length;s++)i[s+t]=a[s],r[s+t]=!0,t+=B(D[s-1]);u[n]=i,u[n]._emit=r,u[n]._multi=!0}function nu(u){!function(u){u.scope&&"object"==typeof u.scope&&null!==u.scope&&(u.beginScope=u.scope,delete u.scope)}(u),"string"==typeof u.beginScope&&(u.beginScope={_wrap:u.beginScope}),"string"==typeof u.endScope&&(u.endScope={_wrap:u.endScope}),function(u){if(Array.isArray(u.begin)){if(u.skip||u.excludeBegin||u.returnBegin)throw J("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),Du;if("object"!=typeof u.beginScope||null===u.beginScope)throw J("beginScope must be object"),Du;eu(u,u.begin,{key:"beginScope"}),u.begin=m(u.begin,{joinWith:""})}}(u),function(u){if(Array.isArray(u.end)){if(u.skip||u.excludeEnd||u.returnEnd)throw J("skip, excludeEnd, returnEnd not compatible with endScope: {}"),Du;if("object"!=typeof u.endScope||null===u.endScope)throw J("endScope must be object"),Du;eu(u,u.end,{key:"endScope"}),u.end=m(u.end,{joinWith:""})}}(u)}function tu(u){function e(D,e){return new RegExp(c(D),"m"+(u.case_insensitive?"i":"")+(u.unicodeRegex?"u":"")+(e?"g":""))}class n{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(u,D){D.position=this.position++,this.matchIndexes[this.matchAt]=D,this.regexes.push([D,u]),this.matchAt+=B(u)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);var u=this.regexes.map(u=>u[1]);this.matcherRe=e(m(u,{joinWith:"|"}),!0),this.lastIndex=0}exec(u){this.matcherRe.lastIndex=this.lastIndex;var D=this.matcherRe.exec(u);if(!D)return null;var e=D.findIndex((u,D)=>D>0&&void 0!==u),n=this.matchIndexes[e];return D.splice(0,e),Object.assign(D,n)}}class t{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(u){if(this.multiRegexes[u])return this.multiRegexes[u];var e=new n;return this.rules.slice(u).forEach(u=>{var n=D(u,2),t=n[0],a=n[1];return e.addRule(t,a)}),e.compile(),this.multiRegexes[u]=e,e}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(u,D){this.rules.push([u,D]),"begin"===D.type&&this.count++}exec(u){var D=this.getMatcher(this.regexIndex);D.lastIndex=this.lastIndex;var e=D.exec(u);if(this.resumingScanAtSamePosition())if(e&&e.index===this.lastIndex);else{var n=this.getMatcher(0);n.lastIndex=this.lastIndex+1,e=n.exec(u)}return e&&(this.regexIndex+=e.position+1,this.regexIndex===this.count&&this.considerAll()),e}}if(u.compilerExtensions||(u.compilerExtensions=[]),u.contains&&u.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return u.classNameAliases=r(u.classNameAliases||{}),function D(n,a){var i=n;if(n.isCompiled)return i;[H,K,nu,q].forEach(u=>u(n,a)),u.compilerExtensions.forEach(u=>u(n,a)),n.__beforeBegin=null,[$,Z,G].forEach(u=>u(n,a)),n.isCompiled=!0;var s=null;return"object"==typeof n.keywords&&n.keywords.$pattern&&(n.keywords=Object.assign({},n.keywords),s=n.keywords.$pattern,delete n.keywords.$pattern),s=s||/\w+/,n.keywords&&(n.keywords=V(n.keywords,u.case_insensitive)),i.keywordPatternRe=e(s,!0),a&&(n.begin||(n.begin=/\B|\b/),i.beginRe=e(i.begin),n.end||n.endsWithParent||(n.end=/\B|\b/),n.end&&(i.endRe=e(i.end)),i.terminatorEnd=c(i.end)||"",n.endsWithParent&&a.terminatorEnd&&(i.terminatorEnd+=(n.end?"|":"")+a.terminatorEnd)),n.illegal&&(i.illegalRe=e(n.illegal)),n.contains||(n.contains=[]),n.contains=[].concat(...n.contains.map(function(u){return function(u){return u.variants&&!u.cachedVariants&&(u.cachedVariants=u.variants.map(function(D){return r(u,{variants:null},D)})),u.cachedVariants?u.cachedVariants:au(u)?r(u,{starts:u.starts?r(u.starts):null}):Object.isFrozen(u)?r(u):u}("self"===u?n:u)})),n.contains.forEach(function(u){D(u,i)}),n.starts&&D(n.starts,a),i.matcher=function(u){var D=new t;return u.contains.forEach(u=>D.addRule(u.begin,{rule:u,type:"begin"})),u.terminatorEnd&&D.addRule(u.terminatorEnd,{type:"end"}),u.illegal&&D.addRule(u.illegal,{type:"illegal"}),D}(i),i}(u)}function au(u){return!!u&&(u.endsWithParent||au(u.starts))}class ru extends Error{constructor(u,D){super(u),this.name="HTMLInjectionError",this.html=D}}var iu=a,su=r,ou=Symbol("nomatch"),Fu=function(u){var e=Object.create(null),a=Object.create(null),r=[],i=!0,s="Could not find the language '{}', did you forget to load/include a language module?",o={disableAutodetect:!0,name:"Plain text",contains:[]},F={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:l};function c(u){return F.noHighlightRe.test(u)}function B(u,D,e){var n="",t="";"object"==typeof D?(n=u,e=D.ignoreIllegals,t=D.language):(uu("10.7.0","highlight(lang, code, ...args) has been deprecated."),uu("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),t=u,n=D),void 0===e&&(e=!0);var a={code:n,language:t};x("before:highlight",a);var r=a.result?a.result:b(a.language,a.code,e);return r.code=a.code,x("after:highlight",r),r}function b(u,n,a,r){var o=Object.create(null);function l(u,D){return u.keywords[D]}function c(){if(w.keywords){var u=0;w.keywordPatternRe.lastIndex=0;for(var e=w.keywordPatternRe.exec(S),n="";e;){n+=S.substring(u,e.index);var t=y.case_insensitive?e[0].toLowerCase():e[0],a=l(w,t);if(a){var r=D(a,2),i=r[0],s=r[1];if(k.addText(n),n="",o[t]=(o[t]||0)+1,o[t]<=7&&(M+=s),i.startsWith("_"))n+=e[0];else{var F=y.classNameAliases[i]||i;A(e[0],F)}}else n+=e[0];u=w.keywordPatternRe.lastIndex,e=w.keywordPatternRe.exec(S)}n+=S.substring(u),k.addText(n)}else k.addText(S)}function E(){null!=w.subLanguage?function(){if(""!==S){var u=null;if("string"==typeof w.subLanguage){if(!e[w.subLanguage])return void k.addText(S);u=b(w.subLanguage,S,!0,N[w.subLanguage]),N[w.subLanguage]=u._top}else u=m(S,w.subLanguage.length?w.subLanguage:null);w.relevance>0&&(M+=u.relevance),k.__addSublanguage(u._emitter,u.language)}}():c(),S=""}function A(u,D){""!==u&&(k.startScope(D),k.addText(u),k.endScope())}function C(u,D){for(var e=1,n=D.length-1;e<=n;)if(u._emit[e]){var t=y.classNameAliases[u[e]]||u[e],a=D[e];t?A(a,t):(S=a,c(),S=""),e++}else e++}function d(u,D){return u.scope&&"string"==typeof u.scope&&k.openNode(y.classNameAliases[u.scope]||u.scope),u.beginScope&&(u.beginScope._wrap?(A(S,y.classNameAliases[u.beginScope._wrap]||u.beginScope._wrap),S=""):u.beginScope._multi&&(C(u.beginScope,D),S="")),w=Object.create(u,{parent:{value:w}})}function g(u,D,e){var n=function(u,D){var e=u&&u.exec(D);return e&&0===e.index}(u.endRe,e);if(n){if(u["on:end"]){var a=new t(u);u["on:end"](D,a),a.isMatchIgnored&&(n=!1)}if(n){for(;u.endsParent&&u.parent;)u=u.parent;return u}}if(u.endsWithParent)return g(u.parent,D,e)}function B(u){return 0===w.matcher.regexIndex?(S+=u[0],1):(R=!0,0)}function h(u){var D=u[0],e=n.substring(u.index),t=g(w,u,e);if(!t)return ou;var a=w;w.endScope&&w.endScope._wrap?(E(),A(D,w.endScope._wrap)):w.endScope&&w.endScope._multi?(E(),C(w.endScope,u)):a.skip?S+=D:(a.returnEnd||a.excludeEnd||(S+=D),E(),a.excludeEnd&&(S=D));do{w.scope&&k.closeNode(),w.skip||w.subLanguage||(M+=w.relevance),w=w.parent}while(w!==t.parent);return t.starts&&d(t.starts,u),a.returnEnd?0:D.length}var p={};function f(D,e){var r=e&&e[0];if(S+=D,null==r)return E(),0;if("begin"===p.type&&"end"===e.type&&p.index===e.index&&""===r){if(S+=n.slice(e.index,e.index+1),!i){var s=new Error("0 width match regex (".concat(u,")"));throw s.languageName=u,s.badRule=p.rule,s}return 1}if(p=e,"begin"===e.type)return function(u){for(var D=u[0],e=u.rule,n=new t(e),a=0,r=[e.__beforeBegin,e["on:begin"]];a")+'"');throw o.mode=w,o}if("end"===e.type){var F=h(e);if(F!==ou)return F}if("illegal"===e.type&&""===r)return S+="\n",1;if(j>1e5&&j>3*e.index)throw new Error("potential infinite loop, way more iterations than matches");return S+=r,r.length}var y=v(u);if(!y)throw J(s.replace("{}",u)),new Error('Unknown language: "'+u+'"');var _=tu(y),x="",w=r||_,N={},k=new F.__emitter(F);!function(){for(var u=[],D=w;D!==y;D=D.parent)D.scope&&u.unshift(D.scope);u.forEach(u=>k.openNode(u))}();var S="",M=0,O=0,j=0,R=!1;try{if(y.__emitTokens)y.__emitTokens(n,k);else{for(w.matcher.considerAll();;){j++,R?R=!1:w.matcher.considerAll(),w.matcher.lastIndex=O;var T=w.matcher.exec(n);if(!T)break;var I=f(n.substring(O,T.index),T);O=T.index+I}f(n.substring(O))}return k.finalize(),x=k.toHTML(),{language:u,value:x,relevance:M,illegal:!1,_emitter:k,_top:w}}catch(D){if(D.message&&D.message.includes("Illegal"))return{language:u,value:iu(n),illegal:!0,relevance:0,_illegalBy:{message:D.message,index:O,context:n.slice(O-100,O+100),mode:D.mode,resultSoFar:x},_emitter:k};if(i)return{language:u,value:iu(n),illegal:!1,relevance:0,errorRaised:D,_emitter:k,_top:w};throw D}}function m(u,n){n=n||F.languages||Object.keys(e);var t=function(u){var D={value:iu(u),illegal:!1,relevance:0,_top:o,_emitter:new F.__emitter(F)};return D._emitter.addText(u),D}(u),a=n.filter(v).filter(_).map(D=>b(D,u,!1));a.unshift(t);var r=D(a.sort((u,D)=>{if(u.relevance!==D.relevance)return D.relevance-u.relevance;if(u.language&&D.language){if(v(u.language).supersetOf===D.language)return 1;if(v(D.language).supersetOf===u.language)return-1}return 0}),2),i=r[0],s=r[1],l=i;return l.secondBest=s,l}function h(u){var D=function(u){var D=u.className+" ";D+=u.parentNode?u.parentNode.className:"";var e=F.languageDetectRe.exec(D);if(e){var n=v(e[1]);return n||(Y(s.replace("{}",e[1])),Y("Falling back to no-highlight mode for this block.",u)),n?e[1]:"no-highlight"}return D.split(/\s+/).find(u=>c(u)||v(u))}(u);if(!c(D))if(x("before:highlightElement",{el:u,language:D}),u.dataset.highlighted)console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",u);else{if(u.children.length>0&&(F.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(u)),F.throwUnescapedHTML))throw new ru("One of your code blocks includes unescaped HTML.",u.innerHTML);var e=u.textContent,n=D?B(e,{language:D,ignoreIllegals:!0}):m(e);u.innerHTML=n.value,u.dataset.highlighted="yes",function(u,D,e){var n=D&&a[D]||e;u.classList.add("hljs"),u.classList.add("language-".concat(n))}(u,D,n.language),u.result={language:n.language,re:n.relevance,relevance:n.relevance},n.secondBest&&(u.secondBest={language:n.secondBest.language,relevance:n.secondBest.relevance}),x("after:highlightElement",{el:u,result:n,text:e})}}var p=!1;function f(){if("loading"===document.readyState)return p||window.addEventListener("DOMContentLoaded",function(){f()},!1),void(p=!0);document.querySelectorAll(F.cssSelector).forEach(h)}function v(u){return u=(u||"").toLowerCase(),e[u]||e[a[u]]}function y(u,D){var e=D.languageName;"string"==typeof u&&(u=[u]),u.forEach(u=>{a[u.toLowerCase()]=e})}function _(u){var D=v(u);return D&&!D.disableAutodetect}function x(u,D){var e=u;r.forEach(function(u){u[e]&&u[e](D)})}for(var w in Object.assign(u,{highlight:B,highlightAuto:m,highlightAll:f,highlightElement:h,highlightBlock:function(u){return uu("10.7.0","highlightBlock will be removed entirely in v12.0"),uu("10.7.0","Please use highlightElement now."),h(u)},configure:function(u){F=su(F,u)},initHighlighting:()=>{f(),uu("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")},initHighlightingOnLoad:function(){f(),uu("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")},registerLanguage:function(D,n){var t=null;try{t=n(u)}catch(u){if(J("Language definition for '{}' could not be registered.".replace("{}",D)),!i)throw u;J(u),t=o}t.name||(t.name=D),e[D]=t,t.rawDefinition=n.bind(null,u),t.aliases&&y(t.aliases,{languageName:D})},unregisterLanguage:function(u){delete e[u];for(var D=0,n=Object.keys(a);D{u["before:highlightBlock"](Object.assign({block:D.el},D))}),u["after:highlightBlock"]&&!u["after:highlightElement"]&&(u["after:highlightElement"]=D=>{u["after:highlightBlock"](Object.assign({block:D.el},D))})}(u),r.push(u)},removePlugin:function(u){var D=r.indexOf(u);-1!==D&&r.splice(D,1)}}),u.debugMode=function(){i=!1},u.safeMode=function(){i=!0},u.versionString="11.11.1",u.regex={concat:d,lookahead:E,either:g,optional:C,anyNumberOfTimes:A},P)"object"==typeof P[w]&&n(P[w]);return Object.assign(u,P),u},lu=Fu({});lu.newInstance=()=>Fu({}),u.exports=lu,lu.HighlightJS=lu,lu.default=lu}}]); +(self.webpackChunkdash_table=self.webpackChunkdash_table||[]).push([[254],{3948:function(u,e,D){"use strict";D.d(e,{default:function(){return z}});var n=D(2006),t=D(5072),a=D.n(t),r=D(7825),i=D.n(r),o=D(7659),s=D.n(o),c=D(5056),F=D.n(c),l=D(540),A=D.n(l),E=D(1113),C=D.n(E),d=D(6991),g={};g.styleTagTransform=C(),g.setAttributes=F(),g.insert=s().bind(null,"head"),g.domAPI=i(),g.insertStyleElement=A(),a()(d.A,g),d.A&&d.A.locals&&d.A.locals;var B=[].concat(["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"]),b=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),p=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),m=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),f=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse();function h(u,e){(null==e||e>u.length)&&(e=u.length);for(var D=0,n=Array(e);Du.length)&&(e=u.length);for(var D=0,n=Array(e);D",contains:[{beginKeywords:"in out"},D]},A=u.IDENT_RE+"(<"+u.IDENT_RE+"(\\s*,\\s*"+u.IDENT_RE+")*>)?(\\[\\])?",E={begin:"@"+u.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:e,illegal:/::/,contains:[u.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:""}]}]}),u.C_LINE_COMMENT_MODE,u.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{keyword:"if else elif endif define undef warning error line region endregion pragma checksum"}},F,n,{beginKeywords:"class interface",relevance:0,end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},D,l,u.C_LINE_COMMENT_MODE,u.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,contains:[D,u.C_LINE_COMMENT_MODE,u.C_BLOCK_COMMENT_MODE]},{beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,contains:[D,l,u.C_LINE_COMMENT_MODE,u.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+A+"\\s+)+"+u.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:e,contains:[{beginKeywords:["public","private","protected","static","internal","protected","abstract","async","extern","override","unsafe","virtual","new","sealed","partial"].join(" "),relevance:0},{begin:u.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,contains:[u.TITLE_MODE,l],relevance:0},{match:/\(\)/},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:e,relevance:0,contains:[F,n,u.C_BLOCK_COMMENT_MODE]},u.C_LINE_COMMENT_MODE,u.C_BLOCK_COMMENT_MODE]},E]}}),n.registerLanguage("css",function(u){var e=u.regex,D=function(u){return{IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:u.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[u.APOS_STRING_MODE,u.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:u.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}}(u),n=[u.APOS_STRING_MODE,u.QUOTE_STRING_MODE];return{name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"},contains:[D.BLOCK_COMMENT,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/},D.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},D.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{begin:":("+p.join("|")+")"},{begin:":(:)?("+m.join("|")+")"}]},D.CSS_VARIABLE,{className:"attribute",begin:"\\b("+f.join("|")+")\\b"},{begin:/:/,end:/[;}{]/,contains:[D.BLOCK_COMMENT,D.HEXCOLOR,D.IMPORTANT,D.CSS_NUMBER_MODE].concat(n,[{begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"},contains:[].concat(n,[{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}])},D.FUNCTION_DISPATCH])},{begin:e.lookahead(/@/),end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword",begin:/@-?\w[\w]*(-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:"and or not only",attribute:b.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute"}].concat(n,[D.CSS_NUMBER_MODE])}]},{className:"selector-tag",begin:"\\b("+B.join("|")+")\\b"}]}}),n.registerLanguage("fsharp",function(u){var e={scope:"keyword",match:/\b(yield|return|let|do|match|use)!/},D=["bool","byte","sbyte","int8","int16","int32","uint8","uint16","uint32","int","uint","int64","uint64","nativeint","unativeint","decimal","float","double","float32","single","char","string","unit","bigint","option","voption","list","array","seq","byref","exn","inref","nativeptr","obj","outref","voidptr","Result"],n={keyword:["abstract","and","as","assert","base","begin","class","default","delegate","do","done","downcast","downto","elif","else","end","exception","extern","finally","fixed","for","fun","function","global","if","in","inherit","inline","interface","internal","lazy","let","match","member","module","mutable","namespace","new","of","open","or","override","private","public","rec","return","static","struct","then","to","try","type","upcast","use","val","void","when","while","with","yield"],literal:["true","false","null","Some","None","Ok","Error","infinity","infinityf","nan","nanf"],built_in:["not","ref","raise","reraise","dict","readOnlyDict","set","get","enum","sizeof","typeof","typedefof","nameof","nullArg","invalidArg","invalidOp","id","fst","snd","ignore","lock","using","box","unbox","tryUnbox","printf","printfn","sprintf","eprintf","eprintfn","fprintf","fprintfn","failwith","failwithf"],"variable.constant":["__LINE__","__SOURCE_DIRECTORY__","__SOURCE_FILE__"]},t={variants:[u.COMMENT(/\(\*(?!\))/,/\*\)/,{contains:["self"]}),u.C_LINE_COMMENT_MODE]},a={scope:"variable",begin:/``/,end:/``/},r=/\B('|\^)/,i={scope:"symbol",variants:[{match:w(r,/``.*?``/)},{match:w(r,u.UNDERSCORE_IDENT_RE)}],relevance:0},o=function(u){var e;e=u.includeEqual?"!%&*+-/<=>@^|~?":"!%&*+-/<>@^|~?";var D,n=Array.from(e),t=w.apply(void 0,["["].concat(function(u){if(Array.isArray(u))return h(u)}(D=n.map(v))||function(u){if("undefined"!=typeof Symbol&&null!=u[Symbol.iterator]||null!=u["@@iterator"])return Array.from(u)}(D)||function(u,e){if(u){if("string"==typeof u)return h(u,e);var D={}.toString.call(u).slice(8,-1);return"Object"===D&&u.constructor&&(D=u.constructor.name),"Map"===D||"Set"===D?Array.from(u):"Arguments"===D||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(D)?h(u,e):void 0}}(D)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),["]"])),a=k(t,/\./),r=w(a,x(a)),i=k(w(r,a,"*"),w(t,"+"));return{scope:"operator",match:k(i,/:\?>/,/:\?/,/:>/,/:=/,/::?/,/\$/),relevance:0}},s=o({includeEqual:!0}),c=o({includeEqual:!1}),F=function(e,r){return{begin:w(e,x(w(/\s*/,k(/\w/,/'/,/\^/,/#/,/``/,/\(/,/{\|/)))),beginScope:r,end:x(k(/\n/,/=/)),relevance:0,keywords:u.inherit(n,{type:D}),contains:[t,i,u.inherit(a,{scope:null}),c]}},l=F(/:/,"operator"),A=F(/\bof\b/,"keyword"),E={begin:[/(^|\s+)/,/type/,/\s+/,/[a-zA-Z_](\w|')*/],beginScope:{2:"keyword",4:"title.class"},end:x(/\(|=|$/),keywords:n,contains:[t,u.inherit(a,{scope:null}),i,{scope:"operator",match:/<|>/},l]},C={scope:"computation-expression",match:/\b[_a-z]\w*(?=\s*\{)/},d={begin:[/^\s*/,w(/#/,k.apply(void 0,["if","else","endif","line","nowarn","light","r","i","I","load","time","help","quit"])),/\b/],beginScope:{2:"meta"},end:x(/\s|$/)},g={variants:[u.BINARY_NUMBER_MODE,u.C_NUMBER_MODE]},B={scope:"string",begin:/"/,end:/"/,contains:[u.BACKSLASH_ESCAPE]},b={scope:"string",begin:/@"/,end:/"/,contains:[{match:/""/},u.BACKSLASH_ESCAPE]},p={scope:"string",begin:/"""/,end:/"""/,relevance:2},m={scope:"subst",begin:/\{/,end:/\}/,keywords:n},f={scope:"string",begin:/\$"/,end:/"/,contains:[{match:/\{\{/},{match:/\}\}/},u.BACKSLASH_ESCAPE,m]},y={scope:"string",begin:/(\$@|@\$)"/,end:/"/,contains:[{match:/\{\{/},{match:/\}\}/},{match:/""/},u.BACKSLASH_ESCAPE,m]},_={scope:"string",begin:/\$"""/,end:/"""/,contains:[{match:/\{\{/},{match:/\}\}/},m],relevance:2},N={scope:"string",match:w(/'/,k(/[^\\']/,/\\(?:.|\d{3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}|U[a-fA-F\d]{8})/),/'/)};return m.contains=[y,f,b,B,N,e,t,a,l,C,d,g,i,s],{name:"F#",aliases:["fs","f#"],keywords:n,illegal:/\/\*/,classNameAliases:{"computation-expression":"keyword"},contains:[e,{variants:[_,y,f,p,b,B,N]},t,a,E,{scope:"meta",begin:/\[\]/,relevance:2,contains:[a,p,b,B,N,g]},A,l,C,d,g,i,s]}}),n.registerLanguage("http",function(u){var e="HTTP/([32]|1\\.[01])",D={className:"attribute",begin:u.regex.concat("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]}},n=[D,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+e+" \\d{3})",end:/$/,contains:[{className:"meta",begin:e},{className:"number",begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:n}},{begin:"(?=^[A-Z]+ (.*?) "+e+"$)",end:/$/,contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:e},{className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:n}},u.inherit(D,{relevance:0})]}}),n.registerLanguage("javascript",function(u){var e=u.regex,D=N,n={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:function(u,e){var D=u[0].length+u.index,n=u.input[D];if("<"!==n&&","!==n){var t;">"===n&&(function(u,e){var D=e.after,n="",x={match:[/const|var|let/,/\s+/,D,/\s*/,/=\s*/,/(async\s*)?/,e.lookahead(_)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[b]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:t,exports:{PARAMS_CONTAINS:B,CLASS_REFERENCE:m},illegal:/#(?![$_A-z])/,contains:[u.SHEBANG({label:"shebang",binary:"node",relevance:5}),{label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},u.APOS_STRING_MODE,u.QUOTE_STRING_MODE,c,F,l,A,E,{match:/\$\d+/},o,m,{scope:"attr",match:D+e.lookahead(":"),relevance:0},x,{begin:"("+u.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[E,u.REGEXP_MODE,{className:"function",begin:_,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:u.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:B}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:"<>",end:""},{match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:n.begin,"on:begin":n.isTrulyOpeningTag,end:n.end}],subLanguage:"xml",contains:[{begin:n.begin,end:n.end,skip:!0,contains:["self"]}]}]},f,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+u.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[b,u.inherit(u.TITLE_MODE,{begin:D,className:"title.function"})]},{match:/\.\.\./,relevance:0},y,{match:"\\$"+D,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[b]},h,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"},p,v,{match:/\$[(.]/}]}}),n.registerLanguage("json",function(u){var e=["true","false","null"],D={scope:"literal",beginKeywords:e.join(" ")};return{name:"JSON",aliases:["jsonc"],keywords:{literal:e},contains:[{className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},{match:/[{}[\],:]/,className:"punctuation",relevance:0},u.QUOTE_STRING_MODE,D,u.C_NUMBER_MODE,u.C_LINE_COMMENT_MODE,u.C_BLOCK_COMMENT_MODE],illegal:"\\S"}}),n.registerLanguage("julia",function(u){var e="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",D={$pattern:e,keyword:["baremodule","begin","break","catch","ccall","const","continue","do","else","elseif","end","export","false","finally","for","function","global","if","import","in","isa","let","local","macro","module","quote","return","true","try","using","where","while"],literal:["ARGS","C_NULL","DEPOT_PATH","ENDIAN_BOM","ENV","Inf","Inf16","Inf32","Inf64","InsertionSort","LOAD_PATH","MergeSort","NaN","NaN16","NaN32","NaN64","PROGRAM_FILE","QuickSort","RoundDown","RoundFromZero","RoundNearest","RoundNearestTiesAway","RoundNearestTiesUp","RoundToZero","RoundUp","VERSION|0","devnull","false","im","missing","nothing","pi","stderr","stdin","stdout","true","undef","π","ℯ"],built_in:["AbstractArray","AbstractChannel","AbstractChar","AbstractDict","AbstractDisplay","AbstractFloat","AbstractIrrational","AbstractMatrix","AbstractRange","AbstractSet","AbstractString","AbstractUnitRange","AbstractVecOrMat","AbstractVector","Any","ArgumentError","Array","AssertionError","BigFloat","BigInt","BitArray","BitMatrix","BitSet","BitVector","Bool","BoundsError","CapturedException","CartesianIndex","CartesianIndices","Cchar","Cdouble","Cfloat","Channel","Char","Cint","Cintmax_t","Clong","Clonglong","Cmd","Colon","Complex","ComplexF16","ComplexF32","ComplexF64","CompositeException","Condition","Cptrdiff_t","Cshort","Csize_t","Cssize_t","Cstring","Cuchar","Cuint","Cuintmax_t","Culong","Culonglong","Cushort","Cvoid","Cwchar_t","Cwstring","DataType","DenseArray","DenseMatrix","DenseVecOrMat","DenseVector","Dict","DimensionMismatch","Dims","DivideError","DomainError","EOFError","Enum","ErrorException","Exception","ExponentialBackOff","Expr","Float16","Float32","Float64","Function","GlobalRef","HTML","IO","IOBuffer","IOContext","IOStream","IdDict","IndexCartesian","IndexLinear","IndexStyle","InexactError","InitError","Int","Int128","Int16","Int32","Int64","Int8","Integer","InterruptException","InvalidStateException","Irrational","KeyError","LinRange","LineNumberNode","LinearIndices","LoadError","MIME","Matrix","Method","MethodError","Missing","MissingException","Module","NTuple","NamedTuple","Nothing","Number","OrdinalRange","OutOfMemoryError","OverflowError","Pair","PartialQuickSort","PermutedDimsArray","Pipe","ProcessFailedException","Ptr","QuoteNode","Rational","RawFD","ReadOnlyMemoryError","Real","ReentrantLock","Ref","Regex","RegexMatch","RoundingMode","SegmentationFault","Set","Signed","Some","StackOverflowError","StepRange","StepRangeLen","StridedArray","StridedMatrix","StridedVecOrMat","StridedVector","String","StringIndexError","SubArray","SubString","SubstitutionString","Symbol","SystemError","Task","TaskFailedException","Text","TextDisplay","Timer","Tuple","Type","TypeError","TypeVar","UInt","UInt128","UInt16","UInt32","UInt64","UInt8","UndefInitializer","UndefKeywordError","UndefRefError","UndefVarError","Union","UnionAll","UnitRange","Unsigned","Val","Vararg","VecElement","VecOrMat","Vector","VersionNumber","WeakKeyDict","WeakRef"]},n={keywords:D,illegal:/<\//},t={className:"subst",begin:/\$\(/,end:/\)/,keywords:D},a={className:"variable",begin:"\\$"+e},r={className:"string",contains:[u.BACKSLASH_ESCAPE,t,a],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},i={className:"string",contains:[u.BACKSLASH_ESCAPE,t,a],begin:"`",end:"`"},o={className:"meta",begin:"@"+e};return n.name="Julia",n.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},r,i,o,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},u.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],t.contains=n.contains,n}),n.registerLanguage("markdown",function(u){var e={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},D={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:u.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]},n={className:"strong",contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]},t={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0}]},a=u.inherit(n,{contains:[]}),r=u.inherit(t,{contains:[]});n.contains.push(r),t.contains.push(a);var i=[e,D];return[n,t,a,r].forEach(function(u){u.contains=u.contains.concat(i)}),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:i=i.concat(n,t)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:i}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},n,t,{className:"quote",begin:"^>\\s+",contains:i,end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},D,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},{scope:"literal",match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}),n.registerLanguage("matlab",function(u){var e="('|\\.')+",D={relevance:0,contains:[{begin:e}]};return{name:"Matlab",keywords:{keyword:"arguments break case catch classdef continue else elseif end enumeration events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i|0 inf nan isnan isinf isfinite j|0 why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson max min nanmax nanmin mean nanmean type table readtable writetable sortrows sort figure plot plot3 scatter scatter3 cellfun legend intersect ismember procrustes hold num2cell "},illegal:'(//|"|#|/\\*|\\s+/\\w+)',contains:[{className:"function",beginKeywords:"function",end:"$",contains:[u.UNDERSCORE_TITLE_MODE,{className:"params",variants:[{begin:"\\(",end:"\\)"},{begin:"\\[",end:"\\]"}]}]},{className:"built_in",begin:/true|false/,relevance:0,starts:D},{begin:"[a-zA-Z][a-zA-Z_0-9]*"+e,relevance:0},{className:"number",begin:u.C_NUMBER_RE,relevance:0,starts:D},{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{begin:/\]|\}|\)/,relevance:0,starts:D},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}],starts:D},u.COMMENT("^\\s*%\\{\\s*$","^\\s*%\\}\\s*$"),u.COMMENT("%","$")]}}),n.registerLanguage("plaintext",function(u){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}),n.registerLanguage("python",function(u){var e=u.regex,D=/(?:[A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037B-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088F\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5C\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDC-\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C8A\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7DC\uA7F1-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFC5D\uFC64-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDF9\uFE71\uFE73\uFE77\uFE79\uFE7B\uFE7D\uFE7F-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDDC0-\uDDF3\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD40-\uDD59\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDD4A-\uDD65\uDD6F-\uDD85\uDE80-\uDEA9\uDEB0\uDEB1\uDEC2-\uDEC7\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61\uDF80-\uDF89\uDF8B\uDF8E\uDF90-\uDFB5\uDFB7\uDFD1\uDFD3]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8\uDFC0-\uDFE0]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDB0-\uDDDB\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD80E\uD80F\uD81C-\uD822\uD840-\uD868\uD86A-\uD86D\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD88C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46\uDC60-\uDFFF]|\uD810[\uDC00-\uDFFA]|\uD811[\uDC00-\uDE46]|\uD818[\uDD00-\uDD1D]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDD40-\uDD6C\uDE40-\uDE7F\uDEA0-\uDEB8\uDEBB-\uDED3\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3\uDFF2-\uDFF6]|\uD823[\uDC00-\uDCD5\uDCFF-\uDD1E\uDD80-\uDDF2]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDCD0-\uDCEB\uDDD0-\uDDED\uDDF0\uDEC0-\uDEDE\uDEE0-\uDEE2\uDEE4\uDEE5\uDEE7-\uDEED\uDEF0-\uDEF4\uDEFE\uDEFF\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEAD\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0\uDFF0-\uDFFF]|\uD87B[\uDC00-\uDE5D]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD88D[\uDC00-\uDC79])(?:[0-9A-Z_a-z\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037B-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05EF-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u07FD\u0800-\u082D\u0840-\u085B\u0860-\u086A\u0870-\u0887\u0889-\u088F\u0897-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u09FE\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3C-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C5C\u0C5D\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDC-\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1-\u0CF3\u0D00-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D81-\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECE\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1715\u171F-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u180F-\u1819\u1820-\u1878\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1ABF-\u1ADD\u1AE0-\u1AEB\u1B00-\u1B4C\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C8A\u1C90-\u1CBA\u1CBD-\u1CBF\u1CD0-\u1CD2\u1CD4-\u1CFA\u1D00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7DC\uA7F1-\uA827\uA82C\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFC5D\uFC64-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDF9\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE71\uFE73\uFE77\uFE79\uFE7B\uFE7D\uFE7F-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF65-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDDC0-\uDDF3\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD40-\uDD59\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD27\uDD30-\uDD39\uDD40-\uDD65\uDD69-\uDD6D\uDD6F-\uDD85\uDE80-\uDEA9\uDEAB\uDEAC\uDEB0\uDEB1\uDEC2-\uDEC7\uDEFA-\uDF1C\uDF27\uDF30-\uDF50\uDF70-\uDF85\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC00-\uDC46\uDC66-\uDC75\uDC7F-\uDCBA\uDCC2\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD44-\uDD47\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDC9-\uDDCC\uDDCE-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E-\uDE41\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3B-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74\uDF80-\uDF89\uDF8B\uDF8E\uDF90-\uDFB5\uDFB7-\uDFC0\uDFC2\uDFC5\uDFC7-\uDFCA\uDFCC-\uDFD3\uDFE1\uDFE2]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC5E-\uDC61\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB8\uDEC0-\uDEC9\uDED0-\uDEE3\uDF00-\uDF1A\uDF1D-\uDF2B\uDF30-\uDF39\uDF40-\uDF46]|\uD806[\uDC00-\uDC3A\uDCA0-\uDCE9\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD35\uDD37\uDD38\uDD3B-\uDD43\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD7\uDDDA-\uDDE1\uDDE3\uDDE4\uDE00-\uDE3E\uDE47\uDE50-\uDE99\uDE9D\uDEB0-\uDEF8\uDF60-\uDF67\uDFC0-\uDFE0\uDFF0-\uDFF9]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD8E\uDD90\uDD91\uDD93-\uDD98\uDDA0-\uDDA9\uDDB0-\uDDDB\uDDE0-\uDDE9\uDEE0-\uDEF6\uDF00-\uDF10\uDF12-\uDF3A\uDF3E-\uDF42\uDF50-\uDF5A\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD80E\uD80F\uD81C-\uD822\uD840-\uD868\uD86A-\uD86D\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD88C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC40-\uDC55\uDC60-\uDFFF]|\uD810[\uDC00-\uDFFA]|\uD811[\uDC00-\uDE46]|\uD818[\uDD00-\uDD39]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDD40-\uDD6C\uDD70-\uDD79\uDE40-\uDE7F\uDEA0-\uDEB8\uDEBB-\uDED3\uDF00-\uDF4A\uDF4F-\uDF87\uDF8F-\uDF9F\uDFE0\uDFE1\uDFE3\uDFE4\uDFF0-\uDFF6]|\uD823[\uDC00-\uDCD5\uDCFF-\uDD1E\uDD80-\uDDF2]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD833[\uDCF0-\uDCF9\uDF00-\uDF2D\uDF30-\uDF46]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDC30-\uDC6D\uDC8F\uDD00-\uDD2C\uDD30-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAE\uDEC0-\uDEF9]|\uD839[\uDCD0-\uDCF9\uDDD0-\uDDFA\uDEC0-\uDEDE\uDEE0-\uDEF5\uDEFE\uDEFF\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4B\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEAD\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0\uDFF0-\uDFFF]|\uD87B[\uDC00-\uDE5D]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD88D[\uDC00-\uDC79]|\uDB40[\uDD00-\uDDEF])*/,n=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],t={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:n,built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]},a={className:"meta",begin:/^(>>>|\.\.\.) /},r={className:"subst",begin:/\{/,end:/\}/,keywords:t,illegal:/#/},i={begin:/\{\{/,relevance:0},o={className:"string",contains:[u.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[u.BACKSLASH_ESCAPE,a],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[u.BACKSLASH_ESCAPE,a],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[u.BACKSLASH_ESCAPE,a,i,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,end:/"""/,contains:[u.BACKSLASH_ESCAPE,a,i,r]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[u.BACKSLASH_ESCAPE,i,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,contains:[u.BACKSLASH_ESCAPE,i,r]},u.APOS_STRING_MODE,u.QUOTE_STRING_MODE]},s="[0-9](_?[0-9])*",c="(\\b(".concat(s,"))?\\.(").concat(s,")|\\b(").concat(s,")\\."),F="\\b|".concat(n.join("|")),l={className:"number",relevance:0,variants:[{begin:"(\\b(".concat(s,")|(").concat(c,"))[eE][+-]?(").concat(s,")[jJ]?(?=").concat(F,")")},{begin:"(".concat(c,")[jJ]?")},{begin:"\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=".concat(F,")")},{begin:"\\b0[bB](_?[01])+[lL]?(?=".concat(F,")")},{begin:"\\b0[oO](_?[0-7])+[lL]?(?=".concat(F,")")},{begin:"\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=".concat(F,")")},{begin:"\\b(".concat(s,")[jJ](?=").concat(F,")")}]},A={className:"comment",begin:e.lookahead(/# type:/),end:/$/,keywords:t,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},E={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:["self",a,l,o,u.HASH_COMMENT_MODE]}]};return r.contains=[o,l,a],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:t,illegal:/(<\/|\?)|=>/,contains:[a,l,{scope:"variable.language",match:/\bself\b/},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword"},o,A,u.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,D],scope:{1:"keyword",3:"title.function"},contains:[E]},{variants:[{match:[/\bclass/,/\s+/,D,/\s*/,/\(\s*/,D,/\s*\)/]},{match:[/\bclass/,/\s+/,D]}],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[l,E,o]}]}}),n.registerLanguage("r",function(u){var e=u.regex,D=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,n=e.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),t=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,a=e.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/);return{name:"R",keywords:{$pattern:D,keyword:"function if in break next repeat else for while",literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10",built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm"},contains:[u.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/,starts:{end:e.lookahead(e.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)),endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{scope:"variable",variants:[{match:D},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0}]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/}]}),u.HASH_COMMENT_MODE,{scope:"string",contains:[u.BACKSLASH_ESCAPE],variants:[u.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/}),u.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/}),u.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/}),u.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/}),u.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/}),u.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"',relevance:0},{begin:"'",end:"'",relevance:0}]},{relevance:0,variants:[{scope:{1:"operator",2:"number"},match:[t,n]},{scope:{1:"operator",2:"number"},match:[/%[^%]*%/,n]},{scope:{1:"punctuation",2:"number"},match:[a,n]},{scope:{2:"number"},match:[/[^a-zA-Z0-9._]|^/,n]}]},{scope:{3:"operator"},match:[D,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:t},{match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:a},{begin:"`",end:"`",contains:[{begin:/\\./}]}]}}),n.registerLanguage("ruby",function(u){var e=u.regex,D="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",n=e.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),t=e.concat(n,/(::\w+)*/),a={"variable.constant":["__FILE__","__LINE__","__ENCODING__"],"variable.language":["self","super"],keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield"].concat(["include","extend","prepend","public","private","protected","raise","throw"]),built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"],literal:["true","false","nil"]},r={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},o=[u.COMMENT("#","$",{contains:[r]}),u.COMMENT("^=begin","^=end",{contains:[r],relevance:10}),u.COMMENT("^__END__",u.MATCH_NOTHING_RE)],s={className:"subst",begin:/#\{/,end:/\}/,keywords:a},c={className:"string",contains:[u.BACKSLASH_ESCAPE,s],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{begin:e.concat(/<<[-~]?'?/,e.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)),contains:[u.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[u.BACKSLASH_ESCAPE,s]})]}]},F="[0-9](_?[0-9])*",l={className:"number",relevance:0,variants:[{begin:"\\b(".concat("[1-9](_?[0-9])*|0",")(\\.(").concat(F,"))?([eE][+-]?(").concat(F,")|r)?i?\\b")},{begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{begin:"\\b0(_?[0-7])+r?i?\\b"}]},A={variants:[{match:/\(\)/},{className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0,keywords:a}]},E=[c,{variants:[{match:[/class\s+/,t,/\s+<\s+/,t]},{match:[/\b(class|module)\s+/,t]}],scope:{2:"title.class",4:"title.class.inherited"},keywords:a},{match:[/(include|extend)\s+/,t],scope:{2:"title.class"},keywords:a},{relevance:0,match:[t,/\.new[. (]/],scope:{1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"},{relevance:0,match:n,scope:"title.class"},{match:[/def/,/\s+/,D],scope:{1:"keyword",3:"title.function"},contains:[A]},{begin:u.IDENT_RE+"::"},{className:"symbol",begin:u.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[c,{begin:D}],relevance:0},l,{className:"variable",begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{className:"params",begin:/\|(?!=)/,end:/\|/,excludeBegin:!0,excludeEnd:!0,relevance:0,keywords:a},{begin:"("+u.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{className:"regexp",contains:[u.BACKSLASH_ESCAPE,s],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(i,o),relevance:0}].concat(i,o);s.contains=E,A.contains=E;var C=[{begin:/^\s*=>/,starts:{end:"$",contains:E}},{className:"meta.prompt",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])",starts:{end:"$",keywords:a,contains:E}}];return o.unshift(i),{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:[u.SHEBANG({binary:"ruby"})].concat(C).concat(o).concat(E)}}),n.registerLanguage("shell",function(u){return{name:"Shell Session",aliases:["console","shellsession"],contains:[{className:"meta.prompt",begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,subLanguage:"bash"}}]}}),n.registerLanguage("sql",function(u){var e=u.regex,D=u.COMMENT("--","$"),n=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],t=n,a=[].concat(["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year"],["add","asc","collation","desc","final","first","last","view"]).filter(function(u){return!n.includes(u)}),r={match:e.concat(/\b/,e.either.apply(e,t),/\s*\(/),relevance:0,keywords:{built_in:t}};function i(u){return e.concat(/\b/,e.either.apply(e,function(u){if(Array.isArray(u))return L(u)}(D=u.map(function(u){return u.replace(/\s+/,"\\s+")}))||function(u){if("undefined"!=typeof Symbol&&null!=u[Symbol.iterator]||null!=u["@@iterator"])return Array.from(u)}(D)||function(u,e){if(u){if("string"==typeof u)return L(u,e);var D={}.toString.call(u).slice(8,-1);return"Object"===D&&u.constructor&&(D=u.constructor.name),"Map"===D||"Set"===D?Array.from(u):"Arguments"===D||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(D)?L(u,e):void 0}}(D)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),/\b/);var D}var o={scope:"keyword",match:i(["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"]),relevance:0};return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:function(u){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},D=e.exceptions,n=e.when;return D=D||[],u.map(function(u){return u.match(/\|\d+$/)||D.includes(u)?u:n(u)?"".concat(u,"|0"):u})}(a,{when:function(u){return u.length<3}}),literal:["true","false","unknown"],type:["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"]},contains:[{scope:"type",match:i(["double precision","large object","with timezone","without timezone"])},o,r,{scope:"variable",match:/@[a-z0-9][a-z0-9_]*/},{scope:"string",variants:[{begin:/'/,end:/'/,contains:[{match:/''/}]}]},{begin:/"/,end:/"/,contains:[{match:/""/}]},u.C_NUMBER_MODE,u.C_BLOCK_COMMENT_MODE,D,{scope:"operator",match:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0}]}}),n.registerLanguage("xml",function(u){var e=u.regex,D=e.concat(/(?:[A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088F\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5C\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDC-\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C8A\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7DC\uA7F1-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDDC0-\uDDF3\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD40-\uDD59\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDD4A-\uDD65\uDD6F-\uDD85\uDE80-\uDEA9\uDEB0\uDEB1\uDEC2-\uDEC7\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61\uDF80-\uDF89\uDF8B\uDF8E\uDF90-\uDFB5\uDFB7\uDFD1\uDFD3]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8\uDFC0-\uDFE0]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDB0-\uDDDB\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD80E\uD80F\uD81C-\uD822\uD840-\uD868\uD86A-\uD86D\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD88C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46\uDC60-\uDFFF]|\uD810[\uDC00-\uDFFA]|\uD811[\uDC00-\uDE46]|\uD818[\uDD00-\uDD1D]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDD40-\uDD6C\uDE40-\uDE7F\uDEA0-\uDEB8\uDEBB-\uDED3\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3\uDFF2\uDFF3]|\uD823[\uDC00-\uDCD5\uDCFF-\uDD1E\uDD80-\uDDF2]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDCD0-\uDCEB\uDDD0-\uDDED\uDDF0\uDEC0-\uDEDE\uDEE0-\uDEE2\uDEE4\uDEE5\uDEE7-\uDEED\uDEF0-\uDEF4\uDEFE\uDEFF\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEAD\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0\uDFF0-\uDFFF]|\uD87B[\uDC00-\uDE5D]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD88D[\uDC00-\uDC79])/,e.optional(/(?:[\x2D\.0-9A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088F\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5C\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDC-\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C8A\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7DC\uA7F1-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDDC0-\uDDF3\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD40-\uDD59\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDD4A-\uDD65\uDD6F-\uDD85\uDE80-\uDEA9\uDEB0\uDEB1\uDEC2-\uDEC7\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61\uDF80-\uDF89\uDF8B\uDF8E\uDF90-\uDFB5\uDFB7\uDFD1\uDFD3]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8\uDFC0-\uDFE0]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDB0-\uDDDB\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD80E\uD80F\uD81C-\uD822\uD840-\uD868\uD86A-\uD86D\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD88C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46\uDC60-\uDFFF]|\uD810[\uDC00-\uDFFA]|\uD811[\uDC00-\uDE46]|\uD818[\uDD00-\uDD1D]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDD40-\uDD6C\uDE40-\uDE7F\uDEA0-\uDEB8\uDEBB-\uDED3\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3\uDFF2\uDFF3]|\uD823[\uDC00-\uDCD5\uDCFF-\uDD1E\uDD80-\uDDF2]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDCD0-\uDCEB\uDDD0-\uDDED\uDDF0\uDEC0-\uDEDE\uDEE0-\uDEE2\uDEE4\uDEE5\uDEE7-\uDEED\uDEF0-\uDEF4\uDEFE\uDEFF\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEAD\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0\uDFF0-\uDFFF]|\uD87B[\uDC00-\uDE5D]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD88D[\uDC00-\uDC79])*:/),/(?:[\x2D\.0-9A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088F\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5C\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDC-\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C8A\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7DC\uA7F1-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDDC0-\uDDF3\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD40-\uDD59\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDD4A-\uDD65\uDD6F-\uDD85\uDE80-\uDEA9\uDEB0\uDEB1\uDEC2-\uDEC7\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61\uDF80-\uDF89\uDF8B\uDF8E\uDF90-\uDFB5\uDFB7\uDFD1\uDFD3]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8\uDFC0-\uDFE0]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDB0-\uDDDB\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD80E\uD80F\uD81C-\uD822\uD840-\uD868\uD86A-\uD86D\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD88C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46\uDC60-\uDFFF]|\uD810[\uDC00-\uDFFA]|\uD811[\uDC00-\uDE46]|\uD818[\uDD00-\uDD1D]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDD40-\uDD6C\uDE40-\uDE7F\uDEA0-\uDEB8\uDEBB-\uDED3\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3\uDFF2\uDFF3]|\uD823[\uDC00-\uDCD5\uDCFF-\uDD1E\uDD80-\uDDF2]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDCD0-\uDCEB\uDDD0-\uDDED\uDDF0\uDEC0-\uDEDE\uDEE0-\uDEE2\uDEE4\uDEE5\uDEE7-\uDEED\uDEF0-\uDEF4\uDEFE\uDEFF\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEAD\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0\uDFF0-\uDFFF]|\uD87B[\uDC00-\uDE5D]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD88D[\uDC00-\uDC79])*/),n={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},t={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},a=u.inherit(t,{begin:/\(/,end:/\)/}),r=u.inherit(u.APOS_STRING_MODE,{className:"string"}),i=u.inherit(u.QUOTE_STRING_MODE,{className:"string"}),o={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[t,i,r,a,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[t,a,i,r]}]}]},u.COMMENT(//,{relevance:10}),{begin://,relevance:10},n,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[i]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[o],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[o],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:e.concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:D,relevance:0,starts:o}]},{className:"tag",begin:e.concat(/<\//,e.lookahead(e.concat(D,/>/))),contains:[{className:"name",begin:D,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}),n.registerLanguage("yaml",function(u){var e="true false yes no null",D="[\\w#;/?:@&=+$,.~*'()[\\]]+",n={className:"string",relevance:0,variants:[{begin:/"/,end:/"/},{begin:/\S+/}],contains:[u.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},t=u.inherit(n,{variants:[{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),a={end:",",endsWithParent:!0,excludeEnd:!0,keywords:e,relevance:0},r={begin:/\{/,end:/\}/,contains:[a],illegal:"\\n",relevance:0},i={begin:"\\[",end:"\\]",contains:[a],illegal:"\\n",relevance:0},o=[{className:"attr",variants:[{begin:/[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/},{begin:/"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/},{begin:/'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+D},{className:"type",begin:"!<"+D+">"},{className:"type",begin:"!"+D},{className:"type",begin:"!!"+D},{className:"meta",begin:"&"+u.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+u.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},u.HASH_COMMENT_MODE,{beginKeywords:e,keywords:{literal:e}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:u.C_NUMBER_RE+"\\b",relevance:0},r,i,{className:"string",relevance:0,begin:/'/,end:/'/,contains:[{match:/''/,scope:"char.escape",relevance:0}]},n],s=[].concat(o);return s.pop(),s.push(t),a.contains=s,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:o}});var z=n},6991:function(u,e,D){"use strict";var n=D(1354),t=D.n(n),a=D(6314),r=D.n(a)()(t());r.push([u.id,"pre code.hljs {\n display: block;\n overflow-x: auto;\n padding: 1em\n}\ncode.hljs {\n padding: 3px 5px\n}\n/*!\n Theme: GitHub\n Description: Light theme as seen on github.com\n Author: github.com\n Maintainer: @Hirse\n Updated: 2021-05-15\n\n Outdated base version: https://github.com/primer/github-syntax-light\n Current colors taken from GitHub's CSS\n*/\n.hljs {\n color: #24292e;\n background: #ffffff\n}\n.hljs-doctag,\n.hljs-keyword,\n.hljs-meta .hljs-keyword,\n.hljs-template-tag,\n.hljs-template-variable,\n.hljs-type,\n.hljs-variable.language_ {\n /* prettylights-syntax-keyword */\n color: #d73a49\n}\n.hljs-title,\n.hljs-title.class_,\n.hljs-title.class_.inherited__,\n.hljs-title.function_ {\n /* prettylights-syntax-entity */\n color: #6f42c1\n}\n.hljs-attr,\n.hljs-attribute,\n.hljs-literal,\n.hljs-meta,\n.hljs-number,\n.hljs-operator,\n.hljs-variable,\n.hljs-selector-attr,\n.hljs-selector-class,\n.hljs-selector-id {\n /* prettylights-syntax-constant */\n color: #005cc5\n}\n.hljs-regexp,\n.hljs-string,\n.hljs-meta .hljs-string {\n /* prettylights-syntax-string */\n color: #032f62\n}\n.hljs-built_in,\n.hljs-symbol {\n /* prettylights-syntax-variable */\n color: #e36209\n}\n.hljs-comment,\n.hljs-code,\n.hljs-formula {\n /* prettylights-syntax-comment */\n color: #6a737d\n}\n.hljs-name,\n.hljs-quote,\n.hljs-selector-tag,\n.hljs-selector-pseudo {\n /* prettylights-syntax-entity-tag */\n color: #22863a\n}\n.hljs-subst {\n /* prettylights-syntax-storage-modifier-import */\n color: #24292e\n}\n.hljs-section {\n /* prettylights-syntax-markup-heading */\n color: #005cc5;\n font-weight: bold\n}\n.hljs-bullet {\n /* prettylights-syntax-markup-list */\n color: #735c0f\n}\n.hljs-emphasis {\n /* prettylights-syntax-markup-italic */\n color: #24292e;\n font-style: italic\n}\n.hljs-strong {\n /* prettylights-syntax-markup-bold */\n color: #24292e;\n font-weight: bold\n}\n.hljs-addition {\n /* prettylights-syntax-markup-inserted */\n color: #22863a;\n background-color: #f0fff4\n}\n.hljs-deletion {\n /* prettylights-syntax-markup-deleted */\n color: #b31d28;\n background-color: #ffeef0\n}\n.hljs-char.escape_,\n.hljs-link,\n.hljs-params,\n.hljs-property,\n.hljs-punctuation,\n.hljs-tag {\n /* purposely ignored */\n \n}","",{version:3,sources:["webpack://./node_modules/highlight.js/styles/github.css"],names:[],mappings:"AAAA;EACE,cAAc;EACd,gBAAgB;EAChB;AACF;AACA;EACE;AACF;AACA;;;;;;;;;CASC;AACD;EACE,cAAc;EACd;AACF;AACA;;;;;;;EAOE,gCAAgC;EAChC;AACF;AACA;;;;EAIE,+BAA+B;EAC/B;AACF;AACA;;;;;;;;;;EAUE,iCAAiC;EACjC;AACF;AACA;;;EAGE,+BAA+B;EAC/B;AACF;AACA;;EAEE,iCAAiC;EACjC;AACF;AACA;;;EAGE,gCAAgC;EAChC;AACF;AACA;;;;EAIE,mCAAmC;EACnC;AACF;AACA;EACE,gDAAgD;EAChD;AACF;AACA;EACE,uCAAuC;EACvC,cAAc;EACd;AACF;AACA;EACE,oCAAoC;EACpC;AACF;AACA;EACE,sCAAsC;EACtC,cAAc;EACd;AACF;AACA;EACE,oCAAoC;EACpC,cAAc;EACd;AACF;AACA;EACE,wCAAwC;EACxC,cAAc;EACd;AACF;AACA;EACE,uCAAuC;EACvC,cAAc;EACd;AACF;AACA;;;;;;EAME,sBAAsB;;AAExB",sourcesContent:["pre code.hljs {\n display: block;\n overflow-x: auto;\n padding: 1em\n}\ncode.hljs {\n padding: 3px 5px\n}\n/*!\n Theme: GitHub\n Description: Light theme as seen on github.com\n Author: github.com\n Maintainer: @Hirse\n Updated: 2021-05-15\n\n Outdated base version: https://github.com/primer/github-syntax-light\n Current colors taken from GitHub's CSS\n*/\n.hljs {\n color: #24292e;\n background: #ffffff\n}\n.hljs-doctag,\n.hljs-keyword,\n.hljs-meta .hljs-keyword,\n.hljs-template-tag,\n.hljs-template-variable,\n.hljs-type,\n.hljs-variable.language_ {\n /* prettylights-syntax-keyword */\n color: #d73a49\n}\n.hljs-title,\n.hljs-title.class_,\n.hljs-title.class_.inherited__,\n.hljs-title.function_ {\n /* prettylights-syntax-entity */\n color: #6f42c1\n}\n.hljs-attr,\n.hljs-attribute,\n.hljs-literal,\n.hljs-meta,\n.hljs-number,\n.hljs-operator,\n.hljs-variable,\n.hljs-selector-attr,\n.hljs-selector-class,\n.hljs-selector-id {\n /* prettylights-syntax-constant */\n color: #005cc5\n}\n.hljs-regexp,\n.hljs-string,\n.hljs-meta .hljs-string {\n /* prettylights-syntax-string */\n color: #032f62\n}\n.hljs-built_in,\n.hljs-symbol {\n /* prettylights-syntax-variable */\n color: #e36209\n}\n.hljs-comment,\n.hljs-code,\n.hljs-formula {\n /* prettylights-syntax-comment */\n color: #6a737d\n}\n.hljs-name,\n.hljs-quote,\n.hljs-selector-tag,\n.hljs-selector-pseudo {\n /* prettylights-syntax-entity-tag */\n color: #22863a\n}\n.hljs-subst {\n /* prettylights-syntax-storage-modifier-import */\n color: #24292e\n}\n.hljs-section {\n /* prettylights-syntax-markup-heading */\n color: #005cc5;\n font-weight: bold\n}\n.hljs-bullet {\n /* prettylights-syntax-markup-list */\n color: #735c0f\n}\n.hljs-emphasis {\n /* prettylights-syntax-markup-italic */\n color: #24292e;\n font-style: italic\n}\n.hljs-strong {\n /* prettylights-syntax-markup-bold */\n color: #24292e;\n font-weight: bold\n}\n.hljs-addition {\n /* prettylights-syntax-markup-inserted */\n color: #22863a;\n background-color: #f0fff4\n}\n.hljs-deletion {\n /* prettylights-syntax-markup-deleted */\n color: #b31d28;\n background-color: #ffeef0\n}\n.hljs-char.escape_,\n.hljs-link,\n.hljs-params,\n.hljs-property,\n.hljs-punctuation,\n.hljs-tag {\n /* purposely ignored */\n \n}"],sourceRoot:""}]),e.A=r},6314:function(u){"use strict";u.exports=function(u){var e=[];return e.toString=function(){return this.map(function(e){var D="",n=void 0!==e[5];return e[4]&&(D+="@supports (".concat(e[4],") {")),e[2]&&(D+="@media ".concat(e[2]," {")),n&&(D+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),D+=u(e),n&&(D+="}"),e[2]&&(D+="}"),e[4]&&(D+="}"),D}).join("")},e.i=function(u,D,n,t,a){"string"==typeof u&&(u=[[null,u,void 0]]);var r={};if(n)for(var i=0;i0?" ".concat(c[5]):""," {").concat(c[1],"}")),c[5]=a),D&&(c[2]?(c[1]="@media ".concat(c[2]," {").concat(c[1],"}"),c[2]=D):c[2]=D),t&&(c[4]?(c[1]="@supports (".concat(c[4],") {").concat(c[1],"}"),c[4]=t):c[4]="".concat(t)),e.push(c))}},e}},1354:function(u){"use strict";u.exports=function(u){var e=u[1],D=u[3];if(!D)return e;if("function"==typeof btoa){var n=btoa(unescape(encodeURIComponent(JSON.stringify(D)))),t="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(n),a="/*# ".concat(t," */");return[e].concat([a]).join("\n")}return[e].join("\n")}},5072:function(u){"use strict";var e=[];function D(u){for(var D=-1,n=0;n0?" ".concat(D.layer):""," {")),n+=D.css,t&&(n+="}"),D.media&&(n+="}"),D.supports&&(n+="}");var a=D.sourceMap;a&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),e.styleTagTransform(n,u,e.options)}(e,u,D)},remove:function(){!function(u){if(null===u.parentNode)return!1;u.parentNode.removeChild(u)}(e)}}}},1113:function(u){"use strict";u.exports=function(u,e){if(e.styleSheet)e.styleSheet.cssText=u;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(u))}}},2006:function(u){function e(u){var D="function"==typeof Map?new Map:void 0;return e=function(u){if(null===u||!function(u){try{return-1!==Function.toString.call(u).indexOf("[native code]")}catch(e){return"function"==typeof u}}(u))return u;if("function"!=typeof u)throw new TypeError("Super expression must either be null or a function");if(void 0!==D){if(D.has(u))return D.get(u);D.set(u,e)}function e(){return function(u,e,D){if(t())return Reflect.construct.apply(null,arguments);var n=[null];n.push.apply(n,e);var a=new(u.bind.apply(u,n));return D&&i(a,D.prototype),a}(u,arguments,a(this).constructor)}return e.prototype=Object.create(u.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),i(e,u)},e(u)}function D(u,e){return function(u){if(Array.isArray(u))return u}(u)||function(u,e){var D=null==u?null:"undefined"!=typeof Symbol&&u[Symbol.iterator]||u["@@iterator"];if(null!=D){var n,t,a,r,i=[],o=!0,s=!1;try{if(a=(D=D.call(u)).next,0===e){if(Object(D)!==D)return;o=!1}else for(;!(o=(n=a.call(D)).done)&&(i.push(n.value),i.length!==e);o=!0);}catch(u){s=!0,t=u}finally{try{if(!o&&null!=D.return&&(r=D.return(),Object(r)!==r))return}finally{if(s)throw t}}return i}}(u,e)||s(u,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function n(u,e,D){return e=a(e),function(u,e){if(e&&("object"==C(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(u){if(void 0===u)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return u}(u)}(u,t()?Reflect.construct(e,D||[],a(u).constructor):e.apply(u,D))}function t(){try{var u=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(u){}return(t=function(){return!!u})()}function a(u){return a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(u){return u.__proto__||Object.getPrototypeOf(u)},a(u)}function r(u,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");u.prototype=Object.create(e&&e.prototype,{constructor:{value:u,writable:!0,configurable:!0}}),Object.defineProperty(u,"prototype",{writable:!1}),e&&i(u,e)}function i(u,e){return i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(u,e){return u.__proto__=e,u},i(u,e)}function o(u){return function(u){if(Array.isArray(u))return c(u)}(u)||function(u){if("undefined"!=typeof Symbol&&null!=u[Symbol.iterator]||null!=u["@@iterator"])return Array.from(u)}(u)||s(u)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function s(u,e){if(u){if("string"==typeof u)return c(u,e);var D={}.toString.call(u).slice(8,-1);return"Object"===D&&u.constructor&&(D=u.constructor.name),"Map"===D||"Set"===D?Array.from(u):"Arguments"===D||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(D)?c(u,e):void 0}}function c(u,e){(null==e||e>u.length)&&(e=u.length);for(var D=0,n=Array(e);D/g,">").replace(/"/g,""").replace(/'/g,"'")}function b(u){var e=Object.create(null);for(var D in u)e[D]=u[D];for(var n=arguments.length,t=new Array(n>1?n-1:0),a=1;a')}}])}(),f=function(){var u=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e={children:[]};return Object.assign(e,u),e},h=function(u){function e(u){var D;return F(this,e),(D=n(this,e)).options=u,D}return r(e,u),A(e,[{key:"addText",value:function(u){""!==u&&this.add(u)}},{key:"startScope",value:function(u){this.openNode(u)}},{key:"endScope",value:function(){this.closeNode()}},{key:"__addSublanguage",value:function(u,e){var D=u.root;e&&(D.scope="language:".concat(e)),this.add(D)}},{key:"toHTML",value:function(){return new m(this,this.options).value()}},{key:"finalize",value:function(){return this.closeAllNodes(),!0}}])}(function(){function u(){F(this,u),this.rootNode=f(),this.stack=[this.rootNode]}return A(u,[{key:"top",get:function(){return this.stack[this.stack.length-1]}},{key:"root",get:function(){return this.rootNode}},{key:"add",value:function(u){this.top.children.push(u)}},{key:"openNode",value:function(u){var e=f({scope:u});this.add(e),this.stack.push(e)}},{key:"closeNode",value:function(){if(this.stack.length>1)return this.stack.pop()}},{key:"closeAllNodes",value:function(){for(;this.closeNode(););}},{key:"toJSON",value:function(){return JSON.stringify(this.rootNode,null,4)}},{key:"walk",value:function(u){return this.constructor._walk(u,this.rootNode)}}],[{key:"_walk",value:function(u,e){var D=this;return"string"==typeof e?u.addText(e):e.children&&(u.openNode(e),e.children.forEach(function(e){return D._walk(u,e)}),u.closeNode(e)),u}},{key:"_collapse",value:function(e){"string"!=typeof e&&e.children&&(e.children.every(function(u){return"string"==typeof u})?e.children=[e.children.join("")]:e.children.forEach(function(e){u._collapse(e)}))}}])}());function y(u){return u?"string"==typeof u?u:u.source:null}function v(u){return w("(?=",u,")")}function _(u){return w("(?:",u,")*")}function x(u){return w("(?:",u,")?")}function w(){for(var u=arguments.length,e=new Array(u),D=0;D0;){var a=S.exec(D);if(!a){t+=D;break}t+=D.substring(0,a.index),D=D.substring(a.index+a[0].length),"\\"===a[0][0]&&a[1]?t+="\\"+String(Number(a[1])+e):(t+=a[0],"("===a[0]&&n++)}return t}).map(function(u){return"(".concat(u,")")}).join(D)}var M="[a-zA-Z]\\w*",j="[a-zA-Z_]\\w*",R="\\b\\d+(\\.\\d+)?",T="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",I="\\b(0b[01]+)",L={begin:"\\\\[\\s\\S]",relevance:0},z={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[L]},P={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[L]},U=function(u,e){var D=b({scope:"comment",begin:u,end:e,contains:[]},arguments.length>2&&void 0!==arguments[2]?arguments[2]:{});D.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});var n=k("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return D.contains.push({begin:w(/[ ]+/,"(",n,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),D},$=U("//","$"),H=U("/\\*","\\*/"),Z=U("#","$"),K={scope:"number",begin:R,relevance:0},G={scope:"number",begin:T,relevance:0},q={scope:"number",begin:I,relevance:0},W={scope:"regexp",begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[L,{begin:/\[/,end:/\]/,relevance:0,contains:[L]}]},V={scope:"title",begin:M,relevance:0},Q={scope:"title",begin:j,relevance:0},X={begin:"\\.\\s*"+j,relevance:0},J=Object.freeze({__proto__:null,APOS_STRING_MODE:z,BACKSLASH_ESCAPE:L,BINARY_NUMBER_MODE:q,BINARY_NUMBER_RE:I,COMMENT:U,C_BLOCK_COMMENT_MODE:H,C_LINE_COMMENT_MODE:$,C_NUMBER_MODE:G,C_NUMBER_RE:T,END_SAME_AS_BEGIN:function(u){return Object.assign(u,{"on:begin":function(u,e){e.data._beginMatch=u[1]},"on:end":function(u,e){e.data._beginMatch!==u[1]&&e.ignoreMatch()}})},HASH_COMMENT_MODE:Z,IDENT_RE:M,MATCH_NOTHING_RE:/\b\B/,METHOD_GUARD:X,NUMBER_MODE:K,NUMBER_RE:R,PHRASAL_WORDS_MODE:{begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},QUOTE_STRING_MODE:P,REGEXP_MODE:W,RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:function(){var u=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=/^#![ ]*\//;return u.binary&&(u.begin=w(e,/.*\b/,u.binary,/\b.*/)),b({scope:"meta",begin:e,end:/$/,relevance:0,"on:begin":function(u,e){0!==u.index&&e.ignoreMatch()}},u)},TITLE_MODE:V,UNDERSCORE_IDENT_RE:j,UNDERSCORE_TITLE_MODE:Q});function Y(u,e){"."===u.input[u.index-1]&&e.ignoreMatch()}function uu(u,e){void 0!==u.className&&(u.scope=u.className,delete u.className)}function eu(u,e){e&&u.beginKeywords&&(u.begin="\\b("+u.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",u.__beforeBegin=Y,u.keywords=u.keywords||u.beginKeywords,delete u.beginKeywords,void 0===u.relevance&&(u.relevance=0))}function Du(u,e){Array.isArray(u.illegal)&&(u.illegal=k.apply(void 0,o(u.illegal)))}function nu(u,e){if(u.match){if(u.begin||u.end)throw new Error("begin & end are not supported with match");u.begin=u.match,delete u.match}}function tu(u,e){void 0===u.relevance&&(u.relevance=1)}var au=function(u,e){if(u.beforeMatch){if(u.starts)throw new Error("beforeMatch cannot be used with starts");var D=Object.assign({},u);Object.keys(u).forEach(function(e){delete u[e]}),u.keywords=D.keywords,u.begin=w(D.beforeMatch,v(D.begin)),u.starts={relevance:0,contains:[Object.assign(D,{endsParent:!0})]},u.relevance=0,delete D.beforeMatch}},ru=["of","and","for","in","not","or","if","then","parent","list","value"];function iu(u,e){var D=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"keyword",n=Object.create(null);return"string"==typeof u?t(D,u.split(" ")):Array.isArray(u)?t(D,u):Object.keys(u).forEach(function(D){Object.assign(n,iu(u[D],e,D))}),n;function t(u,D){e&&(D=D.map(function(u){return u.toLowerCase()})),D.forEach(function(e){var D=e.split("|");n[D[0]]=[u,ou(D[0],D[1])]})}}function ou(u,e){return e?Number(e):function(u){return ru.includes(u.toLowerCase())}(u)?0:1}var su={},cu=function(u){console.error(u)},Fu=function(u){for(var e,D=arguments.length,n=new Array(D>1?D-1:0),t=1;t0&&void 0!==u}),n=this.matchIndexes[D];return e.splice(0,D),Object.assign(e,n)}}])}(),t=function(){return A(function u(){F(this,u),this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0},[{key:"getMatcher",value:function(u){if(this.multiRegexes[u])return this.multiRegexes[u];var e=new n;return this.rules.slice(u).forEach(function(u){var n=D(u,2),t=n[0],a=n[1];return e.addRule(t,a)}),e.compile(),this.multiRegexes[u]=e,e}},{key:"resumingScanAtSamePosition",value:function(){return 0!==this.regexIndex}},{key:"considerAll",value:function(){this.regexIndex=0}},{key:"addRule",value:function(u,e){this.rules.push([u,e]),"begin"===e.type&&this.count++}},{key:"exec",value:function(u){var e=this.getMatcher(this.regexIndex);e.lastIndex=this.lastIndex;var D=e.exec(u);if(this.resumingScanAtSamePosition())if(D&&D.index===this.lastIndex);else{var n=this.getMatcher(0);n.lastIndex=this.lastIndex+1,D=n.exec(u)}return D&&(this.regexIndex+=D.position+1,this.regexIndex===this.count&&this.considerAll()),D}}])}();if(u.compilerExtensions||(u.compilerExtensions=[]),u.contains&&u.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return u.classNameAliases=b(u.classNameAliases||{}),function D(n,a){var r,i=n;if(n.isCompiled)return i;[uu,nu,Cu,au].forEach(function(u){return u(n,a)}),u.compilerExtensions.forEach(function(u){return u(n,a)}),n.__beforeBegin=null,[eu,Du,tu].forEach(function(u){return u(n,a)}),n.isCompiled=!0;var s=null;return"object"===C(n.keywords)&&n.keywords.$pattern&&(n.keywords=Object.assign({},n.keywords),s=n.keywords.$pattern,delete n.keywords.$pattern),s=s||/\w+/,n.keywords&&(n.keywords=iu(n.keywords,u.case_insensitive)),i.keywordPatternRe=e(s,!0),a&&(n.begin||(n.begin=/\B|\b/),i.beginRe=e(i.begin),n.end||n.endsWithParent||(n.end=/\B|\b/),n.end&&(i.endRe=e(i.end)),i.terminatorEnd=y(i.end)||"",n.endsWithParent&&a.terminatorEnd&&(i.terminatorEnd+=(n.end?"|":"")+a.terminatorEnd)),n.illegal&&(i.illegalRe=e(n.illegal)),n.contains||(n.contains=[]),n.contains=(r=[]).concat.apply(r,o(n.contains.map(function(u){return function(u){return u.variants&&!u.cachedVariants&&(u.cachedVariants=u.variants.map(function(e){return b(u,{variants:null},e)})),u.cachedVariants?u.cachedVariants:gu(u)?b(u,{starts:u.starts?b(u.starts):null}):Object.isFrozen(u)?b(u):u}("self"===u?n:u)}))),n.contains.forEach(function(u){D(u,i)}),n.starts&&D(n.starts,a),i.matcher=function(u){var e=new t;return u.contains.forEach(function(u){return e.addRule(u.begin,{rule:u,type:"begin"})}),u.terminatorEnd&&e.addRule(u.terminatorEnd,{type:"end"}),u.illegal&&e.addRule(u.illegal,{type:"illegal"}),e}(i),i}(u)}function gu(u){return!!u&&(u.endsWithParent||gu(u.starts))}var Bu=function(u){function e(u,D){var t;return F(this,e),(t=n(this,e,[u])).name="HTMLInjectionError",t.html=D,t}return r(e,u),A(e)}(e(Error)),bu=B,pu=b,mu=Symbol("nomatch"),fu=function(u){var e=Object.create(null),n=Object.create(null),t=[],a=!0,r="Could not find the language '{}', did you forget to load/include a language module?",i={disableAutodetect:!0,name:"Plain text",contains:[]},o={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:h};function s(u){return o.noHighlightRe.test(u)}function c(u,e,D){var n="",t="";"object"===C(e)?(n=u,D=e.ignoreIllegals,t=e.language):(lu("10.7.0","highlight(lang, code, ...args) has been deprecated."),lu("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),t=u,n=e),void 0===D&&(D=!0);var a={code:n,language:t};f("before:highlight",a);var r=a.result?a.result:F(a.language,a.code,D);return r.code=a.code,f("after:highlight",r),r}function F(u,n,t,i){var s=Object.create(null);function c(u,e){return u.keywords[e]}function A(){if(w.keywords){var u=0;w.keywordPatternRe.lastIndex=0;for(var e=w.keywordPatternRe.exec(S),n="";e;){n+=S.substring(u,e.index);var t=v.case_insensitive?e[0].toLowerCase():e[0],a=c(w,t);if(a){var r=D(a,2),i=r[0],o=r[1];if(N.addText(n),n="",s[t]=(s[t]||0)+1,s[t]<=7&&(O+=o),i.startsWith("_"))n+=e[0];else{var F=v.classNameAliases[i]||i;C(e[0],F)}}else n+=e[0];u=w.keywordPatternRe.lastIndex,e=w.keywordPatternRe.exec(S)}n+=S.substring(u),N.addText(n)}else N.addText(S)}function E(){null!=w.subLanguage?function(){if(""!==S){var u=null;if("string"==typeof w.subLanguage){if(!e[w.subLanguage])return void N.addText(S);u=F(w.subLanguage,S,!0,k[w.subLanguage]),k[w.subLanguage]=u._top}else u=l(S,w.subLanguage.length?w.subLanguage:null);w.relevance>0&&(O+=u.relevance),N.__addSublanguage(u._emitter,u.language)}}():A(),S=""}function C(u,e){""!==u&&(N.startScope(e),N.addText(u),N.endScope())}function d(u,e){for(var D=1,n=e.length-1;D<=n;)if(u._emit[D]){var t=v.classNameAliases[u[D]]||u[D],a=e[D];t?C(a,t):(S=a,A(),S=""),D++}else D++}function B(u,e){return u.scope&&"string"==typeof u.scope&&N.openNode(v.classNameAliases[u.scope]||u.scope),u.beginScope&&(u.beginScope._wrap?(C(S,v.classNameAliases[u.beginScope._wrap]||u.beginScope._wrap),S=""):u.beginScope._multi&&(d(u.beginScope,e),S="")),w=Object.create(u,{parent:{value:w}})}function p(u,e,D){var n=function(u,e){var D=u&&u.exec(e);return D&&0===D.index}(u.endRe,D);if(n){if(u["on:end"]){var t=new g(u);u["on:end"](e,t),t.isMatchIgnored&&(n=!1)}if(n){for(;u.endsParent&&u.parent;)u=u.parent;return u}}if(u.endsWithParent)return p(u.parent,e,D)}function m(u){return 0===w.matcher.regexIndex?(S+=u[0],1):(R=!0,0)}function f(u){var e=u[0],D=n.substring(u.index),t=p(w,u,D);if(!t)return mu;var a=w;w.endScope&&w.endScope._wrap?(E(),C(e,w.endScope._wrap)):w.endScope&&w.endScope._multi?(E(),d(w.endScope,u)):a.skip?S+=e:(a.returnEnd||a.excludeEnd||(S+=e),E(),a.excludeEnd&&(S=e));do{w.scope&&N.closeNode(),w.skip||w.subLanguage||(O+=w.relevance),w=w.parent}while(w!==t.parent);return t.starts&&B(t.starts,u),a.returnEnd?0:e.length}var h={};function y(e,D){var r=D&&D[0];if(S+=e,null==r)return E(),0;if("begin"===h.type&&"end"===D.type&&h.index===D.index&&""===r){if(S+=n.slice(D.index,D.index+1),!a){var i=new Error("0 width match regex (".concat(u,")"));throw i.languageName=u,i.badRule=h.rule,i}return 1}if(h=D,"begin"===D.type)return function(u){for(var e=u[0],D=u.rule,n=new g(D),t=0,a=[D.__beforeBegin,D["on:begin"]];t")+'"');throw o.mode=w,o}if("end"===D.type){var s=f(D);if(s!==mu)return s}if("illegal"===D.type&&""===r)return S+="\n",1;if(j>1e5&&j>3*D.index)throw new Error("potential infinite loop, way more iterations than matches");return S+=r,r.length}var v=b(u);if(!v)throw cu(r.replace("{}",u)),new Error('Unknown language: "'+u+'"');var _=du(v),x="",w=i||_,k={},N=new o.__emitter(o);!function(){for(var u=[],e=w;e!==v;e=e.parent)e.scope&&u.unshift(e.scope);u.forEach(function(u){return N.openNode(u)})}();var S="",O=0,M=0,j=0,R=!1;try{if(v.__emitTokens)v.__emitTokens(n,N);else{for(w.matcher.considerAll();;){j++,R?R=!1:w.matcher.considerAll(),w.matcher.lastIndex=M;var T=w.matcher.exec(n);if(!T)break;var I=y(n.substring(M,T.index),T);M=T.index+I}y(n.substring(M))}return N.finalize(),x=N.toHTML(),{language:u,value:x,relevance:O,illegal:!1,_emitter:N,_top:w}}catch(e){if(e.message&&e.message.includes("Illegal"))return{language:u,value:bu(n),illegal:!0,relevance:0,_illegalBy:{message:e.message,index:M,context:n.slice(M-100,M+100),mode:e.mode,resultSoFar:x},_emitter:N};if(a)return{language:u,value:bu(n),illegal:!1,relevance:0,errorRaised:e,_emitter:N,_top:w};throw e}}function l(u,n){n=n||o.languages||Object.keys(e);var t=function(u){var e={value:bu(u),illegal:!1,relevance:0,_top:i,_emitter:new o.__emitter(o)};return e._emitter.addText(u),e}(u),a=n.filter(b).filter(m).map(function(e){return F(e,u,!1)});a.unshift(t);var r=D(a.sort(function(u,e){if(u.relevance!==e.relevance)return e.relevance-u.relevance;if(u.language&&e.language){if(b(u.language).supersetOf===e.language)return 1;if(b(e.language).supersetOf===u.language)return-1}return 0}),2),s=r[0],c=r[1],l=s;return l.secondBest=c,l}function A(u){var e=function(u){var e=u.className+" ";e+=u.parentNode?u.parentNode.className:"";var D=o.languageDetectRe.exec(e);if(D){var n=b(D[1]);return n||(Fu(r.replace("{}",D[1])),Fu("Falling back to no-highlight mode for this block.",u)),n?D[1]:"no-highlight"}return e.split(/\s+/).find(function(u){return s(u)||b(u)})}(u);if(!s(e))if(f("before:highlightElement",{el:u,language:e}),u.dataset.highlighted)console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",u);else{if(u.children.length>0&&(o.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(u)),o.throwUnescapedHTML))throw new Bu("One of your code blocks includes unescaped HTML.",u.innerHTML);var D=u.textContent,t=e?c(D,{language:e,ignoreIllegals:!0}):l(D);u.innerHTML=t.value,u.dataset.highlighted="yes",function(u,e,D){var t=e&&n[e]||D;u.classList.add("hljs"),u.classList.add("language-".concat(t))}(u,e,t.language),u.result={language:t.language,re:t.relevance,relevance:t.relevance},t.secondBest&&(u.secondBest={language:t.secondBest.language,relevance:t.secondBest.relevance}),f("after:highlightElement",{el:u,result:t,text:D})}}var E=!1;function B(){if("loading"===document.readyState)return E||window.addEventListener("DOMContentLoaded",function(){B()},!1),void(E=!0);document.querySelectorAll(o.cssSelector).forEach(A)}function b(u){return u=(u||"").toLowerCase(),e[u]||e[n[u]]}function p(u,e){var D=e.languageName;"string"==typeof u&&(u=[u]),u.forEach(function(u){n[u.toLowerCase()]=D})}function m(u){var e=b(u);return e&&!e.disableAutodetect}function f(u,e){var D=u;t.forEach(function(u){u[D]&&u[D](e)})}for(var y in Object.assign(u,{highlight:c,highlightAuto:l,highlightAll:B,highlightElement:A,highlightBlock:function(u){return lu("10.7.0","highlightBlock will be removed entirely in v12.0"),lu("10.7.0","Please use highlightElement now."),A(u)},configure:function(u){o=pu(o,u)},initHighlighting:function(){B(),lu("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")},initHighlightingOnLoad:function(){B(),lu("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")},registerLanguage:function(D,n){var t=null;try{t=n(u)}catch(u){if(cu("Language definition for '{}' could not be registered.".replace("{}",D)),!a)throw u;cu(u),t=i}t.name||(t.name=D),e[D]=t,t.rawDefinition=n.bind(null,u),t.aliases&&p(t.aliases,{languageName:D})},unregisterLanguage:function(u){delete e[u];for(var D=0,t=Object.keys(n);D {\n return {\n IMPORTANT: {\n scope: 'meta',\n begin: '!important'\n },\n BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE,\n HEXCOLOR: {\n scope: 'number',\n begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\\b/\n },\n FUNCTION_DISPATCH: {\n className: \"built_in\",\n begin: /[\\w-]+(?=\\()/\n },\n ATTRIBUTE_SELECTOR_MODE: {\n scope: 'selector-attr',\n begin: /\\[/,\n end: /\\]/,\n illegal: '$',\n contains: [\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE\n ]\n },\n CSS_NUMBER_MODE: {\n scope: 'number',\n begin: hljs.NUMBER_RE + '(' +\n '%|em|ex|ch|rem' +\n '|vw|vh|vmin|vmax' +\n '|cm|mm|in|pt|pc|px' +\n '|deg|grad|rad|turn' +\n '|s|ms' +\n '|Hz|kHz' +\n '|dpi|dpcm|dppx' +\n ')?',\n relevance: 0\n },\n CSS_VARIABLE: {\n className: \"attr\",\n begin: /--[A-Za-z_][A-Za-z0-9_-]*/\n }\n };\n};\n\nconst HTML_TAGS = [\n 'a',\n 'abbr',\n 'address',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'blockquote',\n 'body',\n 'button',\n 'canvas',\n 'caption',\n 'cite',\n 'code',\n 'dd',\n 'del',\n 'details',\n 'dfn',\n 'div',\n 'dl',\n 'dt',\n 'em',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'header',\n 'hgroup',\n 'html',\n 'i',\n 'iframe',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'label',\n 'legend',\n 'li',\n 'main',\n 'mark',\n 'menu',\n 'nav',\n 'object',\n 'ol',\n 'optgroup',\n 'option',\n 'p',\n 'picture',\n 'q',\n 'quote',\n 'samp',\n 'section',\n 'select',\n 'source',\n 'span',\n 'strong',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'tr',\n 'ul',\n 'var',\n 'video'\n];\n\nconst SVG_TAGS = [\n 'defs',\n 'g',\n 'marker',\n 'mask',\n 'pattern',\n 'svg',\n 'switch',\n 'symbol',\n 'feBlend',\n 'feColorMatrix',\n 'feComponentTransfer',\n 'feComposite',\n 'feConvolveMatrix',\n 'feDiffuseLighting',\n 'feDisplacementMap',\n 'feFlood',\n 'feGaussianBlur',\n 'feImage',\n 'feMerge',\n 'feMorphology',\n 'feOffset',\n 'feSpecularLighting',\n 'feTile',\n 'feTurbulence',\n 'linearGradient',\n 'radialGradient',\n 'stop',\n 'circle',\n 'ellipse',\n 'image',\n 'line',\n 'path',\n 'polygon',\n 'polyline',\n 'rect',\n 'text',\n 'use',\n 'textPath',\n 'tspan',\n 'foreignObject',\n 'clipPath'\n];\n\nconst TAGS = [\n ...HTML_TAGS,\n ...SVG_TAGS,\n];\n\n// Sorting, then reversing makes sure longer attributes/elements like\n// `font-weight` are matched fully instead of getting false positives on say `font`\n\nconst MEDIA_FEATURES = [\n 'any-hover',\n 'any-pointer',\n 'aspect-ratio',\n 'color',\n 'color-gamut',\n 'color-index',\n 'device-aspect-ratio',\n 'device-height',\n 'device-width',\n 'display-mode',\n 'forced-colors',\n 'grid',\n 'height',\n 'hover',\n 'inverted-colors',\n 'monochrome',\n 'orientation',\n 'overflow-block',\n 'overflow-inline',\n 'pointer',\n 'prefers-color-scheme',\n 'prefers-contrast',\n 'prefers-reduced-motion',\n 'prefers-reduced-transparency',\n 'resolution',\n 'scan',\n 'scripting',\n 'update',\n 'width',\n // TODO: find a better solution?\n 'min-width',\n 'max-width',\n 'min-height',\n 'max-height'\n].sort().reverse();\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes\nconst PSEUDO_CLASSES = [\n 'active',\n 'any-link',\n 'blank',\n 'checked',\n 'current',\n 'default',\n 'defined',\n 'dir', // dir()\n 'disabled',\n 'drop',\n 'empty',\n 'enabled',\n 'first',\n 'first-child',\n 'first-of-type',\n 'fullscreen',\n 'future',\n 'focus',\n 'focus-visible',\n 'focus-within',\n 'has', // has()\n 'host', // host or host()\n 'host-context', // host-context()\n 'hover',\n 'indeterminate',\n 'in-range',\n 'invalid',\n 'is', // is()\n 'lang', // lang()\n 'last-child',\n 'last-of-type',\n 'left',\n 'link',\n 'local-link',\n 'not', // not()\n 'nth-child', // nth-child()\n 'nth-col', // nth-col()\n 'nth-last-child', // nth-last-child()\n 'nth-last-col', // nth-last-col()\n 'nth-last-of-type', //nth-last-of-type()\n 'nth-of-type', //nth-of-type()\n 'only-child',\n 'only-of-type',\n 'optional',\n 'out-of-range',\n 'past',\n 'placeholder-shown',\n 'read-only',\n 'read-write',\n 'required',\n 'right',\n 'root',\n 'scope',\n 'target',\n 'target-within',\n 'user-invalid',\n 'valid',\n 'visited',\n 'where' // where()\n].sort().reverse();\n\n// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements\nconst PSEUDO_ELEMENTS = [\n 'after',\n 'backdrop',\n 'before',\n 'cue',\n 'cue-region',\n 'first-letter',\n 'first-line',\n 'grammar-error',\n 'marker',\n 'part',\n 'placeholder',\n 'selection',\n 'slotted',\n 'spelling-error'\n].sort().reverse();\n\nconst ATTRIBUTES = [\n 'accent-color',\n 'align-content',\n 'align-items',\n 'align-self',\n 'alignment-baseline',\n 'all',\n 'anchor-name',\n 'animation',\n 'animation-composition',\n 'animation-delay',\n 'animation-direction',\n 'animation-duration',\n 'animation-fill-mode',\n 'animation-iteration-count',\n 'animation-name',\n 'animation-play-state',\n 'animation-range',\n 'animation-range-end',\n 'animation-range-start',\n 'animation-timeline',\n 'animation-timing-function',\n 'appearance',\n 'aspect-ratio',\n 'backdrop-filter',\n 'backface-visibility',\n 'background',\n 'background-attachment',\n 'background-blend-mode',\n 'background-clip',\n 'background-color',\n 'background-image',\n 'background-origin',\n 'background-position',\n 'background-position-x',\n 'background-position-y',\n 'background-repeat',\n 'background-size',\n 'baseline-shift',\n 'block-size',\n 'border',\n 'border-block',\n 'border-block-color',\n 'border-block-end',\n 'border-block-end-color',\n 'border-block-end-style',\n 'border-block-end-width',\n 'border-block-start',\n 'border-block-start-color',\n 'border-block-start-style',\n 'border-block-start-width',\n 'border-block-style',\n 'border-block-width',\n 'border-bottom',\n 'border-bottom-color',\n 'border-bottom-left-radius',\n 'border-bottom-right-radius',\n 'border-bottom-style',\n 'border-bottom-width',\n 'border-collapse',\n 'border-color',\n 'border-end-end-radius',\n 'border-end-start-radius',\n 'border-image',\n 'border-image-outset',\n 'border-image-repeat',\n 'border-image-slice',\n 'border-image-source',\n 'border-image-width',\n 'border-inline',\n 'border-inline-color',\n 'border-inline-end',\n 'border-inline-end-color',\n 'border-inline-end-style',\n 'border-inline-end-width',\n 'border-inline-start',\n 'border-inline-start-color',\n 'border-inline-start-style',\n 'border-inline-start-width',\n 'border-inline-style',\n 'border-inline-width',\n 'border-left',\n 'border-left-color',\n 'border-left-style',\n 'border-left-width',\n 'border-radius',\n 'border-right',\n 'border-right-color',\n 'border-right-style',\n 'border-right-width',\n 'border-spacing',\n 'border-start-end-radius',\n 'border-start-start-radius',\n 'border-style',\n 'border-top',\n 'border-top-color',\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-top-style',\n 'border-top-width',\n 'border-width',\n 'bottom',\n 'box-align',\n 'box-decoration-break',\n 'box-direction',\n 'box-flex',\n 'box-flex-group',\n 'box-lines',\n 'box-ordinal-group',\n 'box-orient',\n 'box-pack',\n 'box-shadow',\n 'box-sizing',\n 'break-after',\n 'break-before',\n 'break-inside',\n 'caption-side',\n 'caret-color',\n 'clear',\n 'clip',\n 'clip-path',\n 'clip-rule',\n 'color',\n 'color-interpolation',\n 'color-interpolation-filters',\n 'color-profile',\n 'color-rendering',\n 'color-scheme',\n 'column-count',\n 'column-fill',\n 'column-gap',\n 'column-rule',\n 'column-rule-color',\n 'column-rule-style',\n 'column-rule-width',\n 'column-span',\n 'column-width',\n 'columns',\n 'contain',\n 'contain-intrinsic-block-size',\n 'contain-intrinsic-height',\n 'contain-intrinsic-inline-size',\n 'contain-intrinsic-size',\n 'contain-intrinsic-width',\n 'container',\n 'container-name',\n 'container-type',\n 'content',\n 'content-visibility',\n 'counter-increment',\n 'counter-reset',\n 'counter-set',\n 'cue',\n 'cue-after',\n 'cue-before',\n 'cursor',\n 'cx',\n 'cy',\n 'direction',\n 'display',\n 'dominant-baseline',\n 'empty-cells',\n 'enable-background',\n 'field-sizing',\n 'fill',\n 'fill-opacity',\n 'fill-rule',\n 'filter',\n 'flex',\n 'flex-basis',\n 'flex-direction',\n 'flex-flow',\n 'flex-grow',\n 'flex-shrink',\n 'flex-wrap',\n 'float',\n 'flood-color',\n 'flood-opacity',\n 'flow',\n 'font',\n 'font-display',\n 'font-family',\n 'font-feature-settings',\n 'font-kerning',\n 'font-language-override',\n 'font-optical-sizing',\n 'font-palette',\n 'font-size',\n 'font-size-adjust',\n 'font-smooth',\n 'font-smoothing',\n 'font-stretch',\n 'font-style',\n 'font-synthesis',\n 'font-synthesis-position',\n 'font-synthesis-small-caps',\n 'font-synthesis-style',\n 'font-synthesis-weight',\n 'font-variant',\n 'font-variant-alternates',\n 'font-variant-caps',\n 'font-variant-east-asian',\n 'font-variant-emoji',\n 'font-variant-ligatures',\n 'font-variant-numeric',\n 'font-variant-position',\n 'font-variation-settings',\n 'font-weight',\n 'forced-color-adjust',\n 'gap',\n 'glyph-orientation-horizontal',\n 'glyph-orientation-vertical',\n 'grid',\n 'grid-area',\n 'grid-auto-columns',\n 'grid-auto-flow',\n 'grid-auto-rows',\n 'grid-column',\n 'grid-column-end',\n 'grid-column-start',\n 'grid-gap',\n 'grid-row',\n 'grid-row-end',\n 'grid-row-start',\n 'grid-template',\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n 'hanging-punctuation',\n 'height',\n 'hyphenate-character',\n 'hyphenate-limit-chars',\n 'hyphens',\n 'icon',\n 'image-orientation',\n 'image-rendering',\n 'image-resolution',\n 'ime-mode',\n 'initial-letter',\n 'initial-letter-align',\n 'inline-size',\n 'inset',\n 'inset-area',\n 'inset-block',\n 'inset-block-end',\n 'inset-block-start',\n 'inset-inline',\n 'inset-inline-end',\n 'inset-inline-start',\n 'isolation',\n 'justify-content',\n 'justify-items',\n 'justify-self',\n 'kerning',\n 'left',\n 'letter-spacing',\n 'lighting-color',\n 'line-break',\n 'line-height',\n 'line-height-step',\n 'list-style',\n 'list-style-image',\n 'list-style-position',\n 'list-style-type',\n 'margin',\n 'margin-block',\n 'margin-block-end',\n 'margin-block-start',\n 'margin-bottom',\n 'margin-inline',\n 'margin-inline-end',\n 'margin-inline-start',\n 'margin-left',\n 'margin-right',\n 'margin-top',\n 'margin-trim',\n 'marker',\n 'marker-end',\n 'marker-mid',\n 'marker-start',\n 'marks',\n 'mask',\n 'mask-border',\n 'mask-border-mode',\n 'mask-border-outset',\n 'mask-border-repeat',\n 'mask-border-slice',\n 'mask-border-source',\n 'mask-border-width',\n 'mask-clip',\n 'mask-composite',\n 'mask-image',\n 'mask-mode',\n 'mask-origin',\n 'mask-position',\n 'mask-repeat',\n 'mask-size',\n 'mask-type',\n 'masonry-auto-flow',\n 'math-depth',\n 'math-shift',\n 'math-style',\n 'max-block-size',\n 'max-height',\n 'max-inline-size',\n 'max-width',\n 'min-block-size',\n 'min-height',\n 'min-inline-size',\n 'min-width',\n 'mix-blend-mode',\n 'nav-down',\n 'nav-index',\n 'nav-left',\n 'nav-right',\n 'nav-up',\n 'none',\n 'normal',\n 'object-fit',\n 'object-position',\n 'offset',\n 'offset-anchor',\n 'offset-distance',\n 'offset-path',\n 'offset-position',\n 'offset-rotate',\n 'opacity',\n 'order',\n 'orphans',\n 'outline',\n 'outline-color',\n 'outline-offset',\n 'outline-style',\n 'outline-width',\n 'overflow',\n 'overflow-anchor',\n 'overflow-block',\n 'overflow-clip-margin',\n 'overflow-inline',\n 'overflow-wrap',\n 'overflow-x',\n 'overflow-y',\n 'overlay',\n 'overscroll-behavior',\n 'overscroll-behavior-block',\n 'overscroll-behavior-inline',\n 'overscroll-behavior-x',\n 'overscroll-behavior-y',\n 'padding',\n 'padding-block',\n 'padding-block-end',\n 'padding-block-start',\n 'padding-bottom',\n 'padding-inline',\n 'padding-inline-end',\n 'padding-inline-start',\n 'padding-left',\n 'padding-right',\n 'padding-top',\n 'page',\n 'page-break-after',\n 'page-break-before',\n 'page-break-inside',\n 'paint-order',\n 'pause',\n 'pause-after',\n 'pause-before',\n 'perspective',\n 'perspective-origin',\n 'place-content',\n 'place-items',\n 'place-self',\n 'pointer-events',\n 'position',\n 'position-anchor',\n 'position-visibility',\n 'print-color-adjust',\n 'quotes',\n 'r',\n 'resize',\n 'rest',\n 'rest-after',\n 'rest-before',\n 'right',\n 'rotate',\n 'row-gap',\n 'ruby-align',\n 'ruby-position',\n 'scale',\n 'scroll-behavior',\n 'scroll-margin',\n 'scroll-margin-block',\n 'scroll-margin-block-end',\n 'scroll-margin-block-start',\n 'scroll-margin-bottom',\n 'scroll-margin-inline',\n 'scroll-margin-inline-end',\n 'scroll-margin-inline-start',\n 'scroll-margin-left',\n 'scroll-margin-right',\n 'scroll-margin-top',\n 'scroll-padding',\n 'scroll-padding-block',\n 'scroll-padding-block-end',\n 'scroll-padding-block-start',\n 'scroll-padding-bottom',\n 'scroll-padding-inline',\n 'scroll-padding-inline-end',\n 'scroll-padding-inline-start',\n 'scroll-padding-left',\n 'scroll-padding-right',\n 'scroll-padding-top',\n 'scroll-snap-align',\n 'scroll-snap-stop',\n 'scroll-snap-type',\n 'scroll-timeline',\n 'scroll-timeline-axis',\n 'scroll-timeline-name',\n 'scrollbar-color',\n 'scrollbar-gutter',\n 'scrollbar-width',\n 'shape-image-threshold',\n 'shape-margin',\n 'shape-outside',\n 'shape-rendering',\n 'speak',\n 'speak-as',\n 'src', // @font-face\n 'stop-color',\n 'stop-opacity',\n 'stroke',\n 'stroke-dasharray',\n 'stroke-dashoffset',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke-width',\n 'tab-size',\n 'table-layout',\n 'text-align',\n 'text-align-all',\n 'text-align-last',\n 'text-anchor',\n 'text-combine-upright',\n 'text-decoration',\n 'text-decoration-color',\n 'text-decoration-line',\n 'text-decoration-skip',\n 'text-decoration-skip-ink',\n 'text-decoration-style',\n 'text-decoration-thickness',\n 'text-emphasis',\n 'text-emphasis-color',\n 'text-emphasis-position',\n 'text-emphasis-style',\n 'text-indent',\n 'text-justify',\n 'text-orientation',\n 'text-overflow',\n 'text-rendering',\n 'text-shadow',\n 'text-size-adjust',\n 'text-transform',\n 'text-underline-offset',\n 'text-underline-position',\n 'text-wrap',\n 'text-wrap-mode',\n 'text-wrap-style',\n 'timeline-scope',\n 'top',\n 'touch-action',\n 'transform',\n 'transform-box',\n 'transform-origin',\n 'transform-style',\n 'transition',\n 'transition-behavior',\n 'transition-delay',\n 'transition-duration',\n 'transition-property',\n 'transition-timing-function',\n 'translate',\n 'unicode-bidi',\n 'user-modify',\n 'user-select',\n 'vector-effect',\n 'vertical-align',\n 'view-timeline',\n 'view-timeline-axis',\n 'view-timeline-inset',\n 'view-timeline-name',\n 'view-transition-name',\n 'visibility',\n 'voice-balance',\n 'voice-duration',\n 'voice-family',\n 'voice-pitch',\n 'voice-range',\n 'voice-rate',\n 'voice-stress',\n 'voice-volume',\n 'white-space',\n 'white-space-collapse',\n 'widows',\n 'width',\n 'will-change',\n 'word-break',\n 'word-spacing',\n 'word-wrap',\n 'writing-mode',\n 'x',\n 'y',\n 'z-index',\n 'zoom'\n].sort().reverse();\n\n/*\nLanguage: CSS\nCategory: common, css, web\nWebsite: https://developer.mozilla.org/en-US/docs/Web/CSS\n*/\n\n\n/** @type LanguageFn */\nfunction css(hljs) {\n const regex = hljs.regex;\n const modes = MODES(hljs);\n const VENDOR_PREFIX = { begin: /-(webkit|moz|ms|o)-(?=[a-z])/ };\n const AT_MODIFIERS = \"and or not only\";\n const AT_PROPERTY_RE = /@-?\\w[\\w]*(-\\w+)*/; // @-webkit-keyframes\n const IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*';\n const STRINGS = [\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE\n ];\n\n return {\n name: 'CSS',\n case_insensitive: true,\n illegal: /[=|'\\$]/,\n keywords: { keyframePosition: \"from to\" },\n classNameAliases: {\n // for visual continuity with `tag {}` and because we\n // don't have a great class for this?\n keyframePosition: \"selector-tag\" },\n contains: [\n modes.BLOCK_COMMENT,\n VENDOR_PREFIX,\n // to recognize keyframe 40% etc which are outside the scope of our\n // attribute value mode\n modes.CSS_NUMBER_MODE,\n {\n className: 'selector-id',\n begin: /#[A-Za-z0-9_-]+/,\n relevance: 0\n },\n {\n className: 'selector-class',\n begin: '\\\\.' + IDENT_RE,\n relevance: 0\n },\n modes.ATTRIBUTE_SELECTOR_MODE,\n {\n className: 'selector-pseudo',\n variants: [\n { begin: ':(' + PSEUDO_CLASSES.join('|') + ')' },\n { begin: ':(:)?(' + PSEUDO_ELEMENTS.join('|') + ')' }\n ]\n },\n // we may actually need this (12/2020)\n // { // pseudo-selector params\n // begin: /\\(/,\n // end: /\\)/,\n // contains: [ hljs.CSS_NUMBER_MODE ]\n // },\n modes.CSS_VARIABLE,\n {\n className: 'attribute',\n begin: '\\\\b(' + ATTRIBUTES.join('|') + ')\\\\b'\n },\n // attribute values\n {\n begin: /:/,\n end: /[;}{]/,\n contains: [\n modes.BLOCK_COMMENT,\n modes.HEXCOLOR,\n modes.IMPORTANT,\n modes.CSS_NUMBER_MODE,\n ...STRINGS,\n // needed to highlight these as strings and to avoid issues with\n // illegal characters that might be inside urls that would tigger the\n // languages illegal stack\n {\n begin: /(url|data-uri)\\(/,\n end: /\\)/,\n relevance: 0, // from keywords\n keywords: { built_in: \"url data-uri\" },\n contains: [\n ...STRINGS,\n {\n className: \"string\",\n // any character other than `)` as in `url()` will be the start\n // of a string, which ends with `)` (from the parent mode)\n begin: /[^)]/,\n endsWithParent: true,\n excludeEnd: true\n }\n ]\n },\n modes.FUNCTION_DISPATCH\n ]\n },\n {\n begin: regex.lookahead(/@/),\n end: '[{;]',\n relevance: 0,\n illegal: /:/, // break on Less variables @var: ...\n contains: [\n {\n className: 'keyword',\n begin: AT_PROPERTY_RE\n },\n {\n begin: /\\s/,\n endsWithParent: true,\n excludeEnd: true,\n relevance: 0,\n keywords: {\n $pattern: /[a-z-]+/,\n keyword: AT_MODIFIERS,\n attribute: MEDIA_FEATURES.join(\" \")\n },\n contains: [\n {\n begin: /[a-z-]+(?=:)/,\n className: \"attribute\"\n },\n ...STRINGS,\n modes.CSS_NUMBER_MODE\n ]\n }\n ]\n },\n {\n className: 'selector-tag',\n begin: '\\\\b(' + TAGS.join('|') + ')\\\\b'\n }\n ]\n };\n}\n\nexport { css as default };\n","/**\n * @param {string} value\n * @returns {RegExp}\n * */\nfunction escape(value) {\n return new RegExp(value.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'), 'm');\n}\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction source(re) {\n if (!re) return null;\n if (typeof re === \"string\") return re;\n\n return re.source;\n}\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction lookahead(re) {\n return concat('(?=', re, ')');\n}\n\n/**\n * @param {...(RegExp | string) } args\n * @returns {string}\n */\nfunction concat(...args) {\n const joined = args.map((x) => source(x)).join(\"\");\n return joined;\n}\n\n/**\n * @param { Array } args\n * @returns {object}\n */\nfunction stripOptionsFromArgs(args) {\n const opts = args[args.length - 1];\n\n if (typeof opts === 'object' && opts.constructor === Object) {\n args.splice(args.length - 1, 1);\n return opts;\n } else {\n return {};\n }\n}\n\n/** @typedef { {capture?: boolean} } RegexEitherOptions */\n\n/**\n * Any of the passed expresssions may match\n *\n * Creates a huge this | this | that | that match\n * @param {(RegExp | string)[] | [...(RegExp | string)[], RegexEitherOptions]} args\n * @returns {string}\n */\nfunction either(...args) {\n /** @type { object & {capture?: boolean} } */\n const opts = stripOptionsFromArgs(args);\n const joined = '('\n + (opts.capture ? \"\" : \"?:\")\n + args.map((x) => source(x)).join(\"|\") + \")\";\n return joined;\n}\n\n/*\nLanguage: F#\nAuthor: Jonas Follesø \nContributors: Troy Kershaw , Henrik Feldt , Melvyn Laïly \nWebsite: https://docs.microsoft.com/en-us/dotnet/fsharp/\nCategory: functional\n*/\n\n\n/** @type LanguageFn */\nfunction fsharp(hljs) {\n const KEYWORDS = [\n \"abstract\",\n \"and\",\n \"as\",\n \"assert\",\n \"base\",\n \"begin\",\n \"class\",\n \"default\",\n \"delegate\",\n \"do\",\n \"done\",\n \"downcast\",\n \"downto\",\n \"elif\",\n \"else\",\n \"end\",\n \"exception\",\n \"extern\",\n // \"false\", // literal\n \"finally\",\n \"fixed\",\n \"for\",\n \"fun\",\n \"function\",\n \"global\",\n \"if\",\n \"in\",\n \"inherit\",\n \"inline\",\n \"interface\",\n \"internal\",\n \"lazy\",\n \"let\",\n \"match\",\n \"member\",\n \"module\",\n \"mutable\",\n \"namespace\",\n \"new\",\n // \"not\", // built_in\n // \"null\", // literal\n \"of\",\n \"open\",\n \"or\",\n \"override\",\n \"private\",\n \"public\",\n \"rec\",\n \"return\",\n \"static\",\n \"struct\",\n \"then\",\n \"to\",\n // \"true\", // literal\n \"try\",\n \"type\",\n \"upcast\",\n \"use\",\n \"val\",\n \"void\",\n \"when\",\n \"while\",\n \"with\",\n \"yield\"\n ];\n\n const BANG_KEYWORD_MODE = {\n // monad builder keywords (matches before non-bang keywords)\n scope: 'keyword',\n match: /\\b(yield|return|let|do|match|use)!/\n };\n\n const PREPROCESSOR_KEYWORDS = [\n \"if\",\n \"else\",\n \"endif\",\n \"line\",\n \"nowarn\",\n \"light\",\n \"r\",\n \"i\",\n \"I\",\n \"load\",\n \"time\",\n \"help\",\n \"quit\"\n ];\n\n const LITERALS = [\n \"true\",\n \"false\",\n \"null\",\n \"Some\",\n \"None\",\n \"Ok\",\n \"Error\",\n \"infinity\",\n \"infinityf\",\n \"nan\",\n \"nanf\"\n ];\n\n const SPECIAL_IDENTIFIERS = [\n \"__LINE__\",\n \"__SOURCE_DIRECTORY__\",\n \"__SOURCE_FILE__\"\n ];\n\n // Since it's possible to re-bind/shadow names (e.g. let char = 'c'),\n // these builtin types should only be matched when a type name is expected.\n const KNOWN_TYPES = [\n // basic types\n \"bool\",\n \"byte\",\n \"sbyte\",\n \"int8\",\n \"int16\",\n \"int32\",\n \"uint8\",\n \"uint16\",\n \"uint32\",\n \"int\",\n \"uint\",\n \"int64\",\n \"uint64\",\n \"nativeint\",\n \"unativeint\",\n \"decimal\",\n \"float\",\n \"double\",\n \"float32\",\n \"single\",\n \"char\",\n \"string\",\n \"unit\",\n \"bigint\",\n // other native types or lowercase aliases\n \"option\",\n \"voption\",\n \"list\",\n \"array\",\n \"seq\",\n \"byref\",\n \"exn\",\n \"inref\",\n \"nativeptr\",\n \"obj\",\n \"outref\",\n \"voidptr\",\n // other important FSharp types\n \"Result\"\n ];\n\n const BUILTINS = [\n // Somewhat arbitrary list of builtin functions and values.\n // Most of them are declared in Microsoft.FSharp.Core\n // I tried to stay relevant by adding only the most idiomatic\n // and most used symbols that are not already declared as types.\n \"not\",\n \"ref\",\n \"raise\",\n \"reraise\",\n \"dict\",\n \"readOnlyDict\",\n \"set\",\n \"get\",\n \"enum\",\n \"sizeof\",\n \"typeof\",\n \"typedefof\",\n \"nameof\",\n \"nullArg\",\n \"invalidArg\",\n \"invalidOp\",\n \"id\",\n \"fst\",\n \"snd\",\n \"ignore\",\n \"lock\",\n \"using\",\n \"box\",\n \"unbox\",\n \"tryUnbox\",\n \"printf\",\n \"printfn\",\n \"sprintf\",\n \"eprintf\",\n \"eprintfn\",\n \"fprintf\",\n \"fprintfn\",\n \"failwith\",\n \"failwithf\"\n ];\n\n const ALL_KEYWORDS = {\n keyword: KEYWORDS,\n literal: LITERALS,\n built_in: BUILTINS,\n 'variable.constant': SPECIAL_IDENTIFIERS\n };\n\n // (* potentially multi-line Meta Language style comment *)\n const ML_COMMENT =\n hljs.COMMENT(/\\(\\*(?!\\))/, /\\*\\)/, {\n contains: [\"self\"]\n });\n // Either a multi-line (* Meta Language style comment *) or a single line // C style comment.\n const COMMENT = {\n variants: [\n ML_COMMENT,\n hljs.C_LINE_COMMENT_MODE,\n ]\n };\n\n // Most identifiers can contain apostrophes\n const IDENTIFIER_RE = /[a-zA-Z_](\\w|')*/;\n\n const QUOTED_IDENTIFIER = {\n scope: 'variable',\n begin: /``/,\n end: /``/\n };\n\n // 'a or ^a where a can be a ``quoted identifier``\n const BEGIN_GENERIC_TYPE_SYMBOL_RE = /\\B('|\\^)/;\n const GENERIC_TYPE_SYMBOL = {\n scope: 'symbol',\n variants: [\n // the type name is a quoted identifier:\n { match: concat(BEGIN_GENERIC_TYPE_SYMBOL_RE, /``.*?``/) },\n // the type name is a normal identifier (we don't use IDENTIFIER_RE because there cannot be another apostrophe here):\n { match: concat(BEGIN_GENERIC_TYPE_SYMBOL_RE, hljs.UNDERSCORE_IDENT_RE) }\n ],\n relevance: 0\n };\n\n const makeOperatorMode = function({ includeEqual }) {\n // List or symbolic operator characters from the FSharp Spec 4.1, minus the dot, and with `?` added, used for nullable operators.\n let allOperatorChars;\n if (includeEqual)\n allOperatorChars = \"!%&*+-/<=>@^|~?\";\n else\n allOperatorChars = \"!%&*+-/<>@^|~?\";\n const OPERATOR_CHARS = Array.from(allOperatorChars);\n const OPERATOR_CHAR_RE = concat('[', ...OPERATOR_CHARS.map(escape), ']');\n // The lone dot operator is special. It cannot be redefined, and we don't want to highlight it. It can be used as part of a multi-chars operator though.\n const OPERATOR_CHAR_OR_DOT_RE = either(OPERATOR_CHAR_RE, /\\./);\n // When a dot is present, it must be followed by another operator char:\n const OPERATOR_FIRST_CHAR_OF_MULTIPLE_RE = concat(OPERATOR_CHAR_OR_DOT_RE, lookahead(OPERATOR_CHAR_OR_DOT_RE));\n const SYMBOLIC_OPERATOR_RE = either(\n concat(OPERATOR_FIRST_CHAR_OF_MULTIPLE_RE, OPERATOR_CHAR_OR_DOT_RE, '*'), // Matches at least 2 chars operators\n concat(OPERATOR_CHAR_RE, '+'), // Matches at least one char operators\n );\n return {\n scope: 'operator',\n match: either(\n // symbolic operators:\n SYMBOLIC_OPERATOR_RE,\n // other symbolic keywords:\n // Type casting and conversion operators:\n /:\\?>/,\n /:\\?/,\n /:>/,\n /:=/, // Reference cell assignment\n /::?/, // : or ::\n /\\$/), // A single $ can be used as an operator\n relevance: 0\n };\n };\n\n const OPERATOR = makeOperatorMode({ includeEqual: true });\n // This variant is used when matching '=' should end a parent mode:\n const OPERATOR_WITHOUT_EQUAL = makeOperatorMode({ includeEqual: false });\n\n const makeTypeAnnotationMode = function(prefix, prefixScope) {\n return {\n begin: concat( // a type annotation is a\n prefix, // should be a colon or the 'of' keyword\n lookahead( // that has to be followed by\n concat(\n /\\s*/, // optional space\n either( // then either of:\n /\\w/, // word\n /'/, // generic type name\n /\\^/, // generic type name\n /#/, // flexible type name\n /``/, // quoted type name\n /\\(/, // parens type expression\n /{\\|/, // anonymous type annotation\n )))),\n beginScope: prefixScope,\n // BUG: because ending with \\n is necessary for some cases, multi-line type annotations are not properly supported.\n // Examples where \\n is required at the end:\n // - abstract member definitions in classes: abstract Property : int * string\n // - return type annotations: let f f' = f' () : returnTypeAnnotation\n // - record fields definitions: { A : int \\n B : string }\n end: lookahead(\n either(\n /\\n/,\n /=/)),\n relevance: 0,\n // we need the known types, and we need the type constraint keywords and literals. e.g.: when 'a : null\n keywords: hljs.inherit(ALL_KEYWORDS, { type: KNOWN_TYPES }),\n contains: [\n COMMENT,\n GENERIC_TYPE_SYMBOL,\n hljs.inherit(QUOTED_IDENTIFIER, { scope: null }), // match to avoid strange patterns inside that may break the parsing\n OPERATOR_WITHOUT_EQUAL\n ]\n };\n };\n\n const TYPE_ANNOTATION = makeTypeAnnotationMode(/:/, 'operator');\n const DISCRIMINATED_UNION_TYPE_ANNOTATION = makeTypeAnnotationMode(/\\bof\\b/, 'keyword');\n\n // type MyType<'a> = ...\n const TYPE_DECLARATION = {\n begin: [\n /(^|\\s+)/, // prevents matching the following: `match s.stype with`\n /type/,\n /\\s+/,\n IDENTIFIER_RE\n ],\n beginScope: {\n 2: 'keyword',\n 4: 'title.class'\n },\n end: lookahead(/\\(|=|$/),\n keywords: ALL_KEYWORDS, // match keywords in type constraints. e.g.: when 'a : null\n contains: [\n COMMENT,\n hljs.inherit(QUOTED_IDENTIFIER, { scope: null }), // match to avoid strange patterns inside that may break the parsing\n GENERIC_TYPE_SYMBOL,\n {\n // For visual consistency, highlight type brackets as operators.\n scope: 'operator',\n match: /<|>/\n },\n TYPE_ANNOTATION // generic types can have constraints, which are type annotations. e.g. type MyType<'T when 'T : delegate> =\n ]\n };\n\n const COMPUTATION_EXPRESSION = {\n // computation expressions:\n scope: 'computation-expression',\n // BUG: might conflict with record deconstruction. e.g. let f { Name = name } = name // will highlight f\n match: /\\b[_a-z]\\w*(?=\\s*\\{)/\n };\n\n const PREPROCESSOR = {\n // preprocessor directives and fsi commands:\n begin: [\n /^\\s*/,\n concat(/#/, either(...PREPROCESSOR_KEYWORDS)),\n /\\b/\n ],\n beginScope: { 2: 'meta' },\n end: lookahead(/\\s|$/)\n };\n\n // TODO: this definition is missing support for type suffixes and octal notation.\n // BUG: range operator without any space is wrongly interpreted as a single number (e.g. 1..10 )\n const NUMBER = {\n variants: [\n hljs.BINARY_NUMBER_MODE,\n hljs.C_NUMBER_MODE\n ]\n };\n\n // All the following string definitions are potentially multi-line.\n // BUG: these definitions are missing support for byte strings (suffixed with B)\n\n // \"...\"\n const QUOTED_STRING = {\n scope: 'string',\n begin: /\"/,\n end: /\"/,\n contains: [\n hljs.BACKSLASH_ESCAPE\n ]\n };\n // @\"...\"\n const VERBATIM_STRING = {\n scope: 'string',\n begin: /@\"/,\n end: /\"/,\n contains: [\n {\n match: /\"\"/ // escaped \"\n },\n hljs.BACKSLASH_ESCAPE\n ]\n };\n // \"\"\"...\"\"\"\n const TRIPLE_QUOTED_STRING = {\n scope: 'string',\n begin: /\"\"\"/,\n end: /\"\"\"/,\n relevance: 2\n };\n const SUBST = {\n scope: 'subst',\n begin: /\\{/,\n end: /\\}/,\n keywords: ALL_KEYWORDS\n };\n // $\"...{1+1}...\"\n const INTERPOLATED_STRING = {\n scope: 'string',\n begin: /\\$\"/,\n end: /\"/,\n contains: [\n {\n match: /\\{\\{/ // escaped {\n },\n {\n match: /\\}\\}/ // escaped }\n },\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ]\n };\n // $@\"...{1+1}...\"\n const INTERPOLATED_VERBATIM_STRING = {\n scope: 'string',\n begin: /(\\$@|@\\$)\"/,\n end: /\"/,\n contains: [\n {\n match: /\\{\\{/ // escaped {\n },\n {\n match: /\\}\\}/ // escaped }\n },\n {\n match: /\"\"/\n },\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ]\n };\n // $\"\"\"...{1+1}...\"\"\"\n const INTERPOLATED_TRIPLE_QUOTED_STRING = {\n scope: 'string',\n begin: /\\$\"\"\"/,\n end: /\"\"\"/,\n contains: [\n {\n match: /\\{\\{/ // escaped {\n },\n {\n match: /\\}\\}/ // escaped }\n },\n SUBST\n ],\n relevance: 2\n };\n // '.'\n const CHAR_LITERAL = {\n scope: 'string',\n match: concat(\n /'/,\n either(\n /[^\\\\']/, // either a single non escaped char...\n /\\\\(?:.|\\d{3}|x[a-fA-F\\d]{2}|u[a-fA-F\\d]{4}|U[a-fA-F\\d]{8})/ // ...or an escape sequence\n ),\n /'/\n )\n };\n // F# allows a lot of things inside string placeholders.\n // Things that don't currently seem allowed by the compiler: types definition, attributes usage.\n // (Strictly speaking, some of the followings are only allowed inside triple quoted interpolated strings...)\n SUBST.contains = [\n INTERPOLATED_VERBATIM_STRING,\n INTERPOLATED_STRING,\n VERBATIM_STRING,\n QUOTED_STRING,\n CHAR_LITERAL,\n BANG_KEYWORD_MODE,\n COMMENT,\n QUOTED_IDENTIFIER,\n TYPE_ANNOTATION,\n COMPUTATION_EXPRESSION,\n PREPROCESSOR,\n NUMBER,\n GENERIC_TYPE_SYMBOL,\n OPERATOR\n ];\n const STRING = {\n variants: [\n INTERPOLATED_TRIPLE_QUOTED_STRING,\n INTERPOLATED_VERBATIM_STRING,\n INTERPOLATED_STRING,\n TRIPLE_QUOTED_STRING,\n VERBATIM_STRING,\n QUOTED_STRING,\n CHAR_LITERAL\n ]\n };\n\n return {\n name: 'F#',\n aliases: [\n 'fs',\n 'f#'\n ],\n keywords: ALL_KEYWORDS,\n illegal: /\\/\\*/,\n classNameAliases: {\n 'computation-expression': 'keyword'\n },\n contains: [\n BANG_KEYWORD_MODE,\n STRING,\n COMMENT,\n QUOTED_IDENTIFIER,\n TYPE_DECLARATION,\n {\n // e.g. [] or [<``module``: MyCustomAttributeThatWorksOnModules>]\n // or []\n scope: 'meta',\n begin: /\\[\\]/,\n relevance: 2,\n contains: [\n QUOTED_IDENTIFIER,\n // can contain any constant value\n TRIPLE_QUOTED_STRING,\n VERBATIM_STRING,\n QUOTED_STRING,\n CHAR_LITERAL,\n NUMBER\n ]\n },\n DISCRIMINATED_UNION_TYPE_ANNOTATION,\n TYPE_ANNOTATION,\n COMPUTATION_EXPRESSION,\n PREPROCESSOR,\n NUMBER,\n GENERIC_TYPE_SYMBOL,\n OPERATOR\n ]\n };\n}\n\nexport { fsharp as default };\n","const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';\nconst KEYWORDS = [\n \"as\", // for exports\n \"in\",\n \"of\",\n \"if\",\n \"for\",\n \"while\",\n \"finally\",\n \"var\",\n \"new\",\n \"function\",\n \"do\",\n \"return\",\n \"void\",\n \"else\",\n \"break\",\n \"catch\",\n \"instanceof\",\n \"with\",\n \"throw\",\n \"case\",\n \"default\",\n \"try\",\n \"switch\",\n \"continue\",\n \"typeof\",\n \"delete\",\n \"let\",\n \"yield\",\n \"const\",\n \"class\",\n // JS handles these with a special rule\n // \"get\",\n // \"set\",\n \"debugger\",\n \"async\",\n \"await\",\n \"static\",\n \"import\",\n \"from\",\n \"export\",\n \"extends\",\n // It's reached stage 3, which is \"recommended for implementation\":\n \"using\"\n];\nconst LITERALS = [\n \"true\",\n \"false\",\n \"null\",\n \"undefined\",\n \"NaN\",\n \"Infinity\"\n];\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects\nconst TYPES = [\n // Fundamental objects\n \"Object\",\n \"Function\",\n \"Boolean\",\n \"Symbol\",\n // numbers and dates\n \"Math\",\n \"Date\",\n \"Number\",\n \"BigInt\",\n // text\n \"String\",\n \"RegExp\",\n // Indexed collections\n \"Array\",\n \"Float32Array\",\n \"Float64Array\",\n \"Int8Array\",\n \"Uint8Array\",\n \"Uint8ClampedArray\",\n \"Int16Array\",\n \"Int32Array\",\n \"Uint16Array\",\n \"Uint32Array\",\n \"BigInt64Array\",\n \"BigUint64Array\",\n // Keyed collections\n \"Set\",\n \"Map\",\n \"WeakSet\",\n \"WeakMap\",\n // Structured data\n \"ArrayBuffer\",\n \"SharedArrayBuffer\",\n \"Atomics\",\n \"DataView\",\n \"JSON\",\n // Control abstraction objects\n \"Promise\",\n \"Generator\",\n \"GeneratorFunction\",\n \"AsyncFunction\",\n // Reflection\n \"Reflect\",\n \"Proxy\",\n // Internationalization\n \"Intl\",\n // WebAssembly\n \"WebAssembly\"\n];\n\nconst ERROR_TYPES = [\n \"Error\",\n \"EvalError\",\n \"InternalError\",\n \"RangeError\",\n \"ReferenceError\",\n \"SyntaxError\",\n \"TypeError\",\n \"URIError\"\n];\n\nconst BUILT_IN_GLOBALS = [\n \"setInterval\",\n \"setTimeout\",\n \"clearInterval\",\n \"clearTimeout\",\n\n \"require\",\n \"exports\",\n\n \"eval\",\n \"isFinite\",\n \"isNaN\",\n \"parseFloat\",\n \"parseInt\",\n \"decodeURI\",\n \"decodeURIComponent\",\n \"encodeURI\",\n \"encodeURIComponent\",\n \"escape\",\n \"unescape\"\n];\n\nconst BUILT_IN_VARIABLES = [\n \"arguments\",\n \"this\",\n \"super\",\n \"console\",\n \"window\",\n \"document\",\n \"localStorage\",\n \"sessionStorage\",\n \"module\",\n \"global\" // Node.js\n];\n\nconst BUILT_INS = [].concat(\n BUILT_IN_GLOBALS,\n TYPES,\n ERROR_TYPES\n);\n\n/*\nLanguage: JavaScript\nDescription: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions.\nCategory: common, scripting, web\nWebsite: https://developer.mozilla.org/en-US/docs/Web/JavaScript\n*/\n\n\n/** @type LanguageFn */\nfunction javascript(hljs) {\n const regex = hljs.regex;\n /**\n * Takes a string like \" {\n const tag = \"',\n end: ''\n };\n // to avoid some special cases inside isTrulyOpeningTag\n const XML_SELF_CLOSING = /<[A-Za-z0-9\\\\._:-]+\\s*\\/>/;\n const XML_TAG = {\n begin: /<[A-Za-z0-9\\\\._:-]+/,\n end: /\\/[A-Za-z0-9\\\\._:-]+>|\\/>/,\n /**\n * @param {RegExpMatchArray} match\n * @param {CallbackResponse} response\n */\n isTrulyOpeningTag: (match, response) => {\n const afterMatchIndex = match[0].length + match.index;\n const nextChar = match.input[afterMatchIndex];\n if (\n // HTML should not include another raw `<` inside a tag\n // nested type?\n // `>`, etc.\n nextChar === \"<\" ||\n // the , gives away that this is not HTML\n // ``\n nextChar === \",\"\n ) {\n response.ignoreMatch();\n return;\n }\n\n // ``\n // Quite possibly a tag, lets look for a matching closing tag...\n if (nextChar === \">\") {\n // if we cannot find a matching closing tag, then we\n // will ignore it\n if (!hasClosingTag(match, { after: afterMatchIndex })) {\n response.ignoreMatch();\n }\n }\n\n // `` (self-closing)\n // handled by simpleSelfClosing rule\n\n let m;\n const afterMatch = match.input.substring(afterMatchIndex);\n\n // some more template typing stuff\n // (key?: string) => Modify<\n if ((m = afterMatch.match(/^\\s*=/))) {\n response.ignoreMatch();\n return;\n }\n\n // ``\n // technically this could be HTML, but it smells like a type\n // NOTE: This is ugh, but added specifically for https://github.com/highlightjs/highlight.js/issues/3276\n if ((m = afterMatch.match(/^\\s+extends\\s+/))) {\n if (m.index === 0) {\n response.ignoreMatch();\n // eslint-disable-next-line no-useless-return\n return;\n }\n }\n }\n };\n const KEYWORDS$1 = {\n $pattern: IDENT_RE,\n keyword: KEYWORDS,\n literal: LITERALS,\n built_in: BUILT_INS,\n \"variable.language\": BUILT_IN_VARIABLES\n };\n\n // https://tc39.es/ecma262/#sec-literals-numeric-literals\n const decimalDigits = '[0-9](_?[0-9])*';\n const frac = `\\\\.(${decimalDigits})`;\n // DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral\n // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`;\n const NUMBER = {\n className: 'number',\n variants: [\n // DecimalLiteral\n { begin: `(\\\\b(${decimalInteger})((${frac})|\\\\.)?|(${frac}))` +\n `[eE][+-]?(${decimalDigits})\\\\b` },\n { begin: `\\\\b(${decimalInteger})\\\\b((${frac})\\\\b|\\\\.)?|(${frac})\\\\b` },\n\n // DecimalBigIntegerLiteral\n { begin: `\\\\b(0|[1-9](_?[0-9])*)n\\\\b` },\n\n // NonDecimalIntegerLiteral\n { begin: \"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\\\b\" },\n { begin: \"\\\\b0[bB][0-1](_?[0-1])*n?\\\\b\" },\n { begin: \"\\\\b0[oO][0-7](_?[0-7])*n?\\\\b\" },\n\n // LegacyOctalIntegerLiteral (does not include underscore separators)\n // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals\n { begin: \"\\\\b0[0-7]+n?\\\\b\" },\n ],\n relevance: 0\n };\n\n const SUBST = {\n className: 'subst',\n begin: '\\\\$\\\\{',\n end: '\\\\}',\n keywords: KEYWORDS$1,\n contains: [] // defined later\n };\n const HTML_TEMPLATE = {\n begin: '\\.?html`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'xml'\n }\n };\n const CSS_TEMPLATE = {\n begin: '\\.?css`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'css'\n }\n };\n const GRAPHQL_TEMPLATE = {\n begin: '\\.?gql`',\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n subLanguage: 'graphql'\n }\n };\n const TEMPLATE_STRING = {\n className: 'string',\n begin: '`',\n end: '`',\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ]\n };\n const JSDOC_COMMENT = hljs.COMMENT(\n /\\/\\*\\*(?!\\/)/,\n '\\\\*/',\n {\n relevance: 0,\n contains: [\n {\n begin: '(?=@[A-Za-z]+)',\n relevance: 0,\n contains: [\n {\n className: 'doctag',\n begin: '@[A-Za-z]+'\n },\n {\n className: 'type',\n begin: '\\\\{',\n end: '\\\\}',\n excludeEnd: true,\n excludeBegin: true,\n relevance: 0\n },\n {\n className: 'variable',\n begin: IDENT_RE$1 + '(?=\\\\s*(-)|$)',\n endsParent: true,\n relevance: 0\n },\n // eat spaces (not newlines) so we can find\n // types or variables\n {\n begin: /(?=[^\\n])\\s/,\n relevance: 0\n }\n ]\n }\n ]\n }\n );\n const COMMENT = {\n className: \"comment\",\n variants: [\n JSDOC_COMMENT,\n hljs.C_BLOCK_COMMENT_MODE,\n hljs.C_LINE_COMMENT_MODE\n ]\n };\n const SUBST_INTERNALS = [\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n HTML_TEMPLATE,\n CSS_TEMPLATE,\n GRAPHQL_TEMPLATE,\n TEMPLATE_STRING,\n // Skip numbers when they are part of a variable name\n { match: /\\$\\d+/ },\n NUMBER,\n // This is intentional:\n // See https://github.com/highlightjs/highlight.js/issues/3288\n // hljs.REGEXP_MODE\n ];\n SUBST.contains = SUBST_INTERNALS\n .concat({\n // we need to pair up {} inside our subst to prevent\n // it from ending too early by matching another }\n begin: /\\{/,\n end: /\\}/,\n keywords: KEYWORDS$1,\n contains: [\n \"self\"\n ].concat(SUBST_INTERNALS)\n });\n const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains);\n const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([\n // eat recursive parens in sub expressions\n {\n begin: /(\\s*)\\(/,\n end: /\\)/,\n keywords: KEYWORDS$1,\n contains: [\"self\"].concat(SUBST_AND_COMMENTS)\n }\n ]);\n const PARAMS = {\n className: 'params',\n // convert this to negative lookbehind in v12\n begin: /(\\s*)\\(/, // to match the parms with\n end: /\\)/,\n excludeBegin: true,\n excludeEnd: true,\n keywords: KEYWORDS$1,\n contains: PARAMS_CONTAINS\n };\n\n // ES6 classes\n const CLASS_OR_EXTENDS = {\n variants: [\n // class Car extends vehicle\n {\n match: [\n /class/,\n /\\s+/,\n IDENT_RE$1,\n /\\s+/,\n /extends/,\n /\\s+/,\n regex.concat(IDENT_RE$1, \"(\", regex.concat(/\\./, IDENT_RE$1), \")*\")\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.class\",\n 5: \"keyword\",\n 7: \"title.class.inherited\"\n }\n },\n // class Car\n {\n match: [\n /class/,\n /\\s+/,\n IDENT_RE$1\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.class\"\n }\n },\n\n ]\n };\n\n const CLASS_REFERENCE = {\n relevance: 0,\n match:\n regex.either(\n // Hard coded exceptions\n /\\bJSON/,\n // Float32Array, OutT\n /\\b[A-Z][a-z]+([A-Z][a-z]*|\\d)*/,\n // CSSFactory, CSSFactoryT\n /\\b[A-Z]{2,}([A-Z][a-z]+|\\d)+([A-Z][a-z]*)*/,\n // FPs, FPsT\n /\\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\\d)*([A-Z][a-z]*)*/,\n // P\n // single letters are not highlighted\n // BLAH\n // this will be flagged as a UPPER_CASE_CONSTANT instead\n ),\n className: \"title.class\",\n keywords: {\n _: [\n // se we still get relevance credit for JS library classes\n ...TYPES,\n ...ERROR_TYPES\n ]\n }\n };\n\n const USE_STRICT = {\n label: \"use_strict\",\n className: 'meta',\n relevance: 10,\n begin: /^\\s*['\"]use (strict|asm)['\"]/\n };\n\n const FUNCTION_DEFINITION = {\n variants: [\n {\n match: [\n /function/,\n /\\s+/,\n IDENT_RE$1,\n /(?=\\s*\\()/\n ]\n },\n // anonymous function\n {\n match: [\n /function/,\n /\\s*(?=\\()/\n ]\n }\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n label: \"func.def\",\n contains: [ PARAMS ],\n illegal: /%/\n };\n\n const UPPER_CASE_CONSTANT = {\n relevance: 0,\n match: /\\b[A-Z][A-Z_0-9]+\\b/,\n className: \"variable.constant\"\n };\n\n function noneOf(list) {\n return regex.concat(\"(?!\", list.join(\"|\"), \")\");\n }\n\n const FUNCTION_CALL = {\n match: regex.concat(\n /\\b/,\n noneOf([\n ...BUILT_IN_GLOBALS,\n \"super\",\n \"import\"\n ].map(x => `${x}\\\\s*\\\\(`)),\n IDENT_RE$1, regex.lookahead(/\\s*\\(/)),\n className: \"title.function\",\n relevance: 0\n };\n\n const PROPERTY_ACCESS = {\n begin: regex.concat(/\\./, regex.lookahead(\n regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/)\n )),\n end: IDENT_RE$1,\n excludeBegin: true,\n keywords: \"prototype\",\n className: \"property\",\n relevance: 0\n };\n\n const GETTER_OR_SETTER = {\n match: [\n /get|set/,\n /\\s+/,\n IDENT_RE$1,\n /(?=\\()/\n ],\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n contains: [\n { // eat to avoid empty params\n begin: /\\(\\)/\n },\n PARAMS\n ]\n };\n\n const FUNC_LEAD_IN_RE = '(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*' +\n '\\\\)[^()]*)*' +\n '\\\\)[^()]*)*' +\n '\\\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\\\s*=>';\n\n const FUNCTION_VARIABLE = {\n match: [\n /const|var|let/, /\\s+/,\n IDENT_RE$1, /\\s*/,\n /=\\s*/,\n /(async\\s*)?/, // async is optional\n regex.lookahead(FUNC_LEAD_IN_RE)\n ],\n keywords: \"async\",\n className: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n contains: [\n PARAMS\n ]\n };\n\n return {\n name: 'JavaScript',\n aliases: ['js', 'jsx', 'mjs', 'cjs'],\n keywords: KEYWORDS$1,\n // this will be extended by TypeScript\n exports: { PARAMS_CONTAINS, CLASS_REFERENCE },\n illegal: /#(?![$_A-z])/,\n contains: [\n hljs.SHEBANG({\n label: \"shebang\",\n binary: \"node\",\n relevance: 5\n }),\n USE_STRICT,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n HTML_TEMPLATE,\n CSS_TEMPLATE,\n GRAPHQL_TEMPLATE,\n TEMPLATE_STRING,\n COMMENT,\n // Skip numbers when they are part of a variable name\n { match: /\\$\\d+/ },\n NUMBER,\n CLASS_REFERENCE,\n {\n scope: 'attr',\n match: IDENT_RE$1 + regex.lookahead(':'),\n relevance: 0\n },\n FUNCTION_VARIABLE,\n { // \"value\" container\n begin: '(' + hljs.RE_STARTERS_RE + '|\\\\b(case|return|throw)\\\\b)\\\\s*',\n keywords: 'return throw case',\n relevance: 0,\n contains: [\n COMMENT,\n hljs.REGEXP_MODE,\n {\n className: 'function',\n // we have to count the parens to make sure we actually have the\n // correct bounding ( ) before the =>. There could be any number of\n // sub-expressions inside also surrounded by parens.\n begin: FUNC_LEAD_IN_RE,\n returnBegin: true,\n end: '\\\\s*=>',\n contains: [\n {\n className: 'params',\n variants: [\n {\n begin: hljs.UNDERSCORE_IDENT_RE,\n relevance: 0\n },\n {\n className: null,\n begin: /\\(\\s*\\)/,\n skip: true\n },\n {\n begin: /(\\s*)\\(/,\n end: /\\)/,\n excludeBegin: true,\n excludeEnd: true,\n keywords: KEYWORDS$1,\n contains: PARAMS_CONTAINS\n }\n ]\n }\n ]\n },\n { // could be a comma delimited list of params to a function call\n begin: /,/,\n relevance: 0\n },\n {\n match: /\\s+/,\n relevance: 0\n },\n { // JSX\n variants: [\n { begin: FRAGMENT.begin, end: FRAGMENT.end },\n { match: XML_SELF_CLOSING },\n {\n begin: XML_TAG.begin,\n // we carefully check the opening tag to see if it truly\n // is a tag and not a false positive\n 'on:begin': XML_TAG.isTrulyOpeningTag,\n end: XML_TAG.end\n }\n ],\n subLanguage: 'xml',\n contains: [\n {\n begin: XML_TAG.begin,\n end: XML_TAG.end,\n skip: true,\n contains: ['self']\n }\n ]\n }\n ],\n },\n FUNCTION_DEFINITION,\n {\n // prevent this from getting swallowed up by function\n // since they appear \"function like\"\n beginKeywords: \"while if switch catch for\"\n },\n {\n // we have to count the parens to make sure we actually have the correct\n // bounding ( ). There could be any number of sub-expressions inside\n // also surrounded by parens.\n begin: '\\\\b(?!function)' + hljs.UNDERSCORE_IDENT_RE +\n '\\\\(' + // first parens\n '[^()]*(\\\\(' +\n '[^()]*(\\\\(' +\n '[^()]*' +\n '\\\\)[^()]*)*' +\n '\\\\)[^()]*)*' +\n '\\\\)\\\\s*\\\\{', // end parens\n returnBegin:true,\n label: \"func.def\",\n contains: [\n PARAMS,\n hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: \"title.function\" })\n ]\n },\n // catch ... so it won't trigger the property rule below\n {\n match: /\\.\\.\\./,\n relevance: 0\n },\n PROPERTY_ACCESS,\n // hack: prevents detection of keywords in some circumstances\n // .keyword()\n // $keyword = x\n {\n match: '\\\\$' + IDENT_RE$1,\n relevance: 0\n },\n {\n match: [ /\\bconstructor(?=\\s*\\()/ ],\n className: { 1: \"title.function\" },\n contains: [ PARAMS ]\n },\n FUNCTION_CALL,\n UPPER_CASE_CONSTANT,\n CLASS_OR_EXTENDS,\n GETTER_OR_SETTER,\n {\n match: /\\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`\n }\n ]\n };\n}\n\nexport { javascript as default };\n","\nimport highlightjs from 'highlight.js/lib/core';\nimport 'highlight.js/styles/github.css';\nimport bash from 'highlight.js/lib/languages/bash';\nimport csharp from 'highlight.js/lib/languages/csharp';\nimport css from 'highlight.js/lib/languages/css';\nimport fsharp from 'highlight.js/lib/languages/fsharp';\nimport http from 'highlight.js/lib/languages/http';\nimport javascript from 'highlight.js/lib/languages/javascript';\nimport json from 'highlight.js/lib/languages/json';\nimport julia from 'highlight.js/lib/languages/julia';\nimport markdown from 'highlight.js/lib/languages/markdown';\nimport matlab from 'highlight.js/lib/languages/matlab';\nimport plaintext from 'highlight.js/lib/languages/plaintext';\nimport python from 'highlight.js/lib/languages/python';\nimport r from 'highlight.js/lib/languages/r';\nimport ruby from 'highlight.js/lib/languages/ruby';\nimport shell from 'highlight.js/lib/languages/shell';\nimport sql from 'highlight.js/lib/languages/sql';\nimport xml from 'highlight.js/lib/languages/xml';\nimport yaml from 'highlight.js/lib/languages/yaml';\nhighlightjs.registerLanguage('bash', bash);\nhighlightjs.registerLanguage('csharp', csharp);\nhighlightjs.registerLanguage('css', css);\nhighlightjs.registerLanguage('fsharp', fsharp);\nhighlightjs.registerLanguage('http', http);\nhighlightjs.registerLanguage('javascript', javascript);\nhighlightjs.registerLanguage('json', json);\nhighlightjs.registerLanguage('julia', julia);\nhighlightjs.registerLanguage('markdown', markdown);\nhighlightjs.registerLanguage('matlab', matlab);\nhighlightjs.registerLanguage('plaintext', plaintext);\nhighlightjs.registerLanguage('python', python);\nhighlightjs.registerLanguage('r', r);\nhighlightjs.registerLanguage('ruby', ruby);\nhighlightjs.registerLanguage('shell', shell);\nhighlightjs.registerLanguage('sql', sql);\nhighlightjs.registerLanguage('xml', xml);\nhighlightjs.registerLanguage('yaml', yaml);\nexport default highlightjs;\n","/*\nLanguage: Bash\nAuthor: vah \nContributrors: Benjamin Pannell \nWebsite: https://www.gnu.org/software/bash/\nCategory: common, scripting\n*/\n\n/** @type LanguageFn */\nfunction bash(hljs) {\n const regex = hljs.regex;\n const VAR = {};\n const BRACED_VAR = {\n begin: /\\$\\{/,\n end: /\\}/,\n contains: [\n \"self\",\n {\n begin: /:-/,\n contains: [ VAR ]\n } // default values\n ]\n };\n Object.assign(VAR, {\n className: 'variable',\n variants: [\n { begin: regex.concat(/\\$[\\w\\d#@][\\w\\d_]*/,\n // negative look-ahead tries to avoid matching patterns that are not\n // Perl at all like $ident$, @ident@, etc.\n `(?![\\\\w\\\\d])(?![$])`) },\n BRACED_VAR\n ]\n });\n\n const SUBST = {\n className: 'subst',\n begin: /\\$\\(/,\n end: /\\)/,\n contains: [ hljs.BACKSLASH_ESCAPE ]\n };\n const COMMENT = hljs.inherit(\n hljs.COMMENT(),\n {\n match: [\n /(^|\\s)/,\n /#.*$/\n ],\n scope: {\n 2: 'comment'\n }\n }\n );\n const HERE_DOC = {\n begin: /<<-?\\s*(?=\\w+)/,\n starts: { contains: [\n hljs.END_SAME_AS_BEGIN({\n begin: /(\\w+)/,\n end: /(\\w+)/,\n className: 'string'\n })\n ] }\n };\n const QUOTE_STRING = {\n className: 'string',\n begin: /\"/,\n end: /\"/,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n VAR,\n SUBST\n ]\n };\n SUBST.contains.push(QUOTE_STRING);\n const ESCAPED_QUOTE = {\n match: /\\\\\"/\n };\n const APOS_STRING = {\n className: 'string',\n begin: /'/,\n end: /'/\n };\n const ESCAPED_APOS = {\n match: /\\\\'/\n };\n const ARITHMETIC = {\n begin: /\\$?\\(\\(/,\n end: /\\)\\)/,\n contains: [\n {\n begin: /\\d+#[0-9a-f]+/,\n className: \"number\"\n },\n hljs.NUMBER_MODE,\n VAR\n ]\n };\n const SH_LIKE_SHELLS = [\n \"fish\",\n \"bash\",\n \"zsh\",\n \"sh\",\n \"csh\",\n \"ksh\",\n \"tcsh\",\n \"dash\",\n \"scsh\",\n ];\n const KNOWN_SHEBANG = hljs.SHEBANG({\n binary: `(${SH_LIKE_SHELLS.join(\"|\")})`,\n relevance: 10\n });\n const FUNCTION = {\n className: 'function',\n begin: /\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,\n returnBegin: true,\n contains: [ hljs.inherit(hljs.TITLE_MODE, { begin: /\\w[\\w\\d_]*/ }) ],\n relevance: 0\n };\n\n const KEYWORDS = [\n \"if\",\n \"then\",\n \"else\",\n \"elif\",\n \"fi\",\n \"time\",\n \"for\",\n \"while\",\n \"until\",\n \"in\",\n \"do\",\n \"done\",\n \"case\",\n \"esac\",\n \"coproc\",\n \"function\",\n \"select\"\n ];\n\n const LITERALS = [\n \"true\",\n \"false\"\n ];\n\n // to consume paths to prevent keyword matches inside them\n const PATH_MODE = { match: /(\\/[a-z._-]+)+/ };\n\n // http://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html\n const SHELL_BUILT_INS = [\n \"break\",\n \"cd\",\n \"continue\",\n \"eval\",\n \"exec\",\n \"exit\",\n \"export\",\n \"getopts\",\n \"hash\",\n \"pwd\",\n \"readonly\",\n \"return\",\n \"shift\",\n \"test\",\n \"times\",\n \"trap\",\n \"umask\",\n \"unset\"\n ];\n\n const BASH_BUILT_INS = [\n \"alias\",\n \"bind\",\n \"builtin\",\n \"caller\",\n \"command\",\n \"declare\",\n \"echo\",\n \"enable\",\n \"help\",\n \"let\",\n \"local\",\n \"logout\",\n \"mapfile\",\n \"printf\",\n \"read\",\n \"readarray\",\n \"source\",\n \"sudo\",\n \"type\",\n \"typeset\",\n \"ulimit\",\n \"unalias\"\n ];\n\n const ZSH_BUILT_INS = [\n \"autoload\",\n \"bg\",\n \"bindkey\",\n \"bye\",\n \"cap\",\n \"chdir\",\n \"clone\",\n \"comparguments\",\n \"compcall\",\n \"compctl\",\n \"compdescribe\",\n \"compfiles\",\n \"compgroups\",\n \"compquote\",\n \"comptags\",\n \"comptry\",\n \"compvalues\",\n \"dirs\",\n \"disable\",\n \"disown\",\n \"echotc\",\n \"echoti\",\n \"emulate\",\n \"fc\",\n \"fg\",\n \"float\",\n \"functions\",\n \"getcap\",\n \"getln\",\n \"history\",\n \"integer\",\n \"jobs\",\n \"kill\",\n \"limit\",\n \"log\",\n \"noglob\",\n \"popd\",\n \"print\",\n \"pushd\",\n \"pushln\",\n \"rehash\",\n \"sched\",\n \"setcap\",\n \"setopt\",\n \"stat\",\n \"suspend\",\n \"ttyctl\",\n \"unfunction\",\n \"unhash\",\n \"unlimit\",\n \"unsetopt\",\n \"vared\",\n \"wait\",\n \"whence\",\n \"where\",\n \"which\",\n \"zcompile\",\n \"zformat\",\n \"zftp\",\n \"zle\",\n \"zmodload\",\n \"zparseopts\",\n \"zprof\",\n \"zpty\",\n \"zregexparse\",\n \"zsocket\",\n \"zstyle\",\n \"ztcp\"\n ];\n\n const GNU_CORE_UTILS = [\n \"chcon\",\n \"chgrp\",\n \"chown\",\n \"chmod\",\n \"cp\",\n \"dd\",\n \"df\",\n \"dir\",\n \"dircolors\",\n \"ln\",\n \"ls\",\n \"mkdir\",\n \"mkfifo\",\n \"mknod\",\n \"mktemp\",\n \"mv\",\n \"realpath\",\n \"rm\",\n \"rmdir\",\n \"shred\",\n \"sync\",\n \"touch\",\n \"truncate\",\n \"vdir\",\n \"b2sum\",\n \"base32\",\n \"base64\",\n \"cat\",\n \"cksum\",\n \"comm\",\n \"csplit\",\n \"cut\",\n \"expand\",\n \"fmt\",\n \"fold\",\n \"head\",\n \"join\",\n \"md5sum\",\n \"nl\",\n \"numfmt\",\n \"od\",\n \"paste\",\n \"ptx\",\n \"pr\",\n \"sha1sum\",\n \"sha224sum\",\n \"sha256sum\",\n \"sha384sum\",\n \"sha512sum\",\n \"shuf\",\n \"sort\",\n \"split\",\n \"sum\",\n \"tac\",\n \"tail\",\n \"tr\",\n \"tsort\",\n \"unexpand\",\n \"uniq\",\n \"wc\",\n \"arch\",\n \"basename\",\n \"chroot\",\n \"date\",\n \"dirname\",\n \"du\",\n \"echo\",\n \"env\",\n \"expr\",\n \"factor\",\n // \"false\", // keyword literal already\n \"groups\",\n \"hostid\",\n \"id\",\n \"link\",\n \"logname\",\n \"nice\",\n \"nohup\",\n \"nproc\",\n \"pathchk\",\n \"pinky\",\n \"printenv\",\n \"printf\",\n \"pwd\",\n \"readlink\",\n \"runcon\",\n \"seq\",\n \"sleep\",\n \"stat\",\n \"stdbuf\",\n \"stty\",\n \"tee\",\n \"test\",\n \"timeout\",\n // \"true\", // keyword literal already\n \"tty\",\n \"uname\",\n \"unlink\",\n \"uptime\",\n \"users\",\n \"who\",\n \"whoami\",\n \"yes\"\n ];\n\n return {\n name: 'Bash',\n aliases: [\n 'sh',\n 'zsh'\n ],\n keywords: {\n $pattern: /\\b[a-z][a-z0-9._-]+\\b/,\n keyword: KEYWORDS,\n literal: LITERALS,\n built_in: [\n ...SHELL_BUILT_INS,\n ...BASH_BUILT_INS,\n // Shell modifiers\n \"set\",\n \"shopt\",\n ...ZSH_BUILT_INS,\n ...GNU_CORE_UTILS\n ]\n },\n contains: [\n KNOWN_SHEBANG, // to catch known shells and boost relevancy\n hljs.SHEBANG(), // to catch unknown shells but still highlight the shebang\n FUNCTION,\n ARITHMETIC,\n COMMENT,\n HERE_DOC,\n PATH_MODE,\n QUOTE_STRING,\n ESCAPED_QUOTE,\n APOS_STRING,\n ESCAPED_APOS,\n VAR\n ]\n };\n}\n\nexport { bash as default };\n","/*\nLanguage: C#\nAuthor: Jason Diamond \nContributor: Nicolas LLOBERA , Pieter Vantorre , David Pine \nWebsite: https://docs.microsoft.com/dotnet/csharp/\nCategory: common\n*/\n\n/** @type LanguageFn */\nfunction csharp(hljs) {\n const BUILT_IN_KEYWORDS = [\n 'bool',\n 'byte',\n 'char',\n 'decimal',\n 'delegate',\n 'double',\n 'dynamic',\n 'enum',\n 'float',\n 'int',\n 'long',\n 'nint',\n 'nuint',\n 'object',\n 'sbyte',\n 'short',\n 'string',\n 'ulong',\n 'uint',\n 'ushort'\n ];\n const FUNCTION_MODIFIERS = [\n 'public',\n 'private',\n 'protected',\n 'static',\n 'internal',\n 'protected',\n 'abstract',\n 'async',\n 'extern',\n 'override',\n 'unsafe',\n 'virtual',\n 'new',\n 'sealed',\n 'partial'\n ];\n const LITERAL_KEYWORDS = [\n 'default',\n 'false',\n 'null',\n 'true'\n ];\n const NORMAL_KEYWORDS = [\n 'abstract',\n 'as',\n 'base',\n 'break',\n 'case',\n 'catch',\n 'class',\n 'const',\n 'continue',\n 'do',\n 'else',\n 'event',\n 'explicit',\n 'extern',\n 'finally',\n 'fixed',\n 'for',\n 'foreach',\n 'goto',\n 'if',\n 'implicit',\n 'in',\n 'interface',\n 'internal',\n 'is',\n 'lock',\n 'namespace',\n 'new',\n 'operator',\n 'out',\n 'override',\n 'params',\n 'private',\n 'protected',\n 'public',\n 'readonly',\n 'record',\n 'ref',\n 'return',\n 'scoped',\n 'sealed',\n 'sizeof',\n 'stackalloc',\n 'static',\n 'struct',\n 'switch',\n 'this',\n 'throw',\n 'try',\n 'typeof',\n 'unchecked',\n 'unsafe',\n 'using',\n 'virtual',\n 'void',\n 'volatile',\n 'while'\n ];\n const CONTEXTUAL_KEYWORDS = [\n 'add',\n 'alias',\n 'and',\n 'ascending',\n 'args',\n 'async',\n 'await',\n 'by',\n 'descending',\n 'dynamic',\n 'equals',\n 'file',\n 'from',\n 'get',\n 'global',\n 'group',\n 'init',\n 'into',\n 'join',\n 'let',\n 'nameof',\n 'not',\n 'notnull',\n 'on',\n 'or',\n 'orderby',\n 'partial',\n 'record',\n 'remove',\n 'required',\n 'scoped',\n 'select',\n 'set',\n 'unmanaged',\n 'value|0',\n 'var',\n 'when',\n 'where',\n 'with',\n 'yield'\n ];\n\n const KEYWORDS = {\n keyword: NORMAL_KEYWORDS.concat(CONTEXTUAL_KEYWORDS),\n built_in: BUILT_IN_KEYWORDS,\n literal: LITERAL_KEYWORDS\n };\n const TITLE_MODE = hljs.inherit(hljs.TITLE_MODE, { begin: '[a-zA-Z](\\\\.?\\\\w)*' });\n const NUMBERS = {\n className: 'number',\n variants: [\n { begin: '\\\\b(0b[01\\']+)' },\n { begin: '(-?)\\\\b([\\\\d\\']+(\\\\.[\\\\d\\']*)?|\\\\.[\\\\d\\']+)(u|U|l|L|ul|UL|f|F|b|B)' },\n { begin: '(-?)(\\\\b0[xX][a-fA-F0-9\\']+|(\\\\b[\\\\d\\']+(\\\\.[\\\\d\\']*)?|\\\\.[\\\\d\\']+)([eE][-+]?[\\\\d\\']+)?)' }\n ],\n relevance: 0\n };\n const RAW_STRING = {\n className: 'string',\n begin: /\"\"\"(\"*)(?!\")(.|\\n)*?\"\"\"\\1/,\n relevance: 1\n };\n const VERBATIM_STRING = {\n className: 'string',\n begin: '@\"',\n end: '\"',\n contains: [ { begin: '\"\"' } ]\n };\n const VERBATIM_STRING_NO_LF = hljs.inherit(VERBATIM_STRING, { illegal: /\\n/ });\n const SUBST = {\n className: 'subst',\n begin: /\\{/,\n end: /\\}/,\n keywords: KEYWORDS\n };\n const SUBST_NO_LF = hljs.inherit(SUBST, { illegal: /\\n/ });\n const INTERPOLATED_STRING = {\n className: 'string',\n begin: /\\$\"/,\n end: '\"',\n illegal: /\\n/,\n contains: [\n { begin: /\\{\\{/ },\n { begin: /\\}\\}/ },\n hljs.BACKSLASH_ESCAPE,\n SUBST_NO_LF\n ]\n };\n const INTERPOLATED_VERBATIM_STRING = {\n className: 'string',\n begin: /\\$@\"/,\n end: '\"',\n contains: [\n { begin: /\\{\\{/ },\n { begin: /\\}\\}/ },\n { begin: '\"\"' },\n SUBST\n ]\n };\n const INTERPOLATED_VERBATIM_STRING_NO_LF = hljs.inherit(INTERPOLATED_VERBATIM_STRING, {\n illegal: /\\n/,\n contains: [\n { begin: /\\{\\{/ },\n { begin: /\\}\\}/ },\n { begin: '\"\"' },\n SUBST_NO_LF\n ]\n });\n SUBST.contains = [\n INTERPOLATED_VERBATIM_STRING,\n INTERPOLATED_STRING,\n VERBATIM_STRING,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n NUMBERS,\n hljs.C_BLOCK_COMMENT_MODE\n ];\n SUBST_NO_LF.contains = [\n INTERPOLATED_VERBATIM_STRING_NO_LF,\n INTERPOLATED_STRING,\n VERBATIM_STRING_NO_LF,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE,\n NUMBERS,\n hljs.inherit(hljs.C_BLOCK_COMMENT_MODE, { illegal: /\\n/ })\n ];\n const STRING = { variants: [\n RAW_STRING,\n INTERPOLATED_VERBATIM_STRING,\n INTERPOLATED_STRING,\n VERBATIM_STRING,\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE\n ] };\n\n const GENERIC_MODIFIER = {\n begin: \"<\",\n end: \">\",\n contains: [\n { beginKeywords: \"in out\" },\n TITLE_MODE\n ]\n };\n const TYPE_IDENT_RE = hljs.IDENT_RE + '(<' + hljs.IDENT_RE + '(\\\\s*,\\\\s*' + hljs.IDENT_RE + ')*>)?(\\\\[\\\\])?';\n const AT_IDENTIFIER = {\n // prevents expressions like `@class` from incorrect flagging\n // `class` as a keyword\n begin: \"@\" + hljs.IDENT_RE,\n relevance: 0\n };\n\n return {\n name: 'C#',\n aliases: [\n 'cs',\n 'c#'\n ],\n keywords: KEYWORDS,\n illegal: /::/,\n contains: [\n hljs.COMMENT(\n '///',\n '$',\n {\n returnBegin: true,\n contains: [\n {\n className: 'doctag',\n variants: [\n {\n begin: '///',\n relevance: 0\n },\n { begin: '' },\n {\n begin: ''\n }\n ]\n }\n ]\n }\n ),\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE,\n {\n className: 'meta',\n begin: '#',\n end: '$',\n keywords: { keyword: 'if else elif endif define undef warning error line region endregion pragma checksum' }\n },\n STRING,\n NUMBERS,\n {\n beginKeywords: 'class interface',\n relevance: 0,\n end: /[{;=]/,\n illegal: /[^\\s:,]/,\n contains: [\n { beginKeywords: \"where class\" },\n TITLE_MODE,\n GENERIC_MODIFIER,\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE\n ]\n },\n {\n beginKeywords: 'namespace',\n relevance: 0,\n end: /[{;=]/,\n illegal: /[^\\s:]/,\n contains: [\n TITLE_MODE,\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE\n ]\n },\n {\n beginKeywords: 'record',\n relevance: 0,\n end: /[{;=]/,\n illegal: /[^\\s:]/,\n contains: [\n TITLE_MODE,\n GENERIC_MODIFIER,\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE\n ]\n },\n {\n // [Attributes(\"\")]\n className: 'meta',\n begin: '^\\\\s*\\\\[(?=[\\\\w])',\n excludeBegin: true,\n end: '\\\\]',\n excludeEnd: true,\n contains: [\n {\n className: 'string',\n begin: /\"/,\n end: /\"/\n }\n ]\n },\n {\n // Expression keywords prevent 'keyword Name(...)' from being\n // recognized as a function definition\n beginKeywords: 'new return throw await else',\n relevance: 0\n },\n {\n className: 'function',\n begin: '(' + TYPE_IDENT_RE + '\\\\s+)+' + hljs.IDENT_RE + '\\\\s*(<[^=]+>\\\\s*)?\\\\(',\n returnBegin: true,\n end: /\\s*[{;=]/,\n excludeEnd: true,\n keywords: KEYWORDS,\n contains: [\n // prevents these from being highlighted `title`\n {\n beginKeywords: FUNCTION_MODIFIERS.join(\" \"),\n relevance: 0\n },\n {\n begin: hljs.IDENT_RE + '\\\\s*(<[^=]+>\\\\s*)?\\\\(',\n returnBegin: true,\n contains: [\n hljs.TITLE_MODE,\n GENERIC_MODIFIER\n ],\n relevance: 0\n },\n { match: /\\(\\)/ },\n {\n className: 'params',\n begin: /\\(/,\n end: /\\)/,\n excludeBegin: true,\n excludeEnd: true,\n keywords: KEYWORDS,\n relevance: 0,\n contains: [\n STRING,\n NUMBERS,\n hljs.C_BLOCK_COMMENT_MODE\n ]\n },\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE\n ]\n },\n AT_IDENTIFIER\n ]\n };\n}\n\nexport { csharp as default };\n","/*\nLanguage: HTTP\nDescription: HTTP request and response headers with automatic body highlighting\nAuthor: Ivan Sagalaev \nCategory: protocols, web\nWebsite: https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview\n*/\n\nfunction http(hljs) {\n const regex = hljs.regex;\n const VERSION = 'HTTP/([32]|1\\\\.[01])';\n const HEADER_NAME = /[A-Za-z][A-Za-z0-9-]*/;\n const HEADER = {\n className: 'attribute',\n begin: regex.concat('^', HEADER_NAME, '(?=\\\\:\\\\s)'),\n starts: { contains: [\n {\n className: \"punctuation\",\n begin: /: /,\n relevance: 0,\n starts: {\n end: '$',\n relevance: 0\n }\n }\n ] }\n };\n const HEADERS_AND_BODY = [\n HEADER,\n {\n begin: '\\\\n\\\\n',\n starts: {\n subLanguage: [],\n endsWithParent: true\n }\n }\n ];\n\n return {\n name: 'HTTP',\n aliases: [ 'https' ],\n illegal: /\\S/,\n contains: [\n // response\n {\n begin: '^(?=' + VERSION + \" \\\\d{3})\",\n end: /$/,\n contains: [\n {\n className: \"meta\",\n begin: VERSION\n },\n {\n className: 'number',\n begin: '\\\\b\\\\d{3}\\\\b'\n }\n ],\n starts: {\n end: /\\b\\B/,\n illegal: /\\S/,\n contains: HEADERS_AND_BODY\n }\n },\n // request\n {\n begin: '(?=^[A-Z]+ (.*?) ' + VERSION + '$)',\n end: /$/,\n contains: [\n {\n className: 'string',\n begin: ' ',\n end: ' ',\n excludeBegin: true,\n excludeEnd: true\n },\n {\n className: \"meta\",\n begin: VERSION\n },\n {\n className: 'keyword',\n begin: '[A-Z]+'\n }\n ],\n starts: {\n end: /\\b\\B/,\n illegal: /\\S/,\n contains: HEADERS_AND_BODY\n }\n },\n // to allow headers to work even without a preamble\n hljs.inherit(HEADER, { relevance: 0 })\n ]\n };\n}\n\nexport { http as default };\n","/*\nLanguage: JSON\nDescription: JSON (JavaScript Object Notation) is a lightweight data-interchange format.\nAuthor: Ivan Sagalaev \nWebsite: http://www.json.org\nCategory: common, protocols, web\n*/\n\nfunction json(hljs) {\n const ATTRIBUTE = {\n className: 'attr',\n begin: /\"(\\\\.|[^\\\\\"\\r\\n])*\"(?=\\s*:)/,\n relevance: 1.01\n };\n const PUNCTUATION = {\n match: /[{}[\\],:]/,\n className: \"punctuation\",\n relevance: 0\n };\n const LITERALS = [\n \"true\",\n \"false\",\n \"null\"\n ];\n // NOTE: normally we would rely on `keywords` for this but using a mode here allows us\n // - to use the very tight `illegal: \\S` rule later to flag any other character\n // - as illegal indicating that despite looking like JSON we do not truly have\n // - JSON and thus improve false-positively greatly since JSON will try and claim\n // - all sorts of JSON looking stuff\n const LITERALS_MODE = {\n scope: \"literal\",\n beginKeywords: LITERALS.join(\" \"),\n };\n\n return {\n name: 'JSON',\n aliases: ['jsonc'],\n keywords:{\n literal: LITERALS,\n },\n contains: [\n ATTRIBUTE,\n PUNCTUATION,\n hljs.QUOTE_STRING_MODE,\n LITERALS_MODE,\n hljs.C_NUMBER_MODE,\n hljs.C_LINE_COMMENT_MODE,\n hljs.C_BLOCK_COMMENT_MODE\n ],\n illegal: '\\\\S'\n };\n}\n\nexport { json as default };\n","/*\nLanguage: Julia\nDescription: Julia is a high-level, high-performance, dynamic programming language.\nAuthor: Kenta Sato \nContributors: Alex Arslan , Fredrik Ekre \nWebsite: https://julialang.org\nCategory: scientific\n*/\n\nfunction julia(hljs) {\n // Since there are numerous special names in Julia, it is too much trouble\n // to maintain them by hand. Hence these names (i.e. keywords, literals and\n // built-ins) are automatically generated from Julia 1.5.2 itself through\n // the following scripts for each.\n\n // ref: https://docs.julialang.org/en/v1/manual/variables/#Allowed-Variable-Names\n const VARIABLE_NAME_RE = '[A-Za-z_\\\\u00A1-\\\\uFFFF][A-Za-z_0-9\\\\u00A1-\\\\uFFFF]*';\n\n // # keyword generator, multi-word keywords handled manually below (Julia 1.5.2)\n // import REPL.REPLCompletions\n // res = String[\"in\", \"isa\", \"where\"]\n // for kw in collect(x.keyword for x in REPLCompletions.complete_keyword(\"\"))\n // if !(contains(kw, \" \") || kw == \"struct\")\n // push!(res, kw)\n // end\n // end\n // sort!(unique!(res))\n // foreach(x -> println(\"\\'\", x, \"\\',\"), res)\n const KEYWORD_LIST = [\n 'baremodule',\n 'begin',\n 'break',\n 'catch',\n 'ccall',\n 'const',\n 'continue',\n 'do',\n 'else',\n 'elseif',\n 'end',\n 'export',\n 'false',\n 'finally',\n 'for',\n 'function',\n 'global',\n 'if',\n 'import',\n 'in',\n 'isa',\n 'let',\n 'local',\n 'macro',\n 'module',\n 'quote',\n 'return',\n 'true',\n 'try',\n 'using',\n 'where',\n 'while',\n ];\n\n // # literal generator (Julia 1.5.2)\n // import REPL.REPLCompletions\n // res = String[\"true\", \"false\"]\n // for compl in filter!(x -> isa(x, REPLCompletions.ModuleCompletion) && (x.parent === Base || x.parent === Core),\n // REPLCompletions.completions(\"\", 0)[1])\n // try\n // v = eval(Symbol(compl.mod))\n // if !(v isa Function || v isa Type || v isa TypeVar || v isa Module || v isa Colon)\n // push!(res, compl.mod)\n // end\n // catch e\n // end\n // end\n // sort!(unique!(res))\n // foreach(x -> println(\"\\'\", x, \"\\',\"), res)\n const LITERAL_LIST = [\n 'ARGS',\n 'C_NULL',\n 'DEPOT_PATH',\n 'ENDIAN_BOM',\n 'ENV',\n 'Inf',\n 'Inf16',\n 'Inf32',\n 'Inf64',\n 'InsertionSort',\n 'LOAD_PATH',\n 'MergeSort',\n 'NaN',\n 'NaN16',\n 'NaN32',\n 'NaN64',\n 'PROGRAM_FILE',\n 'QuickSort',\n 'RoundDown',\n 'RoundFromZero',\n 'RoundNearest',\n 'RoundNearestTiesAway',\n 'RoundNearestTiesUp',\n 'RoundToZero',\n 'RoundUp',\n 'VERSION|0',\n 'devnull',\n 'false',\n 'im',\n 'missing',\n 'nothing',\n 'pi',\n 'stderr',\n 'stdin',\n 'stdout',\n 'true',\n 'undef',\n 'π',\n 'ℯ',\n ];\n\n // # built_in generator (Julia 1.5.2)\n // import REPL.REPLCompletions\n // res = String[]\n // for compl in filter!(x -> isa(x, REPLCompletions.ModuleCompletion) && (x.parent === Base || x.parent === Core),\n // REPLCompletions.completions(\"\", 0)[1])\n // try\n // v = eval(Symbol(compl.mod))\n // if (v isa Type || v isa TypeVar) && (compl.mod != \"=>\")\n // push!(res, compl.mod)\n // end\n // catch e\n // end\n // end\n // sort!(unique!(res))\n // foreach(x -> println(\"\\'\", x, \"\\',\"), res)\n const BUILT_IN_LIST = [\n 'AbstractArray',\n 'AbstractChannel',\n 'AbstractChar',\n 'AbstractDict',\n 'AbstractDisplay',\n 'AbstractFloat',\n 'AbstractIrrational',\n 'AbstractMatrix',\n 'AbstractRange',\n 'AbstractSet',\n 'AbstractString',\n 'AbstractUnitRange',\n 'AbstractVecOrMat',\n 'AbstractVector',\n 'Any',\n 'ArgumentError',\n 'Array',\n 'AssertionError',\n 'BigFloat',\n 'BigInt',\n 'BitArray',\n 'BitMatrix',\n 'BitSet',\n 'BitVector',\n 'Bool',\n 'BoundsError',\n 'CapturedException',\n 'CartesianIndex',\n 'CartesianIndices',\n 'Cchar',\n 'Cdouble',\n 'Cfloat',\n 'Channel',\n 'Char',\n 'Cint',\n 'Cintmax_t',\n 'Clong',\n 'Clonglong',\n 'Cmd',\n 'Colon',\n 'Complex',\n 'ComplexF16',\n 'ComplexF32',\n 'ComplexF64',\n 'CompositeException',\n 'Condition',\n 'Cptrdiff_t',\n 'Cshort',\n 'Csize_t',\n 'Cssize_t',\n 'Cstring',\n 'Cuchar',\n 'Cuint',\n 'Cuintmax_t',\n 'Culong',\n 'Culonglong',\n 'Cushort',\n 'Cvoid',\n 'Cwchar_t',\n 'Cwstring',\n 'DataType',\n 'DenseArray',\n 'DenseMatrix',\n 'DenseVecOrMat',\n 'DenseVector',\n 'Dict',\n 'DimensionMismatch',\n 'Dims',\n 'DivideError',\n 'DomainError',\n 'EOFError',\n 'Enum',\n 'ErrorException',\n 'Exception',\n 'ExponentialBackOff',\n 'Expr',\n 'Float16',\n 'Float32',\n 'Float64',\n 'Function',\n 'GlobalRef',\n 'HTML',\n 'IO',\n 'IOBuffer',\n 'IOContext',\n 'IOStream',\n 'IdDict',\n 'IndexCartesian',\n 'IndexLinear',\n 'IndexStyle',\n 'InexactError',\n 'InitError',\n 'Int',\n 'Int128',\n 'Int16',\n 'Int32',\n 'Int64',\n 'Int8',\n 'Integer',\n 'InterruptException',\n 'InvalidStateException',\n 'Irrational',\n 'KeyError',\n 'LinRange',\n 'LineNumberNode',\n 'LinearIndices',\n 'LoadError',\n 'MIME',\n 'Matrix',\n 'Method',\n 'MethodError',\n 'Missing',\n 'MissingException',\n 'Module',\n 'NTuple',\n 'NamedTuple',\n 'Nothing',\n 'Number',\n 'OrdinalRange',\n 'OutOfMemoryError',\n 'OverflowError',\n 'Pair',\n 'PartialQuickSort',\n 'PermutedDimsArray',\n 'Pipe',\n 'ProcessFailedException',\n 'Ptr',\n 'QuoteNode',\n 'Rational',\n 'RawFD',\n 'ReadOnlyMemoryError',\n 'Real',\n 'ReentrantLock',\n 'Ref',\n 'Regex',\n 'RegexMatch',\n 'RoundingMode',\n 'SegmentationFault',\n 'Set',\n 'Signed',\n 'Some',\n 'StackOverflowError',\n 'StepRange',\n 'StepRangeLen',\n 'StridedArray',\n 'StridedMatrix',\n 'StridedVecOrMat',\n 'StridedVector',\n 'String',\n 'StringIndexError',\n 'SubArray',\n 'SubString',\n 'SubstitutionString',\n 'Symbol',\n 'SystemError',\n 'Task',\n 'TaskFailedException',\n 'Text',\n 'TextDisplay',\n 'Timer',\n 'Tuple',\n 'Type',\n 'TypeError',\n 'TypeVar',\n 'UInt',\n 'UInt128',\n 'UInt16',\n 'UInt32',\n 'UInt64',\n 'UInt8',\n 'UndefInitializer',\n 'UndefKeywordError',\n 'UndefRefError',\n 'UndefVarError',\n 'Union',\n 'UnionAll',\n 'UnitRange',\n 'Unsigned',\n 'Val',\n 'Vararg',\n 'VecElement',\n 'VecOrMat',\n 'Vector',\n 'VersionNumber',\n 'WeakKeyDict',\n 'WeakRef',\n ];\n\n const KEYWORDS = {\n $pattern: VARIABLE_NAME_RE,\n keyword: KEYWORD_LIST,\n literal: LITERAL_LIST,\n built_in: BUILT_IN_LIST,\n };\n\n // placeholder for recursive self-reference\n const DEFAULT = {\n keywords: KEYWORDS,\n illegal: /<\\//\n };\n\n // ref: https://docs.julialang.org/en/v1/manual/integers-and-floating-point-numbers/\n const NUMBER = {\n className: 'number',\n // supported numeric literals:\n // * binary literal (e.g. 0x10)\n // * octal literal (e.g. 0o76543210)\n // * hexadecimal literal (e.g. 0xfedcba876543210)\n // * hexadecimal floating point literal (e.g. 0x1p0, 0x1.2p2)\n // * decimal literal (e.g. 9876543210, 100_000_000)\n // * floating pointe literal (e.g. 1.2, 1.2f, .2, 1., 1.2e10, 1.2e-10)\n begin: /(\\b0x[\\d_]*(\\.[\\d_]*)?|0x\\.\\d[\\d_]*)p[-+]?\\d+|\\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\\b\\d[\\d_]*(\\.[\\d_]*)?|\\.\\d[\\d_]*)([eEfF][-+]?\\d+)?/,\n relevance: 0\n };\n\n const CHAR = {\n className: 'string',\n begin: /'(.|\\\\[xXuU][a-zA-Z0-9]+)'/\n };\n\n const INTERPOLATION = {\n className: 'subst',\n begin: /\\$\\(/,\n end: /\\)/,\n keywords: KEYWORDS\n };\n\n const INTERPOLATED_VARIABLE = {\n className: 'variable',\n begin: '\\\\$' + VARIABLE_NAME_RE\n };\n\n // TODO: neatly escape normal code in string literal\n const STRING = {\n className: 'string',\n contains: [\n hljs.BACKSLASH_ESCAPE,\n INTERPOLATION,\n INTERPOLATED_VARIABLE\n ],\n variants: [\n {\n begin: /\\w*\"\"\"/,\n end: /\"\"\"\\w*/,\n relevance: 10\n },\n {\n begin: /\\w*\"/,\n end: /\"\\w*/\n }\n ]\n };\n\n const COMMAND = {\n className: 'string',\n contains: [\n hljs.BACKSLASH_ESCAPE,\n INTERPOLATION,\n INTERPOLATED_VARIABLE\n ],\n begin: '`',\n end: '`'\n };\n\n const MACROCALL = {\n className: 'meta',\n begin: '@' + VARIABLE_NAME_RE\n };\n\n const COMMENT = {\n className: 'comment',\n variants: [\n {\n begin: '#=',\n end: '=#',\n relevance: 10\n },\n {\n begin: '#',\n end: '$'\n }\n ]\n };\n\n DEFAULT.name = 'Julia';\n DEFAULT.contains = [\n NUMBER,\n CHAR,\n STRING,\n COMMAND,\n MACROCALL,\n COMMENT,\n hljs.HASH_COMMENT_MODE,\n {\n className: 'keyword',\n begin:\n '\\\\b(((abstract|primitive)\\\\s+)type|(mutable\\\\s+)?struct)\\\\b'\n },\n { begin: /<:/ } // relevance booster\n ];\n INTERPOLATION.contains = DEFAULT.contains;\n\n return DEFAULT;\n}\n\nexport { julia as default };\n","/*\nLanguage: Markdown\nRequires: xml.js\nAuthor: John Crepezzi \nWebsite: https://daringfireball.net/projects/markdown/\nCategory: common, markup\n*/\n\nfunction markdown(hljs) {\n const regex = hljs.regex;\n const INLINE_HTML = {\n begin: /<\\/?[A-Za-z_]/,\n end: '>',\n subLanguage: 'xml',\n relevance: 0\n };\n const HORIZONTAL_RULE = {\n begin: '^[-\\\\*]{3,}',\n end: '$'\n };\n const CODE = {\n className: 'code',\n variants: [\n // TODO: fix to allow these to work with sublanguage also\n { begin: '(`{3,})[^`](.|\\\\n)*?\\\\1`*[ ]*' },\n { begin: '(~{3,})[^~](.|\\\\n)*?\\\\1~*[ ]*' },\n // needed to allow markdown as a sublanguage to work\n {\n begin: '```',\n end: '```+[ ]*$'\n },\n {\n begin: '~~~',\n end: '~~~+[ ]*$'\n },\n { begin: '`.+?`' },\n {\n begin: '(?=^( {4}|\\\\t))',\n // use contains to gobble up multiple lines to allow the block to be whatever size\n // but only have a single open/close tag vs one per line\n contains: [\n {\n begin: '^( {4}|\\\\t)',\n end: '(\\\\n)$'\n }\n ],\n relevance: 0\n }\n ]\n };\n const LIST = {\n className: 'bullet',\n begin: '^[ \\t]*([*+-]|(\\\\d+\\\\.))(?=\\\\s+)',\n end: '\\\\s+',\n excludeEnd: true\n };\n const LINK_REFERENCE = {\n begin: /^\\[[^\\n]+\\]:/,\n returnBegin: true,\n contains: [\n {\n className: 'symbol',\n begin: /\\[/,\n end: /\\]/,\n excludeBegin: true,\n excludeEnd: true\n },\n {\n className: 'link',\n begin: /:\\s*/,\n end: /$/,\n excludeBegin: true\n }\n ]\n };\n const URL_SCHEME = /[A-Za-z][A-Za-z0-9+.-]*/;\n const LINK = {\n variants: [\n // too much like nested array access in so many languages\n // to have any real relevance\n {\n begin: /\\[.+?\\]\\[.*?\\]/,\n relevance: 0\n },\n // popular internet URLs\n {\n begin: /\\[.+?\\]\\(((data|javascript|mailto):|(?:http|ftp)s?:\\/\\/).*?\\)/,\n relevance: 2\n },\n {\n begin: regex.concat(/\\[.+?\\]\\(/, URL_SCHEME, /:\\/\\/.*?\\)/),\n relevance: 2\n },\n // relative urls\n {\n begin: /\\[.+?\\]\\([./?&#].*?\\)/,\n relevance: 1\n },\n // whatever else, lower relevance (might not be a link at all)\n {\n begin: /\\[.*?\\]\\(.*?\\)/,\n relevance: 0\n }\n ],\n returnBegin: true,\n contains: [\n {\n // empty strings for alt or link text\n match: /\\[(?=\\])/ },\n {\n className: 'string',\n relevance: 0,\n begin: '\\\\[',\n end: '\\\\]',\n excludeBegin: true,\n returnEnd: true\n },\n {\n className: 'link',\n relevance: 0,\n begin: '\\\\]\\\\(',\n end: '\\\\)',\n excludeBegin: true,\n excludeEnd: true\n },\n {\n className: 'symbol',\n relevance: 0,\n begin: '\\\\]\\\\[',\n end: '\\\\]',\n excludeBegin: true,\n excludeEnd: true\n }\n ]\n };\n const BOLD = {\n className: 'strong',\n contains: [], // defined later\n variants: [\n {\n begin: /_{2}(?!\\s)/,\n end: /_{2}/\n },\n {\n begin: /\\*{2}(?!\\s)/,\n end: /\\*{2}/\n }\n ]\n };\n const ITALIC = {\n className: 'emphasis',\n contains: [], // defined later\n variants: [\n {\n begin: /\\*(?![*\\s])/,\n end: /\\*/\n },\n {\n begin: /_(?![_\\s])/,\n end: /_/,\n relevance: 0\n }\n ]\n };\n\n // 3 level deep nesting is not allowed because it would create confusion\n // in cases like `***testing***` because where we don't know if the last\n // `***` is starting a new bold/italic or finishing the last one\n const BOLD_WITHOUT_ITALIC = hljs.inherit(BOLD, { contains: [] });\n const ITALIC_WITHOUT_BOLD = hljs.inherit(ITALIC, { contains: [] });\n BOLD.contains.push(ITALIC_WITHOUT_BOLD);\n ITALIC.contains.push(BOLD_WITHOUT_ITALIC);\n\n let CONTAINABLE = [\n INLINE_HTML,\n LINK\n ];\n\n [\n BOLD,\n ITALIC,\n BOLD_WITHOUT_ITALIC,\n ITALIC_WITHOUT_BOLD\n ].forEach(m => {\n m.contains = m.contains.concat(CONTAINABLE);\n });\n\n CONTAINABLE = CONTAINABLE.concat(BOLD, ITALIC);\n\n const HEADER = {\n className: 'section',\n variants: [\n {\n begin: '^#{1,6}',\n end: '$',\n contains: CONTAINABLE\n },\n {\n begin: '(?=^.+?\\\\n[=-]{2,}$)',\n contains: [\n { begin: '^[=-]*$' },\n {\n begin: '^',\n end: \"\\\\n\",\n contains: CONTAINABLE\n }\n ]\n }\n ]\n };\n\n const BLOCKQUOTE = {\n className: 'quote',\n begin: '^>\\\\s+',\n contains: CONTAINABLE,\n end: '$'\n };\n\n const ENTITY = {\n //https://spec.commonmark.org/0.31.2/#entity-references\n scope: 'literal',\n match: /&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/\n };\n\n return {\n name: 'Markdown',\n aliases: [\n 'md',\n 'mkdown',\n 'mkd'\n ],\n contains: [\n HEADER,\n INLINE_HTML,\n LIST,\n BOLD,\n ITALIC,\n BLOCKQUOTE,\n CODE,\n HORIZONTAL_RULE,\n LINK,\n LINK_REFERENCE,\n ENTITY\n ]\n };\n}\n\nexport { markdown as default };\n","/*\nLanguage: Matlab\nAuthor: Denis Bardadym \nContributors: Eugene Nizhibitsky , Egor Rogov \nWebsite: https://www.mathworks.com/products/matlab.html\nCategory: scientific\n*/\n\n/*\n Formal syntax is not published, helpful link:\n https://github.com/kornilova-l/matlab-IntelliJ-plugin/blob/master/src/main/grammar/Matlab.bnf\n*/\nfunction matlab(hljs) {\n const TRANSPOSE_RE = '(\\'|\\\\.\\')+';\n const TRANSPOSE = {\n relevance: 0,\n contains: [ { begin: TRANSPOSE_RE } ]\n };\n\n return {\n name: 'Matlab',\n keywords: {\n keyword:\n 'arguments break case catch classdef continue else elseif end enumeration events for function '\n + 'global if methods otherwise parfor persistent properties return spmd switch try while',\n built_in:\n 'sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan '\n + 'atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot '\n + 'cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog '\n + 'realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal '\n + 'cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli '\n + 'besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma '\n + 'gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms '\n + 'nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones '\n + 'eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length '\n + 'ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril '\n + 'triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute '\n + 'shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i|0 inf nan '\n + 'isnan isinf isfinite j|0 why compan gallery hadamard hankel hilb invhilb magic pascal '\n + 'rosser toeplitz vander wilkinson max min nanmax nanmin mean nanmean type table '\n + 'readtable writetable sortrows sort figure plot plot3 scatter scatter3 cellfun '\n + 'legend intersect ismember procrustes hold num2cell '\n },\n illegal: '(//|\"|#|/\\\\*|\\\\s+/\\\\w+)',\n contains: [\n {\n className: 'function',\n beginKeywords: 'function',\n end: '$',\n contains: [\n hljs.UNDERSCORE_TITLE_MODE,\n {\n className: 'params',\n variants: [\n {\n begin: '\\\\(',\n end: '\\\\)'\n },\n {\n begin: '\\\\[',\n end: '\\\\]'\n }\n ]\n }\n ]\n },\n {\n className: 'built_in',\n begin: /true|false/,\n relevance: 0,\n starts: TRANSPOSE\n },\n {\n begin: '[a-zA-Z][a-zA-Z_0-9]*' + TRANSPOSE_RE,\n relevance: 0\n },\n {\n className: 'number',\n begin: hljs.C_NUMBER_RE,\n relevance: 0,\n starts: TRANSPOSE\n },\n {\n className: 'string',\n begin: '\\'',\n end: '\\'',\n contains: [ { begin: '\\'\\'' } ]\n },\n {\n begin: /\\]|\\}|\\)/,\n relevance: 0,\n starts: TRANSPOSE\n },\n {\n className: 'string',\n begin: '\"',\n end: '\"',\n contains: [ { begin: '\"\"' } ],\n starts: TRANSPOSE\n },\n hljs.COMMENT('^\\\\s*%\\\\{\\\\s*$', '^\\\\s*%\\\\}\\\\s*$'),\n hljs.COMMENT('%', '$')\n ]\n };\n}\n\nexport { matlab as default };\n","/*\nLanguage: Plain text\nAuthor: Egor Rogov (e.rogov@postgrespro.ru)\nDescription: Plain text without any highlighting.\nCategory: common\n*/\n\nfunction plaintext(hljs) {\n return {\n name: 'Plain text',\n aliases: [\n 'text',\n 'txt'\n ],\n disableAutodetect: true\n };\n}\n\nexport { plaintext as default };\n","/*\nLanguage: Python\nDescription: Python is an interpreted, object-oriented, high-level programming language with dynamic semantics.\nWebsite: https://www.python.org\nCategory: common\n*/\n\nfunction python(hljs) {\n const regex = hljs.regex;\n const IDENT_RE = /[\\p{XID_Start}_]\\p{XID_Continue}*/u;\n const RESERVED_WORDS = [\n 'and',\n 'as',\n 'assert',\n 'async',\n 'await',\n 'break',\n 'case',\n 'class',\n 'continue',\n 'def',\n 'del',\n 'elif',\n 'else',\n 'except',\n 'finally',\n 'for',\n 'from',\n 'global',\n 'if',\n 'import',\n 'in',\n 'is',\n 'lambda',\n 'match',\n 'nonlocal|10',\n 'not',\n 'or',\n 'pass',\n 'raise',\n 'return',\n 'try',\n 'while',\n 'with',\n 'yield'\n ];\n\n const BUILT_INS = [\n '__import__',\n 'abs',\n 'all',\n 'any',\n 'ascii',\n 'bin',\n 'bool',\n 'breakpoint',\n 'bytearray',\n 'bytes',\n 'callable',\n 'chr',\n 'classmethod',\n 'compile',\n 'complex',\n 'delattr',\n 'dict',\n 'dir',\n 'divmod',\n 'enumerate',\n 'eval',\n 'exec',\n 'filter',\n 'float',\n 'format',\n 'frozenset',\n 'getattr',\n 'globals',\n 'hasattr',\n 'hash',\n 'help',\n 'hex',\n 'id',\n 'input',\n 'int',\n 'isinstance',\n 'issubclass',\n 'iter',\n 'len',\n 'list',\n 'locals',\n 'map',\n 'max',\n 'memoryview',\n 'min',\n 'next',\n 'object',\n 'oct',\n 'open',\n 'ord',\n 'pow',\n 'print',\n 'property',\n 'range',\n 'repr',\n 'reversed',\n 'round',\n 'set',\n 'setattr',\n 'slice',\n 'sorted',\n 'staticmethod',\n 'str',\n 'sum',\n 'super',\n 'tuple',\n 'type',\n 'vars',\n 'zip'\n ];\n\n const LITERALS = [\n '__debug__',\n 'Ellipsis',\n 'False',\n 'None',\n 'NotImplemented',\n 'True'\n ];\n\n // https://docs.python.org/3/library/typing.html\n // TODO: Could these be supplemented by a CamelCase matcher in certain\n // contexts, leaving these remaining only for relevance hinting?\n const TYPES = [\n \"Any\",\n \"Callable\",\n \"Coroutine\",\n \"Dict\",\n \"List\",\n \"Literal\",\n \"Generic\",\n \"Optional\",\n \"Sequence\",\n \"Set\",\n \"Tuple\",\n \"Type\",\n \"Union\"\n ];\n\n const KEYWORDS = {\n $pattern: /[A-Za-z]\\w+|__\\w+__/,\n keyword: RESERVED_WORDS,\n built_in: BUILT_INS,\n literal: LITERALS,\n type: TYPES\n };\n\n const PROMPT = {\n className: 'meta',\n begin: /^(>>>|\\.\\.\\.) /\n };\n\n const SUBST = {\n className: 'subst',\n begin: /\\{/,\n end: /\\}/,\n keywords: KEYWORDS,\n illegal: /#/\n };\n\n const LITERAL_BRACKET = {\n begin: /\\{\\{/,\n relevance: 0\n };\n\n const STRING = {\n className: 'string',\n contains: [ hljs.BACKSLASH_ESCAPE ],\n variants: [\n {\n begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,\n end: /'''/,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n PROMPT\n ],\n relevance: 10\n },\n {\n begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?\"\"\"/,\n end: /\"\"\"/,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n PROMPT\n ],\n relevance: 10\n },\n {\n begin: /([fF][rR]|[rR][fF]|[fF])'''/,\n end: /'''/,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n PROMPT,\n LITERAL_BRACKET,\n SUBST\n ]\n },\n {\n begin: /([fF][rR]|[rR][fF]|[fF])\"\"\"/,\n end: /\"\"\"/,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n PROMPT,\n LITERAL_BRACKET,\n SUBST\n ]\n },\n {\n begin: /([uU]|[rR])'/,\n end: /'/,\n relevance: 10\n },\n {\n begin: /([uU]|[rR])\"/,\n end: /\"/,\n relevance: 10\n },\n {\n begin: /([bB]|[bB][rR]|[rR][bB])'/,\n end: /'/\n },\n {\n begin: /([bB]|[bB][rR]|[rR][bB])\"/,\n end: /\"/\n },\n {\n begin: /([fF][rR]|[rR][fF]|[fF])'/,\n end: /'/,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n LITERAL_BRACKET,\n SUBST\n ]\n },\n {\n begin: /([fF][rR]|[rR][fF]|[fF])\"/,\n end: /\"/,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n LITERAL_BRACKET,\n SUBST\n ]\n },\n hljs.APOS_STRING_MODE,\n hljs.QUOTE_STRING_MODE\n ]\n };\n\n // https://docs.python.org/3.9/reference/lexical_analysis.html#numeric-literals\n const digitpart = '[0-9](_?[0-9])*';\n const pointfloat = `(\\\\b(${digitpart}))?\\\\.(${digitpart})|\\\\b(${digitpart})\\\\.`;\n // Whitespace after a number (or any lexical token) is needed only if its absence\n // would change the tokenization\n // https://docs.python.org/3.9/reference/lexical_analysis.html#whitespace-between-tokens\n // We deviate slightly, requiring a word boundary or a keyword\n // to avoid accidentally recognizing *prefixes* (e.g., `0` in `0x41` or `08` or `0__1`)\n const lookahead = `\\\\b|${RESERVED_WORDS.join('|')}`;\n const NUMBER = {\n className: 'number',\n relevance: 0,\n variants: [\n // exponentfloat, pointfloat\n // https://docs.python.org/3.9/reference/lexical_analysis.html#floating-point-literals\n // optionally imaginary\n // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals\n // Note: no leading \\b because floats can start with a decimal point\n // and we don't want to mishandle e.g. `fn(.5)`,\n // no trailing \\b for pointfloat because it can end with a decimal point\n // and we don't want to mishandle e.g. `0..hex()`; this should be safe\n // because both MUST contain a decimal point and so cannot be confused with\n // the interior part of an identifier\n {\n begin: `(\\\\b(${digitpart})|(${pointfloat}))[eE][+-]?(${digitpart})[jJ]?(?=${lookahead})`\n },\n {\n begin: `(${pointfloat})[jJ]?`\n },\n\n // decinteger, bininteger, octinteger, hexinteger\n // https://docs.python.org/3.9/reference/lexical_analysis.html#integer-literals\n // optionally \"long\" in Python 2\n // https://docs.python.org/2.7/reference/lexical_analysis.html#integer-and-long-integer-literals\n // decinteger is optionally imaginary\n // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals\n {\n begin: `\\\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${lookahead})`\n },\n {\n begin: `\\\\b0[bB](_?[01])+[lL]?(?=${lookahead})`\n },\n {\n begin: `\\\\b0[oO](_?[0-7])+[lL]?(?=${lookahead})`\n },\n {\n begin: `\\\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${lookahead})`\n },\n\n // imagnumber (digitpart-based)\n // https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals\n {\n begin: `\\\\b(${digitpart})[jJ](?=${lookahead})`\n }\n ]\n };\n const COMMENT_TYPE = {\n className: \"comment\",\n begin: regex.lookahead(/# type:/),\n end: /$/,\n keywords: KEYWORDS,\n contains: [\n { // prevent keywords from coloring `type`\n begin: /# type:/\n },\n // comment within a datatype comment includes no keywords\n {\n begin: /#/,\n end: /\\b\\B/,\n endsWithParent: true\n }\n ]\n };\n const PARAMS = {\n className: 'params',\n variants: [\n // Exclude params in functions without params\n {\n className: \"\",\n begin: /\\(\\s*\\)/,\n skip: true\n },\n {\n begin: /\\(/,\n end: /\\)/,\n excludeBegin: true,\n excludeEnd: true,\n keywords: KEYWORDS,\n contains: [\n 'self',\n PROMPT,\n NUMBER,\n STRING,\n hljs.HASH_COMMENT_MODE\n ]\n }\n ]\n };\n SUBST.contains = [\n STRING,\n NUMBER,\n PROMPT\n ];\n\n return {\n name: 'Python',\n aliases: [\n 'py',\n 'gyp',\n 'ipython'\n ],\n unicodeRegex: true,\n keywords: KEYWORDS,\n illegal: /(<\\/|\\?)|=>/,\n contains: [\n PROMPT,\n NUMBER,\n {\n // very common convention\n scope: 'variable.language',\n match: /\\bself\\b/\n },\n {\n // eat \"if\" prior to string so that it won't accidentally be\n // labeled as an f-string\n beginKeywords: \"if\",\n relevance: 0\n },\n { match: /\\bor\\b/, scope: \"keyword\" },\n STRING,\n COMMENT_TYPE,\n hljs.HASH_COMMENT_MODE,\n {\n match: [\n /\\bdef/, /\\s+/,\n IDENT_RE,\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n contains: [ PARAMS ]\n },\n {\n variants: [\n {\n match: [\n /\\bclass/, /\\s+/,\n IDENT_RE, /\\s*/,\n /\\(\\s*/, IDENT_RE,/\\s*\\)/\n ],\n },\n {\n match: [\n /\\bclass/, /\\s+/,\n IDENT_RE\n ],\n }\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.class\",\n 6: \"title.class.inherited\",\n }\n },\n {\n className: 'meta',\n begin: /^[\\t ]*@/,\n end: /(?=#)|$/,\n contains: [\n NUMBER,\n PARAMS,\n STRING\n ]\n }\n ]\n };\n}\n\nexport { python as default };\n","/*\nLanguage: R\nDescription: R is a free software environment for statistical computing and graphics.\nAuthor: Joe Cheng \nContributors: Konrad Rudolph \nWebsite: https://www.r-project.org\nCategory: common,scientific\n*/\n\n/** @type LanguageFn */\nfunction r(hljs) {\n const regex = hljs.regex;\n // Identifiers in R cannot start with `_`, but they can start with `.` if it\n // is not immediately followed by a digit.\n // R also supports quoted identifiers, which are near-arbitrary sequences\n // delimited by backticks (`…`), which may contain escape sequences. These are\n // handled in a separate mode. See `test/markup/r/names.txt` for examples.\n // FIXME: Support Unicode identifiers.\n const IDENT_RE = /(?:(?:[a-zA-Z]|\\.[._a-zA-Z])[._a-zA-Z0-9]*)|\\.(?!\\d)/;\n const NUMBER_TYPES_RE = regex.either(\n // Special case: only hexadecimal binary powers can contain fractions\n /0[xX][0-9a-fA-F]+\\.[0-9a-fA-F]*[pP][+-]?\\d+i?/,\n // Hexadecimal numbers without fraction and optional binary power\n /0[xX][0-9a-fA-F]+(?:[pP][+-]?\\d+)?[Li]?/,\n // Decimal numbers\n /(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?[Li]?/\n );\n const OPERATORS_RE = /[=!<>:]=|\\|\\||&&|:::?|<-|<<-|->>|->|\\|>|[-+*\\/?!$&|:<=>@^~]|\\*\\*/;\n const PUNCTUATION_RE = regex.either(\n /[()]/,\n /[{}]/,\n /\\[\\[/,\n /[[\\]]/,\n /\\\\/,\n /,/\n );\n\n return {\n name: 'R',\n\n keywords: {\n $pattern: IDENT_RE,\n keyword:\n 'function if in break next repeat else for while',\n literal:\n 'NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 '\n + 'NA_character_|10 NA_complex_|10',\n built_in:\n // Builtin constants\n 'LETTERS letters month.abb month.name pi T F '\n // Primitive functions\n // These are all the functions in `base` that are implemented as a\n // `.Primitive`, minus those functions that are also keywords.\n + 'abs acos acosh all any anyNA Arg as.call as.character '\n + 'as.complex as.double as.environment as.integer as.logical '\n + 'as.null.default as.numeric as.raw asin asinh atan atanh attr '\n + 'attributes baseenv browser c call ceiling class Conj cos cosh '\n + 'cospi cummax cummin cumprod cumsum digamma dim dimnames '\n + 'emptyenv exp expression floor forceAndCall gamma gc.time '\n + 'globalenv Im interactive invisible is.array is.atomic is.call '\n + 'is.character is.complex is.double is.environment is.expression '\n + 'is.finite is.function is.infinite is.integer is.language '\n + 'is.list is.logical is.matrix is.na is.name is.nan is.null '\n + 'is.numeric is.object is.pairlist is.raw is.recursive is.single '\n + 'is.symbol lazyLoadDBfetch length lgamma list log max min '\n + 'missing Mod names nargs nzchar oldClass on.exit pos.to.env '\n + 'proc.time prod quote range Re rep retracemem return round '\n + 'seq_along seq_len seq.int sign signif sin sinh sinpi sqrt '\n + 'standardGeneric substitute sum switch tan tanh tanpi tracemem '\n + 'trigamma trunc unclass untracemem UseMethod xtfrm',\n },\n\n contains: [\n // Roxygen comments\n hljs.COMMENT(\n /#'/,\n /$/,\n { contains: [\n {\n // Handle `@examples` separately to cause all subsequent code\n // until the next `@`-tag on its own line to be kept as-is,\n // preventing highlighting. This code is example R code, so nested\n // doctags shouldn’t be treated as such. See\n // `test/markup/r/roxygen.txt` for an example.\n scope: 'doctag',\n match: /@examples/,\n starts: {\n end: regex.lookahead(regex.either(\n // end if another doc comment\n /\\n^#'\\s*(?=@[a-zA-Z]+)/,\n // or a line with no comment\n /\\n^(?!#')/\n )),\n endsParent: true\n }\n },\n {\n // Handle `@param` to highlight the parameter name following\n // after.\n scope: 'doctag',\n begin: '@param',\n end: /$/,\n contains: [\n {\n scope: 'variable',\n variants: [\n { match: IDENT_RE },\n { match: /`(?:\\\\.|[^`\\\\])+`/ }\n ],\n endsParent: true\n }\n ]\n },\n {\n scope: 'doctag',\n match: /@[a-zA-Z]+/\n },\n {\n scope: 'keyword',\n match: /\\\\[a-zA-Z]+/\n }\n ] }\n ),\n\n hljs.HASH_COMMENT_MODE,\n\n {\n scope: 'string',\n contains: [ hljs.BACKSLASH_ESCAPE ],\n variants: [\n hljs.END_SAME_AS_BEGIN({\n begin: /[rR]\"(-*)\\(/,\n end: /\\)(-*)\"/\n }),\n hljs.END_SAME_AS_BEGIN({\n begin: /[rR]\"(-*)\\{/,\n end: /\\}(-*)\"/\n }),\n hljs.END_SAME_AS_BEGIN({\n begin: /[rR]\"(-*)\\[/,\n end: /\\](-*)\"/\n }),\n hljs.END_SAME_AS_BEGIN({\n begin: /[rR]'(-*)\\(/,\n end: /\\)(-*)'/\n }),\n hljs.END_SAME_AS_BEGIN({\n begin: /[rR]'(-*)\\{/,\n end: /\\}(-*)'/\n }),\n hljs.END_SAME_AS_BEGIN({\n begin: /[rR]'(-*)\\[/,\n end: /\\](-*)'/\n }),\n {\n begin: '\"',\n end: '\"',\n relevance: 0\n },\n {\n begin: \"'\",\n end: \"'\",\n relevance: 0\n }\n ],\n },\n\n // Matching numbers immediately following punctuation and operators is\n // tricky since we need to look at the character ahead of a number to\n // ensure the number is not part of an identifier, and we cannot use\n // negative look-behind assertions. So instead we explicitly handle all\n // possible combinations of (operator|punctuation), number.\n // TODO: replace with negative look-behind when available\n // { begin: /(?\nContributors: Peter Leonov , Vasily Polovnyov , Loren Segal , Pascal Hurni , Cedric Sohrauer \nCategory: common, scripting\n*/\n\nfunction ruby(hljs) {\n const regex = hljs.regex;\n const RUBY_METHOD_RE = '([a-zA-Z_]\\\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?)';\n // TODO: move concepts like CAMEL_CASE into `modes.js`\n const CLASS_NAME_RE = regex.either(\n /\\b([A-Z]+[a-z0-9]+)+/,\n // ends in caps\n /\\b([A-Z]+[a-z0-9]+)+[A-Z]+/,\n )\n ;\n const CLASS_NAME_WITH_NAMESPACE_RE = regex.concat(CLASS_NAME_RE, /(::\\w+)*/);\n // very popular ruby built-ins that one might even assume\n // are actual keywords (despite that not being the case)\n const PSEUDO_KWS = [\n \"include\",\n \"extend\",\n \"prepend\",\n \"public\",\n \"private\",\n \"protected\",\n \"raise\",\n \"throw\"\n ];\n const RUBY_KEYWORDS = {\n \"variable.constant\": [\n \"__FILE__\",\n \"__LINE__\",\n \"__ENCODING__\"\n ],\n \"variable.language\": [\n \"self\",\n \"super\",\n ],\n keyword: [\n \"alias\",\n \"and\",\n \"begin\",\n \"BEGIN\",\n \"break\",\n \"case\",\n \"class\",\n \"defined\",\n \"do\",\n \"else\",\n \"elsif\",\n \"end\",\n \"END\",\n \"ensure\",\n \"for\",\n \"if\",\n \"in\",\n \"module\",\n \"next\",\n \"not\",\n \"or\",\n \"redo\",\n \"require\",\n \"rescue\",\n \"retry\",\n \"return\",\n \"then\",\n \"undef\",\n \"unless\",\n \"until\",\n \"when\",\n \"while\",\n \"yield\",\n ...PSEUDO_KWS\n ],\n built_in: [\n \"proc\",\n \"lambda\",\n \"attr_accessor\",\n \"attr_reader\",\n \"attr_writer\",\n \"define_method\",\n \"private_constant\",\n \"module_function\"\n ],\n literal: [\n \"true\",\n \"false\",\n \"nil\"\n ]\n };\n const YARDOCTAG = {\n className: 'doctag',\n begin: '@[A-Za-z]+'\n };\n const IRB_OBJECT = {\n begin: '#<',\n end: '>'\n };\n const COMMENT_MODES = [\n hljs.COMMENT(\n '#',\n '$',\n { contains: [ YARDOCTAG ] }\n ),\n hljs.COMMENT(\n '^=begin',\n '^=end',\n {\n contains: [ YARDOCTAG ],\n relevance: 10\n }\n ),\n hljs.COMMENT('^__END__', hljs.MATCH_NOTHING_RE)\n ];\n const SUBST = {\n className: 'subst',\n begin: /#\\{/,\n end: /\\}/,\n keywords: RUBY_KEYWORDS\n };\n const STRING = {\n className: 'string',\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n variants: [\n {\n begin: /'/,\n end: /'/\n },\n {\n begin: /\"/,\n end: /\"/\n },\n {\n begin: /`/,\n end: /`/\n },\n {\n begin: /%[qQwWx]?\\(/,\n end: /\\)/\n },\n {\n begin: /%[qQwWx]?\\[/,\n end: /\\]/\n },\n {\n begin: /%[qQwWx]?\\{/,\n end: /\\}/\n },\n {\n begin: /%[qQwWx]?/\n },\n {\n begin: /%[qQwWx]?\\//,\n end: /\\//\n },\n {\n begin: /%[qQwWx]?%/,\n end: /%/\n },\n {\n begin: /%[qQwWx]?-/,\n end: /-/\n },\n {\n begin: /%[qQwWx]?\\|/,\n end: /\\|/\n },\n // in the following expressions, \\B in the beginning suppresses recognition of ?-sequences\n // where ? is the last character of a preceding identifier, as in: `func?4`\n { begin: /\\B\\?(\\\\\\d{1,3})/ },\n { begin: /\\B\\?(\\\\x[A-Fa-f0-9]{1,2})/ },\n { begin: /\\B\\?(\\\\u\\{?[A-Fa-f0-9]{1,6}\\}?)/ },\n { begin: /\\B\\?(\\\\M-\\\\C-|\\\\M-\\\\c|\\\\c\\\\M-|\\\\M-|\\\\C-\\\\M-)[\\x20-\\x7e]/ },\n { begin: /\\B\\?\\\\(c|C-)[\\x20-\\x7e]/ },\n { begin: /\\B\\?\\\\?\\S/ },\n // heredocs\n {\n // this guard makes sure that we have an entire heredoc and not a false\n // positive (auto-detect, etc.)\n begin: regex.concat(\n /<<[-~]?'?/,\n regex.lookahead(/(\\w+)(?=\\W)[^\\n]*\\n(?:[^\\n]*\\n)*?\\s*\\1\\b/)\n ),\n contains: [\n hljs.END_SAME_AS_BEGIN({\n begin: /(\\w+)/,\n end: /(\\w+)/,\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ]\n })\n ]\n }\n ]\n };\n\n // Ruby syntax is underdocumented, but this grammar seems to be accurate\n // as of version 2.7.2 (confirmed with (irb and `Ripper.sexp(...)`)\n // https://docs.ruby-lang.org/en/2.7.0/doc/syntax/literals_rdoc.html#label-Numbers\n const decimal = '[1-9](_?[0-9])*|0';\n const digits = '[0-9](_?[0-9])*';\n const NUMBER = {\n className: 'number',\n relevance: 0,\n variants: [\n // decimal integer/float, optionally exponential or rational, optionally imaginary\n { begin: `\\\\b(${decimal})(\\\\.(${digits}))?([eE][+-]?(${digits})|r)?i?\\\\b` },\n\n // explicit decimal/binary/octal/hexadecimal integer,\n // optionally rational and/or imaginary\n { begin: \"\\\\b0[dD][0-9](_?[0-9])*r?i?\\\\b\" },\n { begin: \"\\\\b0[bB][0-1](_?[0-1])*r?i?\\\\b\" },\n { begin: \"\\\\b0[oO][0-7](_?[0-7])*r?i?\\\\b\" },\n { begin: \"\\\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\\\b\" },\n\n // 0-prefixed implicit octal integer, optionally rational and/or imaginary\n { begin: \"\\\\b0(_?[0-7])+r?i?\\\\b\" }\n ]\n };\n\n const PARAMS = {\n variants: [\n {\n match: /\\(\\)/,\n },\n {\n className: 'params',\n begin: /\\(/,\n end: /(?=\\))/,\n excludeBegin: true,\n endsParent: true,\n keywords: RUBY_KEYWORDS,\n }\n ]\n };\n\n const INCLUDE_EXTEND = {\n match: [\n /(include|extend)\\s+/,\n CLASS_NAME_WITH_NAMESPACE_RE\n ],\n scope: {\n 2: \"title.class\"\n },\n keywords: RUBY_KEYWORDS\n };\n\n const CLASS_DEFINITION = {\n variants: [\n {\n match: [\n /class\\s+/,\n CLASS_NAME_WITH_NAMESPACE_RE,\n /\\s+<\\s+/,\n CLASS_NAME_WITH_NAMESPACE_RE\n ]\n },\n {\n match: [\n /\\b(class|module)\\s+/,\n CLASS_NAME_WITH_NAMESPACE_RE\n ]\n }\n ],\n scope: {\n 2: \"title.class\",\n 4: \"title.class.inherited\"\n },\n keywords: RUBY_KEYWORDS\n };\n\n const UPPER_CASE_CONSTANT = {\n relevance: 0,\n match: /\\b[A-Z][A-Z_0-9]+\\b/,\n className: \"variable.constant\"\n };\n\n const METHOD_DEFINITION = {\n match: [\n /def/, /\\s+/,\n RUBY_METHOD_RE\n ],\n scope: {\n 1: \"keyword\",\n 3: \"title.function\"\n },\n contains: [\n PARAMS\n ]\n };\n\n const OBJECT_CREATION = {\n relevance: 0,\n match: [\n CLASS_NAME_WITH_NAMESPACE_RE,\n /\\.new[. (]/\n ],\n scope: {\n 1: \"title.class\"\n }\n };\n\n // CamelCase\n const CLASS_REFERENCE = {\n relevance: 0,\n match: CLASS_NAME_RE,\n scope: \"title.class\"\n };\n\n const RUBY_DEFAULT_CONTAINS = [\n STRING,\n CLASS_DEFINITION,\n INCLUDE_EXTEND,\n OBJECT_CREATION,\n UPPER_CASE_CONSTANT,\n CLASS_REFERENCE,\n METHOD_DEFINITION,\n {\n // swallow namespace qualifiers before symbols\n begin: hljs.IDENT_RE + '::' },\n {\n className: 'symbol',\n begin: hljs.UNDERSCORE_IDENT_RE + '(!|\\\\?)?:',\n relevance: 0\n },\n {\n className: 'symbol',\n begin: ':(?!\\\\s)',\n contains: [\n STRING,\n { begin: RUBY_METHOD_RE }\n ],\n relevance: 0\n },\n NUMBER,\n {\n // negative-look forward attempts to prevent false matches like:\n // @ident@ or $ident$ that might indicate this is not ruby at all\n className: \"variable\",\n begin: '(\\\\$\\\\W)|((\\\\$|@@?)(\\\\w+))(?=[^@$?])' + `(?![A-Za-z])(?![@$?'])`\n },\n {\n className: 'params',\n begin: /\\|(?!=)/,\n end: /\\|/,\n excludeBegin: true,\n excludeEnd: true,\n relevance: 0, // this could be a lot of things (in other languages) other than params\n keywords: RUBY_KEYWORDS\n },\n { // regexp container\n begin: '(' + hljs.RE_STARTERS_RE + '|unless)\\\\s*',\n keywords: 'unless',\n contains: [\n {\n className: 'regexp',\n contains: [\n hljs.BACKSLASH_ESCAPE,\n SUBST\n ],\n illegal: /\\n/,\n variants: [\n {\n begin: '/',\n end: '/[a-z]*'\n },\n {\n begin: /%r\\{/,\n end: /\\}[a-z]*/\n },\n {\n begin: '%r\\\\(',\n end: '\\\\)[a-z]*'\n },\n {\n begin: '%r!',\n end: '![a-z]*'\n },\n {\n begin: '%r\\\\[',\n end: '\\\\][a-z]*'\n }\n ]\n }\n ].concat(IRB_OBJECT, COMMENT_MODES),\n relevance: 0\n }\n ].concat(IRB_OBJECT, COMMENT_MODES);\n\n SUBST.contains = RUBY_DEFAULT_CONTAINS;\n PARAMS.contains = RUBY_DEFAULT_CONTAINS;\n\n // >>\n // ?>\n const SIMPLE_PROMPT = \"[>?]>\";\n // irb(main):001:0>\n const DEFAULT_PROMPT = \"[\\\\w#]+\\\\(\\\\w+\\\\):\\\\d+:\\\\d+[>*]\";\n const RVM_PROMPT = \"(\\\\w+-)?\\\\d+\\\\.\\\\d+\\\\.\\\\d+(p\\\\d+)?[^\\\\d][^>]+>\";\n\n const IRB_DEFAULT = [\n {\n begin: /^\\s*=>/,\n starts: {\n end: '$',\n contains: RUBY_DEFAULT_CONTAINS\n }\n },\n {\n className: 'meta.prompt',\n begin: '^(' + SIMPLE_PROMPT + \"|\" + DEFAULT_PROMPT + '|' + RVM_PROMPT + ')(?=[ ])',\n starts: {\n end: '$',\n keywords: RUBY_KEYWORDS,\n contains: RUBY_DEFAULT_CONTAINS\n }\n }\n ];\n\n COMMENT_MODES.unshift(IRB_OBJECT);\n\n return {\n name: 'Ruby',\n aliases: [\n 'rb',\n 'gemspec',\n 'podspec',\n 'thor',\n 'irb'\n ],\n keywords: RUBY_KEYWORDS,\n illegal: /\\/\\*/,\n contains: [ hljs.SHEBANG({ binary: \"ruby\" }) ]\n .concat(IRB_DEFAULT)\n .concat(COMMENT_MODES)\n .concat(RUBY_DEFAULT_CONTAINS)\n };\n}\n\nexport { ruby as default };\n","/*\nLanguage: Shell Session\nRequires: bash.js\nAuthor: TSUYUSATO Kitsune \nCategory: common\nAudit: 2020\n*/\n\n/** @type LanguageFn */\nfunction shell(hljs) {\n return {\n name: 'Shell Session',\n aliases: [\n 'console',\n 'shellsession'\n ],\n contains: [\n {\n className: 'meta.prompt',\n // We cannot add \\s (spaces) in the regular expression otherwise it will be too broad and produce unexpected result.\n // For instance, in the following example, it would match \"echo /path/to/home >\" as a prompt:\n // echo /path/to/home > t.exe\n begin: /^\\s{0,3}[/~\\w\\d[\\]()@-]*[>%$#][ ]?/,\n starts: {\n end: /[^\\\\](?=\\s*$)/,\n subLanguage: 'bash'\n }\n }\n ]\n };\n}\n\nexport { shell as default };\n","/*\n Language: SQL\n Website: https://en.wikipedia.org/wiki/SQL\n Category: common, database\n */\n\n/*\n\nGoals:\n\nSQL is intended to highlight basic/common SQL keywords and expressions\n\n- If pretty much every single SQL server includes supports, then it's a canidate.\n- It is NOT intended to include tons of vendor specific keywords (Oracle, MySQL,\n PostgreSQL) although the list of data types is purposely a bit more expansive.\n- For more specific SQL grammars please see:\n - PostgreSQL and PL/pgSQL - core\n - T-SQL - https://github.com/highlightjs/highlightjs-tsql\n - sql_more (core)\n\n */\n\nfunction sql(hljs) {\n const regex = hljs.regex;\n const COMMENT_MODE = hljs.COMMENT('--', '$');\n const STRING = {\n scope: 'string',\n variants: [\n {\n begin: /'/,\n end: /'/,\n contains: [ { match: /''/ } ]\n }\n ]\n };\n const QUOTED_IDENTIFIER = {\n begin: /\"/,\n end: /\"/,\n contains: [ { match: /\"\"/ } ]\n };\n\n const LITERALS = [\n \"true\",\n \"false\",\n // Not sure it's correct to call NULL literal, and clauses like IS [NOT] NULL look strange that way.\n // \"null\",\n \"unknown\"\n ];\n\n const MULTI_WORD_TYPES = [\n \"double precision\",\n \"large object\",\n \"with timezone\",\n \"without timezone\"\n ];\n\n const TYPES = [\n 'bigint',\n 'binary',\n 'blob',\n 'boolean',\n 'char',\n 'character',\n 'clob',\n 'date',\n 'dec',\n 'decfloat',\n 'decimal',\n 'float',\n 'int',\n 'integer',\n 'interval',\n 'nchar',\n 'nclob',\n 'national',\n 'numeric',\n 'real',\n 'row',\n 'smallint',\n 'time',\n 'timestamp',\n 'varchar',\n 'varying', // modifier (character varying)\n 'varbinary'\n ];\n\n const NON_RESERVED_WORDS = [\n \"add\",\n \"asc\",\n \"collation\",\n \"desc\",\n \"final\",\n \"first\",\n \"last\",\n \"view\"\n ];\n\n // https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#reserved-word\n const RESERVED_WORDS = [\n \"abs\",\n \"acos\",\n \"all\",\n \"allocate\",\n \"alter\",\n \"and\",\n \"any\",\n \"are\",\n \"array\",\n \"array_agg\",\n \"array_max_cardinality\",\n \"as\",\n \"asensitive\",\n \"asin\",\n \"asymmetric\",\n \"at\",\n \"atan\",\n \"atomic\",\n \"authorization\",\n \"avg\",\n \"begin\",\n \"begin_frame\",\n \"begin_partition\",\n \"between\",\n \"bigint\",\n \"binary\",\n \"blob\",\n \"boolean\",\n \"both\",\n \"by\",\n \"call\",\n \"called\",\n \"cardinality\",\n \"cascaded\",\n \"case\",\n \"cast\",\n \"ceil\",\n \"ceiling\",\n \"char\",\n \"char_length\",\n \"character\",\n \"character_length\",\n \"check\",\n \"classifier\",\n \"clob\",\n \"close\",\n \"coalesce\",\n \"collate\",\n \"collect\",\n \"column\",\n \"commit\",\n \"condition\",\n \"connect\",\n \"constraint\",\n \"contains\",\n \"convert\",\n \"copy\",\n \"corr\",\n \"corresponding\",\n \"cos\",\n \"cosh\",\n \"count\",\n \"covar_pop\",\n \"covar_samp\",\n \"create\",\n \"cross\",\n \"cube\",\n \"cume_dist\",\n \"current\",\n \"current_catalog\",\n \"current_date\",\n \"current_default_transform_group\",\n \"current_path\",\n \"current_role\",\n \"current_row\",\n \"current_schema\",\n \"current_time\",\n \"current_timestamp\",\n \"current_path\",\n \"current_role\",\n \"current_transform_group_for_type\",\n \"current_user\",\n \"cursor\",\n \"cycle\",\n \"date\",\n \"day\",\n \"deallocate\",\n \"dec\",\n \"decimal\",\n \"decfloat\",\n \"declare\",\n \"default\",\n \"define\",\n \"delete\",\n \"dense_rank\",\n \"deref\",\n \"describe\",\n \"deterministic\",\n \"disconnect\",\n \"distinct\",\n \"double\",\n \"drop\",\n \"dynamic\",\n \"each\",\n \"element\",\n \"else\",\n \"empty\",\n \"end\",\n \"end_frame\",\n \"end_partition\",\n \"end-exec\",\n \"equals\",\n \"escape\",\n \"every\",\n \"except\",\n \"exec\",\n \"execute\",\n \"exists\",\n \"exp\",\n \"external\",\n \"extract\",\n \"false\",\n \"fetch\",\n \"filter\",\n \"first_value\",\n \"float\",\n \"floor\",\n \"for\",\n \"foreign\",\n \"frame_row\",\n \"free\",\n \"from\",\n \"full\",\n \"function\",\n \"fusion\",\n \"get\",\n \"global\",\n \"grant\",\n \"group\",\n \"grouping\",\n \"groups\",\n \"having\",\n \"hold\",\n \"hour\",\n \"identity\",\n \"in\",\n \"indicator\",\n \"initial\",\n \"inner\",\n \"inout\",\n \"insensitive\",\n \"insert\",\n \"int\",\n \"integer\",\n \"intersect\",\n \"intersection\",\n \"interval\",\n \"into\",\n \"is\",\n \"join\",\n \"json_array\",\n \"json_arrayagg\",\n \"json_exists\",\n \"json_object\",\n \"json_objectagg\",\n \"json_query\",\n \"json_table\",\n \"json_table_primitive\",\n \"json_value\",\n \"lag\",\n \"language\",\n \"large\",\n \"last_value\",\n \"lateral\",\n \"lead\",\n \"leading\",\n \"left\",\n \"like\",\n \"like_regex\",\n \"listagg\",\n \"ln\",\n \"local\",\n \"localtime\",\n \"localtimestamp\",\n \"log\",\n \"log10\",\n \"lower\",\n \"match\",\n \"match_number\",\n \"match_recognize\",\n \"matches\",\n \"max\",\n \"member\",\n \"merge\",\n \"method\",\n \"min\",\n \"minute\",\n \"mod\",\n \"modifies\",\n \"module\",\n \"month\",\n \"multiset\",\n \"national\",\n \"natural\",\n \"nchar\",\n \"nclob\",\n \"new\",\n \"no\",\n \"none\",\n \"normalize\",\n \"not\",\n \"nth_value\",\n \"ntile\",\n \"null\",\n \"nullif\",\n \"numeric\",\n \"octet_length\",\n \"occurrences_regex\",\n \"of\",\n \"offset\",\n \"old\",\n \"omit\",\n \"on\",\n \"one\",\n \"only\",\n \"open\",\n \"or\",\n \"order\",\n \"out\",\n \"outer\",\n \"over\",\n \"overlaps\",\n \"overlay\",\n \"parameter\",\n \"partition\",\n \"pattern\",\n \"per\",\n \"percent\",\n \"percent_rank\",\n \"percentile_cont\",\n \"percentile_disc\",\n \"period\",\n \"portion\",\n \"position\",\n \"position_regex\",\n \"power\",\n \"precedes\",\n \"precision\",\n \"prepare\",\n \"primary\",\n \"procedure\",\n \"ptf\",\n \"range\",\n \"rank\",\n \"reads\",\n \"real\",\n \"recursive\",\n \"ref\",\n \"references\",\n \"referencing\",\n \"regr_avgx\",\n \"regr_avgy\",\n \"regr_count\",\n \"regr_intercept\",\n \"regr_r2\",\n \"regr_slope\",\n \"regr_sxx\",\n \"regr_sxy\",\n \"regr_syy\",\n \"release\",\n \"result\",\n \"return\",\n \"returns\",\n \"revoke\",\n \"right\",\n \"rollback\",\n \"rollup\",\n \"row\",\n \"row_number\",\n \"rows\",\n \"running\",\n \"savepoint\",\n \"scope\",\n \"scroll\",\n \"search\",\n \"second\",\n \"seek\",\n \"select\",\n \"sensitive\",\n \"session_user\",\n \"set\",\n \"show\",\n \"similar\",\n \"sin\",\n \"sinh\",\n \"skip\",\n \"smallint\",\n \"some\",\n \"specific\",\n \"specifictype\",\n \"sql\",\n \"sqlexception\",\n \"sqlstate\",\n \"sqlwarning\",\n \"sqrt\",\n \"start\",\n \"static\",\n \"stddev_pop\",\n \"stddev_samp\",\n \"submultiset\",\n \"subset\",\n \"substring\",\n \"substring_regex\",\n \"succeeds\",\n \"sum\",\n \"symmetric\",\n \"system\",\n \"system_time\",\n \"system_user\",\n \"table\",\n \"tablesample\",\n \"tan\",\n \"tanh\",\n \"then\",\n \"time\",\n \"timestamp\",\n \"timezone_hour\",\n \"timezone_minute\",\n \"to\",\n \"trailing\",\n \"translate\",\n \"translate_regex\",\n \"translation\",\n \"treat\",\n \"trigger\",\n \"trim\",\n \"trim_array\",\n \"true\",\n \"truncate\",\n \"uescape\",\n \"union\",\n \"unique\",\n \"unknown\",\n \"unnest\",\n \"update\",\n \"upper\",\n \"user\",\n \"using\",\n \"value\",\n \"values\",\n \"value_of\",\n \"var_pop\",\n \"var_samp\",\n \"varbinary\",\n \"varchar\",\n \"varying\",\n \"versioning\",\n \"when\",\n \"whenever\",\n \"where\",\n \"width_bucket\",\n \"window\",\n \"with\",\n \"within\",\n \"without\",\n \"year\",\n ];\n\n // these are reserved words we have identified to be functions\n // and should only be highlighted in a dispatch-like context\n // ie, array_agg(...), etc.\n const RESERVED_FUNCTIONS = [\n \"abs\",\n \"acos\",\n \"array_agg\",\n \"asin\",\n \"atan\",\n \"avg\",\n \"cast\",\n \"ceil\",\n \"ceiling\",\n \"coalesce\",\n \"corr\",\n \"cos\",\n \"cosh\",\n \"count\",\n \"covar_pop\",\n \"covar_samp\",\n \"cume_dist\",\n \"dense_rank\",\n \"deref\",\n \"element\",\n \"exp\",\n \"extract\",\n \"first_value\",\n \"floor\",\n \"json_array\",\n \"json_arrayagg\",\n \"json_exists\",\n \"json_object\",\n \"json_objectagg\",\n \"json_query\",\n \"json_table\",\n \"json_table_primitive\",\n \"json_value\",\n \"lag\",\n \"last_value\",\n \"lead\",\n \"listagg\",\n \"ln\",\n \"log\",\n \"log10\",\n \"lower\",\n \"max\",\n \"min\",\n \"mod\",\n \"nth_value\",\n \"ntile\",\n \"nullif\",\n \"percent_rank\",\n \"percentile_cont\",\n \"percentile_disc\",\n \"position\",\n \"position_regex\",\n \"power\",\n \"rank\",\n \"regr_avgx\",\n \"regr_avgy\",\n \"regr_count\",\n \"regr_intercept\",\n \"regr_r2\",\n \"regr_slope\",\n \"regr_sxx\",\n \"regr_sxy\",\n \"regr_syy\",\n \"row_number\",\n \"sin\",\n \"sinh\",\n \"sqrt\",\n \"stddev_pop\",\n \"stddev_samp\",\n \"substring\",\n \"substring_regex\",\n \"sum\",\n \"tan\",\n \"tanh\",\n \"translate\",\n \"translate_regex\",\n \"treat\",\n \"trim\",\n \"trim_array\",\n \"unnest\",\n \"upper\",\n \"value_of\",\n \"var_pop\",\n \"var_samp\",\n \"width_bucket\",\n ];\n\n // these functions can\n const POSSIBLE_WITHOUT_PARENS = [\n \"current_catalog\",\n \"current_date\",\n \"current_default_transform_group\",\n \"current_path\",\n \"current_role\",\n \"current_schema\",\n \"current_transform_group_for_type\",\n \"current_user\",\n \"session_user\",\n \"system_time\",\n \"system_user\",\n \"current_time\",\n \"localtime\",\n \"current_timestamp\",\n \"localtimestamp\"\n ];\n\n // those exist to boost relevance making these very\n // \"SQL like\" keyword combos worth +1 extra relevance\n const COMBOS = [\n \"create table\",\n \"insert into\",\n \"primary key\",\n \"foreign key\",\n \"not null\",\n \"alter table\",\n \"add constraint\",\n \"grouping sets\",\n \"on overflow\",\n \"character set\",\n \"respect nulls\",\n \"ignore nulls\",\n \"nulls first\",\n \"nulls last\",\n \"depth first\",\n \"breadth first\"\n ];\n\n const FUNCTIONS = RESERVED_FUNCTIONS;\n\n const KEYWORDS = [\n ...RESERVED_WORDS,\n ...NON_RESERVED_WORDS\n ].filter((keyword) => {\n return !RESERVED_FUNCTIONS.includes(keyword);\n });\n\n const VARIABLE = {\n scope: \"variable\",\n match: /@[a-z0-9][a-z0-9_]*/,\n };\n\n const OPERATOR = {\n scope: \"operator\",\n match: /[-+*/=%^~]|&&?|\\|\\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,\n relevance: 0,\n };\n\n const FUNCTION_CALL = {\n match: regex.concat(/\\b/, regex.either(...FUNCTIONS), /\\s*\\(/),\n relevance: 0,\n keywords: { built_in: FUNCTIONS }\n };\n\n // turns a multi-word keyword combo into a regex that doesn't\n // care about extra whitespace etc.\n // input: \"START QUERY\"\n // output: /\\bSTART\\s+QUERY\\b/\n function kws_to_regex(list) {\n return regex.concat(\n /\\b/,\n regex.either(...list.map((kw) => {\n return kw.replace(/\\s+/, \"\\\\s+\")\n })),\n /\\b/\n )\n }\n\n const MULTI_WORD_KEYWORDS = {\n scope: \"keyword\",\n match: kws_to_regex(COMBOS),\n relevance: 0,\n };\n\n // keywords with less than 3 letters are reduced in relevancy\n function reduceRelevancy(list, {\n exceptions, when\n } = {}) {\n const qualifyFn = when;\n exceptions = exceptions || [];\n return list.map((item) => {\n if (item.match(/\\|\\d+$/) || exceptions.includes(item)) {\n return item;\n } else if (qualifyFn(item)) {\n return `${item}|0`;\n } else {\n return item;\n }\n });\n }\n\n return {\n name: 'SQL',\n case_insensitive: true,\n // does not include {} or HTML tags ` x.length < 3 }),\n literal: LITERALS,\n type: TYPES,\n built_in: POSSIBLE_WITHOUT_PARENS\n },\n contains: [\n {\n scope: \"type\",\n match: kws_to_regex(MULTI_WORD_TYPES)\n },\n MULTI_WORD_KEYWORDS,\n FUNCTION_CALL,\n VARIABLE,\n STRING,\n QUOTED_IDENTIFIER,\n hljs.C_NUMBER_MODE,\n hljs.C_BLOCK_COMMENT_MODE,\n COMMENT_MODE,\n OPERATOR\n ]\n };\n}\n\nexport { sql as default };\n","/*\nLanguage: HTML, XML\nWebsite: https://www.w3.org/XML/\nCategory: common, web\nAudit: 2020\n*/\n\n/** @type LanguageFn */\nfunction xml(hljs) {\n const regex = hljs.regex;\n // XML names can have the following additional letters: https://www.w3.org/TR/xml/#NT-NameChar\n // OTHER_NAME_CHARS = /[:\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]/;\n // Element names start with NAME_START_CHAR followed by optional other Unicode letters, ASCII digits, hyphens, underscores, and periods\n // const TAG_NAME_RE = regex.concat(/[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/, regex.optional(/[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*:/), /[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*/);;\n // const XML_IDENT_RE = /[A-Z_a-z:\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]+/;\n // const TAG_NAME_RE = regex.concat(/[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/, regex.optional(/[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*:/), /[A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*/);\n // however, to cater for performance and more Unicode support rely simply on the Unicode letter class\n const TAG_NAME_RE = regex.concat(/[\\p{L}_]/u, regex.optional(/[\\p{L}0-9_.-]*:/u), /[\\p{L}0-9_.-]*/u);\n const XML_IDENT_RE = /[\\p{L}0-9._:-]+/u;\n const XML_ENTITIES = {\n className: 'symbol',\n begin: /&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/\n };\n const XML_META_KEYWORDS = {\n begin: /\\s/,\n contains: [\n {\n className: 'keyword',\n begin: /#?[a-z_][a-z1-9_-]+/,\n illegal: /\\n/\n }\n ]\n };\n const XML_META_PAR_KEYWORDS = hljs.inherit(XML_META_KEYWORDS, {\n begin: /\\(/,\n end: /\\)/\n });\n const APOS_META_STRING_MODE = hljs.inherit(hljs.APOS_STRING_MODE, { className: 'string' });\n const QUOTE_META_STRING_MODE = hljs.inherit(hljs.QUOTE_STRING_MODE, { className: 'string' });\n const TAG_INTERNALS = {\n endsWithParent: true,\n illegal: /`]+/ }\n ]\n }\n ]\n }\n ]\n };\n return {\n name: 'HTML, XML',\n aliases: [\n 'html',\n 'xhtml',\n 'rss',\n 'atom',\n 'xjb',\n 'xsd',\n 'xsl',\n 'plist',\n 'wsf',\n 'svg'\n ],\n case_insensitive: true,\n unicodeRegex: true,\n contains: [\n {\n className: 'meta',\n begin: //,\n relevance: 10,\n contains: [\n XML_META_KEYWORDS,\n QUOTE_META_STRING_MODE,\n APOS_META_STRING_MODE,\n XML_META_PAR_KEYWORDS,\n {\n begin: /\\[/,\n end: /\\]/,\n contains: [\n {\n className: 'meta',\n begin: //,\n contains: [\n XML_META_KEYWORDS,\n XML_META_PAR_KEYWORDS,\n QUOTE_META_STRING_MODE,\n APOS_META_STRING_MODE\n ]\n }\n ]\n }\n ]\n },\n hljs.COMMENT(\n //,\n { relevance: 10 }\n ),\n {\n begin: //,\n relevance: 10\n },\n XML_ENTITIES,\n // xml processing instructions\n {\n className: 'meta',\n end: /\\?>/,\n variants: [\n {\n begin: /<\\?xml/,\n relevance: 10,\n contains: [\n QUOTE_META_STRING_MODE\n ]\n },\n {\n begin: /<\\?[a-z][a-z0-9]+/,\n }\n ]\n\n },\n {\n className: 'tag',\n /*\n The lookahead pattern (?=...) ensures that 'begin' only matches\n ')/,\n end: />/,\n keywords: { name: 'style' },\n contains: [ TAG_INTERNALS ],\n starts: {\n end: /<\\/style>/,\n returnEnd: true,\n subLanguage: [\n 'css',\n 'xml'\n ]\n }\n },\n {\n className: 'tag',\n // See the comment in the \n \n );\n};\n\nexport default GraphSpinner;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\nconst CubeSpinner = ({\n status,\n color,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n /* eslint-disable no-magic-numbers */\n return (\n
\n {debugTitle}\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default CubeSpinner;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\n/**\n * Spinner created by Tobias Ahlin, https://github.com/tobiasahlin/SpinKit\n */\nconst CircleSpinner = ({\n status,\n color,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n return (\n
\n {debugTitle}\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default CircleSpinner;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\n/**\n * Spinner created by Tobias Ahlin, https://github.com/tobiasahlin/SpinKit\n */\nconst DotSpinner = ({\n status,\n color,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n return (\n
\n {debugTitle}\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default DotSpinner;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\n/**\n * Spinner created by Tobias Ahlin, https://github.com/tobiasahlin/SpinKit\n */\nconst DefaultSpinner = ({\n status,\n color,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n return (\n
\n {debugTitle}\n
\n
\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default DefaultSpinner;\n","import {Component} from 'react';\nimport PropTypes from 'prop-types';\nimport {type} from 'ramda';\n\nimport {History} from '@plotly/dash-component-plugins';\n\n/**\n * Update and track the current window.location object through the window.history state.\n * Use in conjunction with the `dash_core_components.Link` component to make apps with multiple pages.\n */\nexport default class Location extends Component {\n constructor(props) {\n super(props);\n this.updateLocation = this.updateLocation.bind(this);\n this.onLocationChange = this.onLocationChange.bind(this);\n }\n\n updateLocation(props) {\n const {hash, href, pathname, refresh, search, setProps} = props;\n\n // Keep track of props relating to window.location that may need to be updated via setProps\n const propsToSet = {};\n\n /**\n * Check if the field exists in props. If the prop with \"fieldName\" is not defined,\n * then it was not set by the user and needs to be equal to the value in window.location.\n * This only happens on page load (since props will no longer be undefined after componentDidMount).\n *\n * @param {string} fieldName\n * The name of the prop in window.location and in the component's prop\n *\n * @returns {boolean}\n * Returns true if the prop with fieldName is different and the window state needs to be updated\n */\n const checkExistsUpdateWindowLocation = fieldName => {\n const propVal = props[fieldName];\n\n if (\n (type(propVal) === 'Undefined' || propVal === null) &&\n type(window.location[fieldName]) !== 'Undefined'\n ) {\n // propVal is undefined or null, but window.location has this fieldName defined\n propsToSet[fieldName] = window.location[fieldName];\n } else if (propVal !== window.location[fieldName]) {\n // Prop has changed?\n if (refresh === true) {\n // Refresh the page?\n window.location[fieldName] = propVal;\n } else if (this.props[fieldName] !== propVal) {\n // If this prop has changed, need to setProps\n propsToSet[fieldName] = propVal;\n // This (`${fieldName}`: propVal) needs to be pushed in the window.history\n return true;\n }\n }\n // This (`${fieldName}`: propVal) DOES NOT need to be pushed in the window.history\n return false;\n };\n\n // Check if the prop value needs to be updated (note that this mutates propsToSet)\n const pathnameUpdated = checkExistsUpdateWindowLocation('pathname');\n const hrefUpdated = checkExistsUpdateWindowLocation('href');\n const hashUpdated = checkExistsUpdateWindowLocation('hash');\n const searchUpdated = checkExistsUpdateWindowLocation('search');\n\n // propsToSet has been updated -- batch update to Dash\n if (Object.keys(propsToSet).length > 0) {\n setProps(propsToSet);\n }\n\n // Special case -- overrides everything!\n if (hrefUpdated) {\n window.history.pushState({}, '', href);\n if (refresh === 'callback-nav') {\n window.dispatchEvent(new CustomEvent('_dashprivate_pushstate'));\n }\n } else if (pathnameUpdated || hashUpdated || searchUpdated) {\n // Otherwise, we can mash everything together\n const searchVal = type(search) !== 'Undefined' ? search : '';\n const hashVal = type(hash) !== 'Undefined' ? hash : '';\n window.history.pushState(\n {},\n '',\n `${pathname}${searchVal}${hashVal}`\n );\n if (refresh === 'callback-nav') {\n window.dispatchEvent(new CustomEvent('_dashprivate_pushstate'));\n }\n }\n }\n\n onLocationChange() {\n const {setProps} = this.props;\n const propsToChange = {};\n\n if (this.props.pathname !== window.location.pathname) {\n propsToChange.pathname = window.location.pathname;\n }\n if (this.props.href !== window.location.href) {\n propsToChange.href = window.location.href;\n }\n if (this.props.hash !== window.location.hash) {\n propsToChange.hash = window.location.hash;\n }\n if (this.props.search !== window.location.search) {\n propsToChange.search = window.location.search;\n }\n\n setProps(propsToChange);\n\n History.dispatchChangeEvent();\n }\n\n componentDidMount() {\n window.addEventListener('popstate', this.onLocationChange);\n\n window.addEventListener(\n '_dashprivate_pushstate',\n this.onLocationChange\n );\n this.updateLocation(this.props);\n }\n\n componentWillUnmount() {\n window.removeEventListener('popstate', this.onLocationChange);\n window.removeEventListener(\n '_dashprivate_pushstate',\n this.onLocationChange\n );\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n this.updateLocation(nextProps);\n }\n\n render() {\n return null;\n }\n}\n\nLocation.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string.isRequired,\n\n /** pathname in window.location - e.g., \"/my/full/pathname\" */\n pathname: PropTypes.string,\n /** search in window.location - e.g., \"?myargument=1\" */\n search: PropTypes.string,\n /** hash in window.location - e.g., \"#myhash\" */\n hash: PropTypes.string,\n /** href in window.location - e.g., \"/my/full/pathname?myargument=1#myhash\" */\n href: PropTypes.string,\n\n /**\n * Use `True` to navigate outside the Dash app or to manually refresh a page.\n * Use `False` if the same callback that updates the Location component is also\n * updating the page content - typically used in multi-page apps that do not use Pages.\n * Use 'callback-nav' if you are updating the URL in a callback, or a different\n * callback will respond to the new Location with updated content. This is\n * typical with multi-page apps that use Pages. This will allow for\n * navigating to a new page without refreshing the page.\n */\n refresh: PropTypes.oneOfType([\n PropTypes.oneOf(['callback-nav']),\n PropTypes.bool,\n ]),\n\n /**\n * Dash-assigned callback that gets fired when the value changes.\n */\n setProps: PropTypes.func,\n};\n\nLocation.defaultProps = {\n refresh: true,\n};\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./radioitems.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./radioitems.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React, {useMemo} from 'react';\nimport {RadioItemsProps, PersistedProps, PersistenceTypes} from '../types';\nimport './css/radioitems.css';\n\nimport {sanitizeOptions} from '../utils/optionTypes';\nimport LoadingElement from '../utils/_LoadingElement';\nimport {OptionsList} from '../utils/optionRendering';\nimport {isNil} from 'ramda';\n\n/**\n * RadioItems is a component that encapsulates several radio item inputs.\n * The values and labels of the RadioItems is specified in the `options`\n * property and the seleced item is specified with the `value` property.\n * Each radio item is rendered as an input with a surrounding label.\n */\nexport default function RadioItems({\n className,\n id,\n style,\n setProps,\n value,\n inputStyle = {},\n inputClassName = '',\n labelStyle = {},\n labelClassName = '',\n options = [],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n inline = false,\n}: RadioItemsProps) {\n const sanitizedOptions = useMemo(() => {\n return sanitizeOptions(options).options;\n }, [options]);\n\n const stylingProps = {\n id,\n className: 'dash-radioitems ' + (className ?? ''),\n style,\n optionClassName: inline ? 'dash-radioitems-inline' : undefined,\n inputStyle,\n inputClassName,\n labelStyle,\n labelClassName,\n };\n\n return (\n \n {loadingProps => (\n {\n if (selection.length) {\n setProps({value: selection[selection.length - 1]});\n }\n }}\n {...stylingProps}\n />\n )}\n \n );\n}\n\nRadioItems.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n","export default () =>\n import(/* webpackChunkName: \"slider\" */ '../../fragments/RangeSlider');\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./sliders.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./sliders.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React, {lazy, Suspense} from 'react';\nimport {PersistedProps, PersistenceTypes, RangeSliderProps} from '../types';\nimport rangeSlider from '../utils/LazyLoader/rangeSlider';\n\nimport './css/sliders.css';\n\nconst RealRangeSlider = lazy(rangeSlider);\n\n/**\n * A double slider with two handles.\n * Used for specifying a range of numerical values.\n */\nexport default function RangeSlider({\n updatemode = 'mouseup',\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n // eslint-disable-next-line no-magic-numbers\n verticalHeight = 400,\n step = undefined,\n allow_direct_input = true,\n ...props\n}: RangeSliderProps) {\n // Some considerations for the default value of `step`:\n // If the range consists of integers, default to a value of `1`\n // Otherwise, leave it undefined\n if (\n typeof step === 'undefined' &&\n Number.isInteger(props.min) &&\n Number.isInteger(props.max)\n ) {\n step = 1;\n }\n\n return (\n \n \n \n );\n}\n\nRangeSlider.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n","import {omit} from 'ramda';\nimport React, {lazy, Suspense, useCallback, useMemo} from 'react';\nimport {\n PersistedProps,\n PersistenceTypes,\n RangeSliderProps,\n SliderProps,\n} from '../types';\nimport rangeSlider from '../utils/LazyLoader/rangeSlider';\nimport './css/sliders.css';\n\nconst RealSlider = lazy(rangeSlider);\n\n/**\n * A slider component with a single handle.\n */\nexport default function Slider({\n updatemode = 'mouseup',\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n // eslint-disable-next-line no-magic-numbers\n verticalHeight = 400,\n step = undefined,\n allow_direct_input = true,\n setProps,\n value,\n drag_value,\n ...props\n}: SliderProps) {\n // This is actually a wrapper around a RangeSlider.\n // We'll modify key `Slider` props to be compatible with a Range Slider.\n\n // Some considerations for the default value of `step`:\n // If the range consists of integers, default to a value of `1`\n // Otherwise, leave it undefined\n if (\n typeof step === 'undefined' &&\n Number.isInteger(props.min) &&\n Number.isInteger(props.max)\n ) {\n step = 1;\n }\n\n const mappedValue: RangeSliderProps['value'] = useMemo(() => {\n return typeof value === 'number' ? [value] : value;\n }, [value]);\n\n const mappedDragValue: RangeSliderProps['drag_value'] = useMemo(() => {\n return typeof drag_value === 'number' ? [drag_value] : drag_value;\n }, [drag_value]);\n\n const mappedSetProps: RangeSliderProps['setProps'] = useCallback(\n newProps => {\n const {value, drag_value} = newProps;\n const mappedProps: Partial = omit(\n ['value', 'drag_value', 'setProps'],\n newProps\n );\n if ('value' in newProps) {\n mappedProps.value = value ? value[0] : value;\n }\n if ('drag_value' in newProps) {\n mappedProps.drag_value = drag_value\n ? drag_value[0]\n : drag_value;\n }\n\n setProps(mappedProps);\n },\n [setProps]\n );\n\n return (\n \n \n \n );\n}\n\nSlider.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n","import {equals, isNil} from 'ramda';\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\n/**\n * Abstraction for the memory storage_type to work the same way as local/session\n *\n * Each memory Store component get it's own MemStore.\n */\nclass MemStore {\n constructor() {\n this._data = {};\n this._modified = -1;\n }\n\n getItem(key) {\n return this._data[key];\n }\n\n setItem(key, value) {\n this._data[key] = value;\n this.setModified(key);\n }\n\n removeItem(key) {\n delete this._data[key];\n this.setModified(key);\n }\n\n // noinspection JSUnusedLocalSymbols\n setModified(_) {\n this._modified = Date.now();\n }\n\n // noinspection JSUnusedLocalSymbols\n getModified(_) {\n return this._modified;\n }\n}\n\n/**\n * Abstraction for local/session storage_type.\n *\n * Single instances for localStorage, sessionStorage\n */\nclass WebStore {\n constructor(storage) {\n this._storage = storage;\n }\n\n getItem(key) {\n try {\n return JSON.parse(this._storage.getItem(key));\n } catch (e) {\n // in case we somehow got a non-JSON value in storage,\n // just ignore it.\n return null;\n }\n }\n\n setItem(key, value) {\n this._storage.setItem(key, JSON.stringify(value));\n this.setModified(key);\n }\n\n removeItem(key) {\n this._storage.removeItem(key);\n this._storage.removeItem(`${key}-timestamp`);\n }\n\n setModified(key) {\n this._storage.setItem(`${key}-timestamp`, Date.now());\n }\n\n getModified(key) {\n return (\n Number.parseInt(this._storage.getItem(`${key}-timestamp`), 10) || -1\n );\n }\n}\n\n/**\n * Easily keep data on the client side with this component.\n * The data is not inserted in the DOM.\n * Data can be in memory, localStorage or sessionStorage.\n * The data will be kept with the id as key.\n */\nexport default class Store extends React.Component {\n constructor(props) {\n super(props);\n\n if (props.storage_type === 'local') {\n this._backstore = new WebStore(window.localStorage);\n } else if (props.storage_type === 'session') {\n this._backstore = new WebStore(window.sessionStorage);\n } else if (props.storage_type === 'memory') {\n this._backstore = new MemStore();\n }\n\n this.onStorageChange = this.onStorageChange.bind(this);\n }\n\n onStorageChange(e) {\n const {id, setProps} = this.props;\n if (e.key === id && setProps && e.newValue !== e.oldValue) {\n setProps({\n data: JSON.parse(e.newValue),\n modified_timestamp: this._backstore.getModified(id),\n });\n }\n }\n\n UNSAFE_componentWillMount() {\n const {setProps, id, data, storage_type} = this.props;\n if (storage_type !== 'memory') {\n window.addEventListener('storage', this.onStorageChange);\n }\n\n const old = this._backstore.getItem(id);\n if (isNil(old) && !isNil(data)) {\n // Initial data mount\n this._backstore.setItem(id, data);\n setProps({\n modified_timestamp: this._backstore.getModified(id),\n });\n return;\n }\n\n if (!equals(old, data)) {\n setProps({\n data: old,\n modified_timestamp: this._backstore.getModified(id),\n });\n }\n }\n\n componentWillUnmount() {\n if (this.props.storage_type !== 'memory') {\n window.removeEventListener('storage', this.onStorageChange);\n }\n }\n\n componentDidUpdate() {\n const {data, id, clear_data, setProps} = this.props;\n if (clear_data) {\n this._backstore.removeItem(id);\n setProps({\n clear_data: false,\n data: null,\n modified_timestamp: this._backstore.getModified(id),\n });\n return;\n }\n const old = this._backstore.getItem(id);\n // Only set the data if it's not the same data.\n // If the new data is undefined, we got here by overwriting the entire\n // component with a new copy that has no `data` specified - so pull back\n // out the old value.\n // Note: this still allows you to set data to null\n if (!equals(data, old)) {\n if (data === undefined) {\n setProps({data: old});\n } else {\n this._backstore.setItem(id, data);\n setProps({\n modified_timestamp: this._backstore.getModified(id),\n });\n }\n }\n }\n\n render() {\n return null;\n }\n}\n\nStore.defaultProps = {\n storage_type: 'memory',\n clear_data: false,\n modified_timestamp: -1,\n};\n\nStore.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string.isRequired,\n\n /**\n * The type of the web storage.\n *\n * memory: only kept in memory, reset on page refresh.\n * local: window.localStorage, data is kept after the browser quit.\n * session: window.sessionStorage, data is cleared once the browser quit.\n */\n storage_type: PropTypes.oneOf(['local', 'session', 'memory']),\n\n /**\n * The stored data for the id.\n */\n data: PropTypes.oneOfType([\n PropTypes.object,\n PropTypes.array,\n PropTypes.number,\n PropTypes.string,\n PropTypes.bool,\n ]),\n\n /**\n * Set to true to remove the data contained in `data_key`.\n */\n clear_data: PropTypes.bool,\n\n /**\n * The last time the storage was modified.\n */\n modified_timestamp: PropTypes.number,\n\n /**\n * Dash-assigned callback that gets fired when the value changes.\n */\n setProps: PropTypes.func,\n};\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./tabs.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./tabs.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React from 'react';\nimport './css/tabs.css';\nimport {TabProps} from '../types';\n\n/**\n * Part of dcc.Tabs - this is the child Tab component used to render a tabbed page.\n * Its children will be set as the content of that tab, which if clicked will become visible.\n */\nfunction Tab({\n children,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n disabled = false,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n disabled_style = {color: 'var(--Dash-Text-Disabled)'},\n}: TabProps) {\n return <>{children};\n}\n\nexport default Tab;\n","import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport {has, isNil} from 'ramda';\n\nimport LoadingElement from '../utils/_LoadingElement';\nimport {PersistedProps, PersistenceTypes, TabProps, TabsProps} from '../types';\nimport './css/tabs.css';\nimport {DashComponent} from '@dash-renderer/types';\n\ninterface EnhancedTabProps extends TabProps {\n selected: boolean;\n componentPath?: (string | number)[];\n}\n\n// EnhancedTab is defined here instead of in Tab.tsx because if exported there,\n// it will mess up the Python imports and metadata.json\nconst EnhancedTab = ({\n id,\n label,\n selected,\n className,\n style,\n selected_className,\n selected_style,\n setProps: selectHandler,\n value,\n disabled = false,\n disabled_style = {color: 'var(--Dash-Text-Disabled)'},\n disabled_className,\n componentPath,\n}: EnhancedTabProps) => {\n const ExternalWrapper = window.dash_component_api.ExternalWrapper;\n const ctx = window.dash_component_api.useDashContext();\n componentPath = componentPath ?? ctx.componentPath;\n // We use the raw path here since it's up one level from\n // the tabs child.\n const isLoading = ctx.useLoading({rawPath: componentPath});\n const tabStyle = useMemo(() => {\n return {\n ...style,\n ...(disabled ? disabled_style : {}),\n ...(selected ? selected_style : {}),\n };\n }, [style, disabled, disabled_style, selected, selected_style]);\n\n const tabClassNames = useMemo(() => {\n let names = 'tab';\n if (disabled) {\n names += ' tab--disabled';\n if (disabled_className) {\n names += ` ${disabled_className}`;\n }\n }\n if (selected) {\n names += ' tab--selected';\n if (selected_className) {\n names += ` ${selected_className}`;\n }\n }\n if (className) {\n names += ` ${className}`;\n }\n return names;\n }, [className, disabled, disabled_className, selected, selected_className]);\n\n let labelDisplay;\n if (typeof label === 'object') {\n labelDisplay = (\n \n );\n } else {\n labelDisplay = {label};\n }\n\n return (\n {\n if (!disabled) {\n selectHandler({value});\n }\n }}\n >\n {labelDisplay}\n
\n );\n};\n\n/**\n * A Dash component that lets you render pages with tabs - the Tabs component's children\n * can be dcc.Tab components, which can hold a label that will be displayed as a tab, and can in turn hold\n * children components that will be that tab's content.\n */\nfunction Tabs({\n // eslint-disable-next-line no-magic-numbers\n mobile_breakpoint = 800,\n colors = {\n border: 'var(--Dash-Stroke-Weak)',\n primary: 'var(--Dash-Fill-Interactive-Strong)',\n background: 'var(--Dash-Fill-Interactive-Weak)',\n },\n vertical = false,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n children,\n ...props\n}: TabsProps) {\n const initializedRef = useRef(false);\n const [isAboveBreakpoint, setIsAboveBreakpoint] = useState(false);\n\n const parseChildrenToArray = useCallback((): DashComponent[] => {\n if (!children) {\n return [];\n }\n if (children instanceof Array) {\n return children;\n }\n return [children];\n }, [children]);\n\n const valueOrDefault = (): string | undefined => {\n if (has('value', props)) {\n return props.value;\n }\n const children = parseChildrenToArray();\n if (children && children.length && children[0].props.componentPath) {\n const firstChildren: TabProps = window.dash_component_api.getLayout(\n [...children[0].props.componentPath, 'props']\n );\n return firstChildren.value ?? 'tab-1';\n }\n return 'tab-1';\n };\n\n // Initialize value on mount if not set\n useEffect(() => {\n if (!initializedRef.current && !has('value', props)) {\n props.setProps({\n value: `${valueOrDefault()}`,\n });\n initializedRef.current = true;\n }\n }, []);\n\n // Setup matchMedia for responsive breakpoint\n useEffect(() => {\n const mediaQuery = window.matchMedia(\n `(min-width: ${mobile_breakpoint}px)`\n );\n\n // Set initial value\n setIsAboveBreakpoint(mediaQuery.matches);\n\n // Listen for changes\n const handler = (e: MediaQueryListEvent) =>\n setIsAboveBreakpoint(e.matches);\n mediaQuery.addEventListener('change', handler);\n\n return () => mediaQuery.removeEventListener('change', handler);\n }, [mobile_breakpoint]);\n\n let EnhancedTabs: JSX.Element[];\n let selectedTab;\n\n const value = valueOrDefault();\n\n if (children) {\n const children = parseChildrenToArray();\n\n EnhancedTabs = children.map((child, index) => {\n // TODO: handle components that are not dcc.Tab components (throw error)\n // enhance Tab components coming from Dash (as dcc.Tab) with methods needed for handling logic\n let childProps: Omit;\n\n if (React.isValidElement(child) && child.props.componentPath) {\n childProps = window.dash_component_api.getLayout([\n ...child.props.componentPath,\n 'props',\n ]);\n } else {\n // In case the selected tab is a string.\n childProps = {};\n }\n\n if (!childProps.value) {\n childProps = {...childProps, value: `tab-${index + 1}`};\n }\n\n // check if this child/Tab is currently selected\n if (childProps.value === value) {\n selectedTab = child;\n }\n\n const style = childProps.style ?? {};\n if (typeof childProps.width === 'number') {\n style.width = `${childProps.width}px`;\n style.flex = '0 0 auto';\n } else if (typeof childProps.width === 'string') {\n style.width = childProps.width;\n style.flex = '0 0 auto';\n }\n\n return (\n \n );\n });\n }\n\n const selectedTabContent = !isNil(selectedTab) ? selectedTab : '';\n\n const tabContainerClassNames = useMemo(() => {\n let names = 'tab-container';\n if (vertical) {\n names += ` tab-container--vert`;\n }\n if (props.className) {\n names += ` ${props.className}`;\n }\n return names;\n }, [vertical, props.className]);\n\n const tabContentClassNames = useMemo(() => {\n let names = 'tab-content';\n if (vertical) {\n names += ` tab-content--vert`;\n }\n if (props.content_className) {\n names += ` ${props.content_className}`;\n }\n return names;\n }, [vertical, props.content_className]);\n\n const tabParentClassNames = useMemo(() => {\n let names = 'tab-parent';\n if (vertical) {\n names += ` tab-parent--vert`;\n }\n if (isAboveBreakpoint) {\n names += ' tab-parent--above-breakpoint';\n }\n if (props.parent_className) {\n names += ` ${props.parent_className}`;\n }\n return names;\n }, [vertical, isAboveBreakpoint, props.parent_className]);\n\n // Set CSS variables for dynamic styling\n const cssVars = {\n '--tabs-border': colors.border,\n '--tabs-primary': colors.primary,\n '--tabs-background': colors.background,\n } as const;\n\n return (\n \n {loadingProps => (\n \n \n {EnhancedTabs}\n
\n \n {selectedTabContent || ''}\n
\n
\n )}\n \n );\n}\n\nTabs.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n\nTabs.dashChildrenUpdate = true;\n\nexport default Tabs;\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./textarea.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./textarea.css\";\n export default content && content.locals ? content.locals : undefined;\n","/* eslint-disable no-unused-vars */\nimport React from 'react';\nimport {pick} from 'ramda';\nimport {PersistedProps, PersistenceTypes, TextAreaProps} from '../types';\nimport './css/textarea.css';\n\nconst textAreaProps = [\n 'id',\n 'cols',\n 'rows',\n 'minLength',\n 'maxLength',\n 'contentEditable',\n 'tabIndex',\n 'form',\n 'name',\n 'placeholder',\n 'wrap',\n 'accessKey',\n 'contextMenu',\n 'dir',\n 'draggable',\n 'lang',\n 'spellCheck',\n 'style',\n 'title',\n] as const;\n\n/**\n * A basic HTML textarea for entering multiline text.\n *\n */\nconst Textarea = ({\n setProps,\n n_blur = 0,\n n_blur_timestamp = -1,\n n_clicks = 0,\n n_clicks_timestamp = -1,\n ...props\n}: TextAreaProps) => {\n const ctx = window.dash_component_api.useDashContext();\n const isLoading = ctx.useLoading();\n\n return (\n
\n
\n \n );\n};\n\nexport default Tooltip;\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./dcc.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./dcc.css\";\n export default content && content.locals ? content.locals : undefined;\n"],"names":["leafPrototypes","getProto","inProgress","dataWebpackPrefix","e","window","module","exports","__webpack_require__","n","t","r","o","i","l","call","m","c","d","Object","defineProperty","enumerable","get","Symbol","toStringTag","value","__esModule","create","bind","default","prototype","hasOwnProperty","p","s","u","a","done","Promise","resolve","then","this","arguments","apply","isReady","lazy","setTimeout","regeneratorRuntime","mark","wrap","prev","next","stop","_dashprivate_isLazyComponentReady","f","length","configurable","writable","key","TypeError","dispatchEvent","CustomEvent","addEventListener","removeEventListener","_typeof","iterator","constructor","_defineProperties","target","props","descriptor","_toPropertyKey","_createClass","Constructor","protoProps","staticProps","arg","input","prim","toPrimitive","undefined","res","hint","String","_toPrimitive","isDeepEqual","isDeepStrictEqual","_require$codes","codes","ERR_AMBIGUOUS_ARGUMENT","ERR_INVALID_ARG_TYPE","ERR_INVALID_ARG_VALUE","ERR_INVALID_RETURN_VALUE","ERR_MISSING_ARGS","AssertionError","inspect","_require$types","isPromise","isRegExp","objectAssign","objectIs","RegExpPrototypeTest","lazyLoadComparison","comparison","Map","warned","assert","ok","NO_EXCEPTION_SENTINEL","innerFail","obj","message","Error","innerOk","fn","argLen","generatedMessage","err","actual","expected","operator","stackStartFn","_len","args","Array","_key","concat","fail","internalMessage","argsLen","process","emitWarning","console","warn","errArgs","equal","notEqual","deepEqual","notDeepEqual","deepStrictEqual","notDeepStrictEqual","strictEqual","notStrictEqual","Comparison","keys","_this","instance","_classCallCheck","forEach","expectedException","msg","name","push","b","compareExceptionKey","isPrototypeOf","getActual","checkIsPromise","catch","waitForActual","promiseFn","resultPromise","expectsError","error","details","fnType","expectsNoError","internalMatch","string","regexp","fnName","match","strict","_len6","_key6","throws","_len2","_key2","rejects","_len3","_key3","result","doesNotThrow","_len4","_key4","doesNotReject","_len5","_key5","ifError","newErr","origStack","stack","tmp2","split","shift","tmp1","pos","indexOf","slice","join","doesNotMatch","ownKeys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","_objectSpread","getOwnPropertyDescriptors","defineProperties","_possibleConstructorReturn","self","_assertThisInitialized","ReferenceError","_wrapNativeSuper","Class","_cache","Function","toString","has","set","Wrapper","_construct","_getPrototypeOf","_setPrototypeOf","Parent","_isNativeReflectConstruct","Reflect","construct","sham","Proxy","Boolean","valueOf","setPrototypeOf","__proto__","getPrototypeOf","endsWith","str","search","this_len","substring","blue","green","red","white","kReadableOperator","strictEqualObject","notStrictEqualObject","notIdentical","copyError","source","inspectValue","val","compact","customInspect","depth","maxArrayLength","Infinity","showHidden","breakLength","showProxy","sorted","getters","_Error","_inspect$custom","subClass","superClass","_inherits","Derived","hasNativeReflectConstruct","_super","Super","NewTarget","options","limit","stackTraceLimit","stderr","isTTY","getColorDepth","other","lastPos","end","skipped","actualInspected","actualLines","expectedLines","indicator","inputLength","columns","count","Math","floor","maxCount","log","repeat","pop","maxLines","max","_actualLines","printedLines","skippedMsg","cur","expectedLine","actualLine","divergingLines","createErrDiff","base","_res","knownOperators","code","captureStackTrace","recurseTimes","ctx","custom","util","createErrorType","Base","NodeError","_Base","arg1","arg2","arg3","getMessage","oneOf","thing","isArray","len","map","determiner","start","substr","replace","type","reason","inspected","RangeError","_slicedToArray","arr","_arrayWithHoles","return","_iterableToArrayLimit","minLen","_arrayLikeToArray","from","test","_unsupportedIterableToArray","_nonIterableRest","arr2","regexFlagsSupported","flags","arrayFromSet","array","arrayFromMap","is","objectGetOwnPropertySymbols","numberIsNaN","Number","isNaN","uncurryThis","propertyIsEnumerable","objectToString","isAnyArrayBuffer","isArrayBufferView","isDate","isMap","isSet","isNativeError","isBoxedPrimitive","isNumberObject","isStringObject","isBooleanObject","isBigIntObject","isSymbolObject","isFloat32Array","isFloat64Array","isNonIndex","charCodeAt","pow","getOwnNonIndexProperties","compare","x","y","min","innerDeepEqual","val1","val2","memos","buf1","buf2","val1Tag","keys1","keys2","keyCheck","Date","getTime","RegExp","byteLength","Uint8Array","buffer","byteOffset","areSimilarTypedArrays","offset","areSimilarFloatArrays","_keys","_keys2","size","BigInt","isEqualBoxedPrimitive","getEnumerables","k","iterationType","aKeys","bKeys","symbolKeysA","symbolKeysB","_symbolKeysB","position","val2MemoA","val2MemoB","areEq","memo","aValues","Set","add","setMightHaveLoosePrim","bValues","_i","_val","setHasEqualElement","setEquiv","aEntries","_aEntries$i","item1","item2","mapMightHaveLoosePrim","bEntries","_i2","_bEntries$_i","item","mapHasEqualEntry","mapEquiv","keysA","objEquiv","delete","setValues","findLooseMatchingPrimitives","altValue","curB","key1","key2","privatePropTypes","_dashprivate_transformConfig","PropTypes","_dashprivate_transformFigure","_dashprivate_onFigureModified","EMPTY_DATA","PlotlyGraph","Component","super","mathjax","_loadMathjax","state","prependData","extendData","clearState","componentDidMount","setState","componentWillUnmount","UNSAFE_componentWillReceiveProps","nextProps","figure","dataKey","data","render","React","ControlledPlotlyGraph","_extends","RealPlotlyGraph","asyncDecorator","all","Plotly","reject","timeoutId","element","document","createElement","src","_dashPlotlyJSURL","async","onload","clearTimeout","onerror","querySelector","appendChild","lazyLoadMathJax","_ref","className","id","extendedClassName","Suspense","fallback","displayName","propTypes","responsive","clickData","clickAnnotationData","hoverData","clear_on_unhover","selectedData","relayoutData","restyleData","layout","frames","style","animate","animation_options","config","staticPlot","plotlyServerURL","editable","editSelection","edits","annotationPosition","annotationTail","annotationText","axisTitleText","colorbarPosition","colorbarTitleText","legendPosition","legendText","shapePosition","titleText","autosizable","queueLength","fillFrame","frameMargins","scrollZoom","doubleClick","doubleClickDelay","showTips","showAxisDragHandles","showAxisRangeEntryBoxes","showLink","sendData","linkText","displayModeBar","showSendToCloud","showEditInChartStudio","modeBarButtonsToRemove","modeBarButtonsToAdd","modeBarButtons","toImageButtonOptions","format","filename","width","height","scale","displaylogo","watermark","plotGlPixelRatio","topojsonURL","mapboxAccessToken","locale","locales","displayNotifier","setProps","defaultProps","frame","redraw","transition","duration","ease","graphPropTypes","graphDefaultProps","Graph_react","event","params","bubbles","cancelable","detail","evt","createEvent","initCustomEvent","Event","Link","_ref$refresh","refresh","_objectWithoutProperties","_excluded","href","children","title","cleanUrl","dash_clientside","clean_url","sanitizedUrl","useMemo","loading","dash_component_api","useDashContext","useLoading","useEffect","_dash_error","onClick","metaKey","shiftKey","altKey","ctrlKey","isNil","preventDefault","location","history","pushState","scrollTo","isRequired","loading_state","is_loading","prop_name","component_name","__webpack_exports__","A","DashMarkdown","RealDashMarkdown","dangerously_allow_html","link_target","dedent","highlight_config","theme","upload","RealUpload","Upload","contents","last_modified","accept","disabled","disable_click","max_size","min_size","multiple","enable_folder_selection","className_active","className_reject","className_disabled","style_active","style_reject","style_disabled","borderStyle","borderColor","backgroundColor","opacity","MathJax","LoadingElement","ref","_ref$elementType","elementType","givenProps","dropdown","RealDropdown","defaultLabels","select_all","deselect_all","selected_count","clear_search","clear_selection","no_options_found","Dropdown","_ref$clearable","clearable","_ref$disabled","_ref$multi","multi","_ref$searchable","searchable","_ref$labels","labels","_ref$optionHeight","optionHeight","_ref$maxHeight","maxHeight","_ref$closeOnSelect","closeOnSelect","persisted_props","PersistedProps","persistence_type","PersistenceTypes","local","dashPersistence","styleTagTransform","styleTagTransform_default","setAttributes","setAttributesWithoutAttributes_default","insert","parent","lastInsertedElement","_lastElementInsertedByStyleLoader","nextSibling","insertBefore","firstChild","domAPI","styleDomAPI_default","insertStyleElement","insertStyleElement_default","injectStylesIntoStyleTag_default","locals","convert","fastIsNumeric","isNumeric","NaN","isEquivalent","v1","v2","inputProps","Input","_ref$type","HTMLInputTypes","text","_ref$inputMode","inputMode","_ref$n_blur","n_blur","_ref$n_submit","n_blur_timestamp","n_submit","_ref$debounce","n_submit_timestamp","debounce","_ref$step","step","_ref$autoComplete","autoComplete","useRef","_useState2","useState","setValue","_useState4","pendingEvent","setPendingEvent","inputId","uniqid","valprops","number","setPropValue","useCallback","current","checkValidity","onEvent","inputValue","valueAsNumber","propValue","onBlur","now","onChange","onKeyPress","setInputValue","debounceEvent","seconds","handleStepperClick","direction","currentValue","parseFloat","stepAsNum","decimalPlaces","constrainedValue","roundedValue","toFixed","cursorPosition","selectionStart","isFinite","setSelectionRange","disabledAsBool","includes","pickedInputs","pick","isNumberInput","currentNumericValue","minValue","maxValue","isDecrementDisabled","isIncrementDisabled","loadingProps","hidden","trim","components_Input","CalendarDirection","additionalProps","assign","safeIsNaN","isEqual","first","second","areInputsEqual","newInputs","lastInputs","memoize_one_esm","resultFn","lastThis","lastResult","lastArgs","calledOnce","newArgs","performance","cancelTimeout","timeoutID","cancelAnimationFrame","getScrollbarSize","recalculate","div","overflow","body","offsetWidth","clientWidth","removeChild","cachedRTLResult","getRTLOffsetType","outerDiv","outerStyle","innerDiv","innerStyle","scrollLeft","defaultItemKey$1","index","createListComponent","_class","getItemOffset","getEstimatedTotalSize","getItemSize","getOffsetForIndexAndAlignment","getStartIndexForOffset","getStopIndexForStartIndex","initInstanceProps","shouldResetStyleCacheOnItemSizeChange","validateProps","_PureComponent","List","_instanceProps","_outerRef","_resetIsScrollingTimeoutId","isScrolling","scrollDirection","scrollOffset","initialScrollOffset","scrollUpdateWasRequested","_callOnItemsRendered","memoizeOne","overscanStartIndex","overscanStopIndex","visibleStartIndex","visibleStopIndex","onItemsRendered","_callOnScroll","onScroll","_getItemStyle","_this$props","itemSize","itemStyleCache","_getItemStyleCache","isHorizontal","isRtl","offsetHorizontal","left","right","top","_offset","_","__","___","_onScrollHorizontal","_event$currentTarget","currentTarget","scrollWidth","prevState","_resetIsScrollingDebounced","_onScrollVertical","_event$currentTarget2","clientHeight","scrollHeight","scrollTop","_outerRefSetter","outerRef","callback","delay","_resetIsScrolling","requestAnimationFrame","tick","getDerivedStateFromProps","validateSharedProps","_proto","scrollToItem","align","_this$props2","itemCount","scrollbarSize","_this$props3","_callPropsCallbacks","componentDidUpdate","_this$props4","_this$state","_this$props5","innerRef","innerElementType","innerTagName","itemData","_this$props5$itemKey","itemKey","outerElementType","outerTagName","useIsScrolling","_this$_getRangeToRend","_getRangeToRender","startIndex","stopIndex","items","_index","estimatedTotalSize","WebkitOverflowScrolling","willChange","pointerEvents","_this$_getRangeToRend2","_overscanStartIndex","_overscanStopIndex","_visibleStartIndex","_visibleStopIndex","_this$state2","_scrollDirection","_scrollOffset","_scrollUpdateWasRequested","_this$props6","overscanCount","_this$state3","overscanBackward","overscanForward","PureComponent","validateSharedProps$1","_ref2","_ref3","getItemMetadata$1","instanceProps","itemMetadataMap","lastMeasuredIndex","itemMetadata","findNearestItemBinarySearch$1","high","low","middle","currentOffset","estimatedItemSize","totalSizeOfMeasuredItems","VariableSizeList","maxOffset","minOffset","round","findNearestItemBinarySearch","interval","findNearestItemExponentialSearch","findNearestItem$1","getItemMetadata","resetAfterIndex","shouldForceUpdate","forceUpdate","_ref5","optionslist","OptionLabel","label","ExternalWrapper","component","componentPath","displayLabel","Option","option","isSelected","optionClassName","optionStyle","_ref2$inputType","inputType","inputClassName","inputStyle","labelClassName","labelStyle","classNames","inputClassNames","labelClassNames","role","checked","onKeyUp","readOnly","Row","selected","passThruProps","setOptionHeight","measureRef","el","immediateHeight","getBoundingClientRect","ResizeObserver","_ref4","_entry$borderBoxSize$","_entry$borderBoxSize","entry","borderBoxSize","blockSize","contentRect","observe","OptionsList","forwardRef","_ref6","onSelectionChange","_ref6$maxHeight","innerHeight","listRef","containerRef","pendingFocusRef","heightsRef","measuredHeight","setMeasuredHeight","defaultOptionHeight","getOptionHeight","_heightsRef$current$g","_listRef$current","useLayoutEffect","_listRef$current2","h","defaultListHeight","listHeight","focusOption","optionIndex","_containerRef$current","deferred","HTMLElement","focus","useImperativeHandle","focusItem","handleChange","newValue","without","append","handleItemsRendered","sizerDiv","longestOption","maxLen","_data$options$index$v","_data$options$index","sanitizeOptions","valueSet","opt","isOptionValue","entries","bg","b64","tmp","lens","validLen","getLens","placeHoldersLen","Arr","_byteLength","curByte","revLookup","lookup","$apply","$call","$reflectApply","actualApply","$TypeError","$actualApply","GetIntrinsic","callBind","$indexOf","allowMissing","intrinsic","setFunctionLength","$defineProperty","callBindBasic","applyBind","originalFunction","func","adjustedLength","times","g","functions","time","object","expression","tuple","___CSS_LOADER_EXPORT___","_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default","_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default","version","sources","names","mappings","sourcesContent","sourceRoot","cssWithMappingToString","list","content","needLayer","modules","media","dedupe","supports","layer","alreadyImportedModules","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","sourceMapping","$SyntaxError","gopd","property","nonEnumerable","nonWritable","nonConfigurable","loose","desc","hasSymbols","toStr","defineDataProperty","supportsDescriptors","predicate","predicates","hasProtoAccessor","gOPD","$Object","$getPrototypeOf","EvalError","SyntaxError","URIError","allBlankCharCodes","original","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_RESULT__","XMLHttpRequest","open","responseType","response","send","status","MouseEvent","initMouseEvent","global","navigator","userAgent","saveAs","HTMLAnchorElement","URL","webkitURL","j","download","rel","origin","createObjectURL","revokeObjectURL","msSaveOrOpenBlob","autoBom","Blob","innerText","safari","FileReader","onloadend","readAsDataURL","isCallable","thisArg","receiver","forEachArray","charAt","forEachString","forEachObject","concatty","that","bound","arrLike","slicy","boundLength","boundArgs","joiny","Empty","implementation","$Error","$EvalError","$RangeError","$ReferenceError","$URIError","abs","sign","$Function","getEvalledConstructor","expressionSyntax","$gOPD","throwTypeError","ThrowTypeError","calleeThrows","gOPDthrows","$ObjectGPO","$ReflectGPO","needsEval","TypedArray","INTRINSICS","AggregateError","ArrayBuffer","Atomics","BigInt64Array","BigUint64Array","DataView","decodeURI","decodeURIComponent","encodeURI","eval","Float16Array","Float32Array","Float64Array","FinalizationRegistry","Int8Array","Int16Array","Int32Array","parseInt","SharedArrayBuffer","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","WeakRef","WeakSet","errorProto","doEval","gen","LEGACY_ALIASES","hasOwn","$concat","$spliceApply","splice","$replace","$strSlice","$exec","exec","rePropName","reEscapeChar","getBaseIntrinsic","alias","intrinsicName","parts","last","quote","subString","stringToPath","intrinsicBaseName","intrinsicRealName","skipFurtherCaching","isOwn","part","reflectGetProto","originalGetProto","getDunderProto","O","hasPropertyDescriptors","hasArrayLengthDefineBug","origSymbol","hasSymbolSham","sym","symObj","getOwnPropertyNames","syms","$hasOwn","ctor","superCtor","super_","TempCtor","hasToStringTag","$toString","callBound","isStandardArguments","isLegacyArguments","callee","supportsStandardArguments","badArrayLike","isCallableMarker","fnToStr","reflectApply","constructorRegex","isES6ClassFn","fnStr","tryFunctionObject","isIE68","isDDA","strClass","GeneratorFunction","isFnRegex","generatorFunc","getGeneratorFunc","define","getPolyfill","shim","polyfill","whichTypedArray","$isNaN","keysShim","isArgs","isEnumerable","hasDontEnumBug","hasProtoEnumBug","dontEnums","equalsConstructorPrototype","excludedKeys","$applicationCache","$console","$external","$frame","$frameElement","$frames","$innerHeight","$innerWidth","$onmozfullscreenchange","$onmozfullscreenerror","$outerHeight","$outerWidth","$pageXOffset","$pageYOffset","$parent","$scrollLeft","$scrollTop","$scrollX","$scrollY","$self","$webkitIndexedDB","$webkitStorageInfo","$window","hasAutomationEqualityBug","isObject","isFunction","isArguments","isString","theKeys","skipProto","skipConstructor","equalsConstructorPrototypeIfNotBuggy","origKeys","originalKeys","keysWorksWithArguments","objectKeys","toObject","$push","$propIsEnumerable","originalGetSymbols","source1","to","getSymbols","nextKey","letters","lacksProperEnumerationOrder","preventExtensions","thrower","assignHasPendingExceptions","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","timeout","run","marker","runClearTimeout","Item","noop","nextTick","browser","env","argv","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","binding","cwd","chdir","dir","umask","hasDescriptors","$floor","functionLengthIsConfigurable","functionLengthIsWritable","stylesInDOM","getIndexByIdentifier","identifier","modulesToDom","idCountMap","identifiers","indexByIdentifier","css","sourceMap","references","updater","addElementStyle","byIndex","api","update","newObj","remove","lastIdentifiers","newList","newLastIdentifiers","attributes","styleElement","nonce","nc","setAttribute","parentNode","removeStyleElement","styleSheet","cssText","createTextNode","pid","prefix","suffix","copy","fill","readUInt8","isArgumentsObject","isGeneratorFunction","isTypedArray","BigIntSupported","SymbolSupported","ObjectToString","numberValue","stringValue","booleanValue","bigIntValue","symbolValue","checkBoxedPrimitive","prototypeValueOf","isMapToString","isSetToString","isWeakMapToString","isWeakSetToString","isArrayBufferToString","isArrayBuffer","working","isDataViewToString","isDataView","isView","isUint8Array","isUint8ClampedArray","isUint16Array","isUint32Array","isInt8Array","isInt16Array","isInt32Array","isBigInt64Array","isBigUint64Array","isWeakMap","isWeakSet","SharedArrayBufferCopy","isSharedArrayBufferToString","isSharedArrayBuffer","isAsyncFunction","isMapIterator","isSetIterator","isGeneratorObject","isWebAssemblyCompiledModule","method","descriptors","formatRegExp","objects","isNull","deprecate","noDeprecation","throwDeprecation","traceDeprecation","trace","debugs","debugEnvRegex","NODE_DEBUG","debugEnv","toUpperCase","opts","seen","stylize","stylizeNoColor","colors","isBoolean","_extend","isUndefined","stylizeWithColor","formatValue","styleType","styles","ret","primitive","simple","isNumber","formatPrimitive","visibleKeys","hash","idx","arrayToHash","isError","formatError","output","braces","toUTCString","formatProperty","formatArray","reduce","reduceToSingleString","line","ar","re","pad","debuglog","bold","italic","underline","inverse","grey","black","cyan","magenta","yellow","special","boolean","null","date","types","isNullOrUndefined","isSymbol","isPrimitive","isBuffer","months","prop","getHours","getMinutes","getSeconds","getDate","getMonth","inherits","kCustomPromisifiedSymbol","callbackifyOnRejected","cb","newReason","promisify","promiseResolve","promiseReject","promise","callbackify","callbackified","maybeCb","rej","availableTypedArrays","globalThis","typedArrays","$slice","cache","typedArray","proto","superProto","tag","found","getter","trySlices","tryTypedArrays","possibleNames","out","defaultOptions","getDefaultOptions","dateLongFormatter","pattern","formatLong","timeLongFormatter","longFormatters","P","dateTimeLongFormatter","dateTimeFormat","matchResult","datePattern","timePattern","dateTime","getTimezoneOffsetInMilliseconds","_date","toDate","utcDate","UTC","getFullYear","getMilliseconds","setUTCFullYear","normalizeDates","context","dates","normalize","constructFrom","find","dayOfYearTokenRE","weekYearTokenRE","throwTokens","isProtectedDayOfYearToken","token","isProtectedWeekYearToken","warnOrThrowProtectedError","_message","subject","toLowerCase","millisecondsInWeek","millisecondsInDay","millisecondsInMinute","millisecondsInHour","millisecondsInSecond","constructFromSymbol","for","differenceInCalendarDays","laterDate","earlierDate","_normalizeDates2","in","laterDate_","earlierDate_","laterStartOfDay","startOfDay","earlierStartOfDay","laterTimestamp","earlierTimestamp","getDayOfYear","date_","setFullYear","setHours","startOfYear","addLeadingZeros","targetLength","padStart","lightFormatters","signedYear","year","M","month","dayPeriodEnumValue","H","S","numberOfDigits","milliseconds","trunc","formatters","G","localize","era","ordinalNumber","unit","Y","signedWeekYear","getWeekYear","weekYear","R","getISOWeekYear","Q","quarter","ceil","q","L","w","week","getWeek","I","isoWeek","getISOWeek","D","dayOfYear","E","dayOfWeek","getDay","day","localDayOfWeek","weekStartsOn","isoDayOfWeek","dayPeriod","hours","B","K","X","_localize","timezoneOffset","getTimezoneOffset","formatTimezoneWithOptionalMinutes","formatTimezone","formatTimezoneShort","z","T","delimiter","absOffset","minutes","formattingTokensRegExp","longFormattingTokensRegExp","escapedStringRegExp","doubleQuoteRegExp","unescapedLatinCharacterRegExp","formatStr","_options$locale","_options$firstWeekCon","_options$locale2","_defaultOptions$local","_ref7","_options$weekStartsOn","_options$locale3","_defaultOptions$local2","defaultLocale","firstWeekContainsDate","originalDate","isValid","firstCharacter","longFormatter","isToken","matched","preprocessor","formatterOptions","useAdditionalWeekYearTokens","useAdditionalDayOfYearTokens","formatter","diff","startOfISOWeek","fourthOfJanuary","startOfISOWeekYear","fourthOfJanuaryOfNextYear","startOfNextYear","fourthOfJanuaryOfThisYear","startOfThisYear","startOfWeek","firstWeek","startOfWeekYear","firstWeekOfNextYear","firstWeekOfThisYear","formatDistanceLocale","lessThanXSeconds","one","xSeconds","halfAMinute","lessThanXMinutes","xMinutes","aboutXHours","xHours","xDays","aboutXWeeks","xWeeks","aboutXMonths","xMonths","aboutXYears","xYears","overXYears","almostXYears","buildFormatLongFn","defaultWidth","formats","full","long","medium","short","formatRelativeLocale","lastWeek","yesterday","today","tomorrow","nextWeek","buildLocalizeFn","valuesArray","formattingValues","defaultFormattingWidth","values","argumentCallback","dirtyNumber","_options","rem100","narrow","abbreviated","wide","am","pm","midnight","noon","morning","afternoon","evening","night","buildMatchFn","matchPattern","matchPatterns","defaultMatchWidth","matchedString","parsePatterns","defaultParseWidth","findIndex","findKey","valueCallback","rest","parsePattern","parseResult","any","enUS","formatDistance","tokenValue","addSuffix","formatRelative","_baseDate","parseISO","argument","_options$additionalDi","invalidDate","additionalDigits","dateStrings","dateString","timeString","patterns","dateTimeDelimiter","timeZoneDelimiter","timezone","splitDateString","parseYearResult","regex","captures","restDateString","century","parseYear","dateRegex","isWeekDate","parseDateUnit","_year","validateWeekDate","isoWeekYear","getUTCDay","setUTCDate","getUTCDate","dayOfISOWeekYear","daysInMonths","isLeapYearIndex","validateDate","validateDayOfYearDate","parseDate","timestamp","timeRegex","parseTimeUnit","validateTime","parseTime","tmpDate","getUTCFullYear","getUTCMonth","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","timezoneString","timezoneRegex","_hours","validateTimezone","parseTimezone","setDate","es_append","set1","set2","len1","len2","_concat","_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__","_internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__","_toString_js__WEBPACK_IMPORTED_MODULE_4__","_internal_isString_js__WEBPACK_IMPORTED_MODULE_3__","_internal_isFunction_js__WEBPACK_IMPORTED_MODULE_2__","_arrayFromIterator","iter","_includesWith","pred","internal_objectIs","_uniqContentEquals","aIterator","bIterator","stackA","stackB","eq","_a","_b","_equals","aItem","typeA","equals","ignoreCase","multiline","sticky","unicode","extendedStackA","extendedStackB","_has","es_equals","_curry2","XFilter","xf","_xfBase","init","_xfilter","es_filter","_dispatchable","filterable","_isObject","reducer","acc","_arrayReduce","_filter","es_hasPath","_path","es_has","_internal_includes_js__WEBPACK_IMPORTED_MODULE_0__","_curry1","f1","_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__","f2","_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_1__","_curry1_js__WEBPACK_IMPORTED_MODULE_0__","methodNames","transducerCreator","_isArray","_isTransformer","transducer","_includes","inf","_indexOf","_isArguments","_has_js__WEBPACK_IMPORTED_MODULE_0__","_isFunction","_isPlaceholder","_isString","hasEnumBug","nonEnumerableProps","hasArgsEnumBug","contains","_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__","nIdx","ks","checkArgsLength","_internal_isArguments_js__WEBPACK_IMPORTED_MODULE_2__","_internal_has_js__WEBPACK_IMPORTED_MODULE_1__","omit","es_reject","_map","functor","_quote","internal_toISOString","toISOString","_toString","recur","xs","mapPairs","sort","repr","es_toString","hasOrAdd","shouldAdd","prevSize","_items","_nativeSet","bIdx","internal_Set","_Set","es_without","toRemove","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","mode","ns","def","definition","chunkId","promises","url","script","needAttach","scripts","getElementsByTagName","getAttribute","charset","onScriptComplete","doneFns","head","scriptUrl","importScripts","currentScript","tagName","getCurrentScript","doc_scripts","textContent","jsonpScriptSrc","__jsonpScriptSrc__","isLocal","srcFragments","fileFragments","installedChunks","installedChunkData","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","css_button","components_Button","_ref$n_clicks","n_clicks","n_clicks_timestamp","isLoading","checklist_options","checklist","Checklist","_ref$inputStyle","_ref$inputClassName","_ref$labelStyle","_ref$labelClassName","_ref$options","_ref$value","_ref$inline","inline","sanitizedOptions","stylingProps","selection","_defineProperty","_arr","_n","_d","_e","_s","_WINDOW","_DOCUMENT","_PERFORMANCE","measure","MutationObserver","_ref$userAgent","WINDOW","DOCUMENT","PERFORMANCE","IS_DOM","documentElement","NAMESPACE_IDENTIFIER","DEFAULT_REPLACEMENT_CLASS","oneToTen","oneToTwenty","DUOTONE_CLASSES","GROUP","SWAP_OPACITY","PRIMARY","SECONDARY","initial","FontAwesomeConfig","attr","coerce","getAttrConfig","_config","familyPrefix","replacementClass","autoReplaceSvg","autoAddCss","autoA11y","searchPseudoElements","observeMutations","mutateApproach","keepOriginalSource","measurePerformance","showMissingIcons","hooks","shims","namespace","doScroll","readyState","listener","asyncTimer","PENDING","SETTLED","FULFILLED","REJECTED","NOOP","isNode","asyncSetTimer","setImmediate","asyncQueue","asyncFlush","asyncCall","invokeCallback","subscriber","owner","settled","_state","_data","handleThenable","resolved","fulfill","publishFulfillment","publishRejection","publish","_then","_handled","notifyRejectionHandled","resolver","rejectPromise","invokeResolver","onFulfillment","onRejection","fulfilled","rejected","results","remaining","race","meaninglessTransform","rotate","flipX","flipY","nextUniqueId","random","htmlEscape","joinStyles","styleName","transformIsMeaningful","transform","transformForSvg","containerWidth","iconWidth","outer","innerTranslate","innerScale","innerRotate","inner","path","ALL_SPACE","fillBlack","abstract","force","initialValue","thisContext","bindInternal4","defineIcons","icons","_params$skipHooks","skipHooks","normalized","iconName","icon","addPack","build","ligatures","ligature","hasRegular","oldName","iconFromMapping","mapping","toHtml","abstractNodes","_abstractNodes$attrib","_abstractNodes$childr","attributeName","joinAttributes","MissingIcon","FILL","ANIMATION_BASE","attributeType","repeatCount","dur","OPACITY_ANIMATE","asFoundIcon","vectorData","class","cx","cy","Library","definitions","additions","_pullDefinitions","_normalized$key","ensureCss","_cssInserted","innerHTML","headChildren","childNodes","beforeChild","child","insertCss","dfp","drc","fp","rc","dPatt","customPropPatt","rPatt","findIconDefinition","iconLookup","_iconLookup$prefix","library","parse","transformString","parseTransformString","iconDefinition","abstractCreator","_params$transform","_params$symbol","symbol","_params$mask","mask","_params$maskId","maskId","_params$title","_params$titleId","titleId","_params$classes","classes","_params$attributes","_params$styles","_params$icons","main","extra","_params$watchable","watchable","isUploadedIcon","widthClass","attrClass","xmlns","viewBox","uploadedIconWidthStyle","explicitMaskId","mainWidth","mainPath","maskWidth","maskPath","trans","maskRect","maskInnerGroupChildrenMixin","maskInnerGroup","maskOuterGroup","clipId","maskTag","maskUnits","maskContentUnits","defs","makeIconMasking","styleString","makeIconStandard","asSymbol","asIcon","makeInlineSvgAbstract","container","html","maybeIconDefinition","enumerableOnly","symbols","_objectSpread2","index_es_defineProperty","index_es_typeof","index_es_objectWithoutProperties","excluded","sourceKeys","index_es_objectWithoutPropertiesLoose","sourceSymbolKeys","index_es_toConsumableArray","index_es_arrayWithoutHoles","index_es_iterableToArray","index_es_nonIterableSpread","camelize","chr","_excluded$1","index_es_PRODUCTION","normalizeIconArgs","objectWithKey","index_es_excluded","FontAwesomeIcon","forwardedRef","iconArgs","maskArgs","_classes","beat","fade","beatFade","bounce","shake","flash","spin","spinPulse","spinReverse","pulse","fixedWidth","border","listItem","flip","rotation","pull","swapOpacity","classList","renderedIcon","_console","index_es_console","extraProps","convertCurry","external_PropTypes_default","bool","oneOfType","mixins","attrs","pair","startsWith","_extraProps$style","existingStyle","external_React_default","faCheckCircle","faCopy","Generator","_regeneratorDefine2","v","GeneratorFunctionPrototype","_regenerator","_invoke","asyncGeneratorStep","_asyncToGenerator","_next","_throw","clipboardAPI","clipboard","wait","ms","Clipboard","copyToClipboard","onClickHandler","copySuccess","getTargetText","stringifyId","copied","prevProps","wild","htmlContent","_callee","showCopiedIcon","blobHtml","blobText","_context","ClipboardItem","write","writeText","target_id","getElementById","_this2","_callee2","_context2","_this3","_callee3","_context3","html_content","copied_children","button_children","DashContext","ConfirmDialog","_update","displayed","shouldTriggerDisplay","cancel_n_clicks","submit_n_clicks","confirm","submit_n_clicks_timestamp","cancel_n_clicks_timestamp","ConfirmDialogProvider","wrapClick","datePickerRange","DatePickerPersistence","extract","parsed","storedValue","RealDatePickerRange","DatePickerRange","_ref$calendar_orienta","calendar_orientation","_ref$is_RTL","is_RTL","_ref$day_size","day_size","_ref$with_portal","with_portal","_ref$with_full_screen","with_full_screen_portal","_ref$first_day_of_wee","first_day_of_week","_ref$number_of_months","number_of_months_shown","_ref$stay_open_on_sel","stay_open_on_select","_ref$reopen_calendar_","reopen_calendar_on_clear","_ref$show_outside_day","show_outside_days","_ref$updatemode","updatemode","_ref$disabled_days","start_date","end_date","disabled_days","persistenceTransforms","transformDate","datePickerSingle","RealDatePickerSingle","DatePickerSingle","_ref$placeholder","placeholder","getValue","Download","toByteArray","blob","Geolocation","success","updatePosition","update_now","geolocation","positionOptions","enableHighAccuracy","high_accuracy","maximumAge","maximum_age","getCurrentPosition","_crd$latitude","_crd$longitude","_crd$accuracy","_crd$altitude","_crd$altitudeAccuracy","_crd$speed","_crd$heading","crd","coords","position_obj","lat","latitude","lon","longitude","accuracy","alt","altitude","alt_accuracy","altitudeAccuracy","speed","heading","local_date","toLocaleString","position_error","show_alert","alert","Interval","intervalId","reportInterval","handleTimer","max_intervals","n_intervals","clearTimer","setInterval","resetTimer","clearInterval","es_toPairs","pairs","XAny","_xany","es_any","DebugTitle","spinnerComponentOptions","graph","debugTitle","fullscreen","debug","spinnerClass","cube","color","circle","dot","coveringSpinner","visibility","display","justifyContent","alignItems","components_Loading","targetComponents","_ref3$display","_ref3$color","parent_className","parent_style","overlay_style","_ref3$show_initially","show_initially","_ref3$type","spinnerType","_ref3$delay_hide","delay_hide","_ref3$delay_show","delay_show","target_components","custom_spinner","useSelector","stringPath","loadingChildren","toPairs","load","showSpinner","setShowSpinner","dismissTimer","showTimer","containerStyle","Spinner","getSpinner","Location","updateLocation","onLocationChange","pathname","propsToSet","checkExistsUpdateWindowLocation","fieldName","propVal","pathnameUpdated","hrefUpdated","hashUpdated","searchUpdated","searchVal","hashVal","propsToChange","History","dispatchChangeEvent","radioitems_options","RadioItems","radioitems","rangeSlider","sliders_options","sliders","RealRangeSlider","RangeSlider","_ref$verticalHeight","verticalHeight","_ref$allow_direct_inp","allow_direct_input","isInteger","RealSlider","Slider","drag_value","mappedValue","mappedDragValue","mappedSetProps","newProps","mappedProps","MemStore","_modified","getItem","setItem","setModified","removeItem","getModified","WebStore","storage","_storage","Store","storage_type","_backstore","localStorage","sessionStorage","onStorageChange","oldValue","modified_timestamp","UNSAFE_componentWillMount","old","clear_data","tabs_options","tabs","components_Tab","disabled_style","EnhancedTab","selected_className","selected_style","selectHandler","_ref$disabled_style","disabled_className","labelDisplay","rawPath","tabStyle","tabClassNames","Tabs","EnhancedTabs","selectedTab","_ref2$mobile_breakpoi","mobile_breakpoint","_ref2$colors","primary","background","_ref2$vertical","vertical","initializedRef","isAboveBreakpoint","setIsAboveBreakpoint","parseChildrenToArray","valueOrDefault","_firstChildren$value","getLayout","mediaQuery","matchMedia","matches","handler","_childProps$style","childProps","flex","selectedTabContent","tabContainerClassNames","tabContentClassNames","content_className","tabParentClassNames","cssVars","content_style","dashChildrenUpdate","components_Tabs","textarea_options","css_textarea","textAreaProps","Textarea","required","autoFocus","components_Textarea","tooltip_options","tooltip","components_Tooltip","_ref$show","show","_ref$targetable","targetable","_ref$direction","_ref$border_color","border_color","_ref$background_color","background_color","_ref$className","_ref$zindex","zindex","_ref$loading_text","loading_text","bbox","show_tooltip","x0","x1","y0","y1","dcc_options","dcc"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"dash_core_components.js","mappings":"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","sources":["webpack:///webpack/runtime/create fake namespace object","webpack:///webpack/runtime/load script","webpack:///./node_modules/@plotly/dash-component-plugins/dist/index.js","webpack:///./node_modules/assert/build/assert.js","webpack:///./node_modules/assert/build/internal/assert/assertion_error.js","webpack:///./node_modules/assert/build/internal/errors.js","webpack:///./node_modules/assert/build/internal/util/comparisons.js","webpack:///./src/fragments/Graph.privateprops.js","webpack:///./src/components/Graph.react.js","webpack:///./src/utils/LazyLoader/graph.js","webpack:///./src/utils/LazyLoader/plotly.js","webpack:///./src/components/Link.react.js","webpack:///./src/components/Markdown.react.js","webpack:///./src/utils/LazyLoader/markdown.js","webpack:///./src/utils/LazyLoader/upload.js","webpack:///./src/components/Upload.react.js","webpack:///./src/utils/LazyLoader/mathjax.js","webpack:///./src/utils/LoadingElement.js","webpack:///./src/utils/LazyLoader/dropdown.ts","webpack:///./src/components/Dropdown.tsx","webpack:///./src/components/css/input.css?ceae","webpack:///./src/components/Input.tsx","webpack:///./src/types.ts","webpack:///./src/utils/_LoadingElement.tsx","webpack:///./node_modules/@babel/runtime/helpers/esm/extends.js","webpack:///./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack:///./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack:///./node_modules/memoize-one/dist/memoize-one.esm.js","webpack:///../src/timer.js","webpack:///../src/domHelpers.js","webpack:///../src/createGridComponent.js","webpack:///../src/createListComponent.js","webpack:///./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack:///../src/VariableSizeList.js","webpack:///./src/components/css/optionslist.css?1ebf","webpack:///./src/utils/optionRendering.tsx","webpack:///./src/utils/optionTypes.ts","webpack:///./node_modules/base64-js/index.js","webpack:///./node_modules/call-bind-apply-helpers/actualApply.js","webpack:///./node_modules/call-bind-apply-helpers/applyBind.js","webpack:///./node_modules/call-bind-apply-helpers/functionApply.js","webpack:///./node_modules/call-bind-apply-helpers/functionCall.js","webpack:///./node_modules/call-bind-apply-helpers/index.js","webpack:///./node_modules/call-bind-apply-helpers/reflectApply.js","webpack:///./node_modules/call-bind/callBound.js","webpack:///./node_modules/call-bind/index.js","webpack:///./node_modules/call-bound/index.js","webpack:///./node_modules/console-browserify/index.js","webpack:///./src/components/css/button.css","webpack:///./src/components/css/checklist.css","webpack:///./src/components/css/dcc.css","webpack:///./src/components/css/input.css","webpack:///./src/components/css/optionslist.css","webpack:///./src/components/css/radioitems.css","webpack:///./src/components/css/sliders.css","webpack:///./src/components/css/tabs.css","webpack:///./src/components/css/textarea.css","webpack:///./src/components/css/tooltip.css","webpack:///./node_modules/css-loader/dist/runtime/api.js","webpack:///./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack:///./node_modules/define-data-property/index.js","webpack:///./node_modules/define-properties/index.js","webpack:///./node_modules/dunder-proto/get.js","webpack:///./node_modules/es-define-property/index.js","webpack:///./node_modules/es-errors/eval.js","webpack:///./node_modules/es-errors/index.js","webpack:///./node_modules/es-errors/range.js","webpack:///./node_modules/es-errors/ref.js","webpack:///./node_modules/es-errors/syntax.js","webpack:///./node_modules/es-errors/type.js","webpack:///./node_modules/es-errors/uri.js","webpack:///./node_modules/es-object-atoms/index.js","webpack:///./node_modules/fast-isnumeric/index.js","webpack:///./node_modules/file-saver/dist/FileSaver.min.js","webpack:///./node_modules/for-each/index.js","webpack:///./node_modules/function-bind/implementation.js","webpack:///./node_modules/function-bind/index.js","webpack:///./node_modules/get-intrinsic/index.js","webpack:///./node_modules/get-proto/Object.getPrototypeOf.js","webpack:///./node_modules/get-proto/Reflect.getPrototypeOf.js","webpack:///./node_modules/get-proto/index.js","webpack:///./node_modules/gopd/gOPD.js","webpack:///./node_modules/gopd/index.js","webpack:///./node_modules/has-property-descriptors/index.js","webpack:///./node_modules/has-symbols/index.js","webpack:///./node_modules/has-symbols/shams.js","webpack:///./node_modules/has-tostringtag/shams.js","webpack:///./node_modules/hasown/index.js","webpack:///./node_modules/inherits/inherits_browser.js","webpack:///./node_modules/is-arguments/index.js","webpack:///./node_modules/is-callable/index.js","webpack:///./node_modules/is-generator-function/index.js","webpack:///./node_modules/is-nan/implementation.js","webpack:///./node_modules/is-nan/index.js","webpack:///./node_modules/is-nan/polyfill.js","webpack:///./node_modules/is-nan/shim.js","webpack:///./node_modules/is-string-blank/index.js","webpack:///./node_modules/is-typed-array/index.js","webpack:///./node_modules/math-intrinsics/abs.js","webpack:///./node_modules/math-intrinsics/floor.js","webpack:///./node_modules/math-intrinsics/isNaN.js","webpack:///./node_modules/math-intrinsics/max.js","webpack:///./node_modules/math-intrinsics/min.js","webpack:///./node_modules/math-intrinsics/pow.js","webpack:///./node_modules/math-intrinsics/round.js","webpack:///./node_modules/math-intrinsics/sign.js","webpack:///./node_modules/object-is/implementation.js","webpack:///./node_modules/object-is/index.js","webpack:///./node_modules/object-is/polyfill.js","webpack:///./node_modules/object-is/shim.js","webpack:///./node_modules/object-keys/implementation.js","webpack:///./node_modules/object-keys/index.js","webpack:///./node_modules/object-keys/isArguments.js","webpack:///./node_modules/object.assign/implementation.js","webpack:///./node_modules/object.assign/polyfill.js","webpack:///./node_modules/possible-typed-array-names/index.js","webpack:///./node_modules/process/browser.js","webpack:///./node_modules/set-function-length/index.js","webpack:///./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack:///./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack:///./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack:///./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack:///./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack:///./node_modules/uniqid/index.js","webpack:///./node_modules/util/support/isBufferBrowser.js","webpack:///./node_modules/util/support/types.js","webpack:///./node_modules/util/util.js","webpack:///./node_modules/which-typed-array/index.js","webpack:///external window \"PropTypes\"","webpack:///external window \"React\"","webpack:///external window \"ReactDOM\"","webpack:///./node_modules/available-typed-arrays/index.js","webpack:///./node_modules/date-fns/_lib/defaultOptions.js","webpack:///./node_modules/date-fns/_lib/format/longFormatters.js","webpack:///./node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js","webpack:///./node_modules/date-fns/_lib/normalizeDates.js","webpack:///./node_modules/date-fns/_lib/protectedTokens.js","webpack:///./node_modules/date-fns/constants.js","webpack:///./node_modules/date-fns/constructFrom.js","webpack:///./node_modules/date-fns/differenceInCalendarDays.js","webpack:///./node_modules/date-fns/getDayOfYear.js","webpack:///./node_modules/date-fns/startOfYear.js","webpack:///./node_modules/date-fns/_lib/addLeadingZeros.js","webpack:///./node_modules/date-fns/_lib/format/lightFormatters.js","webpack:///./node_modules/date-fns/_lib/format/formatters.js","webpack:///./node_modules/date-fns/format.js","webpack:///./node_modules/date-fns/startOfISOWeekYear.js","webpack:///./node_modules/date-fns/getISOWeek.js","webpack:///./node_modules/date-fns/getISOWeekYear.js","webpack:///./node_modules/date-fns/startOfWeekYear.js","webpack:///./node_modules/date-fns/getWeek.js","webpack:///./node_modules/date-fns/getWeekYear.js","webpack:///./node_modules/date-fns/isDate.js","webpack:///./node_modules/date-fns/isValid.js","webpack:///./node_modules/date-fns/locale/en-US/_lib/formatDistance.js","webpack:///./node_modules/date-fns/locale/_lib/buildFormatLongFn.js","webpack:///./node_modules/date-fns/locale/en-US/_lib/formatLong.js","webpack:///./node_modules/date-fns/locale/en-US/_lib/formatRelative.js","webpack:///./node_modules/date-fns/locale/_lib/buildLocalizeFn.js","webpack:///./node_modules/date-fns/locale/en-US/_lib/localize.js","webpack:///./node_modules/date-fns/locale/_lib/buildMatchFn.js","webpack:///./node_modules/date-fns/locale/en-US/_lib/match.js","webpack:///./node_modules/date-fns/locale/_lib/buildMatchPatternFn.js","webpack:///./node_modules/date-fns/locale/en-US.js","webpack:///./node_modules/date-fns/parseISO.js","webpack:///./node_modules/date-fns/startOfDay.js","webpack:///./node_modules/date-fns/startOfISOWeek.js","webpack:///./node_modules/date-fns/startOfWeek.js","webpack:///./node_modules/date-fns/toDate.js","webpack:///./node_modules/ramda/es/append.js","webpack:///./node_modules/ramda/es/internal/_concat.js","webpack:///./node_modules/ramda/es/concat.js","webpack:///./node_modules/ramda/es/internal/_arrayFromIterator.js","webpack:///./node_modules/ramda/es/internal/_includesWith.js","webpack:///./node_modules/ramda/es/internal/_objectIs.js","webpack:///./node_modules/ramda/es/internal/_equals.js","webpack:///./node_modules/ramda/es/internal/_functionName.js","webpack:///./node_modules/ramda/es/equals.js","webpack:///./node_modules/ramda/es/internal/_xfilter.js","webpack:///./node_modules/ramda/es/filter.js","webpack:///./node_modules/ramda/es/internal/_arrayReduce.js","webpack:///./node_modules/ramda/es/internal/_filter.js","webpack:///./node_modules/ramda/es/hasPath.js","webpack:///./node_modules/ramda/es/has.js","webpack:///./node_modules/ramda/es/includes.js","webpack:///./node_modules/ramda/es/internal/_curry1.js","webpack:///./node_modules/ramda/es/internal/_curry2.js","webpack:///./node_modules/ramda/es/internal/_dispatchable.js","webpack:///./node_modules/ramda/es/internal/_isTransformer.js","webpack:///./node_modules/ramda/es/internal/_has.js","webpack:///./node_modules/ramda/es/internal/_includes.js","webpack:///./node_modules/ramda/es/internal/_indexOf.js","webpack:///./node_modules/ramda/es/internal/_isArguments.js","webpack:///./node_modules/ramda/es/internal/_isArray.js","webpack:///./node_modules/ramda/es/internal/_isFunction.js","webpack:///./node_modules/ramda/es/internal/_isObject.js","webpack:///./node_modules/ramda/es/internal/_isPlaceholder.js","webpack:///./node_modules/ramda/es/internal/_isString.js","webpack:///./node_modules/ramda/es/internal/_xfBase.js","webpack:///./node_modules/ramda/es/isNil.js","webpack:///./node_modules/ramda/es/keys.js","webpack:///./node_modules/ramda/es/omit.js","webpack:///./node_modules/ramda/es/pick.js","webpack:///./node_modules/ramda/es/reject.js","webpack:///./node_modules/ramda/es/internal/_complement.js","webpack:///./node_modules/ramda/es/internal/_map.js","webpack:///./node_modules/ramda/es/internal/_quote.js","webpack:///./node_modules/ramda/es/internal/_toISOString.js","webpack:///./node_modules/ramda/es/internal/_toString.js","webpack:///./node_modules/ramda/es/toString.js","webpack:///./node_modules/ramda/es/type.js","webpack:///./node_modules/ramda/es/internal/_Set.js","webpack:///./node_modules/ramda/es/without.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/ensure chunk","webpack:///webpack/runtime/get javascript chunk filename","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/publicPath","webpack:///webpack/runtime/compat","webpack:///webpack/runtime/jsonp chunk loading","webpack:///webpack/runtime/nonce","webpack:///./src/components/css/button.css?4110","webpack:///./src/components/Button.tsx","webpack:///./src/components/css/checklist.css?4b9a","webpack:///./src/components/Checklist.tsx","webpack:///./node_modules/@fortawesome/fontawesome-svg-core/index.es.js","webpack:///./node_modules/@fortawesome/react-fontawesome/index.es.js","webpack:///./node_modules/@fortawesome/free-regular-svg-icons/index.es.js","webpack:///./src/components/Clipboard.react.js","webpack:///./src/components/ConfirmDialog.react.js","webpack:///./src/components/ConfirmDialogProvider.react.js","webpack:///./src/utils/LazyLoader/datePickerRange.ts","webpack:///./src/utils/DatePickerPersistence.ts","webpack:///./src/components/DatePickerRange.tsx","webpack:///./src/utils/LazyLoader/datePickerSingle.ts","webpack:///./src/components/DatePickerSingle.tsx","webpack:///./src/components/Download.react.js","webpack:///./src/components/Geolocation.react.js","webpack:///./src/components/Interval.react.js","webpack:///./node_modules/ramda/es/toPairs.js","webpack:///./node_modules/ramda/es/internal/_xany.js","webpack:///./node_modules/ramda/es/internal/_reduced.js","webpack:///./node_modules/ramda/es/any.js","webpack:///./src/fragments/Loading/spinners/DebugTitle.tsx","webpack:///./src/components/Loading.tsx","webpack:///./src/fragments/Loading/spinners/GraphSpinner.tsx","webpack:///./src/fragments/Loading/spinners/CubeSpinner.tsx","webpack:///./src/fragments/Loading/spinners/CircleSpinner.tsx","webpack:///./src/fragments/Loading/spinners/DotSpinner.tsx","webpack:///./src/fragments/Loading/spinners/DefaultSpinner.tsx","webpack:///./src/components/Location.react.js","webpack:///./src/components/css/radioitems.css?af42","webpack:///./src/components/RadioItems.tsx","webpack:///./src/utils/LazyLoader/rangeSlider.ts","webpack:///./src/components/css/sliders.css?9e50","webpack:///./src/components/RangeSlider.tsx","webpack:///./src/components/Slider.tsx","webpack:///./src/components/Store.react.js","webpack:///./src/components/css/tabs.css?ebc8","webpack:///./src/components/Tab.tsx","webpack:///./src/components/Tabs.tsx","webpack:///./src/components/css/textarea.css?4273","webpack:///./src/components/Textarea.tsx","webpack:///./src/components/css/tooltip.css?1c92","webpack:///./src/components/Tooltip.tsx","webpack:///./src/components/css/dcc.css?95b0"],"sourcesContent":["var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; (typeof current == 'object' || typeof current == 'function') && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"dash_core_components:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","!function(e,n){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=n(require(\"react\")):\"function\"==typeof define&&define.amd?define([\"react\"],n):\"object\"==typeof exports?exports[\"dash-component-plugins\"]=n(require(\"react\")):e[\"dash-component-plugins\"]=n(e.React)}(window,(function(e){return function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&\"object\"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:e}),2&n&&\"string\"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,\"a\",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p=\"\",t(t.s=1)}([function(n,t){n.exports=e},function(e,n,t){\"use strict\";t.r(n),t.d(n,\"asyncDecorator\",(function(){return u})),t.d(n,\"inheritAsyncDecorator\",(function(){return a})),t.d(n,\"isReady\",(function(){return c})),t.d(n,\"History\",(function(){return d}));var r=t(0);function o(e,n,t,r,o,i,u){try{var a=e[i](u),c=a.value}catch(e){return void t(e)}a.done?n(c):Promise.resolve(c).then(r,o)}function i(e){return function(){var n=this,t=arguments;return new Promise((function(r,i){var u=e.apply(n,t);function a(e){o(u,r,i,a,c,\"next\",e)}function c(e){o(u,r,i,a,c,\"throw\",e)}a(void 0)}))}}var u=function(e,n){var t,o={isReady:new Promise((function(e){t=e})),get:Object(r.lazy)((function(){return Promise.resolve(n()).then((function(e){return setTimeout(i(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t(!0);case 2:o.isReady=!0;case 3:case\"end\":return e.stop()}}),e)}))),0),e}))}))};return Object.defineProperty(e,\"_dashprivate_isLazyComponentReady\",{get:function(){return o.isReady}}),o.get},a=function(e,n){Object.defineProperty(e,\"_dashprivate_isLazyComponentReady\",{get:function(){return c(n)}})},c=function(e){return e&&e._dashprivate_isLazyComponentReady};function f(e,n){for(var t=0;t\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the 'Software'), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nvar _require = require('./internal/errors'),\n _require$codes = _require.codes,\n ERR_AMBIGUOUS_ARGUMENT = _require$codes.ERR_AMBIGUOUS_ARGUMENT,\n ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,\n ERR_INVALID_ARG_VALUE = _require$codes.ERR_INVALID_ARG_VALUE,\n ERR_INVALID_RETURN_VALUE = _require$codes.ERR_INVALID_RETURN_VALUE,\n ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS;\nvar AssertionError = require('./internal/assert/assertion_error');\nvar _require2 = require('util/'),\n inspect = _require2.inspect;\nvar _require$types = require('util/').types,\n isPromise = _require$types.isPromise,\n isRegExp = _require$types.isRegExp;\nvar objectAssign = require('object.assign/polyfill')();\nvar objectIs = require('object-is/polyfill')();\nvar RegExpPrototypeTest = require('call-bind/callBound')('RegExp.prototype.test');\nvar errorCache = new Map();\nvar isDeepEqual;\nvar isDeepStrictEqual;\nvar parseExpressionAt;\nvar findNodeAround;\nvar decoder;\nfunction lazyLoadComparison() {\n var comparison = require('./internal/util/comparisons');\n isDeepEqual = comparison.isDeepEqual;\n isDeepStrictEqual = comparison.isDeepStrictEqual;\n}\n\n// Escape control characters but not \\n and \\t to keep the line breaks and\n// indentation intact.\n// eslint-disable-next-line no-control-regex\nvar escapeSequencesRegExp = /[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f]/g;\nvar meta = [\"\\\\u0000\", \"\\\\u0001\", \"\\\\u0002\", \"\\\\u0003\", \"\\\\u0004\", \"\\\\u0005\", \"\\\\u0006\", \"\\\\u0007\", '\\\\b', '', '', \"\\\\u000b\", '\\\\f', '', \"\\\\u000e\", \"\\\\u000f\", \"\\\\u0010\", \"\\\\u0011\", \"\\\\u0012\", \"\\\\u0013\", \"\\\\u0014\", \"\\\\u0015\", \"\\\\u0016\", \"\\\\u0017\", \"\\\\u0018\", \"\\\\u0019\", \"\\\\u001a\", \"\\\\u001b\", \"\\\\u001c\", \"\\\\u001d\", \"\\\\u001e\", \"\\\\u001f\"];\nvar escapeFn = function escapeFn(str) {\n return meta[str.charCodeAt(0)];\n};\nvar warned = false;\n\n// The assert module provides functions that throw\n// AssertionError's when particular conditions are not met. The\n// assert module must conform to the following interface.\n\nvar assert = module.exports = ok;\nvar NO_EXCEPTION_SENTINEL = {};\n\n// All of the following functions must throw an AssertionError\n// when a corresponding condition is not met, with a message that\n// may be undefined if not provided. All assertion methods provide\n// both the actual and expected values to the assertion error for\n// display purposes.\n\nfunction innerFail(obj) {\n if (obj.message instanceof Error) throw obj.message;\n throw new AssertionError(obj);\n}\nfunction fail(actual, expected, message, operator, stackStartFn) {\n var argsLen = arguments.length;\n var internalMessage;\n if (argsLen === 0) {\n internalMessage = 'Failed';\n } else if (argsLen === 1) {\n message = actual;\n actual = undefined;\n } else {\n if (warned === false) {\n warned = true;\n var warn = process.emitWarning ? process.emitWarning : console.warn.bind(console);\n warn('assert.fail() with more than one argument is deprecated. ' + 'Please use assert.strictEqual() instead or only pass a message.', 'DeprecationWarning', 'DEP0094');\n }\n if (argsLen === 2) operator = '!=';\n }\n if (message instanceof Error) throw message;\n var errArgs = {\n actual: actual,\n expected: expected,\n operator: operator === undefined ? 'fail' : operator,\n stackStartFn: stackStartFn || fail\n };\n if (message !== undefined) {\n errArgs.message = message;\n }\n var err = new AssertionError(errArgs);\n if (internalMessage) {\n err.message = internalMessage;\n err.generatedMessage = true;\n }\n throw err;\n}\nassert.fail = fail;\n\n// The AssertionError is defined in internal/error.\nassert.AssertionError = AssertionError;\nfunction innerOk(fn, argLen, value, message) {\n if (!value) {\n var generatedMessage = false;\n if (argLen === 0) {\n generatedMessage = true;\n message = 'No value argument passed to `assert.ok()`';\n } else if (message instanceof Error) {\n throw message;\n }\n var err = new AssertionError({\n actual: value,\n expected: true,\n message: message,\n operator: '==',\n stackStartFn: fn\n });\n err.generatedMessage = generatedMessage;\n throw err;\n }\n}\n\n// Pure assertion tests whether a value is truthy, as determined\n// by !!value.\nfunction ok() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n innerOk.apply(void 0, [ok, args.length].concat(args));\n}\nassert.ok = ok;\n\n// The equality assertion tests shallow, coercive equality with ==.\n/* eslint-disable no-restricted-properties */\nassert.equal = function equal(actual, expected, message) {\n if (arguments.length < 2) {\n throw new ERR_MISSING_ARGS('actual', 'expected');\n }\n // eslint-disable-next-line eqeqeq\n if (actual != expected) {\n innerFail({\n actual: actual,\n expected: expected,\n message: message,\n operator: '==',\n stackStartFn: equal\n });\n }\n};\n\n// The non-equality assertion tests for whether two objects are not\n// equal with !=.\nassert.notEqual = function notEqual(actual, expected, message) {\n if (arguments.length < 2) {\n throw new ERR_MISSING_ARGS('actual', 'expected');\n }\n // eslint-disable-next-line eqeqeq\n if (actual == expected) {\n innerFail({\n actual: actual,\n expected: expected,\n message: message,\n operator: '!=',\n stackStartFn: notEqual\n });\n }\n};\n\n// The equivalence assertion tests a deep equality relation.\nassert.deepEqual = function deepEqual(actual, expected, message) {\n if (arguments.length < 2) {\n throw new ERR_MISSING_ARGS('actual', 'expected');\n }\n if (isDeepEqual === undefined) lazyLoadComparison();\n if (!isDeepEqual(actual, expected)) {\n innerFail({\n actual: actual,\n expected: expected,\n message: message,\n operator: 'deepEqual',\n stackStartFn: deepEqual\n });\n }\n};\n\n// The non-equivalence assertion tests for any deep inequality.\nassert.notDeepEqual = function notDeepEqual(actual, expected, message) {\n if (arguments.length < 2) {\n throw new ERR_MISSING_ARGS('actual', 'expected');\n }\n if (isDeepEqual === undefined) lazyLoadComparison();\n if (isDeepEqual(actual, expected)) {\n innerFail({\n actual: actual,\n expected: expected,\n message: message,\n operator: 'notDeepEqual',\n stackStartFn: notDeepEqual\n });\n }\n};\n/* eslint-enable */\n\nassert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {\n if (arguments.length < 2) {\n throw new ERR_MISSING_ARGS('actual', 'expected');\n }\n if (isDeepEqual === undefined) lazyLoadComparison();\n if (!isDeepStrictEqual(actual, expected)) {\n innerFail({\n actual: actual,\n expected: expected,\n message: message,\n operator: 'deepStrictEqual',\n stackStartFn: deepStrictEqual\n });\n }\n};\nassert.notDeepStrictEqual = notDeepStrictEqual;\nfunction notDeepStrictEqual(actual, expected, message) {\n if (arguments.length < 2) {\n throw new ERR_MISSING_ARGS('actual', 'expected');\n }\n if (isDeepEqual === undefined) lazyLoadComparison();\n if (isDeepStrictEqual(actual, expected)) {\n innerFail({\n actual: actual,\n expected: expected,\n message: message,\n operator: 'notDeepStrictEqual',\n stackStartFn: notDeepStrictEqual\n });\n }\n}\nassert.strictEqual = function strictEqual(actual, expected, message) {\n if (arguments.length < 2) {\n throw new ERR_MISSING_ARGS('actual', 'expected');\n }\n if (!objectIs(actual, expected)) {\n innerFail({\n actual: actual,\n expected: expected,\n message: message,\n operator: 'strictEqual',\n stackStartFn: strictEqual\n });\n }\n};\nassert.notStrictEqual = function notStrictEqual(actual, expected, message) {\n if (arguments.length < 2) {\n throw new ERR_MISSING_ARGS('actual', 'expected');\n }\n if (objectIs(actual, expected)) {\n innerFail({\n actual: actual,\n expected: expected,\n message: message,\n operator: 'notStrictEqual',\n stackStartFn: notStrictEqual\n });\n }\n};\nvar Comparison = /*#__PURE__*/_createClass(function Comparison(obj, keys, actual) {\n var _this = this;\n _classCallCheck(this, Comparison);\n keys.forEach(function (key) {\n if (key in obj) {\n if (actual !== undefined && typeof actual[key] === 'string' && isRegExp(obj[key]) && RegExpPrototypeTest(obj[key], actual[key])) {\n _this[key] = actual[key];\n } else {\n _this[key] = obj[key];\n }\n }\n });\n});\nfunction compareExceptionKey(actual, expected, key, message, keys, fn) {\n if (!(key in actual) || !isDeepStrictEqual(actual[key], expected[key])) {\n if (!message) {\n // Create placeholder objects to create a nice output.\n var a = new Comparison(actual, keys);\n var b = new Comparison(expected, keys, actual);\n var err = new AssertionError({\n actual: a,\n expected: b,\n operator: 'deepStrictEqual',\n stackStartFn: fn\n });\n err.actual = actual;\n err.expected = expected;\n err.operator = fn.name;\n throw err;\n }\n innerFail({\n actual: actual,\n expected: expected,\n message: message,\n operator: fn.name,\n stackStartFn: fn\n });\n }\n}\nfunction expectedException(actual, expected, msg, fn) {\n if (typeof expected !== 'function') {\n if (isRegExp(expected)) return RegExpPrototypeTest(expected, actual);\n // assert.doesNotThrow does not accept objects.\n if (arguments.length === 2) {\n throw new ERR_INVALID_ARG_TYPE('expected', ['Function', 'RegExp'], expected);\n }\n\n // Handle primitives properly.\n if (_typeof(actual) !== 'object' || actual === null) {\n var err = new AssertionError({\n actual: actual,\n expected: expected,\n message: msg,\n operator: 'deepStrictEqual',\n stackStartFn: fn\n });\n err.operator = fn.name;\n throw err;\n }\n var keys = Object.keys(expected);\n // Special handle errors to make sure the name and the message are compared\n // as well.\n if (expected instanceof Error) {\n keys.push('name', 'message');\n } else if (keys.length === 0) {\n throw new ERR_INVALID_ARG_VALUE('error', expected, 'may not be an empty object');\n }\n if (isDeepEqual === undefined) lazyLoadComparison();\n keys.forEach(function (key) {\n if (typeof actual[key] === 'string' && isRegExp(expected[key]) && RegExpPrototypeTest(expected[key], actual[key])) {\n return;\n }\n compareExceptionKey(actual, expected, key, msg, keys, fn);\n });\n return true;\n }\n // Guard instanceof against arrow functions as they don't have a prototype.\n if (expected.prototype !== undefined && actual instanceof expected) {\n return true;\n }\n if (Error.isPrototypeOf(expected)) {\n return false;\n }\n return expected.call({}, actual) === true;\n}\nfunction getActual(fn) {\n if (typeof fn !== 'function') {\n throw new ERR_INVALID_ARG_TYPE('fn', 'Function', fn);\n }\n try {\n fn();\n } catch (e) {\n return e;\n }\n return NO_EXCEPTION_SENTINEL;\n}\nfunction checkIsPromise(obj) {\n // Accept native ES6 promises and promises that are implemented in a similar\n // way. Do not accept thenables that use a function as `obj` and that have no\n // `catch` handler.\n\n // TODO: thenables are checked up until they have the correct methods,\n // but according to documentation, the `then` method should receive\n // the `fulfill` and `reject` arguments as well or it may be never resolved.\n\n return isPromise(obj) || obj !== null && _typeof(obj) === 'object' && typeof obj.then === 'function' && typeof obj.catch === 'function';\n}\nfunction waitForActual(promiseFn) {\n return Promise.resolve().then(function () {\n var resultPromise;\n if (typeof promiseFn === 'function') {\n // Return a rejected promise if `promiseFn` throws synchronously.\n resultPromise = promiseFn();\n // Fail in case no promise is returned.\n if (!checkIsPromise(resultPromise)) {\n throw new ERR_INVALID_RETURN_VALUE('instance of Promise', 'promiseFn', resultPromise);\n }\n } else if (checkIsPromise(promiseFn)) {\n resultPromise = promiseFn;\n } else {\n throw new ERR_INVALID_ARG_TYPE('promiseFn', ['Function', 'Promise'], promiseFn);\n }\n return Promise.resolve().then(function () {\n return resultPromise;\n }).then(function () {\n return NO_EXCEPTION_SENTINEL;\n }).catch(function (e) {\n return e;\n });\n });\n}\nfunction expectsError(stackStartFn, actual, error, message) {\n if (typeof error === 'string') {\n if (arguments.length === 4) {\n throw new ERR_INVALID_ARG_TYPE('error', ['Object', 'Error', 'Function', 'RegExp'], error);\n }\n if (_typeof(actual) === 'object' && actual !== null) {\n if (actual.message === error) {\n throw new ERR_AMBIGUOUS_ARGUMENT('error/message', \"The error message \\\"\".concat(actual.message, \"\\\" is identical to the message.\"));\n }\n } else if (actual === error) {\n throw new ERR_AMBIGUOUS_ARGUMENT('error/message', \"The error \\\"\".concat(actual, \"\\\" is identical to the message.\"));\n }\n message = error;\n error = undefined;\n } else if (error != null && _typeof(error) !== 'object' && typeof error !== 'function') {\n throw new ERR_INVALID_ARG_TYPE('error', ['Object', 'Error', 'Function', 'RegExp'], error);\n }\n if (actual === NO_EXCEPTION_SENTINEL) {\n var details = '';\n if (error && error.name) {\n details += \" (\".concat(error.name, \")\");\n }\n details += message ? \": \".concat(message) : '.';\n var fnType = stackStartFn.name === 'rejects' ? 'rejection' : 'exception';\n innerFail({\n actual: undefined,\n expected: error,\n operator: stackStartFn.name,\n message: \"Missing expected \".concat(fnType).concat(details),\n stackStartFn: stackStartFn\n });\n }\n if (error && !expectedException(actual, error, message, stackStartFn)) {\n throw actual;\n }\n}\nfunction expectsNoError(stackStartFn, actual, error, message) {\n if (actual === NO_EXCEPTION_SENTINEL) return;\n if (typeof error === 'string') {\n message = error;\n error = undefined;\n }\n if (!error || expectedException(actual, error)) {\n var details = message ? \": \".concat(message) : '.';\n var fnType = stackStartFn.name === 'doesNotReject' ? 'rejection' : 'exception';\n innerFail({\n actual: actual,\n expected: error,\n operator: stackStartFn.name,\n message: \"Got unwanted \".concat(fnType).concat(details, \"\\n\") + \"Actual message: \\\"\".concat(actual && actual.message, \"\\\"\"),\n stackStartFn: stackStartFn\n });\n }\n throw actual;\n}\nassert.throws = function throws(promiseFn) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n expectsError.apply(void 0, [throws, getActual(promiseFn)].concat(args));\n};\nassert.rejects = function rejects(promiseFn) {\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n return waitForActual(promiseFn).then(function (result) {\n return expectsError.apply(void 0, [rejects, result].concat(args));\n });\n};\nassert.doesNotThrow = function doesNotThrow(fn) {\n for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n args[_key4 - 1] = arguments[_key4];\n }\n expectsNoError.apply(void 0, [doesNotThrow, getActual(fn)].concat(args));\n};\nassert.doesNotReject = function doesNotReject(fn) {\n for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {\n args[_key5 - 1] = arguments[_key5];\n }\n return waitForActual(fn).then(function (result) {\n return expectsNoError.apply(void 0, [doesNotReject, result].concat(args));\n });\n};\nassert.ifError = function ifError(err) {\n if (err !== null && err !== undefined) {\n var message = 'ifError got unwanted exception: ';\n if (_typeof(err) === 'object' && typeof err.message === 'string') {\n if (err.message.length === 0 && err.constructor) {\n message += err.constructor.name;\n } else {\n message += err.message;\n }\n } else {\n message += inspect(err);\n }\n var newErr = new AssertionError({\n actual: err,\n expected: null,\n operator: 'ifError',\n message: message,\n stackStartFn: ifError\n });\n\n // Make sure we actually have a stack trace!\n var origStack = err.stack;\n if (typeof origStack === 'string') {\n // This will remove any duplicated frames from the error frames taken\n // from within `ifError` and add the original error frames to the newly\n // created ones.\n var tmp2 = origStack.split('\\n');\n tmp2.shift();\n // Filter all frames existing in err.stack.\n var tmp1 = newErr.stack.split('\\n');\n for (var i = 0; i < tmp2.length; i++) {\n // Find the first occurrence of the frame.\n var pos = tmp1.indexOf(tmp2[i]);\n if (pos !== -1) {\n // Only keep new frames.\n tmp1 = tmp1.slice(0, pos);\n break;\n }\n }\n newErr.stack = \"\".concat(tmp1.join('\\n'), \"\\n\").concat(tmp2.join('\\n'));\n }\n throw newErr;\n }\n};\n\n// Currently in sync with Node.js lib/assert.js\n// https://github.com/nodejs/node/commit/2a871df3dfb8ea663ef5e1f8f62701ec51384ecb\nfunction internalMatch(string, regexp, message, fn, fnName) {\n if (!isRegExp(regexp)) {\n throw new ERR_INVALID_ARG_TYPE('regexp', 'RegExp', regexp);\n }\n var match = fnName === 'match';\n if (typeof string !== 'string' || RegExpPrototypeTest(regexp, string) !== match) {\n if (message instanceof Error) {\n throw message;\n }\n var generatedMessage = !message;\n\n // 'The input was expected to not match the regular expression ' +\n message = message || (typeof string !== 'string' ? 'The \"string\" argument must be of type string. Received type ' + \"\".concat(_typeof(string), \" (\").concat(inspect(string), \")\") : (match ? 'The input did not match the regular expression ' : 'The input was expected to not match the regular expression ') + \"\".concat(inspect(regexp), \". Input:\\n\\n\").concat(inspect(string), \"\\n\"));\n var err = new AssertionError({\n actual: string,\n expected: regexp,\n message: message,\n operator: fnName,\n stackStartFn: fn\n });\n err.generatedMessage = generatedMessage;\n throw err;\n }\n}\nassert.match = function match(string, regexp, message) {\n internalMatch(string, regexp, message, match, 'match');\n};\nassert.doesNotMatch = function doesNotMatch(string, regexp, message) {\n internalMatch(string, regexp, message, doesNotMatch, 'doesNotMatch');\n};\n\n// Expose a strict only variant of assert\nfunction strict() {\n for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n args[_key6] = arguments[_key6];\n }\n innerOk.apply(void 0, [strict, args.length].concat(args));\n}\nassert.strict = objectAssign(strict, assert, {\n equal: assert.strictEqual,\n deepEqual: assert.deepStrictEqual,\n notEqual: assert.notStrictEqual,\n notDeepEqual: assert.notDeepStrictEqual\n});\nassert.strict.strict = assert.strict;","// Currently in sync with Node.js lib/internal/assert/assertion_error.js\n// https://github.com/nodejs/node/commit/0817840f775032169ddd70c85ac059f18ffcc81c\n\n'use strict';\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\nfunction _wrapNativeSuper(Class) { var _cache = typeof Map === \"function\" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== \"function\") { throw new TypeError(\"Super expression must either be null or a function\"); } if (typeof _cache !== \"undefined\") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }\nfunction _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct.bind(); } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction _isNativeFunction(fn) { return Function.toString.call(fn).indexOf(\"[native code]\") !== -1; }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar _require = require('util/'),\n inspect = _require.inspect;\nvar _require2 = require('../errors'),\n ERR_INVALID_ARG_TYPE = _require2.codes.ERR_INVALID_ARG_TYPE;\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith\nfunction endsWith(str, search, this_len) {\n if (this_len === undefined || this_len > str.length) {\n this_len = str.length;\n }\n return str.substring(this_len - search.length, this_len) === search;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat\nfunction repeat(str, count) {\n count = Math.floor(count);\n if (str.length == 0 || count == 0) return '';\n var maxCount = str.length * count;\n count = Math.floor(Math.log(count) / Math.log(2));\n while (count) {\n str += str;\n count--;\n }\n str += str.substring(0, maxCount - str.length);\n return str;\n}\nvar blue = '';\nvar green = '';\nvar red = '';\nvar white = '';\nvar kReadableOperator = {\n deepStrictEqual: 'Expected values to be strictly deep-equal:',\n strictEqual: 'Expected values to be strictly equal:',\n strictEqualObject: 'Expected \"actual\" to be reference-equal to \"expected\":',\n deepEqual: 'Expected values to be loosely deep-equal:',\n equal: 'Expected values to be loosely equal:',\n notDeepStrictEqual: 'Expected \"actual\" not to be strictly deep-equal to:',\n notStrictEqual: 'Expected \"actual\" to be strictly unequal to:',\n notStrictEqualObject: 'Expected \"actual\" not to be reference-equal to \"expected\":',\n notDeepEqual: 'Expected \"actual\" not to be loosely deep-equal to:',\n notEqual: 'Expected \"actual\" to be loosely unequal to:',\n notIdentical: 'Values identical but not reference-equal:'\n};\n\n// Comparing short primitives should just show === / !== instead of using the\n// diff.\nvar kMaxShortLength = 10;\nfunction copyError(source) {\n var keys = Object.keys(source);\n var target = Object.create(Object.getPrototypeOf(source));\n keys.forEach(function (key) {\n target[key] = source[key];\n });\n Object.defineProperty(target, 'message', {\n value: source.message\n });\n return target;\n}\nfunction inspectValue(val) {\n // The util.inspect default values could be changed. This makes sure the\n // error messages contain the necessary information nevertheless.\n return inspect(val, {\n compact: false,\n customInspect: false,\n depth: 1000,\n maxArrayLength: Infinity,\n // Assert compares only enumerable properties (with a few exceptions).\n showHidden: false,\n // Having a long line as error is better than wrapping the line for\n // comparison for now.\n // TODO(BridgeAR): `breakLength` should be limited as soon as soon as we\n // have meta information about the inspected properties (i.e., know where\n // in what line the property starts and ends).\n breakLength: Infinity,\n // Assert does not detect proxies currently.\n showProxy: false,\n sorted: true,\n // Inspect getters as we also check them when comparing entries.\n getters: true\n });\n}\nfunction createErrDiff(actual, expected, operator) {\n var other = '';\n var res = '';\n var lastPos = 0;\n var end = '';\n var skipped = false;\n var actualInspected = inspectValue(actual);\n var actualLines = actualInspected.split('\\n');\n var expectedLines = inspectValue(expected).split('\\n');\n var i = 0;\n var indicator = '';\n\n // In case both values are objects explicitly mark them as not reference equal\n // for the `strictEqual` operator.\n if (operator === 'strictEqual' && _typeof(actual) === 'object' && _typeof(expected) === 'object' && actual !== null && expected !== null) {\n operator = 'strictEqualObject';\n }\n\n // If \"actual\" and \"expected\" fit on a single line and they are not strictly\n // equal, check further special handling.\n if (actualLines.length === 1 && expectedLines.length === 1 && actualLines[0] !== expectedLines[0]) {\n var inputLength = actualLines[0].length + expectedLines[0].length;\n // If the character length of \"actual\" and \"expected\" together is less than\n // kMaxShortLength and if neither is an object and at least one of them is\n // not `zero`, use the strict equal comparison to visualize the output.\n if (inputLength <= kMaxShortLength) {\n if ((_typeof(actual) !== 'object' || actual === null) && (_typeof(expected) !== 'object' || expected === null) && (actual !== 0 || expected !== 0)) {\n // -0 === +0\n return \"\".concat(kReadableOperator[operator], \"\\n\\n\") + \"\".concat(actualLines[0], \" !== \").concat(expectedLines[0], \"\\n\");\n }\n } else if (operator !== 'strictEqualObject') {\n // If the stderr is a tty and the input length is lower than the current\n // columns per line, add a mismatch indicator below the output. If it is\n // not a tty, use a default value of 80 characters.\n var maxLength = process.stderr && process.stderr.isTTY ? process.stderr.columns : 80;\n if (inputLength < maxLength) {\n while (actualLines[0][i] === expectedLines[0][i]) {\n i++;\n }\n // Ignore the first characters.\n if (i > 2) {\n // Add position indicator for the first mismatch in case it is a\n // single line and the input length is less than the column length.\n indicator = \"\\n \".concat(repeat(' ', i), \"^\");\n i = 0;\n }\n }\n }\n }\n\n // Remove all ending lines that match (this optimizes the output for\n // readability by reducing the number of total changed lines).\n var a = actualLines[actualLines.length - 1];\n var b = expectedLines[expectedLines.length - 1];\n while (a === b) {\n if (i++ < 2) {\n end = \"\\n \".concat(a).concat(end);\n } else {\n other = a;\n }\n actualLines.pop();\n expectedLines.pop();\n if (actualLines.length === 0 || expectedLines.length === 0) break;\n a = actualLines[actualLines.length - 1];\n b = expectedLines[expectedLines.length - 1];\n }\n var maxLines = Math.max(actualLines.length, expectedLines.length);\n // Strict equal with identical objects that are not identical by reference.\n // E.g., assert.deepStrictEqual({ a: Symbol() }, { a: Symbol() })\n if (maxLines === 0) {\n // We have to get the result again. The lines were all removed before.\n var _actualLines = actualInspected.split('\\n');\n\n // Only remove lines in case it makes sense to collapse those.\n // TODO: Accept env to always show the full error.\n if (_actualLines.length > 30) {\n _actualLines[26] = \"\".concat(blue, \"...\").concat(white);\n while (_actualLines.length > 27) {\n _actualLines.pop();\n }\n }\n return \"\".concat(kReadableOperator.notIdentical, \"\\n\\n\").concat(_actualLines.join('\\n'), \"\\n\");\n }\n if (i > 3) {\n end = \"\\n\".concat(blue, \"...\").concat(white).concat(end);\n skipped = true;\n }\n if (other !== '') {\n end = \"\\n \".concat(other).concat(end);\n other = '';\n }\n var printedLines = 0;\n var msg = kReadableOperator[operator] + \"\\n\".concat(green, \"+ actual\").concat(white, \" \").concat(red, \"- expected\").concat(white);\n var skippedMsg = \" \".concat(blue, \"...\").concat(white, \" Lines skipped\");\n for (i = 0; i < maxLines; i++) {\n // Only extra expected lines exist\n var cur = i - lastPos;\n if (actualLines.length < i + 1) {\n // If the last diverging line is more than one line above and the\n // current line is at least line three, add some of the former lines and\n // also add dots to indicate skipped entries.\n if (cur > 1 && i > 2) {\n if (cur > 4) {\n res += \"\\n\".concat(blue, \"...\").concat(white);\n skipped = true;\n } else if (cur > 3) {\n res += \"\\n \".concat(expectedLines[i - 2]);\n printedLines++;\n }\n res += \"\\n \".concat(expectedLines[i - 1]);\n printedLines++;\n }\n // Mark the current line as the last diverging one.\n lastPos = i;\n // Add the expected line to the cache.\n other += \"\\n\".concat(red, \"-\").concat(white, \" \").concat(expectedLines[i]);\n printedLines++;\n // Only extra actual lines exist\n } else if (expectedLines.length < i + 1) {\n // If the last diverging line is more than one line above and the\n // current line is at least line three, add some of the former lines and\n // also add dots to indicate skipped entries.\n if (cur > 1 && i > 2) {\n if (cur > 4) {\n res += \"\\n\".concat(blue, \"...\").concat(white);\n skipped = true;\n } else if (cur > 3) {\n res += \"\\n \".concat(actualLines[i - 2]);\n printedLines++;\n }\n res += \"\\n \".concat(actualLines[i - 1]);\n printedLines++;\n }\n // Mark the current line as the last diverging one.\n lastPos = i;\n // Add the actual line to the result.\n res += \"\\n\".concat(green, \"+\").concat(white, \" \").concat(actualLines[i]);\n printedLines++;\n // Lines diverge\n } else {\n var expectedLine = expectedLines[i];\n var actualLine = actualLines[i];\n // If the lines diverge, specifically check for lines that only diverge by\n // a trailing comma. In that case it is actually identical and we should\n // mark it as such.\n var divergingLines = actualLine !== expectedLine && (!endsWith(actualLine, ',') || actualLine.slice(0, -1) !== expectedLine);\n // If the expected line has a trailing comma but is otherwise identical,\n // add a comma at the end of the actual line. Otherwise the output could\n // look weird as in:\n //\n // [\n // 1 // No comma at the end!\n // + 2\n // ]\n //\n if (divergingLines && endsWith(expectedLine, ',') && expectedLine.slice(0, -1) === actualLine) {\n divergingLines = false;\n actualLine += ',';\n }\n if (divergingLines) {\n // If the last diverging line is more than one line above and the\n // current line is at least line three, add some of the former lines and\n // also add dots to indicate skipped entries.\n if (cur > 1 && i > 2) {\n if (cur > 4) {\n res += \"\\n\".concat(blue, \"...\").concat(white);\n skipped = true;\n } else if (cur > 3) {\n res += \"\\n \".concat(actualLines[i - 2]);\n printedLines++;\n }\n res += \"\\n \".concat(actualLines[i - 1]);\n printedLines++;\n }\n // Mark the current line as the last diverging one.\n lastPos = i;\n // Add the actual line to the result and cache the expected diverging\n // line so consecutive diverging lines show up as +++--- and not +-+-+-.\n res += \"\\n\".concat(green, \"+\").concat(white, \" \").concat(actualLine);\n other += \"\\n\".concat(red, \"-\").concat(white, \" \").concat(expectedLine);\n printedLines += 2;\n // Lines are identical\n } else {\n // Add all cached information to the result before adding other things\n // and reset the cache.\n res += other;\n other = '';\n // If the last diverging line is exactly one line above or if it is the\n // very first line, add the line to the result.\n if (cur === 1 || i === 0) {\n res += \"\\n \".concat(actualLine);\n printedLines++;\n }\n }\n }\n // Inspected object to big (Show ~20 rows max)\n if (printedLines > 20 && i < maxLines - 2) {\n return \"\".concat(msg).concat(skippedMsg, \"\\n\").concat(res, \"\\n\").concat(blue, \"...\").concat(white).concat(other, \"\\n\") + \"\".concat(blue, \"...\").concat(white);\n }\n }\n return \"\".concat(msg).concat(skipped ? skippedMsg : '', \"\\n\").concat(res).concat(other).concat(end).concat(indicator);\n}\nvar AssertionError = /*#__PURE__*/function (_Error, _inspect$custom) {\n _inherits(AssertionError, _Error);\n var _super = _createSuper(AssertionError);\n function AssertionError(options) {\n var _this;\n _classCallCheck(this, AssertionError);\n if (_typeof(options) !== 'object' || options === null) {\n throw new ERR_INVALID_ARG_TYPE('options', 'Object', options);\n }\n var message = options.message,\n operator = options.operator,\n stackStartFn = options.stackStartFn;\n var actual = options.actual,\n expected = options.expected;\n var limit = Error.stackTraceLimit;\n Error.stackTraceLimit = 0;\n if (message != null) {\n _this = _super.call(this, String(message));\n } else {\n if (process.stderr && process.stderr.isTTY) {\n // Reset on each call to make sure we handle dynamically set environment\n // variables correct.\n if (process.stderr && process.stderr.getColorDepth && process.stderr.getColorDepth() !== 1) {\n blue = \"\\x1B[34m\";\n green = \"\\x1B[32m\";\n white = \"\\x1B[39m\";\n red = \"\\x1B[31m\";\n } else {\n blue = '';\n green = '';\n white = '';\n red = '';\n }\n }\n // Prevent the error stack from being visible by duplicating the error\n // in a very close way to the original in case both sides are actually\n // instances of Error.\n if (_typeof(actual) === 'object' && actual !== null && _typeof(expected) === 'object' && expected !== null && 'stack' in actual && actual instanceof Error && 'stack' in expected && expected instanceof Error) {\n actual = copyError(actual);\n expected = copyError(expected);\n }\n if (operator === 'deepStrictEqual' || operator === 'strictEqual') {\n _this = _super.call(this, createErrDiff(actual, expected, operator));\n } else if (operator === 'notDeepStrictEqual' || operator === 'notStrictEqual') {\n // In case the objects are equal but the operator requires unequal, show\n // the first object and say A equals B\n var base = kReadableOperator[operator];\n var res = inspectValue(actual).split('\\n');\n\n // In case \"actual\" is an object, it should not be reference equal.\n if (operator === 'notStrictEqual' && _typeof(actual) === 'object' && actual !== null) {\n base = kReadableOperator.notStrictEqualObject;\n }\n\n // Only remove lines in case it makes sense to collapse those.\n // TODO: Accept env to always show the full error.\n if (res.length > 30) {\n res[26] = \"\".concat(blue, \"...\").concat(white);\n while (res.length > 27) {\n res.pop();\n }\n }\n\n // Only print a single input.\n if (res.length === 1) {\n _this = _super.call(this, \"\".concat(base, \" \").concat(res[0]));\n } else {\n _this = _super.call(this, \"\".concat(base, \"\\n\\n\").concat(res.join('\\n'), \"\\n\"));\n }\n } else {\n var _res = inspectValue(actual);\n var other = '';\n var knownOperators = kReadableOperator[operator];\n if (operator === 'notDeepEqual' || operator === 'notEqual') {\n _res = \"\".concat(kReadableOperator[operator], \"\\n\\n\").concat(_res);\n if (_res.length > 1024) {\n _res = \"\".concat(_res.slice(0, 1021), \"...\");\n }\n } else {\n other = \"\".concat(inspectValue(expected));\n if (_res.length > 512) {\n _res = \"\".concat(_res.slice(0, 509), \"...\");\n }\n if (other.length > 512) {\n other = \"\".concat(other.slice(0, 509), \"...\");\n }\n if (operator === 'deepEqual' || operator === 'equal') {\n _res = \"\".concat(knownOperators, \"\\n\\n\").concat(_res, \"\\n\\nshould equal\\n\\n\");\n } else {\n other = \" \".concat(operator, \" \").concat(other);\n }\n }\n _this = _super.call(this, \"\".concat(_res).concat(other));\n }\n }\n Error.stackTraceLimit = limit;\n _this.generatedMessage = !message;\n Object.defineProperty(_assertThisInitialized(_this), 'name', {\n value: 'AssertionError [ERR_ASSERTION]',\n enumerable: false,\n writable: true,\n configurable: true\n });\n _this.code = 'ERR_ASSERTION';\n _this.actual = actual;\n _this.expected = expected;\n _this.operator = operator;\n if (Error.captureStackTrace) {\n // eslint-disable-next-line no-restricted-syntax\n Error.captureStackTrace(_assertThisInitialized(_this), stackStartFn);\n }\n // Create error message including the error code in the name.\n _this.stack;\n // Reset the name.\n _this.name = 'AssertionError';\n return _possibleConstructorReturn(_this);\n }\n _createClass(AssertionError, [{\n key: \"toString\",\n value: function toString() {\n return \"\".concat(this.name, \" [\").concat(this.code, \"]: \").concat(this.message);\n }\n }, {\n key: _inspect$custom,\n value: function value(recurseTimes, ctx) {\n // This limits the `actual` and `expected` property default inspection to\n // the minimum depth. Otherwise those values would be too verbose compared\n // to the actual error message which contains a combined view of these two\n // input values.\n return inspect(this, _objectSpread(_objectSpread({}, ctx), {}, {\n customInspect: false,\n depth: 0\n }));\n }\n }]);\n return AssertionError;\n}( /*#__PURE__*/_wrapNativeSuper(Error), inspect.custom);\nmodule.exports = AssertionError;","// Currently in sync with Node.js lib/internal/errors.js\n// https://github.com/nodejs/node/commit/3b044962c48fe313905877a96b5d0894a5404f6f\n\n/* eslint node-core/documented-errors: \"error\" */\n/* eslint node-core/alphabetize-errors: \"error\" */\n/* eslint node-core/prefer-util-format-errors: \"error\" */\n\n'use strict';\n\n// The whole point behind this internal module is to allow Node.js to no\n// longer be forced to treat every error message change as a semver-major\n// change. The NodeError classes here all expose a `code` property whose\n// value statically and permanently identifies the error. While the error\n// message may change, the code should not.\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\nvar codes = {};\n\n// Lazy loaded\nvar assert;\nvar util;\nfunction createErrorType(code, message, Base) {\n if (!Base) {\n Base = Error;\n }\n function getMessage(arg1, arg2, arg3) {\n if (typeof message === 'string') {\n return message;\n } else {\n return message(arg1, arg2, arg3);\n }\n }\n var NodeError = /*#__PURE__*/function (_Base) {\n _inherits(NodeError, _Base);\n var _super = _createSuper(NodeError);\n function NodeError(arg1, arg2, arg3) {\n var _this;\n _classCallCheck(this, NodeError);\n _this = _super.call(this, getMessage(arg1, arg2, arg3));\n _this.code = code;\n return _this;\n }\n return _createClass(NodeError);\n }(Base);\n codes[code] = NodeError;\n}\n\n// https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js\nfunction oneOf(expected, thing) {\n if (Array.isArray(expected)) {\n var len = expected.length;\n expected = expected.map(function (i) {\n return String(i);\n });\n if (len > 2) {\n return \"one of \".concat(thing, \" \").concat(expected.slice(0, len - 1).join(', '), \", or \") + expected[len - 1];\n } else if (len === 2) {\n return \"one of \".concat(thing, \" \").concat(expected[0], \" or \").concat(expected[1]);\n } else {\n return \"of \".concat(thing, \" \").concat(expected[0]);\n }\n } else {\n return \"of \".concat(thing, \" \").concat(String(expected));\n }\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith\nfunction startsWith(str, search, pos) {\n return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith\nfunction endsWith(str, search, this_len) {\n if (this_len === undefined || this_len > str.length) {\n this_len = str.length;\n }\n return str.substring(this_len - search.length, this_len) === search;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes\nfunction includes(str, search, start) {\n if (typeof start !== 'number') {\n start = 0;\n }\n if (start + search.length > str.length) {\n return false;\n } else {\n return str.indexOf(search, start) !== -1;\n }\n}\ncreateErrorType('ERR_AMBIGUOUS_ARGUMENT', 'The \"%s\" argument is ambiguous. %s', TypeError);\ncreateErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {\n if (assert === undefined) assert = require('../assert');\n assert(typeof name === 'string', \"'name' must be a string\");\n\n // determiner: 'must be' or 'must not be'\n var determiner;\n if (typeof expected === 'string' && startsWith(expected, 'not ')) {\n determiner = 'must not be';\n expected = expected.replace(/^not /, '');\n } else {\n determiner = 'must be';\n }\n var msg;\n if (endsWith(name, ' argument')) {\n // For cases like 'first argument'\n msg = \"The \".concat(name, \" \").concat(determiner, \" \").concat(oneOf(expected, 'type'));\n } else {\n var type = includes(name, '.') ? 'property' : 'argument';\n msg = \"The \\\"\".concat(name, \"\\\" \").concat(type, \" \").concat(determiner, \" \").concat(oneOf(expected, 'type'));\n }\n\n // TODO(BridgeAR): Improve the output by showing `null` and similar.\n msg += \". Received type \".concat(_typeof(actual));\n return msg;\n}, TypeError);\ncreateErrorType('ERR_INVALID_ARG_VALUE', function (name, value) {\n var reason = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'is invalid';\n if (util === undefined) util = require('util/');\n var inspected = util.inspect(value);\n if (inspected.length > 128) {\n inspected = \"\".concat(inspected.slice(0, 128), \"...\");\n }\n return \"The argument '\".concat(name, \"' \").concat(reason, \". Received \").concat(inspected);\n}, TypeError, RangeError);\ncreateErrorType('ERR_INVALID_RETURN_VALUE', function (input, name, value) {\n var type;\n if (value && value.constructor && value.constructor.name) {\n type = \"instance of \".concat(value.constructor.name);\n } else {\n type = \"type \".concat(_typeof(value));\n }\n return \"Expected \".concat(input, \" to be returned from the \\\"\").concat(name, \"\\\"\") + \" function but got \".concat(type, \".\");\n}, TypeError);\ncreateErrorType('ERR_MISSING_ARGS', function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (assert === undefined) assert = require('../assert');\n assert(args.length > 0, 'At least one arg needs to be specified');\n var msg = 'The ';\n var len = args.length;\n args = args.map(function (a) {\n return \"\\\"\".concat(a, \"\\\"\");\n });\n switch (len) {\n case 1:\n msg += \"\".concat(args[0], \" argument\");\n break;\n case 2:\n msg += \"\".concat(args[0], \" and \").concat(args[1], \" arguments\");\n break;\n default:\n msg += args.slice(0, len - 1).join(', ');\n msg += \", and \".concat(args[len - 1], \" arguments\");\n break;\n }\n return \"\".concat(msg, \" must be specified\");\n}, TypeError);\nmodule.exports.codes = codes;","// Currently in sync with Node.js lib/internal/util/comparisons.js\n// https://github.com/nodejs/node/commit/112cc7c27551254aa2b17098fb774867f05ed0d9\n\n'use strict';\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nvar regexFlagsSupported = /a/g.flags !== undefined;\nvar arrayFromSet = function arrayFromSet(set) {\n var array = [];\n set.forEach(function (value) {\n return array.push(value);\n });\n return array;\n};\nvar arrayFromMap = function arrayFromMap(map) {\n var array = [];\n map.forEach(function (value, key) {\n return array.push([key, value]);\n });\n return array;\n};\nvar objectIs = Object.is ? Object.is : require('object-is');\nvar objectGetOwnPropertySymbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols : function () {\n return [];\n};\nvar numberIsNaN = Number.isNaN ? Number.isNaN : require('is-nan');\nfunction uncurryThis(f) {\n return f.call.bind(f);\n}\nvar hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);\nvar propertyIsEnumerable = uncurryThis(Object.prototype.propertyIsEnumerable);\nvar objectToString = uncurryThis(Object.prototype.toString);\nvar _require$types = require('util/').types,\n isAnyArrayBuffer = _require$types.isAnyArrayBuffer,\n isArrayBufferView = _require$types.isArrayBufferView,\n isDate = _require$types.isDate,\n isMap = _require$types.isMap,\n isRegExp = _require$types.isRegExp,\n isSet = _require$types.isSet,\n isNativeError = _require$types.isNativeError,\n isBoxedPrimitive = _require$types.isBoxedPrimitive,\n isNumberObject = _require$types.isNumberObject,\n isStringObject = _require$types.isStringObject,\n isBooleanObject = _require$types.isBooleanObject,\n isBigIntObject = _require$types.isBigIntObject,\n isSymbolObject = _require$types.isSymbolObject,\n isFloat32Array = _require$types.isFloat32Array,\n isFloat64Array = _require$types.isFloat64Array;\nfunction isNonIndex(key) {\n if (key.length === 0 || key.length > 10) return true;\n for (var i = 0; i < key.length; i++) {\n var code = key.charCodeAt(i);\n if (code < 48 || code > 57) return true;\n }\n // The maximum size for an array is 2 ** 32 -1.\n return key.length === 10 && key >= Math.pow(2, 32);\n}\nfunction getOwnNonIndexProperties(value) {\n return Object.keys(value).filter(isNonIndex).concat(objectGetOwnPropertySymbols(value).filter(Object.prototype.propertyIsEnumerable.bind(value)));\n}\n\n// Taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js\n// original notice:\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\nfunction compare(a, b) {\n if (a === b) {\n return 0;\n }\n var x = a.length;\n var y = b.length;\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i];\n y = b[i];\n break;\n }\n }\n if (x < y) {\n return -1;\n }\n if (y < x) {\n return 1;\n }\n return 0;\n}\nvar ONLY_ENUMERABLE = undefined;\nvar kStrict = true;\nvar kLoose = false;\nvar kNoIterator = 0;\nvar kIsArray = 1;\nvar kIsSet = 2;\nvar kIsMap = 3;\n\n// Check if they have the same source and flags\nfunction areSimilarRegExps(a, b) {\n return regexFlagsSupported ? a.source === b.source && a.flags === b.flags : RegExp.prototype.toString.call(a) === RegExp.prototype.toString.call(b);\n}\nfunction areSimilarFloatArrays(a, b) {\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n for (var offset = 0; offset < a.byteLength; offset++) {\n if (a[offset] !== b[offset]) {\n return false;\n }\n }\n return true;\n}\nfunction areSimilarTypedArrays(a, b) {\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n return compare(new Uint8Array(a.buffer, a.byteOffset, a.byteLength), new Uint8Array(b.buffer, b.byteOffset, b.byteLength)) === 0;\n}\nfunction areEqualArrayBuffers(buf1, buf2) {\n return buf1.byteLength === buf2.byteLength && compare(new Uint8Array(buf1), new Uint8Array(buf2)) === 0;\n}\nfunction isEqualBoxedPrimitive(val1, val2) {\n if (isNumberObject(val1)) {\n return isNumberObject(val2) && objectIs(Number.prototype.valueOf.call(val1), Number.prototype.valueOf.call(val2));\n }\n if (isStringObject(val1)) {\n return isStringObject(val2) && String.prototype.valueOf.call(val1) === String.prototype.valueOf.call(val2);\n }\n if (isBooleanObject(val1)) {\n return isBooleanObject(val2) && Boolean.prototype.valueOf.call(val1) === Boolean.prototype.valueOf.call(val2);\n }\n if (isBigIntObject(val1)) {\n return isBigIntObject(val2) && BigInt.prototype.valueOf.call(val1) === BigInt.prototype.valueOf.call(val2);\n }\n return isSymbolObject(val2) && Symbol.prototype.valueOf.call(val1) === Symbol.prototype.valueOf.call(val2);\n}\n\n// Notes: Type tags are historical [[Class]] properties that can be set by\n// FunctionTemplate::SetClassName() in C++ or Symbol.toStringTag in JS\n// and retrieved using Object.prototype.toString.call(obj) in JS\n// See https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n// for a list of tags pre-defined in the spec.\n// There are some unspecified tags in the wild too (e.g. typed array tags).\n// Since tags can be altered, they only serve fast failures\n//\n// Typed arrays and buffers are checked by comparing the content in their\n// underlying ArrayBuffer. This optimization requires that it's\n// reasonable to interpret their underlying memory in the same way,\n// which is checked by comparing their type tags.\n// (e.g. a Uint8Array and a Uint16Array with the same memory content\n// could still be different because they will be interpreted differently).\n//\n// For strict comparison, objects should have\n// a) The same built-in type tags\n// b) The same prototypes.\n\nfunction innerDeepEqual(val1, val2, strict, memos) {\n // All identical values are equivalent, as determined by ===.\n if (val1 === val2) {\n if (val1 !== 0) return true;\n return strict ? objectIs(val1, val2) : true;\n }\n\n // Check more closely if val1 and val2 are equal.\n if (strict) {\n if (_typeof(val1) !== 'object') {\n return typeof val1 === 'number' && numberIsNaN(val1) && numberIsNaN(val2);\n }\n if (_typeof(val2) !== 'object' || val1 === null || val2 === null) {\n return false;\n }\n if (Object.getPrototypeOf(val1) !== Object.getPrototypeOf(val2)) {\n return false;\n }\n } else {\n if (val1 === null || _typeof(val1) !== 'object') {\n if (val2 === null || _typeof(val2) !== 'object') {\n // eslint-disable-next-line eqeqeq\n return val1 == val2;\n }\n return false;\n }\n if (val2 === null || _typeof(val2) !== 'object') {\n return false;\n }\n }\n var val1Tag = objectToString(val1);\n var val2Tag = objectToString(val2);\n if (val1Tag !== val2Tag) {\n return false;\n }\n if (Array.isArray(val1)) {\n // Check for sparse arrays and general fast path\n if (val1.length !== val2.length) {\n return false;\n }\n var keys1 = getOwnNonIndexProperties(val1, ONLY_ENUMERABLE);\n var keys2 = getOwnNonIndexProperties(val2, ONLY_ENUMERABLE);\n if (keys1.length !== keys2.length) {\n return false;\n }\n return keyCheck(val1, val2, strict, memos, kIsArray, keys1);\n }\n // [browserify] This triggers on certain types in IE (Map/Set) so we don't\n // wan't to early return out of the rest of the checks. However we can check\n // if the second value is one of these values and the first isn't.\n if (val1Tag === '[object Object]') {\n // return keyCheck(val1, val2, strict, memos, kNoIterator);\n if (!isMap(val1) && isMap(val2) || !isSet(val1) && isSet(val2)) {\n return false;\n }\n }\n if (isDate(val1)) {\n if (!isDate(val2) || Date.prototype.getTime.call(val1) !== Date.prototype.getTime.call(val2)) {\n return false;\n }\n } else if (isRegExp(val1)) {\n if (!isRegExp(val2) || !areSimilarRegExps(val1, val2)) {\n return false;\n }\n } else if (isNativeError(val1) || val1 instanceof Error) {\n // Do not compare the stack as it might differ even though the error itself\n // is otherwise identical.\n if (val1.message !== val2.message || val1.name !== val2.name) {\n return false;\n }\n } else if (isArrayBufferView(val1)) {\n if (!strict && (isFloat32Array(val1) || isFloat64Array(val1))) {\n if (!areSimilarFloatArrays(val1, val2)) {\n return false;\n }\n } else if (!areSimilarTypedArrays(val1, val2)) {\n return false;\n }\n // Buffer.compare returns true, so val1.length === val2.length. If they both\n // only contain numeric keys, we don't need to exam further than checking\n // the symbols.\n var _keys = getOwnNonIndexProperties(val1, ONLY_ENUMERABLE);\n var _keys2 = getOwnNonIndexProperties(val2, ONLY_ENUMERABLE);\n if (_keys.length !== _keys2.length) {\n return false;\n }\n return keyCheck(val1, val2, strict, memos, kNoIterator, _keys);\n } else if (isSet(val1)) {\n if (!isSet(val2) || val1.size !== val2.size) {\n return false;\n }\n return keyCheck(val1, val2, strict, memos, kIsSet);\n } else if (isMap(val1)) {\n if (!isMap(val2) || val1.size !== val2.size) {\n return false;\n }\n return keyCheck(val1, val2, strict, memos, kIsMap);\n } else if (isAnyArrayBuffer(val1)) {\n if (!areEqualArrayBuffers(val1, val2)) {\n return false;\n }\n } else if (isBoxedPrimitive(val1) && !isEqualBoxedPrimitive(val1, val2)) {\n return false;\n }\n return keyCheck(val1, val2, strict, memos, kNoIterator);\n}\nfunction getEnumerables(val, keys) {\n return keys.filter(function (k) {\n return propertyIsEnumerable(val, k);\n });\n}\nfunction keyCheck(val1, val2, strict, memos, iterationType, aKeys) {\n // For all remaining Object pairs, including Array, objects and Maps,\n // equivalence is determined by having:\n // a) The same number of owned enumerable properties\n // b) The same set of keys/indexes (although not necessarily the same order)\n // c) Equivalent values for every corresponding key/index\n // d) For Sets and Maps, equal contents\n // Note: this accounts for both named and indexed properties on Arrays.\n if (arguments.length === 5) {\n aKeys = Object.keys(val1);\n var bKeys = Object.keys(val2);\n\n // The pair must have the same number of owned properties.\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n }\n\n // Cheap key test\n var i = 0;\n for (; i < aKeys.length; i++) {\n if (!hasOwnProperty(val2, aKeys[i])) {\n return false;\n }\n }\n if (strict && arguments.length === 5) {\n var symbolKeysA = objectGetOwnPropertySymbols(val1);\n if (symbolKeysA.length !== 0) {\n var count = 0;\n for (i = 0; i < symbolKeysA.length; i++) {\n var key = symbolKeysA[i];\n if (propertyIsEnumerable(val1, key)) {\n if (!propertyIsEnumerable(val2, key)) {\n return false;\n }\n aKeys.push(key);\n count++;\n } else if (propertyIsEnumerable(val2, key)) {\n return false;\n }\n }\n var symbolKeysB = objectGetOwnPropertySymbols(val2);\n if (symbolKeysA.length !== symbolKeysB.length && getEnumerables(val2, symbolKeysB).length !== count) {\n return false;\n }\n } else {\n var _symbolKeysB = objectGetOwnPropertySymbols(val2);\n if (_symbolKeysB.length !== 0 && getEnumerables(val2, _symbolKeysB).length !== 0) {\n return false;\n }\n }\n }\n if (aKeys.length === 0 && (iterationType === kNoIterator || iterationType === kIsArray && val1.length === 0 || val1.size === 0)) {\n return true;\n }\n\n // Use memos to handle cycles.\n if (memos === undefined) {\n memos = {\n val1: new Map(),\n val2: new Map(),\n position: 0\n };\n } else {\n // We prevent up to two map.has(x) calls by directly retrieving the value\n // and checking for undefined. The map can only contain numbers, so it is\n // safe to check for undefined only.\n var val2MemoA = memos.val1.get(val1);\n if (val2MemoA !== undefined) {\n var val2MemoB = memos.val2.get(val2);\n if (val2MemoB !== undefined) {\n return val2MemoA === val2MemoB;\n }\n }\n memos.position++;\n }\n memos.val1.set(val1, memos.position);\n memos.val2.set(val2, memos.position);\n var areEq = objEquiv(val1, val2, strict, aKeys, memos, iterationType);\n memos.val1.delete(val1);\n memos.val2.delete(val2);\n return areEq;\n}\nfunction setHasEqualElement(set, val1, strict, memo) {\n // Go looking.\n var setValues = arrayFromSet(set);\n for (var i = 0; i < setValues.length; i++) {\n var val2 = setValues[i];\n if (innerDeepEqual(val1, val2, strict, memo)) {\n // Remove the matching element to make sure we do not check that again.\n set.delete(val2);\n return true;\n }\n }\n return false;\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#Loose_equality_using\n// Sadly it is not possible to detect corresponding values properly in case the\n// type is a string, number, bigint or boolean. The reason is that those values\n// can match lots of different string values (e.g., 1n == '+00001').\nfunction findLooseMatchingPrimitives(prim) {\n switch (_typeof(prim)) {\n case 'undefined':\n return null;\n case 'object':\n // Only pass in null as object!\n return undefined;\n case 'symbol':\n return false;\n case 'string':\n prim = +prim;\n // Loose equal entries exist only if the string is possible to convert to\n // a regular number and not NaN.\n // Fall through\n case 'number':\n if (numberIsNaN(prim)) {\n return false;\n }\n }\n return true;\n}\nfunction setMightHaveLoosePrim(a, b, prim) {\n var altValue = findLooseMatchingPrimitives(prim);\n if (altValue != null) return altValue;\n return b.has(altValue) && !a.has(altValue);\n}\nfunction mapMightHaveLoosePrim(a, b, prim, item, memo) {\n var altValue = findLooseMatchingPrimitives(prim);\n if (altValue != null) {\n return altValue;\n }\n var curB = b.get(altValue);\n if (curB === undefined && !b.has(altValue) || !innerDeepEqual(item, curB, false, memo)) {\n return false;\n }\n return !a.has(altValue) && innerDeepEqual(item, curB, false, memo);\n}\nfunction setEquiv(a, b, strict, memo) {\n // This is a lazily initiated Set of entries which have to be compared\n // pairwise.\n var set = null;\n var aValues = arrayFromSet(a);\n for (var i = 0; i < aValues.length; i++) {\n var val = aValues[i];\n // Note: Checking for the objects first improves the performance for object\n // heavy sets but it is a minor slow down for primitives. As they are fast\n // to check this improves the worst case scenario instead.\n if (_typeof(val) === 'object' && val !== null) {\n if (set === null) {\n set = new Set();\n }\n // If the specified value doesn't exist in the second set its an not null\n // object (or non strict only: a not matching primitive) we'll need to go\n // hunting for something thats deep-(strict-)equal to it. To make this\n // O(n log n) complexity we have to copy these values in a new set first.\n set.add(val);\n } else if (!b.has(val)) {\n if (strict) return false;\n\n // Fast path to detect missing string, symbol, undefined and null values.\n if (!setMightHaveLoosePrim(a, b, val)) {\n return false;\n }\n if (set === null) {\n set = new Set();\n }\n set.add(val);\n }\n }\n if (set !== null) {\n var bValues = arrayFromSet(b);\n for (var _i = 0; _i < bValues.length; _i++) {\n var _val = bValues[_i];\n // We have to check if a primitive value is already\n // matching and only if it's not, go hunting for it.\n if (_typeof(_val) === 'object' && _val !== null) {\n if (!setHasEqualElement(set, _val, strict, memo)) return false;\n } else if (!strict && !a.has(_val) && !setHasEqualElement(set, _val, strict, memo)) {\n return false;\n }\n }\n return set.size === 0;\n }\n return true;\n}\nfunction mapHasEqualEntry(set, map, key1, item1, strict, memo) {\n // To be able to handle cases like:\n // Map([[{}, 'a'], [{}, 'b']]) vs Map([[{}, 'b'], [{}, 'a']])\n // ... we need to consider *all* matching keys, not just the first we find.\n var setValues = arrayFromSet(set);\n for (var i = 0; i < setValues.length; i++) {\n var key2 = setValues[i];\n if (innerDeepEqual(key1, key2, strict, memo) && innerDeepEqual(item1, map.get(key2), strict, memo)) {\n set.delete(key2);\n return true;\n }\n }\n return false;\n}\nfunction mapEquiv(a, b, strict, memo) {\n var set = null;\n var aEntries = arrayFromMap(a);\n for (var i = 0; i < aEntries.length; i++) {\n var _aEntries$i = _slicedToArray(aEntries[i], 2),\n key = _aEntries$i[0],\n item1 = _aEntries$i[1];\n if (_typeof(key) === 'object' && key !== null) {\n if (set === null) {\n set = new Set();\n }\n set.add(key);\n } else {\n // By directly retrieving the value we prevent another b.has(key) check in\n // almost all possible cases.\n var item2 = b.get(key);\n if (item2 === undefined && !b.has(key) || !innerDeepEqual(item1, item2, strict, memo)) {\n if (strict) return false;\n // Fast path to detect missing string, symbol, undefined and null\n // keys.\n if (!mapMightHaveLoosePrim(a, b, key, item1, memo)) return false;\n if (set === null) {\n set = new Set();\n }\n set.add(key);\n }\n }\n }\n if (set !== null) {\n var bEntries = arrayFromMap(b);\n for (var _i2 = 0; _i2 < bEntries.length; _i2++) {\n var _bEntries$_i = _slicedToArray(bEntries[_i2], 2),\n _key = _bEntries$_i[0],\n item = _bEntries$_i[1];\n if (_typeof(_key) === 'object' && _key !== null) {\n if (!mapHasEqualEntry(set, a, _key, item, strict, memo)) return false;\n } else if (!strict && (!a.has(_key) || !innerDeepEqual(a.get(_key), item, false, memo)) && !mapHasEqualEntry(set, a, _key, item, false, memo)) {\n return false;\n }\n }\n return set.size === 0;\n }\n return true;\n}\nfunction objEquiv(a, b, strict, keys, memos, iterationType) {\n // Sets and maps don't have their entries accessible via normal object\n // properties.\n var i = 0;\n if (iterationType === kIsSet) {\n if (!setEquiv(a, b, strict, memos)) {\n return false;\n }\n } else if (iterationType === kIsMap) {\n if (!mapEquiv(a, b, strict, memos)) {\n return false;\n }\n } else if (iterationType === kIsArray) {\n for (; i < a.length; i++) {\n if (hasOwnProperty(a, i)) {\n if (!hasOwnProperty(b, i) || !innerDeepEqual(a[i], b[i], strict, memos)) {\n return false;\n }\n } else if (hasOwnProperty(b, i)) {\n return false;\n } else {\n // Array is sparse.\n var keysA = Object.keys(a);\n for (; i < keysA.length; i++) {\n var key = keysA[i];\n if (!hasOwnProperty(b, key) || !innerDeepEqual(a[key], b[key], strict, memos)) {\n return false;\n }\n }\n if (keysA.length !== Object.keys(b).length) {\n return false;\n }\n return true;\n }\n }\n }\n\n // The pair must have equivalent values for every corresponding key.\n // Possibly expensive deep test:\n for (i = 0; i < keys.length; i++) {\n var _key2 = keys[i];\n if (!innerDeepEqual(a[_key2], b[_key2], strict, memos)) {\n return false;\n }\n }\n return true;\n}\nfunction isDeepEqual(val1, val2) {\n return innerDeepEqual(val1, val2, kLoose);\n}\nfunction isDeepStrictEqual(val1, val2) {\n return innerDeepEqual(val1, val2, kStrict);\n}\nmodule.exports = {\n isDeepEqual: isDeepEqual,\n isDeepStrictEqual: isDeepStrictEqual\n};","import PropTypes from 'prop-types';\n\nexport const privatePropTypes = {\n _dashprivate_transformConfig: PropTypes.func,\n _dashprivate_transformFigure: PropTypes.func,\n _dashprivate_onFigureModified: PropTypes.func,\n};\n\nexport const privateDefaultProps = {\n _dashprivate_transformConfig: c => c,\n _dashprivate_transformFigure: f => f,\n _dashprivate_onFigureModified: f => f,\n};\n","import React, {Component, memo, Suspense} from 'react';\nimport PropTypes from 'prop-types';\n\nimport {asyncDecorator} from '@plotly/dash-component-plugins';\nimport graph from '../utils/LazyLoader/graph';\nimport plotly from '../utils/LazyLoader/plotly';\nimport lazyLoadMathJax from '../utils/LazyLoader/mathjax';\nimport {\n privatePropTypes,\n privateDefaultProps,\n} from '../fragments/Graph.privateprops';\n\nconst EMPTY_DATA = [];\n\n/**\n * Graph can be used to render any plotly.js-powered data visualization.\n *\n * You can define callbacks based on user interaction with Graphs such as\n * hovering, clicking or selecting\n */\nclass PlotlyGraph extends Component {\n constructor(props) {\n super(props);\n\n if (props.mathjax) {\n PlotlyGraph._loadMathjax = true;\n }\n\n this.state = {\n prependData: [],\n extendData: [],\n };\n\n this.clearState = this.clearState.bind(this);\n }\n\n componentDidMount() {\n if (this.props.prependData) {\n this.setState({\n prependData: [this.props.prependData],\n });\n }\n if (this.props.extendData) {\n this.setState({\n extendData: [this.props.extendData],\n });\n }\n }\n\n componentWillUnmount() {\n this.setState({\n prependData: [],\n extendData: [],\n });\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n let prependData = this.state.prependData.slice(0);\n\n if (this.props.figure !== nextProps.figure) {\n prependData = EMPTY_DATA;\n }\n\n if (\n nextProps.prependData &&\n this.props.prependData !== nextProps.prependData\n ) {\n prependData.push(nextProps.prependData);\n } else {\n prependData = EMPTY_DATA;\n }\n\n if (prependData !== EMPTY_DATA) {\n this.setState({\n prependData,\n });\n }\n\n let extendData = this.state.extendData.slice(0);\n\n if (this.props.figure !== nextProps.figure) {\n extendData = EMPTY_DATA;\n }\n\n if (\n nextProps.extendData &&\n this.props.extendData !== nextProps.extendData\n ) {\n extendData.push(nextProps.extendData);\n } else {\n extendData = EMPTY_DATA;\n }\n\n if (extendData !== EMPTY_DATA) {\n this.setState({\n extendData,\n });\n }\n }\n\n clearState(dataKey) {\n this.setState(props => {\n var data = props[dataKey];\n const res =\n data && data.length\n ? {\n [dataKey]: EMPTY_DATA,\n }\n : undefined;\n\n return res;\n });\n }\n\n render() {\n return (\n \n );\n }\n}\n\nconst RealPlotlyGraph = asyncDecorator(PlotlyGraph, () =>\n Promise.all([\n graph(),\n plotly(),\n PlotlyGraph._loadMathjax ? lazyLoadMathJax() : undefined,\n ]).then(([graph]) => graph)\n);\n\nconst ControlledPlotlyGraph = memo(props => {\n const {className, id} = props;\n\n const extendedClassName = className\n ? 'dash-graph ' + className\n : 'dash-graph';\n\n return (\n \n }\n >\n \n \n );\n});\n\nControlledPlotlyGraph.displayName = 'ControlledPlotlyGraph';\n\nPlotlyGraph.propTypes = {\n ...privatePropTypes,\n\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string,\n\n /**\n * If True, the Plotly.js plot will be fully responsive to window resize\n * and parent element resize event. This is achieved by overriding\n * `config.responsive` to True, `figure.layout.autosize` to True and unsetting\n * `figure.layout.height` and `figure.layout.width`.\n * If False, the Plotly.js plot not be responsive to window resize and\n * parent element resize event. This is achieved by overriding `config.responsive`\n * to False and `figure.layout.autosize` to False.\n * If 'auto' (default), the Graph will determine if the Plotly.js plot can be made fully\n * responsive (True) or not (False) based on the values in `config.responsive`,\n * `figure.layout.autosize`, `figure.layout.height`, `figure.layout.width`.\n * This is the legacy behavior of the Graph component.\n *\n * Needs to be combined with appropriate dimension / styling through the `style` prop\n * to fully take effect.\n */\n responsive: PropTypes.oneOf([true, false, 'auto']),\n\n /**\n * Data from latest click event. Read-only.\n */\n clickData: PropTypes.object,\n\n /**\n * Data from latest click annotation event. Read-only.\n */\n clickAnnotationData: PropTypes.object,\n\n /**\n * Data from latest hover event. Read-only.\n */\n hoverData: PropTypes.object,\n\n /**\n * If True, `clear_on_unhover` will clear the `hoverData` property\n * when the user \"unhovers\" from a point.\n * If False, then the `hoverData` property will be equal to the\n * data from the last point that was hovered over.\n */\n clear_on_unhover: PropTypes.bool,\n\n /**\n * Data from latest select event. Read-only.\n */\n selectedData: PropTypes.object,\n\n /**\n * Data from latest relayout event which occurs\n * when the user zooms or pans on the plot or other\n * layout-level edits. Has the form `{: }`\n * describing the changes made. Read-only.\n */\n relayoutData: PropTypes.object,\n\n /**\n * Data that should be appended to existing traces. Has the form\n * `[updateData, traceIndices, maxPoints]`, where `updateData` is an object\n * containing the data to extend, `traceIndices` (optional) is an array of\n * trace indices that should be extended, and `maxPoints` (optional) is\n * either an integer defining the maximum number of points allowed or an\n * object with key:value pairs matching `updateData`\n * Reference the Plotly.extendTraces API for full usage:\n * https://plotly.com/javascript/plotlyjs-function-reference/#plotlyextendtraces\n */\n extendData: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),\n\n /**\n * Data that should be prepended to existing traces. Has the form\n * `[updateData, traceIndices, maxPoints]`, where `updateData` is an object\n * containing the data to prepend, `traceIndices` (optional) is an array of\n * trace indices that should be prepended, and `maxPoints` (optional) is\n * either an integer defining the maximum number of points allowed or an\n * object with key:value pairs matching `updateData`\n * Reference the Plotly.prependTraces API for full usage:\n * https://plotly.com/javascript/plotlyjs-function-reference/#plotlyprependtraces\n */\n prependData: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),\n\n /**\n * Data from latest restyle event which occurs\n * when the user toggles a legend item, changes\n * parcoords selections, or other trace-level edits.\n * Has the form `[edits, indices]`, where `edits` is an object\n * `{: }` describing the changes made,\n * and `indices` is an array of trace indices that were edited.\n * Read-only.\n */\n restyleData: PropTypes.array,\n\n /**\n * Plotly `figure` object. See schema:\n * https://plotly.com/javascript/reference\n *\n * `config` is set separately by the `config` property\n */\n figure: PropTypes.exact({\n data: PropTypes.arrayOf(PropTypes.object),\n layout: PropTypes.object,\n frames: PropTypes.arrayOf(PropTypes.object),\n }),\n\n /**\n * Generic style overrides on the plot div\n */\n style: PropTypes.object,\n\n /**\n * className of the parent div\n */\n className: PropTypes.string,\n\n /**\n * If true, loads mathjax v3 (tex-svg) into the page and use it in the graph\n */\n mathjax: PropTypes.bool,\n\n /**\n * Beta: If true, animate between updates using\n * plotly.js's `animate` function\n */\n animate: PropTypes.bool,\n\n /**\n * Beta: Object containing animation settings.\n * Only applies if `animate` is `true`\n */\n animation_options: PropTypes.object,\n\n /**\n * Plotly.js config options.\n * See https://plotly.com/javascript/configuration-options/\n * for more info.\n */\n config: PropTypes.exact({\n /**\n * No interactivity, for export or image generation\n */\n staticPlot: PropTypes.bool,\n\n /**\n * Base URL for a Plotly cloud instance, if `showSendToCloud` is enabled\n */\n plotlyServerURL: PropTypes.string,\n\n /**\n * We can edit titles, move annotations, etc - sets all pieces of `edits`\n * unless a separate `edits` config item overrides individual parts\n */\n editable: PropTypes.bool,\n\n /**\n * Enables moving selections\n */\n editSelection: PropTypes.bool,\n\n /**\n * A set of editable properties\n */\n edits: PropTypes.exact({\n /**\n * The main anchor of the annotation, which is the\n * text (if no arrow) or the arrow (which drags the whole thing leaving\n * the arrow length & direction unchanged)\n */\n annotationPosition: PropTypes.bool,\n\n /**\n * Just for annotations with arrows, change the length and direction of the arrow\n */\n annotationTail: PropTypes.bool,\n\n annotationText: PropTypes.bool,\n\n axisTitleText: PropTypes.bool,\n\n colorbarPosition: PropTypes.bool,\n\n colorbarTitleText: PropTypes.bool,\n\n legendPosition: PropTypes.bool,\n\n /**\n * Edit the trace name fields from the legend\n */\n legendText: PropTypes.bool,\n\n shapePosition: PropTypes.bool,\n\n /**\n * The global `layout.title`\n */\n titleText: PropTypes.bool,\n }),\n\n /**\n * DO autosize once regardless of layout.autosize\n * (use default width or height values otherwise)\n */\n autosizable: PropTypes.bool,\n\n /**\n * Whether to change layout size when the window size changes\n */\n responsive: PropTypes.bool,\n\n /**\n * Set the length of the undo/redo queue\n */\n queueLength: PropTypes.number,\n\n /**\n * If we DO autosize, do we fill the container or the screen?\n */\n fillFrame: PropTypes.bool,\n\n /**\n * If we DO autosize, set the frame margins in percents of plot size\n */\n frameMargins: PropTypes.number,\n\n /**\n * Mousewheel or two-finger scroll zooms the plot\n */\n scrollZoom: PropTypes.bool,\n\n /**\n * Double click interaction (false, 'reset', 'autosize' or 'reset+autosize')\n */\n doubleClick: PropTypes.oneOf([\n false,\n 'reset',\n 'autosize',\n 'reset+autosize',\n ]),\n\n /**\n * Delay for registering a double-click event in ms. The\n * minimum value is 100 and the maximum value is 1000. By\n * default this is 300.\n */\n doubleClickDelay: PropTypes.number,\n\n /**\n * New users see some hints about interactivity\n */\n showTips: PropTypes.bool,\n\n /**\n * Enable axis pan/zoom drag handles\n */\n showAxisDragHandles: PropTypes.bool,\n\n /**\n * Enable direct range entry at the pan/zoom drag points\n * (drag handles must be enabled above)\n */\n showAxisRangeEntryBoxes: PropTypes.bool,\n\n /**\n * Link to open this plot in plotly\n */\n showLink: PropTypes.bool,\n\n /**\n * If we show a link, does it contain data or just link to a plotly file?\n */\n sendData: PropTypes.bool,\n\n /**\n * Text appearing in the sendData link\n */\n linkText: PropTypes.string,\n\n /**\n * Display the mode bar (true, false, or 'hover')\n */\n displayModeBar: PropTypes.oneOf([true, false, 'hover']),\n\n /**\n * Should we include a modebar button to send this data to a\n * Plotly Cloud instance, linked by `plotlyServerURL`.\n * By default this is false.\n */\n showSendToCloud: PropTypes.bool,\n\n /**\n * Should we show a modebar button to send this data to a\n * Plotly Chart Studio plot. If both this and showSendToCloud\n * are selected, only showEditInChartStudio will be\n * honored. By default this is false.\n */\n showEditInChartStudio: PropTypes.bool,\n\n /**\n * Remove mode bar button by name.\n * All modebar button names at https://github.com/plotly/plotly.js/blob/master/src/components/modebar/buttons.js\n * Common names include:\n * sendDataToCloud;\n * (2D) zoom2d, pan2d, select2d, lasso2d, zoomIn2d, zoomOut2d, autoScale2d, resetScale2d;\n * (Cartesian) hoverClosestCartesian, hoverCompareCartesian;\n * (3D) zoom3d, pan3d, orbitRotation, tableRotation, handleDrag3d, resetCameraDefault3d, resetCameraLastSave3d, hoverClosest3d;\n * (Geo) zoomInGeo, zoomOutGeo, resetGeo, hoverClosestGeo;\n * hoverClosestGl2d, hoverClosestPie, toggleHover, resetViews.\n */\n modeBarButtonsToRemove: PropTypes.array,\n\n /**\n * Add mode bar button using config objects\n */\n modeBarButtonsToAdd: PropTypes.array,\n\n /**\n * Fully custom mode bar buttons as nested array,\n * where the outer arrays represents button groups, and\n * the inner arrays have buttons config objects or names of default buttons\n */\n modeBarButtons: PropTypes.any,\n\n /**\n * Modifications to how the toImage modebar button works\n */\n toImageButtonOptions: PropTypes.exact({\n /**\n * The file format to create\n */\n format: PropTypes.oneOf(['jpeg', 'png', 'webp', 'svg']),\n /**\n * The name given to the downloaded file\n */\n filename: PropTypes.string,\n /**\n * Width of the downloaded file, in px\n */\n width: PropTypes.number,\n /**\n * Height of the downloaded file, in px\n */\n height: PropTypes.number,\n /**\n * Extra resolution to give the file after\n * rendering it with the given width and height\n */\n scale: PropTypes.number,\n }),\n\n /**\n * Add the plotly logo on the end of the mode bar\n */\n displaylogo: PropTypes.bool,\n\n /**\n * Add the plotly logo even with no modebar\n */\n watermark: PropTypes.bool,\n\n /**\n * Increase the pixel ratio for Gl plot images\n */\n plotGlPixelRatio: PropTypes.number,\n\n /**\n * URL to topojson files used in geo charts\n */\n topojsonURL: PropTypes.string,\n\n /**\n * Mapbox access token (required to plot mapbox trace types)\n * If using an Mapbox Atlas server, set this option to '',\n * so that plotly.js won't attempt to authenticate to the public Mapbox server.\n */\n mapboxAccessToken: PropTypes.any,\n\n /**\n * The locale to use. Locales may be provided with the plot\n * (`locales` below) or by loading them on the page, see:\n * https://github.com/plotly/plotly.js/blob/master/dist/README.md#to-include-localization\n */\n locale: PropTypes.string,\n\n /**\n * Localization definitions, if you choose to provide them with the\n * plot rather than registering them globally.\n */\n locales: PropTypes.object,\n\n /**\n * Determines whether or not notifier is displayed\n */\n displayNotifier: PropTypes.bool,\n }),\n\n /**\n * Function that updates the state tree.\n */\n setProps: PropTypes.func,\n};\n\nControlledPlotlyGraph.propTypes = PlotlyGraph.propTypes;\n\nPlotlyGraph.defaultProps = {\n ...privateDefaultProps,\n\n clickData: null,\n clickAnnotationData: null,\n hoverData: null,\n selectedData: null,\n relayoutData: null,\n prependData: null,\n extendData: null,\n restyleData: null,\n figure: {\n data: [],\n layout: {},\n frames: [],\n },\n responsive: 'auto',\n mathjax: false,\n animate: false,\n animation_options: {\n frame: {\n redraw: false,\n },\n transition: {\n duration: 750,\n ease: 'cubic-in-out',\n },\n },\n clear_on_unhover: false,\n config: {},\n};\n\nexport const graphPropTypes = PlotlyGraph.propTypes;\nexport const graphDefaultProps = PlotlyGraph.defaultProps;\n\nexport default PlotlyGraph;\n","export default () => import(/* webpackChunkName: \"graph\" */ '../../fragments/Graph.react');\n\n","export default () => {\n return Promise.resolve(window.Plotly || new Promise((resolve, reject) => {\n /* eslint-disable prefer-const */\n let timeoutId;\n\n const element = document.createElement('script');\n element.src = window._dashPlotlyJSURL;\n element.async = true;\n element.onload = () => {\n clearTimeout(timeoutId);\n resolve();\n };\n element.onerror = (error) => {\n clearTimeout(timeoutId);\n reject(error);\n };\n\n timeoutId = setTimeout(() => {\n element.src = '';\n reject(new Error(`plotly.js did not load after 30 seconds`));\n }, 3 * 10 * 1000);\n\n document.querySelector('body').appendChild(element);\n }));\n}\n","import PropTypes from 'prop-types';\n\nimport React, {useEffect, useMemo} from 'react';\nimport {isNil} from 'ramda';\n\n/*\n * event polyfill for IE\n * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\n */\nfunction CustomEvent(event, params) {\n // eslint-disable-next-line no-param-reassign\n params = params || {\n bubbles: false,\n cancelable: false,\n // eslint-disable-next-line no-undefined\n detail: undefined,\n };\n const evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(\n event,\n params.bubbles,\n params.cancelable,\n params.detail\n );\n return evt;\n}\nCustomEvent.prototype = window.Event.prototype;\n\n/**\n * Link allows you to create a clickable link within a multi-page app.\n *\n * For links with destinations outside the current app, `html.A` is a better\n * component to use.\n */\nconst Link = ({refresh = false, ...props}) => {\n const {className, style, id, href, children, title, target, setProps} =\n props;\n const cleanUrl = window.dash_clientside.clean_url;\n const sanitizedUrl = useMemo(() => {\n return href ? cleanUrl(href) : undefined;\n }, [href]);\n\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n\n const updateLocation = e => {\n const hasModifiers = e.metaKey || e.shiftKey || e.altKey || e.ctrlKey;\n\n if (hasModifiers) {\n return;\n }\n if (target !== '_self' && !isNil(target)) {\n return;\n }\n // prevent anchor from updating location\n e.preventDefault();\n if (refresh) {\n window.location = sanitizedUrl;\n } else {\n window.history.pushState({}, '', sanitizedUrl);\n window.dispatchEvent(new CustomEvent('_dashprivate_pushstate'));\n }\n // scroll back to top\n window.scrollTo(0, 0);\n };\n\n useEffect(() => {\n if (sanitizedUrl && sanitizedUrl !== href) {\n setProps({\n _dash_error: new Error(`Dangerous link detected:: ${href}`),\n });\n }\n }, [href, sanitizedUrl]);\n\n return (\n \n {isNil(children) ? sanitizedUrl : children}\n \n );\n};\n\nLink.propTypes = {\n /**\n * The children of this component\n */\n children: PropTypes.node,\n /**\n * The URL of a linked resource.\n */\n href: PropTypes.string.isRequired,\n /**\n * Specifies where to open the link reference.\n */\n target: PropTypes.string,\n /**\n * Controls whether or not the page will refresh when the link is clicked\n */\n refresh: PropTypes.bool,\n\n /**\n * Adds the title attribute to your link, which can contain supplementary\n * information.\n */\n title: PropTypes.string,\n\n /**\n * Often used with CSS to style elements with common properties.\n */\n className: PropTypes.string,\n /**\n * Defines CSS styles which will override styles previously set.\n */\n style: PropTypes.object,\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string,\n /**\n * Object that holds the loading state object coming from dash-renderer\n */\n loading_state: PropTypes.shape({\n /**\n * Determines if the component is loading or not\n */\n is_loading: PropTypes.bool,\n /**\n * Holds which property is loading\n */\n prop_name: PropTypes.string,\n /**\n * Holds the name of the component that is loading\n */\n component_name: PropTypes.string,\n }),\n setProps: PropTypes.func,\n};\n\nexport default Link;\n","import {asyncDecorator} from '@plotly/dash-component-plugins';\nimport PropTypes from 'prop-types';\nimport React, {Component, Suspense} from 'react';\nimport markdown from '../utils/LazyLoader/markdown';\nimport lazyLoadMathJax from '../utils/LazyLoader/mathjax';\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * A component that renders Markdown text as specified by the\n * GitHub Markdown spec. These component uses\n * [react-markdown](https://rexxars.github.io/react-markdown/) under the hood.\n */\nexport default class DashMarkdown extends Component {\n constructor(props) {\n super(props);\n\n if (props.mathjax) {\n DashMarkdown._loadMathjax = true;\n }\n }\n\n render() {\n return (\n \n \n \n );\n }\n}\n\nDashMarkdown.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string,\n /**\n * Class name of the container element\n */\n className: PropTypes.string,\n\n /**\n * If true, loads mathjax v3 (tex-svg) into the page and use it in the markdown\n */\n mathjax: PropTypes.bool,\n\n /**\n * A boolean to control raw HTML escaping.\n * Setting HTML from code is risky because it's easy to\n * inadvertently expose your users to a cross-site scripting (XSS)\n * (https://en.wikipedia.org/wiki/Cross-site_scripting) attack.\n */\n dangerously_allow_html: PropTypes.bool,\n\n /**\n * A string for the target attribute to use on links (such as \"_blank\")\n */\n link_target: PropTypes.string,\n\n /**\n * A markdown string (or array of strings) that adheres to the CommonMark spec\n */\n children: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string),\n ]),\n\n /**\n * Remove matching leading whitespace from all lines.\n * Lines that are empty, or contain *only* whitespace, are ignored.\n * Both spaces and tab characters are removed, but only if they match;\n * we will not convert tabs to spaces or vice versa.\n */\n dedent: PropTypes.bool,\n\n /**\n * Config options for syntax highlighting.\n */\n highlight_config: PropTypes.exact({\n /**\n * Color scheme; default 'light'\n */\n theme: PropTypes.oneOf(['dark', 'light']),\n }),\n\n /**\n * User-defined inline styles for the rendered Markdown\n */\n style: PropTypes.object,\n};\n\nDashMarkdown.defaultProps = {\n mathjax: false,\n dangerously_allow_html: false,\n highlight_config: {},\n dedent: true,\n};\n\nconst RealDashMarkdown = asyncDecorator(DashMarkdown, () =>\n Promise.all([\n markdown(),\n DashMarkdown._loadMathjax ? lazyLoadMathJax() : undefined,\n ]).then(([md]) => md)\n);\n\nexport const propTypes = DashMarkdown.propTypes;\nexport const defaultProps = DashMarkdown.defaultProps;\n","export default () => import(/* webpackChunkName: \"markdown\" */ '../../fragments/Markdown.react');\n\n","export default () => import(/* webpackChunkName: \"upload\" */ '../../fragments/Upload.react');\n","import PropTypes from 'prop-types';\nimport React, {Component, lazy, Suspense} from 'react';\nimport upload from '../utils/LazyLoader/upload';\n\nconst RealUpload = lazy(upload);\n\n/**\n * Upload components allow your app to accept user-uploaded files via drag'n'drop\n */\nexport default class Upload extends Component {\n render() {\n return (\n \n \n \n );\n }\n}\n\nUpload.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string,\n\n /**\n * The contents of the uploaded file as a binary string\n */\n contents: PropTypes.oneOfType([\n /**\n * If `multiple` is `false`, then the contents will be a string\n */\n PropTypes.string,\n\n /**\n * If `multiple` is `true`, then the contents will be a list of strings\n */\n PropTypes.arrayOf(PropTypes.string),\n ]),\n\n /**\n * The name of the file(s) that was(were) uploaded.\n * Note that this does not include the path of the file\n * (for security reasons).\n */\n filename: PropTypes.oneOfType([\n /**\n * If `multiple` is `false`, then the contents will be a string\n */\n PropTypes.string,\n\n /**\n * If `multiple` is `true`, then the contents will be a list of strings\n */\n PropTypes.arrayOf(PropTypes.string),\n ]),\n\n /**\n * The last modified date of the file that was uploaded in unix time\n * (seconds since 1970).\n */\n last_modified: PropTypes.oneOfType([\n /**\n * If `multiple` is `false`, then the contents will be a number\n */\n PropTypes.number,\n\n /**\n * If `multiple` is `true`, then the contents will be a list of numbers\n */\n PropTypes.arrayOf(PropTypes.number),\n ]),\n\n /**\n * Contents of the upload component\n */\n children: PropTypes.oneOfType([PropTypes.node, PropTypes.string]),\n\n /**\n * Allow specific types of files.\n * See https://github.com/okonet/attr-accept for more information.\n * Keep in mind that mime type determination is not reliable across\n * platforms. CSV files, for example, are reported as text/plain\n * under macOS but as application/vnd.ms-excel under Windows.\n * In some cases there might not be a mime type set at all.\n * See: https://github.com/react-dropzone/react-dropzone/issues/276\n */\n accept: PropTypes.string,\n\n /**\n * Enable/disable the upload component entirely\n */\n disabled: PropTypes.bool,\n\n /**\n * Disallow clicking on the component to open the file dialog\n */\n disable_click: PropTypes.bool,\n\n /**\n * Maximum file size in bytes. If `-1`, then infinite\n */\n max_size: PropTypes.number,\n\n /**\n * Minimum file size in bytes\n */\n min_size: PropTypes.number,\n\n /**\n * Allow dropping multiple files.\n * When true, enables folder drag-and-drop support.\n * The folder hierarchy is preserved in filenames (e.g., 'folder/subfolder/file.txt').\n * Note: Folder drag-and-drop is supported in Chrome, Edge, and Opera.\n */\n multiple: PropTypes.bool,\n\n /**\n * Enable folder selection in the file picker dialog.\n * When true with multiple=True, the file picker allows selecting folders instead of files.\n * Note: When folder selection is enabled, individual files cannot be selected via the button.\n * Use separate Upload components if you need both file and folder selection options.\n * Folder selection is supported in Chrome, Edge, and Opera.\n */\n enable_folder_selection: PropTypes.bool,\n\n /**\n * HTML class name of the component\n */\n className: PropTypes.string,\n\n /**\n * HTML class name of the component while active\n */\n className_active: PropTypes.string,\n\n /**\n * HTML class name of the component if rejected\n */\n className_reject: PropTypes.string,\n\n /**\n * HTML class name of the component if disabled\n */\n className_disabled: PropTypes.string,\n\n /**\n * CSS styles to apply\n */\n style: PropTypes.object,\n\n /**\n * CSS styles to apply while active\n */\n style_active: PropTypes.object,\n\n /**\n * CSS styles if rejected\n */\n style_reject: PropTypes.object,\n\n /**\n * CSS styles if disabled\n */\n style_disabled: PropTypes.object,\n\n /**\n * Dash-supplied function for updating props\n */\n setProps: PropTypes.func,\n};\n\nUpload.defaultProps = {\n disabled: false,\n disable_click: false,\n max_size: -1,\n min_size: 0,\n multiple: false,\n enable_folder_selection: false,\n style: {},\n style_active: {\n borderStyle: 'solid',\n borderColor: '#6c6',\n backgroundColor: '#eee',\n },\n style_disabled: {\n opacity: 0.5,\n },\n style_reject: {\n borderStyle: 'solid',\n borderColor: '#c66',\n backgroundColor: '#eee',\n },\n};\n\nexport const propTypes = Upload.propTypes;\nexport const defaultProps = Upload.defaultProps;\n","export default (mathjax) => Promise.resolve(window.MathJax || (\n mathjax === false ?\n undefined :\n import(/* webpackChunkName: \"mathjax\" */ '../mathjax').then(() => window.MathJax)\n));\n","import React from 'react';\n\n/**\n * The loading element is used to add `data-dash-is-loading` attribute\n * on html elements. This is used to customize CSS when a component is\n * loading.\n *\n * See: https://dash.plotly.com/loading-states#check-loading-states-from-components\n */\n// eslint-disable-next-line react/prop-types\nfunction LoadingElement({elementType = 'div', ...props}, ref) {\n const ctx = window.dash_component_api.useDashContext();\n const loading = ctx.useLoading();\n\n const givenProps = {\n ...props,\n ref,\n };\n if (loading) {\n givenProps['data-dash-is-loading'] = true;\n }\n\n return React.createElement(elementType, givenProps);\n}\n\nexport default React.forwardRef(LoadingElement);\n","export default () =>\n import(/* webpackChunkName: \"dropdown\" */ '../../fragments/Dropdown');\n","import React, {lazy, Suspense} from 'react';\nimport {DropdownProps, PersistedProps, PersistenceTypes} from '../types';\nimport dropdown from '../utils/LazyLoader/dropdown';\n\nconst RealDropdown = lazy(dropdown);\n\nconst defaultLabels: DropdownProps['labels'] = {\n select_all: 'Select All',\n deselect_all: 'Deselect All',\n selected_count: '{num_selected} selected',\n search: 'Search',\n clear_search: 'Clear search',\n clear_selection: 'Clear selection',\n no_options_found: 'No options found',\n};\n\n/**\n * Dropdown is an interactive dropdown element for selecting one or more\n * items.\n * The values and labels of the dropdown items are specified in the `options`\n * property and the selected item(s) are specified with the `value` property.\n *\n * Use a dropdown when you have many options (more than 5) or when you are\n * constrained for space. Otherwise, you can use RadioItems or a Checklist,\n * which have the benefit of showing the users all of the items at once.\n */\nexport default function Dropdown({\n clearable = true,\n disabled = false,\n multi = false,\n searchable = true,\n labels = defaultLabels,\n optionHeight = 'auto',\n // eslint-disable-next-line no-magic-numbers\n maxHeight = 200,\n closeOnSelect = !multi,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n ...props\n}: DropdownProps) {\n labels = {\n ...defaultLabels,\n ...labels,\n };\n\n return (\n \n \n \n );\n}\n\nDropdown.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./input.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./input.css\";\n export default content && content.locals ? content.locals : undefined;\n","import {pick} from 'ramda';\nimport React, {\n InputHTMLAttributes,\n KeyboardEvent,\n KeyboardEventHandler,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport uniqid from 'uniqid';\nimport fastIsNumeric from 'fast-isnumeric';\nimport LoadingElement from '../utils/_LoadingElement';\nimport {\n HTMLInputTypes,\n InputProps,\n PersistedProps,\n PersistenceTypes,\n} from '../types';\nimport './css/input.css';\n\nconst isNumeric = (val: unknown): val is number => fastIsNumeric(val);\nconst convert = (val: unknown) => (isNumeric(val) ? +val : NaN);\n\nconst isEquivalent = (v1: number, v2: number) =>\n v1 === v2 || (isNaN(v1) && isNaN(v2));\n\nconst inputProps = [\n 'type',\n 'placeholder',\n 'inputMode',\n 'autoComplete',\n 'readOnly',\n 'required',\n 'autoFocus',\n 'list',\n 'multiple',\n 'spellCheck',\n 'name',\n 'min',\n 'max',\n 'step',\n 'minLength',\n 'maxLength',\n 'pattern',\n 'size',\n] as const;\n\ntype HTMLInputProps = Extract<\n (typeof inputProps)[number],\n keyof InputHTMLAttributes\n>;\n\n/**\n * A basic HTML input control for entering text, numbers, or passwords.\n *\n * Note that checkbox and radio types are supported through\n * the Checklist and RadioItems component. Dates, times, and file uploads\n * are also supported through separate components.\n */\nfunction Input({\n type = HTMLInputTypes.text,\n inputMode = 'verbatim',\n n_blur = 0,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n n_blur_timestamp = -1,\n n_submit = 0,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n n_submit_timestamp = -1,\n debounce = false,\n step = 'any',\n autoComplete = 'off',\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n disabled,\n ...props\n}: InputProps) {\n const input = useRef(document.createElement('input'));\n const [value, setValue] = useState(props.value);\n const [pendingEvent, setPendingEvent] = useState();\n const inputId = useState(() => uniqid('input-'))[0];\n\n const valprops = type === HTMLInputTypes.number ? {} : {value: value ?? ''};\n let {className} = props;\n className = 'dash-input' + (className ? ` ${className}` : '');\n\n const setPropValue = useCallback(\n (base: InputProps['value'], value: InputProps['value']) => {\n const {setProps} = props;\n base = convert(base);\n value = input.current.checkValidity() ? convert(value) : NaN;\n\n if (!isEquivalent(base, value)) {\n setProps({value});\n }\n },\n [props.setProps]\n );\n\n const onEvent = () => {\n const {value: inputValue} = input.current;\n const valueAsNumber = convert(inputValue);\n if (type === HTMLInputTypes.number) {\n setPropValue(props.value, valueAsNumber ?? value);\n } else {\n const propValue =\n inputValue === '' && props.value === undefined\n ? undefined\n : inputValue;\n props.setProps({value: propValue});\n }\n setPendingEvent(undefined);\n };\n\n const onBlur = useCallback(() => {\n props.setProps({\n n_blur: (n_blur ?? 0) + 1,\n n_blur_timestamp: Date.now(),\n });\n input.current.checkValidity();\n return debounce === true && onEvent();\n }, [n_blur, debounce]);\n\n const onChange = useCallback(() => {\n const {value} = input.current;\n setValue(value);\n }, []);\n\n const onKeyPress: KeyboardEventHandler = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n props.setProps({\n n_submit: (n_submit ?? 0) + 1,\n n_submit_timestamp: Date.now(),\n });\n }\n return debounce === true && e.key === 'Enter' && onEvent();\n },\n [n_submit, debounce]\n );\n\n const setInputValue = useCallback(\n (base: InputProps['value'], value: InputProps['value']) => {\n base = input.current.checkValidity() ? convert(base) : NaN;\n value = convert(value);\n\n if (!isEquivalent(base, value)) {\n if (typeof value === 'undefined') {\n input.current.value = '';\n } else {\n input.current.value = `${value}`;\n }\n }\n },\n []\n );\n\n const debounceEvent = useCallback(\n (seconds = 0.5) => {\n const {value} = input.current;\n window.clearTimeout(pendingEvent);\n setPendingEvent(\n window.setTimeout(() => {\n onEvent();\n }, seconds * 1000)\n );\n\n setValue(value);\n },\n [pendingEvent]\n );\n\n const handleStepperClick = useCallback(\n (direction: 'increment' | 'decrement') => {\n const currentValue = parseFloat(input.current.value) || 0;\n const stepAsNum = parseFloat(step as string) || 1;\n\n // Count decimal places to avoid floating point precision issues\n const decimalPlaces = (stepAsNum.toString().split('.')[1] || '')\n .length;\n\n const newValue =\n direction === 'increment'\n ? currentValue + stepAsNum\n : currentValue - stepAsNum;\n\n // Apply min/max constraints\n let constrainedValue = newValue;\n if (props.min !== null && props.min !== undefined) {\n constrainedValue = Math.max(\n constrainedValue,\n parseFloat(props.min as string)\n );\n }\n if (props.max !== null && props.min !== undefined) {\n constrainedValue = Math.min(\n constrainedValue,\n parseFloat(props.max as string)\n );\n }\n\n // Round to the step's decimal precision\n const roundedValue = parseFloat(\n constrainedValue.toFixed(decimalPlaces)\n );\n\n input.current.value = roundedValue.toString();\n setValue(roundedValue.toString());\n onEvent();\n },\n [step, props.min, props.max, onEvent]\n );\n\n useEffect(() => {\n const {value} = input.current;\n if (pendingEvent || props.value === value) {\n return;\n }\n const valueAsNumber = convert(value);\n setInputValue(valueAsNumber ?? value, props.value);\n if (type !== HTMLInputTypes.number) {\n setValue(props.value);\n }\n }, [props.value, type, pendingEvent]);\n\n useEffect(() => {\n // Skip this effect if the value change came from props update (not user input)\n if (value === props.value) {\n return;\n }\n\n const {selectionStart: cursorPosition} = input.current;\n if (debounce) {\n if (typeof debounce === 'number' && Number.isFinite(debounce)) {\n debounceEvent(debounce);\n }\n if (type !== HTMLInputTypes.number) {\n setTimeout(() => {\n input.current.setSelectionRange(\n cursorPosition,\n cursorPosition\n );\n }, 0);\n }\n } else {\n onEvent();\n }\n }, [value, debounce, type]);\n\n const disabledAsBool = [true, 'disabled', 'DISABLED'].includes(\n disabled ?? false\n );\n\n const pickedInputs = pick(inputProps, {\n ...props,\n type,\n inputMode,\n step,\n autoComplete,\n disabled: disabledAsBool,\n }) as Pick, HTMLInputProps>;\n\n const isNumberInput = type === HTMLInputTypes.number;\n const currentNumericValue = parseFloat(String(value ?? 0)) || 0;\n const minValue = convert(props.min);\n const maxValue = convert(props.max);\n const isDecrementDisabled =\n disabledAsBool || currentNumericValue <= minValue;\n const isIncrementDisabled =\n disabledAsBool || currentNumericValue >= maxValue;\n\n return (\n \n {loadingProps => (\n \n \n {isNumberInput && (\n handleStepperClick('decrement')}\n disabled={isDecrementDisabled}\n aria-controls={props.id || inputId}\n aria-label=\"Decrease value\"\n >\n −\n \n )}\n {isNumberInput && (\n handleStepperClick('increment')}\n disabled={isIncrementDisabled}\n aria-controls={props.id || inputId}\n aria-label=\"Increase value\"\n >\n +\n \n )}\n
\n )}\n \n );\n}\n\nInput.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n\nexport default Input;\n","import React, {ButtonHTMLAttributes, DetailedHTMLProps} from 'react';\nimport {BaseDashProps, DashComponent} from '@dash-renderer/types';\n\nexport enum PersistenceTypes {\n 'local' = 'local',\n 'session' = 'session',\n 'memory' = 'memory',\n}\n\nexport enum PersistedProps {\n 'value' = 'value',\n 'date' = 'date',\n 'start_date' = 'start_date',\n 'end_date' = 'end_date',\n}\n\nexport interface BaseDccProps\n extends Pick {\n /**\n * Additional CSS class for the root DOM node\n */\n className?: string;\n\n /**\n * Dash-assigned callback that gets fired when component properties change\n */\n setProps: (props: Partial) => void;\n\n /**\n * Used to allow user interactions in this component to be persisted when\n * the component - or the page - is refreshed. If `persisted` is truthy and\n * hasn't changed from its previous value, a `value` that the user has\n * changed while using the app will keep that change, as long as\n * the new `value` also matches what was given originally.\n * Used in conjunction with `persistence_type`.\n */\n persistence?: boolean | string | number;\n\n /**\n * Properties whose user interactions will persist after refreshing the\n * component or the page. Since only `value` is allowed this prop can\n * normally be ignored.\n */\n persisted_props?: PersistedProps[];\n\n /**\n * Where persisted user changes will be stored:\n * memory: only kept in memory, reset on page refresh.\n * local: window.localStorage, data is kept after the browser quit.\n * session: window.sessionStorage, data is cleared once the browser quit.\n */\n persistence_type?: PersistenceTypes;\n}\n\nexport type ButtonProps = BaseDccProps & {\n /**\n * The children of this component.\n */\n children?: React.ReactNode;\n /**\n * Defines the type of the element.\n */\n type?: 'submit' | 'reset' | 'button';\n /**\n * The element should be automatically focused after the page loaded.\n */\n autoFocus?: boolean;\n /**\n * Indicates whether the user can interact with the element.\n */\n disabled?: boolean;\n /**\n * Indicates the form that is the owner of the element.\n */\n form?: string;\n /**\n * Indicates the action of the element, overriding the action defined in the
.\n */\n formAction?: string;\n /**\n * If the button/input is a submit button (type=\"submit\"), this attribute sets the encoding type to use during form submission. If this attribute is specified, it overrides the enctype attribute of the button's form owner.\n */\n formEncType?: string;\n /**\n * If the button/input is a submit button (type=\"submit\"), this attribute sets the submission method to use during form submission (GET, POST, etc.). If this attribute is specified, it overrides the method attribute of the button's form owner.\n */\n formMethod?: string;\n /**\n * If the button/input is a submit button (type=\"submit\"), this boolean attribute specifies that the form is not to be validated when it is submitted. If this attribute is specified, it overrides the novalidate attribute of the button's form owner.\n */\n formNoValidate?: boolean;\n /**\n * If the button/input is a submit button (type=\"submit\"), this attribute specifies the browsing context (for example, tab, window, or inline frame) in which to display the response that is received after submitting the form. If this attribute is specified, it overrides the target attribute of the button's form owner.\n */\n formTarget?: string;\n /**\n * Name of the element. For example used by the server to identify the fields in form submits.\n */\n name?: string;\n /**\n * Defines a default value which will be displayed in the element on page load.\n */\n value?: string | string[] | number;\n /**\n * Keyboard shortcut to activate or add focus to the element.\n */\n accessKey?: string;\n /**\n * Indicates whether the element's content is editable.\n */\n contentEditable?: boolean | 'true' | 'false' | 'inherit';\n /**\n * Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left).\n */\n dir?: string;\n /**\n * Defines whether the element can be dragged.\n */\n draggable?: boolean;\n /**\n * Prevents rendering of given element, while keeping child elements, e.g. script elements, active.\n */\n hidden?: boolean;\n /**\n * Defines the language used in the element.\n */\n lang?: string;\n /**\n * Defines the role of an element in the context of accessibility.\n */\n role?: string;\n /**\n * Indicates whether spell checking is allowed for the element.\n */\n spellCheck?: boolean;\n /**\n * Defines CSS styles which will override styles previously set.\n */\n style?: React.CSSProperties;\n /**\n * Overrides the browser's default tab order and follows the one specified instead.\n */\n tabIndex?: number;\n /**\n * Text to be displayed in a tooltip when hovering over the element.\n */\n title?: string;\n /**\n * Number of times the button lost focus.\n */\n n_blur?: number;\n /**\n * Last time the button lost focus.\n */\n n_blur_timestamp?: number;\n /**\n * Number of times the button has been clicked.\n */\n n_clicks?: number;\n /**\n * Last time the button was clicked.\n */\n n_clicks_timestamp?: number;\n};\n\nexport enum HTMLInputTypes {\n // Only allowing the input types with wide browser compatibility\n 'text' = 'text',\n 'number' = 'number',\n 'password' = 'password',\n 'email' = 'email',\n 'range' = 'range',\n 'search' = 'search',\n 'tel' = 'tel',\n 'url' = 'url',\n 'hidden' = 'hidden',\n}\n\nexport interface InputProps extends BaseDccProps {\n /**\n * The value of the input\n */\n value?: string | number;\n /**\n * The type of control to render.\n */\n type?: HTMLInputTypes;\n /**\n * If true, changes to input will be sent back to the Dash server only on enter or when losing focus.\n * If it's false, it will send the value back on every change.\n * If a number, it will not send anything back to the Dash server until the user has stopped\n * typing for that number of seconds.\n */\n debounce?: boolean | number;\n /**\n * A hint to the user of what can be entered in the control . The placeholder text must not contain carriage returns or line-feeds. Note: Do not use the placeholder attribute instead of a
\n );\n }\n\n return (\n \n \n String(data.options[index]?.value ?? index)\n }\n >\n {Row}\n \n {sizerDiv && (\n
\n {sizerDiv}\n
\n )}\n
\n );\n }\n);\n\nOptionsList.displayName = 'OptionsList';\n","import React from 'react';\nimport {DetailedOption, DropdownProps, OptionValue} from '../types';\n\nconst isOptionValue = (option: unknown): option is OptionValue => {\n return ['string', 'number', 'boolean'].includes(typeof option);\n};\n\nexport interface SanitizedResult {\n options: DetailedOption[];\n valueSet: Set;\n}\n\nexport const sanitizeOptions = (\n options: DropdownProps['options']\n): SanitizedResult => {\n const valueSet = new Set();\n let result: DetailedOption[];\n\n if (typeof options === 'object' && !(options instanceof Array)) {\n result = Object.entries(options).map(([value, label]) => {\n const opt = {\n label: React.isValidElement(label) ? label : String(label),\n value,\n };\n valueSet.add(value);\n return opt;\n });\n } else if (options instanceof Array) {\n result = options.map(option => {\n const opt = isOptionValue(option)\n ? {label: String(option), value: option}\n : option;\n valueSet.add(opt.value);\n return opt;\n });\n } else {\n result = [];\n }\n\n return {options: result, valueSet};\n};\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","'use strict';\n\nvar bind = require('function-bind');\n\nvar $apply = require('./functionApply');\nvar $call = require('./functionCall');\nvar $reflectApply = require('./reflectApply');\n\n/** @type {import('./actualApply')} */\nmodule.exports = $reflectApply || bind.call($call, $apply);\n","'use strict';\n\nvar bind = require('function-bind');\nvar $apply = require('./functionApply');\nvar actualApply = require('./actualApply');\n\n/** @type {import('./applyBind')} */\nmodule.exports = function applyBind() {\n\treturn actualApply(bind, $apply, arguments);\n};\n","'use strict';\n\n/** @type {import('./functionApply')} */\nmodule.exports = Function.prototype.apply;\n","'use strict';\n\n/** @type {import('./functionCall')} */\nmodule.exports = Function.prototype.call;\n","'use strict';\n\nvar bind = require('function-bind');\nvar $TypeError = require('es-errors/type');\n\nvar $call = require('./functionCall');\nvar $actualApply = require('./actualApply');\n\n/** @type {(args: [Function, thisArg?: unknown, ...args: unknown[]]) => Function} TODO FIXME, find a way to use import('.') */\nmodule.exports = function callBindBasic(args) {\n\tif (args.length < 1 || typeof args[0] !== 'function') {\n\t\tthrow new $TypeError('a function is required');\n\t}\n\treturn $actualApply(bind, $call, args);\n};\n","'use strict';\n\n/** @type {import('./reflectApply')} */\nmodule.exports = typeof Reflect !== 'undefined' && Reflect && Reflect.apply;\n","'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\n\nvar callBind = require('./');\n\nvar $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));\n\nmodule.exports = function callBoundIntrinsic(name, allowMissing) {\n\tvar intrinsic = GetIntrinsic(name, !!allowMissing);\n\tif (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {\n\t\treturn callBind(intrinsic);\n\t}\n\treturn intrinsic;\n};\n","'use strict';\n\nvar setFunctionLength = require('set-function-length');\n\nvar $defineProperty = require('es-define-property');\n\nvar callBindBasic = require('call-bind-apply-helpers');\nvar applyBind = require('call-bind-apply-helpers/applyBind');\n\nmodule.exports = function callBind(originalFunction) {\n\tvar func = callBindBasic(arguments);\n\tvar adjustedLength = originalFunction.length - (arguments.length - 1);\n\treturn setFunctionLength(\n\t\tfunc,\n\t\t1 + (adjustedLength > 0 ? adjustedLength : 0),\n\t\ttrue\n\t);\n};\n\nif ($defineProperty) {\n\t$defineProperty(module.exports, 'apply', { value: applyBind });\n} else {\n\tmodule.exports.apply = applyBind;\n}\n","'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\n\nvar callBindBasic = require('call-bind-apply-helpers');\n\n/** @type {(thisArg: string, searchString: string, position?: number) => number} */\nvar $indexOf = callBindBasic([GetIntrinsic('%String.prototype.indexOf%')]);\n\n/** @type {import('.')} */\nmodule.exports = function callBoundIntrinsic(name, allowMissing) {\n\t/* eslint no-extra-parens: 0 */\n\n\tvar intrinsic = /** @type {(this: unknown, ...args: unknown[]) => unknown} */ (GetIntrinsic(name, !!allowMissing));\n\tif (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {\n\t\treturn callBindBasic(/** @type {const} */ ([intrinsic]));\n\t}\n\treturn intrinsic;\n};\n","/*global window, global*/\nvar util = require(\"util\")\nvar assert = require(\"assert\")\nfunction now() { return new Date().getTime() }\n\nvar slice = Array.prototype.slice\nvar console\nvar times = {}\n\nif (typeof global !== \"undefined\" && global.console) {\n console = global.console\n} else if (typeof window !== \"undefined\" && window.console) {\n console = window.console\n} else {\n console = {}\n}\n\nvar functions = [\n [log, \"log\"],\n [info, \"info\"],\n [warn, \"warn\"],\n [error, \"error\"],\n [time, \"time\"],\n [timeEnd, \"timeEnd\"],\n [trace, \"trace\"],\n [dir, \"dir\"],\n [consoleAssert, \"assert\"]\n]\n\nfor (var i = 0; i < functions.length; i++) {\n var tuple = functions[i]\n var f = tuple[0]\n var name = tuple[1]\n\n if (!console[name]) {\n console[name] = f\n }\n}\n\nmodule.exports = console\n\nfunction log() {}\n\nfunction info() {\n console.log.apply(console, arguments)\n}\n\nfunction warn() {\n console.log.apply(console, arguments)\n}\n\nfunction error() {\n console.warn.apply(console, arguments)\n}\n\nfunction time(label) {\n times[label] = now()\n}\n\nfunction timeEnd(label) {\n var time = times[label]\n if (!time) {\n throw new Error(\"No such label: \" + label)\n }\n\n delete times[label]\n var duration = now() - time\n console.log(label + \": \" + duration + \"ms\")\n}\n\nfunction trace() {\n var err = new Error()\n err.name = \"Trace\"\n err.message = util.format.apply(null, arguments)\n console.error(err.stack)\n}\n\nfunction dir(object) {\n console.log(util.inspect(object) + \"\\n\")\n}\n\nfunction consoleAssert(expression) {\n if (!expression) {\n var arr = slice.call(arguments, 1)\n assert.ok(false, util.format.apply(null, arr))\n }\n}\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".dash-button {\\n line-height: 32px;\\n background: var(--Dash-Fill-Interactive-Weak);\\n color: var(--Dash-Fill-Interactive-Strong);\\n padding: 0 calc(var(--Dash-Spacing) * 2);\\n border-radius: 4px;\\n border: 1px solid var(--Dash-Fill-Interactive-Strong);\\n box-sizing: border-box;\\n vertical-align: middle;\\n font-family: inherit;\\n font-size: inherit;\\n}\\n\\n/* Hover state - stronger background */\\n.dash-button:hover {\\n cursor: pointer;\\n background: var(--Dash-Fill-Inverse-Strong);\\n color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n/* Active state (clicking) - inverted colors */\\n.dash-button:active {\\n background: var(--Dash-Fill-Interactive-Strong);\\n color: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n/* Keyboard focus - inverted colors */\\n.dash-button:focus-visible {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n/* Hover after keyboard focus - keep inverted but acknowledge hover */\\n.dash-button:focus-visible:hover {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n/* Active state after keyboard focus - inverted colors */\\n.dash-button:focus-visible:active {\\n background: var(--Dash-Fill-Interactive-Strong);\\n color: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n/* Disabled state */\\n.dash-button:disabled {\\n opacity: 0.6;\\n cursor: not-allowed;\\n background: var(--Dash-Fill-Disabled);\\n color: var(--Dash-Text-Strong);\\n border-color: var(--Dash-Stroke-Weak);\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/button.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,iBAAiB;IACjB,6CAA6C;IAC7C,0CAA0C;IAC1C,wCAAwC;IACxC,kBAAkB;IAClB,qDAAqD;IACrD,sBAAsB;IACtB,sBAAsB;IACtB,oBAAoB;IACpB,kBAAkB;AACtB;;AAEA,sCAAsC;AACtC;IACI,eAAe;IACf,2CAA2C;IAC3C,0CAA0C;AAC9C;;AAEA,8CAA8C;AAC9C;IACI,+CAA+C;IAC/C,sCAAsC;AAC1C;;AAEA,qCAAqC;AACrC;IACI,sDAAsD;AAC1D;;AAEA,qEAAqE;AACrE;IACI,sDAAsD;AAC1D;;AAEA,wDAAwD;AACxD;IACI,+CAA+C;IAC/C,sCAAsC;AAC1C;;AAEA,mBAAmB;AACnB;IACI,YAAY;IACZ,mBAAmB;IACnB,qCAAqC;IACrC,8BAA8B;IAC9B,qCAAqC;AACzC\",\"sourcesContent\":[\".dash-button {\\n line-height: 32px;\\n background: var(--Dash-Fill-Interactive-Weak);\\n color: var(--Dash-Fill-Interactive-Strong);\\n padding: 0 calc(var(--Dash-Spacing) * 2);\\n border-radius: 4px;\\n border: 1px solid var(--Dash-Fill-Interactive-Strong);\\n box-sizing: border-box;\\n vertical-align: middle;\\n font-family: inherit;\\n font-size: inherit;\\n}\\n\\n/* Hover state - stronger background */\\n.dash-button:hover {\\n cursor: pointer;\\n background: var(--Dash-Fill-Inverse-Strong);\\n color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n/* Active state (clicking) - inverted colors */\\n.dash-button:active {\\n background: var(--Dash-Fill-Interactive-Strong);\\n color: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n/* Keyboard focus - inverted colors */\\n.dash-button:focus-visible {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n/* Hover after keyboard focus - keep inverted but acknowledge hover */\\n.dash-button:focus-visible:hover {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n/* Active state after keyboard focus - inverted colors */\\n.dash-button:focus-visible:active {\\n background: var(--Dash-Fill-Interactive-Strong);\\n color: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n/* Disabled state */\\n.dash-button:disabled {\\n opacity: 0.6;\\n cursor: not-allowed;\\n background: var(--Dash-Fill-Disabled);\\n color: var(--Dash-Text-Strong);\\n border-color: var(--Dash-Stroke-Weak);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".dash-options-list-option.dash-checklist-inline {\\n display: inline-flex;\\n margin-right: calc(var(--Dash-Spacing) * 4);\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/checklist.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,oBAAoB;IACpB,2CAA2C;AAC/C\",\"sourcesContent\":[\".dash-options-list-option.dash-checklist-inline {\\n display: inline-flex;\\n margin-right: calc(var(--Dash-Spacing) * 4);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root {\\n --Dash-Spacing: 4px;\\n --Dash-Stroke-Strong: rgba(0, 18, 77, 0.45);\\n --Dash-Stroke-Weak: rgba(0, 24, 102, 0.1);\\n --Dash-Fill-Interactive-Strong: #7f4bc4;\\n --Dash-Fill-Interactive-Weak: rgba(0, 30, 128, 0.04);\\n --Dash-Fill-Inverse-Strong: #fff;\\n --Dash-Text-Primary: rgba(0, 18, 77, 0.87);\\n --Dash-Text-Strong: rgba(0, 9, 38, 0.9);\\n --Dash-Text-Weak: rgba(0, 12, 51, 0.65);\\n --Dash-Text-Disabled: rgba(0, 21, 89, 0.6);\\n --Dash-Fill-Primary-Hover: rgba(0, 18, 77, 0.04);\\n --Dash-Fill-Primary-Active: rgba(0, 18, 77, 0.08);\\n --Dash-Fill-Disabled: rgba(0, 24, 102, 0.1);\\n --Dash-Shading-Strong: rgba(22, 23, 24, 0.35);\\n --Dash-Shading-Weak: rgba(22, 23, 24, 0.2);\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/dcc.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,mBAAmB;IACnB,2CAA2C;IAC3C,yCAAyC;IACzC,uCAAuC;IACvC,oDAAoD;IACpD,gCAAgC;IAChC,0CAA0C;IAC1C,uCAAuC;IACvC,uCAAuC;IACvC,0CAA0C;IAC1C,gDAAgD;IAChD,iDAAiD;IACjD,2CAA2C;IAC3C,6CAA6C;IAC7C,0CAA0C;AAC9C\",\"sourcesContent\":[\":root {\\n --Dash-Spacing: 4px;\\n --Dash-Stroke-Strong: rgba(0, 18, 77, 0.45);\\n --Dash-Stroke-Weak: rgba(0, 24, 102, 0.1);\\n --Dash-Fill-Interactive-Strong: #7f4bc4;\\n --Dash-Fill-Interactive-Weak: rgba(0, 30, 128, 0.04);\\n --Dash-Fill-Inverse-Strong: #fff;\\n --Dash-Text-Primary: rgba(0, 18, 77, 0.87);\\n --Dash-Text-Strong: rgba(0, 9, 38, 0.9);\\n --Dash-Text-Weak: rgba(0, 12, 51, 0.65);\\n --Dash-Text-Disabled: rgba(0, 21, 89, 0.6);\\n --Dash-Fill-Primary-Hover: rgba(0, 18, 77, 0.04);\\n --Dash-Fill-Primary-Active: rgba(0, 18, 77, 0.08);\\n --Dash-Fill-Disabled: rgba(0, 24, 102, 0.1);\\n --Dash-Shading-Strong: rgba(22, 23, 24, 0.35);\\n --Dash-Shading-Weak: rgba(22, 23, 24, 0.2);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* Input container styles */\\n.dash-input-container {\\n position: relative;\\n display: inline-flex;\\n align-items: center;\\n width: 100%;\\n height: 34px;\\n background: var(--Dash-Fill-Inverse-Strong);\\n border-radius: var(--Dash-Spacing);\\n border: 1px solid var(--Dash-Stroke-Strong);\\n box-sizing: border-box;\\n container-type: inline-size;\\n vertical-align: middle;\\n color: inherit;\\n overflow: hidden;\\n}\\n\\n.dash-input-container:focus-within {\\n border: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-input-container:has(:focus-visible) {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-input-container:has(.dash-input-element:disabled) {\\n opacity: 0.6;\\n cursor: not-allowed;\\n}\\n\\n.dash-input-container input:focus {\\n outline: none;\\n}\\n\\n.dash-input-container:has(input[type='range']) {\\n background: inherit;\\n}\\n\\n/* Input field styles */\\n.dash-input-element {\\n padding: var(--Dash-Spacing) calc(2 * var(--Dash-Spacing));\\n color: inherit;\\n background: inherit;\\n border: none;\\n border-radius: var(--Dash-Spacing);\\n flex: 1 1 0;\\n min-width: 0;\\n height: 100%;\\n box-sizing: border-box;\\n z-index: 1;\\n order: 2;\\n accent-color: var(--Dash-Fill-Interactive-Strong);\\n font-family: inherit;\\n font-size: inherit;\\n}\\n\\n.dash-input-element::selection,\\n.dash-input-element::-webkit-selection {\\n color: var(--Dash-Fill-Inverse-Strong);\\n background: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-input-element:disabled {\\n cursor: not-allowed;\\n}\\n\\n/* Hide native steppers for number inputs */\\n.dash-input-element[type='number'] {\\n -moz-appearance: textfield;\\n border-radius: 0;\\n}\\n\\n.dash-input-element[type='number']::-webkit-outer-spin-button,\\n.dash-input-element[type='number']::-webkit-inner-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n}\\n\\n/* Show native steppers when container is narrow and input is number type */\\n@container (max-width: 99px) {\\n .dash-input-element[type='number'] {\\n -moz-appearance: number-input;\\n }\\n\\n .dash-input-element[type='number']::-webkit-outer-spin-button,\\n .dash-input-element[type='number']::-webkit-inner-spin-button {\\n -webkit-appearance: inner-spin-button;\\n margin: 0;\\n }\\n}\\n\\n/* Stepper button base styles */\\n.dash-input-stepper {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 32px;\\n height: 100%;\\n border: none;\\n background: var(--Dash-Fill-Inverse-Strong);\\n cursor: pointer;\\n font-size: 16px;\\n font-weight: bold;\\n color: var(--Dash-Text-Primary);\\n}\\n\\n.dash-input-stepper:hover,\\n.dash-input-stepper:focus {\\n background: var(--Dash-Fill-Primary-Hover);\\n}\\n\\n.dash-input-stepper:active {\\n background: var(--Dash-Fill-Primary-Active);\\n}\\n\\n.dash-input-stepper:disabled {\\n background: var(--Dash-Fill-Inverse-Strong);\\n opacity: 0.5;\\n cursor: default;\\n}\\n\\n@container (max-width: 99px) {\\n .dash-input-stepper {\\n display: none;\\n }\\n}\\n\\n/* Decrement button specific styles */\\n.dash-input-stepper.dash-stepper-decrement {\\n border-right: 1px solid var(--Dash-Stroke-Weak);\\n border-radius: var(--Dash-Spacing) 0 0 var(--Dash-Spacing);\\n order: 1;\\n}\\n\\n/* Increment button specific styles */\\n.dash-input-stepper.dash-stepper-increment {\\n border-left: 1px solid var(--Dash-Stroke-Weak);\\n border-radius: 0 var(--Dash-Spacing) var(--Dash-Spacing) 0;\\n order: 3;\\n}\\n\\n/* Hidden input type */\\n.dash-input-container.dash-input-hidden {\\n display: none;\\n}\\n\\ninput.dash-input-element:invalid {\\n color: red;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/input.css\"],\"names\":[],\"mappings\":\"AAAA,2BAA2B;AAC3B;IACI,kBAAkB;IAClB,oBAAoB;IACpB,mBAAmB;IACnB,WAAW;IACX,YAAY;IACZ,2CAA2C;IAC3C,kCAAkC;IAClC,2CAA2C;IAC3C,sBAAsB;IACtB,2BAA2B;IAC3B,sBAAsB;IACtB,cAAc;IACd,gBAAgB;AACpB;;AAEA;IACI,qDAAqD;AACzD;;AAEA;IACI,sDAAsD;AAC1D;;AAEA;IACI,YAAY;IACZ,mBAAmB;AACvB;;AAEA;IACI,aAAa;AACjB;;AAEA;IACI,mBAAmB;AACvB;;AAEA,uBAAuB;AACvB;IACI,0DAA0D;IAC1D,cAAc;IACd,mBAAmB;IACnB,YAAY;IACZ,kCAAkC;IAClC,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,sBAAsB;IACtB,UAAU;IACV,QAAQ;IACR,iDAAiD;IACjD,oBAAoB;IACpB,kBAAkB;AACtB;;AAEA;;IAEI,sCAAsC;IACtC,+CAA+C;AACnD;;AAEA;IACI,mBAAmB;AACvB;;AAEA,2CAA2C;AAC3C;IACI,0BAA0B;IAC1B,gBAAgB;AACpB;;AAEA;;IAEI,wBAAwB;IACxB,SAAS;AACb;;AAEA,2EAA2E;AAC3E;IACI;QACI,6BAA6B;IACjC;;IAEA;;QAEI,qCAAqC;QACrC,SAAS;IACb;AACJ;;AAEA,+BAA+B;AAC/B;IACI,aAAa;IACb,mBAAmB;IACnB,uBAAuB;IACvB,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,2CAA2C;IAC3C,eAAe;IACf,eAAe;IACf,iBAAiB;IACjB,+BAA+B;AACnC;;AAEA;;IAEI,0CAA0C;AAC9C;;AAEA;IACI,2CAA2C;AAC/C;;AAEA;IACI,2CAA2C;IAC3C,YAAY;IACZ,eAAe;AACnB;;AAEA;IACI;QACI,aAAa;IACjB;AACJ;;AAEA,qCAAqC;AACrC;IACI,+CAA+C;IAC/C,0DAA0D;IAC1D,QAAQ;AACZ;;AAEA,qCAAqC;AACrC;IACI,8CAA8C;IAC9C,0DAA0D;IAC1D,QAAQ;AACZ;;AAEA,sBAAsB;AACtB;IACI,aAAa;AACjB;;AAEA;IACI,UAAU;AACd\",\"sourcesContent\":[\"/* Input container styles */\\n.dash-input-container {\\n position: relative;\\n display: inline-flex;\\n align-items: center;\\n width: 100%;\\n height: 34px;\\n background: var(--Dash-Fill-Inverse-Strong);\\n border-radius: var(--Dash-Spacing);\\n border: 1px solid var(--Dash-Stroke-Strong);\\n box-sizing: border-box;\\n container-type: inline-size;\\n vertical-align: middle;\\n color: inherit;\\n overflow: hidden;\\n}\\n\\n.dash-input-container:focus-within {\\n border: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-input-container:has(:focus-visible) {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-input-container:has(.dash-input-element:disabled) {\\n opacity: 0.6;\\n cursor: not-allowed;\\n}\\n\\n.dash-input-container input:focus {\\n outline: none;\\n}\\n\\n.dash-input-container:has(input[type='range']) {\\n background: inherit;\\n}\\n\\n/* Input field styles */\\n.dash-input-element {\\n padding: var(--Dash-Spacing) calc(2 * var(--Dash-Spacing));\\n color: inherit;\\n background: inherit;\\n border: none;\\n border-radius: var(--Dash-Spacing);\\n flex: 1 1 0;\\n min-width: 0;\\n height: 100%;\\n box-sizing: border-box;\\n z-index: 1;\\n order: 2;\\n accent-color: var(--Dash-Fill-Interactive-Strong);\\n font-family: inherit;\\n font-size: inherit;\\n}\\n\\n.dash-input-element::selection,\\n.dash-input-element::-webkit-selection {\\n color: var(--Dash-Fill-Inverse-Strong);\\n background: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-input-element:disabled {\\n cursor: not-allowed;\\n}\\n\\n/* Hide native steppers for number inputs */\\n.dash-input-element[type='number'] {\\n -moz-appearance: textfield;\\n border-radius: 0;\\n}\\n\\n.dash-input-element[type='number']::-webkit-outer-spin-button,\\n.dash-input-element[type='number']::-webkit-inner-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n}\\n\\n/* Show native steppers when container is narrow and input is number type */\\n@container (max-width: 99px) {\\n .dash-input-element[type='number'] {\\n -moz-appearance: number-input;\\n }\\n\\n .dash-input-element[type='number']::-webkit-outer-spin-button,\\n .dash-input-element[type='number']::-webkit-inner-spin-button {\\n -webkit-appearance: inner-spin-button;\\n margin: 0;\\n }\\n}\\n\\n/* Stepper button base styles */\\n.dash-input-stepper {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 32px;\\n height: 100%;\\n border: none;\\n background: var(--Dash-Fill-Inverse-Strong);\\n cursor: pointer;\\n font-size: 16px;\\n font-weight: bold;\\n color: var(--Dash-Text-Primary);\\n}\\n\\n.dash-input-stepper:hover,\\n.dash-input-stepper:focus {\\n background: var(--Dash-Fill-Primary-Hover);\\n}\\n\\n.dash-input-stepper:active {\\n background: var(--Dash-Fill-Primary-Active);\\n}\\n\\n.dash-input-stepper:disabled {\\n background: var(--Dash-Fill-Inverse-Strong);\\n opacity: 0.5;\\n cursor: default;\\n}\\n\\n@container (max-width: 99px) {\\n .dash-input-stepper {\\n display: none;\\n }\\n}\\n\\n/* Decrement button specific styles */\\n.dash-input-stepper.dash-stepper-decrement {\\n border-right: 1px solid var(--Dash-Stroke-Weak);\\n border-radius: var(--Dash-Spacing) 0 0 var(--Dash-Spacing);\\n order: 1;\\n}\\n\\n/* Increment button specific styles */\\n.dash-input-stepper.dash-stepper-increment {\\n border-left: 1px solid var(--Dash-Stroke-Weak);\\n border-radius: 0 var(--Dash-Spacing) var(--Dash-Spacing) 0;\\n order: 3;\\n}\\n\\n/* Hidden input type */\\n.dash-input-container.dash-input-hidden {\\n display: none;\\n}\\n\\ninput.dash-input-element:invalid {\\n color: red;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".dash-options-list-option {\\n padding: var(--Dash-Spacing) 0;\\n background: var(--Dash-Fill-Inverse-strong);\\n color: var(--Dash-Text-Strong);\\n cursor: pointer;\\n display: flex;\\n align-items: baseline;\\n user-select: none;\\n}\\n\\n.dash-options-list-option:not(:has(input[disabled])):hover,\\n.dash-options-list-option:not(:has(input[disabled])):focus-within {\\n color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-options-list-option:has(input[disabled]) {\\n color: var(--Dash-Text-Disabled);\\n cursor: not-allowed;\\n}\\n\\n.dash-options-list-option-wrapper,\\n.dash-options-list-option-text {\\n display: flex;\\n align-items: center;\\n}\\n\\n.dash-options-list-option-checkbox {\\n display: inline-block;\\n margin: 0 calc(var(--Dash-Spacing) * 2) 0 0;\\n box-sizing: border-box;\\n border: 1px solid var(--Dash-Stroke-Strong);\\n accent-color: var(--Dash-Fill-Interactive-Strong);\\n outline-color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/optionslist.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,8BAA8B;IAC9B,2CAA2C;IAC3C,8BAA8B;IAC9B,eAAe;IACf,aAAa;IACb,qBAAqB;IACrB,iBAAiB;AACrB;;AAEA;;IAEI,0CAA0C;AAC9C;;AAEA;IACI,gCAAgC;IAChC,mBAAmB;AACvB;;AAEA;;IAEI,aAAa;IACb,mBAAmB;AACvB;;AAEA;IACI,qBAAqB;IACrB,2CAA2C;IAC3C,sBAAsB;IACtB,2CAA2C;IAC3C,iDAAiD;IACjD,kDAAkD;AACtD\",\"sourcesContent\":[\".dash-options-list-option {\\n padding: var(--Dash-Spacing) 0;\\n background: var(--Dash-Fill-Inverse-strong);\\n color: var(--Dash-Text-Strong);\\n cursor: pointer;\\n display: flex;\\n align-items: baseline;\\n user-select: none;\\n}\\n\\n.dash-options-list-option:not(:has(input[disabled])):hover,\\n.dash-options-list-option:not(:has(input[disabled])):focus-within {\\n color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-options-list-option:has(input[disabled]) {\\n color: var(--Dash-Text-Disabled);\\n cursor: not-allowed;\\n}\\n\\n.dash-options-list-option-wrapper,\\n.dash-options-list-option-text {\\n display: flex;\\n align-items: center;\\n}\\n\\n.dash-options-list-option-checkbox {\\n display: inline-block;\\n margin: 0 calc(var(--Dash-Spacing) * 2) 0 0;\\n box-sizing: border-box;\\n border: 1px solid var(--Dash-Stroke-Strong);\\n accent-color: var(--Dash-Fill-Interactive-Strong);\\n outline-color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".dash-options-list-option.dash-radioitems-inline {\\n display: inline-flex;\\n margin-right: calc(var(--Dash-Spacing) * 4);\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/radioitems.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,oBAAoB;IACpB,2CAA2C;AAC/C\",\"sourcesContent\":[\".dash-options-list-option.dash-radioitems-inline {\\n display: inline-flex;\\n margin-right: calc(var(--Dash-Spacing) * 4);\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".dash-slider-root {\\n position: relative;\\n z-index: 0;\\n display: flex;\\n align-items: center;\\n user-select: none;\\n touch-action: none;\\n width: 100%;\\n height: 14px;\\n padding: 17px 0 17px 0;\\n box-sizing: border-box;\\n /* Override Radix's default margin/padding behavior */\\n --radix-slider-thumb-width: 16px;\\n}\\n\\n.dash-slider-root.has-marks {\\n padding: 6px 0 28px 0;\\n}\\n\\n.dash-slider-root[data-orientation='vertical'].has-marks {\\n padding-bottom: 0px;\\n}\\n\\n.dash-slider-root[data-orientation='vertical'] {\\n flex-direction: column;\\n width: 20px;\\n height: 100%;\\n}\\n\\n.dash-slider-track {\\n position: relative;\\n flex-grow: 1;\\n border-radius: 9999px;\\n height: 4px;\\n background-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-root[data-orientation='vertical'] .dash-slider-track {\\n width: 4px;\\n height: auto;\\n overflow-y: hidden;\\n}\\n\\n.dash-slider-range {\\n position: absolute;\\n border-radius: 9999px;\\n height: 100%;\\n background-color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-slider-root[data-orientation='vertical'] .dash-slider-range {\\n width: 100%;\\n height: auto;\\n}\\n\\n.dash-slider-thumb {\\n position: relative;\\n z-index: 1;\\n display: block;\\n width: 16px;\\n height: 16px;\\n background-color: var(--Dash-Fill-Interactive-Strong);\\n border: 2px solid var(--Dash-Fill-Inverse-Strong);\\n border-radius: 50%;\\n box-shadow: 0 1px 3px 0 var(--Dash-Shading-Weak);\\n cursor: pointer;\\n outline: none;\\n transition: all 0.15s ease-in-out;\\n}\\n\\n.dash-slider-thumb:focus,\\n.dash-slider-thumb:hover {\\n transform: scale(1.125); /* Scale to make 16px thumb appear as 18px */\\n box-shadow: 0 4px 6px -1px var(--Dash-Shading-Weak);\\n}\\n\\n.dash-slider-thumb:focus {\\n outline: 2px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-slider-thumb:focus .dash-slider-tooltip,\\n.dash-slider-thumb:hover .dash-slider-tooltip {\\n display: block;\\n}\\n\\n.dash-slider-thumb[data-disabled],\\n.dash-range-slider-input:disabled {\\n cursor: not-allowed;\\n opacity: 0.5;\\n}\\n\\n.dash-slider-mark {\\n position: absolute;\\n font-size: 12px;\\n height: 12px;\\n line-height: 12px;\\n color: var(--Dash-Text-Strong);\\n white-space: nowrap;\\n pointer-events: none;\\n}\\n\\n.dash-slider-mark-outside-selection {\\n color: var(--Dash-Text-Disabled);\\n}\\n\\n.dash-slider-mark:before {\\n content: '';\\n position: absolute;\\n bottom: 100%;\\n left: 50%;\\n transform: translateX(-50%);\\n background-color: var(--Dash-Fill-Disabled);\\n width: 4px;\\n height: 6px;\\n border-radius: 2px;\\n margin-bottom: 2px;\\n}\\n.dash-slider-mark.with-dots:before {\\n content: initial;\\n}\\n\\n.dash-slider-root[data-orientation='vertical'] .dash-slider-mark:before {\\n content: initial;\\n}\\n\\n.dash-slider-dot {\\n pointer-events: none;\\n position: absolute;\\n width: 8px;\\n height: 8px;\\n border-radius: 50%;\\n background-color: var(--Dash-Fill-Primary-Active);\\n}\\n\\n.dash-slider-dot-outside-selection {\\n background-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-tooltip {\\n display: none;\\n position: absolute;\\n border-radius: var(--Dash-Spacing);\\n padding: calc(var(--Dash-Spacing) * 3);\\n font-size: 12px;\\n line-height: 1;\\n box-shadow: 0 0 8px var(--Dash-Shading-Strong);\\n background-color: var(--Dash-Fill-Inverse-Strong);\\n user-select: none;\\n z-index: 1000;\\n fill: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n.dash-slider-tooltip.always-visible {\\n display: block;\\n}\\n\\n/* Include property to mimic rc-slider behavior */\\n.dash-slider-root:not([data-included='false']) .dash-slider-range {\\n background-color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-slider-root[data-included='false'] .dash-slider-range {\\n background-color: transparent;\\n}\\n\\n/* Disabled state */\\n.dash-slider-root[data-disabled] {\\n opacity: 0.5;\\n cursor: not-allowed;\\n}\\n\\n.dash-slider-root[data-disabled] .dash-slider-track {\\n background-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-root[data-disabled] .dash-slider-range {\\n background-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-root[data-disabled] .dash-slider-thumb {\\n cursor: not-allowed;\\n border-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-container {\\n display: flex;\\n align-items: center;\\n gap: 16px;\\n width: 100%;\\n container-type: inline-size;\\n}\\n\\n.dash-slider-wrapper {\\n flex: 1;\\n min-width: 0;\\n}\\n\\n.dash-range-slider-inputs {\\n display: flex;\\n flex-direction: column;\\n gap: 4px;\\n min-width: 64px;\\n}\\n\\n.dash-range-slider-min-input {\\n text-align: center;\\n}\\n\\n.dash-range-slider-max-input {\\n order: 1;\\n}\\n\\n.dash-range-slider-input {\\n min-width: 5cqw; /* 5% of container width */\\n max-width: 25cqw; /* 25% of container width */\\n text-align: center;\\n -webkit-appearance: textfield;\\n -moz-appearance: textfield;\\n appearance: textfield;\\n font-family: inherit;\\n font-size: inherit;\\n box-sizing: content-box;\\n height: 30px;\\n}\\n\\n.dash-range-slider-input:only-of-type {\\n max-width: 33cqw;\\n}\\n\\n.dash-range-slider-input::selection,\\n.dash-range-slider-input::-webkit-selection {\\n color: var(--Dash-Fill-Inverse-Strong);\\n background: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-range-slider-input:focus {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n/* Hide the number input spinners */\\n.dash-range-slider-input::-webkit-inner-spin-button,\\n.dash-range-slider-input::-webkit-outer-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n}\\n\\n/* Hide inputs on small containers using container queries */\\n/* single slider input */\\n@container (max-width: 200px) {\\n .dash-slider-container .dash-range-slider-input:only-of-type {\\n display: none;\\n }\\n}\\n\\n/* range slider inputs */\\n@container (max-width: 300px) {\\n .dash-slider-container .dash-range-slider-min-input,\\n .dash-slider-container .dash-range-slider-max-input {\\n display: none;\\n }\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/sliders.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\".dash-slider-root {\\n position: relative;\\n z-index: 0;\\n display: flex;\\n align-items: center;\\n user-select: none;\\n touch-action: none;\\n width: 100%;\\n height: 14px;\\n padding: 17px 0 17px 0;\\n box-sizing: border-box;\\n /* Override Radix's default margin/padding behavior */\\n --radix-slider-thumb-width: 16px;\\n}\\n\\n.dash-slider-root.has-marks {\\n padding: 6px 0 28px 0;\\n}\\n\\n.dash-slider-root[data-orientation='vertical'].has-marks {\\n padding-bottom: 0px;\\n}\\n\\n.dash-slider-root[data-orientation='vertical'] {\\n flex-direction: column;\\n width: 20px;\\n height: 100%;\\n}\\n\\n.dash-slider-track {\\n position: relative;\\n flex-grow: 1;\\n border-radius: 9999px;\\n height: 4px;\\n background-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-root[data-orientation='vertical'] .dash-slider-track {\\n width: 4px;\\n height: auto;\\n overflow-y: hidden;\\n}\\n\\n.dash-slider-range {\\n position: absolute;\\n border-radius: 9999px;\\n height: 100%;\\n background-color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-slider-root[data-orientation='vertical'] .dash-slider-range {\\n width: 100%;\\n height: auto;\\n}\\n\\n.dash-slider-thumb {\\n position: relative;\\n z-index: 1;\\n display: block;\\n width: 16px;\\n height: 16px;\\n background-color: var(--Dash-Fill-Interactive-Strong);\\n border: 2px solid var(--Dash-Fill-Inverse-Strong);\\n border-radius: 50%;\\n box-shadow: 0 1px 3px 0 var(--Dash-Shading-Weak);\\n cursor: pointer;\\n outline: none;\\n transition: all 0.15s ease-in-out;\\n}\\n\\n.dash-slider-thumb:focus,\\n.dash-slider-thumb:hover {\\n transform: scale(1.125); /* Scale to make 16px thumb appear as 18px */\\n box-shadow: 0 4px 6px -1px var(--Dash-Shading-Weak);\\n}\\n\\n.dash-slider-thumb:focus {\\n outline: 2px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-slider-thumb:focus .dash-slider-tooltip,\\n.dash-slider-thumb:hover .dash-slider-tooltip {\\n display: block;\\n}\\n\\n.dash-slider-thumb[data-disabled],\\n.dash-range-slider-input:disabled {\\n cursor: not-allowed;\\n opacity: 0.5;\\n}\\n\\n.dash-slider-mark {\\n position: absolute;\\n font-size: 12px;\\n height: 12px;\\n line-height: 12px;\\n color: var(--Dash-Text-Strong);\\n white-space: nowrap;\\n pointer-events: none;\\n}\\n\\n.dash-slider-mark-outside-selection {\\n color: var(--Dash-Text-Disabled);\\n}\\n\\n.dash-slider-mark:before {\\n content: '';\\n position: absolute;\\n bottom: 100%;\\n left: 50%;\\n transform: translateX(-50%);\\n background-color: var(--Dash-Fill-Disabled);\\n width: 4px;\\n height: 6px;\\n border-radius: 2px;\\n margin-bottom: 2px;\\n}\\n.dash-slider-mark.with-dots:before {\\n content: initial;\\n}\\n\\n.dash-slider-root[data-orientation='vertical'] .dash-slider-mark:before {\\n content: initial;\\n}\\n\\n.dash-slider-dot {\\n pointer-events: none;\\n position: absolute;\\n width: 8px;\\n height: 8px;\\n border-radius: 50%;\\n background-color: var(--Dash-Fill-Primary-Active);\\n}\\n\\n.dash-slider-dot-outside-selection {\\n background-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-tooltip {\\n display: none;\\n position: absolute;\\n border-radius: var(--Dash-Spacing);\\n padding: calc(var(--Dash-Spacing) * 3);\\n font-size: 12px;\\n line-height: 1;\\n box-shadow: 0 0 8px var(--Dash-Shading-Strong);\\n background-color: var(--Dash-Fill-Inverse-Strong);\\n user-select: none;\\n z-index: 1000;\\n fill: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n.dash-slider-tooltip.always-visible {\\n display: block;\\n}\\n\\n/* Include property to mimic rc-slider behavior */\\n.dash-slider-root:not([data-included='false']) .dash-slider-range {\\n background-color: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-slider-root[data-included='false'] .dash-slider-range {\\n background-color: transparent;\\n}\\n\\n/* Disabled state */\\n.dash-slider-root[data-disabled] {\\n opacity: 0.5;\\n cursor: not-allowed;\\n}\\n\\n.dash-slider-root[data-disabled] .dash-slider-track {\\n background-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-root[data-disabled] .dash-slider-range {\\n background-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-root[data-disabled] .dash-slider-thumb {\\n cursor: not-allowed;\\n border-color: var(--Dash-Fill-Disabled);\\n}\\n\\n.dash-slider-container {\\n display: flex;\\n align-items: center;\\n gap: 16px;\\n width: 100%;\\n container-type: inline-size;\\n}\\n\\n.dash-slider-wrapper {\\n flex: 1;\\n min-width: 0;\\n}\\n\\n.dash-range-slider-inputs {\\n display: flex;\\n flex-direction: column;\\n gap: 4px;\\n min-width: 64px;\\n}\\n\\n.dash-range-slider-min-input {\\n text-align: center;\\n}\\n\\n.dash-range-slider-max-input {\\n order: 1;\\n}\\n\\n.dash-range-slider-input {\\n min-width: 5cqw; /* 5% of container width */\\n max-width: 25cqw; /* 25% of container width */\\n text-align: center;\\n -webkit-appearance: textfield;\\n -moz-appearance: textfield;\\n appearance: textfield;\\n font-family: inherit;\\n font-size: inherit;\\n box-sizing: content-box;\\n height: 30px;\\n}\\n\\n.dash-range-slider-input:only-of-type {\\n max-width: 33cqw;\\n}\\n\\n.dash-range-slider-input::selection,\\n.dash-range-slider-input::-webkit-selection {\\n color: var(--Dash-Fill-Inverse-Strong);\\n background: var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-range-slider-input:focus {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n/* Hide the number input spinners */\\n.dash-range-slider-input::-webkit-inner-spin-button,\\n.dash-range-slider-input::-webkit-outer-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n}\\n\\n/* Hide inputs on small containers using container queries */\\n/* single slider input */\\n@container (max-width: 200px) {\\n .dash-slider-container .dash-range-slider-input:only-of-type {\\n display: none;\\n }\\n}\\n\\n/* range slider inputs */\\n@container (max-width: 300px) {\\n .dash-slider-container .dash-range-slider-min-input,\\n .dash-slider-container .dash-range-slider-max-input {\\n display: none;\\n }\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* Tab parent container */\\n.tab-parent {\\n display: flex;\\n flex-direction: column;\\n overflow: hidden;\\n}\\n\\n/* Tab container (holds all tabs) */\\n.tab-container {\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.tab-container--vert {\\n display: inline-flex;\\n}\\n\\n/* Individual tab */\\n.tab {\\n flex: 1 1 0;\\n min-width: 0;\\n background-color: var(--tabs-background);\\n border: 1px solid var(--tabs-border);\\n border-bottom: none;\\n padding: 20px 25px;\\n transition: background-color, color 200ms;\\n text-align: center;\\n box-sizing: border-box;\\n cursor: pointer;\\n}\\n\\n/* Tab selected state */\\n.tab--selected {\\n border-top: 2px solid var(--tabs-primary);\\n color: var(--Dash-Text-Primary);\\n background-color: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n.tab--selected:hover {\\n background-color: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n/* Tab disabled state */\\n.tab--disabled {\\n opacity: 0.6;\\n cursor: not-allowed;\\n}\\n\\n/* Tab content area */\\n.tab-content--vert {\\n display: inline-flex;\\n flex-direction: column;\\n}\\n\\n/* Desktop/tablet styles (when above breakpoint) */\\n.tab-parent--above-breakpoint .tab {\\n border: 1px solid var(--tabs-border);\\n border-right: none;\\n}\\n\\n.tab-parent--above-breakpoint .tab:last-child {\\n border-right: 1px solid var(--tabs-border);\\n border-bottom: 1px solid var(--tabs-border);\\n}\\n\\n.tab-parent--above-breakpoint .tab--selected,\\n.tab-parent--above-breakpoint .tab:last-child.tab--selected {\\n border-bottom: none;\\n}\\n\\n/* Vertical tabs: left border for selected */\\n.tab-parent--above-breakpoint .tab-container--vert .tab--selected {\\n border-left: 2px solid var(--tabs-primary);\\n}\\n\\n/* Horizontal tabs: top border for selected */\\n.tab-parent--above-breakpoint\\n .tab-container:not(.tab-container--vert)\\n .tab--selected,\\n.tab-parent--above-breakpoint\\n .tab-container:not(.tab-container--vert)\\n .tab:last-child.tab--selected {\\n border-top: 2px solid var(--tabs-primary);\\n}\\n\\n.tab-parent--above-breakpoint .tab-container--vert .tab {\\n width: auto;\\n border-right: none !important;\\n border-bottom: none !important;\\n}\\n\\n.tab-parent--above-breakpoint .tab-container--vert .tab:last-child {\\n border-bottom: 1px solid var(--tabs-border) !important;\\n}\\n\\n.tab-parent--above-breakpoint .tab-container--vert .tab--selected {\\n border-top: 1px solid var(--tabs-border);\\n border-left: 2px solid var(--tabs-primary);\\n border-right: none;\\n}\\n\\n.tab-parent--above-breakpoint .tab-container {\\n flex-direction: row;\\n}\\n\\n.tab-parent--above-breakpoint .tab-container--vert {\\n flex-direction: column;\\n}\\n\\n.tab-parent--above-breakpoint.tab-parent--vert {\\n display: inline-flex;\\n flex-direction: row;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/tabs.css\"],\"names\":[],\"mappings\":\"AAAA,yBAAyB;AACzB;IACI,aAAa;IACb,sBAAsB;IACtB,gBAAgB;AACpB;;AAEA,mCAAmC;AACnC;IACI,aAAa;IACb,sBAAsB;AAC1B;;AAEA;IACI,oBAAoB;AACxB;;AAEA,mBAAmB;AACnB;IACI,WAAW;IACX,YAAY;IACZ,wCAAwC;IACxC,oCAAoC;IACpC,mBAAmB;IACnB,kBAAkB;IAClB,yCAAyC;IACzC,kBAAkB;IAClB,sBAAsB;IACtB,eAAe;AACnB;;AAEA,uBAAuB;AACvB;IACI,yCAAyC;IACzC,+BAA+B;IAC/B,iDAAiD;AACrD;;AAEA;IACI,iDAAiD;AACrD;;AAEA,uBAAuB;AACvB;IACI,YAAY;IACZ,mBAAmB;AACvB;;AAEA,qBAAqB;AACrB;IACI,oBAAoB;IACpB,sBAAsB;AAC1B;;AAEA,kDAAkD;AAClD;IACI,oCAAoC;IACpC,kBAAkB;AACtB;;AAEA;IACI,0CAA0C;IAC1C,2CAA2C;AAC/C;;AAEA;;IAEI,mBAAmB;AACvB;;AAEA,4CAA4C;AAC5C;IACI,0CAA0C;AAC9C;;AAEA,6CAA6C;AAC7C;;;;;;IAMI,yCAAyC;AAC7C;;AAEA;IACI,WAAW;IACX,6BAA6B;IAC7B,8BAA8B;AAClC;;AAEA;IACI,sDAAsD;AAC1D;;AAEA;IACI,wCAAwC;IACxC,0CAA0C;IAC1C,kBAAkB;AACtB;;AAEA;IACI,mBAAmB;AACvB;;AAEA;IACI,sBAAsB;AAC1B;;AAEA;IACI,oBAAoB;IACpB,mBAAmB;AACvB\",\"sourcesContent\":[\"/* Tab parent container */\\n.tab-parent {\\n display: flex;\\n flex-direction: column;\\n overflow: hidden;\\n}\\n\\n/* Tab container (holds all tabs) */\\n.tab-container {\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.tab-container--vert {\\n display: inline-flex;\\n}\\n\\n/* Individual tab */\\n.tab {\\n flex: 1 1 0;\\n min-width: 0;\\n background-color: var(--tabs-background);\\n border: 1px solid var(--tabs-border);\\n border-bottom: none;\\n padding: 20px 25px;\\n transition: background-color, color 200ms;\\n text-align: center;\\n box-sizing: border-box;\\n cursor: pointer;\\n}\\n\\n/* Tab selected state */\\n.tab--selected {\\n border-top: 2px solid var(--tabs-primary);\\n color: var(--Dash-Text-Primary);\\n background-color: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n.tab--selected:hover {\\n background-color: var(--Dash-Fill-Inverse-Strong);\\n}\\n\\n/* Tab disabled state */\\n.tab--disabled {\\n opacity: 0.6;\\n cursor: not-allowed;\\n}\\n\\n/* Tab content area */\\n.tab-content--vert {\\n display: inline-flex;\\n flex-direction: column;\\n}\\n\\n/* Desktop/tablet styles (when above breakpoint) */\\n.tab-parent--above-breakpoint .tab {\\n border: 1px solid var(--tabs-border);\\n border-right: none;\\n}\\n\\n.tab-parent--above-breakpoint .tab:last-child {\\n border-right: 1px solid var(--tabs-border);\\n border-bottom: 1px solid var(--tabs-border);\\n}\\n\\n.tab-parent--above-breakpoint .tab--selected,\\n.tab-parent--above-breakpoint .tab:last-child.tab--selected {\\n border-bottom: none;\\n}\\n\\n/* Vertical tabs: left border for selected */\\n.tab-parent--above-breakpoint .tab-container--vert .tab--selected {\\n border-left: 2px solid var(--tabs-primary);\\n}\\n\\n/* Horizontal tabs: top border for selected */\\n.tab-parent--above-breakpoint\\n .tab-container:not(.tab-container--vert)\\n .tab--selected,\\n.tab-parent--above-breakpoint\\n .tab-container:not(.tab-container--vert)\\n .tab:last-child.tab--selected {\\n border-top: 2px solid var(--tabs-primary);\\n}\\n\\n.tab-parent--above-breakpoint .tab-container--vert .tab {\\n width: auto;\\n border-right: none !important;\\n border-bottom: none !important;\\n}\\n\\n.tab-parent--above-breakpoint .tab-container--vert .tab:last-child {\\n border-bottom: 1px solid var(--tabs-border) !important;\\n}\\n\\n.tab-parent--above-breakpoint .tab-container--vert .tab--selected {\\n border-top: 1px solid var(--tabs-border);\\n border-left: 2px solid var(--tabs-primary);\\n border-right: none;\\n}\\n\\n.tab-parent--above-breakpoint .tab-container {\\n flex-direction: row;\\n}\\n\\n.tab-parent--above-breakpoint .tab-container--vert {\\n flex-direction: column;\\n}\\n\\n.tab-parent--above-breakpoint.tab-parent--vert {\\n display: inline-flex;\\n flex-direction: row;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* Input container styles */\\n.dash-textarea {\\n background: var(--Dash-Fill-Inverse-Strong);\\n border-radius: var(--Dash-Spacing);\\n border: 1px solid var(--Dash-Stroke-Strong);\\n box-sizing: border-box;\\n color: inherit;\\n padding: var(--Dash-Spacing) calc(2 * var(--Dash-Spacing));\\n width: 100%;\\n accent-color: var(--Dash-Fill-Interactive-Strong);\\n outline-color: var(--Dash-Fill-Interactive-Strong);\\n font-family: inherit;\\n font-size: inherit;\\n}\\n\\n.dash-textarea:focus-within {\\n border: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-textarea:focus-visible {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-textarea:disabled {\\n opacity: 0.6;\\n cursor: not-allowed;\\n}\\n\\n.dash-textarea:invalid {\\n outline: solid red;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/textarea.css\"],\"names\":[],\"mappings\":\"AAAA,2BAA2B;AAC3B;IACI,2CAA2C;IAC3C,kCAAkC;IAClC,2CAA2C;IAC3C,sBAAsB;IACtB,cAAc;IACd,0DAA0D;IAC1D,WAAW;IACX,iDAAiD;IACjD,kDAAkD;IAClD,oBAAoB;IACpB,kBAAkB;AACtB;;AAEA;IACI,qDAAqD;AACzD;;AAEA;IACI,sDAAsD;AAC1D;;AAEA;IACI,YAAY;IACZ,mBAAmB;AACvB;;AAEA;IACI,kBAAkB;AACtB\",\"sourcesContent\":[\"/* Input container styles */\\n.dash-textarea {\\n background: var(--Dash-Fill-Inverse-Strong);\\n border-radius: var(--Dash-Spacing);\\n border: 1px solid var(--Dash-Stroke-Strong);\\n box-sizing: border-box;\\n color: inherit;\\n padding: var(--Dash-Spacing) calc(2 * var(--Dash-Spacing));\\n width: 100%;\\n accent-color: var(--Dash-Fill-Interactive-Strong);\\n outline-color: var(--Dash-Fill-Interactive-Strong);\\n font-family: inherit;\\n font-size: inherit;\\n}\\n\\n.dash-textarea:focus-within {\\n border: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-textarea:focus-visible {\\n outline: 1px solid var(--Dash-Fill-Interactive-Strong);\\n}\\n\\n.dash-textarea:disabled {\\n opacity: 0.6;\\n cursor: not-allowed;\\n}\\n\\n.dash-textarea:invalid {\\n outline: solid red;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".dash-tooltip {\\n position: absolute;\\n}\\n\\n.hover {\\n position: absolute;\\n}\\n.hover-right {\\n /* Offset so that the triangle caret lands directly on what's hovered */\\n transform: translate(5px, 0);\\n top: 50%;\\n left: 100%;\\n}\\n.hover-left {\\n transform: translate(-5px, 0);\\n top: 50%;\\n}\\n.hover-bottom {\\n transform: translate(0, 6px);\\n top: 100%;\\n left: 50%;\\n}\\n.hover-top {\\n transform: translate(0, -5px);\\n left: 50%;\\n}\\n.hover-content {\\n position: absolute;\\n border: 1px solid var(--Dash-Tooltip-Border-Color);\\n border-radius: 2px;\\n padding: 5px 10px;\\n background: var(--Dash-Tooltip-Background-Color);\\n white-space: nowrap;\\n z-index: var(--Dash-Tooltip-ZIndex);\\n pointer-events: var(--Dash-Tooltip-PointerEvents);\\n box-shadow: 0px 10px 38px -10px var(--Dash-Shading-Strong),\\n 0px 10px 20px -15px var(--Dash-Shading-Weak);\\n}\\n.hover .hover-content,\\n.hover-right .hover-content {\\n transform: translate(0, -50%);\\n}\\n.hover-left .hover-content {\\n transform: translate(-100%, -50%);\\n}\\n.hover-top .hover-content {\\n transform: translate(-50%, -100%);\\n}\\n.hover-bottom .hover-content {\\n transform: translate(-50%, 0);\\n}\\n/* Add a small triangle on the left side of the box */\\n.hover:before,\\n.hover:after {\\n content: '';\\n width: 0;\\n height: 0;\\n position: absolute;\\n border-style: solid;\\n top: -6px;\\n z-index: var(--Dash-Tooltip-ZIndex);\\n}\\n.hover:before,\\n.hover:after,\\n.hover-right:before,\\n.hover-right:after {\\n border-width: 6px 6px 6px 0;\\n}\\n.hover-top:before,\\n.hover-top:after {\\n border-width: 6px 6px 0 6px;\\n}\\n.hover-bottom:before,\\n.hover-bottom:after {\\n border-width: 0 6px 6px 6px;\\n}\\n.hover-left:before,\\n.hover-left:after {\\n border-width: 6px 0 6px 6px;\\n}\\n.hover:before,\\n.hover-right:before {\\n border-color: transparent var(--Dash-Tooltip-Border-Color) transparent\\n transparent;\\n left: -5px;\\n}\\n.hover:after,\\n.hover-right:after {\\n border-color: transparent var(--Dash-Tooltip-Background-Color) transparent\\n transparent;\\n left: -4px;\\n}\\n.hover-left:before {\\n border-color: transparent transparent transparent\\n var(--Dash-Tooltip-Border-Color);\\n left: -1px;\\n}\\n.hover-left:after {\\n border-color: transparent transparent transparent\\n var(--Dash-Tooltip-Background-Color);\\n left: -2px;\\n}\\n.hover-top:before,\\n.hover-top:after,\\n.hover-bottom:before,\\n.hover-bottom:after {\\n left: -6px;\\n}\\n.hover-bottom:before {\\n border-color: transparent transparent var(--Dash-Tooltip-Border-Color)\\n transparent;\\n}\\n.hover-bottom:after {\\n border-color: transparent transparent var(--Dash-Tooltip-Background-Color)\\n transparent;\\n top: -5px;\\n}\\n.hover-top:before {\\n border-color: var(--Dash-Tooltip-Border-Color) transparent transparent\\n transparent;\\n top: -1px;\\n}\\n.hover-top:after {\\n border-color: var(--Dash-Tooltip-Border-Color) transparent transparent\\n transparent;\\n top: -2px;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/css/tooltip.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,kBAAkB;AACtB;;AAEA;IACI,kBAAkB;AACtB;AACA;IACI,uEAAuE;IACvE,4BAA4B;IAC5B,QAAQ;IACR,UAAU;AACd;AACA;IACI,6BAA6B;IAC7B,QAAQ;AACZ;AACA;IACI,4BAA4B;IAC5B,SAAS;IACT,SAAS;AACb;AACA;IACI,6BAA6B;IAC7B,SAAS;AACb;AACA;IACI,kBAAkB;IAClB,kDAAkD;IAClD,kBAAkB;IAClB,iBAAiB;IACjB,gDAAgD;IAChD,mBAAmB;IACnB,mCAAmC;IACnC,iDAAiD;IACjD;oDACgD;AACpD;AACA;;IAEI,6BAA6B;AACjC;AACA;IACI,iCAAiC;AACrC;AACA;IACI,iCAAiC;AACrC;AACA;IACI,6BAA6B;AACjC;AACA,qDAAqD;AACrD;;IAEI,WAAW;IACX,QAAQ;IACR,SAAS;IACT,kBAAkB;IAClB,mBAAmB;IACnB,SAAS;IACT,mCAAmC;AACvC;AACA;;;;IAII,2BAA2B;AAC/B;AACA;;IAEI,2BAA2B;AAC/B;AACA;;IAEI,2BAA2B;AAC/B;AACA;;IAEI,2BAA2B;AAC/B;AACA;;IAEI;mBACe;IACf,UAAU;AACd;AACA;;IAEI;mBACe;IACf,UAAU;AACd;AACA;IACI;wCACoC;IACpC,UAAU;AACd;AACA;IACI;4CACwC;IACxC,UAAU;AACd;AACA;;;;IAII,UAAU;AACd;AACA;IACI;mBACe;AACnB;AACA;IACI;mBACe;IACf,SAAS;AACb;AACA;IACI;mBACe;IACf,SAAS;AACb;AACA;IACI;mBACe;IACf,SAAS;AACb\",\"sourcesContent\":[\".dash-tooltip {\\n position: absolute;\\n}\\n\\n.hover {\\n position: absolute;\\n}\\n.hover-right {\\n /* Offset so that the triangle caret lands directly on what's hovered */\\n transform: translate(5px, 0);\\n top: 50%;\\n left: 100%;\\n}\\n.hover-left {\\n transform: translate(-5px, 0);\\n top: 50%;\\n}\\n.hover-bottom {\\n transform: translate(0, 6px);\\n top: 100%;\\n left: 50%;\\n}\\n.hover-top {\\n transform: translate(0, -5px);\\n left: 50%;\\n}\\n.hover-content {\\n position: absolute;\\n border: 1px solid var(--Dash-Tooltip-Border-Color);\\n border-radius: 2px;\\n padding: 5px 10px;\\n background: var(--Dash-Tooltip-Background-Color);\\n white-space: nowrap;\\n z-index: var(--Dash-Tooltip-ZIndex);\\n pointer-events: var(--Dash-Tooltip-PointerEvents);\\n box-shadow: 0px 10px 38px -10px var(--Dash-Shading-Strong),\\n 0px 10px 20px -15px var(--Dash-Shading-Weak);\\n}\\n.hover .hover-content,\\n.hover-right .hover-content {\\n transform: translate(0, -50%);\\n}\\n.hover-left .hover-content {\\n transform: translate(-100%, -50%);\\n}\\n.hover-top .hover-content {\\n transform: translate(-50%, -100%);\\n}\\n.hover-bottom .hover-content {\\n transform: translate(-50%, 0);\\n}\\n/* Add a small triangle on the left side of the box */\\n.hover:before,\\n.hover:after {\\n content: '';\\n width: 0;\\n height: 0;\\n position: absolute;\\n border-style: solid;\\n top: -6px;\\n z-index: var(--Dash-Tooltip-ZIndex);\\n}\\n.hover:before,\\n.hover:after,\\n.hover-right:before,\\n.hover-right:after {\\n border-width: 6px 6px 6px 0;\\n}\\n.hover-top:before,\\n.hover-top:after {\\n border-width: 6px 6px 0 6px;\\n}\\n.hover-bottom:before,\\n.hover-bottom:after {\\n border-width: 0 6px 6px 6px;\\n}\\n.hover-left:before,\\n.hover-left:after {\\n border-width: 6px 0 6px 6px;\\n}\\n.hover:before,\\n.hover-right:before {\\n border-color: transparent var(--Dash-Tooltip-Border-Color) transparent\\n transparent;\\n left: -5px;\\n}\\n.hover:after,\\n.hover-right:after {\\n border-color: transparent var(--Dash-Tooltip-Background-Color) transparent\\n transparent;\\n left: -4px;\\n}\\n.hover-left:before {\\n border-color: transparent transparent transparent\\n var(--Dash-Tooltip-Border-Color);\\n left: -1px;\\n}\\n.hover-left:after {\\n border-color: transparent transparent transparent\\n var(--Dash-Tooltip-Background-Color);\\n left: -2px;\\n}\\n.hover-top:before,\\n.hover-top:after,\\n.hover-bottom:before,\\n.hover-bottom:after {\\n left: -6px;\\n}\\n.hover-bottom:before {\\n border-color: transparent transparent var(--Dash-Tooltip-Border-Color)\\n transparent;\\n}\\n.hover-bottom:after {\\n border-color: transparent transparent var(--Dash-Tooltip-Background-Color)\\n transparent;\\n top: -5px;\\n}\\n.hover-top:before {\\n border-color: var(--Dash-Tooltip-Border-Color) transparent transparent\\n transparent;\\n top: -1px;\\n}\\n.hover-top:after {\\n border-color: var(--Dash-Tooltip-Border-Color) transparent transparent\\n transparent;\\n top: -2px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","'use strict';\n\nvar $defineProperty = require('es-define-property');\n\nvar $SyntaxError = require('es-errors/syntax');\nvar $TypeError = require('es-errors/type');\n\nvar gopd = require('gopd');\n\n/** @type {import('.')} */\nmodule.exports = function defineDataProperty(\n\tobj,\n\tproperty,\n\tvalue\n) {\n\tif (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) {\n\t\tthrow new $TypeError('`obj` must be an object or a function`');\n\t}\n\tif (typeof property !== 'string' && typeof property !== 'symbol') {\n\t\tthrow new $TypeError('`property` must be a string or a symbol`');\n\t}\n\tif (arguments.length > 3 && typeof arguments[3] !== 'boolean' && arguments[3] !== null) {\n\t\tthrow new $TypeError('`nonEnumerable`, if provided, must be a boolean or null');\n\t}\n\tif (arguments.length > 4 && typeof arguments[4] !== 'boolean' && arguments[4] !== null) {\n\t\tthrow new $TypeError('`nonWritable`, if provided, must be a boolean or null');\n\t}\n\tif (arguments.length > 5 && typeof arguments[5] !== 'boolean' && arguments[5] !== null) {\n\t\tthrow new $TypeError('`nonConfigurable`, if provided, must be a boolean or null');\n\t}\n\tif (arguments.length > 6 && typeof arguments[6] !== 'boolean') {\n\t\tthrow new $TypeError('`loose`, if provided, must be a boolean');\n\t}\n\n\tvar nonEnumerable = arguments.length > 3 ? arguments[3] : null;\n\tvar nonWritable = arguments.length > 4 ? arguments[4] : null;\n\tvar nonConfigurable = arguments.length > 5 ? arguments[5] : null;\n\tvar loose = arguments.length > 6 ? arguments[6] : false;\n\n\t/* @type {false | TypedPropertyDescriptor} */\n\tvar desc = !!gopd && gopd(obj, property);\n\n\tif ($defineProperty) {\n\t\t$defineProperty(obj, property, {\n\t\t\tconfigurable: nonConfigurable === null && desc ? desc.configurable : !nonConfigurable,\n\t\t\tenumerable: nonEnumerable === null && desc ? desc.enumerable : !nonEnumerable,\n\t\t\tvalue: value,\n\t\t\twritable: nonWritable === null && desc ? desc.writable : !nonWritable\n\t\t});\n\t} else if (loose || (!nonEnumerable && !nonWritable && !nonConfigurable)) {\n\t\t// must fall back to [[Set]], and was not explicitly asked to make non-enumerable, non-writable, or non-configurable\n\t\tobj[property] = value; // eslint-disable-line no-param-reassign\n\t} else {\n\t\tthrow new $SyntaxError('This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.');\n\t}\n};\n","'use strict';\n\nvar keys = require('object-keys');\nvar hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';\n\nvar toStr = Object.prototype.toString;\nvar concat = Array.prototype.concat;\nvar defineDataProperty = require('define-data-property');\n\nvar isFunction = function (fn) {\n\treturn typeof fn === 'function' && toStr.call(fn) === '[object Function]';\n};\n\nvar supportsDescriptors = require('has-property-descriptors')();\n\nvar defineProperty = function (object, name, value, predicate) {\n\tif (name in object) {\n\t\tif (predicate === true) {\n\t\t\tif (object[name] === value) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else if (!isFunction(predicate) || !predicate()) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif (supportsDescriptors) {\n\t\tdefineDataProperty(object, name, value, true);\n\t} else {\n\t\tdefineDataProperty(object, name, value);\n\t}\n};\n\nvar defineProperties = function (object, map) {\n\tvar predicates = arguments.length > 2 ? arguments[2] : {};\n\tvar props = keys(map);\n\tif (hasSymbols) {\n\t\tprops = concat.call(props, Object.getOwnPropertySymbols(map));\n\t}\n\tfor (var i = 0; i < props.length; i += 1) {\n\t\tdefineProperty(object, props[i], map[props[i]], predicates[props[i]]);\n\t}\n};\n\ndefineProperties.supportsDescriptors = !!supportsDescriptors;\n\nmodule.exports = defineProperties;\n","'use strict';\n\nvar callBind = require('call-bind-apply-helpers');\nvar gOPD = require('gopd');\n\nvar hasProtoAccessor;\ntry {\n\t// eslint-disable-next-line no-extra-parens, no-proto\n\thasProtoAccessor = /** @type {{ __proto__?: typeof Array.prototype }} */ ([]).__proto__ === Array.prototype;\n} catch (e) {\n\tif (!e || typeof e !== 'object' || !('code' in e) || e.code !== 'ERR_PROTO_ACCESS') {\n\t\tthrow e;\n\t}\n}\n\n// eslint-disable-next-line no-extra-parens\nvar desc = !!hasProtoAccessor && gOPD && gOPD(Object.prototype, /** @type {keyof typeof Object.prototype} */ ('__proto__'));\n\nvar $Object = Object;\nvar $getPrototypeOf = $Object.getPrototypeOf;\n\n/** @type {import('./get')} */\nmodule.exports = desc && typeof desc.get === 'function'\n\t? callBind([desc.get])\n\t: typeof $getPrototypeOf === 'function'\n\t\t? /** @type {import('./get')} */ function getDunder(value) {\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\treturn $getPrototypeOf(value == null ? value : $Object(value));\n\t\t}\n\t\t: false;\n","'use strict';\n\n/** @type {import('.')} */\nvar $defineProperty = Object.defineProperty || false;\nif ($defineProperty) {\n\ttry {\n\t\t$defineProperty({}, 'a', { value: 1 });\n\t} catch (e) {\n\t\t// IE 8 has a broken defineProperty\n\t\t$defineProperty = false;\n\t}\n}\n\nmodule.exports = $defineProperty;\n","'use strict';\n\n/** @type {import('./eval')} */\nmodule.exports = EvalError;\n","'use strict';\n\n/** @type {import('.')} */\nmodule.exports = Error;\n","'use strict';\n\n/** @type {import('./range')} */\nmodule.exports = RangeError;\n","'use strict';\n\n/** @type {import('./ref')} */\nmodule.exports = ReferenceError;\n","'use strict';\n\n/** @type {import('./syntax')} */\nmodule.exports = SyntaxError;\n","'use strict';\n\n/** @type {import('./type')} */\nmodule.exports = TypeError;\n","'use strict';\n\n/** @type {import('./uri')} */\nmodule.exports = URIError;\n","'use strict';\n\n/** @type {import('.')} */\nmodule.exports = Object;\n","/**\n * inspired by is-number \n * but significantly simplified and sped up by ignoring number and string constructors\n * ie these return false:\n * new Number(1)\n * new String('1')\n */\n\n'use strict';\n\nvar allBlankCharCodes = require('is-string-blank');\n\nmodule.exports = function(n) {\n var type = typeof n;\n if(type === 'string') {\n var original = n;\n n = +n;\n // whitespace strings cast to zero - filter them out\n if(n===0 && allBlankCharCodes(original)) return false;\n }\n else if(type !== 'number') return false;\n\n return n - n < 1;\n};\n","(function(a,b){if(\"function\"==typeof define&&define.amd)define([],b);else if(\"undefined\"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){\"use strict\";function b(a,b){return\"undefined\"==typeof b?b={autoBom:!1}:\"object\"!=typeof b&&(console.warn(\"Deprecated: Expected third argument to be a object\"),b={autoBom:!b}),b.autoBom&&/^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(a.type)?new Blob([\"\\uFEFF\",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open(\"GET\",a),d.responseType=\"blob\",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error(\"could not download file\")},d.send()}function d(a){var b=new XMLHttpRequest;b.open(\"HEAD\",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent(\"click\"))}catch(c){var b=document.createEvent(\"MouseEvents\");b.initMouseEvent(\"click\",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f=\"object\"==typeof window&&window.window===window?window:\"object\"==typeof self&&self.self===self?self:\"object\"==typeof global&&global.global===global?global:void 0,a=f.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||(\"object\"!=typeof window||window!==f?function(){}:\"download\"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement(\"a\");g=g||b.name||\"download\",j.download=g,j.rel=\"noopener\",\"string\"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target=\"_blank\")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:\"msSaveOrOpenBlob\"in navigator?function(f,g,h){if(g=g||f.name||\"download\",\"string\"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement(\"a\");i.href=f,i.target=\"_blank\",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open(\"\",\"_blank\"),g&&(g.document.title=g.document.body.innerText=\"downloading...\"),\"string\"==typeof b)return c(b,d,e);var h=\"application/octet-stream\"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\\/[\\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&\"undefined\"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,\"data:attachment/file;\"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,\"undefined\"!=typeof module&&(module.exports=g)});\n\n//# sourceMappingURL=FileSaver.min.js.map","'use strict';\n\nvar isCallable = require('is-callable');\n\nvar toStr = Object.prototype.toString;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/** @type {(arr: A, iterator: (this: This | void, value: A[number], index: number, arr: A) => void, receiver: This | undefined) => void} */\nvar forEachArray = function forEachArray(array, iterator, receiver) {\n for (var i = 0, len = array.length; i < len; i++) {\n if (hasOwnProperty.call(array, i)) {\n if (receiver == null) {\n iterator(array[i], i, array);\n } else {\n iterator.call(receiver, array[i], i, array);\n }\n }\n }\n};\n\n/** @type {(string: S, iterator: (this: This | void, value: S[number], index: number, string: S) => void, receiver: This | undefined) => void} */\nvar forEachString = function forEachString(string, iterator, receiver) {\n for (var i = 0, len = string.length; i < len; i++) {\n // no such thing as a sparse string.\n if (receiver == null) {\n iterator(string.charAt(i), i, string);\n } else {\n iterator.call(receiver, string.charAt(i), i, string);\n }\n }\n};\n\n/** @type {(obj: O, iterator: (this: This | void, value: O[keyof O], index: keyof O, obj: O) => void, receiver: This | undefined) => void} */\nvar forEachObject = function forEachObject(object, iterator, receiver) {\n for (var k in object) {\n if (hasOwnProperty.call(object, k)) {\n if (receiver == null) {\n iterator(object[k], k, object);\n } else {\n iterator.call(receiver, object[k], k, object);\n }\n }\n }\n};\n\n/** @type {(x: unknown) => x is readonly unknown[]} */\nfunction isArray(x) {\n return toStr.call(x) === '[object Array]';\n}\n\n/** @type {import('.')._internal} */\nmodule.exports = function forEach(list, iterator, thisArg) {\n if (!isCallable(iterator)) {\n throw new TypeError('iterator must be a function');\n }\n\n var receiver;\n if (arguments.length >= 3) {\n receiver = thisArg;\n }\n\n if (isArray(list)) {\n forEachArray(list, iterator, receiver);\n } else if (typeof list === 'string') {\n forEachString(list, iterator, receiver);\n } else {\n forEachObject(list, iterator, receiver);\n }\n};\n","'use strict';\n\n/* eslint no-invalid-this: 1 */\n\nvar ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';\nvar toStr = Object.prototype.toString;\nvar max = Math.max;\nvar funcType = '[object Function]';\n\nvar concatty = function concatty(a, b) {\n var arr = [];\n\n for (var i = 0; i < a.length; i += 1) {\n arr[i] = a[i];\n }\n for (var j = 0; j < b.length; j += 1) {\n arr[j + a.length] = b[j];\n }\n\n return arr;\n};\n\nvar slicy = function slicy(arrLike, offset) {\n var arr = [];\n for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) {\n arr[j] = arrLike[i];\n }\n return arr;\n};\n\nvar joiny = function (arr, joiner) {\n var str = '';\n for (var i = 0; i < arr.length; i += 1) {\n str += arr[i];\n if (i + 1 < arr.length) {\n str += joiner;\n }\n }\n return str;\n};\n\nmodule.exports = function bind(that) {\n var target = this;\n if (typeof target !== 'function' || toStr.apply(target) !== funcType) {\n throw new TypeError(ERROR_MESSAGE + target);\n }\n var args = slicy(arguments, 1);\n\n var bound;\n var binder = function () {\n if (this instanceof bound) {\n var result = target.apply(\n this,\n concatty(args, arguments)\n );\n if (Object(result) === result) {\n return result;\n }\n return this;\n }\n return target.apply(\n that,\n concatty(args, arguments)\n );\n\n };\n\n var boundLength = max(0, target.length - args.length);\n var boundArgs = [];\n for (var i = 0; i < boundLength; i++) {\n boundArgs[i] = '$' + i;\n }\n\n bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder);\n\n if (target.prototype) {\n var Empty = function Empty() {};\n Empty.prototype = target.prototype;\n bound.prototype = new Empty();\n Empty.prototype = null;\n }\n\n return bound;\n};\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = Function.prototype.bind || implementation;\n","'use strict';\n\nvar undefined;\n\nvar $Object = require('es-object-atoms');\n\nvar $Error = require('es-errors');\nvar $EvalError = require('es-errors/eval');\nvar $RangeError = require('es-errors/range');\nvar $ReferenceError = require('es-errors/ref');\nvar $SyntaxError = require('es-errors/syntax');\nvar $TypeError = require('es-errors/type');\nvar $URIError = require('es-errors/uri');\n\nvar abs = require('math-intrinsics/abs');\nvar floor = require('math-intrinsics/floor');\nvar max = require('math-intrinsics/max');\nvar min = require('math-intrinsics/min');\nvar pow = require('math-intrinsics/pow');\nvar round = require('math-intrinsics/round');\nvar sign = require('math-intrinsics/sign');\n\nvar $Function = Function;\n\n// eslint-disable-next-line consistent-return\nvar getEvalledConstructor = function (expressionSyntax) {\n\ttry {\n\t\treturn $Function('\"use strict\"; return (' + expressionSyntax + ').constructor;')();\n\t} catch (e) {}\n};\n\nvar $gOPD = require('gopd');\nvar $defineProperty = require('es-define-property');\n\nvar throwTypeError = function () {\n\tthrow new $TypeError();\n};\nvar ThrowTypeError = $gOPD\n\t? (function () {\n\t\ttry {\n\t\t\t// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties\n\t\t\targuments.callee; // IE 8 does not throw here\n\t\t\treturn throwTypeError;\n\t\t} catch (calleeThrows) {\n\t\t\ttry {\n\t\t\t\t// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')\n\t\t\t\treturn $gOPD(arguments, 'callee').get;\n\t\t\t} catch (gOPDthrows) {\n\t\t\t\treturn throwTypeError;\n\t\t\t}\n\t\t}\n\t}())\n\t: throwTypeError;\n\nvar hasSymbols = require('has-symbols')();\n\nvar getProto = require('get-proto');\nvar $ObjectGPO = require('get-proto/Object.getPrototypeOf');\nvar $ReflectGPO = require('get-proto/Reflect.getPrototypeOf');\n\nvar $apply = require('call-bind-apply-helpers/functionApply');\nvar $call = require('call-bind-apply-helpers/functionCall');\n\nvar needsEval = {};\n\nvar TypedArray = typeof Uint8Array === 'undefined' || !getProto ? undefined : getProto(Uint8Array);\n\nvar INTRINSICS = {\n\t__proto__: null,\n\t'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,\n\t'%Array%': Array,\n\t'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,\n\t'%ArrayIteratorPrototype%': hasSymbols && getProto ? getProto([][Symbol.iterator]()) : undefined,\n\t'%AsyncFromSyncIteratorPrototype%': undefined,\n\t'%AsyncFunction%': needsEval,\n\t'%AsyncGenerator%': needsEval,\n\t'%AsyncGeneratorFunction%': needsEval,\n\t'%AsyncIteratorPrototype%': needsEval,\n\t'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,\n\t'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,\n\t'%BigInt64Array%': typeof BigInt64Array === 'undefined' ? undefined : BigInt64Array,\n\t'%BigUint64Array%': typeof BigUint64Array === 'undefined' ? undefined : BigUint64Array,\n\t'%Boolean%': Boolean,\n\t'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,\n\t'%Date%': Date,\n\t'%decodeURI%': decodeURI,\n\t'%decodeURIComponent%': decodeURIComponent,\n\t'%encodeURI%': encodeURI,\n\t'%encodeURIComponent%': encodeURIComponent,\n\t'%Error%': $Error,\n\t'%eval%': eval, // eslint-disable-line no-eval\n\t'%EvalError%': $EvalError,\n\t'%Float16Array%': typeof Float16Array === 'undefined' ? undefined : Float16Array,\n\t'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,\n\t'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,\n\t'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,\n\t'%Function%': $Function,\n\t'%GeneratorFunction%': needsEval,\n\t'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,\n\t'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,\n\t'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,\n\t'%isFinite%': isFinite,\n\t'%isNaN%': isNaN,\n\t'%IteratorPrototype%': hasSymbols && getProto ? getProto(getProto([][Symbol.iterator]())) : undefined,\n\t'%JSON%': typeof JSON === 'object' ? JSON : undefined,\n\t'%Map%': typeof Map === 'undefined' ? undefined : Map,\n\t'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Map()[Symbol.iterator]()),\n\t'%Math%': Math,\n\t'%Number%': Number,\n\t'%Object%': $Object,\n\t'%Object.getOwnPropertyDescriptor%': $gOPD,\n\t'%parseFloat%': parseFloat,\n\t'%parseInt%': parseInt,\n\t'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,\n\t'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,\n\t'%RangeError%': $RangeError,\n\t'%ReferenceError%': $ReferenceError,\n\t'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,\n\t'%RegExp%': RegExp,\n\t'%Set%': typeof Set === 'undefined' ? undefined : Set,\n\t'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Set()[Symbol.iterator]()),\n\t'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,\n\t'%String%': String,\n\t'%StringIteratorPrototype%': hasSymbols && getProto ? getProto(''[Symbol.iterator]()) : undefined,\n\t'%Symbol%': hasSymbols ? Symbol : undefined,\n\t'%SyntaxError%': $SyntaxError,\n\t'%ThrowTypeError%': ThrowTypeError,\n\t'%TypedArray%': TypedArray,\n\t'%TypeError%': $TypeError,\n\t'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,\n\t'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,\n\t'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,\n\t'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,\n\t'%URIError%': $URIError,\n\t'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,\n\t'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,\n\t'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet,\n\n\t'%Function.prototype.call%': $call,\n\t'%Function.prototype.apply%': $apply,\n\t'%Object.defineProperty%': $defineProperty,\n\t'%Object.getPrototypeOf%': $ObjectGPO,\n\t'%Math.abs%': abs,\n\t'%Math.floor%': floor,\n\t'%Math.max%': max,\n\t'%Math.min%': min,\n\t'%Math.pow%': pow,\n\t'%Math.round%': round,\n\t'%Math.sign%': sign,\n\t'%Reflect.getPrototypeOf%': $ReflectGPO\n};\n\nif (getProto) {\n\ttry {\n\t\tnull.error; // eslint-disable-line no-unused-expressions\n\t} catch (e) {\n\t\t// https://github.com/tc39/proposal-shadowrealm/pull/384#issuecomment-1364264229\n\t\tvar errorProto = getProto(getProto(e));\n\t\tINTRINSICS['%Error.prototype%'] = errorProto;\n\t}\n}\n\nvar doEval = function doEval(name) {\n\tvar value;\n\tif (name === '%AsyncFunction%') {\n\t\tvalue = getEvalledConstructor('async function () {}');\n\t} else if (name === '%GeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('function* () {}');\n\t} else if (name === '%AsyncGeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('async function* () {}');\n\t} else if (name === '%AsyncGenerator%') {\n\t\tvar fn = doEval('%AsyncGeneratorFunction%');\n\t\tif (fn) {\n\t\t\tvalue = fn.prototype;\n\t\t}\n\t} else if (name === '%AsyncIteratorPrototype%') {\n\t\tvar gen = doEval('%AsyncGenerator%');\n\t\tif (gen && getProto) {\n\t\t\tvalue = getProto(gen.prototype);\n\t\t}\n\t}\n\n\tINTRINSICS[name] = value;\n\n\treturn value;\n};\n\nvar LEGACY_ALIASES = {\n\t__proto__: null,\n\t'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],\n\t'%ArrayPrototype%': ['Array', 'prototype'],\n\t'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],\n\t'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],\n\t'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],\n\t'%ArrayProto_values%': ['Array', 'prototype', 'values'],\n\t'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],\n\t'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],\n\t'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],\n\t'%BooleanPrototype%': ['Boolean', 'prototype'],\n\t'%DataViewPrototype%': ['DataView', 'prototype'],\n\t'%DatePrototype%': ['Date', 'prototype'],\n\t'%ErrorPrototype%': ['Error', 'prototype'],\n\t'%EvalErrorPrototype%': ['EvalError', 'prototype'],\n\t'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],\n\t'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],\n\t'%FunctionPrototype%': ['Function', 'prototype'],\n\t'%Generator%': ['GeneratorFunction', 'prototype'],\n\t'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],\n\t'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],\n\t'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],\n\t'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],\n\t'%JSONParse%': ['JSON', 'parse'],\n\t'%JSONStringify%': ['JSON', 'stringify'],\n\t'%MapPrototype%': ['Map', 'prototype'],\n\t'%NumberPrototype%': ['Number', 'prototype'],\n\t'%ObjectPrototype%': ['Object', 'prototype'],\n\t'%ObjProto_toString%': ['Object', 'prototype', 'toString'],\n\t'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],\n\t'%PromisePrototype%': ['Promise', 'prototype'],\n\t'%PromiseProto_then%': ['Promise', 'prototype', 'then'],\n\t'%Promise_all%': ['Promise', 'all'],\n\t'%Promise_reject%': ['Promise', 'reject'],\n\t'%Promise_resolve%': ['Promise', 'resolve'],\n\t'%RangeErrorPrototype%': ['RangeError', 'prototype'],\n\t'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],\n\t'%RegExpPrototype%': ['RegExp', 'prototype'],\n\t'%SetPrototype%': ['Set', 'prototype'],\n\t'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],\n\t'%StringPrototype%': ['String', 'prototype'],\n\t'%SymbolPrototype%': ['Symbol', 'prototype'],\n\t'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],\n\t'%TypedArrayPrototype%': ['TypedArray', 'prototype'],\n\t'%TypeErrorPrototype%': ['TypeError', 'prototype'],\n\t'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],\n\t'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],\n\t'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],\n\t'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],\n\t'%URIErrorPrototype%': ['URIError', 'prototype'],\n\t'%WeakMapPrototype%': ['WeakMap', 'prototype'],\n\t'%WeakSetPrototype%': ['WeakSet', 'prototype']\n};\n\nvar bind = require('function-bind');\nvar hasOwn = require('hasown');\nvar $concat = bind.call($call, Array.prototype.concat);\nvar $spliceApply = bind.call($apply, Array.prototype.splice);\nvar $replace = bind.call($call, String.prototype.replace);\nvar $strSlice = bind.call($call, String.prototype.slice);\nvar $exec = bind.call($call, RegExp.prototype.exec);\n\n/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */\nvar rePropName = /[^%.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|%$))/g;\nvar reEscapeChar = /\\\\(\\\\)?/g; /** Used to match backslashes in property paths. */\nvar stringToPath = function stringToPath(string) {\n\tvar first = $strSlice(string, 0, 1);\n\tvar last = $strSlice(string, -1);\n\tif (first === '%' && last !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected closing `%`');\n\t} else if (last === '%' && first !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected opening `%`');\n\t}\n\tvar result = [];\n\t$replace(string, rePropName, function (match, number, quote, subString) {\n\t\tresult[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;\n\t});\n\treturn result;\n};\n/* end adaptation */\n\nvar getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {\n\tvar intrinsicName = name;\n\tvar alias;\n\tif (hasOwn(LEGACY_ALIASES, intrinsicName)) {\n\t\talias = LEGACY_ALIASES[intrinsicName];\n\t\tintrinsicName = '%' + alias[0] + '%';\n\t}\n\n\tif (hasOwn(INTRINSICS, intrinsicName)) {\n\t\tvar value = INTRINSICS[intrinsicName];\n\t\tif (value === needsEval) {\n\t\t\tvalue = doEval(intrinsicName);\n\t\t}\n\t\tif (typeof value === 'undefined' && !allowMissing) {\n\t\t\tthrow new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');\n\t\t}\n\n\t\treturn {\n\t\t\talias: alias,\n\t\t\tname: intrinsicName,\n\t\t\tvalue: value\n\t\t};\n\t}\n\n\tthrow new $SyntaxError('intrinsic ' + name + ' does not exist!');\n};\n\nmodule.exports = function GetIntrinsic(name, allowMissing) {\n\tif (typeof name !== 'string' || name.length === 0) {\n\t\tthrow new $TypeError('intrinsic name must be a non-empty string');\n\t}\n\tif (arguments.length > 1 && typeof allowMissing !== 'boolean') {\n\t\tthrow new $TypeError('\"allowMissing\" argument must be a boolean');\n\t}\n\n\tif ($exec(/^%?[^%]*%?$/, name) === null) {\n\t\tthrow new $SyntaxError('`%` may not be present anywhere but at the beginning and end of the intrinsic name');\n\t}\n\tvar parts = stringToPath(name);\n\tvar intrinsicBaseName = parts.length > 0 ? parts[0] : '';\n\n\tvar intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);\n\tvar intrinsicRealName = intrinsic.name;\n\tvar value = intrinsic.value;\n\tvar skipFurtherCaching = false;\n\n\tvar alias = intrinsic.alias;\n\tif (alias) {\n\t\tintrinsicBaseName = alias[0];\n\t\t$spliceApply(parts, $concat([0, 1], alias));\n\t}\n\n\tfor (var i = 1, isOwn = true; i < parts.length; i += 1) {\n\t\tvar part = parts[i];\n\t\tvar first = $strSlice(part, 0, 1);\n\t\tvar last = $strSlice(part, -1);\n\t\tif (\n\t\t\t(\n\t\t\t\t(first === '\"' || first === \"'\" || first === '`')\n\t\t\t\t|| (last === '\"' || last === \"'\" || last === '`')\n\t\t\t)\n\t\t\t&& first !== last\n\t\t) {\n\t\t\tthrow new $SyntaxError('property names with quotes must have matching quotes');\n\t\t}\n\t\tif (part === 'constructor' || !isOwn) {\n\t\t\tskipFurtherCaching = true;\n\t\t}\n\n\t\tintrinsicBaseName += '.' + part;\n\t\tintrinsicRealName = '%' + intrinsicBaseName + '%';\n\n\t\tif (hasOwn(INTRINSICS, intrinsicRealName)) {\n\t\t\tvalue = INTRINSICS[intrinsicRealName];\n\t\t} else if (value != null) {\n\t\t\tif (!(part in value)) {\n\t\t\t\tif (!allowMissing) {\n\t\t\t\t\tthrow new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');\n\t\t\t\t}\n\t\t\t\treturn void undefined;\n\t\t\t}\n\t\t\tif ($gOPD && (i + 1) >= parts.length) {\n\t\t\t\tvar desc = $gOPD(value, part);\n\t\t\t\tisOwn = !!desc;\n\n\t\t\t\t// By convention, when a data property is converted to an accessor\n\t\t\t\t// property to emulate a data property that does not suffer from\n\t\t\t\t// the override mistake, that accessor's getter is marked with\n\t\t\t\t// an `originalValue` property. Here, when we detect this, we\n\t\t\t\t// uphold the illusion by pretending to see that original data\n\t\t\t\t// property, i.e., returning the value rather than the getter\n\t\t\t\t// itself.\n\t\t\t\tif (isOwn && 'get' in desc && !('originalValue' in desc.get)) {\n\t\t\t\t\tvalue = desc.get;\n\t\t\t\t} else {\n\t\t\t\t\tvalue = value[part];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tisOwn = hasOwn(value, part);\n\t\t\t\tvalue = value[part];\n\t\t\t}\n\n\t\t\tif (isOwn && !skipFurtherCaching) {\n\t\t\t\tINTRINSICS[intrinsicRealName] = value;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n","'use strict';\n\nvar $Object = require('es-object-atoms');\n\n/** @type {import('./Object.getPrototypeOf')} */\nmodule.exports = $Object.getPrototypeOf || null;\n","'use strict';\n\n/** @type {import('./Reflect.getPrototypeOf')} */\nmodule.exports = (typeof Reflect !== 'undefined' && Reflect.getPrototypeOf) || null;\n","'use strict';\n\nvar reflectGetProto = require('./Reflect.getPrototypeOf');\nvar originalGetProto = require('./Object.getPrototypeOf');\n\nvar getDunderProto = require('dunder-proto/get');\n\n/** @type {import('.')} */\nmodule.exports = reflectGetProto\n\t? function getProto(O) {\n\t\t// @ts-expect-error TS can't narrow inside a closure, for some reason\n\t\treturn reflectGetProto(O);\n\t}\n\t: originalGetProto\n\t\t? function getProto(O) {\n\t\t\tif (!O || (typeof O !== 'object' && typeof O !== 'function')) {\n\t\t\t\tthrow new TypeError('getProto: not an object');\n\t\t\t}\n\t\t\t// @ts-expect-error TS can't narrow inside a closure, for some reason\n\t\t\treturn originalGetProto(O);\n\t\t}\n\t\t: getDunderProto\n\t\t\t? function getProto(O) {\n\t\t\t\t// @ts-expect-error TS can't narrow inside a closure, for some reason\n\t\t\t\treturn getDunderProto(O);\n\t\t\t}\n\t\t\t: null;\n","'use strict';\n\n/** @type {import('./gOPD')} */\nmodule.exports = Object.getOwnPropertyDescriptor;\n","'use strict';\n\n/** @type {import('.')} */\nvar $gOPD = require('./gOPD');\n\nif ($gOPD) {\n\ttry {\n\t\t$gOPD([], 'length');\n\t} catch (e) {\n\t\t// IE 8 has a broken gOPD\n\t\t$gOPD = null;\n\t}\n}\n\nmodule.exports = $gOPD;\n","'use strict';\n\nvar $defineProperty = require('es-define-property');\n\nvar hasPropertyDescriptors = function hasPropertyDescriptors() {\n\treturn !!$defineProperty;\n};\n\nhasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBug() {\n\t// node v0.6 has a bug where array lengths can be Set but not Defined\n\tif (!$defineProperty) {\n\t\treturn null;\n\t}\n\ttry {\n\t\treturn $defineProperty([], 'length', { value: 1 }).length !== 1;\n\t} catch (e) {\n\t\t// In Firefox 4-22, defining length on an array throws an exception.\n\t\treturn true;\n\t}\n};\n\nmodule.exports = hasPropertyDescriptors;\n","'use strict';\n\nvar origSymbol = typeof Symbol !== 'undefined' && Symbol;\nvar hasSymbolSham = require('./shams');\n\n/** @type {import('.')} */\nmodule.exports = function hasNativeSymbols() {\n\tif (typeof origSymbol !== 'function') { return false; }\n\tif (typeof Symbol !== 'function') { return false; }\n\tif (typeof origSymbol('foo') !== 'symbol') { return false; }\n\tif (typeof Symbol('bar') !== 'symbol') { return false; }\n\n\treturn hasSymbolSham();\n};\n","'use strict';\n\n/** @type {import('./shams')} */\n/* eslint complexity: [2, 18], max-statements: [2, 33] */\nmodule.exports = function hasSymbols() {\n\tif (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }\n\tif (typeof Symbol.iterator === 'symbol') { return true; }\n\n\t/** @type {{ [k in symbol]?: unknown }} */\n\tvar obj = {};\n\tvar sym = Symbol('test');\n\tvar symObj = Object(sym);\n\tif (typeof sym === 'string') { return false; }\n\n\tif (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }\n\tif (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }\n\n\t// temp disabled per https://github.com/ljharb/object.assign/issues/17\n\t// if (sym instanceof Symbol) { return false; }\n\t// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4\n\t// if (!(symObj instanceof Symbol)) { return false; }\n\n\t// if (typeof Symbol.prototype.toString !== 'function') { return false; }\n\t// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }\n\n\tvar symVal = 42;\n\tobj[sym] = symVal;\n\tfor (var _ in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop\n\tif (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }\n\n\tif (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }\n\n\tvar syms = Object.getOwnPropertySymbols(obj);\n\tif (syms.length !== 1 || syms[0] !== sym) { return false; }\n\n\tif (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }\n\n\tif (typeof Object.getOwnPropertyDescriptor === 'function') {\n\t\t// eslint-disable-next-line no-extra-parens\n\t\tvar descriptor = /** @type {PropertyDescriptor} */ (Object.getOwnPropertyDescriptor(obj, sym));\n\t\tif (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }\n\t}\n\n\treturn true;\n};\n","'use strict';\n\nvar hasSymbols = require('has-symbols/shams');\n\n/** @type {import('.')} */\nmodule.exports = function hasToStringTagShams() {\n\treturn hasSymbols() && !!Symbol.toStringTag;\n};\n","'use strict';\n\nvar call = Function.prototype.call;\nvar $hasOwn = Object.prototype.hasOwnProperty;\nvar bind = require('function-bind');\n\n/** @type {import('.')} */\nmodule.exports = bind.call(call, $hasOwn);\n","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n })\n }\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n }\n}\n","'use strict';\n\nvar hasToStringTag = require('has-tostringtag/shams')();\nvar callBound = require('call-bind/callBound');\n\nvar $toString = callBound('Object.prototype.toString');\n\nvar isStandardArguments = function isArguments(value) {\n\tif (hasToStringTag && value && typeof value === 'object' && Symbol.toStringTag in value) {\n\t\treturn false;\n\t}\n\treturn $toString(value) === '[object Arguments]';\n};\n\nvar isLegacyArguments = function isArguments(value) {\n\tif (isStandardArguments(value)) {\n\t\treturn true;\n\t}\n\treturn value !== null &&\n\t\ttypeof value === 'object' &&\n\t\ttypeof value.length === 'number' &&\n\t\tvalue.length >= 0 &&\n\t\t$toString(value) !== '[object Array]' &&\n\t\t$toString(value.callee) === '[object Function]';\n};\n\nvar supportsStandardArguments = (function () {\n\treturn isStandardArguments(arguments);\n}());\n\nisStandardArguments.isLegacyArguments = isLegacyArguments; // for tests\n\nmodule.exports = supportsStandardArguments ? isStandardArguments : isLegacyArguments;\n","'use strict';\n\nvar fnToStr = Function.prototype.toString;\nvar reflectApply = typeof Reflect === 'object' && Reflect !== null && Reflect.apply;\nvar badArrayLike;\nvar isCallableMarker;\nif (typeof reflectApply === 'function' && typeof Object.defineProperty === 'function') {\n\ttry {\n\t\tbadArrayLike = Object.defineProperty({}, 'length', {\n\t\t\tget: function () {\n\t\t\t\tthrow isCallableMarker;\n\t\t\t}\n\t\t});\n\t\tisCallableMarker = {};\n\t\t// eslint-disable-next-line no-throw-literal\n\t\treflectApply(function () { throw 42; }, null, badArrayLike);\n\t} catch (_) {\n\t\tif (_ !== isCallableMarker) {\n\t\t\treflectApply = null;\n\t\t}\n\t}\n} else {\n\treflectApply = null;\n}\n\nvar constructorRegex = /^\\s*class\\b/;\nvar isES6ClassFn = function isES6ClassFunction(value) {\n\ttry {\n\t\tvar fnStr = fnToStr.call(value);\n\t\treturn constructorRegex.test(fnStr);\n\t} catch (e) {\n\t\treturn false; // not a function\n\t}\n};\n\nvar tryFunctionObject = function tryFunctionToStr(value) {\n\ttry {\n\t\tif (isES6ClassFn(value)) { return false; }\n\t\tfnToStr.call(value);\n\t\treturn true;\n\t} catch (e) {\n\t\treturn false;\n\t}\n};\nvar toStr = Object.prototype.toString;\nvar objectClass = '[object Object]';\nvar fnClass = '[object Function]';\nvar genClass = '[object GeneratorFunction]';\nvar ddaClass = '[object HTMLAllCollection]'; // IE 11\nvar ddaClass2 = '[object HTML document.all class]';\nvar ddaClass3 = '[object HTMLCollection]'; // IE 9-10\nvar hasToStringTag = typeof Symbol === 'function' && !!Symbol.toStringTag; // better: use `has-tostringtag`\n\nvar isIE68 = !(0 in [,]); // eslint-disable-line no-sparse-arrays, comma-spacing\n\nvar isDDA = function isDocumentDotAll() { return false; };\nif (typeof document === 'object') {\n\t// Firefox 3 canonicalizes DDA to undefined when it's not accessed directly\n\tvar all = document.all;\n\tif (toStr.call(all) === toStr.call(document.all)) {\n\t\tisDDA = function isDocumentDotAll(value) {\n\t\t\t/* globals document: false */\n\t\t\t// in IE 6-8, typeof document.all is \"object\" and it's truthy\n\t\t\tif ((isIE68 || !value) && (typeof value === 'undefined' || typeof value === 'object')) {\n\t\t\t\ttry {\n\t\t\t\t\tvar str = toStr.call(value);\n\t\t\t\t\treturn (\n\t\t\t\t\t\tstr === ddaClass\n\t\t\t\t\t\t|| str === ddaClass2\n\t\t\t\t\t\t|| str === ddaClass3 // opera 12.16\n\t\t\t\t\t\t|| str === objectClass // IE 6-8\n\t\t\t\t\t) && value('') == null; // eslint-disable-line eqeqeq\n\t\t\t\t} catch (e) { /**/ }\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\t}\n}\n\nmodule.exports = reflectApply\n\t? function isCallable(value) {\n\t\tif (isDDA(value)) { return true; }\n\t\tif (!value) { return false; }\n\t\tif (typeof value !== 'function' && typeof value !== 'object') { return false; }\n\t\ttry {\n\t\t\treflectApply(value, null, badArrayLike);\n\t\t} catch (e) {\n\t\t\tif (e !== isCallableMarker) { return false; }\n\t\t}\n\t\treturn !isES6ClassFn(value) && tryFunctionObject(value);\n\t}\n\t: function isCallable(value) {\n\t\tif (isDDA(value)) { return true; }\n\t\tif (!value) { return false; }\n\t\tif (typeof value !== 'function' && typeof value !== 'object') { return false; }\n\t\tif (hasToStringTag) { return tryFunctionObject(value); }\n\t\tif (isES6ClassFn(value)) { return false; }\n\t\tvar strClass = toStr.call(value);\n\t\tif (strClass !== fnClass && strClass !== genClass && !(/^\\[object HTML/).test(strClass)) { return false; }\n\t\treturn tryFunctionObject(value);\n\t};\n","'use strict';\n\nvar toStr = Object.prototype.toString;\nvar fnToStr = Function.prototype.toString;\nvar isFnRegex = /^\\s*(?:function)?\\*/;\nvar hasToStringTag = require('has-tostringtag/shams')();\nvar getProto = Object.getPrototypeOf;\nvar getGeneratorFunc = function () { // eslint-disable-line consistent-return\n\tif (!hasToStringTag) {\n\t\treturn false;\n\t}\n\ttry {\n\t\treturn Function('return function*() {}')();\n\t} catch (e) {\n\t}\n};\nvar GeneratorFunction;\n\nmodule.exports = function isGeneratorFunction(fn) {\n\tif (typeof fn !== 'function') {\n\t\treturn false;\n\t}\n\tif (isFnRegex.test(fnToStr.call(fn))) {\n\t\treturn true;\n\t}\n\tif (!hasToStringTag) {\n\t\tvar str = toStr.call(fn);\n\t\treturn str === '[object GeneratorFunction]';\n\t}\n\tif (!getProto) {\n\t\treturn false;\n\t}\n\tif (typeof GeneratorFunction === 'undefined') {\n\t\tvar generatorFunc = getGeneratorFunc();\n\t\tGeneratorFunction = generatorFunc ? getProto(generatorFunc) : false;\n\t}\n\treturn getProto(fn) === GeneratorFunction;\n};\n","'use strict';\n\n/* http://www.ecma-international.org/ecma-262/6.0/#sec-number.isnan */\n\nmodule.exports = function isNaN(value) {\n\treturn value !== value;\n};\n","'use strict';\n\nvar callBind = require('call-bind');\nvar define = require('define-properties');\n\nvar implementation = require('./implementation');\nvar getPolyfill = require('./polyfill');\nvar shim = require('./shim');\n\nvar polyfill = callBind(getPolyfill(), Number);\n\n/* http://www.ecma-international.org/ecma-262/6.0/#sec-number.isnan */\n\ndefine(polyfill, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = polyfill;\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = function getPolyfill() {\n\tif (Number.isNaN && Number.isNaN(NaN) && !Number.isNaN('a')) {\n\t\treturn Number.isNaN;\n\t}\n\treturn implementation;\n};\n","'use strict';\n\nvar define = require('define-properties');\nvar getPolyfill = require('./polyfill');\n\n/* http://www.ecma-international.org/ecma-262/6.0/#sec-number.isnan */\n\nmodule.exports = function shimNumberIsNaN() {\n\tvar polyfill = getPolyfill();\n\tdefine(Number, { isNaN: polyfill }, {\n\t\tisNaN: function testIsNaN() {\n\t\t\treturn Number.isNaN !== polyfill;\n\t\t}\n\t});\n\treturn polyfill;\n};\n","'use strict';\r\n\r\n/**\r\n * Is this string all whitespace?\r\n * This solution kind of makes my brain hurt, but it's significantly faster\r\n * than !str.trim() or any other solution I could find.\r\n *\r\n * whitespace codes from: http://en.wikipedia.org/wiki/Whitespace_character\r\n * and verified with:\r\n *\r\n * for(var i = 0; i < 65536; i++) {\r\n * var s = String.fromCharCode(i);\r\n * if(+s===0 && !s.trim()) console.log(i, s);\r\n * }\r\n *\r\n * which counts a couple of these as *not* whitespace, but finds nothing else\r\n * that *is* whitespace. Note that charCodeAt stops at 16 bits, but it appears\r\n * that there are no whitespace characters above this, and code points above\r\n * this do not map onto white space characters.\r\n */\r\n\r\nmodule.exports = function(str){\r\n var l = str.length,\r\n a;\r\n for(var i = 0; i < l; i++) {\r\n a = str.charCodeAt(i);\r\n if((a < 9 || a > 13) && (a !== 32) && (a !== 133) && (a !== 160) &&\r\n (a !== 5760) && (a !== 6158) && (a < 8192 || a > 8205) &&\r\n (a !== 8232) && (a !== 8233) && (a !== 8239) && (a !== 8287) &&\r\n (a !== 8288) && (a !== 12288) && (a !== 65279)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n","'use strict';\n\nvar whichTypedArray = require('which-typed-array');\n\n/** @type {import('.')} */\nmodule.exports = function isTypedArray(value) {\n\treturn !!whichTypedArray(value);\n};\n","'use strict';\n\n/** @type {import('./abs')} */\nmodule.exports = Math.abs;\n","'use strict';\n\n/** @type {import('./floor')} */\nmodule.exports = Math.floor;\n","'use strict';\n\n/** @type {import('./isNaN')} */\nmodule.exports = Number.isNaN || function isNaN(a) {\n\treturn a !== a;\n};\n","'use strict';\n\n/** @type {import('./max')} */\nmodule.exports = Math.max;\n","'use strict';\n\n/** @type {import('./min')} */\nmodule.exports = Math.min;\n","'use strict';\n\n/** @type {import('./pow')} */\nmodule.exports = Math.pow;\n","'use strict';\n\n/** @type {import('./round')} */\nmodule.exports = Math.round;\n","'use strict';\n\nvar $isNaN = require('./isNaN');\n\n/** @type {import('./sign')} */\nmodule.exports = function sign(number) {\n\tif ($isNaN(number) || number === 0) {\n\t\treturn number;\n\t}\n\treturn number < 0 ? -1 : +1;\n};\n","'use strict';\n\nvar numberIsNaN = function (value) {\n\treturn value !== value;\n};\n\nmodule.exports = function is(a, b) {\n\tif (a === 0 && b === 0) {\n\t\treturn 1 / a === 1 / b;\n\t}\n\tif (a === b) {\n\t\treturn true;\n\t}\n\tif (numberIsNaN(a) && numberIsNaN(b)) {\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n","'use strict';\n\nvar define = require('define-properties');\nvar callBind = require('call-bind');\n\nvar implementation = require('./implementation');\nvar getPolyfill = require('./polyfill');\nvar shim = require('./shim');\n\nvar polyfill = callBind(getPolyfill(), Object);\n\ndefine(polyfill, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = polyfill;\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = function getPolyfill() {\n\treturn typeof Object.is === 'function' ? Object.is : implementation;\n};\n","'use strict';\n\nvar getPolyfill = require('./polyfill');\nvar define = require('define-properties');\n\nmodule.exports = function shimObjectIs() {\n\tvar polyfill = getPolyfill();\n\tdefine(Object, { is: polyfill }, {\n\t\tis: function testObjectIs() {\n\t\t\treturn Object.is !== polyfill;\n\t\t}\n\t});\n\treturn polyfill;\n};\n","'use strict';\n\nvar keysShim;\nif (!Object.keys) {\n\t// modified from https://github.com/es-shims/es5-shim\n\tvar has = Object.prototype.hasOwnProperty;\n\tvar toStr = Object.prototype.toString;\n\tvar isArgs = require('./isArguments'); // eslint-disable-line global-require\n\tvar isEnumerable = Object.prototype.propertyIsEnumerable;\n\tvar hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');\n\tvar hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');\n\tvar dontEnums = [\n\t\t'toString',\n\t\t'toLocaleString',\n\t\t'valueOf',\n\t\t'hasOwnProperty',\n\t\t'isPrototypeOf',\n\t\t'propertyIsEnumerable',\n\t\t'constructor'\n\t];\n\tvar equalsConstructorPrototype = function (o) {\n\t\tvar ctor = o.constructor;\n\t\treturn ctor && ctor.prototype === o;\n\t};\n\tvar excludedKeys = {\n\t\t$applicationCache: true,\n\t\t$console: true,\n\t\t$external: true,\n\t\t$frame: true,\n\t\t$frameElement: true,\n\t\t$frames: true,\n\t\t$innerHeight: true,\n\t\t$innerWidth: true,\n\t\t$onmozfullscreenchange: true,\n\t\t$onmozfullscreenerror: true,\n\t\t$outerHeight: true,\n\t\t$outerWidth: true,\n\t\t$pageXOffset: true,\n\t\t$pageYOffset: true,\n\t\t$parent: true,\n\t\t$scrollLeft: true,\n\t\t$scrollTop: true,\n\t\t$scrollX: true,\n\t\t$scrollY: true,\n\t\t$self: true,\n\t\t$webkitIndexedDB: true,\n\t\t$webkitStorageInfo: true,\n\t\t$window: true\n\t};\n\tvar hasAutomationEqualityBug = (function () {\n\t\t/* global window */\n\t\tif (typeof window === 'undefined') { return false; }\n\t\tfor (var k in window) {\n\t\t\ttry {\n\t\t\t\tif (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tequalsConstructorPrototype(window[k]);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}());\n\tvar equalsConstructorPrototypeIfNotBuggy = function (o) {\n\t\t/* global window */\n\t\tif (typeof window === 'undefined' || !hasAutomationEqualityBug) {\n\t\t\treturn equalsConstructorPrototype(o);\n\t\t}\n\t\ttry {\n\t\t\treturn equalsConstructorPrototype(o);\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tkeysShim = function keys(object) {\n\t\tvar isObject = object !== null && typeof object === 'object';\n\t\tvar isFunction = toStr.call(object) === '[object Function]';\n\t\tvar isArguments = isArgs(object);\n\t\tvar isString = isObject && toStr.call(object) === '[object String]';\n\t\tvar theKeys = [];\n\n\t\tif (!isObject && !isFunction && !isArguments) {\n\t\t\tthrow new TypeError('Object.keys called on a non-object');\n\t\t}\n\n\t\tvar skipProto = hasProtoEnumBug && isFunction;\n\t\tif (isString && object.length > 0 && !has.call(object, 0)) {\n\t\t\tfor (var i = 0; i < object.length; ++i) {\n\t\t\t\ttheKeys.push(String(i));\n\t\t\t}\n\t\t}\n\n\t\tif (isArguments && object.length > 0) {\n\t\t\tfor (var j = 0; j < object.length; ++j) {\n\t\t\t\ttheKeys.push(String(j));\n\t\t\t}\n\t\t} else {\n\t\t\tfor (var name in object) {\n\t\t\t\tif (!(skipProto && name === 'prototype') && has.call(object, name)) {\n\t\t\t\t\ttheKeys.push(String(name));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (hasDontEnumBug) {\n\t\t\tvar skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);\n\n\t\t\tfor (var k = 0; k < dontEnums.length; ++k) {\n\t\t\t\tif (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {\n\t\t\t\t\ttheKeys.push(dontEnums[k]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn theKeys;\n\t};\n}\nmodule.exports = keysShim;\n","'use strict';\n\nvar slice = Array.prototype.slice;\nvar isArgs = require('./isArguments');\n\nvar origKeys = Object.keys;\nvar keysShim = origKeys ? function keys(o) { return origKeys(o); } : require('./implementation');\n\nvar originalKeys = Object.keys;\n\nkeysShim.shim = function shimObjectKeys() {\n\tif (Object.keys) {\n\t\tvar keysWorksWithArguments = (function () {\n\t\t\t// Safari 5.0 bug\n\t\t\tvar args = Object.keys(arguments);\n\t\t\treturn args && args.length === arguments.length;\n\t\t}(1, 2));\n\t\tif (!keysWorksWithArguments) {\n\t\t\tObject.keys = function keys(object) { // eslint-disable-line func-name-matching\n\t\t\t\tif (isArgs(object)) {\n\t\t\t\t\treturn originalKeys(slice.call(object));\n\t\t\t\t}\n\t\t\t\treturn originalKeys(object);\n\t\t\t};\n\t\t}\n\t} else {\n\t\tObject.keys = keysShim;\n\t}\n\treturn Object.keys || keysShim;\n};\n\nmodule.exports = keysShim;\n","'use strict';\n\nvar toStr = Object.prototype.toString;\n\nmodule.exports = function isArguments(value) {\n\tvar str = toStr.call(value);\n\tvar isArgs = str === '[object Arguments]';\n\tif (!isArgs) {\n\t\tisArgs = str !== '[object Array]' &&\n\t\t\tvalue !== null &&\n\t\t\ttypeof value === 'object' &&\n\t\t\ttypeof value.length === 'number' &&\n\t\t\tvalue.length >= 0 &&\n\t\t\ttoStr.call(value.callee) === '[object Function]';\n\t}\n\treturn isArgs;\n};\n","'use strict';\n\n// modified from https://github.com/es-shims/es6-shim\nvar objectKeys = require('object-keys');\nvar hasSymbols = require('has-symbols/shams')();\nvar callBound = require('call-bind/callBound');\nvar toObject = Object;\nvar $push = callBound('Array.prototype.push');\nvar $propIsEnumerable = callBound('Object.prototype.propertyIsEnumerable');\nvar originalGetSymbols = hasSymbols ? Object.getOwnPropertySymbols : null;\n\n// eslint-disable-next-line no-unused-vars\nmodule.exports = function assign(target, source1) {\n\tif (target == null) { throw new TypeError('target must be an object'); }\n\tvar to = toObject(target); // step 1\n\tif (arguments.length === 1) {\n\t\treturn to; // step 2\n\t}\n\tfor (var s = 1; s < arguments.length; ++s) {\n\t\tvar from = toObject(arguments[s]); // step 3.a.i\n\n\t\t// step 3.a.ii:\n\t\tvar keys = objectKeys(from);\n\t\tvar getSymbols = hasSymbols && (Object.getOwnPropertySymbols || originalGetSymbols);\n\t\tif (getSymbols) {\n\t\t\tvar syms = getSymbols(from);\n\t\t\tfor (var j = 0; j < syms.length; ++j) {\n\t\t\t\tvar key = syms[j];\n\t\t\t\tif ($propIsEnumerable(from, key)) {\n\t\t\t\t\t$push(keys, key);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// step 3.a.iii:\n\t\tfor (var i = 0; i < keys.length; ++i) {\n\t\t\tvar nextKey = keys[i];\n\t\t\tif ($propIsEnumerable(from, nextKey)) { // step 3.a.iii.2\n\t\t\t\tvar propValue = from[nextKey]; // step 3.a.iii.2.a\n\t\t\t\tto[nextKey] = propValue; // step 3.a.iii.2.b\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to; // step 4\n};\n","'use strict';\n\nvar implementation = require('./implementation');\n\nvar lacksProperEnumerationOrder = function () {\n\tif (!Object.assign) {\n\t\treturn false;\n\t}\n\t/*\n\t * v8, specifically in node 4.x, has a bug with incorrect property enumeration order\n\t * note: this does not detect the bug unless there's 20 characters\n\t */\n\tvar str = 'abcdefghijklmnopqrst';\n\tvar letters = str.split('');\n\tvar map = {};\n\tfor (var i = 0; i < letters.length; ++i) {\n\t\tmap[letters[i]] = letters[i];\n\t}\n\tvar obj = Object.assign({}, map);\n\tvar actual = '';\n\tfor (var k in obj) {\n\t\tactual += k;\n\t}\n\treturn str !== actual;\n};\n\nvar assignHasPendingExceptions = function () {\n\tif (!Object.assign || !Object.preventExtensions) {\n\t\treturn false;\n\t}\n\t/*\n\t * Firefox 37 still has \"pending exception\" logic in its Object.assign implementation,\n\t * which is 72% slower than our shim, and Firefox 40's native implementation.\n\t */\n\tvar thrower = Object.preventExtensions({ 1: 2 });\n\ttry {\n\t\tObject.assign(thrower, 'xy');\n\t} catch (e) {\n\t\treturn thrower[1] === 'y';\n\t}\n\treturn false;\n};\n\nmodule.exports = function getPolyfill() {\n\tif (!Object.assign) {\n\t\treturn implementation;\n\t}\n\tif (lacksProperEnumerationOrder()) {\n\t\treturn implementation;\n\t}\n\tif (assignHasPendingExceptions()) {\n\t\treturn implementation;\n\t}\n\treturn Object.assign;\n};\n","'use strict';\n\n/** @type {import('.')} */\nmodule.exports = [\n\t'Float16Array',\n\t'Float32Array',\n\t'Float64Array',\n\t'Int8Array',\n\t'Int16Array',\n\t'Int32Array',\n\t'Uint8Array',\n\t'Uint8ClampedArray',\n\t'Uint16Array',\n\t'Uint32Array',\n\t'BigInt64Array',\n\t'BigUint64Array'\n];\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\nvar define = require('define-data-property');\nvar hasDescriptors = require('has-property-descriptors')();\nvar gOPD = require('gopd');\n\nvar $TypeError = require('es-errors/type');\nvar $floor = GetIntrinsic('%Math.floor%');\n\n/** @type {import('.')} */\nmodule.exports = function setFunctionLength(fn, length) {\n\tif (typeof fn !== 'function') {\n\t\tthrow new $TypeError('`fn` is not a function');\n\t}\n\tif (typeof length !== 'number' || length < 0 || length > 0xFFFFFFFF || $floor(length) !== length) {\n\t\tthrow new $TypeError('`length` must be a positive 32-bit integer');\n\t}\n\n\tvar loose = arguments.length > 2 && !!arguments[2];\n\n\tvar functionLengthIsConfigurable = true;\n\tvar functionLengthIsWritable = true;\n\tif ('length' in fn && gOPD) {\n\t\tvar desc = gOPD(fn, 'length');\n\t\tif (desc && !desc.configurable) {\n\t\t\tfunctionLengthIsConfigurable = false;\n\t\t}\n\t\tif (desc && !desc.writable) {\n\t\t\tfunctionLengthIsWritable = false;\n\t\t}\n\t}\n\n\tif (functionLengthIsConfigurable || functionLengthIsWritable || !loose) {\n\t\tif (hasDescriptors) {\n\t\t\tdefine(/** @type {Parameters[0]} */ (fn), 'length', length, true, true);\n\t\t} else {\n\t\t\tdefine(/** @type {Parameters[0]} */ (fn), 'length', length);\n\t\t}\n\t}\n\treturn fn;\n};\n","\"use strict\";\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;","/* \n(The MIT License)\nCopyright (c) 2014-2021 Halász Ádám \nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// Unique Hexatridecimal ID Generator\n// ================================================\n\n// Dependencies\n// ================================================\nvar pid = typeof process !== 'undefined' && process.pid ? process.pid.toString(36) : '' ;\nvar address = '';\nif(typeof __webpack_require__ !== 'function' && typeof require !== 'undefined'){\n var mac = '', os = require('os'); \n if(os.networkInterfaces) var networkInterfaces = os.networkInterfaces();\n if(networkInterfaces){\n loop:\n for(let interface_key in networkInterfaces){\n const networkInterface = networkInterfaces[interface_key];\n const length = networkInterface.length;\n for(var i = 0; i < length; i++){\n if(networkInterface[i] !== undefined && networkInterface[i].mac && networkInterface[i].mac != '00:00:00:00:00:00'){\n mac = networkInterface[i].mac; break loop;\n }\n }\n }\n address = mac ? parseInt(mac.replace(/\\:|\\D+/gi, '')).toString(36) : '' ;\n }\n} \n\n// Exports\n// ================================================\nmodule.exports = module.exports.default = function(prefix, suffix){ return (prefix ? prefix : '') + address + pid + now().toString(36) + (suffix ? suffix : ''); }\nmodule.exports.process = function(prefix, suffix){ return (prefix ? prefix : '') + pid + now().toString(36) + (suffix ? suffix : ''); }\nmodule.exports.time = function(prefix, suffix){ return (prefix ? prefix : '') + now().toString(36) + (suffix ? suffix : ''); }\n\n// Helpers\n// ================================================\nfunction now(){\n var time = Date.now();\n var last = now.last || time;\n return now.last = time > last ? time : last + 1;\n}\n","module.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}","// Currently in sync with Node.js lib/internal/util/types.js\n// https://github.com/nodejs/node/commit/112cc7c27551254aa2b17098fb774867f05ed0d9\n\n'use strict';\n\nvar isArgumentsObject = require('is-arguments');\nvar isGeneratorFunction = require('is-generator-function');\nvar whichTypedArray = require('which-typed-array');\nvar isTypedArray = require('is-typed-array');\n\nfunction uncurryThis(f) {\n return f.call.bind(f);\n}\n\nvar BigIntSupported = typeof BigInt !== 'undefined';\nvar SymbolSupported = typeof Symbol !== 'undefined';\n\nvar ObjectToString = uncurryThis(Object.prototype.toString);\n\nvar numberValue = uncurryThis(Number.prototype.valueOf);\nvar stringValue = uncurryThis(String.prototype.valueOf);\nvar booleanValue = uncurryThis(Boolean.prototype.valueOf);\n\nif (BigIntSupported) {\n var bigIntValue = uncurryThis(BigInt.prototype.valueOf);\n}\n\nif (SymbolSupported) {\n var symbolValue = uncurryThis(Symbol.prototype.valueOf);\n}\n\nfunction checkBoxedPrimitive(value, prototypeValueOf) {\n if (typeof value !== 'object') {\n return false;\n }\n try {\n prototypeValueOf(value);\n return true;\n } catch(e) {\n return false;\n }\n}\n\nexports.isArgumentsObject = isArgumentsObject;\nexports.isGeneratorFunction = isGeneratorFunction;\nexports.isTypedArray = isTypedArray;\n\n// Taken from here and modified for better browser support\n// https://github.com/sindresorhus/p-is-promise/blob/cda35a513bda03f977ad5cde3a079d237e82d7ef/index.js\nfunction isPromise(input) {\n\treturn (\n\t\t(\n\t\t\ttypeof Promise !== 'undefined' &&\n\t\t\tinput instanceof Promise\n\t\t) ||\n\t\t(\n\t\t\tinput !== null &&\n\t\t\ttypeof input === 'object' &&\n\t\t\ttypeof input.then === 'function' &&\n\t\t\ttypeof input.catch === 'function'\n\t\t)\n\t);\n}\nexports.isPromise = isPromise;\n\nfunction isArrayBufferView(value) {\n if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {\n return ArrayBuffer.isView(value);\n }\n\n return (\n isTypedArray(value) ||\n isDataView(value)\n );\n}\nexports.isArrayBufferView = isArrayBufferView;\n\n\nfunction isUint8Array(value) {\n return whichTypedArray(value) === 'Uint8Array';\n}\nexports.isUint8Array = isUint8Array;\n\nfunction isUint8ClampedArray(value) {\n return whichTypedArray(value) === 'Uint8ClampedArray';\n}\nexports.isUint8ClampedArray = isUint8ClampedArray;\n\nfunction isUint16Array(value) {\n return whichTypedArray(value) === 'Uint16Array';\n}\nexports.isUint16Array = isUint16Array;\n\nfunction isUint32Array(value) {\n return whichTypedArray(value) === 'Uint32Array';\n}\nexports.isUint32Array = isUint32Array;\n\nfunction isInt8Array(value) {\n return whichTypedArray(value) === 'Int8Array';\n}\nexports.isInt8Array = isInt8Array;\n\nfunction isInt16Array(value) {\n return whichTypedArray(value) === 'Int16Array';\n}\nexports.isInt16Array = isInt16Array;\n\nfunction isInt32Array(value) {\n return whichTypedArray(value) === 'Int32Array';\n}\nexports.isInt32Array = isInt32Array;\n\nfunction isFloat32Array(value) {\n return whichTypedArray(value) === 'Float32Array';\n}\nexports.isFloat32Array = isFloat32Array;\n\nfunction isFloat64Array(value) {\n return whichTypedArray(value) === 'Float64Array';\n}\nexports.isFloat64Array = isFloat64Array;\n\nfunction isBigInt64Array(value) {\n return whichTypedArray(value) === 'BigInt64Array';\n}\nexports.isBigInt64Array = isBigInt64Array;\n\nfunction isBigUint64Array(value) {\n return whichTypedArray(value) === 'BigUint64Array';\n}\nexports.isBigUint64Array = isBigUint64Array;\n\nfunction isMapToString(value) {\n return ObjectToString(value) === '[object Map]';\n}\nisMapToString.working = (\n typeof Map !== 'undefined' &&\n isMapToString(new Map())\n);\n\nfunction isMap(value) {\n if (typeof Map === 'undefined') {\n return false;\n }\n\n return isMapToString.working\n ? isMapToString(value)\n : value instanceof Map;\n}\nexports.isMap = isMap;\n\nfunction isSetToString(value) {\n return ObjectToString(value) === '[object Set]';\n}\nisSetToString.working = (\n typeof Set !== 'undefined' &&\n isSetToString(new Set())\n);\nfunction isSet(value) {\n if (typeof Set === 'undefined') {\n return false;\n }\n\n return isSetToString.working\n ? isSetToString(value)\n : value instanceof Set;\n}\nexports.isSet = isSet;\n\nfunction isWeakMapToString(value) {\n return ObjectToString(value) === '[object WeakMap]';\n}\nisWeakMapToString.working = (\n typeof WeakMap !== 'undefined' &&\n isWeakMapToString(new WeakMap())\n);\nfunction isWeakMap(value) {\n if (typeof WeakMap === 'undefined') {\n return false;\n }\n\n return isWeakMapToString.working\n ? isWeakMapToString(value)\n : value instanceof WeakMap;\n}\nexports.isWeakMap = isWeakMap;\n\nfunction isWeakSetToString(value) {\n return ObjectToString(value) === '[object WeakSet]';\n}\nisWeakSetToString.working = (\n typeof WeakSet !== 'undefined' &&\n isWeakSetToString(new WeakSet())\n);\nfunction isWeakSet(value) {\n return isWeakSetToString(value);\n}\nexports.isWeakSet = isWeakSet;\n\nfunction isArrayBufferToString(value) {\n return ObjectToString(value) === '[object ArrayBuffer]';\n}\nisArrayBufferToString.working = (\n typeof ArrayBuffer !== 'undefined' &&\n isArrayBufferToString(new ArrayBuffer())\n);\nfunction isArrayBuffer(value) {\n if (typeof ArrayBuffer === 'undefined') {\n return false;\n }\n\n return isArrayBufferToString.working\n ? isArrayBufferToString(value)\n : value instanceof ArrayBuffer;\n}\nexports.isArrayBuffer = isArrayBuffer;\n\nfunction isDataViewToString(value) {\n return ObjectToString(value) === '[object DataView]';\n}\nisDataViewToString.working = (\n typeof ArrayBuffer !== 'undefined' &&\n typeof DataView !== 'undefined' &&\n isDataViewToString(new DataView(new ArrayBuffer(1), 0, 1))\n);\nfunction isDataView(value) {\n if (typeof DataView === 'undefined') {\n return false;\n }\n\n return isDataViewToString.working\n ? isDataViewToString(value)\n : value instanceof DataView;\n}\nexports.isDataView = isDataView;\n\n// Store a copy of SharedArrayBuffer in case it's deleted elsewhere\nvar SharedArrayBufferCopy = typeof SharedArrayBuffer !== 'undefined' ? SharedArrayBuffer : undefined;\nfunction isSharedArrayBufferToString(value) {\n return ObjectToString(value) === '[object SharedArrayBuffer]';\n}\nfunction isSharedArrayBuffer(value) {\n if (typeof SharedArrayBufferCopy === 'undefined') {\n return false;\n }\n\n if (typeof isSharedArrayBufferToString.working === 'undefined') {\n isSharedArrayBufferToString.working = isSharedArrayBufferToString(new SharedArrayBufferCopy());\n }\n\n return isSharedArrayBufferToString.working\n ? isSharedArrayBufferToString(value)\n : value instanceof SharedArrayBufferCopy;\n}\nexports.isSharedArrayBuffer = isSharedArrayBuffer;\n\nfunction isAsyncFunction(value) {\n return ObjectToString(value) === '[object AsyncFunction]';\n}\nexports.isAsyncFunction = isAsyncFunction;\n\nfunction isMapIterator(value) {\n return ObjectToString(value) === '[object Map Iterator]';\n}\nexports.isMapIterator = isMapIterator;\n\nfunction isSetIterator(value) {\n return ObjectToString(value) === '[object Set Iterator]';\n}\nexports.isSetIterator = isSetIterator;\n\nfunction isGeneratorObject(value) {\n return ObjectToString(value) === '[object Generator]';\n}\nexports.isGeneratorObject = isGeneratorObject;\n\nfunction isWebAssemblyCompiledModule(value) {\n return ObjectToString(value) === '[object WebAssembly.Module]';\n}\nexports.isWebAssemblyCompiledModule = isWebAssemblyCompiledModule;\n\nfunction isNumberObject(value) {\n return checkBoxedPrimitive(value, numberValue);\n}\nexports.isNumberObject = isNumberObject;\n\nfunction isStringObject(value) {\n return checkBoxedPrimitive(value, stringValue);\n}\nexports.isStringObject = isStringObject;\n\nfunction isBooleanObject(value) {\n return checkBoxedPrimitive(value, booleanValue);\n}\nexports.isBooleanObject = isBooleanObject;\n\nfunction isBigIntObject(value) {\n return BigIntSupported && checkBoxedPrimitive(value, bigIntValue);\n}\nexports.isBigIntObject = isBigIntObject;\n\nfunction isSymbolObject(value) {\n return SymbolSupported && checkBoxedPrimitive(value, symbolValue);\n}\nexports.isSymbolObject = isSymbolObject;\n\nfunction isBoxedPrimitive(value) {\n return (\n isNumberObject(value) ||\n isStringObject(value) ||\n isBooleanObject(value) ||\n isBigIntObject(value) ||\n isSymbolObject(value)\n );\n}\nexports.isBoxedPrimitive = isBoxedPrimitive;\n\nfunction isAnyArrayBuffer(value) {\n return typeof Uint8Array !== 'undefined' && (\n isArrayBuffer(value) ||\n isSharedArrayBuffer(value)\n );\n}\nexports.isAnyArrayBuffer = isAnyArrayBuffer;\n\n['isProxy', 'isExternal', 'isModuleNamespaceObject'].forEach(function(method) {\n Object.defineProperty(exports, method, {\n enumerable: false,\n value: function() {\n throw new Error(method + ' is not supported in userland');\n }\n });\n});\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar getOwnPropertyDescriptors = Object.getOwnPropertyDescriptors ||\n function getOwnPropertyDescriptors(obj) {\n var keys = Object.keys(obj);\n var descriptors = {};\n for (var i = 0; i < keys.length; i++) {\n descriptors[keys[i]] = Object.getOwnPropertyDescriptor(obj, keys[i]);\n }\n return descriptors;\n };\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n if (!isString(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull(x) || !isObject(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect(x);\n }\n }\n return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n if (typeof process !== 'undefined' && process.noDeprecation === true) {\n return fn;\n }\n\n // Allow for deprecating things in the process of starting up.\n if (typeof process === 'undefined') {\n return function() {\n return exports.deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (process.throwDeprecation) {\n throw new Error(msg);\n } else if (process.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnvRegex = /^$/;\n\nif (process.env.NODE_DEBUG) {\n var debugEnv = process.env.NODE_DEBUG;\n debugEnv = debugEnv.replace(/[|\\\\{}()[\\]^$+?.]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/,/g, '$|^')\n .toUpperCase();\n debugEnvRegex = new RegExp('^' + debugEnv + '$', 'i');\n}\nexports.debuglog = function(set) {\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (debugEnvRegex.test(set)) {\n var pid = process.pid;\n debugs[set] = function() {\n var msg = exports.format.apply(exports, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n exports._extend(ctx, opts);\n }\n // set default options\n if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined(ctx.depth)) ctx.depth = 2;\n if (isUndefined(ctx.colors)) ctx.colors = false;\n if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').slice(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.slice(1, -1);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nexports.types = require('./support/types');\n\nfunction isArray(ar) {\n return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\nexports.types.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\nexports.types.isDate = isDate;\n\nfunction isError(e) {\n return isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\nexports.types.isNativeError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n * prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nvar kCustomPromisifiedSymbol = typeof Symbol !== 'undefined' ? Symbol('util.promisify.custom') : undefined;\n\nexports.promisify = function promisify(original) {\n if (typeof original !== 'function')\n throw new TypeError('The \"original\" argument must be of type Function');\n\n if (kCustomPromisifiedSymbol && original[kCustomPromisifiedSymbol]) {\n var fn = original[kCustomPromisifiedSymbol];\n if (typeof fn !== 'function') {\n throw new TypeError('The \"util.promisify.custom\" argument must be of type Function');\n }\n Object.defineProperty(fn, kCustomPromisifiedSymbol, {\n value: fn, enumerable: false, writable: false, configurable: true\n });\n return fn;\n }\n\n function fn() {\n var promiseResolve, promiseReject;\n var promise = new Promise(function (resolve, reject) {\n promiseResolve = resolve;\n promiseReject = reject;\n });\n\n var args = [];\n for (var i = 0; i < arguments.length; i++) {\n args.push(arguments[i]);\n }\n args.push(function (err, value) {\n if (err) {\n promiseReject(err);\n } else {\n promiseResolve(value);\n }\n });\n\n try {\n original.apply(this, args);\n } catch (err) {\n promiseReject(err);\n }\n\n return promise;\n }\n\n Object.setPrototypeOf(fn, Object.getPrototypeOf(original));\n\n if (kCustomPromisifiedSymbol) Object.defineProperty(fn, kCustomPromisifiedSymbol, {\n value: fn, enumerable: false, writable: false, configurable: true\n });\n return Object.defineProperties(\n fn,\n getOwnPropertyDescriptors(original)\n );\n}\n\nexports.promisify.custom = kCustomPromisifiedSymbol\n\nfunction callbackifyOnRejected(reason, cb) {\n // `!reason` guard inspired by bluebird (Ref: https://goo.gl/t5IS6M).\n // Because `null` is a special error value in callbacks which means \"no error\n // occurred\", we error-wrap so the callback consumer can distinguish between\n // \"the promise rejected with null\" or \"the promise fulfilled with undefined\".\n if (!reason) {\n var newReason = new Error('Promise was rejected with a falsy value');\n newReason.reason = reason;\n reason = newReason;\n }\n return cb(reason);\n}\n\nfunction callbackify(original) {\n if (typeof original !== 'function') {\n throw new TypeError('The \"original\" argument must be of type Function');\n }\n\n // We DO NOT return the promise as it gives the user a false sense that\n // the promise is actually somehow related to the callback's execution\n // and that the callback throwing will reject the promise.\n function callbackified() {\n var args = [];\n for (var i = 0; i < arguments.length; i++) {\n args.push(arguments[i]);\n }\n\n var maybeCb = args.pop();\n if (typeof maybeCb !== 'function') {\n throw new TypeError('The last argument must be of type Function');\n }\n var self = this;\n var cb = function() {\n return maybeCb.apply(self, arguments);\n };\n // In true node style we process the callback on `nextTick` with all the\n // implications (stack, `uncaughtException`, `async_hooks`)\n original.apply(this, args)\n .then(function(ret) { process.nextTick(cb.bind(null, null, ret)) },\n function(rej) { process.nextTick(callbackifyOnRejected.bind(null, rej, cb)) });\n }\n\n Object.setPrototypeOf(callbackified, Object.getPrototypeOf(original));\n Object.defineProperties(callbackified,\n getOwnPropertyDescriptors(original));\n return callbackified;\n}\nexports.callbackify = callbackify;\n","'use strict';\n\nvar forEach = require('for-each');\nvar availableTypedArrays = require('available-typed-arrays');\nvar callBind = require('call-bind');\nvar callBound = require('call-bound');\nvar gOPD = require('gopd');\nvar getProto = require('get-proto');\n\nvar $toString = callBound('Object.prototype.toString');\nvar hasToStringTag = require('has-tostringtag/shams')();\n\nvar g = typeof globalThis === 'undefined' ? global : globalThis;\nvar typedArrays = availableTypedArrays();\n\nvar $slice = callBound('String.prototype.slice');\n\n/** @type {(array: readonly T[], value: unknown) => number} */\nvar $indexOf = callBound('Array.prototype.indexOf', true) || function indexOf(array, value) {\n\tfor (var i = 0; i < array.length; i += 1) {\n\t\tif (array[i] === value) {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n};\n\n/** @typedef {import('./types').Getter} Getter */\n/** @type {import('./types').Cache} */\nvar cache = { __proto__: null };\nif (hasToStringTag && gOPD && getProto) {\n\tforEach(typedArrays, function (typedArray) {\n\t\tvar arr = new g[typedArray]();\n\t\tif (Symbol.toStringTag in arr && getProto) {\n\t\t\tvar proto = getProto(arr);\n\t\t\t// @ts-expect-error TS won't narrow inside a closure\n\t\t\tvar descriptor = gOPD(proto, Symbol.toStringTag);\n\t\t\tif (!descriptor && proto) {\n\t\t\t\tvar superProto = getProto(proto);\n\t\t\t\t// @ts-expect-error TS won't narrow inside a closure\n\t\t\t\tdescriptor = gOPD(superProto, Symbol.toStringTag);\n\t\t\t}\n\t\t\t// @ts-expect-error TODO: fix\n\t\t\tcache['$' + typedArray] = callBind(descriptor.get);\n\t\t}\n\t});\n} else {\n\tforEach(typedArrays, function (typedArray) {\n\t\tvar arr = new g[typedArray]();\n\t\tvar fn = arr.slice || arr.set;\n\t\tif (fn) {\n\t\t\tcache[\n\t\t\t\t/** @type {`$${import('.').TypedArrayName}`} */ ('$' + typedArray)\n\t\t\t] = /** @type {import('./types').BoundSlice | import('./types').BoundSet} */ (\n\t\t\t\t// @ts-expect-error TODO FIXME\n\t\t\t\tcallBind(fn)\n\t\t\t);\n\t\t}\n\t});\n}\n\n/** @type {(value: object) => false | import('.').TypedArrayName} */\nvar tryTypedArrays = function tryAllTypedArrays(value) {\n\t/** @type {ReturnType} */ var found = false;\n\tforEach(\n\t\t/** @type {Record<`\\$${import('.').TypedArrayName}`, Getter>} */ (cache),\n\t\t/** @type {(getter: Getter, name: `\\$${import('.').TypedArrayName}`) => void} */\n\t\tfunction (getter, typedArray) {\n\t\t\tif (!found) {\n\t\t\t\ttry {\n\t\t\t\t\t// @ts-expect-error a throw is fine here\n\t\t\t\t\tif ('$' + getter(value) === typedArray) {\n\t\t\t\t\t\tfound = /** @type {import('.').TypedArrayName} */ ($slice(typedArray, 1));\n\t\t\t\t\t}\n\t\t\t\t} catch (e) { /**/ }\n\t\t\t}\n\t\t}\n\t);\n\treturn found;\n};\n\n/** @type {(value: object) => false | import('.').TypedArrayName} */\nvar trySlices = function tryAllSlices(value) {\n\t/** @type {ReturnType} */ var found = false;\n\tforEach(\n\t\t/** @type {Record<`\\$${import('.').TypedArrayName}`, Getter>} */(cache),\n\t\t/** @type {(getter: Getter, name: `\\$${import('.').TypedArrayName}`) => void} */ function (getter, name) {\n\t\t\tif (!found) {\n\t\t\t\ttry {\n\t\t\t\t\t// @ts-expect-error a throw is fine here\n\t\t\t\t\tgetter(value);\n\t\t\t\t\tfound = /** @type {import('.').TypedArrayName} */ ($slice(name, 1));\n\t\t\t\t} catch (e) { /**/ }\n\t\t\t}\n\t\t}\n\t);\n\treturn found;\n};\n\n/** @type {import('.')} */\nmodule.exports = function whichTypedArray(value) {\n\tif (!value || typeof value !== 'object') { return false; }\n\tif (!hasToStringTag) {\n\t\t/** @type {string} */\n\t\tvar tag = $slice($toString(value), 8, -1);\n\t\tif ($indexOf(typedArrays, tag) > -1) {\n\t\t\treturn tag;\n\t\t}\n\t\tif (tag !== 'Object') {\n\t\t\treturn false;\n\t\t}\n\t\t// node < 0.6 hits here on real Typed Arrays\n\t\treturn trySlices(value);\n\t}\n\tif (!gOPD) { return null; } // unknown engine\n\treturn tryTypedArrays(value);\n};\n","module.exports = window[\"PropTypes\"];","module.exports = window[\"React\"];","module.exports = window[\"ReactDOM\"];","'use strict';\n\nvar possibleNames = require('possible-typed-array-names');\n\nvar g = typeof globalThis === 'undefined' ? global : globalThis;\n\n/** @type {import('.')} */\nmodule.exports = function availableTypedArrays() {\n\tvar /** @type {ReturnType} */ out = [];\n\tfor (var i = 0; i < possibleNames.length; i++) {\n\t\tif (typeof g[possibleNames[i]] === 'function') {\n\t\t\t// @ts-expect-error\n\t\t\tout[out.length] = possibleNames[i];\n\t\t}\n\t}\n\treturn out;\n};\n","let defaultOptions = {};\n\nexport function getDefaultOptions() {\n return defaultOptions;\n}\n\nexport function setDefaultOptions(newOptions) {\n defaultOptions = newOptions;\n}\n","const dateLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"P\":\n return formatLong.date({ width: \"short\" });\n case \"PP\":\n return formatLong.date({ width: \"medium\" });\n case \"PPP\":\n return formatLong.date({ width: \"long\" });\n case \"PPPP\":\n default:\n return formatLong.date({ width: \"full\" });\n }\n};\n\nconst timeLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"p\":\n return formatLong.time({ width: \"short\" });\n case \"pp\":\n return formatLong.time({ width: \"medium\" });\n case \"ppp\":\n return formatLong.time({ width: \"long\" });\n case \"pppp\":\n default:\n return formatLong.time({ width: \"full\" });\n }\n};\n\nconst dateTimeLongFormatter = (pattern, formatLong) => {\n const matchResult = pattern.match(/(P+)(p+)?/) || [];\n const datePattern = matchResult[1];\n const timePattern = matchResult[2];\n\n if (!timePattern) {\n return dateLongFormatter(pattern, formatLong);\n }\n\n let dateTimeFormat;\n\n switch (datePattern) {\n case \"P\":\n dateTimeFormat = formatLong.dateTime({ width: \"short\" });\n break;\n case \"PP\":\n dateTimeFormat = formatLong.dateTime({ width: \"medium\" });\n break;\n case \"PPP\":\n dateTimeFormat = formatLong.dateTime({ width: \"long\" });\n break;\n case \"PPPP\":\n default:\n dateTimeFormat = formatLong.dateTime({ width: \"full\" });\n break;\n }\n\n return dateTimeFormat\n .replace(\"{{date}}\", dateLongFormatter(datePattern, formatLong))\n .replace(\"{{time}}\", timeLongFormatter(timePattern, formatLong));\n};\n\nexport const longFormatters = {\n p: timeLongFormatter,\n P: dateTimeLongFormatter,\n};\n","import { toDate } from \"../toDate.js\";\n\n/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport function getTimezoneOffsetInMilliseconds(date) {\n const _date = toDate(date);\n const utcDate = new Date(\n Date.UTC(\n _date.getFullYear(),\n _date.getMonth(),\n _date.getDate(),\n _date.getHours(),\n _date.getMinutes(),\n _date.getSeconds(),\n _date.getMilliseconds(),\n ),\n );\n utcDate.setUTCFullYear(_date.getFullYear());\n return +date - +utcDate;\n}\n","import { constructFrom } from \"../constructFrom.js\";\n\nexport function normalizeDates(context, ...dates) {\n const normalize = constructFrom.bind(\n null,\n context || dates.find((date) => typeof date === \"object\"),\n );\n return dates.map(normalize);\n}\n","const dayOfYearTokenRE = /^D+$/;\nconst weekYearTokenRE = /^Y+$/;\n\nconst throwTokens = [\"D\", \"DD\", \"YY\", \"YYYY\"];\n\nexport function isProtectedDayOfYearToken(token) {\n return dayOfYearTokenRE.test(token);\n}\n\nexport function isProtectedWeekYearToken(token) {\n return weekYearTokenRE.test(token);\n}\n\nexport function warnOrThrowProtectedError(token, format, input) {\n const _message = message(token, format, input);\n console.warn(_message);\n if (throwTokens.includes(token)) throw new RangeError(_message);\n}\n\nfunction message(token, format, input) {\n const subject = token[0] === \"Y\" ? \"years\" : \"days of the month\";\n return `Use \\`${token.toLowerCase()}\\` instead of \\`${token}\\` (in \\`${format}\\`) for formatting ${subject} to the input \\`${input}\\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;\n}\n","/**\n * @module constants\n * @summary Useful constants\n * @description\n * Collection of useful date constants.\n *\n * The constants could be imported from `date-fns/constants`:\n *\n * ```ts\n * import { maxTime, minTime } from \"./constants/date-fns/constants\";\n *\n * function isAllowedTime(time) {\n * return time <= maxTime && time >= minTime;\n * }\n * ```\n */\n\n/**\n * @constant\n * @name daysInWeek\n * @summary Days in 1 week.\n */\nexport const daysInWeek = 7;\n\n/**\n * @constant\n * @name daysInYear\n * @summary Days in 1 year.\n *\n * @description\n * How many days in a year.\n *\n * One years equals 365.2425 days according to the formula:\n *\n * > Leap year occurs every 4 years, except for years that are divisible by 100 and not divisible by 400.\n * > 1 mean year = (365+1/4-1/100+1/400) days = 365.2425 days\n */\nexport const daysInYear = 365.2425;\n\n/**\n * @constant\n * @name maxTime\n * @summary Maximum allowed time.\n *\n * @example\n * import { maxTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = 8640000000000001 <= maxTime;\n * //=> false\n *\n * new Date(8640000000000001);\n * //=> Invalid Date\n */\nexport const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;\n\n/**\n * @constant\n * @name minTime\n * @summary Minimum allowed time.\n *\n * @example\n * import { minTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = -8640000000000001 >= minTime;\n * //=> false\n *\n * new Date(-8640000000000001)\n * //=> Invalid Date\n */\nexport const minTime = -maxTime;\n\n/**\n * @constant\n * @name millisecondsInWeek\n * @summary Milliseconds in 1 week.\n */\nexport const millisecondsInWeek = 604800000;\n\n/**\n * @constant\n * @name millisecondsInDay\n * @summary Milliseconds in 1 day.\n */\nexport const millisecondsInDay = 86400000;\n\n/**\n * @constant\n * @name millisecondsInMinute\n * @summary Milliseconds in 1 minute\n */\nexport const millisecondsInMinute = 60000;\n\n/**\n * @constant\n * @name millisecondsInHour\n * @summary Milliseconds in 1 hour\n */\nexport const millisecondsInHour = 3600000;\n\n/**\n * @constant\n * @name millisecondsInSecond\n * @summary Milliseconds in 1 second\n */\nexport const millisecondsInSecond = 1000;\n\n/**\n * @constant\n * @name minutesInYear\n * @summary Minutes in 1 year.\n */\nexport const minutesInYear = 525600;\n\n/**\n * @constant\n * @name minutesInMonth\n * @summary Minutes in 1 month.\n */\nexport const minutesInMonth = 43200;\n\n/**\n * @constant\n * @name minutesInDay\n * @summary Minutes in 1 day.\n */\nexport const minutesInDay = 1440;\n\n/**\n * @constant\n * @name minutesInHour\n * @summary Minutes in 1 hour.\n */\nexport const minutesInHour = 60;\n\n/**\n * @constant\n * @name monthsInQuarter\n * @summary Months in 1 quarter.\n */\nexport const monthsInQuarter = 3;\n\n/**\n * @constant\n * @name monthsInYear\n * @summary Months in 1 year.\n */\nexport const monthsInYear = 12;\n\n/**\n * @constant\n * @name quartersInYear\n * @summary Quarters in 1 year\n */\nexport const quartersInYear = 4;\n\n/**\n * @constant\n * @name secondsInHour\n * @summary Seconds in 1 hour.\n */\nexport const secondsInHour = 3600;\n\n/**\n * @constant\n * @name secondsInMinute\n * @summary Seconds in 1 minute.\n */\nexport const secondsInMinute = 60;\n\n/**\n * @constant\n * @name secondsInDay\n * @summary Seconds in 1 day.\n */\nexport const secondsInDay = secondsInHour * 24;\n\n/**\n * @constant\n * @name secondsInWeek\n * @summary Seconds in 1 week.\n */\nexport const secondsInWeek = secondsInDay * 7;\n\n/**\n * @constant\n * @name secondsInYear\n * @summary Seconds in 1 year.\n */\nexport const secondsInYear = secondsInDay * daysInYear;\n\n/**\n * @constant\n * @name secondsInMonth\n * @summary Seconds in 1 month\n */\nexport const secondsInMonth = secondsInYear / 12;\n\n/**\n * @constant\n * @name secondsInQuarter\n * @summary Seconds in 1 quarter.\n */\nexport const secondsInQuarter = secondsInMonth * 3;\n\n/**\n * @constant\n * @name constructFromSymbol\n * @summary Symbol enabling Date extensions to inherit properties from the reference date.\n *\n * The symbol is used to enable the `constructFrom` function to construct a date\n * using a reference date and a value. It allows to transfer extra properties\n * from the reference date to the new date. It's useful for extensions like\n * [`TZDate`](https://github.com/date-fns/tz) that accept a time zone as\n * a constructor argument.\n */\nexport const constructFromSymbol = Symbol.for(\"constructDateFrom\");\n","import { constructFromSymbol } from \"./constants.js\";\n\n/**\n * @name constructFrom\n * @category Generic Helpers\n * @summary Constructs a date using the reference date and the value\n *\n * @description\n * The function constructs a new date using the constructor from the reference\n * date and the given value. It helps to build generic functions that accept\n * date extensions.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * Starting from v3.7.0, it allows to construct a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The reference date to take constructor from\n * @param value - The value to create the date\n *\n * @returns Date initialized using the given date and value\n *\n * @example\n * import { constructFrom } from \"./constructFrom/date-fns\";\n *\n * // A function that clones a date preserving the original type\n * function cloneDate(date: DateType): DateType {\n * return constructFrom(\n * date, // Use constructor from the given date\n * date.getTime() // Use the date value to create a new date\n * );\n * }\n */\nexport function constructFrom(date, value) {\n if (typeof date === \"function\") return date(value);\n\n if (date && typeof date === \"object\" && constructFromSymbol in date)\n return date[constructFromSymbol](value);\n\n if (date instanceof Date) return new date.constructor(value);\n\n return new Date(value);\n}\n\n// Fallback for modularized imports:\nexport default constructFrom;\n","import { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { millisecondsInDay } from \"./constants.js\";\nimport { startOfDay } from \"./startOfDay.js\";\n\n/**\n * The {@link differenceInCalendarDays} function options.\n */\n\n/**\n * @name differenceInCalendarDays\n * @category Day Helpers\n * @summary Get the number of calendar days between the given dates.\n *\n * @description\n * Get the number of calendar days between the given dates. This means that the times are removed\n * from the dates and then the difference in days is calculated.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - The options object\n *\n * @returns The number of calendar days\n *\n * @example\n * // How many calendar days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInCalendarDays(\n * new Date(2012, 6, 2, 0, 0),\n * new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 366\n * // How many calendar days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInCalendarDays(\n * new Date(2011, 6, 3, 0, 1),\n * new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 1\n */\nexport function differenceInCalendarDays(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n\n const laterStartOfDay = startOfDay(laterDate_);\n const earlierStartOfDay = startOfDay(earlierDate_);\n\n const laterTimestamp =\n +laterStartOfDay - getTimezoneOffsetInMilliseconds(laterStartOfDay);\n const earlierTimestamp =\n +earlierStartOfDay - getTimezoneOffsetInMilliseconds(earlierStartOfDay);\n\n // Round the number of days to the nearest integer because the number of\n // milliseconds in a day is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round((laterTimestamp - earlierTimestamp) / millisecondsInDay);\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarDays;\n","import { differenceInCalendarDays } from \"./differenceInCalendarDays.js\";\nimport { startOfYear } from \"./startOfYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getDayOfYear} function options.\n */\n\n/**\n * @name getDayOfYear\n * @category Day Helpers\n * @summary Get the day of the year of the given date.\n *\n * @description\n * Get the day of the year of the given date.\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The day of year\n *\n * @example\n * // Which day of the year is 2 July 2014?\n * const result = getDayOfYear(new Date(2014, 6, 2))\n * //=> 183\n */\nexport function getDayOfYear(date, options) {\n const _date = toDate(date, options?.in);\n const diff = differenceInCalendarDays(_date, startOfYear(_date));\n const dayOfYear = diff + 1;\n return dayOfYear;\n}\n\n// Fallback for modularized imports:\nexport default getDayOfYear;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfYear} function options.\n */\n\n/**\n * @name startOfYear\n * @category Year Helpers\n * @summary Return the start of a year for the given date.\n *\n * @description\n * Return the start of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a year\n *\n * @example\n * // The start of a year for 2 September 2014 11:55:00:\n * const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Jan 01 2014 00:00:00\n */\nexport function startOfYear(date, options) {\n const date_ = toDate(date, options?.in);\n date_.setFullYear(date_.getFullYear(), 0, 1);\n date_.setHours(0, 0, 0, 0);\n return date_;\n}\n\n// Fallback for modularized imports:\nexport default startOfYear;\n","export function addLeadingZeros(number, targetLength) {\n const sign = number < 0 ? \"-\" : \"\";\n const output = Math.abs(number).toString().padStart(targetLength, \"0\");\n return sign + output;\n}\n","import { addLeadingZeros } from \"../addLeadingZeros.js\";\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | |\n * | d | Day of month | D | |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | m | Minute | M | Month |\n * | s | Second | S | Fraction of second |\n * | y | Year (abs) | Y | |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n */\n\nexport const lightFormatters = {\n // Year\n y(date, token) {\n // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens\n // | Year | y | yy | yyy | yyyy | yyyyy |\n // |----------|-------|----|-------|-------|-------|\n // | AD 1 | 1 | 01 | 001 | 0001 | 00001 |\n // | AD 12 | 12 | 12 | 012 | 0012 | 00012 |\n // | AD 123 | 123 | 23 | 123 | 0123 | 00123 |\n // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 |\n // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return addLeadingZeros(token === \"yy\" ? year % 100 : year, token.length);\n },\n\n // Month\n M(date, token) {\n const month = date.getMonth();\n return token === \"M\" ? String(month + 1) : addLeadingZeros(month + 1, 2);\n },\n\n // Day of the month\n d(date, token) {\n return addLeadingZeros(date.getDate(), token.length);\n },\n\n // AM or PM\n a(date, token) {\n const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return dayPeriodEnumValue.toUpperCase();\n case \"aaa\":\n return dayPeriodEnumValue;\n case \"aaaaa\":\n return dayPeriodEnumValue[0];\n case \"aaaa\":\n default:\n return dayPeriodEnumValue === \"am\" ? \"a.m.\" : \"p.m.\";\n }\n },\n\n // Hour [1-12]\n h(date, token) {\n return addLeadingZeros(date.getHours() % 12 || 12, token.length);\n },\n\n // Hour [0-23]\n H(date, token) {\n return addLeadingZeros(date.getHours(), token.length);\n },\n\n // Minute\n m(date, token) {\n return addLeadingZeros(date.getMinutes(), token.length);\n },\n\n // Second\n s(date, token) {\n return addLeadingZeros(date.getSeconds(), token.length);\n },\n\n // Fraction of second\n S(date, token) {\n const numberOfDigits = token.length;\n const milliseconds = date.getMilliseconds();\n const fractionalSeconds = Math.trunc(\n milliseconds * Math.pow(10, numberOfDigits - 3),\n );\n return addLeadingZeros(fractionalSeconds, token.length);\n },\n};\n","import { getDayOfYear } from \"../../getDayOfYear.js\";\nimport { getISOWeek } from \"../../getISOWeek.js\";\nimport { getISOWeekYear } from \"../../getISOWeekYear.js\";\nimport { getWeek } from \"../../getWeek.js\";\nimport { getWeekYear } from \"../../getWeekYear.js\";\n\nimport { addLeadingZeros } from \"../addLeadingZeros.js\";\nimport { lightFormatters } from \"./lightFormatters.js\";\n\nconst dayPeriodEnum = {\n am: \"am\",\n pm: \"pm\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n};\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | Milliseconds in day |\n * | b | AM, PM, noon, midnight | B | Flexible day period |\n * | c | Stand-alone local day of week | C* | Localized hour w/ day period |\n * | d | Day of month | D | Day of year |\n * | e | Local day of week | E | Day of week |\n * | f | | F* | Day of week in month |\n * | g* | Modified Julian day | G | Era |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | i! | ISO day of week | I! | ISO week of year |\n * | j* | Localized hour w/ day period | J* | Localized hour w/o day period |\n * | k | Hour [1-24] | K | Hour [0-11] |\n * | l* | (deprecated) | L | Stand-alone month |\n * | m | Minute | M | Month |\n * | n | | N | |\n * | o! | Ordinal number modifier | O | Timezone (GMT) |\n * | p! | Long localized time | P! | Long localized date |\n * | q | Stand-alone quarter | Q | Quarter |\n * | r* | Related Gregorian year | R! | ISO week-numbering year |\n * | s | Second | S | Fraction of second |\n * | t! | Seconds timestamp | T! | Milliseconds timestamp |\n * | u | Extended year | U* | Cyclic year |\n * | v* | Timezone (generic non-locat.) | V* | Timezone (location) |\n * | w | Local week of year | W* | Week of month |\n * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) |\n * | y | Year (abs) | Y | Local week-numbering year |\n * | z | Timezone (specific non-locat.) | Z* | Timezone (aliases) |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `format` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n * i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n * `R` is supposed to be used in conjunction with `I` and `i`\n * for universal ISO week-numbering date, whereas\n * `Y` is supposed to be used in conjunction with `w` and `e`\n * for week-numbering date specific to the locale.\n * - `P` is long localized date format\n * - `p` is long localized time format\n */\n\nexport const formatters = {\n // Era\n G: function (date, token, localize) {\n const era = date.getFullYear() > 0 ? 1 : 0;\n switch (token) {\n // AD, BC\n case \"G\":\n case \"GG\":\n case \"GGG\":\n return localize.era(era, { width: \"abbreviated\" });\n // A, B\n case \"GGGGG\":\n return localize.era(era, { width: \"narrow\" });\n // Anno Domini, Before Christ\n case \"GGGG\":\n default:\n return localize.era(era, { width: \"wide\" });\n }\n },\n\n // Year\n y: function (date, token, localize) {\n // Ordinal number\n if (token === \"yo\") {\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return localize.ordinalNumber(year, { unit: \"year\" });\n }\n\n return lightFormatters.y(date, token);\n },\n\n // Local week-numbering year\n Y: function (date, token, localize, options) {\n const signedWeekYear = getWeekYear(date, options);\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;\n\n // Two digit year\n if (token === \"YY\") {\n const twoDigitYear = weekYear % 100;\n return addLeadingZeros(twoDigitYear, 2);\n }\n\n // Ordinal number\n if (token === \"Yo\") {\n return localize.ordinalNumber(weekYear, { unit: \"year\" });\n }\n\n // Padding\n return addLeadingZeros(weekYear, token.length);\n },\n\n // ISO week-numbering year\n R: function (date, token) {\n const isoWeekYear = getISOWeekYear(date);\n\n // Padding\n return addLeadingZeros(isoWeekYear, token.length);\n },\n\n // Extended year. This is a single number designating the year of this calendar system.\n // The main difference between `y` and `u` localizers are B.C. years:\n // | Year | `y` | `u` |\n // |------|-----|-----|\n // | AC 1 | 1 | 1 |\n // | BC 1 | 1 | 0 |\n // | BC 2 | 2 | -1 |\n // Also `yy` always returns the last two digits of a year,\n // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n u: function (date, token) {\n const year = date.getFullYear();\n return addLeadingZeros(year, token.length);\n },\n\n // Quarter\n Q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"Q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"QQ\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"Qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"QQQ\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"QQQQQ\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"QQQQ\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone quarter\n q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"qq\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"qqq\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"qqqqq\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"qqqq\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // Month\n M: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n case \"M\":\n case \"MM\":\n return lightFormatters.M(date, token);\n // 1st, 2nd, ..., 12th\n case \"Mo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"MMM\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // J, F, ..., D\n case \"MMMMM\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // January, February, ..., December\n case \"MMMM\":\n default:\n return localize.month(month, { width: \"wide\", context: \"formatting\" });\n }\n },\n\n // Stand-alone month\n L: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n // 1, 2, ..., 12\n case \"L\":\n return String(month + 1);\n // 01, 02, ..., 12\n case \"LL\":\n return addLeadingZeros(month + 1, 2);\n // 1st, 2nd, ..., 12th\n case \"Lo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"LLL\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // J, F, ..., D\n case \"LLLLL\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // January, February, ..., December\n case \"LLLL\":\n default:\n return localize.month(month, { width: \"wide\", context: \"standalone\" });\n }\n },\n\n // Local week of year\n w: function (date, token, localize, options) {\n const week = getWeek(date, options);\n\n if (token === \"wo\") {\n return localize.ordinalNumber(week, { unit: \"week\" });\n }\n\n return addLeadingZeros(week, token.length);\n },\n\n // ISO week of year\n I: function (date, token, localize) {\n const isoWeek = getISOWeek(date);\n\n if (token === \"Io\") {\n return localize.ordinalNumber(isoWeek, { unit: \"week\" });\n }\n\n return addLeadingZeros(isoWeek, token.length);\n },\n\n // Day of the month\n d: function (date, token, localize) {\n if (token === \"do\") {\n return localize.ordinalNumber(date.getDate(), { unit: \"date\" });\n }\n\n return lightFormatters.d(date, token);\n },\n\n // Day of year\n D: function (date, token, localize) {\n const dayOfYear = getDayOfYear(date);\n\n if (token === \"Do\") {\n return localize.ordinalNumber(dayOfYear, { unit: \"dayOfYear\" });\n }\n\n return addLeadingZeros(dayOfYear, token.length);\n },\n\n // Day of week\n E: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n switch (token) {\n // Tue\n case \"E\":\n case \"EE\":\n case \"EEE\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"EEEEE\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"EEEEEE\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"EEEE\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Local day of week\n e: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (Nth day of week with current locale or weekStartsOn)\n case \"e\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"ee\":\n return addLeadingZeros(localDayOfWeek, 2);\n // 1st, 2nd, ..., 7th\n case \"eo\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"eee\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"eeeee\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"eeeeee\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"eeee\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone local day of week\n c: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (same as in `e`)\n case \"c\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"cc\":\n return addLeadingZeros(localDayOfWeek, token.length);\n // 1st, 2nd, ..., 7th\n case \"co\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"ccc\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // T\n case \"ccccc\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // Tu\n case \"cccccc\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"standalone\",\n });\n // Tuesday\n case \"cccc\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // ISO day of week\n i: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\n switch (token) {\n // 2\n case \"i\":\n return String(isoDayOfWeek);\n // 02\n case \"ii\":\n return addLeadingZeros(isoDayOfWeek, token.length);\n // 2nd\n case \"io\":\n return localize.ordinalNumber(isoDayOfWeek, { unit: \"day\" });\n // Tue\n case \"iii\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"iiiii\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"iiiiii\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"iiii\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM or PM\n a: function (date, token, localize) {\n const hours = date.getHours();\n const dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"aaa\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"aaaaa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"aaaa\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM, PM, midnight, noon\n b: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours === 12) {\n dayPeriodEnumValue = dayPeriodEnum.noon;\n } else if (hours === 0) {\n dayPeriodEnumValue = dayPeriodEnum.midnight;\n } else {\n dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n }\n\n switch (token) {\n case \"b\":\n case \"bb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"bbb\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"bbbbb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"bbbb\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // in the morning, in the afternoon, in the evening, at night\n B: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours >= 17) {\n dayPeriodEnumValue = dayPeriodEnum.evening;\n } else if (hours >= 12) {\n dayPeriodEnumValue = dayPeriodEnum.afternoon;\n } else if (hours >= 4) {\n dayPeriodEnumValue = dayPeriodEnum.morning;\n } else {\n dayPeriodEnumValue = dayPeriodEnum.night;\n }\n\n switch (token) {\n case \"B\":\n case \"BB\":\n case \"BBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"BBBBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"BBBB\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Hour [1-12]\n h: function (date, token, localize) {\n if (token === \"ho\") {\n let hours = date.getHours() % 12;\n if (hours === 0) hours = 12;\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return lightFormatters.h(date, token);\n },\n\n // Hour [0-23]\n H: function (date, token, localize) {\n if (token === \"Ho\") {\n return localize.ordinalNumber(date.getHours(), { unit: \"hour\" });\n }\n\n return lightFormatters.H(date, token);\n },\n\n // Hour [0-11]\n K: function (date, token, localize) {\n const hours = date.getHours() % 12;\n\n if (token === \"Ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Hour [1-24]\n k: function (date, token, localize) {\n let hours = date.getHours();\n if (hours === 0) hours = 24;\n\n if (token === \"ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Minute\n m: function (date, token, localize) {\n if (token === \"mo\") {\n return localize.ordinalNumber(date.getMinutes(), { unit: \"minute\" });\n }\n\n return lightFormatters.m(date, token);\n },\n\n // Second\n s: function (date, token, localize) {\n if (token === \"so\") {\n return localize.ordinalNumber(date.getSeconds(), { unit: \"second\" });\n }\n\n return lightFormatters.s(date, token);\n },\n\n // Fraction of second\n S: function (date, token) {\n return lightFormatters.S(date, token);\n },\n\n // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n X: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n if (timezoneOffset === 0) {\n return \"Z\";\n }\n\n switch (token) {\n // Hours and optional minutes\n case \"X\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XX`\n case \"XXXX\":\n case \"XX\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XXX`\n case \"XXXXX\":\n case \"XXX\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n x: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Hours and optional minutes\n case \"x\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xx`\n case \"xxxx\":\n case \"xx\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xxx`\n case \"xxxxx\":\n case \"xxx\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (GMT)\n O: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"O\":\n case \"OO\":\n case \"OOO\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"OOOO\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (specific non-location)\n z: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"z\":\n case \"zz\":\n case \"zzz\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"zzzz\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Seconds timestamp\n t: function (date, token, _localize) {\n const timestamp = Math.trunc(+date / 1000);\n return addLeadingZeros(timestamp, token.length);\n },\n\n // Milliseconds timestamp\n T: function (date, token, _localize) {\n return addLeadingZeros(+date, token.length);\n },\n};\n\nfunction formatTimezoneShort(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = Math.trunc(absOffset / 60);\n const minutes = absOffset % 60;\n if (minutes === 0) {\n return sign + String(hours);\n }\n return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);\n}\n\nfunction formatTimezoneWithOptionalMinutes(offset, delimiter) {\n if (offset % 60 === 0) {\n const sign = offset > 0 ? \"-\" : \"+\";\n return sign + addLeadingZeros(Math.abs(offset) / 60, 2);\n }\n return formatTimezone(offset, delimiter);\n}\n\nfunction formatTimezone(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);\n const minutes = addLeadingZeros(absOffset % 60, 2);\n return sign + hours + delimiter + minutes;\n}\n","import { defaultLocale } from \"./_lib/defaultLocale.js\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { formatters } from \"./_lib/format/formatters.js\";\nimport { longFormatters } from \"./_lib/format/longFormatters.js\";\nimport {\n isProtectedDayOfYearToken,\n isProtectedWeekYearToken,\n warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.js\";\nimport { isValid } from \"./isValid.js\";\nimport { toDate } from \"./toDate.js\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { formatters, longFormatters };\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n// (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n// except a single quote symbol, which ends the sequence.\n// Two quote characters do not end the sequence.\n// If there is no matching single quote\n// then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\nexport { format as formatDate };\n\n/**\n * The {@link format} function options.\n */\n\n/**\n * @name format\n * @alias formatDate\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format. The result may vary by locale.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n * (see the last example)\n *\n * Format of the string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 7 below the table).\n *\n * Accepted patterns:\n * | Unit | Pattern | Result examples | Notes |\n * |---------------------------------|---------|-----------------------------------|-------|\n * | Era | G..GGG | AD, BC | |\n * | | GGGG | Anno Domini, Before Christ | 2 |\n * | | GGGGG | A, B | |\n * | Calendar year | y | 44, 1, 1900, 2017 | 5 |\n * | | yo | 44th, 1st, 0th, 17th | 5,7 |\n * | | yy | 44, 01, 00, 17 | 5 |\n * | | yyy | 044, 001, 1900, 2017 | 5 |\n * | | yyyy | 0044, 0001, 1900, 2017 | 5 |\n * | | yyyyy | ... | 3,5 |\n * | Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |\n * | | Yo | 44th, 1st, 1900th, 2017th | 5,7 |\n * | | YY | 44, 01, 00, 17 | 5,8 |\n * | | YYY | 044, 001, 1900, 2017 | 5 |\n * | | YYYY | 0044, 0001, 1900, 2017 | 5,8 |\n * | | YYYYY | ... | 3,5 |\n * | ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |\n * | | RR | -43, 00, 01, 1900, 2017 | 5,7 |\n * | | RRR | -043, 000, 001, 1900, 2017 | 5,7 |\n * | | RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |\n * | | RRRRR | ... | 3,5,7 |\n * | Extended year | u | -43, 0, 1, 1900, 2017 | 5 |\n * | | uu | -43, 01, 1900, 2017 | 5 |\n * | | uuu | -043, 001, 1900, 2017 | 5 |\n * | | uuuu | -0043, 0001, 1900, 2017 | 5 |\n * | | uuuuu | ... | 3,5 |\n * | Quarter (formatting) | Q | 1, 2, 3, 4 | |\n * | | Qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | QQ | 01, 02, 03, 04 | |\n * | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | q | 1, 2, 3, 4 | |\n * | | qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | qq | 01, 02, 03, 04 | |\n * | | qqq | Q1, Q2, Q3, Q4 | |\n * | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | qqqqq | 1, 2, 3, 4 | 4 |\n * | Month (formatting) | M | 1, 2, ..., 12 | |\n * | | Mo | 1st, 2nd, ..., 12th | 7 |\n * | | MM | 01, 02, ..., 12 | |\n * | | MMM | Jan, Feb, ..., Dec | |\n * | | MMMM | January, February, ..., December | 2 |\n * | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | L | 1, 2, ..., 12 | |\n * | | Lo | 1st, 2nd, ..., 12th | 7 |\n * | | LL | 01, 02, ..., 12 | |\n * | | LLL | Jan, Feb, ..., Dec | |\n * | | LLLL | January, February, ..., December | 2 |\n * | | LLLLL | J, F, ..., D | |\n * | Local week of year | w | 1, 2, ..., 53 | |\n * | | wo | 1st, 2nd, ..., 53th | 7 |\n * | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | I | 1, 2, ..., 53 | 7 |\n * | | Io | 1st, 2nd, ..., 53th | 7 |\n * | | II | 01, 02, ..., 53 | 7 |\n * | Day of month | d | 1, 2, ..., 31 | |\n * | | do | 1st, 2nd, ..., 31st | 7 |\n * | | dd | 01, 02, ..., 31 | |\n * | Day of year | D | 1, 2, ..., 365, 366 | 9 |\n * | | Do | 1st, 2nd, ..., 365th, 366th | 7 |\n * | | DD | 01, 02, ..., 365, 366 | 9 |\n * | | DDD | 001, 002, ..., 365, 366 | |\n * | | DDDD | ... | 3 |\n * | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | |\n * | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | EEEEE | M, T, W, T, F, S, S | |\n * | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |\n * | | io | 1st, 2nd, ..., 7th | 7 |\n * | | ii | 01, 02, ..., 07 | 7 |\n * | | iii | Mon, Tue, Wed, ..., Sun | 7 |\n * | | iiii | Monday, Tuesday, ..., Sunday | 2,7 |\n * | | iiiii | M, T, W, T, F, S, S | 7 |\n * | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 |\n * | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |\n * | | eo | 2nd, 3rd, ..., 1st | 7 |\n * | | ee | 02, 03, ..., 01 | |\n * | | eee | Mon, Tue, Wed, ..., Sun | |\n * | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | eeeee | M, T, W, T, F, S, S | |\n * | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |\n * | | co | 2nd, 3rd, ..., 1st | 7 |\n * | | cc | 02, 03, ..., 01 | |\n * | | ccc | Mon, Tue, Wed, ..., Sun | |\n * | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | ccccc | M, T, W, T, F, S, S | |\n * | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | AM, PM | a..aa | AM, PM | |\n * | | aaa | am, pm | |\n * | | aaaa | a.m., p.m. | 2 |\n * | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | |\n * | | bbb | am, pm, noon, midnight | |\n * | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | bbbbb | a, p, n, mi | |\n * | Flexible day period | B..BBB | at night, in the morning, ... | |\n * | | BBBB | at night, in the morning, ... | 2 |\n * | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | h | 1, 2, ..., 11, 12 | |\n * | | ho | 1st, 2nd, ..., 11th, 12th | 7 |\n * | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | H | 0, 1, 2, ..., 23 | |\n * | | Ho | 0th, 1st, 2nd, ..., 23rd | 7 |\n * | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | K | 1, 2, ..., 11, 0 | |\n * | | Ko | 1st, 2nd, ..., 11th, 0th | 7 |\n * | | KK | 01, 02, ..., 11, 00 | |\n * | Hour [1-24] | k | 24, 1, 2, ..., 23 | |\n * | | ko | 24th, 1st, 2nd, ..., 23rd | 7 |\n * | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | m | 0, 1, ..., 59 | |\n * | | mo | 0th, 1st, ..., 59th | 7 |\n * | | mm | 00, 01, ..., 59 | |\n * | Second | s | 0, 1, ..., 59 | |\n * | | so | 0th, 1st, ..., 59th | 7 |\n * | | ss | 00, 01, ..., 59 | |\n * | Fraction of second | S | 0, 1, ..., 9 | |\n * | | SS | 00, 01, ..., 99 | |\n * | | SSS | 000, 001, ..., 999 | |\n * | | SSSS | ... | 3 |\n * | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |\n * | | XX | -0800, +0530, Z | |\n * | | XXX | -08:00, +05:30, Z | |\n * | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |\n * | | xx | -0800, +0530, +0000 | |\n * | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |\n * | | OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |\n * | Timezone (specific non-locat.) | z...zzz | GMT-8, GMT+5:30, GMT+0 | 6 |\n * | | zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | 2,6 |\n * | Seconds timestamp | t | 512969520 | 7 |\n * | | tt | ... | 3,7 |\n * | Milliseconds timestamp | T | 512969520900 | 7 |\n * | | TT | ... | 3,7 |\n * | Long localized date | P | 04/29/1453 | 7 |\n * | | PP | Apr 29, 1453 | 7 |\n * | | PPP | April 29th, 1453 | 7 |\n * | | PPPP | Friday, April 29th, 1453 | 2,7 |\n * | Long localized time | p | 12:00 AM | 7 |\n * | | pp | 12:00:00 AM | 7 |\n * | | ppp | 12:00:00 AM GMT+2 | 7 |\n * | | pppp | 12:00:00 AM GMT+02:00 | 2,7 |\n * | Combination of date and time | Pp | 04/29/1453, 12:00 AM | 7 |\n * | | PPpp | Apr 29, 1453, 12:00:00 AM | 7 |\n * | | PPPppp | April 29th, 1453 at ... | 7 |\n * | | PPPPpppp| Friday, April 29th, 1453 at ... | 2,7 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n * the output will be the same as default pattern for this unit, usually\n * the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n * are marked with \"2\" in the last column of the table.\n *\n * `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n *\n * `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n *\n * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n * The output will be padded with zeros to match the length of the pattern.\n *\n * `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n *\n * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 5. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` always returns the last two digits of a year,\n * while `uu` pads single digit years to 2 characters and returns other years unchanged:\n *\n * | Year | `yy` | `uu` |\n * |------|------|------|\n * | 1 | 01 | 01 |\n * | 14 | 14 | 14 |\n * | 376 | 76 | 376 |\n * | 1453 | 53 | 1453 |\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [getISOWeekYear](https://date-fns.org/docs/getISOWeekYear)\n * and [getWeekYear](https://date-fns.org/docs/getWeekYear)).\n *\n * 6. Specific non-location timezones are currently unavailable in `date-fns`,\n * so right now these tokens fall back to GMT timezones.\n *\n * 7. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `t`: seconds timestamp\n * - `T`: milliseconds timestamp\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @param date - The original date\n * @param format - The string of tokens\n * @param options - An object with options\n *\n * @returns The formatted date string\n *\n * @throws `date` must not be Invalid Date\n * @throws `options.locale` must contain `localize` property\n * @throws `options.locale` must contain `formatLong` property\n * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = format(new Date(2014, 6, 2), \"do 'de' MMMM yyyy\", {\n * locale: eoLocale\n * })\n * //=> '2-a de julio 2014'\n *\n * @example\n * // Escape string by single quote characters:\n * const result = format(new Date(2014, 6, 2, 15), \"h 'o''clock'\")\n * //=> \"3 o'clock\"\n */\nexport function format(date, formatStr, options) {\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const originalDate = toDate(date, options?.in);\n\n if (!isValid(originalDate)) {\n throw new RangeError(\"Invalid time value\");\n }\n\n let parts = formatStr\n .match(longFormattingTokensRegExp)\n .map((substring) => {\n const firstCharacter = substring[0];\n if (firstCharacter === \"p\" || firstCharacter === \"P\") {\n const longFormatter = longFormatters[firstCharacter];\n return longFormatter(substring, locale.formatLong);\n }\n return substring;\n })\n .join(\"\")\n .match(formattingTokensRegExp)\n .map((substring) => {\n // Replace two single quote characters with one single quote character\n if (substring === \"''\") {\n return { isToken: false, value: \"'\" };\n }\n\n const firstCharacter = substring[0];\n if (firstCharacter === \"'\") {\n return { isToken: false, value: cleanEscapedString(substring) };\n }\n\n if (formatters[firstCharacter]) {\n return { isToken: true, value: substring };\n }\n\n if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n throw new RangeError(\n \"Format string contains an unescaped latin alphabet character `\" +\n firstCharacter +\n \"`\",\n );\n }\n\n return { isToken: false, value: substring };\n });\n\n // invoke localize preprocessor (only for french locales at the moment)\n if (locale.localize.preprocessor) {\n parts = locale.localize.preprocessor(originalDate, parts);\n }\n\n const formatterOptions = {\n firstWeekContainsDate,\n weekStartsOn,\n locale,\n };\n\n return parts\n .map((part) => {\n if (!part.isToken) return part.value;\n\n const token = part.value;\n\n if (\n (!options?.useAdditionalWeekYearTokens &&\n isProtectedWeekYearToken(token)) ||\n (!options?.useAdditionalDayOfYearTokens &&\n isProtectedDayOfYearToken(token))\n ) {\n warnOrThrowProtectedError(token, formatStr, String(date));\n }\n\n const formatter = formatters[token[0]];\n return formatter(originalDate, token, locale.localize, formatterOptions);\n })\n .join(\"\");\n}\n\nfunction cleanEscapedString(input) {\n const matched = input.match(escapedStringRegExp);\n\n if (!matched) {\n return input;\n }\n\n return matched[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default format;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { getISOWeekYear } from \"./getISOWeekYear.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\n\n/**\n * The {@link startOfISOWeekYear} function options.\n */\n\n/**\n * @name startOfISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Return the start of an ISO week-numbering year for the given date.\n *\n * @description\n * Return the start of an ISO week-numbering year,\n * which always starts 3 days before the year's first Thursday.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week-numbering year\n *\n * @example\n * // The start of an ISO week-numbering year for 2 July 2005:\n * const result = startOfISOWeekYear(new Date(2005, 6, 2))\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfISOWeekYear(date, options) {\n const year = getISOWeekYear(date, options);\n const fourthOfJanuary = constructFrom(options?.in || date, 0);\n fourthOfJanuary.setFullYear(year, 0, 4);\n fourthOfJanuary.setHours(0, 0, 0, 0);\n return startOfISOWeek(fourthOfJanuary);\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeekYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { startOfISOWeekYear } from \"./startOfISOWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeek} function options.\n */\n\n/**\n * @name getISOWeek\n * @category ISO Week Helpers\n * @summary Get the ISO week of the given date.\n *\n * @description\n * Get the ISO week of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The ISO week\n *\n * @example\n * // Which week of the ISO-week numbering year is 2 January 2005?\n * const result = getISOWeek(new Date(2005, 0, 2))\n * //=> 53\n */\nexport function getISOWeek(date, options) {\n const _date = toDate(date, options?.in);\n const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getISOWeek;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeekYear} function options.\n */\n\n/**\n * @name getISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the ISO week-numbering year of the given date.\n *\n * @description\n * Get the ISO week-numbering year of the given date,\n * which always starts 3 days before the year's first Thursday.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n *\n * @returns The ISO week-numbering year\n *\n * @example\n * // Which ISO-week numbering year is 2 January 2005?\n * const result = getISOWeekYear(new Date(2005, 0, 2))\n * //=> 2004\n */\nexport function getISOWeekYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n\n const fourthOfJanuaryOfNextYear = constructFrom(_date, 0);\n fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);\n fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);\n\n const fourthOfJanuaryOfThisYear = constructFrom(_date, 0);\n fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);\n fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);\n\n if (_date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (_date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getISOWeekYear;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { getWeekYear } from \"./getWeekYear.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfWeekYear} function options.\n */\n\n/**\n * @name startOfWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Return the start of a local week-numbering year for the given date.\n *\n * @description\n * Return the start of a local week-numbering year.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week-numbering year\n *\n * @example\n * // The start of an a week-numbering year for 2 July 2005 with default settings:\n * const result = startOfWeekYear(new Date(2005, 6, 2))\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // The start of a week-numbering year for 2 July 2005\n * // if Monday is the first day of week\n * // and 4 January is always in the first week of the year:\n * const result = startOfWeekYear(new Date(2005, 6, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfWeekYear(date, options) {\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const year = getWeekYear(date, options);\n const firstWeek = constructFrom(options?.in || date, 0);\n firstWeek.setFullYear(year, 0, firstWeekContainsDate);\n firstWeek.setHours(0, 0, 0, 0);\n const _date = startOfWeek(firstWeek, options);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeekYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { startOfWeekYear } from \"./startOfWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeek} function options.\n */\n\n/**\n * @name getWeek\n * @category Week Helpers\n * @summary Get the local week index of the given date.\n *\n * @description\n * Get the local week index of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The week\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005 with default options?\n * const result = getWeek(new Date(2005, 0, 2))\n * //=> 2\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January?\n * const result = getWeek(new Date(2005, 0, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> 53\n */\nexport function getWeek(date, options) {\n const _date = toDate(date, options?.in);\n const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getWeek;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeekYear} function options.\n */\n\n/**\n * @name getWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Get the local week-numbering year of the given date.\n *\n * @description\n * Get the local week-numbering year of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options.\n *\n * @returns The local week-numbering year\n *\n * @example\n * // Which week numbering year is 26 December 2004 with the default settings?\n * const result = getWeekYear(new Date(2004, 11, 26))\n * //=> 2005\n *\n * @example\n * // Which week numbering year is 26 December 2004 if week starts on Saturday?\n * const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })\n * //=> 2004\n *\n * @example\n * // Which week numbering year is 26 December 2004 if the first week contains 4 January?\n * const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })\n * //=> 2004\n */\nexport function getWeekYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const firstWeekOfNextYear = constructFrom(options?.in || date, 0);\n firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);\n firstWeekOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);\n\n const firstWeekOfThisYear = constructFrom(options?.in || date, 0);\n firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);\n firstWeekOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);\n\n if (+_date >= +startOfNextYear) {\n return year + 1;\n } else if (+_date >= +startOfThisYear) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getWeekYear;\n","/**\n * @name isDate\n * @category Common Helpers\n * @summary Is the given value a date?\n *\n * @description\n * Returns true if the given value is an instance of Date. The function works for dates transferred across iframes.\n *\n * @param value - The value to check\n *\n * @returns True if the given value is a date\n *\n * @example\n * // For a valid date:\n * const result = isDate(new Date())\n * //=> true\n *\n * @example\n * // For an invalid date:\n * const result = isDate(new Date(NaN))\n * //=> true\n *\n * @example\n * // For some value:\n * const result = isDate('2014-02-31')\n * //=> false\n *\n * @example\n * // For an object:\n * const result = isDate({})\n * //=> false\n */\nexport function isDate(value) {\n return (\n value instanceof Date ||\n (typeof value === \"object\" &&\n Object.prototype.toString.call(value) === \"[object Date]\")\n );\n}\n\n// Fallback for modularized imports:\nexport default isDate;\n","import { isDate } from \"./isDate.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * @name isValid\n * @category Common Helpers\n * @summary Is the given date valid?\n *\n * @description\n * Returns false if argument is Invalid Date and true otherwise.\n * Argument is converted to Date using `toDate`. See [toDate](https://date-fns.org/docs/toDate)\n * Invalid Date is a Date, whose time value is NaN.\n *\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @param date - The date to check\n *\n * @returns The date is valid\n *\n * @example\n * // For the valid date:\n * const result = isValid(new Date(2014, 1, 31))\n * //=> true\n *\n * @example\n * // For the value, convertible into a date:\n * const result = isValid(1393804800000)\n * //=> true\n *\n * @example\n * // For the invalid date:\n * const result = isValid(new Date(''))\n * //=> false\n */\nexport function isValid(date) {\n return !((!isDate(date) && typeof date !== \"number\") || isNaN(+toDate(date)));\n}\n\n// Fallback for modularized imports:\nexport default isValid;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"less than a second\",\n other: \"less than {{count}} seconds\",\n },\n\n xSeconds: {\n one: \"1 second\",\n other: \"{{count}} seconds\",\n },\n\n halfAMinute: \"half a minute\",\n\n lessThanXMinutes: {\n one: \"less than a minute\",\n other: \"less than {{count}} minutes\",\n },\n\n xMinutes: {\n one: \"1 minute\",\n other: \"{{count}} minutes\",\n },\n\n aboutXHours: {\n one: \"about 1 hour\",\n other: \"about {{count}} hours\",\n },\n\n xHours: {\n one: \"1 hour\",\n other: \"{{count}} hours\",\n },\n\n xDays: {\n one: \"1 day\",\n other: \"{{count}} days\",\n },\n\n aboutXWeeks: {\n one: \"about 1 week\",\n other: \"about {{count}} weeks\",\n },\n\n xWeeks: {\n one: \"1 week\",\n other: \"{{count}} weeks\",\n },\n\n aboutXMonths: {\n one: \"about 1 month\",\n other: \"about {{count}} months\",\n },\n\n xMonths: {\n one: \"1 month\",\n other: \"{{count}} months\",\n },\n\n aboutXYears: {\n one: \"about 1 year\",\n other: \"about {{count}} years\",\n },\n\n xYears: {\n one: \"1 year\",\n other: \"{{count}} years\",\n },\n\n overXYears: {\n one: \"over 1 year\",\n other: \"over {{count}} years\",\n },\n\n almostXYears: {\n one: \"almost 1 year\",\n other: \"almost {{count}} years\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", count.toString());\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"in \" + result;\n } else {\n return result + \" ago\";\n }\n }\n\n return result;\n};\n","export function buildFormatLongFn(args) {\n return (options = {}) => {\n // TODO: Remove String()\n const width = options.width ? String(options.width) : args.defaultWidth;\n const format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.js\";\n\nconst dateFormats = {\n full: \"EEEE, MMMM do, y\",\n long: \"MMMM do, y\",\n medium: \"MMM d, y\",\n short: \"MM/dd/yyyy\",\n};\n\nconst timeFormats = {\n full: \"h:mm:ss a zzzz\",\n long: \"h:mm:ss a z\",\n medium: \"h:mm:ss a\",\n short: \"h:mm a\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'at' {{time}}\",\n long: \"{{date}} 'at' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"'last' eeee 'at' p\",\n yesterday: \"'yesterday at' p\",\n today: \"'today at' p\",\n tomorrow: \"'tomorrow at' p\",\n nextWeek: \"eeee 'at' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","/**\n * The localize function argument callback which allows to convert raw value to\n * the actual type.\n *\n * @param value - The value to convert\n *\n * @returns The converted value\n */\n\n/**\n * The map of localized values for each width.\n */\n\n/**\n * The index type of the locale unit value. It types conversion of units of\n * values that don't start at 0 (i.e. quarters).\n */\n\n/**\n * Converts the unit value to the tuple of values.\n */\n\n/**\n * The tuple of localized era values. The first element represents BC,\n * the second element represents AD.\n */\n\n/**\n * The tuple of localized quarter values. The first element represents Q1.\n */\n\n/**\n * The tuple of localized day values. The first element represents Sunday.\n */\n\n/**\n * The tuple of localized month values. The first element represents January.\n */\n\nexport function buildLocalizeFn(args) {\n return (value, options) => {\n const context = options?.context ? String(options.context) : \"standalone\";\n\n let valuesArray;\n if (context === \"formatting\" && args.formattingValues) {\n const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n const width = options?.width ? String(options.width) : defaultWidth;\n\n valuesArray =\n args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n const defaultWidth = args.defaultWidth;\n const width = options?.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[width] || args.values[defaultWidth];\n }\n const index = args.argumentCallback ? args.argumentCallback(value) : value;\n\n // @ts-expect-error - For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n return valuesArray[index];\n };\n}\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.js\";\n\nconst eraValues = {\n narrow: [\"B\", \"A\"],\n abbreviated: [\"BC\", \"AD\"],\n wide: [\"Before Christ\", \"Anno Domini\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1st quarter\", \"2nd quarter\", \"3rd quarter\", \"4th quarter\"],\n};\n\n// Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n\n wide: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n short: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n abbreviated: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n wide: [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n const number = Number(dirtyNumber);\n\n // If ordinal numbers depend on context, for example,\n // if they are different for different grammatical genders,\n // use `options.unit`.\n //\n // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n // 'day', 'hour', 'minute', 'second'.\n\n const rem100 = number % 100;\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + \"st\";\n case 2:\n return number + \"nd\";\n case 3:\n return number + \"rd\";\n }\n }\n return number + \"th\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","export function buildMatchFn(args) {\n return (string, options = {}) => {\n const width = options.width;\n\n const matchPattern =\n (width && args.matchPatterns[width]) ||\n args.matchPatterns[args.defaultMatchWidth];\n const matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n const matchedString = matchResult[0];\n\n const parsePatterns =\n (width && args.parsePatterns[width]) ||\n args.parsePatterns[args.defaultParseWidth];\n\n const key = Array.isArray(parsePatterns)\n ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))\n : // [TODO] -- I challenge you to fix the type\n findKey(parsePatterns, (pattern) => pattern.test(matchedString));\n\n let value;\n\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback\n ? // [TODO] -- I challenge you to fix the type\n options.valueCallback(value)\n : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n\nfunction findKey(object, predicate) {\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) &&\n predicate(object[key])\n ) {\n return key;\n }\n }\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (let key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n return undefined;\n}\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.js\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.js\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(b|a)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(before christ|before common era|anno domini|common era)/i,\n};\nconst parseEraPatterns = {\n any: [/^b/i, /^(a|c)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](th|st|nd|rd)? quarter/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ja/i,\n /^f/i,\n /^mar/i,\n /^ap/i,\n /^may/i,\n /^jun/i,\n /^jul/i,\n /^au/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[smtwf]/i,\n short: /^(su|mo|tu|we|th|fr|sa)/i,\n abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i,\n};\nconst parseDayPatterns = {\n narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mi/i,\n noon: /^no/i,\n morning: /morning/i,\n afternoon: /afternoon/i,\n evening: /evening/i,\n night: /night/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","export function buildMatchPatternFn(args) {\n return (string, options = {}) => {\n const matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n const matchedString = matchResult[0];\n\n const parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n let value = args.valueCallback\n ? args.valueCallback(parseResult[0])\n : parseResult[0];\n\n // [TODO] I challenge you to fix the type\n value = options.valueCallback ? options.valueCallback(value) : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n","import { formatDistance } from \"./en-US/_lib/formatDistance.js\";\nimport { formatLong } from \"./en-US/_lib/formatLong.js\";\nimport { formatRelative } from \"./en-US/_lib/formatRelative.js\";\nimport { localize } from \"./en-US/_lib/localize.js\";\nimport { match } from \"./en-US/_lib/match.js\";\n\n/**\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp](https://github.com/kossnocorp)\n * @author Lesha Koss [@leshakoss](https://github.com/leshakoss)\n */\nexport const enUS = {\n code: \"en-US\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default enUS;\n","import {\n millisecondsInHour,\n millisecondsInMinute,\n} from \"./constants.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link parseISO} function options.\n */\n\n/**\n * @name parseISO\n * @category Common Helpers\n * @summary Parse ISO string\n *\n * @description\n * Parse the given string in ISO 8601 format and return an instance of Date.\n *\n * Function accepts complete ISO 8601 formats as well as partial implementations.\n * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601\n *\n * If the argument isn't a string, the function cannot parse the string or\n * the values are invalid, it returns Invalid Date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n * @param options - An object with options\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Convert string '2014-02-11T11:30:30' to date:\n * const result = parseISO('2014-02-11T11:30:30')\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert string '+02014101' to date,\n * // if the additional number of digits in the extended year format is 1:\n * const result = parseISO('+02014101', { additionalDigits: 1 })\n * //=> Fri Apr 11 2014 00:00:00\n */\nexport function parseISO(argument, options) {\n const invalidDate = () => constructFrom(options?.in, NaN);\n\n const additionalDigits = options?.additionalDigits ?? 2;\n const dateStrings = splitDateString(argument);\n\n let date;\n if (dateStrings.date) {\n const parseYearResult = parseYear(dateStrings.date, additionalDigits);\n date = parseDate(parseYearResult.restDateString, parseYearResult.year);\n }\n\n if (!date || isNaN(+date)) return invalidDate();\n\n const timestamp = +date;\n let time = 0;\n let offset;\n\n if (dateStrings.time) {\n time = parseTime(dateStrings.time);\n if (isNaN(time)) return invalidDate();\n }\n\n if (dateStrings.timezone) {\n offset = parseTimezone(dateStrings.timezone);\n if (isNaN(offset)) return invalidDate();\n } else {\n const tmpDate = new Date(timestamp + time);\n const result = toDate(0, options?.in);\n result.setFullYear(\n tmpDate.getUTCFullYear(),\n tmpDate.getUTCMonth(),\n tmpDate.getUTCDate(),\n );\n result.setHours(\n tmpDate.getUTCHours(),\n tmpDate.getUTCMinutes(),\n tmpDate.getUTCSeconds(),\n tmpDate.getUTCMilliseconds(),\n );\n return result;\n }\n\n return toDate(timestamp + time + offset, options?.in);\n}\n\nconst patterns = {\n dateTimeDelimiter: /[T ]/,\n timeZoneDelimiter: /[Z ]/i,\n timezone: /([Z+-].*)$/,\n};\n\nconst dateRegex =\n /^-?(?:(\\d{3})|(\\d{2})(?:-?(\\d{2}))?|W(\\d{2})(?:-?(\\d{1}))?|)$/;\nconst timeRegex =\n /^(\\d{2}(?:[.,]\\d*)?)(?::?(\\d{2}(?:[.,]\\d*)?))?(?::?(\\d{2}(?:[.,]\\d*)?))?$/;\nconst timezoneRegex = /^([+-])(\\d{2})(?::?(\\d{2}))?$/;\n\nfunction splitDateString(dateString) {\n const dateStrings = {};\n const array = dateString.split(patterns.dateTimeDelimiter);\n let timeString;\n\n // The regex match should only return at maximum two array elements.\n // [date], [time], or [date, time].\n if (array.length > 2) {\n return dateStrings;\n }\n\n if (/:/.test(array[0])) {\n timeString = array[0];\n } else {\n dateStrings.date = array[0];\n timeString = array[1];\n if (patterns.timeZoneDelimiter.test(dateStrings.date)) {\n dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0];\n timeString = dateString.substr(\n dateStrings.date.length,\n dateString.length,\n );\n }\n }\n\n if (timeString) {\n const token = patterns.timezone.exec(timeString);\n if (token) {\n dateStrings.time = timeString.replace(token[1], \"\");\n dateStrings.timezone = token[1];\n } else {\n dateStrings.time = timeString;\n }\n }\n\n return dateStrings;\n}\n\nfunction parseYear(dateString, additionalDigits) {\n const regex = new RegExp(\n \"^(?:(\\\\d{4}|[+-]\\\\d{\" +\n (4 + additionalDigits) +\n \"})|(\\\\d{2}|[+-]\\\\d{\" +\n (2 + additionalDigits) +\n \"})$)\",\n );\n\n const captures = dateString.match(regex);\n // Invalid ISO-formatted year\n if (!captures) return { year: NaN, restDateString: \"\" };\n\n const year = captures[1] ? parseInt(captures[1]) : null;\n const century = captures[2] ? parseInt(captures[2]) : null;\n\n // either year or century is null, not both\n return {\n year: century === null ? year : century * 100,\n restDateString: dateString.slice((captures[1] || captures[2]).length),\n };\n}\n\nfunction parseDate(dateString, year) {\n // Invalid ISO-formatted year\n if (year === null) return new Date(NaN);\n\n const captures = dateString.match(dateRegex);\n // Invalid ISO-formatted string\n if (!captures) return new Date(NaN);\n\n const isWeekDate = !!captures[4];\n const dayOfYear = parseDateUnit(captures[1]);\n const month = parseDateUnit(captures[2]) - 1;\n const day = parseDateUnit(captures[3]);\n const week = parseDateUnit(captures[4]);\n const dayOfWeek = parseDateUnit(captures[5]) - 1;\n\n if (isWeekDate) {\n if (!validateWeekDate(year, week, dayOfWeek)) {\n return new Date(NaN);\n }\n return dayOfISOWeekYear(year, week, dayOfWeek);\n } else {\n const date = new Date(0);\n if (\n !validateDate(year, month, day) ||\n !validateDayOfYearDate(year, dayOfYear)\n ) {\n return new Date(NaN);\n }\n date.setUTCFullYear(year, month, Math.max(dayOfYear, day));\n return date;\n }\n}\n\nfunction parseDateUnit(value) {\n return value ? parseInt(value) : 1;\n}\n\nfunction parseTime(timeString) {\n const captures = timeString.match(timeRegex);\n if (!captures) return NaN; // Invalid ISO-formatted time\n\n const hours = parseTimeUnit(captures[1]);\n const minutes = parseTimeUnit(captures[2]);\n const seconds = parseTimeUnit(captures[3]);\n\n if (!validateTime(hours, minutes, seconds)) {\n return NaN;\n }\n\n return (\n hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1000\n );\n}\n\nfunction parseTimeUnit(value) {\n return (value && parseFloat(value.replace(\",\", \".\"))) || 0;\n}\n\nfunction parseTimezone(timezoneString) {\n if (timezoneString === \"Z\") return 0;\n\n const captures = timezoneString.match(timezoneRegex);\n if (!captures) return 0;\n\n const sign = captures[1] === \"+\" ? -1 : 1;\n const hours = parseInt(captures[2]);\n const minutes = (captures[3] && parseInt(captures[3])) || 0;\n\n if (!validateTimezone(hours, minutes)) {\n return NaN;\n }\n\n return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute);\n}\n\nfunction dayOfISOWeekYear(isoWeekYear, week, day) {\n const date = new Date(0);\n date.setUTCFullYear(isoWeekYear, 0, 4);\n const fourthOfJanuaryDay = date.getUTCDay() || 7;\n const diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay;\n date.setUTCDate(date.getUTCDate() + diff);\n return date;\n}\n\n// Validation functions\n\n// February is null to handle the leap year (using ||)\nconst daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nfunction isLeapYearIndex(year) {\n return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);\n}\n\nfunction validateDate(year, month, date) {\n return (\n month >= 0 &&\n month <= 11 &&\n date >= 1 &&\n date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28))\n );\n}\n\nfunction validateDayOfYearDate(year, dayOfYear) {\n return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365);\n}\n\nfunction validateWeekDate(_year, week, day) {\n return week >= 1 && week <= 53 && day >= 0 && day <= 6;\n}\n\nfunction validateTime(hours, minutes, seconds) {\n if (hours === 24) {\n return minutes === 0 && seconds === 0;\n }\n\n return (\n seconds >= 0 &&\n seconds < 60 &&\n minutes >= 0 &&\n minutes < 60 &&\n hours >= 0 &&\n hours < 25\n );\n}\n\nfunction validateTimezone(_hours, minutes) {\n return minutes >= 0 && minutes <= 59;\n}\n\n// Fallback for modularized imports:\nexport default parseISO;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfDay} function options.\n */\n\n/**\n * @name startOfDay\n * @category Day Helpers\n * @summary Return the start of a day for the given date.\n *\n * @description\n * Return the start of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a day\n *\n * @example\n * // The start of a day for 2 September 2014 11:55:00:\n * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 00:00:00\n */\nexport function startOfDay(date, options) {\n const _date = toDate(date, options?.in);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfDay;\n","import { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfISOWeek} function options.\n */\n\n/**\n * @name startOfISOWeek\n * @category ISO Week Helpers\n * @summary Return the start of an ISO week for the given date.\n *\n * @description\n * Return the start of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week\n *\n * @example\n * // The start of an ISO week for 2 September 2014 11:55:00:\n * const result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfISOWeek(date, options) {\n return startOfWeek(date, { ...options, weekStartsOn: 1 });\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeek;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfWeek} function options.\n */\n\n/**\n * @name startOfWeek\n * @category Week Helpers\n * @summary Return the start of a week for the given date.\n *\n * @description\n * Return the start of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week\n *\n * @example\n * // The start of a week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfWeek(date, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const _date = toDate(date, options?.in);\n const day = _date.getDay();\n const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\n _date.setDate(_date.getDate() - diff);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeek;\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * Starting from v3.7.0, it clones a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\nexport function toDate(argument, context) {\n // [TODO] Get rid of `toDate` or `constructFrom`?\n return constructFrom(context || argument, argument);\n}\n\n// Fallback for modularized imports:\nexport default toDate;\n","import _concat from \"./internal/_concat.js\";\nimport _curry2 from \"./internal/_curry2.js\";\n\n/**\n * Returns a new list containing the contents of the given list, followed by\n * the given element.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig a -> [a] -> [a]\n * @param {*} el The element to add to the end of the new list.\n * @param {Array} list The list of elements to add a new item to.\n * list.\n * @return {Array} A new list containing the elements of the old list followed by `el`.\n * @see R.prepend\n * @example\n *\n * R.append('tests', ['write', 'more']); //=> ['write', 'more', 'tests']\n * R.append('tests', []); //=> ['tests']\n * R.append(['tests'], ['write', 'more']); //=> ['write', 'more', ['tests']]\n */\nvar append = /*#__PURE__*/_curry2(function append(el, list) {\n return _concat(list, [el]);\n});\nexport default append;","/**\n * Private `concat` function to merge two array-like objects.\n *\n * @private\n * @param {Array|Arguments} [set1=[]] An array-like object.\n * @param {Array|Arguments} [set2=[]] An array-like object.\n * @return {Array} A new, merged array.\n * @example\n *\n * _concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3]\n */\nexport default function _concat(set1, set2) {\n set1 = set1 || [];\n set2 = set2 || [];\n var idx;\n var len1 = set1.length;\n var len2 = set2.length;\n var result = [];\n idx = 0;\n while (idx < len1) {\n result[result.length] = set1[idx];\n idx += 1;\n }\n idx = 0;\n while (idx < len2) {\n result[result.length] = set2[idx];\n idx += 1;\n }\n return result;\n}","import _curry2 from \"./internal/_curry2.js\";\nimport _isArray from \"./internal/_isArray.js\";\nimport _isFunction from \"./internal/_isFunction.js\";\nimport _isString from \"./internal/_isString.js\";\nimport toString from \"./toString.js\";\n\n/**\n * Returns the result of concatenating the given lists or strings.\n *\n * Note: `R.concat` expects both arguments to be of the same type,\n * unlike the native `Array.prototype.concat` method. It will throw\n * an error if you `concat` an Array with a non-Array value.\n *\n * Dispatches to the `concat` method of the first argument, if present.\n * Can also concatenate two members of a [fantasy-land\n * compatible semigroup](https://github.com/fantasyland/fantasy-land#semigroup).\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig [a] -> [a] -> [a]\n * @sig String -> String -> String\n * @param {Array|String} firstList The first list\n * @param {Array|String} secondList The second list\n * @return {Array|String} A list consisting of the elements of `firstList` followed by the elements of\n * `secondList`.\n *\n * @example\n *\n * R.concat('ABC', 'DEF'); // 'ABCDEF'\n * R.concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3]\n * R.concat([], []); //=> []\n */\nvar concat = /*#__PURE__*/_curry2(function concat(a, b) {\n if (_isArray(a)) {\n if (_isArray(b)) {\n return a.concat(b);\n }\n throw new TypeError(toString(b) + ' is not an array');\n }\n if (_isString(a)) {\n if (_isString(b)) {\n return a + b;\n }\n throw new TypeError(toString(b) + ' is not a string');\n }\n if (a != null && _isFunction(a['fantasy-land/concat'])) {\n return a['fantasy-land/concat'](b);\n }\n if (a != null && _isFunction(a.concat)) {\n return a.concat(b);\n }\n throw new TypeError(toString(a) + ' does not have a method named \"concat\" or \"fantasy-land/concat\"');\n});\nexport default concat;","export default function _arrayFromIterator(iter) {\n var list = [];\n var next;\n while (!(next = iter.next()).done) {\n list.push(next.value);\n }\n return list;\n}","export default function _includesWith(pred, x, list) {\n var idx = 0;\n var len = list.length;\n while (idx < len) {\n if (pred(x, list[idx])) {\n return true;\n }\n idx += 1;\n }\n return false;\n}","// Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\nfunction _objectIs(a, b) {\n // SameValue algorithm\n if (a === b) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return a !== 0 || 1 / a === 1 / b;\n } else {\n // Step 6.a: NaN == NaN\n return a !== a && b !== b;\n }\n}\nexport default typeof Object.is === 'function' ? Object.is : _objectIs;","import _arrayFromIterator from \"./_arrayFromIterator.js\";\nimport _includesWith from \"./_includesWith.js\";\nimport _functionName from \"./_functionName.js\";\nimport _has from \"./_has.js\";\nimport _objectIs from \"./_objectIs.js\";\nimport keys from \"../keys.js\";\nimport type from \"../type.js\";\n\n/**\n * private _uniqContentEquals function.\n * That function is checking equality of 2 iterator contents with 2 assumptions\n * - iterators lengths are the same\n * - iterators values are unique\n *\n * false-positive result will be returned for comparison of, e.g.\n * - [1,2,3] and [1,2,3,4]\n * - [1,1,1] and [1,2,3]\n * */\n\nfunction _uniqContentEquals(aIterator, bIterator, stackA, stackB) {\n var a = _arrayFromIterator(aIterator);\n var b = _arrayFromIterator(bIterator);\n function eq(_a, _b) {\n return _equals(_a, _b, stackA.slice(), stackB.slice());\n }\n\n // if *a* array contains any element that is not included in *b*\n return !_includesWith(function (b, aItem) {\n return !_includesWith(eq, aItem, b);\n }, b, a);\n}\nexport default function _equals(a, b, stackA, stackB) {\n if (_objectIs(a, b)) {\n return true;\n }\n var typeA = type(a);\n if (typeA !== type(b)) {\n return false;\n }\n if (typeof a['fantasy-land/equals'] === 'function' || typeof b['fantasy-land/equals'] === 'function') {\n return typeof a['fantasy-land/equals'] === 'function' && a['fantasy-land/equals'](b) && typeof b['fantasy-land/equals'] === 'function' && b['fantasy-land/equals'](a);\n }\n if (typeof a.equals === 'function' || typeof b.equals === 'function') {\n return typeof a.equals === 'function' && a.equals(b) && typeof b.equals === 'function' && b.equals(a);\n }\n switch (typeA) {\n case 'Arguments':\n case 'Array':\n case 'Object':\n if (typeof a.constructor === 'function' && _functionName(a.constructor) === 'Promise') {\n return a === b;\n }\n break;\n case 'Boolean':\n case 'Number':\n case 'String':\n if (!(typeof a === typeof b && _objectIs(a.valueOf(), b.valueOf()))) {\n return false;\n }\n break;\n case 'Date':\n if (!_objectIs(a.valueOf(), b.valueOf())) {\n return false;\n }\n break;\n case 'Error':\n return a.name === b.name && a.message === b.message;\n case 'RegExp':\n if (!(a.source === b.source && a.global === b.global && a.ignoreCase === b.ignoreCase && a.multiline === b.multiline && a.sticky === b.sticky && a.unicode === b.unicode)) {\n return false;\n }\n break;\n }\n var idx = stackA.length - 1;\n while (idx >= 0) {\n if (stackA[idx] === a) {\n return stackB[idx] === b;\n }\n idx -= 1;\n }\n switch (typeA) {\n case 'Map':\n if (a.size !== b.size) {\n return false;\n }\n return _uniqContentEquals(a.entries(), b.entries(), stackA.concat([a]), stackB.concat([b]));\n case 'Set':\n if (a.size !== b.size) {\n return false;\n }\n return _uniqContentEquals(a.values(), b.values(), stackA.concat([a]), stackB.concat([b]));\n case 'Arguments':\n case 'Array':\n case 'Object':\n case 'Boolean':\n case 'Number':\n case 'String':\n case 'Date':\n case 'Error':\n case 'RegExp':\n case 'Int8Array':\n case 'Uint8Array':\n case 'Uint8ClampedArray':\n case 'Int16Array':\n case 'Uint16Array':\n case 'Int32Array':\n case 'Uint32Array':\n case 'Float32Array':\n case 'Float64Array':\n case 'ArrayBuffer':\n break;\n default:\n // Values of other types are only equal if identical.\n return false;\n }\n var keysA = keys(a);\n if (keysA.length !== keys(b).length) {\n return false;\n }\n var extendedStackA = stackA.concat([a]);\n var extendedStackB = stackB.concat([b]);\n idx = keysA.length - 1;\n while (idx >= 0) {\n var key = keysA[idx];\n if (!(_has(key, b) && _equals(b[key], a[key], extendedStackA, extendedStackB))) {\n return false;\n }\n idx -= 1;\n }\n return true;\n}","export default function _functionName(f) {\n // String(x => x) evaluates to \"x => x\", so the pattern may not match.\n var match = String(f).match(/^function (\\w*)/);\n return match == null ? '' : match[1];\n}","import _curry2 from \"./internal/_curry2.js\";\nimport _equals from \"./internal/_equals.js\";\n\n/**\n * Returns `true` if its arguments are equivalent, `false` otherwise. Handles\n * cyclical data structures.\n *\n * Dispatches symmetrically to the `equals` methods of both arguments, if\n * present.\n *\n * @func\n * @memberOf R\n * @since v0.15.0\n * @category Relation\n * @sig a -> b -> Boolean\n * @param {*} a\n * @param {*} b\n * @return {Boolean}\n * @example\n *\n * R.equals(1, 1); //=> true\n * R.equals(1, '1'); //=> false\n * R.equals([1, 2, 3], [1, 2, 3]); //=> true\n *\n * const a = {}; a.v = a;\n * const b = {}; b.v = b;\n * R.equals(a, b); //=> true\n */\nvar equals = /*#__PURE__*/_curry2(function equals(a, b) {\n return _equals(a, b, [], []);\n});\nexport default equals;","import _xfBase from \"./_xfBase.js\";\nvar XFilter = /*#__PURE__*/function () {\n function XFilter(f, xf) {\n this.xf = xf;\n this.f = f;\n }\n XFilter.prototype['@@transducer/init'] = _xfBase.init;\n XFilter.prototype['@@transducer/result'] = _xfBase.result;\n XFilter.prototype['@@transducer/step'] = function (result, input) {\n return this.f(input) ? this.xf['@@transducer/step'](result, input) : result;\n };\n return XFilter;\n}();\nexport default function _xfilter(f) {\n return function (xf) {\n return new XFilter(f, xf);\n };\n}","import _arrayReduce from \"./internal/_arrayReduce.js\";\nimport _curry2 from \"./internal/_curry2.js\";\nimport _dispatchable from \"./internal/_dispatchable.js\";\nimport _filter from \"./internal/_filter.js\";\nimport _isObject from \"./internal/_isObject.js\";\nimport _xfilter from \"./internal/_xfilter.js\";\nimport keys from \"./keys.js\";\n\n/**\n * Takes a predicate and a `Filterable`, and returns a new filterable of the\n * same type containing the members of the given filterable which satisfy the\n * given predicate. Filterable objects include plain objects or any object\n * that has a filter method such as `Array`.\n *\n * Dispatches to the `filter` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @category Object\n * @sig Filterable f => (a -> Boolean) -> f a -> f a\n * @param {Function} pred\n * @param {Array} filterable\n * @return {Array} Filterable\n * @see R.reject, R.transduce, R.addIndex\n * @example\n *\n * const isEven = n => n % 2 === 0;\n *\n * R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4]\n *\n * R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}\n */\nvar filter = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['fantasy-land/filter', 'filter'], _xfilter, function (pred, filterable) {\n return _isObject(filterable) ? _arrayReduce(function (acc, key) {\n if (pred(filterable[key])) {\n acc[key] = filterable[key];\n }\n return acc;\n }, {}, keys(filterable)) :\n // else\n _filter(pred, filterable);\n}));\nexport default filter;","export default function _arrayReduce(reducer, acc, list) {\n var index = 0;\n var length = list.length;\n while (index < length) {\n acc = reducer(acc, list[index]);\n index += 1;\n }\n return acc;\n}","export default function _filter(fn, list) {\n var idx = 0;\n var len = list.length;\n var result = [];\n while (idx < len) {\n if (fn(list[idx])) {\n result[result.length] = list[idx];\n }\n idx += 1;\n }\n return result;\n}","import _curry2 from \"./internal/_curry2.js\";\nimport _has from \"./internal/_has.js\";\nimport isNil from \"./isNil.js\";\n\n/**\n * Returns whether or not a path exists in an object. Only the object's\n * own properties are checked.\n *\n * @func\n * @memberOf R\n * @since v0.26.0\n * @category Object\n * @typedefn Idx = String | Int | Symbol\n * @sig [Idx] -> {a} -> Boolean\n * @param {Array} path The path to use.\n * @param {Object} obj The object to check the path in.\n * @return {Boolean} Whether the path exists.\n * @see R.has\n * @example\n *\n * R.hasPath(['a', 'b'], {a: {b: 2}}); // => true\n * R.hasPath(['a', 'b'], {a: {b: undefined}}); // => true\n * R.hasPath(['a', 'b'], {a: {c: 2}}); // => false\n * R.hasPath(['a', 'b'], {}); // => false\n */\nvar hasPath = /*#__PURE__*/_curry2(function hasPath(_path, obj) {\n if (_path.length === 0 || isNil(obj)) {\n return false;\n }\n var val = obj;\n var idx = 0;\n while (idx < _path.length) {\n if (!isNil(val) && _has(_path[idx], val)) {\n val = val[_path[idx]];\n idx += 1;\n } else {\n return false;\n }\n }\n return true;\n});\nexport default hasPath;","import _curry2 from \"./internal/_curry2.js\";\nimport hasPath from \"./hasPath.js\";\n\n/**\n * Returns whether or not an object has an own property with the specified name\n *\n * @func\n * @memberOf R\n * @since v0.7.0\n * @category Object\n * @sig s -> {s: x} -> Boolean\n * @param {String} prop The name of the property to check for.\n * @param {Object} obj The object to query.\n * @return {Boolean} Whether the property exists.\n * @example\n *\n * const hasName = R.has('name');\n * hasName({name: 'alice'}); //=> true\n * hasName({name: 'bob'}); //=> true\n * hasName({}); //=> false\n *\n * const point = {x: 0, y: 0};\n * const pointHas = R.has(R.__, point);\n * pointHas('x'); //=> true\n * pointHas('y'); //=> true\n * pointHas('z'); //=> false\n */\nvar has = /*#__PURE__*/_curry2(function has(prop, obj) {\n return hasPath([prop], obj);\n});\nexport default has;","import _includes from \"./internal/_includes.js\";\nimport _curry2 from \"./internal/_curry2.js\";\n\n/**\n * Returns `true` if the specified value is equal, in [`R.equals`](#equals)\n * terms, to at least one element of the given list; `false` otherwise.\n * Also works with strings.\n *\n * @func\n * @memberOf R\n * @since v0.26.0\n * @category List\n * @sig a -> [a] -> Boolean\n * @param {Object} a The item to compare against.\n * @param {Array} list The array to consider.\n * @return {Boolean} `true` if an equivalent item is in the list, `false` otherwise.\n * @see R.any\n * @example\n *\n * R.includes(3, [1, 2, 3]); //=> true\n * R.includes(4, [1, 2, 3]); //=> false\n * R.includes({ name: 'Fred' }, [{ name: 'Fred' }]); //=> true\n * R.includes([42], [[42]]); //=> true\n * R.includes('ba', 'banana'); //=>true\n */\nvar includes = /*#__PURE__*/_curry2(_includes);\nexport default includes;","import _isPlaceholder from \"./_isPlaceholder.js\";\n\n/**\n * Optimized internal one-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry1(fn) {\n return function f1(a) {\n if (arguments.length === 0 || _isPlaceholder(a)) {\n return f1;\n } else {\n return fn.apply(this, arguments);\n }\n };\n}","import _curry1 from \"./_curry1.js\";\nimport _isPlaceholder from \"./_isPlaceholder.js\";\n\n/**\n * Optimized internal two-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry2(fn) {\n return function f2(a, b) {\n switch (arguments.length) {\n case 0:\n return f2;\n case 1:\n return _isPlaceholder(a) ? f2 : _curry1(function (_b) {\n return fn(a, _b);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b);\n }) : fn(a, b);\n }\n };\n}","import _isArray from \"./_isArray.js\";\nimport _isTransformer from \"./_isTransformer.js\";\n\n/**\n * Returns a function that dispatches with different strategies based on the\n * object in list position (last argument). If it is an array, executes [fn].\n * Otherwise, if it has a function with one of the given method names, it will\n * execute that function (functor case). Otherwise, if it is a transformer,\n * uses transducer created by [transducerCreator] to return a new transformer\n * (transducer case).\n * Otherwise, it will default to executing [fn].\n *\n * @private\n * @param {Array} methodNames properties to check for a custom implementation\n * @param {Function} transducerCreator transducer factory if object is transformer\n * @param {Function} fn default ramda implementation\n * @return {Function} A function that dispatches on object in list position\n */\nexport default function _dispatchable(methodNames, transducerCreator, fn) {\n return function () {\n if (arguments.length === 0) {\n return fn();\n }\n var obj = arguments[arguments.length - 1];\n if (!_isArray(obj)) {\n var idx = 0;\n while (idx < methodNames.length) {\n if (typeof obj[methodNames[idx]] === 'function') {\n return obj[methodNames[idx]].apply(obj, Array.prototype.slice.call(arguments, 0, -1));\n }\n idx += 1;\n }\n if (_isTransformer(obj)) {\n var transducer = transducerCreator.apply(null, Array.prototype.slice.call(arguments, 0, -1));\n return transducer(obj);\n }\n }\n return fn.apply(this, arguments);\n };\n}","export default function _isTransformer(obj) {\n return obj != null && typeof obj['@@transducer/step'] === 'function';\n}","export default function _has(prop, obj) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}","import _indexOf from \"./_indexOf.js\";\nexport default function _includes(a, list) {\n return _indexOf(list, a, 0) >= 0;\n}","import equals from \"../equals.js\";\nexport default function _indexOf(list, a, idx) {\n var inf, item;\n // Array.prototype.indexOf doesn't exist below IE9\n if (typeof list.indexOf === 'function') {\n switch (typeof a) {\n case 'number':\n if (a === 0) {\n // manually crawl the list to distinguish between +0 and -0\n inf = 1 / a;\n while (idx < list.length) {\n item = list[idx];\n if (item === 0 && 1 / item === inf) {\n return idx;\n }\n idx += 1;\n }\n return -1;\n } else if (a !== a) {\n // NaN\n while (idx < list.length) {\n item = list[idx];\n if (typeof item === 'number' && item !== item) {\n return idx;\n }\n idx += 1;\n }\n return -1;\n }\n // non-zero numbers can utilise Set\n return list.indexOf(a, idx);\n\n // all these types can utilise Set\n case 'string':\n case 'boolean':\n case 'function':\n case 'undefined':\n return list.indexOf(a, idx);\n case 'object':\n if (a === null) {\n // null can utilise Set\n return list.indexOf(a, idx);\n }\n }\n }\n // anything else not covered above, defer to R.equals\n while (idx < list.length) {\n if (equals(list[idx], a)) {\n return idx;\n }\n idx += 1;\n }\n return -1;\n}","import _has from \"./_has.js\";\nvar toString = Object.prototype.toString;\nvar _isArguments = /*#__PURE__*/function () {\n return toString.call(arguments) === '[object Arguments]' ? function _isArguments(x) {\n return toString.call(x) === '[object Arguments]';\n } : function _isArguments(x) {\n return _has('callee', x);\n };\n}();\nexport default _isArguments;","/**\n * Tests whether or not an object is an array.\n *\n * @private\n * @param {*} val The object to test.\n * @return {Boolean} `true` if `val` is an array, `false` otherwise.\n * @example\n *\n * _isArray([]); //=> true\n * _isArray(null); //=> false\n * _isArray({}); //=> false\n */\nexport default Array.isArray || function _isArray(val) {\n return val != null && val.length >= 0 && Object.prototype.toString.call(val) === '[object Array]';\n};","export default function _isFunction(x) {\n var type = Object.prototype.toString.call(x);\n return type === '[object Function]' || type === '[object AsyncFunction]' || type === '[object GeneratorFunction]' || type === '[object AsyncGeneratorFunction]';\n}","export default function _isObject(x) {\n return Object.prototype.toString.call(x) === '[object Object]';\n}","export default function _isPlaceholder(a) {\n return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true;\n}","export default function _isString(x) {\n return Object.prototype.toString.call(x) === '[object String]';\n}","export default {\n init: function () {\n return this.xf['@@transducer/init']();\n },\n result: function (result) {\n return this.xf['@@transducer/result'](result);\n }\n};","import _curry1 from \"./internal/_curry1.js\";\n\n/**\n * Checks if the input value is `null` or `undefined`.\n *\n * @func\n * @memberOf R\n * @since v0.9.0\n * @category Type\n * @sig * -> Boolean\n * @param {*} x The value to test.\n * @return {Boolean} `true` if `x` is `undefined` or `null`, otherwise `false`.\n * @example\n *\n * R.isNil(null); //=> true\n * R.isNil(undefined); //=> true\n * R.isNil(0); //=> false\n * R.isNil([]); //=> false\n */\nvar isNil = /*#__PURE__*/_curry1(function isNil(x) {\n return x == null;\n});\nexport default isNil;","import _curry1 from \"./internal/_curry1.js\";\nimport _has from \"./internal/_has.js\";\nimport _isArguments from \"./internal/_isArguments.js\";\n\n// cover IE < 9 keys issues\nvar hasEnumBug = ! /*#__PURE__*/{\n toString: null\n}.propertyIsEnumerable('toString');\nvar nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString', 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n// Safari bug\nvar hasArgsEnumBug = /*#__PURE__*/function () {\n 'use strict';\n\n return arguments.propertyIsEnumerable('length');\n}();\nvar contains = function contains(list, item) {\n var idx = 0;\n while (idx < list.length) {\n if (list[idx] === item) {\n return true;\n }\n idx += 1;\n }\n return false;\n};\n\n/**\n * Returns a list containing the names of all the enumerable own properties of\n * the supplied object.\n * Note that the order of the output array is not guaranteed to be consistent\n * across different JS platforms.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig {k: v} -> [k]\n * @param {Object} obj The object to extract properties from\n * @return {Array} An array of the object's own properties.\n * @see R.keysIn, R.values, R.toPairs\n * @example\n *\n * R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c']\n */\nvar keys = typeof Object.keys === 'function' && !hasArgsEnumBug ? /*#__PURE__*/_curry1(function keys(obj) {\n return Object(obj) !== obj ? [] : Object.keys(obj);\n}) : /*#__PURE__*/_curry1(function keys(obj) {\n if (Object(obj) !== obj) {\n return [];\n }\n var prop, nIdx;\n var ks = [];\n var checkArgsLength = hasArgsEnumBug && _isArguments(obj);\n for (prop in obj) {\n if (_has(prop, obj) && (!checkArgsLength || prop !== 'length')) {\n ks[ks.length] = prop;\n }\n }\n if (hasEnumBug) {\n nIdx = nonEnumerableProps.length - 1;\n while (nIdx >= 0) {\n prop = nonEnumerableProps[nIdx];\n if (_has(prop, obj) && !contains(ks, prop)) {\n ks[ks.length] = prop;\n }\n nIdx -= 1;\n }\n }\n return ks;\n});\nexport default keys;","import _curry2 from \"./internal/_curry2.js\";\n\n/**\n * Returns a partial copy of an object omitting the keys specified.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig [String] -> {String: *} -> {String: *}\n * @param {Array} names an array of String property names to omit from the new object\n * @param {Object} obj The object to copy from\n * @return {Object} A new object with properties from `names` not on it.\n * @see R.pick\n * @example\n *\n * R.omit(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, c: 3}\n */\nvar omit = /*#__PURE__*/_curry2(function omit(names, obj) {\n var result = {};\n var index = {};\n var idx = 0;\n var len = names.length;\n while (idx < len) {\n index[names[idx]] = 1;\n idx += 1;\n }\n for (var prop in obj) {\n if (!index.hasOwnProperty(prop)) {\n result[prop] = obj[prop];\n }\n }\n return result;\n});\nexport default omit;","import _curry2 from \"./internal/_curry2.js\";\n\n/**\n * Returns a partial copy of an object containing only the keys specified. If\n * the key does not exist, the property is ignored.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig [k] -> {k: v} -> {k: v}\n * @param {Array} names an array of String property names to copy onto a new object\n * @param {Object} obj The object to copy from\n * @return {Object} A new object with only properties from `names` on it.\n * @see R.omit, R.props\n * @example\n *\n * R.pick(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4}\n * R.pick(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1}\n */\nvar pick = /*#__PURE__*/_curry2(function pick(names, obj) {\n var result = {};\n var idx = 0;\n while (idx < names.length) {\n if (names[idx] in obj) {\n result[names[idx]] = obj[names[idx]];\n }\n idx += 1;\n }\n return result;\n});\nexport default pick;","import _complement from \"./internal/_complement.js\";\nimport _curry2 from \"./internal/_curry2.js\";\nimport filter from \"./filter.js\";\n\n/**\n * The complement of [`filter`](#filter).\n *\n * Acts as a transducer if a transformer is given in list position. Filterable\n * objects include plain objects or any object that has a filter method such\n * as `Array`.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig Filterable f => (a -> Boolean) -> f a -> f a\n * @param {Function} pred\n * @param {Array} filterable\n * @return {Array}\n * @see R.filter, R.transduce, R.addIndex\n * @example\n *\n * const isOdd = (n) => n % 2 !== 0;\n *\n * R.reject(isOdd, [1, 2, 3, 4]); //=> [2, 4]\n *\n * R.reject(isOdd, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}\n */\nvar reject = /*#__PURE__*/_curry2(function reject(pred, filterable) {\n return filter(_complement(pred), filterable);\n});\nexport default reject;","export default function _complement(f) {\n return function () {\n return !f.apply(this, arguments);\n };\n}","export default function _map(fn, functor) {\n var idx = 0;\n var len = functor.length;\n var result = Array(len);\n while (idx < len) {\n result[idx] = fn(functor[idx]);\n idx += 1;\n }\n return result;\n}","export default function _quote(s) {\n var escaped = s.replace(/\\\\/g, '\\\\\\\\').replace(/[\\b]/g, '\\\\b') // \\b matches word boundary; [\\b] matches backspace\n .replace(/\\f/g, '\\\\f').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r').replace(/\\t/g, '\\\\t').replace(/\\v/g, '\\\\v').replace(/\\0/g, '\\\\0');\n return '\"' + escaped.replace(/\"/g, '\\\\\"') + '\"';\n}","/**\n * Polyfill from .\n */\nvar pad = function pad(n) {\n return (n < 10 ? '0' : '') + n;\n};\nvar _toISOString = typeof Date.prototype.toISOString === 'function' ? function _toISOString(d) {\n return d.toISOString();\n} : function _toISOString(d) {\n return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) + 'T' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds()) + '.' + (d.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + 'Z';\n};\nexport default _toISOString;","import _includes from \"./_includes.js\";\nimport _map from \"./_map.js\";\nimport _quote from \"./_quote.js\";\nimport _toISOString from \"./_toISOString.js\";\nimport keys from \"../keys.js\";\nimport reject from \"../reject.js\";\nexport default function _toString(x, seen) {\n var recur = function recur(y) {\n var xs = seen.concat([x]);\n return _includes(y, xs) ? '' : _toString(y, xs);\n };\n\n // mapPairs :: (Object, [String]) -> [String]\n var mapPairs = function (obj, keys) {\n return _map(function (k) {\n return _quote(k) + ': ' + recur(obj[k]);\n }, keys.slice().sort());\n };\n switch (Object.prototype.toString.call(x)) {\n case '[object Arguments]':\n return '(function() { return arguments; }(' + _map(recur, x).join(', ') + '))';\n case '[object Array]':\n return '[' + _map(recur, x).concat(mapPairs(x, reject(function (k) {\n return /^\\d+$/.test(k);\n }, keys(x)))).join(', ') + ']';\n case '[object Boolean]':\n return typeof x === 'object' ? 'new Boolean(' + recur(x.valueOf()) + ')' : x.toString();\n case '[object Date]':\n return 'new Date(' + (isNaN(x.valueOf()) ? recur(NaN) : _quote(_toISOString(x))) + ')';\n case '[object Map]':\n return 'new Map(' + recur(Array.from(x)) + ')';\n case '[object Null]':\n return 'null';\n case '[object Number]':\n return typeof x === 'object' ? 'new Number(' + recur(x.valueOf()) + ')' : 1 / x === -Infinity ? '-0' : x.toString(10);\n case '[object Set]':\n return 'new Set(' + recur(Array.from(x).sort()) + ')';\n case '[object String]':\n return typeof x === 'object' ? 'new String(' + recur(x.valueOf()) + ')' : _quote(x);\n case '[object Undefined]':\n return 'undefined';\n default:\n if (typeof x.toString === 'function') {\n var repr = x.toString();\n if (repr !== '[object Object]') {\n return repr;\n }\n }\n return '{' + mapPairs(x, keys(x)).join(', ') + '}';\n }\n}","import _curry1 from \"./internal/_curry1.js\";\nimport _toString from \"./internal/_toString.js\";\n\n/**\n * Returns the string representation of the given value. `eval`'ing the output\n * should result in a value equivalent to the input value. Many of the built-in\n * `toString` methods do not satisfy this requirement.\n *\n * If the given value is an `[object Object]` with a `toString` method other\n * than `Object.prototype.toString`, this method is invoked with no arguments\n * to produce the return value. This means user-defined constructor functions\n * can provide a suitable `toString` method. For example:\n *\n * function Point(x, y) {\n * this.x = x;\n * this.y = y;\n * }\n *\n * Point.prototype.toString = function() {\n * return 'new Point(' + this.x + ', ' + this.y + ')';\n * };\n *\n * R.toString(new Point(1, 2)); //=> 'new Point(1, 2)'\n *\n * @func\n * @memberOf R\n * @since v0.14.0\n * @category String\n * @sig * -> String\n * @param {*} val\n * @return {String}\n * @example\n *\n * R.toString(42); //=> '42'\n * R.toString('abc'); //=> '\"abc\"'\n * R.toString([1, 2, 3]); //=> '[1, 2, 3]'\n * R.toString({foo: 1, bar: 2, baz: 3}); //=> '{\"bar\": 2, \"baz\": 3, \"foo\": 1}'\n * R.toString(new Date('2001-02-03T04:05:06Z')); //=> 'new Date(\"2001-02-03T04:05:06.000Z\")'\n */\nvar toString = /*#__PURE__*/_curry1(function toString(val) {\n return _toString(val, []);\n});\nexport default toString;","import _curry1 from \"./internal/_curry1.js\";\n\n/**\n * Gives a single-word string description of the (native) type of a value,\n * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not\n * attempt to distinguish user Object types any further, reporting them all as\n * 'Object'.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Type\n * @sig * -> String\n * @param {*} val The value to test\n * @return {String}\n * @example\n *\n * R.type({}); //=> \"Object\"\n * R.type(1); //=> \"Number\"\n * R.type(false); //=> \"Boolean\"\n * R.type('s'); //=> \"String\"\n * R.type(null); //=> \"Null\"\n * R.type([]); //=> \"Array\"\n * R.type(/[A-z]/); //=> \"RegExp\"\n * R.type(() => {}); //=> \"Function\"\n * R.type(async () => {}); //=> \"AsyncFunction\"\n * R.type(undefined); //=> \"Undefined\"\n * R.type(BigInt(123)); //=> \"BigInt\"\n */\nvar type = /*#__PURE__*/_curry1(function type(val) {\n return val === null ? 'Null' : val === undefined ? 'Undefined' : Object.prototype.toString.call(val).slice(8, -1);\n});\nexport default type;","import _includes from \"./_includes.js\";\nvar _Set = /*#__PURE__*/function () {\n function _Set() {\n /* globals Set */\n this._nativeSet = typeof Set === 'function' ? new Set() : null;\n this._items = {};\n }\n // until we figure out why jsdoc chokes on this\n // @param item The item to add to the Set\n // @returns {boolean} true if the item did not exist prior, otherwise false\n //\n _Set.prototype.add = function (item) {\n return !hasOrAdd(item, true, this);\n };\n\n //\n // @param item The item to check for existence in the Set\n // @returns {boolean} true if the item exists in the Set, otherwise false\n //\n _Set.prototype.has = function (item) {\n return hasOrAdd(item, false, this);\n };\n\n //\n // Combines the logic for checking whether an item is a member of the set and\n // for adding a new item to the set.\n //\n // @param item The item to check or add to the Set instance.\n // @param shouldAdd If true, the item will be added to the set if it doesn't\n // already exist.\n // @param set The set instance to check or add to.\n // @return {boolean} true if the item already existed, otherwise false.\n //\n return _Set;\n}();\nfunction hasOrAdd(item, shouldAdd, set) {\n var type = typeof item;\n var prevSize, newSize;\n switch (type) {\n case 'string':\n case 'number':\n // distinguish between +0 and -0\n if (item === 0 && 1 / item === -Infinity) {\n if (set._items['-0']) {\n return true;\n } else {\n if (shouldAdd) {\n set._items['-0'] = true;\n }\n return false;\n }\n }\n // these types can all utilise the native Set\n if (set._nativeSet !== null) {\n if (shouldAdd) {\n prevSize = set._nativeSet.size;\n set._nativeSet.add(item);\n newSize = set._nativeSet.size;\n return newSize === prevSize;\n } else {\n return set._nativeSet.has(item);\n }\n } else {\n if (!(type in set._items)) {\n if (shouldAdd) {\n set._items[type] = {};\n set._items[type][item] = true;\n }\n return false;\n } else if (item in set._items[type]) {\n return true;\n } else {\n if (shouldAdd) {\n set._items[type][item] = true;\n }\n return false;\n }\n }\n case 'boolean':\n // set._items['boolean'] holds a two element array\n // representing [ falseExists, trueExists ]\n if (type in set._items) {\n var bIdx = item ? 1 : 0;\n if (set._items[type][bIdx]) {\n return true;\n } else {\n if (shouldAdd) {\n set._items[type][bIdx] = true;\n }\n return false;\n }\n } else {\n if (shouldAdd) {\n set._items[type] = item ? [false, true] : [true, false];\n }\n return false;\n }\n case 'function':\n // compare functions for reference equality\n if (set._nativeSet !== null) {\n if (shouldAdd) {\n prevSize = set._nativeSet.size;\n set._nativeSet.add(item);\n newSize = set._nativeSet.size;\n return newSize === prevSize;\n } else {\n return set._nativeSet.has(item);\n }\n } else {\n if (!(type in set._items)) {\n if (shouldAdd) {\n set._items[type] = [item];\n }\n return false;\n }\n if (!_includes(item, set._items[type])) {\n if (shouldAdd) {\n set._items[type].push(item);\n }\n return false;\n }\n return true;\n }\n case 'undefined':\n if (set._items[type]) {\n return true;\n } else {\n if (shouldAdd) {\n set._items[type] = true;\n }\n return false;\n }\n case 'object':\n if (item === null) {\n if (!set._items['null']) {\n if (shouldAdd) {\n set._items['null'] = true;\n }\n return false;\n }\n return true;\n }\n /* falls through */\n default:\n // reduce the search size of heterogeneous sets by creating buckets\n // for each type.\n type = Object.prototype.toString.call(item);\n if (!(type in set._items)) {\n if (shouldAdd) {\n set._items[type] = [item];\n }\n return false;\n }\n // scan through all previously applied items\n if (!_includes(item, set._items[type])) {\n if (shouldAdd) {\n set._items[type].push(item);\n }\n return false;\n }\n return true;\n }\n}\n\n// A simple Set type that honours R.equals semantics\nexport default _Set;","import _curry2 from \"./internal/_curry2.js\";\nimport _Set from \"./internal/_Set.js\";\nimport reject from \"./reject.js\";\n\n/**\n * Returns a new list without values in the first argument.\n * [`R.equals`](#equals) is used to determine equality.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * @func\n * @memberOf R\n * @since v0.19.0\n * @category List\n * @sig [a] -> [a] -> [a]\n * @param {Array} list1 The values to be removed from `list2`.\n * @param {Array} list2 The array to remove values from.\n * @return {Array} The new array without values in `list1`.\n * @see R.transduce, R.difference, R.remove\n * @example\n *\n * R.without([1, 2], [1, 2, 1, 3, 4]); //=> [3, 4]\n */\nvar without = /*#__PURE__*/_curry2(function without(xs, list) {\n var toRemove = new _Set();\n for (var i = 0; i < xs.length; i += 1) {\n toRemove.add(xs[i]);\n }\n return reject(toRemove.has.bind(toRemove), list);\n});\nexport default without;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + {\"81\":\"async-mathjax\",\"113\":\"async-upload\",\"157\":\"async-dropdown\",\"254\":\"async-highlight\",\"384\":\"dash_core_components-shared\",\"400\":\"async-datepicker\",\"641\":\"async-markdown\",\"737\":\"async-slider\",\"746\":\"async-graph\"}[chunkId] + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","var getCurrentScript = function() {\n var script = document.currentScript;\n if (!script) {\n /* Shim for IE11 and below */\n /* Do not take into account async scripts and inline scripts */\n\n var doc_scripts = document.getElementsByTagName('script');\n var scripts = [];\n\n for (var i = 0; i < doc_scripts.length; i++) {\n scripts.push(doc_scripts[i]);\n }\n\n scripts = scripts.filter(function(s) { return !s.async && !s.text && !s.textContent; });\n script = scripts.slice(-1)[0];\n }\n\n return script;\n};\n\nvar isLocalScript = function(script) {\n return /\\/_dash-component-suites\\//.test(script.src);\n};\n\nObject.defineProperty(__webpack_require__, 'p', {\n get: (function () {\n var script = getCurrentScript();\n\n var url = script.src.split('/').slice(0, -1).join('/') + '/';\n\n return function() {\n return url;\n };\n })()\n});\n\nif (typeof jsonpScriptSrc !== 'undefined') {\n var __jsonpScriptSrc__ = jsonpScriptSrc;\n jsonpScriptSrc = function(chunkId) {\n var script = getCurrentScript();\n var isLocal = isLocalScript(script);\n\n var src = __jsonpScriptSrc__(chunkId);\n\n if(!isLocal) {\n return src;\n }\n\n var srcFragments = src.split('/');\n var fileFragments = srcFragments.slice(-1)[0].split('.');\n\n fileFragments.splice(1, 0, \"v4_3_0m1781819070\");\n srcFragments.splice(-1, 1, fileFragments.join('.'))\n\n return srcFragments.join('/');\n };\n}\n","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkdash_core_components\"] = self[\"webpackChunkdash_core_components\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./button.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./button.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React from 'react';\nimport {ButtonProps} from '../types';\nimport './css/button.css';\n\n/**\n * Similar to dash.html.Button, but with theming and styles applied.\n */\nconst Button = ({\n setProps,\n n_blur = 0,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n n_blur_timestamp = -1,\n n_clicks = 0,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n n_clicks_timestamp = -1,\n type = 'button',\n className,\n children,\n ...props\n}: ButtonProps) => {\n const ctx = window.dash_component_api.useDashContext();\n const isLoading = ctx.useLoading();\n\n return (\n {\n setProps({\n n_blur: n_blur + 1,\n n_blur_timestamp: Date.now(),\n });\n }}\n onClick={() => {\n setProps({\n n_clicks: n_clicks + 1,\n n_clicks_timestamp: Date.now(),\n });\n }}\n type={type}\n {...props}\n >\n {children}\n \n );\n};\n\nexport default Button;\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./checklist.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./checklist.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React, {useMemo} from 'react';\nimport {ChecklistProps, PersistedProps, PersistenceTypes} from '../types';\nimport './css/checklist.css';\n\nimport {sanitizeOptions} from '../utils/optionTypes';\nimport LoadingElement from '../utils/_LoadingElement';\nimport {OptionsList} from '../utils/optionRendering';\n\n/**\n * Checklist is a component that encapsulates several checkboxes.\n * The values and labels of the checklist are specified in the `options`\n * property and the checked items are specified with the `value` property.\n * Each checkbox is rendered as an input with a surrounding label.\n */\nexport default function Checklist({\n className,\n id,\n style,\n setProps,\n inputStyle = {},\n inputClassName = '',\n labelStyle = {},\n labelClassName = '',\n options = [],\n value = [],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n inline = false,\n}: ChecklistProps) {\n const sanitizedOptions = useMemo(() => {\n return sanitizeOptions(options).options;\n }, [options]);\n\n const stylingProps = {\n id,\n className: 'dash-checklist ' + (className ?? ''),\n style,\n optionClassName: inline ? 'dash-checklist-inline' : undefined,\n inputStyle,\n inputClassName,\n labelStyle,\n labelClassName,\n };\n\n return (\n \n {loadingProps => (\n {\n setProps({value: selection});\n }}\n {...stylingProps}\n />\n )}\n \n );\n}\n\nChecklist.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n","/*!\n * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n */\nfunction _typeof(obj) {\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n\n ownKeys.forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n }\n\n return target;\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArray(iter) {\n if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nvar noop = function noop() {};\n\nvar _WINDOW = {};\nvar _DOCUMENT = {};\nvar _MUTATION_OBSERVER = null;\nvar _PERFORMANCE = {\n mark: noop,\n measure: noop\n};\n\ntry {\n if (typeof window !== 'undefined') _WINDOW = window;\n if (typeof document !== 'undefined') _DOCUMENT = document;\n if (typeof MutationObserver !== 'undefined') _MUTATION_OBSERVER = MutationObserver;\n if (typeof performance !== 'undefined') _PERFORMANCE = performance;\n} catch (e) {}\n\nvar _ref = _WINDOW.navigator || {},\n _ref$userAgent = _ref.userAgent,\n userAgent = _ref$userAgent === void 0 ? '' : _ref$userAgent;\n\nvar WINDOW = _WINDOW;\nvar DOCUMENT = _DOCUMENT;\nvar MUTATION_OBSERVER = _MUTATION_OBSERVER;\nvar PERFORMANCE = _PERFORMANCE;\nvar IS_BROWSER = !!WINDOW.document;\nvar IS_DOM = !!DOCUMENT.documentElement && !!DOCUMENT.head && typeof DOCUMENT.addEventListener === 'function' && typeof DOCUMENT.createElement === 'function';\nvar IS_IE = ~userAgent.indexOf('MSIE') || ~userAgent.indexOf('Trident/');\n\nvar NAMESPACE_IDENTIFIER = '___FONT_AWESOME___';\nvar UNITS_IN_GRID = 16;\nvar DEFAULT_FAMILY_PREFIX = 'fa';\nvar DEFAULT_REPLACEMENT_CLASS = 'svg-inline--fa';\nvar DATA_FA_I2SVG = 'data-fa-i2svg';\nvar DATA_FA_PSEUDO_ELEMENT = 'data-fa-pseudo-element';\nvar DATA_FA_PSEUDO_ELEMENT_PENDING = 'data-fa-pseudo-element-pending';\nvar DATA_PREFIX = 'data-prefix';\nvar DATA_ICON = 'data-icon';\nvar HTML_CLASS_I2SVG_BASE_CLASS = 'fontawesome-i2svg';\nvar MUTATION_APPROACH_ASYNC = 'async';\nvar TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS = ['HTML', 'HEAD', 'STYLE', 'SCRIPT'];\nvar PRODUCTION = function () {\n try {\n return process.env.NODE_ENV === 'production';\n } catch (e) {\n return false;\n }\n}();\nvar PREFIX_TO_STYLE = {\n 'fas': 'solid',\n 'far': 'regular',\n 'fal': 'light',\n 'fad': 'duotone',\n 'fab': 'brands',\n 'fak': 'kit',\n 'fa': 'solid'\n};\nvar STYLE_TO_PREFIX = {\n 'solid': 'fas',\n 'regular': 'far',\n 'light': 'fal',\n 'duotone': 'fad',\n 'brands': 'fab',\n 'kit': 'fak'\n};\nvar LAYERS_TEXT_CLASSNAME = 'fa-layers-text';\nvar FONT_FAMILY_PATTERN = /Font Awesome ([5 ]*)(Solid|Regular|Light|Duotone|Brands|Free|Pro|Kit).*/i; // TODO: do we need to handle font-weight for kit SVG pseudo-elements?\n\nvar FONT_WEIGHT_TO_PREFIX = {\n '900': 'fas',\n '400': 'far',\n 'normal': 'far',\n '300': 'fal'\n};\nvar oneToTen = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\nvar oneToTwenty = oneToTen.concat([11, 12, 13, 14, 15, 16, 17, 18, 19, 20]);\nvar ATTRIBUTES_WATCHED_FOR_MUTATION = ['class', 'data-prefix', 'data-icon', 'data-fa-transform', 'data-fa-mask'];\nvar DUOTONE_CLASSES = {\n GROUP: 'group',\n SWAP_OPACITY: 'swap-opacity',\n PRIMARY: 'primary',\n SECONDARY: 'secondary'\n};\nvar RESERVED_CLASSES = ['xs', 'sm', 'lg', 'fw', 'ul', 'li', 'border', 'pull-left', 'pull-right', 'spin', 'pulse', 'rotate-90', 'rotate-180', 'rotate-270', 'flip-horizontal', 'flip-vertical', 'flip-both', 'stack', 'stack-1x', 'stack-2x', 'inverse', 'layers', 'layers-text', 'layers-counter', DUOTONE_CLASSES.GROUP, DUOTONE_CLASSES.SWAP_OPACITY, DUOTONE_CLASSES.PRIMARY, DUOTONE_CLASSES.SECONDARY].concat(oneToTen.map(function (n) {\n return \"\".concat(n, \"x\");\n})).concat(oneToTwenty.map(function (n) {\n return \"w-\".concat(n);\n}));\n\nvar initial = WINDOW.FontAwesomeConfig || {};\n\nfunction getAttrConfig(attr) {\n var element = DOCUMENT.querySelector('script[' + attr + ']');\n\n if (element) {\n return element.getAttribute(attr);\n }\n}\n\nfunction coerce(val) {\n // Getting an empty string will occur if the attribute is set on the HTML tag but without a value\n // We'll assume that this is an indication that it should be toggled to true\n // For example \n if (val === '') return true;\n if (val === 'false') return false;\n if (val === 'true') return true;\n return val;\n}\n\nif (DOCUMENT && typeof DOCUMENT.querySelector === 'function') {\n var attrs = [['data-family-prefix', 'familyPrefix'], ['data-replacement-class', 'replacementClass'], ['data-auto-replace-svg', 'autoReplaceSvg'], ['data-auto-add-css', 'autoAddCss'], ['data-auto-a11y', 'autoA11y'], ['data-search-pseudo-elements', 'searchPseudoElements'], ['data-observe-mutations', 'observeMutations'], ['data-mutate-approach', 'mutateApproach'], ['data-keep-original-source', 'keepOriginalSource'], ['data-measure-performance', 'measurePerformance'], ['data-show-missing-icons', 'showMissingIcons']];\n attrs.forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n attr = _ref2[0],\n key = _ref2[1];\n\n var val = coerce(getAttrConfig(attr));\n\n if (val !== undefined && val !== null) {\n initial[key] = val;\n }\n });\n}\n\nvar _default = {\n familyPrefix: DEFAULT_FAMILY_PREFIX,\n replacementClass: DEFAULT_REPLACEMENT_CLASS,\n autoReplaceSvg: true,\n autoAddCss: true,\n autoA11y: true,\n searchPseudoElements: false,\n observeMutations: true,\n mutateApproach: 'async',\n keepOriginalSource: true,\n measurePerformance: false,\n showMissingIcons: true\n};\n\nvar _config = _objectSpread({}, _default, initial);\n\nif (!_config.autoReplaceSvg) _config.observeMutations = false;\n\nvar config = _objectSpread({}, _config);\n\nWINDOW.FontAwesomeConfig = config;\n\nvar w = WINDOW || {};\nif (!w[NAMESPACE_IDENTIFIER]) w[NAMESPACE_IDENTIFIER] = {};\nif (!w[NAMESPACE_IDENTIFIER].styles) w[NAMESPACE_IDENTIFIER].styles = {};\nif (!w[NAMESPACE_IDENTIFIER].hooks) w[NAMESPACE_IDENTIFIER].hooks = {};\nif (!w[NAMESPACE_IDENTIFIER].shims) w[NAMESPACE_IDENTIFIER].shims = [];\nvar namespace = w[NAMESPACE_IDENTIFIER];\n\nvar functions = [];\n\nvar listener = function listener() {\n DOCUMENT.removeEventListener('DOMContentLoaded', listener);\n loaded = 1;\n functions.map(function (fn) {\n return fn();\n });\n};\n\nvar loaded = false;\n\nif (IS_DOM) {\n loaded = (DOCUMENT.documentElement.doScroll ? /^loaded|^c/ : /^loaded|^i|^c/).test(DOCUMENT.readyState);\n if (!loaded) DOCUMENT.addEventListener('DOMContentLoaded', listener);\n}\n\nfunction domready (fn) {\n if (!IS_DOM) return;\n loaded ? setTimeout(fn, 0) : functions.push(fn);\n}\n\nvar PENDING = 'pending';\nvar SETTLED = 'settled';\nvar FULFILLED = 'fulfilled';\nvar REJECTED = 'rejected';\n\nvar NOOP = function NOOP() {};\n\nvar isNode = typeof global !== 'undefined' && typeof global.process !== 'undefined' && typeof global.process.emit === 'function';\nvar asyncSetTimer = typeof setImmediate === 'undefined' ? setTimeout : setImmediate;\nvar asyncQueue = [];\nvar asyncTimer;\n\nfunction asyncFlush() {\n // run promise callbacks\n for (var i = 0; i < asyncQueue.length; i++) {\n asyncQueue[i][0](asyncQueue[i][1]);\n } // reset async asyncQueue\n\n\n asyncQueue = [];\n asyncTimer = false;\n}\n\nfunction asyncCall(callback, arg) {\n asyncQueue.push([callback, arg]);\n\n if (!asyncTimer) {\n asyncTimer = true;\n asyncSetTimer(asyncFlush, 0);\n }\n}\n\nfunction invokeResolver(resolver, promise) {\n function resolvePromise(value) {\n resolve(promise, value);\n }\n\n function rejectPromise(reason) {\n reject(promise, reason);\n }\n\n try {\n resolver(resolvePromise, rejectPromise);\n } catch (e) {\n rejectPromise(e);\n }\n}\n\nfunction invokeCallback(subscriber) {\n var owner = subscriber.owner;\n var settled = owner._state;\n var value = owner._data;\n var callback = subscriber[settled];\n var promise = subscriber.then;\n\n if (typeof callback === 'function') {\n settled = FULFILLED;\n\n try {\n value = callback(value);\n } catch (e) {\n reject(promise, e);\n }\n }\n\n if (!handleThenable(promise, value)) {\n if (settled === FULFILLED) {\n resolve(promise, value);\n }\n\n if (settled === REJECTED) {\n reject(promise, value);\n }\n }\n}\n\nfunction handleThenable(promise, value) {\n var resolved;\n\n try {\n if (promise === value) {\n throw new TypeError('A promises callback cannot return that same promise.');\n }\n\n if (value && (typeof value === 'function' || _typeof(value) === 'object')) {\n // then should be retrieved only once\n var then = value.then;\n\n if (typeof then === 'function') {\n then.call(value, function (val) {\n if (!resolved) {\n resolved = true;\n\n if (value === val) {\n fulfill(promise, val);\n } else {\n resolve(promise, val);\n }\n }\n }, function (reason) {\n if (!resolved) {\n resolved = true;\n reject(promise, reason);\n }\n });\n return true;\n }\n }\n } catch (e) {\n if (!resolved) {\n reject(promise, e);\n }\n\n return true;\n }\n\n return false;\n}\n\nfunction resolve(promise, value) {\n if (promise === value || !handleThenable(promise, value)) {\n fulfill(promise, value);\n }\n}\n\nfunction fulfill(promise, value) {\n if (promise._state === PENDING) {\n promise._state = SETTLED;\n promise._data = value;\n asyncCall(publishFulfillment, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state === PENDING) {\n promise._state = SETTLED;\n promise._data = reason;\n asyncCall(publishRejection, promise);\n }\n}\n\nfunction publish(promise) {\n promise._then = promise._then.forEach(invokeCallback);\n}\n\nfunction publishFulfillment(promise) {\n promise._state = FULFILLED;\n publish(promise);\n}\n\nfunction publishRejection(promise) {\n promise._state = REJECTED;\n publish(promise);\n\n if (!promise._handled && isNode) {\n global.process.emit('unhandledRejection', promise._data, promise);\n }\n}\n\nfunction notifyRejectionHandled(promise) {\n global.process.emit('rejectionHandled', promise);\n}\n/**\n * @class\n */\n\n\nfunction P(resolver) {\n if (typeof resolver !== 'function') {\n throw new TypeError('Promise resolver ' + resolver + ' is not a function');\n }\n\n if (this instanceof P === false) {\n throw new TypeError('Failed to construct \\'Promise\\': Please use the \\'new\\' operator, this object constructor cannot be called as a function.');\n }\n\n this._then = [];\n invokeResolver(resolver, this);\n}\n\nP.prototype = {\n constructor: P,\n _state: PENDING,\n _then: null,\n _data: undefined,\n _handled: false,\n then: function then(onFulfillment, onRejection) {\n var subscriber = {\n owner: this,\n then: new this.constructor(NOOP),\n fulfilled: onFulfillment,\n rejected: onRejection\n };\n\n if ((onRejection || onFulfillment) && !this._handled) {\n this._handled = true;\n\n if (this._state === REJECTED && isNode) {\n asyncCall(notifyRejectionHandled, this);\n }\n }\n\n if (this._state === FULFILLED || this._state === REJECTED) {\n // already resolved, call callback async\n asyncCall(invokeCallback, subscriber);\n } else {\n // subscribe\n this._then.push(subscriber);\n }\n\n return subscriber.then;\n },\n catch: function _catch(onRejection) {\n return this.then(null, onRejection);\n }\n};\n\nP.all = function (promises) {\n if (!Array.isArray(promises)) {\n throw new TypeError('You must pass an array to Promise.all().');\n }\n\n return new P(function (resolve, reject) {\n var results = [];\n var remaining = 0;\n\n function resolver(index) {\n remaining++;\n return function (value) {\n results[index] = value;\n\n if (! --remaining) {\n resolve(results);\n }\n };\n }\n\n for (var i = 0, promise; i < promises.length; i++) {\n promise = promises[i];\n\n if (promise && typeof promise.then === 'function') {\n promise.then(resolver(i), reject);\n } else {\n results[i] = promise;\n }\n }\n\n if (!remaining) {\n resolve(results);\n }\n });\n};\n\nP.race = function (promises) {\n if (!Array.isArray(promises)) {\n throw new TypeError('You must pass an array to Promise.race().');\n }\n\n return new P(function (resolve, reject) {\n for (var i = 0, promise; i < promises.length; i++) {\n promise = promises[i];\n\n if (promise && typeof promise.then === 'function') {\n promise.then(resolve, reject);\n } else {\n resolve(promise);\n }\n }\n });\n};\n\nP.resolve = function (value) {\n if (value && _typeof(value) === 'object' && value.constructor === P) {\n return value;\n }\n\n return new P(function (resolve) {\n resolve(value);\n });\n};\n\nP.reject = function (reason) {\n return new P(function (resolve, reject) {\n reject(reason);\n });\n};\n\nvar picked = typeof Promise === 'function' ? Promise : P;\n\nvar d = UNITS_IN_GRID;\nvar meaninglessTransform = {\n size: 16,\n x: 0,\n y: 0,\n rotate: 0,\n flipX: false,\n flipY: false\n};\n\nfunction isReserved(name) {\n return ~RESERVED_CLASSES.indexOf(name);\n}\nfunction insertCss(css) {\n if (!css || !IS_DOM) {\n return;\n }\n\n var style = DOCUMENT.createElement('style');\n style.setAttribute('type', 'text/css');\n style.innerHTML = css;\n var headChildren = DOCUMENT.head.childNodes;\n var beforeChild = null;\n\n for (var i = headChildren.length - 1; i > -1; i--) {\n var child = headChildren[i];\n var tagName = (child.tagName || '').toUpperCase();\n\n if (['STYLE', 'LINK'].indexOf(tagName) > -1) {\n beforeChild = child;\n }\n }\n\n DOCUMENT.head.insertBefore(style, beforeChild);\n return css;\n}\nvar idPool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\nfunction nextUniqueId() {\n var size = 12;\n var id = '';\n\n while (size-- > 0) {\n id += idPool[Math.random() * 62 | 0];\n }\n\n return id;\n}\nfunction toArray(obj) {\n var array = [];\n\n for (var i = (obj || []).length >>> 0; i--;) {\n array[i] = obj[i];\n }\n\n return array;\n}\nfunction classArray(node) {\n if (node.classList) {\n return toArray(node.classList);\n } else {\n return (node.getAttribute('class') || '').split(' ').filter(function (i) {\n return i;\n });\n }\n}\nfunction getIconName(familyPrefix, cls) {\n var parts = cls.split('-');\n var prefix = parts[0];\n var iconName = parts.slice(1).join('-');\n\n if (prefix === familyPrefix && iconName !== '' && !isReserved(iconName)) {\n return iconName;\n } else {\n return null;\n }\n}\nfunction htmlEscape(str) {\n return \"\".concat(str).replace(/&/g, '&').replace(/\"/g, '"').replace(/'/g, ''').replace(//g, '>');\n}\nfunction joinAttributes(attributes) {\n return Object.keys(attributes || {}).reduce(function (acc, attributeName) {\n return acc + \"\".concat(attributeName, \"=\\\"\").concat(htmlEscape(attributes[attributeName]), \"\\\" \");\n }, '').trim();\n}\nfunction joinStyles(styles) {\n return Object.keys(styles || {}).reduce(function (acc, styleName) {\n return acc + \"\".concat(styleName, \": \").concat(styles[styleName], \";\");\n }, '');\n}\nfunction transformIsMeaningful(transform) {\n return transform.size !== meaninglessTransform.size || transform.x !== meaninglessTransform.x || transform.y !== meaninglessTransform.y || transform.rotate !== meaninglessTransform.rotate || transform.flipX || transform.flipY;\n}\nfunction transformForSvg(_ref) {\n var transform = _ref.transform,\n containerWidth = _ref.containerWidth,\n iconWidth = _ref.iconWidth;\n var outer = {\n transform: \"translate(\".concat(containerWidth / 2, \" 256)\")\n };\n var innerTranslate = \"translate(\".concat(transform.x * 32, \", \").concat(transform.y * 32, \") \");\n var innerScale = \"scale(\".concat(transform.size / 16 * (transform.flipX ? -1 : 1), \", \").concat(transform.size / 16 * (transform.flipY ? -1 : 1), \") \");\n var innerRotate = \"rotate(\".concat(transform.rotate, \" 0 0)\");\n var inner = {\n transform: \"\".concat(innerTranslate, \" \").concat(innerScale, \" \").concat(innerRotate)\n };\n var path = {\n transform: \"translate(\".concat(iconWidth / 2 * -1, \" -256)\")\n };\n return {\n outer: outer,\n inner: inner,\n path: path\n };\n}\nfunction transformForCss(_ref2) {\n var transform = _ref2.transform,\n _ref2$width = _ref2.width,\n width = _ref2$width === void 0 ? UNITS_IN_GRID : _ref2$width,\n _ref2$height = _ref2.height,\n height = _ref2$height === void 0 ? UNITS_IN_GRID : _ref2$height,\n _ref2$startCentered = _ref2.startCentered,\n startCentered = _ref2$startCentered === void 0 ? false : _ref2$startCentered;\n var val = '';\n\n if (startCentered && IS_IE) {\n val += \"translate(\".concat(transform.x / d - width / 2, \"em, \").concat(transform.y / d - height / 2, \"em) \");\n } else if (startCentered) {\n val += \"translate(calc(-50% + \".concat(transform.x / d, \"em), calc(-50% + \").concat(transform.y / d, \"em)) \");\n } else {\n val += \"translate(\".concat(transform.x / d, \"em, \").concat(transform.y / d, \"em) \");\n }\n\n val += \"scale(\".concat(transform.size / d * (transform.flipX ? -1 : 1), \", \").concat(transform.size / d * (transform.flipY ? -1 : 1), \") \");\n val += \"rotate(\".concat(transform.rotate, \"deg) \");\n return val;\n}\n\nvar ALL_SPACE = {\n x: 0,\n y: 0,\n width: '100%',\n height: '100%'\n};\n\nfunction fillBlack(abstract) {\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (abstract.attributes && (abstract.attributes.fill || force)) {\n abstract.attributes.fill = 'black';\n }\n\n return abstract;\n}\n\nfunction deGroup(abstract) {\n if (abstract.tag === 'g') {\n return abstract.children;\n } else {\n return [abstract];\n }\n}\n\nfunction makeIconMasking (_ref) {\n var children = _ref.children,\n attributes = _ref.attributes,\n main = _ref.main,\n mask = _ref.mask,\n explicitMaskId = _ref.maskId,\n transform = _ref.transform;\n var mainWidth = main.width,\n mainPath = main.icon;\n var maskWidth = mask.width,\n maskPath = mask.icon;\n var trans = transformForSvg({\n transform: transform,\n containerWidth: maskWidth,\n iconWidth: mainWidth\n });\n var maskRect = {\n tag: 'rect',\n attributes: _objectSpread({}, ALL_SPACE, {\n fill: 'white'\n })\n };\n var maskInnerGroupChildrenMixin = mainPath.children ? {\n children: mainPath.children.map(fillBlack)\n } : {};\n var maskInnerGroup = {\n tag: 'g',\n attributes: _objectSpread({}, trans.inner),\n children: [fillBlack(_objectSpread({\n tag: mainPath.tag,\n attributes: _objectSpread({}, mainPath.attributes, trans.path)\n }, maskInnerGroupChildrenMixin))]\n };\n var maskOuterGroup = {\n tag: 'g',\n attributes: _objectSpread({}, trans.outer),\n children: [maskInnerGroup]\n };\n var maskId = \"mask-\".concat(explicitMaskId || nextUniqueId());\n var clipId = \"clip-\".concat(explicitMaskId || nextUniqueId());\n var maskTag = {\n tag: 'mask',\n attributes: _objectSpread({}, ALL_SPACE, {\n id: maskId,\n maskUnits: 'userSpaceOnUse',\n maskContentUnits: 'userSpaceOnUse'\n }),\n children: [maskRect, maskOuterGroup]\n };\n var defs = {\n tag: 'defs',\n children: [{\n tag: 'clipPath',\n attributes: {\n id: clipId\n },\n children: deGroup(maskPath)\n }, maskTag]\n };\n children.push(defs, {\n tag: 'rect',\n attributes: _objectSpread({\n fill: 'currentColor',\n 'clip-path': \"url(#\".concat(clipId, \")\"),\n mask: \"url(#\".concat(maskId, \")\")\n }, ALL_SPACE)\n });\n return {\n children: children,\n attributes: attributes\n };\n}\n\nfunction makeIconStandard (_ref) {\n var children = _ref.children,\n attributes = _ref.attributes,\n main = _ref.main,\n transform = _ref.transform,\n styles = _ref.styles;\n var styleString = joinStyles(styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n if (transformIsMeaningful(transform)) {\n var trans = transformForSvg({\n transform: transform,\n containerWidth: main.width,\n iconWidth: main.width\n });\n children.push({\n tag: 'g',\n attributes: _objectSpread({}, trans.outer),\n children: [{\n tag: 'g',\n attributes: _objectSpread({}, trans.inner),\n children: [{\n tag: main.icon.tag,\n children: main.icon.children,\n attributes: _objectSpread({}, main.icon.attributes, trans.path)\n }]\n }]\n });\n } else {\n children.push(main.icon);\n }\n\n return {\n children: children,\n attributes: attributes\n };\n}\n\nfunction asIcon (_ref) {\n var children = _ref.children,\n main = _ref.main,\n mask = _ref.mask,\n attributes = _ref.attributes,\n styles = _ref.styles,\n transform = _ref.transform;\n\n if (transformIsMeaningful(transform) && main.found && !mask.found) {\n var width = main.width,\n height = main.height;\n var offset = {\n x: width / height / 2,\n y: 0.5\n };\n attributes['style'] = joinStyles(_objectSpread({}, styles, {\n 'transform-origin': \"\".concat(offset.x + transform.x / 16, \"em \").concat(offset.y + transform.y / 16, \"em\")\n }));\n }\n\n return [{\n tag: 'svg',\n attributes: attributes,\n children: children\n }];\n}\n\nfunction asSymbol (_ref) {\n var prefix = _ref.prefix,\n iconName = _ref.iconName,\n children = _ref.children,\n attributes = _ref.attributes,\n symbol = _ref.symbol;\n var id = symbol === true ? \"\".concat(prefix, \"-\").concat(config.familyPrefix, \"-\").concat(iconName) : symbol;\n return [{\n tag: 'svg',\n attributes: {\n style: 'display: none;'\n },\n children: [{\n tag: 'symbol',\n attributes: _objectSpread({}, attributes, {\n id: id\n }),\n children: children\n }]\n }];\n}\n\nfunction makeInlineSvgAbstract(params) {\n var _params$icons = params.icons,\n main = _params$icons.main,\n mask = _params$icons.mask,\n prefix = params.prefix,\n iconName = params.iconName,\n transform = params.transform,\n symbol = params.symbol,\n title = params.title,\n maskId = params.maskId,\n titleId = params.titleId,\n extra = params.extra,\n _params$watchable = params.watchable,\n watchable = _params$watchable === void 0 ? false : _params$watchable;\n\n var _ref = mask.found ? mask : main,\n width = _ref.width,\n height = _ref.height;\n\n var isUploadedIcon = prefix === 'fak';\n var widthClass = isUploadedIcon ? '' : \"fa-w-\".concat(Math.ceil(width / height * 16));\n var attrClass = [config.replacementClass, iconName ? \"\".concat(config.familyPrefix, \"-\").concat(iconName) : '', widthClass].filter(function (c) {\n return extra.classes.indexOf(c) === -1;\n }).filter(function (c) {\n return c !== '' || !!c;\n }).concat(extra.classes).join(' ');\n var content = {\n children: [],\n attributes: _objectSpread({}, extra.attributes, {\n 'data-prefix': prefix,\n 'data-icon': iconName,\n 'class': attrClass,\n 'role': extra.attributes.role || 'img',\n 'xmlns': 'http://www.w3.org/2000/svg',\n 'viewBox': \"0 0 \".concat(width, \" \").concat(height)\n })\n };\n var uploadedIconWidthStyle = isUploadedIcon && !~extra.classes.indexOf('fa-fw') ? {\n width: \"\".concat(width / height * 16 * 0.0625, \"em\")\n } : {};\n\n if (watchable) {\n content.attributes[DATA_FA_I2SVG] = '';\n }\n\n if (title) content.children.push({\n tag: 'title',\n attributes: {\n id: content.attributes['aria-labelledby'] || \"title-\".concat(titleId || nextUniqueId())\n },\n children: [title]\n });\n\n var args = _objectSpread({}, content, {\n prefix: prefix,\n iconName: iconName,\n main: main,\n mask: mask,\n maskId: maskId,\n transform: transform,\n symbol: symbol,\n styles: _objectSpread({}, uploadedIconWidthStyle, extra.styles)\n });\n\n var _ref2 = mask.found && main.found ? makeIconMasking(args) : makeIconStandard(args),\n children = _ref2.children,\n attributes = _ref2.attributes;\n\n args.children = children;\n args.attributes = attributes;\n\n if (symbol) {\n return asSymbol(args);\n } else {\n return asIcon(args);\n }\n}\nfunction makeLayersTextAbstract(params) {\n var content = params.content,\n width = params.width,\n height = params.height,\n transform = params.transform,\n title = params.title,\n extra = params.extra,\n _params$watchable2 = params.watchable,\n watchable = _params$watchable2 === void 0 ? false : _params$watchable2;\n\n var attributes = _objectSpread({}, extra.attributes, title ? {\n 'title': title\n } : {}, {\n 'class': extra.classes.join(' ')\n });\n\n if (watchable) {\n attributes[DATA_FA_I2SVG] = '';\n }\n\n var styles = _objectSpread({}, extra.styles);\n\n if (transformIsMeaningful(transform)) {\n styles['transform'] = transformForCss({\n transform: transform,\n startCentered: true,\n width: width,\n height: height\n });\n styles['-webkit-transform'] = styles['transform'];\n }\n\n var styleString = joinStyles(styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n var val = [];\n val.push({\n tag: 'span',\n attributes: attributes,\n children: [content]\n });\n\n if (title) {\n val.push({\n tag: 'span',\n attributes: {\n class: 'sr-only'\n },\n children: [title]\n });\n }\n\n return val;\n}\nfunction makeLayersCounterAbstract(params) {\n var content = params.content,\n title = params.title,\n extra = params.extra;\n\n var attributes = _objectSpread({}, extra.attributes, title ? {\n 'title': title\n } : {}, {\n 'class': extra.classes.join(' ')\n });\n\n var styleString = joinStyles(extra.styles);\n\n if (styleString.length > 0) {\n attributes['style'] = styleString;\n }\n\n var val = [];\n val.push({\n tag: 'span',\n attributes: attributes,\n children: [content]\n });\n\n if (title) {\n val.push({\n tag: 'span',\n attributes: {\n class: 'sr-only'\n },\n children: [title]\n });\n }\n\n return val;\n}\n\nvar noop$1 = function noop() {};\n\nvar p = config.measurePerformance && PERFORMANCE && PERFORMANCE.mark && PERFORMANCE.measure ? PERFORMANCE : {\n mark: noop$1,\n measure: noop$1\n};\nvar preamble = \"FA \\\"5.15.4\\\"\";\n\nvar begin = function begin(name) {\n p.mark(\"\".concat(preamble, \" \").concat(name, \" begins\"));\n return function () {\n return end(name);\n };\n};\n\nvar end = function end(name) {\n p.mark(\"\".concat(preamble, \" \").concat(name, \" ends\"));\n p.measure(\"\".concat(preamble, \" \").concat(name), \"\".concat(preamble, \" \").concat(name, \" begins\"), \"\".concat(preamble, \" \").concat(name, \" ends\"));\n};\n\nvar perf = {\n begin: begin,\n end: end\n};\n\n/**\n * Internal helper to bind a function known to have 4 arguments\n * to a given context.\n */\n\nvar bindInternal4 = function bindInternal4(func, thisContext) {\n return function (a, b, c, d) {\n return func.call(thisContext, a, b, c, d);\n };\n};\n\n/**\n * # Reduce\n *\n * A fast object `.reduce()` implementation.\n *\n * @param {Object} subject The object to reduce over.\n * @param {Function} fn The reducer function.\n * @param {mixed} initialValue The initial value for the reducer, defaults to subject[0].\n * @param {Object} thisContext The context for the reducer.\n * @return {mixed} The final result.\n */\n\n\nvar reduce = function fastReduceObject(subject, fn, initialValue, thisContext) {\n var keys = Object.keys(subject),\n length = keys.length,\n iterator = thisContext !== undefined ? bindInternal4(fn, thisContext) : fn,\n i,\n key,\n result;\n\n if (initialValue === undefined) {\n i = 1;\n result = subject[keys[0]];\n } else {\n i = 0;\n result = initialValue;\n }\n\n for (; i < length; i++) {\n key = keys[i];\n result = iterator(result, subject[key], key, subject);\n }\n\n return result;\n};\n\nfunction toHex(unicode) {\n var result = '';\n\n for (var i = 0; i < unicode.length; i++) {\n var hex = unicode.charCodeAt(i).toString(16);\n result += ('000' + hex).slice(-4);\n }\n\n return result;\n}\n\nfunction defineIcons(prefix, icons) {\n var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var _params$skipHooks = params.skipHooks,\n skipHooks = _params$skipHooks === void 0 ? false : _params$skipHooks;\n var normalized = Object.keys(icons).reduce(function (acc, iconName) {\n var icon = icons[iconName];\n var expanded = !!icon.icon;\n\n if (expanded) {\n acc[icon.iconName] = icon.icon;\n } else {\n acc[iconName] = icon;\n }\n\n return acc;\n }, {});\n\n if (typeof namespace.hooks.addPack === 'function' && !skipHooks) {\n namespace.hooks.addPack(prefix, normalized);\n } else {\n namespace.styles[prefix] = _objectSpread({}, namespace.styles[prefix] || {}, normalized);\n }\n /**\n * Font Awesome 4 used the prefix of `fa` for all icons. With the introduction\n * of new styles we needed to differentiate between them. Prefix `fa` is now an alias\n * for `fas` so we'll easy the upgrade process for our users by automatically defining\n * this as well.\n */\n\n\n if (prefix === 'fas') {\n defineIcons('fa', icons);\n }\n}\n\nvar styles = namespace.styles,\n shims = namespace.shims;\nvar _byUnicode = {};\nvar _byLigature = {};\nvar _byOldName = {};\nvar build = function build() {\n var lookup = function lookup(reducer) {\n return reduce(styles, function (o, style, prefix) {\n o[prefix] = reduce(style, reducer, {});\n return o;\n }, {});\n };\n\n _byUnicode = lookup(function (acc, icon, iconName) {\n if (icon[3]) {\n acc[icon[3]] = iconName;\n }\n\n return acc;\n });\n _byLigature = lookup(function (acc, icon, iconName) {\n var ligatures = icon[2];\n acc[iconName] = iconName;\n ligatures.forEach(function (ligature) {\n acc[ligature] = iconName;\n });\n return acc;\n });\n var hasRegular = 'far' in styles;\n _byOldName = reduce(shims, function (acc, shim) {\n var oldName = shim[0];\n var prefix = shim[1];\n var iconName = shim[2];\n\n if (prefix === 'far' && !hasRegular) {\n prefix = 'fas';\n }\n\n acc[oldName] = {\n prefix: prefix,\n iconName: iconName\n };\n return acc;\n }, {});\n};\nbuild();\nfunction byUnicode(prefix, unicode) {\n return (_byUnicode[prefix] || {})[unicode];\n}\nfunction byLigature(prefix, ligature) {\n return (_byLigature[prefix] || {})[ligature];\n}\nfunction byOldName(name) {\n return _byOldName[name] || {\n prefix: null,\n iconName: null\n };\n}\n\nvar styles$1 = namespace.styles;\nvar emptyCanonicalIcon = function emptyCanonicalIcon() {\n return {\n prefix: null,\n iconName: null,\n rest: []\n };\n};\nfunction getCanonicalIcon(values) {\n return values.reduce(function (acc, cls) {\n var iconName = getIconName(config.familyPrefix, cls);\n\n if (styles$1[cls]) {\n acc.prefix = cls;\n } else if (config.autoFetchSvg && Object.keys(PREFIX_TO_STYLE).indexOf(cls) > -1) {\n acc.prefix = cls;\n } else if (iconName) {\n var shim = acc.prefix === 'fa' ? byOldName(iconName) : {};\n acc.iconName = shim.iconName || iconName;\n acc.prefix = shim.prefix || acc.prefix;\n } else if (cls !== config.replacementClass && cls.indexOf('fa-w-') !== 0) {\n acc.rest.push(cls);\n }\n\n return acc;\n }, emptyCanonicalIcon());\n}\nfunction iconFromMapping(mapping, prefix, iconName) {\n if (mapping && mapping[prefix] && mapping[prefix][iconName]) {\n return {\n prefix: prefix,\n iconName: iconName,\n icon: mapping[prefix][iconName]\n };\n }\n}\n\nfunction toHtml(abstractNodes) {\n var tag = abstractNodes.tag,\n _abstractNodes$attrib = abstractNodes.attributes,\n attributes = _abstractNodes$attrib === void 0 ? {} : _abstractNodes$attrib,\n _abstractNodes$childr = abstractNodes.children,\n children = _abstractNodes$childr === void 0 ? [] : _abstractNodes$childr;\n\n if (typeof abstractNodes === 'string') {\n return htmlEscape(abstractNodes);\n } else {\n return \"<\".concat(tag, \" \").concat(joinAttributes(attributes), \">\").concat(children.map(toHtml).join(''), \"\");\n }\n}\n\nvar noop$2 = function noop() {};\n\nfunction isWatched(node) {\n var i2svg = node.getAttribute ? node.getAttribute(DATA_FA_I2SVG) : null;\n return typeof i2svg === 'string';\n}\n\nfunction getMutator() {\n if (config.autoReplaceSvg === true) {\n return mutators.replace;\n }\n\n var mutator = mutators[config.autoReplaceSvg];\n return mutator || mutators.replace;\n}\n\nvar mutators = {\n replace: function replace(mutation) {\n var node = mutation[0];\n var abstract = mutation[1];\n var newOuterHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n\n if (node.parentNode && node.outerHTML) {\n node.outerHTML = newOuterHTML + (config.keepOriginalSource && node.tagName.toLowerCase() !== 'svg' ? \"\") : '');\n } else if (node.parentNode) {\n var newNode = document.createElement('span');\n node.parentNode.replaceChild(newNode, node);\n newNode.outerHTML = newOuterHTML;\n }\n },\n nest: function nest(mutation) {\n var node = mutation[0];\n var abstract = mutation[1]; // If we already have a replaced node we do not want to continue nesting within it.\n // Short-circuit to the standard replacement\n\n if (~classArray(node).indexOf(config.replacementClass)) {\n return mutators.replace(mutation);\n }\n\n var forSvg = new RegExp(\"\".concat(config.familyPrefix, \"-.*\"));\n delete abstract[0].attributes.style;\n delete abstract[0].attributes.id;\n var splitClasses = abstract[0].attributes.class.split(' ').reduce(function (acc, cls) {\n if (cls === config.replacementClass || cls.match(forSvg)) {\n acc.toSvg.push(cls);\n } else {\n acc.toNode.push(cls);\n }\n\n return acc;\n }, {\n toNode: [],\n toSvg: []\n });\n abstract[0].attributes.class = splitClasses.toSvg.join(' ');\n var newInnerHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n node.setAttribute('class', splitClasses.toNode.join(' '));\n node.setAttribute(DATA_FA_I2SVG, '');\n node.innerHTML = newInnerHTML;\n }\n};\n\nfunction performOperationSync(op) {\n op();\n}\n\nfunction perform(mutations, callback) {\n var callbackFunction = typeof callback === 'function' ? callback : noop$2;\n\n if (mutations.length === 0) {\n callbackFunction();\n } else {\n var frame = performOperationSync;\n\n if (config.mutateApproach === MUTATION_APPROACH_ASYNC) {\n frame = WINDOW.requestAnimationFrame || performOperationSync;\n }\n\n frame(function () {\n var mutator = getMutator();\n var mark = perf.begin('mutate');\n mutations.map(mutator);\n mark();\n callbackFunction();\n });\n }\n}\nvar disabled = false;\nfunction disableObservation() {\n disabled = true;\n}\nfunction enableObservation() {\n disabled = false;\n}\nvar mo = null;\nfunction observe(options) {\n if (!MUTATION_OBSERVER) {\n return;\n }\n\n if (!config.observeMutations) {\n return;\n }\n\n var treeCallback = options.treeCallback,\n nodeCallback = options.nodeCallback,\n pseudoElementsCallback = options.pseudoElementsCallback,\n _options$observeMutat = options.observeMutationsRoot,\n observeMutationsRoot = _options$observeMutat === void 0 ? DOCUMENT : _options$observeMutat;\n mo = new MUTATION_OBSERVER(function (objects) {\n if (disabled) return;\n toArray(objects).forEach(function (mutationRecord) {\n if (mutationRecord.type === 'childList' && mutationRecord.addedNodes.length > 0 && !isWatched(mutationRecord.addedNodes[0])) {\n if (config.searchPseudoElements) {\n pseudoElementsCallback(mutationRecord.target);\n }\n\n treeCallback(mutationRecord.target);\n }\n\n if (mutationRecord.type === 'attributes' && mutationRecord.target.parentNode && config.searchPseudoElements) {\n pseudoElementsCallback(mutationRecord.target.parentNode);\n }\n\n if (mutationRecord.type === 'attributes' && isWatched(mutationRecord.target) && ~ATTRIBUTES_WATCHED_FOR_MUTATION.indexOf(mutationRecord.attributeName)) {\n if (mutationRecord.attributeName === 'class') {\n var _getCanonicalIcon = getCanonicalIcon(classArray(mutationRecord.target)),\n prefix = _getCanonicalIcon.prefix,\n iconName = _getCanonicalIcon.iconName;\n\n if (prefix) mutationRecord.target.setAttribute('data-prefix', prefix);\n if (iconName) mutationRecord.target.setAttribute('data-icon', iconName);\n } else {\n nodeCallback(mutationRecord.target);\n }\n }\n });\n });\n if (!IS_DOM) return;\n mo.observe(observeMutationsRoot, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true\n });\n}\nfunction disconnect() {\n if (!mo) return;\n mo.disconnect();\n}\n\nfunction styleParser (node) {\n var style = node.getAttribute('style');\n var val = [];\n\n if (style) {\n val = style.split(';').reduce(function (acc, style) {\n var styles = style.split(':');\n var prop = styles[0];\n var value = styles.slice(1);\n\n if (prop && value.length > 0) {\n acc[prop] = value.join(':').trim();\n }\n\n return acc;\n }, {});\n }\n\n return val;\n}\n\nfunction classParser (node) {\n var existingPrefix = node.getAttribute('data-prefix');\n var existingIconName = node.getAttribute('data-icon');\n var innerText = node.innerText !== undefined ? node.innerText.trim() : '';\n var val = getCanonicalIcon(classArray(node));\n\n if (existingPrefix && existingIconName) {\n val.prefix = existingPrefix;\n val.iconName = existingIconName;\n }\n\n if (val.prefix && innerText.length > 1) {\n val.iconName = byLigature(val.prefix, node.innerText);\n } else if (val.prefix && innerText.length === 1) {\n val.iconName = byUnicode(val.prefix, toHex(node.innerText));\n }\n\n return val;\n}\n\nvar parseTransformString = function parseTransformString(transformString) {\n var transform = {\n size: 16,\n x: 0,\n y: 0,\n flipX: false,\n flipY: false,\n rotate: 0\n };\n\n if (!transformString) {\n return transform;\n } else {\n return transformString.toLowerCase().split(' ').reduce(function (acc, n) {\n var parts = n.toLowerCase().split('-');\n var first = parts[0];\n var rest = parts.slice(1).join('-');\n\n if (first && rest === 'h') {\n acc.flipX = true;\n return acc;\n }\n\n if (first && rest === 'v') {\n acc.flipY = true;\n return acc;\n }\n\n rest = parseFloat(rest);\n\n if (isNaN(rest)) {\n return acc;\n }\n\n switch (first) {\n case 'grow':\n acc.size = acc.size + rest;\n break;\n\n case 'shrink':\n acc.size = acc.size - rest;\n break;\n\n case 'left':\n acc.x = acc.x - rest;\n break;\n\n case 'right':\n acc.x = acc.x + rest;\n break;\n\n case 'up':\n acc.y = acc.y - rest;\n break;\n\n case 'down':\n acc.y = acc.y + rest;\n break;\n\n case 'rotate':\n acc.rotate = acc.rotate + rest;\n break;\n }\n\n return acc;\n }, transform);\n }\n};\nfunction transformParser (node) {\n return parseTransformString(node.getAttribute('data-fa-transform'));\n}\n\nfunction symbolParser (node) {\n var symbol = node.getAttribute('data-fa-symbol');\n return symbol === null ? false : symbol === '' ? true : symbol;\n}\n\nfunction attributesParser (node) {\n var extraAttributes = toArray(node.attributes).reduce(function (acc, attr) {\n if (acc.name !== 'class' && acc.name !== 'style') {\n acc[attr.name] = attr.value;\n }\n\n return acc;\n }, {});\n var title = node.getAttribute('title');\n var titleId = node.getAttribute('data-fa-title-id');\n\n if (config.autoA11y) {\n if (title) {\n extraAttributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(titleId || nextUniqueId());\n } else {\n extraAttributes['aria-hidden'] = 'true';\n extraAttributes['focusable'] = 'false';\n }\n }\n\n return extraAttributes;\n}\n\nfunction maskParser (node) {\n var mask = node.getAttribute('data-fa-mask');\n\n if (!mask) {\n return emptyCanonicalIcon();\n } else {\n return getCanonicalIcon(mask.split(' ').map(function (i) {\n return i.trim();\n }));\n }\n}\n\nfunction blankMeta() {\n return {\n iconName: null,\n title: null,\n titleId: null,\n prefix: null,\n transform: meaninglessTransform,\n symbol: false,\n mask: null,\n maskId: null,\n extra: {\n classes: [],\n styles: {},\n attributes: {}\n }\n };\n}\nfunction parseMeta(node) {\n var _classParser = classParser(node),\n iconName = _classParser.iconName,\n prefix = _classParser.prefix,\n extraClasses = _classParser.rest;\n\n var extraStyles = styleParser(node);\n var transform = transformParser(node);\n var symbol = symbolParser(node);\n var extraAttributes = attributesParser(node);\n var mask = maskParser(node);\n return {\n iconName: iconName,\n title: node.getAttribute('title'),\n titleId: node.getAttribute('data-fa-title-id'),\n prefix: prefix,\n transform: transform,\n symbol: symbol,\n mask: mask,\n maskId: node.getAttribute('data-fa-mask-id'),\n extra: {\n classes: extraClasses,\n styles: extraStyles,\n attributes: extraAttributes\n }\n };\n}\n\nfunction MissingIcon(error) {\n this.name = 'MissingIcon';\n this.message = error || 'Icon unavailable';\n this.stack = new Error().stack;\n}\nMissingIcon.prototype = Object.create(Error.prototype);\nMissingIcon.prototype.constructor = MissingIcon;\n\nvar FILL = {\n fill: 'currentColor'\n};\nvar ANIMATION_BASE = {\n attributeType: 'XML',\n repeatCount: 'indefinite',\n dur: '2s'\n};\nvar RING = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n d: 'M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z'\n })\n};\n\nvar OPACITY_ANIMATE = _objectSpread({}, ANIMATION_BASE, {\n attributeName: 'opacity'\n});\n\nvar DOT = {\n tag: 'circle',\n attributes: _objectSpread({}, FILL, {\n cx: '256',\n cy: '364',\n r: '28'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, ANIMATION_BASE, {\n attributeName: 'r',\n values: '28;14;28;28;14;28;'\n })\n }, {\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '1;0;1;1;0;1;'\n })\n }]\n};\nvar QUESTION = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n opacity: '1',\n d: 'M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '1;0;0;0;0;1;'\n })\n }]\n};\nvar EXCLAMATION = {\n tag: 'path',\n attributes: _objectSpread({}, FILL, {\n opacity: '0',\n d: 'M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z'\n }),\n children: [{\n tag: 'animate',\n attributes: _objectSpread({}, OPACITY_ANIMATE, {\n values: '0;0;1;1;0;0;'\n })\n }]\n};\nvar missing = {\n tag: 'g',\n children: [RING, DOT, QUESTION, EXCLAMATION]\n};\n\nvar styles$2 = namespace.styles;\nfunction asFoundIcon(icon) {\n var width = icon[0];\n var height = icon[1];\n\n var _icon$slice = icon.slice(4),\n _icon$slice2 = _slicedToArray(_icon$slice, 1),\n vectorData = _icon$slice2[0];\n\n var element = null;\n\n if (Array.isArray(vectorData)) {\n element = {\n tag: 'g',\n attributes: {\n class: \"\".concat(config.familyPrefix, \"-\").concat(DUOTONE_CLASSES.GROUP)\n },\n children: [{\n tag: 'path',\n attributes: {\n class: \"\".concat(config.familyPrefix, \"-\").concat(DUOTONE_CLASSES.SECONDARY),\n fill: 'currentColor',\n d: vectorData[0]\n }\n }, {\n tag: 'path',\n attributes: {\n class: \"\".concat(config.familyPrefix, \"-\").concat(DUOTONE_CLASSES.PRIMARY),\n fill: 'currentColor',\n d: vectorData[1]\n }\n }]\n };\n } else {\n element = {\n tag: 'path',\n attributes: {\n fill: 'currentColor',\n d: vectorData\n }\n };\n }\n\n return {\n found: true,\n width: width,\n height: height,\n icon: element\n };\n}\nfunction findIcon(iconName, prefix) {\n return new picked(function (resolve, reject) {\n var val = {\n found: false,\n width: 512,\n height: 512,\n icon: missing\n };\n\n if (iconName && prefix && styles$2[prefix] && styles$2[prefix][iconName]) {\n var icon = styles$2[prefix][iconName];\n return resolve(asFoundIcon(icon));\n }\n\n if (iconName && prefix && !config.showMissingIcons) {\n reject(new MissingIcon(\"Icon is missing for prefix \".concat(prefix, \" with icon name \").concat(iconName)));\n } else {\n resolve(val);\n }\n });\n}\n\nvar styles$3 = namespace.styles;\n\nfunction generateSvgReplacementMutation(node, nodeMeta) {\n var iconName = nodeMeta.iconName,\n title = nodeMeta.title,\n titleId = nodeMeta.titleId,\n prefix = nodeMeta.prefix,\n transform = nodeMeta.transform,\n symbol = nodeMeta.symbol,\n mask = nodeMeta.mask,\n maskId = nodeMeta.maskId,\n extra = nodeMeta.extra;\n return new picked(function (resolve, reject) {\n picked.all([findIcon(iconName, prefix), findIcon(mask.iconName, mask.prefix)]).then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n main = _ref2[0],\n mask = _ref2[1];\n\n resolve([node, makeInlineSvgAbstract({\n icons: {\n main: main,\n mask: mask\n },\n prefix: prefix,\n iconName: iconName,\n transform: transform,\n symbol: symbol,\n mask: mask,\n maskId: maskId,\n title: title,\n titleId: titleId,\n extra: extra,\n watchable: true\n })]);\n });\n });\n}\n\nfunction generateLayersText(node, nodeMeta) {\n var title = nodeMeta.title,\n transform = nodeMeta.transform,\n extra = nodeMeta.extra;\n var width = null;\n var height = null;\n\n if (IS_IE) {\n var computedFontSize = parseInt(getComputedStyle(node).fontSize, 10);\n var boundingClientRect = node.getBoundingClientRect();\n width = boundingClientRect.width / computedFontSize;\n height = boundingClientRect.height / computedFontSize;\n }\n\n if (config.autoA11y && !title) {\n extra.attributes['aria-hidden'] = 'true';\n }\n\n return picked.resolve([node, makeLayersTextAbstract({\n content: node.innerHTML,\n width: width,\n height: height,\n transform: transform,\n title: title,\n extra: extra,\n watchable: true\n })]);\n}\n\nfunction generateMutation(node) {\n var nodeMeta = parseMeta(node);\n\n if (~nodeMeta.extra.classes.indexOf(LAYERS_TEXT_CLASSNAME)) {\n return generateLayersText(node, nodeMeta);\n } else {\n return generateSvgReplacementMutation(node, nodeMeta);\n }\n}\n\nfunction onTree(root) {\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n if (!IS_DOM) return;\n var htmlClassList = DOCUMENT.documentElement.classList;\n\n var hclAdd = function hclAdd(suffix) {\n return htmlClassList.add(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n };\n\n var hclRemove = function hclRemove(suffix) {\n return htmlClassList.remove(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n };\n\n var prefixes = config.autoFetchSvg ? Object.keys(PREFIX_TO_STYLE) : Object.keys(styles$3);\n var prefixesDomQuery = [\".\".concat(LAYERS_TEXT_CLASSNAME, \":not([\").concat(DATA_FA_I2SVG, \"])\")].concat(prefixes.map(function (p) {\n return \".\".concat(p, \":not([\").concat(DATA_FA_I2SVG, \"])\");\n })).join(', ');\n\n if (prefixesDomQuery.length === 0) {\n return;\n }\n\n var candidates = [];\n\n try {\n candidates = toArray(root.querySelectorAll(prefixesDomQuery));\n } catch (e) {// noop\n }\n\n if (candidates.length > 0) {\n hclAdd('pending');\n hclRemove('complete');\n } else {\n return;\n }\n\n var mark = perf.begin('onTree');\n var mutations = candidates.reduce(function (acc, node) {\n try {\n var mutation = generateMutation(node);\n\n if (mutation) {\n acc.push(mutation);\n }\n } catch (e) {\n if (!PRODUCTION) {\n if (e instanceof MissingIcon) {\n console.error(e);\n }\n }\n }\n\n return acc;\n }, []);\n return new picked(function (resolve, reject) {\n picked.all(mutations).then(function (resolvedMutations) {\n perform(resolvedMutations, function () {\n hclAdd('active');\n hclAdd('complete');\n hclRemove('pending');\n if (typeof callback === 'function') callback();\n mark();\n resolve();\n });\n }).catch(function () {\n mark();\n reject();\n });\n });\n}\nfunction onNode(node) {\n var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n generateMutation(node).then(function (mutation) {\n if (mutation) {\n perform([mutation], callback);\n }\n });\n}\n\nfunction replaceForPosition(node, position) {\n var pendingAttribute = \"\".concat(DATA_FA_PSEUDO_ELEMENT_PENDING).concat(position.replace(':', '-'));\n return new picked(function (resolve, reject) {\n if (node.getAttribute(pendingAttribute) !== null) {\n // This node is already being processed\n return resolve();\n }\n\n var children = toArray(node.children);\n var alreadyProcessedPseudoElement = children.filter(function (c) {\n return c.getAttribute(DATA_FA_PSEUDO_ELEMENT) === position;\n })[0];\n var styles = WINDOW.getComputedStyle(node, position);\n var fontFamily = styles.getPropertyValue('font-family').match(FONT_FAMILY_PATTERN);\n var fontWeight = styles.getPropertyValue('font-weight');\n var content = styles.getPropertyValue('content');\n\n if (alreadyProcessedPseudoElement && !fontFamily) {\n // If we've already processed it but the current computed style does not result in a font-family,\n // that probably means that a class name that was previously present to make the icon has been\n // removed. So we now should delete the icon.\n node.removeChild(alreadyProcessedPseudoElement);\n return resolve();\n } else if (fontFamily && content !== 'none' && content !== '') {\n var _content = styles.getPropertyValue('content');\n\n var prefix = ~['Solid', 'Regular', 'Light', 'Duotone', 'Brands', 'Kit'].indexOf(fontFamily[2]) ? STYLE_TO_PREFIX[fontFamily[2].toLowerCase()] : FONT_WEIGHT_TO_PREFIX[fontWeight];\n var hexValue = toHex(_content.length === 3 ? _content.substr(1, 1) : _content);\n var iconName = byUnicode(prefix, hexValue);\n var iconIdentifier = iconName; // Only convert the pseudo element in this :before/:after position into an icon if we haven't\n // already done so with the same prefix and iconName\n\n if (iconName && (!alreadyProcessedPseudoElement || alreadyProcessedPseudoElement.getAttribute(DATA_PREFIX) !== prefix || alreadyProcessedPseudoElement.getAttribute(DATA_ICON) !== iconIdentifier)) {\n node.setAttribute(pendingAttribute, iconIdentifier);\n\n if (alreadyProcessedPseudoElement) {\n // Delete the old one, since we're replacing it with a new one\n node.removeChild(alreadyProcessedPseudoElement);\n }\n\n var meta = blankMeta();\n var extra = meta.extra;\n extra.attributes[DATA_FA_PSEUDO_ELEMENT] = position;\n findIcon(iconName, prefix).then(function (main) {\n var abstract = makeInlineSvgAbstract(_objectSpread({}, meta, {\n icons: {\n main: main,\n mask: emptyCanonicalIcon()\n },\n prefix: prefix,\n iconName: iconIdentifier,\n extra: extra,\n watchable: true\n }));\n var element = DOCUMENT.createElement('svg');\n\n if (position === ':before') {\n node.insertBefore(element, node.firstChild);\n } else {\n node.appendChild(element);\n }\n\n element.outerHTML = abstract.map(function (a) {\n return toHtml(a);\n }).join('\\n');\n node.removeAttribute(pendingAttribute);\n resolve();\n }).catch(reject);\n } else {\n resolve();\n }\n } else {\n resolve();\n }\n });\n}\n\nfunction replace(node) {\n return picked.all([replaceForPosition(node, ':before'), replaceForPosition(node, ':after')]);\n}\n\nfunction processable(node) {\n return node.parentNode !== document.head && !~TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS.indexOf(node.tagName.toUpperCase()) && !node.getAttribute(DATA_FA_PSEUDO_ELEMENT) && (!node.parentNode || node.parentNode.tagName !== 'svg');\n}\n\nfunction searchPseudoElements (root) {\n if (!IS_DOM) return;\n return new picked(function (resolve, reject) {\n var operations = toArray(root.querySelectorAll('*')).filter(processable).map(replace);\n var end = perf.begin('searchPseudoElements');\n disableObservation();\n picked.all(operations).then(function () {\n end();\n enableObservation();\n resolve();\n }).catch(function () {\n end();\n enableObservation();\n reject();\n });\n });\n}\n\nvar baseStyles = \"svg:not(:root).svg-inline--fa {\\n overflow: visible;\\n}\\n\\n.svg-inline--fa {\\n display: inline-block;\\n font-size: inherit;\\n height: 1em;\\n overflow: visible;\\n vertical-align: -0.125em;\\n}\\n.svg-inline--fa.fa-lg {\\n vertical-align: -0.225em;\\n}\\n.svg-inline--fa.fa-w-1 {\\n width: 0.0625em;\\n}\\n.svg-inline--fa.fa-w-2 {\\n width: 0.125em;\\n}\\n.svg-inline--fa.fa-w-3 {\\n width: 0.1875em;\\n}\\n.svg-inline--fa.fa-w-4 {\\n width: 0.25em;\\n}\\n.svg-inline--fa.fa-w-5 {\\n width: 0.3125em;\\n}\\n.svg-inline--fa.fa-w-6 {\\n width: 0.375em;\\n}\\n.svg-inline--fa.fa-w-7 {\\n width: 0.4375em;\\n}\\n.svg-inline--fa.fa-w-8 {\\n width: 0.5em;\\n}\\n.svg-inline--fa.fa-w-9 {\\n width: 0.5625em;\\n}\\n.svg-inline--fa.fa-w-10 {\\n width: 0.625em;\\n}\\n.svg-inline--fa.fa-w-11 {\\n width: 0.6875em;\\n}\\n.svg-inline--fa.fa-w-12 {\\n width: 0.75em;\\n}\\n.svg-inline--fa.fa-w-13 {\\n width: 0.8125em;\\n}\\n.svg-inline--fa.fa-w-14 {\\n width: 0.875em;\\n}\\n.svg-inline--fa.fa-w-15 {\\n width: 0.9375em;\\n}\\n.svg-inline--fa.fa-w-16 {\\n width: 1em;\\n}\\n.svg-inline--fa.fa-w-17 {\\n width: 1.0625em;\\n}\\n.svg-inline--fa.fa-w-18 {\\n width: 1.125em;\\n}\\n.svg-inline--fa.fa-w-19 {\\n width: 1.1875em;\\n}\\n.svg-inline--fa.fa-w-20 {\\n width: 1.25em;\\n}\\n.svg-inline--fa.fa-pull-left {\\n margin-right: 0.3em;\\n width: auto;\\n}\\n.svg-inline--fa.fa-pull-right {\\n margin-left: 0.3em;\\n width: auto;\\n}\\n.svg-inline--fa.fa-border {\\n height: 1.5em;\\n}\\n.svg-inline--fa.fa-li {\\n width: 2em;\\n}\\n.svg-inline--fa.fa-fw {\\n width: 1.25em;\\n}\\n\\n.fa-layers svg.svg-inline--fa {\\n bottom: 0;\\n left: 0;\\n margin: auto;\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n\\n.fa-layers {\\n display: inline-block;\\n height: 1em;\\n position: relative;\\n text-align: center;\\n vertical-align: -0.125em;\\n width: 1em;\\n}\\n.fa-layers svg.svg-inline--fa {\\n -webkit-transform-origin: center center;\\n transform-origin: center center;\\n}\\n\\n.fa-layers-counter, .fa-layers-text {\\n display: inline-block;\\n position: absolute;\\n text-align: center;\\n}\\n\\n.fa-layers-text {\\n left: 50%;\\n top: 50%;\\n -webkit-transform: translate(-50%, -50%);\\n transform: translate(-50%, -50%);\\n -webkit-transform-origin: center center;\\n transform-origin: center center;\\n}\\n\\n.fa-layers-counter {\\n background-color: #ff253a;\\n border-radius: 1em;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n color: #fff;\\n height: 1.5em;\\n line-height: 1;\\n max-width: 5em;\\n min-width: 1.5em;\\n overflow: hidden;\\n padding: 0.25em;\\n right: 0;\\n text-overflow: ellipsis;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top right;\\n transform-origin: top right;\\n}\\n\\n.fa-layers-bottom-right {\\n bottom: 0;\\n right: 0;\\n top: auto;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: bottom right;\\n transform-origin: bottom right;\\n}\\n\\n.fa-layers-bottom-left {\\n bottom: 0;\\n left: 0;\\n right: auto;\\n top: auto;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: bottom left;\\n transform-origin: bottom left;\\n}\\n\\n.fa-layers-top-right {\\n right: 0;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top right;\\n transform-origin: top right;\\n}\\n\\n.fa-layers-top-left {\\n left: 0;\\n right: auto;\\n top: 0;\\n -webkit-transform: scale(0.25);\\n transform: scale(0.25);\\n -webkit-transform-origin: top left;\\n transform-origin: top left;\\n}\\n\\n.fa-lg {\\n font-size: 1.3333333333em;\\n line-height: 0.75em;\\n vertical-align: -0.0667em;\\n}\\n\\n.fa-xs {\\n font-size: 0.75em;\\n}\\n\\n.fa-sm {\\n font-size: 0.875em;\\n}\\n\\n.fa-1x {\\n font-size: 1em;\\n}\\n\\n.fa-2x {\\n font-size: 2em;\\n}\\n\\n.fa-3x {\\n font-size: 3em;\\n}\\n\\n.fa-4x {\\n font-size: 4em;\\n}\\n\\n.fa-5x {\\n font-size: 5em;\\n}\\n\\n.fa-6x {\\n font-size: 6em;\\n}\\n\\n.fa-7x {\\n font-size: 7em;\\n}\\n\\n.fa-8x {\\n font-size: 8em;\\n}\\n\\n.fa-9x {\\n font-size: 9em;\\n}\\n\\n.fa-10x {\\n font-size: 10em;\\n}\\n\\n.fa-fw {\\n text-align: center;\\n width: 1.25em;\\n}\\n\\n.fa-ul {\\n list-style-type: none;\\n margin-left: 2.5em;\\n padding-left: 0;\\n}\\n.fa-ul > li {\\n position: relative;\\n}\\n\\n.fa-li {\\n left: -2em;\\n position: absolute;\\n text-align: center;\\n width: 2em;\\n line-height: inherit;\\n}\\n\\n.fa-border {\\n border: solid 0.08em #eee;\\n border-radius: 0.1em;\\n padding: 0.2em 0.25em 0.15em;\\n}\\n\\n.fa-pull-left {\\n float: left;\\n}\\n\\n.fa-pull-right {\\n float: right;\\n}\\n\\n.fa.fa-pull-left,\\n.fas.fa-pull-left,\\n.far.fa-pull-left,\\n.fal.fa-pull-left,\\n.fab.fa-pull-left {\\n margin-right: 0.3em;\\n}\\n.fa.fa-pull-right,\\n.fas.fa-pull-right,\\n.far.fa-pull-right,\\n.fal.fa-pull-right,\\n.fab.fa-pull-right {\\n margin-left: 0.3em;\\n}\\n\\n.fa-spin {\\n -webkit-animation: fa-spin 2s infinite linear;\\n animation: fa-spin 2s infinite linear;\\n}\\n\\n.fa-pulse {\\n -webkit-animation: fa-spin 1s infinite steps(8);\\n animation: fa-spin 1s infinite steps(8);\\n}\\n\\n@-webkit-keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n\\n@keyframes fa-spin {\\n 0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n }\\n 100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n }\\n}\\n.fa-rotate-90 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\\\";\\n -webkit-transform: rotate(90deg);\\n transform: rotate(90deg);\\n}\\n\\n.fa-rotate-180 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\\\";\\n -webkit-transform: rotate(180deg);\\n transform: rotate(180deg);\\n}\\n\\n.fa-rotate-270 {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\\\";\\n -webkit-transform: rotate(270deg);\\n transform: rotate(270deg);\\n}\\n\\n.fa-flip-horizontal {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\\\";\\n -webkit-transform: scale(-1, 1);\\n transform: scale(-1, 1);\\n}\\n\\n.fa-flip-vertical {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";\\n -webkit-transform: scale(1, -1);\\n transform: scale(1, -1);\\n}\\n\\n.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\\\";\\n -webkit-transform: scale(-1, -1);\\n transform: scale(-1, -1);\\n}\\n\\n:root .fa-rotate-90,\\n:root .fa-rotate-180,\\n:root .fa-rotate-270,\\n:root .fa-flip-horizontal,\\n:root .fa-flip-vertical,\\n:root .fa-flip-both {\\n -webkit-filter: none;\\n filter: none;\\n}\\n\\n.fa-stack {\\n display: inline-block;\\n height: 2em;\\n position: relative;\\n width: 2.5em;\\n}\\n\\n.fa-stack-1x,\\n.fa-stack-2x {\\n bottom: 0;\\n left: 0;\\n margin: auto;\\n position: absolute;\\n right: 0;\\n top: 0;\\n}\\n\\n.svg-inline--fa.fa-stack-1x {\\n height: 1em;\\n width: 1.25em;\\n}\\n.svg-inline--fa.fa-stack-2x {\\n height: 2em;\\n width: 2.5em;\\n}\\n\\n.fa-inverse {\\n color: #fff;\\n}\\n\\n.sr-only {\\n border: 0;\\n clip: rect(0, 0, 0, 0);\\n height: 1px;\\n margin: -1px;\\n overflow: hidden;\\n padding: 0;\\n position: absolute;\\n width: 1px;\\n}\\n\\n.sr-only-focusable:active, .sr-only-focusable:focus {\\n clip: auto;\\n height: auto;\\n margin: 0;\\n overflow: visible;\\n position: static;\\n width: auto;\\n}\\n\\n.svg-inline--fa .fa-primary {\\n fill: var(--fa-primary-color, currentColor);\\n opacity: 1;\\n opacity: var(--fa-primary-opacity, 1);\\n}\\n\\n.svg-inline--fa .fa-secondary {\\n fill: var(--fa-secondary-color, currentColor);\\n opacity: 0.4;\\n opacity: var(--fa-secondary-opacity, 0.4);\\n}\\n\\n.svg-inline--fa.fa-swap-opacity .fa-primary {\\n opacity: 0.4;\\n opacity: var(--fa-secondary-opacity, 0.4);\\n}\\n\\n.svg-inline--fa.fa-swap-opacity .fa-secondary {\\n opacity: 1;\\n opacity: var(--fa-primary-opacity, 1);\\n}\\n\\n.svg-inline--fa mask .fa-primary,\\n.svg-inline--fa mask .fa-secondary {\\n fill: black;\\n}\\n\\n.fad.fa-inverse {\\n color: #fff;\\n}\";\n\nfunction css () {\n var dfp = DEFAULT_FAMILY_PREFIX;\n var drc = DEFAULT_REPLACEMENT_CLASS;\n var fp = config.familyPrefix;\n var rc = config.replacementClass;\n var s = baseStyles;\n\n if (fp !== dfp || rc !== drc) {\n var dPatt = new RegExp(\"\\\\.\".concat(dfp, \"\\\\-\"), 'g');\n var customPropPatt = new RegExp(\"\\\\--\".concat(dfp, \"\\\\-\"), 'g');\n var rPatt = new RegExp(\"\\\\.\".concat(drc), 'g');\n s = s.replace(dPatt, \".\".concat(fp, \"-\")).replace(customPropPatt, \"--\".concat(fp, \"-\")).replace(rPatt, \".\".concat(rc));\n }\n\n return s;\n}\n\nvar Library =\n/*#__PURE__*/\nfunction () {\n function Library() {\n _classCallCheck(this, Library);\n\n this.definitions = {};\n }\n\n _createClass(Library, [{\n key: \"add\",\n value: function add() {\n var _this = this;\n\n for (var _len = arguments.length, definitions = new Array(_len), _key = 0; _key < _len; _key++) {\n definitions[_key] = arguments[_key];\n }\n\n var additions = definitions.reduce(this._pullDefinitions, {});\n Object.keys(additions).forEach(function (key) {\n _this.definitions[key] = _objectSpread({}, _this.definitions[key] || {}, additions[key]);\n defineIcons(key, additions[key]);\n build();\n });\n }\n }, {\n key: \"reset\",\n value: function reset() {\n this.definitions = {};\n }\n }, {\n key: \"_pullDefinitions\",\n value: function _pullDefinitions(additions, definition) {\n var normalized = definition.prefix && definition.iconName && definition.icon ? {\n 0: definition\n } : definition;\n Object.keys(normalized).map(function (key) {\n var _normalized$key = normalized[key],\n prefix = _normalized$key.prefix,\n iconName = _normalized$key.iconName,\n icon = _normalized$key.icon;\n if (!additions[prefix]) additions[prefix] = {};\n additions[prefix][iconName] = icon;\n });\n return additions;\n }\n }]);\n\n return Library;\n}();\n\nfunction ensureCss() {\n if (config.autoAddCss && !_cssInserted) {\n insertCss(css());\n\n _cssInserted = true;\n }\n}\n\nfunction apiObject(val, abstractCreator) {\n Object.defineProperty(val, 'abstract', {\n get: abstractCreator\n });\n Object.defineProperty(val, 'html', {\n get: function get() {\n return val.abstract.map(function (a) {\n return toHtml(a);\n });\n }\n });\n Object.defineProperty(val, 'node', {\n get: function get() {\n if (!IS_DOM) return;\n var container = DOCUMENT.createElement('div');\n container.innerHTML = val.html;\n return container.children;\n }\n });\n return val;\n}\n\nfunction findIconDefinition(iconLookup) {\n var _iconLookup$prefix = iconLookup.prefix,\n prefix = _iconLookup$prefix === void 0 ? 'fa' : _iconLookup$prefix,\n iconName = iconLookup.iconName;\n if (!iconName) return;\n return iconFromMapping(library.definitions, prefix, iconName) || iconFromMapping(namespace.styles, prefix, iconName);\n}\n\nfunction resolveIcons(next) {\n return function (maybeIconDefinition) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var iconDefinition = (maybeIconDefinition || {}).icon ? maybeIconDefinition : findIconDefinition(maybeIconDefinition || {});\n var mask = params.mask;\n\n if (mask) {\n mask = (mask || {}).icon ? mask : findIconDefinition(mask || {});\n }\n\n return next(iconDefinition, _objectSpread({}, params, {\n mask: mask\n }));\n };\n}\n\nvar library = new Library();\nvar noAuto = function noAuto() {\n config.autoReplaceSvg = false;\n config.observeMutations = false;\n disconnect();\n};\nvar _cssInserted = false;\nvar dom = {\n i2svg: function i2svg() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n if (IS_DOM) {\n ensureCss();\n var _params$node = params.node,\n node = _params$node === void 0 ? DOCUMENT : _params$node,\n _params$callback = params.callback,\n callback = _params$callback === void 0 ? function () {} : _params$callback;\n\n if (config.searchPseudoElements) {\n searchPseudoElements(node);\n }\n\n return onTree(node, callback);\n } else {\n return picked.reject('Operation requires a DOM of some kind.');\n }\n },\n css: css,\n insertCss: function insertCss$$1() {\n if (!_cssInserted) {\n insertCss(css());\n\n _cssInserted = true;\n }\n },\n watch: function watch() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var autoReplaceSvgRoot = params.autoReplaceSvgRoot,\n observeMutationsRoot = params.observeMutationsRoot;\n\n if (config.autoReplaceSvg === false) {\n config.autoReplaceSvg = true;\n }\n\n config.observeMutations = true;\n domready(function () {\n autoReplace({\n autoReplaceSvgRoot: autoReplaceSvgRoot\n });\n observe({\n treeCallback: onTree,\n nodeCallback: onNode,\n pseudoElementsCallback: searchPseudoElements,\n observeMutationsRoot: observeMutationsRoot\n });\n });\n }\n};\nvar parse = {\n transform: function transform(transformString) {\n return parseTransformString(transformString);\n }\n};\nvar icon = resolveIcons(function (iconDefinition) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$transform = params.transform,\n transform = _params$transform === void 0 ? meaninglessTransform : _params$transform,\n _params$symbol = params.symbol,\n symbol = _params$symbol === void 0 ? false : _params$symbol,\n _params$mask = params.mask,\n mask = _params$mask === void 0 ? null : _params$mask,\n _params$maskId = params.maskId,\n maskId = _params$maskId === void 0 ? null : _params$maskId,\n _params$title = params.title,\n title = _params$title === void 0 ? null : _params$title,\n _params$titleId = params.titleId,\n titleId = _params$titleId === void 0 ? null : _params$titleId,\n _params$classes = params.classes,\n classes = _params$classes === void 0 ? [] : _params$classes,\n _params$attributes = params.attributes,\n attributes = _params$attributes === void 0 ? {} : _params$attributes,\n _params$styles = params.styles,\n styles = _params$styles === void 0 ? {} : _params$styles;\n if (!iconDefinition) return;\n var prefix = iconDefinition.prefix,\n iconName = iconDefinition.iconName,\n icon = iconDefinition.icon;\n return apiObject(_objectSpread({\n type: 'icon'\n }, iconDefinition), function () {\n ensureCss();\n\n if (config.autoA11y) {\n if (title) {\n attributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(titleId || nextUniqueId());\n } else {\n attributes['aria-hidden'] = 'true';\n attributes['focusable'] = 'false';\n }\n }\n\n return makeInlineSvgAbstract({\n icons: {\n main: asFoundIcon(icon),\n mask: mask ? asFoundIcon(mask.icon) : {\n found: false,\n width: null,\n height: null,\n icon: {}\n }\n },\n prefix: prefix,\n iconName: iconName,\n transform: _objectSpread({}, meaninglessTransform, transform),\n symbol: symbol,\n title: title,\n maskId: maskId,\n titleId: titleId,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: classes\n }\n });\n });\n});\nvar text = function text(content) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$transform2 = params.transform,\n transform = _params$transform2 === void 0 ? meaninglessTransform : _params$transform2,\n _params$title2 = params.title,\n title = _params$title2 === void 0 ? null : _params$title2,\n _params$classes2 = params.classes,\n classes = _params$classes2 === void 0 ? [] : _params$classes2,\n _params$attributes2 = params.attributes,\n attributes = _params$attributes2 === void 0 ? {} : _params$attributes2,\n _params$styles2 = params.styles,\n styles = _params$styles2 === void 0 ? {} : _params$styles2;\n return apiObject({\n type: 'text',\n content: content\n }, function () {\n ensureCss();\n return makeLayersTextAbstract({\n content: content,\n transform: _objectSpread({}, meaninglessTransform, transform),\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: [\"\".concat(config.familyPrefix, \"-layers-text\")].concat(_toConsumableArray(classes))\n }\n });\n });\n};\nvar counter = function counter(content) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$title3 = params.title,\n title = _params$title3 === void 0 ? null : _params$title3,\n _params$classes3 = params.classes,\n classes = _params$classes3 === void 0 ? [] : _params$classes3,\n _params$attributes3 = params.attributes,\n attributes = _params$attributes3 === void 0 ? {} : _params$attributes3,\n _params$styles3 = params.styles,\n styles = _params$styles3 === void 0 ? {} : _params$styles3;\n return apiObject({\n type: 'counter',\n content: content\n }, function () {\n ensureCss();\n return makeLayersCounterAbstract({\n content: content.toString(),\n title: title,\n extra: {\n attributes: attributes,\n styles: styles,\n classes: [\"\".concat(config.familyPrefix, \"-layers-counter\")].concat(_toConsumableArray(classes))\n }\n });\n });\n};\nvar layer = function layer(assembler) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _params$classes4 = params.classes,\n classes = _params$classes4 === void 0 ? [] : _params$classes4;\n return apiObject({\n type: 'layer'\n }, function () {\n ensureCss();\n var children = [];\n assembler(function (args) {\n Array.isArray(args) ? args.map(function (a) {\n children = children.concat(a.abstract);\n }) : children = children.concat(args.abstract);\n });\n return [{\n tag: 'span',\n attributes: {\n class: [\"\".concat(config.familyPrefix, \"-layers\")].concat(_toConsumableArray(classes)).join(' ')\n },\n children: children\n }];\n });\n};\nvar api = {\n noAuto: noAuto,\n config: config,\n dom: dom,\n library: library,\n parse: parse,\n findIconDefinition: findIconDefinition,\n icon: icon,\n text: text,\n counter: counter,\n layer: layer,\n toHtml: toHtml\n};\n\nvar autoReplace = function autoReplace() {\n var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var _params$autoReplaceSv = params.autoReplaceSvgRoot,\n autoReplaceSvgRoot = _params$autoReplaceSv === void 0 ? DOCUMENT : _params$autoReplaceSv;\n if ((Object.keys(namespace.styles).length > 0 || config.autoFetchSvg) && IS_DOM && config.autoReplaceSvg) api.dom.i2svg({\n node: autoReplaceSvgRoot\n });\n};\n\nexport { icon, noAuto, config, toHtml, layer, text, counter, library, dom, parse, findIconDefinition };\n","import { parse, icon } from '@fortawesome/fontawesome-svg-core';\nimport PropTypes from 'prop-types';\nimport React from 'react';\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n enumerableOnly && (symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n })), keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = null != arguments[i] ? arguments[i] : {};\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n\n return target;\n}\n\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\n// Get CSS class list from a props object\nfunction classList(props) {\n var _classes;\n\n var beat = props.beat,\n fade = props.fade,\n beatFade = props.beatFade,\n bounce = props.bounce,\n shake = props.shake,\n flash = props.flash,\n spin = props.spin,\n spinPulse = props.spinPulse,\n spinReverse = props.spinReverse,\n pulse = props.pulse,\n fixedWidth = props.fixedWidth,\n inverse = props.inverse,\n border = props.border,\n listItem = props.listItem,\n flip = props.flip,\n size = props.size,\n rotation = props.rotation,\n pull = props.pull; // map of CSS class names to properties\n\n var classes = (_classes = {\n 'fa-beat': beat,\n 'fa-fade': fade,\n 'fa-beat-fade': beatFade,\n 'fa-bounce': bounce,\n 'fa-shake': shake,\n 'fa-flash': flash,\n 'fa-spin': spin,\n 'fa-spin-reverse': spinReverse,\n 'fa-spin-pulse': spinPulse,\n 'fa-pulse': pulse,\n 'fa-fw': fixedWidth,\n 'fa-inverse': inverse,\n 'fa-border': border,\n 'fa-li': listItem,\n 'fa-flip': flip === true,\n 'fa-flip-horizontal': flip === 'horizontal' || flip === 'both',\n 'fa-flip-vertical': flip === 'vertical' || flip === 'both'\n }, _defineProperty(_classes, \"fa-\".concat(size), typeof size !== 'undefined' && size !== null), _defineProperty(_classes, \"fa-rotate-\".concat(rotation), typeof rotation !== 'undefined' && rotation !== null && rotation !== 0), _defineProperty(_classes, \"fa-pull-\".concat(pull), typeof pull !== 'undefined' && pull !== null), _defineProperty(_classes, 'fa-swap-opacity', props.swapOpacity), _classes); // map over all the keys in the classes object\n // return an array of the keys where the value for the key is not null\n\n return Object.keys(classes).map(function (key) {\n return classes[key] ? key : null;\n }).filter(function (key) {\n return key;\n });\n}\n\n// Camelize taken from humps\n// humps is copyright © 2012+ Dom Christie\n// Released under the MIT license.\n// Performant way to determine if object coerces to a number\nfunction _isNumerical(obj) {\n obj = obj - 0; // eslint-disable-next-line no-self-compare\n\n return obj === obj;\n}\n\nfunction camelize(string) {\n if (_isNumerical(string)) {\n return string;\n } // eslint-disable-next-line no-useless-escape\n\n\n string = string.replace(/[\\-_\\s]+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n }); // Ensure 1st char is always lowercase\n\n return string.substr(0, 1).toLowerCase() + string.substr(1);\n}\n\nvar _excluded$1 = [\"style\"];\n\nfunction capitalize(val) {\n return val.charAt(0).toUpperCase() + val.slice(1);\n}\n\nfunction styleToObject(style) {\n return style.split(';').map(function (s) {\n return s.trim();\n }).filter(function (s) {\n return s;\n }).reduce(function (acc, pair) {\n var i = pair.indexOf(':');\n var prop = camelize(pair.slice(0, i));\n var value = pair.slice(i + 1).trim();\n prop.startsWith('webkit') ? acc[capitalize(prop)] = value : acc[prop] = value;\n return acc;\n }, {});\n}\n\nfunction convert(createElement, element) {\n var extraProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (typeof element === 'string') {\n return element;\n }\n\n var children = (element.children || []).map(function (child) {\n return convert(createElement, child);\n });\n /* eslint-disable dot-notation */\n\n var mixins = Object.keys(element.attributes || {}).reduce(function (acc, key) {\n var val = element.attributes[key];\n\n switch (key) {\n case 'class':\n acc.attrs['className'] = val;\n delete element.attributes['class'];\n break;\n\n case 'style':\n acc.attrs['style'] = styleToObject(val);\n break;\n\n default:\n if (key.indexOf('aria-') === 0 || key.indexOf('data-') === 0) {\n acc.attrs[key.toLowerCase()] = val;\n } else {\n acc.attrs[camelize(key)] = val;\n }\n\n }\n\n return acc;\n }, {\n attrs: {}\n });\n\n var _extraProps$style = extraProps.style,\n existingStyle = _extraProps$style === void 0 ? {} : _extraProps$style,\n remaining = _objectWithoutProperties(extraProps, _excluded$1);\n\n mixins.attrs['style'] = _objectSpread2(_objectSpread2({}, mixins.attrs['style']), existingStyle);\n /* eslint-enable */\n\n return createElement.apply(void 0, [element.tag, _objectSpread2(_objectSpread2({}, mixins.attrs), remaining)].concat(_toConsumableArray(children)));\n}\n\nvar PRODUCTION = false;\n\ntry {\n PRODUCTION = process.env.NODE_ENV === 'production';\n} catch (e) {}\n\nfunction log () {\n if (!PRODUCTION && console && typeof console.error === 'function') {\n var _console;\n\n (_console = console).error.apply(_console, arguments);\n }\n}\n\nfunction normalizeIconArgs(icon) {\n // this has everything that it needs to be rendered which means it was probably imported\n // directly from an icon svg package\n if (icon && _typeof(icon) === 'object' && icon.prefix && icon.iconName && icon.icon) {\n return icon;\n }\n\n if (parse.icon) {\n return parse.icon(icon);\n } // if the icon is null, there's nothing to do\n\n\n if (icon === null) {\n return null;\n } // if the icon is an object and has a prefix and an icon name, return it\n\n\n if (icon && _typeof(icon) === 'object' && icon.prefix && icon.iconName) {\n return icon;\n } // if it's an array with length of two\n\n\n if (Array.isArray(icon) && icon.length === 2) {\n // use the first item as prefix, second as icon name\n return {\n prefix: icon[0],\n iconName: icon[1]\n };\n } // if it's a string, use it as the icon name\n\n\n if (typeof icon === 'string') {\n return {\n prefix: 'fas',\n iconName: icon\n };\n }\n}\n\n// creates an object with a key of key\n// and a value of value\n// if certain conditions are met\nfunction objectWithKey(key, value) {\n // if the value is a non-empty array\n // or it's not an array but it is truthy\n // then create the object with the key and the value\n // if not, return an empty array\n return Array.isArray(value) && value.length > 0 || !Array.isArray(value) && value ? _defineProperty({}, key, value) : {};\n}\n\nvar _excluded = [\"forwardedRef\"];\nfunction FontAwesomeIcon(_ref) {\n var forwardedRef = _ref.forwardedRef,\n props = _objectWithoutProperties(_ref, _excluded);\n\n var iconArgs = props.icon,\n maskArgs = props.mask,\n symbol = props.symbol,\n className = props.className,\n title = props.title,\n titleId = props.titleId,\n maskId = props.maskId;\n var iconLookup = normalizeIconArgs(iconArgs);\n var classes = objectWithKey('classes', [].concat(_toConsumableArray(classList(props)), _toConsumableArray(className.split(' '))));\n var transform = objectWithKey('transform', typeof props.transform === 'string' ? parse.transform(props.transform) : props.transform);\n var mask = objectWithKey('mask', normalizeIconArgs(maskArgs));\n var renderedIcon = icon(iconLookup, _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({}, classes), transform), mask), {}, {\n symbol: symbol,\n title: title,\n titleId: titleId,\n maskId: maskId\n }));\n\n if (!renderedIcon) {\n log('Could not find icon', iconLookup);\n return null;\n }\n\n var abstract = renderedIcon.abstract;\n var extraProps = {\n ref: forwardedRef\n };\n Object.keys(props).forEach(function (key) {\n // eslint-disable-next-line no-prototype-builtins\n if (!FontAwesomeIcon.defaultProps.hasOwnProperty(key)) {\n extraProps[key] = props[key];\n }\n });\n return convertCurry(abstract[0], extraProps);\n}\nFontAwesomeIcon.displayName = 'FontAwesomeIcon';\nFontAwesomeIcon.propTypes = {\n beat: PropTypes.bool,\n border: PropTypes.bool,\n beatFade: PropTypes.bool,\n bounce: PropTypes.bool,\n className: PropTypes.string,\n fade: PropTypes.bool,\n flash: PropTypes.bool,\n mask: PropTypes.oneOfType([PropTypes.object, PropTypes.array, PropTypes.string]),\n maskId: PropTypes.string,\n fixedWidth: PropTypes.bool,\n inverse: PropTypes.bool,\n flip: PropTypes.oneOf([true, false, 'horizontal', 'vertical', 'both']),\n icon: PropTypes.oneOfType([PropTypes.object, PropTypes.array, PropTypes.string]),\n listItem: PropTypes.bool,\n pull: PropTypes.oneOf(['right', 'left']),\n pulse: PropTypes.bool,\n rotation: PropTypes.oneOf([0, 90, 180, 270]),\n shake: PropTypes.bool,\n size: PropTypes.oneOf(['2xs', 'xs', 'sm', 'lg', 'xl', '2xl', '1x', '2x', '3x', '4x', '5x', '6x', '7x', '8x', '9x', '10x']),\n spin: PropTypes.bool,\n spinPulse: PropTypes.bool,\n spinReverse: PropTypes.bool,\n symbol: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),\n title: PropTypes.string,\n titleId: PropTypes.string,\n transform: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n swapOpacity: PropTypes.bool\n};\nFontAwesomeIcon.defaultProps = {\n border: false,\n className: '',\n mask: null,\n maskId: null,\n fixedWidth: false,\n inverse: false,\n flip: false,\n icon: null,\n listItem: false,\n pull: null,\n pulse: false,\n rotation: null,\n size: null,\n spin: false,\n spinPulse: false,\n spinReverse: false,\n beat: false,\n fade: false,\n beatFade: false,\n bounce: false,\n shake: false,\n symbol: false,\n title: '',\n titleId: null,\n transform: null,\n swapOpacity: false\n};\nvar convertCurry = convert.bind(null, React.createElement);\n\nexport { FontAwesomeIcon };\n","/*!\n * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n */\nvar prefix = \"far\";\nvar faAddressBook = {\n prefix: 'far',\n iconName: 'address-book',\n icon: [448, 512, [], \"f2b9\", \"M436 160c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20zm-68 304H48V48h320v416zM208 256c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2z\"]\n};\nvar faAddressCard = {\n prefix: 'far',\n iconName: 'address-card',\n icon: [576, 512, [], \"f2bb\", \"M528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 400H48V80h480v352zM208 256c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2zM360 320h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8z\"]\n};\nvar faAngry = {\n prefix: 'far',\n iconName: 'angry',\n icon: [496, 512, [], \"f556\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm0-144c-33.6 0-65.2 14.8-86.8 40.6-8.5 10.2-7.1 25.3 3.1 33.8s25.3 7.2 33.8-3c24.8-29.7 75-29.7 99.8 0 8.1 9.7 23.2 11.9 33.8 3 10.2-8.5 11.5-23.6 3.1-33.8-21.6-25.8-53.2-40.6-86.8-40.6zm-48-72c10.3 0 19.9-6.7 23-17.1 3.8-12.7-3.4-26.1-16.1-29.9l-80-24c-12.8-3.9-26.1 3.4-29.9 16.1-3.8 12.7 3.4 26.1 16.1 29.9l28.2 8.5c-3.1 4.9-5.3 10.4-5.3 16.6 0 17.7 14.3 32 32 32s32-14.4 32-32.1zm199-54.9c-3.8-12.7-17.1-19.9-29.9-16.1l-80 24c-12.7 3.8-19.9 17.2-16.1 29.9 3.1 10.4 12.7 17.1 23 17.1 0 17.7 14.3 32 32 32s32-14.3 32-32c0-6.2-2.2-11.7-5.3-16.6l28.2-8.5c12.7-3.7 19.9-17.1 16.1-29.8z\"]\n};\nvar faArrowAltCircleDown = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-down',\n icon: [512, 512, [], \"f358\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm-32-316v116h-67c-10.7 0-16 12.9-8.5 20.5l99 99c4.7 4.7 12.3 4.7 17 0l99-99c7.6-7.6 2.2-20.5-8.5-20.5h-67V140c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12z\"]\n};\nvar faArrowAltCircleLeft = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-left',\n icon: [512, 512, [], \"f359\", \"M8 256c0 137 111 248 248 248s248-111 248-248S393 8 256 8 8 119 8 256zm448 0c0 110.5-89.5 200-200 200S56 366.5 56 256 145.5 56 256 56s200 89.5 200 200zm-72-20v40c0 6.6-5.4 12-12 12H256v67c0 10.7-12.9 16-20.5 8.5l-99-99c-4.7-4.7-4.7-12.3 0-17l99-99c7.6-7.6 20.5-2.2 20.5 8.5v67h116c6.6 0 12 5.4 12 12z\"]\n};\nvar faArrowAltCircleRight = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-right',\n icon: [512, 512, [], \"f35a\", \"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z\"]\n};\nvar faArrowAltCircleUp = {\n prefix: 'far',\n iconName: 'arrow-alt-circle-up',\n icon: [512, 512, [], \"f35b\", \"M256 504c137 0 248-111 248-248S393 8 256 8 8 119 8 256s111 248 248 248zm0-448c110.5 0 200 89.5 200 200s-89.5 200-200 200S56 366.5 56 256 145.5 56 256 56zm20 328h-40c-6.6 0-12-5.4-12-12V256h-67c-10.7 0-16-12.9-8.5-20.5l99-99c4.7-4.7 12.3-4.7 17 0l99 99c7.6 7.6 2.2 20.5-8.5 20.5h-67v116c0 6.6-5.4 12-12 12z\"]\n};\nvar faBell = {\n prefix: 'far',\n iconName: 'bell',\n icon: [448, 512, [], \"f0f3\", \"M439.39 362.29c-19.32-20.76-55.47-51.99-55.47-154.29 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84C118.56 68.1 64.08 130.3 64.08 208c0 102.3-36.15 133.53-55.47 154.29-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h383.8c19.12 0 32-15.6 32.1-32 .05-7.55-2.61-15.27-8.61-21.71zM67.53 368c21.22-27.97 44.42-74.33 44.53-159.42 0-.2-.06-.38-.06-.58 0-61.86 50.14-112 112-112s112 50.14 112 112c0 .2-.06.38-.06.58.11 85.1 23.31 131.46 44.53 159.42H67.53zM224 512c35.32 0 63.97-28.65 63.97-64H160.03c0 35.35 28.65 64 63.97 64z\"]\n};\nvar faBellSlash = {\n prefix: 'far',\n iconName: 'bell-slash',\n icon: [640, 512, [], \"f1f6\", \"M633.99 471.02L36 3.51C29.1-2.01 19.03-.9 13.51 6l-10 12.49C-2.02 25.39-.9 35.46 6 40.98l598 467.51c6.9 5.52 16.96 4.4 22.49-2.49l10-12.49c5.52-6.9 4.41-16.97-2.5-22.49zM163.53 368c16.71-22.03 34.48-55.8 41.4-110.58l-45.47-35.55c-3.27 90.73-36.47 120.68-54.84 140.42-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h279.66l-61.4-48H163.53zM320 96c61.86 0 112 50.14 112 112 0 .2-.06.38-.06.58.02 16.84 1.16 31.77 2.79 45.73l59.53 46.54c-8.31-22.13-14.34-51.49-14.34-92.85 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84c-26.02 5.41-49.45 16.94-69.13 32.72l38.17 29.84C275 103.18 296.65 96 320 96zm0 416c35.32 0 63.97-28.65 63.97-64H256.03c0 35.35 28.65 64 63.97 64z\"]\n};\nvar faBookmark = {\n prefix: 'far',\n iconName: 'bookmark',\n icon: [384, 512, [], \"f02e\", \"M336 0H48C21.49 0 0 21.49 0 48v464l192-112 192 112V48c0-26.51-21.49-48-48-48zm0 428.43l-144-84-144 84V54a6 6 0 0 1 6-6h276c3.314 0 6 2.683 6 5.996V428.43z\"]\n};\nvar faBuilding = {\n prefix: 'far',\n iconName: 'building',\n icon: [448, 512, [], \"f1ad\", \"M128 148v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12zm140 12h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm-128 96h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm128 0h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm-76 84v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm76 12h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm180 124v36H0v-36c0-6.6 5.4-12 12-12h19.5V24c0-13.3 10.7-24 24-24h337c13.3 0 24 10.7 24 24v440H436c6.6 0 12 5.4 12 12zM79.5 463H192v-67c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v67h112.5V49L80 48l-.5 415z\"]\n};\nvar faCalendar = {\n prefix: 'far',\n iconName: 'calendar',\n icon: [448, 512, [], \"f133\", \"M400 64h-48V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H160V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zm-6 400H54c-3.3 0-6-2.7-6-6V160h352v298c0 3.3-2.7 6-6 6z\"]\n};\nvar faCalendarAlt = {\n prefix: 'far',\n iconName: 'calendar-alt',\n icon: [448, 512, [], \"f073\", \"M148 288h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12zm108-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 96v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm192 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96-260v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCalendarCheck = {\n prefix: 'far',\n iconName: 'calendar-check',\n icon: [448, 512, [], \"f274\", \"M400 64h-48V12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v52H160V12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v52H48C21.49 64 0 85.49 0 112v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm-6 400H54a6 6 0 0 1-6-6V160h352v298a6 6 0 0 1-6 6zm-52.849-200.65L198.842 404.519c-4.705 4.667-12.303 4.637-16.971-.068l-75.091-75.699c-4.667-4.705-4.637-12.303.068-16.971l22.719-22.536c4.705-4.667 12.303-4.637 16.97.069l44.104 44.461 111.072-110.181c4.705-4.667 12.303-4.637 16.971.068l22.536 22.718c4.667 4.705 4.636 12.303-.069 16.97z\"]\n};\nvar faCalendarMinus = {\n prefix: 'far',\n iconName: 'calendar-minus',\n icon: [448, 512, [], \"f272\", \"M124 328c-6.6 0-12-5.4-12-12v-24c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v24c0 6.6-5.4 12-12 12H124zm324-216v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCalendarPlus = {\n prefix: 'far',\n iconName: 'calendar-plus',\n icon: [448, 512, [], \"f271\", \"M336 292v24c0 6.6-5.4 12-12 12h-76v76c0 6.6-5.4 12-12 12h-24c-6.6 0-12-5.4-12-12v-76h-76c-6.6 0-12-5.4-12-12v-24c0-6.6 5.4-12 12-12h76v-76c0-6.6 5.4-12 12-12h24c6.6 0 12 5.4 12 12v76h76c6.6 0 12 5.4 12 12zm112-180v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCalendarTimes = {\n prefix: 'far',\n iconName: 'calendar-times',\n icon: [448, 512, [], \"f273\", \"M311.7 374.7l-17 17c-4.7 4.7-12.3 4.7-17 0L224 337.9l-53.7 53.7c-4.7 4.7-12.3 4.7-17 0l-17-17c-4.7-4.7-4.7-12.3 0-17l53.7-53.7-53.7-53.7c-4.7-4.7-4.7-12.3 0-17l17-17c4.7-4.7 12.3-4.7 17 0l53.7 53.7 53.7-53.7c4.7-4.7 12.3-4.7 17 0l17 17c4.7 4.7 4.7 12.3 0 17L257.9 304l53.7 53.7c4.8 4.7 4.8 12.3.1 17zM448 112v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareDown = {\n prefix: 'far',\n iconName: 'caret-square-down',\n icon: [448, 512, [], \"f150\", \"M125.1 208h197.8c10.7 0 16.1 13 8.5 20.5l-98.9 98.3c-4.7 4.7-12.2 4.7-16.9 0l-98.9-98.3c-7.7-7.5-2.3-20.5 8.4-20.5zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareLeft = {\n prefix: 'far',\n iconName: 'caret-square-left',\n icon: [448, 512, [], \"f191\", \"M272 157.1v197.8c0 10.7-13 16.1-20.5 8.5l-98.3-98.9c-4.7-4.7-4.7-12.2 0-16.9l98.3-98.9c7.5-7.7 20.5-2.3 20.5 8.4zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareRight = {\n prefix: 'far',\n iconName: 'caret-square-right',\n icon: [448, 512, [], \"f152\", \"M176 354.9V157.1c0-10.7 13-16.1 20.5-8.5l98.3 98.9c4.7 4.7 4.7 12.2 0 16.9l-98.3 98.9c-7.5 7.7-20.5 2.3-20.5-8.4zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faCaretSquareUp = {\n prefix: 'far',\n iconName: 'caret-square-up',\n icon: [448, 512, [], \"f151\", \"M322.9 304H125.1c-10.7 0-16.1-13-8.5-20.5l98.9-98.3c4.7-4.7 12.2-4.7 16.9 0l98.9 98.3c7.7 7.5 2.3 20.5-8.4 20.5zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faChartBar = {\n prefix: 'far',\n iconName: 'chart-bar',\n icon: [512, 512, [], \"f080\", \"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\"]\n};\nvar faCheckCircle = {\n prefix: 'far',\n iconName: 'check-circle',\n icon: [512, 512, [], \"f058\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 48c110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200-110.532 0-200-89.451-200-200 0-110.532 89.451-200 200-200m140.204 130.267l-22.536-22.718c-4.667-4.705-12.265-4.736-16.97-.068L215.346 303.697l-59.792-60.277c-4.667-4.705-12.265-4.736-16.97-.069l-22.719 22.536c-4.705 4.667-4.736 12.265-.068 16.971l90.781 91.516c4.667 4.705 12.265 4.736 16.97.068l172.589-171.204c4.704-4.668 4.734-12.266.067-16.971z\"]\n};\nvar faCheckSquare = {\n prefix: 'far',\n iconName: 'check-square',\n icon: [448, 512, [], \"f14a\", \"M400 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zm0 400H48V80h352v352zm-35.864-241.724L191.547 361.48c-4.705 4.667-12.303 4.637-16.97-.068l-90.781-91.516c-4.667-4.705-4.637-12.303.069-16.971l22.719-22.536c4.705-4.667 12.303-4.637 16.97.069l59.792 60.277 141.352-140.216c4.705-4.667 12.303-4.637 16.97.068l22.536 22.718c4.667 4.706 4.637 12.304-.068 16.971z\"]\n};\nvar faCircle = {\n prefix: 'far',\n iconName: 'circle',\n icon: [512, 512, [], \"f111\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200z\"]\n};\nvar faClipboard = {\n prefix: 'far',\n iconName: 'clipboard',\n icon: [384, 512, [], \"f328\", \"M336 64h-80c0-35.3-28.7-64-64-64s-64 28.7-64 64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM192 40c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm144 418c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V118c0-3.3 2.7-6 6-6h42v36c0 6.6 5.4 12 12 12h168c6.6 0 12-5.4 12-12v-36h42c3.3 0 6 2.7 6 6z\"]\n};\nvar faClock = {\n prefix: 'far',\n iconName: 'clock',\n icon: [512, 512, [], \"f017\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm61.8-104.4l-84.9-61.7c-3.1-2.3-4.9-5.9-4.9-9.7V116c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v141.7l66.8 48.6c5.4 3.9 6.5 11.4 2.6 16.8L334.6 349c-3.9 5.3-11.4 6.5-16.8 2.6z\"]\n};\nvar faClone = {\n prefix: 'far',\n iconName: 'clone',\n icon: [512, 512, [], \"f24d\", \"M464 0H144c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h320c26.51 0 48-21.49 48-48v-48h48c26.51 0 48-21.49 48-48V48c0-26.51-21.49-48-48-48zM362 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h42v224c0 26.51 21.49 48 48 48h224v42a6 6 0 0 1-6 6zm96-96H150a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h308a6 6 0 0 1 6 6v308a6 6 0 0 1-6 6z\"]\n};\nvar faClosedCaptioning = {\n prefix: 'far',\n iconName: 'closed-captioning',\n icon: [512, 512, [], \"f20a\", \"M464 64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zm-6 336H54c-3.3 0-6-2.7-6-6V118c0-3.3 2.7-6 6-6h404c3.3 0 6 2.7 6 6v276c0 3.3-2.7 6-6 6zm-211.1-85.7c1.7 2.4 1.5 5.6-.5 7.7-53.6 56.8-172.8 32.1-172.8-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7l-17.5 30.5c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2 0 48 51 70.5 92.2 32.6 2.8-2.5 7.1-2.1 9.2.9l19.6 27.7zm190.4 0c1.7 2.4 1.5 5.6-.5 7.7-53.6 56.9-172.8 32.1-172.8-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7L420 220.2c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2 0 48 51 70.5 92.2 32.6 2.8-2.5 7.1-2.1 9.2.9l19.6 27.7z\"]\n};\nvar faComment = {\n prefix: 'far',\n iconName: 'comment',\n icon: [512, 512, [], \"f075\", \"M256 32C114.6 32 0 125.1 0 240c0 47.6 19.9 91.2 52.9 126.3C38 405.7 7 439.1 6.5 439.5c-6.6 7-8.4 17.2-4.6 26S14.4 480 24 480c61.5 0 110-25.7 139.1-46.3C192 442.8 223.2 448 256 448c141.4 0 256-93.1 256-208S397.4 32 256 32zm0 368c-26.7 0-53.1-4.1-78.4-12.1l-22.7-7.2-19.5 13.8c-14.3 10.1-33.9 21.4-57.5 29 7.3-12.1 14.4-25.7 19.9-40.2l10.6-28.1-20.6-21.8C69.7 314.1 48 282.2 48 240c0-88.2 93.3-160 208-160s208 71.8 208 160-93.3 160-208 160z\"]\n};\nvar faCommentAlt = {\n prefix: 'far',\n iconName: 'comment-alt',\n icon: [512, 512, [], \"f27a\", \"M448 0H64C28.7 0 0 28.7 0 64v288c0 35.3 28.7 64 64 64h96v84c0 7.1 5.8 12 12 12 2.4 0 4.9-.7 7.1-2.4L304 416h144c35.3 0 64-28.7 64-64V64c0-35.3-28.7-64-64-64zm16 352c0 8.8-7.2 16-16 16H288l-12.8 9.6L208 428v-60H64c-8.8 0-16-7.2-16-16V64c0-8.8 7.2-16 16-16h384c8.8 0 16 7.2 16 16v288z\"]\n};\nvar faCommentDots = {\n prefix: 'far',\n iconName: 'comment-dots',\n icon: [512, 512, [], \"f4ad\", \"M144 208c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm112 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm112 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zM256 32C114.6 32 0 125.1 0 240c0 47.6 19.9 91.2 52.9 126.3C38 405.7 7 439.1 6.5 439.5c-6.6 7-8.4 17.2-4.6 26S14.4 480 24 480c61.5 0 110-25.7 139.1-46.3C192 442.8 223.2 448 256 448c141.4 0 256-93.1 256-208S397.4 32 256 32zm0 368c-26.7 0-53.1-4.1-78.4-12.1l-22.7-7.2-19.5 13.8c-14.3 10.1-33.9 21.4-57.5 29 7.3-12.1 14.4-25.7 19.9-40.2l10.6-28.1-20.6-21.8C69.7 314.1 48 282.2 48 240c0-88.2 93.3-160 208-160s208 71.8 208 160-93.3 160-208 160z\"]\n};\nvar faComments = {\n prefix: 'far',\n iconName: 'comments',\n icon: [576, 512, [], \"f086\", \"M532 386.2c27.5-27.1 44-61.1 44-98.2 0-80-76.5-146.1-176.2-157.9C368.3 72.5 294.3 32 208 32 93.1 32 0 103.6 0 192c0 37 16.5 71 44 98.2-15.3 30.7-37.3 54.5-37.7 54.9-6.3 6.7-8.1 16.5-4.4 25 3.6 8.5 12 14 21.2 14 53.5 0 96.7-20.2 125.2-38.8 9.2 2.1 18.7 3.7 28.4 4.9C208.1 407.6 281.8 448 368 448c20.8 0 40.8-2.4 59.8-6.8C456.3 459.7 499.4 480 553 480c9.2 0 17.5-5.5 21.2-14 3.6-8.5 1.9-18.3-4.4-25-.4-.3-22.5-24.1-37.8-54.8zm-392.8-92.3L122.1 305c-14.1 9.1-28.5 16.3-43.1 21.4 2.7-4.7 5.4-9.7 8-14.8l15.5-31.1L77.7 256C64.2 242.6 48 220.7 48 192c0-60.7 73.3-112 160-112s160 51.3 160 112-73.3 112-160 112c-16.5 0-33-1.9-49-5.6l-19.8-4.5zM498.3 352l-24.7 24.4 15.5 31.1c2.6 5.1 5.3 10.1 8 14.8-14.6-5.1-29-12.3-43.1-21.4l-17.1-11.1-19.9 4.6c-16 3.7-32.5 5.6-49 5.6-54 0-102.2-20.1-131.3-49.7C338 339.5 416 272.9 416 192c0-3.4-.4-6.7-.7-10C479.7 196.5 528 238.8 528 288c0 28.7-16.2 50.6-29.7 64z\"]\n};\nvar faCompass = {\n prefix: 'far',\n iconName: 'compass',\n icon: [496, 512, [], \"f14e\", \"M347.94 129.86L203.6 195.83a31.938 31.938 0 0 0-15.77 15.77l-65.97 144.34c-7.61 16.65 9.54 33.81 26.2 26.2l144.34-65.97a31.938 31.938 0 0 0 15.77-15.77l65.97-144.34c7.61-16.66-9.54-33.81-26.2-26.2zm-77.36 148.72c-12.47 12.47-32.69 12.47-45.16 0-12.47-12.47-12.47-32.69 0-45.16 12.47-12.47 32.69-12.47 45.16 0 12.47 12.47 12.47 32.69 0 45.16zM248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 448c-110.28 0-200-89.72-200-200S137.72 56 248 56s200 89.72 200 200-89.72 200-200 200z\"]\n};\nvar faCopy = {\n prefix: 'far',\n iconName: 'copy',\n icon: [448, 512, [], \"f0c5\", \"M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z\"]\n};\nvar faCopyright = {\n prefix: 'far',\n iconName: 'copyright',\n icon: [512, 512, [], \"f1f9\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 448c-110.532 0-200-89.451-200-200 0-110.531 89.451-200 200-200 110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200zm107.351-101.064c-9.614 9.712-45.53 41.396-104.065 41.396-82.43 0-140.484-61.425-140.484-141.567 0-79.152 60.275-139.401 139.762-139.401 55.531 0 88.738 26.62 97.593 34.779a11.965 11.965 0 0 1 1.936 15.322l-18.155 28.113c-3.841 5.95-11.966 7.282-17.499 2.921-8.595-6.776-31.814-22.538-61.708-22.538-48.303 0-77.916 35.33-77.916 80.082 0 41.589 26.888 83.692 78.277 83.692 32.657 0 56.843-19.039 65.726-27.225 5.27-4.857 13.596-4.039 17.82 1.738l19.865 27.17a11.947 11.947 0 0 1-1.152 15.518z\"]\n};\nvar faCreditCard = {\n prefix: 'far',\n iconName: 'credit-card',\n icon: [576, 512, [], \"f09d\", \"M527.9 32H48.1C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48.1 48h479.8c26.6 0 48.1-21.5 48.1-48V80c0-26.5-21.5-48-48.1-48zM54.1 80h467.8c3.3 0 6 2.7 6 6v42H48.1V86c0-3.3 2.7-6 6-6zm467.8 352H54.1c-3.3 0-6-2.7-6-6V256h479.8v170c0 3.3-2.7 6-6 6zM192 332v40c0 6.6-5.4 12-12 12h-72c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h72c6.6 0 12 5.4 12 12zm192 0v40c0 6.6-5.4 12-12 12H236c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h136c6.6 0 12 5.4 12 12z\"]\n};\nvar faDizzy = {\n prefix: 'far',\n iconName: 'dizzy',\n icon: [496, 512, [], \"f567\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-33.8-217.9c7.8-7.8 7.8-20.5 0-28.3L196.3 192l17.9-17.9c7.8-7.8 7.8-20.5 0-28.3-7.8-7.8-20.5-7.8-28.3 0L168 163.7l-17.8-17.8c-7.8-7.8-20.5-7.8-28.3 0-7.8 7.8-7.8 20.5 0 28.3l17.9 17.9-17.9 17.9c-7.8 7.8-7.8 20.5 0 28.3 7.8 7.8 20.5 7.8 28.3 0l17.8-17.8 17.8 17.8c7.9 7.7 20.5 7.7 28.4-.2zm160-92.2c-7.8-7.8-20.5-7.8-28.3 0L328 163.7l-17.8-17.8c-7.8-7.8-20.5-7.8-28.3 0-7.8 7.8-7.8 20.5 0 28.3l17.9 17.9-17.9 17.9c-7.8 7.8-7.8 20.5 0 28.3 7.8 7.8 20.5 7.8 28.3 0l17.8-17.8 17.8 17.8c7.8 7.8 20.5 7.8 28.3 0 7.8-7.8 7.8-20.5 0-28.3l-17.8-18 17.9-17.9c7.7-7.8 7.7-20.4 0-28.2zM248 272c-35.3 0-64 28.7-64 64s28.7 64 64 64 64-28.7 64-64-28.7-64-64-64z\"]\n};\nvar faDotCircle = {\n prefix: 'far',\n iconName: 'dot-circle',\n icon: [512, 512, [], \"f192\", \"M256 56c110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200-110.532 0-200-89.451-200-200 0-110.532 89.451-200 200-200m0-48C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 168c-44.183 0-80 35.817-80 80s35.817 80 80 80 80-35.817 80-80-35.817-80-80-80z\"]\n};\nvar faEdit = {\n prefix: 'far',\n iconName: 'edit',\n icon: [576, 512, [], \"f044\", \"M402.3 344.9l32-32c5-5 13.7-1.5 13.7 5.7V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h273.5c7.1 0 10.7 8.6 5.7 13.7l-32 32c-1.5 1.5-3.5 2.3-5.7 2.3H48v352h352V350.5c0-2.1.8-4.1 2.3-5.6zm156.6-201.8L296.3 405.7l-90.4 10c-26.2 2.9-48.5-19.2-45.6-45.6l10-90.4L432.9 17.1c22.9-22.9 59.9-22.9 82.7 0l43.2 43.2c22.9 22.9 22.9 60 .1 82.8zM460.1 174L402 115.9 216.2 301.8l-7.3 65.3 65.3-7.3L460.1 174zm64.8-79.7l-43.2-43.2c-4.1-4.1-10.8-4.1-14.8 0L436 82l58.1 58.1 30.9-30.9c4-4.2 4-10.8-.1-14.9z\"]\n};\nvar faEnvelope = {\n prefix: 'far',\n iconName: 'envelope',\n icon: [512, 512, [], \"f0e0\", \"M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm0 48v40.805c-22.422 18.259-58.168 46.651-134.587 106.49-16.841 13.247-50.201 45.072-73.413 44.701-23.208.375-56.579-31.459-73.413-44.701C106.18 199.465 70.425 171.067 48 152.805V112h416zM48 400V214.398c22.914 18.251 55.409 43.862 104.938 82.646 21.857 17.205 60.134 55.186 103.062 54.955 42.717.231 80.509-37.199 103.053-54.947 49.528-38.783 82.032-64.401 104.947-82.653V400H48z\"]\n};\nvar faEnvelopeOpen = {\n prefix: 'far',\n iconName: 'envelope-open',\n icon: [512, 512, [], \"f2b6\", \"M494.586 164.516c-4.697-3.883-111.723-89.95-135.251-108.657C337.231 38.191 299.437 0 256 0c-43.205 0-80.636 37.717-103.335 55.859-24.463 19.45-131.07 105.195-135.15 108.549A48.004 48.004 0 0 0 0 201.485V464c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V201.509a48 48 0 0 0-17.414-36.993zM464 458a6 6 0 0 1-6 6H54a6 6 0 0 1-6-6V204.347c0-1.813.816-3.526 2.226-4.665 15.87-12.814 108.793-87.554 132.364-106.293C200.755 78.88 232.398 48 256 48c23.693 0 55.857 31.369 73.41 45.389 23.573 18.741 116.503 93.493 132.366 106.316a5.99 5.99 0 0 1 2.224 4.663V458zm-31.991-187.704c4.249 5.159 3.465 12.795-1.745 16.981-28.975 23.283-59.274 47.597-70.929 56.863C336.636 362.283 299.205 400 256 400c-43.452 0-81.287-38.237-103.335-55.86-11.279-8.967-41.744-33.413-70.927-56.865-5.21-4.187-5.993-11.822-1.745-16.981l15.258-18.528c4.178-5.073 11.657-5.843 16.779-1.726 28.618 23.001 58.566 47.035 70.56 56.571C200.143 320.631 232.307 352 256 352c23.602 0 55.246-30.88 73.41-45.389 11.994-9.535 41.944-33.57 70.563-56.568 5.122-4.116 12.601-3.346 16.778 1.727l15.258 18.526z\"]\n};\nvar faEye = {\n prefix: 'far',\n iconName: 'eye',\n icon: [576, 512, [], \"f06e\", \"M288 144a110.94 110.94 0 0 0-31.24 5 55.4 55.4 0 0 1 7.24 27 56 56 0 0 1-56 56 55.4 55.4 0 0 1-27-7.24A111.71 111.71 0 1 0 288 144zm284.52 97.4C518.29 135.59 410.93 64 288 64S57.68 135.64 3.48 241.41a32.35 32.35 0 0 0 0 29.19C57.71 376.41 165.07 448 288 448s230.32-71.64 284.52-177.41a32.35 32.35 0 0 0 0-29.19zM288 400c-98.65 0-189.09-55-237.93-144C98.91 167 189.34 112 288 112s189.09 55 237.93 144C477.1 345 386.66 400 288 400z\"]\n};\nvar faEyeSlash = {\n prefix: 'far',\n iconName: 'eye-slash',\n icon: [640, 512, [], \"f070\", \"M634 471L36 3.51A16 16 0 0 0 13.51 6l-10 12.49A16 16 0 0 0 6 41l598 467.49a16 16 0 0 0 22.49-2.49l10-12.49A16 16 0 0 0 634 471zM296.79 146.47l134.79 105.38C429.36 191.91 380.48 144 320 144a112.26 112.26 0 0 0-23.21 2.47zm46.42 219.07L208.42 260.16C210.65 320.09 259.53 368 320 368a113 113 0 0 0 23.21-2.46zM320 112c98.65 0 189.09 55 237.93 144a285.53 285.53 0 0 1-44 60.2l37.74 29.5a333.7 333.7 0 0 0 52.9-75.11 32.35 32.35 0 0 0 0-29.19C550.29 135.59 442.93 64 320 64c-36.7 0-71.71 7-104.63 18.81l46.41 36.29c18.94-4.3 38.34-7.1 58.22-7.1zm0 288c-98.65 0-189.08-55-237.93-144a285.47 285.47 0 0 1 44.05-60.19l-37.74-29.5a333.6 333.6 0 0 0-52.89 75.1 32.35 32.35 0 0 0 0 29.19C89.72 376.41 197.08 448 320 448c36.7 0 71.71-7.05 104.63-18.81l-46.41-36.28C359.28 397.2 339.89 400 320 400z\"]\n};\nvar faFile = {\n prefix: 'far',\n iconName: 'file',\n icon: [384, 512, [], \"f15b\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48z\"]\n};\nvar faFileAlt = {\n prefix: 'far',\n iconName: 'file-alt',\n icon: [384, 512, [], \"f15c\", \"M288 248v28c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-28c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12zm-12 72H108c-6.6 0-12 5.4-12 12v28c0 6.6 5.4 12 12 12h168c6.6 0 12-5.4 12-12v-28c0-6.6-5.4-12-12-12zm108-188.1V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V48C0 21.5 21.5 0 48 0h204.1C264.8 0 277 5.1 286 14.1L369.9 98c9 8.9 14.1 21.2 14.1 33.9zm-128-80V128h76.1L256 51.9zM336 464V176H232c-13.3 0-24-10.7-24-24V48H48v416h288z\"]\n};\nvar faFileArchive = {\n prefix: 'far',\n iconName: 'file-archive',\n icon: [384, 512, [], \"f1c6\", \"M128.3 160v32h32v-32zm64-96h-32v32h32zm-64 32v32h32V96zm64 32h-32v32h32zm177.6-30.1L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM256 51.9l76.1 76.1H256zM336 464H48V48h79.7v16h32V48H208v104c0 13.3 10.7 24 24 24h104zM194.2 265.7c-1.1-5.6-6-9.7-11.8-9.7h-22.1v-32h-32v32l-19.7 97.1C102 385.6 126.8 416 160 416c33.1 0 57.9-30.2 51.5-62.6zm-33.9 124.4c-17.9 0-32.4-12.1-32.4-27s14.5-27 32.4-27 32.4 12.1 32.4 27-14.5 27-32.4 27zm32-198.1h-32v32h32z\"]\n};\nvar faFileAudio = {\n prefix: 'far',\n iconName: 'file-audio',\n icon: [384, 512, [], \"f1c7\", \"M369.941 97.941l-83.882-83.882A48 48 0 0 0 252.118 0H48C21.49 0 0 21.49 0 48v416c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48V131.882a48 48 0 0 0-14.059-33.941zM332.118 128H256V51.882L332.118 128zM48 464V48h160v104c0 13.255 10.745 24 24 24h104v288H48zm144-76.024c0 10.691-12.926 16.045-20.485 8.485L136 360.486h-28c-6.627 0-12-5.373-12-12v-56c0-6.627 5.373-12 12-12h28l35.515-36.947c7.56-7.56 20.485-2.206 20.485 8.485v135.952zm41.201-47.13c9.051-9.297 9.06-24.133.001-33.439-22.149-22.752 12.235-56.246 34.395-33.481 27.198 27.94 27.212 72.444.001 100.401-21.793 22.386-56.947-10.315-34.397-33.481z\"]\n};\nvar faFileCode = {\n prefix: 'far',\n iconName: 'file-code',\n icon: [384, 512, [], \"f1c9\", \"M149.9 349.1l-.2-.2-32.8-28.9 32.8-28.9c3.6-3.2 4-8.8.8-12.4l-.2-.2-17.4-18.6c-3.4-3.6-9-3.7-12.4-.4l-57.7 54.1c-3.7 3.5-3.7 9.4 0 12.8l57.7 54.1c1.6 1.5 3.8 2.4 6 2.4 2.4 0 4.8-1 6.4-2.8l17.4-18.6c3.3-3.5 3.1-9.1-.4-12.4zm220-251.2L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM256 51.9l76.1 76.1H256zM336 464H48V48h160v104c0 13.3 10.7 24 24 24h104zM209.6 214c-4.7-1.4-9.5 1.3-10.9 6L144 408.1c-1.4 4.7 1.3 9.6 6 10.9l24.4 7.1c4.7 1.4 9.6-1.4 10.9-6L240 231.9c1.4-4.7-1.3-9.6-6-10.9zm24.5 76.9l.2.2 32.8 28.9-32.8 28.9c-3.6 3.2-4 8.8-.8 12.4l.2.2 17.4 18.6c3.3 3.5 8.9 3.7 12.4.4l57.7-54.1c3.7-3.5 3.7-9.4 0-12.8l-57.7-54.1c-3.5-3.3-9.1-3.2-12.4.4l-17.4 18.6c-3.3 3.5-3.1 9.1.4 12.4z\"]\n};\nvar faFileExcel = {\n prefix: 'far',\n iconName: 'file-excel',\n icon: [384, 512, [], \"f1c3\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm212-240h-28.8c-4.4 0-8.4 2.4-10.5 6.3-18 33.1-22.2 42.4-28.6 57.7-13.9-29.1-6.9-17.3-28.6-57.7-2.1-3.9-6.2-6.3-10.6-6.3H124c-9.3 0-15 10-10.4 18l46.3 78-46.3 78c-4.7 8 1.1 18 10.4 18h28.9c4.4 0 8.4-2.4 10.5-6.3 21.7-40 23-45 28.6-57.7 14.9 30.2 5.9 15.9 28.6 57.7 2.1 3.9 6.2 6.3 10.6 6.3H260c9.3 0 15-10 10.4-18L224 320c.7-1.1 30.3-50.5 46.3-78 4.7-8-1.1-18-10.3-18z\"]\n};\nvar faFileImage = {\n prefix: 'far',\n iconName: 'file-image',\n icon: [384, 512, [], \"f1c5\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm32-48h224V288l-23.5-23.5c-4.7-4.7-12.3-4.7-17 0L176 352l-39.5-39.5c-4.7-4.7-12.3-4.7-17 0L80 352v64zm48-240c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48z\"]\n};\nvar faFilePdf = {\n prefix: 'far',\n iconName: 'file-pdf',\n icon: [384, 512, [], \"f1c1\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm250.2-143.7c-12.2-12-47-8.7-64.4-6.5-17.2-10.5-28.7-25-36.8-46.3 3.9-16.1 10.1-40.6 5.4-56-4.2-26.2-37.8-23.6-42.6-5.9-4.4 16.1-.4 38.5 7 67.1-10 23.9-24.9 56-35.4 74.4-20 10.3-47 26.2-51 46.2-3.3 15.8 26 55.2 76.1-31.2 22.4-7.4 46.8-16.5 68.4-20.1 18.9 10.2 41 17 55.8 17 25.5 0 28-28.2 17.5-38.7zm-198.1 77.8c5.1-13.7 24.5-29.5 30.4-35-19 30.3-30.4 35.7-30.4 35zm81.6-190.6c7.4 0 6.7 32.1 1.8 40.8-4.4-13.9-4.3-40.8-1.8-40.8zm-24.4 136.6c9.7-16.9 18-37 24.7-54.7 8.3 15.1 18.9 27.2 30.1 35.5-20.8 4.3-38.9 13.1-54.8 19.2zm131.6-5s-5 6-37.3-7.8c35.1-2.6 40.9 5.4 37.3 7.8z\"]\n};\nvar faFilePowerpoint = {\n prefix: 'far',\n iconName: 'file-powerpoint',\n icon: [384, 512, [], \"f1c4\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm72-60V236c0-6.6 5.4-12 12-12h69.2c36.7 0 62.8 27 62.8 66.3 0 74.3-68.7 66.5-95.5 66.5V404c0 6.6-5.4 12-12 12H132c-6.6 0-12-5.4-12-12zm48.5-87.4h23c7.9 0 13.9-2.4 18.1-7.2 8.5-9.8 8.4-28.5.1-37.8-4.1-4.6-9.9-7-17.4-7h-23.9v52z\"]\n};\nvar faFileVideo = {\n prefix: 'far',\n iconName: 'file-video',\n icon: [384, 512, [], \"f1c8\", \"M369.941 97.941l-83.882-83.882A48 48 0 0 0 252.118 0H48C21.49 0 0 21.49 0 48v416c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48V131.882a48 48 0 0 0-14.059-33.941zM332.118 128H256V51.882L332.118 128zM48 464V48h160v104c0 13.255 10.745 24 24 24h104v288H48zm228.687-211.303L224 305.374V268c0-11.046-8.954-20-20-20H100c-11.046 0-20 8.954-20 20v104c0 11.046 8.954 20 20 20h104c11.046 0 20-8.954 20-20v-37.374l52.687 52.674C286.704 397.318 304 390.28 304 375.986V264.011c0-14.311-17.309-21.319-27.313-11.314z\"]\n};\nvar faFileWord = {\n prefix: 'far',\n iconName: 'file-word',\n icon: [384, 512, [], \"f1c2\", \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm220.1-208c-5.7 0-10.6 4-11.7 9.5-20.6 97.7-20.4 95.4-21 103.5-.2-1.2-.4-2.6-.7-4.3-.8-5.1.3.2-23.6-99.5-1.3-5.4-6.1-9.2-11.7-9.2h-13.3c-5.5 0-10.3 3.8-11.7 9.1-24.4 99-24 96.2-24.8 103.7-.1-1.1-.2-2.5-.5-4.2-.7-5.2-14.1-73.3-19.1-99-1.1-5.6-6-9.7-11.8-9.7h-16.8c-7.8 0-13.5 7.3-11.7 14.8 8 32.6 26.7 109.5 33.2 136 1.3 5.4 6.1 9.1 11.7 9.1h25.2c5.5 0 10.3-3.7 11.6-9.1l17.9-71.4c1.5-6.2 2.5-12 3-17.3l2.9 17.3c.1.4 12.6 50.5 17.9 71.4 1.3 5.3 6.1 9.1 11.6 9.1h24.7c5.5 0 10.3-3.7 11.6-9.1 20.8-81.9 30.2-119 34.5-136 1.9-7.6-3.8-14.9-11.6-14.9h-15.8z\"]\n};\nvar faFlag = {\n prefix: 'far',\n iconName: 'flag',\n icon: [512, 512, [], \"f024\", \"M336.174 80c-49.132 0-93.305-32-161.913-32-31.301 0-58.303 6.482-80.721 15.168a48.04 48.04 0 0 0 2.142-20.727C93.067 19.575 74.167 1.594 51.201.104 23.242-1.71 0 20.431 0 48c0 17.764 9.657 33.262 24 41.562V496c0 8.837 7.163 16 16 16h16c8.837 0 16-7.163 16-16v-83.443C109.869 395.28 143.259 384 199.826 384c49.132 0 93.305 32 161.913 32 58.479 0 101.972-22.617 128.548-39.981C503.846 367.161 512 352.051 512 335.855V95.937c0-34.459-35.264-57.768-66.904-44.117C409.193 67.309 371.641 80 336.174 80zM464 336c-21.783 15.412-60.824 32-102.261 32-59.945 0-102.002-32-161.913-32-43.361 0-96.379 9.403-127.826 24V128c21.784-15.412 60.824-32 102.261-32 59.945 0 102.002 32 161.913 32 43.271 0 96.32-17.366 127.826-32v240z\"]\n};\nvar faFlushed = {\n prefix: 'far',\n iconName: 'flushed',\n icon: [496, 512, [], \"f579\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm96-312c-44.2 0-80 35.8-80 80s35.8 80 80 80 80-35.8 80-80-35.8-80-80-80zm0 128c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-72c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm-112 24c0-44.2-35.8-80-80-80s-80 35.8-80 80 35.8 80 80 80 80-35.8 80-80zm-80 48c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-72c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm160 144H184c-13.2 0-24 10.8-24 24s10.8 24 24 24h128c13.2 0 24-10.8 24-24s-10.8-24-24-24z\"]\n};\nvar faFolder = {\n prefix: 'far',\n iconName: 'folder',\n icon: [512, 512, [], \"f07b\", \"M464 128H272l-54.63-54.63c-6-6-14.14-9.37-22.63-9.37H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48zm0 272H48V112h140.12l54.63 54.63c6 6 14.14 9.37 22.63 9.37H464v224z\"]\n};\nvar faFolderOpen = {\n prefix: 'far',\n iconName: 'folder-open',\n icon: [576, 512, [], \"f07c\", \"M527.9 224H480v-48c0-26.5-21.5-48-48-48H272l-64-64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h400c16.5 0 31.9-8.5 40.7-22.6l79.9-128c20-31.9-3-73.4-40.7-73.4zM48 118c0-3.3 2.7-6 6-6h134.1l64 64H426c3.3 0 6 2.7 6 6v42H152c-16.8 0-32.4 8.8-41.1 23.2L48 351.4zm400 282H72l77.2-128H528z\"]\n};\nvar faFontAwesomeLogoFull = {\n prefix: 'far',\n iconName: 'font-awesome-logo-full',\n icon: [3992, 512, [\"Font Awesome\"], \"f4e6\", \"M454.6 0H57.4C25.9 0 0 25.9 0 57.4v397.3C0 486.1 25.9 512 57.4 512h397.3c31.4 0 57.4-25.9 57.4-57.4V57.4C512 25.9 486.1 0 454.6 0zm-58.9 324.9c0 4.8-4.1 6.9-8.9 8.9-19.2 8.1-39.7 15.7-61.5 15.7-40.5 0-68.7-44.8-163.2 2.5v51.8c0 30.3-45.7 30.2-45.7 0v-250c-9-7-15-17.9-15-30.3 0-21 17.1-38.2 38.2-38.2 21 0 38.2 17.1 38.2 38.2 0 12.2-5.8 23.2-14.9 30.2v21c37.1-12 65.5-34.4 146.1-3.4 26.6 11.4 68.7-15.7 76.5-15.7 5.5 0 10.3 4.1 10.3 8.9v160.4zm432.9-174.2h-137v70.1H825c39.8 0 40.4 62.2 0 62.2H691.6v105.6c0 45.5-70.7 46.4-70.7 0V128.3c0-22 18-39.8 39.8-39.8h167.8c39.6 0 40.5 62.2.1 62.2zm191.1 23.4c-169.3 0-169.1 252.4 0 252.4 169.9 0 169.9-252.4 0-252.4zm0 196.1c-81.6 0-82.1-139.8 0-139.8 82.5 0 82.4 139.8 0 139.8zm372.4 53.4c-17.5 0-31.4-13.9-31.4-31.4v-117c0-62.4-72.6-52.5-99.1-16.4v133.4c0 41.5-63.3 41.8-63.3 0V208c0-40 63.1-41.6 63.1 0v3.4c43.3-51.6 162.4-60.4 162.4 39.3v141.5c.3 30.4-31.5 31.4-31.7 31.4zm179.7 2.9c-44.3 0-68.3-22.9-68.3-65.8V235.2H1488c-35.6 0-36.7-55.3 0-55.3h15.5v-37.3c0-41.3 63.8-42.1 63.8 0v37.5h24.9c35.4 0 35.7 55.3 0 55.3h-24.9v108.5c0 29.6 26.1 26.3 27.4 26.3 31.4 0 52.6 56.3-22.9 56.3zM1992 123c-19.5-50.2-95.5-50-114.5 0-107.3 275.7-99.5 252.7-99.5 262.8 0 42.8 58.3 51.2 72.1 14.4l13.5-35.9H2006l13 35.9c14.2 37.7 72.1 27.2 72.1-14.4 0-10.1 5.3 6.8-99.1-262.8zm-108.9 179.1l51.7-142.9 51.8 142.9h-103.5zm591.3-85.6l-53.7 176.3c-12.4 41.2-72 41-84 0l-42.3-135.9-42.3 135.9c-12.4 40.9-72 41.2-84.5 0l-54.2-176.3c-12.5-39.4 49.8-56.1 60.2-16.9L2213 342l45.3-139.5c10.9-32.7 59.6-34.7 71.2 0l45.3 139.5 39.3-142.4c10.3-38.3 72.6-23.8 60.3 16.9zm275.4 75.1c0-42.4-33.9-117.5-119.5-117.5-73.2 0-124.4 56.3-124.4 126 0 77.2 55.3 126.4 128.5 126.4 31.7 0 93-11.5 93-39.8 0-18.3-21.1-31.5-39.3-22.4-49.4 26.2-109 8.4-115.9-43.8h148.3c16.3 0 29.3-13.4 29.3-28.9zM2571 277.7c9.5-73.4 113.9-68.6 118.6 0H2571zm316.7 148.8c-31.4 0-81.6-10.5-96.6-31.9-12.4-17 2.5-39.8 21.8-39.8 16.3 0 36.8 22.9 77.7 22.9 27.4 0 40.4-11 40.4-25.8 0-39.8-142.9-7.4-142.9-102 0-40.4 35.3-75.7 98.6-75.7 31.4 0 74.1 9.9 87.6 29.4 10.8 14.8-1.4 36.2-20.9 36.2-15.1 0-26.7-17.3-66.2-17.3-22.9 0-37.8 10.5-37.8 23.8 0 35.9 142.4 6 142.4 103.1-.1 43.7-37.4 77.1-104.1 77.1zm266.8-252.4c-169.3 0-169.1 252.4 0 252.4 170.1 0 169.6-252.4 0-252.4zm0 196.1c-81.8 0-82-139.8 0-139.8 82.5 0 82.4 139.8 0 139.8zm476.9 22V268.7c0-53.8-61.4-45.8-85.7-10.5v134c0 41.3-63.8 42.1-63.8 0V268.7c0-52.1-59.5-47.4-85.7-10.1v133.6c0 41.5-63.3 41.8-63.3 0V208c0-40 63.1-41.6 63.1 0v3.4c9.9-14.4 41.8-37.3 78.6-37.3 35.3 0 57.7 16.4 66.7 43.8 13.9-21.8 45.8-43.8 82.6-43.8 44.3 0 70.7 23.4 70.7 72.7v145.3c.5 17.3-13.5 31.4-31.9 31.4 3.5.1-31.3 1.1-31.3-31.3zM3992 291.6c0-42.4-32.4-117.5-117.9-117.5-73.2 0-127.5 56.3-127.5 126 0 77.2 58.3 126.4 131.6 126.4 31.7 0 91.5-11.5 91.5-39.8 0-18.3-21.1-31.5-39.3-22.4-49.4 26.2-110.5 8.4-117.5-43.8h149.8c16.3 0 29.1-13.4 29.3-28.9zm-180.5-13.9c9.7-74.4 115.9-68.3 120.1 0h-120.1z\"]\n};\nvar faFrown = {\n prefix: 'far',\n iconName: 'frown',\n icon: [496, 512, [], \"f119\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-80 128c-40.2 0-78 17.7-103.8 48.6-8.5 10.2-7.1 25.3 3.1 33.8 10.2 8.4 25.3 7.1 33.8-3.1 16.6-19.9 41-31.4 66.9-31.4s50.3 11.4 66.9 31.4c8.1 9.7 23.1 11.9 33.8 3.1 10.2-8.5 11.5-23.6 3.1-33.8C326 321.7 288.2 304 248 304z\"]\n};\nvar faFrownOpen = {\n prefix: 'far',\n iconName: 'frown-open',\n icon: [496, 512, [], \"f57a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-48-248c0-17.7-14.3-32-32-32s-32 14.3-32 32 14.3 32 32 32 32-14.3 32-32zm128-32c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-80 112c-35.6 0-88.8 21.3-95.8 61.2-2 11.8 9 21.5 20.5 18.1 31.2-9.6 59.4-15.3 75.3-15.3s44.1 5.7 75.3 15.3c11.4 3.5 22.5-6.3 20.5-18.1-7-39.9-60.2-61.2-95.8-61.2z\"]\n};\nvar faFutbol = {\n prefix: 'far',\n iconName: 'futbol',\n icon: [496, 512, [], \"f1e3\", \"M483.8 179.4C449.8 74.6 352.6 8 248.1 8c-25.4 0-51.2 3.9-76.7 12.2C41.2 62.5-30.1 202.4 12.2 332.6 46.2 437.4 143.4 504 247.9 504c25.4 0 51.2-3.9 76.7-12.2 130.2-42.3 201.5-182.2 159.2-312.4zm-74.5 193.7l-52.2 6.4-43.7-60.9 24.4-75.2 71.1-22.1 38.9 36.4c-.2 30.7-7.4 61.1-21.7 89.2-4.7 9.3-10.7 17.8-16.8 26.2zm0-235.4l-10.4 53.1-70.7 22-64.2-46.5V92.5l47.4-26.2c39.2 13 73.4 38 97.9 71.4zM184.9 66.4L232 92.5v73.8l-64.2 46.5-70.6-22-10.1-52.5c24.3-33.4 57.9-58.6 97.8-71.9zM139 379.5L85.9 373c-14.4-20.1-37.3-59.6-37.8-115.3l39-36.4 71.1 22.2 24.3 74.3-43.5 61.7zm48.2 67l-22.4-48.1 43.6-61.7H287l44.3 61.7-22.4 48.1c-6.2 1.8-57.6 20.4-121.7 0z\"]\n};\nvar faGem = {\n prefix: 'far',\n iconName: 'gem',\n icon: [576, 512, [], \"f3a5\", \"M464 0H112c-4 0-7.8 2-10 5.4L2 152.6c-2.9 4.4-2.6 10.2.7 14.2l276 340.8c4.8 5.9 13.8 5.9 18.6 0l276-340.8c3.3-4.1 3.6-9.8.7-14.2L474.1 5.4C471.8 2 468.1 0 464 0zm-19.3 48l63.3 96h-68.4l-51.7-96h56.8zm-202.1 0h90.7l51.7 96H191l51.6-96zm-111.3 0h56.8l-51.7 96H68l63.3-96zm-43 144h51.4L208 352 88.3 192zm102.9 0h193.6L288 435.3 191.2 192zM368 352l68.2-160h51.4L368 352z\"]\n};\nvar faGrimace = {\n prefix: 'far',\n iconName: 'grimace',\n icon: [496, 512, [], \"f57f\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm16 16H152c-26.5 0-48 21.5-48 48v32c0 26.5 21.5 48 48 48h192c26.5 0 48-21.5 48-48v-32c0-26.5-21.5-48-48-48zm-168 96h-24c-8.8 0-16-7.2-16-16v-8h40v24zm0-40h-40v-8c0-8.8 7.2-16 16-16h24v24zm64 40h-48v-24h48v24zm0-40h-48v-24h48v24zm64 40h-48v-24h48v24zm0-40h-48v-24h48v24zm56 24c0 8.8-7.2 16-16 16h-24v-24h40v8zm0-24h-40v-24h24c8.8 0 16 7.2 16 16v8z\"]\n};\nvar faGrin = {\n prefix: 'far',\n iconName: 'grin',\n icon: [496, 512, [], \"f580\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.4-17.7 15.3 7.9 47.1 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zM168 240c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32z\"]\n};\nvar faGrinAlt = {\n prefix: 'far',\n iconName: 'grin-alt',\n icon: [496, 512, [], \"f581\", \"M200.3 248c12.4-18.7 15.1-37.3 15.7-56-.5-18.7-3.3-37.3-15.7-56-8-12-25.1-11.4-32.7 0-12.4 18.7-15.1 37.3-15.7 56 .5 18.7 3.3 37.3 15.7 56 8.1 12 25.2 11.4 32.7 0zm128 0c12.4-18.7 15.1-37.3 15.7-56-.5-18.7-3.3-37.3-15.7-56-8-12-25.1-11.4-32.7 0-12.4 18.7-15.1 37.3-15.7 56 .5 18.7 3.3 37.3 15.7 56 8.1 12 25.2 11.4 32.7 0zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 7.9 47.2 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3z\"]\n};\nvar faGrinBeam = {\n prefix: 'far',\n iconName: 'grin-beam',\n icon: [496, 512, [], \"f582\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 7.9 47.1 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-235.9-72.9c3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3zm160 0c3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3z\"]\n};\nvar faGrinBeamSweat = {\n prefix: 'far',\n iconName: 'grin-beam-sweat',\n icon: [496, 512, [], \"f583\", \"M440 160c29.5 0 53.3-26.3 53.3-58.7 0-25-31.7-75.5-46.2-97.3-3.6-5.3-10.7-5.3-14.2 0-14.5 21.8-46.2 72.3-46.2 97.3 0 32.4 23.8 58.7 53.3 58.7zM248 400c51.9 0 115.3-32.9 123.3-80 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 8 47.1 71.4 80 123.3 80zm130.3-168.3c3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.6 6.2 4.6 9.3 3.7zm105.3-52.9c-24.6 15.7-46 12.9-46.4 12.9 6.9 20.2 10.8 41.8 10.8 64.3 0 110.3-89.7 200-200 200S48 366.3 48 256 137.7 56 248 56c39.8 0 76.8 11.8 108 31.9 1.7-9.5 6.3-24.1 17.2-45.7C336.4 20.6 293.7 8 248 8 111 8 0 119 0 256s111 248 248 248 248-111 248-248c0-27-4.4-52.9-12.4-77.2zM168 189.4c12.3 0 23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.8 19.2-21.6 31.5-21.6z\"]\n};\nvar faGrinHearts = {\n prefix: 'far',\n iconName: 'grin-hearts',\n icon: [496, 512, [], \"f584\", \"M353.6 304.6c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 7.9 47.2 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-152.8-48.9c4.5 1.2 9.2-1.5 10.5-6l19.4-69.9c5.6-20.3-7.4-41.1-28.8-44.5-18.6-3-36.4 9.8-41.5 27.9l-2 7.1-7.1-1.9c-18.2-4.7-38.2 4.3-44.9 22-7.7 20.2 3.8 41.9 24.2 47.2l70.2 18.1zm188.8-65.3c-6.7-17.6-26.7-26.7-44.9-22l-7.1 1.9-2-7.1c-5-18.1-22.8-30.9-41.5-27.9-21.4 3.4-34.4 24.2-28.8 44.5l19.4 69.9c1.2 4.5 5.9 7.2 10.5 6l70.2-18.2c20.4-5.3 31.9-26.9 24.2-47.1zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200z\"]\n};\nvar faGrinSquint = {\n prefix: 'far',\n iconName: 'grin-squint',\n icon: [496, 512, [], \"f585\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.4-17.7 15.3 7.9 47.1 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-234.7-40.8c3.6 4.2 9.9 5.7 15.3 2.5l80-48c3.6-2.2 5.8-6.1 5.8-10.3s-2.2-8.1-5.8-10.3l-80-48c-5.1-3-11.4-1.9-15.3 2.5-3.8 4.5-3.8 11-.1 15.5l33.6 40.3-33.6 40.3c-3.8 4.5-3.7 11.1.1 15.5zm242.9 2.5c5.4 3.2 11.7 1.7 15.3-2.5 3.8-4.5 3.8-11 .1-15.5L343.6 208l33.6-40.3c3.8-4.5 3.7-11-.1-15.5-3.8-4.4-10.2-5.4-15.3-2.5l-80 48c-3.6 2.2-5.8 6.1-5.8 10.3s2.2 8.1 5.8 10.3l80 48z\"]\n};\nvar faGrinSquintTears = {\n prefix: 'far',\n iconName: 'grin-squint-tears',\n icon: [512, 512, [], \"f586\", \"M117.1 384.1c-25.8 3.7-84 13.7-100.9 30.6-21.9 21.9-21.5 57.9.9 80.3s58.3 22.8 80.3.9C114.3 479 124.3 420.8 128 395c.8-6.4-4.6-11.8-10.9-10.9zm-41.2-41.7C40.3 268 53 176.1 114.6 114.6 152.4 76.8 202.6 56 256 56c36.2 0 70.8 9.8 101.2 27.7 3.8-20.3 8-36.1 12-48.3C333.8 17.2 294.9 8 256 8 192.5 8 129.1 32.2 80.6 80.6c-74.1 74.1-91.3 183.4-52 274 12.2-4.1 27.7-8.3 47.3-12.2zm352.3-187.6c45 76.6 34.9 176.9-30.8 242.6-37.8 37.8-88 58.6-141.4 58.6-30.5 0-59.8-7-86.4-19.8-3.9 19.5-8 35-12.2 47.2 31.4 13.6 65 20.6 98.7 20.6 63.5 0 126.9-24.2 175.4-72.6 78.1-78.1 93.1-195.4 45.2-288.6-12.3 4-28.2 8.1-48.5 12zm-33.3-26.9c25.8-3.7 84-13.7 100.9-30.6 21.9-21.9 21.5-57.9-.9-80.3s-58.3-22.8-80.3-.9C397.7 33 387.7 91.2 384 117c-.8 6.4 4.6 11.8 10.9 10.9zm-187 108.3c-3-3-7.2-4.2-11.4-3.2L106 255.7c-5.7 1.4-9.5 6.7-9.1 12.6.5 5.8 5.1 10.5 10.9 11l52.3 4.8 4.8 52.3c.5 5.8 5.2 10.4 11 10.9h.9c5.5 0 10.3-3.7 11.7-9.1l22.6-90.5c1-4.2-.2-8.5-3.2-11.5zm39.7-25.1l90.5-22.6c5.7-1.4 9.5-6.7 9.1-12.6-.5-5.8-5.1-10.5-10.9-11l-52.3-4.8-4.8-52.3c-.5-5.8-5.2-10.4-11-10.9-5.6-.1-11.2 3.4-12.6 9.1L233 196.5c-1 4.1.2 8.4 3.2 11.4 5 5 11.3 3.2 11.4 3.2zm52 88.5c-29.1 29.1-59.7 52.9-83.9 65.4-9.2 4.8-10 17.5-1.7 23.4 38.9 27.7 107 6.2 143.7-30.6S416 253 388.3 214.1c-5.8-8.2-18.5-7.6-23.4 1.7-12.3 24.2-36.2 54.7-65.3 83.8z\"]\n};\nvar faGrinStars = {\n prefix: 'far',\n iconName: 'grin-stars',\n icon: [496, 512, [], \"f587\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 7.9 47.2 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-227.9-57.5c-1 6.2 5.4 11 11 7.9l31.3-16.3 31.3 16.3c5.6 3.1 12-1.7 11-7.9l-6-34.9 25.4-24.6c4.5-4.5 1.9-12.2-4.3-13.2l-34.9-5-15.5-31.6c-2.9-5.8-11-5.8-13.9 0l-15.5 31.6-34.9 5c-6.2.9-8.9 8.6-4.3 13.2l25.4 24.6-6.1 34.9zm259.7-72.7l-34.9-5-15.5-31.6c-2.9-5.8-11-5.8-13.9 0l-15.5 31.6-34.9 5c-6.2.9-8.9 8.6-4.3 13.2l25.4 24.6-6 34.9c-1 6.2 5.4 11 11 7.9l31.3-16.3 31.3 16.3c5.6 3.1 12-1.7 11-7.9l-6-34.9 25.4-24.6c4.5-4.6 1.8-12.2-4.4-13.2z\"]\n};\nvar faGrinTears = {\n prefix: 'far',\n iconName: 'grin-tears',\n icon: [640, 512, [], \"f588\", \"M117.1 256.1c-25.8 3.7-84 13.7-100.9 30.6-21.9 21.9-21.5 57.9.9 80.3s58.3 22.8 80.3.9C114.3 351 124.3 292.8 128 267c.8-6.4-4.6-11.8-10.9-10.9zm506.7 30.6c-16.9-16.9-75.1-26.9-100.9-30.6-6.3-.9-11.7 4.5-10.8 10.8 3.7 25.8 13.7 84 30.6 100.9 21.9 21.9 57.9 21.5 80.3-.9 22.3-22.3 22.7-58.3.8-80.2zm-126.6 61.7C463.8 412.3 396.9 456 320 456c-76.9 0-143.8-43.7-177.2-107.6-12.5 37.4-25.2 43.9-28.3 46.5C159.1 460.7 234.5 504 320 504s160.9-43.3 205.5-109.1c-3.2-2.7-15.9-9.2-28.3-46.5zM122.7 224.5C137.9 129.2 220.5 56 320 56c99.5 0 182.1 73.2 197.3 168.5 2.1-.2 5.2-2.4 49.5 7C554.4 106 448.7 8 320 8S85.6 106 73.2 231.4c44.5-9.4 47.1-7.2 49.5-6.9zM320 400c51.9 0 115.3-32.9 123.3-80 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 8 47.1 71.4 80 123.3 80zm130.3-168.3c3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.6 6.2 4.6 9.3 3.7zM240 189.4c12.3 0 23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.8 19.2-21.6 31.5-21.6z\"]\n};\nvar faGrinTongue = {\n prefix: 'far',\n iconName: 'grin-tongue',\n icon: [496, 512, [], \"f589\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm64 400c0 35.6-29.1 64.5-64.9 64-35.1-.5-63.1-29.8-63.1-65v-42.8l17.7-8.8c15-7.5 31.5 1.7 34.9 16.5l2.8 12.1c2.1 9.2 15.2 9.2 17.3 0l2.8-12.1c3.4-14.8 19.8-24.1 34.9-16.5l17.7 8.8V408zm28.2 25.3c2.2-8.1 3.8-16.5 3.8-25.3v-43.5c14.2-12.4 24.4-27.5 27.3-44.5 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 2.9 17 13.1 32.1 27.3 44.5V408c0 8.8 1.6 17.2 3.8 25.3C91.8 399.9 48 333 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 77-43.8 143.9-107.8 177.3zM168 176c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm160 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faGrinTongueSquint = {\n prefix: 'far',\n iconName: 'grin-tongue-squint',\n icon: [496, 512, [], \"f58a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm64 400c0 35.6-29.1 64.5-64.9 64-35.1-.5-63.1-29.8-63.1-65v-42.8l17.7-8.8c15-7.5 31.5 1.7 34.9 16.5l2.8 12.1c2.1 9.2 15.2 9.2 17.3 0l2.8-12.1c3.4-14.8 19.8-24.1 34.9-16.5l17.7 8.8V408zm28.2 25.3c2.2-8.1 3.8-16.5 3.8-25.3v-43.5c14.2-12.4 24.4-27.5 27.3-44.5 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 2.9 17 13.1 32.1 27.3 44.5V408c0 8.8 1.6 17.2 3.8 25.3C91.8 399.9 48 333 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 77-43.8 143.9-107.8 177.3zm36.9-281.1c-3.8-4.4-10.3-5.5-15.3-2.5l-80 48c-3.6 2.2-5.8 6.1-5.8 10.3s2.2 8.1 5.8 10.3l80 48c5.4 3.2 11.7 1.7 15.3-2.5 3.8-4.5 3.8-11 .1-15.5L343.6 208l33.6-40.3c3.8-4.5 3.7-11.1-.1-15.5zm-162.9 45.5l-80-48c-5-3-11.4-2-15.3 2.5-3.8 4.5-3.8 11-.1 15.5l33.6 40.3-33.6 40.3c-3.8 4.5-3.7 11 .1 15.5 3.6 4.2 9.9 5.7 15.3 2.5l80-48c3.6-2.2 5.8-6.1 5.8-10.3s-2.2-8.1-5.8-10.3z\"]\n};\nvar faGrinTongueWink = {\n prefix: 'far',\n iconName: 'grin-tongue-wink',\n icon: [496, 512, [], \"f58b\", \"M152 180c-25.7 0-55.9 16.9-59.8 42.1-.8 5 1.7 10 6.1 12.4 4.4 2.4 9.9 1.8 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c2.5 2.2 8 4.7 13.7 1.6 4.4-2.4 6.9-7.4 6.1-12.4-3.9-25.2-34.1-42.1-59.8-42.1zm176-52c-44.2 0-80 35.8-80 80s35.8 80 80 80 80-35.8 80-80-35.8-80-80-80zm0 128c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-72c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm64 400c0 35.6-29.1 64.5-64.9 64-35.1-.5-63.1-29.8-63.1-65v-42.8l17.7-8.8c15-7.5 31.5 1.7 34.9 16.5l2.8 12.1c2.1 9.2 15.2 9.2 17.3 0l2.8-12.1c3.4-14.8 19.8-24.1 34.9-16.5l17.7 8.8V408zm28.2 25.3c2.2-8.1 3.8-16.5 3.8-25.3v-43.5c14.2-12.4 24.4-27.5 27.3-44.5 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 2.9 17 13.1 32.1 27.3 44.5V408c0 8.8 1.6 17.2 3.8 25.3C91.8 399.9 48 333 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 77-43.8 143.9-107.8 177.3z\"]\n};\nvar faGrinWink = {\n prefix: 'far',\n iconName: 'grin-wink',\n icon: [496, 512, [], \"f58c\", \"M328 180c-25.69 0-55.88 16.92-59.86 42.12-1.75 11.22 11.5 18.24 19.83 10.84l9.55-8.48c14.81-13.19 46.16-13.19 60.97 0l9.55 8.48c8.48 7.43 21.56.25 19.83-10.84C383.88 196.92 353.69 180 328 180zm-160 60c17.67 0 32-14.33 32-32s-14.33-32-32-32-32 14.33-32 32 14.33 32 32 32zm185.55 64.64c-25.93 8.3-64.4 13.06-105.55 13.06s-79.62-4.75-105.55-13.06c-9.94-3.13-19.4 5.37-17.71 15.34C132.67 367.13 196.06 400 248 400s115.33-32.87 123.26-80.02c1.68-9.89-7.67-18.48-17.71-15.34zM248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 448c-110.28 0-200-89.72-200-200S137.72 56 248 56s200 89.72 200 200-89.72 200-200 200z\"]\n};\nvar faHandLizard = {\n prefix: 'far',\n iconName: 'hand-lizard',\n icon: [576, 512, [], \"f258\", \"M556.686 290.542L410.328 64.829C397.001 44.272 374.417 32 349.917 32H56C25.121 32 0 57.122 0 88v8c0 44.112 35.888 80 80 80h196.042l-18.333 48H144c-48.523 0-88 39.477-88 88 0 30.879 25.121 56 56 56h131.552c2.987 0 5.914.549 8.697 1.631L352 408.418V480h224V355.829c0-23.225-6.679-45.801-19.314-65.287zM528 432H400v-23.582c0-19.948-12.014-37.508-30.604-44.736l-99.751-38.788A71.733 71.733 0 0 0 243.552 320H112c-4.411 0-8-3.589-8-8 0-22.056 17.944-40 40-40h113.709c19.767 0 37.786-12.407 44.84-30.873l24.552-64.281c8.996-23.553-8.428-48.846-33.63-48.846H80c-17.645 0-32-14.355-32-32v-8c0-4.411 3.589-8 8-8h293.917c8.166 0 15.693 4.09 20.137 10.942l146.358 225.715A71.84 71.84 0 0 1 528 355.829V432z\"]\n};\nvar faHandPaper = {\n prefix: 'far',\n iconName: 'hand-paper',\n icon: [448, 512, [], \"f256\", \"M372.57 112.641v-10.825c0-43.612-40.52-76.691-83.039-65.546-25.629-49.5-94.09-47.45-117.982.747C130.269 26.456 89.144 57.945 89.144 102v126.13c-19.953-7.427-43.308-5.068-62.083 8.871-29.355 21.796-35.794 63.333-14.55 93.153L132.48 498.569a32 32 0 0 0 26.062 13.432h222.897c14.904 0 27.835-10.289 31.182-24.813l30.184-130.958A203.637 203.637 0 0 0 448 310.564V179c0-40.62-35.523-71.992-75.43-66.359zm27.427 197.922c0 11.731-1.334 23.469-3.965 34.886L368.707 464h-201.92L51.591 302.303c-14.439-20.27 15.023-42.776 29.394-22.605l27.128 38.079c8.995 12.626 29.031 6.287 29.031-9.283V102c0-25.645 36.571-24.81 36.571.691V256c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16V67c0-25.663 36.571-24.81 36.571.691V256c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16V101.125c0-25.672 36.57-24.81 36.57.691V256c0 8.837 7.163 16 16 16h6.857c8.837 0 16-7.163 16-16v-76.309c0-26.242 36.57-25.64 36.57-.691v131.563z\"]\n};\nvar faHandPeace = {\n prefix: 'far',\n iconName: 'hand-peace',\n icon: [448, 512, [], \"f25b\", \"M362.146 191.976c-13.71-21.649-38.761-34.016-65.006-30.341V74c0-40.804-32.811-74-73.141-74-40.33 0-73.14 33.196-73.14 74L160 168l-18.679-78.85C126.578 50.843 83.85 32.11 46.209 47.208 8.735 62.238-9.571 104.963 5.008 142.85l55.757 144.927c-30.557 24.956-43.994 57.809-24.733 92.218l54.853 97.999C102.625 498.97 124.73 512 148.575 512h205.702c30.744 0 57.558-21.44 64.555-51.797l27.427-118.999a67.801 67.801 0 0 0 1.729-15.203L448 256c0-44.956-43.263-77.343-85.854-64.024zM399.987 326c0 1.488-.169 2.977-.502 4.423l-27.427 119.001c-1.978 8.582-9.29 14.576-17.782 14.576H148.575c-6.486 0-12.542-3.621-15.805-9.449l-54.854-98c-4.557-8.141-2.619-18.668 4.508-24.488l26.647-21.764a16 16 0 0 0 4.812-18.139l-64.09-166.549C37.226 92.956 84.37 74.837 96.51 106.389l59.784 155.357A16 16 0 0 0 171.227 272h11.632c8.837 0 16-7.163 16-16V74c0-34.375 50.281-34.43 50.281 0v182c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16v-28c0-25.122 36.567-25.159 36.567 0v28c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16 0-25.12 36.567-25.16 36.567 0v70z\"]\n};\nvar faHandPointDown = {\n prefix: 'far',\n iconName: 'hand-point-down',\n icon: [448, 512, [], \"f0a7\", \"M188.8 512c45.616 0 83.2-37.765 83.2-83.2v-35.647a93.148 93.148 0 0 0 22.064-7.929c22.006 2.507 44.978-3.503 62.791-15.985C409.342 368.1 448 331.841 448 269.299V248c0-60.063-40-98.512-40-127.2v-2.679c4.952-5.747 8-13.536 8-22.12V32c0-17.673-12.894-32-28.8-32H156.8C140.894 0 128 14.327 128 32v64c0 8.584 3.048 16.373 8 22.12v2.679c0 6.964-6.193 14.862-23.668 30.183l-.148.129-.146.131c-9.937 8.856-20.841 18.116-33.253 25.851C48.537 195.798 0 207.486 0 252.8c0 56.928 35.286 92 83.2 92 8.026 0 15.489-.814 22.4-2.176V428.8c0 45.099 38.101 83.2 83.2 83.2zm0-48c-18.7 0-35.2-16.775-35.2-35.2V270.4c-17.325 0-35.2 26.4-70.4 26.4-26.4 0-35.2-20.625-35.2-44 0-8.794 32.712-20.445 56.1-34.926 14.575-9.074 27.225-19.524 39.875-30.799 18.374-16.109 36.633-33.836 39.596-59.075h176.752C364.087 170.79 400 202.509 400 248v21.299c0 40.524-22.197 57.124-61.325 50.601-8.001 14.612-33.979 24.151-53.625 12.925-18.225 19.365-46.381 17.787-61.05 4.95V428.8c0 18.975-16.225 35.2-35.2 35.2zM328 64c0-13.255 10.745-24 24-24s24 10.745 24 24-10.745 24-24 24-24-10.745-24-24z\"]\n};\nvar faHandPointLeft = {\n prefix: 'far',\n iconName: 'hand-point-left',\n icon: [512, 512, [], \"f0a5\", \"M0 220.8C0 266.416 37.765 304 83.2 304h35.647a93.148 93.148 0 0 0 7.929 22.064c-2.507 22.006 3.503 44.978 15.985 62.791C143.9 441.342 180.159 480 242.701 480H264c60.063 0 98.512-40 127.2-40h2.679c5.747 4.952 13.536 8 22.12 8h64c17.673 0 32-12.894 32-28.8V188.8c0-15.906-14.327-28.8-32-28.8h-64c-8.584 0-16.373 3.048-22.12 8H391.2c-6.964 0-14.862-6.193-30.183-23.668l-.129-.148-.131-.146c-8.856-9.937-18.116-20.841-25.851-33.253C316.202 80.537 304.514 32 259.2 32c-56.928 0-92 35.286-92 83.2 0 8.026.814 15.489 2.176 22.4H83.2C38.101 137.6 0 175.701 0 220.8zm48 0c0-18.7 16.775-35.2 35.2-35.2h158.4c0-17.325-26.4-35.2-26.4-70.4 0-26.4 20.625-35.2 44-35.2 8.794 0 20.445 32.712 34.926 56.1 9.074 14.575 19.524 27.225 30.799 39.875 16.109 18.374 33.836 36.633 59.075 39.596v176.752C341.21 396.087 309.491 432 264 432h-21.299c-40.524 0-57.124-22.197-50.601-61.325-14.612-8.001-24.151-33.979-12.925-53.625-19.365-18.225-17.787-46.381-4.95-61.05H83.2C64.225 256 48 239.775 48 220.8zM448 360c13.255 0 24 10.745 24 24s-10.745 24-24 24-24-10.745-24-24 10.745-24 24-24z\"]\n};\nvar faHandPointRight = {\n prefix: 'far',\n iconName: 'hand-point-right',\n icon: [512, 512, [], \"f0a4\", \"M428.8 137.6h-86.177a115.52 115.52 0 0 0 2.176-22.4c0-47.914-35.072-83.2-92-83.2-45.314 0-57.002 48.537-75.707 78.784-7.735 12.413-16.994 23.317-25.851 33.253l-.131.146-.129.148C135.662 161.807 127.764 168 120.8 168h-2.679c-5.747-4.952-13.536-8-22.12-8H32c-17.673 0-32 12.894-32 28.8v230.4C0 435.106 14.327 448 32 448h64c8.584 0 16.373-3.048 22.12-8h2.679c28.688 0 67.137 40 127.2 40h21.299c62.542 0 98.8-38.658 99.94-91.145 12.482-17.813 18.491-40.785 15.985-62.791A93.148 93.148 0 0 0 393.152 304H428.8c45.435 0 83.2-37.584 83.2-83.2 0-45.099-38.101-83.2-83.2-83.2zm0 118.4h-91.026c12.837 14.669 14.415 42.825-4.95 61.05 11.227 19.646 1.687 45.624-12.925 53.625 6.524 39.128-10.076 61.325-50.6 61.325H248c-45.491 0-77.21-35.913-120-39.676V215.571c25.239-2.964 42.966-21.222 59.075-39.596 11.275-12.65 21.725-25.3 30.799-39.875C232.355 112.712 244.006 80 252.8 80c23.375 0 44 8.8 44 35.2 0 35.2-26.4 53.075-26.4 70.4h158.4c18.425 0 35.2 16.5 35.2 35.2 0 18.975-16.225 35.2-35.2 35.2zM88 384c0 13.255-10.745 24-24 24s-24-10.745-24-24 10.745-24 24-24 24 10.745 24 24z\"]\n};\nvar faHandPointUp = {\n prefix: 'far',\n iconName: 'hand-point-up',\n icon: [448, 512, [], \"f0a6\", \"M105.6 83.2v86.177a115.52 115.52 0 0 0-22.4-2.176c-47.914 0-83.2 35.072-83.2 92 0 45.314 48.537 57.002 78.784 75.707 12.413 7.735 23.317 16.994 33.253 25.851l.146.131.148.129C129.807 376.338 136 384.236 136 391.2v2.679c-4.952 5.747-8 13.536-8 22.12v64c0 17.673 12.894 32 28.8 32h230.4c15.906 0 28.8-14.327 28.8-32v-64c0-8.584-3.048-16.373-8-22.12V391.2c0-28.688 40-67.137 40-127.2v-21.299c0-62.542-38.658-98.8-91.145-99.94-17.813-12.482-40.785-18.491-62.791-15.985A93.148 93.148 0 0 0 272 118.847V83.2C272 37.765 234.416 0 188.8 0c-45.099 0-83.2 38.101-83.2 83.2zm118.4 0v91.026c14.669-12.837 42.825-14.415 61.05 4.95 19.646-11.227 45.624-1.687 53.625 12.925 39.128-6.524 61.325 10.076 61.325 50.6V264c0 45.491-35.913 77.21-39.676 120H183.571c-2.964-25.239-21.222-42.966-39.596-59.075-12.65-11.275-25.3-21.725-39.875-30.799C80.712 279.645 48 267.994 48 259.2c0-23.375 8.8-44 35.2-44 35.2 0 53.075 26.4 70.4 26.4V83.2c0-18.425 16.5-35.2 35.2-35.2 18.975 0 35.2 16.225 35.2 35.2zM352 424c13.255 0 24 10.745 24 24s-10.745 24-24 24-24-10.745-24-24 10.745-24 24-24z\"]\n};\nvar faHandPointer = {\n prefix: 'far',\n iconName: 'hand-pointer',\n icon: [448, 512, [], \"f25a\", \"M358.182 179.361c-19.493-24.768-52.679-31.945-79.872-19.098-15.127-15.687-36.182-22.487-56.595-19.629V67c0-36.944-29.736-67-66.286-67S89.143 30.056 89.143 67v161.129c-19.909-7.41-43.272-5.094-62.083 8.872-29.355 21.795-35.793 63.333-14.55 93.152l109.699 154.001C134.632 501.59 154.741 512 176 512h178.286c30.802 0 57.574-21.5 64.557-51.797l27.429-118.999A67.873 67.873 0 0 0 448 326v-84c0-46.844-46.625-79.273-89.818-62.639zM80.985 279.697l27.126 38.079c8.995 12.626 29.031 6.287 29.031-9.283V67c0-25.12 36.571-25.16 36.571 0v175c0 8.836 7.163 16 16 16h6.857c8.837 0 16-7.164 16-16v-35c0-25.12 36.571-25.16 36.571 0v35c0 8.836 7.163 16 16 16H272c8.837 0 16-7.164 16-16v-21c0-25.12 36.571-25.16 36.571 0v21c0 8.836 7.163 16 16 16h6.857c8.837 0 16-7.164 16-16 0-25.121 36.571-25.16 36.571 0v84c0 1.488-.169 2.977-.502 4.423l-27.43 119.001c-1.978 8.582-9.29 14.576-17.782 14.576H176c-5.769 0-11.263-2.878-14.697-7.697l-109.712-154c-14.406-20.223 14.994-42.818 29.394-22.606zM176.143 400v-96c0-8.837 6.268-16 14-16h6c7.732 0 14 7.163 14 16v96c0 8.837-6.268 16-14 16h-6c-7.733 0-14-7.163-14-16zm75.428 0v-96c0-8.837 6.268-16 14-16h6c7.732 0 14 7.163 14 16v96c0 8.837-6.268 16-14 16h-6c-7.732 0-14-7.163-14-16zM327 400v-96c0-8.837 6.268-16 14-16h6c7.732 0 14 7.163 14 16v96c0 8.837-6.268 16-14 16h-6c-7.732 0-14-7.163-14-16z\"]\n};\nvar faHandRock = {\n prefix: 'far',\n iconName: 'hand-rock',\n icon: [512, 512, [], \"f255\", \"M408.864 79.052c-22.401-33.898-66.108-42.273-98.813-23.588-29.474-31.469-79.145-31.093-108.334-.022-47.16-27.02-108.71 5.055-110.671 60.806C44.846 105.407 0 140.001 0 187.429v56.953c0 32.741 14.28 63.954 39.18 85.634l97.71 85.081c4.252 3.702 3.11 5.573 3.11 32.903 0 17.673 14.327 32 32 32h252c17.673 0 32-14.327 32-32 0-23.513-1.015-30.745 3.982-42.37l42.835-99.656c6.094-14.177 9.183-29.172 9.183-44.568V146.963c0-52.839-54.314-88.662-103.136-67.911zM464 261.406a64.505 64.505 0 0 1-5.282 25.613l-42.835 99.655c-5.23 12.171-7.883 25.04-7.883 38.25V432H188v-10.286c0-16.37-7.14-31.977-19.59-42.817l-97.71-85.08C56.274 281.255 48 263.236 48 244.381v-56.953c0-33.208 52-33.537 52 .677v41.228a16 16 0 0 0 5.493 12.067l7 6.095A16 16 0 0 0 139 235.429V118.857c0-33.097 52-33.725 52 .677v26.751c0 8.836 7.164 16 16 16h7c8.836 0 16-7.164 16-16v-41.143c0-33.134 52-33.675 52 .677v40.466c0 8.836 7.163 16 16 16h7c8.837 0 16-7.164 16-16v-27.429c0-33.03 52-33.78 52 .677v26.751c0 8.836 7.163 16 16 16h7c8.837 0 16-7.164 16-16 0-33.146 52-33.613 52 .677v114.445z\"]\n};\nvar faHandScissors = {\n prefix: 'far',\n iconName: 'hand-scissors',\n icon: [512, 512, [], \"f257\", \"M256 480l70-.013c5.114 0 10.231-.583 15.203-1.729l118.999-27.427C490.56 443.835 512 417.02 512 386.277V180.575c0-23.845-13.03-45.951-34.005-57.69l-97.999-54.853c-34.409-19.261-67.263-5.824-92.218 24.733L142.85 37.008c-37.887-14.579-80.612 3.727-95.642 41.201-15.098 37.642 3.635 80.37 41.942 95.112L168 192l-94-9.141c-40.804 0-74 32.811-74 73.14 0 40.33 33.196 73.141 74 73.141h87.635c-3.675 26.245 8.692 51.297 30.341 65.006C178.657 436.737 211.044 480 256 480zm0-48.013c-25.16 0-25.12-36.567 0-36.567 8.837 0 16-7.163 16-16v-6.856c0-8.837-7.163-16-16-16h-28c-25.159 0-25.122-36.567 0-36.567h28c8.837 0 16-7.163 16-16v-6.856c0-8.837-7.163-16-16-16H74c-34.43 0-34.375-50.281 0-50.281h182c8.837 0 16-7.163 16-16v-11.632a16 16 0 0 0-10.254-14.933L106.389 128.51c-31.552-12.14-13.432-59.283 19.222-46.717l166.549 64.091a16.001 16.001 0 0 0 18.139-4.812l21.764-26.647c5.82-7.127 16.348-9.064 24.488-4.508l98 54.854c5.828 3.263 9.449 9.318 9.449 15.805v205.701c0 8.491-5.994 15.804-14.576 17.782l-119.001 27.427a19.743 19.743 0 0 1-4.423.502h-70z\"]\n};\nvar faHandSpock = {\n prefix: 'far',\n iconName: 'hand-spock',\n icon: [512, 512, [], \"f259\", \"M501.03053,116.17605c-19.39059-31.50779-51.24406-35.72849-66.31044-35.01756-14.11325-50.81051-62.0038-54.08-70.73816-54.08a74.03091,74.03091,0,0,0-72.23816,58.916l-4.64648,22.66014-13.68357-53.207c-9.09569-35.37107-46.412-64.05074-89.66-53.07223a73.89749,73.89749,0,0,0-55.121,78.94722,73.68273,73.68273,0,0,0-64.8495,94.42181l24.35933,82.19721c-38.24017-7.54492-62.79677,16.18358-68.11512,21.84764a73.6791,73.6791,0,0,0,3.19921,104.19329l91.36509,85.9765A154.164,154.164,0,0,0,220.62279,512h107.4549A127.30079,127.30079,0,0,0,452.3392,413.86139l57.623-241.96272A73.20274,73.20274,0,0,0,501.03053,116.17605Zm-37.7597,44.60544L405.64788,402.74812a79.46616,79.46616,0,0,1-77.57019,61.25972H220.62279a106.34052,106.34052,0,0,1-73.1366-28.998l-91.369-85.98041C31.34381,325.72669,66.61133,288.131,91.39644,311.5392l51.123,48.10739c5.42577,5.10937,13.48239.71679,13.48239-5.82617a246.79914,246.79914,0,0,0-10.17771-70.1523l-36.01362-121.539c-9.7324-32.88279,39.69916-47.27145,49.38664-14.625l31.3437,105.77923c5.59374,18.90428,33.78119,10.71288,28.9648-8.00781L177.06427,80.23662c-8.50389-33.1035,41.43157-45.64646,49.86515-12.83593l47.32609,184.035c4.42773,17.24218,29.16207,16.5039,32.71089-.80468l31.791-154.9706c6.81054-33.1074,57.51748-24.10741,50.11906,11.96288L360.32764,246.78924c-3.72265,18.10936,23.66793,24.63084,28.05659,6.21679L413.185,148.85962C421.1498,115.512,471.14,127.79713,463.27083,160.78149Z\"]\n};\nvar faHandshake = {\n prefix: 'far',\n iconName: 'handshake',\n icon: [640, 512, [], \"f2b5\", \"M519.2 127.9l-47.6-47.6A56.252 56.252 0 0 0 432 64H205.2c-14.8 0-29.1 5.9-39.6 16.3L118 127.9H0v255.7h64c17.6 0 31.8-14.2 31.9-31.7h9.1l84.6 76.4c30.9 25.1 73.8 25.7 105.6 3.8 12.5 10.8 26 15.9 41.1 15.9 18.2 0 35.3-7.4 48.8-24 22.1 8.7 48.2 2.6 64-16.8l26.2-32.3c5.6-6.9 9.1-14.8 10.9-23h57.9c.1 17.5 14.4 31.7 31.9 31.7h64V127.9H519.2zM48 351.6c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16c0 8.9-7.2 16-16 16zm390-6.9l-26.1 32.2c-2.8 3.4-7.8 4-11.3 1.2l-23.9-19.4-30 36.5c-6 7.3-15 4.8-18 2.4l-36.8-31.5-15.6 19.2c-13.9 17.1-39.2 19.7-55.3 6.6l-97.3-88H96V175.8h41.9l61.7-61.6c2-.8 3.7-1.5 5.7-2.3H262l-38.7 35.5c-29.4 26.9-31.1 72.3-4.4 101.3 14.8 16.2 61.2 41.2 101.5 4.4l8.2-7.5 108.2 87.8c3.4 2.8 3.9 7.9 1.2 11.3zm106-40.8h-69.2c-2.3-2.8-4.9-5.4-7.7-7.7l-102.7-83.4 12.5-11.4c6.5-6 7-16.1 1-22.6L367 167.1c-6-6.5-16.1-6.9-22.6-1l-55.2 50.6c-9.5 8.7-25.7 9.4-34.6 0-9.3-9.9-8.5-25.1 1.2-33.9l65.6-60.1c7.4-6.8 17-10.5 27-10.5l83.7-.2c2.1 0 4.1.8 5.5 2.3l61.7 61.6H544v128zm48 47.7c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16c0 8.9-7.2 16-16 16z\"]\n};\nvar faHdd = {\n prefix: 'far',\n iconName: 'hdd',\n icon: [576, 512, [], \"f0a0\", \"M567.403 235.642L462.323 84.589A48 48 0 0 0 422.919 64H153.081a48 48 0 0 0-39.404 20.589L8.597 235.642A48.001 48.001 0 0 0 0 263.054V400c0 26.51 21.49 48 48 48h480c26.51 0 48-21.49 48-48V263.054c0-9.801-3-19.366-8.597-27.412zM153.081 112h269.838l77.913 112H75.168l77.913-112zM528 400H48V272h480v128zm-32-64c0 17.673-14.327 32-32 32s-32-14.327-32-32 14.327-32 32-32 32 14.327 32 32zm-96 0c0 17.673-14.327 32-32 32s-32-14.327-32-32 14.327-32 32-32 32 14.327 32 32z\"]\n};\nvar faHeart = {\n prefix: 'far',\n iconName: 'heart',\n icon: [512, 512, [], \"f004\", \"M458.4 64.3C400.6 15.7 311.3 23 256 79.3 200.7 23 111.4 15.6 53.6 64.3-21.6 127.6-10.6 230.8 43 285.5l175.4 178.7c10 10.2 23.4 15.9 37.6 15.9 14.3 0 27.6-5.6 37.6-15.8L469 285.6c53.5-54.7 64.7-157.9-10.6-221.3zm-23.6 187.5L259.4 430.5c-2.4 2.4-4.4 2.4-6.8 0L77.2 251.8c-36.5-37.2-43.9-107.6 7.3-150.7 38.9-32.7 98.9-27.8 136.5 10.5l35 35.7 35-35.7c37.8-38.5 97.8-43.2 136.5-10.6 51.1 43.1 43.5 113.9 7.3 150.8z\"]\n};\nvar faHospital = {\n prefix: 'far',\n iconName: 'hospital',\n icon: [448, 512, [], \"f0f8\", \"M128 244v-40c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12zm140 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12zm-76 84v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm76 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12zm180 124v36H0v-36c0-6.627 5.373-12 12-12h19.5V85.035C31.5 73.418 42.245 64 55.5 64H144V24c0-13.255 10.745-24 24-24h112c13.255 0 24 10.745 24 24v40h88.5c13.255 0 24 9.418 24 21.035V464H436c6.627 0 12 5.373 12 12zM79.5 463H192v-67c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v67h112.5V112H304v24c0 13.255-10.745 24-24 24H168c-13.255 0-24-10.745-24-24v-24H79.5v351zM266 64h-26V38a6 6 0 0 0-6-6h-20a6 6 0 0 0-6 6v26h-26a6 6 0 0 0-6 6v20a6 6 0 0 0 6 6h26v26a6 6 0 0 0 6 6h20a6 6 0 0 0 6-6V96h26a6 6 0 0 0 6-6V70a6 6 0 0 0-6-6z\"]\n};\nvar faHourglass = {\n prefix: 'far',\n iconName: 'hourglass',\n icon: [384, 512, [], \"f254\", \"M368 48h4c6.627 0 12-5.373 12-12V12c0-6.627-5.373-12-12-12H12C5.373 0 0 5.373 0 12v24c0 6.627 5.373 12 12 12h4c0 80.564 32.188 165.807 97.18 208C47.899 298.381 16 383.9 16 464h-4c-6.627 0-12 5.373-12 12v24c0 6.627 5.373 12 12 12h360c6.627 0 12-5.373 12-12v-24c0-6.627-5.373-12-12-12h-4c0-80.564-32.188-165.807-97.18-208C336.102 213.619 368 128.1 368 48zM64 48h256c0 101.62-57.307 184-128 184S64 149.621 64 48zm256 416H64c0-101.62 57.308-184 128-184s128 82.38 128 184z\"]\n};\nvar faIdBadge = {\n prefix: 'far',\n iconName: 'id-badge',\n icon: [384, 512, [], \"f2c1\", \"M336 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm0 464H48V48h288v416zM144 112h96c8.8 0 16-7.2 16-16s-7.2-16-16-16h-96c-8.8 0-16 7.2-16 16s7.2 16 16 16zm48 176c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2z\"]\n};\nvar faIdCard = {\n prefix: 'far',\n iconName: 'id-card',\n icon: [576, 512, [], \"f2c2\", \"M528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 400H303.2c.9-4.5.8 3.6.8-22.4 0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6 0 26-.2 17.9.8 22.4H48V144h480v288zm-168-80h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm-168 96c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64z\"]\n};\nvar faImage = {\n prefix: 'far',\n iconName: 'image',\n icon: [512, 512, [], \"f03e\", \"M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm-6 336H54a6 6 0 0 1-6-6V118a6 6 0 0 1 6-6h404a6 6 0 0 1 6 6v276a6 6 0 0 1-6 6zM128 152c-22.091 0-40 17.909-40 40s17.909 40 40 40 40-17.909 40-40-17.909-40-40-40zM96 352h320v-80l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L192 304l-39.515-39.515c-4.686-4.686-12.284-4.686-16.971 0L96 304v48z\"]\n};\nvar faImages = {\n prefix: 'far',\n iconName: 'images',\n icon: [576, 512, [], \"f302\", \"M480 416v16c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V176c0-26.51 21.49-48 48-48h16v48H54a6 6 0 0 0-6 6v244a6 6 0 0 0 6 6h372a6 6 0 0 0 6-6v-10h48zm42-336H150a6 6 0 0 0-6 6v244a6 6 0 0 0 6 6h372a6 6 0 0 0 6-6V86a6 6 0 0 0-6-6zm6-48c26.51 0 48 21.49 48 48v256c0 26.51-21.49 48-48 48H144c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h384zM264 144c0 22.091-17.909 40-40 40s-40-17.909-40-40 17.909-40 40-40 40 17.909 40 40zm-72 96l39.515-39.515c4.686-4.686 12.284-4.686 16.971 0L288 240l103.515-103.515c4.686-4.686 12.284-4.686 16.971 0L480 208v80H192v-48z\"]\n};\nvar faKeyboard = {\n prefix: 'far',\n iconName: 'keyboard',\n icon: [576, 512, [], \"f11c\", \"M528 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h480c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm8 336c0 4.411-3.589 8-8 8H48c-4.411 0-8-3.589-8-8V112c0-4.411 3.589-8 8-8h480c4.411 0 8 3.589 8 8v288zM170 270v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm-336 82v-28c0-6.627-5.373-12-12-12H82c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm384 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zM122 188v-28c0-6.627-5.373-12-12-12H82c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm-98 158v-16c0-6.627-5.373-12-12-12H180c-6.627 0-12 5.373-12 12v16c0 6.627 5.373 12 12 12h216c6.627 0 12-5.373 12-12z\"]\n};\nvar faKiss = {\n prefix: 'far',\n iconName: 'kiss',\n icon: [496, 512, [], \"f596\", \"M168 176c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm136 132c0-19.2-28.8-41.5-71.5-44-3.8-.4-7.4 2.4-8.2 6.2-.9 3.8 1.1 7.7 4.7 9.2l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-5.7 2.4-6 12.2 0 14.8l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-3.6 1.5-5.6 5.4-4.7 9.2.8 3.6 4.1 6.2 7.8 6.2h.5c42.8-2.5 71.5-24.8 71.5-44 0-13-13.4-27.3-35.2-36C290.6 335.3 304 321 304 308zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm80-280c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faKissBeam = {\n prefix: 'far',\n iconName: 'kiss-beam',\n icon: [496, 512, [], \"f597\", \"M168 152c-23.8 0-52.7 29.3-56 71.4-.3 3.7 2 7.2 5.6 8.3 3.5 1 7.5-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 5.9-4.5 5.6-8.3-3.1-42.1-32-71.4-55.8-71.4zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm56-148c0-19.2-28.8-41.5-71.5-44-3.8-.4-7.4 2.4-8.2 6.2-.9 3.8 1.1 7.7 4.7 9.2l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-5.7 2.4-6 12.2 0 14.8l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-3.6 1.5-5.6 5.4-4.7 9.2.8 3.6 4.1 6.2 7.8 6.2h.5c42.8-2.5 71.5-24.8 71.5-44 0-13-13.4-27.3-35.2-36C290.6 335.3 304 321 304 308zm24-156c-23.8 0-52.7 29.3-56 71.4-.3 3.7 2 7.2 5.6 8.3 3.5 1 7.5-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 5.9-4.5 5.6-8.3-3.1-42.1-32-71.4-55.8-71.4z\"]\n};\nvar faKissWinkHeart = {\n prefix: 'far',\n iconName: 'kiss-wink-heart',\n icon: [504, 512, [], \"f598\", \"M304 308.5c0-19.2-28.8-41.5-71.5-44-3.8-.4-7.4 2.4-8.2 6.2-.9 3.8 1.1 7.7 4.7 9.2l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-5.7 2.4-6 12.2 0 14.8l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-3.6 1.5-5.6 5.4-4.7 9.2.8 3.6 4.1 6.2 7.8 6.2h.5c42.8-2.5 71.5-24.8 71.5-44 0-13-13.4-27.3-35.2-36 21.7-9.1 35.1-23.4 35.1-36.4zm70.5-83.5l9.5 8.5c3.8 3.3 9.3 4 13.7 1.6 4.4-2.4 6.9-7.4 6.1-12.4-4-25.2-34.2-42.1-59.8-42.1s-55.9 16.9-59.8 42.1c-.8 5 1.7 10 6.1 12.4 5.8 3.1 11.2.7 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0zM136 208.5c0 17.7 14.3 32 32 32s32-14.3 32-32-14.3-32-32-32-32 14.3-32 32zm365.1 194c-8-20.8-31.5-31.5-53.1-25.9l-8.4 2.2-2.3-8.4c-5.9-21.4-27-36.5-49-33-25.2 4-40.6 28.6-34 52.6l22.9 82.6c1.5 5.3 7 8.5 12.4 7.1l83-21.5c24.1-6.3 37.7-31.8 28.5-55.7zM334 436.3c-26.1 12.5-55.2 19.7-86 19.7-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200c0 22.1-3.7 43.3-10.4 63.2 9 6.4 17 14.2 22.6 23.9 6.4.1 12.6 1.4 18.6 2.9 10.9-27.9 17.1-58.2 17.1-90C496 119 385 8 248 8S0 119 0 256s111 248 248 248c35.4 0 68.9-7.5 99.4-20.9-2.5-7.3 4.3 17.2-13.4-46.8z\"]\n};\nvar faLaugh = {\n prefix: 'far',\n iconName: 'laugh',\n icon: [496, 512, [], \"f599\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6S48 309.4 48 256s20.8-103.6 58.6-141.4S194.6 56 248 56s103.6 20.8 141.4 58.6S448 202.6 448 256s-20.8 103.6-58.6 141.4zM328 224c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm-160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm194.4 64H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLaughBeam = {\n prefix: 'far',\n iconName: 'laugh-beam',\n icon: [496, 512, [], \"f59a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6S48 309.4 48 256s20.8-103.6 58.6-141.4S194.6 56 248 56s103.6 20.8 141.4 58.6S448 202.6 448 256s-20.8 103.6-58.6 141.4zM328 152c-23.8 0-52.7 29.3-56 71.4-.7 8.6 10.8 11.9 14.9 4.5l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c4.1 7.4 15.6 4 14.9-4.5-3.1-42.1-32-71.4-55.8-71.4zm-201 75.9l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c4.1 7.4 15.6 4 14.9-4.5-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.6 8.5 10.9 11.9 15.1 4.5zM362.4 288H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLaughSquint = {\n prefix: 'far',\n iconName: 'laugh-squint',\n icon: [496, 512, [], \"f59b\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6S48 309.4 48 256s20.8-103.6 58.6-141.4S194.6 56 248 56s103.6 20.8 141.4 58.6S448 202.6 448 256s-20.8 103.6-58.6 141.4zM343.6 196l33.6-40.3c8.6-10.3-3.8-24.8-15.4-18l-80 48c-7.8 4.7-7.8 15.9 0 20.6l80 48c11.5 6.8 24-7.6 15.4-18L343.6 196zm-209.4 58.3l80-48c7.8-4.7 7.8-15.9 0-20.6l-80-48c-11.6-6.9-24 7.7-15.4 18l33.6 40.3-33.6 40.3c-8.7 10.4 3.8 24.8 15.4 18zM362.4 288H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLaughWink = {\n prefix: 'far',\n iconName: 'laugh-wink',\n icon: [496, 512, [], \"f59c\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6C68.8 359.6 48 309.4 48 256s20.8-103.6 58.6-141.4C144.4 76.8 194.6 56 248 56s103.6 20.8 141.4 58.6c37.8 37.8 58.6 88 58.6 141.4s-20.8 103.6-58.6 141.4zM328 164c-25.7 0-55.9 16.9-59.9 42.1-1.7 11.2 11.5 18.2 19.8 10.8l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c8.5 7.4 21.6.3 19.8-10.8-3.8-25.2-34-42.1-59.7-42.1zm-160 60c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm194.4 64H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z\"]\n};\nvar faLemon = {\n prefix: 'far',\n iconName: 'lemon',\n icon: [512, 512, [], \"f094\", \"M484.112 27.889C455.989-.233 416.108-8.057 387.059 8.865 347.604 31.848 223.504-41.111 91.196 91.197-41.277 223.672 31.923 347.472 8.866 387.058c-16.922 29.051-9.1 68.932 19.022 97.054 28.135 28.135 68.011 35.938 97.057 19.021 39.423-22.97 163.557 49.969 295.858-82.329 132.474-132.477 59.273-256.277 82.331-295.861 16.922-29.05 9.1-68.931-19.022-97.054zm-22.405 72.894c-38.8 66.609 45.6 165.635-74.845 286.08-120.44 120.443-219.475 36.048-286.076 74.843-22.679 13.207-64.035-27.241-50.493-50.488 38.8-66.609-45.6-165.635 74.845-286.08C245.573 4.702 344.616 89.086 411.219 50.292c22.73-13.24 64.005 27.288 50.488 50.491zm-169.861 8.736c1.37 10.96-6.404 20.957-17.365 22.327-54.846 6.855-135.779 87.787-142.635 142.635-1.373 10.989-11.399 18.734-22.326 17.365-10.961-1.37-18.735-11.366-17.365-22.326 9.162-73.286 104.167-168.215 177.365-177.365 10.953-1.368 20.956 6.403 22.326 17.364z\"]\n};\nvar faLifeRing = {\n prefix: 'far',\n iconName: 'life-ring',\n icon: [512, 512, [], \"f1cd\", \"M256 504c136.967 0 248-111.033 248-248S392.967 8 256 8 8 119.033 8 256s111.033 248 248 248zm-103.398-76.72l53.411-53.411c31.806 13.506 68.128 13.522 99.974 0l53.411 53.411c-63.217 38.319-143.579 38.319-206.796 0zM336 256c0 44.112-35.888 80-80 80s-80-35.888-80-80 35.888-80 80-80 80 35.888 80 80zm91.28 103.398l-53.411-53.411c13.505-31.806 13.522-68.128 0-99.974l53.411-53.411c38.319 63.217 38.319 143.579 0 206.796zM359.397 84.72l-53.411 53.411c-31.806-13.505-68.128-13.522-99.973 0L152.602 84.72c63.217-38.319 143.579-38.319 206.795 0zM84.72 152.602l53.411 53.411c-13.506 31.806-13.522 68.128 0 99.974L84.72 359.398c-38.319-63.217-38.319-143.579 0-206.796z\"]\n};\nvar faLightbulb = {\n prefix: 'far',\n iconName: 'lightbulb',\n icon: [352, 512, [], \"f0eb\", \"M176 80c-52.94 0-96 43.06-96 96 0 8.84 7.16 16 16 16s16-7.16 16-16c0-35.3 28.72-64 64-64 8.84 0 16-7.16 16-16s-7.16-16-16-16zM96.06 459.17c0 3.15.93 6.22 2.68 8.84l24.51 36.84c2.97 4.46 7.97 7.14 13.32 7.14h78.85c5.36 0 10.36-2.68 13.32-7.14l24.51-36.84c1.74-2.62 2.67-5.7 2.68-8.84l.05-43.18H96.02l.04 43.18zM176 0C73.72 0 0 82.97 0 176c0 44.37 16.45 84.85 43.56 115.78 16.64 18.99 42.74 58.8 52.42 92.16v.06h48v-.12c-.01-4.77-.72-9.51-2.15-14.07-5.59-17.81-22.82-64.77-62.17-109.67-20.54-23.43-31.52-53.15-31.61-84.14-.2-73.64 59.67-128 127.95-128 70.58 0 128 57.42 128 128 0 30.97-11.24 60.85-31.65 84.14-39.11 44.61-56.42 91.47-62.1 109.46a47.507 47.507 0 0 0-2.22 14.3v.1h48v-.05c9.68-33.37 35.78-73.18 52.42-92.16C335.55 260.85 352 220.37 352 176 352 78.8 273.2 0 176 0z\"]\n};\nvar faListAlt = {\n prefix: 'far',\n iconName: 'list-alt',\n icon: [512, 512, [], \"f022\", \"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zm-6 400H54a6 6 0 0 1-6-6V86a6 6 0 0 1 6-6h404a6 6 0 0 1 6 6v340a6 6 0 0 1-6 6zm-42-92v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm0-96v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm0-96v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm-252 12c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36zm0 96c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36zm0 96c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36z\"]\n};\nvar faMap = {\n prefix: 'far',\n iconName: 'map',\n icon: [576, 512, [], \"f279\", \"M560.02 32c-1.96 0-3.98.37-5.96 1.16L384.01 96H384L212 35.28A64.252 64.252 0 0 0 191.76 32c-6.69 0-13.37 1.05-19.81 3.14L20.12 87.95A32.006 32.006 0 0 0 0 117.66v346.32C0 473.17 7.53 480 15.99 480c1.96 0 3.97-.37 5.96-1.16L192 416l172 60.71a63.98 63.98 0 0 0 40.05.15l151.83-52.81A31.996 31.996 0 0 0 576 394.34V48.02c0-9.19-7.53-16.02-15.98-16.02zM224 90.42l128 45.19v285.97l-128-45.19V90.42zM48 418.05V129.07l128-44.53v286.2l-.64.23L48 418.05zm480-35.13l-128 44.53V141.26l.64-.24L528 93.95v288.97z\"]\n};\nvar faMeh = {\n prefix: 'far',\n iconName: 'meh',\n icon: [496, 512, [], \"f11a\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm8 144H160c-13.2 0-24 10.8-24 24s10.8 24 24 24h176c13.2 0 24-10.8 24-24s-10.8-24-24-24z\"]\n};\nvar faMehBlank = {\n prefix: 'far',\n iconName: 'meh-blank',\n icon: [496, 512, [], \"f5a4\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-280c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm160 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faMehRollingEyes = {\n prefix: 'far',\n iconName: 'meh-rolling-eyes',\n icon: [496, 512, [], \"f5a5\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm88-304c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72zm0 112c-22.1 0-40-17.9-40-40 0-13.6 7.3-25.1 17.7-32.3-1 2.6-1.7 5.3-1.7 8.3 0 13.3 10.7 24 24 24s24-10.7 24-24c0-2.9-.7-5.7-1.7-8.3 10.4 7.2 17.7 18.7 17.7 32.3 0 22.1-17.9 40-40 40zm-104-40c0-39.8-32.2-72-72-72s-72 32.2-72 72 32.2 72 72 72 72-32.2 72-72zm-112 0c0-13.6 7.3-25.1 17.7-32.3-1 2.6-1.7 5.3-1.7 8.3 0 13.3 10.7 24 24 24s24-10.7 24-24c0-2.9-.7-5.7-1.7-8.3 10.4 7.2 17.7 18.7 17.7 32.3 0 22.1-17.9 40-40 40s-40-17.9-40-40zm192 128H184c-13.2 0-24 10.8-24 24s10.8 24 24 24h128c13.2 0 24-10.8 24-24s-10.8-24-24-24z\"]\n};\nvar faMinusSquare = {\n prefix: 'far',\n iconName: 'minus-square',\n icon: [448, 512, [], \"f146\", \"M108 284c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h232c6.6 0 12 5.4 12 12v32c0 6.6-5.4 12-12 12H108zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faMoneyBillAlt = {\n prefix: 'far',\n iconName: 'money-bill-alt',\n icon: [640, 512, [], \"f3d1\", \"M320 144c-53.02 0-96 50.14-96 112 0 61.85 42.98 112 96 112 53 0 96-50.13 96-112 0-61.86-42.98-112-96-112zm40 168c0 4.42-3.58 8-8 8h-64c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h16v-55.44l-.47.31a7.992 7.992 0 0 1-11.09-2.22l-8.88-13.31a7.992 7.992 0 0 1 2.22-11.09l15.33-10.22a23.99 23.99 0 0 1 13.31-4.03H328c4.42 0 8 3.58 8 8v88h16c4.42 0 8 3.58 8 8v16zM608 64H32C14.33 64 0 78.33 0 96v320c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V96c0-17.67-14.33-32-32-32zm-16 272c-35.35 0-64 28.65-64 64H112c0-35.35-28.65-64-64-64V176c35.35 0 64-28.65 64-64h416c0 35.35 28.65 64 64 64v160z\"]\n};\nvar faMoon = {\n prefix: 'far',\n iconName: 'moon',\n icon: [512, 512, [], \"f186\", \"M279.135 512c78.756 0 150.982-35.804 198.844-94.775 28.27-34.831-2.558-85.722-46.249-77.401-82.348 15.683-158.272-47.268-158.272-130.792 0-48.424 26.06-92.292 67.434-115.836 38.745-22.05 28.999-80.788-15.022-88.919A257.936 257.936 0 0 0 279.135 0c-141.36 0-256 114.575-256 256 0 141.36 114.576 256 256 256zm0-464c12.985 0 25.689 1.201 38.016 3.478-54.76 31.163-91.693 90.042-91.693 157.554 0 113.848 103.641 199.2 215.252 177.944C402.574 433.964 344.366 464 279.135 464c-114.875 0-208-93.125-208-208s93.125-208 208-208z\"]\n};\nvar faNewspaper = {\n prefix: 'far',\n iconName: 'newspaper',\n icon: [576, 512, [], \"f1ea\", \"M552 64H112c-20.858 0-38.643 13.377-45.248 32H24c-13.255 0-24 10.745-24 24v272c0 30.928 25.072 56 56 56h496c13.255 0 24-10.745 24-24V88c0-13.255-10.745-24-24-24zM48 392V144h16v248c0 4.411-3.589 8-8 8s-8-3.589-8-8zm480 8H111.422c.374-2.614.578-5.283.578-8V112h416v288zM172 280h136c6.627 0 12-5.373 12-12v-96c0-6.627-5.373-12-12-12H172c-6.627 0-12 5.373-12 12v96c0 6.627 5.373 12 12 12zm28-80h80v40h-80v-40zm-40 140v-24c0-6.627 5.373-12 12-12h136c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H172c-6.627 0-12-5.373-12-12zm192 0v-24c0-6.627 5.373-12 12-12h104c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H364c-6.627 0-12-5.373-12-12zm0-144v-24c0-6.627 5.373-12 12-12h104c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H364c-6.627 0-12-5.373-12-12zm0 72v-24c0-6.627 5.373-12 12-12h104c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H364c-6.627 0-12-5.373-12-12z\"]\n};\nvar faObjectGroup = {\n prefix: 'far',\n iconName: 'object-group',\n icon: [512, 512, [], \"f247\", \"M500 128c6.627 0 12-5.373 12-12V44c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v12H96V44c0-6.627-5.373-12-12-12H12C5.373 32 0 37.373 0 44v72c0 6.627 5.373 12 12 12h12v256H12c-6.627 0-12 5.373-12 12v72c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-12h320v12c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-12V128h12zm-52-64h32v32h-32V64zM32 64h32v32H32V64zm32 384H32v-32h32v32zm416 0h-32v-32h32v32zm-40-64h-12c-6.627 0-12 5.373-12 12v12H96v-12c0-6.627-5.373-12-12-12H72V128h12c6.627 0 12-5.373 12-12v-12h320v12c0 6.627 5.373 12 12 12h12v256zm-36-192h-84v-52c0-6.628-5.373-12-12-12H108c-6.627 0-12 5.372-12 12v168c0 6.628 5.373 12 12 12h84v52c0 6.628 5.373 12 12 12h200c6.627 0 12-5.372 12-12V204c0-6.628-5.373-12-12-12zm-268-24h144v112H136V168zm240 176H232v-24h76c6.627 0 12-5.372 12-12v-76h56v112z\"]\n};\nvar faObjectUngroup = {\n prefix: 'far',\n iconName: 'object-ungroup',\n icon: [576, 512, [], \"f248\", \"M564 224c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v12h-88v-24h12c6.627 0 12-5.373 12-12V44c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v12H96V44c0-6.627-5.373-12-12-12H12C5.373 32 0 37.373 0 44v72c0 6.627 5.373 12 12 12h12v160H12c-6.627 0-12 5.373-12 12v72c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-12h88v24h-12c-6.627 0-12 5.373-12 12v72c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-12h224v12c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-12V224h12zM352 64h32v32h-32V64zm0 256h32v32h-32v-32zM64 352H32v-32h32v32zm0-256H32V64h32v32zm32 216v-12c0-6.627-5.373-12-12-12H72V128h12c6.627 0 12-5.373 12-12v-12h224v12c0 6.627 5.373 12 12 12h12v160h-12c-6.627 0-12 5.373-12 12v12H96zm128 136h-32v-32h32v32zm280-64h-12c-6.627 0-12 5.373-12 12v12H256v-12c0-6.627-5.373-12-12-12h-12v-24h88v12c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-12v-88h88v12c0 6.627 5.373 12 12 12h12v160zm40 64h-32v-32h32v32zm0-256h-32v-32h32v32z\"]\n};\nvar faPaperPlane = {\n prefix: 'far',\n iconName: 'paper-plane',\n icon: [512, 512, [], \"f1d8\", \"M440 6.5L24 246.4c-34.4 19.9-31.1 70.8 5.7 85.9L144 379.6V464c0 46.4 59.2 65.5 86.6 28.6l43.8-59.1 111.9 46.2c5.9 2.4 12.1 3.6 18.3 3.6 8.2 0 16.3-2.1 23.6-6.2 12.8-7.2 21.6-20 23.9-34.5l59.4-387.2c6.1-40.1-36.9-68.8-71.5-48.9zM192 464v-64.6l36.6 15.1L192 464zm212.6-28.7l-153.8-63.5L391 169.5c10.7-15.5-9.5-33.5-23.7-21.2L155.8 332.6 48 288 464 48l-59.4 387.3z\"]\n};\nvar faPauseCircle = {\n prefix: 'far',\n iconName: 'pause-circle',\n icon: [512, 512, [], \"f28b\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm96-280v160c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16zm-112 0v160c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16z\"]\n};\nvar faPlayCircle = {\n prefix: 'far',\n iconName: 'play-circle',\n icon: [512, 512, [], \"f144\", \"M371.7 238l-176-107c-15.8-8.8-35.7 2.5-35.7 21v208c0 18.4 19.8 29.8 35.7 21l176-101c16.4-9.1 16.4-32.8 0-42zM504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256z\"]\n};\nvar faPlusSquare = {\n prefix: 'far',\n iconName: 'plus-square',\n icon: [448, 512, [], \"f0fe\", \"M352 240v32c0 6.6-5.4 12-12 12h-88v88c0 6.6-5.4 12-12 12h-32c-6.6 0-12-5.4-12-12v-88h-88c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h88v-88c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v88h88c6.6 0 12 5.4 12 12zm96-160v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z\"]\n};\nvar faQuestionCircle = {\n prefix: 'far',\n iconName: 'question-circle',\n icon: [512, 512, [], \"f059\", \"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 448c-110.532 0-200-89.431-200-200 0-110.495 89.472-200 200-200 110.491 0 200 89.471 200 200 0 110.53-89.431 200-200 200zm107.244-255.2c0 67.052-72.421 68.084-72.421 92.863V300c0 6.627-5.373 12-12 12h-45.647c-6.627 0-12-5.373-12-12v-8.659c0-35.745 27.1-50.034 47.579-61.516 17.561-9.845 28.324-16.541 28.324-29.579 0-17.246-21.999-28.693-39.784-28.693-23.189 0-33.894 10.977-48.942 29.969-4.057 5.12-11.46 6.071-16.666 2.124l-27.824-21.098c-5.107-3.872-6.251-11.066-2.644-16.363C184.846 131.491 214.94 112 261.794 112c49.071 0 101.45 38.304 101.45 88.8zM298 368c0 23.159-18.841 42-42 42s-42-18.841-42-42 18.841-42 42-42 42 18.841 42 42z\"]\n};\nvar faRegistered = {\n prefix: 'far',\n iconName: 'registered',\n icon: [512, 512, [], \"f25d\", \"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 448c-110.532 0-200-89.451-200-200 0-110.531 89.451-200 200-200 110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200zm110.442-81.791c-53.046-96.284-50.25-91.468-53.271-96.085 24.267-13.879 39.482-41.563 39.482-73.176 0-52.503-30.247-85.252-101.498-85.252h-78.667c-6.617 0-12 5.383-12 12V380c0 6.617 5.383 12 12 12h38.568c6.617 0 12-5.383 12-12v-83.663h31.958l47.515 89.303a11.98 11.98 0 0 0 10.593 6.36h42.81c9.14 0 14.914-9.799 10.51-17.791zM256.933 239.906h-33.875v-64.14h27.377c32.417 0 38.929 12.133 38.929 31.709-.001 20.913-11.518 32.431-32.431 32.431z\"]\n};\nvar faSadCry = {\n prefix: 'far',\n iconName: 'sad-cry',\n icon: [496, 512, [], \"f5b3\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm144 386.4V280c0-13.2-10.8-24-24-24s-24 10.8-24 24v151.4C315.5 447 282.8 456 248 456s-67.5-9-96-24.6V280c0-13.2-10.8-24-24-24s-24 10.8-24 24v114.4c-34.6-36-56-84.7-56-138.4 0-110.3 89.7-200 200-200s200 89.7 200 200c0 53.7-21.4 102.5-56 138.4zM205.8 234.5c4.4-2.4 6.9-7.4 6.1-12.4-4-25.2-34.2-42.1-59.8-42.1s-55.9 16.9-59.8 42.1c-.8 5 1.7 10 6.1 12.4 4.4 2.4 9.9 1.8 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c2.5 2.3 7.9 4.8 13.7 1.6zM344 180c-25.7 0-55.9 16.9-59.8 42.1-.8 5 1.7 10 6.1 12.4 4.5 2.4 9.9 1.8 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c2.5 2.2 8 4.7 13.7 1.6 4.4-2.4 6.9-7.4 6.1-12.4-3.9-25.2-34.1-42.1-59.8-42.1zm-96 92c-30.9 0-56 28.7-56 64s25.1 64 56 64 56-28.7 56-64-25.1-64-56-64z\"]\n};\nvar faSadTear = {\n prefix: 'far',\n iconName: 'sad-tear',\n icon: [496, 512, [], \"f5b4\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm8-152c-13.2 0-24 10.8-24 24s10.8 24 24 24c23.8 0 46.3 10.5 61.6 28.8 8.1 9.8 23.2 11.9 33.8 3.1 10.2-8.5 11.6-23.6 3.1-33.8C330 320.8 294.1 304 256 304zm-88-64c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-165.6 98.8C151 290.1 126 325.4 126 342.9c0 22.7 18.8 41.1 42 41.1s42-18.4 42-41.1c0-17.5-25-52.8-36.4-68.1-2.8-3.7-8.4-3.7-11.2 0z\"]\n};\nvar faSave = {\n prefix: 'far',\n iconName: 'save',\n icon: [448, 512, [], \"f0c7\", \"M433.941 129.941l-83.882-83.882A48 48 0 0 0 316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 0 0-14.059-33.941zM272 80v80H144V80h128zm122 352H54a6 6 0 0 1-6-6V86a6 6 0 0 1 6-6h42v104c0 13.255 10.745 24 24 24h176c13.255 0 24-10.745 24-24V83.882l78.243 78.243a6 6 0 0 1 1.757 4.243V426a6 6 0 0 1-6 6zM224 232c-48.523 0-88 39.477-88 88s39.477 88 88 88 88-39.477 88-88-39.477-88-88-88zm0 128c-22.056 0-40-17.944-40-40s17.944-40 40-40 40 17.944 40 40-17.944 40-40 40z\"]\n};\nvar faShareSquare = {\n prefix: 'far',\n iconName: 'share-square',\n icon: [576, 512, [], \"f14d\", \"M561.938 158.06L417.94 14.092C387.926-15.922 336 5.097 336 48.032v57.198c-42.45 1.88-84.03 6.55-120.76 17.99-35.17 10.95-63.07 27.58-82.91 49.42C108.22 199.2 96 232.6 96 271.94c0 61.697 33.178 112.455 84.87 144.76 37.546 23.508 85.248-12.651 71.02-55.74-15.515-47.119-17.156-70.923 84.11-78.76V336c0 42.993 51.968 63.913 81.94 33.94l143.998-144c18.75-18.74 18.75-49.14 0-67.88zM384 336V232.16C255.309 234.082 166.492 255.35 206.31 376 176.79 357.55 144 324.08 144 271.94c0-109.334 129.14-118.947 240-119.85V48l144 144-144 144zm24.74 84.493a82.658 82.658 0 0 0 20.974-9.303c7.976-4.952 18.286.826 18.286 10.214V464c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h132c6.627 0 12 5.373 12 12v4.486c0 4.917-2.987 9.369-7.569 11.152-13.702 5.331-26.396 11.537-38.05 18.585a12.138 12.138 0 0 1-6.28 1.777H54a6 6 0 0 0-6 6v340a6 6 0 0 0 6 6h340a6 6 0 0 0 6-6v-25.966c0-5.37 3.579-10.059 8.74-11.541z\"]\n};\nvar faSmile = {\n prefix: 'far',\n iconName: 'smile',\n icon: [496, 512, [], \"f118\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm4 72.6c-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.7-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8-10.1-8.4-25.3-7.1-33.8 3.1z\"]\n};\nvar faSmileBeam = {\n prefix: 'far',\n iconName: 'smile-beam',\n icon: [496, 512, [], \"f5b8\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm84-143.4c-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.6-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8-10.2-8.4-25.3-7.1-33.8 3.1zM136.5 211c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.4 1.1 7.4-.5 9.3-3.7l9.5-17zM328 152c-23.8 0-52.7 29.3-56 71.4-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4z\"]\n};\nvar faSmileWink = {\n prefix: 'far',\n iconName: 'smile-wink',\n icon: [496, 512, [], \"f4da\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm117.8-146.4c-10.2-8.5-25.3-7.1-33.8 3.1-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.7-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8zM168 240c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-60c-25.7 0-55.9 16.9-59.9 42.1-1.7 11.2 11.5 18.2 19.8 10.8l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c8.5 7.4 21.6.3 19.8-10.8-3.8-25.2-34-42.1-59.7-42.1z\"]\n};\nvar faSnowflake = {\n prefix: 'far',\n iconName: 'snowflake',\n icon: [448, 512, [], \"f2dc\", \"M440.1 355.2l-39.2-23 34.1-9.3c8.4-2.3 13.4-11.1 11.1-19.6l-4.1-15.5c-2.2-8.5-10.9-13.6-19.3-11.3L343 298.2 271.2 256l71.9-42.2 79.7 21.7c8.4 2.3 17-2.8 19.3-11.3l4.1-15.5c2.2-8.5-2.7-17.3-11.1-19.6l-34.1-9.3 39.2-23c7.5-4.4 10.1-14.2 5.8-21.9l-7.9-13.9c-4.3-7.7-14-10.3-21.5-5.9l-39.2 23 9.1-34.7c2.2-8.5-2.7-17.3-11.1-19.6l-15.2-4.1c-8.4-2.3-17 2.8-19.3 11.3l-21.3 81-71.9 42.2v-84.5L306 70.4c6.1-6.2 6.1-16.4 0-22.6l-11.1-11.3c-6.1-6.2-16.1-6.2-22.2 0l-24.9 25.4V16c0-8.8-7-16-15.7-16h-15.7c-8.7 0-15.7 7.2-15.7 16v46.1l-24.9-25.4c-6.1-6.2-16.1-6.2-22.2 0L142.1 48c-6.1 6.2-6.1 16.4 0 22.6l58.3 59.3v84.5l-71.9-42.2-21.3-81c-2.2-8.5-10.9-13.6-19.3-11.3L72.7 84c-8.4 2.3-13.4 11.1-11.1 19.6l9.1 34.7-39.2-23c-7.5-4.4-17.1-1.8-21.5 5.9l-7.9 13.9c-4.3 7.7-1.8 17.4 5.8 21.9l39.2 23-34.1 9.1c-8.4 2.3-13.4 11.1-11.1 19.6L6 224.2c2.2 8.5 10.9 13.6 19.3 11.3l79.7-21.7 71.9 42.2-71.9 42.2-79.7-21.7c-8.4-2.3-17 2.8-19.3 11.3l-4.1 15.5c-2.2 8.5 2.7 17.3 11.1 19.6l34.1 9.3-39.2 23c-7.5 4.4-10.1 14.2-5.8 21.9L10 391c4.3 7.7 14 10.3 21.5 5.9l39.2-23-9.1 34.7c-2.2 8.5 2.7 17.3 11.1 19.6l15.2 4.1c8.4 2.3 17-2.8 19.3-11.3l21.3-81 71.9-42.2v84.5l-58.3 59.3c-6.1 6.2-6.1 16.4 0 22.6l11.1 11.3c6.1 6.2 16.1 6.2 22.2 0l24.9-25.4V496c0 8.8 7 16 15.7 16h15.7c8.7 0 15.7-7.2 15.7-16v-46.1l24.9 25.4c6.1 6.2 16.1 6.2 22.2 0l11.1-11.3c6.1-6.2 6.1-16.4 0-22.6l-58.3-59.3v-84.5l71.9 42.2 21.3 81c2.2 8.5 10.9 13.6 19.3 11.3L375 428c8.4-2.3 13.4-11.1 11.1-19.6l-9.1-34.7 39.2 23c7.5 4.4 17.1 1.8 21.5-5.9l7.9-13.9c4.6-7.5 2.1-17.3-5.5-21.7z\"]\n};\nvar faSquare = {\n prefix: 'far',\n iconName: 'square',\n icon: [448, 512, [], \"f0c8\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-6 400H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h340c3.3 0 6 2.7 6 6v340c0 3.3-2.7 6-6 6z\"]\n};\nvar faStar = {\n prefix: 'far',\n iconName: 'star',\n icon: [576, 512, [], \"f005\", \"M528.1 171.5L382 150.2 316.7 17.8c-11.7-23.6-45.6-23.9-57.4 0L194 150.2 47.9 171.5c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.3 23.2 46 46.4 33.7L288 439.6l130.7 68.7c23.2 12.2 50.9-7.4 46.4-33.7l-25-145.5 105.7-103c19-18.5 8.5-50.8-17.7-54.6zM388.6 312.3l23.7 138.4L288 385.4l-124.3 65.3 23.7-138.4-100.6-98 139-20.2 62.2-126 62.2 126 139 20.2-100.6 98z\"]\n};\nvar faStarHalf = {\n prefix: 'far',\n iconName: 'star-half',\n icon: [576, 512, [], \"f089\", \"M288 385.3l-124.3 65.4 23.7-138.4-100.6-98 139-20.2 62.2-126V0c-11.4 0-22.8 5.9-28.7 17.8L194 150.2 47.9 171.4c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.1 23 46 46.4 33.7L288 439.6v-54.3z\"]\n};\nvar faStickyNote = {\n prefix: 'far',\n iconName: 'sticky-note',\n icon: [448, 512, [], \"f249\", \"M448 348.106V80c0-26.51-21.49-48-48-48H48C21.49 32 0 53.49 0 80v351.988c0 26.51 21.49 48 48 48h268.118a48 48 0 0 0 33.941-14.059l83.882-83.882A48 48 0 0 0 448 348.106zm-128 80v-76.118h76.118L320 428.106zM400 80v223.988H296c-13.255 0-24 10.745-24 24v104H48V80h352z\"]\n};\nvar faStopCircle = {\n prefix: 'far',\n iconName: 'stop-circle',\n icon: [512, 512, [], \"f28d\", \"M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm296-80v160c0 8.8-7.2 16-16 16H176c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h160c8.8 0 16 7.2 16 16z\"]\n};\nvar faSun = {\n prefix: 'far',\n iconName: 'sun',\n icon: [512, 512, [], \"f185\", \"M494.2 221.9l-59.8-40.5 13.7-71c2.6-13.2-1.6-26.8-11.1-36.4-9.6-9.5-23.2-13.7-36.2-11.1l-70.9 13.7-40.4-59.9c-15.1-22.3-51.9-22.3-67 0l-40.4 59.9-70.8-13.7C98 60.4 84.5 64.5 75 74.1c-9.5 9.6-13.7 23.1-11.1 36.3l13.7 71-59.8 40.5C6.6 229.5 0 242 0 255.5s6.7 26 17.8 33.5l59.8 40.5-13.7 71c-2.6 13.2 1.6 26.8 11.1 36.3 9.5 9.5 22.9 13.7 36.3 11.1l70.8-13.7 40.4 59.9C230 505.3 242.6 512 256 512s26-6.7 33.5-17.8l40.4-59.9 70.9 13.7c13.4 2.7 26.8-1.6 36.3-11.1 9.5-9.5 13.6-23.1 11.1-36.3l-13.7-71 59.8-40.5c11.1-7.5 17.8-20.1 17.8-33.5-.1-13.6-6.7-26.1-17.9-33.7zm-112.9 85.6l17.6 91.2-91-17.6L256 458l-51.9-77-90.9 17.6 17.6-91.2-76.8-52 76.8-52-17.6-91.2 91 17.6L256 53l51.9 76.9 91-17.6-17.6 91.1 76.8 52-76.8 52.1zM256 152c-57.3 0-104 46.7-104 104s46.7 104 104 104 104-46.7 104-104-46.7-104-104-104zm0 160c-30.9 0-56-25.1-56-56s25.1-56 56-56 56 25.1 56 56-25.1 56-56 56z\"]\n};\nvar faSurprise = {\n prefix: 'far',\n iconName: 'surprise',\n icon: [496, 512, [], \"f5c2\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm0-176c-35.3 0-64 28.7-64 64s28.7 64 64 64 64-28.7 64-64-28.7-64-64-64zm-48-72c0-17.7-14.3-32-32-32s-32 14.3-32 32 14.3 32 32 32 32-14.3 32-32zm128-32c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"]\n};\nvar faThumbsDown = {\n prefix: 'far',\n iconName: 'thumbs-down',\n icon: [512, 512, [], \"f165\", \"M466.27 225.31c4.674-22.647.864-44.538-8.99-62.99 2.958-23.868-4.021-48.565-17.34-66.99C438.986 39.423 404.117 0 327 0c-7 0-15 .01-22.22.01C201.195.01 168.997 40 128 40h-10.845c-5.64-4.975-13.042-8-21.155-8H32C14.327 32 0 46.327 0 64v240c0 17.673 14.327 32 32 32h64c11.842 0 22.175-6.438 27.708-16h7.052c19.146 16.953 46.013 60.653 68.76 83.4 13.667 13.667 10.153 108.6 71.76 108.6 57.58 0 95.27-31.936 95.27-104.73 0-18.41-3.93-33.73-8.85-46.54h36.48c48.602 0 85.82-41.565 85.82-85.58 0-19.15-4.96-34.99-13.73-49.84zM64 296c-13.255 0-24-10.745-24-24s10.745-24 24-24 24 10.745 24 24-10.745 24-24 24zm330.18 16.73H290.19c0 37.82 28.36 55.37 28.36 94.54 0 23.75 0 56.73-47.27 56.73-18.91-18.91-9.46-66.18-37.82-94.54C206.9 342.89 167.28 272 138.92 272H128V85.83c53.611 0 100.001-37.82 171.64-37.82h37.82c35.512 0 60.82 17.12 53.12 65.9 15.2 8.16 26.5 36.44 13.94 57.57 21.581 20.384 18.699 51.065 5.21 65.62 9.45 0 22.36 18.91 22.27 37.81-.09 18.91-16.71 37.82-37.82 37.82z\"]\n};\nvar faThumbsUp = {\n prefix: 'far',\n iconName: 'thumbs-up',\n icon: [512, 512, [], \"f164\", \"M466.27 286.69C475.04 271.84 480 256 480 236.85c0-44.015-37.218-85.58-85.82-85.58H357.7c4.92-12.81 8.85-28.13 8.85-46.54C366.55 31.936 328.86 0 271.28 0c-61.607 0-58.093 94.933-71.76 108.6-22.747 22.747-49.615 66.447-68.76 83.4H32c-17.673 0-32 14.327-32 32v240c0 17.673 14.327 32 32 32h64c14.893 0 27.408-10.174 30.978-23.95 44.509 1.001 75.06 39.94 177.802 39.94 7.22 0 15.22.01 22.22.01 77.117 0 111.986-39.423 112.94-95.33 13.319-18.425 20.299-43.122 17.34-66.99 9.854-18.452 13.664-40.343 8.99-62.99zm-61.75 53.83c12.56 21.13 1.26 49.41-13.94 57.57 7.7 48.78-17.608 65.9-53.12 65.9h-37.82c-71.639 0-118.029-37.82-171.64-37.82V240h10.92c28.36 0 67.98-70.89 94.54-97.46 28.36-28.36 18.91-75.63 37.82-94.54 47.27 0 47.27 32.98 47.27 56.73 0 39.17-28.36 56.72-28.36 94.54h103.99c21.11 0 37.73 18.91 37.82 37.82.09 18.9-12.82 37.81-22.27 37.81 13.489 14.555 16.371 45.236-5.21 65.62zM88 432c0 13.255-10.745 24-24 24s-24-10.745-24-24 10.745-24 24-24 24 10.745 24 24z\"]\n};\nvar faTimesCircle = {\n prefix: 'far',\n iconName: 'times-circle',\n icon: [512, 512, [], \"f057\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm101.8-262.2L295.6 256l62.2 62.2c4.7 4.7 4.7 12.3 0 17l-22.6 22.6c-4.7 4.7-12.3 4.7-17 0L256 295.6l-62.2 62.2c-4.7 4.7-12.3 4.7-17 0l-22.6-22.6c-4.7-4.7-4.7-12.3 0-17l62.2-62.2-62.2-62.2c-4.7-4.7-4.7-12.3 0-17l22.6-22.6c4.7-4.7 12.3-4.7 17 0l62.2 62.2 62.2-62.2c4.7-4.7 12.3-4.7 17 0l22.6 22.6c4.7 4.7 4.7 12.3 0 17z\"]\n};\nvar faTired = {\n prefix: 'far',\n iconName: 'tired',\n icon: [496, 512, [], \"f5c8\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm129.1-303.8c-3.8-4.4-10.3-5.4-15.3-2.5l-80 48c-3.6 2.2-5.8 6.1-5.8 10.3s2.2 8.1 5.8 10.3l80 48c5.4 3.2 11.8 1.6 15.3-2.5 3.8-4.5 3.9-11 .1-15.5L343.6 208l33.6-40.3c3.8-4.5 3.7-11.1-.1-15.5zM220 208c0-4.2-2.2-8.1-5.8-10.3l-80-48c-5-3-11.5-1.9-15.3 2.5-3.8 4.5-3.9 11-.1 15.5l33.6 40.3-33.6 40.3c-3.8 4.5-3.7 11 .1 15.5 3.5 4.1 9.9 5.7 15.3 2.5l80-48c3.6-2.2 5.8-6.1 5.8-10.3zm28 64c-45.4 0-100.9 38.3-107.8 93.3-1.5 11.8 6.9 21.6 15.5 17.9C178.4 373.5 212 368 248 368s69.6 5.5 92.3 15.2c8.5 3.7 17-6 15.5-17.9-6.9-55-62.4-93.3-107.8-93.3z\"]\n};\nvar faTrashAlt = {\n prefix: 'far',\n iconName: 'trash-alt',\n icon: [448, 512, [], \"f2ed\", \"M268 416h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12zM432 80h-82.41l-34-56.7A48 48 0 0 0 274.41 0H173.59a48 48 0 0 0-41.16 23.3L98.41 80H16A16 16 0 0 0 0 96v16a16 16 0 0 0 16 16h16v336a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128h16a16 16 0 0 0 16-16V96a16 16 0 0 0-16-16zM171.84 50.91A6 6 0 0 1 177 48h94a6 6 0 0 1 5.15 2.91L293.61 80H154.39zM368 464H80V128h288zm-212-48h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12z\"]\n};\nvar faUser = {\n prefix: 'far',\n iconName: 'user',\n icon: [448, 512, [], \"f007\", \"M313.6 304c-28.7 0-42.5 16-89.6 16-47.1 0-60.8-16-89.6-16C60.2 304 0 364.2 0 438.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-25.6c0-74.2-60.2-134.4-134.4-134.4zM400 464H48v-25.6c0-47.6 38.8-86.4 86.4-86.4 14.6 0 38.3 16 89.6 16 51.7 0 74.9-16 89.6-16 47.6 0 86.4 38.8 86.4 86.4V464zM224 288c79.5 0 144-64.5 144-144S303.5 0 224 0 80 64.5 80 144s64.5 144 144 144zm0-240c52.9 0 96 43.1 96 96s-43.1 96-96 96-96-43.1-96-96 43.1-96 96-96z\"]\n};\nvar faUserCircle = {\n prefix: 'far',\n iconName: 'user-circle',\n icon: [496, 512, [], \"f2bd\", \"M248 104c-53 0-96 43-96 96s43 96 96 96 96-43 96-96-43-96-96-96zm0 144c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-240C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-49.7 0-95.1-18.3-130.1-48.4 14.9-23 40.4-38.6 69.6-39.5 20.8 6.4 40.6 9.6 60.5 9.6s39.7-3.1 60.5-9.6c29.2 1 54.7 16.5 69.6 39.5-35 30.1-80.4 48.4-130.1 48.4zm162.7-84.1c-24.4-31.4-62.1-51.9-105.1-51.9-10.2 0-26 9.6-57.6 9.6-31.5 0-47.4-9.6-57.6-9.6-42.9 0-80.6 20.5-105.1 51.9C61.9 339.2 48 299.2 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 43.2-13.9 83.2-37.3 115.9z\"]\n};\nvar faWindowClose = {\n prefix: 'far',\n iconName: 'window-close',\n icon: [512, 512, [], \"f410\", \"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 394c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h404c3.3 0 6 2.7 6 6v340zM356.5 194.6L295.1 256l61.4 61.4c4.6 4.6 4.6 12.1 0 16.8l-22.3 22.3c-4.6 4.6-12.1 4.6-16.8 0L256 295.1l-61.4 61.4c-4.6 4.6-12.1 4.6-16.8 0l-22.3-22.3c-4.6-4.6-4.6-12.1 0-16.8l61.4-61.4-61.4-61.4c-4.6-4.6-4.6-12.1 0-16.8l22.3-22.3c4.6-4.6 12.1-4.6 16.8 0l61.4 61.4 61.4-61.4c4.6-4.6 12.1-4.6 16.8 0l22.3 22.3c4.7 4.6 4.7 12.1 0 16.8z\"]\n};\nvar faWindowMaximize = {\n prefix: 'far',\n iconName: 'window-maximize',\n icon: [512, 512, [], \"f2d0\", \"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 394c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V192h416v234z\"]\n};\nvar faWindowMinimize = {\n prefix: 'far',\n iconName: 'window-minimize',\n icon: [512, 512, [], \"f2d1\", \"M480 480H32c-17.7 0-32-14.3-32-32s14.3-32 32-32h448c17.7 0 32 14.3 32 32s-14.3 32-32 32z\"]\n};\nvar faWindowRestore = {\n prefix: 'far',\n iconName: 'window-restore',\n icon: [512, 512, [], \"f2d2\", \"M464 0H144c-26.5 0-48 21.5-48 48v48H48c-26.5 0-48 21.5-48 48v320c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h48c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm-96 464H48V256h320v208zm96-96h-48V144c0-26.5-21.5-48-48-48H144V48h320v320z\"]\n};\nvar _iconsCache = {\n faAddressBook: faAddressBook,\n faAddressCard: faAddressCard,\n faAngry: faAngry,\n faArrowAltCircleDown: faArrowAltCircleDown,\n faArrowAltCircleLeft: faArrowAltCircleLeft,\n faArrowAltCircleRight: faArrowAltCircleRight,\n faArrowAltCircleUp: faArrowAltCircleUp,\n faBell: faBell,\n faBellSlash: faBellSlash,\n faBookmark: faBookmark,\n faBuilding: faBuilding,\n faCalendar: faCalendar,\n faCalendarAlt: faCalendarAlt,\n faCalendarCheck: faCalendarCheck,\n faCalendarMinus: faCalendarMinus,\n faCalendarPlus: faCalendarPlus,\n faCalendarTimes: faCalendarTimes,\n faCaretSquareDown: faCaretSquareDown,\n faCaretSquareLeft: faCaretSquareLeft,\n faCaretSquareRight: faCaretSquareRight,\n faCaretSquareUp: faCaretSquareUp,\n faChartBar: faChartBar,\n faCheckCircle: faCheckCircle,\n faCheckSquare: faCheckSquare,\n faCircle: faCircle,\n faClipboard: faClipboard,\n faClock: faClock,\n faClone: faClone,\n faClosedCaptioning: faClosedCaptioning,\n faComment: faComment,\n faCommentAlt: faCommentAlt,\n faCommentDots: faCommentDots,\n faComments: faComments,\n faCompass: faCompass,\n faCopy: faCopy,\n faCopyright: faCopyright,\n faCreditCard: faCreditCard,\n faDizzy: faDizzy,\n faDotCircle: faDotCircle,\n faEdit: faEdit,\n faEnvelope: faEnvelope,\n faEnvelopeOpen: faEnvelopeOpen,\n faEye: faEye,\n faEyeSlash: faEyeSlash,\n faFile: faFile,\n faFileAlt: faFileAlt,\n faFileArchive: faFileArchive,\n faFileAudio: faFileAudio,\n faFileCode: faFileCode,\n faFileExcel: faFileExcel,\n faFileImage: faFileImage,\n faFilePdf: faFilePdf,\n faFilePowerpoint: faFilePowerpoint,\n faFileVideo: faFileVideo,\n faFileWord: faFileWord,\n faFlag: faFlag,\n faFlushed: faFlushed,\n faFolder: faFolder,\n faFolderOpen: faFolderOpen,\n faFontAwesomeLogoFull: faFontAwesomeLogoFull,\n faFrown: faFrown,\n faFrownOpen: faFrownOpen,\n faFutbol: faFutbol,\n faGem: faGem,\n faGrimace: faGrimace,\n faGrin: faGrin,\n faGrinAlt: faGrinAlt,\n faGrinBeam: faGrinBeam,\n faGrinBeamSweat: faGrinBeamSweat,\n faGrinHearts: faGrinHearts,\n faGrinSquint: faGrinSquint,\n faGrinSquintTears: faGrinSquintTears,\n faGrinStars: faGrinStars,\n faGrinTears: faGrinTears,\n faGrinTongue: faGrinTongue,\n faGrinTongueSquint: faGrinTongueSquint,\n faGrinTongueWink: faGrinTongueWink,\n faGrinWink: faGrinWink,\n faHandLizard: faHandLizard,\n faHandPaper: faHandPaper,\n faHandPeace: faHandPeace,\n faHandPointDown: faHandPointDown,\n faHandPointLeft: faHandPointLeft,\n faHandPointRight: faHandPointRight,\n faHandPointUp: faHandPointUp,\n faHandPointer: faHandPointer,\n faHandRock: faHandRock,\n faHandScissors: faHandScissors,\n faHandSpock: faHandSpock,\n faHandshake: faHandshake,\n faHdd: faHdd,\n faHeart: faHeart,\n faHospital: faHospital,\n faHourglass: faHourglass,\n faIdBadge: faIdBadge,\n faIdCard: faIdCard,\n faImage: faImage,\n faImages: faImages,\n faKeyboard: faKeyboard,\n faKiss: faKiss,\n faKissBeam: faKissBeam,\n faKissWinkHeart: faKissWinkHeart,\n faLaugh: faLaugh,\n faLaughBeam: faLaughBeam,\n faLaughSquint: faLaughSquint,\n faLaughWink: faLaughWink,\n faLemon: faLemon,\n faLifeRing: faLifeRing,\n faLightbulb: faLightbulb,\n faListAlt: faListAlt,\n faMap: faMap,\n faMeh: faMeh,\n faMehBlank: faMehBlank,\n faMehRollingEyes: faMehRollingEyes,\n faMinusSquare: faMinusSquare,\n faMoneyBillAlt: faMoneyBillAlt,\n faMoon: faMoon,\n faNewspaper: faNewspaper,\n faObjectGroup: faObjectGroup,\n faObjectUngroup: faObjectUngroup,\n faPaperPlane: faPaperPlane,\n faPauseCircle: faPauseCircle,\n faPlayCircle: faPlayCircle,\n faPlusSquare: faPlusSquare,\n faQuestionCircle: faQuestionCircle,\n faRegistered: faRegistered,\n faSadCry: faSadCry,\n faSadTear: faSadTear,\n faSave: faSave,\n faShareSquare: faShareSquare,\n faSmile: faSmile,\n faSmileBeam: faSmileBeam,\n faSmileWink: faSmileWink,\n faSnowflake: faSnowflake,\n faSquare: faSquare,\n faStar: faStar,\n faStarHalf: faStarHalf,\n faStickyNote: faStickyNote,\n faStopCircle: faStopCircle,\n faSun: faSun,\n faSurprise: faSurprise,\n faThumbsDown: faThumbsDown,\n faThumbsUp: faThumbsUp,\n faTimesCircle: faTimesCircle,\n faTired: faTired,\n faTrashAlt: faTrashAlt,\n faUser: faUser,\n faUserCircle: faUserCircle,\n faWindowClose: faWindowClose,\n faWindowMaximize: faWindowMaximize,\n faWindowMinimize: faWindowMinimize,\n faWindowRestore: faWindowRestore\n};\n\nexport { _iconsCache as far, prefix, faAddressBook, faAddressCard, faAngry, faArrowAltCircleDown, faArrowAltCircleLeft, faArrowAltCircleRight, faArrowAltCircleUp, faBell, faBellSlash, faBookmark, faBuilding, faCalendar, faCalendarAlt, faCalendarCheck, faCalendarMinus, faCalendarPlus, faCalendarTimes, faCaretSquareDown, faCaretSquareLeft, faCaretSquareRight, faCaretSquareUp, faChartBar, faCheckCircle, faCheckSquare, faCircle, faClipboard, faClock, faClone, faClosedCaptioning, faComment, faCommentAlt, faCommentDots, faComments, faCompass, faCopy, faCopyright, faCreditCard, faDizzy, faDotCircle, faEdit, faEnvelope, faEnvelopeOpen, faEye, faEyeSlash, faFile, faFileAlt, faFileArchive, faFileAudio, faFileCode, faFileExcel, faFileImage, faFilePdf, faFilePowerpoint, faFileVideo, faFileWord, faFlag, faFlushed, faFolder, faFolderOpen, faFontAwesomeLogoFull, faFrown, faFrownOpen, faFutbol, faGem, faGrimace, faGrin, faGrinAlt, faGrinBeam, faGrinBeamSweat, faGrinHearts, faGrinSquint, faGrinSquintTears, faGrinStars, faGrinTears, faGrinTongue, faGrinTongueSquint, faGrinTongueWink, faGrinWink, faHandLizard, faHandPaper, faHandPeace, faHandPointDown, faHandPointLeft, faHandPointRight, faHandPointUp, faHandPointer, faHandRock, faHandScissors, faHandSpock, faHandshake, faHdd, faHeart, faHospital, faHourglass, faIdBadge, faIdCard, faImage, faImages, faKeyboard, faKiss, faKissBeam, faKissWinkHeart, faLaugh, faLaughBeam, faLaughSquint, faLaughWink, faLemon, faLifeRing, faLightbulb, faListAlt, faMap, faMeh, faMehBlank, faMehRollingEyes, faMinusSquare, faMoneyBillAlt, faMoon, faNewspaper, faObjectGroup, faObjectUngroup, faPaperPlane, faPauseCircle, faPlayCircle, faPlusSquare, faQuestionCircle, faRegistered, faSadCry, faSadTear, faSave, faShareSquare, faSmile, faSmileBeam, faSmileWink, faSnowflake, faSquare, faStar, faStarHalf, faStickyNote, faStopCircle, faSun, faSurprise, faThumbsDown, faThumbsUp, faTimesCircle, faTired, faTrashAlt, faUser, faUserCircle, faWindowClose, faWindowMaximize, faWindowMinimize, faWindowRestore };\n","import React, {Component} from 'react'; // eslint-disable-line no-unused-vars\nimport PropTypes from 'prop-types';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faCopy, faCheckCircle} from '@fortawesome/free-regular-svg-icons';\n\nimport LoadingElement from '../utils/LoadingElement';\n\nconst clipboardAPI = navigator.clipboard;\n\nfunction wait(ms) {\n return new Promise(r => setTimeout(r, ms));\n}\n\n/**\n * The Clipboard component copies text to the clipboard\n */\n\nexport default class Clipboard extends React.Component {\n static contextType = window.dash_component_api.DashContext;\n\n constructor(props) {\n super(props);\n this.copyToClipboard = this.copyToClipboard.bind(this);\n this.onClickHandler = this.onClickHandler.bind(this);\n this.copySuccess = this.copySuccess.bind(this);\n this.getTargetText = this.getTargetText.bind(this);\n this.loading = this.loading.bind(this);\n this.stringifyId = this.stringifyId.bind(this);\n this.state = {\n copied: false,\n };\n }\n\n onClickHandler() {\n this.props.setProps({n_clicks: this.props.n_clicks + 1});\n }\n\n componentDidUpdate(prevProps) {\n // If the clicks has not changed, do nothing\n if (\n !this.props.n_clicks ||\n this.props.n_clicks === prevProps.n_clicks\n ) {\n return;\n }\n // If the clicks has changed, copy to clipboard\n this.copyToClipboard();\n }\n\n // stringifies object ids used in pattern matching callbacks\n stringifyId(id) {\n if (typeof id !== 'object') {\n return id;\n }\n const stringifyVal = v => (v && v.wild) || JSON.stringify(v);\n const parts = Object.keys(id)\n .sort()\n .map(k => JSON.stringify(k) + ':' + stringifyVal(id[k]));\n return '{' + parts.join(',') + '}';\n }\n\n async copySuccess(content, htmlContent) {\n const showCopiedIcon = 1000;\n if (htmlContent) {\n const blobHtml = new Blob([htmlContent], {type: 'text/html'});\n const blobText = new Blob([content ?? htmlContent], {\n type: 'text/plain',\n });\n const data = [\n new ClipboardItem({\n ['text/plain']: blobText,\n ['text/html']: blobHtml,\n }),\n ];\n await navigator.clipboard.write(data);\n } else {\n await clipboardAPI.writeText(content);\n }\n this.setState({copied: true});\n await wait(showCopiedIcon);\n this.setState({copied: false});\n }\n\n getTargetText() {\n // get the inner text. If none, use the content of the value param\n const id = this.stringifyId(this.props.target_id);\n const target = document.getElementById(id);\n if (!target) {\n throw new Error(\n 'Clipboard copy failed: no element found for target_id ' +\n this.props.target_id\n );\n }\n let content = target.innerText;\n if (!content) {\n content = target.value;\n content = content === undefined ? null : content;\n }\n return content;\n }\n\n async loading() {\n while (this.context.isLoading()) {\n await wait(100);\n }\n }\n\n async copyToClipboard() {\n let content;\n let htmlContent;\n if (this.props.target_id) {\n content = this.getTargetText();\n } else {\n await wait(100); // gives time for callback to start\n await this.loading();\n content = this.props.content;\n htmlContent = this.props.html_content;\n }\n if (content || htmlContent) {\n this.copySuccess(content, htmlContent);\n }\n }\n\n componentDidMount() {\n if (!clipboardAPI) {\n console.warn('Copy to clipboard not available with this browser'); // eslint-disable-line no-console\n }\n }\n\n render() {\n const {id, title, className, style, children, copied_children} =\n this.props;\n\n const isCopied = this.state.copied;\n\n const button_children = isCopied\n ? copied_children ?? \n : children ?? ;\n\n return clipboardAPI ? (\n \n {button_children}\n \n ) : null;\n }\n}\n\nClipboard.defaultProps = {\n content: null,\n html_content: null,\n target_id: null,\n n_clicks: 0,\n};\n\nClipboard.propTypes = {\n /**\n * The ID used to identify this component.\n */\n id: PropTypes.string,\n\n /**\n * Children rendered inside the Clipboard button before copying. By default, a copy icon.\n */\n children: PropTypes.node,\n\n /**\n * Children rendered inside the Clipboard button after the value has been copied. By default, a check icon.\n */\n copied_children: PropTypes.node,\n\n /**\n * The id of target component containing text to copy to the clipboard.\n * The inner text of the `children` prop will be copied to the clipboard. If none, then the text from the\n * `value` prop will be copied.\n */\n target_id: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n\n /**\n * The text to be copied to the clipboard if the `target_id` is None.\n */\n content: PropTypes.string,\n\n /**\n * The number of times Clipboard button was clicked\n */\n n_clicks: PropTypes.number,\n\n /**\n * The clipboard html text be copied to the clipboard if the `target_id` is None.\n */\n html_content: PropTypes.string,\n\n /**\n * The text shown as a tooltip when hovering over the copy icon.\n */\n title: PropTypes.string,\n\n /**\n * The icon's styles\n */\n style: PropTypes.object,\n\n /**\n * The class name of the icon element\n */\n className: PropTypes.string,\n\n /**\n * Dash-assigned callback that gets fired when the value changes.\n */\n setProps: PropTypes.func,\n};\n","import PropTypes from 'prop-types';\nimport {Component} from 'react';\n\n/**\n * ConfirmDialog is used to display the browser's native \"confirm\" modal,\n * with an optional message and two buttons (\"OK\" and \"Cancel\").\n * This ConfirmDialog can be used in conjunction with buttons when the user\n * is performing an action that should require an extra step of verification.\n */\nexport default class ConfirmDialog extends Component {\n componentDidUpdate(prevProps) {\n this._update(!prevProps.displayed && this.props.displayed);\n }\n\n componentDidMount() {\n this._update(this.props.displayed);\n }\n\n _update(shouldTriggerDisplay) {\n const {message, setProps, cancel_n_clicks, submit_n_clicks} =\n this.props;\n\n if (shouldTriggerDisplay) {\n new Promise(resolve => resolve(window.confirm(message))).then(\n result => {\n if (result) {\n setProps({\n submit_n_clicks: submit_n_clicks + 1,\n submit_n_clicks_timestamp: Date.now(),\n displayed: false,\n });\n } else {\n setProps({\n cancel_n_clicks: cancel_n_clicks + 1,\n cancel_n_clicks_timestamp: Date.now(),\n displayed: false,\n });\n }\n }\n );\n }\n }\n\n render() {\n return null;\n }\n}\n\nConfirmDialog.defaultProps = {\n submit_n_clicks: 0,\n submit_n_clicks_timestamp: -1,\n cancel_n_clicks: 0,\n cancel_n_clicks_timestamp: -1,\n};\n\nConfirmDialog.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string,\n\n /**\n * Message to show in the popup.\n */\n message: PropTypes.string,\n /**\n * Number of times the submit button was clicked\n */\n submit_n_clicks: PropTypes.number,\n /**\n * Last time the submit button was clicked.\n */\n submit_n_clicks_timestamp: PropTypes.number,\n /**\n * Number of times the popup was canceled.\n */\n cancel_n_clicks: PropTypes.number,\n /**\n * Last time the cancel button was clicked.\n */\n cancel_n_clicks_timestamp: PropTypes.number,\n /**\n * Set to true to send the ConfirmDialog.\n */\n displayed: PropTypes.bool,\n\n /**\n * Dash-assigned callback that gets fired when the value changes.\n */\n setProps: PropTypes.func,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport ConfirmDialog from './ConfirmDialog.react';\nimport LoadingElement from '../utils/LoadingElement';\n\n/**\n * A wrapper component that will display a confirmation dialog\n * when its child component has been clicked on.\n *\n * For example:\n * ```\n * dcc.ConfirmDialogProvider(\n * html.Button('click me', id='btn'),\n * message='Danger - Are you sure you want to continue.'\n * id='confirm')\n * ```\n */\nexport default class ConfirmDialogProvider extends React.Component {\n render() {\n const {displayed, id, setProps, children} = this.props;\n\n // Will lose the previous onClick of the child\n const wrapClick = child =>\n React.cloneElement(child, {\n onClick: () => setProps({displayed: true}),\n });\n\n return (\n \n {Array.isArray(children)\n ? children.map(wrapClick)\n : wrapClick(children)}\n \n \n );\n }\n}\n\nConfirmDialogProvider.defaultProps = {\n submit_n_clicks: 0,\n submit_n_clicks_timestamp: -1,\n cancel_n_clicks: 0,\n cancel_n_clicks_timestamp: -1,\n};\n\nConfirmDialogProvider.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string,\n\n /**\n * Message to show in the popup.\n */\n message: PropTypes.string,\n /**\n * Number of times the submit was clicked\n */\n submit_n_clicks: PropTypes.number,\n /**\n * Last time the submit button was clicked.\n */\n submit_n_clicks_timestamp: PropTypes.number,\n /**\n * Number of times the popup was canceled.\n */\n cancel_n_clicks: PropTypes.number,\n /**\n * Last time the cancel button was clicked.\n */\n cancel_n_clicks_timestamp: PropTypes.number,\n /**\n * Is the modal currently displayed.\n */\n displayed: PropTypes.bool,\n\n /**\n * Dash-assigned callback that gets fired when the value changes.\n */\n setProps: PropTypes.func,\n /**\n * The children to hijack clicks from and display the popup.\n */\n children: PropTypes.any,\n};\n","export default () =>\n import(\n /* webpackChunkName: \"datepicker\" */ '../../fragments/DatePickerRange'\n );\n","import {format, startOfDay, parseISO} from 'date-fns';\nimport {isNil} from 'ramda';\n\nexport default {\n extract: (propValue?: string) => {\n if (isNil(propValue)) {\n return propValue;\n }\n\n const parsed = parseISO(propValue);\n return format(startOfDay(parsed), 'yyyy-MM-dd');\n },\n apply: (storedValue?: string) => storedValue,\n};\n","import React, {lazy, Suspense} from 'react';\nimport datePickerRange from '../utils/LazyLoader/datePickerRange';\nimport transformDate from '../utils/DatePickerPersistence';\nimport {DatePickerRangeProps, PersistedProps, PersistenceTypes} from '../types';\n\nconst RealDatePickerRange = lazy(datePickerRange);\n\n/**\n * DatePickerRange is designed for selecting a timespan across multiple days off\n * of a calendar.\n *\n * The DatePicker integrates well with the Python datetime module with the\n * startDate and endDate being returned in a string format suitable for\n * creating datetime objects.\n *\n */\nexport default function DatePickerRange({\n calendar_orientation = 'horizontal',\n is_RTL = false,\n // eslint-disable-next-line no-magic-numbers\n day_size = 34,\n with_portal = false,\n with_full_screen_portal = false,\n first_day_of_week = 0,\n number_of_months_shown = 2,\n stay_open_on_select = false,\n reopen_calendar_on_clear = false,\n show_outside_days = false,\n clearable = false,\n disabled = false,\n updatemode = 'singledate',\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.start_date, PersistedProps.end_date],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n disabled_days = [],\n ...props\n}: DatePickerRangeProps) {\n return (\n \n \n \n );\n}\n\nDatePickerRange.dashPersistence = {\n persisted_props: [PersistedProps.start_date, PersistedProps.end_date],\n persistence_type: PersistenceTypes.local,\n};\n\nDatePickerRange.persistenceTransforms = {\n end_date: transformDate,\n start_date: transformDate,\n};\n","export default () =>\n import(\n /* webpackChunkName: \"datepicker\" */ '../../fragments/DatePickerSingle'\n );\n","import React, {lazy, Suspense} from 'react';\nimport datePickerSingle from '../utils/LazyLoader/datePickerSingle';\nimport transformDate from '../utils/DatePickerPersistence';\nimport {\n DatePickerSingleProps,\n PersistedProps,\n PersistenceTypes,\n} from '../types';\n\nconst RealDatePickerSingle = lazy(datePickerSingle);\n\n/**\n * DatePickerSingle is a tailor made component designed for selecting\n * a single day off of a calendar.\n *\n * The DatePicker integrates well with the Python datetime module with the\n * startDate and endDate being returned in a string format suitable for\n * creating datetime objects.\n */\nexport default function DatePickerSingle({\n placeholder = 'Select Date',\n calendar_orientation = 'horizontal',\n is_RTL = false,\n // eslint-disable-next-line no-magic-numbers\n day_size = 34,\n with_portal = false,\n with_full_screen_portal = false,\n show_outside_days = true,\n first_day_of_week = 0,\n number_of_months_shown = 1,\n stay_open_on_select = false,\n reopen_calendar_on_clear = false,\n clearable = false,\n disabled = false,\n disabled_days = [],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.date],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n ...props\n}: DatePickerSingleProps) {\n return (\n \n \n \n );\n}\n\nDatePickerSingle.dashPersistence = {\n persisted_props: [PersistedProps.date],\n persistence_type: PersistenceTypes.local,\n};\n\nDatePickerSingle.persistenceTransforms = {\n date: transformDate,\n};\n","import PropTypes from 'prop-types';\nimport {Component} from 'react';\nimport {toByteArray} from 'base64-js';\nimport {saveAs} from 'file-saver';\n\nconst getValue = (src, fallback, key) =>\n key in src ? src[key] : fallback[key];\n\n/**\n * The Download component opens a download dialog when the data property changes.\n */\nexport default class Download extends Component {\n componentDidUpdate(prevProps) {\n const {data} = this.props;\n // If the data hasn't changed, do nothing.\n if (!data || data === prevProps.data) {\n return;\n }\n // Extract options from data if provided, fallback to props.\n const type = getValue(data, this.props, 'type');\n const base64 = getValue(data, this.props, 'base64');\n // Invoke the download using a Blob.\n const content = base64 ? toByteArray(data.content) : data.content;\n const blob = new Blob([content], {type: type});\n saveAs(blob, data.filename);\n }\n\n render() {\n return null;\n }\n}\n\nDownload.propTypes = {\n /**\n * The ID of this component, used to identify dash components in callbacks.\n */\n id: PropTypes.string,\n\n /**\n * On change, a download is invoked.\n */\n data: PropTypes.exact({\n /**\n * Suggested filename in the download dialogue.\n */\n filename: PropTypes.string.isRequired,\n /**\n * File content.\n */\n content: PropTypes.string.isRequired,\n /**\n * Set to true, when data is base64 encoded.\n */\n base64: PropTypes.bool,\n /**\n * Blob type, usually a MIME-type.\n */\n type: PropTypes.string,\n }),\n\n /**\n * Default value for base64, used when not set as part of the data property.\n */\n base64: PropTypes.bool,\n\n /**\n * Default value for type, used when not set as part of the data property.\n */\n type: PropTypes.string,\n\n /**\n * Dash-supplied function for updating props.\n */\n setProps: PropTypes.func,\n};\n\nDownload.defaultProps = {\n type: 'text/plain',\n base64: false,\n};\n","import {Component} from 'react';\nimport PropTypes from 'prop-types';\n\n/**\n * The CurrentLocation component gets geolocation of the device from the web browser. See more info here:\n * https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API\n */\n\nexport default class Geolocation extends Component {\n constructor(props) {\n super(props);\n this.success = this.success.bind(this);\n this.error = this.error.bind(this);\n }\n updatePosition() {\n if (this.props.update_now) {\n this.props.setProps({\n update_now: false,\n });\n }\n if (!navigator.geolocation) {\n this.error({\n code: 999,\n message: 'Your browser does not support Geolocation',\n });\n } else {\n const positionOptions = {\n enableHighAccuracy: this.props.high_accuracy,\n maximumAge: this.props.maximum_age,\n timeout: this.props.timeout,\n };\n\n navigator.geolocation.getCurrentPosition(\n this.success,\n this.error,\n positionOptions\n );\n }\n }\n\n componentDidMount() {\n this.updatePosition();\n }\n\n componentDidUpdate(prevProps) {\n if (\n this.props.update_now ||\n prevProps.maximum_age !== this.props.maximum_age ||\n prevProps.timeout !== this.props.timeout ||\n prevProps.high_accuracy !== this.props.high_accuracy\n ) {\n this.updatePosition();\n }\n }\n\n success(pos) {\n const crd = pos.coords;\n const position_obj = {\n lat: crd.latitude ?? null,\n lon: crd.longitude ?? null,\n accuracy: crd.accuracy ?? null,\n alt: crd.altitude ?? null,\n alt_accuracy: crd.altitudeAccuracy ?? null,\n speed: crd.speed ?? null,\n heading: crd.heading ?? null,\n };\n\n this.props.setProps({\n local_date: new Date(pos.timestamp).toLocaleString(),\n timestamp: pos.timestamp,\n position: position_obj,\n position_error: null,\n });\n }\n\n error(err) {\n if (this.props.show_alert) {\n alert(`ERROR(${err.code}): ${err.message}`);\n }\n this.props.setProps({\n position: null,\n position_error: {\n code: err.code,\n message: err.message,\n },\n });\n }\n\n render() {\n return null;\n }\n}\n\nGeolocation.defaultProps = {\n update_now: false,\n high_accuracy: false,\n position_error: null,\n maximum_age: 0,\n timeout: Infinity,\n show_alert: false,\n};\n\nGeolocation.propTypes = {\n /**\n * The ID used to identify this component in Dash callbacks.\n */\n id: PropTypes.string,\n\n /**\n * The local date and time when the device position was updated.\n * Format: MM/DD/YYYY, hh:mm:ss p where p is AM or PM\n */\n local_date: PropTypes.string,\n\n /**\n * The Unix timestamp from when the position was updated\n */\n timestamp: PropTypes.number,\n\n /**\n * The position of the device. `lat`, `lon`, and `accuracy` will always be returned. The other data will be included\n * when available, otherwise it will be NaN.\n *\n * `lat` is latitude in degrees.\n * `lon` is longitude in degrees.\n * `accuracy` is the accuracy of the lat/lon in meters. *\n *\n * `alt` is altitude above mean sea level in meters.\n * `alt_accuracy` is the accuracy of the altitude in meters.\n * `heading` is the compass heading in degrees.\n * `speed` is the speed in meters per second.\n *\n */\n position: PropTypes.shape({\n lat: PropTypes.number,\n lon: PropTypes.number,\n accuracy: PropTypes.number,\n alt: PropTypes.number,\n alt_accuracy: PropTypes.number,\n heading: PropTypes.number,\n speed: PropTypes.number,\n }),\n\n /**\n * Position error\n */\n position_error: PropTypes.shape({\n code: PropTypes.number,\n message: PropTypes.string,\n }),\n\n /**\n * If true, error messages will be displayed as an alert\n */\n show_alert: PropTypes.bool,\n\n /**\n * Forces a one-time update of the position data. If set to True in a callback, the browser\n * will update the position data and reset update_now back to False. This can, for example, be used to update the\n * position with a button or an interval timer.\n */\n update_now: PropTypes.bool,\n\n /**\n * If true and if the device is able to provide a more accurate position,\n * it will do so. Note that this can result in slower response times or increased power consumption (with a GPS\n * chip on a mobile device for example). If false (the default value), the device can save resources by\n * responding more quickly and/or using less power.\n */\n high_accuracy: PropTypes.bool,\n\n /**\n * The maximum age in milliseconds of a possible cached position that is acceptable to return. If set to 0,\n * it means that the device cannot use a cached position and must attempt to retrieve the real current position.\n * If set to Infinity the device must return a cached position regardless of its age. Default: 0.\n */\n maximum_age: PropTypes.number,\n\n /**\n * The maximum length of time (in milliseconds) the device is allowed to take in order to return a position.\n * The default value is Infinity, meaning that data will not be return until the position is available.\n */\n timeout: PropTypes.number,\n\n /**\n * Dash-assigned callback that should be called to report property changes\n * to Dash, to make them available for callbacks.\n */\n setProps: PropTypes.func,\n};\n","import PropTypes from 'prop-types';\nimport React, {Component} from 'react'; // eslint-disable-line no-unused-vars\n\n/**\n * A component that repeatedly increments a counter `n_intervals`\n * with a fixed time delay between each increment.\n * Interval is good for triggering a component on a recurring basis.\n * The time delay is set with the property \"interval\" in milliseconds.\n */\nexport default class Interval extends Component {\n constructor(props) {\n super(props);\n this.intervalId = null;\n this.reportInterval = this.reportInterval.bind(this);\n this.handleTimer = this.handleTimer.bind(this);\n }\n\n handleTimer(props) {\n // Check if timer should stop or shouldn't even start\n if (\n props.max_intervals === 0 ||\n props.disabled ||\n (props.n_intervals >= props.max_intervals &&\n props.max_intervals !== -1)\n ) {\n // stop existing timer\n if (this.intervalId) {\n this.clearTimer();\n }\n // and don't start a timer\n return;\n }\n\n // keep the existing timer running\n if (this.intervalId) {\n return;\n }\n\n // it hasn't started yet (& it should start)\n this.intervalId = window.setInterval(\n this.reportInterval,\n props.interval\n );\n }\n\n resetTimer(props) {\n this.clearTimer();\n this.handleTimer(props);\n }\n\n clearTimer() {\n window.clearInterval(this.intervalId);\n this.intervalId = null;\n }\n\n reportInterval() {\n const {setProps, n_intervals} = this.props;\n setProps({n_intervals: n_intervals + 1});\n }\n\n componentDidMount() {\n this.handleTimer(this.props);\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n if (nextProps.interval !== this.props.interval) {\n this.resetTimer(nextProps);\n } else {\n this.handleTimer(nextProps);\n }\n }\n\n componentWillUnmount() {\n this.clearTimer();\n }\n\n render() {\n return null;\n }\n}\n\nInterval.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string,\n /**\n * This component will increment the counter `n_intervals` every\n * `interval` milliseconds\n */\n interval: PropTypes.number,\n\n /**\n * If True, the counter will no longer update\n */\n disabled: PropTypes.bool,\n\n /**\n * Number of times the interval has passed\n */\n n_intervals: PropTypes.number,\n\n /**\n * Number of times the interval will be fired.\n * If -1, then the interval has no limit (the default)\n * and if 0 then the interval stops running.\n */\n max_intervals: PropTypes.number,\n\n /**\n * Dash assigned callback\n */\n setProps: PropTypes.func,\n};\n\nInterval.defaultProps = {\n interval: 1000,\n n_intervals: 0,\n max_intervals: -1,\n};\n","import _curry1 from \"./internal/_curry1.js\";\nimport _has from \"./internal/_has.js\";\n\n/**\n * Converts an object into an array of key, value arrays. Only the object's\n * own properties are used.\n * Note that the order of the output array is not guaranteed to be consistent\n * across different JS platforms.\n *\n * @func\n * @memberOf R\n * @since v0.4.0\n * @category Object\n * @sig {String: *} -> [[String,*]]\n * @param {Object} obj The object to extract from\n * @return {Array} An array of key, value arrays from the object's own properties.\n * @see R.fromPairs, R.keys, R.values\n * @example\n *\n * R.toPairs({a: 1, b: 2, c: 3}); //=> [['a', 1], ['b', 2], ['c', 3]]\n */\nvar toPairs = /*#__PURE__*/_curry1(function toPairs(obj) {\n var pairs = [];\n for (var prop in obj) {\n if (_has(prop, obj)) {\n pairs[pairs.length] = [prop, obj[prop]];\n }\n }\n return pairs;\n});\nexport default toPairs;","import _reduced from \"./_reduced.js\";\nimport _xfBase from \"./_xfBase.js\";\nvar XAny = /*#__PURE__*/function () {\n function XAny(f, xf) {\n this.xf = xf;\n this.f = f;\n this.any = false;\n }\n XAny.prototype['@@transducer/init'] = _xfBase.init;\n XAny.prototype['@@transducer/result'] = function (result) {\n if (!this.any) {\n result = this.xf['@@transducer/step'](result, false);\n }\n return this.xf['@@transducer/result'](result);\n };\n XAny.prototype['@@transducer/step'] = function (result, input) {\n if (this.f(input)) {\n this.any = true;\n result = _reduced(this.xf['@@transducer/step'](result, true));\n }\n return result;\n };\n return XAny;\n}();\nexport default function _xany(f) {\n return function (xf) {\n return new XAny(f, xf);\n };\n}","export default function _reduced(x) {\n return x && x['@@transducer/reduced'] ? x : {\n '@@transducer/value': x,\n '@@transducer/reduced': true\n };\n}","import _curry2 from \"./internal/_curry2.js\";\nimport _dispatchable from \"./internal/_dispatchable.js\";\nimport _xany from \"./internal/_xany.js\";\n\n/**\n * Returns `true` if at least one of the elements of the list match the predicate,\n * `false` otherwise.\n *\n * Dispatches to the `any` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig (a -> Boolean) -> [a] -> Boolean\n * @param {Function} fn The predicate function.\n * @param {Array} list The array to consider.\n * @return {Boolean} `true` if the predicate is satisfied by at least one element, `false`\n * otherwise.\n * @see R.all, R.none, R.transduce\n * @example\n *\n * const lessThan0 = R.flip(R.lt)(0);\n * const lessThan2 = R.flip(R.lt)(2);\n * R.any(lessThan0)([1, 2]); //=> false\n * R.any(lessThan2)([1, 2]); //=> true\n */\nvar any = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['any'], _xany, function any(fn, list) {\n var idx = 0;\n while (idx < list.length) {\n if (fn(list[idx])) {\n return true;\n }\n idx += 1;\n }\n return false;\n}));\nexport default any;","import React from 'react';\nimport {DebugTitleProps} from '../types';\n\nexport default function DebugTitle({id, property}: DebugTitleProps) {\n return (\n

\n Loading #{id}\n 's {property}\n

\n );\n}\n","import React, {useState, useRef, useMemo, useEffect} from 'react';\nimport {equals, concat, includes, toPairs, any} from 'ramda';\n\nimport GraphSpinner from '../fragments/Loading/spinners/GraphSpinner';\nimport DefaultSpinner from '../fragments/Loading/spinners/DefaultSpinner';\nimport CubeSpinner from '../fragments/Loading/spinners/CubeSpinner';\nimport CircleSpinner from '../fragments/Loading/spinners/CircleSpinner';\nimport DotSpinner from '../fragments/Loading/spinners/DotSpinner';\nimport {LoadingProps} from 'src/types';\nimport {DebugTitleProps} from '../fragments/Loading/types';\nimport {DashLayoutPath} from '@dash-renderer/types/component';\n\nconst spinnerComponentOptions = {\n graph: GraphSpinner,\n cube: CubeSpinner,\n circle: CircleSpinner,\n dot: DotSpinner,\n default: DefaultSpinner,\n} as const;\n\nconst getSpinner = (spinnerType: keyof typeof spinnerComponentOptions) =>\n spinnerComponentOptions[spinnerType];\n\nconst coveringSpinner: React.CSSProperties = {\n visibility: 'visible',\n position: 'absolute',\n top: '0',\n height: '100%',\n width: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n};\n\ntype LoadingState = {\n loading: Record;\n};\n\nconst loadingSelector =\n (\n componentPath: DashLayoutPath,\n targetComponents?: Record\n ) =>\n (state: LoadingState): DebugTitleProps[] | null => {\n let stringPath = JSON.stringify(componentPath);\n // Remove the last ] for easy match and add `,` to make sure only children\n // trigger the loading. See issue: https://github.com/plotly/dash/issues/3276\n stringPath = stringPath.substring(0, stringPath.length - 1) + ',';\n const loadingChildren = toPairs(state.loading).reduce(\n (acc, [path, load]) => {\n if (path.startsWith(stringPath) && load.length) {\n if (\n targetComponents &&\n !any((l: DebugTitleProps) => {\n const target = targetComponents[l.id];\n if (!target) {\n return false;\n }\n if (target === '*') {\n return true;\n }\n if (Array.isArray(target)) {\n return includes(l.property, target);\n }\n return l.property === target;\n }, load)\n ) {\n return acc;\n }\n return concat(acc, load);\n }\n return acc;\n },\n [] as DebugTitleProps[]\n );\n if (loadingChildren.length) {\n return loadingChildren;\n }\n return null;\n };\n\nfunction Loading({\n children,\n display = 'auto',\n color = 'var(--Dash-Fill-Interactive-Strong)',\n id,\n className,\n style,\n parent_className,\n parent_style,\n overlay_style,\n fullscreen,\n debug,\n show_initially = true,\n type: spinnerType = 'default',\n delay_hide = 0,\n delay_show = 0,\n target_components,\n custom_spinner,\n}: LoadingProps) {\n const ctx = window.dash_component_api.useDashContext();\n\n const loading = ctx.useSelector(\n loadingSelector(ctx.componentPath, target_components),\n equals\n );\n\n const [showSpinner, setShowSpinner] = useState(show_initially);\n const dismissTimer = useRef();\n const showTimer = useRef();\n\n const containerStyle: React.CSSProperties = useMemo(() => {\n if (showSpinner) {\n return {visibility: 'hidden', ...overlay_style, ...parent_style};\n }\n return parent_style ?? {};\n }, [showSpinner, parent_style]);\n\n useEffect(() => {\n if (display === 'show' || display === 'hide') {\n setShowSpinner(display === 'show');\n return;\n }\n\n if (loading) {\n // if component is currently loading and there's a dismiss timer active\n // we need to clear it.\n if (dismissTimer.current) {\n dismissTimer.current = window.clearTimeout(\n dismissTimer.current\n );\n }\n // if component is currently loading but the spinner is not showing and\n // there is no timer set to show, then set a timeout to show\n if (!showSpinner && !showTimer.current) {\n showTimer.current = window.setTimeout(() => {\n setShowSpinner(true);\n showTimer.current = undefined;\n }, delay_show);\n }\n } else {\n // if component is not currently loading and there's a show timer\n // active we need to clear it\n if (showTimer.current) {\n showTimer.current = window.clearTimeout(showTimer.current);\n }\n // if component is not currently loading and the spinner is showing and\n // there's no timer set to dismiss it, then set a timeout to hide it\n if (showSpinner && !dismissTimer.current) {\n dismissTimer.current = window.setTimeout(() => {\n setShowSpinner(false);\n dismissTimer.current = undefined;\n }, delay_hide);\n }\n }\n }, [delay_hide, delay_show, loading, display, showSpinner]);\n\n const Spinner = getSpinner(spinnerType);\n\n return (\n \n
\n {children}\n
\n
\n {showSpinner &&\n (custom_spinner || (\n \n ))}\n
\n
\n );\n}\n\nexport default Loading;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\nconst GraphSpinner = ({\n status,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n return (\n
\n
\n {debugTitle}\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default GraphSpinner;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\nconst CubeSpinner = ({\n status,\n color,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n /* eslint-disable no-magic-numbers */\n return (\n
\n {debugTitle}\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default CubeSpinner;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\n/**\n * Spinner created by Tobias Ahlin, https://github.com/tobiasahlin/SpinKit\n */\nconst CircleSpinner = ({\n status,\n color,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n return (\n
\n {debugTitle}\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default CircleSpinner;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\n/**\n * Spinner created by Tobias Ahlin, https://github.com/tobiasahlin/SpinKit\n */\nconst DotSpinner = ({\n status,\n color,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n return (\n
\n {debugTitle}\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default DotSpinner;\n","import React from 'react';\nimport DebugTitle from './DebugTitle';\nimport {SpinnerProps} from '../types';\n\n/**\n * Spinner created by Tobias Ahlin, https://github.com/tobiasahlin/SpinKit\n */\nconst DefaultSpinner = ({\n status,\n color,\n fullscreen,\n debug,\n className,\n style,\n}: SpinnerProps) => {\n let debugTitle;\n if (debug && status) {\n debugTitle = status.map((s, i) => );\n }\n let spinnerClass = fullscreen ? 'dash-spinner-container' : '';\n if (className) {\n spinnerClass += ` ${className}`;\n }\n return (\n
\n {debugTitle}\n
\n
\n
\n
\n
\n
\n
\n \n
\n );\n};\n\nexport default DefaultSpinner;\n","import {Component} from 'react';\nimport PropTypes from 'prop-types';\nimport {type} from 'ramda';\n\nimport {History} from '@plotly/dash-component-plugins';\n\n/**\n * Update and track the current window.location object through the window.history state.\n * Use in conjunction with the `dash_core_components.Link` component to make apps with multiple pages.\n */\nexport default class Location extends Component {\n constructor(props) {\n super(props);\n this.updateLocation = this.updateLocation.bind(this);\n this.onLocationChange = this.onLocationChange.bind(this);\n }\n\n updateLocation(props) {\n const {hash, href, pathname, refresh, search, setProps} = props;\n\n // Keep track of props relating to window.location that may need to be updated via setProps\n const propsToSet = {};\n\n /**\n * Check if the field exists in props. If the prop with \"fieldName\" is not defined,\n * then it was not set by the user and needs to be equal to the value in window.location.\n * This only happens on page load (since props will no longer be undefined after componentDidMount).\n *\n * @param {string} fieldName\n * The name of the prop in window.location and in the component's prop\n *\n * @returns {boolean}\n * Returns true if the prop with fieldName is different and the window state needs to be updated\n */\n const checkExistsUpdateWindowLocation = fieldName => {\n const propVal = props[fieldName];\n\n if (\n (type(propVal) === 'Undefined' || propVal === null) &&\n type(window.location[fieldName]) !== 'Undefined'\n ) {\n // propVal is undefined or null, but window.location has this fieldName defined\n propsToSet[fieldName] = window.location[fieldName];\n } else if (propVal !== window.location[fieldName]) {\n // Prop has changed?\n if (refresh === true) {\n // Refresh the page?\n window.location[fieldName] = propVal;\n } else if (this.props[fieldName] !== propVal) {\n // If this prop has changed, need to setProps\n propsToSet[fieldName] = propVal;\n // This (`${fieldName}`: propVal) needs to be pushed in the window.history\n return true;\n }\n }\n // This (`${fieldName}`: propVal) DOES NOT need to be pushed in the window.history\n return false;\n };\n\n // Check if the prop value needs to be updated (note that this mutates propsToSet)\n const pathnameUpdated = checkExistsUpdateWindowLocation('pathname');\n const hrefUpdated = checkExistsUpdateWindowLocation('href');\n const hashUpdated = checkExistsUpdateWindowLocation('hash');\n const searchUpdated = checkExistsUpdateWindowLocation('search');\n\n // propsToSet has been updated -- batch update to Dash\n if (Object.keys(propsToSet).length > 0) {\n setProps(propsToSet);\n }\n\n // Special case -- overrides everything!\n if (hrefUpdated) {\n window.history.pushState({}, '', href);\n if (refresh === 'callback-nav') {\n window.dispatchEvent(new CustomEvent('_dashprivate_pushstate'));\n }\n } else if (pathnameUpdated || hashUpdated || searchUpdated) {\n // Otherwise, we can mash everything together\n const searchVal = type(search) !== 'Undefined' ? search : '';\n const hashVal = type(hash) !== 'Undefined' ? hash : '';\n window.history.pushState(\n {},\n '',\n `${pathname}${searchVal}${hashVal}`\n );\n if (refresh === 'callback-nav') {\n window.dispatchEvent(new CustomEvent('_dashprivate_pushstate'));\n }\n }\n }\n\n onLocationChange() {\n const {setProps} = this.props;\n const propsToChange = {};\n\n if (this.props.pathname !== window.location.pathname) {\n propsToChange.pathname = window.location.pathname;\n }\n if (this.props.href !== window.location.href) {\n propsToChange.href = window.location.href;\n }\n if (this.props.hash !== window.location.hash) {\n propsToChange.hash = window.location.hash;\n }\n if (this.props.search !== window.location.search) {\n propsToChange.search = window.location.search;\n }\n\n setProps(propsToChange);\n\n History.dispatchChangeEvent();\n }\n\n componentDidMount() {\n window.addEventListener('popstate', this.onLocationChange);\n\n window.addEventListener(\n '_dashprivate_pushstate',\n this.onLocationChange\n );\n this.updateLocation(this.props);\n }\n\n componentWillUnmount() {\n window.removeEventListener('popstate', this.onLocationChange);\n window.removeEventListener(\n '_dashprivate_pushstate',\n this.onLocationChange\n );\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n this.updateLocation(nextProps);\n }\n\n render() {\n return null;\n }\n}\n\nLocation.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string.isRequired,\n\n /** pathname in window.location - e.g., \"/my/full/pathname\" */\n pathname: PropTypes.string,\n /** search in window.location - e.g., \"?myargument=1\" */\n search: PropTypes.string,\n /** hash in window.location - e.g., \"#myhash\" */\n hash: PropTypes.string,\n /** href in window.location - e.g., \"/my/full/pathname?myargument=1#myhash\" */\n href: PropTypes.string,\n\n /**\n * Use `True` to navigate outside the Dash app or to manually refresh a page.\n * Use `False` if the same callback that updates the Location component is also\n * updating the page content - typically used in multi-page apps that do not use Pages.\n * Use 'callback-nav' if you are updating the URL in a callback, or a different\n * callback will respond to the new Location with updated content. This is\n * typical with multi-page apps that use Pages. This will allow for\n * navigating to a new page without refreshing the page.\n */\n refresh: PropTypes.oneOfType([\n PropTypes.oneOf(['callback-nav']),\n PropTypes.bool,\n ]),\n\n /**\n * Dash-assigned callback that gets fired when the value changes.\n */\n setProps: PropTypes.func,\n};\n\nLocation.defaultProps = {\n refresh: true,\n};\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./radioitems.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./radioitems.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React, {useMemo} from 'react';\nimport {RadioItemsProps, PersistedProps, PersistenceTypes} from '../types';\nimport './css/radioitems.css';\n\nimport {sanitizeOptions} from '../utils/optionTypes';\nimport LoadingElement from '../utils/_LoadingElement';\nimport {OptionsList} from '../utils/optionRendering';\nimport {isNil} from 'ramda';\n\n/**\n * RadioItems is a component that encapsulates several radio item inputs.\n * The values and labels of the RadioItems is specified in the `options`\n * property and the seleced item is specified with the `value` property.\n * Each radio item is rendered as an input with a surrounding label.\n */\nexport default function RadioItems({\n className,\n id,\n style,\n setProps,\n value,\n inputStyle = {},\n inputClassName = '',\n labelStyle = {},\n labelClassName = '',\n options = [],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n inline = false,\n}: RadioItemsProps) {\n const sanitizedOptions = useMemo(() => {\n return sanitizeOptions(options).options;\n }, [options]);\n\n const stylingProps = {\n id,\n className: 'dash-radioitems ' + (className ?? ''),\n style,\n optionClassName: inline ? 'dash-radioitems-inline' : undefined,\n inputStyle,\n inputClassName,\n labelStyle,\n labelClassName,\n };\n\n return (\n \n {loadingProps => (\n {\n if (selection.length) {\n setProps({value: selection[selection.length - 1]});\n }\n }}\n {...stylingProps}\n />\n )}\n \n );\n}\n\nRadioItems.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n","export default () =>\n import(/* webpackChunkName: \"slider\" */ '../../fragments/RangeSlider');\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./sliders.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./sliders.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React, {lazy, Suspense} from 'react';\nimport {PersistedProps, PersistenceTypes, RangeSliderProps} from '../types';\nimport rangeSlider from '../utils/LazyLoader/rangeSlider';\n\nimport './css/sliders.css';\n\nconst RealRangeSlider = lazy(rangeSlider);\n\n/**\n * A double slider with two handles.\n * Used for specifying a range of numerical values.\n */\nexport default function RangeSlider({\n updatemode = 'mouseup',\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n // eslint-disable-next-line no-magic-numbers\n verticalHeight = 400,\n step = undefined,\n allow_direct_input = true,\n ...props\n}: RangeSliderProps) {\n // Some considerations for the default value of `step`:\n // If the range consists of integers, default to a value of `1`\n // Otherwise, leave it undefined\n if (\n typeof step === 'undefined' &&\n Number.isInteger(props.min) &&\n Number.isInteger(props.max)\n ) {\n step = 1;\n }\n\n return (\n \n \n \n );\n}\n\nRangeSlider.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n","import {omit} from 'ramda';\nimport React, {lazy, Suspense, useCallback, useMemo} from 'react';\nimport {\n PersistedProps,\n PersistenceTypes,\n RangeSliderProps,\n SliderProps,\n} from '../types';\nimport rangeSlider from '../utils/LazyLoader/rangeSlider';\nimport './css/sliders.css';\n\nconst RealSlider = lazy(rangeSlider);\n\n/**\n * A slider component with a single handle.\n */\nexport default function Slider({\n updatemode = 'mouseup',\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n // eslint-disable-next-line no-magic-numbers\n verticalHeight = 400,\n step = undefined,\n allow_direct_input = true,\n setProps,\n value,\n drag_value,\n ...props\n}: SliderProps) {\n // This is actually a wrapper around a RangeSlider.\n // We'll modify key `Slider` props to be compatible with a Range Slider.\n\n // Some considerations for the default value of `step`:\n // If the range consists of integers, default to a value of `1`\n // Otherwise, leave it undefined\n if (\n typeof step === 'undefined' &&\n Number.isInteger(props.min) &&\n Number.isInteger(props.max)\n ) {\n step = 1;\n }\n\n const mappedValue: RangeSliderProps['value'] = useMemo(() => {\n return typeof value === 'number' ? [value] : value;\n }, [value]);\n\n const mappedDragValue: RangeSliderProps['drag_value'] = useMemo(() => {\n return typeof drag_value === 'number' ? [drag_value] : drag_value;\n }, [drag_value]);\n\n const mappedSetProps: RangeSliderProps['setProps'] = useCallback(\n newProps => {\n const {value, drag_value} = newProps;\n const mappedProps: Partial = omit(\n ['value', 'drag_value', 'setProps'],\n newProps\n );\n if ('value' in newProps) {\n mappedProps.value = value ? value[0] : value;\n }\n if ('drag_value' in newProps) {\n mappedProps.drag_value = drag_value\n ? drag_value[0]\n : drag_value;\n }\n\n setProps(mappedProps);\n },\n [setProps]\n );\n\n return (\n \n \n \n );\n}\n\nSlider.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n","import {equals, isNil} from 'ramda';\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\n/**\n * Abstraction for the memory storage_type to work the same way as local/session\n *\n * Each memory Store component get it's own MemStore.\n */\nclass MemStore {\n constructor() {\n this._data = {};\n this._modified = -1;\n }\n\n getItem(key) {\n return this._data[key];\n }\n\n setItem(key, value) {\n this._data[key] = value;\n this.setModified(key);\n }\n\n removeItem(key) {\n delete this._data[key];\n this.setModified(key);\n }\n\n // noinspection JSUnusedLocalSymbols\n setModified(_) {\n this._modified = Date.now();\n }\n\n // noinspection JSUnusedLocalSymbols\n getModified(_) {\n return this._modified;\n }\n}\n\n/**\n * Abstraction for local/session storage_type.\n *\n * Single instances for localStorage, sessionStorage\n */\nclass WebStore {\n constructor(storage) {\n this._storage = storage;\n }\n\n getItem(key) {\n try {\n return JSON.parse(this._storage.getItem(key));\n } catch (e) {\n // in case we somehow got a non-JSON value in storage,\n // just ignore it.\n return null;\n }\n }\n\n setItem(key, value) {\n this._storage.setItem(key, JSON.stringify(value));\n this.setModified(key);\n }\n\n removeItem(key) {\n this._storage.removeItem(key);\n this._storage.removeItem(`${key}-timestamp`);\n }\n\n setModified(key) {\n this._storage.setItem(`${key}-timestamp`, Date.now());\n }\n\n getModified(key) {\n return (\n Number.parseInt(this._storage.getItem(`${key}-timestamp`), 10) || -1\n );\n }\n}\n\n/**\n * Easily keep data on the client side with this component.\n * The data is not inserted in the DOM.\n * Data can be in memory, localStorage or sessionStorage.\n * The data will be kept with the id as key.\n */\nexport default class Store extends React.Component {\n constructor(props) {\n super(props);\n\n if (props.storage_type === 'local') {\n this._backstore = new WebStore(window.localStorage);\n } else if (props.storage_type === 'session') {\n this._backstore = new WebStore(window.sessionStorage);\n } else if (props.storage_type === 'memory') {\n this._backstore = new MemStore();\n }\n\n this.onStorageChange = this.onStorageChange.bind(this);\n }\n\n onStorageChange(e) {\n const {id, setProps} = this.props;\n if (e.key === id && setProps && e.newValue !== e.oldValue) {\n setProps({\n data: JSON.parse(e.newValue),\n modified_timestamp: this._backstore.getModified(id),\n });\n }\n }\n\n UNSAFE_componentWillMount() {\n const {setProps, id, data, storage_type} = this.props;\n if (storage_type !== 'memory') {\n window.addEventListener('storage', this.onStorageChange);\n }\n\n const old = this._backstore.getItem(id);\n if (isNil(old) && !isNil(data)) {\n // Initial data mount\n this._backstore.setItem(id, data);\n setProps({\n modified_timestamp: this._backstore.getModified(id),\n });\n return;\n }\n\n if (!equals(old, data)) {\n setProps({\n data: old,\n modified_timestamp: this._backstore.getModified(id),\n });\n }\n }\n\n componentWillUnmount() {\n if (this.props.storage_type !== 'memory') {\n window.removeEventListener('storage', this.onStorageChange);\n }\n }\n\n componentDidUpdate() {\n const {data, id, clear_data, setProps} = this.props;\n if (clear_data) {\n this._backstore.removeItem(id);\n setProps({\n clear_data: false,\n data: null,\n modified_timestamp: this._backstore.getModified(id),\n });\n return;\n }\n const old = this._backstore.getItem(id);\n // Only set the data if it's not the same data.\n // If the new data is undefined, we got here by overwriting the entire\n // component with a new copy that has no `data` specified - so pull back\n // out the old value.\n // Note: this still allows you to set data to null\n if (!equals(data, old)) {\n if (data === undefined) {\n setProps({data: old});\n } else {\n this._backstore.setItem(id, data);\n setProps({\n modified_timestamp: this._backstore.getModified(id),\n });\n }\n }\n }\n\n render() {\n return null;\n }\n}\n\nStore.defaultProps = {\n storage_type: 'memory',\n clear_data: false,\n modified_timestamp: -1,\n};\n\nStore.propTypes = {\n /**\n * The ID of this component, used to identify dash components\n * in callbacks. The ID needs to be unique across all of the\n * components in an app.\n */\n id: PropTypes.string.isRequired,\n\n /**\n * The type of the web storage.\n *\n * memory: only kept in memory, reset on page refresh.\n * local: window.localStorage, data is kept after the browser quit.\n * session: window.sessionStorage, data is cleared once the browser quit.\n */\n storage_type: PropTypes.oneOf(['local', 'session', 'memory']),\n\n /**\n * The stored data for the id.\n */\n data: PropTypes.oneOfType([\n PropTypes.object,\n PropTypes.array,\n PropTypes.number,\n PropTypes.string,\n PropTypes.bool,\n ]),\n\n /**\n * Set to true to remove the data contained in `data_key`.\n */\n clear_data: PropTypes.bool,\n\n /**\n * The last time the storage was modified.\n */\n modified_timestamp: PropTypes.number,\n\n /**\n * Dash-assigned callback that gets fired when the value changes.\n */\n setProps: PropTypes.func,\n};\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./tabs.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./tabs.css\";\n export default content && content.locals ? content.locals : undefined;\n","import React from 'react';\nimport './css/tabs.css';\nimport {TabProps} from '../types';\n\n/**\n * Part of dcc.Tabs - this is the child Tab component used to render a tabbed page.\n * Its children will be set as the content of that tab, which if clicked will become visible.\n */\nfunction Tab({\n children,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n disabled = false,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n disabled_style = {color: 'var(--Dash-Text-Disabled)'},\n}: TabProps) {\n return <>{children};\n}\n\nexport default Tab;\n","import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport {has, isNil} from 'ramda';\n\nimport LoadingElement from '../utils/_LoadingElement';\nimport {PersistedProps, PersistenceTypes, TabProps, TabsProps} from '../types';\nimport './css/tabs.css';\nimport {DashComponent} from '@dash-renderer/types';\n\ninterface EnhancedTabProps extends TabProps {\n selected: boolean;\n componentPath?: (string | number)[];\n}\n\n// EnhancedTab is defined here instead of in Tab.tsx because if exported there,\n// it will mess up the Python imports and metadata.json\nconst EnhancedTab = ({\n id,\n label,\n selected,\n className,\n style,\n selected_className,\n selected_style,\n setProps: selectHandler,\n value,\n disabled = false,\n disabled_style = {color: 'var(--Dash-Text-Disabled)'},\n disabled_className,\n componentPath,\n}: EnhancedTabProps) => {\n const ExternalWrapper = window.dash_component_api.ExternalWrapper;\n const ctx = window.dash_component_api.useDashContext();\n componentPath = componentPath ?? ctx.componentPath;\n // We use the raw path here since it's up one level from\n // the tabs child.\n const isLoading = ctx.useLoading({rawPath: componentPath});\n const tabStyle = useMemo(() => {\n return {\n ...style,\n ...(disabled ? disabled_style : {}),\n ...(selected ? selected_style : {}),\n };\n }, [style, disabled, disabled_style, selected, selected_style]);\n\n const tabClassNames = useMemo(() => {\n let names = 'tab';\n if (disabled) {\n names += ' tab--disabled';\n if (disabled_className) {\n names += ` ${disabled_className}`;\n }\n }\n if (selected) {\n names += ' tab--selected';\n if (selected_className) {\n names += ` ${selected_className}`;\n }\n }\n if (className) {\n names += ` ${className}`;\n }\n return names;\n }, [className, disabled, disabled_className, selected, selected_className]);\n\n let labelDisplay;\n if (typeof label === 'object') {\n labelDisplay = (\n \n );\n } else {\n labelDisplay = {label};\n }\n\n return (\n {\n if (!disabled) {\n selectHandler({value});\n }\n }}\n >\n {labelDisplay}\n
\n );\n};\n\n/**\n * A Dash component that lets you render pages with tabs - the Tabs component's children\n * can be dcc.Tab components, which can hold a label that will be displayed as a tab, and can in turn hold\n * children components that will be that tab's content.\n */\nfunction Tabs({\n // eslint-disable-next-line no-magic-numbers\n mobile_breakpoint = 800,\n colors = {\n border: 'var(--Dash-Stroke-Weak)',\n primary: 'var(--Dash-Fill-Interactive-Strong)',\n background: 'var(--Dash-Fill-Interactive-Weak)',\n },\n vertical = false,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persisted_props = [PersistedProps.value],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n persistence_type = PersistenceTypes.local,\n children,\n ...props\n}: TabsProps) {\n const initializedRef = useRef(false);\n const [isAboveBreakpoint, setIsAboveBreakpoint] = useState(false);\n\n const parseChildrenToArray = useCallback((): DashComponent[] => {\n if (!children) {\n return [];\n }\n if (children instanceof Array) {\n return children;\n }\n return [children];\n }, [children]);\n\n const valueOrDefault = (): string | undefined => {\n if (has('value', props)) {\n return props.value;\n }\n const children = parseChildrenToArray();\n if (children && children.length && children[0].props.componentPath) {\n const firstChildren: TabProps = window.dash_component_api.getLayout(\n [...children[0].props.componentPath, 'props']\n );\n return firstChildren.value ?? 'tab-1';\n }\n return 'tab-1';\n };\n\n // Initialize value on mount if not set\n useEffect(() => {\n if (!initializedRef.current && !has('value', props)) {\n props.setProps({\n value: `${valueOrDefault()}`,\n });\n initializedRef.current = true;\n }\n }, []);\n\n // Setup matchMedia for responsive breakpoint\n useEffect(() => {\n const mediaQuery = window.matchMedia(\n `(min-width: ${mobile_breakpoint}px)`\n );\n\n // Set initial value\n setIsAboveBreakpoint(mediaQuery.matches);\n\n // Listen for changes\n const handler = (e: MediaQueryListEvent) =>\n setIsAboveBreakpoint(e.matches);\n mediaQuery.addEventListener('change', handler);\n\n return () => mediaQuery.removeEventListener('change', handler);\n }, [mobile_breakpoint]);\n\n let EnhancedTabs: JSX.Element[];\n let selectedTab;\n\n const value = valueOrDefault();\n\n if (children) {\n const children = parseChildrenToArray();\n\n EnhancedTabs = children.map((child, index) => {\n // TODO: handle components that are not dcc.Tab components (throw error)\n // enhance Tab components coming from Dash (as dcc.Tab) with methods needed for handling logic\n let childProps: Omit;\n\n if (React.isValidElement(child) && child.props.componentPath) {\n childProps = window.dash_component_api.getLayout([\n ...child.props.componentPath,\n 'props',\n ]);\n } else {\n // In case the selected tab is a string.\n childProps = {};\n }\n\n if (!childProps.value) {\n childProps = {...childProps, value: `tab-${index + 1}`};\n }\n\n // check if this child/Tab is currently selected\n if (childProps.value === value) {\n selectedTab = child;\n }\n\n const style = childProps.style ?? {};\n if (typeof childProps.width === 'number') {\n style.width = `${childProps.width}px`;\n style.flex = '0 0 auto';\n } else if (typeof childProps.width === 'string') {\n style.width = childProps.width;\n style.flex = '0 0 auto';\n }\n\n return (\n \n );\n });\n }\n\n const selectedTabContent = !isNil(selectedTab) ? selectedTab : '';\n\n const tabContainerClassNames = useMemo(() => {\n let names = 'tab-container';\n if (vertical) {\n names += ` tab-container--vert`;\n }\n if (props.className) {\n names += ` ${props.className}`;\n }\n return names;\n }, [vertical, props.className]);\n\n const tabContentClassNames = useMemo(() => {\n let names = 'tab-content';\n if (vertical) {\n names += ` tab-content--vert`;\n }\n if (props.content_className) {\n names += ` ${props.content_className}`;\n }\n return names;\n }, [vertical, props.content_className]);\n\n const tabParentClassNames = useMemo(() => {\n let names = 'tab-parent';\n if (vertical) {\n names += ` tab-parent--vert`;\n }\n if (isAboveBreakpoint) {\n names += ' tab-parent--above-breakpoint';\n }\n if (props.parent_className) {\n names += ` ${props.parent_className}`;\n }\n return names;\n }, [vertical, isAboveBreakpoint, props.parent_className]);\n\n // Set CSS variables for dynamic styling\n const cssVars = {\n '--tabs-border': colors.border,\n '--tabs-primary': colors.primary,\n '--tabs-background': colors.background,\n } as const;\n\n return (\n \n {loadingProps => (\n \n \n {EnhancedTabs}\n
\n \n {selectedTabContent || ''}\n
\n
\n )}\n \n );\n}\n\nTabs.dashPersistence = {\n persisted_props: [PersistedProps.value],\n persistence_type: PersistenceTypes.local,\n};\n\nTabs.dashChildrenUpdate = true;\n\nexport default Tabs;\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./textarea.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./textarea.css\";\n export default content && content.locals ? content.locals : undefined;\n","/* eslint-disable no-unused-vars */\nimport React from 'react';\nimport {pick} from 'ramda';\nimport {PersistedProps, PersistenceTypes, TextAreaProps} from '../types';\nimport './css/textarea.css';\n\nconst textAreaProps = [\n 'id',\n 'cols',\n 'rows',\n 'minLength',\n 'maxLength',\n 'contentEditable',\n 'tabIndex',\n 'form',\n 'name',\n 'placeholder',\n 'wrap',\n 'accessKey',\n 'contextMenu',\n 'dir',\n 'draggable',\n 'lang',\n 'spellCheck',\n 'style',\n 'title',\n] as const;\n\n/**\n * A basic HTML textarea for entering multiline text.\n *\n */\nconst Textarea = ({\n setProps,\n n_blur = 0,\n n_blur_timestamp = -1,\n n_clicks = 0,\n n_clicks_timestamp = -1,\n ...props\n}: TextAreaProps) => {\n const ctx = window.dash_component_api.useDashContext();\n const isLoading = ctx.useLoading();\n\n return (\n
\n
\n \n );\n};\n\nexport default Tooltip;\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n \n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./dcc.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = function insertAtTop(element) {\n var parent = document.querySelector('head');\n // eslint-disable-next-line no-underscore-dangle\n var lastInsertedElement =\n window._lastElementInsertedByStyleLoader;\n\n if (!lastInsertedElement) {\n parent.insertBefore(element, parent.firstChild);\n } else if (lastInsertedElement.nextSibling) {\n parent.insertBefore(element, lastInsertedElement.nextSibling);\n } else {\n parent.appendChild(element);\n }\n\n // eslint-disable-next-line no-underscore-dangle\n window._lastElementInsertedByStyleLoader = element;\n };\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./dcc.css\";\n export default content && content.locals ? content.locals : undefined;\n"],"names":["leafPrototypes","getProto","inProgress","dataWebpackPrefix","e","window","module","exports","__webpack_require__","n","t","r","o","i","l","call","m","c","d","Object","defineProperty","enumerable","get","Symbol","toStringTag","value","__esModule","create","bind","default","prototype","hasOwnProperty","p","s","u","a","done","Promise","resolve","then","this","arguments","apply","isReady","lazy","setTimeout","regeneratorRuntime","mark","wrap","prev","next","stop","_dashprivate_isLazyComponentReady","f","length","configurable","writable","key","TypeError","dispatchEvent","CustomEvent","addEventListener","removeEventListener","_typeof","iterator","constructor","_defineProperties","target","props","descriptor","_toPropertyKey","_createClass","Constructor","protoProps","staticProps","arg","input","prim","toPrimitive","undefined","res","hint","String","_toPrimitive","isDeepEqual","isDeepStrictEqual","_require$codes","codes","ERR_AMBIGUOUS_ARGUMENT","ERR_INVALID_ARG_TYPE","ERR_INVALID_ARG_VALUE","ERR_INVALID_RETURN_VALUE","ERR_MISSING_ARGS","AssertionError","inspect","_require$types","isPromise","isRegExp","objectAssign","objectIs","RegExpPrototypeTest","lazyLoadComparison","comparison","Map","warned","assert","ok","NO_EXCEPTION_SENTINEL","innerFail","obj","message","Error","innerOk","fn","argLen","generatedMessage","err","actual","expected","operator","stackStartFn","_len","args","Array","_key","concat","fail","internalMessage","argsLen","process","emitWarning","console","warn","errArgs","equal","notEqual","deepEqual","notDeepEqual","deepStrictEqual","notDeepStrictEqual","strictEqual","notStrictEqual","Comparison","keys","_this","instance","_classCallCheck","forEach","expectedException","msg","name","push","b","compareExceptionKey","isPrototypeOf","getActual","checkIsPromise","catch","waitForActual","promiseFn","resultPromise","expectsError","error","details","fnType","expectsNoError","internalMatch","string","regexp","fnName","match","strict","_len6","_key6","throws","_len2","_key2","rejects","_len3","_key3","result","doesNotThrow","_len4","_key4","doesNotReject","_len5","_key5","ifError","newErr","origStack","stack","tmp2","split","shift","tmp1","pos","indexOf","slice","join","doesNotMatch","ownKeys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","_objectSpread","getOwnPropertyDescriptors","defineProperties","_possibleConstructorReturn","self","_assertThisInitialized","ReferenceError","_wrapNativeSuper","Class","_cache","Function","toString","has","set","Wrapper","_construct","_getPrototypeOf","_setPrototypeOf","Parent","_isNativeReflectConstruct","Reflect","construct","sham","Proxy","Boolean","valueOf","setPrototypeOf","__proto__","getPrototypeOf","endsWith","str","search","this_len","substring","blue","green","red","white","kReadableOperator","strictEqualObject","notStrictEqualObject","notIdentical","copyError","source","inspectValue","val","compact","customInspect","depth","maxArrayLength","Infinity","showHidden","breakLength","showProxy","sorted","getters","_Error","_inspect$custom","subClass","superClass","_inherits","Derived","hasNativeReflectConstruct","_super","Super","NewTarget","options","limit","stackTraceLimit","stderr","isTTY","getColorDepth","other","lastPos","end","skipped","actualInspected","actualLines","expectedLines","indicator","inputLength","columns","count","Math","floor","maxCount","log","repeat","pop","maxLines","max","_actualLines","printedLines","skippedMsg","cur","expectedLine","actualLine","divergingLines","createErrDiff","base","_res","knownOperators","code","captureStackTrace","recurseTimes","ctx","custom","util","createErrorType","Base","NodeError","_Base","arg1","arg2","arg3","getMessage","oneOf","thing","isArray","len","map","determiner","start","substr","replace","type","reason","inspected","RangeError","_slicedToArray","arr","_arrayWithHoles","return","_iterableToArrayLimit","minLen","_arrayLikeToArray","from","test","_unsupportedIterableToArray","_nonIterableRest","arr2","regexFlagsSupported","flags","arrayFromSet","array","arrayFromMap","is","objectGetOwnPropertySymbols","numberIsNaN","Number","isNaN","uncurryThis","propertyIsEnumerable","objectToString","isAnyArrayBuffer","isArrayBufferView","isDate","isMap","isSet","isNativeError","isBoxedPrimitive","isNumberObject","isStringObject","isBooleanObject","isBigIntObject","isSymbolObject","isFloat32Array","isFloat64Array","isNonIndex","charCodeAt","pow","getOwnNonIndexProperties","compare","x","y","min","innerDeepEqual","val1","val2","memos","buf1","buf2","val1Tag","keys1","keys2","keyCheck","Date","getTime","RegExp","byteLength","Uint8Array","buffer","byteOffset","areSimilarTypedArrays","offset","areSimilarFloatArrays","_keys","_keys2","size","BigInt","isEqualBoxedPrimitive","getEnumerables","k","iterationType","aKeys","bKeys","symbolKeysA","symbolKeysB","_symbolKeysB","position","val2MemoA","val2MemoB","areEq","memo","aValues","Set","add","setMightHaveLoosePrim","bValues","_i","_val","setHasEqualElement","setEquiv","aEntries","_aEntries$i","item1","item2","mapMightHaveLoosePrim","bEntries","_i2","_bEntries$_i","item","mapHasEqualEntry","mapEquiv","keysA","objEquiv","delete","setValues","findLooseMatchingPrimitives","altValue","curB","key1","key2","privatePropTypes","_dashprivate_transformConfig","PropTypes","_dashprivate_transformFigure","_dashprivate_onFigureModified","EMPTY_DATA","PlotlyGraph","_Component","_callSuper","mathjax","_loadMathjax","state","prependData","extendData","clearState","setState","nextProps","figure","dataKey","data","React","ControlledPlotlyGraph","_extends","Component","RealPlotlyGraph","asyncDecorator","all","Plotly","reject","timeoutId","element","document","createElement","src","_dashPlotlyJSURL","async","onload","clearTimeout","onerror","querySelector","appendChild","lazyLoadMathJax","_ref","className","id","extendedClassName","Suspense","fallback","displayName","propTypes","responsive","clickData","clickAnnotationData","hoverData","clear_on_unhover","selectedData","relayoutData","restyleData","layout","frames","style","animate","animation_options","config","staticPlot","plotlyServerURL","editable","editSelection","edits","annotationPosition","annotationTail","annotationText","axisTitleText","colorbarPosition","colorbarTitleText","legendPosition","legendText","shapePosition","titleText","autosizable","queueLength","fillFrame","frameMargins","scrollZoom","doubleClick","doubleClickDelay","showTips","showAxisDragHandles","showAxisRangeEntryBoxes","showLink","sendData","linkText","displayModeBar","showSendToCloud","showEditInChartStudio","modeBarButtonsToRemove","modeBarButtonsToAdd","modeBarButtons","toImageButtonOptions","format","filename","width","height","scale","displaylogo","watermark","plotGlPixelRatio","topojsonURL","mapboxAccessToken","locale","locales","displayNotifier","setProps","defaultProps","frame","redraw","transition","duration","ease","graphPropTypes","graphDefaultProps","Graph_react","event","params","bubbles","cancelable","detail","evt","createEvent","initCustomEvent","Event","Link","_ref$refresh","refresh","_objectWithoutProperties","_excluded","href","children","title","cleanUrl","dash_clientside","clean_url","sanitizedUrl","useMemo","loading","dash_component_api","useDashContext","useLoading","useEffect","_dash_error","onClick","metaKey","shiftKey","altKey","ctrlKey","isNil","preventDefault","location","history","pushState","scrollTo","isRequired","loading_state","is_loading","prop_name","component_name","__webpack_exports__","A","DashMarkdown","RealDashMarkdown","dangerously_allow_html","link_target","dedent","highlight_config","theme","upload","RealUpload","Upload","contents","last_modified","accept","disabled","disable_click","max_size","min_size","multiple","enable_folder_selection","className_active","className_reject","className_disabled","style_active","style_reject","style_disabled","borderStyle","borderColor","backgroundColor","opacity","MathJax","LoadingElement","ref","_ref$elementType","elementType","givenProps","dropdown","RealDropdown","defaultLabels","select_all","deselect_all","selected_count","clear_search","clear_selection","no_options_found","Dropdown","_ref$clearable","clearable","_ref$disabled","_ref$multi","multi","_ref$searchable","searchable","_ref$labels","labels","_ref$optionHeight","optionHeight","_ref$maxHeight","maxHeight","_ref$closeOnSelect","closeOnSelect","persisted_props","PersistedProps","persistence_type","PersistenceTypes","local","dashPersistence","styleTagTransform","styleTagTransform_default","setAttributes","setAttributesWithoutAttributes_default","insert","parent","lastInsertedElement","_lastElementInsertedByStyleLoader","nextSibling","insertBefore","firstChild","domAPI","styleDomAPI_default","insertStyleElement","insertStyleElement_default","injectStylesIntoStyleTag_default","locals","convert","fastIsNumeric","isNumeric","NaN","isEquivalent","v1","v2","inputProps","Input","_ref$type","HTMLInputTypes","text","_ref$inputMode","inputMode","_ref$n_blur","n_blur","_ref$n_submit","n_blur_timestamp","n_submit","_ref$debounce","n_submit_timestamp","debounce","_ref$step","step","_ref$autoComplete","autoComplete","useRef","_useState2","useState","setValue","_useState4","pendingEvent","setPendingEvent","inputId","uniqid","valprops","number","setPropValue","useCallback","current","checkValidity","onEvent","inputValue","valueAsNumber","propValue","onBlur","now","onChange","onKeyPress","setInputValue","debounceEvent","seconds","handleStepperClick","direction","currentValue","parseFloat","stepAsNum","decimalPlaces","constrainedValue","roundedValue","toFixed","cursorPosition","selectionStart","isFinite","setSelectionRange","disabledAsBool","includes","pickedInputs","pick","isNumberInput","currentNumericValue","minValue","maxValue","isDecrementDisabled","isIncrementDisabled","loadingProps","hidden","trim","components_Input","CalendarDirection","additionalProps","assign","safeIsNaN","isEqual","first","second","areInputsEqual","newInputs","lastInputs","memoize_one_esm","resultFn","lastThis","lastResult","lastArgs","calledOnce","newArgs","performance","cancelTimeout","timeoutID","cancelAnimationFrame","getScrollbarSize","recalculate","div","overflow","body","offsetWidth","clientWidth","removeChild","cachedRTLResult","getRTLOffsetType","outerDiv","outerStyle","innerDiv","innerStyle","scrollLeft","defaultItemKey$1","index","createListComponent","_class","getItemOffset","getEstimatedTotalSize","getItemSize","getOffsetForIndexAndAlignment","getStartIndexForOffset","getStopIndexForStartIndex","initInstanceProps","shouldResetStyleCacheOnItemSizeChange","validateProps","_PureComponent","List","_instanceProps","_outerRef","_resetIsScrollingTimeoutId","isScrolling","scrollDirection","scrollOffset","initialScrollOffset","scrollUpdateWasRequested","_callOnItemsRendered","memoizeOne","overscanStartIndex","overscanStopIndex","visibleStartIndex","visibleStopIndex","onItemsRendered","_callOnScroll","onScroll","_getItemStyle","_this$props","itemSize","itemStyleCache","_getItemStyleCache","isHorizontal","isRtl","offsetHorizontal","left","right","top","_offset","_","__","___","_onScrollHorizontal","_event$currentTarget","currentTarget","scrollWidth","prevState","_resetIsScrollingDebounced","_onScrollVertical","_event$currentTarget2","clientHeight","scrollHeight","scrollTop","_outerRefSetter","outerRef","callback","delay","_resetIsScrolling","requestAnimationFrame","tick","getDerivedStateFromProps","validateSharedProps","_proto","scrollToItem","align","_this$props2","itemCount","scrollbarSize","componentDidMount","_this$props3","_callPropsCallbacks","componentDidUpdate","_this$props4","_this$state","componentWillUnmount","render","_this$props5","innerRef","innerElementType","innerTagName","itemData","_this$props5$itemKey","itemKey","outerElementType","outerTagName","useIsScrolling","_this$_getRangeToRend","_getRangeToRender","startIndex","stopIndex","items","_index","estimatedTotalSize","WebkitOverflowScrolling","willChange","pointerEvents","_this$_getRangeToRend2","_overscanStartIndex","_overscanStopIndex","_visibleStartIndex","_visibleStopIndex","_this$state2","_scrollDirection","_scrollOffset","_scrollUpdateWasRequested","_this$props6","overscanCount","_this$state3","overscanBackward","overscanForward","PureComponent","validateSharedProps$1","_ref2","_ref3","getItemMetadata$1","instanceProps","itemMetadataMap","lastMeasuredIndex","itemMetadata","findNearestItemBinarySearch$1","high","low","middle","currentOffset","estimatedItemSize","totalSizeOfMeasuredItems","VariableSizeList","maxOffset","minOffset","round","findNearestItemBinarySearch","interval","findNearestItemExponentialSearch","findNearestItem$1","getItemMetadata","resetAfterIndex","shouldForceUpdate","forceUpdate","_ref5","optionslist","OptionLabel","label","ExternalWrapper","component","componentPath","displayLabel","Option","option","isSelected","optionClassName","optionStyle","_ref2$inputType","inputType","inputClassName","inputStyle","labelClassName","labelStyle","classNames","inputClassNames","labelClassNames","role","checked","onKeyUp","readOnly","Row","selected","passThruProps","setOptionHeight","measureRef","el","immediateHeight","getBoundingClientRect","ResizeObserver","_ref4","_entry$borderBoxSize$","_entry$borderBoxSize","entry","borderBoxSize","blockSize","contentRect","observe","OptionsList","forwardRef","_ref6","onSelectionChange","_ref6$maxHeight","innerHeight","listRef","containerRef","pendingFocusRef","heightsRef","measuredHeight","setMeasuredHeight","defaultOptionHeight","getOptionHeight","_heightsRef$current$g","_listRef$current","useLayoutEffect","_listRef$current2","h","defaultListHeight","listHeight","focusOption","optionIndex","_containerRef$current","deferred","HTMLElement","focus","useImperativeHandle","focusItem","handleChange","newValue","without","append","handleItemsRendered","sizerDiv","longestOption","maxLen","_data$options$index$v","_data$options$index","sanitizeOptions","valueSet","opt","isOptionValue","entries","bg","b64","tmp","lens","validLen","getLens","placeHoldersLen","Arr","_byteLength","curByte","revLookup","lookup","$apply","$call","$reflectApply","actualApply","$TypeError","$actualApply","GetIntrinsic","callBind","$indexOf","allowMissing","intrinsic","setFunctionLength","$defineProperty","callBindBasic","applyBind","originalFunction","func","adjustedLength","times","g","functions","time","object","expression","tuple","___CSS_LOADER_EXPORT___","_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default","_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default","version","sources","names","mappings","sourcesContent","sourceRoot","cssWithMappingToString","list","content","needLayer","modules","media","dedupe","supports","layer","alreadyImportedModules","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","sourceMapping","$SyntaxError","gopd","property","nonEnumerable","nonWritable","nonConfigurable","loose","desc","hasSymbols","toStr","defineDataProperty","supportsDescriptors","predicate","predicates","hasProtoAccessor","gOPD","$Object","$getPrototypeOf","EvalError","SyntaxError","URIError","allBlankCharCodes","original","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_RESULT__","XMLHttpRequest","open","responseType","response","send","status","MouseEvent","initMouseEvent","global","navigator","userAgent","saveAs","HTMLAnchorElement","URL","webkitURL","j","download","rel","origin","createObjectURL","revokeObjectURL","msSaveOrOpenBlob","autoBom","Blob","innerText","safari","FileReader","onloadend","readAsDataURL","isCallable","thisArg","receiver","forEachArray","charAt","forEachString","forEachObject","concatty","that","bound","arrLike","slicy","boundLength","boundArgs","joiny","Empty","implementation","$Error","$EvalError","$RangeError","$ReferenceError","$URIError","abs","sign","$Function","getEvalledConstructor","expressionSyntax","$gOPD","throwTypeError","ThrowTypeError","calleeThrows","gOPDthrows","$ObjectGPO","$ReflectGPO","needsEval","TypedArray","INTRINSICS","AggregateError","ArrayBuffer","Atomics","BigInt64Array","BigUint64Array","DataView","decodeURI","decodeURIComponent","encodeURI","eval","Float16Array","Float32Array","Float64Array","FinalizationRegistry","Int8Array","Int16Array","Int32Array","parseInt","SharedArrayBuffer","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","WeakRef","WeakSet","errorProto","doEval","gen","LEGACY_ALIASES","hasOwn","$concat","$spliceApply","splice","$replace","$strSlice","$exec","exec","rePropName","reEscapeChar","getBaseIntrinsic","alias","intrinsicName","parts","last","quote","subString","stringToPath","intrinsicBaseName","intrinsicRealName","skipFurtherCaching","isOwn","part","reflectGetProto","originalGetProto","getDunderProto","O","hasPropertyDescriptors","hasArrayLengthDefineBug","origSymbol","hasSymbolSham","sym","symObj","getOwnPropertyNames","syms","$hasOwn","ctor","superCtor","super_","TempCtor","hasToStringTag","$toString","callBound","isStandardArguments","isLegacyArguments","callee","supportsStandardArguments","badArrayLike","isCallableMarker","fnToStr","reflectApply","constructorRegex","isES6ClassFn","fnStr","tryFunctionObject","isIE68","isDDA","strClass","GeneratorFunction","isFnRegex","generatorFunc","getGeneratorFunc","define","getPolyfill","shim","polyfill","whichTypedArray","$isNaN","keysShim","isArgs","isEnumerable","hasDontEnumBug","hasProtoEnumBug","dontEnums","equalsConstructorPrototype","excludedKeys","$applicationCache","$console","$external","$frame","$frameElement","$frames","$innerHeight","$innerWidth","$onmozfullscreenchange","$onmozfullscreenerror","$outerHeight","$outerWidth","$pageXOffset","$pageYOffset","$parent","$scrollLeft","$scrollTop","$scrollX","$scrollY","$self","$webkitIndexedDB","$webkitStorageInfo","$window","hasAutomationEqualityBug","isObject","isFunction","isArguments","isString","theKeys","skipProto","skipConstructor","equalsConstructorPrototypeIfNotBuggy","origKeys","originalKeys","keysWorksWithArguments","objectKeys","toObject","$push","$propIsEnumerable","originalGetSymbols","source1","to","getSymbols","nextKey","letters","lacksProperEnumerationOrder","preventExtensions","thrower","assignHasPendingExceptions","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","timeout","run","marker","runClearTimeout","Item","noop","nextTick","browser","env","argv","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","binding","cwd","chdir","dir","umask","hasDescriptors","$floor","functionLengthIsConfigurable","functionLengthIsWritable","stylesInDOM","getIndexByIdentifier","identifier","modulesToDom","idCountMap","identifiers","indexByIdentifier","css","sourceMap","references","updater","addElementStyle","byIndex","api","update","newObj","remove","lastIdentifiers","newList","newLastIdentifiers","attributes","styleElement","nonce","nc","setAttribute","parentNode","removeStyleElement","styleSheet","cssText","createTextNode","pid","prefix","suffix","copy","fill","readUInt8","isArgumentsObject","isGeneratorFunction","isTypedArray","BigIntSupported","SymbolSupported","ObjectToString","numberValue","stringValue","booleanValue","bigIntValue","symbolValue","checkBoxedPrimitive","prototypeValueOf","isMapToString","isSetToString","isWeakMapToString","isWeakSetToString","isArrayBufferToString","isArrayBuffer","working","isDataViewToString","isDataView","isView","isUint8Array","isUint8ClampedArray","isUint16Array","isUint32Array","isInt8Array","isInt16Array","isInt32Array","isBigInt64Array","isBigUint64Array","isWeakMap","isWeakSet","SharedArrayBufferCopy","isSharedArrayBufferToString","isSharedArrayBuffer","isAsyncFunction","isMapIterator","isSetIterator","isGeneratorObject","isWebAssemblyCompiledModule","method","descriptors","formatRegExp","objects","isNull","deprecate","noDeprecation","throwDeprecation","traceDeprecation","trace","debugs","debugEnvRegex","NODE_DEBUG","debugEnv","toUpperCase","opts","seen","stylize","stylizeNoColor","colors","isBoolean","_extend","isUndefined","stylizeWithColor","formatValue","styleType","styles","ret","primitive","simple","isNumber","formatPrimitive","visibleKeys","hash","idx","arrayToHash","isError","formatError","output","braces","toUTCString","formatProperty","formatArray","reduce","reduceToSingleString","line","ar","re","pad","debuglog","bold","italic","underline","inverse","grey","black","cyan","magenta","yellow","special","boolean","null","date","types","isNullOrUndefined","isSymbol","isPrimitive","isBuffer","months","prop","getHours","getMinutes","getSeconds","getDate","getMonth","inherits","kCustomPromisifiedSymbol","callbackifyOnRejected","cb","newReason","promisify","promiseResolve","promiseReject","promise","callbackify","callbackified","maybeCb","rej","availableTypedArrays","globalThis","typedArrays","$slice","cache","typedArray","proto","superProto","tag","found","getter","trySlices","tryTypedArrays","possibleNames","out","defaultOptions","getDefaultOptions","dateLongFormatter","pattern","formatLong","timeLongFormatter","longFormatters","P","dateTimeLongFormatter","dateTimeFormat","matchResult","datePattern","timePattern","dateTime","getTimezoneOffsetInMilliseconds","_date","toDate","utcDate","UTC","getFullYear","getMilliseconds","setUTCFullYear","normalizeDates","context","dates","normalize","constructFrom","find","dayOfYearTokenRE","weekYearTokenRE","throwTokens","isProtectedDayOfYearToken","token","isProtectedWeekYearToken","warnOrThrowProtectedError","_message","subject","toLowerCase","millisecondsInWeek","millisecondsInDay","millisecondsInMinute","millisecondsInHour","millisecondsInSecond","constructFromSymbol","for","differenceInCalendarDays","laterDate","earlierDate","_normalizeDates2","in","laterDate_","earlierDate_","laterStartOfDay","startOfDay","earlierStartOfDay","laterTimestamp","earlierTimestamp","getDayOfYear","date_","setFullYear","setHours","startOfYear","addLeadingZeros","targetLength","padStart","lightFormatters","signedYear","year","M","month","dayPeriodEnumValue","H","S","numberOfDigits","milliseconds","trunc","formatters","G","localize","era","ordinalNumber","unit","Y","signedWeekYear","getWeekYear","weekYear","R","getISOWeekYear","Q","quarter","ceil","q","L","w","week","getWeek","I","isoWeek","getISOWeek","D","dayOfYear","E","dayOfWeek","getDay","day","localDayOfWeek","weekStartsOn","isoDayOfWeek","dayPeriod","hours","B","K","X","_localize","timezoneOffset","getTimezoneOffset","formatTimezoneWithOptionalMinutes","formatTimezone","formatTimezoneShort","z","T","delimiter","absOffset","minutes","formattingTokensRegExp","longFormattingTokensRegExp","escapedStringRegExp","doubleQuoteRegExp","unescapedLatinCharacterRegExp","formatStr","_options$locale","_options$firstWeekCon","_options$locale2","_defaultOptions$local","_ref7","_options$weekStartsOn","_options$locale3","_defaultOptions$local2","defaultLocale","firstWeekContainsDate","originalDate","isValid","firstCharacter","longFormatter","isToken","matched","preprocessor","formatterOptions","useAdditionalWeekYearTokens","useAdditionalDayOfYearTokens","formatter","diff","startOfISOWeek","fourthOfJanuary","startOfISOWeekYear","fourthOfJanuaryOfNextYear","startOfNextYear","fourthOfJanuaryOfThisYear","startOfThisYear","startOfWeek","firstWeek","startOfWeekYear","firstWeekOfNextYear","firstWeekOfThisYear","formatDistanceLocale","lessThanXSeconds","one","xSeconds","halfAMinute","lessThanXMinutes","xMinutes","aboutXHours","xHours","xDays","aboutXWeeks","xWeeks","aboutXMonths","xMonths","aboutXYears","xYears","overXYears","almostXYears","buildFormatLongFn","defaultWidth","formats","full","long","medium","short","formatRelativeLocale","lastWeek","yesterday","today","tomorrow","nextWeek","buildLocalizeFn","valuesArray","formattingValues","defaultFormattingWidth","values","argumentCallback","dirtyNumber","_options","rem100","narrow","abbreviated","wide","am","pm","midnight","noon","morning","afternoon","evening","night","buildMatchFn","matchPattern","matchPatterns","defaultMatchWidth","matchedString","parsePatterns","defaultParseWidth","findIndex","findKey","valueCallback","rest","parsePattern","parseResult","any","enUS","formatDistance","tokenValue","addSuffix","formatRelative","_baseDate","parseISO","argument","_options$additionalDi","invalidDate","additionalDigits","dateStrings","dateString","timeString","patterns","dateTimeDelimiter","timeZoneDelimiter","timezone","splitDateString","parseYearResult","regex","captures","restDateString","century","parseYear","dateRegex","isWeekDate","parseDateUnit","_year","validateWeekDate","isoWeekYear","getUTCDay","setUTCDate","getUTCDate","dayOfISOWeekYear","daysInMonths","isLeapYearIndex","validateDate","validateDayOfYearDate","parseDate","timestamp","timeRegex","parseTimeUnit","validateTime","parseTime","tmpDate","getUTCFullYear","getUTCMonth","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","timezoneString","timezoneRegex","_hours","validateTimezone","parseTimezone","setDate","es_append","set1","set2","len1","len2","_concat","_internal_curry2_js__WEBPACK_IMPORTED_MODULE_0__","_internal_isArray_js__WEBPACK_IMPORTED_MODULE_1__","_toString_js__WEBPACK_IMPORTED_MODULE_4__","_internal_isString_js__WEBPACK_IMPORTED_MODULE_3__","_internal_isFunction_js__WEBPACK_IMPORTED_MODULE_2__","_arrayFromIterator","iter","_includesWith","pred","internal_objectIs","_uniqContentEquals","aIterator","bIterator","stackA","stackB","eq","_a","_b","_equals","aItem","typeA","equals","ignoreCase","multiline","sticky","unicode","extendedStackA","extendedStackB","_has","es_equals","_curry2","XFilter","xf","_xfBase","init","_xfilter","es_filter","_dispatchable","filterable","_isObject","reducer","acc","_arrayReduce","_filter","es_hasPath","_path","es_has","_internal_includes_js__WEBPACK_IMPORTED_MODULE_0__","_curry1","f1","_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_0__","f2","_isPlaceholder_js__WEBPACK_IMPORTED_MODULE_1__","_curry1_js__WEBPACK_IMPORTED_MODULE_0__","methodNames","transducerCreator","_isArray","_isTransformer","transducer","_includes","inf","_indexOf","_isArguments","_has_js__WEBPACK_IMPORTED_MODULE_0__","_isFunction","_isPlaceholder","_isString","hasEnumBug","nonEnumerableProps","hasArgsEnumBug","contains","_internal_curry1_js__WEBPACK_IMPORTED_MODULE_0__","nIdx","ks","checkArgsLength","_internal_isArguments_js__WEBPACK_IMPORTED_MODULE_2__","_internal_has_js__WEBPACK_IMPORTED_MODULE_1__","omit","es_reject","_map","functor","_quote","internal_toISOString","toISOString","_toString","recur","xs","mapPairs","sort","repr","es_toString","hasOrAdd","shouldAdd","prevSize","_items","_nativeSet","bIdx","internal_Set","_Set","es_without","toRemove","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","mode","ns","def","definition","chunkId","promises","url","script","needAttach","scripts","getElementsByTagName","getAttribute","charset","onScriptComplete","doneFns","head","scriptUrl","importScripts","currentScript","tagName","getCurrentScript","doc_scripts","textContent","jsonpScriptSrc","__jsonpScriptSrc__","isLocal","srcFragments","fileFragments","installedChunks","installedChunkData","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","css_button","components_Button","_ref$n_clicks","n_clicks","n_clicks_timestamp","isLoading","checklist_options","checklist","Checklist","_ref$inputStyle","_ref$inputClassName","_ref$labelStyle","_ref$labelClassName","_ref$options","_ref$value","_ref$inline","inline","sanitizedOptions","stylingProps","selection","_defineProperty","_arr","_n","_d","_e","_s","_WINDOW","_DOCUMENT","_PERFORMANCE","measure","MutationObserver","_ref$userAgent","WINDOW","DOCUMENT","PERFORMANCE","IS_DOM","documentElement","NAMESPACE_IDENTIFIER","DEFAULT_REPLACEMENT_CLASS","oneToTen","oneToTwenty","DUOTONE_CLASSES","GROUP","SWAP_OPACITY","PRIMARY","SECONDARY","initial","FontAwesomeConfig","attr","coerce","getAttrConfig","_config","familyPrefix","replacementClass","autoReplaceSvg","autoAddCss","autoA11y","searchPseudoElements","observeMutations","mutateApproach","keepOriginalSource","measurePerformance","showMissingIcons","hooks","shims","namespace","doScroll","readyState","listener","asyncTimer","PENDING","SETTLED","FULFILLED","REJECTED","NOOP","isNode","asyncSetTimer","setImmediate","asyncQueue","asyncFlush","asyncCall","invokeCallback","subscriber","owner","settled","_state","_data","handleThenable","resolved","fulfill","publishFulfillment","publishRejection","publish","_then","_handled","notifyRejectionHandled","resolver","rejectPromise","invokeResolver","onFulfillment","onRejection","fulfilled","rejected","results","remaining","race","meaninglessTransform","rotate","flipX","flipY","nextUniqueId","random","htmlEscape","joinStyles","styleName","transformIsMeaningful","transform","transformForSvg","containerWidth","iconWidth","outer","innerTranslate","innerScale","innerRotate","inner","path","ALL_SPACE","fillBlack","abstract","force","initialValue","thisContext","bindInternal4","defineIcons","icons","_params$skipHooks","skipHooks","normalized","iconName","icon","addPack","build","ligatures","ligature","hasRegular","oldName","iconFromMapping","mapping","toHtml","abstractNodes","_abstractNodes$attrib","_abstractNodes$childr","attributeName","joinAttributes","MissingIcon","FILL","ANIMATION_BASE","attributeType","repeatCount","dur","OPACITY_ANIMATE","asFoundIcon","vectorData","class","cx","cy","Library","definitions","additions","_pullDefinitions","_normalized$key","ensureCss","_cssInserted","innerHTML","headChildren","childNodes","beforeChild","child","insertCss","dfp","drc","fp","rc","dPatt","customPropPatt","rPatt","findIconDefinition","iconLookup","_iconLookup$prefix","library","parse","transformString","parseTransformString","iconDefinition","abstractCreator","_params$transform","_params$symbol","symbol","_params$mask","mask","_params$maskId","maskId","_params$title","_params$titleId","titleId","_params$classes","classes","_params$attributes","_params$styles","_params$icons","main","extra","_params$watchable","watchable","isUploadedIcon","widthClass","attrClass","xmlns","viewBox","uploadedIconWidthStyle","explicitMaskId","mainWidth","mainPath","maskWidth","maskPath","trans","maskRect","maskInnerGroupChildrenMixin","maskInnerGroup","maskOuterGroup","clipId","maskTag","maskUnits","maskContentUnits","defs","makeIconMasking","styleString","makeIconStandard","asSymbol","asIcon","makeInlineSvgAbstract","container","html","maybeIconDefinition","enumerableOnly","symbols","_objectSpread2","index_es_defineProperty","index_es_typeof","index_es_objectWithoutProperties","excluded","sourceKeys","index_es_objectWithoutPropertiesLoose","sourceSymbolKeys","index_es_toConsumableArray","index_es_arrayWithoutHoles","index_es_iterableToArray","index_es_nonIterableSpread","camelize","chr","_excluded$1","index_es_PRODUCTION","normalizeIconArgs","objectWithKey","index_es_excluded","FontAwesomeIcon","forwardedRef","iconArgs","maskArgs","_classes","beat","fade","beatFade","bounce","shake","flash","spin","spinPulse","spinReverse","pulse","fixedWidth","border","listItem","flip","rotation","pull","swapOpacity","classList","renderedIcon","_console","index_es_console","extraProps","convertCurry","external_PropTypes_default","bool","oneOfType","mixins","attrs","pair","startsWith","_extraProps$style","existingStyle","external_React_default","faCheckCircle","faCopy","Generator","_regeneratorDefine2","v","GeneratorFunctionPrototype","_regenerator","_invoke","asyncGeneratorStep","_asyncToGenerator","_next","_throw","clipboardAPI","clipboard","wait","ms","Clipboard","_React$Component","copyToClipboard","onClickHandler","copySuccess","getTargetText","stringifyId","copied","prevProps","wild","_copySuccess","_callee","htmlContent","showCopiedIcon","blobHtml","blobText","_context","ClipboardItem","write","writeText","_x","_x2","target_id","getElementById","_loading","_callee2","_context2","_copyToClipboard","_callee3","_context3","html_content","copied_children","button_children","DashContext","ConfirmDialog","_update","displayed","shouldTriggerDisplay","cancel_n_clicks","submit_n_clicks","confirm","submit_n_clicks_timestamp","cancel_n_clicks_timestamp","ConfirmDialogProvider","wrapClick","datePickerRange","DatePickerPersistence","extract","parsed","storedValue","RealDatePickerRange","DatePickerRange","_ref$calendar_orienta","calendar_orientation","_ref$is_RTL","is_RTL","_ref$day_size","day_size","_ref$with_portal","with_portal","_ref$with_full_screen","with_full_screen_portal","_ref$first_day_of_wee","first_day_of_week","_ref$number_of_months","number_of_months_shown","_ref$stay_open_on_sel","stay_open_on_select","_ref$reopen_calendar_","reopen_calendar_on_clear","_ref$show_outside_day","show_outside_days","_ref$updatemode","updatemode","_ref$disabled_days","start_date","end_date","disabled_days","persistenceTransforms","transformDate","datePickerSingle","RealDatePickerSingle","DatePickerSingle","_ref$placeholder","placeholder","getValue","Download","toByteArray","blob","Geolocation","success","update_now","geolocation","positionOptions","enableHighAccuracy","high_accuracy","maximumAge","maximum_age","getCurrentPosition","updatePosition","_crd$latitude","_crd$longitude","_crd$accuracy","_crd$altitude","_crd$altitudeAccuracy","_crd$speed","_crd$heading","crd","coords","position_obj","lat","latitude","lon","longitude","accuracy","alt","altitude","alt_accuracy","altitudeAccuracy","speed","heading","local_date","toLocaleString","position_error","show_alert","alert","Interval","intervalId","reportInterval","handleTimer","max_intervals","n_intervals","clearTimer","setInterval","clearInterval","resetTimer","es_toPairs","pairs","XAny","_xany","es_any","DebugTitle","spinnerComponentOptions","graph","debugTitle","fullscreen","debug","spinnerClass","cube","color","circle","dot","coveringSpinner","visibility","display","justifyContent","alignItems","components_Loading","targetComponents","_ref3$display","_ref3$color","parent_className","parent_style","overlay_style","_ref3$show_initially","show_initially","_ref3$type","spinnerType","_ref3$delay_hide","delay_hide","_ref3$delay_show","delay_show","target_components","custom_spinner","useSelector","stringPath","loadingChildren","toPairs","load","showSpinner","setShowSpinner","dismissTimer","showTimer","containerStyle","Spinner","getSpinner","Location","updateLocation","onLocationChange","_this2","pathname","propsToSet","checkExistsUpdateWindowLocation","fieldName","propVal","pathnameUpdated","hrefUpdated","hashUpdated","searchUpdated","searchVal","hashVal","propsToChange","History","dispatchChangeEvent","radioitems_options","RadioItems","radioitems","rangeSlider","sliders_options","sliders","RealRangeSlider","RangeSlider","_ref$verticalHeight","verticalHeight","_ref$allow_direct_inp","allow_direct_input","isInteger","RealSlider","Slider","drag_value","mappedValue","mappedDragValue","mappedSetProps","newProps","mappedProps","MemStore","_modified","setModified","WebStore","storage","_storage","getItem","setItem","removeItem","Store","storage_type","_backstore","localStorage","sessionStorage","onStorageChange","oldValue","modified_timestamp","getModified","old","clear_data","tabs_options","tabs","components_Tab","disabled_style","EnhancedTab","selected_className","selected_style","selectHandler","_ref$disabled_style","disabled_className","labelDisplay","rawPath","tabStyle","tabClassNames","_toConsumableArray","Tabs","EnhancedTabs","selectedTab","_ref2$mobile_breakpoi","mobile_breakpoint","_ref2$colors","primary","background","_ref2$vertical","vertical","initializedRef","isAboveBreakpoint","setIsAboveBreakpoint","parseChildrenToArray","valueOrDefault","_firstChildren$value","getLayout","mediaQuery","matchMedia","matches","handler","_childProps$style","childProps","flex","selectedTabContent","tabContainerClassNames","tabContentClassNames","content_className","tabParentClassNames","cssVars","content_style","dashChildrenUpdate","components_Tabs","textarea_options","css_textarea","textAreaProps","Textarea","required","autoFocus","components_Textarea","tooltip_options","tooltip","components_Tooltip","_ref$show","show","_ref$targetable","targetable","_ref$direction","_ref$border_color","border_color","_ref$background_color","background_color","_ref$className","_ref$zindex","zindex","_ref$loading_text","loading_text","bbox","show_tooltip","x0","x1","y0","y1","dcc_options","dcc"],"sourceRoot":""} \ No newline at end of file diff --git a/dash/dcc/package-info.json b/dash/dcc/package-info.json index 0d3583c9df..a5b5089484 100644 --- a/dash/dcc/package-info.json +++ b/dash/dcc/package-info.json @@ -1,6 +1,6 @@ { "name": "dash-core-components", - "version": "4.2.0", + "version": "4.3.0", "description": "Core component suite for Dash", "repository": { "type": "git", @@ -27,7 +27,7 @@ "build:js": "webpack --mode production", "build:backends": "dash-generate-components ./src/components dash_core_components -p package-info.json && cp dash_core_components_base/** dash_core_components/ && dash-generate-components ./src/components dash_core_components -p package-info.json -k RangeSlider,Slider,Dropdown,RadioItems,Checklist,DatePickerSingle,DatePickerRange,Input,Link --r-prefix 'dcc' --r-suggests 'dash,dashHtmlComponents,jsonlite,plotly' --jl-prefix 'dcc' && black dash_core_components", "build": "run-s prepublishOnly build:js build:backends", - "postbuild": "es-check es2015 dash_core_components/*.js", + "postbuild": "es-check es2017 dash_core_components/*.js", "build:watch": "watch 'npm run build' src", "format": "run-s private::format.*", "lint": "run-s private::lint.*" @@ -126,6 +126,6 @@ "react-dom": "16 - 19" }, "browserslist": [ - "last 10 years and not dead" + "last 11 years and not dead" ] } diff --git a/dash/dcc/plotly.min.js b/dash/dcc/plotly.min.js new file mode 100644 index 0000000000..a2d579acdb --- /dev/null +++ b/dash/dcc/plotly.min.js @@ -0,0 +1,8 @@ +/** +* plotly.js v2.25.2 +* Copyright 2012-2023, Plotly, Inc. +* All rights reserved. +* Licensed under the MIT license +*/ +/*! For license information please see plotly.min.js.LICENSE.txt */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Plotly=e():t.Plotly=e()}(self,(function(){return function(){var t={98847:function(t,e,r){"use strict";var n=r(71828),i={"X,X div":'direction:ltr;font-family:"Open Sans",verdana,arial,sans-serif;margin:0;padding:0;',"X input,X button":'font-family:"Open Sans",verdana,arial,sans-serif;',"X input:focus,X button:focus":"outline:none;","X a":"text-decoration:none;","X a:hover":"text-decoration:none;","X .crisp":"shape-rendering:crispEdges;","X .user-select-none":"-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;","X svg":"overflow:hidden;","X svg a":"fill:#447adb;","X svg a:hover":"fill:#3c6dc5;","X .main-svg":"position:absolute;top:0;left:0;pointer-events:none;","X .main-svg .draglayer":"pointer-events:all;","X .cursor-default":"cursor:default;","X .cursor-pointer":"cursor:pointer;","X .cursor-crosshair":"cursor:crosshair;","X .cursor-move":"cursor:move;","X .cursor-col-resize":"cursor:col-resize;","X .cursor-row-resize":"cursor:row-resize;","X .cursor-ns-resize":"cursor:ns-resize;","X .cursor-ew-resize":"cursor:ew-resize;","X .cursor-sw-resize":"cursor:sw-resize;","X .cursor-s-resize":"cursor:s-resize;","X .cursor-se-resize":"cursor:se-resize;","X .cursor-w-resize":"cursor:w-resize;","X .cursor-e-resize":"cursor:e-resize;","X .cursor-nw-resize":"cursor:nw-resize;","X .cursor-n-resize":"cursor:n-resize;","X .cursor-ne-resize":"cursor:ne-resize;","X .cursor-grab":"cursor:-webkit-grab;cursor:grab;","X .modebar":"position:absolute;top:2px;right:2px;","X .ease-bg":"-webkit-transition:background-color .3s ease 0s;-moz-transition:background-color .3s ease 0s;-ms-transition:background-color .3s ease 0s;-o-transition:background-color .3s ease 0s;transition:background-color .3s ease 0s;","X .modebar--hover>:not(.watermark)":"opacity:0;-webkit-transition:opacity .3s ease 0s;-moz-transition:opacity .3s ease 0s;-ms-transition:opacity .3s ease 0s;-o-transition:opacity .3s ease 0s;transition:opacity .3s ease 0s;","X:hover .modebar--hover .modebar-group":"opacity:1;","X .modebar-group":"float:left;display:inline-block;box-sizing:border-box;padding-left:8px;position:relative;vertical-align:middle;white-space:nowrap;","X .modebar-btn":"position:relative;font-size:16px;padding:3px 4px;height:22px;cursor:pointer;line-height:normal;box-sizing:border-box;","X .modebar-btn svg":"position:relative;top:2px;","X .modebar.vertical":"display:flex;flex-direction:column;flex-wrap:wrap;align-content:flex-end;max-height:100%;","X .modebar.vertical svg":"top:-1px;","X .modebar.vertical .modebar-group":"display:block;float:none;padding-left:0px;padding-bottom:8px;","X .modebar.vertical .modebar-group .modebar-btn":"display:block;text-align:center;","X [data-title]:before,X [data-title]:after":"position:absolute;-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);display:none;opacity:0;z-index:1001;pointer-events:none;top:110%;right:50%;","X [data-title]:hover:before,X [data-title]:hover:after":"display:block;opacity:1;","X [data-title]:before":'content:"";position:absolute;background:rgba(0,0,0,0);border:6px solid rgba(0,0,0,0);z-index:1002;margin-top:-12px;border-bottom-color:#69738a;margin-right:-6px;',"X [data-title]:after":"content:attr(data-title);background:#69738a;color:#fff;padding:8px 10px;font-size:12px;line-height:12px;white-space:nowrap;margin-right:-18px;border-radius:2px;","X .vertical [data-title]:before,X .vertical [data-title]:after":"top:0%;right:200%;","X .vertical [data-title]:before":"border:6px solid rgba(0,0,0,0);border-left-color:#69738a;margin-top:8px;margin-right:-30px;",Y:'font-family:"Open Sans",verdana,arial,sans-serif;position:fixed;top:50px;right:20px;z-index:10000;font-size:10pt;max-width:180px;',"Y p":"margin:0;","Y .notifier-note":"min-width:180px;max-width:250px;border:1px solid #fff;z-index:3000;margin:0;background-color:#8c97af;background-color:rgba(140,151,175,.9);color:#fff;padding:10px;overflow-wrap:break-word;word-wrap:break-word;-ms-hyphens:auto;-webkit-hyphens:auto;hyphens:auto;","Y .notifier-close":"color:#fff;opacity:.8;float:right;padding:0 5px;background:none;border:none;font-size:20px;font-weight:bold;line-height:20px;","Y .notifier-close:hover":"color:#444;text-decoration:none;cursor:pointer;"};for(var a in i){var o=a.replace(/^,/," ,").replace(/X/g,".js-plotly-plot .plotly").replace(/Y/g,".plotly-notifier");n.addStyleRule(o,i[a])}},98222:function(t,e,r){"use strict";t.exports=r(82887)},27206:function(t,e,r){"use strict";t.exports=r(60822)},59893:function(t,e,r){"use strict";t.exports=r(23381)},5224:function(t,e,r){"use strict";t.exports=r(83832)},59509:function(t,e,r){"use strict";t.exports=r(72201)},75557:function(t,e,r){"use strict";t.exports=r(91815)},40338:function(t,e,r){"use strict";t.exports=r(21462)},35080:function(t,e,r){"use strict";t.exports=r(51319)},61396:function(t,e,r){"use strict";t.exports=r(57516)},40549:function(t,e,r){"use strict";t.exports=r(98128)},49866:function(t,e,r){"use strict";t.exports=r(99442)},36089:function(t,e,r){"use strict";t.exports=r(93740)},19548:function(t,e,r){"use strict";t.exports=r(8729)},35831:function(t,e,r){"use strict";t.exports=r(93814)},61039:function(t,e,r){"use strict";t.exports=r(14382)},97040:function(t,e,r){"use strict";t.exports=r(51759)},77986:function(t,e,r){"use strict";t.exports=r(10421)},24296:function(t,e,r){"use strict";t.exports=r(43102)},58872:function(t,e,r){"use strict";t.exports=r(92165)},29626:function(t,e,r){"use strict";t.exports=r(3325)},65591:function(t,e,r){"use strict";t.exports=r(36071)},69738:function(t,e,r){"use strict";t.exports=r(43905)},92650:function(t,e,r){"use strict";t.exports=r(35902)},35630:function(t,e,r){"use strict";t.exports=r(69816)},73434:function(t,e,r){"use strict";t.exports=r(94507)},27909:function(t,e,r){"use strict";var n=r(19548);n.register([r(27206),r(5224),r(58872),r(65591),r(69738),r(92650),r(49866),r(25743),r(6197),r(97040),r(85461),r(73434),r(54201),r(81299),r(47645),r(35630),r(77986),r(83043),r(93005),r(96881),r(4534),r(50581),r(40549),r(77900),r(47582),r(35080),r(21641),r(17280),r(5861),r(29626),r(10021),r(65317),r(96268),r(61396),r(35831),r(16122),r(46163),r(40344),r(40338),r(48131),r(36089),r(55334),r(75557),r(19440),r(99488),r(59893),r(97393),r(98222),r(61039),r(24296),r(66398),r(59509)]),t.exports=n},46163:function(t,e,r){"use strict";t.exports=r(15154)},96881:function(t,e,r){"use strict";t.exports=r(64943)},50581:function(t,e,r){"use strict";t.exports=r(21164)},55334:function(t,e,r){"use strict";t.exports=r(54186)},65317:function(t,e,r){"use strict";t.exports=r(94873)},10021:function(t,e,r){"use strict";t.exports=r(67618)},54201:function(t,e,r){"use strict";t.exports=r(58810)},5861:function(t,e,r){"use strict";t.exports=r(20593)},16122:function(t,e,r){"use strict";t.exports=r(29396)},83043:function(t,e,r){"use strict";t.exports=r(13551)},48131:function(t,e,r){"use strict";t.exports=r(46858)},47582:function(t,e,r){"use strict";t.exports=r(17988)},21641:function(t,e,r){"use strict";t.exports=r(68868)},96268:function(t,e,r){"use strict";t.exports=r(20467)},19440:function(t,e,r){"use strict";t.exports=r(91271)},99488:function(t,e,r){"use strict";t.exports=r(21461)},97393:function(t,e,r){"use strict";t.exports=r(85956)},25743:function(t,e,r){"use strict";t.exports=r(52979)},66398:function(t,e,r){"use strict";t.exports=r(32275)},17280:function(t,e,r){"use strict";t.exports=r(6419)},77900:function(t,e,r){"use strict";t.exports=r(61510)},81299:function(t,e,r){"use strict";t.exports=r(87619)},93005:function(t,e,r){"use strict";t.exports=r(93601)},40344:function(t,e,r){"use strict";t.exports=r(96595)},47645:function(t,e,r){"use strict";t.exports=r(70954)},6197:function(t,e,r){"use strict";t.exports=r(47462)},4534:function(t,e,r){"use strict";t.exports=r(17659)},85461:function(t,e,r){"use strict";t.exports=r(19990)},82884:function(t){"use strict";t.exports=[{path:"",backoff:0},{path:"M-2.4,-3V3L0.6,0Z",backoff:.6},{path:"M-3.7,-2.5V2.5L1.3,0Z",backoff:1.3},{path:"M-4.45,-3L-1.65,-0.2V0.2L-4.45,3L1.55,0Z",backoff:1.55},{path:"M-2.2,-2.2L-0.2,-0.2V0.2L-2.2,2.2L-1.4,3L1.6,0L-1.4,-3Z",backoff:1.6},{path:"M-4.4,-2.1L-0.6,-0.2V0.2L-4.4,2.1L-4,3L2,0L-4,-3Z",backoff:2},{path:"M2,0A2,2 0 1,1 0,-2A2,2 0 0,1 2,0Z",backoff:0,noRotate:!0},{path:"M2,2V-2H-2V2Z",backoff:0,noRotate:!0}]},50215:function(t,e,r){"use strict";var n=r(82884),i=r(41940),a=r(85555),o=r(44467).templatedArray;r(24695),t.exports=o("annotation",{visible:{valType:"boolean",dflt:!0,editType:"calc+arraydraw"},text:{valType:"string",editType:"calc+arraydraw"},textangle:{valType:"angle",dflt:0,editType:"calc+arraydraw"},font:i({editType:"calc+arraydraw",colorEditType:"arraydraw"}),width:{valType:"number",min:1,dflt:null,editType:"calc+arraydraw"},height:{valType:"number",min:1,dflt:null,editType:"calc+arraydraw"},opacity:{valType:"number",min:0,max:1,dflt:1,editType:"arraydraw"},align:{valType:"enumerated",values:["left","center","right"],dflt:"center",editType:"arraydraw"},valign:{valType:"enumerated",values:["top","middle","bottom"],dflt:"middle",editType:"arraydraw"},bgcolor:{valType:"color",dflt:"rgba(0,0,0,0)",editType:"arraydraw"},bordercolor:{valType:"color",dflt:"rgba(0,0,0,0)",editType:"arraydraw"},borderpad:{valType:"number",min:0,dflt:1,editType:"calc+arraydraw"},borderwidth:{valType:"number",min:0,dflt:1,editType:"calc+arraydraw"},showarrow:{valType:"boolean",dflt:!0,editType:"calc+arraydraw"},arrowcolor:{valType:"color",editType:"arraydraw"},arrowhead:{valType:"integer",min:0,max:n.length,dflt:1,editType:"arraydraw"},startarrowhead:{valType:"integer",min:0,max:n.length,dflt:1,editType:"arraydraw"},arrowside:{valType:"flaglist",flags:["end","start"],extras:["none"],dflt:"end",editType:"arraydraw"},arrowsize:{valType:"number",min:.3,dflt:1,editType:"calc+arraydraw"},startarrowsize:{valType:"number",min:.3,dflt:1,editType:"calc+arraydraw"},arrowwidth:{valType:"number",min:.1,editType:"calc+arraydraw"},standoff:{valType:"number",min:0,dflt:0,editType:"calc+arraydraw"},startstandoff:{valType:"number",min:0,dflt:0,editType:"calc+arraydraw"},ax:{valType:"any",editType:"calc+arraydraw"},ay:{valType:"any",editType:"calc+arraydraw"},axref:{valType:"enumerated",dflt:"pixel",values:["pixel",a.idRegex.x.toString()],editType:"calc"},ayref:{valType:"enumerated",dflt:"pixel",values:["pixel",a.idRegex.y.toString()],editType:"calc"},xref:{valType:"enumerated",values:["paper",a.idRegex.x.toString()],editType:"calc"},x:{valType:"any",editType:"calc+arraydraw"},xanchor:{valType:"enumerated",values:["auto","left","center","right"],dflt:"auto",editType:"calc+arraydraw"},xshift:{valType:"number",dflt:0,editType:"calc+arraydraw"},yref:{valType:"enumerated",values:["paper",a.idRegex.y.toString()],editType:"calc"},y:{valType:"any",editType:"calc+arraydraw"},yanchor:{valType:"enumerated",values:["auto","top","middle","bottom"],dflt:"auto",editType:"calc+arraydraw"},yshift:{valType:"number",dflt:0,editType:"calc+arraydraw"},clicktoshow:{valType:"enumerated",values:[!1,"onoff","onout"],dflt:!1,editType:"arraydraw"},xclick:{valType:"any",editType:"arraydraw"},yclick:{valType:"any",editType:"arraydraw"},hovertext:{valType:"string",editType:"arraydraw"},hoverlabel:{bgcolor:{valType:"color",editType:"arraydraw"},bordercolor:{valType:"color",editType:"arraydraw"},font:i({editType:"arraydraw"}),editType:"arraydraw"},captureevents:{valType:"boolean",editType:"arraydraw"},editType:"calc",_deprecated:{ref:{valType:"string",editType:"calc"}}})},3749:function(t,e,r){"use strict";var n=r(71828),i=r(89298),a=r(92605).draw;function o(t){var e=t._fullLayout;n.filterVisible(e.annotations).forEach((function(e){var r=i.getFromId(t,e.xref),n=i.getFromId(t,e.yref),a=i.getRefType(e.xref),o=i.getRefType(e.yref);e._extremes={},"range"===a&&s(e,r),"range"===o&&s(e,n)}))}function s(t,e){var r,n=e._id,a=n.charAt(0),o=t[a],s=t["a"+a],l=t[a+"ref"],u=t["a"+a+"ref"],c=t["_"+a+"padplus"],f=t["_"+a+"padminus"],h={x:1,y:-1}[a]*t[a+"shift"],p=3*t.arrowsize*t.arrowwidth||0,d=p+h,v=p-h,g=3*t.startarrowsize*t.arrowwidth||0,y=g+h,m=g-h;if(u===l){var x=i.findExtremes(e,[e.r2c(o)],{ppadplus:d,ppadminus:v}),b=i.findExtremes(e,[e.r2c(s)],{ppadplus:Math.max(c,y),ppadminus:Math.max(f,m)});r={min:[x.min[0],b.min[0]],max:[x.max[0],b.max[0]]}}else y=s?y+s:y,m=s?m-s:m,r=i.findExtremes(e,[e.r2c(o)],{ppadplus:Math.max(c,d,y),ppadminus:Math.max(f,v,m)});t._extremes[n]=r}t.exports=function(t){var e=t._fullLayout;if(n.filterVisible(e.annotations).length&&t._fullData.length)return n.syncOrAsync([a,o],t)}},44317:function(t,e,r){"use strict";var n=r(71828),i=r(73972),a=r(44467).arrayEditor;function o(t,e){var r,n,i,a,o,l,u,c=t._fullLayout.annotations,f=[],h=[],p=[],d=(e||[]).length;for(r=0;r0||r.explicitOff.length>0},onClick:function(t,e){var r,s,l=o(t,e),u=l.on,c=l.off.concat(l.explicitOff),f={},h=t._fullLayout.annotations;if(u.length||c.length){for(r=0;r2/3?"right":"center"),{center:0,middle:0,left:.5,bottom:-.5,right:-.5,top:.5}[e]}for(var Y=!1,W=["x","y"],X=0;X1)&&(nt===rt?((pt=it.r2fraction(e["a"+et]))<0||pt>1)&&(Y=!0):Y=!0),J=it._offset+it.r2p(e[et]),Q=.5}else{var dt="domain"===ht;"x"===et?($=e[et],J=dt?it._offset+it._length*$:J=T.l+T.w*$):($=1-e[et],J=dt?it._offset+it._length*$:J=T.t+T.h*$),Q=e.showarrow?.5:$}if(e.showarrow){ft.head=J;var vt=e["a"+et];if(tt=ot*q(.5,e.xanchor)-st*q(.5,e.yanchor),nt===rt){var gt=l.getRefType(nt);"domain"===gt?("y"===et&&(vt=1-vt),ft.tail=it._offset+it._length*vt):"paper"===gt?"y"===et?(vt=1-vt,ft.tail=T.t+T.h*vt):ft.tail=T.l+T.w*vt:ft.tail=it._offset+it.r2p(vt),K=tt}else ft.tail=J+vt,K=tt+vt;ft.text=ft.tail+tt;var yt=w["x"===et?"width":"height"];if("paper"===rt&&(ft.head=o.constrain(ft.head,1,yt-1)),"pixel"===nt){var mt=-Math.max(ft.tail-3,ft.text),xt=Math.min(ft.tail+3,ft.text)-yt;mt>0?(ft.tail+=mt,ft.text+=mt):xt>0&&(ft.tail-=xt,ft.text-=xt)}ft.tail+=ct,ft.head+=ct}else K=tt=lt*q(Q,ut),ft.text=J+tt;ft.text+=ct,tt+=ct,K+=ct,e["_"+et+"padplus"]=lt/2+K,e["_"+et+"padminus"]=lt/2-K,e["_"+et+"size"]=lt,e["_"+et+"shift"]=tt}if(Y)R.remove();else{var bt=0,_t=0;if("left"!==e.align&&(bt=(A-b)*("center"===e.align?.5:1)),"top"!==e.valign&&(_t=(z-_)*("middle"===e.valign?.5:1)),f)n.select("svg").attr({x:N+bt-1,y:N+_t}).call(c.setClipUrl,U?L:null,t);else{var wt=N+_t-v.top,Tt=N+bt-v.left;G.call(h.positionText,Tt,wt).call(c.setClipUrl,U?L:null,t)}V.select("rect").call(c.setRect,N,N,A,z),j.call(c.setRect,F/2,F/2,B-F,H-F),R.call(c.setTranslate,Math.round(C.x.text-B/2),Math.round(C.y.text-H/2)),I.attr({transform:"rotate("+P+","+C.x.text+","+C.y.text+")"});var kt,At=function(r,n){O.selectAll(".annotation-arrow-g").remove();var l=C.x.head,f=C.y.head,h=C.x.tail+r,p=C.y.tail+n,v=C.x.text+r,b=C.y.text+n,_=o.rotationXYMatrix(P,v,b),w=o.apply2DTransform(_),A=o.apply2DTransform2(_),L=+j.attr("width"),D=+j.attr("height"),z=v-.5*L,F=z+L,B=b-.5*D,N=B+D,U=[[z,B,z,N],[z,N,F,N],[F,N,F,B],[F,B,z,B]].map(A);if(!U.reduce((function(t,e){return t^!!o.segmentsIntersect(l,f,l+1e6,f+1e6,e[0],e[1],e[2],e[3])}),!1)){U.forEach((function(t){var e=o.segmentsIntersect(h,p,l,f,t[0],t[1],t[2],t[3]);e&&(h=e.x,p=e.y)}));var V=e.arrowwidth,H=e.arrowcolor,q=e.arrowside,G=O.append("g").style({opacity:u.opacity(H)}).classed("annotation-arrow-g",!0),Z=G.append("path").attr("d","M"+h+","+p+"L"+l+","+f).style("stroke-width",V+"px").call(u.stroke,u.rgb(H));if(g(Z,q,e),k.annotationPosition&&Z.node().parentNode&&!a){var Y=l,W=f;if(e.standoff){var X=Math.sqrt(Math.pow(l-h,2)+Math.pow(f-p,2));Y+=e.standoff*(h-l)/X,W+=e.standoff*(p-f)/X}var J,K,$=G.append("path").classed("annotation-arrow",!0).classed("anndrag",!0).classed("cursor-move",!0).attr({d:"M3,3H-3V-3H3ZM0,0L"+(h-Y)+","+(p-W),transform:s(Y,W)}).style("stroke-width",V+6+"px").call(u.stroke,"rgba(0,0,0,0)").call(u.fill,"rgba(0,0,0,0)");d.init({element:$.node(),gd:t,prepFn:function(){var t=c.getTranslate(R);J=t.x,K=t.y,y&&y.autorange&&M(y._name+".autorange",!0),x&&x.autorange&&M(x._name+".autorange",!0)},moveFn:function(t,r){var n=w(J,K),i=n[0]+t,a=n[1]+r;R.call(c.setTranslate,i,a),S("x",m(y,t,"x",T,e)),S("y",m(x,r,"y",T,e)),e.axref===e.xref&&S("ax",m(y,t,"ax",T,e)),e.ayref===e.yref&&S("ay",m(x,r,"ay",T,e)),G.attr("transform",s(t,r)),I.attr({transform:"rotate("+P+","+i+","+a+")"})},doneFn:function(){i.call("_guiRelayout",t,E());var e=document.querySelector(".js-notes-box-panel");e&&e.redraw(e.selectedObj)}})}}};e.showarrow&&At(0,0),D&&d.init({element:R.node(),gd:t,prepFn:function(){kt=I.attr("transform")},moveFn:function(t,r){var n="pointer";if(e.showarrow)e.axref===e.xref?S("ax",m(y,t,"ax",T,e)):S("ax",e.ax+t),e.ayref===e.yref?S("ay",m(x,r,"ay",T.w,e)):S("ay",e.ay+r),At(t,r);else{if(a)return;var i,o;if(y)i=m(y,t,"x",T,e);else{var l=e._xsize/T.w,u=e.x+(e._xshift-e.xshift)/T.w-l/2;i=d.align(u+t/T.w,l,0,1,e.xanchor)}if(x)o=m(x,r,"y",T,e);else{var c=e._ysize/T.h,f=e.y-(e._yshift+e.yshift)/T.h-c/2;o=d.align(f-r/T.h,c,0,1,e.yanchor)}S("x",i),S("y",o),y&&x||(n=d.getCursor(y?.5:i,x?.5:o,e.xanchor,e.yanchor))}I.attr({transform:s(t,r)+kt}),p(R,n)},clickFn:function(r,n){e.captureevents&&t.emit("plotly_clickannotation",Z(n))},doneFn:function(){p(R),i.call("_guiRelayout",t,E());var e=document.querySelector(".js-notes-box-panel");e&&e.redraw(e.selectedObj)}})}}}t.exports={draw:function(t){var e=t._fullLayout;e._infolayer.selectAll(".annotation").remove();for(var r=0;r=0,x=e.indexOf("end")>=0,b=d.backoff*g+r.standoff,_=v.backoff*y+r.startstandoff;if("line"===p.nodeName){o={x:+t.attr("x1"),y:+t.attr("y1")},c={x:+t.attr("x2"),y:+t.attr("y2")};var w=o.x-c.x,T=o.y-c.y;if(h=(f=Math.atan2(T,w))+Math.PI,b&&_&&b+_>Math.sqrt(w*w+T*T))return void D();if(b){if(b*b>w*w+T*T)return void D();var k=b*Math.cos(f),A=b*Math.sin(f);c.x+=k,c.y+=A,t.attr({x2:c.x,y2:c.y})}if(_){if(_*_>w*w+T*T)return void D();var M=_*Math.cos(f),S=_*Math.sin(f);o.x-=M,o.y-=S,t.attr({x1:o.x,y1:o.y})}}else if("path"===p.nodeName){var E=p.getTotalLength(),L="";if(E1){u=!0;break}}u?t.fullLayout._infolayer.select(".annotation-"+t.id+'[data-index="'+s+'"]').remove():(l._pdata=i(t.glplot.cameraParams,[e.xaxis.r2l(l.x)*r[0],e.yaxis.r2l(l.y)*r[1],e.zaxis.r2l(l.z)*r[2]]),n(t.graphDiv,l,s,t.id,l._xa,l._ya))}}},2468:function(t,e,r){"use strict";var n=r(73972),i=r(71828);t.exports={moduleType:"component",name:"annotations3d",schema:{subplots:{scene:{annotations:r(26997)}}},layoutAttributes:r(26997),handleDefaults:r(20226),includeBasePlot:function(t,e){var r=n.subplotsRegistry.gl3d;if(r)for(var a=r.attrRegex,o=Object.keys(t),s=0;s=0))return t;if(3===o)n[o]>1&&(n[o]=1);else if(n[o]>=1)return t}var s=Math.round(255*n[0])+", "+Math.round(255*n[1])+", "+Math.round(255*n[2]);return a?"rgba("+s+", "+n[3]+")":"rgb("+s+")"}o.tinyRGB=function(t){var e=t.toRgb();return"rgb("+Math.round(e.r)+", "+Math.round(e.g)+", "+Math.round(e.b)+")"},o.rgb=function(t){return o.tinyRGB(n(t))},o.opacity=function(t){return t?n(t).getAlpha():0},o.addOpacity=function(t,e){var r=n(t).toRgb();return"rgba("+Math.round(r.r)+", "+Math.round(r.g)+", "+Math.round(r.b)+", "+e+")"},o.combine=function(t,e){var r=n(t).toRgb();if(1===r.a)return n(t).toRgbString();var i=n(e||u).toRgb(),a=1===i.a?i:{r:255*(1-i.a)+i.r*i.a,g:255*(1-i.a)+i.g*i.a,b:255*(1-i.a)+i.b*i.a},o={r:a.r*(1-r.a)+r.r*r.a,g:a.g*(1-r.a)+r.g*r.a,b:a.b*(1-r.a)+r.b*r.a};return n(o).toRgbString()},o.contrast=function(t,e,r){var i=n(t);return 1!==i.getAlpha()&&(i=n(o.combine(t,u))),(i.isDark()?e?i.lighten(e):u:r?i.darken(r):l).toString()},o.stroke=function(t,e){var r=n(e);t.style({stroke:o.tinyRGB(r),"stroke-opacity":r.getAlpha()})},o.fill=function(t,e){var r=n(e);t.style({fill:o.tinyRGB(r),"fill-opacity":r.getAlpha()})},o.clean=function(t){if(t&&"object"==typeof t){var e,r,n,i,s=Object.keys(t);for(e=0;e0?n>=l:n<=l));i++)n>c&&n0?n>=l:n<=l));i++)n>r[0]&&n1){var pt=Math.pow(10,Math.floor(Math.log(ht)/Math.LN10));ct*=pt*u.roundUp(ht/pt,[2,5,10]),(Math.abs(Z.start)/Z.size+1e-6)%1<2e-6&&(lt.tick0=0)}lt.dtick=ct}lt.domain=o?[ot+O/B.h,ot+Q-O/B.h]:[ot+P/B.w,ot+Q-P/B.w],lt.setScale(),t.attr("transform",c(Math.round(B.l),Math.round(B.t)));var dt,vt=t.select("."+A.cbtitleunshift).attr("transform",c(-Math.round(B.l),-Math.round(B.t))),gt=lt.ticklabelposition,yt=lt.title.font.size,mt=t.select("."+A.cbaxis),xt=0,bt=0;function _t(n,i){var a={propContainer:lt,propName:e._propPrefix+"title",traceIndex:e._traceIndex,_meta:e._meta,placeholder:F._dfltTitle.colorbar,containerGroup:t.select("."+A.cbtitle)},o="h"===n.charAt(0)?n.substr(1):"h"+n;t.selectAll("."+o+",."+o+"-math-group").remove(),v.draw(r,n,f(a,i||{}))}return u.syncOrAsync([a.previousPromises,function(){var t,e;(o&&ut||!o&&!ut)&&("top"===V&&(t=P+B.l+tt*I,e=O+B.t+et*(1-ot-Q)+3+.75*yt),"bottom"===V&&(t=P+B.l+tt*I,e=O+B.t+et*(1-ot)-3-.25*yt),"right"===V&&(e=O+B.t+et*D+3+.75*yt,t=P+B.l+tt*ot),_t(lt._id+"title",{attributes:{x:t,y:e,"text-anchor":o?"start":"middle"}}))},function(){if(!o&&!ut||o&&ut){var a,l=t.select("."+A.cbtitle),f=l.select("text"),h=[-M/2,M/2],d=l.select(".h"+lt._id+"title-math-group").node(),v=15.6;if(f.node()&&(v=parseInt(f.node().style.fontSize,10)*w),d?(a=p.bBox(d),bt=a.width,(xt=a.height)>v&&(h[1]-=(xt-v)/2)):f.node()&&!f.classed(A.jsPlaceholder)&&(a=p.bBox(f.node()),bt=a.width,xt=a.height),o){if(xt){if(xt+=5,"top"===V)lt.domain[1]-=xt/B.h,h[1]*=-1;else{lt.domain[0]+=xt/B.h;var y=g.lineCount(f);h[1]+=(1-y)*v}l.attr("transform",c(h[0],h[1])),lt.setScale()}}else bt&&("right"===V&&(lt.domain[0]+=(bt+yt/2)/B.w),l.attr("transform",c(h[0],h[1])),lt.setScale())}t.selectAll("."+A.cbfills+",."+A.cblines).attr("transform",o?c(0,Math.round(B.h*(1-lt.domain[1]))):c(Math.round(B.w*lt.domain[0]),0)),mt.attr("transform",o?c(0,Math.round(-B.t)):c(Math.round(-B.l),0));var m=t.select("."+A.cbfills).selectAll("rect."+A.cbfill).attr("style","").data(W);m.enter().append("rect").classed(A.cbfill,!0).attr("style",""),m.exit().remove();var x=H.map(lt.c2p).map(Math.round).sort((function(t,e){return t-e}));m.each((function(t,a){var s=[0===a?H[0]:(W[a]+W[a-1])/2,a===W.length-1?H[1]:(W[a]+W[a+1])/2].map(lt.c2p).map(Math.round);o&&(s[1]=u.constrain(s[1]+(s[1]>s[0])?1:-1,x[0],x[1]));var l=n.select(this).attr(o?"x":"y",rt).attr(o?"y":"x",n.min(s)).attr(o?"width":"height",Math.max(J,2)).attr(o?"height":"width",Math.max(n.max(s)-n.min(s),2));if(e._fillgradient)p.gradient(l,r,e._id,o?"vertical":"horizontalreversed",e._fillgradient,"fill");else{var c=G(t).replace("e-","");l.attr("fill",i(c).toHexString())}}));var b=t.select("."+A.cblines).selectAll("path."+A.cbline).data(j.color&&j.width?X:[]);b.enter().append("path").classed(A.cbline,!0),b.exit().remove(),b.each((function(t){var e=rt,r=Math.round(lt.c2p(t))+j.width/2%1;n.select(this).attr("d","M"+(o?e+","+r:r+","+e)+(o?"h":"v")+J).call(p.lineGroupStyle,j.width,q(t),j.dash)})),mt.selectAll("g."+lt._id+"tick,path").remove();var _=rt+J+(M||0)/2-("outside"===e.ticks?1:0),T=s.calcTicks(lt),k=s.getTickSigns(lt)[2];return s.drawTicks(r,lt,{vals:"inside"===lt.ticks?s.clipEnds(lt,T):T,layer:mt,path:s.makeTickPath(lt,_,k),transFn:s.makeTransTickFn(lt)}),s.drawLabels(r,lt,{vals:T,layer:mt,transFn:s.makeTransTickLabelFn(lt),labelFns:s.makeLabelFns(lt,_)})},function(){if(o&&!ut||!o&&ut){var t,i,a=lt.position||0,s=lt._offset+lt._length/2;if("right"===V)i=s,t=B.l+tt*a+10+yt*(lt.showticklabels?1:.5);else if(t=s,"bottom"===V&&(i=B.t+et*a+10+(-1===gt.indexOf("inside")?lt.tickfont.size:0)+("intside"!==lt.ticks&&e.ticklen||0)),"top"===V){var l=U.text.split("
").length;i=B.t+et*a+10-J-w*yt*l}_t((o?"h":"v")+lt._id+"title",{avoid:{selection:n.select(r).selectAll("g."+lt._id+"tick"),side:V,offsetTop:o?0:B.t,offsetLeft:o?B.l:0,maxShift:o?F.width:F.height},attributes:{x:t,y:i,"text-anchor":"middle"},transform:{rotate:o?-90:0,offset:0}})}},a.previousPromises,function(){var n,s=J+M/2;-1===gt.indexOf("inside")&&(n=p.bBox(mt.node()),s+=o?n.width:n.height),dt=vt.select("text");var u=0,f=o&&"top"===V,v=!o&&"right"===V,g=0;if(dt.node()&&!dt.classed(A.jsPlaceholder)){var m,x=vt.select(".h"+lt._id+"title-math-group").node();x&&(o&&ut||!o&&!ut)?(u=(n=p.bBox(x)).width,m=n.height):(u=(n=p.bBox(vt.node())).right-B.l-(o?rt:st),m=n.bottom-B.t-(o?st:rt),o||"top"!==V||(s+=n.height,g=n.height)),v&&(dt.attr("transform",c(u/2+yt/2,0)),u*=2),s=Math.max(s,o?u:m)}var b=2*(o?P:O)+s+S+M/2,w=0;!o&&U.text&&"bottom"===C&&D<=0&&(b+=w=b/2,g+=w),F._hColorbarMoveTitle=w,F._hColorbarMoveCBTitle=g;var N=S+M,j=(o?rt:st)-N/2-(o?P:0),H=(o?st:rt)-(o?$:O+g-w);t.select("."+A.cbbg).attr("x",j).attr("y",H).attr(o?"width":"height",Math.max(b-w,2)).attr(o?"height":"width",Math.max($+N,2)).call(d.fill,E).call(d.stroke,e.bordercolor).style("stroke-width",S);var q=v?Math.max(u-10,0):0;t.selectAll("."+A.cboutline).attr("x",(o?rt:st+P)+q).attr("y",(o?st+O-$:rt)+(f?xt:0)).attr(o?"width":"height",Math.max(J,2)).attr(o?"height":"width",Math.max($-(o?2*O+xt:2*P+q),2)).call(d.stroke,e.outlinecolor).style({fill:"none","stroke-width":M});var G=o?nt*b:0,Z=o?0:(1-it)*b-g;if(G=R?B.l-G:-G,Z=z?B.t-Z:-Z,t.attr("transform",c(G,Z)),!o&&(S||i(E).getAlpha()&&!i.equals(F.paper_bgcolor,E))){var Y=mt.selectAll("text"),W=Y[0].length,X=t.select("."+A.cbbg).node(),K=p.bBox(X),Q=p.getTranslate(t);Y.each((function(t,e){var r=W-1;if(0===e||e===r){var n,i=p.bBox(this),a=p.getTranslate(this);if(e===r){var o=i.right+a.x;(n=K.right+Q.x+st-S-2+I-o)>0&&(n=0)}else if(0===e){var s=i.left+a.x;(n=K.left+Q.x+st+S+2-s)<0&&(n=0)}n&&(W<3?this.setAttribute("transform","translate("+n+",0) "+this.getAttribute("transform")):this.setAttribute("visibility","hidden"))}}))}var tt={},et=T[L],at=k[L],ot=T[C],ct=k[C],ft=b-J;o?("pixels"===h?(tt.y=D,tt.t=$*ot,tt.b=$*ct):(tt.t=tt.b=0,tt.yt=D+l*ot,tt.yb=D-l*ct),"pixels"===_?(tt.x=I,tt.l=b*et,tt.r=b*at):(tt.l=ft*et,tt.r=ft*at,tt.xl=I-y*et,tt.xr=I+y*at)):("pixels"===h?(tt.x=I,tt.l=$*et,tt.r=$*at):(tt.l=tt.r=0,tt.xl=I+l*et,tt.xr=I-l*at),"pixels"===_?(tt.y=1-D,tt.t=b*ot,tt.b=b*ct):(tt.t=ft*ot,tt.b=ft*ct,tt.yt=D-y*ot,tt.yb=D+y*ct));var ht=e.y<.5?"b":"t",pt=e.x<.5?"l":"r";r._fullLayout._reservedMargin[e._id]={};var bt={r:F.width-j-G,l:j+tt.r,b:F.height-H-Z,t:H+tt.b};R&&z?a.autoMargin(r,e._id,tt):R?r._fullLayout._reservedMargin[e._id][ht]=bt[ht]:z||o?r._fullLayout._reservedMargin[e._id][pt]=bt[pt]:r._fullLayout._reservedMargin[e._id][ht]=bt[ht]}],r)}(r,e,t);y&&y.then&&(t._promises||[]).push(y),t._context.edits.colorbarPosition&&function(t,e,r){var n,i,a,s="v"===e.orientation,u=r._fullLayout._size;l.init({element:t.node(),gd:r,prepFn:function(){n=t.attr("transform"),h(t)},moveFn:function(r,o){t.attr("transform",n+c(r,o)),i=l.align((s?e._uFrac:e._vFrac)+r/u.w,s?e._thickFrac:e._lenFrac,0,1,e.xanchor),a=l.align((s?e._vFrac:1-e._uFrac)-o/u.h,s?e._lenFrac:e._thickFrac,0,1,e.yanchor);var f=l.getCursor(i,a,e.xanchor,e.yanchor);h(t,f)},doneFn:function(){if(h(t),void 0!==i&&void 0!==a){var n={};n[e._propPrefix+"x"]=i,n[e._propPrefix+"y"]=a,void 0!==e._traceIndex?o.call("_guiRestyle",r,n,e._traceIndex):o.call("_guiRelayout",r,n)}}})}(r,e,t)})),e.exit().each((function(e){a.autoMargin(t,e._id)})).remove(),e.order()}}},76228:function(t,e,r){"use strict";var n=r(71828);t.exports=function(t){return n.isPlainObject(t.colorbar)}},12311:function(t,e,r){"use strict";t.exports={moduleType:"component",name:"colorbar",attributes:r(63583),supplyDefaults:r(62499),draw:r(98981).draw,hasColorbar:r(76228)}},50693:function(t,e,r){"use strict";var n=r(63583),i=r(30587).counter,a=r(78607),o=r(63282).scales;function s(t){return"`"+t+"`"}a(o),t.exports=function(t,e){t=t||"";var r,a=(e=e||{}).cLetter||"c",l=("onlyIfNumerical"in e?e.onlyIfNumerical:Boolean(t),"noScale"in e?e.noScale:"marker.line"===t),u="showScaleDflt"in e?e.showScaleDflt:"z"===a,c="string"==typeof e.colorscaleDflt?o[e.colorscaleDflt]:null,f=e.editTypeOverride||"",h=t?t+".":"";"colorAttr"in e?(r=e.colorAttr,e.colorAttr):s(h+(r={z:"z",c:"color"}[a]));var p=a+"auto",d=a+"min",v=a+"max",g=a+"mid",y=(s(h+p),s(h+d),s(h+v),{});y[d]=y[v]=void 0;var m={};m[p]=!1;var x={};return"color"===r&&(x.color={valType:"color",arrayOk:!0,editType:f||"style"},e.anim&&(x.color.anim=!0)),x[p]={valType:"boolean",dflt:!0,editType:"calc",impliedEdits:y},x[d]={valType:"number",dflt:null,editType:f||"plot",impliedEdits:m},x[v]={valType:"number",dflt:null,editType:f||"plot",impliedEdits:m},x[g]={valType:"number",dflt:null,editType:"calc",impliedEdits:y},x.colorscale={valType:"colorscale",editType:"calc",dflt:c,impliedEdits:{autocolorscale:!1}},x.autocolorscale={valType:"boolean",dflt:!1!==e.autoColorDflt,editType:"calc",impliedEdits:{colorscale:void 0}},x.reversescale={valType:"boolean",dflt:!1,editType:"plot"},l||(x.showscale={valType:"boolean",dflt:u,editType:"calc"},x.colorbar=n),e.noColorAxis||(x.coloraxis={valType:"subplotid",regex:i("coloraxis"),dflt:null,editType:"calc"}),x}},78803:function(t,e,r){"use strict";var n=r(92770),i=r(71828),a=r(52075).extractOpts;t.exports=function(t,e,r){var o,s=t._fullLayout,l=r.vals,u=r.containerStr,c=u?i.nestedProperty(e,u).get():e,f=a(c),h=!1!==f.auto,p=f.min,d=f.max,v=f.mid,g=function(){return i.aggNums(Math.min,null,l)},y=function(){return i.aggNums(Math.max,null,l)};void 0===p?p=g():h&&(p=c._colorAx&&n(p)?Math.min(p,g()):g()),void 0===d?d=y():h&&(d=c._colorAx&&n(d)?Math.max(d,y()):y()),h&&void 0!==v&&(d-v>v-p?p=v-(d-v):d-v=0?s.colorscale.sequential:s.colorscale.sequentialminus,f._sync("colorscale",o))}},33046:function(t,e,r){"use strict";var n=r(71828),i=r(52075).hasColorscale,a=r(52075).extractOpts;t.exports=function(t,e){function r(t,e){var r=t["_"+e];void 0!==r&&(t[e]=r)}function o(t,i){var o=i.container?n.nestedProperty(t,i.container).get():t;if(o)if(o.coloraxis)o._colorAx=e[o.coloraxis];else{var s=a(o),l=s.auto;(l||void 0===s.min)&&r(o,i.min),(l||void 0===s.max)&&r(o,i.max),s.autocolorscale&&r(o,"colorscale")}}for(var s=0;s=0;n--,i++){var a=t[n];r[i]=[1-a[0],a[1]]}return r}function d(t,e){e=e||{};for(var r=t.domain,o=t.range,l=o.length,u=new Array(l),c=0;c4/3-s?o:s}},70461:function(t,e,r){"use strict";var n=r(71828),i=[["sw-resize","s-resize","se-resize"],["w-resize","move","e-resize"],["nw-resize","n-resize","ne-resize"]];t.exports=function(t,e,r,a){return t="left"===r?0:"center"===r?1:"right"===r?2:n.constrain(Math.floor(3*t),0,2),e="bottom"===a?0:"middle"===a?1:"top"===a?2:n.constrain(Math.floor(3*e),0,2),i[e][t]}},64505:function(t,e){"use strict";e.selectMode=function(t){return"lasso"===t||"select"===t},e.drawMode=function(t){return"drawclosedpath"===t||"drawopenpath"===t||"drawline"===t||"drawrect"===t||"drawcircle"===t},e.openMode=function(t){return"drawline"===t||"drawopenpath"===t},e.rectMode=function(t){return"select"===t||"drawline"===t||"drawrect"===t||"drawcircle"===t},e.freeMode=function(t){return"lasso"===t||"drawclosedpath"===t||"drawopenpath"===t},e.selectingOrDrawing=function(t){return e.freeMode(t)||e.rectMode(t)}},28569:function(t,e,r){"use strict";var n=r(48956),i=r(57035),a=r(38520),o=r(71828).removeElement,s=r(85555),l=t.exports={};l.align=r(92807),l.getCursor=r(70461);var u=r(26041);function c(){var t=document.createElement("div");t.className="dragcover";var e=t.style;return e.position="fixed",e.left=0,e.right=0,e.top=0,e.bottom=0,e.zIndex=999999999,e.background="none",document.body.appendChild(t),t}function f(t){return n(t.changedTouches?t.changedTouches[0]:t,document.body)}l.unhover=u.wrapped,l.unhoverRaw=u.raw,l.init=function(t){var e,r,n,u,h,p,d,v,g=t.gd,y=1,m=g._context.doubleClickDelay,x=t.element;g._mouseDownTime||(g._mouseDownTime=0),x.style.pointerEvents="all",x.onmousedown=_,a?(x._ontouchstart&&x.removeEventListener("touchstart",x._ontouchstart),x._ontouchstart=_,x.addEventListener("touchstart",_,{passive:!1})):x.ontouchstart=_;var b=t.clampFn||function(t,e,r){return Math.abs(t)m&&(y=Math.max(y-1,1)),g._dragged)t.doneFn&&t.doneFn();else if(t.clickFn&&t.clickFn(y,p),!v){var r;try{r=new MouseEvent("click",e)}catch(t){var n=f(e);(r=document.createEvent("MouseEvents")).initMouseEvent("click",e.bubbles,e.cancelable,e.view,e.detail,e.screenX,e.screenY,n[0],n[1],e.ctrlKey,e.altKey,e.shiftKey,e.metaKey,e.button,e.relatedTarget)}d.dispatchEvent(r)}g._dragging=!1,g._dragged=!1}else g._dragged=!1}},l.coverSlip=c},26041:function(t,e,r){"use strict";var n=r(11086),i=r(79990),a=r(24401).getGraphDiv,o=r(26675),s=t.exports={};s.wrapped=function(t,e,r){(t=a(t))._fullLayout&&i.clear(t._fullLayout._uid+o.HOVERID),s.raw(t,e,r)},s.raw=function(t,e){var r=t._fullLayout,i=t._hoverdata;e||(e={}),e.target&&!t._dragged&&!1===n.triggerHandler(t,"plotly_beforehover",e)||(r._hoverlayer.selectAll("g").remove(),r._hoverlayer.selectAll("line").remove(),r._hoverlayer.selectAll("circle").remove(),t._hoverdata=void 0,e.target&&i&&t.emit("plotly_unhover",{event:e,points:i}))}},79952:function(t,e){"use strict";e.P={valType:"string",values:["solid","dot","dash","longdash","dashdot","longdashdot"],dflt:"solid",editType:"style"},e.u={shape:{valType:"enumerated",values:["","/","\\","x","-","|","+","."],dflt:"",arrayOk:!0,editType:"style"},fillmode:{valType:"enumerated",values:["replace","overlay"],dflt:"replace",editType:"style"},bgcolor:{valType:"color",arrayOk:!0,editType:"style"},fgcolor:{valType:"color",arrayOk:!0,editType:"style"},fgopacity:{valType:"number",editType:"style",min:0,max:1},size:{valType:"number",min:0,dflt:8,arrayOk:!0,editType:"style"},solidity:{valType:"number",min:0,max:1,dflt:.3,arrayOk:!0,editType:"style"},editType:"style"}},91424:function(t,e,r){"use strict";var n=r(39898),i=r(71828),a=i.numberFormat,o=r(92770),s=r(84267),l=r(73972),u=r(7901),c=r(21081),f=i.strTranslate,h=r(63893),p=r(77922),d=r(18783).LINE_SPACING,v=r(37822).DESELECTDIM,g=r(34098),y=r(39984),m=r(23469).appendArrayPointValue,x=t.exports={};function b(t,e,r){var n=e.fillpattern,i=n&&x.getPatternAttr(n.shape,0,"");if(i){var a=x.getPatternAttr(n.bgcolor,0,null),o=x.getPatternAttr(n.fgcolor,0,null),s=n.fgopacity,l=x.getPatternAttr(n.size,0,8),c=x.getPatternAttr(n.solidity,0,.3),f=e.uid;x.pattern(t,"point",r,f,i,l,c,void 0,n.fillmode,a,o,s)}else e.fillcolor&&t.call(u.fill,e.fillcolor)}x.font=function(t,e,r,n){i.isPlainObject(e)&&(n=e.color,r=e.size,e=e.family),e&&t.style("font-family",e),r+1&&t.style("font-size",r+"px"),n&&t.call(u.fill,n)},x.setPosition=function(t,e,r){t.attr("x",e).attr("y",r)},x.setSize=function(t,e,r){t.attr("width",e).attr("height",r)},x.setRect=function(t,e,r,n,i){t.call(x.setPosition,e,r).call(x.setSize,n,i)},x.translatePoint=function(t,e,r,n){var i=r.c2p(t.x),a=n.c2p(t.y);return!!(o(i)&&o(a)&&e.node())&&("text"===e.node().nodeName?e.attr("x",i).attr("y",a):e.attr("transform",f(i,a)),!0)},x.translatePoints=function(t,e,r){t.each((function(t){var i=n.select(this);x.translatePoint(t,i,e,r)}))},x.hideOutsideRangePoint=function(t,e,r,n,i,a){e.attr("display",r.isPtWithinRange(t,i)&&n.isPtWithinRange(t,a)?null:"none")},x.hideOutsideRangePoints=function(t,e){if(e._hasClipOnAxisFalse){var r=e.xaxis,i=e.yaxis;t.each((function(e){var a=e[0].trace,o=a.xcalendar,s=a.ycalendar,u=l.traceIs(a,"bar-like")?".bartext":".point,.textpoint";t.selectAll(u).each((function(t){x.hideOutsideRangePoint(t,n.select(this),r,i,o,s)}))}))}},x.crispRound=function(t,e,r){return e&&o(e)?t._context.staticPlot?e:e<1?1:Math.round(e):r||0},x.singleLineStyle=function(t,e,r,n,i){e.style("fill","none");var a=(((t||[])[0]||{}).trace||{}).line||{},o=r||a.width||0,s=i||a.dash||"";u.stroke(e,n||a.color),x.dashLine(e,s,o)},x.lineGroupStyle=function(t,e,r,i){t.style("fill","none").each((function(t){var a=(((t||[])[0]||{}).trace||{}).line||{},o=e||a.width||0,s=i||a.dash||"";n.select(this).call(u.stroke,r||a.color).call(x.dashLine,s,o)}))},x.dashLine=function(t,e,r){r=+r||0,e=x.dashStyle(e,r),t.style({"stroke-dasharray":e,"stroke-width":r+"px"})},x.dashStyle=function(t,e){e=+e||1;var r=Math.max(e,3);return"solid"===t?t="":"dot"===t?t=r+"px,"+r+"px":"dash"===t?t=3*r+"px,"+3*r+"px":"longdash"===t?t=5*r+"px,"+5*r+"px":"dashdot"===t?t=3*r+"px,"+r+"px,"+r+"px,"+r+"px":"longdashdot"===t&&(t=5*r+"px,"+2*r+"px,"+r+"px,"+2*r+"px"),t},x.singleFillStyle=function(t,e){var r=n.select(t.node());b(t,((r.data()[0]||[])[0]||{}).trace||{},e)},x.fillGroupStyle=function(t,e){t.style("stroke-width",0).each((function(t){var r=n.select(this);t[0].trace&&b(r,t[0].trace,e)}))};var _=r(90998);x.symbolNames=[],x.symbolFuncs=[],x.symbolBackOffs=[],x.symbolNeedLines={},x.symbolNoDot={},x.symbolNoFill={},x.symbolList=[],Object.keys(_).forEach((function(t){var e=_[t],r=e.n;x.symbolList.push(r,String(r),t,r+100,String(r+100),t+"-open"),x.symbolNames[r]=t,x.symbolFuncs[r]=e.f,x.symbolBackOffs[r]=e.backoff||0,e.needLine&&(x.symbolNeedLines[r]=!0),e.noDot?x.symbolNoDot[r]=!0:x.symbolList.push(r+200,String(r+200),t+"-dot",r+300,String(r+300),t+"-open-dot"),e.noFill&&(x.symbolNoFill[r]=!0)}));var w=x.symbolNames.length;function T(t,e,r,n){var i=t%100;return x.symbolFuncs[i](e,r,n)+(t>=200?"M0,0.5L0.5,0L0,-0.5L-0.5,0Z":"")}x.symbolNumber=function(t){if(o(t))t=+t;else if("string"==typeof t){var e=0;t.indexOf("-open")>0&&(e=100,t=t.replace("-open","")),t.indexOf("-dot")>0&&(e+=200,t=t.replace("-dot","")),(t=x.symbolNames.indexOf(t))>=0&&(t+=e)}return t%100>=w||t>=400?0:Math.floor(Math.max(t,0))};var k={x1:1,x2:0,y1:0,y2:0},A={x1:0,x2:0,y1:1,y2:0},M=a("~f"),S={radial:{node:"radialGradient"},radialreversed:{node:"radialGradient",reversed:!0},horizontal:{node:"linearGradient",attrs:k},horizontalreversed:{node:"linearGradient",attrs:k,reversed:!0},vertical:{node:"linearGradient",attrs:A},verticalreversed:{node:"linearGradient",attrs:A,reversed:!0}};x.gradient=function(t,e,r,a,o,l){for(var c=o.length,f=S[a],h=new Array(c),p=0;p=0&&void 0===t.i&&(t.i=o.i),e.style("opacity",n.selectedOpacityFn?n.selectedOpacityFn(t):void 0===t.mo?s.opacity:t.mo),n.ms2mrc){var c;c="various"===t.ms||"various"===s.size?3:n.ms2mrc(t.ms),t.mrc=c,n.selectedSizeFn&&(c=t.mrc=n.selectedSizeFn(t));var f=x.symbolNumber(t.mx||s.symbol)||0;t.om=f%200>=100;var h=rt(t,r),p=G(t,r);e.attr("d",T(f,c,h,p))}var d,v,g,y=!1;if(t.so)g=l.outlierwidth,v=l.outliercolor,d=s.outliercolor;else{var m=(l||{}).width;g=(t.mlw+1||m+1||(t.trace?(t.trace.marker.line||{}).width:0)+1)-1||0,v="mlc"in t?t.mlcc=n.lineScale(t.mlc):i.isArrayOrTypedArray(l.color)?u.defaultLine:l.color,i.isArrayOrTypedArray(s.color)&&(d=u.defaultLine,y=!0),d="mc"in t?t.mcc=n.markerScale(t.mc):s.color||s.colors||"rgba(0,0,0,0)",n.selectedColorFn&&(d=n.selectedColorFn(t))}if(t.om)e.call(u.stroke,d).style({"stroke-width":(g||1)+"px",fill:"none"});else{e.style("stroke-width",(t.isBlank?0:g)+"px");var b=s.gradient,_=t.mgt;_?y=!0:_=b&&b.type,i.isArrayOrTypedArray(_)&&(_=_[0],S[_]||(_=0));var w=s.pattern,k=w&&x.getPatternAttr(w.shape,t.i,"");if(_&&"none"!==_){var A=t.mgc;A?y=!0:A=b.color;var M=r.uid;y&&(M+="-"+t.i),x.gradient(e,a,M,_,[[0,A],[1,d]],"fill")}else if(k){var E=!1,L=w.fgcolor;!L&&o&&o.color&&(L=o.color,E=!0);var C=x.getPatternAttr(L,t.i,o&&o.color||null),P=x.getPatternAttr(w.bgcolor,t.i,null),O=w.fgopacity,I=x.getPatternAttr(w.size,t.i,8),D=x.getPatternAttr(w.solidity,t.i,.3);E=E||t.mcc||i.isArrayOrTypedArray(w.shape)||i.isArrayOrTypedArray(w.bgcolor)||i.isArrayOrTypedArray(w.fgcolor)||i.isArrayOrTypedArray(w.size)||i.isArrayOrTypedArray(w.solidity);var z=r.uid;E&&(z+="-"+t.i),x.pattern(e,"point",a,z,k,I,D,t.mcc,w.fillmode,P,C,O)}else i.isArrayOrTypedArray(d)?u.fill(e,d[t.i]):u.fill(e,d);g&&u.stroke(e,v)}},x.makePointStyleFns=function(t){var e={},r=t.marker;return e.markerScale=x.tryColorscale(r,""),e.lineScale=x.tryColorscale(r,"line"),l.traceIs(t,"symbols")&&(e.ms2mrc=g.isBubble(t)?y(t):function(){return(r.size||6)/2}),t.selectedpoints&&i.extendFlat(e,x.makeSelectedPointStyleFns(t)),e},x.makeSelectedPointStyleFns=function(t){var e={},r=t.selected||{},n=t.unselected||{},a=t.marker||{},o=r.marker||{},s=n.marker||{},u=a.opacity,c=o.opacity,f=s.opacity,h=void 0!==c,p=void 0!==f;(i.isArrayOrTypedArray(u)||h||p)&&(e.selectedOpacityFn=function(t){var e=void 0===t.mo?a.opacity:t.mo;return t.selected?h?c:e:p?f:v*e});var d=a.color,g=o.color,y=s.color;(g||y)&&(e.selectedColorFn=function(t){var e=t.mcc||d;return t.selected?g||e:y||e});var m=a.size,x=o.size,b=s.size,_=void 0!==x,w=void 0!==b;return l.traceIs(t,"symbols")&&(_||w)&&(e.selectedSizeFn=function(t){var e=t.mrc||m/2;return t.selected?_?x/2:e:w?b/2:e}),e},x.makeSelectedTextStyleFns=function(t){var e={},r=t.selected||{},n=t.unselected||{},i=t.textfont||{},a=r.textfont||{},o=n.textfont||{},s=i.color,l=a.color,c=o.color;return e.selectedTextColorFn=function(t){var e=t.tc||s;return t.selected?l||e:c||(l?e:u.addOpacity(e,v))},e},x.selectedPointStyle=function(t,e){if(t.size()&&e.selectedpoints){var r=x.makeSelectedPointStyleFns(e),i=e.marker||{},a=[];r.selectedOpacityFn&&a.push((function(t,e){t.style("opacity",r.selectedOpacityFn(e))})),r.selectedColorFn&&a.push((function(t,e){u.fill(t,r.selectedColorFn(e))})),r.selectedSizeFn&&a.push((function(t,n){var a=n.mx||i.symbol||0,o=r.selectedSizeFn(n);t.attr("d",T(x.symbolNumber(a),o,rt(n,e),G(n,e))),n.mrc2=o})),a.length&&t.each((function(t){for(var e=n.select(this),r=0;r0?r:0}function I(t,e,r){return r&&(t=N(t)),e?z(t[1]):D(t[0])}function D(t){var e=n.round(t,2);return E=e,e}function z(t){var e=n.round(t,2);return L=e,e}function R(t,e,r,n){var i=t[0]-e[0],a=t[1]-e[1],o=r[0]-e[0],s=r[1]-e[1],l=Math.pow(i*i+a*a,.25),u=Math.pow(o*o+s*s,.25),c=(u*u*i-l*l*o)*n,f=(u*u*a-l*l*s)*n,h=3*u*(l+u),p=3*l*(l+u);return[[D(e[0]+(h&&c/h)),z(e[1]+(h&&f/h))],[D(e[0]-(p&&c/p)),z(e[1]-(p&&f/p))]]}x.textPointStyle=function(t,e,r){if(t.size()){var a;if(e.selectedpoints){var o=x.makeSelectedTextStyleFns(e);a=o.selectedTextColorFn}var s=e.texttemplate,l=r._fullLayout;t.each((function(t){var o=n.select(this),u=s?i.extractOption(t,e,"txt","texttemplate"):i.extractOption(t,e,"tx","text");if(u||0===u){if(s){var c=e._module.formatLabels,f=c?c(t,e,l):{},p={};m(p,e,t.i);var d=e._meta||{};u=i.texttemplateString(u,f,l._d3locale,p,t,d)}var v=t.tp||e.textposition,g=O(t,e),y=a?a(t):t.tc||e.textfont.color;o.call(x.font,t.tf||e.textfont.family,g,y).text(u).call(h.convertToTspans,r).call(P,v,g,t.mrc)}else o.remove()}))}},x.selectedTextStyle=function(t,e){if(t.size()&&e.selectedpoints){var r=x.makeSelectedTextStyleFns(e);t.each((function(t){var i=n.select(this),a=r.selectedTextColorFn(t),o=t.tp||e.textposition,s=O(t,e);u.fill(i,a);var c=l.traceIs(e,"bar-like");P(i,o,s,t.mrc2||t.mrc,c)}))}},x.smoothopen=function(t,e){if(t.length<3)return"M"+t.join("L");var r,n="M"+t[0],i=[];for(r=1;r=u||w>=f&&w<=u)&&(T<=h&&T>=c||T>=h&&T<=c)&&(t=[w,T])}return t}x.steps=function(t){var e=F[t]||B;return function(t){for(var r="M"+D(t[0][0])+","+z(t[0][1]),n=t.length,i=1;i=1e4&&(x.savedBBoxes={},j=0),r&&(x.savedBBoxes[r]=g),j++,i.extendFlat({},g)},x.setClipUrl=function(t,e,r){t.attr("clip-path",V(e,r))},x.getTranslate=function(t){var e=(t[t.attr?"attr":"getAttribute"]("transform")||"").replace(/.*\btranslate\((-?\d*\.?\d*)[^-\d]*(-?\d*\.?\d*)[^\d].*/,(function(t,e,r){return[e,r].join(" ")})).split(" ");return{x:+e[0]||0,y:+e[1]||0}},x.setTranslate=function(t,e,r){var n=t.attr?"attr":"getAttribute",i=t.attr?"attr":"setAttribute",a=t[n]("transform")||"";return e=e||0,r=r||0,a=a.replace(/(\btranslate\(.*?\);?)/,"").trim(),a=(a+=f(e,r)).trim(),t[i]("transform",a),a},x.getScale=function(t){var e=(t[t.attr?"attr":"getAttribute"]("transform")||"").replace(/.*\bscale\((\d*\.?\d*)[^\d]*(\d*\.?\d*)[^\d].*/,(function(t,e,r){return[e,r].join(" ")})).split(" ");return{x:+e[0]||1,y:+e[1]||1}},x.setScale=function(t,e,r){var n=t.attr?"attr":"getAttribute",i=t.attr?"attr":"setAttribute",a=t[n]("transform")||"";return e=e||1,r=r||1,a=a.replace(/(\bscale\(.*?\);?)/,"").trim(),a=(a+="scale("+e+","+r+")").trim(),t[i]("transform",a),a};var H=/\s*sc.*/;x.setPointGroupScale=function(t,e,r){if(e=e||1,r=r||1,t){var n=1===e&&1===r?"":"scale("+e+","+r+")";t.each((function(){var t=(this.getAttribute("transform")||"").replace(H,"");t=(t+=n).trim(),this.setAttribute("transform",t)}))}};var q=/translate\([^)]*\)\s*$/;function G(t,e){var r;return t&&(r=t.mf),void 0===r&&(r=e.marker&&e.marker.standoff||0),e._geo||e._xA?r:-r}x.setTextPointsScale=function(t,e,r){t&&t.each((function(){var t,i=n.select(this),a=i.select("text");if(a.node()){var o=parseFloat(a.attr("x")||0),s=parseFloat(a.attr("y")||0),l=(i.attr("transform")||"").match(q);t=1===e&&1===r?[]:[f(o,s),"scale("+e+","+r+")",f(-o,-s)],l&&t.push(l),i.attr("transform",t.join(""))}}))},x.getMarkerStandoff=G;var Z,Y,W,X,J,K,$=Math.atan2,Q=Math.cos,tt=Math.sin;function et(t,e){var r=e[0],n=e[1];return[r*Q(t)-n*tt(t),r*tt(t)+n*Q(t)]}function rt(t,e){var r,n,i=t.ma;void 0===i&&(i=e.marker.angle||0);var a=e.marker.angleref;if("previous"===a||"north"===a){if(e._geo){var s=e._geo.project(t.lonlat);r=s[0],n=s[1]}else{var l=e._xA,u=e._yA;if(!l||!u)return 90;r=l.c2p(t.x),n=u.c2p(t.y)}if(e._geo){var c,f=t.lonlat[0],h=t.lonlat[1],p=e._geo.project([f,h+1e-5]),d=e._geo.project([f+1e-5,h]),v=$(d[1]-n,d[0]-r),g=$(p[1]-n,p[0]-r);if("north"===a)c=i/180*Math.PI;else if("previous"===a){var y=f/180*Math.PI,m=h/180*Math.PI,x=Z/180*Math.PI,b=Y/180*Math.PI,_=x-y,w=Q(b)*tt(_),T=tt(b)*Q(m)-Q(b)*tt(m)*Q(_);c=-$(w,T)-Math.PI,Z=f,Y=h}var k=et(v,[Q(c),0]),A=et(g,[tt(c),0]);i=$(k[1]+A[1],k[0]+A[0])/Math.PI*180,"previous"!==a||K===e.uid&&t.i===J+1||(i=null)}if("previous"===a&&!e._geo)if(K===e.uid&&t.i===J+1&&o(r)&&o(n)){var M=r-W,S=n-X,E=e.line&&e.line.shape||"",L=E.slice(E.length-1);"h"===L&&(S=0),"v"===L&&(M=0),i+=$(S,M)/Math.PI*180+90}else i=null}return W=r,X=n,J=t.i,K=e.uid,i}x.getMarkerAngle=rt},90998:function(t,e,r){"use strict";var n,i,a,o,s=r(95616),l=r(39898).round,u="M0,0Z",c=Math.sqrt(2),f=Math.sqrt(3),h=Math.PI,p=Math.cos,d=Math.sin;function v(t){return null===t}function g(t,e,r){if(!(t&&t%360!=0||e))return r;if(a===t&&o===e&&n===r)return i;function l(t,r){var n=p(t),i=d(t),a=r[0],o=r[1]+(e||0);return[a*n-o*i,a*i+o*n]}a=t,o=e,n=r;for(var u=t/180*h,c=0,f=0,v=s(r),g="",y=0;y0,f=t._context.staticPlot;e.each((function(e){var h,p=e[0].trace,d=p.error_x||{},v=p.error_y||{};p.ids&&(h=function(t){return t.id});var g=o.hasMarkers(p)&&p.marker.maxdisplayed>0;v.visible||d.visible||(e=[]);var y=n.select(this).selectAll("g.errorbar").data(e,h);if(y.exit().remove(),e.length){d.visible||y.selectAll("path.xerror").remove(),v.visible||y.selectAll("path.yerror").remove(),y.style("opacity",1);var m=y.enter().append("g").classed("errorbar",!0);c&&m.style("opacity",0).transition().duration(s.duration).style("opacity",1),a.setClipUrl(y,r.layerClipId,t),y.each((function(t){var e=n.select(this),r=function(t,e,r){var n={x:e.c2p(t.x),y:r.c2p(t.y)};return void 0!==t.yh&&(n.yh=r.c2p(t.yh),n.ys=r.c2p(t.ys),i(n.ys)||(n.noYS=!0,n.ys=r.c2p(t.ys,!0))),void 0!==t.xh&&(n.xh=e.c2p(t.xh),n.xs=e.c2p(t.xs),i(n.xs)||(n.noXS=!0,n.xs=e.c2p(t.xs,!0))),n}(t,l,u);if(!g||t.vis){var a,o=e.select("path.yerror");if(v.visible&&i(r.x)&&i(r.yh)&&i(r.ys)){var h=v.width;a="M"+(r.x-h)+","+r.yh+"h"+2*h+"m-"+h+",0V"+r.ys,r.noYS||(a+="m-"+h+",0h"+2*h),o.size()?c&&(o=o.transition().duration(s.duration).ease(s.easing)):o=e.append("path").style("vector-effect",f?"none":"non-scaling-stroke").classed("yerror",!0),o.attr("d",a)}else o.remove();var p=e.select("path.xerror");if(d.visible&&i(r.y)&&i(r.xh)&&i(r.xs)){var y=(d.copy_ystyle?v:d).width;a="M"+r.xh+","+(r.y-y)+"v"+2*y+"m0,-"+y+"H"+r.xs,r.noXS||(a+="m0,-"+y+"v"+2*y),p.size()?c&&(p=p.transition().duration(s.duration).ease(s.easing)):p=e.append("path").style("vector-effect",f?"none":"non-scaling-stroke").classed("xerror",!0),p.attr("d",a)}else p.remove()}}))}}))}},62662:function(t,e,r){"use strict";var n=r(39898),i=r(7901);t.exports=function(t){t.each((function(t){var e=t[0].trace,r=e.error_y||{},a=e.error_x||{},o=n.select(this);o.selectAll("path.yerror").style("stroke-width",r.thickness+"px").call(i.stroke,r.color),a.copy_ystyle&&(a=r),o.selectAll("path.xerror").style("stroke-width",a.thickness+"px").call(i.stroke,a.color)}))}},77914:function(t,e,r){"use strict";var n=r(41940),i=r(528).hoverlabel,a=r(1426).extendFlat;t.exports={hoverlabel:{bgcolor:a({},i.bgcolor,{arrayOk:!0}),bordercolor:a({},i.bordercolor,{arrayOk:!0}),font:n({arrayOk:!0,editType:"none"}),align:a({},i.align,{arrayOk:!0}),namelength:a({},i.namelength,{arrayOk:!0}),editType:"none"}}},30732:function(t,e,r){"use strict";var n=r(71828),i=r(73972);function a(t,e,r,i){i=i||n.identity,Array.isArray(t)&&(e[0][r]=i(t))}t.exports=function(t){var e=t.calcdata,r=t._fullLayout;function o(t){return function(e){return n.coerceHoverinfo({hoverinfo:e},{_module:t._module},r)}}for(var s=0;s=0&&r.index_[0]._length||lt<0||lt>w[0]._length)return d.unhoverRaw(t,e)}else st="xpx"in e?e.xpx:_[0]._length/2,lt="ypx"in e?e.ypx:w[0]._length/2;if(e.pointerX=st+_[0]._offset,e.pointerY=lt+w[0]._offset,q="xval"in e?y.flat(l,e.xval):y.p2c(_,st),G="yval"in e?y.flat(l,e.yval):y.p2c(w,lt),!i(q[0])||!i(G[0]))return o.warn("Fx.hover failed",e,t),d.unhoverRaw(t,e)}var ft=1/0;function ht(t,r){for(Y=0;Yrt&&(nt.splice(0,rt),ft=nt[0].distance),m&&0!==H&&0===nt.length){et.distance=H,et.index=!1;var f=X._module.hoverPoints(et,Q,tt,"closest",{hoverLayer:c._hoverlayer});if(f&&(f=f.filter((function(t){return t.spikeDistance<=H}))),f&&f.length){var h,d=f.filter((function(t){return t.xa.showspikes&&"hovered data"!==t.xa.spikesnap}));if(d.length){var v=d[0];i(v.x0)&&i(v.y0)&&(h=dt(v),(!at.vLinePoint||at.vLinePoint.spikeDistance>h.spikeDistance)&&(at.vLinePoint=h))}var g=f.filter((function(t){return t.ya.showspikes&&"hovered data"!==t.ya.spikesnap}));if(g.length){var x=g[0];i(x.x0)&&i(x.y0)&&(h=dt(x),(!at.hLinePoint||at.hLinePoint.spikeDistance>h.spikeDistance)&&(at.hLinePoint=h))}}}}}function pt(t,e,r){for(var n,i=null,a=1/0,o=0;o0&&Math.abs(t.distance)At-1;Mt--)Ct(nt[Mt]);nt=St,mt()}var Pt=t._hoverdata,Ot=[],It=U(t),Dt=V(t);for(Z=0;Z1||nt.length>1)||"closest"===I&&ot&&nt.length>1,Yt=p.combine(c.plot_bgcolor||p.background,c.paper_bgcolor),Wt=O(nt,{gd:t,hovermode:I,rotateLabels:Zt,bgColor:Yt,container:c._hoverlayer,outerContainer:c._paper.node(),commonLabelOpts:c.hoverlabel,hoverdistance:c.hoverdistance}),Xt=Wt.hoverLabels;if(y.isUnifiedHover(I)||(function(t,e,r,n){var i,a,o,s,l,u,c,f=e?"xa":"ya",h=e?"ya":"xa",p=0,d=1,v=t.size(),g=new Array(v),y=0,m=n.minX,x=n.maxX,b=n.minY,_=n.maxY,w=function(t){return t*r._invScaleX},k=function(t){return t*r._invScaleY};function A(t){var e=t[0],r=t[t.length-1];if(a=e.pmin-e.pos-e.dp+e.size,o=r.pos+r.dp+r.size-e.pmax,a>.01){for(l=t.length-1;l>=0;l--)t[l].dp+=a;i=!1}if(!(o<.01)){if(a<-.01){for(l=t.length-1;l>=0;l--)t[l].dp-=o;i=!1}if(i){var n=0;for(s=0;se.pmax&&n++;for(s=t.length-1;s>=0&&!(n<=0);s--)(u=t[s]).pos>e.pmax-1&&(u.del=!0,n--);for(s=0;s=0;l--)t[l].dp-=o;for(s=t.length-1;s>=0&&!(n<=0);s--)(u=t[s]).pos+u.dp+u.size>e.pmax&&(u.del=!0,n--)}}}for(t.each((function(t){var n=t[f],i=t[h],a="x"===n._id.charAt(0),o=n.range;0===y&&o&&o[0]>o[1]!==a&&(d=-1);var s=0,l=a?r.width:r.height;if("x"===r.hovermode||"y"===r.hovermode){var u,c,p=D(t,e),v=t.anchor,A="end"===v?-1:1;if("middle"===v)c=(u=t.crossPos+(a?k(p.y-t.by/2):w(t.bx/2+t.tx2width/2)))+(a?k(t.by):w(t.bx));else if(a)c=(u=t.crossPos+k(M+p.y)-k(t.by/2-M))+k(t.by);else{var S=w(A*M+p.x),E=S+w(A*t.bx);u=t.crossPos+Math.min(S,E),c=t.crossPos+Math.max(S,E)}a?void 0!==b&&void 0!==_&&Math.min(c,_)-Math.max(u,b)>1&&("left"===i.side?(s=i._mainLinePosition,l=r.width):l=i._mainLinePosition):void 0!==m&&void 0!==x&&Math.min(c,x)-Math.max(u,m)>1&&("top"===i.side?(s=i._mainLinePosition,l=r.height):l=i._mainLinePosition)}g[y++]=[{datum:t,traceIndex:t.trace.index,dp:0,pos:t.pos,posref:t.posref,size:t.by*(a?T:1)/2,pmin:s,pmax:l}]})),g.sort((function(t,e){return t[0].posref-e[0].posref||d*(e[0].traceIndex-t[0].traceIndex)}));!i&&p<=v;){for(p++,i=!0,s=0;s.01&&L.pmin===C.pmin&&L.pmax===C.pmax){for(l=E.length-1;l>=0;l--)E[l].dp+=a;for(S.push.apply(S,E),g.splice(s+1,1),c=0,l=S.length-1;l>=0;l--)c+=S[l].dp;for(o=c/S.length,l=S.length-1;l>=0;l--)S[l].dp-=o;i=!1}else s++}g.forEach(A)}for(s=g.length-1;s>=0;s--){var P=g[s];for(l=P.length-1;l>=0;l--){var O=P[l],I=O.datum;I.offset=O.dp,I.del=O.del}}}(Xt,Zt,c,Wt.commonLabelBoundingBox),z(Xt,Zt,c._invScaleX,c._invScaleY)),s&&s.tagName){var Jt=g.getComponentMethod("annotations","hasClickToShow")(t,Ot);f(n.select(s),Jt?"pointer":"")}s&&!a&&function(t,e,r){if(!r||r.length!==t._hoverdata.length)return!0;for(var n=r.length-1;n>=0;n--){var i=r[n],a=t._hoverdata[n];if(i.curveNumber!==a.curveNumber||String(i.pointNumber)!==String(a.pointNumber)||String(i.pointNumbers)!==String(a.pointNumbers))return!0}return!1}(t,0,Pt)&&(Pt&&t.emit("plotly_unhover",{event:e,points:Pt}),t.emit("plotly_hover",{event:e,points:t._hoverdata,xaxes:_,yaxes:w,xvals:q,yvals:G}))}(t,e,r,a,s)}))},e.loneHover=function(t,e){var r=!0;Array.isArray(t)||(r=!1,t=[t]);var i=e.gd,a=U(i),o=V(i),s=O(t.map((function(t){var r=t._x0||t.x0||t.x||0,n=t._x1||t.x1||t.x||0,s=t._y0||t.y0||t.y||0,l=t._y1||t.y1||t.y||0,u=t.eventData;if(u){var c=Math.min(r,n),f=Math.max(r,n),h=Math.min(s,l),d=Math.max(s,l),v=t.trace;if(g.traceIs(v,"gl3d")){var y=i._fullLayout[v.scene]._scene.container,m=y.offsetLeft,x=y.offsetTop;c+=m,f+=m,h+=x,d+=x}u.bbox={x0:c+o,x1:f+o,y0:h+a,y1:d+a},e.inOut_bbox&&e.inOut_bbox.push(u.bbox)}else u=!1;return{color:t.color||p.defaultLine,x0:t.x0||t.x||0,x1:t.x1||t.x||0,y0:t.y0||t.y||0,y1:t.y1||t.y||0,xLabel:t.xLabel,yLabel:t.yLabel,zLabel:t.zLabel,text:t.text,name:t.name,idealAlign:t.idealAlign,borderColor:t.borderColor,fontFamily:t.fontFamily,fontSize:t.fontSize,fontColor:t.fontColor,nameLength:t.nameLength,textAlign:t.textAlign,trace:t.trace||{index:0,hoverinfo:""},xa:{_offset:0},ya:{_offset:0},index:0,hovertemplate:t.hovertemplate||!1,hovertemplateLabels:t.hovertemplateLabels||!1,eventData:u}})),{gd:i,hovermode:"closest",rotateLabels:!1,bgColor:e.bgColor||p.background,container:n.select(e.container),outerContainer:e.outerContainer||e.container}).hoverLabels,l=0,u=0;return s.sort((function(t,e){return t.y0-e.y0})).each((function(t,r){var n=t.y0-t.by/2;t.offset=n-5([\s\S]*)<\/extra>/;function O(t,e){var r=e.gd,i=r._fullLayout,a=e.hovermode,u=e.rotateLabels,f=e.bgColor,d=e.container,v=e.outerContainer,w=e.commonLabelOpts||{};if(0===t.length)return[[]];var T=e.fontFamily||m.HOVERFONT,k=e.fontSize||m.HOVERFONTSIZE,A=t[0],E=A.xa,L=A.ya,P=a.charAt(0),O=P+"Label",D=A[O];if(void 0===D&&"multicategory"===E.type)for(var z=0;zi.width-b?(g=i.width-b,e.attr("d","M"+(b-M)+",0L"+b+","+x+M+"v"+x+(2*S+m.height)+"H-"+b+"V"+x+M+"H"+(b-2*M)+"Z")):e.attr("d","M0,0L"+M+","+x+M+"H"+b+"v"+x+(2*S+m.height)+"H-"+b+"V"+x+M+"H-"+M+"Z"),Y.minX=g-b,Y.maxX=g+b,"top"===E.side?(Y.minY=y-(2*S+m.height),Y.maxY=y-S):(Y.minY=y+S,Y.maxY=y+(2*S+m.height))}else{var _,C,P;"right"===L.side?(_="start",C=1,P="",g=E._offset+E._length):(_="end",C=-1,P="-",g=E._offset),y=L._offset+(A.y0+A.y1)/2,l.attr("text-anchor",_),e.attr("d","M0,0L"+P+M+","+M+"V"+(S+m.height/2)+"h"+P+(2*S+m.width)+"V-"+(S+m.height/2)+"H"+P+M+"V-"+M+"Z"),Y.minY=y-(S+m.height/2),Y.maxY=y+(S+m.height/2),"right"===L.side?(Y.minX=g+M,Y.maxX=g+M+(2*S+m.width)):(Y.minX=g-M-(2*S+m.width),Y.maxX=g-M);var O,I=m.height/2,z=F-m.top-I,R="clip"+i._uid+"commonlabel"+L._id;if(g=0?lt:ut+ht=0?ut:bt+ht=0?ot:st+pt=0?st:_t+pt=0,"top"!==t.idealAlign&&G||!Z?G?(O+=R/2,t.anchor="start"):t.anchor="middle":(O-=R/2,t.anchor="end"),t.crossPos=O;else{if(t.pos=O,G=P+z/2+Y<=B,Z=P-z/2-Y>=0,"left"!==t.idealAlign&&G||!Z)if(G)P+=z/2,t.anchor="start";else{t.anchor="middle";var W=Y/2,X=P+W-B,J=P-W;X>0&&(P-=X),J<0&&(P+=-J)}else P-=z/2,t.anchor="end";t.crossPos=P}w.attr("text-anchor",t.anchor),E&&A.attr("text-anchor",t.anchor),e.attr("transform",s(P,O)+(u?l(_):""))})),{hoverLabels:wt,commonLabelBoundingBox:Y}}function I(t,e,r,n,i,a){var s="",l="";void 0!==t.nameOverride&&(t.name=t.nameOverride),t.name&&(t.trace._meta&&(t.name=o.templateString(t.name,t.trace._meta)),s=N(t.name,t.nameLength));var u=r.charAt(0),c="x"===u?"y":"x";void 0!==t.zLabel?(void 0!==t.xLabel&&(l+="x: "+t.xLabel+"
"),void 0!==t.yLabel&&(l+="y: "+t.yLabel+"
"),"choropleth"!==t.trace.type&&"choroplethmapbox"!==t.trace.type&&(l+=(l?"z: ":"")+t.zLabel)):e&&t[u+"Label"]===i?l=t[c+"Label"]||"":void 0===t.xLabel?void 0!==t.yLabel&&"scattercarpet"!==t.trace.type&&(l=t.yLabel):l=void 0===t.yLabel?t.xLabel:"("+t.xLabel+", "+t.yLabel+")",!t.text&&0!==t.text||Array.isArray(t.text)||(l+=(l?"
":"")+t.text),void 0!==t.extraText&&(l+=(l?"
":"")+t.extraText),a&&""===l&&!t.hovertemplate&&(""===s&&a.remove(),l=s);var f=t.hovertemplate||!1;if(f){var h=t.hovertemplateLabels||t;t[u+"Label"]!==i&&(h[u+"other"]=h[u+"Val"],h[u+"otherLabel"]=h[u+"Label"]),l=(l=o.hovertemplateString(f,h,n._d3locale,t.eventData[0]||{},t.trace._meta)).replace(P,(function(e,r){return s=N(r,t.nameLength),""}))}return[l,s]}function D(t,e){var r=0,n=t.offset;return e&&(n*=-A,r=t.offset*k),{x:r,y:n}}function z(t,e,r,i){var a=function(t){return t*r},o=function(t){return t*i};t.each((function(t){var r=n.select(this);if(t.del)return r.remove();var i,s,l,u,f=r.select("text.nums"),p=t.anchor,d="end"===p?-1:1,v=(u=(l=(s={start:1,end:-1,middle:0}[(i=t).anchor])*(M+S))+s*(i.txwidth+S),"middle"===i.anchor&&(l-=i.tx2width/2,u+=i.txwidth/2+S),{alignShift:s,textShiftX:l,text2ShiftX:u}),g=D(t,e),y=g.x,m=g.y,x="middle"===p;r.select("path").attr("d",x?"M-"+a(t.bx/2+t.tx2width/2)+","+o(m-t.by/2)+"h"+a(t.bx)+"v"+o(t.by)+"h-"+a(t.bx)+"Z":"M0,0L"+a(d*M+y)+","+o(M+m)+"v"+o(t.by/2-M)+"h"+a(d*t.bx)+"v-"+o(t.by)+"H"+a(d*M+y)+"V"+o(m-M)+"Z");var b=y+v.textShiftX,_=m+t.ty0-t.by/2+S,w=t.textAlign||"auto";"auto"!==w&&("left"===w&&"start"!==p?(f.attr("text-anchor","start"),b=x?-t.bx/2-t.tx2width/2+S:-t.bx-S):"right"===w&&"end"!==p&&(f.attr("text-anchor","end"),b=x?t.bx/2-t.tx2width/2-S:t.bx+S)),f.call(c.positionText,a(b),o(_)),t.tx2width&&(r.select("text.name").call(c.positionText,a(v.text2ShiftX+v.alignShift*S+y),o(m+t.ty0-t.by/2+S)),r.select("rect").call(h.setRect,a(v.text2ShiftX+(v.alignShift-1)*t.tx2width/2+y),o(m-t.by/2-1),a(t.tx2width),o(t.by+2)))}))}function R(t,e){var r=t.index,n=t.trace||{},a=t.cd[0],s=t.cd[r]||{};function l(t){return t||i(t)&&0===t}var u=Array.isArray(r)?function(t,e){var i=o.castOption(a,r,t);return l(i)?i:o.extractOption({},n,"",e)}:function(t,e){return o.extractOption(s,n,t,e)};function c(e,r,n){var i=u(r,n);l(i)&&(t[e]=i)}if(c("hoverinfo","hi","hoverinfo"),c("bgcolor","hbg","hoverlabel.bgcolor"),c("borderColor","hbc","hoverlabel.bordercolor"),c("fontFamily","htf","hoverlabel.font.family"),c("fontSize","hts","hoverlabel.font.size"),c("fontColor","htc","hoverlabel.font.color"),c("nameLength","hnl","hoverlabel.namelength"),c("textAlign","hta","hoverlabel.align"),t.posref="y"===e||"closest"===e&&"h"===n.orientation?t.xa._offset+(t.x0+t.x1)/2:t.ya._offset+(t.y0+t.y1)/2,t.x0=o.constrain(t.x0,0,t.xa._length),t.x1=o.constrain(t.x1,0,t.xa._length),t.y0=o.constrain(t.y0,0,t.ya._length),t.y1=o.constrain(t.y1,0,t.ya._length),void 0!==t.xLabelVal&&(t.xLabel="xLabel"in t?t.xLabel:v.hoverLabelText(t.xa,t.xLabelVal,n.xhoverformat),t.xVal=t.xa.c2d(t.xLabelVal)),void 0!==t.yLabelVal&&(t.yLabel="yLabel"in t?t.yLabel:v.hoverLabelText(t.ya,t.yLabelVal,n.yhoverformat),t.yVal=t.ya.c2d(t.yLabelVal)),void 0!==t.zLabelVal&&void 0===t.zLabel&&(t.zLabel=String(t.zLabelVal)),!(isNaN(t.xerr)||"log"===t.xa.type&&t.xerr<=0)){var f=v.tickText(t.xa,t.xa.c2l(t.xerr),"hover").text;void 0!==t.xerrneg?t.xLabel+=" +"+f+" / -"+v.tickText(t.xa,t.xa.c2l(t.xerrneg),"hover").text:t.xLabel+=" ± "+f,"x"===e&&(t.distance+=1)}if(!(isNaN(t.yerr)||"log"===t.ya.type&&t.yerr<=0)){var h=v.tickText(t.ya,t.ya.c2l(t.yerr),"hover").text;void 0!==t.yerrneg?t.yLabel+=" +"+h+" / -"+v.tickText(t.ya,t.ya.c2l(t.yerrneg),"hover").text:t.yLabel+=" ± "+h,"y"===e&&(t.distance+=1)}var p=t.hoverinfo||t.trace.hoverinfo;return p&&"all"!==p&&(-1===(p=Array.isArray(p)?p:p.split("+")).indexOf("x")&&(t.xLabel=void 0),-1===p.indexOf("y")&&(t.yLabel=void 0),-1===p.indexOf("z")&&(t.zLabel=void 0),-1===p.indexOf("text")&&(t.text=void 0),-1===p.indexOf("name")&&(t.name=void 0)),t}function F(t,e,r){var n,i,o=r.container,s=r.fullLayout,l=s._size,u=r.event,c=!!e.hLinePoint,f=!!e.vLinePoint;if(o.selectAll(".spikeline").remove(),f||c){var d=p.combine(s.plot_bgcolor,s.paper_bgcolor);if(c){var g,y,m=e.hLinePoint;n=m&&m.xa,"cursor"===(i=m&&m.ya).spikesnap?(g=u.pointerX,y=u.pointerY):(g=n._offset+m.x,y=i._offset+m.y);var x,b,_=a.readability(m.color,d)<1.5?p.contrast(d):m.color,w=i.spikemode,T=i.spikethickness,k=i.spikecolor||_,A=v.getPxPosition(t,i);if(-1!==w.indexOf("toaxis")||-1!==w.indexOf("across")){if(-1!==w.indexOf("toaxis")&&(x=A,b=g),-1!==w.indexOf("across")){var M=i._counterDomainMin,S=i._counterDomainMax;"free"===i.anchor&&(M=Math.min(M,i.position),S=Math.max(S,i.position)),x=l.l+M*l.w,b=l.l+S*l.w}o.insert("line",":first-child").attr({x1:x,x2:b,y1:y,y2:y,"stroke-width":T,stroke:k,"stroke-dasharray":h.dashStyle(i.spikedash,T)}).classed("spikeline",!0).classed("crisp",!0),o.insert("line",":first-child").attr({x1:x,x2:b,y1:y,y2:y,"stroke-width":T+2,stroke:d}).classed("spikeline",!0).classed("crisp",!0)}-1!==w.indexOf("marker")&&o.insert("circle",":first-child").attr({cx:A+("right"!==i.side?T:-T),cy:y,r:T,fill:k}).classed("spikeline",!0)}if(f){var E,L,C=e.vLinePoint;n=C&&C.xa,i=C&&C.ya,"cursor"===n.spikesnap?(E=u.pointerX,L=u.pointerY):(E=n._offset+C.x,L=i._offset+C.y);var P,O,I=a.readability(C.color,d)<1.5?p.contrast(d):C.color,D=n.spikemode,z=n.spikethickness,R=n.spikecolor||I,F=v.getPxPosition(t,n);if(-1!==D.indexOf("toaxis")||-1!==D.indexOf("across")){if(-1!==D.indexOf("toaxis")&&(P=F,O=L),-1!==D.indexOf("across")){var B=n._counterDomainMin,N=n._counterDomainMax;"free"===n.anchor&&(B=Math.min(B,n.position),N=Math.max(N,n.position)),P=l.t+(1-N)*l.h,O=l.t+(1-B)*l.h}o.insert("line",":first-child").attr({x1:E,x2:E,y1:P,y2:O,"stroke-width":z,stroke:R,"stroke-dasharray":h.dashStyle(n.spikedash,z)}).classed("spikeline",!0).classed("crisp",!0),o.insert("line",":first-child").attr({x1:E,x2:E,y1:P,y2:O,"stroke-width":z+2,stroke:d}).classed("spikeline",!0).classed("crisp",!0)}-1!==D.indexOf("marker")&&o.insert("circle",":first-child").attr({cx:E,cy:F-("top"!==n.side?z:-z),r:z,fill:R}).classed("spikeline",!0)}}}function B(t,e){return!e||e.vLinePoint!==t._spikepoints.vLinePoint||e.hLinePoint!==t._spikepoints.hLinePoint}function N(t,e){return c.plainText(t||"",{len:e,allowedTags:["br","sub","sup","b","i","em"]})}function j(t,e,r){var n=e[t+"a"],i=e[t+"Val"],a=e.cd[0];if("category"===n.type||"multicategory"===n.type)i=n._categoriesMap[i];else if("date"===n.type){var o=e.trace[t+"periodalignment"];if(o){var s=e.cd[e.index],l=s[t+"Start"];void 0===l&&(l=s[t]);var u=s[t+"End"];void 0===u&&(u=s[t]);var c=u-l;"end"===o?i+=c:"middle"===o&&(i+=c/2)}i=n.d2c(i)}return a&&a.t&&a.t.posLetter===n._id&&("group"!==r.boxmode&&"group"!==r.violinmode||(i+=a.t.dPos)),i}function U(t){return t.offsetTop+t.clientTop}function V(t){return t.offsetLeft+t.clientLeft}function H(t,e){var r=t._fullLayout,n=e.getBoundingClientRect(),i=n.left,a=n.top,s=i+n.width,l=a+n.height,u=o.apply3DTransform(r._invTransform)(i,a),c=o.apply3DTransform(r._invTransform)(s,l),f=u[0],h=u[1],p=c[0],d=c[1];return{x:f,y:h,width:p-f,height:d-h,top:Math.min(h,d),left:Math.min(f,p),right:Math.max(f,p),bottom:Math.max(h,d)}}},38048:function(t,e,r){"use strict";var n=r(71828),i=r(7901),a=r(23469).isUnifiedHover;t.exports=function(t,e,r,o){o=o||{};var s=e.legend;function l(t){o.font[t]||(o.font[t]=s?e.legend.font[t]:e.font[t])}e&&a(e.hovermode)&&(o.font||(o.font={}),l("size"),l("family"),l("color"),s?(o.bgcolor||(o.bgcolor=i.combine(e.legend.bgcolor,e.paper_bgcolor)),o.bordercolor||(o.bordercolor=e.legend.bordercolor)):o.bgcolor||(o.bgcolor=e.paper_bgcolor)),r("hoverlabel.bgcolor",o.bgcolor),r("hoverlabel.bordercolor",o.bordercolor),r("hoverlabel.namelength",o.namelength),n.coerceFont(r,"hoverlabel.font",o.font),r("hoverlabel.align",o.align)}},98212:function(t,e,r){"use strict";var n=r(71828),i=r(528);t.exports=function(t,e){function r(r,a){return void 0!==e[r]?e[r]:n.coerce(t,e,i,r,a)}return r("clickmode"),r("hovermode")}},30211:function(t,e,r){"use strict";var n=r(39898),i=r(71828),a=r(28569),o=r(23469),s=r(528),l=r(88335);t.exports={moduleType:"component",name:"fx",constants:r(26675),schema:{layout:s},attributes:r(77914),layoutAttributes:s,supplyLayoutGlobalDefaults:r(22774),supplyDefaults:r(54268),supplyLayoutDefaults:r(34938),calc:r(30732),getDistanceFunction:o.getDistanceFunction,getClosest:o.getClosest,inbox:o.inbox,quadrature:o.quadrature,appendArrayPointValue:o.appendArrayPointValue,castHoverOption:function(t,e,r){return i.castOption(t,e,"hoverlabel."+r)},castHoverinfo:function(t,e,r){return i.castOption(t,r,"hoverinfo",(function(r){return i.coerceHoverinfo({hoverinfo:r},{_module:t._module},e)}))},hover:l.hover,unhover:a.unhover,loneHover:l.loneHover,loneUnhover:function(t){var e=i.isD3Selection(t)?t:n.select(t);e.selectAll("g.hovertext").remove(),e.selectAll(".spikeline").remove()},click:r(75914)}},528:function(t,e,r){"use strict";var n=r(26675),i=r(41940),a=i({editType:"none"});a.family.dflt=n.HOVERFONT,a.size.dflt=n.HOVERFONTSIZE,t.exports={clickmode:{valType:"flaglist",flags:["event","select"],dflt:"event",editType:"plot",extras:["none"]},dragmode:{valType:"enumerated",values:["zoom","pan","select","lasso","drawclosedpath","drawopenpath","drawline","drawrect","drawcircle","orbit","turntable",!1],dflt:"zoom",editType:"modebar"},hovermode:{valType:"enumerated",values:["x","y","closest",!1,"x unified","y unified"],dflt:"closest",editType:"modebar"},hoverdistance:{valType:"integer",min:-1,dflt:20,editType:"none"},spikedistance:{valType:"integer",min:-1,dflt:-1,editType:"none"},hoverlabel:{bgcolor:{valType:"color",editType:"none"},bordercolor:{valType:"color",editType:"none"},font:a,grouptitlefont:i({editType:"none"}),align:{valType:"enumerated",values:["left","right","auto"],dflt:"auto",editType:"none"},namelength:{valType:"integer",min:-1,dflt:15,editType:"none"},editType:"none"},selectdirection:{valType:"enumerated",values:["h","v","d","any"],dflt:"any",editType:"none"}}},34938:function(t,e,r){"use strict";var n=r(71828),i=r(528),a=r(98212),o=r(38048);t.exports=function(t,e){function r(r,a){return n.coerce(t,e,i,r,a)}a(t,e)&&(r("hoverdistance"),r("spikedistance")),"select"===r("dragmode")&&r("selectdirection");var s=e._has("mapbox"),l=e._has("geo"),u=e._basePlotModules.length;"zoom"===e.dragmode&&((s||l)&&1===u||s&&l&&2===u)&&(e.dragmode="pan"),o(t,e,r),n.coerceFont(r,"hoverlabel.grouptitlefont",e.hoverlabel.font)}},22774:function(t,e,r){"use strict";var n=r(71828),i=r(38048),a=r(528);t.exports=function(t,e){i(t,e,(function(r,i){return n.coerce(t,e,a,r,i)}))}},83312:function(t,e,r){"use strict";var n=r(71828),i=r(30587).counter,a=r(27670).Y,o=r(85555).idRegex,s=r(44467),l={rows:{valType:"integer",min:1,editType:"plot"},roworder:{valType:"enumerated",values:["top to bottom","bottom to top"],dflt:"top to bottom",editType:"plot"},columns:{valType:"integer",min:1,editType:"plot"},subplots:{valType:"info_array",freeLength:!0,dimensions:2,items:{valType:"enumerated",values:[i("xy").toString(),""],editType:"plot"},editType:"plot"},xaxes:{valType:"info_array",freeLength:!0,items:{valType:"enumerated",values:[o.x.toString(),""],editType:"plot"},editType:"plot"},yaxes:{valType:"info_array",freeLength:!0,items:{valType:"enumerated",values:[o.y.toString(),""],editType:"plot"},editType:"plot"},pattern:{valType:"enumerated",values:["independent","coupled"],dflt:"coupled",editType:"plot"},xgap:{valType:"number",min:0,max:1,editType:"plot"},ygap:{valType:"number",min:0,max:1,editType:"plot"},domain:a({name:"grid",editType:"plot",noGridCell:!0},{}),xside:{valType:"enumerated",values:["bottom","bottom plot","top plot","top"],dflt:"bottom plot",editType:"plot"},yside:{valType:"enumerated",values:["left","left plot","right plot","right"],dflt:"left plot",editType:"plot"},editType:"plot"};function u(t,e,r){var n=e[r+"axes"],i=Object.keys((t._splomAxes||{})[r]||{});return Array.isArray(n)?n:i.length?i:void 0}function c(t,e,r,n,i,a){var o=e(t+"gap",r),s=e("domain."+t);e(t+"side",n);for(var l=new Array(i),u=s[0],c=(s[1]-u)/(i-o),f=c*(1-o),h=0;h1){h||p||d||"independent"===k("pattern")&&(h=!0),g._hasSubplotGrid=h;var x,b,_="top to bottom"===k("roworder"),w=h?.2:.1,T=h?.3:.1;v&&e._splomGridDflt&&(x=e._splomGridDflt.xside,b=e._splomGridDflt.yside),g._domains={x:c("x",k,w,x,m),y:c("y",k,T,b,y,_)}}else delete e.grid}function k(t,e){return n.coerce(r,g,l,t,e)}},contentDefaults:function(t,e){var r=e.grid;if(r&&r._domains){var n,i,a,o,s,l,c,h=t.grid||{},p=e._subplots,d=r._hasSubplotGrid,v=r.rows,g=r.columns,y="independent"===r.pattern,m=r._axisMap={};if(d){var x=h.subplots||[];l=r.subplots=new Array(v);var b=1;for(n=0;n("legend"===t?1:0));if(!1===M&&(r[t]=void 0),(!1!==M||f.uirevision)&&(p("uirevision",r.uirevision),!1!==M)){p("borderwidth");var S,E,L,C="h"===p("orientation"),P="paper"===p("yref"),O="paper"===p("xref"),I="left";if(C?(S=0,n.getComponentMethod("rangeslider","isVisible")(e.xaxis)?P?(E=1.1,L="bottom"):(E=1,L="top"):P?(E=-.1,L="top"):(E=0,L="bottom")):(E=1,L="auto",O?S=1.02:(S=1,I="right")),i.coerce(f,h,{x:{valType:"number",editType:"legend",min:O?-2:0,max:O?3:1,dflt:S}},"x"),i.coerce(f,h,{y:{valType:"number",editType:"legend",min:P?-2:0,max:P?3:1,dflt:E}},"y"),p("traceorder",_),u.isGrouped(r[t])&&p("tracegroupgap"),p("entrywidth"),p("entrywidthmode"),p("itemsizing"),p("itemwidth"),p("itemclick"),p("itemdoubleclick"),p("groupclick"),p("xanchor",I),p("yanchor",L),p("valign"),i.noneOrAll(f,h,["x","y"]),p("title.text")){p("title.side",C?"left":"top");var D=i.extendFlat({},d,{size:i.bigFont(d.size)});i.coerceFont(p,"title.font",D)}}}}t.exports=function(t,e,r){var n,a=r.slice(),o=e.shapes;if(o)for(n=0;n1)}var R=h.hiddenlabels||[];if(!(v||h.showlegend&&w.length))return s.selectAll("."+d).remove(),h._topdefs.select("#"+r).remove(),a.autoMargin(t,d);var F=i.ensureSingle(s,"g",d,(function(t){v||t.attr("pointer-events","all")})),B=i.ensureSingleById(h._topdefs,"clipPath",r,(function(t){t.append("rect")})),N=i.ensureSingle(F,"rect","bg",(function(t){t.attr("shape-rendering","crispEdges")}));N.call(c.stroke,f.bordercolor).call(c.fill,f.bgcolor).style("stroke-width",f.borderwidth+"px");var j=i.ensureSingle(F,"g","scrollbox"),U=f.title;if(f._titleWidth=0,f._titleHeight=0,U.text){var V=i.ensureSingle(j,"text",d+"titletext");V.attr("text-anchor","start").call(u.font,U.font).text(U.text),L(V,j,t,f,_)}else j.selectAll("."+d+"titletext").remove();var H=i.ensureSingle(F,"rect","scrollbar",(function(t){t.attr(p.scrollBarEnterAttrs).call(c.fill,p.scrollBarColor)})),q=j.selectAll("g.groups").data(w);q.enter().append("g").attr("class","groups"),q.exit().remove();var G=q.selectAll("g.traces").data(i.identity);G.enter().append("g").attr("class","traces"),G.exit().remove(),G.style("opacity",(function(t){var e=t[0].trace;return o.traceIs(e,"pie-like")?-1!==R.indexOf(t[0].label)?.5:1:"legendonly"===e.visible?.5:1})).each((function(){n.select(this).call(M,t,f)})).call(x,t,f).each((function(){v||n.select(this).call(E,t,d)})),i.syncOrAsync([a.previousPromises,function(){return function(t,e,r,i){var a=t._fullLayout,o=O(i);i||(i=a[o]);var s=a._size,l=b.isVertical(i),c=b.isGrouped(i),f="fraction"===i.entrywidthmode,h=i.borderwidth,d=2*h,v=p.itemGap,g=i.itemwidth+2*v,y=2*(h+v),m=P(i),x=i.y<0||0===i.y&&"top"===m,_=i.y>1||1===i.y&&"bottom"===m,w=i.tracegroupgap,T={};i._maxHeight=Math.max(x||_?a.height/2:s.h,30);var A=0;i._width=0,i._height=0;var M=function(t){var e=0,r=0,n=t.title.side;return n&&(-1!==n.indexOf("left")&&(e=t._titleWidth),-1!==n.indexOf("top")&&(r=t._titleHeight)),[e,r]}(i);if(l)r.each((function(t){var e=t[0].height;u.setTranslate(this,h+M[0],h+M[1]+i._height+e/2+v),i._height+=e,i._width=Math.max(i._width,t[0].width)})),A=g+i._width,i._width+=v+g+d,i._height+=y,c&&(e.each((function(t,e){u.setTranslate(this,0,e*i.tracegroupgap)})),i._height+=(i._lgroupsLength-1)*i.tracegroupgap);else{var S=C(i),E=i.x<0||0===i.x&&"right"===S,L=i.x>1||1===i.x&&"left"===S,I=_||x,D=a.width/2;i._maxWidth=Math.max(E?I&&"left"===S?s.l+s.w:D:L?I&&"right"===S?s.r+s.w:D:s.w,2*g);var z=0,R=0;r.each((function(t){var e=k(t,i,g);z=Math.max(z,e),R+=e})),A=null;var F=0;if(c){var B=0,N=0,j=0;e.each((function(){var t=0,e=0;n.select(this).selectAll("g.traces").each((function(r){var n=k(r,i,g),a=r[0].height;u.setTranslate(this,M[0],M[1]+h+v+a/2+e),e+=a,t=Math.max(t,n),T[r[0].trace.legendgroup]=t}));var r=t+v;N>0&&r+h+N>i._maxWidth?(F=Math.max(F,N),N=0,j+=B+w,B=e):B=Math.max(B,e),u.setTranslate(this,N,j),N+=r})),i._width=Math.max(F,N)+h,i._height=j+B+y}else{var U=r.size(),V=R+d+(U-1)*v=i._maxWidth&&(F=Math.max(F,Z),q=0,G+=H,i._height+=H,H=0),u.setTranslate(this,M[0]+h+q,M[1]+h+G+e/2+v),Z=q+r+v,q+=n,H=Math.max(H,e)})),V?(i._width=q+d,i._height=H+y):(i._width=Math.max(F,Z)+d,i._height+=H+y)}}i._width=Math.ceil(Math.max(i._width+M[0],i._titleWidth+2*(h+p.titlePad))),i._height=Math.ceil(Math.max(i._height+M[1],i._titleHeight+2*(h+p.itemGap))),i._effHeight=Math.min(i._height,i._maxHeight);var Y=t._context.edits,W=Y.legendText||Y.legendPosition;r.each((function(t){var e=n.select(this).select("."+o+"toggle"),r=t[0].height,a=t[0].trace.legendgroup,s=k(t,i,g);c&&""!==a&&(s=T[a]);var h=W?g:A||s;l||f||(h+=v/2),u.setRect(e,0,-r/2,h,r)}))}(t,q,G,f)},function(){var e,c,m,x,b=h._size,_=f.borderwidth,w="paper"===f.xref,T="paper"===f.yref;if(!v){var k,M;k=w?b.l+b.w*f.x-g[C(f)]*f._width:h.width*f.x-g[C(f)]*f._width,M=T?b.t+b.h*(1-f.y)-g[P(f)]*f._effHeight:h.height*(1-f.y)-g[P(f)]*f._effHeight;var S=function(t,e,r,n){var i=t._fullLayout,o=i[e],s=C(o),l=P(o),u="paper"===o.xref,c="paper"===o.yref;t._fullLayout._reservedMargin[e]={};var f=o.y<.5?"b":"t",h=o.x<.5?"l":"r",p={r:i.width-r,l:r+o._width,b:i.height-n,t:n+o._effHeight};if(u&&c)return a.autoMargin(t,e,{x:o.x,y:o.y,l:o._width*g[s],r:o._width*y[s],b:o._effHeight*y[l],t:o._effHeight*g[l]});u?t._fullLayout._reservedMargin[e][f]=p[f]:c||"v"===o.orientation?t._fullLayout._reservedMargin[e][h]=p[h]:t._fullLayout._reservedMargin[e][f]=p[f]}(t,d,k,M);if(S)return;if(h.margin.autoexpand){var E=k,L=M;k=w?i.constrain(k,0,h.width-f._width):E,M=T?i.constrain(M,0,h.height-f._effHeight):L,k!==E&&i.log("Constrain "+d+".x to make legend fit inside graph"),M!==L&&i.log("Constrain "+d+".y to make legend fit inside graph")}u.setTranslate(F,k,M)}if(H.on(".drag",null),F.on("wheel",null),v||f._height<=f._maxHeight||t._context.staticPlot){var O=f._effHeight;v&&(O=f._height),N.attr({width:f._width-_,height:O-_,x:_/2,y:_/2}),u.setTranslate(j,0,0),B.select("rect").attr({width:f._width-2*_,height:O-2*_,x:_,y:_}),u.setClipUrl(j,r,t),u.setRect(H,0,0,0,0),delete f._scrollY}else{var I,D,z,R=Math.max(p.scrollBarMinHeight,f._effHeight*f._effHeight/f._height),U=f._effHeight-R-2*p.scrollBarMargin,V=f._height-f._effHeight,q=U/V,G=Math.min(f._scrollY||0,V);N.attr({width:f._width-2*_+p.scrollBarWidth+p.scrollBarMargin,height:f._effHeight-_,x:_/2,y:_/2}),B.select("rect").attr({width:f._width-2*_+p.scrollBarWidth+p.scrollBarMargin,height:f._effHeight-2*_,x:_,y:_+G}),u.setClipUrl(j,r,t),W(G,R,q),F.on("wheel",(function(){W(G=i.constrain(f._scrollY+n.event.deltaY/U*V,0,V),R,q),0!==G&&G!==V&&n.event.preventDefault()}));var Z=n.behavior.drag().on("dragstart",(function(){var t=n.event.sourceEvent;I="touchstart"===t.type?t.changedTouches[0].clientY:t.clientY,z=G})).on("drag",(function(){var t=n.event.sourceEvent;2===t.buttons||t.ctrlKey||(D="touchmove"===t.type?t.changedTouches[0].clientY:t.clientY,G=function(t,e,r){var n=(r-e)/q+t;return i.constrain(n,0,V)}(z,I,D),W(G,R,q))}));H.call(Z);var Y=n.behavior.drag().on("dragstart",(function(){var t=n.event.sourceEvent;"touchstart"===t.type&&(I=t.changedTouches[0].clientY,z=G)})).on("drag",(function(){var t=n.event.sourceEvent;"touchmove"===t.type&&(D=t.changedTouches[0].clientY,G=function(t,e,r){var n=(e-r)/q+t;return i.constrain(n,0,V)}(z,I,D),W(G,R,q))}));j.call(Y)}function W(e,r,n){f._scrollY=t._fullLayout[d]._scrollY=e,u.setTranslate(j,0,-e),u.setRect(H,f._width,p.scrollBarMargin+e*n,p.scrollBarWidth,r),B.select("rect").attr("y",_+e)}t._context.edits.legendPosition&&(F.classed("cursor-move",!0),l.init({element:F.node(),gd:t,prepFn:function(){var t=u.getTranslate(F);m=t.x,x=t.y},moveFn:function(t,r){var n=m+t,i=x+r;u.setTranslate(F,n,i),e=l.align(n,f._width,b.l,b.l+b.w,f.xanchor),c=l.align(i+f._height,-f._height,b.t+b.h,b.t,f.yanchor)},doneFn:function(){if(void 0!==e&&void 0!==c){var r={};r[d+".x"]=e,r[d+".y"]=c,o.call("_guiRelayout",t,r)}},clickFn:function(e,r){var n=s.selectAll("g.traces").filter((function(){var t=this.getBoundingClientRect();return r.clientX>=t.left&&r.clientX<=t.right&&r.clientY>=t.top&&r.clientY<=t.bottom}));n.size()>0&&A(t,F,n,e,r)}}))}],t)}}function k(t,e,r){var n=t[0],i=n.width,a=e.entrywidthmode,o=n.trace.legendwidth||e.entrywidth;return"fraction"===a?e._maxWidth*o:r+(o||i)}function A(t,e,r,n,i){var a=r.data()[0][0].trace,l={event:i,node:r.node(),curveNumber:a.index,expandedIndex:a._expandedIndex,data:t.data,layout:t.layout,frames:t._transitionData._frames,config:t._context,fullData:t._fullData,fullLayout:t._fullLayout};a._group&&(l.group=a._group),o.traceIs(a,"pie-like")&&(l.label=r.datum()[0].label),!1!==s.triggerHandler(t,"plotly_legendclick",l)&&(1===n?e._clickTimeout=setTimeout((function(){t._fullLayout&&h(r,t,n)}),t._context.doubleClickDelay):2===n&&(e._clickTimeout&&clearTimeout(e._clickTimeout),t._legendMouseDownTime=0,!1!==s.triggerHandler(t,"plotly_legenddoubleclick",l)&&h(r,t,n)))}function M(t,e,r){var n,a,s=O(r),l=t.data()[0][0],c=l.trace,h=o.traceIs(c,"pie-like"),d=!r._inHover&&e._context.edits.legendText&&!h,v=r._maxNameLength;l.groupTitle?(n=l.groupTitle.text,a=l.groupTitle.font):(a=r.font,r.entries?n=l.text:(n=h?l.label:c.name,c._meta&&(n=i.templateString(n,c._meta))));var g=i.ensureSingle(t,"text",s+"text");g.attr("text-anchor","start").call(u.font,a).text(d?S(n,v):n);var y=r.itemwidth+2*p.itemGap;f.positionText(g,y,0),d?g.call(f.makeEditable,{gd:e,text:n}).call(L,t,e,r).on("edit",(function(n){this.text(S(n,v)).call(L,t,e,r);var a=l.trace._fullInput||{},s={};if(o.hasTransform(a,"groupby")){var u=o.getTransformIndices(a,"groupby"),f=u[u.length-1],h=i.keyedContainer(a,"transforms["+f+"].styles","target","value.name");h.set(l.trace._group,n),s=h.constructUpdate()}else s.name=n;return a._isShape?o.call("_guiRelayout",e,"shapes["+c.index+"].name",s.name):o.call("_guiRestyle",e,s,c.index)})):L(g,t,e,r)}function S(t,e){var r=Math.max(4,e);if(t&&t.trim().length>=r/2)return t;for(var n=r-(t=t||"").length;n>0;n--)t+=" ";return t}function E(t,e,r){var a,o=e._context.doubleClickDelay,s=1,l=i.ensureSingle(t,"rect",r+"toggle",(function(t){e._context.staticPlot||t.style("cursor","pointer").attr("pointer-events","all"),t.call(c.fill,"rgba(0,0,0,0)")}));e._context.staticPlot||(l.on("mousedown",(function(){(a=(new Date).getTime())-e._legendMouseDownTimeo&&(s=Math.max(s-1,1)),A(e,i,t,s,n.event)}})))}function L(t,e,r,n,i){n._inHover&&t.attr("data-notex",!0),f.convertToTspans(t,r,(function(){!function(t,e,r,n){var i=t.data()[0][0];if(r._inHover||!i||i.trace.showlegend){var a=t.select("g[class*=math-group]"),o=a.node(),s=O(r);r||(r=e._fullLayout[s]);var l,c,h=r.borderwidth,d=(n===_?r.title.font:i.groupTitle?i.groupTitle.font:r.font).size*v;if(o){var g=u.bBox(o);l=g.height,c=g.width,n===_?u.setTranslate(a,h,h+.75*l):u.setTranslate(a,0,.25*l)}else{var y="."+s+(n===_?"title":"")+"text",m=t.select(y),x=f.lineCount(m),b=m.node();if(l=d*x,c=b?u.bBox(b).width:0,n===_)"left"===r.title.side&&(c+=2*p.itemGap),f.positionText(m,h+p.titlePad,h+d);else{var w=2*p.itemGap+r.itemwidth;i.groupTitle&&(w=p.itemGap,c-=r.itemwidth),f.positionText(m,w,-d*((x-1)/2-.3))}}n===_?(r._titleWidth=c,r._titleHeight=l):(i.lineHeight=d,i.height=Math.max(l,16)+3,i.width=c)}else t.remove()}(e,r,n,i)}))}function C(t){return i.isRightAnchor(t)?"right":i.isCenterAnchor(t)?"center":"left"}function P(t){return i.isBottomAnchor(t)?"bottom":i.isMiddleAnchor(t)?"middle":"top"}function O(t){return t._id||"legend"}t.exports=function(t,e){if(e)T(t,e);else{var r=t._fullLayout,i=r._legends;r._infolayer.selectAll('[class^="legend"]').each((function(){var t=n.select(this),e=t.attr("class").split(" ")[0];e.match(w)&&-1===i.indexOf(e)&&t.remove()}));for(var a=0;aS&&(M=S)}k[a][0]._groupMinRank=M,k[a][0]._preGroupSort=a}var E=function(t,e){return t.trace.legendrank-e.trace.legendrank||t._preSort-e._preSort};for(k.forEach((function(t,e){t[0]._preGroupSort=e})),k.sort((function(t,e){return t[0]._groupMinRank-e[0]._groupMinRank||t[0]._preGroupSort-e[0]._preGroupSort})),a=0;ar?r:t}t.exports=function(t,e,r){var y=e._fullLayout;r||(r=y.legend);var m="constant"===r.itemsizing,x=r.itemwidth,b=(x+2*p.itemGap)/2,_=o(b,0),w=function(t,e,r,n){var i;if(t+1)i=t;else{if(!(e&&e.width>0))return 0;i=e.width}return m?n:Math.min(i,r)};function T(t,a,o){var c=t[0].trace,f=c.marker||{},h=f.line||{},p=o?c.visible&&c.type===o:i.traceIs(c,"bar"),d=n.select(a).select("g.legendpoints").selectAll("path.legend"+o).data(p?[t]:[]);d.enter().append("path").classed("legend"+o,!0).attr("d","M6,6H-6V-6H6Z").attr("transform",_),d.exit().remove(),d.each((function(t){var i=n.select(this),a=t[0],o=w(a.mlw,f.line,5,2);i.style("stroke-width",o+"px");var p=a.mcc;if(!r._inHover&&"mc"in a){var d=u(f),v=d.mid;void 0===v&&(v=(d.max+d.min)/2),p=s.tryColorscale(f,"")(v)}var y=p||a.mc||f.color,m=f.pattern,x=m&&s.getPatternAttr(m.shape,0,"");if(x){var b=s.getPatternAttr(m.bgcolor,0,null),_=s.getPatternAttr(m.fgcolor,0,null),T=m.fgopacity,k=g(m.size,8,10),A=g(m.solidity,.5,1),M="legend-"+c.uid;i.call(s.pattern,"legend",e,M,x,k,A,p,m.fillmode,b,_,T)}else i.call(l.fill,y);o&&l.stroke(i,a.mlc||h.color)}))}function k(t,r,o){var s=t[0],l=s.trace,u=o?l.visible&&l.type===o:i.traceIs(l,o),c=n.select(r).select("g.legendpoints").selectAll("path.legend"+o).data(u?[t]:[]);if(c.enter().append("path").classed("legend"+o,!0).attr("d","M6,6H-6V-6H6Z").attr("transform",_),c.exit().remove(),c.size()){var p=l.marker||{},d=w(h(p.line.width,s.pts),p.line,5,2),v="pieLike",g=a.minExtend(l,{marker:{line:{width:d}}},v),y=a.minExtend(s,{trace:g},v);f(c,y,g,e)}}t.each((function(t){var e=n.select(this),i=a.ensureSingle(e,"g","layers");i.style("opacity",t[0].trace.opacity);var s=r.valign,l=t[0].lineHeight,u=t[0].height;if("middle"!==s&&l&&u){var c={top:1,bottom:-1}[s]*(.5*(l-u+3));i.attr("transform",o(0,c))}else i.attr("transform",null);i.selectAll("g.legendfill").data([t]).enter().append("g").classed("legendfill",!0),i.selectAll("g.legendlines").data([t]).enter().append("g").classed("legendlines",!0);var f=i.selectAll("g.legendsymbols").data([t]);f.enter().append("g").classed("legendsymbols",!0),f.selectAll("g.legendpoints").data([t]).enter().append("g").classed("legendpoints",!0)})).each((function(t){var r,i=t[0].trace,o=[];if(i.visible)switch(i.type){case"histogram2d":case"heatmap":o=[["M-15,-2V4H15V-2Z"]],r=!0;break;case"choropleth":case"choroplethmapbox":o=[["M-6,-6V6H6V-6Z"]],r=!0;break;case"densitymapbox":o=[["M-6,0 a6,6 0 1,0 12,0 a 6,6 0 1,0 -12,0"]],r="radial";break;case"cone":o=[["M-6,2 A2,2 0 0,0 -6,6 V6L6,4Z"],["M-6,-6 A2,2 0 0,0 -6,-2 L6,-4Z"],["M-6,-2 A2,2 0 0,0 -6,2 L6,0Z"]],r=!1;break;case"streamtube":o=[["M-6,2 A2,2 0 0,0 -6,6 H6 A2,2 0 0,1 6,2 Z"],["M-6,-6 A2,2 0 0,0 -6,-2 H6 A2,2 0 0,1 6,-6 Z"],["M-6,-2 A2,2 0 0,0 -6,2 H6 A2,2 0 0,1 6,-2 Z"]],r=!1;break;case"surface":o=[["M-6,-6 A2,3 0 0,0 -6,0 H6 A2,3 0 0,1 6,-6 Z"],["M-6,1 A2,3 0 0,1 -6,6 H6 A2,3 0 0,0 6,0 Z"]],r=!0;break;case"mesh3d":o=[["M-6,6H0L-6,-6Z"],["M6,6H0L6,-6Z"],["M-6,-6H6L0,6Z"]],r=!1;break;case"volume":o=[["M-6,6H0L-6,-6Z"],["M6,6H0L6,-6Z"],["M-6,-6H6L0,6Z"]],r=!0;break;case"isosurface":o=[["M-6,6H0L-6,-6Z"],["M6,6H0L6,-6Z"],["M-6,-6 A12,24 0 0,0 6,-6 L0,6Z"]],r=!1}var c=n.select(this).select("g.legendpoints").selectAll("path.legend3dandfriends").data(o);c.enter().append("path").classed("legend3dandfriends",!0).attr("transform",_).style("stroke-miterlimit",1),c.exit().remove(),c.each((function(t,o){var c,f=n.select(this),h=u(i),p=h.colorscale,v=h.reversescale;if(p){if(!r){var g=p.length;c=0===o?p[v?g-1:0][1]:1===o?p[v?0:g-1][1]:p[Math.floor((g-1)/2)][1]}}else{var y=i.vertexcolor||i.facecolor||i.color;c=a.isArrayOrTypedArray(y)?y[o]||y[0]:y}f.attr("d",t[0]),c?f.call(l.fill,c):f.call((function(t){if(t.size()){var n="legendfill-"+i.uid;s.gradient(t,e,n,d(v,"radial"===r),p,"fill")}}))}))})).each((function(t){var e=t[0].trace,r="waterfall"===e.type;if(t[0]._distinct&&r){var i=t[0].trace[t[0].dir].marker;return t[0].mc=i.color,t[0].mlw=i.line.width,t[0].mlc=i.line.color,T(t,this,"waterfall")}var a=[];e.visible&&r&&(a=t[0].hasTotals?[["increasing","M-6,-6V6H0Z"],["totals","M6,6H0L-6,-6H-0Z"],["decreasing","M6,6V-6H0Z"]]:[["increasing","M-6,-6V6H6Z"],["decreasing","M6,6V-6H-6Z"]]);var o=n.select(this).select("g.legendpoints").selectAll("path.legendwaterfall").data(a);o.enter().append("path").classed("legendwaterfall",!0).attr("transform",_).style("stroke-miterlimit",1),o.exit().remove(),o.each((function(t){var r=n.select(this),i=e[t[0]].marker,a=w(void 0,i.line,5,2);r.attr("d",t[1]).style("stroke-width",a+"px").call(l.fill,i.color),a&&r.call(l.stroke,i.line.color)}))})).each((function(t){T(t,this,"funnel")})).each((function(t){T(t,this)})).each((function(t){var r=t[0].trace,o=n.select(this).select("g.legendpoints").selectAll("path.legendbox").data(r.visible&&i.traceIs(r,"box-violin")?[t]:[]);o.enter().append("path").classed("legendbox",!0).attr("d","M6,6H-6V-6H6Z").attr("transform",_),o.exit().remove(),o.each((function(){var t=n.select(this);if("all"!==r.boxpoints&&"all"!==r.points||0!==l.opacity(r.fillcolor)||0!==l.opacity((r.line||{}).color)){var i=w(void 0,r.line,5,2);t.style("stroke-width",i+"px").call(l.fill,r.fillcolor),i&&l.stroke(t,r.line.color)}else{var u=a.minExtend(r,{marker:{size:m?12:a.constrain(r.marker.size,2,16),sizeref:1,sizemin:1,sizemode:"diameter"}});o.call(s.pointStyle,u,e)}}))})).each((function(t){k(t,this,"funnelarea")})).each((function(t){k(t,this,"pie")})).each((function(t){var r,i,o=v(t),l=o.showFill,f=o.showLine,h=o.showGradientLine,p=o.showGradientFill,g=o.anyFill,y=o.anyLine,m=t[0],b=m.trace,_=u(b),T=_.colorscale,k=_.reversescale,A=c.hasMarkers(b)||!g?"M5,0":y?"M5,-2":"M5,-3",M=n.select(this),S=M.select(".legendfill").selectAll("path").data(l||p?[t]:[]);if(S.enter().append("path").classed("js-fill",!0),S.exit().remove(),S.attr("d",A+"h"+x+"v6h-"+x+"z").call((function(t){if(t.size())if(l)s.fillGroupStyle(t,e);else{var r="legendfill-"+b.uid;s.gradient(t,e,r,d(k),T,"fill")}})),f||h){var E=w(void 0,b.line,10,5);i=a.minExtend(b,{line:{width:E}}),r=[a.minExtend(m,{trace:i})]}var L=M.select(".legendlines").selectAll("path").data(f||h?[r]:[]);L.enter().append("path").classed("js-line",!0),L.exit().remove(),L.attr("d",A+(h?"l"+x+",0.0001":"h"+x)).call(f?s.lineGroupStyle:function(t){if(t.size()){var r="legendline-"+b.uid;s.lineGroupStyle(t),s.gradient(t,e,r,d(k),T,"stroke")}})})).each((function(t){var r,i,o=v(t),l=o.anyFill,u=o.anyLine,f=o.showLine,h=o.showMarker,p=t[0],d=p.trace,g=!h&&!u&&!l&&c.hasText(d);function y(t,e,r,n){var i=a.nestedProperty(d,t).get(),o=a.isArrayOrTypedArray(i)&&e?e(i):i;if(m&&o&&void 0!==n&&(o=n),r){if(or[1])return r[1]}return o}function x(t){return p._distinct&&p.index&&t[p.index]?t[p.index]:t[0]}if(h||g||f){var b={},w={};if(h){b.mc=y("marker.color",x),b.mx=y("marker.symbol",x),b.mo=y("marker.opacity",a.mean,[.2,1]),b.mlc=y("marker.line.color",x),b.mlw=y("marker.line.width",a.mean,[0,5],2),w.marker={sizeref:1,sizemin:1,sizemode:"diameter"};var T=y("marker.size",a.mean,[2,16],12);b.ms=T,w.marker.size=T}f&&(w.line={width:y("line.width",x,[0,10],5)}),g&&(b.tx="Aa",b.tp=y("textposition",x),b.ts=10,b.tc=y("textfont.color",x),b.tf=y("textfont.family",x)),r=[a.minExtend(p,b)],(i=a.minExtend(d,w)).selectedpoints=null,i.texttemplate=null}var k=n.select(this).select("g.legendpoints"),A=k.selectAll("path.scatterpts").data(h?r:[]);A.enter().insert("path",":first-child").classed("scatterpts",!0).attr("transform",_),A.exit().remove(),A.call(s.pointStyle,i,e),h&&(r[0].mrc=3);var M=k.selectAll("g.pointtext").data(g?r:[]);M.enter().append("g").classed("pointtext",!0).append("text").attr("transform",_),M.exit().remove(),M.selectAll("text").call(s.textPointStyle,i,e)})).each((function(t){var e=t[0].trace,r=n.select(this).select("g.legendpoints").selectAll("path.legendcandle").data(e.visible&&"candlestick"===e.type?[t,t]:[]);r.enter().append("path").classed("legendcandle",!0).attr("d",(function(t,e){return e?"M-15,0H-8M-8,6V-6H8Z":"M15,0H8M8,-6V6H-8Z"})).attr("transform",_).style("stroke-miterlimit",1),r.exit().remove(),r.each((function(t,r){var i=n.select(this),a=e[r?"increasing":"decreasing"],o=w(void 0,a.line,5,2);i.style("stroke-width",o+"px").call(l.fill,a.fillcolor),o&&l.stroke(i,a.line.color)}))})).each((function(t){var e=t[0].trace,r=n.select(this).select("g.legendpoints").selectAll("path.legendohlc").data(e.visible&&"ohlc"===e.type?[t,t]:[]);r.enter().append("path").classed("legendohlc",!0).attr("d",(function(t,e){return e?"M-15,0H0M-8,-6V0":"M15,0H0M8,6V0"})).attr("transform",_).style("stroke-miterlimit",1),r.exit().remove(),r.each((function(t,r){var i=n.select(this),a=e[r?"increasing":"decreasing"],o=w(void 0,a.line,5,2);i.style("fill","none").call(s.dashLine,a.line.dash,o),o&&l.stroke(i,a.line.color)}))}))}},42068:function(t,e,r){"use strict";r(93348),t.exports={editType:"modebar",orientation:{valType:"enumerated",values:["v","h"],dflt:"h",editType:"modebar"},bgcolor:{valType:"color",editType:"modebar"},color:{valType:"color",editType:"modebar"},activecolor:{valType:"color",editType:"modebar"},uirevision:{valType:"any",editType:"none"},add:{valType:"string",arrayOk:!0,dflt:"",editType:"modebar"},remove:{valType:"string",arrayOk:!0,dflt:"",editType:"modebar"}}},26023:function(t,e,r){"use strict";var n=r(73972),i=r(74875),a=r(41675),o=r(24255),s=r(34031).eraseActiveShape,l=r(71828),u=l._,c=t.exports={};function f(t,e){var r,i,o=e.currentTarget,s=o.getAttribute("data-attr"),l=o.getAttribute("data-val")||!0,u=t._fullLayout,c={},f=a.list(t,null,!0),h=u._cartesianSpikesEnabled;if("zoom"===s){var p,d="in"===l?.5:2,v=(1+d)/2,g=(1-d)/2;for(i=0;i1?(O=["toggleHover"],I=["resetViews"]):y?(P=["zoomInGeo","zoomOutGeo"],O=["hoverClosestGeo"],I=["resetGeo"]):g?(O=["hoverClosest3d"],I=["resetCameraDefault3d","resetCameraLastSave3d"]):w?(P=["zoomInMapbox","zoomOutMapbox"],O=["toggleHover"],I=["resetViewMapbox"]):b?O=["hoverClosestGl2d"]:m?O=["hoverClosestPie"]:A?(O=["hoverClosestCartesian","hoverCompareCartesian"],I=["resetViewSankey"]):O=["toggleHover"],v&&(O=["toggleSpikelines","hoverClosestCartesian","hoverCompareCartesian"]),(function(t){for(var e=0;e0)){var v=function(t,e,r){for(var n=r.filter((function(r){return e[r].anchor===t._id})),i=0,a=0;a=n.max)e=F[r+1];else if(t=n.pmax)e=F[r+1];else if(tr._length||y+b<0)return;c=g+b,p=y+b;break;case l:if(x="col-resize",g+b>r._length)return;c=g+b,p=y;break;case u:if(x="col-resize",y+b<0)return;c=g,p=y+b;break;default:x="ew-resize",c=v,p=v+b}if(p=0;k--){var A=r.append("path").attr(g).style("opacity",k?.1:y).call(o.stroke,x).call(o.fill,m).call(s.dashLine,k?"solid":_,k?4+b:b);if(d(A,t,a),w){var M=l(t.layout,"selections",a);A.style({cursor:"move"});var S={element:A.node(),plotinfo:p,gd:t,editHelpers:M,isActiveSelection:!0},E=n(u,t);i(E,A,S)}else A.style("pointer-events",k?"all":"none");T[k]=A}var L=T[0];T[1].node().addEventListener("click",(function(){return function(t,e){if(h(t)){var r=+e.node().getAttribute("data-index");if(r>=0){if(r===t._fullLayout._activeSelectionIndex)return void v(t);t._fullLayout._activeSelectionIndex=r,t._fullLayout._deactivateSelection=v,f(t)}}}(t,L)}))}(t._fullLayout._selectionLayer)}function d(t,e,r){var n=r.xref+r.yref;s.setClipUrl(t,"clip"+e._fullLayout._uid+n,e)}function v(t){h(t)&&t._fullLayout._activeSelectionIndex>=0&&(a(t),delete t._fullLayout._activeSelectionIndex,f(t))}t.exports={draw:f,drawOne:p,activateLastSelection:function(t){if(h(t)){var e=t._fullLayout.selections.length-1;t._fullLayout._activeSelectionIndex=e,t._fullLayout._deactivateSelection=v,f(t)}}}},53777:function(t,e,r){"use strict";var n=r(79952).P,i=r(1426).extendFlat;t.exports={newselection:{mode:{valType:"enumerated",values:["immediate","gradual"],dflt:"immediate",editType:"none"},line:{color:{valType:"color",editType:"none"},width:{valType:"number",min:1,dflt:1,editType:"none"},dash:i({},n,{dflt:"dot",editType:"none"}),editType:"none"},editType:"none"},activeselection:{fillcolor:{valType:"color",dflt:"rgba(0,0,0,0)",editType:"none"},opacity:{valType:"number",min:0,max:1,dflt:.5,editType:"none"},editType:"none"}}},90849:function(t){"use strict";t.exports=function(t,e,r){r("newselection.mode"),r("newselection.line.width")&&(r("newselection.line.color"),r("newselection.line.dash")),r("activeselection.fillcolor"),r("activeselection.opacity")}},35855:function(t,e,r){"use strict";var n=r(64505).selectMode,i=r(51873).clearOutline,a=r(60165),o=a.readPaths,s=a.writePaths,l=a.fixDatesForPaths;t.exports=function(t,e){if(t.length){var r=t[0][0];if(r){var a=r.getAttribute("d"),u=e.gd,c=u._fullLayout.newselection,f=e.plotinfo,h=f.xaxis,p=f.yaxis,d=e.isActiveSelection,v=e.dragmode,g=(u.layout||{}).selections||[];if(!n(v)&&void 0!==d){var y=u._fullLayout._activeSelectionIndex;if(y-1,b=[];if(function(t){return t&&Array.isArray(t)&&!0!==t[0].hoverOnBox}(y)){Z(t,e,a);var _=function(t,e){var r,n,i=t[0],a=-1,o=[];for(n=0;n0?function(t,e){var r,n,i,a=[];for(i=0;i0&&a.push(r);if(1===a.length&&a[0]===e.searchInfo&&(n=e.searchInfo.cd[0].trace).selectedpoints.length===e.pointNumbers.length){for(i=0;i1)return!1;if((n+=e.selectedpoints.length)>1)return!1}return 1===n}(s)&&(h=K(_))){for(o&&o.remove(),g=0;g=0})(i)&&i._fullLayout._deactivateShape(i),function(t){return t._fullLayout._activeSelectionIndex>=0}(i)&&i._fullLayout._deactivateSelection(i);var o=i._fullLayout._zoomlayer,s=p(r),l=v(r);if(s||l){var u,c,f=o.selectAll(".select-outline-"+n.id);f&&i._fullLayout._outlining&&(s&&(u=T(f,t)),u&&a.call("_guiRelayout",i,{shapes:u}),l&&!U(t)&&(c=k(f,t)),c&&(i._fullLayout._noEmitSelectedAtStart=!0,a.call("_guiRelayout",i,{selections:c}).then((function(){e&&A(i)}))),i._fullLayout._outlining=!1)}n.selection={},n.selection.selectionDefs=t.selectionDefs=[],n.selection.mergedPolygons=t.mergedPolygons=[]}function W(t){return t._id}function X(t,e,r,n){if(!t.calcdata)return[];var i,a,o,s=[],l=e.map(W),u=r.map(W);for(o=0;o0?n[0]:r;return!!e.selectedpoints&&e.selectedpoints.indexOf(i)>-1}function $(t,e,r){var n,i;for(n=0;n-1&&e;if(!a&&e){var et=ot(t,!0);if(et.length){var nt=et[0].xref,pt=et[0].yref;if(nt&&pt){var dt=ut(et);ct([C(t,nt,"x"),C(t,pt,"y")])(Q,dt)}}t._fullLayout._noEmitSelectedAtStart?t._fullLayout._noEmitSelectedAtStart=!1:tt&&ft(t,Q),h._reselect=!1}if(!a&&h._deselect){var vt=h._deselect;(function(t,e,r){for(var n=0;n=0)k._fullLayout._deactivateShape(k);else if(!x){var r=A.clickmode;L.done(Mt).then((function(){if(L.clear(Mt),2===t){for(bt.remove(),K=0;K-1&&V(e,k,n.xaxes,n.yaxes,n.subplot,n,bt),"event"===r&&ft(k,void 0);l.click(k,e)})).catch(M.error)}},n.doneFn=function(){kt.remove(),L.done(Mt).then((function(){L.clear(Mt),!S&&J&&n.selectionDefs&&(J.subtract=xt,n.selectionDefs.push(J),n.mergedPolygons.length=0,[].push.apply(n.mergedPolygons,W)),(S||x)&&Y(n,S),n.doneFnCompleted&&n.doneFnCompleted(St),b&&ft(k,at)})).catch(M.error)}},clearOutline:x,clearSelectionsCache:Y,selectOnClick:V}},89827:function(t,e,r){"use strict";var n=r(50215),i=r(41940),a=r(82196).line,o=r(79952).P,s=r(1426).extendFlat,l=r(44467).templatedArray,u=(r(24695),r(9012)),c=r(5386).R,f=r(37281);t.exports=l("shape",{visible:s({},u.visible,{editType:"calc+arraydraw"}),showlegend:{valType:"boolean",dflt:!1,editType:"calc+arraydraw"},legend:s({},u.legend,{editType:"calc+arraydraw"}),legendgroup:s({},u.legendgroup,{editType:"calc+arraydraw"}),legendgrouptitle:{text:s({},u.legendgrouptitle.text,{editType:"calc+arraydraw"}),font:i({editType:"calc+arraydraw"}),editType:"calc+arraydraw"},legendrank:s({},u.legendrank,{editType:"calc+arraydraw"}),legendwidth:s({},u.legendwidth,{editType:"calc+arraydraw"}),type:{valType:"enumerated",values:["circle","rect","path","line"],editType:"calc+arraydraw"},layer:{valType:"enumerated",values:["below","above"],dflt:"above",editType:"arraydraw"},xref:s({},n.xref,{}),xsizemode:{valType:"enumerated",values:["scaled","pixel"],dflt:"scaled",editType:"calc+arraydraw"},xanchor:{valType:"any",editType:"calc+arraydraw"},x0:{valType:"any",editType:"calc+arraydraw"},x1:{valType:"any",editType:"calc+arraydraw"},yref:s({},n.yref,{}),ysizemode:{valType:"enumerated",values:["scaled","pixel"],dflt:"scaled",editType:"calc+arraydraw"},yanchor:{valType:"any",editType:"calc+arraydraw"},y0:{valType:"any",editType:"calc+arraydraw"},y1:{valType:"any",editType:"calc+arraydraw"},path:{valType:"string",editType:"calc+arraydraw"},opacity:{valType:"number",min:0,max:1,dflt:1,editType:"arraydraw"},line:{color:s({},a.color,{editType:"arraydraw"}),width:s({},a.width,{editType:"calc+arraydraw"}),dash:s({},o,{editType:"arraydraw"}),editType:"calc+arraydraw"},fillcolor:{valType:"color",dflt:"rgba(0,0,0,0)",editType:"arraydraw"},fillrule:{valType:"enumerated",values:["evenodd","nonzero"],dflt:"evenodd",editType:"arraydraw"},editable:{valType:"boolean",dflt:!1,editType:"calc+arraydraw"},label:{text:{valType:"string",dflt:"",editType:"arraydraw"},texttemplate:c({},{keys:Object.keys(f)}),font:i({editType:"calc+arraydraw",colorEditType:"arraydraw"}),textposition:{valType:"enumerated",values:["top left","top center","top right","middle left","middle center","middle right","bottom left","bottom center","bottom right","start","middle","end"],editType:"arraydraw"},textangle:{valType:"angle",dflt:"auto",editType:"calc+arraydraw"},xanchor:{valType:"enumerated",values:["auto","left","center","right"],dflt:"auto",editType:"calc+arraydraw"},yanchor:{valType:"enumerated",values:["top","middle","bottom"],editType:"calc+arraydraw"},padding:{valType:"number",dflt:3,min:0,editType:"arraydraw"},editType:"arraydraw"},editType:"arraydraw"})},5627:function(t,e,r){"use strict";var n=r(71828),i=r(89298),a=r(21459),o=r(30477);function s(t){return u(t.line.width,t.xsizemode,t.x0,t.x1,t.path,!1)}function l(t){return u(t.line.width,t.ysizemode,t.y0,t.y1,t.path,!0)}function u(t,e,r,i,s,l){var u=t/2,c=l;if("pixel"===e){var f=s?o.extractPathCoords(s,l?a.paramIsY:a.paramIsX):[r,i],h=n.aggNums(Math.max,null,f),p=n.aggNums(Math.min,null,f),d=p<0?Math.abs(p)+u:u,v=h>0?h+u:u;return{ppad:u,ppadplus:c?d:v,ppadminus:c?v:d}}return{ppad:u}}function c(t,e,r,n,i){var s="category"===t.type||"multicategory"===t.type?t.r2c:t.d2c;if(void 0!==e)return[s(e),s(r)];if(n){var l,u,c,f,h=1/0,p=-1/0,d=n.match(a.segmentRE);for("date"===t.type&&(s=o.decodeDate(s)),l=0;lp&&(p=f)));return p>=h?[h,p]:void 0}}t.exports=function(t){var e=t._fullLayout,r=n.filterVisible(e.shapes);if(r.length&&t._fullData.length)for(var o=0;o=t?e-n:n-e,-180/Math.PI*Math.atan2(i,a)}(x,_,b,w):0),A.call((function(e){return e.call(o.font,k).attr({}),a.convertToTspans(e,t),e}));var U=function(t,e,r,n,i,a,o){var s,l,u,c,h=i.label.textposition,p=i.label.textangle,d=i.label.padding,v=i.type,g=Math.PI/180*a,y=Math.sin(g),m=Math.cos(g),x=i.label.xanchor,b=i.label.yanchor;if("line"===v){"start"===h?(s=t,l=e):"end"===h?(s=r,l=n):(s=(t+r)/2,l=(e+n)/2),"auto"===x&&(x="start"===h?"auto"===p?r>t?"left":rt?"right":rt?"right":rt?"left":r1&&(2!==t.length||"Z"!==t[1][0])&&(0===C&&(t[0][0]="M"),e[L]=t,A(),M())}}()}}function V(t,r){!function(t,r){if(e.length)for(var n=0;n_?(M=p,C="y0",S=_,P="y1"):(M=_,C="y1",S=p,P="y0"),tt(n),nt(l,r),function(t,e,r){var n=e.xref,i=e.yref,a=o.getFromId(r,n),s=o.getFromId(r,i),l="";"paper"===n||a.autorange||(l+=n),"paper"===i||s.autorange||(l+=i),h.setClipUrl(t,l?"clip"+r._fullLayout._uid+l:null,r)}(e,r,t),Q.moveFn="move"===z?et:rt,Q.altKey=n.altKey)},doneFn:function(){b(t)||(v(e),it(l),T(e,t,r),i.call("_guiRelayout",t,c.getUpdateObj()))},clickFn:function(){b(t)||it(l)}};function tt(r){if(b(t))z=null;else if(j)z="path"===r.target.tagName?"move":"start-point"===r.target.attributes["data-line-point"].value?"resize-over-start-point":"resize-over-end-point";else{var n=Q.element.getBoundingClientRect(),i=n.right-n.left,a=n.bottom-n.top,o=r.clientX-n.left,s=r.clientY-n.top,l=!U&&i>R&&a>F&&!r.shiftKey?d.getCursor(o/i,1-s/a):"move";v(e,l),z=l.split("-")[0]}}function et(n,i){if("path"===r.type){var a=function(t){return t},o=a,c=a;B?V("xanchor",r.xanchor=J(w+n)):(o=function(t){return J(W(t)+n)},q&&"date"===q.type&&(o=y.encodeDate(o))),N?V("yanchor",r.yanchor=K(A+i)):(c=function(t){return K(X(t)+i)},Z&&"date"===Z.type&&(c=y.encodeDate(c))),V("path",r.path=k(D,o,c))}else B?V("xanchor",r.xanchor=J(w+n)):(V("x0",r.x0=J(f+n)),V("x1",r.x1=J(x+n))),N?V("yanchor",r.yanchor=K(A+i)):(V("y0",r.y0=K(p+i)),V("y1",r.y1=K(_+i)));e.attr("d",m(t,r)),nt(l,r),u(t,s,r,H)}function rt(n,i){if(U){var a=function(t){return t},o=a,c=a;B?V("xanchor",r.xanchor=J(w+n)):(o=function(t){return J(W(t)+n)},q&&"date"===q.type&&(o=y.encodeDate(o))),N?V("yanchor",r.yanchor=K(A+i)):(c=function(t){return K(X(t)+i)},Z&&"date"===Z.type&&(c=y.encodeDate(c))),V("path",r.path=k(D,o,c))}else if(j){if("resize-over-start-point"===z){var h=f+n,d=N?p-i:p+i;V("x0",r.x0=B?h:J(h)),V("y0",r.y0=N?d:K(d))}else if("resize-over-end-point"===z){var v=x+n,g=N?_-i:_+i;V("x1",r.x1=B?v:J(v)),V("y1",r.y1=N?g:K(g))}}else{var b=function(t){return-1!==z.indexOf(t)},T=b("n"),G=b("s"),Y=b("w"),$=b("e"),Q=T?M+i:M,tt=G?S+i:S,et=Y?E+n:E,rt=$?L+n:L;N&&(T&&(Q=M-i),G&&(tt=S-i)),(!N&&tt-Q>F||N&&Q-tt>F)&&(V(C,r[C]=N?Q:K(Q)),V(P,r[P]=N?tt:K(tt))),rt-et>R&&(V(O,r[O]=B?et:J(et)),V(I,r[I]=B?rt:J(rt)))}e.attr("d",m(t,r)),nt(l,r),u(t,s,r,H)}function nt(t,e){(B||N)&&function(){var r="path"!==e.type,n=t.selectAll(".visual-cue").data([0]);n.enter().append("path").attr({fill:"#fff","fill-rule":"evenodd",stroke:"#000","stroke-width":1}).classed("visual-cue",!0);var i=W(B?e.xanchor:a.midRange(r?[e.x0,e.x1]:y.extractPathCoords(e.path,g.paramIsX))),o=X(N?e.yanchor:a.midRange(r?[e.y0,e.y1]:y.extractPathCoords(e.path,g.paramIsY)));if(i=y.roundPositionForSharpStrokeRendering(i,1),o=y.roundPositionForSharpStrokeRendering(o,1),B&&N){var s="M"+(i-1-1)+","+(o-1-1)+"h-8v2h8 v8h2v-8 h8v-2h-8 v-8h-2 Z";n.attr("d",s)}else if(B){var l="M"+(i-1-1)+","+(o-9-1)+"v18 h2 v-18 Z";n.attr("d",l)}else{var u="M"+(i-9-1)+","+(o-1-1)+"h18 v2 h-18 Z";n.attr("d",u)}}()}function it(t){t.selectAll(".visual-cue").remove()}d.init(Q),$.node().onmousemove=tt}(t,F,c,e,r,z):!0===c.editable&&F.style("pointer-events",I||f.opacity(L)*E<=.5?"stroke":"all");F.node().addEventListener("click",(function(){return function(t,e){if(_(t)){var r=+e.node().getAttribute("data-index");if(r>=0){if(r===t._fullLayout._activeShapeIndex)return void A(t);t._fullLayout._activeShapeIndex=r,t._fullLayout._deactivateShape=A,x(t)}}}(t,F)}))}c._input&&!0===c.visible&&("below"!==c.layer?M(t._fullLayout._shapeUpperLayer):"paper"===c.xref||"paper"===c.yref?M(t._fullLayout._shapeLowerLayer):w._hadPlotinfo?M((w.mainplotinfo||w).shapelayer):M(t._fullLayout._shapeLowerLayer))}function T(t,e,r){var n=(r.xref+r.yref).replace(/paper/g,"").replace(/[xyz][1-9]* *domain/g,"");h.setClipUrl(t,n?"clip"+e._fullLayout._uid+n:null,e)}function k(t,e,r){return t.replace(g.segmentRE,(function(t){var n=0,i=t.charAt(0),a=g.paramIsX[i],o=g.paramIsY[i],s=g.numParams[i];return i+t.substr(1).replace(g.paramRE,(function(t){return n>=s||(a[n]?t=e(t):o[n]&&(t=r(t)),n++),t}))}))}function A(t){_(t)&&t._fullLayout._activeShapeIndex>=0&&(c(t),delete t._fullLayout._activeShapeIndex,x(t))}t.exports={draw:x,drawOne:w,eraseActiveShape:function(t){if(_(t)){c(t);var e=t._fullLayout._activeShapeIndex,r=(t.layout||{}).shapes||[];if(e0&&lp&&(t="X"),t}));return a>p&&(d=d.replace(/[\s,]*X.*/,""),i.log("Ignoring extra params in segment "+t)),c+d}))}(r,s,u);if("pixel"===r.xsizemode){var b=s(r.xanchor);c=b+r.x0,f=b+r.x1}else c=s(r.x0),f=s(r.x1);if("pixel"===r.ysizemode){var _=u(r.yanchor);h=_-r.y0,p=_-r.y1}else h=u(r.y0),p=u(r.y1);if("line"===d)return"M"+c+","+h+"L"+f+","+p;if("rect"===d)return"M"+c+","+h+"H"+f+"V"+p+"H"+c+"Z";var w=(c+f)/2,T=(h+p)/2,k=Math.abs(w-c),A=Math.abs(T-h),M="A"+k+","+A,S=w+k+","+T;return"M"+S+M+" 0 1,1 "+w+","+(T-A)+M+" 0 0,1 "+S+"Z"}},89853:function(t,e,r){"use strict";var n=r(34031);t.exports={moduleType:"component",name:"shapes",layoutAttributes:r(89827),supplyLayoutDefaults:r(84726),supplyDrawNewShapeDefaults:r(45547),includeBasePlot:r(76325)("shapes"),calcAutorange:r(5627),draw:n.draw,drawOne:n.drawOne}},37281:function(t){"use strict";function e(t,e){return e?e.d2l(t):t}function r(t,e){return e?e.l2d(t):t}function n(t,r){return e(t.x1,r)-e(t.x0,r)}function i(t,r,n){return e(t.y1,n)-e(t.y0,n)}t.exports={x0:function(t){return t.x0},x1:function(t){return t.x1},y0:function(t){return t.y0},y1:function(t){return t.y1},slope:function(t,e,r){return"line"!==t.type?void 0:i(t,0,r)/n(t,e)},dx:n,dy:i,width:function(t,e){return Math.abs(n(t,e))},height:function(t,e,r){return Math.abs(i(t,0,r))},length:function(t,e,r){return"line"!==t.type?void 0:Math.sqrt(Math.pow(n(t,e),2)+Math.pow(i(t,0,r),2))},xcenter:function(t,n){return r((e(t.x1,n)+e(t.x0,n))/2,n)},ycenter:function(t,n,i){return r((e(t.y1,i)+e(t.y0,i))/2,i)}}},75067:function(t,e,r){"use strict";var n=r(41940),i=r(35025),a=r(1426).extendDeepAll,o=r(30962).overrideAll,s=r(85594),l=r(44467).templatedArray,u=r(98292),c=l("step",{visible:{valType:"boolean",dflt:!0},method:{valType:"enumerated",values:["restyle","relayout","animate","update","skip"],dflt:"restyle"},args:{valType:"info_array",freeLength:!0,items:[{valType:"any"},{valType:"any"},{valType:"any"}]},label:{valType:"string"},value:{valType:"string"},execute:{valType:"boolean",dflt:!0}});t.exports=o(l("slider",{visible:{valType:"boolean",dflt:!0},active:{valType:"number",min:0,dflt:0},steps:c,lenmode:{valType:"enumerated",values:["fraction","pixels"],dflt:"fraction"},len:{valType:"number",min:0,dflt:1},x:{valType:"number",min:-2,max:3,dflt:0},pad:a(i({editType:"arraydraw"}),{},{t:{dflt:20}}),xanchor:{valType:"enumerated",values:["auto","left","center","right"],dflt:"left"},y:{valType:"number",min:-2,max:3,dflt:0},yanchor:{valType:"enumerated",values:["auto","top","middle","bottom"],dflt:"top"},transition:{duration:{valType:"number",min:0,dflt:150},easing:{valType:"enumerated",values:s.transition.easing.values,dflt:"cubic-in-out"}},currentvalue:{visible:{valType:"boolean",dflt:!0},xanchor:{valType:"enumerated",values:["left","center","right"],dflt:"left"},offset:{valType:"number",dflt:10},prefix:{valType:"string"},suffix:{valType:"string"},font:n({})},font:n({}),activebgcolor:{valType:"color",dflt:u.gripBgActiveColor},bgcolor:{valType:"color",dflt:u.railBgColor},bordercolor:{valType:"color",dflt:u.railBorderColor},borderwidth:{valType:"number",min:0,dflt:u.railBorderWidth},ticklen:{valType:"number",min:0,dflt:u.tickLength},tickcolor:{valType:"color",dflt:u.tickColor},tickwidth:{valType:"number",min:0,dflt:1},minorticklen:{valType:"number",min:0,dflt:u.minorTickLength}}),"arraydraw","from-root")},98292:function(t){"use strict";t.exports={name:"sliders",containerClassName:"slider-container",groupClassName:"slider-group",inputAreaClass:"slider-input-area",railRectClass:"slider-rail-rect",railTouchRectClass:"slider-rail-touch-rect",gripRectClass:"slider-grip-rect",tickRectClass:"slider-tick-rect",inputProxyClass:"slider-input-proxy",labelsClass:"slider-labels",labelGroupClass:"slider-label-group",labelClass:"slider-label",currentValueClass:"slider-current-value",railHeight:5,menuIndexAttrName:"slider-active-index",autoMarginIdRoot:"slider-",minWidth:30,minHeight:30,textPadX:40,arrowOffsetX:4,railRadius:2,railWidth:5,railBorder:4,railBorderWidth:1,railBorderColor:"#bec8d9",railBgColor:"#f8fafc",railInset:8,stepInset:10,gripRadius:10,gripWidth:20,gripHeight:20,gripBorder:20,gripBorderWidth:1,gripBorderColor:"#bec8d9",gripBgColor:"#f6f8fa",gripBgActiveColor:"#dbdde0",labelPadding:8,labelOffset:0,tickWidth:1,tickColor:"#333",tickOffset:25,tickLength:7,minorTickOffset:25,minorTickColor:"#333",minorTickLength:4,currentValuePadding:8,currentValueInset:0}},12343:function(t,e,r){"use strict";var n=r(71828),i=r(85501),a=r(75067),o=r(98292).name,s=a.steps;function l(t,e,r){function o(r,i){return n.coerce(t,e,a,r,i)}for(var s=i(t,e,{name:"steps",handleItemDefaults:u}),l=0,c=0;c0&&(s=s.transition().duration(e.transition.duration).ease(e.transition.easing)),s.attr("transform",l(o-.5*f.gripWidth,e._dims.currentValueTotalHeight))}}function E(t,e){var r=t._dims;return r.inputAreaStart+f.stepInset+(r.inputAreaLength-2*f.stepInset)*Math.min(1,Math.max(0,e))}function L(t,e){var r=t._dims;return Math.min(1,Math.max(0,(e-f.stepInset-r.inputAreaStart)/(r.inputAreaLength-2*f.stepInset-2*r.inputAreaStart)))}function C(t,e,r){var n=r._dims,i=s.ensureSingle(t,"rect",f.railTouchRectClass,(function(n){n.call(A,e,t,r).style("pointer-events","all")}));i.attr({width:n.inputAreaLength,height:Math.max(n.inputAreaWidth,f.tickOffset+r.ticklen+n.labelHeight)}).call(a.fill,r.bgcolor).attr("opacity",0),o.setTranslate(i,0,n.currentValueTotalHeight)}function P(t,e){var r=e._dims,n=r.inputAreaLength-2*f.railInset,i=s.ensureSingle(t,"rect",f.railRectClass);i.attr({width:n,height:f.railWidth,rx:f.railRadius,ry:f.railRadius,"shape-rendering":"crispEdges"}).call(a.stroke,e.bordercolor).call(a.fill,e.bgcolor).style("stroke-width",e.borderwidth+"px"),o.setTranslate(i,f.railInset,.5*(r.inputAreaWidth-f.railWidth)+r.currentValueTotalHeight)}t.exports=function(t){var e=t._context.staticPlot,r=t._fullLayout,a=function(t,e){for(var r=t[f.name],n=[],i=0;i0?[0]:[]);function l(e){e._commandObserver&&(e._commandObserver.remove(),delete e._commandObserver),i.autoMargin(t,g(e))}if(s.enter().append("g").classed(f.containerClassName,!0).style("cursor",e?null:"ew-resize"),s.exit().each((function(){n.select(this).selectAll("g."+f.groupClassName).each(l)})).remove(),0!==a.length){var u=s.selectAll("g."+f.groupClassName).data(a,y);u.enter().append("g").classed(f.groupClassName,!0),u.exit().each(l).remove();for(var c=0;c0||_<0){var M={left:[-w,0],right:[w,0],top:[0,-w],bottom:[0,w]}[b.side];r.attr("transform",l(M[0],M[1]))}}}return R.call(F),I&&(E?R.on(".opacity",null):(A=0,M=!0,R.text(m).on("mouseover.opacity",(function(){n.select(this).transition().duration(h.SHOW_PLACEHOLDER).style("opacity",1)})).on("mouseout.opacity",(function(){n.select(this).transition().duration(h.HIDE_PLACEHOLDER).style("opacity",0)}))),R.call(f.makeEditable,{gd:t}).on("edit",(function(e){void 0!==x?o.call("_guiRestyle",t,y,e,x):o.call("_guiRelayout",t,y,e)})).on("cancel",(function(){this.text(this.attr("data-unformatted")).call(F)})).on("input",(function(t){this.text(t||" ").call(f.positionText,_.x,_.y)}))),R.classed("js-placeholder",M),T}}},7163:function(t,e,r){"use strict";var n=r(41940),i=r(22399),a=r(1426).extendFlat,o=r(30962).overrideAll,s=r(35025),l=r(44467).templatedArray,u=l("button",{visible:{valType:"boolean"},method:{valType:"enumerated",values:["restyle","relayout","animate","update","skip"],dflt:"restyle"},args:{valType:"info_array",freeLength:!0,items:[{valType:"any"},{valType:"any"},{valType:"any"}]},args2:{valType:"info_array",freeLength:!0,items:[{valType:"any"},{valType:"any"},{valType:"any"}]},label:{valType:"string",dflt:""},execute:{valType:"boolean",dflt:!0}});t.exports=o(l("updatemenu",{_arrayAttrRegexps:[/^updatemenus\[(0|[1-9][0-9]+)\]\.buttons/],visible:{valType:"boolean"},type:{valType:"enumerated",values:["dropdown","buttons"],dflt:"dropdown"},direction:{valType:"enumerated",values:["left","right","up","down"],dflt:"down"},active:{valType:"integer",min:-1,dflt:0},showactive:{valType:"boolean",dflt:!0},buttons:u,x:{valType:"number",min:-2,max:3,dflt:-.05},xanchor:{valType:"enumerated",values:["auto","left","center","right"],dflt:"right"},y:{valType:"number",min:-2,max:3,dflt:1},yanchor:{valType:"enumerated",values:["auto","top","middle","bottom"],dflt:"top"},pad:a(s({editType:"arraydraw"}),{}),font:n({}),bgcolor:{valType:"color"},bordercolor:{valType:"color",dflt:i.borderLine},borderwidth:{valType:"number",min:0,dflt:1,editType:"arraydraw"}}),"arraydraw","from-root")},75909:function(t){"use strict";t.exports={name:"updatemenus",containerClassName:"updatemenu-container",headerGroupClassName:"updatemenu-header-group",headerClassName:"updatemenu-header",headerArrowClassName:"updatemenu-header-arrow",dropdownButtonGroupClassName:"updatemenu-dropdown-button-group",dropdownButtonClassName:"updatemenu-dropdown-button",buttonClassName:"updatemenu-button",itemRectClassName:"updatemenu-item-rect",itemTextClassName:"updatemenu-item-text",menuIndexAttrName:"updatemenu-active-index",autoMarginIdRoot:"updatemenu-",blankHeaderOpts:{label:" "},minWidth:30,minHeight:30,textPadX:24,arrowPadX:16,rx:2,ry:2,textOffsetX:12,textOffsetY:3,arrowOffsetX:4,gapButtonHeader:5,gapButton:2,activeColor:"#F4FAFF",hoverColor:"#F4FAFF",arrowSymbol:{left:"◄",right:"►",up:"▲",down:"▼"}}},64897:function(t,e,r){"use strict";var n=r(71828),i=r(85501),a=r(7163),o=r(75909).name,s=a.buttons;function l(t,e,r){function o(r,i){return n.coerce(t,e,a,r,i)}o("visible",i(t,e,{name:"buttons",handleItemDefaults:u}).length>0)&&(o("active"),o("direction"),o("type"),o("showactive"),o("x"),o("y"),n.noneOrAll(t,e,["x","y"]),o("xanchor"),o("yanchor"),o("pad.t"),o("pad.r"),o("pad.b"),o("pad.l"),n.coerceFont(o,"font",r.font),o("bgcolor",r.paper_bgcolor),o("bordercolor"),o("borderwidth"))}function u(t,e){function r(r,i){return n.coerce(t,e,s,r,i)}r("visible","skip"===t.method||Array.isArray(t.args))&&(r("method"),r("args"),r("args2"),r("label"),r("execute"))}t.exports=function(t,e){i(t,e,{name:o,handleItemDefaults:l})}},13689:function(t,e,r){"use strict";var n=r(39898),i=r(74875),a=r(7901),o=r(91424),s=r(71828),l=r(63893),u=r(44467).arrayEditor,c=r(18783).LINE_SPACING,f=r(75909),h=r(25849);function p(t){return t._index}function d(t,e){return+t.attr(f.menuIndexAttrName)===e._index}function v(t,e,r,n,i,a,o,s){e.active=o,u(t.layout,f.name,e).applyUpdate("active",o),"buttons"===e.type?y(t,n,null,null,e):"dropdown"===e.type&&(i.attr(f.menuIndexAttrName,"-1"),g(t,n,i,a,e),s||y(t,n,i,a,e))}function g(t,e,r,n,i){var a=s.ensureSingle(e,"g",f.headerClassName,(function(t){t.style("pointer-events","all")})),l=i._dims,u=i.active,c=i.buttons[u]||f.blankHeaderOpts,h={y:i.pad.t,yPad:0,x:i.pad.l,xPad:0,index:0},p={width:l.headerWidth,height:l.headerHeight};a.call(m,i,c,t).call(M,i,h,p),s.ensureSingle(e,"text",f.headerArrowClassName,(function(t){t.attr("text-anchor","end").call(o.font,i.font).text(f.arrowSymbol[i.direction])})).attr({x:l.headerWidth-f.arrowOffsetX+i.pad.l,y:l.headerHeight/2+f.textOffsetY+i.pad.t}),a.on("click",(function(){r.call(S,String(d(r,i)?-1:i._index)),y(t,e,r,n,i)})),a.on("mouseover",(function(){a.call(w)})),a.on("mouseout",(function(){a.call(T,i)})),o.setTranslate(e,l.lx,l.ly)}function y(t,e,r,a,o){r||(r=e).attr("pointer-events","all");var l=function(t){return-1==+t.attr(f.menuIndexAttrName)}(r)&&"buttons"!==o.type?[]:o.buttons,u="dropdown"===o.type?f.dropdownButtonClassName:f.buttonClassName,c=r.selectAll("g."+u).data(s.filterVisible(l)),h=c.enter().append("g").classed(u,!0),p=c.exit();"dropdown"===o.type?(h.attr("opacity","0").transition().attr("opacity","1"),p.transition().attr("opacity","0").remove()):p.remove();var d=0,g=0,y=o._dims,x=-1!==["up","down"].indexOf(o.direction);"dropdown"===o.type&&(x?g=y.headerHeight+f.gapButtonHeader:d=y.headerWidth+f.gapButtonHeader),"dropdown"===o.type&&"up"===o.direction&&(g=-f.gapButtonHeader+f.gapButton-y.openHeight),"dropdown"===o.type&&"left"===o.direction&&(d=-f.gapButtonHeader+f.gapButton-y.openWidth);var b={x:y.lx+d+o.pad.l,y:y.ly+g+o.pad.t,yPad:f.gapButton,xPad:f.gapButton,index:0},k={l:b.x+o.borderwidth,t:b.y+o.borderwidth};c.each((function(s,l){var u=n.select(this);u.call(m,o,s,t).call(M,o,b),u.on("click",(function(){n.event.defaultPrevented||(s.execute&&(s.args2&&o.active===l?(v(t,o,0,e,r,a,-1),i.executeAPICommand(t,s.method,s.args2)):(v(t,o,0,e,r,a,l),i.executeAPICommand(t,s.method,s.args))),t.emit("plotly_buttonclicked",{menu:o,button:s,active:o.active}))})),u.on("mouseover",(function(){u.call(w)})),u.on("mouseout",(function(){u.call(T,o),c.call(_,o)}))})),c.call(_,o),x?(k.w=Math.max(y.openWidth,y.headerWidth),k.h=b.y-k.t):(k.w=b.x-k.l,k.h=Math.max(y.openHeight,y.headerHeight)),k.direction=o.direction,a&&(c.size()?function(t,e,r,n,i,a){var o,s,l,u=i.direction,c="up"===u||"down"===u,h=i._dims,p=i.active;if(c)for(s=0,l=0;l0?[0]:[]);if(o.enter().append("g").classed(f.containerClassName,!0).style("cursor","pointer"),o.exit().each((function(){n.select(this).selectAll("g."+f.headerGroupClassName).each(a)})).remove(),0!==r.length){var l=o.selectAll("g."+f.headerGroupClassName).data(r,p);l.enter().append("g").classed(f.headerGroupClassName,!0);for(var u=s.ensureSingle(o,"g",f.dropdownButtonGroupClassName,(function(t){t.style("pointer-events","all")})),c=0;cw,A=s.barLength+2*s.barPad,M=s.barWidth+2*s.barPad,S=d,E=g+y;E+M>u&&(E=u-M);var L=this.container.selectAll("rect.scrollbar-horizontal").data(k?[0]:[]);L.exit().on(".drag",null).remove(),L.enter().append("rect").classed("scrollbar-horizontal",!0).call(i.fill,s.barColor),k?(this.hbar=L.attr({rx:s.barRadius,ry:s.barRadius,x:S,y:E,width:A,height:M}),this._hbarXMin=S+A/2,this._hbarTranslateMax=w-A):(delete this.hbar,delete this._hbarXMin,delete this._hbarTranslateMax);var C=y>T,P=s.barWidth+2*s.barPad,O=s.barLength+2*s.barPad,I=d+v,D=g;I+P>l&&(I=l-P);var z=this.container.selectAll("rect.scrollbar-vertical").data(C?[0]:[]);z.exit().on(".drag",null).remove(),z.enter().append("rect").classed("scrollbar-vertical",!0).call(i.fill,s.barColor),C?(this.vbar=z.attr({rx:s.barRadius,ry:s.barRadius,x:I,y:D,width:P,height:O}),this._vbarYMin=D+O/2,this._vbarTranslateMax=T-O):(delete this.vbar,delete this._vbarYMin,delete this._vbarTranslateMax);var R=this.id,F=c-.5,B=C?f+P+.5:f+.5,N=h-.5,j=k?p+M+.5:p+.5,U=o._topdefs.selectAll("#"+R).data(k||C?[0]:[]);if(U.exit().remove(),U.enter().append("clipPath").attr("id",R).append("rect"),k||C?(this._clipRect=U.select("rect").attr({x:Math.floor(F),y:Math.floor(N),width:Math.ceil(B)-Math.floor(F),height:Math.ceil(j)-Math.floor(N)}),this.container.call(a.setClipUrl,R,this.gd),this.bg.attr({x:d,y:g,width:v,height:y})):(this.bg.attr({width:0,height:0}),this.container.on("wheel",null).on(".drag",null).call(a.setClipUrl,null),delete this._clipRect),k||C){var V=n.behavior.drag().on("dragstart",(function(){n.event.sourceEvent.preventDefault()})).on("drag",this._onBoxDrag.bind(this));this.container.on("wheel",null).on("wheel",this._onBoxWheel.bind(this)).on(".drag",null).call(V);var H=n.behavior.drag().on("dragstart",(function(){n.event.sourceEvent.preventDefault(),n.event.sourceEvent.stopPropagation()})).on("drag",this._onBarDrag.bind(this));k&&this.hbar.on(".drag",null).call(H),C&&this.vbar.on(".drag",null).call(H)}this.setTranslate(e,r)},s.prototype.disable=function(){(this.hbar||this.vbar)&&(this.bg.attr({width:0,height:0}),this.container.on("wheel",null).on(".drag",null).call(a.setClipUrl,null),delete this._clipRect),this.hbar&&(this.hbar.on(".drag",null),this.hbar.remove(),delete this.hbar,delete this._hbarXMin,delete this._hbarTranslateMax),this.vbar&&(this.vbar.on(".drag",null),this.vbar.remove(),delete this.vbar,delete this._vbarYMin,delete this._vbarTranslateMax)},s.prototype._onBoxDrag=function(){var t=this.translateX,e=this.translateY;this.hbar&&(t-=n.event.dx),this.vbar&&(e-=n.event.dy),this.setTranslate(t,e)},s.prototype._onBoxWheel=function(){var t=this.translateX,e=this.translateY;this.hbar&&(t+=n.event.deltaY),this.vbar&&(e+=n.event.deltaY),this.setTranslate(t,e)},s.prototype._onBarDrag=function(){var t=this.translateX,e=this.translateY;if(this.hbar){var r=t+this._hbarXMin,i=r+this._hbarTranslateMax;t=(o.constrain(n.event.x,r,i)-r)/(i-r)*(this.position.w-this._box.w)}if(this.vbar){var a=e+this._vbarYMin,s=a+this._vbarTranslateMax;e=(o.constrain(n.event.y,a,s)-a)/(s-a)*(this.position.h-this._box.h)}this.setTranslate(t,e)},s.prototype.setTranslate=function(t,e){var r=this.position.w-this._box.w,n=this.position.h-this._box.h;if(t=o.constrain(t||0,0,r),e=o.constrain(e||0,0,n),this.translateX=t,this.translateY=e,this.container.call(a.setTranslate,this._box.l-this.position.l-t,this._box.t-this.position.t-e),this._clipRect&&this._clipRect.attr({x:Math.floor(this.position.l+t-.5),y:Math.floor(this.position.t+e-.5)}),this.hbar){var i=t/r;this.hbar.call(a.setTranslate,t+i*this._hbarTranslateMax,e)}if(this.vbar){var s=e/n;this.vbar.call(a.setTranslate,t,e+s*this._vbarTranslateMax)}}},18783:function(t){"use strict";t.exports={FROM_BL:{left:0,center:.5,right:1,bottom:0,middle:.5,top:1},FROM_TL:{left:0,center:.5,right:1,bottom:1,middle:.5,top:0},FROM_BR:{left:1,center:.5,right:0,bottom:0,middle:.5,top:1},LINE_SPACING:1.3,CAP_SHIFT:.7,MID_SHIFT:.35,OPPOSITE_SIDE:{left:"right",right:"left",top:"bottom",bottom:"top"}}},24695:function(t){"use strict";t.exports={axisRefDescription:function(t,e,r){return["If set to a",t,"axis id (e.g. *"+t+"* or","*"+t+"2*), the `"+t+"` position refers to a",t,"coordinate. If set to *paper*, the `"+t+"`","position refers to the distance from the",e,"of the plotting","area in normalized coordinates where *0* (*1*) corresponds to the",e,"("+r+"). If set to a",t,"axis ID followed by","*domain* (separated by a space), the position behaves like for","*paper*, but refers to the distance in fractions of the domain","length from the",e,"of the domain of that axis: e.g.,","*"+t+"2 domain* refers to the domain of the second",t," axis and a",t,"position of 0.5 refers to the","point between the",e,"and the",r,"of the domain of the","second",t,"axis."].join(" ")}}},22372:function(t){"use strict";t.exports={INCREASING:{COLOR:"#3D9970",SYMBOL:"▲"},DECREASING:{COLOR:"#FF4136",SYMBOL:"▼"}}},31562:function(t){"use strict";t.exports={FORMAT_LINK:"https://github.com/d3/d3-format/tree/v1.4.5#d3-format",DATE_FORMAT_LINK:"https://github.com/d3/d3-time-format/tree/v2.2.3#locale_format"}},74808:function(t){"use strict";t.exports={COMPARISON_OPS:["=","!=","<",">=",">","<="],COMPARISON_OPS2:["=","<",">=",">","<="],INTERVAL_OPS:["[]","()","[)","(]","][",")(","](",")["],SET_OPS:["{}","}{"],CONSTRAINT_REDUCTION:{"=":"=","<":"<","<=":"<",">":">",">=":">","[]":"[]","()":"[]","[)":"[]","(]":"[]","][":"][",")(":"][","](":"][",")[":"]["}}},29659:function(t){"use strict";t.exports={solid:[[],0],dot:[[.5,1],200],dash:[[.5,1],50],longdash:[[.5,1],10],dashdot:[[.5,.625,.875,1],50],longdashdot:[[.5,.7,.8,1],10]}},87381:function(t){"use strict";t.exports={circle:"●","circle-open":"○",square:"■","square-open":"□",diamond:"◆","diamond-open":"◇",cross:"+",x:"❌"}},37822:function(t){"use strict";t.exports={SHOW_PLACEHOLDER:100,HIDE_PLACEHOLDER:1e3,DESELECTDIM:.2}},50606:function(t){"use strict";t.exports={BADNUM:void 0,FP_SAFE:1e-4*Number.MAX_VALUE,ONEMAXYEAR:316224e5,ONEAVGYEAR:315576e5,ONEMINYEAR:31536e6,ONEMAXQUARTER:79488e5,ONEAVGQUARTER:78894e5,ONEMINQUARTER:76896e5,ONEMAXMONTH:26784e5,ONEAVGMONTH:26298e5,ONEMINMONTH:24192e5,ONEWEEK:6048e5,ONEDAY:864e5,ONEHOUR:36e5,ONEMIN:6e4,ONESEC:1e3,EPOCHJD:2440587.5,ALMOST_EQUAL:.999999,LOG_CLIP:10,MINUS_SIGN:"−"}},32396:function(t,e){"use strict";e.CSS_DECLARATIONS=[["image-rendering","optimizeSpeed"],["image-rendering","-moz-crisp-edges"],["image-rendering","-o-crisp-edges"],["image-rendering","-webkit-optimize-contrast"],["image-rendering","optimize-contrast"],["image-rendering","crisp-edges"],["image-rendering","pixelated"]],e.STYLE=e.CSS_DECLARATIONS.map((function(t){return t.join(": ")+"; "})).join("")},77922:function(t,e){"use strict";e.xmlns="http://www.w3.org/2000/xmlns/",e.svg="http://www.w3.org/2000/svg",e.xlink="http://www.w3.org/1999/xlink",e.svgAttrs={xmlns:e.svg,"xmlns:xlink":e.xlink}},8729:function(t,e,r){"use strict";e.version=r(11506).version,r(7417),r(98847);for(var n=r(73972),i=e.register=n.register,a=r(10641),o=Object.keys(a),s=0;s",""," ",""," plotly-logomark"," "," "," "," "," "," "," "," "," "," "," "," "," ",""].join("")}}},99863:function(t,e){"use strict";e.isLeftAnchor=function(t){return"left"===t.xanchor||"auto"===t.xanchor&&t.x<=1/3},e.isCenterAnchor=function(t){return"center"===t.xanchor||"auto"===t.xanchor&&t.x>1/3&&t.x<2/3},e.isRightAnchor=function(t){return"right"===t.xanchor||"auto"===t.xanchor&&t.x>=2/3},e.isTopAnchor=function(t){return"top"===t.yanchor||"auto"===t.yanchor&&t.y>=2/3},e.isMiddleAnchor=function(t){return"middle"===t.yanchor||"auto"===t.yanchor&&t.y>1/3&&t.y<2/3},e.isBottomAnchor=function(t){return"bottom"===t.yanchor||"auto"===t.yanchor&&t.y<=1/3}},26348:function(t,e,r){"use strict";var n=r(64872),i=n.mod,a=n.modHalf,o=Math.PI,s=2*o;function l(t){return Math.abs(t[1]-t[0])>s-1e-14}function u(t,e){return a(e-t,s)}function c(t,e){if(l(e))return!0;var r,n;e[0](n=i(n,s))&&(n+=s);var a=i(t,s),o=a+s;return a>=r&&a<=n||o>=r&&o<=n}function f(t,e,r,n,i,a,u){i=i||0,a=a||0;var c,f,h,p,d,v=l([r,n]);function g(t,e){return[t*Math.cos(e)+i,a-t*Math.sin(e)]}v?(c=0,f=o,h=s):r=i&&t<=a);var i,a},pathArc:function(t,e,r,n,i){return f(null,t,e,r,n,i,0)},pathSector:function(t,e,r,n,i){return f(null,t,e,r,n,i,1)},pathAnnulus:function(t,e,r,n,i,a){return f(t,e,r,n,i,a,1)}}},73627:function(t,e){"use strict";var r=Array.isArray,n=ArrayBuffer,i=DataView;function a(t){return n.isView(t)&&!(t instanceof i)}function o(t){return r(t)||a(t)}function s(t,e,r){if(o(t)){if(o(t[0])){for(var n=r,i=0;ii.max?e.set(r):e.set(+t)}},integer:{coerceFunction:function(t,e,r,i){t%1||!n(t)||void 0!==i.min&&ti.max?e.set(r):e.set(+t)}},string:{coerceFunction:function(t,e,r,n){if("string"!=typeof t){var i="number"==typeof t;!0!==n.strict&&i?e.set(String(t)):e.set(r)}else n.noBlank&&!t?e.set(r):e.set(t)}},color:{coerceFunction:function(t,e,r){i(t).isValid()?e.set(t):e.set(r)}},colorlist:{coerceFunction:function(t,e,r){Array.isArray(t)&&t.length&&t.every((function(t){return i(t).isValid()}))?e.set(t):e.set(r)}},colorscale:{coerceFunction:function(t,e,r){e.set(o.get(t,r))}},angle:{coerceFunction:function(t,e,r){"auto"===t?e.set("auto"):n(t)?e.set(f(+t,360)):e.set(r)}},subplotid:{coerceFunction:function(t,e,r,n){var i=n.regex||c(r);"string"==typeof t&&i.test(t)?e.set(t):e.set(r)},validateFunction:function(t,e){var r=e.dflt;return t===r||"string"==typeof t&&!!c(r).test(t)}},flaglist:{coerceFunction:function(t,e,r,n){if(-1===(n.extras||[]).indexOf(t))if("string"==typeof t){for(var i=t.split("+"),a=0;a=n&&t<=i?t:c}if("string"!=typeof t&&"number"!=typeof t)return c;t=String(t);var u=_(r),y=t.charAt(0);!u||"G"!==y&&"g"!==y||(t=t.substr(1),r="");var w=u&&"chinese"===r.substr(0,7),T=t.match(w?x:m);if(!T)return c;var k=T[1],A=T[3]||"1",M=Number(T[5]||1),S=Number(T[7]||0),E=Number(T[9]||0),L=Number(T[11]||0);if(u){if(2===k.length)return c;var C;k=Number(k);try{var P=g.getComponentMethod("calendars","getCal")(r);if(w){var O="i"===A.charAt(A.length-1);A=parseInt(A,10),C=P.newDate(k,P.toMonthIndex(k,A,O),M)}else C=P.newDate(k,Number(A),M)}catch(t){return c}return C?(C.toJD()-v)*f+S*h+E*p+L*d:c}k=2===k.length?(Number(k)+2e3-b)%100+b:Number(k),A-=1;var I=new Date(Date.UTC(2e3,A,M,S,E));return I.setUTCFullYear(k),I.getUTCMonth()!==A||I.getUTCDate()!==M?c:I.getTime()+L*d},n=e.MIN_MS=e.dateTime2ms("-9999"),i=e.MAX_MS=e.dateTime2ms("9999-12-31 23:59:59.9999"),e.isDateTime=function(t,r){return e.dateTime2ms(t,r)!==c};var T=90*f,k=3*h,A=5*p;function M(t,e,r,n,i){if((e||r||n||i)&&(t+=" "+w(e,2)+":"+w(r,2),(n||i)&&(t+=":"+w(n,2),i))){for(var a=4;i%10==0;)a-=1,i/=10;t+="."+w(i,a)}return t}e.ms2DateTime=function(t,e,r){if("number"!=typeof t||!(t>=n&&t<=i))return c;e||(e=0);var a,o,s,u,m,x,b=Math.floor(10*l(t+.05,1)),w=Math.round(t-b/10);if(_(r)){var S=Math.floor(w/f)+v,E=Math.floor(l(t,f));try{a=g.getComponentMethod("calendars","getCal")(r).fromJD(S).formatDate("yyyy-mm-dd")}catch(t){a=y("G%Y-%m-%d")(new Date(w))}if("-"===a.charAt(0))for(;a.length<11;)a="-0"+a.substr(1);else for(;a.length<10;)a="0"+a;o=e=n+f&&t<=i-f))return c;var e=Math.floor(10*l(t+.05,1)),r=new Date(Math.round(t-e/10));return M(a("%Y-%m-%d")(r),r.getHours(),r.getMinutes(),r.getSeconds(),10*r.getUTCMilliseconds()+e)},e.cleanDate=function(t,r,n){if(t===c)return r;if(e.isJSDate(t)||"number"==typeof t&&isFinite(t)){if(_(n))return s.error("JS Dates and milliseconds are incompatible with world calendars",t),r;if(!(t=e.ms2DateTimeLocal(+t))&&void 0!==r)return r}else if(!e.isDateTime(t,n))return s.error("unrecognized date",t),r;return t};var S=/%\d?f/g,E=/%h/g,L={1:"1",2:"1",3:"2",4:"2"};function C(t,e,r,n){t=t.replace(S,(function(t){var r=Math.min(+t.charAt(1)||6,6);return(e/1e3%1+2).toFixed(r).substr(2).replace(/0+$/,"")||"0"}));var i=new Date(Math.floor(e+.05));if(t=t.replace(E,(function(){return L[r("%q")(i)]})),_(n))try{t=g.getComponentMethod("calendars","worldCalFmt")(t,e,n)}catch(t){return"Invalid"}return r(t)(i)}var P=[59,59.9,59.99,59.999,59.9999];e.formatDate=function(t,e,r,n,i,a){if(i=_(i)&&i,!e)if("y"===r)e=a.year;else if("m"===r)e=a.month;else{if("d"!==r)return function(t,e){var r=l(t+.05,f),n=w(Math.floor(r/h),2)+":"+w(l(Math.floor(r/p),60),2);if("M"!==e){o(e)||(e=0);var i=(100+Math.min(l(t/d,60),P[e])).toFixed(e).substr(1);e>0&&(i=i.replace(/0+$/,"").replace(/[\.]$/,"")),n+=":"+i}return n}(t,r)+"\n"+C(a.dayMonthYear,t,n,i);e=a.dayMonth+"\n"+a.year}return C(e,t,n,i)};var O=3*f;e.incrementMonth=function(t,e,r){r=_(r)&&r;var n=l(t,f);if(t=Math.round(t-n),r)try{var i=Math.round(t/f)+v,a=g.getComponentMethod("calendars","getCal")(r),o=a.fromJD(i);return e%12?a.add(o,e,"m"):a.add(o,e/12,"y"),(o.toJD()-v)*f+n}catch(e){s.error("invalid ms "+t+" in calendar "+r)}var u=new Date(t+O);return u.setUTCMonth(u.getUTCMonth()+e)+n-O},e.findExactDates=function(t,e){for(var r,n,i=0,a=0,s=0,l=0,u=_(e)&&g.getComponentMethod("calendars","getCal")(e),c=0;c0&&t[e+1][0]<0)return e;return null}switch(e="RUS"===s||"FJI"===s?function(t){var e;if(null===u(t))e=t;else for(e=new Array(t.length),i=0;ie?r[n++]=[t[i][0]+360,t[i][1]]:i===e?(r[n++]=t[i],r[n++]=[t[i][0],-90]):r[n++]=t[i];var a=h.tester(r);a.pts.pop(),l.push(a)}:function(t){l.push(h.tester(t))},a.type){case"MultiPolygon":for(r=0;ri&&(i=u,e=l)}else e=r;return o.default(e).geometry.coordinates}(c),n.fIn=t,n.fOut=c,s.push(c)}else u.log(["Location",n.loc,"does not have a valid GeoJSON geometry.","Traces with locationmode *geojson-id* only support","*Polygon* and *MultiPolygon* geometries."].join(" "))}delete i[r]}switch(r.type){case"FeatureCollection":var h=r.features;for(n=0;n100?(clearInterval(a),n("Unexpected error while fetching from "+t)):void i++}),50)}))}for(var o=0;o0&&(r.push(i),i=[])}return i.length>0&&r.push(i),r},e.makeLine=function(t){return 1===t.length?{type:"LineString",coordinates:t[0]}:{type:"MultiLineString",coordinates:t}},e.makePolygon=function(t){if(1===t.length)return{type:"Polygon",coordinates:t};for(var e=new Array(t.length),r=0;r1||v<0||v>1?null:{x:t+l*v,y:e+f*v}}function l(t,e,r,n,i){var a=n*t+i*e;if(a<0)return n*n+i*i;if(a>r){var o=n-t,s=i-e;return o*o+s*s}var l=n*e-i*t;return l*l/r}e.segmentsIntersect=s,e.segmentDistance=function(t,e,r,n,i,a,o,u){if(s(t,e,r,n,i,a,o,u))return 0;var c=r-t,f=n-e,h=o-i,p=u-a,d=c*c+f*f,v=h*h+p*p,g=Math.min(l(c,f,d,i-t,a-e),l(c,f,d,o-t,u-e),l(h,p,v,t-i,e-a),l(h,p,v,r-i,n-a));return Math.sqrt(g)},e.getTextLocation=function(t,e,r,s){if(t===i&&s===a||(n={},i=t,a=s),n[r])return n[r];var l=t.getPointAtLength(o(r-s/2,e)),u=t.getPointAtLength(o(r+s/2,e)),c=Math.atan((u.y-l.y)/(u.x-l.x)),f=t.getPointAtLength(o(r,e)),h={x:(4*f.x+l.x+u.x)/6,y:(4*f.y+l.y+u.y)/6,theta:c};return n[r]=h,h},e.clearLocationCache=function(){i=null},e.getVisibleSegment=function(t,e,r){var n,i,a=e.left,o=e.right,s=e.top,l=e.bottom,u=0,c=t.getTotalLength(),f=c;function h(e){var r=t.getPointAtLength(e);0===e?n=r:e===c&&(i=r);var u=r.xo?r.x-o:0,f=r.yl?r.y-l:0;return Math.sqrt(u*u+f*f)}for(var p=h(u);p;){if((u+=p+r)>f)return;p=h(u)}for(p=h(f);p;){if(u>(f-=p+r))return;p=h(f)}return{min:u,max:f,len:f-u,total:c,isClosed:0===u&&f===c&&Math.abs(n.x-i.x)<.1&&Math.abs(n.y-i.y)<.1}},e.findPointOnPath=function(t,e,r,n){for(var i,a,o,s=(n=n||{}).pathLength||t.getTotalLength(),l=n.tolerance||.001,u=n.iterationLimit||30,c=t.getPointAtLength(0)[r]>t.getPointAtLength(s)[r]?-1:1,f=0,h=0,p=s;f0?p=i:h=i,f++}return a}},81697:function(t,e,r){"use strict";var n=r(92770),i=r(84267),a=r(25075),o=r(21081),s=r(22399).defaultLine,l=r(73627).isArrayOrTypedArray,u=a(s);function c(t,e){var r=t;return r[3]*=e,r}function f(t){if(n(t))return u;var e=a(t);return e.length?e:u}function h(t){return n(t)?t:1}t.exports={formatColor:function(t,e,r){var n,i,s,p,d,v=t.color,g=l(v),y=l(e),m=o.extractOpts(t),x=[];if(n=void 0!==m.colorscale?o.makeColorScaleFuncFromTrace(t):f,i=g?function(t,e){return void 0===t[e]?u:a(n(t[e]))}:f,s=y?function(t,e){return void 0===t[e]?1:h(t[e])}:h,g||y)for(var b=0;b1?(r*t+r*e)/r:t+e,i=String(n).length;if(i>16){var a=String(e).length;if(i>=String(t).length+a){var o=parseFloat(n).toPrecision(12);-1===o.indexOf("e+")&&(n=+o)}}return n}},71828:function(t,e,r){"use strict";var n=r(39898),i=r(84096).g0,a=r(60721).WU,o=r(92770),s=r(50606),l=s.FP_SAFE,u=-l,c=s.BADNUM,f=t.exports={};f.adjustFormat=function(t){return!t||/^\d[.]\df/.test(t)||/[.]\d%/.test(t)?t:"0.f"===t?"~f":/^\d%/.test(t)?"~%":/^\ds/.test(t)?"~s":!/^[~,.0$]/.test(t)&&/[&fps]/.test(t)?"~"+t:t};var h={};f.warnBadFormat=function(t){var e=String(t);h[e]||(h[e]=1,f.warn('encountered bad format: "'+e+'"'))},f.noFormat=function(t){return String(t)},f.numberFormat=function(t){var e;try{e=a(f.adjustFormat(t))}catch(e){return f.warnBadFormat(t),f.noFormat}return e},f.nestedProperty=r(65487),f.keyedContainer=r(66636),f.relativeAttr=r(6962),f.isPlainObject=r(41965),f.toLogRange=r(58163),f.relinkPrivateKeys=r(51332);var p=r(73627);f.isTypedArray=p.isTypedArray,f.isArrayOrTypedArray=p.isArrayOrTypedArray,f.isArray1D=p.isArray1D,f.ensureArray=p.ensureArray,f.concat=p.concat,f.maxRowLength=p.maxRowLength,f.minRowLength=p.minRowLength;var d=r(64872);f.mod=d.mod,f.modHalf=d.modHalf;var v=r(96554);f.valObjectMeta=v.valObjectMeta,f.coerce=v.coerce,f.coerce2=v.coerce2,f.coerceFont=v.coerceFont,f.coercePattern=v.coercePattern,f.coerceHoverinfo=v.coerceHoverinfo,f.coerceSelectionMarkerOpacity=v.coerceSelectionMarkerOpacity,f.validate=v.validate;var g=r(41631);f.dateTime2ms=g.dateTime2ms,f.isDateTime=g.isDateTime,f.ms2DateTime=g.ms2DateTime,f.ms2DateTimeLocal=g.ms2DateTimeLocal,f.cleanDate=g.cleanDate,f.isJSDate=g.isJSDate,f.formatDate=g.formatDate,f.incrementMonth=g.incrementMonth,f.dateTick0=g.dateTick0,f.dfltRange=g.dfltRange,f.findExactDates=g.findExactDates,f.MIN_MS=g.MIN_MS,f.MAX_MS=g.MAX_MS;var y=r(65888);f.findBin=y.findBin,f.sorterAsc=y.sorterAsc,f.sorterDes=y.sorterDes,f.distinctVals=y.distinctVals,f.roundUp=y.roundUp,f.sort=y.sort,f.findIndexOfMin=y.findIndexOfMin,f.sortObjectKeys=r(78607);var m=r(80038);f.aggNums=m.aggNums,f.len=m.len,f.mean=m.mean,f.median=m.median,f.midRange=m.midRange,f.variance=m.variance,f.stdev=m.stdev,f.interp=m.interp;var x=r(35657);f.init2dArray=x.init2dArray,f.transposeRagged=x.transposeRagged,f.dot=x.dot,f.translationMatrix=x.translationMatrix,f.rotationMatrix=x.rotationMatrix,f.rotationXYMatrix=x.rotationXYMatrix,f.apply3DTransform=x.apply3DTransform,f.apply2DTransform=x.apply2DTransform,f.apply2DTransform2=x.apply2DTransform2,f.convertCssMatrix=x.convertCssMatrix,f.inverseTransformMatrix=x.inverseTransformMatrix;var b=r(26348);f.deg2rad=b.deg2rad,f.rad2deg=b.rad2deg,f.angleDelta=b.angleDelta,f.angleDist=b.angleDist,f.isFullCircle=b.isFullCircle,f.isAngleInsideSector=b.isAngleInsideSector,f.isPtInsideSector=b.isPtInsideSector,f.pathArc=b.pathArc,f.pathSector=b.pathSector,f.pathAnnulus=b.pathAnnulus;var _=r(99863);f.isLeftAnchor=_.isLeftAnchor,f.isCenterAnchor=_.isCenterAnchor,f.isRightAnchor=_.isRightAnchor,f.isTopAnchor=_.isTopAnchor,f.isMiddleAnchor=_.isMiddleAnchor,f.isBottomAnchor=_.isBottomAnchor;var w=r(87642);f.segmentsIntersect=w.segmentsIntersect,f.segmentDistance=w.segmentDistance,f.getTextLocation=w.getTextLocation,f.clearLocationCache=w.clearLocationCache,f.getVisibleSegment=w.getVisibleSegment,f.findPointOnPath=w.findPointOnPath;var T=r(1426);f.extendFlat=T.extendFlat,f.extendDeep=T.extendDeep,f.extendDeepAll=T.extendDeepAll,f.extendDeepNoArrays=T.extendDeepNoArrays;var k=r(47769);f.log=k.log,f.warn=k.warn,f.error=k.error;var A=r(30587);f.counterRegex=A.counter;var M=r(79990);f.throttle=M.throttle,f.throttleDone=M.done,f.clearThrottle=M.clear;var S=r(24401);function E(t){var e={};for(var r in t)for(var n=t[r],i=0;il||t=e)&&o(t)&&t>=0&&t%1==0},f.noop=r(64213),f.identity=r(23389),f.repeat=function(t,e){for(var r=new Array(e),n=0;nr?Math.max(r,Math.min(e,t)):Math.max(e,Math.min(r,t))},f.bBoxIntersect=function(t,e,r){return r=r||0,t.left<=e.right+r&&e.left<=t.right+r&&t.top<=e.bottom+r&&e.top<=t.bottom+r},f.simpleMap=function(t,e,r,n,i){for(var a=t.length,o=new Array(a),s=0;s=Math.pow(2,r)?i>10?(f.warn("randstr failed uniqueness"),l):t(e,r,n,(i||0)+1):l},f.OptionControl=function(t,e){t||(t={}),e||(e="opt");var r={optionList:[],_newoption:function(n){n[e]=t,r[n.name]=n,r.optionList.push(n)}};return r["_"+e]=t,r},f.smooth=function(t,e){if((e=Math.round(e)||0)<2)return t;var r,n,i,a,o=t.length,s=2*o,l=2*e-1,u=new Array(l),c=new Array(o);for(r=0;r=s&&(i-=s*Math.floor(i/s)),i<0?i=-1-i:i>=o&&(i=s-1-i),a+=t[i]*u[n];c[r]=a}return c},f.syncOrAsync=function(t,e,r){var n;function i(){return f.syncOrAsync(t,e,r)}for(;t.length;)if((n=(0,t.splice(0,1)[0])(e))&&n.then)return n.then(i);return r&&r(e)},f.stripTrailingSlash=function(t){return"/"===t.substr(-1)?t.substr(0,t.length-1):t},f.noneOrAll=function(t,e,r){if(t){var n,i=!1,a=!0;for(n=0;n0?e:0}))},f.fillArray=function(t,e,r,n){if(n=n||f.identity,f.isArrayOrTypedArray(t))for(var i=0;i1?i+o[1]:"";if(a&&(o.length>1||s.length>4||r))for(;n.test(s);)s=s.replace(n,"$1"+a+"$2");return s+l},f.TEMPLATE_STRING_REGEX=/%{([^\s%{}:]*)([:|\|][^}]*)?}/g;var z=/^\w*$/;f.templateString=function(t,e){var r={};return t.replace(f.TEMPLATE_STRING_REGEX,(function(t,n){var i;return z.test(n)?i=e[n]:(r[n]=r[n]||f.nestedProperty(e,n).get,i=r[n]()),f.isValidTextValue(i)?i:""}))};var R={max:10,count:0,name:"hovertemplate"};f.hovertemplateString=function(){return U.apply(R,arguments)};var F={max:10,count:0,name:"texttemplate"};f.texttemplateString=function(){return U.apply(F,arguments)};var B=/^(\S+)([\*\/])(-?\d+(\.\d+)?)$/,N={max:10,count:0,name:"texttemplate",parseMultDiv:!0};f.texttemplateStringForShapes=function(){return U.apply(N,arguments)};var j=/^[:|\|]/;function U(t,e,r){var n=this,a=arguments;e||(e={});var o={};return t.replace(f.TEMPLATE_STRING_REGEX,(function(t,s,l){var u="_xother"===s||"_yother"===s,c="_xother_"===s||"_yother_"===s,h="xother_"===s||"yother_"===s,p="xother"===s||"yother"===s||u||h||c,d=s;(u||c)&&(d=d.substring(1)),(h||c)&&(d=d.substring(0,d.length-1));var v,g,y,m=null,x=null;if(n.parseMultDiv){var b=function(t){var e=t.match(B);return e?{key:e[1],op:e[2],number:Number(e[3])}:{key:t,op:null,number:null}}(d);d=b.key,m=b.op,x=b.number}if(p){if(void 0===(v=e[d]))return""}else for(y=3;y=48&&o<=57,u=s>=48&&s<=57;if(l&&(n=10*n+o-48),u&&(i=10*i+s-48),!l||!u){if(n!==i)return n-i;if(o!==s)return o-s}}return i-n};var V=2e9;f.seedPseudoRandom=function(){V=2e9},f.pseudoRandom=function(){var t=V;return V=(69069*V+1)%4294967296,Math.abs(V-t)<429496729?f.pseudoRandom():V/4294967296},f.fillText=function(t,e,r){var n=Array.isArray(r)?function(t){r.push(t)}:function(t){r.text=t},i=f.extractOption(t,e,"htx","hovertext");if(f.isValidTextValue(i))return n(i);var a=f.extractOption(t,e,"tx","text");return f.isValidTextValue(a)?n(a):void 0},f.isValidTextValue=function(t){return t||0===t},f.formatPercent=function(t,e){e=e||0;for(var r=(Math.round(100*t*Math.pow(10,e))*Math.pow(.1,e)).toFixed(e)+"%",n=0;n1&&(u=1):u=0,f.strTranslate(i-u*(r+o),a-u*(n+s))+f.strScale(u)+(l?"rotate("+l+(e?"":" "+r+" "+n)+")":"")},f.setTransormAndDisplay=function(t,e){t.attr("transform",f.getTextTransform(e)),t.style("display",e.scale?null:"none")},f.ensureUniformFontSize=function(t,e){var r=f.extendFlat({},e);return r.size=Math.max(e.size,t._fullLayout.uniformtext.minsize||0),r},f.join2=function(t,e,r){var n=t.length;return n>1?t.slice(0,-1).join(e)+r+t[n-1]:t.join(e)},f.bigFont=function(t){return Math.round(1.2*t)};var H=f.getFirefoxVersion(),q=null!==H&&H<86;f.getPositionFromD3Event=function(){return q?[n.event.layerX,n.event.layerY]:[n.event.offsetX,n.event.offsetY]}},41965:function(t){"use strict";t.exports=function(t){return window&&window.process&&window.process.versions?"[object Object]"===Object.prototype.toString.call(t):"[object Object]"===Object.prototype.toString.call(t)&&Object.getPrototypeOf(t).hasOwnProperty("hasOwnProperty")}},66636:function(t,e,r){"use strict";var n=r(65487),i=/^\w*$/;t.exports=function(t,e,r,a){var o,s,l;r=r||"name",a=a||"value";var u={};e&&e.length?(l=n(t,e),s=l.get()):s=t,e=e||"";var c={};if(s)for(o=0;o2)return u[e]=2|u[e],h.set(t,null);if(f){for(o=e;o1){var e=["LOG:"];for(t=0;t1){var r=[];for(t=0;t"),"long")}},a.warn=function(){var t;if(n.logging>0){var e=["WARN:"];for(t=0;t0){var r=[];for(t=0;t"),"stick")}},a.error=function(){var t;if(n.logging>0){var e=["ERROR:"];for(t=0;t0){var r=[];for(t=0;t"),"stick")}}},77310:function(t,e,r){"use strict";var n=r(39898);t.exports=function(t,e,r){var i=t.selectAll("g."+r.replace(/\s/g,".")).data(e,(function(t){return t[0].trace.uid}));i.exit().remove(),i.enter().append("g").attr("class",r),i.order();var a=t.classed("rangeplot")?"nodeRangePlot3":"node3";return i.each((function(t){t[0][a]=n.select(this)})),i}},35657:function(t,e,r){"use strict";var n=r(79576);e.init2dArray=function(t,e){for(var r=new Array(t),n=0;ne/2?t-Math.round(t/e)*e:t}}},65487:function(t,e,r){"use strict";var n=r(92770),i=r(73627).isArrayOrTypedArray;function a(t,e){return function(){var r,n,o,s,l,u=t;for(s=0;s/g),l=0;la||u===i||us||e&&l(t))}:function(t,e){var l=t[0],u=t[1];if(l===i||la||u===i||us)return!1;var c,f,h,p,d,v=r.length,g=r[0][0],y=r[0][1],m=0;for(c=1;cMath.max(f,g)||u>Math.max(h,y)))if(uc||Math.abs(n(o,h))>i)return!0;return!1},a.filter=function(t,e){var r=[t[0]],n=0,i=0;function o(o){t.push(o);var s=r.length,l=n;r.splice(i+1);for(var u=l+1;u1&&o(t.pop()),{addPt:o,raw:t,filtered:r}}},79749:function(t,e,r){"use strict";var n=r(58617),i=r(98580);t.exports=function(t,e,a){var o=t._fullLayout,s=!0;return o._glcanvas.each((function(n){if(n.regl)n.regl.preloadCachedCode(a);else if(!n.pick||o._has("parcoords")){try{n.regl=i({canvas:this,attributes:{antialias:!n.pick,preserveDrawingBuffer:!0},pixelRatio:t._context.plotGlPixelRatio||r.g.devicePixelRatio,extensions:e||[],cachedCode:a||{}})}catch(t){s=!1}n.regl||(s=!1),s&&this.addEventListener("webglcontextlost",(function(e){t&&t.emit&&t.emit("plotly_webglcontextlost",{event:e,layer:n.key})}),!1)}})),s||n({container:o._glcontainer.node()}),s}},45142:function(t,e,r){"use strict";var n=r(92770),i=r(35791);t.exports=function(t){var e;if("string"!=typeof(e=t&&t.hasOwnProperty("userAgent")?t.userAgent:function(){var t;return"undefined"!=typeof navigator&&(t=navigator.userAgent),t&&t.headers&&"string"==typeof t.headers["user-agent"]&&(t=t.headers["user-agent"]),t}()))return!0;var r=i({ua:{headers:{"user-agent":e}},tablet:!0,featureDetect:!1});if(!r)for(var a=e.split(" "),o=1;o-1;s--){var l=a[s];if("Version/"===l.substr(0,8)){var u=l.substr(8).split(".")[0];if(n(u)&&(u=+u),u>=13)return!0}}return r}},75138:function(t){"use strict";t.exports=function(t,e){if(e instanceof RegExp){for(var r=e.toString(),n=0;ni.queueLength&&(t.undoQueue.queue.shift(),t.undoQueue.index--))},startSequence:function(t){t.undoQueue=t.undoQueue||{index:0,queue:[],sequence:!1},t.undoQueue.sequence=!0,t.undoQueue.beginSequence=!0},stopSequence:function(t){t.undoQueue=t.undoQueue||{index:0,queue:[],sequence:!1},t.undoQueue.sequence=!1,t.undoQueue.beginSequence=!1},undo:function(t){var e,r;if(!(void 0===t.undoQueue||isNaN(t.undoQueue.index)||t.undoQueue.index<=0)){for(t.undoQueue.index--,e=t.undoQueue.queue[t.undoQueue.index],t.undoQueue.inSequence=!0,r=0;r=t.undoQueue.queue.length)){for(e=t.undoQueue.queue[t.undoQueue.index],t.undoQueue.inSequence=!0,r=0;re}function f(t,e){return t>=e}e.findBin=function(t,e,r){if(n(e.start))return r?Math.ceil((t-e.start)/e.size-s)-1:Math.floor((t-e.start)/e.size+s);var a,o,h=0,p=e.length,d=0,v=p>1?(e[p-1]-e[0])/(p-1):1;for(o=v>=0?r?l:u:r?f:c,t+=v*s*(r?-1:1)*(v>=0?1:-1);h90&&i.log("Long binary search..."),h-1},e.sorterAsc=function(t,e){return t-e},e.sorterDes=function(t,e){return e-t},e.distinctVals=function(t){var r,n=t.slice();for(n.sort(e.sorterAsc),r=n.length-1;r>-1&&n[r]===o;r--);for(var i,a=n[r]-n[0]||1,s=a/(r||1)/1e4,l=[],u=0;u<=r;u++){var c=n[u],f=c-i;void 0===i?(l.push(c),i=c):f>s&&(a=Math.min(a,f),l.push(c),i=c)}return{vals:l,minDiff:a}},e.roundUp=function(t,e,r){for(var n,i=0,a=e.length-1,o=0,s=r?0:1,l=r?1:0,u=r?Math.ceil:Math.floor;i0&&(n=1),r&&n)return t.sort(e)}return n?t:t.reverse()},e.findIndexOfMin=function(t,e){e=e||a;for(var r,n=1/0,i=0;ia.length)&&(o=a.length),n(r)||(r=!1),i(a[0])){for(l=new Array(o),s=0;st.length-1)return t[t.length-1];var r=e%1;return r*t[Math.ceil(e)]+(1-r)*t[Math.floor(e)]}},78614:function(t,e,r){"use strict";var n=r(25075);t.exports=function(t){return t?n(t):[0,0,0,1]}},3883:function(t,e,r){"use strict";var n=r(32396),i=r(91424),a=r(71828),o=null;t.exports=function(){if(null!==o)return o;o=!1;var t=a.isIE()||a.isSafari()||a.isIOS();if(window.navigator.userAgent&&!t){var e=Array.from(n.CSS_DECLARATIONS).reverse(),r=window.CSS&&window.CSS.supports||window.supportsCSS;if("function"==typeof r)o=e.some((function(t){return r.apply(null,t)}));else{var s=i.tester.append("image").attr("style",n.STYLE),l=window.getComputedStyle(s.node()).imageRendering;o=e.some((function(t){var e=t[1];return l===e||l===e.toLowerCase()})),s.remove()}}return o}},63893:function(t,e,r){"use strict";var n=r(39898),i=r(71828),a=i.strTranslate,o=r(77922),s=r(18783).LINE_SPACING,l=/([^$]*)([$]+[^$]*[$]+)([^$]*)/;e.convertToTspans=function(t,r,g){var S=t.text(),E=!t.attr("data-notex")&&r&&r._context.typesetMath&&"undefined"!=typeof MathJax&&S.match(l),P=n.select(t.node().parentNode);if(!P.empty()){var O=t.attr("class")?t.attr("class").split(" ")[0]:"text";return O+="-math",P.selectAll("svg."+O).remove(),P.selectAll("g."+O+"-group").remove(),t.style("display",null).attr({"data-unformatted":S,"data-math":"N"}),E?(r&&r._promises||[]).push(new Promise((function(e){t.style("display","none");var r=parseInt(t.node().style.fontSize,10),o={fontSize:r};!function(t,e,r){var a,o,s,l,h=parseInt((MathJax.version||"").split(".")[0]);if(2===h||3===h){var p=function(){var r="math-output-"+i.randstr({},64),a=(l=n.select("body").append("div").attr({id:r}).style({visibility:"hidden",position:"absolute","font-size":e.fontSize+"px"}).text(t.replace(u,"\\lt ").replace(c,"\\gt "))).node();return 2===h?MathJax.Hub.Typeset(a):MathJax.typeset([a])},d=function(){var e=l.select(2===h?".MathJax_SVG":".MathJax"),a=!e.empty()&&l.select("svg").node();if(a){var o,s=a.getBoundingClientRect();o=2===h?n.select("body").select("#MathJax_SVG_glyphs"):e.select("defs"),r(e,o,s)}else i.log("There was an error in the tex syntax.",t),r();l.remove()};2===h?MathJax.Hub.Queue((function(){return o=i.extendDeepAll({},MathJax.Hub.config),s=MathJax.Hub.processSectionDelay,void 0!==MathJax.Hub.processSectionDelay&&(MathJax.Hub.processSectionDelay=0),MathJax.Hub.Config({messageStyle:"none",tex2jax:{inlineMath:f},displayAlign:"left"})}),(function(){if("SVG"!==(a=MathJax.Hub.config.menuSettings.renderer))return MathJax.Hub.setRenderer("SVG")}),p,d,(function(){if("SVG"!==a)return MathJax.Hub.setRenderer(a)}),(function(){return void 0!==s&&(MathJax.Hub.processSectionDelay=s),MathJax.Hub.Config(o)})):3===h&&(o=i.extendDeepAll({},MathJax.config),MathJax.config.tex||(MathJax.config.tex={}),MathJax.config.tex.inlineMath=f,"svg"!==(a=MathJax.config.startup.output)&&(MathJax.config.startup.output="svg"),MathJax.startup.defaultReady(),MathJax.startup.promise.then((function(){p(),d(),"svg"!==a&&(MathJax.config.startup.output=a),MathJax.config=o})))}else i.warn("No MathJax version:",MathJax.version)}(E[2],o,(function(n,i,o){P.selectAll("svg."+O).remove(),P.selectAll("g."+O+"-group").remove();var s=n&&n.select("svg");if(!s||!s.node())return I(),void e();var l=P.append("g").classed(O+"-group",!0).attr({"pointer-events":"none","data-unformatted":S,"data-math":"Y"});l.node().appendChild(s.node()),i&&i.node()&&s.node().insertBefore(i.node().cloneNode(!0),s.node().firstChild);var u=o.width,c=o.height;s.attr({class:O,height:c,preserveAspectRatio:"xMinYMin meet"}).style({overflow:"visible","pointer-events":"none"});var f=t.node().style.fill||"black",h=s.select("g");h.attr({fill:f,stroke:f});var p=h.node().getBoundingClientRect(),d=p.width,v=p.height;(d>u||v>c)&&(s.style("overflow","hidden"),d=(p=s.node().getBoundingClientRect()).width,v=p.height);var y=+t.attr("x"),m=+t.attr("y"),x=-(r||t.node().getBoundingClientRect().height)/4;if("y"===O[0])l.attr({transform:"rotate("+[-90,y,m]+")"+a(-d/2,x-v/2)});else if("l"===O[0])m=x-v/2;else if("a"===O[0]&&0!==O.indexOf("atitle"))y=0,m=x;else{var b=t.attr("text-anchor");y-=d*("middle"===b?.5:"end"===b?1:0),m=m+x-v/2}s.attr({x:y,y:m}),g&&g.call(t,l),e(l)}))}))):I(),t}function I(){P.empty()||(O=t.attr("class")+"-math",P.select("svg."+O).remove()),t.text("").style("white-space","pre");var r=function(t,e){e=e.replace(y," ");var r,a=!1,l=[],u=-1;function c(){u++;var e=document.createElementNS(o.svg,"tspan");n.select(e).attr({class:"line",dy:u*s+"em"}),t.appendChild(e),r=e;var i=l;if(l=[{node:e}],i.length>1)for(var a=1;a doesnt match end tag <"+t+">. Pretending it did match.",e),r=l[l.length-1].node}else i.log("Ignoring unexpected end tag .",e)}b.test(e)?c():(r=t,l=[{node:t}]);for(var E=e.split(m),P=0;P|>|>)/g,f=[["$","$"],["\\(","\\)"]],h={sup:"font-size:70%",sub:"font-size:70%",b:"font-weight:bold",i:"font-style:italic",a:"cursor:pointer",span:"",em:"font-style:italic;font-weight:bold"},p={sub:"0.3em",sup:"-0.6em"},d={sub:"-0.21em",sup:"0.42em"},v="​",g=["http:","https:","mailto:","",void 0,":"],y=e.NEWLINES=/(\r\n?|\n)/g,m=/(<[^<>]*>)/,x=/<(\/?)([^ >]*)(\s+(.*))?>/i,b=//i;e.BR_TAG_ALL=//gi;var _=/(^|[\s"'])style\s*=\s*("([^"]*);?"|'([^']*);?')/i,w=/(^|[\s"'])href\s*=\s*("([^"]*)"|'([^']*)')/i,T=/(^|[\s"'])target\s*=\s*("([^"\s]*)"|'([^'\s]*)')/i,k=/(^|[\s"'])popup\s*=\s*("([\w=,]*)"|'([\w=,]*)')/i;function A(t,e){if(!t)return null;var r=t.match(e),n=r&&(r[3]||r[4]);return n&&L(n)}var M=/(^|;)\s*color:/;e.plainText=function(t,e){for(var r=void 0!==(e=e||{}).len&&-1!==e.len?e.len:1/0,n=void 0!==e.allowedTags?e.allowedTags:["br"],i=t.split(m),a=[],o="",s=0,l=0;l3?a.push(u.substr(0,p-3)+"..."):a.push(u.substr(0,p));break}o=""}}return a.join("")};var S={mu:"μ",amp:"&",lt:"<",gt:">",nbsp:" ",times:"×",plusmn:"±",deg:"°"},E=/&(#\d+|#x[\da-fA-F]+|[a-z]+);/g;function L(t){return t.replace(E,(function(t,e){return("#"===e.charAt(0)?function(t){if(!(t>1114111)){var e=String.fromCodePoint;if(e)return e(t);var r=String.fromCharCode;return t<=65535?r(t):r(55232+(t>>10),t%1024+56320)}}("x"===e.charAt(1)?parseInt(e.substr(2),16):parseInt(e.substr(1),10)):S[e])||t}))}function C(t){var e=encodeURI(decodeURI(t)),r=document.createElement("a"),n=document.createElement("a");r.href=t,n.href=e;var i=r.protocol,a=n.protocol;return-1!==g.indexOf(i)&&-1!==g.indexOf(a)?e:""}function P(t,e,r){var n,a,o,s=r.horizontalAlign,l=r.verticalAlign||"top",u=t.node().getBoundingClientRect(),c=e.node().getBoundingClientRect();return a="bottom"===l?function(){return u.bottom-n.height}:"middle"===l?function(){return u.top+(u.height-n.height)/2}:function(){return u.top},o="right"===s?function(){return u.right-n.width}:"center"===s?function(){return u.left+(u.width-n.width)/2}:function(){return u.left},function(){n=this.node().getBoundingClientRect();var t=o()-c.left,e=a()-c.top,s=r.gd||{};if(r.gd){s._fullLayout._calcInverseTransform(s);var l=i.apply3DTransform(s._fullLayout._invTransform)(t,e);t=l[0],e=l[1]}return this.style({top:e+"px",left:t+"px","z-index":1e3}),this}}e.convertEntities=L,e.sanitizeHTML=function(t){t=t.replace(y," ");for(var e=document.createElement("p"),r=e,i=[],a=t.split(m),o=0;oa.ts+e?l():a.timer=setTimeout((function(){l(),a.timer=null}),e)},e.done=function(t){var e=r[t];return e&&e.timer?new Promise((function(t){var r=e.onDone;e.onDone=function(){r&&r(),t(),e.onDone=null}})):Promise.resolve()},e.clear=function(t){if(t)n(r[t]),delete r[t];else for(var i in r)e.clear(i)}},58163:function(t,e,r){"use strict";var n=r(92770);t.exports=function(t,e){if(t>0)return Math.log(t)/Math.LN10;var r=Math.log(Math.min(e[0],e[1]))/Math.LN10;return n(r)||(r=Math.log(Math.max(e[0],e[1]))/Math.LN10-6),r}},90973:function(t,e,r){"use strict";var n=t.exports={},i=r(78776).locationmodeToLayer,a=r(96892).zL;n.getTopojsonName=function(t){return[t.scope.replace(/ /g,"-"),"_",t.resolution.toString(),"m"].join("")},n.getTopojsonPath=function(t,e){return t+e+".json"},n.getTopojsonFeatures=function(t,e){var r=i[t.locationmode],n=e.objects[r];return a(e,n).features}},37815:function(t){"use strict";t.exports={moduleType:"locale",name:"en-US",dictionary:{"Click to enter Colorscale title":"Click to enter Colorscale title"},format:{date:"%m/%d/%Y"}}},92177:function(t){"use strict";t.exports={moduleType:"locale",name:"en",dictionary:{"Click to enter Colorscale title":"Click to enter Colourscale title"},format:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],periods:["AM","PM"],dateTime:"%a %b %e %X %Y",date:"%d/%m/%Y",time:"%H:%M:%S",decimal:".",thousands:",",grouping:[3],currency:["$",""],year:"%Y",month:"%b %Y",dayMonth:"%b %-d",dayMonthYear:"%b %-d, %Y"}}},14458:function(t,e,r){"use strict";var n=r(73972);t.exports=function(t){for(var e,r,i=n.layoutArrayContainers,a=n.layoutArrayRegexes,o=t.split("[")[0],s=0;s0&&o.log("Clearing previous rejected promises from queue."),t._promises=[]},e.cleanLayout=function(t){var r,n;t||(t={}),t.xaxis1&&(t.xaxis||(t.xaxis=t.xaxis1),delete t.xaxis1),t.yaxis1&&(t.yaxis||(t.yaxis=t.yaxis1),delete t.yaxis1),t.scene1&&(t.scene||(t.scene=t.scene1),delete t.scene1);var a=(s.subplotsRegistry.cartesian||{}).attrRegex,l=(s.subplotsRegistry.polar||{}).attrRegex,f=(s.subplotsRegistry.ternary||{}).attrRegex,h=(s.subplotsRegistry.gl3d||{}).attrRegex,v=Object.keys(t);for(r=0;r3?(I.x=1.02,I.xanchor="left"):I.x<-2&&(I.x=-.02,I.xanchor="right"),I.y>3?(I.y=1.02,I.yanchor="bottom"):I.y<-2&&(I.y=-.02,I.yanchor="top")),d(t),"rotate"===t.dragmode&&(t.dragmode="orbit"),u.clean(t),t.template&&t.template.layout&&e.cleanLayout(t.template.layout),t},e.cleanData=function(t){for(var r=0;r0)return t.substr(0,e)}e.hasParent=function(t,e){for(var r=b(e);r;){if(r in t)return!0;r=b(r)}return!1};var _=["x","y","z"];e.clearAxisTypes=function(t,e,r){for(var n=0;n1&&a.warn("Full array edits are incompatible with other edits",f);var m=r[""][""];if(u(m))e.set(null);else{if(!Array.isArray(m))return a.warn("Unrecognized full array edit value",f,m),!0;e.set(m)}return!v&&(h(g,y),p(t),!0)}var x,b,_,w,T,k,A,M,S=Object.keys(r).map(Number).sort(o),E=e.get(),L=E||[],C=c(y,f).get(),P=[],O=-1,I=L.length;for(x=0;xL.length-(A?0:1))a.warn("index out of range",f,_);else if(void 0!==k)T.length>1&&a.warn("Insertion & removal are incompatible with edits to the same index.",f,_),u(k)?P.push(_):A?("add"===k&&(k={}),L.splice(_,0,k),C&&C.splice(_,0,{})):a.warn("Unrecognized full object edit value",f,_,k),-1===O&&(O=_);else for(b=0;b=0;x--)L.splice(P[x],1),C&&C.splice(P[x],1);if(L.length?E||e.set(L):e.set(null),v)return!1;if(h(g,y),d!==i){var D;if(-1===O)D=S;else{for(I=Math.max(L.length,I),D=[],x=0;x=O);x++)D.push(_);for(x=O;x=t.data.length||i<-t.data.length)throw new Error(r+" must be valid indices for gd.data.");if(e.indexOf(i,n+1)>-1||i>=0&&e.indexOf(-t.data.length+i)>-1||i<0&&e.indexOf(t.data.length+i)>-1)throw new Error("each index in "+r+" must be unique.")}}function O(t,e,r){if(!Array.isArray(t.data))throw new Error("gd.data must be an array.");if(void 0===e)throw new Error("currentIndices is a required argument.");if(Array.isArray(e)||(e=[e]),P(t,e,"currentIndices"),void 0===r||Array.isArray(r)||(r=[r]),void 0!==r&&P(t,r,"newIndices"),void 0!==r&&e.length!==r.length)throw new Error("current and new indices must be of equal length.")}function I(t,e,r,n,a){!function(t,e,r,n){var i=o.isPlainObject(n);if(!Array.isArray(t.data))throw new Error("gd.data must be an array");if(!o.isPlainObject(e))throw new Error("update must be a key:value object");if(void 0===r)throw new Error("indices must be an integer or array of integers");for(var a in P(t,r,"indices"),e){if(!Array.isArray(e[a])||e[a].length!==r.length)throw new Error("attribute "+a+" must be an array of length equal to indices array length");if(i&&(!(a in n)||!Array.isArray(n[a])||n[a].length!==e[a].length))throw new Error("when maxPoints is set as a key:value object it must contain a 1:1 corrispondence with the keys and number of traces in the update object")}}(t,e,r,n);for(var l=function(t,e,r,n){var a,l,u,c,f,h=o.isPlainObject(n),p=[];for(var d in Array.isArray(r)||(r=[r]),r=C(r,t.data.length-1),e)for(var v=0;v-1&&-1===r.indexOf("grouptitlefont")?l(r,r.replace("titlefont","title.font")):r.indexOf("titleposition")>-1?l(r,r.replace("titleposition","title.position")):r.indexOf("titleside")>-1?l(r,r.replace("titleside","title.side")):r.indexOf("titleoffset")>-1&&l(r,r.replace("titleoffset","title.offset")):l(r,r.replace("title","title.text"));function l(e,r){t[r]=t[e],delete t[e]}}function U(t,e,r){t=o.getGraphDiv(t),_.clearPromiseQueue(t);var n={};if("string"==typeof e)n[e]=r;else{if(!o.isPlainObject(e))return o.warn("Relayout fail.",e,r),Promise.reject();n=o.extendFlat({},e)}Object.keys(n).length&&(t.changed=!0);var i=Y(t,n),a=i.flags;a.calc&&(t.calcdata=void 0);var s=[h.previousPromises];a.layoutReplot?s.push(w.layoutReplot):Object.keys(n).length&&(V(t,a,i)||h.supplyDefaults(t),a.legend&&s.push(w.doLegend),a.layoutstyle&&s.push(w.layoutStyles),a.axrange&&H(s,i.rangesAltered),a.ticks&&s.push(w.doTicksRelayout),a.modebar&&s.push(w.doModeBar),a.camera&&s.push(w.doCamera),a.colorbars&&s.push(w.doColorBars),s.push(M)),s.push(h.rehover,h.redrag,h.reselect),u.add(t,U,[t,i.undoit],U,[t,i.redoit]);var l=o.syncOrAsync(s,t);return l&&l.then||(l=Promise.resolve(t)),l.then((function(){return t.emit("plotly_relayout",i.eventData),t}))}function V(t,e,r){var n=t._fullLayout;if(!e.axrange)return!1;for(var i in e)if("axrange"!==i&&e[i])return!1;for(var a in r.rangesAltered){var o=p.id2name(a),s=t.layout[o],l=n[o];if(l.autorange=s.autorange,s.range&&(l.range=s.range.slice()),l.cleanRange(),l._matchGroup)for(var u in l._matchGroup)if(u!==a){var c=n[p.id2name(u)];c.autorange=l.autorange,c.range=l.range.slice(),c._input.range=l.range.slice()}}return!0}function H(t,e){var r=e?function(t){var r=[];for(var n in e){var i=p.getFromId(t,n);if(r.push(n),-1!==(i.ticklabelposition||"").indexOf("inside")&&i._anchorAxis&&r.push(i._anchorAxis._id),i._matchGroup)for(var a in i._matchGroup)e[a]||r.push(a)}return p.draw(t,r,{skipTitle:!0})}:function(t){return p.draw(t,"redraw")};t.push(m,w.doAutoRangeAndConstraints,r,w.drawData,w.finalDraw)}var q=/^[xyz]axis[0-9]*\.range(\[[0|1]\])?$/,G=/^[xyz]axis[0-9]*\.autorange$/,Z=/^[xyz]axis[0-9]*\.domain(\[[0|1]\])?$/;function Y(t,e){var r,n,i,a=t.layout,l=t._fullLayout,u=l._guiEditing,h=F(l._preGUI,u),d=Object.keys(e),v=p.list(t),g=o.extendDeepAll({},e),y={};for(j(e),d=Object.keys(e),n=0;n0&&"string"!=typeof I.parts[z];)z--;var B=I.parts[z],N=I.parts[z-1]+"."+B,U=I.parts.slice(0,z).join("."),V=s(t.layout,U).get(),H=s(l,U).get(),Y=I.get();if(void 0!==D){M[O]=D,S[O]="reverse"===B?D:R(Y);var X=f.getLayoutValObject(l,I.parts);if(X&&X.impliedEdits&&null!==D)for(var J in X.impliedEdits)E(o.relativeAttr(O,J),X.impliedEdits[J]);if(-1!==["width","height"].indexOf(O))if(D){E("autosize",null);var K="height"===O?"width":"height";E(K,l[K])}else l[O]=t._initialAutoSize[O];else if("autosize"===O)E("width",D?null:l.width),E("height",D?null:l.height);else if(N.match(q))P(N),s(l,U+"._inputRange").set(null);else if(N.match(G)){P(N),s(l,U+"._inputRange").set(null);var $=s(l,U).get();$._inputDomain&&($._input.domain=$._inputDomain.slice())}else N.match(Z)&&s(l,U+"._inputDomain").set(null);if("type"===B){L=V;var Q="linear"===H.type&&"log"===D,tt="log"===H.type&&"linear"===D;if(Q||tt){if(L&&L.range)if(H.autorange)Q&&(L.range=L.range[1]>L.range[0]?[1,2]:[2,1]);else{var et=L.range[0],rt=L.range[1];Q?(et<=0&&rt<=0&&E(U+".autorange",!0),et<=0?et=rt/1e6:rt<=0&&(rt=et/1e6),E(U+".range[0]",Math.log(et)/Math.LN10),E(U+".range[1]",Math.log(rt)/Math.LN10)):(E(U+".range[0]",Math.pow(10,et)),E(U+".range[1]",Math.pow(10,rt)))}else E(U+".autorange",!0);Array.isArray(l._subplots.polar)&&l._subplots.polar.length&&l[I.parts[0]]&&"radialaxis"===I.parts[1]&&delete l[I.parts[0]]._subplot.viewInitial["radialaxis.range"],c.getComponentMethod("annotations","convertCoords")(t,H,D,E),c.getComponentMethod("images","convertCoords")(t,H,D,E)}else E(U+".autorange",!0),E(U+".range",null);s(l,U+"._inputRange").set(null)}else if(B.match(k)){var nt=s(l,O).get(),it=(D||{}).type;it&&"-"!==it||(it="linear"),c.getComponentMethod("annotations","convertCoords")(t,nt,it,E),c.getComponentMethod("images","convertCoords")(t,nt,it,E)}var at=b.containerArrayMatch(O);if(at){r=at.array,n=at.index;var ot=at.property,st=X||{editType:"calc"};""!==n&&""===ot&&(b.isAddVal(D)?S[O]=null:b.isRemoveVal(D)?S[O]=(s(a,r).get()||[])[n]:o.warn("unrecognized full object value",e)),T.update(A,st),y[r]||(y[r]={});var lt=y[r][n];lt||(lt=y[r][n]={}),lt[ot]=D,delete e[O]}else"reverse"===B?(V.range?V.range.reverse():(E(U+".autorange",!0),V.range=[1,0]),H.autorange?A.calc=!0:A.plot=!0):("dragmode"===O&&(!1===D&&!1!==Y||!1!==D&&!1===Y)||l._has("scatter-like")&&l._has("regl")&&"dragmode"===O&&("lasso"===D||"select"===D)&&"lasso"!==Y&&"select"!==Y||l._has("gl2d")?A.plot=!0:X?T.update(A,X):A.calc=!0,I.set(D))}}for(r in y)b.applyContainerArrayChanges(t,h(a,r),y[r],A,h)||(A.plot=!0);for(var ut in C){var ct=(L=p.getFromId(t,ut))&&L._constraintGroup;if(ct)for(var ft in A.calc=!0,ct)C[ft]||(p.getFromId(t,ft)._constraintShrinkable=!0)}(W(t)||e.height||e.width)&&(A.plot=!0);var ht=l.shapes;for(n=0;n1;)if(n.pop(),void 0!==(r=s(e,n.join(".")+".uirevision").get()))return r;return e.uirevision}function et(t,e){for(var r=0;r=i.length?i[0]:i[t]:i}function l(t){return Array.isArray(a)?t>=a.length?a[0]:a[t]:a}function u(t,e){var r=0;return function(){if(t&&++r===e)return t()}}return void 0===n._frameWaitingCnt&&(n._frameWaitingCnt=0),new Promise((function(a,c){function f(){t.emit("plotly_animating"),n._lastFrameAt=-1/0,n._timeToNext=0,n._runningTransitions=0,n._currentFrame=null;var e=function(){n._animationRaf=window.requestAnimationFrame(e),Date.now()-n._lastFrameAt>n._timeToNext&&function(){n._currentFrame&&n._currentFrame.onComplete&&n._currentFrame.onComplete();var e=n._currentFrame=n._frameQueue.shift();if(e){var r=e.name?e.name.toString():null;t._fullLayout._currentFrame=r,n._lastFrameAt=Date.now(),n._timeToNext=e.frameOpts.duration,h.transition(t,e.frame.data,e.frame.layout,_.coerceTraceIndices(t,e.frame.traces),e.frameOpts,e.transitionOpts).then((function(){e.onComplete&&e.onComplete()})),t.emit("plotly_animatingframe",{name:r,frame:e.frame,animation:{frame:e.frameOpts,transition:e.transitionOpts}})}else t.emit("plotly_animated"),window.cancelAnimationFrame(n._animationRaf),n._animationRaf=null}()};e()}var p,d,v=0;function g(t){return Array.isArray(i)?v>=i.length?t.transitionOpts=i[v]:t.transitionOpts=i[0]:t.transitionOpts=i,v++,t}var y=[],m=null==e,x=Array.isArray(e);if(m||x||!o.isPlainObject(e)){if(m||-1!==["string","number"].indexOf(typeof e))for(p=0;p0&&TT)&&k.push(d);y=k}}y.length>0?function(e){if(0!==e.length){for(var i=0;i=0;n--)if(o.isPlainObject(e[n])){var v=e[n].name,g=(c[v]||d[v]||{}).name,y=e[n].name,m=c[g]||d[g];g&&y&&"number"==typeof y&&m&&A<5&&(A++,o.warn('addFrames: overwriting frame "'+(c[g]||d[g]).name+'" with a frame whose name of type "number" also equates to "'+g+'". This is valid but may potentially lead to unexpected behavior since all plotly.js frame names are stored internally as strings.'),5===A&&o.warn("addFrames: This API call has yielded too many of these warnings. For the rest of this call, further warnings about numeric frame names will be suppressed.")),d[v]={name:v},p.push({frame:h.supplyFrameDefaults(e[n]),index:r&&void 0!==r[n]&&null!==r[n]?r[n]:f+n})}p.sort((function(t,e){return t.index>e.index?-1:t.index=0;n--){if("number"==typeof(i=p[n].frame).name&&o.warn("Warning: addFrames accepts frames with numeric names, but the numbers areimplicitly cast to strings"),!i.name)for(;c[i.name="frame "+t._transitionData._counter++];);if(c[i.name]){for(a=0;a=0;r--)n=e[r],a.push({type:"delete",index:n}),s.unshift({type:"insert",index:n,value:i[n]});var l=h.modifyFrames,c=h.modifyFrames,f=[t,s],p=[t,a];return u&&u.add(t,l,f,c,p),h.modifyFrames(t,a)},e.addTraces=function t(r,n,i){r=o.getGraphDiv(r);var a,s,l=[],c=e.deleteTraces,f=t,h=[r,l],p=[r,n];for(function(t,e,r){var n,i;if(!Array.isArray(t.data))throw new Error("gd.data must be an array.");if(void 0===e)throw new Error("traces must be defined.");for(Array.isArray(e)||(e=[e]),n=0;n=0&&r=0&&r=a.length)return!1;if(2===t.dimensions){if(r++,e.length===r)return t;var o=e[r];if(!_(o))return!1;t=a[i][o]}else t=a[i]}else t=a}}return t}function _(t){return t===Math.round(t)&&t>=0}function w(){var t,e,r={};for(t in f(r,o),n.subplotsRegistry)if((e=n.subplotsRegistry[t]).layoutAttributes)if(Array.isArray(e.attr))for(var i=0;i=l.length)return!1;i=(r=(n.transformsRegistry[l[u].type]||{}).attributes)&&r[e[2]],s=3}else{var c=t._module;if(c||(c=(n.modules[t.type||a.type.dflt]||{})._module),!c)return!1;if(!(i=(r=c.attributes)&&r[o])){var f=c.basePlotModule;f&&f.attributes&&(i=f.attributes[o])}i||(i=a[o])}return b(i,e,s)},e.getLayoutValObject=function(t,e){var r=function(t,e){var r,i,a,s,l=t._basePlotModules;if(l){var u;for(r=0;r=i&&(r._input||{})._templateitemname;s&&(o=i);var l,u=e+"["+o+"]";function c(){l={},s&&(l[u]={},l[u][a]=s)}function f(t,e){s?n.nestedProperty(l[u],t).set(e):l[u+"."+t]=e}function h(){var t=l;return c(),t}return c(),{modifyBase:function(t,e){l[t]=e},modifyItem:f,getUpdateObj:h,applyUpdate:function(e,r){e&&f(e,r);var i=h();for(var a in i)n.nestedProperty(t,a).set(i[a])}}}},61549:function(t,e,r){"use strict";var n=r(39898),i=r(73972),a=r(74875),o=r(71828),s=r(63893),l=r(33306),u=r(7901),c=r(91424),f=r(92998),h=r(64168),p=r(89298),d=r(18783),v=r(99082),g=v.enforce,y=v.clean,m=r(71739).doAutoRange,x="start";function b(t,e,r){for(var n=0;n=t[1]||i[1]<=t[0])&&a[0]e[0])return!0}return!1}function _(t){var r,i,s,l,f,v,g=t._fullLayout,y=g._size,m=y.p,x=p.list(t,"",!0);if(g._paperdiv.style({width:t._context.responsive&&g.autosize&&!t._context._hasZeroWidth&&!t.layout.width?"100%":g.width+"px",height:t._context.responsive&&g.autosize&&!t._context._hasZeroHeight&&!t.layout.height?"100%":g.height+"px"}).selectAll(".main-svg").call(c.setSize,g.width,g.height),t._context.setBackground(t,g.paper_bgcolor),e.drawMainTitle(t),h.manage(t),!g._has("cartesian"))return a.previousPromises(t);function _(t,e,r){var n=t._lw/2;return"x"===t._id.charAt(0)?e?"top"===r?e._offset-m-n:e._offset+e._length+m+n:y.t+y.h*(1-(t.position||0))+n%1:e?"right"===r?e._offset+e._length+m+n:e._offset-m-n:y.l+y.w*(t.position||0)+n%1}for(r=0;r.5?"t":"b",o=t._fullLayout.margin[a],s=0;return"paper"===e.yref?s=r+e.pad.t+e.pad.b:"container"===e.yref&&(s=function(t,e,r,n,i){var a=0;return"middle"===r&&(a+=i/2),"t"===t?("top"===r&&(a+=i),a+=n-e*n):("bottom"===r&&(a+=i),a+=e*n),a}(a,n,i,t._fullLayout.height,r)+e.pad.t+e.pad.b),s>o?s:0}(t,r,g);y>0&&(function(t,e,r,n){var i="title.automargin",s=t._fullLayout.title,l=s.y>.5?"t":"b",u={x:s.x,y:s.y,t:0,b:0},c={};"paper"===s.yref&&function(t,e,r,n,i){var a="paper"===e.yref?t._fullLayout._size.h:t._fullLayout.height,s=o.isTopAnchor(e)?n:n-i,l="b"===r?a-s:s;return!(o.isTopAnchor(e)&&"t"===r||o.isBottomAnchor(e)&&"b"===r)&&lT?c.push({code:"unused",traceType:m,templateCount:w,dataCount:T}):T>w&&c.push({code:"reused",traceType:m,templateCount:w,dataCount:T})}}else c.push({code:"data"});if(function t(e,r){for(var n in e)if("_"!==n.charAt(0)){var a=e[n],o=v(e,n,r);i(a)?(Array.isArray(e)&&!1===a._template&&a.templateitemname&&c.push({code:"missing",path:o,templateitemname:a.templateitemname}),t(a,o)):Array.isArray(a)&&g(a)&&t(a,o)}}({data:p,layout:h},""),c.length)return c.map(y)}},403:function(t,e,r){"use strict";var n=r(92770),i=r(72391),a=r(74875),o=r(71828),s=r(25095),l=r(5900),u=r(70942),c=r(11506).version,f={format:{valType:"enumerated",values:["png","jpeg","webp","svg","full-json"],dflt:"png"},width:{valType:"number",min:1},height:{valType:"number",min:1},scale:{valType:"number",min:0,dflt:1},setBackground:{valType:"any",dflt:!1},imageDataOnly:{valType:"boolean",dflt:!1}};t.exports=function(t,e){var r,h,p,d;function v(t){return!(t in e)||o.validate(e[t],f[t])}if(e=e||{},o.isPlainObject(t)?(r=t.data||[],h=t.layout||{},p=t.config||{},d={}):(t=o.getGraphDiv(t),r=o.extendDeep([],t.data),h=o.extendDeep({},t.layout),p=t._context,d=t._fullLayout||{}),!v("width")&&null!==e.width||!v("height")&&null!==e.height)throw new Error("Height and width should be pixel values.");if(!v("format"))throw new Error("Export format is not "+o.join2(f.format.values,", "," or ")+".");var g={};function y(t,r){return o.coerce(e,g,f,t,r)}var m=y("format"),x=y("width"),b=y("height"),_=y("scale"),w=y("setBackground"),T=y("imageDataOnly"),k=document.createElement("div");k.style.position="absolute",k.style.left="-5000px",document.body.appendChild(k);var A=o.extendFlat({},h);x?A.width=x:null===e.width&&n(d.width)&&(A.width=d.width),b?A.height=b:null===e.height&&n(d.height)&&(A.height=d.height);var M=o.extendFlat({},p,{_exportedPlot:!0,staticPlot:!0,setBackground:w}),S=s.getRedrawFunc(k);function E(){return new Promise((function(t){setTimeout(t,s.getDelay(k._fullLayout))}))}function L(){return new Promise((function(t,e){var r=l(k,m,_),n=k._fullLayout.width,f=k._fullLayout.height;function h(){i.purge(k),document.body.removeChild(k)}if("full-json"===m){var p=a.graphJson(k,!1,"keepdata","object",!0,!0);return p.version=c,p=JSON.stringify(p),h(),t(T?p:s.encodeJSON(p))}if(h(),"svg"===m)return t(T?r:s.encodeSVG(r));var d=document.createElement("canvas");d.id=o.randstr(),u({format:m,width:n,height:f,scale:_,canvas:d,svg:r,promise:!0}).then(t).catch(e)}))}return new Promise((function(t,e){i.newPlot(k,r,A,M).then(S).then(E).then(L).then((function(e){t(function(t){return T?t.replace(s.IMAGE_URL_PREFIX,""):t}(e))})).catch((function(t){e(t)}))}))}},84936:function(t,e,r){"use strict";var n=r(71828),i=r(74875),a=r(86281),o=r(72075).dfltConfig,s=n.isPlainObject,l=Array.isArray,u=n.isArrayOrTypedArray;function c(t,e,r,i,a,o){o=o||[];for(var f=Object.keys(t),h=0;hx.length&&i.push(p("unused",a,y.concat(x.length)));var A,M,S,E,L,C=x.length,P=Array.isArray(k);if(P&&(C=Math.min(C,k.length)),2===b.dimensions)for(M=0;Mx[M].length&&i.push(p("unused",a,y.concat(M,x[M].length)));var O=x[M].length;for(A=0;A<(P?Math.min(O,k[M].length):O);A++)S=P?k[M][A]:k,E=m[M][A],L=x[M][A],n.validate(E,S)?L!==E&&L!==+E&&i.push(p("dynamic",a,y.concat(M,A),E,L)):i.push(p("value",a,y.concat(M,A),E))}else i.push(p("array",a,y.concat(M),m[M]));else for(M=0;M1&&h.push(p("object","layout"))),i.supplyDefaults(d);for(var v=d._fullData,g=r.length,y=0;y0&&Math.round(f)===f))return{vals:i};u=f}for(var h=e.calendar,p="start"===l,d="end"===l,v=t[r+"period0"],g=a(v,h)||0,y=[],m=[],x=[],b=i.length,_=0;_A;)k=o(k,-u,h);for(;k<=A;)k=o(k,u,h);T=o(k,-u,h)}else{for(k=g+(w=Math.round((A-g)/c))*c;k>A;)k-=c;for(;k<=A;)k+=c;T=k-c}y[_]=p?T:d?k:(T+k)/2,m[_]=T,x[_]=k}return{vals:y,starts:m,ends:x}}},89502:function(t){"use strict";t.exports={xaxis:{valType:"subplotid",dflt:"x",editType:"calc+clearAxisTypes"},yaxis:{valType:"subplotid",dflt:"y",editType:"calc+clearAxisTypes"}}},71739:function(t,e,r){"use strict";var n=r(39898),i=r(92770),a=r(71828),o=r(50606).FP_SAFE,s=r(73972),l=r(91424),u=r(41675),c=u.getFromId,f=u.isLinked;function h(t,e){var r,n,i=[],o=t._fullLayout,s=d(o,e,0),l=d(o,e,1),u=g(t,e),c=u.min,f=u.max;if(0===c.length||0===f.length)return a.simpleMap(e.range,e.r2l);var h=c[0].val,v=f[0].val;for(r=1;r0&&((T=E-s(x)-l(b))>L?k/T>C&&(_=x,w=b,C=k/T):k/E>C&&(_={val:x.val,nopad:1},w={val:b.val,nopad:1},C=k/E));if(h===v){var P=h-1,O=h+1;if(M)if(0===h)i=[0,1];else{var I=(h>0?f:c).reduce((function(t,e){return Math.max(t,l(e))}),0),D=h/(1-Math.min(.5,I/E));i=h>0?[0,D]:[D,0]}else i=S?[Math.max(0,P),Math.max(1,O)]:[P,O]}else M?(_.val>=0&&(_={val:0,nopad:1}),w.val<=0&&(w={val:0,nopad:1})):S&&(_.val-C*s(_)<0&&(_={val:0,nopad:1}),w.val<=0&&(w={val:1,nopad:1})),C=(w.val-_.val-p(e,x.val,b.val))/(E-s(_)-l(w)),i=[_.val-C*s(_),w.val+C*l(w)];return y&&i.reverse(),a.simpleMap(i,e.l2r||Number)}function p(t,e,r){var n=0;if(t.rangebreaks)for(var i=t.locateBreaks(e,r),a=0;a0?r.ppadplus:r.ppadminus)||r.ppad||0),S=A((t._m>0?r.ppadminus:r.ppadplus)||r.ppad||0),E=A(r.vpadplus||r.vpad),L=A(r.vpadminus||r.vpad);if(!T){if(h=1/0,p=-1/0,w)for(n=0;n0&&(h=a),a>p&&a-o&&(h=a),a>p&&a=O;n--)P(n);return{min:d,max:v,opts:r}},concatExtremes:g};var v=3;function g(t,e,r){var n,i,a,o=e._id,s=t._fullData,l=t._fullLayout,u=[],f=[];function h(t,e){for(n=0;n=r&&(u.extrapad||!o)){s=!1;break}i(e,u.val)&&u.pad<=r&&(o||!u.extrapad)&&(t.splice(l,1),l--)}if(s){var c=a&&0===e;t.push({val:e,pad:c?0:r,extrapad:!c&&o})}}function b(t){return i(t)&&Math.abs(t)=e}},89298:function(t,e,r){"use strict";var n=r(39898),i=r(92770),a=r(74875),o=r(73972),s=r(71828),l=s.strTranslate,u=r(63893),c=r(92998),f=r(7901),h=r(91424),p=r(13838),d=r(66287),v=r(50606),g=v.ONEMAXYEAR,y=v.ONEAVGYEAR,m=v.ONEMINYEAR,x=v.ONEMAXQUARTER,b=v.ONEAVGQUARTER,_=v.ONEMINQUARTER,w=v.ONEMAXMONTH,T=v.ONEAVGMONTH,k=v.ONEMINMONTH,A=v.ONEWEEK,M=v.ONEDAY,S=M/2,E=v.ONEHOUR,L=v.ONEMIN,C=v.ONESEC,P=v.MINUS_SIGN,O=v.BADNUM,I={K:"zeroline"},D={K:"gridline",L:"path"},z={K:"minor-gridline",L:"path"},R={K:"tick",L:"path"},F={K:"tick",L:"text"},B={width:["x","r","l","xl","xr"],height:["y","t","b","yt","yb"],right:["r","xr"],left:["l","xl"],top:["t","yt"],bottom:["b","yb"]},N=r(18783),j=N.MID_SHIFT,U=N.CAP_SHIFT,V=N.LINE_SPACING,H=N.OPPOSITE_SIDE,q=t.exports={};q.setConvert=r(21994);var G=r(4322),Z=r(41675),Y=Z.idSort,W=Z.isLinked;q.id2name=Z.id2name,q.name2id=Z.name2id,q.cleanId=Z.cleanId,q.list=Z.list,q.listIds=Z.listIds,q.getFromId=Z.getFromId,q.getFromTrace=Z.getFromTrace;var X=r(71739);q.getAutoRange=X.getAutoRange,q.findExtremes=X.findExtremes;var J=1e-4;function K(t){var e=(t[1]-t[0])*J;return[t[0]-e,t[1]+e]}q.coerceRef=function(t,e,r,n,i,a){var o=n.charAt(n.length-1),l=r._fullLayout._subplots[o+"axis"],u=n+"ref",c={};return i||(i=l[0]||("string"==typeof a?a:a[0])),a||(a=i),l=l.concat(l.map((function(t){return t+" domain"}))),c[u]={valType:"enumerated",values:l.concat(a?"string"==typeof a?[a]:a:[]),dflt:i},s.coerce(t,e,c,u)},q.getRefType=function(t){return void 0===t?t:"paper"===t?"paper":"pixel"===t?"pixel":/( domain)$/.test(t)?"domain":"range"},q.coercePosition=function(t,e,r,n,i,a){var o,l;if("range"!==q.getRefType(n))o=s.ensureNumber,l=r(i,a);else{var u=q.getFromId(e,n);l=r(i,a=u.fraction2r(a)),o=u.cleanPos}t[i]=o(l)},q.cleanPosition=function(t,e,r){return("paper"===r||"pixel"===r?s.ensureNumber:q.getFromId(e,r).cleanPos)(t)},q.redrawComponents=function(t,e){e=e||q.listIds(t);var r=t._fullLayout;function n(n,i,a,s){for(var l=o.getComponentMethod(n,i),u={},c=0;cr&&f2e-6||((r-t._forceTick0)/t._minDtick%1+1.000001)%1>2e-6)&&(t._minDtick=0)):t._minDtick=0},q.saveRangeInitial=function(t,e){for(var r=q.list(t,"",!0),n=!1,i=0;i.3*h||c(n)||c(a))){var p=r.dtick/2;t+=t+p.8){var o=Number(r.substr(1));a.exactYears>.8&&o%12==0?t=q.tickIncrement(t,"M6","reverse")+1.5*M:a.exactMonths>.8?t=q.tickIncrement(t,"M1","reverse")+15.5*M:t-=S;var l=q.tickIncrement(t,r);if(l<=n)return l}return t}(m,t,y,u,a)),g=m;g<=c;)g=q.tickIncrement(g,y,!1,a);return{start:e.c2r(m,0,a),end:e.c2r(g,0,a),size:y,_dataSpan:c-u}},q.prepMinorTicks=function(t,e,r){if(!e.minor.dtick){delete t.dtick;var n,a=e.dtick&&i(e._tmin);if(a){var o=q.tickIncrement(e._tmin,e.dtick,!0);n=[e._tmin,.99*o+.01*e._tmin]}else{var l=s.simpleMap(e.range,e.r2l);n=[l[0],.8*l[0]+.2*l[1]]}if(t.range=s.simpleMap(n,e.l2r),t._isMinor=!0,q.prepTicks(t,r),a){var u=i(e.dtick),c=i(t.dtick),f=u?e.dtick:+e.dtick.substring(1),h=c?t.dtick:+t.dtick.substring(1);u&&c?et(f,h)?f===2*A&&h===2*M&&(t.dtick=A):f===2*A&&h===3*M?t.dtick=A:f!==A||(e._input.minor||{}).nticks?rt(f/h,2.5)?t.dtick=f/2:t.dtick=f:t.dtick=M:"M"===String(e.dtick).charAt(0)?c?t.dtick="M1":et(f,h)?f>=12&&2===h&&(t.dtick="M3"):t.dtick=e.dtick:"L"===String(t.dtick).charAt(0)?"L"===String(e.dtick).charAt(0)?et(f,h)||(t.dtick=rt(f/h,2.5)?e.dtick/2:e.dtick):t.dtick="D1":"D2"===t.dtick&&+e.dtick>1&&(t.dtick=1)}t.range=e.range}void 0===e.minor._tick0Init&&(t.tick0=e.tick0)},q.prepTicks=function(t,e){var r=s.simpleMap(t.range,t.r2l,void 0,void 0,e);if("auto"===t.tickmode||!t.dtick){var n,a=t.nticks;a||("category"===t.type||"multicategory"===t.type?(n=t.tickfont?s.bigFont(t.tickfont.size||12):15,a=t._length/n):(n="y"===t._id.charAt(0)?40:80,a=s.constrain(t._length/n,4,9)+1),"radialaxis"===t._name&&(a*=2)),t.minor&&"array"!==t.minor.tickmode||"array"===t.tickmode&&(a*=100),t._roughDTick=Math.abs(r[1]-r[0])/a,q.autoTicks(t,t._roughDTick),t._minDtick>0&&t.dtick<2*t._minDtick&&(t.dtick=t._minDtick,t.tick0=t.l2r(t._forceTick0))}"period"===t.ticklabelmode&&function(t){var e;function r(){return!(i(t.dtick)||"M"!==t.dtick.charAt(0))}var n=r(),a=q.getTickFormat(t);if(a){var o=t._dtickInit!==t.dtick;/%[fLQsSMX]/.test(a)||(/%[HI]/.test(a)?(e=E,o&&!n&&t.dtick=(I?0:1);D--){var z=!D;D?(t._dtickInit=t.dtick,t._tick0Init=t.tick0):(t.minor._dtickInit=t.minor.dtick,t.minor._tick0Init=t.minor.tick0);var R=D?t:s.extendFlat({},t,t.minor);if(z?q.prepMinorTicks(R,t,e):q.prepTicks(R,e),"array"!==R.tickmode)if("sync"!==R.tickmode){var F=K(c),B=F[0],N=F[1],j=i(R.dtick),U="log"===a&&!(j||"L"===R.dtick.charAt(0)),V=q.tickFirst(R,e);if(D){if(t._tmin=V,V=N:Y<=N;Y=q.tickIncrement(Y,W,f,o)){if(D&&H++,R.rangebreaks&&!f){if(Y=p)break}if(C.length>d||Y===Z)break;Z=Y;var X={value:Y};D?(U&&Y!==(0|Y)&&(X.simpleLabel=!0),l>1&&H%l&&(X.skipLabel=!0),C.push(X)):(X.minor=!0,P.push(X))}}else C=[],v=at(t);else D?(C=[],v=ot(t)):(P=[],L=ot(t))}if(I&&!("inside"===t.minor.ticks&&"outside"===t.ticks||"outside"===t.minor.ticks&&"inside"===t.ticks)){for(var J=C.map((function(t){return t.value})),$=[],Q=0;Q0?(a=n-1,o=n):(a=n,o=n);var s,l=t[a].value,u=t[o].value,c=Math.abs(u-l),f=r||c,h=0;f>=m?h=c>=m&&c<=g?c:y:r===b&&f>=_?h=c>=_&&c<=x?c:b:f>=k?h=c>=k&&c<=w?c:T:r===A&&f>=A?h=A:f>=M?h=M:r===S&&f>=S?h=S:r===E&&f>=E&&(h=E),h>=c&&(h=c,s=!0);var p=i+h;if(e.rangebreaks&&h>0){for(var d=0,v=0;v<84;v++){var L=(v+.5)/84;e.maskBreaks(i*(1-L)+L*p)!==O&&d++}(h*=d/84)||(t[n].drop=!0),s&&c>A&&(h=c)}(h>0||0===n)&&(t[n].periodX=i+h/2)}}(C,t,t._definedDelta),t.rangebreaks){var it="y"===t._id.charAt(0),st=1;"auto"===t.tickmode&&(st=t.tickfont?t.tickfont.size:12);var lt=NaN;for(r=C.length-1;r>-1;r--)if(C[r].drop)C.splice(r,1);else{C[r].value=zt(C[r].value,t);var ut=t.c2p(C[r].value);(it?lt>ut-st:ltp||ftp&&(ct.periodX=p),ft10||"01-01"!==n.substr(5)?t._tickround="d":t._tickround=+e.substr(1)%12==0?"y":"m";else if(e>=M&&a<=10||e>=15*M)t._tickround="d";else if(e>=L&&a<=16||e>=E)t._tickround="M";else if(e>=C&&a<=19||e>=L)t._tickround="S";else{var o=t.l2r(r+e).replace(/^-/,"").length;t._tickround=Math.max(a,o)-20,t._tickround<0&&(t._tickround=4)}}else if(i(e)||"L"===e.charAt(0)){var s=t.range.map(t.r2d||Number);i(e)||(e=Number(e.substr(1))),t._tickround=2-Math.floor(Math.log(e)/Math.LN10+.01);var l=Math.max(Math.abs(s[0]),Math.abs(s[1])),u=Math.floor(Math.log(l)/Math.LN10+.01),c=void 0===t.minexponent?3:t.minexponent;Math.abs(u)>c&&(mt(t.exponentformat)&&!xt(u)?t._tickexponent=3*Math.round((u-1)/3):t._tickexponent=u)}else t._tickround=null}function gt(t,e,r){var n=t.tickfont||{};return{x:e,dx:0,dy:0,text:r||"",fontSize:n.size,font:n.family,fontColor:n.color}}q.autoTicks=function(t,e,r){var n;function a(t){return Math.pow(t,Math.floor(Math.log(e)/Math.LN10))}if("date"===t.type){t.tick0=s.dateTick0(t.calendar,0);var o=2*e;if(o>y)e/=y,n=a(10),t.dtick="M"+12*dt(e,n,st);else if(o>T)e/=T,t.dtick="M"+dt(e,1,lt);else if(o>M){if(t.dtick=dt(e,M,t._hasDayOfWeekBreaks?[1,2,7,14]:ct),!r){var l=q.getTickFormat(t),u="period"===t.ticklabelmode;u&&(t._rawTick0=t.tick0),/%[uVW]/.test(l)?t.tick0=s.dateTick0(t.calendar,2):t.tick0=s.dateTick0(t.calendar,1),u&&(t._dowTick0=t.tick0)}}else o>E?t.dtick=dt(e,E,lt):o>L?t.dtick=dt(e,L,ut):o>C?t.dtick=dt(e,C,ut):(n=a(10),t.dtick=dt(e,n,st))}else if("log"===t.type){t.tick0=0;var c=s.simpleMap(t.range,t.r2l);if(t._isMinor&&(e*=1.5),e>.7)t.dtick=Math.ceil(e);else if(Math.abs(c[1]-c[0])<1){var f=1.5*Math.abs((c[1]-c[0])/e);e=Math.abs(Math.pow(10,c[1])-Math.pow(10,c[0]))/f,n=a(10),t.dtick="L"+dt(e,n,st)}else t.dtick=e>.3?"D2":"D1"}else"category"===t.type||"multicategory"===t.type?(t.tick0=0,t.dtick=Math.ceil(Math.max(e,1))):Dt(t)?(t.tick0=0,n=1,t.dtick=dt(e,n,pt)):(t.tick0=0,n=a(10),t.dtick=dt(e,n,st));if(0===t.dtick&&(t.dtick=1),!i(t.dtick)&&"string"!=typeof t.dtick){var h=t.dtick;throw t.dtick=1,"ax.dtick error: "+String(h)}},q.tickIncrement=function(t,e,r,a){var o=r?-1:1;if(i(e))return s.increment(t,o*e);var l=e.charAt(0),u=o*Number(e.substr(1));if("M"===l)return s.incrementMonth(t,u,a);if("L"===l)return Math.log(Math.pow(10,t)+u)/Math.LN10;if("D"===l){var c="D2"===e?ht:ft,f=t+.01*o,h=s.roundUp(s.mod(f,1),c,r);return Math.floor(f)+Math.log(n.round(Math.pow(10,h),1))/Math.LN10}throw"unrecognized dtick "+String(e)},q.tickFirst=function(t,e){var r=t.r2l||Number,a=s.simpleMap(t.range,r,void 0,void 0,e),o=a[1] ")}else t._prevDateHead=l,u+="
"+l;e.text=u}(t,o,r,u):"log"===c?function(t,e,r,n,a){var o=t.dtick,l=e.x,u=t.tickformat,c="string"==typeof o&&o.charAt(0);if("never"===a&&(a=""),n&&"L"!==c&&(o="L3",c="L"),u||"L"===c)e.text=bt(Math.pow(10,l),t,a,n);else if(i(o)||"D"===c&&s.mod(l+.01,1)<.1){var f=Math.round(l),h=Math.abs(f),p=t.exponentformat;"power"===p||mt(p)&&xt(f)?(e.text=0===f?1:1===f?"10":"10"+(f>1?"":P)+h+"",e.fontSize*=1.25):("e"===p||"E"===p)&&h>2?e.text="1"+p+(f>0?"+":P)+h:(e.text=bt(Math.pow(10,l),t,"","fakehover"),"D1"===o&&"y"===t._id.charAt(0)&&(e.dy-=e.fontSize/6))}else{if("D"!==c)throw"unrecognized dtick "+String(o);e.text=String(Math.round(Math.pow(10,s.mod(l,1)))),e.fontSize*=.75}if("D1"===t.dtick){var d=String(e.text).charAt(0);"0"!==d&&"1"!==d||("y"===t._id.charAt(0)?e.dx-=e.fontSize/4:(e.dy+=e.fontSize/2,e.dx+=(t.range[1]>t.range[0]?1:-1)*e.fontSize*(l<0?.5:.25)))}}(t,o,0,u,v):"category"===c?function(t,e){var r=t._categories[Math.round(e.x)];void 0===r&&(r=""),e.text=String(r)}(t,o):"multicategory"===c?function(t,e,r){var n=Math.round(e.x),i=t._categories[n]||[],a=void 0===i[1]?"":String(i[1]),o=void 0===i[0]?"":String(i[0]);r?e.text=o+" - "+a:(e.text=a,e.text2=o)}(t,o,r):Dt(t)?function(t,e,r,n,i){if("radians"!==t.thetaunit||r)e.text=bt(e.x,t,i,n);else{var a=e.x/180;if(0===a)e.text="0";else{var o=function(t){function e(t,e){return Math.abs(t-e)<=1e-6}var r=function(t){for(var r=1;!e(Math.round(t*r)/r,t);)r*=10;return r}(t),n=t*r,i=Math.abs(function t(r,n){return e(n,0)?r:t(n,r%n)}(n,r));return[Math.round(n/i),Math.round(r/i)]}(a);if(o[1]>=100)e.text=bt(s.deg2rad(e.x),t,i,n);else{var l=e.x<0;1===o[1]?1===o[0]?e.text="π":e.text=o[0]+"π":e.text=["",o[0],"","⁄","",o[1],"","π"].join(""),l&&(e.text=P+e.text)}}}}(t,o,r,u,v):function(t,e,r,n,i){"never"===i?i="":"all"===t.showexponent&&Math.abs(e.x/t.dtick)<1e-6&&(i="hide"),e.text=bt(e.x,t,i,n)}(t,o,0,u,v),n||(t.tickprefix&&!d(t.showtickprefix)&&(o.text=t.tickprefix+o.text),t.ticksuffix&&!d(t.showticksuffix)&&(o.text+=t.ticksuffix)),t.labelalias&&t.labelalias.hasOwnProperty(o.text)){var g=t.labelalias[o.text];"string"==typeof g&&(o.text=g)}if("boundaries"===t.tickson||t.showdividers){var y=function(e){var r=t.l2p(e);return r>=0&&r<=t._length?e:null};o.xbnd=[y(o.x-.5),y(o.x+t.dtick-.5)]}return o},q.hoverLabelText=function(t,e,r){r&&(t=s.extendFlat({},t,{hoverformat:r}));var n=Array.isArray(e)?e[0]:e,i=Array.isArray(e)?e[1]:void 0;if(void 0!==i&&i!==n)return q.hoverLabelText(t,n,r)+" - "+q.hoverLabelText(t,i,r);var a="log"===t.type&&n<=0,o=q.tickText(t,t.c2l(a?-n:n),"hover").text;return a?0===n?"0":P+o:o};var yt=["f","p","n","μ","m","","k","M","G","T"];function mt(t){return"SI"===t||"B"===t}function xt(t){return t>14||t<-15}function bt(t,e,r,n){var a=t<0,o=e._tickround,l=r||e.exponentformat||"B",u=e._tickexponent,c=q.getTickFormat(e),f=e.separatethousands;if(n){var h={exponentformat:l,minexponent:e.minexponent,dtick:"none"===e.showexponent?e.dtick:i(t)&&Math.abs(t)||1,range:"none"===e.showexponent?e.range.map(e.r2d):[0,t||1]};vt(h),o=(Number(h._tickround)||0)+4,u=h._tickexponent,e.hoverformat&&(c=e.hoverformat)}if(c)return e._numFormat(c)(t).replace(/-/g,P);var p,d=Math.pow(10,-o)/2;if("none"===l&&(u=0),(t=Math.abs(t))"+p+"":"B"===l&&9===u?t+="B":mt(l)&&(t+=yt[u/3+5])),a?P+t:t}function _t(t,e){if(t){var r=Object.keys(B).reduce((function(t,r){return-1!==e.indexOf(r)&&B[r].forEach((function(e){t[e]=1})),t}),{});Object.keys(t).forEach((function(e){r[e]||(1===e.length?t[e]=0:delete t[e])}))}}function wt(t,e){for(var r=[],n={},i=0;i1&&r=i.min&&t=0,a=c(t,e[1])<=0;return(r||i)&&(n||a)}if(t.tickformatstops&&t.tickformatstops.length>0)switch(t.type){case"date":case"linear":for(e=0;e=o(i)))){r=n;break}break;case"log":for(e=0;e=0&&i.unshift(i.splice(n,1).shift())}}));var o={false:{left:0,right:0}};return s.syncOrAsync(i.map((function(e){return function(){if(e){var n=q.getFromId(t,e);r||(r={}),r.axShifts=o,r.overlayingShiftedAx=a;var i=q.drawOne(t,n,r);return n._shiftPusher&&Bt(n,n._fullDepth||0,o,!0),n._r=n.range.slice(),n._rl=s.simpleMap(n._r,n.r2l),i}}})))},q.drawOne=function(t,e,r){var n,i,l,u=(r=r||{}).axShifts||{},p=r.overlayingShiftedAx||[];e.setScale();var d=t._fullLayout,v=e._id,g=v.charAt(0),y=q.counterLetter(v),m=d._plots[e._mainSubplot];if(m){if(e._shiftPusher=e.autoshift||-1!==p.indexOf(e._id)||-1!==p.indexOf(e.overlaying),e._shiftPusher&"free"===e.anchor){var x=e.linewidth/2||0;"inside"===e.ticks&&(x+=e.ticklen),Bt(e,x,u,!0),Bt(e,e.shift||0,u,!1)}!0===r.skipTitle&&void 0!==e._shift||(e._shift=function(t,e){return t.autoshift?e[t.overlaying][t.side]:t.shift||0}(e,u));var b=m[g+"axislayer"],_=e._mainLinePosition,w=_+=e._shift,T=e._mainMirrorPosition,k=e._vals=q.calcTicks(e),A=[e.mirror,w,T].join("_");for(n=0;n0?r.bottom-c:0,f))));var h=0,p=0;if(e._shiftPusher&&(h=Math.max(f,r.height>0?"l"===l?c-r.left:r.right-c:0),e.title.text!==d._dfltTitle[g]&&(p=(e._titleStandoff||0)+(e._titleScoot||0),"l"===l&&(p+=At(e))),e._fullDepth=Math.max(h,p)),e.automargin){n={x:0,y:0,r:0,l:0,t:0,b:0};var v=[0,1],m="number"==typeof e._shift?e._shift:0;if("x"===g){if("b"===l?n[l]=e._depth:(n[l]=e._depth=Math.max(r.width>0?c-r.top:0,f),v.reverse()),r.width>0){var x=r.right-(e._offset+e._length);x>0&&(n.xr=1,n.r=x);var b=e._offset-r.left;b>0&&(n.xl=0,n.l=b)}}else if("l"===l?(e._depth=Math.max(r.height>0?c-r.left:0,f),n[l]=e._depth-m):(e._depth=Math.max(r.height>0?r.right-c:0,f),n[l]=e._depth+m,v.reverse()),r.height>0){var _=r.bottom-(e._offset+e._length);_>0&&(n.yb=0,n.b=_);var w=e._offset-r.top;w>0&&(n.yt=1,n.t=w)}n[y]="free"===e.anchor?e.position:e._anchorAxis.domain[v[0]],e.title.text!==d._dfltTitle[g]&&(n[l]+=At(e)+(e.title.standoff||0)),e.mirror&&"free"!==e.anchor&&((i={x:0,y:0,r:0,l:0,t:0,b:0})[u]=e.linewidth,e.mirror&&!0!==e.mirror&&(i[u]+=f),!0===e.mirror||"ticks"===e.mirror?i[y]=e._anchorAxis.domain[v[1]]:"all"!==e.mirror&&"allticks"!==e.mirror||(i[y]=[e._counterDomainMin,e._counterDomainMax][v[1]]))}lt&&(s=o.getComponentMethod("rangeslider","autoMarginOpts")(t,e)),"string"==typeof e.automargin&&(_t(n,e.automargin),_t(i,e.automargin)),a.autoMargin(t,Et(e),n),a.autoMargin(t,Lt(e),i),a.autoMargin(t,Ct(e),s)})),s.syncOrAsync(ot)}}function ut(t){var r=v+(t||"tick");return M[r]||(M[r]=function(t,e){var r,n,i,a;return t._selections[e].size()?(r=1/0,n=-1/0,i=1/0,a=-1/0,t._selections[e].each((function(){var t=St(this),e=h.bBox(t.node().parentNode);r=Math.min(r,e.top),n=Math.max(n,e.bottom),i=Math.min(i,e.left),a=Math.max(a,e.right)}))):(r=0,n=0,i=0,a=0),{top:r,bottom:n,left:i,right:a,height:n-r,width:a-i}}(e,r)),M[r]}},q.getTickSigns=function(t,e){var r=t._id.charAt(0),n={x:"top",y:"right"}[r],i=t.side===n?1:-1,a=[-1,1,i,-i];return"inside"!==(e?(t.minor||{}).ticks:t.ticks)==("x"===r)&&(a=a.map((function(t){return-t}))),t.side&&a.push({l:-1,t:-1,r:1,b:1}[t.side.charAt(0)]),a},q.makeTransTickFn=function(t){return"x"===t._id.charAt(0)?function(e){return l(t._offset+t.l2p(e.x),0)}:function(e){return l(0,t._offset+t.l2p(e.x))}},q.makeTransTickLabelFn=function(t){var e=function(t){var e=t.ticklabelposition||"",r=function(t){return-1!==e.indexOf(t)},n=r("top"),i=r("left"),a=r("right"),o=r("bottom"),s=r("inside"),l=o||i||n||a;if(!l&&!s)return[0,0];var u=t.side,c=l?(t.tickwidth||0)/2:0,f=3,h=t.tickfont?t.tickfont.size:12;return(o||n)&&(c+=h*U,f+=(t.linewidth||0)/2),(i||a)&&(c+=(t.linewidth||0)/2,f+=3),s&&"top"===u&&(f-=h*(1-U)),(i||n)&&(c=-c),"bottom"!==u&&"right"!==u||(f=-f),[l?c:0,s?f:0]}(t),r=e[0],n=e[1];return"x"===t._id.charAt(0)?function(e){return l(r+t._offset+t.l2p(Tt(e)),n)}:function(e){return l(n,r+t._offset+t.l2p(Tt(e)))}},q.makeTickPath=function(t,e,r,n){n||(n={});var i=n.minor;if(i&&!t.minor)return"";var a=void 0!==n.len?n.len:i?t.minor.ticklen:t.ticklen,o=t._id.charAt(0),s=(t.linewidth||1)/2;return"x"===o?"M0,"+(e+s*r)+"v"+a*r:"M"+(e+s*r)+",0h"+a*r},q.makeLabelFns=function(t,e,r){var n=t.ticklabelposition||"",a=function(t){return-1!==n.indexOf(t)},o=a("top"),l=a("left"),u=a("right"),c=a("bottom")||l||o||u,f=a("inside"),h="inside"===n&&"inside"===t.ticks||!f&&"outside"===t.ticks&&"boundaries"!==t.tickson,p=0,d=0,v=h?t.ticklen:0;if(f?v*=-1:c&&(v=0),h&&(p+=v,r)){var g=s.deg2rad(r);p=v*Math.cos(g)+1,d=v*Math.sin(g)}t.showticklabels&&(h||t.showline)&&(p+=.2*t.tickfont.size);var y,m,x,b,_,w={labelStandoff:p+=(t.linewidth||1)/2*(f?-1:1),labelShift:d},T=0,k=t.side,A=t._id.charAt(0),M=t.tickangle;if("x"===A)b=(_=!f&&"bottom"===k||f&&"top"===k)?1:-1,f&&(b*=-1),y=d*b,m=e+p*b,x=_?1:-.2,90===Math.abs(M)&&(f?x+=j:x=-90===M&&"bottom"===k?U:90===M&&"top"===k?j:.5,T=j/2*(M/90)),w.xFn=function(t){return t.dx+y+T*t.fontSize},w.yFn=function(t){return t.dy+m+t.fontSize*x},w.anchorFn=function(t,e){if(c){if(l)return"end";if(u)return"start"}return i(e)&&0!==e&&180!==e?e*b<0!==f?"end":"start":"middle"},w.heightFn=function(e,r,n){return r<-60||r>60?-.5*n:"top"===t.side!==f?-n:0};else if("y"===A){if(b=(_=!f&&"left"===k||f&&"right"===k)?1:-1,f&&(b*=-1),y=p,m=d*b,x=0,f||90!==Math.abs(M)||(x=-90===M&&"left"===k||90===M&&"right"===k?U:.5),f){var S=i(M)?+M:0;if(0!==S){var E=s.deg2rad(S);T=Math.abs(Math.sin(E))*U*b,x=0}}w.xFn=function(t){return t.dx+e-(y+t.fontSize*x)*b+T*t.fontSize},w.yFn=function(t){return t.dy+m+t.fontSize*j},w.anchorFn=function(t,e){return i(e)&&90===Math.abs(e)?"middle":_?"end":"start"},w.heightFn=function(e,r,n){return"right"===t.side&&(r*=-1),r<-30?-n:r<30?-.5*n:0}}return w},q.drawTicks=function(t,e,r){r=r||{};var i=e._id+"tick",a=[].concat(e.minor&&e.minor.ticks?r.vals.filter((function(t){return t.minor&&!t.noTick})):[]).concat(e.ticks?r.vals.filter((function(t){return!t.minor&&!t.noTick})):[]),o=r.layer.selectAll("path."+i).data(a,kt);o.exit().remove(),o.enter().append("path").classed(i,1).classed("ticks",1).classed("crisp",!1!==r.crisp).each((function(t){return f.stroke(n.select(this),t.minor?e.minor.tickcolor:e.tickcolor)})).style("stroke-width",(function(r){return h.crispRound(t,r.minor?e.minor.tickwidth:e.tickwidth,1)+"px"})).attr("d",r.path).style("display",null),Ft(e,[R]),o.attr("transform",r.transFn)},q.drawGrid=function(t,e,r){if(r=r||{},"sync"!==e.tickmode){var i=e._id+"grid",a=e.minor&&e.minor.showgrid,o=a?r.vals.filter((function(t){return t.minor})):[],s=e.showgrid?r.vals.filter((function(t){return!t.minor})):[],l=r.counterAxis;if(l&&q.shouldShowZeroLine(t,e,l))for(var u="array"===e.tickmode,c=0;c=0;y--){var m=y?v:g;if(m){var x=m.selectAll("path."+i).data(y?s:o,kt);x.exit().remove(),x.enter().append("path").classed(i,1).classed("crisp",!1!==r.crisp),x.attr("transform",r.transFn).attr("d",r.path).each((function(t){return f.stroke(n.select(this),t.minor?e.minor.gridcolor:e.gridcolor||"#ddd")})).style("stroke-dasharray",(function(t){return h.dashStyle(t.minor?e.minor.griddash:e.griddash,t.minor?e.minor.gridwidth:e.gridwidth)})).style("stroke-width",(function(t){return(t.minor?d:e._gw)+"px"})).style("display",null),"function"==typeof r.path&&x.attr("d",r.path)}}Ft(e,[D,z])}},q.drawZeroLine=function(t,e,r){r=r||r;var n=e._id+"zl",i=q.shouldShowZeroLine(t,e,r.counterAxis),a=r.layer.selectAll("path."+n).data(i?[{x:0,id:e._id}]:[]);a.exit().remove(),a.enter().append("path").classed(n,1).classed("zl",1).classed("crisp",!1!==r.crisp).each((function(){r.layer.selectAll("path").sort((function(t,e){return Y(t.id,e.id)}))})),a.attr("transform",r.transFn).attr("d",r.path).call(f.stroke,e.zerolinecolor||f.defaultLine).style("stroke-width",h.crispRound(t,e.zerolinewidth,e._gw||1)+"px").style("display",null),Ft(e,[I])},q.drawLabels=function(t,e,r){r=r||{};var a=t._fullLayout,o=e._id,c=o.charAt(0),f=r.cls||o+"tick",p=r.vals.filter((function(t){return t.text})),d=r.labelFns,v=r.secondary?0:e.tickangle,g=(e._prevTickAngles||{})[f],y=r.layer.selectAll("g."+f).data(e.showticklabels?p:[],kt),m=[];function x(t,a){t.each((function(t){var o=n.select(this),s=o.select(".text-math-group"),c=d.anchorFn(t,a),f=r.transFn.call(o.node(),t)+(i(a)&&0!=+a?" rotate("+a+","+d.xFn(t)+","+(d.yFn(t)-t.fontSize/2)+")":""),p=u.lineCount(o),v=V*t.fontSize,g=d.heightFn(t,i(a)?+a:0,(p-1)*v);if(g&&(f+=l(0,g)),s.empty()){var y=o.select("text");y.attr({transform:f,"text-anchor":c}),y.style("opacity",1),e._adjustTickLabelsOverflow&&e._adjustTickLabelsOverflow()}else{var m=h.bBox(s.node()).width*{end:-.5,start:.5}[c];s.attr("transform",f+l(m,0))}}))}y.enter().append("g").classed(f,1).append("text").attr("text-anchor","middle").each((function(e){var r=n.select(this),i=t._promises.length;r.call(u.positionText,d.xFn(e),d.yFn(e)).call(h.font,e.font,e.fontSize,e.fontColor).text(e.text).call(u.convertToTspans,t),t._promises[i]?m.push(t._promises.pop().then((function(){x(r,v)}))):x(r,v)})),Ft(e,[F]),y.exit().remove(),r.repositionOnUpdate&&y.each((function(t){n.select(this).select("text").call(u.positionText,d.xFn(t),d.yFn(t))})),e._adjustTickLabelsOverflow=function(){var r=e.ticklabeloverflow;if(r&&"allow"!==r){var i=-1!==r.indexOf("hide"),o="x"===e._id.charAt(0),l=0,u=o?t._fullLayout.width:t._fullLayout.height;if(-1!==r.indexOf("domain")){var c=s.simpleMap(e.range,e.r2l);l=e.l2p(c[0])+e._offset,u=e.l2p(c[1])+e._offset}var f=Math.min(l,u),p=Math.max(l,u),d=e.side,v=1/0,g=-1/0;for(var m in y.each((function(t){var r=n.select(this);if(r.select(".text-math-group").empty()){var a=h.bBox(r.node()),s=0;o?(a.right>p||a.leftp||a.top+(e.tickangle?0:t.fontSize/4)e["_visibleLabelMin_"+r._id]?l.style("display","none"):"tick"!==t.K||i||l.style("display",null)}))}))}))}))},x(y,g+1?g:v);var b=null;e._selections&&(e._selections[f]=y);var _=[function(){return m.length&&Promise.all(m)}];e.automargin&&a._redrawFromAutoMarginCount&&90===g?(b=90,_.push((function(){x(y,g)}))):_.push((function(){if(x(y,v),p.length&&"x"===c&&!i(v)&&("log"!==e.type||"D"!==String(e.dtick).charAt(0))){b=0;var t,n=0,a=[];if(y.each((function(t){n=Math.max(n,t.fontSize);var r=e.l2p(t.x),i=St(this),o=h.bBox(i.node());a.push({top:0,bottom:10,height:10,left:r-o.width/2,right:r+o.width/2+2,width:o.width+2})})),"boundaries"!==e.tickson&&!e.showdividers||r.secondary){var o=p.length,l=Math.abs((p[o-1].x-p[0].x)*e._m)/(o-1),u=e.ticklabelposition||"",f=function(t){return-1!==u.indexOf(t)},d=f("top"),g=f("left"),m=f("right"),_=f("bottom")||g||d||m?(e.tickwidth||0)+6:0,w=l<2.5*n||"multicategory"===e.type||"realaxis"===e._name;for(t=0;t1)for(n=1;n2*o}(i,e))return"date";var g="strict"!==r.autotypenumbers;return function(t,e){for(var r=t.length,n=f(r),i=0,o=0,s={},c=0;c2*i}(i,g)?"category":function(t,e){for(var r=t.length,n=0;n=2){var s,u,c="";if(2===o.length)for(s=0;s<2;s++)if(u=b(o[s])){c=g;break}var f=i("pattern",c);if(f===g)for(s=0;s<2;s++)(u=b(o[s]))&&(e.bounds[s]=o[s]=u-1);if(f)for(s=0;s<2;s++)switch(u=o[s],f){case g:if(!n(u))return void(e.enabled=!1);if((u=+u)!==Math.floor(u)||u<0||u>=7)return void(e.enabled=!1);e.bounds[s]=o[s]=u;break;case y:if(!n(u))return void(e.enabled=!1);if((u=+u)<0||u>24)return void(e.enabled=!1);e.bounds[s]=o[s]=u}if(!1===r.autorange){var h=r.range;if(h[0]h[1])return void(e.enabled=!1)}else if(o[0]>h[0]&&o[1]n?1:-1:+(t.substr(1)||1)-+(e.substr(1)||1)},e.ref2id=function(t){return!!/^[xyz]/.test(t)&&t.split(" ")[0]},e.isLinked=function(t,e){return a(e,t._axisMatchGroups)||a(e,t._axisConstraintGroups)}},15258:function(t){"use strict";t.exports=function(t,e,r,n){if("category"===e.type){var i,a=t.categoryarray,o=Array.isArray(a)&&a.length>0;o&&(i="array");var s,l=r("categoryorder",i);"array"===l&&(s=r("categoryarray")),o||"array"!==l||(l=e.categoryorder="trace"),"trace"===l?e._initialCategories=[]:"array"===l?e._initialCategories=s.slice():(s=function(t,e){var r,n,i,a=e.dataAttr||t._id.charAt(0),o={};if(e.axData)r=e.axData;else for(r=[],n=0;nn?i.substr(n):a.substr(r))+o:i+a+t*e:o}function g(t,e){for(var r=e._size,n=r.h/r.w,i={},a=Object.keys(t),o=0;ou*x)||T)for(r=0;rI&&FP&&(P=F);h/=(P-C)/(2*O),C=l.l2r(C),P=l.l2r(P),l.range=l._input.range=S=0?Math.min(t,.9):1/(1/Math.max(t,-.3)+3.222))}function N(t,e,r,n,i){return t.append("path").attr("class","zoombox").style({fill:e>.2?"rgba(0,0,0,0)":"rgba(255,255,255,0)","stroke-width":0}).attr("transform",u(r,n)).attr("d",i+"Z")}function j(t,e,r){return t.append("path").attr("class","zoombox-corners").style({fill:f.background,stroke:f.defaultLine,"stroke-width":1,opacity:0}).attr("transform",u(e,r)).attr("d","M0,0Z")}function U(t,e,r,n,i,a){t.attr("d",n+"M"+r.l+","+r.t+"v"+r.h+"h"+r.w+"v-"+r.h+"h-"+r.w+"Z"),V(t,e,i,a)}function V(t,e,r,n){r||(t.transition().style("fill",n>.2?"rgba(0,0,0,0.4)":"rgba(255,255,255,0.3)").duration(200),e.transition().style("opacity",1).duration(200))}function H(t){n.select(t).selectAll(".zoombox,.js-zoombox-backdrop,.js-zoombox-menu,.zoombox-corners").remove()}function q(t){O&&t.data&&t._context.showTips&&(i.notifier(i._(t,"Double-click to zoom back out"),"long"),O=!1)}function G(t){var e=Math.floor(Math.min(t.b-t.t,t.r-t.l,P)/2);return"M"+(t.l-3.5)+","+(t.t-.5+e)+"h3v"+-e+"h"+e+"v-3h-"+(e+3)+"ZM"+(t.r+3.5)+","+(t.t-.5+e)+"h-3v"+-e+"h"+-e+"v-3h"+(e+3)+"ZM"+(t.r+3.5)+","+(t.b+.5-e)+"h-3v"+e+"h"+-e+"v3h"+(e+3)+"ZM"+(t.l-3.5)+","+(t.b+.5-e)+"h3v"+e+"h"+e+"v3h-"+(e+3)+"Z"}function Z(t,e,r,n,a){for(var o,s,l,u,c=!1,f={},h={},p=(a||{}).xaHash,d=(a||{}).yaHash,v=0;v=0)i._fullLayout._deactivateShape(i);else{var o=i._fullLayout.clickmode;if(H(i),2!==t||yt||qt(),gt)o.indexOf("select")>-1&&S(r,i,J,K,e.id,Pt),o.indexOf("event")>-1&&p.click(i,r,e.id);else if(1===t&&yt){var s=v?I:O,u="s"===v||"w"===y?0:1,f=s._name+".range["+u+"]",h=function(t,e){var r,n=t.range[e],i=Math.abs(n-t.range[1-e]);return"date"===t.type?n:"log"===t.type?(r=Math.ceil(Math.max(0,-Math.log(i)/Math.LN10))+3,a("."+r+"g")(Math.pow(10,n))):(r=Math.floor(Math.log(Math.abs(n))/Math.LN10)-Math.floor(Math.log(i)/Math.LN10)+4,a("."+String(r)+"g")(n))}(s,u),d="left",g="middle";if(s.fixedrange)return;v?(g="n"===v?"top":"bottom","right"===s.side&&(d="right")):"e"===y&&(d="right"),i._context.showAxisRangeEntryBoxes&&n.select(bt).call(c.makeEditable,{gd:i,immediate:!0,background:i._fullLayout.paper_bgcolor,text:String(h),fill:s.tickfont?s.tickfont.color:"#444",horizontalAlign:d,verticalAlign:g}).on("edit",(function(t){var e=s.d2r(t);void 0!==e&&l.call("_guiRelayout",i,f,e)}))}}}function Dt(e,r){if(t._transitioningWithDuration)return!1;var n=Math.max(0,Math.min(tt,pt*e+_t)),i=Math.max(0,Math.min(et,dt*r+wt)),a=Math.abs(n-_t),o=Math.abs(i-wt);function s(){St="",Tt.r=Tt.l,Tt.t=Tt.b,Lt.attr("d","M0,0Z")}if(Tt.l=Math.min(_t,n),Tt.r=Math.max(_t,n),Tt.t=Math.min(wt,i),Tt.b=Math.max(wt,i),rt.isSubplotConstrained)a>P||o>P?(St="xy",a/tt>o/et?(o=a*et/tt,wt>i?Tt.t=wt-o:Tt.b=wt+o):(a=o*tt/et,_t>n?Tt.l=_t-a:Tt.r=_t+a),Lt.attr("d",G(Tt))):s();else if(nt.isSubplotConstrained)if(a>P||o>P){St="xy";var l=Math.min(Tt.l/tt,(et-Tt.b)/et),u=Math.max(Tt.r/tt,(et-Tt.t)/et);Tt.l=l*tt,Tt.r=u*tt,Tt.b=(1-l)*et,Tt.t=(1-u)*et,Lt.attr("d",G(Tt))}else s();else!at||o0){var c;if(nt.isSubplotConstrained||!it&&1===at.length){for(c=0;cb[1]-1/4096&&(e.domain=s),i.noneOrAll(t.domain,e.domain,s),"sync"===e.tickmode&&(e.tickmode="auto")}return r("layer"),e}},89426:function(t,e,r){"use strict";var n=r(59652);t.exports=function(t,e,r,i,a){a||(a={});var o=a.tickSuffixDflt,s=n(t);r("tickprefix")&&r("showtickprefix",s),r("ticksuffix",o)&&r("showticksuffix",s)}},42449:function(t,e,r){"use strict";var n=r(18783).FROM_BL;t.exports=function(t,e,r){void 0===r&&(r=n[t.constraintoward||"center"]);var i=[t.r2l(t.range[0]),t.r2l(t.range[1])],a=i[0]+(i[1]-i[0])*r;t.range=t._input.range=[t.l2r(a+(i[0]-a)*e),t.l2r(a+(i[1]-a)*e)],t.setScale()}},21994:function(t,e,r){"use strict";var n=r(39898),i=r(84096).g0,a=r(71828),o=a.numberFormat,s=r(92770),l=a.cleanNumber,u=a.ms2DateTime,c=a.dateTime2ms,f=a.ensureNumber,h=a.isArrayOrTypedArray,p=r(50606),d=p.FP_SAFE,v=p.BADNUM,g=p.LOG_CLIP,y=p.ONEWEEK,m=p.ONEDAY,x=p.ONEHOUR,b=p.ONEMIN,_=p.ONESEC,w=r(41675),T=r(85555),k=T.HOUR_PATTERN,A=T.WEEKDAY_PATTERN;function M(t){return Math.pow(10,t)}function S(t){return null!=t}t.exports=function(t,e){e=e||{};var r=t._id||"x",p=r.charAt(0);function E(e,r){if(e>0)return Math.log(e)/Math.LN10;if(e<=0&&r&&t.range&&2===t.range.length){var n=t.range[0],i=t.range[1];return.5*(n+i-2*g*Math.abs(n-i))}return v}function L(e,r,n,i){if((i||{}).msUTC&&s(e))return+e;var o=c(e,n||t.calendar);if(o===v){if(!s(e))return v;e=+e;var l=Math.floor(10*a.mod(e+.05,1)),u=Math.round(e-l/10);o=c(new Date(u))+l/10}return o}function C(e,r,n){return u(e,r,n||t.calendar)}function P(e){return t._categories[Math.round(e)]}function O(e){if(S(e)){if(void 0===t._categoriesMap&&(t._categoriesMap={}),void 0!==t._categoriesMap[e])return t._categoriesMap[e];t._categories.push("number"==typeof e?String(e):e);var r=t._categories.length-1;return t._categoriesMap[e]=r,r}return v}function I(e){if(t._categoriesMap)return t._categoriesMap[e]}function D(t){var e=I(t);return void 0!==e?e:s(t)?+t:void 0}function z(t){return s(t)?+t:I(t)}function R(t,e,r){return n.round(r+e*t,2)}function F(t,e,r){return(t-r)/e}var B=function(e){return s(e)?R(e,t._m,t._b):v},N=function(e){return F(e,t._m,t._b)};if(t.rangebreaks){var j="y"===p;B=function(e){if(!s(e))return v;var r=t._rangebreaks.length;if(!r)return R(e,t._m,t._b);var n=j;t.range[0]>t.range[1]&&(n=!n);for(var i=n?-1:1,a=i*e,o=0,l=0;lc)){o=a<(u+c)/2?l:l+1;break}o=l+1}var f=t._B[o]||0;return isFinite(f)?R(e,t._m2,f):0},N=function(e){var r=t._rangebreaks.length;if(!r)return F(e,t._m,t._b);for(var n=0,i=0;it._rangebreaks[i].pmax&&(n=i+1);return F(e,t._m2,t._B[n])}}t.c2l="log"===t.type?E:f,t.l2c="log"===t.type?M:f,t.l2p=B,t.p2l=N,t.c2p="log"===t.type?function(t,e){return B(E(t,e))}:B,t.p2c="log"===t.type?function(t){return M(N(t))}:N,-1!==["linear","-"].indexOf(t.type)?(t.d2r=t.r2d=t.d2c=t.r2c=t.d2l=t.r2l=l,t.c2d=t.c2r=t.l2d=t.l2r=f,t.d2p=t.r2p=function(e){return t.l2p(l(e))},t.p2d=t.p2r=N,t.cleanPos=f):"log"===t.type?(t.d2r=t.d2l=function(t,e){return E(l(t),e)},t.r2d=t.r2c=function(t){return M(l(t))},t.d2c=t.r2l=l,t.c2d=t.l2r=f,t.c2r=E,t.l2d=M,t.d2p=function(e,r){return t.l2p(t.d2r(e,r))},t.p2d=function(t){return M(N(t))},t.r2p=function(e){return t.l2p(l(e))},t.p2r=N,t.cleanPos=f):"date"===t.type?(t.d2r=t.r2d=a.identity,t.d2c=t.r2c=t.d2l=t.r2l=L,t.c2d=t.c2r=t.l2d=t.l2r=C,t.d2p=t.r2p=function(e,r,n){return t.l2p(L(e,0,n))},t.p2d=t.p2r=function(t,e,r){return C(N(t),e,r)},t.cleanPos=function(e){return a.cleanDate(e,v,t.calendar)}):"category"===t.type?(t.d2c=t.d2l=O,t.r2d=t.c2d=t.l2d=P,t.d2r=t.d2l_noadd=D,t.r2c=function(e){var r=z(e);return void 0!==r?r:t.fraction2r(.5)},t.l2r=t.c2r=f,t.r2l=z,t.d2p=function(e){return t.l2p(t.r2c(e))},t.p2d=function(t){return P(N(t))},t.r2p=t.d2p,t.p2r=N,t.cleanPos=function(t){return"string"==typeof t&&""!==t?t:f(t)}):"multicategory"===t.type&&(t.r2d=t.c2d=t.l2d=P,t.d2r=t.d2l_noadd=D,t.r2c=function(e){var r=D(e);return void 0!==r?r:t.fraction2r(.5)},t.r2c_just_indices=I,t.l2r=t.c2r=f,t.r2l=D,t.d2p=function(e){return t.l2p(t.r2c(e))},t.p2d=function(t){return P(N(t))},t.r2p=t.d2p,t.p2r=N,t.cleanPos=function(t){return Array.isArray(t)||"string"==typeof t&&""!==t?t:f(t)},t.setupMultiCategory=function(n){var i,o,s=t._traceIndices,l=t._matchGroup;if(l&&0===t._categories.length)for(var u in l)if(u!==r){var c=e[w.id2name(u)];s=s.concat(c._traceIndices)}var f=[[0,{}],[0,{}]],d=[];for(i=0;id&&(o[n]=d),o[0]===o[1]){var u=Math.max(1,Math.abs(1e-6*o[0]));o[0]-=u,o[1]+=u}}else a.nestedProperty(t,e).set(i)},t.setScale=function(r){var n=e._size;if(t.overlaying){var i=w.getFromId({_fullLayout:e},t.overlaying);t.domain=i.domain}var a=r&&t._r?"_r":"range",o=t.calendar;t.cleanRange(a);var s,l,u=t.r2l(t[a][0],o),c=t.r2l(t[a][1],o),f="y"===p;if(f?(t._offset=n.t+(1-t.domain[1])*n.h,t._length=n.h*(t.domain[1]-t.domain[0]),t._m=t._length/(u-c),t._b=-t._m*c):(t._offset=n.l+t.domain[0]*n.w,t._length=n.w*(t.domain[1]-t.domain[0]),t._m=t._length/(c-u),t._b=-t._m*u),t._rangebreaks=[],t._lBreaks=0,t._m2=0,t._B=[],t.rangebreaks&&(t._rangebreaks=t.locateBreaks(Math.min(u,c),Math.max(u,c)),t._rangebreaks.length)){for(s=0;sc&&(h=!h),h&&t._rangebreaks.reverse();var d=h?-1:1;for(t._m2=d*t._length/(Math.abs(c-u)-t._lBreaks),t._B.push(-t._m2*(f?c:u)),s=0;si&&(i+=7,oi&&(i+=24,o=n&&o=n&&e=s.min&&(ts.max&&(s.max=n),i=!1)}i&&u.push({min:t,max:n})}};for(n=0;nr.duration?(function(){for(var r={},n=0;n rect").call(o.setTranslate,0,0).call(o.setScale,1,1),t.plot.call(o.setTranslate,e._offset,r._offset).call(o.setScale,1,1);var n=t.plot.selectAll(".scatterlayer .trace");n.selectAll(".point").call(o.setPointGroupScale,1,1),n.selectAll(".textpoint").call(o.setTextPointsScale,1,1),n.call(o.hideOutsideRangePoints,t)}function g(e,r){var n=e.plotinfo,i=n.xaxis,l=n.yaxis,u=i._length,c=l._length,f=!!e.xr1,h=!!e.yr1,p=[];if(f){var d=a.simpleMap(e.xr0,i.r2l),v=a.simpleMap(e.xr1,i.r2l),g=d[1]-d[0],y=v[1]-v[0];p[0]=(d[0]*(1-r)+r*v[0]-d[0])/(d[1]-d[0])*u,p[2]=u*(1-r+r*y/g),i.range[0]=i.l2r(d[0]*(1-r)+r*v[0]),i.range[1]=i.l2r(d[1]*(1-r)+r*v[1])}else p[0]=0,p[2]=u;if(h){var m=a.simpleMap(e.yr0,l.r2l),x=a.simpleMap(e.yr1,l.r2l),b=m[1]-m[0],_=x[1]-x[0];p[1]=(m[1]*(1-r)+r*x[1]-m[1])/(m[0]-m[1])*c,p[3]=c*(1-r+r*_/b),l.range[0]=i.l2r(m[0]*(1-r)+r*x[0]),l.range[1]=l.l2r(m[1]*(1-r)+r*x[1])}else p[1]=0,p[3]=c;s.drawOne(t,i,{skipTitle:!0}),s.drawOne(t,l,{skipTitle:!0}),s.redrawComponents(t,[i._id,l._id]);var w=f?u/p[2]:1,T=h?c/p[3]:1,k=f?p[0]:0,A=h?p[1]:0,M=f?p[0]/p[2]*u:0,S=h?p[1]/p[3]*c:0,E=i._offset-M,L=l._offset-S;n.clipRect.call(o.setTranslate,k,A).call(o.setScale,1/w,1/T),n.plot.call(o.setTranslate,E,L).call(o.setScale,w,T),o.setPointGroupScale(n.zoomScalePts,1/w,1/T),o.setTextPointsScale(n.zoomScaleTxt,1/w,1/T)}s.redrawComponents(t)}},951:function(t,e,r){"use strict";var n=r(73972).traceIs,i=r(4322);function a(t){return{v:"x",h:"y"}[t.orientation||"v"]}function o(t,e){var r=a(t),i=n(t,"box-violin"),o=n(t._fullInput||{},"candlestick");return i&&!o&&e===r&&void 0===t[r]&&void 0===t[r+"0"]}t.exports=function(t,e,r,s){r("autotypenumbers",s.autotypenumbersDflt),"-"===r("type",(s.splomStash||{}).type)&&(function(t,e){if("-"===t.type){var r,s=t._id,l=s.charAt(0);-1!==s.indexOf("scene")&&(s=l);var u=function(t,e,r){for(var n=0;n0&&(i["_"+r+"axes"]||{})[e])return i;if((i[r+"axis"]||r)===e){if(o(i,r))return i;if((i[r]||[]).length||i[r+"0"])return i}}}(e,s,l);if(u)if("histogram"!==u.type||l!=={v:"y",h:"x"}[u.orientation||"v"]){var c=l+"calendar",f=u[c],h={noMultiCategory:!n(u,"cartesian")||n(u,"noMultiCategory")};if("box"===u.type&&u._hasPreCompStats&&l==={h:"x",v:"y"}[u.orientation||"v"]&&(h.noMultiCategory=!0),h.autotypenumbers=t.autotypenumbers,o(u,l)){var p=a(u),d=[];for(r=0;r0?".":"")+a;i.isPlainObject(o)?l(o,e,s,n+1):e(s,a,o)}}))}e.manageCommandObserver=function(t,r,n,o){var s={},l=!0;r&&r._commandObserver&&(s=r._commandObserver),s.cache||(s.cache={}),s.lookupTable={};var u=e.hasSimpleAPICommandBindings(t,n,s.lookupTable);if(r&&r._commandObserver){if(u)return s;if(r._commandObserver.remove)return r._commandObserver.remove(),r._commandObserver=null,s}if(u){a(t,u,s.cache),s.check=function(){if(l){var e=a(t,u,s.cache);return e.changed&&o&&void 0!==s.lookupTable[e.value]&&(s.disable(),Promise.resolve(o({value:e.value,type:u.type,prop:u.prop,traces:u.traces,index:s.lookupTable[e.value]})).then(s.enable,s.enable)),e.changed}};for(var c=["plotly_relayout","plotly_redraw","plotly_restyle","plotly_update","plotly_animatingframe","plotly_afterplot"],f=0;f0&&i<0&&(i+=360);var s=(i-n)/4;return{type:"Polygon",coordinates:[[[n,a],[n,o],[n+s,o],[n+2*s,o],[n+3*s,o],[i,o],[i,a],[i-s,a],[i-2*s,a],[i-3*s,a],[n,a]]]}}t.exports=function(t){return new M(t)},S.plot=function(t,e,r,n){var i=this;if(n)return i.update(t,e,!0);i._geoCalcData=t,i._fullLayout=e;var a=e[this.id],o=[],s=!1;for(var l in w.layerNameToAdjective)if("frame"!==l&&a["show"+l]){s=!0;break}for(var u=!1,c=0;c0&&o._module.calcGeoJSON(a,e)}if(!r){if(this.updateProjection(t,e))return;this.viewInitial&&this.scope===n.scope||this.saveViewInitial(n)}this.scope=n.scope,this.updateBaseLayers(e,n),this.updateDims(e,n),this.updateFx(e,n),d.generalUpdatePerTraceModule(this.graphDiv,this,t,n);var s=this.layers.frontplot.select(".scatterlayer");this.dataPoints.point=s.selectAll(".point"),this.dataPoints.text=s.selectAll("text"),this.dataPaths.line=s.selectAll(".js-line");var l=this.layers.backplot.select(".choroplethlayer");this.dataPaths.choropleth=l.selectAll("path"),this._render()},S.updateProjection=function(t,e){var r=this.graphDiv,n=e[this.id],l=e._size,c=n.domain,f=n.projection,h=n.lonaxis,p=n.lataxis,d=h._ax,v=p._ax,y=this.projection=function(t){var e=t.projection,r=e.type,n=w.projNames[r];n="geo"+u.titleCase(n);for(var l=(i[n]||s[n])(),c=t._isSatellite?180*Math.acos(1/e.distance)/Math.PI:t._isClipped?w.lonaxisSpan[r]/2:null,f=["center","rotate","parallels","clipExtent"],h=function(t){return t?l:[]},p=0;pc*Math.PI/180}return!1},l.getPath=function(){return a().projection(l)},l.getBounds=function(t){return l.getPath().bounds(t)},l.precision(w.precision),t._isSatellite&&l.tilt(e.tilt).distance(e.distance),c&&l.clipAngle(c-w.clipPad),l}(n),m=[[l.l+l.w*c.x[0],l.t+l.h*(1-c.y[1])],[l.l+l.w*c.x[1],l.t+l.h*(1-c.y[0])]],x=n.center||{},b=f.rotation||{},_=h.range||[],T=p.range||[];if(n.fitbounds){d._length=m[1][0]-m[0][0],v._length=m[1][1]-m[0][1],d.range=g(r,d),v.range=g(r,v);var k=(d.range[0]+d.range[1])/2,A=(v.range[0]+v.range[1])/2;if(n._isScoped)x={lon:k,lat:A};else if(n._isClipped){x={lon:k,lat:A},b={lon:k,lat:A,roll:b.roll};var M=f.type,S=w.lonaxisSpan[M]/2||180,L=w.lataxisSpan[M]/2||90;_=[k-S,k+S],T=[A-L,A+L]}else x={lon:k,lat:A},b={lon:k,lat:b.lat,roll:b.roll}}y.center([x.lon-b.lon,x.lat-b.lat]).rotate([-b.lon,-b.lat,b.roll]).parallels(f.parallels);var C=E(_,T);y.fitExtent(m,C);var P=this.bounds=y.getBounds(C),O=this.fitScale=y.scale(),I=y.translate();if(n.fitbounds){var D=y.getBounds(E(d.range,v.range)),z=Math.min((P[1][0]-P[0][0])/(D[1][0]-D[0][0]),(P[1][1]-P[0][1])/(D[1][1]-D[0][1]));isFinite(z)?y.scale(z*O):u.warn("Something went wrong during"+this.id+"fitbounds computations.")}else y.scale(f.scale*O);var R=this.midPt=[(P[0][0]+P[1][0])/2,(P[0][1]+P[1][1])/2];if(y.translate([I[0]+(R[0]-I[0]),I[1]+(R[1]-I[1])]).clipExtent(P),n._isAlbersUsa){var F=y([x.lon,x.lat]),B=y.translate();y.translate([B[0]-(F[0]-B[0]),B[1]-(F[1]-B[1])])}},S.updateBaseLayers=function(t,e){var r=this,i=r.topojson,a=r.layers,o=r.basePaths;function s(t){return"lonaxis"===t||"lataxis"===t}function l(t){return Boolean(w.lineLayers[t])}function u(t){return Boolean(w.fillLayers[t])}var c=(this.hasChoropleth?w.layersForChoropleth:w.layers).filter((function(t){return l(t)||u(t)?e["show"+t]:!s(t)||e[t].showgrid})),p=r.framework.selectAll(".layer").data(c,String);p.exit().each((function(t){delete a[t],delete o[t],n.select(this).remove()})),p.enter().append("g").attr("class",(function(t){return"layer "+t})).each((function(t){var e=a[t]=n.select(this);"bg"===t?r.bgRect=e.append("rect").style("pointer-events","all"):s(t)?o[t]=e.append("path").style("fill","none"):"backplot"===t?e.append("g").classed("choroplethlayer",!0):"frontplot"===t?e.append("g").classed("scatterlayer",!0):l(t)?o[t]=e.append("path").style("fill","none").style("stroke-miterlimit",2):u(t)&&(o[t]=e.append("path").style("stroke","none"))})),p.order(),p.each((function(r){var n=o[r],a=w.layerNameToAdjective[r];"frame"===r?n.datum(w.sphereSVG):l(r)||u(r)?n.datum(A(i,i.objects[r])):s(r)&&n.datum(function(t,e,r){var n,i,a,o=e[t],s=w.scopeDefaults[e.scope];"lonaxis"===t?(n=s.lonaxisRange,i=s.lataxisRange,a=function(t,e){return[t,e]}):"lataxis"===t&&(n=s.lataxisRange,i=s.lonaxisRange,a=function(t,e){return[e,t]});var l={type:"linear",range:[n[0],n[1]-1e-6],tick0:o.tick0,dtick:o.dtick};v.setConvert(l,r);var u=v.calcTicks(l);e.isScoped||"lonaxis"!==t||u.pop();for(var c=u.length,f=new Array(c),h=0;h-1&&b(n.event,i,[r.xaxis],[r.yaxis],r.id,c),s.indexOf("event")>-1&&p.click(i,n.event))}))}function f(t){return r.projection.invert([t[0]+r.xaxis._offset,t[1]+r.yaxis._offset])}},S.makeFramework=function(){var t=this,e=t.graphDiv,r=e._fullLayout,i="clip"+r._uid+t.id;t.clipDef=r._clips.append("clipPath").attr("id",i),t.clipRect=t.clipDef.append("rect"),t.framework=n.select(t.container).append("g").attr("class","geo "+t.id).call(h.setClipUrl,i,e),t.project=function(e){var r=t.projection(e);return r?[r[0]-t.xaxis._offset,r[1]-t.yaxis._offset]:[null,null]},t.xaxis={_id:"x",c2p:function(e){return t.project(e)[0]}},t.yaxis={_id:"y",c2p:function(e){return t.project(e)[1]}},t.mockAxis={type:"linear",showexponent:"all",exponentformat:"B"},v.setConvert(t.mockAxis,r)},S.saveViewInitial=function(t){var e,r=t.center||{},n=t.projection,i=n.rotation||{};this.viewInitial={fitbounds:t.fitbounds,"projection.scale":n.scale},e=t._isScoped?{"center.lon":r.lon,"center.lat":r.lat}:t._isClipped?{"projection.rotation.lon":i.lon,"projection.rotation.lat":i.lat}:{"center.lon":r.lon,"center.lat":r.lat,"projection.rotation.lon":i.lon},u.extendFlat(this.viewInitial,e)},S.render=function(t){this._hasMarkerAngles&&t?this.plot(this._geoCalcData,this._fullLayout,[],!0):this._render()},S._render=function(){var t,e=this.projection,r=e.getPath();function n(t){var r=e(t.lonlat);return r?c(r[0],r[1]):null}function i(t){return e.isLonLatOverEdges(t.lonlat)?"none":null}for(t in this.basePaths)this.basePaths[t].attr("d",r);for(t in this.dataPaths)this.dataPaths[t].attr("d",(function(t){return r(t.geojson)}));for(t in this.dataPoints)this.dataPoints[t].attr("display",i).attr("transform",n)}},44622:function(t,e,r){"use strict";var n=r(27659).AU,i=r(71828).counterRegex,a=r(69082),o="geo",s=i(o),l={};l[o]={valType:"subplotid",dflt:o,editType:"calc"},t.exports={attr:o,name:o,idRoot:o,idRegex:s,attrRegex:s,attributes:l,layoutAttributes:r(77519),supplyLayoutDefaults:r(82161),plot:function(t){for(var e=t._fullLayout,r=t.calcdata,i=e._subplots[o],s=0;s0&&P<0&&(P+=360);var O,I,D,z=(C+P)/2;if(!p){var R=d?f.projRotate:[z,0,0];O=r("projection.rotation.lon",R[0]),r("projection.rotation.lat",R[1]),r("projection.rotation.roll",R[2]),r("showcoastlines",!d&&x)&&(r("coastlinecolor"),r("coastlinewidth")),r("showocean",!!x&&void 0)&&r("oceancolor")}p?(I=-96.6,D=38.7):(I=d?z:O,D=(L[0]+L[1])/2),r("center.lon",I),r("center.lat",D),v&&(r("projection.tilt"),r("projection.distance")),g&&r("projection.parallels",f.projParallels||[0,60]),r("projection.scale"),r("showland",!!x&&void 0)&&r("landcolor"),r("showlakes",!!x&&void 0)&&r("lakecolor"),r("showrivers",!!x&&void 0)&&(r("rivercolor"),r("riverwidth")),r("showcountries",d&&"usa"!==c&&x)&&(r("countrycolor"),r("countrywidth")),("usa"===c||"north america"===c&&50===u)&&(r("showsubunits",x),r("subunitcolor"),r("subunitwidth")),d||r("showframe",x)&&(r("framecolor"),r("framewidth")),r("bgcolor"),r("fitbounds")&&(delete e.projection.scale,d?(delete e.center.lon,delete e.center.lat):y?(delete e.center.lon,delete e.center.lat,delete e.projection.rotation.lon,delete e.projection.rotation.lat,delete e.lonaxis.range,delete e.lataxis.range):(delete e.center.lon,delete e.center.lat,delete e.projection.rotation.lon))}t.exports=function(t,e,r){i(t,e,r,{type:"geo",attributes:s,handleDefaults:u,fullData:r,partition:"y"})}},74455:function(t,e,r){"use strict";var n=r(39898),i=r(71828),a=r(73972),o=Math.PI/180,s=180/Math.PI,l={cursor:"pointer"},u={cursor:"auto"};function c(t,e){return n.behavior.zoom().translate(e.translate()).scale(e.scale())}function f(t,e,r){var n=t.id,o=t.graphDiv,s=o.layout,l=s[n],u=o._fullLayout,c=u[n],f={},h={};function p(t,e){f[n+"."+t]=i.nestedProperty(l,t).get(),a.call("_storeDirectGUIEdit",s,u._preGUI,f);var r=i.nestedProperty(c,t);r.get()!==e&&(r.set(e),i.nestedProperty(l,t).set(e),h[n+"."+t]=e)}r(p),p("projection.scale",e.scale()/t.fitScale),p("fitbounds",!1),o.emit("plotly_relayout",h)}function h(t,e){var r=c(0,e);function i(r){var n=e.invert(t.midPt);r("center.lon",n[0]),r("center.lat",n[1])}return r.on("zoomstart",(function(){n.select(this).style(l)})).on("zoom",(function(){e.scale(n.event.scale).translate(n.event.translate),t.render(!0);var r=e.invert(t.midPt);t.graphDiv.emit("plotly_relayouting",{"geo.projection.scale":e.scale()/t.fitScale,"geo.center.lon":r[0],"geo.center.lat":r[1]})})).on("zoomend",(function(){n.select(this).style(u),f(t,e,i)})),r}function p(t,e){var r,i,a,o,s,h,p,d,v,g=c(0,e);function y(t){return e.invert(t)}function m(r){var n=e.rotate(),i=e.invert(t.midPt);r("projection.rotation.lon",-n[0]),r("center.lon",i[0]),r("center.lat",i[1])}return g.on("zoomstart",(function(){n.select(this).style(l),r=n.mouse(this),i=e.rotate(),a=e.translate(),o=i,s=y(r)})).on("zoom",(function(){if(h=n.mouse(this),function(t){var r=y(t);if(!r)return!0;var n=e(r);return Math.abs(n[0]-t[0])>2||Math.abs(n[1]-t[1])>2}(r))return g.scale(e.scale()),void g.translate(e.translate());e.scale(n.event.scale),e.translate([a[0],n.event.translate[1]]),s?y(h)&&(d=y(h),p=[o[0]+(d[0]-s[0]),i[1],i[2]],e.rotate(p),o=p):s=y(r=h),v=!0,t.render(!0);var l=e.rotate(),u=e.invert(t.midPt);t.graphDiv.emit("plotly_relayouting",{"geo.projection.scale":e.scale()/t.fitScale,"geo.center.lon":u[0],"geo.center.lat":u[1],"geo.projection.rotation.lon":-l[0]})})).on("zoomend",(function(){n.select(this).style(u),v&&f(t,e,m)})),g}function d(t,e){var r,i={r:e.rotate(),k:e.scale()},a=c(0,e),h=function(t){for(var e=0,r=arguments.length,i=[];++ed?(a=(f>0?90:-90)-p,i=0):(a=Math.asin(f/d)*s-p,i=Math.sqrt(d*d-f*f));var v=180-a-2*p,y=(Math.atan2(h,c)-Math.atan2(u,i))*s,x=(Math.atan2(h,c)-Math.atan2(u,-i))*s;return g(r[0],r[1],a,y)<=g(r[0],r[1],v,x)?[a,y,r[2]]:[v,x,r[2]]}(T,r,E);isFinite(k[0])&&isFinite(k[1])&&isFinite(k[2])||(k=E),e.rotate(k),E=k}}else r=v(e,M=b);h.of(this,arguments)({type:"zoom"})})),A=h.of(this,arguments),p++||A({type:"zoomstart"})})).on("zoomend",(function(){var r;n.select(this).style(u),d.call(a,"zoom",null),r=h.of(this,arguments),--p||r({type:"zoomend"}),f(t,e,y)})).on("zoom.redraw",(function(){t.render(!0);var r=e.rotate();t.graphDiv.emit("plotly_relayouting",{"geo.projection.scale":e.scale()/t.fitScale,"geo.projection.rotation.lon":-r[0],"geo.projection.rotation.lat":-r[1]})})),n.rebind(a,h,"on")}function v(t,e){var r=t.invert(e);return r&&isFinite(r[0])&&isFinite(r[1])&&function(t){var e=t[0]*o,r=t[1]*o,n=Math.cos(r);return[n*Math.cos(e),n*Math.sin(e),Math.sin(r)]}(r)}function g(t,e,r,n){var i=y(r-t),a=y(n-e);return Math.sqrt(i*i+a*a)}function y(t){return(t%360+540)%360-180}function m(t,e,r){var n=r*o,i=t.slice(),a=0===e?1:0,s=2===e?1:2,l=Math.cos(n),u=Math.sin(n);return i[a]=t[a]*l-t[s]*u,i[s]=t[s]*l+t[a]*u,i}function x(t,e){for(var r=0,n=0,i=t.length;nMath.abs(s)?(u.boxEnd[1]=u.boxStart[1]+Math.abs(a)*_*(s>=0?1:-1),u.boxEnd[1]l[3]&&(u.boxEnd[1]=l[3],u.boxEnd[0]=u.boxStart[0]+(l[3]-u.boxStart[1])/Math.abs(_))):(u.boxEnd[0]=u.boxStart[0]+Math.abs(s)/_*(a>=0?1:-1),u.boxEnd[0]l[2]&&(u.boxEnd[0]=l[2],u.boxEnd[1]=u.boxStart[1]+(l[2]-u.boxStart[0])*Math.abs(_)))}}else u.boxEnabled?(a=u.boxStart[0]!==u.boxEnd[0],s=u.boxStart[1]!==u.boxEnd[1],a||s?(a&&(g(0,u.boxStart[0],u.boxEnd[0]),t.xaxis.autorange=!1),s&&(g(1,u.boxStart[1],u.boxEnd[1]),t.yaxis.autorange=!1),t.relayoutCallback()):t.glplot.setDirty(),u.boxEnabled=!1,u.boxInited=!1):u.boxInited&&(u.boxInited=!1);break;case"pan":u.boxEnabled=!1,u.boxInited=!1,e?(u.panning||(u.dragStart[0]=n,u.dragStart[1]=i),Math.abs(u.dragStart[0]-n).999&&(g="turntable"):g="turntable")}else g="turntable";r("dragmode",g),r("hovermode",n.getDfltFromLayout("hovermode"))}t.exports=function(t,e,r){var i=e._basePlotModules.length>1;o(t,e,r,{type:c,attributes:l,handleDefaults:f,fullLayout:e,font:e.font,fullData:r,getDfltFromLayout:function(e){if(!i)return n.validate(t[e],l[e])?t[e]:void 0},autotypenumbersDflt:e.autotypenumbers,paper_bgcolor:e.paper_bgcolor,calendar:e.calendar})}},65500:function(t,e,r){"use strict";var n=r(77894),i=r(27670).Y,a=r(1426).extendFlat,o=r(71828).counterRegex;function s(t,e,r){return{x:{valType:"number",dflt:t,editType:"camera"},y:{valType:"number",dflt:e,editType:"camera"},z:{valType:"number",dflt:r,editType:"camera"},editType:"camera"}}t.exports={_arrayAttrRegexps:[o("scene",".annotations",!0)],bgcolor:{valType:"color",dflt:"rgba(0,0,0,0)",editType:"plot"},camera:{up:a(s(0,0,1),{}),center:a(s(0,0,0),{}),eye:a(s(1.25,1.25,1.25),{}),projection:{type:{valType:"enumerated",values:["perspective","orthographic"],dflt:"perspective",editType:"calc"},editType:"calc"},editType:"camera"},domain:i({name:"scene",editType:"plot"}),aspectmode:{valType:"enumerated",values:["auto","cube","data","manual"],dflt:"auto",editType:"plot",impliedEdits:{"aspectratio.x":void 0,"aspectratio.y":void 0,"aspectratio.z":void 0}},aspectratio:{x:{valType:"number",min:0,editType:"plot",impliedEdits:{"^aspectmode":"manual"}},y:{valType:"number",min:0,editType:"plot",impliedEdits:{"^aspectmode":"manual"}},z:{valType:"number",min:0,editType:"plot",impliedEdits:{"^aspectmode":"manual"}},editType:"plot",impliedEdits:{aspectmode:"manual"}},xaxis:n,yaxis:n,zaxis:n,dragmode:{valType:"enumerated",values:["orbit","turntable","zoom","pan",!1],editType:"plot"},hovermode:{valType:"enumerated",values:["closest",!1],dflt:"closest",editType:"modebar"},uirevision:{valType:"any",editType:"none"},editType:"plot",_deprecated:{cameraposition:{valType:"info_array",editType:"camera"}}}},13133:function(t,e,r){"use strict";var n=r(78614),i=["xaxis","yaxis","zaxis"];function a(){this.enabled=[!0,!0,!0],this.colors=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.drawSides=[!0,!0,!0],this.lineWidth=[1,1,1]}a.prototype.merge=function(t){for(var e=0;e<3;++e){var r=t[i[e]];r.visible?(this.enabled[e]=r.showspikes,this.colors[e]=n(r.spikecolor),this.drawSides[e]=r.spikesides,this.lineWidth[e]=r.spikethickness):(this.enabled[e]=!1,this.drawSides[e]=!1)}},t.exports=function(t){var e=new a;return e.merge(t),e}},96085:function(t,e,r){"use strict";t.exports=function(t){for(var e=t.axesOptions,r=t.glplot.axesPixels,s=t.fullSceneLayout,l=[[],[],[]],u=0;u<3;++u){var c=s[a[u]];if(c._length=(r[u].hi-r[u].lo)*r[u].pixelsPerDataUnit/t.dataScale[u],Math.abs(c._length)===1/0||isNaN(c._length))l[u]=[];else{c._input_range=c.range.slice(),c.range[0]=r[u].lo/t.dataScale[u],c.range[1]=r[u].hi/t.dataScale[u],c._m=1/(t.dataScale[u]*r[u].pixelsPerDataUnit),c.range[0]===c.range[1]&&(c.range[0]-=1,c.range[1]+=1);var f=c.tickmode;if("auto"===c.tickmode){c.tickmode="linear";var h=c.nticks||i.constrain(c._length/40,4,9);n.autoTicks(c,Math.abs(c.range[1]-c.range[0])/h)}for(var p=n.calcTicks(c,{msUTC:!0}),d=0;d/g," "));l[u]=p,c.tickmode=f}}for(e.ticks=l,u=0;u<3;++u)for(o[u]=.5*(t.glplot.bounds[0][u]+t.glplot.bounds[1][u]),d=0;d<2;++d)e.bounds[d][u]=t.glplot.bounds[d][u];t.contourLevels=function(t){for(var e=new Array(3),r=0;r<3;++r){for(var n=t[r],i=new Array(n.length),a=0;ar.deltaY?1.1:1/1.1,a=t.glplot.getAspectratio();t.glplot.setAspectratio({x:n*a.x,y:n*a.y,z:n*a.z})}i(t)}}),!!u&&{passive:!1}),t.glplot.canvas.addEventListener("mousemove",(function(){if(!1!==t.fullSceneLayout.dragmode&&0!==t.camera.mouseListener.buttons){var e=n();t.graphDiv.emit("plotly_relayouting",e)}})),t.staticMode||t.glplot.canvas.addEventListener("webglcontextlost",(function(r){e&&e.emit&&e.emit("plotly_webglcontextlost",{event:r,layer:t.id})}),!1)),t.glplot.oncontextloss=function(){t.recoverContext()},t.glplot.onrender=function(){t.render()},!0},T.render=function(){var t,e=this,r=e.graphDiv,n=e.svgContainer,i=e.container.getBoundingClientRect();r._fullLayout._calcInverseTransform(r);var a=r._fullLayout._invScaleX,o=r._fullLayout._invScaleY,s=i.width*a,l=i.height*o;n.setAttributeNS(null,"viewBox","0 0 "+s+" "+l),n.setAttributeNS(null,"width",s),n.setAttributeNS(null,"height",l),b(e),e.glplot.axes.update(e.axesOptions);for(var u=Object.keys(e.traces),c=null,h=e.glplot.selection,v=0;v")):"isosurface"===t.type||"volume"===t.type?(k.valueLabel=p.hoverLabelText(e._mockAxis,e._mockAxis.d2l(h.traceCoordinate[3]),t.valuehoverformat),E.push("value: "+k.valueLabel),h.textLabel&&E.push(h.textLabel),x=E.join("
")):x=h.textLabel;var L={x:h.traceCoordinate[0],y:h.traceCoordinate[1],z:h.traceCoordinate[2],data:w._input,fullData:w,curveNumber:w.index,pointNumber:T};d.appendArrayPointValue(L,w,T),t._module.eventData&&(L=w._module.eventData(L,h,w,{},T));var C={points:[L]};if(e.fullSceneLayout.hovermode){var P=[];d.loneHover({trace:w,x:(.5+.5*m[0]/m[3])*s,y:(.5-.5*m[1]/m[3])*l,xLabel:k.xLabel,yLabel:k.yLabel,zLabel:k.zLabel,text:x,name:c.name,color:d.castHoverOption(w,T,"bgcolor")||c.color,borderColor:d.castHoverOption(w,T,"bordercolor"),fontFamily:d.castHoverOption(w,T,"font.family"),fontSize:d.castHoverOption(w,T,"font.size"),fontColor:d.castHoverOption(w,T,"font.color"),nameLength:d.castHoverOption(w,T,"namelength"),textAlign:d.castHoverOption(w,T,"align"),hovertemplate:f.castOption(w,T,"hovertemplate"),hovertemplateLabels:f.extendFlat({},L,k),eventData:[L]},{container:n,gd:r,inOut_bbox:P}),L.bbox=P[0]}h.distance<5&&(h.buttons||_)?r.emit("plotly_click",C):r.emit("plotly_hover",C),this.oldEventData=C}else d.loneUnhover(n),this.oldEventData&&r.emit("plotly_unhover",this.oldEventData),this.oldEventData=void 0;e.drawAnnotations(e)},T.recoverContext=function(){var t=this;t.glplot.dispose();var e=function(){t.glplot.gl.isContextLost()?requestAnimationFrame(e):t.initializeGLPlot()?t.plot.apply(t,t.plotArgs):f.error("Catastrophic and unrecoverable WebGL error. Context lost.")};requestAnimationFrame(e)};var A=["xaxis","yaxis","zaxis"];function M(t,e,r){for(var n=t.fullSceneLayout,i=0;i<3;i++){var a=A[i],o=a.charAt(0),s=n[a],l=e[o],u=e[o+"calendar"],c=e["_"+o+"length"];if(f.isArrayOrTypedArray(l))for(var h,p=0;p<(c||l.length);p++)if(f.isArrayOrTypedArray(l[p]))for(var d=0;dy[1][o])y[0][o]=-1,y[1][o]=1;else{var C=y[1][o]-y[0][o];y[0][o]-=C/32,y[1][o]+=C/32}if("reversed"===l.autorange){var P=y[0][o];y[0][o]=y[1][o],y[1][o]=P}}else{var O=l.range;y[0][o]=l.r2l(O[0]),y[1][o]=l.r2l(O[1])}y[0][o]===y[1][o]&&(y[0][o]-=1,y[1][o]+=1),m[o]=y[1][o]-y[0][o],n.glplot.setBounds(o,{min:y[0][o]*p[o],max:y[1][o]*p[o]})}var I=c.aspectmode;if("cube"===I)g=[1,1,1];else if("manual"===I){var D=c.aspectratio;g=[D.x,D.y,D.z]}else{if("auto"!==I&&"data"!==I)throw new Error("scene.js aspectRatio was not one of the enumerated types");var z=[1,1,1];for(o=0;o<3;++o){var R=x[u=(l=c[A[o]]).type];z[o]=Math.pow(R.acc,1/R.count)/p[o]}g="data"===I||Math.max.apply(null,z)/Math.min.apply(null,z)<=4?z:[1,1,1]}c.aspectratio.x=f.aspectratio.x=g[0],c.aspectratio.y=f.aspectratio.y=g[1],c.aspectratio.z=f.aspectratio.z=g[2],n.glplot.setAspectratio(c.aspectratio),n.viewInitial.aspectratio||(n.viewInitial.aspectratio={x:c.aspectratio.x,y:c.aspectratio.y,z:c.aspectratio.z}),n.viewInitial.aspectmode||(n.viewInitial.aspectmode=c.aspectmode);var F=c.domain||null,B=e._size||null;if(F&&B){var N=n.container.style;N.position="absolute",N.left=B.l+F.x[0]*B.w+"px",N.top=B.t+(1-F.y[1])*B.h+"px",N.width=B.w*(F.x[1]-F.x[0])+"px",N.height=B.h*(F.y[1]-F.y[0])+"px"}n.glplot.redraw()}},T.destroy=function(){var t=this;t.glplot&&(t.camera.mouseListener.enabled=!1,t.container.removeEventListener("wheel",t.camera.wheelListener),t.camera=null,t.glplot.dispose(),t.container.parentNode.removeChild(t.container),t.glplot=null)},T.getCamera=function(){var t,e=this;return e.camera.view.recalcMatrix(e.camera.view.lastT()),{up:{x:(t=e.camera).up[0],y:t.up[1],z:t.up[2]},center:{x:t.center[0],y:t.center[1],z:t.center[2]},eye:{x:t.eye[0],y:t.eye[1],z:t.eye[2]},projection:{type:!0===t._ortho?"orthographic":"perspective"}}},T.setViewport=function(t){var e,r=this,n=t.camera;r.camera.lookAt.apply(this,[[(e=n).eye.x,e.eye.y,e.eye.z],[e.center.x,e.center.y,e.center.z],[e.up.x,e.up.y,e.up.z]]),r.glplot.setAspectratio(t.aspectratio),"orthographic"===n.projection.type!==r.camera._ortho&&(r.glplot.redraw(),r.glplot.clearRGBA(),r.glplot.dispose(),r.initializeGLPlot())},T.isCameraChanged=function(t){var e=this.getCamera(),r=f.nestedProperty(t,this.id+".camera").get();function n(t,e,r,n){var i=["up","center","eye"],a=["x","y","z"];return e[i[r]]&&t[i[r]][a[n]]===e[i[r]][a[n]]}var i=!1;if(void 0===r)i=!0;else{for(var a=0;a<3;a++)for(var o=0;o<3;o++)if(!n(e,r,a,o)){i=!0;break}(!r.projection||e.projection&&e.projection.type!==r.projection.type)&&(i=!0)}return i},T.isAspectChanged=function(t){var e=this.glplot.getAspectratio(),r=f.nestedProperty(t,this.id+".aspectratio").get();return void 0===r||r.x!==e.x||r.y!==e.y||r.z!==e.z},T.saveLayout=function(t){var e,r,n,i,a,o,s=this,l=s.fullLayout,u=s.isCameraChanged(t),h=s.isAspectChanged(t),p=u||h;if(p){var d={};u&&(e=s.getCamera(),n=(r=f.nestedProperty(t,s.id+".camera")).get(),d[s.id+".camera"]=n),h&&(i=s.glplot.getAspectratio(),o=(a=f.nestedProperty(t,s.id+".aspectratio")).get(),d[s.id+".aspectratio"]=o),c.call("_storeDirectGUIEdit",t,l._preGUI,d),u&&(r.set(e),f.nestedProperty(l,s.id+".camera").set(e)),h&&(a.set(i),f.nestedProperty(l,s.id+".aspectratio").set(i),s.glplot.redraw())}return p},T.updateFx=function(t,e){var r=this,n=r.camera;if(n)if("orbit"===t)n.mode="orbit",n.keyBindingMode="rotate";else if("turntable"===t){n.up=[0,0,1],n.mode="turntable",n.keyBindingMode="rotate";var i=r.graphDiv,a=i._fullLayout,o=r.fullSceneLayout.camera,s=o.up.x,l=o.up.y,u=o.up.z;if(u/Math.sqrt(s*s+l*l+u*u)<.999){var h=r.id+".camera.up",p={x:0,y:0,z:1},d={};d[h]=p;var v=i.layout;c.call("_storeDirectGUIEdit",v,a._preGUI,d),o.up=p,f.nestedProperty(v,h).set(p)}}else n.keyBindingMode=t;r.fullSceneLayout.hovermode=e},T.toImage=function(t){var e=this;t||(t="png"),e.staticMode&&e.container.appendChild(n),e.glplot.redraw();var r=e.glplot.gl,i=r.drawingBufferWidth,a=r.drawingBufferHeight;r.bindFramebuffer(r.FRAMEBUFFER,null);var o=new Uint8Array(i*a*4);r.readPixels(0,0,i,a,r.RGBA,r.UNSIGNED_BYTE,o),function(t,e,r){for(var n=0,i=r-1;n0)for(var s=255/o,l=0;l<3;++l)t[a+l]=Math.min(s*t[a+l],255)}}(o,i,a);var s=document.createElement("canvas");s.width=i,s.height=a;var l,u=s.getContext("2d",{willReadFrequently:!0}),c=u.createImageData(i,a);switch(c.data.set(o),u.putImageData(c,0,0),t){case"jpeg":l=s.toDataURL("image/jpeg");break;case"webp":l=s.toDataURL("image/webp");break;default:l=s.toDataURL("image/png")}return e.staticMode&&e.container.removeChild(n),l},T.setConvert=function(){for(var t=0;t<3;t++){var e=this.fullSceneLayout[A[t]];p.setConvert(e,this.fullLayout),e.setScale=f.noop}},T.make4thDimension=function(){var t=this,e=t.graphDiv._fullLayout;t._mockAxis={type:"linear",showexponent:"all",exponentformat:"B"},p.setConvert(t._mockAxis,e)},t.exports=w},90060:function(t){"use strict";t.exports=function(t,e,r,n){n=n||t.length;for(var i=new Array(n),a=0;aOpenStreetMap contributors',o=['© Carto',a].join(" "),s=['Map tiles by Stamen Design','under CC BY 3.0',"|",'Data by
OpenStreetMap contributors','under ODbL'].join(" "),l={"open-street-map":{id:"osm",version:8,sources:{"plotly-osm-tiles":{type:"raster",attribution:a,tiles:["https://a.tile.openstreetmap.org/{z}/{x}/{y}.png","https://b.tile.openstreetmap.org/{z}/{x}/{y}.png"],tileSize:256}},layers:[{id:"plotly-osm-tiles",type:"raster",source:"plotly-osm-tiles",minzoom:0,maxzoom:22}],glyphs:"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf"},"white-bg":{id:"white-bg",version:8,sources:{},layers:[{id:"white-bg",type:"background",paint:{"background-color":"#FFFFFF"},minzoom:0,maxzoom:22}],glyphs:"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf"},"carto-positron":{id:"carto-positron",version:8,sources:{"plotly-carto-positron":{type:"raster",attribution:o,tiles:["https://cartodb-basemaps-c.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png"],tileSize:256}},layers:[{id:"plotly-carto-positron",type:"raster",source:"plotly-carto-positron",minzoom:0,maxzoom:22}],glyphs:"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf"},"carto-darkmatter":{id:"carto-darkmatter",version:8,sources:{"plotly-carto-darkmatter":{type:"raster",attribution:o,tiles:["https://cartodb-basemaps-c.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png"],tileSize:256}},layers:[{id:"plotly-carto-darkmatter",type:"raster",source:"plotly-carto-darkmatter",minzoom:0,maxzoom:22}],glyphs:"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf"},"stamen-terrain":{id:"stamen-terrain",version:8,sources:{"plotly-stamen-terrain":{type:"raster",attribution:s,tiles:["https://stamen-tiles.a.ssl.fastly.net/terrain/{z}/{x}/{y}.png"],tileSize:256}},layers:[{id:"plotly-stamen-terrain",type:"raster",source:"plotly-stamen-terrain",minzoom:0,maxzoom:22}],glyphs:"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf"},"stamen-toner":{id:"stamen-toner",version:8,sources:{"plotly-stamen-toner":{type:"raster",attribution:s,tiles:["https://stamen-tiles.a.ssl.fastly.net/toner/{z}/{x}/{y}.png"],tileSize:256}},layers:[{id:"plotly-stamen-toner",type:"raster",source:"plotly-stamen-toner",minzoom:0,maxzoom:22}],glyphs:"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf"},"stamen-watercolor":{id:"stamen-watercolor",version:8,sources:{"plotly-stamen-watercolor":{type:"raster",attribution:['Map tiles by Stamen Design','under CC BY 3.0',"|",'Data by OpenStreetMap contributors','under CC BY SA'].join(" "),tiles:["https://stamen-tiles.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.png"],tileSize:256}},layers:[{id:"plotly-stamen-watercolor",type:"raster",source:"plotly-stamen-watercolor",minzoom:0,maxzoom:22}],glyphs:"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf"}},u=n(l);t.exports={requiredVersion:i,styleUrlPrefix:"mapbox://styles/mapbox/",styleUrlSuffix:"v9",styleValuesMapbox:["basic","streets","outdoors","light","dark","satellite","satellite-streets"],styleValueDflt:"basic",stylesNonMapbox:l,styleValuesNonMapbox:u,traceLayerPrefix:"plotly-trace-layer-",layoutLayerPrefix:"plotly-layout-layer-",wrongVersionErrorMsg:["Your custom plotly.js bundle is not using the correct mapbox-gl version","Please install mapbox-gl@"+i+"."].join("\n"),noAccessTokenErrorMsg:["Missing Mapbox access token.","Mapbox trace type require a Mapbox access token to be registered.","For example:"," Plotly.newPlot(gd, data, layout, { mapboxAccessToken: 'my-access-token' });","More info here: https://www.mapbox.com/help/define-access-token/"].join("\n"),missingStyleErrorMsg:["No valid mapbox style found, please set `mapbox.style` to one of:",u.join(", "),"or register a Mapbox access token to use a Mapbox-served style."].join("\n"),multipleTokensErrorMsg:["Set multiple mapbox access token across different mapbox subplot,","using first token found as mapbox-gl does not allow multipleaccess tokens on the same page."].join("\n"),mapOnErrorMsg:"Mapbox error.",mapboxLogo:{path0:"m 10.5,1.24 c -5.11,0 -9.25,4.15 -9.25,9.25 0,5.1 4.15,9.25 9.25,9.25 5.1,0 9.25,-4.15 9.25,-9.25 0,-5.11 -4.14,-9.25 -9.25,-9.25 z m 4.39,11.53 c -1.93,1.93 -4.78,2.31 -6.7,2.31 -0.7,0 -1.41,-0.05 -2.1,-0.16 0,0 -1.02,-5.64 2.14,-8.81 0.83,-0.83 1.95,-1.28 3.13,-1.28 1.27,0 2.49,0.51 3.39,1.42 1.84,1.84 1.89,4.75 0.14,6.52 z",path1:"M 10.5,-0.01 C 4.7,-0.01 0,4.7 0,10.49 c 0,5.79 4.7,10.5 10.5,10.5 5.8,0 10.5,-4.7 10.5,-10.5 C 20.99,4.7 16.3,-0.01 10.5,-0.01 Z m 0,19.75 c -5.11,0 -9.25,-4.15 -9.25,-9.25 0,-5.1 4.14,-9.26 9.25,-9.26 5.11,0 9.25,4.15 9.25,9.25 0,5.13 -4.14,9.26 -9.25,9.26 z",path2:"M 14.74,6.25 C 12.9,4.41 9.98,4.35 8.23,6.1 5.07,9.27 6.09,14.91 6.09,14.91 c 0,0 5.64,1.02 8.81,-2.14 C 16.64,11 16.59,8.09 14.74,6.25 Z m -2.27,4.09 -0.91,1.87 -0.9,-1.87 -1.86,-0.91 1.86,-0.9 0.9,-1.87 0.91,1.87 1.86,0.9 z",polygon:"11.56,12.21 10.66,10.34 8.8,9.43 10.66,8.53 11.56,6.66 12.47,8.53 14.33,9.43 12.47,10.34"},styleRules:{map:"overflow:hidden;position:relative;","missing-css":"display:none;",canary:"background-color:salmon;","ctrl-bottom-left":"position: absolute; pointer-events: none; z-index: 2; bottom: 0; left: 0;","ctrl-bottom-right":"position: absolute; pointer-events: none; z-index: 2; right: 0; bottom: 0;",ctrl:"clear: both; pointer-events: auto; transform: translate(0, 0);","ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-inner":"display: none;","ctrl-attrib.mapboxgl-compact:hover .mapboxgl-ctrl-attrib-inner":"display: block; margin-top:2px","ctrl-attrib.mapboxgl-compact:hover":"padding: 2px 24px 2px 4px; visibility: visible; margin-top: 6px;","ctrl-attrib.mapboxgl-compact::after":'content: ""; cursor: pointer; position: absolute; background-image: url(\'data:image/svg+xml;charset=utf-8,%3Csvg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"%3E %3Cpath fill="%23333333" fill-rule="evenodd" d="M4,10a6,6 0 1,0 12,0a6,6 0 1,0 -12,0 M9,7a1,1 0 1,0 2,0a1,1 0 1,0 -2,0 M9,10a1,1 0 1,1 2,0l0,3a1,1 0 1,1 -2,0"/%3E %3C/svg%3E\'); background-color: rgba(255, 255, 255, 0.5); width: 24px; height: 24px; box-sizing: border-box; border-radius: 12px;',"ctrl-attrib.mapboxgl-compact":"min-height: 20px; padding: 0; margin: 10px; position: relative; background-color: #fff; border-radius: 3px 12px 12px 3px;","ctrl-bottom-right > .mapboxgl-ctrl-attrib.mapboxgl-compact::after":"bottom: 0; right: 0","ctrl-bottom-left > .mapboxgl-ctrl-attrib.mapboxgl-compact::after":"bottom: 0; left: 0","ctrl-bottom-left .mapboxgl-ctrl":"margin: 0 0 10px 10px; float: left;","ctrl-bottom-right .mapboxgl-ctrl":"margin: 0 10px 10px 0; float: right;","ctrl-attrib":"color: rgba(0, 0, 0, 0.75); text-decoration: none; font-size: 12px","ctrl-attrib a":"color: rgba(0, 0, 0, 0.75); text-decoration: none; font-size: 12px","ctrl-attrib a:hover":"color: inherit; text-decoration: underline;","ctrl-attrib .mapbox-improve-map":"font-weight: bold; margin-left: 2px;","attrib-empty":"display: none;","ctrl-logo":'display:block; width: 21px; height: 21px; background-image: url(\'data:image/svg+xml;charset=utf-8,%3C?xml version="1.0" encoding="utf-8"?%3E %3Csvg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 21 21" style="enable-background:new 0 0 21 21;" xml:space="preserve"%3E%3Cg transform="translate(0,0.01)"%3E%3Cpath d="m 10.5,1.24 c -5.11,0 -9.25,4.15 -9.25,9.25 0,5.1 4.15,9.25 9.25,9.25 5.1,0 9.25,-4.15 9.25,-9.25 0,-5.11 -4.14,-9.25 -9.25,-9.25 z m 4.39,11.53 c -1.93,1.93 -4.78,2.31 -6.7,2.31 -0.7,0 -1.41,-0.05 -2.1,-0.16 0,0 -1.02,-5.64 2.14,-8.81 0.83,-0.83 1.95,-1.28 3.13,-1.28 1.27,0 2.49,0.51 3.39,1.42 1.84,1.84 1.89,4.75 0.14,6.52 z" style="opacity:0.9;fill:%23ffffff;enable-background:new" class="st0"/%3E%3Cpath d="M 10.5,-0.01 C 4.7,-0.01 0,4.7 0,10.49 c 0,5.79 4.7,10.5 10.5,10.5 5.8,0 10.5,-4.7 10.5,-10.5 C 20.99,4.7 16.3,-0.01 10.5,-0.01 Z m 0,19.75 c -5.11,0 -9.25,-4.15 -9.25,-9.25 0,-5.1 4.14,-9.26 9.25,-9.26 5.11,0 9.25,4.15 9.25,9.25 0,5.13 -4.14,9.26 -9.25,9.26 z" style="opacity:0.35;enable-background:new" class="st1"/%3E%3Cpath d="M 14.74,6.25 C 12.9,4.41 9.98,4.35 8.23,6.1 5.07,9.27 6.09,14.91 6.09,14.91 c 0,0 5.64,1.02 8.81,-2.14 C 16.64,11 16.59,8.09 14.74,6.25 Z m -2.27,4.09 -0.91,1.87 -0.9,-1.87 -1.86,-0.91 1.86,-0.9 0.9,-1.87 0.91,1.87 1.86,0.9 z" style="opacity:0.35;enable-background:new" class="st1"/%3E%3Cpolygon points="11.56,12.21 10.66,10.34 8.8,9.43 10.66,8.53 11.56,6.66 12.47,8.53 14.33,9.43 12.47,10.34 " style="opacity:0.9;fill:%23ffffff;enable-background:new" class="st0"/%3E%3C/g%3E%3C/svg%3E\')'}}},13056:function(t,e,r){"use strict";var n=r(71828);t.exports=function(t,e){var r=t.split(" "),i=r[0],a=r[1],o=n.isArrayOrTypedArray(e)?n.mean(e):e,s=.5+o/100,l=1.5+o/100,u=["",""],c=[0,0];switch(i){case"top":u[0]="top",c[1]=-l;break;case"bottom":u[0]="bottom",c[1]=l}switch(a){case"left":u[1]="right",c[0]=-s;break;case"right":u[1]="left",c[0]=s}return{anchor:u[0]&&u[1]?u.join("-"):u[0]?u[0]:u[1]?u[1]:"center",offset:c}}},50101:function(t,e,r){"use strict";var n=r(44517),i=r(71828),a=i.strTranslate,o=i.strScale,s=r(27659).AU,l=r(77922),u=r(39898),c=r(91424),f=r(63893),h=r(10481),p="mapbox",d=e.constants=r(77734);function v(t){return"string"==typeof t&&(-1!==d.styleValuesMapbox.indexOf(t)||0===t.indexOf("mapbox://"))}e.name=p,e.attr="subplot",e.idRoot=p,e.idRegex=e.attrRegex=i.counterRegex(p),e.attributes={subplot:{valType:"subplotid",dflt:"mapbox",editType:"calc"}},e.layoutAttributes=r(23585),e.supplyLayoutDefaults=r(77882),e.plot=function(t){var e=t._fullLayout,r=t.calcdata,a=e._subplots[p];if(n.version!==d.requiredVersion)throw new Error(d.wrongVersionErrorMsg);var o=function(t,e){var r=t._fullLayout;if(""===t._context.mapboxAccessToken)return"";for(var n=[],a=[],o=!1,s=!1,l=0;l1&&i.warn(d.multipleTokensErrorMsg),n[0]):(a.length&&i.log(["Listed mapbox access token(s)",a.join(","),"but did not use a Mapbox map style, ignoring token(s)."].join(" ")),"")}(t,a);n.accessToken=o;for(var l=0;lw/2){var T=m.split("|").join("
");b.text(T).attr("data-unformatted",T).call(f.convertToTspans,t),_=c.bBox(b.node())}b.attr("transform",a(-3,8-_.height)),x.insert("rect",".static-attribution").attr({x:-_.width-6,y:-_.height-3,width:_.width+6,height:_.height+3,fill:"rgba(255, 255, 255, 0.75)"});var k=1;_.width+6>w&&(k=w/(_.width+6));var A=[n.l+n.w*h.x[1],n.t+n.h*(1-h.y[0])];x.attr("transform",a(A[0],A[1])+o(k))}},e.updateFx=function(t){for(var e=t._fullLayout,r=e._subplots[p],n=0;n0){for(var r=0;r0}function c(t){var e={},r={};switch(t.type){case"circle":n.extendFlat(r,{"circle-radius":t.circle.radius,"circle-color":t.color,"circle-opacity":t.opacity});break;case"line":n.extendFlat(r,{"line-width":t.line.width,"line-color":t.color,"line-opacity":t.opacity,"line-dasharray":t.line.dash});break;case"fill":n.extendFlat(r,{"fill-color":t.color,"fill-outline-color":t.fill.outlinecolor,"fill-opacity":t.opacity});break;case"symbol":var i=t.symbol,o=a(i.textposition,i.iconsize);n.extendFlat(e,{"icon-image":i.icon+"-15","icon-size":i.iconsize/10,"text-field":i.text,"text-size":i.textfont.size,"text-anchor":o.anchor,"text-offset":o.offset,"symbol-placement":i.placement}),n.extendFlat(r,{"icon-color":t.color,"text-color":i.textfont.color,"text-opacity":t.opacity});break;case"raster":n.extendFlat(r,{"raster-fade-duration":0,"raster-opacity":t.opacity})}return{layout:e,paint:r}}l.update=function(t){this.visible?this.needsNewImage(t)?this.updateImage(t):this.needsNewSource(t)?(this.removeLayer(),this.updateSource(t),this.updateLayer(t)):this.needsNewLayer(t)?this.updateLayer(t):this.updateStyle(t):(this.updateSource(t),this.updateLayer(t)),this.visible=u(t)},l.needsNewImage=function(t){return this.subplot.map.getSource(this.idSource)&&"image"===this.sourceType&&"image"===t.sourcetype&&(this.source!==t.source||JSON.stringify(this.coordinates)!==JSON.stringify(t.coordinates))},l.needsNewSource=function(t){return this.sourceType!==t.sourcetype||JSON.stringify(this.source)!==JSON.stringify(t.source)||this.layerType!==t.type},l.needsNewLayer=function(t){return this.layerType!==t.type||this.below!==this.subplot.belowLookup["layout-"+this.index]},l.lookupBelow=function(){return this.subplot.belowLookup["layout-"+this.index]},l.updateImage=function(t){this.subplot.map.getSource(this.idSource).updateImage({url:t.source,coordinates:t.coordinates});var e=this.findFollowingMapboxLayerId(this.lookupBelow());null!==e&&this.subplot.map.moveLayer(this.idLayer,e)},l.updateSource=function(t){var e=this.subplot.map;if(e.getSource(this.idSource)&&e.removeSource(this.idSource),this.sourceType=t.sourcetype,this.source=t.source,u(t)){var r=function(t){var e,r=t.sourcetype,n=t.source,a={type:r};return"geojson"===r?e="data":"vector"===r?e="string"==typeof n?"url":"tiles":"raster"===r?(e="tiles",a.tileSize=256):"image"===r&&(e="url",a.coordinates=t.coordinates),a[e]=n,t.sourceattribution&&(a.attribution=i(t.sourceattribution)),a}(t);e.addSource(this.idSource,r)}},l.findFollowingMapboxLayerId=function(t){if("traces"===t)for(var e=this.subplot.getMapLayers(),r=0;r1)for(r=0;r-1&&g(e.originalEvent,n,[r.xaxis],[r.yaxis],r.id,t),i.indexOf("event")>-1&&u.click(n,e.originalEvent)}}},b.updateFx=function(t){var e=this,r=e.map,n=e.gd;if(!e.isStatic){var a,o=t.dragmode;a=function(t,r){r.isRect?(t.range={})[e.id]=[u([r.xmin,r.ymin]),u([r.xmax,r.ymax])]:(t.lassoPoints={})[e.id]=r.map(u)};var s=e.dragOptions;e.dragOptions=i.extendDeep(s||{},{dragmode:t.dragmode,element:e.div,gd:n,plotinfo:{id:e.id,domain:t[e.id].domain,xaxis:e.xaxis,yaxis:e.yaxis,fillRangeItems:a},xaxes:[e.xaxis],yaxes:[e.yaxis],subplot:e.id}),r.off("click",e.onClickInPanHandler),h(o)||f(o)?(r.dragPan.disable(),r.on("zoomstart",e.clearOutline),e.dragOptions.prepFn=function(t,r,n){p(t,r,n,e.dragOptions,o)},l.init(e.dragOptions)):(r.dragPan.enable(),r.off("zoomstart",e.clearOutline),e.div.onmousedown=null,e.div.ontouchstart=null,e.div.removeEventListener("touchstart",e.div._ontouchstart),e.onClickInPanHandler=e.onClickInPanFn(e.dragOptions),r.on("click",e.onClickInPanHandler))}function u(t){var r=e.map.unproject(t);return[r.lng,r.lat]}},b.updateFramework=function(t){var e=t[this.id].domain,r=t._size,n=this.div.style;n.width=r.w*(e.x[1]-e.x[0])+"px",n.height=r.h*(e.y[1]-e.y[0])+"px",n.left=r.l+e.x[0]*r.w+"px",n.top=r.t+(1-e.y[1])*r.h+"px",this.xaxis._offset=r.l+e.x[0]*r.w,this.xaxis._length=r.w*(e.x[1]-e.x[0]),this.yaxis._offset=r.t+(1-e.y[1])*r.h,this.yaxis._length=r.h*(e.y[1]-e.y[0])},b.updateLayers=function(t){var e,r=t[this.id].layers,n=this.layerList;if(r.length!==n.length){for(e=0;e=e.width-20?(a["text-anchor"]="start",a.x=5):(a["text-anchor"]="end",a.x=e._paper.attr("width")-7),r.attr(a);var o=r.select(".js-link-to-tool"),s=r.select(".js-link-spacer"),l=r.select(".js-sourcelinks");t._context.showSources&&t._context.showSources(t),t._context.showLink&&function(t,e){e.text("");var r=e.append("a").attr({"xlink:xlink:href":"#",class:"link--impt link--embedview","font-weight":"bold"}).text(t._context.linkText+" "+String.fromCharCode(187));if(t._context.sendData)r.on("click",(function(){_.sendDataToCloud(t)}));else{var n=window.location.pathname.split("/"),i=window.location.search;r.attr({"xlink:xlink:show":"new","xlink:xlink:href":"/"+n[2].split(".")[0]+"/"+n[1]+i})}}(t,o),s.text(o.text()&&l.text()?" - ":"")}},_.sendDataToCloud=function(t){var e=(window.PLOTLYENV||{}).BASE_URL||t._context.plotlyServerURL;if(e){t.emit("plotly_beforeexport");var r=n.select(t).append("div").attr("id","hiddenform").style("display","none"),i=r.append("form").attr({action:e+"/external",method:"post",target:"_blank"});return i.append("input").attr({type:"text",name:"data"}).node().value=_.graphJson(t,!1,"keepdata"),i.node().submit(),r.remove(),t.emit("plotly_afterexport"),!1}};var k=["days","shortDays","months","shortMonths","periods","dateTime","date","time","decimal","thousands","grouping","currency"],A=["year","month","dayMonth","dayMonthYear"];function M(t,e){var r=t._context.locale;r||(r="en-US");var n=!1,i={};function a(t){for(var r=!0,a=0;a1&&D.length>1){for(s.getComponentMethod("grid","sizeDefaults")(u,l),o=0;o15&&D.length>15&&0===l.shapes.length&&0===l.images.length,_.linkSubplots(h,l,f,n),_.cleanPlot(h,l,f,n);var N=!(!n._has||!n._has("gl2d")),j=!(!l._has||!l._has("gl2d")),U=!(!n._has||!n._has("cartesian"))||N,V=!(!l._has||!l._has("cartesian"))||j;U&&!V?n._bgLayer.remove():V&&!U&&(l._shouldCreateBgLayer=!0),n._zoomlayer&&!t._dragging&&d({_fullLayout:n}),function(t,e){var r,n=[];e.meta&&(r=e._meta={meta:e.meta,layout:{meta:e.meta}});for(var i=0;i0){var f=1-2*s;n=Math.round(f*n),i=Math.round(f*i)}}var h=_.layoutAttributes.width.min,p=_.layoutAttributes.height.min;n1,v=!e.height&&Math.abs(r.height-i)>1;(v||d)&&(d&&(r.width=n),v&&(r.height=i)),t._initialAutoSize||(t._initialAutoSize={width:n,height:i}),_.sanitizeMargins(r)},_.supplyLayoutModuleDefaults=function(t,e,r,n){var i,a,o,l=s.componentsRegistry,u=e._basePlotModules,f=s.subplotsRegistry.cartesian;for(i in l)(o=l[i]).includeBasePlot&&o.includeBasePlot(t,e);for(var h in u.length||u.push(f),e._has("cartesian")&&(s.getComponentMethod("grid","contentDefaults")(t,e),f.finalizeSubplots(t,e)),e._subplots)e._subplots[h].sort(c.subplotSort);for(a=0;a1&&(r.l/=y,r.r/=y)}if(p){var m=(r.t+r.b)/p;m>1&&(r.t/=m,r.b/=m)}var x=void 0!==r.xl?r.xl:r.x,b=void 0!==r.xr?r.xr:r.x,w=void 0!==r.yt?r.yt:r.y,T=void 0!==r.yb?r.yb:r.y;d[e]={l:{val:x,size:r.l+g},r:{val:b,size:r.r+g},b:{val:T,size:r.b+g},t:{val:w,size:r.t+g}},v[e]=1}else delete d[e],delete v[e];if(!n._replotting)return _.doAutoMargin(t)}},_.doAutoMargin=function(t){var e=t._fullLayout,r=e.width,n=e.height;e._size||(e._size={}),P(e);var i=e._size,a=e.margin,l={t:0,b:0,l:0,r:0},u=c.extendFlat({},i),f=a.l,h=a.r,d=a.t,v=a.b,g=e._pushmargin,y=e._pushmarginIds,m=e.minreducedwidth,x=e.minreducedheight;if(!1!==a.autoexpand){for(var b in g)y[b]||delete g[b];var w=t._fullLayout._reservedMargin;for(var T in w)for(var k in w[T]){var A=w[T][k];l[k]=Math.max(l[k],A)}for(var M in g.base={l:{val:0,size:f},r:{val:1,size:h},t:{val:1,size:d},b:{val:0,size:v}},l){var S=0;for(var E in g)"base"!==E&&o(g[E][M].size)&&(S=g[E][M].size>S?g[E][M].size:S);var L=Math.max(0,a[M]-S);l[M]=Math.max(0,l[M]-L)}for(var C in g){var O=g[C].l||{},I=g[C].b||{},D=O.val,z=O.size,R=I.val,F=I.size,B=r-l.r-l.l,N=n-l.t-l.b;for(var j in g){if(o(z)&&g[j].r){var U=g[j].r.val,V=g[j].r.size;if(U>D){var H=(z*U+(V-B)*D)/(U-D),q=(V*(1-D)+(z-B)*(1-U))/(U-D);H+q>f+h&&(f=H,h=q)}}if(o(F)&&g[j].t){var G=g[j].t.val,Z=g[j].t.size;if(G>R){var Y=(F*G+(Z-N)*R)/(G-R),W=(Z*(1-R)+(F-N)*(1-G))/(G-R);Y+W>v+d&&(v=Y,d=W)}}}}}var X=c.constrain(r-a.l-a.r,2,m),J=c.constrain(n-a.t-a.b,2,x),K=Math.max(0,r-X),$=Math.max(0,n-J);if(K){var Q=(f+h)/K;Q>1&&(f/=Q,h/=Q)}if($){var tt=(v+d)/$;tt>1&&(v/=tt,d/=tt)}if(i.l=Math.round(f)+l.l,i.r=Math.round(h)+l.r,i.t=Math.round(d)+l.t,i.b=Math.round(v)+l.b,i.p=Math.round(a.pad),i.w=Math.round(r)-i.l-i.r,i.h=Math.round(n)-i.t-i.b,!e._replotting&&(_.didMarginChange(u,i)||function(t){if("_redrawFromAutoMarginCount"in t._fullLayout)return!1;var e=p.list(t,"",!0);for(var r in e)if(e[r].autoshift||e[r].shift)return!0;return!1}(t))){"_redrawFromAutoMarginCount"in e?e._redrawFromAutoMarginCount++:e._redrawFromAutoMarginCount=1;var et=3*(1+Object.keys(y).length);if(e._redrawFromAutoMarginCount0&&(t._transitioningWithDuration=!0),t._transitionData._interruptCallbacks.push((function(){n=!0})),r.redraw&&t._transitionData._interruptCallbacks.push((function(){return s.call("redraw",t)})),t._transitionData._interruptCallbacks.push((function(){t.emit("plotly_transitioninterrupted",[])}));var a=0,o=0;function l(){return a++,function(){var e;o++,n||o!==a||(e=i,t._transitionData&&(function(t){if(t)for(;t.length;)t.shift()}(t._transitionData._interruptCallbacks),Promise.resolve().then((function(){if(r.redraw)return s.call("redraw",t)})).then((function(){t._transitioning=!1,t._transitioningWithDuration=!1,t.emit("plotly_transitioned",[])})).then(e)))}}r.runFn(l),setTimeout(l())}))}],a=c.syncOrAsync(i,t);return a&&a.then||(a=Promise.resolve()),a.then((function(){return t}))}_.didMarginChange=function(t,e){for(var r=0;r1)return!0}return!1},_.graphJson=function(t,e,r,n,i,a){(i&&e&&!t._fullData||i&&!e&&!t._fullLayout)&&_.supplyDefaults(t);var o=i?t._fullData:t.data,s=i?t._fullLayout:t.layout,l=(t._transitionData||{})._frames;function u(t,e){if("function"==typeof t)return e?"_function_":null;if(c.isPlainObject(t)){var n,i={};return Object.keys(t).sort().forEach((function(a){if(-1===["_","["].indexOf(a.charAt(0)))if("function"!=typeof t[a]){if("keepdata"===r){if("src"===a.substr(a.length-3))return}else if("keepstream"===r){if("string"==typeof(n=t[a+"src"])&&n.indexOf(":")>0&&!c.isPlainObject(t.stream))return}else if("keepall"!==r&&"string"==typeof(n=t[a+"src"])&&n.indexOf(":")>0)return;i[a]=u(t[a],e)}else e&&(i[a]="_function")})),i}return Array.isArray(t)?t.map((function(t){return u(t,e)})):c.isTypedArray(t)?c.simpleMap(t,c.identity):c.isJSDate(t)?c.ms2DateTimeLocal(+t):t}var f={data:(o||[]).map((function(t){var r=u(t);return e&&delete r.fit,r}))};if(!e&&(f.layout=u(s),i)){var h=s._size;f.layout.computed={margin:{b:h.b,l:h.l,r:h.r,t:h.t}}}return l&&(f.frames=u(l)),a&&(f.config=u(t._context,!0)),"object"===n?f:JSON.stringify(f)},_.modifyFrames=function(t,e){var r,n,i,a=t._transitionData._frames,o=t._transitionData._frameHash;for(r=0;r=0;a--)if(s[a].enabled){r._indexToPoints=s[a]._indexToPoints;break}n&&n.calc&&(o=n.calc(t,r))}Array.isArray(o)&&o[0]||(o=[{x:h,y:h}]),o[0].t||(o[0].t={}),o[0].trace=r,d[e]=o}}for(z(o,u,f),i=0;i1e-10?t:0}function h(t,e,r){e=e||0,r=r||0;for(var n=t.length,i=new Array(n),a=0;a0?r:1/0})),i=n.mod(r+1,e.length);return[e[r],e[i]]},findIntersectionXY:u,findXYatLength:function(t,e,r,n){var i=-e*r,a=e*e+1,o=2*(e*i-r),s=i*i+r*r-t*t,l=Math.sqrt(o*o-4*a*s),u=(-o+l)/(2*a),c=(-o-l)/(2*a);return[[u,e*u+i+n],[c,e*c+i+n]]},clampTiny:f,pathPolygon:function(t,e,r,n,i,a){return"M"+h(c(t,e,r,n),i,a).join("L")},pathPolygonAnnulus:function(t,e,r,n,i,a,o){var s,l;t=90||i>90&&a>=450?1:s<=0&&u<=0?0:Math.max(s,u),[i<=180&&a>=180||i>180&&a>=540?-1:o>=0&&l>=0?0:Math.min(o,l),i<=270&&a>=270||i>270&&a>=630?-1:s>=0&&u>=0?0:Math.min(s,u),a>=360?1:o<=0&&l<=0?0:Math.max(o,l),e]}(d),_=b[2]-b[0],w=b[3]-b[1],T=p/h,k=Math.abs(w/_);T>k?(v=h,x=(p-(g=h*k))/i.h/2,y=[s[0],s[1]],m=[f[0]+x,f[1]-x]):(g=p,x=(h-(v=p/k))/i.w/2,y=[s[0]+x,s[1]-x],m=[f[0],f[1]]),r.xLength2=v,r.yLength2=g,r.xDomain2=y,r.yDomain2=m;var A,M=r.xOffset2=i.l+i.w*y[0],S=r.yOffset2=i.t+i.h*(1-m[1]),E=r.radius=v/_,L=r.innerRadius=r.getHole(e)*E,C=r.cx=M-E*b[0],P=r.cy=S+E*b[3],O=r.cxx=C-M,I=r.cyy=P-S,D=a.side;"counterclockwise"===D?(A=D,D="top"):"clockwise"===D&&(A=D,D="bottom"),r.radialAxis=r.mockAxis(t,e,a,{_id:"x",side:D,_trueSide:A,domain:[L/i.w,E/i.w]}),r.angularAxis=r.mockAxis(t,e,o,{side:"right",domain:[0,Math.PI],autorange:!1}),r.doAutoRange(t,e),r.updateAngularAxis(t,e),r.updateRadialAxis(t,e),r.updateRadialAxisTitle(t,e),r.xaxis=r.mockCartesianAxis(t,e,{_id:"x",domain:y}),r.yaxis=r.mockCartesianAxis(t,e,{_id:"y",domain:m});var F=r.pathSubplot();r.clipPaths.forTraces.select("path").attr("d",F).attr("transform",l(O,I)),n.frontplot.attr("transform",l(M,S)).call(c.setClipUrl,r._hasClipOnAxisFalse?null:r.clipIds.forTraces,r.gd),n.bg.attr("d",F).attr("transform",l(C,P)).call(u.fill,e.bgcolor)},N.mockAxis=function(t,e,r,n){var i=o.extendFlat({},r,n);return d(i,e,t),i},N.mockCartesianAxis=function(t,e,r){var n=this,i=n.isSmith,a=r._id,s=o.extendFlat({type:"linear"},r);p(s,t);var l={x:[0,2],y:[1,3]};return s.setRange=function(){var t=n.sectorBBox,r=l[a],i=n.radialAxis._rl,o=(i[1]-i[0])/(1-n.getHole(e));s.range=[t[r[0]]*o,t[r[1]]*o]},s.isPtWithinRange="x"!==a||i?function(){return!0}:function(t){return n.isPtInside(t)},s.setRange(),s.setScale(),s},N.doAutoRange=function(t,e){var r=this,n=r.gd,i=r.radialAxis,a=r.getRadial(e);v(n,i);var o=i.range;a.range=o.slice(),a._input.range=o.slice(),i._rl=[i.r2l(o[0],null,"gregorian"),i.r2l(o[1],null,"gregorian")]},N.updateRadialAxis=function(t,e){var r=this,n=r.gd,i=r.layers,a=r.radius,c=r.innerRadius,f=r.cx,p=r.cy,d=r.getRadial(e),v=z(r.getSector(e)[0],360),g=r.radialAxis,y=c90&&v<=270&&(g.tickangle=180);var x=m?function(t){var e=I(r,C([t.x,0]));return l(e[0]-f,e[1]-p)}:function(t){return l(g.l2p(t.x)+c,0)},b=m?function(t){return O(r,t.x,-1/0,1/0)}:function(t){return r.pathArc(g.r2p(t.x)+c)},_=j(d);if(r.radialTickLayout!==_&&(i["radial-axis"].selectAll(".xtick").remove(),r.radialTickLayout=_),y){g.setScale();var w=0,T=m?(g.tickvals||[]).filter((function(t){return t>=0})).map((function(t){return h.tickText(g,t,!0,!1)})):h.calcTicks(g),k=m?T:h.clipEnds(g,T),A=h.getTickSigns(g)[2];m&&(("top"===g.ticks&&"bottom"===g.side||"bottom"===g.ticks&&"top"===g.side)&&(A=-A),"top"===g.ticks&&"top"===g.side&&(w=-g.ticklen),"bottom"===g.ticks&&"bottom"===g.side&&(w=g.ticklen)),h.drawTicks(n,g,{vals:T,layer:i["radial-axis"],path:h.makeTickPath(g,0,A),transFn:x,crisp:!1}),h.drawGrid(n,g,{vals:k,layer:i["radial-grid"],path:b,transFn:o.noop,crisp:!1}),h.drawLabels(n,g,{vals:T,layer:i["radial-axis"],transFn:x,labelFns:h.makeLabelFns(g,w)})}var M=r.radialAxisAngle=r.vangles?F(U(R(d.angle),r.vangles)):d.angle,S=l(f,p),E=S+s(-M);V(i["radial-axis"],y&&(d.showticklabels||d.ticks),{transform:E}),V(i["radial-grid"],y&&d.showgrid,{transform:m?"":S}),V(i["radial-line"].select("line"),y&&d.showline,{x1:m?-a:c,y1:0,x2:a,y2:0,transform:E}).attr("stroke-width",d.linewidth).call(u.stroke,d.linecolor)},N.updateRadialAxisTitle=function(t,e,r){if(!this.isSmith){var n=this,i=n.gd,a=n.radius,o=n.cx,s=n.cy,l=n.getRadial(e),u=n.id+"title",f=0;if(l.title){var h=c.bBox(n.layers["radial-axis"].node()).height,p=l.title.font.size,d=l.side;f="top"===d?p:"counterclockwise"===d?-(h+.4*p):h+.8*p}var v=void 0!==r?r:n.radialAxisAngle,g=R(v),y=Math.cos(g),m=Math.sin(g),b=o+a/2*y+f*m,_=s-a/2*m+f*y;n.layers["radial-axis-title"]=x.draw(i,u,{propContainer:l,propName:n.id+".radialaxis.title",placeholder:D(i,"Click to enter radial axis title"),attributes:{x:b,y:_,"text-anchor":"middle"},transform:{rotate:-v}})}},N.updateAngularAxis=function(t,e){var r=this,n=r.gd,i=r.layers,a=r.radius,c=r.innerRadius,f=r.cx,p=r.cy,d=r.getAngular(e),v=r.angularAxis,g=r.isSmith;g||(r.fillViewInitialKey("angularaxis.rotation",d.rotation),v.setGeometry(),v.setScale());var y=g?function(t){var e=I(r,C([0,t.x]));return Math.atan2(e[0]-f,e[1]-p)-Math.PI/2}:function(t){return v.t2g(t.x)};"linear"===v.type&&"radians"===v.thetaunit&&(v.tick0=F(v.tick0),v.dtick=F(v.dtick));var m=function(t){return l(f+a*Math.cos(t),p-a*Math.sin(t))},x=g?function(t){var e=I(r,C([0,t.x]));return l(e[0],e[1])}:function(t){return m(y(t))},b=g?function(t){var e=I(r,C([0,t.x])),n=Math.atan2(e[0]-f,e[1]-p)-Math.PI/2;return l(e[0],e[1])+s(-F(n))}:function(t){var e=y(t);return m(e)+s(-F(e))},_=g?function(t){return P(r,t.x,0,1/0)}:function(t){var e=y(t),r=Math.cos(e),n=Math.sin(e);return"M"+[f+c*r,p-c*n]+"L"+[f+a*r,p-a*n]},w=h.makeLabelFns(v,0).labelStandoff,T={xFn:function(t){var e=y(t);return Math.cos(e)*w},yFn:function(t){var e=y(t),r=Math.sin(e)>0?.2:1;return-Math.sin(e)*(w+t.fontSize*r)+Math.abs(Math.cos(e))*(t.fontSize*M)},anchorFn:function(t){var e=y(t),r=Math.cos(e);return Math.abs(r)<.1?"middle":r>0?"start":"end"},heightFn:function(t,e,r){var n=y(t);return-.5*(1+Math.sin(n))*r}},k=j(d);r.angularTickLayout!==k&&(i["angular-axis"].selectAll("."+v._id+"tick").remove(),r.angularTickLayout=k);var A,S=g?[1/0].concat(v.tickvals||[]).map((function(t){return h.tickText(v,t,!0,!1)})):h.calcTicks(v);if(g&&(S[0].text="∞",S[0].fontSize*=1.75),"linear"===e.gridshape?(A=S.map(y),o.angleDelta(A[0],A[1])<0&&(A=A.slice().reverse())):A=null,r.vangles=A,"category"===v.type&&(S=S.filter((function(t){return o.isAngleInsideSector(y(t),r.sectorInRad)}))),v.visible){var E="inside"===v.ticks?-1:1,L=(v.linewidth||1)/2;h.drawTicks(n,v,{vals:S,layer:i["angular-axis"],path:"M"+E*L+",0h"+E*v.ticklen,transFn:b,crisp:!1}),h.drawGrid(n,v,{vals:S,layer:i["angular-grid"],path:_,transFn:o.noop,crisp:!1}),h.drawLabels(n,v,{vals:S,layer:i["angular-axis"],repositionOnUpdate:!0,transFn:x,labelFns:T})}V(i["angular-line"].select("path"),d.showline,{d:r.pathSubplot(),transform:l(f,p)}).attr("stroke-width",d.linewidth).call(u.stroke,d.linecolor)},N.updateFx=function(t,e){this.gd._context.staticPlot||(!this.isSmith&&(this.updateAngularDrag(t),this.updateRadialDrag(t,e,0),this.updateRadialDrag(t,e,1)),this.updateHoverAndMainDrag(t))},N.updateHoverAndMainDrag=function(t){var e,r,s=this,u=s.isSmith,c=s.gd,f=s.layers,h=t._zoomlayer,p=S.MINZOOM,d=S.OFFEDGE,v=s.radius,x=s.innerRadius,T=s.cx,k=s.cy,A=s.cxx,M=s.cyy,L=s.sectorInRad,C=s.vangles,P=s.radialAxis,O=E.clampTiny,I=E.findXYatLength,D=E.findEnclosingVertexAngles,z=S.cornerHalfWidth,R=S.cornerLen/2,F=g.makeDragger(f,"path","maindrag",!1===t.dragmode?"none":"crosshair");n.select(F).attr("d",s.pathSubplot()).attr("transform",l(T,k)),F.onmousemove=function(t){m.hover(c,t,s.id),c._fullLayout._lasthover=F,c._fullLayout._hoversubplot=s.id},F.onmouseout=function(t){c._dragging||y.unhover(c,t)};var B,N,j,U,V,H,q,G,Z,Y={element:F,gd:c,subplot:s.id,plotinfo:{id:s.id,xaxis:s.xaxis,yaxis:s.yaxis},xaxes:[s.xaxis],yaxes:[s.yaxis]};function W(t,e){return Math.sqrt(t*t+e*e)}function X(t,e){return W(t-A,e-M)}function J(t,e){return Math.atan2(M-e,t-A)}function K(t,e){return[t*Math.cos(e),t*Math.sin(-e)]}function $(t,e){if(0===t)return s.pathSector(2*z);var r=R/t,n=e-r,i=e+r,a=Math.max(0,Math.min(t,v)),o=a-z,l=a+z;return"M"+K(o,n)+"A"+[o,o]+" 0,0,0 "+K(o,i)+"L"+K(l,i)+"A"+[l,l]+" 0,0,1 "+K(l,n)+"Z"}function Q(t,e,r){if(0===t)return s.pathSector(2*z);var n,i,a=K(t,e),o=K(t,r),l=O((a[0]+o[0])/2),u=O((a[1]+o[1])/2);if(l&&u){var c=u/l,f=-1/c,h=I(z,c,l,u);n=I(R,f,h[0][0],h[0][1]),i=I(R,f,h[1][0],h[1][1])}else{var p,d;u?(p=R,d=z):(p=z,d=R),n=[[l-p,u-d],[l+p,u-d]],i=[[l-p,u+d],[l+p,u+d]]}return"M"+n.join("L")+"L"+i.reverse().join("L")+"Z"}function tt(t,e){return e=Math.max(Math.min(e,v),x),tp?(t-1&&1===t&&_(e,c,[s.xaxis],[s.yaxis],s.id,Y),r.indexOf("event")>-1&&m.click(c,e,s.id)}Y.prepFn=function(t,n,a){var l=c._fullLayout.dragmode,f=F.getBoundingClientRect();c._fullLayout._calcInverseTransform(c);var p=c._fullLayout._invTransform;e=c._fullLayout._invScaleX,r=c._fullLayout._invScaleY;var d=o.apply3DTransform(p)(n-f.left,a-f.top);if(B=d[0],N=d[1],C){var y=E.findPolygonOffset(v,L[0],L[1],C);B+=A+y[0],N+=M+y[1]}switch(l){case"zoom":Y.clickFn=st,u||(Y.moveFn=C?it:rt,Y.doneFn=at,function(){j=null,U=null,V=s.pathSubplot(),H=!1;var t=c._fullLayout[s.id];q=i(t.bgcolor).getLuminance(),(G=g.makeZoombox(h,q,T,k,V)).attr("fill-rule","evenodd"),Z=g.makeCorners(h,T,k),w(c)}());break;case"select":case"lasso":b(t,n,a,Y,l)}},y.init(Y)},N.updateRadialDrag=function(t,e,r){var i=this,u=i.gd,c=i.layers,f=i.radius,h=i.innerRadius,p=i.cx,d=i.cy,v=i.radialAxis,m=S.radialDragBoxSize,x=m/2;if(v.visible){var b,_,T,M=R(i.radialAxisAngle),E=v._rl,L=E[0],C=E[1],P=E[r],O=.75*(E[1]-E[0])/(1-i.getHole(e))/f;r?(b=p+(f+x)*Math.cos(M),_=d-(f+x)*Math.sin(M),T="radialdrag"):(b=p+(h-x)*Math.cos(M),_=d-(h-x)*Math.sin(M),T="radialdrag-inner");var I,D,z,B=g.makeRectDragger(c,T,"crosshair",-x,-x,m,m),N={element:B,gd:u};!1===t.dragmode&&(N.dragmode=!1),V(n.select(B),v.visible&&h0==(r?z>L:zn?function(t){return t<=0}:function(t){return t>=0};t.c2g=function(r){var n=t.c2l(r)-e;return(s(n)?n:0)+o},t.g2c=function(r){return t.l2c(r+e-o)},t.g2p=function(t){return t*a},t.c2p=function(e){return t.g2p(t.c2g(e))}}}(t,e);break;case"angularaxis":!function(t,e){var r=t.type;if("linear"===r){var i=t.d2c,s=t.c2d;t.d2c=function(t,e){return function(t,e){return"degrees"===e?a(t):t}(i(t),e)},t.c2d=function(t,e){return s(function(t,e){return"degrees"===e?o(t):t}(t,e))}}t.makeCalcdata=function(e,i){var a,o,s=e[i],l=e._length,u=function(r){return t.d2c(r,e.thetaunit)};if(s){if(n.isTypedArray(s)&&"linear"===r){if(l===s.length)return s;if(s.subarray)return s.subarray(0,l)}for(a=new Array(l),o=0;o0?1:0}function r(t){var e=t[0],r=t[1];if(!isFinite(e)||!isFinite(r))return[1,0];var n=(e+1)*(e+1)+r*r;return[(e*e+r*r-1)/n,2*r/n]}function n(t,e){var r=e[0],n=e[1];return[r*t.radius+t.cx,-n*t.radius+t.cy]}function i(t,e){return e*t.radius}t.exports={smith:r,reactanceArc:function(t,e,a,o){var s=n(t,r([a,e])),l=s[0],u=s[1],c=n(t,r([o,e])),f=c[0],h=c[1];if(0===e)return["M"+l+","+u,"L"+f+","+h].join(" ");var p=i(t,1/Math.abs(e));return["M"+l+","+u,"A"+p+","+p+" 0 0,"+(e<0?1:0)+" "+f+","+h].join(" ")},resistanceArc:function(t,a,o,s){var l=i(t,1/(a+1)),u=n(t,r([a,o])),c=u[0],f=u[1],h=n(t,r([a,s])),p=h[0],d=h[1];if(e(o)!==e(s)){var v=n(t,r([a,0]));return["M"+c+","+f,"A"+l+","+l+" 0 0,"+(00){for(var n=[],i=0;i=c&&(h.min=0,d.min=0,g.min=0,t.aaxis&&delete t.aaxis.min,t.baxis&&delete t.baxis.min,t.caxis&&delete t.caxis.min)}function v(t,e,r,n){var i=h[e._name];function o(r,n){return a.coerce(t,e,i,r,n)}o("uirevision",n.uirevision),e.type="linear";var p=o("color"),d=p!==i.color.dflt?p:r.font.color,v=e._name.charAt(0).toUpperCase(),g="Component "+v,y=o("title.text",g);e._hovertitle=y===g?y:v,a.coerceFont(o,"title.font",{family:r.font.family,size:a.bigFont(r.font.size),color:d}),o("min"),c(t,e,o,"linear"),l(t,e,o,"linear"),s(t,e,o,"linear"),u(t,e,o,{outerTicks:!0}),o("showticklabels")&&(a.coerceFont(o,"tickfont",{family:r.font.family,size:r.font.size,color:d}),o("tickangle"),o("tickformat")),f(t,e,o,{dfltColor:p,bgColor:r.bgColor,blend:60,showLine:!0,showGrid:!0,noZeroLine:!0,attributes:i}),o("hoverformat"),o("layer")}t.exports=function(t,e,r){o(t,e,r,{type:"ternary",attributes:h,handleDefaults:d,font:e.font,paper_bgcolor:e.paper_bgcolor})}},64380:function(t,e,r){"use strict";var n=r(39898),i=r(84267),a=r(73972),o=r(71828),s=o.strTranslate,l=o._,u=r(7901),c=r(91424),f=r(21994),h=r(1426).extendFlat,p=r(74875),d=r(89298),v=r(28569),g=r(30211),y=r(64505),m=y.freeMode,x=y.rectMode,b=r(92998),_=r(47322).prepSelect,w=r(47322).selectOnClick,T=r(47322).clearOutline,k=r(47322).clearSelectionsCache,A=r(85555);function M(t,e){this.id=t.id,this.graphDiv=t.graphDiv,this.init(e),this.makeFramework(e),this.aTickLayout=null,this.bTickLayout=null,this.cTickLayout=null}t.exports=M;var S=M.prototype;S.init=function(t){this.container=t._ternarylayer,this.defs=t._defs,this.layoutId=t._uid,this.traceHash={},this.layers={}},S.plot=function(t,e){var r=this,n=e[r.id],i=e._size;r._hasClipOnAxisFalse=!1;for(var a=0;aE*b?i=(a=b)*E:a=(i=x)/E,o=y*i/x,l=m*a/b,r=e.l+e.w*v-i/2,n=e.t+e.h*(1-g)-a/2,p.x0=r,p.y0=n,p.w=i,p.h=a,p.sum=_,p.xaxis={type:"linear",range:[w+2*k-_,_-w-2*T],domain:[v-o/2,v+o/2],_id:"x"},f(p.xaxis,p.graphDiv._fullLayout),p.xaxis.setScale(),p.xaxis.isPtWithinRange=function(t){return t.a>=p.aaxis.range[0]&&t.a<=p.aaxis.range[1]&&t.b>=p.baxis.range[1]&&t.b<=p.baxis.range[0]&&t.c>=p.caxis.range[1]&&t.c<=p.caxis.range[0]},p.yaxis={type:"linear",range:[w,_-T-k],domain:[g-l/2,g+l/2],_id:"y"},f(p.yaxis,p.graphDiv._fullLayout),p.yaxis.setScale(),p.yaxis.isPtWithinRange=function(){return!0};var A=p.yaxis.domain[0],M=p.aaxis=h({},t.aaxis,{range:[w,_-T-k],side:"left",tickangle:(+t.aaxis.tickangle||0)-30,domain:[A,A+l*E],anchor:"free",position:0,_id:"y",_length:i});f(M,p.graphDiv._fullLayout),M.setScale();var S=p.baxis=h({},t.baxis,{range:[_-w-k,T],side:"bottom",domain:p.xaxis.domain,anchor:"free",position:0,_id:"x",_length:i});f(S,p.graphDiv._fullLayout),S.setScale();var L=p.caxis=h({},t.caxis,{range:[_-w-T,k],side:"right",tickangle:(+t.caxis.tickangle||0)+30,domain:[A,A+l*E],anchor:"free",position:0,_id:"y",_length:i});f(L,p.graphDiv._fullLayout),L.setScale();var C="M"+r+","+(n+a)+"h"+i+"l-"+i/2+",-"+a+"Z";p.clipDef.select("path").attr("d",C),p.layers.plotbg.select("path").attr("d",C);var P="M0,"+a+"h"+i+"l-"+i/2+",-"+a+"Z";p.clipDefRelative.select("path").attr("d",P);var O=s(r,n);p.plotContainer.selectAll(".scatterlayer,.maplayer").attr("transform",O),p.clipDefRelative.select("path").attr("transform",null);var I=s(r-S._offset,n+a);p.layers.baxis.attr("transform",I),p.layers.bgrid.attr("transform",I);var D=s(r+i/2,n)+"rotate(30)"+s(0,-M._offset);p.layers.aaxis.attr("transform",D),p.layers.agrid.attr("transform",D);var z=s(r+i/2,n)+"rotate(-30)"+s(0,-L._offset);p.layers.caxis.attr("transform",z),p.layers.cgrid.attr("transform",z),p.drawAxes(!0),p.layers.aline.select("path").attr("d",M.showline?"M"+r+","+(n+a)+"l"+i/2+",-"+a:"M0,0").call(u.stroke,M.linecolor||"#000").style("stroke-width",(M.linewidth||0)+"px"),p.layers.bline.select("path").attr("d",S.showline?"M"+r+","+(n+a)+"h"+i:"M0,0").call(u.stroke,S.linecolor||"#000").style("stroke-width",(S.linewidth||0)+"px"),p.layers.cline.select("path").attr("d",L.showline?"M"+(r+i/2)+","+n+"l"+i/2+","+a:"M0,0").call(u.stroke,L.linecolor||"#000").style("stroke-width",(L.linewidth||0)+"px"),p.graphDiv._context.staticPlot||p.initInteractions(),c.setClipUrl(p.layers.frontplot,p._hasClipOnAxisFalse?null:p.clipId,p.graphDiv)},S.drawAxes=function(t){var e=this,r=e.graphDiv,n=e.id.substr(7)+"title",i=e.layers,a=e.aaxis,o=e.baxis,s=e.caxis;if(e.drawAx(a),e.drawAx(o),e.drawAx(s),t){var u=Math.max(a.showticklabels?a.tickfont.size/2:0,(s.showticklabels?.75*s.tickfont.size:0)+("outside"===s.ticks?.87*s.ticklen:0)),c=(o.showticklabels?o.tickfont.size:0)+("outside"===o.ticks?o.ticklen:0)+3;i["a-title"]=b.draw(r,"a"+n,{propContainer:a,propName:e.id+".aaxis.title",placeholder:l(r,"Click to enter Component A title"),attributes:{x:e.x0+e.w/2,y:e.y0-a.title.font.size/3-u,"text-anchor":"middle"}}),i["b-title"]=b.draw(r,"b"+n,{propContainer:o,propName:e.id+".baxis.title",placeholder:l(r,"Click to enter Component B title"),attributes:{x:e.x0-c,y:e.y0+e.h+.83*o.title.font.size+c,"text-anchor":"middle"}}),i["c-title"]=b.draw(r,"c"+n,{propContainer:s,propName:e.id+".caxis.title",placeholder:l(r,"Click to enter Component C title"),attributes:{x:e.x0+e.w+c,y:e.y0+e.h+.83*s.title.font.size+c,"text-anchor":"middle"}})}},S.drawAx=function(t){var e,r=this,n=r.graphDiv,i=t._name,a=i.charAt(0),s=t._id,l=r.layers[i],u=a+"tickLayout",c=(e=t).ticks+String(e.ticklen)+String(e.showticklabels);r[u]!==c&&(l.selectAll("."+s+"tick").remove(),r[u]=c),t.setScale();var f=d.calcTicks(t),h=d.clipEnds(t,f),p=d.makeTransTickFn(t),v=d.getTickSigns(t)[2],g=o.deg2rad(30),y=v*(t.linewidth||1)/2,m=v*t.ticklen,x=r.w,b=r.h,_="b"===a?"M0,"+y+"l"+Math.sin(g)*m+","+Math.cos(g)*m:"M"+y+",0l"+Math.cos(g)*m+","+-Math.sin(g)*m,w={a:"M0,0l"+b+",-"+x/2,b:"M0,0l-"+x/2+",-"+b,c:"M0,0l-"+b+","+x/2}[a];d.drawTicks(n,t,{vals:"inside"===t.ticks?h:f,layer:l,path:_,transFn:p,crisp:!1}),d.drawGrid(n,t,{vals:h,layer:r.layers[a+"grid"],path:w,transFn:p,crisp:!1}),d.drawLabels(n,t,{vals:f,layer:l,transFn:p,labelFns:d.makeLabelFns(t,0,30)})};var L=A.MINZOOM/2+.87,C="m-0.87,.5h"+L+"v3h-"+(L+5.2)+"l"+(L/2+2.6)+",-"+(.87*L+4.5)+"l2.6,1.5l-"+L/2+","+.87*L+"Z",P="m0.87,.5h-"+L+"v3h"+(L+5.2)+"l-"+(L/2+2.6)+",-"+(.87*L+4.5)+"l-2.6,1.5l"+L/2+","+.87*L+"Z",O="m0,1l"+L/2+","+.87*L+"l2.6,-1.5l-"+(L/2+2.6)+",-"+(.87*L+4.5)+"l-"+(L/2+2.6)+","+(.87*L+4.5)+"l2.6,1.5l"+L/2+",-"+.87*L+"Z",I=!0;function D(t){n.select(t).selectAll(".zoombox,.js-zoombox-backdrop,.js-zoombox-menu,.zoombox-corners").remove()}S.clearOutline=function(){k(this.dragOptions),T(this.dragOptions.gd)},S.initInteractions=function(){var t,e,r,n,f,h,p,d,y,b,T,k,M=this,S=M.layers.plotbg.select("path").node(),L=M.graphDiv,z=L._fullLayout._zoomlayer;function R(t){var e={};return e[M.id+".aaxis.min"]=t.a,e[M.id+".baxis.min"]=t.b,e[M.id+".caxis.min"]=t.c,e}function F(t,e){var r=L._fullLayout.clickmode;D(L),2===t&&(L.emit("plotly_doubleclick",null),a.call("_guiRelayout",L,R({a:0,b:0,c:0}))),r.indexOf("select")>-1&&1===t&&w(e,L,[M.xaxis],[M.yaxis],M.id,M.dragOptions),r.indexOf("event")>-1&&g.click(L,e,M.id)}function B(t,e){return 1-e/M.h}function N(t,e){return 1-(t+(M.h-e)/Math.sqrt(3))/M.w}function j(t,e){return(t-(M.h-e)/Math.sqrt(3))/M.w}function U(i,a){var o=r+i*t,s=n+a*e,l=Math.max(0,Math.min(1,B(0,n),B(0,s))),u=Math.max(0,Math.min(1,N(r,n),N(o,s))),c=Math.max(0,Math.min(1,j(r,n),j(o,s))),v=(l/2+c)*M.w,g=(1-l/2-u)*M.w,m=(v+g)/2,x=g-v,_=(1-l)*M.h,w=_-x/E;x.2?"rgba(0,0,0,0.4)":"rgba(255,255,255,0.3)").duration(200),k.transition().style("opacity",1).duration(200),b=!0),L.emit("plotly_relayouting",R(p))}function V(){D(L),p!==f&&(a.call("_guiRelayout",L,R(p)),I&&L.data&&L._context.showTips&&(o.notifier(l(L,"Double-click to zoom back out"),"long"),I=!1))}function H(t,e){var r=t/M.xaxis._m,n=e/M.yaxis._m,i=[(p={a:f.a-n,b:f.b+(r+n)/2,c:f.c-(r-n)/2}).a,p.b,p.c].sort(o.sorterAsc),a=i.indexOf(p.a),l=i.indexOf(p.b),u=i.indexOf(p.c);i[0]<0&&(i[1]+i[0]/2<0?(i[2]+=i[0]+i[1],i[0]=i[1]=0):(i[2]+=i[0]/2,i[1]+=i[0]/2,i[0]=0),p={a:i[a],b:i[l],c:i[u]},e=(f.a-p.a)*M.yaxis._m,t=(f.c-p.c-f.b+p.b)*M.xaxis._m);var h=s(M.x0+t,M.y0+e);M.plotContainer.selectAll(".scatterlayer,.maplayer").attr("transform",h);var d=s(-t,-e);M.clipDefRelative.select("path").attr("transform",d),M.aaxis.range=[p.a,M.sum-p.b-p.c],M.baxis.range=[M.sum-p.a-p.c,p.b],M.caxis.range=[M.sum-p.a-p.b,p.c],M.drawAxes(!1),M._hasClipOnAxisFalse&&M.plotContainer.select(".scatterlayer").selectAll(".trace").call(c.hideOutsideRangePoints,M),L.emit("plotly_relayouting",R(p))}function q(){a.call("_guiRelayout",L,R(p))}this.dragOptions={element:S,gd:L,plotinfo:{id:M.id,domain:L._fullLayout[M.id].domain,xaxis:M.xaxis,yaxis:M.yaxis},subplot:M.id,prepFn:function(a,l,c){M.dragOptions.xaxes=[M.xaxis],M.dragOptions.yaxes=[M.yaxis],t=L._fullLayout._invScaleX,e=L._fullLayout._invScaleY;var v=M.dragOptions.dragmode=L._fullLayout.dragmode;m(v)?M.dragOptions.minDrag=1:M.dragOptions.minDrag=void 0,"zoom"===v?(M.dragOptions.moveFn=U,M.dragOptions.clickFn=F,M.dragOptions.doneFn=V,function(t,e,a){var l=S.getBoundingClientRect();r=e-l.left,n=a-l.top,L._fullLayout._calcInverseTransform(L);var c=L._fullLayout._invTransform,v=o.apply3DTransform(c)(r,n);r=v[0],n=v[1],f={a:M.aaxis.range[0],b:M.baxis.range[1],c:M.caxis.range[1]},p=f,h=M.aaxis.range[1]-f.a,d=i(M.graphDiv._fullLayout[M.id].bgcolor).getLuminance(),y="M0,"+M.h+"L"+M.w/2+", 0L"+M.w+","+M.h+"Z",b=!1,T=z.append("path").attr("class","zoombox").attr("transform",s(M.x0,M.y0)).style({fill:d>.2?"rgba(0,0,0,0)":"rgba(255,255,255,0)","stroke-width":0}).attr("d",y),k=z.append("path").attr("class","zoombox-corners").attr("transform",s(M.x0,M.y0)).style({fill:u.background,stroke:u.defaultLine,"stroke-width":1,opacity:0}).attr("d","M0,0Z"),M.clearOutline(L)}(0,l,c)):"pan"===v?(M.dragOptions.moveFn=H,M.dragOptions.clickFn=F,M.dragOptions.doneFn=q,f={a:M.aaxis.range[0],b:M.baxis.range[1],c:M.caxis.range[1]},p=f,M.clearOutline(L)):(x(v)||m(v))&&_(a,l,c,M.dragOptions,v)}},S.onmousemove=function(t){g.hover(L,t,M.id),L._fullLayout._lasthover=S,L._fullLayout._hoversubplot=M.id},S.onmouseout=function(t){L._dragging||v.unhover(L,t)},v.init(this.dragOptions)}},73972:function(t,e,r){"use strict";var n=r(47769),i=r(64213),a=r(75138),o=r(41965),s=r(24401).addStyleRule,l=r(1426),u=r(9012),c=r(10820),f=l.extendFlat,h=l.extendDeepAll;function p(t){var r=t.name,i=t.categories,a=t.meta;if(e.modules[r])n.log("Type "+r+" already registered");else{e.subplotsRegistry[t.basePlotModule.name]||function(t){var r=t.name;if(e.subplotsRegistry[r])n.log("Plot type "+r+" already registered.");else for(var i in y(t),e.subplotsRegistry[r]=t,e.componentsRegistry)b(i,t.name)}(t.basePlotModule);for(var o={},l=0;l-1&&(f[p[r]].title={text:""});for(r=0;r")?"":e.html(t).text()}));return e.remove(),r}(w)).replace(/&(?!\w+;|\#[0-9]+;| \#x[0-9A-F]+;)/g,"&")).replace(c,"'"),i.isIE()&&(w=(w=(w=w.replace(/"/gi,"'")).replace(/(\('#)([^']*)('\))/gi,'("#$2")')).replace(/(\\')/gi,'"')),w}},75341:function(t,e,r){"use strict";var n=r(71828);t.exports=function(t,e){for(var r=0;rf+u||!n(c))}for(var p=0;pa))return e}return void 0!==r?r:t.dflt},e.coerceColor=function(t,e,r){return i(e).isValid()?e:void 0!==r?r:t.dflt},e.coerceEnumerated=function(t,e,r){return t.coerceNumber&&(e=+e),-1!==t.values.indexOf(e)?e:void 0!==r?r:t.dflt},e.getValue=function(t,e){var r;return Array.isArray(t)?e0?e+=r:c<0&&(e-=r)}return e}function D(t){var e=c,r=t.b,i=I(t);return n.inbox(r-e,i-e,_+(i-e)/(i-r)-1)}var z=t[f+"a"],R=t[h+"a"];v=Math.abs(z.r2c(z.range[1])-z.r2c(z.range[0]));var F=n.getDistanceFunction(i,p,d,(function(t){return(p(t)+d(t))/2}));if(n.getClosest(g,F,t),!1!==t.index&&g[t.index].p!==u){k||(L=function(t){return Math.min(A(t),t.p-m.bargroupwidth/2)},C=function(t){return Math.max(M(t),t.p+m.bargroupwidth/2)});var B=g[t.index],N=y.base?B.b+B.s:B.s;t[h+"0"]=t[h+"1"]=R.c2p(B[h],!0),t[h+"LabelVal"]=N;var j=m.extents[m.extents.round(B.p)];t[f+"0"]=z.c2p(x?L(B):j[0],!0),t[f+"1"]=z.c2p(x?C(B):j[1],!0);var U=void 0!==B.orig_p;return t[f+"LabelVal"]=U?B.orig_p:B.p,t.labelLabel=l(z,t[f+"LabelVal"],y[f+"hoverformat"]),t.valueLabel=l(R,t[h+"LabelVal"],y[h+"hoverformat"]),t.baseLabel=l(R,B.b,y[h+"hoverformat"]),t.spikeDistance=(function(t){var e=c,r=t.b,i=I(t);return n.inbox(r-e,i-e,w+(i-e)/(i-r)-1)}(B)+function(t){return P(A(t),M(t),w)}(B))/2,t[f+"Spike"]=z.c2p(B.p,!0),o(B,y,t),t.hovertemplate=y.hovertemplate,t}}function f(t,e){var r=e.mcc||t.marker.color,n=e.mlcc||t.marker.line.color,i=s(t,e);return a.opacity(r)?r:a.opacity(n)&&i?n:void 0}t.exports={hoverPoints:function(t,e,r,n,a){var o=c(t,e,r,n,a);if(o){var s=o.cd,l=s[0].trace,u=s[o.index];return o.color=f(l,u),i.getComponentMethod("errorbars","hoverInfo")(u,l,o),[o]}},hoverOnBars:c,getTraceColor:f}},60822:function(t,e,r){"use strict";t.exports={attributes:r(1486),layoutAttributes:r(43641),supplyDefaults:r(90769).supplyDefaults,crossTraceDefaults:r(90769).crossTraceDefaults,supplyLayoutDefaults:r(13957),calc:r(92290),crossTraceCalc:r(11661).crossTraceCalc,colorbar:r(4898),arraysToCalcdata:r(75341),plot:r(17295).plot,style:r(16688).style,styleOnSelect:r(16688).styleOnSelect,hoverPoints:r(95423).hoverPoints,eventData:r(58065),selectPoints:r(81974),moduleType:"trace",name:"bar",basePlotModule:r(93612),categories:["bar-like","cartesian","svg","bar","oriented","errorBarsOK","showLegend","zoomScale"],animatable:!0,meta:{}}},43641:function(t){"use strict";t.exports={barmode:{valType:"enumerated",values:["stack","group","overlay","relative"],dflt:"group",editType:"calc"},barnorm:{valType:"enumerated",values:["","fraction","percent"],dflt:"",editType:"calc"},bargap:{valType:"number",min:0,max:1,editType:"calc"},bargroupgap:{valType:"number",min:0,max:1,dflt:0,editType:"calc"}}},13957:function(t,e,r){"use strict";var n=r(73972),i=r(89298),a=r(71828),o=r(43641);t.exports=function(t,e,r){function s(r,n){return a.coerce(t,e,o,r,n)}for(var l=!1,u=!1,c=!1,f={},h=s("barmode"),p=0;p0}function S(t){return"auto"===t?0:t}function E(t,e){var r=Math.PI/180*e,n=Math.abs(Math.sin(r)),i=Math.abs(Math.cos(r));return{x:t.width*i+t.height*n,y:t.width*n+t.height*i}}function L(t,e,r,n,i,a){var o=!!a.isHorizontal,s=!!a.constrained,l=a.angle||0,u=a.anchor||"end",c="end"===u,f="start"===u,h=((a.leftToRight||0)+1)/2,p=1-h,d=i.width,v=i.height,g=Math.abs(e-t),y=Math.abs(n-r),m=g>2*_&&y>2*_?_:0;g-=2*m,y-=2*m;var x=S(l);"auto"!==l||d<=g&&v<=y||!(d>g||v>y)||(d>y||v>g)&&d.01?G:function(t,e,r){return r&&t===e?t:Math.abs(t-e)>=2?G(t):t>e?Math.ceil(t):Math.floor(t)};N=Z(N,j,R),j=Z(j,N,R),U=Z(U,V,!R),V=Z(V,U,!R)}var Y=A(a.ensureSingle(I,"path"),P,g,y);if(Y.style("vector-effect",O?"none":"non-scaling-stroke").attr("d",isNaN((j-N)*(V-U))||H&&t._context.staticPlot?"M0,0Z":"M"+N+","+U+"V"+V+"H"+j+"V"+U+"Z").call(l.setClipUrl,e.layerClipId,t),!P.uniformtext.mode&&F){var W=l.makePointStyleFns(f);l.singlePointStyle(u,Y,f,W,t)}!function(t,e,r,n,i,s,u,f,p,g,y){var w,T=e.xaxis,M=e.yaxis,C=t._fullLayout;function P(e,r,n){return a.ensureSingle(e,"text").text(r).attr({class:"bartext bartext-"+w,"text-anchor":"middle","data-notex":1}).call(l.font,n).call(o.convertToTspans,t)}var O=n[0].trace,I="h"===O.orientation,D=function(t,e,r,n,i){var o,s=e[0].trace;return o=s.texttemplate?function(t,e,r,n,i){var o=e[0].trace,s=a.castOption(o,r,"texttemplate");if(!s)return"";var l,u,f,h,p="histogram"===o.type,d="waterfall"===o.type,v="funnel"===o.type,g="h"===o.orientation;function y(t){return c(h,h.c2l(t),!0).text}g?(l="y",u=i,f="x",h=n):(l="x",u=n,f="y",h=i);var m,x=e[r],_={};_.label=x.p,_.labelLabel=_[l+"Label"]=(m=x.p,c(u,u.c2l(m),!0).text);var w=a.castOption(o,x.i,"text");(0===w||w)&&(_.text=w),_.value=x.s,_.valueLabel=_[f+"Label"]=y(x.s);var T={};b(T,o,x.i),(p||void 0===T.x)&&(T.x=g?_.value:_.label),(p||void 0===T.y)&&(T.y=g?_.label:_.value),(p||void 0===T.xLabel)&&(T.xLabel=g?_.valueLabel:_.labelLabel),(p||void 0===T.yLabel)&&(T.yLabel=g?_.labelLabel:_.valueLabel),d&&(_.delta=+x.rawS||x.s,_.deltaLabel=y(_.delta),_.final=x.v,_.finalLabel=y(_.final),_.initial=_.final-_.delta,_.initialLabel=y(_.initial)),v&&(_.value=x.s,_.valueLabel=y(_.value),_.percentInitial=x.begR,_.percentInitialLabel=a.formatPercent(x.begR),_.percentPrevious=x.difR,_.percentPreviousLabel=a.formatPercent(x.difR),_.percentTotal=x.sumR,_.percenTotalLabel=a.formatPercent(x.sumR));var k=a.castOption(o,x.i,"customdata");return k&&(_.customdata=k),a.texttemplateString(s,_,t._d3locale,T,_,o._meta||{})}(t,e,r,n,i):s.textinfo?function(t,e,r,n){var i=t[0].trace,o="h"===i.orientation,s="waterfall"===i.type,l="funnel"===i.type;function u(t){return c(o?r:n,+t,!0).text}var f,h,p=i.textinfo,d=t[e],v=p.split("+"),g=[],y=function(t){return-1!==v.indexOf(t)};if(y("label")&&g.push((h=t[e].p,c(o?n:r,h,!0).text)),y("text")&&(0===(f=a.castOption(i,d.i,"text"))||f)&&g.push(f),s){var m=+d.rawS||d.s,x=d.v,b=x-m;y("initial")&&g.push(u(b)),y("delta")&&g.push(u(m)),y("final")&&g.push(u(x))}if(l){y("value")&&g.push(u(d.s));var _=0;y("percent initial")&&_++,y("percent previous")&&_++,y("percent total")&&_++;var w=_>1;y("percent initial")&&(f=a.formatPercent(d.begR),w&&(f+=" of initial"),g.push(f)),y("percent previous")&&(f=a.formatPercent(d.difR),w&&(f+=" of previous"),g.push(f)),y("percent total")&&(f=a.formatPercent(d.sumR),w&&(f+=" of total"),g.push(f))}return g.join("
")}(e,r,n,i):v.getValue(s.text,r),v.coerceString(m,o)}(C,n,i,T,M);w=function(t,e){var r=v.getValue(t.textposition,e);return v.coerceEnumerated(x,r)}(O,i);var z="stack"===g.mode||"relative"===g.mode,R=n[i],F=!z||R._outmost;if(D&&"none"!==w&&(!R.isBlank&&s!==u&&f!==p||"auto"!==w&&"inside"!==w)){var B=C.font,N=d.getBarColor(n[i],O),j=d.getInsideTextFont(O,i,B,N),U=d.getOutsideTextFont(O,i,B),V=r.datum();I?"log"===T.type&&V.s0<=0&&(s=T.range[0]0&&Z>0&&(G<=W&&Z<=X||G<=X&&Z<=W||(I?W>=G*(X/Z):X>=Z*(W/G)))?w="inside":(w="outside",H.remove(),H=null)):w="inside"),!H){var J=(H=P(r,D,Y=a.ensureUniformFontSize(t,"outside"===w?U:j))).attr("transform");if(H.attr("transform",""),G=(q=l.bBox(H.node())).width,Z=q.height,H.attr("transform",J),G<=0||Z<=0)return void H.remove()}var K,$=O.textangle;K="outside"===w?function(t,e,r,n,i,a){var o,s=!!a.isHorizontal,l=!!a.constrained,u=a.angle||0,c=i.width,f=i.height,h=Math.abs(e-t),p=Math.abs(n-r);o=s?p>2*_?_:0:h>2*_?_:0;var d=1;l&&(d=s?Math.min(1,p/f):Math.min(1,h/c));var v=S(u),g=E(i,v),y=(s?g.x:g.y)/2,m=(i.left+i.right)/2,x=(i.top+i.bottom)/2,b=(t+e)/2,w=(r+n)/2,T=0,A=0,M=s?k(e,t):k(r,n);return s?(b=e-M*o,T=M*y):(w=n+M*o,A=-M*y),{textX:m,textY:x,targetX:b,targetY:w,anchorX:T,anchorY:A,scale:d,rotate:v}}(s,u,f,p,q,{isHorizontal:I,constrained:"both"===O.constraintext||"outside"===O.constraintext,angle:$}):L(s,u,f,p,q,{isHorizontal:I,constrained:"both"===O.constraintext||"inside"===O.constraintext,angle:$,anchor:O.insidetextanchor}),K.fontSize=Y.size,h("histogram"===O.type?"bar":O.type,K,C),R.transform=K;var Q=A(H,C,g,y);a.setTransormAndDisplay(Q,K)}else r.select("text").remove()}(t,e,I,r,p,N,j,U,V,g,y),e.layerClipId&&l.hideOutsideRangePoint(u,I.select("text"),w,C,f.xcalendar,f.ycalendar)}));var U=!1===f.cliponaxis;l.setClipUrl(u,U?null:e.layerClipId,t)}));u.getComponentMethod("errorbars","plot")(t,I,e,g)},toMoveInsideBar:L}},81974:function(t){"use strict";function e(t,e,r,n,i){var a=e.c2p(n?t.s0:t.p0,!0),o=e.c2p(n?t.s1:t.p1,!0),s=r.c2p(n?t.p0:t.s0,!0),l=r.c2p(n?t.p1:t.s1,!0);return i?[(a+o)/2,(s+l)/2]:n?[o,(s+l)/2]:[(a+o)/2,l]}t.exports=function(t,r){var n,i=t.cd,a=t.xaxis,o=t.yaxis,s=i[0].trace,l="funnel"===s.type,u="h"===s.orientation,c=[];if(!1===r)for(n=0;n1||0===i.bargap&&0===i.bargroupgap&&!t[0].trace.marker.line.width)&&n.select(this).attr("shape-rendering","crispEdges")})),e.selectAll("g.points").each((function(e){d(n.select(this),e[0].trace,t)})),s.getComponentMethod("errorbars","style")(e)},styleTextPoints:v,styleOnSelect:function(t,e,r){var i=e[0].trace;i.selectedpoints?function(t,e,r){a.selectedPointStyle(t.selectAll("path"),e),function(t,e,r){t.each((function(t){var i,s=n.select(this);if(t.selected){i=o.ensureUniformFontSize(r,g(s,t,e,r));var l=e.selected.textfont&&e.selected.textfont.color;l&&(i.color=l),a.font(s,i)}else a.selectedTextStyle(s,e)}))}(t.selectAll("text"),e,r)}(r,i,t):(d(r,i,t),s.getComponentMethod("errorbars","style")(r))},getInsideTextFont:m,getOutsideTextFont:x,getBarColor:_,resizeText:l}},98340:function(t,e,r){"use strict";var n=r(7901),i=r(52075).hasColorscale,a=r(1586),o=r(71828).coercePattern;t.exports=function(t,e,r,s,l){var u=r("marker.color",s),c=i(t,"marker");c&&a(t,e,l,r,{prefix:"marker.",cLetter:"c"}),r("marker.line.color",n.defaultLine),i(t,"marker.line")&&a(t,e,l,r,{prefix:"marker.line.",cLetter:"c"}),r("marker.line.width"),r("marker.opacity"),o(r,"marker.pattern",u,c),r("selected.marker.color"),r("unselected.marker.color")}},72597:function(t,e,r){"use strict";var n=r(39898),i=r(71828);function a(t){return"_"+t+"Text_minsize"}t.exports={recordMinTextSize:function(t,e,r){if(r.uniformtext.mode){var n=a(t),i=r.uniformtext.minsize,o=e.scale*e.fontSize;e.hide=oh.range[1]&&(x+=Math.PI),n.getClosest(u,(function(t){return v(m,x,[t.rp0,t.rp1],[t.thetag0,t.thetag1],d)?g+Math.min(1,Math.abs(t.thetag1-t.thetag0)/y)-1+(t.rp1-m)/(t.rp1-t.rp0)-1:1/0}),t),!1!==t.index){var b=u[t.index];t.x0=t.x1=b.ct[0],t.y0=t.y1=b.ct[1];var _=i.extendFlat({},b,{r:b.s,theta:b.p});return o(b,c,t),s(_,c,f,t),t.hovertemplate=c.hovertemplate,t.color=a(c,b),t.xLabelVal=t.yLabelVal=void 0,b.s<0&&(t.idealAlign="left"),[t]}}},23381:function(t,e,r){"use strict";t.exports={moduleType:"trace",name:"barpolar",basePlotModule:r(23580),categories:["polar","bar","showLegend"],attributes:r(55023),layoutAttributes:r(40151),supplyDefaults:r(6135),supplyLayoutDefaults:r(19860),calc:r(74692).calc,crossTraceCalc:r(74692).crossTraceCalc,plot:r(60173),colorbar:r(4898),formatLabels:r(98608),style:r(16688).style,styleOnSelect:r(16688).styleOnSelect,hoverPoints:r(27379),selectPoints:r(81974),meta:{}}},40151:function(t){"use strict";t.exports={barmode:{valType:"enumerated",values:["stack","overlay"],dflt:"stack",editType:"calc"},bargap:{valType:"number",dflt:.1,min:0,max:1,editType:"calc"}}},19860:function(t,e,r){"use strict";var n=r(71828),i=r(40151);t.exports=function(t,e,r){var a,o={};function s(r,o){return n.coerce(t[a]||{},e[a],i,r,o)}for(var l=0;l0?(u=o,c=l):(u=l,c=o);var f=[s.findEnclosingVertexAngles(u,t.vangles)[0],(u+c)/2,s.findEnclosingVertexAngles(c,t.vangles)[1]];return s.pathPolygonAnnulus(n,i,u,c,f,e,r)}:function(t,n,i,o){return a.pathAnnulus(t,n,i,o,e,r)}}(e),d=e.layers.frontplot.select("g.barlayer");a.makeTraceGroups(d,r,"trace bars").each((function(){var r=n.select(this),s=a.ensureSingle(r,"g","points").selectAll("g.point").data(a.identity);s.enter().append("g").style("vector-effect",l?"none":"non-scaling-stroke").style("stroke-miterlimit",2).classed("point",!0),s.exit().remove(),s.each((function(t){var e,r=n.select(this),o=t.rp0=f.c2p(t.s0),s=t.rp1=f.c2p(t.s1),l=t.thetag0=h.c2g(t.p0),d=t.thetag1=h.c2g(t.p1);if(i(o)&&i(s)&&i(l)&&i(d)&&o!==s&&l!==d){var v=f.c2g(t.s1),g=(l+d)/2;t.ct=[u.c2p(v*Math.cos(g)),c.c2p(v*Math.sin(g))],e=p(o,s,l,d)}else e="M0,0Z";a.ensureSingle(r,"path").attr("d",e)})),o.setClipUrl(r,e._hasClipOnAxisFalse?e.clipIds.forTraces:null,t)}))}},53522:function(t,e,r){"use strict";var n=r(82196),i=r(1486),a=r(22399),o=r(12663).axisHoverFormat,s=r(5386).fF,l=r(1426).extendFlat,u=n.marker,c=u.line;t.exports={y:{valType:"data_array",editType:"calc+clearAxisTypes"},x:{valType:"data_array",editType:"calc+clearAxisTypes"},x0:{valType:"any",editType:"calc+clearAxisTypes"},y0:{valType:"any",editType:"calc+clearAxisTypes"},dx:{valType:"number",editType:"calc"},dy:{valType:"number",editType:"calc"},xperiod:n.xperiod,yperiod:n.yperiod,xperiod0:n.xperiod0,yperiod0:n.yperiod0,xperiodalignment:n.xperiodalignment,yperiodalignment:n.yperiodalignment,xhoverformat:o("x"),yhoverformat:o("y"),name:{valType:"string",editType:"calc+clearAxisTypes"},q1:{valType:"data_array",editType:"calc+clearAxisTypes"},median:{valType:"data_array",editType:"calc+clearAxisTypes"},q3:{valType:"data_array",editType:"calc+clearAxisTypes"},lowerfence:{valType:"data_array",editType:"calc"},upperfence:{valType:"data_array",editType:"calc"},notched:{valType:"boolean",editType:"calc"},notchwidth:{valType:"number",min:0,max:.5,dflt:.25,editType:"calc"},notchspan:{valType:"data_array",editType:"calc"},boxpoints:{valType:"enumerated",values:["all","outliers","suspectedoutliers",!1],editType:"calc"},jitter:{valType:"number",min:0,max:1,editType:"calc"},pointpos:{valType:"number",min:-2,max:2,editType:"calc"},boxmean:{valType:"enumerated",values:[!0,"sd",!1],editType:"calc"},mean:{valType:"data_array",editType:"calc"},sd:{valType:"data_array",editType:"calc"},orientation:{valType:"enumerated",values:["v","h"],editType:"calc+clearAxisTypes"},quartilemethod:{valType:"enumerated",values:["linear","exclusive","inclusive"],dflt:"linear",editType:"calc"},width:{valType:"number",min:0,dflt:0,editType:"calc"},marker:{outliercolor:{valType:"color",dflt:"rgba(0, 0, 0, 0)",editType:"style"},symbol:l({},u.symbol,{arrayOk:!1,editType:"plot"}),opacity:l({},u.opacity,{arrayOk:!1,dflt:1,editType:"style"}),angle:l({},u.angle,{arrayOk:!1,editType:"calc"}),size:l({},u.size,{arrayOk:!1,editType:"calc"}),color:l({},u.color,{arrayOk:!1,editType:"style"}),line:{color:l({},c.color,{arrayOk:!1,dflt:a.defaultLine,editType:"style"}),width:l({},c.width,{arrayOk:!1,dflt:0,editType:"style"}),outliercolor:{valType:"color",editType:"style"},outlierwidth:{valType:"number",min:0,dflt:1,editType:"style"},editType:"style"},editType:"plot"},line:{color:{valType:"color",editType:"style"},width:{valType:"number",min:0,dflt:2,editType:"style"},editType:"plot"},fillcolor:n.fillcolor,whiskerwidth:{valType:"number",min:0,max:1,dflt:.5,editType:"calc"},offsetgroup:i.offsetgroup,alignmentgroup:i.alignmentgroup,selected:{marker:n.selected.marker,editType:"style"},unselected:{marker:n.unselected.marker,editType:"style"},text:l({},n.text,{}),hovertext:l({},n.hovertext,{}),hovertemplate:s({}),hoveron:{valType:"flaglist",flags:["boxes","points"],dflt:"boxes+points",editType:"style"}}},48518:function(t,e,r){"use strict";var n=r(92770),i=r(89298),a=r(42973),o=r(71828),s=r(50606).BADNUM,l=o._;t.exports=function(t,e){var r,u,m,x,b,_,w,T=t._fullLayout,k=i.getFromId(t,e.xaxis||"x"),A=i.getFromId(t,e.yaxis||"y"),M=[],S="violin"===e.type?"_numViolins":"_numBoxes";"h"===e.orientation?(m=k,x="x",b=A,_="y",w=!!e.yperiodalignment):(m=A,x="y",b=k,_="x",w=!!e.xperiodalignment);var E,L,C,P,O,I,D=function(t,e,r,i){var s,l=e+"0"in t;if(e in t||l&&"d"+e in t){var u=r.makeCalcdata(t,e);return[a(t,r,e,u).vals,u]}s=l?t[e+"0"]:"name"in t&&("category"===r.type||n(t.name)&&-1!==["linear","log"].indexOf(r.type)||o.isDateTime(t.name)&&"date"===r.type)?t.name:i;for(var c="multicategory"===r.type?r.r2c_just_indices(s):r.d2c(s,0,t[e+"calendar"]),f=t._length,h=new Array(f),p=0;pE.uf};if(e._hasPreCompStats){var U=e[x],V=function(t){return m.d2c((e[t]||[])[r])},H=1/0,q=-1/0;for(r=0;r=E.q1&&E.q3>=E.med){var Z=V("lowerfence");E.lf=Z!==s&&Z<=E.q1?Z:p(E,C,P);var Y=V("upperfence");E.uf=Y!==s&&Y>=E.q3?Y:d(E,C,P);var W=V("mean");E.mean=W!==s?W:P?o.mean(C,P):(E.q1+E.q3)/2;var X=V("sd");E.sd=W!==s&&X>=0?X:P?o.stdev(C,P,E.mean):E.q3-E.q1,E.lo=v(E),E.uo=g(E);var J=V("notchspan");J=J!==s&&J>0?J:y(E,P),E.ln=E.med-J,E.un=E.med+J;var K=E.lf,$=E.uf;e.boxpoints&&C.length&&(K=Math.min(K,C[0]),$=Math.max($,C[P-1])),e.notched&&(K=Math.min(K,E.ln),$=Math.max($,E.un)),E.min=K,E.max=$}else{var Q;o.warn(["Invalid input - make sure that q1 <= median <= q3","q1 = "+E.q1,"median = "+E.med,"q3 = "+E.q3].join("\n")),Q=E.med!==s?E.med:E.q1!==s?E.q3!==s?(E.q1+E.q3)/2:E.q1:E.q3!==s?E.q3:0,E.med=Q,E.q1=E.q3=Q,E.lf=E.uf=Q,E.mean=E.sd=Q,E.ln=E.un=Q,E.min=E.max=Q}H=Math.min(H,E.min),q=Math.max(q,E.max),E.pts2=L.filter(j),M.push(E)}}e._extremes[m._id]=i.findExtremes(m,[H,q],{padded:!0})}else{var tt=m.makeCalcdata(e,x),et=function(t,e){for(var r=t.length,n=new Array(r+1),i=0;i=0&&it0){var ct,ft;(E={}).pos=E[_]=B[r],L=E.pts=nt[r].sort(f),P=(C=E[x]=L.map(h)).length,E.min=C[0],E.max=C[P-1],E.mean=o.mean(C,P),E.sd=o.stdev(C,P,E.mean),E.med=o.interp(C,.5),P%2&&(lt||ut)?(lt?(ct=C.slice(0,P/2),ft=C.slice(P/2+1)):ut&&(ct=C.slice(0,P/2+1),ft=C.slice(P/2)),E.q1=o.interp(ct,.5),E.q3=o.interp(ft,.5)):(E.q1=o.interp(C,.25),E.q3=o.interp(C,.75)),E.lf=p(E,C,P),E.uf=d(E,C,P),E.lo=v(E),E.uo=g(E);var ht=y(E,P);E.ln=E.med-ht,E.un=E.med+ht,at=Math.min(at,E.ln),ot=Math.max(ot,E.un),E.pts2=L.filter(j),M.push(E)}e._extremes[m._id]=i.findExtremes(m,e.notched?tt.concat([at,ot]):tt,{padded:!0})}return function(t,e){if(o.isArrayOrTypedArray(e.selectedpoints))for(var r=0;r0?(M[0].t={num:T[S],dPos:N,posLetter:_,valLetter:x,labels:{med:l(t,"median:"),min:l(t,"min:"),q1:l(t,"q1:"),q3:l(t,"q3:"),max:l(t,"max:"),mean:"sd"===e.boxmean?l(t,"mean ± σ:"):l(t,"mean:"),lf:l(t,"lower fence:"),uf:l(t,"upper fence:")}},T[S]++,M):[{t:{empty:!0}}]};var u={text:"tx",hovertext:"htx"};function c(t,e,r){for(var n in u)o.isArrayOrTypedArray(e[n])&&(Array.isArray(r)?o.isArrayOrTypedArray(e[n][r[0]])&&(t[u[n]]=e[n][r[0]][r[1]]):t[u[n]]=e[n][r])}function f(t,e){return t.v-e.v}function h(t){return t.v}function p(t,e,r){return 0===r?t.q1:Math.min(t.q1,e[Math.min(o.findBin(2.5*t.q1-1.5*t.q3,e,!0)+1,r-1)])}function d(t,e,r){return 0===r?t.q3:Math.max(t.q3,e[Math.max(o.findBin(2.5*t.q3-1.5*t.q1,e),0)])}function v(t){return 4*t.q1-3*t.q3}function g(t){return 4*t.q3-3*t.q1}function y(t,e){return 0===e?0:1.57*(t.q3-t.q1)/Math.sqrt(e)}},37188:function(t,e,r){"use strict";var n=r(89298),i=r(71828),a=r(99082).getAxisGroup,o=["v","h"];function s(t,e,r,o){var s,l,u,c=e.calcdata,f=e._fullLayout,h=o._id,p=h.charAt(0),d=[],v=0;for(s=0;s1,b=1-f[t+"gap"],_=1-f[t+"groupgap"];for(s=0;s0){var q=E.pointpos,G=E.jitter,Z=E.marker.size/2,Y=0;q+G>=0&&((Y=V*(q+G))>M?(H=!0,j=Z,B=Y):Y>R&&(j=Z,B=M)),Y<=M&&(B=M);var W=0;q-G<=0&&((W=-V*(q-G))>S?(H=!0,U=Z,N=W):W>F&&(U=Z,N=S)),W<=S&&(N=S)}else B=M,N=S;var X=new Array(u.length);for(l=0;l0?(g="v",y=x>0?Math.min(_,b):Math.min(b)):x>0?(g="h",y=Math.min(_)):y=0;if(y){e._length=y;var S=r("orientation",g);e._hasPreCompStats?"v"===S&&0===x?(r("x0",0),r("dx",1)):"h"===S&&0===m&&(r("y0",0),r("dy",1)):"v"===S&&0===x?r("x0"):"h"===S&&0===m&&r("y0"),i.getComponentMethod("calendars","handleTraceDefaults")(t,e,["x","y"],a)}else e.visible=!1}function f(t,e,r,i){var a=i.prefix,o=n.coerce2(t,e,u,"marker.outliercolor"),s=r("marker.line.outliercolor"),l="outliers";e._hasPreCompStats?l="all":(o||s)&&(l="suspectedoutliers");var c=r(a+"points",l);c?(r("jitter","all"===c?.3:0),r("pointpos","all"===c?-1.5:0),r("marker.symbol"),r("marker.opacity"),r("marker.size"),r("marker.angle"),r("marker.color",e.line.color),r("marker.line.color"),r("marker.line.width"),"suspectedoutliers"===c&&(r("marker.line.outliercolor",e.marker.color),r("marker.line.outlierwidth")),r("selected.marker.color"),r("unselected.marker.color"),r("selected.marker.size"),r("unselected.marker.size"),r("text"),r("hovertext")):delete e.marker;var f=r("hoveron");"all"!==f&&-1===f.indexOf("points")||r("hovertemplate"),n.coerceSelectionMarkerOpacity(e,r)}t.exports={supplyDefaults:function(t,e,r,i){function s(r,i){return n.coerce(t,e,u,r,i)}if(c(t,e,s,i),!1!==e.visible){o(t,e,i,s),s("xhoverformat"),s("yhoverformat");var l=e._hasPreCompStats;l&&(s("lowerfence"),s("upperfence")),s("line.color",(t.marker||{}).color||r),s("line.width"),s("fillcolor",a.addOpacity(e.line.color,.5));var h=!1;if(l){var p=s("mean"),d=s("sd");p&&p.length&&(h=!0,d&&d.length&&(h="sd"))}s("boxmean",h),s("whiskerwidth"),s("width"),s("quartilemethod");var v=!1;if(l){var g=s("notchspan");g&&g.length&&(v=!0)}else n.validate(t.notchwidth,u.notchwidth)&&(v=!0);s("notched",v)&&s("notchwidth"),f(t,e,s,{prefix:"box"})}},crossTraceDefaults:function(t,e){var r,i;function a(t){return n.coerce(i._input,i,u,t)}for(var o=0;ot.lo&&(x.so=!0)}return a}));h.enter().append("path").classed("point",!0),h.exit().remove(),h.call(a.translatePoints,o,s)}function l(t,e,r,a){var o,s,l=e.val,u=e.pos,c=!!u.rangebreaks,f=a.bPos,h=a.bPosPxOffset||0,p=r.boxmean||(r.meanline||{}).visible;Array.isArray(a.bdPos)?(o=a.bdPos[0],s=a.bdPos[1]):(o=a.bdPos,s=a.bdPos);var d=t.selectAll("path.mean").data("box"===r.type&&r.boxmean||"violin"===r.type&&r.box.visible&&r.meanline.visible?i.identity:[]);d.enter().append("path").attr("class","mean").style({fill:"none","vector-effect":"non-scaling-stroke"}),d.exit().remove(),d.each((function(t){var e=u.c2l(t.pos+f,!0),i=u.l2p(e-o)+h,a=u.l2p(e+s)+h,d=c?(i+a)/2:u.l2p(e)+h,v=l.c2p(t.mean,!0),g=l.c2p(t.mean-t.sd,!0),y=l.c2p(t.mean+t.sd,!0);"h"===r.orientation?n.select(this).attr("d","M"+v+","+i+"V"+a+("sd"===p?"m0,0L"+g+","+d+"L"+v+","+i+"L"+y+","+d+"Z":"")):n.select(this).attr("d","M"+i+","+v+"H"+a+("sd"===p?"m0,0L"+d+","+g+"L"+i+","+v+"L"+d+","+y+"Z":""))}))}t.exports={plot:function(t,e,r,a){var u=t._context.staticPlot,c=e.xaxis,f=e.yaxis;i.makeTraceGroups(a,r,"trace boxes").each((function(t){var e,r,i=n.select(this),a=t[0],h=a.t,p=a.trace;h.wdPos=h.bdPos*p.whiskerwidth,!0!==p.visible||h.empty?i.remove():("h"===p.orientation?(e=f,r=c):(e=c,r=f),o(i,{pos:e,val:r},p,h,u),s(i,{x:c,y:f},p,h),l(i,{pos:e,val:r},p,h))}))},plotBoxAndWhiskers:o,plotPoints:s,plotBoxMean:l}},24626:function(t){"use strict";t.exports=function(t,e){var r,n,i=t.cd,a=t.xaxis,o=t.yaxis,s=[];if(!1===e)for(r=0;r=10)return null;for(var r=1/0,a=-1/0,o=t.length,s=0;s0?Math.floor:Math.ceil,O=L>0?Math.ceil:Math.floor,I=L>0?Math.min:Math.max,D=L>0?Math.max:Math.min,z=P(S+C),R=O(E-C),F=[[f=M(S)]];for(a=z;a*L=0;i--)a[c-i]=t[f][i],o[c-i]=e[f][i];for(s.push({x:a,y:o,bicubic:l}),i=f,a=[],o=[];i>=0;i--)a[f-i]=t[i][0],o[f-i]=e[i][0];return s.push({x:a,y:o,bicubic:u}),s}},20347:function(t,e,r){"use strict";var n=r(89298),i=r(1426).extendFlat;t.exports=function(t,e,r){var a,o,s,l,u,c,f,h,p,d,v,g,y,m,x=t["_"+e],b=t[e+"axis"],_=b._gridlines=[],w=b._minorgridlines=[],T=b._boundarylines=[],k=t["_"+r],A=t[r+"axis"];"array"===b.tickmode&&(b.tickvals=x.slice());var M=t._xctrl,S=t._yctrl,E=M[0].length,L=M.length,C=t._a.length,P=t._b.length;n.prepTicks(b),"array"===b.tickmode&&delete b.tickvals;var O=b.smoothing?3:1;function I(n){var i,a,o,s,l,u,c,f,p,d,v,g,y=[],m=[],x={};if("b"===e)for(a=t.b2j(n),o=Math.floor(Math.max(0,Math.min(P-2,a))),s=a-o,x.length=P,x.crossLength=C,x.xy=function(e){return t.evalxy([],e,a)},x.dxy=function(e,r){return t.dxydi([],e,o,r,s)},i=0;i0&&(p=t.dxydi([],i-1,o,0,s),y.push(l[0]+p[0]/3),m.push(l[1]+p[1]/3),d=t.dxydi([],i-1,o,1,s),y.push(f[0]-d[0]/3),m.push(f[1]-d[1]/3)),y.push(f[0]),m.push(f[1]),l=f;else for(i=t.a2i(n),u=Math.floor(Math.max(0,Math.min(C-2,i))),c=i-u,x.length=C,x.crossLength=P,x.xy=function(e){return t.evalxy([],i,e)},x.dxy=function(e,r){return t.dxydj([],u,e,c,r)},a=0;a0&&(v=t.dxydj([],u,a-1,c,0),y.push(l[0]+v[0]/3),m.push(l[1]+v[1]/3),g=t.dxydj([],u,a-1,c,1),y.push(f[0]-g[0]/3),m.push(f[1]-g[1]/3)),y.push(f[0]),m.push(f[1]),l=f;return x.axisLetter=e,x.axis=b,x.crossAxis=A,x.value=n,x.constvar=r,x.index=h,x.x=y,x.y=m,x.smoothing=A.smoothing,x}function D(n){var i,a,o,s,l,u=[],c=[],f={};if(f.length=x.length,f.crossLength=k.length,"b"===e)for(o=Math.max(0,Math.min(P-2,n)),l=Math.min(1,Math.max(0,n-o)),f.xy=function(e){return t.evalxy([],e,n)},f.dxy=function(e,r){return t.dxydi([],e,o,r,l)},i=0;ix.length-1||_.push(i(D(o),{color:b.gridcolor,width:b.gridwidth,dash:b.griddash}));for(h=c;hx.length-1||v<0||v>x.length-1))for(g=x[s],y=x[v],a=0;ax[x.length-1]||w.push(i(I(d),{color:b.minorgridcolor,width:b.minorgridwidth,dash:b.minorgriddash}));b.startline&&T.push(i(D(0),{color:b.startlinecolor,width:b.startlinewidth})),b.endline&&T.push(i(D(x.length-1),{color:b.endlinecolor,width:b.endlinewidth}))}else{for(l=5e-15,c=(u=[Math.floor((x[x.length-1]-b.tick0)/b.dtick*(1+l)),Math.ceil((x[0]-b.tick0)/b.dtick/(1+l))].sort((function(t,e){return t-e})))[0],f=u[1],h=c;h<=f;h++)p=b.tick0+b.dtick*h,_.push(i(I(p),{color:b.gridcolor,width:b.gridwidth,dash:b.griddash}));for(h=c-1;hx[x.length-1]||w.push(i(I(d),{color:b.minorgridcolor,width:b.minorgridwidth,dash:b.minorgriddash}));b.startline&&T.push(i(I(x[0]),{color:b.startlinecolor,width:b.startlinewidth})),b.endline&&T.push(i(I(x[x.length-1]),{color:b.endlinecolor,width:b.endlinewidth}))}}},83311:function(t,e,r){"use strict";var n=r(89298),i=r(1426).extendFlat;t.exports=function(t,e){var r,a,o,s=e._labels=[],l=e._gridlines;for(r=0;re.length&&(t=t.slice(0,e.length)):t=[],i=0;i90&&(p-=180,l=-l),{angle:p,flip:l,p:t.c2p(n,e,r),offsetMultplier:u}}},89740:function(t,e,r){"use strict";var n=r(39898),i=r(91424),a=r(27669),o=r(67961),s=r(11651),l=r(63893),u=r(71828),c=u.strRotate,f=u.strTranslate,h=r(18783);function p(t,e,r,s,l,u,c){var f="const-"+l+"-lines",h=r.selectAll("."+f).data(u);h.enter().append("path").classed(f,!0).style("vector-effect",c?"none":"non-scaling-stroke"),h.each((function(r){var s=r,l=s.x,u=s.y,c=a([],l,t.c2p),f=a([],u,e.c2p),h="M"+o(c,f,s.smoothing);n.select(this).attr("d",h).style("stroke-width",s.width).style("stroke",s.color).style("stroke-dasharray",i.dashStyle(s.dash,s.width)).style("fill","none")})),h.exit().remove()}function d(t,e,r,a,o,u,h,p){var d=u.selectAll("text."+p).data(h);d.enter().append("text").classed(p,!0);var v=0,g={};return d.each((function(o,u){var h;if("auto"===o.axis.tickangle)h=s(a,e,r,o.xy,o.dxy);else{var p=(o.axis.tickangle+180)*Math.PI/180;h=s(a,e,r,o.xy,[Math.cos(p),Math.sin(p)])}u||(g={angle:h.angle,flip:h.flip});var d=(o.endAnchor?-1:1)*h.flip,y=n.select(this).attr({"text-anchor":d>0?"start":"end","data-notex":1}).call(i.font,o.font).text(o.text).call(l.convertToTspans,t),m=i.bBox(this);y.attr("transform",f(h.p[0],h.p[1])+c(h.angle)+f(o.axis.labelpadding*d,.3*m.height)),v=Math.max(v,m.width+o.axis.labelpadding)})),d.exit().remove(),g.maxExtent=v,g}t.exports=function(t,e,r,i){var l=t._context.staticPlot,c=e.xaxis,f=e.yaxis,h=t._fullLayout._clips;u.makeTraceGroups(i,r,"trace").each((function(e){var r=n.select(this),i=e[0],v=i.trace,g=v.aaxis,m=v.baxis,x=u.ensureSingle(r,"g","minorlayer"),b=u.ensureSingle(r,"g","majorlayer"),_=u.ensureSingle(r,"g","boundarylayer"),w=u.ensureSingle(r,"g","labellayer");r.style("opacity",v.opacity),p(c,f,b,0,"a",g._gridlines,!0),p(c,f,b,0,"b",m._gridlines,!0),p(c,f,x,0,"a",g._minorgridlines,!0),p(c,f,x,0,"b",m._minorgridlines,!0),p(c,f,_,0,"a-boundary",g._boundarylines,l),p(c,f,_,0,"b-boundary",m._boundarylines,l);var T=d(t,c,f,v,0,w,g._labels,"a-label"),k=d(t,c,f,v,0,w,m._labels,"b-label");!function(t,e,r,n,i,a,o,l){var c,f,h,p,d=u.aggNums(Math.min,null,r.a),v=u.aggNums(Math.max,null,r.a),g=u.aggNums(Math.min,null,r.b),m=u.aggNums(Math.max,null,r.b);c=.5*(d+v),f=g,h=r.ab2xy(c,f,!0),p=r.dxyda_rough(c,f),void 0===o.angle&&u.extendFlat(o,s(r,i,a,h,r.dxydb_rough(c,f))),y(t,e,r,0,h,p,r.aaxis,i,a,o,"a-title"),c=d,f=.5*(g+m),h=r.ab2xy(c,f,!0),p=r.dxydb_rough(c,f),void 0===l.angle&&u.extendFlat(l,s(r,i,a,h,r.dxyda_rough(c,f))),y(t,e,r,0,h,p,r.baxis,i,a,l,"b-title")}(t,w,v,0,c,f,T,k),function(t,e,r,n,i){var s,l,c,f,h=r.select("#"+t._clipPathId);h.size()||(h=r.append("clipPath").classed("carpetclip",!0));var p=u.ensureSingle(h,"path","carpetboundary"),d=e.clipsegments,v=[];for(f=0;f90&&m<270,b=n.select(this);b.text(h.title.text).call(l.convertToTspans,t),x&&(_=(-l.lineCount(b)+g)*v*a-_),b.attr("transform",f(e.p[0],e.p[1])+c(e.angle)+f(0,_)).attr("text-anchor","middle").call(i.font,h.title.font)})),b.exit().remove()}},11435:function(t,e,r){"use strict";var n=r(35509),i=r(65888).findBin,a=r(45664),o=r(20349),s=r(54495),l=r(73057);t.exports=function(t){var e=t._a,r=t._b,u=e.length,c=r.length,f=t.aaxis,h=t.baxis,p=e[0],d=e[u-1],v=r[0],g=r[c-1],y=e[e.length-1]-e[0],m=r[r.length-1]-r[0],x=y*n.RELATIVE_CULL_TOLERANCE,b=m*n.RELATIVE_CULL_TOLERANCE;p-=x,d+=x,v-=b,g+=b,t.isVisible=function(t,e){return t>p&&tv&&ed||eg},t.setScale=function(){var e=t._x,r=t._y,n=a(t._xctrl,t._yctrl,e,r,f.smoothing,h.smoothing);t._xctrl=n[0],t._yctrl=n[1],t.evalxy=o([t._xctrl,t._yctrl],u,c,f.smoothing,h.smoothing),t.dxydi=s([t._xctrl,t._yctrl],f.smoothing,h.smoothing),t.dxydj=l([t._xctrl,t._yctrl],f.smoothing,h.smoothing)},t.i2a=function(t){var r=Math.max(0,Math.floor(t[0]),u-2),n=t[0]-r;return(1-n)*e[r]+n*e[r+1]},t.j2b=function(t){var e=Math.max(0,Math.floor(t[1]),u-2),n=t[1]-e;return(1-n)*r[e]+n*r[e+1]},t.ij2ab=function(e){return[t.i2a(e[0]),t.j2b(e[1])]},t.a2i=function(t){var r=Math.max(0,Math.min(i(t,e),u-2)),n=e[r],a=e[r+1];return Math.max(0,Math.min(u-1,r+(t-n)/(a-n)))},t.b2j=function(t){var e=Math.max(0,Math.min(i(t,r),c-2)),n=r[e],a=r[e+1];return Math.max(0,Math.min(c-1,e+(t-n)/(a-n)))},t.ab2ij=function(e){return[t.a2i(e[0]),t.b2j(e[1])]},t.i2c=function(e,r){return t.evalxy([],e,r)},t.ab2xy=function(n,i,a){if(!a&&(ne[u-1]|ir[c-1]))return[!1,!1];var o=t.a2i(n),s=t.b2j(i),l=t.evalxy([],o,s);if(a){var f,h,p,d,v=0,g=0,y=[];ne[u-1]?(f=u-2,h=1,v=(n-e[u-1])/(e[u-1]-e[u-2])):h=o-(f=Math.max(0,Math.min(u-2,Math.floor(o)))),ir[c-1]?(p=c-2,d=1,g=(i-r[c-1])/(r[c-1]-r[c-2])):d=s-(p=Math.max(0,Math.min(c-2,Math.floor(s)))),v&&(t.dxydi(y,f,p,h,d),l[0]+=y[0]*v,l[1]+=y[1]*v),g&&(t.dxydj(y,f,p,h,d),l[0]+=y[0]*g,l[1]+=y[1]*g)}return l},t.c2p=function(t,e,r){return[e.c2p(t[0]),r.c2p(t[1])]},t.p2x=function(t,e,r){return[e.p2c(t[0]),r.p2c(t[1])]},t.dadi=function(t){var r=Math.max(0,Math.min(e.length-2,t));return e[r+1]-e[r]},t.dbdj=function(t){var e=Math.max(0,Math.min(r.length-2,t));return r[e+1]-r[e]},t.dxyda=function(e,r,n,i){var a=t.dxydi(null,e,r,n,i),o=t.dadi(e,n);return[a[0]/o,a[1]/o]},t.dxydb=function(e,r,n,i){var a=t.dxydj(null,e,r,n,i),o=t.dbdj(r,i);return[a[0]/o,a[1]/o]},t.dxyda_rough=function(e,r,n){var i=y*(n||.1),a=t.ab2xy(e+i,r,!0),o=t.ab2xy(e-i,r,!0);return[.5*(a[0]-o[0])/i,.5*(a[1]-o[1])/i]},t.dxydb_rough=function(e,r,n){var i=m*(n||.1),a=t.ab2xy(e,r+i,!0),o=t.ab2xy(e,r-i,!0);return[.5*(a[0]-o[0])/i,.5*(a[1]-o[1])/i]},t.dpdx=function(t){return t._m},t.dpdy=function(t){return t._m}}},72505:function(t,e,r){"use strict";var n=r(71828);t.exports=function(t,e,r){var i,a,o,s=[],l=[],u=t[0].length,c=t.length;function f(e,r){var n,i=0,a=0;return e>0&&void 0!==(n=t[r][e-1])&&(a++,i+=n),e0&&void 0!==(n=t[r-1][e])&&(a++,i+=n),r0&&a0&&i1e-5);return n.log("Smoother converged to",k,"after",A,"iterations"),t}},19237:function(t,e,r){"use strict";var n=r(71828).isArray1D;t.exports=function(t,e,r){var i=r("x"),a=i&&i.length,o=r("y"),s=o&&o.length;if(!a&&!s)return!1;if(e._cheater=!i,a&&!n(i)||s&&!n(o))e._length=null;else{var l=a?i.length:1/0;s&&(l=Math.min(l,o.length)),e.a&&e.a.length&&(l=Math.min(l,e.a.length)),e.b&&e.b.length&&(l=Math.min(l,e.b.length)),e._length=l}return!0}},69568:function(t,e,r){"use strict";var n=r(5386).fF,i=r(19316),a=r(50693),o=r(9012),s=r(22399).defaultLine,l=r(1426).extendFlat,u=i.marker.line;t.exports=l({locations:{valType:"data_array",editType:"calc"},locationmode:i.locationmode,z:{valType:"data_array",editType:"calc"},geojson:l({},i.geojson,{}),featureidkey:i.featureidkey,text:l({},i.text,{}),hovertext:l({},i.hovertext,{}),marker:{line:{color:l({},u.color,{dflt:s}),width:l({},u.width,{dflt:1}),editType:"calc"},opacity:{valType:"number",arrayOk:!0,min:0,max:1,dflt:1,editType:"style"},editType:"calc"},selected:{marker:{opacity:i.selected.marker.opacity,editType:"plot"},editType:"plot"},unselected:{marker:{opacity:i.unselected.marker.opacity,editType:"plot"},editType:"plot"},hoverinfo:l({},o.hoverinfo,{editType:"calc",flags:["location","z","text","name"]}),hovertemplate:n(),showlegend:l({},o.showlegend,{dflt:!1})},a("",{cLetter:"z",editTypeOverride:"calc"}))},38675:function(t,e,r){"use strict";var n=r(92770),i=r(50606).BADNUM,a=r(78803),o=r(75225),s=r(66279);function l(t){return t&&"string"==typeof t}t.exports=function(t,e){var r,u=e._length,c=new Array(u);r=e.geojson?function(t){return l(t)||n(t)}:l;for(var f=0;f")}}(t,f,o),[t]}},51319:function(t,e,r){"use strict";t.exports={attributes:r(69568),supplyDefaults:r(61869),colorbar:r(61243),calc:r(38675),calcGeoJSON:r(99841).calcGeoJSON,plot:r(99841).plot,style:r(99636).style,styleOnSelect:r(99636).styleOnSelect,hoverPoints:r(42300),eventData:r(92069),selectPoints:r(81253),moduleType:"trace",name:"choropleth",basePlotModule:r(44622),categories:["geo","noOpacity","showLegend"],meta:{}}},99841:function(t,e,r){"use strict";var n=r(39898),i=r(71828),a=r(41327),o=r(90973).getTopojsonFeatures,s=r(71739).findExtremes,l=r(99636).style;t.exports={calcGeoJSON:function(t,e){for(var r=t[0].trace,n=e[r.geo],i=n._subplot,l=r.locationmode,u=r._length,c="geojson-id"===l?a.extractTraceFeature(t):o(r,i.topojson),f=[],h=[],p=0;p=0;n--){var i=r[n].id;if("string"==typeof i&&0===i.indexOf("water"))for(var a=n+1;a=0;r--)t.removeLayer(e[r][1])},s.dispose=function(){var t=this.subplot.map;this._removeLayers(),t.removeSource(this.sourceId)},t.exports=function(t,e){var r=e[0].trace,i=new o(t,r.uid),a=i.sourceId,s=n(e),l=i.below=t.belowLookup["trace-"+r.uid];return t.map.addSource(a,{type:"geojson",data:s.geojson}),i._addLayers(s,l),e[0].trace._glTrace=i,i}},12674:function(t,e,r){"use strict";var n=r(50693),i=r(12663).axisHoverFormat,a=r(5386).fF,o=r(2418),s=r(9012),l=r(1426).extendFlat,u={x:{valType:"data_array",editType:"calc+clearAxisTypes"},y:{valType:"data_array",editType:"calc+clearAxisTypes"},z:{valType:"data_array",editType:"calc+clearAxisTypes"},u:{valType:"data_array",editType:"calc"},v:{valType:"data_array",editType:"calc"},w:{valType:"data_array",editType:"calc"},sizemode:{valType:"enumerated",values:["scaled","absolute"],editType:"calc",dflt:"scaled"},sizeref:{valType:"number",editType:"calc",min:0},anchor:{valType:"enumerated",editType:"calc",values:["tip","tail","cm","center"],dflt:"cm"},text:{valType:"string",dflt:"",arrayOk:!0,editType:"calc"},hovertext:{valType:"string",dflt:"",arrayOk:!0,editType:"calc"},hovertemplate:a({editType:"calc"},{keys:["norm"]}),uhoverformat:i("u",1),vhoverformat:i("v",1),whoverformat:i("w",1),xhoverformat:i("x"),yhoverformat:i("y"),zhoverformat:i("z"),showlegend:l({},s.showlegend,{dflt:!1})};l(u,n("",{colorAttr:"u/v/w norm",showScaleDflt:!0,editTypeOverride:"calc"})),["opacity","lightposition","lighting"].forEach((function(t){u[t]=o[t]})),u.hoverinfo=l({},s.hoverinfo,{editType:"calc",flags:["x","y","z","u","v","w","norm","text","name"],dflt:"x+y+z+norm+text+name"}),u.transforms=void 0,t.exports=u},31371:function(t,e,r){"use strict";var n=r(78803);t.exports=function(t,e){for(var r=e.u,i=e.v,a=e.w,o=Math.min(e.x.length,e.y.length,e.z.length,r.length,i.length,a.length),s=-1/0,l=1/0,u=0;uo.level||o.starts.length&&a===o.level)}break;case"constraint":if(n.prefixBoundary=!1,n.edgepaths.length)return;var s=n.x.length,l=n.y.length,u=-1/0,c=1/0;for(r=0;r":p>u&&(n.prefixBoundary=!0);break;case"<":(pu||n.starts.length&&h===c)&&(n.prefixBoundary=!0);break;case"][":f=Math.min(p[0],p[1]),h=Math.max(p[0],p[1]),fu&&(n.prefixBoundary=!0)}}}},90654:function(t,e,r){"use strict";var n=r(21081),i=r(86068),a=r(53572);t.exports={min:"zmin",max:"zmax",calc:function(t,e,r){var o=e.contours,s=e.line,l=o.size||1,u=o.coloring,c=i(e,{isColorbar:!0});if("heatmap"===u){var f=n.extractOpts(e);r._fillgradient=f.reversescale?n.flipScale(f.colorscale):f.colorscale,r._zrange=[f.min,f.max]}else"fill"===u&&(r._fillcolor=c);r._line={color:"lines"===u?c:s.color,width:!1!==o.showlines?s.width:0,dash:s.dash},r._levels={start:o.start,end:a(o),size:l}}}},36914:function(t){"use strict";t.exports={BOTTOMSTART:[1,9,13,104,713],TOPSTART:[4,6,7,104,713],LEFTSTART:[8,12,14,208,1114],RIGHTSTART:[2,3,11,208,1114],NEWDELTA:[null,[-1,0],[0,-1],[-1,0],[1,0],null,[0,-1],[-1,0],[0,1],[0,1],null,[0,1],[1,0],[1,0],[0,-1]],CHOOSESADDLE:{104:[4,1],208:[2,8],713:[7,13],1114:[11,14]},SADDLEREMAINDER:{1:4,2:8,4:1,7:13,8:2,11:14,13:7,14:11},LABELDISTANCE:2,LABELINCREASE:10,LABELMIN:3,LABELMAX:10,LABELOPTIMIZER:{EDGECOST:1,ANGLECOST:1,NEIGHBORCOST:5,SAMELEVELFACTOR:10,SAMELEVELDISTANCE:5,MAXCOST:100,INITIALSEARCHPOINTS:10,ITERATIONS:5}}},83179:function(t,e,r){"use strict";var n=r(92770),i=r(14523),a=r(7901),o=a.addOpacity,s=a.opacity,l=r(74808),u=l.CONSTRAINT_REDUCTION,c=l.COMPARISON_OPS2;t.exports=function(t,e,r,a,l,f){var h,p,d,v=e.contours,g=r("contours.operation");v._operation=u[g],function(t,e){var r;-1===c.indexOf(e.operation)?(t("contours.value",[0,1]),Array.isArray(e.value)?e.value.length>2?e.value=e.value.slice(2):0===e.length?e.value=[0,1]:e.length<2?(r=parseFloat(e.value[0]),e.value=[r,r+1]):e.value=[parseFloat(e.value[0]),parseFloat(e.value[1])]:n(e.value)&&(r=parseFloat(e.value),e.value=[r,r+1])):(t("contours.value",0),n(e.value)||(Array.isArray(e.value)?e.value=parseFloat(e.value[0]):e.value=0))}(r,v),"="===g?h=v.showlines=!0:(h=r("contours.showlines"),d=r("fillcolor",o((t.line||{}).color||l,.5))),h&&(p=r("line.color",d&&s(d)?o(e.fillcolor,1):l),r("line.width",2),r("line.dash")),r("line.smoothing"),i(r,a,p,f)}},64237:function(t,e,r){"use strict";var n=r(74808),i=r(92770);function a(t,e){var r,a=Array.isArray(e);function o(t){return i(t)?+t:null}return-1!==n.COMPARISON_OPS2.indexOf(t)?r=o(a?e[0]:e):-1!==n.INTERVAL_OPS.indexOf(t)?r=a?[o(e[0]),o(e[1])]:[o(e),o(e)]:-1!==n.SET_OPS.indexOf(t)&&(r=a?e.map(o):[o(e)]),r}function o(t){return function(e){e=a(t,e);var r=Math.min(e[0],e[1]),n=Math.max(e[0],e[1]);return{start:r,end:n,size:n-r}}}function s(t){return function(e){return{start:e=a(t,e),end:1/0,size:1/0}}}t.exports={"[]":o("[]"),"][":o("]["),">":s(">"),"<":s("<"),"=":s("=")}},67217:function(t){"use strict";t.exports=function(t,e,r,n){var i=n("contours.start"),a=n("contours.end"),o=!1===i||!1===a,s=r("contours.size");!(o?e.autocontour=!0:r("autocontour",!1))&&s||r("ncontours")}},84857:function(t,e,r){"use strict";var n=r(71828);function i(t){return n.extendFlat({},t,{edgepaths:n.extendDeep([],t.edgepaths),paths:n.extendDeep([],t.paths),starts:n.extendDeep([],t.starts)})}t.exports=function(t,e){var r,a,o,s=function(t){return t.reverse()},l=function(t){return t};switch(e){case"=":case"<":return t;case">":for(1!==t.length&&n.warn("Contour data invalid for the specified inequality operation."),a=t[0],r=0;r1e3){n.warn("Too many contours, clipping at 1000",t);break}return l}},53572:function(t){"use strict";t.exports=function(t){return t.end+t.size/1e6}},81696:function(t,e,r){"use strict";var n=r(71828),i=r(36914);function a(t,e,r,n){return Math.abs(t[0]-e[0])20&&e?208===t||1114===t?n=0===r[0]?1:-1:a=0===r[1]?1:-1:-1!==i.BOTTOMSTART.indexOf(t)?a=1:-1!==i.LEFTSTART.indexOf(t)?n=1:-1!==i.TOPSTART.indexOf(t)?a=-1:n=-1,[n,a]}(f,r,e),p=[s(t,e,[-h[0],-h[1]])],d=t.z.length,v=t.z[0].length,g=e.slice(),y=h.slice();for(u=0;u<1e4;u++){if(f>20?(f=i.CHOOSESADDLE[f][(h[0]||h[1])<0?0:1],t.crossings[c]=i.SADDLEREMAINDER[f]):delete t.crossings[c],!(h=i.NEWDELTA[f])){n.log("Found bad marching index:",f,e,t.level);break}p.push(s(t,e,h)),e[0]+=h[0],e[1]+=h[1],c=e.join(","),a(p[p.length-1],p[p.length-2],o,l)&&p.pop();var m=h[0]&&(e[0]<0||e[0]>v-2)||h[1]&&(e[1]<0||e[1]>d-2);if(e[0]===g[0]&&e[1]===g[1]&&h[0]===y[0]&&h[1]===y[1]||r&&m)break;f=t.crossings[c]}1e4===u&&n.log("Infinite loop in contour?");var x,b,_,w,T,k,A,M,S,E,L,C,P,O,I,D=a(p[0],p[p.length-1],o,l),z=0,R=.2*t.smoothing,F=[],B=0;for(u=1;u=B;u--)if((x=F[u])=B&&x+F[b]M&&S--,t.edgepaths[S]=L.concat(p,E));break}V||(t.edgepaths[M]=p.concat(E))}for(M=0;M=m)&&(r<=y&&(r=y),o>=m&&(o=m),l=Math.floor((o-r)/s)+1,u=0),h=0;hy&&(v.unshift(y),g.unshift(g[0])),v[v.length-1]t?0:1)+(e[0][1]>t?0:2)+(e[1][1]>t?0:4)+(e[1][0]>t?0:8);return 5===r||10===r?t>(e[0][0]+e[0][1]+e[1][0]+e[1][1])/4?5===r?713:1114:5===r?104:208:15===r?0:r}t.exports=function(t){var e,r,a,o,s,l,u,c,f,h=t[0].z,p=h.length,d=h[0].length,v=2===p||2===d;for(r=0;r=0&&(n=m,s=l):Math.abs(r[1]-n[1])<.01?Math.abs(r[1]-m[1])<.01&&(m[0]-r[0])*(n[0]-m[0])>=0&&(n=m,s=l):i.log("endpt to newendpt is not vert. or horz.",r,n,m)}if(r=n,s>=0)break;f+="L"+n}if(s===t.edgepaths.length){i.log("unclosed perimeter path");break}h=s,(d=-1===p.indexOf(h))&&(h=p[0],f+="Z")}for(h=0;hn.center?n.right-s:s-n.left)/(c+Math.abs(Math.sin(u)*o)),p=(l>n.middle?n.bottom-l:l-n.top)/(Math.abs(f)+Math.cos(u)*o);if(h<1||p<1)return 1/0;var d=y.EDGECOST*(1/(h-1)+1/(p-1));d+=y.ANGLECOST*u*u;for(var v=s-c,g=l-f,m=s+c,x=l+f,b=0;b2*y.MAXCOST)break;p&&(s/=2),l=(o=u-s/2)+1.5*s}if(h<=y.MAXCOST)return c},e.addLabelData=function(t,e,r,n){var i=e.fontSize,a=e.width+i/3,o=Math.max(0,e.height-i/3),s=t.x,l=t.y,u=t.theta,c=Math.sin(u),f=Math.cos(u),h=function(t,e){return[s+t*f-e*c,l+t*c+e*f]},p=[h(-a/2,-o/2),h(-a/2,o/2),h(a/2,o/2),h(a/2,-o/2)];r.push({text:e.text,x:s,y:l,dy:e.dy,theta:u,level:e.level,width:a,height:o}),n.push(p)},e.drawLabels=function(t,e,r,a,o){var l=t.selectAll("text").data(e,(function(t){return t.text+","+t.x+","+t.y+","+t.theta}));if(l.exit().remove(),l.enter().append("text").attr({"data-notex":1,"text-anchor":"middle"}).each((function(t){var e=t.x+Math.sin(t.theta)*t.dy,i=t.y-Math.cos(t.theta)*t.dy;n.select(this).text(t.text).attr({x:e,y:i,transform:"rotate("+180*t.theta/Math.PI+" "+e+" "+i+")"}).call(s.convertToTspans,r)})),o){for(var u="",c=0;cr.end&&(r.start=r.end=(r.start+r.end)/2),t._input.contours||(t._input.contours={}),i.extendFlat(t._input.contours,{start:r.start,end:r.end,size:r.size}),t._input.autocontour=!0}else if("constraint"!==r.type){var u,c=r.start,f=r.end,h=t._input.contours;c>f&&(r.start=h.start=f,f=r.end=h.end=c,c=r.start),r.size>0||(u=c===f?1:a(c,f,t.ncontours).dtick,h.size=r.size=u)}}},84426:function(t,e,r){"use strict";var n=r(39898),i=r(91424),a=r(70035),o=r(86068);t.exports=function(t){var e=n.select(t).selectAll("g.contour");e.style("opacity",(function(t){return t[0].trace.opacity})),e.each((function(t){var e=n.select(this),r=t[0].trace,a=r.contours,s=r.line,l=a.size||1,u=a.start,c="constraint"===a.type,f=!c&&"lines"===a.coloring,h=!c&&"fill"===a.coloring,p=f||h?o(r):null;e.selectAll("g.contourlevel").each((function(t){n.select(this).selectAll("path").call(i.lineGroupStyle,s.width,f?p(t.level):s.color,s.dash)}));var d=a.labelfont;if(e.selectAll("g.contourlabels text").each((function(t){i.font(n.select(this),{family:d.family,size:d.size,color:d.color||(f?p(t.level):s.color)})})),c)e.selectAll("g.contourfill path").style("fill",r.fillcolor);else if(h){var v;e.selectAll("g.contourfill path").style("fill",(function(t){return void 0===v&&(v=t.level),p(t.level+.5*l)})),void 0===v&&(v=u),e.selectAll("g.contourbg path").style("fill",p(v-.5*l))}})),a(t)}},8724:function(t,e,r){"use strict";var n=r(1586),i=r(14523);t.exports=function(t,e,r,a,o){var s,l=r("contours.coloring"),u="";"fill"===l&&(s=r("contours.showlines")),!1!==s&&("lines"!==l&&(u=r("line.color","#000")),r("line.width",.5),r("line.dash")),"none"!==l&&(!0!==t.showlegend&&(e.showlegend=!1),e._dfltShowLegend=!1,n(t,e,a,r,{prefix:"",cLetter:"z"})),r("line.smoothing"),i(r,a,u,o)}},88085:function(t,e,r){"use strict";var n=r(21606),i=r(70600),a=r(50693),o=r(1426).extendFlat,s=i.contours;t.exports=o({carpet:{valType:"string",editType:"calc"},z:n.z,a:n.x,a0:n.x0,da:n.dx,b:n.y,b0:n.y0,db:n.dy,text:n.text,hovertext:n.hovertext,transpose:n.transpose,atype:n.xtype,btype:n.ytype,fillcolor:i.fillcolor,autocontour:i.autocontour,ncontours:i.ncontours,contours:{type:s.type,start:s.start,end:s.end,size:s.size,coloring:{valType:"enumerated",values:["fill","lines","none"],dflt:"fill",editType:"calc"},showlines:s.showlines,showlabels:s.showlabels,labelfont:s.labelfont,labelformat:s.labelformat,operation:s.operation,value:s.value,editType:"calc",impliedEdits:{autocontour:!1}},line:{color:i.line.color,width:i.line.width,dash:i.line.dash,smoothing:i.line.smoothing,editType:"plot"},transforms:void 0},a("",{cLetter:"z",autoColorDflt:!1}))},59885:function(t,e,r){"use strict";var n=r(78803),i=r(71828),a=r(68296),o=r(4742),s=r(824),l=r(43907),u=r(70769),c=r(75005),f=r(22882),h=r(18670);t.exports=function(t,e){var r=e._carpetTrace=f(t,e);if(r&&r.visible&&"legendonly"!==r.visible){if(!e.a||!e.b){var p=t.data[r.index],d=t.data[e.index];d.a||(d.a=p.a),d.b||(d.b=p.b),c(d,e,e._defaultColor,t._fullLayout)}var v=function(t,e){var r,c,f,h,p,d,v,g=e._carpetTrace,y=g.aaxis,m=g.baxis;y._minDtick=0,m._minDtick=0,i.isArray1D(e.z)&&a(e,y,m,"a","b",["z"]),r=e._a=e._a||e.a,h=e._b=e._b||e.b,r=r?y.makeCalcdata(e,"_a"):[],h=h?m.makeCalcdata(e,"_b"):[],c=e.a0||0,f=e.da||1,p=e.b0||0,d=e.db||1,v=e._z=o(e._z||e.z,e.transpose),e._emptypoints=l(v),s(v,e._emptypoints);var x=i.maxRowLength(v),b="scaled"===e.xtype?"":r,_=u(e,b,c,f,x,y),w="scaled"===e.ytype?"":h,T={a:_,b:u(e,w,p,d,v.length,m),z:v};return"levels"===e.contours.type&&"none"!==e.contours.coloring&&n(t,e,{vals:v,containerStr:"",cLetter:"z"}),[T]}(t,e);return h(e,e._z),v}}},75005:function(t,e,r){"use strict";var n=r(71828),i=r(67684),a=r(88085),o=r(83179),s=r(67217),l=r(8724);t.exports=function(t,e,r,u){function c(r,i){return n.coerce(t,e,a,r,i)}if(c("carpet"),t.a&&t.b){if(!i(t,e,c,u,"a","b"))return void(e.visible=!1);c("text"),"constraint"===c("contours.type")?o(t,e,c,u,r,{hasHover:!1}):(s(t,e,c,(function(r){return n.coerce2(t,e,a,r)})),l(t,e,c,u,{hasHover:!1}))}else e._defaultColor=r,e._length=null}},93740:function(t,e,r){"use strict";t.exports={attributes:r(88085),supplyDefaults:r(75005),colorbar:r(90654),calc:r(59885),plot:r(51048),style:r(84426),moduleType:"trace",name:"contourcarpet",basePlotModule:r(93612),categories:["cartesian","svg","carpet","contour","symbols","showLegend","hasLines","carpetDependent","noHover","noSortingByValue"],meta:{}}},51048:function(t,e,r){"use strict";var n=r(39898),i=r(27669),a=r(67961),o=r(91424),s=r(71828),l=r(87678),u=r(81696),c=r(29854),f=r(36914),h=r(84857),p=r(87558),d=r(20083),v=r(22882),g=r(4536);function y(t,e,r){var n=t.getPointAtLength(e),i=t.getPointAtLength(r),a=i.x-n.x,o=i.y-n.y,s=Math.sqrt(a*a+o*o);return[a/s,o/s]}function m(t){var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]);return[t[0]/e,t[1]/e]}function x(t,e){var r=Math.abs(t[0]*e[0]+t[1]*e[1]);return Math.sqrt(1-r*r)/r}t.exports=function(t,e,r,b){var _=e.xaxis,w=e.yaxis;s.makeTraceGroups(b,r,"contour").each((function(r){var b=n.select(this),T=r[0],k=T.trace,A=k._carpetTrace=v(t,k),M=t.calcdata[A.index][0];if(A.visible&&"legendonly"!==A.visible){var S=T.a,E=T.b,L=k.contours,C=p(L,e,T),P="constraint"===L.type,O=L._operation,I=P?"="===O?"lines":"fill":L.coloring,D=[[S[0],E[E.length-1]],[S[S.length-1],E[E.length-1]],[S[S.length-1],E[0]],[S[0],E[0]]];l(C);var z=1e-8*(S[S.length-1]-S[0]),R=1e-8*(E[E.length-1]-E[0]);u(C,z,R);var F,B,N,j,U=C;"constraint"===L.type&&(U=h(C,O)),function(t,e){var r,n,i,a,o,s,l,u,c;for(r=0;r=0;j--)F=M.clipsegments[j],B=i([],F.x,_.c2p),N=i([],F.y,w.c2p),B.reverse(),N.reverse(),V.push(a(B,N,F.bicubic));var H="M"+V.join("L")+"Z";!function(t,e,r,n,o,l){var u,c,f,h,p=s.ensureSingle(t,"g","contourbg").selectAll("path").data("fill"!==l||o?[]:[0]);p.enter().append("path"),p.exit().remove();var d=[];for(h=0;h=0&&(h=L,d=v):Math.abs(f[1]-h[1])=0&&(h=L,d=v):s.log("endpt to newendpt is not vert. or horz.",f,h,L)}if(d>=0)break;m+=S(f,h),f=h}if(d===e.edgepaths.length){s.log("unclosed perimeter path");break}c=d,(b=-1===x.indexOf(c))&&(c=x[0],m+=S(f,h)+"Z",f=null)}for(c=0;cv&&(n.max=v),n.len=n.max-n.min}function g(t,e){var r,n=0,o=.1;return(Math.abs(t[0]-l)0?+p[c]:0),f.push({type:"Feature",geometry:{type:"Point",coordinates:y},properties:m})}}var b=o.extractOpts(e),_=b.reversescale?o.flipScale(b.colorscale):b.colorscale,w=_[0][1],T=["interpolate",["linear"],["heatmap-density"],0,a.opacity(w)<1?w:a.addOpacity(w,0)];for(c=1;c<_.length;c++)T.push(_[c][0],_[c][1]);var k=["interpolate",["linear"],["get","z"],b.min,0,b.max,1];return i.extendFlat(u.heatmap.paint,{"heatmap-weight":d?k:1/(b.max-b.min),"heatmap-color":T,"heatmap-radius":v?{type:"identity",property:"r"}:e.radius,"heatmap-opacity":e.opacity}),u.geojson={type:"FeatureCollection",features:f},u.heatmap.layout.visibility="visible",u}},79429:function(t,e,r){"use strict";var n=r(71828),i=r(1586),a=r(64096);t.exports=function(t,e,r,o){function s(r,i){return n.coerce(t,e,a,r,i)}var l=s("lon")||[],u=s("lat")||[],c=Math.min(l.length,u.length);c?(e._length=c,s("z"),s("radius"),s("below"),s("text"),s("hovertext"),s("hovertemplate"),i(t,e,o,s,{prefix:"",cLetter:"z"})):e.visible=!1}},62474:function(t){"use strict";t.exports=function(t,e){return t.lon=e.lon,t.lat=e.lat,t.z=e.z,t}},84684:function(t,e,r){"use strict";var n=r(89298),i=r(28178).hoverPoints,a=r(28178).getExtraText;t.exports=function(t,e,r){var o=i(t,e,r);if(o){var s=o[0],l=s.cd,u=l[0].trace,c=l[s.index];if(delete s.color,"z"in c){var f=s.subplot.mockAxis;s.z=c.z,s.zLabel=n.tickText(f,f.c2l(c.z),"hover").text}return s.extraText=a(u,c,l[0].t.labels),[s]}}},93814:function(t,e,r){"use strict";t.exports={attributes:r(64096),supplyDefaults:r(79429),colorbar:r(61243),formatLabels:r(15636),calc:r(85070),plot:r(7336),hoverPoints:r(84684),eventData:r(62474),getBelow:function(t,e){for(var r=e.getMapLayers(),n=0;n=0;r--)t.removeLayer(e[r][1])},o.dispose=function(){var t=this.subplot.map;this._removeLayers(),t.removeSource(this.sourceId)},t.exports=function(t,e){var r=e[0].trace,i=new a(t,r.uid),o=i.sourceId,s=n(e),l=i.below=t.belowLookup["trace-"+r.uid];return t.map.addSource(o,{type:"geojson",data:s.geojson}),i._addLayers(s,l),i}},49789:function(t,e,r){"use strict";var n=r(71828);t.exports=function(t,e){for(var r=0;r"),l.color=function(t,e){var r=t.marker,i=e.mc||r.color,a=e.mlc||r.line.color,o=e.mlw||r.line.width;return n(i)?i:n(a)&&o?a:void 0}(c,h),[l]}}},51759:function(t,e,r){"use strict";t.exports={attributes:r(1285),layoutAttributes:r(10440),supplyDefaults:r(26199).supplyDefaults,crossTraceDefaults:r(26199).crossTraceDefaults,supplyLayoutDefaults:r(93138),calc:r(9532),crossTraceCalc:r(8984),plot:r(80461),style:r(68266).style,hoverPoints:r(63341),eventData:r(34598),selectPoints:r(81974),moduleType:"trace",name:"funnel",basePlotModule:r(93612),categories:["bar-like","cartesian","svg","oriented","showLegend","zoomScale"],meta:{}}},10440:function(t){"use strict";t.exports={funnelmode:{valType:"enumerated",values:["stack","group","overlay"],dflt:"stack",editType:"calc"},funnelgap:{valType:"number",min:0,max:1,editType:"calc"},funnelgroupgap:{valType:"number",min:0,max:1,dflt:0,editType:"calc"}}},93138:function(t,e,r){"use strict";var n=r(71828),i=r(10440);t.exports=function(t,e,r){var a=!1;function o(r,a){return n.coerce(t,e,i,r,a)}for(var s=0;s path").each((function(t){if(!t.isBlank){var e=s.marker;n.select(this).call(a.fill,t.mc||e.color).call(a.stroke,t.mlc||e.line.color).call(i.dashLine,e.line.dash,t.mlw||e.line.width).style("opacity",s.selectedpoints&&!t.selected?o:1)}})),u(r,s,t),r.selectAll(".regions").each((function(){n.select(this).selectAll("path").style("stroke-width",0).call(a.fill,s.connector.fillcolor)})),r.selectAll(".lines").each((function(){var t=s.connector.line;i.lineGroupStyle(n.select(this).selectAll("path"),t.width,t.color,t.dash)}))}))}}},86807:function(t,e,r){"use strict";var n=r(34e3),i=r(9012),a=r(27670).Y,o=r(5386).fF,s=r(5386).si,l=r(1426).extendFlat;t.exports={labels:n.labels,label0:n.label0,dlabel:n.dlabel,values:n.values,marker:{colors:n.marker.colors,line:{color:l({},n.marker.line.color,{dflt:null}),width:l({},n.marker.line.width,{dflt:1}),editType:"calc"},pattern:n.marker.pattern,editType:"calc"},text:n.text,hovertext:n.hovertext,scalegroup:l({},n.scalegroup,{}),textinfo:l({},n.textinfo,{flags:["label","text","value","percent"]}),texttemplate:s({editType:"plot"},{keys:["label","color","value","text","percent"]}),hoverinfo:l({},i.hoverinfo,{flags:["label","text","value","percent","name"]}),hovertemplate:o({},{keys:["label","color","value","text","percent"]}),textposition:l({},n.textposition,{values:["inside","none"],dflt:"inside"}),textfont:n.textfont,insidetextfont:n.insidetextfont,title:{text:n.title.text,font:n.title.font,position:l({},n.title.position,{values:["top left","top center","top right"],dflt:"top center"}),editType:"plot"},domain:a({name:"funnelarea",trace:!0,editType:"calc"}),aspectratio:{valType:"number",min:0,dflt:1,editType:"plot"},baseratio:{valType:"number",min:0,max:1,dflt:.333,editType:"plot"}}},6452:function(t,e,r){"use strict";var n=r(74875);e.name="funnelarea",e.plot=function(t,r,i,a){n.plotBasePlot(e.name,t,r,i,a)},e.clean=function(t,r,i,a){n.cleanBasePlot(e.name,t,r,i,a)}},89574:function(t,e,r){"use strict";var n=r(32354);t.exports={calc:function(t,e){return n.calc(t,e)},crossTraceCalc:function(t){n.crossTraceCalc(t,{type:"funnelarea"})}}},86282:function(t,e,r){"use strict";var n=r(71828),i=r(86807),a=r(27670).c,o=r(90769).handleText,s=r(37434).handleLabelsAndValues,l=r(37434).handleMarkerDefaults;t.exports=function(t,e,r,u){function c(r,a){return n.coerce(t,e,i,r,a)}var f=c("labels"),h=c("values"),p=s(f,h),d=p.len;if(e._hasLabels=p.hasLabels,e._hasValues=p.hasValues,!e._hasLabels&&e._hasValues&&(c("label0"),c("dlabel")),d){e._length=d,l(t,e,u,c),c("scalegroup");var v,g=c("text"),y=c("texttemplate");if(y||(v=c("textinfo",Array.isArray(g)?"text+percent":"percent")),c("hovertext"),c("hovertemplate"),y||v&&"none"!==v){var m=c("textposition");o(t,e,u,c,m,{moduleHasSelected:!1,moduleHasUnselected:!1,moduleHasConstrain:!1,moduleHasCliponaxis:!1,moduleHasTextangle:!1,moduleHasInsideanchor:!1})}a(e,u,c),c("title.text")&&(c("title.position"),n.coerceFont(c,"title.font",u.font)),c("aspectratio"),c("baseratio")}else e.visible=!1}},10421:function(t,e,r){"use strict";t.exports={moduleType:"trace",name:"funnelarea",basePlotModule:r(6452),categories:["pie-like","funnelarea","showLegend"],attributes:r(86807),layoutAttributes:r(80097),supplyDefaults:r(86282),supplyLayoutDefaults:r(57402),calc:r(89574).calc,crossTraceCalc:r(89574).crossTraceCalc,plot:r(79187),style:r(71858),styleOne:r(63463),meta:{}}},80097:function(t,e,r){"use strict";var n=r(92774).hiddenlabels;t.exports={hiddenlabels:n,funnelareacolorway:{valType:"colorlist",editType:"calc"},extendfunnelareacolors:{valType:"boolean",dflt:!0,editType:"calc"}}},57402:function(t,e,r){"use strict";var n=r(71828),i=r(80097);t.exports=function(t,e){function r(r,a){return n.coerce(t,e,i,r,a)}r("hiddenlabels"),r("funnelareacolorway",e.colorway),r("extendfunnelareacolors")}},79187:function(t,e,r){"use strict";var n=r(39898),i=r(91424),a=r(71828),o=a.strScale,s=a.strTranslate,l=r(63893),u=r(17295).toMoveInsideBar,c=r(72597),f=c.recordMinTextSize,h=c.clearMinTextSize,p=r(53581),d=r(14575),v=d.attachFxHandlers,g=d.determineInsideTextFont,y=d.layoutAreas,m=d.prerenderTitles,x=d.positionTitleOutside,b=d.formatSliceLabel;function _(t,e){return"l"+(e[0]-t[0])+","+(e[1]-t[1])}t.exports=function(t,e){var r=t._context.staticPlot,c=t._fullLayout;h("funnelarea",c),m(e,t),y(e,c._size),a.makeTraceGroups(c._funnelarealayer,e,"trace").each((function(e){var h=n.select(this),d=e[0],y=d.trace;!function(t){if(t.length){var e=t[0],r=e.trace,n=r.aspectratio,i=r.baseratio;i>.999&&(i=.999);var a,o,s,l=Math.pow(i,2),u=e.vTotal,c=u,f=u*l/(1-l)/u,h=[];for(h.push(E()),o=t.length-1;o>-1;o--)if(!(s=t[o]).hidden){var p=s.v/c;f+=p,h.push(E())}var d=1/0,v=-1/0;for(o=0;o-1;o--)if(!(s=t[o]).hidden){var M=h[A+=1][0],S=h[A][1];s.TL=[-M,S],s.TR=[M,S],s.BL=T,s.BR=k,s.pxmid=(_=s.TR,w=s.BR,[.5*(_[0]+w[0]),.5*(_[1]+w[1])]),T=s.TL,k=s.TR}}function E(){var t,e={x:t=Math.sqrt(f),y:-t};return[e.x,e.y]}}(e),h.each((function(){var h=n.select(this).selectAll("g.slice").data(e);h.enter().append("g").classed("slice",!0),h.exit().remove(),h.each((function(o,s){if(o.hidden)n.select(this).selectAll("path,g").remove();else{o.pointNumber=o.i,o.curveNumber=y.index;var h=d.cx,m=d.cy,x=n.select(this),w=x.selectAll("path.surface").data([o]);w.enter().append("path").classed("surface",!0).style({"pointer-events":r?"none":"all"}),x.call(v,t,e);var T="M"+(h+o.TR[0])+","+(m+o.TR[1])+_(o.TR,o.BR)+_(o.BR,o.BL)+_(o.BL,o.TL)+"Z";w.attr("d",T),b(t,o,d);var k=p.castOption(y.textposition,o.pts),A=x.selectAll("g.slicetext").data(o.text&&"none"!==k?[0]:[]);A.enter().append("g").classed("slicetext",!0),A.exit().remove(),A.each((function(){var r=a.ensureSingle(n.select(this),"text","",(function(t){t.attr("data-notex",1)})),p=a.ensureUniformFontSize(t,g(y,o,c.font));r.text(o.text).attr({class:"slicetext",transform:"","text-anchor":"middle"}).call(i.font,p).call(l.convertToTspans,t);var d,v,x,b=i.bBox(r.node()),_=Math.min(o.BL[1],o.BR[1])+m,w=Math.max(o.TL[1],o.TR[1])+m;v=Math.max(o.TL[0],o.BL[0])+h,x=Math.min(o.TR[0],o.BR[0])+h,(d=u(v,x,_,w,b,{isHorizontal:!0,constrained:!0,angle:0,anchor:"middle"})).fontSize=p.size,f(y.type,d,c),e[s].transform=d,a.setTransormAndDisplay(r,d)}))}}));var m=n.select(this).selectAll("g.titletext").data(y.title.text?[0]:[]);m.enter().append("g").classed("titletext",!0),m.exit().remove(),m.each((function(){var e=a.ensureSingle(n.select(this),"text","",(function(t){t.attr("data-notex",1)})),r=y.title.text;y._meta&&(r=a.templateString(r,y._meta)),e.text(r).attr({class:"titletext",transform:"","text-anchor":"middle"}).call(i.font,y.title.font).call(l.convertToTspans,t);var u=x(d,c._size);e.attr("transform",s(u.x,u.y)+o(Math.min(1,u.scale))+s(u.tx,u.ty))}))}))}))}},71858:function(t,e,r){"use strict";var n=r(39898),i=r(63463),a=r(72597).resizeText;t.exports=function(t){var e=t._fullLayout._funnelarealayer.selectAll(".trace");a(t,e,"funnelarea"),e.each((function(e){var r=e[0].trace,a=n.select(this);a.style({opacity:r.opacity}),a.selectAll("path.surface").each((function(e){n.select(this).call(i,e,r,t)}))}))}},21606:function(t,e,r){"use strict";var n=r(82196),i=r(9012),a=r(41940),o=r(12663).axisHoverFormat,s=r(5386).fF,l=r(5386).si,u=r(50693),c=r(1426).extendFlat;t.exports=c({z:{valType:"data_array",editType:"calc"},x:c({},n.x,{impliedEdits:{xtype:"array"}}),x0:c({},n.x0,{impliedEdits:{xtype:"scaled"}}),dx:c({},n.dx,{impliedEdits:{xtype:"scaled"}}),y:c({},n.y,{impliedEdits:{ytype:"array"}}),y0:c({},n.y0,{impliedEdits:{ytype:"scaled"}}),dy:c({},n.dy,{impliedEdits:{ytype:"scaled"}}),xperiod:c({},n.xperiod,{impliedEdits:{xtype:"scaled"}}),yperiod:c({},n.yperiod,{impliedEdits:{ytype:"scaled"}}),xperiod0:c({},n.xperiod0,{impliedEdits:{xtype:"scaled"}}),yperiod0:c({},n.yperiod0,{impliedEdits:{ytype:"scaled"}}),xperiodalignment:c({},n.xperiodalignment,{impliedEdits:{xtype:"scaled"}}),yperiodalignment:c({},n.yperiodalignment,{impliedEdits:{ytype:"scaled"}}),text:{valType:"data_array",editType:"calc"},hovertext:{valType:"data_array",editType:"calc"},transpose:{valType:"boolean",dflt:!1,editType:"calc"},xtype:{valType:"enumerated",values:["array","scaled"],editType:"calc+clearAxisTypes"},ytype:{valType:"enumerated",values:["array","scaled"],editType:"calc+clearAxisTypes"},zsmooth:{valType:"enumerated",values:["fast","best",!1],dflt:!1,editType:"calc"},hoverongaps:{valType:"boolean",dflt:!0,editType:"none"},connectgaps:{valType:"boolean",editType:"calc"},xgap:{valType:"number",dflt:0,min:0,editType:"plot"},ygap:{valType:"number",dflt:0,min:0,editType:"plot"},xhoverformat:o("x"),yhoverformat:o("y"),zhoverformat:o("z",1),hovertemplate:s(),texttemplate:l({arrayOk:!1,editType:"plot"},{keys:["x","y","z","text"]}),textfont:a({editType:"plot",autoSize:!0,autoColor:!0,colorEditType:"style"}),showlegend:c({},i.showlegend,{dflt:!1})},{transforms:void 0},u("",{cLetter:"z",autoColorDflt:!1}))},90757:function(t,e,r){"use strict";var n=r(73972),i=r(71828),a=r(89298),o=r(42973),s=r(17562),l=r(78803),u=r(68296),c=r(4742),f=r(824),h=r(43907),p=r(70769),d=r(50606).BADNUM;function v(t){for(var e=[],r=t.length,n=0;n1){var e=(t[t.length-1]-t[0])/(t.length-1),r=Math.abs(e/100);for(k=0;kr)return!1}return!0}(M.rangebreaks||S.rangebreaks)&&(T=function(t,e,r){for(var n=[],i=-1,a=0;a=0;o--)(s=((f[[(r=(a=h[o])[0])-1,i=a[1]]]||v)[2]+(f[[r+1,i]]||v)[2]+(f[[r,i-1]]||v)[2]+(f[[r,i+1]]||v)[2])/20)&&(l[a]=[r,i,s],h.splice(o,1),u=!0);if(!u)throw"findEmpties iterated with no new neighbors";for(a in l)f[a]=l[a],c.push(l[a])}return c.sort((function(t,e){return e[2]-t[2]}))}},46248:function(t,e,r){"use strict";var n=r(30211),i=r(71828),a=r(89298),o=r(21081).extractOpts;t.exports=function(t,e,r,s,l){l||(l={});var u,c,f,h,p=l.isContour,d=t.cd[0],v=d.trace,g=t.xa,y=t.ya,m=d.x,x=d.y,b=d.z,_=d.xCenter,w=d.yCenter,T=d.zmask,k=v.zhoverformat,A=m,M=x;if(!1!==t.index){try{f=Math.round(t.index[1]),h=Math.round(t.index[0])}catch(e){return void i.error("Error hovering on heatmap, pointNumber must be [row,col], found:",t.index)}if(f<0||f>=b[0].length||h<0||h>b.length)return}else{if(n.inbox(e-m[0],e-m[m.length-1],0)>0||n.inbox(r-x[0],r-x[x.length-1],0)>0)return;if(p){var S;for(A=[2*m[0]-m[1]],S=1;Sv&&(y=Math.max(y,Math.abs(t[a][o]-d)/(g-v))))}return y}t.exports=function(t,e){var r,i=1;for(o(t,e),r=0;r.01;r++)i=o(t,e,a(i));return i>.01&&n.log("interp2d didn't converge quickly",i),t}},58623:function(t,e,r){"use strict";var n=r(71828);t.exports=function(t,e){t("texttemplate");var r=n.extendFlat({},e.font,{color:"auto",size:"auto"});n.coerceFont(t,"textfont",r)}},70769:function(t,e,r){"use strict";var n=r(73972),i=r(71828).isArrayOrTypedArray;t.exports=function(t,e,r,a,o,s){var l,u,c,f=[],h=n.traceIs(t,"contour"),p=n.traceIs(t,"histogram"),d=n.traceIs(t,"gl2d");if(i(e)&&e.length>1&&!p&&"category"!==s.type){var v=e.length;if(!(v<=o))return h?e.slice(0,o):e.slice(0,o+1);if(h||d)f=e.slice(0,o);else if(1===o)f=[e[0]-.5,e[0]+.5];else{for(f=[1.5*e[0]-.5*e[1]],c=1;c0;)k=A.c2p(N[C]),C--;for(k0;)L=M.c2p(j[C]),C--;L=A._length||k<=0||E>=M._length||L<=0)return I.selectAll("image").data([]).exit().remove(),void b(I);"fast"===X?(K=Z,$=G):(K=Q,$=tt);var et=document.createElement("canvas");et.width=K,et.height=$;var rt,nt,it=et.getContext("2d"),at=p(z,{noNumericCheck:!0,returnArray:!0});"fast"===X?(rt=Y?function(t){return Z-1-t}:l.identity,nt=W?function(t){return G-1-t}:l.identity):(rt=function(t){return l.constrain(Math.round(A.c2p(N[t])-r),0,Q)},nt=function(t){return l.constrain(Math.round(M.c2p(j[t])-E),0,tt)});var ot,st,lt,ut,ct=nt(0),ft=[ct,ct],ht=Y?0:1,pt=W?0:1,dt=0,vt=0,gt=0,yt=0;function mt(t,e){if(void 0!==t){var r=at(t);return r[0]=Math.round(r[0]),r[1]=Math.round(r[1]),r[2]=Math.round(r[2]),dt+=e,vt+=r[0]*e,gt+=r[1]*e,yt+=r[2]*e,r}return[0,0,0,0]}function xt(t,e,r,n){var i=t[r.bin0];if(void 0===i)return mt(void 0,1);var a,o=t[r.bin1],s=e[r.bin0],l=e[r.bin1],u=o-i||0,c=s-i||0;return a=void 0===o?void 0===l?0:void 0===s?2*(l-i):2*(2*l-s-i)/3:void 0===l?void 0===s?0:2*(2*i-o-s)/3:void 0===s?2*(2*l-o-i)/3:l+i-o-s,mt(i+r.frac*u+n.frac*(c+r.frac*a))}if("default"!==X){var bt,_t=0;try{bt=new Uint8Array(K*$*4)}catch(t){bt=new Array(K*$*4)}if("smooth"===X){var wt,Tt,kt,At=U||N,Mt=V||j,St=new Array(At.length),Et=new Array(Mt.length),Lt=new Array(Q),Ct=U?w:_,Pt=V?w:_;for(C=0;CXt||Xt>M._length))for(P=Gt;PKt||Kt>A._length)){var $t=c({x:Jt,y:Wt},z,t._fullLayout);$t.x=Jt,$t.y=Wt;var Qt=D.z[C][P];void 0===Qt?($t.z="",$t.zLabel=""):($t.z=Qt,$t.zLabel=s.tickText(Ut,Qt,"hover").text);var te=D.text&&D.text[C]&&D.text[C][P];void 0!==te&&!1!==te||(te=""),$t.text=te;var ee=l.texttemplateString(Nt,$t,t._fullLayout._d3locale,$t,z._meta||{});if(ee){var re=ee.split("
"),ne=re.length,ie=0;for(O=0;O0&&(a=!0);for(var l=0;la){var o=a-r[t];return r[t]=a,o}}return 0},max:function(t,e,r,i){var a=i[e];if(n(a)){if(a=Number(a),!n(r[t]))return r[t]=a,a;if(r[t]u?t>o?t>1.1*i?i:t>1.1*a?a:o:t>s?s:t>l?l:u:Math.pow(10,Math.floor(Math.log(t)/Math.LN10))}function p(t,e,r,n,a,s){if(n&&t>o){var l=d(e,a,s),u=d(r,a,s),c=t===i?0:1;return l[c]!==u[c]}return Math.floor(r/t)-Math.floor(e/t)>.1}function d(t,e,r){var n=e.c2d(t,i,r).split("-");return""===n[0]&&(n.unshift(),n[0]="-"+n[0]),n}t.exports=function(t,e,r,n,a){var s,l,u=-1.1*e,h=-.1*e,p=t-h,d=r[0],v=r[1],g=Math.min(f(d+h,d+p,n,a),f(v+h,v+p,n,a)),y=Math.min(f(d+u,d+h,n,a),f(v+u,v+h,n,a));if(g>y&&yo){var m=s===i?1:6,x=s===i?"M12":"M1";return function(e,r){var o=n.c2d(e,i,a),s=o.indexOf("-",m);s>0&&(o=o.substr(0,s));var u=n.d2c(o,0,a);if(ur.r2l(B)&&(j=o.tickIncrement(j,b.size,!0,p)),D.start=r.l2r(j),F||i.nestedProperty(e,y+".start").set(D.start)}var U=b.end,V=r.r2l(I.end),H=void 0!==V;if((b.endFound||H)&&V!==r.r2l(U)){var q=H?V:i.aggNums(Math.max,null,d);D.end=r.l2r(q),H||i.nestedProperty(e,y+".start").set(D.end)}var G="autobin"+s;return!1===e._input[G]&&(e._input[y]=i.extendFlat({},e[y]||{}),delete e._input[G],delete e[G]),[D,d]}t.exports={calc:function(t,e){var r,a,p,d,v=[],g=[],y="h"===e.orientation,m=o.getFromId(t,y?e.yaxis:e.xaxis),x=y?"y":"x",b={x:"y",y:"x"}[x],_=e[x+"calendar"],w=e.cumulative,T=h(t,e,m,x),k=T[0],A=T[1],M="string"==typeof k.size,S=[],E=M?S:k,L=[],C=[],P=[],O=0,I=e.histnorm,D=e.histfunc,z=-1!==I.indexOf("density");w.enabled&&z&&(I=I.replace(/ ?density$/,""),z=!1);var R,F="max"===D||"min"===D?null:0,B=l.count,N=u[I],j=!1,U=function(t){return m.r2c(t,0,_)};for(i.isArrayOrTypedArray(e[b])&&"count"!==D&&(R=e[b],j="avg"===D,B=l[D]),r=U(k.start),p=U(k.end)+(r-o.tickIncrement(r,k.size,!1,_))/1e6;r=0&&d=0;n--)s(n);else if("increasing"===e){for(n=1;n=0;n--)t[n]+=t[n+1];"exclude"===r&&(t.push(0),t.shift())}}(g,w.direction,w.currentbin);var K=Math.min(v.length,g.length),$=[],Q=0,tt=K-1;for(r=0;r=Q;r--)if(g[r]){tt=r;break}for(r=Q;r<=tt;r++)if(n(v[r])&&n(g[r])){var et={p:v[r],s:g[r],b:0};w.enabled||(et.pts=P[r],Z?et.ph0=et.ph1=P[r].length?A[P[r][0]]:v[r]:(e._computePh=!0,et.ph0=q(S[r]),et.ph1=q(S[r+1],!0))),$.push(et)}return 1===$.length&&($[0].width1=o.tickIncrement($[0].p,k.size,!1,_)-$[0].p),s($,e),i.isArrayOrTypedArray(e.selectedpoints)&&i.tagSelected($,e,X),$},calcAllAutoBins:h}},72406:function(t){"use strict";t.exports={eventDataKeys:["binNumber"]}},82222:function(t,e,r){"use strict";var n=r(71828),i=r(41675),a=r(73972).traceIs,o=r(26125),s=n.nestedProperty,l=r(99082).getAxisGroup,u=[{aStr:{x:"xbins.start",y:"ybins.start"},name:"start"},{aStr:{x:"xbins.end",y:"ybins.end"},name:"end"},{aStr:{x:"xbins.size",y:"ybins.size"},name:"size"},{aStr:{x:"nbinsx",y:"nbinsy"},name:"nbins"}],c=["x","y"];t.exports=function(t,e){var r,f,h,p,d,v,g,y=e._histogramBinOpts={},m=[],x={},b=[];function _(t,e){return n.coerce(r._input,r,r._module.attributes,t,e)}function w(t){return"v"===t.orientation?"x":"y"}function T(t,r,a){var o=t.uid+"__"+a;r||(r=o);var s=function(t,r){return i.getFromTrace({_fullLayout:e},t,r).type}(t,a),l=t[a+"calendar"]||"",u=y[r],c=!0;u&&(s===u.axType&&l===u.calendar?(c=!1,u.traces.push(t),u.dirs.push(a)):(r=o,s!==u.axType&&n.warn(["Attempted to group the bins of trace",t.index,"set on a","type:"+s,"axis","with bins on","type:"+u.axType,"axis."].join(" ")),l!==u.calendar&&n.warn(["Attempted to group the bins of trace",t.index,"set with a",l,"calendar","with bins",u.calendar?"on a "+u.calendar+" calendar":"w/o a set calendar"].join(" ")))),c&&(y[r]={traces:[t],dirs:[a],axType:s,calendar:t[a+"calendar"]||""}),t["_"+a+"bingroup"]=r}for(d=0;dS&&T.splice(S,T.length-S),M.length>S&&M.splice(S,M.length-S);var E=[],L=[],C=[],P="string"==typeof w.size,O="string"==typeof A.size,I=[],D=[],z=P?I:w,R=O?D:A,F=0,B=[],N=[],j=e.histnorm,U=e.histfunc,V=-1!==j.indexOf("density"),H="max"===U||"min"===U?null:0,q=a.count,G=o[j],Z=!1,Y=[],W=[],X="z"in e?e.z:"marker"in e&&Array.isArray(e.marker.color)?e.marker.color:"";X&&"count"!==U&&(Z="avg"===U,q=a[U]);var J=w.size,K=x(w.start),$=x(w.end)+(K-i.tickIncrement(K,J,!1,y))/1e6;for(r=K;r<$;r=i.tickIncrement(r,J,!1,y))L.push(H),I.push(r),Z&&C.push(0);I.push(r);var Q,tt=L.length,et=(r-K)/tt,rt=(Q=K+et/2,v.c2r(Q,0,y)),nt=A.size,it=b(A.start),at=b(A.end)+(it-i.tickIncrement(it,nt,!1,m))/1e6;for(r=it;r=0&&p=0&&d-1,flipY:C.tiling.flip.indexOf("y")>-1,orientation:C.tiling.orientation,pad:{inner:C.tiling.pad},maxDepth:C._maxDepth}).descendants(),z=1/0,R=-1/0;D.forEach((function(t){var e=t.depth;e>=C._maxDepth?(t.x0=t.x1=(t.x0+t.x1)/2,t.y0=t.y1=(t.y0+t.y1)/2):(z=Math.min(z,e),R=Math.max(R,e))})),d=d.data(D,c.getPtId),C._maxVisibleLayers=isFinite(R)?R-z+1:0,d.enter().append("g").classed("slice",!0),k(d,p,{},[g,y],b),d.order();var F=null;if(T&&S){var B=c.getPtId(S);d.each((function(t){null===F&&c.getPtId(t)===B&&(F={x0:t.x0,x1:t.x1,y0:t.y0,y1:t.y1})}))}var N=function(){return F||{x0:0,x1:g,y0:0,y1:y}},j=d;return T&&(j=j.transition().each("end",(function(){var e=n.select(this);c.setSliceCursor(e,t,{hideOnRoot:!0,hideOnLeaves:!1,isTransitioning:!1})}))),j.each((function(s){s._x0=m(s.x0),s._x1=m(s.x1),s._y0=x(s.y0),s._y1=x(s.y1),s._hoverX=m(s.x1-C.tiling.pad),s._hoverY=x(I?s.y1-C.tiling.pad/2:s.y0+C.tiling.pad/2);var d=n.select(this),v=i.ensureSingle(d,"path","surface",(function(t){t.style("pointer-events",E?"none":"all")}));T?v.transition().attrTween("d",(function(t){var e=A(t,p,N(),[g,y],{orientation:C.tiling.orientation,flipX:C.tiling.flip.indexOf("x")>-1,flipY:C.tiling.flip.indexOf("y")>-1});return function(t){return b(e(t))}})):v.attr("d",b),d.call(f,r,t,e,{styleOne:l,eventDataKeys:u.eventDataKeys,transitionTime:u.CLICK_TRANSITION_TIME,transitionEasing:u.CLICK_TRANSITION_EASING}).call(c.setSliceCursor,t,{isTransitioning:t._transitioning}),v.call(l,s,C,t,{hovered:!1}),s.x0===s.x1||s.y0===s.y1?s._text="":s._text=h(s,r,C,e,L)||"";var k=i.ensureSingle(d,"g","slicetext"),S=i.ensureSingle(k,"text","",(function(t){t.attr("data-notex",1)})),D=i.ensureUniformFontSize(t,c.determineTextFont(C,s,L.font));S.text(s._text||" ").classed("slicetext",!0).attr("text-anchor",O?"end":P?"start":"middle").call(a.font,D).call(o.convertToTspans,t),s.textBB=a.bBox(S.node()),s.transform=_(s,{fontSize:D.size}),s.transform.fontSize=D.size,T?S.transition().attrTween("transform",(function(t){var e=M(t,p,N(),[g,y]);return function(t){return w(e(t))}})):S.attr("transform",w(s))})),F}},69816:function(t,e,r){"use strict";t.exports={moduleType:"trace",name:"icicle",basePlotModule:r(96346),categories:[],animatable:!0,attributes:r(46291),layoutAttributes:r(92894),supplyDefaults:r(56524),supplyLayoutDefaults:r(21070),calc:r(46584).y,crossTraceCalc:r(46584).T,plot:r(85596),style:r(82454).style,colorbar:r(4898),meta:{}}},92894:function(t){"use strict";t.exports={iciclecolorway:{valType:"colorlist",editType:"calc"},extendiciclecolors:{valType:"boolean",dflt:!0,editType:"calc"}}},21070:function(t,e,r){"use strict";var n=r(71828),i=r(92894);t.exports=function(t,e){function r(r,a){return n.coerce(t,e,i,r,a)}r("iciclecolorway",e.colorway),r("extendiciclecolors")}},21538:function(t,e,r){"use strict";var n=r(674),i=r(14102);t.exports=function(t,e,r){var a=r.flipX,o=r.flipY,s="h"===r.orientation,l=r.maxDepth,u=e[0],c=e[1];l&&(u=(t.height+1)*e[0]/Math.min(t.height+1,l),c=(t.height+1)*e[1]/Math.min(t.height+1,l));var f=n.partition().padding(r.pad.inner).size(s?[e[1],u]:[e[0],c])(t);return(s||a||o)&&i(f,e,{swapXY:s,flipX:a,flipY:o}),f}},85596:function(t,e,r){"use strict";var n=r(80694),i=r(90666);t.exports=function(t,e,r,a){return n(t,e,r,a,{type:"icicle",drawDescendants:i})}},82454:function(t,e,r){"use strict";var n=r(39898),i=r(7901),a=r(71828),o=r(72597).resizeText,s=r(43467);function l(t,e,r,n){var o=e.data.data,l=!e.children,u=o.i,c=a.castOption(r,u,"marker.line.color")||i.defaultLine,f=a.castOption(r,u,"marker.line.width")||0;t.call(s,e,r,n).style("stroke-width",f).call(i.stroke,c).style("opacity",l?r.leaf.opacity:null)}t.exports={style:function(t){var e=t._fullLayout._iciclelayer.selectAll(".trace");o(t,e,"icicle"),e.each((function(e){var r=n.select(this),i=e[0].trace;r.style("opacity",i.opacity),r.selectAll("path.surface").each((function(e){n.select(this).call(l,e,i,t)}))}))},styleOne:l}},17230:function(t,e,r){"use strict";for(var n=r(9012),i=r(5386).fF,a=r(1426).extendFlat,o=r(51877).colormodel,s=["rgb","rgba","rgba256","hsl","hsla"],l=[],u=[],c=0;c0||n.inbox(r-o.y0,r-(o.y0+o.h*s.dy),0)>0)){var c,f=Math.floor((e-o.x0)/s.dx),h=Math.floor(Math.abs(r-o.y0)/s.dy);if(s._hasZ?c=o.z[h][f]:s._hasSource&&(c=s._canvas.el.getContext("2d",{willReadFrequently:!0}).getImageData(f,h,1,1).data),c){var p,d=o.hi||s.hoverinfo;if(d){var v=d.split("+");-1!==v.indexOf("all")&&(v=["color"]),-1!==v.indexOf("color")&&(p=!0)}var g,y=a.colormodel[s.colormodel],m=y.colormodel||s.colormodel,x=m.length,b=s._scaler(c),_=y.suffix,w=[];(s.hovertemplate||p)&&(w.push("["+[b[0]+_[0],b[1]+_[1],b[2]+_[2]].join(", ")),4===x&&w.push(", "+b[3]+_[3]),w.push("]"),w=w.join(""),t.extraText=m.toUpperCase()+": "+w),Array.isArray(s.hovertext)&&Array.isArray(s.hovertext[h])?g=s.hovertext[h][f]:Array.isArray(s.text)&&Array.isArray(s.text[h])&&(g=s.text[h][f]);var T=u.c2p(o.y0+(h+.5)*s.dy),k=o.x0+(f+.5)*s.dx,A=o.y0+(h+.5)*s.dy,M="["+c.slice(0,s.colormodel.length).join(", ")+"]";return[i.extendFlat(t,{index:[h,f],x0:l.c2p(o.x0+f*s.dx),x1:l.c2p(o.x0+(f+1)*s.dx),y0:T,y1:T,color:b,xVal:k,xLabelVal:k,yVal:A,yLabelVal:A,zLabelVal:M,text:g,hovertemplateLabels:{zLabel:M,colorLabel:w,"color[0]Label":b[0]+_[0],"color[1]Label":b[1]+_[1],"color[2]Label":b[2]+_[2],"color[3]Label":b[3]+_[3]}})]}}}},94507:function(t,e,r){"use strict";t.exports={attributes:r(17230),supplyDefaults:r(13245),calc:r(71113),plot:r(60775),style:r(12826),hoverPoints:r(28749),eventData:r(30835),moduleType:"trace",name:"image",basePlotModule:r(93612),categories:["cartesian","svg","2dMap","noSortingByValue"],animatable:!1,meta:{}}},60775:function(t,e,r){"use strict";var n=r(39898),i=r(71828),a=i.strTranslate,o=r(77922),s=r(51877),l=r(3883),u=r(32396).STYLE;t.exports=function(t,e,r,c){var f=e.xaxis,h=e.yaxis,p=!t._context._exportedPlot&&l();i.makeTraceGroups(c,r,"im").each((function(e){var r=n.select(this),l=e[0],c=l.trace,d=("fast"===c.zsmooth||!1===c.zsmooth&&p)&&!c._hasZ&&c._hasSource&&"linear"===f.type&&"linear"===h.type;c._realImage=d;var v,g,y,m,x,b,_=l.z,w=l.x0,T=l.y0,k=l.w,A=l.h,M=c.dx,S=c.dy;for(b=0;void 0===v&&b0;)g=f.c2p(w+b*M),b--;for(b=0;void 0===m&&b0;)x=h.c2p(T+b*S),b--;gI[0];if(D||z){var R=v+E/2,F=m+L/2;P+="transform:"+a(R+"px",F+"px")+"scale("+(D?-1:1)+","+(z?-1:1)+")"+a(-R+"px",-F+"px")+";"}}C.attr("style",P);var B=new Promise((function(t){if(c._hasZ)t();else if(c._hasSource)if(c._canvas&&c._canvas.el.width===k&&c._canvas.el.height===A&&c._canvas.source===c.source)t();else{var e=document.createElement("canvas");e.width=k,e.height=A;var r=e.getContext("2d",{willReadFrequently:!0});c._image=c._image||new Image;var n=c._image;n.onload=function(){r.drawImage(n,0,0),c._canvas={el:e,source:c.source},t()},n.setAttribute("src",c.source)}})).then((function(){var t,e;if(c._hasZ)e=N((function(t,e){return _[e][t]})),t=e.toDataURL("image/png");else if(c._hasSource)if(d)t=c.source;else{var r=c._canvas.el.getContext("2d",{willReadFrequently:!0}).getImageData(0,0,k,A).data;e=N((function(t,e){var n=4*(e*k+t);return[r[n],r[n+1],r[n+2],r[n+3]]})),t=e.toDataURL("image/png")}C.attr({"xlink:href":t,height:L,width:E,x:v,y:m})}));t._promises.push(B)}function N(t){var e=document.createElement("canvas");e.width=E,e.height=L;var r,n=e.getContext("2d",{willReadFrequently:!0}),a=function(t){return i.constrain(Math.round(f.c2p(w+t*M)-v),0,E)},o=function(t){return i.constrain(Math.round(h.c2p(T+t*S)-m),0,L)},u=s.colormodel[c.colormodel],p=u.colormodel||c.colormodel,d=u.fmt;for(b=0;b0}function T(t){t.each((function(t){m.stroke(n.select(this),t.line.color)})).each((function(t){m.fill(n.select(this),t.color)})).style("stroke-width",(function(t){return t.line.width}))}function k(t,e,r){var n=t._fullLayout,i=o.extendFlat({type:"linear",ticks:"outside",range:r,showline:!0},e),a={type:"linear",_id:"x"+e._id},s={letter:"x",font:n.font,noHover:!0,noTickson:!0};function l(t,e){return o.coerce(i,a,y,t,e)}return v(i,a,l,s,n),g(i,a,l,s),a}function A(t,e,r){return[Math.min(e/t.width,r/t.height),t,e+"x"+r]}function M(t,e,r,i){var a=document.createElementNS("http://www.w3.org/2000/svg","text"),o=n.select(a);return o.text(t).attr("x",0).attr("y",0).attr("text-anchor",r).attr("data-unformatted",t).call(p.convertToTspans,i).call(f.font,e),f.bBox(o.node())}function S(t,e,r,n,i,a){var s="_cache"+e;t[s]&&t[s].key===i||(t[s]={key:i,value:r});var l=o.aggNums(a,null,[t[s].value,n],2);return t[s].value=l,l}t.exports=function(t,e,r,v){var g,y=t._fullLayout;w(r)&&v&&(g=v()),o.makeTraceGroups(y._indicatorlayer,e,"trace").each((function(e){var v,E,L,C,P,O=e[0].trace,I=n.select(this),D=O._hasGauge,z=O._isAngular,R=O._isBullet,F=O.domain,B={w:y._size.w*(F.x[1]-F.x[0]),h:y._size.h*(F.y[1]-F.y[0]),l:y._size.l+y._size.w*F.x[0],r:y._size.r+y._size.w*(1-F.x[1]),t:y._size.t+y._size.h*(1-F.y[1]),b:y._size.b+y._size.h*F.y[0]},N=B.l+B.w/2,j=B.t+B.h/2,U=Math.min(B.w/2,B.h),V=h.innerRadius*U,H=O.align||"center";if(E=j,D){if(z&&(v=N,E=j+U/2,L=function(t){return function(t,e){return[e/Math.sqrt(t.width/2*(t.width/2)+t.height*t.height),t,e]}(t,.9*V)}),R){var q=h.bulletPadding,G=1-h.bulletNumberDomainSize+q;v=B.l+(G+(1-G)*b[H])*B.w,L=function(t){return A(t,(h.bulletNumberDomainSize-q)*B.w,B.h)}}}else v=B.l+b[H]*B.w,L=function(t){return A(t,B.w,B.h)};!function(t,e,r,i){var u,c,h,v=r[0].trace,g=i.numbersX,y=i.numbersY,T=v.align||"center",A=x[T],E=i.transitionOpts,L=i.onComplete,C=o.ensureSingle(e,"g","numbers"),P=[];v._hasNumber&&P.push("number"),v._hasDelta&&(P.push("delta"),"left"===v.delta.position&&P.reverse());var O=C.selectAll("text").data(P);function I(e,r,n,i){if(!e.match("s")||n>=0==i>=0||r(n).slice(-1).match(_)||r(i).slice(-1).match(_))return r;var a=e.slice().replace("s","f").replace(/\d+/,(function(t){return parseInt(t)-1})),o=k(t,{tickformat:a});return function(t){return Math.abs(t)<1?d.tickText(o,t).text:r(t)}}O.enter().append("text"),O.attr("text-anchor",(function(){return A})).attr("class",(function(t){return t})).attr("x",null).attr("y",null).attr("dx",null).attr("dy",null),O.exit().remove();var D,z=v.mode+v.align;if(v._hasDelta&&(D=function(){var e=k(t,{tickformat:v.delta.valueformat},v._range);e.setScale(),d.prepTicks(e);var i=function(t){return d.tickText(e,t).text},o=v.delta.suffix,s=v.delta.prefix,l=function(t){return v.delta.relative?t.relativeDelta:t.delta},u=function(t,e){return 0===t||"number"!=typeof t||isNaN(t)?"-":(t>0?v.delta.increasing.symbol:v.delta.decreasing.symbol)+s+e(t)+o},h=function(t){return t.delta>=0?v.delta.increasing.color:v.delta.decreasing.color};void 0===v._deltaLastValue&&(v._deltaLastValue=l(r[0]));var g=C.select("text.delta");function y(){g.text(u(l(r[0]),i)).call(m.fill,h(r[0])).call(p.convertToTspans,t)}return g.call(f.font,v.delta.font).call(m.fill,h({delta:v._deltaLastValue})),w(E)?g.transition().duration(E.duration).ease(E.easing).tween("text",(function(){var t=n.select(this),e=l(r[0]),o=v._deltaLastValue,s=I(v.delta.valueformat,i,o,e),c=a(o,e);return v._deltaLastValue=e,function(e){t.text(u(c(e),s)),t.call(m.fill,h({delta:c(e)}))}})).each("end",(function(){y(),L&&L()})).each("interrupt",(function(){y(),L&&L()})):y(),c=M(u(l(r[0]),i),v.delta.font,A,t),g}(),z+=v.delta.position+v.delta.font.size+v.delta.font.family+v.delta.valueformat,z+=v.delta.increasing.symbol+v.delta.decreasing.symbol,h=c),v._hasNumber&&(function(){var e=k(t,{tickformat:v.number.valueformat},v._range);e.setScale(),d.prepTicks(e);var i=function(t){return d.tickText(e,t).text},o=v.number.suffix,s=v.number.prefix,l=C.select("text.number");function c(){var e="number"==typeof r[0].y?s+i(r[0].y)+o:"-";l.text(e).call(f.font,v.number.font).call(p.convertToTspans,t)}w(E)?l.transition().duration(E.duration).ease(E.easing).each("end",(function(){c(),L&&L()})).each("interrupt",(function(){c(),L&&L()})).attrTween("text",(function(){var t=n.select(this),e=a(r[0].lastY,r[0].y);v._lastValue=r[0].y;var l=I(v.number.valueformat,i,r[0].lastY,r[0].y);return function(r){t.text(s+l(e(r))+o)}})):c(),u=M(s+i(r[0].y)+o,v.number.font,A,t)}(),z+=v.number.font.size+v.number.font.family+v.number.valueformat+v.number.suffix+v.number.prefix,h=u),v._hasDelta&&v._hasNumber){var R,F,B=[(u.left+u.right)/2,(u.top+u.bottom)/2],N=[(c.left+c.right)/2,(c.top+c.bottom)/2],j=.75*v.delta.font.size;"left"===v.delta.position&&(R=S(v,"deltaPos",0,-1*(u.width*b[v.align]+c.width*(1-b[v.align])+j),z,Math.min),F=B[1]-N[1],h={width:u.width+c.width+j,height:Math.max(u.height,c.height),left:c.left+R,right:u.right,top:Math.min(u.top,c.top+F),bottom:Math.max(u.bottom,c.bottom+F)}),"right"===v.delta.position&&(R=S(v,"deltaPos",0,u.width*(1-b[v.align])+c.width*b[v.align]+j,z,Math.max),F=B[1]-N[1],h={width:u.width+c.width+j,height:Math.max(u.height,c.height),left:u.left,right:c.right+R,top:Math.min(u.top,c.top+F),bottom:Math.max(u.bottom,c.bottom+F)}),"bottom"===v.delta.position&&(R=null,F=c.height,h={width:Math.max(u.width,c.width),height:u.height+c.height,left:Math.min(u.left,c.left),right:Math.max(u.right,c.right),top:u.bottom-u.height,bottom:u.bottom+c.height}),"top"===v.delta.position&&(R=null,F=u.top,h={width:Math.max(u.width,c.width),height:u.height+c.height,left:Math.min(u.left,c.left),right:Math.max(u.right,c.right),top:u.bottom-u.height-c.height,bottom:u.bottom}),D.attr({dx:R,dy:F})}(v._hasNumber||v._hasDelta)&&C.attr("transform",(function(){var t=i.numbersScaler(h);z+=t[2];var e,r=S(v,"numbersScale",1,t[0],z,Math.min);v._scaleNumbers||(r=1),e=v._isAngular?y-r*h.bottom:y-r*(h.top+h.bottom)/2,v._numbersTop=r*h.top+e;var n=h[T];"center"===T&&(n=(h.left+h.right)/2);var a=g-r*n;return a=S(v,"numbersTranslate",0,a,z,Math.max),l(a,e)+s(r)}))}(t,I,e,{numbersX:v,numbersY:E,numbersScaler:L,transitionOpts:r,onComplete:g}),D&&(C={range:O.gauge.axis.range,color:O.gauge.bgcolor,line:{color:O.gauge.bordercolor,width:0},thickness:1},P={range:O.gauge.axis.range,color:"rgba(0, 0, 0, 0)",line:{color:O.gauge.bordercolor,width:O.gauge.borderwidth},thickness:1});var Z=I.selectAll("g.angular").data(z?e:[]);Z.exit().remove();var Y=I.selectAll("g.angularaxis").data(z?e:[]);Y.exit().remove(),z&&function(t,e,r,a){var o,s,f,h,p=r[0].trace,v=a.size,g=a.radius,y=a.innerRadius,m=a.gaugeBg,x=a.gaugeOutline,b=[v.l+v.w/2,v.t+v.h/2+g/2],_=a.gauge,A=a.layer,M=a.transitionOpts,S=a.onComplete,E=Math.PI/2;function L(t){var e=p.gauge.axis.range[0],r=(t-e)/(p.gauge.axis.range[1]-e)*Math.PI-E;return r<-E?-E:r>E?E:r}function C(t){return n.svg.arc().innerRadius((y+g)/2-t/2*(g-y)).outerRadius((y+g)/2+t/2*(g-y)).startAngle(-E)}function P(t){t.attr("d",(function(t){return C(t.thickness).startAngle(L(t.range[0])).endAngle(L(t.range[1]))()}))}_.enter().append("g").classed("angular",!0),_.attr("transform",l(b[0],b[1])),A.enter().append("g").classed("angularaxis",!0).classed("crisp",!0),A.selectAll("g.xangularaxistick,path,text").remove(),(o=k(t,p.gauge.axis)).type="linear",o.range=p.gauge.axis.range,o._id="xangularaxis",o.ticklabeloverflow="allow",o.setScale();var O=function(t){return(o.range[0]-t.x)/(o.range[1]-o.range[0])*Math.PI+Math.PI},I={},D=d.makeLabelFns(o,0).labelStandoff;I.xFn=function(t){var e=O(t);return Math.cos(e)*D},I.yFn=function(t){var e=O(t),r=Math.sin(e)>0?.2:1;return-Math.sin(e)*(D+t.fontSize*r)+Math.abs(Math.cos(e))*(t.fontSize*c)},I.anchorFn=function(t){var e=O(t),r=Math.cos(e);return Math.abs(r)<.1?"middle":r>0?"start":"end"},I.heightFn=function(t,e,r){var n=O(t);return-.5*(1+Math.sin(n))*r};var z=function(t){return l(b[0]+g*Math.cos(t),b[1]-g*Math.sin(t))};f=function(t){return z(O(t))};if(s=d.calcTicks(o),h=d.getTickSigns(o)[2],o.visible){h="inside"===o.ticks?-1:1;var R=(o.linewidth||1)/2;d.drawTicks(t,o,{vals:s,layer:A,path:"M"+h*R+",0h"+h*o.ticklen,transFn:function(t){var e=O(t);return z(e)+"rotate("+-u(e)+")"}}),d.drawLabels(t,o,{vals:s,layer:A,transFn:f,labelFns:I})}var F=[m].concat(p.gauge.steps),B=_.selectAll("g.bg-arc").data(F);B.enter().append("g").classed("bg-arc",!0).append("path"),B.select("path").call(P).call(T),B.exit().remove();var N=C(p.gauge.bar.thickness),j=_.selectAll("g.value-arc").data([p.gauge.bar]);j.enter().append("g").classed("value-arc",!0).append("path");var U,V,H,q=j.select("path");w(M)?(q.transition().duration(M.duration).ease(M.easing).each("end",(function(){S&&S()})).each("interrupt",(function(){S&&S()})).attrTween("d",(U=N,V=L(r[0].lastY),H=L(r[0].y),function(){var t=i(V,H);return function(e){return U.endAngle(t(e))()}})),p._lastValue=r[0].y):q.attr("d","number"==typeof r[0].y?N.endAngle(L(r[0].y)):"M0,0Z"),q.call(T),j.exit().remove(),F=[];var G=p.gauge.threshold.value;(G||0===G)&&F.push({range:[G,G],color:p.gauge.threshold.color,line:{color:p.gauge.threshold.line.color,width:p.gauge.threshold.line.width},thickness:p.gauge.threshold.thickness});var Z=_.selectAll("g.threshold-arc").data(F);Z.enter().append("g").classed("threshold-arc",!0).append("path"),Z.select("path").call(P).call(T),Z.exit().remove();var Y=_.selectAll("g.gauge-outline").data([x]);Y.enter().append("g").classed("gauge-outline",!0).append("path"),Y.select("path").call(P).call(T),Y.exit().remove()}(t,0,e,{radius:U,innerRadius:V,gauge:Z,layer:Y,size:B,gaugeBg:C,gaugeOutline:P,transitionOpts:r,onComplete:g});var W=I.selectAll("g.bullet").data(R?e:[]);W.exit().remove();var X=I.selectAll("g.bulletaxis").data(R?e:[]);X.exit().remove(),R&&function(t,e,r,n){var i,a,o,s,u,c=r[0].trace,f=n.gauge,p=n.layer,v=n.gaugeBg,g=n.gaugeOutline,y=n.size,x=c.domain,b=n.transitionOpts,_=n.onComplete;f.enter().append("g").classed("bullet",!0),f.attr("transform",l(y.l,y.t)),p.enter().append("g").classed("bulletaxis",!0).classed("crisp",!0),p.selectAll("g.xbulletaxistick,path,text").remove();var A=y.h,M=c.gauge.bar.thickness*A,S=x.x[0],E=x.x[0]+(x.x[1]-x.x[0])*(c._hasNumber||c._hasDelta?1-h.bulletNumberDomainSize:1);function L(t){t.attr("width",(function(t){return Math.max(0,i.c2p(t.range[1])-i.c2p(t.range[0]))})).attr("x",(function(t){return i.c2p(t.range[0])})).attr("y",(function(t){return.5*(1-t.thickness)*A})).attr("height",(function(t){return t.thickness*A}))}(i=k(t,c.gauge.axis))._id="xbulletaxis",i.domain=[S,E],i.setScale(),a=d.calcTicks(i),o=d.makeTransTickFn(i),s=d.getTickSigns(i)[2],u=y.t+y.h,i.visible&&(d.drawTicks(t,i,{vals:"inside"===i.ticks?d.clipEnds(i,a):a,layer:p,path:d.makeTickPath(i,u,s),transFn:o}),d.drawLabels(t,i,{vals:a,layer:p,transFn:o,labelFns:d.makeLabelFns(i,u)}));var C=[v].concat(c.gauge.steps),P=f.selectAll("g.bg-bullet").data(C);P.enter().append("g").classed("bg-bullet",!0).append("rect"),P.select("rect").call(L).call(T),P.exit().remove();var O=f.selectAll("g.value-bullet").data([c.gauge.bar]);O.enter().append("g").classed("value-bullet",!0).append("rect"),O.select("rect").attr("height",M).attr("y",(A-M)/2).call(T),w(b)?O.select("rect").transition().duration(b.duration).ease(b.easing).each("end",(function(){_&&_()})).each("interrupt",(function(){_&&_()})).attr("width",Math.max(0,i.c2p(Math.min(c.gauge.axis.range[1],r[0].y)))):O.select("rect").attr("width","number"==typeof r[0].y?Math.max(0,i.c2p(Math.min(c.gauge.axis.range[1],r[0].y))):0),O.exit().remove();var I=r.filter((function(){return c.gauge.threshold.value||0===c.gauge.threshold.value})),D=f.selectAll("g.threshold-bullet").data(I);D.enter().append("g").classed("threshold-bullet",!0).append("line"),D.select("line").attr("x1",i.c2p(c.gauge.threshold.value)).attr("x2",i.c2p(c.gauge.threshold.value)).attr("y1",(1-c.gauge.threshold.thickness)/2*A).attr("y2",(1-(1-c.gauge.threshold.thickness)/2)*A).call(m.stroke,c.gauge.threshold.line.color).style("stroke-width",c.gauge.threshold.line.width),D.exit().remove();var z=f.selectAll("g.gauge-outline").data([g]);z.enter().append("g").classed("gauge-outline",!0).append("rect"),z.select("rect").call(L).call(T),z.exit().remove()}(t,0,e,{gauge:W,layer:X,size:B,gaugeBg:C,gaugeOutline:P,transitionOpts:r,onComplete:g});var J=I.selectAll("text.title").data(e);J.exit().remove(),J.enter().append("text").classed("title",!0),J.attr("text-anchor",(function(){return R?x.right:x[O.title.align]})).text(O.title.text).call(f.font,O.title.font).call(p.convertToTspans,t),J.attr("transform",(function(){var t,e=B.l+B.w*b[O.title.align],r=h.titlePadding,n=f.bBox(J.node());return D?(z&&(t=O.gauge.axis.visible?f.bBox(Y.node()).top-r-n.bottom:B.t+B.h/2-U/2-n.bottom-r),R&&(t=E-(n.top+n.bottom)/2,e=B.l-h.bulletPadding*B.w)):t=O._numbersTop-r-n.bottom,l(e,t)}))}))}},16249:function(t,e,r){"use strict";var n=r(50693),i=r(12663).axisHoverFormat,a=r(5386).fF,o=r(2418),s=r(9012),l=r(1426).extendFlat,u=r(30962).overrideAll,c=t.exports=u(l({x:{valType:"data_array"},y:{valType:"data_array"},z:{valType:"data_array"},value:{valType:"data_array"},isomin:{valType:"number"},isomax:{valType:"number"},surface:{show:{valType:"boolean",dflt:!0},count:{valType:"integer",dflt:2,min:1},fill:{valType:"number",min:0,max:1,dflt:1},pattern:{valType:"flaglist",flags:["A","B","C","D","E"],extras:["all","odd","even"],dflt:"all"}},spaceframe:{show:{valType:"boolean",dflt:!1},fill:{valType:"number",min:0,max:1,dflt:.15}},slices:{x:{show:{valType:"boolean",dflt:!1},locations:{valType:"data_array",dflt:[]},fill:{valType:"number",min:0,max:1,dflt:1}},y:{show:{valType:"boolean",dflt:!1},locations:{valType:"data_array",dflt:[]},fill:{valType:"number",min:0,max:1,dflt:1}},z:{show:{valType:"boolean",dflt:!1},locations:{valType:"data_array",dflt:[]},fill:{valType:"number",min:0,max:1,dflt:1}}},caps:{x:{show:{valType:"boolean",dflt:!0},fill:{valType:"number",min:0,max:1,dflt:1}},y:{show:{valType:"boolean",dflt:!0},fill:{valType:"number",min:0,max:1,dflt:1}},z:{show:{valType:"boolean",dflt:!0},fill:{valType:"number",min:0,max:1,dflt:1}}},text:{valType:"string",dflt:"",arrayOk:!0},hovertext:{valType:"string",dflt:"",arrayOk:!0},hovertemplate:a(),xhoverformat:i("x"),yhoverformat:i("y"),zhoverformat:i("z"),valuehoverformat:i("value",1),showlegend:l({},s.showlegend,{dflt:!1})},n("",{colorAttr:"`value`",showScaleDflt:!0,editTypeOverride:"calc"}),{opacity:o.opacity,lightposition:o.lightposition,lighting:o.lighting,flatshading:o.flatshading,contour:o.contour,hoverinfo:l({},s.hoverinfo)}),"calc","nested");c.flatshading.dflt=!0,c.lighting.facenormalsepsilon.dflt=0,c.x.editType=c.y.editType=c.z.editType=c.value.editType="calc+clearAxisTypes",c.transforms=void 0},56959:function(t,e,r){"use strict";var n=r(78803),i=r(88489).processGrid,a=r(88489).filter;t.exports=function(t,e){e._len=Math.min(e.x.length,e.y.length,e.z.length,e.value.length),e._x=a(e.x,e._len),e._y=a(e.y,e._len),e._z=a(e.z,e._len),e._value=a(e.value,e._len);var r=i(e);e._gridFill=r.fill,e._Xs=r.Xs,e._Ys=r.Ys,e._Zs=r.Zs,e._len=r.len;for(var o=1/0,s=-1/0,l=0;l0;r--){var n=Math.min(e[r],e[r-1]),i=Math.max(e[r],e[r-1]);if(i>n&&n-1}function R(t,e){return null===t?e:t}function F(e,r,n){C();var i,a,o,l=[r],u=[n];if(s>=1)l=[r],u=[n];else if(s>0){var c=function(t,e){var r=t[0],n=t[1],i=t[2],a=function(t,e,r){for(var n=[],i=0;i-1?n[p]:L(d,v,y);h[p]=x>-1?x:O(d,v,y,R(e,m))}i=h[0],a=h[1],o=h[2],t._meshI.push(i),t._meshJ.push(a),t._meshK.push(o),++g}}function B(t,e,r,n){var i=t[3];in&&(i=n);for(var a=(t[3]-i)/(t[3]-e[3]+1e-9),o=[],s=0;s<4;s++)o[s]=(1-a)*t[s]+a*e[s];return o}function N(t,e,r){return t>=e&&t<=r}function j(t){var e=.001*(E-S);return t>=S-e&&t<=E+e}function U(e){for(var r=[],n=0;n<4;n++){var i=e[n];r.push([t._x[i],t._y[i],t._z[i],t._value[i]])}return r}var V=3;function H(t,e,r,n,i,a){a||(a=1),r=[-1,-1,-1];var o=!1,s=[N(e[0][3],n,i),N(e[1][3],n,i),N(e[2][3],n,i)];if(!s[0]&&!s[1]&&!s[2])return!1;var l=function(t,e,r){return j(e[0][3])&&j(e[1][3])&&j(e[2][3])?(F(t,e,r),!0):aMath.abs(L-M)?[A,L]:[L,M];d=!0,Q(r,C[0],C[1]),d=!1}}var I=[[Math.min(S,M),Math.max(S,M)],[Math.min(A,E),Math.max(A,E)]];["x","y","z"].forEach((function(r){for(var n=[],i=0;i0&&(f.push(d.id),"x"===r?h.push([d.distRatio,0,0]):"y"===r?h.push([0,d.distRatio,0]):h.push([0,0,d.distRatio]))}else c=nt(1,"x"===r?b-1:"y"===r?_-1:w-1);f.length>0&&(n[a]="x"===r?tt(e,f,o,s,h,n[a]):"y"===r?et(e,f,o,s,h,n[a]):rt(e,f,o,s,h,n[a]),a++),c.length>0&&(n[a]="x"===r?J(e,c,o,s,n[a]):"y"===r?K(e,c,o,s,n[a]):$(e,c,o,s,n[a]),a++)}var v=t.caps[r];v.show&&v.fill&&(D(v.fill),n[a]="x"===r?J(e,[0,b-1],o,s,n[a]):"y"===r?K(e,[0,_-1],o,s,n[a]):$(e,[0,w-1],o,s,n[a]),a++)}})),0===g&&P(),t._meshX=n,t._meshY=i,t._meshZ=a,t._meshIntensity=o,t._Xs=y,t._Ys=m,t._Zs=x}(),t}t.exports={findNearestOnAxis:l,generateIsoMeshes:h,createIsosurfaceTrace:function(t,e){var r=t.glplot.gl,i=n({gl:r}),a=new u(t,i,e.uid);return i._trace=a,a.update(e),t.glplot.add(i),a}}},82738:function(t,e,r){"use strict";var n=r(71828),i=r(73972),a=r(16249),o=r(1586);function s(t,e,r,n,a){var s=a("isomin"),l=a("isomax");null!=l&&null!=s&&s>l&&(e.isomin=null,e.isomax=null);var u=a("x"),c=a("y"),f=a("z"),h=a("value");u&&u.length&&c&&c.length&&f&&f.length&&h&&h.length?(i.getComponentMethod("calendars","handleTraceDefaults")(t,e,["x","y","z"],n),a("valuehoverformat"),["x","y","z"].forEach((function(t){a(t+"hoverformat");var e="caps."+t;a(e+".show")&&a(e+".fill");var r="slices."+t;a(r+".show")&&(a(r+".fill"),a(r+".locations"))})),a("spaceframe.show")&&a("spaceframe.fill"),a("surface.show")&&(a("surface.count"),a("surface.fill"),a("surface.pattern")),a("contour.show")&&(a("contour.color"),a("contour.width")),["text","hovertext","hovertemplate","lighting.ambient","lighting.diffuse","lighting.specular","lighting.roughness","lighting.fresnel","lighting.vertexnormalsepsilon","lighting.facenormalsepsilon","lightposition.x","lightposition.y","lightposition.z","flatshading","opacity"].forEach((function(t){a(t)})),o(t,e,n,a,{prefix:"",cLetter:"c"}),e._length=null):e.visible=!1}t.exports={supplyDefaults:function(t,e,r,i){s(t,e,0,i,(function(r,i){return n.coerce(t,e,a,r,i)}))},supplyIsoDefaults:s}},64943:function(t,e,r){"use strict";t.exports={attributes:r(16249),supplyDefaults:r(82738).supplyDefaults,calc:r(56959),colorbar:{min:"cmin",max:"cmax"},plot:r(22674).createIsosurfaceTrace,moduleType:"trace",name:"isosurface",basePlotModule:r(58547),categories:["gl3d","showLegend"],meta:{}}},2418:function(t,e,r){"use strict";var n=r(50693),i=r(12663).axisHoverFormat,a=r(5386).fF,o=r(54532),s=r(9012),l=r(1426).extendFlat;t.exports=l({x:{valType:"data_array",editType:"calc+clearAxisTypes"},y:{valType:"data_array",editType:"calc+clearAxisTypes"},z:{valType:"data_array",editType:"calc+clearAxisTypes"},i:{valType:"data_array",editType:"calc"},j:{valType:"data_array",editType:"calc"},k:{valType:"data_array",editType:"calc"},text:{valType:"string",dflt:"",arrayOk:!0,editType:"calc"},hovertext:{valType:"string",dflt:"",arrayOk:!0,editType:"calc"},hovertemplate:a({editType:"calc"}),xhoverformat:i("x"),yhoverformat:i("y"),zhoverformat:i("z"),delaunayaxis:{valType:"enumerated",values:["x","y","z"],dflt:"z",editType:"calc"},alphahull:{valType:"number",dflt:-1,editType:"calc"},intensity:{valType:"data_array",editType:"calc"},intensitymode:{valType:"enumerated",values:["vertex","cell"],dflt:"vertex",editType:"calc"},color:{valType:"color",editType:"calc"},vertexcolor:{valType:"data_array",editType:"calc"},facecolor:{valType:"data_array",editType:"calc"},transforms:void 0},n("",{colorAttr:"`intensity`",showScaleDflt:!0,editTypeOverride:"calc"}),{opacity:o.opacity,flatshading:{valType:"boolean",dflt:!1,editType:"calc"},contour:{show:l({},o.contours.x.show,{}),color:o.contours.x.color,width:o.contours.x.width,editType:"calc"},lightposition:{x:l({},o.lightposition.x,{dflt:1e5}),y:l({},o.lightposition.y,{dflt:1e5}),z:l({},o.lightposition.z,{dflt:0}),editType:"calc"},lighting:l({vertexnormalsepsilon:{valType:"number",min:0,max:1,dflt:1e-12,editType:"calc"},facenormalsepsilon:{valType:"number",min:0,max:1,dflt:1e-6,editType:"calc"},editType:"calc"},o.lighting),hoverinfo:l({},s.hoverinfo,{editType:"calc"}),showlegend:l({},s.showlegend,{dflt:!1})})},82932:function(t,e,r){"use strict";var n=r(78803);t.exports=function(t,e){e.intensity&&n(t,e,{vals:e.intensity,containerStr:"",cLetter:"c"})}},91134:function(t,e,r){"use strict";var n=r(9330).gl_mesh3d,i=r(9330).delaunay_triangulate,a=r(9330).alpha_shape,o=r(9330).convex_hull,s=r(81697).parseColorScale,l=r(78614),u=r(21081).extractOpts,c=r(90060);function f(t,e,r){this.scene=t,this.uid=r,this.mesh=e,this.name="",this.color="#fff",this.data=null,this.showContour=!1}var h=f.prototype;function p(t){for(var e=[],r=t.length,n=0;n=e-.5)return!1;return!0}h.handlePick=function(t){if(t.object===this.mesh){var e=t.index=t.data.index;t.data._cellCenter?t.traceCoordinate=t.data.dataCoordinate:t.traceCoordinate=[this.data.x[e],this.data.y[e],this.data.z[e]];var r=this.data.hovertext||this.data.text;return Array.isArray(r)&&void 0!==r[e]?t.textLabel=r[e]:r&&(t.textLabel=r),!0}},h.update=function(t){var e=this.scene,r=e.fullSceneLayout;this.data=t;var n,f=t.x.length,h=c(d(r.xaxis,t.x,e.dataScale[0],t.xcalendar),d(r.yaxis,t.y,e.dataScale[1],t.ycalendar),d(r.zaxis,t.z,e.dataScale[2],t.zcalendar));if(t.i&&t.j&&t.k){if(t.i.length!==t.j.length||t.j.length!==t.k.length||!g(t.i,f)||!g(t.j,f)||!g(t.k,f))return;n=c(v(t.i),v(t.j),v(t.k))}else n=0===t.alphahull?o(h):t.alphahull>0?a(t.alphahull,h):function(t,e){for(var r=["x","y","z"].indexOf(t),n=[],a=e.length,o=0;oy):g=A>w,y=A;var M=u(w,T,k,A);M.pos=_,M.yc=(w+A)/2,M.i=b,M.dir=g?"increasing":"decreasing",M.x=M.pos,M.y=[k,T],m&&(M.orig_p=r[b]),d&&(M.tx=e.text[b]),v&&(M.htx=e.hovertext[b]),x.push(M)}else x.push({pos:_,empty:!0})}return e._extremes[l._id]=a.findExtremes(l,n.concat(h,f),{padded:!0}),x.length&&(x[0].t={labels:{open:i(t,"open:")+" ",high:i(t,"high:")+" ",low:i(t,"low:")+" ",close:i(t,"close:")+" "}}),x}t.exports={calc:function(t,e){var r=a.getFromId(t,e.xaxis),i=a.getFromId(t,e.yaxis),s=function(t,e,r){var i=r._minDiff;if(!i){var a,s=t._fullData,l=[];for(i=1/0,a=0;a"+u.labels[x]+n.hoverLabelText(s,b,l.yhoverformat):((m=i.extendFlat({},h)).y0=m.y1=_,m.yLabelVal=b,m.yLabel=u.labels[x]+n.hoverLabelText(s,b,l.yhoverformat),m.name="",f.push(m),g[b]=m)}return f}function h(t,e,r,i){var a=t.cd,o=t.ya,l=a[0].trace,f=a[0].t,h=c(t,e,r,i);if(!h)return[];var p=a[h.index],d=h.index=p.i,v=p.dir;function g(t){return f.labels[t]+n.hoverLabelText(o,l[t][d],l.yhoverformat)}var y=p.hi||l.hoverinfo,m=y.split("+"),x="all"===y,b=x||-1!==m.indexOf("y"),_=x||-1!==m.indexOf("text"),w=b?[g("open"),g("high"),g("low"),g("close")+" "+u[v]]:[];return _&&s(p,l,w),h.extraText=w.join("
"),h.y0=h.y1=o.c2p(p.yc,!0),[h]}t.exports={hoverPoints:function(t,e,r,n){return t.cd[0].trace.hoverlabel.split?f(t,e,r,n):h(t,e,r,n)},hoverSplit:f,hoverOnPoints:h}},54186:function(t,e,r){"use strict";t.exports={moduleType:"trace",name:"ohlc",basePlotModule:r(93612),categories:["cartesian","svg","showLegend"],meta:{},attributes:r(2522),supplyDefaults:r(16169),calc:r(3485).calc,plot:r(72314),style:r(53101),hoverPoints:r(66449).hoverPoints,selectPoints:r(67324)}},14555:function(t,e,r){"use strict";var n=r(73972),i=r(71828);t.exports=function(t,e,r,a){var o=r("x"),s=r("open"),l=r("high"),u=r("low"),c=r("close");if(r("hoverlabel.split"),n.getComponentMethod("calendars","handleTraceDefaults")(t,e,["x"],a),s&&l&&u&&c){var f=Math.min(s.length,l.length,u.length,c.length);return o&&(f=Math.min(f,i.minRowLength(o))),e._length=f,f}}},72314:function(t,e,r){"use strict";var n=r(39898),i=r(71828);t.exports=function(t,e,r,a){var o=e.yaxis,s=e.xaxis,l=!!s.rangebreaks;i.makeTraceGroups(a,r,"trace ohlc").each((function(t){var e=n.select(this),r=t[0],a=r.t;if(!0!==r.trace.visible||a.empty)e.remove();else{var u=a.tickLen,c=e.selectAll("path").data(i.identity);c.enter().append("path"),c.exit().remove(),c.attr("d",(function(t){if(t.empty)return"M0,0Z";var e=s.c2p(t.pos-u,!0),r=s.c2p(t.pos+u,!0),n=l?(e+r)/2:s.c2p(t.pos,!0);return"M"+e+","+o.c2p(t.o,!0)+"H"+n+"M"+n+","+o.c2p(t.h,!0)+"V"+o.c2p(t.l,!0)+"M"+r+","+o.c2p(t.c,!0)+"H"+n}))}}))}},67324:function(t){"use strict";t.exports=function(t,e){var r,n=t.cd,i=t.xaxis,a=t.yaxis,o=[],s=n[0].t.bPos||0;if(!1===e)for(r=0;r=t.length)return!1;if(void 0!==e[t[r]])return!1;e[t[r]]=!0}return!0}(r))for(e=0;e0;u&&(o="array");var c=r("categoryorder",o);"array"===c?(r("categoryarray"),r("ticktext")):(delete t.categoryarray,delete t.ticktext),u||"array"!==c||(e.categoryorder="trace")}}t.exports=function(t,e,r,f){function h(r,i){return n.coerce(t,e,l,r,i)}var p=s(t,e,{name:"dimensions",handleItemDefaults:c}),d=function(t,e,r,o,s){s("line.shape"),s("line.hovertemplate");var l=s("line.color",o.colorway[0]);if(i(t,"line")&&n.isArrayOrTypedArray(l)){if(l.length)return s("line.colorscale"),a(t,e,o,s,{prefix:"line.",cLetter:"c"}),l.length;e.line.color=r}return 1/0}(t,e,r,f,h);o(e,f,h),Array.isArray(p)&&p.length||(e.visible=!1),u(e,p,"values",d),h("hoveron"),h("hovertemplate"),h("arrangement"),h("bundlecolors"),h("sortpaths"),h("counts");var v={family:f.font.family,size:Math.round(f.font.size),color:f.font.color};n.coerceFont(h,"labelfont",v);var g={family:f.font.family,size:Math.round(f.font.size/1.2),color:f.font.color};n.coerceFont(h,"tickfont",g)}},94873:function(t,e,r){"use strict";t.exports={attributes:r(99506),supplyDefaults:r(14647),calc:r(28699),plot:r(45784),colorbar:{container:"line",min:"cmin",max:"cmax"},moduleType:"trace",name:"parcats",basePlotModule:r(27677),categories:["noOpacity"],meta:{}}},45460:function(t,e,r){"use strict";var n=r(39898),i=r(81684).k4,a=r(72391),o=r(30211),s=r(71828),l=s.strTranslate,u=r(91424),c=r(84267),f=r(63893);function h(t,e,r,i){var a=e._context.staticPlot,o=t.map(F.bind(0,e,r)),c=i.selectAll("g.parcatslayer").data([null]);c.enter().append("g").attr("class","parcatslayer").style("pointer-events",a?"none":"all");var h=c.selectAll("g.trace.parcats").data(o,p),m=h.enter().append("g").attr("class","trace parcats");h.attr("transform",(function(t){return l(t.x,t.y)})),m.append("g").attr("class","paths");var x=h.select("g.paths").selectAll("path.path").data((function(t){return t.paths}),p);x.attr("fill",(function(t){return t.model.color}));var w=x.enter().append("path").attr("class","path").attr("stroke-opacity",0).attr("fill",(function(t){return t.model.color})).attr("fill-opacity",0);_(w),x.attr("d",(function(t){return t.svgD})),w.empty()||x.sort(v),x.exit().remove(),x.on("mouseover",g).on("mouseout",y).on("click",b),m.append("g").attr("class","dimensions");var A=h.select("g.dimensions").selectAll("g.dimension").data((function(t){return t.dimensions}),p);A.enter().append("g").attr("class","dimension"),A.attr("transform",(function(t){return l(t.x,0)})),A.exit().remove();var M=A.selectAll("g.category").data((function(t){return t.categories}),p),S=M.enter().append("g").attr("class","category");M.attr("transform",(function(t){return l(0,t.y)})),S.append("rect").attr("class","catrect").attr("pointer-events","none"),M.select("rect.catrect").attr("fill","none").attr("width",(function(t){return t.width})).attr("height",(function(t){return t.height})),T(S);var E=M.selectAll("rect.bandrect").data((function(t){return t.bands}),p);E.each((function(){s.raiseToTop(this)})),E.attr("fill",(function(t){return t.color}));var D=E.enter().append("rect").attr("class","bandrect").attr("stroke-opacity",0).attr("fill",(function(t){return t.color})).attr("fill-opacity",0);E.attr("fill",(function(t){return t.color})).attr("width",(function(t){return t.width})).attr("height",(function(t){return t.height})).attr("y",(function(t){return t.y})).attr("cursor",(function(t){return"fixed"===t.parcatsViewModel.arrangement?"default":"perpendicular"===t.parcatsViewModel.arrangement?"ns-resize":"move"})),k(D),E.exit().remove(),S.append("text").attr("class","catlabel").attr("pointer-events","none");var z=e._fullLayout.paper_bgcolor;M.select("text.catlabel").attr("text-anchor",(function(t){return d(t)?"start":"end"})).attr("alignment-baseline","middle").style("text-shadow",f.makeTextShadow(z)).style("fill","rgb(0, 0, 0)").attr("x",(function(t){return d(t)?t.width+5:-5})).attr("y",(function(t){return t.height/2})).text((function(t){return t.model.categoryLabel})).each((function(t){u.font(n.select(this),t.parcatsViewModel.categorylabelfont),f.convertToTspans(n.select(this),e)})),S.append("text").attr("class","dimlabel"),M.select("text.dimlabel").attr("text-anchor","middle").attr("alignment-baseline","baseline").attr("cursor",(function(t){return"fixed"===t.parcatsViewModel.arrangement?"default":"ew-resize"})).attr("x",(function(t){return t.width/2})).attr("y",-5).text((function(t,e){return 0===e?t.parcatsViewModel.model.dimensions[t.model.dimensionInd].dimensionLabel:null})).each((function(t){u.font(n.select(this),t.parcatsViewModel.labelfont)})),M.selectAll("rect.bandrect").on("mouseover",L).on("mouseout",C),M.exit().remove(),A.call(n.behavior.drag().origin((function(t){return{x:t.x,y:0}})).on("dragstart",P).on("drag",O).on("dragend",I)),h.each((function(t){t.traceSelection=n.select(this),t.pathSelection=n.select(this).selectAll("g.paths").selectAll("path.path"),t.dimensionSelection=n.select(this).selectAll("g.dimensions").selectAll("g.dimension")})),h.exit().remove()}function p(t){return t.key}function d(t){var e=t.parcatsViewModel.dimensions.length,r=t.parcatsViewModel.dimensions[e-1].model.dimensionInd;return t.model.dimensionInd===r}function v(t,e){return t.model.rawColor>e.model.rawColor?1:t.model.rawColor"),L=n.mouse(f)[0];o.loneHover({trace:h,x:b-d.left+v.left,y:_-d.top+v.top,text:E,color:t.model.color,borderColor:"black",fontFamily:'Monaco, "Courier New", monospace',fontSize:10,fontColor:T,idealAlign:L1&&h.displayInd===f.dimensions.length-1?(i=u.left,a="left"):(i=u.left+u.width,a="right");var v=c.model.count,g=c.model.categoryLabel,y=v/c.parcatsViewModel.model.count,m={countLabel:v,categoryLabel:g,probabilityLabel:y.toFixed(3)},x=[];-1!==c.parcatsViewModel.hoverinfoItems.indexOf("count")&&x.push(["Count:",m.countLabel].join(" ")),-1!==c.parcatsViewModel.hoverinfoItems.indexOf("probability")&&x.push(["P("+m.categoryLabel+"):",m.probabilityLabel].join(" "));var b=x.join("
");return{trace:p,x:o*(i-e.left),y:s*(d-e.top),text:b,color:"lightgray",borderColor:"black",fontFamily:'Monaco, "Courier New", monospace',fontSize:12,fontColor:"black",idealAlign:a,hovertemplate:p.hovertemplate,hovertemplateLabels:m,eventData:[{data:p._input,fullData:p,count:v,category:g,probability:y}]}}function L(t){if(!t.parcatsViewModel.dragDimension&&-1===t.parcatsViewModel.hoverinfoItems.indexOf("skip")){if(n.mouse(this)[1]<-1)return;var e,r=t.parcatsViewModel.graphDiv,i=r._fullLayout,a=i._paperdiv.node().getBoundingClientRect(),l=t.parcatsViewModel.hoveron,u=this;"color"===l?(function(t){var e=n.select(t).datum(),r=A(e);w(r),r.each((function(){s.raiseToTop(this)})),n.select(t.parentNode).selectAll("rect.bandrect").filter((function(t){return t.color===e.color})).each((function(){s.raiseToTop(this),n.select(this).attr("stroke","black").attr("stroke-width",1.5)}))}(u),S(u,"plotly_hover",n.event)):(function(t){n.select(t.parentNode).selectAll("rect.bandrect").each((function(t){var e=A(t);w(e),e.each((function(){s.raiseToTop(this)}))})),n.select(t.parentNode).select("rect.catrect").attr("stroke","black").attr("stroke-width",2.5)}(u),M(u,"plotly_hover",n.event)),-1===t.parcatsViewModel.hoverinfoItems.indexOf("none")&&("category"===l?e=E(r,a,u):"color"===l?e=function(t,e,r){t._fullLayout._calcInverseTransform(t);var i,a,o=t._fullLayout._invScaleX,s=t._fullLayout._invScaleY,l=r.getBoundingClientRect(),u=n.select(r).datum(),f=u.categoryViewModel,h=f.parcatsViewModel,p=h.model.dimensions[f.model.dimensionInd],d=h.trace,v=l.y+l.height/2;h.dimensions.length>1&&p.displayInd===h.dimensions.length-1?(i=l.left,a="left"):(i=l.left+l.width,a="right");var g=f.model.categoryLabel,y=u.parcatsViewModel.model.count,m=0;u.categoryViewModel.bands.forEach((function(t){t.color===u.color&&(m+=t.count)}));var x=f.model.count,b=0;h.pathSelection.each((function(t){t.model.color===u.color&&(b+=t.model.count)}));var _=m/y,w=m/b,T=m/x,k={countLabel:y,categoryLabel:g,probabilityLabel:_.toFixed(3)},A=[];-1!==f.parcatsViewModel.hoverinfoItems.indexOf("count")&&A.push(["Count:",k.countLabel].join(" ")),-1!==f.parcatsViewModel.hoverinfoItems.indexOf("probability")&&(A.push("P(color ∩ "+g+"): "+k.probabilityLabel),A.push("P("+g+" | color): "+w.toFixed(3)),A.push("P(color | "+g+"): "+T.toFixed(3)));var M=A.join("
"),S=c.mostReadable(u.color,["black","white"]);return{trace:d,x:o*(i-e.left),y:s*(v-e.top),text:M,color:u.color,borderColor:"black",fontFamily:'Monaco, "Courier New", monospace',fontColor:S,fontSize:10,idealAlign:a,hovertemplate:d.hovertemplate,hovertemplateLabels:k,eventData:[{data:d._input,fullData:d,category:g,count:y,probability:_,categorycount:x,colorcount:b,bandcolorcount:m}]}}(r,a,u):"dimension"===l&&(e=function(t,e,r){var i=[];return n.select(r.parentNode.parentNode).selectAll("g.category").select("rect.catrect").each((function(){i.push(E(t,e,this))})),i}(r,a,u)),e&&o.loneHover(e,{container:i._hoverlayer.node(),outerContainer:i._paper.node(),gd:r}))}}function C(t){var e=t.parcatsViewModel;e.dragDimension||(_(e.pathSelection),T(e.dimensionSelection.selectAll("g.category")),k(e.dimensionSelection.selectAll("g.category").selectAll("rect.bandrect")),o.loneUnhover(e.graphDiv._fullLayout._hoverlayer.node()),e.pathSelection.sort(v),-1!==e.hoverinfoItems.indexOf("skip"))||("color"===t.parcatsViewModel.hoveron?S(this,"plotly_unhover",n.event):M(this,"plotly_unhover",n.event))}function P(t){"fixed"!==t.parcatsViewModel.arrangement&&(t.dragDimensionDisplayInd=t.model.displayInd,t.initialDragDimensionDisplayInds=t.parcatsViewModel.model.dimensions.map((function(t){return t.displayInd})),t.dragHasMoved=!1,t.dragCategoryDisplayInd=null,n.select(this).selectAll("g.category").select("rect.catrect").each((function(e){var r=n.mouse(this)[0],i=n.mouse(this)[1];-2<=r&&r<=e.width+2&&-2<=i&&i<=e.height+2&&(t.dragCategoryDisplayInd=e.model.displayInd,t.initialDragCategoryDisplayInds=t.model.categories.map((function(t){return t.displayInd})),e.model.dragY=e.y,s.raiseToTop(this.parentNode),n.select(this.parentNode).selectAll("rect.bandrect").each((function(e){e.yf.y+f.height/2&&(o.model.displayInd=f.model.displayInd,f.model.displayInd=l),t.dragCategoryDisplayInd=o.model.displayInd}if(null===t.dragCategoryDisplayInd||"freeform"===t.parcatsViewModel.arrangement){a.model.dragX=n.event.x;var h=t.parcatsViewModel.dimensions[r],p=t.parcatsViewModel.dimensions[i];void 0!==h&&a.model.dragXp.x&&(a.model.displayInd=p.model.displayInd,p.model.displayInd=t.dragDimensionDisplayInd),t.dragDimensionDisplayInd=a.model.displayInd}j(t.parcatsViewModel),N(t.parcatsViewModel),R(t.parcatsViewModel),z(t.parcatsViewModel)}}function I(t){if("fixed"!==t.parcatsViewModel.arrangement&&null!==t.dragDimensionDisplayInd){n.select(this).selectAll("text").attr("font-weight","normal");var e={},r=D(t.parcatsViewModel),i=t.parcatsViewModel.model.dimensions.map((function(t){return t.displayInd})),o=t.initialDragDimensionDisplayInds.some((function(t,e){return t!==i[e]}));o&&i.forEach((function(r,n){var i=t.parcatsViewModel.model.dimensions[n].containerInd;e["dimensions["+i+"].displayindex"]=r}));var s=!1;if(null!==t.dragCategoryDisplayInd){var l=t.model.categories.map((function(t){return t.displayInd}));if(s=t.initialDragCategoryDisplayInds.some((function(t,e){return t!==l[e]}))){var u=t.model.categories.slice().sort((function(t,e){return t.displayInd-e.displayInd})),c=u.map((function(t){return t.categoryValue})),f=u.map((function(t){return t.categoryLabel}));e["dimensions["+t.model.containerInd+"].categoryarray"]=[c],e["dimensions["+t.model.containerInd+"].ticktext"]=[f],e["dimensions["+t.model.containerInd+"].categoryorder"]="array"}}-1===t.parcatsViewModel.hoverinfoItems.indexOf("skip")&&!t.dragHasMoved&&t.potentialClickBand&&("color"===t.parcatsViewModel.hoveron?S(t.potentialClickBand,"plotly_click",n.event.sourceEvent):M(t.potentialClickBand,"plotly_click",n.event.sourceEvent)),t.model.dragX=null,null!==t.dragCategoryDisplayInd&&(t.parcatsViewModel.dimensions[t.dragDimensionDisplayInd].categories[t.dragCategoryDisplayInd].model.dragY=null,t.dragCategoryDisplayInd=null),t.dragDimensionDisplayInd=null,t.parcatsViewModel.dragDimension=null,t.dragHasMoved=null,t.potentialClickBand=null,j(t.parcatsViewModel),N(t.parcatsViewModel),n.transition().duration(300).ease("cubic-in-out").each((function(){R(t.parcatsViewModel,!0),z(t.parcatsViewModel,!0)})).each("end",(function(){(o||s)&&a.restyle(t.parcatsViewModel.graphDiv,e,[r])}))}}function D(t){for(var e,r=t.graphDiv._fullData,n=0;n=0;s--)c+="C"+u[s]+","+(e[s+1]+n)+" "+l[s]+","+(e[s]+n)+" "+(t[s]+r[s])+","+(e[s]+n),c+="l-"+r[s]+",0 ";return c+"Z"}function N(t){var e=t.dimensions,r=t.model,n=e.map((function(t){return t.categories.map((function(t){return t.y}))})),i=t.model.dimensions.map((function(t){return t.categories.map((function(t){return t.displayInd}))})),a=t.model.dimensions.map((function(t){return t.displayInd})),o=t.dimensions.map((function(t){return t.model.dimensionInd})),s=e.map((function(t){return t.x})),l=e.map((function(t){return t.width})),u=[];for(var c in r.paths)r.paths.hasOwnProperty(c)&&u.push(r.paths[c]);function f(t){var e=t.categoryInds.map((function(t,e){return i[e][t]}));return o.map((function(t){return e[t]}))}u.sort((function(e,r){var n=f(e),i=f(r);return"backward"===t.sortpaths&&(n.reverse(),i.reverse()),n.push(e.valueInds[0]),i.push(r.valueInds[0]),t.bundlecolors&&(n.unshift(e.rawColor),i.unshift(r.rawColor)),ni?1:0}));for(var h=new Array(u.length),p=e[0].model.count,d=e[0].categories.map((function(t){return t.height})).reduce((function(t,e){return t+e})),v=0;v0?d*(y.count/p):0;for(var m,x=new Array(n.length),b=0;b1?(t.width-80-16)/(n-1):0)*i;var a,o,s,l,u,c=[],f=t.model.maxCats,h=e.categories.length,p=e.count,d=t.height-8*(f-1),v=8*(f-h)/2,g=e.categories.map((function(t){return{displayInd:t.displayInd,categoryInd:t.categoryInd}}));for(g.sort((function(t,e){return t.displayInd-e.displayInd})),u=0;u0?o.count/p*d:0,s={key:o.valueInds[0],model:o,width:16,height:a,y:null!==o.dragY?o.dragY:v,bands:[],parcatsViewModel:t},v=v+a+8,c.push(s);return{key:e.dimensionInd,x:null!==e.dragX?e.dragX:r,y:0,width:16,model:e,categories:c,parcatsViewModel:t,dragCategoryDisplayInd:null,dragDimensionDisplayInd:null,initialDragDimensionDisplayInds:null,initialDragCategoryDisplayInds:null,dragHasMoved:null,potentialClickBand:null}}t.exports=function(t,e,r,n){h(r,t,n,e)}},45784:function(t,e,r){"use strict";var n=r(45460);t.exports=function(t,e,r,i){var a=t._fullLayout,o=a._paper,s=a._size;n(t,o,e,{width:s.w,height:s.h,margin:{t:s.t,r:s.r,b:s.b,l:s.l}},r,i)}},73362:function(t,e,r){"use strict";var n=r(50693),i=r(13838),a=r(41940),o=r(27670).Y,s=r(1426).extendFlat,l=r(44467).templatedArray;t.exports={domain:o({name:"parcoords",trace:!0,editType:"plot"}),labelangle:{valType:"angle",dflt:0,editType:"plot"},labelside:{valType:"enumerated",values:["top","bottom"],dflt:"top",editType:"plot"},labelfont:a({editType:"plot"}),tickfont:a({editType:"plot"}),rangefont:a({editType:"plot"}),dimensions:l("dimension",{label:{valType:"string",editType:"plot"},tickvals:s({},i.tickvals,{editType:"plot"}),ticktext:s({},i.ticktext,{editType:"plot"}),tickformat:s({},i.tickformat,{editType:"plot"}),visible:{valType:"boolean",dflt:!0,editType:"plot"},range:{valType:"info_array",items:[{valType:"number",editType:"plot"},{valType:"number",editType:"plot"}],editType:"plot"},constraintrange:{valType:"info_array",freeLength:!0,dimensions:"1-2",items:[{valType:"any",editType:"plot"},{valType:"any",editType:"plot"}],editType:"plot"},multiselect:{valType:"boolean",dflt:!0,editType:"plot"},values:{valType:"data_array",editType:"calc"},editType:"calc"}),line:s({editType:"calc"},n("line",{colorscaleDflt:"Viridis",autoColorDflt:!1,editTypeOverride:"calc"})),unselected:{line:{color:{valType:"color",dflt:"#7f7f7f",editType:"plot"},opacity:{valType:"number",min:0,max:1,dflt:"auto",editType:"plot"},editType:"plot"},editType:"plot"}}},57920:function(t,e,r){"use strict";var n=r(25706),i=r(39898),a=r(28984).keyFun,o=r(28984).repeat,s=r(71828).sorterAsc,l=r(71828).strTranslate,u=n.bar.snapRatio;function c(t,e){return t*(1-u)+e*u}var f=n.bar.snapClose;function h(t,e){return t*(1-f)+e*f}function p(t,e,r,n){if(function(t,e){for(var r=0;r=e[r][0]&&t<=e[r][1])return!0;return!1}(r,n))return r;var i=t?-1:1,a=0,o=e.length-1;if(i<0){var s=a;a=o,o=s}for(var l=e[a],u=l,f=a;i*fe){h=r;break}}if(a=c,isNaN(a)&&(a=isNaN(f)||isNaN(h)?isNaN(f)?h:f:e-u[f][1]t[1]+r||e=.9*t[1]+.1*t[0]?"n":e<=.9*t[0]+.1*t[1]?"s":"ns"}(d,e);v&&(o.interval=l[a],o.intervalPix=d,o.region=v)}}if(t.ordinal&&!o.region){var g=t.unitTickvals,m=t.unitToPaddedPx.invert(e);for(r=0;r=x[0]&&m<=x[1]){o.clickableOrdinalRange=x;break}}}return o}function w(t,e){i.event.sourceEvent.stopPropagation();var r=e.height-i.mouse(t)[1]-2*n.verticalPadding,a=e.brush.svgBrush;a.wasDragged=!0,a._dragging=!0,a.grabbingBar?a.newExtent=[r-a.grabPoint,r+a.barLength-a.grabPoint].map(e.unitToPaddedPx.invert):a.newExtent=[a.startExtent,e.unitToPaddedPx.invert(r)].sort(s),e.brush.filterSpecified=!0,a.extent=a.stayingIntervals.concat([a.newExtent]),a.brushCallback(e),b(t.parentNode)}function T(t,e){var r=_(e,e.height-i.mouse(t)[1]-2*n.verticalPadding),a="crosshair";r.clickableOrdinalRange?a="pointer":r.region&&(a=r.region+"-resize"),i.select(document.body).style("cursor",a)}function k(t){t.on("mousemove",(function(t){i.event.preventDefault(),t.parent.inBrushDrag||T(this,t)})).on("mouseleave",(function(t){t.parent.inBrushDrag||m()})).call(i.behavior.drag().on("dragstart",(function(t){!function(t,e){i.event.sourceEvent.stopPropagation();var r=e.height-i.mouse(t)[1]-2*n.verticalPadding,a=e.unitToPaddedPx.invert(r),o=e.brush,s=_(e,r),l=s.interval,u=o.svgBrush;if(u.wasDragged=!1,u.grabbingBar="ns"===s.region,u.grabbingBar){var c=l.map(e.unitToPaddedPx);u.grabPoint=r-c[0]-n.verticalPadding,u.barLength=c[1]-c[0]}u.clickableOrdinalRange=s.clickableOrdinalRange,u.stayingIntervals=e.multiselect&&o.filterSpecified?o.filter.getConsolidated():[],l&&(u.stayingIntervals=u.stayingIntervals.filter((function(t){return t[0]!==l[0]&&t[1]!==l[1]}))),u.startExtent=s.region?l["s"===s.region?1:0]:a,e.parent.inBrushDrag=!0,u.brushStartCallback()}(this,t)})).on("drag",(function(t){w(this,t)})).on("dragend",(function(t){!function(t,e){var r=e.brush,n=r.filter,a=r.svgBrush;a._dragging||(T(t,e),w(t,e),e.brush.svgBrush.wasDragged=!1),a._dragging=!1,i.event.sourceEvent.stopPropagation();var o=a.grabbingBar;if(a.grabbingBar=!1,a.grabLocation=void 0,e.parent.inBrushDrag=!1,m(),!a.wasDragged)return a.wasDragged=void 0,a.clickableOrdinalRange?r.filterSpecified&&e.multiselect?a.extent.push(a.clickableOrdinalRange):(a.extent=[a.clickableOrdinalRange],r.filterSpecified=!0):o?(a.extent=a.stayingIntervals,0===a.extent.length&&M(r)):M(r),a.brushCallback(e),b(t.parentNode),void a.brushEndCallback(r.filterSpecified?n.getConsolidated():[]);var s=function(){n.set(n.getConsolidated())};if(e.ordinal){var l=e.unitTickvals;l[l.length-1]a.newExtent[0];a.extent=a.stayingIntervals.concat(u?[a.newExtent]:[]),a.extent.length||M(r),a.brushCallback(e),u?b(t.parentNode,s):(s(),b(t.parentNode))}else s();a.brushEndCallback(r.filterSpecified?n.getConsolidated():[])}(this,t)})))}function A(t,e){return t[0]-e[0]}function M(t){t.filterSpecified=!1,t.svgBrush.extent=[[-1/0,1/0]]}function S(t){for(var e,r=t.slice(),n=[],i=r.shift();i;){for(e=i.slice();(i=r.shift())&&i[0]<=e[1];)e[1]=Math.max(e[1],i[1]);n.push(e)}return 1===n.length&&n[0][0]>n[0][1]&&(n=[]),n}t.exports={makeBrush:function(t,e,r,n,i,a){var o,l=function(){var t,e,r=[];return{set:function(n){1===(r=n.map((function(t){return t.slice().sort(s)})).sort(A)).length&&r[0][0]===-1/0&&r[0][1]===1/0&&(r=[[0,-1]]),t=S(r),e=r.reduce((function(t,e){return[Math.min(t[0],e[0]),Math.max(t[1],e[1])]}),[1/0,-1/0])},get:function(){return r.slice()},getConsolidated:function(){return t},getBounds:function(){return e}}}();return l.set(r),{filter:l,filterSpecified:e,svgBrush:{extent:[],brushStartCallback:n,brushCallback:(o=i,function(t){var e=t.brush,r=function(t){return t.svgBrush.extent.map((function(t){return t.slice()}))}(e),n=r.slice();e.filter.set(n),o()}),brushEndCallback:a}}},ensureAxisBrush:function(t,e,r){var i=t.selectAll("."+n.cn.axisBrush).data(o,a);i.enter().append("g").classed(n.cn.axisBrush,!0),function(t,e,r){var i=r._context.staticPlot,a=t.selectAll(".background").data(o);a.enter().append("rect").classed("background",!0).call(d).call(v).style("pointer-events",i?"none":"auto").attr("transform",l(0,n.verticalPadding)),a.call(k).attr("height",(function(t){return t.height-n.verticalPadding}));var s=t.selectAll(".highlight-shadow").data(o);s.enter().append("line").classed("highlight-shadow",!0).attr("x",-n.bar.width/2).attr("stroke-width",n.bar.width+n.bar.strokeWidth).attr("stroke",e).attr("opacity",n.bar.strokeOpacity).attr("stroke-linecap","butt"),s.attr("y1",(function(t){return t.height})).call(x);var u=t.selectAll(".highlight").data(o);u.enter().append("line").classed("highlight",!0).attr("x",-n.bar.width/2).attr("stroke-width",n.bar.width-n.bar.strokeWidth).attr("stroke",n.bar.fillColor).attr("opacity",n.bar.fillOpacity).attr("stroke-linecap","butt"),u.attr("y1",(function(t){return t.height})).call(x)}(i,e,r)},cleanRanges:function(t,e){if(Array.isArray(t[0])?(t=t.map((function(t){return t.sort(s)})),t=e.multiselect?S(t.sort(A)):[t[0]]):t=[t.sort(s)],e.tickvals){var r=e.tickvals.slice().sort(s);if(!(t=t.map((function(t){var e=[p(0,r,t[0],[]),p(1,r,t[1],[])];if(e[1]>e[0])return e})).filter((function(t){return t}))).length)return}return t.length>1?t:t[0]}}},71791:function(t,e,r){"use strict";t.exports={attributes:r(73362),supplyDefaults:r(3633),calc:r(24639),colorbar:{container:"line",min:"cmin",max:"cmax"},moduleType:"trace",name:"parcoords",basePlotModule:r(49351),categories:["gl","regl","noOpacity","noHover"],meta:{}}},49351:function(t,e,r){"use strict";var n=r(39898),i=r(27659).a0,a=r(21341),o=r(77922);e.name="parcoords",e.plot=function(t){var e=i(t.calcdata,"parcoords")[0];e.length&&a(t,e)},e.clean=function(t,e,r,n){var i=n._has&&n._has("parcoords"),a=e._has&&e._has("parcoords");i&&!a&&(n._paperdiv.selectAll(".parcoords").remove(),n._glimages.selectAll("*").remove())},e.toSVG=function(t){var e=t._fullLayout._glimages,r=n.select(t).selectAll(".svg-container");r.filter((function(t,e){return e===r.size()-1})).selectAll(".gl-canvas-context, .gl-canvas-focus").each((function(){var t=this,r=t.toDataURL("image/png");e.append("svg:image").attr({xmlns:o.svg,"xlink:href":r,preserveAspectRatio:"none",x:0,y:0,width:t.style.width,height:t.style.height})})),window.setTimeout((function(){n.selectAll("#filterBarPattern").attr("id","filterBarPattern")}),60)}},24639:function(t,e,r){"use strict";var n=r(71828).isArrayOrTypedArray,i=r(21081),a=r(28984).wrap;t.exports=function(t,e){var r,o;return i.hasColorscale(e,"line")&&n(e.line.color)?(r=e.line.color,o=i.extractOpts(e.line).colorscale,i.calc(t,e,{vals:r,containerStr:"line",cLetter:"c"})):(r=function(t){for(var e=new Array(t),r=0;rf&&(n.log("parcoords traces support up to "+f+" dimensions at the moment"),d.splice(f));var v=s(t,e,{name:"dimensions",layout:l,handleItemDefaults:p}),g=function(t,e,r,o,s){var l=s("line.color",r);if(i(t,"line")&&n.isArrayOrTypedArray(l)){if(l.length)return s("line.colorscale"),a(t,e,o,s,{prefix:"line.",cLetter:"c"}),l.length;e.line.color=r}return 1/0}(t,e,r,l,c);o(e,l,c),Array.isArray(v)&&v.length||(e.visible=!1),h(e,v,"values",g);var y={family:l.font.family,size:Math.round(l.font.size/1.2),color:l.font.color};n.coerceFont(c,"labelfont",y),n.coerceFont(c,"tickfont",y),n.coerceFont(c,"rangefont",y),c("labelangle"),c("labelside"),c("unselected.line.color"),c("unselected.line.opacity")}},1602:function(t,e,r){"use strict";var n=r(71828).isTypedArray;e.convertTypedArray=function(t){return n(t)?Array.prototype.slice.call(t):t},e.isOrdinal=function(t){return!!t.tickvals},e.isVisible=function(t){return t.visible||!("visible"in t)}},67618:function(t,e,r){"use strict";var n=r(71791);n.plot=r(21341),t.exports=n},83398:function(t,e,r){"use strict";var n=r(56068),i=n(["precision highp float;\n#define GLSLIFY 1\n\nvarying vec4 fragColor;\n\nattribute vec4 p01_04, p05_08, p09_12, p13_16,\n p17_20, p21_24, p25_28, p29_32,\n p33_36, p37_40, p41_44, p45_48,\n p49_52, p53_56, p57_60, colors;\n\nuniform mat4 dim0A, dim1A, dim0B, dim1B, dim0C, dim1C, dim0D, dim1D,\n loA, hiA, loB, hiB, loC, hiC, loD, hiD;\n\nuniform vec2 resolution, viewBoxPos, viewBoxSize;\nuniform float maskHeight;\nuniform float drwLayer; // 0: context, 1: focus, 2: pick\nuniform vec4 contextColor;\nuniform sampler2D maskTexture, palette;\n\nbool isPick = (drwLayer > 1.5);\nbool isContext = (drwLayer < 0.5);\n\nconst vec4 ZEROS = vec4(0.0, 0.0, 0.0, 0.0);\nconst vec4 UNITS = vec4(1.0, 1.0, 1.0, 1.0);\n\nfloat val(mat4 p, mat4 v) {\n return dot(matrixCompMult(p, v) * UNITS, UNITS);\n}\n\nfloat axisY(float ratio, mat4 A, mat4 B, mat4 C, mat4 D) {\n float y1 = val(A, dim0A) + val(B, dim0B) + val(C, dim0C) + val(D, dim0D);\n float y2 = val(A, dim1A) + val(B, dim1B) + val(C, dim1C) + val(D, dim1D);\n return y1 * (1.0 - ratio) + y2 * ratio;\n}\n\nint iMod(int a, int b) {\n return a - b * (a / b);\n}\n\nbool fOutside(float p, float lo, float hi) {\n return (lo < hi) && (lo > p || p > hi);\n}\n\nbool vOutside(vec4 p, vec4 lo, vec4 hi) {\n return (\n fOutside(p[0], lo[0], hi[0]) ||\n fOutside(p[1], lo[1], hi[1]) ||\n fOutside(p[2], lo[2], hi[2]) ||\n fOutside(p[3], lo[3], hi[3])\n );\n}\n\nbool mOutside(mat4 p, mat4 lo, mat4 hi) {\n return (\n vOutside(p[0], lo[0], hi[0]) ||\n vOutside(p[1], lo[1], hi[1]) ||\n vOutside(p[2], lo[2], hi[2]) ||\n vOutside(p[3], lo[3], hi[3])\n );\n}\n\nbool outsideBoundingBox(mat4 A, mat4 B, mat4 C, mat4 D) {\n return mOutside(A, loA, hiA) ||\n mOutside(B, loB, hiB) ||\n mOutside(C, loC, hiC) ||\n mOutside(D, loD, hiD);\n}\n\nbool outsideRasterMask(mat4 A, mat4 B, mat4 C, mat4 D) {\n mat4 pnts[4];\n pnts[0] = A;\n pnts[1] = B;\n pnts[2] = C;\n pnts[3] = D;\n\n for(int i = 0; i < 4; ++i) {\n for(int j = 0; j < 4; ++j) {\n for(int k = 0; k < 4; ++k) {\n if(0 == iMod(\n int(255.0 * texture2D(maskTexture,\n vec2(\n (float(i * 2 + j / 2) + 0.5) / 8.0,\n (pnts[i][j][k] * (maskHeight - 1.0) + 1.0) / maskHeight\n ))[3]\n ) / int(pow(2.0, float(iMod(j * 4 + k, 8)))),\n 2\n )) return true;\n }\n }\n }\n return false;\n}\n\nvec4 position(bool isContext, float v, mat4 A, mat4 B, mat4 C, mat4 D) {\n float x = 0.5 * sign(v) + 0.5;\n float y = axisY(x, A, B, C, D);\n float z = 1.0 - abs(v);\n\n z += isContext ? 0.0 : 2.0 * float(\n outsideBoundingBox(A, B, C, D) ||\n outsideRasterMask(A, B, C, D)\n );\n\n return vec4(\n 2.0 * (vec2(x, y) * viewBoxSize + viewBoxPos) / resolution - 1.0,\n z,\n 1.0\n );\n}\n\nvoid main() {\n mat4 A = mat4(p01_04, p05_08, p09_12, p13_16);\n mat4 B = mat4(p17_20, p21_24, p25_28, p29_32);\n mat4 C = mat4(p33_36, p37_40, p41_44, p45_48);\n mat4 D = mat4(p49_52, p53_56, p57_60, ZEROS);\n\n float v = colors[3];\n\n gl_Position = position(isContext, v, A, B, C, D);\n\n fragColor =\n isContext ? vec4(contextColor) :\n isPick ? vec4(colors.rgb, 1.0) : texture2D(palette, vec2(abs(v), 0.5));\n}\n"]),a=n(["precision highp float;\n#define GLSLIFY 1\n\nvarying vec4 fragColor;\n\nvoid main() {\n gl_FragColor = fragColor;\n}\n"]),o=r(25706).maxDimensionCount,s=r(71828),l=1e-6,u=new Uint8Array(4),c=new Uint8Array(4),f={shape:[256,1],format:"rgba",type:"uint8",mag:"nearest",min:"nearest"};function h(t,e,r,n,i){var a=t._gl;a.enable(a.SCISSOR_TEST),a.scissor(e,r,n,i),t.clear({color:[0,0,0,0],depth:1})}function p(t,e,r,n,i,a){var o=a.key;r.drawCompleted||(function(t){t.read({x:0,y:0,width:1,height:1,data:u})}(t),r.drawCompleted=!0),function s(l){var u=Math.min(n,i-l*n);0===l&&(window.cancelAnimationFrame(r.currentRafs[o]),delete r.currentRafs[o],h(t,a.scissorX,a.scissorY,a.scissorWidth,a.viewBoxSize[1])),r.clearOnly||(a.count=2*u,a.offset=2*l*n,e(a),l*n+u>>8*e)%256/255}function g(t,e,r){for(var n=new Array(8*e),i=0,a=0;ac&&(c=t[i].dim1.canvasX,o=i);0===s&&h(k,0,0,r.canvasWidth,r.canvasHeight);var f=function(t){var e,r,n,i=[[],[]];for(n=0;n<64;n++){var a=!t&&no._length&&(S=S.slice(0,o._length));var L,C=o.tickvals;function P(t,e){return{val:t,text:L[e]}}function O(t,e){return t.val-e.val}if(Array.isArray(C)&&C.length){L=o.ticktext,Array.isArray(L)&&L.length?L.length>C.length?L=L.slice(0,C.length):C.length>L.length&&(C=C.slice(0,L.length)):L=C.map(a(o.tickformat));for(var I=1;I=r||l>=i)return;var u=t.lineLayer.readPixel(s,i-1-l),c=0!==u[3],f=c?u[2]+256*(u[1]+256*u[0]):null,h={x:s,y:l,clientX:e.clientX,clientY:e.clientY,dataIndex:t.model.key,curveNumber:f};f!==N&&(c?a.hover(h):a.unhover&&a.unhover(h),N=f)}})),B.style("opacity",(function(t){return t.pick?0:1})),p.style("background","rgba(255, 255, 255, 0)");var j=p.selectAll("."+m.cn.parcoords).data(F,d);j.exit().remove(),j.enter().append("g").classed(m.cn.parcoords,!0).style("shape-rendering","crispEdges").style("pointer-events","none"),j.attr("transform",(function(t){return u(t.model.translateX,t.model.translateY)}));var U=j.selectAll("."+m.cn.parcoordsControlView).data(v,d);U.enter().append("g").classed(m.cn.parcoordsControlView,!0),U.attr("transform",(function(t){return u(t.model.pad.l,t.model.pad.t)}));var V=U.selectAll("."+m.cn.yAxis).data((function(t){return t.dimensions}),d);V.enter().append("g").classed(m.cn.yAxis,!0),U.each((function(t){I(V,t,T)})),B.each((function(t){if(t.viewModel){!t.lineLayer||a?t.lineLayer=b(this,t):t.lineLayer.update(t),(t.key||0===t.key)&&(t.viewModel[t.key]=t.lineLayer);var e=!t.context||a;t.lineLayer.render(t.viewModel.panels,e)}})),V.attr("transform",(function(t){return u(t.xScale(t.xIndex),0)})),V.call(n.behavior.drag().origin((function(t){return t})).on("drag",(function(t){var e=t.parent;R.linePickActive(!1),t.x=Math.max(-m.overdrag,Math.min(t.model.width+m.overdrag,n.event.x)),t.canvasX=t.x*t.model.canvasPixelRatio,V.sort((function(t,e){return t.x-e.x})).each((function(e,r){e.xIndex=r,e.x=t===e?e.x:e.xScale(e.xIndex),e.canvasX=e.x*e.model.canvasPixelRatio})),I(V,e,T),V.filter((function(e){return 0!==Math.abs(t.xIndex-e.xIndex)})).attr("transform",(function(t){return u(t.xScale(t.xIndex),0)})),n.select(this).attr("transform",u(t.x,0)),V.each((function(r,n,i){i===t.parent.key&&(e.dimensions[n]=r)})),e.contextLayer&&e.contextLayer.render(e.panels,!1,!E(e)),e.focusLayer.render&&e.focusLayer.render(e.panels)})).on("dragend",(function(t){var e=t.parent;t.x=t.xScale(t.xIndex),t.canvasX=t.x*t.model.canvasPixelRatio,I(V,e,T),n.select(this).attr("transform",(function(t){return u(t.x,0)})),e.contextLayer&&e.contextLayer.render(e.panels,!1,!E(e)),e.focusLayer&&e.focusLayer.render(e.panels),e.pickLayer&&e.pickLayer.render(e.panels,!0),R.linePickActive(!0),a&&a.axesMoved&&a.axesMoved(e.key,e.dimensions.map((function(t){return t.crossfilterDimensionIndex})))}))),V.exit().remove();var H=V.selectAll("."+m.cn.axisOverlays).data(v,d);H.enter().append("g").classed(m.cn.axisOverlays,!0),H.selectAll("."+m.cn.axis).remove();var q=H.selectAll("."+m.cn.axis).data(v,d);q.enter().append("g").classed(m.cn.axis,!0),q.each((function(t){var e=t.model.height/t.model.tickDistance,r=t.domainScale,i=r.domain();n.select(this).call(n.svg.axis().orient("left").tickSize(4).outerTickSize(2).ticks(e,t.tickFormat).tickValues(t.ordinal?i:null).tickFormat((function(e){return y.isOrdinal(t)?e:D(t.model.dimensions[t.visibleIndex],e)})).scale(r)),f.font(q.selectAll("text"),t.model.tickFont)})),q.selectAll(".domain, .tick>line").attr("fill","none").attr("stroke","black").attr("stroke-opacity",.25).attr("stroke-width","1px"),q.selectAll("text").style("text-shadow",c.makeTextShadow(A)).style("cursor","default");var G=H.selectAll("."+m.cn.axisHeading).data(v,d);G.enter().append("g").classed(m.cn.axisHeading,!0);var Z=G.selectAll("."+m.cn.axisTitle).data(v,d);Z.enter().append("text").classed(m.cn.axisTitle,!0).attr("text-anchor","middle").style("cursor","ew-resize").style("pointer-events",o?"none":"auto"),Z.text((function(t){return t.label})).each((function(e){var r=n.select(this);f.font(r,e.model.labelFont),c.convertToTspans(r,t)})).attr("transform",(function(t){var e=O(t.model.labelAngle,t.model.labelSide),r=m.axisTitleOffset;return(e.dir>0?"":u(0,2*r+t.model.height))+l(e.degrees)+u(-r*e.dx,-r*e.dy)})).attr("text-anchor",(function(t){var e=O(t.model.labelAngle,t.model.labelSide);return 2*Math.abs(e.dx)>Math.abs(e.dy)?e.dir*e.dx<0?"start":"end":"middle"}));var Y=H.selectAll("."+m.cn.axisExtent).data(v,d);Y.enter().append("g").classed(m.cn.axisExtent,!0);var W=Y.selectAll("."+m.cn.axisExtentTop).data(v,d);W.enter().append("g").classed(m.cn.axisExtentTop,!0),W.attr("transform",u(0,-m.axisExtentOffset));var X=W.selectAll("."+m.cn.axisExtentTopText).data(v,d);X.enter().append("text").classed(m.cn.axisExtentTopText,!0).call(P),X.text((function(t){return z(t,!0)})).each((function(t){f.font(n.select(this),t.model.rangeFont)}));var J=Y.selectAll("."+m.cn.axisExtentBottom).data(v,d);J.enter().append("g").classed(m.cn.axisExtentBottom,!0),J.attr("transform",(function(t){return u(0,t.model.height+m.axisExtentOffset)}));var K=J.selectAll("."+m.cn.axisExtentBottomText).data(v,d);K.enter().append("text").classed(m.cn.axisExtentBottomText,!0).attr("dy","0.75em").call(P),K.text((function(t){return z(t,!1)})).each((function(t){f.font(n.select(this),t.model.rangeFont)})),x.ensureAxisBrush(H,A,t)}},21341:function(t,e,r){"use strict";var n=r(17171),i=r(79749),a=r(1602).isVisible,o={};function s(t,e,r){var n=e.indexOf(r),i=t.indexOf(n);return-1===i&&(i+=e.length),i}(t.exports=function(t,e){var r=t._fullLayout;if(i(t,[],o)){var l={},u={},c={},f={},h=r._size;e.forEach((function(e,r){var n=e[0].trace;c[r]=n.index;var i=f[r]=n._fullInput.index;l[r]=t.data[i].dimensions,u[r]=t.data[i].dimensions.slice()})),n(t,e,{width:h.w,height:h.h,margin:{t:h.t,r:h.r,b:h.b,l:h.l}},{filterChanged:function(e,n,i){var a=u[e][n],o=i.map((function(t){return t.slice()})),s="dimensions["+n+"].constraintrange",l=r._tracePreGUI[t._fullData[c[e]]._fullInput.uid];if(void 0===l[s]){var h=a.constraintrange;l[s]=h||null}var p=t._fullData[c[e]].dimensions[n];o.length?(1===o.length&&(o=o[0]),a.constraintrange=o,p.constraintrange=o.slice(),o=[o]):(delete a.constraintrange,delete p.constraintrange,o=null);var d={};d[s]=o,t.emit("plotly_restyle",[d,[f[e]]])},hover:function(e){t.emit("plotly_hover",e)},unhover:function(e){t.emit("plotly_unhover",e)},axesMoved:function(e,r){var n=function(t,e){return function(r,n){return s(t,e,r)-s(t,e,n)}}(r,u[e].filter(a));l[e].sort(n),u[e].filter((function(t){return!a(t)})).sort((function(t){return u[e].indexOf(t)})).forEach((function(t){l[e].splice(l[e].indexOf(t),1),l[e].splice(u[e].indexOf(t),0,t)})),t.emit("plotly_restyle",[{dimensions:[l[e]]},[f[e]]])}})}}).reglPrecompiled=o},34e3:function(t,e,r){"use strict";var n=r(9012),i=r(27670).Y,a=r(41940),o=r(22399),s=r(5386).fF,l=r(5386).si,u=r(1426).extendFlat,c=r(79952).u,f=a({editType:"plot",arrayOk:!0,colorEditType:"plot"});t.exports={labels:{valType:"data_array",editType:"calc"},label0:{valType:"number",dflt:0,editType:"calc"},dlabel:{valType:"number",dflt:1,editType:"calc"},values:{valType:"data_array",editType:"calc"},marker:{colors:{valType:"data_array",editType:"calc"},line:{color:{valType:"color",dflt:o.defaultLine,arrayOk:!0,editType:"style"},width:{valType:"number",min:0,dflt:0,arrayOk:!0,editType:"style"},editType:"calc"},pattern:c,editType:"calc"},text:{valType:"data_array",editType:"plot"},hovertext:{valType:"string",dflt:"",arrayOk:!0,editType:"style"},scalegroup:{valType:"string",dflt:"",editType:"calc"},textinfo:{valType:"flaglist",flags:["label","text","value","percent"],extras:["none"],editType:"calc"},hoverinfo:u({},n.hoverinfo,{flags:["label","text","value","percent","name"]}),hovertemplate:s({},{keys:["label","color","value","percent","text"]}),texttemplate:l({editType:"plot"},{keys:["label","color","value","percent","text"]}),textposition:{valType:"enumerated",values:["inside","outside","auto","none"],dflt:"auto",arrayOk:!0,editType:"plot"},textfont:u({},f,{}),insidetextorientation:{valType:"enumerated",values:["horizontal","radial","tangential","auto"],dflt:"auto",editType:"plot"},insidetextfont:u({},f,{}),outsidetextfont:u({},f,{}),automargin:{valType:"boolean",dflt:!1,editType:"plot"},title:{text:{valType:"string",dflt:"",editType:"plot"},font:u({},f,{}),position:{valType:"enumerated",values:["top left","top center","top right","middle center","bottom left","bottom center","bottom right"],editType:"plot"},editType:"plot"},domain:i({name:"pie",trace:!0,editType:"calc"}),hole:{valType:"number",min:0,max:1,dflt:0,editType:"calc"},sort:{valType:"boolean",dflt:!0,editType:"calc"},direction:{valType:"enumerated",values:["clockwise","counterclockwise"],dflt:"counterclockwise",editType:"calc"},rotation:{valType:"angle",dflt:0,editType:"calc"},pull:{valType:"number",min:0,max:1,dflt:0,arrayOk:!0,editType:"calc"},_deprecated:{title:{valType:"string",dflt:"",editType:"calc"},titlefont:u({},f,{}),titleposition:{valType:"enumerated",values:["top left","top center","top right","middle center","bottom left","bottom center","bottom right"],editType:"calc"}}}},13584:function(t,e,r){"use strict";var n=r(74875);e.name="pie",e.plot=function(t,r,i,a){n.plotBasePlot(e.name,t,r,i,a)},e.clean=function(t,r,i,a){n.cleanBasePlot(e.name,t,r,i,a)}},32354:function(t,e,r){"use strict";var n=r(92770),i=r(84267),a=r(7901),o={};function s(t){return function(e,r){return!!e&&!!(e=i(e)).isValid()&&(e=a.addOpacity(e,e.getAlpha()),t[r]||(t[r]=e),e)}}function l(t,e){var r,n=JSON.stringify(t),a=e[n];if(!a){for(a=t.slice(),r=0;r=0})),("funnelarea"===e.type?y:e.sort)&&a.sort((function(t,e){return e.v-t.v})),a[0]&&(a[0].vTotal=g),a},crossTraceCalc:function(t,e){var r=(e||{}).type;r||(r="pie");var n=t._fullLayout,i=t.calcdata,a=n[r+"colorway"],s=n["_"+r+"colormap"];n["extend"+r+"colors"]&&(a=l(a,o));for(var u=0,c=0;c0){s=!0;break}}s||(o=0)}return{hasLabels:r,hasValues:a,len:o}}function c(t,e,r,n,i){n("marker.line.width")&&n("marker.line.color",i?void 0:r.paper_bgcolor);var a=n("marker.colors");l(n,"marker.pattern",a),t.marker&&!e.marker.pattern.fgcolor&&(e.marker.pattern.fgcolor=t.marker.colors),e.marker.pattern.bgcolor||(e.marker.pattern.bgcolor=r.paper_bgcolor)}t.exports={handleLabelsAndValues:u,handleMarkerDefaults:c,supplyDefaults:function(t,e,r,n){function l(r,n){return i.coerce(t,e,a,r,n)}var f=u(l("labels"),l("values")),h=f.len;if(e._hasLabels=f.hasLabels,e._hasValues=f.hasValues,!e._hasLabels&&e._hasValues&&(l("label0"),l("dlabel")),h){e._length=h,c(t,e,n,l,!0),l("scalegroup");var p,d=l("text"),v=l("texttemplate");if(v||(p=l("textinfo",Array.isArray(d)?"text+percent":"percent")),l("hovertext"),l("hovertemplate"),v||p&&"none"!==p){var g=l("textposition");s(t,e,n,l,g,{moduleHasSelected:!1,moduleHasUnselected:!1,moduleHasConstrain:!1,moduleHasCliponaxis:!1,moduleHasTextangle:!1,moduleHasInsideanchor:!1}),(Array.isArray(g)||"auto"===g||"outside"===g)&&l("automargin"),("inside"===g||"auto"===g||Array.isArray(g))&&l("insidetextorientation")}o(e,n,l);var y=l("hole");if(l("title.text")){var m=l("title.position",y?"middle center":"top center");y||"middle center"!==m||(e.title.position="top center"),i.coerceFont(l,"title.font",n.font)}l("sort"),l("direction"),l("rotation"),l("pull")}else e.visible=!1}}},20007:function(t,e,r){"use strict";var n=r(23469).appendArrayMultiPointValues;t.exports=function(t,e){var r={curveNumber:e.index,pointNumbers:t.pts,data:e._input,fullData:e,label:t.label,color:t.color,value:t.v,percent:t.percent,text:t.text,bbox:t.bbox,v:t.v};return 1===t.pts.length&&(r.pointNumber=r.i=t.pts[0]),n(r,e,t.pts),"funnelarea"===e.type&&(delete r.v,delete r.i),r}},22209:function(t,e,r){"use strict";var n=r(91424),i=r(7901);t.exports=function(t,e,r,a){var o=r.marker.pattern;o&&o.shape?n.pointStyle(t,r,a,e):i.fill(t,e.color)}},53581:function(t,e,r){"use strict";var n=r(71828);function i(t){return-1!==t.indexOf("e")?t.replace(/[.]?0+e/,"e"):-1!==t.indexOf(".")?t.replace(/[.]?0+$/,""):t}e.formatPiePercent=function(t,e){var r=i((100*t).toPrecision(3));return n.numSeparate(r,e)+"%"},e.formatPieValue=function(t,e){var r=i(t.toPrecision(10));return n.numSeparate(r,e)},e.getFirstFilled=function(t,e){if(Array.isArray(t))for(var r=0;r"),name:f.hovertemplate||-1!==h.indexOf("name")?f.name:void 0,idealAlign:t.pxmid[0]<0?"left":"right",color:g.castOption(_.bgcolor,t.pts)||t.color,borderColor:g.castOption(_.bordercolor,t.pts),fontFamily:g.castOption(w.family,t.pts),fontSize:g.castOption(w.size,t.pts),fontColor:g.castOption(w.color,t.pts),nameLength:g.castOption(_.namelength,t.pts),textAlign:g.castOption(_.align,t.pts),hovertemplate:g.castOption(f.hovertemplate,t.pts),hovertemplateLabels:t,eventData:[y(t,f)]},{container:r._hoverlayer.node(),outerContainer:r._paper.node(),gd:e,inOut_bbox:T}),t.bbox=T[0],u._hasHoverLabel=!0}u._hasHoverEvent=!0,e.emit("plotly_hover",{points:[y(t,f)],event:n.event})}})),t.on("mouseout",(function(t){var r=e._fullLayout,i=e._fullData[u.index],o=n.select(this).datum();u._hasHoverEvent&&(t.originalEvent=n.event,e.emit("plotly_unhover",{points:[y(o,i)],event:n.event}),u._hasHoverEvent=!1),u._hasHoverLabel&&(a.loneUnhover(r._hoverlayer.node()),u._hasHoverLabel=!1)})),t.on("click",(function(t){var r=e._fullLayout,i=e._fullData[u.index];e._dragging||!1===r.hovermode||(e._hoverdata=[y(t,i)],a.click(e,n.event))}))}function b(t,e,r){var n=g.castOption(t.insidetextfont.color,e.pts);!n&&t._input.textfont&&(n=g.castOption(t._input.textfont.color,e.pts));var i=g.castOption(t.insidetextfont.family,e.pts)||g.castOption(t.textfont.family,e.pts)||r.family,a=g.castOption(t.insidetextfont.size,e.pts)||g.castOption(t.textfont.size,e.pts)||r.size;return{color:n||o.contrast(e.color),family:i,size:a}}function _(t,e){for(var r,n,i=0;ie&&e>n||r=-4;g-=2)y(Math.PI*g,"tan");for(g=4;g>=-4;g-=2)y(Math.PI*(g+1),"tan")}if(f||p){for(g=4;g>=-4;g-=2)y(Math.PI*(g+1.5),"rad");for(g=4;g>=-4;g-=2)y(Math.PI*(g+.5),"rad")}}if(s||d||f){var m=Math.sqrt(t.width*t.width+t.height*t.height);if((a={scale:i*n*2/m,rCenter:1-i,rotate:0}).textPosAngle=(e.startangle+e.stopangle)/2,a.scale>=1)return a;v.push(a)}(d||p)&&((a=T(t,n,o,l,u)).textPosAngle=(e.startangle+e.stopangle)/2,v.push(a)),(d||h)&&((a=k(t,n,o,l,u)).textPosAngle=(e.startangle+e.stopangle)/2,v.push(a));for(var x=0,b=0,_=0;_=1)break}return v[x]}function T(t,e,r,n,i){e=Math.max(0,e-2*v);var a=t.width/t.height,o=S(a,n,e,r);return{scale:2*o/t.height,rCenter:A(a,o/e),rotate:M(i)}}function k(t,e,r,n,i){e=Math.max(0,e-2*v);var a=t.height/t.width,o=S(a,n,e,r);return{scale:2*o/t.width,rCenter:A(a,o/e),rotate:M(i+Math.PI/2)}}function A(t,e){return Math.cos(e)-t*e}function M(t){return(180/Math.PI*t+720)%180-90}function S(t,e,r,n){var i=t+1/(2*Math.tan(e));return r*Math.min(1/(Math.sqrt(i*i+.5)+i),n/(Math.sqrt(t*t+n/2)+t))}function E(t,e){return t.v!==e.vTotal||e.trace.hole?Math.min(1/(1+1/Math.sin(t.halfangle)),t.ring/2):1}function L(t,e){var r=e.pxmid[0],n=e.pxmid[1],i=t.width/2,a=t.height/2;return r<0&&(i*=-1),n<0&&(a*=-1),{scale:1,rCenter:1,rotate:0,x:i+Math.abs(a)*(i>0?1:-1)/2,y:a/(1+r*r/(n*n)),outside:!0}}function C(t,e){var r,n,i,a=t.trace,o={x:t.cx,y:t.cy},s={tx:0,ty:0};s.ty+=a.title.font.size,i=O(a),-1!==a.title.position.indexOf("top")?(o.y-=(1+i)*t.r,s.ty-=t.titleBox.height):-1!==a.title.position.indexOf("bottom")&&(o.y+=(1+i)*t.r);var l,u=t.r/(void 0===(l=t.trace.aspectratio)?1:l),c=e.w*(a.domain.x[1]-a.domain.x[0])/2;return-1!==a.title.position.indexOf("left")?(c+=u,o.x-=(1+i)*u,s.tx+=t.titleBox.width/2):-1!==a.title.position.indexOf("center")?c*=2:-1!==a.title.position.indexOf("right")&&(c+=u,o.x+=(1+i)*u,s.tx-=t.titleBox.width/2),r=c/t.titleBox.width,n=P(t,e)/t.titleBox.height,{x:o.x,y:o.y,scale:Math.min(r,n),tx:s.tx,ty:s.ty}}function P(t,e){var r=t.trace,n=e.h*(r.domain.y[1]-r.domain.y[0]);return Math.min(t.titleBox.height,n/2)}function O(t){var e,r=t.pull;if(!r)return 0;if(Array.isArray(r))for(r=0,e=0;er&&(r=t.pull[e]);return r}function I(t,e){for(var r=[],n=0;n1?c=(u=r.r)/i.aspectratio:u=(c=r.r)*i.aspectratio,l=(u*=(1+i.baseratio)/2)*c}o=Math.min(o,l/r.vTotal)}for(n=0;n")}if(a){var x=l.castOption(i,e.i,"texttemplate");if(x){var b=function(t){return{label:t.label,value:t.v,valueLabel:g.formatPieValue(t.v,n.separators),percent:t.v/r.vTotal,percentLabel:g.formatPiePercent(t.v/r.vTotal,n.separators),color:t.color,text:t.text,customdata:l.castOption(i,t.i,"customdata")}}(e),_=g.getFirstFilled(i.text,e.pts);(m(_)||""===_)&&(b.text=_),e.text=l.texttemplateString(x,b,t._fullLayout._d3locale,b,i._meta||{})}else e.text=""}}function R(t,e){var r=t.rotate*Math.PI/180,n=Math.cos(r),i=Math.sin(r),a=(e.left+e.right)/2,o=(e.top+e.bottom)/2;t.textX=a*n-o*i,t.textY=a*i+o*n,t.noCenter=!0}t.exports={plot:function(t,e){var r=t._context.staticPlot,a=t._fullLayout,h=a._size;d("pie",a),_(e,t),I(e,h);var v=l.makeTraceGroups(a._pielayer,e,"trace").each((function(e){var d=n.select(this),v=e[0],y=v.trace;!function(t){var e,r,n,i=t[0],a=i.r,o=i.trace,s=g.getRotationAngle(o.rotation),l=2*Math.PI/i.vTotal,u="px0",c="px1";if("counterclockwise"===o.direction){for(e=0;ei.vTotal/2?1:0,r.halfangle=Math.PI*Math.min(r.v/i.vTotal,.5),r.ring=1-o.hole,r.rInscribed=E(r,i))}(e),d.attr("stroke-linejoin","round"),d.each((function(){var m=n.select(this).selectAll("g.slice").data(e);m.enter().append("g").classed("slice",!0),m.exit().remove();var _=[[[],[]],[[],[]]],T=!1;m.each((function(i,o){if(i.hidden)n.select(this).selectAll("path,g").remove();else{i.pointNumber=i.i,i.curveNumber=y.index,_[i.pxmid[1]<0?0:1][i.pxmid[0]<0?0:1].push(i);var u=v.cx,c=v.cy,h=n.select(this),d=h.selectAll("path.surface").data([i]);if(d.enter().append("path").classed("surface",!0).style({"pointer-events":r?"none":"all"}),h.call(x,t,e),y.pull){var m=+g.castOption(y.pull,i.pts)||0;m>0&&(u+=m*i.pxmid[0],c+=m*i.pxmid[1])}i.cxFinal=u,i.cyFinal=c;var k=y.hole;if(i.v===v.vTotal){var A="M"+(u+i.px0[0])+","+(c+i.px0[1])+P(i.px0,i.pxmid,!0,1)+P(i.pxmid,i.px0,!0,1)+"Z";k?d.attr("d","M"+(u+k*i.px0[0])+","+(c+k*i.px0[1])+P(i.px0,i.pxmid,!1,k)+P(i.pxmid,i.px0,!1,k)+"Z"+A):d.attr("d",A)}else{var M=P(i.px0,i.px1,!0,1);if(k){var S=1-k;d.attr("d","M"+(u+k*i.px1[0])+","+(c+k*i.px1[1])+P(i.px1,i.px0,!1,k)+"l"+S*i.px0[0]+","+S*i.px0[1]+M+"Z")}else d.attr("d","M"+u+","+c+"l"+i.px0[0]+","+i.px0[1]+M+"Z")}z(t,i,v);var E=g.castOption(y.textposition,i.pts),C=h.selectAll("g.slicetext").data(i.text&&"none"!==E?[0]:[]);C.enter().append("g").classed("slicetext",!0),C.exit().remove(),C.each((function(){var r=l.ensureSingle(n.select(this),"text","",(function(t){t.attr("data-notex",1)})),h=l.ensureUniformFontSize(t,"outside"===E?function(t,e,r){return{color:g.castOption(t.outsidetextfont.color,e.pts)||g.castOption(t.textfont.color,e.pts)||r.color,family:g.castOption(t.outsidetextfont.family,e.pts)||g.castOption(t.textfont.family,e.pts)||r.family,size:g.castOption(t.outsidetextfont.size,e.pts)||g.castOption(t.textfont.size,e.pts)||r.size}}(y,i,a.font):b(y,i,a.font));r.text(i.text).attr({class:"slicetext",transform:"","text-anchor":"middle"}).call(s.font,h).call(f.convertToTspans,t);var d,m=s.bBox(r.node());if("outside"===E)d=L(m,i);else if(d=w(m,i,v),"auto"===E&&d.scale<1){var x=l.ensureUniformFontSize(t,y.outsidetextfont);r.call(s.font,x),d=L(m=s.bBox(r.node()),i)}var _=d.textPosAngle,k=void 0===_?i.pxmid:D(v.r,_);if(d.targetX=u+k[0]*d.rCenter+(d.x||0),d.targetY=c+k[1]*d.rCenter+(d.y||0),R(d,m),d.outside){var A=d.targetY;i.yLabelMin=A-m.height/2,i.yLabelMid=A,i.yLabelMax=A+m.height/2,i.labelExtraX=0,i.labelExtraY=0,T=!0}d.fontSize=h.size,p(y.type,d,a),e[o].transform=d,l.setTransormAndDisplay(r,d)}))}function P(t,e,r,n){var a=n*(e[0]-t[0]),o=n*(e[1]-t[1]);return"a"+n*v.r+","+n*v.r+" 0 "+i.largeArc+(r?" 1 ":" 0 ")+a+","+o}}));var k=n.select(this).selectAll("g.titletext").data(y.title.text?[0]:[]);if(k.enter().append("g").classed("titletext",!0),k.exit().remove(),k.each((function(){var e,r=l.ensureSingle(n.select(this),"text","",(function(t){t.attr("data-notex",1)})),i=y.title.text;y._meta&&(i=l.templateString(i,y._meta)),r.text(i).attr({class:"titletext",transform:"","text-anchor":"middle"}).call(s.font,y.title.font).call(f.convertToTspans,t),e="middle center"===y.title.position?function(t){var e=Math.sqrt(t.titleBox.width*t.titleBox.width+t.titleBox.height*t.titleBox.height);return{x:t.cx,y:t.cy,scale:t.trace.hole*t.r*2/e,tx:0,ty:-t.titleBox.height/2+t.trace.title.font.size}}(v):C(v,h),r.attr("transform",c(e.x,e.y)+u(Math.min(1,e.scale))+c(e.tx,e.ty))})),T&&function(t,e){var r,n,i,a,o,s,l,u,c,f,h,p,d;function v(t,e){return t.pxmid[1]-e.pxmid[1]}function y(t,e){return e.pxmid[1]-t.pxmid[1]}function m(t,r){r||(r={});var i,u,c,h,p=r.labelExtraY+(n?r.yLabelMax:r.yLabelMin),d=n?t.yLabelMin:t.yLabelMax,v=n?t.yLabelMax:t.yLabelMin,y=t.cyFinal+o(t.px0[1],t.px1[1]),m=p-d;if(m*l>0&&(t.labelExtraY=m),Array.isArray(e.pull))for(u=0;u=(g.castOption(e.pull,c.pts)||0)||((t.pxmid[1]-c.pxmid[1])*l>0?(m=c.cyFinal+o(c.px0[1],c.px1[1])-d-t.labelExtraY)*l>0&&(t.labelExtraY+=m):(v+t.labelExtraY-y)*l>0&&(i=3*s*Math.abs(u-f.indexOf(t)),(h=c.cxFinal+a(c.px0[0],c.px1[0])+i-(t.cxFinal+t.pxmid[0])-t.labelExtraX)*s>0&&(t.labelExtraX+=h)))}for(n=0;n<2;n++)for(i=n?v:y,o=n?Math.max:Math.min,l=n?1:-1,r=0;r<2;r++){for(a=r?Math.max:Math.min,s=r?1:-1,(u=t[n][r]).sort(i),c=t[1-n][r],f=c.concat(u),p=[],h=0;hMath.abs(f)?s+="l"+f*t.pxmid[0]/t.pxmid[1]+","+f+"H"+(a+t.labelExtraX+u):s+="l"+t.labelExtraX+","+c+"v"+(f-c)+"h"+u}else s+="V"+(t.yLabelMid+t.labelExtraY)+"h"+u;l.ensureSingle(r,"path","textline").call(o.stroke,e.outsidetextfont.color).attr({"stroke-width":Math.min(2,e.outsidetextfont.size/8),d:s,fill:"none"})}else r.select("path.textline").remove()}))}(m,y),T&&y.automargin){var A=s.bBox(d.node()),M=y.domain,S=h.w*(M.x[1]-M.x[0]),E=h.h*(M.y[1]-M.y[0]),P=(.5*S-v.r)/h.w,O=(.5*E-v.r)/h.h;i.autoMargin(t,"pie."+y.uid+".automargin",{xl:M.x[0]-P,xr:M.x[1]+P,yb:M.y[0]-O,yt:M.y[1]+O,l:Math.max(v.cx-v.r-A.left,0),r:Math.max(A.right-(v.cx+v.r),0),b:Math.max(A.bottom-(v.cy+v.r),0),t:Math.max(v.cy-v.r-A.top,0),pad:5})}}))}));setTimeout((function(){v.selectAll("tspan").each((function(){var t=n.select(this);t.attr("dy")&&t.attr("dy",t.attr("dy"))}))}),0)},formatSliceLabel:z,transformInsideText:w,determineInsideTextFont:b,positionTitleOutside:C,prerenderTitles:_,layoutAreas:I,attachFxHandlers:x,computeTransform:R}},68357:function(t,e,r){"use strict";var n=r(39898),i=r(63463),a=r(72597).resizeText;t.exports=function(t){var e=t._fullLayout._pielayer.selectAll(".trace");a(t,e,"pie"),e.each((function(e){var r=e[0].trace,a=n.select(this);a.style({opacity:r.opacity}),a.selectAll("path.surface").each((function(e){n.select(this).call(i,e,r,t)}))}))}},63463:function(t,e,r){"use strict";var n=r(7901),i=r(53581).castOption,a=r(22209);t.exports=function(t,e,r,o){var s=r.marker.line,l=i(s.color,e.pts)||n.defaultLine,u=i(s.width,e.pts)||0;t.call(a,e,r,o).style("stroke-width",u).call(n.stroke,l)}},10959:function(t,e,r){"use strict";var n=r(82196);t.exports={x:n.x,y:n.y,xy:{valType:"data_array",editType:"calc"},indices:{valType:"data_array",editType:"calc"},xbounds:{valType:"data_array",editType:"calc"},ybounds:{valType:"data_array",editType:"calc"},text:n.text,marker:{color:{valType:"color",arrayOk:!1,editType:"calc"},opacity:{valType:"number",min:0,max:1,dflt:1,arrayOk:!1,editType:"calc"},blend:{valType:"boolean",dflt:null,editType:"calc"},sizemin:{valType:"number",min:.1,max:2,dflt:.5,editType:"calc"},sizemax:{valType:"number",min:.1,dflt:20,editType:"calc"},border:{color:{valType:"color",arrayOk:!1,editType:"calc"},arearatio:{valType:"number",min:0,max:1,dflt:0,editType:"calc"},editType:"calc"},editType:"calc"},transforms:void 0}},42743:function(t,e,r){"use strict";var n=r(9330).gl_pointcloud2d,i=r(78614),a=r(71739).findExtremes,o=r(34603);function s(t,e){this.scene=t,this.uid=e,this.type="pointcloud",this.pickXData=[],this.pickYData=[],this.xData=[],this.yData=[],this.textLabels=[],this.color="rgb(0, 0, 0)",this.name="",this.hoverinfo="all",this.idToIndex=new Int32Array(0),this.bounds=[0,0,0,0],this.pointcloudOptions={positions:new Float32Array(0),idToIndex:this.idToIndex,sizemin:.5,sizemax:12,color:[0,0,0,1],areaRatio:1,borderColor:[0,0,0,1]},this.pointcloud=n(t.glplot,this.pointcloudOptions),this.pointcloud._trace=this}var l=s.prototype;l.handlePick=function(t){var e=this.idToIndex[t.pointId];return{trace:this,dataCoord:t.dataCoord,traceCoord:this.pickXYData?[this.pickXYData[2*e],this.pickXYData[2*e+1]]:[this.pickXData[e],this.pickYData[e]],textLabel:Array.isArray(this.textLabels)?this.textLabels[e]:this.textLabels,color:this.color,name:this.name,pointIndex:e,hoverinfo:this.hoverinfo}},l.update=function(t){this.index=t.index,this.textLabels=t.text,this.name=t.name,this.hoverinfo=t.hoverinfo,this.bounds=[1/0,1/0,-1/0,-1/0],this.updateFast(t),this.color=o(t,{})},l.updateFast=function(t){var e,r,n,o,s,l,u=this.xData=this.pickXData=t.x,c=this.yData=this.pickYData=t.y,f=this.pickXYData=t.xy,h=t.xbounds&&t.ybounds,p=t.indices,d=this.bounds;if(f){if(n=f,e=f.length>>>1,h)d[0]=t.xbounds[0],d[2]=t.xbounds[1],d[1]=t.ybounds[0],d[3]=t.ybounds[1];else for(l=0;ld[2]&&(d[2]=o),sd[3]&&(d[3]=s);if(p)r=p;else for(r=new Int32Array(e),l=0;ld[2]&&(d[2]=o),sd[3]&&(d[3]=s);this.idToIndex=r,this.pointcloudOptions.idToIndex=r,this.pointcloudOptions.positions=n;var v=i(t.marker.color),g=i(t.marker.border.color),y=t.opacity*t.marker.opacity;v[3]*=y,this.pointcloudOptions.color=v;var m=t.marker.blend;null===m&&(m=u.length<100||c.length<100),this.pointcloudOptions.blend=m,g[3]*=y,this.pointcloudOptions.borderColor=g;var x=t.marker.sizemin,b=Math.max(t.marker.sizemax,t.marker.sizemin);this.pointcloudOptions.sizeMin=x,this.pointcloudOptions.sizeMax=b,this.pointcloudOptions.areaRatio=t.marker.border.arearatio,this.pointcloud.update(this.pointcloudOptions);var _=this.scene.xaxis,w=this.scene.yaxis,T=b/2||.5;t._extremes[_._id]=a(_,[d[0],d[2]],{ppad:T}),t._extremes[w._id]=a(w,[d[1],d[3]],{ppad:T})},l.dispose=function(){this.pointcloud.dispose()},t.exports=function(t,e){var r=new s(t,e.uid);return r.update(e),r}},33876:function(t,e,r){"use strict";var n=r(71828),i=r(10959);t.exports=function(t,e,r){function a(r,a){return n.coerce(t,e,i,r,a)}a("x"),a("y"),a("xbounds"),a("ybounds"),t.xy&&t.xy instanceof Float32Array&&(e.xy=t.xy),t.indices&&t.indices instanceof Int32Array&&(e.indices=t.indices),a("text"),a("marker.color",r),a("marker.opacity"),a("marker.blend"),a("marker.sizemin"),a("marker.sizemax"),a("marker.border.color",r),a("marker.border.arearatio"),e._length=null}},20593:function(t,e,r){"use strict";["*pointcloud* trace is deprecated!","Please consider switching to the *scattergl* trace type."].join(" "),t.exports={attributes:r(10959),supplyDefaults:r(33876),calc:r(36563),plot:r(42743),moduleType:"trace",name:"pointcloud",basePlotModule:r(4796),categories:["gl","gl2d","showLegend"],meta:{}}},39953:function(t,e,r){"use strict";var n=r(41940),i=r(9012),a=r(22399),o=r(77914),s=r(27670).Y,l=r(5386).fF,u=r(50693),c=r(44467).templatedArray,f=r(12663).descriptionOnlyNumbers,h=r(1426).extendFlat,p=r(30962).overrideAll;(t.exports=p({hoverinfo:h({},i.hoverinfo,{flags:[],arrayOk:!1}),hoverlabel:o.hoverlabel,domain:s({name:"sankey",trace:!0}),orientation:{valType:"enumerated",values:["v","h"],dflt:"h"},valueformat:{valType:"string",dflt:".3s",description:f("value")},valuesuffix:{valType:"string",dflt:""},arrangement:{valType:"enumerated",values:["snap","perpendicular","freeform","fixed"],dflt:"snap"},textfont:n({}),customdata:void 0,node:{label:{valType:"data_array",dflt:[]},groups:{valType:"info_array",impliedEdits:{x:[],y:[]},dimensions:2,freeLength:!0,dflt:[],items:{valType:"number",editType:"calc"}},x:{valType:"data_array",dflt:[]},y:{valType:"data_array",dflt:[]},color:{valType:"color",arrayOk:!0},customdata:{valType:"data_array",editType:"calc"},line:{color:{valType:"color",dflt:a.defaultLine,arrayOk:!0},width:{valType:"number",min:0,dflt:.5,arrayOk:!0}},pad:{valType:"number",arrayOk:!1,min:0,dflt:20},thickness:{valType:"number",arrayOk:!1,min:1,dflt:20},hoverinfo:{valType:"enumerated",values:["all","none","skip"],dflt:"all"},hoverlabel:o.hoverlabel,hovertemplate:l({},{keys:["value","label"]})},link:{arrowlen:{valType:"number",min:0,dflt:0},label:{valType:"data_array",dflt:[]},color:{valType:"color",arrayOk:!0},customdata:{valType:"data_array",editType:"calc"},line:{color:{valType:"color",dflt:a.defaultLine,arrayOk:!0},width:{valType:"number",min:0,dflt:0,arrayOk:!0}},source:{valType:"data_array",dflt:[]},target:{valType:"data_array",dflt:[]},value:{valType:"data_array",dflt:[]},hoverinfo:{valType:"enumerated",values:["all","none","skip"],dflt:"all"},hoverlabel:o.hoverlabel,hovertemplate:l({},{keys:["value","label"]}),colorscales:c("concentrationscales",{editType:"calc",label:{valType:"string",editType:"calc",dflt:""},cmax:{valType:"number",editType:"calc",dflt:1},cmin:{valType:"number",editType:"calc",dflt:0},colorscale:h(u().colorscale,{dflt:[[0,"white"],[1,"black"]]})})}},"calc","nested")).transforms=void 0},75536:function(t,e,r){"use strict";var n=r(30962).overrideAll,i=r(27659).a0,a=r(60436),o=r(528),s=r(6964),l=r(28569),u=r(47322).prepSelect,c=r(71828),f=r(73972),h="sankey";function p(t,e){var r=t._fullData[e],n=t._fullLayout,i=n.dragmode,a="pan"===n.dragmode?"move":"crosshair",o=r._bgRect;if(o&&"pan"!==i&&"zoom"!==i){s(o,a);var h={_id:"x",c2p:c.identity,_offset:r._sankey.translateX,_length:r._sankey.width},p={_id:"y",c2p:c.identity,_offset:r._sankey.translateY,_length:r._sankey.height},d={gd:t,element:o.node(),plotinfo:{id:e,xaxis:h,yaxis:p,fillRangeItems:c.noop},subplot:e,xaxes:[h],yaxes:[p],doneFnCompleted:function(r){var n,i=t._fullData[e],a=i.node.groups.slice(),o=[];function s(t){for(var e=i._sankey.graph.nodes,r=0;rm&&(m=a.source[e]),a.target[e]>m&&(m=a.target[e]);var x,b=m+1;t.node._count=b;var _=t.node.groups,w={};for(e=0;e<_.length;e++){var T=_[e];for(x=0;x0&&s(E,b)&&s(L,b)&&(!w.hasOwnProperty(E)||!w.hasOwnProperty(L)||w[E]!==w[L])){w.hasOwnProperty(L)&&(L=w[L]),w.hasOwnProperty(E)&&(E=w[E]),L=+L,h[E=+E]=h[L]=!0;var C="";a.label&&a.label[e]&&(C=a.label[e]);var P=null;C&&p.hasOwnProperty(C)&&(P=p[C]),u.push({pointNumber:e,label:C,color:c?a.color[e]:a.color,customdata:f?a.customdata[e]:a.customdata,concentrationscale:P,source:E,target:L,value:+S}),M.source.push(E),M.target.push(L)}}var O=b+_.length,I=o(r.color),D=o(r.customdata),z=[];for(e=0;eb-1,childrenNodes:[],pointNumber:e,label:R,color:I?r.color[e]:r.color,customdata:D?r.customdata[e]:r.customdata})}var F=!1;return function(t,e,r){for(var a=i.init2dArray(t,0),o=0;o1}))}(O,M.source,M.target)&&(F=!0),{circular:F,links:u,nodes:z,groups:_,groupLookup:w}}(e);return a({circular:r.circular,_nodes:r.nodes,_links:r.links,_groups:r.groups,_groupLookup:r.groupLookup})}},85247:function(t){"use strict";t.exports={nodeTextOffsetHorizontal:4,nodeTextOffsetVertical:3,nodePadAcross:10,sankeyIterations:50,forceIterations:5,forceTicksPerFrame:10,duration:500,ease:"linear",cn:{sankey:"sankey",sankeyLinks:"sankey-links",sankeyLink:"sankey-link",sankeyNodeSet:"sankey-node-set",sankeyNode:"sankey-node",nodeRect:"node-rect",nodeLabel:"node-label"}}},26857:function(t,e,r){"use strict";var n=r(71828),i=r(39953),a=r(7901),o=r(84267),s=r(27670).c,l=r(38048),u=r(44467),c=r(85501);function f(t,e){function r(r,a){return n.coerce(t,e,i.link.colorscales,r,a)}r("label"),r("cmin"),r("cmax"),r("colorscale")}t.exports=function(t,e,r,h){function p(r,a){return n.coerce(t,e,i,r,a)}var d=n.extendDeep(h.hoverlabel,t.hoverlabel),v=t.node,g=u.newContainer(e,"node");function y(t,e){return n.coerce(v,g,i.node,t,e)}y("label"),y("groups"),y("x"),y("y"),y("pad"),y("thickness"),y("line.color"),y("line.width"),y("hoverinfo",t.hoverinfo),l(v,g,y,d),y("hovertemplate");var m=h.colorway;y("color",g.label.map((function(t,e){return a.addOpacity(function(t){return m[t%m.length]}(e),.8)}))),y("customdata");var x=t.link||{},b=u.newContainer(e,"link");function _(t,e){return n.coerce(x,b,i.link,t,e)}_("label"),_("arrowlen"),_("source"),_("target"),_("value"),_("line.color"),_("line.width"),_("hoverinfo",t.hoverinfo),l(x,b,_,d),_("hovertemplate");var w,T=o(h.paper_bgcolor).getLuminance()<.333?"rgba(255, 255, 255, 0.6)":"rgba(0, 0, 0, 0.2)";_("color",n.repeat(T,b.value.length)),_("customdata"),c(x,b,{name:"colorscales",handleItemDefaults:f}),s(e,h,p),p("orientation"),p("valueformat"),p("valuesuffix"),g.x.length&&g.y.length&&(w="freeform"),p("arrangement",w),n.coerceFont(p,"textfont",n.extendFlat({},h.font)),e._length=null}},29396:function(t,e,r){"use strict";t.exports={attributes:r(39953),supplyDefaults:r(26857),calc:r(92930),plot:r(60436),moduleType:"trace",name:"sankey",basePlotModule:r(75536),selectPoints:r(84564),categories:["noOpacity"],meta:{}}},60436:function(t,e,r){"use strict";var n=r(39898),i=r(71828),a=i.numberFormat,o=r(3393),s=r(30211),l=r(7901),u=r(85247).cn,c=i._;function f(t){return""!==t}function h(t,e){return t.filter((function(t){return t.key===e.traceId}))}function p(t,e){n.select(t).select("path").style("fill-opacity",e),n.select(t).select("rect").style("fill-opacity",e)}function d(t){n.select(t).select("text.name").style("fill","black")}function v(t){return function(e){return-1!==t.node.sourceLinks.indexOf(e.link)||-1!==t.node.targetLinks.indexOf(e.link)}}function g(t){return function(e){return-1!==e.node.sourceLinks.indexOf(t.link)||-1!==e.node.targetLinks.indexOf(t.link)}}function y(t,e,r){e&&r&&h(r,e).selectAll("."+u.sankeyLink).filter(v(e)).call(x.bind(0,e,r,!1))}function m(t,e,r){e&&r&&h(r,e).selectAll("."+u.sankeyLink).filter(v(e)).call(b.bind(0,e,r,!1))}function x(t,e,r,n){var i=n.datum().link.label;n.style("fill-opacity",(function(t){if(!t.link.concentrationscale)return.4})),i&&h(e,t).selectAll("."+u.sankeyLink).filter((function(t){return t.link.label===i})).style("fill-opacity",(function(t){if(!t.link.concentrationscale)return.4})),r&&h(e,t).selectAll("."+u.sankeyNode).filter(g(t)).call(y)}function b(t,e,r,n){var i=n.datum().link.label;n.style("fill-opacity",(function(t){return t.tinyColorAlpha})),i&&h(e,t).selectAll("."+u.sankeyLink).filter((function(t){return t.link.label===i})).style("fill-opacity",(function(t){return t.tinyColorAlpha})),r&&h(e,t).selectAll(u.sankeyNode).filter(g(t)).call(m)}function _(t,e){var r=t.hoverlabel||{},n=i.nestedProperty(r,e).get();return!Array.isArray(n)&&n}t.exports=function(t,e){for(var r=t._fullLayout,i=r._paper,h=r._size,v=0;v"),color:_(o,"bgcolor")||l.addOpacity(v.color,1),borderColor:_(o,"bordercolor"),fontFamily:_(o,"font.family"),fontSize:_(o,"font.size"),fontColor:_(o,"font.color"),nameLength:_(o,"namelength"),textAlign:_(o,"align"),idealAlign:n.event.x"),color:_(o,"bgcolor")||i.tinyColorHue,borderColor:_(o,"bordercolor"),fontFamily:_(o,"font.family"),fontSize:_(o,"font.size"),fontColor:_(o,"font.color"),nameLength:_(o,"namelength"),textAlign:_(o,"align"),idealAlign:"left",hovertemplate:o.hovertemplate,hovertemplateLabels:m,eventData:[i.node]},{container:r._hoverlayer.node(),outerContainer:r._paper.node(),gd:t});p(w,.85),d(w)}}},unhover:function(e,i,a){!1!==t._fullLayout.hovermode&&(n.select(e).call(m,i,a),"skip"!==i.node.trace.node.hoverinfo&&(i.node.fullData=i.node.trace,t.emit("plotly_unhover",{event:n.event,points:[i.node]})),s.loneUnhover(r._hoverlayer.node()))},select:function(e,r,i){var a=r.node;a.originalEvent=n.event,t._hoverdata=[a],n.select(e).call(m,r,i),s.click(t,{target:!0})}}})}},3393:function(t,e,r){"use strict";var n=r(49887),i=r(81684).k4,a=r(39898),o=r(30838),s=r(86781),l=r(85247),u=r(84267),c=r(7901),f=r(91424),h=r(71828),p=h.strTranslate,d=h.strRotate,v=r(28984),g=v.keyFun,y=v.repeat,m=v.unwrap,x=r(63893),b=r(73972),_=r(18783),w=_.CAP_SHIFT,T=_.LINE_SPACING;function k(t,e,r){var n,i=m(e),a=i.trace,c=a.domain,f="h"===a.orientation,p=a.node.pad,d=a.node.thickness,v=t.width*(c.x[1]-c.x[0]),g=t.height*(c.y[1]-c.y[0]),y=i._nodes,x=i._links,b=i.circular;(n=b?s.sankeyCircular().circularLinkGap(0):o.sankey()).iterations(l.sankeyIterations).size(f?[v,g]:[g,v]).nodeWidth(d).nodePadding(p).nodeId((function(t){return t.pointNumber})).nodes(y).links(x);var _,w,T,k=n();for(var A in n.nodePadding()o+d&&(a+=1,e=s.x0),o=s.x0,i[a]||(i[a]=[]),i[a].push(s),r=e-s.x0,s.x0+=r,s.x1+=r}return i}(y=k.nodes).forEach((function(t){var e,r,n,i=0,a=t.length;for(t.sort((function(t,e){return t.y0-e.y0})),n=0;n=i||(r=i-e.y0)>1e-6&&(e.y0+=r,e.y1+=r),i=e.y1+p})),n.update(k)}return{circular:b,key:r,trace:a,guid:h.randstr(),horizontal:f,width:v,height:g,nodePad:a.node.pad,nodeLineColor:a.node.line.color,nodeLineWidth:a.node.line.width,linkLineColor:a.link.line.color,linkLineWidth:a.link.line.width,linkArrowLength:a.link.arrowlen,valueFormat:a.valueformat,valueSuffix:a.valuesuffix,textFont:a.textfont,translateX:c.x[0]*t.width+t.margin.l,translateY:t.height-c.y[1]*t.height+t.margin.t,dragParallel:f?g:v,dragPerpendicular:f?v:g,arrangement:a.arrangement,sankey:n,graph:k,forceLayouts:{},interactionState:{dragInProgress:!1,hovered:!1}}}function A(t,e,r){var n=u(e.color),i=e.source.label+"|"+e.target.label+"__"+r;return e.trace=t.trace,e.curveNumber=t.trace.index,{circular:t.circular,key:i,traceId:t.key,pointNumber:e.pointNumber,link:e,tinyColorHue:c.tinyRGB(n),tinyColorAlpha:n.getAlpha(),linkPath:M,linkLineColor:t.linkLineColor,linkLineWidth:t.linkLineWidth,linkArrowLength:t.linkArrowLength,valueFormat:t.valueFormat,valueSuffix:t.valueSuffix,sankey:t.sankey,parent:t,interactionState:t.interactionState,flow:e.flow}}function M(){return function(t){var e=t.linkArrowLength;if(t.link.circular)return function(t,e){var r=t.width/2,n=t.circularPathData;return"top"===t.circularLinkType?"M "+(n.targetX-e)+" "+(n.targetY+r)+" L"+(n.rightInnerExtent-e)+" "+(n.targetY+r)+"A"+(n.rightLargeArcRadius+r)+" "+(n.rightSmallArcRadius+r)+" 0 0 1 "+(n.rightFullExtent-r-e)+" "+(n.targetY-n.rightSmallArcRadius)+"L"+(n.rightFullExtent-r-e)+" "+n.verticalRightInnerExtent+"A"+(n.rightLargeArcRadius+r)+" "+(n.rightLargeArcRadius+r)+" 0 0 1 "+(n.rightInnerExtent-e)+" "+(n.verticalFullExtent-r)+"L"+n.leftInnerExtent+" "+(n.verticalFullExtent-r)+"A"+(n.leftLargeArcRadius+r)+" "+(n.leftLargeArcRadius+r)+" 0 0 1 "+(n.leftFullExtent+r)+" "+n.verticalLeftInnerExtent+"L"+(n.leftFullExtent+r)+" "+(n.sourceY-n.leftSmallArcRadius)+"A"+(n.leftLargeArcRadius+r)+" "+(n.leftSmallArcRadius+r)+" 0 0 1 "+n.leftInnerExtent+" "+(n.sourceY+r)+"L"+n.sourceX+" "+(n.sourceY+r)+"L"+n.sourceX+" "+(n.sourceY-r)+"L"+n.leftInnerExtent+" "+(n.sourceY-r)+"A"+(n.leftLargeArcRadius-r)+" "+(n.leftSmallArcRadius-r)+" 0 0 0 "+(n.leftFullExtent-r)+" "+(n.sourceY-n.leftSmallArcRadius)+"L"+(n.leftFullExtent-r)+" "+n.verticalLeftInnerExtent+"A"+(n.leftLargeArcRadius-r)+" "+(n.leftLargeArcRadius-r)+" 0 0 0 "+n.leftInnerExtent+" "+(n.verticalFullExtent+r)+"L"+(n.rightInnerExtent-e)+" "+(n.verticalFullExtent+r)+"A"+(n.rightLargeArcRadius-r)+" "+(n.rightLargeArcRadius-r)+" 0 0 0 "+(n.rightFullExtent+r-e)+" "+n.verticalRightInnerExtent+"L"+(n.rightFullExtent+r-e)+" "+(n.targetY-n.rightSmallArcRadius)+"A"+(n.rightLargeArcRadius-r)+" "+(n.rightSmallArcRadius-r)+" 0 0 0 "+(n.rightInnerExtent-e)+" "+(n.targetY-r)+"L"+(n.targetX-e)+" "+(n.targetY-r)+(e>0?"L"+n.targetX+" "+n.targetY:"")+"Z":"M "+(n.targetX-e)+" "+(n.targetY-r)+" L"+(n.rightInnerExtent-e)+" "+(n.targetY-r)+"A"+(n.rightLargeArcRadius+r)+" "+(n.rightSmallArcRadius+r)+" 0 0 0 "+(n.rightFullExtent-r-e)+" "+(n.targetY+n.rightSmallArcRadius)+"L"+(n.rightFullExtent-r-e)+" "+n.verticalRightInnerExtent+"A"+(n.rightLargeArcRadius+r)+" "+(n.rightLargeArcRadius+r)+" 0 0 0 "+(n.rightInnerExtent-e)+" "+(n.verticalFullExtent+r)+"L"+n.leftInnerExtent+" "+(n.verticalFullExtent+r)+"A"+(n.leftLargeArcRadius+r)+" "+(n.leftLargeArcRadius+r)+" 0 0 0 "+(n.leftFullExtent+r)+" "+n.verticalLeftInnerExtent+"L"+(n.leftFullExtent+r)+" "+(n.sourceY+n.leftSmallArcRadius)+"A"+(n.leftLargeArcRadius+r)+" "+(n.leftSmallArcRadius+r)+" 0 0 0 "+n.leftInnerExtent+" "+(n.sourceY-r)+"L"+n.sourceX+" "+(n.sourceY-r)+"L"+n.sourceX+" "+(n.sourceY+r)+"L"+n.leftInnerExtent+" "+(n.sourceY+r)+"A"+(n.leftLargeArcRadius-r)+" "+(n.leftSmallArcRadius-r)+" 0 0 1 "+(n.leftFullExtent-r)+" "+(n.sourceY+n.leftSmallArcRadius)+"L"+(n.leftFullExtent-r)+" "+n.verticalLeftInnerExtent+"A"+(n.leftLargeArcRadius-r)+" "+(n.leftLargeArcRadius-r)+" 0 0 1 "+n.leftInnerExtent+" "+(n.verticalFullExtent-r)+"L"+(n.rightInnerExtent-e)+" "+(n.verticalFullExtent-r)+"A"+(n.rightLargeArcRadius-r)+" "+(n.rightLargeArcRadius-r)+" 0 0 1 "+(n.rightFullExtent+r-e)+" "+n.verticalRightInnerExtent+"L"+(n.rightFullExtent+r-e)+" "+(n.targetY+n.rightSmallArcRadius)+"A"+(n.rightLargeArcRadius-r)+" "+(n.rightSmallArcRadius-r)+" 0 0 1 "+(n.rightInnerExtent-e)+" "+(n.targetY+r)+"L"+(n.targetX-e)+" "+(n.targetY+r)+(e>0?"L"+n.targetX+" "+n.targetY:"")+"Z"}(t.link,e);var r=Math.abs((t.link.target.x0-t.link.source.x1)/2);e>r&&(e=r);var n=t.link.source.x1,a=t.link.target.x0-e,o=i(n,a),s=o(.5),l=o(.5),u=t.link.y0-t.link.width/2,c=t.link.y0+t.link.width/2,f=t.link.y1-t.link.width/2,h=t.link.y1+t.link.width/2,p="M"+n+","+u,d="C"+s+","+u+" "+l+","+f+" "+a+","+f,v="C"+l+","+h+" "+s+","+c+" "+n+","+c,g=e>0?"L"+(a+e)+","+(f+t.link.width/2):"";return p+d+(g+="L"+a+","+h)+v+"Z"}}function S(t,e){var r=u(e.color),n=l.nodePadAcross,i=t.nodePad/2;e.dx=e.x1-e.x0,e.dy=e.y1-e.y0;var a=e.dx,o=Math.max(.5,e.dy),s="node_"+e.pointNumber;return e.group&&(s=h.randstr()),e.trace=t.trace,e.curveNumber=t.trace.index,{index:e.pointNumber,key:s,partOfGroup:e.partOfGroup||!1,group:e.group,traceId:t.key,trace:t.trace,node:e,nodePad:t.nodePad,nodeLineColor:t.nodeLineColor,nodeLineWidth:t.nodeLineWidth,textFont:t.textFont,size:t.horizontal?t.height:t.width,visibleWidth:Math.ceil(a),visibleHeight:o,zoneX:-n,zoneY:-i,zoneWidth:a+2*n,zoneHeight:o+2*i,labelY:t.horizontal?e.dy/2+1:e.dx/2+1,left:1===e.originalLayer,sizeAcross:t.width,forceLayouts:t.forceLayouts,horizontal:t.horizontal,darkBackground:r.getBrightness()<=128,tinyColorHue:c.tinyRGB(r),tinyColorAlpha:r.getAlpha(),valueFormat:t.valueFormat,valueSuffix:t.valueSuffix,sankey:t.sankey,graph:t.graph,arrangement:t.arrangement,uniqueNodeLabelPathId:[t.guid,t.key,s].join("_"),interactionState:t.interactionState,figure:t}}function E(t){t.attr("transform",(function(t){return p(t.node.x0.toFixed(3),t.node.y0.toFixed(3))}))}function L(t){t.call(E)}function C(t,e){t.call(L),e.attr("d",M())}function P(t){t.attr("width",(function(t){return t.node.x1-t.node.x0})).attr("height",(function(t){return t.visibleHeight}))}function O(t){return t.link.width>1||t.linkLineWidth>0}function I(t){return p(t.translateX,t.translateY)+(t.horizontal?"matrix(1 0 0 1 0 0)":"matrix(0 1 1 0 0 0)")}function D(t,e,r){t.on(".basic",null).on("mouseover.basic",(function(t){t.interactionState.dragInProgress||t.partOfGroup||(r.hover(this,t,e),t.interactionState.hovered=[this,t])})).on("mousemove.basic",(function(t){t.interactionState.dragInProgress||t.partOfGroup||(r.follow(this,t),t.interactionState.hovered=[this,t])})).on("mouseout.basic",(function(t){t.interactionState.dragInProgress||t.partOfGroup||(r.unhover(this,t,e),t.interactionState.hovered=!1)})).on("click.basic",(function(t){t.interactionState.hovered&&(r.unhover(this,t,e),t.interactionState.hovered=!1),t.interactionState.dragInProgress||t.partOfGroup||r.select(this,t,e)}))}function z(t,e,r,i){var o=a.behavior.drag().origin((function(t){return{x:t.node.x0+t.visibleWidth/2,y:t.node.y0+t.visibleHeight/2}})).on("dragstart",(function(a){if("fixed"!==a.arrangement&&(h.ensureSingle(i._fullLayout._infolayer,"g","dragcover",(function(t){i._fullLayout._dragCover=t})),h.raiseToTop(this),a.interactionState.dragInProgress=a.node,F(a.node),a.interactionState.hovered&&(r.nodeEvents.unhover.apply(0,a.interactionState.hovered),a.interactionState.hovered=!1),"snap"===a.arrangement)){var o=a.traceId+"|"+a.key;a.forceLayouts[o]?a.forceLayouts[o].alpha(1):function(t,e,r,i){!function(t){for(var e=0;e0&&n.forceLayouts[e].alpha(0)}}(0,e,a,r)).stop()}(0,o,a),function(t,e,r,n,i){window.requestAnimationFrame((function a(){var o;for(o=0;o0)window.requestAnimationFrame(a);else{var s=r.node.originalX;r.node.x0=s-r.visibleWidth/2,r.node.x1=s+r.visibleWidth/2,R(r,i)}}))}(t,e,a,o,i)}})).on("drag",(function(r){if("fixed"!==r.arrangement){var n=a.event.x,i=a.event.y;"snap"===r.arrangement?(r.node.x0=n-r.visibleWidth/2,r.node.x1=n+r.visibleWidth/2,r.node.y0=i-r.visibleHeight/2,r.node.y1=i+r.visibleHeight/2):("freeform"===r.arrangement&&(r.node.x0=n-r.visibleWidth/2,r.node.x1=n+r.visibleWidth/2),i=Math.max(0,Math.min(r.size-r.visibleHeight/2,i)),r.node.y0=i-r.visibleHeight/2,r.node.y1=i+r.visibleHeight/2),F(r.node),"snap"!==r.arrangement&&(r.sankey.update(r.graph),C(t.filter(B(r)),e))}})).on("dragend",(function(t){if("fixed"!==t.arrangement){t.interactionState.dragInProgress=!1;for(var e=0;el&&C[y].gap;)y--;for(x=C[y].s,v=C.length-1;v>y;v--)C[v].s=x;for(;lS[f]&&f=0;f--){var h=t[f];if("scatter"===h.type&&h.xaxis===u.xaxis&&h.yaxis===u.yaxis){h.opacity=void 0;break}}}}}},17438:function(t,e,r){"use strict";var n=r(71828),i=r(73972),a=r(82196),o=r(47581),s=r(34098),l=r(67513),u=r(73927),c=r(565),f=r(49508),h=r(11058),p=r(94039),d=r(82410),v=r(28908),g=r(71828).coercePattern;t.exports=function(t,e,r,y){function m(r,i){return n.coerce(t,e,a,r,i)}var x=l(t,e,y,m);if(x||(e.visible=!1),e.visible){u(t,e,y,m),m("xhoverformat"),m("yhoverformat");var b=c(t,e,y,m);"group"===y.scattermode&&void 0===e.orientation&&m("orientation","v");var _=!b&&x=Math.min(e,r)&&d<=Math.max(e,r)?0:1/0}var n=Math.max(3,t.mrc||0),i=1-1/n,a=Math.abs(h.c2p(t.x)-d);return a=Math.min(e,r)&&v<=Math.max(e,r)?0:1/0}var n=Math.max(3,t.mrc||0),i=1-1/n,a=Math.abs(p.c2p(t.y)-v);return aY!=(N=D[O][1])>=Y&&(R=D[O-1][0],F=D[O][0],N-B&&(z=R+(F-R)*(Y-B)/(N-B),H=Math.min(H,z),q=Math.max(q,z)));H=Math.max(H,0),q=Math.min(q,h._length);var W=s.defaultLine;return s.opacity(f.fillcolor)?W=f.fillcolor:s.opacity((f.line||{}).color)&&(W=f.line.color),n.extendFlat(t,{distance:t.maxHoverDistance,x0:H,x1:q,y0:Y,y1:Y,color:W,hovertemplate:!1}),delete t.index,f.text&&!Array.isArray(f.text)?t.text=String(f.text):t.text=f.name,[t]}}}},67368:function(t,e,r){"use strict";var n=r(34098);t.exports={hasLines:n.hasLines,hasMarkers:n.hasMarkers,hasText:n.hasText,isBubble:n.isBubble,attributes:r(82196),layoutAttributes:r(21479),supplyDefaults:r(17438),crossTraceDefaults:r(34936),supplyLayoutDefaults:r(79334),calc:r(47761).calc,crossTraceCalc:r(72626),arraysToCalcdata:r(75225),plot:r(32663),colorbar:r(4898),formatLabels:r(8225),style:r(16296).style,styleOnSelect:r(16296).styleOnSelect,hoverPoints:r(33720),selectPoints:r(98002),animatable:!0,moduleType:"trace",name:"scatter",basePlotModule:r(93612),categories:["cartesian","svg","symbols","errorBarsOK","showLegend","scatter-like","zoomScale"],meta:{}}},21479:function(t){"use strict";t.exports={scattermode:{valType:"enumerated",values:["group","overlay"],dflt:"overlay",editType:"calc"},scattergap:{valType:"number",min:0,max:1,editType:"calc"}}},79334:function(t,e,r){"use strict";var n=r(71828),i=r(21479);t.exports=function(t,e){var r,a="group"===e.barmode;"group"===e.scattermode&&("scattergap",r=a?e.bargap:.2,n.coerce(t,e,i,"scattergap",r))}},11058:function(t,e,r){"use strict";var n=r(71828).isArrayOrTypedArray,i=r(52075).hasColorscale,a=r(1586);t.exports=function(t,e,r,o,s,l){l||(l={});var u=(t.marker||{}).color;s("line.color",r),i(t,"line")?a(t,e,o,s,{prefix:"line.",cLetter:"c"}):s("line.color",!n(u)&&u||r),s("line.width"),l.noDash||s("line.dash"),l.backoff&&s("line.backoff")}},34621:function(t,e,r){"use strict";var n=r(91424),i=r(50606),a=i.BADNUM,o=i.LOG_CLIP,s=o+.5,l=o-.5,u=r(71828),c=u.segmentsIntersect,f=u.constrain,h=r(47581);t.exports=function(t,e){var r,i,o,p,d,v,g,y,m,x,b,_,w,T,k,A,M,S,E=e.trace||{},L=e.xaxis,C=e.yaxis,P="log"===L.type,O="log"===C.type,I=L._length,D=C._length,z=e.backoff,R=E.marker,F=e.connectGaps,B=e.baseTolerance,N=e.shape,j="linear"===N,U=E.fill&&"none"!==E.fill,V=[],H=h.minTolerance,q=t.length,G=new Array(q),Z=0;function Y(r){var n=t[r];if(!n)return!1;var i=e.linearized?L.l2p(n.x):L.c2p(n.x),o=e.linearized?C.l2p(n.y):C.c2p(n.y);if(i===a){if(P&&(i=L.c2p(n.x,!0)),i===a)return!1;O&&o===a&&(i*=Math.abs(L._m*D*(L._m>0?s:l)/(C._m*I*(C._m>0?s:l)))),i*=1e3}if(o===a){if(O&&(o=C.c2p(n.y,!0)),o===a)return!1;o*=1e3}return[i,o]}function W(t,e,r,n){var i=r-t,a=n-e,o=.5-t,s=.5-e,l=i*i+a*a,u=i*o+a*s;if(u>0&&uot||t[1]lt)return[f(t[0],at,ot),f(t[1],st,lt)]}function ft(t,e){return t[0]===e[0]&&(t[0]===at||t[0]===ot)||t[1]===e[1]&&(t[1]===st||t[1]===lt)||void 0}function ht(t,e,r){return function(n,i){var a=ct(n),o=ct(i),s=[];if(a&&o&&ft(a,o))return s;a&&s.push(a),o&&s.push(o);var l=2*u.constrain((n[t]+i[t])/2,e,r)-((a||n)[t]+(o||i)[t]);return l&&((a&&o?l>0==a[t]>o[t]?a:o:a||o)[t]+=l),s}}function pt(t){var e=t[0],r=t[1],n=e===G[Z-1][0],i=r===G[Z-1][1];if(!n||!i)if(Z>1){var a=e===G[Z-2][0],o=r===G[Z-2][1];n&&(e===at||e===ot)&&a?o?Z--:G[Z-1]=t:i&&(r===st||r===lt)&&o?a?Z--:G[Z-1]=t:G[Z++]=t}else G[Z++]=t}function dt(t){G[Z-1][0]!==t[0]&&G[Z-1][1]!==t[1]&&pt([Q,tt]),pt(t),et=null,Q=tt=0}"linear"===N||"spline"===N?nt=function(t,e){for(var r=[],n=0,i=0;i<4;i++){var a=ut[i],o=c(t[0],t[1],e[0],e[1],a[0],a[1],a[2],a[3]);o&&(!n||Math.abs(o.x-r[0][0])>1||Math.abs(o.y-r[0][1])>1)&&(o=[o.x,o.y],n&&J(o,t)ot?ot:0,$=e[1]lt?lt:0,K||$){if(Z)if(et){var n=nt(et,e);n.length>1&&(dt(n[0]),G[Z++]=n[1])}else rt=nt(G[Z-1],e)[0],G[Z++]=rt;else G[Z++]=[K||e[0],$||e[1]];var i=G[Z-1];K&&$&&(i[0]!==K||i[1]!==$)?(et&&(Q!==K&&tt!==$?pt(Q&&tt?(a=et,s=(o=e)[0]-a[0],l=(o[1]-a[1])/s,(a[1]*o[0]-o[1]*a[0])/s>0?[l>0?at:ot,lt]:[l>0?ot:at,st]):[Q||K,tt||$]):Q&&tt&&pt([Q,tt])),pt([K,$])):Q-K&&tt-$&&pt([K||Q,$||tt]),et=e,Q=K,tt=$}else et&&dt(nt(et,e)[0]),G[Z++]=e;var a,o,s,l}for(r=0;rX(v,yt))break;o=v,(w=m[0]*y[0]+m[1]*y[1])>b?(b=w,p=v,g=!1):w<_&&(_=w,d=v,g=!0)}if(g?(gt(p),o!==d&>(d)):(d!==i&>(d),o!==p&>(p)),gt(o),r>=t.length||!v)break;gt(v),i=v}}else gt(p)}et&&pt([Q||et[0],tt||et[1]]),V.push(G.slice(0,Z))}var mt=N.slice(N.length-1);if(z&&"h"!==mt&&"v"!==mt){for(var xt=!1,bt=-1,_t=[],wt=0;wt=0?l=p:(l=p=h,h++),l0?Math.max(r,a):0}}},4898:function(t){"use strict";t.exports={container:"marker",min:"cmin",max:"cmax"}},49508:function(t,e,r){"use strict";var n=r(7901),i=r(52075).hasColorscale,a=r(1586),o=r(34098);t.exports=function(t,e,r,s,l,u){var c=o.isBubble(t),f=(t.line||{}).color;u=u||{},f&&(r=f),l("marker.symbol"),l("marker.opacity",c?.7:1),l("marker.size"),u.noAngle||(l("marker.angle"),u.noAngleRef||l("marker.angleref"),u.noStandOff||l("marker.standoff")),l("marker.color",r),i(t,"marker")&&a(t,e,s,l,{prefix:"marker.",cLetter:"c"}),u.noSelect||(l("selected.marker.color"),l("unselected.marker.color"),l("selected.marker.size"),l("unselected.marker.size")),u.noLine||(l("marker.line.color",f&&!Array.isArray(f)&&e.marker.color!==f?f:c?n.background:n.defaultLine),i(t,"marker.line")&&a(t,e,s,l,{prefix:"marker.line.",cLetter:"c"}),l("marker.line.width",c?1:0)),c&&(l("marker.sizeref"),l("marker.sizemin"),l("marker.sizemode")),u.gradient&&"none"!==l("marker.gradient.type")&&l("marker.gradient.color")}},73927:function(t,e,r){"use strict";var n=r(71828).dateTick0,i=r(50606).ONEWEEK;function a(t,e){return n(e,t%i==0?1:0)}t.exports=function(t,e,r,n,i){if(i||(i={x:!0,y:!0}),i.x){var o=n("xperiod");o&&(n("xperiod0",a(o,e.xcalendar)),n("xperiodalignment"))}if(i.y){var s=n("yperiod");s&&(n("yperiod0",a(s,e.ycalendar)),n("yperiodalignment"))}}},32663:function(t,e,r){"use strict";var n=r(39898),i=r(73972),a=r(71828),o=a.ensureSingle,s=a.identity,l=r(91424),u=r(34098),c=r(34621),f=r(68687),h=r(61082).tester;function p(t,e,r,f,p,d,v){var g,y=t._context.staticPlot;!function(t,e,r,i,o){var s=r.xaxis,l=r.yaxis,c=n.extent(a.simpleMap(s.range,s.r2c)),f=n.extent(a.simpleMap(l.range,l.r2c)),h=i[0].trace;if(u.hasMarkers(h)){var p=h.marker.maxdisplayed;if(0!==p){var d=i.filter((function(t){return t.x>=c[0]&&t.x<=c[1]&&t.y>=f[0]&&t.y<=f[1]})),v=Math.ceil(d.length/p),g=0;o.forEach((function(t,r){var n=t[0].trace;u.hasMarkers(n)&&n.marker.maxdisplayed>0&&r0;function x(t){return m?t.transition():t}var b=r.xaxis,_=r.yaxis,w=f[0].trace,T=w.line,k=n.select(d),A=o(k,"g","errorbars"),M=o(k,"g","lines"),S=o(k,"g","points"),E=o(k,"g","text");if(i.getComponentMethod("errorbars","plot")(t,A,r,v),!0===w.visible){var L,C;x(k).style("opacity",w.opacity);var P=w.fill.charAt(w.fill.length-1);"x"!==P&&"y"!==P&&(P=""),f[0][r.isRangePlot?"nodeRangePlot3":"node3"]=k;var O,I,D="",z=[],R=w._prevtrace;R&&(D=R._prevRevpath||"",C=R._nextFill,z=R._polygons);var F,B,N,j,U,V,H,q="",G="",Z=[],Y=a.noop;if(L=w._ownFill,u.hasLines(w)||"none"!==w.fill){for(C&&C.datum(f),-1!==["hv","vh","hvh","vhv"].indexOf(T.shape)?(F=l.steps(T.shape),B=l.steps(T.shape.split("").reverse().join(""))):F=B="spline"===T.shape?function(t){var e=t[t.length-1];return t.length>1&&t[0][0]===e[0]&&t[0][1]===e[1]?l.smoothclosed(t.slice(1),T.smoothing):l.smoothopen(t,T.smoothing)}:function(t){return"M"+t.join("L")},N=function(t){return B(t.reverse())},Z=c(f,{xaxis:b,yaxis:_,trace:w,connectGaps:w.connectgaps,baseTolerance:Math.max(T.width||1,3)/4,shape:T.shape,backoff:T.backoff,simplify:T.simplify,fill:w.fill}),H=w._polygons=new Array(Z.length),g=0;g0,g=f(t,e,r);(c=i.selectAll("g.trace").data(g,(function(t){return t[0].trace.uid}))).enter().append("g").attr("class",(function(t){return"trace scatter trace"+t[0].trace.uid})).style("stroke-miterlimit",2),c.order(),function(t,e,r){e.each((function(e){var i=o(n.select(this),"g","fills");l.setClipUrl(i,r.layerClipId,t);var a=e[0].trace,u=[];a._ownfill&&u.push("_ownFill"),a._nexttrace&&u.push("_nextFill");var c=i.selectAll("g").data(u,s);c.enter().append("g"),c.exit().each((function(t){a[t]=null})).remove(),c.order().each((function(t){a[t]=o(n.select(this),"path","js-fill")}))}))}(t,c,e),v?(u&&(h=u()),n.transition().duration(a.duration).ease(a.easing).each("end",(function(){h&&h()})).each("interrupt",(function(){h&&h()})).each((function(){i.selectAll("g.trace").each((function(r,n){p(t,n,e,r,g,this,a)}))}))):c.each((function(r,n){p(t,n,e,r,g,this,a)})),d&&c.exit().remove(),i.selectAll("path:not([d])").remove()}},98002:function(t,e,r){"use strict";var n=r(34098);t.exports=function(t,e){var r,i,a,o,s=t.cd,l=t.xaxis,u=t.yaxis,c=[],f=s[0].trace;if(!n.hasMarkers(f)&&!n.hasText(f))return[];if(!1===e)for(r=0;r0){var h=i.c2l(c);i._lowerLogErrorBound||(i._lowerLogErrorBound=h),i._lowerErrorBound=Math.min(i._lowerLogErrorBound,h)}}else o[s]=[-l[0]*r,l[1]*r]}return o}t.exports=function(t,e,r){var n=[i(t.x,t.error_x,e[0],r.xaxis),i(t.y,t.error_y,e[1],r.yaxis),i(t.z,t.error_z,e[2],r.zaxis)],a=function(t){for(var e=0;e-1?-1:t.indexOf("right")>-1?1:0}function b(t){return null==t?0:t.indexOf("top")>-1?-1:t.indexOf("bottom")>-1?1:0}function _(t,e){return e(4*t)}function w(t){return p[t]}function T(t,e,r,n,i){var a=null;if(l.isArrayOrTypedArray(t)){a=[];for(var o=0;o=0){var E=function(t,e,r){var n,i=(r+1)%3,a=(r+2)%3,o=[],l=[];for(n=0;n=0&&f("surfacecolor",p||d);for(var v=["x","y","z"],g=0;g<3;++g){var y="projection."+v[g];f(y+".show")&&(f(y+".opacity"),f(y+".scale"))}var m=n.getComponentMethod("errorbars","supplyDefaults");m(t,e,p||d||r,{axis:"z"}),m(t,e,p||d||r,{axis:"y",inherit:"z"}),m(t,e,p||d||r,{axis:"x",inherit:"z"})}else e.visible=!1}},13551:function(t,e,r){"use strict";t.exports={plot:r(58925),attributes:r(44542),markerSymbols:r(87381),supplyDefaults:r(21428),colorbar:[{container:"marker",min:"cmin",max:"cmax"},{container:"line",min:"cmin",max:"cmax"}],calc:r(36563),moduleType:"trace",name:"scatter3d",basePlotModule:r(58547),categories:["gl3d","symbols","showLegend","scatter-like"],meta:{}}},97001:function(t,e,r){"use strict";var n=r(82196),i=r(9012),a=r(5386).fF,o=r(5386).si,s=r(50693),l=r(1426).extendFlat,u=n.marker,c=n.line,f=u.line;t.exports={carpet:{valType:"string",editType:"calc"},a:{valType:"data_array",editType:"calc"},b:{valType:"data_array",editType:"calc"},mode:l({},n.mode,{dflt:"markers"}),text:l({},n.text,{}),texttemplate:o({editType:"plot"},{keys:["a","b","text"]}),hovertext:l({},n.hovertext,{}),line:{color:c.color,width:c.width,dash:c.dash,backoff:c.backoff,shape:l({},c.shape,{values:["linear","spline"]}),smoothing:c.smoothing,editType:"calc"},connectgaps:n.connectgaps,fill:l({},n.fill,{values:["none","toself","tonext"],dflt:"none"}),fillcolor:n.fillcolor,marker:l({symbol:u.symbol,opacity:u.opacity,maxdisplayed:u.maxdisplayed,angle:u.angle,angleref:u.angleref,standoff:u.standoff,size:u.size,sizeref:u.sizeref,sizemin:u.sizemin,sizemode:u.sizemode,line:l({width:f.width,editType:"calc"},s("marker.line")),gradient:u.gradient,editType:"calc"},s("marker")),textfont:n.textfont,textposition:n.textposition,selected:n.selected,unselected:n.unselected,hoverinfo:l({},i.hoverinfo,{flags:["a","b","text","name"]}),hoveron:n.hoveron,hovertemplate:a()}},34618:function(t,e,r){"use strict";var n=r(92770),i=r(36922),a=r(75225),o=r(66279),s=r(47761).calcMarkerSize,l=r(22882);t.exports=function(t,e){var r=e._carpetTrace=l(t,e);if(r&&r.visible&&"legendonly"!==r.visible){var u;e.xaxis=r.xaxis,e.yaxis=r.yaxis;var c,f,h=e._length,p=new Array(h),d=!1;for(u=0;u")}return o}function m(t,e){var r;r=t.labelprefix&&t.labelprefix.length>0?t.labelprefix.replace(/ = $/,""):t._hovertitle,g.push(r+": "+e.toFixed(3)+t.labelsuffix)}}},46858:function(t,e,r){"use strict";t.exports={attributes:r(97001),supplyDefaults:r(98965),colorbar:r(4898),formatLabels:r(48953),calc:r(34618),plot:r(1913),style:r(16296).style,styleOnSelect:r(16296).styleOnSelect,hoverPoints:r(22931),selectPoints:r(98002),eventData:r(16165),moduleType:"trace",name:"scattercarpet",basePlotModule:r(93612),categories:["svg","carpet","symbols","showLegend","carpetDependent","zoomScale"],meta:{}}},1913:function(t,e,r){"use strict";var n=r(32663),i=r(89298),a=r(91424);t.exports=function(t,e,r,o){var s,l,u,c=r[0][0].carpet,f=i.getFromId(t,c.xaxis||"x"),h=i.getFromId(t,c.yaxis||"y"),p={xaxis:f,yaxis:h,plot:e.plot};for(s=0;s")}function p(t){return t+"°"}}(u,v,t,l[0].t.labels),t.hovertemplate=u.hovertemplate,[t]}}},17988:function(t,e,r){"use strict";t.exports={attributes:r(19316),supplyDefaults:r(10659),colorbar:r(4898),formatLabels:r(82719),calc:r(84622),calcGeoJSON:r(89171).calcGeoJSON,plot:r(89171).plot,style:r(33095),styleOnSelect:r(16296).styleOnSelect,hoverPoints:r(14977),eventData:r(84084),selectPoints:r(20548),moduleType:"trace",name:"scattergeo",basePlotModule:r(44622),categories:["geo","symbols","showLegend","scatter-like"],meta:{}}},89171:function(t,e,r){"use strict";var n=r(39898),i=r(71828),a=r(90973).getTopojsonFeatures,o=r(18214),s=r(41327),l=r(71739).findExtremes,u=r(50606).BADNUM,c=r(47761).calcMarkerSize,f=r(34098),h=r(33095);t.exports={calcGeoJSON:function(t,e){var r,n,i=t[0].trace,o=e[i.geo],f=o._subplot,h=i._length;if(Array.isArray(i.locations)){var p=i.locationmode,d="geojson-id"===p?s.extractTraceFeature(t):a(i,f.topojson);for(r=0;r=g,w=2*b,T={},k=l.makeCalcdata(e,"x"),A=m.makeCalcdata(e,"y"),M=s(e,l,"x",k),S=s(e,m,"y",A),E=M.vals,L=S.vals;e._x=E,e._y=L,e.xperiodalignment&&(e._origX=k,e._xStarts=M.starts,e._xEnds=M.ends),e.yperiodalignment&&(e._origY=A,e._yStarts=S.starts,e._yEnds=S.ends);var C=new Array(w),P=new Array(b);for(r=0;r1&&i.extendFlat(s.line,p.linePositions(t,r,n)),s.errorX||s.errorY){var l=p.errorBarPositions(t,r,n,a,o);s.errorX&&i.extendFlat(s.errorX,l.x),s.errorY&&i.extendFlat(s.errorY,l.y)}return s.text&&(i.extendFlat(s.text,{positions:n},p.textPosition(t,r,s.text,s.marker)),i.extendFlat(s.textSel,{positions:n},p.textPosition(t,r,s.text,s.markerSel)),i.extendFlat(s.textUnsel,{positions:n},p.textPosition(t,r,s.text,s.markerUnsel))),s}(t,0,e,C,E,L),D=d(t,x);return f(o,e),_?I.marker&&(O=I.marker.sizeAvg||Math.max(I.marker.size,3)):O=u(e,b),c(t,e,l,m,E,L,O),I.errorX&&y(e,l,I.errorX),I.errorY&&y(e,m,I.errorY),I.fill&&!D.fill2d&&(D.fill2d=!0),I.marker&&!D.scatter2d&&(D.scatter2d=!0),I.line&&!D.line2d&&(D.line2d=!0),!I.errorX&&!I.errorY||D.error2d||(D.error2d=!0),I.text&&!D.glText&&(D.glText=!0),I.marker&&(I.marker.snap=b),D.lineOptions.push(I.line),D.errorXOptions.push(I.errorX),D.errorYOptions.push(I.errorY),D.fillOptions.push(I.fill),D.markerOptions.push(I.marker),D.markerSelectedOptions.push(I.markerSel),D.markerUnselectedOptions.push(I.markerUnsel),D.textOptions.push(I.text),D.textSelectedOptions.push(I.textSel),D.textUnselectedOptions.push(I.textUnsel),D.selectBatch.push([]),D.unselectBatch.push([]),T._scene=D,T.index=D.count,T.x=E,T.y=L,T.positions=C,D.count++,[{x:!1,y:!1,t:T,trace:e}]}},78232:function(t){"use strict";t.exports={TOO_MANY_POINTS:1e5,SYMBOL_SDF_SIZE:200,SYMBOL_SIZE:20,SYMBOL_STROKE:1,DOT_RE:/-dot/,OPEN_RE:/-open/,DASHES:{solid:[1],dot:[1,1],dash:[4,1],longdash:[8,1],dashdot:[4,1,1,1],longdashdot:[8,1,1,1]}}},19635:function(t,e,r){"use strict";var n=r(92770),i=r(82019),a=r(25075),o=r(73972),s=r(71828),l=r(91424),u=r(41675),c=r(81697).formatColor,f=r(34098),h=r(39984),p=r(68645),d=r(78232),v=r(37822).DESELECTDIM,g={start:1,left:1,end:-1,right:-1,middle:0,center:0,bottom:1,top:-1},y=r(23469).appendArrayPointValue;function m(t,e){var r,i=t._fullLayout,a=e._length,o=e.textfont,l=e.textposition,u=Array.isArray(l)?l:[l],c=o.color,f=o.size,h=o.family,p={},d=t._context.plotGlPixelRatio,v=e.texttemplate;if(v){p.text=[];var g=i._d3locale,m=Array.isArray(v),x=m?Math.min(v.length,a):a,b=m?function(t){return v[t]}:function(){return v};for(r=0;rd.TOO_MANY_POINTS||f.hasMarkers(e)?"rect":"round";if(u&&e.connectgaps){var h=n[0],p=n[1];for(i=0;i1?l[i]:l[0]:l,d=Array.isArray(u)?u.length>1?u[i]:u[0]:u,v=g[p],y=g[d],m=c?c/.8+1:0,x=-y*m-.5*y;o.offset[i]=[v*m/h,x/h]}}return o}}},47148:function(t,e,r){"use strict";var n=r(71828),i=r(73972),a=r(68645),o=r(42341),s=r(47581),l=r(34098),u=r(67513),c=r(73927),f=r(49508),h=r(11058),p=r(28908),d=r(82410);t.exports=function(t,e,r,v){function g(r,i){return n.coerce(t,e,o,r,i)}var y=!!t.marker&&a.isOpenSymbol(t.marker.symbol),m=l.isBubble(t),x=u(t,e,v,g);if(x){c(t,e,v,g),g("xhoverformat"),g("yhoverformat");var b=x100},e.isDotSymbol=function(t){return"string"==typeof t?n.DOT_RE.test(t):t>200}},20794:function(t,e,r){"use strict";var n=r(73972),i=r(71828),a=r(34603);function o(t,e,r,o){var s=t.xa,l=t.ya,u=t.distance,c=t.dxy,f=t.index,h={pointNumber:f,x:e[f],y:r[f]};h.tx=Array.isArray(o.text)?o.text[f]:o.text,h.htx=Array.isArray(o.hovertext)?o.hovertext[f]:o.hovertext,h.data=Array.isArray(o.customdata)?o.customdata[f]:o.customdata,h.tp=Array.isArray(o.textposition)?o.textposition[f]:o.textposition;var p=o.textfont;p&&(h.ts=i.isArrayOrTypedArray(p.size)?p.size[f]:p.size,h.tc=Array.isArray(p.color)?p.color[f]:p.color,h.tf=Array.isArray(p.family)?p.family[f]:p.family);var d=o.marker;d&&(h.ms=i.isArrayOrTypedArray(d.size)?d.size[f]:d.size,h.mo=i.isArrayOrTypedArray(d.opacity)?d.opacity[f]:d.opacity,h.mx=i.isArrayOrTypedArray(d.symbol)?d.symbol[f]:d.symbol,h.ma=i.isArrayOrTypedArray(d.angle)?d.angle[f]:d.angle,h.mc=i.isArrayOrTypedArray(d.color)?d.color[f]:d.color);var v=d&&d.line;v&&(h.mlc=Array.isArray(v.color)?v.color[f]:v.color,h.mlw=i.isArrayOrTypedArray(v.width)?v.width[f]:v.width);var g=d&&d.gradient;g&&"none"!==g.type&&(h.mgt=Array.isArray(g.type)?g.type[f]:g.type,h.mgc=Array.isArray(g.color)?g.color[f]:g.color);var y=s.c2p(h.x,!0),m=l.c2p(h.y,!0),x=h.mrc||1,b=o.hoverlabel;b&&(h.hbg=Array.isArray(b.bgcolor)?b.bgcolor[f]:b.bgcolor,h.hbc=Array.isArray(b.bordercolor)?b.bordercolor[f]:b.bordercolor,h.hts=i.isArrayOrTypedArray(b.font.size)?b.font.size[f]:b.font.size,h.htc=Array.isArray(b.font.color)?b.font.color[f]:b.font.color,h.htf=Array.isArray(b.font.family)?b.font.family[f]:b.font.family,h.hnl=i.isArrayOrTypedArray(b.namelength)?b.namelength[f]:b.namelength);var _=o.hoverinfo;_&&(h.hi=Array.isArray(_)?_[f]:_);var w=o.hovertemplate;w&&(h.ht=Array.isArray(w)?w[f]:w);var T={};T[t.index]=h;var k=o._origX,A=o._origY,M=i.extendFlat({},t,{color:a(o,h),x0:y-x,x1:y+x,xLabelVal:k?k[f]:h.x,y0:m-x,y1:m+x,yLabelVal:A?A[f]:h.y,cd:T,distance:u,spikeDistance:c,hovertemplate:h.ht});return h.htx?M.text=h.htx:h.tx?M.text=h.tx:o.text&&(M.text=o.text),i.fillText(h,o,M),n.getComponentMethod("errorbars","hoverInfo")(h,o,M),M}t.exports={hoverPoints:function(t,e,r,n){var i,a,s,l,u,c,f,h,p,d,v=t.cd,g=v[0].t,y=v[0].trace,m=t.xa,x=t.ya,b=g.x,_=g.y,w=m.c2p(e),T=x.c2p(r),k=t.distance;if(g.tree){var A=m.p2c(w-k),M=m.p2c(w+k),S=x.p2c(T-k),E=x.p2c(T+k);i="x"===n?g.tree.range(Math.min(A,M),Math.min(x._rl[0],x._rl[1]),Math.max(A,M),Math.max(x._rl[0],x._rl[1])):g.tree.range(Math.min(A,M),Math.min(S,E),Math.max(A,M),Math.max(S,E))}else i=g.ids;var L=k;if("x"===n){var C=!!y.xperiodalignment,P=!!y.yperiodalignment;for(c=0;c=Math.min(O,I)&&w<=Math.max(O,I)?0:1/0}if(f=Math.min(D,z)&&T<=Math.max(D,z)?0:1/0}d=Math.sqrt(f*f+h*h),s=i[c]}}}else for(c=i.length-1;c>-1;c--)l=b[a=i[c]],u=_[a],f=m.c2p(l)-w,h=x.c2p(u)-T,(p=Math.sqrt(f*f+h*h))m.glText.length){var T=_-m.glText.length;for(v=0;vr&&(isNaN(e[n])||isNaN(e[n+1]));)n-=2;t.positions=e.slice(r,n+2)}return t})),m.line2d.update(m.lineOptions)),m.error2d){var A=(m.errorXOptions||[]).concat(m.errorYOptions||[]);m.error2d.update(A)}m.scatter2d&&m.scatter2d.update(m.markerOptions),m.fillOrder=s.repeat(null,_),m.fill2d&&(m.fillOptions=m.fillOptions.map((function(t,e){var n=r[e];if(t&&n&&n[0]&&n[0].trace){var i,a,o=n[0],s=o.trace,l=o.t,u=m.lineOptions[e],c=[];s._ownfill&&c.push(e),s._nexttrace&&c.push(e+1),c.length&&(m.fillOrder[e]=c);var f,h,p=[],d=u&&u.positions||l.positions;if("tozeroy"===s.fill){for(f=0;ff&&isNaN(d[h+1]);)h-=2;0!==d[f+1]&&(p=[d[f],0]),p=p.concat(d.slice(f,h+2)),0!==d[h+1]&&(p=p.concat([d[h],0]))}else if("tozerox"===s.fill){for(f=0;ff&&isNaN(d[h]);)h-=2;0!==d[f]&&(p=[0,d[f+1]]),p=p.concat(d.slice(f,h+2)),0!==d[h]&&(p=p.concat([0,d[h+1]]))}else if("toself"===s.fill||"tonext"===s.fill){for(p=[],i=0,t.splitNull=!0,a=0;a-1;for(v=0;v<_;v++){var L=r[v][0],C=L.trace,P=L.t,O=P.index,I=C._length,D=P.x,z=P.y;if(C.selectedpoints||S||E){if(S||(S=!0),C.selectedpoints){var R=m.selectBatch[O]=s.selIndices2selPoints(C),F={};for(g=0;g")}function c(t){return t+"°"}}t.exports={hoverPoints:function(t,e,r){var o=t.cd,c=o[0].trace,f=t.xa,h=t.ya,p=t.subplot,d=[],v=l+c.uid+"-circle",g=c.cluster&&c.cluster.enabled;if(g){var y=p.map.queryRenderedFeatures(null,{layers:[v]});d=y.map((function(t){return t.id}))}var m=360*(e>=0?Math.floor((e+180)/360):Math.ceil((e-180)/360)),x=e-m;if(n.getClosest(o,(function(t){var e=t.lonlat;if(e[0]===s)return 1/0;if(g&&-1===d.indexOf(t.i+1))return 1/0;var n=i.modHalf(e[0],360),a=e[1],o=p.project([n,a]),l=o.x-f.c2p([x,a]),u=o.y-h.c2p([n,r]),c=Math.max(3,t.mrc||0);return Math.max(Math.sqrt(l*l+u*u)-c,1-3/c)}),t),!1!==t.index){var b=o[t.index],_=b.lonlat,w=[i.modHalf(_[0],360)+m,_[1]],T=f.c2p(w),k=h.c2p(w),A=b.mrc||1;t.x0=T-A,t.x1=T+A,t.y0=k-A,t.y1=k+A;var M={};M[c.subplot]={_subplot:p};var S=c._module.formatLabels(b,c,M);return t.lonLabel=S.lonLabel,t.latLabel=S.latLabel,t.color=a(c,b),t.extraText=u(c,b,o[0].t.labels),t.hovertemplate=c.hovertemplate,[t]}},getExtraText:u}},20467:function(t,e,r){"use strict";t.exports={attributes:r(99181),supplyDefaults:r(76645),colorbar:r(4898),formatLabels:r(15636),calc:r(84622),plot:r(86951),hoverPoints:r(28178).hoverPoints,eventData:r(53353),selectPoints:r(86387),styleOnSelect:function(t,e){e&&e[0].trace._glTrace.update(e)},moduleType:"trace",name:"scattermapbox",basePlotModule:r(50101),categories:["mapbox","gl","symbols","showLegend","scatter-like"],meta:{}}},86951:function(t,e,r){"use strict";var n=r(71828),i=r(15790),a=r(77734).traceLayerPrefix,o={cluster:["cluster","clusterCount","circle"],nonCluster:["fill","line","circle","symbol"]};function s(t,e,r,n){this.type="scattermapbox",this.subplot=t,this.uid=e,this.clusterEnabled=r,this.isHidden=n,this.sourceIds={fill:"source-"+e+"-fill",line:"source-"+e+"-line",circle:"source-"+e+"-circle",symbol:"source-"+e+"-symbol",cluster:"source-"+e+"-circle",clusterCount:"source-"+e+"-circle"},this.layerIds={fill:a+e+"-fill",line:a+e+"-line",circle:a+e+"-circle",symbol:a+e+"-symbol",cluster:a+e+"-cluster",clusterCount:a+e+"-cluster-count"},this.below=null}var l=s.prototype;l.addSource=function(t,e,r){var i={type:"geojson",data:e.geojson};r&&r.enabled&&n.extendFlat(i,{cluster:!0,clusterMaxZoom:r.maxzoom});var a=this.subplot.map.getSource(this.sourceIds[t]);a?a.setData(e.geojson):this.subplot.map.addSource(this.sourceIds[t],i)},l.setSourceData=function(t,e){this.subplot.map.getSource(this.sourceIds[t]).setData(e.geojson)},l.addLayer=function(t,e,r){var n={type:e.type,id:this.layerIds[t],source:this.sourceIds[t],layout:e.layout,paint:e.paint};e.filter&&(n.filter=e.filter);for(var i,a=this.layerIds[t],o=this.subplot.getMapLayers(),s=0;s=0;r--){var i=e[r];n.removeLayer(c.layerIds[i])}t||n.removeSource(c.sourceIds.circle)}(t):function(t){for(var e=o.nonCluster,r=e.length-1;r>=0;r--){var i=e[r];n.removeLayer(c.layerIds[i]),t||n.removeSource(c.sourceIds[i])}}(t)}function h(t){l?function(t){t||c.addSource("circle",a.circle,e.cluster);for(var r=o.cluster,n=0;n=0;r--){var n=e[r];t.removeLayer(this.layerIds[n]),t.removeSource(this.sourceIds[n])}},t.exports=function(t,e){var r,n,a,l=e[0].trace,u=l.cluster&&l.cluster.enabled,c=!0!==l.visible,f=new s(t,l.uid,u,c),h=i(t.gd,e),p=f.below=t.belowLookup["trace-"+l.uid];if(u)for(f.addSource("circle",h.circle,l.cluster),r=0;r")}}t.exports={hoverPoints:function(t,e,r,a){var o=n(t,e,r,a);if(o&&!1!==o[0].index){var s=o[0];if(void 0===s.index)return o;var l=t.subplot,u=s.cd[s.index],c=s.trace;if(l.isPtInside(u))return s.xLabelVal=void 0,s.yLabelVal=void 0,i(u,c,l,s),s.hovertemplate=c.hovertemplate,o}},makeHoverPointText:i}},91271:function(t,e,r){"use strict";t.exports={moduleType:"trace",name:"scatterpolar",basePlotModule:r(23580),categories:["polar","symbols","showLegend","scatter-like"],attributes:r(81245),supplyDefaults:r(22184).supplyDefaults,colorbar:r(4898),formatLabels:r(98608),calc:r(26442),plot:r(45162),style:r(16296).style,styleOnSelect:r(16296).styleOnSelect,hoverPoints:r(59150).hoverPoints,selectPoints:r(98002),meta:{}}},45162:function(t,e,r){"use strict";var n=r(32663),i=r(50606).BADNUM;t.exports=function(t,e,r){for(var a=e.layers.frontplot.select("g.scatterlayer"),o=e.xaxis,s=e.yaxis,l={xaxis:o,yaxis:s,plot:e.framework,layerClipId:e._hasClipOnAxisFalse?e.clipIds.forTraces:null},u=e.radialAxis,c=e.angularAxis,f=0;f=u&&(m.marker.cluster=d.tree),m.marker&&(m.markerSel.positions=m.markerUnsel.positions=m.marker.positions=_),m.line&&_.length>1&&l.extendFlat(m.line,s.linePositions(t,p,_)),m.text&&(l.extendFlat(m.text,{positions:_},s.textPosition(t,p,m.text,m.marker)),l.extendFlat(m.textSel,{positions:_},s.textPosition(t,p,m.text,m.markerSel)),l.extendFlat(m.textUnsel,{positions:_},s.textPosition(t,p,m.text,m.markerUnsel))),m.fill&&!h.fill2d&&(h.fill2d=!0),m.marker&&!h.scatter2d&&(h.scatter2d=!0),m.line&&!h.line2d&&(h.line2d=!0),m.text&&!h.glText&&(h.glText=!0),h.lineOptions.push(m.line),h.fillOptions.push(m.fill),h.markerOptions.push(m.marker),h.markerSelectedOptions.push(m.markerSel),h.markerUnselectedOptions.push(m.markerUnsel),h.textOptions.push(m.text),h.textSelectedOptions.push(m.textSel),h.textUnselectedOptions.push(m.textUnsel),h.selectBatch.push([]),h.unselectBatch.push([]),d.x=w,d.y=T,d.rawx=w,d.rawy=T,d.r=g,d.theta=y,d.positions=_,d._scene=h,d.index=h.count,h.count++}})),a(t,e,r)}},t.exports.reglPrecompiled={}},48300:function(t,e,r){"use strict";var n=r(5386).fF,i=r(5386).si,a=r(1426).extendFlat,o=r(82196),s=r(9012),l=o.line;t.exports={mode:o.mode,real:{valType:"data_array",editType:"calc+clearAxisTypes"},imag:{valType:"data_array",editType:"calc+clearAxisTypes"},text:o.text,texttemplate:i({editType:"plot"},{keys:["real","imag","text"]}),hovertext:o.hovertext,line:{color:l.color,width:l.width,dash:l.dash,backoff:l.backoff,shape:a({},l.shape,{values:["linear","spline"]}),smoothing:l.smoothing,editType:"calc"},connectgaps:o.connectgaps,marker:o.marker,cliponaxis:a({},o.cliponaxis,{dflt:!1}),textposition:o.textposition,textfont:o.textfont,fill:a({},o.fill,{values:["none","toself","tonext"],dflt:"none"}),fillcolor:o.fillcolor,hoverinfo:a({},s.hoverinfo,{flags:["real","imag","text","name"]}),hoveron:o.hoveron,hovertemplate:n(),selected:o.selected,unselected:o.unselected}},30621:function(t,e,r){"use strict";var n=r(92770),i=r(50606).BADNUM,a=r(36922),o=r(75225),s=r(66279),l=r(47761).calcMarkerSize;t.exports=function(t,e){for(var r=t._fullLayout,u=e.subplot,c=r[u].realaxis,f=r[u].imaginaryaxis,h=c.makeCalcdata(e,"real"),p=f.makeCalcdata(e,"imag"),d=e._length,v=new Array(d),g=0;g")}}t.exports={hoverPoints:function(t,e,r,a){var o=n(t,e,r,a);if(o&&!1!==o[0].index){var s=o[0];if(void 0===s.index)return o;var l=t.subplot,u=s.cd[s.index],c=s.trace;if(l.isPtInside(u))return s.xLabelVal=void 0,s.yLabelVal=void 0,i(u,c,l,s),s.hovertemplate=c.hovertemplate,o}},makeHoverPointText:i}},85956:function(t,e,r){"use strict";t.exports={moduleType:"trace",name:"scattersmith",basePlotModule:r(7504),categories:["smith","symbols","showLegend","scatter-like"],attributes:r(48300),supplyDefaults:r(65269),colorbar:r(4898),formatLabels:r(62047),calc:r(30621),plot:r(12480),style:r(16296).style,styleOnSelect:r(16296).styleOnSelect,hoverPoints:r(11350).hoverPoints,selectPoints:r(98002),meta:{}}},12480:function(t,e,r){"use strict";var n=r(32663),i=r(50606).BADNUM,a=r(23893).smith;t.exports=function(t,e,r){for(var o=e.layers.frontplot.select("g.scatterlayer"),s=e.xaxis,l=e.yaxis,u={xaxis:s,yaxis:l,plot:e.framework,layerClipId:e._hasClipOnAxisFalse?e.clipIds.forTraces:null},c=0;c"),o.hovertemplate=h.hovertemplate,a}function x(t,e){y.push(t._hovertitle+": "+e)}}},52979:function(t,e,r){"use strict";t.exports={attributes:r(50413),supplyDefaults:r(46008),colorbar:r(4898),formatLabels:r(93645),calc:r(54337),plot:r(7507),style:r(16296).style,styleOnSelect:r(16296).styleOnSelect,hoverPoints:r(47250),selectPoints:r(98002),eventData:r(4524),moduleType:"trace",name:"scatterternary",basePlotModule:r(61639),categories:["ternary","symbols","showLegend","scatter-like"],meta:{}}},7507:function(t,e,r){"use strict";var n=r(32663);t.exports=function(t,e,r){var i=e.plotContainer;i.select(".scatterlayer").selectAll("*").remove();for(var a=e.xaxis,o=e.yaxis,s={xaxis:a,yaxis:o,plot:i,layerClipId:e._hasClipOnAxisFalse?e.clipIdRelative:null},l=e.layers.frontplot.select("g.scatterlayer"),u=0;uh?b.sizeAvg||Math.max(b.size,3):a(e,x),p=0;pa&&l||i-1,P=!0;if(o(x)||p.selectedpoints||C){var O=p._length;if(p.selectedpoints){v.selectBatch=p.selectedpoints;var I=p.selectedpoints,D={};for(l=0;l1&&(c=v[m-1],h=g[m-1],d=y[m-1]),e=0;ec?"-":"+")+"x")).replace("y",(f>h?"-":"+")+"y")).replace("z",(p>d?"-":"+")+"z");var L=function(){m=0,M=[],S=[],E=[]};(!m||m2?t.slice(1,e-1):2===e?[(t[0]+t[1])/2]:t}function p(t){var e=t.length;return 1===e?[.5,.5]:[t[1]-t[0],t[e-1]-t[e-2]]}function d(t,e){var r=t.fullSceneLayout,i=t.dataScale,c=e._len,f={};function d(t,e){var n=r[e],o=i[u[e]];return a.simpleMap(t,(function(t){return n.d2l(t)*o}))}if(f.vectors=l(d(e._u,"xaxis"),d(e._v,"yaxis"),d(e._w,"zaxis"),c),!c)return{positions:[],cells:[]};var v=d(e._Xs,"xaxis"),g=d(e._Ys,"yaxis"),y=d(e._Zs,"zaxis");if(f.meshgrid=[v,g,y],f.gridFill=e._gridFill,e._slen)f.startingPositions=l(d(e._startsX,"xaxis"),d(e._startsY,"yaxis"),d(e._startsZ,"zaxis"));else{for(var m=g[0],x=h(v),b=h(y),_=new Array(x.length*b.length),w=0,T=0;T=0};m?(r=Math.min(y.length,b.length),l=function(t){return M(y[t])&&S(t)},f=function(t){return String(y[t])}):(r=Math.min(x.length,b.length),l=function(t){return M(x[t])&&S(t)},f=function(t){return String(x[t])}),w&&(r=Math.min(r,_.length));for(var E=0;E1){for(var O=a.randstr(),I=0;I=0){e.i=s.i;var c=r.marker;c.pattern&&c.colors&&c.pattern.shape||(c.color=u,e.color=u),n.pointStyle(t,r,a,e)}else i.fill(t,u)}},83523:function(t,e,r){"use strict";var n=r(39898),i=r(73972),a=r(23469).appendArrayPointValue,o=r(30211),s=r(71828),l=r(11086),u=r(2791),c=r(53581).formatPieValue;function f(t,e,r){for(var n=t.data.data,i={curveNumber:e.index,pointNumber:n.i,data:e._input,fullData:e},o=0;o"),name:A||D("name")?m.name:void 0,color:k("hoverlabel.bgcolor")||x.color,borderColor:k("hoverlabel.bordercolor"),fontFamily:k("hoverlabel.font.family"),fontSize:k("hoverlabel.font.size"),fontColor:k("hoverlabel.font.color"),nameLength:k("hoverlabel.namelength"),textAlign:k("hoverlabel.align"),hovertemplate:A,hovertemplateLabels:P,eventData:l};g&&(F.x0=E-i.rInscribed*i.rpx1,F.x1=E+i.rInscribed*i.rpx1,F.idealAlign=i.pxmid[0]<0?"left":"right"),y&&(F.x=E,F.idealAlign=E<0?"left":"right");var B=[];o.loneHover(F,{container:a._hoverlayer.node(),outerContainer:a._paper.node(),gd:r,inOut_bbox:B}),l[0].bbox=B[0],d._hasHoverLabel=!0}if(y){var N=t.select("path.surface");h.styleOne(N,i,m,r,{hovered:!0})}d._hasHoverEvent=!0,r.emit("plotly_hover",{points:l||[f(i,m,h.eventDataKeys)],event:n.event})}})),t.on("mouseout",(function(e){var i=r._fullLayout,a=r._fullData[d.index],s=n.select(this).datum();if(d._hasHoverEvent&&(e.originalEvent=n.event,r.emit("plotly_unhover",{points:[f(s,a,h.eventDataKeys)],event:n.event}),d._hasHoverEvent=!1),d._hasHoverLabel&&(o.loneUnhover(i._hoverlayer.node()),d._hasHoverLabel=!1),y){var l=t.select("path.surface");h.styleOne(l,s,a,r,{hovered:!1})}})),t.on("click",(function(t){var e=r._fullLayout,a=r._fullData[d.index],s=g&&(u.isHierarchyRoot(t)||u.isLeaf(t)),c=u.getPtId(t),p=u.isEntry(t)?u.findEntryWithChild(v,c):u.findEntryWithLevel(v,c),y=u.getPtId(p),m={points:[f(t,a,h.eventDataKeys)],event:n.event};s||(m.nextLevel=y);var x=l.triggerHandler(r,"plotly_"+d.type+"click",m);if(!1!==x&&e.hovermode&&(r._hoverdata=[f(t,a,h.eventDataKeys)],o.click(r,n.event)),!s&&!1!==x&&!r._dragging&&!r._transitioning){i.call("_storeDirectGUIEdit",a,e._tracePreGUI[a.uid],{level:a.level});var b={data:[{level:y}],traces:[d.index]},_={frame:{redraw:!1,duration:h.transitionTime},transition:{duration:h.transitionTime,easing:h.transitionEasing},mode:"immediate",fromcurrent:!0};o.loneUnhover(e._hoverlayer.node()),i.call("animate",r,b,_)}}))}},2791:function(t,e,r){"use strict";var n=r(71828),i=r(7901),a=r(6964),o=r(53581);function s(t){return t.data.data.pid}e.findEntryWithLevel=function(t,r){var n;return r&&t.eachAfter((function(t){if(e.getPtId(t)===r)return n=t.copy()})),n||t},e.findEntryWithChild=function(t,r){var n;return t.eachAfter((function(t){for(var i=t.children||[],a=0;a0)},e.getMaxDepth=function(t){return t.maxdepth>=0?t.maxdepth:1/0},e.isHeader=function(t,r){return!(e.isLeaf(t)||t.depth===r._maxDepth-1)},e.getParent=function(t,r){return e.findEntryWithLevel(t,s(r))},e.listPath=function(t,r){var n=t.parent;if(!n)return[];var i=r?[n.data[r]]:[n];return e.listPath(n,r).concat(i)},e.getPath=function(t){return e.listPath(t,"label").join("/")+"/"},e.formatValue=o.formatPieValue,e.formatPercent=function(t,e){var r=n.formatPercent(t,0);return"0%"===r&&(r=o.formatPiePercent(t,e)),r}},87619:function(t,e,r){"use strict";t.exports={moduleType:"trace",name:"sunburst",basePlotModule:r(66888),categories:[],animatable:!0,attributes:r(57564),layoutAttributes:r(2654),supplyDefaults:r(17094),supplyLayoutDefaults:r(57034),calc:r(52147).calc,crossTraceCalc:r(52147).crossTraceCalc,plot:r(24714).plot,style:r(29969).style,colorbar:r(4898),meta:{}}},2654:function(t){"use strict";t.exports={sunburstcolorway:{valType:"colorlist",editType:"calc"},extendsunburstcolors:{valType:"boolean",dflt:!0,editType:"calc"}}},57034:function(t,e,r){"use strict";var n=r(71828),i=r(2654);t.exports=function(t,e){function r(r,a){return n.coerce(t,e,i,r,a)}r("sunburstcolorway",e.colorway),r("extendsunburstcolors")}},24714:function(t,e,r){"use strict";var n=r(39898),i=r(674),a=r(81684).sX,o=r(91424),s=r(71828),l=r(63893),u=r(72597),c=u.recordMinTextSize,f=u.clearMinTextSize,h=r(14575),p=r(53581).getRotationAngle,d=h.computeTransform,v=h.transformInsideText,g=r(29969).styleOne,y=r(16688).resizeText,m=r(83523),x=r(7055),b=r(2791);function _(t,r,u,f){var h=t._context.staticPlot,y=t._fullLayout,_=!y.uniformtext.mode&&b.hasTransition(f),T=n.select(u).selectAll("g.slice"),k=r[0],A=k.trace,M=k.hierarchy,S=b.findEntryWithLevel(M,A.level),E=b.getMaxDepth(A),L=y._size,C=A.domain,P=L.w*(C.x[1]-C.x[0]),O=L.h*(C.y[1]-C.y[0]),I=.5*Math.min(P,O),D=k.cx=L.l+L.w*(C.x[1]+C.x[0])/2,z=k.cy=L.t+L.h*(1-C.y[0])-O/2;if(!S)return T.remove();var R=null,F={};_&&T.each((function(t){F[b.getPtId(t)]={rpx0:t.rpx0,rpx1:t.rpx1,x0:t.x0,x1:t.x1,transform:t.transform},!R&&b.isEntry(t)&&(R=t)}));var B=function(t){return i.partition().size([2*Math.PI,t.height+1])(t)}(S).descendants(),N=S.height+1,j=0,U=E;k.hasMultipleRoots&&b.isHierarchyRoot(S)&&(B=B.slice(1),N-=1,j=1,U+=1),B=B.filter((function(t){return t.y1<=U}));var V=p(A.rotation);V&&B.forEach((function(t){t.x0+=V,t.x1+=V}));var H=Math.min(N,E),q=function(t){return(t-j)/H*I},G=function(t,e){return[t*Math.cos(e),-t*Math.sin(e)]},Z=function(t){return s.pathAnnulus(t.rpx0,t.rpx1,t.x0,t.x1,D,z)},Y=function(t){return D+w(t)[0]*(t.transform.rCenter||0)+(t.transform.x||0)},W=function(t){return z+w(t)[1]*(t.transform.rCenter||0)+(t.transform.y||0)};(T=T.data(B,b.getPtId)).enter().append("g").classed("slice",!0),_?T.exit().transition().each((function(){var t=n.select(this);t.select("path.surface").transition().attrTween("d",(function(t){var e=function(t){var e,r=b.getPtId(t),n=F[r],i=F[b.getPtId(S)];if(i){var o=(t.x1>i.x1?2*Math.PI:0)+V;e=t.rpx1X?2*Math.PI:0)+V;e={x0:i,x1:i}}else e={rpx0:I,rpx1:I},s.extendFlat(e,$(t));else e={rpx0:0,rpx1:0};else e={x0:V,x1:V};return a(e,n)}(t);return function(t){return Z(e(t))}})):f.attr("d",Z),u.call(m,S,t,r,{eventDataKeys:x.eventDataKeys,transitionTime:x.CLICK_TRANSITION_TIME,transitionEasing:x.CLICK_TRANSITION_EASING}).call(b.setSliceCursor,t,{hideOnRoot:!0,hideOnLeaves:!0,isTransitioning:t._transitioning}),f.call(g,i,A,t);var p=s.ensureSingle(u,"g","slicetext"),w=s.ensureSingle(p,"text","",(function(t){t.attr("data-notex",1)})),T=s.ensureUniformFontSize(t,b.determineTextFont(A,i,y.font));w.text(e.formatSliceLabel(i,S,A,r,y)).classed("slicetext",!0).attr("text-anchor","middle").call(o.font,T).call(l.convertToTspans,t);var M=o.bBox(w.node());i.transform=v(M,i,k),i.transform.targetX=Y(i),i.transform.targetY=W(i);var E=function(t,e){var r=t.transform;return d(r,e),r.fontSize=T.size,c(A.type,r,y),s.getTextTransform(r)};_?w.transition().attrTween("transform",(function(t){var e=function(t){var e,r=F[b.getPtId(t)],n=t.transform;if(r)e=r;else if(e={rpx1:t.rpx1,transform:{textPosAngle:n.textPosAngle,scale:0,rotate:n.rotate,rCenter:n.rCenter,x:n.x,y:n.y}},R)if(t.parent)if(X){var i=t.x1>X?2*Math.PI:0;e.x0=e.x1=i}else s.extendFlat(e,$(t));else e.x0=e.x1=V;else e.x0=e.x1=V;var o=a(e.transform.textPosAngle,t.transform.textPosAngle),l=a(e.rpx1,t.rpx1),u=a(e.x0,t.x0),f=a(e.x1,t.x1),h=a(e.transform.scale,n.scale),p=a(e.transform.rotate,n.rotate),d=0===n.rCenter?3:0===e.transform.rCenter?1/3:1,v=a(e.transform.rCenter,n.rCenter);return function(t){var e=l(t),r=u(t),i=f(t),a=function(t){return v(Math.pow(t,d))}(t),s={pxmid:G(e,(r+i)/2),rpx1:e,transform:{textPosAngle:o(t),rCenter:a,x:n.x,y:n.y}};return c(A.type,n,y),{transform:{targetX:Y(s),targetY:W(s),scale:h(t),rotate:p(t),rCenter:a}}}}(t);return function(t){return E(e(t),M)}})):w.attr("transform",E(i,M))}))}function w(t){return e=t.rpx1,r=t.transform.textPosAngle,[e*Math.sin(r),-e*Math.cos(r)];var e,r}e.plot=function(t,e,r,i){var a,o,s=t._fullLayout,l=s._sunburstlayer,u=!r,c=!s.uniformtext.mode&&b.hasTransition(r);f("sunburst",s),(a=l.selectAll("g.trace.sunburst").data(e,(function(t){return t[0].trace.uid}))).enter().append("g").classed("trace",!0).classed("sunburst",!0).attr("stroke-linejoin","round"),a.order(),c?(i&&(o=i()),n.transition().duration(r.duration).ease(r.easing).each("end",(function(){o&&o()})).each("interrupt",(function(){o&&o()})).each((function(){l.selectAll("g.trace").each((function(e){_(t,e,this,r)}))}))):(a.each((function(e){_(t,e,this,r)})),s.uniformtext.mode&&y(t,s._sunburstlayer.selectAll(".trace"),"sunburst")),u&&a.exit().remove()},e.formatSliceLabel=function(t,e,r,n,i){var a=r.texttemplate,o=r.textinfo;if(!(a||o&&"none"!==o))return"";var l=i.separators,u=n[0],c=t.data.data,f=u.hierarchy,h=b.isHierarchyRoot(t),p=b.getParent(f,t),d=b.getValue(t);if(!a){var v,g=o.split("+"),y=function(t){return-1!==g.indexOf(t)},m=[];if(y("label")&&c.label&&m.push(c.label),c.hasOwnProperty("v")&&y("value")&&m.push(b.formatValue(c.v,l)),!h){y("current path")&&m.push(b.getPath(t.data));var x=0;y("percent parent")&&x++,y("percent entry")&&x++,y("percent root")&&x++;var _=x>1;if(x){var w,T=function(t){v=b.formatPercent(w,l),_&&(v+=" of "+t),m.push(v)};y("percent parent")&&!h&&(w=d/b.getValue(p),T("parent")),y("percent entry")&&(w=d/b.getValue(e),T("entry")),y("percent root")&&(w=d/b.getValue(f),T("root"))}}return y("text")&&(v=s.castOption(r,c.i,"text"),s.isValidTextValue(v)&&m.push(v)),m.join("
")}var k=s.castOption(r,c.i,"texttemplate");if(!k)return"";var A={};c.label&&(A.label=c.label),c.hasOwnProperty("v")&&(A.value=c.v,A.valueLabel=b.formatValue(c.v,l)),A.currentPath=b.getPath(t.data),h||(A.percentParent=d/b.getValue(p),A.percentParentLabel=b.formatPercent(A.percentParent,l),A.parent=b.getPtLabel(p)),A.percentEntry=d/b.getValue(e),A.percentEntryLabel=b.formatPercent(A.percentEntry,l),A.entry=b.getPtLabel(e),A.percentRoot=d/b.getValue(f),A.percentRootLabel=b.formatPercent(A.percentRoot,l),A.root=b.getPtLabel(f),c.hasOwnProperty("color")&&(A.color=c.color);var M=s.castOption(r,c.i,"text");return(s.isValidTextValue(M)||""===M)&&(A.text=M),A.customdata=s.castOption(r,c.i,"customdata"),s.texttemplateString(k,A,i._d3locale,A,r._meta||{})}},29969:function(t,e,r){"use strict";var n=r(39898),i=r(7901),a=r(71828),o=r(72597).resizeText,s=r(43467);function l(t,e,r,n){var o=e.data.data,l=!e.children,u=o.i,c=a.castOption(r,u,"marker.line.color")||i.defaultLine,f=a.castOption(r,u,"marker.line.width")||0;t.call(s,e,r,n).style("stroke-width",f).call(i.stroke,c).style("opacity",l?r.leaf.opacity:null)}t.exports={style:function(t){var e=t._fullLayout._sunburstlayer.selectAll(".trace");o(t,e,"sunburst"),e.each((function(e){var r=n.select(this),i=e[0].trace;r.style("opacity",i.opacity),r.selectAll("path.surface").each((function(e){n.select(this).call(l,e,i,t)}))}))},styleOne:l}},54532:function(t,e,r){"use strict";var n=r(7901),i=r(50693),a=r(12663).axisHoverFormat,o=r(5386).fF,s=r(9012),l=r(1426).extendFlat,u=r(30962).overrideAll;function c(t){return{show:{valType:"boolean",dflt:!1},start:{valType:"number",dflt:null,editType:"plot"},end:{valType:"number",dflt:null,editType:"plot"},size:{valType:"number",dflt:null,min:0,editType:"plot"},project:{x:{valType:"boolean",dflt:!1},y:{valType:"boolean",dflt:!1},z:{valType:"boolean",dflt:!1}},color:{valType:"color",dflt:n.defaultLine},usecolormap:{valType:"boolean",dflt:!1},width:{valType:"number",min:1,max:16,dflt:2},highlight:{valType:"boolean",dflt:!0},highlightcolor:{valType:"color",dflt:n.defaultLine},highlightwidth:{valType:"number",min:1,max:16,dflt:2}}}var f=t.exports=u(l({z:{valType:"data_array"},x:{valType:"data_array"},y:{valType:"data_array"},text:{valType:"string",dflt:"",arrayOk:!0},hovertext:{valType:"string",dflt:"",arrayOk:!0},hovertemplate:o(),xhoverformat:a("x"),yhoverformat:a("y"),zhoverformat:a("z"),connectgaps:{valType:"boolean",dflt:!1,editType:"calc"},surfacecolor:{valType:"data_array"}},i("",{colorAttr:"z or surfacecolor",showScaleDflt:!0,autoColorDflt:!1,editTypeOverride:"calc"}),{contours:{x:c(),y:c(),z:c()},hidesurface:{valType:"boolean",dflt:!1},lightposition:{x:{valType:"number",min:-1e5,max:1e5,dflt:10},y:{valType:"number",min:-1e5,max:1e5,dflt:1e4},z:{valType:"number",min:-1e5,max:1e5,dflt:0}},lighting:{ambient:{valType:"number",min:0,max:1,dflt:.8},diffuse:{valType:"number",min:0,max:1,dflt:.8},specular:{valType:"number",min:0,max:2,dflt:.05},roughness:{valType:"number",min:0,max:1,dflt:.5},fresnel:{valType:"number",min:0,max:5,dflt:.2}},opacity:{valType:"number",min:0,max:1,dflt:1},opacityscale:{valType:"any",editType:"calc"},_deprecated:{zauto:l({},i.zauto,{}),zmin:l({},i.zmin,{}),zmax:l({},i.zmax,{})},hoverinfo:l({},s.hoverinfo),showlegend:l({},s.showlegend,{dflt:!1})}),"calc","nested");f.x.editType=f.y.editType=f.z.editType="calc+clearAxisTypes",f.transforms=void 0},18396:function(t,e,r){"use strict";var n=r(78803);t.exports=function(t,e){e.surfacecolor?n(t,e,{vals:e.surfacecolor,containerStr:"",cLetter:"c"}):n(t,e,{vals:e.z,containerStr:"",cLetter:"c"})}},43768:function(t,e,r){"use strict";var n=r(9330).gl_surface3d,i=r(9330).ndarray,a=r(9330).ndarray_linear_interpolate.d2,o=r(824),s=r(43907),l=r(71828).isArrayOrTypedArray,u=r(81697).parseColorScale,c=r(78614),f=r(21081).extractOpts;function h(t,e,r){this.scene=t,this.uid=r,this.surface=e,this.data=null,this.showContour=[!1,!1,!1],this.contourStart=[null,null,null],this.contourEnd=[null,null,null],this.contourSize=[0,0,0],this.minValues=[1/0,1/0,1/0],this.maxValues=[-1/0,-1/0,-1/0],this.dataScaleX=1,this.dataScaleY=1,this.refineData=!0,this.objectOffset=[0,0,0]}var p=h.prototype;p.getXat=function(t,e,r,n){var i=l(this.data.x)?l(this.data.x[0])?this.data.x[e][t]:this.data.x[t]:t;return void 0===r?i:n.d2l(i,0,r)},p.getYat=function(t,e,r,n){var i=l(this.data.y)?l(this.data.y[0])?this.data.y[e][t]:this.data.y[e]:e;return void 0===r?i:n.d2l(i,0,r)},p.getZat=function(t,e,r,n){var i=this.data.z[e][t];return null===i&&this.data.connectgaps&&this.data._interpolatedZ&&(i=this.data._interpolatedZ[e][t]),void 0===r?i:n.d2l(i,0,r)},p.handlePick=function(t){if(t.object===this.surface){var e=(t.data.index[0]-1)/this.dataScaleX-1,r=(t.data.index[1]-1)/this.dataScaleY-1,n=Math.max(Math.min(Math.round(e),this.data.z[0].length-1),0),i=Math.max(Math.min(Math.round(r),this.data._ylength-1),0);t.index=[n,i],t.traceCoordinate=[this.getXat(n,i),this.getYat(n,i),this.getZat(n,i)],t.dataCoordinate=[this.getXat(n,i,this.data.xcalendar,this.scene.fullSceneLayout.xaxis),this.getYat(n,i,this.data.ycalendar,this.scene.fullSceneLayout.yaxis),this.getZat(n,i,this.data.zcalendar,this.scene.fullSceneLayout.zaxis)];for(var a=0;a<3;a++){null!=t.dataCoordinate[a]&&(t.dataCoordinate[a]*=this.scene.dataScale[a])}var o=this.data.hovertext||this.data.text;return Array.isArray(o)&&o[i]&&void 0!==o[i][n]?t.textLabel=o[i][n]:t.textLabel=o||"",t.data.dataCoordinate=t.dataCoordinate.slice(),this.surface.highlight(t.data),this.scene.glplot.spikes.position=t.dataCoordinate,!0}};var d=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201,1213,1217,1223,1229,1231,1237,1249,1259,1277,1279,1283,1289,1291,1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423,1427,1429,1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,1489,1493,1499,1511,1523,1531,1543,1549,1553,1559,1567,1571,1579,1583,1597,1601,1607,1609,1613,1619,1621,1627,1637,1657,1663,1667,1669,1693,1697,1699,1709,1721,1723,1733,1741,1747,1753,1759,1777,1783,1787,1789,1801,1811,1823,1831,1847,1861,1867,1871,1873,1877,1879,1889,1901,1907,1913,1931,1933,1949,1951,1973,1979,1987,1993,1997,1999,2003,2011,2017,2027,2029,2039,2053,2063,2069,2081,2083,2087,2089,2099,2111,2113,2129,2131,2137,2141,2143,2153,2161,2179,2203,2207,2213,2221,2237,2239,2243,2251,2267,2269,2273,2281,2287,2293,2297,2309,2311,2333,2339,2341,2347,2351,2357,2371,2377,2381,2383,2389,2393,2399,2411,2417,2423,2437,2441,2447,2459,2467,2473,2477,2503,2521,2531,2539,2543,2549,2551,2557,2579,2591,2593,2609,2617,2621,2633,2647,2657,2659,2663,2671,2677,2683,2687,2689,2693,2699,2707,2711,2713,2719,2729,2731,2741,2749,2753,2767,2777,2789,2791,2797,2801,2803,2819,2833,2837,2843,2851,2857,2861,2879,2887,2897,2903,2909,2917,2927,2939,2953,2957,2963,2969,2971,2999];function v(t,e){if(t0){r=d[n];break}return r}function m(t,e){if(!(t<1||e<1)){for(var r=g(t),n=g(e),i=1,a=0;a_;)r--,r/=y(r),++r1?n:1},p.refineCoords=function(t){for(var e=this.dataScaleX,r=this.dataScaleY,n=t[0].shape[0],a=t[0].shape[1],o=0|Math.floor(t[0].shape[0]*e+1),s=0|Math.floor(t[0].shape[1]*r+1),l=1+n+1,u=1+a+1,c=i(new Float32Array(l*u),[l,u]),f=[1/e,0,0,0,1/r,0,0,0,1],h=0;h0&&null!==this.contourStart[t]&&null!==this.contourEnd[t]&&this.contourEnd[t]>this.contourStart[t]))for(i[t]=!0,e=this.contourStart[t];ea&&(this.minValues[e]=a),this.maxValues[e]",maxDimensionCount:60,overdrag:45,releaseTransitionDuration:120,releaseTransitionEase:"cubic-out",scrollbarCaptureWidth:18,scrollbarHideDelay:1e3,scrollbarHideDuration:1e3,scrollbarOffset:5,scrollbarWidth:8,transitionDuration:100,transitionEase:"cubic-out",uplift:5,wrapSpacer:" ",wrapSplitCharacter:" ",cn:{table:"table",tableControlView:"table-control-view",scrollBackground:"scroll-background",yColumn:"y-column",columnBlock:"column-block",scrollAreaClip:"scroll-area-clip",scrollAreaClipRect:"scroll-area-clip-rect",columnBoundary:"column-boundary",columnBoundaryClippath:"column-boundary-clippath",columnBoundaryRect:"column-boundary-rect",columnCells:"column-cells",columnCell:"column-cell",cellRect:"cell-rect",cellText:"cell-text",cellTextHolder:"cell-text-holder",scrollbarKit:"scrollbar-kit",scrollbar:"scrollbar",scrollbarSlider:"scrollbar-slider",scrollbarGlyph:"scrollbar-glyph",scrollbarCaptureZone:"scrollbar-capture-zone"}}},51018:function(t,e,r){"use strict";var n=r(49850),i=r(1426).extendFlat,a=r(92770);function o(t){if(Array.isArray(t)){for(var e=0,r=0;r=e||u===t.length-1)&&(n[i]=o,o.key=l++,o.firstRowIndex=s,o.lastRowIndex=u,o={firstRowIndex:null,lastRowIndex:null,rows:[]},i+=a,s=u+1,a=0);return n}t.exports=function(t,e){var r=l(e.cells.values),p=function(t){return t.slice(e.header.values.length,t.length)},d=l(e.header.values);d.length&&!d[0].length&&(d[0]=[""],d=l(d));var v=d.concat(p(r).map((function(){return u((d[0]||[""]).length)}))),g=e.domain,y=Math.floor(t._fullLayout._size.w*(g.x[1]-g.x[0])),m=Math.floor(t._fullLayout._size.h*(g.y[1]-g.y[0])),x=e.header.values.length?v[0].map((function(){return e.header.height})):[n.emptyHeaderHeight],b=r.length?r[0].map((function(){return e.cells.height})):[],_=x.reduce(s,0),w=h(b,m-_+n.uplift),T=f(h(x,_),[]),k=f(w,T),A={},M=e._fullInput.columnorder.concat(p(r.map((function(t,e){return e})))),S=v.map((function(t,r){var n=Array.isArray(e.columnwidth)?e.columnwidth[Math.min(r,e.columnwidth.length-1)]:e.columnwidth;return a(n)?Number(n):1})),E=S.reduce(s,0);S=S.map((function(t){return t/E*y}));var L=Math.max(o(e.header.line.width),o(e.cells.line.width)),C={key:e.uid+t._context.staticPlot,translateX:g.x[0]*t._fullLayout._size.w,translateY:t._fullLayout._size.h*(1-g.y[1]),size:t._fullLayout._size,width:y,maxLineWidth:L,height:m,columnOrder:M,groupHeight:m,rowBlocks:k,headerRowBlocks:T,scrollY:0,cells:i({},e.cells,{values:r}),headerCells:i({},e.header,{values:v}),gdColumns:v.map((function(t){return t[0]})),gdColumnsOriginalOrder:v.map((function(t){return t[0]})),prevPages:[0,0],scrollbarState:{scrollbarScrollInProgress:!1},columns:v.map((function(t,e){var r=A[t];return A[t]=(r||0)+1,{key:t+"__"+A[t],label:t,specIndex:e,xIndex:M[e],xScale:c,x:void 0,calcdata:void 0,columnWidth:S[e]}}))};return C.columns.forEach((function(t){t.calcdata=C,t.x=c(t)})),C}},56269:function(t,e,r){"use strict";var n=r(1426).extendFlat;e.splitToPanels=function(t){var e=[0,0],r=n({},t,{key:"header",type:"header",page:0,prevPages:e,currentRepaint:[null,null],dragHandle:!0,values:t.calcdata.headerCells.values[t.specIndex],rowBlocks:t.calcdata.headerRowBlocks,calcdata:n({},t.calcdata,{cells:t.calcdata.headerCells})});return[n({},t,{key:"cells1",type:"cells",page:0,prevPages:e,currentRepaint:[null,null],dragHandle:!1,values:t.calcdata.cells.values[t.specIndex],rowBlocks:t.calcdata.rowBlocks}),n({},t,{key:"cells2",type:"cells",page:1,prevPages:e,currentRepaint:[null,null],dragHandle:!1,values:t.calcdata.cells.values[t.specIndex],rowBlocks:t.calcdata.rowBlocks}),r]},e.splitToCells=function(t){var e=function(t){var e=t.rowBlocks[t.page],r=e?e.rows[0].rowIndex:0;return[r,e?r+e.rows.length:0]}(t);return(t.values||[]).slice(e[0],e[1]).map((function(r,n){return{keyWithinBlock:n+("string"==typeof r&&r.match(/[<$&> ]/)?"_keybuster_"+Math.random():""),key:e[0]+n,column:t,calcdata:t.calcdata,page:t.page,rowBlocks:t.rowBlocks,value:r}}))}},39754:function(t,e,r){"use strict";var n=r(71828),i=r(44464),a=r(27670).c;t.exports=function(t,e,r,o){function s(r,a){return n.coerce(t,e,i,r,a)}a(e,o,s),s("columnwidth"),s("header.values"),s("header.format"),s("header.align"),s("header.prefix"),s("header.suffix"),s("header.height"),s("header.line.width"),s("header.line.color"),s("header.fill.color"),n.coerceFont(s,"header.font",n.extendFlat({},o.font)),function(t,e){for(var r=t.columnorder||[],n=t.header.values.length,i=r.slice(0,n),a=i.slice().sort((function(t,e){return t-e})),o=i.map((function(t){return a.indexOf(t)})),s=o.length;s/i),l=!o||s;t.mayHaveMarkup=o&&i.match(/[<&>]/);var u,c="string"==typeof(u=i)&&u.match(n.latexCheck);t.latex=c;var f,h,p=c?"":T(t.calcdata.cells.prefix,e,r)||"",d=c?"":T(t.calcdata.cells.suffix,e,r)||"",v=c?null:T(t.calcdata.cells.format,e,r)||null,g=p+(v?a(v)(t.value):t.value)+d;if(t.wrappingNeeded=!t.wrapped&&!l&&!c&&(f=w(g)),t.cellHeightMayIncrease=s||c||t.mayHaveMarkup||(void 0===f?w(g):f),t.needsConvertToTspans=t.mayHaveMarkup||t.wrappingNeeded||t.latex,t.wrappingNeeded){var y=(" "===n.wrapSplitCharacter?g.replace(/i&&n.push(a),i+=l}return n}(i,l,s);1===u.length&&(u[0]===i.length-1?u.unshift(u[0]-1):u.push(u[0]+1)),u[0]%2&&u.reverse(),e.each((function(t,e){t.page=u[e],t.scrollY=l})),e.attr("transform",(function(t){var e=z(t.rowBlocks,t.page)-t.scrollY;return c(0,e)})),t&&(C(t,r,e,u,n.prevPages,n,0),C(t,r,e,u,n.prevPages,n,1),x(r,t))}}function L(t,e,r,a){return function(o){var s=o.calcdata?o.calcdata:o,l=e.filter((function(t){return s.key===t.key})),u=r||s.scrollbarState.dragMultiplier,c=s.scrollY;s.scrollY=void 0===a?s.scrollY+u*i.event.dy:a;var f=l.selectAll("."+n.cn.yColumn).selectAll("."+n.cn.columnBlock).filter(A);return E(t,f,l),s.scrollY===c}}function C(t,e,r,n,i,a,o){n[o]!==i[o]&&(clearTimeout(a.currentRepaint[o]),a.currentRepaint[o]=setTimeout((function(){var a=r.filter((function(t,e){return e===o&&n[e]!==i[e]}));b(t,e,a,r),i[o]=n[o]})))}function P(t,e,r,a){return function(){var o=i.select(e.parentNode);o.each((function(t){var e=t.fragments;o.selectAll("tspan.line").each((function(t,r){e[r].width=this.getComputedTextLength()}));var r,i,a=e[e.length-1].width,s=e.slice(0,-1),l=[],u=0,c=t.column.columnWidth-2*n.cellPad;for(t.value="";s.length;)u+(i=(r=s.shift()).width+a)>c&&(t.value+=l.join(n.wrapSpacer)+n.lineBreaker,l=[],u=0),l.push(r.text),u+=i;u&&(t.value+=l.join(n.wrapSpacer)),t.wrapped=!0})),o.selectAll("tspan.line").remove(),_(o.select("."+n.cn.cellText),r,t,a),i.select(e.parentNode.parentNode).call(D)}}function O(t,e,r,a,o){return function(){if(!o.settledY){var s=i.select(e.parentNode),l=B(o),u=o.key-l.firstRowIndex,f=l.rows[u].rowHeight,h=o.cellHeightMayIncrease?e.parentNode.getBoundingClientRect().height+2*n.cellPad:f,p=Math.max(h,f);p-l.rows[u].rowHeight&&(l.rows[u].rowHeight=p,t.selectAll("."+n.cn.columnCell).call(D),E(null,t.filter(A),0),x(r,a,!0)),s.attr("transform",(function(){var t=this,e=t.parentNode.getBoundingClientRect(),r=i.select(t.parentNode).select("."+n.cn.cellRect).node().getBoundingClientRect(),a=t.transform.baseVal.consolidate(),s=r.top-e.top+(a?a.matrix.f:n.cellPad);return c(I(o,i.select(t.parentNode).select("."+n.cn.cellTextHolder).node().getBoundingClientRect().width),s)})),o.settledY=!0}}}function I(t,e){switch(t.align){case"left":default:return n.cellPad;case"right":return t.column.columnWidth-(e||0)-n.cellPad;case"center":return(t.column.columnWidth-(e||0))/2}}function D(t){t.attr("transform",(function(t){var e=t.rowBlocks[0].auxiliaryBlocks.reduce((function(t,e){return t+R(e,1/0)}),0),r=R(B(t),t.key);return c(0,r+e)})).selectAll("."+n.cn.cellRect).attr("height",(function(t){return(e=B(t),r=t.key,e.rows[r-e.firstRowIndex]).rowHeight;var e,r}))}function z(t,e){for(var r=0,n=e-1;n>=0;n--)r+=F(t[n]);return r}function R(t,e){for(var r=0,n=0;n","<","|","/","\\"],dflt:">",editType:"plot"},thickness:{valType:"number",min:12,editType:"plot"},textfont:c({},s.textfont,{}),editType:"calc"},text:s.text,textinfo:l.textinfo,texttemplate:i({editType:"plot"},{keys:u.eventDataKeys.concat(["label","value"])}),hovertext:s.hovertext,hoverinfo:l.hoverinfo,hovertemplate:n({},{keys:u.eventDataKeys}),textfont:s.textfont,insidetextfont:s.insidetextfont,outsidetextfont:c({},s.outsidetextfont,{}),textposition:{valType:"enumerated",values:["top left","top center","top right","middle left","middle center","middle right","bottom left","bottom center","bottom right"],dflt:"top left",editType:"plot"},sort:s.sort,root:l.root,domain:o({name:"treemap",trace:!0,editType:"calc"})}},78018:function(t,e,r){"use strict";var n=r(74875);e.name="treemap",e.plot=function(t,r,i,a){n.plotBasePlot(e.name,t,r,i,a)},e.clean=function(t,r,i,a){n.cleanBasePlot(e.name,t,r,i,a)}},65039:function(t,e,r){"use strict";var n=r(52147);e.y=function(t,e){return n.calc(t,e)},e.T=function(t){return n._runCrossTraceCalc("treemap",t)}},43473:function(t){"use strict";t.exports={CLICK_TRANSITION_TIME:750,CLICK_TRANSITION_EASING:"poly",eventDataKeys:["currentPath","root","entry","percentRoot","percentEntry","percentParent"],gapWithPathbar:1}},91174:function(t,e,r){"use strict";var n=r(71828),i=r(45802),a=r(7901),o=r(27670).c,s=r(90769).handleText,l=r(97313).TEXTPAD,u=r(37434).handleMarkerDefaults,c=r(21081),f=c.hasColorscale,h=c.handleDefaults;t.exports=function(t,e,r,c){function p(r,a){return n.coerce(t,e,i,r,a)}var d=p("labels"),v=p("parents");if(d&&d.length&&v&&v.length){var g=p("values");g&&g.length?p("branchvalues"):p("count"),p("level"),p("maxdepth"),"squarify"===p("tiling.packing")&&p("tiling.squarifyratio"),p("tiling.flip"),p("tiling.pad");var y=p("text");p("texttemplate"),e.texttemplate||p("textinfo",Array.isArray(y)?"text+label":"label"),p("hovertext"),p("hovertemplate");var m=p("pathbar.visible");s(t,e,c,p,"auto",{hasPathbar:m,moduleHasSelected:!1,moduleHasUnselected:!1,moduleHasConstrain:!1,moduleHasCliponaxis:!1,moduleHasTextangle:!1,moduleHasInsideanchor:!1}),p("textposition");var x=-1!==e.textposition.indexOf("bottom");u(t,e,c,p),(e._hasColorscale=f(t,"marker","colors")||(t.marker||{}).coloraxis)?h(t,e,c,p,{prefix:"marker.",cLetter:"c"}):p("marker.depthfade",!(e.marker.colors||[]).length);var b=2*e.textfont.size;p("marker.pad.t",x?b/4:b),p("marker.pad.l",b/4),p("marker.pad.r",b/4),p("marker.pad.b",x?b:b/4),p("marker.cornerradius"),e._hovered={marker:{line:{width:2,color:a.contrast(c.paper_bgcolor)}}},m&&(p("pathbar.thickness",e.pathbar.textfont.size+2*l),p("pathbar.side"),p("pathbar.edgeshape")),p("sort"),p("root.color"),o(e,c,p),e._length=null}else e.visible=!1}},80694:function(t,e,r){"use strict";var n=r(39898),i=r(2791),a=r(72597).clearMinTextSize,o=r(16688).resizeText,s=r(46650);t.exports=function(t,e,r,l,u){var c,f,h=u.type,p=u.drawDescendants,d=t._fullLayout,v=d["_"+h+"layer"],g=!r;a(h,d),(c=v.selectAll("g.trace."+h).data(e,(function(t){return t[0].trace.uid}))).enter().append("g").classed("trace",!0).classed(h,!0),c.order(),!d.uniformtext.mode&&i.hasTransition(r)?(l&&(f=l()),n.transition().duration(r.duration).ease(r.easing).each("end",(function(){f&&f()})).each("interrupt",(function(){f&&f()})).each((function(){v.selectAll("g.trace").each((function(e){s(t,e,this,r,p)}))}))):(c.each((function(e){s(t,e,this,r,p)})),d.uniformtext.mode&&o(t,v.selectAll(".trace"),h)),g&&c.exit().remove()}},66209:function(t,e,r){"use strict";var n=r(39898),i=r(71828),a=r(91424),o=r(63893),s=r(37210),l=r(96362).styleOne,u=r(43473),c=r(2791),f=r(83523),h=!0;t.exports=function(t,e,r,p,d){var v=d.barDifY,g=d.width,y=d.height,m=d.viewX,x=d.viewY,b=d.pathSlice,_=d.toMoveInsideSlice,w=d.strTransform,T=d.hasTransition,k=d.handleSlicesExit,A=d.makeUpdateSliceInterpolator,M=d.makeUpdateTextInterpolator,S={},E=t._context.staticPlot,L=t._fullLayout,C=e[0],P=C.trace,O=C.hierarchy,I=g/P._entryDepth,D=c.listPath(r.data,"id"),z=s(O.copy(),[g,y],{packing:"dice",pad:{inner:0,top:0,left:0,right:0,bottom:0}}).descendants();(z=z.filter((function(t){var e=D.indexOf(t.data.id);return-1!==e&&(t.x0=I*e,t.x1=I*(e+1),t.y0=v,t.y1=v+y,t.onPathbar=!0,!0)}))).reverse(),(p=p.data(z,c.getPtId)).enter().append("g").classed("pathbar",!0),k(p,h,S,[g,y],b),p.order();var R=p;T&&(R=R.transition().each("end",(function(){var e=n.select(this);c.setSliceCursor(e,t,{hideOnRoot:!1,hideOnLeaves:!1,isTransitioning:!1})}))),R.each((function(s){s._x0=m(s.x0),s._x1=m(s.x1),s._y0=x(s.y0),s._y1=x(s.y1),s._hoverX=m(s.x1-Math.min(g,y)/2),s._hoverY=x(s.y1-y/2);var p=n.select(this),d=i.ensureSingle(p,"path","surface",(function(t){t.style("pointer-events",E?"none":"all")}));T?d.transition().attrTween("d",(function(t){var e=A(t,h,S,[g,y]);return function(t){return b(e(t))}})):d.attr("d",b),p.call(f,r,t,e,{styleOne:l,eventDataKeys:u.eventDataKeys,transitionTime:u.CLICK_TRANSITION_TIME,transitionEasing:u.CLICK_TRANSITION_EASING}).call(c.setSliceCursor,t,{hideOnRoot:!1,hideOnLeaves:!1,isTransitioning:t._transitioning}),d.call(l,s,P,t,{hovered:!1}),s._text=(c.getPtLabel(s)||"").split("
").join(" ")||"";var v=i.ensureSingle(p,"g","slicetext"),k=i.ensureSingle(v,"text","",(function(t){t.attr("data-notex",1)})),C=i.ensureUniformFontSize(t,c.determineTextFont(P,s,L.font,{onPathbar:!0}));k.text(s._text||" ").classed("slicetext",!0).attr("text-anchor","start").call(a.font,C).call(o.convertToTspans,t),s.textBB=a.bBox(k.node()),s.transform=_(s,{fontSize:C.size,onPathbar:!0}),s.transform.fontSize=C.size,T?k.transition().attrTween("transform",(function(t){var e=M(t,h,S,[g,y]);return function(t){return w(e(t))}})):k.attr("transform",w(s))}))}},52583:function(t,e,r){"use strict";var n=r(39898),i=r(71828),a=r(91424),o=r(63893),s=r(37210),l=r(96362).styleOne,u=r(43473),c=r(2791),f=r(83523),h=r(24714).formatSliceLabel,p=!1;t.exports=function(t,e,r,d,v){var g=v.width,y=v.height,m=v.viewX,x=v.viewY,b=v.pathSlice,_=v.toMoveInsideSlice,w=v.strTransform,T=v.hasTransition,k=v.handleSlicesExit,A=v.makeUpdateSliceInterpolator,M=v.makeUpdateTextInterpolator,S=v.prevEntry,E=t._context.staticPlot,L=t._fullLayout,C=e[0].trace,P=-1!==C.textposition.indexOf("left"),O=-1!==C.textposition.indexOf("right"),I=-1!==C.textposition.indexOf("bottom"),D=!I&&!C.marker.pad.t||I&&!C.marker.pad.b,z=s(r,[g,y],{packing:C.tiling.packing,squarifyratio:C.tiling.squarifyratio,flipX:C.tiling.flip.indexOf("x")>-1,flipY:C.tiling.flip.indexOf("y")>-1,pad:{inner:C.tiling.pad,top:C.marker.pad.t,left:C.marker.pad.l,right:C.marker.pad.r,bottom:C.marker.pad.b}}).descendants(),R=1/0,F=-1/0;z.forEach((function(t){var e=t.depth;e>=C._maxDepth?(t.x0=t.x1=(t.x0+t.x1)/2,t.y0=t.y1=(t.y0+t.y1)/2):(R=Math.min(R,e),F=Math.max(F,e))})),d=d.data(z,c.getPtId),C._maxVisibleLayers=isFinite(F)?F-R+1:0,d.enter().append("g").classed("slice",!0),k(d,p,{},[g,y],b),d.order();var B=null;if(T&&S){var N=c.getPtId(S);d.each((function(t){null===B&&c.getPtId(t)===N&&(B={x0:t.x0,x1:t.x1,y0:t.y0,y1:t.y1})}))}var j=function(){return B||{x0:0,x1:g,y0:0,y1:y}},U=d;return T&&(U=U.transition().each("end",(function(){var e=n.select(this);c.setSliceCursor(e,t,{hideOnRoot:!0,hideOnLeaves:!1,isTransitioning:!1})}))),U.each((function(s){var d=c.isHeader(s,C);s._x0=m(s.x0),s._x1=m(s.x1),s._y0=x(s.y0),s._y1=x(s.y1),s._hoverX=m(s.x1-C.marker.pad.r),s._hoverY=x(I?s.y1-C.marker.pad.b/2:s.y0+C.marker.pad.t/2);var v=n.select(this),k=i.ensureSingle(v,"path","surface",(function(t){t.style("pointer-events",E?"none":"all")}));T?k.transition().attrTween("d",(function(t){var e=A(t,p,j(),[g,y]);return function(t){return b(e(t))}})):k.attr("d",b),v.call(f,r,t,e,{styleOne:l,eventDataKeys:u.eventDataKeys,transitionTime:u.CLICK_TRANSITION_TIME,transitionEasing:u.CLICK_TRANSITION_EASING}).call(c.setSliceCursor,t,{isTransitioning:t._transitioning}),k.call(l,s,C,t,{hovered:!1}),s.x0===s.x1||s.y0===s.y1?s._text="":s._text=d?D?"":c.getPtLabel(s)||"":h(s,r,C,e,L)||"";var S=i.ensureSingle(v,"g","slicetext"),z=i.ensureSingle(S,"text","",(function(t){t.attr("data-notex",1)})),R=i.ensureUniformFontSize(t,c.determineTextFont(C,s,L.font));z.text(s._text||" ").classed("slicetext",!0).attr("text-anchor",O?"end":P||d?"start":"middle").call(a.font,R).call(o.convertToTspans,t),s.textBB=a.bBox(z.node()),s.transform=_(s,{fontSize:R.size,isHeader:d}),s.transform.fontSize=R.size,T?z.transition().attrTween("transform",(function(t){var e=M(t,p,j(),[g,y]);return function(t){return w(e(t))}})):z.attr("transform",w(s))})),B}},14102:function(t){"use strict";t.exports=function t(e,r,n){var i;n.swapXY&&(i=e.x0,e.x0=e.y0,e.y0=i,i=e.x1,e.x1=e.y1,e.y1=i),n.flipX&&(i=e.x0,e.x0=r[0]-e.x1,e.x1=r[0]-i),n.flipY&&(i=e.y0,e.y0=r[1]-e.y1,e.y1=r[1]-i);var a=e.children;if(a)for(var o=0;o-1?C+I:-(O+I):0,z={x0:P,x1:P,y0:D,y1:D+O},R=function(t,e,r){var n=y.tiling.pad,i=function(t){return t-n<=e.x0},a=function(t){return t+n>=e.x1},o=function(t){return t-n<=e.y0},s=function(t){return t+n>=e.y1};return t.x0===e.x0&&t.x1===e.x1&&t.y0===e.y0&&t.y1===e.y1?{x0:t.x0,x1:t.x1,y0:t.y0,y1:t.y1}:{x0:i(t.x0-n)?0:a(t.x0-n)?r[0]:t.x0,x1:i(t.x1+n)?0:a(t.x1+n)?r[0]:t.x1,y0:o(t.y0-n)?0:s(t.y0-n)?r[1]:t.y0,y1:o(t.y1+n)?0:s(t.y1+n)?r[1]:t.y1}},F=null,B={},N={},j=null,U=function(t,e){return e?B[h(t)]:N[h(t)]};g.hasMultipleRoots&&k&&M++,y._maxDepth=M,y._backgroundColor=v.paper_bgcolor,y._entryDepth=b.data.depth,y._atRootLevel=k;var V=-L/2+S.l+S.w*(E.x[1]+E.x[0])/2,H=-C/2+S.t+S.h*(1-(E.y[1]+E.y[0])/2),q=function(t){return V+t},G=function(t){return H+t},Z=G(0),Y=q(0),W=function(t){return Y+t},X=function(t){return Z+t};function J(t,e){return t+","+e}var K=W(0),$=function(t){t.x=Math.max(K,t.x)},Q=y.pathbar.edgeshape,tt=y[m?"tiling":"marker"].pad,et=function(t){return-1!==y.textposition.indexOf(t)},rt=et("top"),nt=et("left"),it=et("right"),at=et("bottom"),ot=function(t,e){var r=t.x0,n=t.x1,i=t.y0,a=t.y1,o=t.textBB,c=rt||e.isHeader&&!at?"start":at?"end":"middle",f=et("right"),h=et("left")||e.onPathbar?-1:f?1:0;if(e.isHeader){if((r+=(m?tt:tt.l)-s)>=(n-=(m?tt:tt.r)-s)){var p=(r+n)/2;r=p,n=p}var d;at?i<(d=a-(m?tt:tt.b))&&d"===Q?(l.x-=a,u.x-=a,c.x-=a,f.x-=a):"/"===Q?(c.x-=a,f.x-=a,o.x-=a/2,s.x-=a/2):"\\"===Q?(l.x-=a,u.x-=a,o.x-=a/2,s.x-=a/2):"<"===Q&&(o.x-=a,s.x-=a),$(l),$(f),$(o),$(u),$(c),$(s),"M"+J(l.x,l.y)+"L"+J(u.x,u.y)+"L"+J(s.x,s.y)+"L"+J(c.x,c.y)+"L"+J(f.x,f.y)+"L"+J(o.x,o.y)+"Z"},toMoveInsideSlice:ot,makeUpdateSliceInterpolator:lt,makeUpdateTextInterpolator:ut,handleSlicesExit:ct,hasTransition:A,strTransform:ft}):w.remove()}},96362:function(t,e,r){"use strict";var n=r(39898),i=r(7901),a=r(71828),o=r(2791),s=r(72597).resizeText,l=r(43467);function u(t,e,r,n,s){var u,c,f=(s||{}).hovered,h=e.data.data,p=h.i,d=h.color,v=o.isHierarchyRoot(e),g=1;if(f)u=r._hovered.marker.line.color,c=r._hovered.marker.line.width;else if(v&&d===r.root.color)g=100,u="rgba(0,0,0,0)",c=0;else if(u=a.castOption(r,p,"marker.line.color")||i.defaultLine,c=a.castOption(r,p,"marker.line.width")||0,!r._hasColorscale&&!e.onPathbar){var y=r.marker.depthfade;if(y){var m,x=i.combine(i.addOpacity(r._backgroundColor,.75),d);if(!0===y){var b=o.getMaxDepth(r);m=isFinite(b)?o.isLeaf(e)?0:r._maxVisibleLayers-(e.data.depth-r._entryDepth):e.data.height+1}else m=e.data.depth-r._entryDepth,r._atRootLevel||m++;if(m>0)for(var _=0;_0){var b,_,w,T,k,A=t.xa,M=t.ya;"h"===d.orientation?(k=e,b="y",w=M,_="x",T=A):(k=r,b="x",w=A,_="y",T=M);var S=p[t.index];if(k>=S.span[0]&&k<=S.span[1]){var E=i.extendFlat({},t),L=T.c2p(k,!0),C=s.getKdeValue(S,d,k),P=s.getPositionOnKdePath(S,d,L),O=w._offset,I=w._length;E[b+"0"]=P[0],E[b+"1"]=P[1],E[_+"0"]=E[_+"1"]=L,E[_+"Label"]=_+": "+a.hoverLabelText(T,k,d[_+"hoverformat"])+", "+p[0].t.labels.kde+" "+C.toFixed(3);for(var D=0,z=0;z")),c.color=function(t,e){var r=t[e.dir].marker,n=r.color,a=r.line.color,o=r.line.width;return i(n)?n:i(a)&&o?a:void 0}(h,g),[c]}function k(t){return n(v,t,h[d+"hoverformat"])}}},19990:function(t,e,r){"use strict";t.exports={attributes:r(43037),layoutAttributes:r(13494),supplyDefaults:r(83266).supplyDefaults,crossTraceDefaults:r(83266).crossTraceDefaults,supplyLayoutDefaults:r(5176),calc:r(52752),crossTraceCalc:r(70766),plot:r(30436),style:r(55750).style,hoverPoints:r(61326),eventData:r(58593),selectPoints:r(81974),moduleType:"trace",name:"waterfall",basePlotModule:r(93612),categories:["bar-like","cartesian","svg","oriented","showLegend","zoomScale"],meta:{}}},13494:function(t){"use strict";t.exports={waterfallmode:{valType:"enumerated",values:["group","overlay"],dflt:"group",editType:"calc"},waterfallgap:{valType:"number",min:0,max:1,editType:"calc"},waterfallgroupgap:{valType:"number",min:0,max:1,dflt:0,editType:"calc"}}},5176:function(t,e,r){"use strict";var n=r(71828),i=r(13494);t.exports=function(t,e,r){var a=!1;function o(r,a){return n.coerce(t,e,i,r,a)}for(var s=0;s0&&(g+=h?"M"+f[0]+","+d[1]+"V"+d[0]:"M"+f[1]+","+d[0]+"H"+f[0]),"between"!==p&&(r.isSum||s path").each((function(t){if(!t.isBlank){var e=s[t.dir].marker;n.select(this).call(a.fill,e.color).call(a.stroke,e.line.color).call(i.dashLine,e.line.dash,e.line.width).style("opacity",s.selectedpoints&&!t.selected?o:1)}})),u(r,s,t),r.selectAll(".lines").each((function(){var t=s.connector.line;i.lineGroupStyle(n.select(this).selectAll("path"),t.width,t.color,t.dash)}))}))}}},82887:function(t,e,r){"use strict";var n=r(89298),i=r(71828),a=r(86281),o=r(79344).p,s=r(50606).BADNUM;e.moduleType="transform",e.name="aggregate";var l=e.attributes={enabled:{valType:"boolean",dflt:!0,editType:"calc"},groups:{valType:"string",strict:!0,noBlank:!0,arrayOk:!0,dflt:"x",editType:"calc"},aggregations:{_isLinkedToArray:"aggregation",target:{valType:"string",editType:"calc"},func:{valType:"enumerated",values:["count","sum","avg","median","mode","rms","stddev","min","max","first","last","change","range"],dflt:"first",editType:"calc"},funcmode:{valType:"enumerated",values:["sample","population"],dflt:"sample",editType:"calc"},enabled:{valType:"boolean",dflt:!0,editType:"calc"},editType:"calc"},editType:"calc"},u=l.aggregations;function c(t,e,r,a){if(a.enabled){for(var o=a.target,l=i.nestedProperty(e,o),u=l.get(),c=function(t,e){var r=t.func,n=e.d2c,a=e.c2d;switch(r){case"count":return f;case"first":return h;case"last":return p;case"sum":return function(t,e){for(var r=0,i=0;ii&&(i=c,o=u)}}return i?a(o):s};case"rms":return function(t,e){for(var r=0,i=0,o=0;o":return function(t){return h(t)>s};case">=":return function(t){return h(t)>=s};case"[]":return function(t){var e=h(t);return e>=s[0]&&e<=s[1]};case"()":return function(t){var e=h(t);return e>s[0]&&e=s[0]&&es[0]&&e<=s[1]};case"][":return function(t){var e=h(t);return e<=s[0]||e>=s[1]};case")(":return function(t){var e=h(t);return es[1]};case"](":return function(t){var e=h(t);return e<=s[0]||e>s[1]};case")[":return function(t){var e=h(t);return e=s[1]};case"{}":return function(t){return-1!==s.indexOf(h(t))};case"}{":return function(t){return-1===s.indexOf(h(t))}}}(r,a.getDataToCoordFunc(t,e,s,i),h),x={},b={},_=0;d?(g=function(t){x[t.astr]=n.extendDeep([],t.get()),t.set(new Array(f))},y=function(t,e){var r=x[t.astr][e];t.get()[e]=r}):(g=function(t){x[t.astr]=n.extendDeep([],t.get()),t.set([])},y=function(t,e){var r=x[t.astr][e];t.get().push(r)}),k(g);for(var w=o(e.transforms,r),T=0;T1?"%{group} (%{trace})":"%{group}");var l=t.styles,u=o.styles=[];if(l)for(a=0;af)throw new RangeError('The value "'+t+'" is invalid for option "size"');var e=new Uint8Array(t);return Object.setPrototypeOf(e,p.prototype),e}function p(t,e,r){if("number"==typeof t){if("string"==typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return g(t)}return d(t,e,r)}function d(t,e,r){if("string"==typeof t)return function(t,e){if("string"==typeof e&&""!==e||(e="utf8"),!p.isEncoding(e))throw new TypeError("Unknown encoding: "+e);var r=0|b(t,e),n=h(r),i=n.write(t,e);return i!==r&&(n=n.slice(0,i)),n}(t,e);if(ArrayBuffer.isView(t))return function(t){if(tt(t,Uint8Array)){var e=new Uint8Array(t);return m(e.buffer,e.byteOffset,e.byteLength)}return y(t)}(t);if(null==t)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+s(t));if(tt(t,ArrayBuffer)||t&&tt(t.buffer,ArrayBuffer))return m(t,e,r);if("undefined"!=typeof SharedArrayBuffer&&(tt(t,SharedArrayBuffer)||t&&tt(t.buffer,SharedArrayBuffer)))return m(t,e,r);if("number"==typeof t)throw new TypeError('The "value" argument must not be of type number. Received type number');var n=t.valueOf&&t.valueOf();if(null!=n&&n!==t)return p.from(n,e,r);var i=function(t){if(p.isBuffer(t)){var e=0|x(t.length),r=h(e);return 0===r.length||t.copy(r,0,0,e),r}return void 0!==t.length?"number"!=typeof t.length||et(t.length)?h(0):y(t):"Buffer"===t.type&&Array.isArray(t.data)?y(t.data):void 0}(t);if(i)return i;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof t[Symbol.toPrimitive])return p.from(t[Symbol.toPrimitive]("string"),e,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+s(t))}function v(t){if("number"!=typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('The value "'+t+'" is invalid for option "size"')}function g(t){return v(t),h(t<0?0:0|x(t))}function y(t){for(var e=t.length<0?0:0|x(t.length),r=h(e),n=0;n=f)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+f.toString(16)+" bytes");return 0|t}function b(t,e){if(p.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||tt(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+s(t));var r=t.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;for(var i=!1;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return K(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return $(t).length;default:if(i)return n?-1:K(t).length;e=(""+e).toLowerCase(),i=!0}}function _(t,e,r){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return z(this,e,r);case"utf8":case"utf-8":return P(this,e,r);case"ascii":return I(this,e,r);case"latin1":case"binary":return D(this,e,r);case"base64":return C(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return R(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function w(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function T(t,e,r,n,i){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),et(r=+r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof e&&(e=p.from(e,n)),p.isBuffer(e))return 0===e.length?-1:k(t,e,r,n,i);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):k(t,[e],r,n,i);throw new TypeError("val must be string, number or Buffer")}function k(t,e,r,n,i){var a,o=1,s=t.length,l=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;o=2,s/=2,l/=2,r/=2}function u(t,e){return 1===o?t[e]:t.readUInt16BE(e*o)}if(i){var c=-1;for(a=r;as&&(r=s-l),a=r;a>=0;a--){for(var f=!0,h=0;hi&&(n=i):n=i;var a,o=e.length;for(n>o/2&&(n=o/2),a=0;a>8,i=r%256,a.push(i),a.push(n);return a}(e,t.length-r),t,r,n)}function C(t,e,r){return 0===e&&r===t.length?l.fromByteArray(t):l.fromByteArray(t.slice(e,r))}function P(t,e,r){r=Math.min(t.length,r);for(var n=[],i=e;i239?4:a>223?3:a>191?2:1;if(i+s<=r){var l=void 0,u=void 0,c=void 0,f=void 0;switch(s){case 1:a<128&&(o=a);break;case 2:128==(192&(l=t[i+1]))&&(f=(31&a)<<6|63&l)>127&&(o=f);break;case 3:l=t[i+1],u=t[i+2],128==(192&l)&&128==(192&u)&&(f=(15&a)<<12|(63&l)<<6|63&u)>2047&&(f<55296||f>57343)&&(o=f);break;case 4:l=t[i+1],u=t[i+2],c=t[i+3],128==(192&l)&&128==(192&u)&&128==(192&c)&&(f=(15&a)<<18|(63&l)<<12|(63&u)<<6|63&c)>65535&&f<1114112&&(o=f)}}null===o?(o=65533,s=1):o>65535&&(o-=65536,n.push(o>>>10&1023|55296),o=56320|1023&o),n.push(o),i+=s}return function(t){var e=t.length;if(e<=O)return String.fromCharCode.apply(String,t);for(var r="",n=0;nn.length?(p.isBuffer(a)||(a=p.from(a)),a.copy(n,i)):Uint8Array.prototype.set.call(n,a,i);else{if(!p.isBuffer(a))throw new TypeError('"list" argument must be an Array of Buffers');a.copy(n,i)}i+=a.length}return n},p.byteLength=b,p.prototype._isBuffer=!0,p.prototype.swap16=function(){var t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var e=0;er&&(t+=" ... "),""},c&&(p.prototype[c]=p.prototype.inspect),p.prototype.compare=function(t,e,r,n,i){if(tt(t,Uint8Array)&&(t=p.from(t,t.offset,t.byteLength)),!p.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+s(t));if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(this===t)return 0;for(var a=(i>>>=0)-(n>>>=0),o=(r>>>=0)-(e>>>=0),l=Math.min(a,o),u=this.slice(n,i),c=t.slice(e,r),f=0;f>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}var i=this.length-e;if((void 0===r||r>i)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var a=!1;;)switch(n){case"hex":return A(this,t,e,r);case"utf8":case"utf-8":return M(this,t,e,r);case"ascii":case"latin1":case"binary":return S(this,t,e,r);case"base64":return E(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return L(this,t,e,r);default:if(a)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),a=!0}},p.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var O=4096;function I(t,e,r){var n="";r=Math.min(t.length,r);for(var i=e;in)&&(r=n);for(var i="",a=e;ar)throw new RangeError("Trying to access beyond buffer length")}function B(t,e,r,n,i,a){if(!p.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError("Index out of range")}function N(t,e,r,n,i){Y(e,n,i,t,r,7);var a=Number(e&BigInt(4294967295));t[r++]=a,a>>=8,t[r++]=a,a>>=8,t[r++]=a,a>>=8,t[r++]=a;var o=Number(e>>BigInt(32)&BigInt(4294967295));return t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o,r}function j(t,e,r,n,i){Y(e,n,i,t,r,7);var a=Number(e&BigInt(4294967295));t[r+7]=a,a>>=8,t[r+6]=a,a>>=8,t[r+5]=a,a>>=8,t[r+4]=a;var o=Number(e>>BigInt(32)&BigInt(4294967295));return t[r+3]=o,o>>=8,t[r+2]=o,o>>=8,t[r+1]=o,o>>=8,t[r]=o,r+8}function U(t,e,r,n,i,a){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function V(t,e,r,n,i){return e=+e,r>>>=0,i||U(t,0,r,4),u.write(t,e,r,n,23,4),r+4}function H(t,e,r,n,i){return e=+e,r>>>=0,i||U(t,0,r,8),u.write(t,e,r,n,52,8),r+8}p.prototype.slice=function(t,e){var r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e>>=0,e>>>=0,r||F(t,e,this.length);for(var n=this[t],i=1,a=0;++a>>=0,e>>>=0,r||F(t,e,this.length);for(var n=this[t+--e],i=1;e>0&&(i*=256);)n+=this[t+--e]*i;return n},p.prototype.readUint8=p.prototype.readUInt8=function(t,e){return t>>>=0,e||F(t,1,this.length),this[t]},p.prototype.readUint16LE=p.prototype.readUInt16LE=function(t,e){return t>>>=0,e||F(t,2,this.length),this[t]|this[t+1]<<8},p.prototype.readUint16BE=p.prototype.readUInt16BE=function(t,e){return t>>>=0,e||F(t,2,this.length),this[t]<<8|this[t+1]},p.prototype.readUint32LE=p.prototype.readUInt32LE=function(t,e){return t>>>=0,e||F(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},p.prototype.readUint32BE=p.prototype.readUInt32BE=function(t,e){return t>>>=0,e||F(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},p.prototype.readBigUInt64LE=nt((function(t){W(t>>>=0,"offset");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||X(t,this.length-8);var n=e+this[++t]*Math.pow(2,8)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,24),i=this[++t]+this[++t]*Math.pow(2,8)+this[++t]*Math.pow(2,16)+r*Math.pow(2,24);return BigInt(n)+(BigInt(i)<>>=0,"offset");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||X(t,this.length-8);var n=e*Math.pow(2,24)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,8)+this[++t],i=this[++t]*Math.pow(2,24)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,8)+r;return(BigInt(n)<>>=0,e>>>=0,r||F(t,e,this.length);for(var n=this[t],i=1,a=0;++a=(i*=128)&&(n-=Math.pow(2,8*e)),n},p.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||F(t,e,this.length);for(var n=e,i=1,a=this[t+--n];n>0&&(i*=256);)a+=this[t+--n]*i;return a>=(i*=128)&&(a-=Math.pow(2,8*e)),a},p.prototype.readInt8=function(t,e){return t>>>=0,e||F(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},p.prototype.readInt16LE=function(t,e){t>>>=0,e||F(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},p.prototype.readInt16BE=function(t,e){t>>>=0,e||F(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},p.prototype.readInt32LE=function(t,e){return t>>>=0,e||F(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},p.prototype.readInt32BE=function(t,e){return t>>>=0,e||F(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},p.prototype.readBigInt64LE=nt((function(t){W(t>>>=0,"offset");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||X(t,this.length-8);var n=this[t+4]+this[t+5]*Math.pow(2,8)+this[t+6]*Math.pow(2,16)+(r<<24);return(BigInt(n)<>>=0,"offset");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||X(t,this.length-8);var n=(e<<24)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,8)+this[++t];return(BigInt(n)<>>=0,e||F(t,4,this.length),u.read(this,t,!0,23,4)},p.prototype.readFloatBE=function(t,e){return t>>>=0,e||F(t,4,this.length),u.read(this,t,!1,23,4)},p.prototype.readDoubleLE=function(t,e){return t>>>=0,e||F(t,8,this.length),u.read(this,t,!0,52,8)},p.prototype.readDoubleBE=function(t,e){return t>>>=0,e||F(t,8,this.length),u.read(this,t,!1,52,8)},p.prototype.writeUintLE=p.prototype.writeUIntLE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||B(this,t,e,r,Math.pow(2,8*r)-1,0);var i=1,a=0;for(this[e]=255&t;++a>>=0,r>>>=0,n||B(this,t,e,r,Math.pow(2,8*r)-1,0);var i=r-1,a=1;for(this[e+i]=255&t;--i>=0&&(a*=256);)this[e+i]=t/a&255;return e+r},p.prototype.writeUint8=p.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,1,255,0),this[e]=255&t,e+1},p.prototype.writeUint16LE=p.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},p.prototype.writeUint16BE=p.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},p.prototype.writeUint32LE=p.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},p.prototype.writeUint32BE=p.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},p.prototype.writeBigUInt64LE=nt((function(t){return N(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,BigInt(0),BigInt("0xffffffffffffffff"))})),p.prototype.writeBigUInt64BE=nt((function(t){return j(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,BigInt(0),BigInt("0xffffffffffffffff"))})),p.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var i=Math.pow(2,8*r-1);B(this,t,e,r,i-1,-i)}var a=0,o=1,s=0;for(this[e]=255&t;++a>0)-s&255;return e+r},p.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var i=Math.pow(2,8*r-1);B(this,t,e,r,i-1,-i)}var a=r-1,o=1,s=0;for(this[e+a]=255&t;--a>=0&&(o*=256);)t<0&&0===s&&0!==this[e+a+1]&&(s=1),this[e+a]=(t/o>>0)-s&255;return e+r},p.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},p.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},p.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},p.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},p.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},p.prototype.writeBigInt64LE=nt((function(t){return N(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),p.prototype.writeBigInt64BE=nt((function(t){return j(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),p.prototype.writeFloatLE=function(t,e,r){return V(this,t,e,!0,r)},p.prototype.writeFloatBE=function(t,e,r){return V(this,t,e,!1,r)},p.prototype.writeDoubleLE=function(t,e,r){return H(this,t,e,!0,r)},p.prototype.writeDoubleBE=function(t,e,r){return H(this,t,e,!1,r)},p.prototype.copy=function(t,e,r,n){if(!p.isBuffer(t))throw new TypeError("argument should be a Buffer");if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(a=e;a=n+4;r-=3)e="_".concat(t.slice(r-3,r)).concat(e);return"".concat(t.slice(0,r)).concat(e)}function Y(t,e,r,n,i,a){if(t>r||t3?0===e||e===BigInt(0)?">= 0".concat(s," and < 2").concat(s," ** ").concat(8*(a+1)).concat(s):">= -(2".concat(s," ** ").concat(8*(a+1)-1).concat(s,") and < 2 ** ")+"".concat(8*(a+1)-1).concat(s):">= ".concat(e).concat(s," and <= ").concat(r).concat(s),new q.ERR_OUT_OF_RANGE("value",o,t)}!function(t,e,r){W(e,"offset"),void 0!==t[e]&&void 0!==t[e+r]||X(e,t.length-(r+1))}(n,i,a)}function W(t,e){if("number"!=typeof t)throw new q.ERR_INVALID_ARG_TYPE(e,"number",t)}function X(t,e,r){if(Math.floor(t)!==t)throw W(t,r),new q.ERR_OUT_OF_RANGE(r||"offset","an integer",t);if(e<0)throw new q.ERR_BUFFER_OUT_OF_BOUNDS;throw new q.ERR_OUT_OF_RANGE(r||"offset",">= ".concat(r?1:0," and <= ").concat(e),t)}G("ERR_BUFFER_OUT_OF_BOUNDS",(function(t){return t?"".concat(t," is outside of buffer bounds"):"Attempt to access memory outside buffer bounds"}),RangeError),G("ERR_INVALID_ARG_TYPE",(function(t,e){return'The "'.concat(t,'" argument must be of type number. Received type ').concat(s(e))}),TypeError),G("ERR_OUT_OF_RANGE",(function(t,e,r){var n='The value of "'.concat(t,'" is out of range.'),i=r;return Number.isInteger(r)&&Math.abs(r)>Math.pow(2,32)?i=Z(String(r)):"bigint"==typeof r&&(i=String(r),(r>Math.pow(BigInt(2),BigInt(32))||r<-Math.pow(BigInt(2),BigInt(32)))&&(i=Z(i)),i+="n"),n+" It must be ".concat(e,". Received ").concat(i)}),RangeError);var J=/[^+/0-9A-Za-z-_]/g;function K(t,e){var r;e=e||1/0;for(var n=t.length,i=null,a=[],o=0;o55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&a.push(239,191,189);continue}if(o+1===n){(e-=3)>-1&&a.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&a.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&a.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;a.push(r)}else if(r<2048){if((e-=2)<0)break;a.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;a.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;a.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return a}function $(t){return l.toByteArray(function(t){if((t=(t=t.split("=")[0]).trim().replace(J,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function Q(t,e,r,n){var i;for(i=0;i=e.length||i>=t.length);++i)e[i+r]=t[i];return i}function tt(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function et(t){return t!=t}var rt=function(){for(var t="0123456789abcdef",e=new Array(256),r=0;r<16;++r)for(var n=16*r,i=0;i<16;++i)e[n+i]=t[r]+t[i];return e}();function nt(t){return"undefined"==typeof BigInt?it:t}function it(){throw new Error("BigInt not supported")}},2321:function(t){"use strict";t.exports=i,t.exports.isMobile=i,t.exports.default=i;var e=/(android|bb\d+|meego).+mobile|armv7l|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series[46]0|samsungbrowser.*mobile|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i,r=/CrOS/,n=/android|ipad|playbook|silk/i;function i(t){t||(t={});var i=t.ua;if(i||"undefined"==typeof navigator||(i=navigator.userAgent),i&&i.headers&&"string"==typeof i.headers["user-agent"]&&(i=i.headers["user-agent"]),"string"!=typeof i)return!1;var a=e.test(i)&&!r.test(i)||!!t.tablet&&n.test(i);return!a&&t.tablet&&t.featureDetect&&navigator&&navigator.maxTouchPoints>1&&-1!==i.indexOf("Macintosh")&&-1!==i.indexOf("Safari")&&(a=!0),a}},3910:function(t,e){"use strict";e.byteLength=function(t){var e=s(t),r=e[0],n=e[1];return 3*(r+n)/4-n},e.toByteArray=function(t){var e,r,a=s(t),o=a[0],l=a[1],u=new i(function(t,e,r){return 3*(e+r)/4-r}(0,o,l)),c=0,f=l>0?o-4:o;for(r=0;r>16&255,u[c++]=e>>8&255,u[c++]=255&e;return 2===l&&(e=n[t.charCodeAt(r)]<<2|n[t.charCodeAt(r+1)]>>4,u[c++]=255&e),1===l&&(e=n[t.charCodeAt(r)]<<10|n[t.charCodeAt(r+1)]<<4|n[t.charCodeAt(r+2)]>>2,u[c++]=e>>8&255,u[c++]=255&e),u},e.fromByteArray=function(t){for(var e,n=t.length,i=n%3,a=[],o=16383,s=0,u=n-i;su?u:s+o));return 1===i?(e=t[n-1],a.push(r[e>>2]+r[e<<4&63]+"==")):2===i&&(e=(t[n-2]<<8)+t[n-1],a.push(r[e>>10]+r[e>>4&63]+r[e<<2&63]+"=")),a.join("")};for(var r=[],n=[],i="undefined"!=typeof Uint8Array?Uint8Array:Array,a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0;o<64;++o)r[o]=a[o],n[a.charCodeAt(o)]=o;function s(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function l(t,e,n){for(var i,a,o=[],s=e;s>18&63]+r[a>>12&63]+r[a>>6&63]+r[63&a]);return o.join("")}n["-".charCodeAt(0)]=62,n["_".charCodeAt(0)]=63},3187:function(t,e){e.read=function(t,e,r,n,i){var a,o,s=8*i-n-1,l=(1<>1,c=-7,f=r?i-1:0,h=r?-1:1,p=t[e+f];for(f+=h,a=p&(1<<-c)-1,p>>=-c,c+=s;c>0;a=256*a+t[e+f],f+=h,c-=8);for(o=a&(1<<-c)-1,a>>=-c,c+=n;c>0;o=256*o+t[e+f],f+=h,c-=8);if(0===a)a=1-u;else{if(a===l)return o?NaN:1/0*(p?-1:1);o+=Math.pow(2,n),a-=u}return(p?-1:1)*o*Math.pow(2,a-n)},e.write=function(t,e,r,n,i,a){var o,s,l,u=8*a-i-1,c=(1<>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:a-1,d=n?1:-1,v=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,o=c):(o=Math.floor(Math.log(e)/Math.LN2),e*(l=Math.pow(2,-o))<1&&(o--,l*=2),(e+=o+f>=1?h/l:h*Math.pow(2,1-f))*l>=2&&(o++,l/=2),o+f>=c?(s=0,o=c):o+f>=1?(s=(e*l-1)*Math.pow(2,i),o+=f):(s=e*Math.pow(2,f-1)*Math.pow(2,i),o=0));i>=8;t[r+p]=255&s,p+=d,s/=256,i-=8);for(o=o<0;t[r+p]=255&o,p+=d,o/=256,u-=8);t[r+p-d]|=128*v}},1152:function(t,e,r){"use strict";t.exports=function(t){var e=(t=t||{}).eye||[0,0,1],r=t.center||[0,0,0],s=t.up||[0,1,0],l=t.distanceLimits||[0,1/0],u=t.mode||"turntable",c=n(),f=i(),h=a();return c.setDistanceLimits(l[0],l[1]),c.lookAt(0,e,r,s),f.setDistanceLimits(l[0],l[1]),f.lookAt(0,e,r,s),h.setDistanceLimits(l[0],l[1]),h.lookAt(0,e,r,s),new o({turntable:c,orbit:f,matrix:h},u)};var n=r(3440),i=r(7774),a=r(9298);function o(t,e){this._controllerNames=Object.keys(t),this._controllerList=this._controllerNames.map((function(e){return t[e]})),this._mode=e,this._active=t[e],this._active||(this._mode="turntable",this._active=t.turntable),this.modes=this._controllerNames,this.computedMatrix=this._active.computedMatrix,this.computedEye=this._active.computedEye,this.computedUp=this._active.computedUp,this.computedCenter=this._active.computedCenter,this.computedRadius=this._active.computedRadius}var s=o.prototype;s.flush=function(t){for(var e=this._controllerList,r=0;r0?u=u.ushln(f):f<0&&(c=c.ushln(-f)),s(u,c)}},234:function(t,e,r){"use strict";var n=r(3218);t.exports=function(t){return Array.isArray(t)&&2===t.length&&n(t[0])&&n(t[1])}},4275:function(t,e,r){"use strict";var n=r(1928);t.exports=function(t){return t.cmp(new n(0))}},9958:function(t,e,r){"use strict";var n=r(4275);t.exports=function(t){var e=t.length,r=t.words,i=0;if(1===e)i=r[0];else if(2===e)i=r[0]+67108864*r[1];else for(var a=0;a20?52:r+32}},3218:function(t,e,r){"use strict";r(1928),t.exports=function(t){return t&&"object"==typeof t&&Boolean(t.words)}},5514:function(t,e,r){"use strict";var n=r(1928),i=r(8362);t.exports=function(t){var e=i.exponent(t);return e<52?new n(t):new n(t*Math.pow(2,52-e)).ushln(e-52)}},8524:function(t,e,r){"use strict";var n=r(5514),i=r(4275);t.exports=function(t,e){var r=i(t),a=i(e);if(0===r)return[n(0),n(1)];if(0===a)return[n(0),n(0)];a<0&&(t=t.neg(),e=e.neg());var o=t.gcd(e);return o.cmpn(1)?[t.div(o),e.div(o)]:[t,e]}},2813:function(t,e,r){"use strict";var n=r(1928);t.exports=function(t){return new n(t)}},3962:function(t,e,r){"use strict";var n=r(8524);t.exports=function(t,e){return n(t[0].mul(e[0]),t[1].mul(e[1]))}},4951:function(t,e,r){"use strict";var n=r(4275);t.exports=function(t){return n(t[0])*n(t[1])}},4354:function(t,e,r){"use strict";var n=r(8524);t.exports=function(t,e){return n(t[0].mul(e[1]).sub(t[1].mul(e[0])),t[1].mul(e[1]))}},7999:function(t,e,r){"use strict";var n=r(9958),i=r(1112);t.exports=function(t){var e=t[0],r=t[1];if(0===e.cmpn(0))return 0;var a=e.abs().divmod(r.abs()),o=a.div,s=n(o),l=a.mod,u=e.negative!==r.negative?-1:1;if(0===l.cmpn(0))return u*s;if(s){var c=i(s)+4;return u*(s+(h=n(l.ushln(c).divRound(r)))*Math.pow(2,-c))}var f=r.bitLength()-l.bitLength()+53,h=n(l.ushln(f).divRound(r));return f<1023?u*h*Math.pow(2,-f):u*(h*=Math.pow(2,-1023))*Math.pow(2,1023-f)}},5070:function(t){"use strict";function e(t,e,r,n,i){for(var a=i+1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)>=0?(a=o,i=o-1):n=o+1}return a}function r(t,e,r,n,i){for(var a=i+1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)>0?(a=o,i=o-1):n=o+1}return a}function n(t,e,r,n,i){for(var a=n-1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)<0?(a=o,n=o+1):i=o-1}return a}function i(t,e,r,n,i){for(var a=n-1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)<=0?(a=o,n=o+1):i=o-1}return a}function a(t,e,r,n,i){for(;n<=i;){var a=n+i>>>1,o=t[a],s=void 0!==r?r(o,e):o-e;if(0===s)return a;s<=0?n=a+1:i=a-1}return-1}function o(t,e,r,n,i,a){return"function"==typeof r?a(t,e,r,void 0===n?0:0|n,void 0===i?t.length-1:0|i):a(t,e,void 0,void 0===r?0:0|r,void 0===n?t.length-1:0|n)}t.exports={ge:function(t,r,n,i,a){return o(t,r,n,i,a,e)},gt:function(t,e,n,i,a){return o(t,e,n,i,a,r)},lt:function(t,e,r,i,a){return o(t,e,r,i,a,n)},le:function(t,e,r,n,a){return o(t,e,r,n,a,i)},eq:function(t,e,r,n,i){return o(t,e,r,n,i,a)}}},2288:function(t,e){"use strict";function r(t){var e=32;return(t&=-t)&&e--,65535&t&&(e-=16),16711935&t&&(e-=8),252645135&t&&(e-=4),858993459&t&&(e-=2),1431655765&t&&(e-=1),e}e.INT_BITS=32,e.INT_MAX=2147483647,e.INT_MIN=-1<<31,e.sign=function(t){return(t>0)-(t<0)},e.abs=function(t){var e=t>>31;return(t^e)-e},e.min=function(t,e){return e^(t^e)&-(t65535)<<4,e|=r=((t>>>=e)>255)<<3,e|=r=((t>>>=r)>15)<<2,(e|=r=((t>>>=r)>3)<<1)|(t>>>=r)>>1},e.log10=function(t){return t>=1e9?9:t>=1e8?8:t>=1e7?7:t>=1e6?6:t>=1e5?5:t>=1e4?4:t>=1e3?3:t>=100?2:t>=10?1:0},e.popCount=function(t){return 16843009*((t=(858993459&(t-=t>>>1&1431655765))+(t>>>2&858993459))+(t>>>4)&252645135)>>>24},e.countTrailingZeros=r,e.nextPow2=function(t){return t+=0===t,--t,t|=t>>>1,t|=t>>>2,t|=t>>>4,1+((t|=t>>>8)|t>>>16)},e.prevPow2=function(t){return t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,(t|=t>>>16)-(t>>>1)},e.parity=function(t){return t^=t>>>16,t^=t>>>8,t^=t>>>4,27030>>>(t&=15)&1};var n=new Array(256);!function(t){for(var e=0;e<256;++e){var r=e,n=e,i=7;for(r>>>=1;r;r>>>=1)n<<=1,n|=1&r,--i;t[e]=n<>>8&255]<<16|n[t>>>16&255]<<8|n[t>>>24&255]},e.interleave2=function(t,e){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t&=65535)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e&=65535)|e<<8))|e<<4))|e<<2))|e<<1))<<1},e.deinterleave2=function(t,e){return(t=65535&((t=16711935&((t=252645135&((t=858993459&((t=t>>>e&1431655765)|t>>>1))|t>>>2))|t>>>4))|t>>>16))<<16>>16},e.interleave3=function(t,e,r){return t=1227133513&((t=3272356035&((t=251719695&((t=4278190335&((t&=1023)|t<<16))|t<<8))|t<<4))|t<<2),(t|=(e=1227133513&((e=3272356035&((e=251719695&((e=4278190335&((e&=1023)|e<<16))|e<<8))|e<<4))|e<<2))<<1)|(r=1227133513&((r=3272356035&((r=251719695&((r=4278190335&((r&=1023)|r<<16))|r<<8))|r<<4))|r<<2))<<2},e.deinterleave3=function(t,e){return(t=1023&((t=4278190335&((t=251719695&((t=3272356035&((t=t>>>e&1227133513)|t>>>2))|t>>>4))|t>>>8))|t>>>16))<<22>>22},e.nextCombination=function(t){var e=t|t-1;return e+1|(~e&-~e)-1>>>r(t)+1}},1928:function(t,e,r){!function(t,e){"use strict";function n(t,e){if(!t)throw new Error(e||"Assertion failed")}function i(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}function a(t,e,r){if(a.isBN(t))return t;this.negative=0,this.words=null,this.length=0,this.red=null,null!==t&&("le"!==e&&"be"!==e||(r=e,e=10),this._init(t||0,e||10,r||"be"))}var o;"object"==typeof t?t.exports=a:e.BN=a,a.BN=a,a.wordSize=26;try{o="undefined"!=typeof window&&void 0!==window.Buffer?window.Buffer:r(6601).Buffer}catch(t){}function s(t,e){var r=t.charCodeAt(e);return r>=65&&r<=70?r-55:r>=97&&r<=102?r-87:r-48&15}function l(t,e,r){var n=s(t,r);return r-1>=e&&(n|=s(t,r-1)<<4),n}function u(t,e,r,n){for(var i=0,a=Math.min(t.length,r),o=e;o=49?s-49+10:s>=17?s-17+10:s}return i}a.isBN=function(t){return t instanceof a||null!==t&&"object"==typeof t&&t.constructor.wordSize===a.wordSize&&Array.isArray(t.words)},a.max=function(t,e){return t.cmp(e)>0?t:e},a.min=function(t,e){return t.cmp(e)<0?t:e},a.prototype._init=function(t,e,r){if("number"==typeof t)return this._initNumber(t,e,r);if("object"==typeof t)return this._initArray(t,e,r);"hex"===e&&(e=16),n(e===(0|e)&&e>=2&&e<=36);var i=0;"-"===(t=t.toString().replace(/\s+/g,""))[0]&&(i++,this.negative=1),i=0;i-=3)o=t[i]|t[i-1]<<8|t[i-2]<<16,this.words[a]|=o<>>26-s&67108863,(s+=24)>=26&&(s-=26,a++);else if("le"===r)for(i=0,a=0;i>>26-s&67108863,(s+=24)>=26&&(s-=26,a++);return this.strip()},a.prototype._parseHex=function(t,e,r){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var n=0;n=e;n-=2)i=l(t,e,n)<=18?(a-=18,o+=1,this.words[o]|=i>>>26):a+=8;else for(n=(t.length-e)%2==0?e+1:e;n=18?(a-=18,o+=1,this.words[o]|=i>>>26):a+=8;this.strip()},a.prototype._parseBase=function(t,e,r){this.words=[0],this.length=1;for(var n=0,i=1;i<=67108863;i*=e)n++;n--,i=i/e|0;for(var a=t.length-r,o=a%n,s=Math.min(a,a-o)+r,l=0,c=r;c1&&0===this.words[this.length-1];)this.length--;return this._normSign()},a.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},a.prototype.inspect=function(){return(this.red?""};var c=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],f=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],h=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function p(t,e,r){r.negative=e.negative^t.negative;var n=t.length+e.length|0;r.length=n,n=n-1|0;var i=0|t.words[0],a=0|e.words[0],o=i*a,s=67108863&o,l=o/67108864|0;r.words[0]=s;for(var u=1;u>>26,f=67108863&l,h=Math.min(u,e.length-1),p=Math.max(0,u-t.length+1);p<=h;p++){var d=u-p|0;c+=(o=(i=0|t.words[d])*(a=0|e.words[p])+f)/67108864|0,f=67108863&o}r.words[u]=0|f,l=0|c}return 0!==l?r.words[u]=0|l:r.length--,r.strip()}a.prototype.toString=function(t,e){var r;if(e=0|e||1,16===(t=t||10)||"hex"===t){r="";for(var i=0,a=0,o=0;o>>24-i&16777215)||o!==this.length-1?c[6-l.length]+l+r:l+r,(i+=2)>=26&&(i-=26,o--)}for(0!==a&&(r=a.toString(16)+r);r.length%e!=0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}if(t===(0|t)&&t>=2&&t<=36){var u=f[t],p=h[t];r="";var d=this.clone();for(d.negative=0;!d.isZero();){var v=d.modn(p).toString(t);r=(d=d.idivn(p)).isZero()?v+r:c[u-v.length]+v+r}for(this.isZero()&&(r="0"+r);r.length%e!=0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}n(!1,"Base should be between 2 and 36")},a.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&n(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},a.prototype.toJSON=function(){return this.toString(16)},a.prototype.toBuffer=function(t,e){return n(void 0!==o),this.toArrayLike(o,t,e)},a.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},a.prototype.toArrayLike=function(t,e,r){var i=this.byteLength(),a=r||Math.max(1,i);n(i<=a,"byte array longer than desired length"),n(a>0,"Requested array length <= 0"),this.strip();var o,s,l="le"===e,u=new t(a),c=this.clone();if(l){for(s=0;!c.isZero();s++)o=c.andln(255),c.iushrn(8),u[s]=o;for(;s=4096&&(r+=13,e>>>=13),e>=64&&(r+=7,e>>>=7),e>=8&&(r+=4,e>>>=4),e>=2&&(r+=2,e>>>=2),r+e},a.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,r=0;return 0==(8191&e)&&(r+=13,e>>>=13),0==(127&e)&&(r+=7,e>>>=7),0==(15&e)&&(r+=4,e>>>=4),0==(3&e)&&(r+=2,e>>>=2),0==(1&e)&&r++,r},a.prototype.bitLength=function(){var t=this.words[this.length-1],e=this._countBits(t);return 26*(this.length-1)+e},a.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;et.length?this.clone().ior(t):t.clone().ior(this)},a.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},a.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var r=0;rt.length?this.clone().iand(t):t.clone().iand(this)},a.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},a.prototype.iuxor=function(t){var e,r;this.length>t.length?(e=this,r=t):(e=t,r=this);for(var n=0;nt.length?this.clone().ixor(t):t.clone().ixor(this)},a.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},a.prototype.inotn=function(t){n("number"==typeof t&&t>=0);var e=0|Math.ceil(t/26),r=t%26;this._expand(e),r>0&&e--;for(var i=0;i0&&(this.words[i]=~this.words[i]&67108863>>26-r),this.strip()},a.prototype.notn=function(t){return this.clone().inotn(t)},a.prototype.setn=function(t,e){n("number"==typeof t&&t>=0);var r=t/26|0,i=t%26;return this._expand(r+1),this.words[r]=e?this.words[r]|1<t.length?(r=this,n=t):(r=t,n=this);for(var i=0,a=0;a>>26;for(;0!==i&&a>>26;if(this.length=r.length,0!==i)this.words[this.length]=i,this.length++;else if(r!==this)for(;at.length?this.clone().iadd(t):t.clone().iadd(this)},a.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r,n,i=this.cmp(t);if(0===i)return this.negative=0,this.length=1,this.words[0]=0,this;i>0?(r=this,n=t):(r=t,n=this);for(var a=0,o=0;o>26,this.words[o]=67108863&e;for(;0!==a&&o>26,this.words[o]=67108863&e;if(0===a&&o>>13,p=0|o[1],d=8191&p,v=p>>>13,g=0|o[2],y=8191&g,m=g>>>13,x=0|o[3],b=8191&x,_=x>>>13,w=0|o[4],T=8191&w,k=w>>>13,A=0|o[5],M=8191&A,S=A>>>13,E=0|o[6],L=8191&E,C=E>>>13,P=0|o[7],O=8191&P,I=P>>>13,D=0|o[8],z=8191&D,R=D>>>13,F=0|o[9],B=8191&F,N=F>>>13,j=0|s[0],U=8191&j,V=j>>>13,H=0|s[1],q=8191&H,G=H>>>13,Z=0|s[2],Y=8191&Z,W=Z>>>13,X=0|s[3],J=8191&X,K=X>>>13,$=0|s[4],Q=8191&$,tt=$>>>13,et=0|s[5],rt=8191&et,nt=et>>>13,it=0|s[6],at=8191&it,ot=it>>>13,st=0|s[7],lt=8191&st,ut=st>>>13,ct=0|s[8],ft=8191&ct,ht=ct>>>13,pt=0|s[9],dt=8191&pt,vt=pt>>>13;r.negative=t.negative^e.negative,r.length=19;var gt=(u+(n=Math.imul(f,U))|0)+((8191&(i=(i=Math.imul(f,V))+Math.imul(h,U)|0))<<13)|0;u=((a=Math.imul(h,V))+(i>>>13)|0)+(gt>>>26)|0,gt&=67108863,n=Math.imul(d,U),i=(i=Math.imul(d,V))+Math.imul(v,U)|0,a=Math.imul(v,V);var yt=(u+(n=n+Math.imul(f,q)|0)|0)+((8191&(i=(i=i+Math.imul(f,G)|0)+Math.imul(h,q)|0))<<13)|0;u=((a=a+Math.imul(h,G)|0)+(i>>>13)|0)+(yt>>>26)|0,yt&=67108863,n=Math.imul(y,U),i=(i=Math.imul(y,V))+Math.imul(m,U)|0,a=Math.imul(m,V),n=n+Math.imul(d,q)|0,i=(i=i+Math.imul(d,G)|0)+Math.imul(v,q)|0,a=a+Math.imul(v,G)|0;var mt=(u+(n=n+Math.imul(f,Y)|0)|0)+((8191&(i=(i=i+Math.imul(f,W)|0)+Math.imul(h,Y)|0))<<13)|0;u=((a=a+Math.imul(h,W)|0)+(i>>>13)|0)+(mt>>>26)|0,mt&=67108863,n=Math.imul(b,U),i=(i=Math.imul(b,V))+Math.imul(_,U)|0,a=Math.imul(_,V),n=n+Math.imul(y,q)|0,i=(i=i+Math.imul(y,G)|0)+Math.imul(m,q)|0,a=a+Math.imul(m,G)|0,n=n+Math.imul(d,Y)|0,i=(i=i+Math.imul(d,W)|0)+Math.imul(v,Y)|0,a=a+Math.imul(v,W)|0;var xt=(u+(n=n+Math.imul(f,J)|0)|0)+((8191&(i=(i=i+Math.imul(f,K)|0)+Math.imul(h,J)|0))<<13)|0;u=((a=a+Math.imul(h,K)|0)+(i>>>13)|0)+(xt>>>26)|0,xt&=67108863,n=Math.imul(T,U),i=(i=Math.imul(T,V))+Math.imul(k,U)|0,a=Math.imul(k,V),n=n+Math.imul(b,q)|0,i=(i=i+Math.imul(b,G)|0)+Math.imul(_,q)|0,a=a+Math.imul(_,G)|0,n=n+Math.imul(y,Y)|0,i=(i=i+Math.imul(y,W)|0)+Math.imul(m,Y)|0,a=a+Math.imul(m,W)|0,n=n+Math.imul(d,J)|0,i=(i=i+Math.imul(d,K)|0)+Math.imul(v,J)|0,a=a+Math.imul(v,K)|0;var bt=(u+(n=n+Math.imul(f,Q)|0)|0)+((8191&(i=(i=i+Math.imul(f,tt)|0)+Math.imul(h,Q)|0))<<13)|0;u=((a=a+Math.imul(h,tt)|0)+(i>>>13)|0)+(bt>>>26)|0,bt&=67108863,n=Math.imul(M,U),i=(i=Math.imul(M,V))+Math.imul(S,U)|0,a=Math.imul(S,V),n=n+Math.imul(T,q)|0,i=(i=i+Math.imul(T,G)|0)+Math.imul(k,q)|0,a=a+Math.imul(k,G)|0,n=n+Math.imul(b,Y)|0,i=(i=i+Math.imul(b,W)|0)+Math.imul(_,Y)|0,a=a+Math.imul(_,W)|0,n=n+Math.imul(y,J)|0,i=(i=i+Math.imul(y,K)|0)+Math.imul(m,J)|0,a=a+Math.imul(m,K)|0,n=n+Math.imul(d,Q)|0,i=(i=i+Math.imul(d,tt)|0)+Math.imul(v,Q)|0,a=a+Math.imul(v,tt)|0;var _t=(u+(n=n+Math.imul(f,rt)|0)|0)+((8191&(i=(i=i+Math.imul(f,nt)|0)+Math.imul(h,rt)|0))<<13)|0;u=((a=a+Math.imul(h,nt)|0)+(i>>>13)|0)+(_t>>>26)|0,_t&=67108863,n=Math.imul(L,U),i=(i=Math.imul(L,V))+Math.imul(C,U)|0,a=Math.imul(C,V),n=n+Math.imul(M,q)|0,i=(i=i+Math.imul(M,G)|0)+Math.imul(S,q)|0,a=a+Math.imul(S,G)|0,n=n+Math.imul(T,Y)|0,i=(i=i+Math.imul(T,W)|0)+Math.imul(k,Y)|0,a=a+Math.imul(k,W)|0,n=n+Math.imul(b,J)|0,i=(i=i+Math.imul(b,K)|0)+Math.imul(_,J)|0,a=a+Math.imul(_,K)|0,n=n+Math.imul(y,Q)|0,i=(i=i+Math.imul(y,tt)|0)+Math.imul(m,Q)|0,a=a+Math.imul(m,tt)|0,n=n+Math.imul(d,rt)|0,i=(i=i+Math.imul(d,nt)|0)+Math.imul(v,rt)|0,a=a+Math.imul(v,nt)|0;var wt=(u+(n=n+Math.imul(f,at)|0)|0)+((8191&(i=(i=i+Math.imul(f,ot)|0)+Math.imul(h,at)|0))<<13)|0;u=((a=a+Math.imul(h,ot)|0)+(i>>>13)|0)+(wt>>>26)|0,wt&=67108863,n=Math.imul(O,U),i=(i=Math.imul(O,V))+Math.imul(I,U)|0,a=Math.imul(I,V),n=n+Math.imul(L,q)|0,i=(i=i+Math.imul(L,G)|0)+Math.imul(C,q)|0,a=a+Math.imul(C,G)|0,n=n+Math.imul(M,Y)|0,i=(i=i+Math.imul(M,W)|0)+Math.imul(S,Y)|0,a=a+Math.imul(S,W)|0,n=n+Math.imul(T,J)|0,i=(i=i+Math.imul(T,K)|0)+Math.imul(k,J)|0,a=a+Math.imul(k,K)|0,n=n+Math.imul(b,Q)|0,i=(i=i+Math.imul(b,tt)|0)+Math.imul(_,Q)|0,a=a+Math.imul(_,tt)|0,n=n+Math.imul(y,rt)|0,i=(i=i+Math.imul(y,nt)|0)+Math.imul(m,rt)|0,a=a+Math.imul(m,nt)|0,n=n+Math.imul(d,at)|0,i=(i=i+Math.imul(d,ot)|0)+Math.imul(v,at)|0,a=a+Math.imul(v,ot)|0;var Tt=(u+(n=n+Math.imul(f,lt)|0)|0)+((8191&(i=(i=i+Math.imul(f,ut)|0)+Math.imul(h,lt)|0))<<13)|0;u=((a=a+Math.imul(h,ut)|0)+(i>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,n=Math.imul(z,U),i=(i=Math.imul(z,V))+Math.imul(R,U)|0,a=Math.imul(R,V),n=n+Math.imul(O,q)|0,i=(i=i+Math.imul(O,G)|0)+Math.imul(I,q)|0,a=a+Math.imul(I,G)|0,n=n+Math.imul(L,Y)|0,i=(i=i+Math.imul(L,W)|0)+Math.imul(C,Y)|0,a=a+Math.imul(C,W)|0,n=n+Math.imul(M,J)|0,i=(i=i+Math.imul(M,K)|0)+Math.imul(S,J)|0,a=a+Math.imul(S,K)|0,n=n+Math.imul(T,Q)|0,i=(i=i+Math.imul(T,tt)|0)+Math.imul(k,Q)|0,a=a+Math.imul(k,tt)|0,n=n+Math.imul(b,rt)|0,i=(i=i+Math.imul(b,nt)|0)+Math.imul(_,rt)|0,a=a+Math.imul(_,nt)|0,n=n+Math.imul(y,at)|0,i=(i=i+Math.imul(y,ot)|0)+Math.imul(m,at)|0,a=a+Math.imul(m,ot)|0,n=n+Math.imul(d,lt)|0,i=(i=i+Math.imul(d,ut)|0)+Math.imul(v,lt)|0,a=a+Math.imul(v,ut)|0;var kt=(u+(n=n+Math.imul(f,ft)|0)|0)+((8191&(i=(i=i+Math.imul(f,ht)|0)+Math.imul(h,ft)|0))<<13)|0;u=((a=a+Math.imul(h,ht)|0)+(i>>>13)|0)+(kt>>>26)|0,kt&=67108863,n=Math.imul(B,U),i=(i=Math.imul(B,V))+Math.imul(N,U)|0,a=Math.imul(N,V),n=n+Math.imul(z,q)|0,i=(i=i+Math.imul(z,G)|0)+Math.imul(R,q)|0,a=a+Math.imul(R,G)|0,n=n+Math.imul(O,Y)|0,i=(i=i+Math.imul(O,W)|0)+Math.imul(I,Y)|0,a=a+Math.imul(I,W)|0,n=n+Math.imul(L,J)|0,i=(i=i+Math.imul(L,K)|0)+Math.imul(C,J)|0,a=a+Math.imul(C,K)|0,n=n+Math.imul(M,Q)|0,i=(i=i+Math.imul(M,tt)|0)+Math.imul(S,Q)|0,a=a+Math.imul(S,tt)|0,n=n+Math.imul(T,rt)|0,i=(i=i+Math.imul(T,nt)|0)+Math.imul(k,rt)|0,a=a+Math.imul(k,nt)|0,n=n+Math.imul(b,at)|0,i=(i=i+Math.imul(b,ot)|0)+Math.imul(_,at)|0,a=a+Math.imul(_,ot)|0,n=n+Math.imul(y,lt)|0,i=(i=i+Math.imul(y,ut)|0)+Math.imul(m,lt)|0,a=a+Math.imul(m,ut)|0,n=n+Math.imul(d,ft)|0,i=(i=i+Math.imul(d,ht)|0)+Math.imul(v,ft)|0,a=a+Math.imul(v,ht)|0;var At=(u+(n=n+Math.imul(f,dt)|0)|0)+((8191&(i=(i=i+Math.imul(f,vt)|0)+Math.imul(h,dt)|0))<<13)|0;u=((a=a+Math.imul(h,vt)|0)+(i>>>13)|0)+(At>>>26)|0,At&=67108863,n=Math.imul(B,q),i=(i=Math.imul(B,G))+Math.imul(N,q)|0,a=Math.imul(N,G),n=n+Math.imul(z,Y)|0,i=(i=i+Math.imul(z,W)|0)+Math.imul(R,Y)|0,a=a+Math.imul(R,W)|0,n=n+Math.imul(O,J)|0,i=(i=i+Math.imul(O,K)|0)+Math.imul(I,J)|0,a=a+Math.imul(I,K)|0,n=n+Math.imul(L,Q)|0,i=(i=i+Math.imul(L,tt)|0)+Math.imul(C,Q)|0,a=a+Math.imul(C,tt)|0,n=n+Math.imul(M,rt)|0,i=(i=i+Math.imul(M,nt)|0)+Math.imul(S,rt)|0,a=a+Math.imul(S,nt)|0,n=n+Math.imul(T,at)|0,i=(i=i+Math.imul(T,ot)|0)+Math.imul(k,at)|0,a=a+Math.imul(k,ot)|0,n=n+Math.imul(b,lt)|0,i=(i=i+Math.imul(b,ut)|0)+Math.imul(_,lt)|0,a=a+Math.imul(_,ut)|0,n=n+Math.imul(y,ft)|0,i=(i=i+Math.imul(y,ht)|0)+Math.imul(m,ft)|0,a=a+Math.imul(m,ht)|0;var Mt=(u+(n=n+Math.imul(d,dt)|0)|0)+((8191&(i=(i=i+Math.imul(d,vt)|0)+Math.imul(v,dt)|0))<<13)|0;u=((a=a+Math.imul(v,vt)|0)+(i>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,n=Math.imul(B,Y),i=(i=Math.imul(B,W))+Math.imul(N,Y)|0,a=Math.imul(N,W),n=n+Math.imul(z,J)|0,i=(i=i+Math.imul(z,K)|0)+Math.imul(R,J)|0,a=a+Math.imul(R,K)|0,n=n+Math.imul(O,Q)|0,i=(i=i+Math.imul(O,tt)|0)+Math.imul(I,Q)|0,a=a+Math.imul(I,tt)|0,n=n+Math.imul(L,rt)|0,i=(i=i+Math.imul(L,nt)|0)+Math.imul(C,rt)|0,a=a+Math.imul(C,nt)|0,n=n+Math.imul(M,at)|0,i=(i=i+Math.imul(M,ot)|0)+Math.imul(S,at)|0,a=a+Math.imul(S,ot)|0,n=n+Math.imul(T,lt)|0,i=(i=i+Math.imul(T,ut)|0)+Math.imul(k,lt)|0,a=a+Math.imul(k,ut)|0,n=n+Math.imul(b,ft)|0,i=(i=i+Math.imul(b,ht)|0)+Math.imul(_,ft)|0,a=a+Math.imul(_,ht)|0;var St=(u+(n=n+Math.imul(y,dt)|0)|0)+((8191&(i=(i=i+Math.imul(y,vt)|0)+Math.imul(m,dt)|0))<<13)|0;u=((a=a+Math.imul(m,vt)|0)+(i>>>13)|0)+(St>>>26)|0,St&=67108863,n=Math.imul(B,J),i=(i=Math.imul(B,K))+Math.imul(N,J)|0,a=Math.imul(N,K),n=n+Math.imul(z,Q)|0,i=(i=i+Math.imul(z,tt)|0)+Math.imul(R,Q)|0,a=a+Math.imul(R,tt)|0,n=n+Math.imul(O,rt)|0,i=(i=i+Math.imul(O,nt)|0)+Math.imul(I,rt)|0,a=a+Math.imul(I,nt)|0,n=n+Math.imul(L,at)|0,i=(i=i+Math.imul(L,ot)|0)+Math.imul(C,at)|0,a=a+Math.imul(C,ot)|0,n=n+Math.imul(M,lt)|0,i=(i=i+Math.imul(M,ut)|0)+Math.imul(S,lt)|0,a=a+Math.imul(S,ut)|0,n=n+Math.imul(T,ft)|0,i=(i=i+Math.imul(T,ht)|0)+Math.imul(k,ft)|0,a=a+Math.imul(k,ht)|0;var Et=(u+(n=n+Math.imul(b,dt)|0)|0)+((8191&(i=(i=i+Math.imul(b,vt)|0)+Math.imul(_,dt)|0))<<13)|0;u=((a=a+Math.imul(_,vt)|0)+(i>>>13)|0)+(Et>>>26)|0,Et&=67108863,n=Math.imul(B,Q),i=(i=Math.imul(B,tt))+Math.imul(N,Q)|0,a=Math.imul(N,tt),n=n+Math.imul(z,rt)|0,i=(i=i+Math.imul(z,nt)|0)+Math.imul(R,rt)|0,a=a+Math.imul(R,nt)|0,n=n+Math.imul(O,at)|0,i=(i=i+Math.imul(O,ot)|0)+Math.imul(I,at)|0,a=a+Math.imul(I,ot)|0,n=n+Math.imul(L,lt)|0,i=(i=i+Math.imul(L,ut)|0)+Math.imul(C,lt)|0,a=a+Math.imul(C,ut)|0,n=n+Math.imul(M,ft)|0,i=(i=i+Math.imul(M,ht)|0)+Math.imul(S,ft)|0,a=a+Math.imul(S,ht)|0;var Lt=(u+(n=n+Math.imul(T,dt)|0)|0)+((8191&(i=(i=i+Math.imul(T,vt)|0)+Math.imul(k,dt)|0))<<13)|0;u=((a=a+Math.imul(k,vt)|0)+(i>>>13)|0)+(Lt>>>26)|0,Lt&=67108863,n=Math.imul(B,rt),i=(i=Math.imul(B,nt))+Math.imul(N,rt)|0,a=Math.imul(N,nt),n=n+Math.imul(z,at)|0,i=(i=i+Math.imul(z,ot)|0)+Math.imul(R,at)|0,a=a+Math.imul(R,ot)|0,n=n+Math.imul(O,lt)|0,i=(i=i+Math.imul(O,ut)|0)+Math.imul(I,lt)|0,a=a+Math.imul(I,ut)|0,n=n+Math.imul(L,ft)|0,i=(i=i+Math.imul(L,ht)|0)+Math.imul(C,ft)|0,a=a+Math.imul(C,ht)|0;var Ct=(u+(n=n+Math.imul(M,dt)|0)|0)+((8191&(i=(i=i+Math.imul(M,vt)|0)+Math.imul(S,dt)|0))<<13)|0;u=((a=a+Math.imul(S,vt)|0)+(i>>>13)|0)+(Ct>>>26)|0,Ct&=67108863,n=Math.imul(B,at),i=(i=Math.imul(B,ot))+Math.imul(N,at)|0,a=Math.imul(N,ot),n=n+Math.imul(z,lt)|0,i=(i=i+Math.imul(z,ut)|0)+Math.imul(R,lt)|0,a=a+Math.imul(R,ut)|0,n=n+Math.imul(O,ft)|0,i=(i=i+Math.imul(O,ht)|0)+Math.imul(I,ft)|0,a=a+Math.imul(I,ht)|0;var Pt=(u+(n=n+Math.imul(L,dt)|0)|0)+((8191&(i=(i=i+Math.imul(L,vt)|0)+Math.imul(C,dt)|0))<<13)|0;u=((a=a+Math.imul(C,vt)|0)+(i>>>13)|0)+(Pt>>>26)|0,Pt&=67108863,n=Math.imul(B,lt),i=(i=Math.imul(B,ut))+Math.imul(N,lt)|0,a=Math.imul(N,ut),n=n+Math.imul(z,ft)|0,i=(i=i+Math.imul(z,ht)|0)+Math.imul(R,ft)|0,a=a+Math.imul(R,ht)|0;var Ot=(u+(n=n+Math.imul(O,dt)|0)|0)+((8191&(i=(i=i+Math.imul(O,vt)|0)+Math.imul(I,dt)|0))<<13)|0;u=((a=a+Math.imul(I,vt)|0)+(i>>>13)|0)+(Ot>>>26)|0,Ot&=67108863,n=Math.imul(B,ft),i=(i=Math.imul(B,ht))+Math.imul(N,ft)|0,a=Math.imul(N,ht);var It=(u+(n=n+Math.imul(z,dt)|0)|0)+((8191&(i=(i=i+Math.imul(z,vt)|0)+Math.imul(R,dt)|0))<<13)|0;u=((a=a+Math.imul(R,vt)|0)+(i>>>13)|0)+(It>>>26)|0,It&=67108863;var Dt=(u+(n=Math.imul(B,dt))|0)+((8191&(i=(i=Math.imul(B,vt))+Math.imul(N,dt)|0))<<13)|0;return u=((a=Math.imul(N,vt))+(i>>>13)|0)+(Dt>>>26)|0,Dt&=67108863,l[0]=gt,l[1]=yt,l[2]=mt,l[3]=xt,l[4]=bt,l[5]=_t,l[6]=wt,l[7]=Tt,l[8]=kt,l[9]=At,l[10]=Mt,l[11]=St,l[12]=Et,l[13]=Lt,l[14]=Ct,l[15]=Pt,l[16]=Ot,l[17]=It,l[18]=Dt,0!==u&&(l[19]=u,r.length++),r};function v(t,e,r){return(new g).mulp(t,e,r)}function g(t,e){this.x=t,this.y=e}Math.imul||(d=p),a.prototype.mulTo=function(t,e){var r,n=this.length+t.length;return r=10===this.length&&10===t.length?d(this,t,e):n<63?p(this,t,e):n<1024?function(t,e,r){r.negative=e.negative^t.negative,r.length=t.length+e.length;for(var n=0,i=0,a=0;a>>26)|0)>>>26,o&=67108863}r.words[a]=s,n=o,o=i}return 0!==n?r.words[a]=n:r.length--,r.strip()}(this,t,e):v(this,t,e),r},g.prototype.makeRBT=function(t){for(var e=new Array(t),r=a.prototype._countBits(t)-1,n=0;n>=1;return n},g.prototype.permute=function(t,e,r,n,i,a){for(var o=0;o>>=1)i++;return 1<>>=13,r[2*o+1]=8191&a,a>>>=13;for(o=2*e;o>=26,e+=i/67108864|0,e+=a>>>26,this.words[r]=67108863&a}return 0!==e&&(this.words[r]=e,this.length++),this},a.prototype.muln=function(t){return this.clone().imuln(t)},a.prototype.sqr=function(){return this.mul(this)},a.prototype.isqr=function(){return this.imul(this.clone())},a.prototype.pow=function(t){var e=function(t){for(var e=new Array(t.bitLength()),r=0;r>>i}return e}(t);if(0===e.length)return new a(1);for(var r=this,n=0;n=0);var e,r=t%26,i=(t-r)/26,a=67108863>>>26-r<<26-r;if(0!==r){var o=0;for(e=0;e>>26-r}o&&(this.words[e]=o,this.length++)}if(0!==i){for(e=this.length-1;e>=0;e--)this.words[e+i]=this.words[e];for(e=0;e=0),i=e?(e-e%26)/26:0;var a=t%26,o=Math.min((t-a)/26,this.length),s=67108863^67108863>>>a<o)for(this.length-=o,u=0;u=0&&(0!==c||u>=i);u--){var f=0|this.words[u];this.words[u]=c<<26-a|f>>>a,c=f&s}return l&&0!==c&&(l.words[l.length++]=c),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},a.prototype.ishrn=function(t,e,r){return n(0===this.negative),this.iushrn(t,e,r)},a.prototype.shln=function(t){return this.clone().ishln(t)},a.prototype.ushln=function(t){return this.clone().iushln(t)},a.prototype.shrn=function(t){return this.clone().ishrn(t)},a.prototype.ushrn=function(t){return this.clone().iushrn(t)},a.prototype.testn=function(t){n("number"==typeof t&&t>=0);var e=t%26,r=(t-e)/26,i=1<=0);var e=t%26,r=(t-e)/26;if(n(0===this.negative,"imaskn works only with positive numbers"),this.length<=r)return this;if(0!==e&&r++,this.length=Math.min(r,this.length),0!==e){var i=67108863^67108863>>>e<=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},a.prototype.isubn=function(t){if(n("number"==typeof t),n(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e>26)-(l/67108864|0),this.words[i+r]=67108863&a}for(;i>26,this.words[i+r]=67108863&a;if(0===s)return this.strip();for(n(-1===s),s=0,i=0;i>26,this.words[i]=67108863&a;return this.negative=1,this.strip()},a.prototype._wordDiv=function(t,e){var r=(this.length,t.length),n=this.clone(),i=t,o=0|i.words[i.length-1];0!=(r=26-this._countBits(o))&&(i=i.ushln(r),n.iushln(r),o=0|i.words[i.length-1]);var s,l=n.length-i.length;if("mod"!==e){(s=new a(null)).length=l+1,s.words=new Array(s.length);for(var u=0;u=0;f--){var h=67108864*(0|n.words[i.length+f])+(0|n.words[i.length+f-1]);for(h=Math.min(h/o|0,67108863),n._ishlnsubmul(i,h,f);0!==n.negative;)h--,n.negative=0,n._ishlnsubmul(i,1,f),n.isZero()||(n.negative^=1);s&&(s.words[f]=h)}return s&&s.strip(),n.strip(),"div"!==e&&0!==r&&n.iushrn(r),{div:s||null,mod:n}},a.prototype.divmod=function(t,e,r){return n(!t.isZero()),this.isZero()?{div:new a(0),mod:new a(0)}:0!==this.negative&&0===t.negative?(s=this.neg().divmod(t,e),"mod"!==e&&(i=s.div.neg()),"div"!==e&&(o=s.mod.neg(),r&&0!==o.negative&&o.iadd(t)),{div:i,mod:o}):0===this.negative&&0!==t.negative?(s=this.divmod(t.neg(),e),"mod"!==e&&(i=s.div.neg()),{div:i,mod:s.mod}):0!=(this.negative&t.negative)?(s=this.neg().divmod(t.neg(),e),"div"!==e&&(o=s.mod.neg(),r&&0!==o.negative&&o.isub(t)),{div:s.div,mod:o}):t.length>this.length||this.cmp(t)<0?{div:new a(0),mod:this}:1===t.length?"div"===e?{div:this.divn(t.words[0]),mod:null}:"mod"===e?{div:null,mod:new a(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new a(this.modn(t.words[0]))}:this._wordDiv(t,e);var i,o,s},a.prototype.div=function(t){return this.divmod(t,"div",!1).div},a.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},a.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},a.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var r=0!==e.div.negative?e.mod.isub(t):e.mod,n=t.ushrn(1),i=t.andln(1),a=r.cmp(n);return a<0||1===i&&0===a?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},a.prototype.modn=function(t){n(t<=67108863);for(var e=(1<<26)%t,r=0,i=this.length-1;i>=0;i--)r=(e*r+(0|this.words[i]))%t;return r},a.prototype.idivn=function(t){n(t<=67108863);for(var e=0,r=this.length-1;r>=0;r--){var i=(0|this.words[r])+67108864*e;this.words[r]=i/t|0,e=i%t}return this.strip()},a.prototype.divn=function(t){return this.clone().idivn(t)},a.prototype.egcd=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i=new a(1),o=new a(0),s=new a(0),l=new a(1),u=0;e.isEven()&&r.isEven();)e.iushrn(1),r.iushrn(1),++u;for(var c=r.clone(),f=e.clone();!e.isZero();){for(var h=0,p=1;0==(e.words[0]&p)&&h<26;++h,p<<=1);if(h>0)for(e.iushrn(h);h-- >0;)(i.isOdd()||o.isOdd())&&(i.iadd(c),o.isub(f)),i.iushrn(1),o.iushrn(1);for(var d=0,v=1;0==(r.words[0]&v)&&d<26;++d,v<<=1);if(d>0)for(r.iushrn(d);d-- >0;)(s.isOdd()||l.isOdd())&&(s.iadd(c),l.isub(f)),s.iushrn(1),l.iushrn(1);e.cmp(r)>=0?(e.isub(r),i.isub(s),o.isub(l)):(r.isub(e),s.isub(i),l.isub(o))}return{a:s,b:l,gcd:r.iushln(u)}},a.prototype._invmp=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i,o=new a(1),s=new a(0),l=r.clone();e.cmpn(1)>0&&r.cmpn(1)>0;){for(var u=0,c=1;0==(e.words[0]&c)&&u<26;++u,c<<=1);if(u>0)for(e.iushrn(u);u-- >0;)o.isOdd()&&o.iadd(l),o.iushrn(1);for(var f=0,h=1;0==(r.words[0]&h)&&f<26;++f,h<<=1);if(f>0)for(r.iushrn(f);f-- >0;)s.isOdd()&&s.iadd(l),s.iushrn(1);e.cmp(r)>=0?(e.isub(r),o.isub(s)):(r.isub(e),s.isub(o))}return(i=0===e.cmpn(1)?o:s).cmpn(0)<0&&i.iadd(t),i},a.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),r=t.clone();e.negative=0,r.negative=0;for(var n=0;e.isEven()&&r.isEven();n++)e.iushrn(1),r.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;r.isEven();)r.iushrn(1);var i=e.cmp(r);if(i<0){var a=e;e=r,r=a}else if(0===i||0===r.cmpn(1))break;e.isub(r)}return r.iushln(n)},a.prototype.invm=function(t){return this.egcd(t).a.umod(t)},a.prototype.isEven=function(){return 0==(1&this.words[0])},a.prototype.isOdd=function(){return 1==(1&this.words[0])},a.prototype.andln=function(t){return this.words[0]&t},a.prototype.bincn=function(t){n("number"==typeof t);var e=t%26,r=(t-e)/26,i=1<>>26,s&=67108863,this.words[o]=s}return 0!==a&&(this.words[o]=a,this.length++),this},a.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},a.prototype.cmpn=function(t){var e,r=t<0;if(0!==this.negative&&!r)return-1;if(0===this.negative&&r)return 1;if(this.strip(),this.length>1)e=1;else{r&&(t=-t),n(t<=67108863,"Number is too big");var i=0|this.words[0];e=i===t?0:it.length)return 1;if(this.length=0;r--){var n=0|this.words[r],i=0|t.words[r];if(n!==i){ni&&(e=1);break}}return e},a.prototype.gtn=function(t){return 1===this.cmpn(t)},a.prototype.gt=function(t){return 1===this.cmp(t)},a.prototype.gten=function(t){return this.cmpn(t)>=0},a.prototype.gte=function(t){return this.cmp(t)>=0},a.prototype.ltn=function(t){return-1===this.cmpn(t)},a.prototype.lt=function(t){return-1===this.cmp(t)},a.prototype.lten=function(t){return this.cmpn(t)<=0},a.prototype.lte=function(t){return this.cmp(t)<=0},a.prototype.eqn=function(t){return 0===this.cmpn(t)},a.prototype.eq=function(t){return 0===this.cmp(t)},a.red=function(t){return new T(t)},a.prototype.toRed=function(t){return n(!this.red,"Already a number in reduction context"),n(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},a.prototype.fromRed=function(){return n(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},a.prototype._forceRed=function(t){return this.red=t,this},a.prototype.forceRed=function(t){return n(!this.red,"Already a number in reduction context"),this._forceRed(t)},a.prototype.redAdd=function(t){return n(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},a.prototype.redIAdd=function(t){return n(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},a.prototype.redSub=function(t){return n(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},a.prototype.redISub=function(t){return n(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},a.prototype.redShl=function(t){return n(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},a.prototype.redMul=function(t){return n(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},a.prototype.redIMul=function(t){return n(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},a.prototype.redSqr=function(){return n(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},a.prototype.redISqr=function(){return n(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},a.prototype.redSqrt=function(){return n(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},a.prototype.redInvm=function(){return n(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},a.prototype.redNeg=function(){return n(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},a.prototype.redPow=function(t){return n(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var y={k256:null,p224:null,p192:null,p25519:null};function m(t,e){this.name=t,this.p=new a(e,16),this.n=this.p.bitLength(),this.k=new a(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function x(){m.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function b(){m.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function _(){m.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function w(){m.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function T(t){if("string"==typeof t){var e=a._prime(t);this.m=e.p,this.prime=e}else n(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function k(t){T.call(this,t),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new a(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}m.prototype._tmp=function(){var t=new a(null);return t.words=new Array(Math.ceil(this.n/13)),t},m.prototype.ireduce=function(t){var e,r=t;do{this.split(r,this.tmp),e=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(e>this.n);var n=e0?r.isub(this.p):void 0!==r.strip?r.strip():r._strip(),r},m.prototype.split=function(t,e){t.iushrn(this.n,0,e)},m.prototype.imulK=function(t){return t.imul(this.k)},i(x,m),x.prototype.split=function(t,e){for(var r=4194303,n=Math.min(t.length,9),i=0;i>>22,a=o}a>>>=22,t.words[i-10]=a,0===a&&t.length>10?t.length-=10:t.length-=9},x.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,r=0;r>>=26,t.words[r]=i,e=n}return 0!==e&&(t.words[t.length++]=e),t},a._prime=function(t){if(y[t])return y[t];var e;if("k256"===t)e=new x;else if("p224"===t)e=new b;else if("p192"===t)e=new _;else{if("p25519"!==t)throw new Error("Unknown prime "+t);e=new w}return y[t]=e,e},T.prototype._verify1=function(t){n(0===t.negative,"red works only with positives"),n(t.red,"red works only with red numbers")},T.prototype._verify2=function(t,e){n(0==(t.negative|e.negative),"red works only with positives"),n(t.red&&t.red===e.red,"red works only with red numbers")},T.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},T.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},T.prototype.add=function(t,e){this._verify2(t,e);var r=t.add(e);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},T.prototype.iadd=function(t,e){this._verify2(t,e);var r=t.iadd(e);return r.cmp(this.m)>=0&&r.isub(this.m),r},T.prototype.sub=function(t,e){this._verify2(t,e);var r=t.sub(e);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},T.prototype.isub=function(t,e){this._verify2(t,e);var r=t.isub(e);return r.cmpn(0)<0&&r.iadd(this.m),r},T.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},T.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},T.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},T.prototype.isqr=function(t){return this.imul(t,t.clone())},T.prototype.sqr=function(t){return this.mul(t,t)},T.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(n(e%2==1),3===e){var r=this.m.add(new a(1)).iushrn(2);return this.pow(t,r)}for(var i=this.m.subn(1),o=0;!i.isZero()&&0===i.andln(1);)o++,i.iushrn(1);n(!i.isZero());var s=new a(1).toRed(this),l=s.redNeg(),u=this.m.subn(1).iushrn(1),c=this.m.bitLength();for(c=new a(2*c*c).toRed(this);0!==this.pow(c,u).cmp(l);)c.redIAdd(l);for(var f=this.pow(c,i),h=this.pow(t,i.addn(1).iushrn(1)),p=this.pow(t,i),d=o;0!==p.cmp(s);){for(var v=p,g=0;0!==v.cmp(s);g++)v=v.redSqr();n(g=0;n--){for(var u=e.words[n],c=l-1;c>=0;c--){var f=u>>c&1;i!==r[0]&&(i=this.sqr(i)),0!==f||0!==o?(o<<=1,o|=f,(4==++s||0===n&&0===c)&&(i=this.mul(i,r[o]),s=0,o=0)):s=0}l=26}return i},T.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},T.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},a.mont=function(t){return new k(t)},i(k,T),k.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},k.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},k.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),a=i;return i.cmp(this.m)>=0?a=i.isub(this.m):i.cmpn(0)<0&&(a=i.iadd(this.m)),a._forceRed(this)},k.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new a(0)._forceRed(this);var r=t.mul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),o=i;return i.cmp(this.m)>=0?o=i.isub(this.m):i.cmpn(0)<0&&(o=i.iadd(this.m)),o._forceRed(this)},k.prototype.invm=function(t){return this.imod(t._invmp(this.m).mul(this.r2))._forceRed(this)}}(t=r.nmd(t),this)},2692:function(t){"use strict";t.exports=function(t){var e,r,n,i=t.length,a=0;for(e=0;e>>1;if(!(c<=0)){var f,h=i.mallocDouble(2*c*s),p=i.mallocInt32(s);if((s=l(t,c,h,p))>0){if(1===c&&n)a.init(s),f=a.sweepComplete(c,r,0,s,h,p,0,s,h,p);else{var d=i.mallocDouble(2*c*u),v=i.mallocInt32(u);(u=l(e,c,d,v))>0&&(a.init(s+u),f=1===c?a.sweepBipartite(c,r,0,s,h,p,0,u,d,v):o(c,r,n,s,h,p,u,d,v),i.free(d),i.free(v))}i.free(h),i.free(p)}return f}}}function c(t,e){n.push([t,e])}},7333:function(t,e){"use strict";function r(t){return t?function(t,e,r,n,i,a,o,s,l,u,c){return i-n>l-s?function(t,e,r,n,i,a,o,s,l,u,c){for(var f=2*t,h=n,p=f*n;hu-l?n?function(t,e,r,n,i,a,o,s,l,u,c){for(var f=2*t,h=n,p=f*n;h0;){var D=(O-=1)*b,z=w[D],R=w[D+1],F=w[D+2],B=w[D+3],N=w[D+4],j=w[D+5],U=O*_,V=T[U],H=T[U+1],q=1&j,G=!!(16&j),Z=c,Y=S,W=L,X=C;if(q&&(Z=L,Y=C,W=c,X=S),!(2&j&&R>=(F=g(t,z,R,F,Z,Y,H))||4&j&&(R=y(t,z,R,F,Z,Y,V))>=F)){var J=F-R,K=N-B;if(G){if(t*J*(J+K)=p0)&&!(p1>=hi)"),v=c("lo===p0"),g=c("lo>>1,h=2*t,p=f,d=s[h*f+e];u=x?(p=m,d=x):y>=_?(p=g,d=y):(p=b,d=_):x>=_?(p=m,d=x):_>=y?(p=g,d=y):(p=b,d=_);for(var w=h*(c-1),T=h*p,k=0;kr&&i[f+e]>u;--c,f-=o){for(var h=f,p=f+o,d=0;dh;++h,l+=s)if(i[l+f]===o)if(c===h)c+=1,u+=s;else{for(var p=0;s>p;++p){var d=i[l+p];i[l+p]=i[u],i[u++]=d}var v=a[h];a[h]=a[c],a[c++]=v}return c},"loh;++h,l+=s)if(i[l+f]p;++p){var d=i[l+p];i[l+p]=i[u],i[u++]=d}var v=a[h];a[h]=a[c],a[c++]=v}return c},"lo<=p0":function(t,e,r,n,i,a,o){for(var s=2*t,l=s*r,u=l,c=r,f=t+e,h=r;n>h;++h,l+=s)if(i[l+f]<=o)if(c===h)c+=1,u+=s;else{for(var p=0;s>p;++p){var d=i[l+p];i[l+p]=i[u],i[u++]=d}var v=a[h];a[h]=a[c],a[c++]=v}return c},"hi<=p0":function(t,e,r,n,i,a,o){for(var s=2*t,l=s*r,u=l,c=r,f=t+e,h=r;n>h;++h,l+=s)if(i[l+f]<=o)if(c===h)c+=1,u+=s;else{for(var p=0;s>p;++p){var d=i[l+p];i[l+p]=i[u],i[u++]=d}var v=a[h];a[h]=a[c],a[c++]=v}return c},"lop;++p,l+=s){var d=i[l+f],v=i[l+h];if(dg;++g){var y=i[l+g];i[l+g]=i[u],i[u++]=y}var m=a[p];a[p]=a[c],a[c++]=m}}return c},"lo<=p0&&p0<=hi":function(t,e,r,n,i,a,o){for(var s=2*t,l=s*r,u=l,c=r,f=e,h=t+e,p=r;n>p;++p,l+=s){var d=i[l+f],v=i[l+h];if(d<=o&&o<=v)if(c===p)c+=1,u+=s;else{for(var g=0;s>g;++g){var y=i[l+g];i[l+g]=i[u],i[u++]=y}var m=a[p];a[p]=a[c],a[c++]=m}}return c},"!(lo>=p0)&&!(p1>=hi)":function(t,e,r,n,i,a,o,s){for(var l=2*t,u=l*r,c=u,f=r,h=e,p=t+e,d=r;n>d;++d,u+=l){var v=i[u+h],g=i[u+p];if(!(v>=o||s>=g))if(f===d)f+=1,c+=l;else{for(var y=0;l>y;++y){var m=i[u+y];i[u+y]=i[c],i[c++]=m}var x=a[d];a[d]=a[f],a[f++]=x}}return f}}},309:function(t){"use strict";t.exports=function(t,n){n<=4*e?r(0,n-1,t):u(0,n-1,t)};var e=32;function r(t,e,r){for(var n=2*(t+1),i=t+1;i<=e;++i){for(var a=r[n++],o=r[n++],s=i,l=n-2;s-- >t;){var u=r[l-2],c=r[l-1];if(ur[e+1])}function l(t,e,r,n){var i=n[t*=2];return i>1,g=v-h,y=v+h,m=p,x=g,b=v,_=y,w=d,T=t+1,k=c-1,A=0;s(m,x,f)&&(A=m,m=x,x=A),s(_,w,f)&&(A=_,_=w,w=A),s(m,b,f)&&(A=m,m=b,b=A),s(x,b,f)&&(A=x,x=b,b=A),s(m,_,f)&&(A=m,m=_,_=A),s(b,_,f)&&(A=b,b=_,_=A),s(x,w,f)&&(A=x,x=w,w=A),s(x,b,f)&&(A=x,x=b,b=A),s(_,w,f)&&(A=_,_=w,w=A);for(var M=f[2*x],S=f[2*x+1],E=f[2*_],L=f[2*_+1],C=2*m,P=2*b,O=2*w,I=2*p,D=2*v,z=2*d,R=0;R<2;++R){var F=f[C+R],B=f[P+R],N=f[O+R];f[I+R]=F,f[D+R]=B,f[z+R]=N}i(g,t,f),i(y,c,f);for(var j=T;j<=k;++j)if(l(j,M,S,f))j!==T&&n(j,T,f),++T;else if(!l(j,E,L,f))for(;;){if(l(k,E,L,f)){l(k,M,S,f)?(a(j,T,k,f),++T,--k):(n(j,k,f),--k);break}if(--k>>1;a(d,S);var E=0,L=0;for(T=0;T=o)v(c,f,L--,C=C-o|0);else if(C>=0)v(l,u,E--,C);else if(C<=-o){C=-C-o|0;for(var P=0;P>>1;a(d,E);var L=0,C=0,P=0;for(k=0;k>1==d[2*k+3]>>1&&(I=2,k+=1),O<0){for(var D=-(O>>1)-1,z=0;z>1)-1,0===I?v(l,u,L--,D):1===I?v(c,f,C--,D):2===I&&v(h,p,P--,D)}},scanBipartite:function(t,e,r,n,i,s,c,f,h,p,y,m){var x=0,b=2*t,_=e,w=e+t,T=1,k=1;n?k=o:T=o;for(var A=i;A>>1;a(d,L);var C=0;for(A=0;A=o?(O=!n,M-=o):(O=!!n,M-=1),O)g(l,u,C++,M);else{var I=m[M],D=b*M,z=y[D+e+1],R=y[D+e+1+t];t:for(var F=0;F>>1;a(d,T);var k=0;for(x=0;x=o)l[k++]=b-o;else{var M=p[b-=1],S=g*b,E=h[S+e+1],L=h[S+e+1+t];t:for(var C=0;C=0;--C)if(l[C]===b){for(D=C+1;D0;){for(var p=r.pop(),d=(c=-1,f=-1,l=o[s=r.pop()],1);d=0||(e.flip(s,p),i(t,e,r,c,s,f),i(t,e,r,s,f,c),i(t,e,r,f,p,c),i(t,e,r,p,c,f))}}},7098:function(t,e,r){"use strict";var n,i=r(5070);function a(t,e,r,n,i,a,o){this.cells=t,this.neighbor=e,this.flags=n,this.constraint=r,this.active=i,this.next=a,this.boundary=o}function o(t,e){return t[0]-e[0]||t[1]-e[1]||t[2]-e[2]}t.exports=function(t,e,r){var n=function(t,e){for(var r=t.cells(),n=r.length,i=0;i0||l.length>0;){for(;s.length>0;){var p=s.pop();if(u[p]!==-i){u[p]=i,c[p];for(var d=0;d<3;++d){var v=h[3*p+d];v>=0&&0===u[v]&&(f[3*p+d]?l.push(v):(s.push(v),u[v]=i))}}}var g=l;l=s,s=g,l.length=0,i=-i}var y=function(t,e,r){for(var n=0,i=0;i1&&i(r[h[p-2]],r[h[p-1]],a)>0;)t.push([h[p-1],h[p-2],o]),p-=1;h.length=p,h.push(o);var d=f.upperIds;for(p=d.length;p>1&&i(r[d[p-2]],r[d[p-1]],a)<0;)t.push([d[p-2],d[p-1],o]),p-=1;d.length=p,d.push(o)}}function c(t,e){var r;return(r=t.a[0]d[0]&&i.push(new o(d,p,2,l),new o(p,d,1,l))}i.sort(s);for(var v=i[0].a[0]-(1+Math.abs(i[0].a[0]))*Math.pow(2,-52),g=[new a([v,1],[v,0],-1,[],[],[],[])],y=[],m=(l=0,i.length);l=0}}(),a.removeTriangle=function(t,e,r){var n=this.stars;o(n[t],e,r),o(n[e],r,t),o(n[r],t,e)},a.addTriangle=function(t,e,r){var n=this.stars;n[t].push(e,r),n[e].push(r,t),n[r].push(t,e)},a.opposite=function(t,e){for(var r=this.stars[e],n=1,i=r.length;ne[2]?1:0)}function y(t,e,r){if(0!==t.length){if(e)for(var n=0;n=0;--a){var x=e[c=(S=n[a])[0]],b=x[0],_=x[1],w=t[b],T=t[_];if((w[0]-T[0]||w[1]-T[1])<0){var k=b;b=_,_=k}x[0]=b;var A,M=x[1]=S[1];for(i&&(A=x[2]);a>0&&n[a-1][0]===c;){var S,E=(S=n[--a])[1];i?e.push([M,E,A]):e.push([M,E]),M=E}i?e.push([M,_,A]):e.push([M,_])}return h}(t,e,h,v,r),m=d(t,g);return y(e,m,r),!!m||h.length>0||v.length>0}},5528:function(t,e,r){"use strict";t.exports=function(t,e,r,n){var a=s(e,t),f=s(n,r),h=c(a,f);if(0===o(h))return null;var p=c(f,s(t,r)),d=i(p,h),v=u(a,d);return l(t,v)};var n=r(3962),i=r(9189),a=r(4354),o=r(4951),s=r(6695),l=r(7584),u=r(4469);function c(t,e){return a(n(t[0],e[1]),n(t[1],e[0]))}},5692:function(t){t.exports={jet:[{index:0,rgb:[0,0,131]},{index:.125,rgb:[0,60,170]},{index:.375,rgb:[5,255,255]},{index:.625,rgb:[255,255,0]},{index:.875,rgb:[250,0,0]},{index:1,rgb:[128,0,0]}],hsv:[{index:0,rgb:[255,0,0]},{index:.169,rgb:[253,255,2]},{index:.173,rgb:[247,255,2]},{index:.337,rgb:[0,252,4]},{index:.341,rgb:[0,252,10]},{index:.506,rgb:[1,249,255]},{index:.671,rgb:[2,0,253]},{index:.675,rgb:[8,0,253]},{index:.839,rgb:[255,0,251]},{index:.843,rgb:[255,0,245]},{index:1,rgb:[255,0,6]}],hot:[{index:0,rgb:[0,0,0]},{index:.3,rgb:[230,0,0]},{index:.6,rgb:[255,210,0]},{index:1,rgb:[255,255,255]}],spring:[{index:0,rgb:[255,0,255]},{index:1,rgb:[255,255,0]}],summer:[{index:0,rgb:[0,128,102]},{index:1,rgb:[255,255,102]}],autumn:[{index:0,rgb:[255,0,0]},{index:1,rgb:[255,255,0]}],winter:[{index:0,rgb:[0,0,255]},{index:1,rgb:[0,255,128]}],bone:[{index:0,rgb:[0,0,0]},{index:.376,rgb:[84,84,116]},{index:.753,rgb:[169,200,200]},{index:1,rgb:[255,255,255]}],copper:[{index:0,rgb:[0,0,0]},{index:.804,rgb:[255,160,102]},{index:1,rgb:[255,199,127]}],greys:[{index:0,rgb:[0,0,0]},{index:1,rgb:[255,255,255]}],yignbu:[{index:0,rgb:[8,29,88]},{index:.125,rgb:[37,52,148]},{index:.25,rgb:[34,94,168]},{index:.375,rgb:[29,145,192]},{index:.5,rgb:[65,182,196]},{index:.625,rgb:[127,205,187]},{index:.75,rgb:[199,233,180]},{index:.875,rgb:[237,248,217]},{index:1,rgb:[255,255,217]}],greens:[{index:0,rgb:[0,68,27]},{index:.125,rgb:[0,109,44]},{index:.25,rgb:[35,139,69]},{index:.375,rgb:[65,171,93]},{index:.5,rgb:[116,196,118]},{index:.625,rgb:[161,217,155]},{index:.75,rgb:[199,233,192]},{index:.875,rgb:[229,245,224]},{index:1,rgb:[247,252,245]}],yiorrd:[{index:0,rgb:[128,0,38]},{index:.125,rgb:[189,0,38]},{index:.25,rgb:[227,26,28]},{index:.375,rgb:[252,78,42]},{index:.5,rgb:[253,141,60]},{index:.625,rgb:[254,178,76]},{index:.75,rgb:[254,217,118]},{index:.875,rgb:[255,237,160]},{index:1,rgb:[255,255,204]}],bluered:[{index:0,rgb:[0,0,255]},{index:1,rgb:[255,0,0]}],rdbu:[{index:0,rgb:[5,10,172]},{index:.35,rgb:[106,137,247]},{index:.5,rgb:[190,190,190]},{index:.6,rgb:[220,170,132]},{index:.7,rgb:[230,145,90]},{index:1,rgb:[178,10,28]}],picnic:[{index:0,rgb:[0,0,255]},{index:.1,rgb:[51,153,255]},{index:.2,rgb:[102,204,255]},{index:.3,rgb:[153,204,255]},{index:.4,rgb:[204,204,255]},{index:.5,rgb:[255,255,255]},{index:.6,rgb:[255,204,255]},{index:.7,rgb:[255,153,255]},{index:.8,rgb:[255,102,204]},{index:.9,rgb:[255,102,102]},{index:1,rgb:[255,0,0]}],rainbow:[{index:0,rgb:[150,0,90]},{index:.125,rgb:[0,0,200]},{index:.25,rgb:[0,25,255]},{index:.375,rgb:[0,152,255]},{index:.5,rgb:[44,255,150]},{index:.625,rgb:[151,255,0]},{index:.75,rgb:[255,234,0]},{index:.875,rgb:[255,111,0]},{index:1,rgb:[255,0,0]}],portland:[{index:0,rgb:[12,51,131]},{index:.25,rgb:[10,136,186]},{index:.5,rgb:[242,211,56]},{index:.75,rgb:[242,143,56]},{index:1,rgb:[217,30,30]}],blackbody:[{index:0,rgb:[0,0,0]},{index:.2,rgb:[230,0,0]},{index:.4,rgb:[230,210,0]},{index:.7,rgb:[255,255,255]},{index:1,rgb:[160,200,255]}],earth:[{index:0,rgb:[0,0,130]},{index:.1,rgb:[0,180,180]},{index:.2,rgb:[40,210,40]},{index:.4,rgb:[230,230,50]},{index:.6,rgb:[120,70,20]},{index:1,rgb:[255,255,255]}],electric:[{index:0,rgb:[0,0,0]},{index:.15,rgb:[30,0,100]},{index:.4,rgb:[120,0,100]},{index:.6,rgb:[160,90,0]},{index:.8,rgb:[230,200,0]},{index:1,rgb:[255,250,220]}],alpha:[{index:0,rgb:[255,255,255,0]},{index:1,rgb:[255,255,255,1]}],viridis:[{index:0,rgb:[68,1,84]},{index:.13,rgb:[71,44,122]},{index:.25,rgb:[59,81,139]},{index:.38,rgb:[44,113,142]},{index:.5,rgb:[33,144,141]},{index:.63,rgb:[39,173,129]},{index:.75,rgb:[92,200,99]},{index:.88,rgb:[170,220,50]},{index:1,rgb:[253,231,37]}],inferno:[{index:0,rgb:[0,0,4]},{index:.13,rgb:[31,12,72]},{index:.25,rgb:[85,15,109]},{index:.38,rgb:[136,34,106]},{index:.5,rgb:[186,54,85]},{index:.63,rgb:[227,89,51]},{index:.75,rgb:[249,140,10]},{index:.88,rgb:[249,201,50]},{index:1,rgb:[252,255,164]}],magma:[{index:0,rgb:[0,0,4]},{index:.13,rgb:[28,16,68]},{index:.25,rgb:[79,18,123]},{index:.38,rgb:[129,37,129]},{index:.5,rgb:[181,54,122]},{index:.63,rgb:[229,80,100]},{index:.75,rgb:[251,135,97]},{index:.88,rgb:[254,194,135]},{index:1,rgb:[252,253,191]}],plasma:[{index:0,rgb:[13,8,135]},{index:.13,rgb:[75,3,161]},{index:.25,rgb:[125,3,168]},{index:.38,rgb:[168,34,150]},{index:.5,rgb:[203,70,121]},{index:.63,rgb:[229,107,93]},{index:.75,rgb:[248,148,65]},{index:.88,rgb:[253,195,40]},{index:1,rgb:[240,249,33]}],warm:[{index:0,rgb:[125,0,179]},{index:.13,rgb:[172,0,187]},{index:.25,rgb:[219,0,170]},{index:.38,rgb:[255,0,130]},{index:.5,rgb:[255,63,74]},{index:.63,rgb:[255,123,0]},{index:.75,rgb:[234,176,0]},{index:.88,rgb:[190,228,0]},{index:1,rgb:[147,255,0]}],cool:[{index:0,rgb:[125,0,179]},{index:.13,rgb:[116,0,218]},{index:.25,rgb:[98,74,237]},{index:.38,rgb:[68,146,231]},{index:.5,rgb:[0,204,197]},{index:.63,rgb:[0,247,146]},{index:.75,rgb:[0,255,88]},{index:.88,rgb:[40,255,8]},{index:1,rgb:[147,255,0]}],"rainbow-soft":[{index:0,rgb:[125,0,179]},{index:.1,rgb:[199,0,180]},{index:.2,rgb:[255,0,121]},{index:.3,rgb:[255,108,0]},{index:.4,rgb:[222,194,0]},{index:.5,rgb:[150,255,0]},{index:.6,rgb:[0,255,55]},{index:.7,rgb:[0,246,150]},{index:.8,rgb:[50,167,222]},{index:.9,rgb:[103,51,235]},{index:1,rgb:[124,0,186]}],bathymetry:[{index:0,rgb:[40,26,44]},{index:.13,rgb:[59,49,90]},{index:.25,rgb:[64,76,139]},{index:.38,rgb:[63,110,151]},{index:.5,rgb:[72,142,158]},{index:.63,rgb:[85,174,163]},{index:.75,rgb:[120,206,163]},{index:.88,rgb:[187,230,172]},{index:1,rgb:[253,254,204]}],cdom:[{index:0,rgb:[47,15,62]},{index:.13,rgb:[87,23,86]},{index:.25,rgb:[130,28,99]},{index:.38,rgb:[171,41,96]},{index:.5,rgb:[206,67,86]},{index:.63,rgb:[230,106,84]},{index:.75,rgb:[242,149,103]},{index:.88,rgb:[249,193,135]},{index:1,rgb:[254,237,176]}],chlorophyll:[{index:0,rgb:[18,36,20]},{index:.13,rgb:[25,63,41]},{index:.25,rgb:[24,91,59]},{index:.38,rgb:[13,119,72]},{index:.5,rgb:[18,148,80]},{index:.63,rgb:[80,173,89]},{index:.75,rgb:[132,196,122]},{index:.88,rgb:[175,221,162]},{index:1,rgb:[215,249,208]}],density:[{index:0,rgb:[54,14,36]},{index:.13,rgb:[89,23,80]},{index:.25,rgb:[110,45,132]},{index:.38,rgb:[120,77,178]},{index:.5,rgb:[120,113,213]},{index:.63,rgb:[115,151,228]},{index:.75,rgb:[134,185,227]},{index:.88,rgb:[177,214,227]},{index:1,rgb:[230,241,241]}],"freesurface-blue":[{index:0,rgb:[30,4,110]},{index:.13,rgb:[47,14,176]},{index:.25,rgb:[41,45,236]},{index:.38,rgb:[25,99,212]},{index:.5,rgb:[68,131,200]},{index:.63,rgb:[114,156,197]},{index:.75,rgb:[157,181,203]},{index:.88,rgb:[200,208,216]},{index:1,rgb:[241,237,236]}],"freesurface-red":[{index:0,rgb:[60,9,18]},{index:.13,rgb:[100,17,27]},{index:.25,rgb:[142,20,29]},{index:.38,rgb:[177,43,27]},{index:.5,rgb:[192,87,63]},{index:.63,rgb:[205,125,105]},{index:.75,rgb:[216,162,148]},{index:.88,rgb:[227,199,193]},{index:1,rgb:[241,237,236]}],oxygen:[{index:0,rgb:[64,5,5]},{index:.13,rgb:[106,6,15]},{index:.25,rgb:[144,26,7]},{index:.38,rgb:[168,64,3]},{index:.5,rgb:[188,100,4]},{index:.63,rgb:[206,136,11]},{index:.75,rgb:[220,174,25]},{index:.88,rgb:[231,215,44]},{index:1,rgb:[248,254,105]}],par:[{index:0,rgb:[51,20,24]},{index:.13,rgb:[90,32,35]},{index:.25,rgb:[129,44,34]},{index:.38,rgb:[159,68,25]},{index:.5,rgb:[182,99,19]},{index:.63,rgb:[199,134,22]},{index:.75,rgb:[212,171,35]},{index:.88,rgb:[221,210,54]},{index:1,rgb:[225,253,75]}],phase:[{index:0,rgb:[145,105,18]},{index:.13,rgb:[184,71,38]},{index:.25,rgb:[186,58,115]},{index:.38,rgb:[160,71,185]},{index:.5,rgb:[110,97,218]},{index:.63,rgb:[50,123,164]},{index:.75,rgb:[31,131,110]},{index:.88,rgb:[77,129,34]},{index:1,rgb:[145,105,18]}],salinity:[{index:0,rgb:[42,24,108]},{index:.13,rgb:[33,50,162]},{index:.25,rgb:[15,90,145]},{index:.38,rgb:[40,118,137]},{index:.5,rgb:[59,146,135]},{index:.63,rgb:[79,175,126]},{index:.75,rgb:[120,203,104]},{index:.88,rgb:[193,221,100]},{index:1,rgb:[253,239,154]}],temperature:[{index:0,rgb:[4,35,51]},{index:.13,rgb:[23,51,122]},{index:.25,rgb:[85,59,157]},{index:.38,rgb:[129,79,143]},{index:.5,rgb:[175,95,130]},{index:.63,rgb:[222,112,101]},{index:.75,rgb:[249,146,66]},{index:.88,rgb:[249,196,65]},{index:1,rgb:[232,250,91]}],turbidity:[{index:0,rgb:[34,31,27]},{index:.13,rgb:[65,50,41]},{index:.25,rgb:[98,69,52]},{index:.38,rgb:[131,89,57]},{index:.5,rgb:[161,112,59]},{index:.63,rgb:[185,140,66]},{index:.75,rgb:[202,174,88]},{index:.88,rgb:[216,209,126]},{index:1,rgb:[233,246,171]}],"velocity-blue":[{index:0,rgb:[17,32,64]},{index:.13,rgb:[35,52,116]},{index:.25,rgb:[29,81,156]},{index:.38,rgb:[31,113,162]},{index:.5,rgb:[50,144,169]},{index:.63,rgb:[87,173,176]},{index:.75,rgb:[149,196,189]},{index:.88,rgb:[203,221,211]},{index:1,rgb:[254,251,230]}],"velocity-green":[{index:0,rgb:[23,35,19]},{index:.13,rgb:[24,64,38]},{index:.25,rgb:[11,95,45]},{index:.38,rgb:[39,123,35]},{index:.5,rgb:[95,146,12]},{index:.63,rgb:[152,165,18]},{index:.75,rgb:[201,186,69]},{index:.88,rgb:[233,216,137]},{index:1,rgb:[255,253,205]}],cubehelix:[{index:0,rgb:[0,0,0]},{index:.07,rgb:[22,5,59]},{index:.13,rgb:[60,4,105]},{index:.2,rgb:[109,1,135]},{index:.27,rgb:[161,0,147]},{index:.33,rgb:[210,2,142]},{index:.4,rgb:[251,11,123]},{index:.47,rgb:[255,29,97]},{index:.53,rgb:[255,54,69]},{index:.6,rgb:[255,85,46]},{index:.67,rgb:[255,120,34]},{index:.73,rgb:[255,157,37]},{index:.8,rgb:[241,191,57]},{index:.87,rgb:[224,220,93]},{index:.93,rgb:[218,241,142]},{index:1,rgb:[227,253,198]}]}},9156:function(t,e,r){"use strict";var n=r(5692),i=r(3578);function a(t){return[t[0]/255,t[1]/255,t[2]/255,t[3]]}function o(t){for(var e,r="#",n=0;n<3;++n)r+=("00"+(e=(e=t[n]).toString(16))).substr(e.length);return r}function s(t){return"rgba("+t.join(",")+")"}t.exports=function(t){var e,r,l,u,c,f,h,p,d,v;if(t||(t={}),p=(t.nshades||72)-1,h=t.format||"hex",(f=t.colormap)||(f="jet"),"string"==typeof f){if(f=f.toLowerCase(),!n[f])throw Error(f+" not a supported colorscale");c=n[f]}else{if(!Array.isArray(f))throw Error("unsupported colormap option",f);c=f.slice()}if(c.length>p+1)throw new Error(f+" map requires nshades to be at least size "+c.length);d=Array.isArray(t.alpha)?2!==t.alpha.length?[1,1]:t.alpha.slice():"number"==typeof t.alpha?[t.alpha,t.alpha]:[1,1],e=c.map((function(t){return Math.round(t.index*p)})),d[0]=Math.min(Math.max(d[0],0),1),d[1]=Math.min(Math.max(d[1],0),1);var g=c.map((function(t,e){var r=c[e].index,n=c[e].rgb.slice();return 4===n.length&&n[3]>=0&&n[3]<=1||(n[3]=d[0]+(d[1]-d[0])*r),n})),y=[];for(v=0;v0||l(t,e,a)?-1:1:0===s?u>0||l(t,e,r)?1:-1:i(u-s)}var f=n(t,e,r);return f>0?o>0&&n(t,e,a)>0?1:-1:f<0?o>0||n(t,e,a)>0?1:-1:n(t,e,a)>0||l(t,e,r)?1:-1};var n=r(417),i=r(7538),a=r(87),o=r(2019),s=r(9662);function l(t,e,r){var n=a(t[0],-e[0]),i=a(t[1],-e[1]),l=a(r[0],-e[0]),u=a(r[1],-e[1]),c=s(o(n,l),o(i,u));return c[c.length-1]>=0}},7538:function(t){"use strict";t.exports=function(t){return t<0?-1:t>0?1:0}},9209:function(t){t.exports=function(t,n){var i=t.length,a=t.length-n.length;if(a)return a;switch(i){case 0:return 0;case 1:return t[0]-n[0];case 2:return t[0]+t[1]-n[0]-n[1]||e(t[0],t[1])-e(n[0],n[1]);case 3:var o=t[0]+t[1],s=n[0]+n[1];if(a=o+t[2]-(s+n[2]))return a;var l=e(t[0],t[1]),u=e(n[0],n[1]);return e(l,t[2])-e(u,n[2])||e(l+t[2],o)-e(u+n[2],s);case 4:var c=t[0],f=t[1],h=t[2],p=t[3],d=n[0],v=n[1],g=n[2],y=n[3];return c+f+h+p-(d+v+g+y)||e(c,f,h,p)-e(d,v,g,y,d)||e(c+f,c+h,c+p,f+h,f+p,h+p)-e(d+v,d+g,d+y,v+g,v+y,g+y)||e(c+f+h,c+f+p,c+h+p,f+h+p)-e(d+v+g,d+v+y,d+g+y,v+g+y);default:for(var m=t.slice().sort(r),x=n.slice().sort(r),b=0;bt[r][0]&&(r=n);return er?[[r],[e]]:[[e]]}},8722:function(t,e,r){"use strict";t.exports=function(t){var e=n(t),r=e.length;if(r<=2)return[];for(var i=new Array(r),a=e[r-1],o=0;o=e[l]&&(s+=1);a[o]=s}}return t}(n(a,!0),r)}};var n=r(2183),i=r(2153)},9680:function(t){"use strict";t.exports=function(t,e,r,n,i,a){var o=i-1,s=i*i,l=o*o,u=(1+2*i)*l,c=i*l,f=s*(3-2*i),h=s*o;if(t.length){a||(a=new Array(t.length));for(var p=t.length-1;p>=0;--p)a[p]=u*t[p]+c*e[p]+f*r[p]+h*n[p];return a}return u*t+c*e+f*r+h*n},t.exports.derivative=function(t,e,r,n,i,a){var o=6*i*i-6*i,s=3*i*i-4*i+1,l=-6*i*i+6*i,u=3*i*i-2*i;if(t.length){a||(a=new Array(t.length));for(var c=t.length-1;c>=0;--c)a[c]=o*t[c]+s*e[c]+l*r[c]+u*n[c];return a}return o*t+s*e+l*r[c]+u*n}},4419:function(t,e,r){"use strict";var n=r(2183),i=r(1215);function a(t,e){this.point=t,this.index=e}function o(t,e){for(var r=t.point,n=e.point,i=r.length,a=0;a=2)return!1;t[r]=n}return!0})):_.filter((function(t){for(var e=0;e<=s;++e){var r=y[t[e]];if(r<0)return!1;t[e]=r}return!0})),1&s)for(c=0;c<_.length;++c)h=(b=_[c])[0],b[0]=b[1],b[1]=h;return _}},8362:function(t){var e=!1;if("undefined"!=typeof Float64Array){var r=new Float64Array(1),n=new Uint32Array(r.buffer);r[0]=1,e=!0,1072693248===n[1]?(t.exports=function(t){return r[0]=t,[n[0],n[1]]},t.exports.pack=function(t,e){return n[0]=t,n[1]=e,r[0]},t.exports.lo=function(t){return r[0]=t,n[0]},t.exports.hi=function(t){return r[0]=t,n[1]}):1072693248===n[0]?(t.exports=function(t){return r[0]=t,[n[1],n[0]]},t.exports.pack=function(t,e){return n[1]=t,n[0]=e,r[0]},t.exports.lo=function(t){return r[0]=t,n[1]},t.exports.hi=function(t){return r[0]=t,n[0]}):e=!1}if(!e){var i=new Buffer(8);t.exports=function(t){return i.writeDoubleLE(t,0,!0),[i.readUInt32LE(0,!0),i.readUInt32LE(4,!0)]},t.exports.pack=function(t,e){return i.writeUInt32LE(t,0,!0),i.writeUInt32LE(e,4,!0),i.readDoubleLE(0,!0)},t.exports.lo=function(t){return i.writeDoubleLE(t,0,!0),i.readUInt32LE(0,!0)},t.exports.hi=function(t){return i.writeDoubleLE(t,0,!0),i.readUInt32LE(4,!0)}}t.exports.sign=function(e){return t.exports.hi(e)>>>31},t.exports.exponent=function(e){return(t.exports.hi(e)<<1>>>21)-1023},t.exports.fraction=function(e){var r=t.exports.lo(e),n=t.exports.hi(e),i=1048575&n;return 2146435072&n&&(i+=1<<20),[r,i]},t.exports.denormalized=function(e){return!(2146435072&t.exports.hi(e))}},3094:function(t){"use strict";function e(t,r,n){var i=0|t[n];if(i<=0)return[];var a,o=new Array(i);if(n===t.length-1)for(a=0;a0)return function(t,e){var r,n;for(r=new Array(t),n=0;n=r-1){h=l.length-1;var d=t-e[r-1];for(p=0;p=r-1)for(var c=s.length-1,f=(e[r-1],0);f=0;--r)if(t[--e])return!1;return!0},s.jump=function(t){var e=this.lastT(),r=this.dimension;if(!(t0;--f)n.push(a(l[f-1],u[f-1],arguments[f])),i.push(0)}},s.push=function(t){var e=this.lastT(),r=this.dimension;if(!(t1e-6?1/s:0;this._time.push(t);for(var h=r;h>0;--h){var p=a(u[h-1],c[h-1],arguments[h]);n.push(p),i.push((p-n[o++])*f)}}},s.set=function(t){var e=this.dimension;if(!(t0;--l)r.push(a(o[l-1],s[l-1],arguments[l])),n.push(0)}},s.move=function(t){var e=this.lastT(),r=this.dimension;if(!(t<=e||arguments.length!==r+1)){var n=this._state,i=this._velocity,o=n.length-this.dimension,s=this.bounds,l=s[0],u=s[1],c=t-e,f=c>1e-6?1/c:0;this._time.push(t);for(var h=r;h>0;--h){var p=arguments[h];n.push(a(l[h-1],u[h-1],n[o++]+p)),i.push(p*f)}}},s.idle=function(t){var e=this.lastT();if(!(t=0;--f)n.push(a(l[f],u[f],n[o]+c*i[o])),i.push(0),o+=1}}},7080:function(t){"use strict";function e(t,e,r,n,i,a){this._color=t,this.key=e,this.value=r,this.left=n,this.right=i,this._count=a}function r(t){return new e(t._color,t.key,t.value,t.left,t.right,t._count)}function n(t,r){return new e(t,r.key,r.value,r.left,r.right,r._count)}function i(t){t._count=1+(t.left?t.left._count:0)+(t.right?t.right._count:0)}function a(t,e){this._compare=t,this.root=e}t.exports=function(t){return new a(t||p,null)};var o=a.prototype;function s(t,e){var r;return e.left&&(r=s(t,e.left))?r:(r=t(e.key,e.value))||(e.right?s(t,e.right):void 0)}function l(t,e,r,n){if(e(t,n.key)<=0){var i;if(n.left&&(i=l(t,e,r,n.left)))return i;if(i=r(n.key,n.value))return i}if(n.right)return l(t,e,r,n.right)}function u(t,e,r,n,i){var a,o=r(t,i.key),s=r(e,i.key);if(o<=0){if(i.left&&(a=u(t,e,r,n,i.left)))return a;if(s>0&&(a=n(i.key,i.value)))return a}if(s>0&&i.right)return u(t,e,r,n,i.right)}function c(t,e){this.tree=t,this._stack=e}Object.defineProperty(o,"keys",{get:function(){var t=[];return this.forEach((function(e,r){t.push(e)})),t}}),Object.defineProperty(o,"values",{get:function(){var t=[];return this.forEach((function(e,r){t.push(r)})),t}}),Object.defineProperty(o,"length",{get:function(){return this.root?this.root._count:0}}),o.insert=function(t,r){for(var o=this._compare,s=this.root,l=[],u=[];s;){var c=o(t,s.key);l.push(s),u.push(c),s=c<=0?s.left:s.right}l.push(new e(0,t,r,null,null,1));for(var f=l.length-2;f>=0;--f)s=l[f],u[f]<=0?l[f]=new e(s._color,s.key,s.value,l[f+1],s.right,s._count+1):l[f]=new e(s._color,s.key,s.value,s.left,l[f+1],s._count+1);for(f=l.length-1;f>1;--f){var h=l[f-1];if(s=l[f],1===h._color||1===s._color)break;var p=l[f-2];if(p.left===h)if(h.left===s){if(!(d=p.right)||0!==d._color){p._color=0,p.left=h.right,h._color=1,h.right=p,l[f-2]=h,l[f-1]=s,i(p),i(h),f>=3&&((v=l[f-3]).left===p?v.left=h:v.right=h);break}h._color=1,p.right=n(1,d),p._color=0,f-=1}else{if(!(d=p.right)||0!==d._color){h.right=s.left,p._color=0,p.left=s.right,s._color=1,s.left=h,s.right=p,l[f-2]=s,l[f-1]=h,i(p),i(h),i(s),f>=3&&((v=l[f-3]).left===p?v.left=s:v.right=s);break}h._color=1,p.right=n(1,d),p._color=0,f-=1}else if(h.right===s){if(!(d=p.left)||0!==d._color){p._color=0,p.right=h.left,h._color=1,h.left=p,l[f-2]=h,l[f-1]=s,i(p),i(h),f>=3&&((v=l[f-3]).right===p?v.right=h:v.left=h);break}h._color=1,p.left=n(1,d),p._color=0,f-=1}else{var d;if(!(d=p.left)||0!==d._color){var v;h.left=s.right,p._color=0,p.right=s.left,s._color=1,s.right=h,s.left=p,l[f-2]=s,l[f-1]=h,i(p),i(h),i(s),f>=3&&((v=l[f-3]).right===p?v.right=s:v.left=s);break}h._color=1,p.left=n(1,d),p._color=0,f-=1}}return l[0]._color=1,new a(o,l[0])},o.forEach=function(t,e,r){if(this.root)switch(arguments.length){case 1:return s(t,this.root);case 2:return l(e,this._compare,t,this.root);case 3:if(this._compare(e,r)>=0)return;return u(e,r,this._compare,t,this.root)}},Object.defineProperty(o,"begin",{get:function(){for(var t=[],e=this.root;e;)t.push(e),e=e.left;return new c(this,t)}}),Object.defineProperty(o,"end",{get:function(){for(var t=[],e=this.root;e;)t.push(e),e=e.right;return new c(this,t)}}),o.at=function(t){if(t<0)return new c(this,[]);for(var e=this.root,r=[];;){if(r.push(e),e.left){if(t=e.right._count)break;e=e.right}return new c(this,[])},o.ge=function(t){for(var e=this._compare,r=this.root,n=[],i=0;r;){var a=e(t,r.key);n.push(r),a<=0&&(i=n.length),r=a<=0?r.left:r.right}return n.length=i,new c(this,n)},o.gt=function(t){for(var e=this._compare,r=this.root,n=[],i=0;r;){var a=e(t,r.key);n.push(r),a<0&&(i=n.length),r=a<0?r.left:r.right}return n.length=i,new c(this,n)},o.lt=function(t){for(var e=this._compare,r=this.root,n=[],i=0;r;){var a=e(t,r.key);n.push(r),a>0&&(i=n.length),r=a<=0?r.left:r.right}return n.length=i,new c(this,n)},o.le=function(t){for(var e=this._compare,r=this.root,n=[],i=0;r;){var a=e(t,r.key);n.push(r),a>=0&&(i=n.length),r=a<0?r.left:r.right}return n.length=i,new c(this,n)},o.find=function(t){for(var e=this._compare,r=this.root,n=[];r;){var i=e(t,r.key);if(n.push(r),0===i)return new c(this,n);r=i<=0?r.left:r.right}return new c(this,[])},o.remove=function(t){var e=this.find(t);return e?e.remove():this},o.get=function(t){for(var e=this._compare,r=this.root;r;){var n=e(t,r.key);if(0===n)return r.value;r=n<=0?r.left:r.right}};var f=c.prototype;function h(t,e){t.key=e.key,t.value=e.value,t.left=e.left,t.right=e.right,t._color=e._color,t._count=e._count}function p(t,e){return te?1:0}Object.defineProperty(f,"valid",{get:function(){return this._stack.length>0}}),Object.defineProperty(f,"node",{get:function(){return this._stack.length>0?this._stack[this._stack.length-1]:null},enumerable:!0}),f.clone=function(){return new c(this.tree,this._stack.slice())},f.remove=function(){var t=this._stack;if(0===t.length)return this.tree;var o=new Array(t.length),s=t[t.length-1];o[o.length-1]=new e(s._color,s.key,s.value,s.left,s.right,s._count);for(var l=t.length-2;l>=0;--l)(s=t[l]).left===t[l+1]?o[l]=new e(s._color,s.key,s.value,o[l+1],s.right,s._count):o[l]=new e(s._color,s.key,s.value,s.left,o[l+1],s._count);if((s=o[o.length-1]).left&&s.right){var u=o.length;for(s=s.left;s.right;)o.push(s),s=s.right;var c=o[u-1];for(o.push(new e(s._color,c.key,c.value,s.left,s.right,s._count)),o[u-1].key=s.key,o[u-1].value=s.value,l=o.length-2;l>=u;--l)s=o[l],o[l]=new e(s._color,s.key,s.value,s.left,o[l+1],s._count);o[u-1].left=o[u]}if(0===(s=o[o.length-1])._color){var f=o[o.length-2];for(f.left===s?f.left=null:f.right===s&&(f.right=null),o.pop(),l=0;l=0;--l){if(e=t[l],0===l)return void(e._color=1);if((a=t[l-1]).left===e){if((o=a.right).right&&0===o.right._color)return s=(o=a.right=r(o)).right=r(o.right),a.right=o.left,o.left=a,o.right=s,o._color=a._color,e._color=1,a._color=1,s._color=1,i(a),i(o),l>1&&((u=t[l-2]).left===a?u.left=o:u.right=o),void(t[l-1]=o);if(o.left&&0===o.left._color)return s=(o=a.right=r(o)).left=r(o.left),a.right=s.left,o.left=s.right,s.left=a,s.right=o,s._color=a._color,a._color=1,o._color=1,e._color=1,i(a),i(o),i(s),l>1&&((u=t[l-2]).left===a?u.left=s:u.right=s),void(t[l-1]=s);if(1===o._color){if(0===a._color)return a._color=1,void(a.right=n(0,o));a.right=n(0,o);continue}o=r(o),a.right=o.left,o.left=a,o._color=a._color,a._color=0,i(a),i(o),l>1&&((u=t[l-2]).left===a?u.left=o:u.right=o),t[l-1]=o,t[l]=a,l+11&&((u=t[l-2]).right===a?u.right=o:u.left=o),void(t[l-1]=o);if(o.right&&0===o.right._color)return s=(o=a.left=r(o)).right=r(o.right),a.left=s.right,o.right=s.left,s.right=a,s.left=o,s._color=a._color,a._color=1,o._color=1,e._color=1,i(a),i(o),i(s),l>1&&((u=t[l-2]).right===a?u.right=s:u.left=s),void(t[l-1]=s);if(1===o._color){if(0===a._color)return a._color=1,void(a.left=n(0,o));a.left=n(0,o);continue}var u;o=r(o),a.left=o.right,o.right=a,o._color=a._color,a._color=0,i(a),i(o),l>1&&((u=t[l-2]).right===a?u.right=o:u.left=o),t[l-1]=o,t[l]=a,l+10)return this._stack[this._stack.length-1].key},enumerable:!0}),Object.defineProperty(f,"value",{get:function(){if(this._stack.length>0)return this._stack[this._stack.length-1].value},enumerable:!0}),Object.defineProperty(f,"index",{get:function(){var t=0,e=this._stack;if(0===e.length){var r=this.tree.root;return r?r._count:0}e[e.length-1].left&&(t=e[e.length-1].left._count);for(var n=e.length-2;n>=0;--n)e[n+1]===e[n].right&&(++t,e[n].left&&(t+=e[n].left._count));return t},enumerable:!0}),f.next=function(){var t=this._stack;if(0!==t.length){var e=t[t.length-1];if(e.right)for(e=e.right;e;)t.push(e),e=e.left;else for(t.pop();t.length>0&&t[t.length-1].right===e;)e=t[t.length-1],t.pop()}},Object.defineProperty(f,"hasNext",{get:function(){var t=this._stack;if(0===t.length)return!1;if(t[t.length-1].right)return!0;for(var e=t.length-1;e>0;--e)if(t[e-1].left===t[e])return!0;return!1}}),f.update=function(t){var r=this._stack;if(0===r.length)throw new Error("Can't update empty node!");var n=new Array(r.length),i=r[r.length-1];n[n.length-1]=new e(i._color,i.key,t,i.left,i.right,i._count);for(var o=r.length-2;o>=0;--o)(i=r[o]).left===r[o+1]?n[o]=new e(i._color,i.key,i.value,n[o+1],i.right,i._count):n[o]=new e(i._color,i.key,i.value,i.left,n[o+1],i._count);return new a(this.tree._compare,n[0])},f.prev=function(){var t=this._stack;if(0!==t.length){var e=t[t.length-1];if(e.left)for(e=e.left;e;)t.push(e),e=e.right;else for(t.pop();t.length>0&&t[t.length-1].left===e;)e=t[t.length-1],t.pop()}},Object.defineProperty(f,"hasPrev",{get:function(){var t=this._stack;if(0===t.length)return!1;if(t[t.length-1].left)return!0;for(var e=t.length-1;e>0;--e)if(t[e-1].right===t[e])return!0;return!1}})},7453:function(t,e,r){"use strict";t.exports=function(t,e){var r=new c(t);return r.update(e),r};var n=r(9557),i=r(1681),a=r(1011),o=r(2864),s=r(8468),l=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);function u(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t}function c(t){this.gl=t,this.pixelRatio=1,this.bounds=[[-10,-10,-10],[10,10,10]],this.ticks=[[],[],[]],this.autoTicks=!0,this.tickSpacing=[1,1,1],this.tickEnable=[!0,!0,!0],this.tickFont=["sans-serif","sans-serif","sans-serif"],this.tickSize=[12,12,12],this.tickAngle=[0,0,0],this.tickAlign=["auto","auto","auto"],this.tickColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.tickPad=[10,10,10],this.lastCubeProps={cubeEdges:[0,0,0],axis:[0,0,0]},this.labels=["x","y","z"],this.labelEnable=[!0,!0,!0],this.labelFont="sans-serif",this.labelSize=[20,20,20],this.labelAngle=[0,0,0],this.labelAlign=["auto","auto","auto"],this.labelColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.labelPad=[10,10,10],this.lineEnable=[!0,!0,!0],this.lineMirror=[!1,!1,!1],this.lineWidth=[1,1,1],this.lineColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.lineTickEnable=[!0,!0,!0],this.lineTickMirror=[!1,!1,!1],this.lineTickLength=[0,0,0],this.lineTickWidth=[1,1,1],this.lineTickColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.gridEnable=[!0,!0,!0],this.gridWidth=[1,1,1],this.gridColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.zeroEnable=[!0,!0,!0],this.zeroLineColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.zeroLineWidth=[2,2,2],this.backgroundEnable=[!1,!1,!1],this.backgroundColor=[[.8,.8,.8,.5],[.8,.8,.8,.5],[.8,.8,.8,.5]],this._firstInit=!0,this._text=null,this._lines=null,this._background=a(t)}var f=c.prototype;function h(){this.primalOffset=[0,0,0],this.primalMinor=[0,0,0],this.mirrorOffset=[0,0,0],this.mirrorMinor=[0,0,0]}f.update=function(t){function e(e,r,n){if(n in t){var i,a=t[n],o=this[n];(e?Array.isArray(a)&&Array.isArray(a[0]):Array.isArray(a))?this[n]=i=[r(a[0]),r(a[1]),r(a[2])]:this[n]=i=[r(a),r(a),r(a)];for(var s=0;s<3;++s)if(i[s]!==o[s])return!0}return!1}t=t||{};var r,a=e.bind(this,!1,Number),o=e.bind(this,!1,Boolean),l=e.bind(this,!1,String),u=e.bind(this,!0,(function(t){if(Array.isArray(t)){if(3===t.length)return[+t[0],+t[1],+t[2],1];if(4===t.length)return[+t[0],+t[1],+t[2],+t[3]]}return[0,0,0,1]})),c=!1,f=!1;if("bounds"in t)for(var h=t.bounds,p=0;p<2;++p)for(var d=0;d<3;++d)h[p][d]!==this.bounds[p][d]&&(f=!0),this.bounds[p][d]=h[p][d];if("ticks"in t)for(r=t.ticks,c=!0,this.autoTicks=!1,p=0;p<3;++p)this.tickSpacing[p]=0;else a("tickSpacing")&&(this.autoTicks=!0,f=!0);if(this._firstInit&&("ticks"in t||"tickSpacing"in t||(this.autoTicks=!0),f=!0,c=!0,this._firstInit=!1),f&&this.autoTicks&&(r=s.create(this.bounds,this.tickSpacing),c=!0),c){for(p=0;p<3;++p)r[p].sort((function(t,e){return t.x-e.x}));s.equal(r,this.ticks)?c=!1:this.ticks=r}o("tickEnable"),l("tickFont")&&(c=!0),a("tickSize"),a("tickAngle"),a("tickPad"),u("tickColor");var v=l("labels");l("labelFont")&&(v=!0),o("labelEnable"),a("labelSize"),a("labelPad"),u("labelColor"),o("lineEnable"),o("lineMirror"),a("lineWidth"),u("lineColor"),o("lineTickEnable"),o("lineTickMirror"),a("lineTickLength"),a("lineTickWidth"),u("lineTickColor"),o("gridEnable"),a("gridWidth"),u("gridColor"),o("zeroEnable"),u("zeroLineColor"),a("zeroLineWidth"),o("backgroundEnable"),u("backgroundColor"),this._text?this._text&&(v||c)&&this._text.update(this.bounds,this.labels,this.labelFont,this.ticks,this.tickFont):this._text=n(this.gl,this.bounds,this.labels,this.labelFont,this.ticks,this.tickFont),this._lines&&c&&(this._lines.dispose(),this._lines=null),this._lines||(this._lines=i(this.gl,this.bounds,this.ticks))};var p=[new h,new h,new h];function d(t,e,r,n,i){for(var a=t.primalOffset,o=t.primalMinor,s=t.mirrorOffset,l=t.mirrorMinor,u=n[e],c=0;c<3;++c)if(e!==c){var f=a,h=s,p=o,d=l;u&1<0?(p[c]=-1,d[c]=0):(p[c]=0,d[c]=1)}}var v=[0,0,0],g={model:l,view:l,projection:l,_ortho:!1};f.isOpaque=function(){return!0},f.isTransparent=function(){return!1},f.drawTransparent=function(t){};var y=[0,0,0],m=[0,0,0],x=[0,0,0];f.draw=function(t){t=t||g;for(var e=this.gl,r=t.model||l,n=t.view||l,i=t.projection||l,a=this.bounds,s=t._ortho||!1,c=o(r,n,i,a,s),f=c.cubeEdges,h=c.axis,b=n[12],_=n[13],w=n[14],T=n[15],k=(s?2:1)*this.pixelRatio*(i[3]*b+i[7]*_+i[11]*w+i[15]*T)/e.drawingBufferHeight,A=0;A<3;++A)this.lastCubeProps.cubeEdges[A]=f[A],this.lastCubeProps.axis[A]=h[A];var M=p;for(A=0;A<3;++A)d(p[A],A,this.bounds,f,h);e=this.gl;var S,E,L,C=v;for(A=0;A<3;++A)this.backgroundEnable[A]?C[A]=h[A]:C[A]=0;for(this._background.draw(r,n,i,a,C,this.backgroundColor),this._lines.bind(r,n,i,this),A=0;A<3;++A){var P=[0,0,0];h[A]>0?P[A]=a[1][A]:P[A]=a[0][A];for(var O=0;O<2;++O){var I=(A+1+O)%3,D=(A+1+(1^O))%3;this.gridEnable[I]&&this._lines.drawGrid(I,D,this.bounds,P,this.gridColor[I],this.gridWidth[I]*this.pixelRatio)}for(O=0;O<2;++O)I=(A+1+O)%3,D=(A+1+(1^O))%3,this.zeroEnable[D]&&Math.min(a[0][D],a[1][D])<=0&&Math.max(a[0][D],a[1][D])>=0&&this._lines.drawZero(I,D,this.bounds,P,this.zeroLineColor[D],this.zeroLineWidth[D]*this.pixelRatio)}for(A=0;A<3;++A){this.lineEnable[A]&&this._lines.drawAxisLine(A,this.bounds,M[A].primalOffset,this.lineColor[A],this.lineWidth[A]*this.pixelRatio),this.lineMirror[A]&&this._lines.drawAxisLine(A,this.bounds,M[A].mirrorOffset,this.lineColor[A],this.lineWidth[A]*this.pixelRatio);var z=u(y,M[A].primalMinor),R=u(m,M[A].mirrorMinor),F=this.lineTickLength;for(O=0;O<3;++O){var B=k/r[5*O];z[O]*=F[O]*B,R[O]*=F[O]*B}this.lineTickEnable[A]&&this._lines.drawAxisTicks(A,M[A].primalOffset,z,this.lineTickColor[A],this.lineTickWidth[A]*this.pixelRatio),this.lineTickMirror[A]&&this._lines.drawAxisTicks(A,M[A].mirrorOffset,R,this.lineTickColor[A],this.lineTickWidth[A]*this.pixelRatio)}function N(t){(L=[0,0,0])[t]=1}function j(t,e,r){var n=(t+1)%3,i=(t+2)%3,a=e[n],o=e[i],s=r[n],l=r[i];a>0&&l>0||a>0&&l<0||a<0&&l>0||a<0&&l<0?N(n):(o>0&&s>0||o>0&&s<0||o<0&&s>0||o<0&&s<0)&&N(i)}for(this._lines.unbind(),this._text.bind(r,n,i,this.pixelRatio),A=0;A<3;++A){var U=M[A].primalMinor,V=M[A].mirrorMinor,H=u(x,M[A].primalOffset);for(O=0;O<3;++O)this.lineTickEnable[A]&&(H[O]+=k*U[O]*Math.max(this.lineTickLength[O],0)/r[5*O]);var q=[0,0,0];if(q[A]=1,this.tickEnable[A]){for(-3600===this.tickAngle[A]?(this.tickAngle[A]=0,this.tickAlign[A]="auto"):this.tickAlign[A]=-1,E=1,"auto"===(S=[this.tickAlign[A],.5,E])[0]?S[0]=0:S[0]=parseInt(""+S[0]),L=[0,0,0],j(A,U,V),O=0;O<3;++O)H[O]+=k*U[O]*this.tickPad[O]/r[5*O];this._text.drawTicks(A,this.tickSize[A],this.tickAngle[A],H,this.tickColor[A],q,L,S)}if(this.labelEnable[A]){for(E=0,L=[0,0,0],this.labels[A].length>4&&(N(A),E=1),"auto"===(S=[this.labelAlign[A],.5,E])[0]?S[0]=0:S[0]=parseInt(""+S[0]),O=0;O<3;++O)H[O]+=k*U[O]*this.labelPad[O]/r[5*O];H[A]+=.5*(a[0][A]+a[1][A]),this._text.drawLabel(A,this.labelSize[A],this.labelAngle[A],H,this.labelColor[A],[0,0,0],L,S)}}this._text.unbind()},f.dispose=function(){this._text.dispose(),this._lines.dispose(),this._background.dispose(),this._lines=null,this._text=null,this._background=null,this.gl=null}},1011:function(t,e,r){"use strict";t.exports=function(t){for(var e=[],r=[],s=0,l=0;l<3;++l)for(var u=(l+1)%3,c=(l+2)%3,f=[0,0,0],h=[0,0,0],p=-1;p<=1;p+=2){r.push(s,s+2,s+1,s+1,s+2,s+3),f[l]=p,h[l]=p;for(var d=-1;d<=1;d+=2){f[u]=d;for(var v=-1;v<=1;v+=2)f[c]=v,e.push(f[0],f[1],f[2],h[0],h[1],h[2]),s+=1}var g=u;u=c,c=g}var y=n(t,new Float32Array(e)),m=n(t,new Uint16Array(r),t.ELEMENT_ARRAY_BUFFER),x=i(t,[{buffer:y,type:t.FLOAT,size:3,offset:0,stride:24},{buffer:y,type:t.FLOAT,size:3,offset:12,stride:24}],m),b=a(t);return b.attributes.position.location=0,b.attributes.normal.location=1,new o(t,y,x,b)};var n=r(5827),i=r(2944),a=r(1943).bg;function o(t,e,r,n){this.gl=t,this.buffer=e,this.vao=r,this.shader=n}var s=o.prototype;s.draw=function(t,e,r,n,i,a){for(var o=!1,s=0;s<3;++s)o=o||i[s];if(o){var l=this.gl;l.enable(l.POLYGON_OFFSET_FILL),l.polygonOffset(1,2),this.shader.bind(),this.shader.uniforms={model:t,view:e,projection:r,bounds:n,enable:i,colors:a},this.vao.bind(),this.vao.draw(this.gl.TRIANGLES,36),this.vao.unbind(),l.disable(l.POLYGON_OFFSET_FILL)}},s.dispose=function(){this.vao.dispose(),this.buffer.dispose(),this.shader.dispose()}},2864:function(t,e,r){"use strict";t.exports=function(t,e,r,a,p){i(s,e,t),i(s,r,s);for(var m=0,x=0;x<2;++x){c[2]=a[x][2];for(var b=0;b<2;++b){c[1]=a[b][1];for(var _=0;_<2;++_)c[0]=a[_][0],h(l[m],c,s),m+=1}}var w=-1;for(x=0;x<8;++x){for(var T=l[x][3],k=0;k<3;++k)u[x][k]=l[x][k]/T;p&&(u[x][2]*=-1),T<0&&(w<0||u[x][2]E&&(w|=1<E&&(w|=1<u[x][1])&&(R=x);var F=-1;for(x=0;x<3;++x)(N=R^1<u[B][0]&&(B=N))}var j=v;j[0]=j[1]=j[2]=0,j[n.log2(F^R)]=R&F,j[n.log2(R^B)]=R&B;var U=7^B;U===w||U===z?(U=7^F,j[n.log2(B^U)]=U&B):j[n.log2(F^U)]=U&F;var V=g,H=w;for(A=0;A<3;++A)V[A]=H&1< HALF_PI) && (b <= ONE_AND_HALF_PI)) ?\n b - PI :\n b;\n}\n\nfloat look_horizontal_or_vertical(float a, float ratio) {\n // ratio controls the ratio between being horizontal to (vertical + horizontal)\n // if ratio is set to 0.5 then it is 50%, 50%.\n // when using a higher ratio e.g. 0.75 the result would\n // likely be more horizontal than vertical.\n\n float b = positive_angle(a);\n\n return\n (b < ( ratio) * HALF_PI) ? 0.0 :\n (b < (2.0 - ratio) * HALF_PI) ? -HALF_PI :\n (b < (2.0 + ratio) * HALF_PI) ? 0.0 :\n (b < (4.0 - ratio) * HALF_PI) ? HALF_PI :\n 0.0;\n}\n\nfloat roundTo(float a, float b) {\n return float(b * floor((a + 0.5 * b) / b));\n}\n\nfloat look_round_n_directions(float a, int n) {\n float b = positive_angle(a);\n float div = TWO_PI / float(n);\n float c = roundTo(b, div);\n return look_upwards(c);\n}\n\nfloat applyAlignOption(float rawAngle, float delta) {\n return\n (option > 2) ? look_round_n_directions(rawAngle + delta, option) : // option 3-n: round to n directions\n (option == 2) ? look_horizontal_or_vertical(rawAngle + delta, hv_ratio) : // horizontal or vertical\n (option == 1) ? rawAngle + delta : // use free angle, and flip to align with one direction of the axis\n (option == 0) ? look_upwards(rawAngle) : // use free angle, and stay upwards\n (option ==-1) ? 0.0 : // useful for backward compatibility, all texts remains horizontal\n rawAngle; // otherwise return back raw input angle\n}\n\nbool isAxisTitle = (axis.x == 0.0) &&\n (axis.y == 0.0) &&\n (axis.z == 0.0);\n\nvoid main() {\n //Compute world offset\n float axisDistance = position.z;\n vec3 dataPosition = axisDistance * axis + offset;\n\n float beta = angle; // i.e. user defined attributes for each tick\n\n float axisAngle;\n float clipAngle;\n float flip;\n\n if (enableAlign) {\n axisAngle = (isAxisTitle) ? HALF_PI :\n computeViewAngle(dataPosition, dataPosition + axis);\n clipAngle = computeViewAngle(dataPosition, dataPosition + alignDir);\n\n axisAngle += (sin(axisAngle) < 0.0) ? PI : 0.0;\n clipAngle += (sin(clipAngle) < 0.0) ? PI : 0.0;\n\n flip = (dot(vec2(cos(axisAngle), sin(axisAngle)),\n vec2(sin(clipAngle),-cos(clipAngle))) > 0.0) ? 1.0 : 0.0;\n\n beta += applyAlignOption(clipAngle, flip * PI);\n }\n\n //Compute plane offset\n vec2 planeCoord = position.xy * pixelScale;\n\n mat2 planeXform = scale * mat2(\n cos(beta), sin(beta),\n -sin(beta), cos(beta)\n );\n\n vec2 viewOffset = 2.0 * planeXform * planeCoord / resolution;\n\n //Compute clip position\n vec3 clipPosition = project(dataPosition);\n\n //Apply text offset in clip coordinates\n clipPosition += vec3(viewOffset, 0.0);\n\n //Done\n gl_Position = vec4(clipPosition, 1.0);\n}"]),l=n(["precision highp float;\n#define GLSLIFY 1\n\nuniform vec4 color;\nvoid main() {\n gl_FragColor = color;\n}"]);e.f=function(t){return i(t,s,l,null,[{name:"position",type:"vec3"}])};var u=n(["precision highp float;\n#define GLSLIFY 1\n\nattribute vec3 position;\nattribute vec3 normal;\n\nuniform mat4 model, view, projection;\nuniform vec3 enable;\nuniform vec3 bounds[2];\n\nvarying vec3 colorChannel;\n\nvoid main() {\n\n vec3 signAxis = sign(bounds[1] - bounds[0]);\n\n vec3 realNormal = signAxis * normal;\n\n if(dot(realNormal, enable) > 0.0) {\n vec3 minRange = min(bounds[0], bounds[1]);\n vec3 maxRange = max(bounds[0], bounds[1]);\n vec3 nPosition = mix(minRange, maxRange, 0.5 * (position + 1.0));\n gl_Position = projection * view * model * vec4(nPosition, 1.0);\n } else {\n gl_Position = vec4(0,0,0,0);\n }\n\n colorChannel = abs(realNormal);\n}"]),c=n(["precision highp float;\n#define GLSLIFY 1\n\nuniform vec4 colors[3];\n\nvarying vec3 colorChannel;\n\nvoid main() {\n gl_FragColor = colorChannel.x * colors[0] +\n colorChannel.y * colors[1] +\n colorChannel.z * colors[2];\n}"]);e.bg=function(t){return i(t,u,c,null,[{name:"position",type:"vec3"},{name:"normal",type:"vec3"}])}},9557:function(t,e,r){"use strict";t.exports=function(t,e,r,i,o,l){var u=n(t),f=a(t,[{buffer:u,size:3}]),h=s(t);h.attributes.position.location=0;var p=new c(t,h,u,f);return p.update(e,r,i,o,l),p};var n=r(5827),a=r(2944),o=r(875),s=r(1943).f,l=window||i.global||{},u=l.__TEXT_CACHE||{};function c(t,e,r,n){this.gl=t,this.shader=e,this.buffer=r,this.vao=n,this.tickOffset=this.tickCount=this.labelOffset=this.labelCount=null}l.__TEXT_CACHE={};var f=c.prototype,h=[0,0];f.bind=function(t,e,r,n){this.vao.bind(),this.shader.bind();var i=this.shader.uniforms;i.model=t,i.view=e,i.projection=r,i.pixelScale=n,h[0]=this.gl.drawingBufferWidth,h[1]=this.gl.drawingBufferHeight,this.shader.uniforms.resolution=h},f.unbind=function(){this.vao.unbind()},f.update=function(t,e,r,n,i){var a=[];function s(t,e,r,n,i,s){var l=u[r];l||(l=u[r]={});var c=l[e];c||(c=l[e]=function(t,e){try{return o(t,e)}catch(e){return console.warn('error vectorizing text:"'+t+'" error:',e),{cells:[],positions:[]}}}(e,{triangles:!0,font:r,textAlign:"center",textBaseline:"middle",lineSpacing:i,styletags:s}));for(var f=(n||12)/12,h=c.positions,p=c.cells,d=0,v=p.length;d=0;--y){var m=h[g[y]];a.push(f*m[0],-f*m[1],t)}}for(var l=[0,0,0],c=[0,0,0],f=[0,0,0],h=[0,0,0],p={breaklines:!0,bolds:!0,italics:!0,subscripts:!0,superscripts:!0},d=0;d<3;++d){f[d]=a.length/3|0,s(.5*(t[0][d]+t[1][d]),e[d],r[d],12,1.25,p),h[d]=(a.length/3|0)-f[d],l[d]=a.length/3|0;for(var v=0;v=0&&(i=r.length-n-1);var a=Math.pow(10,i),o=Math.round(t*e*a),s=o+"";if(s.indexOf("e")>=0)return s;var l=o/a,u=o%a;o<0?(l=0|-Math.ceil(l),u=0|-u):(l=0|Math.floor(l),u|=0);var c=""+l;if(o<0&&(c="-"+c),i){for(var f=""+u;f.length=t[0][i];--o)a.push({x:o*e[i],text:r(e[i],o)});n.push(a)}return n},e.equal=function(t,e){for(var r=0;r<3;++r){if(t[r].length!==e[r].length)return!1;for(var n=0;nr)throw new Error("gl-buffer: If resizing buffer, must not specify offset");return t.bufferSubData(e,a,i),r}function c(t,e){for(var r=n.malloc(t.length,e),i=t.length,a=0;a=0;--n){if(e[n]!==r)return!1;r*=t[n]}return!0}(t.shape,t.stride))0===t.offset&&t.data.length===t.shape[0]?this.length=u(this.gl,this.type,this.length,this.usage,t.data,e):this.length=u(this.gl,this.type,this.length,this.usage,t.data.subarray(t.offset,t.shape[0]),e);else{var s=n.malloc(t.size,r),l=a(s,t.shape);i.assign(l,t),this.length=u(this.gl,this.type,this.length,this.usage,e<0?s:s.subarray(0,t.size),e),n.free(s)}}else if(Array.isArray(t)){var f;f=this.type===this.gl.ELEMENT_ARRAY_BUFFER?c(t,"uint16"):c(t,"float32"),this.length=u(this.gl,this.type,this.length,this.usage,e<0?f:f.subarray(0,t.length),e),n.free(f)}else if("object"==typeof t&&"number"==typeof t.length)this.length=u(this.gl,this.type,this.length,this.usage,t,e);else{if("number"!=typeof t&&void 0!==t)throw new Error("gl-buffer: Invalid data type");if(e>=0)throw new Error("gl-buffer: Cannot specify offset when resizing buffer");(t|=0)<=0&&(t=1),this.gl.bufferData(this.type,0|t,this.usage),this.length=t}},t.exports=function(t,e,r,n){if(r=r||t.ARRAY_BUFFER,n=n||t.DYNAMIC_DRAW,r!==t.ARRAY_BUFFER&&r!==t.ELEMENT_ARRAY_BUFFER)throw new Error("gl-buffer: Invalid type for webgl buffer, must be either gl.ARRAY_BUFFER or gl.ELEMENT_ARRAY_BUFFER");if(n!==t.DYNAMIC_DRAW&&n!==t.STATIC_DRAW&&n!==t.STREAM_DRAW)throw new Error("gl-buffer: Invalid usage for buffer, must be either gl.DYNAMIC_DRAW, gl.STATIC_DRAW or gl.STREAM_DRAW");var i=t.createBuffer(),a=new s(t,r,i,0,n);return a.update(e),a}},1140:function(t,e,r){"use strict";var n=r(2858);t.exports=function(t,e){var r=t.positions,i=t.vectors,a={positions:[],vertexIntensity:[],vertexIntensityBounds:t.vertexIntensityBounds,vectors:[],cells:[],coneOffset:t.coneOffset,colormap:t.colormap};if(0===t.positions.length)return e&&(e[0]=[0,0,0],e[1]=[0,0,0]),a;for(var o=0,s=1/0,l=-1/0,u=1/0,c=-1/0,f=1/0,h=-1/0,p=null,d=null,v=[],g=1/0,y=!1,m=0;mo&&(o=n.length(b)),m){var _=2*n.distance(p,x)/(n.length(d)+n.length(b));_?(g=Math.min(g,_),y=!1):y=!0}y||(p=x,d=b),v.push(b)}var w=[s,u,f],T=[l,c,h];e&&(e[0]=w,e[1]=T),0===o&&(o=1);var k=1/o;isFinite(g)||(g=1),a.vectorScale=g;var A=t.coneSize||.5;t.absoluteConeSize&&(A=t.absoluteConeSize*k),a.coneScale=A,m=0;for(var M=0;m=1},p.isTransparent=function(){return this.opacity<1},p.pickSlots=1,p.setPickBase=function(t){this.pickId=t},p.update=function(t){t=t||{};var e=this.gl;this.dirty=!0,"lightPosition"in t&&(this.lightPosition=t.lightPosition),"opacity"in t&&(this.opacity=t.opacity),"ambient"in t&&(this.ambientLight=t.ambient),"diffuse"in t&&(this.diffuseLight=t.diffuse),"specular"in t&&(this.specularLight=t.specular),"roughness"in t&&(this.roughness=t.roughness),"fresnel"in t&&(this.fresnel=t.fresnel),void 0!==t.tubeScale&&(this.tubeScale=t.tubeScale),void 0!==t.vectorScale&&(this.vectorScale=t.vectorScale),void 0!==t.coneScale&&(this.coneScale=t.coneScale),void 0!==t.coneOffset&&(this.coneOffset=t.coneOffset),t.colormap&&(this.texture.shape=[256,256],this.texture.minFilter=e.LINEAR_MIPMAP_LINEAR,this.texture.magFilter=e.LINEAR,this.texture.setPixels(function(t){for(var e=c({colormap:t,nshades:256,format:"rgba"}),r=new Uint8Array(1024),n=0;n<256;++n){for(var i=e[n],a=0;a<3;++a)r[4*n+a]=i[a];r[4*n+3]=255*i[3]}return u(r,[256,256,4],[4,0,1])}(t.colormap)),this.texture.generateMipmap());var r=t.cells,n=t.positions,i=t.vectors;if(n&&r&&i){var a=[],o=[],s=[],l=[],f=[];this.cells=r,this.positions=n,this.vectors=i;var h=t.meshColor||[1,1,1,1],p=t.vertexIntensity,d=1/0,v=-1/0;if(p)if(t.vertexIntensityBounds)d=+t.vertexIntensityBounds[0],v=+t.vertexIntensityBounds[1];else for(var g=0;g0){var v=this.triShader;v.bind(),v.uniforms=u,this.triangleVAO.bind(),e.drawArrays(e.TRIANGLES,0,3*this.triangleCount),this.triangleVAO.unbind()}},p.drawPick=function(t){t=t||{};for(var e=this.gl,r=t.model||f,n=t.view||f,i=t.projection||f,a=[[-1e6,-1e6,-1e6],[1e6,1e6,1e6]],o=0;o<3;++o)a[0][o]=Math.max(a[0][o],this.clipBounds[0][o]),a[1][o]=Math.min(a[1][o],this.clipBounds[1][o]);this._model=[].slice.call(r),this._view=[].slice.call(n),this._projection=[].slice.call(i),this._resolution=[e.drawingBufferWidth,e.drawingBufferHeight];var s={model:r,view:n,projection:i,clipBounds:a,tubeScale:this.tubeScale,vectorScale:this.vectorScale,coneScale:this.coneScale,coneOffset:this.coneOffset,pickId:this.pickId/255},l=this.pickShader;l.bind(),l.uniforms=s,this.triangleCount>0&&(this.triangleVAO.bind(),e.drawArrays(e.TRIANGLES,0,3*this.triangleCount),this.triangleVAO.unbind())},p.pick=function(t){if(!t)return null;if(t.id!==this.pickId)return null;var e=t.value[0]+256*t.value[1]+65536*t.value[2],r=this.cells[e],n=this.positions[r[1]].slice(0,3),i={position:n,dataCoordinate:n,index:Math.floor(r[1]/48)};return"cone"===this.traceType?i.index=Math.floor(r[1]/48):"streamtube"===this.traceType&&(i.intensity=this.intensity[r[1]],i.velocity=this.vectors[r[1]].slice(0,3),i.divergence=this.vectors[r[1]][3],i.index=e),i},p.dispose=function(){this.texture.dispose(),this.triShader.dispose(),this.pickShader.dispose(),this.triangleVAO.dispose(),this.trianglePositions.dispose(),this.triangleVectors.dispose(),this.triangleColors.dispose(),this.triangleUVs.dispose(),this.triangleIds.dispose()},t.exports=function(t,e,r){var s=r.shaders;1===arguments.length&&(t=(e=t).gl);var l=function(t,e){var r=n(t,e.meshShader.vertex,e.meshShader.fragment,null,e.meshShader.attributes);return r.attributes.position.location=0,r.attributes.color.location=2,r.attributes.uv.location=3,r.attributes.vector.location=4,r}(t,s),c=function(t,e){var r=n(t,e.pickShader.vertex,e.pickShader.fragment,null,e.pickShader.attributes);return r.attributes.position.location=0,r.attributes.id.location=1,r.attributes.vector.location=4,r}(t,s),f=o(t,u(new Uint8Array([255,255,255,255]),[1,1,4]));f.generateMipmap(),f.minFilter=t.LINEAR_MIPMAP_LINEAR,f.magFilter=t.LINEAR;var p=i(t),d=i(t),v=i(t),g=i(t),y=i(t),m=new h(t,f,l,c,p,d,y,v,g,a(t,[{buffer:p,type:t.FLOAT,size:4},{buffer:y,type:t.UNSIGNED_BYTE,size:4,normalized:!0},{buffer:v,type:t.FLOAT,size:4},{buffer:g,type:t.FLOAT,size:2},{buffer:d,type:t.FLOAT,size:4}]),r.traceType||"cone");return m.update(e),m}},7234:function(t,e,r){var n=r(6832),i=n(["precision highp float;\n\nprecision highp float;\n#define GLSLIFY 1\n\nvec3 getOrthogonalVector(vec3 v) {\n // Return up-vector for only-z vector.\n // Return ax + by + cz = 0, a point that lies on the plane that has v as a normal and that isn't (0,0,0).\n // From the above if-statement we have ||a|| > 0 U ||b|| > 0.\n // Assign z = 0, x = -b, y = a:\n // a*-b + b*a + c*0 = -ba + ba + 0 = 0\n if (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\n return normalize(vec3(-v.y, v.x, 0.0));\n } else {\n return normalize(vec3(0.0, v.z, -v.y));\n }\n}\n\n// Calculate the cone vertex and normal at the given index.\n//\n// The returned vertex is for a cone with its top at origin and height of 1.0,\n// pointing in the direction of the vector attribute.\n//\n// Each cone is made up of a top vertex, a center base vertex and base perimeter vertices.\n// These vertices are used to make up the triangles of the cone by the following:\n// segment + 0 top vertex\n// segment + 1 perimeter vertex a+1\n// segment + 2 perimeter vertex a\n// segment + 3 center base vertex\n// segment + 4 perimeter vertex a\n// segment + 5 perimeter vertex a+1\n// Where segment is the number of the radial segment * 6 and a is the angle at that radial segment.\n// To go from index to segment, floor(index / 6)\n// To go from segment to angle, 2*pi * (segment/segmentCount)\n// To go from index to segment index, index - (segment*6)\n//\nvec3 getConePosition(vec3 d, float rawIndex, float coneOffset, out vec3 normal) {\n\n const float segmentCount = 8.0;\n\n float index = rawIndex - floor(rawIndex /\n (segmentCount * 6.0)) *\n (segmentCount * 6.0);\n\n float segment = floor(0.001 + index/6.0);\n float segmentIndex = index - (segment*6.0);\n\n normal = -normalize(d);\n\n if (segmentIndex > 2.99 && segmentIndex < 3.01) {\n return mix(vec3(0.0), -d, coneOffset);\n }\n\n float nextAngle = (\n (segmentIndex > 0.99 && segmentIndex < 1.01) ||\n (segmentIndex > 4.99 && segmentIndex < 5.01)\n ) ? 1.0 : 0.0;\n float angle = 2.0 * 3.14159 * ((segment + nextAngle) / segmentCount);\n\n vec3 v1 = mix(d, vec3(0.0), coneOffset);\n vec3 v2 = v1 - d;\n\n vec3 u = getOrthogonalVector(d);\n vec3 v = normalize(cross(u, d));\n\n vec3 x = u * cos(angle) * length(d)*0.25;\n vec3 y = v * sin(angle) * length(d)*0.25;\n vec3 v3 = v2 + x + y;\n if (segmentIndex < 3.0) {\n vec3 tx = u * sin(angle);\n vec3 ty = v * -cos(angle);\n vec3 tangent = tx + ty;\n normal = normalize(cross(v3 - v1, tangent));\n }\n\n if (segmentIndex == 0.0) {\n return mix(d, vec3(0.0), coneOffset);\n }\n return v3;\n}\n\nattribute vec3 vector;\nattribute vec4 color, position;\nattribute vec2 uv;\n\nuniform float vectorScale, coneScale, coneOffset;\nuniform mat4 model, view, projection, inverseModel;\nuniform vec3 eyePosition, lightPosition;\n\nvarying vec3 f_normal, f_lightDirection, f_eyeDirection, f_data, f_position;\nvarying vec4 f_color;\nvarying vec2 f_uv;\n\nvoid main() {\n // Scale the vector magnitude to stay constant with\n // model & view changes.\n vec3 normal;\n vec3 XYZ = getConePosition(mat3(model) * ((vectorScale * coneScale) * vector), position.w, coneOffset, normal);\n vec4 conePosition = model * vec4(position.xyz, 1.0) + vec4(XYZ, 0.0);\n\n //Lighting geometry parameters\n vec4 cameraCoordinate = view * conePosition;\n cameraCoordinate.xyz /= cameraCoordinate.w;\n f_lightDirection = lightPosition - cameraCoordinate.xyz;\n f_eyeDirection = eyePosition - cameraCoordinate.xyz;\n f_normal = normalize((vec4(normal, 0.0) * inverseModel).xyz);\n\n // vec4 m_position = model * vec4(conePosition, 1.0);\n vec4 t_position = view * conePosition;\n gl_Position = projection * t_position;\n\n f_color = color;\n f_data = conePosition.xyz;\n f_position = position.xyz;\n f_uv = uv;\n}\n"]),a=n(["#extension GL_OES_standard_derivatives : enable\n\nprecision highp float;\n#define GLSLIFY 1\n\nfloat beckmannDistribution(float x, float roughness) {\n float NdotH = max(x, 0.0001);\n float cos2Alpha = NdotH * NdotH;\n float tan2Alpha = (cos2Alpha - 1.0) / cos2Alpha;\n float roughness2 = roughness * roughness;\n float denom = 3.141592653589793 * roughness2 * cos2Alpha * cos2Alpha;\n return exp(tan2Alpha / roughness2) / denom;\n}\n\nfloat cookTorranceSpecular(\n vec3 lightDirection,\n vec3 viewDirection,\n vec3 surfaceNormal,\n float roughness,\n float fresnel) {\n\n float VdotN = max(dot(viewDirection, surfaceNormal), 0.0);\n float LdotN = max(dot(lightDirection, surfaceNormal), 0.0);\n\n //Half angle vector\n vec3 H = normalize(lightDirection + viewDirection);\n\n //Geometric term\n float NdotH = max(dot(surfaceNormal, H), 0.0);\n float VdotH = max(dot(viewDirection, H), 0.000001);\n float LdotH = max(dot(lightDirection, H), 0.000001);\n float G1 = (2.0 * NdotH * VdotN) / VdotH;\n float G2 = (2.0 * NdotH * LdotN) / LdotH;\n float G = min(1.0, min(G1, G2));\n \n //Distribution term\n float D = beckmannDistribution(NdotH, roughness);\n\n //Fresnel term\n float F = pow(1.0 - VdotN, fresnel);\n\n //Multiply terms and done\n return G * F * D / max(3.14159265 * VdotN, 0.000001);\n}\n\nbool outOfRange(float a, float b, float p) {\n return ((p > max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nuniform vec3 clipBounds[2];\nuniform float roughness, fresnel, kambient, kdiffuse, kspecular, opacity;\nuniform sampler2D texture;\n\nvarying vec3 f_normal, f_lightDirection, f_eyeDirection, f_data, f_position;\nvarying vec4 f_color;\nvarying vec2 f_uv;\n\nvoid main() {\n if (outOfRange(clipBounds[0], clipBounds[1], f_position)) discard;\n vec3 N = normalize(f_normal);\n vec3 L = normalize(f_lightDirection);\n vec3 V = normalize(f_eyeDirection);\n\n if(gl_FrontFacing) {\n N = -N;\n }\n\n float specular = min(1.0, max(0.0, cookTorranceSpecular(L, V, N, roughness, fresnel)));\n float diffuse = min(kambient + kdiffuse * max(dot(N, L), 0.0), 1.0);\n\n vec4 surfaceColor = f_color * texture2D(texture, f_uv);\n vec4 litColor = surfaceColor.a * vec4(diffuse * surfaceColor.rgb + kspecular * vec3(1,1,1) * specular, 1.0);\n\n gl_FragColor = litColor * opacity;\n}\n"]),o=n(["precision highp float;\n\nprecision highp float;\n#define GLSLIFY 1\n\nvec3 getOrthogonalVector(vec3 v) {\n // Return up-vector for only-z vector.\n // Return ax + by + cz = 0, a point that lies on the plane that has v as a normal and that isn't (0,0,0).\n // From the above if-statement we have ||a|| > 0 U ||b|| > 0.\n // Assign z = 0, x = -b, y = a:\n // a*-b + b*a + c*0 = -ba + ba + 0 = 0\n if (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\n return normalize(vec3(-v.y, v.x, 0.0));\n } else {\n return normalize(vec3(0.0, v.z, -v.y));\n }\n}\n\n// Calculate the cone vertex and normal at the given index.\n//\n// The returned vertex is for a cone with its top at origin and height of 1.0,\n// pointing in the direction of the vector attribute.\n//\n// Each cone is made up of a top vertex, a center base vertex and base perimeter vertices.\n// These vertices are used to make up the triangles of the cone by the following:\n// segment + 0 top vertex\n// segment + 1 perimeter vertex a+1\n// segment + 2 perimeter vertex a\n// segment + 3 center base vertex\n// segment + 4 perimeter vertex a\n// segment + 5 perimeter vertex a+1\n// Where segment is the number of the radial segment * 6 and a is the angle at that radial segment.\n// To go from index to segment, floor(index / 6)\n// To go from segment to angle, 2*pi * (segment/segmentCount)\n// To go from index to segment index, index - (segment*6)\n//\nvec3 getConePosition(vec3 d, float rawIndex, float coneOffset, out vec3 normal) {\n\n const float segmentCount = 8.0;\n\n float index = rawIndex - floor(rawIndex /\n (segmentCount * 6.0)) *\n (segmentCount * 6.0);\n\n float segment = floor(0.001 + index/6.0);\n float segmentIndex = index - (segment*6.0);\n\n normal = -normalize(d);\n\n if (segmentIndex > 2.99 && segmentIndex < 3.01) {\n return mix(vec3(0.0), -d, coneOffset);\n }\n\n float nextAngle = (\n (segmentIndex > 0.99 && segmentIndex < 1.01) ||\n (segmentIndex > 4.99 && segmentIndex < 5.01)\n ) ? 1.0 : 0.0;\n float angle = 2.0 * 3.14159 * ((segment + nextAngle) / segmentCount);\n\n vec3 v1 = mix(d, vec3(0.0), coneOffset);\n vec3 v2 = v1 - d;\n\n vec3 u = getOrthogonalVector(d);\n vec3 v = normalize(cross(u, d));\n\n vec3 x = u * cos(angle) * length(d)*0.25;\n vec3 y = v * sin(angle) * length(d)*0.25;\n vec3 v3 = v2 + x + y;\n if (segmentIndex < 3.0) {\n vec3 tx = u * sin(angle);\n vec3 ty = v * -cos(angle);\n vec3 tangent = tx + ty;\n normal = normalize(cross(v3 - v1, tangent));\n }\n\n if (segmentIndex == 0.0) {\n return mix(d, vec3(0.0), coneOffset);\n }\n return v3;\n}\n\nattribute vec4 vector;\nattribute vec4 position;\nattribute vec4 id;\n\nuniform mat4 model, view, projection;\nuniform float vectorScale, coneScale, coneOffset;\n\nvarying vec3 f_position;\nvarying vec4 f_id;\n\nvoid main() {\n vec3 normal;\n vec3 XYZ = getConePosition(mat3(model) * ((vectorScale * coneScale) * vector.xyz), position.w, coneOffset, normal);\n vec4 conePosition = model * vec4(position.xyz, 1.0) + vec4(XYZ, 0.0);\n gl_Position = projection * view * conePosition;\n f_id = id;\n f_position = position.xyz;\n}\n"]),s=n(["precision highp float;\n#define GLSLIFY 1\n\nbool outOfRange(float a, float b, float p) {\n return ((p > max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nuniform vec3 clipBounds[2];\nuniform float pickId;\n\nvarying vec3 f_position;\nvarying vec4 f_id;\n\nvoid main() {\n if (outOfRange(clipBounds[0], clipBounds[1], f_position)) discard;\n\n gl_FragColor = vec4(pickId, f_id.xyz);\n}"]);e.meshShader={vertex:i,fragment:a,attributes:[{name:"position",type:"vec4"},{name:"color",type:"vec4"},{name:"uv",type:"vec2"},{name:"vector",type:"vec3"}]},e.pickShader={vertex:o,fragment:s,attributes:[{name:"position",type:"vec4"},{name:"id",type:"vec4"},{name:"vector",type:"vec3"}]}},1950:function(t){t.exports={0:"NONE",1:"ONE",2:"LINE_LOOP",3:"LINE_STRIP",4:"TRIANGLES",5:"TRIANGLE_STRIP",6:"TRIANGLE_FAN",256:"DEPTH_BUFFER_BIT",512:"NEVER",513:"LESS",514:"EQUAL",515:"LEQUAL",516:"GREATER",517:"NOTEQUAL",518:"GEQUAL",519:"ALWAYS",768:"SRC_COLOR",769:"ONE_MINUS_SRC_COLOR",770:"SRC_ALPHA",771:"ONE_MINUS_SRC_ALPHA",772:"DST_ALPHA",773:"ONE_MINUS_DST_ALPHA",774:"DST_COLOR",775:"ONE_MINUS_DST_COLOR",776:"SRC_ALPHA_SATURATE",1024:"STENCIL_BUFFER_BIT",1028:"FRONT",1029:"BACK",1032:"FRONT_AND_BACK",1280:"INVALID_ENUM",1281:"INVALID_VALUE",1282:"INVALID_OPERATION",1285:"OUT_OF_MEMORY",1286:"INVALID_FRAMEBUFFER_OPERATION",2304:"CW",2305:"CCW",2849:"LINE_WIDTH",2884:"CULL_FACE",2885:"CULL_FACE_MODE",2886:"FRONT_FACE",2928:"DEPTH_RANGE",2929:"DEPTH_TEST",2930:"DEPTH_WRITEMASK",2931:"DEPTH_CLEAR_VALUE",2932:"DEPTH_FUNC",2960:"STENCIL_TEST",2961:"STENCIL_CLEAR_VALUE",2962:"STENCIL_FUNC",2963:"STENCIL_VALUE_MASK",2964:"STENCIL_FAIL",2965:"STENCIL_PASS_DEPTH_FAIL",2966:"STENCIL_PASS_DEPTH_PASS",2967:"STENCIL_REF",2968:"STENCIL_WRITEMASK",2978:"VIEWPORT",3024:"DITHER",3042:"BLEND",3088:"SCISSOR_BOX",3089:"SCISSOR_TEST",3106:"COLOR_CLEAR_VALUE",3107:"COLOR_WRITEMASK",3317:"UNPACK_ALIGNMENT",3333:"PACK_ALIGNMENT",3379:"MAX_TEXTURE_SIZE",3386:"MAX_VIEWPORT_DIMS",3408:"SUBPIXEL_BITS",3410:"RED_BITS",3411:"GREEN_BITS",3412:"BLUE_BITS",3413:"ALPHA_BITS",3414:"DEPTH_BITS",3415:"STENCIL_BITS",3553:"TEXTURE_2D",4352:"DONT_CARE",4353:"FASTEST",4354:"NICEST",5120:"BYTE",5121:"UNSIGNED_BYTE",5122:"SHORT",5123:"UNSIGNED_SHORT",5124:"INT",5125:"UNSIGNED_INT",5126:"FLOAT",5386:"INVERT",5890:"TEXTURE",6401:"STENCIL_INDEX",6402:"DEPTH_COMPONENT",6406:"ALPHA",6407:"RGB",6408:"RGBA",6409:"LUMINANCE",6410:"LUMINANCE_ALPHA",7680:"KEEP",7681:"REPLACE",7682:"INCR",7683:"DECR",7936:"VENDOR",7937:"RENDERER",7938:"VERSION",9728:"NEAREST",9729:"LINEAR",9984:"NEAREST_MIPMAP_NEAREST",9985:"LINEAR_MIPMAP_NEAREST",9986:"NEAREST_MIPMAP_LINEAR",9987:"LINEAR_MIPMAP_LINEAR",10240:"TEXTURE_MAG_FILTER",10241:"TEXTURE_MIN_FILTER",10242:"TEXTURE_WRAP_S",10243:"TEXTURE_WRAP_T",10497:"REPEAT",10752:"POLYGON_OFFSET_UNITS",16384:"COLOR_BUFFER_BIT",32769:"CONSTANT_COLOR",32770:"ONE_MINUS_CONSTANT_COLOR",32771:"CONSTANT_ALPHA",32772:"ONE_MINUS_CONSTANT_ALPHA",32773:"BLEND_COLOR",32774:"FUNC_ADD",32777:"BLEND_EQUATION_RGB",32778:"FUNC_SUBTRACT",32779:"FUNC_REVERSE_SUBTRACT",32819:"UNSIGNED_SHORT_4_4_4_4",32820:"UNSIGNED_SHORT_5_5_5_1",32823:"POLYGON_OFFSET_FILL",32824:"POLYGON_OFFSET_FACTOR",32854:"RGBA4",32855:"RGB5_A1",32873:"TEXTURE_BINDING_2D",32926:"SAMPLE_ALPHA_TO_COVERAGE",32928:"SAMPLE_COVERAGE",32936:"SAMPLE_BUFFERS",32937:"SAMPLES",32938:"SAMPLE_COVERAGE_VALUE",32939:"SAMPLE_COVERAGE_INVERT",32968:"BLEND_DST_RGB",32969:"BLEND_SRC_RGB",32970:"BLEND_DST_ALPHA",32971:"BLEND_SRC_ALPHA",33071:"CLAMP_TO_EDGE",33170:"GENERATE_MIPMAP_HINT",33189:"DEPTH_COMPONENT16",33306:"DEPTH_STENCIL_ATTACHMENT",33635:"UNSIGNED_SHORT_5_6_5",33648:"MIRRORED_REPEAT",33901:"ALIASED_POINT_SIZE_RANGE",33902:"ALIASED_LINE_WIDTH_RANGE",33984:"TEXTURE0",33985:"TEXTURE1",33986:"TEXTURE2",33987:"TEXTURE3",33988:"TEXTURE4",33989:"TEXTURE5",33990:"TEXTURE6",33991:"TEXTURE7",33992:"TEXTURE8",33993:"TEXTURE9",33994:"TEXTURE10",33995:"TEXTURE11",33996:"TEXTURE12",33997:"TEXTURE13",33998:"TEXTURE14",33999:"TEXTURE15",34e3:"TEXTURE16",34001:"TEXTURE17",34002:"TEXTURE18",34003:"TEXTURE19",34004:"TEXTURE20",34005:"TEXTURE21",34006:"TEXTURE22",34007:"TEXTURE23",34008:"TEXTURE24",34009:"TEXTURE25",34010:"TEXTURE26",34011:"TEXTURE27",34012:"TEXTURE28",34013:"TEXTURE29",34014:"TEXTURE30",34015:"TEXTURE31",34016:"ACTIVE_TEXTURE",34024:"MAX_RENDERBUFFER_SIZE",34041:"DEPTH_STENCIL",34055:"INCR_WRAP",34056:"DECR_WRAP",34067:"TEXTURE_CUBE_MAP",34068:"TEXTURE_BINDING_CUBE_MAP",34069:"TEXTURE_CUBE_MAP_POSITIVE_X",34070:"TEXTURE_CUBE_MAP_NEGATIVE_X",34071:"TEXTURE_CUBE_MAP_POSITIVE_Y",34072:"TEXTURE_CUBE_MAP_NEGATIVE_Y",34073:"TEXTURE_CUBE_MAP_POSITIVE_Z",34074:"TEXTURE_CUBE_MAP_NEGATIVE_Z",34076:"MAX_CUBE_MAP_TEXTURE_SIZE",34338:"VERTEX_ATTRIB_ARRAY_ENABLED",34339:"VERTEX_ATTRIB_ARRAY_SIZE",34340:"VERTEX_ATTRIB_ARRAY_STRIDE",34341:"VERTEX_ATTRIB_ARRAY_TYPE",34342:"CURRENT_VERTEX_ATTRIB",34373:"VERTEX_ATTRIB_ARRAY_POINTER",34466:"NUM_COMPRESSED_TEXTURE_FORMATS",34467:"COMPRESSED_TEXTURE_FORMATS",34660:"BUFFER_SIZE",34661:"BUFFER_USAGE",34816:"STENCIL_BACK_FUNC",34817:"STENCIL_BACK_FAIL",34818:"STENCIL_BACK_PASS_DEPTH_FAIL",34819:"STENCIL_BACK_PASS_DEPTH_PASS",34877:"BLEND_EQUATION_ALPHA",34921:"MAX_VERTEX_ATTRIBS",34922:"VERTEX_ATTRIB_ARRAY_NORMALIZED",34930:"MAX_TEXTURE_IMAGE_UNITS",34962:"ARRAY_BUFFER",34963:"ELEMENT_ARRAY_BUFFER",34964:"ARRAY_BUFFER_BINDING",34965:"ELEMENT_ARRAY_BUFFER_BINDING",34975:"VERTEX_ATTRIB_ARRAY_BUFFER_BINDING",35040:"STREAM_DRAW",35044:"STATIC_DRAW",35048:"DYNAMIC_DRAW",35632:"FRAGMENT_SHADER",35633:"VERTEX_SHADER",35660:"MAX_VERTEX_TEXTURE_IMAGE_UNITS",35661:"MAX_COMBINED_TEXTURE_IMAGE_UNITS",35663:"SHADER_TYPE",35664:"FLOAT_VEC2",35665:"FLOAT_VEC3",35666:"FLOAT_VEC4",35667:"INT_VEC2",35668:"INT_VEC3",35669:"INT_VEC4",35670:"BOOL",35671:"BOOL_VEC2",35672:"BOOL_VEC3",35673:"BOOL_VEC4",35674:"FLOAT_MAT2",35675:"FLOAT_MAT3",35676:"FLOAT_MAT4",35678:"SAMPLER_2D",35680:"SAMPLER_CUBE",35712:"DELETE_STATUS",35713:"COMPILE_STATUS",35714:"LINK_STATUS",35715:"VALIDATE_STATUS",35716:"INFO_LOG_LENGTH",35717:"ATTACHED_SHADERS",35718:"ACTIVE_UNIFORMS",35719:"ACTIVE_UNIFORM_MAX_LENGTH",35720:"SHADER_SOURCE_LENGTH",35721:"ACTIVE_ATTRIBUTES",35722:"ACTIVE_ATTRIBUTE_MAX_LENGTH",35724:"SHADING_LANGUAGE_VERSION",35725:"CURRENT_PROGRAM",36003:"STENCIL_BACK_REF",36004:"STENCIL_BACK_VALUE_MASK",36005:"STENCIL_BACK_WRITEMASK",36006:"FRAMEBUFFER_BINDING",36007:"RENDERBUFFER_BINDING",36048:"FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE",36049:"FRAMEBUFFER_ATTACHMENT_OBJECT_NAME",36050:"FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL",36051:"FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE",36053:"FRAMEBUFFER_COMPLETE",36054:"FRAMEBUFFER_INCOMPLETE_ATTACHMENT",36055:"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT",36057:"FRAMEBUFFER_INCOMPLETE_DIMENSIONS",36061:"FRAMEBUFFER_UNSUPPORTED",36064:"COLOR_ATTACHMENT0",36096:"DEPTH_ATTACHMENT",36128:"STENCIL_ATTACHMENT",36160:"FRAMEBUFFER",36161:"RENDERBUFFER",36162:"RENDERBUFFER_WIDTH",36163:"RENDERBUFFER_HEIGHT",36164:"RENDERBUFFER_INTERNAL_FORMAT",36168:"STENCIL_INDEX8",36176:"RENDERBUFFER_RED_SIZE",36177:"RENDERBUFFER_GREEN_SIZE",36178:"RENDERBUFFER_BLUE_SIZE",36179:"RENDERBUFFER_ALPHA_SIZE",36180:"RENDERBUFFER_DEPTH_SIZE",36181:"RENDERBUFFER_STENCIL_SIZE",36194:"RGB565",36336:"LOW_FLOAT",36337:"MEDIUM_FLOAT",36338:"HIGH_FLOAT",36339:"LOW_INT",36340:"MEDIUM_INT",36341:"HIGH_INT",36346:"SHADER_COMPILER",36347:"MAX_VERTEX_UNIFORM_VECTORS",36348:"MAX_VARYING_VECTORS",36349:"MAX_FRAGMENT_UNIFORM_VECTORS",37440:"UNPACK_FLIP_Y_WEBGL",37441:"UNPACK_PREMULTIPLY_ALPHA_WEBGL",37442:"CONTEXT_LOST_WEBGL",37443:"UNPACK_COLORSPACE_CONVERSION_WEBGL",37444:"BROWSER_DEFAULT_WEBGL"}},6603:function(t,e,r){var n=r(1950);t.exports=function(t){return n[t]}},3110:function(t,e,r){"use strict";t.exports=function(t){var e=t.gl,r=n(e),o=i(e,[{buffer:r,type:e.FLOAT,size:3,offset:0,stride:40},{buffer:r,type:e.FLOAT,size:4,offset:12,stride:40},{buffer:r,type:e.FLOAT,size:3,offset:28,stride:40}]),l=a(e);l.attributes.position.location=0,l.attributes.color.location=1,l.attributes.offset.location=2;var u=new s(e,r,o,l);return u.update(t),u};var n=r(5827),i=r(2944),a=r(7667),o=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function s(t,e,r,n){this.gl=t,this.shader=n,this.buffer=e,this.vao=r,this.pixelRatio=1,this.bounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.lineWidth=[1,1,1],this.capSize=[10,10,10],this.lineCount=[0,0,0],this.lineOffset=[0,0,0],this.opacity=1,this.hasAlpha=!1}var l=s.prototype;function u(t,e){for(var r=0;r<3;++r)t[0][r]=Math.min(t[0][r],e[r]),t[1][r]=Math.max(t[1][r],e[r])}l.isOpaque=function(){return!this.hasAlpha},l.isTransparent=function(){return this.hasAlpha},l.drawTransparent=l.draw=function(t){var e=this.gl,r=this.shader.uniforms;this.shader.bind();var n=r.view=t.view||o,i=r.projection=t.projection||o;r.model=t.model||o,r.clipBounds=this.clipBounds,r.opacity=this.opacity;var a=n[12],s=n[13],l=n[14],u=n[15],c=(t._ortho?2:1)*this.pixelRatio*(i[3]*a+i[7]*s+i[11]*l+i[15]*u)/e.drawingBufferHeight;this.vao.bind();for(var f=0;f<3;++f)e.lineWidth(this.lineWidth[f]*this.pixelRatio),r.capSize=this.capSize[f]*c,this.lineCount[f]&&e.drawArrays(e.LINES,this.lineOffset[f],this.lineCount[f]);this.vao.unbind()};var c=function(){for(var t=new Array(3),e=0;e<3;++e){for(var r=[],n=1;n<=2;++n)for(var i=-1;i<=1;i+=2){var a=[0,0,0];a[(n+e)%3]=i,r.push(a)}t[e]=r}return t}();function f(t,e,r,n){for(var i=c[n],a=0;a0&&((p=c.slice())[s]+=d[1][s],i.push(c[0],c[1],c[2],v[0],v[1],v[2],v[3],0,0,0,p[0],p[1],p[2],v[0],v[1],v[2],v[3],0,0,0),u(this.bounds,p),o+=2+f(i,p,v,s)))}this.lineCount[s]=o-this.lineOffset[s]}this.buffer.update(i)}},l.dispose=function(){this.shader.dispose(),this.buffer.dispose(),this.vao.dispose()}},7667:function(t,e,r){"use strict";var n=r(6832),i=r(5158),a=n(["precision highp float;\n#define GLSLIFY 1\n\nattribute vec3 position, offset;\nattribute vec4 color;\nuniform mat4 model, view, projection;\nuniform float capSize;\nvarying vec4 fragColor;\nvarying vec3 fragPosition;\n\nvoid main() {\n vec4 worldPosition = model * vec4(position, 1.0);\n worldPosition = (worldPosition / worldPosition.w) + vec4(capSize * offset, 0.0);\n gl_Position = projection * view * worldPosition;\n fragColor = color;\n fragPosition = position;\n}"]),o=n(["precision highp float;\n#define GLSLIFY 1\n\nbool outOfRange(float a, float b, float p) {\n return ((p > max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nuniform vec3 clipBounds[2];\nuniform float opacity;\nvarying vec3 fragPosition;\nvarying vec4 fragColor;\n\nvoid main() {\n if (\n outOfRange(clipBounds[0], clipBounds[1], fragPosition) ||\n fragColor.a * opacity == 0.\n ) discard;\n\n gl_FragColor = opacity * fragColor;\n}"]);t.exports=function(t){return i(t,a,o,null,[{name:"position",type:"vec3"},{name:"color",type:"vec4"},{name:"offset",type:"vec3"}])}},4234:function(t,e,r){"use strict";var n=r(8931);t.exports=function(t,e,r,n){i||(i=t.FRAMEBUFFER_UNSUPPORTED,a=t.FRAMEBUFFER_INCOMPLETE_ATTACHMENT,o=t.FRAMEBUFFER_INCOMPLETE_DIMENSIONS,s=t.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT);var u=t.getExtension("WEBGL_draw_buffers");if(!l&&u&&function(t,e){var r=t.getParameter(e.MAX_COLOR_ATTACHMENTS_WEBGL);l=new Array(r+1);for(var n=0;n<=r;++n){for(var i=new Array(r),a=0;ac||r<0||r>c)throw new Error("gl-fbo: Parameters are too large for FBO");var f=1;if("color"in(n=n||{})){if((f=Math.max(0|n.color,0))<0)throw new Error("gl-fbo: Must specify a nonnegative number of colors");if(f>1){if(!u)throw new Error("gl-fbo: Multiple draw buffer extension not supported");if(f>t.getParameter(u.MAX_COLOR_ATTACHMENTS_WEBGL))throw new Error("gl-fbo: Context does not support "+f+" draw buffers")}}var h=t.UNSIGNED_BYTE,p=t.getExtension("OES_texture_float");if(n.float&&f>0){if(!p)throw new Error("gl-fbo: Context does not support floating point textures");h=t.FLOAT}else n.preferFloat&&f>0&&p&&(h=t.FLOAT);var v=!0;"depth"in n&&(v=!!n.depth);var g=!1;return"stencil"in n&&(g=!!n.stencil),new d(t,e,r,h,f,v,g,u)};var i,a,o,s,l=null;function u(t){return[t.getParameter(t.FRAMEBUFFER_BINDING),t.getParameter(t.RENDERBUFFER_BINDING),t.getParameter(t.TEXTURE_BINDING_2D)]}function c(t,e){t.bindFramebuffer(t.FRAMEBUFFER,e[0]),t.bindRenderbuffer(t.RENDERBUFFER,e[1]),t.bindTexture(t.TEXTURE_2D,e[2])}function f(t){switch(t){case i:throw new Error("gl-fbo: Framebuffer unsupported");case a:throw new Error("gl-fbo: Framebuffer incomplete attachment");case o:throw new Error("gl-fbo: Framebuffer incomplete dimensions");case s:throw new Error("gl-fbo: Framebuffer incomplete missing attachment");default:throw new Error("gl-fbo: Framebuffer failed for unspecified reason")}}function h(t,e,r,i,a,o){if(!i)return null;var s=n(t,e,r,a,i);return s.magFilter=t.NEAREST,s.minFilter=t.NEAREST,s.mipSamples=1,s.bind(),t.framebufferTexture2D(t.FRAMEBUFFER,o,t.TEXTURE_2D,s.handle,0),s}function p(t,e,r,n,i){var a=t.createRenderbuffer();return t.bindRenderbuffer(t.RENDERBUFFER,a),t.renderbufferStorage(t.RENDERBUFFER,n,e,r),t.framebufferRenderbuffer(t.FRAMEBUFFER,i,t.RENDERBUFFER,a),a}function d(t,e,r,n,i,a,o,s){this.gl=t,this._shape=[0|e,0|r],this._destroyed=!1,this._ext=s,this.color=new Array(i);for(var d=0;d1&&s.drawBuffersWEBGL(l[o]);var m=r.getExtension("WEBGL_depth_texture");m?d?t.depth=h(r,i,a,m.UNSIGNED_INT_24_8_WEBGL,r.DEPTH_STENCIL,r.DEPTH_STENCIL_ATTACHMENT):v&&(t.depth=h(r,i,a,r.UNSIGNED_SHORT,r.DEPTH_COMPONENT,r.DEPTH_ATTACHMENT)):v&&d?t._depth_rb=p(r,i,a,r.DEPTH_STENCIL,r.DEPTH_STENCIL_ATTACHMENT):v?t._depth_rb=p(r,i,a,r.DEPTH_COMPONENT16,r.DEPTH_ATTACHMENT):d&&(t._depth_rb=p(r,i,a,r.STENCIL_INDEX,r.STENCIL_ATTACHMENT));var x=r.checkFramebufferStatus(r.FRAMEBUFFER);if(x!==r.FRAMEBUFFER_COMPLETE){for(t._destroyed=!0,r.bindFramebuffer(r.FRAMEBUFFER,null),r.deleteFramebuffer(t.handle),t.handle=null,t.depth&&(t.depth.dispose(),t.depth=null),t._depth_rb&&(r.deleteRenderbuffer(t._depth_rb),t._depth_rb=null),y=0;yi||r<0||r>i)throw new Error("gl-fbo: Can't resize FBO, invalid dimensions");t._shape[0]=e,t._shape[1]=r;for(var a=u(n),o=0;o>8*p&255;this.pickOffset=r,i.bind();var d=i.uniforms;d.viewTransform=t,d.pickOffset=e,d.shape=this.shape;var v=i.attributes;return this.positionBuffer.bind(),v.position.pointer(),this.weightBuffer.bind(),v.weight.pointer(s.UNSIGNED_BYTE,!1),this.idBuffer.bind(),v.pickId.pointer(s.UNSIGNED_BYTE,!1),s.drawArrays(s.TRIANGLES,0,o),r+this.shape[0]*this.shape[1]}}}(),f.pick=function(t,e,r){var n=this.pickOffset,i=this.shape[0]*this.shape[1];if(r=n+i)return null;var a=r-n,o=this.xData,s=this.yData;return{object:this,pointId:a,dataCoord:[o[a%this.shape[0]],s[a/this.shape[0]|0]]}},f.update=function(t){var e=(t=t||{}).shape||[0,0],r=t.x||i(e[0]),o=t.y||i(e[1]),s=t.z||new Float32Array(e[0]*e[1]),l=!1!==t.zsmooth;this.xData=r,this.yData=o;var u,c,f,p,d=t.colorLevels||[0],v=t.colorValues||[0,0,0,1],g=d.length,y=this.bounds;l?(u=y[0]=r[0],c=y[1]=o[0],f=y[2]=r[r.length-1],p=y[3]=o[o.length-1]):(u=y[0]=r[0]+(r[1]-r[0])/2,c=y[1]=o[0]+(o[1]-o[0])/2,f=y[2]=r[r.length-1]+(r[r.length-1]-r[r.length-2])/2,p=y[3]=o[o.length-1]+(o[o.length-1]-o[o.length-2])/2);var m=1/(f-u),x=1/(p-c),b=e[0],_=e[1];this.shape=[b,_];var w=(l?(b-1)*(_-1):b*_)*(h.length>>>1);this.numVertices=w;for(var T=a.mallocUint8(4*w),k=a.mallocFloat32(2*w),A=a.mallocUint8(2*w),M=a.mallocUint32(w),S=0,E=l?b-1:b,L=l?_-1:_,C=0;C max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nuniform vec3 clipBounds[2];\nuniform sampler2D dashTexture;\nuniform float dashScale;\nuniform float opacity;\n\nvarying vec3 worldPosition;\nvarying float pixelArcLength;\nvarying vec4 fragColor;\n\nvoid main() {\n if (\n outOfRange(clipBounds[0], clipBounds[1], worldPosition) ||\n fragColor.a * opacity == 0.\n ) discard;\n\n float dashWeight = texture2D(dashTexture, vec2(dashScale * pixelArcLength, 0)).r;\n if(dashWeight < 0.5) {\n discard;\n }\n gl_FragColor = fragColor * opacity;\n}\n"]),s=n(["precision highp float;\n#define GLSLIFY 1\n\n#define FLOAT_MAX 1.70141184e38\n#define FLOAT_MIN 1.17549435e-38\n\n// https://github.com/mikolalysenko/glsl-read-float/blob/master/index.glsl\nvec4 packFloat(float v) {\n float av = abs(v);\n\n //Handle special cases\n if(av < FLOAT_MIN) {\n return vec4(0.0, 0.0, 0.0, 0.0);\n } else if(v > FLOAT_MAX) {\n return vec4(127.0, 128.0, 0.0, 0.0) / 255.0;\n } else if(v < -FLOAT_MAX) {\n return vec4(255.0, 128.0, 0.0, 0.0) / 255.0;\n }\n\n vec4 c = vec4(0,0,0,0);\n\n //Compute exponent and mantissa\n float e = floor(log2(av));\n float m = av * pow(2.0, -e) - 1.0;\n\n //Unpack mantissa\n c[1] = floor(128.0 * m);\n m -= c[1] / 128.0;\n c[2] = floor(32768.0 * m);\n m -= c[2] / 32768.0;\n c[3] = floor(8388608.0 * m);\n\n //Unpack exponent\n float ebias = e + 127.0;\n c[0] = floor(ebias / 2.0);\n ebias -= c[0] * 2.0;\n c[1] += floor(ebias) * 128.0;\n\n //Unpack sign bit\n c[0] += 128.0 * step(0.0, -v);\n\n //Scale back to range\n return c / 255.0;\n}\n\nbool outOfRange(float a, float b, float p) {\n return ((p > max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nuniform float pickId;\nuniform vec3 clipBounds[2];\n\nvarying vec3 worldPosition;\nvarying float pixelArcLength;\nvarying vec4 fragColor;\n\nvoid main() {\n if (outOfRange(clipBounds[0], clipBounds[1], worldPosition)) discard;\n\n gl_FragColor = vec4(pickId/255.0, packFloat(pixelArcLength).xyz);\n}"]),l=[{name:"position",type:"vec3"},{name:"nextPosition",type:"vec3"},{name:"arcLength",type:"float"},{name:"lineWidth",type:"float"},{name:"color",type:"vec4"}];e.createShader=function(t){return i(t,a,o,null,l)},e.createPickShader=function(t){return i(t,a,s,null,l)}},6086:function(t,e,r){"use strict";t.exports=function(t){var e=t.gl||t.scene&&t.scene.gl,r=f(e);r.attributes.position.location=0,r.attributes.nextPosition.location=1,r.attributes.arcLength.location=2,r.attributes.lineWidth.location=3,r.attributes.color.location=4;var o=h(e);o.attributes.position.location=0,o.attributes.nextPosition.location=1,o.attributes.arcLength.location=2,o.attributes.lineWidth.location=3,o.attributes.color.location=4;for(var s=n(e),l=i(e,[{buffer:s,size:3,offset:0,stride:48},{buffer:s,size:3,offset:12,stride:48},{buffer:s,size:1,offset:24,stride:48},{buffer:s,size:1,offset:28,stride:48},{buffer:s,size:4,offset:32,stride:48}]),c=u(new Array(1024),[256,1,4]),p=0;p<1024;++p)c.data[p]=255;var d=a(e,c);d.wrap=e.REPEAT;var v=new y(e,r,o,s,l,d);return v.update(t),v};var n=r(5827),i=r(2944),a=r(8931),o=new Uint8Array(4),s=new Float32Array(o.buffer),l=r(5070),u=r(5050),c=r(248),f=c.createShader,h=c.createPickShader,p=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function d(t,e){for(var r=0,n=0;n<3;++n){var i=t[n]-e[n];r+=i*i}return Math.sqrt(r)}function v(t){for(var e=[[-1e6,-1e6,-1e6],[1e6,1e6,1e6]],r=0;r<3;++r)e[0][r]=Math.max(t[0][r],e[0][r]),e[1][r]=Math.min(t[1][r],e[1][r]);return e}function g(t,e,r,n){this.arcLength=t,this.position=e,this.index=r,this.dataCoordinate=n}function y(t,e,r,n,i,a){this.gl=t,this.shader=e,this.pickShader=r,this.buffer=n,this.vao=i,this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.points=[],this.arcLength=[],this.vertexCount=0,this.bounds=[[0,0,0],[0,0,0]],this.pickId=0,this.lineWidth=1,this.texture=a,this.dashScale=1,this.opacity=1,this.hasAlpha=!1,this.dirty=!0,this.pixelRatio=1}var m=y.prototype;m.isTransparent=function(){return this.hasAlpha},m.isOpaque=function(){return!this.hasAlpha},m.pickSlots=1,m.setPickBase=function(t){this.pickId=t},m.drawTransparent=m.draw=function(t){if(this.vertexCount){var e=this.gl,r=this.shader,n=this.vao;r.bind(),r.uniforms={model:t.model||p,view:t.view||p,projection:t.projection||p,clipBounds:v(this.clipBounds),dashTexture:this.texture.bind(),dashScale:this.dashScale/this.arcLength[this.arcLength.length-1],opacity:this.opacity,screenShape:[e.drawingBufferWidth,e.drawingBufferHeight],pixelRatio:this.pixelRatio},n.bind(),n.draw(e.TRIANGLE_STRIP,this.vertexCount),n.unbind()}},m.drawPick=function(t){if(this.vertexCount){var e=this.gl,r=this.pickShader,n=this.vao;r.bind(),r.uniforms={model:t.model||p,view:t.view||p,projection:t.projection||p,pickId:this.pickId,clipBounds:v(this.clipBounds),screenShape:[e.drawingBufferWidth,e.drawingBufferHeight],pixelRatio:this.pixelRatio},n.bind(),n.draw(e.TRIANGLE_STRIP,this.vertexCount),n.unbind()}},m.update=function(t){var e,r;this.dirty=!0;var n=!!t.connectGaps;"dashScale"in t&&(this.dashScale=t.dashScale),this.hasAlpha=!1,"opacity"in t&&(this.opacity=+t.opacity,this.opacity<1&&(this.hasAlpha=!0));var i=[],a=[],o=[],s=0,c=0,f=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],h=t.position||t.positions;if(h){var p=t.color||t.colors||[0,0,0,1],v=t.lineWidth||1,g=!1;t:for(e=1;e0){for(var w=0;w<24;++w)i.push(i[i.length-12]);c+=2,g=!0}continue t}f[0][r]=Math.min(f[0][r],b[r],_[r]),f[1][r]=Math.max(f[1][r],b[r],_[r])}Array.isArray(p[0])?(y=p.length>e-1?p[e-1]:p.length>0?p[p.length-1]:[0,0,0,1],m=p.length>e?p[e]:p.length>0?p[p.length-1]:[0,0,0,1]):y=m=p,3===y.length&&(y=[y[0],y[1],y[2],1]),3===m.length&&(m=[m[0],m[1],m[2],1]),!this.hasAlpha&&y[3]<1&&(this.hasAlpha=!0),x=Array.isArray(v)?v.length>e-1?v[e-1]:v.length>0?v[v.length-1]:[0,0,0,1]:v;var T=s;if(s+=d(b,_),g){for(r=0;r<2;++r)i.push(b[0],b[1],b[2],_[0],_[1],_[2],T,x,y[0],y[1],y[2],y[3]);c+=2,g=!1}i.push(b[0],b[1],b[2],_[0],_[1],_[2],T,x,y[0],y[1],y[2],y[3],b[0],b[1],b[2],_[0],_[1],_[2],T,-x,y[0],y[1],y[2],y[3],_[0],_[1],_[2],b[0],b[1],b[2],s,-x,m[0],m[1],m[2],m[3],_[0],_[1],_[2],b[0],b[1],b[2],s,x,m[0],m[1],m[2],m[3]),c+=4}}if(this.buffer.update(i),a.push(s),o.push(h[h.length-1].slice()),this.bounds=f,this.vertexCount=c,this.points=o,this.arcLength=a,"dashes"in t){var k=t.dashes.slice();for(k.unshift(0),e=1;e1.0001)return null;y+=g[f]}return Math.abs(y-1)>.001?null:[h,s(t,g),g]}},2056:function(t,e,r){var n=r(6832),i=n(["precision highp float;\n#define GLSLIFY 1\n\nattribute vec3 position, normal;\nattribute vec4 color;\nattribute vec2 uv;\n\nuniform mat4 model\n , view\n , projection\n , inverseModel;\nuniform vec3 eyePosition\n , lightPosition;\n\nvarying vec3 f_normal\n , f_lightDirection\n , f_eyeDirection\n , f_data;\nvarying vec4 f_color;\nvarying vec2 f_uv;\n\nvec4 project(vec3 p) {\n return projection * view * model * vec4(p, 1.0);\n}\n\nvoid main() {\n gl_Position = project(position);\n\n //Lighting geometry parameters\n vec4 cameraCoordinate = view * vec4(position , 1.0);\n cameraCoordinate.xyz /= cameraCoordinate.w;\n f_lightDirection = lightPosition - cameraCoordinate.xyz;\n f_eyeDirection = eyePosition - cameraCoordinate.xyz;\n f_normal = normalize((vec4(normal, 0.0) * inverseModel).xyz);\n\n f_color = color;\n f_data = position;\n f_uv = uv;\n}\n"]),a=n(["#extension GL_OES_standard_derivatives : enable\n\nprecision highp float;\n#define GLSLIFY 1\n\nfloat beckmannDistribution(float x, float roughness) {\n float NdotH = max(x, 0.0001);\n float cos2Alpha = NdotH * NdotH;\n float tan2Alpha = (cos2Alpha - 1.0) / cos2Alpha;\n float roughness2 = roughness * roughness;\n float denom = 3.141592653589793 * roughness2 * cos2Alpha * cos2Alpha;\n return exp(tan2Alpha / roughness2) / denom;\n}\n\nfloat cookTorranceSpecular(\n vec3 lightDirection,\n vec3 viewDirection,\n vec3 surfaceNormal,\n float roughness,\n float fresnel) {\n\n float VdotN = max(dot(viewDirection, surfaceNormal), 0.0);\n float LdotN = max(dot(lightDirection, surfaceNormal), 0.0);\n\n //Half angle vector\n vec3 H = normalize(lightDirection + viewDirection);\n\n //Geometric term\n float NdotH = max(dot(surfaceNormal, H), 0.0);\n float VdotH = max(dot(viewDirection, H), 0.000001);\n float LdotH = max(dot(lightDirection, H), 0.000001);\n float G1 = (2.0 * NdotH * VdotN) / VdotH;\n float G2 = (2.0 * NdotH * LdotN) / LdotH;\n float G = min(1.0, min(G1, G2));\n \n //Distribution term\n float D = beckmannDistribution(NdotH, roughness);\n\n //Fresnel term\n float F = pow(1.0 - VdotN, fresnel);\n\n //Multiply terms and done\n return G * F * D / max(3.14159265 * VdotN, 0.000001);\n}\n\n//#pragma glslify: beckmann = require(glsl-specular-beckmann) // used in gl-surface3d\n\nbool outOfRange(float a, float b, float p) {\n return ((p > max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nuniform vec3 clipBounds[2];\nuniform float roughness\n , fresnel\n , kambient\n , kdiffuse\n , kspecular;\nuniform sampler2D texture;\n\nvarying vec3 f_normal\n , f_lightDirection\n , f_eyeDirection\n , f_data;\nvarying vec4 f_color;\nvarying vec2 f_uv;\n\nvoid main() {\n if (f_color.a == 0.0 ||\n outOfRange(clipBounds[0], clipBounds[1], f_data)\n ) discard;\n\n vec3 N = normalize(f_normal);\n vec3 L = normalize(f_lightDirection);\n vec3 V = normalize(f_eyeDirection);\n\n if(gl_FrontFacing) {\n N = -N;\n }\n\n float specular = min(1.0, max(0.0, cookTorranceSpecular(L, V, N, roughness, fresnel)));\n //float specular = max(0.0, beckmann(L, V, N, roughness)); // used in gl-surface3d\n\n float diffuse = min(kambient + kdiffuse * max(dot(N, L), 0.0), 1.0);\n\n vec4 surfaceColor = vec4(f_color.rgb, 1.0) * texture2D(texture, f_uv);\n vec4 litColor = surfaceColor.a * vec4(diffuse * surfaceColor.rgb + kspecular * vec3(1,1,1) * specular, 1.0);\n\n gl_FragColor = litColor * f_color.a;\n}\n"]),o=n(["precision highp float;\n#define GLSLIFY 1\n\nattribute vec3 position;\nattribute vec4 color;\nattribute vec2 uv;\n\nuniform mat4 model, view, projection;\n\nvarying vec4 f_color;\nvarying vec3 f_data;\nvarying vec2 f_uv;\n\nvoid main() {\n gl_Position = projection * view * model * vec4(position, 1.0);\n f_color = color;\n f_data = position;\n f_uv = uv;\n}"]),s=n(["precision highp float;\n#define GLSLIFY 1\n\nbool outOfRange(float a, float b, float p) {\n return ((p > max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nuniform vec3 clipBounds[2];\nuniform sampler2D texture;\nuniform float opacity;\n\nvarying vec4 f_color;\nvarying vec3 f_data;\nvarying vec2 f_uv;\n\nvoid main() {\n if (outOfRange(clipBounds[0], clipBounds[1], f_data)) discard;\n\n gl_FragColor = f_color * texture2D(texture, f_uv) * opacity;\n}"]),l=n(["precision highp float;\n#define GLSLIFY 1\n\nbool outOfRange(float a, float b, float p) {\n return ((p > max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nattribute vec3 position;\nattribute vec4 color;\nattribute vec2 uv;\nattribute float pointSize;\n\nuniform mat4 model, view, projection;\nuniform vec3 clipBounds[2];\n\nvarying vec4 f_color;\nvarying vec2 f_uv;\n\nvoid main() {\n if (outOfRange(clipBounds[0], clipBounds[1], position)) {\n\n gl_Position = vec4(0.0, 0.0 ,0.0 ,0.0);\n } else {\n gl_Position = projection * view * model * vec4(position, 1.0);\n }\n gl_PointSize = pointSize;\n f_color = color;\n f_uv = uv;\n}"]),u=n(["precision highp float;\n#define GLSLIFY 1\n\nuniform sampler2D texture;\nuniform float opacity;\n\nvarying vec4 f_color;\nvarying vec2 f_uv;\n\nvoid main() {\n vec2 pointR = gl_PointCoord.xy - vec2(0.5, 0.5);\n if(dot(pointR, pointR) > 0.25) {\n discard;\n }\n gl_FragColor = f_color * texture2D(texture, f_uv) * opacity;\n}"]),c=n(["precision highp float;\n#define GLSLIFY 1\n\nattribute vec3 position;\nattribute vec4 id;\n\nuniform mat4 model, view, projection;\n\nvarying vec3 f_position;\nvarying vec4 f_id;\n\nvoid main() {\n gl_Position = projection * view * model * vec4(position, 1.0);\n f_id = id;\n f_position = position;\n}"]),f=n(["precision highp float;\n#define GLSLIFY 1\n\nbool outOfRange(float a, float b, float p) {\n return ((p > max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nuniform vec3 clipBounds[2];\nuniform float pickId;\n\nvarying vec3 f_position;\nvarying vec4 f_id;\n\nvoid main() {\n if (outOfRange(clipBounds[0], clipBounds[1], f_position)) discard;\n\n gl_FragColor = vec4(pickId, f_id.xyz);\n}"]),h=n(["precision highp float;\n#define GLSLIFY 1\n\nbool outOfRange(float a, float b, float p) {\n return ((p > max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nattribute vec3 position;\nattribute float pointSize;\nattribute vec4 id;\n\nuniform mat4 model, view, projection;\nuniform vec3 clipBounds[2];\n\nvarying vec3 f_position;\nvarying vec4 f_id;\n\nvoid main() {\n if (outOfRange(clipBounds[0], clipBounds[1], position)) {\n\n gl_Position = vec4(0.0, 0.0, 0.0, 0.0);\n } else {\n gl_Position = projection * view * model * vec4(position, 1.0);\n gl_PointSize = pointSize;\n }\n f_id = id;\n f_position = position;\n}"]),p=n(["precision highp float;\n#define GLSLIFY 1\n\nattribute vec3 position;\n\nuniform mat4 model, view, projection;\n\nvoid main() {\n gl_Position = projection * view * model * vec4(position, 1.0);\n}"]),d=n(["precision highp float;\n#define GLSLIFY 1\n\nuniform vec3 contourColor;\n\nvoid main() {\n gl_FragColor = vec4(contourColor, 1.0);\n}\n"]);e.meshShader={vertex:i,fragment:a,attributes:[{name:"position",type:"vec3"},{name:"normal",type:"vec3"},{name:"color",type:"vec4"},{name:"uv",type:"vec2"}]},e.wireShader={vertex:o,fragment:s,attributes:[{name:"position",type:"vec3"},{name:"color",type:"vec4"},{name:"uv",type:"vec2"}]},e.pointShader={vertex:l,fragment:u,attributes:[{name:"position",type:"vec3"},{name:"color",type:"vec4"},{name:"uv",type:"vec2"},{name:"pointSize",type:"float"}]},e.pickShader={vertex:c,fragment:f,attributes:[{name:"position",type:"vec3"},{name:"id",type:"vec4"}]},e.pointPickShader={vertex:h,fragment:f,attributes:[{name:"position",type:"vec3"},{name:"pointSize",type:"float"},{name:"id",type:"vec4"}]},e.contourShader={vertex:p,fragment:d,attributes:[{name:"position",type:"vec3"}]}},8116:function(t,e,r){"use strict";var n=r(5158),i=r(5827),a=r(2944),o=r(8931),s=r(115),l=r(104),u=r(7437),c=r(5050),f=r(9156),h=r(7212),p=r(5306),d=r(2056),v=r(4340),g=d.meshShader,y=d.wireShader,m=d.pointShader,x=d.pickShader,b=d.pointPickShader,_=d.contourShader,w=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function T(t,e,r,n,i,a,o,s,l,u,c,f,h,p,d,v,g,y,m,x,b,_,T,k,A,M,S){this.gl=t,this.pixelRatio=1,this.cells=[],this.positions=[],this.intensity=[],this.texture=e,this.dirty=!0,this.triShader=r,this.lineShader=n,this.pointShader=i,this.pickShader=a,this.pointPickShader=o,this.contourShader=s,this.trianglePositions=l,this.triangleColors=c,this.triangleNormals=h,this.triangleUVs=f,this.triangleIds=u,this.triangleVAO=p,this.triangleCount=0,this.lineWidth=1,this.edgePositions=d,this.edgeColors=g,this.edgeUVs=y,this.edgeIds=v,this.edgeVAO=m,this.edgeCount=0,this.pointPositions=x,this.pointColors=_,this.pointUVs=T,this.pointSizes=k,this.pointIds=b,this.pointVAO=A,this.pointCount=0,this.contourLineWidth=1,this.contourPositions=M,this.contourVAO=S,this.contourCount=0,this.contourColor=[0,0,0],this.contourEnable=!0,this.pickVertex=!0,this.pickId=1,this.bounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.lightPosition=[1e5,1e5,0],this.ambientLight=.8,this.diffuseLight=.8,this.specularLight=2,this.roughness=.5,this.fresnel=1.5,this.opacity=1,this.hasAlpha=!1,this.opacityscale=!1,this._model=w,this._view=w,this._projection=w,this._resolution=[1,1]}var k=T.prototype;function A(t,e){if(!e)return 1;if(!e.length)return 1;for(var r=0;rt&&r>0){var n=(e[r][0]-t)/(e[r][0]-e[r-1][0]);return e[r][1]*(1-n)+n*e[r-1][1]}}return 1}function M(t){var e=n(t,m.vertex,m.fragment);return e.attributes.position.location=0,e.attributes.color.location=2,e.attributes.uv.location=3,e.attributes.pointSize.location=4,e}function S(t){var e=n(t,x.vertex,x.fragment);return e.attributes.position.location=0,e.attributes.id.location=1,e}function E(t){var e=n(t,b.vertex,b.fragment);return e.attributes.position.location=0,e.attributes.id.location=1,e.attributes.pointSize.location=4,e}function L(t){var e=n(t,_.vertex,_.fragment);return e.attributes.position.location=0,e}k.isOpaque=function(){return!this.hasAlpha},k.isTransparent=function(){return this.hasAlpha},k.pickSlots=1,k.setPickBase=function(t){this.pickId=t},k.highlight=function(t){if(t&&this.contourEnable){for(var e=h(this.cells,this.intensity,t.intensity),r=e.cells,n=e.vertexIds,i=e.vertexWeights,a=r.length,o=p.mallocFloat32(6*a),s=0,l=0;l0&&((f=this.triShader).bind(),f.uniforms=s,this.triangleVAO.bind(),e.drawArrays(e.TRIANGLES,0,3*this.triangleCount),this.triangleVAO.unbind()),this.edgeCount>0&&this.lineWidth>0&&((f=this.lineShader).bind(),f.uniforms=s,this.edgeVAO.bind(),e.lineWidth(this.lineWidth*this.pixelRatio),e.drawArrays(e.LINES,0,2*this.edgeCount),this.edgeVAO.unbind()),this.pointCount>0&&((f=this.pointShader).bind(),f.uniforms=s,this.pointVAO.bind(),e.drawArrays(e.POINTS,0,this.pointCount),this.pointVAO.unbind()),this.contourEnable&&this.contourCount>0&&this.contourLineWidth>0&&((f=this.contourShader).bind(),f.uniforms=s,this.contourVAO.bind(),e.drawArrays(e.LINES,0,this.contourCount),this.contourVAO.unbind())},k.drawPick=function(t){t=t||{};for(var e=this.gl,r=t.model||w,n=t.view||w,i=t.projection||w,a=[[-1e6,-1e6,-1e6],[1e6,1e6,1e6]],o=0;o<3;++o)a[0][o]=Math.max(a[0][o],this.clipBounds[0][o]),a[1][o]=Math.min(a[1][o],this.clipBounds[1][o]);this._model=[].slice.call(r),this._view=[].slice.call(n),this._projection=[].slice.call(i),this._resolution=[e.drawingBufferWidth,e.drawingBufferHeight];var s,l={model:r,view:n,projection:i,clipBounds:a,pickId:this.pickId/255};(s=this.pickShader).bind(),s.uniforms=l,this.triangleCount>0&&(this.triangleVAO.bind(),e.drawArrays(e.TRIANGLES,0,3*this.triangleCount),this.triangleVAO.unbind()),this.edgeCount>0&&(this.edgeVAO.bind(),e.lineWidth(this.lineWidth*this.pixelRatio),e.drawArrays(e.LINES,0,2*this.edgeCount),this.edgeVAO.unbind()),this.pointCount>0&&((s=this.pointPickShader).bind(),s.uniforms=l,this.pointVAO.bind(),e.drawArrays(e.POINTS,0,this.pointCount),this.pointVAO.unbind())},k.pick=function(t){if(!t)return null;if(t.id!==this.pickId)return null;for(var e=t.value[0]+256*t.value[1]+65536*t.value[2],r=this.cells[e],n=this.positions,i=new Array(r.length),a=0;ai[k]&&(r.uniforms.dataAxis=u,r.uniforms.screenOffset=c,r.uniforms.color=g[t],r.uniforms.angle=y[t],a.drawArrays(a.TRIANGLES,i[k],i[A]-i[k]))),m[t]&&T&&(c[1^t]-=M*p*x[t],r.uniforms.dataAxis=f,r.uniforms.screenOffset=c,r.uniforms.color=b[t],r.uniforms.angle=_[t],a.drawArrays(a.TRIANGLES,w,T)),c[1^t]=M*s[2+(1^t)]-1,d[t+2]&&(c[1^t]+=M*p*v[t+2],ki[k]&&(r.uniforms.dataAxis=u,r.uniforms.screenOffset=c,r.uniforms.color=g[t+2],r.uniforms.angle=y[t+2],a.drawArrays(a.TRIANGLES,i[k],i[A]-i[k]))),m[t+2]&&T&&(c[1^t]+=M*p*x[t+2],r.uniforms.dataAxis=f,r.uniforms.screenOffset=c,r.uniforms.color=b[t+2],r.uniforms.angle=_[t+2],a.drawArrays(a.TRIANGLES,w,T))}),v.drawTitle=function(){var t=[0,0],e=[0,0];return function(){var r=this.plot,n=this.shader,i=r.gl,a=r.screenBox,o=r.titleCenter,s=r.titleAngle,l=r.titleColor,u=r.pixelRatio;if(this.titleCount){for(var c=0;c<2;++c)e[c]=2*(o[c]*u-a[c])/(a[2+c]-a[c])-1;n.bind(),n.uniforms.dataAxis=t,n.uniforms.screenOffset=e,n.uniforms.angle=s,n.uniforms.color=l,i.drawArrays(i.TRIANGLES,this.titleOffset,this.titleCount)}}}(),v.bind=(h=[0,0],p=[0,0],d=[0,0],function(){var t=this.plot,e=this.shader,r=t._tickBounds,n=t.dataBox,i=t.screenBox,a=t.viewBox;e.bind();for(var o=0;o<2;++o){var s=r[o],l=r[o+2]-s,u=.5*(n[o+2]+n[o]),c=n[o+2]-n[o],f=a[o],v=a[o+2]-f,g=i[o],y=i[o+2]-g;p[o]=2*l/c*v/y,h[o]=2*(s-u)/c*v/y}d[1]=2*t.pixelRatio/(i[3]-i[1]),d[0]=d[1]*(i[3]-i[1])/(i[2]-i[0]),e.uniforms.dataScale=p,e.uniforms.dataShift=h,e.uniforms.textScale=d,this.vbo.bind(),e.attributes.textCoordinate.pointer()}),v.update=function(t){var e,r,n,i,o,s=[],l=t.ticks,u=t.bounds;for(o=0;o<2;++o){var c=[Math.floor(s.length/3)],f=[-1/0],h=l[o];for(e=0;e=0){var v=e[d]-n[d]*(e[d+2]-e[d])/(n[d+2]-n[d]);0===d?o.drawLine(v,e[1],v,e[3],p[d],h[d]):o.drawLine(e[0],v,e[2],v,p[d],h[d])}}for(d=0;d=0;--t)this.objects[t].dispose();for(this.objects.length=0,t=this.overlays.length-1;t>=0;--t)this.overlays[t].dispose();this.overlays.length=0,this.gl=null},u.addObject=function(t){this.objects.indexOf(t)<0&&(this.objects.push(t),this.setDirty())},u.removeObject=function(t){for(var e=this.objects,r=0;rMath.abs(e))u.rotate(a,0,0,-t*r*Math.PI*d.rotateSpeed/window.innerWidth);else if(!d._ortho){var o=-d.zoomSpeed*i*e/window.innerHeight*(a-u.lastT())/20;u.pan(a,0,0,f*(Math.exp(o)-1))}}}),!0)},d.enableMouseListeners(),d};var n=r(8161),i=r(1152),a=r(6145),o=r(6475),s=r(2565),l=r(5233)},8245:function(t,e,r){var n=r(6832),i=r(5158),a=n(["precision mediump float;\n#define GLSLIFY 1\nattribute vec2 position;\nvarying vec2 uv;\nvoid main() {\n uv = position;\n gl_Position = vec4(position, 0, 1);\n}"]),o=n(["precision mediump float;\n#define GLSLIFY 1\n\nuniform sampler2D accumBuffer;\nvarying vec2 uv;\n\nvoid main() {\n vec4 accum = texture2D(accumBuffer, 0.5 * (uv + 1.0));\n gl_FragColor = min(vec4(1,1,1,1), accum);\n}"]);t.exports=function(t){return i(t,a,o,null,[{name:"position",type:"vec2"}])}},1059:function(t,e,r){"use strict";var n=r(4296),i=r(7453),a=r(2771),o=r(6496),s=r(2611),l=r(4234),u=r(8126),c=r(6145),f=r(1120),h=r(5268),p=r(8245),d=r(2321)({tablet:!0,featureDetect:!0});function v(){this.mouse=[-1,-1],this.screen=null,this.distance=1/0,this.index=null,this.dataCoordinate=null,this.dataPosition=null,this.object=null,this.data=null}function g(t){var e=Math.round(Math.log(Math.abs(t))/Math.log(10));if(e<0){var r=Math.round(Math.pow(10,-e));return Math.ceil(t*r)/r}return e>0?(r=Math.round(Math.pow(10,e)),Math.ceil(t/r)*r):Math.ceil(t)}function y(t){return"boolean"!=typeof t||t}t.exports={createScene:function(t){(t=t||{}).camera=t.camera||{};var e=t.canvas;e||(e=document.createElement("canvas"),t.container?t.container.appendChild(e):document.body.appendChild(e));var r=t.gl;if(r||(t.glOptions&&(d=!!t.glOptions.preserveDrawingBuffer),r=function(t,e){var r=null;try{(r=t.getContext("webgl",e))||(r=t.getContext("experimental-webgl",e))}catch(t){return null}return r}(e,t.glOptions||{premultipliedAlpha:!0,antialias:!0,preserveDrawingBuffer:d})),!r)throw new Error("webgl not supported");var m=t.bounds||[[-10,-10,-10],[10,10,10]],x=new v,b=l(r,r.drawingBufferWidth,r.drawingBufferHeight,{preferFloat:!d}),_=p(r),w=t.cameraObject&&!0===t.cameraObject._ortho||t.camera.projection&&"orthographic"===t.camera.projection.type||!1,T={eye:t.camera.eye||[2,0,0],center:t.camera.center||[0,0,0],up:t.camera.up||[0,1,0],zoomMin:t.camera.zoomMax||.1,zoomMax:t.camera.zoomMin||100,mode:t.camera.mode||"turntable",_ortho:w},k=t.axes||{},A=i(r,k);A.enable=!k.disable;var M=t.spikes||{},S=o(r,M),E=[],L=[],C=[],P=[],O=!0,I=!0,D={view:null,projection:new Array(16),model:new Array(16),_ortho:!1},z=(I=!0,[r.drawingBufferWidth,r.drawingBufferHeight]),R=t.cameraObject||n(e,T),F={gl:r,contextLost:!1,pixelRatio:t.pixelRatio||1,canvas:e,selection:x,camera:R,axes:A,axesPixels:null,spikes:S,bounds:m,objects:E,shape:z,aspect:t.aspectRatio||[1,1,1],pickRadius:t.pickRadius||10,zNear:t.zNear||.01,zFar:t.zFar||1e3,fovy:t.fovy||Math.PI/4,clearColor:t.clearColor||[0,0,0,0],autoResize:y(t.autoResize),autoBounds:y(t.autoBounds),autoScale:!!t.autoScale,autoCenter:y(t.autoCenter),clipToBounds:y(t.clipToBounds),snapToData:!!t.snapToData,onselect:t.onselect||null,onrender:t.onrender||null,onclick:t.onclick||null,cameraParams:D,oncontextloss:null,mouseListener:null,_stopped:!1,getAspectratio:function(){return{x:this.aspect[0],y:this.aspect[1],z:this.aspect[2]}},setAspectratio:function(t){this.aspect[0]=t.x,this.aspect[1]=t.y,this.aspect[2]=t.z,I=!0},setBounds:function(t,e){this.bounds[0][t]=e.min,this.bounds[1][t]=e.max},setClearColor:function(t){this.clearColor=t},clearRGBA:function(){this.gl.clearColor(this.clearColor[0],this.clearColor[1],this.clearColor[2],this.clearColor[3]),this.gl.clear(this.gl.COLOR_BUFFER_BIT|this.gl.DEPTH_BUFFER_BIT)}},B=[r.drawingBufferWidth/F.pixelRatio|0,r.drawingBufferHeight/F.pixelRatio|0];function N(){if(!F._stopped&&F.autoResize){var t=e.parentNode,r=1,n=1;t&&t!==document.body?(r=t.clientWidth,n=t.clientHeight):(r=window.innerWidth,n=window.innerHeight);var i=0|Math.ceil(r*F.pixelRatio),a=0|Math.ceil(n*F.pixelRatio);if(i!==e.width||a!==e.height){e.width=i,e.height=a;var o=e.style;o.position=o.position||"absolute",o.left="0px",o.top="0px",o.width=r+"px",o.height=n+"px",O=!0}}}function j(){for(var t=E.length,e=P.length,n=0;n0&&0===C[e-1];)C.pop(),P.pop().dispose()}function U(){if(F.contextLost)return!0;r.isContextLost()&&(F.contextLost=!0,F.mouseListener.enabled=!1,F.selection.object=null,F.oncontextloss&&F.oncontextloss())}F.autoResize&&N(),window.addEventListener("resize",N),F.update=function(t){F._stopped||(t=t||{},O=!0,I=!0)},F.add=function(t){F._stopped||(t.axes=A,E.push(t),L.push(-1),O=!0,I=!0,j())},F.remove=function(t){if(!F._stopped){var e=E.indexOf(t);e<0||(E.splice(e,1),L.pop(),O=!0,I=!0,j())}},F.dispose=function(){if(!F._stopped&&(F._stopped=!0,window.removeEventListener("resize",N),e.removeEventListener("webglcontextlost",U),F.mouseListener.enabled=!1,!F.contextLost)){A.dispose(),S.dispose();for(var t=0;tx.distance)continue;for(var u=0;u 1.0) {\n discard;\n }\n baseColor = mix(borderColor, color, step(radius, centerFraction));\n gl_FragColor = vec4(baseColor.rgb * baseColor.a, baseColor.a);\n }\n}\n"]),e.pickVertex=n(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec2 position;\nattribute vec4 pickId;\n\nuniform mat3 matrix;\nuniform float pointSize;\nuniform vec4 pickOffset;\n\nvarying vec4 fragId;\n\nvoid main() {\n vec3 hgPosition = matrix * vec3(position, 1);\n gl_Position = vec4(hgPosition.xy, 0, hgPosition.z);\n gl_PointSize = pointSize;\n\n vec4 id = pickId + pickOffset;\n id.y += floor(id.x / 256.0);\n id.x -= floor(id.x / 256.0) * 256.0;\n\n id.z += floor(id.y / 256.0);\n id.y -= floor(id.y / 256.0) * 256.0;\n\n id.w += floor(id.z / 256.0);\n id.z -= floor(id.z / 256.0) * 256.0;\n\n fragId = id;\n}\n"]),e.pickFragment=n(["precision mediump float;\n#define GLSLIFY 1\n\nvarying vec4 fragId;\n\nvoid main() {\n float radius = length(2.0 * gl_PointCoord.xy - 1.0);\n if(radius > 1.0) {\n discard;\n }\n gl_FragColor = fragId / 255.0;\n}\n"])},8271:function(t,e,r){"use strict";var n=r(5158),i=r(5827),a=r(5306),o=r(8023);function s(t,e,r,n,i){this.plot=t,this.offsetBuffer=e,this.pickBuffer=r,this.shader=n,this.pickShader=i,this.sizeMin=.5,this.sizeMinCap=2,this.sizeMax=20,this.areaRatio=1,this.pointCount=0,this.color=[1,0,0,1],this.borderColor=[0,0,0,1],this.blend=!1,this.pickOffset=0,this.points=null}t.exports=function(t,e){var r=t.gl,a=new s(t,i(r),i(r),n(r,o.pointVertex,o.pointFragment),n(r,o.pickVertex,o.pickFragment));return a.update(e),t.addObject(a),a};var l,u,c=s.prototype;c.dispose=function(){this.shader.dispose(),this.pickShader.dispose(),this.offsetBuffer.dispose(),this.pickBuffer.dispose(),this.plot.removeObject(this)},c.update=function(t){var e;function r(e,r){return e in t?t[e]:r}t=t||{},this.sizeMin=r("sizeMin",.5),this.sizeMax=r("sizeMax",20),this.color=r("color",[1,0,0,1]).slice(),this.areaRatio=r("areaRatio",1),this.borderColor=r("borderColor",[0,0,0,1]).slice(),this.blend=r("blend",!1);var n=t.positions.length>>>1,i=t.positions instanceof Float32Array,o=t.idToIndex instanceof Int32Array&&t.idToIndex.length>=n,s=t.positions,l=i?s:a.mallocFloat32(s.length),u=o?t.idToIndex:a.mallocInt32(n);if(i||l.set(s),!o)for(l.set(s),e=0;e>>1;for(r=0;r=e[0]&&a<=e[2]&&o>=e[1]&&o<=e[3]&&n++}return n}(this.points,i),c=this.plot.pickPixelRatio*Math.max(Math.min(this.sizeMinCap,this.sizeMin),Math.min(this.sizeMax,this.sizeMax/Math.pow(s,.33333)));l[0]=2/a,l[4]=2/o,l[6]=-2*i[0]/a-1,l[7]=-2*i[1]/o-1,this.offsetBuffer.bind(),r.bind(),r.attributes.position.pointer(),r.uniforms.matrix=l,r.uniforms.color=this.color,r.uniforms.borderColor=this.borderColor,r.uniforms.pointCloud=c<5,r.uniforms.pointSize=c,r.uniforms.centerFraction=Math.min(1,Math.max(0,Math.sqrt(1-this.areaRatio))),e&&(u[0]=255&t,u[1]=t>>8&255,u[2]=t>>16&255,u[3]=t>>24&255,this.pickBuffer.bind(),r.attributes.pickId.pointer(n.UNSIGNED_BYTE),r.uniforms.pickOffset=u,this.pickOffset=t);var f=n.getParameter(n.BLEND),h=n.getParameter(n.DITHER);return f&&!this.blend&&n.disable(n.BLEND),h&&n.disable(n.DITHER),n.drawArrays(n.POINTS,0,this.pointCount),f&&!this.blend&&n.enable(n.BLEND),h&&n.enable(n.DITHER),t+this.pointCount}),c.draw=c.unifiedDraw,c.drawPick=c.unifiedDraw,c.pick=function(t,e,r){var n=this.pickOffset,i=this.pointCount;if(r=n+i)return null;var a=r-n,o=this.points;return{object:this,pointId:a,dataCoord:[o[2*a],o[2*a+1]]}}},6093:function(t){t.exports=function(t,e,r,n){var i,a,o,s,l,u=e[0],c=e[1],f=e[2],h=e[3],p=r[0],d=r[1],v=r[2],g=r[3];return(a=u*p+c*d+f*v+h*g)<0&&(a=-a,p=-p,d=-d,v=-v,g=-g),1-a>1e-6?(i=Math.acos(a),o=Math.sin(i),s=Math.sin((1-n)*i)/o,l=Math.sin(n*i)/o):(s=1-n,l=n),t[0]=s*u+l*p,t[1]=s*c+l*d,t[2]=s*f+l*v,t[3]=s*h+l*g,t}},8240:function(t){"use strict";t.exports=function(t){return t||0===t?t.toString():""}},4123:function(t,e,r){"use strict";var n=r(875);t.exports=function(t,e,r){var a=i[e];if(a||(a=i[e]={}),t in a)return a[t];var o={textAlign:"center",textBaseline:"middle",lineHeight:1,font:e,lineSpacing:1.25,styletags:{breaklines:!0,bolds:!0,italics:!0,subscripts:!0,superscripts:!0},triangles:!0},s=n(t,o);o.triangles=!1;var l,u,c=n(t,o);if(r&&1!==r){for(l=0;l max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nattribute vec3 position;\nattribute vec4 color;\nattribute vec2 glyph;\nattribute vec4 id;\n\nuniform vec4 highlightId;\nuniform float highlightScale;\nuniform mat4 model, view, projection;\nuniform vec3 clipBounds[2];\n\nvarying vec4 interpColor;\nvarying vec4 pickId;\nvarying vec3 dataCoordinate;\n\nvoid main() {\n if (outOfRange(clipBounds[0], clipBounds[1], position)) {\n\n gl_Position = vec4(0,0,0,0);\n } else {\n float scale = 1.0;\n if(distance(highlightId, id) < 0.0001) {\n scale = highlightScale;\n }\n\n vec4 worldPosition = model * vec4(position, 1);\n vec4 viewPosition = view * worldPosition;\n viewPosition = viewPosition / viewPosition.w;\n vec4 clipPosition = projection * (viewPosition + scale * vec4(glyph.x, -glyph.y, 0, 0));\n\n gl_Position = clipPosition;\n interpColor = color;\n pickId = id;\n dataCoordinate = position;\n }\n}"]),o=i(["precision highp float;\n#define GLSLIFY 1\n\nbool outOfRange(float a, float b, float p) {\n return ((p > max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nattribute vec3 position;\nattribute vec4 color;\nattribute vec2 glyph;\nattribute vec4 id;\n\nuniform mat4 model, view, projection;\nuniform vec2 screenSize;\nuniform vec3 clipBounds[2];\nuniform float highlightScale, pixelRatio;\nuniform vec4 highlightId;\n\nvarying vec4 interpColor;\nvarying vec4 pickId;\nvarying vec3 dataCoordinate;\n\nvoid main() {\n if (outOfRange(clipBounds[0], clipBounds[1], position)) {\n\n gl_Position = vec4(0,0,0,0);\n } else {\n float scale = pixelRatio;\n if(distance(highlightId.bgr, id.bgr) < 0.001) {\n scale *= highlightScale;\n }\n\n vec4 worldPosition = model * vec4(position, 1.0);\n vec4 viewPosition = view * worldPosition;\n vec4 clipPosition = projection * viewPosition;\n clipPosition /= clipPosition.w;\n\n gl_Position = clipPosition + vec4(screenSize * scale * vec2(glyph.x, -glyph.y), 0.0, 0.0);\n interpColor = color;\n pickId = id;\n dataCoordinate = position;\n }\n}"]),s=i(["precision highp float;\n#define GLSLIFY 1\n\nbool outOfRange(float a, float b, float p) {\n return ((p > max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nattribute vec3 position;\nattribute vec4 color;\nattribute vec2 glyph;\nattribute vec4 id;\n\nuniform float highlightScale;\nuniform vec4 highlightId;\nuniform vec3 axes[2];\nuniform mat4 model, view, projection;\nuniform vec2 screenSize;\nuniform vec3 clipBounds[2];\nuniform float scale, pixelRatio;\n\nvarying vec4 interpColor;\nvarying vec4 pickId;\nvarying vec3 dataCoordinate;\n\nvoid main() {\n if (outOfRange(clipBounds[0], clipBounds[1], position)) {\n\n gl_Position = vec4(0,0,0,0);\n } else {\n float lscale = pixelRatio * scale;\n if(distance(highlightId, id) < 0.0001) {\n lscale *= highlightScale;\n }\n\n vec4 clipCenter = projection * view * model * vec4(position, 1);\n vec3 dataPosition = position + 0.5*lscale*(axes[0] * glyph.x + axes[1] * glyph.y) * clipCenter.w * screenSize.y;\n vec4 clipPosition = projection * view * model * vec4(dataPosition, 1);\n\n gl_Position = clipPosition;\n interpColor = color;\n pickId = id;\n dataCoordinate = dataPosition;\n }\n}\n"]),l=i(["precision highp float;\n#define GLSLIFY 1\n\nbool outOfRange(float a, float b, float p) {\n return ((p > max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nuniform vec3 fragClipBounds[2];\nuniform float opacity;\n\nvarying vec4 interpColor;\nvarying vec3 dataCoordinate;\n\nvoid main() {\n if (\n outOfRange(fragClipBounds[0], fragClipBounds[1], dataCoordinate) ||\n interpColor.a * opacity == 0.\n ) discard;\n gl_FragColor = interpColor * opacity;\n}\n"]),u=i(["precision highp float;\n#define GLSLIFY 1\n\nbool outOfRange(float a, float b, float p) {\n return ((p > max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nuniform vec3 fragClipBounds[2];\nuniform float pickGroup;\n\nvarying vec4 pickId;\nvarying vec3 dataCoordinate;\n\nvoid main() {\n if (outOfRange(fragClipBounds[0], fragClipBounds[1], dataCoordinate)) discard;\n\n gl_FragColor = vec4(pickGroup, pickId.bgr);\n}"]),c=[{name:"position",type:"vec3"},{name:"color",type:"vec4"},{name:"glyph",type:"vec2"},{name:"id",type:"vec4"}],f={vertex:a,fragment:l,attributes:c},h={vertex:o,fragment:l,attributes:c},p={vertex:s,fragment:l,attributes:c},d={vertex:a,fragment:u,attributes:c},v={vertex:o,fragment:u,attributes:c},g={vertex:s,fragment:u,attributes:c};function y(t,e){var r=n(t,e),i=r.attributes;return i.position.location=0,i.color.location=1,i.glyph.location=2,i.id.location=3,r}e.createPerspective=function(t){return y(t,f)},e.createOrtho=function(t){return y(t,h)},e.createProject=function(t){return y(t,p)},e.createPickPerspective=function(t){return y(t,d)},e.createPickOrtho=function(t){return y(t,v)},e.createPickProject=function(t){return y(t,g)}},2182:function(t,e,r){"use strict";var n=r(3596),i=r(5827),a=r(2944),o=r(5306),s=r(104),l=r(9282),u=r(4123),c=r(8240),f=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function h(t,e){var r=t[0],n=t[1],i=t[2],a=t[3];return t[0]=e[0]*r+e[4]*n+e[8]*i+e[12]*a,t[1]=e[1]*r+e[5]*n+e[9]*i+e[13]*a,t[2]=e[2]*r+e[6]*n+e[10]*i+e[14]*a,t[3]=e[3]*r+e[7]*n+e[11]*i+e[15]*a,t}function p(t,e,r,n){return h(n,n),h(n,n),h(n,n)}function d(t,e){this.index=t,this.dataCoordinate=this.position=e}function v(t){return!0===t||t>1?1:t}function g(t,e,r,n,i,a,o,s,l,u,c,f){this.gl=t,this.pixelRatio=1,this.shader=e,this.orthoShader=r,this.projectShader=n,this.pointBuffer=i,this.colorBuffer=a,this.glyphBuffer=o,this.idBuffer=s,this.vao=l,this.vertexCount=0,this.lineVertexCount=0,this.opacity=1,this.hasAlpha=!1,this.lineWidth=0,this.projectScale=[2/3,2/3,2/3],this.projectOpacity=[1,1,1],this.projectHasAlpha=!1,this.pickId=0,this.pickPerspectiveShader=u,this.pickOrthoShader=c,this.pickProjectShader=f,this.points=[],this._selectResult=new d(0,[0,0,0]),this.useOrtho=!0,this.bounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.axesProject=[!0,!0,!0],this.axesBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.highlightId=[1,1,1,1],this.highlightScale=2,this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.dirty=!0}t.exports=function(t){var e=t.gl,r=l.createPerspective(e),n=l.createOrtho(e),o=l.createProject(e),s=l.createPickPerspective(e),u=l.createPickOrtho(e),c=l.createPickProject(e),f=i(e),h=i(e),p=i(e),d=i(e),v=new g(e,r,n,o,f,h,p,d,a(e,[{buffer:f,size:3,type:e.FLOAT},{buffer:h,size:4,type:e.FLOAT},{buffer:p,size:2,type:e.FLOAT},{buffer:d,size:4,type:e.UNSIGNED_BYTE,normalized:!0}]),s,u,c);return v.update(t),v};var y=g.prototype;y.pickSlots=1,y.setPickBase=function(t){this.pickId=t},y.isTransparent=function(){if(this.hasAlpha)return!0;for(var t=0;t<3;++t)if(this.axesProject[t]&&this.projectHasAlpha)return!0;return!1},y.isOpaque=function(){if(!this.hasAlpha)return!0;for(var t=0;t<3;++t)if(this.axesProject[t]&&!this.projectHasAlpha)return!0;return!1};var m=[0,0],x=[0,0,0],b=[0,0,0],_=[0,0,0,1],w=[0,0,0,1],T=f.slice(),k=[0,0,0],A=[[0,0,0],[0,0,0]];function M(t){return t[0]=t[1]=t[2]=0,t}function S(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=1,t}function E(t,e,r,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[r]=n,t}var L=[[-1e8,-1e8,-1e8],[1e8,1e8,1e8]];function C(t,e,r,n,i,a,o){var l=r.gl;if((a===r.projectHasAlpha||o)&&function(t,e,r,n){var i,a=e.axesProject,o=e.gl,l=t.uniforms,u=r.model||f,c=r.view||f,h=r.projection||f,d=e.axesBounds,v=function(t){for(var e=A,r=0;r<2;++r)for(var n=0;n<3;++n)e[r][n]=Math.max(Math.min(t[r][n],1e8),-1e8);return e}(e.clipBounds);i=e.axes&&e.axes.lastCubeProps?e.axes.lastCubeProps.axis:[1,1,1],m[0]=2/o.drawingBufferWidth,m[1]=2/o.drawingBufferHeight,t.bind(),l.view=c,l.projection=h,l.screenSize=m,l.highlightId=e.highlightId,l.highlightScale=e.highlightScale,l.clipBounds=v,l.pickGroup=e.pickId/255,l.pixelRatio=n;for(var g=0;g<3;++g)if(a[g]){l.scale=e.projectScale[g],l.opacity=e.projectOpacity[g];for(var y=T,L=0;L<16;++L)y[L]=0;for(L=0;L<4;++L)y[5*L]=1;y[5*g]=0,i[g]<0?y[12+g]=d[0][g]:y[12+g]=d[1][g],s(y,u,y),l.model=y;var C=(g+1)%3,P=(g+2)%3,O=M(x),I=M(b);O[C]=1,I[P]=1;var D=p(0,0,0,S(_,O)),z=p(0,0,0,S(w,I));if(Math.abs(D[1])>Math.abs(z[1])){var R=D;D=z,z=R,R=O,O=I,I=R;var F=C;C=P,P=F}D[0]<0&&(O[C]=-1),z[1]>0&&(I[P]=-1);var B=0,N=0;for(L=0;L<4;++L)B+=Math.pow(u[4*C+L],2),N+=Math.pow(u[4*P+L],2);O[C]/=Math.sqrt(B),I[P]/=Math.sqrt(N),l.axes[0]=O,l.axes[1]=I,l.fragClipBounds[0]=E(k,v[0],g,-1e8),l.fragClipBounds[1]=E(k,v[1],g,1e8),e.vao.bind(),e.vao.draw(o.TRIANGLES,e.vertexCount),e.lineWidth>0&&(o.lineWidth(e.lineWidth*n),e.vao.draw(o.LINES,e.lineVertexCount,e.vertexCount)),e.vao.unbind()}}(e,r,n,i),a===r.hasAlpha||o){t.bind();var u=t.uniforms;u.model=n.model||f,u.view=n.view||f,u.projection=n.projection||f,m[0]=2/l.drawingBufferWidth,m[1]=2/l.drawingBufferHeight,u.screenSize=m,u.highlightId=r.highlightId,u.highlightScale=r.highlightScale,u.fragClipBounds=L,u.clipBounds=r.axes.bounds,u.opacity=r.opacity,u.pickGroup=r.pickId/255,u.pixelRatio=i,r.vao.bind(),r.vao.draw(l.TRIANGLES,r.vertexCount),r.lineWidth>0&&(l.lineWidth(r.lineWidth*i),r.vao.draw(l.LINES,r.lineVertexCount,r.vertexCount)),r.vao.unbind()}}function P(t,e,r,i){var a;a=Array.isArray(t)?e=this.pointCount||e<0)return null;var r=this.points[e],n=this._selectResult;n.index=e;for(var i=0;i<3;++i)n.position[i]=n.dataCoordinate[i]=r[i];return n},y.highlight=function(t){if(t){var e=t.index,r=255&e,n=e>>8&255,i=e>>16&255;this.highlightId=[r/255,n/255,i/255,0]}else this.highlightId=[1,1,1,1]},y.update=function(t){if("perspective"in(t=t||{})&&(this.useOrtho=!t.perspective),"orthographic"in t&&(this.useOrtho=!!t.orthographic),"lineWidth"in t&&(this.lineWidth=t.lineWidth),"project"in t)if(Array.isArray(t.project))this.axesProject=t.project;else{var e=!!t.project;this.axesProject=[e,e,e]}if("projectScale"in t)if(Array.isArray(t.projectScale))this.projectScale=t.projectScale.slice();else{var r=+t.projectScale;this.projectScale=[r,r,r]}if(this.projectHasAlpha=!1,"projectOpacity"in t){Array.isArray(t.projectOpacity)?this.projectOpacity=t.projectOpacity.slice():(r=+t.projectOpacity,this.projectOpacity=[r,r,r]);for(var n=0;n<3;++n)this.projectOpacity[n]=v(this.projectOpacity[n]),this.projectOpacity[n]<1&&(this.projectHasAlpha=!0)}this.hasAlpha=!1,"opacity"in t&&(this.opacity=v(t.opacity),this.opacity<1&&(this.hasAlpha=!0)),this.dirty=!0;var i,a,s=t.position,l=t.font||"normal",u=t.alignment||[0,0];if(2===u.length)i=u[0],a=u[1];else for(i=[],a=[],n=0;n0){var I=0,D=x,z=[0,0,0,1],R=[0,0,0,1],F=Array.isArray(p)&&Array.isArray(p[0]),B=Array.isArray(y)&&Array.isArray(y[0]);t:for(n=0;n<_;++n){for(m+=1,w=s[n],T=0;T<3;++T){if(isNaN(w[T])||!isFinite(w[T]))continue t;f[T]=Math.max(f[T],w[T]),c[T]=Math.min(c[T],w[T])}k=(N=P(h,n,l,this.pixelRatio)).mesh,A=N.lines,M=N.bounds;var N,j=N.visible;if(j)if(Array.isArray(p)){if(3===(U=F?n0?1-M[0][0]:Z<0?1+M[1][0]:1,Y*=Y>0?1-M[0][1]:Y<0?1+M[1][1]:1],X=k.cells||[],J=k.positions||[];for(T=0;T0){var y=r*c;o.drawBox(f-y,h-y,p+y,h+y,a),o.drawBox(f-y,d-y,p+y,d+y,a),o.drawBox(f-y,h-y,f+y,d+y,a),o.drawBox(p-y,h-y,p+y,d+y,a)}}}},s.update=function(t){t=t||{},this.innerFill=!!t.innerFill,this.outerFill=!!t.outerFill,this.innerColor=(t.innerColor||[0,0,0,.5]).slice(),this.outerColor=(t.outerColor||[0,0,0,.5]).slice(),this.borderColor=(t.borderColor||[0,0,0,1]).slice(),this.borderWidth=t.borderWidth||0,this.selectBox=(t.selectBox||this.selectBox).slice()},s.dispose=function(){this.boxBuffer.dispose(),this.boxShader.dispose(),this.plot.removeOverlay(this)}},2611:function(t,e,r){"use strict";t.exports=function(t,e){var r=e[0],a=e[1];return new l(t,n(t,r,a,{}),i.mallocUint8(r*a*4))};var n=r(4234),i=r(5306),a=r(5050),o=r(2288).nextPow2;function s(t,e,r,n,i){this.coord=[t,e],this.id=r,this.value=n,this.distance=i}function l(t,e,r){this.gl=t,this.fbo=e,this.buffer=r,this._readTimeout=null;var n=this;this._readCallback=function(){n.gl&&(e.bind(),t.readPixels(0,0,e.shape[0],e.shape[1],t.RGBA,t.UNSIGNED_BYTE,n.buffer),n._readTimeout=null)}}var u=l.prototype;Object.defineProperty(u,"shape",{get:function(){return this.gl?this.fbo.shape.slice():[0,0]},set:function(t){if(this.gl){this.fbo.shape=t;var e=this.fbo.shape[0],r=this.fbo.shape[1];if(r*e*4>this.buffer.length){i.free(this.buffer);for(var n=this.buffer=i.mallocUint8(o(r*e*4)),a=0;ar)for(t=r;te)for(t=e;t=0){for(var T=0|w.type.charAt(w.type.length-1),k=new Array(T),A=0;A=0;)M+=1;_[m]=M}var S=new Array(r.length);function E(){h.program=o.program(p,h._vref,h._fref,b,_);for(var t=0;t=0){if((d=h.charCodeAt(h.length-1)-48)<2||d>4)throw new n("","Invalid data type for attribute "+f+": "+h);s(t,e,p[0],i,d,a,f)}else{if(!(h.indexOf("mat")>=0))throw new n("","Unknown data type for attribute "+f+": "+h);var d;if((d=h.charCodeAt(h.length-1)-48)<2||d>4)throw new n("","Invalid data type for attribute "+f+": "+h);l(t,e,p,i,d,a,f)}}}return a};var n=r(9068);function i(t,e,r,n,i,a){this._gl=t,this._wrapper=e,this._index=r,this._locations=n,this._dimension=i,this._constFunc=a}var a=i.prototype;a.pointer=function(t,e,r,n){var i=this,a=i._gl,o=i._locations[i._index];a.vertexAttribPointer(o,i._dimension,t||a.FLOAT,!!e,r||0,n||0),a.enableVertexAttribArray(o)},a.set=function(t,e,r,n){return this._constFunc(this._locations[this._index],t,e,r,n)},Object.defineProperty(a,"location",{get:function(){return this._locations[this._index]},set:function(t){return t!==this._locations[this._index]&&(this._locations[this._index]=0|t,this._wrapper.program=null),0|t}});var o=[function(t,e,r){return void 0===r.length?t.vertexAttrib1f(e,r):t.vertexAttrib1fv(e,r)},function(t,e,r,n){return void 0===r.length?t.vertexAttrib2f(e,r,n):t.vertexAttrib2fv(e,r)},function(t,e,r,n,i){return void 0===r.length?t.vertexAttrib3f(e,r,n,i):t.vertexAttrib3fv(e,r)},function(t,e,r,n,i,a){return void 0===r.length?t.vertexAttrib4f(e,r,n,i,a):t.vertexAttrib4fv(e,r)}];function s(t,e,r,n,a,s,l){var u=o[a],c=new i(t,e,r,n,a,u);Object.defineProperty(s,l,{set:function(e){return t.disableVertexAttribArray(n[r]),u(t,n[r],e),e},get:function(){return c},enumerable:!0})}function l(t,e,r,n,i,a,o){for(var l=new Array(i),u=new Array(i),c=0;c4)throw new i("","Invalid uniform dimension type for matrix "+name+": "+m);t["uniformMatrix"+y+"fv"](s[f],!1,h);break}throw new i("","Unknown uniform data type for "+name+": "+m)}if((y=m.charCodeAt(m.length-1)-48)<2||y>4)throw new i("","Invalid data type");switch(m.charAt(0)){case"b":case"i":t["uniform"+y+"iv"](s[f],h);break;case"v":t["uniform"+y+"fv"](s[f],h);break;default:throw new i("","Unrecognized data type for vector "+name+": "+m)}}}}}}function u(t,e){if("object"!=typeof e)return[[t,e]];var r=[];for(var n in e){var i=e[n],a=t;parseInt(n)+""===n?a+="["+n+"]":a+="."+n,"object"==typeof i?r.push.apply(r,u(a,i)):r.push([a,i])}return r}function c(t,e,n){if("object"==typeof n){var u=f(n);Object.defineProperty(t,e,{get:a(u),set:l(n),enumerable:!0,configurable:!1})}else s[n]?Object.defineProperty(t,e,{get:(c=n,function(t,e,r){return t.getUniform(e.program,r[c])}),set:l(n),enumerable:!0,configurable:!1}):t[e]=function(t){switch(t){case"bool":return!1;case"int":case"sampler2D":case"samplerCube":case"float":return 0;default:var e=t.indexOf("vec");if(0<=e&&e<=1&&t.length===4+e){if((r=t.charCodeAt(t.length-1)-48)<2||r>4)throw new i("","Invalid data type");return"b"===t.charAt(0)?o(r,!1):o(r,0)}if(0===t.indexOf("mat")&&4===t.length){var r;if((r=t.charCodeAt(t.length-1)-48)<2||r>4)throw new i("","Invalid uniform dimension type for matrix "+name+": "+t);return o(r*r,0)}throw new i("","Unknown uniform data type for "+name+": "+t)}}(r[n].type);var c}function f(t){var e;if(Array.isArray(t)){e=new Array(t.length);for(var r=0;r1){s[0]in a||(a[s[0]]=[]),a=a[s[0]];for(var l=1;l1)for(var l=0;l 0 U ||b|| > 0.\n // Assign z = 0, x = -b, y = a:\n // a*-b + b*a + c*0 = -ba + ba + 0 = 0\n if (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\n return normalize(vec3(-v.y, v.x, 0.0));\n } else {\n return normalize(vec3(0.0, v.z, -v.y));\n }\n}\n\n// Calculate the tube vertex and normal at the given index.\n//\n// The returned vertex is for a tube ring with its center at origin, radius of length(d), pointing in the direction of d.\n//\n// Each tube segment is made up of a ring of vertices.\n// These vertices are used to make up the triangles of the tube by connecting them together in the vertex array.\n// The indexes of tube segments run from 0 to 8.\n//\nvec3 getTubePosition(vec3 d, float index, out vec3 normal) {\n float segmentCount = 8.0;\n\n float angle = 2.0 * 3.14159 * (index / segmentCount);\n\n vec3 u = getOrthogonalVector(d);\n vec3 v = normalize(cross(u, d));\n\n vec3 x = u * cos(angle) * length(d);\n vec3 y = v * sin(angle) * length(d);\n vec3 v3 = x + y;\n\n normal = normalize(v3);\n\n return v3;\n}\n\nattribute vec4 vector;\nattribute vec4 color, position;\nattribute vec2 uv;\n\nuniform float vectorScale, tubeScale;\nuniform mat4 model, view, projection, inverseModel;\nuniform vec3 eyePosition, lightPosition;\n\nvarying vec3 f_normal, f_lightDirection, f_eyeDirection, f_data, f_position;\nvarying vec4 f_color;\nvarying vec2 f_uv;\n\nvoid main() {\n // Scale the vector magnitude to stay constant with\n // model & view changes.\n vec3 normal;\n vec3 XYZ = getTubePosition(mat3(model) * (tubeScale * vector.w * normalize(vector.xyz)), position.w, normal);\n vec4 tubePosition = model * vec4(position.xyz, 1.0) + vec4(XYZ, 0.0);\n\n //Lighting geometry parameters\n vec4 cameraCoordinate = view * tubePosition;\n cameraCoordinate.xyz /= cameraCoordinate.w;\n f_lightDirection = lightPosition - cameraCoordinate.xyz;\n f_eyeDirection = eyePosition - cameraCoordinate.xyz;\n f_normal = normalize((vec4(normal, 0.0) * inverseModel).xyz);\n\n // vec4 m_position = model * vec4(tubePosition, 1.0);\n vec4 t_position = view * tubePosition;\n gl_Position = projection * t_position;\n\n f_color = color;\n f_data = tubePosition.xyz;\n f_position = position.xyz;\n f_uv = uv;\n}\n"]),a=n(["#extension GL_OES_standard_derivatives : enable\n\nprecision highp float;\n#define GLSLIFY 1\n\nfloat beckmannDistribution(float x, float roughness) {\n float NdotH = max(x, 0.0001);\n float cos2Alpha = NdotH * NdotH;\n float tan2Alpha = (cos2Alpha - 1.0) / cos2Alpha;\n float roughness2 = roughness * roughness;\n float denom = 3.141592653589793 * roughness2 * cos2Alpha * cos2Alpha;\n return exp(tan2Alpha / roughness2) / denom;\n}\n\nfloat cookTorranceSpecular(\n vec3 lightDirection,\n vec3 viewDirection,\n vec3 surfaceNormal,\n float roughness,\n float fresnel) {\n\n float VdotN = max(dot(viewDirection, surfaceNormal), 0.0);\n float LdotN = max(dot(lightDirection, surfaceNormal), 0.0);\n\n //Half angle vector\n vec3 H = normalize(lightDirection + viewDirection);\n\n //Geometric term\n float NdotH = max(dot(surfaceNormal, H), 0.0);\n float VdotH = max(dot(viewDirection, H), 0.000001);\n float LdotH = max(dot(lightDirection, H), 0.000001);\n float G1 = (2.0 * NdotH * VdotN) / VdotH;\n float G2 = (2.0 * NdotH * LdotN) / LdotH;\n float G = min(1.0, min(G1, G2));\n \n //Distribution term\n float D = beckmannDistribution(NdotH, roughness);\n\n //Fresnel term\n float F = pow(1.0 - VdotN, fresnel);\n\n //Multiply terms and done\n return G * F * D / max(3.14159265 * VdotN, 0.000001);\n}\n\nbool outOfRange(float a, float b, float p) {\n return ((p > max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nuniform vec3 clipBounds[2];\nuniform float roughness, fresnel, kambient, kdiffuse, kspecular, opacity;\nuniform sampler2D texture;\n\nvarying vec3 f_normal, f_lightDirection, f_eyeDirection, f_data, f_position;\nvarying vec4 f_color;\nvarying vec2 f_uv;\n\nvoid main() {\n if (outOfRange(clipBounds[0], clipBounds[1], f_position)) discard;\n vec3 N = normalize(f_normal);\n vec3 L = normalize(f_lightDirection);\n vec3 V = normalize(f_eyeDirection);\n\n if(gl_FrontFacing) {\n N = -N;\n }\n\n float specular = min(1.0, max(0.0, cookTorranceSpecular(L, V, N, roughness, fresnel)));\n float diffuse = min(kambient + kdiffuse * max(dot(N, L), 0.0), 1.0);\n\n vec4 surfaceColor = f_color * texture2D(texture, f_uv);\n vec4 litColor = surfaceColor.a * vec4(diffuse * surfaceColor.rgb + kspecular * vec3(1,1,1) * specular, 1.0);\n\n gl_FragColor = litColor * opacity;\n}\n"]),o=n(["precision highp float;\n\nprecision highp float;\n#define GLSLIFY 1\n\nvec3 getOrthogonalVector(vec3 v) {\n // Return up-vector for only-z vector.\n // Return ax + by + cz = 0, a point that lies on the plane that has v as a normal and that isn't (0,0,0).\n // From the above if-statement we have ||a|| > 0 U ||b|| > 0.\n // Assign z = 0, x = -b, y = a:\n // a*-b + b*a + c*0 = -ba + ba + 0 = 0\n if (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\n return normalize(vec3(-v.y, v.x, 0.0));\n } else {\n return normalize(vec3(0.0, v.z, -v.y));\n }\n}\n\n// Calculate the tube vertex and normal at the given index.\n//\n// The returned vertex is for a tube ring with its center at origin, radius of length(d), pointing in the direction of d.\n//\n// Each tube segment is made up of a ring of vertices.\n// These vertices are used to make up the triangles of the tube by connecting them together in the vertex array.\n// The indexes of tube segments run from 0 to 8.\n//\nvec3 getTubePosition(vec3 d, float index, out vec3 normal) {\n float segmentCount = 8.0;\n\n float angle = 2.0 * 3.14159 * (index / segmentCount);\n\n vec3 u = getOrthogonalVector(d);\n vec3 v = normalize(cross(u, d));\n\n vec3 x = u * cos(angle) * length(d);\n vec3 y = v * sin(angle) * length(d);\n vec3 v3 = x + y;\n\n normal = normalize(v3);\n\n return v3;\n}\n\nattribute vec4 vector;\nattribute vec4 position;\nattribute vec4 id;\n\nuniform mat4 model, view, projection;\nuniform float tubeScale;\n\nvarying vec3 f_position;\nvarying vec4 f_id;\n\nvoid main() {\n vec3 normal;\n vec3 XYZ = getTubePosition(mat3(model) * (tubeScale * vector.w * normalize(vector.xyz)), position.w, normal);\n vec4 tubePosition = model * vec4(position.xyz, 1.0) + vec4(XYZ, 0.0);\n\n gl_Position = projection * view * tubePosition;\n f_id = id;\n f_position = position.xyz;\n}\n"]),s=n(["precision highp float;\n#define GLSLIFY 1\n\nbool outOfRange(float a, float b, float p) {\n return ((p > max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nuniform vec3 clipBounds[2];\nuniform float pickId;\n\nvarying vec3 f_position;\nvarying vec4 f_id;\n\nvoid main() {\n if (outOfRange(clipBounds[0], clipBounds[1], f_position)) discard;\n\n gl_FragColor = vec4(pickId, f_id.xyz);\n}"]);e.meshShader={vertex:i,fragment:a,attributes:[{name:"position",type:"vec4"},{name:"color",type:"vec4"},{name:"uv",type:"vec2"},{name:"vector",type:"vec4"}]},e.pickShader={vertex:o,fragment:s,attributes:[{name:"position",type:"vec4"},{name:"id",type:"vec4"},{name:"vector",type:"vec4"}]}},7307:function(t,e,r){"use strict";var n=r(2858),i=r(4020),a=["xyz","xzy","yxz","yzx","zxy","zyx"],o=function(t,e){var r,n=t.length;for(r=0;re)return r-1}return r},s=function(t,e,r){return tr?r:t},l=function(t){var e=1/0;t.sort((function(t,e){return t-e}));for(var r=t.length,n=1;nf-1||m>h-1||x>p-1)return n.create();var b,_,w,T,k,A,M=a[0][d],S=a[0][y],E=a[1][v],L=a[1][m],C=a[2][g],P=(l-M)/(S-M),O=(u-E)/(L-E),I=(c-C)/(a[2][x]-C);switch(isFinite(P)||(P=.5),isFinite(O)||(O=.5),isFinite(I)||(I=.5),r.reversedX&&(d=f-1-d,y=f-1-y),r.reversedY&&(v=h-1-v,m=h-1-m),r.reversedZ&&(g=p-1-g,x=p-1-x),r.filled){case 5:k=g,A=x,w=v*p,T=m*p,b=d*p*h,_=y*p*h;break;case 4:k=g,A=x,b=d*p,_=y*p,w=v*p*f,T=m*p*f;break;case 3:w=v,T=m,k=g*h,A=x*h,b=d*h*p,_=y*h*p;break;case 2:w=v,T=m,b=d*h,_=y*h,k=g*h*f,A=x*h*f;break;case 1:b=d,_=y,k=g*f,A=x*f,w=v*f*p,T=m*f*p;break;default:b=d,_=y,w=v*f,T=m*f,k=g*f*h,A=x*f*h}var D=i[b+w+k],z=i[b+w+A],R=i[b+T+k],F=i[b+T+A],B=i[_+w+k],N=i[_+w+A],j=i[_+T+k],U=i[_+T+A],V=n.create(),H=n.create(),q=n.create(),G=n.create();n.lerp(V,D,B,P),n.lerp(H,z,N,P),n.lerp(q,R,j,P),n.lerp(G,F,U,P);var Z=n.create(),Y=n.create();n.lerp(Z,V,q,O),n.lerp(Y,H,G,O);var W=n.create();return n.lerp(W,Z,Y,I),W}(e,t,p)},v=t.getDivergence||function(t,e){var r=n.create(),i=1e-4;n.add(r,t,[i,0,0]);var a=d(r);n.subtract(a,a,e),n.scale(a,a,1/i),n.add(r,t,[0,i,0]);var o=d(r);n.subtract(o,o,e),n.scale(o,o,1/i),n.add(r,t,[0,0,i]);var s=d(r);return n.subtract(s,s,e),n.scale(s,s,1/i),n.add(r,a,o),n.add(r,r,s),r},g=[],y=e[0][0],m=e[0][1],x=e[0][2],b=e[1][0],_=e[1][1],w=e[1][2],T=function(t){var e=t[0],r=t[1],n=t[2];return!(eb||r_||nw)},k=10*n.distance(e[0],e[1])/u,A=k*k,M=1,S=0,E=r.length;E>1&&(M=function(t){for(var e=[],r=[],n=[],i={},a={},o={},s=t.length,u=0;uS&&(S=F),z.push(F),g.push({points:P,velocities:O,divergences:z});for(var B=0;B<100*u&&P.lengthA&&n.scale(N,N,k/Math.sqrt(j)),n.add(N,N,C),I=d(N),n.squaredDistance(D,N)-A>-1e-4*A&&(P.push(N),D=N,O.push(I),R=v(N,I),F=n.length(R),isFinite(F)&&F>S&&(S=F),z.push(F)),C=N}}var U=function(t,e,r,a){for(var o=0,s=0;s0)for(T=0;T<8;T++){var k=(T+1)%8;u.push(h[T],p[T],p[k],p[k],h[k],h[T]),f.push(m,y,y,y,m,m),d.push(v,g,g,g,v,v);var A=u.length;c.push([A-6,A-5,A-4],[A-3,A-2,A-1])}var M=h;h=p,p=M;var S=m;m=y,y=S;var E=v;v=g,g=E}return{positions:u,cells:c,vectors:f,vertexIntensity:d}}(t,r,a,o)})),f=[],h=[],p=[],d=[];for(s=0;s max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nuniform vec3 lowerBound, upperBound;\nuniform float contourTint;\nuniform vec4 contourColor;\nuniform sampler2D colormap;\nuniform vec3 clipBounds[2];\nuniform float roughness, fresnel, kambient, kdiffuse, kspecular, opacity;\nuniform float vertexColor;\n\nvarying float value, kill;\nvarying vec3 worldCoordinate;\nvarying vec3 lightDirection, eyeDirection, surfaceNormal;\nvarying vec4 vColor;\n\nvoid main() {\n if (\n kill > 0.0 ||\n vColor.a == 0.0 ||\n outOfRange(clipBounds[0], clipBounds[1], worldCoordinate)\n ) discard;\n\n vec3 N = normalize(surfaceNormal);\n vec3 V = normalize(eyeDirection);\n vec3 L = normalize(lightDirection);\n\n if(gl_FrontFacing) {\n N = -N;\n }\n\n float specular = max(beckmannSpecular(L, V, N, roughness), 0.);\n float diffuse = min(kambient + kdiffuse * max(dot(N, L), 0.0), 1.0);\n\n //decide how to interpolate color — in vertex or in fragment\n vec4 surfaceColor =\n step(vertexColor, .5) * texture2D(colormap, vec2(value, value)) +\n step(.5, vertexColor) * vColor;\n\n vec4 litColor = surfaceColor.a * vec4(diffuse * surfaceColor.rgb + kspecular * vec3(1,1,1) * specular, 1.0);\n\n gl_FragColor = mix(litColor, contourColor, contourTint) * opacity;\n}\n"]),s=i(["precision highp float;\n#define GLSLIFY 1\n\nattribute vec4 uv;\nattribute float f;\n\nuniform vec3 objectOffset;\nuniform mat3 permutation;\nuniform mat4 model, view, projection;\nuniform float height, zOffset;\nuniform sampler2D colormap;\n\nvarying float value, kill;\nvarying vec3 worldCoordinate;\nvarying vec2 planeCoordinate;\nvarying vec3 lightDirection, eyeDirection, surfaceNormal;\nvarying vec4 vColor;\n\nvoid main() {\n vec3 dataCoordinate = permutation * vec3(uv.xy, height);\n worldCoordinate = objectOffset + dataCoordinate;\n vec4 worldPosition = model * vec4(worldCoordinate, 1.0);\n\n vec4 clipPosition = projection * view * worldPosition;\n clipPosition.z += zOffset;\n\n gl_Position = clipPosition;\n value = f + objectOffset.z;\n kill = -1.0;\n planeCoordinate = uv.zw;\n\n vColor = texture2D(colormap, vec2(value, value));\n\n //Don't do lighting for contours\n surfaceNormal = vec3(1,0,0);\n eyeDirection = vec3(0,1,0);\n lightDirection = vec3(0,0,1);\n}\n"]),l=i(["precision highp float;\n#define GLSLIFY 1\n\nbool outOfRange(float a, float b, float p) {\n return ((p > max(a, b)) || \n (p < min(a, b)));\n}\n\nbool outOfRange(vec2 a, vec2 b, vec2 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y));\n}\n\nbool outOfRange(vec3 a, vec3 b, vec3 p) {\n return (outOfRange(a.x, b.x, p.x) ||\n outOfRange(a.y, b.y, p.y) ||\n outOfRange(a.z, b.z, p.z));\n}\n\nbool outOfRange(vec4 a, vec4 b, vec4 p) {\n return outOfRange(a.xyz, b.xyz, p.xyz);\n}\n\nuniform vec2 shape;\nuniform vec3 clipBounds[2];\nuniform float pickId;\n\nvarying float value, kill;\nvarying vec3 worldCoordinate;\nvarying vec2 planeCoordinate;\nvarying vec3 surfaceNormal;\n\nvec2 splitFloat(float v) {\n float vh = 255.0 * v;\n float upper = floor(vh);\n float lower = fract(vh);\n return vec2(upper / 255.0, floor(lower * 16.0) / 16.0);\n}\n\nvoid main() {\n if ((kill > 0.0) ||\n (outOfRange(clipBounds[0], clipBounds[1], worldCoordinate))) discard;\n\n vec2 ux = splitFloat(planeCoordinate.x / shape.x);\n vec2 uy = splitFloat(planeCoordinate.y / shape.y);\n gl_FragColor = vec4(pickId, ux.x, uy.x, ux.y + (uy.y/16.0));\n}\n"]);e.createShader=function(t){var e=n(t,a,o,null,[{name:"uv",type:"vec4"},{name:"f",type:"vec3"},{name:"normal",type:"vec3"}]);return e.attributes.uv.location=0,e.attributes.f.location=1,e.attributes.normal.location=2,e},e.createPickShader=function(t){var e=n(t,a,l,null,[{name:"uv",type:"vec4"},{name:"f",type:"vec3"},{name:"normal",type:"vec3"}]);return e.attributes.uv.location=0,e.attributes.f.location=1,e.attributes.normal.location=2,e},e.createContourShader=function(t){var e=n(t,s,o,null,[{name:"uv",type:"vec4"},{name:"f",type:"float"}]);return e.attributes.uv.location=0,e.attributes.f.location=1,e},e.createPickContourShader=function(t){var e=n(t,s,l,null,[{name:"uv",type:"vec4"},{name:"f",type:"float"}]);return e.attributes.uv.location=0,e.attributes.f.location=1,e}},3754:function(t,e,r){"use strict";t.exports=function(t){var e=t.gl,r=m(e),n=b(e),s=x(e),l=_(e),u=i(e),c=a(e,[{buffer:u,size:4,stride:w,offset:0},{buffer:u,size:3,stride:w,offset:16},{buffer:u,size:3,stride:w,offset:28}]),f=i(e),h=a(e,[{buffer:f,size:4,stride:20,offset:0},{buffer:f,size:1,stride:20,offset:16}]),p=i(e),d=a(e,[{buffer:p,size:2,type:e.FLOAT}]),v=o(e,1,S,e.RGBA,e.UNSIGNED_BYTE);v.minFilter=e.LINEAR,v.magFilter=e.LINEAR;var g=new E(e,[0,0],[[0,0,0],[0,0,0]],r,n,u,c,v,s,l,f,h,p,d,[0,0,0]),y={levels:[[],[],[]]};for(var T in t)y[T]=t[T];return y.colormap=y.colormap||"jet",g.update(y),g};var n=r(2288),i=r(5827),a=r(2944),o=r(8931),s=r(5306),l=r(9156),u=r(7498),c=r(7382),f=r(5050),h=r(4162),p=r(104),d=r(7437),v=r(5070),g=r(9144),y=r(9054),m=y.createShader,x=y.createContourShader,b=y.createPickShader,_=y.createPickContourShader,w=40,T=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],k=[[0,0],[0,1],[1,0],[1,1],[1,0],[0,1]],A=[[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0]];function M(t,e,r,n,i){this.position=t,this.index=e,this.uv=r,this.level=n,this.dataCoordinate=i}!function(){for(var t=0;t<3;++t){var e=A[t],r=(t+2)%3;e[(t+1)%3+0]=1,e[r+3]=1,e[t+6]=1}}();var S=256;function E(t,e,r,n,i,a,o,l,u,c,h,p,d,v,g){this.gl=t,this.shape=e,this.bounds=r,this.objectOffset=g,this.intensityBounds=[],this._shader=n,this._pickShader=i,this._coordinateBuffer=a,this._vao=o,this._colorMap=l,this._contourShader=u,this._contourPickShader=c,this._contourBuffer=h,this._contourVAO=p,this._contourOffsets=[[],[],[]],this._contourCounts=[[],[],[]],this._vertexCount=0,this._pickResult=new M([0,0,0],[0,0],[0,0],[0,0,0],[0,0,0]),this._dynamicBuffer=d,this._dynamicVAO=v,this._dynamicOffsets=[0,0,0],this._dynamicCounts=[0,0,0],this.contourWidth=[1,1,1],this.contourLevels=[[1],[1],[1]],this.contourTint=[0,0,0],this.contourColor=[[.5,.5,.5,1],[.5,.5,.5,1],[.5,.5,.5,1]],this.showContour=!0,this.showSurface=!0,this.enableHighlight=[!0,!0,!0],this.highlightColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.highlightTint=[1,1,1],this.highlightLevel=[-1,-1,-1],this.enableDynamic=[!0,!0,!0],this.dynamicLevel=[NaN,NaN,NaN],this.dynamicColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.dynamicTint=[1,1,1],this.dynamicWidth=[1,1,1],this.axesBounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.surfaceProject=[!1,!1,!1],this.contourProject=[[!1,!1,!1],[!1,!1,!1],[!1,!1,!1]],this.colorBounds=[!1,!1],this._field=[f(s.mallocFloat(1024),[0,0]),f(s.mallocFloat(1024),[0,0]),f(s.mallocFloat(1024),[0,0])],this.pickId=1,this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.snapToData=!1,this.pixelRatio=1,this.opacity=1,this.lightPosition=[10,1e4,0],this.ambientLight=.8,this.diffuseLight=.8,this.specularLight=2,this.roughness=.5,this.fresnel=1.5,this.vertexColor=0,this.dirty=!0}var L=E.prototype;L.genColormap=function(t,e){var r=!1,n=c([l({colormap:t,nshades:S,format:"rgba"}).map((function(t,n){var i=e?function(t,e){if(!e)return 1;if(!e.length)return 1;for(var r=0;rt&&r>0){var n=(e[r][0]-t)/(e[r][0]-e[r-1][0]);return e[r][1]*(1-n)+n*e[r-1][1]}}return 1}(n/255,e):t[3];return i<1&&(r=!0),[t[0],t[1],t[2],255*i]}))]);return u.divseq(n,255),this.hasAlphaScale=r,n},L.isTransparent=function(){return this.opacity<1||this.hasAlphaScale},L.isOpaque=function(){return!this.isTransparent()},L.pickSlots=1,L.setPickBase=function(t){this.pickId=t};var C=[0,0,0],P={showSurface:!1,showContour:!1,projections:[T.slice(),T.slice(),T.slice()],clipBounds:[[[0,0,0],[0,0,0]],[[0,0,0],[0,0,0]],[[0,0,0],[0,0,0]]]};function O(t,e){var r,n,i,a=e.axes&&e.axes.lastCubeProps.axis||C,o=e.showSurface,s=e.showContour;for(r=0;r<3;++r)for(o=o||e.surfaceProject[r],n=0;n<3;++n)s=s||e.contourProject[r][n];for(r=0;r<3;++r){var l=P.projections[r];for(n=0;n<16;++n)l[n]=0;for(n=0;n<4;++n)l[5*n]=1;l[5*r]=0,l[12+r]=e.axesBounds[+(a[r]>0)][r],p(l,t.model,l);var u=P.clipBounds[r];for(i=0;i<2;++i)for(n=0;n<3;++n)u[i][n]=t.clipBounds[i][n];u[0][r]=-1e8,u[1][r]=1e8}return P.showSurface=o,P.showContour=s,P}var I={model:T,view:T,projection:T,inverseModel:T.slice(),lowerBound:[0,0,0],upperBound:[0,0,0],colorMap:0,clipBounds:[[0,0,0],[0,0,0]],height:0,contourTint:0,contourColor:[0,0,0,1],permutation:[1,0,0,0,1,0,0,0,1],zOffset:-1e-4,objectOffset:[0,0,0],kambient:1,kdiffuse:1,kspecular:1,lightPosition:[1e3,1e3,1e3],eyePosition:[0,0,0],roughness:1,fresnel:1,opacity:1,vertexColor:0},D=T.slice(),z=[1,0,0,0,1,0,0,0,1];function R(t,e){t=t||{};var r=this.gl;r.disable(r.CULL_FACE),this._colorMap.bind(0);var n=I;n.model=t.model||T,n.view=t.view||T,n.projection=t.projection||T,n.lowerBound=[this.bounds[0][0],this.bounds[0][1],this.colorBounds[0]||this.bounds[0][2]],n.upperBound=[this.bounds[1][0],this.bounds[1][1],this.colorBounds[1]||this.bounds[1][2]],n.objectOffset=this.objectOffset,n.contourColor=this.contourColor[0],n.inverseModel=d(n.inverseModel,n.model);for(var i=0;i<2;++i)for(var a=n.clipBounds[i],o=0;o<3;++o)a[o]=Math.min(Math.max(this.clipBounds[i][o],-1e8),1e8);n.kambient=this.ambientLight,n.kdiffuse=this.diffuseLight,n.kspecular=this.specularLight,n.roughness=this.roughness,n.fresnel=this.fresnel,n.opacity=this.opacity,n.height=0,n.permutation=z,n.vertexColor=this.vertexColor;var s=D;for(p(s,n.view,n.model),p(s,n.projection,s),d(s,s),i=0;i<3;++i)n.eyePosition[i]=s[12+i]/s[15];var l=s[15];for(i=0;i<3;++i)l+=this.lightPosition[i]*s[4*i+3];for(i=0;i<3;++i){var u=s[12+i];for(o=0;o<3;++o)u+=s[4*o+i]*this.lightPosition[o];n.lightPosition[i]=u/l}var c=O(n,this);if(c.showSurface){for(this._shader.bind(),this._shader.uniforms=n,this._vao.bind(),this.showSurface&&this._vertexCount&&this._vao.draw(r.TRIANGLES,this._vertexCount),i=0;i<3;++i)this.surfaceProject[i]&&this.vertexCount&&(this._shader.uniforms.model=c.projections[i],this._shader.uniforms.clipBounds=c.clipBounds[i],this._vao.draw(r.TRIANGLES,this._vertexCount));this._vao.unbind()}if(c.showContour){var f=this._contourShader;n.kambient=1,n.kdiffuse=0,n.kspecular=0,n.opacity=1,f.bind(),f.uniforms=n;var h=this._contourVAO;for(h.bind(),i=0;i<3;++i)for(f.uniforms.permutation=A[i],r.lineWidth(this.contourWidth[i]*this.pixelRatio),o=0;o>4)/16)/255,i=Math.floor(n),a=n-i,o=e[1]*(t.value[1]+(15&t.value[2])/16)/255,s=Math.floor(o),l=o-s;i+=1,s+=1;var u=r.position;u[0]=u[1]=u[2]=0;for(var c=0;c<2;++c)for(var f=c?a:1-a,h=0;h<2;++h)for(var p=i+c,d=s+h,g=f*(h?l:1-l),y=0;y<3;++y)u[y]+=this._field[y].get(p,d)*g;for(var m=this._pickResult.level,x=0;x<3;++x)if(m[x]=v.le(this.contourLevels[x],u[x]),m[x]<0)this.contourLevels[x].length>0&&(m[x]=0);else if(m[x]Math.abs(_-u[x])&&(m[x]+=1)}for(r.index[0]=a<.5?i:i+1,r.index[1]=l<.5?s:s+1,r.uv[0]=n/e[0],r.uv[1]=o/e[1],y=0;y<3;++y)r.dataCoordinate[y]=this._field[y].get(r.index[0],r.index[1]);return r},L.padField=function(t,e){var r=e.shape.slice(),n=t.shape.slice();u.assign(t.lo(1,1).hi(r[0],r[1]),e),u.assign(t.lo(1).hi(r[0],1),e.hi(r[0],1)),u.assign(t.lo(1,n[1]-1).hi(r[0],1),e.lo(0,r[1]-1).hi(r[0],1)),u.assign(t.lo(0,1).hi(1,r[1]),e.hi(1)),u.assign(t.lo(n[0]-1,1).hi(1,r[1]),e.lo(r[0]-1)),t.set(0,0,e.get(0,0)),t.set(0,n[1]-1,e.get(0,r[1]-1)),t.set(n[0]-1,0,e.get(r[0]-1,0)),t.set(n[0]-1,n[1]-1,e.get(r[0]-1,r[1]-1))},L.update=function(t){t=t||{},this.objectOffset=t.objectOffset||this.objectOffset,this.dirty=!0,"contourWidth"in t&&(this.contourWidth=B(t.contourWidth,Number)),"showContour"in t&&(this.showContour=B(t.showContour,Boolean)),"showSurface"in t&&(this.showSurface=!!t.showSurface),"contourTint"in t&&(this.contourTint=B(t.contourTint,Boolean)),"contourColor"in t&&(this.contourColor=j(t.contourColor)),"contourProject"in t&&(this.contourProject=B(t.contourProject,(function(t){return B(t,Boolean)}))),"surfaceProject"in t&&(this.surfaceProject=t.surfaceProject),"dynamicColor"in t&&(this.dynamicColor=j(t.dynamicColor)),"dynamicTint"in t&&(this.dynamicTint=B(t.dynamicTint,Number)),"dynamicWidth"in t&&(this.dynamicWidth=B(t.dynamicWidth,Number)),"opacity"in t&&(this.opacity=t.opacity),"opacityscale"in t&&(this.opacityscale=t.opacityscale),"colorBounds"in t&&(this.colorBounds=t.colorBounds),"vertexColor"in t&&(this.vertexColor=t.vertexColor?1:0),"colormap"in t&&this._colorMap.setPixels(this.genColormap(t.colormap,this.opacityscale));var e=t.field||t.coords&&t.coords[2]||null,r=!1;if(e||(e=this._field[2].shape[0]||this._field[2].shape[2]?this._field[2].lo(1,1).hi(this._field[2].shape[0]-2,this._field[2].shape[1]-2):this._field[2].hi(0,0)),"field"in t||"coords"in t){var i=(e.shape[0]+2)*(e.shape[1]+2);i>this._field[2].data.length&&(s.freeFloat(this._field[2].data),this._field[2].data=s.mallocFloat(n.nextPow2(i))),this._field[2]=f(this._field[2].data,[e.shape[0]+2,e.shape[1]+2]),this.padField(this._field[2],e),this.shape=e.shape.slice();for(var a=this.shape,o=0;o<2;++o)this._field[2].size>this._field[o].data.length&&(s.freeFloat(this._field[o].data),this._field[o].data=s.mallocFloat(this._field[2].size)),this._field[o]=f(this._field[o].data,[a[0]+2,a[1]+2]);if(t.coords){var l=t.coords;if(!Array.isArray(l)||3!==l.length)throw new Error("gl-surface: invalid coordinates for x/y");for(o=0;o<2;++o){var u=l[o];for(y=0;y<2;++y)if(u.shape[y]!==a[y])throw new Error("gl-surface: coords have incorrect shape");this.padField(this._field[o],u)}}else if(t.ticks){var c=t.ticks;if(!Array.isArray(c)||2!==c.length)throw new Error("gl-surface: invalid ticks");for(o=0;o<2;++o){var p=c[o];if((Array.isArray(p)||p.length)&&(p=f(p)),p.shape[0]!==a[o])throw new Error("gl-surface: invalid tick length");var d=f(p.data,a);d.stride[o]=p.stride[0],d.stride[1^o]=0,this.padField(this._field[o],d)}}else{for(o=0;o<2;++o){var v=[0,0];v[o]=1,this._field[o]=f(this._field[o].data,[a[0]+2,a[1]+2],v,0)}this._field[0].set(0,0,0);for(var y=0;y0){for(var xt=0;xt<5;++xt)$.pop();U-=1}continue t}$.push(nt[0],nt[1],ot[0],ot[1],nt[2]),U+=1}}rt.push(U)}this._contourOffsets[Q]=et,this._contourCounts[Q]=rt}var bt=s.mallocFloat($.length);for(o=0;o<$.length;++o)bt[o]=$[o];this._contourBuffer.update(bt),s.freeFloat(bt)}},L.dispose=function(){this._shader.dispose(),this._vao.dispose(),this._coordinateBuffer.dispose(),this._colorMap.dispose(),this._contourBuffer.dispose(),this._contourVAO.dispose(),this._contourShader.dispose(),this._contourPickShader.dispose(),this._dynamicBuffer.dispose(),this._dynamicVAO.dispose();for(var t=0;t<3;++t)s.freeFloat(this._field[t].data)},L.highlight=function(t){var e,r;if(!t)return this._dynamicCounts=[0,0,0],this.dyanamicLevel=[NaN,NaN,NaN],void(this.highlightLevel=[-1,-1,-1]);for(e=0;e<3;++e)this.enableHighlight[e]?this.highlightLevel[e]=t.level[e]:this.highlightLevel[e]=-1;for(r=this.snapToData?t.dataCoordinate:t.position,e=0;e<3;++e)r[e]-=this.objectOffset[e];if(this.enableDynamic[0]&&r[0]!==this.dynamicLevel[0]||this.enableDynamic[1]&&r[1]!==this.dynamicLevel[1]||this.enableDynamic[2]&&r[2]!==this.dynamicLevel[2]){for(var n=0,i=this.shape,a=s.mallocFloat(12*i[0]*i[1]),o=0;o<3;++o)if(this.enableDynamic[o]){this.dynamicLevel[o]=r[o];var l=(o+1)%3,u=(o+2)%3,c=this._field[o],f=this._field[l],p=this._field[u],d=h(c,r[o]),v=d.cells,g=d.positions;for(this._dynamicOffsets[o]=n,e=0;es||o[1]<0||o[1]>s)throw new Error("gl-texture2d: Invalid texture size");var l=d(o,e.stride.slice()),u=0;"float32"===r?u=t.FLOAT:"float64"===r?(u=t.FLOAT,l=!1,r="float32"):"uint8"===r?u=t.UNSIGNED_BYTE:(u=t.UNSIGNED_BYTE,l=!1,r="uint8");var f,p,g=0;if(2===o.length)g=t.LUMINANCE,o=[o[0],o[1],1],e=n(e.data,o,[e.stride[0],e.stride[1],1],e.offset);else{if(3!==o.length)throw new Error("gl-texture2d: Invalid shape for texture");if(1===o[2])g=t.ALPHA;else if(2===o[2])g=t.LUMINANCE_ALPHA;else if(3===o[2])g=t.RGB;else{if(4!==o[2])throw new Error("gl-texture2d: Invalid shape for pixel coords");g=t.RGBA}}u!==t.FLOAT||t.getExtension("OES_texture_float")||(u=t.UNSIGNED_BYTE,l=!1);var y=e.size;if(l)f=0===e.offset&&e.data.length===y?e.data:e.data.subarray(e.offset,e.offset+y);else{var m=[o[2],o[2]*o[0],1];p=a.malloc(y,r);var x=n(p,o,m,0);"float32"!==r&&"float64"!==r||u!==t.UNSIGNED_BYTE?i.assign(x,e):c(x,e),f=p.subarray(0,y)}var b=v(t);return t.texImage2D(t.TEXTURE_2D,0,g,o[0],o[1],0,g,u,f),l||a.free(p),new h(t,b,o[0],o[1],g,u)}(t,e)}throw new Error("gl-texture2d: Invalid arguments for texture2d constructor")};var o=null,s=null,l=null;function u(t){return"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLVideoElement&&t instanceof HTMLVideoElement||"undefined"!=typeof ImageData&&t instanceof ImageData}var c=function(t,e){i.muls(t,e,255)};function f(t,e,r){var n=t.gl,i=n.getParameter(n.MAX_TEXTURE_SIZE);if(e<0||e>i||r<0||r>i)throw new Error("gl-texture2d: Invalid texture size");return t._shape=[e,r],t.bind(),n.texImage2D(n.TEXTURE_2D,0,t.format,e,r,0,t.format,t.type,null),t._mipLevels=[0],t}function h(t,e,r,n,i,a){this.gl=t,this.handle=e,this.format=i,this.type=a,this._shape=[r,n],this._mipLevels=[0],this._magFilter=t.NEAREST,this._minFilter=t.NEAREST,this._wrapS=t.CLAMP_TO_EDGE,this._wrapT=t.CLAMP_TO_EDGE,this._anisoSamples=1;var o=this,s=[this._wrapS,this._wrapT];Object.defineProperties(s,[{get:function(){return o._wrapS},set:function(t){return o.wrapS=t}},{get:function(){return o._wrapT},set:function(t){return o.wrapT=t}}]),this._wrapVector=s;var l=[this._shape[0],this._shape[1]];Object.defineProperties(l,[{get:function(){return o._shape[0]},set:function(t){return o.width=t}},{get:function(){return o._shape[1]},set:function(t){return o.height=t}}]),this._shapeVector=l}var p=h.prototype;function d(t,e){return 3===t.length?1===e[2]&&e[1]===t[0]*t[2]&&e[0]===t[2]:1===e[0]&&e[1]===t[0]}function v(t){var e=t.createTexture();return t.bindTexture(t.TEXTURE_2D,e),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),e}function g(t,e,r,n,i){var a=t.getParameter(t.MAX_TEXTURE_SIZE);if(e<0||e>a||r<0||r>a)throw new Error("gl-texture2d: Invalid texture shape");if(i===t.FLOAT&&!t.getExtension("OES_texture_float"))throw new Error("gl-texture2d: Floating point textures not supported on this platform");var o=v(t);return t.texImage2D(t.TEXTURE_2D,0,n,e,r,0,n,i,null),new h(t,o,e,r,n,i)}Object.defineProperties(p,{minFilter:{get:function(){return this._minFilter},set:function(t){this.bind();var e=this.gl;if(this.type===e.FLOAT&&o.indexOf(t)>=0&&(e.getExtension("OES_texture_float_linear")||(t=e.NEAREST)),s.indexOf(t)<0)throw new Error("gl-texture2d: Unknown filter mode "+t);return e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,t),this._minFilter=t}},magFilter:{get:function(){return this._magFilter},set:function(t){this.bind();var e=this.gl;if(this.type===e.FLOAT&&o.indexOf(t)>=0&&(e.getExtension("OES_texture_float_linear")||(t=e.NEAREST)),s.indexOf(t)<0)throw new Error("gl-texture2d: Unknown filter mode "+t);return e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,t),this._magFilter=t}},mipSamples:{get:function(){return this._anisoSamples},set:function(t){var e=this._anisoSamples;if(this._anisoSamples=0|Math.max(t,1),e!==this._anisoSamples){var r=this.gl.getExtension("EXT_texture_filter_anisotropic");r&&this.gl.texParameterf(this.gl.TEXTURE_2D,r.TEXTURE_MAX_ANISOTROPY_EXT,this._anisoSamples)}return this._anisoSamples}},wrapS:{get:function(){return this._wrapS},set:function(t){if(this.bind(),l.indexOf(t)<0)throw new Error("gl-texture2d: Unknown wrap mode "+t);return this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,t),this._wrapS=t}},wrapT:{get:function(){return this._wrapT},set:function(t){if(this.bind(),l.indexOf(t)<0)throw new Error("gl-texture2d: Unknown wrap mode "+t);return this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,t),this._wrapT=t}},wrap:{get:function(){return this._wrapVector},set:function(t){if(Array.isArray(t)||(t=[t,t]),2!==t.length)throw new Error("gl-texture2d: Must specify wrap mode for rows and columns");for(var e=0;e<2;++e)if(l.indexOf(t[e])<0)throw new Error("gl-texture2d: Unknown wrap mode "+t);this._wrapS=t[0],this._wrapT=t[1];var r=this.gl;return this.bind(),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,this._wrapS),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,this._wrapT),t}},shape:{get:function(){return this._shapeVector},set:function(t){if(Array.isArray(t)){if(2!==t.length)throw new Error("gl-texture2d: Invalid texture shape")}else t=[0|t,0|t];return f(this,0|t[0],0|t[1]),[0|t[0],0|t[1]]}},width:{get:function(){return this._shape[0]},set:function(t){return f(this,t|=0,this._shape[1]),t}},height:{get:function(){return this._shape[1]},set:function(t){return t|=0,f(this,this._shape[0],t),t}}}),p.bind=function(t){var e=this.gl;return void 0!==t&&e.activeTexture(e.TEXTURE0+(0|t)),e.bindTexture(e.TEXTURE_2D,this.handle),void 0!==t?0|t:e.getParameter(e.ACTIVE_TEXTURE)-e.TEXTURE0},p.dispose=function(){this.gl.deleteTexture(this.handle)},p.generateMipmap=function(){this.bind(),this.gl.generateMipmap(this.gl.TEXTURE_2D);for(var t=Math.min(this._shape[0],this._shape[1]),e=0;t>0;++e,t>>>=1)this._mipLevels.indexOf(e)<0&&this._mipLevels.push(e)},p.setPixels=function(t,e,r,o){var s=this.gl;this.bind(),Array.isArray(e)?(o=r,r=0|e[1],e=0|e[0]):(e=e||0,r=r||0),o=o||0;var l=u(t)?t:t.raw;if(l)this._mipLevels.indexOf(o)<0?(s.texImage2D(s.TEXTURE_2D,0,this.format,this.format,this.type,l),this._mipLevels.push(o)):s.texSubImage2D(s.TEXTURE_2D,o,e,r,this.format,this.type,l);else{if(!(t.shape&&t.stride&&t.data))throw new Error("gl-texture2d: Unsupported data type");if(t.shape.length<2||e+t.shape[1]>this._shape[1]>>>o||r+t.shape[0]>this._shape[0]>>>o||e<0||r<0)throw new Error("gl-texture2d: Texture dimensions are out of bounds");!function(t,e,r,o,s,l,u,f){var h=f.dtype,p=f.shape.slice();if(p.length<2||p.length>3)throw new Error("gl-texture2d: Invalid ndarray, must be 2d or 3d");var v=0,g=0,y=d(p,f.stride.slice());if("float32"===h?v=t.FLOAT:"float64"===h?(v=t.FLOAT,y=!1,h="float32"):"uint8"===h?v=t.UNSIGNED_BYTE:(v=t.UNSIGNED_BYTE,y=!1,h="uint8"),2===p.length)g=t.LUMINANCE,p=[p[0],p[1],1],f=n(f.data,p,[f.stride[0],f.stride[1],1],f.offset);else{if(3!==p.length)throw new Error("gl-texture2d: Invalid shape for texture");if(1===p[2])g=t.ALPHA;else if(2===p[2])g=t.LUMINANCE_ALPHA;else if(3===p[2])g=t.RGB;else{if(4!==p[2])throw new Error("gl-texture2d: Invalid shape for pixel coords");g=t.RGBA}p[2]}if(g!==t.LUMINANCE&&g!==t.ALPHA||s!==t.LUMINANCE&&s!==t.ALPHA||(g=s),g!==s)throw new Error("gl-texture2d: Incompatible texture format for setPixels");var m=f.size,x=u.indexOf(o)<0;if(x&&u.push(o),v===l&&y)0===f.offset&&f.data.length===m?x?t.texImage2D(t.TEXTURE_2D,o,s,p[0],p[1],0,s,l,f.data):t.texSubImage2D(t.TEXTURE_2D,o,e,r,p[0],p[1],s,l,f.data):x?t.texImage2D(t.TEXTURE_2D,o,s,p[0],p[1],0,s,l,f.data.subarray(f.offset,f.offset+m)):t.texSubImage2D(t.TEXTURE_2D,o,e,r,p[0],p[1],s,l,f.data.subarray(f.offset,f.offset+m));else{var b;b=l===t.FLOAT?a.mallocFloat32(m):a.mallocUint8(m);var _=n(b,p,[p[2],p[2]*p[0],1]);v===t.FLOAT&&l===t.UNSIGNED_BYTE?c(_,f):i.assign(_,f),x?t.texImage2D(t.TEXTURE_2D,o,s,p[0],p[1],0,s,l,b.subarray(0,m)):t.texSubImage2D(t.TEXTURE_2D,o,e,r,p[0],p[1],s,l,b.subarray(0,m)),l===t.FLOAT?a.freeFloat32(b):a.freeUint8(b)}}(s,e,r,o,this.format,this.type,this._mipLevels,t)}}},3056:function(t){"use strict";t.exports=function(t,e,r){e?e.bind():t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,null);var n=0|t.getParameter(t.MAX_VERTEX_ATTRIBS);if(r){if(r.length>n)throw new Error("gl-vao: Too many vertex attributes");for(var i=0;i1?0:Math.acos(s)};var n=r(5415),i=r(899),a=r(9305)},8827:function(t){t.exports=function(t,e){return t[0]=Math.ceil(e[0]),t[1]=Math.ceil(e[1]),t[2]=Math.ceil(e[2]),t}},7622:function(t){t.exports=function(t){var e=new Float32Array(3);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e}},8782:function(t){t.exports=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t}},8501:function(t){t.exports=function(){var t=new Float32Array(3);return t[0]=0,t[1]=0,t[2]=0,t}},903:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],l=r[2];return t[0]=i*l-a*s,t[1]=a*o-n*l,t[2]=n*s-i*o,t}},5981:function(t,e,r){t.exports=r(8288)},8288:function(t){t.exports=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2];return Math.sqrt(r*r+n*n+i*i)}},8629:function(t,e,r){t.exports=r(7979)},7979:function(t){t.exports=function(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t[2]=e[2]/r[2],t}},9305:function(t){t.exports=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}},154:function(t){t.exports=1e-6},4932:function(t,e,r){t.exports=function(t,e){var r=t[0],i=t[1],a=t[2],o=e[0],s=e[1],l=e[2];return Math.abs(r-o)<=n*Math.max(1,Math.abs(r),Math.abs(o))&&Math.abs(i-s)<=n*Math.max(1,Math.abs(i),Math.abs(s))&&Math.abs(a-l)<=n*Math.max(1,Math.abs(a),Math.abs(l))};var n=r(154)},5777:function(t){t.exports=function(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]}},3306:function(t){t.exports=function(t,e){return t[0]=Math.floor(e[0]),t[1]=Math.floor(e[1]),t[2]=Math.floor(e[2]),t}},7447:function(t,e,r){t.exports=function(t,e,r,i,a,o){var s,l;for(e||(e=3),r||(r=0),l=i?Math.min(i*e+r,t.length):t.length,s=r;s0&&(a=1/Math.sqrt(a),t[0]=e[0]*a,t[1]=e[1]*a,t[2]=e[2]*a),t}},6660:function(t){t.exports=function(t,e){e=e||1;var r=2*Math.random()*Math.PI,n=2*Math.random()-1,i=Math.sqrt(1-n*n)*e;return t[0]=Math.cos(r)*i,t[1]=Math.sin(r)*i,t[2]=n*e,t}},392:function(t){t.exports=function(t,e,r,n){var i=r[1],a=r[2],o=e[1]-i,s=e[2]-a,l=Math.sin(n),u=Math.cos(n);return t[0]=e[0],t[1]=i+o*u-s*l,t[2]=a+o*l+s*u,t}},3222:function(t){t.exports=function(t,e,r,n){var i=r[0],a=r[2],o=e[0]-i,s=e[2]-a,l=Math.sin(n),u=Math.cos(n);return t[0]=i+s*l+o*u,t[1]=e[1],t[2]=a+s*u-o*l,t}},3388:function(t){t.exports=function(t,e,r,n){var i=r[0],a=r[1],o=e[0]-i,s=e[1]-a,l=Math.sin(n),u=Math.cos(n);return t[0]=i+o*u-s*l,t[1]=a+o*l+s*u,t[2]=e[2],t}},1624:function(t){t.exports=function(t,e){return t[0]=Math.round(e[0]),t[1]=Math.round(e[1]),t[2]=Math.round(e[2]),t}},5685:function(t){t.exports=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t}},6722:function(t){t.exports=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t}},831:function(t){t.exports=function(t,e,r,n){return t[0]=e,t[1]=r,t[2]=n,t}},5294:function(t,e,r){t.exports=r(6403)},3303:function(t,e,r){t.exports=r(4337)},6403:function(t){t.exports=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2];return r*r+n*n+i*i}},4337:function(t){t.exports=function(t){var e=t[0],r=t[1],n=t[2];return e*e+r*r+n*n}},8921:function(t,e,r){t.exports=r(911)},911:function(t){t.exports=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t}},9908:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2];return t[0]=n*r[0]+i*r[3]+a*r[6],t[1]=n*r[1]+i*r[4]+a*r[7],t[2]=n*r[2]+i*r[5]+a*r[8],t}},3255:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[3]*n+r[7]*i+r[11]*a+r[15];return o=o||1,t[0]=(r[0]*n+r[4]*i+r[8]*a+r[12])/o,t[1]=(r[1]*n+r[5]*i+r[9]*a+r[13])/o,t[2]=(r[2]*n+r[6]*i+r[10]*a+r[14])/o,t}},6568:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],l=r[2],u=r[3],c=u*n+s*a-l*i,f=u*i+l*n-o*a,h=u*a+o*i-s*n,p=-o*n-s*i-l*a;return t[0]=c*u+p*-o+f*-l-h*-s,t[1]=f*u+p*-s+h*-o-c*-l,t[2]=h*u+p*-l+c*-s-f*-o,t}},3433:function(t){t.exports=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t[2]=e[2]+r[2],t[3]=e[3]+r[3],t}},1413:function(t){t.exports=function(t){var e=new Float32Array(4);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e}},3470:function(t){t.exports=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}},5313:function(t){t.exports=function(){var t=new Float32Array(4);return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t}},5446:function(t){t.exports=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2],a=e[3]-t[3];return Math.sqrt(r*r+n*n+i*i+a*a)}},205:function(t){t.exports=function(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t[2]=e[2]/r[2],t[3]=e[3]/r[3],t}},4242:function(t){t.exports=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]}},5680:function(t){t.exports=function(t,e,r,n){var i=new Float32Array(4);return i[0]=t,i[1]=e,i[2]=r,i[3]=n,i}},4020:function(t,e,r){t.exports={create:r(5313),clone:r(1413),fromValues:r(5680),copy:r(3470),set:r(6453),add:r(3433),subtract:r(2705),multiply:r(746),divide:r(205),min:r(2170),max:r(3030),scale:r(5510),scaleAndAdd:r(4224),distance:r(5446),squaredDistance:r(1542),length:r(8177),squaredLength:r(9037),negate:r(6459),inverse:r(8057),normalize:r(381),dot:r(4242),lerp:r(8746),random:r(3770),transformMat4:r(6342),transformQuat:r(5022)}},8057:function(t){t.exports=function(t,e){return t[0]=1/e[0],t[1]=1/e[1],t[2]=1/e[2],t[3]=1/e[3],t}},8177:function(t){t.exports=function(t){var e=t[0],r=t[1],n=t[2],i=t[3];return Math.sqrt(e*e+r*r+n*n+i*i)}},8746:function(t){t.exports=function(t,e,r,n){var i=e[0],a=e[1],o=e[2],s=e[3];return t[0]=i+n*(r[0]-i),t[1]=a+n*(r[1]-a),t[2]=o+n*(r[2]-o),t[3]=s+n*(r[3]-s),t}},3030:function(t){t.exports=function(t,e,r){return t[0]=Math.max(e[0],r[0]),t[1]=Math.max(e[1],r[1]),t[2]=Math.max(e[2],r[2]),t[3]=Math.max(e[3],r[3]),t}},2170:function(t){t.exports=function(t,e,r){return t[0]=Math.min(e[0],r[0]),t[1]=Math.min(e[1],r[1]),t[2]=Math.min(e[2],r[2]),t[3]=Math.min(e[3],r[3]),t}},746:function(t){t.exports=function(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t[2]=e[2]*r[2],t[3]=e[3]*r[3],t}},6459:function(t){t.exports=function(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=-e[3],t}},381:function(t){t.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=r*r+n*n+i*i+a*a;return o>0&&(o=1/Math.sqrt(o),t[0]=r*o,t[1]=n*o,t[2]=i*o,t[3]=a*o),t}},3770:function(t,e,r){var n=r(381),i=r(5510);t.exports=function(t,e){return e=e||1,t[0]=Math.random(),t[1]=Math.random(),t[2]=Math.random(),t[3]=Math.random(),n(t,t),i(t,t,e),t}},5510:function(t){t.exports=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t[3]=e[3]*r,t}},4224:function(t){t.exports=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t[3]=e[3]+r[3]*n,t}},6453:function(t){t.exports=function(t,e,r,n,i){return t[0]=e,t[1]=r,t[2]=n,t[3]=i,t}},1542:function(t){t.exports=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2],a=e[3]-t[3];return r*r+n*n+i*i+a*a}},9037:function(t){t.exports=function(t){var e=t[0],r=t[1],n=t[2],i=t[3];return e*e+r*r+n*n+i*i}},2705:function(t){t.exports=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t[3]=e[3]-r[3],t}},6342:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3];return t[0]=r[0]*n+r[4]*i+r[8]*a+r[12]*o,t[1]=r[1]*n+r[5]*i+r[9]*a+r[13]*o,t[2]=r[2]*n+r[6]*i+r[10]*a+r[14]*o,t[3]=r[3]*n+r[7]*i+r[11]*a+r[15]*o,t}},5022:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],l=r[2],u=r[3],c=u*n+s*a-l*i,f=u*i+l*n-o*a,h=u*a+o*i-s*n,p=-o*n-s*i-l*a;return t[0]=c*u+p*-o+f*-l-h*-s,t[1]=f*u+p*-s+h*-o-c*-l,t[2]=h*u+p*-l+c*-s-f*-o,t[3]=e[3],t}},9365:function(t,e,r){var n=r(8096),i=r(7896);t.exports=function(t){for(var e=Array.isArray(t)?t:n(t),r=0;r0)continue;r=t.slice(0,1).join("")}return N(r),P+=r.length,(S=S.slice(r.length)).length}}function Z(){return/[^a-fA-F0-9]/.test(e)?(N(S.join("")),M=l,k):(S.push(e),r=e,k+1)}function Y(){return"."===e||/[eE]/.test(e)?(S.push(e),M=v,r=e,k+1):"x"===e&&1===S.length&&"0"===S[0]?(M=_,S.push(e),r=e,k+1):/[^\d]/.test(e)?(N(S.join("")),M=l,k):(S.push(e),r=e,k+1)}function W(){return"f"===e&&(S.push(e),r=e,k+=1),/[eE]/.test(e)?(S.push(e),r=e,k+1):("-"!==e&&"+"!==e||!/[eE]/.test(r))&&/[^\d]/.test(e)?(N(S.join("")),M=l,k):(S.push(e),r=e,k+1)}function X(){if(/[^\d\w_]/.test(e)){var t=S.join("");return M=B[t]?m:F[t]?y:g,N(S.join("")),M=l,k}return S.push(e),r=e,k+1}};var n=r(399),i=r(9746),a=r(9525),o=r(9458),s=r(3585),l=999,u=9999,c=0,f=1,h=2,p=3,d=4,v=5,g=6,y=7,m=8,x=9,b=10,_=11,w=["block-comment","line-comment","preprocessor","operator","integer","float","ident","builtin","keyword","whitespace","eof","integer"]},3585:function(t,e,r){var n=r(9525);n=n.slice().filter((function(t){return!/^(gl\_|texture)/.test(t)})),t.exports=n.concat(["gl_VertexID","gl_InstanceID","gl_Position","gl_PointSize","gl_FragCoord","gl_FrontFacing","gl_FragDepth","gl_PointCoord","gl_MaxVertexAttribs","gl_MaxVertexUniformVectors","gl_MaxVertexOutputVectors","gl_MaxFragmentInputVectors","gl_MaxVertexTextureImageUnits","gl_MaxCombinedTextureImageUnits","gl_MaxTextureImageUnits","gl_MaxFragmentUniformVectors","gl_MaxDrawBuffers","gl_MinProgramTexelOffset","gl_MaxProgramTexelOffset","gl_DepthRangeParameters","gl_DepthRange","trunc","round","roundEven","isnan","isinf","floatBitsToInt","floatBitsToUint","intBitsToFloat","uintBitsToFloat","packSnorm2x16","unpackSnorm2x16","packUnorm2x16","unpackUnorm2x16","packHalf2x16","unpackHalf2x16","outerProduct","transpose","determinant","inverse","texture","textureSize","textureProj","textureLod","textureOffset","texelFetch","texelFetchOffset","textureProjOffset","textureLodOffset","textureProjLod","textureProjLodOffset","textureGrad","textureGradOffset","textureProjGrad","textureProjGradOffset"])},9525:function(t){t.exports=["abs","acos","all","any","asin","atan","ceil","clamp","cos","cross","dFdx","dFdy","degrees","distance","dot","equal","exp","exp2","faceforward","floor","fract","gl_BackColor","gl_BackLightModelProduct","gl_BackLightProduct","gl_BackMaterial","gl_BackSecondaryColor","gl_ClipPlane","gl_ClipVertex","gl_Color","gl_DepthRange","gl_DepthRangeParameters","gl_EyePlaneQ","gl_EyePlaneR","gl_EyePlaneS","gl_EyePlaneT","gl_Fog","gl_FogCoord","gl_FogFragCoord","gl_FogParameters","gl_FragColor","gl_FragCoord","gl_FragData","gl_FragDepth","gl_FragDepthEXT","gl_FrontColor","gl_FrontFacing","gl_FrontLightModelProduct","gl_FrontLightProduct","gl_FrontMaterial","gl_FrontSecondaryColor","gl_LightModel","gl_LightModelParameters","gl_LightModelProducts","gl_LightProducts","gl_LightSource","gl_LightSourceParameters","gl_MaterialParameters","gl_MaxClipPlanes","gl_MaxCombinedTextureImageUnits","gl_MaxDrawBuffers","gl_MaxFragmentUniformComponents","gl_MaxLights","gl_MaxTextureCoords","gl_MaxTextureImageUnits","gl_MaxTextureUnits","gl_MaxVaryingFloats","gl_MaxVertexAttribs","gl_MaxVertexTextureImageUnits","gl_MaxVertexUniformComponents","gl_ModelViewMatrix","gl_ModelViewMatrixInverse","gl_ModelViewMatrixInverseTranspose","gl_ModelViewMatrixTranspose","gl_ModelViewProjectionMatrix","gl_ModelViewProjectionMatrixInverse","gl_ModelViewProjectionMatrixInverseTranspose","gl_ModelViewProjectionMatrixTranspose","gl_MultiTexCoord0","gl_MultiTexCoord1","gl_MultiTexCoord2","gl_MultiTexCoord3","gl_MultiTexCoord4","gl_MultiTexCoord5","gl_MultiTexCoord6","gl_MultiTexCoord7","gl_Normal","gl_NormalMatrix","gl_NormalScale","gl_ObjectPlaneQ","gl_ObjectPlaneR","gl_ObjectPlaneS","gl_ObjectPlaneT","gl_Point","gl_PointCoord","gl_PointParameters","gl_PointSize","gl_Position","gl_ProjectionMatrix","gl_ProjectionMatrixInverse","gl_ProjectionMatrixInverseTranspose","gl_ProjectionMatrixTranspose","gl_SecondaryColor","gl_TexCoord","gl_TextureEnvColor","gl_TextureMatrix","gl_TextureMatrixInverse","gl_TextureMatrixInverseTranspose","gl_TextureMatrixTranspose","gl_Vertex","greaterThan","greaterThanEqual","inversesqrt","length","lessThan","lessThanEqual","log","log2","matrixCompMult","max","min","mix","mod","normalize","not","notEqual","pow","radians","reflect","refract","sign","sin","smoothstep","sqrt","step","tan","texture2D","texture2DLod","texture2DProj","texture2DProjLod","textureCube","textureCubeLod","texture2DLodEXT","texture2DProjLodEXT","textureCubeLodEXT","texture2DGradEXT","texture2DProjGradEXT","textureCubeGradEXT"]},9458:function(t,e,r){var n=r(399);t.exports=n.slice().concat(["layout","centroid","smooth","case","mat2x2","mat2x3","mat2x4","mat3x2","mat3x3","mat3x4","mat4x2","mat4x3","mat4x4","uvec2","uvec3","uvec4","samplerCubeShadow","sampler2DArray","sampler2DArrayShadow","isampler2D","isampler3D","isamplerCube","isampler2DArray","usampler2D","usampler3D","usamplerCube","usampler2DArray","coherent","restrict","readonly","writeonly","resource","atomic_uint","noperspective","patch","sample","subroutine","common","partition","active","filter","image1D","image2D","image3D","imageCube","iimage1D","iimage2D","iimage3D","iimageCube","uimage1D","uimage2D","uimage3D","uimageCube","image1DArray","image2DArray","iimage1DArray","iimage2DArray","uimage1DArray","uimage2DArray","image1DShadow","image2DShadow","image1DArrayShadow","image2DArrayShadow","imageBuffer","iimageBuffer","uimageBuffer","sampler1DArray","sampler1DArrayShadow","isampler1D","isampler1DArray","usampler1D","usampler1DArray","isampler2DRect","usampler2DRect","samplerBuffer","isamplerBuffer","usamplerBuffer","sampler2DMS","isampler2DMS","usampler2DMS","sampler2DMSArray","isampler2DMSArray","usampler2DMSArray"])},399:function(t){t.exports=["precision","highp","mediump","lowp","attribute","const","uniform","varying","break","continue","do","for","while","if","else","in","out","inout","float","int","uint","void","bool","true","false","discard","return","mat2","mat3","mat4","vec2","vec3","vec4","ivec2","ivec3","ivec4","bvec2","bvec3","bvec4","sampler1D","sampler2D","sampler3D","samplerCube","sampler1DShadow","sampler2DShadow","struct","asm","class","union","enum","typedef","template","this","packed","goto","switch","default","inline","noinline","volatile","public","static","extern","external","interface","long","short","double","half","fixed","unsigned","input","output","hvec2","hvec3","hvec4","dvec2","dvec3","dvec4","fvec2","fvec3","fvec4","sampler2DRect","sampler3DRect","sampler2DRectShadow","sizeof","cast","namespace","using"]},9746:function(t){t.exports=["<<=",">>=","++","--","<<",">>","<=",">=","==","!=","&&","||","+=","-=","*=","/=","%=","&=","^^","^=","|=","(",")","[","]",".","!","~","*","/","%","+","-","<",">","&","^","|","?",":","=",",",";","{","}"]},8096:function(t,e,r){var n=r(3193);t.exports=function(t,e){var r=n(e),i=[];return(i=i.concat(r(t))).concat(r(null))}},6832:function(t){t.exports=function(t){"string"==typeof t&&(t=[t]);for(var e=[].slice.call(arguments,1),r=[],n=0;n0;)for(var s=(t=o.pop()).adjacent,l=0;l<=r;++l){var u=s[l];if(u.boundary&&!(u.lastVisited<=-n)){for(var c=u.vertices,f=0;f<=r;++f){var h=c[f];i[f]=h<0?e:a[h]}var p=this.orient();if(p>0)return u;u.lastVisited=-n,0===p&&o.push(u)}}return null},c.walk=function(t,e){var r=this.vertices.length-1,n=this.dimension,i=this.vertices,a=this.tuple,o=e?this.interior.length*Math.random()|0:this.interior.length-1,s=this.interior[o];t:for(;!s.boundary;){for(var l=s.vertices,u=s.adjacent,c=0;c<=n;++c)a[c]=i[l[c]];for(s.lastVisited=r,c=0;c<=n;++c){var f=u[c];if(!(f.lastVisited>=r)){var h=a[c];a[c]=t;var p=this.orient();if(a[c]=h,p<0){s=f;continue t}f.boundary?f.lastVisited=-r:f.lastVisited=r}}return}return s},c.addPeaks=function(t,e){var r=this.vertices.length-1,n=this.dimension,i=this.vertices,l=this.tuple,u=this.interior,c=this.simplices,f=[e];e.lastVisited=r,e.vertices[e.vertices.indexOf(-1)]=r,e.boundary=!1,u.push(e);for(var h=[];f.length>0;){var p=(e=f.pop()).vertices,d=e.adjacent,v=p.indexOf(r);if(!(v<0))for(var g=0;g<=n;++g)if(g!==v){var y=d[g];if(y.boundary&&!(y.lastVisited>=r)){var m=y.vertices;if(y.lastVisited!==-r){for(var x=0,b=0;b<=n;++b)m[b]<0?(x=b,l[b]=t):l[b]=i[m[b]];if(this.orient()>0){m[x]=r,y.boundary=!1,u.push(y),f.push(y),y.lastVisited=r;continue}y.lastVisited=-r}var _=y.adjacent,w=p.slice(),T=d.slice(),k=new a(w,T,!0);c.push(k);var A=_.indexOf(e);if(!(A<0))for(_[A]=k,T[v]=y,w[g]=-1,T[g]=e,d[g]=k,k.flip(),b=0;b<=n;++b){var M=w[b];if(!(M<0||M===r)){for(var S=new Array(n-1),E=0,L=0;L<=n;++L){var C=w[L];C<0||L===b||(S[E++]=C)}h.push(new o(S,k,b))}}}}}for(h.sort(s),g=0;g+1=0?o[l++]=s[c]:u=1&c;if(u===(1&t)){var f=o[0];o[0]=o[1],o[1]=f}e.push(o)}}return e}},9014:function(t,e,r){"use strict";var n=r(5070);function i(t,e,r,n,i){this.mid=t,this.left=e,this.right=r,this.leftPoints=n,this.rightPoints=i,this.count=(e?e.count:0)+(r?r.count:0)+n.length}t.exports=function(t){return t&&0!==t.length?new y(g(t)):new y(null)};var a=i.prototype;function o(t,e){t.mid=e.mid,t.left=e.left,t.right=e.right,t.leftPoints=e.leftPoints,t.rightPoints=e.rightPoints,t.count=e.count}function s(t,e){var r=g(e);t.mid=r.mid,t.left=r.left,t.right=r.right,t.leftPoints=r.leftPoints,t.rightPoints=r.rightPoints,t.count=r.count}function l(t,e){var r=t.intervals([]);r.push(e),s(t,r)}function u(t,e){var r=t.intervals([]),n=r.indexOf(e);return n<0?0:(r.splice(n,1),s(t,r),1)}function c(t,e,r){for(var n=0;n=0&&t[n][1]>=e;--n){var i=r(t[n]);if(i)return i}}function h(t,e){for(var r=0;r>1],a=[],o=[],s=[];for(r=0;r3*(e+1)?l(this,t):this.left.insert(t):this.left=g([t]);else if(t[0]>this.mid)this.right?4*(this.right.count+1)>3*(e+1)?l(this,t):this.right.insert(t):this.right=g([t]);else{var r=n.ge(this.leftPoints,t,d),i=n.ge(this.rightPoints,t,v);this.leftPoints.splice(r,0,t),this.rightPoints.splice(i,0,t)}},a.remove=function(t){var e=this.count-this.leftPoints;if(t[1]3*(e-1)?u(this,t):2===(s=this.left.remove(t))?(this.left=null,this.count-=1,1):(1===s&&(this.count-=1),s):0;if(t[0]>this.mid)return this.right?4*(this.left?this.left.count:0)>3*(e-1)?u(this,t):2===(s=this.right.remove(t))?(this.right=null,this.count-=1,1):(1===s&&(this.count-=1),s):0;if(1===this.count)return this.leftPoints[0]===t?2:0;if(1===this.leftPoints.length&&this.leftPoints[0]===t){if(this.left&&this.right){for(var r=this,i=this.left;i.right;)r=i,i=i.right;if(r===this)i.right=this.right;else{var a=this.left,s=this.right;r.count-=i.count,r.right=i.left,i.left=a,i.right=s}o(this,i),this.count=(this.left?this.left.count:0)+(this.right?this.right.count:0)+this.leftPoints.length}else this.left?o(this,this.left):o(this,this.right);return 1}for(a=n.ge(this.leftPoints,t,d);athis.mid?this.right&&(r=this.right.queryPoint(t,e))?r:f(this.rightPoints,t,e):h(this.leftPoints,e);var r},a.queryInterval=function(t,e,r){var n;return tthis.mid&&this.right&&(n=this.right.queryInterval(t,e,r))?n:ethis.mid?f(this.rightPoints,t,r):h(this.leftPoints,r)};var m=y.prototype;m.insert=function(t){this.root?this.root.insert(t):this.root=new i(t[0],null,null,[t],[t])},m.remove=function(t){if(this.root){var e=this.root.remove(t);return 2===e&&(this.root=null),0!==e}return!1},m.queryPoint=function(t,e){if(this.root)return this.root.queryPoint(t,e)},m.queryInterval=function(t,e,r){if(t<=e&&this.root)return this.root.queryInterval(t,e,r)},Object.defineProperty(m,"count",{get:function(){return this.root?this.root.count:0}}),Object.defineProperty(m,"intervals",{get:function(){return this.root?this.root.intervals([]):[]}})},9560:function(t){"use strict";t.exports=function(t){for(var e=new Array(t),r=0;r13)&&32!==e&&133!==e&&160!==e&&5760!==e&&6158!==e&&(e<8192||e>8205)&&8232!==e&&8233!==e&&8239!==e&&8287!==e&&8288!==e&&12288!==e&&65279!==e)return!1;return!0}},3578:function(t){t.exports=function(t,e,r){return t*(1-r)+e*r}},7191:function(t,e,r){var n=r(4690),i=r(9823),a=r(7332),o=r(7787),s=r(7437),l=r(2142),u={length:r(4693),normalize:r(899),dot:r(9305),cross:r(903)},c=i(),f=i(),h=[0,0,0,0],p=[[0,0,0],[0,0,0],[0,0,0]],d=[0,0,0];function v(t,e,r,n,i){t[0]=e[0]*n+r[0]*i,t[1]=e[1]*n+r[1]*i,t[2]=e[2]*n+r[2]*i}t.exports=function(t,e,r,i,g,y){if(e||(e=[0,0,0]),r||(r=[0,0,0]),i||(i=[0,0,0]),g||(g=[0,0,0,1]),y||(y=[0,0,0,1]),!n(c,t))return!1;if(a(f,c),f[3]=0,f[7]=0,f[11]=0,f[15]=1,Math.abs(o(f)<1e-8))return!1;var m,x,b,_,w,T,k,A=c[3],M=c[7],S=c[11],E=c[12],L=c[13],C=c[14],P=c[15];if(0!==A||0!==M||0!==S){if(h[0]=A,h[1]=M,h[2]=S,h[3]=P,!s(f,f))return!1;l(f,f),m=g,b=f,_=(x=h)[0],w=x[1],T=x[2],k=x[3],m[0]=b[0]*_+b[4]*w+b[8]*T+b[12]*k,m[1]=b[1]*_+b[5]*w+b[9]*T+b[13]*k,m[2]=b[2]*_+b[6]*w+b[10]*T+b[14]*k,m[3]=b[3]*_+b[7]*w+b[11]*T+b[15]*k}else g[0]=g[1]=g[2]=0,g[3]=1;if(e[0]=E,e[1]=L,e[2]=C,function(t,e){t[0][0]=e[0],t[0][1]=e[1],t[0][2]=e[2],t[1][0]=e[4],t[1][1]=e[5],t[1][2]=e[6],t[2][0]=e[8],t[2][1]=e[9],t[2][2]=e[10]}(p,c),r[0]=u.length(p[0]),u.normalize(p[0],p[0]),i[0]=u.dot(p[0],p[1]),v(p[1],p[1],p[0],1,-i[0]),r[1]=u.length(p[1]),u.normalize(p[1],p[1]),i[0]/=r[1],i[1]=u.dot(p[0],p[2]),v(p[2],p[2],p[0],1,-i[1]),i[2]=u.dot(p[1],p[2]),v(p[2],p[2],p[1],1,-i[2]),r[2]=u.length(p[2]),u.normalize(p[2],p[2]),i[1]/=r[2],i[2]/=r[2],u.cross(d,p[1],p[2]),u.dot(p[0],d)<0)for(var O=0;O<3;O++)r[O]*=-1,p[O][0]*=-1,p[O][1]*=-1,p[O][2]*=-1;return y[0]=.5*Math.sqrt(Math.max(1+p[0][0]-p[1][1]-p[2][2],0)),y[1]=.5*Math.sqrt(Math.max(1-p[0][0]+p[1][1]-p[2][2],0)),y[2]=.5*Math.sqrt(Math.max(1-p[0][0]-p[1][1]+p[2][2],0)),y[3]=.5*Math.sqrt(Math.max(1+p[0][0]+p[1][1]+p[2][2],0)),p[2][1]>p[1][2]&&(y[0]=-y[0]),p[0][2]>p[2][0]&&(y[1]=-y[1]),p[1][0]>p[0][1]&&(y[2]=-y[2]),!0}},4690:function(t){t.exports=function(t,e){var r=e[15];if(0===r)return!1;for(var n=1/r,i=0;i<16;i++)t[i]=e[i]*n;return!0}},7649:function(t,e,r){var n=r(1868),i=r(1102),a=r(7191),o=r(7787),s=r(1116),l=f(),u=f(),c=f();function f(){return{translate:h(),scale:h(1),skew:h(),perspective:[0,0,0,1],quaternion:[0,0,0,1]}}function h(t){return[t||0,t||0,t||0]}t.exports=function(t,e,r,f){if(0===o(e)||0===o(r))return!1;var h=a(e,l.translate,l.scale,l.skew,l.perspective,l.quaternion),p=a(r,u.translate,u.scale,u.skew,u.perspective,u.quaternion);return!(!h||!p||(n(c.translate,l.translate,u.translate,f),n(c.skew,l.skew,u.skew,f),n(c.scale,l.scale,u.scale,f),n(c.perspective,l.perspective,u.perspective,f),s(c.quaternion,l.quaternion,u.quaternion,f),i(t,c.translate,c.scale,c.skew,c.perspective,c.quaternion),0))}},1102:function(t,e,r){var n={identity:r(9947),translate:r(998),multiply:r(104),create:r(9823),scale:r(3668),fromRotationTranslation:r(7280)},i=(n.create(),n.create());t.exports=function(t,e,r,a,o,s){return n.identity(t),n.fromRotationTranslation(t,s,e),t[3]=o[0],t[7]=o[1],t[11]=o[2],t[15]=o[3],n.identity(i),0!==a[2]&&(i[9]=a[2],n.multiply(t,t,i)),0!==a[1]&&(i[9]=0,i[8]=a[1],n.multiply(t,t,i)),0!==a[0]&&(i[8]=0,i[4]=a[0],n.multiply(t,t,i)),n.scale(t,t,r),t}},9298:function(t,e,r){"use strict";var n=r(5070),i=r(7649),a=r(7437),o=r(6109),s=r(7115),l=r(5240),u=r(3012),c=r(998),f=(r(3668),r(899)),h=[0,0,0];function p(t){this._components=t.slice(),this._time=[0],this.prevMatrix=t.slice(),this.nextMatrix=t.slice(),this.computedMatrix=t.slice(),this.computedInverse=t.slice(),this.computedEye=[0,0,0],this.computedUp=[0,0,0],this.computedCenter=[0,0,0],this.computedRadius=[0],this._limits=[-1/0,1/0]}t.exports=function(t){return new p((t=t||{}).matrix||[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])};var d=p.prototype;d.recalcMatrix=function(t){var e=this._time,r=n.le(e,t),o=this.computedMatrix;if(!(r<0)){var s=this._components;if(r===e.length-1)for(var l=16*r,u=0;u<16;++u)o[u]=s[l++];else{var c=e[r+1]-e[r],h=(l=16*r,this.prevMatrix),p=!0;for(u=0;u<16;++u)h[u]=s[l++];var d=this.nextMatrix;for(u=0;u<16;++u)d[u]=s[l++],p=p&&h[u]===d[u];if(c<1e-6||p)for(u=0;u<16;++u)o[u]=h[u];else i(o,h,d,(t-e[r])/c)}var v=this.computedUp;v[0]=o[1],v[1]=o[5],v[2]=o[9],f(v,v);var g=this.computedInverse;a(g,o);var y=this.computedEye,m=g[15];y[0]=g[12]/m,y[1]=g[13]/m,y[2]=g[14]/m;var x=this.computedCenter,b=Math.exp(this.computedRadius[0]);for(u=0;u<3;++u)x[u]=y[u]-o[2+4*u]*b}},d.idle=function(t){if(!(t1&&n(t[o[c-2]],t[o[c-1]],u)<=0;)c-=1,o.pop();for(o.push(l),c=s.length;c>1&&n(t[s[c-2]],t[s[c-1]],u)>=0;)c-=1,s.pop();s.push(l)}r=new Array(s.length+o.length-2);for(var f=0,h=(i=0,o.length);i0;--p)r[f++]=s[p];return r};var n=r(417)[3]},6145:function(t,e,r){"use strict";t.exports=function(t,e){e||(e=t,t=window);var r=0,i=0,a=0,o={shift:!1,alt:!1,control:!1,meta:!1},s=!1;function l(t){var e=!1;return"altKey"in t&&(e=e||t.altKey!==o.alt,o.alt=!!t.altKey),"shiftKey"in t&&(e=e||t.shiftKey!==o.shift,o.shift=!!t.shiftKey),"ctrlKey"in t&&(e=e||t.ctrlKey!==o.control,o.control=!!t.ctrlKey),"metaKey"in t&&(e=e||t.metaKey!==o.meta,o.meta=!!t.metaKey),e}function u(t,s){var u=n.x(s),c=n.y(s);"buttons"in s&&(t=0|s.buttons),(t!==r||u!==i||c!==a||l(s))&&(r=0|t,i=u||0,a=c||0,e&&e(r,i,a,o))}function c(t){u(0,t)}function f(){(r||i||a||o.shift||o.alt||o.meta||o.control)&&(i=a=0,r=0,o.shift=o.alt=o.control=o.meta=!1,e&&e(0,0,0,o))}function h(t){l(t)&&e&&e(r,i,a,o)}function p(t){0===n.buttons(t)?u(0,t):u(r,t)}function d(t){u(r|n.buttons(t),t)}function v(t){u(r&~n.buttons(t),t)}function g(){s||(s=!0,t.addEventListener("mousemove",p),t.addEventListener("mousedown",d),t.addEventListener("mouseup",v),t.addEventListener("mouseleave",c),t.addEventListener("mouseenter",c),t.addEventListener("mouseout",c),t.addEventListener("mouseover",c),t.addEventListener("blur",f),t.addEventListener("keyup",h),t.addEventListener("keydown",h),t.addEventListener("keypress",h),t!==window&&(window.addEventListener("blur",f),window.addEventListener("keyup",h),window.addEventListener("keydown",h),window.addEventListener("keypress",h)))}g();var y={element:t};return Object.defineProperties(y,{enabled:{get:function(){return s},set:function(e){e?g():s&&(s=!1,t.removeEventListener("mousemove",p),t.removeEventListener("mousedown",d),t.removeEventListener("mouseup",v),t.removeEventListener("mouseleave",c),t.removeEventListener("mouseenter",c),t.removeEventListener("mouseout",c),t.removeEventListener("mouseover",c),t.removeEventListener("blur",f),t.removeEventListener("keyup",h),t.removeEventListener("keydown",h),t.removeEventListener("keypress",h),t!==window&&(window.removeEventListener("blur",f),window.removeEventListener("keyup",h),window.removeEventListener("keydown",h),window.removeEventListener("keypress",h)))},enumerable:!0},buttons:{get:function(){return r},enumerable:!0},x:{get:function(){return i},enumerable:!0},y:{get:function(){return a},enumerable:!0},mods:{get:function(){return o},enumerable:!0}}),y};var n=r(4110)},2565:function(t){var e={left:0,top:0};t.exports=function(t,r,n){r=r||t.currentTarget||t.srcElement,Array.isArray(n)||(n=[0,0]);var i,a=t.clientX||0,o=t.clientY||0,s=(i=r)===window||i===document||i===document.body?e:i.getBoundingClientRect();return n[0]=a-s.left,n[1]=o-s.top,n}},4110:function(t,e){"use strict";function r(t){return t.target||t.srcElement||window}e.buttons=function(t){if("object"==typeof t){if("buttons"in t)return t.buttons;if("which"in t){if(2===(e=t.which))return 4;if(3===e)return 2;if(e>0)return 1<=0)return 1< 0"),"function"!=typeof t.vertex&&e("Must specify vertex creation function"),"function"!=typeof t.cell&&e("Must specify cell creation function"),"function"!=typeof t.phase&&e("Must specify phase function");for(var o=t.getters||[],s=new Array(a),l=0;l=0?s[l]=!0:s[l]=!1;return function(t,e,r,a,o,s){var l=[s,o].join(",");return(0,i[l])(t,e,r,n.mallocUint32,n.freeUint32)}(t.vertex,t.cell,t.phase,0,r,s)};var i={"false,0,1":function(t,e,r,n,i){return function(a,o,s,l){var u,c=0|a.shape[0],f=0|a.shape[1],h=a.data,p=0|a.offset,d=0|a.stride[0],v=0|a.stride[1],g=p,y=0|-d,m=0,x=0|-v,b=0,_=-d-v|0,w=0,T=0|d,k=v-d*c|0,A=0,M=0,S=0,E=2*c|0,L=n(E),C=n(E),P=0,O=0,I=-1,D=-1,z=0,R=0|-c,F=0|c,B=0,N=-c-1|0,j=c-1|0,U=0,V=0,H=0;for(A=0;A0){if(M=1,L[P++]=r(h[g],o,s,l),g+=T,c>0)for(A=1,u=h[g],O=L[P]=r(u,o,s,l),z=L[P+I],B=L[P+R],U=L[P+N],O===z&&O===B&&O===U||(m=h[g+y],b=h[g+x],w=h[g+_],t(A,M,u,m,b,w,O,z,B,U,o,s,l),V=C[P]=S++),P+=1,g+=T,A=2;A0)for(A=1,u=h[g],O=L[P]=r(u,o,s,l),z=L[P+I],B=L[P+R],U=L[P+N],O===z&&O===B&&O===U||(m=h[g+y],b=h[g+x],w=h[g+_],t(A,M,u,m,b,w,O,z,B,U,o,s,l),V=C[P]=S++,U!==B&&e(C[P+R],V,b,w,B,U,o,s,l)),P+=1,g+=T,A=2;A0){if(A=1,L[P++]=r(h[g],o,s,l),g+=T,f>0)for(M=1,u=h[g],O=L[P]=r(u,o,s,l),B=L[P+R],z=L[P+I],U=L[P+N],O===B&&O===z&&O===U||(m=h[g+y],b=h[g+x],w=h[g+_],t(A,M,u,m,b,w,O,B,z,U,o,s,l),V=C[P]=S++),P+=1,g+=T,M=2;M0)for(M=1,u=h[g],O=L[P]=r(u,o,s,l),B=L[P+R],z=L[P+I],U=L[P+N],O===B&&O===z&&O===U||(m=h[g+y],b=h[g+x],w=h[g+_],t(A,M,u,m,b,w,O,B,z,U,o,s,l),V=C[P]=S++,U!==B&&e(C[P+R],V,w,m,U,B,o,s,l)),P+=1,g+=T,M=2;M2&&a[1]>2&&n(i.pick(-1,-1).lo(1,1).hi(a[0]-2,a[1]-2),t.pick(-1,-1,0).lo(1,1).hi(a[0]-2,a[1]-2),t.pick(-1,-1,1).lo(1,1).hi(a[0]-2,a[1]-2)),a[1]>2&&(r(i.pick(0,-1).lo(1).hi(a[1]-2),t.pick(0,-1,1).lo(1).hi(a[1]-2)),e(t.pick(0,-1,0).lo(1).hi(a[1]-2))),a[1]>2&&(r(i.pick(a[0]-1,-1).lo(1).hi(a[1]-2),t.pick(a[0]-1,-1,1).lo(1).hi(a[1]-2)),e(t.pick(a[0]-1,-1,0).lo(1).hi(a[1]-2))),a[0]>2&&(r(i.pick(-1,0).lo(1).hi(a[0]-2),t.pick(-1,0,0).lo(1).hi(a[0]-2)),e(t.pick(-1,0,1).lo(1).hi(a[0]-2))),a[0]>2&&(r(i.pick(-1,a[1]-1).lo(1).hi(a[0]-2),t.pick(-1,a[1]-1,0).lo(1).hi(a[0]-2)),e(t.pick(-1,a[1]-1,1).lo(1).hi(a[0]-2))),t.set(0,0,0,0),t.set(0,0,1,0),t.set(a[0]-1,0,0,0),t.set(a[0]-1,0,1,0),t.set(0,a[1]-1,0,0),t.set(0,a[1]-1,1,0),t.set(a[0]-1,a[1]-1,0,0),t.set(a[0]-1,a[1]-1,1,0),t}}t.exports=function(t,e,r){return Array.isArray(r)||(r=n(e.dimension,"string"==typeof r?r:"clamp")),0===e.size?t:0===e.dimension?(t.set(0),t):function(t){var e=t.join();if(a=c[e])return a;for(var r=t.length,n=[f,h],i=1;i<=r;++i)n.push(p(i));var a=d.apply(void 0,n);return c[e]=a,a}(r)(t,e)}},3581:function(t){"use strict";function e(t,e){var r=Math.floor(e),n=e-r,i=0<=r&&r0;){x<64?(l=x,x=0):(l=64,x-=64);for(var b=0|t[1];b>0;){b<64?(u=b,b=0):(u=64,b-=64),n=y+x*f+b*h,o=m+x*d+b*v;var _=0,w=0,T=0,k=p,A=f-c*p,M=h-l*f,S=g,E=d-c*g,L=v-l*d;for(T=0;T0;){v<64?(l=v,v=0):(l=64,v-=64);for(var g=0|t[0];g>0;){g<64?(s=g,g=0):(s=64,g-=64),n=p+v*c+g*u,o=d+v*h+g*f;var y=0,m=0,x=c,b=u-l*c,_=h,w=f-l*h;for(m=0;m0;){m<64?(u=m,m=0):(u=64,m-=64);for(var x=0|t[0];x>0;){x<64?(s=x,x=0):(s=64,x-=64);for(var b=0|t[1];b>0;){b<64?(l=b,b=0):(l=64,b-=64),n=g+m*h+x*c+b*f,o=y+m*v+x*p+b*d;var _=0,w=0,T=0,k=h,A=c-u*h,M=f-s*c,S=v,E=p-u*v,L=d-s*p;for(T=0;Tr;){y=0,m=v-o;e:for(g=0;gb)break e;m+=f,y+=h}for(y=v,m=v-o,g=0;g>1,q=H-j,G=H+j,Z=U,Y=q,W=H,X=G,J=V,K=i+1,$=a-1,Q=!0,tt=0,et=0,rt=0,nt=f,it=e(nt),at=e(nt);A=l*Z,M=l*Y,N=s;t:for(k=0;k0){g=Z,Z=Y,Y=g;break t}if(rt<0)break t;N+=p}A=l*X,M=l*J,N=s;t:for(k=0;k0){g=X,X=J,J=g;break t}if(rt<0)break t;N+=p}A=l*Z,M=l*W,N=s;t:for(k=0;k0){g=Z,Z=W,W=g;break t}if(rt<0)break t;N+=p}A=l*Y,M=l*W,N=s;t:for(k=0;k0){g=Y,Y=W,W=g;break t}if(rt<0)break t;N+=p}A=l*Z,M=l*X,N=s;t:for(k=0;k0){g=Z,Z=X,X=g;break t}if(rt<0)break t;N+=p}A=l*W,M=l*X,N=s;t:for(k=0;k0){g=W,W=X,X=g;break t}if(rt<0)break t;N+=p}A=l*Y,M=l*J,N=s;t:for(k=0;k0){g=Y,Y=J,J=g;break t}if(rt<0)break t;N+=p}A=l*Y,M=l*W,N=s;t:for(k=0;k0){g=Y,Y=W,W=g;break t}if(rt<0)break t;N+=p}A=l*X,M=l*J,N=s;t:for(k=0;k0){g=X,X=J,J=g;break t}if(rt<0)break t;N+=p}for(A=l*Z,M=l*Y,S=l*W,E=l*X,L=l*J,C=l*U,P=l*H,O=l*V,B=0,N=s,k=0;k0)){if(rt<0){for(A=l*b,M=l*K,S=l*$,N=s,k=0;k0)for(;;){for(_=s+$*l,B=0,k=0;k0)){for(_=s+$*l,B=0,k=0;kV){t:for(;;){for(_=s+K*l,B=0,N=s,k=0;k1&&n?s(r,n[0],n[1]):s(r)}(t,e,l);return n(l,u)}},8729:function(t,e,r){"use strict";var n=r(8139),i={};t.exports=function(t){var e=t.order,r=t.dtype,a=[e,r].join(":"),o=i[a];return o||(i[a]=o=n(e,r)),o(t),t}},5050:function(t,e,r){var n=r(4780),i="undefined"!=typeof Float64Array;function a(t,e){return t[0]-e[0]}function o(){var t,e=this.stride,r=new Array(e.length);for(t=0;t=0&&(e+=a*(r=0|t),i-=r),new n(this.data,i,a,e)},i.step=function(t){var e=this.shape[0],r=this.stride[0],i=this.offset,a=0,o=Math.ceil;return"number"==typeof t&&((a=0|t)<0?(i+=r*(e-1),e=o(-e/a)):e=o(e/a),r*=a),new n(this.data,e,r,i)},i.transpose=function(t){t=void 0===t?0:0|t;var e=this.shape,r=this.stride;return new n(this.data,e[t],r[t],this.offset)},i.pick=function(t){var r=[],n=[],i=this.offset;return"number"==typeof t&&t>=0?i=i+this.stride[0]*t|0:(r.push(this.shape[0]),n.push(this.stride[0])),(0,e[r.length+1])(this.data,r,n,i)},function(t,e,r,i){return new n(t,e[0],r[0],i)}},2:function(t,e,r){function n(t,e,r,n,i,a){this.data=t,this.shape=[e,r],this.stride=[n,i],this.offset=0|a}var i=n.prototype;return i.dtype=t,i.dimension=2,Object.defineProperty(i,"size",{get:function(){return this.shape[0]*this.shape[1]}}),Object.defineProperty(i,"order",{get:function(){return Math.abs(this.stride[0])>Math.abs(this.stride[1])?[1,0]:[0,1]}}),i.set=function(e,r,n){return"generic"===t?this.data.set(this.offset+this.stride[0]*e+this.stride[1]*r,n):this.data[this.offset+this.stride[0]*e+this.stride[1]*r]=n},i.get=function(e,r){return"generic"===t?this.data.get(this.offset+this.stride[0]*e+this.stride[1]*r):this.data[this.offset+this.stride[0]*e+this.stride[1]*r]},i.index=function(t,e){return this.offset+this.stride[0]*t+this.stride[1]*e},i.hi=function(t,e){return new n(this.data,"number"!=typeof t||t<0?this.shape[0]:0|t,"number"!=typeof e||e<0?this.shape[1]:0|e,this.stride[0],this.stride[1],this.offset)},i.lo=function(t,e){var r=this.offset,i=0,a=this.shape[0],o=this.shape[1],s=this.stride[0],l=this.stride[1];return"number"==typeof t&&t>=0&&(r+=s*(i=0|t),a-=i),"number"==typeof e&&e>=0&&(r+=l*(i=0|e),o-=i),new n(this.data,a,o,s,l,r)},i.step=function(t,e){var r=this.shape[0],i=this.shape[1],a=this.stride[0],o=this.stride[1],s=this.offset,l=0,u=Math.ceil;return"number"==typeof t&&((l=0|t)<0?(s+=a*(r-1),r=u(-r/l)):r=u(r/l),a*=l),"number"==typeof e&&((l=0|e)<0?(s+=o*(i-1),i=u(-i/l)):i=u(i/l),o*=l),new n(this.data,r,i,a,o,s)},i.transpose=function(t,e){t=void 0===t?0:0|t,e=void 0===e?1:0|e;var r=this.shape,i=this.stride;return new n(this.data,r[t],r[e],i[t],i[e],this.offset)},i.pick=function(t,r){var n=[],i=[],a=this.offset;return"number"==typeof t&&t>=0?a=a+this.stride[0]*t|0:(n.push(this.shape[0]),i.push(this.stride[0])),"number"==typeof r&&r>=0?a=a+this.stride[1]*r|0:(n.push(this.shape[1]),i.push(this.stride[1])),(0,e[n.length+1])(this.data,n,i,a)},function(t,e,r,i){return new n(t,e[0],e[1],r[0],r[1],i)}},3:function(t,e,r){function n(t,e,r,n,i,a,o,s){this.data=t,this.shape=[e,r,n],this.stride=[i,a,o],this.offset=0|s}var i=n.prototype;return i.dtype=t,i.dimension=3,Object.defineProperty(i,"size",{get:function(){return this.shape[0]*this.shape[1]*this.shape[2]}}),Object.defineProperty(i,"order",{get:function(){var t=Math.abs(this.stride[0]),e=Math.abs(this.stride[1]),r=Math.abs(this.stride[2]);return t>e?e>r?[2,1,0]:t>r?[1,2,0]:[1,0,2]:t>r?[2,0,1]:r>e?[0,1,2]:[0,2,1]}}),i.set=function(e,r,n,i){return"generic"===t?this.data.set(this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n,i):this.data[this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n]=i},i.get=function(e,r,n){return"generic"===t?this.data.get(this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n):this.data[this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n]},i.index=function(t,e,r){return this.offset+this.stride[0]*t+this.stride[1]*e+this.stride[2]*r},i.hi=function(t,e,r){return new n(this.data,"number"!=typeof t||t<0?this.shape[0]:0|t,"number"!=typeof e||e<0?this.shape[1]:0|e,"number"!=typeof r||r<0?this.shape[2]:0|r,this.stride[0],this.stride[1],this.stride[2],this.offset)},i.lo=function(t,e,r){var i=this.offset,a=0,o=this.shape[0],s=this.shape[1],l=this.shape[2],u=this.stride[0],c=this.stride[1],f=this.stride[2];return"number"==typeof t&&t>=0&&(i+=u*(a=0|t),o-=a),"number"==typeof e&&e>=0&&(i+=c*(a=0|e),s-=a),"number"==typeof r&&r>=0&&(i+=f*(a=0|r),l-=a),new n(this.data,o,s,l,u,c,f,i)},i.step=function(t,e,r){var i=this.shape[0],a=this.shape[1],o=this.shape[2],s=this.stride[0],l=this.stride[1],u=this.stride[2],c=this.offset,f=0,h=Math.ceil;return"number"==typeof t&&((f=0|t)<0?(c+=s*(i-1),i=h(-i/f)):i=h(i/f),s*=f),"number"==typeof e&&((f=0|e)<0?(c+=l*(a-1),a=h(-a/f)):a=h(a/f),l*=f),"number"==typeof r&&((f=0|r)<0?(c+=u*(o-1),o=h(-o/f)):o=h(o/f),u*=f),new n(this.data,i,a,o,s,l,u,c)},i.transpose=function(t,e,r){t=void 0===t?0:0|t,e=void 0===e?1:0|e,r=void 0===r?2:0|r;var i=this.shape,a=this.stride;return new n(this.data,i[t],i[e],i[r],a[t],a[e],a[r],this.offset)},i.pick=function(t,r,n){var i=[],a=[],o=this.offset;return"number"==typeof t&&t>=0?o=o+this.stride[0]*t|0:(i.push(this.shape[0]),a.push(this.stride[0])),"number"==typeof r&&r>=0?o=o+this.stride[1]*r|0:(i.push(this.shape[1]),a.push(this.stride[1])),"number"==typeof n&&n>=0?o=o+this.stride[2]*n|0:(i.push(this.shape[2]),a.push(this.stride[2])),(0,e[i.length+1])(this.data,i,a,o)},function(t,e,r,i){return new n(t,e[0],e[1],e[2],r[0],r[1],r[2],i)}},4:function(t,e,r){function n(t,e,r,n,i,a,o,s,l,u){this.data=t,this.shape=[e,r,n,i],this.stride=[a,o,s,l],this.offset=0|u}var i=n.prototype;return i.dtype=t,i.dimension=4,Object.defineProperty(i,"size",{get:function(){return this.shape[0]*this.shape[1]*this.shape[2]*this.shape[3]}}),Object.defineProperty(i,"order",{get:r}),i.set=function(e,r,n,i,a){return"generic"===t?this.data.set(this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i,a):this.data[this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i]=a},i.get=function(e,r,n,i){return"generic"===t?this.data.get(this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i):this.data[this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i]},i.index=function(t,e,r,n){return this.offset+this.stride[0]*t+this.stride[1]*e+this.stride[2]*r+this.stride[3]*n},i.hi=function(t,e,r,i){return new n(this.data,"number"!=typeof t||t<0?this.shape[0]:0|t,"number"!=typeof e||e<0?this.shape[1]:0|e,"number"!=typeof r||r<0?this.shape[2]:0|r,"number"!=typeof i||i<0?this.shape[3]:0|i,this.stride[0],this.stride[1],this.stride[2],this.stride[3],this.offset)},i.lo=function(t,e,r,i){var a=this.offset,o=0,s=this.shape[0],l=this.shape[1],u=this.shape[2],c=this.shape[3],f=this.stride[0],h=this.stride[1],p=this.stride[2],d=this.stride[3];return"number"==typeof t&&t>=0&&(a+=f*(o=0|t),s-=o),"number"==typeof e&&e>=0&&(a+=h*(o=0|e),l-=o),"number"==typeof r&&r>=0&&(a+=p*(o=0|r),u-=o),"number"==typeof i&&i>=0&&(a+=d*(o=0|i),c-=o),new n(this.data,s,l,u,c,f,h,p,d,a)},i.step=function(t,e,r,i){var a=this.shape[0],o=this.shape[1],s=this.shape[2],l=this.shape[3],u=this.stride[0],c=this.stride[1],f=this.stride[2],h=this.stride[3],p=this.offset,d=0,v=Math.ceil;return"number"==typeof t&&((d=0|t)<0?(p+=u*(a-1),a=v(-a/d)):a=v(a/d),u*=d),"number"==typeof e&&((d=0|e)<0?(p+=c*(o-1),o=v(-o/d)):o=v(o/d),c*=d),"number"==typeof r&&((d=0|r)<0?(p+=f*(s-1),s=v(-s/d)):s=v(s/d),f*=d),"number"==typeof i&&((d=0|i)<0?(p+=h*(l-1),l=v(-l/d)):l=v(l/d),h*=d),new n(this.data,a,o,s,l,u,c,f,h,p)},i.transpose=function(t,e,r,i){t=void 0===t?0:0|t,e=void 0===e?1:0|e,r=void 0===r?2:0|r,i=void 0===i?3:0|i;var a=this.shape,o=this.stride;return new n(this.data,a[t],a[e],a[r],a[i],o[t],o[e],o[r],o[i],this.offset)},i.pick=function(t,r,n,i){var a=[],o=[],s=this.offset;return"number"==typeof t&&t>=0?s=s+this.stride[0]*t|0:(a.push(this.shape[0]),o.push(this.stride[0])),"number"==typeof r&&r>=0?s=s+this.stride[1]*r|0:(a.push(this.shape[1]),o.push(this.stride[1])),"number"==typeof n&&n>=0?s=s+this.stride[2]*n|0:(a.push(this.shape[2]),o.push(this.stride[2])),"number"==typeof i&&i>=0?s=s+this.stride[3]*i|0:(a.push(this.shape[3]),o.push(this.stride[3])),(0,e[a.length+1])(this.data,a,o,s)},function(t,e,r,i){return new n(t,e[0],e[1],e[2],e[3],r[0],r[1],r[2],r[3],i)}},5:function(t,e,r){function n(t,e,r,n,i,a,o,s,l,u,c,f){this.data=t,this.shape=[e,r,n,i,a],this.stride=[o,s,l,u,c],this.offset=0|f}var i=n.prototype;return i.dtype=t,i.dimension=5,Object.defineProperty(i,"size",{get:function(){return this.shape[0]*this.shape[1]*this.shape[2]*this.shape[3]*this.shape[4]}}),Object.defineProperty(i,"order",{get:r}),i.set=function(e,r,n,i,a,o){return"generic"===t?this.data.set(this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i+this.stride[4]*a,o):this.data[this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i+this.stride[4]*a]=o},i.get=function(e,r,n,i,a){return"generic"===t?this.data.get(this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i+this.stride[4]*a):this.data[this.offset+this.stride[0]*e+this.stride[1]*r+this.stride[2]*n+this.stride[3]*i+this.stride[4]*a]},i.index=function(t,e,r,n,i){return this.offset+this.stride[0]*t+this.stride[1]*e+this.stride[2]*r+this.stride[3]*n+this.stride[4]*i},i.hi=function(t,e,r,i,a){return new n(this.data,"number"!=typeof t||t<0?this.shape[0]:0|t,"number"!=typeof e||e<0?this.shape[1]:0|e,"number"!=typeof r||r<0?this.shape[2]:0|r,"number"!=typeof i||i<0?this.shape[3]:0|i,"number"!=typeof a||a<0?this.shape[4]:0|a,this.stride[0],this.stride[1],this.stride[2],this.stride[3],this.stride[4],this.offset)},i.lo=function(t,e,r,i,a){var o=this.offset,s=0,l=this.shape[0],u=this.shape[1],c=this.shape[2],f=this.shape[3],h=this.shape[4],p=this.stride[0],d=this.stride[1],v=this.stride[2],g=this.stride[3],y=this.stride[4];return"number"==typeof t&&t>=0&&(o+=p*(s=0|t),l-=s),"number"==typeof e&&e>=0&&(o+=d*(s=0|e),u-=s),"number"==typeof r&&r>=0&&(o+=v*(s=0|r),c-=s),"number"==typeof i&&i>=0&&(o+=g*(s=0|i),f-=s),"number"==typeof a&&a>=0&&(o+=y*(s=0|a),h-=s),new n(this.data,l,u,c,f,h,p,d,v,g,y,o)},i.step=function(t,e,r,i,a){var o=this.shape[0],s=this.shape[1],l=this.shape[2],u=this.shape[3],c=this.shape[4],f=this.stride[0],h=this.stride[1],p=this.stride[2],d=this.stride[3],v=this.stride[4],g=this.offset,y=0,m=Math.ceil;return"number"==typeof t&&((y=0|t)<0?(g+=f*(o-1),o=m(-o/y)):o=m(o/y),f*=y),"number"==typeof e&&((y=0|e)<0?(g+=h*(s-1),s=m(-s/y)):s=m(s/y),h*=y),"number"==typeof r&&((y=0|r)<0?(g+=p*(l-1),l=m(-l/y)):l=m(l/y),p*=y),"number"==typeof i&&((y=0|i)<0?(g+=d*(u-1),u=m(-u/y)):u=m(u/y),d*=y),"number"==typeof a&&((y=0|a)<0?(g+=v*(c-1),c=m(-c/y)):c=m(c/y),v*=y),new n(this.data,o,s,l,u,c,f,h,p,d,v,g)},i.transpose=function(t,e,r,i,a){t=void 0===t?0:0|t,e=void 0===e?1:0|e,r=void 0===r?2:0|r,i=void 0===i?3:0|i,a=void 0===a?4:0|a;var o=this.shape,s=this.stride;return new n(this.data,o[t],o[e],o[r],o[i],o[a],s[t],s[e],s[r],s[i],s[a],this.offset)},i.pick=function(t,r,n,i,a){var o=[],s=[],l=this.offset;return"number"==typeof t&&t>=0?l=l+this.stride[0]*t|0:(o.push(this.shape[0]),s.push(this.stride[0])),"number"==typeof r&&r>=0?l=l+this.stride[1]*r|0:(o.push(this.shape[1]),s.push(this.stride[1])),"number"==typeof n&&n>=0?l=l+this.stride[2]*n|0:(o.push(this.shape[2]),s.push(this.stride[2])),"number"==typeof i&&i>=0?l=l+this.stride[3]*i|0:(o.push(this.shape[3]),s.push(this.stride[3])),"number"==typeof a&&a>=0?l=l+this.stride[4]*a|0:(o.push(this.shape[4]),s.push(this.stride[4])),(0,e[o.length+1])(this.data,o,s,l)},function(t,e,r,i){return new n(t,e[0],e[1],e[2],e[3],e[4],r[0],r[1],r[2],r[3],r[4],i)}}};function l(t,e){var r=-1===e?"T":String(e),n=s[r];return-1===e?n(t):0===e?n(t,u[t][0]):n(t,u[t],o)}var u={generic:[],buffer:[],array:[],float32:[],float64:[],int8:[],int16:[],int32:[],uint8_clamped:[],uint8:[],uint16:[],uint32:[],bigint64:[],biguint64:[]};t.exports=function(t,e,r,a){if(void 0===t)return(0,u.array[0])([]);"number"==typeof t&&(t=[t]),void 0===e&&(e=[t.length]);var o=e.length;if(void 0===r){r=new Array(o);for(var s=o-1,c=1;s>=0;--s)r[s]=c,c*=e[s]}if(void 0===a)for(a=0,s=0;s>>0;t.exports=function(t,e){if(isNaN(t)||isNaN(e))return NaN;if(t===e)return t;if(0===t)return e<0?-i:i;var r=n.hi(t),o=n.lo(t);return e>t==t>0?o===a?(r+=1,o=0):o+=1:0===o?(o=a,r-=1):o-=1,n.pack(o,r)}},115:function(t,e){e.vertexNormals=function(t,e,r){for(var n=e.length,i=new Array(n),a=void 0===r?1e-6:r,o=0;oa){var b=i[u],_=1/Math.sqrt(g*m);for(x=0;x<3;++x){var w=(x+1)%3,T=(x+2)%3;b[x]+=_*(y[w]*v[T]-y[T]*v[w])}}}for(o=0;oa)for(_=1/Math.sqrt(k),x=0;x<3;++x)b[x]*=_;else for(x=0;x<3;++x)b[x]=0}return i},e.faceNormals=function(t,e,r){for(var n=t.length,i=new Array(n),a=void 0===r?1e-6:r,o=0;oa?1/Math.sqrt(p):0,u=0;u<3;++u)h[u]*=p;i[o]=h}return i}},567:function(t){"use strict";t.exports=function(t,e,r,n,i,a,o,s,l,u){var c=e+a+u;if(f>0){var f=Math.sqrt(c+1);t[0]=.5*(o-l)/f,t[1]=.5*(s-n)/f,t[2]=.5*(r-a)/f,t[3]=.5*f}else{var h=Math.max(e,a,u);f=Math.sqrt(2*h-c+1),e>=h?(t[0]=.5*f,t[1]=.5*(i+r)/f,t[2]=.5*(s+n)/f,t[3]=.5*(o-l)/f):a>=h?(t[0]=.5*(r+i)/f,t[1]=.5*f,t[2]=.5*(l+o)/f,t[3]=.5*(s-n)/f):(t[0]=.5*(n+s)/f,t[1]=.5*(o+l)/f,t[2]=.5*f,t[3]=.5*(r-i)/f)}return t}},7774:function(t,e,r){"use strict";t.exports=function(t){var e=(t=t||{}).center||[0,0,0],r=t.rotation||[0,0,0,1],n=t.radius||1;e=[].slice.call(e,0,3),c(r=[].slice.call(r,0,4),r);var i=new f(r,e,Math.log(n));return i.setDistanceLimits(t.zoomMin,t.zoomMax),("eye"in t||"up"in t)&&i.lookAt(0,t.eye,t.center,t.up),i};var n=r(8444),i=r(3012),a=r(5950),o=r(7437),s=r(567);function l(t,e,r){return Math.sqrt(Math.pow(t,2)+Math.pow(e,2)+Math.pow(r,2))}function u(t,e,r,n){return Math.sqrt(Math.pow(t,2)+Math.pow(e,2)+Math.pow(r,2)+Math.pow(n,2))}function c(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=u(r,n,i,a);o>1e-6?(t[0]=r/o,t[1]=n/o,t[2]=i/o,t[3]=a/o):(t[0]=t[1]=t[2]=0,t[3]=1)}function f(t,e,r){this.radius=n([r]),this.center=n(e),this.rotation=n(t),this.computedRadius=this.radius.curve(0),this.computedCenter=this.center.curve(0),this.computedRotation=this.rotation.curve(0),this.computedUp=[.1,0,0],this.computedEye=[.1,0,0],this.computedMatrix=[.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],this.recalcMatrix(0)}var h=f.prototype;h.lastT=function(){return Math.max(this.radius.lastT(),this.center.lastT(),this.rotation.lastT())},h.recalcMatrix=function(t){this.radius.curve(t),this.center.curve(t),this.rotation.curve(t);var e=this.computedRotation;c(e,e);var r=this.computedMatrix;a(r,e);var n=this.computedCenter,i=this.computedEye,o=this.computedUp,s=Math.exp(this.computedRadius[0]);i[0]=n[0]+s*r[2],i[1]=n[1]+s*r[6],i[2]=n[2]+s*r[10],o[0]=r[1],o[1]=r[5],o[2]=r[9];for(var l=0;l<3;++l){for(var u=0,f=0;f<3;++f)u+=r[l+4*f]*i[f];r[12+l]=-u}},h.getMatrix=function(t,e){this.recalcMatrix(t);var r=this.computedMatrix;if(e){for(var n=0;n<16;++n)e[n]=r[n];return e}return r},h.idle=function(t){this.center.idle(t),this.radius.idle(t),this.rotation.idle(t)},h.flush=function(t){this.center.flush(t),this.radius.flush(t),this.rotation.flush(t)},h.pan=function(t,e,r,n){e=e||0,r=r||0,n=n||0,this.recalcMatrix(t);var i=this.computedMatrix,a=i[1],o=i[5],s=i[9],u=l(a,o,s);a/=u,o/=u,s/=u;var c=i[0],f=i[4],h=i[8],p=c*a+f*o+h*s,d=l(c-=a*p,f-=o*p,h-=s*p);c/=d,f/=d,h/=d;var v=i[2],g=i[6],y=i[10],m=v*a+g*o+y*s,x=v*c+g*f+y*h,b=l(v-=m*a+x*c,g-=m*o+x*f,y-=m*s+x*h);v/=b,g/=b,y/=b;var _=c*e+a*r,w=f*e+o*r,T=h*e+s*r;this.center.move(t,_,w,T);var k=Math.exp(this.computedRadius[0]);k=Math.max(1e-4,k+n),this.radius.set(t,Math.log(k))},h.rotate=function(t,e,r,n){this.recalcMatrix(t),e=e||0,r=r||0;var i=this.computedMatrix,a=i[0],o=i[4],s=i[8],c=i[1],f=i[5],h=i[9],p=i[2],d=i[6],v=i[10],g=e*a+r*c,y=e*o+r*f,m=e*s+r*h,x=-(d*m-v*y),b=-(v*g-p*m),_=-(p*y-d*g),w=Math.sqrt(Math.max(0,1-Math.pow(x,2)-Math.pow(b,2)-Math.pow(_,2))),T=u(x,b,_,w);T>1e-6?(x/=T,b/=T,_/=T,w/=T):(x=b=_=0,w=1);var k=this.computedRotation,A=k[0],M=k[1],S=k[2],E=k[3],L=A*w+E*x+M*_-S*b,C=M*w+E*b+S*x-A*_,P=S*w+E*_+A*b-M*x,O=E*w-A*x-M*b-S*_;if(n){x=p,b=d,_=v;var I=Math.sin(n)/l(x,b,_);x*=I,b*=I,_*=I,O=O*(w=Math.cos(e))-(L=L*w+O*x+C*_-P*b)*x-(C=C*w+O*b+P*x-L*_)*b-(P=P*w+O*_+L*b-C*x)*_}var D=u(L,C,P,O);D>1e-6?(L/=D,C/=D,P/=D,O/=D):(L=C=P=0,O=1),this.rotation.set(t,L,C,P,O)},h.lookAt=function(t,e,r,n){this.recalcMatrix(t),r=r||this.computedCenter,e=e||this.computedEye,n=n||this.computedUp;var a=this.computedMatrix;i(a,e,r,n);var o=this.computedRotation;s(o,a[0],a[1],a[2],a[4],a[5],a[6],a[8],a[9],a[10]),c(o,o),this.rotation.set(t,o[0],o[1],o[2],o[3]);for(var l=0,u=0;u<3;++u)l+=Math.pow(r[u]-e[u],2);this.radius.set(t,.5*Math.log(Math.max(l,1e-6))),this.center.set(t,r[0],r[1],r[2])},h.translate=function(t,e,r,n){this.center.move(t,e||0,r||0,n||0)},h.setMatrix=function(t,e){var r=this.computedRotation;s(r,e[0],e[1],e[2],e[4],e[5],e[6],e[8],e[9],e[10]),c(r,r),this.rotation.set(t,r[0],r[1],r[2],r[3]);var n=this.computedMatrix;o(n,e);var i=n[15];if(Math.abs(i)>1e-6){var a=n[12]/i,l=n[13]/i,u=n[14]/i;this.recalcMatrix(t);var f=Math.exp(this.computedRadius[0]);this.center.set(t,a-n[2]*f,l-n[6]*f,u-n[10]*f),this.radius.idle(t)}else this.center.idle(t),this.radius.idle(t)},h.setDistance=function(t,e){e>0&&this.radius.set(t,Math.log(e))},h.setDistanceLimits=function(t,e){t=t>0?Math.log(t):-1/0,e=e>0?Math.log(e):1/0,e=Math.max(e,t),this.radius.bounds[0][0]=t,this.radius.bounds[1][0]=e},h.getDistanceLimits=function(t){var e=this.radius.bounds;return t?(t[0]=Math.exp(e[0][0]),t[1]=Math.exp(e[1][0]),t):[Math.exp(e[0][0]),Math.exp(e[1][0])]},h.toJSON=function(){return this.recalcMatrix(this.lastT()),{center:this.computedCenter.slice(),rotation:this.computedRotation.slice(),distance:Math.log(this.computedRadius[0]),zoomMin:this.radius.bounds[0][0],zoomMax:this.radius.bounds[1][0]}},h.fromJSON=function(t){var e=this.lastT(),r=t.center;r&&this.center.set(e,r[0],r[1],r[2]);var n=t.rotation;n&&this.rotation.set(e,n[0],n[1],n[2],n[3]);var i=t.distance;i&&i>0&&this.radius.set(e,Math.log(i)),this.setDistanceLimits(t.zoomMin,t.zoomMax)}},4930:function(t,e,r){"use strict";var n=r(6184);t.exports=function(t,e,r){return n(r=void 0!==r?r+"":" ",e)+t}},4405:function(t){t.exports=function(t,e){e||(e=[0,""]),t=String(t);var r=parseFloat(t,10);return e[0]=r,e[1]=t.match(/[\d.\-\+]*\s*(.*)/)[1]||"",e}},4166:function(t,e,r){"use strict";t.exports=function(t,e){for(var r=0|e.length,i=t.length,a=[new Array(r),new Array(r)],o=0;o0){o=a[c][r][0],l=c;break}s=o[1^l];for(var f=0;f<2;++f)for(var h=a[f][r],p=0;p0&&(o=d,s=v,l=f)}return i||o&&u(o,l),s}function f(t,r){var i=a[r][t][0],o=[t];u(i,r);for(var s=i[1^r];;){for(;s!==t;)o.push(s),s=c(o[o.length-2],s,!1);if(a[0][t].length+a[1][t].length===0)break;var l=o[o.length-1],f=t,h=o[1],p=c(l,f,!0);if(n(e[l],e[f],e[h],e[p])<0)break;o.push(t),s=c(l,f)}return o}function h(t,e){return e[1]===e[e.length-1]}for(o=0;o0;){a[0][o].length;var v=f(o,p);h(0,v)?d.push.apply(d,v):(d.length>0&&l.push(d),d=v)}d.length>0&&l.push(d)}return l};var n=r(9398)},3959:function(t,e,r){"use strict";t.exports=function(t,e){for(var r=n(t,e.length),i=new Array(e.length),a=new Array(e.length),o=[],s=0;s0;){i[p=o.pop()]=!1;var u=r[p];for(s=0;s0}))).length,g=new Array(v),y=new Array(v);for(p=0;p0;){var B=R.pop(),N=E[B];l(N,(function(t,e){return t-e}));var j,U=N.length,V=F[B];for(0===V&&(j=[H=d[B]]),p=0;p=0||(F[q]=1^V,R.push(q),0===V&&(z(H=d[q])||(H.reverse(),j.push(H))))}0===V&&r.push(j)}return r};var n=r(8348),i=r(4166),a=r(211),o=r(9660),s=r(9662),l=r(1215),u=r(3959);function c(t,e){for(var r=new Array(t),n=0;n0&&e[i]===r[0]))return 1;a=t[i-1]}for(var s=1;a;){var l=a.key,u=n(r,l[0],l[1]);if(l[0][0]0))return 0;s=-1,a=a.right}else if(u>0)a=a.left;else{if(!(u<0))return 0;s=1,a=a.right}}return s}}(y.slabs,y.coordinates);return 0===a.length?m:function(t,e){return function(r){return t(r[0],r[1])?0:e(r)}}(l(a),m)};var n=r(417)[3],i=r(4385),a=r(9014),o=r(5070);function s(){return!0}function l(t){for(var e={},r=0;r=u?(k=1,m=u+2*h+d):m=h*(k=-h/u)+d):(k=0,p>=0?(A=0,m=d):-p>=f?(A=1,m=f+2*p+d):m=p*(A=-p/f)+d);else if(A<0)A=0,h>=0?(k=0,m=d):-h>=u?(k=1,m=u+2*h+d):m=h*(k=-h/u)+d;else{var M=1/T;m=(k*=M)*(u*k+c*(A*=M)+2*h)+A*(c*k+f*A+2*p)+d}else k<0?(b=f+p)>(x=c+h)?(_=b-x)>=(w=u-2*c+f)?(k=1,A=0,m=u+2*h+d):m=(k=_/w)*(u*k+c*(A=1-k)+2*h)+A*(c*k+f*A+2*p)+d:(k=0,b<=0?(A=1,m=f+2*p+d):p>=0?(A=0,m=d):m=p*(A=-p/f)+d):A<0?(b=u+h)>(x=c+p)?(_=b-x)>=(w=u-2*c+f)?(A=1,k=0,m=f+2*p+d):m=(k=1-(A=_/w))*(u*k+c*A+2*h)+A*(c*k+f*A+2*p)+d:(A=0,b<=0?(k=1,m=u+2*h+d):h>=0?(k=0,m=d):m=h*(k=-h/u)+d):(_=f+p-c-h)<=0?(k=0,A=1,m=f+2*p+d):_>=(w=u-2*c+f)?(k=1,A=0,m=u+2*h+d):m=(k=_/w)*(u*k+c*(A=1-k)+2*h)+A*(c*k+f*A+2*p)+d;var S=1-k-A;for(l=0;l0){var u=t[r-1];if(0===n(s,u)&&a(u)!==l){r-=1;continue}}t[r++]=s}}return t.length=r,t}},6184:function(t){"use strict";var e,r="";t.exports=function(t,n){if("string"!=typeof t)throw new TypeError("expected a string");if(1===n)return t;if(2===n)return t+t;var i=t.length*n;if(e!==t||void 0===e)e=t,r="";else if(r.length>=i)return r.substr(0,i);for(;i>r.length&&n>1;)1&n&&(r+=t),n>>=1,t+=t;return r=(r+=t).substr(0,i)}},8161:function(t,e,r){t.exports=r.g.performance&&r.g.performance.now?function(){return performance.now()}:Date.now||function(){return+new Date}},402:function(t){"use strict";t.exports=function(t){for(var e=t.length,r=t[t.length-1],n=e,i=e-2;i>=0;--i){var a=r;(l=(s=t[i])-((r=a+s)-a))&&(t[--n]=r,r=l)}var o=0;for(i=n;i0){if(a<=0)return o;n=i+a}else{if(!(i<0))return o;if(a>=0)return o;n=-(i+a)}var s=33306690738754716e-32*n;return o>=s||o<=-s?o:f(t,e,r)},function(t,e,r,n){var i=t[0]-n[0],a=e[0]-n[0],o=r[0]-n[0],s=t[1]-n[1],l=e[1]-n[1],u=r[1]-n[1],c=t[2]-n[2],f=e[2]-n[2],p=r[2]-n[2],d=a*u,v=o*l,g=o*s,y=i*u,m=i*l,x=a*s,b=c*(d-v)+f*(g-y)+p*(m-x),_=7771561172376103e-31*((Math.abs(d)+Math.abs(v))*Math.abs(c)+(Math.abs(g)+Math.abs(y))*Math.abs(f)+(Math.abs(m)+Math.abs(x))*Math.abs(p));return b>_||-b>_?b:h(t,e,r,n)}];function d(t){var e=p[t.length];return e||(e=p[t.length]=c(t.length)),e.apply(void 0,t)}function v(t,e,r,n,i,a,o){return function(e,r,s,l,u){switch(arguments.length){case 0:case 1:return 0;case 2:return n(e,r);case 3:return i(e,r,s);case 4:return a(e,r,s,l);case 5:return o(e,r,s,l,u)}for(var c=new Array(arguments.length),f=0;f0&&o>0||a<0&&o<0)return!1;var s=n(r,t,e),l=n(i,t,e);return!(s>0&&l>0||s<0&&l<0)&&(0!==a||0!==o||0!==s||0!==l||function(t,e,r,n){for(var i=0;i<2;++i){var a=t[i],o=e[i],s=Math.min(a,o),l=Math.max(a,o),u=r[i],c=n[i],f=Math.min(u,c);if(Math.max(u,c)=n?(i=f,(l+=1)=n?(i=f,(l+=1)>1,u=e[2*l+1];if(u===a)return l;a>1,u=e[2*l+1];if(u===a)return l;a>1,u=e[2*l+1];if(u===a)return l;a0)-(t<0)},e.abs=function(t){var e=t>>31;return(t^e)-e},e.min=function(t,e){return e^(t^e)&-(t65535)<<4,e|=r=((t>>>=e)>255)<<3,e|=r=((t>>>=r)>15)<<2,(e|=r=((t>>>=r)>3)<<1)|(t>>>=r)>>1},e.log10=function(t){return t>=1e9?9:t>=1e8?8:t>=1e7?7:t>=1e6?6:t>=1e5?5:t>=1e4?4:t>=1e3?3:t>=100?2:t>=10?1:0},e.popCount=function(t){return 16843009*((t=(858993459&(t-=t>>>1&1431655765))+(t>>>2&858993459))+(t>>>4)&252645135)>>>24},e.countTrailingZeros=r,e.nextPow2=function(t){return t+=0===t,--t,t|=t>>>1,t|=t>>>2,t|=t>>>4,1+((t|=t>>>8)|t>>>16)},e.prevPow2=function(t){return t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,(t|=t>>>16)-(t>>>1)},e.parity=function(t){return t^=t>>>16,t^=t>>>8,t^=t>>>4,27030>>>(t&=15)&1};var n=new Array(256);!function(t){for(var e=0;e<256;++e){var r=e,n=e,i=7;for(r>>>=1;r;r>>>=1)n<<=1,n|=1&r,--i;t[e]=n<>>8&255]<<16|n[t>>>16&255]<<8|n[t>>>24&255]},e.interleave2=function(t,e){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t&=65535)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e&=65535)|e<<8))|e<<4))|e<<2))|e<<1))<<1},e.deinterleave2=function(t,e){return(t=65535&((t=16711935&((t=252645135&((t=858993459&((t=t>>>e&1431655765)|t>>>1))|t>>>2))|t>>>4))|t>>>16))<<16>>16},e.interleave3=function(t,e,r){return t=1227133513&((t=3272356035&((t=251719695&((t=4278190335&((t&=1023)|t<<16))|t<<8))|t<<4))|t<<2),(t|=(e=1227133513&((e=3272356035&((e=251719695&((e=4278190335&((e&=1023)|e<<16))|e<<8))|e<<4))|e<<2))<<1)|(r=1227133513&((r=3272356035&((r=251719695&((r=4278190335&((r&=1023)|r<<16))|r<<8))|r<<4))|r<<2))<<2},e.deinterleave3=function(t,e){return(t=1023&((t=4278190335&((t=251719695&((t=3272356035&((t=t>>>e&1227133513)|t>>>2))|t>>>4))|t>>>8))|t>>>16))<<22>>22},e.nextCombination=function(t){var e=t|t-1;return e+1|(~e&-~e)-1>>>r(t)+1}},6656:function(t,e,r){"use strict";var n=r(9392),i=r(9521);function a(t,e){var r=t.length,n=t.length-e.length,i=Math.min;if(n)return n;switch(r){case 0:return 0;case 1:return t[0]-e[0];case 2:return(s=t[0]+t[1]-e[0]-e[1])||i(t[0],t[1])-i(e[0],e[1]);case 3:var a=t[0]+t[1],o=e[0]+e[1];if(s=a+t[2]-(o+e[2]))return s;var s,l=i(t[0],t[1]),u=i(e[0],e[1]);return(s=i(l,t[2])-i(u,e[2]))||i(l+t[2],a)-i(u+e[2],o);default:var c=t.slice(0);c.sort();var f=e.slice(0);f.sort();for(var h=0;h>1,s=a(t[o],e);s<=0?(0===s&&(i=o),r=o+1):s>0&&(n=o-1)}return i}function c(t,e){for(var r=new Array(t.length),i=0,o=r.length;i=t.length||0!==a(t[g],s)););}return r}function f(t,e){if(e<0)return[];for(var r=[],i=(1<>>c&1&&u.push(i[c]);e.push(u)}return s(e)},e.skeleton=f,e.boundary=function(t){for(var e=[],r=0,n=t.length;r>1:(t>>1)-1}function x(t){for(var e=y(t);;){var r=e,n=2*t+1,i=2*(t+1),a=t;if(n0;){var r=m(t);if(!(r>=0&&e0){var t=k[0];return g(0,M-1),M-=1,x(0),t}return-1}function w(t,e){var r=k[t];return u[r]===e?t:(u[r]=-1/0,b(t),_(),u[r]=e,b((M+=1)-1))}function T(t){if(!c[t]){c[t]=!0;var e=s[t],r=l[t];s[r]>=0&&(s[r]=e),l[e]>=0&&(l[e]=r),A[e]>=0&&w(A[e],v(e)),A[r]>=0&&w(A[r],v(r))}}var k=[],A=new Array(a);for(f=0;f>1;f>=0;--f)x(f);for(;;){var S=_();if(S<0||u[S]>r)break;T(S)}var E=[];for(f=0;f=0&&r>=0&&e!==r){var n=A[e],i=A[r];n!==i&&C.push([n,i])}})),i.unique(i.normalize(C)),{positions:E,edges:C}};var n=r(417),i=r(6656)},6638:function(t,e,r){"use strict";t.exports=function(t,e){var r,a,o,s;if(e[0][0]e[1][0]))return i(e,t);r=e[1],a=e[0]}if(t[0][0]t[1][0]))return-i(t,e);o=t[1],s=t[0]}var l=n(r,a,s),u=n(r,a,o);if(l<0){if(u<=0)return l}else if(l>0){if(u>=0)return l}else if(u)return u;if(l=n(s,o,a),u=n(s,o,r),l<0){if(u<=0)return l}else if(l>0){if(u>=0)return l}else if(u)return u;return a[0]-s[0]};var n=r(417);function i(t,e){var r,i,a,o;if(e[0][0]e[1][0])){var s=Math.min(t[0][1],t[1][1]),l=Math.max(t[0][1],t[1][1]),u=Math.min(e[0][1],e[1][1]),c=Math.max(e[0][1],e[1][1]);return lc?s-c:l-c}r=e[1],i=e[0]}t[0][1]0)if(e[0]!==o[1][0])r=t,t=t.right;else{if(l=u(t.right,e))return l;t=t.left}else{if(e[0]!==o[1][0])return t;var l;if(l=u(t.right,e))return l;t=t.left}}return r}function c(t,e,r,n){this.y=t,this.index=e,this.start=r,this.closed=n}function f(t,e,r,n){this.x=t,this.segment=e,this.create=r,this.index=n}s.prototype.castUp=function(t){var e=n.le(this.coordinates,t[0]);if(e<0)return-1;this.slabs[e];var r=u(this.slabs[e],t),i=-1;if(r&&(i=r.value),this.coordinates[e]===t[0]){var s=null;if(r&&(s=r.key),e>0){var c=u(this.slabs[e-1],t);c&&(s?o(c.key,s)>0&&(s=c.key,i=c.value):(i=c.value,s=c.key))}var f=this.horizontal[e];if(f.length>0){var h=n.ge(f,t[1],l);if(h=f.length)return i;p=f[h]}}if(p.start)if(s){var d=a(s[0],s[1],[t[0],p.y]);s[0][0]>s[1][0]&&(d=-d),d>0&&(i=p.index)}else i=p.index;else p.y!==t[1]&&(i=p.index)}}}return i}},4670:function(t,e,r){"use strict";var n=r(9130),i=r(9662);function a(t,e){var r=i(n(t,e),[e[e.length-1]]);return r[r.length-1]}function o(t,e,r,n){var i=-e/(n-e);i<0?i=0:i>1&&(i=1);for(var a=1-i,o=t.length,s=new Array(o),l=0;l0||i>0&&c<0){var f=o(s,c,l,i);r.push(f),n.push(f.slice())}c<0?n.push(l.slice()):c>0?r.push(l.slice()):(r.push(l.slice()),n.push(l.slice())),i=c}return{positive:r,negative:n}},t.exports.positive=function(t,e){for(var r=[],n=a(t[t.length-1],e),i=t[t.length-1],s=t[0],l=0;l0||n>0&&u<0)&&r.push(o(i,u,s,n)),u>=0&&r.push(s.slice()),n=u}return r},t.exports.negative=function(t,e){for(var r=[],n=a(t[t.length-1],e),i=t[t.length-1],s=t[0],l=0;l0||n>0&&u<0)&&r.push(o(i,u,s,n)),u<=0&&r.push(s.slice()),n=u}return r}},8974:function(t,e,r){var n;!function(){"use strict";var i={not_string:/[^s]/,not_bool:/[^t]/,not_type:/[^T]/,not_primitive:/[^v]/,number:/[diefg]/,numeric_arg:/[bcdiefguxX]/,json:/[j]/,not_json:/[^j]/,text:/^[^\x25]+/,modulo:/^\x25{2}/,placeholder:/^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,key:/^([a-z_][a-z_\d]*)/i,key_access:/^\.([a-z_][a-z_\d]*)/i,index_access:/^\[(\d+)\]/,sign:/^[+-]/};function a(t){return function(t,e){var r,n,o,s,l,u,c,f,h,p=1,d=t.length,v="";for(n=0;n=0),s.type){case"b":r=parseInt(r,10).toString(2);break;case"c":r=String.fromCharCode(parseInt(r,10));break;case"d":case"i":r=parseInt(r,10);break;case"j":r=JSON.stringify(r,null,s.width?parseInt(s.width):0);break;case"e":r=s.precision?parseFloat(r).toExponential(s.precision):parseFloat(r).toExponential();break;case"f":r=s.precision?parseFloat(r).toFixed(s.precision):parseFloat(r);break;case"g":r=s.precision?String(Number(r.toPrecision(s.precision))):parseFloat(r);break;case"o":r=(parseInt(r,10)>>>0).toString(8);break;case"s":r=String(r),r=s.precision?r.substring(0,s.precision):r;break;case"t":r=String(!!r),r=s.precision?r.substring(0,s.precision):r;break;case"T":r=Object.prototype.toString.call(r).slice(8,-1).toLowerCase(),r=s.precision?r.substring(0,s.precision):r;break;case"u":r=parseInt(r,10)>>>0;break;case"v":r=r.valueOf(),r=s.precision?r.substring(0,s.precision):r;break;case"x":r=(parseInt(r,10)>>>0).toString(16);break;case"X":r=(parseInt(r,10)>>>0).toString(16).toUpperCase()}i.json.test(s.type)?v+=r:(!i.number.test(s.type)||f&&!s.sign?h="":(h=f?"+":"-",r=r.toString().replace(i.sign,"")),u=s.pad_char?"0"===s.pad_char?"0":s.pad_char.charAt(1):" ",c=s.width-(h+r).length,l=s.width&&c>0?u.repeat(c):"",v+=s.align?h+r+l:"0"===u?h+l+r:l+h+r)}return v}(function(t){if(s[t])return s[t];for(var e,r=t,n=[],a=0;r;){if(null!==(e=i.text.exec(r)))n.push(e[0]);else if(null!==(e=i.modulo.exec(r)))n.push("%");else{if(null===(e=i.placeholder.exec(r)))throw new SyntaxError("[sprintf] unexpected placeholder");if(e[2]){a|=1;var o=[],l=e[2],u=[];if(null===(u=i.key.exec(l)))throw new SyntaxError("[sprintf] failed to parse named argument key");for(o.push(u[1]);""!==(l=l.substring(u[0].length));)if(null!==(u=i.key_access.exec(l)))o.push(u[1]);else{if(null===(u=i.index_access.exec(l)))throw new SyntaxError("[sprintf] failed to parse named argument key");o.push(u[1])}e[2]=o}else a|=2;if(3===a)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");n.push({placeholder:e[0],param_no:e[1],keys:e[2],sign:e[3],pad_char:e[4],align:e[5],width:e[6],precision:e[7],type:e[8]})}r=r.substring(e[0].length)}return s[t]=n}(t),arguments)}function o(t,e){return a.apply(null,[t].concat(e||[]))}var s=Object.create(null);e.sprintf=a,e.vsprintf=o,"undefined"!=typeof window&&(window.sprintf=a,window.vsprintf=o,void 0===(n=function(){return{sprintf:a,vsprintf:o}}.call(e,r,e,t))||(t.exports=n))}()},4162:function(t,e,r){"use strict";t.exports=function(t,e){if(t.dimension<=0)return{positions:[],cells:[]};if(1===t.dimension)return function(t,e){for(var r=i(t,e),n=r.length,a=new Array(n),o=new Array(n),s=0;sn|0},vertex:function(t,e,r,n,i,a,o,s,l,u,c,f,h){var p=(o<<0)+(s<<1)+(l<<2)+(u<<3)|0;if(0!==p&&15!==p)switch(p){case 0:case 15:c.push([t-.5,e-.5]);break;case 1:c.push([t-.25-.25*(n+r-2*h)/(r-n),e-.25-.25*(i+r-2*h)/(r-i)]);break;case 2:c.push([t-.75-.25*(-n-r+2*h)/(n-r),e-.25-.25*(a+n-2*h)/(n-a)]);break;case 3:c.push([t-.5,e-.5-.5*(i+r+a+n-4*h)/(r-i+n-a)]);break;case 4:c.push([t-.25-.25*(a+i-2*h)/(i-a),e-.75-.25*(-i-r+2*h)/(i-r)]);break;case 5:c.push([t-.5-.5*(n+r+a+i-4*h)/(r-n+i-a),e-.5]);break;case 6:c.push([t-.5-.25*(-n-r+a+i)/(n-r+i-a),e-.5-.25*(-i-r+a+n)/(i-r+n-a)]);break;case 7:c.push([t-.75-.25*(a+i-2*h)/(i-a),e-.75-.25*(a+n-2*h)/(n-a)]);break;case 8:c.push([t-.75-.25*(-a-i+2*h)/(a-i),e-.75-.25*(-a-n+2*h)/(a-n)]);break;case 9:c.push([t-.5-.25*(n+r+-a-i)/(r-n+a-i),e-.5-.25*(i+r+-a-n)/(r-i+a-n)]);break;case 10:c.push([t-.5-.5*(-n-r-a-i+4*h)/(n-r+a-i),e-.5]);break;case 11:c.push([t-.25-.25*(-a-i+2*h)/(a-i),e-.75-.25*(i+r-2*h)/(r-i)]);break;case 12:c.push([t-.5,e-.5-.5*(-i-r-a-n+4*h)/(i-r+a-n)]);break;case 13:c.push([t-.75-.25*(n+r-2*h)/(r-n),e-.25-.25*(-a-n+2*h)/(a-n)]);break;case 14:c.push([t-.25-.25*(-n-r+2*h)/(n-r),e-.25-.25*(-i-r+2*h)/(i-r)])}},cell:function(t,e,r,n,i,a,o,s,l){i?s.push([t,e]):s.push([e,t])}});return function(t,e){var r=[],i=[];return n(t,r,i,e),{positions:r,cells:i}}}},o={}},6946:function(t,e,r){"use strict";t.exports=function t(e,r,i){i=i||{};var a=o[e];a||(a=o[e]={" ":{data:new Float32Array(0),shape:.2}});var s=a[r];if(!s)if(r.length<=1||!/\d/.test(r))s=a[r]=function(t){for(var e=t.cells,r=t.positions,n=new Float32Array(6*e.length),i=0,a=0,o=0;o0&&(f+=.02);var p=new Float32Array(c),d=0,v=-.5*f;for(h=0;hMath.max(r,n)?i[2]=1:r>Math.max(e,n)?i[0]=1:i[1]=1;for(var a=0,o=0,l=0;l<3;++l)a+=t[l]*t[l],o+=i[l]*t[l];for(l=0;l<3;++l)i[l]-=o/a*t[l];return s(i,i),i}function h(t,e,r,i,a,o,s,l){this.center=n(r),this.up=n(i),this.right=n(a),this.radius=n([o]),this.angle=n([s,l]),this.angle.bounds=[[-1/0,-Math.PI/2],[1/0,Math.PI/2]],this.setDistanceLimits(t,e),this.computedCenter=this.center.curve(0),this.computedUp=this.up.curve(0),this.computedRight=this.right.curve(0),this.computedRadius=this.radius.curve(0),this.computedAngle=this.angle.curve(0),this.computedToward=[0,0,0],this.computedEye=[0,0,0],this.computedMatrix=new Array(16);for(var u=0;u<16;++u)this.computedMatrix[u]=.5;this.recalcMatrix(0)}var p=h.prototype;p.setDistanceLimits=function(t,e){t=t>0?Math.log(t):-1/0,e=e>0?Math.log(e):1/0,e=Math.max(e,t),this.radius.bounds[0][0]=t,this.radius.bounds[1][0]=e},p.getDistanceLimits=function(t){var e=this.radius.bounds[0];return t?(t[0]=Math.exp(e[0][0]),t[1]=Math.exp(e[1][0]),t):[Math.exp(e[0][0]),Math.exp(e[1][0])]},p.recalcMatrix=function(t){this.center.curve(t),this.up.curve(t),this.right.curve(t),this.radius.curve(t),this.angle.curve(t);for(var e=this.computedUp,r=this.computedRight,n=0,i=0,a=0;a<3;++a)i+=e[a]*r[a],n+=e[a]*e[a];var l=Math.sqrt(n),c=0;for(a=0;a<3;++a)r[a]-=e[a]*i/n,c+=r[a]*r[a],e[a]/=l;var f=Math.sqrt(c);for(a=0;a<3;++a)r[a]/=f;var h=this.computedToward;o(h,e,r),s(h,h);var p=Math.exp(this.computedRadius[0]),d=this.computedAngle[0],v=this.computedAngle[1],g=Math.cos(d),y=Math.sin(d),m=Math.cos(v),x=Math.sin(v),b=this.computedCenter,_=g*m,w=y*m,T=x,k=-g*x,A=-y*x,M=m,S=this.computedEye,E=this.computedMatrix;for(a=0;a<3;++a){var L=_*r[a]+w*h[a]+T*e[a];E[4*a+1]=k*r[a]+A*h[a]+M*e[a],E[4*a+2]=L,E[4*a+3]=0}var C=E[1],P=E[5],O=E[9],I=E[2],D=E[6],z=E[10],R=P*z-O*D,F=O*I-C*z,B=C*D-P*I,N=u(R,F,B);for(R/=N,F/=N,B/=N,E[0]=R,E[4]=F,E[8]=B,a=0;a<3;++a)S[a]=b[a]+E[2+4*a]*p;for(a=0;a<3;++a){c=0;for(var j=0;j<3;++j)c+=E[a+4*j]*S[j];E[12+a]=-c}E[15]=1},p.getMatrix=function(t,e){this.recalcMatrix(t);var r=this.computedMatrix;if(e){for(var n=0;n<16;++n)e[n]=r[n];return e}return r};var d=[0,0,0];p.rotate=function(t,e,r,n){if(this.angle.move(t,e,r),n){this.recalcMatrix(t);var i=this.computedMatrix;d[0]=i[2],d[1]=i[6],d[2]=i[10];for(var o=this.computedUp,s=this.computedRight,l=this.computedToward,u=0;u<3;++u)i[4*u]=o[u],i[4*u+1]=s[u],i[4*u+2]=l[u];for(a(i,i,n,d),u=0;u<3;++u)o[u]=i[4*u],s[u]=i[4*u+1];this.up.set(t,o[0],o[1],o[2]),this.right.set(t,s[0],s[1],s[2])}},p.pan=function(t,e,r,n){e=e||0,r=r||0,n=n||0,this.recalcMatrix(t);var i=this.computedMatrix,a=(Math.exp(this.computedRadius[0]),i[1]),o=i[5],s=i[9],l=u(a,o,s);a/=l,o/=l,s/=l;var c=i[0],f=i[4],h=i[8],p=c*a+f*o+h*s,d=u(c-=a*p,f-=o*p,h-=s*p),v=(c/=d)*e+a*r,g=(f/=d)*e+o*r,y=(h/=d)*e+s*r;this.center.move(t,v,g,y);var m=Math.exp(this.computedRadius[0]);m=Math.max(1e-4,m+n),this.radius.set(t,Math.log(m))},p.translate=function(t,e,r,n){this.center.move(t,e||0,r||0,n||0)},p.setMatrix=function(t,e,r,n){var a=1;"number"==typeof r&&(a=0|r),(a<0||a>3)&&(a=1);var o=(a+2)%3;e||(this.recalcMatrix(t),e=this.computedMatrix);var s=e[a],l=e[a+4],f=e[a+8];if(n){var h=Math.abs(s),p=Math.abs(l),d=Math.abs(f),v=Math.max(h,p,d);h===v?(s=s<0?-1:1,l=f=0):d===v?(f=f<0?-1:1,s=l=0):(l=l<0?-1:1,s=f=0)}else{var g=u(s,l,f);s/=g,l/=g,f/=g}var y,m,x=e[o],b=e[o+4],_=e[o+8],w=x*s+b*l+_*f,T=u(x-=s*w,b-=l*w,_-=f*w),k=l*(_/=T)-f*(b/=T),A=f*(x/=T)-s*_,M=s*b-l*x,S=u(k,A,M);if(k/=S,A/=S,M/=S,this.center.jump(t,q,G,Z),this.radius.idle(t),this.up.jump(t,s,l,f),this.right.jump(t,x,b,_),2===a){var E=e[1],L=e[5],C=e[9],P=E*x+L*b+C*_,O=E*k+L*A+C*M;y=R<0?-Math.PI/2:Math.PI/2,m=Math.atan2(O,P)}else{var I=e[2],D=e[6],z=e[10],R=I*s+D*l+z*f,F=I*x+D*b+z*_,B=I*k+D*A+z*M;y=Math.asin(c(R)),m=Math.atan2(B,F)}this.angle.jump(t,m,y),this.recalcMatrix(t);var N=e[2],j=e[6],U=e[10],V=this.computedMatrix;i(V,e);var H=V[15],q=V[12]/H,G=V[13]/H,Z=V[14]/H,Y=Math.exp(this.computedRadius[0]);this.center.jump(t,q-N*Y,G-j*Y,Z-U*Y)},p.lastT=function(){return Math.max(this.center.lastT(),this.up.lastT(),this.right.lastT(),this.radius.lastT(),this.angle.lastT())},p.idle=function(t){this.center.idle(t),this.up.idle(t),this.right.idle(t),this.radius.idle(t),this.angle.idle(t)},p.flush=function(t){this.center.flush(t),this.up.flush(t),this.right.flush(t),this.radius.flush(t),this.angle.flush(t)},p.setDistance=function(t,e){e>0&&this.radius.set(t,Math.log(e))},p.lookAt=function(t,e,r,n){this.recalcMatrix(t),e=e||this.computedEye,r=r||this.computedCenter;var i=(n=n||this.computedUp)[0],a=n[1],o=n[2],s=u(i,a,o);if(!(s<1e-6)){i/=s,a/=s,o/=s;var l=e[0]-r[0],f=e[1]-r[1],h=e[2]-r[2],p=u(l,f,h);if(!(p<1e-6)){l/=p,f/=p,h/=p;var d=this.computedRight,v=d[0],g=d[1],y=d[2],m=i*v+a*g+o*y,x=u(v-=m*i,g-=m*a,y-=m*o);if(!(x<.01&&(x=u(v=a*h-o*f,g=o*l-i*h,y=i*f-a*l))<1e-6)){v/=x,g/=x,y/=x,this.up.set(t,i,a,o),this.right.set(t,v,g,y),this.center.set(t,r[0],r[1],r[2]),this.radius.set(t,Math.log(p));var b=a*y-o*g,_=o*v-i*y,w=i*g-a*v,T=u(b,_,w),k=i*l+a*f+o*h,A=v*l+g*f+y*h,M=(b/=T)*l+(_/=T)*f+(w/=T)*h,S=Math.asin(c(k)),E=Math.atan2(M,A),L=this.angle._state,C=L[L.length-1],P=L[L.length-2];C%=2*Math.PI;var O=Math.abs(C+2*Math.PI-E),I=Math.abs(C-E),D=Math.abs(C-2*Math.PI-E);O0?r.pop():new ArrayBuffer(t)}function d(t){return new Uint8Array(p(t),0,t)}function v(t){return new Uint16Array(p(2*t),0,t)}function g(t){return new Uint32Array(p(4*t),0,t)}function y(t){return new Int8Array(p(t),0,t)}function m(t){return new Int16Array(p(2*t),0,t)}function x(t){return new Int32Array(p(4*t),0,t)}function b(t){return new Float32Array(p(4*t),0,t)}function _(t){return new Float64Array(p(8*t),0,t)}function w(t){return o?new Uint8ClampedArray(p(t),0,t):d(t)}function T(t){return s?new BigUint64Array(p(8*t),0,t):null}function k(t){return l?new BigInt64Array(p(8*t),0,t):null}function A(t){return new DataView(p(t),0,t)}function M(t){t=n.nextPow2(t);var e=n.log2(t),r=f[e];return r.length>0?r.pop():new a(t)}e.free=function(t){if(a.isBuffer(t))f[n.log2(t.length)].push(t);else{if("[object ArrayBuffer]"!==Object.prototype.toString.call(t)&&(t=t.buffer),!t)return;var e=t.length||t.byteLength,r=0|n.log2(e);c[r].push(t)}},e.freeUint8=e.freeUint16=e.freeUint32=e.freeBigUint64=e.freeInt8=e.freeInt16=e.freeInt32=e.freeBigInt64=e.freeFloat32=e.freeFloat=e.freeFloat64=e.freeDouble=e.freeUint8Clamped=e.freeDataView=function(t){h(t.buffer)},e.freeArrayBuffer=h,e.freeBuffer=function(t){f[n.log2(t.length)].push(t)},e.malloc=function(t,e){if(void 0===e||"arraybuffer"===e)return p(t);switch(e){case"uint8":return d(t);case"uint16":return v(t);case"uint32":return g(t);case"int8":return y(t);case"int16":return m(t);case"int32":return x(t);case"float":case"float32":return b(t);case"double":case"float64":return _(t);case"uint8_clamped":return w(t);case"bigint64":return k(t);case"biguint64":return T(t);case"buffer":return M(t);case"data":case"dataview":return A(t);default:return null}return null},e.mallocArrayBuffer=p,e.mallocUint8=d,e.mallocUint16=v,e.mallocUint32=g,e.mallocInt8=y,e.mallocInt16=m,e.mallocInt32=x,e.mallocFloat32=e.mallocFloat=b,e.mallocFloat64=e.mallocDouble=_,e.mallocUint8Clamped=w,e.mallocBigUint64=T,e.mallocBigInt64=k,e.mallocDataView=A,e.mallocBuffer=M,e.clearCache=function(){for(var t=0;t<32;++t)u.UINT8[t].length=0,u.UINT16[t].length=0,u.UINT32[t].length=0,u.INT8[t].length=0,u.INT16[t].length=0,u.INT32[t].length=0,u.FLOAT[t].length=0,u.DOUBLE[t].length=0,u.BIGUINT64[t].length=0,u.BIGINT64[t].length=0,u.UINT8C[t].length=0,c[t].length=0,f[t].length=0}},1731:function(t){"use strict";function e(t){this.roots=new Array(t),this.ranks=new Array(t);for(var e=0;e0&&(a=n.size),n.lineSpacing&&n.lineSpacing>0&&(o=n.lineSpacing),n.styletags&&n.styletags.breaklines&&(s.breaklines=!!n.styletags.breaklines),n.styletags&&n.styletags.bolds&&(s.bolds=!!n.styletags.bolds),n.styletags&&n.styletags.italics&&(s.italics=!!n.styletags.italics),n.styletags&&n.styletags.subscripts&&(s.subscripts=!!n.styletags.subscripts),n.styletags&&n.styletags.superscripts&&(s.superscripts=!!n.styletags.superscripts)),r.font=[n.fontStyle,n.fontVariant,n.fontWeight,a+"px",n.font].filter((function(t){return t})).join(" "),r.textAlign="start",r.textBaseline="alphabetic",r.direction="ltr",w(function(t,e,r,n,a,o){r=r.replace(/\n/g,""),r=!0===o.breaklines?r.replace(/\/g,"\n"):r.replace(/\/g," ");var s="",l=[];for(T=0;T-1?parseInt(t[1+i]):0,l=a>-1?parseInt(r[1+a]):0;s!==l&&(n=n.replace(F(),"?px "),M*=Math.pow(.75,l-s),n=n.replace("?px ",F())),A+=.25*L*(l-s)}if(!0===o.superscripts){var u=t.indexOf(d),f=r.indexOf(d),p=u>-1?parseInt(t[1+u]):0,v=f>-1?parseInt(r[1+f]):0;p!==v&&(n=n.replace(F(),"?px "),M*=Math.pow(.75,v-p),n=n.replace("?px ",F())),A-=.25*L*(v-p)}if(!0===o.bolds){var g=t.indexOf(c)>-1,m=r.indexOf(c)>-1;!g&&m&&(n=x?n.replace("italic ","italic bold "):"bold "+n),g&&!m&&(n=n.replace("bold ",""))}if(!0===o.italics){var x=t.indexOf(h)>-1,b=r.indexOf(h)>-1;!x&&b&&(n="italic "+n),x&&!b&&(n=n.replace("italic ",""))}e.font=n}for(w=0;w",a="",o=i.length,s=a.length,l=e[0]===d||e[0]===y,u=0,c=-s;u>-1&&-1!==(u=r.indexOf(i,u))&&-1!==(c=r.indexOf(a,u+o))&&!(c<=u);){for(var f=u;f=c)n[f]=null,r=r.substr(0,f)+" "+r.substr(f+1);else if(null!==n[f]){var h=n[f].indexOf(e[0]);-1===h?n[f]+=e:l&&(n[f]=n[f].substr(0,h+1)+(1+parseInt(n[f][h+1]))+n[f].substr(h+2))}var p=u+o,v=r.substr(p,c-p).indexOf(i);u=-1!==v?v:c+s}return n}function b(t,e){var r=n(t,128);return e?a(r.cells,r.positions,.25):{edges:r.cells,positions:r.positions}}function _(t,e,r,n){var i=b(t,n),a=function(t,e,r){for(var n=e.textAlign||"start",i=e.textBaseline||"alphabetic",a=[1<<30,1<<30],o=[0,0],s=t.length,l=0;l=0?e[a]:i}))},has___:{value:x((function(e){var n=m(e);return n?r in n:t.indexOf(e)>=0}))},set___:{value:x((function(n,i){var a,o=m(n);return o?o[r]=i:(a=t.indexOf(n))>=0?e[a]=i:(a=t.length,e[a]=i,t[a]=n),this}))},delete___:{value:x((function(n){var i,a,o=m(n);return o?r in o&&delete o[r]:!((i=t.indexOf(n))<0||(a=t.length-1,t[i]=void 0,e[i]=e[a],t[i]=t[a],t.length=a,e.length=a,0))}))}})};v.prototype=Object.create(Object.prototype,{get:{value:function(t,e){return this.get___(t,e)},writable:!0,configurable:!0},has:{value:function(t){return this.has___(t)},writable:!0,configurable:!0},set:{value:function(t,e){return this.set___(t,e)},writable:!0,configurable:!0},delete:{value:function(t){return this.delete___(t)},writable:!0,configurable:!0}}),"function"==typeof r?function(){function n(){this instanceof v||b();var t,n=new r,i=void 0,a=!1;return t=e?function(t,e){return n.set(t,e),n.has(t)||(i||(i=new v),i.set(t,e)),this}:function(t,e){if(a)try{n.set(t,e)}catch(r){i||(i=new v),i.set___(t,e)}else n.set(t,e);return this},Object.create(v.prototype,{get___:{value:x((function(t,e){return i?n.has(t)?n.get(t):i.get___(t,e):n.get(t,e)}))},has___:{value:x((function(t){return n.has(t)||!!i&&i.has___(t)}))},set___:{value:x(t)},delete___:{value:x((function(t){var e=!!n.delete(t);return i&&i.delete___(t)||e}))},permitHostObjects___:{value:x((function(t){if(t!==g)throw new Error("bogus call to permitHostObjects___");a=!0}))}})}e&&"undefined"!=typeof Proxy&&(Proxy=void 0),n.prototype=v.prototype,t.exports=n,Object.defineProperty(WeakMap.prototype,"constructor",{value:WeakMap,enumerable:!1,configurable:!0,writable:!0})}():("undefined"!=typeof Proxy&&(Proxy=void 0),t.exports=v)}function g(t){t.permitHostObjects___&&t.permitHostObjects___(g)}function y(t){return!(t.substr(0,8)==l&&"___"===t.substr(t.length-3))}function m(t){if(t!==Object(t))throw new TypeError("Not an object: "+t);var e=t[u];if(e&&e.key===t)return e;if(s(t)){e={key:t};try{return o(t,u,{value:e,writable:!1,enumerable:!1,configurable:!1}),e}catch(t){return}}}function x(t){return t.prototype=null,Object.freeze(t)}function b(){p||"undefined"==typeof console||(p=!0,console.warn("WeakMap should be invoked as new WeakMap(), not WeakMap(). This will be an error in the future."))}}()},9222:function(t,e,r){var n=r(7178);t.exports=function(){var t={};return function(e){if(("object"!=typeof e||null===e)&&"function"!=typeof e)throw new Error("Weakmap-shim: Key must be object");var r=e.valueOf(t);return r&&r.identity===t?r:n(e,t)}}},7178:function(t){t.exports=function(t,e){var r={identity:e},n=t.valueOf;return Object.defineProperty(t,"valueOf",{value:function(t){return t!==e?n.apply(this,arguments):r},writable:!0}),r}},4037:function(t,e,r){var n=r(9222);t.exports=function(){var t=n();return{get:function(e,r){var n=t(e);return n.hasOwnProperty("value")?n.value:r},set:function(e,r){return t(e).value=r,this},has:function(e){return"value"in t(e)},delete:function(e){return delete t(e).value}}}},6183:function(t){"use strict";t.exports=function(t){var e={};return function(r,n,i){var a=r.dtype,o=r.order,s=[a,o.join()].join(),l=e[s];return l||(e[s]=l=t([a,o])),l(r.shape.slice(0),r.data,r.stride,0|r.offset,n,i)}}(function(){return function(t,e,r,n,i,a){var o=t[0],s=r[0],l=[0],u=s;n|=0;var c=0,f=s;for(c=0;c=0!=p>=0&&i.push(l[0]+.5+.5*(h+p)/(h-p)),n+=f,++l[0]}}}.bind(void 0,{funcName:"zeroCrossings"}))},9584:function(t,e,r){"use strict";t.exports=function(t,e){var r=[];return e=+e||0,n(t.hi(t.shape[0]-1),r,e),r};var n=r(6183)},6601:function(){}},e={};function r(n){var i=e[n];if(void 0!==i)return i.exports;var a=e[n]={id:n,loaded:!1,exports:{}};return t[n].call(a.exports,a,a.exports,r),a.loaded=!0,a.exports}return r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),r.nmd=function(t){return t.paths=[],t.children||(t.children=[]),t},r(7386)}()},t.exports=n()},12856:function(t,e,r){"use strict";function n(t,e){for(var r=0;rf)throw new RangeError('The value "'+t+'" is invalid for option "size"');var e=new Uint8Array(t);return Object.setPrototypeOf(e,p.prototype),e}function p(t,e,r){if("number"==typeof t){if("string"==typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return g(t)}return d(t,e,r)}function d(t,e,r){if("string"==typeof t)return function(t,e){if("string"==typeof e&&""!==e||(e="utf8"),!p.isEncoding(e))throw new TypeError("Unknown encoding: "+e);var r=0|b(t,e),n=h(r),i=n.write(t,e);return i!==r&&(n=n.slice(0,i)),n}(t,e);if(ArrayBuffer.isView(t))return function(t){if(tt(t,Uint8Array)){var e=new Uint8Array(t);return m(e.buffer,e.byteOffset,e.byteLength)}return y(t)}(t);if(null==t)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+s(t));if(tt(t,ArrayBuffer)||t&&tt(t.buffer,ArrayBuffer))return m(t,e,r);if("undefined"!=typeof SharedArrayBuffer&&(tt(t,SharedArrayBuffer)||t&&tt(t.buffer,SharedArrayBuffer)))return m(t,e,r);if("number"==typeof t)throw new TypeError('The "value" argument must not be of type number. Received type number');var n=t.valueOf&&t.valueOf();if(null!=n&&n!==t)return p.from(n,e,r);var i=function(t){if(p.isBuffer(t)){var e=0|x(t.length),r=h(e);return 0===r.length||t.copy(r,0,0,e),r}return void 0!==t.length?"number"!=typeof t.length||et(t.length)?h(0):y(t):"Buffer"===t.type&&Array.isArray(t.data)?y(t.data):void 0}(t);if(i)return i;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof t[Symbol.toPrimitive])return p.from(t[Symbol.toPrimitive]("string"),e,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+s(t))}function v(t){if("number"!=typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('The value "'+t+'" is invalid for option "size"')}function g(t){return v(t),h(t<0?0:0|x(t))}function y(t){for(var e=t.length<0?0:0|x(t.length),r=h(e),n=0;n=f)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+f.toString(16)+" bytes");return 0|t}function b(t,e){if(p.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||tt(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+s(t));var r=t.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;for(var i=!1;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return K(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return $(t).length;default:if(i)return n?-1:K(t).length;e=(""+e).toLowerCase(),i=!0}}function _(t,e,r){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return z(this,e,r);case"utf8":case"utf-8":return P(this,e,r);case"ascii":return I(this,e,r);case"latin1":case"binary":return D(this,e,r);case"base64":return C(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return R(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function w(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function T(t,e,r,n,i){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),et(r=+r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof e&&(e=p.from(e,n)),p.isBuffer(e))return 0===e.length?-1:k(t,e,r,n,i);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):k(t,[e],r,n,i);throw new TypeError("val must be string, number or Buffer")}function k(t,e,r,n,i){var a,o=1,s=t.length,l=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;o=2,s/=2,l/=2,r/=2}function u(t,e){return 1===o?t[e]:t.readUInt16BE(e*o)}if(i){var c=-1;for(a=r;as&&(r=s-l),a=r;a>=0;a--){for(var f=!0,h=0;hi&&(n=i):n=i;var a,o=e.length;for(n>o/2&&(n=o/2),a=0;a>8,i=r%256,a.push(i),a.push(n);return a}(e,t.length-r),t,r,n)}function C(t,e,r){return 0===e&&r===t.length?l.fromByteArray(t):l.fromByteArray(t.slice(e,r))}function P(t,e,r){r=Math.min(t.length,r);for(var n=[],i=e;i239?4:a>223?3:a>191?2:1;if(i+s<=r){var l=void 0,u=void 0,c=void 0,f=void 0;switch(s){case 1:a<128&&(o=a);break;case 2:128==(192&(l=t[i+1]))&&(f=(31&a)<<6|63&l)>127&&(o=f);break;case 3:l=t[i+1],u=t[i+2],128==(192&l)&&128==(192&u)&&(f=(15&a)<<12|(63&l)<<6|63&u)>2047&&(f<55296||f>57343)&&(o=f);break;case 4:l=t[i+1],u=t[i+2],c=t[i+3],128==(192&l)&&128==(192&u)&&128==(192&c)&&(f=(15&a)<<18|(63&l)<<12|(63&u)<<6|63&c)>65535&&f<1114112&&(o=f)}}null===o?(o=65533,s=1):o>65535&&(o-=65536,n.push(o>>>10&1023|55296),o=56320|1023&o),n.push(o),i+=s}return function(t){var e=t.length;if(e<=O)return String.fromCharCode.apply(String,t);for(var r="",n=0;nn.length?(p.isBuffer(a)||(a=p.from(a)),a.copy(n,i)):Uint8Array.prototype.set.call(n,a,i);else{if(!p.isBuffer(a))throw new TypeError('"list" argument must be an Array of Buffers');a.copy(n,i)}i+=a.length}return n},p.byteLength=b,p.prototype._isBuffer=!0,p.prototype.swap16=function(){var t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var e=0;er&&(t+=" ... "),""},c&&(p.prototype[c]=p.prototype.inspect),p.prototype.compare=function(t,e,r,n,i){if(tt(t,Uint8Array)&&(t=p.from(t,t.offset,t.byteLength)),!p.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+s(t));if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(this===t)return 0;for(var a=(i>>>=0)-(n>>>=0),o=(r>>>=0)-(e>>>=0),l=Math.min(a,o),u=this.slice(n,i),c=t.slice(e,r),f=0;f>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}var i=this.length-e;if((void 0===r||r>i)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var a=!1;;)switch(n){case"hex":return A(this,t,e,r);case"utf8":case"utf-8":return M(this,t,e,r);case"ascii":case"latin1":case"binary":return S(this,t,e,r);case"base64":return E(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return L(this,t,e,r);default:if(a)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),a=!0}},p.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var O=4096;function I(t,e,r){var n="";r=Math.min(t.length,r);for(var i=e;in)&&(r=n);for(var i="",a=e;ar)throw new RangeError("Trying to access beyond buffer length")}function B(t,e,r,n,i,a){if(!p.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError("Index out of range")}function N(t,e,r,n,i){Y(e,n,i,t,r,7);var a=Number(e&BigInt(4294967295));t[r++]=a,a>>=8,t[r++]=a,a>>=8,t[r++]=a,a>>=8,t[r++]=a;var o=Number(e>>BigInt(32)&BigInt(4294967295));return t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o,r}function j(t,e,r,n,i){Y(e,n,i,t,r,7);var a=Number(e&BigInt(4294967295));t[r+7]=a,a>>=8,t[r+6]=a,a>>=8,t[r+5]=a,a>>=8,t[r+4]=a;var o=Number(e>>BigInt(32)&BigInt(4294967295));return t[r+3]=o,o>>=8,t[r+2]=o,o>>=8,t[r+1]=o,o>>=8,t[r]=o,r+8}function U(t,e,r,n,i,a){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function V(t,e,r,n,i){return e=+e,r>>>=0,i||U(t,0,r,4),u.write(t,e,r,n,23,4),r+4}function H(t,e,r,n,i){return e=+e,r>>>=0,i||U(t,0,r,8),u.write(t,e,r,n,52,8),r+8}p.prototype.slice=function(t,e){var r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e>>=0,e>>>=0,r||F(t,e,this.length);for(var n=this[t],i=1,a=0;++a>>=0,e>>>=0,r||F(t,e,this.length);for(var n=this[t+--e],i=1;e>0&&(i*=256);)n+=this[t+--e]*i;return n},p.prototype.readUint8=p.prototype.readUInt8=function(t,e){return t>>>=0,e||F(t,1,this.length),this[t]},p.prototype.readUint16LE=p.prototype.readUInt16LE=function(t,e){return t>>>=0,e||F(t,2,this.length),this[t]|this[t+1]<<8},p.prototype.readUint16BE=p.prototype.readUInt16BE=function(t,e){return t>>>=0,e||F(t,2,this.length),this[t]<<8|this[t+1]},p.prototype.readUint32LE=p.prototype.readUInt32LE=function(t,e){return t>>>=0,e||F(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},p.prototype.readUint32BE=p.prototype.readUInt32BE=function(t,e){return t>>>=0,e||F(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},p.prototype.readBigUInt64LE=nt((function(t){W(t>>>=0,"offset");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||X(t,this.length-8);var n=e+this[++t]*Math.pow(2,8)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,24),i=this[++t]+this[++t]*Math.pow(2,8)+this[++t]*Math.pow(2,16)+r*Math.pow(2,24);return BigInt(n)+(BigInt(i)<>>=0,"offset");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||X(t,this.length-8);var n=e*Math.pow(2,24)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,8)+this[++t],i=this[++t]*Math.pow(2,24)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,8)+r;return(BigInt(n)<>>=0,e>>>=0,r||F(t,e,this.length);for(var n=this[t],i=1,a=0;++a=(i*=128)&&(n-=Math.pow(2,8*e)),n},p.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||F(t,e,this.length);for(var n=e,i=1,a=this[t+--n];n>0&&(i*=256);)a+=this[t+--n]*i;return a>=(i*=128)&&(a-=Math.pow(2,8*e)),a},p.prototype.readInt8=function(t,e){return t>>>=0,e||F(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},p.prototype.readInt16LE=function(t,e){t>>>=0,e||F(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},p.prototype.readInt16BE=function(t,e){t>>>=0,e||F(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},p.prototype.readInt32LE=function(t,e){return t>>>=0,e||F(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},p.prototype.readInt32BE=function(t,e){return t>>>=0,e||F(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},p.prototype.readBigInt64LE=nt((function(t){W(t>>>=0,"offset");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||X(t,this.length-8);var n=this[t+4]+this[t+5]*Math.pow(2,8)+this[t+6]*Math.pow(2,16)+(r<<24);return(BigInt(n)<>>=0,"offset");var e=this[t],r=this[t+7];void 0!==e&&void 0!==r||X(t,this.length-8);var n=(e<<24)+this[++t]*Math.pow(2,16)+this[++t]*Math.pow(2,8)+this[++t];return(BigInt(n)<>>=0,e||F(t,4,this.length),u.read(this,t,!0,23,4)},p.prototype.readFloatBE=function(t,e){return t>>>=0,e||F(t,4,this.length),u.read(this,t,!1,23,4)},p.prototype.readDoubleLE=function(t,e){return t>>>=0,e||F(t,8,this.length),u.read(this,t,!0,52,8)},p.prototype.readDoubleBE=function(t,e){return t>>>=0,e||F(t,8,this.length),u.read(this,t,!1,52,8)},p.prototype.writeUintLE=p.prototype.writeUIntLE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||B(this,t,e,r,Math.pow(2,8*r)-1,0);var i=1,a=0;for(this[e]=255&t;++a>>=0,r>>>=0,n||B(this,t,e,r,Math.pow(2,8*r)-1,0);var i=r-1,a=1;for(this[e+i]=255&t;--i>=0&&(a*=256);)this[e+i]=t/a&255;return e+r},p.prototype.writeUint8=p.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,1,255,0),this[e]=255&t,e+1},p.prototype.writeUint16LE=p.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},p.prototype.writeUint16BE=p.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},p.prototype.writeUint32LE=p.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},p.prototype.writeUint32BE=p.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},p.prototype.writeBigUInt64LE=nt((function(t){return N(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,BigInt(0),BigInt("0xffffffffffffffff"))})),p.prototype.writeBigUInt64BE=nt((function(t){return j(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,BigInt(0),BigInt("0xffffffffffffffff"))})),p.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var i=Math.pow(2,8*r-1);B(this,t,e,r,i-1,-i)}var a=0,o=1,s=0;for(this[e]=255&t;++a>0)-s&255;return e+r},p.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var i=Math.pow(2,8*r-1);B(this,t,e,r,i-1,-i)}var a=r-1,o=1,s=0;for(this[e+a]=255&t;--a>=0&&(o*=256);)t<0&&0===s&&0!==this[e+a+1]&&(s=1),this[e+a]=(t/o>>0)-s&255;return e+r},p.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},p.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},p.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},p.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},p.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||B(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},p.prototype.writeBigInt64LE=nt((function(t){return N(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),p.prototype.writeBigInt64BE=nt((function(t){return j(this,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),p.prototype.writeFloatLE=function(t,e,r){return V(this,t,e,!0,r)},p.prototype.writeFloatBE=function(t,e,r){return V(this,t,e,!1,r)},p.prototype.writeDoubleLE=function(t,e,r){return H(this,t,e,!0,r)},p.prototype.writeDoubleBE=function(t,e,r){return H(this,t,e,!1,r)},p.prototype.copy=function(t,e,r,n){if(!p.isBuffer(t))throw new TypeError("argument should be a Buffer");if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(a=e;a=n+4;r-=3)e="_".concat(t.slice(r-3,r)).concat(e);return"".concat(t.slice(0,r)).concat(e)}function Y(t,e,r,n,i,a){if(t>r||t3?0===e||e===BigInt(0)?">= 0".concat(s," and < 2").concat(s," ** ").concat(8*(a+1)).concat(s):">= -(2".concat(s," ** ").concat(8*(a+1)-1).concat(s,") and < 2 ** ")+"".concat(8*(a+1)-1).concat(s):">= ".concat(e).concat(s," and <= ").concat(r).concat(s),new q.ERR_OUT_OF_RANGE("value",o,t)}!function(t,e,r){W(e,"offset"),void 0!==t[e]&&void 0!==t[e+r]||X(e,t.length-(r+1))}(n,i,a)}function W(t,e){if("number"!=typeof t)throw new q.ERR_INVALID_ARG_TYPE(e,"number",t)}function X(t,e,r){if(Math.floor(t)!==t)throw W(t,r),new q.ERR_OUT_OF_RANGE(r||"offset","an integer",t);if(e<0)throw new q.ERR_BUFFER_OUT_OF_BOUNDS;throw new q.ERR_OUT_OF_RANGE(r||"offset",">= ".concat(r?1:0," and <= ").concat(e),t)}G("ERR_BUFFER_OUT_OF_BOUNDS",(function(t){return t?"".concat(t," is outside of buffer bounds"):"Attempt to access memory outside buffer bounds"}),RangeError),G("ERR_INVALID_ARG_TYPE",(function(t,e){return'The "'.concat(t,'" argument must be of type number. Received type ').concat(s(e))}),TypeError),G("ERR_OUT_OF_RANGE",(function(t,e,r){var n='The value of "'.concat(t,'" is out of range.'),i=r;return Number.isInteger(r)&&Math.abs(r)>Math.pow(2,32)?i=Z(String(r)):"bigint"==typeof r&&(i=String(r),(r>Math.pow(BigInt(2),BigInt(32))||r<-Math.pow(BigInt(2),BigInt(32)))&&(i=Z(i)),i+="n"),n+" It must be ".concat(e,". Received ").concat(i)}),RangeError);var J=/[^+/0-9A-Za-z-_]/g;function K(t,e){var r;e=e||1/0;for(var n=t.length,i=null,a=[],o=0;o55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&a.push(239,191,189);continue}if(o+1===n){(e-=3)>-1&&a.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&a.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&a.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;a.push(r)}else if(r<2048){if((e-=2)<0)break;a.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;a.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;a.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return a}function $(t){return l.toByteArray(function(t){if((t=(t=t.split("=")[0]).trim().replace(J,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function Q(t,e,r,n){var i;for(i=0;i=e.length||i>=t.length);++i)e[i+r]=t[i];return i}function tt(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function et(t){return t!=t}var rt=function(){for(var t="0123456789abcdef",e=new Array(256),r=0;r<16;++r)for(var n=16*r,i=0;i<16;++i)e[n+i]=t[r]+t[i];return e}();function nt(t){return"undefined"==typeof BigInt?it:t}function it(){throw new Error("BigInt not supported")}},35791:function(t){"use strict";t.exports=i,t.exports.isMobile=i,t.exports.default=i;var e=/(android|bb\d+|meego).+mobile|armv7l|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series[46]0|samsungbrowser.*mobile|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i,r=/CrOS/,n=/android|ipad|playbook|silk/i;function i(t){t||(t={});var i=t.ua;if(i||"undefined"==typeof navigator||(i=navigator.userAgent),i&&i.headers&&"string"==typeof i.headers["user-agent"]&&(i=i.headers["user-agent"]),"string"!=typeof i)return!1;var a=e.test(i)&&!r.test(i)||!!t.tablet&&n.test(i);return!a&&t.tablet&&t.featureDetect&&navigator&&navigator.maxTouchPoints>1&&-1!==i.indexOf("Macintosh")&&-1!==i.indexOf("Safari")&&(a=!0),a}},86781:function(t,e,r){"use strict";r.r(e),r.d(e,{sankeyCenter:function(){return h},sankeyCircular:function(){return C},sankeyJustify:function(){return f},sankeyLeft:function(){return u},sankeyRight:function(){return c}});var n=r(33064),i=r(15140),a=r(45879),o=r(2502),s=r.n(o);function l(t){return t.target.depth}function u(t){return t.depth}function c(t,e){return e-1-t.height}function f(t,e){return t.sourceLinks.length?t.depth:e-1}function h(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?(0,n.VV)(t.sourceLinks,l)-1:0}function p(t){return function(){return t}}var d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};function v(t,e){return y(t.source,e.source)||t.index-e.index}function g(t,e){return y(t.target,e.target)||t.index-e.index}function y(t,e){return t.partOfCycle===e.partOfCycle?t.y0-e.y0:"top"===t.circularLinkType||"bottom"===e.circularLinkType?-1:1}function m(t){return t.value}function x(t){return(t.y0+t.y1)/2}function b(t){return x(t.source)}function _(t){return x(t.target)}function w(t){return t.index}function T(t){return t.nodes}function k(t){return t.links}function A(t,e){var r=t.get(e);if(!r)throw new Error("missing: "+e);return r}function M(t,e){return e(t)}var S=25,E=10,L=.3;function C(){var t,e,r=0,a=0,o=1,l=1,u=24,c=w,h=f,M=T,C=k,O=32,D=2,z=null;function F(){var f={nodes:M.apply(null,arguments),links:C.apply(null,arguments)};!function(t){t.nodes.forEach((function(t,e){t.index=e,t.sourceLinks=[],t.targetLinks=[]}));var e=(0,i.UI)(t.nodes,c);t.links.forEach((function(t,r){t.index=r;var n=t.source,i=t.target;"object"!==(void 0===n?"undefined":d(n))&&(n=t.source=A(e,n)),"object"!==(void 0===i?"undefined":d(i))&&(i=t.target=A(e,i)),n.sourceLinks.push(t),i.targetLinks.push(t)}))}(f),function(t,e,r){var n=0;if(null===r){for(var i=[],a=0;a0?e+S+E:e,bottom:r=r>0?r+S+E:r,left:a=a>0?a+S+E:a,right:i=i>0?i+S+E:i}}(s),d=function(t,e){var i=(0,n.Fp)(t.nodes,(function(t){return t.column})),s=o-r,c=l-a,f=s/(s+e.right+e.left),h=c/(c+e.top+e.bottom);return r=r*f+e.left,o=0==e.right?o:o*f,a=a*h+e.top,l*=h,t.nodes.forEach((function(t){t.x0=r+t.column*((o-r-u)/i),t.x1=t.x0+u})),h}(s,p);f*=d,s.links.forEach((function(t){t.width=t.value*f})),h.forEach((function(t){var e=t.length;t.forEach((function(t,r){t.depth==h.length-1&&1==e||0==t.depth&&1==e?(t.y0=l/2-t.value*f,t.y1=t.y0+t.value*f):t.partOfCycle?0==I(t,i)?(t.y0=l/2+r,t.y1=t.y0+t.value*f):"top"==t.circularLinkType?(t.y0=a+r,t.y1=t.y0+t.value*f):(t.y0=l-t.value*f-r,t.y1=t.y0+t.value*f):0==p.top||0==p.bottom?(t.y0=(l-a)/e*r,t.y1=t.y0+t.value*f):(t.y0=(l-a)/2-e/2+r,t.y1=t.y0+t.value*f)}))}))})(f),g();for(var p=1,d=c;d>0;--d)v(p*=.99,f),g();function v(t,e){var r=h.length;h.forEach((function(i){var a=i.length,o=i[0].depth;i.forEach((function(i){var s;if(i.sourceLinks.length||i.targetLinks.length)if(i.partOfCycle&&I(i,e)>0);else if(0==o&&1==a)s=i.y1-i.y0,i.y0=l/2-s/2,i.y1=l/2+s/2;else if(o==r-1&&1==a)s=i.y1-i.y0,i.y0=l/2-s/2,i.y1=l/2+s/2;else{var u=(0,n.J6)(i.sourceLinks,_),c=(0,n.J6)(i.targetLinks,b),f=((u&&c?(u+c)/2:u||c)-x(i))*t;i.y0+=f,i.y1+=f}}))}))}function g(){h.forEach((function(e){var r,n,i,o=a,s=e.length;for(e.sort(y),i=0;i0&&(r.y0+=n,r.y1+=n),o=r.y1+t;if((n=o-t-l)>0)for(o=r.y0-=n,r.y1-=n,i=s-2;i>=0;--i)(n=(r=e[i]).y1+t-o)>0&&(r.y0-=n,r.y1-=n),o=r.y0}))}}(f,O,c),B(f);for(var p=0;p<4;p++)W(f,l,c),X(f,0,c),Z(f,a,l,c),W(f,l,c),X(f,0,c);return function(t,e,r){var i=t.nodes,a=t.links,o=!1,s=!1;if(a.forEach((function(t){"top"==t.circularLinkType?o=!0:"bottom"==t.circularLinkType&&(s=!0)})),0==o||0==s){var l=(0,n.VV)(i,(function(t){return t.y0})),u=(r-e)/((0,n.Fp)(i,(function(t){return t.y1}))-l);i.forEach((function(t){var e=(t.y1-t.y0)*u;t.y0=(t.y0-l)*u,t.y1=t.y0+e})),a.forEach((function(t){t.y0=(t.y0-l)*u,t.y1=(t.y1-l)*u,t.width=t.width*u}))}}(f,a,l),R(f,D,l,c),f}function B(t){t.nodes.forEach((function(t){t.sourceLinks.sort(g),t.targetLinks.sort(v)})),t.nodes.forEach((function(t){var e=t.y0,r=e,n=t.y1,i=n;t.sourceLinks.forEach((function(t){t.circular?(t.y0=n-t.width/2,n-=t.width):(t.y0=e+t.width/2,e+=t.width)})),t.targetLinks.forEach((function(t){t.circular?(t.y1=i-t.width/2,i-=t.width):(t.y1=r+t.width/2,r+=t.width)}))}))}return F.nodeId=function(t){return arguments.length?(c="function"==typeof t?t:p(t),F):c},F.nodeAlign=function(t){return arguments.length?(h="function"==typeof t?t:p(t),F):h},F.nodeWidth=function(t){return arguments.length?(u=+t,F):u},F.nodePadding=function(e){return arguments.length?(t=+e,F):t},F.nodes=function(t){return arguments.length?(M="function"==typeof t?t:p(t),F):M},F.links=function(t){return arguments.length?(C="function"==typeof t?t:p(t),F):C},F.size=function(t){return arguments.length?(r=a=0,o=+t[0],l=+t[1],F):[o-r,l-a]},F.extent=function(t){return arguments.length?(r=+t[0][0],o=+t[1][0],a=+t[0][1],l=+t[1][1],F):[[r,a],[o,l]]},F.iterations=function(t){return arguments.length?(O=+t,F):O},F.circularLinkGap=function(t){return arguments.length?(D=+t,F):D},F.nodePaddingRatio=function(t){return arguments.length?(e=+t,F):e},F.sortNodes=function(t){return arguments.length?(z=t,F):z},F.update=function(t){return P(t,c),B(t),t.links.forEach((function(t){t.circular&&(t.circularLinkType=t.y0+t.y11||i>1)}function z(t,e,r){return t.sort(F),t.forEach((function(n,i){var a,o,s=0;if($(n,r)&&D(n))n.circularPathData.verticalBuffer=s+n.width/2;else{for(var l=0;lo.source.column)){var u=t[l].circularPathData.verticalBuffer+t[l].width/2+e;s=u>s?u:s}n.circularPathData.verticalBuffer=s+n.width/2}})),t}function R(t,e,r,i){var o=(0,n.VV)(t.links,(function(t){return t.source.y0}));t.links.forEach((function(t){t.circular&&(t.circularPathData={})})),z(t.links.filter((function(t){return"top"==t.circularLinkType})),e,i),z(t.links.filter((function(t){return"bottom"==t.circularLinkType})),e,i),t.links.forEach((function(n){if(n.circular){if(n.circularPathData.arcRadius=n.width+E,n.circularPathData.leftNodeBuffer=5,n.circularPathData.rightNodeBuffer=5,n.circularPathData.sourceWidth=n.source.x1-n.source.x0,n.circularPathData.sourceX=n.source.x0+n.circularPathData.sourceWidth,n.circularPathData.targetX=n.target.x0,n.circularPathData.sourceY=n.y0,n.circularPathData.targetY=n.y1,$(n,i)&&D(n))n.circularPathData.leftSmallArcRadius=E+n.width/2,n.circularPathData.leftLargeArcRadius=E+n.width/2,n.circularPathData.rightSmallArcRadius=E+n.width/2,n.circularPathData.rightLargeArcRadius=E+n.width/2,"bottom"==n.circularLinkType?(n.circularPathData.verticalFullExtent=n.source.y1+S+n.circularPathData.verticalBuffer,n.circularPathData.verticalLeftInnerExtent=n.circularPathData.verticalFullExtent-n.circularPathData.leftLargeArcRadius,n.circularPathData.verticalRightInnerExtent=n.circularPathData.verticalFullExtent-n.circularPathData.rightLargeArcRadius):(n.circularPathData.verticalFullExtent=n.source.y0-S-n.circularPathData.verticalBuffer,n.circularPathData.verticalLeftInnerExtent=n.circularPathData.verticalFullExtent+n.circularPathData.leftLargeArcRadius,n.circularPathData.verticalRightInnerExtent=n.circularPathData.verticalFullExtent+n.circularPathData.rightLargeArcRadius);else{var s=n.source.column,l=n.circularLinkType,u=t.links.filter((function(t){return t.source.column==s&&t.circularLinkType==l}));"bottom"==n.circularLinkType?u.sort(N):u.sort(B);var c=0;u.forEach((function(t,r){t.circularLinkID==n.circularLinkID&&(n.circularPathData.leftSmallArcRadius=E+n.width/2+c,n.circularPathData.leftLargeArcRadius=E+n.width/2+r*e+c),c+=t.width})),s=n.target.column,u=t.links.filter((function(t){return t.target.column==s&&t.circularLinkType==l})),"bottom"==n.circularLinkType?u.sort(U):u.sort(j),c=0,u.forEach((function(t,r){t.circularLinkID==n.circularLinkID&&(n.circularPathData.rightSmallArcRadius=E+n.width/2+c,n.circularPathData.rightLargeArcRadius=E+n.width/2+r*e+c),c+=t.width})),"bottom"==n.circularLinkType?(n.circularPathData.verticalFullExtent=Math.max(r,n.source.y1,n.target.y1)+S+n.circularPathData.verticalBuffer,n.circularPathData.verticalLeftInnerExtent=n.circularPathData.verticalFullExtent-n.circularPathData.leftLargeArcRadius,n.circularPathData.verticalRightInnerExtent=n.circularPathData.verticalFullExtent-n.circularPathData.rightLargeArcRadius):(n.circularPathData.verticalFullExtent=o-S-n.circularPathData.verticalBuffer,n.circularPathData.verticalLeftInnerExtent=n.circularPathData.verticalFullExtent+n.circularPathData.leftLargeArcRadius,n.circularPathData.verticalRightInnerExtent=n.circularPathData.verticalFullExtent+n.circularPathData.rightLargeArcRadius)}n.circularPathData.leftInnerExtent=n.circularPathData.sourceX+n.circularPathData.leftNodeBuffer,n.circularPathData.rightInnerExtent=n.circularPathData.targetX-n.circularPathData.rightNodeBuffer,n.circularPathData.leftFullExtent=n.circularPathData.sourceX+n.circularPathData.leftLargeArcRadius+n.circularPathData.leftNodeBuffer,n.circularPathData.rightFullExtent=n.circularPathData.targetX-n.circularPathData.rightLargeArcRadius-n.circularPathData.rightNodeBuffer}if(n.circular)n.path=function(t){return"top"==t.circularLinkType?"M"+t.circularPathData.sourceX+" "+t.circularPathData.sourceY+" L"+t.circularPathData.leftInnerExtent+" "+t.circularPathData.sourceY+" A"+t.circularPathData.leftLargeArcRadius+" "+t.circularPathData.leftSmallArcRadius+" 0 0 0 "+t.circularPathData.leftFullExtent+" "+(t.circularPathData.sourceY-t.circularPathData.leftSmallArcRadius)+" L"+t.circularPathData.leftFullExtent+" "+t.circularPathData.verticalLeftInnerExtent+" A"+t.circularPathData.leftLargeArcRadius+" "+t.circularPathData.leftLargeArcRadius+" 0 0 0 "+t.circularPathData.leftInnerExtent+" "+t.circularPathData.verticalFullExtent+" L"+t.circularPathData.rightInnerExtent+" "+t.circularPathData.verticalFullExtent+" A"+t.circularPathData.rightLargeArcRadius+" "+t.circularPathData.rightLargeArcRadius+" 0 0 0 "+t.circularPathData.rightFullExtent+" "+t.circularPathData.verticalRightInnerExtent+" L"+t.circularPathData.rightFullExtent+" "+(t.circularPathData.targetY-t.circularPathData.rightSmallArcRadius)+" A"+t.circularPathData.rightLargeArcRadius+" "+t.circularPathData.rightSmallArcRadius+" 0 0 0 "+t.circularPathData.rightInnerExtent+" "+t.circularPathData.targetY+" L"+t.circularPathData.targetX+" "+t.circularPathData.targetY:"M"+t.circularPathData.sourceX+" "+t.circularPathData.sourceY+" L"+t.circularPathData.leftInnerExtent+" "+t.circularPathData.sourceY+" A"+t.circularPathData.leftLargeArcRadius+" "+t.circularPathData.leftSmallArcRadius+" 0 0 1 "+t.circularPathData.leftFullExtent+" "+(t.circularPathData.sourceY+t.circularPathData.leftSmallArcRadius)+" L"+t.circularPathData.leftFullExtent+" "+t.circularPathData.verticalLeftInnerExtent+" A"+t.circularPathData.leftLargeArcRadius+" "+t.circularPathData.leftLargeArcRadius+" 0 0 1 "+t.circularPathData.leftInnerExtent+" "+t.circularPathData.verticalFullExtent+" L"+t.circularPathData.rightInnerExtent+" "+t.circularPathData.verticalFullExtent+" A"+t.circularPathData.rightLargeArcRadius+" "+t.circularPathData.rightLargeArcRadius+" 0 0 1 "+t.circularPathData.rightFullExtent+" "+t.circularPathData.verticalRightInnerExtent+" L"+t.circularPathData.rightFullExtent+" "+(t.circularPathData.targetY+t.circularPathData.rightSmallArcRadius)+" A"+t.circularPathData.rightLargeArcRadius+" "+t.circularPathData.rightSmallArcRadius+" 0 0 1 "+t.circularPathData.rightInnerExtent+" "+t.circularPathData.targetY+" L"+t.circularPathData.targetX+" "+t.circularPathData.targetY}(n);else{var f=(0,a.h5)().source((function(t){return[t.source.x0+(t.source.x1-t.source.x0),t.y0]})).target((function(t){return[t.target.x0,t.y1]}));n.path=f(n)}}))}function F(t,e){return V(t)==V(e)?"bottom"==t.circularLinkType?N(t,e):B(t,e):V(e)-V(t)}function B(t,e){return t.y0-e.y0}function N(t,e){return e.y0-t.y0}function j(t,e){return t.y1-e.y1}function U(t,e){return e.y1-t.y1}function V(t){return t.target.column-t.source.column}function H(t){return t.target.x0-t.source.x1}function q(t,e){var r=O(t),n=H(e)/Math.tan(r);return"up"==K(t)?t.y1+n:t.y1-n}function G(t,e){var r=O(t),n=H(e)/Math.tan(r);return"up"==K(t)?t.y1-n:t.y1+n}function Z(t,e,r,n){t.links.forEach((function(i){if(!i.circular&&i.target.column-i.source.column>1){var a=i.source.column+1,o=i.target.column-1,s=1,l=o-a+1;for(s=1;a<=o;a++,s++)t.nodes.forEach((function(o){if(o.column==a){var u,c=s/(l+1),f=Math.pow(1-c,3),h=3*c*Math.pow(1-c,2),p=3*Math.pow(c,2)*(1-c),d=Math.pow(c,3),v=f*i.y0+h*i.y0+p*i.y1+d*i.y1,g=v-i.width/2,y=v+i.width/2;g>o.y0&&ga.y0&&i.y0a.y0&&i.y1a.y1)&&Y(t,u,e,r)}))):(y>o.y0&&yo.y1)&&(u=y-o.y0+10,o=Y(o,u,e,r),t.nodes.forEach((function(t){M(t,n)!=M(o,n)&&t.column==o.column&&t.y0o.y1&&Y(t,u,e,r)})))}}))}}))}function Y(t,e,r,n){return t.y0+e>=r&&t.y1+e<=n&&(t.y0=t.y0+e,t.y1=t.y1+e,t.targetLinks.forEach((function(t){t.y1=t.y1+e})),t.sourceLinks.forEach((function(t){t.y0=t.y0+e}))),t}function W(t,e,r,n){t.nodes.forEach((function(i){n&&i.y+(i.y1-i.y0)>e&&(i.y=i.y-(i.y+(i.y1-i.y0)-e));var a=t.links.filter((function(t){return M(t.source,r)==M(i,r)})),o=a.length;o>1&&a.sort((function(t,e){if(!t.circular&&!e.circular){if(t.target.column==e.target.column)return t.y1-e.y1;if(!J(t,e))return t.y1-e.y1;if(t.target.column>e.target.column){var r=G(e,t);return t.y1-r}if(e.target.column>t.target.column)return G(t,e)-e.y1}return t.circular&&!e.circular?"top"==t.circularLinkType?-1:1:e.circular&&!t.circular?"top"==e.circularLinkType?1:-1:t.circular&&e.circular?t.circularLinkType===e.circularLinkType&&"top"==t.circularLinkType?t.target.column===e.target.column?t.target.y1-e.target.y1:e.target.column-t.target.column:t.circularLinkType===e.circularLinkType&&"bottom"==t.circularLinkType?t.target.column===e.target.column?e.target.y1-t.target.y1:t.target.column-e.target.column:"top"==t.circularLinkType?-1:1:void 0}));var s=i.y0;a.forEach((function(t){t.y0=s+t.width/2,s+=t.width})),a.forEach((function(t,e){if("bottom"==t.circularLinkType){for(var r=e+1,n=0;r1&&n.sort((function(t,e){if(!t.circular&&!e.circular){if(t.source.column==e.source.column)return t.y0-e.y0;if(!J(t,e))return t.y0-e.y0;if(e.source.column0?"up":"down"}function $(t,e){return M(t.source,e)==M(t.target,e)}},30838:function(t,e,r){"use strict";r.r(e),r.d(e,{sankey:function(){return w},sankeyCenter:function(){return u},sankeyJustify:function(){return l},sankeyLeft:function(){return o},sankeyLinkHorizontal:function(){return M},sankeyRight:function(){return s}});var n=r(33064),i=r(15140);function a(t){return t.target.depth}function o(t){return t.depth}function s(t,e){return e-1-t.height}function l(t,e){return t.sourceLinks.length?t.depth:e-1}function u(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?(0,n.VV)(t.sourceLinks,a)-1:0}function c(t){return function(){return t}}function f(t,e){return p(t.source,e.source)||t.index-e.index}function h(t,e){return p(t.target,e.target)||t.index-e.index}function p(t,e){return t.y0-e.y0}function d(t){return t.value}function v(t){return(t.y0+t.y1)/2}function g(t){return v(t.source)*t.value}function y(t){return v(t.target)*t.value}function m(t){return t.index}function x(t){return t.nodes}function b(t){return t.links}function _(t,e){var r=t.get(e);if(!r)throw new Error("missing: "+e);return r}function w(){var t=0,e=0,r=1,a=1,o=24,s=8,u=m,w=l,T=x,k=b,A=32;function M(){var l={nodes:T.apply(null,arguments),links:k.apply(null,arguments)};return function(t){t.nodes.forEach((function(t,e){t.index=e,t.sourceLinks=[],t.targetLinks=[]}));var e=(0,i.UI)(t.nodes,u);t.links.forEach((function(t,r){t.index=r;var n=t.source,i=t.target;"object"!=typeof n&&(n=t.source=_(e,n)),"object"!=typeof i&&(i=t.target=_(e,i)),n.sourceLinks.push(t),i.targetLinks.push(t)}))}(l),function(t){t.nodes.forEach((function(t){t.value=Math.max((0,n.Sm)(t.sourceLinks,d),(0,n.Sm)(t.targetLinks,d))}))}(l),function(e){var n,i,a;for(n=e.nodes,i=[],a=0;n.length;++a,n=i,i=[])n.forEach((function(t){t.depth=a,t.sourceLinks.forEach((function(t){i.indexOf(t.target)<0&&i.push(t.target)}))}));for(n=e.nodes,i=[],a=0;n.length;++a,n=i,i=[])n.forEach((function(t){t.height=a,t.targetLinks.forEach((function(t){i.indexOf(t.source)<0&&i.push(t.source)}))}));var s=(r-t-o)/(a-1);e.nodes.forEach((function(e){e.x1=(e.x0=t+Math.max(0,Math.min(a-1,Math.floor(w.call(null,e,a))))*s)+o}))}(l),function(t){var r=(0,i.b1)().key((function(t){return t.x0})).sortKeys(n.j2).entries(t.nodes).map((function(t){return t.values}));(function(){var i=(0,n.Fp)(r,(function(t){return t.length})),o=.6666666666666666*(a-e)/(i-1);s>o&&(s=o);var l=(0,n.VV)(r,(function(t){return(a-e-(t.length-1)*s)/(0,n.Sm)(t,d)}));r.forEach((function(t){t.forEach((function(t,e){t.y1=(t.y0=e)+t.value*l}))})),t.links.forEach((function(t){t.width=t.value*l}))})(),f();for(var o=1,l=A;l>0;--l)c(o*=.99),f(),u(o),f();function u(t){r.forEach((function(e){e.forEach((function(e){if(e.targetLinks.length){var r=((0,n.Sm)(e.targetLinks,g)/(0,n.Sm)(e.targetLinks,d)-v(e))*t;e.y0+=r,e.y1+=r}}))}))}function c(t){r.slice().reverse().forEach((function(e){e.forEach((function(e){if(e.sourceLinks.length){var r=((0,n.Sm)(e.sourceLinks,y)/(0,n.Sm)(e.sourceLinks,d)-v(e))*t;e.y0+=r,e.y1+=r}}))}))}function f(){r.forEach((function(t){var r,n,i,o=e,l=t.length;for(t.sort(p),i=0;i0&&(r.y0+=n,r.y1+=n),o=r.y1+s;if((n=o-s-a)>0)for(o=r.y0-=n,r.y1-=n,i=l-2;i>=0;--i)(n=(r=t[i]).y1+s-o)>0&&(r.y0-=n,r.y1-=n),o=r.y0}))}}(l),S(l),l}function S(t){t.nodes.forEach((function(t){t.sourceLinks.sort(h),t.targetLinks.sort(f)})),t.nodes.forEach((function(t){var e=t.y0,r=e;t.sourceLinks.forEach((function(t){t.y0=e+t.width/2,e+=t.width})),t.targetLinks.forEach((function(t){t.y1=r+t.width/2,r+=t.width}))}))}return M.update=function(t){return S(t),t},M.nodeId=function(t){return arguments.length?(u="function"==typeof t?t:c(t),M):u},M.nodeAlign=function(t){return arguments.length?(w="function"==typeof t?t:c(t),M):w},M.nodeWidth=function(t){return arguments.length?(o=+t,M):o},M.nodePadding=function(t){return arguments.length?(s=+t,M):s},M.nodes=function(t){return arguments.length?(T="function"==typeof t?t:c(t),M):T},M.links=function(t){return arguments.length?(k="function"==typeof t?t:c(t),M):k},M.size=function(n){return arguments.length?(t=e=0,r=+n[0],a=+n[1],M):[r-t,a-e]},M.extent=function(n){return arguments.length?(t=+n[0][0],r=+n[1][0],e=+n[0][1],a=+n[1][1],M):[[t,e],[r,a]]},M.iterations=function(t){return arguments.length?(A=+t,M):A},M}var T=r(45879);function k(t){return[t.source.x1,t.y0]}function A(t){return[t.target.x0,t.y1]}function M(){return(0,T.h5)().source(k).target(A)}},39898:function(t,e,r){var n,i;(function(){var a={version:"3.8.0"},o=[].slice,s=function(t){return o.call(t)},l=self.document;function u(t){return t&&(t.ownerDocument||t.document||t).documentElement}function c(t){return t&&(t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView)}if(l)try{s(l.documentElement.childNodes)[0].nodeType}catch(t){s=function(t){for(var e=t.length,r=new Array(e);e--;)r[e]=t[e];return r}}if(Date.now||(Date.now=function(){return+new Date}),l)try{l.createElement("DIV").style.setProperty("opacity",0,"")}catch(t){var f=this.Element.prototype,h=f.setAttribute,p=f.setAttributeNS,d=this.CSSStyleDeclaration.prototype,v=d.setProperty;f.setAttribute=function(t,e){h.call(this,t,e+"")},f.setAttributeNS=function(t,e,r){p.call(this,t,e,r+"")},d.setProperty=function(t,e,r){v.call(this,t,e+"",r)}}function g(t,e){return te?1:t>=e?0:NaN}function y(t){return null===t?NaN:+t}function m(t){return!isNaN(t)}function x(t){return{left:function(e,r,n,i){for(arguments.length<3&&(n=0),arguments.length<4&&(i=e.length);n>>1;t(e[a],r)<0?n=a+1:i=a}return n},right:function(e,r,n,i){for(arguments.length<3&&(n=0),arguments.length<4&&(i=e.length);n>>1;t(e[a],r)>0?i=a:n=a+1}return n}}}a.ascending=g,a.descending=function(t,e){return et?1:e>=t?0:NaN},a.min=function(t,e){var r,n,i=-1,a=t.length;if(1===arguments.length){for(;++i=n){r=n;break}for(;++in&&(r=n)}else{for(;++i=n){r=n;break}for(;++in&&(r=n)}return r},a.max=function(t,e){var r,n,i=-1,a=t.length;if(1===arguments.length){for(;++i=n){r=n;break}for(;++ir&&(r=n)}else{for(;++i=n){r=n;break}for(;++ir&&(r=n)}return r},a.extent=function(t,e){var r,n,i,a=-1,o=t.length;if(1===arguments.length){for(;++a=n){r=i=n;break}for(;++an&&(r=n),i=n){r=i=n;break}for(;++an&&(r=n),i1)return o/(l-1)},a.deviation=function(){var t=a.variance.apply(this,arguments);return t?Math.sqrt(t):t};var b=x(g);function _(t){return t.length}a.bisectLeft=b.left,a.bisect=a.bisectRight=b.right,a.bisector=function(t){return x(1===t.length?function(e,r){return g(t(e),r)}:t)},a.shuffle=function(t,e,r){(a=arguments.length)<3&&(r=t.length,a<2&&(e=0));for(var n,i,a=r-e;a;)i=Math.random()*a--|0,n=t[a+e],t[a+e]=t[i+e],t[i+e]=n;return t},a.permute=function(t,e){for(var r=e.length,n=new Array(r);r--;)n[r]=t[e[r]];return n},a.pairs=function(t){for(var e=0,r=t.length-1,n=t[0],i=new Array(r<0?0:r);e=0;)for(e=(n=t[i]).length;--e>=0;)r[--o]=n[e];return r};var w=Math.abs;function T(t,e){for(var r in e)Object.defineProperty(t.prototype,r,{value:e[r],enumerable:!1})}function k(){this._=Object.create(null)}a.range=function(t,e,r){if(arguments.length<3&&(r=1,arguments.length<2&&(e=t,t=0)),(e-t)/r==1/0)throw new Error("infinite range");var n,i=[],a=function(t){for(var e=1;t*e%1;)e*=10;return e}(w(r)),o=-1;if(t*=a,e*=a,(r*=a)<0)for(;(n=t+r*++o)>e;)i.push(n/a);else for(;(n=t+r*++o)=n.length)return e?e.call(r,a):t?a.sort(t):a;for(var l,u,c,f,h=-1,p=a.length,d=n[s++],v=new k;++h=n.length)return t;var r=[],a=i[e++];return t.forEach((function(t,n){r.push({key:t,values:s(n,e)})})),a?r.sort((function(t,e){return a(t.key,e.key)})):r}return r.map=function(t,e){return o(e,t,0)},r.entries=function(t){return s(o(a.map,t,0),0)},r.key=function(t){return n.push(t),r},r.sortKeys=function(t){return i[n.length-1]=t,r},r.sortValues=function(e){return t=e,r},r.rollup=function(t){return e=t,r},r},a.set=function(t){var e=new D;if(t)for(var r=0,n=t.length;r=0&&(n=t.slice(r+1),t=t.slice(0,r)),t)return arguments.length<2?this[t].on(n):this[t].on(n,e);if(2===arguments.length){if(null==e)for(t in this)this.hasOwnProperty(t)&&this[t].on(n,null);return this}},a.event=null,a.requote=function(t){return t.replace(G,"\\$&")};var G=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,Z={}.__proto__?function(t,e){t.__proto__=e}:function(t,e){for(var r in e)t[r]=e[r]};function Y(t){return Z(t,K),t}var W=function(t,e){return e.querySelector(t)},X=function(t,e){return e.querySelectorAll(t)},J=function(t,e){var r=t.matches||t[F(t,"matchesSelector")];return J=function(t,e){return r.call(t,e)},J(t,e)};"function"==typeof Sizzle&&(W=function(t,e){return Sizzle(t,e)[0]||null},X=Sizzle,J=Sizzle.matchesSelector),a.selection=function(){return a.select(l.documentElement)};var K=a.selection.prototype=[];function $(t){return"function"==typeof t?t:function(){return W(t,this)}}function Q(t){return"function"==typeof t?t:function(){return X(t,this)}}K.select=function(t){var e,r,n,i,a=[];t=$(t);for(var o=-1,s=this.length;++o=0&&"xmlns"!==(r=t.slice(0,e))&&(t=t.slice(e+1)),et.hasOwnProperty(r)?{space:et[r],local:t}:t}},K.attr=function(t,e){if(arguments.length<2){if("string"==typeof t){var r=this.node();return(t=a.ns.qualify(t)).local?r.getAttributeNS(t.space,t.local):r.getAttribute(t)}for(e in t)this.each(rt(e,t[e]));return this}return this.each(rt(t,e))},K.classed=function(t,e){if(arguments.length<2){if("string"==typeof t){var r=this.node(),n=(t=at(t)).length,i=-1;if(e=r.classList){for(;++i=0;)(r=n[i])&&(a&&a!==r.nextSibling&&a.parentNode.insertBefore(r,a),a=r);return this},K.sort=function(t){t=dt.apply(this,arguments);for(var e=-1,r=this.length;++e0&&(t=t.slice(0,i));var l=xt.get(t);function u(){var e=this[n];e&&(this.removeEventListener(t,e,e.$),delete this[n])}return l&&(t=l,o=_t),i?e?function(){var i=o(e,s(arguments));u.call(this),this.addEventListener(t,this[n]=i,i.$=r),i._=e}:u:e?N:function(){var e,r=new RegExp("^__on([^.]+)"+a.requote(t)+"$");for(var n in this)if(e=n.match(r)){var i=this[n];this.removeEventListener(e[1],i,i.$),delete this[n]}}}a.selection.enter=gt,a.selection.enter.prototype=yt,yt.append=K.append,yt.empty=K.empty,yt.node=K.node,yt.call=K.call,yt.size=K.size,yt.select=function(t){for(var e,r,n,i,a,o=[],s=-1,l=this.length;++s=n&&(n=e+1);!(o=s[n])&&++n1?It:t<-1?-It:Math.asin(t)}function Ft(t){return((t=Math.exp(t))+1/t)/2}var Bt=Math.SQRT2;a.interpolateZoom=function(t,e){var r,n,i=t[0],a=t[1],o=t[2],s=e[0],l=e[1],u=e[2],c=s-i,f=l-a,h=c*c+f*f;if(h0&&(t=t.transition().duration(v)),t.call(w.event)}function S(){s&&s.domain(o.range().map((function(t){return(t-h.x)/h.k})).map(o.invert)),f&&f.domain(u.range().map((function(t){return(t-h.y)/h.k})).map(u.invert))}function E(t){g++||t({type:"zoomstart"})}function L(t){S(),t({type:"zoom",scale:h.k,translate:[h.x,h.y]})}function C(t){--g||(t({type:"zoomend"}),e=null)}function P(){var t=this,e=_.of(t,arguments),r=0,n=a.select(c(t)).on(m,(function(){r=1,A(a.mouse(t),i),L(e)})).on(x,(function(){n.on(m,null).on(x,null),o(r),C(e)})),i=T(a.mouse(t)),o=kt(t);Ji.call(t),E(e)}function O(){var t,e=this,r=_.of(e,arguments),n={},o=0,s=".zoom-"+a.event.changedTouches[0].identifier,l="touchmove"+s,u="touchend"+s,c=[],f=a.select(e),p=kt(e);function d(){var r=a.touches(e);return t=h.k,r.forEach((function(t){t.identifier in n&&(n[t.identifier]=T(t))})),r}function v(){var t=a.event.target;a.select(t).on(l,g).on(u,m),c.push(t);for(var r=a.event.changedTouches,s=0,f=r.length;s1){y=p[0];var x=p[1],b=y[0]-x[0],_=y[1]-x[1];o=b*b+_*_}}function g(){var s,l,u,c,f=a.touches(e);Ji.call(e);for(var h=0,p=f.length;h360?t-=360:t<0&&(t+=360),t<60?n+(i-n)*t/60:t<180?i:t<240?n+(i-n)*(240-t)/60:n}(t))}return t=isNaN(t)?0:(t%=360)<0?t+360:t,e=isNaN(e)||e<0?0:e>1?1:e,n=2*(r=r<0?0:r>1?1:r)-(i=r<=.5?r*(1+e):r+e-r*e),new ae(a(t+120),a(t),a(t-120))}function Zt(t,e,r){return this instanceof Zt?(this.h=+t,this.c=+e,void(this.l=+r)):arguments.length<2?t instanceof Zt?new Zt(t.h,t.c,t.l):function(t,e,r){return t>0?new Zt(Math.atan2(r,e)*zt,Math.sqrt(e*e+r*r),t):new Zt(NaN,NaN,t)}(t instanceof Xt?t.l:(t=he((t=a.rgb(t)).r,t.g,t.b)).l,t.a,t.b):new Zt(t,e,r)}qt.brighter=function(t){return t=Math.pow(.7,arguments.length?t:1),new Ht(this.h,this.s,this.l/t)},qt.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),new Ht(this.h,this.s,t*this.l)},qt.rgb=function(){return Gt(this.h,this.s,this.l)},a.hcl=Zt;var Yt=Zt.prototype=new Vt;function Wt(t,e,r){return isNaN(t)&&(t=0),isNaN(e)&&(e=0),new Xt(r,Math.cos(t*=Dt)*e,Math.sin(t)*e)}function Xt(t,e,r){return this instanceof Xt?(this.l=+t,this.a=+e,void(this.b=+r)):arguments.length<2?t instanceof Xt?new Xt(t.l,t.a,t.b):t instanceof Zt?Wt(t.h,t.c,t.l):he((t=ae(t)).r,t.g,t.b):new Xt(t,e,r)}Yt.brighter=function(t){return new Zt(this.h,this.c,Math.min(100,this.l+Jt*(arguments.length?t:1)))},Yt.darker=function(t){return new Zt(this.h,this.c,Math.max(0,this.l-Jt*(arguments.length?t:1)))},Yt.rgb=function(){return Wt(this.h,this.c,this.l).rgb()},a.lab=Xt;var Jt=18,Kt=.95047,$t=1,Qt=1.08883,te=Xt.prototype=new Vt;function ee(t,e,r){var n=(t+16)/116,i=n+e/500,a=n-r/200;return new ae(ie(3.2404542*(i=re(i)*Kt)-1.5371385*(n=re(n)*$t)-.4985314*(a=re(a)*Qt)),ie(-.969266*i+1.8760108*n+.041556*a),ie(.0556434*i-.2040259*n+1.0572252*a))}function re(t){return t>.206893034?t*t*t:(t-4/29)/7.787037}function ne(t){return t>.008856?Math.pow(t,1/3):7.787037*t+4/29}function ie(t){return Math.round(255*(t<=.00304?12.92*t:1.055*Math.pow(t,1/2.4)-.055))}function ae(t,e,r){return this instanceof ae?(this.r=~~t,this.g=~~e,void(this.b=~~r)):arguments.length<2?t instanceof ae?new ae(t.r,t.g,t.b):ce(""+t,ae,Gt):new ae(t,e,r)}function oe(t){return new ae(t>>16,t>>8&255,255&t)}function se(t){return oe(t)+""}te.brighter=function(t){return new Xt(Math.min(100,this.l+Jt*(arguments.length?t:1)),this.a,this.b)},te.darker=function(t){return new Xt(Math.max(0,this.l-Jt*(arguments.length?t:1)),this.a,this.b)},te.rgb=function(){return ee(this.l,this.a,this.b)},a.rgb=ae;var le=ae.prototype=new Vt;function ue(t){return t<16?"0"+Math.max(0,t).toString(16):Math.min(255,t).toString(16)}function ce(t,e,r){var n,i,a,o=0,s=0,l=0;if(n=/([a-z]+)\((.*)\)/.exec(t=t.toLowerCase()))switch(i=n[2].split(","),n[1]){case"hsl":return r(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return e(de(i[0]),de(i[1]),de(i[2]))}return(a=ve.get(t))?e(a.r,a.g,a.b):(null==t||"#"!==t.charAt(0)||isNaN(a=parseInt(t.slice(1),16))||(4===t.length?(o=(3840&a)>>4,o|=o>>4,s=240&a,s|=s>>4,l=15&a,l|=l<<4):7===t.length&&(o=(16711680&a)>>16,s=(65280&a)>>8,l=255&a)),e(o,s,l))}function fe(t,e,r){var n,i,a=Math.min(t/=255,e/=255,r/=255),o=Math.max(t,e,r),s=o-a,l=(o+a)/2;return s?(i=l<.5?s/(o+a):s/(2-o-a),n=t==o?(e-r)/s+(e0&&l<1?0:n),new Ht(n,i,l)}function he(t,e,r){var n=ne((.4124564*(t=pe(t))+.3575761*(e=pe(e))+.1804375*(r=pe(r)))/Kt),i=ne((.2126729*t+.7151522*e+.072175*r)/$t);return Xt(116*i-16,500*(n-i),200*(i-ne((.0193339*t+.119192*e+.9503041*r)/Qt)))}function pe(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function de(t){var e=parseFloat(t);return"%"===t.charAt(t.length-1)?Math.round(2.55*e):e}le.brighter=function(t){t=Math.pow(.7,arguments.length?t:1);var e=this.r,r=this.g,n=this.b,i=30;return e||r||n?(e&&e=200&&e<300||304===e){try{t=r.call(i,u)}catch(t){return void o.error.call(i,t)}o.load.call(i,t)}else o.error.call(i,u)}return self.XDomainRequest&&!("withCredentials"in u)&&/^(http(s)?:)?\/\//.test(t)&&(u=new XDomainRequest),"onload"in u?u.onload=u.onerror=f:u.onreadystatechange=function(){u.readyState>3&&f()},u.onprogress=function(t){var e=a.event;a.event=t;try{o.progress.call(i,u)}finally{a.event=e}},i.header=function(t,e){return t=(t+"").toLowerCase(),arguments.length<2?l[t]:(null==e?delete l[t]:l[t]=e+"",i)},i.mimeType=function(t){return arguments.length?(e=null==t?null:t+"",i):e},i.responseType=function(t){return arguments.length?(c=t,i):c},i.response=function(t){return r=t,i},["get","post"].forEach((function(t){i[t]=function(){return i.send.apply(i,[t].concat(s(arguments)))}})),i.send=function(r,n,a){if(2===arguments.length&&"function"==typeof n&&(a=n,n=null),u.open(r,t,!0),null==e||"accept"in l||(l.accept=e+",*/*"),u.setRequestHeader)for(var s in l)u.setRequestHeader(s,l[s]);return null!=e&&u.overrideMimeType&&u.overrideMimeType(e),null!=c&&(u.responseType=c),null!=a&&i.on("error",a).on("load",(function(t){a(null,t)})),o.beforesend.call(i,u),u.send(null==n?null:n),i},i.abort=function(){return u.abort(),i},a.rebind(i,o,"on"),null==n?i:i.get(function(t){return 1===t.length?function(e,r){t(null==e?r:null)}:t}(n))}ve.forEach((function(t,e){ve.set(t,oe(e))})),a.functor=ge,a.xhr=ye(z),a.dsv=function(t,e){var r=new RegExp('["'+t+"\n]"),n=t.charCodeAt(0);function i(t,r,n){arguments.length<3&&(n=r,r=null);var i=me(t,e,null==r?a:o(r),n);return i.row=function(t){return arguments.length?i.response(null==(r=t)?a:o(t)):r},i}function a(t){return i.parse(t.responseText)}function o(t){return function(e){return i.parse(e.responseText,t)}}function s(e){return e.map(l).join(t)}function l(t){return r.test(t)?'"'+t.replace(/\"/g,'""')+'"':t}return i.parse=function(t,e){var r;return i.parseRows(t,(function(t,n){if(r)return r(t,n-1);var i=function(e){for(var r={},n=t.length,i=0;i=l)return o;if(i)return i=!1,a;var e=u;if(34===t.charCodeAt(e)){for(var r=e;r++24?(isFinite(e)&&(clearTimeout(we),we=setTimeout(Ae,e)),_e=0):(_e=1,Te(Ae))}function Me(){for(var t=Date.now(),e=xe;e;)t>=e.t&&e.c(t-e.t)&&(e.c=null),e=e.n;return t}function Se(){for(var t,e=xe,r=1/0;e;)e.c?(e.t1&&(e=t[a[o-2]],r=t[a[o-1]],n=t[s],(r[0]-e[0])*(n[1]-e[1])-(r[1]-e[1])*(n[0]-e[0])<=0);)--o;a[o++]=s}return a.slice(0,o)}function Pe(t,e){return t[0]-e[0]||t[1]-e[1]}a.timer=function(){ke.apply(this,arguments)},a.timer.flush=function(){Me(),Se()},a.round=function(t,e){return e?Math.round(t*(e=Math.pow(10,e)))/e:Math.round(t)},a.geom={},a.geom.hull=function(t){var e=Ee,r=Le;if(arguments.length)return n(t);function n(t){if(t.length<3)return[];var n,i=ge(e),a=ge(r),o=t.length,s=[],l=[];for(n=0;n=0;--n)p.push(t[s[u[n]][2]]);for(n=+f;nEt)s=s.L;else{if(!((i=a-Xe(s,o))>Et)){n>-Et?(e=s.P,r=s):i>-Et?(e=s,r=s.N):e=r=s;break}if(!s.R){e=s;break}s=s.R}var l=qe(t);if(Be.insert(e,l),e||r){if(e===r)return tr(e),r=qe(e.site),Be.insert(l,r),l.edge=r.edge=nr(e.site,l.site),Qe(e),void Qe(r);if(r){tr(e),tr(r);var u=e.site,c=u.x,f=u.y,h=t.x-c,p=t.y-f,d=r.site,v=d.x-c,g=d.y-f,y=2*(h*g-p*v),m=h*h+p*p,x=v*v+g*g,b={x:(g*m-p*x)/y+c,y:(h*x-v*m)/y+f};ir(r.edge,u,d,b),l.edge=nr(u,t,null,b),r.edge=nr(t,d,null,b),Qe(e),Qe(r)}else l.edge=nr(e.site,l.site)}}function We(t,e){var r=t.site,n=r.x,i=r.y,a=i-e;if(!a)return n;var o=t.P;if(!o)return-1/0;var s=(r=o.site).x,l=r.y,u=l-e;if(!u)return s;var c=s-n,f=1/a-1/u,h=c/u;return f?(-h+Math.sqrt(h*h-2*f*(c*c/(-2*u)-l+u/2+i-a/2)))/f+n:(n+s)/2}function Xe(t,e){var r=t.N;if(r)return We(r,e);var n=t.site;return n.y===e?n.x:1/0}function Je(t){this.site=t,this.edges=[]}function Ke(t,e){return e.angle-t.angle}function $e(){sr(this),this.x=this.y=this.arc=this.site=this.cy=null}function Qe(t){var e=t.P,r=t.N;if(e&&r){var n=e.site,i=t.site,a=r.site;if(n!==a){var o=i.x,s=i.y,l=n.x-o,u=n.y-s,c=a.x-o,f=2*(l*(g=a.y-s)-u*c);if(!(f>=-Lt)){var h=l*l+u*u,p=c*c+g*g,d=(g*h-u*p)/f,v=(l*p-c*h)/f,g=v+s,y=Ve.pop()||new $e;y.arc=t,y.site=i,y.x=d+o,y.y=g+Math.sqrt(d*d+v*v),y.cy=g,t.circle=y;for(var m=null,x=je._;x;)if(y.y=s)return;if(h>d){if(a){if(a.y>=u)return}else a={x:g,y:l};r={x:g,y:u}}else{if(a){if(a.y1)if(h>d){if(a){if(a.y>=u)return}else a={x:(l-i)/n,y:l};r={x:(u-i)/n,y:u}}else{if(a){if(a.y=s)return}else a={x:o,y:n*o+i};r={x:s,y:n*s+i}}else{if(a){if(a.x0)){if(e/=h,h<0){if(e0){if(e>f)return;e>c&&(c=e)}if(e=i-l,h||!(e<0)){if(e/=h,h<0){if(e>f)return;e>c&&(c=e)}else if(h>0){if(e0)){if(e/=p,p<0){if(e0){if(e>f)return;e>c&&(c=e)}if(e=a-u,p||!(e<0)){if(e/=p,p<0){if(e>f)return;e>c&&(c=e)}else if(p>0){if(e0&&(t.a={x:l+c*h,y:u+c*p}),f<1&&(t.b={x:l+f*h,y:u+f*p}),t}}}}}),l=o.length;l--;)(!er(e=o[l],t)||!s(e)||w(e.a.x-e.b.x)Et||w(i-r)>Et)&&(s.splice(o,0,new ar((y=a.site,m=c,x=w(n-f)Et?{x:f,y:w(e-f)Et?{x:w(r-d)Et?{x:h,y:w(e-h)Et?{x:w(r-p)=r&&u.x<=i&&u.y>=n&&u.y<=o?[[r,o],[i,o],[i,n],[r,n]]:[]).point=t[s]})),e}function s(t){return t.map((function(t,e){return{x:Math.round(n(t,e)/Et)*Et,y:Math.round(i(t,e)/Et)*Et,i:e}}))}return o.links=function(t){return fr(s(t)).edges.filter((function(t){return t.l&&t.r})).map((function(e){return{source:t[e.l.i],target:t[e.r.i]}}))},o.triangles=function(t){var e=[];return fr(s(t)).cells.forEach((function(r,n){for(var i,a,o,s,l=r.site,u=r.edges.sort(Ke),c=-1,f=u.length,h=u[f-1].edge,p=h.l===l?h.r:h.l;++ca&&(i=e.slice(a,i),s[o]?s[o]+=i:s[++o]=i),(r=r[0])===(n=n[0])?s[o]?s[o]+=n:s[++o]=n:(s[++o]=null,l.push({i:o,x:xr(r,n)})),a=wr.lastIndex;return av&&(v=l.x),l.y>g&&(g=l.y),u.push(l.x),c.push(l.y);else for(f=0;fv&&(v=x),b>g&&(g=b),u.push(x),c.push(b)}var _=v-p,T=g-d;function k(t,e,r,n,i,a,o,s){if(!isNaN(r)&&!isNaN(n))if(t.leaf){var l=t.x,u=t.y;if(null!=l)if(w(l-r)+w(u-n)<.01)A(t,e,r,n,i,a,o,s);else{var c=t.point;t.x=t.y=t.point=null,A(t,c,l,u,i,a,o,s),A(t,e,r,n,i,a,o,s)}else t.x=r,t.y=n,t.point=e}else A(t,e,r,n,i,a,o,s)}function A(t,e,r,n,i,a,o,s){var l=.5*(i+o),u=.5*(a+s),c=r>=l,f=n>=u,h=f<<1|c;t.leaf=!1,c?i=l:o=l,f?a=u:s=u,k(t=t.nodes[h]||(t.nodes[h]={leaf:!0,nodes:[],point:null,x:null,y:null}),e,r,n,i,a,o,s)}_>T?g=d+_:v=p+T;var M={leaf:!0,nodes:[],point:null,x:null,y:null,add:function(t){k(M,t,+y(t,++f),+m(t,f),p,d,v,g)}};if(M.visit=function(t){gr(t,M,p,d,v,g)},M.find=function(t){return function(t,e,r,n,i,a,o){var s,l=1/0;return function t(u,c,f,h,p){if(!(c>a||f>o||h=_)<<1|e>=b,T=w+4;w=0&&!(r=a.interpolators[n](t,e)););return r}function kr(t,e){var r,n=[],i=[],a=t.length,o=e.length,s=Math.min(t.length,e.length);for(r=0;r=1)return 1;var e=t*t,r=e*t;return 4*(t<.5?r:3*(t-e)+r-.75)}function Ir(t){return 1-Math.cos(t*It)}function Dr(t){return Math.pow(2,10*(t-1))}function zr(t){return 1-Math.sqrt(1-t*t)}function Rr(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}function Fr(t,e){return e-=t,function(r){return Math.round(t+e*r)}}function Br(t){var e,r,n,i=[t.a,t.b],a=[t.c,t.d],o=jr(i),s=Nr(i,a),l=jr(((e=a)[0]+=(n=-s)*(r=i)[0],e[1]+=n*r[1],e))||0;i[0]*a[1]=0?t.slice(0,r):t,i=r>=0?t.slice(r+1):"in";return n=Mr.get(n)||Ar,i=Sr.get(i)||z,e=i(n.apply(null,o.call(arguments,1))),function(t){return t<=0?0:t>=1?1:e(t)}},a.interpolateHcl=function(t,e){t=a.hcl(t),e=a.hcl(e);var r=t.h,n=t.c,i=t.l,o=e.h-r,s=e.c-n,l=e.l-i;return isNaN(s)&&(s=0,n=isNaN(n)?e.c:n),isNaN(o)?(o=0,r=isNaN(r)?e.h:r):o>180?o-=360:o<-180&&(o+=360),function(t){return Wt(r+o*t,n+s*t,i+l*t)+""}},a.interpolateHsl=function(t,e){t=a.hsl(t),e=a.hsl(e);var r=t.h,n=t.s,i=t.l,o=e.h-r,s=e.s-n,l=e.l-i;return isNaN(s)&&(s=0,n=isNaN(n)?e.s:n),isNaN(o)?(o=0,r=isNaN(r)?e.h:r):o>180?o-=360:o<-180&&(o+=360),function(t){return Gt(r+o*t,n+s*t,i+l*t)+""}},a.interpolateLab=function(t,e){t=a.lab(t),e=a.lab(e);var r=t.l,n=t.a,i=t.b,o=e.l-r,s=e.a-n,l=e.b-i;return function(t){return ee(r+o*t,n+s*t,i+l*t)+""}},a.interpolateRound=Fr,a.transform=function(t){var e=l.createElementNS(a.ns.prefix.svg,"g");return(a.transform=function(t){if(null!=t){e.setAttribute("transform",t);var r=e.transform.baseVal.consolidate()}return new Br(r?r.matrix:Ur)})(t)},Br.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var Ur={a:1,b:0,c:0,d:1,e:0,f:0};function Vr(t){return t.length?t.pop()+",":""}function Hr(t,e){var r=[],n=[];return t=a.transform(t),e=a.transform(e),function(t,e,r,n){if(t[0]!==e[0]||t[1]!==e[1]){var i=r.push("translate(",null,",",null,")");n.push({i:i-4,x:xr(t[0],e[0])},{i:i-2,x:xr(t[1],e[1])})}else(e[0]||e[1])&&r.push("translate("+e+")")}(t.translate,e.translate,r,n),function(t,e,r,n){t!==e?(t-e>180?e+=360:e-t>180&&(t+=360),n.push({i:r.push(Vr(r)+"rotate(",null,")")-2,x:xr(t,e)})):e&&r.push(Vr(r)+"rotate("+e+")")}(t.rotate,e.rotate,r,n),function(t,e,r,n){t!==e?n.push({i:r.push(Vr(r)+"skewX(",null,")")-2,x:xr(t,e)}):e&&r.push(Vr(r)+"skewX("+e+")")}(t.skew,e.skew,r,n),function(t,e,r,n){if(t[0]!==e[0]||t[1]!==e[1]){var i=r.push(Vr(r)+"scale(",null,",",null,")");n.push({i:i-4,x:xr(t[0],e[0])},{i:i-2,x:xr(t[1],e[1])})}else 1===e[0]&&1===e[1]||r.push(Vr(r)+"scale("+e+")")}(t.scale,e.scale,r,n),t=e=null,function(t){for(var e,i=-1,a=n.length;++i0?r=e:(t.c=null,t.t=NaN,t=null,l.end({type:"end",alpha:r=0})):e>0&&(l.start({type:"start",alpha:r=e}),t=ke(s.tick)),s):r},s.start=function(){var t,e,r,a=y.length,l=m.length,c=u[0],d=u[1];for(t=0;t=0;)r.push(i[n])}function an(t,e){for(var r=[t],n=[];null!=(t=r.pop());)if(n.push(t),(a=t.children)&&(i=a.length))for(var i,a,o=-1;++o=0;)o.push(c=u[l]),c.parent=a,c.depth=a.depth+1;r&&(a.value=0),a.children=u}else r&&(a.value=+r.call(n,a,a.depth)||0),delete a.children;return an(i,(function(e){var n,i;t&&(n=e.children)&&n.sort(t),r&&(i=e.parent)&&(i.value+=e.value)})),s}return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(nn(t,(function(t){t.children&&(t.value=0)})),an(t,(function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)}))),t},n},a.layout.partition=function(){var t=a.layout.hierarchy(),e=[1,1];function r(t,e,n,i){var a=t.children;if(t.x=e,t.y=t.depth*i,t.dx=n,t.dy=i,a&&(o=a.length)){var o,s,l,u=-1;for(n=t.value?n/t.value:0;++us&&(s=n),o.push(n)}for(r=0;ri&&(n=r,i=e);return n}function xn(t){return t.reduce(bn,0)}function bn(t,e){return t+e[1]}function _n(t,e){return wn(t,Math.ceil(Math.log(e.length)/Math.LN2+1))}function wn(t,e){for(var r=-1,n=+t[0],i=(t[1]-n)/e,a=[];++r<=e;)a[r]=i*r+n;return a}function Tn(t){return[a.min(t),a.max(t)]}function kn(t,e){return t.value-e.value}function An(t,e){var r=t._pack_next;t._pack_next=e,e._pack_prev=t,e._pack_next=r,r._pack_prev=e}function Mn(t,e){t._pack_next=e,e._pack_prev=t}function Sn(t,e){var r=e.x-t.x,n=e.y-t.y,i=t.r+e.r;return.999*i*i>r*r+n*n}function En(t){if((e=t.children)&&(l=e.length)){var e,r,n,i,a,o,s,l,u=1/0,c=-1/0,f=1/0,h=-1/0;if(e.forEach(Ln),(r=e[0]).x=-r.r,r.y=0,x(r),l>1&&((n=e[1]).x=n.r,n.y=0,x(n),l>2))for(On(r,n,i=e[2]),x(i),An(r,i),r._pack_prev=i,An(i,n),n=r._pack_next,a=3;a0)for(o=-1;++o=f[0]&&l<=f[1]&&((s=u[a.bisect(h,l,1,d)-1]).y+=v,s.push(i[o]));return u}return i.value=function(t){return arguments.length?(e=t,i):e},i.range=function(t){return arguments.length?(r=ge(t),i):r},i.bins=function(t){return arguments.length?(n="number"==typeof t?function(e){return wn(e,t)}:ge(t),i):n},i.frequency=function(e){return arguments.length?(t=!!e,i):t},i},a.layout.pack=function(){var t,e=a.layout.hierarchy().sort(kn),r=0,n=[1,1];function i(i,a){var o=e.call(this,i,a),s=o[0],l=n[0],u=n[1],c=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(s.x=s.y=0,an(s,(function(t){t.r=+c(t.value)})),an(s,En),r){var f=r*(t?1:Math.max(2*s.r/l,2*s.r/u))/2;an(s,(function(t){t.r+=f})),an(s,En),an(s,(function(t){t.r-=f}))}return Pn(s,l/2,u/2,t?1:1/Math.max(2*s.r/l,2*s.r/u)),o}return i.size=function(t){return arguments.length?(n=t,i):n},i.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,i):t},i.padding=function(t){return arguments.length?(r=+t,i):r},rn(i,e)},a.layout.tree=function(){var t=a.layout.hierarchy().sort(null).value(null),e=In,r=[1,1],n=null;function i(i,a){var u=t.call(this,i,a),c=u[0],f=function(t){for(var e,r={A:null,children:[t]},n=[r];null!=(e=n.pop());)for(var i,a=e.children,o=0,s=a.length;op.x&&(p=t),t.depth>d.depth&&(d=t)}));var v=e(h,p)/2-h.x,g=r[0]/(p.x+e(p,h)/2+v),y=r[1]/(d.depth||1);nn(c,(function(t){t.x=(t.x+v)*g,t.y=t.depth*y}))}return u}function o(t){var r=t.children,n=t.parent.children,i=t.i?n[t.i-1]:null;if(r.length){!function(t){for(var e,r=0,n=0,i=t.children,a=i.length;--a>=0;)(e=i[a]).z+=r,e.m+=r,r+=e.s+(n+=e.c)}(t);var a=(r[0].z+r[r.length-1].z)/2;i?(t.z=i.z+e(t._,i._),t.m=t.z-a):t.z=a}else i&&(t.z=i.z+e(t._,i._));t.parent.A=function(t,r,n){if(r){for(var i,a=t,o=t,s=r,l=a.parent.children[0],u=a.m,c=o.m,f=s.m,h=l.m;s=zn(s),a=Dn(a),s&&a;)l=Dn(l),(o=zn(o)).a=t,(i=s.z+f-a.z-u+e(s._,a._))>0&&(Rn(Fn(s,t,n),t,i),u+=i,c+=i),f+=s.m,u+=a.m,h+=l.m,c+=o.m;s&&!zn(o)&&(o.t=s,o.m+=f-c),a&&!Dn(l)&&(l.t=a,l.m+=u-h,n=t)}return n}(t,i,t.parent.A||n[0])}function s(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function l(t){t.x*=r[0],t.y=t.depth*r[1]}return i.separation=function(t){return arguments.length?(e=t,i):e},i.size=function(t){return arguments.length?(n=null==(r=t)?l:null,i):n?null:r},i.nodeSize=function(t){return arguments.length?(n=null==(r=t)?null:l,i):n?r:null},rn(i,t)},a.layout.cluster=function(){var t=a.layout.hierarchy().sort(null).value(null),e=In,r=[1,1],n=!1;function i(i,o){var s,l=t.call(this,i,o),u=l[0],c=0;an(u,(function(t){var r=t.children;r&&r.length?(t.x=function(t){return t.reduce((function(t,e){return t+e.x}),0)/t.length}(r),t.y=function(t){return 1+a.max(t,(function(t){return t.y}))}(r)):(t.x=s?c+=e(t,s):0,t.y=0,s=t)}));var f=Bn(u),h=Nn(u),p=f.x-e(f,h)/2,d=h.x+e(h,f)/2;return an(u,n?function(t){t.x=(t.x-u.x)*r[0],t.y=(u.y-t.y)*r[1]}:function(t){t.x=(t.x-p)/(d-p)*r[0],t.y=(1-(u.y?t.y/u.y:1))*r[1]}),l}return i.separation=function(t){return arguments.length?(e=t,i):e},i.size=function(t){return arguments.length?(n=null==(r=t),i):n?null:r},i.nodeSize=function(t){return arguments.length?(n=null!=(r=t),i):n?r:null},rn(i,t)},a.layout.treemap=function(){var t,e=a.layout.hierarchy(),r=Math.round,n=[1,1],i=null,o=jn,s=!1,l="squarify",u=.5*(1+Math.sqrt(5));function c(t,e){for(var r,n,i=-1,a=t.length;++i0;)s.push(r=u[i-1]),s.area+=r.area,"squarify"!==l||(n=p(s,v))<=h?(u.pop(),h=n):(s.area-=s.pop().area,d(s,v,a,!1),v=Math.min(a.dx,a.dy),s.length=s.area=0,h=1/0);s.length&&(d(s,v,a,!0),s.length=s.area=0),e.forEach(f)}}function h(t){var e=t.children;if(e&&e.length){var r,n=o(t),i=e.slice(),a=[];for(c(i,n.dx*n.dy/t.value),a.area=0;r=i.pop();)a.push(r),a.area+=r.area,null!=r.z&&(d(a,r.z?n.dx:n.dy,n,!i.length),a.length=a.area=0);e.forEach(h)}}function p(t,e){for(var r,n=t.area,i=0,a=1/0,o=-1,s=t.length;++oi&&(i=r));return e*=e,(n*=n)?Math.max(e*i*u/n,n/(e*a*u)):1/0}function d(t,e,n,i){var a,o=-1,s=t.length,l=n.x,u=n.y,c=e?r(t.area/e):0;if(e==n.dx){for((i||c>n.dy)&&(c=n.dy);++on.dx)&&(c=n.dx);++o1);return t+e*r*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var t=a.random.normal.apply(a,arguments);return function(){return Math.exp(t())}},bates:function(t){var e=a.random.irwinHall(t);return function(){return e()/t}},irwinHall:function(t){return function(){for(var e=0,r=0;r2?Wn:qn,l=n?Gr:qr;return i=o(t,e,l,r),a=o(e,t,l,Tr),s}function s(t){return i(t)}return s.invert=function(t){return a(t)},s.domain=function(e){return arguments.length?(t=e.map(Number),o()):t},s.range=function(t){return arguments.length?(e=t,o()):e},s.rangeRound=function(t){return s.range(t).interpolate(Fr)},s.clamp=function(t){return arguments.length?(n=t,o()):n},s.interpolate=function(t){return arguments.length?(r=t,o()):r},s.ticks=function(e){return Qn(t,e)},s.tickFormat=function(e,r){return d3_scale_linearTickFormat(t,e,r)},s.nice=function(e){return Kn(t,e),o()},s.copy=function(){return Xn(t,e,r,n)},o()}function Jn(t,e){return a.rebind(t,e,"range","rangeRound","interpolate","clamp")}function Kn(t,e){return Gn(t,Zn($n(t,e)[2])),Gn(t,Zn($n(t,e)[2])),t}function $n(t,e){null==e&&(e=10);var r=Vn(t),n=r[1]-r[0],i=Math.pow(10,Math.floor(Math.log(n/e)/Math.LN10)),a=e/n*i;return a<=.15?i*=10:a<=.35?i*=5:a<=.75&&(i*=2),r[0]=Math.ceil(r[0]/i)*i,r[1]=Math.floor(r[1]/i)*i+.5*i,r[2]=i,r}function Qn(t,e){return a.range.apply(a,$n(t,e))}function ti(t,e,r,n){function i(t){return(r?Math.log(t<0?0:t):-Math.log(t>0?0:-t))/Math.log(e)}function a(t){return r?Math.pow(e,t):-Math.pow(e,-t)}function o(e){return t(i(e))}return o.invert=function(e){return a(t.invert(e))},o.domain=function(e){return arguments.length?(r=e[0]>=0,t.domain((n=e.map(Number)).map(i)),o):n},o.base=function(r){return arguments.length?(e=+r,t.domain(n.map(i)),o):e},o.nice=function(){var e=Gn(n.map(i),r?Math:ei);return t.domain(e),n=e.map(a),o},o.ticks=function(){var t=Vn(n),o=[],s=t[0],l=t[1],u=Math.floor(i(s)),c=Math.ceil(i(l)),f=e%1?2:e;if(isFinite(c-u)){if(r){for(;u0;h--)o.push(a(u)*h);for(u=0;o[u]l;c--);o=o.slice(u,c)}return o},o.copy=function(){return ti(t.copy(),e,r,n)},Jn(o,t)}a.scale.linear=function(){return Xn([0,1],[0,1],Tr,!1)},a.scale.log=function(){return ti(a.scale.linear().domain([0,1]),10,!0,[1,10])};var ei={floor:function(t){return-Math.ceil(-t)},ceil:function(t){return-Math.floor(-t)}};function ri(t,e,r){var n=ni(e),i=ni(1/e);function a(e){return t(n(e))}return a.invert=function(e){return i(t.invert(e))},a.domain=function(e){return arguments.length?(t.domain((r=e.map(Number)).map(n)),a):r},a.ticks=function(t){return Qn(r,t)},a.tickFormat=function(t,e){return d3_scale_linearTickFormat(r,t,e)},a.nice=function(t){return a.domain(Kn(r,t))},a.exponent=function(o){return arguments.length?(n=ni(e=o),i=ni(1/e),t.domain(r.map(n)),a):e},a.copy=function(){return ri(t.copy(),e,r)},Jn(a,t)}function ni(t){return function(e){return e<0?-Math.pow(-e,t):Math.pow(e,t)}}function ii(t,e){var r,n,i;function o(i){return n[((r.get(i)||("range"===e.t?r.set(i,t.push(i)):NaN))-1)%n.length]}function s(e,r){return a.range(t.length).map((function(t){return e+r*t}))}return o.domain=function(n){if(!arguments.length)return t;t=[],r=new k;for(var i,a=-1,s=n.length;++a0?r[n-1]:t[0],nf?0:1;if(u=Ot)return l(u,p)+(s?l(s,1-p):"")+"Z";var d,v,g,y,m,x,b,_,w,T,k,A,M=0,S=0,E=[];if((y=(+o.apply(this,arguments)||0)/2)&&(g=n===di?Math.sqrt(s*s+u*u):+n.apply(this,arguments),p||(S*=-1),u&&(S=Rt(g/u*Math.sin(y))),s&&(M=Rt(g/s*Math.sin(y)))),u){m=u*Math.cos(c+S),x=u*Math.sin(c+S),b=u*Math.cos(f-S),_=u*Math.sin(f-S);var L=Math.abs(f-c-2*S)<=Ct?0:1;if(S&&bi(m,x,b,_)===p^L){var C=(c+f)/2;m=u*Math.cos(C),x=u*Math.sin(C),b=_=null}}else m=x=0;if(s){w=s*Math.cos(f-M),T=s*Math.sin(f-M),k=s*Math.cos(c+M),A=s*Math.sin(c+M);var P=Math.abs(c-f+2*M)<=Ct?0:1;if(M&&bi(w,T,k,A)===1-p^P){var O=(c+f)/2;w=s*Math.cos(O),T=s*Math.sin(O),k=A=null}}else w=T=0;if(h>Et&&(d=Math.min(Math.abs(u-s)/2,+r.apply(this,arguments)))>.001){v=s0?0:1}function _i(t,e,r,n,i){var a=t[0]-e[0],o=t[1]-e[1],s=(i?n:-n)/Math.sqrt(a*a+o*o),l=s*o,u=-s*a,c=t[0]+l,f=t[1]+u,h=e[0]+l,p=e[1]+u,d=(c+h)/2,v=(f+p)/2,g=h-c,y=p-f,m=g*g+y*y,x=r-n,b=c*p-h*f,_=(y<0?-1:1)*Math.sqrt(Math.max(0,x*x*m-b*b)),w=(b*y-g*_)/m,T=(-b*g-y*_)/m,k=(b*y+g*_)/m,A=(-b*g+y*_)/m,M=w-d,S=T-v,E=k-d,L=A-v;return M*M+S*S>E*E+L*L&&(w=k,T=A),[[w-l,T-u],[w*r/x,T*r/x]]}function wi(){return!0}function Ti(t){var e=Ee,r=Le,n=wi,i=Ai,a=i.key,o=.7;function s(a){var s,l=[],u=[],c=-1,f=a.length,h=ge(e),p=ge(r);function d(){l.push("M",i(t(u),o))}for(;++c1&&i.push("H",n[0]),i.join("")},"step-before":Si,"step-after":Ei,basis:Pi,"basis-open":function(t){if(t.length<4)return Ai(t);for(var e,r=[],n=-1,i=t.length,a=[0],o=[0];++n<3;)e=t[n],a.push(e[0]),o.push(e[1]);for(r.push(Oi(zi,a)+","+Oi(zi,o)),--n;++n9&&(i=3*e/Math.sqrt(i),o[s]=i*r,o[s+1]=i*n);for(s=-1;++s<=l;)i=(t[Math.min(l,s+1)][0]-t[Math.max(0,s-1)][0])/(6*(1+o[s]*o[s])),a.push([i||0,o[s]*i||0]);return a}(t))}});function Ai(t){return t.length>1?t.join("L"):t+"Z"}function Mi(t){return t.join("L")+"Z"}function Si(t){for(var e=0,r=t.length,n=t[0],i=[n[0],",",n[1]];++e1){s=e[1],a=t[l],l++,n+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(a[0]-s[0])+","+(a[1]-s[1])+","+a[0]+","+a[1];for(var u=2;uCt)+",1 "+e}function l(t,e,r,n){return"Q 0,0 "+n}return a.radius=function(t){return arguments.length?(r=ge(t),a):r},a.source=function(e){return arguments.length?(t=ge(e),a):t},a.target=function(t){return arguments.length?(e=ge(t),a):e},a.startAngle=function(t){return arguments.length?(n=ge(t),a):n},a.endAngle=function(t){return arguments.length?(i=ge(t),a):i},a},a.svg.diagonal=function(){var t=ji,e=Ui,r=Hi;function n(n,i){var a=t.call(this,n,i),o=e.call(this,n,i),s=(a.y+o.y)/2,l=[a,{x:a.x,y:s},{x:o.x,y:s},o];return"M"+(l=l.map(r))[0]+"C"+l[1]+" "+l[2]+" "+l[3]}return n.source=function(e){return arguments.length?(t=ge(e),n):t},n.target=function(t){return arguments.length?(e=ge(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},a.svg.diagonal.radial=function(){var t=a.svg.diagonal(),e=Hi,r=t.projection;return t.projection=function(t){return arguments.length?r(function(t){return function(){var e=t.apply(this,arguments),r=e[0],n=e[1]-It;return[r*Math.cos(n),r*Math.sin(n)]}}(e=t)):e},t},a.svg.symbol=function(){var t=Gi,e=qi;function r(r,n){return(Yi.get(t.call(this,r,n))||Zi)(e.call(this,r,n))}return r.type=function(e){return arguments.length?(t=ge(e),r):t},r.size=function(t){return arguments.length?(e=ge(t),r):e},r};var Yi=a.map({circle:Zi,cross:function(t){var e=Math.sqrt(t/5)/2;return"M"+-3*e+","+-e+"H"+-e+"V"+-3*e+"H"+e+"V"+-e+"H"+3*e+"V"+e+"H"+e+"V"+3*e+"H"+-e+"V"+e+"H"+-3*e+"Z"},diamond:function(t){var e=Math.sqrt(t/(2*Xi)),r=e*Xi;return"M0,"+-e+"L"+r+",0 0,"+e+" "+-r+",0Z"},square:function(t){var e=Math.sqrt(t)/2;return"M"+-e+","+-e+"L"+e+","+-e+" "+e+","+e+" "+-e+","+e+"Z"},"triangle-down":function(t){var e=Math.sqrt(t/Wi),r=e*Wi/2;return"M0,"+r+"L"+e+","+-r+" "+-e+","+-r+"Z"},"triangle-up":function(t){var e=Math.sqrt(t/Wi),r=e*Wi/2;return"M0,"+-r+"L"+e+","+r+" "+-e+","+r+"Z"}});a.svg.symbolTypes=Yi.keys();var Wi=Math.sqrt(3),Xi=Math.tan(30*Dt);K.transition=function(t){for(var e,r,n=Qi||++ra,i=aa(t),a=[],o=ta||{time:Date.now(),ease:Or,delay:0,duration:250},s=-1,l=this.length;++s0;)u[--h].call(t,o);if(a>=1)return f.event&&f.event.end.call(t,t.__data__,e),--c.count?delete c[n]:delete t[r],1}f||(a=i.time,o=ke((function(t){var e=f.delay;if(o.t=e+a,e<=t)return h(t-e);o.c=h}),0,a),f=c[n]={tween:new k,time:a,timer:o,delay:i.delay,duration:i.duration,ease:i.ease,index:e},i=null,++c.count)}ea.call=K.call,ea.empty=K.empty,ea.node=K.node,ea.size=K.size,a.transition=function(t,e){return t&&t.transition?Qi?t.transition(e):t:a.selection().transition(t)},a.transition.prototype=ea,ea.select=function(t){var e,r,n,i=this.id,a=this.namespace,o=[];t=$(t);for(var s=-1,l=this.length;++srect,.s>rect").attr("width",o[1]-o[0])}function v(t){t.select(".extent").attr("y",s[0]),t.selectAll(".extent,.e>rect,.w>rect").attr("height",s[1]-s[0])}function g(){var f,g,y=this,m=a.select(a.event.target),x=r.of(y,arguments),b=a.select(y),_=m.datum(),w=!/^(n|s)$/.test(_)&&n,T=!/^(e|w)$/.test(_)&&i,k=m.classed("extent"),A=kt(y),M=a.mouse(y),S=a.select(c(y)).on("keydown.brush",(function(){32==a.event.keyCode&&(k||(f=null,M[0]-=o[1],M[1]-=s[1],k=2),V())})).on("keyup.brush",(function(){32==a.event.keyCode&&2==k&&(M[0]+=o[1],M[1]+=s[1],k=0,V())}));if(a.event.changedTouches?S.on("touchmove.brush",C).on("touchend.brush",O):S.on("mousemove.brush",C).on("mouseup.brush",O),b.interrupt().selectAll("*").interrupt(),k)M[0]=o[0]-M[0],M[1]=s[0]-M[1];else if(_){var E=+/w$/.test(_),L=+/^n/.test(_);g=[o[1-E]-M[0],s[1-L]-M[1]],M[0]=o[E],M[1]=s[L]}else a.event.altKey&&(f=M.slice());function C(){var t=a.mouse(y),e=!1;g&&(t[0]+=g[0],t[1]+=g[1]),k||(a.event.altKey?(f||(f=[(o[0]+o[1])/2,(s[0]+s[1])/2]),M[0]=o[+(t[0]>>1;e.dtype||(e.dtype="array"),"string"==typeof e.dtype?d=new(f(e.dtype))(g):e.dtype&&(d=e.dtype,Array.isArray(d)&&(d.length=g));for(var y=0;yr||s>1073741824){for(var h=0;hr+i||M>n+i||S=C||o===s)){var l=m[a];void 0===s&&(s=l.length);for(var u=o;u=g&&f<=w&&h>=y&&h<=T&&P.push(c)}var p=x[a],d=p[4*o+0],v=p[4*o+1],b=p[4*o+2],_=p[4*o+3],k=function(t,e){for(var r=null,n=0;null===r;)if(r=t[4*e+n],++n>t.length)return null;return r}(p,o+1),E=.5*i,O=a+1;e(r,n,E,O,d,v||b||_||k),e(r,n+E,E,O,v,b||_||k),e(r+E,n,E,O,b,_||k),e(r+E,n+E,E,O,_,k)}}(0,0,1,0,0,1),P},d;function E(t,e,r){for(var n=1,i=.5,a=.5,o=.5,s=0;s0){e+=Math.abs(o(t[0]));for(var r=1;r2){for(l=0;l=0))throw new Error("precision must be a positive number");var r=Math.pow(10,e||0);return Math.round(t*r)/r},e.radiansToLength=c,e.lengthToRadians=f,e.lengthToDegrees=function(t,e){return h(f(t,e))},e.bearingToAzimuth=function(t){var e=t%360;return e<0&&(e+=360),e},e.radiansToDegrees=h,e.degreesToRadians=function(t){return t%360*Math.PI/180},e.convertLength=function(t,e,r){if(void 0===e&&(e="kilometers"),void 0===r&&(r="kilometers"),!(t>=0))throw new Error("length must be a positive number");return c(f(t,e),r)},e.convertArea=function(t,r,n){if(void 0===r&&(r="meters"),void 0===n&&(n="kilometers"),!(t>=0))throw new Error("area must be a positive number");var i=e.areaFactors[r];if(!i)throw new Error("invalid original units");var a=e.areaFactors[n];if(!a)throw new Error("invalid final units");return t/i*a},e.isNumber=p,e.isObject=function(t){return!!t&&t.constructor===Object},e.validateBBox=function(t){if(!t)throw new Error("bbox is required");if(!Array.isArray(t))throw new Error("bbox must be an Array");if(4!==t.length&&6!==t.length)throw new Error("bbox must be an Array of 4 or 6 numbers");t.forEach((function(t){if(!p(t))throw new Error("bbox must only contain numbers")}))},e.validateId=function(t){if(!t)throw new Error("id is required");if(-1===["string","number"].indexOf(typeof t))throw new Error("id must be a number or a string")}},60302:function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=r(23132);function i(t,e,r){if(null!==t)for(var n,a,o,s,l,u,c,f,h=0,p=0,d=t.type,v="FeatureCollection"===d,g="Feature"===d,y=v?t.features.length:1,m=0;mu||p>c||d>f)return l=i,u=r,c=p,f=d,void(o=0);var v=n.lineString([l,i],t.properties);if(!1===e(v,r,a,d,o))return!1;o++,l=i}))&&void 0}}}))}function c(t,e){if(!t)throw new Error("geojson is required");l(t,(function(t,r,i){if(null!==t.geometry){var a=t.geometry.type,o=t.geometry.coordinates;switch(a){case"LineString":if(!1===e(t,r,i,0,0))return!1;break;case"Polygon":for(var s=0;st[0]&&(e[0]=t[0]),e[1]>t[1]&&(e[1]=t[1]),e[2]=0))throw new Error("precision must be a positive number");var r=Math.pow(10,e||0);return Math.round(t*r)/r},e.radiansToLength=c,e.lengthToRadians=f,e.lengthToDegrees=function(t,e){return h(f(t,e))},e.bearingToAzimuth=function(t){var e=t%360;return e<0&&(e+=360),e},e.radiansToDegrees=h,e.degreesToRadians=function(t){return t%360*Math.PI/180},e.convertLength=function(t,e,r){if(void 0===e&&(e="kilometers"),void 0===r&&(r="kilometers"),!(t>=0))throw new Error("length must be a positive number");return c(f(t,e),r)},e.convertArea=function(t,r,n){if(void 0===r&&(r="meters"),void 0===n&&(n="kilometers"),!(t>=0))throw new Error("area must be a positive number");var i=e.areaFactors[r];if(!i)throw new Error("invalid original units");var a=e.areaFactors[n];if(!a)throw new Error("invalid final units");return t/i*a},e.isNumber=p,e.isObject=function(t){return!!t&&t.constructor===Object},e.validateBBox=function(t){if(!t)throw new Error("bbox is required");if(!Array.isArray(t))throw new Error("bbox must be an Array");if(4!==t.length&&6!==t.length)throw new Error("bbox must be an Array of 4 or 6 numbers");t.forEach((function(t){if(!p(t))throw new Error("bbox must only contain numbers")}))},e.validateId=function(t){if(!t)throw new Error("id is required");if(-1===["string","number"].indexOf(typeof t))throw new Error("id must be a number or a string")}},27138:function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=r(94228);function i(t,e,r){if(null!==t)for(var n,a,o,s,l,u,c,f,h=0,p=0,d=t.type,v="FeatureCollection"===d,g="Feature"===d,y=v?t.features.length:1,m=0;mu||p>c||d>f)return l=i,u=r,c=p,f=d,void(o=0);var v=n.lineString([l,i],t.properties);if(!1===e(v,r,a,d,o))return!1;o++,l=i}))&&void 0}}}))}function c(t,e){if(!t)throw new Error("geojson is required");l(t,(function(t,r,i){if(null!==t.geometry){var a=t.geometry.type,o=t.geometry.coordinates;switch(a){case"LineString":if(!1===e(t,r,i,0,0))return!1;break;case"Polygon":for(var s=0;s=0))throw new Error("precision must be a positive number");var r=Math.pow(10,e||0);return Math.round(t*r)/r},e.radiansToLength=c,e.lengthToRadians=f,e.lengthToDegrees=function(t,e){return h(f(t,e))},e.bearingToAzimuth=function(t){var e=t%360;return e<0&&(e+=360),e},e.radiansToDegrees=h,e.degreesToRadians=function(t){return t%360*Math.PI/180},e.convertLength=function(t,e,r){if(void 0===e&&(e="kilometers"),void 0===r&&(r="kilometers"),!(t>=0))throw new Error("length must be a positive number");return c(f(t,e),r)},e.convertArea=function(t,r,n){if(void 0===r&&(r="meters"),void 0===n&&(n="kilometers"),!(t>=0))throw new Error("area must be a positive number");var i=e.areaFactors[r];if(!i)throw new Error("invalid original units");var a=e.areaFactors[n];if(!a)throw new Error("invalid final units");return t/i*a},e.isNumber=p,e.isObject=function(t){return!!t&&t.constructor===Object},e.validateBBox=function(t){if(!t)throw new Error("bbox is required");if(!Array.isArray(t))throw new Error("bbox must be an Array");if(4!==t.length&&6!==t.length)throw new Error("bbox must be an Array of 4 or 6 numbers");t.forEach((function(t){if(!p(t))throw new Error("bbox must only contain numbers")}))},e.validateId=function(t){if(!t)throw new Error("id is required");if(-1===["string","number"].indexOf(typeof t))throw new Error("id must be a number or a string")},e.radians2degrees=function(){throw new Error("method has been renamed to `radiansToDegrees`")},e.degrees2radians=function(){throw new Error("method has been renamed to `degreesToRadians`")},e.distanceToDegrees=function(){throw new Error("method has been renamed to `lengthToDegrees`")},e.distanceToRadians=function(){throw new Error("method has been renamed to `lengthToRadians`")},e.radiansToDistance=function(){throw new Error("method has been renamed to `radiansToLength`")},e.bearingToAngle=function(){throw new Error("method has been renamed to `bearingToAzimuth`")},e.convertDistance=function(){throw new Error("method has been renamed to `convertLength`")}},88553:function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=r(64182);function i(t,e,r){if(null!==t)for(var n,a,o,s,l,u,c,f,h=0,p=0,d=t.type,v="FeatureCollection"===d,g="Feature"===d,y=v?t.features.length:1,m=0;mu||p>c||d>f)return l=i,u=r,c=p,f=d,void(o=0);var v=n.lineString([l,i],t.properties);if(!1===e(v,r,a,d,o))return!1;o++,l=i}))&&void 0}}}))}function c(t,e){if(!t)throw new Error("geojson is required");l(t,(function(t,r,i){if(null!==t.geometry){var a=t.geometry.type,o=t.geometry.coordinates;switch(a){case"LineString":if(!1===e(t,r,i,0,0))return!1;break;case"Polygon":for(var s=0;si&&(i=t[o]),t[o]1?r-1:0),i=1;i1?r-1:0),i=1;i1?r-1:0),i=1;i1?r-1:0),i=1;it.length)&&(r=t.length),t.substring(r-e.length,r)===e}var g="",y="",m="",x="",b={deepStrictEqual:"Expected values to be strictly deep-equal:",strictEqual:"Expected values to be strictly equal:",strictEqualObject:'Expected "actual" to be reference-equal to "expected":',deepEqual:"Expected values to be loosely deep-equal:",equal:"Expected values to be loosely equal:",notDeepStrictEqual:'Expected "actual" not to be strictly deep-equal to:',notStrictEqual:'Expected "actual" to be strictly unequal to:',notStrictEqualObject:'Expected "actual" not to be reference-equal to "expected":',notDeepEqual:'Expected "actual" not to be loosely deep-equal to:',notEqual:'Expected "actual" to be loosely unequal to:',notIdentical:"Values identical but not reference-equal:"};function _(t){var e=Object.keys(t),r=Object.create(Object.getPrototypeOf(t));return e.forEach((function(e){r[e]=t[e]})),Object.defineProperty(r,"message",{value:t.message}),r}function w(t){return p(t,{compact:!1,customInspect:!1,depth:1e3,maxArrayLength:1/0,showHidden:!1,breakLength:1/0,showProxy:!1,sorted:!0,getters:!0})}var T=function(t){function e(t){var r;if(function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),"object"!==h(t)||null===t)throw new d("options","Object",t);var i=t.message,a=t.operator,l=t.stackStartFn,u=t.actual,c=t.expected,p=Error.stackTraceLimit;if(Error.stackTraceLimit=0,null!=i)r=o(this,f(e).call(this,String(i)));else if(n.stderr&&n.stderr.isTTY&&(n.stderr&&n.stderr.getColorDepth&&1!==n.stderr.getColorDepth()?(g="",y="",x="",m=""):(g="",y="",x="",m="")),"object"===h(u)&&null!==u&&"object"===h(c)&&null!==c&&"stack"in u&&u instanceof Error&&"stack"in c&&c instanceof Error&&(u=_(u),c=_(c)),"deepStrictEqual"===a||"strictEqual"===a)r=o(this,f(e).call(this,function(t,e,r){var i="",a="",o=0,s="",l=!1,u=w(t),c=u.split("\n"),f=w(e).split("\n"),p=0,d="";if("strictEqual"===r&&"object"===h(t)&&"object"===h(e)&&null!==t&&null!==e&&(r="strictEqualObject"),1===c.length&&1===f.length&&c[0]!==f[0]){var _=c[0].length+f[0].length;if(_<=10){if(!("object"===h(t)&&null!==t||"object"===h(e)&&null!==e||0===t&&0===e))return"".concat(b[r],"\n\n")+"".concat(c[0]," !== ").concat(f[0],"\n")}else if("strictEqualObject"!==r&&_<(n.stderr&&n.stderr.isTTY?n.stderr.columns:80)){for(;c[0][p]===f[0][p];)p++;p>2&&(d="\n ".concat(function(t,e){if(e=Math.floor(e),0==t.length||0==e)return"";var r=t.length*e;for(e=Math.floor(Math.log(e)/Math.log(2));e;)t+=t,e--;return t+t.substring(0,r-t.length)}(" ",p),"^"),p=0)}}for(var T=c[c.length-1],k=f[f.length-1];T===k&&(p++<2?s="\n ".concat(T).concat(s):i=T,c.pop(),f.pop(),0!==c.length&&0!==f.length);)T=c[c.length-1],k=f[f.length-1];var A=Math.max(c.length,f.length);if(0===A){var M=u.split("\n");if(M.length>30)for(M[26]="".concat(g,"...").concat(x);M.length>27;)M.pop();return"".concat(b.notIdentical,"\n\n").concat(M.join("\n"),"\n")}p>3&&(s="\n".concat(g,"...").concat(x).concat(s),l=!0),""!==i&&(s="\n ".concat(i).concat(s),i="");var S=0,E=b[r]+"\n".concat(y,"+ actual").concat(x," ").concat(m,"- expected").concat(x),L=" ".concat(g,"...").concat(x," Lines skipped");for(p=0;p1&&p>2&&(C>4?(a+="\n".concat(g,"...").concat(x),l=!0):C>3&&(a+="\n ".concat(f[p-2]),S++),a+="\n ".concat(f[p-1]),S++),o=p,i+="\n".concat(m,"-").concat(x," ").concat(f[p]),S++;else if(f.length1&&p>2&&(C>4?(a+="\n".concat(g,"...").concat(x),l=!0):C>3&&(a+="\n ".concat(c[p-2]),S++),a+="\n ".concat(c[p-1]),S++),o=p,a+="\n".concat(y,"+").concat(x," ").concat(c[p]),S++;else{var P=f[p],O=c[p],I=O!==P&&(!v(O,",")||O.slice(0,-1)!==P);I&&v(P,",")&&P.slice(0,-1)===O&&(I=!1,O+=","),I?(C>1&&p>2&&(C>4?(a+="\n".concat(g,"...").concat(x),l=!0):C>3&&(a+="\n ".concat(c[p-2]),S++),a+="\n ".concat(c[p-1]),S++),o=p,a+="\n".concat(y,"+").concat(x," ").concat(O),i+="\n".concat(m,"-").concat(x," ").concat(P),S+=2):(a+=i,i="",1!==C&&0!==p||(a+="\n ".concat(O),S++))}if(S>20&&p30)for(k[26]="".concat(g,"...").concat(x);k.length>27;)k.pop();r=1===k.length?o(this,f(e).call(this,"".concat(T," ").concat(k[0]))):o(this,f(e).call(this,"".concat(T,"\n\n").concat(k.join("\n"),"\n")))}else{var A=w(u),M="",S=b[a];"notDeepEqual"===a||"notEqual"===a?(A="".concat(b[a],"\n\n").concat(A)).length>1024&&(A="".concat(A.slice(0,1021),"...")):(M="".concat(w(c)),A.length>512&&(A="".concat(A.slice(0,509),"...")),M.length>512&&(M="".concat(M.slice(0,509),"...")),"deepEqual"===a||"equal"===a?A="".concat(S,"\n\n").concat(A,"\n\nshould equal\n\n"):M=" ".concat(a," ").concat(M)),r=o(this,f(e).call(this,"".concat(A).concat(M)))}return Error.stackTraceLimit=p,r.generatedMessage=!i,Object.defineProperty(s(r),"name",{value:"AssertionError [ERR_ASSERTION]",enumerable:!1,writable:!0,configurable:!0}),r.code="ERR_ASSERTION",r.actual=u,r.expected=c,r.operator=a,Error.captureStackTrace&&Error.captureStackTrace(s(r),l),r.stack,r.name="AssertionError",o(r)}var r,l;return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&c(t,e)}(e,t),r=e,l=[{key:"toString",value:function(){return"".concat(this.name," [").concat(this.code,"]: ").concat(this.message)}},{key:p.custom,value:function(t,e){return p(this,function(t){for(var e=1;e2?"one of ".concat(e," ").concat(t.slice(0,r-1).join(", "),", or ")+t[r-1]:2===r?"one of ".concat(e," ").concat(t[0]," or ").concat(t[1]):"of ".concat(e," ").concat(t[0])}return"of ".concat(e," ").concat(String(t))}u("ERR_AMBIGUOUS_ARGUMENT",'The "%s" argument is ambiguous. %s',TypeError),u("ERR_INVALID_ARG_TYPE",(function(t,e,i){var a,s,l,u,f;if(void 0===o&&(o=r(32791)),o("string"==typeof t,"'name' must be a string"),"string"==typeof e&&(s="not ",e.substr(0,4)===s)?(a="must not be",e=e.replace(/^not /,"")):a="must be",function(t,e,r){return(void 0===r||r>t.length)&&(r=t.length),t.substring(r-9,r)===e}(t," argument"))l="The ".concat(t," ").concat(a," ").concat(c(e,"type"));else{var h=("number"!=typeof f&&(f=0),f+1>(u=t).length||-1===u.indexOf(".",f)?"argument":"property");l='The "'.concat(t,'" ').concat(h," ").concat(a," ").concat(c(e,"type"))}return l+". Received type ".concat(n(i))}),TypeError),u("ERR_INVALID_ARG_VALUE",(function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"is invalid";void 0===s&&(s=r(43827));var i=s.inspect(e);return i.length>128&&(i="".concat(i.slice(0,128),"...")),"The argument '".concat(t,"' ").concat(n,". Received ").concat(i)}),TypeError,RangeError),u("ERR_INVALID_RETURN_VALUE",(function(t,e,r){var i;return i=r&&r.constructor&&r.constructor.name?"instance of ".concat(r.constructor.name):"type ".concat(n(r)),"Expected ".concat(t,' to be returned from the "').concat(e,'"')+" function but got ".concat(i,".")}),TypeError),u("ERR_MISSING_ARGS",(function(){for(var t=arguments.length,e=new Array(t),n=0;n0,"At least one arg needs to be specified");var i="The ",a=e.length;switch(e=e.map((function(t){return'"'.concat(t,'"')})),a){case 1:i+="".concat(e[0]," argument");break;case 2:i+="".concat(e[0]," and ").concat(e[1]," arguments");break;default:i+=e.slice(0,a-1).join(", "),i+=", and ".concat(e[a-1]," arguments")}return"".concat(i," must be specified")}),TypeError),t.exports.codes=l},74061:function(t,e,r){"use strict";function n(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=[],n=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(n=(o=s.next()).done)&&(r.push(o.value),!e||r.length!==e);n=!0);}catch(t){i=!0,a=t}finally{try{n||null==s.return||s.return()}finally{if(i)throw a}}return r}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function i(t){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i(t)}var a=void 0!==/a/g.flags,o=function(t){var e=[];return t.forEach((function(t){return e.push(t)})),e},s=function(t){var e=[];return t.forEach((function(t,r){return e.push([r,t])})),e},l=Object.is?Object.is:r(64003),u=Object.getOwnPropertySymbols?Object.getOwnPropertySymbols:function(){return[]},c=Number.isNaN?Number.isNaN:r(15567);function f(t){return t.call.bind(t)}var h=f(Object.prototype.hasOwnProperty),p=f(Object.prototype.propertyIsEnumerable),d=f(Object.prototype.toString),v=r(43827).types,g=v.isAnyArrayBuffer,y=v.isArrayBufferView,m=v.isDate,x=v.isMap,b=v.isRegExp,_=v.isSet,w=v.isNativeError,T=v.isBoxedPrimitive,k=v.isNumberObject,A=v.isStringObject,M=v.isBooleanObject,S=v.isBigIntObject,E=v.isSymbolObject,L=v.isFloat32Array,C=v.isFloat64Array;function P(t){if(0===t.length||t.length>10)return!0;for(var e=0;e57)return!0}return 10===t.length&&t>=Math.pow(2,32)}function O(t){return Object.keys(t).filter(P).concat(u(t).filter(Object.prototype.propertyIsEnumerable.bind(t)))}function I(t,e){if(t===e)return 0;for(var r=t.length,n=e.length,i=0,a=Math.min(r,n);i0?o-4:o;for(r=0;r>16&255,u[c++]=e>>8&255,u[c++]=255&e;return 2===l&&(e=n[t.charCodeAt(r)]<<2|n[t.charCodeAt(r+1)]>>4,u[c++]=255&e),1===l&&(e=n[t.charCodeAt(r)]<<10|n[t.charCodeAt(r+1)]<<4|n[t.charCodeAt(r+2)]>>2,u[c++]=e>>8&255,u[c++]=255&e),u},e.fromByteArray=function(t){for(var e,n=t.length,i=n%3,a=[],o=16383,s=0,u=n-i;su?u:s+o));return 1===i?(e=t[n-1],a.push(r[e>>2]+r[e<<4&63]+"==")):2===i&&(e=(t[n-2]<<8)+t[n-1],a.push(r[e>>10]+r[e>>4&63]+r[e<<2&63]+"=")),a.join("")};for(var r=[],n=[],i="undefined"!=typeof Uint8Array?Uint8Array:Array,a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0;o<64;++o)r[o]=a[o],n[a.charCodeAt(o)]=o;function s(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function l(t,e,n){for(var i,a,o=[],s=e;s>18&63]+r[a>>12&63]+r[a>>6&63]+r[63&a]);return o.join("")}n["-".charCodeAt(0)]=62,n["_".charCodeAt(0)]=63},91358:function(t){"use strict";function e(t,e,r,n,i){for(var a=i+1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)>=0?(a=o,i=o-1):n=o+1}return a}function r(t,e,r,n,i){for(var a=i+1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)>0?(a=o,i=o-1):n=o+1}return a}function n(t,e,r,n,i){for(var a=n-1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)<0?(a=o,n=o+1):i=o-1}return a}function i(t,e,r,n,i){for(var a=n-1;n<=i;){var o=n+i>>>1,s=t[o];(void 0!==r?r(s,e):s-e)<=0?(a=o,n=o+1):i=o-1}return a}function a(t,e,r,n,i){for(;n<=i;){var a=n+i>>>1,o=t[a],s=void 0!==r?r(o,e):o-e;if(0===s)return a;s<=0?n=a+1:i=a-1}return-1}function o(t,e,r,n,i,a){return"function"==typeof r?a(t,e,r,void 0===n?0:0|n,void 0===i?t.length-1:0|i):a(t,e,void 0,void 0===r?0:0|r,void 0===n?t.length-1:0|n)}t.exports={ge:function(t,r,n,i,a){return o(t,r,n,i,a,e)},gt:function(t,e,n,i,a){return o(t,e,n,i,a,r)},lt:function(t,e,r,i,a){return o(t,e,r,i,a,n)},le:function(t,e,r,n,a){return o(t,e,r,n,a,i)},eq:function(t,e,r,n,i){return o(t,e,r,n,i,a)}}},13547:function(t,e){"use strict";function r(t){var e=32;return(t&=-t)&&e--,65535&t&&(e-=16),16711935&t&&(e-=8),252645135&t&&(e-=4),858993459&t&&(e-=2),1431655765&t&&(e-=1),e}e.INT_BITS=32,e.INT_MAX=2147483647,e.INT_MIN=-1<<31,e.sign=function(t){return(t>0)-(t<0)},e.abs=function(t){var e=t>>31;return(t^e)-e},e.min=function(t,e){return e^(t^e)&-(t65535)<<4,e|=r=((t>>>=e)>255)<<3,e|=r=((t>>>=r)>15)<<2,(e|=r=((t>>>=r)>3)<<1)|(t>>>=r)>>1},e.log10=function(t){return t>=1e9?9:t>=1e8?8:t>=1e7?7:t>=1e6?6:t>=1e5?5:t>=1e4?4:t>=1e3?3:t>=100?2:t>=10?1:0},e.popCount=function(t){return 16843009*((t=(858993459&(t-=t>>>1&1431655765))+(t>>>2&858993459))+(t>>>4)&252645135)>>>24},e.countTrailingZeros=r,e.nextPow2=function(t){return t+=0===t,--t,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,1+(t|=t>>>16)},e.prevPow2=function(t){return t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,(t|=t>>>16)-(t>>>1)},e.parity=function(t){return t^=t>>>16,t^=t>>>8,t^=t>>>4,27030>>>(t&=15)&1};var n=new Array(256);!function(t){for(var e=0;e<256;++e){var r=e,n=e,i=7;for(r>>>=1;r;r>>>=1)n<<=1,n|=1&r,--i;t[e]=n<>>8&255]<<16|n[t>>>16&255]<<8|n[t>>>24&255]},e.interleave2=function(t,e){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t&=65535)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e&=65535)|e<<8))|e<<4))|e<<2))|e<<1))<<1},e.deinterleave2=function(t,e){return(t=65535&((t=16711935&((t=252645135&((t=858993459&((t=t>>>e&1431655765)|t>>>1))|t>>>2))|t>>>4))|t>>>16))<<16>>16},e.interleave3=function(t,e,r){return t=1227133513&((t=3272356035&((t=251719695&((t=4278190335&((t&=1023)|t<<16))|t<<8))|t<<4))|t<<2),(t|=(e=1227133513&((e=3272356035&((e=251719695&((e=4278190335&((e&=1023)|e<<16))|e<<8))|e<<4))|e<<2))<<1)|(r=1227133513&((r=3272356035&((r=251719695&((r=4278190335&((r&=1023)|r<<16))|r<<8))|r<<4))|r<<2))<<2},e.deinterleave3=function(t,e){return(t=1023&((t=4278190335&((t=251719695&((t=3272356035&((t=t>>>e&1227133513)|t>>>2))|t>>>4))|t>>>8))|t>>>16))<<22>>22},e.nextCombination=function(t){var e=t|t-1;return e+1|(~e&-~e)-1>>>r(t)+1}},44781:function(t,e,r){"use strict";var n=r(53435);t.exports=function(t,e){e||(e={});var r,o,s,l,u,c,f,h,p,d,v,g=null==e.cutoff?.25:e.cutoff,y=null==e.radius?8:e.radius,m=e.channel||0;if(ArrayBuffer.isView(t)||Array.isArray(t)){if(!e.width||!e.height)throw Error("For raw data width and height should be provided by options");r=e.width,o=e.height,l=t,c=e.stride?e.stride:Math.floor(t.length/r/o)}else window.HTMLCanvasElement&&t instanceof window.HTMLCanvasElement?(f=(h=t).getContext("2d"),r=h.width,o=h.height,l=(p=f.getImageData(0,0,r,o)).data,c=4):window.CanvasRenderingContext2D&&t instanceof window.CanvasRenderingContext2D?(f=t,r=(h=t.canvas).width,o=h.height,l=(p=f.getImageData(0,0,r,o)).data,c=4):window.ImageData&&t instanceof window.ImageData&&(p=t,r=t.width,o=t.height,l=p.data,c=4);if(s=Math.max(r,o),window.Uint8ClampedArray&&l instanceof window.Uint8ClampedArray||window.Uint8Array&&l instanceof window.Uint8Array)for(u=l,l=Array(r*o),d=0,v=u.length;d-1?i(r):r}},68222:function(t,e,r){"use strict";var n=r(77575),i=r(68318),a=i("%Function.prototype.apply%"),o=i("%Function.prototype.call%"),s=i("%Reflect.apply%",!0)||n.call(o,a),l=i("%Object.getOwnPropertyDescriptor%",!0),u=i("%Object.defineProperty%",!0),c=i("%Math.max%");if(u)try{u({},"a",{value:1})}catch(t){u=null}t.exports=function(t){var e=s(n,o,arguments);return l&&u&&l(e,"length").configurable&&u(e,"length",{value:1+c(0,t.length-(arguments.length-1))}),e};var f=function(){return s(n,a,arguments)};u?u(t.exports,"apply",{value:f}):t.exports.apply=f},53435:function(t){t.exports=function(t,e,r){return er?r:t:te?e:t}},6475:function(t,e,r){"use strict";var n=r(53435);function i(t,e){null==e&&(e=!0);var r=t[0],i=t[1],a=t[2],o=t[3];return null==o&&(o=e?1:255),e&&(r*=255,i*=255,a*=255,o*=255),16777216*(r=255&n(r,0,255))+((i=255&n(i,0,255))<<16)+((a=255&n(a,0,255))<<8)+(255&n(o,0,255))}t.exports=i,t.exports.to=i,t.exports.from=function(t,e){var r=(t=+t)>>>24,n=(16711680&t)>>>16,i=(65280&t)>>>8,a=255&t;return!1===e?[r,n,i,a]:[r/255,n/255,i/255,a/255]}},76857:function(t){"use strict";t.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},25075:function(t,e,r){"use strict";var n=r(36652),i=r(53435),a=r(90660);t.exports=function(t,e){"float"!==e&&e||(e="array"),"uint"===e&&(e="uint8"),"uint_clamped"===e&&(e="uint8_clamped");var r=new(a(e))(4),o="uint8"!==e&&"uint8_clamped"!==e;return t.length&&"string"!=typeof t||((t=n(t))[0]/=255,t[1]/=255,t[2]/=255),function(t){return t instanceof Uint8Array||t instanceof Uint8ClampedArray||!!(Array.isArray(t)&&(t[0]>1||0===t[0])&&(t[1]>1||0===t[1])&&(t[2]>1||0===t[2])&&(!t[3]||t[3]>1))}(t)?(r[0]=t[0],r[1]=t[1],r[2]=t[2],r[3]=null!=t[3]?t[3]:255,o&&(r[0]/=255,r[1]/=255,r[2]/=255,r[3]/=255),r):(o?(r[0]=t[0],r[1]=t[1],r[2]=t[2],r[3]=null!=t[3]?t[3]:1):(r[0]=i(Math.floor(255*t[0]),0,255),r[1]=i(Math.floor(255*t[1]),0,255),r[2]=i(Math.floor(255*t[2]),0,255),r[3]=null==t[3]?255:i(Math.floor(255*t[3]),0,255)),r)}},90736:function(t,e,r){"use strict";var n=r(76857),i=r(10973),a=r(46775);t.exports=function(t){var e,s,l=[],u=1;if("string"==typeof t)if(n[t])l=n[t].slice(),s="rgb";else if("transparent"===t)u=0,s="rgb",l=[0,0,0];else if(/^#[A-Fa-f0-9]+$/.test(t)){var c=t.slice(1);u=1,(p=c.length)<=4?(l=[parseInt(c[0]+c[0],16),parseInt(c[1]+c[1],16),parseInt(c[2]+c[2],16)],4===p&&(u=parseInt(c[3]+c[3],16)/255)):(l=[parseInt(c[0]+c[1],16),parseInt(c[2]+c[3],16),parseInt(c[4]+c[5],16)],8===p&&(u=parseInt(c[6]+c[7],16)/255)),l[0]||(l[0]=0),l[1]||(l[1]=0),l[2]||(l[2]=0),s="rgb"}else if(e=/^((?:rgb|hs[lvb]|hwb|cmyk?|xy[zy]|gray|lab|lchu?v?|[ly]uv|lms)a?)\s*\(([^\)]*)\)/.exec(t)){var f=e[1],h="rgb"===f;s=c=f.replace(/a$/,"");var p="cmyk"===c?4:"gray"===c?1:3;l=e[2].trim().split(/\s*,\s*/).map((function(t,e){if(/%$/.test(t))return e===p?parseFloat(t)/100:"rgb"===c?255*parseFloat(t)/100:parseFloat(t);if("h"===c[e]){if(/deg$/.test(t))return parseFloat(t);if(void 0!==o[t])return o[t]}return parseFloat(t)})),f===c&&l.push(1),u=h||void 0===l[p]?1:l[p],l=l.slice(0,p)}else t.length>10&&/[0-9](?:\s|\/)/.test(t)&&(l=t.match(/([0-9]+)/g).map((function(t){return parseFloat(t)})),s=t.match(/([a-z])/gi).join("").toLowerCase());else if(isNaN(t))if(i(t)){var d=a(t.r,t.red,t.R,null);null!==d?(s="rgb",l=[d,a(t.g,t.green,t.G),a(t.b,t.blue,t.B)]):(s="hsl",l=[a(t.h,t.hue,t.H),a(t.s,t.saturation,t.S),a(t.l,t.lightness,t.L,t.b,t.brightness)]),u=a(t.a,t.alpha,t.opacity,1),null!=t.opacity&&(u/=100)}else(Array.isArray(t)||r.g.ArrayBuffer&&ArrayBuffer.isView&&ArrayBuffer.isView(t))&&(l=[t[0],t[1],t[2]],s="rgb",u=4===t.length?t[3]:1);else s="rgb",l=[t>>>16,(65280&t)>>>8,255&t];return{space:s,values:l,alpha:u}};var o={red:0,orange:60,yellow:120,green:180,blue:240,purple:300}},36652:function(t,e,r){"use strict";var n=r(90736),i=r(80009),a=r(53435);t.exports=function(t){var e,r=n(t);return r.space?((e=Array(3))[0]=a(r.values[0],0,255),e[1]=a(r.values[1],0,255),e[2]=a(r.values[2],0,255),"h"===r.space[0]&&(e=i.rgb(e)),e.push(a(r.alpha,0,1)),e):[]}},80009:function(t,e,r){"use strict";var n=r(6866);t.exports={name:"hsl",min:[0,0,0],max:[360,100,100],channel:["hue","saturation","lightness"],alias:["HSL"],rgb:function(t){var e,r,n,i,a,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0===s)return[a=255*l,a,a];e=2*l-(r=l<.5?l*(1+s):l+s-l*s),i=[0,0,0];for(var u=0;u<3;u++)(n=o+1/3*-(u-1))<0?n++:n>1&&n--,a=6*n<1?e+6*(r-e)*n:2*n<1?r:3*n<2?e+(r-e)*(2/3-n)*6:e,i[u]=255*a;return i}},n.hsl=function(t){var e,r,n=t[0]/255,i=t[1]/255,a=t[2]/255,o=Math.min(n,i,a),s=Math.max(n,i,a),l=s-o;return s===o?e=0:n===s?e=(i-a)/l:i===s?e=2+(a-n)/l:a===s&&(e=4+(n-i)/l),(e=Math.min(60*e,360))<0&&(e+=360),r=(o+s)/2,[e,100*(s===o?0:r<=.5?l/(s+o):l/(2-s-o)),100*r]}},6866:function(t){"use strict";t.exports={name:"rgb",min:[0,0,0],max:[255,255,255],channel:["red","green","blue"],alias:["RGB"]}},24138:function(t){t.exports={AFG:"afghan",ALA:"\\b\\wland",ALB:"albania",DZA:"algeria",ASM:"^(?=.*americ).*samoa",AND:"andorra",AGO:"angola",AIA:"anguill?a",ATA:"antarctica",ATG:"antigua",ARG:"argentin",ARM:"armenia",ABW:"^(?!.*bonaire).*\\baruba",AUS:"australia",AUT:"^(?!.*hungary).*austria|\\baustri.*\\bemp",AZE:"azerbaijan",BHS:"bahamas",BHR:"bahrain",BGD:"bangladesh|^(?=.*east).*paki?stan",BRB:"barbados",BLR:"belarus|byelo",BEL:"^(?!.*luxem).*belgium",BLZ:"belize|^(?=.*british).*honduras",BEN:"benin|dahome",BMU:"bermuda",BTN:"bhutan",BOL:"bolivia",BES:"^(?=.*bonaire).*eustatius|^(?=.*carib).*netherlands|\\bbes.?islands",BIH:"herzegovina|bosnia",BWA:"botswana|bechuana",BVT:"bouvet",BRA:"brazil",IOT:"british.?indian.?ocean",BRN:"brunei",BGR:"bulgaria",BFA:"burkina|\\bfaso|upper.?volta",BDI:"burundi",CPV:"verde",KHM:"cambodia|kampuchea|khmer",CMR:"cameroon",CAN:"canada",CYM:"cayman",CAF:"\\bcentral.african.republic",TCD:"\\bchad",CHL:"\\bchile",CHN:"^(?!.*\\bmac)(?!.*\\bhong)(?!.*\\btai)(?!.*\\brep).*china|^(?=.*peo)(?=.*rep).*china",CXR:"christmas",CCK:"\\bcocos|keeling",COL:"colombia",COM:"comoro",COG:"^(?!.*\\bdem)(?!.*\\bd[\\.]?r)(?!.*kinshasa)(?!.*zaire)(?!.*belg)(?!.*l.opoldville)(?!.*free).*\\bcongo",COK:"\\bcook",CRI:"costa.?rica",CIV:"ivoire|ivory",HRV:"croatia",CUB:"\\bcuba",CUW:"^(?!.*bonaire).*\\bcura(c|ç)ao",CYP:"cyprus",CSK:"czechoslovakia",CZE:"^(?=.*rep).*czech|czechia|bohemia",COD:"\\bdem.*congo|congo.*\\bdem|congo.*\\bd[\\.]?r|\\bd[\\.]?r.*congo|belgian.?congo|congo.?free.?state|kinshasa|zaire|l.opoldville|drc|droc|rdc",DNK:"denmark",DJI:"djibouti",DMA:"dominica(?!n)",DOM:"dominican.rep",ECU:"ecuador",EGY:"egypt",SLV:"el.?salvador",GNQ:"guine.*eq|eq.*guine|^(?=.*span).*guinea",ERI:"eritrea",EST:"estonia",ETH:"ethiopia|abyssinia",FLK:"falkland|malvinas",FRO:"faroe|faeroe",FJI:"fiji",FIN:"finland",FRA:"^(?!.*\\bdep)(?!.*martinique).*france|french.?republic|\\bgaul",GUF:"^(?=.*french).*guiana",PYF:"french.?polynesia|tahiti",ATF:"french.?southern",GAB:"gabon",GMB:"gambia",GEO:"^(?!.*south).*georgia",DDR:"german.?democratic.?republic|democratic.?republic.*germany|east.germany",DEU:"^(?!.*east).*germany|^(?=.*\\bfed.*\\brep).*german",GHA:"ghana|gold.?coast",GIB:"gibraltar",GRC:"greece|hellenic|hellas",GRL:"greenland",GRD:"grenada",GLP:"guadeloupe",GUM:"\\bguam",GTM:"guatemala",GGY:"guernsey",GIN:"^(?!.*eq)(?!.*span)(?!.*bissau)(?!.*portu)(?!.*new).*guinea",GNB:"bissau|^(?=.*portu).*guinea",GUY:"guyana|british.?guiana",HTI:"haiti",HMD:"heard.*mcdonald",VAT:"holy.?see|vatican|papal.?st",HND:"^(?!.*brit).*honduras",HKG:"hong.?kong",HUN:"^(?!.*austr).*hungary",ISL:"iceland",IND:"india(?!.*ocea)",IDN:"indonesia",IRN:"\\biran|persia",IRQ:"\\biraq|mesopotamia",IRL:"(^ireland)|(^republic.*ireland)",IMN:"^(?=.*isle).*\\bman",ISR:"israel",ITA:"italy",JAM:"jamaica",JPN:"japan",JEY:"jersey",JOR:"jordan",KAZ:"kazak",KEN:"kenya|british.?east.?africa|east.?africa.?prot",KIR:"kiribati",PRK:"^(?=.*democrat|people|north|d.*p.*.r).*\\bkorea|dprk|korea.*(d.*p.*r)",KWT:"kuwait",KGZ:"kyrgyz|kirghiz",LAO:"\\blaos?\\b",LVA:"latvia",LBN:"lebanon",LSO:"lesotho|basuto",LBR:"liberia",LBY:"libya",LIE:"liechtenstein",LTU:"lithuania",LUX:"^(?!.*belg).*luxem",MAC:"maca(o|u)",MDG:"madagascar|malagasy",MWI:"malawi|nyasa",MYS:"malaysia",MDV:"maldive",MLI:"\\bmali\\b",MLT:"\\bmalta",MHL:"marshall",MTQ:"martinique",MRT:"mauritania",MUS:"mauritius",MYT:"\\bmayotte",MEX:"\\bmexic",FSM:"fed.*micronesia|micronesia.*fed",MCO:"monaco",MNG:"mongolia",MNE:"^(?!.*serbia).*montenegro",MSR:"montserrat",MAR:"morocco|\\bmaroc",MOZ:"mozambique",MMR:"myanmar|burma",NAM:"namibia",NRU:"nauru",NPL:"nepal",NLD:"^(?!.*\\bant)(?!.*\\bcarib).*netherlands",ANT:"^(?=.*\\bant).*(nether|dutch)",NCL:"new.?caledonia",NZL:"new.?zealand",NIC:"nicaragua",NER:"\\bniger(?!ia)",NGA:"nigeria",NIU:"niue",NFK:"norfolk",MNP:"mariana",NOR:"norway",OMN:"\\boman|trucial",PAK:"^(?!.*east).*paki?stan",PLW:"palau",PSE:"palestin|\\bgaza|west.?bank",PAN:"panama",PNG:"papua|new.?guinea",PRY:"paraguay",PER:"peru",PHL:"philippines",PCN:"pitcairn",POL:"poland",PRT:"portugal",PRI:"puerto.?rico",QAT:"qatar",KOR:"^(?!.*d.*p.*r)(?!.*democrat)(?!.*people)(?!.*north).*\\bkorea(?!.*d.*p.*r)",MDA:"moldov|b(a|e)ssarabia",REU:"r(e|é)union",ROU:"r(o|u|ou)mania",RUS:"\\brussia|soviet.?union|u\\.?s\\.?s\\.?r|socialist.?republics",RWA:"rwanda",BLM:"barth(e|é)lemy",SHN:"helena",KNA:"kitts|\\bnevis",LCA:"\\blucia",MAF:"^(?=.*collectivity).*martin|^(?=.*france).*martin(?!ique)|^(?=.*french).*martin(?!ique)",SPM:"miquelon",VCT:"vincent",WSM:"^(?!.*amer).*samoa",SMR:"san.?marino",STP:"\\bs(a|ã)o.?tom(e|é)",SAU:"\\bsa\\w*.?arabia",SEN:"senegal",SRB:"^(?!.*monte).*serbia",SYC:"seychell",SLE:"sierra",SGP:"singapore",SXM:"^(?!.*martin)(?!.*saba).*maarten",SVK:"^(?!.*cze).*slovak",SVN:"slovenia",SLB:"solomon",SOM:"somali",ZAF:"south.africa|s\\\\..?africa",SGS:"south.?georgia|sandwich",SSD:"\\bs\\w*.?sudan",ESP:"spain",LKA:"sri.?lanka|ceylon",SDN:"^(?!.*\\bs(?!u)).*sudan",SUR:"surinam|dutch.?guiana",SJM:"svalbard",SWZ:"swaziland",SWE:"sweden",CHE:"switz|swiss",SYR:"syria",TWN:"taiwan|taipei|formosa|^(?!.*peo)(?=.*rep).*china",TJK:"tajik",THA:"thailand|\\bsiam",MKD:"macedonia|fyrom",TLS:"^(?=.*leste).*timor|^(?=.*east).*timor",TGO:"togo",TKL:"tokelau",TON:"tonga",TTO:"trinidad|tobago",TUN:"tunisia",TUR:"turkey",TKM:"turkmen",TCA:"turks",TUV:"tuvalu",UGA:"uganda",UKR:"ukrain",ARE:"emirates|^u\\.?a\\.?e\\.?$|united.?arab.?em",GBR:"united.?kingdom|britain|^u\\.?k\\.?$",TZA:"tanzania",USA:"united.?states\\b(?!.*islands)|\\bu\\.?s\\.?a\\.?\\b|^\\s*u\\.?s\\.?\\b(?!.*islands)",UMI:"minor.?outlying.?is",URY:"uruguay",UZB:"uzbek",VUT:"vanuatu|new.?hebrides",VEN:"venezuela",VNM:"^(?!.*republic).*viet.?nam|^(?=.*socialist).*viet.?nam",VGB:"^(?=.*\\bu\\.?\\s?k).*virgin|^(?=.*brit).*virgin|^(?=.*kingdom).*virgin",VIR:"^(?=.*\\bu\\.?\\s?s).*virgin|^(?=.*states).*virgin",WLF:"futuna|wallis",ESH:"western.sahara",YEM:"^(?!.*arab)(?!.*north)(?!.*sana)(?!.*peo)(?!.*dem)(?!.*south)(?!.*aden)(?!.*\\bp\\.?d\\.?r).*yemen",YMD:"^(?=.*peo).*yemen|^(?!.*rep)(?=.*dem).*yemen|^(?=.*south).*yemen|^(?=.*aden).*yemen|^(?=.*\\bp\\.?d\\.?r).*yemen",YUG:"yugoslavia",ZMB:"zambia|northern.?rhodesia",EAZ:"zanzibar",ZWE:"zimbabwe|^(?!.*northern).*rhodesia"}},72791:function(t,e,r){"use strict";t.exports={parse:r(41004),stringify:r(53313)}},63625:function(t,e,r){"use strict";var n=r(40402);t.exports={isSize:function(t){return/^[\d\.]/.test(t)||-1!==t.indexOf("/")||-1!==n.indexOf(t)}}},41004:function(t,e,r){"use strict";var n=r(90448),i=r(38732),a=r(41901),o=r(15659),s=r(96209),l=r(83794),u=r(99011),c=r(63625).isSize;t.exports=h;var f=h.cache={};function h(t){if("string"!=typeof t)throw new Error("Font argument must be a string.");if(f[t])return f[t];if(""===t)throw new Error("Cannot parse an empty string.");if(-1!==a.indexOf(t))return f[t]={system:t};for(var e,r={style:"normal",variant:"normal",weight:"normal",stretch:"normal",lineHeight:"normal",size:"1rem",family:["serif"]},h=u(t,/\s+/);e=h.shift();){if(-1!==i.indexOf(e))return["style","variant","weight","stretch"].forEach((function(t){r[t]=e})),f[t]=r;if(-1===s.indexOf(e))if("normal"!==e&&"small-caps"!==e)if(-1===l.indexOf(e)){if(-1===o.indexOf(e)){if(c(e)){var d=u(e,"/");if(r.size=d[0],null!=d[1]?r.lineHeight=p(d[1]):"/"===h[0]&&(h.shift(),r.lineHeight=p(h.shift())),!h.length)throw new Error("Missing required font-family.");return r.family=u(h.join(" "),/\s*,\s*/).map(n),f[t]=r}throw new Error("Unknown or unsupported font token: "+e)}r.weight=e}else r.stretch=e;else r.variant=e;else r.style=e}throw new Error("Missing required font-size.")}function p(t){var e=parseFloat(t);return e.toString()===t?e:t}},53313:function(t,e,r){"use strict";var n=r(71299),i=r(63625).isSize,a=d(r(38732)),o=d(r(41901)),s=d(r(15659)),l=d(r(96209)),u=d(r(83794)),c={normal:1,"small-caps":1},f={serif:1,"sans-serif":1,monospace:1,cursive:1,fantasy:1,"system-ui":1},h="serif";function p(t,e){if(t&&!e[t]&&!a[t])throw Error("Unknown keyword `"+t+"`");return t}function d(t){for(var e={},r=0;re?1:t>=e?0:NaN}r.d(e,{j2:function(){return n},Fp:function(){return s},J6:function(){return u},TS:function(){return c},VV:function(){return f},w6:function(){return h},Sm:function(){return p}}),1===(i=n).length&&(a=i,i=function(t,e){return n(a(t),e)});var i,a,o=Array.prototype;function s(t,e){var r,n,i=t.length,a=-1;if(null==e){for(;++a=r)for(n=r;++an&&(n=r)}else for(;++a=r)for(n=r;++an&&(n=r);return n}function l(t){return null===t?NaN:+t}function u(t,e){var r,n=t.length,i=n,a=-1,o=0;if(null==e)for(;++a=0;)for(e=(n=t[i]).length;--e>=0;)r[--o]=n[e];return r}function f(t,e){var r,n,i=t.length,a=-1;if(null==e){for(;++a=r)for(n=r;++ar&&(n=r)}else for(;++a=r)for(n=r;++ar&&(n=r);return n}function h(t,e,r){t=+t,e=+e,r=(i=arguments.length)<2?(e=t,t=0,1):i<3?1:+r;for(var n=-1,i=0|Math.max(0,Math.ceil((e-t)/r)),a=new Array(i);++n=n.length)return null!=t&&r.sort(t),null!=e?e(r):r;for(var u,c,f,h=-1,p=r.length,d=n[i++],v=o(),g=s();++hn.length)return t;var a,o=i[r-1];return null!=e&&r>=n.length?a=t.entries():(a=[],t.each((function(t,e){a.push({key:e,values:s(t,r)})}))),null!=o?a.sort((function(t,e){return o(t.key,e.key)})):a}return r={object:function(t){return a(t,0,l,u)},map:function(t){return a(t,0,c,f)},entries:function(t){return s(a(t,0,c,f),0)},key:function(t){return n.push(t),r},sortKeys:function(t){return i[n.length-1]=t,r},sortValues:function(e){return t=e,r},rollup:function(t){return e=t,r}}}function l(){return{}}function u(t,e,r){t[e]=r}function c(){return o()}function f(t,e,r){t.set(e,r)}function h(){}var p=o.prototype;h.prototype=function(t,e){var r=new h;if(t instanceof h)t.each((function(t){r.add(t)}));else if(t){var n=-1,i=t.length;if(null==e)for(;++n=(a=(v+y)/2))?v=a:y=a,(c=r>=(o=(g+m)/2))?g=o:m=o,i=p,!(p=p[f=c<<1|u]))return i[f]=d,t;if(s=+t._x.call(null,p.data),l=+t._y.call(null,p.data),e===s&&r===l)return d.next=p,i?i[f]=d:t._root=d,t;do{i=i?i[f]=new Array(4):t._root=new Array(4),(u=e>=(a=(v+y)/2))?v=a:y=a,(c=r>=(o=(g+m)/2))?g=o:m=o}while((f=c<<1|u)==(h=(l>=o)<<1|s>=a));return i[h]=p,i[f]=d,t}function s(t,e,r,n,i){this.node=t,this.x0=e,this.y0=r,this.x1=n,this.y1=i}function l(t){return t[0]}function u(t){return t[1]}function c(t,e,r){var n=new f(null==e?l:e,null==r?u:r,NaN,NaN,NaN,NaN);return null==t?n:n.addAll(t)}function f(t,e,r,n,i,a){this._x=t,this._y=e,this._x0=r,this._y0=n,this._x1=i,this._y1=a,this._root=void 0}function h(t){for(var e={data:t.data},r=e;t=t.next;)r=r.next={data:t.data};return e}r.r(e),r.d(e,{forceCenter:function(){return n},forceCollide:function(){return g},forceLink:function(){return b},forceManyBody:function(){return J},forceRadial:function(){return K},forceSimulation:function(){return X},forceX:function(){return $},forceY:function(){return Q}});var p=c.prototype=f.prototype;function d(t){return t.x+t.vx}function v(t){return t.y+t.vy}function g(t){var e,r,n=1,o=1;function s(){for(var t,i,s,u,f,h,p,g=e.length,y=0;yu+d||if+d||os.index){var v=u-l.x-l.vx,g=f-l.y-l.vy,y=v*v+g*g;yt.r&&(t.r=t[e].r)}function u(){if(e){var n,i,a=e.length;for(r=new Array(a),n=0;nf&&(f=n),ih&&(h=i));if(u>f||c>h)return this;for(this.cover(u,c).cover(f,h),r=0;rt||t>=i||n>e||e>=a;)switch(s=(ep||(a=u.y0)>d||(o=u.x1)=m)<<1|t>=y)&&(u=v[v.length-1],v[v.length-1]=v[v.length-1-c],v[v.length-1-c]=u)}else{var x=t-+this._x.call(null,g.data),b=e-+this._y.call(null,g.data),_=x*x+b*b;if(_=(s=(d+g)/2))?d=s:g=s,(c=o>=(l=(v+y)/2))?v=l:y=l,e=p,!(p=p[f=c<<1|u]))return this;if(!p.length)break;(e[f+1&3]||e[f+2&3]||e[f+3&3])&&(r=e,h=f)}for(;p.data!==t;)if(n=p,!(p=p.next))return this;return(i=p.next)&&delete p.next,n?(i?n.next=i:delete n.next,this):e?(i?e[f]=i:delete e[f],(p=e[0]||e[1]||e[2]||e[3])&&p===(e[3]||e[2]||e[1]||e[0])&&!p.length&&(r?r[h]=p:this._root=p),this):(this._root=i,this)},p.removeAll=function(t){for(var e=0,r=t.length;e=0&&(e=t.slice(r+1),t=t.slice(0,r)),t&&!n.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}}))),o=-1,s=a.length;if(!(arguments.length<2)){if(null!=e&&"function"!=typeof e)throw new Error("invalid callback: "+e);for(;++o0)for(var r,n,i=new Array(r),a=0;a=0&&e._call.call(null,t),e=e._next;--L}()}finally{L=0,function(){for(var t,e,r=M,n=1/0;r;)r._call?(n>r._time&&(n=r._time),t=r,r=r._next):(e=r._next,r._next=null,r=t?t._next=e:M=e);S=t,q(n)}(),D=0}}function H(){var t=R.now(),e=t-I;e>O&&(z-=e,I=t)}function q(t){L||(C&&(C=clearTimeout(C)),t-D>24?(t<1/0&&(C=setTimeout(V,t-R.now()-z)),P&&(P=clearInterval(P))):(P||(I=R.now(),P=setInterval(H,O)),L=1,F(V)))}function G(t){return t.x}function Z(t){return t.y}j.prototype=U.prototype={constructor:j,restart:function(t,e,r){if("function"!=typeof t)throw new TypeError("callback is not a function");r=(null==r?B():+r)+(null==e?0:+e),this._next||S===this||(S?S._next=this:M=this,S=this),this._call=t,this._time=r,q()},stop:function(){this._call&&(this._call=null,this._time=1/0,q())}};var Y=10,W=Math.PI*(3-Math.sqrt(5));function X(t){var e,r=1,n=.001,i=1-Math.pow(n,1/300),a=0,o=.6,s=(0,y.UI)(),l=U(c),u=E("tick","end");function c(){f(),u.call("tick",e),r1?(null==r?s.remove(t):s.set(t,p(r)),e):s.get(t)},find:function(e,r,n){var i,a,o,s,l,u=0,c=t.length;for(null==n?n=1/0:n*=n,u=0;u1?(u.on(t,r),e):u.on(t)}}}function J(){var t,e,r,n,o=i(-30),s=1,l=1/0,u=.81;function f(n){var i,a=t.length,o=c(t,G,Z).visitAfter(p);for(r=n,i=0;i=l)){(t.data!==e||t.next)&&(0===f&&(d+=(f=a())*f),0===h&&(d+=(h=a())*h),d1?n[0]+n.slice(2):n,+t.slice(r+1)]}r.d(e,{WU:function(){return h},FF:function(){return v}});var i,a=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function o(t){if(!(e=a.exec(t)))throw new Error("invalid format: "+t);var e;return new s({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function s(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function l(t,e){var r=n(t,e);if(!r)return t+"";var i=r[0],a=r[1];return a<0?"0."+new Array(-a).join("0")+i:i.length>a+1?i.slice(0,a+1)+"."+i.slice(a+1):i+new Array(a-i.length+2).join("0")}o.prototype=s.prototype,s.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};var u={"%":function(t,e){return(100*t).toFixed(e)},b:function(t){return Math.round(t).toString(2)},c:function(t){return t+""},d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:function(t,e){return t.toExponential(e)},f:function(t,e){return t.toFixed(e)},g:function(t,e){return t.toPrecision(e)},o:function(t){return Math.round(t).toString(8)},p:function(t,e){return l(100*t,e)},r:l,s:function(t,e){var r=n(t,e);if(!r)return t+"";var a=r[0],o=r[1],s=o-(i=3*Math.max(-8,Math.min(8,Math.floor(o/3))))+1,l=a.length;return s===l?a:s>l?a+new Array(s-l+1).join("0"):s>0?a.slice(0,s)+"."+a.slice(s):"0."+new Array(1-s).join("0")+n(t,Math.max(0,e+s-1))[0]},X:function(t){return Math.round(t).toString(16).toUpperCase()},x:function(t){return Math.round(t).toString(16)}};function c(t){return t}var f,h,p=Array.prototype.map,d=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function v(t){var e,r,a=void 0===t.grouping||void 0===t.thousands?c:(e=p.call(t.grouping,Number),r=t.thousands+"",function(t,n){for(var i=t.length,a=[],o=0,s=e[0],l=0;i>0&&s>0&&(l+s+1>n&&(s=Math.max(1,n-l)),a.push(t.substring(i-=s,i+s)),!((l+=s+1)>n));)s=e[o=(o+1)%e.length];return a.reverse().join(r)}),s=void 0===t.currency?"":t.currency[0]+"",l=void 0===t.currency?"":t.currency[1]+"",f=void 0===t.decimal?".":t.decimal+"",h=void 0===t.numerals?c:function(t){return function(e){return e.replace(/[0-9]/g,(function(e){return t[+e]}))}}(p.call(t.numerals,String)),v=void 0===t.percent?"%":t.percent+"",g=void 0===t.minus?"-":t.minus+"",y=void 0===t.nan?"NaN":t.nan+"";function m(t){var e=(t=o(t)).fill,r=t.align,n=t.sign,c=t.symbol,p=t.zero,m=t.width,x=t.comma,b=t.precision,_=t.trim,w=t.type;"n"===w?(x=!0,w="g"):u[w]||(void 0===b&&(b=12),_=!0,w="g"),(p||"0"===e&&"="===r)&&(p=!0,e="0",r="=");var T="$"===c?s:"#"===c&&/[boxX]/.test(w)?"0"+w.toLowerCase():"",k="$"===c?l:/[%p]/.test(w)?v:"",A=u[w],M=/[defgprs%]/.test(w);function S(t){var o,s,l,u=T,c=k;if("c"===w)c=A(t)+c,t="";else{var v=(t=+t)<0||1/t<0;if(t=isNaN(t)?y:A(Math.abs(t),b),_&&(t=function(t){t:for(var e,r=t.length,n=1,i=-1;n0&&(i=0)}return i>0?t.slice(0,i)+t.slice(e+1):t}(t)),v&&0==+t&&"+"!==n&&(v=!1),u=(v?"("===n?n:g:"-"===n||"("===n?"":n)+u,c=("s"===w?d[8+i/3]:"")+c+(v&&"("===n?")":""),M)for(o=-1,s=t.length;++o(l=t.charCodeAt(o))||l>57){c=(46===l?f+t.slice(o+1):t.slice(o))+c,t=t.slice(0,o);break}}x&&!p&&(t=a(t,1/0));var S=u.length+t.length+c.length,E=S>1)+u+t+c+E.slice(S);break;default:t=E+u+t+c}return h(t)}return b=void 0===b?6:/[gprs]/.test(w)?Math.max(1,Math.min(21,b)):Math.max(0,Math.min(20,b)),S.toString=function(){return t+""},S}return{format:m,formatPrefix:function(t,e){var r,i=m(((t=o(t)).type="f",t)),a=3*Math.max(-8,Math.min(8,Math.floor((r=e,((r=n(Math.abs(r)))?r[1]:NaN)/3)))),s=Math.pow(10,-a),l=d[8+a/3];return function(t){return i(s*t)+l}}}}f=v({decimal:".",thousands:",",grouping:[3],currency:["$",""],minus:"-"}),h=f.format,f.formatPrefix},65704:function(t,e,r){"use strict";r.r(e),r.d(e,{geoAiry:function(){return z},geoAiryRaw:function(){return D},geoAitoff:function(){return F},geoAitoffRaw:function(){return R},geoArmadillo:function(){return N},geoArmadilloRaw:function(){return B},geoAugust:function(){return U},geoAugustRaw:function(){return j},geoBaker:function(){return G},geoBakerRaw:function(){return q},geoBerghaus:function(){return W},geoBerghausRaw:function(){return Y},geoBertin1953:function(){return rt},geoBertin1953Raw:function(){return et},geoBoggs:function(){return ct},geoBoggsRaw:function(){return ut},geoBonne:function(){return vt},geoBonneRaw:function(){return dt},geoBottomley:function(){return yt},geoBottomleyRaw:function(){return gt},geoBromley:function(){return xt},geoBromleyRaw:function(){return mt},geoChamberlin:function(){return Et},geoChamberlinAfrica:function(){return St},geoChamberlinRaw:function(){return At},geoCollignon:function(){return Ct},geoCollignonRaw:function(){return Lt},geoCraig:function(){return Ot},geoCraigRaw:function(){return Pt},geoCraster:function(){return zt},geoCrasterRaw:function(){return Dt},geoCylindricalEqualArea:function(){return Ft},geoCylindricalEqualAreaRaw:function(){return Rt},geoCylindricalStereographic:function(){return Nt},geoCylindricalStereographicRaw:function(){return Bt},geoEckert1:function(){return Ut},geoEckert1Raw:function(){return jt},geoEckert2:function(){return Ht},geoEckert2Raw:function(){return Vt},geoEckert3:function(){return Gt},geoEckert3Raw:function(){return qt},geoEckert4:function(){return Yt},geoEckert4Raw:function(){return Zt},geoEckert5:function(){return Xt},geoEckert5Raw:function(){return Wt},geoEckert6:function(){return Kt},geoEckert6Raw:function(){return Jt},geoEisenlohr:function(){return te},geoEisenlohrRaw:function(){return Qt},geoFahey:function(){return ne},geoFaheyRaw:function(){return re},geoFoucaut:function(){return ae},geoFoucautRaw:function(){return ie},geoFoucautSinusoidal:function(){return se},geoFoucautSinusoidalRaw:function(){return oe},geoGilbert:function(){return he},geoGingery:function(){return ge},geoGingeryRaw:function(){return pe},geoGinzburg4:function(){return xe},geoGinzburg4Raw:function(){return me},geoGinzburg5:function(){return _e},geoGinzburg5Raw:function(){return be},geoGinzburg6:function(){return Te},geoGinzburg6Raw:function(){return we},geoGinzburg8:function(){return Ae},geoGinzburg8Raw:function(){return ke},geoGinzburg9:function(){return Se},geoGinzburg9Raw:function(){return Me},geoGringorten:function(){return Ce},geoGringortenQuincuncial:function(){return ii},geoGringortenRaw:function(){return Le},geoGuyou:function(){return De},geoGuyouRaw:function(){return Ie},geoHammer:function(){return $},geoHammerRaw:function(){return J},geoHammerRetroazimuthal:function(){return Be},geoHammerRetroazimuthalRaw:function(){return Re},geoHealpix:function(){return Ye},geoHealpixRaw:function(){return He},geoHill:function(){return Xe},geoHillRaw:function(){return We},geoHomolosine:function(){return er},geoHomolosineRaw:function(){return tr},geoHufnagel:function(){return nr},geoHufnagelRaw:function(){return rr},geoHyperelliptical:function(){return sr},geoHyperellipticalRaw:function(){return or},geoInterrupt:function(){return cr},geoInterruptedBoggs:function(){return hr},geoInterruptedHomolosine:function(){return dr},geoInterruptedMollweide:function(){return gr},geoInterruptedMollweideHemispheres:function(){return mr},geoInterruptedQuarticAuthalic:function(){return fn},geoInterruptedSinuMollweide:function(){return br},geoInterruptedSinusoidal:function(){return wr},geoKavrayskiy7:function(){return kr},geoKavrayskiy7Raw:function(){return Tr},geoLagrange:function(){return Mr},geoLagrangeRaw:function(){return Ar},geoLarrivee:function(){return Lr},geoLarriveeRaw:function(){return Er},geoLaskowski:function(){return Pr},geoLaskowskiRaw:function(){return Cr},geoLittrow:function(){return Ir},geoLittrowRaw:function(){return Or},geoLoximuthal:function(){return zr},geoLoximuthalRaw:function(){return Dr},geoMiller:function(){return Fr},geoMillerRaw:function(){return Rr},geoModifiedStereographic:function(){return Xr},geoModifiedStereographicAlaska:function(){return qr},geoModifiedStereographicGs48:function(){return Gr},geoModifiedStereographicGs50:function(){return Zr},geoModifiedStereographicLee:function(){return Wr},geoModifiedStereographicMiller:function(){return Yr},geoModifiedStereographicRaw:function(){return Br},geoMollweide:function(){return ot},geoMollweideRaw:function(){return at},geoMtFlatPolarParabolic:function(){return Qr},geoMtFlatPolarParabolicRaw:function(){return $r},geoMtFlatPolarQuartic:function(){return en},geoMtFlatPolarQuarticRaw:function(){return tn},geoMtFlatPolarSinusoidal:function(){return nn},geoMtFlatPolarSinusoidalRaw:function(){return rn},geoNaturalEarth:function(){return an.Z},geoNaturalEarth2:function(){return sn},geoNaturalEarth2Raw:function(){return on},geoNaturalEarthRaw:function(){return an.K},geoNellHammer:function(){return un},geoNellHammerRaw:function(){return ln},geoNicolosi:function(){return pn},geoNicolosiRaw:function(){return hn},geoPatterson:function(){return kn},geoPattersonRaw:function(){return Tn},geoPeirceQuincuncial:function(){return ai},geoPierceQuincuncial:function(){return ai},geoPolyconic:function(){return Mn},geoPolyconicRaw:function(){return An},geoPolyhedral:function(){return On},geoPolyhedralButterfly:function(){return Nn},geoPolyhedralCollignon:function(){return Vn},geoPolyhedralWaterman:function(){return Hn},geoProject:function(){return Wn},geoQuantize:function(){return oi},geoQuincuncial:function(){return ni},geoRectangularPolyconic:function(){return li},geoRectangularPolyconicRaw:function(){return si},geoRobinson:function(){return fi},geoRobinsonRaw:function(){return ci},geoSatellite:function(){return pi},geoSatelliteRaw:function(){return hi},geoSinuMollweide:function(){return Qe},geoSinuMollweideRaw:function(){return $e},geoSinusoidal:function(){return pt},geoSinusoidalRaw:function(){return ht},geoStitch:function(){return Oi},geoTimes:function(){return Di},geoTimesRaw:function(){return Ii},geoTwoPointAzimuthal:function(){return Bi},geoTwoPointAzimuthalRaw:function(){return Ri},geoTwoPointAzimuthalUsa:function(){return Fi},geoTwoPointEquidistant:function(){return Ui},geoTwoPointEquidistantRaw:function(){return Ni},geoTwoPointEquidistantUsa:function(){return ji},geoVanDerGrinten:function(){return Hi},geoVanDerGrinten2:function(){return Gi},geoVanDerGrinten2Raw:function(){return qi},geoVanDerGrinten3:function(){return Yi},geoVanDerGrinten3Raw:function(){return Zi},geoVanDerGrinten4:function(){return Xi},geoVanDerGrinten4Raw:function(){return Wi},geoVanDerGrintenRaw:function(){return Vi},geoWagner:function(){return Ki},geoWagner4:function(){return ra},geoWagner4Raw:function(){return ea},geoWagner6:function(){return ia},geoWagner6Raw:function(){return na},geoWagner7:function(){return $i},geoWagnerRaw:function(){return Ji},geoWiechel:function(){return oa},geoWiechelRaw:function(){return aa},geoWinkel3:function(){return la},geoWinkel3Raw:function(){return sa}});var n=r(15002),i=Math.abs,a=Math.atan,o=Math.atan2,s=(Math.ceil,Math.cos),l=Math.exp,u=Math.floor,c=Math.log,f=Math.max,h=Math.min,p=Math.pow,d=Math.round,v=Math.sign||function(t){return t>0?1:t<0?-1:0},g=Math.sin,y=Math.tan,m=1e-6,x=1e-12,b=Math.PI,_=b/2,w=b/4,T=Math.SQRT1_2,k=P(2),A=P(b),M=2*b,S=180/b,E=b/180;function L(t){return t>1?_:t<-1?-_:Math.asin(t)}function C(t){return t>1?0:t<-1?b:Math.acos(t)}function P(t){return t>0?Math.sqrt(t):0}function O(t){return(l(t)-l(-t))/2}function I(t){return(l(t)+l(-t))/2}function D(t){var e=y(t/2),r=2*c(s(t/2))/(e*e);function n(t,e){var n=s(t),i=s(e),a=g(e),o=i*n,l=-((1-o?c((1+o)/2)/(1-o):-.5)+r/(1+o));return[l*i*g(t),l*a]}return n.invert=function(e,n){var a,l=P(e*e+n*n),u=-t/2,f=50;if(!l)return[0,0];do{var h=u/2,p=s(h),d=g(h),v=d/p,y=-c(i(p));u-=a=(2/v*y-r*v-l)/(-y/(d*d)+1-r/(2*p*p))*(p<0?.7:1)}while(i(a)>m&&--f>0);var x=g(u);return[o(e*x,l*s(u)),L(n*x/l)]},n}function z(){var t=_,e=(0,n.r)(D),r=e(t);return r.radius=function(r){return arguments.length?e(t=r*E):t*S},r.scale(179.976).clipAngle(147)}function R(t,e){var r=s(e),n=function(t){return t?t/Math.sin(t):1}(C(r*s(t/=2)));return[2*r*g(t)*n,g(e)*n]}function F(){return(0,n.Z)(R).scale(152.63)}function B(t){var e=g(t),r=s(t),n=t>=0?1:-1,a=y(n*t),l=(1+e-r)/2;function u(t,i){var u=s(i),c=s(t/=2);return[(1+u)*g(t),(n*i>-o(c,a)-.001?0:10*-n)+l+g(i)*r-(1+u)*e*c]}return u.invert=function(t,u){var c=0,f=0,h=50;do{var p=s(c),d=g(c),v=s(f),y=g(f),x=1+v,b=x*d-t,_=l+y*r-x*e*p-u,w=x*p/2,T=-d*y,k=e*x*d/2,A=r*v+e*p*y,M=T*k-A*w,S=(_*T-b*A)/M/2,E=(b*k-_*w)/M;i(E)>2&&(E/=2),c-=S,f-=E}while((i(S)>m||i(E)>m)&&--h>0);return n*f>-o(s(c),a)-.001?[2*c,f]:null},u}function N(){var t=20*E,e=t>=0?1:-1,r=y(e*t),i=(0,n.r)(B),a=i(t),l=a.stream;return a.parallel=function(n){return arguments.length?(r=y((e=(t=n*E)>=0?1:-1)*t),i(t)):t*S},a.stream=function(n){var i=a.rotate(),u=l(n),c=(a.rotate([0,0]),l(n)),f=a.precision();return a.rotate(i),u.sphere=function(){c.polygonStart(),c.lineStart();for(var n=-180*e;e*n<180;n+=90*e)c.point(n,90*e);if(t)for(;e*(n-=3*e*f)>=-180;)c.point(n,e*-o(s(n*E/2),r)*S);c.lineEnd(),c.polygonEnd()},u},a.scale(218.695).center([0,28.0974])}function j(t,e){var r=y(e/2),n=P(1-r*r),i=1+n*s(t/=2),a=g(t)*n/i,o=r/i,l=a*a,u=o*o;return[4/3*a*(3+l-3*u),4/3*o*(3+3*l-u)]}function U(){return(0,n.Z)(j).scale(66.1603)}R.invert=function(t,e){if(!(t*t+4*e*e>b*b+m)){var r=t,n=e,a=25;do{var o,l=g(r),u=g(r/2),c=s(r/2),f=g(n),h=s(n),p=g(2*n),d=f*f,v=h*h,y=u*u,x=1-v*c*c,_=x?C(h*c)*P(o=1/x):o=0,w=2*_*h*u-t,T=_*f-e,k=o*(v*y+_*h*c*d),A=o*(.5*l*p-2*_*f*u),M=.25*o*(p*u-_*f*v*l),S=o*(d*c+_*y*h),E=A*M-S*k;if(!E)break;var L=(T*A-w*S)/E,O=(w*M-T*k)/E;r-=L,n-=O}while((i(L)>m||i(O)>m)&&--a>0);return[r,n]}},j.invert=function(t,e){if(e*=3/8,!(t*=3/8)&&i(e)>1)return null;var r=1+t*t+e*e,n=P((r-P(r*r-4*e*e))/2),a=L(n)/3,l=n?function(t){return c(t+P(t*t-1))}(i(e/n))/3:function(t){return c(t+P(t*t+1))}(i(t))/3,u=s(a),f=I(l),h=f*f-u*u;return[2*v(t)*o(O(l)*u,.25-h),2*v(e)*o(f*g(a),.25+h)]};var V=P(8),H=c(1+k);function q(t,e){var r=i(e);return rx&&--u>0);return[t/(s(o)*(V-1/g(o))),v(e)*o]};var Z=r(17889);function Y(t){var e=2*b/t;function r(t,r){var n=(0,Z.N)(t,r);if(i(t)>_){var a=o(n[1],n[0]),l=P(n[0]*n[0]+n[1]*n[1]),u=e*d((a-_)/e)+_,c=o(g(a-=u),2-s(a));a=u+L(b/l*g(c))-c,n[0]=l*s(a),n[1]=l*g(a)}return n}return r.invert=function(t,r){var n=P(t*t+r*r);if(n>_){var i=o(r,t),l=e*d((i-_)/e)+_,u=i>l?-1:1,c=n*s(l-i),f=1/y(u*C((c-b)/P(b*(b-2*c)+n*n)));i=l+2*a((f+u*P(f*f-3))/3),t=n*s(i),r=n*g(i)}return Z.N.invert(t,r)},r}function W(){var t=5,e=(0,n.r)(Y),r=e(t),i=r.stream,a=.01,l=-s(a*E),u=g(a*E);return r.lobes=function(r){return arguments.length?e(t=+r):t},r.stream=function(e){var n=r.rotate(),c=i(e),f=(r.rotate([0,0]),i(e));return r.rotate(n),c.sphere=function(){f.polygonStart(),f.lineStart();for(var e=0,r=360/t,n=2*b/t,i=90-180/t,c=_;e0&&i(n)>m);return s<0?NaN:r}function tt(t,e,r){return void 0===e&&(e=40),void 0===r&&(r=x),function(n,a,o,s){var l,u,c;o=void 0===o?0:+o,s=void 0===s?0:+s;for(var f=0;fl)o-=u/=2,s-=c/=2;else{l=v;var g=(o>0?-1:1)*r,y=(s>0?-1:1)*r,m=t(o+g,s),x=t(o,s+y),b=(m[0]-h[0])/g,_=(m[1]-h[1])/g,w=(x[0]-h[0])/y,T=(x[1]-h[1])/y,k=T*b-_*w,A=(i(k)<.5?.5:1)/k;if(o+=u=(d*w-p*T)*A,s+=c=(p*_-d*b)*A,i(u)0&&(i[1]*=1+a/1.5*i[0]*i[0]),i}return e.invert=tt(e),e}function rt(){return(0,n.Z)(et()).rotate([-16.5,-42]).scale(176.57).center([7.93,.09])}function nt(t,e){var r,n=t*g(e),a=30;do{e-=r=(e+g(e)-n)/(1+s(e))}while(i(r)>m&&--a>0);return e/2}function it(t,e,r){function n(n,i){return[t*n*s(i=nt(r,i)),e*g(i)]}return n.invert=function(n,i){return i=L(i/e),[n/(t*s(i)),L((2*i+g(2*i))/r)]},n}K.invert=function(t,e){var r=2*L(e/2);return[t*s(r/2)/s(r),r]};var at=it(k/_,k,b);function ot(){return(0,n.Z)(at).scale(169.529)}var st=2.00276,lt=1.11072;function ut(t,e){var r=nt(b,e);return[st*t/(1/s(e)+lt/s(r)),(e+k*g(r))/st]}function ct(){return(0,n.Z)(ut).scale(160.857)}function ft(t){var e=0,r=(0,n.r)(t),i=r(e);return i.parallel=function(t){return arguments.length?r(e=t*E):e*S},i}function ht(t,e){return[t*s(e),e]}function pt(){return(0,n.Z)(ht).scale(152.63)}function dt(t){if(!t)return ht;var e=1/y(t);function r(r,n){var i=e+t-n,a=i?r*s(n)/i:i;return[i*g(a),e-i*s(a)]}return r.invert=function(r,n){var i=P(r*r+(n=e-n)*n),a=e+t-i;return[i/s(a)*o(r,n),a]},r}function vt(){return ft(dt).scale(123.082).center([0,26.1441]).parallel(45)}function gt(t){function e(e,r){var n=_-r,i=n?e*t*g(n)/n:n;return[n*g(i)/t,_-n*s(i)]}return e.invert=function(e,r){var n=e*t,i=_-r,a=P(n*n+i*i),s=o(n,i);return[(a?a/g(a):1)*s/t,_-a]},e}function yt(){var t=.5,e=(0,n.r)(gt),r=e(t);return r.fraction=function(r){return arguments.length?e(t=+r):t},r.scale(158.837)}ut.invert=function(t,e){var r,n,a=st*e,o=e<0?-w:w,l=25;do{n=a-k*g(o),o-=r=(g(2*o)+2*o-b*g(n))/(2*s(2*o)+2+b*s(n)*k*s(o))}while(i(r)>m&&--l>0);return n=a-k*g(o),[t*(1/s(n)+lt/s(o))/st,n]},ht.invert=function(t,e){return[t/s(e),e]};var mt=it(1,4/b,b);function xt(){return(0,n.Z)(mt).scale(152.63)}var bt=r(66624),_t=r(49386);function wt(t,e,r,n,a,l){var u,c=s(l);if(i(t)>1||i(l)>1)u=C(r*a+e*n*c);else{var f=g(t/2),h=g(l/2);u=2*L(P(f*f+e*n*h*h))}return i(u)>m?[u,o(n*g(l),e*a-r*n*c)]:[0,0]}function Tt(t,e,r){return C((t*t+e*e-r*r)/(2*t*e))}function kt(t){return t-2*b*u((t+b)/(2*b))}function At(t,e,r){for(var n,i=[[t[0],t[1],g(t[1]),s(t[1])],[e[0],e[1],g(e[1]),s(e[1])],[r[0],r[1],g(r[1]),s(r[1])]],a=i[2],o=0;o<3;++o,a=n)n=i[o],a.v=wt(n[1]-a[1],a[3],a[2],n[3],n[2],n[0]-a[0]),a.point=[0,0];var l=Tt(i[0].v[0],i[2].v[0],i[1].v[0]),u=Tt(i[0].v[0],i[1].v[0],i[2].v[0]),c=b-l;i[2].point[1]=0,i[0].point[0]=-(i[1].point[0]=i[0].v[0]/2);var f=[i[2].point[0]=i[0].point[0]+i[2].v[0]*s(l),2*(i[0].point[1]=i[1].point[1]=i[2].v[0]*g(l))];return function(t,e){var r,n=g(e),a=s(e),o=new Array(3);for(r=0;r<3;++r){var l=i[r];if(o[r]=wt(e-l[1],l[3],l[2],a,n,t-l[0]),!o[r][0])return l.point;o[r][1]=kt(o[r][1]-l.v[1])}var h=f.slice();for(r=0;r<3;++r){var p=2==r?0:r+1,d=Tt(i[r].v[0],o[r][0],o[p][0]);o[r][1]<0&&(d=-d),r?1==r?(d=u-d,h[0]-=o[r][0]*s(d),h[1]-=o[r][0]*g(d)):(d=c-d,h[0]+=o[r][0]*s(d),h[1]+=o[r][0]*g(d)):(h[0]+=o[r][0]*s(d),h[1]-=o[r][0]*g(d))}return h[0]/=3,h[1]/=3,h}}function Mt(t){return t[0]*=E,t[1]*=E,t}function St(){return Et([0,22],[45,22],[22.5,-22]).scale(380).center([22.5,2])}function Et(t,e,r){var i=(0,bt.Z)({type:"MultiPoint",coordinates:[t,e,r]}),a=[-i[0],-i[1]],o=(0,_t.Z)(a),s=At(Mt(o(t)),Mt(o(e)),Mt(o(r)));s.invert=tt(s);var l=(0,n.Z)(s).rotate(a),u=l.center;return delete l.rotate,l.center=function(t){return arguments.length?u(o(t)):o.invert(u())},l.clipAngle(90)}function Lt(t,e){var r=P(1-g(e));return[2/A*t*r,A*(1-r)]}function Ct(){return(0,n.Z)(Lt).scale(95.6464).center([0,30])}function Pt(t){var e=y(t);function r(t,r){return[t,(t?t/g(t):1)*(g(r)*s(t)-e*s(r))]}return r.invert=e?function(t,r){t&&(r*=g(t)/t);var n=s(t);return[t,2*o(P(n*n+e*e-r*r)-n,e-r)]}:function(t,e){return[t,L(t?e*y(t)/t:e)]},r}function Ot(){return ft(Pt).scale(249.828).clipAngle(90)}Lt.invert=function(t,e){var r=(r=e/A-1)*r;return[r>0?t*P(b/r)/2:0,L(1-r)]};var It=P(3);function Dt(t,e){return[It*t*(2*s(2*e/3)-1)/A,It*A*g(e/3)]}function zt(){return(0,n.Z)(Dt).scale(156.19)}function Rt(t){var e=s(t);function r(t,r){return[t*e,g(r)/e]}return r.invert=function(t,r){return[t/e,L(r*e)]},r}function Ft(){return ft(Rt).parallel(38.58).scale(195.044)}function Bt(t){var e=s(t);function r(t,r){return[t*e,(1+e)*y(r/2)]}return r.invert=function(t,r){return[t/e,2*a(r/(1+e))]},r}function Nt(){return ft(Bt).scale(124.75)}function jt(t,e){var r=P(8/(3*b));return[r*t*(1-i(e)/b),r*e]}function Ut(){return(0,n.Z)(jt).scale(165.664)}function Vt(t,e){var r=P(4-3*g(i(e)));return[2/P(6*b)*t*r,v(e)*P(2*b/3)*(2-r)]}function Ht(){return(0,n.Z)(Vt).scale(165.664)}function qt(t,e){var r=P(b*(4+b));return[2/r*t*(1+P(1-4*e*e/(b*b))),4/r*e]}function Gt(){return(0,n.Z)(qt).scale(180.739)}function Zt(t,e){var r=(2+_)*g(e);e/=2;for(var n=0,a=1/0;n<10&&i(a)>m;n++){var o=s(e);e-=a=(e+g(e)*(o+2)-r)/(2*o*(1+o))}return[2/P(b*(4+b))*t*(1+s(e)),2*P(b/(4+b))*g(e)]}function Yt(){return(0,n.Z)(Zt).scale(180.739)}function Wt(t,e){return[t*(1+s(e))/P(2+b),2*e/P(2+b)]}function Xt(){return(0,n.Z)(Wt).scale(173.044)}function Jt(t,e){for(var r=(1+_)*g(e),n=0,a=1/0;n<10&&i(a)>m;n++)e-=a=(e+g(e)-r)/(1+s(e));return r=P(2+b),[t*(1+s(e))/r,2*e/r]}function Kt(){return(0,n.Z)(Jt).scale(173.044)}Dt.invert=function(t,e){var r=3*L(e/(It*A));return[A*t/(It*(2*s(2*r/3)-1)),r]},jt.invert=function(t,e){var r=P(8/(3*b)),n=e/r;return[t/(r*(1-i(n)/b)),n]},Vt.invert=function(t,e){var r=2-i(e)/P(2*b/3);return[t*P(6*b)/(2*r),v(e)*L((4-r*r)/3)]},qt.invert=function(t,e){var r=P(b*(4+b))/2;return[t*r/(1+P(1-e*e*(4+b)/(4*b))),e*r/2]},Zt.invert=function(t,e){var r=e*P((4+b)/b)/2,n=L(r),i=s(n);return[t/(2/P(b*(4+b))*(1+i)),L((n+r*(i+2))/(2+_))]},Wt.invert=function(t,e){var r=P(2+b),n=e*r/2;return[r*t/(1+s(n)),n]},Jt.invert=function(t,e){var r=1+_,n=P(r/2);return[2*t*n/(1+s(e*=n)),L((e+g(e))/r)]};var $t=3+2*k;function Qt(t,e){var r=g(t/=2),n=s(t),i=P(s(e)),o=s(e/=2),l=g(e)/(o+k*n*i),u=P(2/(1+l*l)),f=P((k*o+(n+r)*i)/(k*o+(n-r)*i));return[$t*(u*(f-1/f)-2*c(f)),$t*(u*l*(f+1/f)-2*a(l))]}function te(){return(0,n.Z)(Qt).scale(62.5271)}Qt.invert=function(t,e){if(!(r=j.invert(t/1.2,1.065*e)))return null;var r,n=r[0],o=r[1],l=20;t/=$t,e/=$t;do{var u=n/2,p=o/2,d=g(u),v=s(u),y=g(p),x=s(p),b=s(o),w=P(b),A=y/(x+k*v*w),M=A*A,S=P(2/(1+M)),E=(k*x+(v+d)*w)/(k*x+(v-d)*w),L=P(E),C=L-1/L,O=L+1/L,I=S*C-2*c(L)-t,D=S*A*O-2*a(A)-e,z=y&&T*w*d*M/y,R=(k*v*x+w)/(2*(x+k*v*w)*(x+k*v*w)*w),F=-.5*A*S*S*S,B=F*z,N=F*R,U=(U=2*x+k*w*(v-d))*U*L,V=(k*v*x*w+b)/U,H=-k*d*y/(w*U),q=C*B-2*V/L+S*(V+V/E),G=C*N-2*H/L+S*(H+H/E),Z=A*O*B-2*z/(1+M)+S*O*z+S*A*(V-V/E),Y=A*O*N-2*R/(1+M)+S*O*R+S*A*(H-H/E),W=G*Z-Y*q;if(!W)break;var X=(D*G-I*Y)/W,J=(I*Z-D*q)/W;n-=X,o=f(-_,h(_,o-J))}while((i(X)>m||i(J)>m)&&--l>0);return i(i(o)-_)n){var h=P(f),p=o(c,u),v=r*d(p/r),y=p-v,x=t*s(y),w=(t*g(y)-y*g(x))/(_-x),T=de(y,w),k=(b-t)/ve(T,x,b);u=h;var A,M=50;do{u-=A=(t+ve(T,x,u)*k-h)/(T(u)*k)}while(i(A)>m&&--M>0);c=y*g(u),u<_&&(c-=w*(u-_));var S=g(v),E=s(v);l[0]=u*E-c*S,l[1]=u*S+c*E}return l}return a.invert=function(e,a){var l=e*e+a*a;if(l>n){var u=P(l),c=o(a,e),f=r*d(c/r),h=c-f;e=u*s(h),a=u*g(h);for(var p=e-_,v=g(e),y=a/v,m=e<_?1/0:0,w=10;;){var T=t*g(y),k=t*s(y),A=g(k),M=_-k,S=(T-y*A)/M,E=de(y,S);if(i(m)m||i(p)>m)&&--y>0);return[d,v]},c}var me=ye(2.8284,-1.6988,.75432,-.18071,1.76003,-.38914,.042555);function xe(){return(0,n.Z)(me).scale(149.995)}var be=ye(2.583819,-.835827,.170354,-.038094,1.543313,-.411435,.082742);function _e(){return(0,n.Z)(be).scale(153.93)}var we=ye(5/6*b,-.62636,-.0344,0,1.3493,-.05524,0,.045);function Te(){return(0,n.Z)(we).scale(130.945)}function ke(t,e){var r=t*t,n=e*e;return[t*(1-.162388*n)*(.87-952426e-9*r*r),e*(1+n/12)]}function Ae(){return(0,n.Z)(ke).scale(131.747)}ke.invert=function(t,e){var r,n=t,a=e,o=50;do{var s=a*a;a-=r=(a*(1+s/12)-e)/(1+s/4)}while(i(r)>m&&--o>0);o=50,t/=1-.162388*s;do{var l=(l=n*n)*l;n-=r=(n*(.87-952426e-9*l)-t)/(.87-.00476213*l)}while(i(r)>m&&--o>0);return[n,a]};var Me=ye(2.6516,-.76534,.19123,-.047094,1.36289,-.13965,.031762);function Se(){return(0,n.Z)(Me).scale(131.087)}function Ee(t){var e=t(_,0)[0]-t(-_,0)[0];function r(r,n){var i=r>0?-.5:.5,a=t(r+i*b,n);return a[0]-=i*e,a}return t.invert&&(r.invert=function(r,n){var i=r>0?-.5:.5,a=t.invert(r+i*e,n),o=a[0]-i*b;return o<-b?o+=2*b:o>b&&(o-=2*b),a[0]=o,a}),r}function Le(t,e){var r=v(t),n=v(e),a=s(e),l=s(t)*a,u=g(t)*a,c=g(n*e);t=i(o(u,c)),e=L(l),i(t-_)>m&&(t%=_);var f=function(t,e){if(e===_)return[0,0];var r,n,a=g(e),o=a*a,l=o*o,u=1+l,c=1+3*l,f=1-l,h=L(1/P(u)),p=f+o*u*h,d=(1-a)/p,v=P(d),y=d*u,x=P(y),w=v*f;if(0===t)return[0,-(w+o*x)];var T,k=s(e),A=1/k,M=2*a*k,S=(-p*k-(1-a)*((-3*o+h*c)*M))/(p*p),E=-A*M,C=-A*(o*u*S+d*c*M),O=-2*A*(f*(.5*S/v)-2*o*v*M),I=4*t/b;if(t>.222*b||e.175*b){if(r=(w+o*P(y*(1+l)-w*w))/(1+l),t>b/4)return[r,r];var D=r,z=.5*r;r=.5*(z+D),n=50;do{var R=r*(O+E*P(y-r*r))+C*L(r/x)-I;if(!R)break;R<0?z=r:D=r,r=.5*(z+D)}while(i(D-z)>m&&--n>0)}else{r=m,n=25;do{var F=r*r,B=P(y-F),N=O+E*B,j=r*N+C*L(r/x)-I;r-=T=B?j/(N+(C-E*F)/B):0}while(i(T)>m&&--n>0)}return[r,-w-o*P(y-r*r)]}(t>b/4?_-t:t,e);return t>b/4&&(c=f[0],f[0]=-f[1],f[1]=-c),f[0]*=r,f[1]*=-n,f}function Ce(){return(0,n.Z)(Ee(Le)).scale(239.75)}function Pe(t,e){var r,n,o,u,c,f;if(e=1-m)return r=(1-e)/4,o=1/(n=I(t)),[(u=((f=l(2*(f=t)))-1)/(f+1))+r*((c=n*O(t))-t)/(n*n),o-r*u*o*(c-t),o+r*u*o*(c+t),2*a(l(t))-_+r*(c-t)/n];var h=[1,0,0,0,0,0,0,0,0],p=[P(e),0,0,0,0,0,0,0,0],d=0;for(n=P(1-e),c=1;i(p[d]/h[d])>m&&d<8;)r=h[d++],p[d]=(r-n)/2,h[d]=(r+n)/2,n=P(r*n),c*=2;o=c*h[d]*t;do{o=(L(u=p[d]*g(n=o)/h[d])+o)/2}while(--d);return[g(o),u=s(o),u/s(o-n),o]}function Oe(t,e){if(!e)return t;if(1===e)return c(y(t/2+w));for(var r=1,n=P(1-e),o=P(e),s=0;i(o)>m;s++){if(t%b){var l=a(n*y(t)/r);l<0&&(l+=b),t+=l+~~(t/b)*b}else t+=t;o=(r+n)/2,n=P(r*n),o=((r=o)-n)/2}return t/(p(2,s)*r)}function Ie(t,e){var r=(k-1)/(k+1),n=P(1-r*r),u=Oe(_,n*n),f=c(y(b/4+i(e)/2)),h=l(-1*f)/P(r),p=function(t,e){var r=t*t,n=e+1,i=1-r-e*e;return[.5*((t>=0?_:-_)-o(i,2*t)),-.25*c(i*i+4*r)+.5*c(n*n+r)]}(h*s(-1*t),h*g(-1*t)),d=function(t,e,r){var n=i(t),o=O(i(e));if(n){var s=1/g(n),l=1/(y(n)*y(n)),u=-(l+r*(o*o*s*s)-1+r),c=(-u+P(u*u-(r-1)*l*4))/2;return[Oe(a(1/P(c)),r)*v(t),Oe(a(P((c/l-1)/r)),1-r)*v(e)]}return[0,Oe(a(o),1-r)*v(e)]}(p[0],p[1],n*n);return[-d[1],(e>=0?1:-1)*(.5*u-d[0])]}function De(){return(0,n.Z)(Ee(Ie)).scale(151.496)}Le.invert=function(t,e){i(t)>1&&(t=2*v(t)-t),i(e)>1&&(e=2*v(e)-e);var r=v(t),n=v(e),a=-r*t,l=-n*e,u=l/a<1,c=function(t,e){for(var r=0,n=1,a=.5,o=50;;){var l=a*a,u=P(a),c=L(1/P(1+l)),f=1-l+a*(1+l)*c,h=(1-u)/f,p=P(h),d=h*(1+l),v=p*(1-l),g=P(d-t*t),y=e+v+a*g;if(i(n-r)0?r=a:n=a,a=.5*(r+n)}if(!o)return null;var m=L(u),_=s(m),w=1/_,T=2*u*_,k=(-f*_-(-3*a+c*(1+3*l))*T*(1-u))/(f*f);return[b/4*(t*(-2*w*((1-l)*(.5*k/p)-2*a*p*T)+-w*T*g)+-w*(a*(1+l)*k+h*(1+3*l)*T)*L(t/P(d))),m]}(u?l:a,u?a:l),f=c[0],h=c[1],p=s(h);return u&&(f=-_-f),[r*(o(g(f)*p,-g(h))+b),n*L(s(f)*p)]},Ie.invert=function(t,e){var r,n,i,s,u,f,h=(k-1)/(k+1),p=P(1-h*h),d=(n=-t,i=p*p,(r=.5*Oe(_,p*p)-e)?(s=Pe(r,i),n?(f=(u=Pe(n,1-i))[1]*u[1]+i*s[0]*s[0]*u[0]*u[0],[[s[0]*u[2]/f,s[1]*s[2]*u[0]*u[1]/f],[s[1]*u[1]/f,-s[0]*s[2]*u[0]*u[2]/f],[s[2]*u[1]*u[2]/f,-i*s[0]*s[1]*u[0]/f]]):[[s[0],0],[s[1],0],[s[2],0]]):[[0,(u=Pe(n,1-i))[0]/u[1]],[1/u[1],0],[u[2]/u[1],0]]),v=function(t,e){var r=e[0]*e[0]+e[1]*e[1];return[(t[0]*e[0]+t[1]*e[1])/r,(t[1]*e[0]-t[0]*e[1])/r]}(d[0],d[1]);return[o(v[1],v[0])/-1,2*a(l(-.5*c(h*v[0]*v[0]+h*v[1]*v[1])))-_]};var ze=r(7613);function Re(t){var e=g(t),r=s(t),n=Fe(t);function a(t,a){var o=n(t,a);t=o[0],a=o[1];var l=g(a),u=s(a),c=s(t),f=C(e*l+r*u*c),h=g(f),p=i(h)>m?f/h:1;return[p*r*g(t),(i(t)>_?p:-p)*(e*u-r*l*c)]}return n.invert=Fe(-t),a.invert=function(t,r){var i=P(t*t+r*r),a=-g(i),l=s(i),u=i*l,c=-r*a,f=i*e,h=P(u*u+c*c-f*f),p=o(u*f+c*h,c*f-u*h),d=(i>_?-1:1)*o(t*a,i*s(p)*l+r*g(p)*a);return n.invert(d,p)},a}function Fe(t){var e=g(t),r=s(t);return function(t,n){var i=s(n),a=s(t)*i,l=g(t)*i,u=g(n);return[o(l,a*r-u*e),L(u*r+a*e)]}}function Be(){var t=0,e=(0,n.r)(Re),r=e(t),i=r.rotate,a=r.stream,o=(0,ze.Z)();return r.parallel=function(n){if(!arguments.length)return t*S;var i=r.rotate();return e(t=n*E).rotate(i)},r.rotate=function(e){return arguments.length?(i.call(r,[e[0],e[1]-t*S]),o.center([-e[0],-e[1]]),r):((e=i.call(r))[1]+=t*S,e)},r.stream=function(t){return(t=a(t)).sphere=function(){t.polygonStart();var e,r=o.radius(89.99)().coordinates[0],n=r.length-1,i=-1;for(t.lineStart();++i=0;)t.point((e=r[i])[0],e[1]);t.lineEnd(),t.polygonEnd()},t},r.scale(79.4187).parallel(45).clipAngle(179.999)}var Ne=r(33064),je=r(72736),Ue=L(1-1/3)*S,Ve=Rt(0);function He(t){var e=Ue*E,r=Lt(b,e)[0]-Lt(-b,e)[0],n=Ve(0,e)[1],a=Lt(0,e)[1],o=A-a,s=M/t,l=4/M,c=n+o*o*4/M;function p(p,d){var v,g=i(d);if(g>e){var y=h(t-1,f(0,u((p+b)/s)));(v=Lt(p+=b*(t-1)/t-y*s,g))[0]=v[0]*M/r-M*(t-1)/(2*t)+y*M/t,v[1]=n+4*(v[1]-a)*o/M,d<0&&(v[1]=-v[1])}else v=Ve(p,d);return v[0]*=l,v[1]/=c,v}return p.invert=function(e,p){e/=l;var d=i(p*=c);if(d>n){var v=h(t-1,f(0,u((e+b)/s)));e=(e+b*(t-1)/t-v*s)*r/M;var g=Lt.invert(e,.25*(d-n)*M/o+a);return g[0]-=b*(t-1)/t-v*s,p<0&&(g[1]=-g[1]),g}return Ve.invert(e,p)},p}function qe(t,e){return[t,1&e?90-m:Ue]}function Ge(t,e){return[t,1&e?-90+m:-Ue]}function Ze(t){return[t[0]*(1-m),t[1]]}function Ye(){var t=4,e=(0,n.r)(He),r=e(t),i=r.stream;return r.lobes=function(r){return arguments.length?e(t=+r):t},r.stream=function(e){var n=r.rotate(),a=i(e),o=(r.rotate([0,0]),i(e));return r.rotate(n),a.sphere=function(){var e,r;(0,je.Z)((e=180/t,r=[].concat((0,Ne.w6)(-180,180+e/2,e).map(qe),(0,Ne.w6)(180,-180-e/2,-e).map(Ge)),{type:"Polygon",coordinates:[180===e?r.map(Ze):r]}),o)},a},r.scale(239.75)}function We(t){var e,r=1+t,n=L(g(1/r)),a=2*P(b/(e=b+4*n*r)),l=.5*a*(r+P(t*(2+t))),u=t*t,c=r*r;function f(f,h){var p,d,v=1-g(h);if(v&&v<2){var y,m=_-h,w=25;do{var T=g(m),k=s(m),A=n+o(T,r-k),M=1+c-2*r*k;m-=y=(m-u*n-r*T+M*A-.5*v*e)/(2*r*T*A)}while(i(y)>x&&--w>0);p=a*P(M),d=f*A/b}else p=a*(t+v),d=f*n/b;return[p*g(d),l-p*s(d)]}return f.invert=function(t,i){var s=t*t+(i-=l)*i,f=(1+c-s/(a*a))/(2*r),h=C(f),p=g(h),d=n+o(p,r-f);return[L(t/P(s))*b/d,L(1-2*(h-u*n-r*p+(1+c-2*r*f)*d)/e)]},f}function Xe(){var t=1,e=(0,n.r)(We),r=e(t);return r.ratio=function(r){return arguments.length?e(t=+r):t},r.scale(167.774).center([0,18.67])}var Je=.7109889596207567,Ke=.0528035274542;function $e(t,e){return e>-Je?((t=at(t,e))[1]+=Ke,t):ht(t,e)}function Qe(){return(0,n.Z)($e).rotate([-20,-55]).scale(164.263).center([0,-5.4036])}function tr(t,e){return i(e)>Je?((t=at(t,e))[1]-=e>0?Ke:-Ke,t):ht(t,e)}function er(){return(0,n.Z)(tr).scale(152.63)}function rr(t,e,r,n){var i=P(4*b/(2*r+(1+t-e/2)*g(2*r)+(t+e)/2*g(4*r)+e/2*g(6*r))),a=P(n*g(r)*P((1+t*s(2*r)+e*s(4*r))/(1+t+e))),o=r*u(1);function l(r){return P(1+t*s(2*r)+e*s(4*r))}function u(n){var i=n*r;return(2*i+(1+t-e/2)*g(2*i)+(t+e)/2*g(4*i)+e/2*g(6*i))/r}function c(t){return l(t)*g(t)}var f=function(t,e){var n=r*Q(u,o*g(e)/r,e/b);isNaN(n)&&(n=r*v(e));var c=i*l(n);return[c*a*t/b*s(n),c/a*g(n)]};return f.invert=function(t,e){var n=Q(c,e*a/i);return[t*b/(s(n)*i*a*l(n)),L(r*u(n/r)/o)]},0===r&&(i=P(n/b),(f=function(t,e){return[t*i,g(e)/i]}).invert=function(t,e){return[t/i,L(e*i)]}),f}function nr(){var t=1,e=0,r=45*E,i=2,a=(0,n.r)(rr),o=a(t,e,r,i);return o.a=function(n){return arguments.length?a(t=+n,e,r,i):t},o.b=function(n){return arguments.length?a(t,e=+n,r,i):e},o.psiMax=function(n){return arguments.length?a(t,e,r=+n*E,i):r*S},o.ratio=function(n){return arguments.length?a(t,e,r,i=+n):i},o.scale(180.739)}function ir(t,e,r,n,i,a,o,s,l,u,c){if(c.nanEncountered)return NaN;var f,h,p,d,v,g,y,m,x,b;if(h=t(e+.25*(f=r-e)),p=t(r-.25*f),isNaN(h))c.nanEncountered=!0;else{if(!isNaN(p))return b=((g=(d=f*(n+4*h+i)/12)+(v=f*(i+4*p+a)/12))-o)/15,u>l?(c.maxDepthCount++,g+b):Math.abs(b)t?r=n:e=n,n=e+r>>1}while(n>e);var i=u[n+1]-u[n];return i&&(i=(t-u[n+1])/i),(n+1+i)/s}var h=2*f(1)/b*o/r,d=function(t,e){var r=f(i(g(e))),a=n(r)*t;return r/=h,[a,e>=0?r:-r]};return d.invert=function(t,e){var r;return i(e*=h)<1&&(r=v(e)*L(a(i(e))*o)),[t/n(i(e)),r]},d}function sr(){var t=0,e=2.5,r=1.183136,i=(0,n.r)(or),a=i(t,e,r);return a.alpha=function(n){return arguments.length?i(t=+n,e,r):t},a.k=function(n){return arguments.length?i(t,e=+n,r):e},a.gamma=function(n){return arguments.length?i(t,e,r=+n):r},a.scale(152.63)}function lr(t,e){return i(t[0]-e[0])a[o][2][0];++o);var l=t(r-a[o][1][0],n);return l[0]+=t(a[o][1][0],i*n>i*a[o][0][1]?a[o][0][1]:n)[0],l}r?o.invert=r(o):t.invert&&(o.invert=function(r,n){for(var i=a[+(n<0)],s=e[+(n<0)],l=0,u=i.length;l=0;--s)r=(e=t[1][s])[0][0],n=e[0][1],i=e[1][1],a=e[2][0],o=e[2][1],l.push(ur([[a-m,o-m],[a-m,i+m],[r+m,i+m],[r+m,n-m]],30));return{type:"Polygon",coordinates:[(0,Ne.TS)(l)]}}(r),e=r.map((function(t){return t.map((function(t){return[[t[0][0]*E,t[0][1]*E],[t[1][0]*E,t[1][1]*E],[t[2][0]*E,t[2][1]*E]]}))})),a=e.map((function(e){return e.map((function(e){var r,n=t(e[0][0],e[0][1])[0],i=t(e[2][0],e[2][1])[0],a=t(e[1][0],e[0][1])[1],o=t(e[1][0],e[1][1])[1];return a>o&&(r=a,a=o,o=r),[[n,a],[i,o]]}))})),s):e.map((function(t){return t.map((function(t){return[[t[0][0]*S,t[0][1]*S],[t[1][0]*S,t[1][1]*S],[t[2][0]*S,t[2][1]*S]]}))}))},null!=e&&s.lobes(e),s}$e.invert=function(t,e){return e>-Je?at.invert(t,e-Ke):ht.invert(t,e)},tr.invert=function(t,e){return i(e)>Je?at.invert(t,e+(e>0?Ke:-Ke)):ht.invert(t,e)};var fr=[[[[-180,0],[-100,90],[-40,0]],[[-40,0],[30,90],[180,0]]],[[[-180,0],[-160,-90],[-100,0]],[[-100,0],[-60,-90],[-20,0]],[[-20,0],[20,-90],[80,0]],[[80,0],[140,-90],[180,0]]]];function hr(){return cr(ut,fr).scale(160.857)}var pr=[[[[-180,0],[-100,90],[-40,0]],[[-40,0],[30,90],[180,0]]],[[[-180,0],[-160,-90],[-100,0]],[[-100,0],[-60,-90],[-20,0]],[[-20,0],[20,-90],[80,0]],[[80,0],[140,-90],[180,0]]]];function dr(){return cr(tr,pr).scale(152.63)}var vr=[[[[-180,0],[-100,90],[-40,0]],[[-40,0],[30,90],[180,0]]],[[[-180,0],[-160,-90],[-100,0]],[[-100,0],[-60,-90],[-20,0]],[[-20,0],[20,-90],[80,0]],[[80,0],[140,-90],[180,0]]]];function gr(){return cr(at,vr).scale(169.529)}var yr=[[[[-180,0],[-90,90],[0,0]],[[0,0],[90,90],[180,0]]],[[[-180,0],[-90,-90],[0,0]],[[0,0],[90,-90],[180,0]]]];function mr(){return cr(at,yr).scale(169.529).rotate([20,0])}var xr=[[[[-180,35],[-30,90],[0,35]],[[0,35],[30,90],[180,35]]],[[[-180,-10],[-102,-90],[-65,-10]],[[-65,-10],[5,-90],[77,-10]],[[77,-10],[103,-90],[180,-10]]]];function br(){return cr($e,xr,tt).rotate([-20,-55]).scale(164.263).center([0,-5.4036])}var _r=[[[[-180,0],[-110,90],[-40,0]],[[-40,0],[0,90],[40,0]],[[40,0],[110,90],[180,0]]],[[[-180,0],[-110,-90],[-40,0]],[[-40,0],[0,-90],[40,0]],[[40,0],[110,-90],[180,0]]]];function wr(){return cr(ht,_r).scale(152.63).rotate([-20,0])}function Tr(t,e){return[3/M*t*P(b*b/3-e*e),e]}function kr(){return(0,n.Z)(Tr).scale(158.837)}function Ar(t){function e(e,r){if(i(i(r)-_)2)return null;var a=(e/=2)*e,s=(r/=2)*r,l=2*r/(1+a+s);return l=p((1+l)/(1-l),1/t),[o(2*e,1-a-s)/t,L((l-1)/(l+1))]},e}function Mr(){var t=.5,e=(0,n.r)(Ar),r=e(t);return r.spacing=function(r){return arguments.length?e(t=+r):t},r.scale(124.75)}Tr.invert=function(t,e){return[M/3*t/P(b*b/3-e*e),e]};var Sr=b/k;function Er(t,e){return[t*(1+P(s(e)))/2,e/(s(e/2)*s(t/6))]}function Lr(){return(0,n.Z)(Er).scale(97.2672)}function Cr(t,e){var r=t*t,n=e*e;return[t*(.975534+n*(-.0143059*r-.119161+-.0547009*n)),e*(1.00384+r*(.0802894+-.02855*n+199025e-9*r)+n*(.0998909+-.0491032*n))]}function Pr(){return(0,n.Z)(Cr).scale(139.98)}function Or(t,e){return[g(t)/s(e),y(e)*s(t)]}function Ir(){return(0,n.Z)(Or).scale(144.049).clipAngle(89.999)}function Dr(t){var e=s(t),r=y(w+t/2);function n(n,a){var o=a-t,s=i(o)=0;)h=(f=t[c])[0]+l*(i=h)-u*p,p=f[1]+l*p+u*i;return[h=l*(i=h)-u*p,p=l*p+u*i]}return r.invert=function(r,n){var l=20,u=r,c=n;do{for(var f,h=e,p=t[h],d=p[0],v=p[1],y=0,x=0;--h>=0;)y=d+u*(f=y)-c*x,x=v+u*x+c*f,d=(p=t[h])[0]+u*(f=d)-c*v,v=p[1]+u*v+c*f;var b,_,w=(y=d+u*(f=y)-c*x)*y+(x=v+u*x+c*f)*x;u-=b=((d=u*(f=d)-c*v-r)*y+(v=u*v+c*f-n)*x)/w,c-=_=(v*y-d*x)/w}while(i(b)+i(_)>m*m&&--l>0);if(l){var T=P(u*u+c*c),k=2*a(.5*T),A=g(k);return[o(u*A,T*s(k)),T?L(c*A/T):0]}},r}Er.invert=function(t,e){var r=i(t),n=i(e),a=m,o=_;nm||i(x)>m)&&--a>0);return a&&[r,n]},Or.invert=function(t,e){var r=t*t,n=e*e+1,i=r+n,a=t?T*P((i-P(i*i-4*r))/r):1/P(n);return[L(t*a),v(e)*C(a)]},Rr.invert=function(t,e){return[t,2.5*a(l(.8*e))-.625*b]};var Nr=[[.9972523,0],[.0052513,-.0041175],[.0074606,.0048125],[-.0153783,-.1968253],[.0636871,-.1408027],[.3660976,-.2937382]],jr=[[.98879,0],[0,0],[-.050909,0],[0,0],[.075528,0]],Ur=[[.984299,0],[.0211642,.0037608],[-.1036018,-.0575102],[-.0329095,-.0320119],[.0499471,.1223335],[.026046,.0899805],[7388e-7,-.1435792],[.0075848,-.1334108],[-.0216473,.0776645],[-.0225161,.0853673]],Vr=[[.9245,0],[0,0],[.01943,0]],Hr=[[.721316,0],[0,0],[-.00881625,-.00617325]];function qr(){return Xr(Nr,[152,-64]).scale(1400).center([-160.908,62.4864]).clipAngle(30).angle(7.8)}function Gr(){return Xr(jr,[95,-38]).scale(1e3).clipAngle(55).center([-96.5563,38.8675])}function Zr(){return Xr(Ur,[120,-45]).scale(359.513).clipAngle(55).center([-117.474,53.0628])}function Yr(){return Xr(Vr,[-20,-18]).scale(209.091).center([20,16.7214]).clipAngle(82)}function Wr(){return Xr(Hr,[165,10]).scale(250).clipAngle(130).center([-165,-10])}function Xr(t,e){var r=(0,n.Z)(Br(t)).rotate(e).clipAngle(90),i=(0,_t.Z)(e),a=r.center;return delete r.rotate,r.center=function(t){return arguments.length?a(i(t)):i.invert(a())},r}var Jr=P(6),Kr=P(7);function $r(t,e){var r=L(7*g(e)/(3*Jr));return[Jr*t*(2*s(2*r/3)-1)/Kr,9*g(r/3)/Kr]}function Qr(){return(0,n.Z)($r).scale(164.859)}function tn(t,e){for(var r,n=(1+T)*g(e),a=e,o=0;o<25&&(a-=r=(g(a/2)+g(a)-n)/(.5*s(a/2)+s(a)),!(i(r)x&&--l>0);return[t/(.84719-.13063*(n=s*s)+(o=n*(a=n*n))*o*(.05494*n-.04515-.02326*a+.00331*o)),s]},ln.invert=function(t,e){for(var r=e/2,n=0,a=1/0;n<10&&i(a)>m;++n){var o=s(e/2);e-=a=(e-y(e/2)-r)/(1-.5/(o*o))}return[2*t/(1+s(e)),e]};var cn=[[[[-180,0],[-90,90],[0,0]],[[0,0],[90,90],[180,0]]],[[[-180,0],[-90,-90],[0,0]],[[0,0],[90,-90],[180,0]]]];function fn(){return cr(J(1/0),cn).rotate([20,0]).scale(152.63)}function hn(t,e){var r=g(e),n=s(e),a=v(t);if(0===t||i(e)===_)return[0,e];if(0===e)return[t,0];if(i(t)===_)return[t*n,_*r];var o=b/(2*t)-2*t/b,l=2*e/b,u=(1-l*l)/(r-l),c=o*o,f=u*u,h=1+c/f,p=1+f/c,d=(o*r/u-o/2)/h,y=(f*r/c+u/2)/p,m=y*y-(f*r*r/c+u*r-1)/p;return[_*(d+P(d*d+n*n/h)*a),_*(y+P(m<0?0:m)*v(-e*o)*a)]}function pn(){return(0,n.Z)(hn).scale(127.267)}hn.invert=function(t,e){var r=(t/=_)*t,n=r+(e/=_)*e,i=b*b;return[t?(n-1+P((1-n)*(1-n)+4*r))/(2*t)*_:0,Q((function(t){return n*(b*g(t)-2*t)*b+4*t*t*(e-g(t))+2*b*t-i*e}),0)]};var dn=1.0148,vn=.23185,gn=-.14499,yn=.02406,mn=dn,xn=5*vn,bn=7*gn,_n=9*yn,wn=1.790857183;function Tn(t,e){var r=e*e;return[t,e*(dn+r*r*(vn+r*(gn+yn*r)))]}function kn(){return(0,n.Z)(Tn).scale(139.319)}function An(t,e){if(i(e)wn?e=wn:e<-1.790857183&&(e=-1.790857183);var r,n=e;do{var a=n*n;n-=r=(n*(dn+a*a*(vn+a*(gn+yn*a)))-e)/(mn+a*a*(xn+a*(bn+_n*a)))}while(i(r)>m);return[t,n]},An.invert=function(t,e){if(i(e)m&&--o>0);return l=y(a),[(i(e)=0;)if(n=e[s],r[0]===n[0]&&r[1]===n[1]){if(a)return[a,r];a=r}}}(e.face,r.face),i=(c=n.map(r.project),f=n.map(e.project),h=Cn(c[1],c[0]),p=Cn(f[1],f[0]),d=function(t,e){return o(t[0]*e[1]-t[1]*e[0],t[0]*e[0]+t[1]*e[1])}(h,p),v=Pn(h)/Pn(p),Ln([1,0,c[0][0],0,1,c[0][1]],Ln([v,0,0,0,v,0],Ln([s(d),g(d),0,-g(d),s(d),0],[1,0,-f[0][0],0,1,-f[0][1]]))));e.transform=r.transform?Ln(r.transform,i):i;for(var a=r.edges,l=0,u=a.length;l0?[-e[0],0]:[180-e[0],180])};var e=Bn.map((function(e){return{face:e,project:t(e)}}));return[-1,0,0,1,0,1,4,5].forEach((function(t,r){var n=e[t];n&&(n.children||(n.children=[])).push(e[r])})),On(e[0],(function(t,r){return e[t<-b/2?r<0?6:4:t<0?r<0?2:0:tn^p>n&&r<(h-u)*(n-c)/(p-c)+u&&(i=!i)}return i}(t[0],r))return t.push(e),!0}))||t.push([e])})),Qn=[],t.length?t.length>1?{type:"MultiPolygon",coordinates:t}:{type:"Polygon",coordinates:t[0]}:null}};function ni(t){var e=t(_,0)[0]-t(-_,0)[0];function r(r,n){var a=i(r)<_,o=t(a?r:r>0?r-b:r+b,n),s=(o[0]-o[1])*T,l=(o[0]+o[1])*T;if(a)return[s,l];var u=e*T,c=s>0^l>0?-1:1;return[c*s-v(l)*u,c*l-v(s)*u]}return t.invert&&(r.invert=function(r,n){var a=(r+n)*T,o=(n-r)*T,s=i(a)<.5*e&&i(o)<.5*e;if(!s){var l=e*T,u=a>0^o>0?-1:1,c=-u*r+(o>0?1:-1)*l,f=-u*n+(a>0?1:-1)*l;a=(-c-f)*T,o=(c-f)*T}var h=t.invert(a,o);return s||(h[0]+=a>0?b:-b),h}),(0,n.Z)(r).rotate([-90,-90,45]).clipAngle(179.999)}function ii(){return ni(Le).scale(176.423)}function ai(){return ni(Ie).scale(111.48)}function oi(t,e){if(!(0<=(e=+e)&&e<=20))throw new Error("invalid digits");function r(t){var r=t.length,n=2,i=new Array(r);for(i[0]=+t[0].toFixed(e),i[1]=+t[1].toFixed(e);n2||a[0]!=e[0]||a[1]!=e[1])&&(n.push(a),e=a)}return 1===n.length&&t.length>1&&n.push(r(t[t.length-1])),n}function a(t){return t.map(i)}function o(t){if(null==t)return t;var e;switch(t.type){case"GeometryCollection":e={type:"GeometryCollection",geometries:t.geometries.map(o)};break;case"Point":e={type:"Point",coordinates:r(t.coordinates)};break;case"MultiPoint":e={type:t.type,coordinates:n(t.coordinates)};break;case"LineString":e={type:t.type,coordinates:i(t.coordinates)};break;case"MultiLineString":case"Polygon":e={type:t.type,coordinates:a(t.coordinates)};break;case"MultiPolygon":e={type:"MultiPolygon",coordinates:t.coordinates.map(a)};break;default:return t}return null!=t.bbox&&(e.bbox=t.bbox),e}function s(t){var e={type:"Feature",properties:t.properties,geometry:o(t.geometry)};return null!=t.id&&(e.id=t.id),null!=t.bbox&&(e.bbox=t.bbox),e}if(null!=t)switch(t.type){case"Feature":return s(t);case"FeatureCollection":var l={type:"FeatureCollection",features:t.features.map(s)};return null!=t.bbox&&(l.bbox=t.bbox),l;default:return o(t)}return t}function si(t){var e=g(t);function r(r,n){var i=e?y(r*e/2)/e:r/2;if(!n)return[2*i,-t];var o=2*a(i*g(n)),l=1/y(n);return[g(o)*l,n+(1-s(o))*l-t]}return r.invert=function(r,n){if(i(n+=t)m&&--c>0);var d=r*(f=y(u)),v=y(i(n)0?_:-_)*(f+o*(d-l)/2+o*o*(d-2*f+l)/2)]}function fi(){return(0,n.Z)(ci).scale(152.63)}function hi(t,e){var r=function(t){function e(e,r){var n=s(r),i=(t-1)/(t-n*s(e));return[i*n*g(e),i*g(r)]}return e.invert=function(e,r){var n=e*e+r*r,i=P(n),a=(t-P(1-n*(t+1)/(t-1)))/((t-1)/i+i/(t-1));return[o(e*a,i*P(1-a*a)),i?L(r*a/i):0]},e}(t);if(!e)return r;var n=s(e),i=g(e);function a(e,a){var o=r(e,a),s=o[1],l=s*i/(t-1)+n;return[o[0]*n/l,s/l]}return a.invert=function(e,a){var o=(t-1)/(t-1-a*i);return r.invert(o*e,o*a*n)},a}function pi(){var t=2,e=0,r=(0,n.r)(hi),i=r(t,e);return i.distance=function(n){return arguments.length?r(t=+n,e):t},i.tilt=function(n){return arguments.length?r(t,e=n*E):e*S},i.scale(432.147).clipAngle(C(1/t)*S-1e-6)}ui.forEach((function(t){t[1]*=1.0144})),ci.invert=function(t,e){var r=e/_,n=90*r,a=h(18,i(n/5)),o=f(0,u(a));do{var s=ui[o][1],l=ui[o+1][1],c=ui[h(19,o+2)][1],p=c-s,d=c-2*l+s,v=2*(i(r)-l)/p,g=d/p,y=v*(1-g*v*(1-2*g*v));if(y>=0||1===o){n=(e>=0?5:-5)*(y+a);var m,b=50;do{y=(a=h(18,i(n)/5))-(o=u(a)),s=ui[o][1],l=ui[o+1][1],c=ui[h(19,o+2)][1],n-=(m=(e>=0?_:-_)*(l+y*(c-s)/2+y*y*(c-2*l+s)/2)-e)*S}while(i(m)>x&&--b>0);break}}while(--o>=0);var w=ui[o][0],T=ui[o+1][0],k=ui[h(19,o+2)][0];return[t/(T+y*(k-w)/2+y*y*(k-2*T+w)/2),n*E]};var di=1e-4,vi=1e4,gi=-180,yi=gi+di,mi=180,xi=mi-di,bi=-90,_i=bi+di,wi=90,Ti=wi-di;function ki(t){return t.length>0}function Ai(t){return t===bi||t===wi?[0,t]:[gi,(e=t,Math.floor(e*vi)/vi)];var e}function Mi(t){var e=t[0],r=t[1],n=!1;return e<=yi?(e=gi,n=!0):e>=xi&&(e=mi,n=!0),r<=_i?(r=bi,n=!0):r>=Ti&&(r=wi,n=!0),n?[e,r]:t}function Si(t){return t.map(Mi)}function Ei(t,e,r){for(var n=0,i=t.length;n=xi||c<=_i||c>=Ti){a[o]=Mi(l);for(var f=o+1;fyi&&p_i&&d=s)break;r.push({index:-1,polygon:e,ring:a=a.slice(f-1)}),a[0]=Ai(a[0][1]),o=-1,s=a.length}}}}function Li(t){var e,r,n,i,a,o,s=t.length,l={},u={};for(e=0;e0?b-l:l)*S],c=(0,n.Z)(t(s)).rotate(u),f=(0,_t.Z)(u),h=c.center;return delete c.rotate,c.center=function(t){return arguments.length?h(f(t)):f.invert(h())},c.clipAngle(90)}function Ri(t){var e=s(t);function r(t,r){var n=(0,Rn.M)(t,r);return n[0]*=e,n}return r.invert=function(t,r){return Rn.M.invert(t/e,r)},r}function Fi(){return Bi([-158,21.5],[-77,39]).clipAngle(60).scale(400)}function Bi(t,e){return zi(Ri,t,e)}function Ni(t){if(!(t*=2))return Z.N;var e=-t/2,r=-e,n=t*t,i=y(r),a=.5/g(r);function l(i,a){var o=C(s(a)*s(i-e)),l=C(s(a)*s(i-r));return[((o*=o)-(l*=l))/(2*t),(a<0?-1:1)*P(4*n*l-(n-o+l)*(n-o+l))/(2*t)]}return l.invert=function(t,n){var l,u,c=n*n,f=s(P(c+(l=t+e)*l)),h=s(P(c+(l=t+r)*l));return[o(u=f-h,l=(f+h)*i),(n<0?-1:1)*C(P(l*l+u*u)*a)]},l}function ji(){return Ui([-158,21.5],[-77,39]).clipAngle(130).scale(122.571)}function Ui(t,e){return zi(Ni,t,e)}function Vi(t,e){if(i(e)m&&--l>0);return[v(t)*(P(a*a+4)+a)*b/4,_*s]};var Qi=4*b+3*P(3),ta=2*P(2*b*P(3)/Qi),ea=it(ta*P(3)/b,ta,Qi/6);function ra(){return(0,n.Z)(ea).scale(176.84)}function na(t,e){return[t*P(1-3*e*e/(b*b)),e]}function ia(){return(0,n.Z)(na).scale(152.63)}function aa(t,e){var r=s(e),n=s(t)*r,i=1-n,a=s(t=o(g(t)*r,-g(e))),l=g(t);return[l*(r=P(1-n*n))-a*i,-a*r-l*i]}function oa(){return(0,n.Z)(aa).rotate([0,-90,45]).scale(124.75).clipAngle(179.999)}function sa(t,e){var r=R(t,e);return[(r[0]+t/_)/2,(r[1]+e)/2]}function la(){return(0,n.Z)(sa).scale(158.837)}na.invert=function(t,e){return[t/P(1-3*e*e/(b*b)),e]},aa.invert=function(t,e){var r=(t*t+e*e)/-2,n=P(-r*(2+r)),i=e*r+t*n,a=t*r-e*n,s=P(a*a+i*i);return[o(n*i,s*(1+r)),s?-L(n*a/s):0]},sa.invert=function(t,e){var r=t,n=e,a=25;do{var o,l=s(n),u=g(n),c=g(2*n),f=u*u,h=l*l,p=g(r),d=s(r/2),v=g(r/2),y=v*v,x=1-h*d*d,b=x?C(l*d)*P(o=1/x):o=0,w=.5*(2*b*l*v+r/_)-t,T=.5*(b*u+n)-e,k=.5*o*(h*y+b*l*d*f)+.5/_,A=o*(p*c/4-b*u*v),M=.125*o*(c*v-b*u*h*p),S=.5*o*(f*d+b*y*l)+.5,E=A*M-S*k,L=(T*A-w*S)/E,O=(w*M-T*k)/E;r-=L,n-=O}while((i(L)>m||i(O)>m)&&--a>0);return[r,n]}},33940:function(t,e,r){"use strict";function n(){return new i}function i(){this.reset()}r.d(e,{Z:function(){return n}}),i.prototype={constructor:i,reset:function(){this.s=this.t=0},add:function(t){o(a,t,this.t),o(this,a.s,this.s),this.s?this.t+=a.t:this.s=a.t},valueOf:function(){return this.s}};var a=new i;function o(t,e,r){var n=t.s=e+r,i=n-e,a=n-i;t.t=e-a+(r-i)}},97860:function(t,e,r){"use strict";r.d(e,{L9:function(){return h},ZP:function(){return x},gL:function(){return d}});var n,i,a,o,s,l=r(33940),u=r(39695),c=r(73182),f=r(72736),h=(0,l.Z)(),p=(0,l.Z)(),d={point:c.Z,lineStart:c.Z,lineEnd:c.Z,polygonStart:function(){h.reset(),d.lineStart=v,d.lineEnd=g},polygonEnd:function(){var t=+h;p.add(t<0?u.BZ+t:t),this.lineStart=this.lineEnd=this.point=c.Z},sphere:function(){p.add(u.BZ)}};function v(){d.point=y}function g(){m(n,i)}function y(t,e){d.point=m,n=t,i=e,t*=u.uR,e*=u.uR,a=t,o=(0,u.mC)(e=e/2+u.pu),s=(0,u.O$)(e)}function m(t,e){t*=u.uR,e=(e*=u.uR)/2+u.pu;var r=t-a,n=r>=0?1:-1,i=n*r,l=(0,u.mC)(e),c=(0,u.O$)(e),f=s*c,p=o*l+f*(0,u.mC)(i),d=f*n*(0,u.O$)(i);h.add((0,u.fv)(d,p)),a=t,o=l,s=c}function x(t){return p.reset(),(0,f.Z)(t,d),2*p}},77338:function(t,e,r){"use strict";r.d(e,{Z:function(){return C}});var n,i,a,o,s,l,u,c,f,h,p=r(33940),d=r(97860),v=r(7620),g=r(39695),y=r(72736),m=(0,p.Z)(),x={point:b,lineStart:w,lineEnd:T,polygonStart:function(){x.point=k,x.lineStart=A,x.lineEnd=M,m.reset(),d.gL.polygonStart()},polygonEnd:function(){d.gL.polygonEnd(),x.point=b,x.lineStart=w,x.lineEnd=T,d.L9<0?(n=-(a=180),i=-(o=90)):m>g.Ho?o=90:m<-g.Ho&&(i=-90),h[0]=n,h[1]=a},sphere:function(){n=-(a=180),i=-(o=90)}};function b(t,e){f.push(h=[n=t,a=t]),eo&&(o=e)}function _(t,e){var r=(0,v.Og)([t*g.uR,e*g.uR]);if(c){var l=(0,v.T5)(c,r),u=[l[1],-l[0],0],p=(0,v.T5)(u,l);(0,v.iJ)(p),p=(0,v.Y1)(p);var d,y=t-s,m=y>0?1:-1,x=p[0]*g.RW*m,b=(0,g.Wn)(y)>180;b^(m*so&&(o=d):b^(m*s<(x=(x+360)%360-180)&&xo&&(o=e)),b?tS(n,a)&&(a=t):S(t,a)>S(n,a)&&(n=t):a>=n?(ta&&(a=t)):t>s?S(n,t)>S(n,a)&&(a=t):S(t,a)>S(n,a)&&(n=t)}else f.push(h=[n=t,a=t]);eo&&(o=e),c=r,s=t}function w(){x.point=_}function T(){h[0]=n,h[1]=a,x.point=b,c=null}function k(t,e){if(c){var r=t-s;m.add((0,g.Wn)(r)>180?r+(r>0?360:-360):r)}else l=t,u=e;d.gL.point(t,e),_(t,e)}function A(){d.gL.lineStart()}function M(){k(l,u),d.gL.lineEnd(),(0,g.Wn)(m)>g.Ho&&(n=-(a=180)),h[0]=n,h[1]=a,c=null}function S(t,e){return(e-=t)<0?e+360:e}function E(t,e){return t[0]-e[0]}function L(t,e){return t[0]<=t[1]?t[0]<=e&&e<=t[1]:eS(s[0],s[1])&&(s[1]=l[1]),S(l[0],s[1])>S(s[0],s[1])&&(s[0]=l[0])):u.push(s=l);for(c=-1/0,e=0,s=u[r=u.length-1];e<=r;s=l,++e)l=u[e],(p=S(s[1],l[0]))>c&&(c=p,n=l[0],a=s[1])}return f=h=null,n===1/0||i===1/0?[[NaN,NaN],[NaN,NaN]]:[[n,i],[a,o]]}},7620:function(t,e,r){"use strict";r.d(e,{Og:function(){return a},T:function(){return u},T5:function(){return s},Y1:function(){return i},iJ:function(){return c},j9:function(){return o},s0:function(){return l}});var n=r(39695);function i(t){return[(0,n.fv)(t[1],t[0]),(0,n.ZR)(t[2])]}function a(t){var e=t[0],r=t[1],i=(0,n.mC)(r);return[i*(0,n.mC)(e),i*(0,n.O$)(e),(0,n.O$)(r)]}function o(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function s(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function l(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function u(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function c(t){var e=(0,n._b)(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}},66624:function(t,e,r){"use strict";r.d(e,{Z:function(){return I}});var n,i,a,o,s,l,u,c,f,h,p,d,v,g,y,m,x=r(39695),b=r(73182),_=r(72736),w={sphere:b.Z,point:T,lineStart:A,lineEnd:E,polygonStart:function(){w.lineStart=L,w.lineEnd=C},polygonEnd:function(){w.lineStart=A,w.lineEnd=E}};function T(t,e){t*=x.uR,e*=x.uR;var r=(0,x.mC)(e);k(r*(0,x.mC)(t),r*(0,x.O$)(t),(0,x.O$)(e))}function k(t,e,r){++n,a+=(t-a)/n,o+=(e-o)/n,s+=(r-s)/n}function A(){w.point=M}function M(t,e){t*=x.uR,e*=x.uR;var r=(0,x.mC)(e);g=r*(0,x.mC)(t),y=r*(0,x.O$)(t),m=(0,x.O$)(e),w.point=S,k(g,y,m)}function S(t,e){t*=x.uR,e*=x.uR;var r=(0,x.mC)(e),n=r*(0,x.mC)(t),a=r*(0,x.O$)(t),o=(0,x.O$)(e),s=(0,x.fv)((0,x._b)((s=y*o-m*a)*s+(s=m*n-g*o)*s+(s=g*a-y*n)*s),g*n+y*a+m*o);i+=s,l+=s*(g+(g=n)),u+=s*(y+(y=a)),c+=s*(m+(m=o)),k(g,y,m)}function E(){w.point=T}function L(){w.point=P}function C(){O(d,v),w.point=T}function P(t,e){d=t,v=e,t*=x.uR,e*=x.uR,w.point=O;var r=(0,x.mC)(e);g=r*(0,x.mC)(t),y=r*(0,x.O$)(t),m=(0,x.O$)(e),k(g,y,m)}function O(t,e){t*=x.uR,e*=x.uR;var r=(0,x.mC)(e),n=r*(0,x.mC)(t),a=r*(0,x.O$)(t),o=(0,x.O$)(e),s=y*o-m*a,d=m*n-g*o,v=g*a-y*n,b=(0,x._b)(s*s+d*d+v*v),_=(0,x.ZR)(b),w=b&&-_/b;f+=w*s,h+=w*d,p+=w*v,i+=_,l+=_*(g+(g=n)),u+=_*(y+(y=a)),c+=_*(m+(m=o)),k(g,y,m)}function I(t){n=i=a=o=s=l=u=c=f=h=p=0,(0,_.Z)(t,w);var e=f,r=h,d=p,v=e*e+r*r+d*d;return v0?os)&&(o+=i*a.BZ));for(var h,p=o;i>0?p>s:p0?i.pi:-i.pi,u=(0,i.Wn)(o-r);(0,i.Wn)(u-i.pi)0?i.ou:-i.ou),t.point(a,n),t.lineEnd(),t.lineStart(),t.point(l,n),t.point(o,n),e=0):a!==l&&u>=i.pi&&((0,i.Wn)(r-a)i.Ho?(0,i.z4)(((0,i.O$)(e)*(o=(0,i.mC)(n))*(0,i.O$)(r)-(0,i.O$)(n)*(a=(0,i.mC)(e))*(0,i.O$)(t))/(a*o*s)):(e+n)/2}(r,n,o,s),t.point(a,n),t.lineEnd(),t.lineStart(),t.point(l,n),e=0),t.point(r=o,n=s),a=l},lineEnd:function(){t.lineEnd(),r=n=NaN},clean:function(){return 2-e}}}),(function(t,e,r,n){var a;if(null==t)a=r*i.ou,n.point(-i.pi,a),n.point(0,a),n.point(i.pi,a),n.point(i.pi,0),n.point(i.pi,-a),n.point(0,-a),n.point(-i.pi,-a),n.point(-i.pi,0),n.point(-i.pi,a);else if((0,i.Wn)(t[0]-e[0])>i.Ho){var o=t[0]1&&e.push(e.pop().concat(e.shift()))},result:function(){var r=e;return e=[],t=null,r}}}},1457:function(t,e,r){"use strict";r.d(e,{Z:function(){return l}});var n=r(7620),i=r(7613),a=r(39695),o=r(67108),s=r(97023);function l(t){var e=(0,a.mC)(t),r=6*a.uR,l=e>0,u=(0,a.Wn)(e)>a.Ho;function c(t,r){return(0,a.mC)(t)*(0,a.mC)(r)>e}function f(t,r,i){var o=(0,n.Og)(t),s=(0,n.Og)(r),l=[1,0,0],u=(0,n.T5)(o,s),c=(0,n.j9)(u,u),f=u[0],h=c-f*f;if(!h)return!i&&t;var p=e*c/h,d=-e*f/h,v=(0,n.T5)(l,u),g=(0,n.T)(l,p),y=(0,n.T)(u,d);(0,n.s0)(g,y);var m=v,x=(0,n.j9)(g,m),b=(0,n.j9)(m,m),_=x*x-b*((0,n.j9)(g,g)-1);if(!(_<0)){var w=(0,a._b)(_),T=(0,n.T)(m,(-x-w)/b);if((0,n.s0)(T,g),T=(0,n.Y1)(T),!i)return T;var k,A=t[0],M=r[0],S=t[1],E=r[1];M0^T[1]<((0,a.Wn)(T[0]-A)a.pi^(A<=T[0]&&T[0]<=M)){var P=(0,n.T)(m,(-x+w)/b);return(0,n.s0)(P,g),[T,(0,n.Y1)(P)]}}}function h(e,r){var n=l?t:a.pi-t,i=0;return e<-n?i|=1:e>n&&(i|=2),r<-n?i|=4:r>n&&(i|=8),i}return(0,s.Z)(c,(function(t){var e,r,n,i,s;return{lineStart:function(){i=n=!1,s=1},point:function(p,d){var v,g=[p,d],y=c(p,d),m=l?y?0:h(p,d):y?h(p+(p<0?a.pi:-a.pi),d):0;if(!e&&(i=n=y)&&t.lineStart(),y!==n&&(!(v=f(e,g))||(0,o.Z)(e,v)||(0,o.Z)(g,v))&&(g[2]=1),y!==n)s=0,y?(t.lineStart(),v=f(g,e),t.point(v[0],v[1])):(v=f(e,g),t.point(v[0],v[1],2),t.lineEnd()),e=v;else if(u&&e&&l^y){var x;m&r||!(x=f(g,e,!0))||(s=0,l?(t.lineStart(),t.point(x[0][0],x[0][1]),t.point(x[1][0],x[1][1]),t.lineEnd()):(t.point(x[1][0],x[1][1]),t.lineEnd(),t.lineStart(),t.point(x[0][0],x[0][1],3)))}!y||e&&(0,o.Z)(e,g)||t.point(g[0],g[1]),e=g,n=y,r=m},lineEnd:function(){n&&t.lineEnd(),e=null},clean:function(){return s|(i&&n)<<1}}}),(function(e,n,a,o){(0,i.m)(o,t,r,a,e,n)}),l?[0,-t]:[-a.pi,t-a.pi])}},97023:function(t,e,r){"use strict";r.d(e,{Z:function(){return l}});var n=r(85272),i=r(46225),a=r(39695),o=r(23071),s=r(33064);function l(t,e,r,a){return function(l){var f,h,p,d=e(l),v=(0,n.Z)(),g=e(v),y=!1,m={point:x,lineStart:_,lineEnd:w,polygonStart:function(){m.point=T,m.lineStart=k,m.lineEnd=A,h=[],f=[]},polygonEnd:function(){m.point=x,m.lineStart=_,m.lineEnd=w,h=(0,s.TS)(h);var t=(0,o.Z)(f,a);h.length?(y||(l.polygonStart(),y=!0),(0,i.Z)(h,c,t,r,l)):t&&(y||(l.polygonStart(),y=!0),l.lineStart(),r(null,null,1,l),l.lineEnd()),y&&(l.polygonEnd(),y=!1),h=f=null},sphere:function(){l.polygonStart(),l.lineStart(),r(null,null,1,l),l.lineEnd(),l.polygonEnd()}};function x(e,r){t(e,r)&&l.point(e,r)}function b(t,e){d.point(t,e)}function _(){m.point=b,d.lineStart()}function w(){m.point=x,d.lineEnd()}function T(t,e){p.push([t,e]),g.point(t,e)}function k(){g.lineStart(),p=[]}function A(){T(p[0][0],p[0][1]),g.lineEnd();var t,e,r,n,i=g.clean(),a=v.result(),o=a.length;if(p.pop(),f.push(p),p=null,o)if(1&i){if((e=(r=a[0]).length-1)>0){for(y||(l.polygonStart(),y=!0),l.lineStart(),t=0;t1&&2&i&&a.push(a.pop().concat(a.shift())),h.push(a.filter(u))}return m}}function u(t){return t.length>1}function c(t,e){return((t=t.x)[0]<0?t[1]-a.ou-a.Ho:a.ou-t[1])-((e=e.x)[0]<0?e[1]-a.ou-a.Ho:a.ou-e[1])}},87605:function(t,e,r){"use strict";r.d(e,{Z:function(){return u}});var n=r(39695),i=r(85272),a=r(46225),o=r(33064),s=1e9,l=-s;function u(t,e,r,u){function c(n,i){return t<=n&&n<=r&&e<=i&&i<=u}function f(n,i,a,o){var s=0,l=0;if(null==n||(s=h(n,a))!==(l=h(i,a))||d(n,i)<0^a>0)do{o.point(0===s||3===s?t:r,s>1?u:e)}while((s=(s+a+4)%4)!==l);else o.point(i[0],i[1])}function h(i,a){return(0,n.Wn)(i[0]-t)0?0:3:(0,n.Wn)(i[0]-r)0?2:1:(0,n.Wn)(i[1]-e)0?1:0:a>0?3:2}function p(t,e){return d(t.x,e.x)}function d(t,e){var r=h(t,1),n=h(e,1);return r!==n?r-n:0===r?e[1]-t[1]:1===r?t[0]-e[0]:2===r?t[1]-e[1]:e[0]-t[0]}return function(n){var h,d,v,g,y,m,x,b,_,w,T,k=n,A=(0,i.Z)(),M={point:S,lineStart:function(){M.point=E,d&&d.push(v=[]),w=!0,_=!1,x=b=NaN},lineEnd:function(){h&&(E(g,y),m&&_&&A.rejoin(),h.push(A.result())),M.point=S,_&&k.lineEnd()},polygonStart:function(){k=A,h=[],d=[],T=!0},polygonEnd:function(){var e=function(){for(var e=0,r=0,n=d.length;ru&&(f-i)*(u-a)>(h-a)*(t-i)&&++e:h<=u&&(f-i)*(u-a)<(h-a)*(t-i)&&--e;return e}(),r=T&&e,i=(h=(0,o.TS)(h)).length;(r||i)&&(n.polygonStart(),r&&(n.lineStart(),f(null,null,1,n),n.lineEnd()),i&&(0,a.Z)(h,p,e,f,n),n.polygonEnd()),k=n,h=d=v=null}};function S(t,e){c(t,e)&&k.point(t,e)}function E(n,i){var a=c(n,i);if(d&&v.push([n,i]),w)g=n,y=i,m=a,w=!1,a&&(k.lineStart(),k.point(n,i));else if(a&&_)k.point(n,i);else{var o=[x=Math.max(l,Math.min(s,x)),b=Math.max(l,Math.min(s,b))],f=[n=Math.max(l,Math.min(s,n)),i=Math.max(l,Math.min(s,i))];!function(t,e,r,n,i,a){var o,s=t[0],l=t[1],u=0,c=1,f=e[0]-s,h=e[1]-l;if(o=r-s,f||!(o>0)){if(o/=f,f<0){if(o0){if(o>c)return;o>u&&(u=o)}if(o=i-s,f||!(o<0)){if(o/=f,f<0){if(o>c)return;o>u&&(u=o)}else if(f>0){if(o0)){if(o/=h,h<0){if(o0){if(o>c)return;o>u&&(u=o)}if(o=a-l,h||!(o<0)){if(o/=h,h<0){if(o>c)return;o>u&&(u=o)}else if(h>0){if(o0&&(t[0]=s+u*f,t[1]=l+u*h),c<1&&(e[0]=s+c*f,e[1]=l+c*h),!0}}}}}(o,f,t,e,r,u)?a&&(k.lineStart(),k.point(n,i),T=!1):(_||(k.lineStart(),k.point(o[0],o[1])),k.point(f[0],f[1]),a||k.lineEnd(),T=!1)}x=n,b=i,_=a}return M}}},46225:function(t,e,r){"use strict";r.d(e,{Z:function(){return o}});var n=r(67108),i=r(39695);function a(t,e,r,n){this.x=t,this.z=e,this.o=r,this.e=n,this.v=!1,this.n=this.p=null}function o(t,e,r,o,l){var u,c,f=[],h=[];if(t.forEach((function(t){if(!((e=t.length-1)<=0)){var e,r,o=t[0],s=t[e];if((0,n.Z)(o,s)){if(!o[2]&&!s[2]){for(l.lineStart(),u=0;u=0;--u)l.point((d=p[u])[0],d[1]);else o(g.x,g.p.x,-1,l);g=g.p}p=(g=g.o).z,y=!y}while(!g.v);l.lineEnd()}}}function s(t){if(e=t.length){for(var e,r,n=0,i=t[0];++n0&&(i=S(t[a],t[a-1]))>0&&r<=i&&n<=i&&(r+n-i)*(1-Math.pow((r-n)/i,2))g.Ho})).map(l)).concat((0,F.w6)((0,g.mD)(a/p)*p,i,p).filter((function(t){return(0,g.Wn)(t%v)>g.Ho})).map(u))}return m.lines=function(){return x().map((function(t){return{type:"LineString",coordinates:t}}))},m.outline=function(){return{type:"Polygon",coordinates:[c(n).concat(f(o).slice(1),c(r).reverse().slice(1),f(s).reverse().slice(1))]}},m.extent=function(t){return arguments.length?m.extentMajor(t).extentMinor(t):m.extentMinor()},m.extentMajor=function(t){return arguments.length?(n=+t[0][0],r=+t[1][0],s=+t[0][1],o=+t[1][1],n>r&&(t=n,n=r,r=t),s>o&&(t=s,s=o,o=t),m.precision(y)):[[n,s],[r,o]]},m.extentMinor=function(r){return arguments.length?(e=+r[0][0],t=+r[1][0],a=+r[0][1],i=+r[1][1],e>t&&(r=e,e=t,t=r),a>i&&(r=a,a=i,i=r),m.precision(y)):[[e,a],[t,i]]},m.step=function(t){return arguments.length?m.stepMajor(t).stepMinor(t):m.stepMinor()},m.stepMajor=function(t){return arguments.length?(d=+t[0],v=+t[1],m):[d,v]},m.stepMinor=function(t){return arguments.length?(h=+t[0],p=+t[1],m):[h,p]},m.precision=function(h){return arguments.length?(y=+h,l=B(a,i,90),u=N(e,t,y),c=B(s,o,90),f=N(n,r,y),m):y},m.extentMajor([[-180,-90+g.Ho],[180,90-g.Ho]]).extentMinor([[-180,-80-g.Ho],[180,80+g.Ho]])}function U(){return j()()}var V,H,q,G,Z=r(83074),Y=r(8593),W=(0,v.Z)(),X=(0,v.Z)(),J={point:y.Z,lineStart:y.Z,lineEnd:y.Z,polygonStart:function(){J.lineStart=K,J.lineEnd=tt},polygonEnd:function(){J.lineStart=J.lineEnd=J.point=y.Z,W.add((0,g.Wn)(X)),X.reset()},result:function(){var t=W/2;return W.reset(),t}};function K(){J.point=$}function $(t,e){J.point=Q,V=q=t,H=G=e}function Q(t,e){X.add(G*t-q*e),q=t,G=e}function tt(){Q(V,H)}var et,rt,nt,it,at=J,ot=r(3559),st=0,lt=0,ut=0,ct=0,ft=0,ht=0,pt=0,dt=0,vt=0,gt={point:yt,lineStart:mt,lineEnd:_t,polygonStart:function(){gt.lineStart=wt,gt.lineEnd=Tt},polygonEnd:function(){gt.point=yt,gt.lineStart=mt,gt.lineEnd=_t},result:function(){var t=vt?[pt/vt,dt/vt]:ht?[ct/ht,ft/ht]:ut?[st/ut,lt/ut]:[NaN,NaN];return st=lt=ut=ct=ft=ht=pt=dt=vt=0,t}};function yt(t,e){st+=t,lt+=e,++ut}function mt(){gt.point=xt}function xt(t,e){gt.point=bt,yt(nt=t,it=e)}function bt(t,e){var r=t-nt,n=e-it,i=(0,g._b)(r*r+n*n);ct+=i*(nt+t)/2,ft+=i*(it+e)/2,ht+=i,yt(nt=t,it=e)}function _t(){gt.point=yt}function wt(){gt.point=kt}function Tt(){At(et,rt)}function kt(t,e){gt.point=At,yt(et=nt=t,rt=it=e)}function At(t,e){var r=t-nt,n=e-it,i=(0,g._b)(r*r+n*n);ct+=i*(nt+t)/2,ft+=i*(it+e)/2,ht+=i,pt+=(i=it*t-nt*e)*(nt+t),dt+=i*(it+e),vt+=3*i,yt(nt=t,it=e)}var Mt=gt;function St(t){this._context=t}St.prototype={_radius:4.5,pointRadius:function(t){return this._radius=t,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._context.closePath(),this._point=NaN},point:function(t,e){switch(this._point){case 0:this._context.moveTo(t,e),this._point=1;break;case 1:this._context.lineTo(t,e);break;default:this._context.moveTo(t+this._radius,e),this._context.arc(t,e,this._radius,0,g.BZ)}},result:y.Z};var Et,Lt,Ct,Pt,Ot,It=(0,v.Z)(),Dt={point:y.Z,lineStart:function(){Dt.point=zt},lineEnd:function(){Et&&Rt(Lt,Ct),Dt.point=y.Z},polygonStart:function(){Et=!0},polygonEnd:function(){Et=null},result:function(){var t=+It;return It.reset(),t}};function zt(t,e){Dt.point=Rt,Lt=Pt=t,Ct=Ot=e}function Rt(t,e){Pt-=t,Ot-=e,It.add((0,g._b)(Pt*Pt+Ot*Ot)),Pt=t,Ot=e}var Ft=Dt;function Bt(){this._string=[]}function Nt(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function jt(t,e){var r,n,i=4.5;function a(t){return t&&("function"==typeof i&&n.pointRadius(+i.apply(this,arguments)),(0,m.Z)(t,r(n))),n.result()}return a.area=function(t){return(0,m.Z)(t,r(at)),at.result()},a.measure=function(t){return(0,m.Z)(t,r(Ft)),Ft.result()},a.bounds=function(t){return(0,m.Z)(t,r(ot.Z)),ot.Z.result()},a.centroid=function(t){return(0,m.Z)(t,r(Mt)),Mt.result()},a.projection=function(e){return arguments.length?(r=null==e?(t=null,Y.Z):(t=e).stream,a):t},a.context=function(t){return arguments.length?(n=null==t?(e=null,new Bt):new St(e=t),"function"!=typeof i&&n.pointRadius(i),a):e},a.pointRadius=function(t){return arguments.length?(i="function"==typeof t?t:(n.pointRadius(+t),+t),a):i},a.projection(t).context(e)}Bt.prototype={_radius:4.5,_circle:Nt(4.5),pointRadius:function(t){return(t=+t)!==this._radius&&(this._radius=t,this._circle=null),this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._string.push("Z"),this._point=NaN},point:function(t,e){switch(this._point){case 0:this._string.push("M",t,",",e),this._point=1;break;case 1:this._string.push("L",t,",",e);break;default:null==this._circle&&(this._circle=Nt(this._radius)),this._string.push("M",t,",",e,this._circle)}},result:function(){if(this._string.length){var t=this._string.join("");return this._string=[],t}return null}};var Ut=r(15002);function Vt(t){var e=0,r=g.pi/3,n=(0,Ut.r)(t),i=n(e,r);return i.parallels=function(t){return arguments.length?n(e=t[0]*g.uR,r=t[1]*g.uR):[e*g.RW,r*g.RW]},i}function Ht(t,e){var r=(0,g.O$)(t),n=(r+(0,g.O$)(e))/2;if((0,g.Wn)(n)=.12&&i<.234&&n>=-.425&&n<-.214?s:i>=.166&&i<.234&&n>=-.214&&n<-.115?l:o).invert(t)},c.stream=function(r){return t&&e===r?t:(n=[o.stream(e=r),s.stream(r),l.stream(r)],i=n.length,t={point:function(t,e){for(var r=-1;++r0?e<-g.ou+g.Ho&&(e=-g.ou+g.Ho):e>g.ou-g.Ho&&(e=g.ou-g.Ho);var r=i/(0,g.sQ)(te(e),n);return[r*(0,g.O$)(n*t),i-r*(0,g.mC)(n*t)]}return a.invert=function(t,e){var r=i-e,a=(0,g.Xx)(n)*(0,g._b)(t*t+r*r),o=(0,g.fv)(t,(0,g.Wn)(r))*(0,g.Xx)(r);return r*n<0&&(o-=g.pi*(0,g.Xx)(t)*(0,g.Xx)(r)),[o/n,2*(0,g.z4)((0,g.sQ)(i/a,1/n))-g.ou]},a}function re(){return Vt(ee).scale(109.5).parallels([30,30])}Kt.invert=function(t,e){return[t,2*(0,g.z4)((0,g.Qq)(e))-g.ou]};var ne=r(97492);function ie(t,e){var r=(0,g.mC)(t),n=t===e?(0,g.O$)(t):(r-(0,g.mC)(e))/(e-t),i=r/n+t;if((0,g.Wn)(n)2?t[2]+90:90]):[(t=r())[0],t[1],t[2]-90]},r([0,0,90]).scale(159.155)}xe.invert=(0,me.O)((function(t){return 2*(0,g.z4)(t)})),_e.invert=function(t,e){return[-e,2*(0,g.z4)((0,g.Qq)(t))-g.ou]}},83074:function(t,e,r){"use strict";r.d(e,{Z:function(){return i}});var n=r(39695);function i(t,e){var r=t[0]*n.uR,i=t[1]*n.uR,a=e[0]*n.uR,o=e[1]*n.uR,s=(0,n.mC)(i),l=(0,n.O$)(i),u=(0,n.mC)(o),c=(0,n.O$)(o),f=s*(0,n.mC)(r),h=s*(0,n.O$)(r),p=u*(0,n.mC)(a),d=u*(0,n.O$)(a),v=2*(0,n.ZR)((0,n._b)((0,n.Jy)(o-i)+s*u*(0,n.Jy)(a-r))),g=(0,n.O$)(v),y=v?function(t){var e=(0,n.O$)(t*=v)/g,r=(0,n.O$)(v-t)/g,i=r*f+e*p,a=r*h+e*d,o=r*l+e*c;return[(0,n.fv)(a,i)*n.RW,(0,n.fv)(o,(0,n._b)(i*i+a*a))*n.RW]}:function(){return[r*n.RW,i*n.RW]};return y.distance=v,y}},39695:function(t,e,r){"use strict";r.d(e,{BZ:function(){return l},Ho:function(){return n},Jy:function(){return A},Kh:function(){return T},O$:function(){return x},OR:function(){return w},Qq:function(){return g},RW:function(){return u},Wn:function(){return f},Xx:function(){return b},ZR:function(){return k},_b:function(){return _},aW:function(){return i},cM:function(){return y},fv:function(){return p},mC:function(){return d},mD:function(){return v},ou:function(){return o},pi:function(){return a},pu:function(){return s},sQ:function(){return m},uR:function(){return c},z4:function(){return h}});var n=1e-6,i=1e-12,a=Math.PI,o=a/2,s=a/4,l=2*a,u=180/a,c=a/180,f=Math.abs,h=Math.atan,p=Math.atan2,d=Math.cos,v=Math.ceil,g=Math.exp,y=(Math.floor,Math.log),m=Math.pow,x=Math.sin,b=Math.sign||function(t){return t>0?1:t<0?-1:0},_=Math.sqrt,w=Math.tan;function T(t){return t>1?0:t<-1?a:Math.acos(t)}function k(t){return t>1?o:t<-1?-o:Math.asin(t)}function A(t){return(t=x(t/2))*t}},73182:function(t,e,r){"use strict";function n(){}r.d(e,{Z:function(){return n}})},3559:function(t,e,r){"use strict";var n=r(73182),i=1/0,a=i,o=-i,s=o,l={point:function(t,e){to&&(o=t),es&&(s=e)},lineStart:n.Z,lineEnd:n.Z,polygonStart:n.Z,polygonEnd:n.Z,result:function(){var t=[[i,a],[o,s]];return o=s=-(a=i=1/0),t}};e.Z=l},67108:function(t,e,r){"use strict";r.d(e,{Z:function(){return i}});var n=r(39695);function i(t,e){return(0,n.Wn)(t[0]-e[0])=0?1:-1,L=E*S,C=L>a.pi,P=x*A;if(o.add((0,a.fv)(P*E*(0,a.O$)(L),b*M+P*(0,a.mC)(L))),c+=C?S+E*a.BZ:S,C^y>=r^T>=r){var O=(0,i.T5)((0,i.Og)(g),(0,i.Og)(w));(0,i.iJ)(O);var I=(0,i.T5)(u,O);(0,i.iJ)(I);var D=(C^S>=0?-1:1)*(0,a.ZR)(I[2]);(n>D||n===D&&(O[0]||O[1]))&&(f+=C^S>=0?1:-1)}}return(c<-a.Ho||c4*e&&y--){var w=o+p,T=s+v,k=u+g,A=(0,l._b)(w*w+T*T+k*k),M=(0,l.ZR)(k/=A),S=(0,l.Wn)((0,l.Wn)(k)-1)e||(0,l.Wn)((x*P+b*O)/_-.5)>.3||o*p+s*v+u*g2?t[2]%360*l.uR:0,V()):[L*l.RW,C*l.RW,P*l.RW]},j.angle=function(t){return arguments.length?(O=t%360*l.uR,V()):O*l.RW},j.reflectX=function(t){return arguments.length?(I=t?-1:1,V()):I<0},j.reflectY=function(t){return arguments.length?(D=t?-1:1,V()):D<0},j.precision=function(t){return arguments.length?(x=v(b,N=t*t),H()):(0,l._b)(N)},j.fitExtent=function(t,e){return(0,f.qg)(j,t,e)},j.fitSize=function(t,e){return(0,f.mF)(j,t,e)},j.fitWidth=function(t,e){return(0,f.V6)(j,t,e)},j.fitHeight=function(t,e){return(0,f.rf)(j,t,e)},function(){return e=t.apply(this,arguments),j.invert=e.invert&&U,V()}}},26867:function(t,e,r){"use strict";r.d(e,{K:function(){return a},Z:function(){return o}});var n=r(15002),i=r(39695);function a(t,e){var r=e*e,n=r*r;return[t*(.8707-.131979*r+n*(n*(.003971*r-.001529*n)-.013791)),e*(1.007226+r*(.015085+n*(.028874*r-.044475-.005916*n)))]}function o(){return(0,n.Z)(a).scale(175.295)}a.invert=function(t,e){var r,n=e,a=25;do{var o=n*n,s=o*o;n-=r=(n*(1.007226+o*(.015085+s*(.028874*o-.044475-.005916*s)))-e)/(1.007226+o*(.045255+s*(.259866*o-.311325-.005916*11*s)))}while((0,i.Wn)(r)>i.Ho&&--a>0);return[t/(.8707+(o=n*n)*(o*(o*o*o*(.003971-.001529*o)-.013791)-.131979)),n]}},57962:function(t,e,r){"use strict";r.d(e,{I:function(){return o},Z:function(){return s}});var n=r(39695),i=r(25382),a=r(15002);function o(t,e){return[(0,n.mC)(e)*(0,n.O$)(t),(0,n.O$)(e)]}function s(){return(0,a.Z)(o).scale(249.5).clipAngle(90+n.Ho)}o.invert=(0,i.O)(n.ZR)},49386:function(t,e,r){"use strict";r.d(e,{I:function(){return o},Z:function(){return c}});var n=r(96059),i=r(39695);function a(t,e){return[(0,i.Wn)(t)>i.pi?t+Math.round(-t/i.BZ)*i.BZ:t,e]}function o(t,e,r){return(t%=i.BZ)?e||r?(0,n.Z)(l(t),u(e,r)):l(t):e||r?u(e,r):a}function s(t){return function(e,r){return[(e+=t)>i.pi?e-i.BZ:e<-i.pi?e+i.BZ:e,r]}}function l(t){var e=s(t);return e.invert=s(-t),e}function u(t,e){var r=(0,i.mC)(t),n=(0,i.O$)(t),a=(0,i.mC)(e),o=(0,i.O$)(e);function s(t,e){var s=(0,i.mC)(e),l=(0,i.mC)(t)*s,u=(0,i.O$)(t)*s,c=(0,i.O$)(e),f=c*r+l*n;return[(0,i.fv)(u*a-f*o,l*r-c*n),(0,i.ZR)(f*a+u*o)]}return s.invert=function(t,e){var s=(0,i.mC)(e),l=(0,i.mC)(t)*s,u=(0,i.O$)(t)*s,c=(0,i.O$)(e),f=c*a-u*o;return[(0,i.fv)(u*a+c*o,l*r+f*n),(0,i.ZR)(f*r-l*n)]},s}function c(t){function e(e){return(e=t(e[0]*i.uR,e[1]*i.uR))[0]*=i.RW,e[1]*=i.RW,e}return t=o(t[0]*i.uR,t[1]*i.uR,t.length>2?t[2]*i.uR:0),e.invert=function(e){return(e=t.invert(e[0]*i.uR,e[1]*i.uR))[0]*=i.RW,e[1]*=i.RW,e},e}a.invert=a},72736:function(t,e,r){"use strict";function n(t,e){t&&a.hasOwnProperty(t.type)&&a[t.type](t,e)}r.d(e,{Z:function(){return l}});var i={Feature:function(t,e){n(t.geometry,e)},FeatureCollection:function(t,e){for(var r=t.features,i=-1,a=r.length;++i=0;)e+=r[n].value;else e=1;t.value=e}function l(t,e){var r,n,i,a,o,s=new h(t),l=+t.value&&(s.value=t.value),c=[s];for(null==e&&(e=u);r=c.pop();)if(l&&(r.value=+r.data.value),(i=e(r.data))&&(o=i.length))for(r.children=new Array(o),a=o-1;a>=0;--a)c.push(n=r.children[a]=new h(i[a])),n.parent=r,n.depth=r.depth+1;return s.eachBefore(f)}function u(t){return t.children}function c(t){t.data=t.data.data}function f(t){var e=0;do{t.height=e}while((t=t.parent)&&t.height<++e)}function h(t){this.data=t,this.depth=this.height=0,this.parent=null}r.r(e),r.d(e,{cluster:function(){return o},hierarchy:function(){return l},pack:function(){return O},packEnclose:function(){return d},packSiblings:function(){return S},partition:function(){return B},stratify:function(){return q},tree:function(){return K},treemap:function(){return rt},treemapBinary:function(){return nt},treemapDice:function(){return F},treemapResquarify:function(){return at},treemapSlice:function(){return $},treemapSliceDice:function(){return it},treemapSquarify:function(){return et}}),h.prototype=l.prototype={constructor:h,count:function(){return this.eachAfter(s)},each:function(t){var e,r,n,i,a=this,o=[a];do{for(e=o.reverse(),o=[];a=e.pop();)if(t(a),r=a.children)for(n=0,i=r.length;n=0;--r)i.push(e[r]);return this},sum:function(t){return this.eachAfter((function(e){for(var r=+t(e.data)||0,n=e.children,i=n&&n.length;--i>=0;)r+=n[i].value;e.value=r}))},sort:function(t){return this.eachBefore((function(e){e.children&&e.children.sort(t)}))},path:function(t){for(var e=this,r=function(t,e){if(t===e)return t;var r=t.ancestors(),n=e.ancestors(),i=null;for(t=r.pop(),e=n.pop();t===e;)i=t,t=r.pop(),e=n.pop();return i}(e,t),n=[e];e!==r;)e=e.parent,n.push(e);for(var i=n.length;t!==r;)n.splice(i,0,t),t=t.parent;return n},ancestors:function(){for(var t=this,e=[t];t=t.parent;)e.push(t);return e},descendants:function(){var t=[];return this.each((function(e){t.push(e)})),t},leaves:function(){var t=[];return this.eachBefore((function(e){e.children||t.push(e)})),t},links:function(){var t=this,e=[];return t.each((function(r){r!==t&&e.push({source:r.parent,target:r})})),e},copy:function(){return l(this).eachBefore(c)}};var p=Array.prototype.slice;function d(t){for(var e,r,n=0,i=(t=function(t){for(var e,r,n=t.length;n;)r=Math.random()*n--|0,e=t[n],t[n]=t[r],t[r]=e;return t}(p.call(t))).length,a=[];n0&&r*r>n*n+i*i}function m(t,e){for(var r=0;r(o*=o)?(n=(u+o-i)/(2*u),a=Math.sqrt(Math.max(0,o/u-n*n)),r.x=t.x-n*s-a*l,r.y=t.y-n*l+a*s):(n=(u+i-o)/(2*u),a=Math.sqrt(Math.max(0,i/u-n*n)),r.x=e.x+n*s-a*l,r.y=e.y+n*l+a*s)):(r.x=e.x+r.r,r.y=e.y)}function T(t,e){var r=t.r+e.r-1e-6,n=e.x-t.x,i=e.y-t.y;return r>0&&r*r>n*n+i*i}function k(t){var e=t._,r=t.next._,n=e.r+r.r,i=(e.x*r.r+r.x*e.r)/n,a=(e.y*r.r+r.y*e.r)/n;return i*i+a*a}function A(t){this._=t,this.next=null,this.previous=null}function M(t){if(!(i=t.length))return 0;var e,r,n,i,a,o,s,l,u,c,f;if((e=t[0]).x=0,e.y=0,!(i>1))return e.r;if(r=t[1],e.x=-r.r,r.x=e.r,r.y=0,!(i>2))return e.r+r.r;w(r,e,n=t[2]),e=new A(e),r=new A(r),n=new A(n),e.next=n.previous=r,r.next=e.previous=n,n.next=r.previous=e;t:for(s=3;s0)throw new Error("cycle");return a}return r.id=function(e){return arguments.length?(t=E(e),r):t},r.parentId=function(t){return arguments.length?(e=E(t),r):e},r}function G(t,e){return t.parent===e.parent?1:2}function Z(t){var e=t.children;return e?e[0]:t.t}function Y(t){var e=t.children;return e?e[e.length-1]:t.t}function W(t,e,r){var n=r/(e.i-t.i);e.c-=n,e.s+=r,t.c+=n,e.z+=r,e.m+=r}function X(t,e,r){return t.a.parent===e.parent?t.a:r}function J(t,e){this._=t,this.parent=null,this.children=null,this.A=null,this.a=this,this.z=0,this.m=0,this.c=0,this.s=0,this.t=null,this.i=e}function K(){var t=G,e=1,r=1,n=null;function i(i){var l=function(t){for(var e,r,n,i,a,o=new J(t,0),s=[o];e=s.pop();)if(n=e._.children)for(e.children=new Array(a=n.length),i=a-1;i>=0;--i)s.push(r=e.children[i]=new J(n[i],i)),r.parent=e;return(o.parent=new J(null,0)).children=[o],o}(i);if(l.eachAfter(a),l.parent.m=-l.z,l.eachBefore(o),n)i.eachBefore(s);else{var u=i,c=i,f=i;i.eachBefore((function(t){t.xc.x&&(c=t),t.depth>f.depth&&(f=t)}));var h=u===c?1:t(u,c)/2,p=h-u.x,d=e/(c.x+h+p),v=r/(f.depth||1);i.eachBefore((function(t){t.x=(t.x+p)*d,t.y=t.depth*v}))}return i}function a(e){var r=e.children,n=e.parent.children,i=e.i?n[e.i-1]:null;if(r){!function(t){for(var e,r=0,n=0,i=t.children,a=i.length;--a>=0;)(e=i[a]).z+=r,e.m+=r,r+=e.s+(n+=e.c)}(e);var a=(r[0].z+r[r.length-1].z)/2;i?(e.z=i.z+t(e._,i._),e.m=e.z-a):e.z=a}else i&&(e.z=i.z+t(e._,i._));e.parent.A=function(e,r,n){if(r){for(var i,a=e,o=e,s=r,l=a.parent.children[0],u=a.m,c=o.m,f=s.m,h=l.m;s=Y(s),a=Z(a),s&&a;)l=Z(l),(o=Y(o)).a=e,(i=s.z+f-a.z-u+t(s._,a._))>0&&(W(X(s,e,n),e,i),u+=i,c+=i),f+=s.m,u+=a.m,h+=l.m,c+=o.m;s&&!Y(o)&&(o.t=s,o.m+=f-c),a&&!Z(l)&&(l.t=a,l.m+=u-h,n=e)}return n}(e,i,e.parent.A||n[0])}function o(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function s(t){t.x*=e,t.y=t.depth*r}return i.separation=function(e){return arguments.length?(t=e,i):t},i.size=function(t){return arguments.length?(n=!1,e=+t[0],r=+t[1],i):n?null:[e,r]},i.nodeSize=function(t){return arguments.length?(n=!0,e=+t[0],r=+t[1],i):n?[e,r]:null},i}function $(t,e,r,n,i){for(var a,o=t.children,s=-1,l=o.length,u=t.value&&(i-r)/t.value;++sh&&(h=s),g=c*c*v,(p=Math.max(h/g,g/f))>d){c-=s;break}d=p}y.push(o={value:c,dice:l1?e:1)},r}(Q);function rt(){var t=et,e=!1,r=1,n=1,i=[0],a=L,o=L,s=L,l=L,u=L;function c(t){return t.x0=t.y0=0,t.x1=r,t.y1=n,t.eachBefore(f),i=[0],e&&t.eachBefore(R),t}function f(e){var r=i[e.depth],n=e.x0+r,c=e.y0+r,f=e.x1-r,h=e.y1-r;f=r-1){var c=s[e];return c.x0=i,c.y0=a,c.x1=o,void(c.y1=l)}for(var f=u[e],h=n/2+f,p=e+1,d=r-1;p>>1;u[v]l-a){var m=(i*y+o*g)/n;t(e,p,g,i,a,m,l),t(p,r,y,m,a,o,l)}else{var x=(a*y+l*g)/n;t(e,p,g,i,a,o,x),t(p,r,y,i,x,o,l)}}(0,l,t.value,e,r,n,i)}function it(t,e,r,n,i){(1&t.depth?$:F)(t,e,r,n,i)}var at=function t(e){function r(t,r,n,i,a){if((o=t._squarify)&&o.ratio===e)for(var o,s,l,u,c,f=-1,h=o.length,p=t.value;++f1?e:1)},r}(Q)},45879:function(t,e,r){"use strict";r.d(e,{h5:function(){return y}});var n=Math.PI,i=2*n,a=1e-6,o=i-a;function s(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function l(){return new s}s.prototype=l.prototype={constructor:s,moveTo:function(t,e){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)},closePath:function(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},lineTo:function(t,e){this._+="L"+(this._x1=+t)+","+(this._y1=+e)},quadraticCurveTo:function(t,e,r,n){this._+="Q"+ +t+","+ +e+","+(this._x1=+r)+","+(this._y1=+n)},bezierCurveTo:function(t,e,r,n,i,a){this._+="C"+ +t+","+ +e+","+ +r+","+ +n+","+(this._x1=+i)+","+(this._y1=+a)},arcTo:function(t,e,r,i,o){t=+t,e=+e,r=+r,i=+i,o=+o;var s=this._x1,l=this._y1,u=r-t,c=i-e,f=s-t,h=l-e,p=f*f+h*h;if(o<0)throw new Error("negative radius: "+o);if(null===this._x1)this._+="M"+(this._x1=t)+","+(this._y1=e);else if(p>a)if(Math.abs(h*u-c*f)>a&&o){var d=r-s,v=i-l,g=u*u+c*c,y=d*d+v*v,m=Math.sqrt(g),x=Math.sqrt(p),b=o*Math.tan((n-Math.acos((g+p-y)/(2*m*x)))/2),_=b/x,w=b/m;Math.abs(_-1)>a&&(this._+="L"+(t+_*f)+","+(e+_*h)),this._+="A"+o+","+o+",0,0,"+ +(h*d>f*v)+","+(this._x1=t+w*u)+","+(this._y1=e+w*c)}else this._+="L"+(this._x1=t)+","+(this._y1=e)},arc:function(t,e,r,s,l,u){t=+t,e=+e,u=!!u;var c=(r=+r)*Math.cos(s),f=r*Math.sin(s),h=t+c,p=e+f,d=1^u,v=u?s-l:l-s;if(r<0)throw new Error("negative radius: "+r);null===this._x1?this._+="M"+h+","+p:(Math.abs(this._x1-h)>a||Math.abs(this._y1-p)>a)&&(this._+="L"+h+","+p),r&&(v<0&&(v=v%i+i),v>o?this._+="A"+r+","+r+",0,1,"+d+","+(t-c)+","+(e-f)+"A"+r+","+r+",0,1,"+d+","+(this._x1=h)+","+(this._y1=p):v>a&&(this._+="A"+r+","+r+",0,"+ +(v>=n)+","+d+","+(this._x1=t+r*Math.cos(l))+","+(this._y1=e+r*Math.sin(l))))},rect:function(t,e,r,n){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +r+"v"+ +n+"h"+-r+"Z"},toString:function(){return this._}};var u=l,c=Array.prototype.slice;function f(t){return function(){return t}}function h(t){return t[0]}function p(t){return t[1]}function d(t){return t.source}function v(t){return t.target}function g(t,e,r,n,i){t.moveTo(e,r),t.bezierCurveTo(e=(e+n)/2,r,e,i,n,i)}function y(){return function(t){var e=d,r=v,n=h,i=p,a=null;function o(){var o,s=c.call(arguments),l=e.apply(this,s),f=r.apply(this,s);if(a||(a=o=u()),t(a,+n.apply(this,(s[0]=l,s)),+i.apply(this,s),+n.apply(this,(s[0]=f,s)),+i.apply(this,s)),o)return a=null,o+""||null}return o.source=function(t){return arguments.length?(e=t,o):e},o.target=function(t){return arguments.length?(r=t,o):r},o.x=function(t){return arguments.length?(n="function"==typeof t?t:f(+t),o):n},o.y=function(t){return arguments.length?(i="function"==typeof t?t:f(+t),o):i},o.context=function(t){return arguments.length?(a=null==t?null:t,o):a},o}(g)}},84096:function(t,e,r){"use strict";r.d(e,{i$:function(){return d},Dq:function(){return h},g0:function(){return v}});var n=r(58176),i=r(48480),a=r(59879),o=r(82301),s=r(34823),l=r(79791);function u(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function c(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function f(t,e,r){return{y:t,m:e,d:r,H:0,M:0,S:0,L:0}}function h(t){var e=t.dateTime,r=t.date,s=t.time,l=t.periods,h=t.days,p=t.shortDays,d=t.months,v=t.shortMonths,y=w(l),m=T(l),x=w(h),b=T(h),_=w(p),St=T(p),Et=w(d),Lt=T(d),Ct=w(v),Pt=T(v),Ot={a:function(t){return p[t.getDay()]},A:function(t){return h[t.getDay()]},b:function(t){return v[t.getMonth()]},B:function(t){return d[t.getMonth()]},c:null,d:q,e:q,f:X,H:G,I:Z,j:Y,L:W,m:J,M:K,p:function(t){return l[+(t.getHours()>=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:At,s:Mt,S:$,u:Q,U:tt,V:et,w:rt,W:nt,x:null,X:null,y:it,Y:at,Z:ot,"%":kt},It={a:function(t){return p[t.getUTCDay()]},A:function(t){return h[t.getUTCDay()]},b:function(t){return v[t.getUTCMonth()]},B:function(t){return d[t.getUTCMonth()]},c:null,d:st,e:st,f:ht,H:lt,I:ut,j:ct,L:ft,m:pt,M:dt,p:function(t){return l[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:At,s:Mt,S:vt,u:gt,U:yt,V:mt,w:xt,W:bt,x:null,X:null,y:_t,Y:wt,Z:Tt,"%":kt},Dt={a:function(t,e,r){var n=_.exec(e.slice(r));return n?(t.w=St[n[0].toLowerCase()],r+n[0].length):-1},A:function(t,e,r){var n=x.exec(e.slice(r));return n?(t.w=b[n[0].toLowerCase()],r+n[0].length):-1},b:function(t,e,r){var n=Ct.exec(e.slice(r));return n?(t.m=Pt[n[0].toLowerCase()],r+n[0].length):-1},B:function(t,e,r){var n=Et.exec(e.slice(r));return n?(t.m=Lt[n[0].toLowerCase()],r+n[0].length):-1},c:function(t,r,n){return Ft(t,e,r,n)},d:D,e:D,f:j,H:R,I:R,j:z,L:N,m:I,M:F,p:function(t,e,r){var n=y.exec(e.slice(r));return n?(t.p=m[n[0].toLowerCase()],r+n[0].length):-1},q:O,Q:V,s:H,S:B,u:A,U:M,V:S,w:k,W:E,x:function(t,e,n){return Ft(t,r,e,n)},X:function(t,e,r){return Ft(t,s,e,r)},y:C,Y:L,Z:P,"%":U};function zt(t,e){return function(r){var n,i,a,o=[],s=-1,l=0,u=t.length;for(r instanceof Date||(r=new Date(+r));++s53)return null;"w"in h||(h.w=1),"Z"in h?(l=(s=c(f(h.y,0,1))).getUTCDay(),s=l>4||0===l?n.l6.ceil(s):(0,n.l6)(s),s=i.Z.offset(s,7*(h.V-1)),h.y=s.getUTCFullYear(),h.m=s.getUTCMonth(),h.d=s.getUTCDate()+(h.w+6)%7):(l=(s=u(f(h.y,0,1))).getDay(),s=l>4||0===l?a.wA.ceil(s):(0,a.wA)(s),s=o.Z.offset(s,7*(h.V-1)),h.y=s.getFullYear(),h.m=s.getMonth(),h.d=s.getDate()+(h.w+6)%7)}else("W"in h||"U"in h)&&("w"in h||(h.w="u"in h?h.u%7:"W"in h?1:0),l="Z"in h?c(f(h.y,0,1)).getUTCDay():u(f(h.y,0,1)).getDay(),h.m=0,h.d="W"in h?(h.w+6)%7+7*h.W-(l+5)%7:h.w+7*h.U-(l+6)%7);return"Z"in h?(h.H+=h.Z/100|0,h.M+=h.Z%100,c(h)):u(h)}}function Ft(t,e,r,n){for(var i,a,o=0,s=e.length,l=r.length;o=l)return-1;if(37===(i=e.charCodeAt(o++))){if(i=e.charAt(o++),!(a=Dt[i in g?e.charAt(o++):i])||(n=a(t,r,n))<0)return-1}else if(i!=r.charCodeAt(n++))return-1}return n}return Ot.x=zt(r,Ot),Ot.X=zt(s,Ot),Ot.c=zt(e,Ot),It.x=zt(r,It),It.X=zt(s,It),It.c=zt(e,It),{format:function(t){var e=zt(t+="",Ot);return e.toString=function(){return t},e},parse:function(t){var e=Rt(t+="",!1);return e.toString=function(){return t},e},utcFormat:function(t){var e=zt(t+="",It);return e.toString=function(){return t},e},utcParse:function(t){var e=Rt(t+="",!0);return e.toString=function(){return t},e}}}var p,d,v,g={"-":"",_:" ",0:"0"},y=/^\s*\d+/,m=/^%/,x=/[\\^$*+?|[\]().{}]/g;function b(t,e,r){var n=t<0?"-":"",i=(n?-t:t)+"",a=i.length;return n+(a68?1900:2e3),r+n[0].length):-1}function P(t,e,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(r,r+6));return n?(t.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function O(t,e,r){var n=y.exec(e.slice(r,r+1));return n?(t.q=3*n[0]-3,r+n[0].length):-1}function I(t,e,r){var n=y.exec(e.slice(r,r+2));return n?(t.m=n[0]-1,r+n[0].length):-1}function D(t,e,r){var n=y.exec(e.slice(r,r+2));return n?(t.d=+n[0],r+n[0].length):-1}function z(t,e,r){var n=y.exec(e.slice(r,r+3));return n?(t.m=0,t.d=+n[0],r+n[0].length):-1}function R(t,e,r){var n=y.exec(e.slice(r,r+2));return n?(t.H=+n[0],r+n[0].length):-1}function F(t,e,r){var n=y.exec(e.slice(r,r+2));return n?(t.M=+n[0],r+n[0].length):-1}function B(t,e,r){var n=y.exec(e.slice(r,r+2));return n?(t.S=+n[0],r+n[0].length):-1}function N(t,e,r){var n=y.exec(e.slice(r,r+3));return n?(t.L=+n[0],r+n[0].length):-1}function j(t,e,r){var n=y.exec(e.slice(r,r+6));return n?(t.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function U(t,e,r){var n=m.exec(e.slice(r,r+1));return n?r+n[0].length:-1}function V(t,e,r){var n=y.exec(e.slice(r));return n?(t.Q=+n[0],r+n[0].length):-1}function H(t,e,r){var n=y.exec(e.slice(r));return n?(t.s=+n[0],r+n[0].length):-1}function q(t,e){return b(t.getDate(),e,2)}function G(t,e){return b(t.getHours(),e,2)}function Z(t,e){return b(t.getHours()%12||12,e,2)}function Y(t,e){return b(1+o.Z.count((0,s.Z)(t),t),e,3)}function W(t,e){return b(t.getMilliseconds(),e,3)}function X(t,e){return W(t,e)+"000"}function J(t,e){return b(t.getMonth()+1,e,2)}function K(t,e){return b(t.getMinutes(),e,2)}function $(t,e){return b(t.getSeconds(),e,2)}function Q(t){var e=t.getDay();return 0===e?7:e}function tt(t,e){return b(a.OM.count((0,s.Z)(t)-1,t),e,2)}function et(t,e){var r=t.getDay();return t=r>=4||0===r?(0,a.bL)(t):a.bL.ceil(t),b(a.bL.count((0,s.Z)(t),t)+(4===(0,s.Z)(t).getDay()),e,2)}function rt(t){return t.getDay()}function nt(t,e){return b(a.wA.count((0,s.Z)(t)-1,t),e,2)}function it(t,e){return b(t.getFullYear()%100,e,2)}function at(t,e){return b(t.getFullYear()%1e4,e,4)}function ot(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+b(e/60|0,"0",2)+b(e%60,"0",2)}function st(t,e){return b(t.getUTCDate(),e,2)}function lt(t,e){return b(t.getUTCHours(),e,2)}function ut(t,e){return b(t.getUTCHours()%12||12,e,2)}function ct(t,e){return b(1+i.Z.count((0,l.Z)(t),t),e,3)}function ft(t,e){return b(t.getUTCMilliseconds(),e,3)}function ht(t,e){return ft(t,e)+"000"}function pt(t,e){return b(t.getUTCMonth()+1,e,2)}function dt(t,e){return b(t.getUTCMinutes(),e,2)}function vt(t,e){return b(t.getUTCSeconds(),e,2)}function gt(t){var e=t.getUTCDay();return 0===e?7:e}function yt(t,e){return b(n.Ox.count((0,l.Z)(t)-1,t),e,2)}function mt(t,e){var r=t.getUTCDay();return t=r>=4||0===r?(0,n.hB)(t):n.hB.ceil(t),b(n.hB.count((0,l.Z)(t),t)+(4===(0,l.Z)(t).getUTCDay()),e,2)}function xt(t){return t.getUTCDay()}function bt(t,e){return b(n.l6.count((0,l.Z)(t)-1,t),e,2)}function _t(t,e){return b(t.getUTCFullYear()%100,e,2)}function wt(t,e){return b(t.getUTCFullYear()%1e4,e,4)}function Tt(){return"+0000"}function kt(){return"%"}function At(t){return+t}function Mt(t){return Math.floor(+t/1e3)}p=h({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]}),d=p.format,p.parse,v=p.utcFormat,p.utcParse},82301:function(t,e,r){"use strict";r.d(e,{a:function(){return o}});var n=r(30052),i=r(54263),a=(0,n.Z)((function(t){t.setHours(0,0,0,0)}),(function(t,e){t.setDate(t.getDate()+e)}),(function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*i.yB)/i.UD}),(function(t){return t.getDate()-1}));e.Z=a;var o=a.range},54263:function(t,e,r){"use strict";r.d(e,{UD:function(){return o},Y2:function(){return a},Ym:function(){return n},iM:function(){return s},yB:function(){return i}});var n=1e3,i=6e4,a=36e5,o=864e5,s=6048e5},81041:function(t,e,r){"use strict";r.r(e),r.d(e,{timeDay:function(){return y.Z},timeDays:function(){return y.a},timeFriday:function(){return m.mC},timeFridays:function(){return m.b$},timeHour:function(){return v},timeHours:function(){return g},timeInterval:function(){return n.Z},timeMillisecond:function(){return a},timeMilliseconds:function(){return o},timeMinute:function(){return h},timeMinutes:function(){return p},timeMonday:function(){return m.wA},timeMondays:function(){return m.bJ},timeMonth:function(){return b},timeMonths:function(){return _},timeSaturday:function(){return m.EY},timeSaturdays:function(){return m.Ff},timeSecond:function(){return u},timeSeconds:function(){return c},timeSunday:function(){return m.OM},timeSundays:function(){return m.vm},timeThursday:function(){return m.bL},timeThursdays:function(){return m.$t},timeTuesday:function(){return m.sy},timeTuesdays:function(){return m.aU},timeWednesday:function(){return m.zg},timeWednesdays:function(){return m.Ld},timeWeek:function(){return m.OM},timeWeeks:function(){return m.vm},timeYear:function(){return w.Z},timeYears:function(){return w.g},utcDay:function(){return L.Z},utcDays:function(){return L.y},utcFriday:function(){return C.QQ},utcFridays:function(){return C.fz},utcHour:function(){return S},utcHours:function(){return E},utcMillisecond:function(){return a},utcMilliseconds:function(){return o},utcMinute:function(){return k},utcMinutes:function(){return A},utcMonday:function(){return C.l6},utcMondays:function(){return C.$3},utcMonth:function(){return O},utcMonths:function(){return I},utcSaturday:function(){return C.g4},utcSaturdays:function(){return C.Q_},utcSecond:function(){return u},utcSeconds:function(){return c},utcSunday:function(){return C.Ox},utcSundays:function(){return C.SU},utcThursday:function(){return C.hB},utcThursdays:function(){return C.xj},utcTuesday:function(){return C.J1},utcTuesdays:function(){return C.DK},utcWednesday:function(){return C.b3},utcWednesdays:function(){return C.uy},utcWeek:function(){return C.Ox},utcWeeks:function(){return C.SU},utcYear:function(){return D.Z},utcYears:function(){return D.D}});var n=r(30052),i=(0,n.Z)((function(){}),(function(t,e){t.setTime(+t+e)}),(function(t,e){return e-t}));i.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?(0,n.Z)((function(e){e.setTime(Math.floor(e/t)*t)}),(function(e,r){e.setTime(+e+r*t)}),(function(e,r){return(r-e)/t})):i:null};var a=i,o=i.range,s=r(54263),l=(0,n.Z)((function(t){t.setTime(t-t.getMilliseconds())}),(function(t,e){t.setTime(+t+e*s.Ym)}),(function(t,e){return(e-t)/s.Ym}),(function(t){return t.getUTCSeconds()})),u=l,c=l.range,f=(0,n.Z)((function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*s.Ym)}),(function(t,e){t.setTime(+t+e*s.yB)}),(function(t,e){return(e-t)/s.yB}),(function(t){return t.getMinutes()})),h=f,p=f.range,d=(0,n.Z)((function(t){t.setTime(t-t.getMilliseconds()-t.getSeconds()*s.Ym-t.getMinutes()*s.yB)}),(function(t,e){t.setTime(+t+e*s.Y2)}),(function(t,e){return(e-t)/s.Y2}),(function(t){return t.getHours()})),v=d,g=d.range,y=r(82301),m=r(59879),x=(0,n.Z)((function(t){t.setDate(1),t.setHours(0,0,0,0)}),(function(t,e){t.setMonth(t.getMonth()+e)}),(function(t,e){return e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())}),(function(t){return t.getMonth()})),b=x,_=x.range,w=r(34823),T=(0,n.Z)((function(t){t.setUTCSeconds(0,0)}),(function(t,e){t.setTime(+t+e*s.yB)}),(function(t,e){return(e-t)/s.yB}),(function(t){return t.getUTCMinutes()})),k=T,A=T.range,M=(0,n.Z)((function(t){t.setUTCMinutes(0,0,0)}),(function(t,e){t.setTime(+t+e*s.Y2)}),(function(t,e){return(e-t)/s.Y2}),(function(t){return t.getUTCHours()})),S=M,E=M.range,L=r(48480),C=r(58176),P=(0,n.Z)((function(t){t.setUTCDate(1),t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCMonth(t.getUTCMonth()+e)}),(function(t,e){return e.getUTCMonth()-t.getUTCMonth()+12*(e.getUTCFullYear()-t.getUTCFullYear())}),(function(t){return t.getUTCMonth()})),O=P,I=P.range,D=r(79791)},30052:function(t,e,r){"use strict";r.d(e,{Z:function(){return a}});var n=new Date,i=new Date;function a(t,e,r,o){function s(e){return t(e=0===arguments.length?new Date:new Date(+e)),e}return s.floor=function(e){return t(e=new Date(+e)),e},s.ceil=function(r){return t(r=new Date(r-1)),e(r,1),t(r),r},s.round=function(t){var e=s(t),r=s.ceil(t);return t-e0))return o;do{o.push(a=new Date(+r)),e(r,i),t(r)}while(a=e)for(;t(e),!r(e);)e.setTime(e-1)}),(function(t,n){if(t>=t)if(n<0)for(;++n<=0;)for(;e(t,-1),!r(t););else for(;--n>=0;)for(;e(t,1),!r(t););}))},r&&(s.count=function(e,a){return n.setTime(+e),i.setTime(+a),t(n),t(i),Math.floor(r(n,i))},s.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?s.filter(o?function(e){return o(e)%t==0}:function(e){return s.count(0,e)%t==0}):s:null}),s}},48480:function(t,e,r){"use strict";r.d(e,{y:function(){return o}});var n=r(30052),i=r(54263),a=(0,n.Z)((function(t){t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCDate(t.getUTCDate()+e)}),(function(t,e){return(e-t)/i.UD}),(function(t){return t.getUTCDate()-1}));e.Z=a;var o=a.range},58176:function(t,e,r){"use strict";r.d(e,{$3:function(){return d},DK:function(){return v},J1:function(){return l},Ox:function(){return o},QQ:function(){return f},Q_:function(){return x},SU:function(){return p},b3:function(){return u},fz:function(){return m},g4:function(){return h},hB:function(){return c},l6:function(){return s},uy:function(){return g},xj:function(){return y}});var n=r(30052),i=r(54263);function a(t){return(0,n.Z)((function(e){e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCDate(t.getUTCDate()+7*e)}),(function(t,e){return(e-t)/i.iM}))}var o=a(0),s=a(1),l=a(2),u=a(3),c=a(4),f=a(5),h=a(6),p=o.range,d=s.range,v=l.range,g=u.range,y=c.range,m=f.range,x=h.range},79791:function(t,e,r){"use strict";r.d(e,{D:function(){return a}});var n=r(30052),i=(0,n.Z)((function(t){t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),(function(t,e){t.setUTCFullYear(t.getUTCFullYear()+e)}),(function(t,e){return e.getUTCFullYear()-t.getUTCFullYear()}),(function(t){return t.getUTCFullYear()}));i.every=function(t){return isFinite(t=Math.floor(t))&&t>0?(0,n.Z)((function(e){e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)}),(function(e,r){e.setUTCFullYear(e.getUTCFullYear()+r*t)})):null},e.Z=i;var a=i.range},59879:function(t,e,r){"use strict";r.d(e,{$t:function(){return y},EY:function(){return h},Ff:function(){return x},Ld:function(){return g},OM:function(){return o},aU:function(){return v},b$:function(){return m},bJ:function(){return d},bL:function(){return c},mC:function(){return f},sy:function(){return l},vm:function(){return p},wA:function(){return s},zg:function(){return u}});var n=r(30052),i=r(54263);function a(t){return(0,n.Z)((function(e){e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)}),(function(t,e){t.setDate(t.getDate()+7*e)}),(function(t,e){return(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*i.yB)/i.iM}))}var o=a(0),s=a(1),l=a(2),u=a(3),c=a(4),f=a(5),h=a(6),p=o.range,d=s.range,v=l.range,g=u.range,y=c.range,m=f.range,x=h.range},34823:function(t,e,r){"use strict";r.d(e,{g:function(){return a}});var n=r(30052),i=(0,n.Z)((function(t){t.setMonth(0,1),t.setHours(0,0,0,0)}),(function(t,e){t.setFullYear(t.getFullYear()+e)}),(function(t,e){return e.getFullYear()-t.getFullYear()}),(function(t){return t.getFullYear()}));i.every=function(t){return isFinite(t=Math.floor(t))&&t>0?(0,n.Z)((function(e){e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)}),(function(e,r){e.setFullYear(e.getFullYear()+r*t)})):null},e.Z=i;var a=i.range},17045:function(t,e,r){"use strict";var n=r(8709),i="function"==typeof Symbol&&"symbol"==typeof Symbol("foo"),a=Object.prototype.toString,o=Array.prototype.concat,s=Object.defineProperty,l=r(55622)(),u=s&&l,c=function(t,e,r,n){if(e in t)if(!0===n){if(t[e]===r)return}else if("function"!=typeof(i=n)||"[object Function]"!==a.call(i)||!n())return;var i;u?s(t,e,{configurable:!0,enumerable:!1,value:r,writable:!0}):t[e]=r},f=function(t,e){var r=arguments.length>2?arguments[2]:{},a=n(e);i&&(a=o.call(a,Object.getOwnPropertySymbols(e)));for(var s=0;ss*l){var p=(h-f)/s;o[c]=1e3*p}}return o}function i(t){for(var e=[],r=t[0];r<=t[1];r++)for(var n=String.fromCharCode(r),i=t[0];i0)return function(t,e){var r,n;for(r=new Array(t),n=0;n80*a){o=l=t[0],s=f=t[1];for(var b=a;bl&&(l=h),d>f&&(f=d);v=0!==(v=Math.max(l-o,f-s))?1/v:0}return i(m,x,a,o,s,v),x}function r(t,e,r,n,i){var a,o;if(i===M(t,e,r,n)>0)for(a=e;a=e;a-=n)o=T(a,t[a],t[a+1],o);return o&&y(o,o.next)&&(k(o),o=o.next),o}function n(t,e){if(!t)return t;e||(e=t);var r,n=t;do{if(r=!1,n.steiner||!y(n,n.next)&&0!==g(n.prev,n,n.next))n=n.next;else{if(k(n),(n=e=n.prev)===n.next)break;r=!0}}while(r||n!==e);return e}function i(t,e,r,u,c,f,p){if(t){!p&&f&&function(t,e,r,n){var i=t;do{null===i.z&&(i.z=h(i.x,i.y,e,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,function(t){var e,r,n,i,a,o,s,l,u=1;do{for(r=t,t=null,a=null,o=0;r;){for(o++,n=r,s=0,e=0;e0||l>0&&n;)0!==s&&(0===l||!n||r.z<=n.z)?(i=r,r=r.nextZ,s--):(i=n,n=n.nextZ,l--),a?a.nextZ=i:t=i,i.prevZ=a,a=i;r=n}a.nextZ=null,u*=2}while(o>1)}(i)}(t,u,c,f);for(var d,v,g=t;t.prev!==t.next;)if(d=t.prev,v=t.next,f?o(t,u,c,f):a(t))e.push(d.i/r),e.push(t.i/r),e.push(v.i/r),k(t),t=v.next,g=v.next;else if((t=v)===g){p?1===p?i(t=s(n(t),e,r),e,r,u,c,f,2):2===p&&l(t,e,r,u,c,f):i(n(t),e,r,u,c,f,1);break}}}function a(t){var e=t.prev,r=t,n=t.next;if(g(e,r,n)>=0)return!1;for(var i=t.next.next;i!==t.prev;){if(d(e.x,e.y,r.x,r.y,n.x,n.y,i.x,i.y)&&g(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function o(t,e,r,n){var i=t.prev,a=t,o=t.next;if(g(i,a,o)>=0)return!1;for(var s=i.xa.x?i.x>o.x?i.x:o.x:a.x>o.x?a.x:o.x,c=i.y>a.y?i.y>o.y?i.y:o.y:a.y>o.y?a.y:o.y,f=h(s,l,e,r,n),p=h(u,c,e,r,n),v=t.prevZ,y=t.nextZ;v&&v.z>=f&&y&&y.z<=p;){if(v!==t.prev&&v!==t.next&&d(i.x,i.y,a.x,a.y,o.x,o.y,v.x,v.y)&&g(v.prev,v,v.next)>=0)return!1;if(v=v.prevZ,y!==t.prev&&y!==t.next&&d(i.x,i.y,a.x,a.y,o.x,o.y,y.x,y.y)&&g(y.prev,y,y.next)>=0)return!1;y=y.nextZ}for(;v&&v.z>=f;){if(v!==t.prev&&v!==t.next&&d(i.x,i.y,a.x,a.y,o.x,o.y,v.x,v.y)&&g(v.prev,v,v.next)>=0)return!1;v=v.prevZ}for(;y&&y.z<=p;){if(y!==t.prev&&y!==t.next&&d(i.x,i.y,a.x,a.y,o.x,o.y,y.x,y.y)&&g(y.prev,y,y.next)>=0)return!1;y=y.nextZ}return!0}function s(t,e,r){var i=t;do{var a=i.prev,o=i.next.next;!y(a,o)&&m(a,i,i.next,o)&&_(a,o)&&_(o,a)&&(e.push(a.i/r),e.push(i.i/r),e.push(o.i/r),k(i),k(i.next),i=t=o),i=i.next}while(i!==t);return n(i)}function l(t,e,r,a,o,s){var l=t;do{for(var u=l.next.next;u!==l.prev;){if(l.i!==u.i&&v(l,u)){var c=w(l,u);return l=n(l,l.next),c=n(c,c.next),i(l,e,r,a,o,s),void i(c,e,r,a,o,s)}u=u.next}l=l.next}while(l!==t)}function u(t,e){return t.x-e.x}function c(t,e){if(e=function(t,e){var r,n=e,i=t.x,a=t.y,o=-1/0;do{if(a<=n.y&&a>=n.next.y&&n.next.y!==n.y){var s=n.x+(a-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(s<=i&&s>o){if(o=s,s===i){if(a===n.y)return n;if(a===n.next.y)return n.next}r=n.x=n.x&&n.x>=c&&i!==n.x&&d(ar.x||n.x===r.x&&f(r,n)))&&(r=n,p=l)),n=n.next}while(n!==u);return r}(t,e),e){var r=w(e,t);n(e,e.next),n(r,r.next)}}function f(t,e){return g(t.prev,t,e.prev)<0&&g(e.next,t,t.next)<0}function h(t,e,r,n,i){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-r)*i)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*i)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function p(t){var e=t,r=t;do{(e.x=0&&(t-o)*(n-s)-(r-o)*(e-s)>=0&&(r-o)*(a-s)-(i-o)*(n-s)>=0}function v(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var r=t;do{if(r.i!==t.i&&r.next.i!==t.i&&r.i!==e.i&&r.next.i!==e.i&&m(r,r.next,t,e))return!0;r=r.next}while(r!==t);return!1}(t,e)&&(_(t,e)&&_(e,t)&&function(t,e){var r=t,n=!1,i=(t.x+e.x)/2,a=(t.y+e.y)/2;do{r.y>a!=r.next.y>a&&r.next.y!==r.y&&i<(r.next.x-r.x)*(a-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next}while(r!==t);return n}(t,e)&&(g(t.prev,t,e.prev)||g(t,e.prev,e))||y(t,e)&&g(t.prev,t,t.next)>0&&g(e.prev,e,e.next)>0)}function g(t,e,r){return(e.y-t.y)*(r.x-e.x)-(e.x-t.x)*(r.y-e.y)}function y(t,e){return t.x===e.x&&t.y===e.y}function m(t,e,r,n){var i=b(g(t,e,r)),a=b(g(t,e,n)),o=b(g(r,n,t)),s=b(g(r,n,e));return i!==a&&o!==s||!(0!==i||!x(t,r,e))||!(0!==a||!x(t,n,e))||!(0!==o||!x(r,t,n))||!(0!==s||!x(r,e,n))}function x(t,e,r){return e.x<=Math.max(t.x,r.x)&&e.x>=Math.min(t.x,r.x)&&e.y<=Math.max(t.y,r.y)&&e.y>=Math.min(t.y,r.y)}function b(t){return t>0?1:t<0?-1:0}function _(t,e){return g(t.prev,t,t.next)<0?g(t,e,t.next)>=0&&g(t,t.prev,e)>=0:g(t,e,t.prev)<0||g(t,t.next,e)<0}function w(t,e){var r=new A(t.i,t.x,t.y),n=new A(e.i,e.x,e.y),i=t.next,a=e.prev;return t.next=e,e.prev=t,r.next=i,i.prev=r,n.next=r,r.prev=n,a.next=n,n.prev=a,n}function T(t,e,r,n){var i=new A(t,e,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function k(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function A(t,e,r){this.i=t,this.x=e,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function M(t,e,r,n){for(var i=0,a=e,o=r-n;a0&&(n+=t[i-1].length,r.holes.push(n))}return r}},2502:function(t,e,r){var n=r(68664);t.exports=function(t,e){var r,i=[],a=[],o=[],s={},l=[];function u(t){o[t]=!1,s.hasOwnProperty(t)&&Object.keys(s[t]).forEach((function(e){delete s[t][e],o[e]&&u(e)}))}function c(t){var e,n,i=!1;for(a.push(t),o[t]=!0,e=0;e=e}))}(e);for(var r,i=n(t).components.filter((function(t){return t.length>1})),a=1/0,o=0;o=55296&&m<=56319&&(w+=t[++r]),w=T?h.call(T,k,w,v):w,e?(p.value=w,d(g,v,p)):g[v]=w,++v;y=v}if(void 0===y)for(y=o(t.length),e&&(g=new e(y)),r=0;r0?1:-1}},56247:function(t,e,r){"use strict";var n=r(9953),i=Math.abs,a=Math.floor;t.exports=function(t){return isNaN(t)?0:0!==(t=Number(t))&&isFinite(t)?n(t)*a(i(t)):t}},35976:function(t,e,r){"use strict";var n=r(56247),i=Math.max;t.exports=function(t){return i(0,n(t))}},67260:function(t,e,r){"use strict";var n=r(78513),i=r(36672),a=Function.prototype.bind,o=Function.prototype.call,s=Object.keys,l=Object.prototype.propertyIsEnumerable;t.exports=function(t,e){return function(r,u){var c,f=arguments[2],h=arguments[3];return r=Object(i(r)),n(u),c=s(r),h&&c.sort("function"==typeof h?a.call(h,r):void 0),"function"!=typeof t&&(t=c[t]),o.call(t,c,(function(t,n){return l.call(r,t)?o.call(u,f,r[t],t,r,n):e}))}}},95879:function(t,e,r){"use strict";t.exports=r(73583)()?Object.assign:r(34205)},73583:function(t){"use strict";t.exports=function(){var t,e=Object.assign;return"function"==typeof e&&(e(t={foo:"raz"},{bar:"dwa"},{trzy:"trzy"}),t.foo+t.bar+t.trzy==="razdwatrzy")}},34205:function(t,e,r){"use strict";var n=r(68700),i=r(36672),a=Math.max;t.exports=function(t,e){var r,o,s,l=a(arguments.length,2);for(t=Object(i(t)),s=function(n){try{t[n]=e[n]}catch(t){r||(r=t)}},o=1;o-1}},87963:function(t){"use strict";var e=Object.prototype.toString,r=e.call("");t.exports=function(t){return"string"==typeof t||t&&"object"==typeof t&&(t instanceof String||e.call(t)===r)||!1}},43043:function(t){"use strict";var e=Object.create(null),r=Math.random;t.exports=function(){var t;do{t=r().toString(36).slice(2)}while(e[t]);return t}},32411:function(t,e,r){"use strict";var n,i=r(1496),a=r(66741),o=r(62072),s=r(8260),l=r(95426),u=Object.defineProperty;n=t.exports=function(t,e){if(!(this instanceof n))throw new TypeError("Constructor requires 'new'");l.call(this,t),e=e?a.call(e,"key+value")?"key+value":a.call(e,"key")?"key":"value":"value",u(this,"__kind__",o("",e))},i&&i(n,l),delete n.prototype.constructor,n.prototype=Object.create(l.prototype,{_resolve:o((function(t){return"value"===this.__kind__?this.__list__[t]:"key+value"===this.__kind__?[t,this.__list__[t]]:t}))}),u(n.prototype,s.toStringTag,o("c","Array Iterator"))},27515:function(t,e,r){"use strict";var n=r(73051),i=r(78513),a=r(87963),o=r(66661),s=Array.isArray,l=Function.prototype.call,u=Array.prototype.some;t.exports=function(t,e){var r,c,f,h,p,d,v,g,y=arguments[2];if(s(t)||n(t)?r="array":a(t)?r="string":t=o(t),i(e),f=function(){h=!0},"array"!==r)if("string"!==r)for(c=t.next();!c.done;){if(l.call(e,y,c.value,f),h)return;c=t.next()}else for(d=t.length,p=0;p=55296&&g<=56319&&(v+=t[++p]),l.call(e,y,v,f),!h);++p);else u.call(t,(function(t){return l.call(e,y,t,f),h}))}},66661:function(t,e,r){"use strict";var n=r(73051),i=r(87963),a=r(32411),o=r(259),s=r(58095),l=r(8260).iterator;t.exports=function(t){return"function"==typeof s(t)[l]?t[l]():n(t)?new a(t):i(t)?new o(t):new a(t)}},95426:function(t,e,r){"use strict";var n,i=r(16134),a=r(95879),o=r(78513),s=r(36672),l=r(62072),u=r(55174),c=r(8260),f=Object.defineProperty,h=Object.defineProperties;t.exports=n=function(t,e){if(!(this instanceof n))throw new TypeError("Constructor requires 'new'");h(this,{__list__:l("w",s(t)),__context__:l("w",e),__nextIndex__:l("w",0)}),e&&(o(e.on),e.on("_add",this._onAdd),e.on("_delete",this._onDelete),e.on("_clear",this._onClear))},delete n.prototype.constructor,h(n.prototype,a({_next:l((function(){var t;if(this.__list__)return this.__redo__&&void 0!==(t=this.__redo__.shift())?t:this.__nextIndex__=this.__nextIndex__||(++this.__nextIndex__,this.__redo__?(this.__redo__.forEach((function(e,r){e>=t&&(this.__redo__[r]=++e)}),this),this.__redo__.push(t)):f(this,"__redo__",l("c",[t])))})),_onDelete:l((function(t){var e;t>=this.__nextIndex__||(--this.__nextIndex__,this.__redo__&&(-1!==(e=this.__redo__.indexOf(t))&&this.__redo__.splice(e,1),this.__redo__.forEach((function(e,r){e>t&&(this.__redo__[r]=--e)}),this)))})),_onClear:l((function(){this.__redo__&&i.call(this.__redo__),this.__nextIndex__=0}))}))),f(n.prototype,c.iterator,l((function(){return this})))},35940:function(t,e,r){"use strict";var n=r(73051),i=r(95296),a=r(87963),o=r(8260).iterator,s=Array.isArray;t.exports=function(t){return!(!i(t)||!s(t)&&!a(t)&&!n(t)&&"function"!=typeof t[o])}},259:function(t,e,r){"use strict";var n,i=r(1496),a=r(62072),o=r(8260),s=r(95426),l=Object.defineProperty;n=t.exports=function(t){if(!(this instanceof n))throw new TypeError("Constructor requires 'new'");t=String(t),s.call(this,t),l(this,"__length__",a("",t.length))},i&&i(n,s),delete n.prototype.constructor,n.prototype=Object.create(s.prototype,{_next:a((function(){if(this.__list__)return this.__nextIndex__=55296&&e<=56319?r+this.__list__[this.__nextIndex__++]:r}))}),l(n.prototype,o.toStringTag,a("c","String Iterator"))},58095:function(t,e,r){"use strict";var n=r(35940);t.exports=function(t){if(!n(t))throw new TypeError(t+" is not iterable");return t}},73523:function(t){"use strict";function e(t,e){if(null==t)throw new TypeError("Cannot convert first argument to object");for(var r=Object(t),n=1;n0&&o.length>i&&!o.warned){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+String(e)+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=t,c.type=e,c.count=o.length,u=c,console&&console.warn&&console.warn(u)}return t}function c(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function f(t,e,r){var n={fired:!1,wrapFn:void 0,target:t,type:e,listener:r},i=c.bind(n);return i.listener=r,n.wrapFn=i,i}function h(t,e,r){var n=t._events;if(void 0===n)return[];var i=n[e];return void 0===i?[]:"function"==typeof i?r?[i.listener||i]:[i]:r?function(t){for(var e=new Array(t.length),r=0;r0&&(o=e[0]),o instanceof Error)throw o;var s=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw s.context=o,s}var l=a[t];if(void 0===l)return!1;if("function"==typeof l)n(l,this,e);else{var u=l.length,c=d(l,u);for(r=0;r=0;a--)if(r[a]===e||r[a].listener===e){o=r[a].listener,i=a;break}if(i<0)return this;0===i?r.shift():function(t,e){for(;e+1=0;n--)this.removeListener(t,e[n]);return this},a.prototype.listeners=function(t){return h(this,t,!0)},a.prototype.rawListeners=function(t){return h(this,t,!1)},a.listenerCount=function(t,e){return"function"==typeof t.listenerCount?t.listenerCount(e):p.call(t,e)},a.prototype.listenerCount=p,a.prototype.eventNames=function(){return this._eventsCount>0?e(this._events):[]}},60774:function(t){var e=function(){if("object"==typeof self&&self)return self;if("object"==typeof window&&window)return window;throw new Error("Unable to resolve global `this`")};t.exports=function(){if(this)return this;try{Object.defineProperty(Object.prototype,"__global__",{get:function(){return this},configurable:!0})}catch(t){return e()}try{return __global__||e()}finally{delete Object.prototype.__global__}}()},94908:function(t,e,r){"use strict";t.exports=r(51152)()?globalThis:r(60774)},51152:function(t){"use strict";t.exports=function(){return"object"==typeof globalThis&&!!globalThis&&globalThis.Array===Array}},92770:function(t,e,r){"use strict";var n=r(18546);t.exports=function(t){var e=typeof t;if("string"===e){var r=t;if(0==(t=+t)&&n(r))return!1}else if("number"!==e)return!1;return t-t<1}},30120:function(t,e,r){var n=r(90660);t.exports=function(t,e,r){if(!t)throw new TypeError("must specify data as first parameter");if(r=0|+(r||0),Array.isArray(t)&&t[0]&&"number"==typeof t[0][0]){var i,a,o,s,l=t[0].length,u=t.length*l;e&&"string"!=typeof e||(e=new(n(e||"float32"))(u+r));var c=e.length-r;if(u!==c)throw new Error("source length "+u+" ("+l+"x"+t.length+") does not match destination length "+c);for(i=0,o=r;ie[0]-o[0]/2&&(h=o[0]/2,p+=o[1]);return r}},32879:function(t){"use strict";function e(t,a){a||(a={}),("string"==typeof t||Array.isArray(t))&&(a.family=t);var o=Array.isArray(a.family)?a.family.join(", "):a.family;if(!o)throw Error("`family` must be defined");var s=a.size||a.fontSize||a.em||48,l=a.weight||a.fontWeight||"",u=(t=[a.style||a.fontStyle||"",l,s].join(" ")+"px "+o,a.origin||"top");if(e.cache[o]&&s<=e.cache[o].em)return r(e.cache[o],u);var c=a.canvas||e.canvas,f=c.getContext("2d"),h={upper:void 0!==a.upper?a.upper:"H",lower:void 0!==a.lower?a.lower:"x",descent:void 0!==a.descent?a.descent:"p",ascent:void 0!==a.ascent?a.ascent:"h",tittle:void 0!==a.tittle?a.tittle:"i",overshoot:void 0!==a.overshoot?a.overshoot:"O"},p=Math.ceil(1.5*s);c.height=p,c.width=.5*p,f.font=t;var d="H",v={top:0};f.clearRect(0,0,p,p),f.textBaseline="top",f.fillStyle="black",f.fillText(d,0,0);var g=n(f.getImageData(0,0,p,p));f.clearRect(0,0,p,p),f.textBaseline="bottom",f.fillText(d,0,p);var y=n(f.getImageData(0,0,p,p));v.lineHeight=v.bottom=p-y+g,f.clearRect(0,0,p,p),f.textBaseline="alphabetic",f.fillText(d,0,p);var m=p-n(f.getImageData(0,0,p,p))-1+g;v.baseline=v.alphabetic=m,f.clearRect(0,0,p,p),f.textBaseline="middle",f.fillText(d,0,.5*p);var x=n(f.getImageData(0,0,p,p));v.median=v.middle=p-x-1+g-.5*p,f.clearRect(0,0,p,p),f.textBaseline="hanging",f.fillText(d,0,.5*p);var b=n(f.getImageData(0,0,p,p));v.hanging=p-b-1+g-.5*p,f.clearRect(0,0,p,p),f.textBaseline="ideographic",f.fillText(d,0,p);var _=n(f.getImageData(0,0,p,p));if(v.ideographic=p-_-1+g,h.upper&&(f.clearRect(0,0,p,p),f.textBaseline="top",f.fillText(h.upper,0,0),v.upper=n(f.getImageData(0,0,p,p)),v.capHeight=v.baseline-v.upper),h.lower&&(f.clearRect(0,0,p,p),f.textBaseline="top",f.fillText(h.lower,0,0),v.lower=n(f.getImageData(0,0,p,p)),v.xHeight=v.baseline-v.lower),h.tittle&&(f.clearRect(0,0,p,p),f.textBaseline="top",f.fillText(h.tittle,0,0),v.tittle=n(f.getImageData(0,0,p,p))),h.ascent&&(f.clearRect(0,0,p,p),f.textBaseline="top",f.fillText(h.ascent,0,0),v.ascent=n(f.getImageData(0,0,p,p))),h.descent&&(f.clearRect(0,0,p,p),f.textBaseline="top",f.fillText(h.descent,0,0),v.descent=i(f.getImageData(0,0,p,p))),h.overshoot){f.clearRect(0,0,p,p),f.textBaseline="top",f.fillText(h.overshoot,0,0);var w=i(f.getImageData(0,0,p,p));v.overshoot=w-m}for(var T in v)v[T]/=s;return v.em=s,e.cache[o]=v,r(v,u)}function r(t,e){var r={};for(var n in"string"==typeof e&&(e=t[e]),t)"em"!==n&&(r[n]=t[n]-e);return r}function n(t){for(var e=t.height,r=t.data,n=3;n0;n-=4)if(0!==r[n])return Math.floor(.25*(n-3)/e)}t.exports=e,e.canvas=document.createElement("canvas"),e.cache={}},31353:function(t,e,r){"use strict";var n=r(85395),i=Object.prototype.toString,a=Object.prototype.hasOwnProperty;t.exports=function(t,e,r){if(!n(e))throw new TypeError("iterator must be a function");var o;arguments.length>=3&&(o=r),"[object Array]"===i.call(t)?function(t,e,r){for(var n=0,i=t.length;n1&&"boolean"!=typeof e)throw new o('"allowMissing" argument must be a boolean');if(null===A(/^%?[^%]*%?$/,t))throw new i("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var r=function(t){var e=k(t,0,1),r=k(t,-1);if("%"===e&&"%"!==r)throw new i("invalid intrinsic syntax, expected closing `%`");if("%"===r&&"%"!==e)throw new i("invalid intrinsic syntax, expected opening `%`");var n=[];return T(t,M,(function(t,e,r,i){n[n.length]=r?T(i,S,"$1"):e||t})),n}(t),n=r.length>0?r[0]:"",a=E("%"+n+"%",e),s=a.name,u=a.value,c=!1,f=a.alias;f&&(n=f[0],w(r,_([0,1],f)));for(var h=1,p=!0;h=r.length){var m=l(u,d);u=(p=!!m)&&"get"in m&&!("originalValue"in m.get)?m.get:u[d]}else p=b(u,d),u=u[d];p&&!c&&(v[s]=u)}}return u}},85400:function(t){t.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=e[4],s=e[5],l=e[6],u=e[7],c=e[8],f=e[9],h=e[10],p=e[11],d=e[12],v=e[13],g=e[14],y=e[15];return t[0]=s*(h*y-p*g)-f*(l*y-u*g)+v*(l*p-u*h),t[1]=-(n*(h*y-p*g)-f*(i*y-a*g)+v*(i*p-a*h)),t[2]=n*(l*y-u*g)-s*(i*y-a*g)+v*(i*u-a*l),t[3]=-(n*(l*p-u*h)-s*(i*p-a*h)+f*(i*u-a*l)),t[4]=-(o*(h*y-p*g)-c*(l*y-u*g)+d*(l*p-u*h)),t[5]=r*(h*y-p*g)-c*(i*y-a*g)+d*(i*p-a*h),t[6]=-(r*(l*y-u*g)-o*(i*y-a*g)+d*(i*u-a*l)),t[7]=r*(l*p-u*h)-o*(i*p-a*h)+c*(i*u-a*l),t[8]=o*(f*y-p*v)-c*(s*y-u*v)+d*(s*p-u*f),t[9]=-(r*(f*y-p*v)-c*(n*y-a*v)+d*(n*p-a*f)),t[10]=r*(s*y-u*v)-o*(n*y-a*v)+d*(n*u-a*s),t[11]=-(r*(s*p-u*f)-o*(n*p-a*f)+c*(n*u-a*s)),t[12]=-(o*(f*g-h*v)-c*(s*g-l*v)+d*(s*h-l*f)),t[13]=r*(f*g-h*v)-c*(n*g-i*v)+d*(n*h-i*f),t[14]=-(r*(s*g-l*v)-o*(n*g-i*v)+d*(n*l-i*s)),t[15]=r*(s*h-l*f)-o*(n*h-i*f)+c*(n*l-i*s),t}},42331:function(t){t.exports=function(t){var e=new Float32Array(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e}},31042:function(t){t.exports=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t}},11902:function(t){t.exports=function(){var t=new Float32Array(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},89887:function(t){t.exports=function(t){var e=t[0],r=t[1],n=t[2],i=t[3],a=t[4],o=t[5],s=t[6],l=t[7],u=t[8],c=t[9],f=t[10],h=t[11],p=t[12],d=t[13],v=t[14],g=t[15];return(e*o-r*a)*(f*g-h*v)-(e*s-n*a)*(c*g-h*d)+(e*l-i*a)*(c*v-f*d)+(r*s-n*o)*(u*g-h*p)-(r*l-i*o)*(u*v-f*p)+(n*l-i*s)*(u*d-c*p)}},27812:function(t){t.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=r+r,s=n+n,l=i+i,u=r*o,c=n*o,f=n*s,h=i*o,p=i*s,d=i*l,v=a*o,g=a*s,y=a*l;return t[0]=1-f-d,t[1]=c+y,t[2]=h-g,t[3]=0,t[4]=c-y,t[5]=1-u-d,t[6]=p+v,t[7]=0,t[8]=h+g,t[9]=p-v,t[10]=1-u-f,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},34045:function(t){t.exports=function(t,e,r){var n,i,a,o=r[0],s=r[1],l=r[2],u=Math.sqrt(o*o+s*s+l*l);return Math.abs(u)<1e-6?null:(o*=u=1/u,s*=u,l*=u,n=Math.sin(e),a=1-(i=Math.cos(e)),t[0]=o*o*a+i,t[1]=s*o*a+l*n,t[2]=l*o*a-s*n,t[3]=0,t[4]=o*s*a-l*n,t[5]=s*s*a+i,t[6]=l*s*a+o*n,t[7]=0,t[8]=o*l*a+s*n,t[9]=s*l*a-o*n,t[10]=l*l*a+i,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t)}},45973:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3],s=n+n,l=i+i,u=a+a,c=n*s,f=n*l,h=n*u,p=i*l,d=i*u,v=a*u,g=o*s,y=o*l,m=o*u;return t[0]=1-(p+v),t[1]=f+m,t[2]=h-y,t[3]=0,t[4]=f-m,t[5]=1-(c+v),t[6]=d+g,t[7]=0,t[8]=h+y,t[9]=d-g,t[10]=1-(c+p),t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t}},81472:function(t){t.exports=function(t,e){return t[0]=e[0],t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=e[1],t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=e[2],t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},14669:function(t){t.exports=function(t,e){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=e[0],t[13]=e[1],t[14]=e[2],t[15]=1,t}},75262:function(t){t.exports=function(t,e){var r=Math.sin(e),n=Math.cos(e);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=n,t[6]=r,t[7]=0,t[8]=0,t[9]=-r,t[10]=n,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},331:function(t){t.exports=function(t,e){var r=Math.sin(e),n=Math.cos(e);return t[0]=n,t[1]=0,t[2]=-r,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=r,t[9]=0,t[10]=n,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},11049:function(t){t.exports=function(t,e){var r=Math.sin(e),n=Math.cos(e);return t[0]=n,t[1]=r,t[2]=0,t[3]=0,t[4]=-r,t[5]=n,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},75195:function(t){t.exports=function(t,e,r,n,i,a,o){var s=1/(r-e),l=1/(i-n),u=1/(a-o);return t[0]=2*a*s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*a*l,t[6]=0,t[7]=0,t[8]=(r+e)*s,t[9]=(i+n)*l,t[10]=(o+a)*u,t[11]=-1,t[12]=0,t[13]=0,t[14]=o*a*2*u,t[15]=0,t}},71551:function(t){t.exports=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},79576:function(t,e,r){t.exports={create:r(11902),clone:r(42331),copy:r(31042),identity:r(71551),transpose:r(88654),invert:r(95874),adjoint:r(85400),determinant:r(89887),multiply:r(91362),translate:r(31283),scale:r(10789),rotate:r(65074),rotateX:r(35545),rotateY:r(94918),rotateZ:r(15692),fromRotation:r(34045),fromRotationTranslation:r(45973),fromScaling:r(81472),fromTranslation:r(14669),fromXRotation:r(75262),fromYRotation:r(331),fromZRotation:r(11049),fromQuat:r(27812),frustum:r(75195),perspective:r(7864),perspectiveFromFieldOfView:r(35279),ortho:r(60378),lookAt:r(65551),str:r(6726)}},95874:function(t){t.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=e[4],s=e[5],l=e[6],u=e[7],c=e[8],f=e[9],h=e[10],p=e[11],d=e[12],v=e[13],g=e[14],y=e[15],m=r*s-n*o,x=r*l-i*o,b=r*u-a*o,_=n*l-i*s,w=n*u-a*s,T=i*u-a*l,k=c*v-f*d,A=c*g-h*d,M=c*y-p*d,S=f*g-h*v,E=f*y-p*v,L=h*y-p*g,C=m*L-x*E+b*S+_*M-w*A+T*k;return C?(C=1/C,t[0]=(s*L-l*E+u*S)*C,t[1]=(i*E-n*L-a*S)*C,t[2]=(v*T-g*w+y*_)*C,t[3]=(h*w-f*T-p*_)*C,t[4]=(l*M-o*L-u*A)*C,t[5]=(r*L-i*M+a*A)*C,t[6]=(g*b-d*T-y*x)*C,t[7]=(c*T-h*b+p*x)*C,t[8]=(o*E-s*M+u*k)*C,t[9]=(n*M-r*E-a*k)*C,t[10]=(d*w-v*b+y*m)*C,t[11]=(f*b-c*w-p*m)*C,t[12]=(s*A-o*S-l*k)*C,t[13]=(r*S-n*A+i*k)*C,t[14]=(v*x-d*_-g*m)*C,t[15]=(c*_-f*x+h*m)*C,t):null}},65551:function(t,e,r){var n=r(71551);t.exports=function(t,e,r,i){var a,o,s,l,u,c,f,h,p,d,v=e[0],g=e[1],y=e[2],m=i[0],x=i[1],b=i[2],_=r[0],w=r[1],T=r[2];return Math.abs(v-_)<1e-6&&Math.abs(g-w)<1e-6&&Math.abs(y-T)<1e-6?n(t):(f=v-_,h=g-w,p=y-T,a=x*(p*=d=1/Math.sqrt(f*f+h*h+p*p))-b*(h*=d),o=b*(f*=d)-m*p,s=m*h-x*f,(d=Math.sqrt(a*a+o*o+s*s))?(a*=d=1/d,o*=d,s*=d):(a=0,o=0,s=0),l=h*s-p*o,u=p*a-f*s,c=f*o-h*a,(d=Math.sqrt(l*l+u*u+c*c))?(l*=d=1/d,u*=d,c*=d):(l=0,u=0,c=0),t[0]=a,t[1]=l,t[2]=f,t[3]=0,t[4]=o,t[5]=u,t[6]=h,t[7]=0,t[8]=s,t[9]=c,t[10]=p,t[11]=0,t[12]=-(a*v+o*g+s*y),t[13]=-(l*v+u*g+c*y),t[14]=-(f*v+h*g+p*y),t[15]=1,t)}},91362:function(t){t.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3],s=e[4],l=e[5],u=e[6],c=e[7],f=e[8],h=e[9],p=e[10],d=e[11],v=e[12],g=e[13],y=e[14],m=e[15],x=r[0],b=r[1],_=r[2],w=r[3];return t[0]=x*n+b*s+_*f+w*v,t[1]=x*i+b*l+_*h+w*g,t[2]=x*a+b*u+_*p+w*y,t[3]=x*o+b*c+_*d+w*m,x=r[4],b=r[5],_=r[6],w=r[7],t[4]=x*n+b*s+_*f+w*v,t[5]=x*i+b*l+_*h+w*g,t[6]=x*a+b*u+_*p+w*y,t[7]=x*o+b*c+_*d+w*m,x=r[8],b=r[9],_=r[10],w=r[11],t[8]=x*n+b*s+_*f+w*v,t[9]=x*i+b*l+_*h+w*g,t[10]=x*a+b*u+_*p+w*y,t[11]=x*o+b*c+_*d+w*m,x=r[12],b=r[13],_=r[14],w=r[15],t[12]=x*n+b*s+_*f+w*v,t[13]=x*i+b*l+_*h+w*g,t[14]=x*a+b*u+_*p+w*y,t[15]=x*o+b*c+_*d+w*m,t}},60378:function(t){t.exports=function(t,e,r,n,i,a,o){var s=1/(e-r),l=1/(n-i),u=1/(a-o);return t[0]=-2*s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*l,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*u,t[11]=0,t[12]=(e+r)*s,t[13]=(i+n)*l,t[14]=(o+a)*u,t[15]=1,t}},7864:function(t){t.exports=function(t,e,r,n,i){var a=1/Math.tan(e/2),o=1/(n-i);return t[0]=a/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=a,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=(i+n)*o,t[11]=-1,t[12]=0,t[13]=0,t[14]=2*i*n*o,t[15]=0,t}},35279:function(t){t.exports=function(t,e,r,n){var i=Math.tan(e.upDegrees*Math.PI/180),a=Math.tan(e.downDegrees*Math.PI/180),o=Math.tan(e.leftDegrees*Math.PI/180),s=Math.tan(e.rightDegrees*Math.PI/180),l=2/(o+s),u=2/(i+a);return t[0]=l,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=u,t[6]=0,t[7]=0,t[8]=-(o-s)*l*.5,t[9]=(i-a)*u*.5,t[10]=n/(r-n),t[11]=-1,t[12]=0,t[13]=0,t[14]=n*r/(r-n),t[15]=0,t}},65074:function(t){t.exports=function(t,e,r,n){var i,a,o,s,l,u,c,f,h,p,d,v,g,y,m,x,b,_,w,T,k,A,M,S,E=n[0],L=n[1],C=n[2],P=Math.sqrt(E*E+L*L+C*C);return Math.abs(P)<1e-6?null:(E*=P=1/P,L*=P,C*=P,i=Math.sin(r),o=1-(a=Math.cos(r)),s=e[0],l=e[1],u=e[2],c=e[3],f=e[4],h=e[5],p=e[6],d=e[7],v=e[8],g=e[9],y=e[10],m=e[11],x=E*E*o+a,b=L*E*o+C*i,_=C*E*o-L*i,w=E*L*o-C*i,T=L*L*o+a,k=C*L*o+E*i,A=E*C*o+L*i,M=L*C*o-E*i,S=C*C*o+a,t[0]=s*x+f*b+v*_,t[1]=l*x+h*b+g*_,t[2]=u*x+p*b+y*_,t[3]=c*x+d*b+m*_,t[4]=s*w+f*T+v*k,t[5]=l*w+h*T+g*k,t[6]=u*w+p*T+y*k,t[7]=c*w+d*T+m*k,t[8]=s*A+f*M+v*S,t[9]=l*A+h*M+g*S,t[10]=u*A+p*M+y*S,t[11]=c*A+d*M+m*S,e!==t&&(t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t)}},35545:function(t){t.exports=function(t,e,r){var n=Math.sin(r),i=Math.cos(r),a=e[4],o=e[5],s=e[6],l=e[7],u=e[8],c=e[9],f=e[10],h=e[11];return e!==t&&(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[4]=a*i+u*n,t[5]=o*i+c*n,t[6]=s*i+f*n,t[7]=l*i+h*n,t[8]=u*i-a*n,t[9]=c*i-o*n,t[10]=f*i-s*n,t[11]=h*i-l*n,t}},94918:function(t){t.exports=function(t,e,r){var n=Math.sin(r),i=Math.cos(r),a=e[0],o=e[1],s=e[2],l=e[3],u=e[8],c=e[9],f=e[10],h=e[11];return e!==t&&(t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[0]=a*i-u*n,t[1]=o*i-c*n,t[2]=s*i-f*n,t[3]=l*i-h*n,t[8]=a*n+u*i,t[9]=o*n+c*i,t[10]=s*n+f*i,t[11]=l*n+h*i,t}},15692:function(t){t.exports=function(t,e,r){var n=Math.sin(r),i=Math.cos(r),a=e[0],o=e[1],s=e[2],l=e[3],u=e[4],c=e[5],f=e[6],h=e[7];return e!==t&&(t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[0]=a*i+u*n,t[1]=o*i+c*n,t[2]=s*i+f*n,t[3]=l*i+h*n,t[4]=u*i-a*n,t[5]=c*i-o*n,t[6]=f*i-s*n,t[7]=h*i-l*n,t}},10789:function(t){t.exports=function(t,e,r){var n=r[0],i=r[1],a=r[2];return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t[3]=e[3]*n,t[4]=e[4]*i,t[5]=e[5]*i,t[6]=e[6]*i,t[7]=e[7]*i,t[8]=e[8]*a,t[9]=e[9]*a,t[10]=e[10]*a,t[11]=e[11]*a,t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t}},6726:function(t){t.exports=function(t){return"mat4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+", "+t[9]+", "+t[10]+", "+t[11]+", "+t[12]+", "+t[13]+", "+t[14]+", "+t[15]+")"}},31283:function(t){t.exports=function(t,e,r){var n,i,a,o,s,l,u,c,f,h,p,d,v=r[0],g=r[1],y=r[2];return e===t?(t[12]=e[0]*v+e[4]*g+e[8]*y+e[12],t[13]=e[1]*v+e[5]*g+e[9]*y+e[13],t[14]=e[2]*v+e[6]*g+e[10]*y+e[14],t[15]=e[3]*v+e[7]*g+e[11]*y+e[15]):(n=e[0],i=e[1],a=e[2],o=e[3],s=e[4],l=e[5],u=e[6],c=e[7],f=e[8],h=e[9],p=e[10],d=e[11],t[0]=n,t[1]=i,t[2]=a,t[3]=o,t[4]=s,t[5]=l,t[6]=u,t[7]=c,t[8]=f,t[9]=h,t[10]=p,t[11]=d,t[12]=n*v+s*g+f*y+e[12],t[13]=i*v+l*g+h*y+e[13],t[14]=a*v+u*g+p*y+e[14],t[15]=o*v+c*g+d*y+e[15]),t}},88654:function(t){t.exports=function(t,e){if(t===e){var r=e[1],n=e[2],i=e[3],a=e[6],o=e[7],s=e[11];t[1]=e[4],t[2]=e[8],t[3]=e[12],t[4]=r,t[6]=e[9],t[7]=e[13],t[8]=n,t[9]=a,t[11]=e[14],t[12]=i,t[13]=o,t[14]=s}else t[0]=e[0],t[1]=e[4],t[2]=e[8],t[3]=e[12],t[4]=e[1],t[5]=e[5],t[6]=e[9],t[7]=e[13],t[8]=e[2],t[9]=e[6],t[10]=e[10],t[11]=e[14],t[12]=e[3],t[13]=e[7],t[14]=e[11],t[15]=e[15];return t}},42505:function(t,e,r){"use strict";var n=r(72791),i=r(71299),a=r(98580),o=r(12018),s=r(83522),l=r(25075),u=r(68016),c=r(58404),f=r(18863),h=r(10973),p=r(25677),d=r(75686),v=r(53545),g=r(56131),y=r(32879),m=r(30120),x=r(13547).nextPow2,b=new s,_=!1;if(document.body){var w=document.body.appendChild(document.createElement("div"));w.style.font="italic small-caps bold condensed 16px/2 cursive",getComputedStyle(w).fontStretch&&(_=!0),document.body.removeChild(w)}var T=function(t){!function(t){return"function"==typeof t&&t._gl&&t.prop&&t.texture&&t.buffer}(t)?this.gl=o(t):(t={regl:t},this.gl=t.regl._gl),this.shader=b.get(this.gl),this.shader?this.regl=this.shader.regl:this.regl=t.regl||a({gl:this.gl}),this.charBuffer=this.regl.buffer({type:"uint8",usage:"stream"}),this.sizeBuffer=this.regl.buffer({type:"float",usage:"stream"}),this.shader||(this.shader=this.createShader(),b.set(this.gl,this.shader)),this.batch=[],this.fontSize=[],this.font=[],this.fontAtlas=[],this.draw=this.shader.draw.bind(this),this.render=function(){this.regl._refresh(),this.draw(this.batch)},this.canvas=this.gl.canvas,this.update(h(t)?t:{})};T.prototype.createShader=function(){var t=this.regl,e=t({blend:{enable:!0,color:[0,0,0,1],func:{srcRGB:"src alpha",dstRGB:"one minus src alpha",srcAlpha:"one minus dst alpha",dstAlpha:"one"}},stencil:{enable:!1},depth:{enable:!1},count:t.prop("count"),offset:t.prop("offset"),attributes:{charOffset:{offset:4,stride:8,buffer:t.this("sizeBuffer")},width:{offset:0,stride:8,buffer:t.this("sizeBuffer")},char:t.this("charBuffer"),position:t.this("position")},uniforms:{atlasSize:function(t,e){return[e.atlas.width,e.atlas.height]},atlasDim:function(t,e){return[e.atlas.cols,e.atlas.rows]},atlas:function(t,e){return e.atlas.texture},charStep:function(t,e){return e.atlas.step},em:function(t,e){return e.atlas.em},color:t.prop("color"),opacity:t.prop("opacity"),viewport:t.this("viewportArray"),scale:t.this("scale"),align:t.prop("align"),baseline:t.prop("baseline"),translate:t.this("translate"),positionOffset:t.prop("positionOffset")},primitive:"points",viewport:t.this("viewport"),vert:"\n\t\t\tprecision highp float;\n\t\t\tattribute float width, charOffset, char;\n\t\t\tattribute vec2 position;\n\t\t\tuniform float fontSize, charStep, em, align, baseline;\n\t\t\tuniform vec4 viewport;\n\t\t\tuniform vec4 color;\n\t\t\tuniform vec2 atlasSize, atlasDim, scale, translate, positionOffset;\n\t\t\tvarying vec2 charCoord, charId;\n\t\t\tvarying float charWidth;\n\t\t\tvarying vec4 fontColor;\n\t\t\tvoid main () {\n\t\t\t\tvec2 offset = floor(em * (vec2(align + charOffset, baseline)\n\t\t\t\t\t+ vec2(positionOffset.x, -positionOffset.y)))\n\t\t\t\t\t/ (viewport.zw * scale.xy);\n\n\t\t\t\tvec2 position = (position + translate) * scale;\n\t\t\t\tposition += offset * scale;\n\n\t\t\t\tcharCoord = position * viewport.zw + viewport.xy;\n\n\t\t\t\tgl_Position = vec4(position * 2. - 1., 0, 1);\n\n\t\t\t\tgl_PointSize = charStep;\n\n\t\t\t\tcharId.x = mod(char, atlasDim.x);\n\t\t\t\tcharId.y = floor(char / atlasDim.x);\n\n\t\t\t\tcharWidth = width * em;\n\n\t\t\t\tfontColor = color / 255.;\n\t\t\t}",frag:"\n\t\t\tprecision highp float;\n\t\t\tuniform float fontSize, charStep, opacity;\n\t\t\tuniform vec2 atlasSize;\n\t\t\tuniform vec4 viewport;\n\t\t\tuniform sampler2D atlas;\n\t\t\tvarying vec4 fontColor;\n\t\t\tvarying vec2 charCoord, charId;\n\t\t\tvarying float charWidth;\n\n\t\t\tfloat lightness(vec4 color) {\n\t\t\t\treturn color.r * 0.299 + color.g * 0.587 + color.b * 0.114;\n\t\t\t}\n\n\t\t\tvoid main () {\n\t\t\t\tvec2 uv = gl_FragCoord.xy - charCoord + charStep * .5;\n\t\t\t\tfloat halfCharStep = floor(charStep * .5 + .5);\n\n\t\t\t\t// invert y and shift by 1px (FF expecially needs that)\n\t\t\t\tuv.y = charStep - uv.y;\n\n\t\t\t\t// ignore points outside of character bounding box\n\t\t\t\tfloat halfCharWidth = ceil(charWidth * .5);\n\t\t\t\tif (floor(uv.x) > halfCharStep + halfCharWidth ||\n\t\t\t\t\tfloor(uv.x) < halfCharStep - halfCharWidth) return;\n\n\t\t\t\tuv += charId * charStep;\n\t\t\t\tuv = uv / atlasSize;\n\n\t\t\t\tvec4 color = fontColor;\n\t\t\t\tvec4 mask = texture2D(atlas, uv);\n\n\t\t\t\tfloat maskY = lightness(mask);\n\t\t\t\t// float colorY = lightness(color);\n\t\t\t\tcolor.a *= maskY;\n\t\t\t\tcolor.a *= opacity;\n\n\t\t\t\t// color.a += .1;\n\n\t\t\t\t// antialiasing, see yiq color space y-channel formula\n\t\t\t\t// color.rgb += (1. - color.rgb) * (1. - mask.rgb);\n\n\t\t\t\tgl_FragColor = color;\n\t\t\t}"});return{regl:t,draw:e,atlas:{}}},T.prototype.update=function(t){var e=this;if("string"==typeof t)t={text:t};else if(!t)return;null!=(t=i(t,{position:"position positions coord coords coordinates",font:"font fontFace fontface typeface cssFont css-font family fontFamily",fontSize:"fontSize fontsize size font-size",text:"text texts chars characters value values symbols",align:"align alignment textAlign textbaseline",baseline:"baseline textBaseline textbaseline",direction:"dir direction textDirection",color:"color colour fill fill-color fillColor textColor textcolor",kerning:"kerning kern",range:"range dataBox",viewport:"vp viewport viewBox viewbox viewPort",opacity:"opacity alpha transparency visible visibility opaque",offset:"offset positionOffset padding shift indent indentation"},!0)).opacity&&(Array.isArray(t.opacity)?this.opacity=t.opacity.map((function(t){return parseFloat(t)})):this.opacity=parseFloat(t.opacity)),null!=t.viewport&&(this.viewport=f(t.viewport),this.viewportArray=[this.viewport.x,this.viewport.y,this.viewport.width,this.viewport.height]),null==this.viewport&&(this.viewport={x:0,y:0,width:this.gl.drawingBufferWidth,height:this.gl.drawingBufferHeight},this.viewportArray=[this.viewport.x,this.viewport.y,this.viewport.width,this.viewport.height]),null!=t.kerning&&(this.kerning=t.kerning),null!=t.offset&&("number"==typeof t.offset&&(t.offset=[t.offset,0]),this.positionOffset=m(t.offset)),t.direction&&(this.direction=t.direction),t.range&&(this.range=t.range,this.scale=[1/(t.range[2]-t.range[0]),1/(t.range[3]-t.range[1])],this.translate=[-t.range[0],-t.range[1]]),t.scale&&(this.scale=t.scale),t.translate&&(this.translate=t.translate),this.scale||(this.scale=[1/this.viewport.width,1/this.viewport.height]),this.translate||(this.translate=[0,0]),this.font.length||t.font||(t.font=T.baseFontSize+"px sans-serif");var r,a=!1,o=!1;if(t.font&&(Array.isArray(t.font)?t.font:[t.font]).forEach((function(t,r){if("string"==typeof t)try{t=n.parse(t)}catch(e){t=n.parse(T.baseFontSize+"px "+t)}else t=n.parse(n.stringify(t));var i=n.stringify({size:T.baseFontSize,family:t.family,stretch:_?t.stretch:void 0,variant:t.variant,weight:t.weight,style:t.style}),s=p(t.size),l=Math.round(s[0]*d(s[1]));if(l!==e.fontSize[r]&&(o=!0,e.fontSize[r]=l),!(e.font[r]&&i==e.font[r].baseString||(a=!0,e.font[r]=T.fonts[i],e.font[r]))){var u=t.family.join(", "),c=[t.style];t.style!=t.variant&&c.push(t.variant),t.variant!=t.weight&&c.push(t.weight),_&&t.weight!=t.stretch&&c.push(t.stretch),e.font[r]={baseString:i,family:u,weight:t.weight,stretch:t.stretch,style:t.style,variant:t.variant,width:{},kerning:{},metrics:y(u,{origin:"top",fontSize:T.baseFontSize,fontStyle:c.join(" ")})},T.fonts[i]=e.font[r]}})),(a||o)&&this.font.forEach((function(r,i){var a=n.stringify({size:e.fontSize[i],family:r.family,stretch:_?r.stretch:void 0,variant:r.variant,weight:r.weight,style:r.style});if(e.fontAtlas[i]=e.shader.atlas[a],!e.fontAtlas[i]){var o=r.metrics;e.shader.atlas[a]=e.fontAtlas[i]={fontString:a,step:2*Math.ceil(e.fontSize[i]*o.bottom*.5),em:e.fontSize[i],cols:0,rows:0,height:0,width:0,chars:[],ids:{},texture:e.regl.texture()}}null==t.text&&(t.text=e.text)})),"string"==typeof t.text&&t.position&&t.position.length>2){for(var s=Array(.5*t.position.length),h=0;h2){for(var w=!t.position[0].length,k=c.mallocFloat(2*this.count),A=0,M=0;A1?e.align[r]:e.align[0]:e.align;if("number"==typeof n)return n;switch(n){case"right":case"end":return-t;case"center":case"centre":case"middle":return.5*-t}return 0}))),null==this.baseline&&null==t.baseline&&(t.baseline=0),null!=t.baseline&&(this.baseline=t.baseline,Array.isArray(this.baseline)||(this.baseline=[this.baseline]),this.baselineOffset=this.baseline.map((function(t,r){var n=(e.font[r]||e.font[0]).metrics,i=0;return i+=.5*n.bottom,-1*(i+="number"==typeof t?t-n.baseline:-n[t])}))),null!=t.color)if(t.color||(t.color="transparent"),"string"!=typeof t.color&&isNaN(t.color)){var q;if("number"==typeof t.color[0]&&t.color.length>this.counts.length){var G=t.color.length;q=c.mallocUint8(G);for(var Z=(t.color.subarray||t.color.slice).bind(t.color),Y=0;Y4||this.baselineOffset.length>1||this.align&&this.align.length>1||this.fontAtlas.length>1||this.positionOffset.length>2){var J=Math.max(.5*this.position.length||0,.25*this.color.length||0,this.baselineOffset.length||0,this.alignOffset.length||0,this.font.length||0,this.opacity.length||0,.5*this.positionOffset.length||0);this.batch=Array(J);for(var K=0;K1?this.counts[K]:this.counts[0],offset:this.textOffsets.length>1?this.textOffsets[K]:this.textOffsets[0],color:this.color?this.color.length<=4?this.color:this.color.subarray(4*K,4*K+4):[0,0,0,255],opacity:Array.isArray(this.opacity)?this.opacity[K]:this.opacity,baseline:null!=this.baselineOffset[K]?this.baselineOffset[K]:this.baselineOffset[0],align:this.align?null!=this.alignOffset[K]?this.alignOffset[K]:this.alignOffset[0]:0,atlas:this.fontAtlas[K]||this.fontAtlas[0],positionOffset:this.positionOffset.length>2?this.positionOffset.subarray(2*K,2*K+2):this.positionOffset}}else this.count?this.batch=[{count:this.count,offset:0,color:this.color||[0,0,0,255],opacity:Array.isArray(this.opacity)?this.opacity[0]:this.opacity,baseline:this.baselineOffset[0],align:this.alignOffset?this.alignOffset[0]:0,atlas:this.fontAtlas[0],positionOffset:this.positionOffset}]:this.batch=[]},T.prototype.destroy=function(){},T.prototype.kerning=!0,T.prototype.position={constant:new Float32Array(2)},T.prototype.translate=null,T.prototype.scale=null,T.prototype.font=null,T.prototype.text="",T.prototype.positionOffset=[0,0],T.prototype.opacity=1,T.prototype.color=new Uint8Array([0,0,0,255]),T.prototype.alignOffset=[0,0],T.maxAtlasSize=1024,T.atlasCanvas=document.createElement("canvas"),T.atlasContext=T.atlasCanvas.getContext("2d",{alpha:!1}),T.baseFontSize=64,T.fonts={},t.exports=T},12018:function(t,e,r){"use strict";var n=r(71299);function i(t){if(t.container)if(t.container==document.body)document.body.style.width||(t.canvas.width=t.width||t.pixelRatio*r.g.innerWidth),document.body.style.height||(t.canvas.height=t.height||t.pixelRatio*r.g.innerHeight);else{var e=t.container.getBoundingClientRect();t.canvas.width=t.width||e.right-e.left,t.canvas.height=t.height||e.bottom-e.top}}function a(t){return"function"==typeof t.getContext&&"width"in t&&"height"in t}function o(){var t=document.createElement("canvas");return t.style.position="absolute",t.style.top=0,t.style.left=0,t}t.exports=function(t){var e;if(t?"string"==typeof t&&(t={container:t}):t={},(t=a(t)||"string"==typeof(e=t).nodeName&&"function"==typeof e.appendChild&&"function"==typeof e.getBoundingClientRect?{container:t}:function(t){return"function"==typeof t.drawArrays||"function"==typeof t.drawElements}(t)?{gl:t}:n(t,{container:"container target element el canvas holder parent parentNode wrapper use ref root node",gl:"gl context webgl glContext",attrs:"attributes attrs contextAttributes",pixelRatio:"pixelRatio pxRatio px ratio pxratio pixelratio",width:"w width",height:"h height"},!0)).pixelRatio||(t.pixelRatio=r.g.pixelRatio||1),t.gl)return t.gl;if(t.canvas&&(t.container=t.canvas.parentNode),t.container){if("string"==typeof t.container){var s=document.querySelector(t.container);if(!s)throw Error("Element "+t.container+" is not found");t.container=s}a(t.container)?(t.canvas=t.container,t.container=t.canvas.parentNode):t.canvas||(t.canvas=o(),t.container.appendChild(t.canvas),i(t))}else if(!t.canvas){if("undefined"==typeof document)throw Error("Not DOM environment. Use headless-gl.");t.container=document.body||document.documentElement,t.canvas=o(),t.container.appendChild(t.canvas),i(t)}return t.gl||["webgl","experimental-webgl","webgl-experimental"].some((function(e){try{t.gl=t.canvas.getContext(e,t.attrs)}catch(t){}return t.gl})),t.gl}},56068:function(t){t.exports=function(t){"string"==typeof t&&(t=[t]);for(var e=[].slice.call(arguments,1),r=[],n=0;n>1,c=-7,f=r?i-1:0,h=r?-1:1,p=t[e+f];for(f+=h,a=p&(1<<-c)-1,p>>=-c,c+=s;c>0;a=256*a+t[e+f],f+=h,c-=8);for(o=a&(1<<-c)-1,a>>=-c,c+=n;c>0;o=256*o+t[e+f],f+=h,c-=8);if(0===a)a=1-u;else{if(a===l)return o?NaN:1/0*(p?-1:1);o+=Math.pow(2,n),a-=u}return(p?-1:1)*o*Math.pow(2,a-n)},e.write=function(t,e,r,n,i,a){var o,s,l,u=8*a-i-1,c=(1<>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:a-1,d=n?1:-1,v=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,o=c):(o=Math.floor(Math.log(e)/Math.LN2),e*(l=Math.pow(2,-o))<1&&(o--,l*=2),(e+=o+f>=1?h/l:h*Math.pow(2,1-f))*l>=2&&(o++,l/=2),o+f>=c?(s=0,o=c):o+f>=1?(s=(e*l-1)*Math.pow(2,i),o+=f):(s=e*Math.pow(2,f-1)*Math.pow(2,i),o=0));i>=8;t[r+p]=255&s,p+=d,s/=256,i-=8);for(o=o<0;t[r+p]=255&o,p+=d,o/=256,u-=8);t[r+p-d]|=128*v}},42018:function(t){"function"==typeof Object.create?t.exports=function(t,e){e&&(t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}))}:t.exports=function(t,e){if(e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}}},47216:function(t,e,r){"use strict";var n=r(84543)(),i=r(6614)("Object.prototype.toString"),a=function(t){return!(n&&t&&"object"==typeof t&&Symbol.toStringTag in t)&&"[object Arguments]"===i(t)},o=function(t){return!!a(t)||null!==t&&"object"==typeof t&&"number"==typeof t.length&&t.length>=0&&"[object Array]"!==i(t)&&"[object Function]"===i(t.callee)},s=function(){return a(arguments)}();a.isLegacyArguments=o,t.exports=s?a:o},54404:function(t){t.exports=!0},85395:function(t){"use strict";var e,r,n=Function.prototype.toString,i="object"==typeof Reflect&&null!==Reflect&&Reflect.apply;if("function"==typeof i&&"function"==typeof Object.defineProperty)try{e=Object.defineProperty({},"length",{get:function(){throw r}}),r={},i((function(){throw 42}),null,e)}catch(t){t!==r&&(i=null)}else i=null;var a=/^\s*class\b/,o=function(t){try{var e=n.call(t);return a.test(e)}catch(t){return!1}},s=function(t){try{return!o(t)&&(n.call(t),!0)}catch(t){return!1}},l=Object.prototype.toString,u="function"==typeof Symbol&&!!Symbol.toStringTag,c=!(0 in[,]),f=function(){return!1};if("object"==typeof document){var h=document.all;l.call(h)===l.call(document.all)&&(f=function(t){if((c||!t)&&(void 0===t||"object"==typeof t))try{var e=l.call(t);return("[object HTMLAllCollection]"===e||"[object HTML document.all class]"===e||"[object HTMLCollection]"===e||"[object Object]"===e)&&null==t("")}catch(t){}return!1})}t.exports=i?function(t){if(f(t))return!0;if(!t)return!1;if("function"!=typeof t&&"object"!=typeof t)return!1;try{i(t,null,e)}catch(t){if(t!==r)return!1}return!o(t)&&s(t)}:function(t){if(f(t))return!0;if(!t)return!1;if("function"!=typeof t&&"object"!=typeof t)return!1;if(u)return s(t);if(o(t))return!1;var e=l.call(t);return!("[object Function]"!==e&&"[object GeneratorFunction]"!==e&&!/^\[object HTML/.test(e))&&s(t)}},65481:function(t,e,r){"use strict";var n,i=Object.prototype.toString,a=Function.prototype.toString,o=/^\s*(?:function)?\*/,s=r(84543)(),l=Object.getPrototypeOf;t.exports=function(t){if("function"!=typeof t)return!1;if(o.test(a.call(t)))return!0;if(!s)return"[object GeneratorFunction]"===i.call(t);if(!l)return!1;if(void 0===n){var e=function(){if(!s)return!1;try{return Function("return function*() {}")()}catch(t){}}();n=!!e&&l(e)}return l(t)===n}},62683:function(t){"use strict";t.exports="undefined"!=typeof navigator&&(/MSIE/.test(navigator.userAgent)||/Trident\//.test(navigator.appVersion))},64274:function(t){"use strict";t.exports=function(t){return t!=t}},15567:function(t,e,r){"use strict";var n=r(68222),i=r(17045),a=r(64274),o=r(14922),s=r(22442),l=n(o(),Number);i(l,{getPolyfill:o,implementation:a,shim:s}),t.exports=l},14922:function(t,e,r){"use strict";var n=r(64274);t.exports=function(){return Number.isNaN&&Number.isNaN(NaN)&&!Number.isNaN("a")?Number.isNaN:n}},22442:function(t,e,r){"use strict";var n=r(17045),i=r(14922);t.exports=function(){var t=i();return n(Number,{isNaN:t},{isNaN:function(){return Number.isNaN!==t}}),t}},64941:function(t){"use strict";t.exports=function(t){var e=typeof t;return null!==t&&("object"===e||"function"===e)}},10973:function(t){"use strict";var e=Object.prototype.toString;t.exports=function(t){var r;return"[object Object]"===e.call(t)&&(null===(r=Object.getPrototypeOf(t))||r===Object.getPrototypeOf({}))}},18546:function(t){"use strict";t.exports=function(t){for(var e,r=t.length,n=0;n13)&&32!==e&&133!==e&&160!==e&&5760!==e&&6158!==e&&(e<8192||e>8205)&&8232!==e&&8233!==e&&8239!==e&&8287!==e&&8288!==e&&12288!==e&&65279!==e)return!1;return!0}},89546:function(t){"use strict";t.exports=function(t){return"string"==typeof t&&(t=t.trim(),!!(/^[mzlhvcsqta]\s*[-+.0-9][^mlhvzcsqta]+/i.test(t)&&/[\dz]$/i.test(t)&&t.length>4))}},9187:function(t,e,r){"use strict";var n=r(31353),i=r(72077),a=r(6614),o=a("Object.prototype.toString"),s=r(84543)(),l=r(40383),u="undefined"==typeof globalThis?r.g:globalThis,c=i(),f=a("Array.prototype.indexOf",!0)||function(t,e){for(var r=0;r-1}return!!l&&function(t){var e=!1;return n(p,(function(r,n){if(!e)try{e=r.call(t)===n}catch(t){}})),e}(t)}},44517:function(t){t.exports=function(){"use strict";var t,e,r;function n(n,i){if(t)if(e){var a="var sharedChunk = {}; ("+t+")(sharedChunk); ("+e+")(sharedChunk);",o={};t(o),(r=i(o)).workerUrl=window.URL.createObjectURL(new Blob([a],{type:"text/javascript"}))}else e=i;else t=i}return n(0,(function(t){function e(t,e){return t(e={exports:{}},e.exports),e.exports}var r="1.10.1",n=i;function i(t,e,r,n){this.cx=3*t,this.bx=3*(r-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*e,this.by=3*(n-e)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=n,this.p2x=r,this.p2y=n}i.prototype.sampleCurveX=function(t){return((this.ax*t+this.bx)*t+this.cx)*t},i.prototype.sampleCurveY=function(t){return((this.ay*t+this.by)*t+this.cy)*t},i.prototype.sampleCurveDerivativeX=function(t){return(3*this.ax*t+2*this.bx)*t+this.cx},i.prototype.solveCurveX=function(t,e){var r,n,i,a,o;for(void 0===e&&(e=1e-6),i=t,o=0;o<8;o++){if(a=this.sampleCurveX(i)-t,Math.abs(a)(n=1))return n;for(;ra?r=i:n=i,i=.5*(n-r)+r}return i},i.prototype.solve=function(t,e){return this.sampleCurveY(this.solveCurveX(t,e))};var a=o;function o(t,e){this.x=t,this.y=e}function s(t,e,r,i){var a=new n(t,e,r,i);return function(t){return a.solve(t)}}o.prototype={clone:function(){return new o(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},multByPoint:function(t){return this.clone()._multByPoint(t)},divByPoint:function(t){return this.clone()._divByPoint(t)},mult:function(t){return this.clone()._mult(t)},div:function(t){return this.clone()._div(t)},rotate:function(t){return this.clone()._rotate(t)},rotateAround:function(t,e){return this.clone()._rotateAround(t,e)},matMult:function(t){return this.clone()._matMult(t)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(t){return this.x===t.x&&this.y===t.y},dist:function(t){return Math.sqrt(this.distSqr(t))},distSqr:function(t){var e=t.x-this.x,r=t.y-this.y;return e*e+r*r},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(t){return Math.atan2(this.y-t.y,this.x-t.x)},angleWith:function(t){return this.angleWithSep(t.x,t.y)},angleWithSep:function(t,e){return Math.atan2(this.x*e-this.y*t,this.x*t+this.y*e)},_matMult:function(t){var e=t[0]*this.x+t[1]*this.y,r=t[2]*this.x+t[3]*this.y;return this.x=e,this.y=r,this},_add:function(t){return this.x+=t.x,this.y+=t.y,this},_sub:function(t){return this.x-=t.x,this.y-=t.y,this},_mult:function(t){return this.x*=t,this.y*=t,this},_div:function(t){return this.x/=t,this.y/=t,this},_multByPoint:function(t){return this.x*=t.x,this.y*=t.y,this},_divByPoint:function(t){return this.x/=t.x,this.y/=t.y,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var t=this.y;return this.y=this.x,this.x=-t,this},_rotate:function(t){var e=Math.cos(t),r=Math.sin(t),n=e*this.x-r*this.y,i=r*this.x+e*this.y;return this.x=n,this.y=i,this},_rotateAround:function(t,e){var r=Math.cos(t),n=Math.sin(t),i=e.x+r*(this.x-e.x)-n*(this.y-e.y),a=e.y+n*(this.x-e.x)+r*(this.y-e.y);return this.x=i,this.y=a,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},o.convert=function(t){return t instanceof o?t:Array.isArray(t)?new o(t[0],t[1]):t};var l=s(.25,.1,.25,1);function u(t,e,r){return Math.min(r,Math.max(e,t))}function c(t,e,r){var n=r-e,i=((t-e)%n+n)%n+e;return i===e?r:i}function f(t){for(var e=[],r=arguments.length-1;r-- >0;)e[r]=arguments[r+1];for(var n=0,i=e;n>e/4).toString(16):([1e7]+-[1e3]+-4e3+-8e3+-1e11).replace(/[018]/g,t)}()}function v(t){return!!t&&/^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(t)}function g(t,e){t.forEach((function(t){e[t]&&(e[t]=e[t].bind(e))}))}function y(t,e){return-1!==t.indexOf(e,t.length-e.length)}function m(t,e,r){var n={};for(var i in t)n[i]=e.call(r||this,t[i],i,t);return n}function x(t,e,r){var n={};for(var i in t)e.call(r||this,t[i],i,t)&&(n[i]=t[i]);return n}function b(t){return Array.isArray(t)?t.map(b):"object"==typeof t&&t?m(t,b):t}var _={};function w(t){_[t]||("undefined"!=typeof console&&console.warn(t),_[t]=!0)}function T(t,e,r){return(r.y-t.y)*(e.x-t.x)>(e.y-t.y)*(r.x-t.x)}function k(t){for(var e=0,r=0,n=t.length,i=n-1,a=void 0,o=void 0;r@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g,(function(t,r,n,i){var a=n||i;return e[r]=!a||a.toLowerCase(),""})),e["max-age"]){var r=parseInt(e["max-age"],10);isNaN(r)?delete e["max-age"]:e["max-age"]=r}return e}var S=null;function E(t){if(null==S){var e=t.navigator?t.navigator.userAgent:null;S=!!t.safari||!(!e||!(/\b(iPad|iPhone|iPod)\b/.test(e)||e.match("Safari")&&!e.match("Chrome")))}return S}function L(t){try{var e=self[t];return e.setItem("_mapbox_test_",1),e.removeItem("_mapbox_test_"),!0}catch(t){return!1}}var C,P,O,I,D=self.performance&&self.performance.now?self.performance.now.bind(self.performance):Date.now.bind(Date),z=self.requestAnimationFrame||self.mozRequestAnimationFrame||self.webkitRequestAnimationFrame||self.msRequestAnimationFrame,R=self.cancelAnimationFrame||self.mozCancelAnimationFrame||self.webkitCancelAnimationFrame||self.msCancelAnimationFrame,F={now:D,frame:function(t){var e=z(t);return{cancel:function(){return R(e)}}},getImageData:function(t,e){void 0===e&&(e=0);var r=self.document.createElement("canvas"),n=r.getContext("2d");if(!n)throw new Error("failed to create canvas 2d context");return r.width=t.width,r.height=t.height,n.drawImage(t,0,0,t.width,t.height),n.getImageData(-e,-e,t.width+2*e,t.height+2*e)},resolveURL:function(t){return C||(C=self.document.createElement("a")),C.href=t,C.href},hardwareConcurrency:self.navigator.hardwareConcurrency||4,get devicePixelRatio(){return self.devicePixelRatio},get prefersReducedMotion(){return!!self.matchMedia&&(null==P&&(P=self.matchMedia("(prefers-reduced-motion: reduce)")),P.matches)}},B={API_URL:"https://api.mapbox.com",get EVENTS_URL(){return this.API_URL?0===this.API_URL.indexOf("https://api.mapbox.cn")?"https://events.mapbox.cn/events/v2":0===this.API_URL.indexOf("https://api.mapbox.com")?"https://events.mapbox.com/events/v2":null:null},FEEDBACK_URL:"https://apps.mapbox.com/feedback",REQUIRE_ACCESS_TOKEN:!0,ACCESS_TOKEN:null,MAX_PARALLEL_IMAGE_REQUESTS:16},N={supported:!1,testSupport:function(t){!j&&I&&(U?V(t):O=t)}},j=!1,U=!1;function V(t){var e=t.createTexture();t.bindTexture(t.TEXTURE_2D,e);try{if(t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,I),t.isContextLost())return;N.supported=!0}catch(t){}t.deleteTexture(e),j=!0}self.document&&((I=self.document.createElement("img")).onload=function(){O&&V(O),O=null,U=!0},I.onerror=function(){j=!0,O=null},I.src="data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=");var H="01";var q=function(t,e){this._transformRequestFn=t,this._customAccessToken=e,this._createSkuToken()};function G(t){return 0===t.indexOf("mapbox:")}q.prototype._createSkuToken=function(){var t=function(){for(var t="",e=0;e<10;e++)t+="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[Math.floor(62*Math.random())];return{token:["1",H,t].join(""),tokenExpiresAt:Date.now()+432e5}}();this._skuToken=t.token,this._skuTokenExpiresAt=t.tokenExpiresAt},q.prototype._isSkuTokenExpired=function(){return Date.now()>this._skuTokenExpiresAt},q.prototype.transformRequest=function(t,e){return this._transformRequestFn&&this._transformRequestFn(t,e)||{url:t}},q.prototype.normalizeStyleURL=function(t,e){if(!G(t))return t;var r=X(t);return r.path="/styles/v1"+r.path,this._makeAPIURL(r,this._customAccessToken||e)},q.prototype.normalizeGlyphsURL=function(t,e){if(!G(t))return t;var r=X(t);return r.path="/fonts/v1"+r.path,this._makeAPIURL(r,this._customAccessToken||e)},q.prototype.normalizeSourceURL=function(t,e){if(!G(t))return t;var r=X(t);return r.path="/v4/"+r.authority+".json",r.params.push("secure"),this._makeAPIURL(r,this._customAccessToken||e)},q.prototype.normalizeSpriteURL=function(t,e,r,n){var i=X(t);return G(t)?(i.path="/styles/v1"+i.path+"/sprite"+e+r,this._makeAPIURL(i,this._customAccessToken||n)):(i.path+=""+e+r,J(i))},q.prototype.normalizeTileURL=function(t,e){if(this._isSkuTokenExpired()&&this._createSkuToken(),t&&!G(t))return t;var r=X(t),n=F.devicePixelRatio>=2||512===e?"@2x":"",i=N.supported?".webp":"$1";r.path=r.path.replace(/(\.(png|jpg)\d*)(?=$)/,""+n+i),r.path=r.path.replace(/^.+\/v4\//,"/"),r.path="/v4"+r.path;var a=this._customAccessToken||function(t){for(var e=0,r=t;e=1&&self.localStorage.setItem(e,JSON.stringify(this.eventData))}catch(t){w("Unable to write to LocalStorage")}},Q.prototype.processRequests=function(t){},Q.prototype.postEvent=function(t,e,n,i){var a=this;if(B.EVENTS_URL){var o=X(B.EVENTS_URL);o.params.push("access_token="+(i||B.ACCESS_TOKEN||""));var s={event:this.type,created:new Date(t).toISOString(),sdkIdentifier:"mapbox-gl-js",sdkVersion:r,skuId:H,userId:this.anonId},l=e?f(s,e):s,u={url:J(o),headers:{"Content-Type":"text/plain"},body:JSON.stringify([l])};this.pendingRequest=At(u,(function(t){a.pendingRequest=null,n(t),a.saveEventData(),a.processRequests(i)}))}},Q.prototype.queueRequest=function(t,e){this.queue.push(t),this.processRequests(e)};var tt,et,rt=function(t){function e(){t.call(this,"map.load"),this.success={},this.skuToken=""}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.postMapLoadEvent=function(t,e,r,n){this.skuToken=r,(B.EVENTS_URL&&n||B.ACCESS_TOKEN&&Array.isArray(t)&&t.some((function(t){return G(t)||Y(t)})))&&this.queueRequest({id:e,timestamp:Date.now()},n)},e.prototype.processRequests=function(t){var e=this;if(!this.pendingRequest&&0!==this.queue.length){var r=this.queue.shift(),n=r.id,i=r.timestamp;n&&this.success[n]||(this.anonId||this.fetchEventData(),v(this.anonId)||(this.anonId=d()),this.postEvent(i,{skuToken:this.skuToken},(function(t){t||n&&(e.success[n]=!0)}),t))}},e}(Q),nt=function(t){function e(e){t.call(this,"appUserTurnstile"),this._customAccessToken=e}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.postTurnstileEvent=function(t,e){B.EVENTS_URL&&B.ACCESS_TOKEN&&Array.isArray(t)&&t.some((function(t){return G(t)||Y(t)}))&&this.queueRequest(Date.now(),e)},e.prototype.processRequests=function(t){var e=this;if(!this.pendingRequest&&0!==this.queue.length){this.anonId&&this.eventData.lastSuccess&&this.eventData.tokenU||this.fetchEventData();var r=$(B.ACCESS_TOKEN),n=r?r.u:B.ACCESS_TOKEN,i=n!==this.eventData.tokenU;v(this.anonId)||(this.anonId=d(),i=!0);var a=this.queue.shift();if(this.eventData.lastSuccess){var o=new Date(this.eventData.lastSuccess),s=new Date(a),l=(a-this.eventData.lastSuccess)/864e5;i=i||l>=1||l<-1||o.getDate()!==s.getDate()}else i=!0;if(!i)return this.processRequests();this.postEvent(a,{"enabled.telemetry":!1},(function(t){t||(e.eventData.lastSuccess=a,e.eventData.tokenU=n)}),t)}},e}(Q),it=new nt,at=it.postTurnstileEvent.bind(it),ot=new rt,st=ot.postMapLoadEvent.bind(ot),lt="mapbox-tiles",ut=500,ct=50,ft=42e4;function ht(){self.caches&&!tt&&(tt=self.caches.open(lt))}function pt(t,e,r){if(ht(),tt){var n={status:e.status,statusText:e.statusText,headers:new self.Headers};e.headers.forEach((function(t,e){return n.headers.set(e,t)}));var i=M(e.headers.get("Cache-Control")||"");i["no-store"]||(i["max-age"]&&n.headers.set("Expires",new Date(r+1e3*i["max-age"]).toUTCString()),new Date(n.headers.get("Expires")).getTime()-rDate.now()&&!r["no-cache"]}(n);t.delete(r),i&&t.put(r,n.clone()),e(null,n,i)})).catch(e)})).catch(e)}var gt,yt=1/0;function mt(){return null==gt&&(gt=self.OffscreenCanvas&&new self.OffscreenCanvas(1,1).getContext("2d")&&"function"==typeof self.createImageBitmap),gt}var xt={Unknown:"Unknown",Style:"Style",Source:"Source",Tile:"Tile",Glyphs:"Glyphs",SpriteImage:"SpriteImage",SpriteJSON:"SpriteJSON",Image:"Image"};"function"==typeof Object.freeze&&Object.freeze(xt);var bt=function(t){function e(e,r,n){401===r&&Y(n)&&(e+=": you may have provided an invalid Mapbox access token. See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes"),t.call(this,e),this.status=r,this.url=n,this.name=this.constructor.name,this.message=e}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.toString=function(){return this.name+": "+this.message+" ("+this.status+"): "+this.url},e}(Error),_t=A()?function(){return self.worker&&self.worker.referrer}:function(){return("blob:"===self.location.protocol?self.parent:self).location.href};function wt(t,e){var r,n=new self.AbortController,i=new self.Request(t.url,{method:t.method||"GET",body:t.body,credentials:t.credentials,headers:t.headers,referrer:_t(),signal:n.signal}),a=!1,o=!1,s=(r=i.url).indexOf("sku=")>0&&Y(r);"json"===t.type&&i.headers.set("Accept","application/json");var l=function(r,n,a){if(!o){if(r&&"SecurityError"!==r.message&&w(r),n&&a)return u(n);var l=Date.now();self.fetch(i).then((function(r){if(r.ok){var n=s?r.clone():null;return u(r,n,l)}return e(new bt(r.statusText,r.status,t.url))})).catch((function(t){20!==t.code&&e(new Error(t.message))}))}},u=function(r,n,s){("arrayBuffer"===t.type?r.arrayBuffer():"json"===t.type?r.json():r.text()).then((function(t){o||(n&&s&&pt(i,n,s),a=!0,e(null,t,r.headers.get("Cache-Control"),r.headers.get("Expires")))})).catch((function(t){o||e(new Error(t.message))}))};return s?vt(i,l):l(null,null),{cancel:function(){o=!0,a||n.abort()}}}var Tt=function(t,e){if(r=t.url,!(/^file:/.test(r)||/^file:/.test(_t())&&!/^\w+:/.test(r))){if(self.fetch&&self.Request&&self.AbortController&&self.Request.prototype.hasOwnProperty("signal"))return wt(t,e);if(A()&&self.worker&&self.worker.actor){return self.worker.actor.send("getResource",t,e,void 0,!0)}}var r;return function(t,e){var r=new self.XMLHttpRequest;for(var n in r.open(t.method||"GET",t.url,!0),"arrayBuffer"===t.type&&(r.responseType="arraybuffer"),t.headers)r.setRequestHeader(n,t.headers[n]);return"json"===t.type&&(r.responseType="text",r.setRequestHeader("Accept","application/json")),r.withCredentials="include"===t.credentials,r.onerror=function(){e(new Error(r.statusText))},r.onload=function(){if((r.status>=200&&r.status<300||0===r.status)&&null!==r.response){var n=r.response;if("json"===t.type)try{n=JSON.parse(r.response)}catch(t){return e(t)}e(null,n,r.getResponseHeader("Cache-Control"),r.getResponseHeader("Expires"))}else e(new bt(r.statusText,r.status,t.url))},r.send(t.body),{cancel:function(){return r.abort()}}}(t,e)},kt=function(t,e){return Tt(f(t,{type:"arrayBuffer"}),e)},At=function(t,e){return Tt(f(t,{method:"POST"}),e)};var Mt,St;Mt=[],St=0;var Et=function(t,e){if(N.supported&&(t.headers||(t.headers={}),t.headers.accept="image/webp,*/*"),St>=B.MAX_PARALLEL_IMAGE_REQUESTS){var r={requestParameters:t,callback:e,cancelled:!1,cancel:function(){this.cancelled=!0}};return Mt.push(r),r}St++;var n=!1,i=function(){if(!n)for(n=!0,St--;Mt.length&&St0||this._oneTimeListeners&&this._oneTimeListeners[t]&&this._oneTimeListeners[t].length>0||this._eventedParent&&this._eventedParent.listens(t)},It.prototype.setEventedParent=function(t,e){return this._eventedParent=t,this._eventedParentData=e,this};var Dt={$version:8,$root:{version:{required:!0,type:"enum",values:[8]},name:{type:"string"},metadata:{type:"*"},center:{type:"array",value:"number"},zoom:{type:"number"},bearing:{type:"number",default:0,period:360,units:"degrees"},pitch:{type:"number",default:0,units:"degrees"},light:{type:"light"},sources:{required:!0,type:"sources"},sprite:{type:"string"},glyphs:{type:"string"},transition:{type:"transition"},layers:{required:!0,type:"array",value:"layer"}},sources:{"*":{type:"source"}},source:["source_vector","source_raster","source_raster_dem","source_geojson","source_video","source_image"],source_vector:{type:{required:!0,type:"enum",values:{vector:{}}},url:{type:"string"},tiles:{type:"array",value:"string"},bounds:{type:"array",value:"number",length:4,default:[-180,-85.051129,180,85.051129]},scheme:{type:"enum",values:{xyz:{},tms:{}},default:"xyz"},minzoom:{type:"number",default:0},maxzoom:{type:"number",default:22},attribution:{type:"string"},promoteId:{type:"promoteId"},"*":{type:"*"}},source_raster:{type:{required:!0,type:"enum",values:{raster:{}}},url:{type:"string"},tiles:{type:"array",value:"string"},bounds:{type:"array",value:"number",length:4,default:[-180,-85.051129,180,85.051129]},minzoom:{type:"number",default:0},maxzoom:{type:"number",default:22},tileSize:{type:"number",default:512,units:"pixels"},scheme:{type:"enum",values:{xyz:{},tms:{}},default:"xyz"},attribution:{type:"string"},"*":{type:"*"}},source_raster_dem:{type:{required:!0,type:"enum",values:{"raster-dem":{}}},url:{type:"string"},tiles:{type:"array",value:"string"},bounds:{type:"array",value:"number",length:4,default:[-180,-85.051129,180,85.051129]},minzoom:{type:"number",default:0},maxzoom:{type:"number",default:22},tileSize:{type:"number",default:512,units:"pixels"},attribution:{type:"string"},encoding:{type:"enum",values:{terrarium:{},mapbox:{}},default:"mapbox"},"*":{type:"*"}},source_geojson:{type:{required:!0,type:"enum",values:{geojson:{}}},data:{type:"*"},maxzoom:{type:"number",default:18},attribution:{type:"string"},buffer:{type:"number",default:128,maximum:512,minimum:0},tolerance:{type:"number",default:.375},cluster:{type:"boolean",default:!1},clusterRadius:{type:"number",default:50,minimum:0},clusterMaxZoom:{type:"number"},clusterProperties:{type:"*"},lineMetrics:{type:"boolean",default:!1},generateId:{type:"boolean",default:!1},promoteId:{type:"promoteId"}},source_video:{type:{required:!0,type:"enum",values:{video:{}}},urls:{required:!0,type:"array",value:"string"},coordinates:{required:!0,type:"array",length:4,value:{type:"array",length:2,value:"number"}}},source_image:{type:{required:!0,type:"enum",values:{image:{}}},url:{required:!0,type:"string"},coordinates:{required:!0,type:"array",length:4,value:{type:"array",length:2,value:"number"}}},layer:{id:{type:"string",required:!0},type:{type:"enum",values:{fill:{},line:{},symbol:{},circle:{},heatmap:{},"fill-extrusion":{},raster:{},hillshade:{},background:{}},required:!0},metadata:{type:"*"},source:{type:"string"},"source-layer":{type:"string"},minzoom:{type:"number",minimum:0,maximum:24},maxzoom:{type:"number",minimum:0,maximum:24},filter:{type:"filter"},layout:{type:"layout"},paint:{type:"paint"}},layout:["layout_fill","layout_line","layout_circle","layout_heatmap","layout_fill-extrusion","layout_symbol","layout_raster","layout_hillshade","layout_background"],layout_background:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_fill:{"fill-sort-key":{type:"number",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_circle:{"circle-sort-key":{type:"number",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_heatmap:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},"layout_fill-extrusion":{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_line:{"line-cap":{type:"enum",values:{butt:{},round:{},square:{}},default:"butt",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"line-join":{type:"enum",values:{bevel:{},round:{},miter:{}},default:"miter",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"line-miter-limit":{type:"number",default:2,requires:[{"line-join":"miter"}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"line-round-limit":{type:"number",default:1.05,requires:[{"line-join":"round"}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"line-sort-key":{type:"number",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_symbol:{"symbol-placement":{type:"enum",values:{point:{},line:{},"line-center":{}},default:"point",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"symbol-spacing":{type:"number",default:250,minimum:1,units:"pixels",requires:[{"symbol-placement":"line"}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"symbol-avoid-edges":{type:"boolean",default:!1,expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"symbol-sort-key":{type:"number",expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"symbol-z-order":{type:"enum",values:{auto:{},"viewport-y":{},source:{}},default:"auto",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-allow-overlap":{type:"boolean",default:!1,requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-ignore-placement":{type:"boolean",default:!1,requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-optional":{type:"boolean",default:!1,requires:["icon-image","text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-rotation-alignment":{type:"enum",values:{map:{},viewport:{},auto:{}},default:"auto",requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-size":{type:"number",default:1,minimum:0,units:"factor of the original icon size",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-text-fit":{type:"enum",values:{none:{},width:{},height:{},both:{}},default:"none",requires:["icon-image","text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-text-fit-padding":{type:"array",value:"number",length:4,default:[0,0,0,0],units:"pixels",requires:["icon-image","text-field",{"icon-text-fit":["both","width","height"]}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"icon-image":{type:"resolvedImage",tokens:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-rotate":{type:"number",default:0,period:360,units:"degrees",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-padding":{type:"number",default:2,minimum:0,units:"pixels",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"icon-keep-upright":{type:"boolean",default:!1,requires:["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":["line","line-center"]}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"icon-offset":{type:"array",value:"number",length:2,default:[0,0],requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-anchor":{type:"enum",values:{center:{},left:{},right:{},top:{},bottom:{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},default:"center",requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"icon-pitch-alignment":{type:"enum",values:{map:{},viewport:{},auto:{}},default:"auto",requires:["icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-pitch-alignment":{type:"enum",values:{map:{},viewport:{},auto:{}},default:"auto",requires:["text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-rotation-alignment":{type:"enum",values:{map:{},viewport:{},auto:{}},default:"auto",requires:["text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-field":{type:"formatted",default:"",tokens:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-font":{type:"array",value:"string",default:["Open Sans Regular","Arial Unicode MS Regular"],requires:["text-field"],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-size":{type:"number",default:16,minimum:0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-max-width":{type:"number",default:10,minimum:0,units:"ems",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-line-height":{type:"number",default:1.2,units:"ems",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-letter-spacing":{type:"number",default:0,units:"ems",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-justify":{type:"enum",values:{auto:{},left:{},center:{},right:{}},default:"center",requires:["text-field"],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-radial-offset":{type:"number",units:"ems",default:0,requires:["text-field"],"property-type":"data-driven",expression:{interpolated:!0,parameters:["zoom","feature"]}},"text-variable-anchor":{type:"array",value:"enum",values:{center:{},left:{},right:{},top:{},bottom:{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},requires:["text-field",{"symbol-placement":["point"]}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-anchor":{type:"enum",values:{center:{},left:{},right:{},top:{},bottom:{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},default:"center",requires:["text-field",{"!":"text-variable-anchor"}],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-max-angle":{type:"number",default:45,units:"degrees",requires:["text-field",{"symbol-placement":["line","line-center"]}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-writing-mode":{type:"array",value:"enum",values:{horizontal:{},vertical:{}},requires:["text-field",{"symbol-placement":["point"]}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-rotate":{type:"number",default:0,period:360,units:"degrees",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-padding":{type:"number",default:2,minimum:0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-keep-upright":{type:"boolean",default:!0,requires:["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":["line","line-center"]}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-transform":{type:"enum",values:{none:{},uppercase:{},lowercase:{}},default:"none",requires:["text-field"],expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-offset":{type:"array",value:"number",units:"ems",length:2,default:[0,0],requires:["text-field",{"!":"text-radial-offset"}],expression:{interpolated:!0,parameters:["zoom","feature"]},"property-type":"data-driven"},"text-allow-overlap":{type:"boolean",default:!1,requires:["text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-ignore-placement":{type:"boolean",default:!1,requires:["text-field"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-optional":{type:"boolean",default:!1,requires:["text-field","icon-image"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_raster:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},layout_hillshade:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible","property-type":"constant"}},filter:{type:"array",value:"*"},filter_operator:{type:"enum",values:{"==":{},"!=":{},">":{},">=":{},"<":{},"<=":{},in:{},"!in":{},all:{},any:{},none:{},has:{},"!has":{},within:{}}},geometry_type:{type:"enum",values:{Point:{},LineString:{},Polygon:{}}},function:{expression:{type:"expression"},stops:{type:"array",value:"function_stop"},base:{type:"number",default:1,minimum:0},property:{type:"string",default:"$zoom"},type:{type:"enum",values:{identity:{},exponential:{},interval:{},categorical:{}},default:"exponential"},colorSpace:{type:"enum",values:{rgb:{},lab:{},hcl:{}},default:"rgb"},default:{type:"*",required:!1}},function_stop:{type:"array",minimum:0,maximum:24,value:["number","color"],length:2},expression:{type:"array",value:"*",minimum:1},expression_name:{type:"enum",values:{let:{group:"Variable binding"},var:{group:"Variable binding"},literal:{group:"Types"},array:{group:"Types"},at:{group:"Lookup"},in:{group:"Lookup"},"index-of":{group:"Lookup"},slice:{group:"Lookup"},case:{group:"Decision"},match:{group:"Decision"},coalesce:{group:"Decision"},step:{group:"Ramps, scales, curves"},interpolate:{group:"Ramps, scales, curves"},"interpolate-hcl":{group:"Ramps, scales, curves"},"interpolate-lab":{group:"Ramps, scales, curves"},ln2:{group:"Math"},pi:{group:"Math"},e:{group:"Math"},typeof:{group:"Types"},string:{group:"Types"},number:{group:"Types"},boolean:{group:"Types"},object:{group:"Types"},collator:{group:"Types"},format:{group:"Types"},image:{group:"Types"},"number-format":{group:"Types"},"to-string":{group:"Types"},"to-number":{group:"Types"},"to-boolean":{group:"Types"},"to-rgba":{group:"Color"},"to-color":{group:"Types"},rgb:{group:"Color"},rgba:{group:"Color"},get:{group:"Lookup"},has:{group:"Lookup"},length:{group:"Lookup"},properties:{group:"Feature data"},"feature-state":{group:"Feature data"},"geometry-type":{group:"Feature data"},id:{group:"Feature data"},zoom:{group:"Zoom"},"heatmap-density":{group:"Heatmap"},"line-progress":{group:"Feature data"},accumulated:{group:"Feature data"},"+":{group:"Math"},"*":{group:"Math"},"-":{group:"Math"},"/":{group:"Math"},"%":{group:"Math"},"^":{group:"Math"},sqrt:{group:"Math"},log10:{group:"Math"},ln:{group:"Math"},log2:{group:"Math"},sin:{group:"Math"},cos:{group:"Math"},tan:{group:"Math"},asin:{group:"Math"},acos:{group:"Math"},atan:{group:"Math"},min:{group:"Math"},max:{group:"Math"},round:{group:"Math"},abs:{group:"Math"},ceil:{group:"Math"},floor:{group:"Math"},distance:{group:"Math"},"==":{group:"Decision"},"!=":{group:"Decision"},">":{group:"Decision"},"<":{group:"Decision"},">=":{group:"Decision"},"<=":{group:"Decision"},all:{group:"Decision"},any:{group:"Decision"},"!":{group:"Decision"},within:{group:"Decision"},"is-supported-script":{group:"String"},upcase:{group:"String"},downcase:{group:"String"},concat:{group:"String"},"resolved-locale":{group:"String"}}},light:{anchor:{type:"enum",default:"viewport",values:{map:{},viewport:{}},"property-type":"data-constant",transition:!1,expression:{interpolated:!1,parameters:["zoom"]}},position:{type:"array",default:[1.15,210,30],length:3,value:"number","property-type":"data-constant",transition:!0,expression:{interpolated:!0,parameters:["zoom"]}},color:{type:"color","property-type":"data-constant",default:"#ffffff",expression:{interpolated:!0,parameters:["zoom"]},transition:!0},intensity:{type:"number","property-type":"data-constant",default:.5,minimum:0,maximum:1,expression:{interpolated:!0,parameters:["zoom"]},transition:!0}},paint:["paint_fill","paint_line","paint_circle","paint_heatmap","paint_fill-extrusion","paint_symbol","paint_raster","paint_hillshade","paint_background"],paint_fill:{"fill-antialias":{type:"boolean",default:!0,expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"fill-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-color":{type:"color",default:"#000000",transition:!0,requires:[{"!":"fill-pattern"}],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-outline-color":{type:"color",transition:!0,requires:[{"!":"fill-pattern"},{"fill-antialias":!0}],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"fill-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["fill-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"fill-pattern":{type:"resolvedImage",transition:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"}},"paint_fill-extrusion":{"fill-extrusion-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"fill-extrusion-color":{type:"color",default:"#000000",transition:!0,requires:[{"!":"fill-extrusion-pattern"}],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"fill-extrusion-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["fill-extrusion-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"fill-extrusion-pattern":{type:"resolvedImage",transition:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"},"fill-extrusion-height":{type:"number",default:0,minimum:0,units:"meters",transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-base":{type:"number",default:0,minimum:0,units:"meters",transition:!0,requires:["fill-extrusion-height"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-vertical-gradient":{type:"boolean",default:!0,transition:!1,expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"}},paint_line:{"line-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-color":{type:"color",default:"#000000",transition:!0,requires:[{"!":"line-pattern"}],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"line-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["line-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"line-width":{type:"number",default:1,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-gap-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-offset":{type:"number",default:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-blur":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-dasharray":{type:"array",value:"number",minimum:0,transition:!0,units:"line widths",requires:[{"!":"line-pattern"}],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"cross-faded"},"line-pattern":{type:"resolvedImage",transition:!0,expression:{interpolated:!1,parameters:["zoom","feature"]},"property-type":"cross-faded-data-driven"},"line-gradient":{type:"color",transition:!1,requires:[{"!":"line-dasharray"},{"!":"line-pattern"},{source:"geojson",has:{lineMetrics:!0}}],expression:{interpolated:!0,parameters:["line-progress"]},"property-type":"color-ramp"}},paint_circle:{"circle-radius":{type:"number",default:5,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-color":{type:"color",default:"#000000",transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-blur":{type:"number",default:0,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"circle-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["circle-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"circle-pitch-scale":{type:"enum",values:{map:{},viewport:{}},default:"map",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"circle-pitch-alignment":{type:"enum",values:{map:{},viewport:{}},default:"viewport",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"circle-stroke-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-stroke-color":{type:"color",default:"#000000",transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-stroke-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"}},paint_heatmap:{"heatmap-radius":{type:"number",default:30,minimum:1,transition:!0,units:"pixels",expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"heatmap-weight":{type:"number",default:1,minimum:0,transition:!1,expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"heatmap-intensity":{type:"number",default:1,minimum:0,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"heatmap-color":{type:"color",default:["interpolate",["linear"],["heatmap-density"],0,"rgba(0, 0, 255, 0)",.1,"royalblue",.3,"cyan",.5,"lime",.7,"yellow",1,"red"],transition:!1,expression:{interpolated:!0,parameters:["heatmap-density"]},"property-type":"color-ramp"},"heatmap-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_symbol:{"icon-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-color":{type:"color",default:"#000000",transition:!0,requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-color":{type:"color",default:"rgba(0, 0, 0, 0)",transition:!0,requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-blur":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",requires:["icon-image"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"icon-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["icon-image","icon-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"text-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-color":{type:"color",default:"#000000",transition:!0,overridable:!0,requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-color":{type:"color",default:"rgba(0, 0, 0, 0)",transition:!0,requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-width":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-blur":{type:"number",default:0,minimum:0,transition:!0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-translate":{type:"array",value:"number",length:2,default:[0,0],transition:!0,units:"pixels",requires:["text-field"],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"text-translate-anchor":{type:"enum",values:{map:{},viewport:{}},default:"map",requires:["text-field","text-translate"],expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"}},paint_raster:{"raster-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-hue-rotate":{type:"number",default:0,period:360,transition:!0,units:"degrees",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-brightness-min":{type:"number",default:0,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-brightness-max":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-saturation":{type:"number",default:0,minimum:-1,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-contrast":{type:"number",default:0,minimum:-1,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"raster-resampling":{type:"enum",values:{linear:{},nearest:{}},default:"linear",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"raster-fade-duration":{type:"number",default:300,minimum:0,transition:!1,units:"milliseconds",expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_hillshade:{"hillshade-illumination-direction":{type:"number",default:335,minimum:0,maximum:359,transition:!1,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-illumination-anchor":{type:"enum",values:{map:{},viewport:{}},default:"viewport",expression:{interpolated:!1,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-exaggeration":{type:"number",default:.5,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-shadow-color":{type:"color",default:"#000000",transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-highlight-color":{type:"color",default:"#FFFFFF",transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"hillshade-accent-color":{type:"color",default:"#000000",transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},paint_background:{"background-color":{type:"color",default:"#000000",transition:!0,requires:[{"!":"background-pattern"}],expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"},"background-pattern":{type:"resolvedImage",transition:!0,expression:{interpolated:!1,parameters:["zoom"]},"property-type":"cross-faded"},"background-opacity":{type:"number",default:1,minimum:0,maximum:1,transition:!0,expression:{interpolated:!0,parameters:["zoom"]},"property-type":"data-constant"}},transition:{duration:{type:"number",default:300,minimum:0,units:"milliseconds"},delay:{type:"number",default:0,minimum:0,units:"milliseconds"}},"property-type":{"data-driven":{type:"property-type"},"cross-faded":{type:"property-type"},"cross-faded-data-driven":{type:"property-type"},"color-ramp":{type:"property-type"},"data-constant":{type:"property-type"},constant:{type:"property-type"}},promoteId:{"*":{type:"string"}}},zt=function(t,e,r,n){this.message=(t?t+": ":"")+r,n&&(this.identifier=n),null!=e&&e.__line__&&(this.line=e.__line__)};function Rt(t){var e=t.key,r=t.value;return r?[new zt(e,r,"constants have been deprecated as of v8")]:[]}function Ft(t){for(var e=[],r=arguments.length-1;r-- >0;)e[r]=arguments[r+1];for(var n=0,i=e;n":"value"===t.itemType.kind?"array":"array<"+e+">"}return t.kind}var te=[Vt,Ht,qt,Gt,Zt,Jt,Yt,$t(Wt),Kt];function ee(t,e){if("error"===e.kind)return null;if("array"===t.kind){if("array"===e.kind&&(0===e.N&&"value"===e.itemType.kind||!ee(t.itemType,e.itemType))&&("number"!=typeof t.N||t.N===e.N))return null}else{if(t.kind===e.kind)return null;if("value"===t.kind)for(var r=0,n=te;r255?255:t}function i(t){return t<0?0:t>1?1:t}function a(t){return"%"===t[t.length-1]?n(parseFloat(t)/100*255):n(parseInt(t))}function o(t){return"%"===t[t.length-1]?i(parseFloat(t)/100):i(parseFloat(t))}function s(t,e,r){return r<0?r+=1:r>1&&(r-=1),6*r<1?t+(e-t)*r*6:2*r<1?e:3*r<2?t+(e-t)*(2/3-r)*6:t}try{e.parseCSSColor=function(t){var e,i=t.replace(/ /g,"").toLowerCase();if(i in r)return r[i].slice();if("#"===i[0])return 4===i.length?(e=parseInt(i.substr(1),16))>=0&&e<=4095?[(3840&e)>>4|(3840&e)>>8,240&e|(240&e)>>4,15&e|(15&e)<<4,1]:null:7===i.length&&(e=parseInt(i.substr(1),16))>=0&&e<=16777215?[(16711680&e)>>16,(65280&e)>>8,255&e,1]:null;var l=i.indexOf("("),u=i.indexOf(")");if(-1!==l&&u+1===i.length){var c=i.substr(0,l),f=i.substr(l+1,u-(l+1)).split(","),h=1;switch(c){case"rgba":if(4!==f.length)return null;h=o(f.pop());case"rgb":return 3!==f.length?null:[a(f[0]),a(f[1]),a(f[2]),h];case"hsla":if(4!==f.length)return null;h=o(f.pop());case"hsl":if(3!==f.length)return null;var p=(parseFloat(f[0])%360+360)%360/360,d=o(f[1]),v=o(f[2]),g=v<=.5?v*(d+1):v+d-v*d,y=2*v-g;return[n(255*s(y,g,p+1/3)),n(255*s(y,g,p)),n(255*s(y,g,p-1/3)),h];default:return null}}return null}}catch(t){}})),ae=ie.parseCSSColor,oe=function(t,e,r,n){void 0===n&&(n=1),this.r=t,this.g=e,this.b=r,this.a=n};oe.parse=function(t){if(t){if(t instanceof oe)return t;if("string"==typeof t){var e=ae(t);if(e)return new oe(e[0]/255*e[3],e[1]/255*e[3],e[2]/255*e[3],e[3])}}},oe.prototype.toString=function(){var t=this.toArray(),e=t[0],r=t[1],n=t[2],i=t[3];return"rgba("+Math.round(e)+","+Math.round(r)+","+Math.round(n)+","+i+")"},oe.prototype.toArray=function(){var t=this,e=t.r,r=t.g,n=t.b,i=t.a;return 0===i?[0,0,0,0]:[255*e/i,255*r/i,255*n/i,i]},oe.black=new oe(0,0,0,1),oe.white=new oe(1,1,1,1),oe.transparent=new oe(0,0,0,0),oe.red=new oe(1,0,0,1);var se=function(t,e,r){this.sensitivity=t?e?"variant":"case":e?"accent":"base",this.locale=r,this.collator=new Intl.Collator(this.locale?this.locale:[],{sensitivity:this.sensitivity,usage:"search"})};se.prototype.compare=function(t,e){return this.collator.compare(t,e)},se.prototype.resolvedLocale=function(){return new Intl.Collator(this.locale?this.locale:[]).resolvedOptions().locale};var le=function(t,e,r,n,i){this.text=t,this.image=e,this.scale=r,this.fontStack=n,this.textColor=i},ue=function(t){this.sections=t};ue.fromString=function(t){return new ue([new le(t,null,null,null,null)])},ue.prototype.isEmpty=function(){return 0===this.sections.length||!this.sections.some((function(t){return 0!==t.text.length||t.image&&0!==t.image.name.length}))},ue.factory=function(t){return t instanceof ue?t:ue.fromString(t)},ue.prototype.toString=function(){return 0===this.sections.length?"":this.sections.map((function(t){return t.text})).join("")},ue.prototype.serialize=function(){for(var t=["format"],e=0,r=this.sections;e=0&&t<=255&&"number"==typeof e&&e>=0&&e<=255&&"number"==typeof r&&r>=0&&r<=255?void 0===n||"number"==typeof n&&n>=0&&n<=1?null:"Invalid rgba value ["+[t,e,r,n].join(", ")+"]: 'a' must be between 0 and 1.":"Invalid rgba value ["+("number"==typeof n?[t,e,r,n]:[t,e,r]).join(", ")+"]: 'r', 'g', and 'b' must be between 0 and 255."}function he(t){if(null===t)return!0;if("string"==typeof t)return!0;if("boolean"==typeof t)return!0;if("number"==typeof t)return!0;if(t instanceof oe)return!0;if(t instanceof se)return!0;if(t instanceof ue)return!0;if(t instanceof ce)return!0;if(Array.isArray(t)){for(var e=0,r=t;e2){var s=t[1];if("string"!=typeof s||!(s in ye)||"object"===s)return e.error('The item type argument of "array" must be one of string, number, boolean',1);a=ye[s],n++}else a=Wt;if(t.length>3){if(null!==t[2]&&("number"!=typeof t[2]||t[2]<0||t[2]!==Math.floor(t[2])))return e.error('The length argument to "array" must be a positive integer literal',2);o=t[2],n++}r=$t(a,o)}else r=ye[i];for(var l=[];n1)&&e.push(n)}}return e.concat(this.args.map((function(t){return t.serialize()})))};var xe=function(t){this.type=Jt,this.sections=t};xe.parse=function(t,e){if(t.length<2)return e.error("Expected at least one argument.");var r=t[1];if(!Array.isArray(r)&&"object"==typeof r)return e.error("First argument must be an image or text section.");for(var n=[],i=!1,a=1;a<=t.length-1;++a){var o=t[a];if(i&&"object"==typeof o&&!Array.isArray(o)){i=!1;var s=null;if(o["font-scale"]&&!(s=e.parse(o["font-scale"],1,Ht)))return null;var l=null;if(o["text-font"]&&!(l=e.parse(o["text-font"],1,$t(qt))))return null;var u=null;if(o["text-color"]&&!(u=e.parse(o["text-color"],1,Zt)))return null;var c=n[n.length-1];c.scale=s,c.font=l,c.textColor=u}else{var f=e.parse(t[a],1,Wt);if(!f)return null;var h=f.type.kind;if("string"!==h&&"value"!==h&&"null"!==h&&"resolvedImage"!==h)return e.error("Formatted text type must be 'string', 'value', 'image' or 'null'.");i=!0,n.push({content:f,scale:null,font:null,textColor:null})}}return new xe(n)},xe.prototype.evaluate=function(t){return new ue(this.sections.map((function(e){var r=e.content.evaluate(t);return pe(r)===Kt?new le("",r,null,null,null):new le(de(r),null,e.scale?e.scale.evaluate(t):null,e.font?e.font.evaluate(t).join(","):null,e.textColor?e.textColor.evaluate(t):null)})))},xe.prototype.eachChild=function(t){for(var e=0,r=this.sections;e-1),r},be.prototype.eachChild=function(t){t(this.input)},be.prototype.outputDefined=function(){return!1},be.prototype.serialize=function(){return["image",this.input.serialize()]};var _e={"to-boolean":Gt,"to-color":Zt,"to-number":Ht,"to-string":qt},we=function(t,e){this.type=t,this.args=e};we.parse=function(t,e){if(t.length<2)return e.error("Expected at least one argument.");var r=t[0];if(("to-boolean"===r||"to-string"===r)&&2!==t.length)return e.error("Expected one argument.");for(var n=_e[r],i=[],a=1;a4?"Invalid rbga value "+JSON.stringify(e)+": expected an array containing either three or four numeric values.":fe(e[0],e[1],e[2],e[3])))return new oe(e[0]/255,e[1]/255,e[2]/255,e[3])}throw new ge(r||"Could not parse color from value '"+("string"==typeof e?e:String(JSON.stringify(e)))+"'")}if("number"===this.type.kind){for(var o=null,s=0,l=this.args;s=e[2]||t[1]<=e[1]||t[3]>=e[3])}function Ce(t,e){var r,n=(180+t[0])/360,i=(r=t[1],(180-180/Math.PI*Math.log(Math.tan(Math.PI/4+r*Math.PI/360)))/360),a=Math.pow(2,e.z);return[Math.round(n*a*Se),Math.round(i*a*Se)]}function Pe(t,e,r){return e[1]>t[1]!=r[1]>t[1]&&t[0]<(r[0]-e[0])*(t[1]-e[1])/(r[1]-e[1])+e[0]}function Oe(t,e){for(var r=!1,n=0,i=e.length;n0&&f<0||c<0&&f>0}function ze(t,e,r){for(var n=0,i=r;nr[2]){var i=.5*n,a=t[0]-r[0]>i?-n:r[0]-t[0]>i?n:0;0===a&&(a=t[0]-r[2]>i?-n:r[2]-t[0]>i?n:0),t[0]+=a}Ee(e,t)}function Ue(t,e,r,n){for(var i=Math.pow(2,n.z)*Se,a=[n.x*Se,n.y*Se],o=[],s=0,l=t;s=0)return!1;var r=!0;return t.eachChild((function(t){r&&!Ze(t,e)&&(r=!1)})),r}He.parse=function(t,e){if(2!==t.length)return e.error("'within' expression requires exactly one argument, but found "+(t.length-1)+" instead.");if(he(t[1])){var r=t[1];if("FeatureCollection"===r.type)for(var n=0;ne))throw new ge("Input is not a number.");o=s-1}return 0}We.prototype.parse=function(t,e,r,n,i){return void 0===i&&(i={}),e?this.concat(e,r,n)._parse(t,i):this._parse(t,i)},We.prototype._parse=function(t,e){function r(t,e,r){return"assert"===r?new me(e,[t]):"coerce"===r?new we(e,[t]):t}if(null!==t&&"string"!=typeof t&&"boolean"!=typeof t&&"number"!=typeof t||(t=["literal",t]),Array.isArray(t)){if(0===t.length)return this.error('Expected an array with at least one element. If you wanted a literal array, use ["literal", []].');var n=t[0];if("string"!=typeof n)return this.error("Expression name must be a string, but found "+typeof n+' instead. If you wanted a literal array, use ["literal", [...]].',0),null;var i=this.registry[n];if(i){var a=i.parse(t,this);if(!a)return null;if(this.expectedType){var o=this.expectedType,s=a.type;if("string"!==o.kind&&"number"!==o.kind&&"boolean"!==o.kind&&"object"!==o.kind&&"array"!==o.kind||"value"!==s.kind)if("color"!==o.kind&&"formatted"!==o.kind&&"resolvedImage"!==o.kind||"value"!==s.kind&&"string"!==s.kind){if(this.checkSubtype(o,s))return null}else a=r(a,o,e.typeAnnotation||"coerce");else a=r(a,o,e.typeAnnotation||"assert")}if(!(a instanceof ve)&&"resolvedImage"!==a.type.kind&&Xe(a)){var l=new ke;try{a=new ve(a.type,a.evaluate(l))}catch(t){return this.error(t.message),null}}return a}return this.error('Unknown expression "'+n+'". If you wanted a literal array, use ["literal", [...]].',0)}return void 0===t?this.error("'undefined' value invalid. Use null instead."):"object"==typeof t?this.error('Bare objects invalid. Use ["literal", {...}] instead.'):this.error("Expected an array, but found "+typeof t+" instead.")},We.prototype.concat=function(t,e,r){var n="number"==typeof t?this.path.concat(t):this.path,i=r?this.scope.concat(r):this.scope;return new We(this.registry,n,e||null,i,this.errors)},We.prototype.error=function(t){for(var e=[],r=arguments.length-1;r-- >0;)e[r]=arguments[r+1];var n=""+this.key+e.map((function(t){return"["+t+"]"})).join("");this.errors.push(new jt(n,t))},We.prototype.checkSubtype=function(t,e){var r=ee(t,e);return r&&this.error(r),r};var Ke=function(t,e,r){this.type=t,this.input=e,this.labels=[],this.outputs=[];for(var n=0,i=r;n=o)return e.error('Input/output pairs for "step" expressions must be arranged with input values in strictly ascending order.',l);var c=e.parse(s,u,i);if(!c)return null;i=i||c.type,n.push([o,c])}return new Ke(i,r,n)},Ke.prototype.evaluate=function(t){var e=this.labels,r=this.outputs;if(1===e.length)return r[0].evaluate(t);var n=this.input.evaluate(t);if(n<=e[0])return r[0].evaluate(t);var i=e.length;return n>=e[i-1]?r[i-1].evaluate(t):r[Je(e,n)].evaluate(t)},Ke.prototype.eachChild=function(t){t(this.input);for(var e=0,r=this.outputs;e0&&t.push(this.labels[e]),t.push(this.outputs[e].serialize());return t};var Qe=Object.freeze({__proto__:null,number:$e,color:function(t,e,r){return new oe($e(t.r,e.r,r),$e(t.g,e.g,r),$e(t.b,e.b,r),$e(t.a,e.a,r))},array:function(t,e,r){return t.map((function(t,n){return $e(t,e[n],r)}))}}),tr=.95047,er=1,rr=1.08883,nr=4/29,ir=6/29,ar=3*ir*ir,or=ir*ir*ir,sr=Math.PI/180,lr=180/Math.PI;function ur(t){return t>or?Math.pow(t,1/3):t/ar+nr}function cr(t){return t>ir?t*t*t:ar*(t-nr)}function fr(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function hr(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function pr(t){var e=hr(t.r),r=hr(t.g),n=hr(t.b),i=ur((.4124564*e+.3575761*r+.1804375*n)/tr),a=ur((.2126729*e+.7151522*r+.072175*n)/er);return{l:116*a-16,a:500*(i-a),b:200*(a-ur((.0193339*e+.119192*r+.9503041*n)/rr)),alpha:t.a}}function dr(t){var e=(t.l+16)/116,r=isNaN(t.a)?e:e+t.a/500,n=isNaN(t.b)?e:e-t.b/200;return e=er*cr(e),r=tr*cr(r),n=rr*cr(n),new oe(fr(3.2404542*r-1.5371385*e-.4985314*n),fr(-.969266*r+1.8760108*e+.041556*n),fr(.0556434*r-.2040259*e+1.0572252*n),t.alpha)}function vr(t,e,r){var n=e-t;return t+r*(n>180||n<-180?n-360*Math.round(n/360):n)}var gr={forward:pr,reverse:dr,interpolate:function(t,e,r){return{l:$e(t.l,e.l,r),a:$e(t.a,e.a,r),b:$e(t.b,e.b,r),alpha:$e(t.alpha,e.alpha,r)}}},yr={forward:function(t){var e=pr(t),r=e.l,n=e.a,i=e.b,a=Math.atan2(i,n)*lr;return{h:a<0?a+360:a,c:Math.sqrt(n*n+i*i),l:r,alpha:t.a}},reverse:function(t){var e=t.h*sr,r=t.c;return dr({l:t.l,a:Math.cos(e)*r,b:Math.sin(e)*r,alpha:t.alpha})},interpolate:function(t,e,r){return{h:vr(t.h,e.h,r),c:$e(t.c,e.c,r),l:$e(t.l,e.l,r),alpha:$e(t.alpha,e.alpha,r)}}},mr=Object.freeze({__proto__:null,lab:gr,hcl:yr}),xr=function(t,e,r,n,i){this.type=t,this.operator=e,this.interpolation=r,this.input=n,this.labels=[],this.outputs=[];for(var a=0,o=i;a1})))return e.error("Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.",1);n={name:"cubic-bezier",controlPoints:s}}if(t.length-1<4)return e.error("Expected at least 4 arguments, but found only "+(t.length-1)+".");if((t.length-1)%2!=0)return e.error("Expected an even number of arguments.");if(!(i=e.parse(i,2,Ht)))return null;var l=[],u=null;"interpolate-hcl"===r||"interpolate-lab"===r?u=Zt:e.expectedType&&"value"!==e.expectedType.kind&&(u=e.expectedType);for(var c=0;c=f)return e.error('Input/output pairs for "interpolate" expressions must be arranged with input values in strictly ascending order.',p);var v=e.parse(h,d,u);if(!v)return null;u=u||v.type,l.push([f,v])}return"number"===u.kind||"color"===u.kind||"array"===u.kind&&"number"===u.itemType.kind&&"number"==typeof u.N?new xr(u,r,n,i,l):e.error("Type "+Qt(u)+" is not interpolatable.")},xr.prototype.evaluate=function(t){var e=this.labels,r=this.outputs;if(1===e.length)return r[0].evaluate(t);var n=this.input.evaluate(t);if(n<=e[0])return r[0].evaluate(t);var i=e.length;if(n>=e[i-1])return r[i-1].evaluate(t);var a=Je(e,n),o=e[a],s=e[a+1],l=xr.interpolationFactor(this.interpolation,n,o,s),u=r[a].evaluate(t),c=r[a+1].evaluate(t);return"interpolate"===this.operator?Qe[this.type.kind.toLowerCase()](u,c,l):"interpolate-hcl"===this.operator?yr.reverse(yr.interpolate(yr.forward(u),yr.forward(c),l)):gr.reverse(gr.interpolate(gr.forward(u),gr.forward(c),l))},xr.prototype.eachChild=function(t){t(this.input);for(var e=0,r=this.outputs;e=r.length)throw new ge("Array index out of bounds: "+e+" > "+(r.length-1)+".");if(e!==Math.floor(e))throw new ge("Array index must be an integer, but found "+e+" instead.");return r[e]},Tr.prototype.eachChild=function(t){t(this.index),t(this.input)},Tr.prototype.outputDefined=function(){return!1},Tr.prototype.serialize=function(){return["at",this.index.serialize(),this.input.serialize()]};var kr=function(t,e){this.type=Gt,this.needle=t,this.haystack=e};kr.parse=function(t,e){if(3!==t.length)return e.error("Expected 2 arguments, but found "+(t.length-1)+" instead.");var r=e.parse(t[1],1,Wt),n=e.parse(t[2],2,Wt);return r&&n?re(r.type,[Gt,qt,Ht,Vt,Wt])?new kr(r,n):e.error("Expected first argument to be of type boolean, string, number or null, but found "+Qt(r.type)+" instead"):null},kr.prototype.evaluate=function(t){var e=this.needle.evaluate(t),r=this.haystack.evaluate(t);if(!r)return!1;if(!ne(e,["boolean","string","number","null"]))throw new ge("Expected first argument to be of type boolean, string, number or null, but found "+Qt(pe(e))+" instead.");if(!ne(r,["string","array"]))throw new ge("Expected second argument to be of type array or string, but found "+Qt(pe(r))+" instead.");return r.indexOf(e)>=0},kr.prototype.eachChild=function(t){t(this.needle),t(this.haystack)},kr.prototype.outputDefined=function(){return!0},kr.prototype.serialize=function(){return["in",this.needle.serialize(),this.haystack.serialize()]};var Ar=function(t,e,r){this.type=Ht,this.needle=t,this.haystack=e,this.fromIndex=r};Ar.parse=function(t,e){if(t.length<=2||t.length>=5)return e.error("Expected 3 or 4 arguments, but found "+(t.length-1)+" instead.");var r=e.parse(t[1],1,Wt),n=e.parse(t[2],2,Wt);if(!r||!n)return null;if(!re(r.type,[Gt,qt,Ht,Vt,Wt]))return e.error("Expected first argument to be of type boolean, string, number or null, but found "+Qt(r.type)+" instead");if(4===t.length){var i=e.parse(t[3],3,Ht);return i?new Ar(r,n,i):null}return new Ar(r,n)},Ar.prototype.evaluate=function(t){var e=this.needle.evaluate(t),r=this.haystack.evaluate(t);if(!ne(e,["boolean","string","number","null"]))throw new ge("Expected first argument to be of type boolean, string, number or null, but found "+Qt(pe(e))+" instead.");if(!ne(r,["string","array"]))throw new ge("Expected second argument to be of type array or string, but found "+Qt(pe(r))+" instead.");if(this.fromIndex){var n=this.fromIndex.evaluate(t);return r.indexOf(e,n)}return r.indexOf(e)},Ar.prototype.eachChild=function(t){t(this.needle),t(this.haystack),this.fromIndex&&t(this.fromIndex)},Ar.prototype.outputDefined=function(){return!1},Ar.prototype.serialize=function(){if(null!=this.fromIndex&&void 0!==this.fromIndex){var t=this.fromIndex.serialize();return["index-of",this.needle.serialize(),this.haystack.serialize(),t]}return["index-of",this.needle.serialize(),this.haystack.serialize()]};var Mr=function(t,e,r,n,i,a){this.inputType=t,this.type=e,this.input=r,this.cases=n,this.outputs=i,this.otherwise=a};Mr.parse=function(t,e){if(t.length<5)return e.error("Expected at least 4 arguments, but found only "+(t.length-1)+".");if(t.length%2!=1)return e.error("Expected an even number of arguments.");var r,n;e.expectedType&&"value"!==e.expectedType.kind&&(n=e.expectedType);for(var i={},a=[],o=2;oNumber.MAX_SAFE_INTEGER)return u.error("Branch labels must be integers no larger than "+Number.MAX_SAFE_INTEGER+".");if("number"==typeof h&&Math.floor(h)!==h)return u.error("Numeric branch labels must be integer values.");if(r){if(u.checkSubtype(r,pe(h)))return null}else r=pe(h);if(void 0!==i[String(h)])return u.error("Branch labels must be unique.");i[String(h)]=a.length}var p=e.parse(l,o,n);if(!p)return null;n=n||p.type,a.push(p)}var d=e.parse(t[1],1,Wt);if(!d)return null;var v=e.parse(t[t.length-1],t.length-1,n);return v?"value"!==d.type.kind&&e.concat(1).checkSubtype(r,d.type)?null:new Mr(r,n,d,i,a,v):null},Mr.prototype.evaluate=function(t){var e=this.input.evaluate(t);return(pe(e)===this.inputType&&this.outputs[this.cases[e]]||this.otherwise).evaluate(t)},Mr.prototype.eachChild=function(t){t(this.input),this.outputs.forEach(t),t(this.otherwise)},Mr.prototype.outputDefined=function(){return this.outputs.every((function(t){return t.outputDefined()}))&&this.otherwise.outputDefined()},Mr.prototype.serialize=function(){for(var t=this,e=["match",this.input.serialize()],r=[],n={},i=0,a=Object.keys(this.cases).sort();i=5)return e.error("Expected 3 or 4 arguments, but found "+(t.length-1)+" instead.");var r=e.parse(t[1],1,Wt),n=e.parse(t[2],2,Ht);if(!r||!n)return null;if(!re(r.type,[$t(Wt),qt,Wt]))return e.error("Expected first argument to be of type array or string, but found "+Qt(r.type)+" instead");if(4===t.length){var i=e.parse(t[3],3,Ht);return i?new Er(r.type,r,n,i):null}return new Er(r.type,r,n)},Er.prototype.evaluate=function(t){var e=this.input.evaluate(t),r=this.beginIndex.evaluate(t);if(!ne(e,["string","array"]))throw new ge("Expected first argument to be of type array or string, but found "+Qt(pe(e))+" instead.");if(this.endIndex){var n=this.endIndex.evaluate(t);return e.slice(r,n)}return e.slice(r)},Er.prototype.eachChild=function(t){t(this.input),t(this.beginIndex),this.endIndex&&t(this.endIndex)},Er.prototype.outputDefined=function(){return!1},Er.prototype.serialize=function(){if(null!=this.endIndex&&void 0!==this.endIndex){var t=this.endIndex.serialize();return["slice",this.input.serialize(),this.beginIndex.serialize(),t]}return["slice",this.input.serialize(),this.beginIndex.serialize()]};var Or=Pr("==",(function(t,e,r){return e===r}),Cr),Ir=Pr("!=",(function(t,e,r){return e!==r}),(function(t,e,r,n){return!Cr(0,e,r,n)})),Dr=Pr("<",(function(t,e,r){return e",(function(t,e,r){return e>r}),(function(t,e,r,n){return n.compare(e,r)>0})),Rr=Pr("<=",(function(t,e,r){return e<=r}),(function(t,e,r,n){return n.compare(e,r)<=0})),Fr=Pr(">=",(function(t,e,r){return e>=r}),(function(t,e,r,n){return n.compare(e,r)>=0})),Br=function(t,e,r,n,i){this.type=qt,this.number=t,this.locale=e,this.currency=r,this.minFractionDigits=n,this.maxFractionDigits=i};Br.parse=function(t,e){if(3!==t.length)return e.error("Expected two arguments.");var r=e.parse(t[1],1,Ht);if(!r)return null;var n=t[2];if("object"!=typeof n||Array.isArray(n))return e.error("NumberFormat options argument must be an object.");var i=null;if(n.locale&&!(i=e.parse(n.locale,1,qt)))return null;var a=null;if(n.currency&&!(a=e.parse(n.currency,1,qt)))return null;var o=null;if(n["min-fraction-digits"]&&!(o=e.parse(n["min-fraction-digits"],1,Ht)))return null;var s=null;return n["max-fraction-digits"]&&!(s=e.parse(n["max-fraction-digits"],1,Ht))?null:new Br(r,i,a,o,s)},Br.prototype.evaluate=function(t){return new Intl.NumberFormat(this.locale?this.locale.evaluate(t):[],{style:this.currency?"currency":"decimal",currency:this.currency?this.currency.evaluate(t):void 0,minimumFractionDigits:this.minFractionDigits?this.minFractionDigits.evaluate(t):void 0,maximumFractionDigits:this.maxFractionDigits?this.maxFractionDigits.evaluate(t):void 0}).format(this.number.evaluate(t))},Br.prototype.eachChild=function(t){t(this.number),this.locale&&t(this.locale),this.currency&&t(this.currency),this.minFractionDigits&&t(this.minFractionDigits),this.maxFractionDigits&&t(this.maxFractionDigits)},Br.prototype.outputDefined=function(){return!1},Br.prototype.serialize=function(){var t={};return this.locale&&(t.locale=this.locale.serialize()),this.currency&&(t.currency=this.currency.serialize()),this.minFractionDigits&&(t["min-fraction-digits"]=this.minFractionDigits.serialize()),this.maxFractionDigits&&(t["max-fraction-digits"]=this.maxFractionDigits.serialize()),["number-format",this.number.serialize(),t]};var Nr=function(t){this.type=Ht,this.input=t};Nr.parse=function(t,e){if(2!==t.length)return e.error("Expected 1 argument, but found "+(t.length-1)+" instead.");var r=e.parse(t[1],1);return r?"array"!==r.type.kind&&"string"!==r.type.kind&&"value"!==r.type.kind?e.error("Expected argument of type string or array, but found "+Qt(r.type)+" instead."):new Nr(r):null},Nr.prototype.evaluate=function(t){var e=this.input.evaluate(t);if("string"==typeof e)return e.length;if(Array.isArray(e))return e.length;throw new ge("Expected value to be of type string or array, but found "+Qt(pe(e))+" instead.")},Nr.prototype.eachChild=function(t){t(this.input)},Nr.prototype.outputDefined=function(){return!1},Nr.prototype.serialize=function(){var t=["length"];return this.eachChild((function(e){t.push(e.serialize())})),t};var jr={"==":Or,"!=":Ir,">":zr,"<":Dr,">=":Fr,"<=":Rr,array:me,at:Tr,boolean:me,case:Sr,coalesce:_r,collator:Me,format:xe,image:be,in:kr,"index-of":Ar,interpolate:xr,"interpolate-hcl":xr,"interpolate-lab":xr,length:Nr,let:wr,literal:ve,match:Mr,number:me,"number-format":Br,object:me,slice:Er,step:Ke,string:me,"to-boolean":we,"to-color":we,"to-number":we,"to-string":we,var:Ye,within:He};function Ur(t,e){var r=e[0],n=e[1],i=e[2],a=e[3];r=r.evaluate(t),n=n.evaluate(t),i=i.evaluate(t);var o=a?a.evaluate(t):1,s=fe(r,n,i,o);if(s)throw new ge(s);return new oe(r/255*o,n/255*o,i/255*o,o)}function Vr(t,e){return t in e}function Hr(t,e){var r=e[t];return void 0===r?null:r}function qr(t){return{type:t}}function Gr(t){return{result:"success",value:t}}function Zr(t){return{result:"error",value:t}}function Yr(t){return"data-driven"===t["property-type"]||"cross-faded-data-driven"===t["property-type"]}function Wr(t){return!!t.expression&&t.expression.parameters.indexOf("zoom")>-1}function Xr(t){return!!t.expression&&t.expression.interpolated}function Jr(t){return t instanceof Number?"number":t instanceof String?"string":t instanceof Boolean?"boolean":Array.isArray(t)?"array":null===t?"null":typeof t}function Kr(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}function $r(t){return t}function Qr(t,e){var r,n,i,a="color"===e.type,o=t.stops&&"object"==typeof t.stops[0][0],s=o||void 0!==t.property,l=o||!s,u=t.type||(Xr(e)?"exponential":"interval");if(a&&((t=Ft({},t)).stops&&(t.stops=t.stops.map((function(t){return[t[0],oe.parse(t[1])]}))),t.default?t.default=oe.parse(t.default):t.default=oe.parse(e.default)),t.colorSpace&&"rgb"!==t.colorSpace&&!mr[t.colorSpace])throw new Error("Unknown color space: "+t.colorSpace);if("exponential"===u)r=nn;else if("interval"===u)r=rn;else if("categorical"===u){r=en,n=Object.create(null);for(var c=0,f=t.stops;c=t.stops[n-1][0])return t.stops[n-1][1];var i=Je(t.stops.map((function(t){return t[0]})),r);return t.stops[i][1]}function nn(t,e,r){var n=void 0!==t.base?t.base:1;if("number"!==Jr(r))return tn(t.default,e.default);var i=t.stops.length;if(1===i)return t.stops[0][1];if(r<=t.stops[0][0])return t.stops[0][1];if(r>=t.stops[i-1][0])return t.stops[i-1][1];var a=Je(t.stops.map((function(t){return t[0]})),r),o=function(t,e,r,n){var i=n-r,a=t-r;return 0===i?0:1===e?a/i:(Math.pow(e,a)-1)/(Math.pow(e,i)-1)}(r,n,t.stops[a][0],t.stops[a+1][0]),s=t.stops[a][1],l=t.stops[a+1][1],u=Qe[e.type]||$r;if(t.colorSpace&&"rgb"!==t.colorSpace){var c=mr[t.colorSpace];u=function(t,e){return c.reverse(c.interpolate(c.forward(t),c.forward(e),o))}}return"function"==typeof s.evaluate?{evaluate:function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];var r=s.evaluate.apply(void 0,t),n=l.evaluate.apply(void 0,t);if(void 0!==r&&void 0!==n)return u(r,n,o)}}:u(s,l,o)}function an(t,e,r){return"color"===e.type?r=oe.parse(r):"formatted"===e.type?r=ue.fromString(r.toString()):"resolvedImage"===e.type?r=ce.fromString(r.toString()):Jr(r)===e.type||"enum"===e.type&&e.values[r]||(r=void 0),tn(r,t.default,e.default)}Ae.register(jr,{error:[{kind:"error"},[qt],function(t,e){var r=e[0];throw new ge(r.evaluate(t))}],typeof:[qt,[Wt],function(t,e){return Qt(pe(e[0].evaluate(t)))}],"to-rgba":[$t(Ht,4),[Zt],function(t,e){return e[0].evaluate(t).toArray()}],rgb:[Zt,[Ht,Ht,Ht],Ur],rgba:[Zt,[Ht,Ht,Ht,Ht],Ur],has:{type:Gt,overloads:[[[qt],function(t,e){return Vr(e[0].evaluate(t),t.properties())}],[[qt,Yt],function(t,e){var r=e[0],n=e[1];return Vr(r.evaluate(t),n.evaluate(t))}]]},get:{type:Wt,overloads:[[[qt],function(t,e){return Hr(e[0].evaluate(t),t.properties())}],[[qt,Yt],function(t,e){var r=e[0],n=e[1];return Hr(r.evaluate(t),n.evaluate(t))}]]},"feature-state":[Wt,[qt],function(t,e){return Hr(e[0].evaluate(t),t.featureState||{})}],properties:[Yt,[],function(t){return t.properties()}],"geometry-type":[qt,[],function(t){return t.geometryType()}],id:[Wt,[],function(t){return t.id()}],zoom:[Ht,[],function(t){return t.globals.zoom}],"heatmap-density":[Ht,[],function(t){return t.globals.heatmapDensity||0}],"line-progress":[Ht,[],function(t){return t.globals.lineProgress||0}],accumulated:[Wt,[],function(t){return void 0===t.globals.accumulated?null:t.globals.accumulated}],"+":[Ht,qr(Ht),function(t,e){for(var r=0,n=0,i=e;n":[Gt,[qt,Wt],function(t,e){var r=e[0],n=e[1],i=t.properties()[r.value],a=n.value;return typeof i==typeof a&&i>a}],"filter-id->":[Gt,[Wt],function(t,e){var r=e[0],n=t.id(),i=r.value;return typeof n==typeof i&&n>i}],"filter-<=":[Gt,[qt,Wt],function(t,e){var r=e[0],n=e[1],i=t.properties()[r.value],a=n.value;return typeof i==typeof a&&i<=a}],"filter-id-<=":[Gt,[Wt],function(t,e){var r=e[0],n=t.id(),i=r.value;return typeof n==typeof i&&n<=i}],"filter->=":[Gt,[qt,Wt],function(t,e){var r=e[0],n=e[1],i=t.properties()[r.value],a=n.value;return typeof i==typeof a&&i>=a}],"filter-id->=":[Gt,[Wt],function(t,e){var r=e[0],n=t.id(),i=r.value;return typeof n==typeof i&&n>=i}],"filter-has":[Gt,[Wt],function(t,e){return e[0].value in t.properties()}],"filter-has-id":[Gt,[],function(t){return null!==t.id()&&void 0!==t.id()}],"filter-type-in":[Gt,[$t(qt)],function(t,e){return e[0].value.indexOf(t.geometryType())>=0}],"filter-id-in":[Gt,[$t(Wt)],function(t,e){return e[0].value.indexOf(t.id())>=0}],"filter-in-small":[Gt,[qt,$t(Wt)],function(t,e){var r=e[0];return e[1].value.indexOf(t.properties()[r.value])>=0}],"filter-in-large":[Gt,[qt,$t(Wt)],function(t,e){var r=e[0],n=e[1];return function(t,e,r,n){for(;r<=n;){var i=r+n>>1;if(e[i]===t)return!0;e[i]>t?n=i-1:r=i+1}return!1}(t.properties()[r.value],n.value,0,n.value.length-1)}],all:{type:Gt,overloads:[[[Gt,Gt],function(t,e){var r=e[0],n=e[1];return r.evaluate(t)&&n.evaluate(t)}],[qr(Gt),function(t,e){for(var r=0,n=e;r0&&"string"==typeof t[0]&&t[0]in jr}function ln(t,e){var r=new We(jr,[],e?function(t){var e={color:Zt,string:qt,number:Ht,enum:qt,boolean:Gt,formatted:Jt,resolvedImage:Kt};return"array"===t.type?$t(e[t.value]||Wt,t.length):e[t.type]}(e):void 0),n=r.parse(t,void 0,void 0,void 0,e&&"string"===e.type?{typeAnnotation:"coerce"}:void 0);return n?Gr(new on(n,e)):Zr(r.errors)}on.prototype.evaluateWithoutErrorHandling=function(t,e,r,n,i,a){return this._evaluator.globals=t,this._evaluator.feature=e,this._evaluator.featureState=r,this._evaluator.canonical=n,this._evaluator.availableImages=i||null,this._evaluator.formattedSection=a,this.expression.evaluate(this._evaluator)},on.prototype.evaluate=function(t,e,r,n,i,a){this._evaluator.globals=t,this._evaluator.feature=e||null,this._evaluator.featureState=r||null,this._evaluator.canonical=n,this._evaluator.availableImages=i||null,this._evaluator.formattedSection=a||null;try{var o=this.expression.evaluate(this._evaluator);if(null==o||"number"==typeof o&&o!=o)return this._defaultValue;if(this._enumValues&&!(o in this._enumValues))throw new ge("Expected value to be one of "+Object.keys(this._enumValues).map((function(t){return JSON.stringify(t)})).join(", ")+", but found "+JSON.stringify(o)+" instead.");return o}catch(t){return this._warningHistory[t.message]||(this._warningHistory[t.message]=!0,"undefined"!=typeof console&&console.warn(t.message)),this._defaultValue}};var un=function(t,e){this.kind=t,this._styleExpression=e,this.isStateDependent="constant"!==t&&!Ge(e.expression)};un.prototype.evaluateWithoutErrorHandling=function(t,e,r,n,i,a){return this._styleExpression.evaluateWithoutErrorHandling(t,e,r,n,i,a)},un.prototype.evaluate=function(t,e,r,n,i,a){return this._styleExpression.evaluate(t,e,r,n,i,a)};var cn=function(t,e,r,n){this.kind=t,this.zoomStops=r,this._styleExpression=e,this.isStateDependent="camera"!==t&&!Ge(e.expression),this.interpolationType=n};function fn(t,e){if("error"===(t=ln(t,e)).result)return t;var r=t.value.expression,n=qe(r);if(!n&&!Yr(e))return Zr([new jt("","data expressions not supported")]);var i=Ze(r,["zoom"]);if(!i&&!Wr(e))return Zr([new jt("","zoom expressions not supported")]);var a=pn(r);if(!a&&!i)return Zr([new jt("",'"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.')]);if(a instanceof jt)return Zr([a]);if(a instanceof xr&&!Xr(e))return Zr([new jt("",'"interpolate" expressions cannot be used with this property')]);if(!a)return Gr(new un(n?"constant":"source",t.value));var o=a instanceof xr?a.interpolation:void 0;return Gr(new cn(n?"camera":"composite",t.value,a.labels,o))}cn.prototype.evaluateWithoutErrorHandling=function(t,e,r,n,i,a){return this._styleExpression.evaluateWithoutErrorHandling(t,e,r,n,i,a)},cn.prototype.evaluate=function(t,e,r,n,i,a){return this._styleExpression.evaluate(t,e,r,n,i,a)},cn.prototype.interpolationFactor=function(t,e,r){return this.interpolationType?xr.interpolationFactor(this.interpolationType,t,e,r):0};var hn=function(t,e){this._parameters=t,this._specification=e,Ft(this,Qr(this._parameters,this._specification))};function pn(t){var e=null;if(t instanceof wr)e=pn(t.result);else if(t instanceof _r)for(var r=0,n=t.args;rn.maximum?[new zt(e,r,r+" is greater than the maximum value "+n.maximum)]:[]}function yn(t){var e,r,n,i=t.valueSpec,a=Bt(t.value.type),o={},s="categorical"!==a&&void 0===t.value.property,l=!s,u="array"===Jr(t.value.stops)&&"array"===Jr(t.value.stops[0])&&"object"===Jr(t.value.stops[0][0]),c=dn({key:t.key,value:t.value,valueSpec:t.styleSpec.function,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{stops:function(t){if("identity"===a)return[new zt(t.key,t.value,'identity function may not have a "stops" property')];var e=[],r=t.value;return e=e.concat(vn({key:t.key,value:r,valueSpec:t.valueSpec,style:t.style,styleSpec:t.styleSpec,arrayElementValidator:f})),"array"===Jr(r)&&0===r.length&&e.push(new zt(t.key,r,"array must have at least one stop")),e},default:function(t){return Un({key:t.key,value:t.value,valueSpec:i,style:t.style,styleSpec:t.styleSpec})}}});return"identity"===a&&s&&c.push(new zt(t.key,t.value,'missing required property "property"')),"identity"===a||t.value.stops||c.push(new zt(t.key,t.value,'missing required property "stops"')),"exponential"===a&&t.valueSpec.expression&&!Xr(t.valueSpec)&&c.push(new zt(t.key,t.value,"exponential functions not supported")),t.styleSpec.$version>=8&&(l&&!Yr(t.valueSpec)?c.push(new zt(t.key,t.value,"property functions not supported")):s&&!Wr(t.valueSpec)&&c.push(new zt(t.key,t.value,"zoom functions not supported"))),"categorical"!==a&&!u||void 0!==t.value.property||c.push(new zt(t.key,t.value,'"property" property is required')),c;function f(t){var e=[],a=t.value,s=t.key;if("array"!==Jr(a))return[new zt(s,a,"array expected, "+Jr(a)+" found")];if(2!==a.length)return[new zt(s,a,"array length 2 expected, length "+a.length+" found")];if(u){if("object"!==Jr(a[0]))return[new zt(s,a,"object expected, "+Jr(a[0])+" found")];if(void 0===a[0].zoom)return[new zt(s,a,"object stop key must have zoom")];if(void 0===a[0].value)return[new zt(s,a,"object stop key must have value")];if(n&&n>Bt(a[0].zoom))return[new zt(s,a[0].zoom,"stop zoom values must appear in ascending order")];Bt(a[0].zoom)!==n&&(n=Bt(a[0].zoom),r=void 0,o={}),e=e.concat(dn({key:s+"[0]",value:a[0],valueSpec:{zoom:{}},style:t.style,styleSpec:t.styleSpec,objectElementValidators:{zoom:gn,value:h}}))}else e=e.concat(h({key:s+"[0]",value:a[0],valueSpec:{},style:t.style,styleSpec:t.styleSpec},a));return sn(Nt(a[1]))?e.concat([new zt(s+"[1]",a[1],"expressions are not allowed in function stops.")]):e.concat(Un({key:s+"[1]",value:a[1],valueSpec:i,style:t.style,styleSpec:t.styleSpec}))}function h(t,n){var s=Jr(t.value),l=Bt(t.value),u=null!==t.value?t.value:n;if(e){if(s!==e)return[new zt(t.key,u,s+" stop domain type must match previous stop domain type "+e)]}else e=s;if("number"!==s&&"string"!==s&&"boolean"!==s)return[new zt(t.key,u,"stop domain value must be a number, string, or boolean")];if("number"!==s&&"categorical"!==a){var c="number expected, "+s+" found";return Yr(i)&&void 0===a&&(c+='\nIf you intended to use a categorical function, specify `"type": "categorical"`.'),[new zt(t.key,u,c)]}return"categorical"!==a||"number"!==s||isFinite(l)&&Math.floor(l)===l?"categorical"!==a&&"number"===s&&void 0!==r&&l=2&&"$id"!==t[1]&&"$type"!==t[1];case"in":return t.length>=3&&("string"!=typeof t[1]||Array.isArray(t[2]));case"!in":case"!has":case"none":return!1;case"==":case"!=":case">":case">=":case"<":case"<=":return 3!==t.length||Array.isArray(t[1])||Array.isArray(t[2]);case"any":case"all":for(var e=0,r=t.slice(1);ee?1:0}function kn(t){if(!Array.isArray(t))return!1;if("within"===t[0])return!0;for(var e=1;e"===r||"<="===r||">="===r?Mn(t[1],t[2],r):"any"===r?(e=t.slice(1),["any"].concat(e.map(An))):"all"===r?["all"].concat(t.slice(1).map(An)):"none"===r?["all"].concat(t.slice(1).map(An).map(Ln)):"in"===r?Sn(t[1],t.slice(2)):"!in"===r?Ln(Sn(t[1],t.slice(2))):"has"===r?En(t[1]):"!has"===r?Ln(En(t[1])):"within"!==r||t}function Mn(t,e,r){switch(t){case"$type":return["filter-type-"+r,e];case"$id":return["filter-id-"+r,e];default:return["filter-"+r,t,e]}}function Sn(t,e){if(0===e.length)return!1;switch(t){case"$type":return["filter-type-in",["literal",e]];case"$id":return["filter-id-in",["literal",e]];default:return e.length>200&&!e.some((function(t){return typeof t!=typeof e[0]}))?["filter-in-large",t,["literal",e.sort(Tn)]]:["filter-in-small",t,["literal",e]]}}function En(t){switch(t){case"$type":return!0;case"$id":return["filter-has-id"];default:return["filter-has",t]}}function Ln(t){return["!",t]}function Cn(t){return bn(Nt(t.value))?mn(Ft({},t,{expressionContext:"filter",valueSpec:{value:"boolean"}})):Pn(t)}function Pn(t){var e=t.value,r=t.key;if("array"!==Jr(e))return[new zt(r,e,"array expected, "+Jr(e)+" found")];var n,i=t.styleSpec,a=[];if(e.length<1)return[new zt(r,e,"filter array must have at least 1 element")];switch(a=a.concat(xn({key:r+"[0]",value:e[0],valueSpec:i.filter_operator,style:t.style,styleSpec:t.styleSpec})),Bt(e[0])){case"<":case"<=":case">":case">=":e.length>=2&&"$type"===Bt(e[1])&&a.push(new zt(r,e,'"$type" cannot be use with operator "'+e[0]+'"'));case"==":case"!=":3!==e.length&&a.push(new zt(r,e,'filter array for operator "'+e[0]+'" must have 3 elements'));case"in":case"!in":e.length>=2&&"string"!==(n=Jr(e[1]))&&a.push(new zt(r+"[1]",e[1],"string expected, "+n+" found"));for(var o=2;o=c[p+0]&&n>=c[p+1])?(o[h]=!0,a.push(u[h])):o[h]=!1}}},Qn.prototype._forEachCell=function(t,e,r,n,i,a,o,s){for(var l=this._convertToCellCoord(t),u=this._convertToCellCoord(e),c=this._convertToCellCoord(r),f=this._convertToCellCoord(n),h=l;h<=c;h++)for(var p=u;p<=f;p++){var d=this.d*p+h;if((!s||s(this._convertFromCellCoord(h),this._convertFromCellCoord(p),this._convertFromCellCoord(h+1),this._convertFromCellCoord(p+1)))&&i.call(this,t,e,r,n,d,a,o,s))return}},Qn.prototype._convertFromCellCoord=function(t){return(t-this.padding)/this.scale},Qn.prototype._convertToCellCoord=function(t){return Math.max(0,Math.min(this.d-1,Math.floor(t*this.scale)+this.padding))},Qn.prototype.toArrayBuffer=function(){if(this.arrayBuffer)return this.arrayBuffer;for(var t=this.cells,e=$n+this.cells.length+1+1,r=0,n=0;n=0)){var f=t[c];u[c]=ri[l].shallow.indexOf(c)>=0?f:si(f,e)}t instanceof Error&&(u.message=t.message)}if(u.$name)throw new Error("$name property is reserved for worker serialization logic.");return"Object"!==l&&(u.$name=l),u}throw new Error("can't serialize object of type "+typeof t)}function li(t){if(null==t||"boolean"==typeof t||"number"==typeof t||"string"==typeof t||t instanceof Boolean||t instanceof Number||t instanceof String||t instanceof Date||t instanceof RegExp||ai(t)||oi(t)||ArrayBuffer.isView(t)||t instanceof ti)return t;if(Array.isArray(t))return t.map(li);if("object"==typeof t){var e=t.$name||"Object",r=ri[e].klass;if(!r)throw new Error("can't deserialize unregistered class "+e);if(r.deserialize)return r.deserialize(t);for(var n=Object.create(r.prototype),i=0,a=Object.keys(t);i=0?s:li(s)}}return n}throw new Error("can't deserialize object of type "+typeof t)}var ui=function(){this.first=!0};ui.prototype.update=function(t,e){var r=Math.floor(t);return this.first?(this.first=!1,this.lastIntegerZoom=r,this.lastIntegerZoomTime=0,this.lastZoom=t,this.lastFloorZoom=r,!0):(this.lastFloorZoom>r?(this.lastIntegerZoom=r+1,this.lastIntegerZoomTime=e):this.lastFloorZoom=128&&t<=255},Arabic:function(t){return t>=1536&&t<=1791},"Arabic Supplement":function(t){return t>=1872&&t<=1919},"Arabic Extended-A":function(t){return t>=2208&&t<=2303},"Hangul Jamo":function(t){return t>=4352&&t<=4607},"Unified Canadian Aboriginal Syllabics":function(t){return t>=5120&&t<=5759},Khmer:function(t){return t>=6016&&t<=6143},"Unified Canadian Aboriginal Syllabics Extended":function(t){return t>=6320&&t<=6399},"General Punctuation":function(t){return t>=8192&&t<=8303},"Letterlike Symbols":function(t){return t>=8448&&t<=8527},"Number Forms":function(t){return t>=8528&&t<=8591},"Miscellaneous Technical":function(t){return t>=8960&&t<=9215},"Control Pictures":function(t){return t>=9216&&t<=9279},"Optical Character Recognition":function(t){return t>=9280&&t<=9311},"Enclosed Alphanumerics":function(t){return t>=9312&&t<=9471},"Geometric Shapes":function(t){return t>=9632&&t<=9727},"Miscellaneous Symbols":function(t){return t>=9728&&t<=9983},"Miscellaneous Symbols and Arrows":function(t){return t>=11008&&t<=11263},"CJK Radicals Supplement":function(t){return t>=11904&&t<=12031},"Kangxi Radicals":function(t){return t>=12032&&t<=12255},"Ideographic Description Characters":function(t){return t>=12272&&t<=12287},"CJK Symbols and Punctuation":function(t){return t>=12288&&t<=12351},Hiragana:function(t){return t>=12352&&t<=12447},Katakana:function(t){return t>=12448&&t<=12543},Bopomofo:function(t){return t>=12544&&t<=12591},"Hangul Compatibility Jamo":function(t){return t>=12592&&t<=12687},Kanbun:function(t){return t>=12688&&t<=12703},"Bopomofo Extended":function(t){return t>=12704&&t<=12735},"CJK Strokes":function(t){return t>=12736&&t<=12783},"Katakana Phonetic Extensions":function(t){return t>=12784&&t<=12799},"Enclosed CJK Letters and Months":function(t){return t>=12800&&t<=13055},"CJK Compatibility":function(t){return t>=13056&&t<=13311},"CJK Unified Ideographs Extension A":function(t){return t>=13312&&t<=19903},"Yijing Hexagram Symbols":function(t){return t>=19904&&t<=19967},"CJK Unified Ideographs":function(t){return t>=19968&&t<=40959},"Yi Syllables":function(t){return t>=40960&&t<=42127},"Yi Radicals":function(t){return t>=42128&&t<=42191},"Hangul Jamo Extended-A":function(t){return t>=43360&&t<=43391},"Hangul Syllables":function(t){return t>=44032&&t<=55215},"Hangul Jamo Extended-B":function(t){return t>=55216&&t<=55295},"Private Use Area":function(t){return t>=57344&&t<=63743},"CJK Compatibility Ideographs":function(t){return t>=63744&&t<=64255},"Arabic Presentation Forms-A":function(t){return t>=64336&&t<=65023},"Vertical Forms":function(t){return t>=65040&&t<=65055},"CJK Compatibility Forms":function(t){return t>=65072&&t<=65103},"Small Form Variants":function(t){return t>=65104&&t<=65135},"Arabic Presentation Forms-B":function(t){return t>=65136&&t<=65279},"Halfwidth and Fullwidth Forms":function(t){return t>=65280&&t<=65519}};function fi(t){for(var e=0,r=t;e=65097&&t<=65103)||ci["CJK Compatibility Ideographs"](t)||ci["CJK Compatibility"](t)||ci["CJK Radicals Supplement"](t)||ci["CJK Strokes"](t)||!(!ci["CJK Symbols and Punctuation"](t)||t>=12296&&t<=12305||t>=12308&&t<=12319||12336===t)||ci["CJK Unified Ideographs Extension A"](t)||ci["CJK Unified Ideographs"](t)||ci["Enclosed CJK Letters and Months"](t)||ci["Hangul Compatibility Jamo"](t)||ci["Hangul Jamo Extended-A"](t)||ci["Hangul Jamo Extended-B"](t)||ci["Hangul Jamo"](t)||ci["Hangul Syllables"](t)||ci.Hiragana(t)||ci["Ideographic Description Characters"](t)||ci.Kanbun(t)||ci["Kangxi Radicals"](t)||ci["Katakana Phonetic Extensions"](t)||ci.Katakana(t)&&12540!==t||!(!ci["Halfwidth and Fullwidth Forms"](t)||65288===t||65289===t||65293===t||t>=65306&&t<=65310||65339===t||65341===t||65343===t||t>=65371&&t<=65503||65507===t||t>=65512&&t<=65519)||!(!ci["Small Form Variants"](t)||t>=65112&&t<=65118||t>=65123&&t<=65126)||ci["Unified Canadian Aboriginal Syllabics"](t)||ci["Unified Canadian Aboriginal Syllabics Extended"](t)||ci["Vertical Forms"](t)||ci["Yijing Hexagram Symbols"](t)||ci["Yi Syllables"](t)||ci["Yi Radicals"](t))))}function pi(t){return!(hi(t)||function(t){return!!(ci["Latin-1 Supplement"](t)&&(167===t||169===t||174===t||177===t||188===t||189===t||190===t||215===t||247===t)||ci["General Punctuation"](t)&&(8214===t||8224===t||8225===t||8240===t||8241===t||8251===t||8252===t||8258===t||8263===t||8264===t||8265===t||8273===t)||ci["Letterlike Symbols"](t)||ci["Number Forms"](t)||ci["Miscellaneous Technical"](t)&&(t>=8960&&t<=8967||t>=8972&&t<=8991||t>=8996&&t<=9e3||9003===t||t>=9085&&t<=9114||t>=9150&&t<=9165||9167===t||t>=9169&&t<=9179||t>=9186&&t<=9215)||ci["Control Pictures"](t)&&9251!==t||ci["Optical Character Recognition"](t)||ci["Enclosed Alphanumerics"](t)||ci["Geometric Shapes"](t)||ci["Miscellaneous Symbols"](t)&&!(t>=9754&&t<=9759)||ci["Miscellaneous Symbols and Arrows"](t)&&(t>=11026&&t<=11055||t>=11088&&t<=11097||t>=11192&&t<=11243)||ci["CJK Symbols and Punctuation"](t)||ci.Katakana(t)||ci["Private Use Area"](t)||ci["CJK Compatibility Forms"](t)||ci["Small Form Variants"](t)||ci["Halfwidth and Fullwidth Forms"](t)||8734===t||8756===t||8757===t||t>=9984&&t<=10087||t>=10102&&t<=10131||65532===t||65533===t)}(t))}function di(t){return ci.Arabic(t)||ci["Arabic Supplement"](t)||ci["Arabic Extended-A"](t)||ci["Arabic Presentation Forms-A"](t)||ci["Arabic Presentation Forms-B"](t)}function vi(t){return t>=1424&&t<=2303||ci["Arabic Presentation Forms-A"](t)||ci["Arabic Presentation Forms-B"](t)}function gi(t,e){return!(!e&&vi(t)||t>=2304&&t<=3583||t>=3840&&t<=4255||ci.Khmer(t))}function yi(t){for(var e=0,r=t;e-1&&(Ti=_i),wi&&wi(t)};function Mi(){Si.fire(new Pt("pluginStateChange",{pluginStatus:Ti,pluginURL:ki}))}var Si=new It,Ei=function(){return Ti},Li=function(){if(Ti!==mi||!ki)throw new Error("rtl-text-plugin cannot be downloaded unless a pluginURL is specified");Ti=xi,Mi(),ki&&kt({url:ki},(function(t){t?Ai(t):(Ti=bi,Mi())}))},Ci={applyArabicShaping:null,processBidirectionalText:null,processStyledBidirectionalText:null,isLoaded:function(){return Ti===bi||null!=Ci.applyArabicShaping},isLoading:function(){return Ti===xi},setState:function(t){Ti=t.pluginStatus,ki=t.pluginURL},isParsed:function(){return null!=Ci.applyArabicShaping&&null!=Ci.processBidirectionalText&&null!=Ci.processStyledBidirectionalText},getPluginURL:function(){return ki}},Pi=function(t,e){this.zoom=t,e?(this.now=e.now,this.fadeDuration=e.fadeDuration,this.zoomHistory=e.zoomHistory,this.transition=e.transition):(this.now=0,this.fadeDuration=0,this.zoomHistory=new ui,this.transition={})};Pi.prototype.isSupportedScript=function(t){return function(t,e){for(var r=0,n=t;rthis.zoomHistory.lastIntegerZoom?{fromScale:2,toScale:1,t:e+(1-e)*r}:{fromScale:.5,toScale:1,t:1-(1-r)*e}};var Oi=function(t,e){this.property=t,this.value=e,this.expression=function(t,e){if(Kr(t))return new hn(t,e);if(sn(t)){var r=fn(t,e);if("error"===r.result)throw new Error(r.value.map((function(t){return t.key+": "+t.message})).join(", "));return r.value}var n=t;return"string"==typeof t&&"color"===e.type&&(n=oe.parse(t)),{kind:"constant",evaluate:function(){return n}}}(void 0===e?t.specification.default:e,t.specification)};Oi.prototype.isDataDriven=function(){return"source"===this.expression.kind||"composite"===this.expression.kind},Oi.prototype.possiblyEvaluate=function(t,e,r){return this.property.possiblyEvaluate(this,t,e,r)};var Ii=function(t){this.property=t,this.value=new Oi(t,void 0)};Ii.prototype.transitioned=function(t,e){return new zi(this.property,this.value,e,f({},t.transition,this.transition),t.now)},Ii.prototype.untransitioned=function(){return new zi(this.property,this.value,null,{},0)};var Di=function(t){this._properties=t,this._values=Object.create(t.defaultTransitionablePropertyValues)};Di.prototype.getValue=function(t){return b(this._values[t].value.value)},Di.prototype.setValue=function(t,e){this._values.hasOwnProperty(t)||(this._values[t]=new Ii(this._values[t].property)),this._values[t].value=new Oi(this._values[t].property,null===e?void 0:b(e))},Di.prototype.getTransition=function(t){return b(this._values[t].transition)},Di.prototype.setTransition=function(t,e){this._values.hasOwnProperty(t)||(this._values[t]=new Ii(this._values[t].property)),this._values[t].transition=b(e)||void 0},Di.prototype.serialize=function(){for(var t={},e=0,r=Object.keys(this._values);ethis.end)return this.prior=null,i;if(this.value.isDataDriven())return this.prior=null,i;if(n=1)return 1;var e=t*t,r=e*t;return 4*(t<.5?r:3*(t-e)+r-.75)}(o))}return i};var Ri=function(t){this._properties=t,this._values=Object.create(t.defaultTransitioningPropertyValues)};Ri.prototype.possiblyEvaluate=function(t,e,r){for(var n=new Ni(this._properties),i=0,a=Object.keys(this._values);in.zoomHistory.lastIntegerZoom?{from:t,to:e}:{from:r,to:e}},e.prototype.interpolate=function(t){return t},e}(Ui),Hi=function(t){this.specification=t};Hi.prototype.possiblyEvaluate=function(t,e,r,n){if(void 0!==t.value){if("constant"===t.expression.kind){var i=t.expression.evaluate(e,null,{},r,n);return this._calculate(i,i,i,e)}return this._calculate(t.expression.evaluate(new Pi(Math.floor(e.zoom-1),e)),t.expression.evaluate(new Pi(Math.floor(e.zoom),e)),t.expression.evaluate(new Pi(Math.floor(e.zoom+1),e)),e)}},Hi.prototype._calculate=function(t,e,r,n){return n.zoom>n.zoomHistory.lastIntegerZoom?{from:t,to:e}:{from:r,to:e}},Hi.prototype.interpolate=function(t){return t};var qi=function(t){this.specification=t};qi.prototype.possiblyEvaluate=function(t,e,r,n){return!!t.expression.evaluate(e,null,{},r,n)},qi.prototype.interpolate=function(){return!1};var Gi=function(t){for(var e in this.properties=t,this.defaultPropertyValues={},this.defaultTransitionablePropertyValues={},this.defaultTransitioningPropertyValues={},this.defaultPossiblyEvaluatedValues={},this.overridableProperties=[],t){var r=t[e];r.specification.overridable&&this.overridableProperties.push(e);var n=this.defaultPropertyValues[e]=new Oi(r,void 0),i=this.defaultTransitionablePropertyValues[e]=new Ii(r);this.defaultTransitioningPropertyValues[e]=i.untransitioned(),this.defaultPossiblyEvaluatedValues[e]=n.possiblyEvaluate({})}};ni("DataDrivenProperty",Ui),ni("DataConstantProperty",ji),ni("CrossFadedDataDrivenProperty",Vi),ni("CrossFadedProperty",Hi),ni("ColorRampProperty",qi);var Zi="-transition",Yi=function(t){function e(e,r){if(t.call(this),this.id=e.id,this.type=e.type,this._featureFilter={filter:function(){return!0},needGeometry:!1},"custom"!==e.type&&(this.metadata=e.metadata,this.minzoom=e.minzoom,this.maxzoom=e.maxzoom,"background"!==e.type&&(this.source=e.source,this.sourceLayer=e["source-layer"],this.filter=e.filter),r.layout&&(this._unevaluatedLayout=new Fi(r.layout)),r.paint)){for(var n in this._transitionablePaint=new Di(r.paint),e.paint)this.setPaintProperty(n,e.paint[n],{validate:!1});for(var i in e.layout)this.setLayoutProperty(i,e.layout[i],{validate:!1});this._transitioningPaint=this._transitionablePaint.untransitioned(),this.paint=new Ni(r.paint)}}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getCrossfadeParameters=function(){return this._crossfadeParameters},e.prototype.getLayoutProperty=function(t){return"visibility"===t?this.visibility:this._unevaluatedLayout.getValue(t)},e.prototype.setLayoutProperty=function(t,e,r){if(void 0===r&&(r={}),null!=e){var n="layers."+this.id+".layout."+t;if(this._validate(Xn,n,t,e,r))return}"visibility"!==t?this._unevaluatedLayout.setValue(t,e):this.visibility=e},e.prototype.getPaintProperty=function(t){return y(t,Zi)?this._transitionablePaint.getTransition(t.slice(0,-11)):this._transitionablePaint.getValue(t)},e.prototype.setPaintProperty=function(t,e,r){if(void 0===r&&(r={}),null!=e){var n="layers."+this.id+".paint."+t;if(this._validate(Wn,n,t,e,r))return!1}if(y(t,Zi))return this._transitionablePaint.setTransition(t.slice(0,-11),e||void 0),!1;var i=this._transitionablePaint._values[t],a="cross-faded-data-driven"===i.property.specification["property-type"],o=i.value.isDataDriven(),s=i.value;this._transitionablePaint.setValue(t,e),this._handleSpecialPaintPropertyUpdate(t);var l=this._transitionablePaint._values[t].value;return l.isDataDriven()||o||a||this._handleOverridablePaintPropertyUpdate(t,s,l)},e.prototype._handleSpecialPaintPropertyUpdate=function(t){},e.prototype._handleOverridablePaintPropertyUpdate=function(t,e,r){return!1},e.prototype.isHidden=function(t){return!!(this.minzoom&&t=this.maxzoom)||"none"===this.visibility},e.prototype.updateTransitions=function(t){this._transitioningPaint=this._transitionablePaint.transitioned(t,this._transitioningPaint)},e.prototype.hasTransition=function(){return this._transitioningPaint.hasTransition()},e.prototype.recalculate=function(t,e){t.getCrossfadeParameters&&(this._crossfadeParameters=t.getCrossfadeParameters()),this._unevaluatedLayout&&(this.layout=this._unevaluatedLayout.possiblyEvaluate(t,void 0,e)),this.paint=this._transitioningPaint.possiblyEvaluate(t,void 0,e)},e.prototype.serialize=function(){var t={id:this.id,type:this.type,source:this.source,"source-layer":this.sourceLayer,metadata:this.metadata,minzoom:this.minzoom,maxzoom:this.maxzoom,filter:this.filter,layout:this._unevaluatedLayout&&this._unevaluatedLayout.serialize(),paint:this._transitionablePaint&&this._transitionablePaint.serialize()};return this.visibility&&(t.layout=t.layout||{},t.layout.visibility=this.visibility),x(t,(function(t,e){return!(void 0===t||"layout"===e&&!Object.keys(t).length||"paint"===e&&!Object.keys(t).length)}))},e.prototype._validate=function(t,e,r,n,i){return void 0===i&&(i={}),(!i||!1!==i.validate)&&Jn(this,t.call(Zn,{key:e,layerType:this.type,objectKey:r,value:n,styleSpec:Dt,style:{glyphs:!0,sprite:!0}}))},e.prototype.is3D=function(){return!1},e.prototype.isTileClipped=function(){return!1},e.prototype.hasOffscreenPass=function(){return!1},e.prototype.resize=function(){},e.prototype.isStateDependent=function(){for(var t in this.paint._values){var e=this.paint.get(t);if(e instanceof Bi&&Yr(e.property.specification)&&("source"===e.value.kind||"composite"===e.value.kind)&&e.value.isStateDependent)return!0}return!1},e}(It),Wi={Int8:Int8Array,Uint8:Uint8Array,Int16:Int16Array,Uint16:Uint16Array,Int32:Int32Array,Uint32:Uint32Array,Float32:Float32Array},Xi=function(t,e){this._structArray=t,this._pos1=e*this.size,this._pos2=this._pos1/2,this._pos4=this._pos1/4,this._pos8=this._pos1/8},Ji=function(){this.isTransferred=!1,this.capacity=-1,this.resize(0)};function Ki(t,e){void 0===e&&(e=1);var r=0,n=0;return{members:t.map((function(t){var i,a=(i=t.type,Wi[i].BYTES_PER_ELEMENT),o=r=$i(r,Math.max(e,a)),s=t.components||1;return n=Math.max(n,a),r+=a*s,{name:t.name,type:t.type,components:s,offset:o}})),size:$i(r,Math.max(n,e)),alignment:e}}function $i(t,e){return Math.ceil(t/e)*e}Ji.serialize=function(t,e){return t._trim(),e&&(t.isTransferred=!0,e.push(t.arrayBuffer)),{length:t.length,arrayBuffer:t.arrayBuffer}},Ji.deserialize=function(t){var e=Object.create(this.prototype);return e.arrayBuffer=t.arrayBuffer,e.length=t.length,e.capacity=t.arrayBuffer.byteLength/e.bytesPerElement,e._refreshViews(),e},Ji.prototype._trim=function(){this.length!==this.capacity&&(this.capacity=this.length,this.arrayBuffer=this.arrayBuffer.slice(0,this.length*this.bytesPerElement),this._refreshViews())},Ji.prototype.clear=function(){this.length=0},Ji.prototype.resize=function(t){this.reserve(t),this.length=t},Ji.prototype.reserve=function(t){if(t>this.capacity){this.capacity=Math.max(t,Math.floor(5*this.capacity),128),this.arrayBuffer=new ArrayBuffer(this.capacity*this.bytesPerElement);var e=this.uint8;this._refreshViews(),e&&this.uint8.set(e)}},Ji.prototype._refreshViews=function(){throw new Error("_refreshViews() must be implemented by each concrete StructArray layout")};var Qi=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e){var r=this.length;return this.resize(r+1),this.emplace(r,t,e)},e.prototype.emplace=function(t,e,r){var n=2*t;return this.int16[n+0]=e,this.int16[n+1]=r,t},e}(Ji);Qi.prototype.bytesPerElement=4,ni("StructArrayLayout2i4",Qi);var ta=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n){var i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)},e.prototype.emplace=function(t,e,r,n,i){var a=4*t;return this.int16[a+0]=e,this.int16[a+1]=r,this.int16[a+2]=n,this.int16[a+3]=i,t},e}(Ji);ta.prototype.bytesPerElement=8,ni("StructArrayLayout4i8",ta);var ea=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a){var o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,n,i,a)},e.prototype.emplace=function(t,e,r,n,i,a,o){var s=6*t;return this.int16[s+0]=e,this.int16[s+1]=r,this.int16[s+2]=n,this.int16[s+3]=i,this.int16[s+4]=a,this.int16[s+5]=o,t},e}(Ji);ea.prototype.bytesPerElement=12,ni("StructArrayLayout2i4i12",ea);var ra=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a){var o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,n,i,a)},e.prototype.emplace=function(t,e,r,n,i,a,o){var s=4*t,l=8*t;return this.int16[s+0]=e,this.int16[s+1]=r,this.uint8[l+4]=n,this.uint8[l+5]=i,this.uint8[l+6]=a,this.uint8[l+7]=o,t},e}(Ji);ra.prototype.bytesPerElement=8,ni("StructArrayLayout2i4ub8",ra);var na=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,l,u){var c=this.length;return this.resize(c+1),this.emplace(c,t,e,r,n,i,a,o,s,l,u)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,l,u,c){var f=9*t,h=18*t;return this.uint16[f+0]=e,this.uint16[f+1]=r,this.uint16[f+2]=n,this.uint16[f+3]=i,this.uint16[f+4]=a,this.uint16[f+5]=o,this.uint16[f+6]=s,this.uint16[f+7]=l,this.uint8[h+16]=u,this.uint8[h+17]=c,t},e}(Ji);na.prototype.bytesPerElement=18,ni("StructArrayLayout8ui2ub18",na);var ia=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,l,u,c,f){var h=this.length;return this.resize(h+1),this.emplace(h,t,e,r,n,i,a,o,s,l,u,c,f)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,l,u,c,f,h){var p=12*t;return this.int16[p+0]=e,this.int16[p+1]=r,this.int16[p+2]=n,this.int16[p+3]=i,this.uint16[p+4]=a,this.uint16[p+5]=o,this.uint16[p+6]=s,this.uint16[p+7]=l,this.int16[p+8]=u,this.int16[p+9]=c,this.int16[p+10]=f,this.int16[p+11]=h,t},e}(Ji);ia.prototype.bytesPerElement=24,ni("StructArrayLayout4i4ui4i24",ia);var aa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r){var n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)},e.prototype.emplace=function(t,e,r,n){var i=3*t;return this.float32[i+0]=e,this.float32[i+1]=r,this.float32[i+2]=n,t},e}(Ji);aa.prototype.bytesPerElement=12,ni("StructArrayLayout3f12",aa);var oa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t){var e=this.length;return this.resize(e+1),this.emplace(e,t)},e.prototype.emplace=function(t,e){var r=1*t;return this.uint32[r+0]=e,t},e}(Ji);oa.prototype.bytesPerElement=4,ni("StructArrayLayout1ul4",oa);var sa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,l){var u=this.length;return this.resize(u+1),this.emplace(u,t,e,r,n,i,a,o,s,l)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,l,u){var c=10*t,f=5*t;return this.int16[c+0]=e,this.int16[c+1]=r,this.int16[c+2]=n,this.int16[c+3]=i,this.int16[c+4]=a,this.int16[c+5]=o,this.uint32[f+3]=s,this.uint16[c+8]=l,this.uint16[c+9]=u,t},e}(Ji);sa.prototype.bytesPerElement=20,ni("StructArrayLayout6i1ul2ui20",sa);var la=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a){var o=this.length;return this.resize(o+1),this.emplace(o,t,e,r,n,i,a)},e.prototype.emplace=function(t,e,r,n,i,a,o){var s=6*t;return this.int16[s+0]=e,this.int16[s+1]=r,this.int16[s+2]=n,this.int16[s+3]=i,this.int16[s+4]=a,this.int16[s+5]=o,t},e}(Ji);la.prototype.bytesPerElement=12,ni("StructArrayLayout2i2i2i12",la);var ua=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i){var a=this.length;return this.resize(a+1),this.emplace(a,t,e,r,n,i)},e.prototype.emplace=function(t,e,r,n,i,a){var o=4*t,s=8*t;return this.float32[o+0]=e,this.float32[o+1]=r,this.float32[o+2]=n,this.int16[s+6]=i,this.int16[s+7]=a,t},e}(Ji);ua.prototype.bytesPerElement=16,ni("StructArrayLayout2f1f2i16",ua);var ca=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n){var i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)},e.prototype.emplace=function(t,e,r,n,i){var a=12*t,o=3*t;return this.uint8[a+0]=e,this.uint8[a+1]=r,this.float32[o+1]=n,this.float32[o+2]=i,t},e}(Ji);ca.prototype.bytesPerElement=12,ni("StructArrayLayout2ub2f12",ca);var fa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r){var n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)},e.prototype.emplace=function(t,e,r,n){var i=3*t;return this.uint16[i+0]=e,this.uint16[i+1]=r,this.uint16[i+2]=n,t},e}(Ji);fa.prototype.bytesPerElement=6,ni("StructArrayLayout3ui6",fa);var ha=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,l,u,c,f,h,p,d,v,g){var y=this.length;return this.resize(y+1),this.emplace(y,t,e,r,n,i,a,o,s,l,u,c,f,h,p,d,v,g)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,l,u,c,f,h,p,d,v,g,y){var m=24*t,x=12*t,b=48*t;return this.int16[m+0]=e,this.int16[m+1]=r,this.uint16[m+2]=n,this.uint16[m+3]=i,this.uint32[x+2]=a,this.uint32[x+3]=o,this.uint32[x+4]=s,this.uint16[m+10]=l,this.uint16[m+11]=u,this.uint16[m+12]=c,this.float32[x+7]=f,this.float32[x+8]=h,this.uint8[b+36]=p,this.uint8[b+37]=d,this.uint8[b+38]=v,this.uint32[x+10]=g,this.int16[m+22]=y,t},e}(Ji);ha.prototype.bytesPerElement=48,ni("StructArrayLayout2i2ui3ul3ui2f3ub1ul1i48",ha);var pa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,l,u,c,f,h,p,d,v,g,y,m,x,b,_,w,T,k,A,M,S){var E=this.length;return this.resize(E+1),this.emplace(E,t,e,r,n,i,a,o,s,l,u,c,f,h,p,d,v,g,y,m,x,b,_,w,T,k,A,M,S)},e.prototype.emplace=function(t,e,r,n,i,a,o,s,l,u,c,f,h,p,d,v,g,y,m,x,b,_,w,T,k,A,M,S,E){var L=34*t,C=17*t;return this.int16[L+0]=e,this.int16[L+1]=r,this.int16[L+2]=n,this.int16[L+3]=i,this.int16[L+4]=a,this.int16[L+5]=o,this.int16[L+6]=s,this.int16[L+7]=l,this.uint16[L+8]=u,this.uint16[L+9]=c,this.uint16[L+10]=f,this.uint16[L+11]=h,this.uint16[L+12]=p,this.uint16[L+13]=d,this.uint16[L+14]=v,this.uint16[L+15]=g,this.uint16[L+16]=y,this.uint16[L+17]=m,this.uint16[L+18]=x,this.uint16[L+19]=b,this.uint16[L+20]=_,this.uint16[L+21]=w,this.uint16[L+22]=T,this.uint32[C+12]=k,this.float32[C+13]=A,this.float32[C+14]=M,this.float32[C+15]=S,this.float32[C+16]=E,t},e}(Ji);pa.prototype.bytesPerElement=68,ni("StructArrayLayout8i15ui1ul4f68",pa);var da=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t){var e=this.length;return this.resize(e+1),this.emplace(e,t)},e.prototype.emplace=function(t,e){var r=1*t;return this.float32[r+0]=e,t},e}(Ji);da.prototype.bytesPerElement=4,ni("StructArrayLayout1f4",da);var va=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r){var n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)},e.prototype.emplace=function(t,e,r,n){var i=3*t;return this.int16[i+0]=e,this.int16[i+1]=r,this.int16[i+2]=n,t},e}(Ji);va.prototype.bytesPerElement=6,ni("StructArrayLayout3i6",va);var ga=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r){var n=this.length;return this.resize(n+1),this.emplace(n,t,e,r)},e.prototype.emplace=function(t,e,r,n){var i=2*t,a=4*t;return this.uint32[i+0]=e,this.uint16[a+2]=r,this.uint16[a+3]=n,t},e}(Ji);ga.prototype.bytesPerElement=8,ni("StructArrayLayout1ul2ui8",ga);var ya=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e){var r=this.length;return this.resize(r+1),this.emplace(r,t,e)},e.prototype.emplace=function(t,e,r){var n=2*t;return this.uint16[n+0]=e,this.uint16[n+1]=r,t},e}(Ji);ya.prototype.bytesPerElement=4,ni("StructArrayLayout2ui4",ya);var ma=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t){var e=this.length;return this.resize(e+1),this.emplace(e,t)},e.prototype.emplace=function(t,e){var r=1*t;return this.uint16[r+0]=e,t},e}(Ji);ma.prototype.bytesPerElement=2,ni("StructArrayLayout1ui2",ma);var xa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e){var r=this.length;return this.resize(r+1),this.emplace(r,t,e)},e.prototype.emplace=function(t,e,r){var n=2*t;return this.float32[n+0]=e,this.float32[n+1]=r,t},e}(Ji);xa.prototype.bytesPerElement=8,ni("StructArrayLayout2f8",xa);var ba=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n){var i=this.length;return this.resize(i+1),this.emplace(i,t,e,r,n)},e.prototype.emplace=function(t,e,r,n,i){var a=4*t;return this.float32[a+0]=e,this.float32[a+1]=r,this.float32[a+2]=n,this.float32[a+3]=i,t},e}(Ji);ba.prototype.bytesPerElement=16,ni("StructArrayLayout4f16",ba);var _a=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={anchorPointX:{configurable:!0},anchorPointY:{configurable:!0},x1:{configurable:!0},y1:{configurable:!0},x2:{configurable:!0},y2:{configurable:!0},featureIndex:{configurable:!0},sourceLayerIndex:{configurable:!0},bucketIndex:{configurable:!0},anchorPoint:{configurable:!0}};return r.anchorPointX.get=function(){return this._structArray.int16[this._pos2+0]},r.anchorPointY.get=function(){return this._structArray.int16[this._pos2+1]},r.x1.get=function(){return this._structArray.int16[this._pos2+2]},r.y1.get=function(){return this._structArray.int16[this._pos2+3]},r.x2.get=function(){return this._structArray.int16[this._pos2+4]},r.y2.get=function(){return this._structArray.int16[this._pos2+5]},r.featureIndex.get=function(){return this._structArray.uint32[this._pos4+3]},r.sourceLayerIndex.get=function(){return this._structArray.uint16[this._pos2+8]},r.bucketIndex.get=function(){return this._structArray.uint16[this._pos2+9]},r.anchorPoint.get=function(){return new a(this.anchorPointX,this.anchorPointY)},Object.defineProperties(e.prototype,r),e}(Xi);_a.prototype.size=20;var wa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new _a(this,t)},e}(sa);ni("CollisionBoxArray",wa);var Ta=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={anchorX:{configurable:!0},anchorY:{configurable:!0},glyphStartIndex:{configurable:!0},numGlyphs:{configurable:!0},vertexStartIndex:{configurable:!0},lineStartIndex:{configurable:!0},lineLength:{configurable:!0},segment:{configurable:!0},lowerSize:{configurable:!0},upperSize:{configurable:!0},lineOffsetX:{configurable:!0},lineOffsetY:{configurable:!0},writingMode:{configurable:!0},placedOrientation:{configurable:!0},hidden:{configurable:!0},crossTileID:{configurable:!0},associatedIconIndex:{configurable:!0}};return r.anchorX.get=function(){return this._structArray.int16[this._pos2+0]},r.anchorY.get=function(){return this._structArray.int16[this._pos2+1]},r.glyphStartIndex.get=function(){return this._structArray.uint16[this._pos2+2]},r.numGlyphs.get=function(){return this._structArray.uint16[this._pos2+3]},r.vertexStartIndex.get=function(){return this._structArray.uint32[this._pos4+2]},r.lineStartIndex.get=function(){return this._structArray.uint32[this._pos4+3]},r.lineLength.get=function(){return this._structArray.uint32[this._pos4+4]},r.segment.get=function(){return this._structArray.uint16[this._pos2+10]},r.lowerSize.get=function(){return this._structArray.uint16[this._pos2+11]},r.upperSize.get=function(){return this._structArray.uint16[this._pos2+12]},r.lineOffsetX.get=function(){return this._structArray.float32[this._pos4+7]},r.lineOffsetY.get=function(){return this._structArray.float32[this._pos4+8]},r.writingMode.get=function(){return this._structArray.uint8[this._pos1+36]},r.placedOrientation.get=function(){return this._structArray.uint8[this._pos1+37]},r.placedOrientation.set=function(t){this._structArray.uint8[this._pos1+37]=t},r.hidden.get=function(){return this._structArray.uint8[this._pos1+38]},r.hidden.set=function(t){this._structArray.uint8[this._pos1+38]=t},r.crossTileID.get=function(){return this._structArray.uint32[this._pos4+10]},r.crossTileID.set=function(t){this._structArray.uint32[this._pos4+10]=t},r.associatedIconIndex.get=function(){return this._structArray.int16[this._pos2+22]},Object.defineProperties(e.prototype,r),e}(Xi);Ta.prototype.size=48;var ka=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new Ta(this,t)},e}(ha);ni("PlacedSymbolArray",ka);var Aa=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={anchorX:{configurable:!0},anchorY:{configurable:!0},rightJustifiedTextSymbolIndex:{configurable:!0},centerJustifiedTextSymbolIndex:{configurable:!0},leftJustifiedTextSymbolIndex:{configurable:!0},verticalPlacedTextSymbolIndex:{configurable:!0},placedIconSymbolIndex:{configurable:!0},verticalPlacedIconSymbolIndex:{configurable:!0},key:{configurable:!0},textBoxStartIndex:{configurable:!0},textBoxEndIndex:{configurable:!0},verticalTextBoxStartIndex:{configurable:!0},verticalTextBoxEndIndex:{configurable:!0},iconBoxStartIndex:{configurable:!0},iconBoxEndIndex:{configurable:!0},verticalIconBoxStartIndex:{configurable:!0},verticalIconBoxEndIndex:{configurable:!0},featureIndex:{configurable:!0},numHorizontalGlyphVertices:{configurable:!0},numVerticalGlyphVertices:{configurable:!0},numIconVertices:{configurable:!0},numVerticalIconVertices:{configurable:!0},useRuntimeCollisionCircles:{configurable:!0},crossTileID:{configurable:!0},textBoxScale:{configurable:!0},textOffset0:{configurable:!0},textOffset1:{configurable:!0},collisionCircleDiameter:{configurable:!0}};return r.anchorX.get=function(){return this._structArray.int16[this._pos2+0]},r.anchorY.get=function(){return this._structArray.int16[this._pos2+1]},r.rightJustifiedTextSymbolIndex.get=function(){return this._structArray.int16[this._pos2+2]},r.centerJustifiedTextSymbolIndex.get=function(){return this._structArray.int16[this._pos2+3]},r.leftJustifiedTextSymbolIndex.get=function(){return this._structArray.int16[this._pos2+4]},r.verticalPlacedTextSymbolIndex.get=function(){return this._structArray.int16[this._pos2+5]},r.placedIconSymbolIndex.get=function(){return this._structArray.int16[this._pos2+6]},r.verticalPlacedIconSymbolIndex.get=function(){return this._structArray.int16[this._pos2+7]},r.key.get=function(){return this._structArray.uint16[this._pos2+8]},r.textBoxStartIndex.get=function(){return this._structArray.uint16[this._pos2+9]},r.textBoxEndIndex.get=function(){return this._structArray.uint16[this._pos2+10]},r.verticalTextBoxStartIndex.get=function(){return this._structArray.uint16[this._pos2+11]},r.verticalTextBoxEndIndex.get=function(){return this._structArray.uint16[this._pos2+12]},r.iconBoxStartIndex.get=function(){return this._structArray.uint16[this._pos2+13]},r.iconBoxEndIndex.get=function(){return this._structArray.uint16[this._pos2+14]},r.verticalIconBoxStartIndex.get=function(){return this._structArray.uint16[this._pos2+15]},r.verticalIconBoxEndIndex.get=function(){return this._structArray.uint16[this._pos2+16]},r.featureIndex.get=function(){return this._structArray.uint16[this._pos2+17]},r.numHorizontalGlyphVertices.get=function(){return this._structArray.uint16[this._pos2+18]},r.numVerticalGlyphVertices.get=function(){return this._structArray.uint16[this._pos2+19]},r.numIconVertices.get=function(){return this._structArray.uint16[this._pos2+20]},r.numVerticalIconVertices.get=function(){return this._structArray.uint16[this._pos2+21]},r.useRuntimeCollisionCircles.get=function(){return this._structArray.uint16[this._pos2+22]},r.crossTileID.get=function(){return this._structArray.uint32[this._pos4+12]},r.crossTileID.set=function(t){this._structArray.uint32[this._pos4+12]=t},r.textBoxScale.get=function(){return this._structArray.float32[this._pos4+13]},r.textOffset0.get=function(){return this._structArray.float32[this._pos4+14]},r.textOffset1.get=function(){return this._structArray.float32[this._pos4+15]},r.collisionCircleDiameter.get=function(){return this._structArray.float32[this._pos4+16]},Object.defineProperties(e.prototype,r),e}(Xi);Aa.prototype.size=68;var Ma=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new Aa(this,t)},e}(pa);ni("SymbolInstanceArray",Ma);var Sa=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getoffsetX=function(t){return this.float32[1*t+0]},e}(da);ni("GlyphOffsetArray",Sa);var Ea=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getx=function(t){return this.int16[3*t+0]},e.prototype.gety=function(t){return this.int16[3*t+1]},e.prototype.gettileUnitDistanceFromAnchor=function(t){return this.int16[3*t+2]},e}(va);ni("SymbolLineVertexArray",Ea);var La=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={featureIndex:{configurable:!0},sourceLayerIndex:{configurable:!0},bucketIndex:{configurable:!0}};return r.featureIndex.get=function(){return this._structArray.uint32[this._pos4+0]},r.sourceLayerIndex.get=function(){return this._structArray.uint16[this._pos2+2]},r.bucketIndex.get=function(){return this._structArray.uint16[this._pos2+3]},Object.defineProperties(e.prototype,r),e}(Xi);La.prototype.size=8;var Ca=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new La(this,t)},e}(ga);ni("FeatureIndexArray",Ca);var Pa=Ki([{name:"a_pos",components:2,type:"Int16"}],4).members,Oa=function(t){void 0===t&&(t=[]),this.segments=t};function Ia(t,e){return 256*(t=u(Math.floor(t),0,255))+u(Math.floor(e),0,255)}Oa.prototype.prepareSegment=function(t,e,r,n){var i=this.segments[this.segments.length-1];return t>Oa.MAX_VERTEX_ARRAY_LENGTH&&w("Max vertices per segment is "+Oa.MAX_VERTEX_ARRAY_LENGTH+": bucket requested "+t),(!i||i.vertexLength+t>Oa.MAX_VERTEX_ARRAY_LENGTH||i.sortKey!==n)&&(i={vertexOffset:e.length,primitiveOffset:r.length,vertexLength:0,primitiveLength:0},void 0!==n&&(i.sortKey=n),this.segments.push(i)),i},Oa.prototype.get=function(){return this.segments},Oa.prototype.destroy=function(){for(var t=0,e=this.segments;t>>16)*o&65535)<<16)&4294967295)<<15|l>>>17))*s+(((l>>>16)*s&65535)<<16)&4294967295)<<13|i>>>19))+((5*(i>>>16)&65535)<<16)&4294967295))+((58964+(a>>>16)&65535)<<16);switch(l=0,r){case 3:l^=(255&t.charCodeAt(u+2))<<16;case 2:l^=(255&t.charCodeAt(u+1))<<8;case 1:i^=l=(65535&(l=(l=(65535&(l^=255&t.charCodeAt(u)))*o+(((l>>>16)*o&65535)<<16)&4294967295)<<15|l>>>17))*s+(((l>>>16)*s&65535)<<16)&4294967295}return i^=t.length,i=2246822507*(65535&(i^=i>>>16))+((2246822507*(i>>>16)&65535)<<16)&4294967295,i=3266489909*(65535&(i^=i>>>13))+((3266489909*(i>>>16)&65535)<<16)&4294967295,(i^=i>>>16)>>>0}})),Ra=e((function(t){t.exports=function(t,e){for(var r,n=t.length,i=e^n,a=0;n>=4;)r=1540483477*(65535&(r=255&t.charCodeAt(a)|(255&t.charCodeAt(++a))<<8|(255&t.charCodeAt(++a))<<16|(255&t.charCodeAt(++a))<<24))+((1540483477*(r>>>16)&65535)<<16),i=1540483477*(65535&i)+((1540483477*(i>>>16)&65535)<<16)^(r=1540483477*(65535&(r^=r>>>24))+((1540483477*(r>>>16)&65535)<<16)),n-=4,++a;switch(n){case 3:i^=(255&t.charCodeAt(a+2))<<16;case 2:i^=(255&t.charCodeAt(a+1))<<8;case 1:i=1540483477*(65535&(i^=255&t.charCodeAt(a)))+((1540483477*(i>>>16)&65535)<<16)}return i=1540483477*(65535&(i^=i>>>13))+((1540483477*(i>>>16)&65535)<<16),(i^=i>>>15)>>>0}})),Fa=za,Ba=za,Na=Ra;Fa.murmur3=Ba,Fa.murmur2=Na;var ja=function(){this.ids=[],this.positions=[],this.indexed=!1};ja.prototype.add=function(t,e,r,n){this.ids.push(Va(t)),this.positions.push(e,r,n)},ja.prototype.getPositions=function(t){for(var e=Va(t),r=0,n=this.ids.length-1;r>1;this.ids[i]>=e?n=i:r=i+1}for(var a=[];this.ids[r]===e;){var o=this.positions[3*r],s=this.positions[3*r+1],l=this.positions[3*r+2];a.push({index:o,start:s,end:l}),r++}return a},ja.serialize=function(t,e){var r=new Float64Array(t.ids),n=new Uint32Array(t.positions);return Ha(r,n,0,r.length-1),e&&e.push(r.buffer,n.buffer),{ids:r,positions:n}},ja.deserialize=function(t){var e=new ja;return e.ids=t.ids,e.positions=t.positions,e.indexed=!0,e};var Ua=Math.pow(2,53)-1;function Va(t){var e=+t;return!isNaN(e)&&e<=Ua?e:Fa(String(t))}function Ha(t,e,r,n){for(;r>1],a=r-1,o=n+1;;){do{a++}while(t[a]i);if(a>=o)break;qa(t,a,o),qa(e,3*a,3*o),qa(e,3*a+1,3*o+1),qa(e,3*a+2,3*o+2)}o-rho.max||o.yho.max)&&(w("Geometry exceeds allowed extent, reduce your vector tile buffer size"),o.x=u(o.x,ho.min,ho.max),o.y=u(o.y,ho.min,ho.max))}return r}function vo(t,e,r,n,i){t.emplaceBack(2*e+(n+1)/2,2*r+(i+1)/2)}var go=function(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((function(t){return t.id})),this.index=t.index,this.hasPattern=!1,this.layoutVertexArray=new Qi,this.indexArray=new fa,this.segments=new Oa,this.programConfigurations=new so(Pa,t.layers,t.zoom),this.stateDependentLayerIds=this.layers.filter((function(t){return t.isStateDependent()})).map((function(t){return t.id}))};function yo(t,e){for(var r=0;r1){if(_o(t,e))return!0;for(var n=0;n1?t.distSqr(r):t.distSqr(r.sub(e)._mult(i)._add(e))}function Ao(t,e){for(var r,n,i,a=!1,o=0;oe.y!=i.y>e.y&&e.x<(i.x-n.x)*(e.y-n.y)/(i.y-n.y)+n.x&&(a=!a);return a}function Mo(t,e){for(var r=!1,n=0,i=t.length-1;ne.y!=o.y>e.y&&e.x<(o.x-a.x)*(e.y-a.y)/(o.y-a.y)+a.x&&(r=!r)}return r}function So(t,e,r){var n=r[0],i=r[2];if(t.xi.x&&e.x>i.x||t.yi.y&&e.y>i.y)return!1;var a=T(t,e,r[0]);return a!==T(t,e,r[1])||a!==T(t,e,r[2])||a!==T(t,e,r[3])}function Eo(t,e,r){var n=e.paint.get(t).value;return"constant"===n.kind?n.value:r.programConfigurations.get(e.id).getMaxValue(t)}function Lo(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}function Co(t,e,r,n,i){if(!e[0]&&!e[1])return t;var o=a.convert(e)._mult(i);"viewport"===r&&o._rotate(-n);for(var s=[],l=0;l=co||c<0||c>=co)){var f=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray,t.sortKey),h=f.vertexLength;vo(this.layoutVertexArray,u,c,-1,-1),vo(this.layoutVertexArray,u,c,1,-1),vo(this.layoutVertexArray,u,c,1,1),vo(this.layoutVertexArray,u,c,-1,1),this.indexArray.emplaceBack(h,h+1,h+2),this.indexArray.emplaceBack(h,h+3,h+2),f.vertexLength+=4,f.primitiveLength+=2}}this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t,r,{},n)},ni("CircleBucket",go,{omit:["layers"]});var Po=new Gi({"circle-sort-key":new Ui(Dt.layout_circle["circle-sort-key"])}),Oo={paint:new Gi({"circle-radius":new Ui(Dt.paint_circle["circle-radius"]),"circle-color":new Ui(Dt.paint_circle["circle-color"]),"circle-blur":new Ui(Dt.paint_circle["circle-blur"]),"circle-opacity":new Ui(Dt.paint_circle["circle-opacity"]),"circle-translate":new ji(Dt.paint_circle["circle-translate"]),"circle-translate-anchor":new ji(Dt.paint_circle["circle-translate-anchor"]),"circle-pitch-scale":new ji(Dt.paint_circle["circle-pitch-scale"]),"circle-pitch-alignment":new ji(Dt.paint_circle["circle-pitch-alignment"]),"circle-stroke-width":new Ui(Dt.paint_circle["circle-stroke-width"]),"circle-stroke-color":new Ui(Dt.paint_circle["circle-stroke-color"]),"circle-stroke-opacity":new Ui(Dt.paint_circle["circle-stroke-opacity"])}),layout:Po},Io="undefined"!=typeof Float32Array?Float32Array:Array;function Do(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function zo(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3],s=e[4],l=e[5],u=e[6],c=e[7],f=e[8],h=e[9],p=e[10],d=e[11],v=e[12],g=e[13],y=e[14],m=e[15],x=r[0],b=r[1],_=r[2],w=r[3];return t[0]=x*n+b*s+_*f+w*v,t[1]=x*i+b*l+_*h+w*g,t[2]=x*a+b*u+_*p+w*y,t[3]=x*o+b*c+_*d+w*m,x=r[4],b=r[5],_=r[6],w=r[7],t[4]=x*n+b*s+_*f+w*v,t[5]=x*i+b*l+_*h+w*g,t[6]=x*a+b*u+_*p+w*y,t[7]=x*o+b*c+_*d+w*m,x=r[8],b=r[9],_=r[10],w=r[11],t[8]=x*n+b*s+_*f+w*v,t[9]=x*i+b*l+_*h+w*g,t[10]=x*a+b*u+_*p+w*y,t[11]=x*o+b*c+_*d+w*m,x=r[12],b=r[13],_=r[14],w=r[15],t[12]=x*n+b*s+_*f+w*v,t[13]=x*i+b*l+_*h+w*g,t[14]=x*a+b*u+_*p+w*y,t[15]=x*o+b*c+_*d+w*m,t}Math.hypot||(Math.hypot=function(){for(var t=arguments,e=0,r=arguments.length;r--;)e+=t[r]*t[r];return Math.sqrt(e)});var Ro=zo;var Fo,Bo=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t};function No(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3];return t[0]=r[0]*n+r[4]*i+r[8]*a+r[12]*o,t[1]=r[1]*n+r[5]*i+r[9]*a+r[13]*o,t[2]=r[2]*n+r[6]*i+r[10]*a+r[14]*o,t[3]=r[3]*n+r[7]*i+r[11]*a+r[15]*o,t}Fo=new Io(3),Io!=Float32Array&&(Fo[0]=0,Fo[1]=0,Fo[2]=0),function(){var t=new Io(4);Io!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[3]=0)}();var jo=function(t){var e=t[0],r=t[1];return e*e+r*r},Uo=(function(){var t=new Io(2);Io!=Float32Array&&(t[0]=0,t[1]=0)}(),function(t){function e(e){t.call(this,e,Oo)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.createBucket=function(t){return new go(t)},e.prototype.queryRadius=function(t){var e=t;return Eo("circle-radius",this,e)+Eo("circle-stroke-width",this,e)+Lo(this.paint.get("circle-translate"))},e.prototype.queryIntersectsFeature=function(t,e,r,n,i,a,o,s){for(var l=Co(t,this.paint.get("circle-translate"),this.paint.get("circle-translate-anchor"),a.angle,o),u=this.paint.get("circle-radius").evaluate(e,r)+this.paint.get("circle-stroke-width").evaluate(e,r),c="map"===this.paint.get("circle-pitch-alignment"),f=c?l:function(t,e){return t.map((function(t){return Vo(t,e)}))}(l,s),h=c?u*o:u,p=0,d=n;pt.width||i.height>t.height||r.x>t.width-i.width||r.y>t.height-i.height)throw new RangeError("out of range source coordinates for image copy");if(i.width>e.width||i.height>e.height||n.x>e.width-i.width||n.y>e.height-i.height)throw new RangeError("out of range destination coordinates for image copy");for(var o=t.data,s=e.data,l=0;l80*r){n=a=t[0],i=o=t[1];for(var d=r;da&&(a=s),l>o&&(o=l);u=0!==(u=Math.max(a-n,o-i))?1/u:0}return os(h,p,r,n,i,u),p}function is(t,e,r,n,i){var a,o;if(i===Es(t,e,r,n)>0)for(a=e;a=e;a-=n)o=As(a,t[a],t[a+1],o);return o&&xs(o,o.next)&&(Ms(o),o=o.next),o}function as(t,e){if(!t)return t;e||(e=t);var r,n=t;do{if(r=!1,n.steiner||!xs(n,n.next)&&0!==ms(n.prev,n,n.next))n=n.next;else{if(Ms(n),(n=e=n.prev)===n.next)break;r=!0}}while(r||n!==e);return e}function os(t,e,r,n,i,a,o){if(t){!o&&a&&function(t,e,r,n){var i=t;do{null===i.z&&(i.z=ds(i.x,i.y,e,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,function(t){var e,r,n,i,a,o,s,l,u=1;do{for(r=t,t=null,a=null,o=0;r;){for(o++,n=r,s=0,e=0;e0||l>0&&n;)0!==s&&(0===l||!n||r.z<=n.z)?(i=r,r=r.nextZ,s--):(i=n,n=n.nextZ,l--),a?a.nextZ=i:t=i,i.prevZ=a,a=i;r=n}a.nextZ=null,u*=2}while(o>1)}(i)}(t,n,i,a);for(var s,l,u=t;t.prev!==t.next;)if(s=t.prev,l=t.next,a?ls(t,n,i,a):ss(t))e.push(s.i/r),e.push(t.i/r),e.push(l.i/r),Ms(t),t=l.next,u=l.next;else if((t=l)===u){o?1===o?os(t=us(as(t),e,r),e,r,n,i,a,2):2===o&&cs(t,e,r,n,i,a):os(as(t),e,r,n,i,a,1);break}}}function ss(t){var e=t.prev,r=t,n=t.next;if(ms(e,r,n)>=0)return!1;for(var i=t.next.next;i!==t.prev;){if(gs(e.x,e.y,r.x,r.y,n.x,n.y,i.x,i.y)&&ms(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function ls(t,e,r,n){var i=t.prev,a=t,o=t.next;if(ms(i,a,o)>=0)return!1;for(var s=i.xa.x?i.x>o.x?i.x:o.x:a.x>o.x?a.x:o.x,c=i.y>a.y?i.y>o.y?i.y:o.y:a.y>o.y?a.y:o.y,f=ds(s,l,e,r,n),h=ds(u,c,e,r,n),p=t.prevZ,d=t.nextZ;p&&p.z>=f&&d&&d.z<=h;){if(p!==t.prev&&p!==t.next&&gs(i.x,i.y,a.x,a.y,o.x,o.y,p.x,p.y)&&ms(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,d!==t.prev&&d!==t.next&&gs(i.x,i.y,a.x,a.y,o.x,o.y,d.x,d.y)&&ms(d.prev,d,d.next)>=0)return!1;d=d.nextZ}for(;p&&p.z>=f;){if(p!==t.prev&&p!==t.next&&gs(i.x,i.y,a.x,a.y,o.x,o.y,p.x,p.y)&&ms(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;d&&d.z<=h;){if(d!==t.prev&&d!==t.next&&gs(i.x,i.y,a.x,a.y,o.x,o.y,d.x,d.y)&&ms(d.prev,d,d.next)>=0)return!1;d=d.nextZ}return!0}function us(t,e,r){var n=t;do{var i=n.prev,a=n.next.next;!xs(i,a)&&bs(i,n,n.next,a)&&Ts(i,a)&&Ts(a,i)&&(e.push(i.i/r),e.push(n.i/r),e.push(a.i/r),Ms(n),Ms(n.next),n=t=a),n=n.next}while(n!==t);return as(n)}function cs(t,e,r,n,i,a){var o=t;do{for(var s=o.next.next;s!==o.prev;){if(o.i!==s.i&&ys(o,s)){var l=ks(o,s);return o=as(o,o.next),l=as(l,l.next),os(o,e,r,n,i,a),void os(l,e,r,n,i,a)}s=s.next}o=o.next}while(o!==t)}function fs(t,e){return t.x-e.x}function hs(t,e){if(e=function(t,e){var r,n=e,i=t.x,a=t.y,o=-1/0;do{if(a<=n.y&&a>=n.next.y&&n.next.y!==n.y){var s=n.x+(a-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(s<=i&&s>o){if(o=s,s===i){if(a===n.y)return n;if(a===n.next.y)return n.next}r=n.x=n.x&&n.x>=c&&i!==n.x&&gs(ar.x||n.x===r.x&&ps(r,n)))&&(r=n,h=l)),n=n.next}while(n!==u);return r}(t,e)){var r=ks(e,t);as(e,e.next),as(r,r.next)}}function ps(t,e){return ms(t.prev,t,e.prev)<0&&ms(e.next,t,t.next)<0}function ds(t,e,r,n,i){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-r)*i)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*i)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function vs(t){var e=t,r=t;do{(e.x=0&&(t-o)*(n-s)-(r-o)*(e-s)>=0&&(r-o)*(a-s)-(i-o)*(n-s)>=0}function ys(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var r=t;do{if(r.i!==t.i&&r.next.i!==t.i&&r.i!==e.i&&r.next.i!==e.i&&bs(r,r.next,t,e))return!0;r=r.next}while(r!==t);return!1}(t,e)&&(Ts(t,e)&&Ts(e,t)&&function(t,e){var r=t,n=!1,i=(t.x+e.x)/2,a=(t.y+e.y)/2;do{r.y>a!=r.next.y>a&&r.next.y!==r.y&&i<(r.next.x-r.x)*(a-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next}while(r!==t);return n}(t,e)&&(ms(t.prev,t,e.prev)||ms(t,e.prev,e))||xs(t,e)&&ms(t.prev,t,t.next)>0&&ms(e.prev,e,e.next)>0)}function ms(t,e,r){return(e.y-t.y)*(r.x-e.x)-(e.x-t.x)*(r.y-e.y)}function xs(t,e){return t.x===e.x&&t.y===e.y}function bs(t,e,r,n){var i=ws(ms(t,e,r)),a=ws(ms(t,e,n)),o=ws(ms(r,n,t)),s=ws(ms(r,n,e));return i!==a&&o!==s||!(0!==i||!_s(t,r,e))||!(0!==a||!_s(t,n,e))||!(0!==o||!_s(r,t,n))||!(0!==s||!_s(r,e,n))}function _s(t,e,r){return e.x<=Math.max(t.x,r.x)&&e.x>=Math.min(t.x,r.x)&&e.y<=Math.max(t.y,r.y)&&e.y>=Math.min(t.y,r.y)}function ws(t){return t>0?1:t<0?-1:0}function Ts(t,e){return ms(t.prev,t,t.next)<0?ms(t,e,t.next)>=0&&ms(t,t.prev,e)>=0:ms(t,e,t.prev)<0||ms(t,t.next,e)<0}function ks(t,e){var r=new Ss(t.i,t.x,t.y),n=new Ss(e.i,e.x,e.y),i=t.next,a=e.prev;return t.next=e,e.prev=t,r.next=i,i.prev=r,n.next=r,r.prev=n,a.next=n,n.prev=a,n}function As(t,e,r,n){var i=new Ss(t,e,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function Ms(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function Ss(t,e,r){this.i=t,this.x=e,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function Es(t,e,r,n){for(var i=0,a=e,o=r-n;ar;){if(n-r>600){var a=n-r+1,o=e-r+1,s=Math.log(a),l=.5*Math.exp(2*s/3),u=.5*Math.sqrt(s*l*(a-l)/a)*(o-a/2<0?-1:1);Cs(t,e,Math.max(r,Math.floor(e-o*l/a+u)),Math.min(n,Math.floor(e+(a-o)*l/a+u)),i)}var c=t[e],f=r,h=n;for(Ps(t,r,e),i(t[n],c)>0&&Ps(t,r,n);f0;)h--}0===i(t[r],c)?Ps(t,r,h):Ps(t,++h,n),h<=e&&(r=h+1),e<=h&&(n=h-1)}}function Ps(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function Os(t,e){return te?1:0}function Is(t,e){var r=t.length;if(r<=1)return[t];for(var n,i,a=[],o=0;o1)for(var l=0;l0&&(n+=t[i-1].length,r.holes.push(n))}return r},es.default=rs;var Fs=function(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((function(t){return t.id})),this.index=t.index,this.hasPattern=!1,this.patternFeatures=[],this.layoutVertexArray=new Qi,this.indexArray=new fa,this.indexArray2=new ya,this.programConfigurations=new so(ts,t.layers,t.zoom),this.segments=new Oa,this.segments2=new Oa,this.stateDependentLayerIds=this.layers.filter((function(t){return t.isStateDependent()})).map((function(t){return t.id}))};Fs.prototype.populate=function(t,e,r){this.hasPattern=zs("fill",this.layers,e);for(var n=this.layers[0].layout.get("fill-sort-key"),i=[],a=0,o=t;a>3}if(i--,1===n||2===n)o+=t.readSVarint(),s+=t.readSVarint(),1===n&&(e&&l.push(e),e=[]),e.push(new a(o,s));else{if(7!==n)throw new Error("unknown command "+n);e&&e.push(e[0].clone())}}return e&&l.push(e),l},Hs.prototype.bbox=function(){var t=this._pbf;t.pos=this._geometry;for(var e=t.readVarint()+t.pos,r=1,n=0,i=0,a=0,o=1/0,s=-1/0,l=1/0,u=-1/0;t.pos>3}if(n--,1===r||2===r)(i+=t.readSVarint())s&&(s=i),(a+=t.readSVarint())u&&(u=a);else if(7!==r)throw new Error("unknown command "+r)}return[o,l,s,u]},Hs.prototype.toGeoJSON=function(t,e,r){var n,i,a=this.extent*Math.pow(2,r),o=this.extent*t,s=this.extent*e,l=this.loadGeometry(),u=Hs.types[this.type];function c(t){for(var e=0;e>3;e=1===n?t.readString():2===n?t.readFloat():3===n?t.readDouble():4===n?t.readVarint64():5===n?t.readVarint():6===n?t.readSVarint():7===n?t.readBoolean():null}return e}(r))}function Xs(t,e,r){if(3===t){var n=new Zs(r,r.readVarint()+r.pos);n.length&&(e[n.name]=n)}}Ys.prototype.feature=function(t){if(t<0||t>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[t];var e=this._pbf.readVarint()+this._pbf.pos;return new Vs(this._pbf,e,this.extent,this._keys,this._values)};var Js={VectorTile:function(t,e){this.layers=t.readFields(Xs,{},e)},VectorTileFeature:Vs,VectorTileLayer:Zs},Ks=Js.VectorTileFeature.types,$s=Math.pow(2,13);function Qs(t,e,r,n,i,a,o,s){t.emplaceBack(e,r,2*Math.floor(n*$s)+o,i*$s*2,a*$s*2,Math.round(s))}var tl=function(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map((function(t){return t.id})),this.index=t.index,this.hasPattern=!1,this.layoutVertexArray=new ea,this.indexArray=new fa,this.programConfigurations=new so(Us,t.layers,t.zoom),this.segments=new Oa,this.stateDependentLayerIds=this.layers.filter((function(t){return t.isStateDependent()})).map((function(t){return t.id}))};function el(t,e){return t.x===e.x&&(t.x<0||t.x>co)||t.y===e.y&&(t.y<0||t.y>co)}tl.prototype.populate=function(t,e,r){this.features=[],this.hasPattern=zs("fill-extrusion",this.layers,e);for(var n=0,i=t;nco}))||O.every((function(t){return t.y<0}))||O.every((function(t){return t.y>co}))))for(var v=0,g=0;g=1){var m=d[g-1];if(!el(y,m)){f.vertexLength+4>Oa.MAX_VERTEX_ARRAY_LENGTH&&(f=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray));var x=y.sub(m)._perp()._unit(),b=m.dist(y);v+b>32768&&(v=0),Qs(this.layoutVertexArray,y.x,y.y,x.x,x.y,0,0,v),Qs(this.layoutVertexArray,y.x,y.y,x.x,x.y,0,1,v),v+=b,Qs(this.layoutVertexArray,m.x,m.y,x.x,x.y,0,0,v),Qs(this.layoutVertexArray,m.x,m.y,x.x,x.y,0,1,v);var _=f.vertexLength;this.indexArray.emplaceBack(_,_+2,_+1),this.indexArray.emplaceBack(_+1,_+2,_+3),f.vertexLength+=4,f.primitiveLength+=2}}}}if(f.vertexLength+l>Oa.MAX_VERTEX_ARRAY_LENGTH&&(f=this.segments.prepareSegment(l,this.layoutVertexArray,this.indexArray)),"Polygon"===Ks[t.type]){for(var w=[],T=[],k=f.vertexLength,A=0,M=s;A=2&&t[l-1].equals(t[l-2]);)l--;for(var u=0;u0;if(T&&y>u){var A=c.dist(p);if(A>2*f){var M=c.sub(c.sub(p)._mult(f/A)._round());this.updateDistance(p,M),this.addCurrentVertex(M,v,0,0,h),p=M}}var S=p&&d,E=S?r:s?"butt":n;if(S&&"round"===E&&(_i&&(E="bevel"),"bevel"===E&&(_>2&&(E="flipbevel"),_100)m=g.mult(-1);else{var L=_*v.add(g).mag()/v.sub(g).mag();m._perp()._mult(L*(k?-1:1))}this.addCurrentVertex(c,m,0,0,h),this.addCurrentVertex(c,m.mult(-1),0,0,h)}else if("bevel"===E||"fakeround"===E){var C=-Math.sqrt(_*_-1),P=k?C:0,O=k?0:C;if(p&&this.addCurrentVertex(c,v,P,O,h),"fakeround"===E)for(var I=Math.round(180*w/Math.PI/20),D=1;D2*f){var j=c.add(d.sub(c)._mult(f/N)._round());this.updateDistance(c,j),this.addCurrentVertex(j,g,0,0,h),c=j}}}}},cl.prototype.addCurrentVertex=function(t,e,r,n,i,a){void 0===a&&(a=!1);var o=e.x+e.y*r,s=e.y-e.x*r,l=-e.x+e.y*n,u=-e.y-e.x*n;this.addHalfVertex(t,o,s,a,!1,r,i),this.addHalfVertex(t,l,u,a,!0,-n,i),this.distance>ul/2&&0===this.totalDistance&&(this.distance=0,this.addCurrentVertex(t,e,r,n,i,a))},cl.prototype.addHalfVertex=function(t,e,r,n,i,a,o){var s=t.x,l=t.y,u=.5*this.scaledDistance;this.layoutVertexArray.emplaceBack((s<<1)+(n?1:0),(l<<1)+(i?1:0),Math.round(63*e)+128,Math.round(63*r)+128,1+(0===a?0:a<0?-1:1)|(63&u)<<2,u>>6);var c=o.vertexLength++;this.e1>=0&&this.e2>=0&&(this.indexArray.emplaceBack(this.e1,this.e2,c),o.primitiveLength++),i?this.e2=c:this.e1=c},cl.prototype.updateScaledDistance=function(){this.scaledDistance=this.totalDistance>0?(this.clipStart+(this.clipEnd-this.clipStart)*this.distance/this.totalDistance)*(ul-1):this.distance},cl.prototype.updateDistance=function(t,e){this.distance+=t.dist(e),this.updateScaledDistance()},ni("LineBucket",cl,{omit:["layers","patternFeatures"]});var fl=new Gi({"line-cap":new ji(Dt.layout_line["line-cap"]),"line-join":new Ui(Dt.layout_line["line-join"]),"line-miter-limit":new ji(Dt.layout_line["line-miter-limit"]),"line-round-limit":new ji(Dt.layout_line["line-round-limit"]),"line-sort-key":new Ui(Dt.layout_line["line-sort-key"])}),hl={paint:new Gi({"line-opacity":new Ui(Dt.paint_line["line-opacity"]),"line-color":new Ui(Dt.paint_line["line-color"]),"line-translate":new ji(Dt.paint_line["line-translate"]),"line-translate-anchor":new ji(Dt.paint_line["line-translate-anchor"]),"line-width":new Ui(Dt.paint_line["line-width"]),"line-gap-width":new Ui(Dt.paint_line["line-gap-width"]),"line-offset":new Ui(Dt.paint_line["line-offset"]),"line-blur":new Ui(Dt.paint_line["line-blur"]),"line-dasharray":new Hi(Dt.paint_line["line-dasharray"]),"line-pattern":new Vi(Dt.paint_line["line-pattern"]),"line-gradient":new qi(Dt.paint_line["line-gradient"])}),layout:fl},pl=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.possiblyEvaluate=function(e,r){return r=new Pi(Math.floor(r.zoom),{now:r.now,fadeDuration:r.fadeDuration,zoomHistory:r.zoomHistory,transition:r.transition}),t.prototype.possiblyEvaluate.call(this,e,r)},e.prototype.evaluate=function(e,r,n,i){return r=f({},r,{zoom:Math.floor(r.zoom)}),t.prototype.evaluate.call(this,e,r,n,i)},e}(Ui),dl=new pl(hl.paint.properties["line-width"].specification);dl.useIntegerZoom=!0;var vl=function(t){function e(e){t.call(this,e,hl)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._handleSpecialPaintPropertyUpdate=function(t){"line-gradient"===t&&this._updateGradient()},e.prototype._updateGradient=function(){var t=this._transitionablePaint._values["line-gradient"].value.expression;this.gradient=Jo(t,"lineProgress"),this.gradientTexture=null},e.prototype.recalculate=function(e,r){t.prototype.recalculate.call(this,e,r),this.paint._values["line-floorwidth"]=dl.possiblyEvaluate(this._transitioningPaint._values["line-width"].value,e)},e.prototype.createBucket=function(t){return new cl(t)},e.prototype.queryRadius=function(t){var e=t,r=gl(Eo("line-width",this,e),Eo("line-gap-width",this,e)),n=Eo("line-offset",this,e);return r/2+Math.abs(n)+Lo(this.paint.get("line-translate"))},e.prototype.queryIntersectsFeature=function(t,e,r,n,i,o,s){var l=Co(t,this.paint.get("line-translate"),this.paint.get("line-translate-anchor"),o.angle,s),u=s/2*gl(this.paint.get("line-width").evaluate(e,r),this.paint.get("line-gap-width").evaluate(e,r)),c=this.paint.get("line-offset").evaluate(e,r);return c&&(n=function(t,e){for(var r=[],n=new a(0,0),i=0;i=3)for(var a=0;a0?e+2*t:t}var yl=Ki([{name:"a_pos_offset",components:4,type:"Int16"},{name:"a_data",components:4,type:"Uint16"},{name:"a_pixeloffset",components:4,type:"Int16"}],4),ml=Ki([{name:"a_projected_pos",components:3,type:"Float32"}],4),xl=(Ki([{name:"a_fade_opacity",components:1,type:"Uint32"}],4),Ki([{name:"a_placed",components:2,type:"Uint8"},{name:"a_shift",components:2,type:"Float32"}])),bl=(Ki([{type:"Int16",name:"anchorPointX"},{type:"Int16",name:"anchorPointY"},{type:"Int16",name:"x1"},{type:"Int16",name:"y1"},{type:"Int16",name:"x2"},{type:"Int16",name:"y2"},{type:"Uint32",name:"featureIndex"},{type:"Uint16",name:"sourceLayerIndex"},{type:"Uint16",name:"bucketIndex"}]),Ki([{name:"a_pos",components:2,type:"Int16"},{name:"a_anchor_pos",components:2,type:"Int16"},{name:"a_extrude",components:2,type:"Int16"}],4)),_l=Ki([{name:"a_pos",components:2,type:"Float32"},{name:"a_radius",components:1,type:"Float32"},{name:"a_flags",components:2,type:"Int16"}],4);function wl(t,e,r){return t.sections.forEach((function(t){t.text=function(t,e,r){var n=e.layout.get("text-transform").evaluate(r,{});return"uppercase"===n?t=t.toLocaleUpperCase():"lowercase"===n&&(t=t.toLocaleLowerCase()),Ci.applyArabicShaping&&(t=Ci.applyArabicShaping(t)),t}(t.text,e,r)})),t}Ki([{name:"triangle",components:3,type:"Uint16"}]),Ki([{type:"Int16",name:"anchorX"},{type:"Int16",name:"anchorY"},{type:"Uint16",name:"glyphStartIndex"},{type:"Uint16",name:"numGlyphs"},{type:"Uint32",name:"vertexStartIndex"},{type:"Uint32",name:"lineStartIndex"},{type:"Uint32",name:"lineLength"},{type:"Uint16",name:"segment"},{type:"Uint16",name:"lowerSize"},{type:"Uint16",name:"upperSize"},{type:"Float32",name:"lineOffsetX"},{type:"Float32",name:"lineOffsetY"},{type:"Uint8",name:"writingMode"},{type:"Uint8",name:"placedOrientation"},{type:"Uint8",name:"hidden"},{type:"Uint32",name:"crossTileID"},{type:"Int16",name:"associatedIconIndex"}]),Ki([{type:"Int16",name:"anchorX"},{type:"Int16",name:"anchorY"},{type:"Int16",name:"rightJustifiedTextSymbolIndex"},{type:"Int16",name:"centerJustifiedTextSymbolIndex"},{type:"Int16",name:"leftJustifiedTextSymbolIndex"},{type:"Int16",name:"verticalPlacedTextSymbolIndex"},{type:"Int16",name:"placedIconSymbolIndex"},{type:"Int16",name:"verticalPlacedIconSymbolIndex"},{type:"Uint16",name:"key"},{type:"Uint16",name:"textBoxStartIndex"},{type:"Uint16",name:"textBoxEndIndex"},{type:"Uint16",name:"verticalTextBoxStartIndex"},{type:"Uint16",name:"verticalTextBoxEndIndex"},{type:"Uint16",name:"iconBoxStartIndex"},{type:"Uint16",name:"iconBoxEndIndex"},{type:"Uint16",name:"verticalIconBoxStartIndex"},{type:"Uint16",name:"verticalIconBoxEndIndex"},{type:"Uint16",name:"featureIndex"},{type:"Uint16",name:"numHorizontalGlyphVertices"},{type:"Uint16",name:"numVerticalGlyphVertices"},{type:"Uint16",name:"numIconVertices"},{type:"Uint16",name:"numVerticalIconVertices"},{type:"Uint16",name:"useRuntimeCollisionCircles"},{type:"Uint32",name:"crossTileID"},{type:"Float32",name:"textBoxScale"},{type:"Float32",components:2,name:"textOffset"},{type:"Float32",name:"collisionCircleDiameter"}]),Ki([{type:"Float32",name:"offsetX"}]),Ki([{type:"Int16",name:"x"},{type:"Int16",name:"y"},{type:"Int16",name:"tileUnitDistanceFromAnchor"}]);var Tl={"!":"︕","#":"#",$:"$","%":"%","&":"&","(":"︵",")":"︶","*":"*","+":"+",",":"︐","-":"︲",".":"・","/":"/",":":"︓",";":"︔","<":"︿","=":"=",">":"﹀","?":"︖","@":"@","[":"﹇","\\":"\","]":"﹈","^":"^",_:"︳","`":"`","{":"︷","|":"―","}":"︸","~":"~","¢":"¢","£":"£","¥":"¥","¦":"¦","¬":"¬","¯":" ̄","–":"︲","—":"︱","‘":"﹃","’":"﹄","“":"﹁","”":"﹂","…":"︙","‧":"・","₩":"₩","、":"︑","。":"︒","〈":"︿","〉":"﹀","《":"︽","》":"︾","「":"﹁","」":"﹂","『":"﹃","』":"﹄","【":"︻","】":"︼","〔":"︹","〕":"︺","〖":"︗","〗":"︘","!":"︕","(":"︵",")":"︶",",":"︐","-":"︲",".":"・",":":"︓",";":"︔","<":"︿",">":"﹀","?":"︖","[":"﹇","]":"﹈","_":"︳","{":"︷","|":"―","}":"︸","⦅":"︵","⦆":"︶","。":"︒","「":"﹁","」":"﹂"};var kl=24,Al=function(t,e,r,n,i){var a,o,s=8*i-n-1,l=(1<>1,c=-7,f=r?i-1:0,h=r?-1:1,p=t[e+f];for(f+=h,a=p&(1<<-c)-1,p>>=-c,c+=s;c>0;a=256*a+t[e+f],f+=h,c-=8);for(o=a&(1<<-c)-1,a>>=-c,c+=n;c>0;o=256*o+t[e+f],f+=h,c-=8);if(0===a)a=1-u;else{if(a===l)return o?NaN:1/0*(p?-1:1);o+=Math.pow(2,n),a-=u}return(p?-1:1)*o*Math.pow(2,a-n)},Ml=function(t,e,r,n,i,a){var o,s,l,u=8*a-i-1,c=(1<>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:a-1,d=n?1:-1,v=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,o=c):(o=Math.floor(Math.log(e)/Math.LN2),e*(l=Math.pow(2,-o))<1&&(o--,l*=2),(e+=o+f>=1?h/l:h*Math.pow(2,1-f))*l>=2&&(o++,l/=2),o+f>=c?(s=0,o=c):o+f>=1?(s=(e*l-1)*Math.pow(2,i),o+=f):(s=e*Math.pow(2,f-1)*Math.pow(2,i),o=0));i>=8;t[r+p]=255&s,p+=d,s/=256,i-=8);for(o=o<0;t[r+p]=255&o,p+=d,o/=256,u-=8);t[r+p-d]|=128*v},Sl=El;function El(t){this.buf=ArrayBuffer.isView&&ArrayBuffer.isView(t)?t:new Uint8Array(t||0),this.pos=0,this.type=0,this.length=this.buf.length}El.Varint=0,El.Fixed64=1,El.Bytes=2,El.Fixed32=5;var Ll=4294967296,Cl=1/Ll,Pl="undefined"==typeof TextDecoder?null:new TextDecoder("utf8");function Ol(t){return t.type===El.Bytes?t.readVarint()+t.pos:t.pos+1}function Il(t,e,r){return r?4294967296*e+(t>>>0):4294967296*(e>>>0)+(t>>>0)}function Dl(t,e,r){var n=e<=16383?1:e<=2097151?2:e<=268435455?3:Math.floor(Math.log(e)/(7*Math.LN2));r.realloc(n);for(var i=r.pos-1;i>=t;i--)r.buf[i+n]=r.buf[i]}function zl(t,e){for(var r=0;r>>8,t[r+2]=e>>>16,t[r+3]=e>>>24}function Zl(t,e){return(t[e]|t[e+1]<<8|t[e+2]<<16)+(t[e+3]<<24)}El.prototype={destroy:function(){this.buf=null},readFields:function(t,e,r){for(r=r||this.length;this.pos>3,a=this.pos;this.type=7&n,t(i,e,this),this.pos===a&&this.skip(n)}return e},readMessage:function(t,e){return this.readFields(t,e,this.readVarint()+this.pos)},readFixed32:function(){var t=ql(this.buf,this.pos);return this.pos+=4,t},readSFixed32:function(){var t=Zl(this.buf,this.pos);return this.pos+=4,t},readFixed64:function(){var t=ql(this.buf,this.pos)+ql(this.buf,this.pos+4)*Ll;return this.pos+=8,t},readSFixed64:function(){var t=ql(this.buf,this.pos)+Zl(this.buf,this.pos+4)*Ll;return this.pos+=8,t},readFloat:function(){var t=Al(this.buf,this.pos,!0,23,4);return this.pos+=4,t},readDouble:function(){var t=Al(this.buf,this.pos,!0,52,8);return this.pos+=8,t},readVarint:function(t){var e,r,n=this.buf;return e=127&(r=n[this.pos++]),r<128?e:(e|=(127&(r=n[this.pos++]))<<7,r<128?e:(e|=(127&(r=n[this.pos++]))<<14,r<128?e:(e|=(127&(r=n[this.pos++]))<<21,r<128?e:function(t,e,r){var n,i,a=r.buf;if(n=(112&(i=a[r.pos++]))>>4,i<128)return Il(t,n,e);if(n|=(127&(i=a[r.pos++]))<<3,i<128)return Il(t,n,e);if(n|=(127&(i=a[r.pos++]))<<10,i<128)return Il(t,n,e);if(n|=(127&(i=a[r.pos++]))<<17,i<128)return Il(t,n,e);if(n|=(127&(i=a[r.pos++]))<<24,i<128)return Il(t,n,e);if(n|=(1&(i=a[r.pos++]))<<31,i<128)return Il(t,n,e);throw new Error("Expected varint not more than 10 bytes")}(e|=(15&(r=n[this.pos]))<<28,t,this))))},readVarint64:function(){return this.readVarint(!0)},readSVarint:function(){var t=this.readVarint();return t%2==1?(t+1)/-2:t/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var t=this.readVarint()+this.pos,e=this.pos;return this.pos=t,t-e>=12&&Pl?function(t,e,r){return Pl.decode(t.subarray(e,r))}(this.buf,e,t):function(t,e,r){for(var n="",i=e;i239?4:l>223?3:l>191?2:1;if(i+c>r)break;1===c?l<128&&(u=l):2===c?128==(192&(a=t[i+1]))&&(u=(31&l)<<6|63&a)<=127&&(u=null):3===c?(a=t[i+1],o=t[i+2],128==(192&a)&&128==(192&o)&&((u=(15&l)<<12|(63&a)<<6|63&o)<=2047||u>=55296&&u<=57343)&&(u=null)):4===c&&(a=t[i+1],o=t[i+2],s=t[i+3],128==(192&a)&&128==(192&o)&&128==(192&s)&&((u=(15&l)<<18|(63&a)<<12|(63&o)<<6|63&s)<=65535||u>=1114112)&&(u=null)),null===u?(u=65533,c=1):u>65535&&(u-=65536,n+=String.fromCharCode(u>>>10&1023|55296),u=56320|1023&u),n+=String.fromCharCode(u),i+=c}return n}(this.buf,e,t)},readBytes:function(){var t=this.readVarint()+this.pos,e=this.buf.subarray(this.pos,t);return this.pos=t,e},readPackedVarint:function(t,e){if(this.type!==El.Bytes)return t.push(this.readVarint(e));var r=Ol(this);for(t=t||[];this.pos127;);else if(e===El.Bytes)this.pos=this.readVarint()+this.pos;else if(e===El.Fixed32)this.pos+=4;else{if(e!==El.Fixed64)throw new Error("Unimplemented type: "+e);this.pos+=8}},writeTag:function(t,e){this.writeVarint(t<<3|e)},realloc:function(t){for(var e=this.length||16;e268435455||t<0?function(t,e){var r,n;if(t>=0?(r=t%4294967296|0,n=t/4294967296|0):(n=~(-t/4294967296),4294967295^(r=~(-t%4294967296))?r=r+1|0:(r=0,n=n+1|0)),t>=0x10000000000000000||t<-0x10000000000000000)throw new Error("Given varint doesn't fit into 10 bytes");e.realloc(10),function(t,e,r){r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos]=127&t}(r,0,e),function(t,e){var r=(7&t)<<4;e.buf[e.pos++]|=r|((t>>>=3)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t)))))}(n,e)}(t,this):(this.realloc(4),this.buf[this.pos++]=127&t|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=t>>>7&127))))},writeSVarint:function(t){this.writeVarint(t<0?2*-t-1:2*t)},writeBoolean:function(t){this.writeVarint(Boolean(t))},writeString:function(t){t=String(t),this.realloc(4*t.length),this.pos++;var e=this.pos;this.pos=function(t,e,r){for(var n,i,a=0;a55295&&n<57344){if(!i){n>56319||a+1===e.length?(t[r++]=239,t[r++]=191,t[r++]=189):i=n;continue}if(n<56320){t[r++]=239,t[r++]=191,t[r++]=189,i=n;continue}n=i-55296<<10|n-56320|65536,i=null}else i&&(t[r++]=239,t[r++]=191,t[r++]=189,i=null);n<128?t[r++]=n:(n<2048?t[r++]=n>>6|192:(n<65536?t[r++]=n>>12|224:(t[r++]=n>>18|240,t[r++]=n>>12&63|128),t[r++]=n>>6&63|128),t[r++]=63&n|128)}return r}(this.buf,t,this.pos);var r=this.pos-e;r>=128&&Dl(e,r,this),this.pos=e-1,this.writeVarint(r),this.pos+=r},writeFloat:function(t){this.realloc(4),Ml(this.buf,t,this.pos,!0,23,4),this.pos+=4},writeDouble:function(t){this.realloc(8),Ml(this.buf,t,this.pos,!0,52,8),this.pos+=8},writeBytes:function(t){var e=t.length;this.writeVarint(e),this.realloc(e);for(var r=0;r=128&&Dl(r,n,this),this.pos=r-1,this.writeVarint(n),this.pos+=n},writeMessage:function(t,e,r){this.writeTag(t,El.Bytes),this.writeRawMessage(e,r)},writePackedVarint:function(t,e){e.length&&this.writeMessage(t,zl,e)},writePackedSVarint:function(t,e){e.length&&this.writeMessage(t,Rl,e)},writePackedBoolean:function(t,e){e.length&&this.writeMessage(t,Nl,e)},writePackedFloat:function(t,e){e.length&&this.writeMessage(t,Fl,e)},writePackedDouble:function(t,e){e.length&&this.writeMessage(t,Bl,e)},writePackedFixed32:function(t,e){e.length&&this.writeMessage(t,jl,e)},writePackedSFixed32:function(t,e){e.length&&this.writeMessage(t,Ul,e)},writePackedFixed64:function(t,e){e.length&&this.writeMessage(t,Vl,e)},writePackedSFixed64:function(t,e){e.length&&this.writeMessage(t,Hl,e)},writeBytesField:function(t,e){this.writeTag(t,El.Bytes),this.writeBytes(e)},writeFixed32Field:function(t,e){this.writeTag(t,El.Fixed32),this.writeFixed32(e)},writeSFixed32Field:function(t,e){this.writeTag(t,El.Fixed32),this.writeSFixed32(e)},writeFixed64Field:function(t,e){this.writeTag(t,El.Fixed64),this.writeFixed64(e)},writeSFixed64Field:function(t,e){this.writeTag(t,El.Fixed64),this.writeSFixed64(e)},writeVarintField:function(t,e){this.writeTag(t,El.Varint),this.writeVarint(e)},writeSVarintField:function(t,e){this.writeTag(t,El.Varint),this.writeSVarint(e)},writeStringField:function(t,e){this.writeTag(t,El.Bytes),this.writeString(e)},writeFloatField:function(t,e){this.writeTag(t,El.Fixed32),this.writeFloat(e)},writeDoubleField:function(t,e){this.writeTag(t,El.Fixed64),this.writeDouble(e)},writeBooleanField:function(t,e){this.writeVarintField(t,Boolean(e))}};var Yl=3;function Wl(t,e,r){1===t&&r.readMessage(Xl,e)}function Xl(t,e,r){if(3===t){var n=r.readMessage(Jl,{}),i=n.id,a=n.bitmap,o=n.width,s=n.height,l=n.left,u=n.top,c=n.advance;e.push({id:i,bitmap:new Yo({width:o+2*Yl,height:s+2*Yl},a),metrics:{width:o,height:s,left:l,top:u,advance:c}})}}function Jl(t,e,r){1===t?e.id=r.readVarint():2===t?e.bitmap=r.readBytes():3===t?e.width=r.readVarint():4===t?e.height=r.readVarint():5===t?e.left=r.readSVarint():6===t?e.top=r.readSVarint():7===t&&(e.advance=r.readVarint())}var Kl=Yl;function $l(t){for(var e=0,r=0,n=0,i=t;n=0;h--){var p=o[h];if(!(f.w>p.w||f.h>p.h)){if(f.x=p.x,f.y=p.y,l=Math.max(l,f.y+f.h),s=Math.max(s,f.x+f.w),f.w===p.w&&f.h===p.h){var d=o.pop();h0&&B>A&&(A=B)}else{var N=r[S.fontStack],j=N&&N[L];if(j&&j.rect)O=j.rect,P=j.metrics;else{var U=e[S.fontStack],V=U&&U[L];if(!V)continue;P=V.metrics}C=(_-S.scale)*kl}z?(t.verticalizable=!0,k.push({glyph:L,imageName:I,x:h,y:p+C,vertical:z,scale:S.scale,fontStack:S.fontStack,sectionIndex:E,metrics:P,rect:O}),h+=D*S.scale+u):(k.push({glyph:L,imageName:I,x:h,y:p+C,vertical:z,scale:S.scale,fontStack:S.fontStack,sectionIndex:E,metrics:P,rect:O}),h+=P.advance*S.scale+u)}if(0!==k.length){var H=h-u;d=Math.max(H,d),yu(k,0,k.length-1,g,A)}h=0;var q=a*_+A;T.lineOffset=Math.max(A,w),p+=q,v=Math.max(q,v),++y}else p+=a,++y}var G=p-iu,Z=gu(o),Y=Z.horizontalAlign,W=Z.verticalAlign;(function(t,e,r,n,i,a,o,s,l){var u=(e-r)*i,c=0;c=a!==o?-s*n-iu:(-n*l+.5)*o;for(var f=0,h=t;f=0&&n>=t&&lu[this.text.charCodeAt(n)];n--)r--;this.text=this.text.substring(t,r),this.sectionIndex=this.sectionIndex.slice(t,r)},ou.prototype.substring=function(t,e){var r=new ou;return r.text=this.text.substring(t,e),r.sectionIndex=this.sectionIndex.slice(t,e),r.sections=this.sections,r},ou.prototype.toString=function(){return this.text},ou.prototype.getMaxScale=function(){var t=this;return this.sectionIndex.reduce((function(e,r){return Math.max(e,t.sections[r].scale)}),0)},ou.prototype.addTextSection=function(t,e){this.text+=t.text,this.sections.push(au.forText(t.scale,t.fontStack||e));for(var r=this.sections.length-1,n=0;n=63743?null:++this.imageSectionID:(this.imageSectionID=57344,this.imageSectionID)};var lu={9:!0,10:!0,11:!0,12:!0,13:!0,32:!0},uu={};function cu(t,e,r,n,i,a){if(e.imageName){var o=n[e.imageName];return o?o.displaySize[0]*e.scale*kl/a+i:0}var s=r[e.fontStack],l=s&&s[t];return l?l.metrics.advance*e.scale+i:0}function fu(t,e,r,n){var i=Math.pow(t-e,2);return n?t=0,c=0,f=0;f-r/2;){if(--o<0)return!1;s-=t[o].dist(a),a=t[o]}s+=t[o].dist(t[o+1]),o++;for(var l=[],u=0;sn;)u-=l.shift().angleDelta;if(u>i)return!1;o++,s+=f.dist(h)}return!0}function Mu(t){for(var e=0,r=0;ru){var d=(u-l)/p,v=$e(f.x,h.x,d),g=$e(f.y,h.y,d),y=new xu(v,g,h.angleTo(f),c);return y._round(),!o||Au(t,y,s,o,e)?y:void 0}l+=p}}function Cu(t,e,r,n,i,a,o,s,l){var u=Su(n,a,o),c=Eu(n,i),f=c*o,h=0===t[0].x||t[0].x===l||0===t[0].y||t[0].y===l;return e-f=0&&b=0&&_=0&&h+u<=c){var w=new xu(b,_,m,d);w._round(),n&&!Au(t,w,a,n,i)||p.push(w)}}f+=y}return s||p.length||o||(p=Pu(t,f/2,r,n,i,a,o,!0,l)),p}function Ou(t,e,r,n,i){for(var o=[],s=0;s=n&&h.x>=n||(f.x>=n?f=new a(n,f.y+(h.y-f.y)*((n-f.x)/(h.x-f.x)))._round():h.x>=n&&(h=new a(n,f.y+(h.y-f.y)*((n-f.x)/(h.x-f.x)))._round()),f.y>=i&&h.y>=i||(f.y>=i?f=new a(f.x+(h.x-f.x)*((i-f.y)/(h.y-f.y)),i)._round():h.y>=i&&(h=new a(f.x+(h.x-f.x)*((i-f.y)/(h.y-f.y)),i)._round()),u&&f.equals(u[u.length-1])||(u=[f],o.push(u)),u.push(h)))))}return o}var Iu=Ql;function Du(t,e,r,n){var i=[],o=t.image,s=o.pixelRatio,l=o.paddedRect.w-2*Iu,u=o.paddedRect.h-2*Iu,c=t.right-t.left,f=t.bottom-t.top,h=o.stretchX||[[0,l]],p=o.stretchY||[[0,u]],d=function(t,e){return t+e[1]-e[0]},v=h.reduce(d,0),g=p.reduce(d,0),y=l-v,m=u-g,x=0,b=v,_=0,w=g,T=0,k=y,A=0,M=m;if(o.content&&n){var S=o.content;x=zu(h,0,S[0]),_=zu(p,0,S[1]),b=zu(h,S[0],S[2]),w=zu(p,S[1],S[3]),T=S[0]-x,A=S[1]-_,k=S[2]-S[0]-b,M=S[3]-S[1]-w}var E=function(n,i,l,u){var h=Fu(n.stretch-x,b,c,t.left),p=Bu(n.fixed-T,k,n.stretch,v),d=Fu(i.stretch-_,w,f,t.top),y=Bu(i.fixed-A,M,i.stretch,g),m=Fu(l.stretch-x,b,c,t.left),S=Bu(l.fixed-T,k,l.stretch,v),E=Fu(u.stretch-_,w,f,t.top),L=Bu(u.fixed-A,M,u.stretch,g),C=new a(h,d),P=new a(m,d),O=new a(m,E),I=new a(h,E),D=new a(p/s,y/s),z=new a(S/s,L/s),R=e*Math.PI/180;if(R){var F=Math.sin(R),B=Math.cos(R),N=[B,-F,F,B];C._matMult(N),P._matMult(N),I._matMult(N),O._matMult(N)}var j=n.stretch+n.fixed,U=l.stretch+l.fixed,V=i.stretch+i.fixed,H=u.stretch+u.fixed;return{tl:C,tr:P,bl:I,br:O,tex:{x:o.paddedRect.x+Iu+j,y:o.paddedRect.y+Iu+V,w:U-j,h:H-V},writingMode:void 0,glyphOffset:[0,0],sectionIndex:0,pixelOffsetTL:D,pixelOffsetBR:z,minFontScaleX:k/s/c,minFontScaleY:M/s/f,isSDF:r}};if(n&&(o.stretchX||o.stretchY))for(var L=Ru(h,y,v),C=Ru(p,m,g),P=0;P0&&(d=Math.max(10,d),this.circleDiameter=d)}else{var v=o.top*s-l,g=o.bottom*s+l,y=o.left*s-l,m=o.right*s+l,x=o.collisionPadding;if(x&&(y-=x[0]*s,v-=x[1]*s,m+=x[2]*s,g+=x[3]*s),c){var b=new a(y,v),_=new a(m,v),w=new a(y,g),T=new a(m,g),k=c*Math.PI/180;b._rotate(k),_._rotate(k),w._rotate(k),T._rotate(k),y=Math.min(b.x,_.x,w.x,T.x),m=Math.max(b.x,_.x,w.x,T.x),v=Math.min(b.y,_.y,w.y,T.y),g=Math.max(b.y,_.y,w.y,T.y)}t.emplaceBack(e.x,e.y,y,v,m,g,r,n,i)}this.boxEndIndex=t.length},ju=function(t,e){if(void 0===t&&(t=[]),void 0===e&&(e=Uu),this.data=t,this.length=this.data.length,this.compare=e,this.length>0)for(var r=(this.length>>1)-1;r>=0;r--)this._down(r)};function Uu(t,e){return te?1:0}function Vu(t,e,r){void 0===e&&(e=1),void 0===r&&(r=!1);for(var n=1/0,i=1/0,o=-1/0,s=-1/0,l=t[0],u=0;uo)&&(o=c.x),(!u||c.y>s)&&(s=c.y)}var f=o-n,h=s-i,p=Math.min(f,h),d=p/2,v=new ju([],Hu);if(0===p)return new a(n,i);for(var g=n;gm.d||!m.d)&&(m=b,r&&console.log("found best %d after %d probes",Math.round(1e4*b.d)/1e4,x)),b.max-m.d<=e||(d=b.h/2,v.push(new qu(b.p.x-d,b.p.y-d,d,t)),v.push(new qu(b.p.x+d,b.p.y-d,d,t)),v.push(new qu(b.p.x-d,b.p.y+d,d,t)),v.push(new qu(b.p.x+d,b.p.y+d,d,t)),x+=4)}return r&&(console.log("num probes: "+x),console.log("best distance: "+m.d)),m.p}function Hu(t,e){return e.max-t.max}function qu(t,e,r,n){this.p=new a(t,e),this.h=r,this.d=function(t,e){for(var r=!1,n=1/0,i=0;it.y!=c.y>t.y&&t.x<(c.x-u.x)*(t.y-u.y)/(c.y-u.y)+u.x&&(r=!r),n=Math.min(n,ko(t,u,c))}return(r?1:-1)*Math.sqrt(n)}(this.p,n),this.max=this.d+this.h*Math.SQRT2}ju.prototype.push=function(t){this.data.push(t),this.length++,this._up(this.length-1)},ju.prototype.pop=function(){if(0!==this.length){var t=this.data[0],e=this.data.pop();return this.length--,this.length>0&&(this.data[0]=e,this._down(0)),t}},ju.prototype.peek=function(){return this.data[0]},ju.prototype._up=function(t){for(var e=this.data,r=this.compare,n=e[t];t>0;){var i=t-1>>1,a=e[i];if(r(n,a)>=0)break;e[t]=a,t=i}e[t]=n},ju.prototype._down=function(t){for(var e=this.data,r=this.compare,n=this.length>>1,i=e[t];t=0)break;e[t]=o,t=a}e[t]=i};var Gu=7,Zu=Number.POSITIVE_INFINITY;function Yu(t,e){return e[1]!==Zu?function(t,e,r){var n=0,i=0;switch(e=Math.abs(e),r=Math.abs(r),t){case"top-right":case"top-left":case"top":i=r-Gu;break;case"bottom-right":case"bottom-left":case"bottom":i=-r+Gu}switch(t){case"top-right":case"bottom-right":case"right":n=-e;break;case"top-left":case"bottom-left":case"left":n=e}return[n,i]}(t,e[0],e[1]):function(t,e){var r=0,n=0;e<0&&(e=0);var i=e/Math.sqrt(2);switch(t){case"top-right":case"top-left":n=i-Gu;break;case"bottom-right":case"bottom-left":n=-i+Gu;break;case"bottom":n=-e+Gu;break;case"top":n=e-Gu}switch(t){case"top-right":case"bottom-right":r=-i;break;case"top-left":case"bottom-left":r=i;break;case"left":r=e;break;case"right":r=-e}return[r,n]}(t,e[0])}function Wu(t){switch(t){case"right":case"top-right":case"bottom-right":return"right";case"left":case"top-left":case"bottom-left":return"left"}return"center"}var Xu=255,Ju=Xu*bu;function Ku(t,e,r,n,i,o,s,l,u,c,f,h,p,d,v){var g=function(t,e,r,n,i,o,s,l){for(var u=n.layout.get("text-rotate").evaluate(o,{})*Math.PI/180,c=[],f=0,h=e.positionedLines;fJu&&w(t.layerIds[0]+': Value for "text-size" is >= '+Xu+'. Reduce your "text-size".'):"composite"===y.kind&&((m=[bu*d.compositeTextSizes[0].evaluate(s,{},v),bu*d.compositeTextSizes[1].evaluate(s,{},v)])[0]>Ju||m[1]>Ju)&&w(t.layerIds[0]+': Value for "text-size" is >= '+Xu+'. Reduce your "text-size".'),t.addSymbols(t.text,g,m,l,o,s,c,e,u.lineStartIndex,u.lineLength,p,v);for(var x=0,b=f;x=0;o--)if(n.dist(a[o])0)&&("constant"!==a.value.kind||a.value.value.length>0),u="constant"!==s.value.kind||!!s.value.value||Object.keys(s.parameters).length>0,c=i.get("symbol-sort-key");if(this.features=[],l||u){for(var f=e.iconDependencies,h=e.glyphDependencies,p=e.availableImages,d=new Pi(this.zoom),v=0,g=t;v=0;for(var I=0,D=k.sections;I=0;s--)a[s]={x:e[s].x,y:e[s].y,tileUnitDistanceFromAnchor:i},s>0&&(i+=e[s-1].dist(e[s]));for(var l=0;l0},sc.prototype.hasIconData=function(){return this.icon.segments.get().length>0},sc.prototype.hasDebugData=function(){return this.textCollisionBox&&this.iconCollisionBox},sc.prototype.hasTextCollisionBoxData=function(){return this.hasDebugData()&&this.textCollisionBox.segments.get().length>0},sc.prototype.hasIconCollisionBoxData=function(){return this.hasDebugData()&&this.iconCollisionBox.segments.get().length>0},sc.prototype.addIndicesForPlacedSymbol=function(t,e){for(var r=t.placedSymbolArray.get(e),n=r.vertexStartIndex+4*r.numGlyphs,i=r.vertexStartIndex;i1||this.icon.segments.get().length>1)){this.symbolInstanceIndexes=this.getSortedSymbolIndexes(t),this.sortedAngle=t,this.text.indexArray.clear(),this.icon.indexArray.clear(),this.featureSortOrder=[];for(var r=0,n=this.symbolInstanceIndexes;r=0&&n.indexOf(t)===r&&e.addIndicesForPlacedSymbol(e.text,t)})),a.verticalPlacedTextSymbolIndex>=0&&this.addIndicesForPlacedSymbol(this.text,a.verticalPlacedTextSymbolIndex),a.placedIconSymbolIndex>=0&&this.addIndicesForPlacedSymbol(this.icon,a.placedIconSymbolIndex),a.verticalPlacedIconSymbolIndex>=0&&this.addIndicesForPlacedSymbol(this.icon,a.verticalPlacedIconSymbolIndex)}this.text.indexBuffer&&this.text.indexBuffer.updateData(this.text.indexArray),this.icon.indexBuffer&&this.icon.indexBuffer.updateData(this.icon.indexArray)}},ni("SymbolBucket",sc,{omit:["layers","collisionBoxArray","features","compareText"]}),sc.MAX_GLYPHS=65535,sc.addDynamicAttributes=nc;var lc=new Gi({"symbol-placement":new ji(Dt.layout_symbol["symbol-placement"]),"symbol-spacing":new ji(Dt.layout_symbol["symbol-spacing"]),"symbol-avoid-edges":new ji(Dt.layout_symbol["symbol-avoid-edges"]),"symbol-sort-key":new Ui(Dt.layout_symbol["symbol-sort-key"]),"symbol-z-order":new ji(Dt.layout_symbol["symbol-z-order"]),"icon-allow-overlap":new ji(Dt.layout_symbol["icon-allow-overlap"]),"icon-ignore-placement":new ji(Dt.layout_symbol["icon-ignore-placement"]),"icon-optional":new ji(Dt.layout_symbol["icon-optional"]),"icon-rotation-alignment":new ji(Dt.layout_symbol["icon-rotation-alignment"]),"icon-size":new Ui(Dt.layout_symbol["icon-size"]),"icon-text-fit":new ji(Dt.layout_symbol["icon-text-fit"]),"icon-text-fit-padding":new ji(Dt.layout_symbol["icon-text-fit-padding"]),"icon-image":new Ui(Dt.layout_symbol["icon-image"]),"icon-rotate":new Ui(Dt.layout_symbol["icon-rotate"]),"icon-padding":new ji(Dt.layout_symbol["icon-padding"]),"icon-keep-upright":new ji(Dt.layout_symbol["icon-keep-upright"]),"icon-offset":new Ui(Dt.layout_symbol["icon-offset"]),"icon-anchor":new Ui(Dt.layout_symbol["icon-anchor"]),"icon-pitch-alignment":new ji(Dt.layout_symbol["icon-pitch-alignment"]),"text-pitch-alignment":new ji(Dt.layout_symbol["text-pitch-alignment"]),"text-rotation-alignment":new ji(Dt.layout_symbol["text-rotation-alignment"]),"text-field":new Ui(Dt.layout_symbol["text-field"]),"text-font":new Ui(Dt.layout_symbol["text-font"]),"text-size":new Ui(Dt.layout_symbol["text-size"]),"text-max-width":new Ui(Dt.layout_symbol["text-max-width"]),"text-line-height":new ji(Dt.layout_symbol["text-line-height"]),"text-letter-spacing":new Ui(Dt.layout_symbol["text-letter-spacing"]),"text-justify":new Ui(Dt.layout_symbol["text-justify"]),"text-radial-offset":new Ui(Dt.layout_symbol["text-radial-offset"]),"text-variable-anchor":new ji(Dt.layout_symbol["text-variable-anchor"]),"text-anchor":new Ui(Dt.layout_symbol["text-anchor"]),"text-max-angle":new ji(Dt.layout_symbol["text-max-angle"]),"text-writing-mode":new ji(Dt.layout_symbol["text-writing-mode"]),"text-rotate":new Ui(Dt.layout_symbol["text-rotate"]),"text-padding":new ji(Dt.layout_symbol["text-padding"]),"text-keep-upright":new ji(Dt.layout_symbol["text-keep-upright"]),"text-transform":new Ui(Dt.layout_symbol["text-transform"]),"text-offset":new Ui(Dt.layout_symbol["text-offset"]),"text-allow-overlap":new ji(Dt.layout_symbol["text-allow-overlap"]),"text-ignore-placement":new ji(Dt.layout_symbol["text-ignore-placement"]),"text-optional":new ji(Dt.layout_symbol["text-optional"])}),uc={paint:new Gi({"icon-opacity":new Ui(Dt.paint_symbol["icon-opacity"]),"icon-color":new Ui(Dt.paint_symbol["icon-color"]),"icon-halo-color":new Ui(Dt.paint_symbol["icon-halo-color"]),"icon-halo-width":new Ui(Dt.paint_symbol["icon-halo-width"]),"icon-halo-blur":new Ui(Dt.paint_symbol["icon-halo-blur"]),"icon-translate":new ji(Dt.paint_symbol["icon-translate"]),"icon-translate-anchor":new ji(Dt.paint_symbol["icon-translate-anchor"]),"text-opacity":new Ui(Dt.paint_symbol["text-opacity"]),"text-color":new Ui(Dt.paint_symbol["text-color"],{runtimeType:Zt,getOverride:function(t){return t.textColor},hasOverride:function(t){return!!t.textColor}}),"text-halo-color":new Ui(Dt.paint_symbol["text-halo-color"]),"text-halo-width":new Ui(Dt.paint_symbol["text-halo-width"]),"text-halo-blur":new Ui(Dt.paint_symbol["text-halo-blur"]),"text-translate":new ji(Dt.paint_symbol["text-translate"]),"text-translate-anchor":new ji(Dt.paint_symbol["text-translate-anchor"])}),layout:lc},cc=function(t){this.type=t.property.overrides?t.property.overrides.runtimeType:Vt,this.defaultValue=t};cc.prototype.evaluate=function(t){if(t.formattedSection){var e=this.defaultValue.property.overrides;if(e&&e.hasOverride(t.formattedSection))return e.getOverride(t.formattedSection)}return t.feature&&t.featureState?this.defaultValue.evaluate(t.feature,t.featureState):this.defaultValue.property.specification.default},cc.prototype.eachChild=function(t){this.defaultValue.isConstant()||t(this.defaultValue.value._styleExpression.expression)},cc.prototype.outputDefined=function(){return!1},cc.prototype.serialize=function(){return null},ni("FormatSectionOverride",cc,{omit:["defaultValue"]});var fc=function(t){function e(e){t.call(this,e,uc)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.recalculate=function(e,r){if(t.prototype.recalculate.call(this,e,r),"auto"===this.layout.get("icon-rotation-alignment")&&("point"!==this.layout.get("symbol-placement")?this.layout._values["icon-rotation-alignment"]="map":this.layout._values["icon-rotation-alignment"]="viewport"),"auto"===this.layout.get("text-rotation-alignment")&&("point"!==this.layout.get("symbol-placement")?this.layout._values["text-rotation-alignment"]="map":this.layout._values["text-rotation-alignment"]="viewport"),"auto"===this.layout.get("text-pitch-alignment")&&(this.layout._values["text-pitch-alignment"]=this.layout.get("text-rotation-alignment")),"auto"===this.layout.get("icon-pitch-alignment")&&(this.layout._values["icon-pitch-alignment"]=this.layout.get("icon-rotation-alignment")),"point"===this.layout.get("symbol-placement")){var n=this.layout.get("text-writing-mode");if(n){for(var i=[],a=0,o=n;a",targetMapId:n,sourceMapId:a.mapId})}}},Ac.prototype.receive=function(t){var e=t.data,r=e.id;if(r&&(!e.targetMapId||this.mapId===e.targetMapId))if(""===e.type){delete this.tasks[r];var n=this.cancelCallbacks[r];delete this.cancelCallbacks[r],n&&n()}else A()||e.mustQueue?(this.tasks[r]=e,this.taskQueue.push(r),this.invoker.trigger()):this.processTask(r,e)},Ac.prototype.process=function(){if(this.taskQueue.length){var t=this.taskQueue.shift(),e=this.tasks[t];delete this.tasks[t],this.taskQueue.length&&this.invoker.trigger(),e&&this.processTask(t,e)}},Ac.prototype.processTask=function(t,e){var r=this;if(""===e.type){var n=this.callbacks[t];delete this.callbacks[t],n&&(e.error?n(li(e.error)):n(null,li(e.data)))}else{var i=!1,a=E(this.globalScope)?void 0:[],o=e.hasCallback?function(e,n){i=!0,delete r.cancelCallbacks[t],r.target.postMessage({id:t,type:"",sourceMapId:r.mapId,error:e?si(e):null,data:si(n,a)},a)}:function(t){i=!0},s=null,l=li(e.data);if(this.parent[e.type])s=this.parent[e.type](e.sourceMapId,l,o);else if(this.parent.getWorkerSource){var u=e.type.split(".");s=this.parent.getWorkerSource(e.sourceMapId,u[0],l.source)[u[1]](l,o)}else o(new Error("Could not find function "+e.type));!i&&s&&s.cancel&&(this.cancelCallbacks[t]=s.cancel)}},Ac.prototype.remove=function(){this.invoker.remove(),this.target.removeEventListener("message",this.receive,!1)};var Sc=function(t,e){t&&(e?this.setSouthWest(t).setNorthEast(e):4===t.length?this.setSouthWest([t[0],t[1]]).setNorthEast([t[2],t[3]]):this.setSouthWest(t[0]).setNorthEast(t[1]))};Sc.prototype.setNorthEast=function(t){return this._ne=t instanceof Lc?new Lc(t.lng,t.lat):Lc.convert(t),this},Sc.prototype.setSouthWest=function(t){return this._sw=t instanceof Lc?new Lc(t.lng,t.lat):Lc.convert(t),this},Sc.prototype.extend=function(t){var e,r,n=this._sw,i=this._ne;if(t instanceof Lc)e=t,r=t;else{if(!(t instanceof Sc)){if(Array.isArray(t)){if(4===t.length||t.every(Array.isArray)){var a=t;return this.extend(Sc.convert(a))}var o=t;return this.extend(Lc.convert(o))}return this}if(e=t._sw,r=t._ne,!e||!r)return this}return n||i?(n.lng=Math.min(e.lng,n.lng),n.lat=Math.min(e.lat,n.lat),i.lng=Math.max(r.lng,i.lng),i.lat=Math.max(r.lat,i.lat)):(this._sw=new Lc(e.lng,e.lat),this._ne=new Lc(r.lng,r.lat)),this},Sc.prototype.getCenter=function(){return new Lc((this._sw.lng+this._ne.lng)/2,(this._sw.lat+this._ne.lat)/2)},Sc.prototype.getSouthWest=function(){return this._sw},Sc.prototype.getNorthEast=function(){return this._ne},Sc.prototype.getNorthWest=function(){return new Lc(this.getWest(),this.getNorth())},Sc.prototype.getSouthEast=function(){return new Lc(this.getEast(),this.getSouth())},Sc.prototype.getWest=function(){return this._sw.lng},Sc.prototype.getSouth=function(){return this._sw.lat},Sc.prototype.getEast=function(){return this._ne.lng},Sc.prototype.getNorth=function(){return this._ne.lat},Sc.prototype.toArray=function(){return[this._sw.toArray(),this._ne.toArray()]},Sc.prototype.toString=function(){return"LngLatBounds("+this._sw.toString()+", "+this._ne.toString()+")"},Sc.prototype.isEmpty=function(){return!(this._sw&&this._ne)},Sc.prototype.contains=function(t){var e=Lc.convert(t),r=e.lng,n=e.lat,i=this._sw.lat<=n&&n<=this._ne.lat,a=this._sw.lng<=r&&r<=this._ne.lng;return this._sw.lng>this._ne.lng&&(a=this._sw.lng>=r&&r>=this._ne.lng),i&&a},Sc.convert=function(t){return!t||t instanceof Sc?t:new Sc(t)};var Ec=6371008.8,Lc=function(t,e){if(isNaN(t)||isNaN(e))throw new Error("Invalid LngLat object: ("+t+", "+e+")");if(this.lng=+t,this.lat=+e,this.lat>90||this.lat<-90)throw new Error("Invalid LngLat latitude value: must be between -90 and 90")};Lc.prototype.wrap=function(){return new Lc(c(this.lng,-180,180),this.lat)},Lc.prototype.toArray=function(){return[this.lng,this.lat]},Lc.prototype.toString=function(){return"LngLat("+this.lng+", "+this.lat+")"},Lc.prototype.distanceTo=function(t){var e=Math.PI/180,r=this.lat*e,n=t.lat*e,i=Math.sin(r)*Math.sin(n)+Math.cos(r)*Math.cos(n)*Math.cos((t.lng-this.lng)*e);return Ec*Math.acos(Math.min(i,1))},Lc.prototype.toBounds=function(t){void 0===t&&(t=0);var e=360*t/40075017,r=e/Math.cos(Math.PI/180*this.lat);return new Sc(new Lc(this.lng-r,this.lat-e),new Lc(this.lng+r,this.lat+e))},Lc.convert=function(t){if(t instanceof Lc)return t;if(Array.isArray(t)&&(2===t.length||3===t.length))return new Lc(Number(t[0]),Number(t[1]));if(!Array.isArray(t)&&"object"==typeof t&&null!==t)return new Lc(Number("lng"in t?t.lng:t.lon),Number(t.lat));throw new Error("`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, an object {lon: , lat: }, or an array of [, ]")};var Cc=2*Math.PI*Ec;function Pc(t){return Cc*Math.cos(t*Math.PI/180)}function Oc(t){return(180+t)/360}function Ic(t){return(180-180/Math.PI*Math.log(Math.tan(Math.PI/4+t*Math.PI/360)))/360}function Dc(t,e){return t/Pc(e)}function zc(t){var e=180-360*t;return 360/Math.PI*Math.atan(Math.exp(e*Math.PI/180))-90}var Rc=function(t,e,r){void 0===r&&(r=0),this.x=+t,this.y=+e,this.z=+r};Rc.fromLngLat=function(t,e){void 0===e&&(e=0);var r=Lc.convert(t);return new Rc(Oc(r.lng),Ic(r.lat),Dc(e,r.lat))},Rc.prototype.toLngLat=function(){return new Lc(360*this.x-180,zc(this.y))},Rc.prototype.toAltitude=function(){return t=this.z,e=this.y,t*Pc(zc(e));var t,e},Rc.prototype.meterInMercatorCoordinateUnits=function(){return 1/Cc*(t=zc(this.y),1/Math.cos(t*Math.PI/180));var t};var Fc=function(t,e,r){this.z=t,this.x=e,this.y=r,this.key=jc(0,t,t,e,r)};Fc.prototype.equals=function(t){return this.z===t.z&&this.x===t.x&&this.y===t.y},Fc.prototype.url=function(t,e){var r,n,i,a,o,s=(r=this.x,n=this.y,i=this.z,a=Mc(256*r,256*(n=Math.pow(2,i)-n-1),i),o=Mc(256*(r+1),256*(n+1),i),a[0]+","+a[1]+","+o[0]+","+o[1]),l=function(t,e,r){for(var n,i="",a=t;a>0;a--)i+=(e&(n=1<this.canonical.z?new Nc(t,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y):new Nc(t,this.wrap,t,this.canonical.x>>e,this.canonical.y>>e)},Nc.prototype.calculateScaledKey=function(t,e){var r=this.canonical.z-t;return t>this.canonical.z?jc(this.wrap*+e,t,this.canonical.z,this.canonical.x,this.canonical.y):jc(this.wrap*+e,t,t,this.canonical.x>>r,this.canonical.y>>r)},Nc.prototype.isChildOf=function(t){if(t.wrap!==this.wrap)return!1;var e=this.canonical.z-t.canonical.z;return 0===t.overscaledZ||t.overscaledZ>e&&t.canonical.y===this.canonical.y>>e},Nc.prototype.children=function(t){if(this.overscaledZ>=t)return[new Nc(this.overscaledZ+1,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y)];var e=this.canonical.z+1,r=2*this.canonical.x,n=2*this.canonical.y;return[new Nc(e,this.wrap,e,r,n),new Nc(e,this.wrap,e,r+1,n),new Nc(e,this.wrap,e,r,n+1),new Nc(e,this.wrap,e,r+1,n+1)]},Nc.prototype.isLessThan=function(t){return this.wrapt.wrap)&&(this.overscaledZt.overscaledZ)&&(this.canonical.xt.canonical.x)&&this.canonical.y=this.dim+1||e<-1||e>=this.dim+1)throw new RangeError("out of range source coordinates for DEM data");return(e+1)*this.stride+(t+1)},Uc.prototype._unpackMapbox=function(t,e,r){return(256*t*256+256*e+r)/10-1e4},Uc.prototype._unpackTerrarium=function(t,e,r){return 256*t+e+r/256-32768},Uc.prototype.getPixels=function(){return new Wo({width:this.stride,height:this.stride},new Uint8Array(this.data.buffer))},Uc.prototype.backfillBorder=function(t,e,r){if(this.dim!==t.dim)throw new Error("dem dimension mismatch");var n=e*this.dim,i=e*this.dim+this.dim,a=r*this.dim,o=r*this.dim+this.dim;switch(e){case-1:n=i-1;break;case 1:i=n+1}switch(r){case-1:a=o-1;break;case 1:o=a+1}for(var s=-e*this.dim,l=-r*this.dim,u=a;u=0&&c[3]>=0&&s.insert(o,c[0],c[1],c[2],c[3])}},Zc.prototype.loadVTLayers=function(){return this.vtLayers||(this.vtLayers=new Js.VectorTile(new Sl(this.rawTileData)).layers,this.sourceLayerCoder=new Vc(this.vtLayers?Object.keys(this.vtLayers).sort():["_geojsonTileLayer"])),this.vtLayers},Zc.prototype.query=function(t,e,r,n){var i=this;this.loadVTLayers();for(var o=t.params||{},s=co/t.tileSize/t.scale,l=wn(o.filter),u=t.queryGeometry,c=t.queryPadding*s,f=Wc(u),h=this.grid.query(f.minX-c,f.minY-c,f.maxX+c,f.maxY+c),p=Wc(t.cameraQueryGeometry),d=0,v=this.grid3D.query(p.minX-c,p.minY-c,p.maxX+c,p.maxY+c,(function(e,r,n,i){return function(t,e,r,n,i){for(var o=0,s=t;o=l.x&&i>=l.y)return!0}var u=[new a(e,r),new a(e,i),new a(n,i),new a(n,r)];if(t.length>2)for(var c=0,f=u;c=0)return!0;return!1}(a,f)){var h=this.sourceLayerCoder.decode(r),p=this.vtLayers[h].feature(n);if(i.filter(new Pi(this.tileID.overscaledZ),p))for(var d=this.getId(p,h),v=0;vn)i=!1;else if(e)if(this.expirationTimect&&(t.getActor().send("enforceCacheSizeLimit",ut),yt=0)},t.clamp=u,t.clearTileCache=function(t){var e=self.caches.delete(lt);t&&e.catch(t).then((function(){return t()}))},t.clipLine=Ou,t.clone=function(t){var e=new Io(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e},t.clone$1=b,t.clone$2=function(t){var e=new Io(3);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e},t.collisionCircleLayout=_l,t.config=B,t.create=function(){var t=new Io(16);return Io!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t},t.create$1=function(){var t=new Io(9);return Io!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[5]=0,t[6]=0,t[7]=0),t[0]=1,t[4]=1,t[8]=1,t},t.create$2=function(){var t=new Io(4);return Io!=Float32Array&&(t[1]=0,t[2]=0),t[0]=1,t[3]=1,t},t.createCommonjsModule=e,t.createExpression=ln,t.createLayout=Ki,t.createStyleLayer=function(t){return"custom"===t.type?new gc(t):new yc[t.type](t)},t.cross=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],l=r[2];return t[0]=i*l-a*s,t[1]=a*o-n*l,t[2]=n*s-i*o,t},t.deepEqual=function t(e,r){if(Array.isArray(e)){if(!Array.isArray(r)||e.length!==r.length)return!1;for(var n=0;n0&&(a=1/Math.sqrt(a)),t[0]=e[0]*a,t[1]=e[1]*a,t[2]=e[2]*a,t},t.number=$e,t.offscreenCanvasSupported=mt,t.ortho=function(t,e,r,n,i,a,o){var s=1/(e-r),l=1/(n-i),u=1/(a-o);return t[0]=-2*s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*l,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*u,t[11]=0,t[12]=(e+r)*s,t[13]=(i+n)*l,t[14]=(o+a)*u,t[15]=1,t},t.parseGlyphPBF=function(t){return new Sl(t).readFields(Wl,[])},t.pbf=Sl,t.performSymbolLayout=function(t,e,r,n,i,a,o){t.createArrays();var s=512*t.overscaling;t.tilePixelRatio=co/s,t.compareText={},t.iconsNeedLinear=!1;var l=t.layers[0].layout,u=t.layers[0]._unevaluatedLayout._values,c={};if("composite"===t.textSizeData.kind){var f=t.textSizeData,h=f.minZoom,p=f.maxZoom;c.compositeTextSizes=[u["text-size"].possiblyEvaluate(new Pi(h),o),u["text-size"].possiblyEvaluate(new Pi(p),o)]}if("composite"===t.iconSizeData.kind){var d=t.iconSizeData,v=d.minZoom,g=d.maxZoom;c.compositeIconSizes=[u["icon-size"].possiblyEvaluate(new Pi(v),o),u["icon-size"].possiblyEvaluate(new Pi(g),o)]}c.layoutTextSize=u["text-size"].possiblyEvaluate(new Pi(t.zoom+1),o),c.layoutIconSize=u["icon-size"].possiblyEvaluate(new Pi(t.zoom+1),o),c.textMaxSize=u["text-size"].possiblyEvaluate(new Pi(18));for(var y=l.get("text-line-height")*kl,m="map"===l.get("text-rotation-alignment")&&"point"!==l.get("symbol-placement"),x=l.get("text-keep-upright"),b=l.get("text-size"),_=function(){var a=k[T],s=l.get("text-font").evaluate(a,{},o).join(","),u=b.evaluate(a,{},o),f=c.layoutTextSize.evaluate(a,{},o),h=c.layoutIconSize.evaluate(a,{},o),p={horizontal:{},vertical:void 0},d=a.text,v=[0,0];if(d){var g=d.toString(),_=l.get("text-letter-spacing").evaluate(a,{},o)*kl,A=function(t){for(var e=0,r=t;e=co||f.y<0||f.y>=co||function(t,e,r,n,i,a,o,s,l,u,c,f,h,p,d,v,g,y,m,x,b,_,T,k,A){var M,S,E,L,C,P=t.addToLineVertexArray(e,r),O=0,I=0,D=0,z=0,R=-1,F=-1,B={},N=Fa(""),j=0,U=0;if(void 0===s._unevaluatedLayout.getValue("text-radial-offset")?(j=(M=s.layout.get("text-offset").evaluate(b,{},k).map((function(t){return t*kl})))[0],U=M[1]):(j=s.layout.get("text-radial-offset").evaluate(b,{},k)*kl,U=Zu),t.allowVerticalPlacement&&n.vertical){var V=s.layout.get("text-rotate").evaluate(b,{},k)+90,H=n.vertical;L=new Nu(l,e,u,c,f,H,h,p,d,V),o&&(C=new Nu(l,e,u,c,f,o,g,y,d,V))}if(i){var q=s.layout.get("icon-rotate").evaluate(b,{}),G="none"!==s.layout.get("icon-text-fit"),Z=Du(i,q,T,G),Y=o?Du(o,q,T,G):void 0;E=new Nu(l,e,u,c,f,i,g,y,!1,q),O=4*Z.length;var W=t.iconSizeData,X=null;"source"===W.kind?(X=[bu*s.layout.get("icon-size").evaluate(b,{})])[0]>Ju&&w(t.layerIds[0]+': Value for "icon-size" is >= '+Xu+'. Reduce your "icon-size".'):"composite"===W.kind&&((X=[bu*_.compositeIconSizes[0].evaluate(b,{},k),bu*_.compositeIconSizes[1].evaluate(b,{},k)])[0]>Ju||X[1]>Ju)&&w(t.layerIds[0]+': Value for "icon-size" is >= '+Xu+'. Reduce your "icon-size".'),t.addSymbols(t.icon,Z,X,x,m,b,!1,e,P.lineStartIndex,P.lineLength,-1,k),R=t.icon.placedSymbolArray.length-1,Y&&(I=4*Y.length,t.addSymbols(t.icon,Y,X,x,m,b,nu.vertical,e,P.lineStartIndex,P.lineLength,-1,k),F=t.icon.placedSymbolArray.length-1)}for(var J in n.horizontal){var K=n.horizontal[J];if(!S){N=Fa(K.text);var $=s.layout.get("text-rotate").evaluate(b,{},k);S=new Nu(l,e,u,c,f,K,h,p,d,$)}var Q=1===K.positionedLines.length;if(D+=Ku(t,e,K,a,s,d,b,v,P,n.vertical?nu.horizontal:nu.horizontalOnly,Q?Object.keys(n.horizontal):[J],B,R,_,k),Q)break}n.vertical&&(z+=Ku(t,e,n.vertical,a,s,d,b,v,P,nu.vertical,["vertical"],B,F,_,k));var tt=S?S.boxStartIndex:t.collisionBoxArray.length,et=S?S.boxEndIndex:t.collisionBoxArray.length,rt=L?L.boxStartIndex:t.collisionBoxArray.length,nt=L?L.boxEndIndex:t.collisionBoxArray.length,it=E?E.boxStartIndex:t.collisionBoxArray.length,at=E?E.boxEndIndex:t.collisionBoxArray.length,ot=C?C.boxStartIndex:t.collisionBoxArray.length,st=C?C.boxEndIndex:t.collisionBoxArray.length,lt=-1,ut=function(t,e){return t&&t.circleDiameter?Math.max(t.circleDiameter,e):e};lt=ut(S,lt),lt=ut(L,lt),lt=ut(E,lt);var ct=(lt=ut(C,lt))>-1?1:0;ct&&(lt*=A/kl),t.glyphOffsetArray.length>=sc.MAX_GLYPHS&&w("Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907"),void 0!==b.sortKey&&t.addToSortKeyRanges(t.symbolInstances.length,b.sortKey),t.symbolInstances.emplaceBack(e.x,e.y,B.right>=0?B.right:-1,B.center>=0?B.center:-1,B.left>=0?B.left:-1,B.vertical||-1,R,F,N,tt,et,rt,nt,it,at,ot,st,u,D,z,O,I,ct,0,h,j,U,lt)}(t,f,s,r,n,i,h,t.layers[0],t.collisionBoxArray,e.index,e.sourceLayerIndex,t.index,m,T,M,l,b,k,S,d,e,a,u,c,o)};if("line"===E)for(var O=0,I=Ou(e.geometry,0,0,co,co);O1){var U=Lu(j,A,r.vertical||v,n,g,x);U&&P(j,U)}}else if("Polygon"===e.type)for(var V=0,H=Is(e.geometry,0);V=E.maxzoom||"none"!==E.visibility&&(o(S,this.zoom,n),(v[E.id]=E.createBucket({index:c.bucketLayerIDs.length,layers:S,zoom:this.zoom,pixelRatio:this.pixelRatio,overscaling:this.overscaling,collisionBoxArray:this.collisionBoxArray,sourceLayerIndex:b,sourceID:this.source})).populate(_,g,this.tileID.canonical),c.bucketLayerIDs.push(S.map((function(t){return t.id}))))}}}var L=t.mapObject(g.glyphDependencies,(function(t){return Object.keys(t).map(Number)}));Object.keys(L).length?a.send("getGlyphs",{uid:this.uid,stacks:L},(function(t,e){f||(f=t,h=e,O.call(l))})):h={};var C=Object.keys(g.iconDependencies);C.length?a.send("getImages",{icons:C,source:this.source,tileID:this.tileID,type:"icons"},(function(t,e){f||(f=t,p=e,O.call(l))})):p={};var P=Object.keys(g.patternDependencies);function O(){if(f)return s(f);if(h&&p&&d){var e=new i(h),r=new t.ImageAtlas(p,d);for(var a in v){var l=v[a];l instanceof t.SymbolBucket?(o(l.layers,this.zoom,n),t.performSymbolLayout(l,h,e.positions,p,r.iconPositions,this.showCollisionBoxes,this.tileID.canonical)):l.hasPattern&&(l instanceof t.LineBucket||l instanceof t.FillBucket||l instanceof t.FillExtrusionBucket)&&(o(l.layers,this.zoom,n),l.addFeatures(g,this.tileID.canonical,r.patternPositions))}this.status="done",s(null,{buckets:t.values(v).filter((function(t){return!t.isEmpty()})),featureIndex:c,collisionBoxArray:this.collisionBoxArray,glyphAtlasImage:e.image,imageAtlas:r,glyphMap:this.returnDependencies?h:null,iconMap:this.returnDependencies?p:null,glyphPositions:this.returnDependencies?e.positions:null})}}P.length?a.send("getImages",{icons:P,source:this.source,tileID:this.tileID,type:"patterns"},(function(t,e){f||(f=t,d=e,O.call(l))})):d={},O.call(this)};var l=function(t,e,r,n){this.actor=t,this.layerIndex=e,this.availableImages=r,this.loadVectorData=n||s,this.loading={},this.loaded={}};l.prototype.loadTile=function(e,r){var n=this,i=e.uid;this.loading||(this.loading={});var o=!!(e&&e.request&&e.request.collectResourceTiming)&&new t.RequestPerformance(e.request),s=this.loading[i]=new a(e);s.abort=this.loadVectorData(e,(function(e,a){if(delete n.loading[i],e||!a)return s.status="done",n.loaded[i]=s,r(e);var l=a.rawData,u={};a.expires&&(u.expires=a.expires),a.cacheControl&&(u.cacheControl=a.cacheControl);var c={};if(o){var f=o.finish();f&&(c.resourceTiming=JSON.parse(JSON.stringify(f)))}s.vectorTile=a.vectorTile,s.parse(a.vectorTile,n.layerIndex,n.availableImages,n.actor,(function(e,n){if(e||!n)return r(e);r(null,t.extend({rawTileData:l.slice(0)},n,u,c))})),n.loaded=n.loaded||{},n.loaded[i]=s}))},l.prototype.reloadTile=function(t,e){var r=this,n=this.loaded,i=t.uid,a=this;if(n&&n[i]){var o=n[i];o.showCollisionBoxes=t.showCollisionBoxes;var s=function(t,n){var i=o.reloadCallback;i&&(delete o.reloadCallback,o.parse(o.vectorTile,a.layerIndex,r.availableImages,a.actor,i)),e(t,n)};"parsing"===o.status?o.reloadCallback=s:"done"===o.status&&(o.vectorTile?o.parse(o.vectorTile,this.layerIndex,this.availableImages,this.actor,s):s())}},l.prototype.abortTile=function(t,e){var r=this.loading,n=t.uid;r&&r[n]&&r[n].abort&&(r[n].abort(),delete r[n]),e()},l.prototype.removeTile=function(t,e){var r=this.loaded,n=t.uid;r&&r[n]&&delete r[n],e()};var u=t.window.ImageBitmap,c=function(){this.loaded={}};c.prototype.loadTile=function(e,r){var n=e.uid,i=e.encoding,a=e.rawImageData,o=u&&a instanceof u?this.getImageData(a):a,s=new t.DEMData(n,o,i);this.loaded=this.loaded||{},this.loaded[n]=s,r(null,s)},c.prototype.getImageData=function(e){this.offscreenCanvas&&this.offscreenCanvasContext||(this.offscreenCanvas=new OffscreenCanvas(e.width,e.height),this.offscreenCanvasContext=this.offscreenCanvas.getContext("2d")),this.offscreenCanvas.width=e.width,this.offscreenCanvas.height=e.height,this.offscreenCanvasContext.drawImage(e,0,0,e.width,e.height);var r=this.offscreenCanvasContext.getImageData(-1,-1,e.width+2,e.height+2);return this.offscreenCanvasContext.clearRect(0,0,this.offscreenCanvas.width,this.offscreenCanvas.height),new t.RGBAImage({width:r.width,height:r.height},r.data)},c.prototype.removeTile=function(t){var e=this.loaded,r=t.uid;e&&e[r]&&delete e[r]};var f=function t(e,r){var n,i=e&&e.type;if("FeatureCollection"===i)for(n=0;n=0!=!!e&&t.reverse()}var d=t.vectorTile.VectorTileFeature.prototype.toGeoJSON,v=function(e){this._feature=e,this.extent=t.EXTENT,this.type=e.type,this.properties=e.tags,"id"in e&&!isNaN(e.id)&&(this.id=parseInt(e.id,10))};v.prototype.loadGeometry=function(){if(1===this._feature.type){for(var e=[],r=0,n=this._feature.geometry;r>31}function P(t,e){for(var r=t.loadGeometry(),n=t.type,i=0,a=0,o=r.length,s=0;s>1;D(t,e,o,n,i,a%2),I(t,e,r,n,o-1,a+1),I(t,e,r,o+1,i,a+1)}}function D(t,e,r,n,i,a){for(;i>n;){if(i-n>600){var o=i-n+1,s=r-n+1,l=Math.log(o),u=.5*Math.exp(2*l/3),c=.5*Math.sqrt(l*u*(o-u)/o)*(s-o/2<0?-1:1);D(t,e,r,Math.max(n,Math.floor(r-s*u/o+c)),Math.min(i,Math.floor(r+(o-s)*u/o+c)),a)}var f=e[2*r+a],h=n,p=i;for(z(t,e,n,r),e[2*i+a]>f&&z(t,e,n,i);hf;)p--}e[2*n+a]===f?z(t,e,n,p):z(t,e,++p,i),p<=r&&(n=p+1),r<=p&&(i=p-1)}}function z(t,e,r,n){R(t,r,n),R(e,2*r,2*n),R(e,2*r+1,2*n+1)}function R(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function F(t,e,r,n){var i=t-r,a=e-n;return i*i+a*a}_.fromVectorTileJs=w,_.fromGeojsonVt=T,_.GeoJSONWrapper=k;var B=function(t){return t[0]},N=function(t){return t[1]},j=function(t,e,r,n,i){void 0===e&&(e=B),void 0===r&&(r=N),void 0===n&&(n=64),void 0===i&&(i=Float64Array),this.nodeSize=n,this.points=t;for(var a=t.length<65536?Uint16Array:Uint32Array,o=this.ids=new a(t.length),s=this.coords=new i(2*t.length),l=0;l=r&&s<=i&&l>=n&&l<=a&&c.push(t[d]);else{var v=Math.floor((p+h)/2);s=e[2*v],l=e[2*v+1],s>=r&&s<=i&&l>=n&&l<=a&&c.push(t[v]);var g=(f+1)%2;(0===f?r<=s:n<=l)&&(u.push(p),u.push(v-1),u.push(g)),(0===f?i>=s:a>=l)&&(u.push(v+1),u.push(h),u.push(g))}}return c}(this.ids,this.coords,t,e,r,n,this.nodeSize)},j.prototype.within=function(t,e,r){return function(t,e,r,n,i,a){for(var o=[0,t.length-1,0],s=[],l=i*i;o.length;){var u=o.pop(),c=o.pop(),f=o.pop();if(c-f<=a)for(var h=f;h<=c;h++)F(e[2*h],e[2*h+1],r,n)<=l&&s.push(t[h]);else{var p=Math.floor((f+c)/2),d=e[2*p],v=e[2*p+1];F(d,v,r,n)<=l&&s.push(t[p]);var g=(u+1)%2;(0===u?r-i<=d:n-i<=v)&&(o.push(f),o.push(p-1),o.push(g)),(0===u?r+i>=d:n+i>=v)&&(o.push(p+1),o.push(c),o.push(g))}}return s}(this.ids,this.coords,t,e,r,this.nodeSize)};var U={minZoom:0,maxZoom:16,radius:40,extent:512,nodeSize:64,log:!1,generateId:!1,reduce:null,map:function(t){return t}},V=function(t){this.options=X(Object.create(U),t),this.trees=new Array(this.options.maxZoom+1)};function H(t,e,r,n,i){return{x:t,y:e,zoom:1/0,id:r,parentId:-1,numPoints:n,properties:i}}function q(t,e){var r=t.geometry.coordinates,n=r[0],i=r[1];return{x:Y(n),y:W(i),zoom:1/0,index:e,parentId:-1}}function G(t){return{type:"Feature",id:t.id,properties:Z(t),geometry:{type:"Point",coordinates:[(n=t.x,360*(n-.5)),(e=t.y,r=(180-360*e)*Math.PI/180,360*Math.atan(Math.exp(r))/Math.PI-90)]}};var e,r,n}function Z(t){var e=t.numPoints,r=e>=1e4?Math.round(e/1e3)+"k":e>=1e3?Math.round(e/100)/10+"k":e;return X(X({},t.properties),{cluster:!0,cluster_id:t.id,point_count:e,point_count_abbreviated:r})}function Y(t){return t/360+.5}function W(t){var e=Math.sin(t*Math.PI/180),r=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return r<0?0:r>1?1:r}function X(t,e){for(var r in e)t[r]=e[r];return t}function J(t){return t.x}function K(t){return t.y}function $(t,e,r,n){for(var i,a=n,o=r-e>>1,s=r-e,l=t[e],u=t[e+1],c=t[r],f=t[r+1],h=e+3;ha)i=h,a=p;else if(p===a){var d=Math.abs(h-o);dn&&(i-e>3&&$(t,e,i,n),t[i+2]=a,r-i>3&&$(t,i,r,n))}function Q(t,e,r,n,i,a){var o=i-r,s=a-n;if(0!==o||0!==s){var l=((t-r)*o+(e-n)*s)/(o*o+s*s);l>1?(r=i,n=a):l>0&&(r+=o*l,n+=s*l)}return(o=t-r)*o+(s=e-n)*s}function tt(t,e,r,n){var i={id:void 0===t?null:t,type:e,geometry:r,tags:n,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};return function(t){var e=t.geometry,r=t.type;if("Point"===r||"MultiPoint"===r||"LineString"===r)et(t,e);else if("Polygon"===r||"MultiLineString"===r)for(var n=0;n0&&(o+=n?(i*u-l*a)/2:Math.sqrt(Math.pow(l-i,2)+Math.pow(u-a,2))),i=l,a=u}var c=e.length-3;e[2]=1,$(e,0,c,r),e[c+2]=1,e.size=Math.abs(o),e.start=0,e.end=e.size}function at(t,e,r,n){for(var i=0;i1?1:r}function lt(t,e,r,n,i,a,o,s){if(n/=e,a>=(r/=e)&&o=n)return null;for(var l=[],u=0;u=r&&d=n)){var v=[];if("Point"===h||"MultiPoint"===h)ut(f,v,r,n,i);else if("LineString"===h)ct(f,v,r,n,i,!1,s.lineMetrics);else if("MultiLineString"===h)ht(f,v,r,n,i,!1);else if("Polygon"===h)ht(f,v,r,n,i,!0);else if("MultiPolygon"===h)for(var g=0;g=r&&o<=n&&(e.push(t[a]),e.push(t[a+1]),e.push(t[a+2]))}}function ct(t,e,r,n,i,a,o){for(var s,l,u=ft(t),c=0===i?dt:vt,f=t.start,h=0;hr&&(l=c(u,p,d,g,y,r),o&&(u.start=f+s*l)):m>n?x=r&&(l=c(u,p,d,g,y,r),b=!0),x>n&&m<=n&&(l=c(u,p,d,g,y,n),b=!0),!a&&b&&(o&&(u.end=f+s*l),e.push(u),u=ft(t)),o&&(f+=s)}var _=t.length-3;p=t[_],d=t[_+1],v=t[_+2],(m=0===i?p:d)>=r&&m<=n&&pt(u,p,d,v),_=u.length-3,a&&_>=3&&(u[_]!==u[0]||u[_+1]!==u[1])&&pt(u,u[0],u[1],u[2]),u.length&&e.push(u)}function ft(t){var e=[];return e.size=t.size,e.start=t.start,e.end=t.end,e}function ht(t,e,r,n,i,a){for(var o=0;oo.maxX&&(o.maxX=c),f>o.maxY&&(o.maxY=f)}return o}function _t(t,e,r,n){var i=e.geometry,a=e.type,o=[];if("Point"===a||"MultiPoint"===a)for(var s=0;s0&&e.size<(i?o:n))r.numPoints+=e.length/3;else{for(var s=[],l=0;lo)&&(r.numSimplified++,s.push(e[l]),s.push(e[l+1])),r.numPoints++;i&&function(t,e){for(var r=0,n=0,i=t.length,a=i-2;n0===e)for(n=0,i=t.length;n24)throw new Error("maxZoom should be in the 0-24 range");if(e.promoteId&&e.generateId)throw new Error("promoteId and generateId cannot be used together.");var n=function(t,e){var r=[];if("FeatureCollection"===t.type)for(var n=0;n=n;u--){var c=+Date.now();s=this._cluster(s,u),this.trees[u]=new j(s,J,K,a,Float32Array),r&&console.log("z%d: %d clusters in %dms",u,s.length,+Date.now()-c)}return r&&console.timeEnd("total time"),this},V.prototype.getClusters=function(t,e){var r=((t[0]+180)%360+360)%360-180,n=Math.max(-90,Math.min(90,t[1])),i=180===t[2]?180:((t[2]+180)%360+360)%360-180,a=Math.max(-90,Math.min(90,t[3]));if(t[2]-t[0]>=360)r=-180,i=180;else if(r>i){var o=this.getClusters([r,n,180,a],e),s=this.getClusters([-180,n,i,a],e);return o.concat(s)}for(var l=this.trees[this._limitZoom(e)],u=[],c=0,f=l.range(Y(r),W(a),Y(i),W(n));c1?this._map(u,!0):null,g=(l<<5)+(e+1)+this.points.length,y=0,m=f;y>5},V.prototype._getOriginZoom=function(t){return(t-this.points.length)%32},V.prototype._map=function(t,e){if(t.numPoints)return e?X({},t.properties):t.properties;var r=this.points[t.index].properties,n=this.options.map(r);return e&&n===r?X({},n):n},Tt.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,tolerance:3,extent:4096,buffer:64,lineMetrics:!1,promoteId:null,generateId:!1,debug:0},Tt.prototype.splitTile=function(t,e,r,n,i,a,o){for(var s=[t,e,r,n],l=this.options,u=l.debug;s.length;){n=s.pop(),r=s.pop(),e=s.pop(),t=s.pop();var c=1<1&&console.time("creation"),h=this.tiles[f]=bt(t,e,r,n,l),this.tileCoords.push({z:e,x:r,y:n}),u)){u>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",e,r,n,h.numFeatures,h.numPoints,h.numSimplified),console.timeEnd("creation"));var p="z"+e;this.stats[p]=(this.stats[p]||0)+1,this.total++}if(h.source=t,i){if(e===l.maxZoom||e===i)continue;var d=1<1&&console.time("clipping");var v,g,y,m,x,b,_=.5*l.buffer/l.extent,w=.5-_,T=.5+_,k=1+_;v=g=y=m=null,x=lt(t,c,r-_,r+T,0,h.minX,h.maxX,l),b=lt(t,c,r+w,r+k,0,h.minX,h.maxX,l),t=null,x&&(v=lt(x,c,n-_,n+T,1,h.minY,h.maxY,l),g=lt(x,c,n+w,n+k,1,h.minY,h.maxY,l),x=null),b&&(y=lt(b,c,n-_,n+T,1,h.minY,h.maxY,l),m=lt(b,c,n+w,n+k,1,h.minY,h.maxY,l),b=null),u>1&&console.timeEnd("clipping"),s.push(v||[],e+1,2*r,2*n),s.push(g||[],e+1,2*r,2*n+1),s.push(y||[],e+1,2*r+1,2*n),s.push(m||[],e+1,2*r+1,2*n+1)}}},Tt.prototype.getTile=function(t,e,r){var n=this.options,i=n.extent,a=n.debug;if(t<0||t>24)return null;var o=1<1&&console.log("drilling down to z%d-%d-%d",t,e,r);for(var l,u=t,c=e,f=r;!l&&u>0;)u--,c=Math.floor(c/2),f=Math.floor(f/2),l=this.tiles[kt(u,c,f)];return l&&l.source?(a>1&&console.log("found parent tile z%d-%d-%d",u,c,f),a>1&&console.time("drilling down"),this.splitTile(l.source,u,c,f,t,e,r),a>1&&console.timeEnd("drilling down"),this.tiles[s]?mt(this.tiles[s],i):null):null};var Mt=function(e){function r(t,r,n,i){e.call(this,t,r,n,At),i&&(this.loadGeoJSON=i)}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.loadData=function(t,e){this._pendingCallback&&this._pendingCallback(null,{abandoned:!0}),this._pendingCallback=e,this._pendingLoadDataParams=t,this._state&&"Idle"!==this._state?this._state="NeedsLoadData":(this._state="Coalescing",this._loadData())},r.prototype._loadData=function(){var e=this;if(this._pendingCallback&&this._pendingLoadDataParams){var r=this._pendingCallback,n=this._pendingLoadDataParams;delete this._pendingCallback,delete this._pendingLoadDataParams;var i=!!(n&&n.request&&n.request.collectResourceTiming)&&new t.RequestPerformance(n.request);this.loadGeoJSON(n,(function(a,o){if(a||!o)return r(a);if("object"!=typeof o)return r(new Error("Input data given to '"+n.source+"' is not a valid GeoJSON object."));f(o,!0);try{e._geoJSONIndex=n.cluster?new V(function(e){var r=e.superclusterOptions,n=e.clusterProperties;if(!n||!r)return r;for(var i={},a={},o={accumulated:null,zoom:0},s={properties:null},l=Object.keys(n),u=0,c=l;u=0?0:e.button},r.remove=function(t){t.parentNode&&t.parentNode.removeChild(t)};var h=function(e){function r(){e.call(this),this.images={},this.updatedImages={},this.callbackDispatchedThisFrame={},this.loaded=!1,this.requestors=[],this.patterns={},this.atlasImage=new t.RGBAImage({width:1,height:1}),this.dirty=!0}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.isLoaded=function(){return this.loaded},r.prototype.setLoaded=function(t){if(this.loaded!==t&&(this.loaded=t,t)){for(var e=0,r=this.requestors;e=0?1.2:1))}function y(t,e,r,n,i,a,o){for(var s=0;s65535)e(new Error("glyphs > 65535 not supported"));else if(a.ranges[s])e(null,{stack:r,id:i,glyph:o});else{var l=a.requests[s];l||(l=a.requests[s]=[],x.loadGlyphRange(r,s,n.url,n.requestManager,(function(t,e){if(e){for(var r in e)n._doesCharSupportLocalGlyph(+r)||(a.glyphs[+r]=e[+r]);a.ranges[s]=!0}for(var i=0,o=l;i1&&(l=t[++s]);var c=Math.abs(u-l.left),f=Math.abs(u-l.right),h=Math.min(c,f),p=void 0,d=i/r*(n+1);if(l.isDash){var v=n-Math.abs(d);p=Math.sqrt(h*h+v*v)}else p=n-Math.sqrt(h*h+d*d);this.data[o+u]=Math.max(0,Math.min(255,p+128))}},k.prototype.addRegularDash=function(t){for(var e=t.length-1;e>=0;--e){var r=t[e],n=t[e+1];r.zeroLength?t.splice(e,1):n&&n.isDash===r.isDash&&(n.left=r.left,t.splice(e,1))}var i=t[0],a=t[t.length-1];i.isDash===a.isDash&&(i.left=a.left-this.width,a.right=i.right+this.width);for(var o=this.width*this.nextRow,s=0,l=t[s],u=0;u1&&(l=t[++s]);var c=Math.abs(u-l.left),f=Math.abs(u-l.right),h=Math.min(c,f),p=l.isDash?h:-h;this.data[o+u]=Math.max(0,Math.min(255,p+128))}},k.prototype.addDash=function(e,r){var n=r?7:0,i=2*n+1;if(this.nextRow+i>this.height)return t.warnOnce("LineAtlas out of space"),null;for(var a=0,o=0;o=n&&e.x=i&&e.y0&&(l[new t.OverscaledTileID(e.overscaledZ,a,r.z,i,r.y-1).key]={backfilled:!1},l[new t.OverscaledTileID(e.overscaledZ,e.wrap,r.z,r.x,r.y-1).key]={backfilled:!1},l[new t.OverscaledTileID(e.overscaledZ,s,r.z,o,r.y-1).key]={backfilled:!1}),r.y+10&&(n.resourceTiming=e._resourceTiming,e._resourceTiming=[]),e.fire(new t.Event("data",n))}}))},r.prototype.onAdd=function(t){this.map=t,this.load()},r.prototype.setData=function(e){var r=this;return this._data=e,this.fire(new t.Event("dataloading",{dataType:"source"})),this._updateWorkerData((function(e){if(e)r.fire(new t.ErrorEvent(e));else{var n={dataType:"source",sourceDataType:"content"};r._collectResourceTiming&&r._resourceTiming&&r._resourceTiming.length>0&&(n.resourceTiming=r._resourceTiming,r._resourceTiming=[]),r.fire(new t.Event("data",n))}})),this},r.prototype.getClusterExpansionZoom=function(t,e){return this.actor.send("geojson.getClusterExpansionZoom",{clusterId:t,source:this.id},e),this},r.prototype.getClusterChildren=function(t,e){return this.actor.send("geojson.getClusterChildren",{clusterId:t,source:this.id},e),this},r.prototype.getClusterLeaves=function(t,e,r,n){return this.actor.send("geojson.getClusterLeaves",{source:this.id,clusterId:t,limit:e,offset:r},n),this},r.prototype._updateWorkerData=function(e){var r=this;this._loaded=!1;var n=t.extend({},this.workerOptions),i=this._data;"string"==typeof i?(n.request=this.map._requestManager.transformRequest(t.browser.resolveURL(i),t.ResourceType.Source),n.request.collectResourceTiming=this._collectResourceTiming):n.data=JSON.stringify(i),this.actor.send(this.type+".loadData",n,(function(t,i){r._removed||i&&i.abandoned||(r._loaded=!0,i&&i.resourceTiming&&i.resourceTiming[r.id]&&(r._resourceTiming=i.resourceTiming[r.id].slice(0)),r.actor.send(r.type+".coalesce",{source:n.source},null),e(t))}))},r.prototype.loaded=function(){return this._loaded},r.prototype.loadTile=function(e,r){var n=this,i=e.actor?"reloadTile":"loadTile";e.actor=this.actor;var a={type:this.type,uid:e.uid,tileID:e.tileID,zoom:e.tileID.overscaledZ,maxZoom:this.maxzoom,tileSize:this.tileSize,source:this.id,pixelRatio:t.browser.devicePixelRatio,showCollisionBoxes:this.map.showCollisionBoxes,promoteId:this.promoteId};e.request=this.actor.send(i,a,(function(t,a){return delete e.request,e.unloadVectorData(),e.aborted?r(null):t?r(t):(e.loadVectorData(a,n.map.painter,"reloadTile"===i),r(null))}))},r.prototype.abortTile=function(t){t.request&&(t.request.cancel(),delete t.request),t.aborted=!0},r.prototype.unloadTile=function(t){t.unloadVectorData(),this.actor.send("removeTile",{uid:t.uid,type:this.type,source:this.id})},r.prototype.onRemove=function(){this._removed=!0,this.actor.send("removeSource",{type:this.type,source:this.id})},r.prototype.serialize=function(){return t.extend({},this._options,{type:this.type,data:this._data})},r.prototype.hasTransition=function(){return!1},r}(t.Evented),O=t.createLayout([{name:"a_pos",type:"Int16",components:2},{name:"a_texture_pos",type:"Int16",components:2}]),I=function(e){function r(t,r,n,i){e.call(this),this.id=t,this.dispatcher=n,this.coordinates=r.coordinates,this.type="image",this.minzoom=0,this.maxzoom=22,this.tileSize=512,this.tiles={},this._loaded=!1,this.setEventedParent(i),this.options=r}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.load=function(e,r){var n=this;this._loaded=!1,this.fire(new t.Event("dataloading",{dataType:"source"})),this.url=this.options.url,t.getImage(this.map._requestManager.transformRequest(this.url,t.ResourceType.Image),(function(i,a){n._loaded=!0,i?n.fire(new t.ErrorEvent(i)):a&&(n.image=a,e&&(n.coordinates=e),r&&r(),n._finishLoading())}))},r.prototype.loaded=function(){return this._loaded},r.prototype.updateImage=function(t){var e=this;return this.image&&t.url?(this.options.url=t.url,this.load(t.coordinates,(function(){e.texture=null})),this):this},r.prototype._finishLoading=function(){this.map&&(this.setCoordinates(this.coordinates),this.fire(new t.Event("data",{dataType:"source",sourceDataType:"metadata"})))},r.prototype.onAdd=function(t){this.map=t,this.load()},r.prototype.setCoordinates=function(e){var r=this;this.coordinates=e;var n=e.map(t.MercatorCoordinate.fromLngLat);this.tileID=function(e){for(var r=1/0,n=1/0,i=-1/0,a=-1/0,o=0,s=e;or.end(0)?this.fire(new t.ErrorEvent(new t.ValidationError("sources."+this.id,null,"Playback for this video can be set only between the "+r.start(0)+" and "+r.end(0)+"-second mark."))):this.video.currentTime=e}},r.prototype.getVideo=function(){return this.video},r.prototype.onAdd=function(t){this.map||(this.map=t,this.load(),this.video&&(this.video.play(),this.setCoordinates(this.coordinates)))},r.prototype.prepare=function(){if(!(0===Object.keys(this.tiles).length||this.video.readyState<2)){var e=this.map.painter.context,r=e.gl;for(var n in this.boundsBuffer||(this.boundsBuffer=e.createVertexBuffer(this._boundsArray,O.members)),this.boundsSegments||(this.boundsSegments=t.SegmentVector.simpleSegment(0,0,4,2)),this.texture?this.video.paused||(this.texture.bind(r.LINEAR,r.CLAMP_TO_EDGE),r.texSubImage2D(r.TEXTURE_2D,0,0,0,r.RGBA,r.UNSIGNED_BYTE,this.video)):(this.texture=new t.Texture(e,this.video,r.RGBA),this.texture.bind(r.LINEAR,r.CLAMP_TO_EDGE)),this.tiles){var i=this.tiles[n];"loaded"!==i.state&&(i.state="loaded",i.texture=this.texture)}}},r.prototype.serialize=function(){return{type:"video",urls:this.urls,coordinates:this.coordinates}},r.prototype.hasTransition=function(){return this.video&&!this.video.paused},r}(I),z=function(e){function r(r,n,i,a){e.call(this,r,n,i,a),n.coordinates?Array.isArray(n.coordinates)&&4===n.coordinates.length&&!n.coordinates.some((function(t){return!Array.isArray(t)||2!==t.length||t.some((function(t){return"number"!=typeof t}))}))||this.fire(new t.ErrorEvent(new t.ValidationError("sources."+r,null,'"coordinates" property must be an array of 4 longitude/latitude array pairs'))):this.fire(new t.ErrorEvent(new t.ValidationError("sources."+r,null,'missing required property "coordinates"'))),n.animate&&"boolean"!=typeof n.animate&&this.fire(new t.ErrorEvent(new t.ValidationError("sources."+r,null,'optional "animate" property must be a boolean value'))),n.canvas?"string"==typeof n.canvas||n.canvas instanceof t.window.HTMLCanvasElement||this.fire(new t.ErrorEvent(new t.ValidationError("sources."+r,null,'"canvas" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance'))):this.fire(new t.ErrorEvent(new t.ValidationError("sources."+r,null,'missing required property "canvas"'))),this.options=n,this.animate=void 0===n.animate||n.animate}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.load=function(){this._loaded=!0,this.canvas||(this.canvas=this.options.canvas instanceof t.window.HTMLCanvasElement?this.options.canvas:t.window.document.getElementById(this.options.canvas)),this.width=this.canvas.width,this.height=this.canvas.height,this._hasInvalidDimensions()?this.fire(new t.ErrorEvent(new Error("Canvas dimensions cannot be less than or equal to zero."))):(this.play=function(){this._playing=!0,this.map.triggerRepaint()},this.pause=function(){this._playing&&(this.prepare(),this._playing=!1)},this._finishLoading())},r.prototype.getCanvas=function(){return this.canvas},r.prototype.onAdd=function(t){this.map=t,this.load(),this.canvas&&this.animate&&this.play()},r.prototype.onRemove=function(){this.pause()},r.prototype.prepare=function(){var e=!1;if(this.canvas.width!==this.width&&(this.width=this.canvas.width,e=!0),this.canvas.height!==this.height&&(this.height=this.canvas.height,e=!0),!this._hasInvalidDimensions()&&0!==Object.keys(this.tiles).length){var r=this.map.painter.context,n=r.gl;for(var i in this.boundsBuffer||(this.boundsBuffer=r.createVertexBuffer(this._boundsArray,O.members)),this.boundsSegments||(this.boundsSegments=t.SegmentVector.simpleSegment(0,0,4,2)),this.texture?(e||this._playing)&&this.texture.update(this.canvas,{premultiply:!0}):this.texture=new t.Texture(r,this.canvas,n.RGBA,{premultiply:!0}),this.tiles){var a=this.tiles[i];"loaded"!==a.state&&(a.state="loaded",a.texture=this.texture)}}},r.prototype.serialize=function(){return{type:"canvas",coordinates:this.coordinates}},r.prototype.hasTransition=function(){return this._playing},r.prototype._hasInvalidDimensions=function(){for(var t=0,e=[this.canvas.width,this.canvas.height];tthis.max){var o=this._getAndRemoveByKey(this.order[0]);o&&this.onRemove(o)}return this},j.prototype.has=function(t){return t.wrapped().key in this.data},j.prototype.getAndRemove=function(t){return this.has(t)?this._getAndRemoveByKey(t.wrapped().key):null},j.prototype._getAndRemoveByKey=function(t){var e=this.data[t].shift();return e.timeout&&clearTimeout(e.timeout),0===this.data[t].length&&delete this.data[t],this.order.splice(this.order.indexOf(t),1),e.value},j.prototype.getByKey=function(t){var e=this.data[t];return e?e[0].value:null},j.prototype.get=function(t){return this.has(t)?this.data[t.wrapped().key][0].value:null},j.prototype.remove=function(t,e){if(!this.has(t))return this;var r=t.wrapped().key,n=void 0===e?0:this.data[r].indexOf(e),i=this.data[r][n];return this.data[r].splice(n,1),i.timeout&&clearTimeout(i.timeout),0===this.data[r].length&&delete this.data[r],this.onRemove(i.value),this.order.splice(this.order.indexOf(r),1),this},j.prototype.setMaxSize=function(t){for(this.max=t;this.order.length>this.max;){var e=this._getAndRemoveByKey(this.order[0]);e&&this.onRemove(e)}return this},j.prototype.filter=function(t){var e=[];for(var r in this.data)for(var n=0,i=this.data[r];n1||(Math.abs(r)>1&&(1===Math.abs(r+i)?r+=i:1===Math.abs(r-i)&&(r-=i)),e.dem&&t.dem&&(t.dem.backfillBorder(e.dem,r,n),t.neighboringTiles&&t.neighboringTiles[a]&&(t.neighboringTiles[a].backfilled=!0)))}},r.prototype.getTile=function(t){return this.getTileByID(t.key)},r.prototype.getTileByID=function(t){return this._tiles[t]},r.prototype._retainLoadedChildren=function(t,e,r,n){for(var i in this._tiles){var a=this._tiles[i];if(!(n[i]||!a.hasData()||a.tileID.overscaledZ<=e||a.tileID.overscaledZ>r)){for(var o=a.tileID;a&&a.tileID.overscaledZ>e+1;){var s=a.tileID.scaledTo(a.tileID.overscaledZ-1);(a=this._tiles[s.key])&&a.hasData()&&(o=s)}for(var l=o;l.overscaledZ>e;)if(t[(l=l.scaledTo(l.overscaledZ-1)).key]){n[o.key]=o;break}}}},r.prototype.findLoadedParent=function(t,e){if(t.key in this._loadedParentTiles){var r=this._loadedParentTiles[t.key];return r&&r.tileID.overscaledZ>=e?r:null}for(var n=t.overscaledZ-1;n>=e;n--){var i=t.scaledTo(n),a=this._getLoadedTile(i);if(a)return a}},r.prototype._getLoadedTile=function(t){var e=this._tiles[t.key];return e&&e.hasData()?e:this._cache.getByKey(t.wrapped().key)},r.prototype.updateCacheSize=function(t){var e=(Math.ceil(t.width/this._source.tileSize)+1)*(Math.ceil(t.height/this._source.tileSize)+1),r=Math.floor(5*e),n="number"==typeof this._maxTileCacheSize?Math.min(this._maxTileCacheSize,r):r;this._cache.setMaxSize(n)},r.prototype.handleWrapJump=function(t){var e=(t-(void 0===this._prevLng?t:this._prevLng))/360,r=Math.round(e);if(this._prevLng=t,r){var n={};for(var i in this._tiles){var a=this._tiles[i];a.tileID=a.tileID.unwrapTo(a.tileID.wrap+r),n[a.tileID.key]=a}for(var o in this._tiles=n,this._timers)clearTimeout(this._timers[o]),delete this._timers[o];for(var s in this._tiles){var l=this._tiles[s];this._setTileReloadTimer(s,l)}}},r.prototype.update=function(e){var n=this;if(this.transform=e,this._sourceLoaded&&!this._paused){var i;this.updateCacheSize(e),this.handleWrapJump(this.transform.center.lng),this._coveredTiles={},this.used?this._source.tileID?i=e.getVisibleUnwrappedCoordinates(this._source.tileID).map((function(e){return new t.OverscaledTileID(e.canonical.z,e.wrap,e.canonical.z,e.canonical.x,e.canonical.y)})):(i=e.coveringTiles({tileSize:this._source.tileSize,minzoom:this._source.minzoom,maxzoom:this._source.maxzoom,roundZoom:this._source.roundZoom,reparseOverscaled:this._source.reparseOverscaled}),this._source.hasTile&&(i=i.filter((function(t){return n._source.hasTile(t)})))):i=[];var a=e.coveringZoomLevel(this._source),o=Math.max(a-r.maxOverzooming,this._source.minzoom),s=Math.max(a+r.maxUnderzooming,this._source.minzoom),l=this._updateRetainedTiles(i,a);if(Dt(this._source.type)){for(var u={},c={},f=0,h=Object.keys(l);fthis._source.maxzoom){var g=d.children(this._source.maxzoom)[0],y=this.getTile(g);if(y&&y.hasData()){n[g.key]=g;continue}}else{var m=d.children(this._source.maxzoom);if(n[m[0].key]&&n[m[1].key]&&n[m[2].key]&&n[m[3].key])continue}for(var x=v.wasRequested(),b=d.overscaledZ-1;b>=a;--b){var _=d.scaledTo(b);if(i[_.key])break;if(i[_.key]=!0,!(v=this.getTile(_))&&x&&(v=this._addTile(_)),v&&(n[_.key]=_,x=v.wasRequested(),v.hasData()))break}}}return n},r.prototype._updateLoadedParentTileCache=function(){for(var t in this._loadedParentTiles={},this._tiles){for(var e=[],r=void 0,n=this._tiles[t].tileID;n.overscaledZ>0;){if(n.key in this._loadedParentTiles){r=this._loadedParentTiles[n.key];break}e.push(n.key);var i=n.scaledTo(n.overscaledZ-1);if(r=this._getLoadedTile(i))break;n=i}for(var a=0,o=e;a0||(e.hasData()&&"reloading"!==e.state?this._cache.add(e.tileID,e,e.getExpiryTimeout()):(e.aborted=!0,this._abortTile(e),this._unloadTile(e))))},r.prototype.clearTiles=function(){for(var t in this._shouldReloadOnResume=!1,this._paused=!1,this._tiles)this._removeTile(t);this._cache.reset()},r.prototype.tilesIn=function(e,r,n){var i=this,a=[],o=this.transform;if(!o)return a;for(var s=n?o.getCameraQueryGeometry(e):e,l=e.map((function(t){return o.pointCoordinate(t)})),u=s.map((function(t){return o.pointCoordinate(t)})),c=this.getIds(),f=1/0,h=1/0,p=-1/0,d=-1/0,v=0,g=u;v=0&&y[1].y+g>=0){var m=l.map((function(t){return s.getTilePoint(t)})),x=u.map((function(t){return s.getTilePoint(t)}));a.push({tile:n,tileID:s,queryGeometry:m,cameraQueryGeometry:x,scale:v})}}},x=0;x=t.browser.now())return!0}return!1},r.prototype.setFeatureState=function(t,e,r){t=t||"_geojsonTileLayer",this._state.updateState(t,e,r)},r.prototype.removeFeatureState=function(t,e,r){t=t||"_geojsonTileLayer",this._state.removeFeatureState(t,e,r)},r.prototype.getFeatureState=function(t,e){return t=t||"_geojsonTileLayer",this._state.getState(t,e)},r.prototype.setDependencies=function(t,e,r){var n=this._tiles[t];n&&n.setDependencies(e,r)},r.prototype.reloadTilesForDependencies=function(t,e){for(var r in this._tiles)this._tiles[r].hasDependency(t,e)&&this._reloadTile(r,"reloading");this._cache.filter((function(r){return!r.hasDependency(t,e)}))},r}(t.Evented);function It(t,e){var r=Math.abs(2*t.wrap)-+(t.wrap<0),n=Math.abs(2*e.wrap)-+(e.wrap<0);return t.overscaledZ-e.overscaledZ||n-r||e.canonical.y-t.canonical.y||e.canonical.x-t.canonical.x}function Dt(t){return"raster"===t||"image"===t||"video"===t}function zt(){return new t.window.Worker(na.workerUrl)}Ot.maxOverzooming=10,Ot.maxUnderzooming=3;var Rt="mapboxgl_preloaded_worker_pool",Ft=function(){this.active={}};Ft.prototype.acquire=function(t){if(!this.workers)for(this.workers=[];this.workers.length0?(i-o)/s:0;return this.points[a].mult(1-l).add(this.points[r].mult(l))};var Qt=function(t,e,r){var n=this.boxCells=[],i=this.circleCells=[];this.xCellCount=Math.ceil(t/r),this.yCellCount=Math.ceil(e/r);for(var a=0;a=-e[0]&&r<=e[0]&&n>=-e[1]&&n<=e[1]}function ae(e,r,n,i,a,o,s,l){var u=i?e.textSizeData:e.iconSizeData,c=t.evaluateSizeForZoom(u,n.transform.zoom),f=[256/n.width*2+1,256/n.height*2+1],h=i?e.text.dynamicLayoutVertexArray:e.icon.dynamicLayoutVertexArray;h.clear();for(var p=e.lineVertexArray,d=i?e.text.placedSymbolArray:e.icon.placedSymbolArray,v=n.transform.width/n.transform.height,g=!1,y=0;yMath.abs(n.x-r.x)*i?{useVertical:!0}:(e===t.WritingMode.vertical?r.yn.x)?{needsFlipping:!0}:null}function le(e,r,n,i,a,o,s,l,u,c,f,h,p,d){var v,g=r/24,y=e.lineOffsetX*g,m=e.lineOffsetY*g;if(e.numGlyphs>1){var x=e.glyphStartIndex+e.numGlyphs,b=e.lineStartIndex,_=e.lineStartIndex+e.lineLength,w=oe(g,l,y,m,n,f,h,e,u,o,p);if(!w)return{notEnoughRoom:!0};var T=re(w.first.point,s).point,k=re(w.last.point,s).point;if(i&&!n){var A=se(e.writingMode,T,k,d);if(A)return A}v=[w.first];for(var M=e.glyphStartIndex+1;M0?C.point:ue(h,L,S,1,a),O=se(e.writingMode,S,P,d);if(O)return O}var I=ce(g*l.getoffsetX(e.glyphStartIndex),y,m,n,f,h,e.segment,e.lineStartIndex,e.lineStartIndex+e.lineLength,u,o,p);if(!I)return{notEnoughRoom:!0};v=[I]}for(var D=0,z=v;D0?1:-1,v=0;i&&(d*=-1,v=Math.PI),d<0&&(v+=Math.PI);for(var g=d>0?l+s:l+s+1,y=a,m=a,x=0,b=0,_=Math.abs(p),w=[];x+b<=_;){if((g+=d)=u)return null;if(m=y,w.push(y),void 0===(y=h[g])){var T=new t.Point(c.getx(g),c.gety(g)),k=re(T,f);if(k.signedDistanceFromCamera>0)y=h[g]=k.point;else{var A=g-d;y=ue(0===x?o:new t.Point(c.getx(A),c.gety(A)),T,m,_-x+1,f)}}x+=b,b=m.dist(y)}var M=(_-x)/b,S=y.sub(m),E=S.mult(M)._add(m);E._add(S._unit()._perp()._mult(n*d));var L=v+Math.atan2(y.y-m.y,y.x-m.x);return w.push(E),{point:E,angle:L,path:w}}Qt.prototype.keysLength=function(){return this.boxKeys.length+this.circleKeys.length},Qt.prototype.insert=function(t,e,r,n,i){this._forEachCell(e,r,n,i,this._insertBoxCell,this.boxUid++),this.boxKeys.push(t),this.bboxes.push(e),this.bboxes.push(r),this.bboxes.push(n),this.bboxes.push(i)},Qt.prototype.insertCircle=function(t,e,r,n){this._forEachCell(e-n,r-n,e+n,r+n,this._insertCircleCell,this.circleUid++),this.circleKeys.push(t),this.circles.push(e),this.circles.push(r),this.circles.push(n)},Qt.prototype._insertBoxCell=function(t,e,r,n,i,a){this.boxCells[i].push(a)},Qt.prototype._insertCircleCell=function(t,e,r,n,i,a){this.circleCells[i].push(a)},Qt.prototype._query=function(t,e,r,n,i,a){if(r<0||t>this.width||n<0||e>this.height)return!i&&[];var o=[];if(t<=0&&e<=0&&this.width<=r&&this.height<=n){if(i)return!0;for(var s=0;s0:o},Qt.prototype._queryCircle=function(t,e,r,n,i){var a=t-r,o=t+r,s=e-r,l=e+r;if(o<0||a>this.width||l<0||s>this.height)return!n&&[];var u=[],c={hitTest:n,circle:{x:t,y:e,radius:r},seenUids:{box:{},circle:{}}};return this._forEachCell(a,s,o,l,this._queryCellCircle,u,c,i),n?u.length>0:u},Qt.prototype.query=function(t,e,r,n,i){return this._query(t,e,r,n,!1,i)},Qt.prototype.hitTest=function(t,e,r,n,i){return this._query(t,e,r,n,!0,i)},Qt.prototype.hitTestCircle=function(t,e,r,n){return this._queryCircle(t,e,r,!0,n)},Qt.prototype._queryCell=function(t,e,r,n,i,a,o,s){var l=o.seenUids,u=this.boxCells[i];if(null!==u)for(var c=this.bboxes,f=0,h=u;f=c[d+0]&&n>=c[d+1]&&(!s||s(this.boxKeys[p]))){if(o.hitTest)return a.push(!0),!0;a.push({key:this.boxKeys[p],x1:c[d],y1:c[d+1],x2:c[d+2],y2:c[d+3]})}}}var v=this.circleCells[i];if(null!==v)for(var g=this.circles,y=0,m=v;yo*o+s*s},Qt.prototype._circleAndRectCollide=function(t,e,r,n,i,a,o){var s=(a-n)/2,l=Math.abs(t-(n+s));if(l>s+r)return!1;var u=(o-i)/2,c=Math.abs(e-(i+u));if(c>u+r)return!1;if(l<=s||c<=u)return!0;var f=l-s,h=c-u;return f*f+h*h<=r*r};var fe=new Float32Array([-1/0,-1/0,0,-1/0,-1/0,0,-1/0,-1/0,0,-1/0,-1/0,0]);function he(t,e){for(var r=0;r=1;P--)C.push(E.path[P]);for(var O=1;O0){for(var R=C[0].clone(),F=C[0].clone(),B=1;B=A.x&&F.x<=M.x&&R.y>=A.y&&F.y<=M.y?[C]:F.xM.x||F.yM.y?[]:t.clipLine([C],A.x,A.y,M.x,M.y)}for(var N=0,j=z;N=this.screenRightBoundary||nthis.screenBottomBoundary},ve.prototype.isInsideGrid=function(t,e,r,n){return r>=0&&t=0&&e0?(this.prevPlacement&&this.prevPlacement.variableOffsets[f.crossTileID]&&this.prevPlacement.placements[f.crossTileID]&&this.prevPlacement.placements[f.crossTileID].text&&(v=this.prevPlacement.variableOffsets[f.crossTileID].anchor),this.variableOffsets[f.crossTileID]={textOffset:g,width:r,height:n,anchor:t,textBoxScale:i,prevAnchor:v},this.markUsedJustification(h,t,f,p),h.allowVerticalPlacement&&(this.markUsedOrientation(h,p,f),this.placedOrientations[f.crossTileID]=p),{shift:y,placedGlyphBoxes:m}):void 0},Ae.prototype.placeLayerBucketPart=function(e,r,n){var i=this,a=e.parameters,o=a.bucket,s=a.layout,l=a.posMatrix,u=a.textLabelPlaneMatrix,c=a.labelToScreenMatrix,f=a.textPixelRatio,h=a.holdingForFade,p=a.collisionBoxArray,d=a.partiallyEvaluatedTextSize,v=a.collisionGroup,g=s.get("text-optional"),y=s.get("icon-optional"),m=s.get("text-allow-overlap"),x=s.get("icon-allow-overlap"),b="map"===s.get("text-rotation-alignment"),_="map"===s.get("text-pitch-alignment"),w="none"!==s.get("icon-text-fit"),T="viewport-y"===s.get("symbol-z-order"),k=m&&(x||!o.hasIconData()||y),A=x&&(m||!o.hasTextData()||g);!o.collisionArrays&&p&&o.deserializeCollisionBoxes(p);var M=function(e,a){if(!r[e.crossTileID])if(h)i.placements[e.crossTileID]=new xe(!1,!1,!1);else{var p,T=!1,M=!1,S=!0,E=null,L={box:null,offscreen:null},C={box:null,offscreen:null},P=null,O=null,I=0,D=0,z=0;a.textFeatureIndex?I=a.textFeatureIndex:e.useRuntimeCollisionCircles&&(I=e.featureIndex),a.verticalTextFeatureIndex&&(D=a.verticalTextFeatureIndex);var R=a.textBox;if(R){var F=function(r){var n=t.WritingMode.horizontal;if(o.allowVerticalPlacement&&!r&&i.prevPlacement){var a=i.prevPlacement.placedOrientations[e.crossTileID];a&&(i.placedOrientations[e.crossTileID]=a,n=a,i.markUsedOrientation(o,n,e))}return n},B=function(r,n){if(o.allowVerticalPlacement&&e.numVerticalGlyphVertices>0&&a.verticalTextBox)for(var i=0,s=o.writingModes;i0&&(N=N.filter((function(t){return t!==j.anchor}))).unshift(j.anchor)}var U=function(t,r,n){for(var a=t.x2-t.x1,s=t.y2-t.y1,u=e.textBoxScale,c=w&&!x?r:null,h={box:[],offscreen:!1},p=m?2*N.length:N.length,d=0;d=N.length,k=i.attemptAnchorPlacement(g,t,a,s,u,b,_,f,l,v,y,e,o,n,c);if(k&&(h=k.placedGlyphBoxes)&&h.box&&h.box.length){T=!0,E=k.shift;break}}return h};B((function(){return U(R,a.iconBox,t.WritingMode.horizontal)}),(function(){var r=a.verticalTextBox,n=L&&L.box&&L.box.length;return o.allowVerticalPlacement&&!n&&e.numVerticalGlyphVertices>0&&r?U(r,a.verticalIconBox,t.WritingMode.vertical):{box:null,offscreen:null}})),L&&(T=L.box,S=L.offscreen);var V=F(L&&L.box);if(!T&&i.prevPlacement){var H=i.prevPlacement.variableOffsets[e.crossTileID];H&&(i.variableOffsets[e.crossTileID]=H,i.markUsedJustification(o,H.anchor,e,V))}}else{var q=function(t,r){var n=i.collisionIndex.placeCollisionBox(t,m,f,l,v.predicate);return n&&n.box&&n.box.length&&(i.markUsedOrientation(o,r,e),i.placedOrientations[e.crossTileID]=r),n};B((function(){return q(R,t.WritingMode.horizontal)}),(function(){var r=a.verticalTextBox;return o.allowVerticalPlacement&&e.numVerticalGlyphVertices>0&&r?q(r,t.WritingMode.vertical):{box:null,offscreen:null}})),F(L&&L.box&&L.box.length)}}if(T=(p=L)&&p.box&&p.box.length>0,S=p&&p.offscreen,e.useRuntimeCollisionCircles){var G=o.text.placedSymbolArray.get(e.centerJustifiedTextSymbolIndex),Z=t.evaluateSizeForFeature(o.textSizeData,d,G),Y=s.get("text-padding"),W=e.collisionCircleDiameter;P=i.collisionIndex.placeCollisionCircles(m,G,o.lineVertexArray,o.glyphOffsetArray,Z,l,u,c,n,_,v.predicate,W,Y),T=m||P.circles.length>0&&!P.collisionDetected,S=S&&P.offscreen}if(a.iconFeatureIndex&&(z=a.iconFeatureIndex),a.iconBox){var X=function(t){var e=w&&E?ke(t,E.x,E.y,b,_,i.transform.angle):t;return i.collisionIndex.placeCollisionBox(e,x,f,l,v.predicate)};M=C&&C.box&&C.box.length&&a.verticalIconBox?(O=X(a.verticalIconBox)).box.length>0:(O=X(a.iconBox)).box.length>0,S=S&&O.offscreen}var J=g||0===e.numHorizontalGlyphVertices&&0===e.numVerticalGlyphVertices,K=y||0===e.numIconVertices;if(J||K?K?J||(M=M&&T):T=M&&T:M=T=M&&T,T&&p&&p.box&&(C&&C.box&&D?i.collisionIndex.insertCollisionBox(p.box,s.get("text-ignore-placement"),o.bucketInstanceId,D,v.ID):i.collisionIndex.insertCollisionBox(p.box,s.get("text-ignore-placement"),o.bucketInstanceId,I,v.ID)),M&&O&&i.collisionIndex.insertCollisionBox(O.box,s.get("icon-ignore-placement"),o.bucketInstanceId,z,v.ID),P&&(T&&i.collisionIndex.insertCollisionCircles(P.circles,s.get("text-ignore-placement"),o.bucketInstanceId,I,v.ID),n)){var $=o.bucketInstanceId,Q=i.collisionCircleArrays[$];void 0===Q&&(Q=i.collisionCircleArrays[$]=new be);for(var tt=0;tt=0;--E){var L=S[E];M(o.symbolInstances.get(L),o.collisionArrays[L])}else for(var C=e.symbolInstanceStart;C=0&&(e.text.placedSymbolArray.get(u).crossTileID=a>=0&&u!==a?0:n.crossTileID)}},Ae.prototype.markUsedOrientation=function(e,r,n){for(var i=r===t.WritingMode.horizontal||r===t.WritingMode.horizontalOnly?r:0,a=r===t.WritingMode.vertical?r:0,o=0,s=[n.leftJustifiedTextSymbolIndex,n.centerJustifiedTextSymbolIndex,n.rightJustifiedTextSymbolIndex];o0||l>0,x=a.numIconVertices>0,b=i.placedOrientations[a.crossTileID],_=b===t.WritingMode.vertical,w=b===t.WritingMode.horizontal||b===t.WritingMode.horizontalOnly;if(m){var T=De(y.text),k=_?ze:T;d(e.text,s,k);var A=w?ze:T;d(e.text,l,A);var M=y.text.isHidden();[a.rightJustifiedTextSymbolIndex,a.centerJustifiedTextSymbolIndex,a.leftJustifiedTextSymbolIndex].forEach((function(t){t>=0&&(e.text.placedSymbolArray.get(t).hidden=M||_?1:0)})),a.verticalPlacedTextSymbolIndex>=0&&(e.text.placedSymbolArray.get(a.verticalPlacedTextSymbolIndex).hidden=M||w?1:0);var S=i.variableOffsets[a.crossTileID];S&&i.markUsedJustification(e,S.anchor,a,b);var E=i.placedOrientations[a.crossTileID];E&&(i.markUsedJustification(e,"left",a,E),i.markUsedOrientation(e,E,a))}if(x){var L=De(y.icon),C=!(h&&a.verticalPlacedIconSymbolIndex&&_);if(a.placedIconSymbolIndex>=0){var P=C?L:ze;d(e.icon,a.numIconVertices,P),e.icon.placedSymbolArray.get(a.placedIconSymbolIndex).hidden=y.icon.isHidden()}if(a.verticalPlacedIconSymbolIndex>=0){var O=C?ze:L;d(e.icon,a.numVerticalIconVertices,O),e.icon.placedSymbolArray.get(a.verticalPlacedIconSymbolIndex).hidden=y.icon.isHidden()}}if(e.hasIconCollisionBoxData()||e.hasTextCollisionBoxData()){var I=e.collisionArrays[n];if(I){var D=new t.Point(0,0);if(I.textBox||I.verticalTextBox){var z=!0;if(u){var R=i.variableOffsets[v];R?(D=Te(R.anchor,R.width,R.height,R.textOffset,R.textBoxScale),c&&D._rotate(f?i.transform.angle:-i.transform.angle)):z=!1}I.textBox&&Me(e.textCollisionBox.collisionVertexArray,y.text.placed,!z||_,D.x,D.y),I.verticalTextBox&&Me(e.textCollisionBox.collisionVertexArray,y.text.placed,!z||w,D.x,D.y)}var F=Boolean(!w&&I.verticalIconBox);I.iconBox&&Me(e.iconCollisionBox.collisionVertexArray,y.icon.placed,F,h?D.x:0,h?D.y:0),I.verticalIconBox&&Me(e.iconCollisionBox.collisionVertexArray,y.icon.placed,!F,h?D.x:0,h?D.y:0)}}},g=0;gt},Ae.prototype.setStale=function(){this.stale=!0};var Se=Math.pow(2,25),Ee=Math.pow(2,24),Le=Math.pow(2,17),Ce=Math.pow(2,16),Pe=Math.pow(2,9),Oe=Math.pow(2,8),Ie=Math.pow(2,1);function De(t){if(0===t.opacity&&!t.placed)return 0;if(1===t.opacity&&t.placed)return 4294967295;var e=t.placed?1:0,r=Math.floor(127*t.opacity);return r*Se+e*Ee+r*Le+e*Ce+r*Pe+e*Oe+r*Ie+e}var ze=0,Re=function(t){this._sortAcrossTiles="viewport-y"!==t.layout.get("symbol-z-order")&&void 0!==t.layout.get("symbol-sort-key").constantOr(1),this._currentTileIndex=0,this._currentPartIndex=0,this._seenCrossTileIDs={},this._bucketParts=[]};Re.prototype.continuePlacement=function(t,e,r,n,i){for(var a=this._bucketParts;this._currentTileIndex2};this._currentPlacementIndex>=0;){var s=r[e[this._currentPlacementIndex]],l=this.placement.collisionIndex.transform.zoom;if("symbol"===s.type&&(!s.minzoom||s.minzoom<=l)&&(!s.maxzoom||s.maxzoom>l)){if(this._inProgressLayer||(this._inProgressLayer=new Re(s)),this._inProgressLayer.continuePlacement(n[s.source],this.placement,this._showCollisionBoxes,s,o))return;delete this._inProgressLayer}this._currentPlacementIndex--}this._done=!0},Fe.prototype.commit=function(t){return this.placement.commit(t),this.placement};var Be=512/t.EXTENT/2,Ne=function(t,e,r){this.tileID=t,this.indexedSymbolInstances={},this.bucketInstanceId=r;for(var n=0;nt.overscaledZ)for(var s in o){var l=o[s];l.tileID.isChildOf(t)&&l.findMatches(e.symbolInstances,t,i)}else{var u=o[t.scaledTo(Number(a)).key];u&&u.findMatches(e.symbolInstances,t,i)}}for(var c=0;c1?"@2x":"",l=t.getJSON(r.transformRequest(r.normalizeSpriteURL(e,s,".json"),t.ResourceType.SpriteJSON),(function(t,e){l=null,o||(o=t,i=e,c())})),u=t.getImage(r.transformRequest(r.normalizeSpriteURL(e,s,".png"),t.ResourceType.SpriteImage),(function(t,e){u=null,o||(o=t,a=e,c())}));function c(){if(o)n(o);else if(i&&a){var e=t.browser.getImageData(a),r={};for(var s in i){var l=i[s],u=l.width,c=l.height,f=l.x,h=l.y,p=l.sdf,d=l.pixelRatio,v=l.stretchX,g=l.stretchY,y=l.content,m=new t.RGBAImage({width:u,height:c});t.RGBAImage.copy(e,m,{x:f,y:h},{x:0,y:0},{width:u,height:c}),r[s]={data:m,pixelRatio:d,sdf:p,stretchX:v,stretchY:g,content:y}}n(null,r)}}return{cancel:function(){l&&(l.cancel(),l=null),u&&(u.cancel(),u=null)}}}(e,this.map._requestManager,(function(e,n){if(r._spriteRequest=null,e)r.fire(new t.ErrorEvent(e));else if(n)for(var i in n)r.imageManager.addImage(i,n[i]);r.imageManager.setLoaded(!0),r._availableImages=r.imageManager.listImages(),r.dispatcher.broadcast("setImages",r._availableImages),r.fire(new t.Event("data",{dataType:"style"}))}))},r.prototype._validateLayer=function(e){var r=this.sourceCaches[e.source];if(r){var n=e.sourceLayer;if(n){var i=r.getSource();("geojson"===i.type||i.vectorLayerIds&&-1===i.vectorLayerIds.indexOf(n))&&this.fire(new t.ErrorEvent(new Error('Source layer "'+n+'" does not exist on source "'+i.id+'" as specified by style layer "'+e.id+'"')))}}},r.prototype.loaded=function(){if(!this._loaded)return!1;if(Object.keys(this._updatedSources).length)return!1;for(var t in this.sourceCaches)if(!this.sourceCaches[t].loaded())return!1;return!!this.imageManager.isLoaded()},r.prototype._serializeLayers=function(t){for(var e=[],r=0,n=t;r0)throw new Error("Unimplemented: "+i.map((function(t){return t.command})).join(", ")+".");return n.forEach((function(t){"setTransition"!==t.command&&r[t.command].apply(r,t.args)})),this.stylesheet=e,!0},r.prototype.addImage=function(e,r){if(this.getImage(e))return this.fire(new t.ErrorEvent(new Error("An image with this name already exists.")));this.imageManager.addImage(e,r),this._availableImages=this.imageManager.listImages(),this._changedImages[e]=!0,this._changed=!0,this.fire(new t.Event("data",{dataType:"style"}))},r.prototype.updateImage=function(t,e){this.imageManager.updateImage(t,e)},r.prototype.getImage=function(t){return this.imageManager.getImage(t)},r.prototype.removeImage=function(e){if(!this.getImage(e))return this.fire(new t.ErrorEvent(new Error("No image with this name exists.")));this.imageManager.removeImage(e),this._availableImages=this.imageManager.listImages(),this._changedImages[e]=!0,this._changed=!0,this.fire(new t.Event("data",{dataType:"style"}))},r.prototype.listImages=function(){return this._checkLoaded(),this.imageManager.listImages()},r.prototype.addSource=function(e,r,n){var i=this;if(void 0===n&&(n={}),this._checkLoaded(),void 0!==this.sourceCaches[e])throw new Error("There is already a source with this ID");if(!r.type)throw new Error("The type property must be defined, but the only the following properties were given: "+Object.keys(r).join(", ")+".");if(!(["vector","raster","geojson","video","image"].indexOf(r.type)>=0&&this._validate(t.validateStyle.source,"sources."+e,r,null,n))){this.map&&this.map._collectResourceTiming&&(r.collectResourceTiming=!0);var a=this.sourceCaches[e]=new Ot(e,r,this.dispatcher);a.style=this,a.setEventedParent(this,(function(){return{isSourceLoaded:i.loaded(),source:a.serialize(),sourceId:e}})),a.onAdd(this.map),this._changed=!0}},r.prototype.removeSource=function(e){if(this._checkLoaded(),void 0===this.sourceCaches[e])throw new Error("There is no source with this ID");for(var r in this._layers)if(this._layers[r].source===e)return this.fire(new t.ErrorEvent(new Error('Source "'+e+'" cannot be removed while layer "'+r+'" is using it.')));var n=this.sourceCaches[e];delete this.sourceCaches[e],delete this._updatedSources[e],n.fire(new t.Event("data",{sourceDataType:"metadata",dataType:"source",sourceId:e})),n.setEventedParent(null),n.clearTiles(),n.onRemove&&n.onRemove(this.map),this._changed=!0},r.prototype.setGeoJSONSourceData=function(t,e){this._checkLoaded(),this.sourceCaches[t].getSource().setData(e),this._changed=!0},r.prototype.getSource=function(t){return this.sourceCaches[t]&&this.sourceCaches[t].getSource()},r.prototype.addLayer=function(e,r,n){void 0===n&&(n={}),this._checkLoaded();var i=e.id;if(this.getLayer(i))this.fire(new t.ErrorEvent(new Error('Layer with id "'+i+'" already exists on this map')));else{var a;if("custom"===e.type){if(He(this,t.validateCustomStyleLayer(e)))return;a=t.createStyleLayer(e)}else{if("object"==typeof e.source&&(this.addSource(i,e.source),e=t.clone$1(e),e=t.extend(e,{source:i})),this._validate(t.validateStyle.layer,"layers."+i,e,{arrayIndex:-1},n))return;a=t.createStyleLayer(e),this._validateLayer(a),a.setEventedParent(this,{layer:{id:i}}),this._serializedLayers[a.id]=a.serialize()}var o=r?this._order.indexOf(r):this._order.length;if(r&&-1===o)this.fire(new t.ErrorEvent(new Error('Layer with id "'+r+'" does not exist on this map.')));else{if(this._order.splice(o,0,i),this._layerOrderChanged=!0,this._layers[i]=a,this._removedLayers[i]&&a.source&&"custom"!==a.type){var s=this._removedLayers[i];delete this._removedLayers[i],s.type!==a.type?this._updatedSources[a.source]="clear":(this._updatedSources[a.source]="reload",this.sourceCaches[a.source].pause())}this._updateLayer(a),a.onAdd&&a.onAdd(this.map)}}},r.prototype.moveLayer=function(e,r){if(this._checkLoaded(),this._changed=!0,this._layers[e]){if(e!==r){var n=this._order.indexOf(e);this._order.splice(n,1);var i=r?this._order.indexOf(r):this._order.length;r&&-1===i?this.fire(new t.ErrorEvent(new Error('Layer with id "'+r+'" does not exist on this map.'))):(this._order.splice(i,0,e),this._layerOrderChanged=!0)}}else this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style and cannot be moved.")))},r.prototype.removeLayer=function(e){this._checkLoaded();var r=this._layers[e];if(r){r.setEventedParent(null);var n=this._order.indexOf(e);this._order.splice(n,1),this._layerOrderChanged=!0,this._changed=!0,this._removedLayers[e]=r,delete this._layers[e],delete this._serializedLayers[e],delete this._updatedLayers[e],delete this._updatedPaintProps[e],r.onRemove&&r.onRemove(this.map)}else this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style and cannot be removed.")))},r.prototype.getLayer=function(t){return this._layers[t]},r.prototype.hasLayer=function(t){return t in this._layers},r.prototype.setLayerZoomRange=function(e,r,n){this._checkLoaded();var i=this.getLayer(e);i?i.minzoom===r&&i.maxzoom===n||(null!=r&&(i.minzoom=r),null!=n&&(i.maxzoom=n),this._updateLayer(i)):this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style and cannot have zoom extent.")))},r.prototype.setFilter=function(e,r,n){void 0===n&&(n={}),this._checkLoaded();var i=this.getLayer(e);if(i){if(!t.deepEqual(i.filter,r))return null==r?(i.filter=void 0,void this._updateLayer(i)):void(this._validate(t.validateStyle.filter,"layers."+i.id+".filter",r,null,n)||(i.filter=t.clone$1(r),this._updateLayer(i)))}else this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style and cannot be filtered.")))},r.prototype.getFilter=function(e){return t.clone$1(this.getLayer(e).filter)},r.prototype.setLayoutProperty=function(e,r,n,i){void 0===i&&(i={}),this._checkLoaded();var a=this.getLayer(e);a?t.deepEqual(a.getLayoutProperty(r),n)||(a.setLayoutProperty(r,n,i),this._updateLayer(a)):this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style and cannot be styled.")))},r.prototype.getLayoutProperty=function(e,r){var n=this.getLayer(e);if(n)return n.getLayoutProperty(r);this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style.")))},r.prototype.setPaintProperty=function(e,r,n,i){void 0===i&&(i={}),this._checkLoaded();var a=this.getLayer(e);a?t.deepEqual(a.getPaintProperty(r),n)||(a.setPaintProperty(r,n,i)&&this._updateLayer(a),this._changed=!0,this._updatedPaintProps[e]=!0):this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style and cannot be styled.")))},r.prototype.getPaintProperty=function(t,e){return this.getLayer(t).getPaintProperty(e)},r.prototype.setFeatureState=function(e,r){this._checkLoaded();var n=e.source,i=e.sourceLayer,a=this.sourceCaches[n];if(void 0!==a){var o=a.getSource().type;"geojson"===o&&i?this.fire(new t.ErrorEvent(new Error("GeoJSON sources cannot have a sourceLayer parameter."))):"vector"!==o||i?(void 0===e.id&&this.fire(new t.ErrorEvent(new Error("The feature id parameter must be provided."))),a.setFeatureState(i,e.id,r)):this.fire(new t.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types.")))}else this.fire(new t.ErrorEvent(new Error("The source '"+n+"' does not exist in the map's style.")))},r.prototype.removeFeatureState=function(e,r){this._checkLoaded();var n=e.source,i=this.sourceCaches[n];if(void 0!==i){var a=i.getSource().type,o="vector"===a?e.sourceLayer:void 0;"vector"!==a||o?r&&"string"!=typeof e.id&&"number"!=typeof e.id?this.fire(new t.ErrorEvent(new Error("A feature id is requred to remove its specific state property."))):i.removeFeatureState(o,e.id,r):this.fire(new t.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types.")))}else this.fire(new t.ErrorEvent(new Error("The source '"+n+"' does not exist in the map's style.")))},r.prototype.getFeatureState=function(e){this._checkLoaded();var r=e.source,n=e.sourceLayer,i=this.sourceCaches[r];if(void 0!==i){if("vector"!==i.getSource().type||n)return void 0===e.id&&this.fire(new t.ErrorEvent(new Error("The feature id parameter must be provided."))),i.getFeatureState(n,e.id);this.fire(new t.ErrorEvent(new Error("The sourceLayer parameter must be provided for vector source types.")))}else this.fire(new t.ErrorEvent(new Error("The source '"+r+"' does not exist in the map's style.")))},r.prototype.getTransition=function(){return t.extend({duration:300,delay:0},this.stylesheet&&this.stylesheet.transition)},r.prototype.serialize=function(){return t.filterObject({version:this.stylesheet.version,name:this.stylesheet.name,metadata:this.stylesheet.metadata,light:this.stylesheet.light,center:this.stylesheet.center,zoom:this.stylesheet.zoom,bearing:this.stylesheet.bearing,pitch:this.stylesheet.pitch,sprite:this.stylesheet.sprite,glyphs:this.stylesheet.glyphs,transition:this.stylesheet.transition,sources:t.mapObject(this.sourceCaches,(function(t){return t.serialize()})),layers:this._serializeLayers(this._order)},(function(t){return void 0!==t}))},r.prototype._updateLayer=function(t){this._updatedLayers[t.id]=!0,t.source&&!this._updatedSources[t.source]&&"raster"!==this.sourceCaches[t.source].getSource().type&&(this._updatedSources[t.source]="reload",this.sourceCaches[t.source].pause()),this._changed=!0},r.prototype._flattenAndSortRenderedFeatures=function(t){for(var e=this,r=function(t){return"fill-extrusion"===e._layers[t].type},n={},i=[],a=this._order.length-1;a>=0;a--){var o=this._order[a];if(r(o)){n[o]=a;for(var s=0,l=t;s=0;d--){var v=this._order[d];if(r(v))for(var g=i.length-1;g>=0;g--){var y=i[g].feature;if(n[y.layer.id] 0.5) {gl_FragColor=vec4(0.0,0.0,1.0,0.5)*alpha;}if (v_notUsed > 0.5) {gl_FragColor*=.1;}}","attribute vec2 a_pos;attribute vec2 a_anchor_pos;attribute vec2 a_extrude;attribute vec2 a_placed;attribute vec2 a_shift;uniform mat4 u_matrix;uniform vec2 u_extrude_scale;uniform float u_camera_to_center_distance;varying float v_placed;varying float v_notUsed;void main() {vec4 projectedPoint=u_matrix*vec4(a_anchor_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float collision_perspective_ratio=clamp(0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);gl_Position=u_matrix*vec4(a_pos,0.0,1.0);gl_Position.xy+=(a_extrude+a_shift)*u_extrude_scale*gl_Position.w*collision_perspective_ratio;v_placed=a_placed.x;v_notUsed=a_placed.y;}"),nr=_r("varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;void main() {float alpha=0.5*min(v_perspective_ratio,1.0);float stroke_radius=0.9*max(v_perspective_ratio,1.0);float distance_to_center=length(v_extrude);float distance_to_edge=abs(distance_to_center-v_radius);float opacity_t=smoothstep(-stroke_radius,0.0,-distance_to_edge);vec4 color=mix(vec4(0.0,0.0,1.0,0.5),vec4(1.0,0.0,0.0,1.0),v_collision);gl_FragColor=color*alpha*opacity_t;}","attribute vec2 a_pos;attribute float a_radius;attribute vec2 a_flags;uniform mat4 u_matrix;uniform mat4 u_inv_matrix;uniform vec2 u_viewport_size;uniform float u_camera_to_center_distance;varying float v_radius;varying vec2 v_extrude;varying float v_perspective_ratio;varying float v_collision;vec3 toTilePosition(vec2 screenPos) {vec4 rayStart=u_inv_matrix*vec4(screenPos,-1.0,1.0);vec4 rayEnd =u_inv_matrix*vec4(screenPos, 1.0,1.0);rayStart.xyz/=rayStart.w;rayEnd.xyz /=rayEnd.w;highp float t=(0.0-rayStart.z)/(rayEnd.z-rayStart.z);return mix(rayStart.xyz,rayEnd.xyz,t);}void main() {vec2 quadCenterPos=a_pos;float radius=a_radius;float collision=a_flags.x;float vertexIdx=a_flags.y;vec2 quadVertexOffset=vec2(mix(-1.0,1.0,float(vertexIdx >=2.0)),mix(-1.0,1.0,float(vertexIdx >=1.0 && vertexIdx <=2.0)));vec2 quadVertexExtent=quadVertexOffset*radius;vec3 tilePos=toTilePosition(quadCenterPos);vec4 clipPos=u_matrix*vec4(tilePos,1.0);highp float camera_to_anchor_distance=clipPos.w;highp float collision_perspective_ratio=clamp(0.5+0.5*(u_camera_to_center_distance/camera_to_anchor_distance),0.0,4.0);float padding_factor=1.2;v_radius=radius;v_extrude=quadVertexExtent*padding_factor;v_perspective_ratio=collision_perspective_ratio;v_collision=collision;gl_Position=vec4(clipPos.xyz/clipPos.w,1.0)+vec4(quadVertexExtent*padding_factor/u_viewport_size*2.0,0.0,0.0);}"),ir=_r("uniform highp vec4 u_color;uniform sampler2D u_overlay;varying vec2 v_uv;void main() {vec4 overlay_color=texture2D(u_overlay,v_uv);gl_FragColor=mix(u_color,overlay_color,overlay_color.a);}","attribute vec2 a_pos;varying vec2 v_uv;uniform mat4 u_matrix;uniform float u_overlay_scale;void main() {v_uv=a_pos/8192.0;gl_Position=u_matrix*vec4(a_pos*u_overlay_scale,0,1);}"),ar=_r("#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float opacity\ngl_FragColor=color*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","attribute vec2 a_pos;uniform mat4 u_matrix;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float opacity\ngl_Position=u_matrix*vec4(a_pos,0,1);}"),or=_r("varying vec2 v_pos;\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 outline_color\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=outline_color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","attribute vec2 a_pos;uniform mat4 u_matrix;uniform vec2 u_world;varying vec2 v_pos;\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 outline_color\n#pragma mapbox: initialize lowp float opacity\ngl_Position=u_matrix*vec4(a_pos,0,1);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}"),sr=_r("uniform vec2 u_texsize;uniform sampler2D u_image;uniform float u_fade;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);float dist=length(v_pos-gl_FragCoord.xy);float alpha=1.0-smoothstep(0.0,1.0,dist);gl_FragColor=mix(color1,color2,u_fade)*alpha*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_world;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec2 v_pos;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;gl_Position=u_matrix*vec4(a_pos,0,1);vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,a_pos);v_pos=(gl_Position.xy/gl_Position.w+1.0)/2.0*u_world;}"),lr=_r("uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);gl_FragColor=mix(color1,color2,u_fade)*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform vec3 u_scale;attribute vec2 a_pos;varying vec2 v_pos_a;varying vec2 v_pos_b;\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;gl_Position=u_matrix*vec4(a_pos,0,1);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileZoomRatio,a_pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileZoomRatio,a_pos);}"),ur=_r("varying vec4 v_color;void main() {gl_FragColor=v_color;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;uniform float u_vertical_gradient;uniform lowp float u_opacity;attribute vec2 a_pos;attribute vec4 a_normal_ed;varying vec4 v_color;\n#pragma mapbox: define highp float base\n#pragma mapbox: define highp float height\n#pragma mapbox: define highp vec4 color\nvoid main() {\n#pragma mapbox: initialize highp float base\n#pragma mapbox: initialize highp float height\n#pragma mapbox: initialize highp vec4 color\nvec3 normal=a_normal_ed.xyz;base=max(0.0,base);height=max(0.0,height);float t=mod(normal.x,2.0);gl_Position=u_matrix*vec4(a_pos,t > 0.0 ? height : base,1);float colorvalue=color.r*0.2126+color.g*0.7152+color.b*0.0722;v_color=vec4(0.0,0.0,0.0,1.0);vec4 ambientlight=vec4(0.03,0.03,0.03,1.0);color+=ambientlight;float directional=clamp(dot(normal/16384.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((1.0-colorvalue+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_color.r+=clamp(color.r*directional*u_lightcolor.r,mix(0.0,0.3,1.0-u_lightcolor.r),1.0);v_color.g+=clamp(color.g*directional*u_lightcolor.g,mix(0.0,0.3,1.0-u_lightcolor.g),1.0);v_color.b+=clamp(color.b*directional*u_lightcolor.b,mix(0.0,0.3,1.0-u_lightcolor.b),1.0);v_color*=u_opacity;}"),cr=_r("uniform vec2 u_texsize;uniform float u_fade;uniform sampler2D u_image;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float base\n#pragma mapbox: initialize lowp float height\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;vec2 imagecoord=mod(v_pos_a,1.0);vec2 pos=mix(pattern_tl_a/u_texsize,pattern_br_a/u_texsize,imagecoord);vec4 color1=texture2D(u_image,pos);vec2 imagecoord_b=mod(v_pos_b,1.0);vec2 pos2=mix(pattern_tl_b/u_texsize,pattern_br_b/u_texsize,imagecoord_b);vec4 color2=texture2D(u_image,pos2);vec4 mixedColor=mix(color1,color2,u_fade);gl_FragColor=mixedColor*v_lighting;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_pixel_coord_upper;uniform vec2 u_pixel_coord_lower;uniform float u_height_factor;uniform vec3 u_scale;uniform float u_vertical_gradient;uniform lowp float u_opacity;uniform vec3 u_lightcolor;uniform lowp vec3 u_lightpos;uniform lowp float u_lightintensity;attribute vec2 a_pos;attribute vec4 a_normal_ed;varying vec2 v_pos_a;varying vec2 v_pos_b;varying vec4 v_lighting;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float base\n#pragma mapbox: initialize lowp float height\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec3 normal=a_normal_ed.xyz;float edgedistance=a_normal_ed.w;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;base=max(0.0,base);height=max(0.0,height);float t=mod(normal.x,2.0);float z=t > 0.0 ? height : base;gl_Position=u_matrix*vec4(a_pos,z,1);vec2 pos=normal.x==1.0 && normal.y==0.0 && normal.z==16384.0\n? a_pos\n: vec2(edgedistance,z*u_height_factor);v_pos_a=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,fromScale*display_size_a,tileRatio,pos);v_pos_b=get_pattern_pos(u_pixel_coord_upper,u_pixel_coord_lower,toScale*display_size_b,tileRatio,pos);v_lighting=vec4(0.0,0.0,0.0,1.0);float directional=clamp(dot(normal/16383.0,u_lightpos),0.0,1.0);directional=mix((1.0-u_lightintensity),max((0.5+u_lightintensity),1.0),directional);if (normal.y !=0.0) {directional*=((1.0-u_vertical_gradient)+(u_vertical_gradient*clamp((t+base)*pow(height/150.0,0.5),mix(0.7,0.98,1.0-u_lightintensity),1.0)));}v_lighting.rgb+=clamp(directional*u_lightcolor,mix(vec3(0.0),vec3(0.3),1.0-u_lightcolor),vec3(1.0));v_lighting*=u_opacity;}"),fr=_r("#ifdef GL_ES\nprecision highp float;\n#endif\nuniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_dimension;uniform float u_zoom;uniform float u_maxzoom;uniform vec4 u_unpack;float getElevation(vec2 coord,float bias) {vec4 data=texture2D(u_image,coord)*255.0;data.a=-1.0;return dot(data,u_unpack)/4.0;}void main() {vec2 epsilon=1.0/u_dimension;float a=getElevation(v_pos+vec2(-epsilon.x,-epsilon.y),0.0);float b=getElevation(v_pos+vec2(0,-epsilon.y),0.0);float c=getElevation(v_pos+vec2(epsilon.x,-epsilon.y),0.0);float d=getElevation(v_pos+vec2(-epsilon.x,0),0.0);float e=getElevation(v_pos,0.0);float f=getElevation(v_pos+vec2(epsilon.x,0),0.0);float g=getElevation(v_pos+vec2(-epsilon.x,epsilon.y),0.0);float h=getElevation(v_pos+vec2(0,epsilon.y),0.0);float i=getElevation(v_pos+vec2(epsilon.x,epsilon.y),0.0);float exaggeration=u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;vec2 deriv=vec2((c+f+f+i)-(a+d+d+g),(g+h+h+i)-(a+b+b+c))/ pow(2.0,(u_zoom-u_maxzoom)*exaggeration+19.2562-u_zoom);gl_FragColor=clamp(vec4(deriv.x/2.0+0.5,deriv.y/2.0+0.5,1.0,1.0),0.0,1.0);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_dimension;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);highp vec2 epsilon=1.0/u_dimension;float scale=(u_dimension.x-2.0)/u_dimension.x;v_pos=(a_texture_pos/8192.0)*scale+epsilon;}"),hr=_r("uniform sampler2D u_image;varying vec2 v_pos;uniform vec2 u_latrange;uniform vec2 u_light;uniform vec4 u_shadow;uniform vec4 u_highlight;uniform vec4 u_accent;\n#define PI 3.141592653589793\nvoid main() {vec4 pixel=texture2D(u_image,v_pos);vec2 deriv=((pixel.rg*2.0)-1.0);float scaleFactor=cos(radians((u_latrange[0]-u_latrange[1])*(1.0-v_pos.y)+u_latrange[1]));float slope=atan(1.25*length(deriv)/scaleFactor);float aspect=deriv.x !=0.0 ? atan(deriv.y,-deriv.x) : PI/2.0*(deriv.y > 0.0 ? 1.0 :-1.0);float intensity=u_light.x;float azimuth=u_light.y+PI;float base=1.875-intensity*1.75;float maxValue=0.5*PI;float scaledSlope=intensity !=0.5 ? ((pow(base,slope)-1.0)/(pow(base,maxValue)-1.0))*maxValue : slope;float accent=cos(scaledSlope);vec4 accent_color=(1.0-accent)*u_accent*clamp(intensity*2.0,0.0,1.0);float shade=abs(mod((aspect+azimuth)/PI+0.5,2.0)-1.0);vec4 shade_color=mix(u_shadow,u_highlight,shade)*sin(scaledSlope)*clamp(intensity*2.0,0.0,1.0);gl_FragColor=accent_color*(1.0-shade_color.a)+shade_color;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos=a_texture_pos/8192.0;}"),pr=_r("uniform lowp float u_device_pixel_ratio;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","\n#define scale 0.015873016\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform vec2 u_units_to_pixels;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp float v_linesofar;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;v_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*2.0;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_width2=vec2(outset,inset);}"),dr=_r("uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;varying vec2 v_width2;varying vec2 v_normal;varying float v_gamma_scale;varying highp float v_lineprogress;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);vec4 color=texture2D(u_image,vec2(v_lineprogress,0.5));gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","\n#define MAX_LINE_DISTANCE 32767.0\n#define scale 0.015873016\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_units_to_pixels;varying vec2 v_normal;varying vec2 v_width2;varying float v_gamma_scale;varying highp float v_lineprogress;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;v_lineprogress=(floor(a_data.z/4.0)+a_data.w*64.0)*2.0/MAX_LINE_DISTANCE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_width2=vec2(outset,inset);}"),vr=_r("uniform lowp float u_device_pixel_ratio;uniform vec2 u_texsize;uniform float u_fade;uniform mediump vec3 u_scale;uniform sampler2D u_image;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\nvec2 pattern_tl_a=pattern_from.xy;vec2 pattern_br_a=pattern_from.zw;vec2 pattern_tl_b=pattern_to.xy;vec2 pattern_br_b=pattern_to.zw;float tileZoomRatio=u_scale.x;float fromScale=u_scale.y;float toScale=u_scale.z;vec2 display_size_a=(pattern_br_a-pattern_tl_a)/pixel_ratio_from;vec2 display_size_b=(pattern_br_b-pattern_tl_b)/pixel_ratio_to;vec2 pattern_size_a=vec2(display_size_a.x*fromScale/tileZoomRatio,display_size_a.y);vec2 pattern_size_b=vec2(display_size_b.x*toScale/tileZoomRatio,display_size_b.y);float aspect_a=display_size_a.y/v_width;float aspect_b=display_size_b.y/v_width;float dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float x_a=mod(v_linesofar/pattern_size_a.x*aspect_a,1.0);float x_b=mod(v_linesofar/pattern_size_b.x*aspect_b,1.0);float y=0.5*v_normal.y+0.5;vec2 texel_size=1.0/u_texsize;vec2 pos_a=mix(pattern_tl_a*texel_size-texel_size,pattern_br_a*texel_size+texel_size,vec2(x_a,y));vec2 pos_b=mix(pattern_tl_b*texel_size-texel_size,pattern_br_b*texel_size+texel_size,vec2(x_b,y));vec4 color=mix(texture2D(u_image,pos_a),texture2D(u_image,pos_b),u_fade);gl_FragColor=color*alpha*opacity;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","\n#define scale 0.015873016\n#define LINE_DISTANCE_SCALE 2.0\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform vec2 u_units_to_pixels;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;varying vec2 v_normal;varying vec2 v_width2;varying float v_linesofar;varying float v_gamma_scale;varying float v_width;\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\nvoid main() {\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\n#pragma mapbox: initialize mediump vec4 pattern_from\n#pragma mapbox: initialize mediump vec4 pattern_to\n#pragma mapbox: initialize lowp float pixel_ratio_from\n#pragma mapbox: initialize lowp float pixel_ratio_to\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_linesofar=a_linesofar;v_width2=vec2(outset,inset);v_width=floorwidth;}"),gr=_r("uniform lowp float u_device_pixel_ratio;uniform sampler2D u_image;uniform float u_sdfgamma;uniform float u_mix;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\nfloat dist=length(v_normal)*v_width2.s;float blur2=(blur+1.0/u_device_pixel_ratio)*v_gamma_scale;float alpha=clamp(min(dist-(v_width2.t-blur2),v_width2.s-dist)/blur2,0.0,1.0);float sdfdist_a=texture2D(u_image,v_tex_a).a;float sdfdist_b=texture2D(u_image,v_tex_b).a;float sdfdist=mix(sdfdist_a,sdfdist_b,u_mix);alpha*=smoothstep(0.5-u_sdfgamma/floorwidth,0.5+u_sdfgamma/floorwidth,sdfdist);gl_FragColor=color*(alpha*opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","\n#define scale 0.015873016\n#define LINE_DISTANCE_SCALE 2.0\nattribute vec2 a_pos_normal;attribute vec4 a_data;uniform mat4 u_matrix;uniform mediump float u_ratio;uniform lowp float u_device_pixel_ratio;uniform vec2 u_patternscale_a;uniform float u_tex_y_a;uniform vec2 u_patternscale_b;uniform float u_tex_y_b;uniform vec2 u_units_to_pixels;varying vec2 v_normal;varying vec2 v_width2;varying vec2 v_tex_a;varying vec2 v_tex_b;varying float v_gamma_scale;\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\nvoid main() {\n#pragma mapbox: initialize highp vec4 color\n#pragma mapbox: initialize lowp float blur\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize mediump float gapwidth\n#pragma mapbox: initialize lowp float offset\n#pragma mapbox: initialize mediump float width\n#pragma mapbox: initialize lowp float floorwidth\nfloat ANTIALIASING=1.0/u_device_pixel_ratio/2.0;vec2 a_extrude=a_data.xy-128.0;float a_direction=mod(a_data.z,4.0)-1.0;float a_linesofar=(floor(a_data.z/4.0)+a_data.w*64.0)*LINE_DISTANCE_SCALE;vec2 pos=floor(a_pos_normal*0.5);mediump vec2 normal=a_pos_normal-2.0*pos;normal.y=normal.y*2.0-1.0;v_normal=normal;gapwidth=gapwidth/2.0;float halfwidth=width/2.0;offset=-1.0*offset;float inset=gapwidth+(gapwidth > 0.0 ? ANTIALIASING : 0.0);float outset=gapwidth+halfwidth*(gapwidth > 0.0 ? 2.0 : 1.0)+(halfwidth==0.0 ? 0.0 : ANTIALIASING);mediump vec2 dist=outset*a_extrude*scale;mediump float u=0.5*a_direction;mediump float t=1.0-abs(u);mediump vec2 offset2=offset*a_extrude*scale*normal.y*mat2(t,-u,u,t);vec4 projected_extrude=u_matrix*vec4(dist/u_ratio,0.0,0.0);gl_Position=u_matrix*vec4(pos+offset2/u_ratio,0.0,1.0)+projected_extrude;float extrude_length_without_perspective=length(dist);float extrude_length_with_perspective=length(projected_extrude.xy/gl_Position.w*u_units_to_pixels);v_gamma_scale=extrude_length_without_perspective/extrude_length_with_perspective;v_tex_a=vec2(a_linesofar*u_patternscale_a.x/floorwidth,normal.y*u_patternscale_a.y+u_tex_y_a);v_tex_b=vec2(a_linesofar*u_patternscale_b.x/floorwidth,normal.y*u_patternscale_b.y+u_tex_y_b);v_width2=vec2(outset,inset);}"),yr=_r("uniform float u_fade_t;uniform float u_opacity;uniform sampler2D u_image0;uniform sampler2D u_image1;varying vec2 v_pos0;varying vec2 v_pos1;uniform float u_brightness_low;uniform float u_brightness_high;uniform float u_saturation_factor;uniform float u_contrast_factor;uniform vec3 u_spin_weights;void main() {vec4 color0=texture2D(u_image0,v_pos0);vec4 color1=texture2D(u_image1,v_pos1);if (color0.a > 0.0) {color0.rgb=color0.rgb/color0.a;}if (color1.a > 0.0) {color1.rgb=color1.rgb/color1.a;}vec4 color=mix(color0,color1,u_fade_t);color.a*=u_opacity;vec3 rgb=color.rgb;rgb=vec3(dot(rgb,u_spin_weights.xyz),dot(rgb,u_spin_weights.zxy),dot(rgb,u_spin_weights.yzx));float average=(color.r+color.g+color.b)/3.0;rgb+=(average-rgb)*u_saturation_factor;rgb=(rgb-0.5)*u_contrast_factor+0.5;vec3 u_high_vec=vec3(u_brightness_low,u_brightness_low,u_brightness_low);vec3 u_low_vec=vec3(u_brightness_high,u_brightness_high,u_brightness_high);gl_FragColor=vec4(mix(u_high_vec,u_low_vec,rgb)*color.a,color.a);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent;uniform float u_buffer_scale;attribute vec2 a_pos;attribute vec2 a_texture_pos;varying vec2 v_pos0;varying vec2 v_pos1;void main() {gl_Position=u_matrix*vec4(a_pos,0,1);v_pos0=(((a_texture_pos/8192.0)-0.5)/u_buffer_scale )+0.5;v_pos1=(v_pos0*u_scale_parent)+u_tl_parent;}"),mr=_r("uniform sampler2D u_texture;varying vec2 v_tex;varying float v_fade_opacity;\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\nlowp float alpha=opacity*v_fade_opacity;gl_FragColor=texture2D(u_texture,v_tex)*alpha;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform highp float u_camera_to_center_distance;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform float u_fade_change;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform vec2 u_texsize;varying vec2 v_tex;varying float v_fade_opacity;\n#pragma mapbox: define lowp float opacity\nvoid main() {\n#pragma mapbox: initialize lowp float opacity\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;vec2 a_minFontScale=a_pixeloffset.zw/256.0;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*max(a_minFontScale,fontScale)+a_pxoffset/16.0),0.0,1.0);v_tex=a_tex/u_texsize;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;v_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));}"),xr=_r("#define SDF_PX 8.0\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;uniform bool u_is_text;varying vec2 v_data0;varying vec3 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nfloat EDGE_GAMMA=0.105/u_device_pixel_ratio;vec2 tex=v_data0.xy;float gamma_scale=v_data1.x;float size=v_data1.y;float fade_opacity=v_data1[2];float fontScale=u_is_text ? size/24.0 : size;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec4 a_pixeloffset;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;varying vec2 v_data0;varying vec3 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);vec2 a_pxoffset=a_pixeloffset.xy;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=u_is_text ? size/24.0 : size;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale+a_pxoffset),0.0,1.0);float gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));v_data0=a_tex/u_texsize;v_data1=vec3(gamma_scale,size,interpolated_fade_opacity);}"),br=_r("#define SDF_PX 8.0\n#define SDF 1.0\n#define ICON 0.0\nuniform bool u_is_halo;uniform sampler2D u_texture;uniform sampler2D u_texture_icon;uniform highp float u_gamma_scale;uniform lowp float u_device_pixel_ratio;varying vec4 v_data0;varying vec4 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nfloat fade_opacity=v_data1[2];if (v_data1.w==ICON) {vec2 tex_icon=v_data0.zw;lowp float alpha=opacity*fade_opacity;gl_FragColor=texture2D(u_texture_icon,tex_icon)*alpha;\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\nreturn;}vec2 tex=v_data0.xy;float EDGE_GAMMA=0.105/u_device_pixel_ratio;float gamma_scale=v_data1.x;float size=v_data1.y;float fontScale=size/24.0;lowp vec4 color=fill_color;highp float gamma=EDGE_GAMMA/(fontScale*u_gamma_scale);lowp float buff=(256.0-64.0)/256.0;if (u_is_halo) {color=halo_color;gamma=(halo_blur*1.19/SDF_PX+EDGE_GAMMA)/(fontScale*u_gamma_scale);buff=(6.0-halo_width/fontScale)/SDF_PX;}lowp float dist=texture2D(u_texture,tex).a;highp float gamma_scaled=gamma*gamma_scale;highp float alpha=smoothstep(buff-gamma_scaled,buff+gamma_scaled,dist);gl_FragColor=color*(alpha*opacity*fade_opacity);\n#ifdef OVERDRAW_INSPECTOR\ngl_FragColor=vec4(1.0);\n#endif\n}","const float PI=3.141592653589793;attribute vec4 a_pos_offset;attribute vec4 a_data;attribute vec3 a_projected_pos;attribute float a_fade_opacity;uniform bool u_is_size_zoom_constant;uniform bool u_is_size_feature_constant;uniform highp float u_size_t;uniform highp float u_size;uniform mat4 u_matrix;uniform mat4 u_label_plane_matrix;uniform mat4 u_coord_matrix;uniform bool u_is_text;uniform bool u_pitch_with_map;uniform highp float u_pitch;uniform bool u_rotate_symbol;uniform highp float u_aspect_ratio;uniform highp float u_camera_to_center_distance;uniform float u_fade_change;uniform vec2 u_texsize;uniform vec2 u_texsize_icon;varying vec4 v_data0;varying vec4 v_data1;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\nvoid main() {\n#pragma mapbox: initialize highp vec4 fill_color\n#pragma mapbox: initialize highp vec4 halo_color\n#pragma mapbox: initialize lowp float opacity\n#pragma mapbox: initialize lowp float halo_width\n#pragma mapbox: initialize lowp float halo_blur\nvec2 a_pos=a_pos_offset.xy;vec2 a_offset=a_pos_offset.zw;vec2 a_tex=a_data.xy;vec2 a_size=a_data.zw;float a_size_min=floor(a_size[0]*0.5);float is_sdf=a_size[0]-2.0*a_size_min;highp float segment_angle=-a_projected_pos[2];float size;if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {size=mix(a_size_min,a_size[1],u_size_t)/128.0;} else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {size=a_size_min/128.0;} else {size=u_size;}vec4 projectedPoint=u_matrix*vec4(a_pos,0,1);highp float camera_to_anchor_distance=projectedPoint.w;highp float distance_ratio=u_pitch_with_map ?\ncamera_to_anchor_distance/u_camera_to_center_distance :\nu_camera_to_center_distance/camera_to_anchor_distance;highp float perspective_ratio=clamp(0.5+0.5*distance_ratio,0.0,4.0);size*=perspective_ratio;float fontScale=size/24.0;highp float symbol_rotation=0.0;if (u_rotate_symbol) {vec4 offsetProjectedPoint=u_matrix*vec4(a_pos+vec2(1,0),0,1);vec2 a=projectedPoint.xy/projectedPoint.w;vec2 b=offsetProjectedPoint.xy/offsetProjectedPoint.w;symbol_rotation=atan((b.y-a.y)/u_aspect_ratio,b.x-a.x);}highp float angle_sin=sin(segment_angle+symbol_rotation);highp float angle_cos=cos(segment_angle+symbol_rotation);mat2 rotation_matrix=mat2(angle_cos,-1.0*angle_sin,angle_sin,angle_cos);vec4 projected_pos=u_label_plane_matrix*vec4(a_projected_pos.xy,0.0,1.0);gl_Position=u_coord_matrix*vec4(projected_pos.xy/projected_pos.w+rotation_matrix*(a_offset/32.0*fontScale),0.0,1.0);float gamma_scale=gl_Position.w;vec2 fade_opacity=unpack_opacity(a_fade_opacity);float fade_change=fade_opacity[1] > 0.5 ? u_fade_change :-u_fade_change;float interpolated_fade_opacity=max(0.0,min(1.0,fade_opacity[0]+fade_change));v_data0.xy=a_tex/u_texsize;v_data0.zw=a_tex/u_texsize_icon;v_data1=vec4(gamma_scale,size,interpolated_fade_opacity,is_sdf);}");function _r(t,e){var r=/#pragma mapbox: ([\w]+) ([\w]+) ([\w]+) ([\w]+)/g,n={};return{fragmentSource:t=t.replace(r,(function(t,e,r,i,a){return n[a]=!0,"define"===e?"\n#ifndef HAS_UNIFORM_u_"+a+"\nvarying "+r+" "+i+" "+a+";\n#else\nuniform "+r+" "+i+" u_"+a+";\n#endif\n":"\n#ifdef HAS_UNIFORM_u_"+a+"\n "+r+" "+i+" "+a+" = u_"+a+";\n#endif\n"})),vertexSource:e=e.replace(r,(function(t,e,r,i,a){var o="float"===i?"vec2":"vec4",s=a.match(/color/)?"color":o;return n[a]?"define"===e?"\n#ifndef HAS_UNIFORM_u_"+a+"\nuniform lowp float u_"+a+"_t;\nattribute "+r+" "+o+" a_"+a+";\nvarying "+r+" "+i+" "+a+";\n#else\nuniform "+r+" "+i+" u_"+a+";\n#endif\n":"vec4"===s?"\n#ifndef HAS_UNIFORM_u_"+a+"\n "+a+" = a_"+a+";\n#else\n "+r+" "+i+" "+a+" = u_"+a+";\n#endif\n":"\n#ifndef HAS_UNIFORM_u_"+a+"\n "+a+" = unpack_mix_"+s+"(a_"+a+", u_"+a+"_t);\n#else\n "+r+" "+i+" "+a+" = u_"+a+";\n#endif\n":"define"===e?"\n#ifndef HAS_UNIFORM_u_"+a+"\nuniform lowp float u_"+a+"_t;\nattribute "+r+" "+o+" a_"+a+";\n#else\nuniform "+r+" "+i+" u_"+a+";\n#endif\n":"vec4"===s?"\n#ifndef HAS_UNIFORM_u_"+a+"\n "+r+" "+i+" "+a+" = a_"+a+";\n#else\n "+r+" "+i+" "+a+" = u_"+a+";\n#endif\n":"\n#ifndef HAS_UNIFORM_u_"+a+"\n "+r+" "+i+" "+a+" = unpack_mix_"+s+"(a_"+a+", u_"+a+"_t);\n#else\n "+r+" "+i+" "+a+" = u_"+a+";\n#endif\n"}))}}var wr=Object.freeze({__proto__:null,prelude:Xe,background:Je,backgroundPattern:Ke,circle:$e,clippingMask:Qe,heatmap:tr,heatmapTexture:er,collisionBox:rr,collisionCircle:nr,debug:ir,fill:ar,fillOutline:or,fillOutlinePattern:sr,fillPattern:lr,fillExtrusion:ur,fillExtrusionPattern:cr,hillshadePrepare:fr,hillshade:hr,line:pr,lineGradient:dr,linePattern:vr,lineSDF:gr,raster:yr,symbolIcon:mr,symbolSDF:xr,symbolTextAndIcon:br}),Tr=function(){this.boundProgram=null,this.boundLayoutVertexBuffer=null,this.boundPaintVertexBuffers=[],this.boundIndexBuffer=null,this.boundVertexOffset=null,this.boundDynamicVertexBuffer=null,this.vao=null};Tr.prototype.bind=function(t,e,r,n,i,a,o,s){this.context=t;for(var l=this.boundPaintVertexBuffers.length!==n.length,u=0;!l&&u>16,s>>16],u_pixel_coord_lower:[65535&o,65535&s]}}kr.prototype.draw=function(t,e,r,n,i,a,o,s,l,u,c,f,h,p,d,v){var g,y=t.gl;if(!this.failedToCreate){for(var m in t.program.set(this.program),t.setDepthMode(r),t.setStencilMode(n),t.setColorMode(i),t.setCullFace(a),this.fixedUniforms)this.fixedUniforms[m].set(o[m]);p&&p.setUniforms(t,this.binderUniforms,f,{zoom:h});for(var x=(g={},g[y.LINES]=2,g[y.TRIANGLES]=3,g[y.LINE_STRIP]=1,g)[e],b=0,_=c.get();b<_.length;b+=1){var w=_[b],T=w.vaos||(w.vaos={});(T[s]||(T[s]=new Tr)).bind(t,this,l,p?p.getPaintVertexBuffers():[],u,w.vertexOffset,d,v),y.drawElements(e,w.primitiveLength*x,y.UNSIGNED_SHORT,w.primitiveOffset*x*2)}}};var Mr=function(e,r,n,i){var a=r.style.light,o=a.properties.get("position"),s=[o.x,o.y,o.z],l=t.create$1();"viewport"===a.properties.get("anchor")&&t.fromRotation(l,-r.transform.angle),t.transformMat3(s,s,l);var u=a.properties.get("color");return{u_matrix:e,u_lightpos:s,u_lightintensity:a.properties.get("intensity"),u_lightcolor:[u.r,u.g,u.b],u_vertical_gradient:+n,u_opacity:i}},Sr=function(e,r,n,i,a,o,s){return t.extend(Mr(e,r,n,i),Ar(o,r,s),{u_height_factor:-Math.pow(2,a.overscaledZ)/s.tileSize/8})},Er=function(t){return{u_matrix:t}},Lr=function(e,r,n,i){return t.extend(Er(e),Ar(n,r,i))},Cr=function(t,e){return{u_matrix:t,u_world:e}},Pr=function(e,r,n,i,a){return t.extend(Lr(e,r,n,i),{u_world:a})},Or=function(e,r,n,i){var a,o,s=e.transform;if("map"===i.paint.get("circle-pitch-alignment")){var l=ge(n,1,s.zoom);a=!0,o=[l,l]}else a=!1,o=s.pixelsToGLUnits;return{u_camera_to_center_distance:s.cameraToCenterDistance,u_scale_with_map:+("map"===i.paint.get("circle-pitch-scale")),u_matrix:e.translatePosMatrix(r.posMatrix,n,i.paint.get("circle-translate"),i.paint.get("circle-translate-anchor")),u_pitch_with_map:+a,u_device_pixel_ratio:t.browser.devicePixelRatio,u_extrude_scale:o}},Ir=function(t,e,r){var n=ge(r,1,e.zoom),i=Math.pow(2,e.zoom-r.tileID.overscaledZ),a=r.tileID.overscaleFactor();return{u_matrix:t,u_camera_to_center_distance:e.cameraToCenterDistance,u_pixels_to_tile_units:n,u_extrude_scale:[e.pixelsToGLUnits[0]/(n*i),e.pixelsToGLUnits[1]/(n*i)],u_overscale_factor:a}},Dr=function(t,e,r){return{u_matrix:t,u_inv_matrix:e,u_camera_to_center_distance:r.cameraToCenterDistance,u_viewport_size:[r.width,r.height]}},zr=function(t,e,r){return void 0===r&&(r=1),{u_matrix:t,u_color:e,u_overlay:0,u_overlay_scale:r}},Rr=function(t){return{u_matrix:t}},Fr=function(t,e,r,n){return{u_matrix:t,u_extrude_scale:ge(e,1,r),u_intensity:n}},Br=function(e,r,n,i){var a=t.create();t.ortho(a,0,e.width,e.height,0,0,1);var o=e.context.gl;return{u_matrix:a,u_world:[o.drawingBufferWidth,o.drawingBufferHeight],u_image:n,u_color_ramp:i,u_opacity:r.paint.get("heatmap-opacity")}},Nr=function(e,r,n){var i=n.paint.get("hillshade-shadow-color"),a=n.paint.get("hillshade-highlight-color"),o=n.paint.get("hillshade-accent-color"),s=n.paint.get("hillshade-illumination-direction")*(Math.PI/180);"viewport"===n.paint.get("hillshade-illumination-anchor")&&(s-=e.transform.angle);var l,u,c,f=!e.options.moving;return{u_matrix:e.transform.calculatePosMatrix(r.tileID.toUnwrapped(),f),u_image:0,u_latrange:(l=r.tileID,u=Math.pow(2,l.canonical.z),c=l.canonical.y,[new t.MercatorCoordinate(0,c/u).toLngLat().lat,new t.MercatorCoordinate(0,(c+1)/u).toLngLat().lat]),u_light:[n.paint.get("hillshade-exaggeration"),s],u_shadow:i,u_highlight:a,u_accent:o}},jr=function(e,r,n){var i=r.stride,a=t.create();return t.ortho(a,0,t.EXTENT,-t.EXTENT,0,0,1),t.translate(a,a,[0,-t.EXTENT,0]),{u_matrix:a,u_image:1,u_dimension:[i,i],u_zoom:e.overscaledZ,u_maxzoom:n,u_unpack:r.getUnpackVector()}};var Ur=function(e,r,n){var i=e.transform;return{u_matrix:Zr(e,r,n),u_ratio:1/ge(r,1,i.zoom),u_device_pixel_ratio:t.browser.devicePixelRatio,u_units_to_pixels:[1/i.pixelsToGLUnits[0],1/i.pixelsToGLUnits[1]]}},Vr=function(e,r,n){return t.extend(Ur(e,r,n),{u_image:0})},Hr=function(e,r,n,i){var a=e.transform,o=Gr(r,a);return{u_matrix:Zr(e,r,n),u_texsize:r.imageAtlasTexture.size,u_ratio:1/ge(r,1,a.zoom),u_device_pixel_ratio:t.browser.devicePixelRatio,u_image:0,u_scale:[o,i.fromScale,i.toScale],u_fade:i.t,u_units_to_pixels:[1/a.pixelsToGLUnits[0],1/a.pixelsToGLUnits[1]]}},qr=function(e,r,n,i,a){var o=e.transform,s=e.lineAtlas,l=Gr(r,o),u="round"===n.layout.get("line-cap"),c=s.getDash(i.from,u),f=s.getDash(i.to,u),h=c.width*a.fromScale,p=f.width*a.toScale;return t.extend(Ur(e,r,n),{u_patternscale_a:[l/h,-c.height/2],u_patternscale_b:[l/p,-f.height/2],u_sdfgamma:s.width/(256*Math.min(h,p)*t.browser.devicePixelRatio)/2,u_image:0,u_tex_y_a:c.y,u_tex_y_b:f.y,u_mix:a.t})};function Gr(t,e){return 1/ge(t,1,e.tileZoom)}function Zr(t,e,r){return t.translatePosMatrix(e.tileID.posMatrix,e,r.paint.get("line-translate"),r.paint.get("line-translate-anchor"))}var Yr=function(t,e,r,n,i){return{u_matrix:t,u_tl_parent:e,u_scale_parent:r,u_buffer_scale:1,u_fade_t:n.mix,u_opacity:n.opacity*i.paint.get("raster-opacity"),u_image0:0,u_image1:1,u_brightness_low:i.paint.get("raster-brightness-min"),u_brightness_high:i.paint.get("raster-brightness-max"),u_saturation_factor:(o=i.paint.get("raster-saturation"),o>0?1-1/(1.001-o):-o),u_contrast_factor:(a=i.paint.get("raster-contrast"),a>0?1/(1-a):1+a),u_spin_weights:Wr(i.paint.get("raster-hue-rotate"))};var a,o};function Wr(t){t*=Math.PI/180;var e=Math.sin(t),r=Math.cos(t);return[(2*r+1)/3,(-Math.sqrt(3)*e-r+1)/3,(Math.sqrt(3)*e-r+1)/3]}var Xr,Jr=function(t,e,r,n,i,a,o,s,l,u){var c=i.transform;return{u_is_size_zoom_constant:+("constant"===t||"source"===t),u_is_size_feature_constant:+("constant"===t||"camera"===t),u_size_t:e?e.uSizeT:0,u_size:e?e.uSize:0,u_camera_to_center_distance:c.cameraToCenterDistance,u_pitch:c.pitch/360*2*Math.PI,u_rotate_symbol:+r,u_aspect_ratio:c.width/c.height,u_fade_change:i.options.fadeDuration?i.symbolFadeChange:1,u_matrix:a,u_label_plane_matrix:o,u_coord_matrix:s,u_is_text:+l,u_pitch_with_map:+n,u_texsize:u,u_texture:0}},Kr=function(e,r,n,i,a,o,s,l,u,c,f){var h=a.transform;return t.extend(Jr(e,r,n,i,a,o,s,l,u,c),{u_gamma_scale:i?Math.cos(h._pitch)*h.cameraToCenterDistance:1,u_device_pixel_ratio:t.browser.devicePixelRatio,u_is_halo:+f})},$r=function(e,r,n,i,a,o,s,l,u,c){return t.extend(Kr(e,r,n,i,a,o,s,l,!0,u,!0),{u_texsize_icon:c,u_texture_icon:1})},Qr=function(t,e,r){return{u_matrix:t,u_opacity:e,u_color:r}},tn=function(e,r,n,i,a,o){return t.extend(function(t,e,r,n){var i=r.imageManager.getPattern(t.from.toString()),a=r.imageManager.getPattern(t.to.toString()),o=r.imageManager.getPixelSize(),s=o.width,l=o.height,u=Math.pow(2,n.tileID.overscaledZ),c=n.tileSize*Math.pow(2,r.transform.tileZoom)/u,f=c*(n.tileID.canonical.x+n.tileID.wrap*u),h=c*n.tileID.canonical.y;return{u_image:0,u_pattern_tl_a:i.tl,u_pattern_br_a:i.br,u_pattern_tl_b:a.tl,u_pattern_br_b:a.br,u_texsize:[s,l],u_mix:e.t,u_pattern_size_a:i.displaySize,u_pattern_size_b:a.displaySize,u_scale_a:e.fromScale,u_scale_b:e.toScale,u_tile_units_to_pixels:1/ge(n,1,r.transform.tileZoom),u_pixel_coord_upper:[f>>16,h>>16],u_pixel_coord_lower:[65535&f,65535&h]}}(i,o,n,a),{u_matrix:e,u_opacity:r})},en={fillExtrusion:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_lightpos:new t.Uniform3f(e,r.u_lightpos),u_lightintensity:new t.Uniform1f(e,r.u_lightintensity),u_lightcolor:new t.Uniform3f(e,r.u_lightcolor),u_vertical_gradient:new t.Uniform1f(e,r.u_vertical_gradient),u_opacity:new t.Uniform1f(e,r.u_opacity)}},fillExtrusionPattern:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_lightpos:new t.Uniform3f(e,r.u_lightpos),u_lightintensity:new t.Uniform1f(e,r.u_lightintensity),u_lightcolor:new t.Uniform3f(e,r.u_lightcolor),u_vertical_gradient:new t.Uniform1f(e,r.u_vertical_gradient),u_height_factor:new t.Uniform1f(e,r.u_height_factor),u_image:new t.Uniform1i(e,r.u_image),u_texsize:new t.Uniform2f(e,r.u_texsize),u_pixel_coord_upper:new t.Uniform2f(e,r.u_pixel_coord_upper),u_pixel_coord_lower:new t.Uniform2f(e,r.u_pixel_coord_lower),u_scale:new t.Uniform3f(e,r.u_scale),u_fade:new t.Uniform1f(e,r.u_fade),u_opacity:new t.Uniform1f(e,r.u_opacity)}},fill:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix)}},fillPattern:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_image:new t.Uniform1i(e,r.u_image),u_texsize:new t.Uniform2f(e,r.u_texsize),u_pixel_coord_upper:new t.Uniform2f(e,r.u_pixel_coord_upper),u_pixel_coord_lower:new t.Uniform2f(e,r.u_pixel_coord_lower),u_scale:new t.Uniform3f(e,r.u_scale),u_fade:new t.Uniform1f(e,r.u_fade)}},fillOutline:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_world:new t.Uniform2f(e,r.u_world)}},fillOutlinePattern:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_world:new t.Uniform2f(e,r.u_world),u_image:new t.Uniform1i(e,r.u_image),u_texsize:new t.Uniform2f(e,r.u_texsize),u_pixel_coord_upper:new t.Uniform2f(e,r.u_pixel_coord_upper),u_pixel_coord_lower:new t.Uniform2f(e,r.u_pixel_coord_lower),u_scale:new t.Uniform3f(e,r.u_scale),u_fade:new t.Uniform1f(e,r.u_fade)}},circle:function(e,r){return{u_camera_to_center_distance:new t.Uniform1f(e,r.u_camera_to_center_distance),u_scale_with_map:new t.Uniform1i(e,r.u_scale_with_map),u_pitch_with_map:new t.Uniform1i(e,r.u_pitch_with_map),u_extrude_scale:new t.Uniform2f(e,r.u_extrude_scale),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_matrix:new t.UniformMatrix4f(e,r.u_matrix)}},collisionBox:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_camera_to_center_distance:new t.Uniform1f(e,r.u_camera_to_center_distance),u_pixels_to_tile_units:new t.Uniform1f(e,r.u_pixels_to_tile_units),u_extrude_scale:new t.Uniform2f(e,r.u_extrude_scale),u_overscale_factor:new t.Uniform1f(e,r.u_overscale_factor)}},collisionCircle:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_inv_matrix:new t.UniformMatrix4f(e,r.u_inv_matrix),u_camera_to_center_distance:new t.Uniform1f(e,r.u_camera_to_center_distance),u_viewport_size:new t.Uniform2f(e,r.u_viewport_size)}},debug:function(e,r){return{u_color:new t.UniformColor(e,r.u_color),u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_overlay:new t.Uniform1i(e,r.u_overlay),u_overlay_scale:new t.Uniform1f(e,r.u_overlay_scale)}},clippingMask:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix)}},heatmap:function(e,r){return{u_extrude_scale:new t.Uniform1f(e,r.u_extrude_scale),u_intensity:new t.Uniform1f(e,r.u_intensity),u_matrix:new t.UniformMatrix4f(e,r.u_matrix)}},heatmapTexture:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_world:new t.Uniform2f(e,r.u_world),u_image:new t.Uniform1i(e,r.u_image),u_color_ramp:new t.Uniform1i(e,r.u_color_ramp),u_opacity:new t.Uniform1f(e,r.u_opacity)}},hillshade:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_image:new t.Uniform1i(e,r.u_image),u_latrange:new t.Uniform2f(e,r.u_latrange),u_light:new t.Uniform2f(e,r.u_light),u_shadow:new t.UniformColor(e,r.u_shadow),u_highlight:new t.UniformColor(e,r.u_highlight),u_accent:new t.UniformColor(e,r.u_accent)}},hillshadePrepare:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_image:new t.Uniform1i(e,r.u_image),u_dimension:new t.Uniform2f(e,r.u_dimension),u_zoom:new t.Uniform1f(e,r.u_zoom),u_maxzoom:new t.Uniform1f(e,r.u_maxzoom),u_unpack:new t.Uniform4f(e,r.u_unpack)}},line:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_ratio:new t.Uniform1f(e,r.u_ratio),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_units_to_pixels:new t.Uniform2f(e,r.u_units_to_pixels)}},lineGradient:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_ratio:new t.Uniform1f(e,r.u_ratio),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_units_to_pixels:new t.Uniform2f(e,r.u_units_to_pixels),u_image:new t.Uniform1i(e,r.u_image)}},linePattern:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_texsize:new t.Uniform2f(e,r.u_texsize),u_ratio:new t.Uniform1f(e,r.u_ratio),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_image:new t.Uniform1i(e,r.u_image),u_units_to_pixels:new t.Uniform2f(e,r.u_units_to_pixels),u_scale:new t.Uniform3f(e,r.u_scale),u_fade:new t.Uniform1f(e,r.u_fade)}},lineSDF:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_ratio:new t.Uniform1f(e,r.u_ratio),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_units_to_pixels:new t.Uniform2f(e,r.u_units_to_pixels),u_patternscale_a:new t.Uniform2f(e,r.u_patternscale_a),u_patternscale_b:new t.Uniform2f(e,r.u_patternscale_b),u_sdfgamma:new t.Uniform1f(e,r.u_sdfgamma),u_image:new t.Uniform1i(e,r.u_image),u_tex_y_a:new t.Uniform1f(e,r.u_tex_y_a),u_tex_y_b:new t.Uniform1f(e,r.u_tex_y_b),u_mix:new t.Uniform1f(e,r.u_mix)}},raster:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_tl_parent:new t.Uniform2f(e,r.u_tl_parent),u_scale_parent:new t.Uniform1f(e,r.u_scale_parent),u_buffer_scale:new t.Uniform1f(e,r.u_buffer_scale),u_fade_t:new t.Uniform1f(e,r.u_fade_t),u_opacity:new t.Uniform1f(e,r.u_opacity),u_image0:new t.Uniform1i(e,r.u_image0),u_image1:new t.Uniform1i(e,r.u_image1),u_brightness_low:new t.Uniform1f(e,r.u_brightness_low),u_brightness_high:new t.Uniform1f(e,r.u_brightness_high),u_saturation_factor:new t.Uniform1f(e,r.u_saturation_factor),u_contrast_factor:new t.Uniform1f(e,r.u_contrast_factor),u_spin_weights:new t.Uniform3f(e,r.u_spin_weights)}},symbolIcon:function(e,r){return{u_is_size_zoom_constant:new t.Uniform1i(e,r.u_is_size_zoom_constant),u_is_size_feature_constant:new t.Uniform1i(e,r.u_is_size_feature_constant),u_size_t:new t.Uniform1f(e,r.u_size_t),u_size:new t.Uniform1f(e,r.u_size),u_camera_to_center_distance:new t.Uniform1f(e,r.u_camera_to_center_distance),u_pitch:new t.Uniform1f(e,r.u_pitch),u_rotate_symbol:new t.Uniform1i(e,r.u_rotate_symbol),u_aspect_ratio:new t.Uniform1f(e,r.u_aspect_ratio),u_fade_change:new t.Uniform1f(e,r.u_fade_change),u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_label_plane_matrix:new t.UniformMatrix4f(e,r.u_label_plane_matrix),u_coord_matrix:new t.UniformMatrix4f(e,r.u_coord_matrix),u_is_text:new t.Uniform1i(e,r.u_is_text),u_pitch_with_map:new t.Uniform1i(e,r.u_pitch_with_map),u_texsize:new t.Uniform2f(e,r.u_texsize),u_texture:new t.Uniform1i(e,r.u_texture)}},symbolSDF:function(e,r){return{u_is_size_zoom_constant:new t.Uniform1i(e,r.u_is_size_zoom_constant),u_is_size_feature_constant:new t.Uniform1i(e,r.u_is_size_feature_constant),u_size_t:new t.Uniform1f(e,r.u_size_t),u_size:new t.Uniform1f(e,r.u_size),u_camera_to_center_distance:new t.Uniform1f(e,r.u_camera_to_center_distance),u_pitch:new t.Uniform1f(e,r.u_pitch),u_rotate_symbol:new t.Uniform1i(e,r.u_rotate_symbol),u_aspect_ratio:new t.Uniform1f(e,r.u_aspect_ratio),u_fade_change:new t.Uniform1f(e,r.u_fade_change),u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_label_plane_matrix:new t.UniformMatrix4f(e,r.u_label_plane_matrix),u_coord_matrix:new t.UniformMatrix4f(e,r.u_coord_matrix),u_is_text:new t.Uniform1i(e,r.u_is_text),u_pitch_with_map:new t.Uniform1i(e,r.u_pitch_with_map),u_texsize:new t.Uniform2f(e,r.u_texsize),u_texture:new t.Uniform1i(e,r.u_texture),u_gamma_scale:new t.Uniform1f(e,r.u_gamma_scale),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_is_halo:new t.Uniform1i(e,r.u_is_halo)}},symbolTextAndIcon:function(e,r){return{u_is_size_zoom_constant:new t.Uniform1i(e,r.u_is_size_zoom_constant),u_is_size_feature_constant:new t.Uniform1i(e,r.u_is_size_feature_constant),u_size_t:new t.Uniform1f(e,r.u_size_t),u_size:new t.Uniform1f(e,r.u_size),u_camera_to_center_distance:new t.Uniform1f(e,r.u_camera_to_center_distance),u_pitch:new t.Uniform1f(e,r.u_pitch),u_rotate_symbol:new t.Uniform1i(e,r.u_rotate_symbol),u_aspect_ratio:new t.Uniform1f(e,r.u_aspect_ratio),u_fade_change:new t.Uniform1f(e,r.u_fade_change),u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_label_plane_matrix:new t.UniformMatrix4f(e,r.u_label_plane_matrix),u_coord_matrix:new t.UniformMatrix4f(e,r.u_coord_matrix),u_is_text:new t.Uniform1i(e,r.u_is_text),u_pitch_with_map:new t.Uniform1i(e,r.u_pitch_with_map),u_texsize:new t.Uniform2f(e,r.u_texsize),u_texsize_icon:new t.Uniform2f(e,r.u_texsize_icon),u_texture:new t.Uniform1i(e,r.u_texture),u_texture_icon:new t.Uniform1i(e,r.u_texture_icon),u_gamma_scale:new t.Uniform1f(e,r.u_gamma_scale),u_device_pixel_ratio:new t.Uniform1f(e,r.u_device_pixel_ratio),u_is_halo:new t.Uniform1i(e,r.u_is_halo)}},background:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_opacity:new t.Uniform1f(e,r.u_opacity),u_color:new t.UniformColor(e,r.u_color)}},backgroundPattern:function(e,r){return{u_matrix:new t.UniformMatrix4f(e,r.u_matrix),u_opacity:new t.Uniform1f(e,r.u_opacity),u_image:new t.Uniform1i(e,r.u_image),u_pattern_tl_a:new t.Uniform2f(e,r.u_pattern_tl_a),u_pattern_br_a:new t.Uniform2f(e,r.u_pattern_br_a),u_pattern_tl_b:new t.Uniform2f(e,r.u_pattern_tl_b),u_pattern_br_b:new t.Uniform2f(e,r.u_pattern_br_b),u_texsize:new t.Uniform2f(e,r.u_texsize),u_mix:new t.Uniform1f(e,r.u_mix),u_pattern_size_a:new t.Uniform2f(e,r.u_pattern_size_a),u_pattern_size_b:new t.Uniform2f(e,r.u_pattern_size_b),u_scale_a:new t.Uniform1f(e,r.u_scale_a),u_scale_b:new t.Uniform1f(e,r.u_scale_b),u_pixel_coord_upper:new t.Uniform2f(e,r.u_pixel_coord_upper),u_pixel_coord_lower:new t.Uniform2f(e,r.u_pixel_coord_lower),u_tile_units_to_pixels:new t.Uniform1f(e,r.u_tile_units_to_pixels)}}};function rn(e,r,n,i,a,o,s){for(var l=e.context,u=l.gl,c=e.useProgram("collisionBox"),f=[],h=0,p=0,d=0;d0){var _=t.create(),w=m;t.mul(_,y.placementInvProjMatrix,e.transform.glCoordMatrix),t.mul(_,_,y.placementViewportMatrix),f.push({circleArray:b,circleOffset:p,transform:w,invTransform:_}),p=h+=b.length/4}x&&c.draw(l,u.LINES,Mt.disabled,Et.disabled,e.colorModeForRenderPass(),Ct.disabled,Ir(m,e.transform,g),n.id,x.layoutVertexBuffer,x.indexBuffer,x.segments,null,e.transform.zoom,null,null,x.collisionVertexBuffer)}}if(s&&f.length){var T=e.useProgram("collisionCircle"),k=new t.StructArrayLayout2f1f2i16;k.resize(4*h),k._trim();for(var A=0,M=0,S=f;M=0&&(v[y.associatedIconIndex]={shiftedAnchor:S,angle:E})}else he(y.numGlyphs,p)}if(f){d.clear();for(var C=e.icon.placedSymbolArray,P=0;P0){var s=t.browser.now(),l=(s-e.timeAdded)/o,u=r?(s-r.timeAdded)/o:-1,c=n.getSource(),f=a.coveringZoomLevel({tileSize:c.tileSize,roundZoom:c.roundZoom}),h=!r||Math.abs(r.tileID.overscaledZ-f)>Math.abs(e.tileID.overscaledZ-f),p=h&&e.refreshedUponExpiration?1:t.clamp(h?l:1-u,0,1);return e.refreshedUponExpiration&&l>=1&&(e.refreshedUponExpiration=!1),r?{opacity:1,mix:1-p}:{opacity:p,mix:0}}return{opacity:1,mix:0}}var vn=new t.Color(1,0,0,1),gn=new t.Color(0,1,0,1),yn=new t.Color(0,0,1,1),mn=new t.Color(1,0,1,1),xn=new t.Color(0,1,1,1);function bn(t){var e=t.transform.padding;_n(t,t.transform.height-(e.top||0),3,vn),_n(t,e.bottom||0,3,gn),wn(t,e.left||0,3,yn),wn(t,t.transform.width-(e.right||0),3,mn);var r=t.transform.centerPoint;!function(t,e,r,n){var i=20,a=2;Tn(t,e-a/2,r-i/2,a,i,n),Tn(t,e-i/2,r-a/2,i,a,n)}(t,r.x,t.transform.height-r.y,xn)}function _n(t,e,r,n){Tn(t,0,e+r/2,t.transform.width,r,n)}function wn(t,e,r,n){Tn(t,e-r/2,0,r,t.transform.height,n)}function Tn(e,r,n,i,a,o){var s=e.context,l=s.gl;l.enable(l.SCISSOR_TEST),l.scissor(r*t.browser.devicePixelRatio,n*t.browser.devicePixelRatio,i*t.browser.devicePixelRatio,a*t.browser.devicePixelRatio),s.clear({color:o}),l.disable(l.SCISSOR_TEST)}function kn(e,r,n){var i=e.context,a=i.gl,o=n.posMatrix,s=e.useProgram("debug"),l=Mt.disabled,u=Et.disabled,c=e.colorModeForRenderPass(),f="$debug";i.activeTexture.set(a.TEXTURE0),e.emptyTexture.bind(a.LINEAR,a.CLAMP_TO_EDGE),s.draw(i,a.LINE_STRIP,l,u,c,Ct.disabled,zr(o,t.Color.red),f,e.debugBuffer,e.tileBorderIndexBuffer,e.debugSegments);var h=r.getTileByID(n.key).latestRawTileData,p=h&&h.byteLength||0,d=Math.floor(p/1024),v=r.getTile(n).tileSize,g=512/Math.min(v,512)*(n.overscaledZ/e.transform.zoom)*.5,y=n.canonical.toString();n.overscaledZ!==n.canonical.z&&(y+=" => "+n.overscaledZ),function(t,e){t.initDebugOverlayCanvas();var r=t.debugOverlayCanvas,n=t.context.gl,i=t.debugOverlayCanvas.getContext("2d");i.clearRect(0,0,r.width,r.height),i.shadowColor="white",i.shadowBlur=2,i.lineWidth=1.5,i.strokeStyle="white",i.textBaseline="top",i.font="bold 36px Open Sans, sans-serif",i.fillText(e,5,5),i.strokeText(e,5,5),t.debugOverlayTexture.update(r),t.debugOverlayTexture.bind(n.LINEAR,n.CLAMP_TO_EDGE)}(e,y+" "+d+"kb"),s.draw(i,a.TRIANGLES,l,u,Lt.alphaBlended,Ct.disabled,zr(o,t.Color.transparent,g),f,e.debugBuffer,e.quadTriangleIndexBuffer,e.debugSegments)}var An={symbol:function(e,r,n,i,a){if("translucent"===e.renderPass){var o=Et.disabled,s=e.colorModeForRenderPass();n.layout.get("text-variable-anchor")&&function(e,r,n,i,a,o,s){for(var l=r.transform,u="map"===a,c="map"===o,f=0,h=e;f256&&this.clearStencil(),r.setColorMode(Lt.disabled),r.setDepthMode(Mt.disabled);var i=this.useProgram("clippingMask");this._tileClippingMaskIDs={};for(var a=0,o=e;a256&&this.clearStencil();var t=this.nextStencilID++,e=this.context.gl;return new Et({func:e.NOTEQUAL,mask:255},t,255,e.KEEP,e.KEEP,e.REPLACE)},Mn.prototype.stencilModeForClipping=function(t){var e=this.context.gl;return new Et({func:e.EQUAL,mask:255},this._tileClippingMaskIDs[t.key],0,e.KEEP,e.KEEP,e.REPLACE)},Mn.prototype.stencilConfigForOverlap=function(t){var e,r=this.context.gl,n=t.sort((function(t,e){return e.overscaledZ-t.overscaledZ})),i=n[n.length-1].overscaledZ,a=n[0].overscaledZ-i+1;if(a>1){this.currentStencilSource=void 0,this.nextStencilID+a>256&&this.clearStencil();for(var o={},s=0;s=0;this.currentLayer--){var w=this.style._layers[i[this.currentLayer]],T=a[w.source],k=c[w.source];this._renderTileClippingMasks(w,k),this.renderLayer(this,T,w,k)}for(this.renderPass="translucent",this.currentLayer=0;this.currentLayer0?e.pop():null},Mn.prototype.isPatternMissing=function(t){if(!t)return!1;if(!t.from||!t.to)return!0;var e=this.imageManager.getPattern(t.from.toString()),r=this.imageManager.getPattern(t.to.toString());return!e||!r},Mn.prototype.useProgram=function(t,e){this.cache=this.cache||{};var r=""+t+(e?e.cacheKey:"")+(this._showOverdrawInspector?"/overdraw":"");return this.cache[r]||(this.cache[r]=new kr(this.context,wr[t],e,en[t],this._showOverdrawInspector)),this.cache[r]},Mn.prototype.setCustomLayerDefaults=function(){this.context.unbindVAO(),this.context.cullFace.setDefault(),this.context.activeTexture.setDefault(),this.context.pixelStoreUnpack.setDefault(),this.context.pixelStoreUnpackPremultiplyAlpha.setDefault(),this.context.pixelStoreUnpackFlipY.setDefault()},Mn.prototype.setBaseState=function(){var t=this.context.gl;this.context.cullFace.set(!1),this.context.viewport.set([0,0,this.width,this.height]),this.context.blendEquation.set(t.FUNC_ADD)},Mn.prototype.initDebugOverlayCanvas=function(){if(null==this.debugOverlayCanvas){this.debugOverlayCanvas=t.window.document.createElement("canvas"),this.debugOverlayCanvas.width=512,this.debugOverlayCanvas.height=512;var e=this.context.gl;this.debugOverlayTexture=new t.Texture(this.context,this.debugOverlayCanvas,e.RGBA)}},Mn.prototype.destroy=function(){this.emptyTexture.destroy(),this.debugOverlayTexture&&this.debugOverlayTexture.destroy()};var Sn=function(t,e){this.points=t,this.planes=e};Sn.fromInvProjectionMatrix=function(e,r,n){var i=Math.pow(2,n),a=[[-1,1,-1,1],[1,1,-1,1],[1,-1,-1,1],[-1,-1,-1,1],[-1,1,1,1],[1,1,1,1],[1,-1,1,1],[-1,-1,1,1]].map((function(r){return t.transformMat4([],r,e)})).map((function(e){return t.scale$1([],e,1/e[3]/r*i)})),o=[[0,1,2],[6,5,4],[0,3,7],[2,1,5],[3,2,6],[0,4,5]].map((function(e){var r=t.sub([],a[e[0]],a[e[1]]),n=t.sub([],a[e[2]],a[e[1]]),i=t.normalize([],t.cross([],r,n)),o=-t.dot(i,a[e[1]]);return i.concat(o)}));return new Sn(a,o)};var En=function(e,r){this.min=e,this.max=r,this.center=t.scale$2([],t.add([],this.min,this.max),.5)};En.prototype.quadrant=function(e){for(var r=[e%2==0,e<2],n=t.clone$2(this.min),i=t.clone$2(this.max),a=0;a=0;if(0===o)return 0;o!==r.length&&(n=!1)}if(n)return 2;for(var l=0;l<3;l++){for(var u=Number.MAX_VALUE,c=-Number.MAX_VALUE,f=0;fthis.max[l]-this.min[l])return 0}return 1};var Ln=function(t,e,r,n){if(void 0===t&&(t=0),void 0===e&&(e=0),void 0===r&&(r=0),void 0===n&&(n=0),isNaN(t)||t<0||isNaN(e)||e<0||isNaN(r)||r<0||isNaN(n)||n<0)throw new Error("Invalid value for edge-insets, top, bottom, left and right must all be numbers");this.top=t,this.bottom=e,this.left=r,this.right=n};Ln.prototype.interpolate=function(e,r,n){return null!=r.top&&null!=e.top&&(this.top=t.number(e.top,r.top,n)),null!=r.bottom&&null!=e.bottom&&(this.bottom=t.number(e.bottom,r.bottom,n)),null!=r.left&&null!=e.left&&(this.left=t.number(e.left,r.left,n)),null!=r.right&&null!=e.right&&(this.right=t.number(e.right,r.right,n)),this},Ln.prototype.getCenter=function(e,r){var n=t.clamp((this.left+e-this.right)/2,0,e),i=t.clamp((this.top+r-this.bottom)/2,0,r);return new t.Point(n,i)},Ln.prototype.equals=function(t){return this.top===t.top&&this.bottom===t.bottom&&this.left===t.left&&this.right===t.right},Ln.prototype.clone=function(){return new Ln(this.top,this.bottom,this.left,this.right)},Ln.prototype.toJSON=function(){return{top:this.top,bottom:this.bottom,left:this.left,right:this.right}};var Cn=function(e,r,n,i,a){this.tileSize=512,this.maxValidLatitude=85.051129,this._renderWorldCopies=void 0===a||a,this._minZoom=e||0,this._maxZoom=r||22,this._minPitch=null==n?0:n,this._maxPitch=null==i?60:i,this.setMaxBounds(),this.width=0,this.height=0,this._center=new t.LngLat(0,0),this.zoom=0,this.angle=0,this._fov=.6435011087932844,this._pitch=0,this._unmodified=!0,this._edgeInsets=new Ln,this._posMatrixCache={},this._alignedPosMatrixCache={}},Pn={minZoom:{configurable:!0},maxZoom:{configurable:!0},minPitch:{configurable:!0},maxPitch:{configurable:!0},renderWorldCopies:{configurable:!0},worldSize:{configurable:!0},centerOffset:{configurable:!0},size:{configurable:!0},bearing:{configurable:!0},pitch:{configurable:!0},fov:{configurable:!0},zoom:{configurable:!0},center:{configurable:!0},padding:{configurable:!0},centerPoint:{configurable:!0},unmodified:{configurable:!0},point:{configurable:!0}};Cn.prototype.clone=function(){var t=new Cn(this._minZoom,this._maxZoom,this._minPitch,this.maxPitch,this._renderWorldCopies);return t.tileSize=this.tileSize,t.latRange=this.latRange,t.width=this.width,t.height=this.height,t._center=this._center,t.zoom=this.zoom,t.angle=this.angle,t._fov=this._fov,t._pitch=this._pitch,t._unmodified=this._unmodified,t._edgeInsets=this._edgeInsets.clone(),t._calcMatrices(),t},Pn.minZoom.get=function(){return this._minZoom},Pn.minZoom.set=function(t){this._minZoom!==t&&(this._minZoom=t,this.zoom=Math.max(this.zoom,t))},Pn.maxZoom.get=function(){return this._maxZoom},Pn.maxZoom.set=function(t){this._maxZoom!==t&&(this._maxZoom=t,this.zoom=Math.min(this.zoom,t))},Pn.minPitch.get=function(){return this._minPitch},Pn.minPitch.set=function(t){this._minPitch!==t&&(this._minPitch=t,this.pitch=Math.max(this.pitch,t))},Pn.maxPitch.get=function(){return this._maxPitch},Pn.maxPitch.set=function(t){this._maxPitch!==t&&(this._maxPitch=t,this.pitch=Math.min(this.pitch,t))},Pn.renderWorldCopies.get=function(){return this._renderWorldCopies},Pn.renderWorldCopies.set=function(t){void 0===t?t=!0:null===t&&(t=!1),this._renderWorldCopies=t},Pn.worldSize.get=function(){return this.tileSize*this.scale},Pn.centerOffset.get=function(){return this.centerPoint._sub(this.size._div(2))},Pn.size.get=function(){return new t.Point(this.width,this.height)},Pn.bearing.get=function(){return-this.angle/Math.PI*180},Pn.bearing.set=function(e){var r=-t.wrap(e,-180,180)*Math.PI/180;this.angle!==r&&(this._unmodified=!1,this.angle=r,this._calcMatrices(),this.rotationMatrix=t.create$2(),t.rotate(this.rotationMatrix,this.rotationMatrix,this.angle))},Pn.pitch.get=function(){return this._pitch/Math.PI*180},Pn.pitch.set=function(e){var r=t.clamp(e,this.minPitch,this.maxPitch)/180*Math.PI;this._pitch!==r&&(this._unmodified=!1,this._pitch=r,this._calcMatrices())},Pn.fov.get=function(){return this._fov/Math.PI*180},Pn.fov.set=function(t){t=Math.max(.01,Math.min(60,t)),this._fov!==t&&(this._unmodified=!1,this._fov=t/180*Math.PI,this._calcMatrices())},Pn.zoom.get=function(){return this._zoom},Pn.zoom.set=function(t){var e=Math.min(Math.max(t,this.minZoom),this.maxZoom);this._zoom!==e&&(this._unmodified=!1,this._zoom=e,this.scale=this.zoomScale(e),this.tileZoom=Math.floor(e),this.zoomFraction=e-this.tileZoom,this._constrain(),this._calcMatrices())},Pn.center.get=function(){return this._center},Pn.center.set=function(t){t.lat===this._center.lat&&t.lng===this._center.lng||(this._unmodified=!1,this._center=t,this._constrain(),this._calcMatrices())},Pn.padding.get=function(){return this._edgeInsets.toJSON()},Pn.padding.set=function(t){this._edgeInsets.equals(t)||(this._unmodified=!1,this._edgeInsets.interpolate(this._edgeInsets,t,1),this._calcMatrices())},Pn.centerPoint.get=function(){return this._edgeInsets.getCenter(this.width,this.height)},Cn.prototype.isPaddingEqual=function(t){return this._edgeInsets.equals(t)},Cn.prototype.interpolatePadding=function(t,e,r){this._unmodified=!1,this._edgeInsets.interpolate(t,e,r),this._constrain(),this._calcMatrices()},Cn.prototype.coveringZoomLevel=function(t){var e=(t.roundZoom?Math.round:Math.floor)(this.zoom+this.scaleZoom(this.tileSize/t.tileSize));return Math.max(0,e)},Cn.prototype.getVisibleUnwrappedCoordinates=function(e){var r=[new t.UnwrappedTileID(0,e)];if(this._renderWorldCopies)for(var n=this.pointCoordinate(new t.Point(0,0)),i=this.pointCoordinate(new t.Point(this.width,0)),a=this.pointCoordinate(new t.Point(this.width,this.height)),o=this.pointCoordinate(new t.Point(0,this.height)),s=Math.floor(Math.min(n.x,i.x,a.x,o.x)),l=Math.floor(Math.max(n.x,i.x,a.x,o.x)),u=s-1;u<=l+1;u++)0!==u&&r.push(new t.UnwrappedTileID(u,e));return r},Cn.prototype.coveringTiles=function(e){var r=this.coveringZoomLevel(e),n=r;if(void 0!==e.minzoom&&re.maxzoom&&(r=e.maxzoom);var i=t.MercatorCoordinate.fromLngLat(this.center),a=Math.pow(2,r),o=[a*i.x,a*i.y,0],s=Sn.fromInvProjectionMatrix(this.invProjMatrix,this.worldSize,r),l=e.minzoom||0;this.pitch<=60&&this._edgeInsets.top<.1&&(l=r);var u=function(t){return{aabb:new En([t*a,0,0],[(t+1)*a,a,0]),zoom:0,x:0,y:0,wrap:t,fullyVisible:!1}},c=[],f=[],h=r,p=e.reparseOverscaled?n:r;if(this._renderWorldCopies)for(var d=1;d<=3;d++)c.push(u(-d)),c.push(u(d));for(c.push(u(0));c.length>0;){var v=c.pop(),g=v.x,y=v.y,m=v.fullyVisible;if(!m){var x=v.aabb.intersects(s);if(0===x)continue;m=2===x}var b=v.aabb.distanceX(o),_=v.aabb.distanceY(o),w=Math.max(Math.abs(b),Math.abs(_)),T=3+(1<T&&v.zoom>=l)f.push({tileID:new t.OverscaledTileID(v.zoom===h?p:v.zoom,v.wrap,v.zoom,g,y),distanceSq:t.sqrLen([o[0]-.5-g,o[1]-.5-y])});else for(var k=0;k<4;k++){var A=(g<<1)+k%2,M=(y<<1)+(k>>1);c.push({aabb:v.aabb.quadrant(k),zoom:v.zoom+1,x:A,y:M,wrap:v.wrap,fullyVisible:m})}}return f.sort((function(t,e){return t.distanceSq-e.distanceSq})).map((function(t){return t.tileID}))},Cn.prototype.resize=function(t,e){this.width=t,this.height=e,this.pixelsToGLUnits=[2/t,-2/e],this._constrain(),this._calcMatrices()},Pn.unmodified.get=function(){return this._unmodified},Cn.prototype.zoomScale=function(t){return Math.pow(2,t)},Cn.prototype.scaleZoom=function(t){return Math.log(t)/Math.LN2},Cn.prototype.project=function(e){var r=t.clamp(e.lat,-this.maxValidLatitude,this.maxValidLatitude);return new t.Point(t.mercatorXfromLng(e.lng)*this.worldSize,t.mercatorYfromLat(r)*this.worldSize)},Cn.prototype.unproject=function(e){return new t.MercatorCoordinate(e.x/this.worldSize,e.y/this.worldSize).toLngLat()},Pn.point.get=function(){return this.project(this.center)},Cn.prototype.setLocationAtPoint=function(e,r){var n=this.pointCoordinate(r),i=this.pointCoordinate(this.centerPoint),a=this.locationCoordinate(e),o=new t.MercatorCoordinate(a.x-(n.x-i.x),a.y-(n.y-i.y));this.center=this.coordinateLocation(o),this._renderWorldCopies&&(this.center=this.center.wrap())},Cn.prototype.locationPoint=function(t){return this.coordinatePoint(this.locationCoordinate(t))},Cn.prototype.pointLocation=function(t){return this.coordinateLocation(this.pointCoordinate(t))},Cn.prototype.locationCoordinate=function(e){return t.MercatorCoordinate.fromLngLat(e)},Cn.prototype.coordinateLocation=function(t){return t.toLngLat()},Cn.prototype.pointCoordinate=function(e){var r=[e.x,e.y,0,1],n=[e.x,e.y,1,1];t.transformMat4(r,r,this.pixelMatrixInverse),t.transformMat4(n,n,this.pixelMatrixInverse);var i=r[3],a=n[3],o=r[0]/i,s=n[0]/a,l=r[1]/i,u=n[1]/a,c=r[2]/i,f=n[2]/a,h=c===f?0:(0-c)/(f-c);return new t.MercatorCoordinate(t.number(o,s,h)/this.worldSize,t.number(l,u,h)/this.worldSize)},Cn.prototype.coordinatePoint=function(e){var r=[e.x*this.worldSize,e.y*this.worldSize,0,1];return t.transformMat4(r,r,this.pixelMatrix),new t.Point(r[0]/r[3],r[1]/r[3])},Cn.prototype.getBounds=function(){return(new t.LngLatBounds).extend(this.pointLocation(new t.Point(0,0))).extend(this.pointLocation(new t.Point(this.width,0))).extend(this.pointLocation(new t.Point(this.width,this.height))).extend(this.pointLocation(new t.Point(0,this.height)))},Cn.prototype.getMaxBounds=function(){return this.latRange&&2===this.latRange.length&&this.lngRange&&2===this.lngRange.length?new t.LngLatBounds([this.lngRange[0],this.latRange[0]],[this.lngRange[1],this.latRange[1]]):null},Cn.prototype.setMaxBounds=function(t){t?(this.lngRange=[t.getWest(),t.getEast()],this.latRange=[t.getSouth(),t.getNorth()],this._constrain()):(this.lngRange=null,this.latRange=[-this.maxValidLatitude,this.maxValidLatitude])},Cn.prototype.calculatePosMatrix=function(e,r){void 0===r&&(r=!1);var n=e.key,i=r?this._alignedPosMatrixCache:this._posMatrixCache;if(i[n])return i[n];var a=e.canonical,o=this.worldSize/this.zoomScale(a.z),s=a.x+Math.pow(2,a.z)*e.wrap,l=t.identity(new Float64Array(16));return t.translate(l,l,[s*o,a.y*o,0]),t.scale(l,l,[o/t.EXTENT,o/t.EXTENT,1]),t.multiply(l,r?this.alignedProjMatrix:this.projMatrix,l),i[n]=new Float32Array(l),i[n]},Cn.prototype.customLayerMatrix=function(){return this.mercatorMatrix.slice()},Cn.prototype._constrain=function(){if(this.center&&this.width&&this.height&&!this._constraining){this._constraining=!0;var e,r,n,i,a=-90,o=90,s=-180,l=180,u=this.size,c=this._unmodified;if(this.latRange){var f=this.latRange;a=t.mercatorYfromLat(f[1])*this.worldSize,e=(o=t.mercatorYfromLat(f[0])*this.worldSize)-ao&&(i=o-g)}if(this.lngRange){var y=p.x,m=u.x/2;y-ml&&(n=l-m)}void 0===n&&void 0===i||(this.center=this.unproject(new t.Point(void 0!==n?n:p.x,void 0!==i?i:p.y))),this._unmodified=c,this._constraining=!1}},Cn.prototype._calcMatrices=function(){if(this.height){var e=this._fov/2,r=this.centerOffset;this.cameraToCenterDistance=.5/Math.tan(e)*this.height;var n=Math.PI/2+this._pitch,i=this._fov*(.5+r.y/this.height),a=Math.sin(i)*this.cameraToCenterDistance/Math.sin(t.clamp(Math.PI-n-i,.01,Math.PI-.01)),o=this.point,s=o.x,l=o.y,u=1.01*(Math.cos(Math.PI/2-this._pitch)*a+this.cameraToCenterDistance),c=this.height/50,f=new Float64Array(16);t.perspective(f,this._fov,this.width/this.height,c,u),f[8]=2*-r.x/this.width,f[9]=2*r.y/this.height,t.scale(f,f,[1,-1,1]),t.translate(f,f,[0,0,-this.cameraToCenterDistance]),t.rotateX(f,f,this._pitch),t.rotateZ(f,f,this.angle),t.translate(f,f,[-s,-l,0]),this.mercatorMatrix=t.scale([],f,[this.worldSize,this.worldSize,this.worldSize]),t.scale(f,f,[1,1,t.mercatorZfromAltitude(1,this.center.lat)*this.worldSize,1]),this.projMatrix=f,this.invProjMatrix=t.invert([],this.projMatrix);var h=this.width%2/2,p=this.height%2/2,d=Math.cos(this.angle),v=Math.sin(this.angle),g=s-Math.round(s)+d*h+v*p,y=l-Math.round(l)+d*p+v*h,m=new Float64Array(f);if(t.translate(m,m,[g>.5?g-1:g,y>.5?y-1:y,0]),this.alignedProjMatrix=m,f=t.create(),t.scale(f,f,[this.width/2,-this.height/2,1]),t.translate(f,f,[1,-1,0]),this.labelPlaneMatrix=f,f=t.create(),t.scale(f,f,[1,-1,1]),t.translate(f,f,[-1,-1,0]),t.scale(f,f,[2/this.width,2/this.height,1]),this.glCoordMatrix=f,this.pixelMatrix=t.multiply(new Float64Array(16),this.labelPlaneMatrix,this.projMatrix),!(f=t.invert(new Float64Array(16),this.pixelMatrix)))throw new Error("failed to invert matrix");this.pixelMatrixInverse=f,this._posMatrixCache={},this._alignedPosMatrixCache={}}},Cn.prototype.maxPitchScaleFactor=function(){if(!this.pixelMatrixInverse)return 1;var e=this.pointCoordinate(new t.Point(0,0)),r=[e.x*this.worldSize,e.y*this.worldSize,0,1];return t.transformMat4(r,r,this.pixelMatrix)[3]/this.cameraToCenterDistance},Cn.prototype.getCameraPoint=function(){var e=this._pitch,r=Math.tan(e)*(this.cameraToCenterDistance||1);return this.centerPoint.add(new t.Point(0,r))},Cn.prototype.getCameraQueryGeometry=function(e){var r=this.getCameraPoint();if(1===e.length)return[e[0],r];for(var n=r.x,i=r.y,a=r.x,o=r.y,s=0,l=e;s=3&&!t.some((function(t){return isNaN(t)}))){var e=this._map.dragRotate.isEnabled()&&this._map.touchZoomRotate.isEnabled()?+(t[3]||0):this._map.getBearing();return this._map.jumpTo({center:[+t[2],+t[1]],zoom:+t[0],bearing:e,pitch:+(t[4]||0)}),!0}return!1},On.prototype._updateHashUnthrottled=function(){var e=this.getHashString();try{t.window.history.replaceState(t.window.history.state,"",e)}catch(t){}};var In={linearity:.3,easing:t.bezier(0,0,.3,1)},Dn=t.extend({deceleration:2500,maxSpeed:1400},In),zn=t.extend({deceleration:20,maxSpeed:1400},In),Rn=t.extend({deceleration:1e3,maxSpeed:360},In),Fn=t.extend({deceleration:1e3,maxSpeed:90},In),Bn=function(t){this._map=t,this.clear()};function Nn(t,e){(!t.duration||t.duration0&&r-e[0].time>160;)e.shift()},Bn.prototype._onMoveEnd=function(e){if(this._drainInertiaBuffer(),!(this._inertiaBuffer.length<2)){for(var r={zoom:0,bearing:0,pitch:0,pan:new t.Point(0,0),pinchAround:void 0,around:void 0},n=0,i=this._inertiaBuffer;n=this._clickTolerance||this._map.fire(new Un(t.type,this._map,t))},qn.prototype.dblclick=function(t){return this._firePreventable(new Un(t.type,this._map,t))},qn.prototype.mouseover=function(t){this._map.fire(new Un(t.type,this._map,t))},qn.prototype.mouseout=function(t){this._map.fire(new Un(t.type,this._map,t))},qn.prototype.touchstart=function(t){return this._firePreventable(new Vn(t.type,this._map,t))},qn.prototype.touchmove=function(t){this._map.fire(new Vn(t.type,this._map,t))},qn.prototype.touchend=function(t){this._map.fire(new Vn(t.type,this._map,t))},qn.prototype.touchcancel=function(t){this._map.fire(new Vn(t.type,this._map,t))},qn.prototype._firePreventable=function(t){if(this._map.fire(t),t.defaultPrevented)return{}},qn.prototype.isEnabled=function(){return!0},qn.prototype.isActive=function(){return!1},qn.prototype.enable=function(){},qn.prototype.disable=function(){};var Gn=function(t){this._map=t};Gn.prototype.reset=function(){this._delayContextMenu=!1,delete this._contextMenuEvent},Gn.prototype.mousemove=function(t){this._map.fire(new Un(t.type,this._map,t))},Gn.prototype.mousedown=function(){this._delayContextMenu=!0},Gn.prototype.mouseup=function(){this._delayContextMenu=!1,this._contextMenuEvent&&(this._map.fire(new Un("contextmenu",this._map,this._contextMenuEvent)),delete this._contextMenuEvent)},Gn.prototype.contextmenu=function(t){this._delayContextMenu?this._contextMenuEvent=t:this._map.fire(new Un(t.type,this._map,t)),this._map.listens("contextmenu")&&t.preventDefault()},Gn.prototype.isEnabled=function(){return!0},Gn.prototype.isActive=function(){return!1},Gn.prototype.enable=function(){},Gn.prototype.disable=function(){};var Zn=function(t,e){this._map=t,this._el=t.getCanvasContainer(),this._container=t.getContainer(),this._clickTolerance=e.clickTolerance||1};function Yn(t,e){for(var r={},n=0;nthis.numTouches)&&(this.aborted=!0),this.aborted||(void 0===this.startTime&&(this.startTime=e.timeStamp),n.length===this.numTouches&&(this.centroid=function(e){for(var r=new t.Point(0,0),n=0,i=e;n30)&&(this.aborted=!0)}}},Wn.prototype.touchend=function(t,e,r){if((!this.centroid||t.timeStamp-this.startTime>500)&&(this.aborted=!0),0===r.length){var n=!this.aborted&&this.centroid;if(this.reset(),n)return n}};var Xn=function(t){this.singleTap=new Wn(t),this.numTaps=t.numTaps,this.reset()};Xn.prototype.reset=function(){this.lastTime=1/0,delete this.lastTap,this.count=0,this.singleTap.reset()},Xn.prototype.touchstart=function(t,e,r){this.singleTap.touchstart(t,e,r)},Xn.prototype.touchmove=function(t,e,r){this.singleTap.touchmove(t,e,r)},Xn.prototype.touchend=function(t,e,r){var n=this.singleTap.touchend(t,e,r);if(n){var i=t.timeStamp-this.lastTime<500,a=!this.lastTap||this.lastTap.dist(n)<30;if(i&&a||this.reset(),this.count++,this.lastTime=t.timeStamp,this.lastTap=n,this.count===this.numTaps)return this.reset(),n}};var Jn=function(){this._zoomIn=new Xn({numTouches:1,numTaps:2}),this._zoomOut=new Xn({numTouches:2,numTaps:1}),this.reset()};Jn.prototype.reset=function(){this._active=!1,this._zoomIn.reset(),this._zoomOut.reset()},Jn.prototype.touchstart=function(t,e,r){this._zoomIn.touchstart(t,e,r),this._zoomOut.touchstart(t,e,r)},Jn.prototype.touchmove=function(t,e,r){this._zoomIn.touchmove(t,e,r),this._zoomOut.touchmove(t,e,r)},Jn.prototype.touchend=function(t,e,r){var n=this,i=this._zoomIn.touchend(t,e,r),a=this._zoomOut.touchend(t,e,r);return i?(this._active=!0,t.preventDefault(),setTimeout((function(){return n.reset()}),0),{cameraAnimation:function(e){return e.easeTo({duration:300,zoom:e.getZoom()+1,around:e.unproject(i)},{originalEvent:t})}}):a?(this._active=!0,t.preventDefault(),setTimeout((function(){return n.reset()}),0),{cameraAnimation:function(e){return e.easeTo({duration:300,zoom:e.getZoom()-1,around:e.unproject(a)},{originalEvent:t})}}):void 0},Jn.prototype.touchcancel=function(){this.reset()},Jn.prototype.enable=function(){this._enabled=!0},Jn.prototype.disable=function(){this._enabled=!1,this.reset()},Jn.prototype.isEnabled=function(){return this._enabled},Jn.prototype.isActive=function(){return this._active};var Kn=function(t){this.reset(),this._clickTolerance=t.clickTolerance||1};Kn.prototype.reset=function(){this._active=!1,this._moved=!1,delete this._lastPoint,delete this._eventButton},Kn.prototype._correctButton=function(t,e){return!1},Kn.prototype._move=function(t,e){return{}},Kn.prototype.mousedown=function(t,e){if(!this._lastPoint){var n=r.mouseButton(t);this._correctButton(t,n)&&(this._lastPoint=e,this._eventButton=n)}},Kn.prototype.mousemoveWindow=function(t,e){var r=this._lastPoint;if(r&&(t.preventDefault(),this._moved||!(e.dist(r)0&&(this._active=!0);var i=Yn(n,r),a=new t.Point(0,0),o=new t.Point(0,0),s=0;for(var l in i){var u=i[l],c=this._touches[l];c&&(a._add(u),o._add(u.sub(c)),s++,i[l]=u)}if(this._touches=i,!(sMath.abs(t.x)}var ui=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.reset=function(){t.prototype.reset.call(this),this._valid=void 0,delete this._firstMove,delete this._lastPoints},e.prototype._start=function(t){this._lastPoints=t,li(t[0].sub(t[1]))&&(this._valid=!1)},e.prototype._move=function(t,e,r){var n=t[0].sub(this._lastPoints[0]),i=t[1].sub(this._lastPoints[1]);if(this._valid=this.gestureBeginsVertically(n,i,r.timeStamp),this._valid)return this._lastPoints=t,this._active=!0,{pitchDelta:(n.y+i.y)/2*-.5}},e.prototype.gestureBeginsVertically=function(t,e,r){if(void 0!==this._valid)return this._valid;var n=t.mag()>=2,i=e.mag()>=2;if(n||i){if(!n||!i)return void 0===this._firstMove&&(this._firstMove=r),r-this._firstMove<100&&void 0;var a=t.y>0==e.y>0;return li(t)&&li(e)&&a}},e}(ri),ci={panStep:100,bearingStep:15,pitchStep:10},fi=function(){var t=ci;this._panStep=t.panStep,this._bearingStep=t.bearingStep,this._pitchStep=t.pitchStep};function hi(t){return t*(2-t)}fi.prototype.reset=function(){this._active=!1},fi.prototype.keydown=function(t){var e=this;if(!(t.altKey||t.ctrlKey||t.metaKey)){var r=0,n=0,i=0,a=0,o=0;switch(t.keyCode){case 61:case 107:case 171:case 187:r=1;break;case 189:case 109:case 173:r=-1;break;case 37:t.shiftKey?n=-1:(t.preventDefault(),a=-1);break;case 39:t.shiftKey?n=1:(t.preventDefault(),a=1);break;case 38:t.shiftKey?i=1:(t.preventDefault(),o=-1);break;case 40:t.shiftKey?i=-1:(t.preventDefault(),o=1);break;default:return}return{cameraAnimation:function(s){var l=s.getZoom();s.easeTo({duration:300,easeId:"keyboardHandler",easing:hi,zoom:r?Math.round(l)+r*(t.shiftKey?2:1):l,bearing:s.getBearing()+n*e._bearingStep,pitch:s.getPitch()+i*e._pitchStep,offset:[-a*e._panStep,-o*e._panStep],center:s.getCenter()},{originalEvent:t})}}}},fi.prototype.enable=function(){this._enabled=!0},fi.prototype.disable=function(){this._enabled=!1,this.reset()},fi.prototype.isEnabled=function(){return this._enabled},fi.prototype.isActive=function(){return this._active};var pi=4.000244140625,di=function(e,r){this._map=e,this._el=e.getCanvasContainer(),this._handler=r,this._delta=0,this._defaultZoomRate=.01,this._wheelZoomRate=.0022222222222222222,t.bindAll(["_onWheel","_onTimeout","_onScrollFrame","_onScrollFinished"],this)};di.prototype.setZoomRate=function(t){this._defaultZoomRate=t},di.prototype.setWheelZoomRate=function(t){this._wheelZoomRate=t},di.prototype.isEnabled=function(){return!!this._enabled},di.prototype.isActive=function(){return!!this._active||void 0!==this._finishTimeout},di.prototype.isZooming=function(){return!!this._zooming},di.prototype.enable=function(t){this.isEnabled()||(this._enabled=!0,this._aroundCenter=t&&"center"===t.around)},di.prototype.disable=function(){this.isEnabled()&&(this._enabled=!1)},di.prototype.wheel=function(e){if(this.isEnabled()){var r=e.deltaMode===t.window.WheelEvent.DOM_DELTA_LINE?40*e.deltaY:e.deltaY,n=t.browser.now(),i=n-(this._lastWheelEventTime||0);this._lastWheelEventTime=n,0!==r&&r%pi==0?this._type="wheel":0!==r&&Math.abs(r)<4?this._type="trackpad":i>400?(this._type=null,this._lastValue=r,this._timeout=setTimeout(this._onTimeout,40,e)):this._type||(this._type=Math.abs(i*r)<200?"trackpad":"wheel",this._timeout&&(clearTimeout(this._timeout),this._timeout=null,r+=this._lastValue)),e.shiftKey&&r&&(r/=4),this._type&&(this._lastWheelEvent=e,this._delta-=r,this._active||this._start(e)),e.preventDefault()}},di.prototype._onTimeout=function(t){this._type="wheel",this._delta-=this._lastValue,this._active||this._start(t)},di.prototype._start=function(e){if(this._delta){this._frameId&&(this._frameId=null),this._active=!0,this.isZooming()||(this._zooming=!0),this._finishTimeout&&(clearTimeout(this._finishTimeout),delete this._finishTimeout);var n=r.mousePos(this._el,e);this._around=t.LngLat.convert(this._aroundCenter?this._map.getCenter():this._map.unproject(n)),this._aroundPoint=this._map.transform.locationPoint(this._around),this._frameId||(this._frameId=!0,this._handler._triggerRenderFrame())}},di.prototype.renderFrame=function(){return this._onScrollFrame()},di.prototype._onScrollFrame=function(){var e=this;if(this._frameId&&(this._frameId=null,this.isActive())){var r=this._map.transform;if(0!==this._delta){var n="wheel"===this._type&&Math.abs(this._delta)>pi?this._wheelZoomRate:this._defaultZoomRate,i=2/(1+Math.exp(-Math.abs(this._delta*n)));this._delta<0&&0!==i&&(i=1/i);var a="number"==typeof this._targetZoom?r.zoomScale(this._targetZoom):r.scale;this._targetZoom=Math.min(r.maxZoom,Math.max(r.minZoom,r.scaleZoom(a*i))),"wheel"===this._type&&(this._startZoom=r.zoom,this._easing=this._smoothOutEasing(200)),this._delta=0}var o,s="number"==typeof this._targetZoom?this._targetZoom:r.zoom,l=this._startZoom,u=this._easing,c=!1;if("wheel"===this._type&&l&&u){var f=Math.min((t.browser.now()-this._lastWheelEventTime)/200,1),h=u(f);o=t.number(l,s,h),f<1?this._frameId||(this._frameId=!0):c=!0}else o=s,c=!0;return this._active=!0,c&&(this._active=!1,this._finishTimeout=setTimeout((function(){e._zooming=!1,e._handler._triggerRenderFrame(),delete e._targetZoom,delete e._finishTimeout}),200)),{noInertia:!0,needsRenderFrame:!c,zoomDelta:o-r.zoom,around:this._aroundPoint,originalEvent:this._lastWheelEvent}}},di.prototype._smoothOutEasing=function(e){var r=t.ease;if(this._prevEase){var n=this._prevEase,i=(t.browser.now()-n.start)/n.duration,a=n.easing(i+.01)-n.easing(i),o=.27/Math.sqrt(a*a+1e-4)*.01,s=Math.sqrt(.0729-o*o);r=t.bezier(o,s,.25,1)}return this._prevEase={start:t.browser.now(),duration:e,easing:r},r},di.prototype.reset=function(){this._active=!1};var vi=function(t,e){this._clickZoom=t,this._tapZoom=e};vi.prototype.enable=function(){this._clickZoom.enable(),this._tapZoom.enable()},vi.prototype.disable=function(){this._clickZoom.disable(),this._tapZoom.disable()},vi.prototype.isEnabled=function(){return this._clickZoom.isEnabled()&&this._tapZoom.isEnabled()},vi.prototype.isActive=function(){return this._clickZoom.isActive()||this._tapZoom.isActive()};var gi=function(){this.reset()};gi.prototype.reset=function(){this._active=!1},gi.prototype.dblclick=function(t,e){return t.preventDefault(),{cameraAnimation:function(r){r.easeTo({duration:300,zoom:r.getZoom()+(t.shiftKey?-1:1),around:r.unproject(e)},{originalEvent:t})}}},gi.prototype.enable=function(){this._enabled=!0},gi.prototype.disable=function(){this._enabled=!1,this.reset()},gi.prototype.isEnabled=function(){return this._enabled},gi.prototype.isActive=function(){return this._active};var yi=function(){this._tap=new Xn({numTouches:1,numTaps:1}),this.reset()};yi.prototype.reset=function(){this._active=!1,delete this._swipePoint,delete this._swipeTouch,delete this._tapTime,this._tap.reset()},yi.prototype.touchstart=function(t,e,r){this._swipePoint||(this._tapTime&&t.timeStamp-this._tapTime>500&&this.reset(),this._tapTime?r.length>0&&(this._swipePoint=e[0],this._swipeTouch=r[0].identifier):this._tap.touchstart(t,e,r))},yi.prototype.touchmove=function(t,e,r){if(this._tapTime){if(this._swipePoint){if(r[0].identifier!==this._swipeTouch)return;var n=e[0],i=n.y-this._swipePoint.y;return this._swipePoint=n,t.preventDefault(),this._active=!0,{zoomDelta:i/128}}}else this._tap.touchmove(t,e,r)},yi.prototype.touchend=function(t,e,r){this._tapTime?this._swipePoint&&0===r.length&&this.reset():this._tap.touchend(t,e,r)&&(this._tapTime=t.timeStamp)},yi.prototype.touchcancel=function(){this.reset()},yi.prototype.enable=function(){this._enabled=!0},yi.prototype.disable=function(){this._enabled=!1,this.reset()},yi.prototype.isEnabled=function(){return this._enabled},yi.prototype.isActive=function(){return this._active};var mi=function(t,e,r){this._el=t,this._mousePan=e,this._touchPan=r};mi.prototype.enable=function(t){this._inertiaOptions=t||{},this._mousePan.enable(),this._touchPan.enable(),this._el.classList.add("mapboxgl-touch-drag-pan")},mi.prototype.disable=function(){this._mousePan.disable(),this._touchPan.disable(),this._el.classList.remove("mapboxgl-touch-drag-pan")},mi.prototype.isEnabled=function(){return this._mousePan.isEnabled()&&this._touchPan.isEnabled()},mi.prototype.isActive=function(){return this._mousePan.isActive()||this._touchPan.isActive()};var xi=function(t,e,r){this._pitchWithRotate=t.pitchWithRotate,this._mouseRotate=e,this._mousePitch=r};xi.prototype.enable=function(){this._mouseRotate.enable(),this._pitchWithRotate&&this._mousePitch.enable()},xi.prototype.disable=function(){this._mouseRotate.disable(),this._mousePitch.disable()},xi.prototype.isEnabled=function(){return this._mouseRotate.isEnabled()&&(!this._pitchWithRotate||this._mousePitch.isEnabled())},xi.prototype.isActive=function(){return this._mouseRotate.isActive()||this._mousePitch.isActive()};var bi=function(t,e,r,n){this._el=t,this._touchZoom=e,this._touchRotate=r,this._tapDragZoom=n,this._rotationDisabled=!1,this._enabled=!0};bi.prototype.enable=function(t){this._touchZoom.enable(t),this._rotationDisabled||this._touchRotate.enable(t),this._tapDragZoom.enable(),this._el.classList.add("mapboxgl-touch-zoom-rotate")},bi.prototype.disable=function(){this._touchZoom.disable(),this._touchRotate.disable(),this._tapDragZoom.disable(),this._el.classList.remove("mapboxgl-touch-zoom-rotate")},bi.prototype.isEnabled=function(){return this._touchZoom.isEnabled()&&(this._rotationDisabled||this._touchRotate.isEnabled())&&this._tapDragZoom.isEnabled()},bi.prototype.isActive=function(){return this._touchZoom.isActive()||this._touchRotate.isActive()||this._tapDragZoom.isActive()},bi.prototype.disableRotation=function(){this._rotationDisabled=!0,this._touchRotate.disable()},bi.prototype.enableRotation=function(){this._rotationDisabled=!1,this._touchZoom.isEnabled()&&this._touchRotate.enable()};var _i=function(t){return t.zoom||t.drag||t.pitch||t.rotate},wi=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(t.Event);function Ti(t){return t.panDelta&&t.panDelta.mag()||t.zoomDelta||t.bearingDelta||t.pitchDelta}var ki=function(e,n){this._map=e,this._el=this._map.getCanvasContainer(),this._handlers=[],this._handlersById={},this._changes=[],this._inertia=new Bn(e),this._bearingSnap=n.bearingSnap,this._previousActiveHandlers={},this._eventsInProgress={},this._addDefaultHandlers(n),t.bindAll(["handleEvent","handleWindowEvent"],this);var i=this._el;this._listeners=[[i,"touchstart",{passive:!1}],[i,"touchmove",{passive:!1}],[i,"touchend",void 0],[i,"touchcancel",void 0],[i,"mousedown",void 0],[i,"mousemove",void 0],[i,"mouseup",void 0],[t.window.document,"mousemove",{capture:!0}],[t.window.document,"mouseup",void 0],[i,"mouseover",void 0],[i,"mouseout",void 0],[i,"dblclick",void 0],[i,"click",void 0],[i,"keydown",{capture:!1}],[i,"keyup",void 0],[i,"wheel",{passive:!1}],[i,"contextmenu",void 0],[t.window,"blur",void 0]];for(var a=0,o=this._listeners;aa?Math.min(2,_):Math.max(.5,_),w=Math.pow(g,1-e),T=i.unproject(x.add(b.mult(e*w)).mult(v));i.setLocationAtPoint(i.renderWorldCopies?T.wrap():T,d)}n._fireMoveEvents(r)}),(function(t){n._afterEase(r,t)}),e),this},r.prototype._prepareEase=function(e,r,n){void 0===n&&(n={}),this._moving=!0,r||n.moving||this.fire(new t.Event("movestart",e)),this._zooming&&!n.zooming&&this.fire(new t.Event("zoomstart",e)),this._rotating&&!n.rotating&&this.fire(new t.Event("rotatestart",e)),this._pitching&&!n.pitching&&this.fire(new t.Event("pitchstart",e))},r.prototype._fireMoveEvents=function(e){this.fire(new t.Event("move",e)),this._zooming&&this.fire(new t.Event("zoom",e)),this._rotating&&this.fire(new t.Event("rotate",e)),this._pitching&&this.fire(new t.Event("pitch",e))},r.prototype._afterEase=function(e,r){if(!this._easeId||!r||this._easeId!==r){delete this._easeId;var n=this._zooming,i=this._rotating,a=this._pitching;this._moving=!1,this._zooming=!1,this._rotating=!1,this._pitching=!1,this._padding=!1,n&&this.fire(new t.Event("zoomend",e)),i&&this.fire(new t.Event("rotateend",e)),a&&this.fire(new t.Event("pitchend",e)),this.fire(new t.Event("moveend",e))}},r.prototype.flyTo=function(e,r){var n=this;if(!e.essential&&t.browser.prefersReducedMotion){var i=t.pick(e,["center","zoom","bearing","pitch","around"]);return this.jumpTo(i,r)}this.stop(),e=t.extend({offset:[0,0],speed:1.2,curve:1.42,easing:t.ease},e);var a=this.transform,o=this.getZoom(),s=this.getBearing(),l=this.getPitch(),u=this.getPadding(),c="zoom"in e?t.clamp(+e.zoom,a.minZoom,a.maxZoom):o,f="bearing"in e?this._normalizeBearing(e.bearing,s):s,h="pitch"in e?+e.pitch:l,p="padding"in e?e.padding:a.padding,d=a.zoomScale(c-o),v=t.Point.convert(e.offset),g=a.centerPoint.add(v),y=a.pointLocation(g),m=t.LngLat.convert(e.center||y);this._normalizeCenter(m);var x=a.project(y),b=a.project(m).sub(x),_=e.curve,w=Math.max(a.width,a.height),T=w/d,k=b.mag();if("minZoom"in e){var A=t.clamp(Math.min(e.minZoom,o,c),a.minZoom,a.maxZoom),M=w/a.zoomScale(A-o);_=Math.sqrt(M/k*2)}var S=_*_;function E(t){var e=(T*T-w*w+(t?-1:1)*S*S*k*k)/(2*(t?T:w)*S*k);return Math.log(Math.sqrt(e*e+1)-e)}function L(t){return(Math.exp(t)-Math.exp(-t))/2}function C(t){return(Math.exp(t)+Math.exp(-t))/2}var P=E(0),O=function(t){return C(P)/C(P+_*t)},I=function(t){return w*((C(P)*(L(e=P+_*t)/C(e))-L(P))/S)/k;var e},D=(E(1)-P)/_;if(Math.abs(k)<1e-6||!isFinite(D)){if(Math.abs(w-T)<1e-6)return this.easeTo(e,r);var z=Te.maxDuration&&(e.duration=0),this._zooming=!0,this._rotating=s!==f,this._pitching=h!==l,this._padding=!a.isPaddingEqual(p),this._prepareEase(r,!1),this._ease((function(e){var i=e*D,d=1/O(i);a.zoom=1===e?c:o+a.scaleZoom(d),n._rotating&&(a.bearing=t.number(s,f,e)),n._pitching&&(a.pitch=t.number(l,h,e)),n._padding&&(a.interpolatePadding(u,p,e),g=a.centerPoint.add(v));var y=1===e?m:a.unproject(x.add(b.mult(I(i))).mult(d));a.setLocationAtPoint(a.renderWorldCopies?y.wrap():y,g),n._fireMoveEvents(r)}),(function(){return n._afterEase(r)}),e),this},r.prototype.isEasing=function(){return!!this._easeFrameId},r.prototype.stop=function(){return this._stop()},r.prototype._stop=function(t,e){if(this._easeFrameId&&(this._cancelRenderFrame(this._easeFrameId),delete this._easeFrameId,delete this._onEaseFrame),this._onEaseEnd){var r=this._onEaseEnd;delete this._onEaseEnd,r.call(this,e)}if(!t){var n=this.handlers;n&&n.stop()}return this},r.prototype._ease=function(e,r,n){!1===n.animate||0===n.duration?(e(1),r()):(this._easeStart=t.browser.now(),this._easeOptions=n,this._onEaseFrame=e,this._onEaseEnd=r,this._easeFrameId=this._requestRenderFrame(this._renderFrameCallback))},r.prototype._renderFrameCallback=function(){var e=Math.min((t.browser.now()-this._easeStart)/this._easeOptions.duration,1);this._onEaseFrame(this._easeOptions.easing(e)),e<1?this._easeFrameId=this._requestRenderFrame(this._renderFrameCallback):this.stop()},r.prototype._normalizeBearing=function(e,r){e=t.wrap(e,-180,180);var n=Math.abs(e-r);return Math.abs(e-360-r)180?-360:r<-180?360:0}},r}(t.Evented),Mi=function(e){void 0===e&&(e={}),this.options=e,t.bindAll(["_updateEditLink","_updateData","_updateCompact"],this)};Mi.prototype.getDefaultPosition=function(){return"bottom-right"},Mi.prototype.onAdd=function(t){var e=this.options&&this.options.compact;return this._map=t,this._container=r.create("div","mapboxgl-ctrl mapboxgl-ctrl-attrib"),this._innerContainer=r.create("div","mapboxgl-ctrl-attrib-inner",this._container),e&&this._container.classList.add("mapboxgl-compact"),this._updateAttributions(),this._updateEditLink(),this._map.on("styledata",this._updateData),this._map.on("sourcedata",this._updateData),this._map.on("moveend",this._updateEditLink),void 0===e&&(this._map.on("resize",this._updateCompact),this._updateCompact()),this._container},Mi.prototype.onRemove=function(){r.remove(this._container),this._map.off("styledata",this._updateData),this._map.off("sourcedata",this._updateData),this._map.off("moveend",this._updateEditLink),this._map.off("resize",this._updateCompact),this._map=void 0,this._attribHTML=void 0},Mi.prototype._updateEditLink=function(){var e=this._editLink;e||(e=this._editLink=this._container.querySelector(".mapbox-improve-map"));var r=[{key:"owner",value:this.styleOwner},{key:"id",value:this.styleId},{key:"access_token",value:this._map._requestManager._customAccessToken||t.config.ACCESS_TOKEN}];if(e){var n=r.reduce((function(t,e,n){return e.value&&(t+=e.key+"="+e.value+(n=0)return!1;return!0}))).join(" | ");o!==this._attribHTML&&(this._attribHTML=o,t.length?(this._innerContainer.innerHTML=o,this._container.classList.remove("mapboxgl-attrib-empty")):this._container.classList.add("mapboxgl-attrib-empty"),this._editLink=null)}},Mi.prototype._updateCompact=function(){this._map.getCanvasContainer().offsetWidth<=640?this._container.classList.add("mapboxgl-compact"):this._container.classList.remove("mapboxgl-compact")};var Si=function(){t.bindAll(["_updateLogo"],this),t.bindAll(["_updateCompact"],this)};Si.prototype.onAdd=function(t){this._map=t,this._container=r.create("div","mapboxgl-ctrl");var e=r.create("a","mapboxgl-ctrl-logo");return e.target="_blank",e.rel="noopener nofollow",e.href="https://www.mapbox.com/",e.setAttribute("aria-label",this._map._getUIString("LogoControl.Title")),e.setAttribute("rel","noopener nofollow"),this._container.appendChild(e),this._container.style.display="none",this._map.on("sourcedata",this._updateLogo),this._updateLogo(),this._map.on("resize",this._updateCompact),this._updateCompact(),this._container},Si.prototype.onRemove=function(){r.remove(this._container),this._map.off("sourcedata",this._updateLogo),this._map.off("resize",this._updateCompact)},Si.prototype.getDefaultPosition=function(){return"bottom-left"},Si.prototype._updateLogo=function(t){t&&"metadata"!==t.sourceDataType||(this._container.style.display=this._logoRequired()?"block":"none")},Si.prototype._logoRequired=function(){if(this._map.style){var t=this._map.style.sourceCaches;for(var e in t)if(t[e].getSource().mapbox_logo)return!0;return!1}},Si.prototype._updateCompact=function(){var t=this._container.children;if(t.length){var e=t[0];this._map.getCanvasContainer().offsetWidth<250?e.classList.add("mapboxgl-compact"):e.classList.remove("mapboxgl-compact")}};var Ei=function(){this._queue=[],this._id=0,this._cleared=!1,this._currentlyRunning=!1};Ei.prototype.add=function(t){var e=++this._id;return this._queue.push({callback:t,id:e,cancelled:!1}),e},Ei.prototype.remove=function(t){for(var e=this._currentlyRunning,r=0,n=e?this._queue.concat(e):this._queue;re.maxZoom)throw new Error("maxZoom must be greater than or equal to minZoom");if(null!=e.minPitch&&null!=e.maxPitch&&e.minPitch>e.maxPitch)throw new Error("maxPitch must be greater than or equal to minPitch");if(null!=e.minPitch&&e.minPitch<0)throw new Error("minPitch must be greater than or equal to 0");if(null!=e.maxPitch&&e.maxPitch>Ii)throw new Error("maxPitch must be less than or equal to 60");var i=new Cn(e.minZoom,e.maxZoom,e.minPitch,e.maxPitch,e.renderWorldCopies);if(n.call(this,i,e),this._interactive=e.interactive,this._maxTileCacheSize=e.maxTileCacheSize,this._failIfMajorPerformanceCaveat=e.failIfMajorPerformanceCaveat,this._preserveDrawingBuffer=e.preserveDrawingBuffer,this._antialias=e.antialias,this._trackResize=e.trackResize,this._bearingSnap=e.bearingSnap,this._refreshExpiredTiles=e.refreshExpiredTiles,this._fadeDuration=e.fadeDuration,this._crossSourceCollisions=e.crossSourceCollisions,this._crossFadingFactor=1,this._collectResourceTiming=e.collectResourceTiming,this._renderTaskQueue=new Ei,this._controls=[],this._mapId=t.uniqueId(),this._locale=t.extend({},Li,e.locale),this._requestManager=new t.RequestManager(e.transformRequest,e.accessToken),"string"==typeof e.container){if(this._container=t.window.document.getElementById(e.container),!this._container)throw new Error("Container '"+e.container+"' not found.")}else{if(!(e.container instanceof Pi))throw new Error("Invalid type: 'container' must be a String or HTMLElement.");this._container=e.container}if(e.maxBounds&&this.setMaxBounds(e.maxBounds),t.bindAll(["_onWindowOnline","_onWindowResize","_contextLost","_contextRestored"],this),this._setupContainer(),this._setupPainter(),void 0===this.painter)throw new Error("Failed to initialize WebGL.");this.on("move",(function(){return r._update(!1)})),this.on("moveend",(function(){return r._update(!1)})),this.on("zoom",(function(){return r._update(!0)})),void 0!==t.window&&(t.window.addEventListener("online",this._onWindowOnline,!1),t.window.addEventListener("resize",this._onWindowResize,!1)),this.handlers=new ki(this,e);var a="string"==typeof e.hash&&e.hash||void 0;this._hash=e.hash&&new On(a).addTo(this),this._hash&&this._hash._onHashChange()||(this.jumpTo({center:e.center,zoom:e.zoom,bearing:e.bearing,pitch:e.pitch}),e.bounds&&(this.resize(),this.fitBounds(e.bounds,t.extend({},e.fitBoundsOptions,{duration:0})))),this.resize(),this._localIdeographFontFamily=e.localIdeographFontFamily,e.style&&this.setStyle(e.style,{localIdeographFontFamily:e.localIdeographFontFamily}),e.attributionControl&&this.addControl(new Mi({customAttribution:e.customAttribution})),this.addControl(new Si,e.logoPosition),this.on("style.load",(function(){r.transform.unmodified&&r.jumpTo(r.style.stylesheet)})),this.on("data",(function(e){r._update("style"===e.dataType),r.fire(new t.Event(e.dataType+"data",e))})),this.on("dataloading",(function(e){r.fire(new t.Event(e.dataType+"dataloading",e))}))}n&&(i.__proto__=n),i.prototype=Object.create(n&&n.prototype),i.prototype.constructor=i;var a={showTileBoundaries:{configurable:!0},showPadding:{configurable:!0},showCollisionBoxes:{configurable:!0},showOverdrawInspector:{configurable:!0},repaint:{configurable:!0},vertices:{configurable:!0},version:{configurable:!0}};return i.prototype._getMapId=function(){return this._mapId},i.prototype.addControl=function(e,r){if(void 0===r&&e.getDefaultPosition&&(r=e.getDefaultPosition()),void 0===r&&(r="top-right"),!e||!e.onAdd)return this.fire(new t.ErrorEvent(new Error("Invalid argument to map.addControl(). Argument must be a control with onAdd and onRemove methods.")));var n=e.onAdd(this);this._controls.push(e);var i=this._controlPositions[r];return-1!==r.indexOf("bottom")?i.insertBefore(n,i.firstChild):i.appendChild(n),this},i.prototype.removeControl=function(e){if(!e||!e.onRemove)return this.fire(new t.ErrorEvent(new Error("Invalid argument to map.removeControl(). Argument must be a control with onAdd and onRemove methods.")));var r=this._controls.indexOf(e);return r>-1&&this._controls.splice(r,1),e.onRemove(this),this},i.prototype.resize=function(e){var r=this._containerDimensions(),n=r[0],i=r[1];this._resizeCanvas(n,i),this.transform.resize(n,i),this.painter.resize(n,i);var a=!this._moving;return a&&(this.stop(),this.fire(new t.Event("movestart",e)).fire(new t.Event("move",e))),this.fire(new t.Event("resize",e)),a&&this.fire(new t.Event("moveend",e)),this},i.prototype.getBounds=function(){return this.transform.getBounds()},i.prototype.getMaxBounds=function(){return this.transform.getMaxBounds()},i.prototype.setMaxBounds=function(e){return this.transform.setMaxBounds(t.LngLatBounds.convert(e)),this._update()},i.prototype.setMinZoom=function(t){if((t=null==t?-2:t)>=-2&&t<=this.transform.maxZoom)return this.transform.minZoom=t,this._update(),this.getZoom()=this.transform.minZoom)return this.transform.maxZoom=t,this._update(),this.getZoom()>t&&this.setZoom(t),this;throw new Error("maxZoom must be greater than the current minZoom")},i.prototype.getMaxZoom=function(){return this.transform.maxZoom},i.prototype.setMinPitch=function(t){if((t=null==t?0:t)<0)throw new Error("minPitch must be greater than or equal to 0");if(t>=0&&t<=this.transform.maxPitch)return this.transform.minPitch=t,this._update(),this.getPitch()Ii)throw new Error("maxPitch must be less than or equal to 60");if(t>=this.transform.minPitch)return this.transform.maxPitch=t,this._update(),this.getPitch()>t&&this.setPitch(t),this;throw new Error("maxPitch must be greater than the current minPitch")},i.prototype.getMaxPitch=function(){return this.transform.maxPitch},i.prototype.getRenderWorldCopies=function(){return this.transform.renderWorldCopies},i.prototype.setRenderWorldCopies=function(t){return this.transform.renderWorldCopies=t,this._update()},i.prototype.project=function(e){return this.transform.locationPoint(t.LngLat.convert(e))},i.prototype.unproject=function(e){return this.transform.pointLocation(t.Point.convert(e))},i.prototype.isMoving=function(){return this._moving||this.handlers.isMoving()},i.prototype.isZooming=function(){return this._zooming||this.handlers.isZooming()},i.prototype.isRotating=function(){return this._rotating||this.handlers.isRotating()},i.prototype._createDelegatedListener=function(t,e,r){var n,i=this;if("mouseenter"===t||"mouseover"===t){var a=!1;return{layer:e,listener:r,delegates:{mousemove:function(n){var o=i.getLayer(e)?i.queryRenderedFeatures(n.point,{layers:[e]}):[];o.length?a||(a=!0,r.call(i,new Un(t,i,n.originalEvent,{features:o}))):a=!1},mouseout:function(){a=!1}}}}if("mouseleave"===t||"mouseout"===t){var o=!1;return{layer:e,listener:r,delegates:{mousemove:function(n){(i.getLayer(e)?i.queryRenderedFeatures(n.point,{layers:[e]}):[]).length?o=!0:o&&(o=!1,r.call(i,new Un(t,i,n.originalEvent)))},mouseout:function(e){o&&(o=!1,r.call(i,new Un(t,i,e.originalEvent)))}}}}return{layer:e,listener:r,delegates:(n={},n[t]=function(t){var n=i.getLayer(e)?i.queryRenderedFeatures(t.point,{layers:[e]}):[];n.length&&(t.features=n,r.call(i,t),delete t.features)},n)}},i.prototype.on=function(t,e,r){if(void 0===r)return n.prototype.on.call(this,t,e);var i=this._createDelegatedListener(t,e,r);for(var a in this._delegatedListeners=this._delegatedListeners||{},this._delegatedListeners[t]=this._delegatedListeners[t]||[],this._delegatedListeners[t].push(i),i.delegates)this.on(a,i.delegates[a]);return this},i.prototype.once=function(t,e,r){if(void 0===r)return n.prototype.once.call(this,t,e);var i=this._createDelegatedListener(t,e,r);for(var a in i.delegates)this.once(a,i.delegates[a]);return this},i.prototype.off=function(t,e,r){var i=this;if(void 0===r)return n.prototype.off.call(this,t,e);return this._delegatedListeners&&this._delegatedListeners[t]&&function(n){for(var a=n[t],o=0;o180;){var s=n.locationPoint(e);if(s.x>=0&&s.y>=0&&s.x<=n.width&&s.y<=n.height)break;e.lng>n.center.lng?e.lng-=360:e.lng+=360}return e}Ni.prototype.down=function(t,e){this.mouseRotate.mousedown(t,e),this.mousePitch&&this.mousePitch.mousedown(t,e),r.disableDrag()},Ni.prototype.move=function(t,e){var r=this.map,n=this.mouseRotate.mousemoveWindow(t,e);if(n&&n.bearingDelta&&r.setBearing(r.getBearing()+n.bearingDelta),this.mousePitch){var i=this.mousePitch.mousemoveWindow(t,e);i&&i.pitchDelta&&r.setPitch(r.getPitch()+i.pitchDelta)}},Ni.prototype.off=function(){var t=this.element;r.removeEventListener(t,"mousedown",this.mousedown),r.removeEventListener(t,"touchstart",this.touchstart,{passive:!1}),r.removeEventListener(t,"touchmove",this.touchmove),r.removeEventListener(t,"touchend",this.touchend),r.removeEventListener(t,"touchcancel",this.reset),this.offTemp()},Ni.prototype.offTemp=function(){r.enableDrag(),r.removeEventListener(t.window,"mousemove",this.mousemove),r.removeEventListener(t.window,"mouseup",this.mouseup)},Ni.prototype.mousedown=function(e){this.down(t.extend({},e,{ctrlKey:!0,preventDefault:function(){return e.preventDefault()}}),r.mousePos(this.element,e)),r.addEventListener(t.window,"mousemove",this.mousemove),r.addEventListener(t.window,"mouseup",this.mouseup)},Ni.prototype.mousemove=function(t){this.move(t,r.mousePos(this.element,t))},Ni.prototype.mouseup=function(t){this.mouseRotate.mouseupWindow(t),this.mousePitch&&this.mousePitch.mouseupWindow(t),this.offTemp()},Ni.prototype.touchstart=function(t){1!==t.targetTouches.length?this.reset():(this._startPos=this._lastPos=r.touchPos(this.element,t.targetTouches)[0],this.down({type:"mousedown",button:0,ctrlKey:!0,preventDefault:function(){return t.preventDefault()}},this._startPos))},Ni.prototype.touchmove=function(t){1!==t.targetTouches.length?this.reset():(this._lastPos=r.touchPos(this.element,t.targetTouches)[0],this.move({preventDefault:function(){return t.preventDefault()}},this._lastPos))},Ni.prototype.touchend=function(t){0===t.targetTouches.length&&this._startPos&&this._lastPos&&this._startPos.dist(this._lastPos)e.getEast()||r.latitudee.getNorth())},n.prototype._setErrorState=function(){switch(this._watchState){case"WAITING_ACTIVE":this._watchState="ACTIVE_ERROR",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active-error");break;case"ACTIVE_LOCK":this._watchState="ACTIVE_ERROR",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active-error"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting");break;case"BACKGROUND":this._watchState="BACKGROUND_ERROR",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background-error"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting")}},n.prototype._onSuccess=function(e){if(this._map){if(this._isOutOfMapMaxBounds(e))return this._setErrorState(),this.fire(new t.Event("outofmaxbounds",e)),this._updateMarker(),void this._finish();if(this.options.trackUserLocation)switch(this._lastKnownPosition=e,this._watchState){case"WAITING_ACTIVE":case"ACTIVE_LOCK":case"ACTIVE_ERROR":this._watchState="ACTIVE_LOCK",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active-error"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active");break;case"BACKGROUND":case"BACKGROUND_ERROR":this._watchState="BACKGROUND",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background-error"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background")}this.options.showUserLocation&&"OFF"!==this._watchState&&this._updateMarker(e),this.options.trackUserLocation&&"ACTIVE_LOCK"!==this._watchState||this._updateCamera(e),this.options.showUserLocation&&this._dotElement.classList.remove("mapboxgl-user-location-dot-stale"),this.fire(new t.Event("geolocate",e)),this._finish()}},n.prototype._updateCamera=function(e){var r=new t.LngLat(e.coords.longitude,e.coords.latitude),n=e.coords.accuracy,i=this._map.getBearing(),a=t.extend({bearing:i},this.options.fitBoundsOptions);this._map.fitBounds(r.toBounds(n),a,{geolocateSource:!0})},n.prototype._updateMarker=function(e){if(e){var r=new t.LngLat(e.coords.longitude,e.coords.latitude);this._accuracyCircleMarker.setLngLat(r).addTo(this._map),this._userLocationDotMarker.setLngLat(r).addTo(this._map),this._accuracy=e.coords.accuracy,this.options.showUserLocation&&this.options.showAccuracyCircle&&this._updateCircleRadius()}else this._userLocationDotMarker.remove(),this._accuracyCircleMarker.remove()},n.prototype._updateCircleRadius=function(){var t=this._map._container.clientHeight/2,e=this._map.unproject([0,t]),r=this._map.unproject([1,t]),n=e.distanceTo(r),i=Math.ceil(2*this._accuracy/n);this._circleElement.style.width=i+"px",this._circleElement.style.height=i+"px"},n.prototype._onZoom=function(){this.options.showUserLocation&&this.options.showAccuracyCircle&&this._updateCircleRadius()},n.prototype._onError=function(e){if(this._map){if(this.options.trackUserLocation)if(1===e.code){this._watchState="OFF",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active-error"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background-error"),this._geolocateButton.disabled=!0;var r=this._map._getUIString("GeolocateControl.LocationNotAvailable");this._geolocateButton.title=r,this._geolocateButton.setAttribute("aria-label",r),void 0!==this._geolocationWatchID&&this._clearWatch()}else{if(3===e.code&&Yi)return;this._setErrorState()}"OFF"!==this._watchState&&this.options.showUserLocation&&this._dotElement.classList.add("mapboxgl-user-location-dot-stale"),this.fire(new t.Event("error",e)),this._finish()}},n.prototype._finish=function(){this._timeoutId&&clearTimeout(this._timeoutId),this._timeoutId=void 0},n.prototype._setupUI=function(e){var n=this;if(this._container.addEventListener("contextmenu",(function(t){return t.preventDefault()})),this._geolocateButton=r.create("button","mapboxgl-ctrl-geolocate",this._container),r.create("span","mapboxgl-ctrl-icon",this._geolocateButton).setAttribute("aria-hidden",!0),this._geolocateButton.type="button",!1===e){t.warnOnce("Geolocation support is not available so the GeolocateControl will be disabled.");var i=this._map._getUIString("GeolocateControl.LocationNotAvailable");this._geolocateButton.disabled=!0,this._geolocateButton.title=i,this._geolocateButton.setAttribute("aria-label",i)}else{var a=this._map._getUIString("GeolocateControl.FindMyLocation");this._geolocateButton.title=a,this._geolocateButton.setAttribute("aria-label",a)}this.options.trackUserLocation&&(this._geolocateButton.setAttribute("aria-pressed","false"),this._watchState="OFF"),this.options.showUserLocation&&(this._dotElement=r.create("div","mapboxgl-user-location-dot"),this._userLocationDotMarker=new qi(this._dotElement),this._circleElement=r.create("div","mapboxgl-user-location-accuracy-circle"),this._accuracyCircleMarker=new qi({element:this._circleElement,pitchAlignment:"map"}),this.options.trackUserLocation&&(this._watchState="OFF"),this._map.on("zoom",this._onZoom)),this._geolocateButton.addEventListener("click",this.trigger.bind(this)),this._setup=!0,this.options.trackUserLocation&&this._map.on("movestart",(function(e){var r=e.originalEvent&&"resize"===e.originalEvent.type;e.geolocateSource||"ACTIVE_LOCK"!==n._watchState||r||(n._watchState="BACKGROUND",n._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background"),n._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"),n.fire(new t.Event("trackuserlocationend")))}))},n.prototype.trigger=function(){if(!this._setup)return t.warnOnce("Geolocate control triggered before added to a map"),!1;if(this.options.trackUserLocation){switch(this._watchState){case"OFF":this._watchState="WAITING_ACTIVE",this.fire(new t.Event("trackuserlocationstart"));break;case"WAITING_ACTIVE":case"ACTIVE_LOCK":case"ACTIVE_ERROR":case"BACKGROUND_ERROR":Zi--,Yi=!1,this._watchState="OFF",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active-error"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background-error"),this.fire(new t.Event("trackuserlocationend"));break;case"BACKGROUND":this._watchState="ACTIVE_LOCK",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background"),this._lastKnownPosition&&this._updateCamera(this._lastKnownPosition),this.fire(new t.Event("trackuserlocationstart"))}switch(this._watchState){case"WAITING_ACTIVE":this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active");break;case"ACTIVE_LOCK":this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active");break;case"ACTIVE_ERROR":this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active-error");break;case"BACKGROUND":this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background");break;case"BACKGROUND_ERROR":this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background-error")}if("OFF"===this._watchState&&void 0!==this._geolocationWatchID)this._clearWatch();else if(void 0===this._geolocationWatchID){var e;this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.setAttribute("aria-pressed","true"),++Zi>1?(e={maximumAge:6e5,timeout:0},Yi=!0):(e=this.options.positionOptions,Yi=!1),this._geolocationWatchID=t.window.navigator.geolocation.watchPosition(this._onSuccess,this._onError,e)}}else t.window.navigator.geolocation.getCurrentPosition(this._onSuccess,this._onError,this.options.positionOptions),this._timeoutId=setTimeout(this._finish,1e4);return!0},n.prototype._clearWatch=function(){t.window.navigator.geolocation.clearWatch(this._geolocationWatchID),this._geolocationWatchID=void 0,this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.setAttribute("aria-pressed","false"),this.options.showUserLocation&&this._updateMarker(null)},n}(t.Evented),Xi={maxWidth:100,unit:"metric"},Ji=function(e){this.options=t.extend({},Xi,e),t.bindAll(["_onMove","setUnit"],this)};function Ki(t,e,r){var n=r&&r.maxWidth||100,i=t._container.clientHeight/2,a=t.unproject([0,i]),o=t.unproject([n,i]),s=a.distanceTo(o);if(r&&"imperial"===r.unit){var l=3.2808*s;l>5280?$i(e,n,l/5280,t._getUIString("ScaleControl.Miles")):$i(e,n,l,t._getUIString("ScaleControl.Feet"))}else r&&"nautical"===r.unit?$i(e,n,s/1852,t._getUIString("ScaleControl.NauticalMiles")):s>=1e3?$i(e,n,s/1e3,t._getUIString("ScaleControl.Kilometers")):$i(e,n,s,t._getUIString("ScaleControl.Meters"))}function $i(t,e,r,n){var i,a,o,s=(i=r,(a=Math.pow(10,(""+Math.floor(i)).length-1))*((o=i/a)>=10?10:o>=5?5:o>=3?3:o>=2?2:o>=1?1:function(t){var e=Math.pow(10,Math.ceil(-Math.log(t)/Math.LN10));return Math.round(t*e)/e}(o))),l=s/r;t.style.width=e*l+"px",t.innerHTML=s+" "+n}Ji.prototype.getDefaultPosition=function(){return"bottom-left"},Ji.prototype._onMove=function(){Ki(this._map,this._container,this.options)},Ji.prototype.onAdd=function(t){return this._map=t,this._container=r.create("div","mapboxgl-ctrl mapboxgl-ctrl-scale",t.getContainer()),this._map.on("move",this._onMove),this._onMove(),this._container},Ji.prototype.onRemove=function(){r.remove(this._container),this._map.off("move",this._onMove),this._map=void 0},Ji.prototype.setUnit=function(t){this.options.unit=t,Ki(this._map,this._container,this.options)};var Qi=function(e){this._fullscreen=!1,e&&e.container&&(e.container instanceof t.window.HTMLElement?this._container=e.container:t.warnOnce("Full screen control 'container' must be a DOM element.")),t.bindAll(["_onClickFullscreen","_changeIcon"],this),"onfullscreenchange"in t.window.document?this._fullscreenchange="fullscreenchange":"onmozfullscreenchange"in t.window.document?this._fullscreenchange="mozfullscreenchange":"onwebkitfullscreenchange"in t.window.document?this._fullscreenchange="webkitfullscreenchange":"onmsfullscreenchange"in t.window.document&&(this._fullscreenchange="MSFullscreenChange")};Qi.prototype.onAdd=function(e){return this._map=e,this._container||(this._container=this._map.getContainer()),this._controlContainer=r.create("div","mapboxgl-ctrl mapboxgl-ctrl-group"),this._checkFullscreenSupport()?this._setupUI():(this._controlContainer.style.display="none",t.warnOnce("This device does not support fullscreen mode.")),this._controlContainer},Qi.prototype.onRemove=function(){r.remove(this._controlContainer),this._map=null,t.window.document.removeEventListener(this._fullscreenchange,this._changeIcon)},Qi.prototype._checkFullscreenSupport=function(){return!!(t.window.document.fullscreenEnabled||t.window.document.mozFullScreenEnabled||t.window.document.msFullscreenEnabled||t.window.document.webkitFullscreenEnabled)},Qi.prototype._setupUI=function(){var e=this._fullscreenButton=r.create("button","mapboxgl-ctrl-fullscreen",this._controlContainer);r.create("span","mapboxgl-ctrl-icon",e).setAttribute("aria-hidden",!0),e.type="button",this._updateTitle(),this._fullscreenButton.addEventListener("click",this._onClickFullscreen),t.window.document.addEventListener(this._fullscreenchange,this._changeIcon)},Qi.prototype._updateTitle=function(){var t=this._getTitle();this._fullscreenButton.setAttribute("aria-label",t),this._fullscreenButton.title=t},Qi.prototype._getTitle=function(){return this._map._getUIString(this._isFullscreen()?"FullscreenControl.Exit":"FullscreenControl.Enter")},Qi.prototype._isFullscreen=function(){return this._fullscreen},Qi.prototype._changeIcon=function(){(t.window.document.fullscreenElement||t.window.document.mozFullScreenElement||t.window.document.webkitFullscreenElement||t.window.document.msFullscreenElement)===this._container!==this._fullscreen&&(this._fullscreen=!this._fullscreen,this._fullscreenButton.classList.toggle("mapboxgl-ctrl-shrink"),this._fullscreenButton.classList.toggle("mapboxgl-ctrl-fullscreen"),this._updateTitle())},Qi.prototype._onClickFullscreen=function(){this._isFullscreen()?t.window.document.exitFullscreen?t.window.document.exitFullscreen():t.window.document.mozCancelFullScreen?t.window.document.mozCancelFullScreen():t.window.document.msExitFullscreen?t.window.document.msExitFullscreen():t.window.document.webkitCancelFullScreen&&t.window.document.webkitCancelFullScreen():this._container.requestFullscreen?this._container.requestFullscreen():this._container.mozRequestFullScreen?this._container.mozRequestFullScreen():this._container.msRequestFullscreen?this._container.msRequestFullscreen():this._container.webkitRequestFullscreen&&this._container.webkitRequestFullscreen()};var ta={closeButton:!0,closeOnClick:!0,className:"",maxWidth:"240px"},ea=function(e){function n(r){e.call(this),this.options=t.extend(Object.create(ta),r),t.bindAll(["_update","_onClose","remove","_onMouseMove","_onMouseUp","_onDrag"],this)}return e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n,n.prototype.addTo=function(e){return this._map&&this.remove(),this._map=e,this.options.closeOnClick&&this._map.on("click",this._onClose),this.options.closeOnMove&&this._map.on("move",this._onClose),this._map.on("remove",this.remove),this._update(),this._trackPointer?(this._map.on("mousemove",this._onMouseMove),this._map.on("mouseup",this._onMouseUp),this._container&&this._container.classList.add("mapboxgl-popup-track-pointer"),this._map._canvasContainer.classList.add("mapboxgl-track-pointer")):this._map.on("move",this._update),this.fire(new t.Event("open")),this},n.prototype.isOpen=function(){return!!this._map},n.prototype.remove=function(){return this._content&&r.remove(this._content),this._container&&(r.remove(this._container),delete this._container),this._map&&(this._map.off("move",this._update),this._map.off("move",this._onClose),this._map.off("click",this._onClose),this._map.off("remove",this.remove),this._map.off("mousemove",this._onMouseMove),this._map.off("mouseup",this._onMouseUp),this._map.off("drag",this._onDrag),delete this._map),this.fire(new t.Event("close")),this},n.prototype.getLngLat=function(){return this._lngLat},n.prototype.setLngLat=function(e){return this._lngLat=t.LngLat.convert(e),this._pos=null,this._trackPointer=!1,this._update(),this._map&&(this._map.on("move",this._update),this._map.off("mousemove",this._onMouseMove),this._container&&this._container.classList.remove("mapboxgl-popup-track-pointer"),this._map._canvasContainer.classList.remove("mapboxgl-track-pointer")),this},n.prototype.trackPointer=function(){return this._trackPointer=!0,this._pos=null,this._update(),this._map&&(this._map.off("move",this._update),this._map.on("mousemove",this._onMouseMove),this._map.on("drag",this._onDrag),this._container&&this._container.classList.add("mapboxgl-popup-track-pointer"),this._map._canvasContainer.classList.add("mapboxgl-track-pointer")),this},n.prototype.getElement=function(){return this._container},n.prototype.setText=function(e){return this.setDOMContent(t.window.document.createTextNode(e))},n.prototype.setHTML=function(e){var r,n=t.window.document.createDocumentFragment(),i=t.window.document.createElement("body");for(i.innerHTML=e;r=i.firstChild;)n.appendChild(r);return this.setDOMContent(n)},n.prototype.getMaxWidth=function(){return this._container&&this._container.style.maxWidth},n.prototype.setMaxWidth=function(t){return this.options.maxWidth=t,this._update(),this},n.prototype.setDOMContent=function(t){return this._createContent(),this._content.appendChild(t),this._update(),this},n.prototype.addClassName=function(t){this._container&&this._container.classList.add(t)},n.prototype.removeClassName=function(t){this._container&&this._container.classList.remove(t)},n.prototype.toggleClassName=function(t){if(this._container)return this._container.classList.toggle(t)},n.prototype._createContent=function(){this._content&&r.remove(this._content),this._content=r.create("div","mapboxgl-popup-content",this._container),this.options.closeButton&&(this._closeButton=r.create("button","mapboxgl-popup-close-button",this._content),this._closeButton.type="button",this._closeButton.setAttribute("aria-label","Close popup"),this._closeButton.innerHTML="×",this._closeButton.addEventListener("click",this._onClose))},n.prototype._onMouseUp=function(t){this._update(t.point)},n.prototype._onMouseMove=function(t){this._update(t.point)},n.prototype._onDrag=function(t){this._update(t.point)},n.prototype._update=function(t){var e=this,n=this._lngLat||this._trackPointer;if(this._map&&n&&this._content&&(this._container||(this._container=r.create("div","mapboxgl-popup",this._map.getContainer()),this._tip=r.create("div","mapboxgl-popup-tip",this._container),this._container.appendChild(this._content),this.options.className&&this.options.className.split(" ").forEach((function(t){return e._container.classList.add(t)})),this._trackPointer&&this._container.classList.add("mapboxgl-popup-track-pointer")),this.options.maxWidth&&this._container.style.maxWidth!==this.options.maxWidth&&(this._container.style.maxWidth=this.options.maxWidth),this._map.transform.renderWorldCopies&&!this._trackPointer&&(this._lngLat=ji(this._lngLat,this._pos,this._map.transform)),!this._trackPointer||t)){var i=this._pos=this._trackPointer&&t?t:this._map.project(this._lngLat),a=this.options.anchor,o=ra(this.options.offset);if(!a){var s,l=this._container.offsetWidth,u=this._container.offsetHeight;s=i.y+o.bottom.ythis._map.transform.height-u?["bottom"]:[],i.xthis._map.transform.width-l/2&&s.push("right"),a=0===s.length?"bottom":s.join("-")}var c=i.add(o[a]).round();r.setTransform(this._container,Ui[a]+" translate("+c.x+"px,"+c.y+"px)"),Vi(this._container,a,"popup")}},n.prototype._onClose=function(){this.remove()},n}(t.Evented);function ra(e){if(e){if("number"==typeof e){var r=Math.round(Math.sqrt(.5*Math.pow(e,2)));return{center:new t.Point(0,0),top:new t.Point(0,e),"top-left":new t.Point(r,r),"top-right":new t.Point(-r,r),bottom:new t.Point(0,-e),"bottom-left":new t.Point(r,-r),"bottom-right":new t.Point(-r,-r),left:new t.Point(e,0),right:new t.Point(-e,0)}}if(e instanceof t.Point||Array.isArray(e)){var n=t.Point.convert(e);return{center:n,top:n,"top-left":n,"top-right":n,bottom:n,"bottom-left":n,"bottom-right":n,left:n,right:n}}return{center:t.Point.convert(e.center||[0,0]),top:t.Point.convert(e.top||[0,0]),"top-left":t.Point.convert(e["top-left"]||[0,0]),"top-right":t.Point.convert(e["top-right"]||[0,0]),bottom:t.Point.convert(e.bottom||[0,0]),"bottom-left":t.Point.convert(e["bottom-left"]||[0,0]),"bottom-right":t.Point.convert(e["bottom-right"]||[0,0]),left:t.Point.convert(e.left||[0,0]),right:t.Point.convert(e.right||[0,0])}}return ra(new t.Point(0,0))}var na={version:t.version,supported:e,setRTLTextPlugin:t.setRTLTextPlugin,getRTLTextPluginStatus:t.getRTLTextPluginStatus,Map:zi,NavigationControl:Bi,GeolocateControl:Wi,AttributionControl:Mi,ScaleControl:Ji,FullscreenControl:Qi,Popup:ea,Marker:qi,Style:Ye,LngLat:t.LngLat,LngLatBounds:t.LngLatBounds,Point:t.Point,MercatorCoordinate:t.MercatorCoordinate,Evented:t.Evented,config:t.config,prewarm:function(){jt().acquire(Rt)},clearPrewarmedResources:function(){var t=Bt;t&&(t.isPreloaded()&&1===t.numActive()?(t.release(Rt),Bt=null):console.warn("Could not clear WebWorkers since there are active Map instances that still reference it. The pre-warmed WebWorker pool can only be cleared when all map instances have been removed with map.remove()"))},get accessToken(){return t.config.ACCESS_TOKEN},set accessToken(e){t.config.ACCESS_TOKEN=e},get baseApiUrl(){return t.config.API_URL},set baseApiUrl(e){t.config.API_URL=e},get workerCount(){return Ft.workerCount},set workerCount(t){Ft.workerCount=t},get maxParallelImageRequests(){return t.config.MAX_PARALLEL_IMAGE_REQUESTS},set maxParallelImageRequests(e){t.config.MAX_PARALLEL_IMAGE_REQUESTS=e},clearStorage:function(e){t.clearTileCache(e)},workerUrl:""};return na})),r}()},27084:function(t){"use strict";t.exports=Math.log2||function(t){return Math.log(t)*Math.LOG2E}},16825:function(t,e,r){"use strict";t.exports=function(t,e){e||(e=t,t=window);var r=0,i=0,a=0,o={shift:!1,alt:!1,control:!1,meta:!1},s=!1;function l(t){var e=!1;return"altKey"in t&&(e=e||t.altKey!==o.alt,o.alt=!!t.altKey),"shiftKey"in t&&(e=e||t.shiftKey!==o.shift,o.shift=!!t.shiftKey),"ctrlKey"in t&&(e=e||t.ctrlKey!==o.control,o.control=!!t.ctrlKey),"metaKey"in t&&(e=e||t.metaKey!==o.meta,o.meta=!!t.metaKey),e}function u(t,s){var u=n.x(s),c=n.y(s);"buttons"in s&&(t=0|s.buttons),(t!==r||u!==i||c!==a||l(s))&&(r=0|t,i=u||0,a=c||0,e&&e(r,i,a,o))}function c(t){u(0,t)}function f(){(r||i||a||o.shift||o.alt||o.meta||o.control)&&(i=a=0,r=0,o.shift=o.alt=o.control=o.meta=!1,e&&e(0,0,0,o))}function h(t){l(t)&&e&&e(r,i,a,o)}function p(t){0===n.buttons(t)?u(0,t):u(r,t)}function d(t){u(r|n.buttons(t),t)}function v(t){u(r&~n.buttons(t),t)}function g(){s||(s=!0,t.addEventListener("mousemove",p),t.addEventListener("mousedown",d),t.addEventListener("mouseup",v),t.addEventListener("mouseleave",c),t.addEventListener("mouseenter",c),t.addEventListener("mouseout",c),t.addEventListener("mouseover",c),t.addEventListener("blur",f),t.addEventListener("keyup",h),t.addEventListener("keydown",h),t.addEventListener("keypress",h),t!==window&&(window.addEventListener("blur",f),window.addEventListener("keyup",h),window.addEventListener("keydown",h),window.addEventListener("keypress",h)))}g();var y={element:t};return Object.defineProperties(y,{enabled:{get:function(){return s},set:function(e){e?g():s&&(s=!1,t.removeEventListener("mousemove",p),t.removeEventListener("mousedown",d),t.removeEventListener("mouseup",v),t.removeEventListener("mouseleave",c),t.removeEventListener("mouseenter",c),t.removeEventListener("mouseout",c),t.removeEventListener("mouseover",c),t.removeEventListener("blur",f),t.removeEventListener("keyup",h),t.removeEventListener("keydown",h),t.removeEventListener("keypress",h),t!==window&&(window.removeEventListener("blur",f),window.removeEventListener("keyup",h),window.removeEventListener("keydown",h),window.removeEventListener("keypress",h)))},enumerable:!0},buttons:{get:function(){return r},enumerable:!0},x:{get:function(){return i},enumerable:!0},y:{get:function(){return a},enumerable:!0},mods:{get:function(){return o},enumerable:!0}}),y};var n=r(74311)},48956:function(t){var e={left:0,top:0};t.exports=function(t,r,n){r=r||t.currentTarget||t.srcElement,Array.isArray(n)||(n=[0,0]);var i,a=t.clientX||0,o=t.clientY||0,s=(i=r)===window||i===document||i===document.body?e:i.getBoundingClientRect();return n[0]=a-s.left,n[1]=o-s.top,n}},74311:function(t,e){"use strict";function r(t){return t.target||t.srcElement||window}e.buttons=function(t){if("object"==typeof t){if("buttons"in t)return t.buttons;if("which"in t){if(2===(e=t.which))return 4;if(3===e)return 2;if(e>0)return 1<=0)return 1<0&&a(s,r))}catch(t){c.call(new h(r),t)}}}function c(t){var e=this;e.triggered||(e.triggered=!0,e.def&&(e=e.def),e.msg=t,e.state=2,e.chain.length>0&&a(s,e))}function f(t,e,r,n){for(var i=0;i1&&(i*=y=Math.sqrt(y),s*=y);var m=i*i,x=s*s,b=(u==c?-1:1)*Math.sqrt(Math.abs((m*x-m*g*g-x*v*v)/(m*g*g+x*v*v)));b==1/0&&(b=1);var _=b*i*g/s+(t+f)/2,w=b*-s*v/i+(n+h)/2,T=Math.asin(((n-w)/s).toFixed(9)),k=Math.asin(((h-w)/s).toFixed(9));(T=t<_?e-T:T)<0&&(T=2*e+T),(k=f<_?e-k:k)<0&&(k=2*e+k),c&&T>k&&(T-=2*e),!c&&k>T&&(k-=2*e)}if(Math.abs(k-T)>r){var A=k,M=f,S=h;k=T+r*(c&&k>T?1:-1);var E=a(f=_+i*Math.cos(k),h=w+s*Math.sin(k),i,s,l,0,c,M,S,[k,A,_,w])}var L=Math.tan((k-T)/4),C=4/3*i*L,P=4/3*s*L,O=[2*t-(t+C*Math.sin(T)),2*n-(n-P*Math.cos(T)),f+C*Math.sin(k),h-P*Math.cos(k),f,h];if(p)return O;E&&(O=O.concat(E));for(var I=0;I7&&(r.push(y.splice(0,7)),y.unshift("C"));break;case"S":var x=p,b=d;"C"!=e&&"S"!=e||(x+=x-o,b+=b-l),y=["C",x,b,y[1],y[2],y[3],y[4]];break;case"T":"Q"==e||"T"==e?(f=2*p-f,h=2*d-h):(f=p,h=d),y=i(p,d,f,h,y[1],y[2]);break;case"Q":f=y[1],h=y[2],y=i(p,d,y[1],y[2],y[3],y[4]);break;case"L":y=n(p,d,y[1],y[2]);break;case"H":y=n(p,d,y[1],d);break;case"V":y=n(p,d,p,y[1]);break;case"Z":y=n(p,d,u,c)}e=m,p=y[y.length-2],d=y[y.length-1],y.length>4?(o=y[y.length-4],l=y[y.length-3]):(o=p,l=d),r.push(y)}return r}},56131:function(t){"use strict";var e=Object.getOwnPropertySymbols,r=Object.prototype.hasOwnProperty,n=Object.prototype.propertyIsEnumerable;t.exports=function(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de","5"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},r=0;r<10;r++)e["_"+String.fromCharCode(r)]=r;if("0123456789"!==Object.getOwnPropertyNames(e).map((function(t){return e[t]})).join(""))return!1;var n={};return"abcdefghijklmnopqrst".split("").forEach((function(t){n[t]=t})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},n)).join("")}catch(t){return!1}}()?Object.assign:function(t,i){for(var a,o,s=function(t){if(null==t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}(t),l=1;l0&&!i.call(t,0))for(var v=0;v0)for(var g=0;g=0&&"[object Function]"===e.call(t.callee)),n}},88641:function(t){"use strict";function e(t,e){if("string"!=typeof t)return[t];var r=[t];"string"==typeof e||Array.isArray(e)?e={brackets:e}:e||(e={});var n=e.brackets?Array.isArray(e.brackets)?e.brackets:[e.brackets]:["{}","[]","()"],i=e.escape||"___",a=!!e.flat;n.forEach((function(t){var e=new RegExp(["\\",t[0],"[^\\",t[0],"\\",t[1],"]*\\",t[1]].join("")),n=[];function a(e,a,o){var s=r.push(e.slice(t[0].length,-t[1].length))-1;return n.push(s),i+s+i}r.forEach((function(t,n){for(var i,o=0;t!=i;)if(i=t,t=t.replace(e,a),o++>1e4)throw Error("References have circular dependency. Please, check them.");r[n]=t})),n=n.reverse(),r=r.map((function(e){return n.forEach((function(r){e=e.replace(new RegExp("(\\"+i+r+"\\"+i+")","g"),t[0]+"$1"+t[1])})),e}))}));var o=new RegExp("\\"+i+"([0-9]+)\\"+i);return a?r:function t(e,r,n){for(var i,a=[],s=0;i=o.exec(e);){if(s++>1e4)throw Error("Circular references in parenthesis");a.push(e.slice(0,i.index)),a.push(t(r[i[1]],r)),e=e.slice(i.index+i[0].length)}return a.push(e),a}(r[0],r)}function r(t,e){if(e&&e.flat){var r,n=e&&e.escape||"___",i=t[0];if(!i)return"";for(var a=new RegExp("\\"+n+"([0-9]+)\\"+n),o=0;i!=r;){if(o++>1e4)throw Error("Circular references in "+t);r=i,i=i.replace(a,s)}return i}return t.reduce((function t(e,r){return Array.isArray(r)&&(r=r.reduce(t,"")),e+r}),"");function s(e,r){if(null==t[r])throw Error("Reference "+r+"is undefined");return t[r]}}function n(t,n){return Array.isArray(t)?r(t,n):e(t,n)}n.parse=e,n.stringify=r,t.exports=n},18863:function(t,e,r){"use strict";var n=r(71299);t.exports=function(t){var e;return arguments.length>1&&(t=arguments),"string"==typeof t?t=t.split(/\s/).map(parseFloat):"number"==typeof t&&(t=[t]),t.length&&"number"==typeof t[0]?e=1===t.length?{width:t[0],height:t[0],x:0,y:0}:2===t.length?{width:t[0],height:t[1],x:0,y:0}:{x:t[0],y:t[1],width:t[2]-t[0]||0,height:t[3]-t[1]||0}:t&&(e={x:(t=n(t,{left:"x l left Left",top:"y t top Top",width:"w width W Width",height:"h height W Width",bottom:"b bottom Bottom",right:"r right Right"})).left||0,y:t.top||0},null==t.width?t.right?e.width=t.right-e.x:e.width=0:e.width=t.width,null==t.height?t.bottom?e.height=t.bottom-e.y:e.height=0:e.height=t.height),e}},95616:function(t){t.exports=function(t){var i=[];return t.replace(r,(function(t,r,a){var o=r.toLowerCase();for(a=function(t){var e=t.match(n);return e?e.map(Number):[]}(a),"m"==o&&a.length>2&&(i.push([r].concat(a.splice(0,2))),o="l",r="m"==r?"l":"L");;){if(a.length==e[o])return a.unshift(r),i.push(a);if(a.lengtha!=p>a&&i<(h-c)*(a-f)/(p-f)+c&&(o=!o)}return o}},52142:function(t,e,r){var n,i=r(69444),a=r(29023),o=r(87263),s=r(11328),l=r(55968),u=r(10670),c=!1,f=a();function h(t,e,r){var i=n.segments(t),a=n.segments(e),o=r(n.combine(i,a));return n.polygon(o)}n={buildLog:function(t){return!0===t?c=i():!1===t&&(c=!1),!1!==c&&c.list},epsilon:function(t){return f.epsilon(t)},segments:function(t){var e=o(!0,f,c);return t.regions.forEach(e.addRegion),{segments:e.calculate(t.inverted),inverted:t.inverted}},combine:function(t,e){return{combined:o(!1,f,c).calculate(t.segments,t.inverted,e.segments,e.inverted),inverted1:t.inverted,inverted2:e.inverted}},selectUnion:function(t){return{segments:l.union(t.combined,c),inverted:t.inverted1||t.inverted2}},selectIntersect:function(t){return{segments:l.intersect(t.combined,c),inverted:t.inverted1&&t.inverted2}},selectDifference:function(t){return{segments:l.difference(t.combined,c),inverted:t.inverted1&&!t.inverted2}},selectDifferenceRev:function(t){return{segments:l.differenceRev(t.combined,c),inverted:!t.inverted1&&t.inverted2}},selectXor:function(t){return{segments:l.xor(t.combined,c),inverted:t.inverted1!==t.inverted2}},polygon:function(t){return{regions:s(t.segments,f,c),inverted:t.inverted}},polygonFromGeoJSON:function(t){return u.toPolygon(n,t)},polygonToGeoJSON:function(t){return u.fromPolygon(n,f,t)},union:function(t,e){return h(t,e,n.selectUnion)},intersect:function(t,e){return h(t,e,n.selectIntersect)},difference:function(t,e){return h(t,e,n.selectDifference)},differenceRev:function(t,e){return h(t,e,n.selectDifferenceRev)},xor:function(t,e){return h(t,e,n.selectXor)}},"object"==typeof window&&(window.PolyBool=n),t.exports=n},69444:function(t){t.exports=function(){var t,e=0,r=!1;function n(e,r){return t.list.push({type:e,data:r?JSON.parse(JSON.stringify(r)):void 0}),t}return t={list:[],segmentId:function(){return e++},checkIntersection:function(t,e){return n("check",{seg1:t,seg2:e})},segmentChop:function(t,e){return n("div_seg",{seg:t,pt:e}),n("chop",{seg:t,pt:e})},statusRemove:function(t){return n("pop_seg",{seg:t})},segmentUpdate:function(t){return n("seg_update",{seg:t})},segmentNew:function(t,e){return n("new_seg",{seg:t,primary:e})},segmentRemove:function(t){return n("rem_seg",{seg:t})},tempStatus:function(t,e,r){return n("temp_status",{seg:t,above:e,below:r})},rewind:function(t){return n("rewind",{seg:t})},status:function(t,e,r){return n("status",{seg:t,above:e,below:r})},vert:function(e){return e===r?t:(r=e,n("vert",{x:e}))},log:function(t){return"string"!=typeof t&&(t=JSON.stringify(t,!1," ")),n("log",{txt:t})},reset:function(){return n("reset")},selected:function(t){return n("selected",{segs:t})},chainStart:function(t){return n("chain_start",{seg:t})},chainRemoveHead:function(t,e){return n("chain_rem_head",{index:t,pt:e})},chainRemoveTail:function(t,e){return n("chain_rem_tail",{index:t,pt:e})},chainNew:function(t,e){return n("chain_new",{pt1:t,pt2:e})},chainMatch:function(t){return n("chain_match",{index:t})},chainClose:function(t){return n("chain_close",{index:t})},chainAddHead:function(t,e){return n("chain_add_head",{index:t,pt:e})},chainAddTail:function(t,e){return n("chain_add_tail",{index:t,pt:e})},chainConnect:function(t,e){return n("chain_con",{index1:t,index2:e})},chainReverse:function(t){return n("chain_rev",{index:t})},chainJoin:function(t,e){return n("chain_join",{index1:t,index2:e})},done:function(){return n("done")}}}},29023:function(t){t.exports=function(t){"number"!=typeof t&&(t=1e-10);var e={epsilon:function(e){return"number"==typeof e&&(t=e),t},pointAboveOrOnLine:function(e,r,n){var i=r[0],a=r[1],o=n[0],s=n[1],l=e[0];return(o-i)*(e[1]-a)-(s-a)*(l-i)>=-t},pointBetween:function(e,r,n){var i=e[1]-r[1],a=n[0]-r[0],o=e[0]-r[0],s=n[1]-r[1],l=o*a+i*s;return!(l-t)},pointsSameX:function(e,r){return Math.abs(e[0]-r[0])t!=o-i>t&&(a-u)*(i-c)/(o-c)+u-n>t&&(s=!s),a=u,o=c}return s}};return e}},10670:function(t){var e={toPolygon:function(t,e){function r(e){if(e.length<=0)return t.segments({inverted:!1,regions:[]});function r(e){var r=e.slice(0,e.length-1);return t.segments({inverted:!1,regions:[r]})}for(var n=r(e[0]),i=1;i0}))}function c(t,n){var i=t.seg,a=n.seg,o=i.start,s=i.end,u=a.start,c=a.end;r&&r.checkIntersection(i,a);var f=e.linesIntersect(o,s,u,c);if(!1===f){if(!e.pointsCollinear(o,s,u))return!1;if(e.pointsSame(o,c)||e.pointsSame(s,u))return!1;var h=e.pointsSame(o,u),p=e.pointsSame(s,c);if(h&&p)return n;var d=!h&&e.pointBetween(o,u,c),v=!p&&e.pointBetween(s,u,c);if(h)return v?l(n,s):l(t,c),n;d&&(p||(v?l(n,s):l(t,c)),l(n,o))}else 0===f.alongA&&(-1===f.alongB?l(t,u):0===f.alongB?l(t,f.pt):1===f.alongB&&l(t,c)),0===f.alongB&&(-1===f.alongA?l(n,o):0===f.alongA?l(n,f.pt):1===f.alongA&&l(n,s));return!1}for(var f=[];!a.isEmpty();){var h=a.getHead();if(r&&r.vert(h.pt[0]),h.isStart){r&&r.segmentNew(h.seg,h.primary);var p=u(h),d=p.before?p.before.ev:null,v=p.after?p.after.ev:null;function g(){if(d){var t=c(h,d);if(t)return t}return!!v&&c(h,v)}r&&r.tempStatus(h.seg,!!d&&d.seg,!!v&&v.seg);var y,m,x=g();if(x)t?(m=null===h.seg.myFill.below||h.seg.myFill.above!==h.seg.myFill.below)&&(x.seg.myFill.above=!x.seg.myFill.above):x.seg.otherFill=h.seg.myFill,r&&r.segmentUpdate(x.seg),h.other.remove(),h.remove();if(a.getHead()!==h){r&&r.rewind(h.seg);continue}t?(m=null===h.seg.myFill.below||h.seg.myFill.above!==h.seg.myFill.below,h.seg.myFill.below=v?v.seg.myFill.above:i,h.seg.myFill.above=m?!h.seg.myFill.below:h.seg.myFill.below):null===h.seg.otherFill&&(y=v?h.primary===v.primary?v.seg.otherFill.above:v.seg.myFill.above:h.primary?o:i,h.seg.otherFill={above:y,below:y}),r&&r.status(h.seg,!!d&&d.seg,!!v&&v.seg),h.other.status=p.insert(n.node({ev:h}))}else{var b=h.status;if(null===b)throw new Error("PolyBool: Zero-length segment detected; your epsilon is probably too small or too large");if(s.exists(b.prev)&&s.exists(b.next)&&c(b.prev.ev,b.next.ev),r&&r.statusRemove(b.ev.seg),b.remove(),!h.primary){var _=h.seg.myFill;h.seg.myFill=h.seg.otherFill,h.seg.otherFill=_}f.push(h.seg)}a.getHead().remove()}return r&&r.done(),f}return t?{addRegion:function(t){for(var n,i,a,o=t[t.length-1],l=0;l0&&!this.aborted;){var r=this.ifds_to_read.shift();r.offset&&this.scan_ifd(r.id,r.offset,t)}},n.prototype.read_uint16=function(t){var r=this.input;if(t+2>r.length)throw e("unexpected EOF","EBADDATA");return this.big_endian?256*r[t]+r[t+1]:r[t]+256*r[t+1]},n.prototype.read_uint32=function(t){var r=this.input;if(t+4>r.length)throw e("unexpected EOF","EBADDATA");return this.big_endian?16777216*r[t]+65536*r[t+1]+256*r[t+2]+r[t+3]:r[t]+256*r[t+1]+65536*r[t+2]+16777216*r[t+3]},n.prototype.is_subifd_link=function(t,e){return 0===t&&34665===e||0===t&&34853===e||34665===t&&40965===e},n.prototype.exif_format_length=function(t){switch(t){case 1:case 2:case 6:case 7:return 1;case 3:case 8:return 2;case 4:case 9:case 11:return 4;case 5:case 10:case 12:return 8;default:return 0}},n.prototype.exif_format_read=function(t,e){var r;switch(t){case 1:case 2:return this.input[e];case 6:return(r=this.input[e])|33554430*(128&r);case 3:return this.read_uint16(e);case 8:return(r=this.read_uint16(e))|131070*(32768&r);case 4:return this.read_uint32(e);case 9:return 0|this.read_uint32(e);default:return null}},n.prototype.scan_ifd=function(t,n,i){var a=this.read_uint16(n);n+=2;for(var o=0;othis.input.length)throw e("unexpected EOF","EBADDATA");for(var d=[],v=h,g=0;g0&&(this.ifds_to_read.push({id:s,offset:d[0]}),p=!0),!1===i({is_big_endian:this.big_endian,ifd:t,tag:s,format:l,count:u,entry_offset:n+this.start,data_length:f,data_offset:h+this.start,value:d,is_subifd_link:p}))return void(this.aborted=!0);n+=12}0===t&&this.ifds_to_read.push({id:1,offset:this.read_uint32(n)})},t.exports.ExifParser=n,t.exports.get_orientation=function(t){var e=0;try{return new n(t,0,t.length).each((function(t){if(0===t.ifd&&274===t.tag&&Array.isArray(t.value))return e=t.value[0],!1})),e}catch(t){return-1}}},76767:function(t,e,r){"use strict";var n=r(14847).n8,i=r(14847).Ag;function a(t,e){if(t.length<4+e)return null;var r=i(t,e);return t.length>4&15,i=15&t[4],a=t[5]>>4&15,o=n(t,6),l=8,u=0;ue.width||t.width===e.width&&t.height>e.height?t:e})),i=r.reduce((function(t,e){return t.height>e.height||t.height===e.height&&t.width>e.width?t:e})),n.width>i.height||n.width===i.height&&n.height>i.width?n:i),s=1;e.transforms.forEach((function(t){var e={1:6,2:5,3:8,4:7,5:4,6:3,7:2,8:1},r={1:4,2:3,3:2,4:1,5:6,6:5,7:8,8:7};if("imir"===t.type&&(s=0===t.value?r[s]:e[s=e[s=r[s]]]),"irot"===t.type)for(var n=0;n1&&(h.variants=f.variants),f.orientation&&(h.orientation=f.orientation),f.exif_location&&f.exif_location.offset+f.exif_location.length<=t.length){var p=a(t,f.exif_location.offset),d=t.slice(f.exif_location.offset+p+4,f.exif_location.offset+f.exif_location.length),v=s.get_orientation(d);v>0&&(h.orientation=v)}return h}}}}}}},2504:function(t,e,r){"use strict";var n=r(14847).eG,i=r(14847).OF,a=r(14847).mP,o=n("BM");t.exports=function(t){if(!(t.length<26)&&i(t,0,o))return{width:a(t,18),height:a(t,22),type:"bmp",mime:"image/bmp",wUnits:"px",hUnits:"px"}}},47342:function(t,e,r){"use strict";var n=r(14847).eG,i=r(14847).OF,a=r(14847).mP,o=n("GIF87a"),s=n("GIF89a");t.exports=function(t){if(!(t.length<10)&&(i(t,0,o)||i(t,0,s)))return{width:a(t,6),height:a(t,8),type:"gif",mime:"image/gif",wUnits:"px",hUnits:"px"}}},31355:function(t,e,r){"use strict";var n=r(14847).mP;t.exports=function(t){var e=n(t,0),r=n(t,2),i=n(t,4);if(0===e&&1===r&&i){for(var a=[],o={width:0,height:0},s=0;so.width||u>o.height)&&(o=c)}return{width:o.width,height:o.height,variants:a,type:"ico",mime:"image/x-icon",wUnits:"px",hUnits:"px"}}}},54261:function(t,e,r){"use strict";var n=r(14847).n8,i=r(14847).eG,a=r(14847).OF,o=r(71371),s=i("Exif\0\0");t.exports=function(t){if(!(t.length<2)&&255===t[0]&&216===t[1]&&255===t[2])for(var e=2;;){for(;;){if(t.length-e<2)return;if(255===t[e++])break}for(var r,i,l=t[e++];255===l;)l=t[e++];if(208<=l&&l<=217||1===l)r=0;else{if(!(192<=l&&l<=254))return;if(t.length-e<2)return;r=n(t,e)-2,e+=2}if(217===l||218===l)return;if(225===l&&r>=10&&a(t,e,s)&&(i=o.get_orientation(t.slice(e+6,e+r))),r>=5&&192<=l&&l<=207&&196!==l&&200!==l&&204!==l){if(t.length-e0&&(u.orientation=i),u}e+=r}}},6303:function(t,e,r){"use strict";var n=r(14847).eG,i=r(14847).OF,a=r(14847).Ag,o=n("‰PNG\r\n\n"),s=n("IHDR");t.exports=function(t){if(!(t.length<24)&&i(t,0,o)&&i(t,12,s))return{width:a(t,16),height:a(t,20),type:"png",mime:"image/png",wUnits:"px",hUnits:"px"}}},38689:function(t,e,r){"use strict";var n=r(14847).eG,i=r(14847).OF,a=r(14847).Ag,o=n("8BPS\0");t.exports=function(t){if(!(t.length<22)&&i(t,0,o))return{width:a(t,18),height:a(t,14),type:"psd",mime:"image/vnd.adobe.photoshop",wUnits:"px",hUnits:"px"}}},6881:function(t){"use strict";function e(t){return"number"==typeof t&&isFinite(t)&&t>0}var r=/<[-_.:a-zA-Z0-9][^>]*>/,n=/^<([-_.:a-zA-Z0-9]+:)?svg\s/,i=/[^-]\bwidth="([^%]+?)"|[^-]\bwidth='([^%]+?)'/,a=/\bheight="([^%]+?)"|\bheight='([^%]+?)'/,o=/\bview[bB]ox="(.+?)"|\bview[bB]ox='(.+?)'/,s=/in$|mm$|cm$|pt$|pc$|px$|em$|ex$/;function l(t){return s.test(t)?t.match(s)[0]:"px"}t.exports=function(t){if(function(t){var e,r=0,n=t.length;for(239===t[0]&&187===t[1]&&191===t[2]&&(r=3);r>14&16383),type:"webp",mime:"image/webp",wUnits:"px",hUnits:"px"}}}function h(t,e){return{width:1+(t[e+6]<<16|t[e+5]<<8|t[e+4]),height:1+(t[e+9]<t.length)){for(;e+8=10?r=r||c(t,e+8):"VP8L"===p&&d>=9?r=r||f(t,e+8):"VP8X"===p&&d>=10?r=r||h(t,e+8):"EXIF"===p&&(n=s.get_orientation(t.slice(e+8,e+8+d)),e=1/0),e+=8+d}else e++;if(r)return n>0&&(r.orientation=n),r}}}},91497:function(t,e,r){"use strict";t.exports={avif:r(24461),bmp:r(2504),gif:r(47342),ico:r(31355),jpeg:r(54261),png:r(6303),psd:r(38689),svg:r(6881),tiff:r(66278),webp:r(90784)}},33575:function(t,e,r){"use strict";var n=r(91497);t.exports=function(t){return function(t){for(var e=Object.keys(n),r=0;r1)for(var r=1;r1&&(t.scaleRatio=[t.scale[0]*t.viewport.width,t.scale[1]*t.viewport.height],r(t),t.after&&t.after(t))}function T(t){if(t){null!=t.length?"number"==typeof t[0]&&(t=[{positions:t}]):Array.isArray(t)||(t=[t]);var e=0,r=0;if(b.groups=x=t.map((function(t,u){var c=x[u];return t?("function"==typeof t?t={after:t}:"number"==typeof t[0]&&(t={positions:t}),t=o(t,{color:"color colors fill",capSize:"capSize cap capsize cap-size",lineWidth:"lineWidth line-width width line thickness",opacity:"opacity alpha",range:"range dataBox",viewport:"viewport viewBox",errors:"errors error",positions:"positions position data points"}),c||(x[u]=c={id:u,scale:null,translate:null,scaleFract:null,translateFract:null,draw:!0},t=s({},m,t)),a(c,t,[{lineWidth:function(t){return.5*+t},capSize:function(t){return.5*+t},opacity:parseFloat,errors:function(t){return t=l(t),r+=t.length,t},positions:function(t,r){return t=l(t,"float64"),r.count=Math.floor(t.length/2),r.bounds=n(t,2),r.offset=e,e+=r.count,t}},{color:function(t,e){var r=e.count;if(t||(t="transparent"),!Array.isArray(t)||"number"==typeof t[0]){var n=t;t=Array(r);for(var a=0;a 0. && baClipping < length(normalWidth * endBotJoin)) {\n\t\t//handle miter clipping\n\t\tbTopCoord -= normalWidth * endTopJoin;\n\t\tbTopCoord += normalize(endTopJoin * normalWidth) * baClipping;\n\t}\n\n\tif (nextReverse) {\n\t\t//make join rectangular\n\t\tvec2 miterShift = normalWidth * endJoinDirection * miterLimit * .5;\n\t\tfloat normalAdjust = 1. - min(miterLimit / endMiterRatio, 1.);\n\t\tbBotCoord = bCoord + miterShift - normalAdjust * normalWidth * currNormal * .5;\n\t\tbTopCoord = bCoord + miterShift + normalAdjust * normalWidth * currNormal * .5;\n\t}\n\telse if (!prevReverse && abClipping > 0. && abClipping < length(normalWidth * startBotJoin)) {\n\t\t//handle miter clipping\n\t\taBotCoord -= normalWidth * startBotJoin;\n\t\taBotCoord += normalize(startBotJoin * normalWidth) * abClipping;\n\t}\n\n\tvec2 aTopPosition = (aTopCoord) * adjustedScale + translate;\n\tvec2 aBotPosition = (aBotCoord) * adjustedScale + translate;\n\n\tvec2 bTopPosition = (bTopCoord) * adjustedScale + translate;\n\tvec2 bBotPosition = (bBotCoord) * adjustedScale + translate;\n\n\t//position is normalized 0..1 coord on the screen\n\tvec2 position = (aTopPosition * lineTop + aBotPosition * lineBot) * lineStart + (bTopPosition * lineTop + bBotPosition * lineBot) * lineEnd;\n\n\tstartCoord = aCoord * scaleRatio + translate * viewport.zw + viewport.xy;\n\tendCoord = bCoord * scaleRatio + translate * viewport.zw + viewport.xy;\n\n\tgl_Position = vec4(position * 2.0 - 1.0, depth, 1);\n\n\tenableStartMiter = step(dot(currTangent, prevTangent), .5);\n\tenableEndMiter = step(dot(currTangent, nextTangent), .5);\n\n\t//bevel miter cutoffs\n\tif (miterMode == 1.) {\n\t\tif (enableStartMiter == 1.) {\n\t\t\tvec2 startMiterWidth = vec2(startJoinDirection) * thickness * miterLimit * .5;\n\t\t\tstartCutoff = vec4(aCoord, aCoord);\n\t\t\tstartCutoff.zw += vec2(-startJoinDirection.y, startJoinDirection.x) / scaleRatio;\n\t\t\tstartCutoff = startCutoff * scaleRatio.xyxy + translate.xyxy * viewport.zwzw;\n\t\t\tstartCutoff += viewport.xyxy;\n\t\t\tstartCutoff += startMiterWidth.xyxy;\n\t\t}\n\n\t\tif (enableEndMiter == 1.) {\n\t\t\tvec2 endMiterWidth = vec2(endJoinDirection) * thickness * miterLimit * .5;\n\t\t\tendCutoff = vec4(bCoord, bCoord);\n\t\t\tendCutoff.zw += vec2(-endJoinDirection.y, endJoinDirection.x) / scaleRatio;\n\t\t\tendCutoff = endCutoff * scaleRatio.xyxy + translate.xyxy * viewport.zwzw;\n\t\t\tendCutoff += viewport.xyxy;\n\t\t\tendCutoff += endMiterWidth.xyxy;\n\t\t}\n\t}\n\n\t//round miter cutoffs\n\telse if (miterMode == 2.) {\n\t\tif (enableStartMiter == 1.) {\n\t\t\tvec2 startMiterWidth = vec2(startJoinDirection) * thickness * abs(dot(startJoinDirection, currNormal)) * .5;\n\t\t\tstartCutoff = vec4(aCoord, aCoord);\n\t\t\tstartCutoff.zw += vec2(-startJoinDirection.y, startJoinDirection.x) / scaleRatio;\n\t\t\tstartCutoff = startCutoff * scaleRatio.xyxy + translate.xyxy * viewport.zwzw;\n\t\t\tstartCutoff += viewport.xyxy;\n\t\t\tstartCutoff += startMiterWidth.xyxy;\n\t\t}\n\n\t\tif (enableEndMiter == 1.) {\n\t\t\tvec2 endMiterWidth = vec2(endJoinDirection) * thickness * abs(dot(endJoinDirection, currNormal)) * .5;\n\t\t\tendCutoff = vec4(bCoord, bCoord);\n\t\t\tendCutoff.zw += vec2(-endJoinDirection.y, endJoinDirection.x) / scaleRatio;\n\t\t\tendCutoff = endCutoff * scaleRatio.xyxy + translate.xyxy * viewport.zwzw;\n\t\t\tendCutoff += viewport.xyxy;\n\t\t\tendCutoff += endMiterWidth.xyxy;\n\t\t}\n\t}\n}\n"]),frag:o(["precision highp float;\n#define GLSLIFY 1\n\nuniform float dashLength, pixelRatio, thickness, opacity, id, miterMode;\nuniform sampler2D dashTexture;\n\nvarying vec4 fragColor;\nvarying vec2 tangent;\nvarying vec4 startCutoff, endCutoff;\nvarying vec2 startCoord, endCoord;\nvarying float enableStartMiter, enableEndMiter;\n\nfloat distToLine(vec2 p, vec2 a, vec2 b) {\n\tvec2 diff = b - a;\n\tvec2 perp = normalize(vec2(-diff.y, diff.x));\n\treturn dot(p - a, perp);\n}\n\nvoid main() {\n\tfloat alpha = 1., distToStart, distToEnd;\n\tfloat cutoff = thickness * .5;\n\n\t//bevel miter\n\tif (miterMode == 1.) {\n\t\tif (enableStartMiter == 1.) {\n\t\t\tdistToStart = distToLine(gl_FragCoord.xy, startCutoff.xy, startCutoff.zw);\n\t\t\tif (distToStart < -1.) {\n\t\t\t\tdiscard;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\talpha *= min(max(distToStart + 1., 0.), 1.);\n\t\t}\n\n\t\tif (enableEndMiter == 1.) {\n\t\t\tdistToEnd = distToLine(gl_FragCoord.xy, endCutoff.xy, endCutoff.zw);\n\t\t\tif (distToEnd < -1.) {\n\t\t\t\tdiscard;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\talpha *= min(max(distToEnd + 1., 0.), 1.);\n\t\t}\n\t}\n\n\t// round miter\n\telse if (miterMode == 2.) {\n\t\tif (enableStartMiter == 1.) {\n\t\t\tdistToStart = distToLine(gl_FragCoord.xy, startCutoff.xy, startCutoff.zw);\n\t\t\tif (distToStart < 0.) {\n\t\t\t\tfloat radius = length(gl_FragCoord.xy - startCoord);\n\n\t\t\t\tif(radius > cutoff + .5) {\n\t\t\t\t\tdiscard;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\talpha -= smoothstep(cutoff - .5, cutoff + .5, radius);\n\t\t\t}\n\t\t}\n\n\t\tif (enableEndMiter == 1.) {\n\t\t\tdistToEnd = distToLine(gl_FragCoord.xy, endCutoff.xy, endCutoff.zw);\n\t\t\tif (distToEnd < 0.) {\n\t\t\t\tfloat radius = length(gl_FragCoord.xy - endCoord);\n\n\t\t\t\tif(radius > cutoff + .5) {\n\t\t\t\t\tdiscard;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\talpha -= smoothstep(cutoff - .5, cutoff + .5, radius);\n\t\t\t}\n\t\t}\n\t}\n\n\tfloat t = fract(dot(tangent, gl_FragCoord.xy) / dashLength) * .5 + .25;\n\tfloat dash = texture2D(dashTexture, vec2(t, .5)).r;\n\n\tgl_FragColor = fragColor;\n\tgl_FragColor.a *= alpha * opacity * dash;\n}\n"]),attributes:{lineEnd:{buffer:r,divisor:0,stride:8,offset:0},lineTop:{buffer:r,divisor:0,stride:8,offset:4},aColor:{buffer:t.prop("colorBuffer"),stride:4,offset:0,divisor:1},bColor:{buffer:t.prop("colorBuffer"),stride:4,offset:4,divisor:1},prevCoord:{buffer:t.prop("positionBuffer"),stride:8,offset:0,divisor:1},aCoord:{buffer:t.prop("positionBuffer"),stride:8,offset:8,divisor:1},bCoord:{buffer:t.prop("positionBuffer"),stride:8,offset:16,divisor:1},nextCoord:{buffer:t.prop("positionBuffer"),stride:8,offset:24,divisor:1}}},n))}catch(t){e=i}return{fill:t({primitive:"triangle",elements:function(t,e){return e.triangles},offset:0,vert:o(["precision highp float;\n#define GLSLIFY 1\n\nattribute vec2 position, positionFract;\n\nuniform vec4 color;\nuniform vec2 scale, scaleFract, translate, translateFract;\nuniform float pixelRatio, id;\nuniform vec4 viewport;\nuniform float opacity;\n\nvarying vec4 fragColor;\n\nconst float MAX_LINES = 256.;\n\nvoid main() {\n\tfloat depth = (MAX_LINES - 4. - id) / (MAX_LINES);\n\n\tvec2 position = position * scale + translate\n + positionFract * scale + translateFract\n + position * scaleFract\n + positionFract * scaleFract;\n\n\tgl_Position = vec4(position * 2.0 - 1.0, depth, 1);\n\n\tfragColor = color / 255.;\n\tfragColor.a *= opacity;\n}\n"]),frag:o(["precision highp float;\n#define GLSLIFY 1\n\nvarying vec4 fragColor;\n\nvoid main() {\n\tgl_FragColor = fragColor;\n}\n"]),uniforms:{scale:t.prop("scale"),color:t.prop("fill"),scaleFract:t.prop("scaleFract"),translateFract:t.prop("translateFract"),translate:t.prop("translate"),opacity:t.prop("opacity"),pixelRatio:t.context("pixelRatio"),id:t.prop("id"),viewport:function(t,e){return[e.viewport.x,e.viewport.y,t.viewportWidth,t.viewportHeight]}},attributes:{position:{buffer:t.prop("positionBuffer"),stride:8,offset:8},positionFract:{buffer:t.prop("positionFractBuffer"),stride:8,offset:8}},blend:n.blend,depth:{enable:!1},scissor:n.scissor,stencil:n.stencil,viewport:n.viewport}),rect:i,miter:e}},y.defaults={dashes:null,join:"miter",miterLimit:1,thickness:10,cap:"square",color:"black",opacity:1,overlay:!1,viewport:null,range:null,close:!1,fill:null},y.prototype.render=function(){for(var t,e=[],r=arguments.length;r--;)e[r]=arguments[r];e.length&&(t=this).update.apply(t,e),this.draw()},y.prototype.draw=function(){for(var t=this,e=[],r=arguments.length;r--;)e[r]=arguments[r];return(e.length?e:this.passes).forEach((function(e,r){var n;if(e&&Array.isArray(e))return(n=t).draw.apply(n,e);"number"==typeof e&&(e=t.passes[e]),e&&e.count>1&&e.opacity&&(t.regl._refresh(),e.fill&&e.triangles&&e.triangles.length>2&&t.shaders.fill(e),e.thickness&&(e.scale[0]*e.viewport.width>y.precisionThreshold||e.scale[1]*e.viewport.height>y.precisionThreshold||"rect"===e.join||!e.join&&(e.thickness<=2||e.count>=y.maxPoints)?t.shaders.rect(e):t.shaders.miter(e)))})),this},y.prototype.update=function(t){var e=this;if(t){null!=t.length?"number"==typeof t[0]&&(t=[{positions:t}]):Array.isArray(t)||(t=[t]);var r=this.regl,o=this.gl;if(t.forEach((function(t,f){var d=e.passes[f];if(void 0!==t)if(null!==t){if("number"==typeof t[0]&&(t={positions:t}),t=s(t,{positions:"positions points data coords",thickness:"thickness lineWidth lineWidths line-width linewidth width stroke-width strokewidth strokeWidth",join:"lineJoin linejoin join type mode",miterLimit:"miterlimit miterLimit",dashes:"dash dashes dasharray dash-array dashArray",color:"color colour stroke colors colours stroke-color strokeColor",fill:"fill fill-color fillColor",opacity:"alpha opacity",overlay:"overlay crease overlap intersect",close:"closed close closed-path closePath",range:"range dataBox",viewport:"viewport viewBox",hole:"holes hole hollow",splitNull:"splitNull"}),d||(e.passes[f]=d={id:f,scale:null,scaleFract:null,translate:null,translateFract:null,count:0,hole:[],depth:0,dashLength:1,dashTexture:r.texture({channels:1,data:new Uint8Array([255]),width:1,height:1,mag:"linear",min:"linear"}),colorBuffer:r.buffer({usage:"dynamic",type:"uint8",data:new Uint8Array}),positionBuffer:r.buffer({usage:"dynamic",type:"float",data:new Uint8Array}),positionFractBuffer:r.buffer({usage:"dynamic",type:"float",data:new Uint8Array})},t=a({},y.defaults,t)),null!=t.thickness&&(d.thickness=parseFloat(t.thickness)),null!=t.opacity&&(d.opacity=parseFloat(t.opacity)),null!=t.miterLimit&&(d.miterLimit=parseFloat(t.miterLimit)),null!=t.overlay&&(d.overlay=!!t.overlay,f=z}));(O=O.slice(0,R)).push(z)}for(var F=function(t){var e=k.slice(2*D,2*O[t]).concat(z?k.slice(2*z):[]),r=(d.hole||[]).map((function(e){return e-z+(O[t]-D)})),n=u(e,r);n=n.map((function(e){return e+D+(e+Dt.length)&&(e=t.length);for(var r=0,n=new Array(e);r 1.0 + delta) {\n\t\tdiscard;\n\t}\n\n\talpha -= smoothstep(1.0 - delta, 1.0 + delta, radius);\n\n\tfloat borderRadius = fragBorderRadius;\n\tfloat ratio = smoothstep(borderRadius - delta, borderRadius + delta, radius);\n\tvec4 color = mix(fragColor, fragBorderColor, ratio);\n\tcolor.a *= alpha * opacity;\n\tgl_FragColor = color;\n}\n"]),l.vert=f(["precision highp float;\n#define GLSLIFY 1\n\nattribute float x, y, xFract, yFract;\nattribute float size, borderSize;\nattribute vec4 colorId, borderColorId;\nattribute float isActive;\n\nuniform bool constPointSize;\nuniform float pixelRatio;\nuniform vec2 paletteSize, scale, scaleFract, translate, translateFract;\nuniform sampler2D paletteTexture;\n\nconst float maxSize = 100.;\n\nvarying vec4 fragColor, fragBorderColor;\nvarying float fragBorderRadius, fragWidth;\n\nfloat pointSizeScale = (constPointSize) ? 2. : pixelRatio;\n\nbool isDirect = (paletteSize.x < 1.);\n\nvec4 getColor(vec4 id) {\n return isDirect ? id / 255. : texture2D(paletteTexture,\n vec2(\n (id.x + .5) / paletteSize.x,\n (id.y + .5) / paletteSize.y\n )\n );\n}\n\nvoid main() {\n // ignore inactive points\n if (isActive == 0.) return;\n\n vec2 position = vec2(x, y);\n vec2 positionFract = vec2(xFract, yFract);\n\n vec4 color = getColor(colorId);\n vec4 borderColor = getColor(borderColorId);\n\n float size = size * maxSize / 255.;\n float borderSize = borderSize * maxSize / 255.;\n\n gl_PointSize = (size + borderSize) * pointSizeScale;\n\n vec2 pos = (position + translate) * scale\n + (positionFract + translateFract) * scale\n + (position + translate) * scaleFract\n + (positionFract + translateFract) * scaleFract;\n\n gl_Position = vec4(pos * 2. - 1., 0., 1.);\n\n fragBorderRadius = 1. - 2. * borderSize / (size + borderSize);\n fragColor = color;\n fragBorderColor = borderColor.a == 0. || borderSize == 0. ? vec4(color.rgb, 0.) : borderColor;\n fragWidth = 1. / gl_PointSize;\n}\n"]),v&&(l.frag=l.frag.replace("smoothstep","smoothStep"),s.frag=s.frag.replace("smoothstep","smoothStep")),this.drawCircle=t(l)}x.defaults={color:"black",borderColor:"transparent",borderSize:0,size:12,opacity:1,marker:void 0,viewport:null,range:null,pixelSize:null,count:0,offset:0,bounds:null,positions:[],snap:1e4},x.prototype.render=function(){return arguments.length&&this.update.apply(this,arguments),this.draw(),this},x.prototype.draw=function(){for(var t=this,e=arguments.length,r=new Array(e),n=0;nn)?e.tree=u(t,{bounds:f}):n&&n.length&&(e.tree=n),e.tree){var h={primitive:"points",usage:"static",data:e.tree,type:"uint32"};e.elements?e.elements(h):e.elements=o.elements(h)}var p=g.float32(t);return i({data:p,usage:"dynamic"}),a({data:g.fract32(t,p),usage:"dynamic"}),l({data:new Uint8Array(c),type:"uint8",usage:"stream"}),t}},{marker:function(e,r,n){var i=r.activation;if(i.forEach((function(t){return t&&t.destroy&&t.destroy()})),i.length=0,e&&"number"!=typeof e[0]){for(var a=[],s=0,l=Math.min(e.length,r.count);s=0)return a;if(t instanceof Uint8Array||t instanceof Uint8ClampedArray)e=t;else{e=new Uint8Array(t.length);for(var o=0,s=t.length;o4*n&&(this.tooManyColors=!0),this.updatePalette(r),1===i.length?i[0]:i},x.prototype.updatePalette=function(t){if(!this.tooManyColors){var e=this.maxColors,r=this.paletteTexture,n=Math.ceil(.25*t.length/e);if(n>1)for(var i=.25*(t=t.slice()).length%e;i2?(s[0],s[2],n=s[1],i=s[3]):s.length?(n=s[0],i=s[1]):(s.x,n=s.y,s.x,s.width,i=s.y+s.height),l.length>2?(a=l[0],o=l[2],l[1],l[3]):l.length?(a=l[0],o=l[1]):(a=l.x,l.y,o=l.x+l.width,l.y,l.height),[a,n,o,i]}function p(t){if("number"==typeof t)return[t,t,t,t];if(2===t.length)return[t[0],t[1],t[0],t[1]];var e=l(t);return[e.x,e.y,e.x+e.width,e.y+e.height]}t.exports=c,c.prototype.render=function(){for(var t,e=this,r=[],n=arguments.length;n--;)r[n]=arguments[n];return r.length&&(t=this).update.apply(t,r),this.regl.attributes.preserveDrawingBuffer?this.draw():(this.dirty?null==this.planned&&(this.planned=o((function(){e.draw(),e.dirty=!0,e.planned=null}))):(this.draw(),this.dirty=!0,o((function(){e.dirty=!1}))),this)},c.prototype.update=function(){for(var t,e=[],r=arguments.length;r--;)e[r]=arguments[r];if(e.length){for(var n=0;nk))&&(s.lower||!(T>>=e))<<3,(e|=r=(15<(t>>>=r))<<2)|(r=(3<(t>>>=r))<<1)|t>>>r>>1}function l(){function t(t){t:{for(var e=16;268435456>=e;e*=16)if(t<=e){t=e;break t}t=0}return 0<(e=r[s(t)>>2]).length?e.pop():new ArrayBuffer(t)}function e(t){r[s(t.byteLength)>>2].push(t)}var r=o(8,(function(){return[]}));return{alloc:t,free:e,allocType:function(e,r){var n=null;switch(e){case 5120:n=new Int8Array(t(r),0,r);break;case 5121:n=new Uint8Array(t(r),0,r);break;case 5122:n=new Int16Array(t(2*r),0,r);break;case 5123:n=new Uint16Array(t(2*r),0,r);break;case 5124:n=new Int32Array(t(4*r),0,r);break;case 5125:n=new Uint32Array(t(4*r),0,r);break;case 5126:n=new Float32Array(t(4*r),0,r);break;default:return null}return n.length!==r?n.subarray(0,r):n},freeType:function(t){e(t.buffer)}}}function u(t){return!!t&&"object"==typeof t&&Array.isArray(t.shape)&&Array.isArray(t.stride)&&"number"==typeof t.offset&&t.shape.length===t.stride.length&&(Array.isArray(t.data)||$(t.data))}function c(t,e,r,n,i,a){for(var o=0;o(i=s)&&(i=n.buffer.byteLength,5123===f?i>>=1:5125===f&&(i>>=2)),n.vertCount=i,i=o,0>o&&(i=4,1===(o=n.buffer.dimension)&&(i=0),2===o&&(i=1),3===o&&(i=4)),n.primType=i}function o(t){n.elementsCount--,delete s[t.id],t.buffer.destroy(),t.buffer=null}var s={},l=0,c={uint8:5121,uint16:5123};e.oes_element_index_uint&&(c.uint32=5125),i.prototype.bind=function(){this.buffer.bind()};var f=[];return{create:function(t,e){function s(t){if(t)if("number"==typeof t)l(t),f.primType=4,f.vertCount=0|t,f.type=5121;else{var e=null,r=35044,n=-1,i=-1,o=0,h=0;Array.isArray(t)||$(t)||u(t)?e=t:("data"in t&&(e=t.data),"usage"in t&&(r=nt[t.usage]),"primitive"in t&&(n=st[t.primitive]),"count"in t&&(i=0|t.count),"type"in t&&(h=c[t.type]),"length"in t?o=0|t.length:(o=i,5123===h||5122===h?o*=2:5125!==h&&5124!==h||(o*=4))),a(f,e,r,n,i,o,h)}else l(),f.primType=4,f.vertCount=0,f.type=5121;return s}var l=r.create(null,34963,!0),f=new i(l._buffer);return n.elementsCount++,s(t),s._reglType="elements",s._elements=f,s.subdata=function(t,e){return l.subdata(t,e),s},s.destroy=function(){o(f)},s},createStream:function(t){var e=f.pop();return e||(e=new i(r.create(null,34963,!0,!1)._buffer)),a(e,t,35040,-1,-1,0,0),e},destroyStream:function(t){f.push(t)},getElements:function(t){return"function"==typeof t&&t._elements instanceof i?t._elements:null},clear:function(){Q(s).forEach(o)}}}function y(t){for(var e=J.allocType(5123,t.length),r=0;r>>31<<15,i=(a<<1>>>24)-127,a=a>>13&1023;e[r]=-24>i?n:-14>i?n+(a+1024>>-14-i):15>=i,r.height>>=i,p(r,n[i]),t.mipmask|=1<e;++e)t.images[e]=null;return t}function C(t){for(var e=t.images,r=0;re){for(var r=0;r=--this.refCount&&F(this)}}),o.profile&&(a.getTotalTextureSize=function(){var t=0;return Object.keys(ut).forEach((function(e){t+=ut[e].stats.size})),t}),{create2D:function(e,r){function n(t,e){var r=i.texInfo;P.call(r);var a=L();return"number"==typeof t?M(a,0|t,"number"==typeof e?0|e:0|t):t?(O(r,t),S(a,t)):M(a,1,1),r.genMipmaps&&(a.mipmask=(a.width<<1)-1),i.mipmask=a.mipmask,l(i,a),i.internalformat=a.internalformat,n.width=a.width,n.height=a.height,z(i),E(a,3553),I(r,3553),R(),C(a),o.profile&&(i.stats.size=A(i.internalformat,i.type,a.width,a.height,r.genMipmaps,!1)),n.format=X[i.internalformat],n.type=K[i.type],n.mag=rt[r.magFilter],n.min=nt[r.minFilter],n.wrapS=it[r.wrapS],n.wrapT=it[r.wrapT],n}var i=new D(3553);return ut[i.id]=i,a.textureCount++,n(e,r),n.subimage=function(t,e,r,a){e|=0,r|=0,a|=0;var o=v();return l(o,i),o.width=0,o.height=0,p(o,t),o.width=o.width||(i.width>>a)-e,o.height=o.height||(i.height>>a)-r,z(i),d(o,3553,e,r,a),R(),g(o),n},n.resize=function(e,r){var a=0|e,s=0|r||a;if(a===i.width&&s===i.height)return n;n.width=i.width=a,n.height=i.height=s,z(i);for(var l=0;i.mipmask>>l;++l){var u=a>>l,c=s>>l;if(!u||!c)break;t.texImage2D(3553,l,i.format,u,c,0,i.format,i.type,null)}return R(),o.profile&&(i.stats.size=A(i.internalformat,i.type,a,s,!1,!1)),n},n._reglType="texture2d",n._texture=i,o.profile&&(n.stats=i.stats),n.destroy=function(){i.decRef()},n},createCube:function(e,r,n,i,s,u){function f(t,e,r,n,i,a){var s,u=h.texInfo;for(P.call(u),s=0;6>s;++s)y[s]=L();if("number"!=typeof t&&t){if("object"==typeof t)if(e)S(y[0],t),S(y[1],e),S(y[2],r),S(y[3],n),S(y[4],i),S(y[5],a);else if(O(u,t),c(h,t),"faces"in t)for(t=t.faces,s=0;6>s;++s)l(y[s],h),S(y[s],t[s]);else for(s=0;6>s;++s)S(y[s],t)}else for(t=0|t||1,s=0;6>s;++s)M(y[s],t,t);for(l(h,y[0]),h.mipmask=u.genMipmaps?(y[0].width<<1)-1:y[0].mipmask,h.internalformat=y[0].internalformat,f.width=y[0].width,f.height=y[0].height,z(h),s=0;6>s;++s)E(y[s],34069+s);for(I(u,34067),R(),o.profile&&(h.stats.size=A(h.internalformat,h.type,f.width,f.height,u.genMipmaps,!0)),f.format=X[h.internalformat],f.type=K[h.type],f.mag=rt[u.magFilter],f.min=nt[u.minFilter],f.wrapS=it[u.wrapS],f.wrapT=it[u.wrapT],s=0;6>s;++s)C(y[s]);return f}var h=new D(34067);ut[h.id]=h,a.cubeCount++;var y=Array(6);return f(e,r,n,i,s,u),f.subimage=function(t,e,r,n,i){r|=0,n|=0,i|=0;var a=v();return l(a,h),a.width=0,a.height=0,p(a,e),a.width=a.width||(h.width>>i)-r,a.height=a.height||(h.height>>i)-n,z(h),d(a,34069+t,r,n,i),R(),g(a),f},f.resize=function(e){if((e|=0)!==h.width){f.width=h.width=e,f.height=h.height=e,z(h);for(var r=0;6>r;++r)for(var n=0;h.mipmask>>n;++n)t.texImage2D(34069+r,n,h.format,e>>n,e>>n,0,h.format,h.type,null);return R(),o.profile&&(h.stats.size=A(h.internalformat,h.type,f.width,f.height,!1,!0)),f}},f._reglType="textureCube",f._texture=h,o.profile&&(f.stats=h.stats),f.destroy=function(){h.decRef()},f},clear:function(){for(var e=0;er;++r)if(0!=(e.mipmask&1<>r,e.height>>r,0,e.internalformat,e.type,null);else for(var n=0;6>n;++n)t.texImage2D(34069+n,r,e.internalformat,e.width>>r,e.height>>r,0,e.internalformat,e.type,null);I(e.texInfo,e.target)}))},refresh:function(){for(var e=0;ei;++i){for(u=0;ut;++t)r[t].resize(n);return e.width=e.height=n,e},_reglType:"framebufferCube",destroy:function(){r.forEach((function(t){t.destroy()}))}})},clear:function(){Q(k).forEach(g)},restore:function(){x.cur=null,x.next=null,x.dirty=!0,Q(k).forEach((function(e){e.framebuffer=t.createFramebuffer(),y(e)}))}})}function E(){this.w=this.z=this.y=this.x=this.state=0,this.buffer=null,this.size=0,this.normalized=!1,this.type=5126,this.divisor=this.stride=this.offset=0}function L(t,e,r,n,i,a,o){function s(){this.id=++f,this.attributes=[],this.elements=null,this.ownsElements=!1,this.offset=this.count=0,this.instances=-1,this.primitive=4;var t=e.oes_vertex_array_object;this.vao=t?t.createVertexArrayOES():null,h[this.id]=this,this.buffers=[]}var l=r.maxAttributes,c=Array(l);for(r=0;r=h.byteLength?l.subdata(h):(l.destroy(),r.buffers[s]=null)),r.buffers[s]||(l=r.buffers[s]=i.create(c,34962,!1,!0)),f.buffer=i.getBuffer(l),f.size=0|f.buffer.dimension,f.normalized=!1,f.type=f.buffer.dtype,f.offset=0,f.stride=0,f.divisor=0,f.state=1,t[s]=1):i.getBuffer(c)?(f.buffer=i.getBuffer(c),f.size=0|f.buffer.dimension,f.normalized=!1,f.type=f.buffer.dtype,f.offset=0,f.stride=0,f.divisor=0,f.state=1):i.getBuffer(c.buffer)?(f.buffer=i.getBuffer(c.buffer),f.size=0|(+c.size||f.buffer.dimension),f.normalized=!!c.normalized||!1,f.type="type"in c?rt[c.type]:f.buffer.dtype,f.offset=0|(c.offset||0),f.stride=0|(c.stride||0),f.divisor=0|(c.divisor||0),f.state=1):"x"in c&&(f.x=+c.x||0,f.y=+c.y||0,f.z=+c.z||0,f.w=+c.w||0,f.state=2)}for(l=0;lt&&(t=e.stats.uniformsCount)})),t},r.getMaxAttributesCount=function(){var t=0;return h.forEach((function(e){e.stats.attributesCount>t&&(t=e.stats.attributesCount)})),t}),{clear:function(){var e=t.deleteShader.bind(t);Q(u).forEach(e),u={},Q(c).forEach(e),c={},h.forEach((function(e){t.deleteProgram(e.program)})),h.length=0,f={},r.shaderCount=0},program:function(e,n,i,a){var o=f[n];o||(o=f[n]={});var p=o[e];if(p&&(p.refCount++,!a))return p;var d=new s(n,e);return r.shaderCount++,l(d,i,a),p||(o[e]=d),h.push(d),G(d,{destroy:function(){if(d.refCount--,0>=d.refCount){t.deleteProgram(d.program);var e=h.indexOf(d);h.splice(e,1),r.shaderCount--}0>=o[d.vertId].refCount&&(t.deleteShader(c[d.vertId]),delete c[d.vertId],delete f[d.fragId][d.vertId]),Object.keys(f[d.fragId]).length||(t.deleteShader(u[d.fragId]),delete u[d.fragId],delete f[d.fragId])}})},restore:function(){u={},c={};for(var t=0;t>>e|t<<32-e}function I(t,e){var r=(65535&t)+(65535&e);return(t>>16)+(e>>16)+(r>>16)<<16|65535&r}function D(t){return Array.prototype.slice.call(t)}function z(t){return D(t).join("")}function R(t){function e(){var t=[],e=[];return G((function(){t.push.apply(t,D(arguments))}),{def:function(){var r="v"+i++;return e.push(r),0>>4&15)+"0123456789abcdef".charAt(15&e);return r}(function(t){for(var e=Array(t.length>>2),r=0;r>5]|=(255&t.charCodeAt(r/8))<<24-r%32;var n,i,a,o,s,l,u,c,f,h,p,d=8*t.length;for(t=[1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225],r=Array(64),e[d>>5]|=128<<24-d%32,e[15+(d+64>>9<<4)]=d,c=0;cf;f++){var v;16>f?r[f]=e[f+c]:(h=f,p=I(p=O(p=r[f-2],17)^O(p,19)^p>>>10,r[f-7]),v=O(v=r[f-15],7)^O(v,18)^v>>>3,r[h]=I(I(p,v),r[f-16])),h=I(I(I(I(u,h=O(h=o,6)^O(h,11)^O(h,25)),o&s^~o&l),Mt[f]),r[f]),p=I(u=O(u=d,2)^O(u,13)^O(u,22),d&n^d&i^n&i),u=l,l=s,s=o,o=I(a,h),a=i,i=n,n=d,d=I(h,p)}t[0]=I(d,t[0]),t[1]=I(n,t[1]),t[2]=I(i,t[2]),t[3]=I(a,t[3]),t[4]=I(o,t[4]),t[5]=I(s,t[5]),t[6]=I(l,t[6]),t[7]=I(u,t[7])}for(e="",r=0;r<32*t.length;r+=8)e+=String.fromCharCode(t[r>>5]>>>24-r%32&255);return e}(function(t){for(var e,r,n="",i=-1;++i=e&&56320<=r&&57343>=r&&(e=65536+((1023&e)<<10)+(1023&r),i++),127>=e?n+=String.fromCharCode(e):2047>=e?n+=String.fromCharCode(192|e>>>6&31,128|63&e):65535>=e?n+=String.fromCharCode(224|e>>>12&15,128|e>>>6&63,128|63&e):2097151>=e&&(n+=String.fromCharCode(240|e>>>18&7,128|e>>>12&63,128|e>>>6&63,128|63&e));return n}(r))),n[e])?n[e].apply(null,o):(r=Function.apply(null,a.concat(r)),n&&(n[e]=r),r.apply(null,o))}}}function F(t){return Array.isArray(t)||$(t)||u(t)}function B(t){return t.sort((function(t,e){return"viewport"===t?-1:"viewport"===e?1:t"+e+"?"+i+".constant["+e+"]:0;"})).join(""),"}}else{","if(",s,"(",i,".buffer)){",c,"=",a,".createStream(",34962,",",i,".buffer);","}else{",c,"=",a,".getBuffer(",i,".buffer);","}",f,'="type" in ',i,"?",o.glTypes,"[",i,".type]:",c,".dtype;",l.normalized,"=!!",i,".normalized;"),n("size"),n("offset"),n("stride"),n("divisor"),r("}}"),r.exit("if(",l.isStream,"){",a,".destroyStream(",c,");","}"),l}))})),o}function M(t,e,n,i,a){function s(t){var e=u[t];e&&(h[t]=e)}var l=function(t,e){if("string"==typeof(r=t.static).frag&&"string"==typeof r.vert){if(0>1)",s],");")}function e(){r(l,".drawArraysInstancedANGLE(",[d,v,g,s],");")}p&&"null"!==p?m?t():(r("if(",p,"){"),t(),r("}else{"),e(),r("}")):e()}function o(){function t(){r(c+".drawElements("+[d,g,y,v+"<<(("+y+"-5121)>>1)"]+");")}function e(){r(c+".drawArrays("+[d,v,g]+");")}p&&"null"!==p?m?t():(r("if(",p,"){"),t(),r("}else{"),e(),r("}")):e()}var s,l,u=t.shared,c=u.gl,f=u.draw,h=n.draw,p=function(){var i=h.elements,a=e;return i?((i.contextDep&&n.contextDynamic||i.propDep)&&(a=r),i=i.append(t,a),h.elementsActive&&a("if("+i+")"+c+".bindBuffer(34963,"+i+".buffer.buffer);")):(i=a.def(),a(i,"=",f,".","elements",";","if(",i,"){",c,".bindBuffer(",34963,",",i,".buffer.buffer);}","else if(",u.vao,".currentVAO){",i,"=",t.shared.elements+".getElements("+u.vao,".currentVAO.elements);",et?"":"if("+i+")"+c+".bindBuffer(34963,"+i+".buffer.buffer);","}")),i}(),d=i("primitive"),v=i("offset"),g=function(){var i=h.count,a=e;return i?((i.contextDep&&n.contextDynamic||i.propDep)&&(a=r),i=i.append(t,a)):i=a.def(f,".","count"),i}();if("number"==typeof g){if(0===g)return}else r("if(",g,"){"),r.exit("}");Q&&(s=i("instances"),l=t.instancing);var y=p+".type",m=h.elements&&j(h.elements)&&!h.vaoActive;Q&&("number"!=typeof s||0<=s)?"string"==typeof s?(r("if(",s,">0){"),a(),r("}else if(",s,"<0){"),o(),r("}")):a():o()}function H(t,e,r,n,i){return i=(e=_()).proc("body",i),Q&&(e.instancing=i.def(e.shared.extensions,".angle_instanced_arrays")),t(e,i,r,n),e.compile().body}function q(t,e,r,n){P(t,e),r.useVAO?r.drawVAO?e(t.shared.vao,".setVAO(",r.drawVAO.append(t,e),");"):e(t.shared.vao,".setVAO(",t.shared.vao,".targetVAO);"):(e(t.shared.vao,".setVAO(null);"),I(t,e,r,n.attributes,(function(){return!0}))),D(t,e,r,n.uniforms,(function(){return!0}),!1),z(t,e,e,r)}function Z(t,e,r,n){function i(){return!0}t.batchId="a1",P(t,e),I(t,e,r,n.attributes,i),D(t,e,r,n.uniforms,i,!1),z(t,e,e,r)}function W(t,e,r,n){function i(t){return t.contextDep&&o||t.propDep}function a(t){return!i(t)}P(t,e);var o=r.contextDep,s=e.def(),l=e.def();t.shared.props=l,t.batchId=s;var u=t.scope(),c=t.scope();e(u.entry,"for(",s,"=0;",s,"<","a1",";++",s,"){",l,"=","a0","[",s,"];",c,"}",u.exit),r.needsContext&&S(t,c,r.context),r.needsFramebuffer&&E(t,c,r.framebuffer),C(t,c,r.state,i),r.profile&&i(r.profile)&&O(t,c,r,!1,!0),n?(r.useVAO?r.drawVAO?i(r.drawVAO)?c(t.shared.vao,".setVAO(",r.drawVAO.append(t,c),");"):u(t.shared.vao,".setVAO(",r.drawVAO.append(t,u),");"):u(t.shared.vao,".setVAO(",t.shared.vao,".targetVAO);"):(u(t.shared.vao,".setVAO(null);"),I(t,u,r,n.attributes,a),I(t,c,r,n.attributes,i)),D(t,u,r,n.uniforms,a,!1),D(t,c,r,n.uniforms,i,!0),z(t,u,c,r)):(e=t.global.def("{}"),n=r.shader.progVar.append(t,c),l=c.def(n,".id"),u=c.def(e,"[",l,"]"),c(t.shared.gl,".useProgram(",n,".program);","if(!",u,"){",u,"=",e,"[",l,"]=",t.link((function(e){return H(Z,t,r,e,2)})),"(",n,");}",u,".call(this,a0[",s,"],",s,");"))}function X(t,r){function n(e){var n=r.shader[e];n&&(n=n.append(t,i),isNaN(n)?i.set(a.shader,"."+e,n):i.set(a.shader,"."+e,t.link(n,{stable:!0})))}var i=t.proc("scope",3);t.batchId="a2";var a=t.shared,o=a.current;if(S(t,i,r.context),r.framebuffer&&r.framebuffer.append(t,i),B(Object.keys(r.state)).forEach((function(e){var n=r.state[e],o=n.append(t,i);m(o)?o.forEach((function(r,n){isNaN(r)?i.set(t.next[e],"["+n+"]",r):i.set(t.next[e],"["+n+"]",t.link(r,{stable:!0}))})):j(n)?i.set(a.next,"."+e,t.link(o,{stable:!0})):i.set(a.next,"."+e,o)})),O(t,i,r,!0,!0),["elements","offset","count","instances","primitive"].forEach((function(e){var n=r.draw[e];n&&(n=n.append(t,i),isNaN(n)?i.set(a.draw,"."+e,n):i.set(a.draw,"."+e,t.link(n),{stable:!0}))})),Object.keys(r.uniforms).forEach((function(n){var o=r.uniforms[n].append(t,i);Array.isArray(o)&&(o="["+o.map((function(e){return isNaN(e)?e:t.link(e,{stable:!0})}))+"]"),i.set(a.uniforms,"["+t.link(e.id(n),{stable:!0})+"]",o)})),Object.keys(r.attributes).forEach((function(e){var n=r.attributes[e].append(t,i),a=t.scopeAttrib(e);Object.keys(new K).forEach((function(t){i.set(a,"."+t,n[t])}))})),r.scopeVAO){var s=r.scopeVAO.append(t,i);isNaN(s)?i.set(a.vao,".targetVAO",s):i.set(a.vao,".targetVAO",t.link(s,{stable:!0}))}n("vert"),n("frag"),0=--this.refCount&&o(this)},i.profile&&(n.getTotalRenderbufferSize=function(){var t=0;return Object.keys(c).forEach((function(e){t+=c[e].stats.size})),t}),{create:function(e,r){function o(e,r){var n=0,a=0,c=32854;if("object"==typeof e&&e?("shape"in e?(n=0|(a=e.shape)[0],a=0|a[1]):("radius"in e&&(n=a=0|e.radius),"width"in e&&(n=0|e.width),"height"in e&&(a=0|e.height)),"format"in e&&(c=s[e.format])):"number"==typeof e?(n=0|e,a="number"==typeof r?0|r:n):e||(n=a=1),n!==u.width||a!==u.height||c!==u.format)return o.width=u.width=n,o.height=u.height=a,u.format=c,t.bindRenderbuffer(36161,u.renderbuffer),t.renderbufferStorage(36161,c,n,a),i.profile&&(u.stats.size=wt[u.format]*u.width*u.height),o.format=l[u.format],o}var u=new a(t.createRenderbuffer());return c[u.id]=u,n.renderbufferCount++,o(e,r),o.resize=function(e,r){var n=0|e,a=0|r||n;return n===u.width&&a===u.height||(o.width=u.width=n,o.height=u.height=a,t.bindRenderbuffer(36161,u.renderbuffer),t.renderbufferStorage(36161,u.format,n,a),i.profile&&(u.stats.size=wt[u.format]*u.width*u.height)),o},o._reglType="renderbuffer",o._renderbuffer=u,i.profile&&(o.stats=u.stats),o.destroy=function(){u.decRef()},o},clear:function(){Q(c).forEach(o)},restore:function(){Q(c).forEach((function(e){e.renderbuffer=t.createRenderbuffer(),t.bindRenderbuffer(36161,e.renderbuffer),t.renderbufferStorage(36161,e.format,e.width,e.height)})),t.bindRenderbuffer(36161,null)}}},kt=[];kt[6408]=4,kt[6407]=3;var At=[];At[5121]=1,At[5126]=4,At[36193]=2;var Mt=[1116352408,1899447441,-1245643825,-373957723,961987163,1508970993,-1841331548,-1424204075,-670586216,310598401,607225278,1426881987,1925078388,-2132889090,-1680079193,-1046744716,-459576895,-272742522,264347078,604807628,770255983,1249150122,1555081692,1996064986,-1740746414,-1473132947,-1341970488,-1084653625,-958395405,-710438585,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,-2117940946,-1838011259,-1564481375,-1474664885,-1035236496,-949202525,-778901479,-694614492,-200395387,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,-2067236844,-1933114872,-1866530822,-1538233109,-1090935817,-965641998],St=["x","y","z","w"],Et="blend.func blend.equation stencil.func stencil.opFront stencil.opBack sample.coverage viewport scissor.box polygonOffset.offset".split(" "),Lt={0:0,1:1,zero:0,one:1,"src color":768,"one minus src color":769,"src alpha":770,"one minus src alpha":771,"dst color":774,"one minus dst color":775,"dst alpha":772,"one minus dst alpha":773,"constant color":32769,"one minus constant color":32770,"constant alpha":32771,"one minus constant alpha":32772,"src alpha saturate":776},Ct={never:512,less:513,"<":513,equal:514,"=":514,"==":514,"===":514,lequal:515,"<=":515,greater:516,">":516,notequal:517,"!=":517,"!==":517,gequal:518,">=":518,always:519},Pt={0:0,zero:0,keep:7680,replace:7681,increment:7682,decrement:7683,"increment wrap":34055,"decrement wrap":34056,invert:5386},Ot={cw:2304,ccw:2305},It=new N(!1,!1,!1,(function(){}));return function(t){function e(){if(0===J.length)T&&T.update(),et=null;else{et=W.next(e),f();for(var t=J.length-1;0<=t;--t){var r=J[t];r&&r(O,null,0)}d.flush(),T&&T.update()}}function r(){!et&&0=J.length&&n()}}}}function c(){var t=V.viewport,e=V.scissor_box;t[0]=t[1]=e[0]=e[1]=0,O.viewportWidth=O.framebufferWidth=O.drawingBufferWidth=t[2]=e[2]=d.drawingBufferWidth,O.viewportHeight=O.framebufferHeight=O.drawingBufferHeight=t[3]=e[3]=d.drawingBufferHeight}function f(){O.tick+=1,O.time=p(),c(),U.procs.poll()}function h(){B.refresh(),c(),U.procs.refresh(),T&&T.update()}function p(){return(X()-k)/1e3}if(!(t=a(t)))return null;var d=t.gl,y=d.getContextAttributes();d.isContextLost();var m=function(t,e){function r(e){var r;e=e.toLowerCase();try{r=n[e]=t.getExtension(e)}catch(t){}return!!r}for(var n={},i=0;ie;++e)rt(G({framebuffer:t.framebuffer.faces[e]},t),l);else rt(t,l);else l(0,t)},prop:Y.define.bind(null,1),context:Y.define.bind(null,2),this:Y.define.bind(null,3),draw:s({}),buffer:function(t){return D.create(t,34962,!1,!1)},elements:function(t){return z.create(t,!1)},texture:B.create2D,cube:B.createCube,renderbuffer:N.create,framebuffer:j.create,framebufferCube:j.createCube,vao:R.createVAO,attributes:y,frame:u,on:function(t,e){var r;switch(t){case"frame":return u(e);case"lost":r=$;break;case"restore":r=Q;break;case"destroy":r=tt}return r.push(e),{cancel:function(){for(var t=0;t2?"one of ".concat(e," ").concat(t.slice(0,r-1).join(", "),", or ")+t[r-1]:2===r?"one of ".concat(e," ").concat(t[0]," or ").concat(t[1]):"of ".concat(e," ").concat(t[0])}return"of ".concat(e," ").concat(String(t))}r("ERR_INVALID_OPT_VALUE",(function(t,e){return'The value "'+e+'" is invalid for option "'+t+'"'}),TypeError),r("ERR_INVALID_ARG_TYPE",(function(t,e,r){var i,a,o,s,l;if("string"==typeof e&&(a="not ",e.substr(0,4)===a)?(i="must not be",e=e.replace(/^not /,"")):i="must be",function(t,e,r){return(void 0===r||r>t.length)&&(r=t.length),t.substring(r-9,r)===e}(t," argument"))o="The ".concat(t," ").concat(i," ").concat(n(e,"type"));else{var u=("number"!=typeof l&&(l=0),l+1>(s=t).length||-1===s.indexOf(".",l)?"argument":"property");o='The "'.concat(t,'" ').concat(u," ").concat(i," ").concat(n(e,"type"))}return o+". Received type ".concat(typeof r)}),TypeError),r("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF"),r("ERR_METHOD_NOT_IMPLEMENTED",(function(t){return"The "+t+" method is not implemented"})),r("ERR_STREAM_PREMATURE_CLOSE","Premature close"),r("ERR_STREAM_DESTROYED",(function(t){return"Cannot call "+t+" after a stream was destroyed"})),r("ERR_MULTIPLE_CALLBACK","Callback called multiple times"),r("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable"),r("ERR_STREAM_WRITE_AFTER_END","write after end"),r("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError),r("ERR_UNKNOWN_ENCODING",(function(t){return"Unknown encoding: "+t}),TypeError),r("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event"),t.exports.q=e},37865:function(t,e,r){"use strict";var n=r(90386),i=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};t.exports=c;var a=r(40410),o=r(37493);r(42018)(c,a);for(var s=i(o.prototype),l=0;l0)if("string"==typeof e||s.objectMode||Object.getPrototypeOf(e)===l.prototype||(e=function(t){return l.from(t)}(e)),n)s.endEmitted?w(t,new _):S(t,s,e,!0);else if(s.ended)w(t,new x);else{if(s.destroyed)return!1;s.reading=!1,s.decoder&&!r?(e=s.decoder.write(e),s.objectMode||0!==e.length?S(t,s,e,!1):O(t,s)):S(t,s,e,!1)}else n||(s.reading=!1,O(t,s));return!s.ended&&(s.lengthe.highWaterMark&&(e.highWaterMark=function(t){return t>=E?t=E:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}function C(t){var e=t._readableState;a("emitReadable",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(a("emitReadable",e.flowing),e.emittedReadable=!0,i.nextTick(P,t))}function P(t){var e=t._readableState;a("emitReadable_",e.destroyed,e.length,e.ended),e.destroyed||!e.length&&!e.ended||(t.emit("readable"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,F(t)}function O(t,e){e.readingMore||(e.readingMore=!0,i.nextTick(I,t,e))}function I(t,e){for(;!e.reading&&!e.ended&&(e.length0,e.resumeScheduled&&!e.paused?e.flowing=!0:t.listenerCount("data")>0&&t.resume()}function z(t){a("readable nexttick read 0"),t.read(0)}function R(t,e){a("resume",e.reading),e.reading||t.read(0),e.resumeScheduled=!1,t.emit("resume"),F(t),e.flowing&&!e.reading&&t.read(0)}function F(t){var e=t._readableState;for(a("flow",e.flowing);e.flowing&&null!==t.read(););}function B(t,e){return 0===e.length?null:(e.objectMode?r=e.buffer.shift():!t||t>=e.length?(r=e.decoder?e.buffer.join(""):1===e.buffer.length?e.buffer.first():e.buffer.concat(e.length),e.buffer.clear()):r=e.buffer.consume(t,e.decoder),r);var r}function N(t){var e=t._readableState;a("endReadable",e.endEmitted),e.endEmitted||(e.ended=!0,i.nextTick(j,e,t))}function j(t,e){if(a("endReadableNT",t.endEmitted,t.length),!t.endEmitted&&0===t.length&&(t.endEmitted=!0,e.readable=!1,e.emit("end"),t.autoDestroy)){var r=e._writableState;(!r||r.autoDestroy&&r.finished)&&e.destroy()}}function U(t,e){for(var r=0,n=t.length;r=e.highWaterMark:e.length>0)||e.ended))return a("read: emitReadable",e.length,e.ended),0===e.length&&e.ended?N(this):C(this),null;if(0===(t=L(t,e))&&e.ended)return 0===e.length&&N(this),null;var n,i=e.needReadable;return a("need readable",i),(0===e.length||e.length-t0?B(t,e):null)?(e.needReadable=e.length<=e.highWaterMark,t=0):(e.length-=t,e.awaitDrain=0),0===e.length&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&N(this)),null!==n&&this.emit("data",n),n},A.prototype._read=function(t){w(this,new b("_read()"))},A.prototype.pipe=function(t,e){var r=this,n=this._readableState;switch(n.pipesCount){case 0:n.pipes=t;break;case 1:n.pipes=[n.pipes,t];break;default:n.pipes.push(t)}n.pipesCount+=1,a("pipe count=%d opts=%j",n.pipesCount,e);var s=e&&!1===e.end||t===i.stdout||t===i.stderr?v:l;function l(){a("onend"),t.end()}n.endEmitted?i.nextTick(s):r.once("end",s),t.on("unpipe",(function e(i,o){a("onunpipe"),i===r&&o&&!1===o.hasUnpiped&&(o.hasUnpiped=!0,a("cleanup"),t.removeListener("close",p),t.removeListener("finish",d),t.removeListener("drain",u),t.removeListener("error",h),t.removeListener("unpipe",e),r.removeListener("end",l),r.removeListener("end",v),r.removeListener("data",f),c=!0,!n.awaitDrain||t._writableState&&!t._writableState.needDrain||u())}));var u=function(t){return function(){var e=t._readableState;a("pipeOnDrain",e.awaitDrain),e.awaitDrain&&e.awaitDrain--,0===e.awaitDrain&&o(t,"data")&&(e.flowing=!0,F(t))}}(r);t.on("drain",u);var c=!1;function f(e){a("ondata");var i=t.write(e);a("dest.write",i),!1===i&&((1===n.pipesCount&&n.pipes===t||n.pipesCount>1&&-1!==U(n.pipes,t))&&!c&&(a("false write response, pause",n.awaitDrain),n.awaitDrain++),r.pause())}function h(e){a("onerror",e),v(),t.removeListener("error",h),0===o(t,"error")&&w(t,e)}function p(){t.removeListener("finish",d),v()}function d(){a("onfinish"),t.removeListener("close",p),v()}function v(){a("unpipe"),r.unpipe(t)}return r.on("data",f),function(t,e,r){if("function"==typeof t.prependListener)return t.prependListener(e,r);t._events&&t._events[e]?Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]:t.on(e,r)}(t,"error",h),t.once("close",p),t.once("finish",d),t.emit("pipe",r),n.flowing||(a("pipe resume"),r.resume()),t},A.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(0===e.pipesCount)return this;if(1===e.pipesCount)return t&&t!==e.pipes||(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this,r)),this;if(!t){var n=e.pipes,i=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var a=0;a0,!1!==n.flowing&&this.resume()):"readable"===t&&(n.endEmitted||n.readableListening||(n.readableListening=n.needReadable=!0,n.flowing=!1,n.emittedReadable=!1,a("on readable",n.length,n.reading),n.length?C(this):n.reading||i.nextTick(z,this))),r},A.prototype.addListener=A.prototype.on,A.prototype.removeListener=function(t,e){var r=s.prototype.removeListener.call(this,t,e);return"readable"===t&&i.nextTick(D,this),r},A.prototype.removeAllListeners=function(t){var e=s.prototype.removeAllListeners.apply(this,arguments);return"readable"!==t&&void 0!==t||i.nextTick(D,this),e},A.prototype.resume=function(){var t=this._readableState;return t.flowing||(a("resume"),t.flowing=!t.readableListening,function(t,e){e.resumeScheduled||(e.resumeScheduled=!0,i.nextTick(R,t,e))}(this,t)),t.paused=!1,this},A.prototype.pause=function(){return a("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(a("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this},A.prototype.wrap=function(t){var e=this,r=this._readableState,n=!1;for(var i in t.on("end",(function(){if(a("wrapped end"),r.decoder&&!r.ended){var t=r.decoder.end();t&&t.length&&e.push(t)}e.push(null)})),t.on("data",(function(i){a("wrapped data"),r.decoder&&(i=r.decoder.write(i)),r.objectMode&&null==i||(r.objectMode||i&&i.length)&&(e.push(i)||(n=!0,t.pause()))})),t)void 0===this[i]&&"function"==typeof t[i]&&(this[i]=function(e){return function(){return t[e].apply(t,arguments)}}(i));for(var o=0;o-1))throw new _(t);return this._writableState.defaultEncoding=t,this},Object.defineProperty(A.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}}),Object.defineProperty(A.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),A.prototype._write=function(t,e,r){r(new v("_write()"))},A.prototype._writev=null,A.prototype.end=function(t,e,r){var n=this._writableState;return"function"==typeof t?(r=t,t=null,e=null):"function"==typeof e&&(r=e,e=null),null!=t&&this.write(t,e),n.corked&&(n.corked=1,this.uncork()),n.ending||function(t,e,r){e.ending=!0,P(t,e),r&&(e.finished?i.nextTick(r):t.once("finish",r)),e.ended=!0,t.writable=!1}(this,n,r),this},Object.defineProperty(A.prototype,"writableLength",{enumerable:!1,get:function(){return this._writableState.length}}),Object.defineProperty(A.prototype,"destroyed",{enumerable:!1,get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(t){this._writableState&&(this._writableState.destroyed=t)}}),A.prototype.destroy=f.destroy,A.prototype._undestroy=f.undestroy,A.prototype._destroy=function(t,e){e(t)}},68221:function(t,e,r){"use strict";var n,i=r(90386);function a(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var o=r(12726),s=Symbol("lastResolve"),l=Symbol("lastReject"),u=Symbol("error"),c=Symbol("ended"),f=Symbol("lastPromise"),h=Symbol("handlePromise"),p=Symbol("stream");function d(t,e){return{value:t,done:e}}function v(t){var e=t[s];if(null!==e){var r=t[p].read();null!==r&&(t[f]=null,t[s]=null,t[l]=null,e(d(r,!1)))}}function g(t){i.nextTick(v,t)}var y=Object.getPrototypeOf((function(){})),m=Object.setPrototypeOf((a(n={get stream(){return this[p]},next:function(){var t=this,e=this[u];if(null!==e)return Promise.reject(e);if(this[c])return Promise.resolve(d(void 0,!0));if(this[p].destroyed)return new Promise((function(e,r){i.nextTick((function(){t[u]?r(t[u]):e(d(void 0,!0))}))}));var r,n=this[f];if(n)r=new Promise(function(t,e){return function(r,n){t.then((function(){e[c]?r(d(void 0,!0)):e[h](r,n)}),n)}}(n,this));else{var a=this[p].read();if(null!==a)return Promise.resolve(d(a,!1));r=new Promise(this[h])}return this[f]=r,r}},Symbol.asyncIterator,(function(){return this})),a(n,"return",(function(){var t=this;return new Promise((function(e,r){t[p].destroy(null,(function(t){t?r(t):e(d(void 0,!0))}))}))})),n),y);t.exports=function(t){var e,r=Object.create(m,(a(e={},p,{value:t,writable:!0}),a(e,s,{value:null,writable:!0}),a(e,l,{value:null,writable:!0}),a(e,u,{value:null,writable:!0}),a(e,c,{value:t._readableState.endEmitted,writable:!0}),a(e,h,{value:function(t,e){var n=r[p].read();n?(r[f]=null,r[s]=null,r[l]=null,t(d(n,!1))):(r[s]=t,r[l]=e)},writable:!0}),e));return r[f]=null,o(t,(function(t){if(t&&"ERR_STREAM_PREMATURE_CLOSE"!==t.code){var e=r[l];return null!==e&&(r[f]=null,r[s]=null,r[l]=null,e(t)),void(r[u]=t)}var n=r[s];null!==n&&(r[f]=null,r[s]=null,r[l]=null,n(d(void 0,!0))),r[c]=!0})),t.on("readable",g.bind(null,r)),r}},31125:function(t,e,r){"use strict";function n(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function i(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function a(t,e){for(var r=0;r0?this.tail.next=e:this.head=e,this.tail=e,++this.length}},{key:"unshift",value:function(t){var e={data:t,next:this.head};0===this.length&&(this.tail=e),this.head=e,++this.length}},{key:"shift",value:function(){if(0!==this.length){var t=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,t}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(t){if(0===this.length)return"";for(var e=this.head,r=""+e.data;e=e.next;)r+=t+e.data;return r}},{key:"concat",value:function(t){if(0===this.length)return o.alloc(0);for(var e,r,n,i=o.allocUnsafe(t>>>0),a=this.head,s=0;a;)e=a.data,r=i,n=s,o.prototype.copy.call(e,r,n),s+=a.data.length,a=a.next;return i}},{key:"consume",value:function(t,e){var r;return ti.length?i.length:t;if(a===i.length?n+=i:n+=i.slice(0,t),0==(t-=a)){a===i.length?(++r,e.next?this.head=e.next:this.head=this.tail=null):(this.head=e,e.data=i.slice(a));break}++r}return this.length-=r,n}},{key:"_getBuffer",value:function(t){var e=o.allocUnsafe(t),r=this.head,n=1;for(r.data.copy(e),t-=r.data.length;r=r.next;){var i=r.data,a=t>i.length?i.length:t;if(i.copy(e,e.length-t,0,a),0==(t-=a)){a===i.length?(++n,r.next?this.head=r.next:this.head=this.tail=null):(this.head=r,r.data=i.slice(a));break}++n}return this.length-=n,e}},{key:l,value:function(t,e){return s(this,function(t){for(var e=1;e0,(function(t){c||(c=t),t&&h.forEach(l),a||(h.forEach(l),f(c))}))}));return e.reduce(u)}},56306:function(t,e,r){"use strict";var n=r(74322).q.ERR_INVALID_OPT_VALUE;t.exports={getHighWaterMark:function(t,e,r,i){var a=function(t,e,r){return null!=t.highWaterMark?t.highWaterMark:e?t[r]:null}(e,i,r);if(null!=a){if(!isFinite(a)||Math.floor(a)!==a||a<0)throw new n(i?r:"highWaterMark",a);return Math.floor(a)}return t.objectMode?16:16384}}},71405:function(t,e,r){t.exports=r(15398).EventEmitter},68019:function(t,e,r){"use strict";var n=r(71665).Buffer,i=n.isEncoding||function(t){switch((t=""+t)&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function a(t){var e;switch(this.encoding=function(t){var e=function(t){if(!t)return"utf8";for(var e;;)switch(t){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return t;default:if(e)return;t=(""+t).toLowerCase(),e=!0}}(t);if("string"!=typeof e&&(n.isEncoding===i||!i(t)))throw new Error("Unknown encoding: "+t);return e||t}(t),this.encoding){case"utf16le":this.text=l,this.end=u,e=4;break;case"utf8":this.fillLast=s,e=4;break;case"base64":this.text=c,this.end=f,e=3;break;default:return this.write=h,void(this.end=p)}this.lastNeed=0,this.lastTotal=0,this.lastChar=n.allocUnsafe(e)}function o(t){return t<=127?0:t>>5==6?2:t>>4==14?3:t>>3==30?4:t>>6==2?-1:-2}function s(t){var e=this.lastTotal-this.lastNeed,r=function(t,e,r){if(128!=(192&e[0]))return t.lastNeed=0,"�";if(t.lastNeed>1&&e.length>1){if(128!=(192&e[1]))return t.lastNeed=1,"�";if(t.lastNeed>2&&e.length>2&&128!=(192&e[2]))return t.lastNeed=2,"�"}}(this,t);return void 0!==r?r:this.lastNeed<=t.length?(t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(t.copy(this.lastChar,e,0,t.length),void(this.lastNeed-=t.length))}function l(t,e){if((t.length-e)%2==0){var r=t.toString("utf16le",e);if(r){var n=r.charCodeAt(r.length-1);if(n>=55296&&n<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function u(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,r)}return e}function c(t,e){var r=(t.length-e)%3;return 0===r?t.toString("base64",e):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-r))}function f(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function h(t){return t.toString(this.encoding)}function p(t){return t&&t.length?this.write(t):""}e.s=a,a.prototype.write=function(t){if(0===t.length)return"";var e,r;if(this.lastNeed){if(void 0===(e=this.fillLast(t)))return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r=0?(i>0&&(t.lastNeed=i-1),i):--n=0?(i>0&&(t.lastNeed=i-2),i):--n=0?(i>0&&(2===i?i=0:t.lastNeed=i-3),i):0}(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=r;var n=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,n),t.toString("utf8",e,n)},a.prototype.fillLast=function(t){if(this.lastNeed<=t.length)return t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,t.length),this.lastNeed-=t.length}},90715:function(t,e,r){var n=r(32791),i=r(41633)("stream-parser");t.exports=function(t){var e=t&&"function"==typeof t._transform,r=t&&"function"==typeof t._write;if(!e&&!r)throw new Error("must pass a Writable or Transform stream in");i("extending Parser into stream"),t._bytes=c,t._skipBytes=f,e&&(t._passthrough=h),e?t._transform=d:t._write=p};var a=-1,o=0,s=1,l=2;function u(t){i("initializing parser stream"),t._parserBytesLeft=0,t._parserBuffers=[],t._parserBuffered=0,t._parserState=a,t._parserCallback=null,"function"==typeof t.push&&(t._parserOutput=t.push.bind(t)),t._parserInit=!0}function c(t,e){n(!this._parserCallback,'there is already a "callback" set!'),n(isFinite(t)&&t>0,'can only buffer a finite number of bytes > 0, got "'+t+'"'),this._parserInit||u(this),i("buffering %o bytes",t),this._parserBytesLeft=t,this._parserCallback=e,this._parserState=o}function f(t,e){n(!this._parserCallback,'there is already a "callback" set!'),n(t>0,'can only skip > 0 bytes, got "'+t+'"'),this._parserInit||u(this),i("skipping %o bytes",t),this._parserBytesLeft=t,this._parserCallback=e,this._parserState=s}function h(t,e){n(!this._parserCallback,'There is already a "callback" set!'),n(t>0,'can only pass through > 0 bytes, got "'+t+'"'),this._parserInit||u(this),i("passing through %o bytes",t),this._parserBytesLeft=t,this._parserCallback=e,this._parserState=l}function p(t,e,r){this._parserInit||u(this),i("write(%o bytes)",t.length),"function"==typeof e&&(r=e),g(this,t,null,r)}function d(t,e,r){this._parserInit||u(this),i("transform(%o bytes)",t.length),"function"!=typeof e&&(e=this._parserOutput),g(this,t,e,r)}function v(t,e,r,n){if(t._parserBytesLeft-=e.length,i("%o bytes left for stream piece",t._parserBytesLeft),t._parserState===o?(t._parserBuffers.push(e),t._parserBuffered+=e.length):t._parserState===l&&r(e),0!==t._parserBytesLeft)return n;var s=t._parserCallback;if(s&&t._parserState===o&&t._parserBuffers.length>1&&(e=Buffer.concat(t._parserBuffers,t._parserBuffered)),t._parserState!==o&&(e=null),t._parserCallback=null,t._parserBuffered=0,t._parserState=a,t._parserBuffers.splice(0),s){var u=[];e&&u.push(e),r&&u.push(r);var c=s.length>u.length;c&&u.push(y(n));var f=s.apply(t,u);if(!c||n===f)return n}}var g=y((function t(e,r,n,i){return e._parserBytesLeft<=0?i(new Error("got data but not currently parsing anything")):r.length<=e._parserBytesLeft?function(){return v(e,r,n,i)}:function(){var a=r.slice(0,e._parserBytesLeft);return v(e,a,n,(function(o){return o?i(o):r.length>a.length?function(){return t(e,r.slice(a.length),n,i)}:void 0}))}}));function y(t){return function(){for(var e=t.apply(this,arguments);"function"==typeof e;)e=e();return e}}},41633:function(t,e,r){var n=r(90386);function i(){var t;try{t=e.storage.debug}catch(t){}return!t&&void 0!==n&&"env"in n&&(t=n.env.DEBUG),t}(e=t.exports=r(74469)).log=function(){return"object"==typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)},e.formatArgs=function(t){var r=this.useColors;if(t[0]=(r?"%c":"")+this.namespace+(r?" %c":" ")+t[0]+(r?"%c ":" ")+"+"+e.humanize(this.diff),r){var n="color: "+this.color;t.splice(1,0,n,"color: inherit");var i=0,a=0;t[0].replace(/%[a-zA-Z%]/g,(function(t){"%%"!==t&&(i++,"%c"===t&&(a=i))})),t.splice(a,0,n)}},e.save=function(t){try{null==t?e.storage.removeItem("debug"):e.storage.debug=t}catch(t){}},e.load=i,e.useColors=function(){return!("undefined"==typeof window||!window.process||"renderer"!==window.process.type)||("undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))},e.storage="undefined"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(t){}}(),e.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],e.formatters.j=function(t){try{return JSON.stringify(t)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}},e.enable(i())},74469:function(t,e,r){var n;function i(t){function r(){if(r.enabled){var t=r,i=+new Date,a=i-(n||i);t.diff=a,t.prev=n,t.curr=i,n=i;for(var o=new Array(arguments.length),s=0;s0)return function(t){if(!((t=String(t)).length>100)){var a=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(t);if(a){var o=parseFloat(a[1]);switch((a[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*o;case"days":case"day":case"d":return o*i;case"hours":case"hour":case"hrs":case"hr":case"h":return o*n;case"minutes":case"minute":case"mins":case"min":case"m":return o*r;case"seconds":case"second":case"secs":case"sec":case"s":return o*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return o;default:return}}}}(t);if("number"===l&&!1===isNaN(t))return o.long?a(s=t,i,"day")||a(s,n,"hour")||a(s,r,"minute")||a(s,e,"second")||s+" ms":function(t){return t>=i?Math.round(t/i)+"d":t>=n?Math.round(t/n)+"h":t>=r?Math.round(t/r)+"m":t>=e?Math.round(t/e)+"s":t+"ms"}(t);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(t))}},99011:function(t,e,r){"use strict";var n=r(88641);t.exports=function(t,e,r){if(null==t)throw Error("First argument should be a string");if(null==e)throw Error("Separator should be a string or a RegExp");r?("string"==typeof r||Array.isArray(r))&&(r={ignore:r}):r={},null==r.escape&&(r.escape=!0),null==r.ignore?r.ignore=["[]","()","{}","<>",'""',"''","``","“”","«»"]:("string"==typeof r.ignore&&(r.ignore=[r.ignore]),r.ignore=r.ignore.map((function(t){return 1===t.length&&(t+=t),t})));var i=n.parse(t,{flat:!0,brackets:r.ignore}),a=i[0].split(e);if(r.escape){for(var o=[],s=0;s0;){e=u[u.length-1];var p=t[e];if(a[e]=0&&s[e].push(o[v])}a[e]=d}else{if(n[e]===r[e]){var g=[],y=[],m=0;for(d=l.length-1;d>=0;--d){var x=l[d];if(i[x]=!1,g.push(x),y.push(s[x]),m+=s[x].length,o[x]=f.length,x===e){l.length=d;break}}f.push(g);var b=new Array(m);for(d=0;d1&&(i=1),i<-1&&(i=-1),(t*n-e*r<0?-1:1)*Math.acos(i)};e.default=function(t){var e=t.px,r=t.py,s=t.cx,l=t.cy,u=t.rx,c=t.ry,f=t.xAxisRotation,h=void 0===f?0:f,p=t.largeArcFlag,d=void 0===p?0:p,v=t.sweepFlag,g=void 0===v?0:v,y=[];if(0===u||0===c)return[];var m=Math.sin(h*n/360),x=Math.cos(h*n/360),b=x*(e-s)/2+m*(r-l)/2,_=-m*(e-s)/2+x*(r-l)/2;if(0===b&&0===_)return[];u=Math.abs(u),c=Math.abs(c);var w=Math.pow(b,2)/Math.pow(u,2)+Math.pow(_,2)/Math.pow(c,2);w>1&&(u*=Math.sqrt(w),c*=Math.sqrt(w));var T=function(t,e,r,i,a,s,l,u,c,f,h,p){var d=Math.pow(a,2),v=Math.pow(s,2),g=Math.pow(h,2),y=Math.pow(p,2),m=d*v-d*y-v*g;m<0&&(m=0),m/=d*y+v*g;var x=(m=Math.sqrt(m)*(l===u?-1:1))*a/s*p,b=m*-s/a*h,_=f*x-c*b+(t+r)/2,w=c*x+f*b+(e+i)/2,T=(h-x)/a,k=(p-b)/s,A=(-h-x)/a,M=(-p-b)/s,S=o(1,0,T,k),E=o(T,k,A,M);return 0===u&&E>0&&(E-=n),1===u&&E<0&&(E+=n),[_,w,S,E]}(e,r,s,l,u,c,d,g,m,x,b,_),k=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return function(t,e){var r=[],n=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(n=(o=s.next()).done)&&(r.push(o.value),!e||r.length!==e);n=!0);}catch(t){i=!0,a=t}finally{try{!n&&s.return&&s.return()}finally{if(i)throw a}}return r}(t,e);throw new TypeError("Invalid attempt to destructure non-iterable instance")}(T,4),A=k[0],M=k[1],S=k[2],E=k[3],L=Math.abs(E)/(n/4);Math.abs(1-L)<1e-7&&(L=1);var C=Math.max(Math.ceil(L),1);E/=C;for(var P=0;Pe[2]&&(e[2]=u[c+0]),u[c+1]>e[3]&&(e[3]=u[c+1]);return e}},29988:function(t,e,r){"use strict";t.exports=function(t){for(var e,r=[],o=0,s=0,l=0,u=0,c=null,f=null,h=0,p=0,d=0,v=t.length;d4?(o=g[g.length-4],s=g[g.length-3]):(o=h,s=p),r.push(g)}return r};var n=r(7095);function i(t,e,r,n){return["C",t,e,r,n,r,n]}function a(t,e,r,n,i,a){return["C",t/3+2/3*r,e/3+2/3*n,i/3+2/3*r,a/3+2/3*n,i,a]}},82019:function(t,e,r){"use strict";var n,i=r(1750),a=r(95616),o=r(31457),s=r(89546),l=r(44781),u=document.createElement("canvas"),c=u.getContext("2d");t.exports=function(t,e){if(!s(t))throw Error("Argument should be valid svg path string");var r,f;e||(e={}),e.shape?(r=e.shape[0],f=e.shape[1]):(r=u.width=e.w||e.width||200,f=u.height=e.h||e.height||200);var h=Math.min(r,f),p=e.stroke||0,d=e.viewbox||e.viewBox||i(t),v=[r/(d[2]-d[0]),f/(d[3]-d[1])],g=Math.min(v[0]||0,v[1]||0)/2;if(c.fillStyle="black",c.fillRect(0,0,r,f),c.fillStyle="white",p&&("number"!=typeof p&&(p=1),c.strokeStyle=p>0?"white":"black",c.lineWidth=Math.abs(p)),c.translate(.5*r,.5*f),c.scale(g,g),function(){if(null!=n)return n;var t=document.createElement("canvas").getContext("2d");if(t.canvas.width=t.canvas.height=1,!window.Path2D)return n=!1;var e=new Path2D("M0,0h1v1h-1v-1Z");t.fillStyle="black",t.fill(e);var r=t.getImageData(0,0,1,1);return n=r&&r.data&&255===r.data[3]}()){var y=new Path2D(t);c.fill(y),p&&c.stroke(y)}else{var m=a(t);o(c,m),c.fill(),p&&c.stroke()}return c.setTransform(1,0,0,1,0,0),l(c,{cutoff:null!=e.cutoff?e.cutoff:.5,radius:null!=e.radius?e.radius:.5*h})}},84267:function(t,e,r){var n;!function(i){var a=/^\s+/,o=/\s+$/,s=0,l=i.round,u=i.min,c=i.max,f=i.random;function h(t,e){if(e=e||{},(t=t||"")instanceof h)return t;if(!(this instanceof h))return new h(t,e);var r=function(t){var e,r,n,s={r:0,g:0,b:0},l=1,f=null,h=null,p=null,d=!1,v=!1;return"string"==typeof t&&(t=function(t){t=t.replace(a,"").replace(o,"").toLowerCase();var e,r=!1;if(C[t])t=C[t],r=!0;else if("transparent"==t)return{r:0,g:0,b:0,a:0,format:"name"};return(e=H.rgb.exec(t))?{r:e[1],g:e[2],b:e[3]}:(e=H.rgba.exec(t))?{r:e[1],g:e[2],b:e[3],a:e[4]}:(e=H.hsl.exec(t))?{h:e[1],s:e[2],l:e[3]}:(e=H.hsla.exec(t))?{h:e[1],s:e[2],l:e[3],a:e[4]}:(e=H.hsv.exec(t))?{h:e[1],s:e[2],v:e[3]}:(e=H.hsva.exec(t))?{h:e[1],s:e[2],v:e[3],a:e[4]}:(e=H.hex8.exec(t))?{r:z(e[1]),g:z(e[2]),b:z(e[3]),a:N(e[4]),format:r?"name":"hex8"}:(e=H.hex6.exec(t))?{r:z(e[1]),g:z(e[2]),b:z(e[3]),format:r?"name":"hex"}:(e=H.hex4.exec(t))?{r:z(e[1]+""+e[1]),g:z(e[2]+""+e[2]),b:z(e[3]+""+e[3]),a:N(e[4]+""+e[4]),format:r?"name":"hex8"}:!!(e=H.hex3.exec(t))&&{r:z(e[1]+""+e[1]),g:z(e[2]+""+e[2]),b:z(e[3]+""+e[3]),format:r?"name":"hex"}}(t)),"object"==typeof t&&(q(t.r)&&q(t.g)&&q(t.b)?(e=t.r,r=t.g,n=t.b,s={r:255*I(e,255),g:255*I(r,255),b:255*I(n,255)},d=!0,v="%"===String(t.r).substr(-1)?"prgb":"rgb"):q(t.h)&&q(t.s)&&q(t.v)?(f=F(t.s),h=F(t.v),s=function(t,e,r){t=6*I(t,360),e=I(e,100),r=I(r,100);var n=i.floor(t),a=t-n,o=r*(1-e),s=r*(1-a*e),l=r*(1-(1-a)*e),u=n%6;return{r:255*[r,s,o,o,l,r][u],g:255*[l,r,r,s,o,o][u],b:255*[o,o,l,r,r,s][u]}}(t.h,f,h),d=!0,v="hsv"):q(t.h)&&q(t.s)&&q(t.l)&&(f=F(t.s),p=F(t.l),s=function(t,e,r){var n,i,a;function o(t,e,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+(e-t)*(2/3-r)*6:t}if(t=I(t,360),e=I(e,100),r=I(r,100),0===e)n=i=a=r;else{var s=r<.5?r*(1+e):r+e-r*e,l=2*r-s;n=o(l,s,t+1/3),i=o(l,s,t),a=o(l,s,t-1/3)}return{r:255*n,g:255*i,b:255*a}}(t.h,f,p),d=!0,v="hsl"),t.hasOwnProperty("a")&&(l=t.a)),l=O(l),{ok:d,format:t.format||v,r:u(255,c(s.r,0)),g:u(255,c(s.g,0)),b:u(255,c(s.b,0)),a:l}}(t);this._originalInput=t,this._r=r.r,this._g=r.g,this._b=r.b,this._a=r.a,this._roundA=l(100*this._a)/100,this._format=e.format||r.format,this._gradientType=e.gradientType,this._r<1&&(this._r=l(this._r)),this._g<1&&(this._g=l(this._g)),this._b<1&&(this._b=l(this._b)),this._ok=r.ok,this._tc_id=s++}function p(t,e,r){t=I(t,255),e=I(e,255),r=I(r,255);var n,i,a=c(t,e,r),o=u(t,e,r),s=(a+o)/2;if(a==o)n=i=0;else{var l=a-o;switch(i=s>.5?l/(2-a-o):l/(a+o),a){case t:n=(e-r)/l+(e>1)+720)%360;--e;)n.h=(n.h+i)%360,a.push(h(n));return a}function L(t,e){e=e||6;for(var r=h(t).toHsv(),n=r.h,i=r.s,a=r.v,o=[],s=1/e;e--;)o.push(h({h:n,s:i,v:a})),a=(a+s)%1;return o}h.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var t=this.toRgb();return(299*t.r+587*t.g+114*t.b)/1e3},getLuminance:function(){var t,e,r,n=this.toRgb();return t=n.r/255,e=n.g/255,r=n.b/255,.2126*(t<=.03928?t/12.92:i.pow((t+.055)/1.055,2.4))+.7152*(e<=.03928?e/12.92:i.pow((e+.055)/1.055,2.4))+.0722*(r<=.03928?r/12.92:i.pow((r+.055)/1.055,2.4))},setAlpha:function(t){return this._a=O(t),this._roundA=l(100*this._a)/100,this},toHsv:function(){var t=d(this._r,this._g,this._b);return{h:360*t.h,s:t.s,v:t.v,a:this._a}},toHsvString:function(){var t=d(this._r,this._g,this._b),e=l(360*t.h),r=l(100*t.s),n=l(100*t.v);return 1==this._a?"hsv("+e+", "+r+"%, "+n+"%)":"hsva("+e+", "+r+"%, "+n+"%, "+this._roundA+")"},toHsl:function(){var t=p(this._r,this._g,this._b);return{h:360*t.h,s:t.s,l:t.l,a:this._a}},toHslString:function(){var t=p(this._r,this._g,this._b),e=l(360*t.h),r=l(100*t.s),n=l(100*t.l);return 1==this._a?"hsl("+e+", "+r+"%, "+n+"%)":"hsla("+e+", "+r+"%, "+n+"%, "+this._roundA+")"},toHex:function(t){return v(this._r,this._g,this._b,t)},toHexString:function(t){return"#"+this.toHex(t)},toHex8:function(t){return function(t,e,r,n,i){var a=[R(l(t).toString(16)),R(l(e).toString(16)),R(l(r).toString(16)),R(B(n))];return i&&a[0].charAt(0)==a[0].charAt(1)&&a[1].charAt(0)==a[1].charAt(1)&&a[2].charAt(0)==a[2].charAt(1)&&a[3].charAt(0)==a[3].charAt(1)?a[0].charAt(0)+a[1].charAt(0)+a[2].charAt(0)+a[3].charAt(0):a.join("")}(this._r,this._g,this._b,this._a,t)},toHex8String:function(t){return"#"+this.toHex8(t)},toRgb:function(){return{r:l(this._r),g:l(this._g),b:l(this._b),a:this._a}},toRgbString:function(){return 1==this._a?"rgb("+l(this._r)+", "+l(this._g)+", "+l(this._b)+")":"rgba("+l(this._r)+", "+l(this._g)+", "+l(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:l(100*I(this._r,255))+"%",g:l(100*I(this._g,255))+"%",b:l(100*I(this._b,255))+"%",a:this._a}},toPercentageRgbString:function(){return 1==this._a?"rgb("+l(100*I(this._r,255))+"%, "+l(100*I(this._g,255))+"%, "+l(100*I(this._b,255))+"%)":"rgba("+l(100*I(this._r,255))+"%, "+l(100*I(this._g,255))+"%, "+l(100*I(this._b,255))+"%, "+this._roundA+")"},toName:function(){return 0===this._a?"transparent":!(this._a<1)&&(P[v(this._r,this._g,this._b,!0)]||!1)},toFilter:function(t){var e="#"+g(this._r,this._g,this._b,this._a),r=e,n=this._gradientType?"GradientType = 1, ":"";if(t){var i=h(t);r="#"+g(i._r,i._g,i._b,i._a)}return"progid:DXImageTransform.Microsoft.gradient("+n+"startColorstr="+e+",endColorstr="+r+")"},toString:function(t){var e=!!t;t=t||this._format;var r=!1,n=this._a<1&&this._a>=0;return e||!n||"hex"!==t&&"hex6"!==t&&"hex3"!==t&&"hex4"!==t&&"hex8"!==t&&"name"!==t?("rgb"===t&&(r=this.toRgbString()),"prgb"===t&&(r=this.toPercentageRgbString()),"hex"!==t&&"hex6"!==t||(r=this.toHexString()),"hex3"===t&&(r=this.toHexString(!0)),"hex4"===t&&(r=this.toHex8String(!0)),"hex8"===t&&(r=this.toHex8String()),"name"===t&&(r=this.toName()),"hsl"===t&&(r=this.toHslString()),"hsv"===t&&(r=this.toHsvString()),r||this.toHexString()):"name"===t&&0===this._a?this.toName():this.toRgbString()},clone:function(){return h(this.toString())},_applyModification:function(t,e){var r=t.apply(null,[this].concat([].slice.call(e)));return this._r=r._r,this._g=r._g,this._b=r._b,this.setAlpha(r._a),this},lighten:function(){return this._applyModification(b,arguments)},brighten:function(){return this._applyModification(_,arguments)},darken:function(){return this._applyModification(w,arguments)},desaturate:function(){return this._applyModification(y,arguments)},saturate:function(){return this._applyModification(m,arguments)},greyscale:function(){return this._applyModification(x,arguments)},spin:function(){return this._applyModification(T,arguments)},_applyCombination:function(t,e){return t.apply(null,[this].concat([].slice.call(e)))},analogous:function(){return this._applyCombination(E,arguments)},complement:function(){return this._applyCombination(k,arguments)},monochromatic:function(){return this._applyCombination(L,arguments)},splitcomplement:function(){return this._applyCombination(S,arguments)},triad:function(){return this._applyCombination(A,arguments)},tetrad:function(){return this._applyCombination(M,arguments)}},h.fromRatio=function(t,e){if("object"==typeof t){var r={};for(var n in t)t.hasOwnProperty(n)&&(r[n]="a"===n?t[n]:F(t[n]));t=r}return h(t,e)},h.equals=function(t,e){return!(!t||!e)&&h(t).toRgbString()==h(e).toRgbString()},h.random=function(){return h.fromRatio({r:f(),g:f(),b:f()})},h.mix=function(t,e,r){r=0===r?0:r||50;var n=h(t).toRgb(),i=h(e).toRgb(),a=r/100;return h({r:(i.r-n.r)*a+n.r,g:(i.g-n.g)*a+n.g,b:(i.b-n.b)*a+n.b,a:(i.a-n.a)*a+n.a})},h.readability=function(t,e){var r=h(t),n=h(e);return(i.max(r.getLuminance(),n.getLuminance())+.05)/(i.min(r.getLuminance(),n.getLuminance())+.05)},h.isReadable=function(t,e,r){var n,i,a,o,s,l=h.readability(t,e);switch(i=!1,(a=r,"AA"!==(o=((a=a||{level:"AA",size:"small"}).level||"AA").toUpperCase())&&"AAA"!==o&&(o="AA"),"small"!==(s=(a.size||"small").toLowerCase())&&"large"!==s&&(s="small"),n={level:o,size:s}).level+n.size){case"AAsmall":case"AAAlarge":i=l>=4.5;break;case"AAlarge":i=l>=3;break;case"AAAsmall":i=l>=7}return i},h.mostReadable=function(t,e,r){var n,i,a,o,s=null,l=0;i=(r=r||{}).includeFallbackColors,a=r.level,o=r.size;for(var u=0;ul&&(l=n,s=h(e[u]));return h.isReadable(t,s,{level:a,size:o})||!i?s:(r.includeFallbackColors=!1,h.mostReadable(t,["#fff","#000"],r))};var C=h.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},P=h.hexNames=function(t){var e={};for(var r in t)t.hasOwnProperty(r)&&(e[t[r]]=r);return e}(C);function O(t){return t=parseFloat(t),(isNaN(t)||t<0||t>1)&&(t=1),t}function I(t,e){(function(t){return"string"==typeof t&&-1!=t.indexOf(".")&&1===parseFloat(t)})(t)&&(t="100%");var r=function(t){return"string"==typeof t&&-1!=t.indexOf("%")}(t);return t=u(e,c(0,parseFloat(t))),r&&(t=parseInt(t*e,10)/100),i.abs(t-e)<1e-6?1:t%e/parseFloat(e)}function D(t){return u(1,c(0,t))}function z(t){return parseInt(t,16)}function R(t){return 1==t.length?"0"+t:""+t}function F(t){return t<=1&&(t=100*t+"%"),t}function B(t){return i.round(255*parseFloat(t)).toString(16)}function N(t){return z(t)/255}var j,U,V,H=(U="[\\s|\\(]+("+(j="(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)")+")[,|\\s]+("+j+")[,|\\s]+("+j+")\\s*\\)?",V="[\\s|\\(]+("+j+")[,|\\s]+("+j+")[,|\\s]+("+j+")[,|\\s]+("+j+")\\s*\\)?",{CSS_UNIT:new RegExp(j),rgb:new RegExp("rgb"+U),rgba:new RegExp("rgba"+V),hsl:new RegExp("hsl"+U),hsla:new RegExp("hsla"+V),hsv:new RegExp("hsv"+U),hsva:new RegExp("hsva"+V),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/});function q(t){return!!H.CSS_UNIT.exec(t)}t.exports?t.exports=h:void 0===(n=function(){return h}.call(e,r,e,t))||(t.exports=n)}(Math)},57060:function(t){"use strict";t.exports=r,t.exports.float32=t.exports.float=r,t.exports.fract32=t.exports.fract=function(t,e){if(t.length){if(t instanceof Float32Array)return new Float32Array(t.length);e instanceof Float32Array||(e=r(t));for(var n=0,i=e.length;n":(e.length>100&&(e=e.slice(0,99)+"…"),e=e.replace(i,(function(t){switch(t){case"\n":return"\\n";case"\r":return"\\r";case"\u2028":return"\\u2028";case"\u2029":return"\\u2029";default:throw new Error("Unexpected character")}})))}},47403:function(t,e,r){"use strict";var n=r(24582),i={object:!0,function:!0,undefined:!0};t.exports=function(t){return!!n(t)&&hasOwnProperty.call(i,typeof t)}},82527:function(t,e,r){"use strict";var n=r(69190),i=r(84985);t.exports=function(t){return i(t)?t:n(t,"%v is not a plain function",arguments[1])}},84985:function(t,e,r){"use strict";var n=r(73116),i=/^\s*class[\s{/}]/,a=Function.prototype.toString;t.exports=function(t){return!!n(t)&&!i.test(a.call(t))}},24511:function(t,e,r){"use strict";var n=r(47403);t.exports=function(t){if(!n(t))return!1;try{return!!t.constructor&&t.constructor.prototype===t}catch(t){return!1}}},9234:function(t,e,r){"use strict";var n=r(24582),i=r(47403),a=Object.prototype.toString;t.exports=function(t){if(!n(t))return null;if(i(t)){var e=t.toString;if("function"!=typeof e)return null;if(e===a)return null}try{return""+t}catch(t){return null}}},10424:function(t,e,r){"use strict";var n=r(69190),i=r(24582);t.exports=function(t){return i(t)?t:n(t,"Cannot use %v",arguments[1])}},24582:function(t){"use strict";t.exports=function(t){return null!=t}},58404:function(t,e,r){"use strict";var n=r(13547),i=r(12129),a=r(12856).Buffer;r.g.__TYPEDARRAY_POOL||(r.g.__TYPEDARRAY_POOL={UINT8:i([32,0]),UINT16:i([32,0]),UINT32:i([32,0]),BIGUINT64:i([32,0]),INT8:i([32,0]),INT16:i([32,0]),INT32:i([32,0]),BIGINT64:i([32,0]),FLOAT:i([32,0]),DOUBLE:i([32,0]),DATA:i([32,0]),UINT8C:i([32,0]),BUFFER:i([32,0])});var o="undefined"!=typeof Uint8ClampedArray,s="undefined"!=typeof BigUint64Array,l="undefined"!=typeof BigInt64Array,u=r.g.__TYPEDARRAY_POOL;u.UINT8C||(u.UINT8C=i([32,0])),u.BIGUINT64||(u.BIGUINT64=i([32,0])),u.BIGINT64||(u.BIGINT64=i([32,0])),u.BUFFER||(u.BUFFER=i([32,0]));var c=u.DATA,f=u.BUFFER;function h(t){if(t){var e=t.length||t.byteLength,r=n.log2(e);c[r].push(t)}}function p(t){t=n.nextPow2(t);var e=n.log2(t),r=c[e];return r.length>0?r.pop():new ArrayBuffer(t)}function d(t){return new Uint8Array(p(t),0,t)}function v(t){return new Uint16Array(p(2*t),0,t)}function g(t){return new Uint32Array(p(4*t),0,t)}function y(t){return new Int8Array(p(t),0,t)}function m(t){return new Int16Array(p(2*t),0,t)}function x(t){return new Int32Array(p(4*t),0,t)}function b(t){return new Float32Array(p(4*t),0,t)}function _(t){return new Float64Array(p(8*t),0,t)}function w(t){return o?new Uint8ClampedArray(p(t),0,t):d(t)}function T(t){return s?new BigUint64Array(p(8*t),0,t):null}function k(t){return l?new BigInt64Array(p(8*t),0,t):null}function A(t){return new DataView(p(t),0,t)}function M(t){t=n.nextPow2(t);var e=n.log2(t),r=f[e];return r.length>0?r.pop():new a(t)}e.free=function(t){if(a.isBuffer(t))f[n.log2(t.length)].push(t);else{if("[object ArrayBuffer]"!==Object.prototype.toString.call(t)&&(t=t.buffer),!t)return;var e=t.length||t.byteLength,r=0|n.log2(e);c[r].push(t)}},e.freeUint8=e.freeUint16=e.freeUint32=e.freeBigUint64=e.freeInt8=e.freeInt16=e.freeInt32=e.freeBigInt64=e.freeFloat32=e.freeFloat=e.freeFloat64=e.freeDouble=e.freeUint8Clamped=e.freeDataView=function(t){h(t.buffer)},e.freeArrayBuffer=h,e.freeBuffer=function(t){f[n.log2(t.length)].push(t)},e.malloc=function(t,e){if(void 0===e||"arraybuffer"===e)return p(t);switch(e){case"uint8":return d(t);case"uint16":return v(t);case"uint32":return g(t);case"int8":return y(t);case"int16":return m(t);case"int32":return x(t);case"float":case"float32":return b(t);case"double":case"float64":return _(t);case"uint8_clamped":return w(t);case"bigint64":return k(t);case"biguint64":return T(t);case"buffer":return M(t);case"data":case"dataview":return A(t);default:return null}return null},e.mallocArrayBuffer=p,e.mallocUint8=d,e.mallocUint16=v,e.mallocUint32=g,e.mallocInt8=y,e.mallocInt16=m,e.mallocInt32=x,e.mallocFloat32=e.mallocFloat=b,e.mallocFloat64=e.mallocDouble=_,e.mallocUint8Clamped=w,e.mallocBigUint64=T,e.mallocBigInt64=k,e.mallocDataView=A,e.mallocBuffer=M,e.clearCache=function(){for(var t=0;t<32;++t)u.UINT8[t].length=0,u.UINT16[t].length=0,u.UINT32[t].length=0,u.INT8[t].length=0,u.INT16[t].length=0,u.INT32[t].length=0,u.FLOAT[t].length=0,u.DOUBLE[t].length=0,u.BIGUINT64[t].length=0,u.BIGINT64[t].length=0,u.UINT8C[t].length=0,c[t].length=0,f[t].length=0}},90448:function(t){var e=/[\'\"]/;t.exports=function(t){return t?(e.test(t.charAt(0))&&(t=t.substr(1)),e.test(t.charAt(t.length-1))&&(t=t.substr(0,t.length-1)),t):""}},93447:function(t){"use strict";t.exports=function(t,e,r){Array.isArray(r)||(r=[].slice.call(arguments,2));for(var n=0,i=r.length;n=i)return t;switch(t){case"%s":return String(n[r++]);case"%d":return Number(n[r++]);case"%j":try{return JSON.stringify(n[r++])}catch(t){return"[Circular]"}default:return t}})),s=n[r];r=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),g(r)?n.showHidden=r:r&&e._extend(n,r),b(n.showHidden)&&(n.showHidden=!1),b(n.depth)&&(n.depth=2),b(n.colors)&&(n.colors=!1),b(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=c),h(n,t,n.depth)}function c(t,e){var r=u.styles[e];return r?"["+u.colors[r][0]+"m"+t+"["+u.colors[r][1]+"m":t}function f(t,e){return t}function h(t,r,n){if(t.customInspect&&r&&A(r.inspect)&&r.inspect!==e.inspect&&(!r.constructor||r.constructor.prototype!==r)){var i=r.inspect(n,t);return x(i)||(i=h(t,i,n)),i}var a=function(t,e){if(b(e))return t.stylize("undefined","undefined");if(x(e)){var r="'"+JSON.stringify(e).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return t.stylize(r,"string")}return m(e)?t.stylize(""+e,"number"):g(e)?t.stylize(""+e,"boolean"):y(e)?t.stylize("null","null"):void 0}(t,r);if(a)return a;var o=Object.keys(r),s=function(t){var e={};return t.forEach((function(t,r){e[t]=!0})),e}(o);if(t.showHidden&&(o=Object.getOwnPropertyNames(r)),k(r)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return p(r);if(0===o.length){if(A(r)){var l=r.name?": "+r.name:"";return t.stylize("[Function"+l+"]","special")}if(_(r))return t.stylize(RegExp.prototype.toString.call(r),"regexp");if(T(r))return t.stylize(Date.prototype.toString.call(r),"date");if(k(r))return p(r)}var u,c="",f=!1,w=["{","}"];return v(r)&&(f=!0,w=["[","]"]),A(r)&&(c=" [Function"+(r.name?": "+r.name:"")+"]"),_(r)&&(c=" "+RegExp.prototype.toString.call(r)),T(r)&&(c=" "+Date.prototype.toUTCString.call(r)),k(r)&&(c=" "+p(r)),0!==o.length||f&&0!=r.length?n<0?_(r)?t.stylize(RegExp.prototype.toString.call(r),"regexp"):t.stylize("[Object]","special"):(t.seen.push(r),u=f?function(t,e,r,n,i){for(var a=[],o=0,s=e.length;o60?r[0]+(""===e?"":e+"\n ")+" "+t.join(",\n ")+" "+r[1]:r[0]+e+" "+t.join(", ")+" "+r[1]}(u,c,w)):w[0]+c+w[1]}function p(t){return"["+Error.prototype.toString.call(t)+"]"}function d(t,e,r,n,i,a){var o,s,l;if((l=Object.getOwnPropertyDescriptor(e,i)||{value:e[i]}).get?s=l.set?t.stylize("[Getter/Setter]","special"):t.stylize("[Getter]","special"):l.set&&(s=t.stylize("[Setter]","special")),L(n,i)||(o="["+i+"]"),s||(t.seen.indexOf(l.value)<0?(s=y(r)?h(t,l.value,null):h(t,l.value,r-1)).indexOf("\n")>-1&&(s=a?s.split("\n").map((function(t){return" "+t})).join("\n").slice(2):"\n"+s.split("\n").map((function(t){return" "+t})).join("\n")):s=t.stylize("[Circular]","special")),b(o)){if(a&&i.match(/^\d+$/))return s;(o=JSON.stringify(""+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(o=o.slice(1,-1),o=t.stylize(o,"name")):(o=o.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),o=t.stylize(o,"string"))}return o+": "+s}function v(t){return Array.isArray(t)}function g(t){return"boolean"==typeof t}function y(t){return null===t}function m(t){return"number"==typeof t}function x(t){return"string"==typeof t}function b(t){return void 0===t}function _(t){return w(t)&&"[object RegExp]"===M(t)}function w(t){return"object"==typeof t&&null!==t}function T(t){return w(t)&&"[object Date]"===M(t)}function k(t){return w(t)&&("[object Error]"===M(t)||t instanceof Error)}function A(t){return"function"==typeof t}function M(t){return Object.prototype.toString.call(t)}function S(t){return t<10?"0"+t.toString(10):t.toString(10)}e.debuglog=function(t){if(t=t.toUpperCase(),!o[t])if(s.test(t)){var r=n.pid;o[t]=function(){var n=e.format.apply(e,arguments);console.error("%s %d: %s",t,r,n)}}else o[t]=function(){};return o[t]},e.inspect=u,u.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},u.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},e.types=r(4936),e.isArray=v,e.isBoolean=g,e.isNull=y,e.isNullOrUndefined=function(t){return null==t},e.isNumber=m,e.isString=x,e.isSymbol=function(t){return"symbol"==typeof t},e.isUndefined=b,e.isRegExp=_,e.types.isRegExp=_,e.isObject=w,e.isDate=T,e.types.isDate=T,e.isError=k,e.types.isNativeError=k,e.isFunction=A,e.isPrimitive=function(t){return null===t||"boolean"==typeof t||"number"==typeof t||"string"==typeof t||"symbol"==typeof t||void 0===t},e.isBuffer=r(45920);var E=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function L(t,e){return Object.prototype.hasOwnProperty.call(t,e)}e.log=function(){var t,r;console.log("%s - %s",(r=[S((t=new Date).getHours()),S(t.getMinutes()),S(t.getSeconds())].join(":"),[t.getDate(),E[t.getMonth()],r].join(" ")),e.format.apply(e,arguments))},e.inherits=r(42018),e._extend=function(t,e){if(!e||!w(e))return t;for(var r=Object.keys(e),n=r.length;n--;)t[r[n]]=e[r[n]];return t};var C="undefined"!=typeof Symbol?Symbol("util.promisify.custom"):void 0;function P(t,e){if(!t){var r=new Error("Promise was rejected with a falsy value");r.reason=t,t=r}return e(t)}e.promisify=function(t){if("function"!=typeof t)throw new TypeError('The "original" argument must be of type Function');if(C&&t[C]){var e;if("function"!=typeof(e=t[C]))throw new TypeError('The "util.promisify.custom" argument must be of type Function');return Object.defineProperty(e,C,{value:e,enumerable:!1,writable:!1,configurable:!0}),e}function e(){for(var e,r,n=new Promise((function(t,n){e=t,r=n})),i=[],a=0;a2111)throw e.replace(/\{0\}/,this.local.name);return t},toMonthIndex:function(t,e,r){var i=this.intercalaryMonth(t);if(r&&e!==i||e<1||e>12)throw n.local.invalidMonth.replace(/\{0\}/,this.local.name);return i?!r&&e<=i?e-1:e:e-1},toChineseMonth:function(t,e){t.year&&(e=(t=t.year()).month());var r=this.intercalaryMonth(t);if(e<0||e>(r?12:11))throw n.local.invalidMonth.replace(/\{0\}/,this.local.name);return r?e>13},isIntercalaryMonth:function(t,e){t.year&&(e=(t=t.year()).month());var r=this.intercalaryMonth(t);return!!r&&r===e},leapYear:function(t){return 0!==this.intercalaryMonth(t)},weekOfYear:function(t,e,r){var i,o=this._validateYear(t,n.local.invalidyear),s=h[o-h[0]],l=s>>9&4095,u=s>>5&15,c=31&s;(i=a.newDate(l,u,c)).add(4-(i.dayOfWeek()||7),"d");var f=this.toJD(t,e,r)-i.toJD();return 1+Math.floor(f/7)},monthsInYear:function(t){return this.leapYear(t)?13:12},daysInMonth:function(t,e){t.year&&(e=t.month(),t=t.year()),t=this._validateYear(t);var r=f[t-f[0]];if(e>(r>>13?12:11))throw n.local.invalidMonth.replace(/\{0\}/,this.local.name);return r&1<<12-e?30:29},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,s,r,n.local.invalidDate);t=this._validateYear(i.year()),e=i.month(),r=i.day();var o=this.isIntercalaryMonth(t,e),s=this.toChineseMonth(t,e),l=function(t,e,r,n,i){var a,o,s;if("object"==typeof t)o=t,a=e||{};else{var l;if(!("number"==typeof t&&t>=1888&&t<=2111))throw new Error("Lunar year outside range 1888-2111");if(!("number"==typeof e&&e>=1&&e<=12))throw new Error("Lunar month outside range 1 - 12");if(!("number"==typeof r&&r>=1&&r<=30))throw new Error("Lunar day outside range 1 - 30");"object"==typeof n?(l=!1,a=n):(l=!!n,a={}),o={year:t,month:e,day:r,isIntercalary:l}}s=o.day-1;var u,c=f[o.year-f[0]],p=c>>13;u=p&&(o.month>p||o.isIntercalary)?o.month:o.month-1;for(var d=0;d>9&4095,(v>>5&15)-1,(31&v)+s);return a.year=g.getFullYear(),a.month=1+g.getMonth(),a.day=g.getDate(),a}(t,s,r,o);return a.toJD(l.year,l.month,l.day)},fromJD:function(t){var e=a.fromJD(t),r=function(t,e,r,n){var i,a;if("object"==typeof t)i=t,a=e||{};else{if(!("number"==typeof t&&t>=1888&&t<=2111))throw new Error("Solar year outside range 1888-2111");if(!("number"==typeof e&&e>=1&&e<=12))throw new Error("Solar month outside range 1 - 12");if(!("number"==typeof r&&r>=1&&r<=31))throw new Error("Solar day outside range 1 - 31");i={year:t,month:e,day:r},a={}}var o=h[i.year-h[0]],s=i.year<<9|i.month<<5|i.day;a.year=s>=o?i.year:i.year-1,o=h[a.year-h[0]];var l,u=new Date(o>>9&4095,(o>>5&15)-1,31&o),c=new Date(i.year,i.month-1,i.day);l=Math.round((c-u)/864e5);var p,d=f[a.year-f[0]];for(p=0;p<13;p++){var v=d&1<<12-p?30:29;if(l>13;return!g||p=2&&n<=6},extraInfo:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return{century:o[Math.floor((i.year()-1)/100)+1]||""}},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return t=i.year()+(i.year()<0?1:0),e=i.month(),(r=i.day())+(e>1?16:0)+(e>2?32*(e-2):0)+400*(t-1)+this.jdEpoch-1},fromJD:function(t){t=Math.floor(t+.5)-Math.floor(this.jdEpoch)-1;var e=Math.floor(t/400)+1;t-=400*(e-1),t+=t>15?16:0;var r=Math.floor(t/32)+1,n=t-32*(r-1)+1;return this.newDate(e<=0?e-1:e,r,n)}});var o={20:"Fruitbat",21:"Anchovy"};n.calendars.discworld=a},37715:function(t,e,r){var n=r(63489),i=r(56131);function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}a.prototype=new n.baseCalendar,i(a.prototype,{name:"Ethiopian",jdEpoch:1724220.5,daysPerMonth:[30,30,30,30,30,30,30,30,30,30,30,30,5],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{"":{name:"Ethiopian",epochs:["BEE","EE"],monthNames:["Meskerem","Tikemet","Hidar","Tahesas","Tir","Yekatit","Megabit","Miazia","Genbot","Sene","Hamle","Nehase","Pagume"],monthNamesShort:["Mes","Tik","Hid","Tah","Tir","Yek","Meg","Mia","Gen","Sen","Ham","Neh","Pag"],dayNames:["Ehud","Segno","Maksegno","Irob","Hamus","Arb","Kidame"],dayNamesShort:["Ehu","Seg","Mak","Iro","Ham","Arb","Kid"],dayNamesMin:["Eh","Se","Ma","Ir","Ha","Ar","Ki"],digits:null,dateFormat:"dd/mm/yyyy",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return(t=e.year()+(e.year()<0?1:0))%4==3||t%4==-1},monthsInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear||n.regionalOptions[""].invalidYear),13},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),"d"),Math.floor((n.dayOfYear()-1)/7)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(13===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return(t=i.year())<0&&t++,i.day()+30*(i.month()-1)+365*(t-1)+Math.floor(t/4)+this.jdEpoch-1},fromJD:function(t){var e=Math.floor(t)+.5-this.jdEpoch,r=Math.floor((e-Math.floor((e+366)/1461))/365)+1;r<=0&&r--,e=Math.floor(t)+.5-this.newDate(r,1,1).toJD();var n=Math.floor(e/30)+1,i=e-30*(n-1)+1;return this.newDate(r,n,i)}}),n.calendars.ethiopian=a},99384:function(t,e,r){var n=r(63489),i=r(56131);function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}function o(t,e){return t-e*Math.floor(t/e)}a.prototype=new n.baseCalendar,i(a.prototype,{name:"Hebrew",jdEpoch:347995.5,daysPerMonth:[30,29,30,29,30,29,30,29,30,29,30,29,29],hasYearZero:!1,minMonth:1,firstMonth:7,minDay:1,regionalOptions:{"":{name:"Hebrew",epochs:["BAM","AM"],monthNames:["Nisan","Iyar","Sivan","Tammuz","Av","Elul","Tishrei","Cheshvan","Kislev","Tevet","Shevat","Adar","Adar II"],monthNamesShort:["Nis","Iya","Siv","Tam","Av","Elu","Tis","Che","Kis","Tev","She","Ada","Ad2"],dayNames:["Yom Rishon","Yom Sheni","Yom Shlishi","Yom Revi'i","Yom Chamishi","Yom Shishi","Yom Shabbat"],dayNamesShort:["Ris","She","Shl","Rev","Cha","Shi","Sha"],dayNamesMin:["Ri","She","Shl","Re","Ch","Shi","Sha"],digits:null,dateFormat:"dd/mm/yyyy",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return this._leapYear(e.year())},_leapYear:function(t){return o(7*(t=t<0?t+1:t)+1,19)<7},monthsInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),this._leapYear(t.year?t.year():t)?13:12},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),"d"),Math.floor((n.dayOfYear()-1)/7)+1},daysInYear:function(t){return t=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear).year(),this.toJD(-1===t?1:t+1,7,1)-this.toJD(t,7,1)},daysInMonth:function(t,e){return t.year&&(e=t.month(),t=t.year()),this._validate(t,e,this.minDay,n.local.invalidMonth),12===e&&this.leapYear(t)||8===e&&5===o(this.daysInYear(t),10)?30:9===e&&3===o(this.daysInYear(t),10)?29:this.daysPerMonth[e-1]},weekDay:function(t,e,r){return 6!==this.dayOfWeek(t,e,r)},extraInfo:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return{yearType:(this.leapYear(i)?"embolismic":"common")+" "+["deficient","regular","complete"][this.daysInYear(i)%10-3]}},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);t=i.year(),e=i.month(),r=i.day();var a=t<=0?t+1:t,o=this.jdEpoch+this._delay1(a)+this._delay2(a)+r+1;if(e<7){for(var s=7;s<=this.monthsInYear(t);s++)o+=this.daysInMonth(t,s);for(s=1;s=this.toJD(-1===e?1:e+1,7,1);)e++;for(var r=tthis.toJD(e,r,this.daysInMonth(e,r));)r++;var n=t-this.toJD(e,r,1)+1;return this.newDate(e,r,n)}}),n.calendars.hebrew=a},43805:function(t,e,r){var n=r(63489),i=r(56131);function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}a.prototype=new n.baseCalendar,i(a.prototype,{name:"Islamic",jdEpoch:1948439.5,daysPerMonth:[30,29,30,29,30,29,30,29,30,29,30,29],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{"":{name:"Islamic",epochs:["BH","AH"],monthNames:["Muharram","Safar","Rabi' al-awwal","Rabi' al-thani","Jumada al-awwal","Jumada al-thani","Rajab","Sha'aban","Ramadan","Shawwal","Dhu al-Qi'dah","Dhu al-Hijjah"],monthNamesShort:["Muh","Saf","Rab1","Rab2","Jum1","Jum2","Raj","Sha'","Ram","Shaw","DhuQ","DhuH"],dayNames:["Yawm al-ahad","Yawm al-ithnayn","Yawm ath-thulaathaa'","Yawm al-arbi'aa'","Yawm al-khamīs","Yawm al-jum'a","Yawm as-sabt"],dayNamesShort:["Aha","Ith","Thu","Arb","Kha","Jum","Sab"],dayNamesMin:["Ah","It","Th","Ar","Kh","Ju","Sa"],digits:null,dateFormat:"yyyy/mm/dd",firstDay:6,isRTL:!1}},leapYear:function(t){return(11*this._validate(t,this.minMonth,this.minDay,n.local.invalidYear).year()+14)%30<11},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),"d"),Math.floor((n.dayOfYear()-1)/7)+1},daysInYear:function(t){return this.leapYear(t)?355:354},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(12===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return 5!==this.dayOfWeek(t,e,r)},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return t=i.year(),e=i.month(),t=t<=0?t+1:t,(r=i.day())+Math.ceil(29.5*(e-1))+354*(t-1)+Math.floor((3+11*t)/30)+this.jdEpoch-1},fromJD:function(t){t=Math.floor(t)+.5;var e=Math.floor((30*(t-this.jdEpoch)+10646)/10631);e=e<=0?e-1:e;var r=Math.min(12,Math.ceil((t-29-this.toJD(e,1,1))/29.5)+1),n=t-this.toJD(e,r,1)+1;return this.newDate(e,r,n)}}),n.calendars.islamic=a},88874:function(t,e,r){var n=r(63489),i=r(56131);function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}a.prototype=new n.baseCalendar,i(a.prototype,{name:"Julian",jdEpoch:1721423.5,daysPerMonth:[31,28,31,30,31,30,31,31,30,31,30,31],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{"":{name:"Julian",epochs:["BC","AD"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],digits:null,dateFormat:"mm/dd/yyyy",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return(t=e.year()<0?e.year()+1:e.year())%4==0},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(4-(n.dayOfWeek()||7),"d"),Math.floor((n.dayOfYear()-1)/7)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(2===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return t=i.year(),e=i.month(),r=i.day(),t<0&&t++,e<=2&&(t--,e+=12),Math.floor(365.25*(t+4716))+Math.floor(30.6001*(e+1))+r-1524.5},fromJD:function(t){var e=Math.floor(t+.5)+1524,r=Math.floor((e-122.1)/365.25),n=Math.floor(365.25*r),i=Math.floor((e-n)/30.6001),a=i-Math.floor(i<14?1:13),o=r-Math.floor(a>2?4716:4715),s=e-n-Math.floor(30.6001*i);return o<=0&&o--,this.newDate(o,a,s)}}),n.calendars.julian=a},83290:function(t,e,r){var n=r(63489),i=r(56131);function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}function o(t,e){return t-e*Math.floor(t/e)}function s(t,e){return o(t-1,e)+1}a.prototype=new n.baseCalendar,i(a.prototype,{name:"Mayan",jdEpoch:584282.5,hasYearZero:!0,minMonth:0,firstMonth:0,minDay:0,regionalOptions:{"":{name:"Mayan",epochs:["",""],monthNames:["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17"],monthNamesShort:["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17"],dayNames:["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19"],dayNamesShort:["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19"],dayNamesMin:["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19"],digits:null,dateFormat:"YYYY.m.d",firstDay:0,isRTL:!1,haabMonths:["Pop","Uo","Zip","Zotz","Tzec","Xul","Yaxkin","Mol","Chen","Yax","Zac","Ceh","Mac","Kankin","Muan","Pax","Kayab","Cumku","Uayeb"],tzolkinMonths:["Imix","Ik","Akbal","Kan","Chicchan","Cimi","Manik","Lamat","Muluc","Oc","Chuen","Eb","Ben","Ix","Men","Cib","Caban","Etznab","Cauac","Ahau"]}},leapYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),!1},formatYear:function(t){t=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear).year();var e=Math.floor(t/400);return t%=400,t+=t<0?400:0,e+"."+Math.floor(t/20)+"."+t%20},forYear:function(t){if((t=t.split(".")).length<3)throw"Invalid Mayan year";for(var e=0,r=0;r19||r>0&&n<0)throw"Invalid Mayan year";e=20*e+n}return e},monthsInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),18},weekOfYear:function(t,e,r){return this._validate(t,e,r,n.local.invalidDate),0},daysInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),360},daysInMonth:function(t,e){return this._validate(t,e,this.minDay,n.local.invalidMonth),20},daysInWeek:function(){return 5},dayOfWeek:function(t,e,r){return this._validate(t,e,r,n.local.invalidDate).day()},weekDay:function(t,e,r){return this._validate(t,e,r,n.local.invalidDate),!0},extraInfo:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate).toJD(),a=this._toHaab(i),o=this._toTzolkin(i);return{haabMonthName:this.local.haabMonths[a[0]-1],haabMonth:a[0],haabDay:a[1],tzolkinDayName:this.local.tzolkinMonths[o[0]-1],tzolkinDay:o[0],tzolkinTrecena:o[1]}},_toHaab:function(t){var e=o(8+(t-=this.jdEpoch)+340,365);return[Math.floor(e/20)+1,o(e,20)]},_toTzolkin:function(t){return[s(20+(t-=this.jdEpoch),20),s(t+4,13)]},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return i.day()+20*i.month()+360*i.year()+this.jdEpoch},fromJD:function(t){t=Math.floor(t)+.5-this.jdEpoch;var e=Math.floor(t/360);t%=360,t+=t<0?360:0;var r=Math.floor(t/20),n=t%20;return this.newDate(e,r,n)}}),n.calendars.mayan=a},29108:function(t,e,r){var n=r(63489),i=r(56131);function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}a.prototype=new n.baseCalendar;var o=n.instance("gregorian");i(a.prototype,{name:"Nanakshahi",jdEpoch:2257673.5,daysPerMonth:[31,31,31,31,31,30,30,30,30,30,30,30],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{"":{name:"Nanakshahi",epochs:["BN","AN"],monthNames:["Chet","Vaisakh","Jeth","Harh","Sawan","Bhadon","Assu","Katak","Maghar","Poh","Magh","Phagun"],monthNamesShort:["Che","Vai","Jet","Har","Saw","Bha","Ass","Kat","Mgr","Poh","Mgh","Pha"],dayNames:["Somvaar","Mangalvar","Budhvaar","Veervaar","Shukarvaar","Sanicharvaar","Etvaar"],dayNamesShort:["Som","Mangal","Budh","Veer","Shukar","Sanichar","Et"],dayNamesMin:["So","Ma","Bu","Ve","Sh","Sa","Et"],digits:null,dateFormat:"dd-mm-yyyy",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear||n.regionalOptions[""].invalidYear);return o.leapYear(e.year()+(e.year()<1?1:0)+1469)},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(1-(n.dayOfWeek()||7),"d"),Math.floor((n.dayOfYear()-1)/7)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(12===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidMonth);(t=i.year())<0&&t++;for(var a=i.day(),s=1;s=this.toJD(e+1,1,1);)e++;for(var r=t-Math.floor(this.toJD(e,1,1)+.5)+1,n=1;r>this.daysInMonth(e,n);)r-=this.daysInMonth(e,n),n++;return this.newDate(e,n,r)}}),n.calendars.nanakshahi=a},55422:function(t,e,r){var n=r(63489),i=r(56131);function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}a.prototype=new n.baseCalendar,i(a.prototype,{name:"Nepali",jdEpoch:1700709.5,daysPerMonth:[31,31,32,32,31,30,30,29,30,29,30,30],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,daysPerYear:365,regionalOptions:{"":{name:"Nepali",epochs:["BBS","ABS"],monthNames:["Baisakh","Jestha","Ashadh","Shrawan","Bhadra","Ashwin","Kartik","Mangsir","Paush","Mangh","Falgun","Chaitra"],monthNamesShort:["Bai","Je","As","Shra","Bha","Ash","Kar","Mang","Pau","Ma","Fal","Chai"],dayNames:["Aaitabaar","Sombaar","Manglbaar","Budhabaar","Bihibaar","Shukrabaar","Shanibaar"],dayNamesShort:["Aaita","Som","Mangl","Budha","Bihi","Shukra","Shani"],dayNamesMin:["Aai","So","Man","Bu","Bi","Shu","Sha"],digits:null,dateFormat:"dd/mm/yyyy",firstDay:1,isRTL:!1}},leapYear:function(t){return this.daysInYear(t)!==this.daysPerYear},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),"d"),Math.floor((n.dayOfYear()-1)/7)+1},daysInYear:function(t){if(t=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear).year(),void 0===this.NEPALI_CALENDAR_DATA[t])return this.daysPerYear;for(var e=0,r=this.minMonth;r<=12;r++)e+=this.NEPALI_CALENDAR_DATA[t][r];return e},daysInMonth:function(t,e){return t.year&&(e=t.month(),t=t.year()),this._validate(t,e,this.minDay,n.local.invalidMonth),void 0===this.NEPALI_CALENDAR_DATA[t]?this.daysPerMonth[e-1]:this.NEPALI_CALENDAR_DATA[t][e]},weekDay:function(t,e,r){return 6!==this.dayOfWeek(t,e,r)},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);t=i.year(),e=i.month(),r=i.day();var a=n.instance(),o=0,s=e,l=t;this._createMissingCalendarData(t);var u=t-(s>9||9===s&&r>=this.NEPALI_CALENDAR_DATA[l][0]?56:57);for(9!==e&&(o=r,s--);9!==s;)s<=0&&(s=12,l--),o+=this.NEPALI_CALENDAR_DATA[l][s],s--;return 9===e?(o+=r-this.NEPALI_CALENDAR_DATA[l][0])<0&&(o+=a.daysInYear(u)):o+=this.NEPALI_CALENDAR_DATA[l][9]-this.NEPALI_CALENDAR_DATA[l][0],a.newDate(u,1,1).add(o,"d").toJD()},fromJD:function(t){var e=n.instance().fromJD(t),r=e.year(),i=e.dayOfYear(),a=r+56;this._createMissingCalendarData(a);for(var o=9,s=this.NEPALI_CALENDAR_DATA[a][0],l=this.NEPALI_CALENDAR_DATA[a][o]-s+1;i>l;)++o>12&&(o=1,a++),l+=this.NEPALI_CALENDAR_DATA[a][o];var u=this.NEPALI_CALENDAR_DATA[a][o]-(l-i);return this.newDate(a,o,u)},_createMissingCalendarData:function(t){var e=this.daysPerMonth.slice(0);e.unshift(17);for(var r=t-1;r0?474:473))%2820+474+38)%2816<682},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-(n.dayOfWeek()+1)%7,"d"),Math.floor((n.dayOfYear()-1)/7)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(12===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return 5!==this.dayOfWeek(t,e,r)},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);t=i.year(),e=i.month(),r=i.day();var a=t-(t>=0?474:473),s=474+o(a,2820);return r+(e<=7?31*(e-1):30*(e-1)+6)+Math.floor((682*s-110)/2816)+365*(s-1)+1029983*Math.floor(a/2820)+this.jdEpoch-1},fromJD:function(t){var e=(t=Math.floor(t)+.5)-this.toJD(475,1,1),r=Math.floor(e/1029983),n=o(e,1029983),i=2820;if(1029982!==n){var a=Math.floor(n/366),s=o(n,366);i=Math.floor((2134*a+2816*s+2815)/1028522)+a+1}var l=i+2820*r+474;l=l<=0?l-1:l;var u=t-this.toJD(l,1,1)+1,c=u<=186?Math.ceil(u/31):Math.ceil((u-6)/30),f=t-this.toJD(l,c,1)+1;return this.newDate(l,c,f)}}),n.calendars.persian=a,n.calendars.jalali=a},31320:function(t,e,r){var n=r(63489),i=r(56131),a=n.instance();function o(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}o.prototype=new n.baseCalendar,i(o.prototype,{name:"Taiwan",jdEpoch:2419402.5,yearsOffset:1911,daysPerMonth:[31,28,31,30,31,30,31,31,30,31,30,31],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{"":{name:"Taiwan",epochs:["BROC","ROC"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],digits:null,dateFormat:"yyyy/mm/dd",firstDay:1,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return t=this._t2gYear(e.year()),a.leapYear(t)},weekOfYear:function(t,e,r){var i=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return t=this._t2gYear(i.year()),a.weekOfYear(t,i.month(),i.day())},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(2===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return t=this._t2gYear(i.year()),a.toJD(t,i.month(),i.day())},fromJD:function(t){var e=a.fromJD(t),r=this._g2tYear(e.year());return this.newDate(r,e.month(),e.day())},_t2gYear:function(t){return t+this.yearsOffset+(t>=-this.yearsOffset&&t<=-1?1:0)},_g2tYear:function(t){return t-this.yearsOffset-(t>=1&&t<=this.yearsOffset?1:0)}}),n.calendars.taiwan=o},51367:function(t,e,r){var n=r(63489),i=r(56131),a=n.instance();function o(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}o.prototype=new n.baseCalendar,i(o.prototype,{name:"Thai",jdEpoch:1523098.5,yearsOffset:543,daysPerMonth:[31,28,31,30,31,30,31,31,30,31,30,31],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{"":{name:"Thai",epochs:["BBE","BE"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],digits:null,dateFormat:"dd/mm/yyyy",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return t=this._t2gYear(e.year()),a.leapYear(t)},weekOfYear:function(t,e,r){var i=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return t=this._t2gYear(i.year()),a.weekOfYear(t,i.month(),i.day())},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(2===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return t=this._t2gYear(i.year()),a.toJD(t,i.month(),i.day())},fromJD:function(t){var e=a.fromJD(t),r=this._g2tYear(e.year());return this.newDate(r,e.month(),e.day())},_t2gYear:function(t){return t-this.yearsOffset-(t>=1&&t<=this.yearsOffset?1:0)},_g2tYear:function(t){return t+this.yearsOffset+(t>=-this.yearsOffset&&t<=-1?1:0)}}),n.calendars.thai=o},21457:function(t,e,r){var n=r(63489),i=r(56131);function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}a.prototype=new n.baseCalendar,i(a.prototype,{name:"UmmAlQura",hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{"":{name:"Umm al-Qura",epochs:["BH","AH"],monthNames:["Al-Muharram","Safar","Rabi' al-awwal","Rabi' Al-Thani","Jumada Al-Awwal","Jumada Al-Thani","Rajab","Sha'aban","Ramadan","Shawwal","Dhu al-Qi'dah","Dhu al-Hijjah"],monthNamesShort:["Muh","Saf","Rab1","Rab2","Jum1","Jum2","Raj","Sha'","Ram","Shaw","DhuQ","DhuH"],dayNames:["Yawm al-Ahad","Yawm al-Ithnain","Yawm al-Thalāthā’","Yawm al-Arba‘ā’","Yawm al-Khamīs","Yawm al-Jum‘a","Yawm al-Sabt"],dayNamesMin:["Ah","Ith","Th","Ar","Kh","Ju","Sa"],digits:null,dateFormat:"yyyy/mm/dd",firstDay:6,isRTL:!0}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return 355===this.daysInYear(e.year())},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),"d"),Math.floor((n.dayOfYear()-1)/7)+1},daysInYear:function(t){for(var e=0,r=1;r<=12;r++)e+=this.daysInMonth(t,r);return e},daysInMonth:function(t,e){for(var r=this._validate(t,e,this.minDay,n.local.invalidMonth).toJD()-24e5+.5,i=0,a=0;ar)return o[i]-o[i-1];i++}return 30},weekDay:function(t,e,r){return 5!==this.dayOfWeek(t,e,r)},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate),a=12*(i.year()-1)+i.month()-15292;return i.day()+o[a-1]-1+24e5-.5},fromJD:function(t){for(var e=t-24e5+.5,r=0,n=0;ne);n++)r++;var i=r+15292,a=Math.floor((i-1)/12),s=a+1,l=i-12*a,u=e-o[r-1]+1;return this.newDate(s,l,u)},isValid:function(t,e,r){var i=n.baseCalendar.prototype.isValid.apply(this,arguments);return i&&(i=(t=null!=t.year?t.year:t)>=1276&&t<=1500),i},_validate:function(t,e,r,i){var a=n.baseCalendar.prototype._validate.apply(this,arguments);if(a.year<1276||a.year>1500)throw i.replace(/\{0\}/,this.local.name);return a}}),n.calendars.ummalqura=a;var o=[20,50,79,109,138,168,197,227,256,286,315,345,374,404,433,463,492,522,551,581,611,641,670,700,729,759,788,818,847,877,906,936,965,995,1024,1054,1083,1113,1142,1172,1201,1231,1260,1290,1320,1350,1379,1409,1438,1468,1497,1527,1556,1586,1615,1645,1674,1704,1733,1763,1792,1822,1851,1881,1910,1940,1969,1999,2028,2058,2087,2117,2146,2176,2205,2235,2264,2294,2323,2353,2383,2413,2442,2472,2501,2531,2560,2590,2619,2649,2678,2708,2737,2767,2796,2826,2855,2885,2914,2944,2973,3003,3032,3062,3091,3121,3150,3180,3209,3239,3268,3298,3327,3357,3386,3416,3446,3476,3505,3535,3564,3594,3623,3653,3682,3712,3741,3771,3800,3830,3859,3889,3918,3948,3977,4007,4036,4066,4095,4125,4155,4185,4214,4244,4273,4303,4332,4362,4391,4421,4450,4480,4509,4539,4568,4598,4627,4657,4686,4716,4745,4775,4804,4834,4863,4893,4922,4952,4981,5011,5040,5070,5099,5129,5158,5188,5218,5248,5277,5307,5336,5366,5395,5425,5454,5484,5513,5543,5572,5602,5631,5661,5690,5720,5749,5779,5808,5838,5867,5897,5926,5956,5985,6015,6044,6074,6103,6133,6162,6192,6221,6251,6281,6311,6340,6370,6399,6429,6458,6488,6517,6547,6576,6606,6635,6665,6694,6724,6753,6783,6812,6842,6871,6901,6930,6960,6989,7019,7048,7078,7107,7137,7166,7196,7225,7255,7284,7314,7344,7374,7403,7433,7462,7492,7521,7551,7580,7610,7639,7669,7698,7728,7757,7787,7816,7846,7875,7905,7934,7964,7993,8023,8053,8083,8112,8142,8171,8201,8230,8260,8289,8319,8348,8378,8407,8437,8466,8496,8525,8555,8584,8614,8643,8673,8702,8732,8761,8791,8821,8850,8880,8909,8938,8968,8997,9027,9056,9086,9115,9145,9175,9205,9234,9264,9293,9322,9352,9381,9410,9440,9470,9499,9529,9559,9589,9618,9648,9677,9706,9736,9765,9794,9824,9853,9883,9913,9943,9972,10002,10032,10061,10090,10120,10149,10178,10208,10237,10267,10297,10326,10356,10386,10415,10445,10474,10504,10533,10562,10592,10621,10651,10680,10710,10740,10770,10799,10829,10858,10888,10917,10947,10976,11005,11035,11064,11094,11124,11153,11183,11213,11242,11272,11301,11331,11360,11389,11419,11448,11478,11507,11537,11567,11596,11626,11655,11685,11715,11744,11774,11803,11832,11862,11891,11921,11950,11980,12010,12039,12069,12099,12128,12158,12187,12216,12246,12275,12304,12334,12364,12393,12423,12453,12483,12512,12542,12571,12600,12630,12659,12688,12718,12747,12777,12807,12837,12866,12896,12926,12955,12984,13014,13043,13072,13102,13131,13161,13191,13220,13250,13280,13310,13339,13368,13398,13427,13456,13486,13515,13545,13574,13604,13634,13664,13693,13723,13752,13782,13811,13840,13870,13899,13929,13958,13988,14018,14047,14077,14107,14136,14166,14195,14224,14254,14283,14313,14342,14372,14401,14431,14461,14490,14520,14550,14579,14609,14638,14667,14697,14726,14756,14785,14815,14844,14874,14904,14933,14963,14993,15021,15051,15081,15110,15140,15169,15199,15228,15258,15287,15317,15347,15377,15406,15436,15465,15494,15524,15553,15582,15612,15641,15671,15701,15731,15760,15790,15820,15849,15878,15908,15937,15966,15996,16025,16055,16085,16114,16144,16174,16204,16233,16262,16292,16321,16350,16380,16409,16439,16468,16498,16528,16558,16587,16617,16646,16676,16705,16734,16764,16793,16823,16852,16882,16912,16941,16971,17001,17030,17060,17089,17118,17148,17177,17207,17236,17266,17295,17325,17355,17384,17414,17444,17473,17502,17532,17561,17591,17620,17650,17679,17709,17738,17768,17798,17827,17857,17886,17916,17945,17975,18004,18034,18063,18093,18122,18152,18181,18211,18241,18270,18300,18330,18359,18388,18418,18447,18476,18506,18535,18565,18595,18625,18654,18684,18714,18743,18772,18802,18831,18860,18890,18919,18949,18979,19008,19038,19068,19098,19127,19156,19186,19215,19244,19274,19303,19333,19362,19392,19422,19452,19481,19511,19540,19570,19599,19628,19658,19687,19717,19746,19776,19806,19836,19865,19895,19924,19954,19983,20012,20042,20071,20101,20130,20160,20190,20219,20249,20279,20308,20338,20367,20396,20426,20455,20485,20514,20544,20573,20603,20633,20662,20692,20721,20751,20780,20810,20839,20869,20898,20928,20957,20987,21016,21046,21076,21105,21135,21164,21194,21223,21253,21282,21312,21341,21371,21400,21430,21459,21489,21519,21548,21578,21607,21637,21666,21696,21725,21754,21784,21813,21843,21873,21902,21932,21962,21991,22021,22050,22080,22109,22138,22168,22197,22227,22256,22286,22316,22346,22375,22405,22434,22464,22493,22522,22552,22581,22611,22640,22670,22700,22730,22759,22789,22818,22848,22877,22906,22936,22965,22994,23024,23054,23083,23113,23143,23173,23202,23232,23261,23290,23320,23349,23379,23408,23438,23467,23497,23527,23556,23586,23616,23645,23674,23704,23733,23763,23792,23822,23851,23881,23910,23940,23970,23999,24029,24058,24088,24117,24147,24176,24206,24235,24265,24294,24324,24353,24383,24413,24442,24472,24501,24531,24560,24590,24619,24648,24678,24707,24737,24767,24796,24826,24856,24885,24915,24944,24974,25003,25032,25062,25091,25121,25150,25180,25210,25240,25269,25299,25328,25358,25387,25416,25446,25475,25505,25534,25564,25594,25624,25653,25683,25712,25742,25771,25800,25830,25859,25888,25918,25948,25977,26007,26037,26067,26096,26126,26155,26184,26214,26243,26272,26302,26332,26361,26391,26421,26451,26480,26510,26539,26568,26598,26627,26656,26686,26715,26745,26775,26805,26834,26864,26893,26923,26952,26982,27011,27041,27070,27099,27129,27159,27188,27218,27248,27277,27307,27336,27366,27395,27425,27454,27484,27513,27542,27572,27602,27631,27661,27691,27720,27750,27779,27809,27838,27868,27897,27926,27956,27985,28015,28045,28074,28104,28134,28163,28193,28222,28252,28281,28310,28340,28369,28399,28428,28458,28488,28517,28547,28577,28607,28636,28665,28695,28724,28754,28783,28813,28843,28872,28901,28931,28960,28990,29019,29049,29078,29108,29137,29167,29196,29226,29255,29285,29315,29345,29375,29404,29434,29463,29492,29522,29551,29580,29610,29640,29669,29699,29729,29759,29788,29818,29847,29876,29906,29935,29964,29994,30023,30053,30082,30112,30141,30171,30200,30230,30259,30289,30318,30348,30378,30408,30437,30467,30496,30526,30555,30585,30614,30644,30673,30703,30732,30762,30791,30821,30850,30880,30909,30939,30968,30998,31027,31057,31086,31116,31145,31175,31204,31234,31263,31293,31322,31352,31381,31411,31441,31471,31500,31530,31559,31589,31618,31648,31676,31706,31736,31766,31795,31825,31854,31884,31913,31943,31972,32002,32031,32061,32090,32120,32150,32180,32209,32239,32268,32298,32327,32357,32386,32416,32445,32475,32504,32534,32563,32593,32622,32652,32681,32711,32740,32770,32799,32829,32858,32888,32917,32947,32976,33006,33035,33065,33094,33124,33153,33183,33213,33243,33272,33302,33331,33361,33390,33420,33450,33479,33509,33539,33568,33598,33627,33657,33686,33716,33745,33775,33804,33834,33863,33893,33922,33952,33981,34011,34040,34069,34099,34128,34158,34187,34217,34247,34277,34306,34336,34365,34395,34424,34454,34483,34512,34542,34571,34601,34631,34660,34690,34719,34749,34778,34808,34837,34867,34896,34926,34955,34985,35015,35044,35074,35103,35133,35162,35192,35222,35251,35280,35310,35340,35370,35399,35429,35458,35488,35517,35547,35576,35605,35635,35665,35694,35723,35753,35782,35811,35841,35871,35901,35930,35960,35989,36019,36048,36078,36107,36136,36166,36195,36225,36254,36284,36314,36343,36373,36403,36433,36462,36492,36521,36551,36580,36610,36639,36669,36698,36728,36757,36786,36816,36845,36875,36904,36934,36963,36993,37022,37052,37081,37111,37141,37170,37200,37229,37259,37288,37318,37347,37377,37406,37436,37465,37495,37524,37554,37584,37613,37643,37672,37701,37731,37760,37790,37819,37849,37878,37908,37938,37967,37997,38027,38056,38085,38115,38144,38174,38203,38233,38262,38292,38322,38351,38381,38410,38440,38469,38499,38528,38558,38587,38617,38646,38676,38705,38735,38764,38794,38823,38853,38882,38912,38941,38971,39001,39030,39059,39089,39118,39148,39178,39208,39237,39267,39297,39326,39355,39385,39414,39444,39473,39503,39532,39562,39592,39621,39650,39680,39709,39739,39768,39798,39827,39857,39886,39916,39946,39975,40005,40035,40064,40094,40123,40153,40182,40212,40241,40271,40300,40330,40359,40389,40418,40448,40477,40507,40536,40566,40595,40625,40655,40685,40714,40744,40773,40803,40832,40862,40892,40921,40951,40980,41009,41039,41068,41098,41127,41157,41186,41216,41245,41275,41304,41334,41364,41393,41422,41452,41481,41511,41540,41570,41599,41629,41658,41688,41718,41748,41777,41807,41836,41865,41894,41924,41953,41983,42012,42042,42072,42102,42131,42161,42190,42220,42249,42279,42308,42337,42367,42397,42426,42456,42485,42515,42545,42574,42604,42633,42662,42692,42721,42751,42780,42810,42839,42869,42899,42929,42958,42988,43017,43046,43076,43105,43135,43164,43194,43223,43253,43283,43312,43342,43371,43401,43430,43460,43489,43519,43548,43578,43607,43637,43666,43696,43726,43755,43785,43814,43844,43873,43903,43932,43962,43991,44021,44050,44080,44109,44139,44169,44198,44228,44258,44287,44317,44346,44375,44405,44434,44464,44493,44523,44553,44582,44612,44641,44671,44700,44730,44759,44788,44818,44847,44877,44906,44936,44966,44996,45025,45055,45084,45114,45143,45172,45202,45231,45261,45290,45320,45350,45380,45409,45439,45468,45498,45527,45556,45586,45615,45644,45674,45704,45733,45763,45793,45823,45852,45882,45911,45940,45970,45999,46028,46058,46088,46117,46147,46177,46206,46236,46265,46295,46324,46354,46383,46413,46442,46472,46501,46531,46560,46590,46620,46649,46679,46708,46738,46767,46797,46826,46856,46885,46915,46944,46974,47003,47033,47063,47092,47122,47151,47181,47210,47240,47269,47298,47328,47357,47387,47417,47446,47476,47506,47535,47565,47594,47624,47653,47682,47712,47741,47771,47800,47830,47860,47890,47919,47949,47978,48008,48037,48066,48096,48125,48155,48184,48214,48244,48273,48303,48333,48362,48392,48421,48450,48480,48509,48538,48568,48598,48627,48657,48687,48717,48746,48776,48805,48834,48864,48893,48922,48952,48982,49011,49041,49071,49100,49130,49160,49189,49218,49248,49277,49306,49336,49365,49395,49425,49455,49484,49514,49543,49573,49602,49632,49661,49690,49720,49749,49779,49809,49838,49868,49898,49927,49957,49986,50016,50045,50075,50104,50133,50163,50192,50222,50252,50281,50311,50340,50370,50400,50429,50459,50488,50518,50547,50576,50606,50635,50665,50694,50724,50754,50784,50813,50843,50872,50902,50931,50960,50990,51019,51049,51078,51108,51138,51167,51197,51227,51256,51286,51315,51345,51374,51403,51433,51462,51492,51522,51552,51582,51611,51641,51670,51699,51729,51758,51787,51816,51846,51876,51906,51936,51965,51995,52025,52054,52083,52113,52142,52171,52200,52230,52260,52290,52319,52349,52379,52408,52438,52467,52497,52526,52555,52585,52614,52644,52673,52703,52733,52762,52792,52822,52851,52881,52910,52939,52969,52998,53028,53057,53087,53116,53146,53176,53205,53235,53264,53294,53324,53353,53383,53412,53441,53471,53500,53530,53559,53589,53619,53648,53678,53708,53737,53767,53796,53825,53855,53884,53913,53943,53973,54003,54032,54062,54092,54121,54151,54180,54209,54239,54268,54297,54327,54357,54387,54416,54446,54476,54505,54535,54564,54593,54623,54652,54681,54711,54741,54770,54800,54830,54859,54889,54919,54948,54977,55007,55036,55066,55095,55125,55154,55184,55213,55243,55273,55302,55332,55361,55391,55420,55450,55479,55508,55538,55567,55597,55627,55657,55686,55716,55745,55775,55804,55834,55863,55892,55922,55951,55981,56011,56040,56070,56100,56129,56159,56188,56218,56247,56276,56306,56335,56365,56394,56424,56454,56483,56513,56543,56572,56601,56631,56660,56690,56719,56749,56778,56808,56837,56867,56897,56926,56956,56985,57015,57044,57074,57103,57133,57162,57192,57221,57251,57280,57310,57340,57369,57399,57429,57458,57487,57517,57546,57576,57605,57634,57664,57694,57723,57753,57783,57813,57842,57871,57901,57930,57959,57989,58018,58048,58077,58107,58137,58167,58196,58226,58255,58285,58314,58343,58373,58402,58432,58461,58491,58521,58551,58580,58610,58639,58669,58698,58727,58757,58786,58816,58845,58875,58905,58934,58964,58994,59023,59053,59082,59111,59141,59170,59200,59229,59259,59288,59318,59348,59377,59407,59436,59466,59495,59525,59554,59584,59613,59643,59672,59702,59731,59761,59791,59820,59850,59879,59909,59939,59968,59997,60027,60056,60086,60115,60145,60174,60204,60234,60264,60293,60323,60352,60381,60411,60440,60469,60499,60528,60558,60588,60618,60648,60677,60707,60736,60765,60795,60824,60853,60883,60912,60942,60972,61002,61031,61061,61090,61120,61149,61179,61208,61237,61267,61296,61326,61356,61385,61415,61445,61474,61504,61533,61563,61592,61621,61651,61680,61710,61739,61769,61799,61828,61858,61888,61917,61947,61976,62006,62035,62064,62094,62123,62153,62182,62212,62242,62271,62301,62331,62360,62390,62419,62448,62478,62507,62537,62566,62596,62625,62655,62685,62715,62744,62774,62803,62832,62862,62891,62921,62950,62980,63009,63039,63069,63099,63128,63157,63187,63216,63246,63275,63305,63334,63363,63393,63423,63453,63482,63512,63541,63571,63600,63630,63659,63689,63718,63747,63777,63807,63836,63866,63895,63925,63955,63984,64014,64043,64073,64102,64131,64161,64190,64220,64249,64279,64309,64339,64368,64398,64427,64457,64486,64515,64545,64574,64603,64633,64663,64692,64722,64752,64782,64811,64841,64870,64899,64929,64958,64987,65017,65047,65076,65106,65136,65166,65195,65225,65254,65283,65313,65342,65371,65401,65431,65460,65490,65520,65549,65579,65608,65638,65667,65697,65726,65755,65785,65815,65844,65874,65903,65933,65963,65992,66022,66051,66081,66110,66140,66169,66199,66228,66258,66287,66317,66346,66376,66405,66435,66465,66494,66524,66553,66583,66612,66641,66671,66700,66730,66760,66789,66819,66849,66878,66908,66937,66967,66996,67025,67055,67084,67114,67143,67173,67203,67233,67262,67292,67321,67351,67380,67409,67439,67468,67497,67527,67557,67587,67617,67646,67676,67705,67735,67764,67793,67823,67852,67882,67911,67941,67971,68e3,68030,68060,68089,68119,68148,68177,68207,68236,68266,68295,68325,68354,68384,68414,68443,68473,68502,68532,68561,68591,68620,68650,68679,68708,68738,68768,68797,68827,68857,68886,68916,68946,68975,69004,69034,69063,69092,69122,69152,69181,69211,69240,69270,69300,69330,69359,69388,69418,69447,69476,69506,69535,69565,69595,69624,69654,69684,69713,69743,69772,69802,69831,69861,69890,69919,69949,69978,70008,70038,70067,70097,70126,70156,70186,70215,70245,70274,70303,70333,70362,70392,70421,70451,70481,70510,70540,70570,70599,70629,70658,70687,70717,70746,70776,70805,70835,70864,70894,70924,70954,70983,71013,71042,71071,71101,71130,71159,71189,71218,71248,71278,71308,71337,71367,71397,71426,71455,71485,71514,71543,71573,71602,71632,71662,71691,71721,71751,71781,71810,71839,71869,71898,71927,71957,71986,72016,72046,72075,72105,72135,72164,72194,72223,72253,72282,72311,72341,72370,72400,72429,72459,72489,72518,72548,72577,72607,72637,72666,72695,72725,72754,72784,72813,72843,72872,72902,72931,72961,72991,73020,73050,73080,73109,73139,73168,73197,73227,73256,73286,73315,73345,73375,73404,73434,73464,73493,73523,73552,73581,73611,73640,73669,73699,73729,73758,73788,73818,73848,73877,73907,73936,73965,73995,74024,74053,74083,74113,74142,74172,74202,74231,74261,74291,74320,74349,74379,74408,74437,74467,74497,74526,74556,74586,74615,74645,74675,74704,74733,74763,74792,74822,74851,74881,74910,74940,74969,74999,75029,75058,75088,75117,75147,75176,75206,75235,75264,75294,75323,75353,75383,75412,75442,75472,75501,75531,75560,75590,75619,75648,75678,75707,75737,75766,75796,75826,75856,75885,75915,75944,75974,76003,76032,76062,76091,76121,76150,76180,76210,76239,76269,76299,76328,76358,76387,76416,76446,76475,76505,76534,76564,76593,76623,76653,76682,76712,76741,76771,76801,76830,76859,76889,76918,76948,76977,77007,77036,77066,77096,77125,77155,77185,77214,77243,77273,77302,77332,77361,77390,77420,77450,77479,77509,77539,77569,77598,77627,77657,77686,77715,77745,77774,77804,77833,77863,77893,77923,77952,77982,78011,78041,78070,78099,78129,78158,78188,78217,78247,78277,78307,78336,78366,78395,78425,78454,78483,78513,78542,78572,78601,78631,78661,78690,78720,78750,78779,78808,78838,78867,78897,78926,78956,78985,79015,79044,79074,79104,79133,79163,79192,79222,79251,79281,79310,79340,79369,79399,79428,79458,79487,79517,79546,79576,79606,79635,79665,79695,79724,79753,79783,79812,79841,79871,79900,79930,79960,79990]},63489:function(t,e,r){var n=r(56131);function i(){this.regionalOptions=[],this.regionalOptions[""]={invalidCalendar:"Calendar {0} not found",invalidDate:"Invalid {0} date",invalidMonth:"Invalid {0} month",invalidYear:"Invalid {0} year",differentCalendars:"Cannot mix {0} and {1} dates"},this.local=this.regionalOptions[""],this.calendars={},this._localCals={}}function a(t,e,r,n){if(this._calendar=t,this._year=e,this._month=r,this._day=n,0===this._calendar._validateLevel&&!this._calendar.isValid(this._year,this._month,this._day))throw(u.local.invalidDate||u.regionalOptions[""].invalidDate).replace(/\{0\}/,this._calendar.local.name)}function o(t,e){return"000000".substring(0,e-(t=""+t).length)+t}function s(){this.shortYearCutoff="+10"}function l(t){this.local=this.regionalOptions[t]||this.regionalOptions[""]}n(i.prototype,{instance:function(t,e){t=(t||"gregorian").toLowerCase(),e=e||"";var r=this._localCals[t+"-"+e];if(!r&&this.calendars[t]&&(r=new this.calendars[t](e),this._localCals[t+"-"+e]=r),!r)throw(this.local.invalidCalendar||this.regionalOptions[""].invalidCalendar).replace(/\{0\}/,t);return r},newDate:function(t,e,r,n,i){return(n=(null!=t&&t.year?t.calendar():"string"==typeof n?this.instance(n,i):n)||this.instance()).newDate(t,e,r)},substituteDigits:function(t){return function(e){return(e+"").replace(/[0-9]/g,(function(e){return t[e]}))}},substituteChineseDigits:function(t,e){return function(r){for(var n="",i=0;r>0;){var a=r%10;n=(0===a?"":t[a]+e[i])+n,i++,r=Math.floor(r/10)}return 0===n.indexOf(t[1]+e[1])&&(n=n.substr(1)),n||t[0]}}}),n(a.prototype,{newDate:function(t,e,r){return this._calendar.newDate(null==t?this:t,e,r)},year:function(t){return 0===arguments.length?this._year:this.set(t,"y")},month:function(t){return 0===arguments.length?this._month:this.set(t,"m")},day:function(t){return 0===arguments.length?this._day:this.set(t,"d")},date:function(t,e,r){if(!this._calendar.isValid(t,e,r))throw(u.local.invalidDate||u.regionalOptions[""].invalidDate).replace(/\{0\}/,this._calendar.local.name);return this._year=t,this._month=e,this._day=r,this},leapYear:function(){return this._calendar.leapYear(this)},epoch:function(){return this._calendar.epoch(this)},formatYear:function(){return this._calendar.formatYear(this)},monthOfYear:function(){return this._calendar.monthOfYear(this)},weekOfYear:function(){return this._calendar.weekOfYear(this)},daysInYear:function(){return this._calendar.daysInYear(this)},dayOfYear:function(){return this._calendar.dayOfYear(this)},daysInMonth:function(){return this._calendar.daysInMonth(this)},dayOfWeek:function(){return this._calendar.dayOfWeek(this)},weekDay:function(){return this._calendar.weekDay(this)},extraInfo:function(){return this._calendar.extraInfo(this)},add:function(t,e){return this._calendar.add(this,t,e)},set:function(t,e){return this._calendar.set(this,t,e)},compareTo:function(t){if(this._calendar.name!==t._calendar.name)throw(u.local.differentCalendars||u.regionalOptions[""].differentCalendars).replace(/\{0\}/,this._calendar.local.name).replace(/\{1\}/,t._calendar.local.name);var e=this._year!==t._year?this._year-t._year:this._month!==t._month?this.monthOfYear()-t.monthOfYear():this._day-t._day;return 0===e?0:e<0?-1:1},calendar:function(){return this._calendar},toJD:function(){return this._calendar.toJD(this)},fromJD:function(t){return this._calendar.fromJD(t)},toJSDate:function(){return this._calendar.toJSDate(this)},fromJSDate:function(t){return this._calendar.fromJSDate(t)},toString:function(){return(this.year()<0?"-":"")+o(Math.abs(this.year()),4)+"-"+o(this.month(),2)+"-"+o(this.day(),2)}}),n(s.prototype,{_validateLevel:0,newDate:function(t,e,r){return null==t?this.today():(t.year&&(this._validate(t,e,r,u.local.invalidDate||u.regionalOptions[""].invalidDate),r=t.day(),e=t.month(),t=t.year()),new a(this,t,e,r))},today:function(){return this.fromJSDate(new Date)},epoch:function(t){return this._validate(t,this.minMonth,this.minDay,u.local.invalidYear||u.regionalOptions[""].invalidYear).year()<0?this.local.epochs[0]:this.local.epochs[1]},formatYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,u.local.invalidYear||u.regionalOptions[""].invalidYear);return(e.year()<0?"-":"")+o(Math.abs(e.year()),4)},monthsInYear:function(t){return this._validate(t,this.minMonth,this.minDay,u.local.invalidYear||u.regionalOptions[""].invalidYear),12},monthOfYear:function(t,e){var r=this._validate(t,e,this.minDay,u.local.invalidMonth||u.regionalOptions[""].invalidMonth);return(r.month()+this.monthsInYear(r)-this.firstMonth)%this.monthsInYear(r)+this.minMonth},fromMonthOfYear:function(t,e){var r=(e+this.firstMonth-2*this.minMonth)%this.monthsInYear(t)+this.minMonth;return this._validate(t,r,this.minDay,u.local.invalidMonth||u.regionalOptions[""].invalidMonth),r},daysInYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,u.local.invalidYear||u.regionalOptions[""].invalidYear);return this.leapYear(e)?366:365},dayOfYear:function(t,e,r){var n=this._validate(t,e,r,u.local.invalidDate||u.regionalOptions[""].invalidDate);return n.toJD()-this.newDate(n.year(),this.fromMonthOfYear(n.year(),this.minMonth),this.minDay).toJD()+1},daysInWeek:function(){return 7},dayOfWeek:function(t,e,r){var n=this._validate(t,e,r,u.local.invalidDate||u.regionalOptions[""].invalidDate);return(Math.floor(this.toJD(n))+2)%this.daysInWeek()},extraInfo:function(t,e,r){return this._validate(t,e,r,u.local.invalidDate||u.regionalOptions[""].invalidDate),{}},add:function(t,e,r){return this._validate(t,this.minMonth,this.minDay,u.local.invalidDate||u.regionalOptions[""].invalidDate),this._correctAdd(t,this._add(t,e,r),e,r)},_add:function(t,e,r){if(this._validateLevel++,"d"===r||"w"===r){var n=t.toJD()+e*("w"===r?this.daysInWeek():1),i=t.calendar().fromJD(n);return this._validateLevel--,[i.year(),i.month(),i.day()]}try{var a=t.year()+("y"===r?e:0),o=t.monthOfYear()+("m"===r?e:0);i=t.day(),"y"===r?(t.month()!==this.fromMonthOfYear(a,o)&&(o=this.newDate(a,t.month(),this.minDay).monthOfYear()),o=Math.min(o,this.monthsInYear(a)),i=Math.min(i,this.daysInMonth(a,this.fromMonthOfYear(a,o)))):"m"===r&&(function(t){for(;oe-1+t.minMonth;)a++,o-=e,e=t.monthsInYear(a)}(this),i=Math.min(i,this.daysInMonth(a,this.fromMonthOfYear(a,o))));var s=[a,this.fromMonthOfYear(a,o),i];return this._validateLevel--,s}catch(t){throw this._validateLevel--,t}},_correctAdd:function(t,e,r,n){if(!(this.hasYearZero||"y"!==n&&"m"!==n||0!==e[0]&&t.year()>0==e[0]>0)){var i={y:[1,1,"y"],m:[1,this.monthsInYear(-1),"m"],w:[this.daysInWeek(),this.daysInYear(-1),"d"],d:[1,this.daysInYear(-1),"d"]}[n],a=r<0?-1:1;e=this._add(t,r*i[0]+a*i[1],i[2])}return t.date(e[0],e[1],e[2])},set:function(t,e,r){this._validate(t,this.minMonth,this.minDay,u.local.invalidDate||u.regionalOptions[""].invalidDate);var n="y"===r?e:t.year(),i="m"===r?e:t.month(),a="d"===r?e:t.day();return"y"!==r&&"m"!==r||(a=Math.min(a,this.daysInMonth(n,i))),t.date(n,i,a)},isValid:function(t,e,r){this._validateLevel++;var n=this.hasYearZero||0!==t;if(n){var i=this.newDate(t,e,this.minDay);n=e>=this.minMonth&&e-this.minMonth=this.minDay&&r-this.minDay13.5?13:1),u=i-(l>2.5?4716:4715);return u<=0&&u--,this.newDate(u,l,s)},toJSDate:function(t,e,r){var n=this._validate(t,e,r,u.local.invalidDate||u.regionalOptions[""].invalidDate),i=new Date(n.year(),n.month()-1,n.day());return i.setHours(0),i.setMinutes(0),i.setSeconds(0),i.setMilliseconds(0),i.setHours(i.getHours()>12?i.getHours()+2:0),i},fromJSDate:function(t){return this.newDate(t.getFullYear(),t.getMonth()+1,t.getDate())}});var u=t.exports=new i;u.cdate=a,u.baseCalendar=s,u.calendars.gregorian=l},94338:function(t,e,r){var n=r(56131),i=r(63489);n(i.regionalOptions[""],{invalidArguments:"Invalid arguments",invalidFormat:"Cannot format a date from another calendar",missingNumberAt:"Missing number at position {0}",unknownNameAt:"Unknown name at position {0}",unexpectedLiteralAt:"Unexpected literal at position {0}",unexpectedText:"Additional text found at end"}),i.local=i.regionalOptions[""],n(i.cdate.prototype,{formatDate:function(t,e){return"string"!=typeof t&&(e=t,t=""),this._calendar.formatDate(t||"",this,e)}}),n(i.baseCalendar.prototype,{UNIX_EPOCH:i.instance().newDate(1970,1,1).toJD(),SECS_PER_DAY:86400,TICKS_EPOCH:i.instance().jdEpoch,TICKS_PER_DAY:864e9,ATOM:"yyyy-mm-dd",COOKIE:"D, dd M yyyy",FULL:"DD, MM d, yyyy",ISO_8601:"yyyy-mm-dd",JULIAN:"J",RFC_822:"D, d M yy",RFC_850:"DD, dd-M-yy",RFC_1036:"D, d M yy",RFC_1123:"D, d M yyyy",RFC_2822:"D, d M yyyy",RSS:"D, d M yy",TICKS:"!",TIMESTAMP:"@",W3C:"yyyy-mm-dd",formatDate:function(t,e,r){if("string"!=typeof t&&(r=e,e=t,t=""),!e)return"";if(e.calendar()!==this)throw i.local.invalidFormat||i.regionalOptions[""].invalidFormat;t=t||this.local.dateFormat;for(var n,a,o,s=(r=r||{}).dayNamesShort||this.local.dayNamesShort,l=r.dayNames||this.local.dayNames,u=r.monthNumbers||this.local.monthNumbers,c=r.monthNamesShort||this.local.monthNamesShort,f=r.monthNames||this.local.monthNames,h=(r.calculateWeek||this.local.calculateWeek,function(e,r){for(var n=1;_+n1}),p=function(t,e,r,n){var i=""+e;if(h(t,n))for(;i.length1},x=function(t,r){var n=m(t,r),a=[2,3,n?4:2,n?4:2,10,11,20]["oyYJ@!".indexOf(t)+1],o=new RegExp("^-?\\d{1,"+a+"}"),s=e.substring(A).match(o);if(!s)throw(i.local.missingNumberAt||i.regionalOptions[""].missingNumberAt).replace(/\{0\}/,A);return A+=s[0].length,parseInt(s[0],10)},b=this,_=function(){if("function"==typeof l){m("m");var t=l.call(b,e.substring(A));return A+=t.length,t}return x("m")},w=function(t,r,n,a){for(var o=m(t,a)?n:r,s=0;s-1){p=1,d=v;for(var E=this.daysInMonth(h,p);d>E;E=this.daysInMonth(h,p))p++,d-=E}return f>-1?this.fromJD(f):this.newDate(h,p,d)},determineDate:function(t,e,r,n,i){r&&"object"!=typeof r&&(i=n,n=r,r=null),"string"!=typeof n&&(i=n,n="");var a=this;return e=e?e.newDate():null,null==t?e:"string"==typeof t?function(t){try{return a.parseDate(n,t,i)}catch(t){}for(var e=((t=t.toLowerCase()).match(/^c/)&&r?r.newDate():null)||a.today(),o=/([+-]?[0-9]+)\s*(d|w|m|y)?/g,s=o.exec(t);s;)e.add(parseInt(s[1],10),s[2]||"d"),s=o.exec(t);return e}(t):"number"==typeof t?isNaN(t)||t===1/0||t===-1/0?e:a.today().add(t,"d"):a.newDate(t)}})},69862:function(){},40964:function(){},72077:function(t,e,r){"use strict";var n=["BigInt64Array","BigUint64Array","Float32Array","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Uint8Array","Uint8ClampedArray"],i="undefined"==typeof globalThis?r.g:globalThis;t.exports=function(){for(var t=[],e=0;e>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===r?T(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===r?T(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=h.exec(t))?new A(e[1],e[2],e[3],1):(e=p.exec(t))?new A(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=d.exec(t))?T(e[1],e[2],e[3],e[4]):(e=v.exec(t))?T(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=g.exec(t))?P(e[1],e[2]/100,e[3]/100,1):(e=y.exec(t))?P(e[1],e[2]/100,e[3]/100,e[4]):m.hasOwnProperty(t)?w(m[t]):"transparent"===t?new A(NaN,NaN,NaN,0):null}function w(t){return new A(t>>16&255,t>>8&255,255&t,1)}function T(t,e,r,n){return n<=0&&(t=e=r=NaN),new A(t,e,r,n)}function k(t,e,r,n){return 1===arguments.length?((i=t)instanceof a||(i=_(i)),i?new A((i=i.rgb()).r,i.g,i.b,i.opacity):new A):new A(t,e,r,null==n?1:n);var i}function A(t,e,r,n){this.r=+t,this.g=+e,this.b=+r,this.opacity=+n}function M(){return"#".concat(C(this.r)).concat(C(this.g)).concat(C(this.b))}function S(){var t=E(this.opacity);return"".concat(1===t?"rgb(":"rgba(").concat(L(this.r),", ").concat(L(this.g),", ").concat(L(this.b)).concat(1===t?")":", ".concat(t,")"))}function E(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function L(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function C(t){return((t=L(t))<16?"0":"")+t.toString(16)}function P(t,e,r,n){return n<=0?t=e=r=NaN:r<=0||r>=1?t=e=NaN:e<=0&&(t=NaN),new I(t,e,r,n)}function O(t){if(t instanceof I)return new I(t.h,t.s,t.l,t.opacity);if(t instanceof a||(t=_(t)),!t)return new I;if(t instanceof I)return t;var e=(t=t.rgb()).r/255,r=t.g/255,n=t.b/255,i=Math.min(e,r,n),o=Math.max(e,r,n),s=NaN,l=o-i,u=(o+i)/2;return l?(s=e===o?(r-n)/l+6*(r0&&u<1?0:s,new I(s,l,u,t.opacity)}function I(t,e,r,n){this.h=+t,this.s=+e,this.l=+r,this.opacity=+n}function D(t){return(t=(t||0)%360)<0?t+360:t}function z(t){return Math.max(0,Math.min(1,t||0))}function R(t,e,r){return 255*(t<60?e+(r-e)*t/60:t<180?r:t<240?e+(r-e)*(240-t)/60:e)}function F(t,e,r,n,i){var a=t*t,o=a*t;return((1-3*t+3*a-o)*e+(4-6*a+3*o)*r+(1+3*t+3*a-3*o)*n+o*i)/6}n(a,_,{copy:function(t){return Object.assign(new this.constructor,this,t)},displayable:function(){return this.rgb().displayable()},hex:x,formatHex:x,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return O(this).formatHsl()},formatRgb:b,toString:b}),n(A,k,i(a,{brighter:function(t){return t=null==t?s:Math.pow(s,t),new A(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?o:Math.pow(o,t),new A(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},clamp:function(){return new A(L(this.r),L(this.g),L(this.b),E(this.opacity))},displayable:function(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:M,formatHex:M,formatHex8:function(){return"#".concat(C(this.r)).concat(C(this.g)).concat(C(this.b)).concat(C(255*(isNaN(this.opacity)?1:this.opacity)))},formatRgb:S,toString:S})),n(I,(function(t,e,r,n){return 1===arguments.length?O(t):new I(t,e,r,null==n?1:n)}),i(a,{brighter:function(t){return t=null==t?s:Math.pow(s,t),new I(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?o:Math.pow(o,t),new I(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*e,i=2*r-n;return new A(R(t>=240?t-240:t+120,i,n),R(t,i,n),R(t<120?t+240:t-120,i,n),this.opacity)},clamp:function(){return new I(D(this.h),z(this.s),z(this.l),E(this.opacity))},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl:function(){var t=E(this.opacity);return"".concat(1===t?"hsl(":"hsla(").concat(D(this.h),", ").concat(100*z(this.s),"%, ").concat(100*z(this.l),"%").concat(1===t?")":", ".concat(t,")"))}}));var B=function(t){return function(){return t}};function N(t,e){var r=e-t;return r?function(t,e){return function(r){return t+r*e}}(t,r):B(isNaN(t)?e:t)}var j=function t(e){var r=function(t){return 1==(t=+t)?N:function(e,r){return r-e?function(t,e,r){return t=Math.pow(t,r),e=Math.pow(e,r)-t,r=1/r,function(n){return Math.pow(t+n*e,r)}}(e,r,t):B(isNaN(e)?r:e)}}(e);function n(t,e){var n=r((t=k(t)).r,(e=k(e)).r),i=r(t.g,e.g),a=r(t.b,e.b),o=N(t.opacity,e.opacity);return function(e){return t.r=n(e),t.g=i(e),t.b=a(e),t.opacity=o(e),t+""}}return n.gamma=t,n}(1);function U(t){return function(e){var r,n,i=e.length,a=new Array(i),o=new Array(i),s=new Array(i);for(r=0;r=1?(r=1,e-1):Math.floor(r*e),i=t[n],a=t[n+1],o=n>0?t[n-1]:2*i-a,s=na&&(i=e.slice(a,i),s[o]?s[o]+=i:s[++o]=i),(r=r[0])===(n=n[0])?s[o]?s[o]+=n:s[++o]=n:(s[++o]=null,l.push({i:o,x:q(r,n)})),a=W.lastIndex;return a Date: Thu, 18 Jun 2026 16:46:56 -0600 Subject: [PATCH 103/103] ci: skip Typing Tests on PRs targeting master --- .github/workflows/testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 4aa6fa0b08..6f12c0a4e4 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -195,7 +195,7 @@ jobs: test-typing: name: Typing Tests runs-on: ubuntu-latest - if: github.ref_name != 'master' + if: github.ref_name != 'master' && github.base_ref != 'master' needs: build timeout-minutes: 30 strategy: